ZGlmZiAtLWdpdCBhLzFfNS9MSUNFTlNFLnR4dCBiLzFfNS9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS8xXzUvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvMV81L05PVElDRS50eHQgYi8xXzUvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzOTY5My4uMDAwMDAwMAotLS0gYS8xXzUvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KLT09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLT09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQXhpczIgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLVBvcnRpb25zIENvcHlyaWdodCAyMDA2IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4KLVBvcnRpb25zIENvcHlyaWdodCAyMDA1LTIwMDcgV1NPMiwgSW5jLgotCi1UaGlzIHByb2R1Y3QgYWxzbyBpbmNsdWRlcyBzY2hlbWFzIGFuZCBzcGVjaWZpY2F0aW9uIGRldmVsb3BlZCBieToNCi0tIHRoZSBXM0MgY29uc29ydGl1bSAoaHR0cDovL3d3dy53M2Mub3JnKQ0KLQ0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIFdTLSogc2NoZW1hcyBkZXZlbG9wZWQgYnkgSW50ZXJuYXRpb25hbA0KLUJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCBNaWNyb3NvZnQgQ29ycG9yYXRpb24sIEJFQSBTeXN0ZW1zLCANCi1USUJDTyBTb2Z0d2FyZSwgU0FQIEFHLCBTb25pYyBTb2Z0d2FyZSwgYW5kIFZlcmlTaWduDQotCi1UaGlzIHByb2R1Y3QgYWxzbyBpbmNsdWRlcyBhIFdTREwgZGV2ZWxvcGVkIGJ5IHNhbGVzZm9yY2UuY29tCi0tIENvcHlyaWdodCAxOTk5LTIwMDYgc2FsZXNmb3JjZS5jb20sIGluYy4NCi0NCi1Qb3J0aW9ucyBvZiB0aGUgaW5jbHVkZWQgeG1sYmVhbnMgbGlicmFyeSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoNCi0tIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDAzLCBCRUEgU3lzdGVtcywgPGh0dHA6Ly93d3cuYmVhLmNvbS8+Lg0KLQotUGxlYXNlIHJlYWQgdGhlIGRpZmZlcmVudCBMSUNFTlNFIGZpbGVzIHByZXNlbnQgaW4gdGhlIGxpYiBkaXJlY3Rvcnkgb2YKLXRoaXMgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvMV81L1JFQURNRS50eHQgYi8xXzUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0NDhiZC4uMDAwMDAwMAotLS0gYS8xXzUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQXBhY2hlIEF4aXMyICR7cHJvamVjdC52ZXJzaW9ufSBidWlsZCAoJHtidWlsZFRpbWVzdGFtcH0pCi0KLWh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotV2VsY29tZSB0byBBeGlzMiEKLQotRm9yIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMgcmVsZWFzZSwgcGxlYXNlIGNoZWNrIG91dCB0aGUKLXJlbGVhc2Utbm90ZXMuaHRtbCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgotCi1GdWxsIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBkb2NzIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIHJlbGVhc2UKLShzZXBhcmF0ZSBkb3dubG9hZCksIG9yIG9uIHRoZSBtYWluIHdlYnNpdGUgYXQgaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIuCi0KLV9fX19fX19fX19fX19fX19fX19fCi1CdWlsZGluZyBmcm9tIFNvdXJjZQotPT09PT09PT09PT09PT09PT09PT0KLQotV2UgdXNlIE1hdmVuIDIgKGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnKSB0byBidWlsZCwgYW5kIHlvdSdsbCBmaW5kIGEKLXBvbS54bWwgaW4gZWFjaCBtb2R1bGUsIGFzIHdlbGwgYXMgYXQgdGhlIHRvcCBsZXZlbC4gIFVzZSAibXZuIGluc3RhbGwiCi0ob3IgIm12biBjbGVhbiBpbnN0YWxsIiB0byBjbGVhbiB1cCBmaXJzdCkgdG8gYnVpbGQuCi0KLUlNUE9SVEFOVDogdGhlICpmaXJzdCogdGltZSB5b3UgYnVpbGQgYSBnaXZlbiB2ZXJzaW9uIG9mIEF4aXMyLCB5b3Ugd2lsbCBub3QKLWJlIGFibGUgdG8gZG8gYSByZWd1bGFyICJtdm4gaW5zdGFsbCIgZnJvbSB0aGUgdG9wIGxldmVsIC0gdGhpcyBpcyBiZWNhdXNlCi13ZSBoYXZlIGEgY291cGxlIG9mIGN1c3RvbSBNYXZlbiBwbHVnaW5zIHRoYXQgKGR1ZSB0byBzb21lIGRlcGVuZGVuY3ktCi1yZXNvbHV0aW9uIGlzc3VlcyBpbiBNYXZlbikgbXVzdCBiZSBidWlsdCBhbmQgaW5zdGFsbGVkIGluIHlvdXIgbG9jYWwKLXJlcG9zaXRvcnkgYmVmb3JlIGEgYnVpbGQgd2lsbCBzdWNjZWVkLiAgVGhpcyBtZWFucyB5b3UgbmVlZCB0byBkbyBvbmUKLW9mIHRoZSBmb2xsb3dpbmc6Ci0KLSAgMSkgVXNlIGFudCAoaHR0cDovL2FudC5hcGFjaGUub3JnKSB0byBidWlsZCB0aGUgZmlyc3QgdGltZS4gIFRoZXJlIGlzCi0gICAgIGEgYnVpbGQueG1sIGF0IHRoZSB0b3AgbGV2ZWwgd2hpY2ggYXV0b21hdGljYWxseSBidWlsZHMgdGhlIHBsdWdpbnMKLSAgICAgZmlyc3QgYW5kIHRoZW4gcnVucyBhIHJlZ3VsYXIgIm12biBpbnN0YWxsIi4KLSAgICAgCi0gIDIpIE1hbnVhbGx5ICJtdm4gaW5zdGFsbCIgYm90aCBvZiB0aGUgcGx1Z2lucyBpbiB0aGUgZm9sbG93aW5nIHBsYWNlczoKLSAgICAgCi0gICAgIG1vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luCi0gICAgIG1vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luCi0KLV9fX19fX19fX19fX19fX19fX18KLURlcGxveWluZwotPT09PT09PT09PT09PT09PT09PQotCi1UbyBkZXBsb3kgYSBuZXcgV2ViIHNlcnZpY2UgaW4gQXhpczIgdGhlIGZvbGxvd2luZyB0aHJlZSBzdGVwcyBtdXN0IAotYmUgcGVyZm9ybWVkOgotICAxKSBDcmVhdGUgdGhlIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLCBzdXBwb3J0aW5nIGNsYXNzZXMgCi0gICAgIGFuZCB0aGUgc2VydmljZXMueG1sIGZpbGUsIAotICAyKSBBcmNoaXZlIHRoZSBjbGFzcyBmaWxlcyBpbnRvIGEgamFyIHdpdGggdGhlIHNlcnZpY2VzLnhtbCBmaWxlIGluIAotICAgICB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5Ci0gIDMpIERyb3AgdGhlIGphciBmaWxlIHRvIHRoZSAkQVhJUzJfSE9NRS9XRUItSU5GL3NlcnZpY2VzIGRpcmVjdG9yeQotICAgICB3aGVyZSAkQVhJUzJfSE9NRSByZXByZXNlbnRzIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBvZiB5b3VyIEF4aXMyIAotICAgICBydW50aW1lLiAoSW4gdGhlIGNhc2Ugb2YgYSBzZXJ2ZWxldCBjb250YWluZXIgdGhpcyB3b3VsZCBiZSB0aGUKLSAgICAgImF4aXMyIiBkaXJlY3RvcnkgaW5zaWRlICJ3ZWJhcHBzIi4pCi0KLVRvIHZlcmlmeSB0aGUgZGVwbG95bWVudCBwbGVhc2UgZ28gdG8gaHR0cDovLzx5b3VyaXA+Ojxwb3J0Pi9heGlzMi8gYW5kCi1mb2xsb3cgdGhlICJTZXJ2aWNlcyIgTGluay4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBVc2VyJ3MgR3VpZGUuCi0KLV9fX19fX19fX19fX19fX19fX18KLVN1cHBvcnQKLT09PT09PT09PT09PT09PT09PT0KLSAKLUFueSBwcm9ibGVtIHdpdGggdGhpcyByZWxlYXNlIGNhbiBiZSByZXBvcnRlZCB0byBBeGlzIG1haWxpbmcgbGlzdAotb3IgaW4gdGhlIEpJUkEgaXNzdWUgdHJhY2tlci4gSWYgeW91IGFyZSBzZW5kaW5nIGFuIGVtYWlsIHRvIHRoZSBtYWlsaW5nCi1saXN0IG1ha2Ugc3VyZSB0byBhZGQgdGhlIFtBeGlzMl0gcHJlZml4IHRvIHRoZSBzdWJqZWN0LgotCi1NYWlsaW5nIGxpc3Qgc3Vic2NyaXB0aW9uOgotICAgIGphdmEtZGV2LXN1YnNjcmliZUBheGlzLmFwYWNoZS5vcmcKLQotSmlyYToKLSAgICBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQVhJUzIKLQotCi1UaGFuayB5b3UgZm9yIHVzaW5nIEF4aXMyIQotCi1UaGUgQXhpczIgVGVhbS4gCmRpZmYgLS1naXQgYS8xXzUvYnVpbGQueG1sIGIvMV81L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiODFlMy4uMDAwMDAwMAotLS0gYS8xXzUvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTxwcm9qZWN0IG5hbWU9ImF4aXMyX2J1aWxkIiBkZWZhdWx0PSJpbnN0YWxsIj4NCi0NCi0gICAgPCEtLSBzZXQgdGhlIHByb3BlcnR5IHRvIGluZGljYXRlIHRoYXQgSkFWQV9IT01FIGlzIHNldCAtLT4NCi0gICAgPHRhcmdldCBuYW1lPSJjb25kX2NoZWNrIj4NCi0gICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJKQVZBX0hPTUVfU0VUIj4NCi0gICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImVudi5KQVZBX0hPTUUiLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLSAgICA8L3RhcmdldD4NCi0NCi0gICAgPCEtLSBmYWlsIGlmIEpBVkFfSE9NRSBpc24ndCBzZXQsIG90aGVyd2lzZSB3ZSBkb24ndCBleGVjdXRlIHRoZSBib2R5IC0tPg0KLSAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrX2Vudmlyb25tZW50IiB1bmxlc3M9IkpBVkFfSE9NRV9TRVQiIGRlcGVuZHM9ImNvbmRfY2hlY2siPg0KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEpBVkFfSE9NRSBpcyBub3Qgc2V0LiBTZXQgdGhpcyB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKREsgaXMgaW5zdGFsbGVkLiIvPg0KLSAgICA8L3RhcmdldD4NCi0NCi0gICAgPCEtLSBzZXQgdGhlIHByb3BlcnR5IHRvIGluZGljYXRlIHRoYXQgTUFWRU5fSE9NRSBpcyBzZXQgLS0+DQotICAgIDx0YXJnZXQgbmFtZT0iY29uZF9jaGVjazIiPg0KLSAgICAgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4NCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Ik1BVkVOX0hPTUVfU0VUIj4NCi0gICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImVudi5NQVZFTl9IT01FIi8+DQotICAgICAgICA8L2NvbmRpdGlvbj4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDwhLS0gZmFpbCBpZiBNQVZFTl9IT01FIGlzbid0IHNldCwgb3RoZXJ3aXNlIHdlIGRvbid0IGV4ZWN1dGUgdGhlIGJvZHkgLS0+DQotICAgIDx0YXJnZXQgbmFtZT0iY2hlY2tfZW52aXJvbm1lbnQyIiB1bmxlc3M9Ik1BVkVOX0hPTUVfU0VUIiBkZXBlbmRzPSJjb25kX2NoZWNrMiI+DQotICAgICAgICA8ZmFpbCBtZXNzYWdlPSJUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTUFWRU5fSE9NRSBpcyBub3Qgc2V0LiBTZXQgdGhpcyB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIE1hdmVuIGlzIGluc3RhbGxlZC4iLz4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDwhLS0gaW5pdGlhbGl6ZSBwcm9wZXJ0aWVzIC0tPg0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNoZWNrX2Vudmlyb25tZW50LCBjaGVja19lbnZpcm9ubWVudDIiPg0KLSAgICAgICAgPCEtLW1hY3JvIGZvciBtYXZlbiAtLT4NCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1hdmVuLmV4ZWN1dGFibGUiIHZhbHVlPSJjbWQuZXhlIj4NCi0gICAgICAgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+DQotICAgICAgICA8L2NvbmRpdGlvbj4NCi0NCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1hdmVuLmxpbmUxIiB2YWx1ZT0iL2MgJHtlbnYuTUFWRU5fSE9NRX0vYmluL212bi5iYXQiPg0KLSAgICAgICAgICAgIDxvcyBmYW1pbHk9IndpbmRvd3MiLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWF2ZW4ubGluZTIiDQotICAgICAgICAgICAgICAgICAgIHZhbHVlPSItLW9mZmxpbmUiPg0KLSAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7b2ZmbGluZX0iLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWF2ZW4ubGluZTMiDQotICAgICAgICAgICAgICAgICAgIHZhbHVlPSItRHRlc3Q9ZmFsc2UiPg0KLSAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7c2tpcH0iLz4NCi0gICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmV4ZWN1dGFibGUiIHZhbHVlPSJtdm4iLz4NCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5saW5lMSIgdmFsdWU9IiIvPg0KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmxpbmUyIiB2YWx1ZT0iIi8+DQotICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4ubGluZTMiIHZhbHVlPSIiLz4NCi0NCi0gICAgICAgIDxwcmVzZXRkZWYgbmFtZT0ibXZuIj4NCi0gICAgICAgICAgICA8ZXhlYyBmYWlsb25lcnJvcj0idHJ1ZSIgZXhlY3V0YWJsZT0iJHttYXZlbi5leGVjdXRhYmxlfSI+DQotICAgICAgICAgICAgICAgIDxlbnYga2V5PSJNQVZFTl9URVJNSU5BVEVfQ01EIiB2YWx1ZT0ib24iLz4NCi0gICAgICAgICAgICAgICAgPGFyZyBsaW5lPSIke21hdmVuLmxpbmUxfSIvPg0KLSAgICAgICAgICAgICAgICA8YXJnIGxpbmU9IiR7bWF2ZW4ubGluZTJ9Ii8+DQotICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iJHttYXZlbi5saW5lM30iLz4NCi0gICAgICAgICAgICA8L2V4ZWM+DQotICAgICAgICA8L3ByZXNldGRlZj4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPg0KLSAgICAgICAgPG12bj4NCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSJjbGVhbiIvPg0KLSAgICAgICAgPC9tdm4+DQotICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImluaXQiPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0vbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9Imluc3RhbGwiLz4NCi0gICAgICAgIDwvbXZuPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0vbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9Imluc3RhbGwiLz4NCi0gICAgICAgIDwvbXZuPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1EcmVsZWFzZSBpbnN0YWxsIi8+DQotICAgICAgICA8L212bj4NCi0gICAgPC90YXJnZXQ+DQotDQotICAgIDx0YXJnZXQgbmFtZT0iZGVwbG95IiBkZXBlbmRzPSJpbml0Ij4NCi0gICAgICAgIDxtdm4gc2VhcmNocGF0aD0idHJ1ZSIgZGlyPSIke2Jhc2VkaXJ9L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luIiBmYWlsb25lcnJvcj0idHJ1ZSI+DQotICAgICAgICAgICAgPGFyZyBsaW5lPSJkZXBsb3kiLz4NCi0gICAgICAgIDwvbXZuPg0KLSAgICAgICAgPG12biBzZWFyY2hwYXRoPSJ0cnVlIiBkaXI9IiR7YmFzZWRpcn0vbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4iIGZhaWxvbmVycm9yPSJ0cnVlIj4NCi0gICAgICAgICAgICA8YXJnIGxpbmU9ImRlcGxveSIvPg0KLSAgICAgICAgPC9tdm4+DQotICAgICAgICA8bXZuIHNlYXJjaHBhdGg9InRydWUiIGRpcj0iJHtiYXNlZGlyfSIgZmFpbG9uZXJyb3I9InRydWUiPg0KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLURyZWxlYXNlIGRlcGxveSIvPg0KLSAgICAgICAgPC9tdm4+DQotICAgIDwvdGFyZ2V0Pg0KLTwvcHJvamVjdD4NCi0NCmRpZmYgLS1naXQgYS8xXzUvZXRjL0lERUEvQXhpczIueG1sIGIvMV81L2V0Yy9JREVBL0F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4N2M5Mi4uMDAwMDAwMAotLS0gYS8xXzUvZXRjL0lERUEvQXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y29kZV9zY2hlbWUgbmFtZT0iQXhpczIiPgotICA8b3B0aW9uIG5hbWU9IkFMSUdOX01VTFRJTElORV9QQVJBTUVURVJTX0lOX0NBTExTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJTUEFDRV9XSVRISU5fQVJSQVlfSU5JVElBTElaRVJfQlJBQ0VTIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJTUEFDRV9CRUZPUkVfQVJSQVlfSU5JVElBTElaRVJfTEJSQUNFIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJDTEFTU19DT1VOVF9UT19VU0VfSU1QT1JUX09OX0RFTUFORCIgdmFsdWU9IjMwIiAvPgotICA8b3B0aW9uIG5hbWU9IlJJR0hUX01BUkdJTiIgdmFsdWU9IjEwMCIgLz4KLSAgPG9wdGlvbiBuYW1lPSJDQUxMX1BBUkFNRVRFUlNfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iTUVUSE9EX1BBUkFNRVRFUlNfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRVhURU5EU19MSVNUX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IlRIUk9XU19MSVNUX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IkVYVEVORFNfS0VZV09SRF9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJUSFJPV1NfS0VZV09SRF9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfQ0FMTF9DSEFJTl9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJCSU5BUllfT1BFUkFUSU9OX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IlRFUk5BUllfT1BFUkFUSU9OX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IkZPUl9TVEFURU1FTlRfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQVJSQVlfSU5JVElBTElaRVJfV1JBUCIgdmFsdWU9IjEiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQVNTSUdOTUVOVF9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJBU1NFUlRfU1RBVEVNRU5UX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IlhNTF9BVFRSSUJVVEVfV1JBUCIgdmFsdWU9IjAiIC8+Ci0gIDxvcHRpb24gbmFtZT0iWE1MX1RFWFRfV1JBUCIgdmFsdWU9IjAiIC8+Ci0gIDxvcHRpb24gbmFtZT0iWE1MX0FMSUdOX0FUVFJJQlVURVMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJQQVJBTUVURVJfQU5OT1RBVElPTl9XUkFQIiB2YWx1ZT0iMSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJWQVJJQUJMRV9BTk5PVEFUSU9OX1dSQVAiIHZhbHVlPSIxIiAvPgotICA8b3B0aW9uIG5hbWU9IkVOVU1fQ09OU1RBTlRTX1dSQVAiIHZhbHVlPSI1IiAvPgotPC9jb2RlX3NjaGVtZT4KLQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL1htbFNjaGVtYS1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9YbWxTY2hlbWEtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjhjMjkuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL1htbFNjaGVtYS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9hY3RpdmF0aW9uLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2FjdGl2YXRpb24tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2UyMGEuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2FjdGl2YXRpb24tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkgVmVyc2lvbiAxLjAKLQotMS4gRGVmaW5pdGlvbnMuCi0KLTEuMS4gQ29udHJpYnV0b3IgbWVhbnMgZWFjaCBpbmRpdmlkdWFsIG9yIGVudGl0eSB0aGF0IGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuCi0KLTEuMi4gQ29udHJpYnV0b3IgVmVyc2lvbiBtZWFucyB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciAoaWYgYW55KSwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgotCi0xLjMuIENvdmVyZWQgU29mdHdhcmUgbWVhbnMgKGEpIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGIpIE1vZGlmaWNhdGlvbnMsIG9yIChjKSB0aGUgY29tYmluYXRpb24gb2YgZmlsZXMgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcgTW9kaWZpY2F0aW9ucywgaW4gZWFjaCBjYXNlIGluY2x1ZGluZyBwb3J0aW9ucyB0aGVyZW9mLgotCi0xLjQuIEV4ZWN1dGFibGUgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0gb3RoZXIgdGhhbiBTb3VyY2UgQ29kZS4KLQotMS41LiBJbml0aWFsIERldmVsb3BlciBtZWFucyB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0xLjYuIExhcmdlciBXb3JrIG1lYW5zIGEgd29yayB3aGljaCBjb21iaW5lcyBDb3ZlcmVkIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjcuIExpY2Vuc2UgbWVhbnMgdGhpcyBkb2N1bWVudC4KLQotMS44LiBMaWNlbnNhYmxlIG1lYW5zIGhhdmluZyB0aGUgcmlnaHQgdG8gZ3JhbnQsIHRvIHRoZSBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbCBncmFudCBvciBzdWJzZXF1ZW50bHkgYWNxdWlyZWQsIGFueSBhbmQgYWxsIG9mIHRoZSByaWdodHMgY29udmV5ZWQgaGVyZWluLgotCi0xLjkuIE1vZGlmaWNhdGlvbnMgbWVhbnMgdGhlIFNvdXJjZSBDb2RlIGFuZCBFeGVjdXRhYmxlIGZvcm0gb2YgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUEuIEFueSBmaWxlIHRoYXQgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9uczsKLQotQi4gQW55IG5ldyBmaWxlIHRoYXQgY29udGFpbnMgYW55IHBhcnQgb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IKLQotQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLTEuMTAuIE9yaWdpbmFsIFNvZnR3YXJlIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgdGhhdCBpcyBvcmlnaW5hbGx5IHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS4xMS4gUGF0ZW50IENsYWltcyBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLCBtZXRob2QsIHByb2Nlc3MsIGFuZCBhcHBhcmF0dXMgY2xhaW1zLCBpbiBhbnkgcGF0ZW50IExpY2Vuc2FibGUgYnkgZ3JhbnRvci4KLQotMS4xMi4gU291cmNlIENvZGUgbWVhbnMgKGEpIHRoZSBjb21tb24gZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIGluIHdoaWNoIG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgYW5kIChiKSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuCi0KLTEuMTMuIFlvdSAob3IgWW91cikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciwgYW5kIGNvbXBseWluZyB3aXRoIGFsbCBvZiB0aGUgdGVybXMgb2YsIHRoaXMgTGljZW5zZS4gRm9yIGxlZ2FsIGVudGl0aWVzLCBZb3UgaW5jbHVkZXMgYW55IGVudGl0eSB3aGljaCBjb250cm9scywgaXMgY29udHJvbGxlZCBieSwgb3IgaXMgdW5kZXIgY29tbW9uIGNvbnRyb2wgd2l0aCBZb3UuIEZvciBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sIGNvbnRyb2wgbWVhbnMgKGEp77+9dGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKe+/vW93bmVyc2hpcCBvZiBtb3JlIHRoYW4gZmlmdHkgcGVyY2VudCAoNTAlKSBvZiB0aGUgb3V0c3RhbmRpbmcgc2hhcmVzIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0yLiBMaWNlbnNlIEdyYW50cy4KLQotMi4xLiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgR3JhbnQuCi1Db25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZCBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIHRoZSBJbml0aWFsIERldmVsb3BlciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBJbml0aWFsIERldmVsb3BlciwgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZSBhbmQgZGlzdHJpYnV0ZSB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLCB3aXRoIG9yIHdpdGhvdXQgTW9kaWZpY2F0aW9ucywgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBTb2Z0d2FyZSwgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z77+9Mi4xKGEpIGFuZCAoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27vv70yLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKe+/vWZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKDIp77+9Zm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiAoaSnvv710aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgb3IgKGlpKe+/vXRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLgotCi0yLjIuIENvbnRyaWJ1dG9yIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2U6Ci0oYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE1vZGlmaWNhdGlvbnMgY3JlYXRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBTb2Z0d2FyZSBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQKLShiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEp77+9TW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgKDIp77+9dGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLgotKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25z77+9Mi4yKGEpIGFuZCAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdCBkaXN0cmlidXRlcyBvciBvdGhlcndpc2UgbWFrZXMgdGhlIE1vZGlmaWNhdGlvbnMgYXZhaWxhYmxlIHRvIGEgdGhpcmQgcGFydHkuCi0oZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb27vv70yLjIoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKe+/vWZvciBhbnkgY29kZSB0aGF0IENvbnRyaWJ1dG9yIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKe+/vWZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp77+9dGhpcmQgcGFydHkgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkp77+9dGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIHdpdGggb3RoZXIgc29mdHdhcmUgKGV4Y2VwdCBhcyBwYXJ0IG9mIHRoZSBDb250cmlidXRvciBWZXJzaW9uKSBvciBvdGhlciBkZXZpY2VzOyBvciAoMynvv711bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSBDb3ZlcmVkIFNvZnR3YXJlIGluIHRoZSBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLgotCi0zLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuCi0KLTMuMS4gQXZhaWxhYmlsaXR5IG9mIFNvdXJjZSBDb2RlLgotCi1BbnkgQ292ZXJlZCBTb2Z0d2FyZSB0aGF0IFlvdSBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluIFNvdXJjZSBDb2RlIGZvcm0gYW5kIHRoYXQgU291cmNlIENvZGUgZm9ybSBtdXN0IGJlIGRpc3RyaWJ1dGVkIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUuIFlvdSBtdXN0IGluZm9ybSByZWNpcGllbnRzIG9mIGFueSBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbiBvYnRhaW4gc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi0zLjIuIE1vZGlmaWNhdGlvbnMuCi0KLVRoZSBNb2RpZmljYXRpb25zIHRoYXQgWW91IGNyZWF0ZSBvciB0byB3aGljaCBZb3UgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91IHJlcHJlc2VudCB0aGF0IFlvdSBiZWxpZXZlIFlvdXIgTW9kaWZpY2F0aW9ucyBhcmUgWW91ciBvcmlnaW5hbCBjcmVhdGlvbihzKSBhbmQvb3IgWW91IGhhdmUgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCi0KLTMuMy4gUmVxdWlyZWQgTm90aWNlcy4KLVlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMgdGhhdCBpZGVudGlmaWVzIFlvdSBhcyB0aGUgQ29udHJpYnV0b3Igb2YgdGhlIE1vZGlmaWNhdGlvbi4gWW91IG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCBvciB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvciBhbnkgbm90aWNlcyBvZiBsaWNlbnNpbmcgb3IgYW55IGRlc2NyaXB0aXZlIHRleHQgZ2l2aW5nIGF0dHJpYnV0aW9uIHRvIGFueSBDb250cmlidXRvciBvciB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuCi0KLTMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4KLVlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlIGFwcGxpY2FibGUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2Ugb3IgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGhlcmV1bmRlci4gWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsIGFuZCB0byBjaGFyZ2UgYSBmZWUgZm9yLCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuIEhvd2V2ZXIsIHlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4KLQotMy41LiBEaXN0cmlidXRpb24gb2YgRXhlY3V0YWJsZSBWZXJzaW9ucy4KLVlvdSBtYXkgZGlzdHJpYnV0ZSB0aGUgRXhlY3V0YWJsZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugb3IgdW5kZXIgdGhlIHRlcm1zIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMgZGlmZmVyZW50IGZyb20gdGhpcyBMaWNlbnNlLCBwcm92aWRlZCB0aGF0IFlvdSBhcmUgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIHRoYXQgdGhlIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvci4gWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiBhbnkgc3VjaCB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNi4gTGFyZ2VyIFdvcmtzLgotWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG90aGVyIGNvZGUgbm90IGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIExhcmdlciBXb3JrIGFzIGEgc2luZ2xlIHByb2R1Y3QuIEluIHN1Y2ggYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UgYXJlIGZ1bGZpbGxlZCBmb3IgdGhlIENvdmVyZWQgU29mdHdhcmUuCi0KLTQuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLgotCi00LjEuIE5ldyBWZXJzaW9ucy4KLVN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZCBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBFYWNoIHZlcnNpb24gd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4gU2VjdGlvbiA0LjMsIG5vIG9uZSBvdGhlciB0aGFuIHRoZSBsaWNlbnNlIHN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBMaWNlbnNlLgotCi00LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuCi0KLVlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHVuZGVyIHdoaWNoIFlvdSBvcmlnaW5hbGx5IHJlY2VpdmVkIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYSBub3RpY2UgaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHByb2hpYml0aW5nIGl0IGZyb20gYmVpbmcgZGlzdHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFueSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuCi00LjMuIE1vZGlmaWVkIFZlcnNpb25zLgotCi1XaGVuIFlvdSBhcmUgYW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIFlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaWYgWW91OiAoYSnvv71yZW5hbWUgdGhlIGxpY2Vuc2UgYW5kIHJlbW92ZSBhbnkgcmVmZXJlbmNlcyB0byB0aGUgbmFtZSBvZiB0aGUgbGljZW5zZSBzdGV3YXJkIChleGNlcHQgdG8gbm90ZSB0aGF0IHRoZSBsaWNlbnNlIGRpZmZlcnMgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIp77+9b3RoZXJ3aXNlIG1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuCi0KLTUuIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkuCi0KLUNPVkVSRUQgU09GVFdBUkUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOIEFTIElTIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTIFRIQVQgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgU09GVFdBUkUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBTT0ZUV0FSRSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgotCi02LiBURVJNSU5BVElPTi4KLQotNi4xLiBUaGlzIExpY2Vuc2UgYW5kIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJldW5kZXIgd2lsbCB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcyBoZXJlaW4gYW5kIGZhaWwgdG8gY3VyZSBzdWNoIGJyZWFjaCB3aXRoaW4gMzAgZGF5cyBvZiBiZWNvbWluZyBhd2FyZSBvZiB0aGUgYnJlYWNoLiBQcm92aXNpb25zIHdoaWNoLCBieSB0aGVpciBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZSBzaGFsbCBzdXJ2aXZlLgotCi02LjIuIElmIFlvdSBhc3NlcnQgYSBwYXRlbnQgaW5mcmluZ2VtZW50IGNsYWltIChleGNsdWRpbmcgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBhc3NlcnQgc3VjaCBjbGFpbSBpcyByZWZlcnJlZCB0byBhcyBQYXJ0aWNpcGFudCkgYWxsZWdpbmcgdGhhdCB0aGUgUGFydGljaXBhbnQgU29mdHdhcmUgKG1lYW5pbmcgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24gd2hlcmUgdGhlIFBhcnRpY2lwYW50IGlzIGEgQ29udHJpYnV0b3Igb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIpIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5mcmluZ2VzIGFueSBwYXRlbnQsIHRoZW4gYW55IGFuZCBhbGwgcmlnaHRzIGdyYW50ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIChpZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaXMgbm90IHRoZSBQYXJ0aWNpcGFudCkgYW5kIGFsbCBDb250cmlidXRvcnMgdW5kZXIgU2VjdGlvbnPvv70yLjEgYW5kL29yIDIuMiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwsIHVwb24gNjAgZGF5cyBub3RpY2UgZnJvbSBQYXJ0aWNpcGFudCB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbiBvZiBzdWNoIDYwIGRheSBub3RpY2UgcGVyaW9kLCB1bmxlc3MgaWYgd2l0aGluIHN1Y2ggNjAgZGF5IHBlcmlvZCBZb3Ugd2l0aGRyYXcgWW91ciBjbGFpbSB3aXRoIHJlc3BlY3QgdG8gdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXIgdW5pbGF0ZXJhbGx5IG9yIHB1cnN1YW50IHRvIGEgd3JpdHRlbiBhZ3JlZW1lbnQgd2l0aCBQYXJ0aWNpcGFudC4KLQotNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnPvv702LjEgb3IgNi4yIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkIGJ5IFlvdSBvciBhbnkgZGlzdHJpYnV0b3IgaGVyZXVuZGVyIHByaW9yIHRvIHRlcm1pbmF0aW9uIChleGNsdWRpbmcgbGljZW5zZXMgZ3JhbnRlZCB0byBZb3UgYnkgYW55IGRpc3RyaWJ1dG9yKSBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLgotCi03LiBMSU1JVEFUSU9OIE9GIExJQUJJTElUWS4KLQotVU5ERVIgTk8gQ0lSQ1VNU1RBTkNFUyBBTkQgVU5ERVIgTk8gTEVHQUwgVEhFT1JZLCBXSEVUSEVSIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUgSU5JVElBTCBERVZFTE9QRVIsIEFOWSBPVEhFUiBDT05UUklCVVRPUiwgT1IgQU5ZIERJU1RSSUJVVE9SIE9GIENPVkVSRUQgU09GVFdBUkUsIE9SIEFOWSBTVVBQTElFUiBPRiBBTlkgT0YgU1VDSCBQQVJUSUVTLCBCRSBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIENIQVJBQ1RFUiBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgREFNQUdFUyBGT1IgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIEdPT0RXSUxMLCBXT1JLIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUiBDT01NRVJDSUFMIERBTUFHRVMgT1IgTE9TU0VTLCBFVkVOIElGIFNVQ0ggUEFSVFkgU0hBTEwgSEFWRSBCRUVOIElORk9STUVEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIFRISVMgTElNSVRBVElPTiBPRiBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwgSU5KVVJZIFJFU1VMVElORyBGUk9NIFNVQ0ggUEFSVFlTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCi0KLTguIFUuUy4gR09WRVJOTUVOVCBFTkQgVVNFUlMuCi0KLVRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgY29tbWVyY2lhbCBpdGVtLCBhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBpbiA0OO+/vUMuRi5SLu+/vTIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mIGNvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUgKGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGF0IDQ4IEMuRi5SLiDvv70yNTIuMjI3LTcwMTQoYSkoMSkpIGFuZCBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OO+/vUMuRi5SLu+/vTEyLjIxMiAoU2VwdC4gMTk5NSkuIENvbnNpc3RlbnQgd2l0aCA0OCBDLkYuUi4gMTIuMjEyIGFuZCA0OCBDLkYuUi4gMjI3LjcyMDItMSB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzIGFjcXVpcmUgQ292ZXJlZCBTb2Z0d2FyZSB3aXRoIG9ubHkgdGhvc2UgcmlnaHRzIHNldCBmb3J0aCBoZXJlaW4uIFRoaXMgVS5TLiBHb3Zlcm5tZW50IFJpZ2h0cyBjbGF1c2UgaXMgaW4gbGlldSBvZiwgYW5kIHN1cGVyc2VkZXMsIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMgR292ZXJubWVudCByaWdodHMgaW4gY29tcHV0ZXIgc29mdHdhcmUgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi05LiBNSVNDRUxMQU5FT1VTLgotCi1UaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdCBtYXR0ZXIgaGVyZW9mLiBJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSBpcyBoZWxkIHRvIGJlIHVuZW5mb3JjZWFibGUsIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIG9ubHkgdG8gdGhlIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXcgb2YgdGhlIGp1cmlzZGljdGlvbiBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgKGV4Y2VwdCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoIGp1cmlzZGljdGlvbnMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uIHJlbGF0aW5nIHRvIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBzdWJqZWN0IHRvIHRoZSBqdXJpc2RpY3Rpb24gb2YgdGhlIGNvdXJ0cyBsb2NhdGVkIGluIHRoZSBqdXJpc2RpY3Rpb24gYW5kIHZlbnVlIHNwZWNpZmllZCBpbiBhIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nIHBhcnR5IHJlc3BvbnNpYmxlIGZvciBjb3N0cywgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cyBmZWVzIGFuZCBleHBlbnNlcy4gVGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBDb252ZW50aW9uIG9uIENvbnRyYWN0cyBmb3IgdGhlIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3IgcmVndWxhdGlvbiB3aGljaCBwcm92aWRlcyB0aGF0IHRoZSBsYW5ndWFnZSBvZiBhIGNvbnRyYWN0IHNoYWxsIGJlIGNvbnN0cnVlZCBhZ2FpbnN0IHRoZSBkcmFmdGVyIHNoYWxsIG5vdCBhcHBseSB0byB0aGlzIExpY2Vuc2UuIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyBleHBvcnQgYWRtaW5pc3RyYXRpb24gcmVndWxhdGlvbnMgKGFuZCB0aGUgZXhwb3J0IGNvbnRyb2wgbGF3cyBhbmQgcmVndWxhdGlvbiBvZiBhbnkgb3RoZXIgY291bnRyaWVzKSB3aGVuIFlvdSB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLgotCi0xMC4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4KLQotQXMgYmV0d2VlbiBJbml0aWFsIERldmVsb3BlciBhbmQgdGhlIENvbnRyaWJ1dG9ycywgZWFjaCBwYXJ0eSBpcyByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIG91dCBvZiBpdHMgdXRpbGl6YXRpb24gb2YgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgWW91IGFncmVlIHRvIHdvcmsgd2l0aCBJbml0aWFsIERldmVsb3BlciBhbmQgQ29udHJpYnV0b3JzIHRvIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcgaGVyZWluIGlzIGludGVuZGVkIG9yIHNoYWxsIGJlIGRlZW1lZCB0byBjb25zdGl0dXRlIGFueSBhZG1pc3Npb24gb2YgbGlhYmlsaXR5LgotCi1OT1RJQ0UgUFVSU1VBTlQgVE8gU0VDVElPTiA5IE9GIFRIRSBDT01NT04gREVWRUxPUE1FTlQgQU5EIERJU1RSSUJVVElPTiBMSUNFTlNFIChDRERMKQotVGhlIEdsYXNzRmlzaCBjb2RlIHJlbGVhc2VkIHVuZGVyIHRoZSBDRERMIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChleGNsdWRpbmcgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMpLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSBhbmQgdGhlIHN0YXRlIGNvdXJ0cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEuIAotCi0KLQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2F4aW9tLWFwaS1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9heGlvbS1hcGktTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2F4aW9tLWFwaS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2F4aW9tLWRvbS1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9heGlvbS1kb20tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2F4aW9tLWRvbS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2F4aW9tLWltcGwtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvYXhpb20taW1wbC1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmOGMyOS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvYXhpb20taW1wbC1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9heGlzMi1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9heGlzMi1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYzg4YS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvYXhpczItTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9iY2VsLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2JjZWwtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZTcxMTkuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2JjZWwtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCi0gKiAgICAiQXBhY2hlIEJDRUwiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgIkFwYWNoZSBCQ0VMIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqLwpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2NvbW1vbnMtY29kZWMtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvY29tbW9ucy1jb2RlYy1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmOGMyOS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvY29tbW9ucy1jb2RlYy1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9jb21tb25zLWZpbGV1cGxvYWQtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvY29tbW9ucy1maWxldXBsb2FkLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9jb21tb25zLWZpbGV1cGxvYWQtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvY29tbW9ucy1odHRwY2xpZW50LUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2NvbW1vbnMtaHR0cGNsaWVudC1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmOGMyOS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvY29tbW9ucy1odHRwY2xpZW50LUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2NvbW1vbnMtaW8tTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvY29tbW9ucy1pby1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvY29tbW9ucy1pby1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvY29tbW9ucy1sb2dnaW5nLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2NvbW1vbnMtbG9nZ2luZy1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwYjEyNy4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvY29tbW9ucy1sb2dnaW5nLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9nZXJvbmltby1hbm5vdGF0aW9uLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2dlcm9uaW1vLWFubm90YXRpb24tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2dlcm9uaW1vLWFubm90YXRpb24tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9nZXJvbmltby1qYXh3cy1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9nZXJvbmltby1qYXh3cy1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvZ2Vyb25pbW8tamF4d3MtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9nZXJvbmltby1qdGEtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvZ2Vyb25pbW8tanRhLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9nZXJvbmltby1qdGEtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9nZXJvbmltby1zYWFqLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2dlcm9uaW1vLXNhYWotTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2dlcm9uaW1vLXNhYWotTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2dlcm9uaW1vLXN0YXgtYXBpLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2dlcm9uaW1vLXN0YXgtYXBpLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9nZXJvbmltby1zdGF4LWFwaS1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvZ2Vyb25pbW8td3MtbWV0YWRhdGEtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvZ2Vyb25pbW8td3MtbWV0YWRhdGEtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGIxMjcuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2dlcm9uaW1vLXdzLW1ldGFkYXRhLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9odHRwY29yZS1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9odHRwY29yZS1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmOGMyOS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvaHR0cGNvcmUtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvamFsb3B5LUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2phbG9weS1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjNzg4OC4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvamFsb3B5LUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIgotICAgICAgZW5jb2Rpbmc9Imlzby04ODU5LTEiID8+Ci0KLTwhLS0gJElkJCAtLT4KLQotPHRpdGxlPlRoZSBKYWxvcHkgQlNEIExpY2Vuc2U8L3RpdGxlPgotCi08aW5kZXh0ZXJtPjxwcmltYXJ5PlNvZnR3YXJlIExpY2Vuc2U8L3ByaW1hcnk+PC9pbmRleHRlcm0+Ci08aW5kZXh0ZXJtPjxwcmltYXJ5PkxpY2Vuc2VzPC9wcmltYXJ5PjxzZWNvbmRhcnk+QlNEPC9zZWNvbmRhcnk+PC9pbmRleHRlcm0+Ci0KLTxwYXJhPgotQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQsIE1hcmNvIEh1bnNpY2tlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLTwvcGFyYT4KLQotPHBhcmE+Ci1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLTwvcGFyYT4KLQotPGl0ZW1pemVkbGlzdD4KLTxsaXN0aXRlbT4KLTxwYXJhPgotUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotPC9wYXJhPgotPC9saXN0aXRlbT4KLQotPGxpc3RpdGVtPgotPHBhcmE+Ci1SZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi08L3BhcmE+Ci08L2xpc3RpdGVtPgotCi08bGlzdGl0ZW0+Ci08cGFyYT4KLU5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEphbG9weSBHcm91cCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotPC9wYXJhPgotPC9saXN0aXRlbT4KLTwvaXRlbWl6ZWRsaXN0PgotCi08cGFyYT4KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotPC9wYXJhPiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvamF4Yi1hcGktTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvamF4Yi1hcGktTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGViZjguLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2pheGItYXBpLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wDQotDQotDQotICAgICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgICAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdA0KLSAgICAgICAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuDQotDQotICAgICAgICAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZQ0KLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0DQotICAgICAgICAgICAgcGFydGljdWxhciBDb250cmlidXRvci4NCi0NCi0gICAgICAgICAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcg0KLSAgICAgICAgICAgIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzDQotICAgICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcNCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuDQotDQotICAgICAgICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0NCi0gICAgICAgICAgICBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLiANCi0NCi0gICAgICAgICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5DQotICAgICAgICAgICAgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcw0KLSAgICAgICAgICAgIExpY2Vuc2UuIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZA0KLSAgICAgICAgICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUNCi0gICAgICAgICAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgICAgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAgICAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUNCi0gICAgICAgICAgICBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbA0KLSAgICAgICAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cw0KLSAgICAgICAgICAgIGNvbnZleWVkIGhlcmVpbi4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUNCi0gICAgICAgICAgICBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOiANCi0NCi0gICAgICAgICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywNCi0gICAgICAgICAgICAgICAgICBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYQ0KLSAgICAgICAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cw0KLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IA0KLQ0KLSAgICAgICAgICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZQ0KLSAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgDQotDQotICAgICAgICAgICAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUNCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQNCi0gICAgICAgICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzDQotICAgICAgICAgICAgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQNCi0gICAgICAgICAgICBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sDQotICAgICAgICAgICAgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudA0KLSAgICAgICAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gDQotDQotICAgICAgICAgICAgMS4xMi4gIlNvdXJjZSBDb2RlIiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyDQotICAgICAgICAgICAgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikNCi0gICAgICAgICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuDQotDQotICAgICAgICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsDQotICAgICAgICAgICAgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mDQotICAgICAgICAgICAgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSINCi0gICAgICAgICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcw0KLSAgICAgICAgICAgIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcw0KLSAgICAgICAgICAgIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3INCi0gICAgICAgICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gNCi0gICAgICAgICAgICBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwDQotICAgICAgICAgICAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcw0KLSAgICAgICAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgIDIuIExpY2Vuc2UgR3JhbnRzLiANCi0NCi0gICAgICAgICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4NCi0NCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZA0KLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlDQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLA0KLSAgICAgICAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiANCi0NCi0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbg0KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsDQotICAgICAgICAgICAgICAgICAgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwNCi0gICAgICAgICAgICAgICAgICBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3INCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLA0KLSAgICAgICAgICAgICAgICAgIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUNCi0gICAgICAgICAgICAgICAgICBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vcg0KLSAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3INCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKS4gDQotDQotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpDQotICAgICAgICAgICAgICAgICAgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdA0KLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUNCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcw0KLSAgICAgICAgICAgICAgICAgIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudA0KLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tDQotICAgICAgICAgICAgICAgICAgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMikgZm9yIGluZnJpbmdlbWVudHMNCi0gICAgICAgICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbA0KLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwNCi0gICAgICAgICAgICAgICAgICBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuIA0KLQ0KLSAgICAgICAgICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuDQotDQotICAgICAgICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQNCi0gICAgICAgICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2gNCi0gICAgICAgICAgICBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwNCi0gICAgICAgICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6DQotDQotICAgICAgICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4NCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvDQotICAgICAgICAgICAgICAgICAgdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaA0KLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuDQotICAgICAgICAgICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcw0KLSAgICAgICAgICAgICAgICAgIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kDQotICAgICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsDQotICAgICAgICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGgNCi0gICAgICAgICAgICAgICAgICBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaA0KLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwNCi0gICAgICAgICAgICAgICAgICBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpDQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zDQotICAgICAgICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMNCi0gICAgICAgICAgICAgICAgICBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbg0KLSAgICAgICAgICAgICAgICAgIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gDQotDQotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQNCi0gICAgICAgICAgICAgICAgICAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdA0KLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LiANCi0NCi0gICAgICAgICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQNCi0gICAgICAgICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvcg0KLSAgICAgICAgICAgICAgICAgIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3INCi0gICAgICAgICAgICAgICAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5DQotICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZQ0KLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgICAgICAgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlDQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyDQotICAgICAgICAgICAgICAgICAgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUNCi0gICAgICAgICAgICAgICAgICBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLiANCi0NCi0gICAgICAzLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuDQotDQotICAgICAgICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuDQotDQotICAgICAgICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZQ0KLSAgICAgICAgICAgIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluDQotICAgICAgICAgICAgU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUNCi0gICAgICAgICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0DQotICAgICAgICAgICAgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUNCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yDQotICAgICAgICAgICAgb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkNCi0gICAgICAgICAgICBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbg0KLSAgICAgICAgICAgIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhDQotICAgICAgICAgICAgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkDQotICAgICAgICAgICAgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLg0KLQ0KLSAgICAgICAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4NCi0NCi0gICAgICAgICAgICBUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91DQotICAgICAgICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91DQotICAgICAgICAgICAgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyDQotICAgICAgICAgICAgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvDQotICAgICAgICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMNCi0gICAgICAgICAgICB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLg0KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3INCi0gICAgICAgICAgICB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvcg0KLSAgICAgICAgICAgIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcNCi0gICAgICAgICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLg0KLQ0KLSAgICAgICAgICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkDQotICAgICAgICAgICAgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlDQotICAgICAgICAgICAgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50c9UNCi0gICAgICAgICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhDQotICAgICAgICAgICAgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkNCi0gICAgICAgICAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuDQotICAgICAgICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbg0KLSAgICAgICAgICAgIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UNCi0gICAgICAgICAgICBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LA0KLSAgICAgICAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5DQotICAgICAgICAgICAgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkDQotICAgICAgICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YNCi0gICAgICAgICAgICB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuDQotICAgICAgICAgIA0KLQ0KLSAgICAgICAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQNCi0gICAgICAgICAgICBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcw0KLSAgICAgICAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMNCi0gICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbg0KLSAgICAgICAgICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZQ0KLSAgICAgICAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdA0KLSAgICAgICAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnTVcyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0NCi0gICAgICAgICAgICBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91DQotICAgICAgICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQ0KLSAgICAgICAgICAgIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdA0KLSAgICAgICAgICAgIGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91DQotICAgICAgICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQ0KLSAgICAgICAgICAgIGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsDQotICAgICAgICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMNCi0gICAgICAgICAgICBZb3Ugb2ZmZXIuDQotDQotICAgICAgICAgICAgMy42LiBMYXJnZXIgV29ya3MuDQotDQotICAgICAgICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQ0KLSAgICAgICAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoDQotICAgICAgICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UNCi0gICAgICAgICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gDQotICAgICAgICAgICAgDQotICAgICAgNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgIDQuMS4gTmV3IFZlcnNpb25zLg0KLQ0KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZA0KLSAgICAgICAgICAgIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UNCi0gICAgICAgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQ0KLSAgICAgICAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4NCi0gICAgICAgICAgICBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlDQotICAgICAgICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UNCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZA0KLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYQ0KLSAgICAgICAgICAgIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZw0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkNCi0gICAgICAgICAgICBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kDQotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQ0KLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQNCi0gICAgICAgICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvDQotICAgICAgICAgICAgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlDQotICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQ0KLSAgICAgICAgICAgIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuIA0KLQ0KLSAgICAgICAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYQ0KLSAgICAgICAgICAgIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQNCi0gICAgICAgICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUNCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZQ0KLSAgICAgICAgICAgIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzDQotICAgICAgICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQNCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuDQotICAgICAgICAgICAgDQotDQotICAgICAgNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4NCi0NCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiDQotICAgICAgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwNCi0gICAgICBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEDQotICAgICAgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSDQotICAgICAgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORA0KLSAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZDQotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQ0KLSAgICAgIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GDQotICAgICAgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YNCi0gICAgICBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRg0KLSAgICAgIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTDQotICAgICAgRElTQ0xBSU1FUi4gDQotDQotICAgICAgNi4gVEVSTUlOQVRJT04uIA0KLQ0KLSAgICAgICAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwNCi0gICAgICAgICAgICB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcw0KLSAgICAgICAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mDQotICAgICAgICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXINCi0gICAgICAgICAgICBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mDQotICAgICAgICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuDQotDQotICAgICAgICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nDQotICAgICAgICAgICAgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvcg0KLSAgICAgICAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0DQotICAgICAgICAgICAgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikNCi0gICAgICAgICAgICBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUNCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUNCi0gICAgICAgICAgICBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55DQotICAgICAgICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yDQotICAgICAgICAgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KQ0KLSAgICAgICAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMNCi0gICAgICAgICAgICBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQNCi0gICAgICAgICAgICB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbg0KLSAgICAgICAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkNCi0gICAgICAgICAgICBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQ0KLSAgICAgICAgICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXINCi0gICAgICAgICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoDQotICAgICAgICAgICAgUGFydGljaXBhbnQuDQotDQotICAgICAgICAgICAgNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMg0KLSAgICAgICAgICAgIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkDQotICAgICAgICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24NCi0gICAgICAgICAgICAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikNCi0gICAgICAgICAgICBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLg0KLQ0KLSAgICAgIDcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLg0KLQ0KLSAgICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUDQotICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUNCi0gICAgICBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YNCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUNCi0gICAgICBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUg0KLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVA0KLSAgICAgIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSw0KLSAgICAgIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUg0KLSAgICAgIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4NCi0gICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YNCi0gICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwNCi0gICAgICBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWdVTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVA0KLSAgICAgIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETw0KLSAgICAgIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUg0KLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVA0KLSAgICAgIEFQUExZIFRPIFlPVS4NCi0NCi0gICAgICA4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLg0KLQ0KLSAgICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcw0KLSAgICAgIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mICJjb21tZXJjaWFsDQotICAgICAgY29tcHV0ZXIgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gpA0KLSAgICAgIDI1Mi4yMjctNzAxNChhKSgxKSkgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlDQotICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0Lg0KLSAgICAgIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTENCi0gICAgICB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzDQotICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4NCi0gICAgICBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLA0KLSAgICAgIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMNCi0gICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgOS4gTUlTQ0VMTEFORU9VUy4NCi0NCi0gICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdA0KLSAgICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUNCi0gICAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZQ0KLSAgICAgIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlDQotICAgICAgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQ0KLSAgICAgIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudA0KLSAgICAgIGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoDQotICAgICAganVyaXNkaWN0aW9u1XMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uDQotICAgICAgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZg0KLSAgICAgIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYQ0KLSAgICAgIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nDQotICAgICAgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQNCi0gICAgICBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXPVIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUNCi0gICAgICBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQ0KLSAgICAgIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3INCi0gICAgICByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwNCi0gICAgICBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLg0KLSAgICAgIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUNCi0gICAgICBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQNCi0gICAgICBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLA0KLSAgICAgIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLg0KLQ0KLSAgICAgIDEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLg0KLQ0KLSAgICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMNCi0gICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yDQotICAgICAgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlDQotICAgICAgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bw0KLSAgICAgIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcNCi0gICAgICBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbg0KLSAgICAgIG9mIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvamF4Yi1pbXBsLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2pheGItaW1wbC1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZWJmOC4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvamF4Yi1pbXBsLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wDQotDQotDQotICAgICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgICAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdA0KLSAgICAgICAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuDQotDQotICAgICAgICAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZQ0KLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0DQotICAgICAgICAgICAgcGFydGljdWxhciBDb250cmlidXRvci4NCi0NCi0gICAgICAgICAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcg0KLSAgICAgICAgICAgIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzDQotICAgICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcNCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuDQotDQotICAgICAgICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0NCi0gICAgICAgICAgICBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLiANCi0NCi0gICAgICAgICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5DQotICAgICAgICAgICAgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcw0KLSAgICAgICAgICAgIExpY2Vuc2UuIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZA0KLSAgICAgICAgICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUNCi0gICAgICAgICAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgICAgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAgICAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUNCi0gICAgICAgICAgICBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbA0KLSAgICAgICAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cw0KLSAgICAgICAgICAgIGNvbnZleWVkIGhlcmVpbi4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUNCi0gICAgICAgICAgICBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOiANCi0NCi0gICAgICAgICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywNCi0gICAgICAgICAgICAgICAgICBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYQ0KLSAgICAgICAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cw0KLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IA0KLQ0KLSAgICAgICAgICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZQ0KLSAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgDQotDQotICAgICAgICAgICAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUNCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQNCi0gICAgICAgICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzDQotICAgICAgICAgICAgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQNCi0gICAgICAgICAgICBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sDQotICAgICAgICAgICAgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudA0KLSAgICAgICAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gDQotDQotICAgICAgICAgICAgMS4xMi4gIlNvdXJjZSBDb2RlIiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyDQotICAgICAgICAgICAgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikNCi0gICAgICAgICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuDQotDQotICAgICAgICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsDQotICAgICAgICAgICAgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mDQotICAgICAgICAgICAgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSINCi0gICAgICAgICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcw0KLSAgICAgICAgICAgIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcw0KLSAgICAgICAgICAgIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3INCi0gICAgICAgICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gNCi0gICAgICAgICAgICBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwDQotICAgICAgICAgICAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcw0KLSAgICAgICAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgIDIuIExpY2Vuc2UgR3JhbnRzLiANCi0NCi0gICAgICAgICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4NCi0NCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZA0KLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlDQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLA0KLSAgICAgICAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiANCi0NCi0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbg0KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsDQotICAgICAgICAgICAgICAgICAgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwNCi0gICAgICAgICAgICAgICAgICBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3INCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLA0KLSAgICAgICAgICAgICAgICAgIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUNCi0gICAgICAgICAgICAgICAgICBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vcg0KLSAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3INCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKS4gDQotDQotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpDQotICAgICAgICAgICAgICAgICAgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdA0KLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUNCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcw0KLSAgICAgICAgICAgICAgICAgIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudA0KLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tDQotICAgICAgICAgICAgICAgICAgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMikgZm9yIGluZnJpbmdlbWVudHMNCi0gICAgICAgICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbA0KLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwNCi0gICAgICAgICAgICAgICAgICBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuIA0KLQ0KLSAgICAgICAgICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuDQotDQotICAgICAgICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQNCi0gICAgICAgICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2gNCi0gICAgICAgICAgICBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwNCi0gICAgICAgICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6DQotDQotICAgICAgICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4NCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvDQotICAgICAgICAgICAgICAgICAgdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaA0KLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuDQotICAgICAgICAgICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcw0KLSAgICAgICAgICAgICAgICAgIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kDQotICAgICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsDQotICAgICAgICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGgNCi0gICAgICAgICAgICAgICAgICBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaA0KLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwNCi0gICAgICAgICAgICAgICAgICBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpDQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zDQotICAgICAgICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMNCi0gICAgICAgICAgICAgICAgICBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbg0KLSAgICAgICAgICAgICAgICAgIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gDQotDQotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQNCi0gICAgICAgICAgICAgICAgICAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdA0KLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LiANCi0NCi0gICAgICAgICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQNCi0gICAgICAgICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvcg0KLSAgICAgICAgICAgICAgICAgIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3INCi0gICAgICAgICAgICAgICAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5DQotICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZQ0KLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgICAgICAgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlDQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyDQotICAgICAgICAgICAgICAgICAgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUNCi0gICAgICAgICAgICAgICAgICBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLiANCi0NCi0gICAgICAzLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuDQotDQotICAgICAgICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuDQotDQotICAgICAgICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZQ0KLSAgICAgICAgICAgIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluDQotICAgICAgICAgICAgU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUNCi0gICAgICAgICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0DQotICAgICAgICAgICAgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUNCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yDQotICAgICAgICAgICAgb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkNCi0gICAgICAgICAgICBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbg0KLSAgICAgICAgICAgIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhDQotICAgICAgICAgICAgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkDQotICAgICAgICAgICAgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLg0KLQ0KLSAgICAgICAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4NCi0NCi0gICAgICAgICAgICBUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91DQotICAgICAgICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91DQotICAgICAgICAgICAgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyDQotICAgICAgICAgICAgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvDQotICAgICAgICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMNCi0gICAgICAgICAgICB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLg0KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3INCi0gICAgICAgICAgICB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvcg0KLSAgICAgICAgICAgIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcNCi0gICAgICAgICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLg0KLQ0KLSAgICAgICAgICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkDQotICAgICAgICAgICAgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlDQotICAgICAgICAgICAgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50c9UNCi0gICAgICAgICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhDQotICAgICAgICAgICAgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkNCi0gICAgICAgICAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuDQotICAgICAgICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbg0KLSAgICAgICAgICAgIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UNCi0gICAgICAgICAgICBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LA0KLSAgICAgICAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5DQotICAgICAgICAgICAgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkDQotICAgICAgICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YNCi0gICAgICAgICAgICB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuDQotICAgICAgICAgIA0KLQ0KLSAgICAgICAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQNCi0gICAgICAgICAgICBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcw0KLSAgICAgICAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMNCi0gICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbg0KLSAgICAgICAgICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZQ0KLSAgICAgICAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdA0KLSAgICAgICAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnTVcyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0NCi0gICAgICAgICAgICBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91DQotICAgICAgICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQ0KLSAgICAgICAgICAgIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdA0KLSAgICAgICAgICAgIGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91DQotICAgICAgICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQ0KLSAgICAgICAgICAgIGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsDQotICAgICAgICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMNCi0gICAgICAgICAgICBZb3Ugb2ZmZXIuDQotDQotICAgICAgICAgICAgMy42LiBMYXJnZXIgV29ya3MuDQotDQotICAgICAgICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQ0KLSAgICAgICAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoDQotICAgICAgICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UNCi0gICAgICAgICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gDQotICAgICAgICAgICAgDQotICAgICAgNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgIDQuMS4gTmV3IFZlcnNpb25zLg0KLQ0KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZA0KLSAgICAgICAgICAgIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UNCi0gICAgICAgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQ0KLSAgICAgICAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4NCi0gICAgICAgICAgICBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlDQotICAgICAgICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UNCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZA0KLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYQ0KLSAgICAgICAgICAgIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZw0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkNCi0gICAgICAgICAgICBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kDQotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQ0KLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQNCi0gICAgICAgICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvDQotICAgICAgICAgICAgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlDQotICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQ0KLSAgICAgICAgICAgIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuIA0KLQ0KLSAgICAgICAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYQ0KLSAgICAgICAgICAgIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQNCi0gICAgICAgICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUNCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZQ0KLSAgICAgICAgICAgIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzDQotICAgICAgICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQNCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuDQotICAgICAgICAgICAgDQotDQotICAgICAgNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4NCi0NCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiDQotICAgICAgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwNCi0gICAgICBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEDQotICAgICAgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSDQotICAgICAgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORA0KLSAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZDQotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQ0KLSAgICAgIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GDQotICAgICAgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YNCi0gICAgICBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRg0KLSAgICAgIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTDQotICAgICAgRElTQ0xBSU1FUi4gDQotDQotICAgICAgNi4gVEVSTUlOQVRJT04uIA0KLQ0KLSAgICAgICAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwNCi0gICAgICAgICAgICB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcw0KLSAgICAgICAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mDQotICAgICAgICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXINCi0gICAgICAgICAgICBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mDQotICAgICAgICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuDQotDQotICAgICAgICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nDQotICAgICAgICAgICAgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvcg0KLSAgICAgICAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0DQotICAgICAgICAgICAgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikNCi0gICAgICAgICAgICBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUNCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUNCi0gICAgICAgICAgICBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55DQotICAgICAgICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yDQotICAgICAgICAgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KQ0KLSAgICAgICAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMNCi0gICAgICAgICAgICBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQNCi0gICAgICAgICAgICB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbg0KLSAgICAgICAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkNCi0gICAgICAgICAgICBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQ0KLSAgICAgICAgICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXINCi0gICAgICAgICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoDQotICAgICAgICAgICAgUGFydGljaXBhbnQuDQotDQotICAgICAgICAgICAgNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMg0KLSAgICAgICAgICAgIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkDQotICAgICAgICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24NCi0gICAgICAgICAgICAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikNCi0gICAgICAgICAgICBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLg0KLQ0KLSAgICAgIDcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLg0KLQ0KLSAgICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUDQotICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUNCi0gICAgICBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YNCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUNCi0gICAgICBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUg0KLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVA0KLSAgICAgIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSw0KLSAgICAgIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUg0KLSAgICAgIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4NCi0gICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YNCi0gICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwNCi0gICAgICBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWdVTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVA0KLSAgICAgIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETw0KLSAgICAgIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUg0KLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVA0KLSAgICAgIEFQUExZIFRPIFlPVS4NCi0NCi0gICAgICA4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLg0KLQ0KLSAgICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcw0KLSAgICAgIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mICJjb21tZXJjaWFsDQotICAgICAgY29tcHV0ZXIgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gpA0KLSAgICAgIDI1Mi4yMjctNzAxNChhKSgxKSkgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlDQotICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0Lg0KLSAgICAgIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTENCi0gICAgICB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzDQotICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4NCi0gICAgICBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLA0KLSAgICAgIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMNCi0gICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgOS4gTUlTQ0VMTEFORU9VUy4NCi0NCi0gICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdA0KLSAgICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUNCi0gICAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZQ0KLSAgICAgIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlDQotICAgICAgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQ0KLSAgICAgIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudA0KLSAgICAgIGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoDQotICAgICAganVyaXNkaWN0aW9u1XMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uDQotICAgICAgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZg0KLSAgICAgIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYQ0KLSAgICAgIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nDQotICAgICAgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQNCi0gICAgICBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXPVIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUNCi0gICAgICBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQ0KLSAgICAgIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3INCi0gICAgICByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwNCi0gICAgICBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLg0KLSAgICAgIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUNCi0gICAgICBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQNCi0gICAgICBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLA0KLSAgICAgIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLg0KLQ0KLSAgICAgIDEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLg0KLQ0KLSAgICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMNCi0gICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yDQotICAgICAgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlDQotICAgICAgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bw0KLSAgICAgIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcNCi0gICAgICBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbg0KLSAgICAgIG9mIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvamF4Yi14amMtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvamF4Yi14amMtTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGViZjguLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2pheGIteGpjLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wDQotDQotDQotICAgICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgICAgICAgMS4xLiAiQ29udHJpYnV0b3IiIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdA0KLSAgICAgICAgICAgIGNyZWF0ZXMgb3IgY29udHJpYnV0ZXMgdG8gdGhlIGNyZWF0aW9uIG9mIE1vZGlmaWNhdGlvbnMuDQotDQotICAgICAgICAgICAgMS4yLiAiQ29udHJpYnV0b3IgVmVyc2lvbiIgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZQ0KLSAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIChpZiBhbnkpLCBhbmQgdGhlIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0DQotICAgICAgICAgICAgcGFydGljdWxhciBDb250cmlidXRvci4NCi0NCi0gICAgICAgICAgICAxLjMuICJDb3ZlcmVkIFNvZnR3YXJlIiBtZWFucyAoYSkgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvcg0KLSAgICAgICAgICAgIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzDQotICAgICAgICAgICAgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSB3aXRoIGZpbGVzIGNvbnRhaW5pbmcNCi0gICAgICAgICAgICBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuDQotDQotICAgICAgICAgICAgMS40LiAiRXhlY3V0YWJsZSIgbWVhbnMgdGhlIENvdmVyZWQgU29mdHdhcmUgaW4gYW55IGZvcm0NCi0gICAgICAgICAgICBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLiANCi0NCi0gICAgICAgICAgICAxLjUuICJJbml0aWFsIERldmVsb3BlciIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5DQotICAgICAgICAgICAgdGhhdCBmaXJzdCBtYWtlcyBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhpcw0KLSAgICAgICAgICAgIExpY2Vuc2UuIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIDEuNi4gIkxhcmdlciBXb3JrIiBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZA0KLSAgICAgICAgICAgIFNvZnR3YXJlIG9yIHBvcnRpb25zIHRoZXJlb2Ygd2l0aCBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUNCi0gICAgICAgICAgICB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgICAgICAgMS43LiAiTGljZW5zZSIgbWVhbnMgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAgICAgICAxLjguICJMaWNlbnNhYmxlIiBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUNCi0gICAgICAgICAgICBtYXhpbXVtIGV4dGVudCBwb3NzaWJsZSwgd2hldGhlciBhdCB0aGUgdGltZSBvZiB0aGUgaW5pdGlhbA0KLSAgICAgICAgICAgIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cw0KLSAgICAgICAgICAgIGNvbnZleWVkIGhlcmVpbi4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAxLjkuICJNb2RpZmljYXRpb25zIiBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUNCi0gICAgICAgICAgICBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOiANCi0NCi0gICAgICAgICAgICAgICAgICBBLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywNCi0gICAgICAgICAgICAgICAgICBkZWxldGlvbiBmcm9tIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGVudHMgb2YgYQ0KLSAgICAgICAgICAgICAgICAgIGZpbGUgY29udGFpbmluZyBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cw0KLSAgICAgICAgICAgICAgICAgIE1vZGlmaWNhdGlvbnM7IA0KLQ0KLSAgICAgICAgICAgICAgICAgIEIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZQ0KLSAgICAgICAgICAgICAgICAgIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbjsgb3IgDQotDQotICAgICAgICAgICAgICAgICAgQy4gQW55IG5ldyBmaWxlIHRoYXQgaXMgY29udHJpYnV0ZWQgb3Igb3RoZXJ3aXNlIG1hZGUNCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAgICAgICAxLjEwLiAiT3JpZ2luYWwgU29mdHdhcmUiIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQNCi0gICAgICAgICAgICBFeGVjdXRhYmxlIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSB0aGF0IGlzDQotICAgICAgICAgICAgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgIDEuMTEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQNCi0gICAgICAgICAgICBvciBoZXJlYWZ0ZXIgYWNxdWlyZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sDQotICAgICAgICAgICAgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudA0KLSAgICAgICAgICAgIExpY2Vuc2FibGUgYnkgZ3JhbnRvci4gDQotDQotICAgICAgICAgICAgMS4xMi4gIlNvdXJjZSBDb2RlIiBtZWFucyAoYSkgdGhlIGNvbW1vbiBmb3JtIG9mIGNvbXB1dGVyDQotICAgICAgICAgICAgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikNCi0gICAgICAgICAgICBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgaW4gb3Igd2l0aCBzdWNoIGNvZGUuDQotDQotICAgICAgICAgICAgMS4xMy4gIllvdSIgKG9yICJZb3VyIikgbWVhbnMgYW4gaW5kaXZpZHVhbCBvciBhIGxlZ2FsDQotICAgICAgICAgICAgZW50aXR5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyLCBhbmQgY29tcGx5aW5nIHdpdGggYWxsIG9mDQotICAgICAgICAgICAgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgIllvdSINCi0gICAgICAgICAgICBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcw0KLSAgICAgICAgICAgIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcw0KLSAgICAgICAgICAgIGRlZmluaXRpb24sICJjb250cm9sIiBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3INCi0gICAgICAgICAgICBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2gNCi0gICAgICAgICAgICBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYikgb3duZXJzaGlwDQotICAgICAgICAgICAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcw0KLSAgICAgICAgICAgIG9yIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgIDIuIExpY2Vuc2UgR3JhbnRzLiANCi0NCi0gICAgICAgICAgICAyLjEuIFRoZSBJbml0aWFsIERldmVsb3BlciBHcmFudC4NCi0NCi0gICAgICAgICAgICBDb25kaXRpb25lZCB1cG9uIFlvdXIgY29tcGxpYW5jZSB3aXRoIFNlY3Rpb24gMy4xIGJlbG93IGFuZA0KLSAgICAgICAgICAgIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgdGhlDQotICAgICAgICAgICAgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLA0KLSAgICAgICAgICAgIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOiANCi0NCi0gICAgICAgICAgICAgICAgICAoYSkgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbg0KLSAgICAgICAgICAgICAgICAgIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsDQotICAgICAgICAgICAgICAgICAgdG8gdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwNCi0gICAgICAgICAgICAgICAgICBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3INCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChiKSB1bmRlciBQYXRlbnQgQ2xhaW1zIGluZnJpbmdlZCBieSB0aGUgbWFraW5nLA0KLSAgICAgICAgICAgICAgICAgIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUNCi0gICAgICAgICAgICAgICAgICBtYWRlLCB1c2UsIHByYWN0aWNlLCBzZWxsLCBhbmQgb2ZmZXIgZm9yIHNhbGUsIGFuZC9vcg0KLSAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSAob3INCi0gICAgICAgICAgICAgICAgICBwb3J0aW9ucyB0aGVyZW9mKS4gDQotDQotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMShhKSBhbmQgKGIpDQotICAgICAgICAgICAgICAgICAgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBJbml0aWFsIERldmVsb3BlciBmaXJzdA0KLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgT3JpZ2luYWwgU29mdHdhcmUNCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcw0KLSAgICAgICAgICAgICAgICAgIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgICAgICAgIChkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudA0KLSAgICAgICAgICAgICAgICAgIGxpY2Vuc2UgaXMgZ3JhbnRlZDogKDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tDQotICAgICAgICAgICAgICAgICAgdGhlIE9yaWdpbmFsIFNvZnR3YXJlLCBvciAoMikgZm9yIGluZnJpbmdlbWVudHMNCi0gICAgICAgICAgICAgICAgICBjYXVzZWQgYnk6IChpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbA0KLSAgICAgICAgICAgICAgICAgIFNvZnR3YXJlLCBvciAoaWkpIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgT3JpZ2luYWwNCi0gICAgICAgICAgICAgICAgICBTb2Z0d2FyZSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGRldmljZXMuIA0KLQ0KLSAgICAgICAgICAgIDIuMi4gQ29udHJpYnV0b3IgR3JhbnQuDQotDQotICAgICAgICAgICAgQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQNCi0gICAgICAgICAgICBzdWJqZWN0IHRvIHRoaXJkIHBhcnR5IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBjbGFpbXMsIGVhY2gNCi0gICAgICAgICAgICBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwNCi0gICAgICAgICAgICBub24tZXhjbHVzaXZlIGxpY2Vuc2U6DQotDQotICAgICAgICAgICAgICAgICAgKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4NCi0gICAgICAgICAgICAgICAgICBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yIHRvDQotICAgICAgICAgICAgICAgICAgdXNlLCByZXByb2R1Y2UsIG1vZGlmeSwgZGlzcGxheSwgcGVyZm9ybSwgc3VibGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaA0KLSAgICAgICAgICAgICAgICAgIENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgZWl0aGVyIG9uIGFuDQotICAgICAgICAgICAgICAgICAgdW5tb2RpZmllZCBiYXNpcywgd2l0aCBvdGhlciBNb2RpZmljYXRpb25zLCBhcw0KLSAgICAgICAgICAgICAgICAgIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kDQotICAgICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgICAgICAgKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsDQotICAgICAgICAgICAgICAgICAgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQNCi0gICAgICAgICAgICAgICAgICBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGgNCi0gICAgICAgICAgICAgICAgICBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbiAob3IgcG9ydGlvbnMgb2Ygc3VjaA0KLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwNCi0gICAgICAgICAgICAgICAgICBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogKDEpDQotICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zDQotICAgICAgICAgICAgICAgICAgdGhlcmVvZik7IGFuZCAoMikgdGhlIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMNCi0gICAgICAgICAgICAgICAgICBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3Igd2l0aCBpdHMgQ29udHJpYnV0b3IgVmVyc2lvbg0KLSAgICAgICAgICAgICAgICAgIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gDQotDQotICAgICAgICAgICAgICAgICAgKGMpIFRoZSBsaWNlbnNlcyBncmFudGVkIGluIFNlY3Rpb25zIDIuMihhKSBhbmQNCi0gICAgICAgICAgICAgICAgICAyLjIoYikgYXJlIGVmZmVjdGl2ZSBvbiB0aGUgZGF0ZSBDb250cmlidXRvciBmaXJzdA0KLSAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGVzIG9yIG90aGVyd2lzZSBtYWtlcyB0aGUgTW9kaWZpY2F0aW9ucw0KLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LiANCi0NCi0gICAgICAgICAgICAgICAgICAoZCkgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQNCi0gICAgICAgICAgICAgICAgICBsaWNlbnNlIGlzIGdyYW50ZWQ6ICgxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvcg0KLSAgICAgICAgICAgICAgICAgIGhhcyBkZWxldGVkIGZyb20gdGhlIENvbnRyaWJ1dG9yIFZlcnNpb247ICgyKSBmb3INCi0gICAgICAgICAgICAgICAgICBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkpIHRoaXJkIHBhcnR5DQotICAgICAgICAgICAgICAgICAgbW9kaWZpY2F0aW9ucyBvZiBDb250cmlidXRvciBWZXJzaW9uLCBvciAoaWkpIHRoZQ0KLSAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgICAgICAgd2l0aCBvdGhlciBzb2Z0d2FyZSAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlDQotICAgICAgICAgICAgICAgICAgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMpIHVuZGVyDQotICAgICAgICAgICAgICAgICAgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUNCi0gICAgICAgICAgICAgICAgICBhYnNlbmNlIG9mIE1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yLiANCi0NCi0gICAgICAzLiBEaXN0cmlidXRpb24gT2JsaWdhdGlvbnMuDQotDQotICAgICAgICAgICAgMy4xLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuDQotDQotICAgICAgICAgICAgQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZQ0KLSAgICAgICAgICAgIGF2YWlsYWJsZSBpbiBFeGVjdXRhYmxlIGZvcm0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGluDQotICAgICAgICAgICAgU291cmNlIENvZGUgZm9ybSBhbmQgdGhhdCBTb3VyY2UgQ29kZSBmb3JtIG11c3QgYmUNCi0gICAgICAgICAgICBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0DQotICAgICAgICAgICAgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUNCi0gICAgICAgICAgICBTb3VyY2UgQ29kZSBmb3JtIG9mIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIFlvdSBkaXN0cmlidXRlIG9yDQotICAgICAgICAgICAgb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkNCi0gICAgICAgICAgICBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gRXhlY3V0YWJsZSBmb3JtIGFzIHRvIGhvdyB0aGV5IGNhbg0KLSAgICAgICAgICAgIG9idGFpbiBzdWNoIENvdmVyZWQgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSBpbiBhDQotICAgICAgICAgICAgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkDQotICAgICAgICAgICAgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLg0KLQ0KLSAgICAgICAgICAgIDMuMi4gTW9kaWZpY2F0aW9ucy4NCi0NCi0gICAgICAgICAgICBUaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91DQotICAgICAgICAgICAgY29udHJpYnV0ZSBhcmUgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gWW91DQotICAgICAgICAgICAgcmVwcmVzZW50IHRoYXQgWW91IGJlbGlldmUgWW91ciBNb2RpZmljYXRpb25zIGFyZSBZb3VyDQotICAgICAgICAgICAgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvDQotICAgICAgICAgICAgZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgICAgICAgMy4zLiBSZXF1aXJlZCBOb3RpY2VzLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtdXN0IGluY2x1ZGUgYSBub3RpY2UgaW4gZWFjaCBvZiBZb3VyIE1vZGlmaWNhdGlvbnMNCi0gICAgICAgICAgICB0aGF0IGlkZW50aWZpZXMgWW91IGFzIHRoZSBDb250cmlidXRvciBvZiB0aGUgTW9kaWZpY2F0aW9uLg0KLSAgICAgICAgICAgIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3INCi0gICAgICAgICAgICB0cmFkZW1hcmsgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLCBvcg0KLSAgICAgICAgICAgIGFueSBub3RpY2VzIG9mIGxpY2Vuc2luZyBvciBhbnkgZGVzY3JpcHRpdmUgdGV4dCBnaXZpbmcNCi0gICAgICAgICAgICBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLg0KLQ0KLSAgICAgICAgICAgIDMuNC4gQXBwbGljYXRpb24gb2YgQWRkaXRpb25hbCBUZXJtcy4NCi0NCi0gICAgICAgICAgICBZb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkDQotICAgICAgICAgICAgU29mdHdhcmUgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGFsdGVycyBvciByZXN0cmljdHMgdGhlDQotICAgICAgICAgICAgYXBwbGljYWJsZSB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBvciB0aGUgcmVjaXBpZW50c9UNCi0gICAgICAgICAgICByaWdodHMgaGVyZXVuZGVyLiBZb3UgbWF5IGNob29zZSB0byBvZmZlciwgYW5kIHRvIGNoYXJnZSBhDQotICAgICAgICAgICAgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkNCi0gICAgICAgICAgICBvYmxpZ2F0aW9ucyB0byBvbmUgb3IgbW9yZSByZWNpcGllbnRzIG9mIENvdmVyZWQgU29mdHdhcmUuDQotICAgICAgICAgICAgSG93ZXZlciwgeW91IG1heSBkbyBzbyBvbmx5IG9uIFlvdXIgb3duIGJlaGFsZiwgYW5kIG5vdCBvbg0KLSAgICAgICAgICAgIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UNCi0gICAgICAgICAgICBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGF0IGFueSBzdWNoIHdhcnJhbnR5LA0KLSAgICAgICAgICAgIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbiBpcyBvZmZlcmVkIGJ5DQotICAgICAgICAgICAgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkDQotICAgICAgICAgICAgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YNCi0gICAgICAgICAgICB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuDQotICAgICAgICAgIA0KLQ0KLSAgICAgICAgICAgIDMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIGZvcm0gb2YgdGhlIENvdmVyZWQNCi0gICAgICAgICAgICBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcw0KLSAgICAgICAgICAgIG9mIGEgbGljZW5zZSBvZiBZb3VyIGNob2ljZSwgd2hpY2ggbWF5IGNvbnRhaW4gdGVybXMNCi0gICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbg0KLSAgICAgICAgICAgIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZQ0KLSAgICAgICAgICAgIGxpY2Vuc2UgZm9yIHRoZSBFeGVjdXRhYmxlIGZvcm0gZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdA0KLSAgICAgICAgICAgIG9yIGFsdGVyIHRoZSByZWNpcGllbnTVcyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIGZvcm0NCi0gICAgICAgICAgICBmcm9tIHRoZSByaWdodHMgc2V0IGZvcnRoIGluIHRoaXMgTGljZW5zZS4gSWYgWW91DQotICAgICAgICAgICAgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYQ0KLSAgICAgICAgICAgIGRpZmZlcmVudCBsaWNlbnNlLCBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdA0KLSAgICAgICAgICAgIGFueSB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UgYXJlIG9mZmVyZWQgYnkgWW91DQotICAgICAgICAgICAgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdQ0KLSAgICAgICAgICAgIGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeQ0KLSAgICAgICAgICAgIENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsDQotICAgICAgICAgICAgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMNCi0gICAgICAgICAgICBZb3Ugb2ZmZXIuDQotDQotICAgICAgICAgICAgMy42LiBMYXJnZXIgV29ya3MuDQotDQotICAgICAgICAgICAgWW91IG1heSBjcmVhdGUgYSBMYXJnZXIgV29yayBieSBjb21iaW5pbmcgQ292ZXJlZCBTb2Z0d2FyZQ0KLSAgICAgICAgICAgIHdpdGggb3RoZXIgY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZQ0KLSAgICAgICAgICAgIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoDQotICAgICAgICAgICAgYSBjYXNlLCBZb3UgbXVzdCBtYWtlIHN1cmUgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UNCi0gICAgICAgICAgICBhcmUgZnVsZmlsbGVkIGZvciB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gDQotICAgICAgICAgICAgDQotICAgICAgNC4gVmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UuIA0KLQ0KLSAgICAgICAgICAgIDQuMS4gTmV3IFZlcnNpb25zLg0KLQ0KLSAgICAgICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaXMgdGhlIGluaXRpYWwgbGljZW5zZSBzdGV3YXJkIGFuZA0KLSAgICAgICAgICAgIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UNCi0gICAgICAgICAgICBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYQ0KLSAgICAgICAgICAgIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBFeGNlcHQgYXMgcHJvdmlkZWQgaW4NCi0gICAgICAgICAgICBTZWN0aW9uIDQuMywgbm8gb25lIG90aGVyIHRoYW4gdGhlIGxpY2Vuc2Ugc3Rld2FyZCBoYXMgdGhlDQotICAgICAgICAgICAgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4gDQotDQotICAgICAgICAgICAgNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLg0KLQ0KLSAgICAgICAgICAgIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSwgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UNCi0gICAgICAgICAgICBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlDQotICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZA0KLSAgICAgICAgICAgIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLiBJZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW5jbHVkZXMgYQ0KLSAgICAgICAgICAgIG5vdGljZSBpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUgcHJvaGliaXRpbmcgaXQgZnJvbSBiZWluZw0KLSAgICAgICAgICAgIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkNCi0gICAgICAgICAgICBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtdXN0IGRpc3RyaWJ1dGUgYW5kDQotICAgICAgICAgICAgbWFrZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQ0KLSAgICAgICAgICAgIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQNCi0gICAgICAgICAgICB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gT3RoZXJ3aXNlLCBZb3UgbWF5IGFsc28gY2hvb3NlIHRvDQotICAgICAgICAgICAgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlDQotICAgICAgICAgICAgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZQ0KLSAgICAgICAgICAgIExpY2Vuc2UgcHVibGlzaGVkIGJ5IHRoZSBsaWNlbnNlIHN0ZXdhcmQuIA0KLQ0KLSAgICAgICAgICAgIDQuMy4gTW9kaWZpZWQgVmVyc2lvbnMuDQotDQotICAgICAgICAgICAgV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYQ0KLSAgICAgICAgICAgIG5ldyBsaWNlbnNlIGZvciBZb3VyIE9yaWdpbmFsIFNvZnR3YXJlLCBZb3UgbWF5IGNyZWF0ZSBhbmQNCi0gICAgICAgICAgICB1c2UgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoaXMgTGljZW5zZSBpZiBZb3U6IChhKSByZW5hbWUNCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBhbmQgcmVtb3ZlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBuYW1lIG9mIHRoZQ0KLSAgICAgICAgICAgIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzDQotICAgICAgICAgICAgZnJvbSB0aGlzIExpY2Vuc2UpOyBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQNCi0gICAgICAgICAgICB0aGUgbGljZW5zZSBjb250YWlucyB0ZXJtcyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIExpY2Vuc2UuDQotICAgICAgICAgICAgDQotDQotICAgICAgNS4gRElTQ0xBSU1FUiBPRiBXQVJSQU5UWS4NCi0NCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiDQotICAgICAgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwNCi0gICAgICBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEDQotICAgICAgU09GVFdBUkUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSDQotICAgICAgUFVSUE9TRSBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORA0KLSAgICAgIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZDQotICAgICAgQ09WRVJFRCBTT0ZUV0FSRSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UIFRIRQ0KLSAgICAgIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GDQotICAgICAgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YNCi0gICAgICBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwgUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRg0KLSAgICAgIEFOWSBDT1ZFUkVEIFNPRlRXQVJFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUiBUSElTDQotICAgICAgRElTQ0xBSU1FUi4gDQotDQotICAgICAgNi4gVEVSTUlOQVRJT04uIA0KLQ0KLSAgICAgICAgICAgIDYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwNCi0gICAgICAgICAgICB0ZXJtaW5hdGUgYXV0b21hdGljYWxseSBpZiBZb3UgZmFpbCB0byBjb21wbHkgd2l0aCB0ZXJtcw0KLSAgICAgICAgICAgIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mDQotICAgICAgICAgICAgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXINCi0gICAgICAgICAgICBuYXR1cmUsIG11c3QgcmVtYWluIGluIGVmZmVjdCBiZXlvbmQgdGhlIHRlcm1pbmF0aW9uIG9mDQotICAgICAgICAgICAgdGhpcyBMaWNlbnNlIHNoYWxsIHN1cnZpdmUuDQotDQotICAgICAgICAgICAgNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nDQotICAgICAgICAgICAgZGVjbGFyYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvcg0KLSAgICAgICAgICAgIGEgQ29udHJpYnV0b3IgKHRoZSBJbml0aWFsIERldmVsb3BlciBvciBDb250cmlidXRvciBhZ2FpbnN0DQotICAgICAgICAgICAgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgIlBhcnRpY2lwYW50IikNCi0gICAgICAgICAgICBhbGxlZ2luZyB0aGF0IHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSAobWVhbmluZyB0aGUNCi0gICAgICAgICAgICBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yDQotICAgICAgICAgICAgb3IgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyB0aGUNCi0gICAgICAgICAgICBJbml0aWFsIERldmVsb3BlcikgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55DQotICAgICAgICAgICAgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yDQotICAgICAgICAgICAgaW5kaXJlY3RseSB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCwgdGhlIEluaXRpYWwNCi0gICAgICAgICAgICBEZXZlbG9wZXIgKGlmIHRoZSBJbml0aWFsIERldmVsb3BlciBpcyBub3QgdGhlIFBhcnRpY2lwYW50KQ0KLSAgICAgICAgICAgIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMNCi0gICAgICAgICAgICBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQNCi0gICAgICAgICAgICB0ZXJtaW5hdGUgcHJvc3BlY3RpdmVseSBhbmQgYXV0b21hdGljYWxseSBhdCB0aGUgZXhwaXJhdGlvbg0KLSAgICAgICAgICAgIG9mIHN1Y2ggNjAgZGF5IG5vdGljZSBwZXJpb2QsIHVubGVzcyBpZiB3aXRoaW4gc3VjaCA2MCBkYXkNCi0gICAgICAgICAgICBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZQ0KLSAgICAgICAgICAgIFBhcnRpY2lwYW50IFNvZnR3YXJlIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudCBlaXRoZXINCi0gICAgICAgICAgICB1bmlsYXRlcmFsbHkgb3IgcHVyc3VhbnQgdG8gYSB3cml0dGVuIGFncmVlbWVudCB3aXRoDQotICAgICAgICAgICAgUGFydGljaXBhbnQuDQotDQotICAgICAgICAgICAgNi4zLiBJbiB0aGUgZXZlbnQgb2YgdGVybWluYXRpb24gdW5kZXIgU2VjdGlvbnMgNi4xIG9yIDYuMg0KLSAgICAgICAgICAgIGFib3ZlLCBhbGwgZW5kIHVzZXIgbGljZW5zZXMgdGhhdCBoYXZlIGJlZW4gdmFsaWRseSBncmFudGVkDQotICAgICAgICAgICAgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24NCi0gICAgICAgICAgICAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikNCi0gICAgICAgICAgICBzaGFsbCBzdXJ2aXZlIHRlcm1pbmF0aW9uLg0KLQ0KLSAgICAgIDcuIExJTUlUQVRJT04gT0YgTElBQklMSVRZLg0KLQ0KLSAgICAgIFVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUDQotICAgICAgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgQ09OVFJBQ1QsIE9SIE9USEVSV0lTRSwgU0hBTEwgWU9VLCBUSEUNCi0gICAgICBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YNCi0gICAgICBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUNCi0gICAgICBMSUFCTEUgVE8gQU5ZIFBFUlNPTiBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBJTkNJREVOVEFMLCBPUg0KLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPRiBBTlkgQ0hBUkFDVEVSIElOQ0xVRElORywgV0lUSE9VVA0KLSAgICAgIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSw0KLSAgICAgIFNUT1BQQUdFLCBDT01QVVRFUiBGQUlMVVJFIE9SIE1BTEZVTkNUSU9OLCBPUiBBTlkgQU5EIEFMTCBPVEhFUg0KLSAgICAgIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4NCi0gICAgICBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YNCi0gICAgICBMSUFCSUxJVFkgU0hBTEwgTk9UIEFQUExZIFRPIExJQUJJTElUWSBGT1IgREVBVEggT1IgUEVSU09OQUwNCi0gICAgICBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWdVTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVA0KLSAgICAgIEFQUExJQ0FCTEUgTEFXIFBST0hJQklUUyBTVUNIIExJTUlUQVRJT04uIFNPTUUgSlVSSVNESUNUSU9OUyBETw0KLSAgICAgIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUg0KLSAgICAgIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVA0KLSAgICAgIEFQUExZIFRPIFlPVS4NCi0NCi0gICAgICA4LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLg0KLQ0KLSAgICAgIFRoZSBDb3ZlcmVkIFNvZnR3YXJlIGlzIGEgImNvbW1lcmNpYWwgaXRlbSwiIGFzIHRoYXQgdGVybSBpcw0KLSAgICAgIGRlZmluZWQgaW4gNDggQy5GLlIuIDIuMTAxIChPY3QuIDE5OTUpLCBjb25zaXN0aW5nIG9mICJjb21tZXJjaWFsDQotICAgICAgY29tcHV0ZXIgc29mdHdhcmUiIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4gpA0KLSAgICAgIDI1Mi4yMjctNzAxNChhKSgxKSkgYW5kICJjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlDQotICAgICAgZG9jdW1lbnRhdGlvbiIgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0Lg0KLSAgICAgIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTENCi0gICAgICB0aHJvdWdoIDIyNy43MjAyLTQgKEp1bmUgMTk5NSksIGFsbCBVLlMuIEdvdmVybm1lbnQgRW5kIFVzZXJzDQotICAgICAgYWNxdWlyZSBDb3ZlcmVkIFNvZnR3YXJlIHdpdGggb25seSB0aG9zZSByaWdodHMgc2V0IGZvcnRoIGhlcmVpbi4NCi0gICAgICBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLA0KLSAgICAgIGFueSBvdGhlciBGQVIsIERGQVIsIG9yIG90aGVyIGNsYXVzZSBvciBwcm92aXNpb24gdGhhdCBhZGRyZXNzZXMNCi0gICAgICBHb3Zlcm5tZW50IHJpZ2h0cyBpbiBjb21wdXRlciBzb2Z0d2FyZSB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgOS4gTUlTQ0VMTEFORU9VUy4NCi0NCi0gICAgICBUaGlzIExpY2Vuc2UgcmVwcmVzZW50cyB0aGUgY29tcGxldGUgYWdyZWVtZW50IGNvbmNlcm5pbmcgc3ViamVjdA0KLSAgICAgIG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUNCi0gICAgICB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZQ0KLSAgICAgIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBpdCBlbmZvcmNlYWJsZS4gVGhpcyBMaWNlbnNlIHNoYWxsIGJlDQotICAgICAgZ292ZXJuZWQgYnkgdGhlIGxhdyBvZiB0aGUganVyaXNkaWN0aW9uIHNwZWNpZmllZCBpbiBhIG5vdGljZQ0KLSAgICAgIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudA0KLSAgICAgIGFwcGxpY2FibGUgbGF3LCBpZiBhbnksIHByb3ZpZGVzIG90aGVyd2lzZSksIGV4Y2x1ZGluZyBzdWNoDQotICAgICAganVyaXNkaWN0aW9u1XMgY29uZmxpY3Qtb2YtbGF3IHByb3Zpc2lvbnMuIEFueSBsaXRpZ2F0aW9uDQotICAgICAgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZg0KLSAgICAgIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYQ0KLSAgICAgIG5vdGljZSBjb250YWluZWQgd2l0aGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgd2l0aCB0aGUgbG9zaW5nDQotICAgICAgcGFydHkgcmVzcG9uc2libGUgZm9yIGNvc3RzLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgY291cnQNCi0gICAgICBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXPVIGZlZXMgYW5kIGV4cGVuc2VzLiBUaGUNCi0gICAgICBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZQ0KLSAgICAgIEludGVybmF0aW9uYWwgU2FsZSBvZiBHb29kcyBpcyBleHByZXNzbHkgZXhjbHVkZWQuIEFueSBsYXcgb3INCi0gICAgICByZWd1bGF0aW9uIHdoaWNoIHByb3ZpZGVzIHRoYXQgdGhlIGxhbmd1YWdlIG9mIGEgY29udHJhY3Qgc2hhbGwNCi0gICAgICBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLg0KLSAgICAgIFlvdSBhZ3JlZSB0aGF0IFlvdSBhbG9uZSBhcmUgcmVzcG9uc2libGUgZm9yIGNvbXBsaWFuY2Ugd2l0aCB0aGUNCi0gICAgICBVbml0ZWQgU3RhdGVzIGV4cG9ydCBhZG1pbmlzdHJhdGlvbiByZWd1bGF0aW9ucyAoYW5kIHRoZSBleHBvcnQNCi0gICAgICBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLA0KLSAgICAgIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlIGFueSBDb3ZlcmVkIFNvZnR3YXJlLg0KLQ0KLSAgICAgIDEwLiBSRVNQT05TSUJJTElUWSBGT1IgQ0xBSU1TLg0KLQ0KLSAgICAgIEFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMNCi0gICAgICByZXNwb25zaWJsZSBmb3IgY2xhaW1zIGFuZCBkYW1hZ2VzIGFyaXNpbmcsIGRpcmVjdGx5IG9yDQotICAgICAgaW5kaXJlY3RseSwgb3V0IG9mIGl0cyB1dGlsaXphdGlvbiBvZiByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlDQotICAgICAgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0bw0KLSAgICAgIGRpc3RyaWJ1dGUgc3VjaCByZXNwb25zaWJpbGl0eSBvbiBhbiBlcXVpdGFibGUgYmFzaXMuIE5vdGhpbmcNCi0gICAgICBoZXJlaW4gaXMgaW50ZW5kZWQgb3Igc2hhbGwgYmUgZGVlbWVkIHRvIGNvbnN0aXR1dGUgYW55IGFkbWlzc2lvbg0KLSAgICAgIG9mIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvamF4ZW4tTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvamF4ZW4tTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmU1YTMuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2pheGVuLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gJElkOiBMSUNFTlNFLnR4dCx2IDEuNSAyMDA2LzAyLzA1IDIxOjQ5OjA0IGVsaGFybyBFeHAgJA0KLQ0KLSBDb3B5cmlnaHQgMjAwMy0yMDA2IFRoZSBXZXJrZW4gQ29tcGFueS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gDQotIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KLSBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotIG1ldDoNCi0NCi0gICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLQ0KLSAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQotICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQotDQotICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEpheGVuIFByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMNCi0gICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIA0KLSAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQotDQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMNCi1JUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQNCi1UTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEENCi1QQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVINCi1PUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwNCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sDQotUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SDQotUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KLUxJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTDQotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQotDQotICovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2pldHRpc29uLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2pldHRpc29uLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU0MjMzLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9qZXR0aXNvbi1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQ29weXJpZ2h0IDIwMDYgRW52b2kgU29sdXRpb25zIExMQw0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9qaWJ4LWJpbmQtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvamlieC1iaW5kLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNlY2JlLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9qaWJ4LWJpbmQtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1Db3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRGVubmlzIE0uIFNvc25vc2tpCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAotYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEppQlggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkCi0gICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYwotICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECi1BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci1MT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLUFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0oSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL2ppYngtcnVuLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL2ppYngtcnVuLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNlY2JlLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9qaWJ4LXJ1bi1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBEZW5uaXMgTS4gU29zbm9za2kKLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCi1hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIE5laXRoZXIgdGhlIG5hbWUgb2YgSmlCWCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKLSAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljCi0gICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKLUFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi1ESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLUxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi1TT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvanVsaS1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9qdWxpLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVlYjE0Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9qdWxpLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzA3ICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotCi1BUEFDSEUgVE9NQ0FUIFNVQkNPTVBPTkVOVFM6IAotCi1BcGFjaGUgVG9tY2F0IGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aCBzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcwotYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuIAotCi0KLUZvciB0aGUgamFzcGVyLWpkdC5qYXIgY29tcG9uZW50OgotCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjAKLQotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDCi1MSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0KLUNPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCi0KLTEuIERFRklOSVRJT05TCi0KLSJDb250cmlidXRpb24iIG1lYW5zOgotCi1hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAotCi1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6Ci0KLWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAotCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOwotCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlCi1kaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEKLUNvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKLWFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0bwotdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKLWRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCi0KLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KLQotIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlCi1uZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbgotY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KLQotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KLQotIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwKLWluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgotCi0yLiBHUkFOVCBPRiBSSUdIVFMKLQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLXJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLAotZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2gKLWRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgotCi1iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZAotUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uCi1UaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCi1hZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCi1MaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMKLXdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KLQotYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvCi1pdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkKLUNvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvCi1SZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKLXJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4KLUZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UKLWJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCi0KLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4KLQotMy4gUkVRVUlSRU1FTlRTCi0KLUEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzCi1vd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6Ci0KLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAotbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IKLWRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsCi1kYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKLQotaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieQotdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCi0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwKLWFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi1Qcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmCi1hbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZQotb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgotCi00LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgotCi1Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoCi1yZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMKLWludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKLXdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYKLWEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2gKLUNvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkKLWV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMKLWFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwKLWFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZQotZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQotcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0Ci1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcwotcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIKLUNvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQKLXJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgotSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKLU5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaAotUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZgotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzCi1vZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKLXByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWQotQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUCi1QUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLU9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUwotR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUKLWxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUKLXRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKLXByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaAotcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYKLShleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCi1pbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlcgotU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvCi1jb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMKLW5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2YKLXN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsCi1SZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMKLXJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1hbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZAotc3Vydml2ZS4KLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4KLW9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUKLW1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvCi1wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuCi1ObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uCi1tYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZQotc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhCi1kaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzCi1iZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzCi1yZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsCi1Db250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKQotdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpCi1hYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mCi1hbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKLWVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIKLXRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KLQotVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMKLUFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhcgotYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4KLWFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KLQotCi1Gb3IgdGhlIFdpbmRvd3MgSW5zdGFsbGVyIGNvbXBvbmVudDoKLQotICAgICogQWxsIE5TSVMgc291cmNlIGNvZGUsIHBsdWctaW5zLCBkb2N1bWVudGF0aW9uLCBleGFtcGxlcywgaGVhZGVyIGZpbGVzIGFuZAotICAgICAgIGdyYXBoaWNzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGNvbXByZXNzaW9uIG1vZHVsZXMgYW5kIHdoZXJlCi0gICAgICAgb3RoZXJ3aXNlIG5vdGVkLCBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIHpsaWIvbGlicG5nIGxpY2Vuc2UuCi0gICAgKiBUaGUgemxpYiBjb21wcmVzc2lvbiBtb2R1bGUgZm9yIE5TSVMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHpsaWIvbGlicG5nCi0gICAgICAgbGljZW5zZS4KLSAgICAqIFRoZSBiemlwMiBjb21wcmVzc2lvbiBtb2R1bGUgZm9yIE5TSVMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGJ6aXAyIGxpY2Vuc2UuCi0gICAgKiBUaGUgbHptYSBjb21wcmVzc2lvbiBtb2R1bGUgZm9yIE5TSVMgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENvbW1vbiBQdWJsaWMKLSAgICAgICBMaWNlbnNlIHZlcnNpb24gMS4wLiAKLQotemxpYi9saWJwbmcgbGljZW5zZQotCi1UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4gSW4KLW5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mCi10aGlzIHNvZnR3YXJlLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwgaW5jbHVkaW5nCi1jb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvCi10aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0KLSAgICAgICB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhCi0gICAgICAgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uIAotCi1iemlwMiBsaWNlbnNlCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCi1hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLSAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0KLSAgICAgICB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhCi0gICAgICAgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gICAzLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLVdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi1NRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVAotU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVAotT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi1JTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORwotSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCi1PRiBTVUNIIERBTUFHRS4KLQotSnVsaWFuIFNld2FyZCwgQ2FtYnJpZGdlLCBVSy4KLQotanNld2FyZEBhY20ub3JnCi1Db21tb24gUHVibGljIExpY2Vuc2UgdmVyc2lvbiAxLjAKLQotVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMKLUxJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTQotQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KLQotMS4gREVGSU5JVElPTlMKLQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6Ci0KLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudAotQ29udHJpYnV0b3I6Ci0KLWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAotCi1paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOwotCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlCi1kaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEKLUNvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKLWFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0bwotdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKLWRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCi0KLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KLQotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZQotbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4KLWNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCi0KLSJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCi0KLSJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCi1pbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KLQotMi4gR1JBTlQgT0YgUklHSFRTCi0KLWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvCi1yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwKLWRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoCi1kZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4KLQotYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQKLVBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKLUNvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgotVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCi1Qcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAotYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZQotTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zCi13aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCi0KLWMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0bwotaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55Ci1Db250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0bwotUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZgotaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlCi1yaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlCi1yZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuCi1Gb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlCi1iZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgotCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuCi0KLTMuIFJFUVVJUkVNRU5UUwotCi1BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cwotb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgotCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKLQotaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQKLW5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCi1maXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKLQotaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yCi1kYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbAotZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7Ci0KLWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkKLXRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZAotCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsCi1hbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgotCi1XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06Ci0KLWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KLQotQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZQotUHJvZ3JhbS4KLQotRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZgotYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUKLW9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KLQotNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KLQotQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aAotcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzCi1pbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobwotaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyCi13aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmCi1hIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoCi1Db250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5Ci1ldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzCi1hbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsCi1hY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUKLWV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvCi1jb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkKLXJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4KLWFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KLQotRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdAotQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKLXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyCi1Db250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0Ci1yZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KLQotNS4gTk8gV0FSUkFOVFkKLQotRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IKLUlNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCi1OT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2gKLVJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mCi1wcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwKLXByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgotCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWQotQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUCi1QUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLU9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUwotR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgotCi03LiBHRU5FUkFMCi0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUKLWxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUKLXRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKLXByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaAotcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KLQotSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0bwotYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEKLWxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50Ci11bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgotYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQotKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0KLWl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKQotaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIKLVNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0bwotY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzCi1ub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mCi1zdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLAotUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzCi1yZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAotYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQKLXN1cnZpdmUuCi0KLUV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluCi1vcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlCi1tb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0bwotcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLgotTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LgotSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUKLWFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKLUFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50Ci11bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQKLWlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMKLUNvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMKLTIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCi0KLVRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzCi1BZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIKLWFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluCi1hbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uCi0KLVNwZWNpYWwgZXhjZXB0aW9uIGZvciBMWk1BIGNvbXByZXNzaW9uIG1vZHVsZQotCi1JZ29yIFBhdmxvdiBhbmQgQW1pciBTemVrZWx5LCB0aGUgYXV0aG9ycyBvZiB0aGUgTFpNQSBjb21wcmVzc2lvbiBtb2R1bGUgZm9yCi1OU0lTLCBleHByZXNzbHkgcGVybWl0IHlvdSB0byBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IGxpbmsgeW91ciBjb2RlIChvciBiaW5kCi1ieSBuYW1lKSB0byB0aGUgZmlsZXMgZnJvbSB0aGUgTFpNQSBjb21wcmVzc2lvbiBtb2R1bGUgZm9yIE5TSVMgd2l0aG91dAotc3ViamVjdGluZyB5b3VyIGxpbmtlZCBjb2RlIHRvIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBsaWNlbnNlIHZlcnNpb24KLTEuMC4gQW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zIHRvIGZpbGVzIGZyb20gdGhlIExaTUEgY29tcHJlc3Npb24gbW9kdWxlCi1mb3IgTlNJUywgaG93ZXZlciwgYXJlIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdmVyc2lvbgotMS4wLiAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvbG9nNGotTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvbG9nNGotTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL2xvZzRqLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvbWFpbC1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC9tYWlsLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNlMjBhLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9tYWlsLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLUNPTU1PTiBERVZFTE9QTUVOVCBBTkQgRElTVFJJQlVUSU9OIExJQ0VOU0UgKENEREwpIFZlcnNpb24gMS4wCi0KLTEuIERlZmluaXRpb25zLgotCi0xLjEuIENvbnRyaWJ1dG9yIG1lYW5zIGVhY2ggaW5kaXZpZHVhbCBvciBlbnRpdHkgdGhhdCBjcmVhdGVzIG9yIGNvbnRyaWJ1dGVzIHRvIHRoZSBjcmVhdGlvbiBvZiBNb2RpZmljYXRpb25zLgotCi0xLjIuIENvbnRyaWJ1dG9yIFZlcnNpb24gbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSwgcHJpb3IgTW9kaWZpY2F0aW9ucyB1c2VkIGJ5IGEgQ29udHJpYnV0b3IgKGlmIGFueSksIGFuZCB0aGUgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KLQotMS4zLiBDb3ZlcmVkIFNvZnR3YXJlIG1lYW5zIChhKSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChiKSBNb2RpZmljYXRpb25zLCBvciAoYykgdGhlIGNvbWJpbmF0aW9uIG9mIGZpbGVzIGNvbnRhaW5pbmcgT3JpZ2luYWwgU29mdHdhcmUgd2l0aCBmaWxlcyBjb250YWluaW5nIE1vZGlmaWNhdGlvbnMsIGluIGVhY2ggY2FzZSBpbmNsdWRpbmcgcG9ydGlvbnMgdGhlcmVvZi4KLQotMS40LiBFeGVjdXRhYmxlIG1lYW5zIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGluIGFueSBmb3JtIG90aGVyIHRoYW4gU291cmNlIENvZGUuCi0KLTEuNS4gSW5pdGlhbCBEZXZlbG9wZXIgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IHRoYXQgZmlyc3QgbWFrZXMgT3JpZ2luYWwgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotMS42LiBMYXJnZXIgV29yayBtZWFucyBhIHdvcmsgd2hpY2ggY29tYmluZXMgQ292ZXJlZCBTb2Z0d2FyZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotMS43LiBMaWNlbnNlIG1lYW5zIHRoaXMgZG9jdW1lbnQuCi0KLTEuOC4gTGljZW5zYWJsZSBtZWFucyBoYXZpbmcgdGhlIHJpZ2h0IHRvIGdyYW50LCB0byB0aGUgbWF4aW11bSBleHRlbnQgcG9zc2libGUsIHdoZXRoZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGluaXRpYWwgZ3JhbnQgb3Igc3Vic2VxdWVudGx5IGFjcXVpcmVkLCBhbnkgYW5kIGFsbCBvZiB0aGUgcmlnaHRzIGNvbnZleWVkIGhlcmVpbi4KLQotMS45LiBNb2RpZmljYXRpb25zIG1lYW5zIHRoZSBTb3VyY2UgQ29kZSBhbmQgRXhlY3V0YWJsZSBmb3JtIG9mIGFueSBvZiB0aGUgZm9sbG93aW5nOgotCi1BLiBBbnkgZmlsZSB0aGF0IHJlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSBvciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIFNvZnR3YXJlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnM7Ci0KLUIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBvciBwcmV2aW91cyBNb2RpZmljYXRpb247IG9yCi0KLUMuIEFueSBuZXcgZmlsZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0xLjEwLiBPcmlnaW5hbCBTb2Z0d2FyZSBtZWFucyB0aGUgU291cmNlIENvZGUgYW5kIEV4ZWN1dGFibGUgZm9ybSBvZiBjb21wdXRlciBzb2Z0d2FyZSBjb2RlIHRoYXQgaXMgb3JpZ2luYWxseSByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLTEuMTEuIFBhdGVudCBDbGFpbXMgbWVhbnMgYW55IHBhdGVudCBjbGFpbShzKSwgbm93IG93bmVkIG9yIGhlcmVhZnRlciBhY3F1aXJlZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuCi0KLTEuMTIuIFNvdXJjZSBDb2RlIG1lYW5zIChhKSB0aGUgY29tbW9uIGZvcm0gb2YgY29tcHV0ZXIgc29mdHdhcmUgY29kZSBpbiB3aGljaCBtb2RpZmljYXRpb25zIGFyZSBtYWRlIGFuZCAoYikgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIG9yIHdpdGggc3VjaCBjb2RlLgotCi0xLjEzLiBZb3UgKG9yIFlvdXIpIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2UuIEZvciBsZWdhbCBlbnRpdGllcywgWW91IGluY2x1ZGVzIGFueSBlbnRpdHkgd2hpY2ggY29udHJvbHMsIGlzIGNvbnRyb2xsZWQgYnksIG9yIGlzIHVuZGVyIGNvbW1vbiBjb250cm9sIHdpdGggWW91LiBGb3IgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCBjb250cm9sIG1lYW5zIChhKe+/vXRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3Igb3RoZXJ3aXNlLCBvciAoYinvv71vd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotMi4gTGljZW5zZSBHcmFudHMuCi0KLTIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LgotQ29uZGl0aW9uZWQgdXBvbiBZb3VyIGNvbXBsaWFuY2Ugd2l0aCBTZWN0aW9uIDMuMSBiZWxvdyBhbmQgc3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaGVyZWJ5IGdyYW50cyBZb3UgYSB3b3JsZC13aWRlLCByb3lhbHR5LWZyZWUsIG5vbi1leGNsdXNpdmUgbGljZW5zZToKLShhKSB1bmRlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIChvdGhlciB0aGFuIHBhdGVudCBvciB0cmFkZW1hcmspIExpY2Vuc2FibGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIsIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSwgd2l0aCBvciB3aXRob3V0IE1vZGlmaWNhdGlvbnMsIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZAotKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nIG9yIHNlbGxpbmcgb2YgT3JpZ2luYWwgU29mdHdhcmUsIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBwcmFjdGljZSwgc2VsbCwgYW5kIG9mZmVyIGZvciBzYWxlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc++/vTIuMShhKSBhbmQgKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgSW5pdGlhbCBEZXZlbG9wZXIgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u77+9Mi4xKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnvv71mb3IgY29kZSB0aGF0IFlvdSBkZWxldGUgZnJvbSB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yICgyKe+/vWZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieTogKGkp77+9dGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIG9yIChpaSnvv710aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIFNvZnR3YXJlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgZGV2aWNlcy4KLQotMi4yLiBDb250cmlidXRvciBHcmFudC4KLUNvbmRpdGlvbmVkIHVwb24gWW91ciBjb21wbGlhbmNlIHdpdGggU2VjdGlvbiAzLjEgYmVsb3cgYW5kIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltcywgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFlvdSBhIHdvcmxkLXdpZGUsIHJveWFsdHktZnJlZSwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlOgotKGEpIHVuZGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgKG90aGVyIHRoYW4gcGF0ZW50IG9yIHRyYWRlbWFyaykgTGljZW5zYWJsZSBieSBDb250cmlidXRvciB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZiksIGVpdGhlciBvbiBhbiB1bm1vZGlmaWVkIGJhc2lzLCB3aXRoIG90aGVyIE1vZGlmaWNhdGlvbnMsIGFzIENvdmVyZWQgU29mdHdhcmUgYW5kL29yIGFzIHBhcnQgb2YgYSBMYXJnZXIgV29yazsgYW5kCi0oYikgdW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgb2YgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgZWl0aGVyIGFsb25lIGFuZC9vciBpbiBjb21iaW5hdGlvbiB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKSwgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaGF2ZSBtYWRlLCBhbmQvb3Igb3RoZXJ3aXNlIGRpc3Bvc2Ugb2Y6ICgxKe+/vU1vZGlmaWNhdGlvbnMgbWFkZSBieSB0aGF0IENvbnRyaWJ1dG9yIChvciBwb3J0aW9ucyB0aGVyZW9mKTsgYW5kICgyKe+/vXRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4KLShjKSBUaGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9uc++/vTIuMihhKSBhbmQgMi4yKGIpIGFyZSBlZmZlY3RpdmUgb24gdGhlIGRhdGUgQ29udHJpYnV0b3IgZmlyc3QgZGlzdHJpYnV0ZXMgb3Igb3RoZXJ3aXNlIG1ha2VzIHRoZSBNb2RpZmljYXRpb25zIGF2YWlsYWJsZSB0byBhIHRoaXJkIHBhcnR5LgotKGQpIE5vdHdpdGhzdGFuZGluZyBTZWN0aW9u77+9Mi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAoMSnvv71mb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAoMinvv71mb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IChpKe+/vXRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiwgb3IgKGlpKe+/vXRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJlIChleGNlcHQgYXMgcGFydCBvZiB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbikgb3Igb3RoZXIgZGV2aWNlczsgb3IgKDMp77+9dW5kZXIgUGF0ZW50IENsYWltcyBpbmZyaW5nZWQgYnkgQ292ZXJlZCBTb2Z0d2FyZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KLQotMy4gRGlzdHJpYnV0aW9uIE9ibGlnYXRpb25zLgotCi0zLjEuIEF2YWlsYWJpbGl0eSBvZiBTb3VyY2UgQ29kZS4KLQotQW55IENvdmVyZWQgU29mdHdhcmUgdGhhdCBZb3UgZGlzdHJpYnV0ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgaW4gRXhlY3V0YWJsZSBmb3JtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGFuZCB0aGF0IFNvdXJjZSBDb2RlIGZvcm0gbXVzdCBiZSBkaXN0cmlidXRlZCBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSBtdXN0IGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSB3aXRoIGV2ZXJ5IGNvcHkgb2YgdGhlIFNvdXJjZSBDb2RlIGZvcm0gb2YgdGhlIENvdmVyZWQgU29mdHdhcmUgWW91IGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgYXZhaWxhYmxlLiBZb3UgbXVzdCBpbmZvcm0gcmVjaXBpZW50cyBvZiBhbnkgc3VjaCBDb3ZlcmVkIFNvZnR3YXJlIGluIEV4ZWN1dGFibGUgZm9ybSBhcyB0byBob3cgdGhleSBjYW4gb2J0YWluIHN1Y2ggQ292ZXJlZCBTb2Z0d2FyZSBpbiBTb3VyY2UgQ29kZSBmb3JtIGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotMy4yLiBNb2RpZmljYXRpb25zLgotCi1UaGUgTW9kaWZpY2F0aW9ucyB0aGF0IFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuIFlvdSByZXByZXNlbnQgdGhhdCBZb3UgYmVsaWV2ZSBZb3VyIE1vZGlmaWNhdGlvbnMgYXJlIFlvdXIgb3JpZ2luYWwgY3JlYXRpb24ocykgYW5kL29yIFlvdSBoYXZlIHN1ZmZpY2llbnQgcmlnaHRzIHRvIGdyYW50IHRoZSByaWdodHMgY29udmV5ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0zLjMuIFJlcXVpcmVkIE5vdGljZXMuCi1Zb3UgbXVzdCBpbmNsdWRlIGEgbm90aWNlIGluIGVhY2ggb2YgWW91ciBNb2RpZmljYXRpb25zIHRoYXQgaWRlbnRpZmllcyBZb3UgYXMgdGhlIENvbnRyaWJ1dG9yIG9mIHRoZSBNb2RpZmljYXRpb24uIFlvdSBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQgb3IgdHJhZGVtYXJrIG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSwgb3IgYW55IG5vdGljZXMgb2YgbGljZW5zaW5nIG9yIGFueSBkZXNjcmlwdGl2ZSB0ZXh0IGdpdmluZyBhdHRyaWJ1dGlvbiB0byBhbnkgQ29udHJpYnV0b3Igb3IgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLgotCi0zLjQuIEFwcGxpY2F0aW9uIG9mIEFkZGl0aW9uYWwgVGVybXMuCi1Zb3UgbWF5IG5vdCBvZmZlciBvciBpbXBvc2UgYW55IHRlcm1zIG9uIGFueSBDb3ZlcmVkIFNvZnR3YXJlIGluIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzIHJpZ2h0cyBoZXJldW5kZXIuIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIFNvZnR3YXJlLiBIb3dldmVyLCB5b3UgbWF5IGRvIHNvIG9ubHkgb24gWW91ciBvd24gYmVoYWxmLCBhbmQgbm90IG9uIGJlaGFsZiBvZiB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYW55IENvbnRyaWJ1dG9yLiBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgc3VjaCB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSBvYmxpZ2F0aW9uIGlzIG9mZmVyZWQgYnkgWW91IGFsb25lLCBhbmQgWW91IGhlcmVieSBhZ3JlZSB0byBpbmRlbW5pZnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBldmVyeSBDb250cmlidXRvciBmb3IgYW55IGxpYWJpbGl0eSBpbmN1cnJlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3Igc3VjaCBDb250cmlidXRvciBhcyBhIHJlc3VsdCBvZiB3YXJyYW50eSwgc3VwcG9ydCwgaW5kZW1uaXR5IG9yIGxpYWJpbGl0eSB0ZXJtcyBZb3Ugb2ZmZXIuCi0KLTMuNS4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuCi1Zb3UgbWF5IGRpc3RyaWJ1dGUgdGhlIEV4ZWN1dGFibGUgZm9ybSBvZiB0aGUgQ292ZXJlZCBTb2Z0d2FyZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIGxpY2Vuc2Ugb2YgWW91ciBjaG9pY2UsIHdoaWNoIG1heSBjb250YWluIHRlcm1zIGRpZmZlcmVudCBmcm9tIHRoaXMgTGljZW5zZSwgcHJvdmlkZWQgdGhhdCBZb3UgYXJlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCB0aGF0IHRoZSBsaWNlbnNlIGZvciB0aGUgRXhlY3V0YWJsZSBmb3JtIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMgcmlnaHRzIGluIHRoZSBTb3VyY2UgQ29kZSBmb3JtIGZyb20gdGhlIHJpZ2h0cyBzZXQgZm9ydGggaW4gdGhpcyBMaWNlbnNlLiBJZiBZb3UgZGlzdHJpYnV0ZSB0aGUgQ292ZXJlZCBTb2Z0d2FyZSBpbiBFeGVjdXRhYmxlIGZvcm0gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSwgWW91IG11c3QgbWFrZSBpdCBhYnNvbHV0ZWx5IGNsZWFyIHRoYXQgYW55IHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgTGljZW5zZSBhcmUgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIG5vdCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLgotCi0zLjYuIExhcmdlciBXb3Jrcy4KLVlvdSBtYXkgY3JlYXRlIGEgTGFyZ2VyIFdvcmsgYnkgY29tYmluaW5nIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIFNvZnR3YXJlLgotCi00LiBWZXJzaW9ucyBvZiB0aGUgTGljZW5zZS4KLQotNC4xLiBOZXcgVmVyc2lvbnMuCi1TdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGlzIHRoZSBpbml0aWFsIGxpY2Vuc2Ugc3Rld2FyZCBhbmQgbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mIHRoaXMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gRWFjaCB2ZXJzaW9uIHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gRXhjZXB0IGFzIHByb3ZpZGVkIGluIFNlY3Rpb24gNC4zLCBubyBvbmUgb3RoZXIgdGhhbiB0aGUgbGljZW5zZSBzdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgTGljZW5zZS4KLQotNC4yLiBFZmZlY3Qgb2YgTmV3IFZlcnNpb25zLgotCi1Zb3UgbWF5IGFsd2F5cyBjb250aW51ZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSB1bmRlciB3aGljaCBZb3Ugb3JpZ2luYWxseSByZWNlaXZlZCB0aGUgQ292ZXJlZCBTb2Z0d2FyZS4gSWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluY2x1ZGVzIGEgbm90aWNlIGluIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSBwcm9oaWJpdGluZyBpdCBmcm9tIGJlaW5nIGRpc3RyaWJ1dGVkIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlLCBZb3UgbXVzdCBkaXN0cmlidXRlIGFuZCBtYWtlIHRoZSBDb3ZlcmVkIFNvZnR3YXJlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UgdW5kZXIgd2hpY2ggWW91IG9yaWdpbmFsbHkgcmVjZWl2ZWQgdGhlIENvdmVyZWQgU29mdHdhcmUuIE90aGVyd2lzZSwgWW91IG1heSBhbHNvIGNob29zZSB0byB1c2UsIGRpc3RyaWJ1dGUgb3Igb3RoZXJ3aXNlIG1ha2UgdGhlIENvdmVyZWQgU29mdHdhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbnkgc3Vic2VxdWVudCB2ZXJzaW9uIG9mIHRoZSBMaWNlbnNlIHB1Ymxpc2hlZCBieSB0aGUgbGljZW5zZSBzdGV3YXJkLgotNC4zLiBNb2RpZmllZCBWZXJzaW9ucy4KLQotV2hlbiBZb3UgYXJlIGFuIEluaXRpYWwgRGV2ZWxvcGVyIGFuZCBZb3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgbGljZW5zZSBmb3IgWW91ciBPcmlnaW5hbCBTb2Z0d2FyZSwgWW91IG1heSBjcmVhdGUgYW5kIHVzZSBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIGlmIFlvdTogKGEp77+9cmVuYW1lIHRoZSBsaWNlbnNlIGFuZCByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG5hbWUgb2YgdGhlIGxpY2Vuc2Ugc3Rld2FyZCAoZXhjZXB0IHRvIG5vdGUgdGhhdCB0aGUgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKTsgYW5kIChiKe+/vW90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlIGxpY2Vuc2UgY29udGFpbnMgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlLgotCi01LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLgotCi1DT1ZFUkVEIFNPRlRXQVJFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiBBUyBJUyBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVEIFNPRlRXQVJFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgU09GVFdBUkUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgU09GVFdBUkUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSIFRISVMgRElTQ0xBSU1FUi4KLQotNi4gVEVSTUlOQVRJT04uCi0KLTYuMS4gVGhpcyBMaWNlbnNlIGFuZCB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZXVuZGVyIHdpbGwgdGVybWluYXRlIGF1dG9tYXRpY2FsbHkgaWYgWW91IGZhaWwgdG8gY29tcGx5IHdpdGggdGVybXMgaGVyZWluIGFuZCBmYWlsIHRvIGN1cmUgc3VjaCBicmVhY2ggd2l0aGluIDMwIGRheXMgb2YgYmVjb21pbmcgYXdhcmUgb2YgdGhlIGJyZWFjaC4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4KLQotNi4yLiBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSAoZXhjbHVkaW5nIGRlY2xhcmF0b3J5IGp1ZGdtZW50IGFjdGlvbnMpIGFnYWluc3QgSW5pdGlhbCBEZXZlbG9wZXIgb3IgYSBDb250cmlidXRvciAodGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIENvbnRyaWJ1dG9yIGFnYWluc3Qgd2hvbSBZb3UgYXNzZXJ0IHN1Y2ggY2xhaW0gaXMgcmVmZXJyZWQgdG8gYXMgUGFydGljaXBhbnQpIGFsbGVnaW5nIHRoYXQgdGhlIFBhcnRpY2lwYW50IFNvZnR3YXJlIChtZWFuaW5nIHRoZSBDb250cmlidXRvciBWZXJzaW9uIHdoZXJlIHRoZSBQYXJ0aWNpcGFudCBpcyBhIENvbnRyaWJ1dG9yIG9yIHRoZSBPcmlnaW5hbCBTb2Z0d2FyZSB3aGVyZSB0aGUgUGFydGljaXBhbnQgaXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyKSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdG8gWW91IGJ5IHN1Y2ggUGFydGljaXBhbnQsIHRoZSBJbml0aWFsIERldmVsb3BlciAoaWYgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGlzIG5vdCB0aGUgUGFydGljaXBhbnQpIGFuZCBhbGwgQ29udHJpYnV0b3JzIHVuZGVyIFNlY3Rpb25z77+9Mi4xIGFuZC9vciAyLjIgb2YgdGhpcyBMaWNlbnNlIHNoYWxsLCB1cG9uIDYwIGRheXMgbm90aWNlIGZyb20gUGFydGljaXBhbnQgdGVybWluYXRlIHByb3NwZWN0aXZlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGV4cGlyYXRpb24gb2Ygc3VjaCA2MCBkYXkgbm90aWNlIHBlcmlvZCwgdW5sZXNzIGlmIHdpdGhpbiBzdWNoIDYwIGRheSBwZXJpb2QgWW91IHdpdGhkcmF3IFlvdXIgY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBQYXJ0aWNpcGFudCBTb2Z0d2FyZSBhZ2FpbnN0IHN1Y2ggUGFydGljaXBhbnQgZWl0aGVyIHVuaWxhdGVyYWxseSBvciBwdXJzdWFudCB0byBhIHdyaXR0ZW4gYWdyZWVtZW50IHdpdGggUGFydGljaXBhbnQuCi0KLTYuMy4gSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25z77+9Ni4xIG9yIDYuMiBhYm92ZSwgYWxsIGVuZCB1c2VyIGxpY2Vuc2VzIHRoYXQgaGF2ZSBiZWVuIHZhbGlkbHkgZ3JhbnRlZCBieSBZb3Ugb3IgYW55IGRpc3RyaWJ1dG9yIGhlcmV1bmRlciBwcmlvciB0byB0ZXJtaW5hdGlvbiAoZXhjbHVkaW5nIGxpY2Vuc2VzIGdyYW50ZWQgdG8gWW91IGJ5IGFueSBkaXN0cmlidXRvcikgc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KLQotNy4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuCi0KLVVOREVSIE5PIENJUkNVTVNUQU5DRVMgQU5EIFVOREVSIE5PIExFR0FMIFRIRU9SWSwgV0hFVEhFUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSksIENPTlRSQUNULCBPUiBPVEhFUldJU0UsIFNIQUxMIFlPVSwgVEhFIElOSVRJQUwgREVWRUxPUEVSLCBBTlkgT1RIRVIgQ09OVFJJQlVUT1IsIE9SIEFOWSBESVNUUklCVVRPUiBPRiBDT1ZFUkVEIFNPRlRXQVJFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1QgUFJPRklUUywgTE9TUyBPRiBHT09EV0lMTCwgV09SSyBTVE9QUEFHRSwgQ09NUFVURVIgRkFJTFVSRSBPUiBNQUxGVU5DVElPTiwgT1IgQU5ZIEFORCBBTEwgT1RIRVIgQ09NTUVSQ0lBTCBEQU1BR0VTIE9SIExPU1NFUywgRVZFTiBJRiBTVUNIIFBBUlRZIFNIQUxMIEhBVkUgQkVFTiBJTkZPUk1FRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiBUSElTIExJTUlUQVRJT04gT0YgTElBQklMSVRZIFNIQUxMIE5PVCBBUFBMWSBUTyBMSUFCSUxJVFkgRk9SIERFQVRIIE9SIFBFUlNPTkFMIElOSlVSWSBSRVNVTFRJTkcgRlJPTSBTVUNIIFBBUlRZUyBORUdMSUdFTkNFIFRPIFRIRSBFWFRFTlQgQVBQTElDQUJMRSBMQVcgUFJPSElCSVRTIFNVQ0ggTElNSVRBVElPTi4gU09NRSBKVVJJU0RJQ1RJT05TIERPIE5PVCBBTExPVyBUSEUgRVhDTFVTSU9OIE9SIExJTUlUQVRJT04gT0YgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFNPIFRISVMgRVhDTFVTSU9OIEFORCBMSU1JVEFUSU9OIE1BWSBOT1QgQVBQTFkgVE8gWU9VLgotCi04LiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLgotCi1UaGUgQ292ZXJlZCBTb2Z0d2FyZSBpcyBhIGNvbW1lcmNpYWwgaXRlbSwgYXMgdGhhdCB0ZXJtIGlzIGRlZmluZWQgaW4gNDjvv71DLkYuUi7vv70yLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiBjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIChhcyB0aGF0IHRlcm0gaXMgZGVmaW5lZCBhdCA0OCBDLkYuUi4g77+9MjUyLjIyNy03MDE0KGEpKDEpKSBhbmQgY29tbWVyY2lhbCBjb21wdXRlciBzb2Z0d2FyZSBkb2N1bWVudGF0aW9uIGFzIHN1Y2ggdGVybXMgYXJlIHVzZWQgaW4gNDjvv71DLkYuUi7vv70xMi4yMTIgKFNlcHQuIDE5OTUpLiBDb25zaXN0ZW50IHdpdGggNDggQy5GLlIuIDEyLjIxMiBhbmQgNDggQy5GLlIuIDIyNy43MjAyLTEgdGhyb3VnaCAyMjcuNzIwMi00IChKdW5lIDE5OTUpLCBhbGwgVS5TLiBHb3Zlcm5tZW50IEVuZCBVc2VycyBhY3F1aXJlIENvdmVyZWQgU29mdHdhcmUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLiBUaGlzIFUuUy4gR292ZXJubWVudCBSaWdodHMgY2xhdXNlIGlzIGluIGxpZXUgb2YsIGFuZCBzdXBlcnNlZGVzLCBhbnkgb3RoZXIgRkFSLCBERkFSLCBvciBvdGhlciBjbGF1c2Ugb3IgcHJvdmlzaW9uIHRoYXQgYWRkcmVzc2VzIEdvdmVybm1lbnQgcmlnaHRzIGluIGNvbXB1dGVyIHNvZnR3YXJlIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotOS4gTUlTQ0VMTEFORU9VUy4KLQotVGhpcyBMaWNlbnNlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXRlIGFncmVlbWVudCBjb25jZXJuaW5nIHN1YmplY3QgbWF0dGVyIGhlcmVvZi4gSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXMgaGVsZCB0byBiZSB1bmVuZm9yY2VhYmxlLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCBvbmx5IHRvIHRoZSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2UgaXQgZW5mb3JjZWFibGUuIFRoaXMgTGljZW5zZSBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3IG9mIHRoZSBqdXJpc2RpY3Rpb24gc3BlY2lmaWVkIGluIGEgbm90aWNlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIE9yaWdpbmFsIFNvZnR3YXJlIChleGNlcHQgdG8gdGhlIGV4dGVudCBhcHBsaWNhYmxlIGxhdywgaWYgYW55LCBwcm92aWRlcyBvdGhlcndpc2UpLCBleGNsdWRpbmcgc3VjaCBqdXJpc2RpY3Rpb25zIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zLiBBbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBjb3VydHMgbG9jYXRlZCBpbiB0aGUganVyaXNkaWN0aW9uIGFuZCB2ZW51ZSBzcGVjaWZpZWQgaW4gYSBub3RpY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgT3JpZ2luYWwgU29mdHdhcmUsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBjb3VydCBjb3N0cyBhbmQgcmVhc29uYWJsZSBhdHRvcm5leXMgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLiBZb3UgYWdyZWUgdGhhdCBZb3UgYWxvbmUgYXJlIHJlc3BvbnNpYmxlIGZvciBjb21wbGlhbmNlIHdpdGggdGhlIFVuaXRlZCBTdGF0ZXMgZXhwb3J0IGFkbWluaXN0cmF0aW9uIHJlZ3VsYXRpb25zIChhbmQgdGhlIGV4cG9ydCBjb250cm9sIGxhd3MgYW5kIHJlZ3VsYXRpb24gb2YgYW55IG90aGVyIGNvdW50cmllcykgd2hlbiBZb3UgdXNlLCBkaXN0cmlidXRlIG9yIG90aGVyd2lzZSBtYWtlIGF2YWlsYWJsZSBhbnkgQ292ZXJlZCBTb2Z0d2FyZS4KLQotMTAuIFJFU1BPTlNJQklMSVRZIEZPUiBDTEFJTVMuCi0KLUFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KLQotTk9USUNFIFBVUlNVQU5UIFRPIFNFQ1RJT04gOSBPRiBUSEUgQ09NTU9OIERFVkVMT1BNRU5UIEFORCBESVNUUklCVVRJT04gTElDRU5TRSAoQ0RETCkKLVRoZSBHbGFzc0Zpc2ggY29kZSByZWxlYXNlZCB1bmRlciB0aGUgQ0RETCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAoZXhjbHVkaW5nIGNvbmZsaWN0LW9mLWxhdyBwcm92aXNpb25zKS4gQW55IGxpdGlnYXRpb24gcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIGp1cmlzZGljdGlvbiBvZiB0aGUgRmVkZXJhbCBDb3VydHMgb2YgdGhlIE5vcnRoZXJuIERpc3RyaWN0IG9mIENhbGlmb3JuaWEgYW5kIHRoZSBzdGF0ZSBjb3VydHMgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEsIHdpdGggdmVudWUgbHlpbmcgaW4gU2FudGEgQ2xhcmEgQ291bnR5LCBDYWxpZm9ybmlhLiAKLQotCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC9uZWV0aGktTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvbmVldGhpLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JjODhhLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC9uZWV0aGktTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC90cmliZXMtTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvdHJpYmVzLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVlYjE0Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC90cmliZXMtTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3MDcgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi0KLUFQQUNIRSBUT01DQVQgU1VCQ09NUE9ORU5UUzogCi0KLUFwYWNoZSBUb21jYXQgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoIHNlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzCi1hbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4gCi0KLQotRm9yIHRoZSBqYXNwZXItamR0LmphciBjb21wb25lbnQ6Ci0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMAotCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMKLUxJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTQotQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KLQotMS4gREVGSU5JVElPTlMKLQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6Ci0KLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCi0KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKLQotaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCi0KLWlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07Ci0KLXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvCi10aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAotZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KLQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgotCi0iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUKLW5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuCi1jb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgotCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgotCi0iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LAotaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCi0KLTIuIEdSQU5UIE9GIFJJR0hUUwotCi1hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bwotcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sCi1kaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaAotZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uCi0KLWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkCi1QYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCi1Db250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4KLVRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQotUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKLWFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKLUxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucwotd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgotCi1jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8KLWl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueQotQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8KLVJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZQotcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQotcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LgotRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZQotYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KLQotZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LgotCi0zLiBSRVFVSVJFTUVOVFMKLQotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMKLW93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKLQotYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAotCi1iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6Ci0KLWkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kCi1ub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7Ci0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvcgotZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwKLWRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOwotCi1paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5Ci10aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQKLQotaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLAotYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KLQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgotCi1hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCi0KLUNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUKLVByb2dyYW0uCi0KLUVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYKLWFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlCi1vcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCi0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCi0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGgKLXJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcwotaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8KLWluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lcgotd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZgotYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaAotQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeQotZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcwotYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbAotYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlCi1leHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5Ci1wYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCi0KLUZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCi1yZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlcgotQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydAotcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCi0KLTUuIE5PIFdBUlJBTlRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SCi1JTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAotTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoCi1SZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMKLW9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAotcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCi0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZCi1DT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QKLVBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi1TVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCi1HUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLTcuIEdFTkVSQUwKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZQotbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZQotdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAotcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoCi1wcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi1jcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZgotKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkKLWluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyCi1TZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KLWNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcwotbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZgotc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwKLVJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcwotcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLWFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kCi1zdXJ2aXZlLgotCi1FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbgotb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZQotbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8KLXB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4KLU5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4KLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24KLW1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlCi1zZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEKLWRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMKLWJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMKLXJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwKLUNvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpCi11bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKLWFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YKLWFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAotZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlcgotdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgotCi1UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZQotaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcwotQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyCi1hZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbgotYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgotCi0KLUZvciB0aGUgV2luZG93cyBJbnN0YWxsZXIgY29tcG9uZW50OgotCi0gICAgKiBBbGwgTlNJUyBzb3VyY2UgY29kZSwgcGx1Zy1pbnMsIGRvY3VtZW50YXRpb24sIGV4YW1wbGVzLCBoZWFkZXIgZmlsZXMgYW5kCi0gICAgICAgZ3JhcGhpY3MsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbW9kdWxlcyBhbmQgd2hlcmUKLSAgICAgICBvdGhlcndpc2Ugbm90ZWQsIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgemxpYi9saWJwbmcgbGljZW5zZS4KLSAgICAqIFRoZSB6bGliIGNvbXByZXNzaW9uIG1vZHVsZSBmb3IgTlNJUyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgemxpYi9saWJwbmcKLSAgICAgICBsaWNlbnNlLgotICAgICogVGhlIGJ6aXAyIGNvbXByZXNzaW9uIG1vZHVsZSBmb3IgTlNJUyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgYnppcDIgbGljZW5zZS4KLSAgICAqIFRoZSBsem1hIGNvbXByZXNzaW9uIG1vZHVsZSBmb3IgTlNJUyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ29tbW9uIFB1YmxpYwotICAgICAgIExpY2Vuc2UgdmVyc2lvbiAxLjAuIAotCi16bGliL2xpYnBuZyBsaWNlbnNlCi0KLVRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiBJbgotbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YKLXRoaXMgc29mdHdhcmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLCBpbmNsdWRpbmcKLWNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIHN1YmplY3QgdG8KLXRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbQotICAgICAgIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEKLSAgICAgICBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4gCi0KLWJ6aXAyIGxpY2Vuc2UKLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKLWFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQotICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbQotICAgICAgIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEKLSAgICAgICBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgIDMuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAgNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UCi1TSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi1FWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UCi1PRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLUlOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi1DT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi1JTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKLU9GIFNVQ0ggREFNQUdFLgotCi1KdWxpYW4gU2V3YXJkLCBDYW1icmlkZ2UsIFVLLgotCi1qc2V3YXJkQGFjbS5vcmcKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDEuMAotCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQwotTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNCi1DT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgotCi0xLiBERUZJTklUSU9OUwotCi0iQ29udHJpYnV0aW9uIiBtZWFuczoKLQotYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50Ci1Db250cmlidXRvcjoKLQotaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCi0KLWlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07Ci0KLXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUKLWRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQotYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvCi10aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAotZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KLQotIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgotCi0iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlCi1uZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbgotY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KLQotIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KLQotIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwKLWluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgotCi0yLiBHUkFOVCBPRiBSSUdIVFMKLQotYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLXJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLAotZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2gKLWRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLgotCi1iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZAotUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQotQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uCi1UaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKLVByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCi1hZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCi1MaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMKLXdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KLQotYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvCi1pdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkKLUNvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvCi1SZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKLXJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4KLUZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UKLWJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCi0KLWQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4KLQotMy4gUkVRVUlSRU1FTlRTCi0KLUEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzCi1vd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6Ci0KLWEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKLQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgotCi1pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAotbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOwotCi1paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IKLWRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsCi1kYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKLQotaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieQotdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCi0KLWl2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwKLWFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCi0KLVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKLQotYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCi0KLWIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgotCi1Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlCi1Qcm9ncmFtLgotCi1FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmCi1hbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZQotb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgotCi00LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgotCi1Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoCi1yZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMKLWludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvCi1pbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKLXdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYKLWEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2gKLUNvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkKLWV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMKLWFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwKLWFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZQotZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8KLWNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueQotcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbgotYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgotCi1Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0Ci1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcwotcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaAotQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIKLUNvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQKLXJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgotCi01LiBOTyBXQVJSQU5UWQotCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgotSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKLU5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaAotUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZgotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YKLXByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAotcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCi0KLTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCi0KLUVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZCi1DT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLVNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QKLVBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi1TVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTCi1HUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLTcuIEdFTkVSQUwKLQotSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZQotbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZQotdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAotcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoCi1wcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgotCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvCi1hIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYQotbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQKLXVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluCi1hZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5Ci0oaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbQotaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCi1pbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlcgotU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLUFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvCi1jb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMKLW5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2YKLXN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsCi1SZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMKLXJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1hbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZAotc3Vydml2ZS4KLQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4KLW9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUKLW1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvCi1wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuCi1ObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuCi1JQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZQotYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQotQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZwotQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQKLXVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudAotaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cwotQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucwotMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KLQotVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUKLWludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMKLUFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhcgotYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4KLWFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KLQotU3BlY2lhbCBleGNlcHRpb24gZm9yIExaTUEgY29tcHJlc3Npb24gbW9kdWxlCi0KLUlnb3IgUGF2bG92IGFuZCBBbWlyIFN6ZWtlbHksIHRoZSBhdXRob3JzIG9mIHRoZSBMWk1BIGNvbXByZXNzaW9uIG1vZHVsZSBmb3IKLU5TSVMsIGV4cHJlc3NseSBwZXJtaXQgeW91IHRvIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgbGluayB5b3VyIGNvZGUgKG9yIGJpbmQKLWJ5IG5hbWUpIHRvIHRoZSBmaWxlcyBmcm9tIHRoZSBMWk1BIGNvbXByZXNzaW9uIG1vZHVsZSBmb3IgTlNJUyB3aXRob3V0Ci1zdWJqZWN0aW5nIHlvdXIgbGlua2VkIGNvZGUgdG8gdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIGxpY2Vuc2UgdmVyc2lvbgotMS4wLiBBbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMgdG8gZmlsZXMgZnJvbSB0aGUgTFpNQSBjb21wcmVzc2lvbiBtb2R1bGUKLWZvciBOU0lTLCBob3dldmVyLCBhcmUgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0xLjAuIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC93b2Rlbi1hcGktTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvd29kZW4tYXBpLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2JjODhhLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC93b2Rlbi1hcGktTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC93b2Rlbi1pbXBsLWRvbS1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC93b2Rlbi1pbXBsLWRvbS1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiYzg4YS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwvd29kZW4taW1wbC1kb20tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC93c2RsNGotTElDRU5TRS50eHQgYi8xXzUvbGVnYWwvd3NkbDRqLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmM0ZDFmLi4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC93c2RsNGotTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMCANCi0NCi0NCi1USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4gDQotDQotDQotMS4gREVGSU5JVElPTlMgDQotDQotIkNvbnRyaWJ1dGlvbiIgbWVhbnM6IA0KLQ0KLWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQNCi1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6DQotaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kDQotaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsNCi13aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uIA0KLQ0KLSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4gDQotDQotDQotIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiANCi0NCi0NCi0iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LiANCi0NCi0NCi0iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4gDQotDQotDQotMi4gR1JBTlQgT0YgUklHSFRTIA0KLQ0KLWEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLg0KLWIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gDQotYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4NCi1kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiANCi0zLiBSRVFVSVJFTUVOVFMgDQotDQotQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OiANCi0NCi1hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kDQotYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50Og0KLWkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IA0KLWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgDQotaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQNCi1pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4gDQotV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOiANCi0NCi1hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgDQotYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIA0KLQ0KLUNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gDQotDQotDQotRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIA0KLQ0KLQ0KLTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OIA0KLQ0KLUNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuIA0KLQ0KLQ0KLUZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLiANCi0NCi0NCi01LiBOTyBXQVJSQU5UWSANCi0NCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiANCi0NCi0NCi02LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWSANCi0NCi1FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiANCi0NCi0NCi03LiBHRU5FUkFMIA0KLQ0KLUlmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLiANCi0NCi0NCi1JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiANCi0NCi0NCi1BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gDQotDQotDQotRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gDQotDQotDQotVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLiANCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwvd3N0eC1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC93c3R4LUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC93c3R4LUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9sZWdhbC94YWxhbi1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC94YWxhbi1MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVmOGMyOS4uMDAwMDAwMAotLS0gYS8xXzUvbGVnYWwveGFsYW4tTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0DQotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLw0KLQ0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTg0KLQ0KLSAgIDEuIERlZmluaXRpb25zLg0KLQ0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sDQotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuDQotDQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24NCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLA0KLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQ0KLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yDQotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlDQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4NCi0NCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4NCi0NCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywNCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uDQotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4NCi0NCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbA0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQNCi0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sDQotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLg0KLQ0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yDQotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQ0KLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaw0KLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuDQotDQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdA0KLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUNCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zDQotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMNCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4NCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsDQotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4NCi0NCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZw0KLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMNCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkNCi0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyDQotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mDQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiDQotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudA0KLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvDQotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywNCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQ0KLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dA0KLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlDQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iDQotDQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQNCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4NCi0NCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwNCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUNCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLg0KLQ0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLA0KLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLA0KLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlDQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXINCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpDQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UNCi0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQ0KLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsNCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdA0KLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMNCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUNCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuDQotDQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUNCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQNCi0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQ0KLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KLQ0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yDQotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kDQotDQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcw0KLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQNCi0NCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MNCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZA0KLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLA0KLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mDQotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQNCi0NCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMNCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdA0KLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQNCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90DQotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQ0KLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZA0KLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yDQotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLA0KLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kDQotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cw0KLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kDQotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uDQotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlDQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZA0KLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQNCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZA0KLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMNCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yDQotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsDQotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoDQotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4NCi0NCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsDQotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrDQotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4NCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5DQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQNCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuDQotDQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQ0KLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwNCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUNCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4NCi0NCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3INCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoDQotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yDQotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMNCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBDQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlDQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55DQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LA0KLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLA0KLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5DQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUNCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsDQotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhDQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQ0KLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwNCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbA0KLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3INCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuDQotDQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZw0KLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsDQotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwNCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcw0KLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5DQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYNCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksDQotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5DQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbg0KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5Lg0KLQ0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUw0KLQ0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4NCi0NCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZw0KLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSINCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQ0KLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhDQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQ0KLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcg0KLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4NCi0NCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0NCi0NCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbGVnYWwveGVyY2VzSW1wbC1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC94ZXJjZXNJbXBsLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC94ZXJjZXNJbXBsLUxJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL3htbC1yZXNvbHZlci1MSUNFTlNFLnR4dCBiLzFfNS9sZWdhbC94bWwtcmVzb2x2ZXItTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YmM4OGEuLjAwMDAwMDAKLS0tIGEvMV81L2xlZ2FsL3htbC1yZXNvbHZlci1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvMV81L2xlZ2FsL3htbGJlYW5zLUxJQ0VOU0UudHh0IGIvMV81L2xlZ2FsL3htbGJlYW5zLUxJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY4YzI5Li4wMDAwMDAwCi0tLSBhLzFfNS9sZWdhbC94bWxiZWFucy1MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQNCi0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvDQotDQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9ODQotDQotICAgMS4gRGVmaW5pdGlvbnMuDQotDQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwNCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4NCi0NCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQ0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsDQotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbg0KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sDQotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlDQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3INCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUNCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5Lg0KLQ0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkNCi0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLg0KLQ0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLA0KLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24NCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLg0KLQ0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsDQotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dA0KLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwNCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuDQotDQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3INCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhDQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrDQotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4NCi0NCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0DQotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQ0KLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMNCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3Nlcw0KLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbg0KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwNCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLg0KLQ0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nDQotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucw0KLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQ0KLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXINCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YNCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCINCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50DQotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8NCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLA0KLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlDQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0DQotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UNCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiINCi0NCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZA0KLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLg0KLQ0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwNCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQ0KLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLA0KLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQ0KLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uDQotDQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsDQotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssDQotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUNCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcg0KLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykNCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQ0KLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhDQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaw0KLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0DQotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcw0KLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQ0KLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4NCi0NCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQ0KLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dA0KLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91DQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQotDQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3INCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQNCi0NCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzDQotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZA0KLQ0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3Jrcw0KLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kDQotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssDQotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YNCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZA0KLQ0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cw0KLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0DQotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZA0KLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QNCi0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lDQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkDQotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3INCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsDQotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQNCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzDQotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQNCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24NCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUNCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkDQotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZA0KLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuDQotDQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kDQotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucw0KLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3INCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwNCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgNCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLg0KLQ0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwNCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsNCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZg0KLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLg0KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkNCi0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZA0KLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4NCi0NCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlDQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLA0KLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQ0KLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLg0KLQ0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcg0KLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gNCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3INCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucw0KLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEENCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUNCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkNCi0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuDQotDQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksDQotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsDQotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkNCi0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQ0KLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwNCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGENCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlDQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLA0KLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsDQotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcg0KLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4NCi0NCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nDQotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwNCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LA0KLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzDQotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkNCi0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZg0KLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwNCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkNCi0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uDQotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuDQotDQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TDQotDQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLg0KLQ0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nDQotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIg0KLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlDQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGENCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlDQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyDQotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLg0KLQ0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQ0KLQ0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTgxYTVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEFEQiBDb2RlZ2VuPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BREIgY29kZSBnZW5lcmF0aW9uIHN1cHBvcnQgZm9yIEF4aXMyPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbHVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbjwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypVdGlsKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlBoYXNlUmVzb2x2aW5nVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlVuaW9uUU5hbWVUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnByb2Nlc3MtcmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0c3RhbXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0IHByb3BlcnR5PSJidWlsZC50aW1lIiBwYXR0ZXJuPSJNTU0gZGQsIHl5eXkgKGhoOm1tOnNzIHopIiBsb2NhbGU9ImVuIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RzdGFtcD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9IiR7YmFzZWRpcn0vdGFyZ2V0L2NsYXNzZXMvIiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0ib24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3NyYy8iIGluY2x1ZGVzPSIqKi8qLnhzbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJzZXQgYmVnaW50b2tlbj0iIyIgZW5kdG9rZW49IiMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImF4aXNWZXJzaW9uIiB2YWx1ZT0iJHtwcm9qZWN0LnZlcnNpb259IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49InRvZGF5IiB2YWx1ZT0iIEJ1aWx0IG9uIDogJHtidWlsZC50aW1lfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3MgdW5sZXNzPSJtYXZlbi50ZXN0LnNraXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uanVuaXQuanZtYXJncyIgdmFsdWU9IiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5jb21waWxlLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZWQuY2xhc3Nlcy5kaXIiIHZhbHVlPSJ0YXJnZXQvY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGVyZXMgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLnNvdXJjZS5kaXIiIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy94c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0c3VpdGUuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5vdXRwdXQuYmFzZS5kaXIiIHZhbHVlPSJ0YXJnZXQvc2NoZW1hIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9zcmMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9InN1Yi1idWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9Ii4iIHRhcmdldD0ibWFpbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFkZC10ZXN0LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXRlc3Qtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vdGFyZ2V0L3NjaGVtYS9zcmM8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9CZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9CZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E4Y2I3Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgaG9sZGVyIHRvIHBhc3Mgb24gdGhlIG1ldGEgaW5mb3JtYXRpb24gdG8gdGhlIGJlYW4gd3JpdGVyLgotICogVGhpcyBtZXRhIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlIHdyaXRlciB0byB3cml0ZSB0aGUgZGF0YWJpbmRpbmcgY29udmVyc2lvbiBjb2RlLgotICogTm90ZSAtIE1ldGFpbmZob2xkZXJzIGFyZSBub3QgbWVhbnQgdG8gYmUgcmV1c2VkISEhLiBUaGV5IGFyZSBwZXItY2xhc3MgYmFzaXMgYW5kIGFyZSBzdHJpY3RseQotICogbm90IHRocmVhZCBzYWZlISEhIQotICovCi1wdWJsaWMgY2xhc3MgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHsKLQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gb3JkZXJlZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGFub255bW91cyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIGNob2ljZSA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBib29sZWFuIHNpbXBsZSA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3Rpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBleHRlbnNpb25DbGFzc05hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyByZXN0cmljdGlvbkNsYXNzTmFtZSA9ICIiOwotICAgIHByaXZhdGUgUU5hbWUgZXh0ZW5zaW9uQmFzZVR5cGUgPSBudWxsOwotICAgIHByaXZhdGUgUU5hbWUgcmVzdHJpY3Rpb25CYXNlVHlwZSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9TY2hlbWFRTmFtZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9KYXZhQ2xhc3NNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgc3BlY2lhbFR5cGVGbGFnTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgTWFwIHFOYW1lTWF4T2NjdXJzQ291bnRNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgcU5hbWVNaW5PY2N1cnNDb3VudE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgcHJvdGVjdGVkIE1hcCBxTmFtZU9yZGVyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgb3duUW5hbWUgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgb3duQ2xhc3NOYW1lID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBsb25nIGxlbmd0aEZhY2V0ID0gLTE7Ci0gICAgcHJvdGVjdGVkIGxvbmcgbWF4TGVuZ3RoRmFjZXQgPSAtMTsKLSAgICBwcm90ZWN0ZWQgbG9uZyBtaW5MZW5ndGhGYWNldCA9IC0xOwotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZW51bUZhY2V0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0dGVybkZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heEV4Y2x1c2l2ZUZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1pbkV4Y2x1c2l2ZUZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1heEluY2x1c2l2ZUZhY2V0ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1pbkluY2x1c2l2ZUZhY2V0ID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBNYXAgbWVtYmVyVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgeG1sTmFtZUphdmFOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBtZW1iZXJUeXBlc0tleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIGVsZW1lbnRRTmFtZVRvRGVmdWxhdFZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBRTmFtZSBpdGVtVHlwZVFOYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaXRlbVR5cGVDbGFzc05hbWU7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVbmlvbjsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3Q7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRpY2xlQ2xhc3M7Ci0gICAgLy8ga2VlcCB3aGV0aGVyIHRoaXMgY2xhc3MgaGFzIGEgcGFydGljYWwgY2xhc3MgdHlwZSB2YXJpYWJsZQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1BhcnRpY2xlVHlwZTsKLQotICAgIHByb3RlY3RlZCBMaXN0IG5pbGxhYmxlUU5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLy90aGUgcGFyZW50IG1ldGFpbmZvIGhvbGRlciwgdXNlZnVsIGluIGhhbmRsaW5nIGV4dGVuc2lvbnMgYW5kCi0gICAgLy9yZXN0cmljdGlvbnMKLSAgICBwcm90ZWN0ZWQgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHBhcmVudCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nob2ljZSgpIHsKLSAgICAgICAgcmV0dXJuIGNob2ljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaG9pY2UoYm9vbGVhbiBjaG9pY2UpIHsKLSAgICAgICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGUoKSB7Ci0gICAgICAgIHJldHVybiBzaW1wbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2ltcGxlKGJvb2xlYW4gc2ltcGxlKSB7Ci0gICAgICAgIHRoaXMuc2ltcGxlID0gc2ltcGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3duQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gb3duQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE93bkNsYXNzTmFtZShTdHJpbmcgb3duQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMub3duQ2xhc3NOYW1lID0gb3duQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRPd25RbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG93blFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE93blFuYW1lKFFOYW1lIG93blFuYW1lKSB7Ci0gICAgICAgIHRoaXMub3duUW5hbWUgPSBvd25RbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhbm9ueW1vdXMgc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB7Ci0gICAgICAgIHJldHVybiBhbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYW5vbnltb3VzIGZsYWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYW5vbnltb3VzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzKGJvb2xlYW4gYW5vbnltb3VzKSB7Ci0gICAgICAgIHRoaXMuYW5vbnltb3VzID0gYW5vbnltb3VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGV4dGVuc2lvbnMgYmFzZSBjbGFzcyBuYW1lLiBWYWxpZCBvbmx5IHdoZW4gdGhlIGlzRXh0ZW5zaW9uCi0gICAgICogcmV0dXJucyB0cnVlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb25zIGJhc2UgY2xhc3MgbmFtZS4gVmFsaWQgb25seSB3aGVuIHRoZSBpc0V4dGVuc2lvbgotICAgICAqIHJldHVybnMgdHJ1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpb25DbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25DbGFzc05hbWUoU3RyaW5nIGV4dGVuc2lvbkNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmV4dGVuc2lvbkNsYXNzTmFtZSA9IGV4dGVuc2lvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBleHRlbnNpb24gc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb247Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb24gc3RhdHVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihib29sZWFuIGV4dGVuc2lvbikgewotICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3RyaWN0aW9uQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb25DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcmVzdHJpY3Rpb24gYmFzZSBjbGFzcyBuYW1lLiBWYWxpZCBvbmx5IHdoZW4gdGhlIGlzUmVzdHJpY3Rpb24KLSAgICAgKiByZXR1cm5zIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdHJpY3Rpb25DbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN0cmljdGlvbkNsYXNzTmFtZShTdHJpbmcgcmVzdHJpY3Rpb25DbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5yZXN0cmljdGlvbkNsYXNzTmFtZSA9IHJlc3RyaWN0aW9uQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJlc3RyaWN0aW9uIHN0YXR1cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzdHJpY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiByZXN0cmljdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZXN0cmljdGlvbiBzdGF0dXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdHJpY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN0cmljdGlvbihib29sZWFuIHJlc3RyaWN0aW9uKSB7Ci0gICAgICAgIHRoaXMucmVzdHJpY3Rpb24gPSByZXN0cmljdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBleHRlbnNpb24gYmFzZXR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uQmFzZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25CYXNlVHlwZShRTmFtZSBleHRlbnNpb25CYXNlVHlwZSkgewotICAgICAgICB0aGlzLmV4dGVuc2lvbkJhc2VUeXBlID0gZXh0ZW5zaW9uQmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGl0IGlzIGEgZXh0ZW5zaW9uIGJhc2UgdHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRlbnNpb25CYXNlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uQmFzZVR5cGUoUU5hbWUgZXh0ZW5zaW9uQmFzZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuICh0aGlzLmV4dGVuc2lvbkJhc2VUeXBlID09IGV4dGVuc2lvbkJhc2VUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZXN0cmljdGlvbiBiYXNldHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN0cmljdGlvbkJhc2VUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzdHJpY3Rpb25CYXNlVHlwZShRTmFtZSByZXN0cmljdGlvbkJhc2VUeXBlKSB7Ci0gICAgICAgIHRoaXMucmVzdHJpY3Rpb25CYXNlVHlwZSA9IHJlc3RyaWN0aW9uQmFzZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGl0IGlzIGEgcmVzdHJpY3Rpb24gYmFzZSB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3RyaWN0aW9uQmFzZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0aW9uQmFzZVR5cGUoUU5hbWUgcmVzdHJpY3Rpb25CYXNlVHlwZSkgewotICAgICAgICBRTmFtZSBiYXNlVHlwZVFOYW1lID0gKFFOYW1lKSB0aGlzLmVsZW1lbnRUb1NjaGVtYVFOYW1lTWFwLmdldChyZXN0cmljdGlvbkJhc2VUeXBlKTsKLSAgICAgICAgcmV0dXJuICh0aGlzLnJlc3RyaWN0aW9uQmFzZVR5cGUgIT0gbnVsbCkgJiYgKGJhc2VUeXBlUU5hbWUgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICB0aGlzLnJlc3RyaWN0aW9uQmFzZVR5cGUuZXF1YWxzKGJhc2VUeXBlUU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9yZGVyZWQgc3RhdHVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcmRlcmVkKCkgewotICAgICAgICByZXR1cm4gb3JkZXJlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvcmRlcmVkIGZsYWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9yZGVyZWQoYm9vbGVhbiBvcmRlcmVkKSB7Ci0gICAgICAgIHRoaXMub3JkZXJlZCA9IG9yZGVyZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbWFwcGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBzY2hlbWFOYW1lCi0gICAgICogQHBhcmFtIGphdmFDbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck1hcHBpbmcoUU5hbWUgcU5hbWUsIFFOYW1lIHNjaGVtYU5hbWUsIFN0cmluZyBqYXZhQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJlZ2lzdGVyTWFwcGluZyhxTmFtZSwgc2NoZW1hTmFtZSwgamF2YUNsYXNzTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBRbmFtZSBhcyBuaWxsYWJsZQotICAgICAqIFRoZSBxTmFtZSBiZXR0ZXIgYmUgb2YgYW4gZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHNjaGVtYU5hbWUKLSAgICAgKiBAcGFyYW0gamF2YUNsYXNzTmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTmlsbGFibGVRTmFtZShRTmFtZSBlbHRRTmFtZSkgewotICAgICAgICBuaWxsYWJsZVFOYW1lTGlzdC5hZGQoZWx0UU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBhIFFOYW1lIGlzIG5pbGxhYmxlIG9yIG5vdAotICAgICAqCi0gICAgICogQHBhcmFtIGVsdFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZShRTmFtZSBlbHRRTmFtZSkgewotICAgICAgICByZXR1cm4gbmlsbGFibGVRTmFtZUxpc3QuY29udGFpbnMoZWx0UU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1hcHBpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gc2NoZW1hTmFtZQotICAgICAqIEBwYXJhbSBqYXZhQ2xhc3NOYW1lCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck1hcHBpbmcoUU5hbWUgcU5hbWUsIFFOYW1lIHNjaGVtYU5hbWUsIFN0cmluZyBqYXZhQ2xhc3NOYW1lLCBpbnQgdHlwZSkgewotICAgICAgICB0aGlzLmVsZW1lbnRUb0phdmFDbGFzc01hcC5wdXQocU5hbWUsIGphdmFDbGFzc05hbWUpOwotICAgICAgICB0aGlzLmVsZW1lbnRUb1NjaGVtYVFOYW1lTWFwLnB1dChxTmFtZSwgc2NoZW1hTmFtZSk7Ci0gICAgICAgIGFkZHRTdGF0dXMocU5hbWUsIHR5cGUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2QgcmVnaXN0ZXJzIHRoZSBkZWZ1bHQgdmFsdWUgYWdhaXN0IHRoZSBlbGVtZW50IHFuYW1lLgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdFZhbHVlKFFOYW1lIHFuYW1lLFN0cmluZyB2YWx1ZSl7Ci0gICAgICAgIHRoaXMuZWxlbWVudFFOYW1lVG9EZWZ1bGF0VmFsdWVNYXAucHV0KHFuYW1lLHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEByZXR1cm4gaXMgYSBkZWZhdWx0IHZhbHVlIGF2YWlsYWJsZSBmb3IgdGhpcyBxbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFZhbHVlQXZhaWxhYmxlKFFOYW1lIHFuYW1lKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFFOYW1lVG9EZWZ1bGF0VmFsdWVNYXAuY29udGFpbnNLZXkocW5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHFuYW1lCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHJldHVybiBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHFuYW1lCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZUZvclFOYW1lKFFOYW1lIHFuYW1lKXsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuZWxlbWVudFFOYW1lVG9EZWZ1bGF0VmFsdWVNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY2hlbWEgbmFtZSBmb3IgdGhlIGdpdmVuIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsdFFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRTY2hlbWFRTmFtZUZvclFOYW1lKFFOYW1lIGVsdFFOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoUU5hbWUpIHRoaXMuZWxlbWVudFRvU2NoZW1hUU5hbWVNYXAuZ2V0KGVsdFFOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgUU5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWx0UU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yUU5hbWUoUU5hbWUgZWx0UU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuZWxlbWVudFRvSmF2YUNsYXNzTWFwLmdldChlbHRRTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIGEgZ2l2ZW4gUU5hbWUgaXMgYW4gYXR0cmlidXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBdHRyaWJ1dGVTdGF0dXNGb3JRTmFtZShRTmFtZSBxTmFtZSkgewotCi0gICAgICAgIEludGVnZXIgc3RhdGUgPSAoSW50ZWdlcikgc3BlY2lhbFR5cGVGbGFnTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBzdGF0ZSAhPSBudWxsICYmIGdldFN0YXR1cyhzdGF0ZS5pbnRWYWx1ZSgpLCBTY2hlbWFDb25zdGFudHMuQVRUUklCVVRFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNoZWNrcyB0aGUgZWxlbWVudCBjb3JyZXNwb25kcyB0byB0aGUgcU5hbWUgdHlwZSBpcyB4c2Q6YW55VHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBpcyBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHFOYW1lIGhhcyB4c2Q6YW55VHlwZQotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNEZWZhdWx0ID0gZmFsc2U7Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVRTmFtZSA9IChRTmFtZSkgdGhpcy5lbGVtZW50VG9TY2hlbWFRTmFtZU1hcC5nZXQocU5hbWUpOwotICAgICAgICBpZiAoc2NoZW1hVHlwZVFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzRGVmYXVsdCA9IHNjaGVtYVR5cGVRTmFtZS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlhTRF9BTllUWVBFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNEZWZhdWx0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIGEgZ2l2ZW4gUU5hbWUgcmVwcmVzZW50cyBhIGFueVR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEFueVN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgc3RhdGUgPSAoSW50ZWdlcikgc3BlY2lhbFR5cGVGbGFnTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBzdGF0ZSAhPSBudWxsICYmIGdldFN0YXR1cyhzdGF0ZS5pbnRWYWx1ZSgpLCBTY2hlbWFDb25zdGFudHMuQU5ZX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBhIGdpdmVuIFFOYW1lIHJlZmVycyB0byBhbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEFycmF5U3RhdHVzRm9yUU5hbWUoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgSW50ZWdlciBzdGF0ZSA9IChJbnRlZ2VyKSBzcGVjaWFsVHlwZUZsYWdNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlICE9IG51bGwgJiYgZ2V0U3RhdHVzKHN0YXRlLmludFZhbHVlKCksCi0gICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBhIGdpdmVuIFFOYW1lIHJlZmVycyB0byBiaW5hcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCaW5hcnlTdGF0dXNGb3JRTmFtZShRTmFtZSBxTmFtZSkgewotICAgICAgICBJbnRlZ2VyIHN0YXRlID0gKEludGVnZXIpIHNwZWNpYWxUeXBlRmxhZ01hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCAmJiBnZXRTdGF0dXMoc3RhdGUuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuQklOQVJZX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBpcyB0aGlzIGEgaW5uZXIgY2hvaWNlCi0gICAgICovCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbm5lckNob2ljZVN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKXsKLSAgICAgICAgSW50ZWdlciBzdGF0ZSA9IChJbnRlZ2VyKSBzcGVjaWFsVHlwZUZsYWdNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIHN0YXRlICE9IG51bGwgJiYgZ2V0U3RhdHVzKHN0YXRlLmludFZhbHVlKCksCi0gICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLklOTkVSX0NIT0lDRV9FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgYSBnaXZlbiBRTmFtZSByZWZlcnMgdG8gU2ltcGxlIFR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaW1wbGVTdGF0dXNGb3JRTmFtZShRTmFtZSBxTmFtZSkgewotICAgICAgICBJbnRlZ2VyIHN0YXRlID0gKEludGVnZXIpIHNwZWNpYWxUeXBlRmxhZ01hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCAmJiBnZXRTdGF0dXMoc3RhdGUuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU0lNUExFX1RZUEVfT1JfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIHBhcnRpY2FsIGNsYXNzIG9yIG5vdAotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UGFydGljbGVUeXBlU3RhdHVzRm9yUU5hbWUoUU5hbWUgcU5hbWUpewotICAgICAgICBJbnRlZ2VyIHN0YXRlID0gKEludGVnZXIpIHNwZWNpYWxUeXBlRmxhZ01hcC5nZXQocU5hbWUpOwotICAgICAgICByZXR1cm4gc3RhdGUgIT0gbnVsbCAmJiBnZXRTdGF0dXMoc3RhdGUuaW50VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuUEFSVElDTEVfVFlQRV9FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgYSBnaXZlbiBRTmFtZSBoYXMgdGhlIGFueSBhdHRyaWJ1dGUgc3RhdHVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QW55QXR0cmlidXRlU3RhdHVzRm9yUU5hbWUoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldEFycmF5U3RhdHVzRm9yUU5hbWUocU5hbWUpICYmCi0gICAgICAgICAgICAgICAgZ2V0QW55U3RhdHVzRm9yUU5hbWUocU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBhIGdpdmVuIFFOYW1lIGhhcyB0aGUgb3B0aW9uYWwgYXR0cmlidXRlIHN0YXR1cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZSBRTmFtZSBvZiBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXR0cmlidXRlIGhhcyBvcHRpb25hbCBzdGF0dXMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcHRpb25hbEF0dHJpYnV0ZVN0YXR1c0ZvclFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgc3RhdGUgPSAoSW50ZWdlcikgc3BlY2lhbFR5cGVGbGFnTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIHJldHVybiBzdGF0ZSAhPSBudWxsICYmIGdldFN0YXR1cyhzdGF0ZS5pbnRWYWx1ZSgpLAotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5PUFRJT05BTF9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIHdob2xlIHNldCBvZiB0YWJsZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJUYWJsZXMoKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudFRvSmF2YUNsYXNzTWFwLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudFRvU2NoZW1hUU5hbWVNYXAuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5lbGVtZW50VG9TY2hlbWFRTmFtZU1hcC5jbGVhcigpOwotICAgICAgICB0aGlzLmVsZW1lbnRUb0phdmFDbGFzc01hcC5jbGVhcigpOwotICAgICAgICB0aGlzLnNwZWNpYWxUeXBlRmxhZ01hcC5jbGVhcigpOwotICAgICAgICB0aGlzLnFOYW1lTWF4T2NjdXJzQ291bnRNYXAuY2xlYXIoKTsKLSAgICAgICAgdGhpcy5xTmFtZU1pbk9jY3Vyc0NvdW50TWFwLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMucU5hbWVPcmRlck1hcC5jbGVhcigpOwotICAgICAgICB0aGlzLmVsZW1lbnRRTmFtZVRvRGVmdWxhdFZhbHVlTWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbWluT2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1pbk9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1pbk9jY3VycyhRTmFtZSBxTmFtZSwgbG9uZyBtaW5PY2N1cnMpIHsKLSAgICAgICAgdGhpcy5xTmFtZU1pbk9jY3Vyc0NvdW50TWFwLnB1dChxTmFtZSwgbmV3IExvbmcobWluT2NjdXJzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgUU5hbWUgZm9yIHRoZSBvcmRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUU5hbWVJbmRleChRTmFtZSBxTmFtZSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRoaXMucU5hbWVPcmRlck1hcC5wdXQobmV3IEludGVnZXIoaW5kZXgpLCBxTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbWluT2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGxvbmcuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TWluT2NjdXJzKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIExvbmcgbCA9IChMb25nKSB0aGlzLnFOYW1lTWluT2NjdXJzQ291bnRNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIGwgIT0gbnVsbCA/IGwubG9uZ1ZhbHVlKCkgOiAxOyAvL2RlZmF1bHQgZm9yIG1pbiBpcyAxCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4T2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGxvbmcuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TWF4T2NjdXJzKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIExvbmcgbCA9IChMb25nKSB0aGlzLnFOYW1lTWF4T2NjdXJzQ291bnRNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIGwgIT0gbnVsbCA/IGwubG9uZ1ZhbHVlKCkgOiAxOyAvL2RlZmF1bHQgZm9yIG1heCBpcyAxCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgbWF4T2NjdXJzIGFzc29jaWF0ZWQgd2l0aCBhIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1heE9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1heE9jY3VycyhRTmFtZSBxTmFtZSwgbG9uZyBtYXhPY2N1cnMpIHsKLSAgICAgICAgdGhpcy5xTmFtZU1heE9jY3Vyc0NvdW50TWFwLnB1dChxTmFtZSwgbmV3IExvbmcobWF4T2NjdXJzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEl0ZXJhdG9yLgotICAgICAqIEBkZXByZWNhdGVkIFVzZSAjZ2V0UU5hbWVBcnJheQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRFbGVtZW50UU5hbWVJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRUb0phdmFDbGFzc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFFOYW1lIGFycmF5IC0gbWF5IG5vdCBiZSBvcmRlcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lW10uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lW10gZ2V0UU5hbWVBcnJheSgpIHsKLSAgICAgICAgU2V0IGtleVNldCA9IGVsZW1lbnRUb0phdmFDbGFzc01hcC5rZXlTZXQoKTsKLSAgICAgICAgcmV0dXJuIChRTmFtZVtdKSBrZXlTZXQudG9BcnJheShuZXcgUU5hbWVba2V5U2V0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG9yZGVyZWQgUU5hbWUgYXJyYXkgLSB1c2VmdWwgaW4gc2VxdWVuY2VzIHdoZXJlIHRoZSBvcmRlciBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQKLSAgICAgKiBOb3RlIC0gI3JlZ2lzdGVyUU5hbWVJbmRleCBuZWVkcyB0byBiZSBjYWxsZWQgaWYgdGhpcyBpcyB0byB3b3JrIHByb3Blcmx5IQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lW10uCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lW10gZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKSB7Ci0gICAgICAgIC8vZ2V0IHRoZSBrZXlzIG9mIHRoZSBvcmRlciBtYXAKLSAgICAgICAgU2V0IHNldCA9IHFOYW1lT3JkZXJNYXAua2V5U2V0KCk7Ci0gICAgICAgIGludCBjb3VudCA9IHNldC5zaXplKCk7Ci0gICAgICAgIEludGVnZXJbXSBrZXlzID0gKEludGVnZXJbXSkgc2V0LnRvQXJyYXkobmV3IEludGVnZXJbY291bnRdKTsKLSAgICAgICAgQXJyYXlzLnNvcnQoa2V5cyk7Ci0KLSAgICAgICAgLy9Ob3cgcmVmaWxsIHRoZSBPcmRlcmVkIFFOYW1lIEFycmF5Ci0gICAgICAgIExpc3QgcmV0dXJuUU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJldHVyblFOYW1lcy5hZGQocU5hbWVPcmRlck1hcC5nZXQoa2V5c1tpXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93ZSd2ZSBtaXNzZWQgdGhlIGF0dHJpYnV0ZXMsIHNvIGlmIHRoZXJlIGFyZSBhdHRyaWJ1dGVzCi0gICAgICAgIC8vYWRkIHRoZW0gZXhwbGljaXRseSB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdAotICAgICAgICBRTmFtZVtdIGFsbE5hbWVzID0gZ2V0UU5hbWVBcnJheSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFsbE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QXR0cmlidXRlU3RhdHVzRm9yUU5hbWUoYWxsTmFtZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuUU5hbWVzLmFkZChhbGxOYW1lc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFFOYW1lW10pIHJldHVyblFOYW1lcy50b0FycmF5KG5ldyBRTmFtZVtyZXR1cm5RTmFtZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHN0YXJ0aW5nIGNvdW50IGZvciB0aGUgYWRkaXRpb24gb2YgbmV3IGl0ZW1zIHRvIHRoZSBvcmRlcgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc3RhcnRpbmcgbnVtYmVyIGZvciB0aGUgc2VxdWVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9yZGVyU3RhcnRQb2ludCgpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lT3JkZXJNYXAuc2l6ZSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBsaW5rIHRvIHRoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0YUluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBc1BhcmVudChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZm8pIHsKLSAgICAgICAgcGFyZW50ID0gbWV0YUluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGFub3RoZXIgc3RhdHVzIHRvIGEgcGFydGljdWxhciBRbmFtZS4KLSAgICAgKiBBIFFuYW1lIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbXVsdGlwbGUgc3RhdHVzIGZsYWdzCi0gICAgICogYW5kIHRoZXkgYWxsIHdpbGwgYmUgcHJlc2VydmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSBtYXNrCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGR0U3RhdHVzKFFOYW1lIHR5cGUsIGludCBtYXNrKSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSB0aGlzLnNwZWNpYWxUeXBlRmxhZ01hcC5nZXQodHlwZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHByZVZhbHVlID0gKChJbnRlZ2VyKSBvYmopLmludFZhbHVlKCk7Ci0gICAgICAgICAgICB0aGlzLnNwZWNpYWxUeXBlRmxhZ01hcC5wdXQodHlwZSwgbmV3IEludGVnZXIoKHByZVZhbHVlIHwgbWFzaykpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuc3BlY2lhbFR5cGVGbGFnTWFwLnB1dCh0eXBlLCBuZXcgSW50ZWdlcihtYXNrKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldFN0YXR1cyhpbnQgc3RvcmVkU3RhdHVzLCBpbnQgbWFzaykgewotICAgICAgICAvL3doZW4gdGhlIG1hc2sgaXMgYW5kZWQgd2l0aCB0aGUgc3RhdHVzIHRoZW4gd2Ugc2hvdWxkIGdldAotICAgICAgICAvL3RoZSBtYXNrIGl0IHNlbGYhCi0gICAgICAgIHJldHVybiAobWFzayA9PSAobWFzayAmIHN0b3JlZFN0YXR1cykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxlbmd0aCBmYWNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsZW5ndGhGYWNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExlbmd0aEZhY2V0KGxvbmcgbGVuZ3RoRmFjZXQpIHsKLSAgICAgICAgdGhpcy5sZW5ndGhGYWNldCA9IGxlbmd0aEZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxlbmd0aCBmYWNldC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBsZW5ndGggZmFjZXQuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TGVuZ3RoRmFjZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aEZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1heEV4Y2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXhFeGNsdXNpdmVGYWNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1heEV4Y2x1c2l2ZUZhY2V0KFN0cmluZyBtYXhFeGNsdXNpdmVGYWNldCkgewotICAgICAgICB0aGlzLm1heEV4Y2x1c2l2ZUZhY2V0ID0gbWF4RXhjbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4RXhjbHVzaXZlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtYXhFeGNsdXNpdmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXhFeGNsdXNpdmVGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF4RXhjbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWluRXhjbHVzaXZlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1pbkV4Y2x1c2l2ZUZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluRXhjbHVzaXZlRmFjZXQoU3RyaW5nIG1pbkV4Y2x1c2l2ZUZhY2V0KSB7Ci0gICAgICAgIHRoaXMubWluRXhjbHVzaXZlRmFjZXQgPSBtaW5FeGNsdXNpdmVGYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5FeGNsdXNpdmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1pbkV4Y2x1c2l2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5taW5FeGNsdXNpdmVGYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtYXhJbmNsdXNpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF4SW5jbHVzaXZlRmFjZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXhJbmNsdXNpdmVGYWNldChTdHJpbmcgbWF4SW5jbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgdGhpcy5tYXhJbmNsdXNpdmVGYWNldCA9IG1heEluY2x1c2l2ZUZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heEluY2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWF4SW5jbHVzaXZlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1heEluY2x1c2l2ZUZhY2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1pbkluY2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtaW5JbmNsdXNpdmVGYWNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbkluY2x1c2l2ZUZhY2V0KFN0cmluZyBtaW5JbmNsdXNpdmVGYWNldCkgewotICAgICAgICB0aGlzLm1pbkluY2x1c2l2ZUZhY2V0ID0gbWluSW5jbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluSW5jbHVzaXZlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtaW5JbmNsdXNpdmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNaW5JbmNsdXNpdmVGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWluSW5jbHVzaXZlRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWF4TGVuZ3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIG1heExlbmd0aEZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWF4TGVuZ3RoRmFjZXQobG9uZyBtYXhMZW5ndGhGYWNldCkgewotICAgICAgICB0aGlzLm1heExlbmd0aEZhY2V0ID0gbWF4TGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4TGVuZ3RoLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIG1heExlbmd0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRNYXhMZW5ndGhGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWF4TGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWluTGVuZ3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIG1pbkxlbmd0aEZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWluTGVuZ3RoRmFjZXQobG9uZyBtaW5MZW5ndGhGYWNldCkgewotICAgICAgICB0aGlzLm1pbkxlbmd0aEZhY2V0ID0gbWluTGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluTGVuZ3RoLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIG1pbkxlbmd0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRNaW5MZW5ndGhGYWNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubWluTGVuZ3RoRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW51bUZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW51bUZhY2V0KEFycmF5TGlzdCBlbnVtRmFjZXQpIHsKLSAgICAgICAgdGhpcy5lbnVtRmFjZXQgPSBlbnVtRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW51bUZhY2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRW51bUZhY2V0KFN0cmluZyBlbnVtRmFjZXQpIHsKLSAgICAgICAgdGhpcy5lbnVtRmFjZXQuYWRkKGVudW1GYWNldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZW51bWVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgZW51bWVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0RW51bUZhY2V0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbnVtRmFjZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGF0dGVybi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXR0ZXJuRmFjZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuRmFjZXQoU3RyaW5nIHBhdHRlcm5GYWNldCkgewotICAgICAgICB0aGlzLnBhdHRlcm5GYWNldCA9IHBhdHRlcm5GYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXR0ZXJuLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHBhdHRlcm4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuRmFjZXQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm5GYWNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBpcyB1bmlvbgotICAgICAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVbmlvbigpIHsKLSAgICAgICAgcmV0dXJuIGlzVW5pb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5pb24oYm9vbGVhbiB1bmlvbikgewotICAgICAgICBpc1VuaW9uID0gdW5pb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgbWVtZWJlciB0eXBlIGluIGEgdW5pb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyBNYXAgZ2V0TWVtYmVyVHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJUeXBlcyhNYXAgbWVtYmVyVHlwZXMpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlcyA9IG1lbWJlclR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldE1lbWJlclR5cGVzS2V5cygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlclR5cGVzS2V5czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJUeXBlc0tleXMoTGlzdCBtZW1iZXJUeXBlc0tleXMpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlc0tleXMgPSBtZW1iZXJUeXBlc0tleXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVtYmVyVHlwZShRTmFtZSBxbmFtZSxTdHJpbmcgY2xhc3NOYW1lKXsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlcy5wdXQocW5hbWUsY2xhc3NOYW1lKTsKLSAgICAgICAgdGhpcy5tZW1iZXJUeXBlc0tleXMuYWRkKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBpc0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdChib29sZWFuIGxpc3QpIHsKLSAgICAgICAgaXNMaXN0ID0gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0SXRlbVR5cGVRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1UeXBlUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SXRlbVR5cGVRTmFtZShRTmFtZSBpdGVtVHlwZVFOYW1lKSB7Ci0gICAgICAgIHRoaXMuaXRlbVR5cGVRTmFtZSA9IGl0ZW1UeXBlUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJdGVtVHlwZUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZW1UeXBlQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEl0ZW1UeXBlQ2xhc3NOYW1lKFN0cmluZyBpdGVtVHlwZUNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLml0ZW1UeXBlQ2xhc3NOYW1lID0gaXRlbVR5cGVDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gaXNQYXJ0aWNsZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpY2xlQ2xhc3MoYm9vbGVhbiBwYXJ0aWNsZUNsYXNzKSB7Ci0gICAgICAgIGlzUGFydGljbGVDbGFzcyA9IHBhcnRpY2xlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNIYXNQYXJ0aWNsZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoYXNQYXJ0aWNsZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGFzUGFydGljbGVUeXBlKGJvb2xlYW4gaGFzUGFydGljbGVUeXBlKSB7Ci0gICAgICAgIHRoaXMuaGFzUGFydGljbGVUeXBlID0gaGFzUGFydGljbGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFhtbE5hbWVKYXZhTmFtZU1hcHBpbmcoU3RyaW5nIHhtbE5hbWUsU3RyaW5nIGphdmFOYW1lKXsKLSAgICAgICAgdGhpcy54bWxOYW1lSmF2YU5hbWVNYXAucHV0KHhtbE5hbWUsamF2YU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSmF2YU5hbWVNYXBwaW5nQXZhaWxhYmxlKFN0cmluZyB4bWxOYW1lKXsKLSAgICAgICAgcmV0dXJuIHRoaXMueG1sTmFtZUphdmFOYW1lTWFwLmNvbnRhaW5zS2V5KHhtbE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoU3RyaW5nIHhtbE5hbWUpewotICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy54bWxOYW1lSmF2YU5hbWVNYXAuZ2V0KHhtbE5hbWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL0NvbXBpbGVyT3B0aW9ucy5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL0NvbXBpbGVyT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTM3Y2Q4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9Db21waWxlck9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuaTE4bi5TY2hlbWFDb21waWxlck1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLS8qKgotICogVGhpcyBpcyBhIGJlYW4gY2xhc3MgdGhhdCBjYXB0dXJlcyBhbGwgdGhlIGNvbXBpbGVyIG9wdGlvbnMuCi0gKiBSaWdodCBub3cgdGhlIGNvbXBpbGVyIG9wdGlvbnMgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nCi0gKiAxLiBvdXRwdXQgZmlsZSBsb2NhdGlvbiAtIEEgZm9sZGVyIHdpdGggbmVjZXNzYXJ5IHJpZ2h0cyBmb3IgdGhlCi0gKiBzY2hlbWEgY29tcGlsZXIgdG8gd3JpdGUgdGhlIGZpbGVzCi0gKiAyLnBhY2thZ2UgbmFtZQotICogMy5uYW1lc3BhY2UgdG8gcGFja2FnZSBtYXAKLSAqIDQuYm9vbGVhbiBmbGFnIG1hcmtpbmcgd2hldGhlciB0byB3cmFwIG9yIHVud3JhcAotICogNC5ib29sZWFuIGZsYWcgbWFya2luZyB3aGV0aGVyIHRvIHdyaXRlIGNsYXNzZXMgb3Igbm90Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21waWxlck9wdGlvbnMgewotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIG91dHB1dCBmaWxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dExvY2F0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGwgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvZmZTdHJpY3RWYWxpZGF0aW9uID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzVXNlV3JhcHBlckNsYXNzZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgZm9yIHRoZSBtYXBwZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYXBwZXJDbGFzc1BhY2thZ2UgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJDbGFzc1BhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZXJDbGFzc1BhY2thZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVyQ2xhc3NQYWNrYWdlKFN0cmluZyBtYXBwZXJDbGFzc1BhY2thZ2UpIHsKLSAgICAgICAgdGhpcy5tYXBwZXJDbGFzc1BhY2thZ2UgPSBtYXBwZXJDbGFzc1BhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHdoZXRoZXIgdGhlIG1hcHBlciBjbGFzcyBwYWNrYWdlCi0gICAgICogbmFtZSBpcyBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNYXBwZXJDbGFzc1BhY2thZ2VQcmVzZW50KCl7Ci0gICAgICAgIHJldHVybiAgIChtYXBwZXJDbGFzc1BhY2thZ2UhPW51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgISIiLmVxdWFscyhtYXBwZXJDbGFzc1BhY2thZ2UpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhlIGZsYWcga2VlcGluZyB3aGV0aGVyIHNlcGVyYXRlIGhlbHBlcnMKLSAgICAgKiBuZWVkIHRvIGJlIGdlbmVyYXRlZCBvciBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGVscGVyTW9kZSA9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzSGVscGVyTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGhlbHBlck1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVscGVyTW9kZShib29sZWFuIGhlbHBlck1vZGUpIHsKLSAgICAgICAgdGhpcy5oZWxwZXJNb2RlID0gaGVscGVyTW9kZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogS2VlcCB0cmFjayBvZiB0aGUgbmFtZXNwYWNlIGFuZCBwYWNrYWdlcyBtYXBwaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgbnMyUGFja2FnZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgTWFwIGdldE5zMlBhY2thZ2VNYXAoKSB7Ci0gICAgICAgIHJldHVybiBuczJQYWNrYWdlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5zMlBhY2thZ2VNYXAoTWFwIG5zMlBhY2thZ2VNYXApIHsKLSAgICAgICAgdGhpcy5uczJQYWNrYWdlTWFwID0gbnMyUGFja2FnZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZsYWcgdGVsbHMgdGhlIGRhdGFiaW5kZXIgdG8gZWl0aGVyIHdyaXRlIHRoZSBvdXRwdXQgb3IKLSAgICAgKiBub3QuIGlmIHRoaXMgaXMgc2V0IHRvIHRydWUgaXQgd2lsbCB3cml0ZSB0aGUgb3V0cHV0IGF0IG9uY2UuCi0gICAgICogaWYgbm90IHRoZSBvdXRwdXR0ZXIgd2lsbCBwb3B1bGF0ZSB0aGUgCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlT3V0cHV0ID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBhcmUgd3JhcHBlZCBvciBub3QKLSAgICAgKiBpZiB0aGUgd3JhcHBlciBmbGFnIGlzIHRydWUsIHRoZW4gb25seSBhIHNpbmdsZSBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHdyYXBDbGFzc2VzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlT3V0cHV0KCkgewotICAgICAgICByZXR1cm4gd3JpdGVPdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3JpdGVPdXRwdXQoYm9vbGVhbiB3cml0ZU91dHB1dCkgewotICAgICAgICB0aGlzLndyaXRlT3V0cHV0ID0gd3JpdGVPdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXcmFwQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIHdyYXBDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdyYXBDbGFzc2VzKGJvb2xlYW4gd3JhcENsYXNzZXMpIHsKLSAgICAgICAgdGhpcy53cmFwQ2xhc3NlcyA9IHdyYXBDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGlsZXJPcHRpb25zIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcGFja2FnZSBuYW1lLgotICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiB0ZXN0VmFsdWUocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS51bnN1cHBvcnRlZHZhbHVlIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0TG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBpbGVyT3B0aW9ucyBzZXRPdXRwdXRMb2NhdGlvbihGaWxlIG91dHB1dExvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHRlc3RWYWx1ZShTdHJpbmcgd29yZFRvTWF0Y2gpIHsKLSAgICAgICAgUGF0dGVybiBwYXQgPSBQYXR0ZXJuLmNvbXBpbGUoIl4oXFx3K1xcLikrJCIpOwotICAgICAgICBNYXRjaGVyIG0gPSBwYXQubWF0Y2hlcih3b3JkVG9NYXRjaCk7Ci0gICAgICAgIHJldHVybiBtLm1hdGNoZXMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFsbCgpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlQWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQWxsKGJvb2xlYW4gZ2VuZXJhdGVBbGwpIHsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbCA9IGdlbmVyYXRlQWxsOwotICAgIH0KLQkvKioKLQkgKiBUaGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBhcmUgZXhwZWN0ZWQgdG8gYmUKLQkgKiBiYWNrd29yZCBjb21wYXRpYmxlIHdpdGggQXhpcyAxLngKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkgewotCQlyZXR1cm4gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKGJvb2xlYW4gYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSkgewotCQl0aGlzLmJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUgPSBiYWNrd29yZENvbXBhdGliaWxpdHlNb2RlOwotCX0KLQotICAgIC8qKgotICAgICAqIFNob3VsZCB3ZSBzdXBwcmVzcyBuYW1lc3BhY2UgcHJlZml4ZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NQcmVmaXhlc01vZGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NQcmVmaXhlc01vZGUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBwcmVzc1ByZWZpeGVzTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc1ByZWZpeGVzTW9kZShib29sZWFuIHN1cHByZXNzUHJlZml4ZXNNb2RlKSB7Ci0gICAgICAgIHRoaXMuc3VwcHJlc3NQcmVmaXhlc01vZGUgPSBzdXBwcmVzc1ByZWZpeGVzTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09mZlN0cmljdFZhbGlkYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBvZmZTdHJpY3RWYWxpZGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9mZlN0cmljdFZhbGlkYXRpb24oYm9vbGVhbiBvZmZTdHJpY3RWYWxpZGF0aW9uKSB7Ci0gICAgICAgIHRoaXMub2ZmU3RyaWN0VmFsaWRhdGlvbiA9IG9mZlN0cmljdFZhbGlkYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VXcmFwcGVyQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIGlzVXNlV3JhcHBlckNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlV3JhcHBlckNsYXNzZXMoYm9vbGVhbiB1c2VXcmFwcGVyQ2xhc3NlcykgewotICAgICAgICB0aGlzLmlzVXNlV3JhcHBlckNsYXNzZXMgPSB1c2VXcmFwcGVyQ2xhc3NlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvRXh0ZW5zaW9uVXRpbGl0eS5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL0V4dGVuc2lvblV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhNmIyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvRXh0ZW5zaW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuSmF2YVR5cGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudHlwZW1hcC5UeXBlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuQ1R5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkRlZmF1bHRUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5KYXZhVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBbnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4Q29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhDb250ZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29udGVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSB1dGlsaXR5IGZvciB0aGUgZXh0ZW5zaW9uIHRvIGNhbGwgYnkgcmVmbGVjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblV0aWxpdHkgewotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0IHNjaGVtYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vIGFkZCBhbGwgdGhlIHNjaGVtYXMgdG8gdGhlIGxpc3QKLSAgICAgICAgTGlzdCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXhpc1NlcnZpY2VzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlcnZpY2VzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHNjaGVtYUxpc3QuYWRkQWxsKCgoQXhpc1NlcnZpY2UpaXRlci5uZXh0KCkpLmdldFNjaGVtYSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaGFzaG1hcCB0aGF0IGtlZXBzIHRoZSB0YXJnZXRuYW1lc3BhY2UgYW5kIHRoZSB4bWxTY2hlbWEgb2JqZWN0Ci0gICAgICAgIC8vdGhpcyBpcyBhIGNvbnZlbmllbmNlIHRvIGxvY2F0ZSB0aGUgcmVsZXZhbnQgc2NoZW1hIHF1aWNrbHkKLSAgICAgICAgLy9ieSBsb29raW5nIGF0IHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICAgIE1hcCBzY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwb3B1bGF0ZVNjaGVtYU1hcChzY2hlbWFNYXAsIHNjaGVtYUxpc3QpOwotCi0gICAgICAgIGlmIChzY2hlbWFMaXN0ID09IG51bGwgfHwgc2NoZW1hTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vdGhlcmUgYXJlIG5vIHR5cGVzIHRvIGJlIGNvZGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAvL0hvd2V2ZXIgaWYgdGhlIHR5cGUgbWFwcGVyIGlzIGxlZnQgZW1wdHkgaXQgd2lsbCBiZSBhIHByb2JsZW0gZm9yIHRoZSBvdGhlcgotICAgICAgICAgICAgLy9wcm9jZXNzZXMuIEhlbmNlIHRoZSBkZWZhdWx0IHR5cGUgbWFwcGVyIGlzIHNldCB0byB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUeXBlTWFwcGVyKG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvL2NhbGwgdGhlIHNjaGVtYSBjb21waWxlcgotICAgICAgICBDb21waWxlck9wdGlvbnMgb3B0aW9ucyA9IG5ldyBDb21waWxlck9wdGlvbnMoKTsKLQotICAgICAgICAvL3NldCB0aGUgZGVmYXVsdCBvcHRpb25zCi0gICAgICAgIHBvcHVsYXRlRGVmYXVsdE9wdGlvbnMob3B0aW9ucywgY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgLy9zZXQgdGhlIHVzZXIgcGFyYW1ldGVycy4gdGhlIHVzZXIgcGFyYW1ldGVycyBnZXQgdGhlIHByZWZlcmVuY2Ugb3ZlcgotICAgICAgICAvL3RoZSBkZWZhdWx0IG9uZXMuIEJ1dCB0aGUgdXNlciBiZXR0ZXIga25vdyB3aGF0IGhlJ3MgZG9pbmcgaWYgaGUKLSAgICAgICAgLy91c2VkIG1vZHVsZSBzcGVjaWZpYyBwYXJhbWV0ZXJzCi0gICAgICAgIHBvcHVsYXRlVXNlcnBhcmFtZXRlcnMob3B0aW9ucywgY29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgU2NoZW1hQ29tcGlsZXIgc2NoZW1hQ29tcGlsZXIgPSBuZXcgU2NoZW1hQ29tcGlsZXIob3B0aW9ucyk7Ci0gICAgICAgIC8vIHJ1biB0aGUgc2NoZW1hIGNvbXBpbGVyCi0gICAgICAgIHNjaGVtYUNvbXBpbGVyLmNvbXBpbGUoc2NoZW1hTGlzdCk7Ci0KLSAgICAgICAgLy9jcmVhdGUgdGhlIHR5cGUgbWFwcGVyCi0gICAgICAgIC8vRmlyc3QgdHJ5IHRvIHRha2UgdGhlIG9uZSB0aGF0IGlzIGFscmVhZHkgdGhlcmUKLSAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSBjb25maWd1cmF0aW9uLmdldFR5cGVNYXBwZXIoKTsKLSAgICAgICAgaWYgKG1hcHBlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIWNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS50cmltKCkuZXF1YWxzKCIiKSAmJgotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImMiKSkgewotICAgICAgICAgICAgICAgIG1hcHBlciA9IG5ldyBDVHlwZU1hcHBlcigpOwotCi0gICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXBwZXIgPSBuZXcgSmF2YVR5cGVNYXBwZXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaXNXcml0ZU91dHB1dCgpKSB7Ci0gICAgICAgICAgICAvL2dldCB0aGUgcHJvY2Vzc2VkIGVsZW1lbnQgbWFwIGFuZCB0cmFuc2ZlciBpdCB0byB0aGUgdHlwZSBtYXBwZXIKLSAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRNYXAgPSBzY2hlbWFDb21waWxlci5nZXRQcm9jZXNzZWRFbGVtZW50TWFwKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBwcm9jZXNzZWRrZXlzID0gcHJvY2Vzc2VkTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZUtleTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzZWRrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHFOYW1lS2V5ID0gKFFOYW1lKSBwcm9jZXNzZWRrZXlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHFOYW1lS2V5LCBwcm9jZXNzZWRNYXAuZ2V0KHFOYW1lS2V5KS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9nZXQgdGhlIHByb2Nlc3NlZCBtb2RlbCBtYXAgYW5kIHRyYW5zZmVyIGl0IHRvIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgLy9zaW5jZSB0aGUgb3B0aW9ucyBtZW50aW9uZCB0aGF0IGl0cyBub3Qgd3JpdGFibGUsIGl0IHNob3VsZCBoYXZlCi0gICAgICAgICAgICAvL3BvcHVsYXRlZCB0aGUgbW9kZWwgbWFwCi0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkTW9kZWxNYXAgPSBzY2hlbWFDb21waWxlci5nZXRQcm9jZXNzZWRNb2RlbE1hcCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgcHJvY2Vzc2Vka2V5cyA9IHByb2Nlc3NlZE1vZGVsTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZUtleTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzZWRrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHFOYW1lS2V5ID0gKFFOYW1lKSBwcm9jZXNzZWRrZXlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdPYmplY3QocU5hbWVLZXksIHByb2Nlc3NlZE1vZGVsTWFwLmdldChxTmFtZUtleSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkTWFwID0gc2NoZW1hQ29tcGlsZXIuZ2V0UHJvY2Vzc2VkRWxlbWVudE1hcCgpOwotICAgICAgICAgICAgcHJvY2Vzc2Vka2V5cyA9IHByb2Nlc3NlZE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3NlZGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVLZXkgPSAoUU5hbWUpIHByb2Nlc3NlZGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUocU5hbWVLZXksIHByb2Nlc3NlZE1hcC5nZXQocU5hbWVLZXkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2dldCB0aGUgQURCIHRlbXBsYXRlIGZyb20gdGhlIHNjaGVtYSBjb21waWxlcnMgcHJvcGVydHkgYmFnIGFuZCBzZXQgdGhlCi0gICAgICAgICAgICAvL3RlbXBsYXRlCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnB1dFByb3BlcnR5KENvbnN0YW50cy5FWFRFUk5BTF9URU1QTEFURV9QUk9QRVJUWV9LRVksCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBpbGVyLmdldENvbXBpbGVyUHJvcGVydGllcygpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5TY2hlbWFQcm9wZXJ0eU5hbWVzLkJFQU5fV1JJVEVSX1RFTVBMQVRFX0tFWSkpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvL3Byb2Nlc3MgdGhlIHVud3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkpIHsKLSAgICAgICAgICAgIC8vZmlndXJlIG91dCB0aGUgdW53cmFwcGVkIG9wZXJhdGlvbnMKLSAgICAgICAgICAgIExpc3QgYXhpc1NlcnZpY2VzID0gY29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBheGlzU2VydmljZXMuaXRlcmF0b3IoKTsgc2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtTY2hlbWEob3AuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IGZvciB4bWwgYmVhbnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkuZXF1YWxzKCJhZGIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1NjaGVtYShvcC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk9VVFBVVF9QQVJUX1FOQU1FX1NVRkZJWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy9wdXQgdGhlIGNvbXBsZXh0IHR5cGVzIGZvciB0aGUgdG9wIGxldmVsIGVsZW1lbnRzIGhhdmluZyB0aGVtCi0gICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGluIHVud3JhcHBpbmcgYW5kIHRvIHByb3ZpZGUgYmFja3dvcmRDb21wYXRpYmlsaXR5Ci0gICAgICAgIGlmICghY29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkgfHwgY29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjb25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZTsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdG9ycyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsgb3BlcmF0b3JzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRvcnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29tcGxleFR5cGVOYW1lKGF4aXNNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc01lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRDb21wbGV4VHlwZU5hbWUoYXhpc01lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvL3NldCB0aGUgdHlwZSBtYXBwZXIgdG8gdGhlIGNvbmZpZwotICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobWFwcGVyKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCB0aGUgY29tcGxleHQgdHlwZSBjbGFzcyBuYW1lIGFzIGFuIG1lc3NhZ2UgcGFyYW1ldGVyIGlmIGl0IGV4aXRzCi0gICAgICogQHBhcmFtIGF4aXNNZXNzYWdlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb21wbGV4VHlwZU5hbWUoQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChheGlzTWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCkgIT0gbnVsbCl7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGF4aXNNZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgUU5hbWUgc2NoZW1hVHlwZVFuYW1lID0gc2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYSB0eXBlIGZyb20gYWxsIHRoZSBzY2hlbWFzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGdldCB0aGUgc2NoZW1hIG9mIHRoZSBleHRlbnNpb24gdHlwZSBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hLiBGb3IgdGhhdCBsZXQncyBmaXJzdCByZXRyaWV2ZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGF4aXNNZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2NoZW1hc0xpc3QgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYXNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWEsIHNjaGVtYVR5cGVRbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgICAgIGlmICgoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpICYmIChjb21wbGV4VHlwZS5nZXRRTmFtZSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcCBtZXRhSW5mbyA9IGNvbXBsZXhUeXBlLmdldE1ldGFJbmZvTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV4VHlwZU5hbWUgPSAoU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvLmdldChTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlTmFtZSA9IGNvbXBsZXhUeXBlTmFtZS5zdWJzdHJpbmcoMCxjb21wbGV4VHlwZU5hbWUubGVuZ3RoKCkgLTIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBjb21wbGV4dCB0eXBlIG5hbWUgdG8gcHJvY2VzcyBsYXRlcgotICAgICAgICAgICAgICAgICAgIGF4aXNNZXNzYWdlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5DT01QTEVYX1RZUEUsIGNvbXBsZXhUeXBlTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgc2NoZW1hIG9iamVjdHMgaW50byB0aGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWFNYXAKLSAgICAgKiBAcGFyYW0gc2NoZW1hTGlzdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVTY2hlbWFNYXAoTWFwIHNjaGVtYU1hcCwgTGlzdCBzY2hlbWFMaXN0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHhtbFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBtYXBwZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdhbGtTY2hlbWEoQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgewotCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgUU5hbWUgc2NoZW1hVHlwZVFuYW1lID0gc2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYSB0eXBlIGZyb20gYWxsIHRoZSBzY2hlbWFzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGdldCB0aGUgc2NoZW1hIG9mIHRoZSBleHRlbnNpb24gdHlwZSBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hLiBGb3IgdGhhdCBsZXQncyBmaXJzdCByZXRyaWV2ZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2UuZ2V0QXhpc09wZXJhdGlvbigpLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzY2hlbWFzTGlzdCA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IChYbWxTY2hlbWEpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZSA9IGdldFNjaGVtYVR5cGUoc2NoZW1hLCBzY2hlbWFUeXBlUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NyZWF0ZSBhIHR5cGUgbWFwcGVyCi0gICAgICAgICAgICBUeXBlTWFwIGJhc2ljVHlwZU1hcCA9IG5ldyBKYXZhVHlwZU1hcCgpOwotICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NYTUxTY2hlbWFDb21wbGV4VHlwZShzY2hlbWFUeXBlLCBtYXBwZXIsIG9wTmFtZSwgc2NoZW1hTWFwLCBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFUeXBlUW5hbWUgIT0gbnVsbCkgJiYgYmFzaWNUeXBlTWFwLmdldFR5cGVNYXAoKS5jb250YWluc0tleShzY2hlbWFUeXBlUW5hbWUpKXsKLSAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPSBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHBhcnRRTmFtZSwgKFN0cmluZyliYXNpY1R5cGVNYXAuZ2V0VHlwZU1hcCgpLmdldChzY2hlbWFUeXBlUW5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIHhtbFNjaGVtYVNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkgc2NoZW1hVHlwZTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUNsYXNzTmFtZSh4bWxTY2hlbWFTaW1wbGVUeXBlLmdldE1ldGFJbmZvTWFwKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIHhzZDphbnlUeXBlCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1hNTFNjaGVtYUNvbXBsZXhUeXBlKFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB7Ci0gICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNtcGx4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgc2NoZW1hVHlwZTsKLSAgICAgICAgICAgIGlmIChjbXBseFR5cGUuZ2V0Q29udGVudE1vZGVsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWFTZXF1ZW5jZShjbXBseFR5cGUuZ2V0UGFydGljbGUoKSwgbWFwcGVyLCBvcE5hbWUsIHNjaGVtYU1hcCwgcW5hbWVTdWZmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChjbXBseFR5cGUsIG1hcHBlciwgb3BOYW1lLCBzY2hlbWFNYXAsIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKGNtcGx4VHlwZSwgb3BOYW1lLCBxbmFtZVN1ZmZpeCwgbWFwcGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZXMoWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciB0eXBlTWFwKSB7Ci0gICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24geG1sT2JqZWN0Q29sbGVjdGlvbiA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgWG1sU2NoZW1hT2JqZWN0IGl0ZW07Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHhtbE9iamVjdENvbGxlY3Rpb24uZ2V0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpdGVtID0gKFhtbFNjaGVtYU9iamVjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBYbWxTY2hlbWFBdHRyaWJ1dGUgeG1sU2NoZW1hQXR0cmlidXRlOwotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFBdHRyaWJ1dGUpIHsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFBdHRyaWJ1dGUgPSAoWG1sU2NoZW1hQXR0cmlidXRlKSBpdGVtOwotICAgICAgICAgICAgICAgIHBvcHVsYXRlQ2xhc3NOYW1lKHhtbFNjaGVtYUF0dHJpYnV0ZS5nZXRNZXRhSW5mb01hcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQXR0cmlidXRlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBYbWxTY2hlbWFUeXBlIGdldFNjaGVtYVR5cGUoWG1sU2NoZW1hIHNjaGVtYSwgUU5hbWUgdHlwZU5hbWUpIHsKLSAgICAgICAgWG1sU2NoZW1hVHlwZSB4bWxTY2hlbWFUeXBlID0gbnVsbDsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gc2NoZW1hLmdldFR5cGVCeU5hbWUodHlwZU5hbWUpOwotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGluIGFuIGltcG9ydCBvciBhbiBpbmNsdWRlCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlcygpOwotICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGluY2x1ZGVzSXRlciA9IGluY2x1ZGVzLmdldEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5jbHVkZXNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gaW5jbHVkZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW1wb3J0KSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYTEsdHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWExLHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFUeXBlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWFUeXBlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChYbWxTY2hlbWFDb21wbGV4VHlwZSBjbXBseFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbnRlbnRNb2RlbCBjb250ZW50TW9kZWwgPSBjbXBseFR5cGUuZ2V0Q29udGVudE1vZGVsKCk7Ci0gICAgICAgIGlmIChjb250ZW50TW9kZWwgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgewotICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleENvbnRlbnQgeG1sU2NoZW1hQ29tcGxleENvbnRlbnQgPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIGNvbnRlbnRNb2RlbDsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbnRlbnQgY29udGVudCA9IHhtbFNjaGVtYUNvbXBsZXhDb250ZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbiBzY2hlbWFFeHRlbnNpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIGNvbnRlbnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHBhcnRpY2xlcyBpbnNpZGUgdGhpcyBleHRlbnNpb24sIGlmIGFueQotICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWFTZXF1ZW5jZShzY2hlbWFFeHRlbnNpb24uZ2V0UGFydGljbGUoKSwgbWFwcGVyLCBvcE5hbWUsIHNjaGVtYU1hcCwgcW5hbWVTdWZmaXgpOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgZXh0ZW5zaW9uU2NoZW1hVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2NoZW1hTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHhtbFNjaGVtYSxzY2hlbWFFeHRlbnNpb24uZ2V0QmFzZVR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uU2NoZW1hVHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1hNTFNjaGVtYUNvbXBsZXhUeXBlKGV4dGVuc2lvblNjaGVtYVR5cGUsIG1hcHBlciwgb3BOYW1lLCBzY2hlbWFNYXAsIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1NjaGVtYVNlcXVlbmNlKFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVNYXBwZXIgbWFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNjaGVtYU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHsKLSAgICAgICAgaWYgKHBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2VxdWVuY2UpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSAoKFhtbFNjaGVtYVNlcXVlbmNlKSBwYXJ0aWNsZSkuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZW1zLmdldEl0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGVhY2ggYW5kIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYXZlcnNlIHRocm91Z2ggdGhlbQotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBtYXAgd2l0aCB0aGUgcGFydG5hbWUgLSBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIC8vYXR0YWNoZWQgdG8gdGhlIHNjaGVtYSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IChYbWxTY2hlbWFFbGVtZW50KSBpdGVtOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFFbGVtZW50LmdldE1heE9jY3VycygpID4gMTsKLQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSB4bWxTY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0geG1sU2NoZW1hRWxlbWVudC5nZXRSZWZOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGVsZW1lbnQgY2xhc3MgbmFtZSBmcm9tIHRoZSBlbGVtZW50IGFuZCBwb3B1bGF0ZSB0aGUgbWFwcGVyCi0gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlQ2xhc3NOYW1lKHhtbFNjaGVtYUVsZW1lbnQuZ2V0TWV0YUluZm9NYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFBbnkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHhzOmFueSwgdGhlbiB0aGVyZSBpcyBubyBwYXJ0IG5hbWUgZm9yIGl0LiBVc2luZyBBTllfRUxFTUVOVF9GSUVMRF9OQU1FCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBpdCBmb3Igbm93Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IHhtbFNjaGVtYUFueSA9IChYbWxTY2hlbWFBbnkpIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSA9IHhtbFNjaGVtYUFueS5nZXRNYXhPY2N1cnMoKSA+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0gV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQU5ZX0VMRU1FTlRfRklFTERfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUocGFydFFOYW1lLCAib3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbXSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZAotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gcG9wdWxhdGUgdGhlIGNsYXNzIG5hbWUgaW50byB0aGUgdHlwZU1hcAotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCAgcG9wdWxhdGVDbGFzc05hbWUoTWFwIG1ldGFJbmZvTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZU1hcHBlciB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgewotCi0KLQotICAgICAgICBpZiAobWV0YUluZm9NYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIG1ldGFJbmZvTWFwLgotICAgICAgICAgICAgICAgICAgICBnZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZKTsKLQotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSBwYXRjaAotICAgICAgICAgICAgLy8gdGhlIGFjdWFsIHByb2JsZW0gaXMga2VlcGluZyB0aGUgY2xhc3MgbmFtZSBkZXRhaWxzIG9uIHRoZSBzY2hlbWFUeXBlIGluCi0gICAgICAgICAgICAvLyBYbWxTY2hlbWEgY29tcGlsZXIuCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoZW0gaW4gWG1sRWxlbWVudAotICAgICAgICAgICAgaWYgKGlzQXJyYXkgJiYgIWNsYXNzTmFtZS5lbmRzV2l0aCgiW10iKSkgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSAiW10iOwotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNBcnJheSAmJiBjbGFzc05hbWUuZW5kc1dpdGgoIltdIikpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5sZW5ndGgoKSAtIDIpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIFFOYW1lIHBhcnRRTmFtZSA9IFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSk7Ci0gICAgICAgICAgICB0eXBlTWFwLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZm9NYXAuZ2V0KFNjaGVtYUNvbnN0YW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX1BSSU1JVFZFX0tFWSkpKSB7Ci0KLSAgICAgICAgICAgICAgICAvL3RoaXMgdHlwZSBpcyBwcmltaXRpdmUgLSBhZGQgdGhhdCB0byB0aGUgdHlwZSBtYXBwZXIgc3RhdHVzCi0gICAgICAgICAgICAgICAgLy9mb3Igbm93IGxldHMgYWRkIGEgYm9vbGVhbgotICAgICAgICAgICAgICAgIHR5cGVNYXAuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb29rIGZvciBhIGdpdmVuIHNjaGVtYSB0eXBlIGdpdmVuIHRoZSBzY2hlbWEgdHlwZSBRbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgc2NoZW1hIGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFhtbFNjaGVtYVR5cGUgZmluZFNjaGVtYVR5cGUoTWFwIHNjaGVtYU1hcCwgUU5hbWUgc2NoZW1hVHlwZU5hbWUpIHsKLSAgICAgICAgLy9maW5kIHRoZSBzY2hlbWEKLSAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYU1hcC5nZXQoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzY2hlbWEuZ2V0VHlwZUJ5TmFtZShzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcG9wdWxhdGUgcGFyYW1ldGVycyBmcm9tIHRoZSB1c2VyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVVc2VycGFyYW1ldGVycyhDb21waWxlck9wdGlvbnMgb3B0aW9ucywgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBNYXAgcHJvcGVydHlNYXAgPSBjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYgKHByb3BlcnR5TWFwLmNvbnRhaW5zS2V5KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5XUkFQX1NDSEVNQV9DTEFTU0VTKSkgewotICAgICAgICAgICAgaWYgKEJvb2xlYW4udmFsdWVPZigKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlNYXAuZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5XUkFQX1NDSEVNQV9DTEFTU0VTKS50b1N0cmluZygpKS4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyYXBDbGFzc2VzKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyYXBDbGFzc2VzKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuV1JJVEVfU0NIRU1BX0NMQVNTRVMpKSB7Ci0gICAgICAgICAgICBpZiAoQm9vbGVhbi52YWx1ZU9mKAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU1hcC5nZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVyQXJndW1lbnRzLldSSVRFX1NDSEVNQV9DTEFTU0VTKS50b1N0cmluZygpKS4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyaXRlT3V0cHV0KHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnNldFdyaXRlT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gYWRkIHRoZSBjdXN0b20gcGFja2FnZSBuYW1lCi0gICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuUEFDS0FHRSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpIHByb3BlcnR5TWFwLmdldChTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuUEFDS0FHRSk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCB8fCAhIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIHBhY2thZ2UgbmFtZXNwYWNlIHRvIHVyaSBkZXRhaWxzCi0gICAgICAgIG9wdGlvbnMuc2V0TnMyUGFja2FnZU1hcChjb25maWd1cmF0aW9uLmdldFVyaTJQYWNrYWdlTmFtZU1hcCgpKTsKLQotICAgICAgICAvL2FkZCBjdXN0b20gbWFwcGVyIHBhY2thZ2UgbmFtZQotICAgICAgICBpZiAocHJvcGVydHlNYXAuY29udGFpbnNLZXkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVyQXJndW1lbnRzLk1BUFBFUl9QQUNLQUdFKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gKFN0cmluZykgcHJvcGVydHlNYXAuZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5NQVBQRVJfUEFDS0FHRSk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCB8fCAhIiIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TWFwcGVyQ2xhc3NQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5TWFwLmNvbnRhaW5zS2V5KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckFyZ3VtZW50cy5PRkZfU1RSSUNUX1ZBTElEQVRJT04pKXsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0T2ZmU3RyaWN0VmFsaWRhdGlvbih0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eU1hcC5jb250YWluc0tleShTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJBcmd1bWVudHMuVVNFX1dSQVBQRVJfQ0xBU1NFUykpewotICAgICAgICAgICAgb3B0aW9ucy5zZXRVc2VXcmFwcGVyQ2xhc3Nlcyh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0IGhlbHBlciBtb2RlCi0gICAgICAgIC8vdGhpcyBiZWNvbWVzIGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBjbGFzc2VzIGFyZSB1bnBhY2tlZAotICAgICAgICBpZiAoIW9wdGlvbnMuaXNXcmFwQ2xhc3NlcygpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlNYXAuY29udGFpbnNLZXkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVyQXJndW1lbnRzLkhFTFBFUl9NT0RFKSkgewotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0SGVscGVyTW9kZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogcG9wdWxhdGUgdGhlIGRlZmF1bHQgb3B0aW9ucyAtIGNhbGxlZCBiZWZvcmUgdGhlIGFwcGx5aW5nIG9mIHVzZXIgcGFyYW1ldGVycwotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlRGVmYXVsdE9wdGlvbnMoQ29tcGlsZXJPcHRpb25zIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgLy9jcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnkKLSAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBjb25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSA6Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGUoY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBjb25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpOwotCi0gICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gdGhlc2Ugb3B0aW9ucyBuZWVkIHRvIGJlIHRha2VuIGZyb20gdGhlIGNvbW1hbmQgbGluZQotICAgICAgICBvcHRpb25zLnNldE91dHB1dExvY2F0aW9uKG91dHB1dERpcik7Ci0gICAgICAgIG9wdGlvbnMuc2V0TnMyUGFja2FnZU1hcChjb25maWd1cmF0aW9uLmdldFVyaTJQYWNrYWdlTmFtZU1hcCgpID09IG51bGwgPwotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwKCkgOgotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0VXJpMlBhY2thZ2VOYW1lTWFwKCkpOwotCi0gICAgICAgIC8vZGVmYXVsdCBzZXR0aW5nIGlzIHRvIHNldCB0aGUgd3JhcCBzdGF0dXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQncwotICAgICAgICAvL3RoZSBzZXJ2ZXIgc2lkZSBvciB0aGUgY2xpZW50IHNpZGUKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgIC8vZm9yIHRoZSBzZXJ2ZXJzaWRlIHdlIGdlbmVyYXRlIHVud3JhcHBlZCAgYnkgZGVmYXVsdAotICAgICAgICAgICAgb3B0aW9ucy5zZXRXcmFwQ2xhc3NlcyhmYWxzZSk7Ci0gICAgICAgICAgICAvL2ZvciB0aGUgc2VydmVyc2lkZSB3ZSB3cml0ZSB0aGUgb3V0cHV0IGJ5IGRlZmF1bHQKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0V3JpdGVPdXRwdXQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmb3IgdGhlIGNsaWVudCBsZXQgdGhlIHVzZXJzIHByZWZlcmVuY2UgYmUgdGhlIHdvcmQgaGVyZQotICAgICAgICAgICAgb3B0aW9ucy5zZXRXcmFwQ2xhc3Nlcyhjb25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSk7Ci0gICAgICAgICAgICAvL2ZvciB0aGUgY2xpZW50IHNpZGUgdGhlIGRlZmF1bHQgc2V0dGluZyBpcyBub3QgdG8gd3JpdGUgdGhlCi0gICAgICAgICAgICAvL291dHB1dAotICAgICAgICAgICAgb3B0aW9ucy5zZXRXcml0ZU91dHB1dCghY29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEdlbmVyYXRlQWxsKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb25maWd1cmF0aW9uLmlzU3VwcHJlc3NQcmVmaXhlc01vZGUoKSkgewotICAgICAgICAgICAgb3B0aW9ucy5zZXRTdXBwcmVzc1ByZWZpeGVzTW9kZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL1NjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllMWMxMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWE7Ci0KLS8qKgotICogQSBzaW1lcGxlIGV4dGVuc2lvbiBmcm9tIHRoZSBqYXZhLmxhbmcuZXhjZXB0aW9uIHRvIHNlcnZlIGFzIHRoZSBzY2hlbWEgY29tcGlsZXJzCi0gKiBFeGNlcHRpb24KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1MjA5Mzk1NjAwNjA2MDgxNTdMOwotCi0JcHVibGljIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL1NjaGVtYUNvbXBpbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNzMwYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pMThuLlNjaGVtYUNvbXBpbGVyTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbC5QcmltaXRpdmVUeXBlRmluZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWwuUHJpbWl0aXZlVHlwZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbC5TY2hlbWFQcm9wZXJ0eUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU2NoZW1hVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQWxsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQW55OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQW55QXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQXR0cmlidXRlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFBdHRyaWJ1dGVHcm91cFJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNob2ljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4Q29udGVudFJlc3RyaWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29udGVudE1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVudW1lcmF0aW9uRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFeHRlcm5hbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hR3JvdXBCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hR3JvdXBSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFNYXhFeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU1heEluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hTWF4TGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFNaW5FeGNsdXNpdmVGYWNldDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU1pbkluY2x1c2l2ZUZhY2V0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hTWluTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0VGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVBhdHRlcm5GYWNldDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZUNvbnRlbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVDb250ZW50UmVzdHJpY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVVbmlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogU2NoZW1hIGNvbXBpbGVyIGZvciBBREIuIEJhc2VkIG9uIFdTLUNvbW1vbnMgc2NoZW1hIG9iamVjdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYUNvbXBpbGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9UWVBFID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QT05FTlRfRUxFTUVOVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0FUVFJJQlVURSA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0FUVFJJQlVURV9HUk9VUCA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0dST1VQID0gNTsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNjaGVtYUNvbXBpbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ29tcGlsZXJPcHRpb25zIG9wdGlvbnM7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb2Nlc3NlZFR5cGVtYXA7Ci0gICAgLy8gaGF2ZSB0byBrZWVwIGEgc2VwZXJhdGUgZ3JvdXAgdHlwZSBtYXAgc2luY2Ugc2FtZQotICAgIC8vIG5hbWUgY2FuIGJlIHVzZWQgdG8gZ3JvdXAgYW5kIGNvbXBsZXh0eXBlCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb2Nlc3NlZEdyb3VwVHlwZU1hcDsKLQotICAgIC8vdGhlIGxpc3Qgb2YgcHJvY2Vzc2VkRWxlbWVudHMgZm9yIHRoZSBvdXRlciBlbGVtZW50cwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRFbGVtZW50TWFwOwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcDsKLQotICAgIC8vd2UgbmVlZCB0aGlzIG1hcCB0byBrZWVwIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzLiB0aGVzZSBlbGVtZW50cyBuZWVkIHRvIGJlIGtlcHQgc2VwZXJhdGUKLSAgICAvL3RvIGF2b2lkIGNvbmZsaWN0cwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRFbGVtZW50UmVmTWFwOwotICAgIHByaXZhdGUgSGFzaE1hcCBzaW1wbGVUeXBlc01hcDsKLSAgICBwcml2YXRlIEhhc2hNYXAgY2hhbmdlZFR5cGVNYXA7Ci0KLSAgICBwcml2YXRlIEhhc2hTZXQgY2hhbmdlZFNpbXBsZVR5cGVTZXQ7Ci0gICAgcHJpdmF0ZSBIYXNoU2V0IGNoYW5nZWRDb21wbGV4VHlwZVNldDsKLSAgICBwcml2YXRlIEhhc2hTZXQgY2hhbmdlZEVsZW1lbnRTZXQ7Ci0KLSAgICAvLyB0aGlzIG1hcCBpcyBuZWNlc3NhcnkgdG8gcmV0YWluIHRoZSBtZXRhaW5mb3JtYXRpb24gb2YgdHlwZXMuIFRoZSByZWFzb24gd2h5IHRoZXNlCi0gICAgLy8gbWV0YSBpbmZvICdiYWdzJyB3b3VsZCBiZSB1c2VmdWwgbGF0ZXIgaXMgdG8gY2F0ZXIgZm9yIHRoZSBleHRlbnNpb25zIGFuZCByZXN0cmljdGlvbnMKLSAgICAvLyBvZiB0eXBlcwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRUeXBlTWV0YUluZm9NYXA7Ci0KLSAgICAvLwotICAgIHByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NlZEVsZW1lbnRMaXN0OwotCi0gICAgLy9hIGxpc3Qgb2YgbmlsbGFibGUgZWxlbWVudHMgLSB1c2VkIHRvIGdlbmVyYXRlIGNvZGUKLSAgICAvL2ZvciBuaWxsYWJsZSBlbGVtZW50cwotICAgIHByaXZhdGUgTGlzdCBuaWxsYWJsZUVsZW1lbnRMaXN0OwotICAgIC8vIHdyaXRlZSByZWZlcmVuY2UKLSAgICBwcml2YXRlIEJlYW5Xcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcCBiYXNlU2NoZW1hVHlwZU1hcCA9IG51bGw7Ci0KLSAgICAvL2EgbWFwIGZvciBrZWVwaW5nIHRoZSBhbHJlYWR5IGxvYWRlZCBzY2hlbWFzCi0gICAgLy90aGUga2V5IGlzIHRoZSB0YXJnZXRuYW1lc3BhY2UgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgc2NoZW1hIG9iamVjdAotICAgIHByaXZhdGUgTWFwIGxvYWRlZFNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLyBBIG1hcCBrZWVwaW5nIHRoZSBhdmFpbGFibGUgc2NoZW1hcwotICAgIC8vdGhlIGtleSBpcyB0aGUgdGFyZ2V0bmFtZXNwYWNlIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHNjaGVtYSBvYmplY3QKLSAgICAvL3RoaXMgbWFwIHdpbGwgYmUgcG9wdWxhdGVkIHdoZW4gbXVsdGlwbGUgc2NoZW1hcwotICAgIC8vYXJlIGZlZCB0byB0aGUgc2NoZW1hIGNvbXBpbGVyIQotICAgIHByaXZhdGUgTWFwIGF2YWlsYWJsZVNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIE1hcCBsb2FkZWRTb3VyY2VVUkkgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy8gYSBsaXN0IG9mIGV4dGVybmFsbHkgaWRlbnRpZmllZCBRTmFtZXMgdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGJlY29tZXMKLSAgICAvLyB1c2VmdWwgd2hlbiAgb25seSBhIGxpc3Qgb2YgZXh0ZXJuYWwgZWxlbWVudHMgbmVlZCB0byBiZSBwcm9jZXNzZWQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9FTEVNRU5UX0ZJRUxEX05BTUUgPSAiZXh0cmFFbGVtZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9BVFRSSUJVVEVfRklFTERfTkFNRSA9ICJleHRyYUF0dHJpYnV0ZXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX09QVElPTkFMID0gIm9wdGlvbmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9OT05FID0gIm5vbmUiOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJvY2Vzc2VzIGVsZW1lbnQgbWFwCi0gICAgICogICAgICAgICBpbmNsdWRlcyB0aGUgUW5hbWUgb2YgdGhlIGVsZW1lbnQgYXMgdGhlIGtleSBhbmQgYQotICAgICAqICAgICAgICAgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaE1hcCBnZXRQcm9jZXNzZWRFbGVtZW50TWFwKCkgewotICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRWxlbWVudE1hcDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBtYXAgb2YgUW5hbWUgdnMgbW9kZWxzLiBBIG1vZGVsIGNhbiBiZSBhbnl0aGluZywKLSAgICAgKiAgICAgICAgIHJhbmdpbmcgZnJvbSBhIERPTSBkb2N1bWVudCB0byBhIHN0cmVhbS4gVGhpcyBpcyB0YWtlbiBmcm9tIHRoZQotICAgICAqICAgICAgICAgd3JpdGVyIGFuZCB0aGUgc2NoZW1hIGNvbXBpbGVyIGhhcyBubyBjb250cm9sIG92ZXIgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldFByb2Nlc3NlZE1vZGVsTWFwKCkgewotICAgICAgICByZXR1cm4gd3JpdGVyLmdldE1vZGVsTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgLSBBY2NlcHRzIGEgb3B0aW9ucyBiZWFuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBTY2hlbWFDb21waWxlcihDb21waWxlck9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL2NyZWF0ZSBhbiBlbXB0eSBvcHRpb25zIG9iamVjdAotICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaW5zdGFudGlhdGUgdGhlIG1hcHMKLSAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHNpbXBsZVR5cGVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGNoYW5nZWRUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJvY2Vzc2VkVHlwZU1ldGFJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudFJlZk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG5pbGxhYmxlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgY2hhbmdlZENvbXBsZXhUeXBlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgY2hhbmdlZFNpbXBsZVR5cGVTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBjaGFuZ2VkRWxlbWVudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgLy9sb2FkIHRoZSB3cml0ZXIgYW5kIGluaXRpbGlhemUgdGhlIGJhc2UgdHlwZXMKLSAgICAgICAgd3JpdGVyID0gU2NoZW1hUHJvcGVydHlMb2FkZXIuZ2V0QmVhbldyaXRlckluc3RhbmNlKCk7Ci0gICAgICAgIHdyaXRlci5pbml0KHRoaXMub3B0aW9ucyk7Ci0KLSAgICAgICAgLy9sb2FkIHRoZSBiYXNlIHR5cGVzCi0gICAgICAgIGJhc2VTY2hlbWFUeXBlTWFwID0gU2NoZW1hUHJvcGVydHlMb2FkZXIuZ2V0VHlwZU1hcHBlckluc3RhbmNlKCkuZ2V0VHlwZU1hcCgpOwotICAgICAgICAvLyBhZGRpbmcgYWxsIHRoZSBzb2FwIGVuY29kaW5nIHNjaGVtYSBjbGFzc2VzCi0gICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0QWxsKFNjaGVtYVByb3BlcnR5TG9hZGVyLmdldFR5cGVNYXBwZXJJbnN0YW5jZSgpLmdldFNvYXBFbmNvZGluZ1R5cGVzTWFwKCkpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlIGEgbGlzdCBvZiBzY2hlbWFzCi0gICAgICogVGhpcyBhY3R1YWxseSBjYWxscyB0aGUgY29tcGlsZSAoWG1sU2NoZW1hIHMpIG1ldGhvZCByZXBlYXRlZGx5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NoZW1hbGlzdAotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKiBAc2VlICNjb21waWxlKG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoTGlzdCBzY2hlbWFsaXN0KSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpZiAoc2NoZW1hbGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vY2xlYXIgdGhlIGxvYWRlZCBhbmQgYXZhaWxhYmxlIG1hcHMKLSAgICAgICAgICAgIGxvYWRlZFNjaGVtYU1hcC5jbGVhcigpOwotICAgICAgICAgICAgYXZhaWxhYmxlU2NoZW1hTWFwLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWE7Ci0gICAgICAgICAgICAvLyBmaXJzdCByb3VuZCAtIHBvcHVsYXRlIHRoZSBhdmFpYWxibGUgbWFwCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVTY2hlbWFNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9zZXQgYSBtYXBwZXIgcGFja2FnZSBpZiBub3QgYXZhaWFsYWJsZQotICAgICAgICAgICAgaWYgKHdyaXRlci5nZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbnNwID0gbnVsbDsKLSAgICAgICAgICAgICAgICAvL2dldCB0aGUgZmlyc3Qgc2NoZW1hIGZyb20gdGhlIGxpc3QgYW5kIHRha2UgdGhhdCBuYW1lc3BhY2UgYXMgdGhlCi0gICAgICAgICAgICAgICAgLy9tYXBwZXIgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IG5zcCA9PSBudWxsICYmIGkgPCBzY2hlbWFsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5zcCA9ICgoWG1sU2NoZW1hKSBzY2hlbWFsaXN0LmdldChpKSkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobnNwICE9IG51bGwpICYmICFuc3AuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFbXSBzY2hlbWFzID0gU2NoZW1hVXRpbC5nZXRBbGxTY2hlbWFzKChYbWxTY2hlbWEpIHNjaGVtYWxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IHNjaGVtYXMgIT0gbnVsbCAmJiBqIDwgc2NoZW1hcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbnNwID0gc2NoZW1hc1tqXS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc3AgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnNwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbnNwID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG5hbWUgc3BhY2UgZXhpc3RzIGluIHRoZSBuczJwIGxpc3QgdGhlbiB3ZSB1c2UgaXQuCi0gICAgICAgICAgICAgICAgaWYgKChvcHRpb25zLmdldE5zMlBhY2thZ2VNYXAoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMuZ2V0TnMyUGFja2FnZU1hcCgpLmNvbnRhaW5zS2V5KG5zcCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5yZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKChTdHJpbmcpIG9wdGlvbnMuZ2V0TnMyUGFja2FnZU1hcCgpLmdldChuc3ApKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIucmVnaXN0ZXJFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZShVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKG5zcCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlY29uZCByb3VuZCAtIGNhbGwgdGhlIHNjaGVtYSBjb21waWxlciBvbmUgYnkgb25lCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb21waWxlKChYbWxTY2hlbWEpIHNjaGVtYWxpc3QuZ2V0KGkpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9maW5pc2ggdXAKLSAgICAgICAgICAgIGZpbmFsaXplU2NoZW1hQ29tcGlsYXRpb24oKTsKLQotICAgICAgICB9IGNhdGNoIChTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGlsZSAocmF0aGVyIGNvZGVnZW4pIGEgc2luZ2xlIHNjaGVtYSBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NoZW1hCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbXBpbGUoWG1sU2NoZW1hIHNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgY29tcGlsZShzY2hlbWEsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21waWxlIChyYXRoZXIgY29kZWdlbikgYSBzaW5nbGUgc2NoZW1hIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWEKLSAgICAgKiBAcGFyYW0gaXNQYXJ0b2ZHcm91cAotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGlsZShYbWxTY2hlbWEgc2NoZW1hLCBib29sZWFuIGlzUGFydG9mR3JvdXApIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gc29tZSBkb2N1bWVudHMgZXhwbGljaXRseSBpbXBvcnRzIHRoZSBzY2hlbWEgb2YgYnVpbHQgaW4gdHlwZXMuIFdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gY29tcGlsZQotICAgICAgICAvLyB0aGUgYnVpbHQtaW4gdHlwZXMuIFNvIGNoZWNrIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGhlcmUgYW5kIGlnbm9yZSBpdC4KLSAgICAgICAgaWYgKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL3JlZ2lzdGVyIHRoZSBwYWNrYWdlIGZyb20gdGhpcyBuYW1lc3BhY2UgYXMgdGhlIG1hcHBlciBjbGFzc2VzIHBhY2thZ2UKLSAgICAgICAgaWYgKCFpc1BhcnRvZkdyb3VwKSB7Ci0gICAgICAgICAgICAvL3NldCBhIG1hcHBlciBwYWNrYWdlIGlmIG5vdCBhdmFpYWxhYmxlCi0gICAgICAgICAgICBpZiAod3JpdGVyLmdldEV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlci5yZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vRmlyc3QgbG9vayBmb3IgdGhlIHNjaGVtYXMgdGhhdCBhcmUgaW1wb3J0ZWQgYW5kIHByb2Nlc3MgdGhlbQotICAgICAgICAvL05vdGUgdGhhdCB0aGVzZSBhcmUgcHJvY2Vzc2VkIHJlY3Vyc2l2ZWx5IQotCi0gICAgICAgIC8vYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGxvYWRlZCBzY2hlbWEgbGlzdAotICAgICAgICBpZiAoIWxvYWRlZFNjaGVtYU1hcC5jb250YWluc0tleShzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICBsb2FkZWRTY2hlbWFNYXAucHV0KHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIGhhdmUvYXJlIGxvYWRpbmcgYSBzY2hlbWEgd2l0aCBhIHNwZWNpZmljIHRhcmdldG5hbWVzcGFjZSBmcm9tIGEgY2VydGFpbiBVUkksCi0gICAgICAgIC8vIHRoZW4ganVzdCByZXR1cm4gYmFjayB0byB0aGUgY2FsbGVyIHRvIGF2b2lkIHJlY3Vyc2lvbi4KLSAgICAgICAgaWYgKHNjaGVtYS5nZXRTb3VyY2VVUkkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgc2NoZW1hLmdldFNvdXJjZVVSSSgpOwotICAgICAgICAgICAgaWYgKGxvYWRlZFNvdXJjZVVSSS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9hZGVkU291cmNlVVJJLnB1dChrZXksIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0ZW1wSXRlcmF0b3IgPSBpbmNsdWRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHRlbXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHRlbXBJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTEgPSAoKFhtbFNjaGVtYUltcG9ydCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIGNvbXBpbGUoc2NoZW1hMSwgaXNQYXJ0b2ZHcm91cCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIGNvbXBpbGUoc2NoZW1hMSwgaXNQYXJ0b2ZHcm91cCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZWxlY3QgYWxsIHRoZSBlbGVtZW50cy4gV2UgZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHR5cGVzCi0gICAgICAgIC8vb25seSBpZiB0aGUgZWxlbWVudHMgcmVmZXIgdGhlbSEhISByZWdhcmRsZXNzIG9mIHRoZSBmYWN0IHRoYXQKLSAgICAgICAgLy93ZSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50bmFtZXMsIHdlJ2xsIG5lZWQgdG8gcHJvY2VzcyBhbGwgdGhlIGVsZW1lbnRzCi0gICAgICAgIFhtbFNjaGVtYU9iamVjdFRhYmxlIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIHhtbFNjaGVtYUVsZW1lbnQxSXRlcmF0b3IgPSBlbGVtZW50cy5nZXRWYWx1ZXMoKTsKLSAgICAgICAgd2hpbGUgKHhtbFNjaGVtYUVsZW1lbnQxSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgdGhlIHNldCBvZiBvdXRlciBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGNsYXNzZXMKLSAgICAgICAgICAgIC8vVGhlIG91dGVybW9zdCBlbGVtZW50cyBkbyBub3QgY29udGFpbiBvY2N1cmVuY2UgY291bnRzICghKSBzbyB3ZSBkbyBub3QgbmVlZAotICAgICAgICAgICAgLy90byBjaGVjayBmb3IgYXJyYXl0eXBlcwotICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnQoKFhtbFNjaGVtYUVsZW1lbnQpIHhtbFNjaGVtYUVsZW1lbnQxSXRlcmF0b3IubmV4dCgpLCBzY2hlbWEpOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgeG1sU2NoZW1hRWxlbWVudDJJdGVyYXRvciA9IGVsZW1lbnRzLmdldFZhbHVlcygpOwotCi0gICAgICAgIC8vIHJlLWl0ZXJhdGUgdGhyb3VnaCB0aGUgZWxlbWVudHMgYW5kIHdyaXRlIHRoZW0gb25lIGJ5IG9uZQotICAgICAgICAvLyBpZiB0aGUgbW9kZSBpcyB1bnBhY2sgdGhpcyBwcm9jZXNzIHdpbGwgbm90IHJlYWxseSB3cml0ZSB0aGUKLSAgICAgICAgLy8gY2xhc3NlcyBidXQgd2lsbCBhY2N1bWlsYXRlIHRoZSBtb2RlbHMgZm9yIGEgZmluYWwgc2luZ2xlIHNob3QKLSAgICAgICAgLy8gd3JpdGUKLSAgICAgICAgd2hpbGUgKHhtbFNjaGVtYUVsZW1lbnQySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgdGhlIHNldCBvZiBvdXRlciBlbGVtZW50cyBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGNsYXNzZXMKLSAgICAgICAgICAgIHdyaXRlRWxlbWVudCgoWG1sU2NoZW1hRWxlbWVudCkgeG1sU2NoZW1hRWxlbWVudDJJdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuaXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB4bWxTY2hlbWFUeXBlczJJdGVyYXRvciA9IHNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmdldFZhbHVlcygpOwotICAgICAgICAgICAgd2hpbGUgKHhtbFNjaGVtYVR5cGVzMkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IChYbWxTY2hlbWFUeXBlKSB4bWxTY2hlbWFUeXBlczJJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBbHJlYWR5UHJvY2Vzc2VkKHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy93cml0ZSBjbGFzc2VzIGZvciBjb21wbGV4IHR5cGVzCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lZENvbXBsZXhTY2hlbWFUeXBlKGNvbXBsZXhUeXBlLCBzY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3Mgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNQYXJ0b2ZHcm91cCkgewotICAgICAgICAgICAgLy9jb21wbGV0ZSB0aGUgY29tcGlsYXRpb24KLSAgICAgICAgICAgIGZpbmFsaXplU2NoZW1hQ29tcGlsYXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBsZXRlcyB0aGUgc2NoZW1hIGNvbXBpbGF0aW9uIHByb2Nlc3MgYnkgd3JpdGluZyB0aGUKLSAgICAgKiBtYXBwZXJzIGFuZCB0aGUgY2xhc3NlcyBpbiBhIGJhdGNoIGlmIG5lZWRlZAotICAgICAqCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmaW5hbGl6ZVNjaGVtYUNvbXBpbGF0aW9uKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy93cml0ZSB0aGUgZXh0ZW5zaW9uIG1hcHBpbmcgY2xhc3MKLSAgICAgICAgd3JpdGVyLndyaXRlRXh0ZW5zaW9uTWFwcGVyKAotICAgICAgICAgICAgICAgIChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXJbXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW3Byb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5zaXplKCldKSk7Ci0KLQotICAgICAgICBpZiAob3B0aW9ucy5pc1dyYXBDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUJhdGNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNldHMgdGhlIGNoYW5nZWQgdHlwZXMKLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkQ29tcGxleFR5cGVTZXQuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0TmFtZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgeG1sU2NoZW1hU2ltcGxlVHlwZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRTaW1wbGVUeXBlU2V0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHhtbFNjaGVtYVNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB4bWxTY2hlbWFTaW1wbGVUeXBlLnNldE5hbWUobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGFuZ2VkRWxlbWVudFNldC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlTmFtZShudWxsKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgbWFwIG9mIHRoZSBzY2hlbWFjb21waWxlci4KLSAgICAgKiAgICAgICAgIEluIHRoaXMgY2FzZSBpdCB3b3VsZCBiZSB0aGUgcHJvcGVydHkgbWFwIGxvYWRlZCBmcm9tCi0gICAgICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0Q29tcGlsZXJQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gU2NoZW1hUHJvcGVydHlMb2FkZXIuZ2V0UHJvcGVydHlNYXAoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHhzRWx0Ci0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUVsZW1lbnQoWG1sU2NoZW1hRWxlbWVudCB4c0VsdCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAodGhpcy5wcm9jZXNzZWRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KHhzRWx0LmdldFFOYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSB4c0VsdC5nZXRTY2hlbWFUeXBlKCk7Ci0KLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgIGlmIChzY2hlbWFUeXBlICE9IG51bGwgJiYgc2NoZW1hVHlwZS5nZXROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy90aGlzIGlzIGEgbmFtZWQgdHlwZQotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzY2hlbWFUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAvL2ZpbmQgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHFOYW1lLCBpc0FycmF5KHhzRWx0KSk7Ci0KLSAgICAgICAgICAgIC8vdGhpcyBtZWFucyB0aGUgc2NoZW1hIHR5cGUgYWN0dWFsbHkgcmV0dXJucyBhIGRpZmZlcmVudCBRTmFtZQotICAgICAgICAgICAgaWYgKGNoYW5nZWRUeXBlTWFwLmNvbnRhaW5zS2V5KHFOYW1lKSkgewotICAgICAgICAgICAgICAgIG1ldGFpbmYucmVnaXN0ZXJNYXBwaW5nKHhzRWx0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoUU5hbWUpIGNoYW5nZWRUeXBlTWFwLmdldChxTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXRhaW5mLnJlZ2lzdGVyTWFwcGluZyh4c0VsdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBwcmVzZW50Ci0gICAgICAgICAgICBpZiAoeHNFbHQuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgbWV0YWluZi5yZWdpc3RlckRlZmF1bHRWYWx1ZSh4c0VsdC5nZXRRTmFtZSgpLHhzRWx0LmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQmluYXJ5KHhzRWx0KSkgewotICAgICAgICAgICAgICAgIG1ldGFpbmYuYWRkdFN0YXR1cyh4c0VsdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5CSU5BUllfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh4c0VsdC5nZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU2luY2UgdG9wIGxldmVsIGVsZW1lbnRzIHdvdWxkIG5vdCBoYXZlIHJlZmVyZW5jZXMKLSAgICAgICAgICAgIC8vIGFuZCB3ZSBvbmx5IHdyaXRlIHRvcGxldmVsIGVsZW1lbnRzLCB0aGlzIHNob3VsZAotICAgICAgICAgICAgLy8gbm90IGJlIGEgcHJvYmxlbSAsIGF0bGVhc3Qgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIGxlZ2FsIHNjaGVtYQotICAgICAgICB9IGVsc2UgaWYgKHhzRWx0LmdldFNjaGVtYVR5cGVOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB4c0VsdC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUocU5hbWUsIGlzQXJyYXkoeHNFbHQpKTsKLSAgICAgICAgICAgIG1ldGFpbmYucmVnaXN0ZXJNYXBwaW5nKHhzRWx0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotCi0KLSAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFUeXBlICE9IG51bGwpIHsgIC8vdGhlIG5hbWVkIHR5cGUgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkKLQotICAgICAgICAgICAgLy93ZSBhcmUgZ29pbmcgdG8gc3BlY2lhbCBjYXNlIHRoZSBhbm9ueW1vdXMgY29tcGxleCB0eXBlLiBPdXIgYWxnb3JpdGhtIGZvciBkZWFsaW5nCi0gICAgICAgICAgICAvL3dpdGggaXQgaXMgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgb2JqZWN0IHRoYXQgaGFzIHRoZSBjb21wbGV4IGNvbnRlbnQgaW5zaWRlLiBSZWFsbHkgdGhlCi0gICAgICAgICAgICAvL2ludGVudCBvZiB0aGUgdXNlciB3aGVuIGhlIGRlY2xhcmVzIHRoZSBjb21wbGV4VHlwZSBhbm9ueW1vdXNseSBpcyB0byB1c2UgaXQgcHJpdmF0ZWx5Ci0gICAgICAgICAgICAvL0ZpcnN0IGNvcHkgdGhlIHNjaGVtYSB0eXBlcyBjb250ZW50IGludG8gdGhlIG1ldGFpbmYgaG9sZGVyCi0gICAgICAgICAgICBtZXRhaW5mID0gKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcikgdGhpcy5wcm9jZXNzZWRBbm9ueW1vdXNDb21wbGV4VHlwZXNNYXAuZ2V0KHhzRWx0KTsKLSAgICAgICAgICAgIG1ldGFpbmYuc2V0QW5vbnltb3VzKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy90aGlzIG1lYW5zIHdlIGRpZCBub3QgZmluZCBhbnkgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0gICAgICAgICAgICBsb2cud2FybihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS5lbGVtZW50V2l0aE5vVHlwZSIsIHhzRWx0LmdldFFOYW1lKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcoeHNFbHQuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFOWV9UWVBFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuaWxsYWJsZUVsZW1lbnRMaXN0LmNvbnRhaW5zKHhzRWx0LmdldFFOYW1lKCkpKSB7Ci0gICAgICAgICAgICBtZXRhaW5mLnJlZ2lzdGVyTmlsbGFibGVRTmFtZSh4c0VsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgU3RyaW5nIHdyaXR0ZW5DbGFzc05hbWUgPSB3cml0ZXIud3JpdGUoeHNFbHQsIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YWluZik7Ci0gICAgICAgIC8vcmVnaXN0ZXIgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgeHNFbHQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLCB3cml0dGVuQ2xhc3NOYW1lKTsKLSAgICAgICAgcHJvY2Vzc2VkRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgd3JpdHRlbkNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIGlubmVyIGVsZW1lbnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0geHNFbHQKLSAgICAgKiBAcGFyYW0gaW5uZXJFbGVtZW50TWFwCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0VsZW1lbnQoWG1sU2NoZW1hRWxlbWVudCB4c0VsdCwgTWFwIGlubmVyRWxlbWVudE1hcCwgTGlzdCBsb2NhbE5pbGxhYmxlTGlzdCwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc0VsZW1lbnQoeHNFbHQsIGZhbHNlLCBpbm5lckVsZW1lbnRNYXAsIGxvY2FsTmlsbGFibGVMaXN0LCBwYXJlbnRTY2hlbWEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBvdXRlciBlbGVtZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIHhzRWx0Ci0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0VsZW1lbnQoWG1sU2NoZW1hRWxlbWVudCB4c0VsdCwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc0VsZW1lbnQoeHNFbHQsIHRydWUsIG51bGwsIG51bGwsIHBhcmVudFNjaGVtYSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhbmQgRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHhzRWx0Ci0gICAgICogQHBhcmFtIGlzT3V0ZXIgV2UgbmVlZCB0byBrbm93IHRoaXMgc2luY2UgdGhlIHRyZWF0bWVudCBvZiBvdXRlciBlbGVtZW50cyBpcyBkaWZmZXJlbnQgdGhhdAotICAgICAqICAgICAgICAgICAgICAgIGlubmVyIGVsZW1lbnRzCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRWxlbWVudChYbWxTY2hlbWFFbGVtZW50IHhzRWx0LCBib29sZWFuIGlzT3V0ZXIsIE1hcCBpbm5lckVsZW1lbnRNYXAsIExpc3QgbG9jYWxOaWxsYWJsZUxpc3QsIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9pZiB0aGUgZWxlbWVudCBpcyBudWxsLCB3aGljaCB1c3VhbGx5IGhhcHBlbnMgd2hlbiB0aGUgcW5hbWUgaXMgbm90Ci0gICAgICAgIC8vcHJvcGVyLCB0aHJvdyBhbiBleGNlcHRpb25zCi0gICAgICAgIGlmICh4c0VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hLmVsZW1lbnROdWxsIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9UaGUgcHJvY2Vzc2luZyBlbGVtZW50IGxvZ2ljIHNlZW1zIHRvIGJlIHF1aXRlIHNpbXBsZS4gTG9vayBhdCB0aGUgcmVsZXZhbnQgc2NoZW1hIHR5cGUKLSAgICAgICAgLy9mb3IgZWFjaCBhbmQgZXZlcnkgZWxlbWVudCBhbmQgcHJvY2VzcyB0aGF0IGFjY29yZGluZ2x5LgotICAgICAgICAvL3RoaXMgbWVhbnMgdGhhdCBhbnkgdW51c2VkIHR5cGUgZGVmaW5pdGlvbnMgd291bGQgbm90IGJlIGdlbmVyYXRlZCEKLSAgICAgICAgaWYgKGlzT3V0ZXIgJiYgcHJvY2Vzc2VkRWxlbWVudExpc3QuY29udGFpbnMoeHNFbHQuZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHhzRWx0LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc1NjaGVtYSh4c0VsdCwgc2NoZW1hVHlwZSwgcGFyZW50U2NoZW1hLCBmYWxzZSk7Ci0gICAgICAgICAgICAvL2F0IHRoaXMgdGltZSBpdCBpcyBub3Qgd2lzZSB0byBkaXJlY3RseSB3cml0ZSB0aGUgY2xhc3MgZm9yIHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAvL3NvIHdlIHB1c2ggdGhlIGNvbXBsZXRlIGVsZW1lbnQgdG8gYW4gYXJyYXlsaXN0IGFuZCBsZXQgdGhlIHByb2Nlc3MKLSAgICAgICAgICAgIC8vcGFzcyB0aHJvdWdoLiBXZSdsbCBiZSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgd3JpdGluZyB0aGVtCi0gICAgICAgICAgICAvL2xhdGVyCi0KLSAgICAgICAgICAgIGlmICghaXNPdXRlcikgewotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIG5hbWUuIFdoaWNoIG1lYW5zIHdlIGNhbiBkaXJlY3RseQotICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBpdAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShzY2hlbWFUeXBlLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheSh4c0VsdCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgc3RvcmUgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIGVsZW1lbnQgbWV0YSBJbmZvIGl0c2VsZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGRldGFpbHMgb25seSBuZWVkZWQgYnkgdGhlIHVud3JhcHBpZyB0byBzZXQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc1VzZVdyYXBwZXJDbGFzc2VzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVUeXBlRmluZGVyLmlzUHJpbWl0aXZlKGNsYXNzTmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHhzRWx0LmdldE1pbk9jY3VycygpID09IDApIHx8ICh4c0VsdC5pc05pbGxhYmxlKCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBQcmltaXRpdmVUeXBlV3JhcHBlci5nZXRXcmFwcGVyKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZS5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhzRWx0LmFkZE1ldGFJbmZvKFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSwgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNWYWx1ZShjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlLmFkZE1ldGFJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9QUklNSVRWRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGlzIGlzIGEgaW5uZXIgZWxlbWVudCB3ZSBzaG91bGQgYWRkIGl0IHRvIHRoZSBpbm5lciBlbGVtZW50IG1hcAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBpcyBhbiBhbm9uIHR5cGUuIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgcmVnaXN0ZXJlZCBhdAotICAgICAgICAgICAgICAgICAgICAvL3RoZSBhbm9uIG1hcC4gd2UndmUgdG8gd3JpdGUgaXQganVzdCBsaWtlIHdlIHRyZWF0IGEgcmVmZXJlbmNlZCB0eXBlKGdpdmluZyBkdWUKLSAgICAgICAgICAgICAgICAgICAgLy9jYXJlIHRoYXQgdGhpcyBpcyBtZWFudCB0byBiZSBhbiBhdHRyaWJ1dGUgaW4gc29tZSBjbGFzcykKLQotICAgICAgICAgICAgICAgICAgICBRTmFtZSBnZW5lcmF0ZWRUeXBlTmFtZSA9IGdlbmVyYXRlVHlwZVFOYW1lKHhzRWx0LmdldFFOYW1lKCksIHBhcmVudFNjaGVtYSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlLnNldE5hbWUoZ2VuZXJhdGVkVHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbXBsZXhUeXBlU2V0LmFkZChzY2hlbWFUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgZG8gdGhpcyB1cCBmcm9udCB0byBzdXBwb3J0IHJlY3Vyc2l2ZSB0eXBlcwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gd3JpdGVyLm1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShzY2hlbWFUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2NoZW1hVHlwZS5nZXRRTmFtZSgpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyID0gKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcikgcHJvY2Vzc2VkQW5vbnltb3VzQ29tcGxleFR5cGVzTWFwLmdldCh4c0VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldE93blFuYW1lKHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldE93bkNsYXNzTmFtZShmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ29tcGxleFR5cGUoKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVtb3ZlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgYW5vbiBsaXN0IHNpbmNlIHdlIG5hbWVkIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRBbm9ueW1vdXNDb21wbGV4VHlwZXNNYXAucmVtb3ZlKHhzRWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSwgaXNBcnJheSh4c0VsdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJFbGVtZW50TWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNFbHQuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy9zdG9yZSBpbiB0aGUgc2NoZW1hIG1hcCB0byByZXRyaXZlIGluIHRoZSB1bndyYXBwaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBhIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUuc2V0TmFtZShnZW5lcmF0ZWRUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkU2ltcGxlVHlwZVNldC5hZGQoc2NoZW1hVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGRvIHRoaXMgdXAgZnJvbnQgdG8gc3VwcG9ydCByZWN1cnNpdmUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2NoZW1hVHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KHNjaGVtYVR5cGUuZ2V0UU5hbWUoKSwgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlciA9IChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIpIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcC5nZXQoeHNFbHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25RbmFtZShzY2hlbWFUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25DbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNpbXBsZVR5cGUoKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBhbm9uIGxpc3Qgc2luY2Ugd2UgbmFtZWQgdGhlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEFub255bW91c0NvbXBsZXhUeXBlc01hcC5yZW1vdmUoeHNFbHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUoc2NoZW1hVHlwZS5nZXRRTmFtZSgpLCBpc0FycmF5KHhzRWx0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckVsZW1lbnRNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c0VsdC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIGluIHRoZSBzY2hlbWEgbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGJpbmFyeSBzdGF0dXMgb2YgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRFbGVtZW50TGlzdC5hZGQoeHNFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL3JlZmVyZW5jZWQgbmFtZQotICAgICAgICB9IGVsc2UgaWYgKHhzRWx0LmdldFJlZk5hbWUoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIGlmICh4c0VsdC5nZXRSZWZOYW1lKCkuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5YU0RfU0NIRU1BKSkgewotICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSByZWZlcmVuY2VkIHR5cGUuIEl0IGNvdWxkIGJlIHRob3VnaHQgdGhhdCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IHJlcGxhY2VzIHRoaXMKLSAgICAgICAgICAgIC8vZWxlbWVudAotICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSx4c0VsdC5nZXRSZWZOYW1lKCksQ09NUE9ORU5UX0VMRU1FTlQpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBlbGVtZW50ICIgKyB4c0VsdC5nZXRSZWZOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gcmVzb2x2ZWRTY2hlbWEuZ2V0RWxlbWVudEJ5TmFtZSh4c0VsdC5nZXRSZWZOYW1lKCkpOwotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS5yZWZlcmVuY2VkRWxlbWVudE5vdEZvdW5kIiwgeHNFbHQuZ2V0UmVmTmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaGVyZSB3aGF0IHdlIHdhbnQgaXMgdG8gc2V0IHRoZSBzY2hlbWEgdHlwZSBuYW1lIGZvciB0aGUgZWxlbWVudAotICAgICAgICAgICAgaWYgKChyZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGUoKS5nZXRRTmFtZSgpICE9IG51bGwpKXsKLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBlbGVtZW50IHJlZmVycyB0byBhbiBjb21wbGV4IHR5cGUgbmFtZQotICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRFbGVtZW50UmVmTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZEVsZW1lbnRSZWZNYXAucHV0KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZVNjaGVtYVR5cGVNYXAuZ2V0KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFR5cGVTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocmVzb2x2ZWRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZSA9IHJlc29sdmVkVHlwZVNjaGVtYS5nZXRUeXBlQnlOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWEocmVmZXJlbmNlZEVsZW1lbnQsIHhtbFNjaGVtYVR5cGUsIHJlc29sdmVkVHlwZVNjaGVtYSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZEVsZW1lbnRSZWZNYXAucHV0KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVHlwZW1hcC5nZXQocmVmZXJlbmNlZEVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0byBkbyBub3RoaW5nIHNpbmNlIHdlIGRvIG5vdCBnZW5lcmF0ZSBhIG5hbWUKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lID0gKFN0cmluZykgdGhpcy5wcm9jZXNzZWRUeXBlbWFwLmdldChyZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChyZWZlcmVuY2VkRWxlbWVudC5nZXRTY2hlbWFUeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRFbGVtZW50UmVmTWFwLmNvbnRhaW5zS2V5KHJlZmVyZW5jZWRFbGVtZW50LmdldFFOYW1lKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NjaGVtYShyZWZlcmVuY2VkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpLCByZXNvbHZlZFNjaGVtYSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gYW5vbm9tb3VzIGNvbXBsZXggdHlwZSB3ZSBoYXZlIHRvIHNldCB0aGlzCi0gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkRWxlbWVudFJlZk1hcC5wdXQocmVmZXJlbmNlZEVsZW1lbnQuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NlZFR5cGVtYXAuZ2V0KHJlZmVyZW5jZWRFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IChTdHJpbmcpIHRoaXMucHJvY2Vzc2VkVHlwZW1hcC5nZXQocmVmZXJlbmNlZEVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgeHNFbHQuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNjaGVtYSB0eXBlIG5hbWUgaXMgcHJlc2VudCBidXQgbm90IHRoZSBzY2hlbWEgdHlwZSBvYmplY3QKLSAgICAgICAgfSBlbHNlIGlmICh4c0VsdC5nZXRTY2hlbWFUeXBlTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vVGhlcmUgY2FuIGJlIGluc3RhbmNlcyB3aGVyZSB0aGUgU2NoZW1hVHlwZSBpcyBudWxsIGJ1dCB0aGUgc2NoZW1hVHlwZU5hbWUgaXMgbm90IQotICAgICAgICAgICAgLy90aGlzIHNwZWNpZmljYWxseSBoYXBwZW5zIHdpdGggeHNkOmFueVR5cGUuCi0gICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHhzRWx0LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsc2NoZW1hVHlwZU5hbWUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSB0eXBlQnlOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgIHR5cGVCeU5hbWUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKHNjaGVtYVR5cGVOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGVCeU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vdGhpcyB0eXBlIGlzIGZvdW5kIGluIHRoZSBzY2hlbWEgc28gd2UgY2FuIHByb2Nlc3MgaXQKLSAgICAgICAgICAgICAgICBwcm9jZXNzU2NoZW1hKHhzRWx0LCB0eXBlQnlOYW1lLCByZXNvbHZlZFNjaGVtYSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmICghaXNPdXRlcikgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShzY2hlbWFUeXBlTmFtZSwgaXNBcnJheSh4c0VsdCkpOwotICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoaXMgaXMgYSBpbm5lciBlbGVtZW50IHdlIHNob3VsZCBhZGQgaXQgdG8gdGhlIGlubmVyIGVsZW1lbnQgbWFwCi0gICAgICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBjbGFzcyBuYW1lIHRvIGJlIHVzZWQgaW4gdW53cmFwcGluZwotICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRFbGVtZW50TGlzdC5hZGQoeHNFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL3RoaXMgdHlwZSBpcyBub3QgZm91bmQgYXQgYWxsLiB3ZSdsbCBqdXN0IHJlZ2lzdGVyIGl0IHdpdGggd2hhdGV2ZXIgdGhlIGNsYXNzIG5hbWUgd2UgY2FuIGNvbWV1cCB3aXRoCi0gICAgICAgICAgICAgICAgaWYgKCFpc091dGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHNjaGVtYVR5cGVOYW1lLCBpc0FycmF5KHhzRWx0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlubmVyRWxlbWVudE1hcC5wdXQoeHNFbHQuZ2V0UU5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBjbGFzcyBuYW1lIHRvIGJlIHVzZWQgaW4gdW53cmFwcGluZwotICAgICAgICAgICAgICAgICAgICB4c0VsdC5hZGRNZXRhSW5mbyhTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzZWRFbGVtZW50TGlzdC5hZGQoeHNFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9hZGQgdGhpcyBlbGVtZW50cyBRTmFtZSB0byB0aGUgbmlsbGFibGUgZ3JvdXAgaWYgaXQgaGFzIHRoZSAgbmlsbGFibGUgYXR0cmlidXRlCi0gICAgICAgIGlmICh4c0VsdC5pc05pbGxhYmxlKCkpIHsKLSAgICAgICAgICAgIGlmIChpc091dGVyKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uaWxsYWJsZUVsZW1lbnRMaXN0LmFkZCh4c0VsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxOaWxsYWJsZUxpc3QuYWRkKHhzRWx0LmdldFFOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSB0eXBlIFFuYW1lIHVzaW5nIGFuIGVsZW1lbnQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZUVsdFFOYW1lCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqLwotICAgIHByaXZhdGUgUU5hbWUgZ2VuZXJhdGVUeXBlUU5hbWUoUU5hbWUgcmVmZXJlbmNlRWx0UU5hbWUsIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHsKLSAgICAgICAgUU5hbWUgZ2VuZXJhdGVkVHlwZU5hbWUgPSBuZXcgUU5hbWUocmVmZXJlbmNlRWx0UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNlRWx0UU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBnZXROZXh0VHlwZVN1ZmZpeChyZWZlcmVuY2VFbHRRTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICB3aGlsZSAocGFyZW50U2NoZW1hLmdldFR5cGVCeU5hbWUoZ2VuZXJhdGVkVHlwZU5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlZFR5cGVOYW1lID0gbmV3IFFOYW1lKHJlZmVyZW5jZUVsdFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VFbHRRTmFtZS5nZXRMb2NhbFBhcnQoKSArIGdldE5leHRUeXBlU3VmZml4KHJlZmVyZW5jZUVsdFFOYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlZFR5cGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHdoZXRoZXIgYSBnaXZlbiBjbGFzcyBpcyBhbHJlYWR5IG1hZGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FscmVhZHlQcm9jZXNzZWQoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NlZFR5cGVtYXAuY29udGFpbnNLZXkocU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgc2ltcGxlVHlwZXNNYXAuY29udGFpbnNLZXkocU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkocU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkR3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KHFOYW1lKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEEgbWV0aG9kIHRvIHBpY2sgdGhlIHJlZiBjbGFzcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBpc0FycmF5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmluZFJlZkNsYXNzTmFtZShRTmFtZSBuYW1lLCBib29sZWFuIGlzQXJyYXkpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcm9jZXNzZWRFbGVtZW50UmVmTWFwLmdldChuYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSAoU3RyaW5nKSBwcm9jZXNzZWRFbGVtZW50UmVmTWFwLmdldChuYW1lKTsKLQotICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAvL2FwcGVuZCB0aGUgc3F1YXJlIGJyYWNlcyB0aGF0IHNheSB0aGlzIGlzIGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgLy9ob3BlIHRoaXMgd29ya3MgZm9yIGFsbCBjYXNlcyEhISEhISEKLSAgICAgICAgICAgICAgICAvL3RvZG8gdGhpcyBob3dldmVyIGlzIGEgdGhpbmcgdGhhdCBuZWVkcyB0byBiZQotICAgICAgICAgICAgICAgIC8vdG9kbyBmaXhlZCB0byBnZXQgY29tcGxldGUgbGFuZ3VhZ2Ugc3VwcG9ydAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSArICJbXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGEgY2xhc3MgbmFtZSBmcm9tIHRoZSBnaXZlbiBRbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGlzQXJyYXkKLSAgICAgKiBAcmV0dXJuIEZRQ04KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBmaW5kQ2xhc3NOYW1lKFFOYW1lIHFOYW1lLCBib29sZWFuIGlzQXJyYXkpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9maW5kIHRoZSBjbGFzcyBuYW1lCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWU7Ci0gICAgICAgIGlmIChwcm9jZXNzZWRUeXBlbWFwLmNvbnRhaW5zS2V5KHFOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gKFN0cmluZykgcHJvY2Vzc2VkVHlwZW1hcC5nZXQocU5hbWUpOwotICAgICAgICB9IGVsc2UgaWYgKHNpbXBsZVR5cGVzTWFwLmNvbnRhaW5zS2V5KHFOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gKFN0cmluZykgc2ltcGxlVHlwZXNNYXAuZ2V0KHFOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlU2NoZW1hVHlwZU1hcC5jb250YWluc0tleShxTmFtZSkpIHsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IChTdHJpbmcpIGJhc2VTY2hlbWFUeXBlTWFwLmdldChxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNTT0FQX0VOQyhxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEuc29hcGVuY29kaW5nLmVycm9yIiwgcU5hbWUudG9TdHJpbmcoKSkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSBzZWVtIHRvIGhhdmUgZmFpbGVkIGluIGZpbmRpbmcgYSBjbGFzcyBuYW1lIGZvciB0aGUKLSAgICAgICAgICAgIC8vY29udGFpbmVkIHNjaGVtYSB0eXBlLiBXZSBiZXR0ZXIgc2V0IHRoZSBkZWZhdWx0IHRoZW4KLSAgICAgICAgICAgIC8vaG93ZXZlciBpdCdzIGJldHRlciBpZiB0aGUgZGVmYXVsdCBjYW4gYmUgc2V0IHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvL3Byb3BlcnR5IGZpbGUKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IHdyaXRlci5nZXREZWZhdWx0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICBsb2cud2FybihTY2hlbWFDb21waWxlck1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzY2hlbWEudHlwZU1pc3NpbmciLCBxTmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNBcnJheSkgewotICAgICAgICAgICAgLy9hcHBlbmQgdGhlIHNxdWFyZSBicmFjZXMgdGhhdCBzYXkgdGhpcyBpcyBhbiBhcnJheQotICAgICAgICAgICAgLy9ob3BlIHRoaXMgd29ya3MgZm9yIGFsbCBjYXNlcyEhISEhISEKLSAgICAgICAgICAgIC8vdG9kbyB0aGlzIGhvd2V2ZXIgaXMgYSB0aGluZyB0aGF0IG5lZWRzIHRvIGJlCi0gICAgICAgICAgICAvL3RvZG8gZml4ZWQgdG8gZ2V0IGNvbXBsZXRlIGxhbmd1YWdlIHN1cHBvcnQKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSArICJbXSI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgU09BUF9FTkMgTmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkkgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgPGNvZGU+czwvY29kZT4gbWF0Y2hlcyBhIFNPQVAgRU5DT0RJTkcgbmFtZXNwYWNlIFVSSSwKLSAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NPQVBfRU5DKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzLmVxdWFscyhDb25zdGFudHMuVVJJX1NPQVAxMV9FTkMpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIHJldHVybiBzLmVxdWFscyhDb25zdGFudHMuVVJJX1NPQVAxMl9FTkMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBzY2hlbWEgZWxlbWVudCB3aGljaCBoYXMgYmVlbiByZWZlcmVkIHRvIGJ5IGFuIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWFUeXBlCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKFhtbFNjaGVtYUVsZW1lbnQgeHNFbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1dyaXRlQW5vbkNvbXBsZXhUeXBlKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICAvL3dyaXRlIGNsYXNzZXMgZm9yIGNvbXBsZXggdHlwZXMKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgLy8gY29tcGxleCB0eXBlIG5hbWUgbWF5IG5vdCBiZSBudWxsIGlmIHdlIGhhdmUgc2V0IGl0Ci0gICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwgJiYgIXRoaXMuY2hhbmdlZENvbXBsZXhUeXBlU2V0LmNvbnRhaW5zKHNjaGVtYVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVyZSBjb21wbGV4IHR5cGUgbWF5IGJlIGluIGFub3RoZXIgc2hjZW1hIHNvIHdlIGhhdmUgdG8gZmluZCB0aGUKLSAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IHBhcmVudCBzY2hlbWEuCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxjb21wbGV4VHlwZS5nZXRRTmFtZSgpLENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBwYXJlbnQgc2NoZW1hIGZvciB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXggdHlwZSAiICsgY29tcGxleFR5cGUuZ2V0UU5hbWUoKSArICIgZnJvbSB0aGUgcGFyZW50IHNjaGVtYSAiICsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lZENvbXBsZXhTY2hlbWFUeXBlKGNvbXBsZXhUeXBlLCByZXNvbHZlZFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQW5vbnltb3VzQ29tcGxleFNjaGVtYVR5cGUoeHNFbHQsIGNvbXBsZXhUeXBlLCBwYXJlbnRTY2hlbWEsIGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAvL3Byb2Nlc3Mgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKChYbWxTY2hlbWFTaW1wbGVUeXBlKSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICB4c0VsdCwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U2NoZW1hLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQW5vbnltb3VzQ29tcGxleFNjaGVtYVR5cGUoWG1sU2NoZW1hRWxlbWVudCBlbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vaGVyZSB3ZSBoYXZlIGEgcHJvYmxlbSB3aGVuIHByb2Nlc3NpbmcgdGhlIGNpcmN1bGFyZSBlbGVtZW50Ci0gICAgICAgIC8vIHJlZmVyZW5jZXMgaWYgd2UgZGlmZmVyIHRoaXMgcHJvY2Vzc2luZwotICAgICAgICAvLyBnZW5lcmF0ZSBhIG5hbWUgdG8gdGhlIGNvbXBsZXggdHlwZSBhbmQgcmVnaXN0ZXIgaXQgaGVyZQotICAgICAgICBRTmFtZSBnZW5lcmF0ZWRUeXBlTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpIHsKLQotICAgICAgICAgICAgZ2VuZXJhdGVkVHlwZU5hbWUgPSBnZW5lcmF0ZVR5cGVRTmFtZShlbHQuZ2V0UU5hbWUoKSwgcGFyZW50U2NoZW1hKTsKLQotICAgICAgICAgICAgaWYgKGVsdC5nZXRTY2hlbWFUeXBlTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbHQuc2V0U2NoZW1hVHlwZU5hbWUoZ2VuZXJhdGVkVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZEVsZW1lbnRTZXQuYWRkKGVsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vc2V0IGEgbmFtZQotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0TmFtZShnZW5lcmF0ZWRUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB0aGlzLmNoYW5nZWRDb21wbGV4VHlwZVNldC5hZGQoY29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICBqYXZhQ2xhc3NOYW1lID0gd3JpdGVyLm1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShnZW5lcmF0ZWRUeXBlTmFtZSk7Ci0gICAgICAgICAgICBwcm9jZXNzZWRUeXBlbWFwLnB1dChnZW5lcmF0ZWRUeXBlTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLnByb2Nlc3NlZEVsZW1lbnRSZWZNYXAucHV0KGVsdC5nZXRRTmFtZSgpLCBqYXZhQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGNvbXBsZXhUeXBlLmFkZE1ldGFJbmZvKFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSwgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyID0gcHJvY2Vzc0NvbXBsZXhUeXBlKGVsdC5nZXRRTmFtZSgpLGNvbXBsZXhUeXBlLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgIC8vIGhlcmUgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHdlIGdlbmVyYXRlIHRoZSBjbGFzcwotICAgICAgICAvLyBpcnJlc3BlY3RpdmUgb2Ygd2hlcmUgd2UgbmVlZCBpdCBvciBub3QKLSAgICAgICAgaWYgKGlzV3JpdGVBbm9uQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0T3duQ2xhc3NOYW1lKGphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25RbmFtZShnZW5lcmF0ZWRUeXBlTmFtZSk7Ci0gICAgICAgICAgICB3cml0ZUNvbXBsZXhUeXBlKGNvbXBsZXhUeXBlLCBtZXRhSW5mSG9sZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2luY2UgdGhpcyBpcyBhIHNwZWNpYWwgY2FzZSAoYW4gdW5uYW1lZCBjb21wbGV4IHR5cGUpIHdlJ2xsIHB1dCB0aGUgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgICAgLy9tZXRhaW5mIGhvbGRlciBpbiBhIHNwZWNpYWwgbWFwIHRvIGJlIHVzZWQgbGF0ZXIKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRBbm9ueW1vdXNDb21wbGV4VHlwZXNNYXAucHV0KGVsdCwgbWV0YUluZkhvbGRlcik7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoYW5kbGUgdGhlIGNvbXBsZXggdHlwZXMgd2hpY2ggYXJlIG5hbWVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGxleFR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc05hbWVkQ29tcGxleFNjaGVtYVR5cGUoWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHByb2Nlc3NlZFR5cGVtYXAuY29udGFpbnNLZXkoY29tcGxleFR5cGUuZ2V0UU5hbWUoKSkKLSAgICAgICAgICAgICAgICB8fCBiYXNlU2NoZW1hVHlwZU1hcC5jb250YWluc0tleShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTXVzdCBkbyB0aGlzIHVwIGZyb250IHRvIHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzCi0gICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoY29tcGxleFR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KGNvbXBsZXhUeXBlLmdldFFOYW1lKCksIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQotICAgICAgICAvL3JlZ2lzdGVyIHRoYXQgaW4gdGhlIHNjaGVtYSBtZXRhaW5mbyBiYWcKLSAgICAgICAgY29tcGxleFR5cGUuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZLAotICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlciA9IHByb2Nlc3NDb21wbGV4VHlwZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpLGNvbXBsZXhUeXBlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAvL2FkZCB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBtZXRhaW5mbyBob2xkZXIKLSAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25RbmFtZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgbWV0YUluZkhvbGRlci5zZXRPd25DbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICAvL3dyaXRlIHRoZSBjbGFzcy4gVGhpcyB0eXBlIG1hcHBpbmcgd291bGQgaGF2ZSBiZWVuIHBvcHVsYXRlZCByaWdodCBub3cKLSAgICAgICAgLy9Ob3RlIC0gV2UgYWx3YXlzIHdyaXRlIGNsYXNzZXMgZm9yIG5hbWVkIGNvbXBsZXggdHlwZXMKLSAgICAgICAgd3JpdGVDb21wbGV4VHlwZShjb21wbGV4VHlwZSwgbWV0YUluZkhvbGRlcik7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIGNvbXBsZXggdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlCi0gICAgICogQHBhcmFtIG1ldGFJbmZIb2xkZXIKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3JpdGVDb21wbGV4VHlwZShYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IHdyaXRlci53cml0ZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YUluZkhvbGRlciwgY29tcGxleFR5cGUuaXNBYnN0cmFjdCgpKTsKLSAgICAgICAgcHJvY2Vzc2VkVHlwZU1ldGFJbmZvTWFwLnB1dChjb21wbGV4VHlwZS5nZXRRTmFtZSgpLCBtZXRhSW5mSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc05hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgY29tcGxleCBTZXF1ZW5jZSxDaG9pY2UsIGFsbCBlbGVtZW50cwotICAgICAqIEBwYXJhbSBxbmFtZSBjb21wbGV4IHR5cGUgcW5hbWUKLSAgICAgKiBAcGFyYW0gbWV0YUluZkhvbGRlcgotICAgICAqIEByZXR1cm4gIHdyaXR0ZW4gamF2YSBjbGFzcyBuYW1lCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotCi0KLSAgICBwcml2YXRlIFN0cmluZyB3cml0ZUNvbXBsZXhQYXJ0aWNsZShRTmFtZSBxbmFtZSxCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlcikKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZXIud3JpdGUocW5hbWUsIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YUluZkhvbGRlcixmYWxzZSk7Ci0gICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5wdXQocW5hbWUsIG1ldGFJbmZIb2xkZXIpOwotICAgICAgICByZXR1cm4gamF2YUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBjb21wbGV4IHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzaW1wbGVUeXBlCi0gICAgICogQHBhcmFtIG1ldGFJbmZIb2xkZXIKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2ltcGxlVHlwZShYbWxTY2hlbWFTaW1wbGVUeXBlIHNpbXBsZVR5cGUsIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVyLndyaXRlKHNpbXBsZVR5cGUsIHByb2Nlc3NlZFR5cGVtYXAsIHByb2Nlc3NlZEdyb3VwVHlwZU1hcCwgbWV0YUluZkhvbGRlcik7Ci0gICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5wdXQoc2ltcGxlVHlwZS5nZXRRTmFtZSgpLCBtZXRhSW5mSG9sZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwcm9jZXNzQ29tcGxleFR5cGUoCi0gICAgICAgICAgICBRTmFtZSBwYXJlbnRFbGVtZW50UU5hbWUsCi0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwKLSAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gY29tcGxleFR5cGUuZ2V0UGFydGljbGUoKTsKLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgIGlmIChwYXJ0aWNsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1Byb2Nlc3MgdGhlIHBhcnRpY2xlCi0gICAgICAgICAgICBwcm9jZXNzUGFydGljbGUocGFyZW50RWxlbWVudFFOYW1lLCBwYXJ0aWNsZSwgbWV0YUluZkhvbGRlciwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcHJvY2VzcyBhdHRyaWJ1dGVzIC0gZmlyc3QgbG9vayBmb3IgdGhlIGV4cGxpY2l0IGF0dHJpYnV0ZXMKLSAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZXMoY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlcygpLG1ldGFJbmZIb2xkZXIscGFyZW50U2NoZW1hKTsKLQotICAgICAgICAvL3Byb2Nlc3MgYW55IGF0dHJpYnV0ZQotICAgICAgICAvL3NvbWVob3cgdGhlIHhtbCBzY2hlbWEgcGFyc2VyIGRvZXMgbm90IHNlZW0gdG8gcGlja3VwIHRoZSBhbnkgYXR0cmlidXRlISEKLSAgICAgICAgWG1sU2NoZW1hQW55QXR0cmlidXRlIGFueUF0dCA9IGNvbXBsZXhUeXBlLmdldEFueUF0dHJpYnV0ZSgpOwotICAgICAgICBpZiAoYW55QXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3NBbnlBdHRyaWJ1dGUobWV0YUluZkhvbGRlciwgYW55QXR0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy9wcm9jZXNzIGNvbnRlbnQgLGVpdGhlciAgY29tcGxleCBvciBzaW1wbGUKLSAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldENvbnRlbnRNb2RlbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb2Nlc3NDb250ZW50TW9kZWwoY29tcGxleFR5cGUuZ2V0Q29udGVudE1vZGVsKCksCi0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGFJbmZIb2xkZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIGF0dHJpYkl0ZXJhdG9yID0gYXR0cmlidXRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoYXR0cmliSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGF0dHJpYkl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0F0dHJpYnV0ZSgoWG1sU2NoZW1hQXR0cmlidXRlKSBvLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlR3JvdXBSZWYpewotICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVHcm91cFJlZmVyZW5jZSgoWG1sU2NoZW1hQXR0cmlidXRlR3JvdXBSZWYpbyxtZXRhSW5mSG9sZGVyLHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZUdyb3VwUmVmZXJlbmNlKFhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwUmVmIGF0dHJpYnV0ZUdyb3VwUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFFOYW1lIGF0dHJpYnV0ZUdyb3VwUmVmTmFtZSA9IGF0dHJpYnV0ZUdyb3VwUmVmLmdldFJlZk5hbWUoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZUdyb3VwUmVmTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxhdHRyaWJ1dGVHcm91cFJlZk5hbWUsQ09NUE9ORU5UX0FUVFJJQlVURV9HUk9VUCk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVHcm91cFJlZk5hbWUgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwIHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFBdHRyaWJ1dGVHcm91cCkgcmVzb2x2ZWRTY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBzKCkuZ2V0SXRlbShhdHRyaWJ1dGVHcm91cFJlZk5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFBdHRyaWJ1dGVHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKHhtbFNjaGVtYUF0dHJpYnV0ZUdyb3VwLmdldEF0dHJpYnV0ZXMoKSwgbWV0YUluZkhvbGRlciwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBmaW5kIGFuIGF0dHJpYnV0ZSBncm91cCBmb3IgZ3JvdXAgcmVmZXJlbmNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZUdyb3VwUmVmTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oIk5vIGdyb3VwIHJlZmVybmNlIGhhcyBnaXZlbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgY29udGVudCBtb2RlbHMuIEEgY29udGVudCBtb2RlbCBpcyBlaXRoZXIgc2ltcGxlIHR5cGUgb3IgYSBjb21wbGV4IHR5cGUKLSAgICAgKiBhbmQgaW5jbHVkZWQgaW5zaWRlIGEgY29tcGxleCBjb250ZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb250ZW50TW9kZWwoWG1sU2NoZW1hQ29udGVudE1vZGVsIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NDb21wbGV4Q29udGVudCgoWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIGNvbnRlbnQsIG1ldGFJbmZIb2xkZXIsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZUNvbnRlbnQpIHsKLSAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVDb250ZW50KChYbWxTY2hlbWFTaW1wbGVDb250ZW50KSBjb250ZW50LCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJjZXNzIHRoZSBjb21wbGV4IGNvbnRlbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbXBsZXhDb250ZW50KFhtbFNjaGVtYUNvbXBsZXhDb250ZW50IGNvbXBsZXhDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hQ29udGVudCBjb250ZW50ID0gY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpOwotCi0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLQotICAgICAgICAgICAgLy8gdG8gaGFuZGxlIGV4dGVuc2lvbiB3ZSBuZWVkIHRvIGF0dGFjaCB0aGUgZXh0ZW5kZWQgaXRlbXMgdG8gdGhlIGJhc2UgdHlwZQotICAgICAgICAgICAgLy8gYW5kIGNyZWF0ZSBhIG5ldyB0eXBlCi0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbiBleHRlbnNpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pY29udGVudDsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBiYXNlIHR5cGUgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKLSAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAvL3BpY2sgdGhlIHJlbGV2YW50IGJhc2V0eXBlIGZyb20gdGhlIHNjaGVtYSBhbmQgcHJvY2VzcyBpdAotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBjb21wbGV5IHR5cGUgIiArIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgdHlwZSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhUeXBlLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc05hbWVkQ29tcGxleFNjaGVtYVR5cGUoY29tcGxleFR5cGUsIHJlc29sdmVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIGlzIG5vdCBwb3NzaWJsZS4gVGhlIGV4dGVuc2lvbiBzaG91bGQgYWx3YXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9oYXZlIGEgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiVW5uYW1lZCBjb21wbGV4IHR5cGUgdXNlZCBpbiBleHRlbnNpb24iKTsvL0ludGVybmF0aW9ubGl6ZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJvY2VzcyBzaW1wbGUgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHR5cGUsIG51bGwsIHJlc29sdmVkU2NoZW1hLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBiZWZvcmUgYWN0dWFsbHkgcHJvY2Vzc2luZyB0aGlzIG5vZGUsIHdlIG5lZWQgdG8gcmVjdXJzZSB0aHJvdWdoIHRoZSBiYXNlIHR5cGVzIGFuZCBhZGQgdGhlaXIKLSAgICAgICAgICAgIC8vIGNoaWxkcmVuIChzb21ldGltZXMgZXZlbiBwcmVzZXJ2aW5nIHRoZSBvcmRlcikgdG8gdGhlIG1ldGFpbmZvIGhvbGRlciBvZiB0aGlzIHR5cGUKLSAgICAgICAgICAgIC8vIHRoZSByZWFzb24gaXMgdGhhdCBmb3IgZXh0ZW5zaW9ucywgdGhlIHByZWZlcmVkIHdheSBpcyB0byBoYXZlIHRoZSBzZXF1ZW5jZXMgb2YgdGhlIGJhc2UgY2xhc3MKLSAgICAgICAgICAgIC8vKiBiZWZvcmUgKiB0aGUgc2VxdWVuY2Ugb2YgdGhlIGNoaWxkIGVsZW1lbnQuCi0gICAgICAgICAgICBjb3B5TWV0YUluZm9IaWVyYXJjaHkobWV0YUluZkhvbGRlciwgZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIHBhcnRpY2xlIG9mIHRoaXMgbm9kZQotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRQYXJ0aWNsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUGFydGljbGUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLGV4dGVuc2lvbi5nZXRQYXJ0aWNsZSgpLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIC8vcHJvY2VzcyBhdHRyaWJ1dGVzIC0gZmlyc3QgbG9vayBmb3IgdGhlIGV4cGxpY2l0IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKGV4dGVuc2lvbi5nZXRBdHRyaWJ1dGVzKCksbWV0YUluZkhvbGRlcixwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYW55IGF0dHJpYnV0ZQotICAgICAgICAgICAgLy9zb21laG93IHRoZSB4bWwgc2NoZW1hIHBhcnNlciBkb2VzIG5vdCBzZWVtIHRvIHBpY2t1cCB0aGUgYW55IGF0dHJpYnV0ZSEhCi0gICAgICAgICAgICBYbWxTY2hlbWFBbnlBdHRyaWJ1dGUgYW55QXR0ID0gZXh0ZW5zaW9uLmdldEFueUF0dHJpYnV0ZSgpOwotICAgICAgICAgICAgaWYgKGFueUF0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0FueUF0dHJpYnV0ZShtZXRhSW5mSG9sZGVyLCBhbnlBdHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGlmICghd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vdGhlIHBhcnRpY2xlIGhhcyBiZWVuIHByb2Nlc3NlZCwgSG93ZXZlciBzaW5jZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy9hZGQgdGhlIGJhc2V0eXBlIGFzIGFuIGV4dGVuc2lvbiB0byB0aGUgY29tcGxleCB0eXBlIGNsYXNzLgotICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNldHlwZSBoYXMgYmVlbiBwcm9jZXNzZWQgYWxyZWFkeQotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uKHRydWUpOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgLy9Ob3RlICAtIHRoaXMgaXMgbm8gYXJyYXkhIHNvIHRoZSBhcnJheSBib29sZWFuIGlzIGZhbHNlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50UmVzdHJpY3Rpb24pIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50UmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRSZXN0cmljdGlvbikgY29udGVudDsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBiYXNlIHR5cGUgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKLSAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIC8vcGljayB0aGUgcmVsZXZhbnQgYmFzZXR5cGUgZnJvbSB0aGUgc2NoZW1hIGFuZCBwcm9jZXNzIGl0Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgcmVzdHJpY3Rpb24uZ2V0QmFzZVR5cGVOYW1lKCksIENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgY29tcGxleCB0eXBlICIgKyByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgdHlwZSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZWRDb21wbGV4U2NoZW1hVHlwZShjb21wbGV4VHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IHBvc3NpYmxlLiBUaGUgcmVzdHJpY3Rpb24gc2hvdWxkIGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGF2ZSBhIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oIlVubmFtZWQgY29tcGxleCB0eXBlIHVzZWQgaW4gcmVzdHJpY3Rpb24iKTsvL0ludGVybmF0aW9ubGl6ZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiTm90IGEgdmFsaWQgcmVzdHJpY3Rpb24sIGNvbXBsZXggY29udGVudCByZXN0cmljdGlvbiBiYXNlIHR5cGUgY2Fubm90IGJlIGEgc2ltcGxlIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShtZXRhSW5mSG9sZGVyLCByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgcGFyZW50U2NoZW1hKTsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBwYXJ0aWNsZSBvZiB0aGlzIG5vZGUKLSAgICAgICAgICAgIHByb2Nlc3NQYXJ0aWNsZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSxyZXN0cmljdGlvbi5nZXRQYXJ0aWNsZSgpLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYXR0cmlidXRlcyAtIGZpcnN0IGxvb2sgZm9yIHRoZSBleHBsaWNpdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlcyhyZXN0cmljdGlvbi5nZXRBdHRyaWJ1dGVzKCksbWV0YUluZkhvbGRlcixwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYW55IGF0dHJpYnV0ZQotICAgICAgICAgICAgLy9zb21laG93IHRoZSB4bWwgc2NoZW1hIHBhcnNlciBkb2VzIG5vdCBzZWVtIHRvIHBpY2t1cCB0aGUgYW55IGF0dHJpYnV0ZSEhCi0gICAgICAgICAgICBYbWxTY2hlbWFBbnlBdHRyaWJ1dGUgYW55QXR0ID0gcmVzdHJpY3Rpb24uZ2V0QW55QXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoYW55QXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQW55QXR0cmlidXRlKG1ldGFJbmZIb2xkZXIsIGFueUF0dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgZmFsc2UpOwotCi0gICAgICAgICAgICBpZiAoIXdyaXRlci5nZXREZWZhdWx0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFJlc3RyaWN0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0UmVzdHJpY3Rpb25DbGFzc05hbWUoZmluZENsYXNzTmFtZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICAvL05vdGUgIC0gdGhpcyBpcyBubyBhcnJheSEgc28gdGhlIGFycmF5IGJvb2xlYW4gaXMgZmFsc2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdG8gcG9wdWxhdGUgdGhlIG1ldGFpbmZvIGhvbGRlcnMgd2l0aCBpbmZvIGZyb20gdGhlIGJhc2UgdHlwZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRhSW5mSG9sZGVyCi0gICAgICogQHBhcmFtIGJhc2VUeXBlTmFtZQotICAgICAqIEBwYXJhbSBwYXJlbnRTY2hlbWEKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weU1ldGFJbmZvSGllcmFyY2h5KEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYmFzZVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxiYXNlVHlwZU5hbWUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IGZpbmQgdHlwZSAiICsgYmFzZVR5cGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSB0eXBlID0gcmVzb2x2ZWRTY2hlbWEuZ2V0VHlwZUJ5TmFtZShiYXNlVHlwZU5hbWUpOwotICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIGJhc2VNZXRhSW5mb0hvbGRlciA9IChCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIpCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNZXRhSW5mb01hcC5nZXQoYmFzZVR5cGVOYW1lKTsKLQotCi0gICAgICAgICAgICBpZiAoYmFzZU1ldGFJbmZvSG9sZGVyICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhbHNvIGV4dGVuZGVkIGZyb20gc29tZSBvdGhlciB0eXBlIGZpcnN0Ci0gICAgICAgICAgICAgICAgLy8gaWYgc28gcHJvY2VlZCB0byBzZXQgdGhlaXIgcGFyZW50cyBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV4VHlwZS5nZXRDb250ZW50TW9kZWwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb250ZW50TW9kZWwgY29udGVudCA9IGNvbXBsZXhUeXBlLmdldENvbnRlbnRNb2RlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50IGNvbXBsZXhDb250ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgY29udGVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24gZXh0ZW5zaW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIGNvbXBsZXhDb250ZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZWN1cnNpdmVseSBjYWxsIHRoZSBjb3B5TWV0YUluZm9IaWVyYXJjaHkgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShiYXNlTWV0YUluZm9Ib2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGxleENvbnRlbnQuZ2V0Q29udGVudCgpIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRSZXN0cmljdGlvbikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50UmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFDb21wbGV4Q29udGVudFJlc3RyaWN0aW9uKSBjb21wbGV4Q29udGVudC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVjdXJzaXZlbHkgY2FsbCB0aGUgY29weU1ldGFJbmZvSGllcmFyY2h5IG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5TWV0YUluZm9IaWVyYXJjaHkoYmFzZU1ldGFJbmZvSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS51bmtub3duY29udGVudGVycm9yIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlQ29udGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hLnVuc3VwcG9ydGVkY29udGVudGVycm9yIiwgIlNpbXBsZSBDb250ZW50IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS51bmtub3duY29udGVudGVycm9yIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vRG8gdGhlIGFjdHVhbCBwYXJlbnQgc2V0dGluZwotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEFzUGFyZW50KGJhc2VNZXRhSW5mb0hvbGRlcik7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjb3B5IHRoZSB1aW9uIGRhdGEgaWYgdGhlIHBhcmVudCBzaW1wbGUgdHlwZSByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyBpcyBhbiB1bmlvbgotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHVuaW9uIGF0dHJpYnV0ZSBpcyBjb3BpZWQgZnJvbSB0aGUgY2hpbGQgdG8gcGFyZW50IHRvIGdlbnJhdGUgdGhlIHBhcmVudAotICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIGFzIHVuaW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChiYXNlTWV0YUluZm9Ib2xkZXIuaXNVbmlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFVuaW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG1lbWJlclR5cGVzID0gYmFzZU1ldGFJbmZvSG9sZGVyLmdldE1lbWJlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcW5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZW1iZXJUeXBlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkTWVtYmVyVHlwZSgoUU5hbWUpIHFuYW1lLCAoU3RyaW5nKSBtZW1iZXJUeXBlcy5nZXQocW5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY29weSB0aGUgbGlzdCB0eXBlIGRhdGEgdG8gcGFyZW50IGlmIGl0IGlzIGEgbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZU1ldGFJbmZvSG9sZGVyLmlzTGlzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldExpc3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEl0ZW1UeXBlUU5hbWUoYmFzZU1ldGFJbmZvSG9sZGVyLmdldEl0ZW1UeXBlUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEl0ZW1UeXBlQ2xhc3NOYW1lKGJhc2VNZXRhSW5mb0hvbGRlci5nZXRJdGVtVHlwZUNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEFzUGFyZW50KGJhc2VNZXRhSW5mb0hvbGRlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2ltcGxlQ29udGVudAotICAgICAqIEBwYXJhbSBtZXRhSW5mSG9sZGVyCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU2ltcGxlQ29udGVudChYbWxTY2hlbWFTaW1wbGVDb250ZW50IHNpbXBsZUNvbnRlbnQsIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyLCBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hQ29udGVudCBjb250ZW50OwotICAgICAgICBjb250ZW50ID0gc2ltcGxlQ29udGVudC5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlQ29udGVudEV4dGVuc2lvbikgewotICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlQ29udGVudEV4dGVuc2lvbiBleHRlbnNpb24gPSAoWG1sU2NoZW1hU2ltcGxlQ29udGVudEV4dGVuc2lvbikgY29udGVudDsKLQotICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSBiYXNlIHR5cGUgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKLSAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAvL3BpY2sgdGhlIHJlbGV2YW50IGJhc2V0eXBlIGZyb20gdGhlIHNjaGVtYSBhbmQgcHJvY2VzcyBpdAotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHR5cGUgIiArIGV4dGVuc2lvbi5nZXRCYXNlVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHJlc29sdmVkU2NoZW1hLmdldFR5cGVCeU5hbWUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZWRDb21wbGV4U2NoZW1hVHlwZShjb21wbGV4VHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IHBvc3NpYmxlLiBUaGUgZXh0ZW5zaW9uIHNob3VsZCBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhdmUgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJVbm5hbWVkIGNvbXBsZXggdHlwZSB1c2VkIGluIGV4dGVuc2lvbiIpOy8vSW50ZXJuYXRpb25saXplIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2ltcGxlU2NoZW1hVHlwZSgoWG1sU2NoZW1hU2ltcGxlVHlwZSkgdHlwZSwgbnVsbCwgcmVzb2x2ZWRTY2hlbWEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vcHJvY2VzcyBleHRlbnNpb24gYmFzZSB0eXBlCi0gICAgICAgICAgICBwcm9jZXNzU2ltcGxlRXh0ZW5zaW9uQmFzZVR5cGUoZXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgYXR0cmlidXRlcwotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBhdHRyaWJzID0gZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJpYkl0ZXJhdG9yID0gYXR0cmlicy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGF0dHJpYkl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBhdHRyID0gYXR0cmliSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyIGluc3RhbmNlb2YgWG1sU2NoZW1hQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGUoKFhtbFNjaGVtYUF0dHJpYnV0ZSkgYXR0ciwgbWV0YUluZkhvbGRlciwgcGFyZW50U2NoZW1hKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wcm9jZXNzIGFueSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIFhtbFNjaGVtYUFueUF0dHJpYnV0ZSBhbnlBdHQgPSBleHRlbnNpb24uZ2V0QW55QXR0cmlidXRlKCk7Ci0gICAgICAgICAgICBpZiAoYW55QXR0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQW55QXR0cmlidXRlKG1ldGFJbmZIb2xkZXIsIGFueUF0dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlQ29udGVudFJlc3RyaWN0aW9uKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVDb250ZW50UmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSAoWG1sU2NoZW1hU2ltcGxlQ29udGVudFJlc3RyaWN0aW9uKSBjb250ZW50OwotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgdGhlIGJhc2UgdHlwZSBpZiBpdCBoYXMgbm90IGJlZW4gcHJvY2Vzc2VkIHlldAotICAgICAgICAgICAgaWYgKCFpc0FscmVhZHlQcm9jZXNzZWQocmVzdHJpY3Rpb24uZ2V0QmFzZVR5cGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy9waWNrIHRoZSByZWxldmFudCBiYXNldHlwZSBmcm9tIHRoZSBzY2hlbWEgYW5kIHByb2Nlc3MgaXQKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLCByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHR5cGUgIiArIHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSB0eXBlID0gcmVzb2x2ZWRTY2hlbWEuZ2V0VHlwZUJ5TmFtZShyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZWRDb21wbGV4U2NoZW1hVHlwZShjb21wbGV4VHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IHBvc3NpYmxlLiBUaGUgZXh0ZW5zaW9uIHNob3VsZCBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhdmUgYSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJVbm5hbWVkIGNvbXBsZXggdHlwZSB1c2VkIGluIHJlc3RyaWN0aW9uIik7Ly9JbnRlcm5hdGlvbmxpemUgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3Mgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKChYbWxTY2hlbWFTaW1wbGVUeXBlKSB0eXBlLCBudWxsLCByZXNvbHZlZFNjaGVtYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vcHJvY2VzcyByZXN0cmljdGlvbiBiYXNlIHR5cGUKLSAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVSZXN0cmljdGlvbkJhc2VUeXBlKHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0U2ltcGxlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBTaW1wbGUgRXh0ZW5zaW9uIEJhc2UgVHlwZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRCYXNlVHlwZQotICAgICAqIEBwYXJhbSBtZXRhSW5mSG9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1NpbXBsZUV4dGVuc2lvbkJhc2VUeXBlKFFOYW1lIGV4dEJhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YUluZkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAvL2ZpbmQgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZpbmRDbGFzc05hbWUoZXh0QmFzZVR5cGUsIGZhbHNlKTsKLQotICAgICAgICAvLyBpZiB0aGUgYmFzZSB0eXBlIGlzIGFuIHByaW1pdGl2ZSB0aGVuIHdlIGRvIG5vdCBoYXZlIHRvIGV4dGVuZCB0aGVtCi0gICAgICAgIC8vIGFuZCBpdCBpcyBjb25zaWRlcmVkIGFzIGEgcHJvcGVydHkKLSAgICAgICAgLy8gb24gdGhlIG90aGVyaGFuZCBpZiB0aGUgYmFzZSB0eXBlIGlzIGFuIGdlbmVyYXRlZCBjbGFzcyB0aGVuIHdlIGhhdmUgdG8KLSAgICAgICAgLy8gZXh0ZW5kIGZyb20gaXQKLQotICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkoZXh0QmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgbWVhbnMgdGhlIHNjaGVtYSB0eXBlIGFjdHVhbGx5IHJldHVybnMgYSBkaWZmZXJlbnQgUU5hbWUKLSAgICAgICAgICAgIGlmIChjaGFuZ2VkVHlwZU1hcC5jb250YWluc0tleShleHRCYXNlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhleHRCYXNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChRTmFtZSkgY2hhbmdlZFR5cGVNYXAuZ2V0KGV4dEJhc2VUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKGV4dEJhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0QmFzZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIFNjaGVtYUNvbnN0YW50cy5FTEVNRU5UX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRTaW1wbGUodHJ1ZSk7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgcHJvY2VzcyB3aGVuIGl0IGNvbWVzIHRvIHRoaXMgcGxhY2UKLSAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzZWRUeXBlbWFwLmNvbnRhaW5zS2V5KGV4dEJhc2VUeXBlKSkgewotICAgICAgICAgICAgLy9zZXQgdGhlIGV4dGVuc2lvbiBiYXNlIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIFhtbFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsZXh0QmFzZVR5cGUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgZXh0QmFzZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKGV4dEJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRTaW1wbGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEV4dGVuc2lvbkNsYXNzTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShtZXRhSW5mSG9sZGVyLCBleHRCYXNlVHlwZSwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB0eXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxleFR5cGUuZ2V0Q29udGVudE1vZGVsKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHNldCBhcyBhIHNpbXBsZSB0eXBlIHNpbmNlIHdlIHdhbnQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IHRoZSBlbGVtZW50IG5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEV4dGVuc2lvbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0RXh0ZW5zaW9uQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5TWV0YUluZm9IaWVyYXJjaHkobWV0YUluZkhvbGRlciwgZXh0QmFzZVR5cGUsIHJlc29sdmVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRTaW1wbGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2dldCB0aGUgYmluYXJ5IHN0YXRlIGFuZCBhZGQgdGhhdCB0byB0aGUgc3RhdHVzIG1hcAotICAgICAgICBpZiAoaXNCaW5hcnkoZXh0QmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICBtZXRhSW5mSG9sZGVyLmFkZHRTdGF0dXMoZXh0QmFzZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5CSU5BUllfVFlQRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIFNpbXBsZSBSZXN0cmljdGlvbiBCYXNlIFR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzQmFzZVR5cGUKLSAgICAgKiBAcGFyYW0gbWV0YUluZkhvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NTaW1wbGVSZXN0cmljdGlvbkJhc2VUeXBlKFFOYW1lIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlc0Jhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhSW5mSG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9maW5kIHRoZSBjbGFzcyBuYW1lCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaW5kQ2xhc3NOYW1lKHJlc0Jhc2VUeXBlLCBmYWxzZSk7Ci0KLSAgICAgICAgLy90aGlzIG1lYW5zIHRoZSBzY2hlbWEgdHlwZSBhY3R1YWxseSByZXR1cm5zIGEgZGlmZmVyZW50IFFOYW1lCi0gICAgICAgIGlmIChiYXNlU2NoZW1hVHlwZU1hcC5jb250YWluc0tleShyZXNCYXNlVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VkVHlwZU1hcC5jb250YWluc0tleShyZXNCYXNlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChRTmFtZSkgY2hhbmdlZFR5cGVNYXAuZ2V0KHJlc0Jhc2VUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzQmFzZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIFNjaGVtYUNvbnN0YW50cy5FTEVNRU5UX1RZUEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3NlZFR5cGVtYXAuY29udGFpbnNLZXkocmVzQmFzZVR5cGUpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgaXMgbm90IGEgc3RhbmRhcmVkIHR5cGUKLSAgICAgICAgICAgIC8vIHNvIHRoZSBwYXJlbnQgY2xhc3MgbXVzdCBleHRlbmQgaXQKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0U2ltcGxlKHRydWUpOwotICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRSZXN0cmljdGlvbih0cnVlKTsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0UmVzdHJpY3Rpb25DbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGNvcHlNZXRhSW5mb0hpZXJhcmNoeShtZXRhSW5mSG9sZGVyLCByZXNCYXNlVHlwZSwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0UmVzdHJpY3Rpb25CYXNlVHlwZShyZXNCYXNlVHlwZSk7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgRmFjZXRzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGFJbmZIb2xkZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZhY2V0cyhYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgewotCi0gICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gZmFjZXRzID0gcmVzdHJpY3Rpb24uZ2V0RmFjZXRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGZhY2V0SXRlcmF0b3IgPSBmYWNldHMuZ2V0SXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoZmFjZXRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBmYWNldEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbFNjaGVtYVBhdHRlcm5GYWNldCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVBhdHRlcm5GYWNldCBwYXR0ZXJuID0gKFhtbFNjaGVtYVBhdHRlcm5GYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIC8vIHNvbWUgcGF0dGVybnMgY29udGFpbiBcIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSB0aGVtCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGJhY2t3b3JkIHNsYXNoZXMKLSAgICAgICAgICAgICAgICBwYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZy5yZXBsYWNlQWxsKCJcXFxcIiwgIlxcXFxcXFxcIik7Ci0gICAgICAgICAgICAgICAgaWYgKChtZXRhSW5mSG9sZGVyLmdldFBhdHRlcm5GYWNldCgpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobWV0YUluZkhvbGRlci5nZXRQYXR0ZXJuRmFjZXQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGVyZSBpcyBhIHBhdHRlcm4gZmFjZXNldAotICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuU3RyaW5nID0gbWV0YUluZkhvbGRlci5nZXRQYXR0ZXJuRmFjZXQoKS50cmltKCkgKyAifCIgKyBwYXR0ZXJuU3RyaW5nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFBhdHRlcm5GYWNldChwYXR0ZXJuU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hRW51bWVyYXRpb25GYWNldCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVudW1lcmF0aW9uRmFjZXQgZW51bWVyYXRpb24gPSAoWG1sU2NoZW1hRW51bWVyYXRpb25GYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlhTRF9RTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBxbmFtZSBoZXJlIGFuZCBzaG91ZCBmaW5kIHRoZSBsb2NhbCBwYXJ0IGFuZCBuYW1lc3BhY2UgdXJpCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGVudW1lcmF0aW9uLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmluZGV4T2YoIjoiKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVcmkgPSBwYXJlbnRTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHN0cmluZyB0byBzdWl0ZSBmb3IgdGhlIGNvbnZlcnRRbmFtZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lU3RyaW5nID0gdmFsdWUgKyAiXCIsIFwiIiArIG5hbWVzcGFjZVVyaTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5hZGRFbnVtRmFjZXQocU5hbWVTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkRW51bUZhY2V0KGVudW1lcmF0aW9uLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFhtbFNjaGVtYUxlbmd0aEZhY2V0KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hTGVuZ3RoRmFjZXQgbGVuZ3RoID0gKFhtbFNjaGVtYUxlbmd0aEZhY2V0KSBvYmo7Ci0gICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRMZW5ndGhGYWNldChJbnRlZ2VyLnBhcnNlSW50KGxlbmd0aC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWF4RXhjbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNYXhFeGNsdXNpdmVGYWNldCBtYXhFeCA9IChYbWxTY2hlbWFNYXhFeGNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWF4RXhjbHVzaXZlRmFjZXQobWF4RXguZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWluRXhjbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNaW5FeGNsdXNpdmVGYWNldCBtaW5FeCA9IChYbWxTY2hlbWFNaW5FeGNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWluRXhjbHVzaXZlRmFjZXQobWluRXguZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWF4SW5jbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNYXhJbmNsdXNpdmVGYWNldCBtYXhJbiA9IChYbWxTY2hlbWFNYXhJbmNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWF4SW5jbHVzaXZlRmFjZXQobWF4SW4uZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWluSW5jbHVzaXZlRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNaW5JbmNsdXNpdmVGYWNldCBtaW5JbiA9IChYbWxTY2hlbWFNaW5JbmNsdXNpdmVGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWluSW5jbHVzaXZlRmFjZXQobWluSW4uZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWG1sU2NoZW1hTWF4TGVuZ3RoRmFjZXQpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFNYXhMZW5ndGhGYWNldCBtYXhMZW4gPSAoWG1sU2NoZW1hTWF4TGVuZ3RoRmFjZXQpIG9iajsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldE1heExlbmd0aEZhY2V0KEludGVnZXIucGFyc2VJbnQobWF4TGVuLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYbWxTY2hlbWFNaW5MZW5ndGhGYWNldCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYU1pbkxlbmd0aEZhY2V0IG1pbkxlbiA9IChYbWxTY2hlbWFNaW5MZW5ndGhGYWNldCkgb2JqOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0TWluTGVuZ3RoRmFjZXQoSW50ZWdlci5wYXJzZUludChtaW5MZW4uZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgYW55IGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FueUF0dHJpYnV0ZShCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwgWG1sU2NoZW1hQW55QXR0cmlidXRlIGFueUF0dCkgewotCi0gICAgICAgIC8vVGhlIGJlc3QgdGhpbmcgd2UgY2FuIGRvIGhlcmUgaXMgdG8gYWRkIGEgc2V0IG9mIE9NQXR0cmlidXRlcwotICAgICAgICAvL3NpbmNlIGF0dHJpYnV0ZXMgZG8gbm90IGhhdmUgdGhlIG5vdGlvbiBvZiBtaW5vY2N1cnMvbWF4b2NjdXJzIHRoZQotICAgICAgICAvL3NhZmVzdCBvcHRpb24gaGVyZSBpcyB0byBoYXZlIGFuIE9NQXR0cmlidXRlIGFycmF5Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKEVYVFJBX0FUVFJJQlVURV9GSUVMRF9OQU1FKTsKLSAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcocU5hbWUsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICB3cml0ZXIuZ2V0RGVmYXVsdEF0dHJpYkFycmF5Q2xhc3NOYW1lKCksLy9hbHdheXMgZ2VuZXJhdGUgYW4gYXJyYXkgb2YKLSAgICAgICAgICAgICAgICAvL09NQXR0cmlidXRlcwotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BTllfVFlQRSk7Ci0gICAgICAgIG1ldGFpbmYuYWRkdFN0YXR1cyhxTmFtZSwgU2NoZW1hQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFKTsKLSAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKHFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGF0dAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0F0dHJpYnV0ZShYbWxTY2hlbWFBdHRyaWJ1dGUgYXR0LCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUgPSBhdHQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHQuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KHNjaGVtYVR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmYucmVnaXN0ZXJNYXBwaW5nKGF0dC5nZXRRTmFtZSgpLCBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlU2NoZW1hVHlwZU1hcC5nZXQoc2NoZW1hVHlwZU5hbWUpLnRvU3RyaW5nKCksIFNjaGVtYUNvbnN0YW50cy5BVFRSSUJVVEVfVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG9wdGlvbmFsIGF0dHJpYnV0ZSBzdGF0dXMgaWYgc2V0Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2UgPSBhdHQuZ2V0VXNlKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFVTRV9OT05FLmVxdWFscyh1c2UpIHx8IFVTRV9PUFRJT05BTC5lcXVhbHModXNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKGF0dC5nZXRRTmFtZSgpLCBTY2hlbWFDb25zdGFudHMuT1BUSU9OQUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShzY2hlbWFUeXBlTmFtZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGF0dC5hZGRNZXRhSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkNMQVNTTkFNRV9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHQuZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLnJlZ2lzdGVyRGVmYXVsdFZhbHVlKGF0dC5nZXRRTmFtZSgpLGF0dC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLHNjaGVtYVR5cGVOYW1lLENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSB0eXBlICIgKyBzY2hlbWFUeXBlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHNjaGVtYSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHJlc29sdmVkU2NoZW1hLmdldFR5cGVCeU5hbWUoc2NoZW1hVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHR5cGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2ltcGxlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKHNjaGVtYVR5cGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2ltcGxlU2NoZW1hVHlwZShzaW1wbGVUeXBlLCBudWxsLCByZXNvbHZlZFNjaGVtYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcoYXR0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5nZXQoc2NoZW1hVHlwZU5hbWUpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG9wdGlvbmFsIGF0dHJpYnV0ZSBzdGF0dXMgaWYgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2UgPSBhdHQuZ2V0VXNlKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVTRV9OT05FLmVxdWFscyh1c2UpIHx8IFVTRV9PUFRJT05BTC5lcXVhbHModXNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKGF0dC5nZXRRTmFtZSgpLCBTY2hlbWFDb25zdGFudHMuT1BUSU9OQUxfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBhdHRyaWJ1dGUgaGFzIGEgdHlwZSBidXQgZG9lcyBub3QgaGF2ZSBhIG5hbWUsIHNlZW1zIHRvIGJlIGludmFsaWQKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKGF0dC5nZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLGF0dC5nZXRSZWZOYW1lKCksQ09NUE9ORU5UX0FUVFJJQlVURSk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJjYW4gbm90IGZpbmQgdGhlIGF0dHJpYnV0ZSAiICsgYXR0LmdldFJlZk5hbWUoKSArCi0gICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFBdHRyaWJ1dGUgeG1sU2NoZW1hQXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChYbWxTY2hlbWFBdHRyaWJ1dGUpIHJlc29sdmVkU2NoZW1hLmdldEF0dHJpYnV0ZXMoKS5nZXRJdGVtKGF0dC5nZXRSZWZOYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHJlY3Vyc2l2ZWx5IHRvIHByb2Nlc3MgdGhlIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQXR0cmlidXRlKHhtbFNjaGVtYUF0dHJpYnV0ZSwgbWV0YWluZiwgcmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiQXR0cmlidXRlIFFOYW1lIHJlZmVyZW5jZSByZWZlciB0byBhbiBpbnZhbGlkIGF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHQuZ2V0UmVmTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgYXR0cmlidXRlIHJlZmVycyB0byBhIGN1c3RvbSB0eXBlLCBwcm9iYWJseSBvbmUgb2YgdGhlIGV4dGVuZGVkIHNpbXBsZSB0eXBlcy4KLSAgICAgICAgICAgIC8vIHdpdGggdGhlIGlubGluZSBzY2hlbWEgZGVmaW5pdGlvbgotICAgICAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUgPSBhdHQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZSBhdHRyaWJ1dGVTaW1wbGVUeXBlID0gYXR0LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBwYXJlbnRTY2hlbWE7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNpbXBsZVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHRoZSBzY2hlbWEgZm9yIHVzaW5nIHFuYW1lCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVNjaGVtYVFuYW1lID0gYXR0LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVTY2hlbWFRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYShwYXJlbnRTY2hlbWEsYXR0cmlidXRlU2NoZW1hUW5hbWUsQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSB0eXBlICIgKyBhdHRyaWJ1dGVTY2hlbWFRbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBhcmVudCBzY2hlbWEgIiArIHBhcmVudFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkU2NoZW1hLmdldFR5cGVCeU5hbWUoYXR0cmlidXRlU2NoZW1hUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNpbXBsZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlUU5hbWUgPSBhdHQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHBhcmVudCBzY2hlbWEgdGFyZ2V0IG5hbWUgc3BhY2Ugc2luY2UgYXR0cmlidXRlIFFuYW1lIHVyaSBpcyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNpbXBsZVR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZVFOYW1lID0gYXR0cmlidXRlU2ltcGxlVHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlUU5hbWUgPSBuZXcgUU5hbWUocGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBnZXROZXh0VHlwZVN1ZmZpeChhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FscmVhZHlQcm9jZXNzZWQoc2NoZW1hVHlwZVFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3Mgb25seSBpZiBpdCBoYXMgbm90IHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoYXR0cmlidXRlU2ltcGxlVHlwZSwgbnVsbCwgcmVzb2x2ZWRTY2hlbWEsIHNjaGVtYVR5cGVRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZi5yZWdpc3Rlck1hcHBpbmcoYXR0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAuZ2V0KHNjaGVtYVR5cGVRTmFtZSkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuQVRUUklCVVRFX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgb3B0aW9uYWwgYXR0cmlidXRlIHN0YXR1cyBpZiBzZXQKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZSA9IGF0dC5nZXRVc2UoKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoVVNFX05PTkUuZXF1YWxzKHVzZSkgfHwgVVNFX09QVElPTkFMLmVxdWFscyh1c2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLmFkZHRTdGF0dXMoYXR0LmdldFFOYW1lKCksIFNjaGVtYUNvbnN0YW50cy5PUFRJT05BTF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGUgY2FzZSB3aGVuIG5vIGF0dHJpYnV0ZSB0eXBlIHNwZWNpZmVkCi0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBhdHRyaWJ1dGUgdHlwZSBoYXMgZGVmaW5lZCB0byB0aGUgQXR0cmlidXRlICIgKyBhdHRyaWJ1dGVRTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiQXR0cmlidXRlIFFOYW1lIHJlZmVyZW5jZSByZWZlciB0byBhbiBpbnZhbGlkIGF0dHJpYnV0ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIHBhcnRpY2xlLSBBIHBhcnRpY2xlIG1heSBiZSBhIHNlcXVlbmNlLGFsbCBvciBhIGNob2ljZQotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50UU5hbWUgLSB0aGlzIGNhbiBlaXRoZXIgYmUgcGFyZW50IGVsZW1lbnQgUU5hbWUgb3IgcGFyZW50IENvbXBsZXggdHlwZSBxbmFtZQotICAgICAqIEBwYXJhbSBwYXJ0aWNsZSAtIHBhcnRpY2xlIGJlaW5nIHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBtZXRhaW5mSG9sZGVyIC0KLSAgICAgKiBAcGFyYW0gcGFyZW50U2NoZW1hCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFydGljbGUoUU5hbWUgcGFyZW50RWxlbWVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hUGFydGljbGUgcGFydGljbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZkhvbGRlcgotICAgICAgICAgICAgLCBYbWxTY2hlbWEgcGFyZW50U2NoZW1hKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgcGFydGljbGU7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgaWYgKCh4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSA+IDEpICYmIChwYXJlbnRFbGVtZW50UU5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3MgbWFueSBzZXF1ZW5jZSB0eXBlcwotICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcyhwYXJlbnRFbGVtZW50UU5hbWUsIGl0ZW1zLCBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIsIHRydWUsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLnNldFBhcnRpY2xlQ2xhc3ModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2VxdWVuY2VRTmFtZSA9IG5ldyBRTmFtZShwYXJlbnRFbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIlNlcXVlbmNlIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZUNvbXBsZXhQYXJ0aWNsZShzZXF1ZW5jZVFOYW1lLGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcik7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2VxdWVuY2VRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhzZXF1ZW5jZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRDbGFzc05hbWUoc2VxdWVuY2VRTmFtZSx0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnNldE9yZGVyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgoc2VxdWVuY2VRTmFtZSxtZXRhaW5mSG9sZGVyLmdldE9yZGVyU3RhcnRQb2ludCgpICsgMSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKHNlcXVlbmNlUU5hbWUsU2NoZW1hQ29uc3RhbnRzLlBBUlRJQ0xFX1RZUEVfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNYXhPY2N1cnMoc2VxdWVuY2VRTmFtZSx4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMoc2VxdWVuY2VRTmFtZSx4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNaW5PY2N1cnMoKSk7Ci0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSxpdGVtcywgbWV0YWluZkhvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhwYXJlbnRFbGVtZW50UU5hbWUsaXRlbXMsIG1ldGFpbmZIb2xkZXIsIHRydWUsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFBbGwpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSAoKFhtbFNjaGVtYUFsbCkgcGFydGljbGUpLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSxpdGVtcywgbWV0YWluZkhvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDaG9pY2UpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNob2ljZSB4bWxTY2hlbWFDaG9pY2UgPSAoWG1sU2NoZW1hQ2hvaWNlKSBwYXJ0aWNsZTsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSAoKFhtbFNjaGVtYUNob2ljZSkgcGFydGljbGUpLmdldEl0ZW1zKCk7Ci0KLSAgICAgICAgICAgIGlmICgoeG1sU2NoZW1hQ2hvaWNlLmdldE1heE9jY3VycygpID4gMSkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHByb2Nlc3MgbWFueSBzZXF1ZW5jZSB0eXBlcwotICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLnNldENob2ljZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSxpdGVtcywgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLCBmYWxzZSwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuc2V0UGFydGljbGVDbGFzcyh0cnVlKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBjaG9pY2VRTmFtZSA9IG5ldyBRTmFtZShwYXJlbnRFbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIkNob2ljZSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gd3JpdGVDb21wbGV4UGFydGljbGUoY2hvaWNlUU5hbWUsYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlbWFwLnB1dChjaG9pY2VRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhjaG9pY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluZENsYXNzTmFtZShjaG9pY2VRTmFtZSx0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnNldE9yZGVyZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgoY2hvaWNlUU5hbWUsbWV0YWluZkhvbGRlci5nZXRPcmRlclN0YXJ0UG9pbnQoKSArIDEpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhjaG9pY2VRTmFtZSxTY2hlbWFDb25zdGFudHMuUEFSVElDTEVfVFlQRV9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3VycyhjaG9pY2VRTmFtZSx4bWxTY2hlbWFDaG9pY2UuZ2V0TWF4T2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkTWluT2NjdXJzKGNob2ljZVFOYW1lLHhtbFNjaGVtYUNob2ljZS5nZXRNaW5PY2N1cnMoKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRDaG9pY2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcyhwYXJlbnRFbGVtZW50UU5hbWUsaXRlbXMsIG1ldGFpbmZIb2xkZXIsIGZhbHNlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfSBlbHNlIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUdyb3VwUmVmKXsKLQotICAgICAgICAgICAgWG1sU2NoZW1hR3JvdXBSZWYgeG1sU2NoZW1hR3JvdXBSZWYgPSAoWG1sU2NoZW1hR3JvdXBSZWYpIHBhcnRpY2xlOwotICAgICAgICAgICAgUU5hbWUgZ3JvdXBRTmFtZSA9IHhtbFNjaGVtYUdyb3VwUmVmLmdldFJlZk5hbWUoKTsKLSAgICAgICAgICAgIGlmIChncm91cFFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZEdyb3VwVHlwZU1hcC5jb250YWluc0tleShncm91cFFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZSB0aGUgc2NoZW1hIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkUGFyZW50U2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxncm91cFFOYW1lLENPTVBPTkVOVF9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhcmVudFNjaGVtYSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiY2FuIG5vdCBmaW5kIHRoZSBncm91cCAiICsgZ3JvdXBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hR3JvdXAgeG1sU2NoZW1hR3JvdXAgPSAoWG1sU2NoZW1hR3JvdXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUGFyZW50U2NoZW1hLmdldEdyb3VwcygpLmdldEl0ZW0oZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzR3JvdXAoeG1sU2NoZW1hR3JvdXAsIGdyb3VwUU5hbWUsIHJlc29sdmVkUGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJSZWZlcmVuY2VkIG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0geG1sU2NoZW1hR3JvdXBSZWYuZ2V0TWF4T2NjdXJzKCkgPiAxOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgIFN0cmluZyBncm91cENsYXNzTmFtZSA9IChTdHJpbmcpIHByb2Nlc3NlZEdyb3VwVHlwZU1hcC5nZXQoZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNBcnJheSl7Ci0gICAgICAgICAgICAgICAgZ3JvdXBDbGFzc05hbWUgPSBncm91cENsYXNzTmFtZSArICJbXSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhncm91cFFOYW1lLCBncm91cFFOYW1lLCBncm91cENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaXNBcnJheSkgewotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhncm91cFFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZHRTdGF0dXMoZ3JvdXBRTmFtZSwgU2NoZW1hQ29uc3RhbnRzLlBBUlRJQ0xFX1RZUEVfRUxFTUVOVCk7Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3Vycyhncm91cFFOYW1lLCB4bWxTY2hlbWFHcm91cFJlZi5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1pbk9jY3Vycyhncm91cFFOYW1lLCB4bWxTY2hlbWFHcm91cFJlZi5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnNldEhhc1BhcnRpY2xlVHlwZSh0cnVlKTsKLSAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuc2V0T3JkZXJlZCh0cnVlKTsKLSAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJRTmFtZUluZGV4KGdyb3VwUU5hbWUsbWV0YWluZkhvbGRlci5nZXRPcmRlclN0YXJ0UG9pbnQoKSArIDEpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50UU5hbWUgLSB0aGlzIGNvdWxkIGVpdGhlciBiZSB0aGUgY29tcGxleCB0eXBlIHBhcmVudEVsZW1lbnRRTmFtZSBvciBlbGVtZW50IHBhcmVudEVsZW1lbnRRTmFtZQotICAgICAqIEBwYXJhbSBpdGVtcwotICAgICAqIEBwYXJhbSBtZXRhaW5mSG9sZGVyCi0gICAgICogQHBhcmFtIG9yZGVyCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2VzcyhRTmFtZSBwYXJlbnRFbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZkhvbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjb3VudCA9IGl0ZW1zLmdldENvdW50KCk7Ci0gICAgICAgIE1hcCBwcm9jZXNzZWRFbGVtZW50QXJyYXlTdGF0dXNNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBNYXAgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBMaXN0IGxvY2FsTmlsbGFibGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIE1hcCBwYXJ0aWNsZVFOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyB0aGlzIGxpc3QgaXMgdXNlZCB0byBrZWVwIHRoZSBkZXRhaWxzIG9mIHRoZQotICAgICAgICAvLyBlbGVtZW50cyB3aXRoaW4gYSBjaG9pY2Ugd2l0aGluZyBzZXF1ZW5jZQotICAgICAgICBMaXN0IGlubmVyQ2hvaWNlRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgTWFwIGVsZW1lbnRPcmRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgaW50IHNlcXVlbmNlQ291bnRlciA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0IGl0ZW0gPSBpdGVtcy5nZXRJdGVtKGkpOwotCi0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAvL3JlY3Vyc2l2ZWx5IHByb2Nlc3MgdGhlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhzRWx0ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGl0ZW07Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSBpc0FycmF5KHhzRWx0KTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRWxlbWVudCh4c0VsdCwgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAsIGxvY2FsTmlsbGFibGVMaXN0LCBwYXJlbnRTY2hlbWEpOyAvL3dlIGtub3cgZm9yIHN1cmUgdGhpcyBpcyBub3QgYW4gb3V0ZXIgdHlwZQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5wdXQoeHNFbHQsIChpc0FycmF5KSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICAvL3dlIG5lZWQgdG8ga2VlcCB0aGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzLiBTbyBwdXNoIHRoZSBlbGVtZW50cyB0byBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgIC8vaGFzaG1hcCB3aXRoIHRoZSBvcmRlciBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudE9yZGVyTWFwLnB1dCh4c0VsdCwgbmV3IEludGVnZXIoc2VxdWVuY2VDb3VudGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9oYW5kbGUgeHNkOmFueSAhIFdlIHBsYWNlIGFuIE9NRWxlbWVudCAob3IgYW4gYXJyYXkgb2YgT01FbGVtZW50cykgaW4gdGhlIGdlbmVyYXRlZCBjbGFzcwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hQW55KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IGFueSA9IChYbWxTY2hlbWFBbnkpIGl0ZW07Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAucHV0KG5ldyBRTmFtZShBTllfRUxFTUVOVF9GSUVMRF9OQU1FKSwgYW55KTsKLSAgICAgICAgICAgICAgICAvL2FueSBjYW4gYWxzbyBiZSBpbnNpZGUgYSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50T3JkZXJNYXAucHV0KGFueSwgbmV3IEludGVnZXIoc2VxdWVuY2VDb3VudGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vd2UgZG8gbm90IHJlZ2lzdGVyIHRoZSBhcnJheSBzdGF0dXMgZm9yIHRoZSBhbnkgdHlwZQotICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5wdXQoYW55LCBpc0FycmF5KGFueSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIG1hbnkgc2VxdWVuY2UgdHlwZXMKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gKFhtbFNjaGVtYVNlcXVlbmNlKSBpdGVtOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MocGFyZW50RWxlbWVudFFOYW1lLCB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpLCBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIsIHRydWUsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRQYXJ0aWNsZUNsYXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIlNlcXVlbmNlIjsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2VxdWVuY2VRTmFtZSA9IG5ldyBRTmFtZShwYXJlbnRFbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lICsgZ2V0TmV4dFR5cGVTdWZmaXgobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NOYW1lID0gd3JpdGVDb21wbGV4UGFydGljbGUoc2VxdWVuY2VRTmFtZSwgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2VxdWVuY2VRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9wdXQgdGhlIHBhcnRpY2FsIHRvIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gaXNBcnJheSA9IHhtbFNjaGVtYVNlcXVlbmNlLmdldE1heE9jY3VycygpID4gMSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5wdXQoaXRlbSwgaXNBcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlUU5hbWVNYXAucHV0KGl0ZW0sIHNlcXVlbmNlUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE9yZGVyTWFwLnB1dChpdGVtLCBuZXcgSW50ZWdlcihzZXF1ZW5jZUNvdW50ZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hQ2hvaWNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIG1hbnkgc2VxdWVuY2UgdHlwZXMKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNob2ljZSB4bWxTY2hlbWFDaG9pY2UgPSAoWG1sU2NoZW1hQ2hvaWNlKSBpdGVtOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFDaG9pY2UuZ2V0SXRlbXMoKS5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyID0gbmV3IEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuc2V0Q2hvaWNlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKHBhcmVudEVsZW1lbnRRTmFtZSwgeG1sU2NoZW1hQ2hvaWNlLmdldEl0ZW1zKCksIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRQYXJ0aWNsZUNsYXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50RWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpICsgIkNob2ljZSI7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGNob2ljZVFOYW1lID0gbmV3IFFOYW1lKHBhcmVudEVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgKyBnZXROZXh0VHlwZVN1ZmZpeChsb2NhbE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZUNvbXBsZXhQYXJ0aWNsZShjaG9pY2VRTmFtZSwgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoY2hvaWNlUU5hbWUsIGphdmFDbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vcHV0IHRoZSBwYXJ0aWNhbCB0byBhcnJheQotICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFDaG9pY2UuZ2V0TWF4T2NjdXJzKCkgPiAxID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRWxlbWVudEFycmF5U3RhdHVzTWFwLnB1dChpdGVtLCBpc0FycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgcGFydGljbGVRTmFtZU1hcC5wdXQoaXRlbSwgY2hvaWNlUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE9yZGVyTWFwLnB1dChpdGVtLCBuZXcgSW50ZWdlcihzZXF1ZW5jZUNvdW50ZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hR3JvdXBSZWYpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUdyb3VwUmVmIHhtbFNjaGVtYUdyb3VwUmVmID0gKFhtbFNjaGVtYUdyb3VwUmVmKSBpdGVtOwotICAgICAgICAgICAgICAgIFFOYW1lIGdyb3VwUU5hbWUgPSB4bWxTY2hlbWFHcm91cFJlZi5nZXRSZWZOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwUU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc2VkR3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KGdyb3VwUU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlIHRoZSBzY2hlbWEgaGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkUGFyZW50U2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSxncm91cFFOYW1lLENPTVBPTkVOVF9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXJlbnRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKCJDYW4gbm90IGZpbmQgdGhlIGdyb3VwIHdpdGggdGhlIHFuYW1lIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFFOYW1lICsgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFHcm91cCB4bWxTY2hlbWFHcm91cCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWG1sU2NoZW1hR3JvdXApIHJlc29sdmVkUGFyZW50U2NoZW1hLmdldEdyb3VwcygpLmdldEl0ZW0oZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUdyb3VwICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzR3JvdXAoeG1sU2NoZW1hR3JvdXAsIGdyb3VwUU5hbWUsIHJlc29sdmVkUGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBCb29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFHcm91cFJlZi5nZXRNYXhPY2N1cnMoKSA+IDEgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFbGVtZW50QXJyYXlTdGF0dXNNYXAucHV0KGl0ZW0saXNBcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRpY2xlUU5hbWVNYXAucHV0KGl0ZW0sZ3JvdXBRTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yZGVyKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRPcmRlck1hcC5wdXQoaXRlbSwgbmV3IEludGVnZXIoc2VxdWVuY2VDb3VudGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiUmVmZXJlbmNlZCBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vdGhlcmUgbWF5IGJlIG90aGVyIHR5cGVzIHRvIGJlIGhhbmRsZWQgaGVyZS4gQWRkIHRoZW0KLSAgICAgICAgICAgICAgICAvL3doZW4gd2UgYXJlIHJlYWR5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgc2VxdWVuY2VDb3VudGVyKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHByb2Nlc3NlZCBpdGVtcyBhbmQgYWRkIHRoZW0gdG8gdGhlIG1hdGFpbmYgb2JqZWN0Ci0gICAgICAgIEl0ZXJhdG9yIHByb2Nlc3NlZEVsZW1lbnRzSXRlcmF0b3IgPSBwcm9jZXNzZWRFbGVtZW50QXJyYXlTdGF0dXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgaW50IHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyID0gbWV0YWluZkhvbGRlci5nZXRPcmRlclN0YXJ0UG9pbnQoKTsKLSAgICAgICAgd2hpbGUgKHByb2Nlc3NlZEVsZW1lbnRzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgY2hpbGQgPSBwcm9jZXNzZWRFbGVtZW50c0l0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgWG1sU2NoZW1hRWxlbWVudAotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWx0ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGNoaWxkOwotICAgICAgICAgICAgICAgIFFOYW1lIHJlZmVyZW5jZWRRTmFtZSA9IG51bGw7Ci0KLQotICAgICAgICAgICAgICAgIGlmIChlbHQuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRRTmFtZSA9IGVsdC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlUU5hbWUgPSBlbHQuZ2V0U2NoZW1hVHlwZSgpICE9IG51bGwgPyBlbHQuZ2V0U2NoZW1hVHlwZSgpLmdldFFOYW1lKCkgOiBlbHQuZ2V0U2NoZW1hVHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenpOYW1lID0gKFN0cmluZykgcHJvY2Vzc2VkRWxlbWVudFR5cGVNYXAuZ2V0KGVsdC5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKHJlZmVyZW5jZWRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ek5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQm9vbGVhbikgcHJvY2Vzc2VkRWxlbWVudEFycmF5U3RhdHVzTWFwLmdldChlbHQpKS5ib29sZWFuVmFsdWUoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkFSUkFZX1RZUEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5FTEVNRU5UX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ2hvaWNlRWxlbWVudExpc3QuY29udGFpbnMocmVmZXJlbmNlZFFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKHJlZmVyZW5jZWRRTmFtZSxTY2hlbWFDb25zdGFudHMuSU5ORVJfQ0hPSUNFX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGRlZmF1bHQgdmFsdWUgYXMgd2VsbAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsdC5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJEZWZhdWx0VmFsdWUocmVmZXJlbmNlZFFOYW1lLGVsdC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbHQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsgLy9wcm9iYWJseSB0aGlzIGlzIHJlZmVyZW5jZWQKLSAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZFFOYW1lID0gZWx0LmdldFJlZk5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhcnJheVN0YXR1cyA9ICgoQm9vbGVhbikgcHJvY2Vzc2VkRWxlbWVudEFycmF5U3RhdHVzTWFwLmdldChlbHQpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXp6TmFtZSA9IGZpbmRSZWZDbGFzc05hbWUocmVmZXJlbmNlZFFOYW1lLCBhcnJheVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGF6ek5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lID0gZmluZENsYXNzTmFtZShyZWZlcmVuY2VkUU5hbWUsIGFycmF5U3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcmVzb2x2ZWRQYXJlbnRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWEocGFyZW50U2NoZW1hLHJlZmVyZW5jZWRRTmFtZSxDT01QT05FTlRfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhcmVudFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oIkNhbiBub3QgZmluZCB0aGUgZWxlbWVudCAiICsgcmVmZXJlbmNlZFFOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCByZWZFbGVtZW50ID0gcmVzb2x2ZWRQYXJlbnRTY2hlbWEuZ2V0RWxlbWVudEJ5TmFtZShyZWZlcmVuY2VkUU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciB0aGUgbWFwcGluZyBpZiB3ZSBmb3VuZCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZkVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKHJlZmVyZW5jZWRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjbGF6ek5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVN0YXR1cyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkVMRU1FTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkUU5hbWUuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5YU0RfU0NIRU1BKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhyZWZlcmVuY2VkUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZ2V0RGVmYXVsdENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BTllfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKFNjaGVtYUNvbXBpbGVyTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2NoZW1hLnJlZmVyZW5jZWRFbGVtZW50Tm90Rm91bmQiLCByZWZlcmVuY2VkUU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkUU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEuZW1wdHlOYW1lIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vcmVnaXN0ZXIgdGhlIG9jY3VyZW5jZSBjb3VudHMKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3VycyhyZWZlcmVuY2VkUU5hbWUsIGVsdC5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHN0cmljdCB2YWxpZGF0aW9uIG9mZiB0aGVuIHdlIGNvbnNpZGVyIGFsbCBlbGVtZW50cyBoYXZlIG1pbk9jY3VycyB6ZXJvIG9uIGl0Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pc09mZlN0cmljdFZhbGlkYXRpb24oKSl7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkTWluT2NjdXJzKHJlZmVyZW5jZWRRTmFtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMocmVmZXJlbmNlZFFOYW1lLCBlbHQuZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL3dlIG5lZWQgdGhlIG9yZGVyIHRvIGJlIHByZXNlcnZlZC4gU28gcmVjb3JkIHRoZSBvcmRlciBhbHNvCi0gICAgICAgICAgICAgICAgaWYgKG9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVjb3JkIHRoZSBvcmRlciBpbiB0aGUgbWV0YWluZiBob2xkZXIKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnRPcmRlck1hcC5nZXQoZWx0KTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgocmVmZXJlbmNlZFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyICsgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2dldCB0aGUgbmlsbGFibGUgc3RhdGUgYW5kIHJlZ2lzdGVyIHRoYXQgb24gdGhlIG1ldGFpbmYgaG9sZGVyCi0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmlsbGFibGVMaXN0LmNvbnRhaW5zKGVsdC5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTmlsbGFibGVRTmFtZShlbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGJpbmFyeSBzdGF0ZSBhbmQgYWRkIHRoYXQgdG8gdGhlIHN0YXR1cyBtYXAKLSAgICAgICAgICAgICAgICBpZiAoaXNCaW5hcnkoZWx0KSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZHRTdGF0dXMoZWx0LmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLkJJTkFSWV9UWVBFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgWE1MU2NoZW1hQW55Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hQW55KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQW55IGFueSA9IChYbWxTY2hlbWFBbnkpIGNoaWxkOwotCi0gICAgICAgICAgICAgICAgLy9zaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBlbGVtZW50IGhlcmUgaXQgZG9lcyBub3QgbWF0dGVyCi0gICAgICAgICAgICAgICAgLy9mb3IgdGhlIGNvbnN0YW50LiBIb3dldmVyIHRoZSBwcm9ibGVtIG9jY3VycyBpZiB0aGUgdXNlcnMKLSAgICAgICAgICAgICAgICAvL3VzZXMgdGhlIHNhbWUgbmFtZSBmb3IgYW4gZWxlbWVudCBkZWNhbHJhdGlvbgotICAgICAgICAgICAgICAgIFFOYW1lIGFueUVsZW1lbnRGaWVsZE5hbWUgPSBuZXcgUU5hbWUoQU5ZX0VMRU1FTlRfRklFTERfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICAvL3RoaXMgY2FuIGJlIGFuIGFycmF5IG9yIGEgc2luZ2xlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSAoKEJvb2xlYW4pIHByb2Nlc3NlZEVsZW1lbnRBcnJheVN0YXR1c01hcC5nZXQoYW55KSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3Rlck1hcHBpbmcoYW55RWxlbWVudEZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5ID8gd3JpdGVyLmdldERlZmF1bHRDbGFzc0FycmF5TmFtZSgpIDogd3JpdGVyLmdldERlZmF1bHRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BTllfVFlQRSk7Ci0gICAgICAgICAgICAgICAgLy9pZiBpdCdzIGFuIGFycmF5IHJlZ2lzdGVyIGFuIGV4dHJhIHN0YXR1cyBmbGFnIHdpdGggdGhlIHN5c3RlbQotICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhhbnlFbGVtZW50RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNYXhPY2N1cnMoYW55RWxlbWVudEZpZWxkTmFtZSwgYW55LmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1pbk9jY3VycyhhbnlFbGVtZW50RmllbGROYW1lLCBhbnkuZ2V0TWluT2NjdXJzKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVjb3JkIHRoZSBvcmRlciBpbiB0aGUgbWV0YWluZiBob2xkZXIgZm9yIHRoZSBhbnkKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnRPcmRlck1hcC5nZXQoYW55KTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3RlclFOYW1lSW5kZXgoYW55RWxlbWVudEZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ0l0ZW1OdW1iZXJPcmRlciArIGludGVnZXIuaW50VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSAoWG1sU2NoZW1hU2VxdWVuY2UpIGNoaWxkOwotICAgICAgICAgICAgICAgIFFOYW1lIHNlcXVlbmNlUU5hbWUgPSAoUU5hbWUpIHBhcnRpY2xlUU5hbWVNYXAuZ2V0KGNoaWxkKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkgPSB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSA+IDE7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyBhcyBhbiBhcnJheSB0byB0aGUgb3JpZ2luYWwgY2xhc3MKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyTWFwcGluZyhzZXF1ZW5jZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRDbGFzc05hbWUoc2VxdWVuY2VRTmFtZSwgaXNBcnJheSkpOwotICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhzZXF1ZW5jZVFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhzZXF1ZW5jZVFOYW1lLCBTY2hlbWFDb25zdGFudHMuUEFSVElDTEVfVFlQRV9FTEVNRU5UKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1heE9jY3VycyhzZXF1ZW5jZVFOYW1lLCB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMoc2VxdWVuY2VRTmFtZSwgeG1sU2NoZW1hU2VxdWVuY2UuZ2V0TWluT2NjdXJzKCkpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuc2V0SGFzUGFydGljbGVUeXBlKHRydWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmVjb3JkIHRoZSBvcmRlciBpbiB0aGUgbWV0YWluZiBob2xkZXIgZm9yIHRoZSBhbnkKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnRPcmRlck1hcC5nZXQoY2hpbGQpOwotICAgICAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLnJlZ2lzdGVyUU5hbWVJbmRleChzZXF1ZW5jZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyICsgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hQ2hvaWNlKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ2hvaWNlIHhtbFNjaGVtYUNob2ljZSA9IChYbWxTY2hlbWFDaG9pY2UpIGNoaWxkOwotICAgICAgICAgICAgICAgIFFOYW1lIGNob2ljZVFOYW1lID0gKFFOYW1lKSBwYXJ0aWNsZVFOYW1lTWFwLmdldChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0geG1sU2NoZW1hQ2hvaWNlLmdldE1heE9jY3VycygpID4gMTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIGFzIGFuIGFycmF5IHRvIHRoZSBvcmlnaW5hbCBjbGFzcwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJNYXBwaW5nKGNob2ljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5kQ2xhc3NOYW1lKGNob2ljZVFOYW1lLCBpc0FycmF5KSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKGNob2ljZVFOYW1lLCBTY2hlbWFDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkdFN0YXR1cyhjaG9pY2VRTmFtZSwgU2NoZW1hQ29uc3RhbnRzLlBBUlRJQ0xFX1RZUEVfRUxFTUVOVCk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNYXhPY2N1cnMoY2hvaWNlUU5hbWUsIHhtbFNjaGVtYUNob2ljZS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGRNaW5PY2N1cnMoY2hvaWNlUU5hbWUsIHhtbFNjaGVtYUNob2ljZS5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWNvcmQgdGhlIG9yZGVyIGluIHRoZSBtZXRhaW5mIGhvbGRlciBmb3IgdGhlIGFueQotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgZWxlbWVudE9yZGVyTWFwLmdldChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJRTmFtZUluZGV4KGNob2ljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nSXRlbU51bWJlck9yZGVyICsgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgWG1sU2NoZW1hR3JvdXBSZWYpIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFHcm91cFJlZiB4bWxTY2hlbWFHcm91cFJlZiA9IChYbWxTY2hlbWFHcm91cFJlZikgY2hpbGQ7Ci0gICAgICAgICAgICAgICAgUU5hbWUgZ3JvdXBRTmFtZSA9IChRTmFtZSkgcGFydGljbGVRTmFtZU1hcC5nZXQoY2hpbGQpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheSA9IHhtbFNjaGVtYUdyb3VwUmVmLmdldE1heE9jY3VycygpID4gMTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIGFzIGFuIGFycmF5IHRvIHRoZSBvcmlnaW5hbCBjbGFzcwotICAgICAgICAgICAgICAgIFN0cmluZyBncm91cENsYXNzTmFtZSA9IChTdHJpbmcpIHByb2Nlc3NlZEdyb3VwVHlwZU1hcC5nZXQoZ3JvdXBRTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpewotICAgICAgICAgICAgICAgICAgICBncm91cENsYXNzTmFtZSA9IGdyb3VwQ2xhc3NOYW1lICsgIltdIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5yZWdpc3Rlck1hcHBpbmcoZ3JvdXBRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKGdyb3VwUU5hbWUsIFNjaGVtYUNvbnN0YW50cy5BUlJBWV9UWVBFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5hZGR0U3RhdHVzKGdyb3VwUU5hbWUsIFNjaGVtYUNvbnN0YW50cy5QQVJUSUNMRV9UWVBFX0VMRU1FTlQpOwotICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIuYWRkTWF4T2NjdXJzKGdyb3VwUU5hbWUsIHhtbFNjaGVtYUdyb3VwUmVmLmdldE1heE9jY3VycygpKTsKLSAgICAgICAgICAgICAgICBtZXRhaW5mSG9sZGVyLmFkZE1pbk9jY3Vycyhncm91cFFOYW1lLCB4bWxTY2hlbWFHcm91cFJlZi5nZXRNaW5PY2N1cnMoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YWluZkhvbGRlci5zZXRIYXNQYXJ0aWNsZVR5cGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3JkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWNvcmQgdGhlIG9yZGVyIGluIHRoZSBtZXRhaW5mIGhvbGRlciBmb3IgdGhlIGFueQotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcikgZWxlbWVudE9yZGVyTWFwLmdldChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFpbmZIb2xkZXIucmVnaXN0ZXJRTmFtZUluZGV4KGdyb3VwUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmdJdGVtTnVtYmVyT3JkZXIgKyBpbnRlZ2VyLmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0IHRoZSBvcmRlcmVkIGZsYWcgaW4gdGhlIG1ldGFpbmYgaG9sZGVyCi0gICAgICAgIG1ldGFpbmZIb2xkZXIuc2V0T3JkZXJlZChvcmRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sU2NoZW1hR3JvdXAKLSAgICAgKiBAcGFyYW0gc2NoZW1hR3JvdXBRTmFtZS0gd2UgaGF2ZSB0byBwYXNzIHRoaXMgc2luY2UgeG1sIHNjaGVtYSBkb2VzIG5vdCBwcm92aWRlCi0gICAgICogdGhpcyBwcm9wZXJseQotICAgICAqIEBwYXJhbSBwYXJlbnRTY2hlbWEKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0dyb3VwKFhtbFNjaGVtYUdyb3VwIHhtbFNjaGVtYUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hR3JvdXBRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZmluZCB0aGUgZ3JvdXAgYmFzZSBpdGVtCi0gICAgICAgIFhtbFNjaGVtYUdyb3VwQmFzZSB4bWxTY2hlbWFHcm91cEJhc2UgPSB4bWxTY2hlbWFHcm91cC5nZXRQYXJ0aWNsZSgpOwotICAgICAgICBpZiAoeG1sU2NoZW1hR3JvdXBCYXNlICE9IG51bGwpewotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUdyb3VwQmFzZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKXsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgeG1sU2NoZW1hR3JvdXBCYXNlOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Moc2NoZW1hR3JvdXBRTmFtZSwgeG1sU2NoZW1hU2VxdWVuY2UuZ2V0SXRlbXMoKSwgYmVhbldyaXRlck1ldGFJbmZvSG9sZGVyLCB0cnVlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIuc2V0UGFydGljbGVDbGFzcyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWUgPSB3cml0ZUNvbXBsZXhQYXJ0aWNsZShzY2hlbWFHcm91cFFOYW1lLCBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIpOwotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRHcm91cFR5cGVNYXAucHV0KHNjaGVtYUdyb3VwUU5hbWUsIGphdmFDbGFzc05hbWUpOwotLy8gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KHNjaGVtYUdyb3VwUU5hbWUsIGphdmFDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh4bWxTY2hlbWFHcm91cEJhc2UgaW5zdGFuY2VvZiBYbWxTY2hlbWFDaG9pY2UpewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNob2ljZSB4bWxTY2hlbWFDaG9pY2UgPSAoWG1sU2NoZW1hQ2hvaWNlKSB4bWxTY2hlbWFHcm91cEJhc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUNob2ljZS5nZXRJdGVtcygpLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBiZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRDaG9pY2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3Moc2NoZW1hR3JvdXBRTmFtZSwgeG1sU2NoZW1hQ2hvaWNlLmdldEl0ZW1zKCksIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciwgZmFsc2UsIHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlci5zZXRQYXJ0aWNsZUNsYXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YUNsYXNzTmFtZSA9IHdyaXRlQ29tcGxleFBhcnRpY2xlKHNjaGVtYUdyb3VwUU5hbWUsIGJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEdyb3VwVHlwZU1hcC5wdXQoc2NoZW1hR3JvdXBRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZW1hcC5wdXQoc2NoZW1hR3JvdXBRTmFtZSwgamF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBlbGVtZW50IGlzIGEgYmluYXJ5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbHQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaW5hcnkoWG1sU2NoZW1hRWxlbWVudCBlbHQpIHsKLSAgICAgICAgcmV0dXJuIGVsdC5nZXRTY2hlbWFUeXBlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5YU0RfQkFTRTY0LmVxdWFscyhlbHQuZ2V0U2NoZW1hVHlwZSgpLmdldFFOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gcW5hbWUgaXMgYSBiaW5hcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpbmFyeShRTmFtZSBxTmFtZSkgewotICAgICAgICByZXR1cm4gcU5hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5YU0RfQkFTRTY0LmVxdWFscyhxTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGUKLSAgICAgKiBAcGFyYW0geHNFbHQKLSAgICAgKiBAcGFyYW0gcGFyZW50U2NoZW1hCi0gICAgICogQHBhcmFtIHFuYW1lICAgICAgICAtIGZha2UgUW5hbWUgdG8gdXNlIGlmIHRoZSB4c0VsdCBpcyBudWxsLgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUoWG1sU2NoZW1hU2ltcGxlVHlwZSBzaW1wbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhzRWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgcGFyZW50U2NoZW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2ltcGxlVHlwZS5nZXRRTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwcm9jZXNzZWRUeXBlbWFwLmNvbnRhaW5zS2V5KHNpbXBsZVR5cGUuZ2V0UU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkoc2ltcGxlVHlwZS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTXVzdCBkbyB0aGlzIHVwIGZyb250IHRvIHN1cHBvcnQgcmVjdXJzaXZlIHR5cGVzCi0gICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2ltcGxlVHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIC8vIHdlIHB1dCB0aGUgcW5hbWUgdG8gcHJvY2Vzc2VkIHR5cGUgbWFwIGl0IGlzIG9ubHkgbmFtZWQgdHlwZQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgdG8gYW55IHdheSBwcm9jZXNzIHRoYXQgZWxlbWVudC4KLSAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVtYXAucHV0KHNpbXBsZVR5cGUuZ2V0UU5hbWUoKSwgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBRTmFtZSBmYWtlUW5hbWU7Ci0gICAgICAgICAgICBpZiAoeHNFbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZha2VRbmFtZSA9IG5ldyBRTmFtZSh4c0VsdC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCB4c0VsdC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgZ2V0TmV4dFR5cGVTdWZmaXgoeHNFbHQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc2V0IHRoaXMgb3RoZXJ3aXNlIHRoZSBvdXJzIGF0dHJpYnV0ZSB3b3VsZCBub3Qgc2V0IHByb3Blcmx5IGlmIHJlZmVyZWQgdG8gdGhpcyBzaW1wbGUKLSAgICAgICAgICAgICAgICAvLyB0eXBlIGZyb20gYW55IG90aGVyIGVsZW1lbnQKLSAgICAgICAgICAgICAgICB4c0VsdC5zZXRTY2hlbWFUeXBlTmFtZShmYWtlUW5hbWUpOwotICAgICAgICAgICAgICAgIGNoYW5nZWRFbGVtZW50U2V0LmFkZCh4c0VsdCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFrZVFuYW1lID0gcW5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZW1hcC5jb250YWluc0tleShmYWtlUW5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IGJhc2VTY2hlbWFUeXBlTWFwLmNvbnRhaW5zS2V5KGZha2VRbmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHdyaXRlci5tYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoZmFrZVFuYW1lKTsKLSAgICAgICAgICAgIHNpbXBsZVR5cGUuYWRkTWV0YUluZm8oU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5GQUtFX1FOQU1FLCBmYWtlUW5hbWUpOwotCi0gICAgICAgICAgICAvLyBzaG91bGQgcHV0IHRoaXMgdG8gdGhlIHByb2Nlc3NlZFR5cGVtYXAgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgY29ycmVjdGx5Ci0gICAgICAgICAgICBwcm9jZXNzZWRUeXBlbWFwLnB1dChmYWtlUW5hbWUsIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcmVnaXN0ZXIgdGhhdCBpbiB0aGUgc2NoZW1hIG1ldGFpbmZvIGJhZwotICAgICAgICBzaW1wbGVUeXBlLmFkZE1ldGFJbmZvKFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuQ0xBU1NOQU1FX0tFWSwKLSAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0KLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIgPSBwcm9jZXNzU2ltcGxlVHlwZShzaW1wbGVUeXBlLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICBtZXRhSW5mSG9sZGVyLnNldFNpbXBsZSh0cnVlKTsKLQotICAgICAgICBpZiAoc2ltcGxlVHlwZS5nZXRRTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkQW5vbnltb3VzQ29tcGxleFR5cGVzTWFwLnB1dCh4c0VsdCwgbWV0YUluZkhvbGRlcik7Ci0gICAgICAgICAgICBRTmFtZSBmYWtlUW5hbWU7Ci0gICAgICAgICAgICBpZiAoeHNFbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZha2VRbmFtZSA9IG5ldyBRTmFtZSh4c0VsdC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCB4c0VsdC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFrZVFuYW1lID0gcW5hbWU7Ci0gICAgICAgICAgICAgICAgc2ltcGxlVHlwZS5zZXROYW1lKGZha2VRbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZFNpbXBsZVR5cGVTZXQuYWRkKHNpbXBsZVR5cGUpOwotICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0U291cmNlVVJJKGZha2VRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaW1wbGVUeXBlc01hcC5wdXQoZmFrZVFuYW1lLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9hZGQgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgbWV0YWluZm8gaG9sZGVyCi0gICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0T3duUW5hbWUoc2ltcGxlVHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0T3duQ2xhc3NOYW1lKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICAvL3dyaXRlIHRoZSBjbGFzcy4gVGhpcyB0eXBlIG1hcHBpbmcgd291bGQgaGF2ZSBiZWVuIHBvcHVsYXRlZCByaWdodCBub3cKLSAgICAgICAgLy9Ob3RlIC0gV2UgYWx3YXlzIHdyaXRlIGNsYXNzZXMgZm9yIG5hbWVkIGNvbXBsZXggdHlwZXMKLSAgICAgICAgd3JpdGVTaW1wbGVUeXBlKHNpbXBsZVR5cGUsIG1ldGFJbmZIb2xkZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHByb2Nlc3NTaW1wbGVUeXBlKFhtbFNjaGVtYVNpbXBsZVR5cGUgc2ltcGxlVHlwZSwgWG1sU2NoZW1hIHBhcmVudFNjaGVtYSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFJbmZIb2xkZXIgPSBuZXcgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyKCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHRoZSByZXN0cmljdGlvbgotICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlQ29udGVudCBjb250ZW50ID0gc2ltcGxlVHlwZS5nZXRDb250ZW50KCk7Ci0gICAgICAgIFFOYW1lIHBhcmVudFNpbXBsZVR5cGVRbmFtZSA9IHNpbXBsZVR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgaWYgKHBhcmVudFNpbXBsZVR5cGVRbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJlbnRTaW1wbGVUeXBlUW5hbWUgPSAoUU5hbWUpIHNpbXBsZVR5cGUuZ2V0TWV0YUluZm9NYXAoKS5nZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5GQUtFX1FOQU1FKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbikgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbiByZXN0cmljdGlvbiA9IChYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24pIGNvbnRlbnQ7Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBiYXNlVHlwZU5hbWUgPSByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAvL2NoZWNrIHdoZXRoZXIgdGhlIGJhc2UgdHlwZSBpcyBvbmUgb2YgdGhlIGJhc2Ugc2NoZW1hIHR5cGVzCi0KLSAgICAgICAgICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkoYmFzZVR5cGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvL3Byb2Nlc3MgcmVzdHJpY3Rpb24gYmFzZSB0eXBlCi0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVJlc3RyaWN0aW9uQmFzZVR5cGUocGFyZW50U2ltcGxlVHlwZVFuYW1lLCByZXN0cmljdGlvbi5nZXRCYXNlVHlwZU5hbWUoKSwgbWV0YUluZkhvbGRlciwgcGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgLy9wcm9jZXNzIGZhY2V0cwotICAgICAgICAgICAgICAgICAgICBpZiAoIVNjaGVtYUNvbnN0YW50cy5YU0RfQk9PTEVBTi5lcXVhbHMoYmFzZVR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmFjZXRzKHJlc3RyaWN0aW9uLCBtZXRhSW5mSG9sZGVyLCBwYXJlbnRTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWN1cnNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBhIHhtbHNjaGVtYSBidWcKLSAgICAgICAgICAgICAgICAgICAgLy8gaXQgc2hvdWxkIHJldHVybiB0aGUgc2NoZW1hdHlwZSBmb3IgcmVzdHJpY3Rpb24uZ2V0QmFzZVR5cGUoKToKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgYmFzZVR5cGVOYW1lLCBDT01QT05FTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgYmFzZVR5cGVOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBwYXJlbnQgc2NoZW1hICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSByZXN0cmljdGlvbkJhc2VUeXBlID0gcmVzb2x2ZWRTY2hlbWEuZ2V0VHlwZUJ5TmFtZShiYXNlVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0aW9uQmFzZVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXN0cmljdGlvbkJhc2VUeXBlICE9IG51bGwpICYmICghaXNBbHJlYWR5UHJvY2Vzc2VkKGJhc2VUeXBlTmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKChYbWxTY2hlbWFTaW1wbGVUeXBlKSByZXN0cmljdGlvbkJhc2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHJlc29sdmVkU2NoZW1hLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVSZXN0cmljdGlvbkJhc2VUeXBlKHBhcmVudFNpbXBsZVR5cGVRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLmdldEJhc2VUeXBlTmFtZSgpLCBtZXRhSW5mSG9sZGVyLCByZXNvbHZlZFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVVbmlvbikgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGVVbmlvbiBzaW1wbGVUeXBlVW5pb24gPSAoWG1sU2NoZW1hU2ltcGxlVHlwZVVuaW9uKSBjb250ZW50OwotICAgICAgICAgICAgICAgIFFOYW1lW10gcW5hbWVzID0gc2ltcGxlVHlwZVVuaW9uLmdldE1lbWJlclR5cGVzUU5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBxbmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVNjaGVtYVR5cGVNYXAuY29udGFpbnNLZXkocW5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5hZGRNZW1iZXJUeXBlKHFuYW1lLCAoU3RyaW5nKSBiYXNlU2NoZW1hVHlwZU1hcC5nZXQocW5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgcW5hbWUsIENPTVBPTkVOVF9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgcW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aGUgcGFyZW50IHNjaGVtYSAiICsgcGFyZW50U2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKHFuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIG1lbWJlclNpbXBsZVR5cGUgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZSkgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNBbHJlYWR5UHJvY2Vzc2VkKHFuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTaW1wbGVTY2hlbWFUeXBlKG1lbWJlclNpbXBsZVR5cGUsIG51bGwsIHJlc29sdmVkU2NoZW1hLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkTWVtYmVyVHlwZShxbmFtZSwgKFN0cmluZykgcHJvY2Vzc2VkVHlwZW1hcC5nZXQocW5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbigiVW5pb25zIGNhbiBub3QgaGF2ZSBjb21wbGV4IHR5cGVzIGFzIGEgbWVtYmVyIHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24geG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiA9IHNpbXBsZVR5cGVVbmlvbi5nZXRCYXNlVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0IHhtbFNjaGVtYU9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgY2hpbGRRbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAxOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB4bWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uLmdldEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hT2JqZWN0ID0gKFhtbFNjaGVtYU9iamVjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hT2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgdW5pb25TaW1wbGVUeXBlID0gKFhtbFNjaGVtYVNpbXBsZVR5cGUpIHhtbFNjaGVtYU9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFFuYW1lID0gdW5pb25TaW1wbGVUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgYSBmYWtlIFFuYW1lIGZvciBhbGwgdGhlc2Ugc2ltcGxlIHR5cGVzIHNpbmNlIG1vc3QgcHJvcGFibHkgdGhleSBkb24ndCBoYXZlIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFFuYW1lID0gbmV3IFFOYW1lKHBhcmVudFNpbXBsZVR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcGFyZW50U2ltcGxlVHlwZVFuYW1lLmdldExvY2FsUGFydCgpICsgZ2V0TmV4dFR5cGVTdWZmaXgocGFyZW50U2ltcGxlVHlwZVFuYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gaW5uZXIgc2ltcGxlIHR5cGUgb2YgdGhlIHVuaW9uIHNvIGl0IHNob2xkIG5vdCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUodW5pb25TaW1wbGVUeXBlLCBudWxsLCBwYXJlbnRTY2hlbWEsIGNoaWxkUW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuYWRkTWVtYmVyVHlwZShjaGlsZFFuYW1lLCAoU3RyaW5nKSBwcm9jZXNzZWRUeXBlbWFwLmdldChjaGlsZFFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0VW5pb24odHJ1ZSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZUxpc3Qgc2ltcGxlVHlwZUxpc3QgPSAoWG1sU2NoZW1hU2ltcGxlVHlwZUxpc3QpIGNvbnRlbnQ7Ci0gICAgICAgICAgICAgICAgUU5hbWUgaXRlbVR5cGVRTmFtZSA9IHNpbXBsZVR5cGVMaXN0LmdldEl0ZW1UeXBlTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW1UeXBlUU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQWxyZWFkeVByb2Nlc3NlZChpdGVtVHlwZVFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHJlc29sdmVkU2NoZW1hID0gZ2V0UGFyZW50U2NoZW1hKHBhcmVudFNjaGVtYSwgaXRlbVR5cGVRTmFtZSwgQ09NUE9ORU5UX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgdHlwZSAiICsgaXRlbVR5cGVRTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gdGhlIHBhcmVudCB0eXBlICIgKyBwYXJlbnRTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNpbXBsZVNjaGVtYVR5cGUgPSByZXNvbHZlZFNjaGVtYS5nZXRUeXBlQnlOYW1lKGl0ZW1UeXBlUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaW1wbGVTY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU2ltcGxlU2NoZW1hVHlwZSgoWG1sU2NoZW1hU2ltcGxlVHlwZSkgc2ltcGxlU2NoZW1hVHlwZSwgbnVsbCwgcmVzb2x2ZWRTY2hlbWEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNpbXBsZVR5cGUgbGlzdFNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlTGlzdC5nZXRJdGVtVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZVFOYW1lID0gbGlzdFNpbXBsZVR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1UeXBlUU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY3JlYXRlIGEgZmFrZSBRbmFtZSBmb3IgYWxsIHRoZXNlIHNpbXBsZSB0eXBlcyBzaW5jZSBtb3N0IHByb3BhYmx5IHRoZXkgZG9uJ3QgaGF2ZSBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlUU5hbWUgPSBuZXcgUU5hbWUocGFyZW50U2ltcGxlVHlwZVFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwYXJlbnRTaW1wbGVUeXBlUW5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiX3R5cGUwIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1NpbXBsZVNjaGVtYVR5cGUobGlzdFNpbXBsZVR5cGUsIG51bGwsIHBhcmVudFNjaGVtYSwgaXRlbVR5cGVRTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZmluZENsYXNzTmFtZShpdGVtVHlwZVFOYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbWV0YUluZkhvbGRlci5zZXRMaXN0KHRydWUpOwotICAgICAgICAgICAgICAgIG1ldGFJbmZIb2xkZXIuc2V0SXRlbVR5cGVRTmFtZShpdGVtVHlwZVFOYW1lKTsKLSAgICAgICAgICAgICAgICBtZXRhSW5mSG9sZGVyLnNldEl0ZW1UeXBlQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0YUluZkhvbGRlcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZpbmQgd2hldGhlciBhIGdpdmVuIHBhcnRpY2xlIGlzIGFuIGFycmF5LiBUaGUgbG9naWMgZm9yIGRlY2lkaW5nCi0gICAgICogd2hldGhlciBhIGdpdmVuIHBhcnRpY2xlIGlzIGFuIGFycmF5IGlzIGRlcGVuZGluZyBvbiB0aGVpciBtaW5PY2N1cnMKLSAgICAgKiBhbmQgbWF4T2NjdXJzIGNvdW50cy4gSWYgTWF4b2NjdXJzIGlzIGdyZWF0ZXIgdGhhbiBvbmUgKDEpIHRoZW4gdGhlCi0gICAgICogY29udGVudCBpcyBhbiBhcnJheS4KLSAgICAgKiBBbHNvIG5vIGhpZ2hlciBsZXZlbCBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgbWF4T2NjdXJzIGdyZWF0ZXIgdGhhbiBvbmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJ0aWNsZQotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcnJheShYbWxTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgbG9uZyBtaW5PY2N1cnMgPSBwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgbG9uZyBtYXhPY2N1cnMgPSBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKTsKLQotICAgICAgICBpZiAobWF4T2NjdXJzIDwgbWluT2NjdXJzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobWF4T2NjdXJzID4gMSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIEhhc2hNYXAgbWFwVHlwZUNvdW50ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIFN0cmluZyBnZXROZXh0VHlwZVN1ZmZpeChTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIEludGVnZXIgdHlwZUNvdW50ZXIgPSAoSW50ZWdlcikgbWFwVHlwZUNvdW50LmdldChsb2NhbE5hbWUpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpZiAodHlwZUNvdW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYodHlwZUNvdW50ZXIuaW50VmFsdWUoKSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSB0eXBlQ291bnRlci5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1hcFR5cGVDb3VudC5wdXQobG9jYWxOYW1lLCBuZXcgSW50ZWdlcihjb3VudCsxKSk7Ci0gICAgICAgIHJldHVybiAoIl90eXBlIiArIGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBwYXJlbnQgc2NoZW1hIG9mIHRoZSBjb21wb25ldCBoYXZpbmcgUU5hbWUgY29tcG9lbnRUeXBlUU5hbWUuCi0gICAgICogd2l0aGUgdGhlIGNvbXBvbmV0IHR5cGUuCi0gICAgICogQHBhcmFtIHBhcmVudFNjaGVtYSAtIHBhcmVudCBzY2hlbWEgb2YgdGhlIGdpdmVuIGNvbXBvbmV0Ci0gICAgICogQHBhcmFtIGNvbXBvbmVudFFOYW1lIC0gcW5hbWUgb2YgdGhlIGNvbXBvbmV0LCBvZiB3aGljaCB3ZSB3YW50IHRvIGdldCB0aGUgcGFyZW50IHNjaGVtYQotICAgICAqIEBwYXJhbSBjb21wb25ldFR5cGUgLSB0eXBlIG9mIHRoZSBjb21wb25ldC4gdGhpcyBjYW4gZWl0aGVyIGJlIHR5cGUsZWxlbWVudCxhdHRyaWJ1dGUgb3IgYXR0cmlidXRlIGdyb3VwCi0gICAgICogQHJldHVybiBwYXJlbnQgc2NoZW1hLgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWEgZ2V0UGFyZW50U2NoZW1hKFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGNvbXBvbmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZXRUeXBlKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBpZiB0aGUgY29tcG9uZXQgZG8gbm90IGhhdmUgYSBwcm9wZXJuYW1lc2FwY2Ugb3IKLSAgICAgICAgLy8gaXQgaXMgZXF1YWxzIHRvIHRoZSB4c2Qgc2NoZW1hIG5hbWVzYXBjZQotICAgICAgICAvLyB3ZSBkbyBub3QgaGF2ZSB0byBkbyBhbnkgdGhpbmcuCi0gICAgICAgIGlmICgoY29tcG9uZW50UU5hbWUgPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgKGNvbXBvbmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QuZXF1YWxzKGNvbXBvbmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSl7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50U2NoZW1hOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCB2aXNpdGVkU2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdmlzaXRlZFNjaGVtYXMuYWRkKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgIFhtbFNjaGVtYSBuZXdQYXJlbnRTY2hlbWEgPSBnZXRQYXJlbnRTY2hlbWFGcm9tSW5jbHVkZXMocGFyZW50U2NoZW1hLAotICAgICAgICAgICAgICAgIGNvbXBvbmVudFFOYW1lLGNvbXBvbmV0VHlwZSx2aXNpdGVkU2NoZW1hcyk7Ci0gICAgICAgIGlmIChuZXdQYXJlbnRTY2hlbWEgPT0gbnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY29tcG9uZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobG9hZGVkU2NoZW1hTWFwLmNvbnRhaW5zS2V5KHRhcmdldE5hbWVzcGFjZSkpewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSB0ZW1wU2NoZW1hID0gKFhtbFNjaGVtYSkgbG9hZGVkU2NoZW1hTWFwLmdldCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChpc0NvbXBvbmV0RXhpc3RzKHRlbXBTY2hlbWEsY29tcG9uZW50UU5hbWUsY29tcG9uZXRUeXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudFNjaGVtYSA9IHRlbXBTY2hlbWE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVTY2hlbWFNYXAuY29udGFpbnNLZXkodGFyZ2V0TmFtZXNwYWNlKSl7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHRlbXBTY2hlbWEgPSAoWG1sU2NoZW1hKSBhdmFpbGFibGVTY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZXRFeGlzdHModGVtcFNjaGVtYSxjb21wb25lbnRRTmFtZSxjb21wb25ldFR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZSh0ZW1wU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50U2NoZW1hID0gdGVtcFNjaGVtYTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ld1BhcmVudFNjaGVtYTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYSBnZXRQYXJlbnRTY2hlbWFGcm9tSW5jbHVkZXMoWG1sU2NoZW1hIHBhcmVudFNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgY29tcG9uZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25ldFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgdmlzaXRlZFNjaGVtYXMpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgWG1sU2NoZW1hIG5ld1BhcmVudFNjaGVtYSA9IG51bGw7Ci0gICAgICAgIGlmIChpc0NvbXBvbmV0RXhpc3RzKHBhcmVudFNjaGVtYSwgY29tcG9uZW50UU5hbWUsIGNvbXBvbmV0VHlwZSkpIHsKLSAgICAgICAgICAgIG5ld1BhcmVudFNjaGVtYSA9IHBhcmVudFNjaGVtYTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgY29tcG9uZXQgbXVzdCBlaXRoZXIgYmUgaW4gYSBpbXBvcnQgb3IgYW5kIGluY2x1ZGUKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaW5jbHVkZXMgPSBwYXJlbnRTY2hlbWEuZ2V0SW5jbHVkZXMoKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGV4dGVybmFsQ29tcG9uZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBleHRlcm5hbFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuZ2V0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVybmFsQ29tcG9uZXQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsQ29tcG9uZXQgaW5zdGFuY2VvZiBYbWxTY2hlbWFFeHRlcm5hbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTY2hlbWEgPSAoKFhtbFNjaGVtYUV4dGVybmFsKSBleHRlcm5hbENvbXBvbmV0KS5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbmxpbmUgaW1wb3J0IHdpdGhvdXQgYSBzY2hlbWEgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhtbHNjaGVtYSBkb2VzIG5vdCBsb2FkIHRoZSBzY2hlbWEuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSB0cnkgdG8gZmlndXJlIG91dCBpdCBlaXRoZXIgZnJvbSB0aGUgYXZhaWxhYmxlIHNjaGVtYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGZyb20gdGhlIGxhZGVkIHNjaGVtYXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGV4dGVybmFsU2NoZW1hID09IG51bGwpICYmIGV4dGVybmFsQ29tcG9uZXQgaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUltcG9ydCB4bWxTY2hlbWFJbXBvcnQgPSAoWG1sU2NoZW1hSW1wb3J0KSBleHRlcm5hbENvbXBvbmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnROYW1lc3BjZSA9IHhtbFNjaGVtYUltcG9ydC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGltcG9ydE5hbWVzcGNlICE9IG51bGwpICYmICFpbXBvcnROYW1lc3BjZS5lcXVhbHMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZWRTY2hlbWFNYXAuY29udGFpbnNLZXkoaW1wb3J0TmFtZXNwY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbFNjaGVtYSA9IChYbWxTY2hlbWEpIGxvYWRlZFNjaGVtYU1hcC5nZXQoaW1wb3J0TmFtZXNwY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZVNjaGVtYU1hcC5jb250YWluc0tleShpbXBvcnROYW1lc3BjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSB0ZW1wU2NoZW1hID0gKFhtbFNjaGVtYSkgYXZhaWxhYmxlU2NoZW1hTWFwLmdldChpbXBvcnROYW1lc3BjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlKHRlbXBTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxTY2hlbWEgPSB0ZW1wU2NoZW1hOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVybmFsU2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBjb21wb25ldCBpbiB0aGUgbmV3IGV4dGVybmFsIHNjaGVtYS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRTY2hlbWFzLmNvbnRhaW5zKGV4dGVybmFsU2NoZW1hKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRTY2hlbWFzLmFkZChleHRlcm5hbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudFNjaGVtYSA9IGdldFBhcmVudFNjaGVtYUZyb21JbmNsdWRlcyhleHRlcm5hbFNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRRTmFtZSwgY29tcG9uZXRUeXBlLCB2aXNpdGVkU2NoZW1hcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmVudFNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHdlIGhhdmUgZm91bmQgdGhlIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdQYXJlbnRTY2hlbWE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcG9uZXRFeGlzdHMoWG1sU2NoZW1hIHNjaGVtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBjb21wb25lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZXRUeXBlKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKGNvbXBvbmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSl7Ci0gICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoY29tcG9uZXRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9UWVBFIDogewotICAgICAgICAgICAgICAgIGlzRXhpc3RzID0gKHNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBvbmVudFFOYW1lLmdldExvY2FsUGFydCgpKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX0VMRU1FTlQgOiB7Ci0gICAgICAgICAgICAgICAgaXNFeGlzdHMgPSAoc2NoZW1hLmdldEVsZW1lbnRCeU5hbWUoY29tcG9uZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfQVRUUklCVVRFIDogewotICAgICAgICAgICAgICAgIGlzRXhpc3RzID0gKHNjaGVtYS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SXRlbShjb21wb25lbnRRTmFtZSkgIT0gbnVsbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENPTVBPTkVOVF9BVFRSSUJVVEVfR1JPVVAgOiB7Ci0gICAgICAgICAgICAgICAgaXNFeGlzdHMgPSAoc2NoZW1hLmdldEF0dHJpYnV0ZUdyb3VwcygpLmdldEl0ZW0oY29tcG9uZW50UU5hbWUpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDT01QT05FTlRfR1JPVVAgOiB7Ci0gICAgICAgICAgICAgICAgaXNFeGlzdHMgPSAoc2NoZW1hLmdldEdyb3VwcygpLmdldEl0ZW0oY29tcG9uZW50UU5hbWUpICE9IG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgcmV0dXJuIGlzRXhpc3RzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9TY2hlbWFDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9TY2hlbWFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZTViYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvU2NoZW1hQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQ29uc3RhbnRzIGZvciB0aGUgUU5hbWVzIG9mIHN0YW5kYXJkIHNjaGVtYSB0eXBlcwotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29uc3RhbnRzIHsKLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCA9IENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NUUklORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAic3RyaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQk9PTEVBTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYm9vbGVhbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZG91YmxlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRkxPQVQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfSU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTE9ORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NIT1JUID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzaG9ydCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0JZVEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImJ5dGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ERUNJTUFMID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkZWNpbWFsIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQkFTRTY0ID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9IRVhCSU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImhleEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0FOWVNJTVBMRVRZUEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImFueVNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9BTllUWVBFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnlUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9RTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiUU5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkYXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidGltZSIpOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FRExPTkcgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInVuc2lnbmVkTG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1VOU0lHTkVESU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJ1bnNpZ25lZEludCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1VOU0lHTkVEU0hPUlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInVuc2lnbmVkU2hvcnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FREJZVEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInVuc2lnbmVkQnl0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1BPU0lUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAicG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTkVHQVRJVkVJTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJuZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT05ORUdBVElWRUlOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIm5vbk5lZ2F0aXZlSW50ZWdlciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05PTlBPU0lUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAibm9uUG9zaXRpdmVJbnRlZ2VyIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ZRUFSTU9OVEggPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImdZZWFyTW9udGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9NT05USERBWSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZ01vbnRoRGF5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfWUVBUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZ1llYXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9NT05USCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZ01vbnRoIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfREFZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJnRGF5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRFVSQVRJT04gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImR1cmF0aW9uIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OQU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJOYW1lIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTkNOQU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJOQ05hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OTVRPS0VOID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJOTVRPS0VOIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTk1UT0tFTlMgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIk5NVE9LRU5TIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTk9UQVRJT04gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIk5PVEFUSU9OIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRU5USVRZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJFTlRJVFkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9FTlRJVElFUyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiRU5USVRJRVMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JRFJFRiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiSURSRUYiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JRFJFRlMgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIklEUkVGUyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0FOWVVSSSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYW55VVJJIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTEFOR1VBR0UgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImxhbmd1YWdlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfSUQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIklEIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfU0NIRU1BID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzY2hlbWEiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05PUk1BTElaRURTVFJJTkcgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgIm5vcm1hbGl6ZWRTdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9UT0tFTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidG9rZW4iKTsKLQotICAgIC8vc29hcCBlbmNvZGluZyBjb25zdGFudHMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0FSUkFZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiQXJyYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfU1RSVUNUID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiU3RydWN0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0JBU0U2NCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImJhc2U2NCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19EVVJBVElPTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImR1cmF0aW9uIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0RBVEVUSU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfTk9UQVRJT04gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJOT1RBVElPTiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19USU1FID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidGltZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZGF0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HWUVBUk1PTlRIID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZ1llYXJNb250aCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HWUVBUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImdZZWFyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0dNT05USERBWSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImdNb250aERheSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HREFZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiZ0RheSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19HTU9OVEggPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJnTW9udGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfQk9PTEVBTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImJvb2xlYW4iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfQkFTRTY0QklOQVJZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiYmFzZTY0QmluYXJ5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0hFWEJJTkFSWSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImhleEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19GTE9BVCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImRvdWJsZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19BTllVUkkgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJhbnlVUkkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfUU5BTUUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJRTmFtZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19TVFJJTkcgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJzdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfTk9STUFMSVpFRFNUUklORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIm5vcm1hbGl6ZWRTdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVE9LRU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJ0b2tlbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19MQU5HVUFHRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImxhbmd1YWdlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05BTUUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJOYW1lIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05NVE9LRU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJOTVRPS0VOIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05DTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIk5DTmFtZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19OTVRPS0VOUyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIk5NVE9LRU5TIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0lEID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiSUQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfSURSRUYgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJJRFJFRiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19FTlRJVFkgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJFTlRJVFkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfSURSRUZTID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiSURSRUZTIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX0VOVElUSUVTID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiRU5USVRJRVMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfREVDSU1BTCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImRlY2ltYWwiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgImludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfTk9OUE9TSVRJVkVJTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAibm9uUG9zaXRpdmVJbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX05FR0FUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgIm5lZ2F0aXZlSW50ZWdlciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19MT05HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19JTlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJpbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfU0hPUlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJzaG9ydCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19CWVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAiYnl0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9FTkNPRElOR19OT05ORUdBVElWRUlOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1NPQVBfRU5DT0RJTkcsICJub25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVU5TSUdORURMT05HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidW5zaWduZWRMb25nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX1VOU0lHTkVESU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidW5zaWduZWRJbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVU5TSUdORURTSE9SVCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgInVuc2lnbmVkU2hvcnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfRU5DT0RJTkdfVU5TSUdORURCWVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9TT0FQX0VOQ09ESU5HLCAidW5zaWduZWRCeXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0VOQ09ESU5HX1BPU0lUSVZFSU5URUdFUiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfU09BUF9FTkNPRElORywgInBvc2l0aXZlSW50ZWdlciIpOwotCi0KLSAgICAvL2JpdCBwYXR0ZXJucyBmb3IgdGhlIHR5cGVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX1RZUEUgPSAweDAwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9UWVBFID0gMHgwMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSUkFZX1RZUEUgPSAweDAwMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZX1RZUEUgPSAweDAwMDg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZX1RZUEUgPSAweDAwMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUxfVFlQRSA9IDB4MDAyMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfVFlQRV9PUl9DT05URU5UID0gMHgwMDQwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOTkVSX0NIT0lDRV9FTEVNRU5UID0gMHgwMDgwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRJQ0xFX1RZUEVfRUxFTUVOVCA9IDB4MDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZW1hUHJvcGVydHlOYW1lc3sKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfQ09NUElMRVJfUFJPUEVSVElFUyA9ICIvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcyI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFQU5fV1JJVEVSX0tFWSA9ICJzY2hlbWEuYmVhbi53cml0ZXIuY2xhc3MiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX1dSSVRFUl9URU1QTEFURV9LRVkgPSAic2NoZW1hLmJlYW4ud3JpdGVyLnRlbXBsYXRlIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9XUklURVJfVFlQRU1BUF9LRVkgPSAic2NoZW1hLmJlYW4udHlwZW1hcCI7Ci0gICAgfQotCi0gICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZW1hQ29tcGlsZXJBcmd1bWVudHN7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUF9TQ0hFTUFfQ0xBU1NFUyA9ICJ3IjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfU0NIRU1BX0NMQVNTRVMgPSAiciI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFID0gInMiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gInAiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRVJfUEFDS0FHRSA9ICJtcCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBFUl9NT0RFID0gImgiOwotICAgICAgICAvLyB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCBtaW5PY2N1cnMgPTAgZm9yIGFsbCB0aGUgZWxlbWVudHMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0ZGX1NUUklDVF9WQUxJREFUSU9OID0gIm9zdiI7Ci0gICAgICAgIC8vIHRoaXMgb3B0aW9uIGlzIHVzZWQgdG8gdXNlIFdyYXBwZXIgY2xhc3NlcyBmb3IgcHJpbWl0aXZlcwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfV1JBUFBFUl9DTEFTU0VTID0gInV3YyI7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNjaGVtYUNvbXBpbGVySW5mb0hvbGRlcnsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX0tFWSA9ICJDTEFTU19OQU1FIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NOQU1FX1BSSU1JVFZFX0tFWSA9ICJDTEFTU19OQU1FX1BSSU1JVElWRSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBS0VfUU5BTUUgPSAiUV9OQU1FIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvWFNEMkphdmEuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9YU0QySmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmNjRlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9YU0QySmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmkxOG4uU2NoZW1hQ29tcGlsZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRDJKYXZhIHsKLQotICAgIC8qKgotICAgICAqIGZvciBub3cgdGhlIGFyZ3VtZW50cyB0aGlzIG1haW4gbWV0aG9kIGFjY2VwdHMgaXMgdGhlIHNvdXJjZSBzY2hlbWEgYW5kIHRoZSBvdXRwdXQKLSAgICAgKiBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIC8vIHByaW50b3V0IHRoZSBvcHRpb25zCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEueHNkYXJnMSIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS54c2RhcmcyIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29tcGlsZShhcmdzWzBdLCBhcmdzWzFdKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHhzZE5hbWUKLSAgICAgKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXBpbGUoU3RyaW5nIHhzZE5hbWUsIFN0cmluZyBvdXRwdXRMb2NhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvL2xvYWQgdGhlIGN1cnJlbnQgU2NoZW1hIHRocm91Z2ggYSBmaWxlCi0gICAgICAgICAgICAvL2ZpcnN0IHJlYWQgdGhlIGZpbGUgaW50byBhIERPTQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXcgRmlsZSh4c2ROYW1lKSk7Ci0KLSAgICAgICAgICAgIC8vbm93IHJlYWQgaXQgdG8gYSBzY2hlbWEKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYSBjdXJyZW50U2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLCBudWxsKTsKLQotICAgICAgICAgICAgRmlsZSBvdXRwdXRGb2xkZXIgPSBuZXcgRmlsZShvdXRwdXRMb2NhdGlvbik7Ci0gICAgICAgICAgICBpZiAob3V0cHV0Rm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dEZvbGRlci5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEubG9jYXRpb25Ob3RGb2xkZXIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbXBpbGVyT3B0aW9ucyBjb21waWxlck9wdGlvbnMgPSBuZXcgQ29tcGlsZXJPcHRpb25zKCk7Ci0gICAgICAgICAgICBjb21waWxlck9wdGlvbnMuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0Rm9sZGVyKTsKLSAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRHZW5lcmF0ZUFsbCh0cnVlKTsKLQotLy8gICAgICAgICAgICBNYXAgbmFtZXNwYWNlMlBhY2thZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8gICAgICAgICAgICBuYW1lc3BhY2UyUGFja2FnZU1hcC5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hL3NjaGVtYSIsCi0vLyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkIik7Ci0vLyAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXROczJQYWNrYWdlTWFwKG5hbWVzcGFjZTJQYWNrYWdlTWFwKTsKLS8vICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldE1hcHBlckNsYXNzUGFja2FnZSgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QiKTsKLQotICAgICAgICAgICAgLy90b2RvIC0gdGhpcyBzaG91bGQgY29tZSBmcm9tIHRoZSB1c2VycyBwcmVmZXJlbmNlcwotICAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRXcmFwQ2xhc3NlcyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vdGhlcmUncyBubyBwb2ludCBpbiBub3Qgd3JpdGluZyB0aGUgY2xhc3NlcyBoZXJlLgotICAgICAgICAgICAgIGNvbXBpbGVyT3B0aW9ucy5zZXRXcml0ZU91dHB1dCh0cnVlKTsKLQotLy8gICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFVzZVdyYXBwZXJDbGFzc2VzKHRydWUpOwotCi0gICAgICAgICAgICBTY2hlbWFDb21waWxlciBjb21waWxlciA9IG5ldyBTY2hlbWFDb21waWxlcihjb21waWxlck9wdGlvbnMpOwotICAgICAgICAgICAgY29tcGlsZXIuY29tcGlsZShjdXJyZW50U2NoZW1hKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYy1zY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Mtc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2Y2MzNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYy1zY2hlbWEtY29tcGlsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIFNjaGVtYSBDb21waWxlciBwcm9wZXJ0aWVzIGZvciBBeGlzMi9DICAjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFRoZSBiZWFuIHdyaXRlciBjbGFzcwotIyBUaGUgYmVhbiB3cml0ZXIgaXMgdGhlIGNsYXNzIHVzZWQgYnkgdGhlIHNjaGVtYSBjb21waWxlciB0byB3cml0ZSB0aGUgYmVhbnMKLSMgYW5kIHNob3VsZCBpbXBsZW1lbnQgdGhlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlci5CZWFuV3JpdGVyCi0jIGludGVmYWNlCi0jCi1zY2hlbWEuYmVhbi53cml0ZXIuY2xhc3M9b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEud3JpdGVyLkNTdHJ1Y3RXcml0ZXIKLSMKLSMgYmVhbiB3cml0ZXIgdGVtcGxhdGUKLSMgVGhlIGJlYW4gd3JpdGVycyB0ZW1wbGF0ZSBpcyBpdCdzIG93biByZXNwb25zaWJpbHR5LiAoQSBiZWFuIHdyaXRlciBwcm92aWRlcgotIyBtYXkgY2hvb3NlIG5vdCB0byB1c2UgYSB0ZW1wbGF0ZSBhdCBhbGwhKSBIb3dldmVyIHRoZSBwcm9wZXJ0eSBsb2FkZXIgd2lsbAotIyBsb2FkIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGVzIChyZWZlcmVuY2UpIGFuZCBwcm92aWRlIGl0IGFuZCBpbiB0aGUgY2FzZSB3aGVuIHRoZQotIyBiZWFuIHdyaXRlciBpcyBub3Qgc3RhdGljYWxseSBib3VuZCB0byBhIHRlbXBsYXRlLCB0aGlzJ2xsIGJlIHVzZWZ1bC4KLSMKLXNjaGVtYS5iZWFuLndyaXRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZQotIwotIyBUaGUgdHlwZSBtYXAgdG8gYmUgdXNlZCBieSB0aGUgc2NoZW1hIGNvbXBpbGVyCi0jCi1zY2hlbWEuYmVhbi50eXBlbWFwPW9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuQ1R5cGVNYXAKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL1NjaGVtYUNvbXBpbGVyTWVzc2FnZXMuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL1NjaGVtYUNvbXBpbGVyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyYTM5OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaTE4bi9TY2hlbWFDb21waWxlck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pMThuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VCdW5kbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlcwotICogVGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIGJ1dCBqdXN0IHRoaXNDbGFzcyBzdGF0aWMgcmVmZXJlbmNlCi0gKiBoYXMgU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5jbGFzcwotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hQ29tcGlsZXJNZXNzYWdlcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyB0aGlzQ2xhc3MgPSBTY2hlbWFDb21waWxlck1lc3NhZ2VzLmNsYXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gTWVzc2FnZXNDb25zdGFudHMucHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gTWVzc2FnZXNDb25zdGFudHMucmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBNZXNzYWdlc0NvbnN0YW50cy5sb2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlKHRoaXNDbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQgPQotICAgICAgICAgICAgKE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RQYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKQotICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICA6IE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RCdW5kbGU7Ci0KLQotICAgIC8qKgotICAgICAqICoqIE5PIE5FRUQgVE8gQ0hBTkdFIEFOWVRISU5HIEJFTE9XICoqKioKLSAgICAgKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9Ci0gICAgICAgICAgICBuZXcgTWVzc2FnZUJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLCBjbGFzc0xvYWRlciwgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUJ1bmRsZSBnZXRNZXNzYWdlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKS5pbnRlcm4oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ3ZWY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jIyMjIyMjIyMjIyMjIyMjIyMgWFNEMmphdmEgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2NoZW1hLnhzZGFyZzE9QXJndW1lbnQxIC0gU291cmNlIHNjaGVtYSBmaWxlIG5hbWUKLXNjaGVtYS54c2RhcmcyPUFyZ3VtZW50MiAtIE91dHB1dCBmb2xkZXIgbmFtZQotc2NoZW1hLmxvY2F0aW9uTm90Rm9sZGVyPXNwZWNpZmllZCBsb2NhdGlvbiBpcyBub3QgYSBmb2xkZXIhCi1zY2hlbWEuY29tcGlsZXJleGNlcHRpb249Q29tcGlsZXIgY2F1c2VkIGFuIGV4Y2VwdGlvbgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjU2NoZW1hIGNvbXBpbGVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNjaGVtYS51bnN1cHBvcnRlZGNvbnRlbnRlcnJvcj1VbnN1cHBvcnRlZCBjb250ZW50IHswfSAhCi1zY2hlbWEudW5rbm93bmNvbnRlbnRlcnJvcj1Vbmtub3duIGNvbnRlbnQhCi1zY2hlbWEuZWxlbWVudE51bGw9TnVsbCBlbGVtZW50IGVuY291bnRlcmVkISBQbGVhc2UgY2hlY2sgeW91ciBzY2hlbWEhCi1zY2hlbWEucmVmZXJlbmNlZEVsZW1lbnROb3RGb3VuZD1UaGUgcmVmZXJlbmNlZCBlbGVtZW50ICcnezB9Jycgd2FzIG5vdCBmb3VuZCEKLXNjaGVtYS5lbGVtZW50V2l0aE5vVHlwZT1Db3VsZCBub3QgZmluZCBhbnkgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBFbGVtZW50ICcnezB9JycKLXNjaGVtYS5lbXB0eU5hbWU9TWlzc2luZyBuYW1lIGF0dHJpYnV0ZSEgUGxlYXNlIGNoZWNrIHlvdXIgc2NoZW1hIQotIyMjIyMjIyMjIyMjIyMjIyMjIE9wdGlvbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zY2hlbWEudW5zdXBwb3J0ZWR2YWx1ZT1VbnN1cHBvcnRlZCB2YWx1ZSEKLQotIyMjIyMjIyMjIyMjIyMjIyMjIEphdmEgYmVhbiB3cml0ZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2NoZW1hLnJvb3Rub3Rmb2xkZXJleGNlcHRpb249Um9vdCBsb2NhdGlvbiBuZWVkcyB0byBiZSBhIGRpcmVjdG9yeSEKLXNjaGVtYS5ub3RpbXBsZW1lbnRlZHhjZXB0aW9uPU5vdCBpbXBsZW1lbnRlZCB5ZXQKLXNjaGVtYS50ZW1wbGF0ZUxvYWRFeGNlcHRpb249RXJyb3IgbG9hZGluZyB0aGUgdGVtcGxhdGUKLXNjaGVtYS50ZW1wbGF0ZU5vdEZvdW5kRXhjZXB0aW9uPXRlbXBsYXRlIGZvciB0aGlzIHdyaXRlciBpcyBub3QgZm91bmQKLXNjaGVtYS50eXBlTWlzc2luZz1UeXBlIHswfSBtaXNzaW5nIQotc2NoZW1hLmRvY3VlbWVudC5lcnJvcj1FcnJvciBpbiBjcmVhdGluZyB0aGUgZG9jdW1lbnQKLXNjaGVtYS5zb2FwZW5jb2RpbmcuZXJyb3I9ezB9IGlzIG5vdCBzdXBwb3J0ZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3NjaGVtYS1jb21waWxlLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlOTI1MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNTY2hlbWEgQ29tcGlsZXIgcHJvcGVydGllcyAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBUaGUgYmVhbiB3cml0ZXIgY2xhc3MKLSMgVGhlIGJlYW4gd3JpdGVyIGlzIHRoZSBjbGFzcyB1c2VkIGJ5IHRoZSBzY2hlbWEgY29tcGlsZXIgdG8gd3JpdGUgdGhlIGJlYW5zCi0jIGFuZCBzaG91bGQgaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcgotIyBpbnRlZmFjZQotIwotc2NoZW1hLmJlYW4ud3JpdGVyLmNsYXNzPW9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlci5KYXZhQmVhbldyaXRlcgotIwotIyBiZWFuIHdyaXRlciB0ZW1wbGF0ZQotIyBUaGUgYmVhbiB3cml0ZXJzIHRlbXBsYXRlIGlzIGl0J3Mgb3duIHJlc3BvbnNpYmlsdHkuIChBIGJlYW4gd3JpdGVyIHByb3ZpZGVyCi0jIG1heSBjaG9vc2Ugbm90IHRvIHVzZSBhIHRlbXBsYXRlIGF0IGFsbCEpIEhvd2V2ZXIgdGhlIHByb3BlcnR5IGxvYWRlciB3aWxsCi0jIGxvYWQgdGhlIGZvbGxvd2luZyB0ZW1wbGF0ZXMgKHJlZmVyZW5jZSkgYW5kIHByb3ZpZGUgaXQgYW5kIGluIHRoZSBjYXNlIHdoZW4gdGhlCi0jIGJlYW4gd3JpdGVyIGlzIG5vdCBzdGF0aWNhbGx5IGJvdW5kIHRvIGEgdGVtcGxhdGUsIHRoaXMnbGwgYmUgdXNlZnVsLgotIwotc2NoZW1hLmJlYW4ud3JpdGVyLnRlbXBsYXRlPS9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsCi0jIHNjaGVtYS5iZWFuLndyaXRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvUGxhaW5CZWFuVGVtcGxhdGUueHNsCi0KLSMKLSMgVGhlIHR5cGUgbWFwIHRvIGJlIHVzZWQgYnkgdGhlIHNjaGVtYSBjb21waWxlcgotIwotc2NoZW1hLmJlYW4udHlwZW1hcD1vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50eXBlbWFwLkphdmFUeXBlTWFwCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQURCQmVhblRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQxMTVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjA3MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotICAgIDwhLS0gY2F0ZXIgZm9yIHRoZSBtdWx0aXBsZSBjbGFzc2VzIC0gd3JhcHBwZWQgbW9kZSAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvYmVhbnMiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZShAcGFja2FnZSkpID4gMCI+Ci0gICAgICAgICAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiB3cmFwcGVkIGJlYW4gY2xhc3NlcwotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+ewotCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQotICAgICAgICB9Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8IS0tY2F0ZXIgZm9yIHRoZSBtdWx0aXBsZSBjbGFzc2VzIC0gdW53cmFwcHBlZCBtb2RlIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJiZWFuW25vdChAaGVscGVyTW9kZSldIj4KLQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjaG9pY2UiIHNlbGVjdD0iQGNob2ljZSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNpbXBsZSIgc2VsZWN0PSJAc2ltcGxlIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3JkZXJlZCIgc2VsZWN0PSJAb3JkZXJlZCIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVub3JkZXJlZCIgc2VsZWN0PSJub3QoJG9yZGVyZWQpIi8+ICA8IS0tIGZvciBjb252ZW5pZW5jZSAtLT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1R5cGUiIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhbm9uIiBzZWxlY3Q9IkBhbm9uIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idW5pb24iIHNlbGVjdD0iQHVuaW9uIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibGlzdCIgc2VsZWN0PSJAbGlzdCIvPgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibnN1cmkiIHNlbGVjdD0iQG5zdXJpIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3JpZ2luYWxOYW1lIiBzZWxlY3Q9IkBvcmlnaW5hbE5hbWUiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuc3ByZWZpeCIgc2VsZWN0PSJAbnNwcmVmaXgiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlbnNpb24iIHNlbGVjdD0iQGV4dGVuc2lvbiIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3RyaWN0aW9uIiBzZWxlY3Q9IkByZXN0cmljdGlvbiIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1hcHBlckNsYXNzIiBzZWxlY3Q9IkBtYXBwZXJDbGFzcyIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnRpY2xlQ2xhc3MiIHNlbGVjdD0iQHBhcnRpY2xlQ2xhc3MiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNQYXJ0aWNsZVR5cGUiIHNlbGVjdD0iQGhhc1BhcnRpY2xlVHlwZSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZXdyYXBwZXJjbGFzc2VzIiBzZWxlY3Q9IkB1c2V3cmFwcGVyY2xhc3NlcyIvPgotICAgIDwhLS0gd3JpdGUgdGhlIGNsYXNzIGhlYWRlci4gdGhpcyBzaG91bGQgYmUgZG9uZSBvbmx5IHdoZW4gdW53cmFwcGVkIC0tPgotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KG5vdChAdW53cmFwcGVkKSBvciAoQHNraXAtd3JpdGUpKSI+Ci0vKioKLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoQHBhY2thZ2UpKSA+IDAiPgotICAgICAgICAgICAgICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+OwotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIDwveHNsOmlmPgotICAgICAgICBwdWJsaWMgPHhzbDppZiB0ZXN0PSJub3QoQHVud3JhcHBlZCkgb3IgKEBza2lwLXdyaXRlKSI+c3RhdGljPC94c2w6aWY+IDx4c2w6aWYgdGVzdD0iQGlzQWJzdHJhY3QgYW5kIEB1bndyYXBwZWQgYW5kIG5vdChAc2tpcC13cml0ZSkiPmFic3RyYWN0PC94c2w6aWY+IGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOmlmIHRlc3Q9IiRleHRlbnNpb24iPiBleHRlbmRzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5zaW9uIi8+PC94c2w6aWY+IDx4c2w6aWYgdGVzdD0iJHJlc3RyaWN0aW9uIj4gZXh0ZW5kcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3RyaWN0aW9uIi8+PC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJHVuaW9uIGFuZCBub3QoJHJlc3RyaWN0aW9uKSBhbmQgbm90KCRleHRlbnNpb24pIj4gZXh0ZW5kcyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbmlvbiA8L3hzbDppZj4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlIj4vKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zcHJlZml4Ii8+Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgTVlfUU5BTUUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPiIsCi0gICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3ByZWZpeCIvPiIpOwotCi0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+IikpewotICAgICAgICAgICAgICAgIHJldHVybiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3ByZWZpeCIvPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGNob2ljZSI+Ci0gICAgICAgICAgICAvKiogV2hlbmV2ZXIgYSBuZXcgcHJvcGVydHkgaXMgc2V0IGVuc3VyZSBhbGwgb3RoZXJzIGFyZSB1bnNldAotICAgICAgICAgICAgICogIFRoZXJlIGNhbiBiZSBvbmx5IG9uZSBjaG9pY2UgYW5kIHRoZSBsYXN0IG9uZSB3aW5zCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBjbGVhckFsbFNldHRpbmdUcmFja2VycygpIHsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGF0dHJpYnV0ZSkiPgotICAgICAgICAgICAgICAgICAgIGxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhbmFtZSIvPlRyYWNrZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotCi0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDwhLS0gV3JpdGUgb25seSB0aGUgTk9UIGluaGVyaXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBidXQgd2UgaGF2ZSB0byBnZW5lcmF0ZSB0d28gc3BlY2l0YWwgbWV0aG9kcyBmb3Igc2ltcGxlIHR5cGUgcmVzdHJpY3Rpb24gYW5kIGV4dGVuZXNpb25zIC0tPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGluaGVyaXRlZCkgb3IgKCRzaW1wbGUgYW5kICRleHRlbnNpb24pIG9yICgkc2ltcGxlIGFuZCAkcmVzdHJpY3Rpb24pIj4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YW5hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1pbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNldHRpbmdUcmFja2VyIj5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz5UcmFja2VyPC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsZW5GYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZW5GYWNldCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXhMZW5GYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhMZW5GYWNldCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtaW5MZW5GYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5MZW5GYWNldCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXhFeEZhY2V0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heEV4RmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWluRXhGYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5FeEZhY2V0Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1heEluRmFjZXQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWF4SW5GYWNldCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtaW5JbkZhY2V0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbkluRmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGF0dGVybkZhY2V0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhdHRlcm5GYWNldCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lVW5jYXBwZWQiICBzZWxlY3Q9IkBzaG9ydHR5cGVuYW1lIi8+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWUiCi0gICAgICAgICAgICAgICBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAxLCAxICksJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JywgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyApLCBzdWJzdHJpbmcoJHNob3J0VHlwZU5hbWVVbmNhcHBlZCwgMiwgc3RyaW5nLWxlbmd0aCgkc2hvcnRUeXBlTmFtZVVuY2FwcGVkKSkpIiAvPgotCi0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAcmVtb3ZlZCI+Ci0KLSAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAqIE92ZXJyaWRkZW4gZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3RyaWN0aW9uIi8+Ci0gICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHB1YmxpYyAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigpewotICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXN0cmljdGlvbiIvPgotICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPgotICAgICAgICAgICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IihAcmVzdHJpY3RlZCkgYW5kIChAb2NjdXJhbmNlQ2hhbmdlZCkgYW5kIChub3QoQHR5cGVDaGFuZ2VkKSkgYW5kIChub3QoQHJld3JpdGUpKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlUHJvcGVydHlUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFycmF5QmFzZVR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSB0aGUgdmFsaWRhdG9yIE1ldGhvZCwgdGhpcyBpcyBzcGVjaWZpYWNhbGx5IGZvciB2YWxpZGF0aW5nIHRoZSBhcnJheXMtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFZhbGlkYXRlIHRoZSBhcnJheSBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICogT3ZlcnJpZGRlbiBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzdHJpY3Rpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdW5ib3VuZCkgYW5kIEBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmFtICE9IG51bGwpICZhbXA7JmFtcDsgKHBhcmFtLmxlbmd0aCAmZ3Q7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWF4T2NjdXJzIi8+KSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluIT0wIGFuZCBAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJhbSAhPSBudWxsKSAmYW1wOyZhbXA7IChwYXJhbS5sZW5ndGggJmx0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pbiIvPikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICogT3ZlcnJpZGRlbiBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzdHJpY3Rpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjYWxsIHRoZSB2YWxpZGF0b3ItLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KHBhcmFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGNob2ljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNldHRpbmdUcmFja2VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIHVwZGF0aW5nIG9mIHNldHRpbmcgdHJhY2tlciBmb3IgbnVsbCB2YWx1ZXMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBtYXJrZWQgYXMgbmlsbGFibGUuIEVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGNhbiBzZXQgYSBudWxsIHZhbHVlIGFuZCBpdCBpcyBuZXZlciBtYXJrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAcHJpbWl0aXZlIGFuZCBub3QoQGFycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgcHJpbWl0aXZlIHZhcmlhYmxlIGFsd2F5cyB0byB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2V0dGluZ1RyYWNrZXIiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIHNldHRpbmcgdHJhY2tlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIHdhcyBhbiBBdHRyaWJ1dGUhPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgd2FzIGFuIEFycmF5ITwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZUNoYW5nZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlIG9mIHRoaXMgZmllbGQgaXMgYSBzdWJ0eXBlIG9mIGl0cyBvcmlnaW5hbC48L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKEByZXdyaXRlKSBhbmQgKEBvY2N1cmFuY2VDaGFuZ2VkKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgZmllbGQgd2FzIGFuIGFycmF5IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzdHJpY3Rpb24iLz4uPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAaW5oZXJpdGVkKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZGVmYXVsdFZhbHVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiIC8+ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNob3J0VHlwZU5hbWUiLz4oIjx4c2w6dmFsdWUtb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IkBkZWZhdWx0VmFsdWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIiAvPiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJlbnVtRmFjZXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNoTWFwIF90YWJsZV8gPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGluaGVyaXRlZCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IHZhbHVlLCBib29sZWFuIGlzUmVnaXN0ZXJWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIiAvPiA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVnaXN0ZXJWYWx1ZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlXy5wdXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIiAvPiArICIiLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLnB1dCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiIC8+LCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpbmhlcml0ZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IHZhbHVlLCBib29sZWFuIGlzUmVnaXN0ZXJWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodmFsdWUsZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVnaXN0ZXJWYWx1ZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlXy5wdXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIiAvPiArICIiLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLnB1dCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiIC8+LCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGluaGVyaXRlZCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZW51bUZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNob3J0VHlwZU5hbWUiLz4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZW51bUZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+LHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBnZXRWYWx1ZSgpIHsgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIgLz47fQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhqYXZhLmxhbmcuT2JqZWN0IG9iaikge3JldHVybiAob2JqID09IHRoaXMpO30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAcHJpbWl0aXZlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KGVudW1GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHZW5lcmF0ZSBhIHRyYWNrZXIgb25seSBpZiB0aGUgbWluIG9jY3VycyBpcyB6ZXJvLCB3aGljaCBtZWFucyBpZiB0aGUgdXNlciBkb2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYm90aGVyIHRvIHNldCB0aGF0IHZhbHVlLCB3ZSBkbyBub3Qgc2VuZCBpdCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFRoaXMgdHJhY2tlciBib29sZWFuIHdpbCBiZSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSB1c2VyIGNhbGxlZCB0aGUgc2V0IG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZm9yIHRoaXMgYXR0cmlidXRlLiBJdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGlzIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW4gdGhlIHNlcmlhbGl6ZWQgWE1MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IGZhbHNlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXaGVuIGdlbmVyYXRpbmcgdGhlIHNldHRlcnMsIHdlIGhhdmUgdG8gY2F0ZXIgZGlmZmVyZW50bHkgZm9yIHRoZSBhcnJheSEtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnJheUJhc2VUeXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIHZhbGlkYXRvciBNZXRob2QsIHRoaXMgaXMgc3BlY2lmaWFjYWxseSBmb3IgdmFsaWRhdGluZyB0aGUgYXJyYXlzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRlIHRoZSBhcnJheSBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdW5ib3VuZCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJhbSAhPSBudWxsKSAmYW1wOyZhbXA7IChwYXJhbS5sZW5ndGggJmd0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heE9jY3VycyIvPikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluIT0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFyYW0gIT0gbnVsbCkgJmFtcDsmYW1wOyAocGFyYW0ubGVuZ3RoICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaW4iLz4pKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNhbGwgdGhlIHZhbGlkYXRvci0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4ocGFyYW0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBbGxTZXR0aW5nVHJhY2tlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtaW49MCBvciAkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgdXBkYXRpbmcgb2Ygc2V0dGluZyB0cmFja2VyIGZvciBudWxsIHZhbHVlcyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBtYXJrZWQgYXMgbmlsbGFibGUuIEVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBjYW4gc2V0IGEgbnVsbCB2YWx1ZSBhbmQgaXQgaXMgbmV2ZXIgbWFya2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHByaW1pdGl2ZSBhbmQgbm90KEBhcnJheSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgcHJpbWl0aXZlIGF0dHJpYnV0ZSB0byB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgc2V0dGluZyB0cmFja2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBzcGVjaWFsIGNhc2UgdGhlICdhcnJheScgc2NlbmFyaW8gYW5kIGdlbmVyYXRlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGFkZGluZyBlbGVtZW50cyBvbmUgYnkgb25lIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFycmF5LiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBzb21ld2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZWZmaWNpZW50IGJ1dCBnZXRzIHRoZSBqb2IgZG9uZS5TaW5jZSBhIHByaW1pdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIG9iamVjdCBpdCBoYXMgdG8gYmUgaWdub3JlZCEKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHByaW1pdGl2ZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBhZGQgbWV0aG9kIGZvciB0aGUgYXJyYXkgZm9yIGNvbnZlbmllbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPnt9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNldHRpbmdUcmFja2VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIHNldHRpbmcgdHJhY2tlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC50b0xpc3QoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pbGlzdC50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz5bbGlzdC5zaXplKCldKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGVuZCBvZiBzcGVjaWFsIGNhc2luZyBmb3IgdGhlIGFycmF5LS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm9uIGFycmF5IHNldHRlciBtZXRob2QtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNldHRpbmdUcmFja2VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUgYW5kIG5vdChAYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgcHJpbWl0aXZlIGF0dHJpYnV0ZSB0cmFja2VyIHRvIHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdXNld3JhcHBlcmNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2ludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW09PWphdmEubGFuZy5JbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtPT1qYXZhLmxhbmcuTG9uZy5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbT09amF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuRG91YmxlLmlzTmFOKHBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2Zsb2F0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuRmxvYXQuaXNOYU4ocGFyYW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtPT1qYXZhLmxhbmcuU2hvcnQuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgc2V0dGluZyB0cmFja2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQHJlc3RyaWN0aW9uQmFzZVR5cGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQHBhdHRlcm5GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhwYXJhbSkubWF0Y2hlcygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXR0ZXJuRmFjZXQiLz4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IihAbGVuRmFjZXQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocGFyYW0pLmxlbmd0aCgpID09IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVuRmFjZXQiLz4gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKEBtYXhMZW5GYWNldCkgb3IgKEBtaW5MZW5GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIDx4c2w6aWYgdGVzdD0iKEBtaW5MZW5GYWNldCkiPiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaW5MZW5GYWNldCIvPiAmbHQ7PSBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YocGFyYW0pLmxlbmd0aCgpKTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKEBtYXhMZW5GYWNldCkiPiA8eHNsOmlmIHRlc3Q9IihAbWluTGVuRmFjZXQpIj4gJmFtcDsmYW1wOyA8L3hzbDppZj4gKGphdmEubGFuZy5TdHJpbmcudmFsdWVPZihwYXJhbSkubGVuZ3RoKCkgJmx0Oz0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXhMZW5GYWNldCIvPikgPC94c2w6aWY+ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBtYXhFeEZhY2V0IG9yIEBtaW5FeEZhY2V0IG9yIEBtYXhJbkZhY2V0IG9yIEBtaW5JbkZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbWF4RXhGYWNldCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb21wYXJlKHBhcmFtLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXhFeEZhY2V0Ii8+IikgJmx0OyAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBtaW5FeEZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbXBhcmUocGFyYW0sICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pbkV4RmFjZXQiLz4iKSAmZ3Q7IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBtYXhJbkZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29tcGFyZShwYXJhbSwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWF4SW5GYWNldCIvPiIpICZsdDs9IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBtaW5JbkZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29tcGFyZShwYXJhbSwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWluSW5GYWNldCIvPiIpICZndDs9IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBmcm9tIHN0cmluZyBhbmQgdG8gc3RyaW5nIG1ldGhvZHMgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSB0eXBlcyB0byBiZSB1ZWQgaW4gYXR0cmlidXRlIGhhbmRsaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkc2ltcGxlIGFuZCBub3QoQGF0dHJpYnV0ZSkgYW5kIG5vdChlbnVtRmFjZXQpIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICA8IS0tIGVuZCBvZiB4c2w6aWYgZm9yIG5vdChAaW5oZXJpdGVkKSAtLT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgIDwhLS0gd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2V0T2JqZWN0IG1ldGhvZCBpbiBwYXJlbnQgY2xhc3NlcyAtLT4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkdW5pb24gYW5kICRzaW1wbGUgYW5kIG5vdCgkcmVzdHJpY3Rpb24pIGFuZCBub3QoJGV4dGVuc2lvbikiPgotICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBjbGFzcyBmb3IgYSB1bmlvbiB0eXBlIC0tPgotCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0IG9iamVjdCl7Ci0gICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWVtYmVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpID4gMSI+fSBlbHNlIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxPYmplY3QgPSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRsaXN0IGFuZCBub3QoJHJlc3RyaWN0aW9uKSBhbmQgbm90KCRleHRlbnNpb24pIiA+Ci0gICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXZhTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iml0ZW10eXBlL0BqYXZhbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaXRlbXR5cGUvQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaXRlbXR5cGUvQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByaW1pdGl2ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iml0ZW10eXBlL0BwcmltaXRpdmUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgIHByb3RlY3RlZCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhclR5cGUiLz5bXSAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+OwotCi0gICAgICAgICAgICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyVHlwZSIvPltdIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+OwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJUeXBlIi8+W10gaXRlbUxpc3QpewotICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ID0gaXRlbUxpc3Q7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIG91dFN0cmluZyA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJpbWl0aXZlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyaW5nLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSkpLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmluZy5hcHBlbmQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldLnRvU3RyaW5nKCkpLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBvdXRTdHJpbmcudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIDwhLS0gd29ya2Fyb3VuZCBmb3IgdGhlIGlzc3VlcyBpbiB0aGUgd3N0eCByZWFkZXIhLS0+Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0gICAgIDwhLS0gZ2V0IE9NRWxlbWVudCBtZXRob2RzIHRoYXQgYWxsb3dzIGRpcmVjdCB3cml0aW5nIC0tPgotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlIj4KLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4udGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxNWV9RTkFNRSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi50aGlzLnNlcmlhbGl6ZShNWV9RTkFNRSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgTVlfUU5BTUUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzaW1wbGUgYW5kICR1bmlvbiI+Ci0gICAgICAgICAgICAgICAgLy8gZmlzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUgPSBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWVtYmVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpID4gMSI+fSBlbHNlIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE9iamVjdCBpbnN0YW5jZW9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJmFtcDsmYW1wOyAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvcmlnaW5hbE5hbWUiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3JpZ2luYWxOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0namF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUoKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpbG9jYWxPYmplY3QseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPilsb2NhbE9iamVjdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIkludmFsaWQgb2JqZWN0IHR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzaW1wbGUgYW5kICRsaXN0Ij4KLQotICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaXRlbXR5cGUvQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyVHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iml0ZW10eXBlL0B0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUgPSBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHZhclR5cGU9J2phdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWVzKGxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LnRoaXMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZSBvciBAYW5vbiI+Ci0gICAgICAgICAgICAgICAgPCEtLSBGb3IgYSB0eXBlIHdyaXRlIHRoZSBwYXNzZWQgaW4gUU5hbWUgZmlyc3QKLSAgICAgICAgICAgICAgICAgd2UgY3JlYXRlIHNwZWNpYWwgcGFydGljbGUgY2xhc3NlcyBmb3IgU2VxdWVuY2UsQ2hvaWNlIGFuZCBhbGwgZWxlbWVudHMgdG8KLSAgICAgICAgICAgICAgICAgaGFuZGxlIG1heE9jY3VycyBjb3JyZWN0bHkuIFNvIHRoZXNlIGNsYXNzZXMgc2hvdWxkIG5vdCB3cml0ZSBwYXJlbnQgUW5hbWUtLT4KLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkcGFydGljbGVDbGFzcykiPgotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmYW1wOyZhbXA7IChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0KLSAgICAgICAgICAgICAgICA8IS0tIHdyaXRlIHRoZSB0eXBlIGF0dHJpYnV0ZSBpZiBuZWVkZWQgLS0+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkZXh0ZW5zaW9uKSBvciBAYW5vbiI+Ci0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJmFtcDsmYW1wOyAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9yaWdpbmFsTmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkZXh0ZW5zaW9uKSBvciBAYW5vbiI+Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPCEtLUZpcnN0IHNlcmlhbGl6ZSB0aGUgYXR0cmlidXRlcyEtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbQGF0dHJpYnV0ZV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWVzcGFjZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSAtIEl0IGlzIGFzc3VtZWQgdGhhdCBhbnkgYXR0cmlidXRlcyBhcmUgT01BdHRyaWJ1dGVzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSBhbmQgbm90KEBhcnJheSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LmdldE5hbWVzcGFjZSgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSBhbmQgQGFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aSAmbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXS5nZXROYW1lc3BhY2UoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldLmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICB0aGlzIGNhbiBvbmx5IGJlIGEgc2ltcGxlIHR5cGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4udG9TdHJpbmcoKSwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBvcHRpb25hbCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicmVxdWlyZWQgYXR0cmlidXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAcHJpbWl0aXZlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdXNld3JhcHBlcmNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0naW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1qYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPWphdmEubGFuZy5Mb25nLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYnl0ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiE9amF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghamF2YS5sYW5nLkRvdWJsZS5pc05hTig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFqYXZhLmxhbmcuRmxvYXQuaXNOYU4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPWphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0namF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZUF0dHJpYnV0ZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiwgeG1sV3JpdGVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pLCB4bWxXcml0ZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBvcHRpb25hbCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicmVxdWlyZWQgYXR0cmlidXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIE5vdyBzZXJpYWxpemUgdGhlIGVsZW1lbnRzLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5W25vdChAYXR0cmlidXRlKV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWluIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbk9jY3VycyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWVzcGFjZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNldHRpbmdUcmFja2VyIj5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YW5hbWUiLz5UcmFja2VyPC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5QmFzZVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJyYXlCYXNlVHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnRpY2xlQ2xhc3NUeXBlIiBzZWxlY3Q9IkBwYXJ0aWNsZUNsYXNzVHlwZSI+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluPTAgb3IgJGNob2ljZSI+IGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+KXs8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMgYW5kIG5vdChAYXJyYXkpIGFuZCBub3QoQGRlZmF1bHQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlMi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4MiA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5zZXJpYWxpemUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJ0aWNsZUNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LnNlcmlhbGl6ZShudWxsLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5zZXJpYWxpemUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMgYW5kIEBhcnJheSBhbmQgbm90KEBkZWZhdWx0KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJ0aWNsZUNsYXNzVHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBpZiBpdCBpcyBhIHBhcnRpY2xlIGNsYXNlIHRoYXQgY2FuIG9ubHkgYmUgbWluT2NjdXJzIHplcm8gb3Igbm90IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldLnNlcmlhbGl6ZShudWxsLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbj0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnkgdGhpbmcgc2luY2UgbWluT2NjdXJlcyBpcyB6ZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0uc2VyaWFsaXplKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlMi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgyID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4MiA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWluPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIHRvIGRvIGFueSB0aGluZyBzaW5jZSBtaW5PY2N1cmVzIGlzIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBudWxsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UyID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeDIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZTIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZGVmYXVsdCBhbmQgQGFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgLSBBc3N1bWVkIHRvIGJlIE9NRWxlbWVudC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuKTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSkuc2VyaWFsaXplKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LHhtbFdyaXRlcix0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlMiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeDIgPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeDIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuc2VyaWFsaXplQW55VHlwZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0sIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBudWxsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW49MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBub3RoaW5nIHNpbmNlIG1pbk9jY3VycyBpcyB6ZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UyID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgyID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeDIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZTIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBkZWZhdWx0IGFuZCBub3QoQGFycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIC0gQXNzdW1lZCB0byBiZSBPTUVsZW1lbnQtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbik8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pLnNlcmlhbGl6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSx4bWxXcml0ZXIsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UyID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeDIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZTIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5zZXJpYWxpemVBbnlUeXBlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlMiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgyID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIiwiMSIseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBoYW5kbGUgbm9uIEFEQiBhcnJheXMgLSBOb3QgYW55IGhvd2V2ZXIgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5IGFuZCBub3QoQGFueSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW1wdHlOYW1lc3BhY2UgPSBuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIGVtcHR5TmFtZXNwYWNlID8gbnVsbCA6IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2V3cmFwcGVyY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlCYXNlVHlwZT0naW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldIT1qYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eUJhc2VUeXBlPSdsb25nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldIT1qYXZhLmxhbmcuTG9uZy5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eUJhc2VUeXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldIT1qYXZhLmxhbmcuQnl0ZS5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eUJhc2VUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghamF2YS5sYW5nLkRvdWJsZS5pc05hTig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlCYXNlVHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghamF2YS5sYW5nLkZsb2F0LmlzTmFOKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eUJhc2VUeXBlPSdzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSE9amF2YS5sYW5nLlNob3J0Lk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHByaW1pdGl2ZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eU5hbWVzcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcHJpbWl0aXZlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHByaW1pdGl2ZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBiaW5hcnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVEYXRhSGFuZGxlcig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIiwiMSIseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWluPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGRvIG5vdGhpbmcgc2luY2UgbWluT2NjdXJzIGlzIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbnVsbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBudWxsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZSBub24gQURCIGFycmF5cyAgLSBBbnkgY2FzZSAgLSBhbnkgbWF5IG5vdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhcnJheSBhbmQgQGFueSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIC0gQXNzdW1lZCB0byBiZSBPTUVsZW1lbnQtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0uc2VyaWFsaXplKHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbj0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZG8gbm90aGluZyBzaW5jZSBtaW5PY2N1cmVzIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIGFueSAtIG5vbiBhcnJheSBjYXNlLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSAtIEFzc3VtZWQgdG8gYmUgT01FbGVtZW50LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZSBhbGwgb3RoZXIgY2FzZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRzaW1wbGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIHRoZSBiaW5hcnkgY2FzZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhhbmRsaW5nIHRoZSBudWxsIGJ5dGUgYXJyYXkgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1udWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRGF0YUhhbmRsZXIoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBwcmltaXRpdmUpIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2phdmEubGFuZy5TdHJpbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHdlIGhhdmUgdG8gY2hlY2sgZm9yIG5pbGxhYmlsaXR5IHdpdGggbWluIHZhbHVlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2V3cmFwcGVyY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2ludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1qYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdsb25nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PWphdmEubGFuZy5Mb25nLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2J5dGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj09amF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuRG91YmxlLmlzTmFOKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YS5sYW5nLkZsb2F0LmlzTmFOKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1qYXZhLmxhbmcuU2hvcnQuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHNpbXBsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPn08L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgIDwhLS0gd3JpdGUgdGhlIGVuZCBlbGVtZW50IGZvciB0aGUgdHlwZS0tPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhcnRpY2xlQ2xhc3MpIj4KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8IS0tIGVuZCBvZiB3aGVuIGZvciB0eXBlICYgYW5vbiAtLT4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgIDwhLS0gTm90IGEgdHlwZSBhbmQgbm90IGFub24uIFNvIGl0IGJldHRlciBiZSBvbmx5IG9uZSBpbmNsdXNpb24tLT4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwhLS0gaWYgdGhlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSwgdGhlbiBpdHMgZ29ubmEgYmUgb25seSBvbmUgLS0+Ci0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuaWxsYWJsZSIgc2VsZWN0PSJwcm9wZXJ0eS9AbmlsbGFibGUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJpbWl0aXZlIiBzZWxlY3Q9InByb3BlcnR5L0BwcmltaXRpdmUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFRoaXMgYmV0dGVyIGJlIG9ubHkgb25lISEtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InByb3BlcnR5L0BvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQG5zdXJpIi8+IjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0BuYW1lIi8+IiwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0BuYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0BuYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUHJvcGVydHkgY2Fubm90IGJlIG51bGwhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gZW5kIG9mIG91cnMgYmxvY2stLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChwcm9wZXJ0eS9Ac2ltcGxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0Buc3VyaSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0BuYW1lIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9wZXJ0eS9Ac2ltcGxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSB0eXBlIGRldGFpbHMgaWYgdGhpcyBpcyB1c2VkIGluIGEgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICZhbXA7JmFtcDsgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9yaWdpbmFsTmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9yaWdpbmFsTmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkcHJpbWl0aXZlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIiwiMSIseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJWYWx1ZSBjYW5ub3QgYmUgbnVsbCAhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0namF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4seG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J29yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uc2VyaWFsaXplKHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icHJvcGVydHkvQGRlZmF1bHQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5zZXJpYWxpemVBbnlUeXBlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InByb3BlcnR5L0BiaW5hcnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGFuZGxpbmcgdGhlIG51bGwgYnl0ZSBhcnJheSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRGF0YUhhbmRsZXIoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcHJpbWl0aXZlIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2UgaGF2ZSB0byBjaGVjayBmb3IgbmlsbGFiaWxpdHkgd2l0aCBtaW4gdmFsdWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVzZXdyYXBwZXJjbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0naW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PWphdmEubGFuZy5JbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj09amF2YS5sYW5nLkxvbmcuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYnl0ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1qYXZhLmxhbmcuQnl0ZS5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmEubGFuZy5Eb3VibGUuaXNOYU4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2Zsb2F0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuRmxvYXQuaXNOYU4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J3Nob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PWphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIiwiMSIseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicHJvcGVydHkgdmFsdWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlIG9yIEBhbm9uIj4KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRleHRlbnNpb24iPgotICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikpOwotICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5W25vdChAYXR0cmlidXRlKV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWluIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbk9jY3VycyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWVzcGFjZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNldHRpbmdUcmFja2VyIj5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YW5hbWUiLz5UcmFja2VyPC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtaW49MCBvciAkY2hvaWNlIj4gaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2V0dGluZ1RyYWNrZXIiLz4pezwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQG91cnMgb3IgQGRlZmF1bHQpIGFuZCBub3QoQGFycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQXJyYXlsaXN0IGNhbiBoYW5kbGUgbnVsbCdzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGw/bnVsbDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IihAb3VycyBvciBAZGVmYXVsdCkgYW5kIEBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwO2kgJmx0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4ubGVuZ3RoO2krKyl7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbj0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwgISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIG5vbiBBREIgYXJyYXlzIC0gTm90IGFueSBob3dldmVyIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhcnJheSBhbmQgbm90KEBhbnkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcHJpbWl0aXZlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW49MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBoYW5kbGUgbm9uIEFEQiBhcnJheXMgIC0gQW55IGNhc2UgIC0gYW55IG1heSBub3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkgYW5kIEBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWluPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIGFueSAtIG5vbiBhcnJheSBjYXNlLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnN0YW50cy5PTV9FTEVNRU5UX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIGJpbmFyeSAtIFNpbmNlIGl0IGlzIGEgRGF0YWhhbmRsZXIsIHdlIGNhbiBqdXN0IGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIEFEQiBwdWxscGFyc2VyIHdvdWxkIGhhbmRsZSBpdCByaWdodC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzaW1wbGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgdXN1YWwgY2FzZSEhISEtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc2ltcGxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmIHRoZSB0eXBlIGlzIHNpbXBsZSB0aGVuICB0aGlzIG11c3QgYmUgb25seSB0aGUgZWxlbWVudCB0ZXh0IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHByaW1pdGl2ZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj09bnVsbD9udWxsOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPn08L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eVtAYXR0cmlidXRlXSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJOYW1lIj5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZXNwYWNlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkgYW5kIG5vdChAYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnN0YW50cy5PTV9BVFRSSUJVVEVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSBhbmQgQGFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2kgJmx0Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnN0YW50cy5PTV9BVFRSSUJVVEVfS0VZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYkxpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgPCEtLSBlbmQgb2Ygd2hlbiBmb3IgdHlwZSAmIGFub24gLS0+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1bmlvbiBhbmQgJHNpbXBsZSI+Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwoTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQsCi0gICAgICAgICAgICAgICAgICAgIGxvY2FsT2JqZWN0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGxpc3QgYW5kICRzaW1wbGUiPgotICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKE1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5sYW5nLk9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhULAotICAgICAgICAgICAgICAgICAgICB0b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgPCEtLSBOb3QgYSB0eXBlIGFuZCBub3QgYW5vbi4gU28gaXQgYmV0dGVyIGJlIG9ubHkgb25lIGluY2x1c2lvbi0tPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPCEtLSBpZiB0aGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlLCB0aGVuIGl0cyBnb25uYSBiZSBvbmx5IG9uZSAtLT4KLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJOYW1lIj5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0eS9AamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5pbGxhYmxlIiBzZWxlY3Q9InByb3BlcnR5L0BuaWxsYWJsZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmltaXRpdmUiIHNlbGVjdD0icHJvcGVydHkvQHByaW1pdGl2ZSI+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIGJldHRlciBiZSBvbmx5IG9uZSEhLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwcm9wZXJ0eS9Ab3VycyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5OdWxsWE1MU3RyZWFtUmVhZGVyKE1ZX1FOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uZ2V0UHVsbFBhcnNlcihNWV9RTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPnJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uZ2V0UHVsbFBhcnNlcihNWV9RTkFNRSk7PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmlsbGFibGUgYW5kIG5vdCgkcHJpbWl0aXZlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLk51bGxYTUxTdHJlYW1SZWFkZXIoTVlfUU5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKE1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubGFuZy5PYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4gcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKE1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOzwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgIH0KLQotICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIDwhLS0gZ2VuZXJhdGUgc29tZSB1dGlsaXR5IGZhY3RvcnkgbWV0aG9kcyBoZXJlIHdlIG11c3QgYWRkIHRoZXNlIG1ldGhvZHMgdG8gYSBmYWN0b3J5IGNsYXNzCi0gICAgICAgICBzaW5jZSBvdGhlcndpc2UgaXQgZ2l2ZXMgYSBjb21waWxhdGlvbiBleGNlcHRpb24gaW4gamRrIDEuNCAtLT4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkdW5pb24gYW5kICRzaW1wbGUiPgotICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBtZXRob2RzIGZvciBhIHVuaW9uIHR5cGUgLS0+Ci0gICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBvYmplY3QgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE9iamVjdCh4bWxTdHJlYW1SZWFkZXIsIG5hbWVzcGFjZVVSSSwgdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0T2JqZWN0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFwcGVyQ2xhc3MiLz4uZ2V0VHlwZU9iamVjdChuYW1lc3BhY2VVUkksIHR5cGUsIHhtbFN0cmVhbVJlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIkVycm9yIGluIHBhcnNpbmcgdmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IG9iamVjdCA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ZhbHVlU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZW1iZXJUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHNldCB0aGUgb2JqZWN0IHdpdGggdGhlIGZpcnN0IG1hdGNoaW5nIHR5cGUuCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbHVlU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5zdXJpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGNvbnZlcnRlck1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRUbzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnR0eXBlbmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubGFuZy5DbGFzc1tde2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRPYmplY3QoY29udmVydGVyTWV0aG9kLmludm9rZShudWxsLCBuZXcgamF2YS5sYW5nLk9iamVjdFtde3ZhbHVlfSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWx1ZVNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE9iamVjdCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4uRmFjdG9yeS5mcm9tU3RyaW5nKHZhbHVlLCBuYW1lc3BhY2VVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWx1ZVNldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRsaXN0IGFuZCAkc2ltcGxlIj4KLQotICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpdGVtdHlwZS9AamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZhclR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpdGVtdHlwZS9AdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iml0ZW10eXBlL0BvdXJzIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWVVbmNhcHBlZCIgIHNlbGVjdD0iaXRlbXR5cGUvQHNob3J0dHlwZW5hbWUiLz4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvcnRUeXBlTmFtZSIKLSAgICAgICAgICAgICAgIHNlbGVjdD0iY29uY2F0KHRyYW5zbGF0ZSggc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDEsIDEgKSwnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICksIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAyLCBzdHJpbmctbGVuZ3RoKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQpKSkiIC8+Ci0KLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBvYmplY3QgPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ1tdIHZhbHVlcyA9IGNvbnRlbnQuc3BsaXQoIiArIik7Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJUeXBlIi8+W10gb2JqZWN0VmFsdWVzID0gbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyVHlwZSIvPlt2YWx1ZXMubGVuZ3RoXTsKLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHZhclR5cGU9J2phdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUnIj4KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91cnMpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlQ29udGVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHZhclR5cGU9J2phdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0uaW5kZXhPZigiOiIpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB2YWx1ZXNbaV0uc3Vic3RyaW5nKDAsdmFsdWVzW2ldLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RWYWx1ZXNbaV0gPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUodmFsdWVzW2ldLG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3VycykpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNvbnRlbnQgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVDb250ZW50LmluZGV4T2YoIjoiKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHZhbHVlQ29udGVudC5zdWJzdHJpbmcoMCx2YWx1ZUNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RWYWx1ZXNbaV0gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhclR5cGUiLz4uRmFjdG9yeS5mcm9tU3RyaW5nKHZhbHVlQ29udGVudCxuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFZhbHVlc1tpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzaG9ydFR5cGVOYW1lIi8+KHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihvYmplY3RWYWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXZhTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWVVbmNhcHBlZCIgIHNlbGVjdD0iQHNob3J0dHlwZW5hbWUiLz4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvcnRUeXBlTmFtZSIKLSAgICAgICAgICAgICAgIHNlbGVjdD0iY29uY2F0KHRyYW5zbGF0ZSggc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDEsIDEgKSwnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICksIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAyLCBzdHJpbmctbGVuZ3RoKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQpKSkiIC8+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHNpbXBsZSBhbmQgbm90KEBhdHRyaWJ1dGUpIGFuZCBub3QoZW51bUZhY2V0KSI+Ci0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IHJldHVyblZhbHVlID0gbmV3ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0namF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNob3J0VHlwZU5hbWUiLz4odmFsdWUsbmFtZXNwYWNlVVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUbzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvcnRUeXBlTmFtZSIvPih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJlbnVtRmFjZXQiPgotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IGZyb21WYWx1ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBlbnVtZXJhdGlvbiA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLmdldCh2YWx1ZSArICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLmdldCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW51bWVyYXRpb249PW51bGwpIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tVmFsdWUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUbzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvcnRUeXBlTmFtZSIvPih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0namF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21WYWx1ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUodmFsdWUsbmFtZXNwYWNlVVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21WYWx1ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzaG9ydFR5cGVOYW1lIi8+KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNFbnVtRmFjZXQiIHNlbGVjdD0icHJvcGVydHkvZW51bUZhY2V0Ii8+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkaXNFbnVtRmFjZXQpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iQGlzQWJzdHJhY3QiPm51bGw7PC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT5uZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KCk7PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNFbnVtRmFjZXQiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBvYmplY3QgPSBudWxsOwotICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgYSBoYXNoIG1hcCB0byBrZWVwIHZhbHVlcwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5NYXAgYXR0cmlidXRlTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgamF2YS51dGlsLkxpc3QgZXh0cmFBdHRyaWJ1dGVMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICA8IS0tIEFkdmFuY2UgdG8gb3VyIHN0YXJ0IGVsZW1lbnQsIG9yIGlmIHdlIGFyZSBhIGNvbXBsZXggdHlwZSwgdG8gb3VyIGZpcnN0IHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQgb3IgdGhlIG91dGVyIGVuZCBlbGVtZW50IGlmIG5vIHByb3BlcnRpZXMgLS0+Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmYW1wOyZhbXA7ICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBlbGVtZW50IGFuZCByZXBvcnQgdGhlIG51bGwgdmFsdWUuICBJdCBjYW5ub3QgaGF2ZSBzdWJlbGVtZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlIG9yIEBhbm9uIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhpcyBjbGFzcyBjYW4gaGF2ZSBvbmx5IG9uZSBwcm9wZXJ0eSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0eS9AamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdsb25nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oamF2YS5sYW5nLkxvbmcuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYnl0ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5CeXRlLk1JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5Eb3VibGUuTmFOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuRmxvYXQuTmFOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuU2hvcnQuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPCEtLSBwYXJ0aWNhbCBjbGFzc2VzIGNhbiBub3QgaGF2ZSBhbnkgdHlwZXMgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoKCRpc1R5cGUgb3IgJGFub24gb3IgJHVuaW9uKSBhbmQgbm90KCRwYXJ0aWNsZUNsYXNzKSkiPgotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdW5pb24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LkZhY3RvcnkuZnJvbVN0cmluZyhyZWFkZXIsbnNVcmksdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4pPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXBwZXJDbGFzcyIvPi5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpc0Fic3RyYWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVGhlIGFuIGFic3RyYWN0IGNsYXNzIGNhbiBub3QgYmUgaW5zdGFudGlhdGVkICEhISIpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHVuaW9uIj4KLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIHVuaW9uIHR5cGUgd2l0aCBvdXQgc3BlY2lmaWMgeHNpOnR5cGUKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gdGhpcyBjb3VsZCBiZSBhIHFuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNldXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbGlzdCI+Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4uRmFjdG9yeS5mcm9tU3RyaW5nKHJlYWRlcixjb250ZW50KTsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDwhLS0gcG9wdWxhdGUgYXR0cmlidXRlcyBoZXJlISEhLiBUaGUgYXR0cmlidXRlcyBhcmUgcGFydCBvZiBhbiBlbGVtZW50LCBub3QgcGFydCBvZiBhIHR5cGUgLS0+Ci0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgPCEtLSBpZiB0aGlzIGlzIGFuIGVudW1lcmF0aW9uIHRoZW4gd2UgaGF2ZSB0byByZWFkIGF0dHJpYnV0ZXMgYWZ0ZXItLT4KLQotICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbQGF0dHJpYnV0ZV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSIgc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWVVbmNhcHBlZCIgIHNlbGVjdD0iQHNob3J0dHlwZW5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lIgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDEsIDEgKSwnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICksIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAyLCBzdHJpbmctbGVuZ3RoKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQpKSkiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YU5hbWUiIHNlbGVjdD0iQGphdmFuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZXNwYWNlIiBzZWxlY3Q9IkBuc3VyaSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImF0dHJpYk5hbWUiPnRlbXBBdHRyaWI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcHJvcGVydHlOYW1lICE9ICdleHRyYUF0dHJpYnV0ZXMnIj4KLSAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGF0dHJpYnV0ZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRyaWJOYW1lIi8+ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkbmFtZXNwYWNlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYk5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPi5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPi5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyBpbiBkZWZhdWx0IG5hbWVzYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2V1cmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzRW51bUZhY2V0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVNYXAucHV0KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPixuYW1lc3BhY2V1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPixuYW1lc3BhY2V1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNFbnVtRmFjZXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU1hcC5wdXQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUbzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvcnRUeXBlTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYk5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5GYWN0b3J5LmZyb21TdHJpbmcocmVhZGVyLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzaG9ydFR5cGVOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG9wdGlvbmFsIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2ludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5JbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuTG9uZy5NSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oamF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oamF2YS5sYW5nLkRvdWJsZS5OYU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5GbG9hdC5OYU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUmVxdWlyZWQgYXR0cmlidXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGlzIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRBdHRyaWJ1dGVzLmFkZCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBIYW5kbGUgYW55QXR0cmlidXRlcyBoZXJlIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwcm9wZXJ0eU5hbWUgPSAnZXh0cmFBdHRyaWJ1dGVzJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgcnVuIHRocm91Z2ggYWxsIGFueSBvciBleHRyYSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3ZXJlIG5vdCByZWZsZWN0ZWQgdW50aWwgbm93Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgJmx0OyByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVkQXR0cmlidXRlcy5jb250YWlucyhyZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGFueUF0dHJpYnV0ZSBhbmQgd2UgY3JlYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuIE9NQXR0cmlidXRlIGZvciB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NQXR0cmlidXRlSW1wbCBhdHRyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTUF0dHJpYnV0ZUltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5hbWVzcGFjZUltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpLCByZWFkZXIuZ2V0QXR0cmlidXRlUHJlZml4KGkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBleHRyYSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InByb3BlcnR5L2VudW1GYWNldCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlTGlzdC5hZGQoYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5hZGRFeHRyYUF0dHJpYnV0ZXMoYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlzVHlwZSBvciAkYW5vbikgYW5kIG5vdCgkc2ltcGxlKSBhbmQgbm90KCRwYXJ0aWNsZUNsYXNzKSI+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gU2tpcCB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSBzdWJlbGVtZW50cy4gLS0+Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBJZiB3ZSBhcmUgbm90IGEgdHlwZSBhbmQgbm90IGFuIGVsZW1lbnQgd2l0aCBhbm9ueW1vdXMgdHlwZSwgdGhlbiB3ZSBhcmUgYW4gZWxlbWVudCB3aXRoIG9uZSBwcm9wZXJ0eSBmb3Igb3VyIG5hbWVkIHR5cGUuIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gT3VyIHNpbmdsZSBuYW1lZC10eXBlIHByb3BlcnR5IGFwcGxpZXMgdG8gb3VyIGVudGlyZSBvdXRlciBlbGVtZW50LCBzbyBkb24ndCBza2lwIGl0LiAtLT4KLSAgICAgICAgICAgICAgICA8IS0tIEZpcnN0IGxvb3AgY3JlYXRlcyBhcnJheUxpc3RzIGZvciBoYW5kbGluZyBhcnJheXMgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5W25vdChAYXR0cmlidXRlKV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGxpc3Q8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPiA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9wZXJ0eVtub3QoQGF0dHJpYnV0ZSldIj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiR1bm9yZGVyZWQgYW5kIG5vdCgkcGFydGljbGVDbGFzcykiPiAgIDwhLS0gUHJvcGVydGllcyBjYW4gYmUgaW4gYW55IG9yZGVyIC0tPgotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpIDx4c2w6aWYgdGVzdD0iJHNpbXBsZSI+IHx8IHJlYWRlci5oYXNUZXh0KCk8L3hzbDppZj4pewotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdyByZWxvb3AgYW5kIHBvcHVsYXRlIHRoZSBjb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5W25vdChAYXR0cmlidXRlKV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lVW5jYXBwZWQiICBzZWxlY3Q9IkBzaG9ydHR5cGVuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDEsIDEgKSwnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICksIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAyLCBzdHJpbmctbGVuZ3RoKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQpKSkiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXZhTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsaXN0TmFtZSI+bGlzdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJsb29wQm9vbE5hbWUiPmxvb3BEb25lPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0YXJ0UW5hbWUiPnN0YXJ0UW5hbWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3RhdGVNYWNoaW5lTmFtZSI+c3RhdGVNYWNoaW5lPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJ1aWxkZXJOYW1lIj5idWlsZGVyPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VQcm9wZXJ0eVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJyYXlCYXNlVHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZXNwYWNlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtaW4iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluT2NjdXJzIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJ0aWNsZUNsYXNzVHlwZSIgc2VsZWN0PSJAcGFydGljbGVDbGFzc1R5cGUiPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wUU5hbWUiPm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdW5vcmRlcmVkIGFuZCBub3QoJGNob2ljZSBhbmQgJGhhc1BhcnRpY2xlVHlwZSkiPiAgPCEtLSBPbmUgcHJvcGVydHkgcGVyIGl0ZXJhdGlvbiBpZiB1bm9yZGVyZWQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJZiBzZXF1ZW5jZSwgYWR2YW5jZSB0byBzdGFydCBvZiBuZXh0IHByb3BlcnR5IG9yIHRvIGVuZCBvZiBvdXRlciBlbGVtZW50IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmYW1wOyZhbXA7ICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChlbnVtRmFjZXQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzaG9ydFR5cGVOYW1lPSdPTUVsZW1lbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwYXJ0aWNsZUNsYXNzVHlwZSBhbmQgKCRjaG9pY2Ugb3IgKCRtaW49MCkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNpbmNlIHdlIGNhbiBub3QgdmFsaWRhdGUgdGhlIHBhcnNlciBiZWZvcmUgZ29pbmcgdG8gbmV4dCBjbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHNvbGxvdyBhbiBleGNwZXRpb25zIDogdG9kbyBmaW5kIGEgYmV0dGVyIHNvbHN1dGlvbi0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSA8eHNsOmlmIHRlc3Q9IiRzaW1wbGUiPiB8fCByZWFkZXIuaGFzVGV4dCgpPC94c2w6aWY+IDx4c2w6aWYgdGVzdD0ibm90KCRzaW1wbGUpIGFuZCBub3QoJHBhcnRpY2xlQ2xhc3NUeXBlKSI+JmFtcDsmYW1wOyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BRTmFtZSIvPi5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSk8L3hzbDppZj4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBtdXN0IGJlIGEgbmFtZWQgdHlwZSBvciBlbGVtZW50IHdpdGggYW5vbnltb3VzIHR5cGUuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbGVtZW50cyB3aXRoIGEgbmFtZWQgdHlwZSBoYXZlIGEgc2luZ2xlIHNpbXBsZSAobm9uLWFycmF5KSBwcm9wZXJ0eSBmb3IgdGhlaXIgdHlwZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGFycmF5IGFuZCBzdGVwIHBhc3QgaXRzIGZpbmFsIGVsZW1lbnQncyBlbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VQcm9wZXJ0eVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJyYXlCYXNlVHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFydGljbGVDbGFzc1R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz4uRmFjdG9yeS5wYXJzZShyZWFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb29wIHVudGlsIHdlIGZpbmQgYSBzdGFydCBlbGVtZW50IHRoYXQgaXMgbm90IHBhcnQgb2YgdGhpcyBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCE8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPil7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgdG8gbmV4dCBlbGVtZW50IGV2ZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmYW1wOyZhbXA7ICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHdvIGNvbnRpbnVvdXMgZW5kIGVsZW1lbnRzIG1lYW5zIHdlIGFyZSBleGl0aW5nIHRoZSB4bWwgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz4uRmFjdG9yeS5wYXJzZShyZWFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBjb252ZXJ0ZXIgdXRpbGl0eSAgdG8gY29udmVydCBhbmQgc2V0IHRoZSBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4pKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmIHRoZSBiYXNlIHByb3BlcnR5IHR5cGUgaXMgYSBzb2FwIGVuY29kaW5nIGFycmF5IHRoZW4gZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIgY2xhc3Mgc2hvdWxkIGFsc28gcGFzc2VkLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BcnJheSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz4uRmFjdG9yeS5wYXJzZShyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1hcHBlckNsYXNzIi8+LmNsYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+LkZhY3RvcnkucGFyc2UocmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgc3RhcnQgZWxlbWVudCB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoaXMgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGJlIGF0IHRoZSBlbmQgZWxlbWVudCwgYnV0IG1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgb3V0IG9mIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgdG8gbmV4dCBlbGVtZW50IGV2ZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmYW1wOyZhbXA7ICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHdvIGNvbnRpbnVvdXMgZW5kIGVsZW1lbnRzIG1lYW5zIHdlIGFyZSBleGl0aW5nIHRoZSB4bWwgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wUU5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlVmFsdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgfHwgIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaWYgdGhlIGJhc2UgcHJvcGVydHkgdHlwZSBpcyBhIHNvYXAgZW5jb2RpbmcgYXJyYXkgdGhlbiBleHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyIGNsYXNzIHNob3VsZCBhbHNvIHBhc3NlZC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BcnJheSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPi5GYWN0b3J5LnBhcnNlKHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXBwZXJDbGFzcyIvPi5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPi5GYWN0b3J5LnBhcnNlKHJlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0aGUgY29udmVydGVyIHV0aWxpdHkgIHRvIGNvbnZlcnQgYW5kIHNldCB0aGUgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2phdmEubGFuZy5TdHJpbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4udG9BcnJheShuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+Wzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uc2l6ZSgpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIG9mIEFycmF5IGhhbmRsaW5nIG9mIEFEQiBjbGFzc2VzIC0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUxldCdzIGhhbmRsZSB4czphbnkgaGVyZS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+PWZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCl7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIHNvIHRoYXQgaXQgcHJvZHVjZXMgYSBmYWtlIFNUQVJUX0RPQ1VFTUVOVCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRidWlsZGVyTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcihyZWFkZXIpLCByZWFkZXIuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnVpbGRlck5hbWUiLz4uZ2V0T01FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHR3byBjb3VudGludW9zIGVuZCBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCA9PSBldmVudCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0namF2YS5sYW5nLlN0cmluZyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi50b0FycmF5KG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz5bPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5zaXplKCldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz4uY2xhc3MsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIG9mIEFycmF5IGhhbmRsaW5nIG9mIEFEQiBjbGFzc2VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZGVmYXVsdCI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz49ZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPiA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1wOyZhbXA7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPi5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmLWJsb2NrIHRoYXQgaGFuZGxlcyBuaWxsYWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuZ2V0QW55VHlwZU9iamVjdChyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXBwZXJDbGFzcyIvPi5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50ICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCA9PSBldmVudCAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQgPT0gZXZlbnQpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2phdmEubGFuZy5TdHJpbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4udG9BcnJheShuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+Wzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uc2l6ZSgpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4udG9BcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsaW5nIGJpbmFyeSBjYXNlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhZGVyTVRPTUF3YXJlKHJlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0JJTkFSWSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NVE9NIGF3YXJlIHJlYWRlciAtIGdldCB0aGUgZGF0YWhhbmRsZXIgZGlyZWN0bHkgYW5kIHB1dCBpdCBpbiB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKSByZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5EQVRBX0hBTkRMRVIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCAmYW1wOyZhbXA7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcFFOYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJmFtcDsmYW1wOyByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50cy5YT1BfTkFNRVNQQUNFX1VSSSwgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX0lOQ0xVREUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpZCA9IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5FbGVtZW50SGVscGVyLmdldENvbnRlbnRJRChyZWFkZXIsICJVVEYtOCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLk1UT01TdEFYU09BUE1vZGVsQnVpbGRlcikgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVN0QVhXcmFwcGVyKSByZWFkZXIpLmdldEJ1aWxkZXIoKSkuZ2V0RGF0YUhhbmRsZXIoaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocmVhZGVyLmhhc1RleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgdXN1YWwgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvb3AgdW50aWwgd2UgZmluZCBhIHN0YXJ0IGVsZW1lbnQgdGhhdCBpcyBub3QgcGFydCBvZiB0aGlzIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSBhcmUgYXQgdGhlIEVuZEVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgb3V0IG9mIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCB0byBuZXh0IGVsZW1lbnQgZXZlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmYW1wOyZhbXA7ICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHdvIGNvbnRpbnVvdXMgZW5kIGVsZW1lbnRzIG1lYW5zIHdlIGFyZSBleGl0aW5nIHRoZSB4bWwgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wUU5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlVmFsdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkc2ltcGxlKSI+cmVhZGVyLm5leHQoKTs8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWFkZXJNVE9NQXdhcmUocmVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfQklOQVJZKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01UT00gYXdhcmUgcmVhZGVyIC0gZ2V0IHRoZSBkYXRhaGFuZGxlciBkaXJlY3RseSBhbmQgcHV0IGl0IGluIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIpIHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLkRBVEFfSEFORExFUikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCAmYW1wOyZhbXA7IHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9OQU1FU1BBQ0VfVVJJLCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50cy5YT1BfSU5DTFVERSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkID0gb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0Q29udGVudElEKHJlYWRlciwgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCgoKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyKSAoKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU3RBWFdyYXBwZXIpIHJlYWRlcikuZ2V0QnVpbGRlcigpKS5nZXREYXRhSGFuZGxlcihpZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZWFkZXIuaGFzVGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0RvIHRoZSB1c3VhbCBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbCB0aGUgY29udmVydGVyIHV0aWxpdHkgIHRvIGNvbnZlcnQgYW5kIHNldCB0aGUgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2phdmEubGFuZy5TdHJpbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4udG9BcnJheShuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+Wzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uc2l6ZSgpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPi5jbGFzcyw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBkZWZhdWx0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz49ZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPiA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1wOyZhbXA7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPi5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmLWJsb2NrIHRoYXQgaGFuZGxlcyBuaWxsYWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdyYXAgdGhlIHJlYWRlciBzbyB0aGF0IGl0IHByb2R1Y2VzIGEgZmFrZSBTVEFSVF9ET0NVRU1FTlQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnVpbGRlck5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXIocmVhZGVyKSwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnVpbGRlck5hbWUiLz4uZ2V0T01FbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50ICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCA9PSBldmVudCAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQgPT0gZXZlbnQpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi50b0FycmF5KG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz5bPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5zaXplKCldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+LmNsYXNzLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbmQgb2YgQXJyYXkgaGFuZGxpbmcgb2YgZGVmYXVsdCBjbGFzcyAtIHRoYXQgaXMgdGhlIE9NRWxlbWVudCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2ludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChTdHJpbmcudmFsdWVPZihqYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0nbG9uZyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChTdHJpbmcudmFsdWVPZihqYXZhLmxhbmcuTG9uZy5NSU5fVkFMVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0nYnl0ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChTdHJpbmcudmFsdWVPZihqYXZhLmxhbmcuQnl0ZS5NSU5fVkFMVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKFN0cmluZy52YWx1ZU9mKGphdmEubGFuZy5Eb3VibGUuTmFOKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2Zsb2F0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKFN0cmluZy52YWx1ZU9mKGphdmEubGFuZy5GbG9hdC5OYU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoU3RyaW5nLnZhbHVlT2YoamF2YS5sYW5nLlNob3J0Lk1JTl9WQUxVRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChyZWFkZXIuZ2V0RWxlbWVudFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgc3RhcnQgZWxlbWVudCB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoaXMgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlIGFyZSBhdCB0aGUgRW5kRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIG91dCBvZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIHRvIG5leHQgZWxlbWVudCBldmVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJmFtcDsmYW1wOyAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3R3byBjb250aW51b3VzIGVuZCBlbGVtZW50cyBtZWFucyB3ZSBhcmUgZXhpdGluZyB0aGUgeG1sIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcFFOYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoU3RyaW5nLnZhbHVlT2YoamF2YS5sYW5nLkludGVnZXIuTUlOX1ZBTFVFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoU3RyaW5nLnZhbHVlT2YoamF2YS5sYW5nLkxvbmcuTUlOX1ZBTFVFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2J5dGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoU3RyaW5nLnZhbHVlT2YoamF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChTdHJpbmcudmFsdWVPZihqYXZhLmxhbmcuRG91YmxlLk5hTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChTdHJpbmcudmFsdWVPZihqYXZhLmxhbmcuRmxvYXQuTmFOKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGJhc2VQcm9wZXJ0eVR5cGU9J3Nob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKFN0cmluZy52YWx1ZU9mKGphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQocmVhZGVyLmdldEVsZW1lbnRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNvbnZlcnRlciB1dGlsaXR5ICB0byBjb252ZXJ0IGFuZCBzZXQgdGhlIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnRvQXJyYXkobmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPls8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+LmNsYXNzLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVHlwZSBvciAkYW5vbiI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaWYgdGhlIGJhc2UgcHJvcGVydHkgdHlwZSBpcyBhIHNvYXAgZW5jb2RpbmcgYXJyYXkgdGhlbiBleHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIgY2xhc3Mgc2hvdWxkIGFsc28gcGFzc2VkLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BcnJheSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4uRmFjdG9yeS5wYXJzZShyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXBwZXJDbGFzcyIvPi5jbGFzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+LkZhY3RvcnkucGFyc2UocmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKCRpc1R5cGUgb3IgJGFub24pIGFuZCBub3QoJHBhcnRpY2xlQ2xhc3NUeXBlKSI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj59PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc3RhcnQgb2YgYW55IGhhbmRsaW5nLiBBbnkgY2FuIGFsc28gYmUgQGRlZmF1bHQgc28gd2UgbmVlZCB0byBoYW5kbGUgdGhlIGFueSBjYXNlIGJlZm9yZSBkZWZhdWx0ISAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLU5vIGNvbmNlcm5zIG9mIGJlaW5nIG5pbGxhYmxlIGhlcmUuIGlmIGl0J3Mgb3VycyBhbmQgaWYgdGhlIG5pbGxhYmxlIGF0dHJpYnV0ZSB3YXMgcHJlc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIHdvdWxkIGhhdmUgb3V0cHV0dGVkIGEgbnVsbCBhbHJlYWR5LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRoaXMgY2FuIGJlIGFueSBlbGVtZW50IGFuZCB3ZSBtYXkgbm90IGtub3cgdGhlIG5hbWUuIHNvIHdlIHBpY2sgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgZnJvbSB0aGUgcGFyc2VyLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2UgdGhlIFFOYW1lIGZyb20gdGhlIHBhcnNlciBhcyB0aGUgbmFtZSBmb3IgdGhlIGJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPiA9IHJlYWRlci5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdyYXAgdGhlIHJlYWRlciBzbyB0aGF0IGl0IHByb2R1Y2VzIGEgZmFrZSBTVEFSVF9ET0NVTUVOVCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBidWlsZGVyIGNsYXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHJlYWRlciksPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+LmdldE9NRWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1R5cGUgb3IgJGFub24iPiAgPCEtLSBUaGlzIGlzIGEgc3ViZWxlbWVudCBwcm9wZXJ0eSB0byBiZSBjb25zdW1lZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBlbmQgb2YgYWRiIHR5cGUgaGFuZGxpbmcgY29kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzdGFydCBvZiBPTWVsZW1lbnQgaGFuZGxpbmcgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGRlZmF1bHQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5nZXRBbnlUeXBlT2JqZWN0KHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFwcGVyQ2xhc3MiLz4uY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1R5cGUgb3IgJGFub24iPiAgPCEtLSBUaGlzIGlzIGEgc3ViZWxlbWVudCBwcm9wZXJ0eSB0byBiZSBjb25zdW1lZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBlbmQgb2YgT01lbGVtZW50IGhhbmRsaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0YXJ0IG9mIHRoZSBzaW1wbGUgdHlwZXMgaGFuZGxpbmcgZm9yIGJpbmFyeSBjb250ZW50LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRzaW1wbGUpIj5yZWFkZXIubmV4dCgpOzwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhZGVyTVRPTUF3YXJlKHJlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19CSU5BUlkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01UT00gYXdhcmUgcmVhZGVyIC0gZ2V0IHRoZSBkYXRhaGFuZGxlciBkaXJlY3RseSBhbmQgcHV0IGl0IGluIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKSByZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5EQVRBX0hBTkRMRVIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UICZhbXA7JmFtcDsgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX05BTUVTUEFDRV9VUkksIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9JTkNMVURFKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkID0gb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0Q29udGVudElEKHJlYWRlciwgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCgob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIpICgob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01TdEFYV3JhcHBlcikgcmVhZGVyKS5nZXRCdWlsZGVyKCkpLmdldERhdGFIYW5kbGVyKGlkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKCRpc1R5cGUgb3IgJGFub24pIGFuZCBub3QoJHNpbXBsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlYWRlci5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgdXN1YWwgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlzVHlwZSBvciAkYW5vbikgYW5kIG5vdCgkc2ltcGxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVHlwZSBvciAkYW5vbiI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzdGFydCBvZiB0aGUgc2ltcGxlIHR5cGVzIGhhbmRsaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlVmFsdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgJmFtcDsmYW1wOyAhIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoZW51bUZhY2V0KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmRleCA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2V1cmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKGNvbnRlbnQsbmFtZXNwYWNldXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjID0gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBfdmFsdWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBvbU5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4uYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChfdmFsdWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+LCBjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihfdmFsdWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUbzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvcnRUeXBlTmFtZSIvPihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKGVudW1GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzZWVtcyB0byBiZSBhIFFuYW1lIHNvIGZpbmQgdGhlIG5hbWVzcGFjZSBhbmQgc2VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLCBjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZXVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzZWVtcyB0byBiZSBub3QgYSBxbmFtZSBzZW5kIGFuZCBlbXB0eSBuYW1lc3BhY2UgaW5jYXNlIG9mIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlzIGRvbmUgaW4gZnJvbVN0cmluZyBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgaGVyZSBzaW5jZSBvbmJqZWN0IGlzIG5vdCBpbml0YWxpemVkIHlldCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vcHJvcGVydHlbQGF0dHJpYnV0ZV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSIgc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWVVbmNhcHBlZCIgIHNlbGVjdD0iQHNob3J0dHlwZW5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDEsIDEgKSwnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICksIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAyLCBzdHJpbmctbGVuZ3RoKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQpKSkiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YU5hbWUiIHNlbGVjdD0iQGphdmFuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYXR0cmliTmFtZSI+dGVtcE9iamVjdEF0dHJpYjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcHJvcGVydHlOYW1lICE9ICdleHRyYUF0dHJpYnV0ZXMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYk5hbWUiLz4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU1hcC5nZXQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvcnRUeXBlTmFtZSIvPik8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYk5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhhbmRsZSBhbnlBdHRyaWJ1dGVzIGhlcmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHByb3BlcnR5TmFtZSA9ICdleHRyYUF0dHJpYnV0ZXMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihqYXZhLnV0aWwuSXRlcmF0b3IgaXRlciA9IGV4dHJhQXR0cmlidXRlTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZEV4dHJhQXR0cmlidXRlcygob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01BdHRyaWJ1dGVJbXBsKWl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2V0IHRoZSB2YXJpYWJsZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHZhcmlhYmxlIHR5cGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5JbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdsb25nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuTG9uZy5NSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYnl0ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oamF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oamF2YS5sYW5nLkRvdWJsZS5OYU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5GbG9hdC5OYU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5TaG9ydC5NSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsgLy8gdGhyb3cgYXdheSB0ZXh0IG5vZGVzIGlmIGFueS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlzVHlwZSBvciAkYW5vbikgYW5kIG5vdCgkc2ltcGxlKSI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChlbnVtRmFjZXQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtaW49MCBhbmQgJG9yZGVyZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2ludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oamF2YS5sYW5nLkxvbmcuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5CeXRlLk1JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KGphdmEubGFuZy5Eb3VibGUuTmFOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuRmxvYXQuTmFOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPihqYXZhLmxhbmcuU2hvcnQuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGluIGEgcGFydGljbGUgY2xhc3MgYWxsIGlubmVyIGVsZW1lbnRzIG1heSBiZSBtaW49MCB0aGVpciB2YWxpZGF0aW9uIGRvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSB0aGUgc2VxdWNlIGNsYXNzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG9yZGVyZWQgYW5kICRtaW4hPTAgYW5kIG5vdCgkcGFydGljbGVDbGFzc1R5cGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwYXJ0aWNsZUNsYXNzVHlwZSBhbmQgKCRjaG9pY2Ugb3IgKCRtaW49MCkpIGFuZCBub3QoJHNob3J0VHlwZU5hbWU9J09NRWxlbWVudCcpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzaW5jZSB3ZSBjYW4gbm90IHZhbGlkYXRlIHRoZSBwYXJzZXIgYmVmb3JlIGdvaW5nIHRvIG5leHQgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGhhdmUgdG8gc29sbG93IGFuIGV4Y3BldGlvbnMgOiB0b2RvIGZpbmQgYSBiZXR0ZXIgc29sc3V0aW9uLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkb3JkZXJlZCI+ICA8IS0tIHBpY2sgdXAgdHJhaWxpbmcgY3J1ZnQgYWZ0ZXIgZmluYWwgcHJvcGVydHkgYmVmb3JlIG91dGVyIGVuZEVsZW1lbnQgYW5kIHZlcmlmeSBubyB0cmFpbGluZyBwcm9wZXJ0aWVzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJmFtcDsmYW1wOyAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYXJ0aWNsZUNsYXNzKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhIHRyYWlsaW5nIGludmFsaWQgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9wZXJ0eVtub3QoQGF0dHJpYnV0ZSldIj4gIDwhLS0gdGhpcyBpZiBpcyBuZWVkZWQgdG8gc2tpcCBhbGwgdGhpcyB3aGVuIHRoZXJlIGFyZSBubyBwcm9wb2VydGllcy0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkdW5vcmRlcmVkIGFuZCBub3QoJHBhcnRpY2xlQ2xhc3MpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QocHJvcGVydHkvZW51bUZhY2V0KSBhbmQgbm90KCRjaG9pY2Ugb3IgJGhhc1BhcnRpY2xlVHlwZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICA8IS0tIEF0IG5laXRoZXIgYSBzdGFydCBub3IgYW4gZW5kIGVsZW1lbnQsIHNraXAgaXQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgPCEtLSBlbmQgb2YgdGVtcGxhdGUgZm9yIGNob2ljZS9hbGwgLS0+Ci0KLSAgICAgICAgfQotICAgICAgICAgICA8IS0tIGVuZCBvZiBtYWluIHRlbXBsYXRlIC0tPgotICAgICAgICAgIDwveHNsOnRlbXBsYXRlPgotCi0KLTwhLS0gJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLS0+Ci08IS0tICQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC0tPgotPCEtLSAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQtLT4KLTwhLS0gJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkLS0+Ci08IS0tICQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC0tPgotPCEtLSAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQtLT4KLQotCi0gICAgPCEtLSB0aGlzIGlzIHRoZSBjb21tb24gdGVtcGxhdGUgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iYmVhbltAaGVscGVyTW9kZV0iPgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNob2ljZSIgc2VsZWN0PSJAY2hvaWNlIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2ltcGxlIiBzZWxlY3Q9IkBzaW1wbGUiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcmRlcmVkIiBzZWxlY3Q9IkBvcmRlcmVkIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idW5vcmRlcmVkIiBzZWxlY3Q9Im5vdCgkb3JkZXJlZCkiLz4gIDwhLS0gZm9yIGNvbnZlbmllbmNlIC0tPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVHlwZSIgc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFub24iIHNlbGVjdD0iQGFub24iLz4KLQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5zdXJpIiBzZWxlY3Q9IkBuc3VyaSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9yaWdpbmFsTmFtZSIgc2VsZWN0PSJAb3JpZ2luYWxOYW1lIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibnNwcmVmaXgiIHNlbGVjdD0iQG5zcHJlZml4Ii8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZW5zaW9uIiBzZWxlY3Q9IkBleHRlbnNpb24iLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXN0cmljdGlvbiIgc2VsZWN0PSJAcmVzdHJpY3Rpb24iLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXBwZXJDbGFzcyIgc2VsZWN0PSJAbWFwcGVyQ2xhc3MiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVscGVybmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+SGVscGVyPC94c2w6dmFyaWFibGU+Ci0gICAgICAgPCEtLSB3cml0ZSB0aGUgY2xhc3MgaGVhZGVyLiB0aGlzIHNob3VsZCBiZSBkb25lIG9ubHkgd2hlbiB1bndyYXBwZWQgLS0+Ci0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJub3Qobm90KEB1bndyYXBwZWQpIG9yIChAc2tpcC13cml0ZSkpIj4KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotCi0gICAgICAgICAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIDwveHNsOmlmPgotCi0KLSAgICA8eHNsOmNob29zZT4KLSAgICA8eHNsOndoZW4gdGVzdD0ibm90KEBoZWxwZXIpIj4KLQotICAgIHB1YmxpYyA8eHNsOmlmIHRlc3Q9Im5vdChAdW53cmFwcGVkKSBvciAoQHNraXAtd3JpdGUpIj5zdGF0aWM8L3hzbDppZj4gY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6aWYgdGVzdD0iJGV4dGVuc2lvbiI+IGV4dGVuZHMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbnNpb24iLz48L3hzbDppZj4KLSAgICAgICAgewotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZSI+LyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnN1cmkiLz4KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3ByZWZpeCIvPgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoCi0gICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnN1cmkiLz4iLAotICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9yaWdpbmFsTmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnNwcmVmaXgiLz4iKTsKLQotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPiIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnNwcmVmaXgiLz4iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgLyoqIFdoZW5ldmVyIGEgbmV3IHByb3BlcnR5IGlzIHNldCBlbnN1cmUgYWxsIG90aGVycyBhcmUgdW5zZXQKLSAgICAgICAgICAgICAqICBUaGVyZSBjYW4gYmUgb25seSBvbmUgY2hvaWNlIGFuZCB0aGUgbGFzdCBvbmUgd2lucwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXJBbGxTZXR0aW5nVHJhY2tlcnMoKSB7Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgICAgIGxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhbmFtZSIvPlRyYWNrZXIgPSBmYWxzZTsKLSAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotCi0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDwhLS0gV3JpdGUgb25seSB0aGUgTk9UIGluaGVyaXRlZCBwcm9wZXJ0aWVzLS0+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAaW5oZXJpdGVkKSI+Ci0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtaW4iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluT2NjdXJzIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZhck5hbWUiPmxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXR0aW5nVHJhY2tlciI+bG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+VHJhY2tlcjwveHNsOnZhcmlhYmxlPgotCi0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibGVuRmFjZXQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVuRmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWF4TGVuRmFjZXQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWF4TGVuRmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWluTGVuRmFjZXQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluTGVuRmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWF4RXhGYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhFeEZhY2V0Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1pbkV4RmFjZXQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluRXhGYWNldCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtYXhJbkZhY2V0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heEluRmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWluSW5GYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5JbkZhY2V0Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhdHRlcm5GYWNldCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXR0ZXJuRmFjZXQiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvcnRUeXBlTmFtZVVuY2FwcGVkIiAgc2VsZWN0PSJAc2hvcnR0eXBlbmFtZSIvPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lIgotICAgICAgICAgICAgICAgc2VsZWN0PSJjb25jYXQodHJhbnNsYXRlKCBzdWJzdHJpbmcoJHNob3J0VHlwZU5hbWVVbmNhcHBlZCwgMSwgMSApLCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKSwgc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDIsIHN0cmluZy1sZW5ndGgoJHNob3J0VHlwZU5hbWVVbmNhcHBlZCkpKSIgLz4KLQotCi0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHJlbW92ZWQiPgotCi0gICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXN0cmljdGlvbiIvPgotICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgcHVibGljICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCl7Ci0gICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5vcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicHJvcGVydHkgaGFzIHJlbW92ZWQiKTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICogT3ZlcnJpZGRlbiBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzdHJpY3Rpb24iLz4KLSAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4KLSAgICAgICAgICAgICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbgotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQHJlc3RyaWN0ZWQpIGFuZCAoQG9jY3VyYW5jZUNoYW5nZWQpIGFuZCAobm90KEB0eXBlQ2hhbmdlZCkpIGFuZCAobm90KEByZXdyaXRlKSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnJheUJhc2VUeXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIHZhbGlkYXRvciBNZXRob2QsIHRoaXMgaXMgc3BlY2lmaWFjYWxseSBmb3IgdmFsaWRhdGluZyB0aGUgYXJyYXlzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBWYWxpZGF0ZSB0aGUgYXJyYXkgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqIE92ZXJyaWRkZW4gZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3RyaWN0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB1bmJvdW5kKSBhbmQgQGFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFyYW0gIT0gbnVsbCkgJmFtcDsmYW1wOyAocGFyYW0ubGVuZ3RoICZndDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhPY2N1cnMiLz4pKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluIT0wIGFuZCBAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJhbSAhPSBudWxsKSAmYW1wOyZhbXA7IChwYXJhbS5sZW5ndGggJmx0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pbiIvPikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICogT3ZlcnJpZGRlbiBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzdHJpY3Rpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjYWxsIHRoZSB2YWxpZGF0b3ItLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KHBhcmFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGNob2ljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNldHRpbmdUcmFja2VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIHVwZGF0aW5nIG9mIHNldHRpbmcgdHJhY2tlciBmb3IgbnVsbCB2YWx1ZXMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBtYXJrZWQgYXMgbmlsbGFibGUuIEVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGNhbiBzZXQgYSBudWxsIHZhbHVlIGFuZCBpdCBpcyBuZXZlciBtYXJrZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAcHJpbWl0aXZlIGFuZCBub3QoQGFycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgcHJpbWl0aXZlIHZhcmlhYmxlIGFsd2F5cyB0byB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2V0dGluZ1RyYWNrZXIiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIHNldHRpbmcgdHJhY2tlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIHdhcyBhbiBBdHRyaWJ1dGUhPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgd2FzIGFuIEFycmF5ITwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZUNoYW5nZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgKiBUeXBlIG9mIHRoaXMgZmllbGQgaXMgYSBzdWJ0eXBlIG9mIGl0cyBvcmlnaW5hbC48L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKEByZXdyaXRlKSBhbmQgKEBvY2N1cmFuY2VDaGFuZ2VkKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgZmllbGQgd2FzIGFuIGFycmF5IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzdHJpY3Rpb24iLz4uPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIiAvPiA7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImVudW1GYWNldCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaE1hcCBfdGFibGVfID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIiAvPiA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLnB1dCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiIC8+ICsgIiIsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZV8ucHV0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIgLz4sIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVudW1GYWNldCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNob3J0VHlwZU5hbWUiLz4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVudW1GYWNldCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4oXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gZ2V0VmFsdWUoKSB7IHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiIC8+O30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiBmcm9tVmFsdWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gZW51bWVyYXRpb24gPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLmdldCh2YWx1ZSArICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVfLmdldCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bWVyYXRpb249PW51bGwpIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnVtZXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tVmFsdWUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUbzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvcnRUeXBlTmFtZSIvPih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tVmFsdWUobmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3Qgb2JqKSB7cmV0dXJuIChvYmogPT0gdGhpcyk7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IHJldHVybiB0b1N0cmluZygpLmhhc2hDb2RlKCk7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KGVudW1GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHZW5lcmF0ZSBhIHRyYWNrZXIgb25seSBpZiB0aGUgbWluIG9jY3VycyBpcyB6ZXJvLCB3aGljaCBtZWFucyBpZiB0aGUgdXNlciBkb2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYm90aGVyIHRvIHNldCB0aGF0IHZhbHVlLCB3ZSBkbyBub3Qgc2VuZCBpdCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFRoaXMgdHJhY2tlciBib29sZWFuIHdpbCBiZSB1c2VkIHRvIGRldGVjdCB3aGV0aGVyIHRoZSB1c2VyIGNhbGxlZCB0aGUgc2V0IG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZm9yIHRoaXMgYXR0cmlidXRlLiBJdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGlzIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW4gdGhlIHNlcmlhbGl6ZWQgWE1MCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IGZhbHNlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXaGVuIGdlbmVyYXRpbmcgdGhlIHNldHRlcnMsIHdlIGhhdmUgdG8gY2F0ZXIgZGlmZmVyZW50bHkgZm9yIHRoZSBhcnJheSEtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnJheUJhc2VUeXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIHZhbGlkYXRvciBNZXRob2QsIHRoaXMgaXMgc3BlY2lmaWFjYWxseSBmb3IgdmFsaWRhdGluZyB0aGUgYXJyYXlzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRlIHRoZSBhcnJheSBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdW5ib3VuZCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJhbSAhPSBudWxsKSAmYW1wOyZhbXA7IChwYXJhbS5sZW5ndGggJmd0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heE9jY3VycyIvPikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluIT0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGFyYW0gIT0gbnVsbCkgJmFtcDsmYW1wOyAocGFyYW0ubGVuZ3RoICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaW4iLz4pKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNhbGwgdGhlIHZhbGlkYXRvci0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4ocGFyYW0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBbGxTZXR0aW5nVHJhY2tlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtaW49MCBvciAkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgdXBkYXRpbmcgb2Ygc2V0dGluZyB0cmFja2VyIGZvciBudWxsIHZhbHVlcyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXBwZW4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBtYXJrZWQgYXMgbmlsbGFibGUuIEVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBjYW4gc2V0IGEgbnVsbCB2YWx1ZSBhbmQgaXQgaXMgbmV2ZXIgbWFya2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHByaW1pdGl2ZSBhbmQgbm90KEBhcnJheSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgcHJpbWl0aXZlIGF0dHJpYnV0ZSB0byB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgc2V0dGluZyB0cmFja2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXR0aW5nVHJhY2tlciIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSBzcGVjaWFsIGNhc2UgdGhlICdhcnJheScgc2NlbmFyaW8gYW5kIGdlbmVyYXRlIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGFkZGluZyBlbGVtZW50cyBvbmUgYnkgb25lIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFycmF5LiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyBzb21ld2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZWZmaWNpZW50IGJ1dCBnZXRzIHRoZSBqb2IgZG9uZS5TaW5jZSBhIHByaW1pdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIG9iamVjdCBpdCBoYXMgdG8gYmUgaWdub3JlZCEKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHByaW1pdGl2ZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBhZGQgbWV0aG9kIGZvciB0aGUgYXJyYXkgZm9yIGNvbnZlbmllbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPnt9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNldHRpbmdUcmFja2VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIHNldHRpbmcgdHJhY2tlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IGxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC50b0xpc3QoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pbGlzdC50b0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz5bbGlzdC5zaXplKCldKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGVuZCBvZiBzcGVjaWFsIGNhc2luZyBmb3IgdGhlIGFycmF5LS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm9uIGFycmF5IHNldHRlciBtZXRob2QtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckFsbFNldHRpbmdUcmFja2VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBwcmltaXRpdmUgYW5kIG5vdChAYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgcHJpbWl0aXZlIGF0dHJpYnV0ZSB0cmFja2VyIHRvIHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2V0dGluZ1RyYWNrZXIiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBzZXR0aW5nIHRyYWNrZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2V0dGluZ1RyYWNrZXIiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQHJlc3RyaWN0aW9uQmFzZVR5cGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IihAcGF0dGVybkZhY2V0KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBhcmFtLm1hdGNoZXMoICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhdHRlcm5GYWNldCIvPiIgKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQGxlbkZhY2V0KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBhcmFtLmxlbmd0aCgpID09IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVuRmFjZXQiLz4gKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IihAbWF4TGVuRmFjZXQpIG9yIChAbWluTGVuRmFjZXQpIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCA8eHNsOmlmIHRlc3Q9IihAbWluTGVuRmFjZXQpIj4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWluTGVuRmFjZXQiLz4gJmx0OyBwYXJhbS5sZW5ndGgoKSkgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoQG1heExlbkZhY2V0KSI+IDx4c2w6aWYgdGVzdD0iKEBtaW5MZW5GYWNldCkiPiAmYW1wOyZhbXA7IDwveHNsOmlmPiAocGFyYW0ubGVuZ3RoKCkgJmd0Oz0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYXhMZW5GYWNldCIvPikgPC94c2w6aWY+ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQG1heEV4RmFjZXQpIG9yIChAbWluRXhGYWNldCkgb3IgKEBtYXhJbkZhY2V0KSBvciAoQG1pbkluRmFjZXQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggPHhzbDppZiB0ZXN0PSIoQG1pbkV4RmFjZXQpIj4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaW5FeEZhY2V0Ii8+ICZsdDsgPC94c2w6aWY+IDx4c2w6aWYgdGVzdD0iKEBtaW5JbkZhY2V0KSI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWluSW5GYWNldCIvPiAmbHQ7PSA8L3hzbDppZj4gcGFyYW0gPHhzbDppZiB0ZXN0PSIoQG1heEV4RmFjZXQpIj4gJmd0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1heEV4RmFjZXQiLz4gPC94c2w6aWY+IDx4c2w6aWYgdGVzdD0iKEBtYXhJbkZhY2V0KSI+ICZndDs9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWF4SW5GYWNldCIvPiA8L3hzbDppZj4gKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgIDwhLS0gZW5kIG9mIHhzbDppZiBmb3Igbm90KEBpbmhlcml0ZWQpIC0tPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgIH0KLSAgICA8L3hzbDp3aGVuPgotICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgIDwhLS0gIFN0YXJ0IG9mIGhlbHBlciBnZW5lcmF0aW9uIHBhcnQgb2YgdGhlIHRlbXBsYXRlLS0+Ci1wdWJsaWMgPHhzbDppZiB0ZXN0PSJub3QoQHVud3JhcHBlZCkgb3IgKEBza2lwLXdyaXRlKSI+c3RhdGljPC94c2w6aWY+IGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVscGVybmFtZSIvPiB7Ci0KLSAgICAgPCEtLSBnZXQgT01FbGVtZW50IG1ldGhvZHMgdGhhdCBhbGxvd3MgZGlyZWN0IHdyaXRpbmcuIGdlbmVyYXRlZCBpbnNpZGUgdGhlIGhlbHBlciBjbGFzcy0tPgotICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZ1bGx5UXVhbGlmaWVkTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZ1bGx5UXVhbGlmaWVkSGVscGVyTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVscGVybmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmdWxseVF1YWxpZmllZE5hbWUiLz4uTVlfUU5BTUUuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmdWxseVF1YWxpZmllZE5hbWUiLz4uTVlfUU5BTUUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgIDwhLS0gd29ya2Fyb3VuZCBmb3IgdGhlIGlzc3VlcyBpbiB0aGUgd3N0eCByZWFkZXIhLS0+Ci0gICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICAgICAgICAgfQotICAgICAgICAgICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLSAgICAgICAgICAgIDwhLS0gZ2V0IE9NRWxlbWVudCBtZXRob2RzIHRoYXQgYWxsb3dzIGRpcmVjdCB3cml0aW5nIC0tPgotICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICBmaW5hbCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGx5UXVhbGlmaWVkTmFtZSIvPiBiZWFuLAotICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0gZ2V0T01EYXRhU291cmNlKGJlYW4scGFyZW50UU5hbWUsIGZhY3RvcnkpOwotCi0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmdWxseVF1YWxpZmllZE5hbWUiLz4uTVlfUU5BTUUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgfQotCi0gICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZ2V0T01EYXRhU291cmNlKAotICAgICAgICAgICAgZmluYWwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmdWxseVF1YWxpZmllZE5hbWUiLz4gYmVhbiwKLSAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KXRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJIZWxwZXJEYXRhU291cmNlKGJlYW4scGFyZW50UU5hbWUsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsbHlRdWFsaWZpZWRIZWxwZXJOYW1lIi8+Iil7Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGx5UXVhbGlmaWVkTmFtZSIvPiB0eXBlZEJlYW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGx5UXVhbGlmaWVkTmFtZSIvPiliZWFuOwotCi0gICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGUgb3IgQGFub24iPgotICAgICAgICAgICAgICAgIDwhLS0gRm9yIGEgdHlwZSB3cml0ZSB0aGUgcGFzc2VkIGluIFFOYW1lIGZpcnN0LS0+Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDwhLS0gd3JpdGUgdGhlIHR5cGUgYXR0cmlidXRlIGlmIG5lZWRlZCAtLT4KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGV4dGVuc2lvbiI+Ci0gICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+IikrIjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9yaWdpbmFsTmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8IS0tRmlyc3Qgc2VyaWFsaXplIHRoZSBhdHRyaWJ1dGVzIS0tPgotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eVtAYXR0cmlidXRlXSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJOYW1lIj50eXBlZEJlYW4ubG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWVzcGFjZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSAtIEl0IGlzIGFzc3VtZWQgdGhhdCBhbnkgYXR0cmlidXRlcyBhcmUgT01BdHRyaWJ1dGVzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSBhbmQgbm90KEBhcnJheSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LmdldE5hbWVzcGFjZSgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSBhbmQgQGFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aSAmbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXS5nZXROYW1lc3BhY2UoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldLmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGVyZSBjYW4gbmV2ZXIgYmUgYXR0cmlidXRlIGFycmF5cyBpbiB0aGUgbm9ybWFsIGNhc2UtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3B0aW9uYWwiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCBhdHRyaWJ1dGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pLCB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IHdhcyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGNhbiBub3QgYmUgc2VyaWFsaXplZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgPCEtLSBOb3cgc2VyaWFsaXplIHRoZSBlbGVtZW50cy0tPgotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eVtub3QoQGF0dHJpYnV0ZSldIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZhck5hbWUiPnR5cGVkQmVhbi5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqYXZhbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1pbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lc3BhY2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXR0aW5nVHJhY2tlciI+dHlwZWRCZWFuLmxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhbmFtZSIvPlRyYWNrZXI8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluPTAgb3IgJGNob2ljZSI+IGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+KXs8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMgYW5kIG5vdChAYXJyYXkpIGFuZCBub3QoQGRlZmF1bHQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlMi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4MiA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPkhlbHBlci5nZXRPTURhdGFTb3VyY2UoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KS5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPkhlbHBlci5nZXRPTURhdGFTb3VyY2UoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpLnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyBhbmQgQGFycmF5IGFuZCBub3QoQGRlZmF1bHQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJyYXlCYXNlVHlwZSIvPkhlbHBlci5nZXRPTURhdGFTb3VyY2UoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpLnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UyID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgyID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeDIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZTIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbj0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IHRoaW5nIHNpbmNlIG1pbk9jY3VyZXMgaXMgemVybwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgbnVsbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeDIgPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeDIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBkZWZhdWx0IGFuZCBAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZSAtIEFzc3VtZWQgdG8gYmUgT01FbGVtZW50LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBudWxsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXS5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlMiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgyID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIiwiMSIseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbj0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGRvIG5vdGhpbmcgc2luY2UgbWluT2NjdXJzIGlzIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgbnVsbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeDIgPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeDIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGRlZmF1bHQgYW5kIG5vdChAYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgLSBBc3N1bWVkIHRvIGJlIE9NRWxlbWVudC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBudWxsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZTIgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UyLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgyID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlMiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgbnVsbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UyID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlMi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeDIgPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4MiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4MiA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeDIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeDIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4MiwgbmFtZXNwYWNlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZTIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZSBub24gQURCIGFycmF5cyAtIE5vdCBhbnkgaG93ZXZlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkgYW5kIG5vdChAYW55KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4hPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbXB0eU5hbWVzcGFjZSA9IG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAgZW1wdHlOYW1lc3BhY2UgPyBudWxsIDogeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHlOYW1lc3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4MiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4MiwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcHJpbWl0aXZlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVtcHR5TmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4MiA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeDIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeDIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4MiwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0namF2YS5sYW5nLlN0cmluZ1tdJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgbnVsbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW49MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBub3RoaW5nIHNpbmNlIG1pbk9jY3VycyBpcyB6ZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBudWxsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlMiA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXgyID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDIgPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG5hbWVzcGFjZTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgyLCBuYW1lc3BhY2UyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeDIsIG5hbWVzcGFjZTIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UyLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIiwiMSIseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIG5vbiBBREIgYXJyYXlzICAtIEFueSBjYXNlICAtIGFueSBtYXkgbm90IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5IGFuZCBAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGUgLSBBc3N1bWVkIHRvIGJlIE9NRWxlbWVudC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwO2kgJmx0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4ubGVuZ3RoO2krKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXS5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWluPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBkbyBub3RoaW5nIHNpbmNlIG1pbk9jY3VyZXMgemVybwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBoYW5kbGUgYW55IC0gbm9uIGFycmF5IGNhc2UtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlIC0gQXNzdW1lZCB0byBiZSBPTUVsZW1lbnQtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIGFsbCBvdGhlciBjYXNlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHNpbXBsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBoYW5kbGUgdGhlIGJpbmFyeSBjYXNlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBiaW5hcnkiPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIYW5kbGluZyB0aGUgbnVsbCBieXRlIGFycmF5IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YW5hbWUiLz5fYmluYXJ5ID0gbmV3ICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsKCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4sIG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YW5hbWUiLz5fYmluYXJ5LmludGVybmFsU2VyaWFsaXplQW5kQ29uc3VtZSh4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcHJpbWl0aXZlKSI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0namF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuYW1lc3BhY2VVUkkgIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCxuYW1lc3BhY2VVUkkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J29yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4uc2VyaWFsaXplKHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHNpbXBsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1pbj0wIG9yICRjaG9pY2UiPn08L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgIDwhLS0gd3JpdGUgdGhlIGVuZCBlbGVtZW50IGZvciB0aGUgdHlwZS0tPgotICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgPCEtLSBlbmQgb2Ygd2hlbiBmb3IgdHlwZSAmIGFub24gLS0+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICA8IS0tIE5vdCBhIHR5cGUgYW5kIG5vdCBhbm9uLiBTbyBpdCBiZXR0ZXIgYmUgb25seSBvbmUgaW5jbHVzaW9uLS0+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8IS0tIGlmIHRoZSBlbGVtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUsIHRoZW4gaXRzIGdvbm5hIGJlIG9ubHkgb25lIC0tPgotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZhck5hbWUiPnR5cGVkQmVhbi5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0eS9AamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5pbGxhYmxlIiBzZWxlY3Q9InByb3BlcnR5L0BuaWxsYWJsZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmltaXRpdmUiIHNlbGVjdD0icHJvcGVydHkvQHByaW1pdGl2ZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0eS9AdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gVGhpcyBiZXR0ZXIgYmUgb25seSBvbmUhIS0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icHJvcGVydHkvQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0eS9AbnN1cmkiLz4iOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQG5hbWUiLz4iLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQG5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQG5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIsIjEiLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwcm9wZXJ0eS9AdHlwZSIvPkhlbHBlci5nZXRPTURhdGFTb3VyY2UoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGx5UXVhbGlmaWVkTmFtZSIvPi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSkuc2VyaWFsaXplKHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlByb3BlcnR5IGNhbm5vdCBiZSBudWxsISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0B0eXBlIi8+SGVscGVyLmdldE9NRGF0YVNvdXJjZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsbHlRdWFsaWZpZWROYW1lIi8+Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KS5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gZW5kIG9mIG91cnMgYmxvY2stLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChwcm9wZXJ0eS9Ac2ltcGxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0Buc3VyaSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0BuYW1lIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9wZXJ0eS9Ac2ltcGxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwcmltaXRpdmUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiLCIxIix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlZhbHVlIGNhbm5vdCBiZSBudWxsICEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPix4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2phdmEubGFuZy5TdHJpbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcHJpbWl0aXZlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNyZWF0ZVByZWZpeCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjcmVhdGVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAqIENyZWF0ZSBhIHByZWZpeAotICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBjcmVhdGVQcmVmaXgoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5zIiArIChpbnQpTWF0aC5yYW5kb20oKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsbHlRdWFsaWZpZWROYW1lIi8+IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChwcm9wZXJ0eS9lbnVtRmFjZXQpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZ1bGx5UXVhbGlmaWVkTmFtZSIvPiBvYmplY3QgPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmdWxseVF1YWxpZmllZE5hbWUiLz4oKTs8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icHJvcGVydHkvZW51bUZhY2V0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gb2JqZWN0ID0gbnVsbDs8L3hzbDppZj4KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIDwhLS0gQWR2YW5jZSB0byBvdXIgc3RhcnQgZWxlbWVudCwgb3IgaWYgd2UgYXJlIGEgY29tcGxleCB0eXBlLCB0byBvdXIgZmlyc3QgcHJvcGVydHkgc3RhcnQgZWxlbWVudCBvciB0aGUgb3V0ZXIgZW5kIGVsZW1lbnQgaWYgbm8gcHJvcGVydGllcyAtLT4KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICZhbXA7JmFtcDsgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGVsZW1lbnQgYW5kIHJlcG9ydCB0aGUgbnVsbCB2YWx1ZS4gIEl0IGNhbm5vdCBoYXZlIHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGUgb3IgQGFub24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVHlwZSBvciAkYW5vbiI+Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFwcGVyQ2xhc3MiLz4uZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgPCEtLSBwb3B1bGF0ZSBhdHRyaWJ1dGVzIGhlcmUhISEuIFRoZSBhdHRyaWJ1dGVzIGFyZSBwYXJ0IG9mIGFuIGVsZW1lbnQsIG5vdCBwYXJ0IG9mIGEgdHlwZSAtLT4KLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbQGF0dHJpYnV0ZV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSIgc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWVVbmNhcHBlZCIgIHNlbGVjdD0iQHNob3J0dHlwZW5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG9ydFR5cGVOYW1lIgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDEsIDEgKSwnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICksIHN1YnN0cmluZygkc2hvcnRUeXBlTmFtZVVuY2FwcGVkLCAyLCBzdHJpbmctbGVuZ3RoKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQpKSkiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iamF2YU5hbWUiIHNlbGVjdD0iQGphdmFuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZXNwYWNlIiBzZWxlY3Q9IkBuc3VyaSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImF0dHJpYk5hbWUiPnRlbXBBdHRyaWI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHByb3BlcnR5TmFtZSAhPSAnZXh0cmFBdHRyaWJ1dGVzJyI+Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IgotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPiA9Ci0gICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXR0cmliTmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRyaWJOYW1lIi8+OwotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2phdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRyaWJOYW1lIi8+LmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID4wKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYk5hbWUiLz4uc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRyaWJOYW1lIi8+LG5hbWVzcGFjZXVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzaG9ydFR5cGVOYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF0dHJpYk5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlZEF0dHJpYnV0ZXMuYWRkKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIEhhbmRsZSBhbnlBdHRyaWJ1dGVzIGhlcmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHByb3BlcnR5TmFtZSA9ICdleHRyYUF0dHJpYnV0ZXMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBydW4gdGhyb3VnaCBhbGwgYW55IG9yIGV4dHJhIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdlcmUgbm90IHJlZmxlY3RlZCB1bnRpbCBub3cKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSAmbHQ7IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gYW55QXR0cmlidXRlIGFuZCB3ZSBjcmVhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW4gT01BdHRyaWJ1dGUgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01BdHRyaWJ1dGVJbXBsIGF0dHIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NQXR0cmlidXRlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uTmFtZXNwYWNlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaSksIHJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGV4dHJhIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZEV4dHJhQXR0cmlidXRlcyhhdHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IigkaXNUeXBlIG9yICRhbm9uKSBhbmQgbm90KCRzaW1wbGUpIj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBTa2lwIHRoZSBvdXRlciBzdGFydCBlbGVtZW50IGluIG9yZGVyIHRvIHByb2Nlc3MgdGhlIHN1YmVsZW1lbnRzLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIElmIHdlIGFyZSBub3QgYSB0eXBlIGFuZCBub3QgYW4gZWxlbWVudCB3aXRoIGFub255bW91cyB0eXBlLCB0aGVuIHdlIGFyZSBhbiBlbGVtZW50IHdpdGggb25lIHByb3BlcnR5IGZvciBvdXIgbmFtZWQgdHlwZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBPdXIgc2luZ2xlIG5hbWVkLXR5cGUgcHJvcGVydHkgYXBwbGllcyB0byBvdXIgZW50aXJlIG91dGVyIGVsZW1lbnQsIHNvIGRvbid0IHNraXAgaXQuIC0tPgotICAgICAgICAgICAgICAgIDwhLS0gRmlyc3QgbG9vcCBjcmVhdGVzIGFycmF5TGlzdHMgZm9yIGhhbmRsaW5nIGFycmF5cyAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbbm90KEBhdHRyaWJ1dGUpXSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgbGlzdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InByb3BlcnR5W25vdChAYXR0cmlidXRlKV0iPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHVub3JkZXJlZCI+ICAgPCEtLSBQcm9wZXJ0aWVzIGNhbiBiZSBpbiBhbnkgb3JkZXIgLS0+Ci0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgPHhzbDppZiB0ZXN0PSIkc2ltcGxlIj4gfHwgcmVhZGVyLmhhc1RleHQoKTwveHNsOmlmPil7Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm93IHJlbG9vcCBhbmQgcG9wdWxhdGUgdGhlIGNvZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbbm90KEBhdHRyaWJ1dGUpXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWVVbmNhcHBlZCIgIHNlbGVjdD0iQHNob3J0dHlwZW5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNob3J0VHlwZU5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0iY29uY2F0KHRyYW5zbGF0ZShzdWJzdHJpbmcoJHNob3J0VHlwZU5hbWVVbmNhcHBlZCwgMSwgMSApLCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKSwgc3Vic3RyaW5nKCRzaG9ydFR5cGVOYW1lVW5jYXBwZWQsIDIsIHN0cmluZy1sZW5ndGgoJHNob3J0VHlwZU5hbWVVbmNhcHBlZCkpKSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imxpc3ROYW1lIj5saXN0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imxvb3BCb29sTmFtZSI+bG9vcERvbmU8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3RhcnRRbmFtZSI+c3RhcnRRbmFtZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdGF0ZU1hY2hpbmVOYW1lIj5zdGF0ZU1hY2hpbmU8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYnVpbGRlck5hbWUiPmJ1aWxkZXI8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnJheUJhc2VUeXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lc3BhY2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1pbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcFFOYW1lIj5uZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpPC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHVub3JkZXJlZCI+ICA8IS0tIE9uZSBwcm9wZXJ0eSBwZXIgaXRlcmF0aW9uIGlmIHVub3JkZXJlZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElmIHNlcXVlbmNlLCBhZHZhbmNlIHRvIHN0YXJ0IG9mIG5leHQgcHJvcGVydHkgb3IgdG8gZW5kIG9mIG91dGVyIGVsZW1lbnQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICZhbXA7JmFtcDsgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KGVudW1GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNob3J0VHlwZU5hbWU9J09NRWxlbWVudCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSA8eHNsOmlmIHRlc3Q9IiRzaW1wbGUiPiB8fCByZWFkZXIuaGFzVGV4dCgpPC94c2w6aWY+IDx4c2w6aWYgdGVzdD0ibm90KCRzaW1wbGUpIj4mYW1wOyZhbXA7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcFFOYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKTwveHNsOmlmPil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIG11c3QgYmUgYSBuYW1lZCB0eXBlIG9yIGVsZW1lbnQgd2l0aCBhbm9ueW1vdXMgdHlwZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVsZW1lbnRzIHdpdGggYSBuYW1lZCB0eXBlIGhhdmUgYSBzaW5nbGUgc2ltcGxlIChub24tYXJyYXkpIHByb3BlcnR5IGZvciB0aGVpciB0eXBlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgYXJyYXkgYW5kIHN0ZXAgcGFzdCBpdHMgZmluYWwgZWxlbWVudCdzIGVuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZVByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnJheUJhc2VUeXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlVmFsdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgfHwgIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+SGVscGVyLnBhcnNlKHJlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvb3AgdW50aWwgd2UgZmluZCBhIHN0YXJ0IGVsZW1lbnQgdGhhdCBpcyBub3QgcGFydCBvZiB0aGlzIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBiZSBhdCB0aGUgZW5kIGVsZW1lbnQsIGJ1dCBtYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIG91dCBvZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIHRvIG5leHQgZWxlbWVudCBldmVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJmFtcDsmYW1wOyAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3R3byBjb250aW51b3VzIGVuZCBlbGVtZW50cyBtZWFucyB3ZSBhcmUgZXhpdGluZyB0aGUgeG1sIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcFFOYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+SGVscGVyLnBhcnNlKHJlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNvbnZlcnRlciB1dGlsaXR5ICB0byBjb252ZXJ0IGFuZCBzZXQgdGhlIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnRvQXJyYXkobmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPls8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIG9mIEFycmF5IGhhbmRsaW5nIG9mIEFEQiBjbGFzc2VzIC0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUxldCdzIGhhbmRsZSB4czphbnkgaGVyZS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+PWZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCl7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIHNvIHRoYXQgaXQgcHJvZHVjZXMgYSBmYWtlIFNUQVJUX0RPQ1VFTUVOVCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRidWlsZGVyTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcihyZWFkZXIpLCByZWFkZXIuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYnVpbGRlck5hbWUiLz4uZ2V0T01FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHR3byBjb3VudGludW9zIGVuZCBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCA9PSBldmVudCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0namF2YS5sYW5nLlN0cmluZyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi50b0FycmF5KG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz5bPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5zaXplKCldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz4uY2xhc3MsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIG9mIEFycmF5IGhhbmRsaW5nIG9mIEFEQiBjbGFzc2VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZGVmYXVsdCI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz49ZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPiA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UID09IGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1wOyZhbXA7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPi5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmLWJsb2NrIHRoYXQgaGFuZGxlcyBuaWxsYWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGFyc2UgaXQgYXMgYW4gb21FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdyYXAgdGhlIHJlYWRlciBzbyB0aGF0IGl0IHByb2R1Y2VzIGEgZmFrZSBTVEFSVF9ET0NVRU1FTlQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBidWlsZGVyIGNsYXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHJlYWRlciksPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+LmdldE9NRWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQgPT0gZXZlbnQgJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UID09IGV2ZW50KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnRvQXJyYXkobmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPls8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPi5jbGFzcyw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBoYW5kbGluZyBiaW5hcnkgY2FzZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgfHwgIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlYWRlck1UT01Bd2FyZShyZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19CSU5BUlkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTVRPTSBhd2FyZSByZWFkZXIgLSBnZXQgdGhlIGRhdGFoYW5kbGVyIGRpcmVjdGx5IGFuZCBwdXQgaXQgaW4gdGhlIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcikgcmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuREFUQV9IQU5ETEVSKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJmFtcDsmYW1wOyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BRTmFtZSIvPi5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UICZhbXA7JmFtcDsgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX05BTUVTUEFDRV9VUkksIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9JTkNMVURFKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgaWQgPSBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuRWxlbWVudEhlbHBlci5nZXRDb250ZW50SUQocmVhZGVyLCAiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKCgob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIpICgob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01TdEFYV3JhcHBlcikgcmVhZGVyKS5nZXRCdWlsZGVyKCkpLmdldERhdGFIYW5kbGVyKGlkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlYWRlci5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRG8gdGhlIHVzdWFsIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb29wIHVudGlsIHdlIGZpbmQgYSBzdGFydCBlbGVtZW50IHRoYXQgaXMgbm90IHBhcnQgb2YgdGhpcyBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgd2UgYXJlIGF0IHRoZSBFbmRFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIG91dCBvZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgdG8gbmV4dCBlbGVtZW50IGV2ZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJmFtcDsmYW1wOyAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3R3byBjb250aW51b3VzIGVuZCBlbGVtZW50cyBtZWFucyB3ZSBhcmUgZXhpdGluZyB0aGUgeG1sIHN0cnVjdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcFFOYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHNpbXBsZSkiPnJlYWRlci5uZXh0KCk7PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhZGVyTVRPTUF3YXJlKHJlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0JJTkFSWSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NVE9NIGF3YXJlIHJlYWRlciAtIGdldCB0aGUgZGF0YWhhbmRsZXIgZGlyZWN0bHkgYW5kIHB1dCBpdCBpbiB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKSByZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5EQVRBX0hBTkRMRVIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJmFtcDsmYW1wOyByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50cy5YT1BfTkFNRVNQQUNFX1VSSSwgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX0lOQ0xVREUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpZCA9IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5FbGVtZW50SGVscGVyLmdldENvbnRlbnRJRChyZWFkZXIsICJVVEYtOCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQoKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLk1UT01TdEFYU09BUE1vZGVsQnVpbGRlcikgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVN0QVhXcmFwcGVyKSByZWFkZXIpLmdldEJ1aWxkZXIoKSkuZ2V0RGF0YUhhbmRsZXIoaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYocmVhZGVyLmhhc1RleHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgdXN1YWwgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNvbnZlcnRlciB1dGlsaXR5ICB0byBjb252ZXJ0IGFuZCBzZXQgdGhlIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnRvQXJyYXkobmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPls8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VQcm9wZXJ0eVR5cGUiLz4uY2xhc3MsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZGVmYXVsdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+PWZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4gPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFtcDsmYW1wOyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBpZi1ibG9jayB0aGF0IGhhbmRsZXMgbmlsbGFibGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3cmFwIHRoZSByZWFkZXIgc28gdGhhdCBpdCBwcm9kdWNlcyBhIGZha2UgU1RBUlRfRE9DVUVNRU5UIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHJlYWRlciksIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+LmdldE9NRWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQgPT0gZXZlbnQgJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UID09IGV2ZW50KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYmFzZVByb3BlcnR5VHlwZT0namF2YS5sYW5nLlN0cmluZyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4udG9BcnJheShuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+Wzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uc2l6ZSgpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPi5jbGFzcyw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5kIG9mIEFycmF5IGhhbmRsaW5nIG9mIGRlZmF1bHQgY2xhc3MgLSB0aGF0IGlzIHRoZSBPTUVsZW1lbnQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJuaWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4uYWRkKHJlYWRlci5nZXRFbGVtZW50VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPn08L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb29wIHVudGlsIHdlIGZpbmQgYSBzdGFydCBlbGVtZW50IHRoYXQgaXMgbm90IHBhcnQgb2YgdGhpcyBhcnJheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCE8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgd2UgYXJlIGF0IHRoZSBFbmRFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgb3V0IG9mIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgdG8gbmV4dCBlbGVtZW50IGV2ZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmYW1wOyZhbXA7ICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHdvIGNvbnRpbnVvdXMgZW5kIGVsZW1lbnRzIG1lYW5zIHdlIGFyZSBleGl0aW5nIHRoZSB4bWwgc3RydWN0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb29wQm9vbE5hbWUiLz4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wUU5hbWUiLz4uZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsaXN0TmFtZSIvPi5hZGQocmVhZGVyLmdldEVsZW1lbnRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIGNvbnZlcnRlciB1dGlsaXR5ICB0byBjb252ZXJ0IGFuZCBzZXQgdGhlIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlUHJvcGVydHlUeXBlPSdqYXZhLmxhbmcuU3RyaW5nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnRvQXJyYXkobmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZVByb3BlcnR5VHlwZSIvPls8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxpc3ROYW1lIi8+LnNpemUoKV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlUHJvcGVydHlUeXBlIi8+LmNsYXNzLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGlzdE5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZVZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSB8fCAiMSIuZXF1YWxzKG5pbGxhYmxlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVHlwZSBvciAkYW5vbiI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz5IZWxwZXIucGFyc2UocmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1R5cGUgb3IgJGFub24iPiAgPCEtLSBUaGlzIGlzIGEgc3ViZWxlbWVudCBwcm9wZXJ0eSB0byBiZSBjb25zdW1lZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0YXJ0IG9mIGFueSBoYW5kbGluZy4gQW55IGNhbiBhbHNvIGJlIEBkZWZhdWx0IHNvIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBhbnkgY2FzZSBiZWZvcmUgZGVmYXVsdCEgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1ObyBjb25jZXJucyBvZiBiZWluZyBuaWxsYWJsZSBoZXJlLiBpZiBpdCdzIG91cnMgYW5kIGlmIHRoZSBuaWxsYWJsZSBhdHRyaWJ1dGUgd2FzIHByZXNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSB3b3VsZCBoYXZlIG91dHB1dHRlZCBhIG51bGwgYWxyZWFkeS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1UaGlzIGNhbiBiZSBhbnkgZWxlbWVudCBhbmQgd2UgbWF5IG5vdCBrbm93IHRoZSBuYW1lLiBzbyB3ZSBwaWNrIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGZyb20gdGhlIHBhcnNlci0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNlIHRoZSBRTmFtZSBmcm9tIHRoZSBwYXJzZXIgYXMgdGhlIG5hbWUgZm9yIHRoZSBidWlsZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4gPSByZWFkZXIuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3cmFwIHRoZSByZWFkZXIgc28gdGhhdCBpdCBwcm9kdWNlcyBhIGZha2UgU1RBUlRfRE9DVU1FTlQgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIG5lZWRlZCBieSB0aGUgYnVpbGRlciBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRidWlsZGVyTmFtZSIvPiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcihyZWFkZXIpLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RhcnRRbmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRidWlsZGVyTmFtZSIvPi5nZXRPTUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNUeXBlIG9yICRhbm9uIj4gIDwhLS0gVGhpcyBpcyBhIHN1YmVsZW1lbnQgcHJvcGVydHkgdG8gYmUgY29uc3VtZWQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZW5kIG9mIGFkYiB0eXBlIGhhbmRsaW5nIGNvZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc3RhcnQgb2YgT01lbGVtZW50IGhhbmRsaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBkZWZhdWx0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YXJ0UW5hbWUiLz4gPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbG9vcEJvb2xOYW1lIi8+KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICZhbXA7JmFtcDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxvb3BCb29sTmFtZSIvPiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdG9kbyAgcHV0IHRoZSBjb2RlIGhlcmUgZm9yIG5pbGxhYmxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIHNvIHRoYXQgaXQgcHJvZHVjZXMgYSBmYWtlIFNUQVJUX0RPQ1VFTUVOVCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBidWlsZGVyIGNsYXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHJlYWRlciksPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFydFFuYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJ1aWxkZXJOYW1lIi8+LmdldE9NRWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1R5cGUgb3IgJGFub24iPiAgPCEtLSBUaGlzIGlzIGEgc3ViZWxlbWVudCBwcm9wZXJ0eSB0byBiZSBjb25zdW1lZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBlbmQgb2YgT01lbGVtZW50IGhhbmRsaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0YXJ0IG9mIHRoZSBzaW1wbGUgdHlwZXMgaGFuZGxpbmcgZm9yIGJpbmFyeSBjb250ZW50LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRzaW1wbGUpIj5yZWFkZXIubmV4dCgpOzwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhZGVyTVRPTUF3YXJlKHJlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19CSU5BUlkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01UT00gYXdhcmUgcmVhZGVyIC0gZ2V0IHRoZSBkYXRhaGFuZGxlciBkaXJlY3RseSBhbmQgcHV0IGl0IGluIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKSByZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5EQVRBX0hBTkRMRVIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UICZhbXA7JmFtcDsgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX05BTUVTUEFDRV9VUkksIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9JTkNMVURFKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkID0gb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0Q29udGVudElEKHJlYWRlciwgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KCgob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIpICgob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01TdEFYV3JhcHBlcikgcmVhZGVyKS5nZXRCdWlsZGVyKCkpLmdldERhdGFIYW5kbGVyKGlkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKCRpc1R5cGUgb3IgJGFub24pIGFuZCBub3QoJHNpbXBsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlYWRlci5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgdXN1YWwgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlzVHlwZSBvciAkYW5vbikgYW5kIG5vdCgkc2ltcGxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzVHlwZSBvciAkYW5vbiI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzdGFydCBvZiB0aGUgc2ltcGxlIHR5cGVzIGhhbmRsaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlVmFsdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgJmFtcDsmYW1wOyAhIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoZW51bUZhY2V0KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPjApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUoY29udGVudCxuYW1lc3BhY2V1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J29yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWMgPSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IF92YWx1ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4gPSBmYWMuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIG9tTnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPi5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KF92YWx1ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4sIGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGphdmFOYW1lIi8+KF92YWx1ZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzaG9ydFR5cGVOYW1lIi8+KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoZW51bUZhY2V0KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4uZnJvbVN0cmluZyhjb250ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsgLy8gdGhyb3cgYXdheSB0ZXh0IG5vZGVzIGlmIGFueS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJGlzVHlwZSBvciAkYW5vbikgYW5kIG5vdCgkc2ltcGxlKSI+ICA8IS0tIFRoaXMgaXMgYSBzdWJlbGVtZW50IHByb3BlcnR5IHRvIGJlIGNvbnN1bWVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChlbnVtRmFjZXQpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG9yZGVyZWQgYW5kICRtaW4hPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG9yZGVyZWQiPiAgPCEtLSBwaWNrIHVwIHRyYWlsaW5nIGNydWZ0IGFmdGVyIGZpbmFsIHByb3BlcnR5IGJlZm9yZSBvdXRlciBlbmRFbGVtZW50IGFuZCB2ZXJpZnkgbm8gdHJhaWxpbmcgcHJvcGVydGllcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICZhbXA7JmFtcDsgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYSB0cmFpbGluZyBpbnZhbGlkIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icHJvcGVydHlbbm90KEBhdHRyaWJ1dGUpXSI+ICA8IS0tIHRoaXMgaWYgaXMgbmVlZGVkIHRvIHNraXAgYWxsIHRoaXMgd2hlbiB0aGVyZSBhcmUgbm8gcHJvcG9lcnRpZXMtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHVub3JkZXJlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KHByb3BlcnR5L2VudW1GYWNldCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgcmVhZGVyLm5leHQoKTsgIDwhLS0gQXQgbmVpdGhlciBhIHN0YXJ0IG5vciBhbiBlbmQgZWxlbWVudCwgc2tpcCBpdCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotCi0gICAgIHB1YmxpYyBzdGF0aWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZhLmxhbmcuT2JqZWN0IGJlYW5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGJlYW4gPQotICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pYmVhbk9iamVjdDsKLQotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZSBvciBAYW5vbiI+Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5W25vdChAYXR0cmlidXRlKV0iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idmFyTmFtZSI+YmVhbi5sb2NhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtaW4iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluT2NjdXJzIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZXNwYWNlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2V0dGluZ1RyYWNrZXIiPmJlYW4ubG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIi8+VHJhY2tlcjwveHNsOnZhcmlhYmxlPgotCi0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluPTAgb3IgJGNob2ljZSI+IGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNldHRpbmdUcmFja2VyIi8+KXs8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKEBvdXJzIG9yIEBkZWZhdWx0KSBhbmQgbm90KEBhcnJheSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFycmF5bGlzdCBjYW4gaGFuZGxlIG51bGwncyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsP251bGw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoQG91cnMgb3IgQGRlZmF1bHQpIGFuZCBAYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+IT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDtpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+Lmxlbmd0aDtpKyspewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtaW49MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsICEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZSBub24gQURCIGFycmF5cyAtIE5vdCBhbnkgaG93ZXZlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkgYW5kIG5vdChAYW55KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHByaW1pdGl2ZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPltpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbWluPTAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwcmltaXRpdmUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlIG5vbiBBREIgYXJyYXlzICAtIEFueSBjYXNlICAtIGFueSBtYXkgbm90IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmlsbGFibGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5IGFuZCBAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7aSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPi5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz5baV0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZXNwYWNlIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG1pbj0wIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gZG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZSBhbnkgLSBub24gYXJyYXkgY2FzZS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db25zdGFudHMuT01fRUxFTUVOVF9LRVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZSBiaW5hcnkgLSBTaW5jZSBpdCBpcyBhIERhdGFoYW5kbGVyLCB3ZSBjYW4ganVzdCBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBBREIgcHVsbHBhcnNlciB3b3VsZCBoYW5kbGUgaXQgcmlnaHQtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIHVzdWFsIGNhc2UhISEhLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHByaW1pdGl2ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcHJpbWl0aXZlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsP251bGw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWluPTAgb3IgJGNob2ljZSI+fTwveHNsOmlmPgotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5W0BhdHRyaWJ1dGVdIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZhck5hbWUiPmJlYW4ubG9jYWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWVzcGFjZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55IGFuZCBub3QoQGFycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db25zdGFudHMuT01fQVRUUklCVVRFX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkgYW5kIEBhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpICZsdDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4ubGVuZ3RoO2krKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db25zdGFudHMuT01fQVRUUklCVVRFX0tFWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lc3BhY2UiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgPCEtLSBlbmQgb2Ygd2hlbiBmb3IgdHlwZSAmIGFub24gLS0+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPCEtLSBOb3QgYSB0eXBlIGFuZCBub3QgYW5vbi4gU28gaXQgYmV0dGVyIGJlIG9ubHkgb25lIGluY2x1c2lvbi0tPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPCEtLSBpZiB0aGUgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlLCB0aGVuIGl0cyBnb25uYSBiZSBvbmx5IG9uZSAtLT4KLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJOYW1lIj5iZWFuLmxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InByb3BlcnR5L0BqYXZhbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmlsbGFibGUiIHNlbGVjdD0icHJvcGVydHkvQG5pbGxhYmxlIj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByaW1pdGl2ZSIgc2VsZWN0PSJwcm9wZXJ0eS9AcHJpbWl0aXZlIj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSIgc2VsZWN0PSJwcm9wZXJ0eS9AdHlwZSI+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIGJldHRlciBiZSBvbmx5IG9uZSEhLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwcm9wZXJ0eS9Ab3VycyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmlsbGFibGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5OdWxsWE1MU3RyZWFtUmVhZGVyKGJlYW4uTVlfUU5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+SGVscGVyLmdldFB1bGxQYXJzZXIoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR2YXJOYW1lIi8+LGJlYW4uTVlfUU5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5yZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz5IZWxwZXIuZ2V0UHVsbFBhcnNlcig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz4sYmVhbi5NWV9RTkFNRSk7PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmlsbGFibGUgYW5kIG5vdCgkcHJpbWl0aXZlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLk51bGxYTUxTdHJlYW1SZWFkZXIoYmVhbi5NWV9RTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwoYmVhbi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+IHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChiZWFuLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdmFyTmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOzwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgIH0KLQotfQotICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgIDwhLS0gZW5kIG9mIG1haW4gdGVtcGxhdGUgLS0+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1hcHBlciI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlbHBlck1vZGUiIHNlbGVjdD0iQGhlbHBlcm1vZGUiLz4KLQotICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3Qobm90KEB1bndyYXBwZWQpIG9yIChAc2tpcC13cml0ZSkpIj4KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotCi0gICAgICAgICAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgcHVibGljIDx4c2w6aWYgdGVzdD0ibm90KEB1bndyYXBwZWQpIG9yIChAc2tpcC13cml0ZSkiPnN0YXRpYzwveHNsOmlmPiBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz57Ci0KLSAgICAgICAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ2V0VHlwZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0KLSAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InR5cGUiPgotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz4iLmVxdWFscyhuYW1lc3BhY2VVUkkpICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0bmFtZSIvPiIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaGVscGVyTW9kZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2xhc3NuYW1lIi8+SGVscGVyLnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2xhc3NuYW1lIi8+LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGUgIiArIG5hbWVzcGFjZVVSSSArICIgIiArIHR5cGVOYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJEYXRhYmluZGluZ1RlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9BREJEYXRhYmluZGluZ1RlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhNTY4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQURCRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0gICAgPHhzbDprZXkgbmFtZT0icGFyYW1zSW4iIG1hdGNoPSIvL2RhdGFiaW5kZXJzL3BhcmFtW0BkaXJlY3Rpb249J2luJ10iIHVzZT0iQHR5cGUiLz4NCi0gICAgPHhzbDprZXkgbmFtZT0icGFyYW1zT3V0IiBtYXRjaD0iLy9kYXRhYmluZGVycy9wYXJhbVtAZGlyZWN0aW9uPSdvdXQnXSIgdXNlPSJAdHlwZSIvPg0KLSAgICA8eHNsOmtleSBuYW1lPSJpbm5lclBhcmFtcyIgbWF0Y2g9Ii8vZGF0YWJpbmRlcnMvcGFyYW1bQGRpcmVjdGlvbj0naW4nXS9wYXJhbSIgdXNlPSJAcGFydG5hbWUiLz4NCi0gICAgPHhzbDprZXkgbmFtZT0iaW5uZXJPdXRQYXJhbXMiIG1hdGNoPSIvL2RhdGFiaW5kZXJzL3BhcmFtW0BkaXJlY3Rpb249J291dCddL3BhcmFtIiB1c2U9IkBwYXJ0bmFtZSIvPg0KLSAgICA8eHNsOmtleSBuYW1lPSJvdXRPcGVyYXRpb25OYW1lIiBtYXRjaD0iLy9kYXRhYmluZGVycy9wYXJhbVtAZGlyZWN0aW9uPSdvdXQnXSIgdXNlPSJAb3BuYW1lIi8+DQotICAgIDx4c2w6a2V5IG5hbWU9ImluT3BlcmF0aW9uTmFtZSIgbWF0Y2g9Ii8vZGF0YWJpbmRlcnMvcGFyYW1bQGRpcmVjdGlvbj0naW4nXSIgdXNlPSJAb3BuYW1lIi8+DQotICAgIDwhLS08eHNsOmtleSBuYW1lPSJwYXJhbXNUeXBlIiBtYXRjaD0iLy9kYXRhYmluZGVycy9wYXJhbVtAZGlyZWN0aW9uPSdpbiddIiB1c2U9IkB0eXBlIi8+LS0+DQotDQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgQURCIHRlbXBsYXRlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YWJpbmRlcnNbQGRidHlwZT0nYWRiJ10iPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2ZXJzaWRlIiAgc2VsZWN0PSJAaXNzZXJ2ZXJzaWRlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVscGVybW9kZSIgIHNlbGVjdD0iZXh0cmEvQGgiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgPCEtLSAgZ2VuZXJhdGUgdG9PTSBmb3Igb25seSBub24gcGFydHMgYW5kIG5vbiBwcmltaXRpdmVzISEhIC0tPg0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW25vdChAdHlwZSA9IHByZWNlZGluZy1zaWJsaW5nOjpwYXJhbS9AdHlwZSkgYW5kIEB0eXBlIT0nJyBhbmQgbm90KEBwcmltaXRpdmUpXSI+DQotICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgIHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkNCi0gICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgew0KLQ0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRoZWxwZXJtb2RlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+SGVscGVyLmdldE9NRWxlbWVudCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5NWV9RTkFNRSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGUgPSAnb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQnIj4NCi0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07IA0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5nZXRPTUVsZW1lbnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Lk1ZX1FOQU1FLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIDwveHNsOmZvci1lYWNoPg0KLQ0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im9wbmFtZXMvbmFtZSI+DQotDQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5hbWUiIHNlbGVjdD0iLiIvPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3Buc3VyaSIgc2VsZWN0PSJAb3Buc3VyaSIvPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSkiLz4NCi0NCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkc2VydmVyc2lkZSkiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1jb3VudCAmZ3Q7IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50IiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50U2hvcnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0BzaG9ydHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQGNvbXBsZXh0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVkUGFyYW1ldGVyQ291bnQiIHNlbGVjdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0pIj48L3hzbDp2YXJpYWJsZT4tLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImdlbmVyYXRlLWlkKCRpbnB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdwYXJhbXNJbicsICRpbnB1dEVsZW1lbnRUeXBlKVsxXSkiPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGlmIHRoZSB1bndyYXBwaW5nIG1vZGUgaXMgb24gdGhlbiB3ZSBoYXZlIHRvIGdlbmVyYXRlIHRoZSB1bndyYXBwZWQgbWV0aG9kcyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lYXRlIHRoZSB0b0VudmVsb3BlIG1ldGhvZC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBwYXJhbTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiBkdW1teVdyYXBwZWRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gd3JhcHBlZFR5cGUgPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+KCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUpKSA+IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiLz4gd3JhcHBlZENvbXBsZXhUeXBlID0gbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29tcGxleFR5cGUuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPihwYXJhbTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZFR5cGUuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRTaG9ydFR5cGUiLz4od3JhcHBlZENvbXBsZXhUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkVHlwZS5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KHBhcmFtPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW1wdHlFbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaGVscGVybW9kZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPkhlbHBlci5nZXRPTUVsZW1lbnQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4uTVlfUU5BTUUsZmFjdG9yeSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHdyYXBwZWRUeXBlLmdldE9NRWxlbWVudCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4uTVlfUU5BTUUsZmFjdG9yeSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eUVudmVsb3BlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBc3N1bXB0aW9uIC0gdGhlIHBhcmFtZXRlciBpcyBhbHdheXMgYW4gQURCIGVsZW1lbnQtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRoZWxwZXJtb2RlIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbXB0eUVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPkhlbHBlci5nZXRPTUVsZW1lbnQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPi5NWV9RTkFNRSxmYWN0b3J5KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlFbnZlbG9wZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dEVsZW1lbnRUeXBlID0gJ29yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50JyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW1wdHlFbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5RW52ZWxvcGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVtcHR5RW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHBhcmFtLmdldE9NRWxlbWVudCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4uTVlfUU5BTUUsZmFjdG9yeSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eUVudmVsb3BlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0byBzdXBwb3J0IGZvciBiYWNrd29yZCBjb21wYXRpYmxpdHkgd2UgaGF2ZSB0byBhZGQgYW5kIHdyYXBwIG1ldGhvZC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWV0aG9kcyB0byBwcm92aWRlIGJhY2sgd29yZCBjb21wYXRpYmlsaXR5ICovDQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiLz4gZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gd3JhcHBlZFR5cGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFNob3J0VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BuYW1lIi8+KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPiBpbm5lclR5cGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkRWxlbWVudCA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkRWxlbWVudC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFNob3J0VHlwZSIvPihpbm5lclR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvIG5vdGhpbmcgaGVyZSAtLT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGFkZGl0aW9uYWwgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kIHRvIHJlbW92ZSB0b3AgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICAgICAgICAgIG9ubHkgdXNlZnVsbCB3aGVuIC1iIG9wdGlvbiBvbi0tPg0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KC4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXSk9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSB0aGUgZ2V0IG1ldGhvZHMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRFbGVtZW50IiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRFbGVtZW50VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RWxlbWVudFNob3J0VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHNob3J0dHlwZSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRFbGVtZW50Q29tcGxleFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0Bjb21wbGV4dHlwZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1FbGVtZW50IiBzZWxlY3Q9Ii4iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnROYW1lIiBzZWxlY3Q9IkBwYXJ0bmFtZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKGdlbmVyYXRlLWlkKCRwYXJhbUVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdpbm5lck91dFBhcmFtcycsICRwYXJ0TmFtZSlbMV0pKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlbmVyYXRlLWlkKCRvdXRwdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zT3V0JywgJG91dHB1dEVsZW1lbnRUeXBlKVsxXSkpIj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2UgcHV0IHRoZSBvdXQgZWxlbWVudCB0eXBlIHRvIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHRvIG1ha2UgaXQgdW5pcXVlIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50U2hvcnRUeXBlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4gd3JhcHBlZFR5cGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRFbGVtZW50Q29tcGxleFR5cGUpKSA+IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50U2hvcnRUeXBlIi8+KCkuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJnZW5lcmF0ZS1pZCgkb3V0cHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc091dCcsICRvdXRwdXRFbGVtZW50VHlwZSlbMV0pIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlLWlkKCRvdXRwdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgnb3V0T3BlcmF0aW9uTmFtZScsICRvcG5hbWUpWzFdKSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudENvbXBsZXhUeXBlIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BuYW1lIi8+KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkVHlwZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRUeXBlLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFNob3J0VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBpbiBjbGllbnQgc2lkZSB3ZSBkb25vdCBoYXZlIHRvIHdyYXAgdGhlIG91dCBwdXQgbWVzc2FnZXMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4gd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BuYW1lIi8+KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50Q29tcGxleFR5cGUiLz4gaW5uZXJUeXBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRUeXBlIi8+IHdyYXBwZWRFbGVtZW50ID0gbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkRWxlbWVudC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRTaG9ydFR5cGUiLz4oaW5uZXJUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICA8IS0tIHRoaXMgcGllY2Ugb2YgbG9naWMgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIG9ubHkgZm9yIHRoZSBzZXJ2ZXIgc2lkZS0tPg0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHNlcnZlcnNpZGUiPg0KLSAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdKT0xIj4NCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dEVsZW1lbnQiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dEVsZW1lbnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIEFzc3VtcHRpb24gLSBUaGUgQURCQmVhbiBoZXJlIGlzIGFsd2F5cyBhbiBlbGVtZW50IGJhc2VkIGJlYW4gLS0+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImdlbmVyYXRlLWlkKCRvdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zT3V0JywgJG91dEVsZW1lbnRUeXBlKVsxXSkiPg0KLSAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotICAgICAgICAgICAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW1wdHlFbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGhlbHBlcm1vZGUiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiLz5IZWxwZXIuZ2V0T01FbGVtZW50KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiLz4uTVlfUU5BTUUsZmFjdG9yeSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5RW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHBhcmFtLmdldE9NRWxlbWVudCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIi8+Lk1ZX1FOQU1FLGZhY3RvcnkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eUVudmVsb3BlOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0pPTEiPg0KLSAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSBnZXQgbWV0aG9kcyAtLT4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnQiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFNob3J0VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9Ac2hvcnR0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0iPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUVsZW1lbnQiIHNlbGVjdD0iLiI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnROYW1lIiBzZWxlY3Q9IkBwYXJ0bmFtZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IihnZW5lcmF0ZS1pZCgkcGFyYW1FbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgnaW5uZXJQYXJhbXMnLCAkcGFydE5hbWUpWzFdKSkgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAoZ2VuZXJhdGUtaWQoJGlucHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc0luJywgJGlucHV0RWxlbWVudFR5cGUpWzFdKSkiPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0B0eXBlIi8+IHdyYXBwZWRUeXBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUgIT0gJyciPi0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0RWxlbWVudENvbXBsZXhUeXBlKSkgPiAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFNob3J0VHlwZSIvPigpLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iZ2VuZXJhdGUtaWQoJGlucHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc0luJywgJGlucHV0RWxlbWVudFR5cGUpWzFdKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUtaWQoJGlucHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ2luT3BlcmF0aW9uTmFtZScsICRvcG5hbWUpWzFdKSI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudENvbXBsZXhUeXBlIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BuYW1lIi8+KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkVHlwZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFNob3J0VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGluIHNlcnZlciBzaWRlIHdlIGRvIG5vdCB3YW50IHRvIHdyYXAgaW5wdXQgZWxlbWVudHMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+IHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wbmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudENvbXBsZXhUeXBlIi8+IGlubmVyVHlwZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkRWxlbWVudCA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVsZW1lbnQuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRTaG9ydFR5cGUiLz4oaW5uZXJUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLS0+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPC94c2w6aWY+DQotDQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0pPTEiPg0KLSAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIGdldCBtZXRob2RzIC0tPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RWxlbWVudCIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dEVsZW1lbnRTaG9ydFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0BzaG9ydHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RWxlbWVudENvbXBsZXhUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0vcGFyYW0iPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUVsZW1lbnQiIHNlbGVjdD0iLiI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnROYW1lIiBzZWxlY3Q9IkBwYXJ0bmFtZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IihnZW5lcmF0ZS1pZCgkcGFyYW1FbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgnaW5uZXJPdXRQYXJhbXMnLCAkcGFydE5hbWUpWzFdKSkgb3INCi0gICAgICAgICAgICAgICAgICAgICAgICAoZ2VuZXJhdGUtaWQoJG91dHB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdwYXJhbXNPdXQnLCAkb3V0cHV0RWxlbWVudFR5cGUpWzFdKSkiPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2UgcHV0IHRoZSBvdXQgZWxlbWVudCB0eXBlIHRvIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHRvIG1ha2UgaXQgdW5pcXVlIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50VHlwZSIvPiB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50U2hvcnRUeXBlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gcGFyYW0pew0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4gd3JhcHBlZEVsZW1lbnQgPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPiBpbm5lclR5cGUgPSBuZXcgPHhzbDp2YWx1ZS1vZg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlLnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4ocGFyYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVsZW1lbnQuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50U2hvcnRUeXBlIi8+KGlubmVyVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVsZW1lbnQuc2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPihwYXJhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLQ0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iZ2VuZXJhdGUtaWQoJG91dHB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdwYXJhbXNPdXQnLCAkb3V0cHV0RWxlbWVudFR5cGUpWzFdKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUtaWQoJG91dHB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdvdXRPcGVyYXRpb25OYW1lJywgJG9wbmFtZSlbMV0pIj4NCi0NCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dEVsZW1lbnRDb21wbGV4VHlwZSkpID4gMCIgPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4gd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BuYW1lIi8+KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPiBpbm5lclR5cGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkRWxlbWVudCA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRUeXBlIi8+KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkRWxlbWVudC5zZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRTaG9ydFR5cGUiLz4oaW5uZXJUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4gd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BuYW1lIi8+KCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEVsZW1lbnRUeXBlIi8+IHdyYXBwZWRFbGVtZW50ID0gbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0RWxlbWVudFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkRWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgPC94c2w6aWY+DQotICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotDQotICAgICAgICAvKioNCi0gICAgICAgICogIGdldCB0aGUgZGVmYXVsdCBlbnZlbG9wZQ0KLSAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5KXsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOw0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgcHJpdmF0ZSAgamF2YS5sYW5nLk9iamVjdCBmcm9tT00oDQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSwNCi0gICAgICAgIGphdmEubGFuZy5DbGFzcyB0eXBlLA0KLSAgICAgICAgamF2YS51dGlsLk1hcCBleHRyYU5hbWVzcGFjZXMpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bbm90KEBwcmltaXRpdmUpIGFuZCBAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5jbGFzcy5lcXVhbHModHlwZSkpew0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaGVscGVybW9kZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPkhlbHBlci5wYXJzZShwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGUgPSAnb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQnIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5GYWN0b3J5LnBhcnNlKHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICB9DQotICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0NCi0NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZUhlYWRlci54c2wgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZUhlYWRlci54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTU1M2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3RlbXBsYXRlL0NBREJCZWFuVGVtcGxhdGVIZWFkZXIueHNsCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotCi0gICAgIDwhLS0gY2F0ZXIgZm9yIHRoZSBtdWx0aXBsZSBjbGFzc2VzIC0gd3JhcHBwZWQgbW9kZSAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvYmVhbnMiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImF4aXMyX25hbWUiPmFkYl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXBzX2F4aXMyX25hbWUiPkFEQl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNhcHMtbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAjaWZuZGVmIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2Fwc19heGlzMl9uYW1lIi8+X0gKLSAgICAgICAgI2RlZmluZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhcHNfYXhpczJfbmFtZSIvPl9ICi0KLSAgICAgICAgLyoqCi0gICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+LmgKLSAgICAgICAgKgotICAgICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gICAgICAgICogYnkgdGhlIEFwYWNoZSBBeGlzMi9KYXZhIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICAgICAgICAqLwotCi0gICAgICAgICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7YXhpb20uaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX3V0aWwuaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aW9tX3NvYXAuaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX2NsaWVudC5oJmd0OwotCi0gICAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwotICAgICAgICBleHRlcm4gIkMiCi0gICAgICAgIHsKLSAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgI2RlZmluZSBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCAxMDI0Ci0gICAgICAgICNkZWZpbmUgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCA2NAotICAgICAgICA8eHNsOmlmIHRlc3Q9Iml0ZW10eXBlIj4KLSAgICAgICAgI2RlZmluZSBBREJfREVGQVVMVF9MSVNUX1NFUEVSQVRPUiAiICIKLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPiB3cmFwcGVkIGNsYXNzIGNsYXNzZXMgKCBzdHJ1Y3R1cmUgZm9yIEMgKQotICAgICAgICAqLwotCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLQotCi0gICAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwotICAgICAgICB9Ci0gICAgICAgICNlbmRpZgotCi0gICAgICAgICNlbmRpZiAvKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhcHNfYXhpczJfbmFtZSIvPl9IICovCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8IS0tY2F0ZXIgZm9yIHRoZSBtdWx0aXBsZSBjbGFzc2VzIC0gdW53cmFwcHBlZCBtb2RlIC0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJheGlzMl9uYW1lIj5hZGJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2Fwc19heGlzMl9uYW1lIj5BREJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjYXBzLW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAjaWZuZGVmIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2Fwc19heGlzMl9uYW1lIi8+X0gKLSAgICAgICAgI2RlZmluZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhcHNfYXhpczJfbmFtZSIvPl9ICi0KLSAgICAgICAvKioKLSAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz4uaAotICAgICAgICAqCi0gICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAgICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyL0phdmEgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gICAgICAgICovCi0KLSAgICAgICAvKioKLSAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+IGNsYXNzCi0gICAgICAgICovCi0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz4KLSAgICAgICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4uaCIKLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDwhLS1pbmNsdWRlIHNwZWNpYWwgaGVhZGVycy0tPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbQHR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConXSI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgI2luY2x1ZGUgJmx0O2F4dXRpbF9kYXRlX3RpbWUuaCZndDsKLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eVtAdHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConXSI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgI2luY2x1ZGUgJmx0O2F4dXRpbF9iYXNlNjRfYmluYXJ5LmgmZ3Q7Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHlbQHR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiddIj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAjaW5jbHVkZSAmbHQ7YXh1dGlsX2R1cmF0aW9uLmgmZ3Q7Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7YXhpb20uaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX3V0aWwuaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aW9tX3NvYXAuaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4aXMyX2NsaWVudC5oJmd0OwotCi0gICAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwotICAgICAgICBleHRlcm4gIkMiCi0gICAgICAgIHsKLSAgICAgICAgI2VuZGlmCi0KLSAgICAgICAgI2RlZmluZSBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCAxMDI0Ci0gICAgICAgICNkZWZpbmUgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCA2NAotICAgICAgICA8eHNsOmlmIHRlc3Q9Iml0ZW10eXBlIj4KLSAgICAgICAgI2RlZmluZSBBREJfREVGQVVMVF9MSVNUX1NFUEVSQVRPUiAiICIKLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90OwotCi0gICAgICAgIDwhLS0gQ2hlY2sgaWYgdGhpcyB0eXBlIGlzIGEgc3VwcG9ydGVkIGVudW0gLS0+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNFbnVtIj4KLSAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChwcm9wZXJ0eSk9MSBhbmQgcHJvcGVydHkvZW51bUZhY2V0IGFuZCBwcm9wZXJ0eS9AdHlwZT0nYXhpczJfY2hhcl90KiciPjE8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+MDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzRW51bT0xIj4KLSAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW0iPmFkYl88eHNsOnZhbHVlLW9mIHNlbGVjdD0icHJvcGVydHkvQG5hbWUiLz5fZW51bV90PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eUNhcHNDTmFtZSIgc2VsZWN0PSJwcm9wZXJ0eS9AY2Fwcy1jbmFtZSIvPgotICAgICAgICAvKiBFbnVtZXJhdGlvbiBmb3IgdGhpcyB0eXBlICovCi0gICAgICAgIHR5cGVkZWYgZW51bSB7Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkvZW51bUZhY2V0Ij4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlDYXBzQ05hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9bGFzdCgpIj4sCi0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gfSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW0iLz47Ci0gICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENyZWF0ZSBhbmQgRnJlZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqLwotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCogQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fY3JlYXRlKAotICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYgKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogRnJlZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QgdG8gZnJlZQotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAqIEByZXR1cm4gQVhJUzJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlbHNlIEFYSVMyX0ZBSUxVUkUKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2ZyZWUgKAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLQotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdldHRlcnMgYW5kIFNldHRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocHJvcGVydHlbQGFycmF5XSkhPTAiPi8qKioqKioqKiBEZXByZWNhdGVkIGZvciBhcnJheSB0eXBlcywgVXNlICdHZXR0ZXJzIGFuZCBTZXR0ZXJzIGZvciBBcnJheXMnIGluc3RlYWQgKioqKioqKioqKiovPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iQGNob2ljZSI+LyoqKioqKioqIEluIGEgY2FzZSBvZiBhIGNob29zZSBhbW9uZyBlbGVtZW50cywgdGhlIGxhc3Qgb25lIHRvIHNldCB3aWxsIGJlIGNob29vc2VuICoqKioqKioqKi88L3hzbDppZj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJAbGlzdCI+LyoqKioqKiogVGhpcyBpcyBhIGxpc3QsIHBsZWFzZSB1c2UgR2V0dGVycyBhbmQgJ1NldHRlcnMgZm9yIEFycmF5JyBJbnN0ZWFkIG9mIGZvbGxvd2luZyAqKioqKi88L3hzbDppZj4KLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij5heHV0aWxfYXJyYXlfbGlzdF90KjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hdGl2ZVByb3BlcnR5VHlwZSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iUHJvcGVydHlUeXBlQXJyYXlQYXJhbSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGFycmF5bGlzdC0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0Pio8L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUNvbW1lbnQiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPjx4c2w6dGV4dD5BcnJheSBvZiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPjx4c2w6dGV4dD5zLjwveHNsOnRleHQ+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnN0VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J2F4aXMyX2NoYXJfdConIG9yIEB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCciPmNvbnN0IDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXR0ZXIgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LiA8eHNsOmlmIHRlc3Q9IkBpc2FycmF5Ij5EZXByZWNhdGVkIGZvciBhcnJheSB0eXBlcywgVXNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9nZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9hdCBpbnN0ZWFkPC94c2w6aWY+Ci0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtQ29tbWVudCIvPgotICAgICAgICAgKi8KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZ2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi48eHNsOmlmIHRlc3Q9IkBpc2FycmF5Ij5EZXByZWNhdGVkIGZvciBhcnJheSB0eXBlcywgVXNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9hdAotICAgICAgICAgKiBvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gaW5zdGVhZC48L3hzbDppZj4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW1Db21tZW50Ii8+Ci0gICAgICAgICAqIEByZXR1cm4gQVhJUzJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlbHNlIEFYSVMyX0ZBSUxVUkUKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uc3RWYWx1ZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PiBhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlc2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPgotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAqIEByZXR1cm4gQVhJUzJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlbHNlIEFYSVMyX0ZBSUxVUkUKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Jlc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICA8IS0tIFRoZSBmb2xsb3dpbmcgdGFrZSBjYXJlIG9mIGxpc3QgaXRlbXMgLS0+Ci0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Iml0ZW10eXBlIj4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj5heHV0aWxfYXJyYXlfbGlzdF90KjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hdGl2ZVByb3BlcnR5VHlwZSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iUHJvcGVydHlUeXBlQXJyYXlQYXJhbSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGFycmF5bGlzdC0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0Pio8L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUNvbW1lbnQiPjx4c2w6dGV4dD5BcnJheSBvZiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPjx4c2w6dGV4dD5zLjwveHNsOnRleHQ+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnN0VmFsdWUiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0nYXhpczJfY2hhcl90Kicgb3IgQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyI+Y29uc3QgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4gRGVwcmVjYXRlZCBmb3IgYXJyYXkgdHlwZXMsIFVzZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZ2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fYXQgaW5zdGVhZAotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJhbUNvbW1lbnQiLz4KLSAgICAgICAgICovCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHRlciBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uIERlcHJlY2F0ZWQgZm9yIGFycmF5IHR5cGVzLCBVc2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2F0Ci0gICAgICAgICAqIG9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiBpbnN0ZWFkLgotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAqIEBwYXJhbSBhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJhbUNvbW1lbnQiLz4KLSAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+IGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVzZXR0ZXIgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Ci0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVzZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChwcm9wZXJ0eVtAYXJyYXldKSE9MCBvciBjb3VudChpdGVtdHlwZSkhPTAiPgotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdldHRlcnMgYW5kIFNldHRlcnMgRm9yIEFycmF5cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKioqKioqKioqKioqIEFycmF5IFNwZWNpZmljIE9wZXJhdGlvbnM6IGdldF9hdCwgc2V0X2F0LCBhZGQsIHJlbW92ZV9hdCwgc2l6ZW9mICoqKioqKioqKioqKioqKioqLwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFLmcuIHVzZSBvZiBnZXRfYXQsIHNldF9hdCwgYWRkIGFuZCBzaXplb2YKLSAgICAgICAgICoKLSAgICAgICAgICogZm9yKGkgPSAwOyBpICZsdDsgYWRiX2VsZW1lbnRfc2l6ZW9mX3Byb3BlcnR5KGFkYl9vYmplY3QsIGVudik7IGkgKysgKQotICAgICAgICAgKiB7Ci0gICAgICAgICAqICAgICAvLyBHZXR0aW5nIGl0aCB2YWx1ZSB0byBwcm9wZXJ0eV9vYmplY3QgdmFyaWFibGUKLSAgICAgICAgICogICAgIHByb3BlcnR5X29iamVjdCA9IGFkYl9lbGVtZW50X2dldF9wcm9wZXJ0eV9hdChhZGJfb2JqZWN0LCBlbnYsIGkpOwotICAgICAgICAgKgotICAgICAgICAgKiAgICAgLy8gU2V0dGluZyBpdGggdmFsdWUgZnJvbSBwcm9wZXJ0eV9vYmplY3QgdmFyaWFibGUKLSAgICAgICAgICogICAgIGFkYl9lbGVtZW50X3NldF9wcm9wZXJ0eV9hdChhZGJfb2JqZWN0LCBlbnYsIGksIHByb3BlcnR5X29iamVjdCk7Ci0gICAgICAgICAqCi0gICAgICAgICAqICAgICAvLyBBcHBlbmRpbmcgdGhlIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGZyb20gcHJvcGVydHlfb2JqZWN0IHZhcmlhYmxlCi0gICAgICAgICAqICAgICBhZGJfZWxlbWVudF9hZGRfcHJvcGVydHkoYWRiX29iamVjdCwgZW52LCBwcm9wZXJ0eV9vYmplY3QpOwotICAgICAgICAgKgotICAgICAgICAgKiAgICAgLy8gUmVtb3ZpbmcgdGhlIGl0aCB2YWx1ZSBmcm9tIGFuIGFycmF5Ci0gICAgICAgICAqICAgICBhZGJfZWxlbWVudF9yZW1vdmVfcHJvcGVydHlfYXQoYWRiX29iamVjdCwgZW52LCBpKTsKLSAgICAgICAgICogICAgIAotICAgICAgICAgKiB9Ci0gICAgICAgICAqCi0gICAgICAgICAqLwotCi0gICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPmF4dXRpbF9hcnJheV9saXN0X3QqPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmF0aXZlUHJvcGVydHlUeXBlIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgYXJyYXlsaXN0LS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+KjwveHNsOnRleHQ+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtQ29tbWVudCI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+PHhzbDp0ZXh0PkFycmF5IG9mIDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIi8+PHhzbDp0ZXh0PnMuPC94c2w6dGV4dD48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29uc3RWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSdheGlzMl9jaGFyX3QqJyBvciBAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj5jb25zdCA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBpdGggZWxlbWVudCBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4KLSAgICAgICAgICogQHJldHVybiBpdGggPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4gb2YgdGhlIGFycmF5Ci0gICAgICAgICAqLwotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9nZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9hdCgKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGkpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIGl0aCBlbGVtZW50IG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LiAoSWYgdGhlIGl0aCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIHJlcGxhY2VkKQotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAqIEBwYXJhbSBpIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVybgotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PmFyZ188L3hzbDp0ZXh0PiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+IGVsZW1lbnQgdG8gc2V0IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+IHRvIHRoZSBhcnJheQotICAgICAgICAgKiBAcmV0dXJuIGl0aCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiBvZiB0aGUgYXJyYXkKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2F0KAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaSwKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnN0VmFsdWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gYXJnXzwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCB0byA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PmFyZ188L3hzbDp0ZXh0PiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+IGVsZW1lbnQgdG8gYWRkIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+IHRvIHRoZSBhcnJheQotICAgICAgICAgKiBAcmV0dXJuIEFYSVMyX1NVQ0NFU1Mgb24gc3VjY2VzcywgZWxzZSBBWElTMl9GQUlMVVJFCi0gICAgICAgICAqLwotICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnN0VmFsdWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gYXJnXzwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGFycmF5LgotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0LgotICAgICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBhcnJheS4KLSAgICAgICAgICovCi0gICAgICAgIGludCBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zaXplb2ZfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVtb3ZlIHRoZSBpdGggZWxlbWVudCBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgaXRlbSB0byByZW1vdmUKLSAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVtb3ZlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fYXQoCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpKTsKLQotICAgICAgICA8L3hzbDppZj4gPCEtLSB4c2w6aWYgdGVzdD0iQGlzYXJyYXkiIC0tPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4gPCEtLSB4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSIgLS0+Ci0KLSAgICAgICAgPCEtLSBUaGUgc2VjdGlvbiBjb3ZlcnMgdGhlIGxpc3QgdHlwZXMgLS0+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtdHlwZSI+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IlByb3BlcnR5VHlwZUFycmF5UGFyYW0iPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBhcnJheWxpc3QtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4qPC94c2w6dGV4dD48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1Db21tZW50Ij48eHNsOnRleHQ+QXJyYXkgb2YgPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz48eHNsOnRleHQ+cy48L3hzbDp0ZXh0PjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25zdFZhbHVlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J2F4aXMyX2NoYXJfdConIG9yIEB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCciPmNvbnN0IDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgaXRoIGVsZW1lbnQgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuCi0gICAgICAgICAqIEByZXR1cm4gaXRoIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+IG9mIHRoZSBhcnJheQotICAgICAgICAgKi8KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4gQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZ2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fYXQoCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBpdGggZWxlbWVudCBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4gKElmIHRoZSBpdGggYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSByZXBsYWNlZCkKLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD5hcmdfPC94c2w6dGV4dD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiBlbGVtZW50IHRvIHNldCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiB0byB0aGUgYXJyYXkKLSAgICAgICAgICogQHJldHVybiBpdGggPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4gb2YgdGhlIGFycmF5Ci0gICAgICAgICAqLwotICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9hdCgKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGksCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25zdFZhbHVlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IGFyZ188L3hzbDp0ZXh0PiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KTsKLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgdG8gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD5hcmdfPC94c2w6dGV4dD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiBlbGVtZW50IHRvIGFkZCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiB0byB0aGUgYXJyYXkKLSAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25zdFZhbHVlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IGFyZ188L3hzbDp0ZXh0PiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBhcnJheS4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdC4KLSAgICAgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gYXJyYXkuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2l6ZW9mXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZSB0aGUgaXRoIGVsZW1lbnQgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmVtb3ZlCi0gICAgICAgICAqIEByZXR1cm4gQVhJUzJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlbHNlIEFYSVMyX0ZBSUxVUkUKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3JlbW92ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2F0KAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaSk7Ci0KLSAgIAotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc0VudW09MSI+Ci0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW0iPmFkYl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZW51bV90PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnN0VmFsdWUiPgotICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSdheGlzMl9jaGFyX3QqJyBvciBAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj5jb25zdCA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEdldHRlcnMgYW5kIFNldHRlcnMgRm9yIEVudW1lcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKiogRW51bWVyYXRpb24gU3BlY2lmaWMgT3BlcmF0aW9uczogZ2V0X2VudW0sIHNldF9lbnVtICoqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBFbnVtIGdldHRlciBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uCi0gICAgICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW0iLz47IC0xIG9uIGZhaWx1cmUKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW0iLz4gQVhJUzJfQ0FMTAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2VudW0oCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIEVudW0gc2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgICAgKiBAcGFyYW0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZW51bSIvPgotICAgICAgICAgICAgKiBAcmV0dXJuIEFYSVMyX1NVQ0NFU1Mgb24gc3VjY2VzcywgZWxzZSBBWElTMl9GQUlMVVJFCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2VudW0oCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25zdFZhbHVlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PmFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KTsKLSAgICAgICAgICAgIAotICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENoZWNraW5nIGFuZCBTZXR0aW5nIE5JTCB2YWx1ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHByb3BlcnR5W0BhcnJheV0pIT0wIj4vKiBVc2UgJ0NoZWNraW5nIGFuZCBTZXR0aW5nIE5JTCB2YWx1ZXMgZm9yIEFycmF5cycgdG8gY2hlY2sgYW5kIHNldCBuaWwgZm9yIGluZGl2aWR1YWwgZWxlbWVudHMgKi88L3hzbDppZj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogTk9URTogc2V0X25pbCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgbmlsbGFibGUgcHJvcGVydGllcwotICAgICAgICAgKi8KLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij5heHV0aWxfYXJyYXlfbGlzdF90KjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hdGl2ZVByb3BlcnR5VHlwZSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iUHJvcGVydHlUeXBlQXJyYXlQYXJhbSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGFycmF5bGlzdC0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0Pio8L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUNvbW1lbnQiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPjx4c2w6dGV4dD5BcnJheSBvZiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPjx4c2w6dGV4dD5zLjwveHNsOnRleHQ+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIHdoZXRoZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gaXMgbmlsbAotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAqIEByZXR1cm4gQVhJUzJfVFJVRSBpZiB0aGUgZWxlbWVudCBpcyBuaWwgb3IgQVhJUzJfRkFMU0Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBheGlzMl9ib29sX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5faXNfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9uaWwoCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGUgb3IgQG9wdGlvbmFsIj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiB0byBuaWxsIChjdXJyZW50bHkgdGhlIHNhbWUgYXMgcmVzZXQpCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fbmlsKAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+IDwhLS0gZm9yLWVhY2ggc2VsZWN0PSJwcm9wcmV0eSIgLS0+Ci0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChwcm9wZXJ0eVtAYXJyYXldKSE9MCI+Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2hlY2tpbmcgYW5kIFNldHRpbmcgJ05JTCcgdmFsdWVzIGluIEFycmF5cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAvKioKLSAgICAgICAgICogTk9URTogWW91IG1heSBzZXQgdGhpcyB0byByZW1vdmUgc3BlY2lmaWMgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gICAgICAgICAqICAgICAgIEJ1dCB5b3UgY2FuIG5vdCByZW1vdmUgZWxlbWVudHMsIGlmIHRoZSBzcGVjaWZpYyBwcm9wZXJ0eSBpcyBkZWNsYXJlZCB0byBiZSBub24tbmlsbGFibGUgb3Igc2l6ZW9mKGFycmF5KSAmbHQ7IG1pbk9jY3VycwotICAgICAgICAgKi8KLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IlByb3BlcnR5VHlwZUFycmF5UGFyYW0iPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBhcnJheWxpc3QtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4qPC94c2w6dGV4dD48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1Db21tZW50Ij4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij48eHNsOnRleHQ+QXJyYXkgb2YgPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz48eHNsOnRleHQ+cy48L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIHdoZXRoZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gaXMgbmlsbCBhdCBpCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QuCi0gICAgICAgICAqIEBwYXJhbSBpIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVybi4KLSAgICAgICAgICogQHJldHVybiBBWElTMl9UUlVFIGlmIHRoZSBlbGVtZW50IGlzIG5pbCBvciBBWElTMl9GQUxTRSBvdGhlcndpc2UKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX2Jvb2xfdCBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9pc188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X25pbF9hdCgKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGkpOwotIAotICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IHRvIG5pbGwgYXQgaQotICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gXzx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdC4KLSAgICAgICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIGl0ZW0gdG8gc2V0LgotICAgICAgICAgKiBAcmV0dXJuIEFYSVMyX1NVQ0NFU1Mgb24gc3VjY2Vzcywgb3IgQVhJUzJfRkFJTFVSRSBvdGhlcndpc2UuCi0gICAgICAgICAqLwotICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9uaWxfYXQoCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIAotICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaSk7Ci0KLSAgICAgICAgPC94c2w6aWY+IDwhLS0gY2xvc2VzIGlzYXJyYXkgLS0+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNlcmlhbGl6ZSBhbmQgRGVzZXJpYWxpemUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyoqKioqKioqKioqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIHVzZSBvbmx5IGluc2lkZSB0aGUgZ2VuZXJhdGVkIGNvZGUgKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iQHNpbXBsZSI+Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlc2VyaWFsaXplIHRoZSBjb250ZW50IGZyb20gYSBzdHJpbmcgdG8gYWRiIG9iamVjdHMKLSAgICAgICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAgICAgKiBAcGFyYW0gZW52IHBvaW50ZXIgdG8gZW52aXJvbm1lbnQgc3RydWN0Ci0gICAgICAgICAgICAgKiBAcGFyYW0gbm9kZV92YWx1ZSB0byBkZXNlcmlhbGl6ZQotICAgICAgICAgICAgICogQHBhcmFtIHBhcmVudF9lbGVtZW50IFRoZSBwYXJlbnQgZWxlbWVudCBpZiBpdCBpcyBhbiBlbGVtZW50LCBOVUxMIG90aGVyd2lzZQotICAgICAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZGVzZXJpYWxpemVfZnJvbV9zdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKm5vZGVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqcGFyZW50KTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBEZXNlcmlhbGl6ZSBhbiBYTUwgdG8gYWRiIG9iamVjdHMKLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gZHBfcGFyZW50IGRvdWJsZSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbm9kZSB0byBkZXNlcmlhbGl6ZQotICAgICAgICAgKiBAcGFyYW0gZHBfaXNfZWFybHlfbm9kZV92YWxpZCBkb3VibGUgcG9pbnRlciB0byBhIGZsYWcgKGlzX2Vhcmx5X25vZGVfdmFsaWQ/KQotICAgICAgICAgKiBAcGFyYW0gZG9udF9jYXJlX21pbm9jY3VycyBEb250IHNldCBlcnJvcnMgb24gdmFsaWRhdGluZyBtaW5vY2N1cnMsIAotICAgICAgICAgKiAgICAgICAgICAgICAgKFBhcmVudCB3aWxsIG9yZGVyIHRoaXMgaW4gYSBjYXNlIG9mIGNob2ljZSkKLSAgICAgICAgICogQHJldHVybiBBWElTMl9TVUNDRVNTIG9uIHN1Y2Nlc3MsIGVsc2UgQVhJUzJfRkFJTFVSRQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZGVzZXJpYWxpemUoCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgYXhpb21fbm9kZV90KiogZHBfcGFyZW50LAotICAgICAgICAgICAgYXhpczJfYm9vbF90ICpkcF9pc19lYXJseV9ub2RlX3ZhbGlkLAotICAgICAgICAgICAgYXhpczJfYm9vbF90IGRvbnRfY2FyZV9taW5vY2N1cnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBIZXJlIHRoZSBkb3VibGUgcG9pbnRlciBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgcGFyZW50IHBvaW50ZXIgLSBUaGlzIGNhbiBiZSBoYXBwbmVkIHdoZW4gZGVzZXJpYWxpemUgaXMgY2FsbGVkIGluIGEgcGFydGljbGUgY2xhc3MgLS0+Ci0KLSAgICAgICAvKioKLSAgICAgICAgICogRGVjbGFyZSBuYW1lc3BhY2UgaW4gdGhlIG1vc3QgcGFyZW50IG5vZGUgCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHBhcmFtIHBhcmVudF9lbGVtZW50IHBhcmVudCBlbGVtZW50Ci0gICAgICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzIGhhc2ggb2YgbmFtZXNwYWNlIHVyaSB0byBwcmVmaXgKLSAgICAgICAgICogQHBhcmFtIG5leHRfbnNfaW5kZXggcG9pbnRlciB0byBhbiBpbnQgd2hpY2ggY29udGFpbiB0aGUgbmV4dCBuYW1lc3BhY2UgaW5kZXgKLSAgICAgICAgICovCi0gICAgICAgdm9pZCBBWElTMl9DQUxMCi0gICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2RlY2xhcmVfcGFyZW50X25hbWVzcGFjZXMoCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgYXhpb21fZWxlbWVudF90ICpwYXJlbnRfZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfdCAqbmFtZXNwYWNlcywgaW50ICpuZXh0X25zX2luZGV4KTsKLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IkBzaW1wbGUiPgotICAgICAgICAvKioKLSAgICAgICAgICogU2VyaWFsaXplIHRvIGEgU3RyaW5nIGZyb20gdGhlIGFkYiBvYmplY3RzCi0gICAgICAgICAqIEBwYXJhbSA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICogQHBhcmFtIG5hbWVzcGFjZXMgaGFzaCBvZiBuYW1lc3BhY2UgdXJpIHRvIHByZWZpeAotICAgICAgICAgKiBAcmV0dXJuIHNlcmlhbGl6ZWQgc3RyaW5nCi0gICAgICAgICAqLwotICAgICAgICAgICAgYXhpczJfY2hhcl90KiBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2VyaWFsaXplX3RvX3N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheHV0aWxfaGFzaF90ICpuYW1lc3BhY2VzKTsKLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlcmlhbGl6ZSB0byBhbiBYTUwgZnJvbSB0aGUgYWRiIG9iamVjdHMKLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+X29tX25vZGUgbm9kZSB0byBzZXJpYWxpemUgZnJvbQotICAgICAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+X29tX2VsZW1lbnQgcGFyZW50IGVsZW1lbnQgdG8gc2VyaWFsaXplIGZyb20KLSAgICAgICAgICogQHBhcmFtIHRhZ19jbG9zZWQgd2hldGhlciB0aGUgcGFyZW50IHRhZyBpcyBjbG9zZWQgb3Igbm90Ci0gICAgICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzIGhhc2ggb2YgbmFtZXNwYWNlIHVyaSB0byBwcmVmaXgKLSAgICAgICAgICogQHBhcmFtIG5leHRfbnNfaW5kZXggYW4gaW50IHdoaWNoIGNvbnRhaW4gdGhlIG5leHQgbmFtZXNwYWNlIGluZGV4Ci0gICAgICAgICAqIEByZXR1cm4gQVhJUzJfU1VDQ0VTUyBvbiBzdWNjZXNzLCBlbHNlIEFYSVMyX0ZBSUxVUkUKLSAgICAgICAgICovCi0gICAgICAgIGF4aW9tX25vZGVfdCogQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2VyaWFsaXplKAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwKLSAgICAgICAgICAgIGF4aW9tX25vZGVfdCogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+X29tX25vZGUsIGF4aW9tX2VsZW1lbnRfdCAqPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+X29tX2VsZW1lbnQsIGludCB0YWdfY2xvc2VkLCBheHV0aWxfaGFzaF90ICpuYW1lc3BhY2VzLCBpbnQgKm5leHRfbnNfaW5kZXgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz4gaXMgYSBwYXJ0aWNsZSBjbGFzcyAoRS5nLiBncm91cCwgaW5uZXIgc2VxdWVuY2UpCi0gICAgICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgcGFydGljbGUgY2xhc3MuCi0gICAgICAgICAqLwotICAgICAgICBheGlzMl9ib29sX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5faXNfcGFydGljbGUoKTsKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBBbHRlcm5hdGl2ZXMgZm9yIENyZWF0ZSBhbmQgRnJlZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYXJnX2xpc3QiPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiwKLSAgICAgICAgICAgICAgICA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhcmdfbGlzdF9jb21tZW50Ij4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPmF4dXRpbF9hcnJheV9saXN0X3QqPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4KLSAgICAgICAgICogQHBhcmFtIDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiAKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Ci0gICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3Q8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFyZ19saXN0X2NvbW1lbnQiLz4KLSAgICAgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdAotICAgICAgICAgKi8KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqIEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2NyZWF0ZV93aXRoX3ZhbHVlcygKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhcmdfbGlzdCIvPik7Ci0KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQocHJvcGVydHkpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpcnN0UHJvcGVydHkiIHNlbGVjdD0icHJvcGVydHlbMV0iLz4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmlyc3RQcm9wZXJ0eS9AaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KCRmaXJzdFByb3BlcnR5L0B0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFByb3BlcnR5L0B0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFByb3BlcnR5L0BjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIEZyZWUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Qgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlLgotICAgICAgICAgICAgICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgdG8gZnJlZSB0aGUgYWRiIG9iamVjdCBhcyByZXR1cm5pbmcgdGhlIHByb3BlcnR5IHZhbHVlLiBJZiB0aGVyZSBhcmUKLSAgICAgICAgICAgICAgICAgKiBtYW55IHByb3BlcnRpZXMsIGl0IHdpbGwgb25seSByZXR1cm4gdGhlIGZpcnN0IHByb3BlcnR5LiBPdGhlciBwcm9wZXJ0aWVzIHdpbGwgZ2V0IGZyZWVkIHdpdGggdGhlIGFkYiBvYmplY3QuCi0gICAgICAgICAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QgdG8gZnJlZQotICAgICAgICAgICAgICAgICAqIEBwYXJhbSBlbnYgcG9pbnRlciB0byBlbnZpcm9ubWVudCBzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBob2xkZWQgYnkgdGhlIEFEQiBvYmplY3QsIGlmIHRoZXJlIGFyZSBtYW55IHByb3BlcnRpZXMgb25seSByZXR1cm5zIHRoZSBmaXJzdC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBBWElTMl9DQUxMCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2ZyZWVfcG9wcGluZ192YWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogRnJlZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUuCi0gICAgICAgICAgICAgICAgICogWW91IGNhbiB1c2UgdGhpcyB0byBmcmVlIHRoZSBhZGIgb2JqZWN0IGFzIHJldHVybmluZyB0aGUgcHJvcGVydHkgdmFsdWUuIElmIHRoZXJlIGFyZQotICAgICAgICAgICAgICAgICAqIG1hbnkgcHJvcGVydGllcywgaXQgd2lsbCBvbmx5IHJldHVybiB0aGUgZmlyc3QgcHJvcGVydHkuIE90aGVyIHByb3BlcnRpZXMgd2lsbCBnZXQgZnJlZWQgd2l0aCB0aGUgYWRiIG9iamVjdC4KLSAgICAgICAgICAgICAgICAgKiBAcGFyYW0gPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90IG9iamVjdCB0byBmcmVlCi0gICAgICAgICAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGhvbGRlZCBieSB0aGUgQURCIG9iamVjdCwgaWYgdGhlcmUgYXJlIG1hbnkgcHJvcGVydGllcyBvbmx5IHJldHVybnMgdGhlIGZpcnN0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHZvaWQqIEFYSVMyX0NBTEwKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZnJlZV9wb3BwaW5nX3ZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudik7Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBnZXQgdGhlIHZhbHVlIGJ5IHRoZSBwcm9wZXJ0eSBudW1iZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyoqKioqKioqKioqKk5PVEU6IFRoaXMgbWV0aG9kIGlzIGludHJvZHVjZWQgdG8gcmVzb2x2ZSBhIHByb2JsZW0gaW4gdW53cmFwcGluZyBtb2RlICoqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgYXJyYXlsaXN0LS0+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+KjwveHNsOnRleHQ+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtQ29tbWVudCI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+PHhzbDp0ZXh0PkFycmF5IG9mIDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIi8+PHhzbDp0ZXh0PnMuPC94c2w6dGV4dD48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHRlciBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gYnkgcHJvcGVydHkgbnVtYmVyICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPikKLSAgICAgICAgICogQHBhcmFtIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+IDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCBvYmplY3QKLSAgICAgICAgICogQHBhcmFtIGVudiBwb2ludGVyIHRvIGVudmlyb25tZW50IHN0cnVjdAotICAgICAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW1Db21tZW50Ii8+Ci0gICAgICAgICAqLwotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9nZXRfcHJvcGVydHk8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPigKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgI2lmZGVmIF9fY3BsdXNwbHVzCi0gICAgIH0KLSAgICAgI2VuZGlmCi0KLSAgICAgI2VuZGlmIC8qIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2Fwc19heGlzMl9uYW1lIi8+X0ggKi8KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZVNvdXJjZS54c2wgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvQ0FEQkJlYW5UZW1wbGF0ZVNvdXJjZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGRlODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3RlbXBsYXRlL0NBREJCZWFuVGVtcGxhdGVTb3VyY2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTg5NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotICAgICA8IS0tIGNhdGVyIGZvciB0aGUgbXVsdGlwbGUgY2xhc3NlcyAtIHdyYXBwcGVkIG1vZGUgLSBjdXJyZW50bHkgbm90IHdlbGwgc3VwcG9ydGVkLi0tPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9iZWFucyI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYXhpczJfbmFtZSI+YWRiXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAvKioKLSAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+LmMKLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAgICAgICAgICogYnkgdGhlIEFwYWNoZSBBeGlzMi9KYXZhIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICAgICAgICAgKi8KLSAgICAgICAgIAotICAgICAgICAjaW5jbHVkZSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+LmgiCi0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIDwhLS1jYXRlciBmb3IgdGhlIG11bHRpcGxlIGNsYXNzZXMgLSB1bndyYXBwcGVkIG1vZGUgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNsYXNzIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ianVzdF9uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJheGlzMl9uYW1lIj5hZGJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXN0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9yaWdpbmFsTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvcmlnaW5hbE5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuc3VyaSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5zcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zcHJlZml4Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYW5vbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbm9uIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3JkZXJlZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvcmRlcmVkIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFydGljbGVDbGFzcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0aWNsZUNsYXNzIi8+PC94c2w6dmFyaWFibGU+IDwhLS0gcGFydGljbGUgY2xhc3NlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2NoZW1hIGdyb3VwcyAtLT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoYXNQYXJ0aWNsZVR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaGFzUGFydGljbGVUeXBlIi8+PC94c2w6dmFyaWFibGU+IDwhLS0gcGFydGljbGUgY2xhc3NlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2NoZW1hIGdyb3VwcyAtLT4KLSAgICAgICAKLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaW1wbGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2ltcGxlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2hvaWNlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNob2ljZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2sgaWYgdGhpcyB0eXBlIGlzIGEgc3VwcG9ydGVkIGVudW0gLS0+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNFbnVtIj4KLSAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChwcm9wZXJ0eSk9MSBhbmQgcHJvcGVydHkvZW51bUZhY2V0IGFuZCBwcm9wZXJ0eS9AdHlwZT0nYXhpczJfY2hhcl90KiciPjE8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+MDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz4uYwotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICAgICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyL0MgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogTWFyIDEwLCAyMDA4ICgwODozNTo1MiBHTVQrMDA6MDApCi0gICAgICAgICAqLwotCi0gICAgICAgICNpbmNsdWRlICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz4uaCIKLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICAgKiBuYW1lID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4KLSAgICAgICAgICAgICAgICAgKiBOYW1lc3BhY2UgVVJJID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPgotICAgICAgICAgICAgICAgICAqIE5hbWVzcGFjZSBQcmVmaXggPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zcHJlZml4Ii8+Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqIGltcGxtZW50YXRpb24gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+PHhzbDppZiB0ZXN0PSIkbnN1cmkiPnw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+PC94c2w6aWY+IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLQotCi0gICAgICAgIHN0cnVjdCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz4KLSAgICAgICAgewotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJGlzdHlwZSkiPgotICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV90KiBxbmFtZTsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLQotICAgICAgICAgICAgICAgIDwhLS0gRm9yIGFycmF5cyBpc192YWxpZF8qIHRyYWNrcyBmb3Igd2hldGhlciBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgYXJyYXkgaXMgbm9uLU5VTEwgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PmF4aXMyX2Jvb2xfdCBpc192YWxpZF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz47Ci0KLQotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDwhLS0gVGhlIHNlY3Rpb24gY292ZXJzIHRoZSBzdG9yYWdlIGZvciBsaXN0IHR5cGVzLCAtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtdHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPmF4dXRpbF9hcnJheV9saXN0X3QqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkanVzdF9uYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RfbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+YXhpczJfYm9vbF90IGlzX3ZhbGlkXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLQotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKmN1cnJlbnRfY2hvaWNlOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIH07Ci0KLQotICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIFByaXZhdGUgRnVuY3Rpb24gcHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IlByb3BlcnR5VHlwZUFycmF5UGFyYW0iPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBhcnJheWxpc3QtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4qPC94c2w6dGV4dD48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1Db21tZW50Ij4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij48eHNsOnRleHQ+QXJyYXkgb2YgPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz48eHNsOnRleHQ+cy48L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUgb3IgQG9wdGlvbmFsKSI+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X25pbF9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpKTsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fbmlsKAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9uIEltcGxtZW50YXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCogQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fY3JlYXRlKAotICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90ICo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJGlzdHlwZSkiPgotICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV90KiBxbmFtZSA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIE5VTEwpOwotCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QgKikgQVhJUzJfTUFMTE9DKGVudi0+Ci0gICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBzaXplb2YoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QpKTsKLQotICAgICAgICAgICAgaWYoTlVMTCA9PSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX05PX01FTU9SWSwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbXNldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIDAsIHNpemVvZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCkpOwotCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIG9yIEB0eXBlPSdheGlzMl9jaGFyX3QqJyBvciBAdHlwZT0nYXh1dGlsX3FuYW1lX3QqJyBvciBAdHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyBvciBAdHlwZT0nYXh1dGlsX3VyaV90Kicgb3IgQHR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIG9yIEB0eXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICA8IS0tIHRvZG8gZm9yIG90aGVycyAtLT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRpc3R5cGUpIj4KLSAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuc3VyaSBhbmQgJG5zdXJpICE9ICcnIj4KLSAgICAgICAgICAgICAgICAgIHFuYW1lID0gIGF4dXRpbF9xbmFtZV9jcmVhdGUgKGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9yaWdpbmFsTmFtZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgcW5hbWUgPSAgYXh1dGlsX3FuYW1lX2NyZWF0ZSAoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnFuYW1lID0gcW5hbWU7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmN1cnJlbnRfY2hvaWNlID0gIiI7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjsKLSAgICAgICAgfQotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYXJnX2xpc3QiPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiwKLSAgICAgICAgICAgICAgICA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8IS0tIHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyB3YXMgYWRkZWQgaW4gc3VwcG9ydCBvZiB0aGUgdW53cmFwcGVkIG1vZGUgLS0+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90KiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9jcmVhdGVfd2l0aF92YWx1ZXMoCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXJnX2xpc3QiLz4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90KiBhZGJfb2JqID0gTlVMTDsKLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190IHN0YXR1cyA9IEFYSVMyX1NVQ0NFU1M7Ci0KLSAgICAgICAgICAgIGFkYl9vYmogPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fY3JlYXRlKGVudik7Ci0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYl9vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotICAgICAgICAgICAgICBpZihzdGF0dXMgPT0gQVhJUzJfRkFJTFVSRSkgewotICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2ZyZWUgKGFkYl9vYmosIGVudik7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgcmV0dXJuIGFkYl9vYmo7Ci0gICAgICAgIH0KLSAgICAgIAotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudChwcm9wZXJ0eSkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RQcm9wZXJ0eSIgc2VsZWN0PSJwcm9wZXJ0eVsxXSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmaXJzdFByb3BlcnR5L0Bpc2FycmF5Ij5heHV0aWxfYXJyYXlfbGlzdF90KjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoJGZpcnN0UHJvcGVydHkvQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpcnN0UHJvcGVydHkvQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlyc3RQcm9wZXJ0eS9AY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gQVhJUzJfQ0FMTAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9mcmVlX3BvcHBpbmdfdmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+OwotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGZpcnN0UHJvcGVydHkvQG91cnMgb3IgJGZpcnN0UHJvcGVydHkvQGlzYXJyYXkgb3IgJHByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90Kicgb3IgJHByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyBvciAkcHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIG9yICRwcm9wZXJ0eVR5cGU9J2F4dXRpbF91cmlfdConIG9yICRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIG9yICRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KU5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICB2b2lkKiBBWElTMl9DQUxMCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2ZyZWVfcG9wcGluZ192YWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZnJlZSgKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KQotICAgICAgICB7Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InByb3BlcnR5L0Bpc2FycmF5Ij4KLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB2b2lkICplbGVtZW50ID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgQVhJUzJfRkFJTFVSRSk7Ci0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Jlc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDwhLS0gVGhlIHNlY3Rpb24gY292ZXJzIHRoZSBsaXN0IHR5cGVzIC0tPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Iml0ZW10eXBlIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RfbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Jlc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0eXBlKSI+Ci0gICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cW5hbWUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnFuYW1lLCBlbnYpOwotICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5xbmFtZSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+KTsKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iQHNpbXBsZSI+Ci0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZGVzZXJpYWxpemVfZnJvbV9zdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4aXMyX2NoYXJfdCAqbm9kZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpwYXJlbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGF4aXMyX3N0YXR1c190IHN0YXR1cyA9IEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InByb3BlcnR5L0B0eXBlPSdheHV0aWxfZGF0ZV90aW1lX3QqJyBvciBwcm9wZXJ0eS9AdHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgdm9pZCAqZWxlbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaXRlbXR5cGUvQHR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIG9yIGl0ZW10eXBlL0B0eXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICB2b2lkICplbGVtZW50ID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9wZXJ0eS9AdHlwZT0nYXh1dGlsX3FuYW1lX3QqJyBvciBpdGVtdHlwZS9AdHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgIGNvbnN0IGF4aXMyX2NoYXJfdCAqY3Bfcm8gPSBOVUxMOwotICAgICAgICAgICAgICBheGlzMl9ib29sX3QgcHJlZml4X2ZvdW5kID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgIGF4aW9tX25hbWVzcGFjZV90ICpxbmFtZV9uczsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Iml0ZW10eXBlIj4KLSAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICp0b2tlbl92YWx1ZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKm9yaWdpbmFsX25vZGVfdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpkdXBkX25vZGVfdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgYXhpczJfYm9vbF90IHRoZV9sYXN0X3Rva2VuID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPiA8IS0tIG9ubHkgb25lIHByb3BlcnR5IHdvdWxkIGJlIGluIGEgc2ltcGxldHlwZSAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+IDwhLS0ganVzdCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBmb3IgbW9yZSB0aGFuIG9uZSB0aW1lIC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hdGl2ZVByb3BlcnR5VHlwZSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgIAotICAgICAgICAgICAgICAgICAgPCEtLSBoZXJlIG9ubHkgc2ltcGxlIHR5cGVzIHBvc3NpYmxlIC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludCBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvaShub2RlX3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIChjaGFyKSgqbm9kZV92YWx1ZSkpOyA8IS0tIFRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgc2hvcnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBhdG9pKG5vZGVfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQ2NF90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF4dXRpbF9zdHJ0b2wobm9kZV92YWx1ZSwgKGNoYXIqKilOVUxMLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBheHV0aWxfc3RydG91bChub2RlX3ZhbHVlLCAoY2hhcioqKU5VTEwsIDApKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBmbG9hdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvZihub2RlX3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGRvdWJsZSBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF0b2Yobm9kZV92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2NoYXJfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBub2RlX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheHV0aWxfcW5hbWVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9mb3VuZCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNwX3JvID0gbm9kZV92YWx1ZTsgKmNwX3JvOyBjcF9ybyArKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigqY3Bfcm8gPT0gJzonKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Bfcm8gKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9mb3VuZCAgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeF9mb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub2RlIHZhbHVlIGNvbnRhaW4gdGhlIHByZWZpeCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnByZWZpeF92YWx1ZSA9IEFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwgKGNwX3JvIC0gbm9kZV92YWx1ZSAtIDEpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwcmVmaXgsIG5vZGVfdmFsdWUsIChjcF9ybyAtIG5vZGVfdmFsdWUgLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4W2NwX3JvIC0gbm9kZV92YWx1ZSAtIDFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9ucyA9IGF4aW9tX2VsZW1lbnRfZmluZF9uYW1lc3BhY2VfdXJpKChheGlvbV9lbGVtZW50X3QqKWF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudChwYXJlbnQsIGVudiksIGVudiwgcHJlZml4X3ZhbHVlLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT5hbGxvY2F0b3IsIHByZWZpeF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlbiBpdCBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcF9ybyA9IG5vZGVfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfbnMgPSBheGlvbV9lbGVtZW50X2dldF9kZWZhdWx0X25hbWVzcGFjZSgoYXhpb21fZWxlbWVudF90KilheGlvbV9ub2RlX2dldF9kYXRhX2VsZW1lbnQocGFyZW50LCBlbnYpLCBlbnYsIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHdlIGFyZSBkb25lIGV4dHJhY3RpbmcgaW5mbywganVzdCBzZXQgdGhlIGV4dHJhY3RlZCB2YWx1ZSB0byB0aGUgcW5hbWUgLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwX3JvLCAvKiBjcCBjb250YWluIHRoZSBsb2NhbG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2dldF91cmkocW5hbWVfbnMsIGVudiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25hbWVzcGFjZV9nZXRfcHJlZml4KHFuYW1lX25zLCBlbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotCi0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX3VyaV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF4dXRpbF91cmlfcGFyc2Vfc3RyaW5nKGVudiwgbm9kZV92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9kdXJhdGlvbl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXh1dGlsX2R1cmF0aW9uX2NyZWF0ZV9mcm9tX3N0cmluZyhlbnYsIG5vZGVfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9ib29sX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF4dXRpbF9zdHJjbXAobm9kZV92YWx1ZSwgIlRSVUUiKSB8fCAhYXh1dGlsX3N0cmNtcChub2RlX3ZhbHVlLCAidHJ1ZSIpKQotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBBWElTMl9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIEFYSVMyX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9ieXRlX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF0b2kobm9kZV92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBkYXRlX3RpbWVfdCogcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICh2b2lkKilheHV0aWxfZGF0ZV90aW1lX2NyZWF0ZShlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfZGF0ZV90aW1lX2Rlc2VyaWFsaXplX2RhdGVfdGltZSgoYXh1dGlsX2RhdGVfdGltZV90KillbGVtZW50LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBoZXhfYmluYXJ5X3QqIHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gKHZvaWQqKWF4dXRpbF9iYXNlNjRfYmluYXJ5X2NyZWF0ZShlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYmFzZTY0X2JpbmFyeV9zZXRfZW5jb2RlZF9iaW5hcnkoKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSXQgc2VlbXMgdGhpcyBpcyBpbiBhbiB1bnJlYWNoYWJsZSBwYXRoIC0tPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IGFkZCBuZXcgYXR0cmlidXRlcyB0eXBlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIG5vdCBoYW5kbGUgdGhlIGF0dHJpYnV0ZSB0eXBlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgPCEtLSBUaGUgc2VjdGlvbiBjb3ZlcnMgdGhlIGxpc3QgdHlwZXMsIHRoaXMgaXMgYSBsb29wIGFsd2F5cyBvY2N1cnMganVzdCAxIHRpbWUtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtdHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPmF4dXRpbF9hcnJheV9saXN0X3QqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkanVzdF9uYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IkNOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RfbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IlByb3BlcnR5VHlwZUFycmF5UGFyYW0iPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBhcnJheWxpc3QtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4qPC94c2w6dGV4dD48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5SW5zdGFuY2VOYW1lIj4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ianVzdFByb3BlcnR5SW5zdGFuY2VOYW1lIj5lbGVtZW50PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoganVzdCB0byBtYWtlIHN1cmUgd2UgYXJlIG5vdCBhbHRlcmluZyB0aGUgb3JpZ2luYWwgKi8KLSAgICAgICAgICAgICAgICBkdXBkX25vZGVfdmFsdWUgPSBvcmlnaW5hbF9ub2RlX3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX3N0cmR1cChlbnYsIG5vZGVfdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgZm9yKHRva2VuX3ZhbHVlID0gZHVwZF9ub2RlX3ZhbHVlLCB0aGVfbGFzdF90b2tlbiA9IEFYSVMyX0ZBTFNFOyAhdGhlX2xhc3RfdG9rZW47IGR1cGRfbm9kZV92YWx1ZSArKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCpkdXBkX25vZGVfdmFsdWUgPT0gJyAnIHx8ICpkdXBkX25vZGVfdmFsdWUgPT0gJ1x0JyB8fCAqZHVwZF9ub2RlX3ZhbHVlID09ICdccicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAqZHVwZF9ub2RlX3ZhbHVlID09ICdcbicgfHwgKmR1cGRfbm9kZV92YWx1ZSA9PSAnXDAnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigqZHVwZF9ub2RlX3ZhbHVlID09ICdcMCcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2xhc3RfdG9rZW4gPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkdXBkX25vZGVfdmFsdWUgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludCBzIC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvaSh0b2tlbl92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nY2hhcicgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgY2hhciciPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2FkZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIChjaGFyKSgqdG9rZW5fdmFsdWUpKTsgPCEtLSBUaGlzIHNob3VsZCBiZSBjaGVja2VkIC0tPgotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgc2hvcnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdzaG9ydCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBhdG9pKHRva2VuX3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQ2NF90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2FkZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF4dXRpbF9zdHJ0b2wodG9rZW5fdmFsdWUsIChjaGFyKiopTlVMTCwgMCkpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2FkZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF4dXRpbF9zdHJ0b3VsKHRva2VuX3ZhbHVlLCAoY2hhcioqKU5VTEwsIDApKTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGZsb2F0IHMgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBhdG9mKHRva2VuX3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgZG91YmxlIHMgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvZih0b2tlbl92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2FkZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIHRva2VuX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9xbmFtZV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4X2ZvdW5kID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGZvcihjcCA9IHRva2VuX3ZhbHVlOyAqY3A7IGNwICsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigqY3AgPT0gJzonKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjcCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2ZvdW5kICA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihwcmVmaXhfZm91bmQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vZGUgdmFsdWUgY29udGFpbiB0aGUgcHJlZml4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9ucyA9IGF4aW9tX2VsZW1lbnRfZmluZF9uYW1lc3BhY2VfdXJpKChheGlvbV9lbGVtZW50X3QqKWF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudChwYXJlbnQsIGVudiksIGVudiwgdG9rZW5fdmFsdWUsIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVuIGl0IGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY3AgPSB0b2tlbl92YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX25zID0gYXhpb21fZWxlbWVudF9nZXRfZGVmYXVsdF9uYW1lc3BhY2UoKGF4aW9tX2VsZW1lbnRfdCopYXhpb21fbm9kZV9nZXRfZGF0YV9lbGVtZW50KHBhcmVudCwgZW52KSwgZW52LCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2UgYXJlIGRvbmUgZXh0cmFjdGluZyBpbmZvLCBqdXN0IHNldCB0aGUgZXh0cmFjdGVkIHZhbHVlIHRvIHRoZSBxbmFtZSAtLT4KLQotICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2FkZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLCAvKiBjcCBjb250YWluIHRoZSBsb2NhbG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3VyaShxbmFtZV9ucywgZW52KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3ByZWZpeChxbmFtZV9ucywgZW52KSkpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheHV0aWxfdXJpX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXh1dGlsX3VyaV9wYXJzZV9zdHJpbmcoZW52LCB0b2tlbl92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX2R1cmF0aW9uX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBheHV0aWxfZHVyYXRpb25fY3JlYXRlX2Zyb21fc3RyaW5nKGVudiwgdG9rZW5fdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2Jvb2xfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICAgaWYgKCFheHV0aWxfc3RyY21wKHRva2VuX3ZhbHVlLCAiVFJVRSIpIHx8ICFheHV0aWxfc3RyY21wKHRva2VuX3ZhbHVlLCAidHJ1ZSIpKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBBWElTMl9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgQVhJUzJfRkFMU0UpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2J5dGVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvaSh0b2tlbl92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGRhdGVfdGltZV90KiBzIC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAodm9pZCopYXh1dGlsX2RhdGVfdGltZV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kYXRlX3RpbWVfZGVzZXJpYWxpemVfZGF0ZV90aW1lKChheHV0aWxfZGF0ZV90aW1lX3QqKWVsZW1lbnQsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbl92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGhleF9iaW5hcnlfdCogcyAtLT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICh2b2lkKilheHV0aWxfYmFzZTY0X2JpbmFyeV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9iYXNlNjRfYmluYXJ5X2FkZF9lbmNvZGVkX2JpbmFyeSgoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudCwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9hZGRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gSXQgc2VlbXMgdGhpcyBpcyBpbiBhbiB1bnJlYWNoYWJsZSBwYXRoIC0tPgotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IGFkZCBuZXcgYXR0cmlidXRlcyB0eXBlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBub3QgaGFuZGxlIHRoZSBhdHRyaWJ1dGUgdHlwZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiovCi0gICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4gICAKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5fdmFsdWUgPSBkdXBkX25vZGVfdmFsdWUgKyAxOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT5hbGxvY2F0b3IsIG9yaWdpbmFsX25vZGVfdmFsdWUpOwotCi0gICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2Rlc2VyaWFsaXplKAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsCi0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICoqZHBfcGFyZW50LAotICAgICAgICAgICAgICAgIGF4aXMyX2Jvb2xfdCAqZHBfaXNfZWFybHlfbm9kZV92YWxpZCwKLSAgICAgICAgICAgICAgICBheGlzMl9ib29sX3QgZG9udF9jYXJlX21pbm9jY3VycykKLSAgICAgICAgewotICAgICAgICAgIGF4aW9tX25vZGVfdCAqcGFyZW50ID0gKmRwX3BhcmVudDsKLSAgICAgICAgICAKLSAgICAgICAgICBheGlzMl9zdGF0dXNfdCBzdGF0dXMgPSBBWElTMl9TVUNDRVNTOwotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocHJvcGVydHlbQGF0dHJpYnV0ZV0pIT0wIj4KLSAgICAgICAgICAgICAgYXhpb21fYXR0cmlidXRlX3QgKnBhcmVudF9hdHRyaSA9IE5VTEw7Ci0gICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfdCAqcGFyZW50X2VsZW1lbnQgPSBOVUxMOwotICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKmF0dHJpYl90ZXh0ID0gTlVMTDsKLQotICAgICAgICAgICAgICBheHV0aWxfaGFzaF90ICphdHRyaWJ1dGVfaGFzaCA9IE5VTEw7Ci0KLSAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9InByb3BlcnR5L0BvdXJzIG9yIChwcm9wZXJ0eS9AaXNhcnJheSBhbmQgKHByb3BlcnR5L0B0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgcHJvcGVydHkvQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIHByb3BlcnR5L0B0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIHByb3BlcnR5L0B0eXBlPSd1aW50NjRfdCcgb3IgcHJvcGVydHkvQHR5cGU9J3Nob3J0JyBvciBwcm9wZXJ0eS9AdHlwZT0naW50JyBvciBwcm9wZXJ0eS9AdHlwZT0nY2hhcicgb3IgcHJvcGVydHkvQHR5cGU9J2ludDY0X3QnIG9yIHByb3BlcnR5L0B0eXBlPSdmbG9hdCcgb3IgcHJvcGVydHkvQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgcHJvcGVydHkvQHR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgcHJvcGVydHkvQHR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgcHJvcGVydHkvQHR5cGU9J2RvdWJsZScpKSBvciBwcm9wZXJ0eS9AdHlwZT0nYXh1dGlsX2RhdGVfdGltZV90Kicgb3IgcHJvcGVydHkvQHR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgIHZvaWQgKmVsZW1lbnQgPSBOVUxMOwotICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgPCEtLSB0aGVzZSB0d28gYXJlIHJlcXVyaWVkIC0tPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocHJvcGVydHkpIT0wICBvciBjb3VudChpdGVtdHlwZSkhPTAiPiA8IS0tIGNoZWNrIGZvciBhdCBsZWFzdCBvbmUgZWxlbWVudCBleGlzdHMgLS0+Ci0gICAgICAgICAgICAgY29uc3QgYXhpczJfY2hhcl90KiB0ZXh0X3ZhbHVlID0gTlVMTDsKLSAgICAgICAgICAgICBheHV0aWxfcW5hbWVfdCAqcW5hbWUgPSBOVUxMOwotICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgPCEtLSBxbmFtZSBzcGVjaWZjIHZhbHVlcyAtLT4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icHJvcGVydHkvQHR5cGU9J2F4dXRpbF9xbmFtZV90KiciPgotICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKmNwID0gTlVMTDsKLSAgICAgICAgICAgICAgYXhpczJfYm9vbF90IHByZWZpeF9mb3VuZCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfdCAqcW5hbWVfbnM7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAc2ltcGxlIGFuZCAoY291bnQocHJvcGVydHkpIT0wIG9yIGNvdW50KGl0ZW10eXBlKSE9MCkiPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgaWYocGFyZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF4aXMyX2NoYXJfdCAqYXR0cmliX3RleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGF0dHJpYl90ZXh0ID0gYXhpb21fZWxlbWVudF9nZXRfYXR0cmlidXRlX3ZhbHVlX2J5X25hbWUoYXhpb21fbm9kZV9nZXRfZGF0YV9lbGVtZW50KHBhcmVudCwgZW52KSwgZW52LCAibmlsIik7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYl90ZXh0ICE9IE5VTEwgJmFtcDsmYW1wOyAhYXh1dGlsX3N0cmNhc2VjbXAoYXR0cmliX3RleHQsICJ0cnVlIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPl9uaWwoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICp0ZXh0X25vZGUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB0ZXh0X25vZGUgPSBheGlvbV9ub2RlX2dldF9maXJzdF9jaGlsZChwYXJlbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIGF4aW9tX3RleHRfdCAqdGV4dF9lbGVtZW50ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfbm9kZSAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9nZXRfbm9kZV90eXBlKHRleHRfbm9kZSwgZW52KSA9PSBBWElPTV9URVhUKQotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9lbGVtZW50ID0gKGF4aW9tX3RleHRfdCopYXhpb21fbm9kZV9nZXRfZGF0YV9lbGVtZW50KHRleHRfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X2VsZW1lbnQgJmFtcDsmYW1wOyBheGlvbV90ZXh0X2dldF92YWx1ZSh0ZXh0X2VsZW1lbnQsIGVudikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KilheGlvbV90ZXh0X2dldF92YWx1ZSh0ZXh0X2VsZW1lbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2Rlc2VyaWFsaXplX2Zyb21fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LCB0ZXh0X3ZhbHVlLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwcm9wZXJ0eS9AaXNhcnJheSI+Ci0gICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF90ICphcnJfbGlzdCA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKEBvcmRlcmVkIG9yIEBjaG9pY2UpIGFuZCBwcm9wZXJ0eS9AaXNhcnJheSI+Ci0gICAgICAgICAgICAgICBpbnQgc2VxdWVuY2VfYnJva2VuID0gMDsKLSAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqdG1wX25vZGUgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRfcW5hbWVfdmFyX3JlcXVyZWQiPgotICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIobm90KEBhdHRyaWJ1dGUpIGFuZCBAaXNhcnJheSkgb3Igbm90KCRvcmRlcmVkKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICB5ZXMKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkZWxlbWVudF9xbmFtZV92YXJfcmVxdXJlZCwgJ3llcycpIj4KLSAgICAgICAgICAgICAgICAgPCEtLSBUT0RPIGF4dXRpbF9xbmFtZV90ICplbGVtZW50X3FuYW1lID0gTlVMTDsgLS0+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIGF4dXRpbF9xbmFtZV90ICplbGVtZW50X3FuYW1lID0gTlVMTDsgCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHByb3BlcnR5KSE9MCI+Ci0gICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmZpcnN0X25vZGUgPSBOVUxMOwotICAgICAgICAgICAgICAgYXhpczJfYm9vbF90IGlzX2Vhcmx5X25vZGVfdmFsaWQgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpjdXJyZW50X25vZGUgPSBOVUxMOwotICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF90ICpjdXJyZW50X2VsZW1lbnQgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgQVhJUzJfRkFJTFVSRSk7Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8IS0tIFdlIGFyZSBleHBlY3RlZCB0byBoYXZlIE5VTEwgZWxlbWVudHMgaW4gcGFydGljbGUgY2xhc3NlcyAtLT4KLSAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJHBhcnRpY2xlQ2xhc3MpIj4KLSAgICAgICAgICAgICAgPCEtLSBXYWl0IHVudGlsIEFYSU9NX0VMRU1FTlQgLS0+Ci0gICAgICAgICAgICAgIHdoaWxlKHBhcmVudCAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShwYXJlbnQsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcGFyZW50ID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKHBhcmVudCwgZW52KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBwYXJlbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBiZSBjaGVja2VkIGJlZm9yZSBldmVyeXRoaW5nICovCi0gICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgaW4gYnVpbGRpbmcgYWRiIG9iamVjdCBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4gOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgZWxlbWVuZXQgY2FuIG5vdCBiZSBwYXNzZWQgdG8gZGVzZXJpYWxpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPiA8IS0tIGNoZWNrIGZvciBhdCBsZWFzdCBvbmUgZWxlbWVudCBleGlzdHMgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KCRpc3R5cGUpIj4KLQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VsZW1lbnQgPSAoYXhpb21fZWxlbWVudF90ICopYXhpb21fbm9kZV9nZXRfZGF0YV9lbGVtZW50KHBhcmVudCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBheGlvbV9lbGVtZW50X2dldF9xbmFtZShjdXJyZW50X2VsZW1lbnQsIGVudiwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4dXRpbF9xbmFtZV9lcXVhbHMocW5hbWUsIGVudiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT4gcW5hbWUpPHhzbDppZiB0ZXN0PSJub3QoJG5zdXJpKSBvciAkbnN1cmk9JyciPiB8fCAhYXh1dGlsX3N0cmNtcCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4iLCBheGlvbV9lbGVtZW50X2dldF9sb2NhbG5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYpKTwveHNsOmlmPikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYW5vbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X25vZGUgPSBheGlvbV9ub2RlX2dldF9maXJzdF9jaGlsZChwYXJlbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ub2RlID0gcGFyZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIGluIGJ1aWxkaW5nIGFkYiBvYmplY3QgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3JpZ2luYWxOYW1lIi8+IDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkICVzIGJ1dCByZXR1cm5lZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfcW5hbWVfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+IHFuYW1lLCBlbnYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX3RvX3N0cmluZyhxbmFtZSwgZW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE86IEFEQiBzcGVjaWZpYyBlcnJvciBzaG91bGQgYmUgZGVmaW5lZCBhbmQgc2V0IGhlcmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcnRpY2xlQ2xhc3MiPgotICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X25vZGUgPSBwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIHR5cGVzLCBwYXJlbnQgcmVmZXJzIHRvIHRoZSBjb250YWluZXIgZWxlbWVudCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ub2RlID0gYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQocGFyZW50LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGV0IGZvbGxvd2VycyB0byBjaGVjayB0aGUgc2l0dWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgaWYoZmlyc3Rfbm9kZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgaW4gYnVpbGRpbmcgYWRiIG9iamVjdCBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4gOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJdCBpcyBleHBlY3RlZCB0byBoYXZlIGEgY2hpbGQgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBUT0RPOiBBREIgc3BlY2lmaWMgZXJyb3Igc2hvdWxkIGJlIGRlZmluZWQgYW5kIHNldCBoZXJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsgCi0gICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+IDwhLS1vdGhlcndpc2UgZm9yIEBzaW1wbGUgY2hlY2sgLS0+Ci0gICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgPCEtLSBhdHRyaWJ1dGVzIGFyZSBjb21tb24gdG8gc2ltcGxlIHR5cGVzKHdoZW4gdXNlZCBpbiBzaW1wbGUgY29udGVudCkgYW5kIG90aGVyIHR5cGVzIC0tPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5L0BhdHRyaWJ1dGUiPgotICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICAgIHBhcmVudF9lbGVtZW50ID0gKGF4aW9tX2VsZW1lbnRfdCAqKWF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudChwYXJlbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9oYXNoID0gYXhpb21fZWxlbWVudF9nZXRfYWxsX2F0dHJpYnV0ZXMocGFyZW50X2VsZW1lbnQsIGVudik7Ci0gICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij5heHV0aWxfYXJyYXlfbGlzdF90KjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hdGl2ZVByb3BlcnR5VHlwZSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eUluc3RhbmNlTmFtZSI+PCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPillbGVtZW50PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ianVzdFByb3BlcnR5SW5zdGFuY2VOYW1lIj48IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+ZWxlbWVudDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmVudFByb3BlcnR5SW5zdGFuY2VOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgIDwhLS0gaGVyZSB3ZSBoYXZlIHR3byBvcHRpb25zLCBlaXRoZXIgaXQgY2FuIGJlIGF4aW9tX2F0dHJpYnV0ZV90KiB3aGljaCBoYXBwZW5zIGluIGFueUF0dHJpYnV0ZSBjYXNlIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlvbV9hdHRyaWJ1dGVfdConIGFuZCBAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICBwYXJlbnRfYXR0cmkgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgaWYoYXR0cmlidXRlX2hhc2gpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX2luZGV4X3QgKmhpOwotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleTsKLSAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpkdXBfa2V5OwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VwZXJhdG9yID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICp1cmkgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfdCAqbmFtZXNwYWNlID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9hdHRyaWJ1dGVfdCAqbmV3X2F0dHJpYiA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIChoaSA9IGF4dXRpbF9oYXNoX2ZpcnN0KGF0dHJpYnV0ZV9oYXNoLCBlbnYpOyBoaTsgaGkgPSBheHV0aWxfaGFzaF9uZXh0KGVudiwgaGkpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfdGhpcyhoaSwgJmFtcDtrZXksIE5VTEwsICZhbXA7dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBfa2V5ID0gYXh1dGlsX3N0cmR1cChlbnYsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBlcmF0b3IgPSBzdHJzdHIoZHVwX2tleSwgInwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VwZXJhdG9yKSAvKiB0aGlzIG1lYW5zIHRoZSBhdHRyaWJ1dGUgaXMgcXVhbGlmaWVkIHdpdGggYSBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlcGVyYXRvciA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGVyYXRvciArKzsgLyogcmVwcmVzZW50IHRoZSBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gc2VwZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgID0gYXhpb21fbmFtZXNwYWNlX2NyZWF0ZShlbnYsIHVyaSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfYXR0cmkgPSAoYXhpb21fYXR0cmlidXRlX3QqKXZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYl90ZXh0ID0gYXhpb21fYXR0cmlidXRlX2dldF92YWx1ZShwYXJlbnRfYXR0cmksIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hdHRyaWIgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlKGVudiwgZHVwX2tleSwgYXR0cmliX3RleHQsIG5hbWVzcGFjZSk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2FkZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIG5ld19hdHRyaWIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgZHVwX2tleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwhLS0gSnVzdCB3YWl0aW5nIGZvciBmaXggdGhlIGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZSAKLSAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5zdXJpIGFuZCBAbnN1cmkgIT0gJyciPgotICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXh1dGlsX3FuYW1lX2NyZWF0ZShlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXh1dGlsX3FuYW1lX2NyZWF0ZShlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgIHBhcmVudF9hdHRyaSA9IGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZShwYXJlbnRfZWxlbWVudCwgZW52LCBxbmFtZSk7Ci0gICAgICAgICAgICAgICAgICBpZihwYXJlbnRfYXR0cmkgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9hdHRyaWJ1dGVfZ2V0X3ZhbHVlKHBhcmVudF9hdHRyaSwgZW52KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9lbGVtZW50X2dldF9hdHRyaWJ1dGVfdmFsdWVfYnlfbmFtZShwYXJlbnRfZWxlbWVudCwgZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmKHFuYW1lKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUocW5hbWUsIGVudik7Ci0gICAgICAgICAgICAgICAgICB9IC0tPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgcGFyZW50X2F0dHJpID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgIGF0dHJpYl90ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgIGlmKGF0dHJpYnV0ZV9oYXNoKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF9pbmRleF90ICpoaTsKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsOwotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICprZXk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIChoaSA9IGF4dXRpbF9oYXNoX2ZpcnN0KGF0dHJpYnV0ZV9oYXNoLCBlbnYpOyBoaTsgaGkgPSBheHV0aWxfaGFzaF9uZXh0KGVudiwgaGkpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfdGhpcyhoaSwgJmFtcDtrZXksIE5VTEwsICZhbXA7dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbnN1cmkgYW5kIEBuc3VyaSAhPSAnJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3Ryc3RyKChheGlzMl9jaGFyX3QqKWtleSwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+fDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz4iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXN0cmNtcCgoYXhpczJfY2hhcl90KilrZXksICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfYXR0cmkgPSAoYXhpb21fYXR0cmlidXRlX3QqKXZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgIGlmKHBhcmVudF9hdHRyaSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9hdHRyaWJ1dGVfZ2V0X3ZhbHVlKHBhcmVudF9hdHRyaSwgZW52KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBob3BpbmcgdGhhdCBhdHRyaWJ1dGUgaXMgc3RvcmVkIGluICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRoaXMgaGFwcG5lcyB3aGVuIG5hbWUgaXMgaW4gZGVmYXVsdCBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9lbGVtZW50X2dldF9hdHRyaWJ1dGVfdmFsdWVfYnlfbmFtZShwYXJlbnRfZWxlbWVudCwgZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgaWYoYXR0cmliX3RleHQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGhlcmUgb25seSBzaW1wbGUgdHlwZSBwb3NzaWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvaShhdHRyaWJfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nY2hhcicgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgY2hhciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIChjaGFyKSgqYXR0cmliX3RleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIHNob3J0IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIHNob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvaShhdHRyaWJfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgaW50NjRfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBheHV0aWxfc3RydG9sKGF0dHJpYl90ZXh0LCAoY2hhcioqKU5VTEwsIDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBheHV0aWxfc3RydG91bChhdHRyaWJfdGV4dCwgKGNoYXIqKilOVUxMLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBmbG9hdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2Zsb2F0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvZihhdHRyaWJfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGRvdWJsZSBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF0b2YoYXR0cmliX3RleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2NoYXJfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2NoYXJfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBhdHRyaWJfdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9xbmFtZV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9mb3VuZCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoY3AgPSBhdHRyaWJfdGV4dDsgKmNwOyBjcCArKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKmNwID09ICc6JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9mb3VuZCAgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZml4X2ZvdW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub2RlIHZhbHVlIGNvbnRhaW4gdGhlIHByZWZpeCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfbnMgPSBheGlvbV9lbGVtZW50X2ZpbmRfbmFtZXNwYWNlX3VyaSgoYXhpb21fZWxlbWVudF90KilheGlvbV9ub2RlX2dldF9kYXRhX2VsZW1lbnQocGFyZW50LCBlbnYpLCBlbnYsIGF0dHJpYl90ZXh0LCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlbiBpdCBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwID0gYXR0cmliX3RleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9ucyA9IGF4aW9tX2VsZW1lbnRfZ2V0X2RlZmF1bHRfbmFtZXNwYWNlKChheGlvbV9lbGVtZW50X3QqKWF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudChwYXJlbnQsIGVudiksIGVudiwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHdlIGFyZSBkb25lIGV4dHJhY3RpbmcgaW5mbywganVzdCBzZXQgdGhlIGV4dHJhY3RlZCB2YWx1ZSB0byB0aGUgcW5hbWUgLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCwgLyogY3AgY29udGFpbiB0aGUgbG9jYWxuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2dldF91cmkocW5hbWVfbnMsIGVudiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2dldF9wcmVmaXgocW5hbWVfbnMsIGVudikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX3VyaV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIGF4dXRpbF91cmlfcGFyc2Vfc3RyaW5nKGVudiwgYXR0cmliX3RleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9kdXJhdGlvbl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXh1dGlsX2R1cmF0aW9uX2NyZWF0ZV9mcm9tX3N0cmluZyhlbnYsIGF0dHJpYl90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfYm9vbF90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF4dXRpbF9zdHJjbXAoYXR0cmliX3RleHQsICJUUlVFIikgfHwgIWF4dXRpbF9zdHJjbXAoYXR0cmliX3RleHQsICJ0cnVlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIEFYSVMyX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBBWElTMl9GQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgYXRvaShhdHRyaWJfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGRhdGVfdGltZV90KiBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAodm9pZCopYXh1dGlsX2RhdGVfdGltZV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kYXRlX3RpbWVfZGVzZXJpYWxpemVfZGF0ZV90aW1lKChheHV0aWxfZGF0ZV90aW1lX3QqKWVsZW1lbnQsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJfdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGhleF9iaW5hcnlfdCogcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICh2b2lkKilheHV0aWxfYmFzZTY0X2JpbmFyeV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9iYXNlNjRfYmluYXJ5X3NldF9lbmNvZGVkX2JpbmFyeSgoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudCksIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJfdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICAodm9pZCopPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2Rlc2VyaWFsaXplX2Zyb21fc3RyaW5nKCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPillbGVtZW50LCBlbnYsIGF0dHJpYl90ZXh0LCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPillbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IGFkZCBuZXcgYXR0cmlidXRlcyB0eXBlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIG5vdCBoYW5kbGUgdGhlIGF0dHJpYnV0ZSB0eXBlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc2ltcGxlIj48L3hzbDp3aGVuPiA8IS0tIGp1c3QgdG8gYXZvaWQgcHJlY2VlZGluZyBjb2RlIHRvIGJlIHBhcnNlZCBpbiBhIHNpbXBsZSB0eXBlIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiA8IS0tIHdoZW4gaXQgaXMgYW4gZWxlbWVudCBub3QoQGF0dHJpYnV0ZSkgLS0+Ci0gICAgICAgICAgICAgICAgICA8IS0tIGhhbmRsZXMgYXJyYXlzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBidWlsZGluZyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+IGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICBhcnJfbGlzdCA9IGF4dXRpbF9hcnJheV9saXN0X2NyZWF0ZShlbnYsIDEwKTsKLSAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3IgZWFjaCBub24gYXR0cmlidXRlIHByb3BlcnRpZXMgdGhlcmUgd2lsbCBhbHdheXMgYmUgYW4gZWxlbWVudC0tPgotICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAqIGJ1aWxkaW5nIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgPCEtLSBhcnJheSBhbmQgbm9uIGFycmF5IGJ1aWxkIGlzIHNvIGRpZmZlcmVudCBzbyBiaWcgY2hvb3NlLCB3aGVuIGlzIHJlcXVyaWVkLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZSBtZXRob2Qgb2YgcGlja2luZyB0aGUgZWxlbWVudCBpcyBkZXBlbmQgb24gdGhlICRvcmRlcmVkIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQGlzYXJyYXkpIj4gIDwhLS1ub3QgYW4gYXJyYXkgc28gY29udGludWUgbm9ybWFsIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3JkZXJlZCBvciBub3QoJGFub24gb3IgJGlzdHlwZSkgb3IgJGNob2ljZSI+IDwhLS0gc2luY2Ugbm9uLWFub24gYW5kIGNob2ljZXMgaGFzIGp1c3Qgb25seSBvbmUgc3ViIGVsZW1lbnQtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBmaXJzdF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lYXJseV9ub2RlX3ZhbGlkID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2FpdCB1bnRpbCBBWElPTV9FTEVNRU5UIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAYW55KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShjdXJyZW50X25vZGUgJmFtcDsmYW1wOyBheGlvbV9ub2RlX2dldF9ub2RlX3R5cGUoY3VycmVudF9ub2RlLCBlbnYpICE9IEFYSU9NX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKGN1cnJlbnRfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRfbm9kZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZWxlbWVudCA9IChheGlvbV9lbGVtZW50X3QgKilheGlvbV9ub2RlX2dldF9kYXRhX2VsZW1lbnQoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXhpb21fZWxlbWVudF9nZXRfcW5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgZWxlbWVudHMgYXJlIG9yZGVyZWQgdGhpcyB3b3JrcyBmaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjdXJyZW50IG5vZGUgc2hvdWxkIGNvbnRhaW4gdGhlIG9yZGVyZWQgdmFsdWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRfbm9kZSAhPSBOVUxMICZhbXA7JmFtcDsgaXNfZWFybHlfbm9kZV92YWxpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKGN1cnJlbnRfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2FpdCB1bnRpbCBBWElPTV9FTEVNRU5UIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGFueSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGN1cnJlbnRfbm9kZSAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShjdXJyZW50X25vZGUsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhjdXJyZW50X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGN1cnJlbnRfbm9kZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9lbGVtZW50ID0gKGF4aW9tX2VsZW1lbnRfdCAqKWF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudChjdXJyZW50X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXhpb21fZWxlbWVudF9nZXRfcW5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZWFybHlfbm9kZV92YWxpZCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4gPCEtLSBjbG9zZSBmb3IgcG9zaXRpb24gLTEgLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55Ij48L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuc3VyaSBhbmQgQG5zdXJpICE9ICcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz4iLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiA8IS0tIG90aGVyd2lzZSBmb3IgKCRvcmRlcmVkKSwgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIGVsZW1lbnRzIGFyZSBub3Qgb3JkZXJlZCB3ZSBzaG91bGQgc3VyZiBhbGwgdGhlIHNpYmxpbmcgdG8gcGljayB0aGUgcmlnaHQgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjdXJyZW50X25vZGUgPSBmaXJzdF9ub2RlOyBjdXJyZW50X25vZGUgIT0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhjdXJyZW50X25vZGUsIGVudikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShjdXJyZW50X25vZGUsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZWxlbWVudCA9IChheGlvbV9lbGVtZW50X3QgKilheGlvbV9ub2RlX2dldF9kYXRhX2VsZW1lbnQoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXhpb21fZWxlbWVudF9nZXRfcW5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbnN1cmkgYW5kIEBuc3VyaSAhPSAnJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPiIsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXh1dGlsX3FuYW1lX2VxdWFscyhlbGVtZW50X3FuYW1lLCBlbnYsIHFuYW1lKTx4c2w6aWYgdGVzdD0ibm90KEBuc3VyaSkgb3IgQG5zdXJpPScnIj4gfHwgIWF4dXRpbF9zdHJjbXAoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgYXhpb21fZWxlbWVudF9nZXRfbG9jYWxuYW1lKGN1cnJlbnRfZWxlbWVudCwgZW52KSk8L3hzbDppZj4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91bmQgdGhlIHJlcXVyaWVkIGVsZW1lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4gPCEtLSBjbG9zZSBmb3IgJG9yZGVyZWQgb3Igbm90KCRhbm9uIG9yICRpc3R5cGUpIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDppZiB0ZXN0PSJAb3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9pc19wYXJ0aWNsZSgpIHx8IDwveHNsOmlmPiA8IS0tIGlzIHBhcnRpY2xlIHRlc3Qgc2hvdWxkIGJlIGRvbmUgaGVyZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfbm9kZSA8eHNsOmlmIHRlc3Q9Im5vdChAYW55KSI+ICAmYW1wOyZhbXA7IGN1cnJlbnRfZWxlbWVudCAmYW1wOyZhbXA7IChheHV0aWxfcW5hbWVfZXF1YWxzKGVsZW1lbnRfcW5hbWUsIGVudiwgcW5hbWUpPHhzbDppZiB0ZXN0PSJub3QoQG5zdXJpKSBvciBAbnN1cmk9JyciPiB8fCAhYXh1dGlsX3N0cmNtcCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBheGlvbV9lbGVtZW50X2dldF9sb2NhbG5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYpKTwveHNsOmlmPik8L3hzbDppZj4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGN1cnJlbnRfbm9kZSA8eHNsOmlmIHRlc3Q9Im5vdChAYW55KSI+ICAmYW1wOyZhbXA7IGN1cnJlbnRfZWxlbWVudCAmYW1wOyZhbXA7IChheHV0aWxfcW5hbWVfZXF1YWxzKGVsZW1lbnRfcW5hbWUsIGVudiwgcW5hbWUpPHhzbDppZiB0ZXN0PSJub3QoQG5zdXJpKSBvciBAbnN1cmk9JyciPiB8fCAhYXh1dGlsX3N0cmNtcCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBheGlvbV9lbGVtZW50X2dldF9sb2NhbG5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYpKTwveHNsOmlmPik8L3hzbDppZj4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Vhcmx5X25vZGVfdmFsaWQgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjaGFuZ2VzIHRvIGZvbGxvd2luZyBjaG9vc2UgdGFnIHNob3VsZCBiZSBjaGFuZ2VkIGluIGFub3RoZXIgMiBwbGFjZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAodm9pZCopPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9jcmVhdGUoZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9kZXNlcmlhbGl6ZSgoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsICZhbXA7Y3VycmVudF9ub2RlLCAmYW1wO2lzX2Vhcmx5X25vZGVfdmFsaWQsIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkY2hvaWNlIj5BWElTMl9UUlVFPC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT5BWElTMl9GQUxTRTwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQVhJUzJfRkFJTFVSRSA9PSBzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiZmFpbGVkIGluIGJ1aWxkaW5nIGFkYiBvYmplY3QgZm9yIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXhpczJfcW5hbWVfdCAqcW5hbWUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBheGlvbV9hdHRyaWJ1dGVfdCAqdGhlX2F0dHJpID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHFuYW1lID0gYXh1dGlsX3FuYW1lX2NyZWF0ZShlbnYsICJuaWwiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZV9hdHRyaSA9IGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZShjdXJyZW50X2VsZW1lbnQsIGVudiwgcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudGx5IHRoZXJlaXMgYSBidWcgaW4gdGhlIGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZSwgc28gd2UgaGF2ZSB0byBnbyB0byB0aGlzIGJhZCBtZXRob2QgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9hdHRyaWJ1dGVfdCAqdGhlX2F0dHJpID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICphdHRyaWJfdGV4dCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3QgKmF0dHJpYnV0ZV9oYXNoID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfaGFzaCA9IGF4aW9tX2VsZW1lbnRfZ2V0X2FsbF9hdHRyaWJ1dGVzKGN1cnJlbnRfZWxlbWVudCwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJfdGV4dCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF0dHJpYnV0ZV9oYXNoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfaW5kZXhfdCAqaGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGhpID0gYXh1dGlsX2hhc2hfZmlyc3QoYXR0cmlidXRlX2hhc2gsIGVudik7IGhpOyBoaSA9IGF4dXRpbF9oYXNoX25leHQoZW52LCBoaSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfdGhpcyhoaSwgJmFtcDtrZXksIE5VTEwsICZhbXA7dmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cnN0cigoYXhpczJfY2hhcl90KilrZXksICJuaWx8aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2F0dHJpID0gKGF4aW9tX2F0dHJpYnV0ZV90Kil2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoZV9hdHRyaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9hdHRyaWJ1dGVfZ2V0X3ZhbHVlKHRoZV9hdHRyaSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgaXMgaG9waW5nIHRoYXQgYXR0cmlidXRlIGlzIHN0b3JlZCBpbiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCB0aGlzIGhhcHBuZXMgd2hlbiBuYW1lIGlzIGluIGRlZmF1bHQgbmFtZXNwYWNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJfdGV4dCA9IGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9ieV9uYW1lKGN1cnJlbnRfZWxlbWVudCwgZW52LCAibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdHRyaWJfdGV4dCAmYW1wOyZhbXA7IDAgPT0gYXh1dGlsX3N0cmNtcChhdHRyaWJfdGV4dCwgIjEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWZ0ZXIgYWxsLCB3ZSBmb3VuZCB0aGlzIGlzIGEgZW1wdHkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF91cmlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF91cmlfcGFyc2Vfc3RyaW5nKGVudiwgdGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2R1cmF0aW9uX2NyZWF0ZV9mcm9tX3N0cmluZyhlbnYsIHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfcW5hbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfZm91bmQgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNwID0gdGV4dF92YWx1ZTsgKmNwOyBjcCArKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKmNwID09ICc6JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9mb3VuZCAgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZml4X2ZvdW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub2RlIHZhbHVlIGNvbnRhaW4gIHRoZSBwcmVmaXggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX25zID0gYXhpb21fZWxlbWVudF9maW5kX25hbWVzcGFjZV91cmkoY3VycmVudF9lbGVtZW50LCBlbnYsIHRleHRfdmFsdWUsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVuIGl0IGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgPSB0ZXh0X3ZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfbnMgPSBheGlvbV9lbGVtZW50X2dldF9kZWZhdWx0X25hbWVzcGFjZShjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2UgYXJlIGRvbmUgZXh0cmFjdGluZyBpbmZvLCBqdXN0IHNldCB0aGUgZXh0cmFjdGVkIHZhbHVlIHRvIHRoZSBxbmFtZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLCAvKiBjcCBjb250YWluIHRoZSBsb2NhbG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3VyaShxbmFtZV9ucywgZW52KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3ByZWZpeChxbmFtZV9ucywgZW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhcikoKnRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+IAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b2kodGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYnl0ZV90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvaSh0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPiAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9pKHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+IAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2Zsb2F0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b2YodGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b2YodGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJ0b2wodGV4dF92YWx1ZSwgKGNoYXIqKilOVUxMLCAwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RydG91bCh0ZXh0X3ZhbHVlLCAoY2hhcioqKU5VTEwsIDApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aW9tX25vZGVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IE5VTEw7IC8qIGp1c3QgdG8gYXZvaWQgd2FybmluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFueSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpjdXJyZW50X3Byb3BlcnR5X25vZGUgPSBjdXJyZW50X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X25vZGUgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9kZXRhY2goY3VycmVudF9wcm9wZXJ0eV9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3Byb3BlcnR5X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQoY3VycmVudF9ub2RlLCBlbnYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqY3VycmVudF9wcm9wZXJ0eV9ub2RlID0gYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfZGV0YWNoKGN1cnJlbnRfcHJvcGVydHlfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcHJvcGVydHlfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ib29sX3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF4dXRpbF9zdHJjYXNlY21wKHRleHRfdmFsdWUgLCAidHJ1ZSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2RhdGVfdGltZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gKHZvaWQqKWF4dXRpbF9kYXRlX3RpbWVfY3JlYXRlKGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBheHV0aWxfZGF0ZV90aW1lX2Rlc2VyaWFsaXplX2RhdGVfdGltZSgoYXh1dGlsX2RhdGVfdGltZV90KillbGVtZW50LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQVhJUzJfRkFJTFVSRSA9PSAgc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kYXRlX3RpbWVfZnJlZSgoYXh1dGlsX2RhdGVfdGltZV90KillbGVtZW50LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgImZhaWxlZCBpbiBidWlsZGluZyBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPillbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICh2b2lkKilheHV0aWxfYmFzZTY0X2JpbmFyeV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGF4dXRpbF9iYXNlNjRfYmluYXJ5X3NldF9lbmNvZGVkX2JpbmFyeSgoYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCopZWxlbWVudCwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFYSVMyX0ZBSUxVUkUgPT0gIHN0YXR1cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9iYXNlNjRfYmluYXJ5X2ZyZWUoKGF4dXRpbF9iYXNlNjRfYmluYXJ5X3QqKWVsZW1lbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiZmFpbGVkIGluIGJ1aWxkaW5nIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE86IGFkZCBvdGhlciB0eXBlcyBoZXJlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbXBvc2libGUgdG8gaGFuZGxlIHRoZSByZXF1ZXN0IHR5cGUgLSBzbyBwbGVhc2UgZG8gaXQgbWFudWFsbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBWElTMl9GQUlMVVJFID09ICBzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJmYWlsZWQgaW4gc2V0dGluZyB0aGUgdmFsdWUgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnRfcW5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfcW5hbWVfZnJlZShlbGVtZW50X3FuYW1lLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkgYW5kIG5vdChAbWluT2NjdXJzPTApIGFuZCBub3QoJGNob2ljZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZighZG9udF9jYXJlX21pbm9jY3VycykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbGVtZW50X3FuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUoZWxlbWVudF9xbmFtZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgYSBuaWxsYWJsZSBlbGVtZW50Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIm5vbiBuaWxsYWJsZSBvciBtaW5PdWNjcnMgIT0gMCBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiA8IS0tIHdoZW4gaXQgaXMgYWxsIHRoZSB3YXkgYW4gYXJyYXkgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICdhbnknIGFycmF5cyBhcmUgbm90IGhhbmRsaW5nIGNvcnJlY3RseSB3aGVuIHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cyBtaXhlZCB3aXRoIHRoZSAnYW55JyBlbGVtZW50LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvcmRlcmVkIG9yIG5vdCgkYW5vbiBvciAkaXN0eXBlKSBvciAkY2hvaWNlIj4gPCEtLSBhbGwgdGhlIGVsZW1lbnRzIHNob3VsZCBmb2xsb3cgdGhpcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkiPjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuc3VyaSBhbmQgQG5zdXJpICE9ICcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz4iLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBzZXF1ZW5jZV9icm9rZW4gPSAwLCBjdXJyZW50X25vZGUgPSA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPmZpcnN0X25vZGU8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+KGlzX2Vhcmx5X25vZGVfdmFsaWQ/YXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKGN1cnJlbnRfbm9kZSwgZW52KTpjdXJyZW50X25vZGUpPC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT47ICFzZXF1ZW5jZV9icm9rZW4gJmFtcDsmYW1wOyBjdXJyZW50X25vZGUgIT0gTlVMTDspIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBhcmUgbm90IG1vdmluZyBjdXJyZW50X25vZGUgdG8gbmV4dCBzaWJsaW5nIGhlcmUgaWYgaXQgYW4gYW55IHR5cGUsIGJlY2F1c2Ugd2UgYWxyZWFkeSBoYXZlIGRvbmUgdGhlIG1vdmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShjdXJyZW50X25vZGUsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID1heGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Vhcmx5X25vZGVfdmFsaWQgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGFueSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZWxlbWVudCA9IChheGlvbV9lbGVtZW50X3QgKilheGlvbV9ub2RlX2dldF9kYXRhX2VsZW1lbnQoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXhpb21fZWxlbWVudF9nZXRfcW5hbWUoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXh1dGlsX3FuYW1lX2VxdWFscyhlbGVtZW50X3FuYW1lLCBlbnYsIHFuYW1lKTx4c2w6aWYgdGVzdD0ibm90KEBuc3VyaSkgb3IgQG5zdXJpPScnIj4gfHwgIWF4dXRpbF9zdHJjbXAoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgYXhpb21fZWxlbWVudF9nZXRfbG9jYWxuYW1lKGN1cnJlbnRfZWxlbWVudCwgZW52KSk8L3hzbDppZj4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lYXJseV9ub2RlX3ZhbGlkID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjaGFuZ2VzIHRvIGZvbGxvd2luZyBjaG9vc2UgdGFnIHNob3VsZCBiZSBjaGFuZ2VkIGluIGFub3RoZXIgMiBwbGFjZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAodm9pZCopPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUoKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbXA7Y3VycmVudF9ub2RlLCAmYW1wO2lzX2Vhcmx5X25vZGVfdmFsaWQsIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkY2hvaWNlIj5BWElTMl9UUlVFPC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT5BWElTMl9GQUxTRTwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQVhJUzJfRkFJTFVSRSA9PSAgc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiZmFpbGVkIGluIGJ1aWxkaW5nIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9jaGFyX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgYXh1dGlsX3N0cmR1cChlbnYsIHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXhpczJfcW5hbWVfdCAqcW5hbWUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF4aW9tX2F0dHJpYnV0ZV90ICp0aGVfYXR0cmkgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHFuYW1lID0gYXh1dGlsX3FuYW1lX2NyZWF0ZShlbnYsICJuaWwiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlX2F0dHJpID0gYXhpb21fZWxlbWVudF9nZXRfYXR0cmlidXRlKGN1cnJlbnRfZWxlbWVudCwgZW52LCBxbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudGx5IHRoZXJlaXMgYSBidWcgaW4gdGhlIGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZSwgc28gd2UgaGF2ZSB0byBnbyB0byB0aGlzIGJhZCBtZXRob2QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2F0dHJpYnV0ZV90ICp0aGVfYXR0cmkgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX2NoYXJfdCAqYXR0cmliX3RleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3QgKmF0dHJpYnV0ZV9oYXNoID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZV9oYXNoID0gYXhpb21fZWxlbWVudF9nZXRfYWxsX2F0dHJpYnV0ZXMoY3VycmVudF9lbGVtZW50LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF0dHJpYnV0ZV9oYXNoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX2luZGV4X3QgKmhpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqa2V5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGhpID0gYXh1dGlsX2hhc2hfZmlyc3QoYXR0cmlidXRlX2hhc2gsIGVudik7IGhpOyBoaSA9IGF4dXRpbF9oYXNoX25leHQoZW52LCBoaSkpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3RoaXMoaGksICZhbXA7a2V5LCBOVUxMLCAmYW1wO3ZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3Ryc3RyKChheGlzMl9jaGFyX3QqKWtleSwgIm5pbHxodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2F0dHJpID0gKGF4aW9tX2F0dHJpYnV0ZV90Kil2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGVfYXR0cmkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJfdGV4dCA9IGF4aW9tX2F0dHJpYnV0ZV9nZXRfdmFsdWUodGhlX2F0dHJpLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIGhvcGluZyB0aGF0IGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW4gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgdGhpcyBoYXBwbmVzIHdoZW4gbmFtZSBpcyBpbiBkZWZhdWx0IG5hbWVzcGFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJfdGV4dCA9IGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZV92YWx1ZV9ieV9uYW1lKGN1cnJlbnRfZWxlbWVudCwgZW52LCAibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXR0cmliX3RleHQgJmFtcDsmYW1wOyAwID09IGF4dXRpbF9zdHJjbXAoYXR0cmliX3RleHQsICIxIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWZ0ZXIgYWxsLCB3ZSBmb3VuZCB0aGlzIGlzIGEgZW1wdHkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBheHV0aWxfc3RyZHVwKGVudiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfcW5hbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9mb3VuZCA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjcCA9IHRleHRfdmFsdWU7ICpjcDsgY3AgKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigqY3AgPT0gJzonKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfZm91bmQgID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeF9mb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vZGUgdmFsdWUgY29udGFpbiAgdGhlIHByZWZpeCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9ucyA9IGF4aW9tX2VsZW1lbnRfZmluZF9uYW1lc3BhY2VfdXJpKGN1cnJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X3ZhbHVlLCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVuIGl0IGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCA9IHRleHRfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX25zID0gYXhpb21fZWxlbWVudF9nZXRfZGVmYXVsdF9uYW1lc3BhY2UoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2UgYXJlIGRvbmUgZXh0cmFjdGluZyBpbmZvLCBqdXN0IHNldCB0aGUgZXh0cmFjdGVkIHZhbHVlIHRvIHRoZSBxbmFtZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgKHZvaWQqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCwgLyogY3AgY29udGFpbiB0aGUgbG9jYWxuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3VyaShxbmFtZV9ucywgZW52KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25hbWVzcGFjZV9nZXRfcHJlZml4KHFuYW1lX25zLCBlbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF91cmlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopYXh1dGlsX3VyaV9wYXJzZV9zdHJpbmcoZW52LCB0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgKHZvaWQqKWF4dXRpbF9kdXJhdGlvbl9jcmVhdGVfZnJvbV9zdHJpbmcoZW52LCB0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2NoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBrZWVwcyBpbnRzIGluIGFycmF5cyBmcm9tIHRoZWlyIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCA2NCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IChjaGFyKSgqdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGludHMgaW4gYXJyYXlzIGZyb20gdGhlaXIgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mKGludCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IGF0b2kodGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkX2F0KGFycl9saXN0LCBlbnYsIGksIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcHMgaW50cyBpbiBhcnJheXMgZnJvbSB0aGVpciBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YoYXhpczJfYnl0ZV90KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gYXRvaSh0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcHMgaW50cyBpbiBhcnJheXMgZnJvbSB0aGVpciBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkgPSBhdG9pKHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGludHMgaW4gYXJyYXlzIGZyb20gdGhlaXIgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gYXRvZih0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGZsb2F0IGluIGFycmF5cyBmcm9tIHRoZWlyIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YoZG91YmxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IGF0b2YodGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcHMgaW50NjRfdCBpbiBhcnJheXMgZnJvbSB0aGVpciBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YoaW50NjRfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IGF4dXRpbF9zdHJ0b2wodGV4dF92YWx1ZSwgKGNoYXIqKilOVUxMLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3VpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBrZWVwcyBpbnQ2NF90IGluIGFycmF5cyBmcm9tIHRoZWlyIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IEFYSVMyX01BTExPQyhlbnYtPiBhbGxvY2F0b3IsIHNpemVvZih1aW50NjRfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IGF4dXRpbF9zdHJ0b3VsKHRleHRfdmFsdWUsIChjaGFyKiopTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkX2F0KGFycl9saXN0LCBlbnYsIGksIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlvbV9ub2RlX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gTlVMTDsgLyoganVzdCB0byBhdm9pZCB3YXJuaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpjdXJyZW50X3Byb3BlcnR5X25vZGUgPSBjdXJyZW50X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ub2RlID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKGN1cnJlbnRfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX2RldGFjaChjdXJyZW50X3Byb3BlcnR5X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkX2F0KGFycl9saXN0LCBlbnYsIGksICh2b2lkKiljdXJyZW50X3Byb3BlcnR5X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF4aW9tX25vZGVfZ2V0X2ZpcnN0X2NoaWxkKGN1cnJlbnRfbm9kZSwgZW52KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqY3VycmVudF9wcm9wZXJ0eV9ub2RlID0gYXhpb21fbm9kZV9nZXRfZmlyc3RfY2hpbGQoY3VycmVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX2RldGFjaChjdXJyZW50X3Byb3BlcnR5X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopY3VycmVudF9wcm9wZXJ0eV9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFheHV0aWxfc3RyY2FzZWNtcCAodGV4dF92YWx1ZSAsICJ0cnVlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IEFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvcixzaXplb2YoYXhpczJfYm9vbF90KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3Isc2l6ZW9mKGF4aXMyX2Jvb2xfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkX2F0KGFycl9saXN0LCBlbnYsIGksICh2b2lkKillbGVtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAodm9pZCopYXh1dGlsX2RhdGVfdGltZV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBheHV0aWxfZGF0ZV90aW1lX2Rlc2VyaWFsaXplX2RhdGVfdGltZSgoYXh1dGlsX2RhdGVfdGltZV90KillbGVtZW50LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBWElTMl9GQUlMVVJFID09ICBzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgImZhaWxlZCBpbiBidWlsZGluZyBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVkIDo6ICVzIiwgZW52LT5lcnJvci0+ZXJyb3JfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0VSUk9SX0dFVF9NRVNTQUdFKGVudi0+ZXJyb3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gKHZvaWQqKWF4dXRpbF9iYXNlNjRfYmluYXJ5X2NyZWF0ZShlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGF4dXRpbF9iYXNlNjRfYmluYXJ5X3NldF9lbmNvZGVkX2JpbmFyeSgoYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCopZWxlbWVudCwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQVhJUzJfRkFJTFVSRSA9PSAgc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJmYWlsZWQgaW4gYnVpbGRpbmcgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlZCA6OiAlcyIsIGVudi0+ZXJyb3ItPmVycm9yX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9FUlJPUl9HRVRfTUVTU0FHRShlbnYtPmVycm9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBhZGQgb3RoZXIgdHlwZXMgaGVyZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltcG9zaWJsZSB0byBoYW5kbGUgdGhlIHJlcXVlc3QgdHlwZSAtIHNvIHBsZWFzZSBkbyBpdCBtYW51YWxseSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBWElTMl9GQUlMVVJFID09ICBzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgImZhaWxlZCBpbiBzZXR0aW5nIHRoZSB2YWx1ZSBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnRfcW5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUoZWxlbWVudF9xbmFtZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJfbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9mcmVlKGFycl9saXN0LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAYW55KSI+Y3VycmVudF9ub2RlID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKGN1cnJlbnRfbm9kZSwgZW52KTs8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGFueSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lYXJseV9ub2RlX3ZhbGlkID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlX2Jyb2tlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBhbnkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJmx0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbk9jY3VycyIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIGVsZW1lbnQgb3V0IG9mIG9yZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiAoQG1pbk9jY3VycyA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbk9jY3VycyIvPicpIG9ubHkgaGF2ZSAlZCBlbGVtZW50cyIsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnRfcW5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9mcmVlKGVsZW1lbnRfcW5hbWUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycl9saXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9mcmVlKGFycl9saXN0LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoMCA9PSBheHV0aWxfYXJyYXlfbGlzdF9zaXplKGFycl9saXN0LGVudikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfZnJlZShhcnJfbGlzdCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJfbGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiA8IS0tIG90aGVyd3NlIGZvciAiJG9yZGVyZWQgb3Igbm90KCRhbm9uIG9yICRpc3R5cGUpIiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhbnkiPjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBuc3VyaSBhbmQgQG5zdXJpICE9ICcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz4iLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9xbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSBlbGVtZW50cyBhcmUgbm90IG9yZGVyZWQgd2Ugc2hvdWxkIHN1cmYgYWxsIHRoZSBzaWJsaW5nIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZvciBub24tb3JkZXJlZCBhcnJheXMgd2UgYXJlIG5vdCB1c2luZyBpc19lYXJseV9ub2RlX3ZhbGlkPyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBjdXJyZW50X25vZGUgPSBmaXJzdF9ub2RlOyBjdXJyZW50X25vZGUgIT0gTlVMTDsgPHhzbDppZiB0ZXN0PSJub3QoQGFueSkiPmN1cnJlbnRfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhjdXJyZW50X25vZGUsIGVudik8L3hzbDppZj4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIGFyZSBub3QgbW92aW5nIGN1cnJlbnRfbm9kZSB0byBuZXh0IHNpYmxpbmcgaGVyZSBpZiBpdCBhbiBhbnkgdHlwZSwgYmVjYXVzZSB3ZSBhbHJlYWR5IGhhdmUgZG9uZSB0aGUgbW92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXhpb21fbm9kZV9nZXRfbm9kZV90eXBlKGN1cnJlbnRfbm9kZSwgZW52KSAhPSBBWElPTV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhbnkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhjdXJyZW50X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBhbnkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2VsZW1lbnQgPSAoYXhpb21fZWxlbWVudF90ICopYXhpb21fbm9kZV9nZXRfZGF0YV9lbGVtZW50KGN1cnJlbnRfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3FuYW1lKGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4dXRpbF9xbmFtZV9lcXVhbHMoZWxlbWVudF9xbmFtZSwgZW52LCBxbmFtZSk8eHNsOmlmIHRlc3Q9Im5vdChAbnN1cmkpIG9yIEBuc3VyaT0nJyI+IHx8ICFheHV0aWxfc3RyY21wKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIGF4aW9tX2VsZW1lbnRfZ2V0X2xvY2FsbmFtZShjdXJyZW50X2VsZW1lbnQsIGVudikpPC94c2w6aWY+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdW5kIHRoZSByZXF1cmllZCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lYXJseV9ub2RlX3ZhbGlkID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjaGFuZ2VzIHRvIGZvbGxvd2luZyBjaG9vc2UgdGFnIHNob3VsZCBiZSBjaGFuZ2VkIGluIGFub3RoZXIgMiBwbGFjZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAodm9pZCopPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUoKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbXA7Y3VycmVudF9ub2RlLCAmYW1wO2lzX2Vhcmx5X25vZGVfdmFsaWQsIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkY2hvaWNlIj5BWElTMl9UUlVFPC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT5BWElTMl9GQUxTRTwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFYSVMyX0ZBSUxVUkUgPT0gIHN0YXR1cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgImZhaWxlZCBpbiBidWlsZGluZyBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJWQgOjogJXMiLCBlbnYtPmVycm9yLT5lcnJvcl9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9FUlJPUl9HRVRfTUVTU0FHRShlbnYtPmVycm9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9jaGFyX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBheHV0aWxfc3RyZHVwKGVudiwgdGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF4aXMyX3FuYW1lX3QgKnFuYW1lID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBheGlvbV9hdHRyaWJ1dGVfdCAqdGhlX2F0dHJpID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBxbmFtZSA9IGF4dXRpbF9xbmFtZV9jcmVhdGUoZW52LCAibmlsIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZV9hdHRyaSA9IGF4aW9tX2VsZW1lbnRfZ2V0X2F0dHJpYnV0ZShjdXJyZW50X2VsZW1lbnQsIGVudiwgcW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnRseSB0aGVyZWlzIGEgYnVnIGluIHRoZSBheGlvbV9lbGVtZW50X2dldF9hdHRyaWJ1dGUsIHNvIHdlIGhhdmUgdG8gZ28gdG8gdGhpcyBiYWQgbWV0aG9kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9hdHRyaWJ1dGVfdCAqdGhlX2F0dHJpID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKmF0dHJpYl90ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF90ICphdHRyaWJ1dGVfaGFzaCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVfaGFzaCA9IGF4aW9tX2VsZW1lbnRfZ2V0X2FsbF9hdHRyaWJ1dGVzKGN1cnJlbnRfZWxlbWVudCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYl90ZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhdHRyaWJ1dGVfaGFzaCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF9pbmRleF90ICpoaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmtleTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChoaSA9IGF4dXRpbF9oYXNoX2ZpcnN0KGF0dHJpYnV0ZV9oYXNoLCBlbnYpOyBoaTsgaGkgPSBheHV0aWxfaGFzaF9uZXh0KGVudiwgaGkpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF90aGlzKGhpLCAmYW1wO2tleSwgTlVMTCwgJmFtcDt2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cnN0cigoYXhpczJfY2hhcl90KilrZXksICJuaWx8aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9hdHRyaSA9IChheGlvbV9hdHRyaWJ1dGVfdCopdmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhlX2F0dHJpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9hdHRyaWJ1dGVfZ2V0X3ZhbHVlKHRoZV9hdHRyaSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBob3BpbmcgdGhhdCBhdHRyaWJ1dGUgaXMgc3RvcmVkIGluICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsIHRoaXMgaGFwcG5lcyB3aGVuIG5hbWUgaXMgaW4gZGVmYXVsdCBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliX3RleHQgPSBheGlvbV9lbGVtZW50X2dldF9hdHRyaWJ1dGVfdmFsdWVfYnlfbmFtZShjdXJyZW50X2VsZW1lbnQsIGVudiwgIm5pbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF0dHJpYl90ZXh0ICZhbXA7JmFtcDsgMCA9PSBheHV0aWxfc3RyY21wKGF0dHJpYl90ZXh0LCAiMSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFmdGVyIGFsbCwgd2UgZm91bmQgdGhpcyBpcyBhIGVtcHR5IHN0cmluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgYXh1dGlsX3N0cmR1cChlbnYsICIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2ZvdW5kID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihjcCA9IHRleHRfdmFsdWU7ICpjcDsgY3AgKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCpjcCA9PSAnOicpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfZm91bmQgID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeF9mb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9kZSB2YWx1ZSBjb250YWluICB0aGUgcHJlZml4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9ucyA9IGF4aW9tX2VsZW1lbnRfZmluZF9uYW1lc3BhY2VfdXJpKGN1cnJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X3ZhbHVlLCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlbiBpdCBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwID0gdGV4dF92YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX25zID0gYXhpb21fZWxlbWVudF9nZXRfZGVmYXVsdF9uYW1lc3BhY2UoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHdlIGFyZSBkb25lIGV4dHJhY3RpbmcgaW5mbywganVzdCBzZXQgdGhlIGV4dHJhY3RlZCB2YWx1ZSB0byB0aGUgcW5hbWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2NyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLCAvKiBjcCBjb250YWluIHRoZSBsb2NhbG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3VyaShxbmFtZV9ucywgZW52KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZ2V0X3ByZWZpeChxbmFtZV9ucywgZW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopYXh1dGlsX3VyaV9wYXJzZV9zdHJpbmcoZW52LCB0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgKHZvaWQqKWF4dXRpbF9kdXJhdGlvbl9jcmVhdGVfZnJvbV9zdHJpbmcoZW52LCB0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2NoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGludHMgaW4gYXJyYXlzIGZyb20gdGhlaXIgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgNjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IChjaGFyKSgqdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkX2F0KGFycl9saXN0LCBlbnYsIGksIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4aW9tX2VsZW1lbnRfZ2V0X3RleHQoY3VycmVudF9lbGVtZW50LCBlbnYsIGN1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcHMgaW50cyBpbiBhcnJheXMgZnJvbSB0aGVpciBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YoaW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gYXRvaSh0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBrZWVwcyBpbnRzIGluIGFycmF5cyBmcm9tIHRoZWlyIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IEFYSVMyX01BTExPQyhlbnYtPiBhbGxvY2F0b3IsIHNpemVvZihpbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkgPSBhdG9pKHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIHNob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcHMgaW50cyBpbiBhcnJheXMgZnJvbSB0aGVpciBwb2ludGVycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mKHNob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IGF0b2kodGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGZsb2F0IGluIGFycmF5cyBmcm9tIHRoZWlyIHBvaW50ZXJzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gYXRvZih0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcHMgZmxvYXQgaW4gYXJyYXlzIGZyb20gdGhlaXIgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YoZG91YmxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gYXRvZih0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCB2YWx1ZSBpcyBzZXQgdG8gYSBub24gbmlsbGFibGUgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGludDY0X3QgaW4gYXJyYXlzIGZyb20gdGhlaXIgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mKGludDY0X3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gYXh1dGlsX3N0cnRvbCh0ZXh0X3ZhbHVlLCAoY2hhcioqKU5VTEwsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXBzIGludDY0X3QgaW4gYXJyYXlzIGZyb20gdGhlaXIgcG9pbnRlcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSA9IGF4dXRpbF9zdHJ0b3VsKHRleHRfdmFsdWUsIChjaGFyKiopTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fbm9kZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IE5VTEw7IC8qIGp1c3QgdG8gYXZvaWQgd2FybmluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqY3VycmVudF9wcm9wZXJ0eV9ub2RlID0gY3VycmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhjdXJyZW50X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9kZXRhY2goY3VycmVudF9wcm9wZXJ0eV9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopY3VycmVudF9wcm9wZXJ0eV9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihheGlvbV9ub2RlX2dldF9maXJzdF9jaGlsZChjdXJyZW50X25vZGUsIGVudikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmN1cnJlbnRfcHJvcGVydHlfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X2ZpcnN0X2NoaWxkKGN1cnJlbnRfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9kZXRhY2goY3VycmVudF9wcm9wZXJ0eV9ub2RlLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgKHZvaWQqKWN1cnJlbnRfcHJvcGVydHlfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF4dXRpbF9zdHJjYXNlY21wICh0ZXh0X3ZhbHVlICwgInRydWUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3Isc2l6ZW9mKGF4aXMyX2Jvb2xfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkgPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgKHZvaWQqKWVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLHNpemVvZihheGlzMl9ib29sX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCooPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZF9hdChhcnJfbGlzdCwgZW52LCBpLCAodm9pZCopZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZGF0ZV90aW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gKHZvaWQqKWF4dXRpbF9kYXRlX3RpbWVfY3JlYXRlKGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXhpb21fZWxlbWVudF9nZXRfdGV4dChjdXJyZW50X2VsZW1lbnQsIGVudiwgY3VycmVudF9ub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRleHRfdmFsdWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBheHV0aWxfZGF0ZV90aW1lX2Rlc2VyaWFsaXplX2RhdGVfdGltZSgoYXh1dGlsX2RhdGVfdGltZV90KillbGVtZW50LCBlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihBWElTMl9GQUlMVVJFID09ICBzdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgImZhaWxlZCBpbiBidWlsZGluZyBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkX2F0KGFycl9saXN0LCBlbnYsIGksIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBuaWxsYWJsZSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHZhbHVlIGlzIHNldCB0byBhIG5vbiBuaWxsYWJsZSBlbGVtZW50IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICh2b2lkKilheHV0aWxfYmFzZTY0X2JpbmFyeV9jcmVhdGUoZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheGlvbV9lbGVtZW50X2dldF90ZXh0KGN1cnJlbnRfZWxlbWVudCwgZW52LCBjdXJyZW50X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGV4dF92YWx1ZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGF4dXRpbF9iYXNlNjRfYmluYXJ5X3NldF9lbmNvZGVkX2JpbmFyeSgoYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCopZWxlbWVudCwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQVhJUzJfRkFJTFVSRSA9PSAgc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJmYWlsZWQgaW4gYnVpbGRpbmcgZWxlbWVudCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGRfYXQoYXJyX2xpc3QsIGVudiwgaSwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgdmFsdWUgaXMgc2V0IHRvIGEgbm9uIG5pbGxhYmxlIGVsZW1lbnQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETzogYWRkIG90aGVyIHR5cGVzIGhlcmUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBvc2libGUgdG8gaGFuZGxlIHRoZSByZXF1ZXN0IHR5cGUgLSBzbyBwbGVhc2UgZG8gaXQgbWFudWFsbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoQVhJUzJfRkFJTFVSRSA9PSAgc3RhdHVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudF9xbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUoZWxlbWVudF9xbmFtZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgImZhaWxlZCBpbiBzZXR0aW5nIHRoZSB2YWx1ZSBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGFueSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycl9saXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPiA8IS0tY2xvc2luZyBvdGhlcndpc2UgZm9yICIkb3JkZXJlZCAgb3Igbm90KCRhbm9uIG9yICRpc3R5cGUpIiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4gPCEtLSBjaG9vc2VzIGZvciBvcmRlcmVkIG9yIG5vdCBAb3JkZXJlZCBvciBub3QoJGFub24gb3IgJGlzdHlwZSktLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4gPCEtLSBjbG9zaW5nIHdoZW4gaXQgaXMgYWxsIHRoZSB3YXkgYW4gYXJyYXkgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPiA8IS0tIGNoZWNrIGFycmF5IG9yIG5vdCAtLT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+IDwhLS0gY2xvc2luZyB3aGVuIGl0IGlzIGFuIGVsZW1lbnQgbm90KEBhdHRyaWJ1dGUpIC0tPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+IDwhLS0tIGNob29vc2luZyBmb3IgZWxlbWVudCBvciBhdHRyaWJ1dGUgLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBzaW1wbGUpIj4KLSAgICAgICAgICAgICAgICAgIGlmKGVsZW1lbnRfcW5hbWUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBheHV0aWxfcW5hbWVfZnJlZShlbGVtZW50X3FuYW1lLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9xbmFtZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gPCEtLSBjbG9zaW5nIGZvciBlYWNoIHByb3BlcnR5IC0tPgotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRwYXJ0aWNsZUNsYXNzIj4KLSAgICAgICAgICAgICAgICAqZHBfcGFyZW50ID0gY3VycmVudF9ub2RlOwotICAgICAgICAgICAgICAgICpkcF9pc19lYXJseV9ub2RlX3ZhbGlkID0gaXNfZWFybHlfbm9kZV92YWxpZDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgfQotCi0gICAgICAgICAgYXhpczJfYm9vbF90IEFYSVMyX0NBTEwKLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5faXNfcGFydGljbGUoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcnRpY2xlQ2xhc3MiPgotICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgdm9pZCBBWElTMl9DQUxMCi0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2RlY2xhcmVfcGFyZW50X25hbWVzcGFjZXMoCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlvbV9lbGVtZW50X3QgKnBhcmVudF9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF90ICpuYW1lc3BhY2VzLCBpbnQgKm5leHRfbnNfaW5kZXgpCi0gICAgICAgICAgewotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja19hbnl0aGluZ190b19kZWNsYXJlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGU9J2F4dXRpbF9xbmFtZV90KiciPnllczwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkY2hlY2tfYW55dGhpbmdfdG9fZGVjbGFyZSwgJ3llcycpIj4KLSAgICAgICAgICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX3QgKmVsZW1lbnRfbnMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnFuYW1lX3VyaTsKLSAgICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpxbmFtZV9wcmVmaXg7Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIC8qIEhlcmUgdGhpcyBpcyBhbiBlbXB0eSBmdW5jdGlvbiwgTm90aGluZyB0byBkZWNsYXJlICovCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmF0aXZlUHJvcGVydHlUeXBlIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAKLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlJbnN0YW5jZU5hbWUiPjwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPillbGVtZW50PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX3FuYW1lX3QgbmFtZXNwYWNlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9xbmFtZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3VyaSA9IGF4dXRpbF9xbmFtZV9nZXRfdXJpKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYocW5hbWVfdXJpICZhbXA7JmFtcDsgIWF4dXRpbF9zdHJjbXAocW5hbWVfdXJpLCAiIikpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKHFuYW1lX3ByZWZpeCA9IChheGlzMl9jaGFyX3QqKWF4dXRpbF9oYXNoX2dldChuYW1lc3BhY2VzLCBxbmFtZV91cmksIEFYSVMyX0hBU0hfS0VZX1NUUklORykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9wcmVmaXggPSAoYXhpczJfY2hhcl90KilBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocW5hbWVfcHJlZml4LCAicSVkIiwgKCpuZXh0X25zX2luZGV4KSsrKTsgPCEtLSBqdXN0IGRpZmZlcmVudCBwcmVmaXggZm9yIHRoZSBzcGVjaWFsIGNhc2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF9zZXQobmFtZXNwYWNlcywgcW5hbWVfdXJpLCBBWElTMl9IQVNIX0tFWV9TVFJJTkcsIHFuYW1lX3ByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhcmVudF9lbGVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF9ucyA9IGF4aW9tX25hbWVzcGFjZV9jcmVhdGUoZW52LCBxbmFtZV91cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9wcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9kZWNsYXJlX25hbWVzcGFjZV9hc3N1bWVfcGFyYW1fb3duZXJzaGlwKHBhcmVudF9lbGVtZW50LCBlbnYsIGVsZW1lbnRfbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gPCEtLWNsb3NpbmcgdGhlIGZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiIC0tPgotICAgICAgICAgIH0KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IkBzaW1wbGUiPgotICAgICAgICAgICAgYXhpczJfY2hhcl90KiBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2VyaWFsaXplX3RvX3N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4dXRpbF9oYXNoX3QgKm5hbWVzcGFjZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICp0ZXh0X3ZhbHVlID0gTlVMTDsKLSAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnFuYW1lX3VyaSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpxbmFtZV9wcmVmaXggPSBOVUxMOwotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaXRlbXR5cGUiPgotICAgICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgICAgIGludCBhbGxvY2F0ZWRfbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnRtcF92YWx1ZTsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+IDwhLS0ganVzdCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBmb3IgbW9yZSB0aGFuIG9uZSB0aW1lIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBvc2l0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3JpZ2luYWxOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIAotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5SW5zdGFuY2VOYW1lIj48IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqdXN0UHJvcGVydHlJbnN0YW5jZU5hbWUiPjwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij5lbGVtZW50PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0KLQotICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJWQiLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2J5dGVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJWQiLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgY2hhciBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfRElHSVRfTElNSVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlYyIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBzaG9ydCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdzaG9ydCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVkIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludDY0X3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCBBWElTMl9QUklOVEZfSU5UNjRfRk9STUFUX1NQRUNJRklFUiwgKGludDY0X3QpPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCBBWElTMl9QUklOVEZfVUlOVDY0X0ZPUk1BVF9TUEVDSUZJRVIsICh1aW50NjRfdCk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgZmxvYXQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVmIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGRvdWJsZSBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVmIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2NoYXJfdCogcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KilheHV0aWxfc3RyZHVwKGVudiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF91cmlfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4dXRpbF91cmlfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudiwgQVhJUzJfVVJJX1VOUF9PTUlUVVNFUklORk8pOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheHV0aWxfZHVyYXRpb25fdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXh1dGlsX2R1cmF0aW9uX3NlcmlhbGl6ZV9kdXJhdGlvbig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheHV0aWxfcW5hbWVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfcW5hbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbmFtZXNwYWNlcyBhcmUgZGVjbGFyZWQgaW4gX2RlY2xhcmVfcGFyZW50X25hbWVzcGFjZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV91cmkgPSBheHV0aWxfcW5hbWVfZ2V0X3VyaSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocW5hbWVfdXJpID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX3N0cmR1cChlbnYsIGF4dXRpbF9xbmFtZV9nZXRfbG9jYWxwYXJ0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9wcmVmaXggPSAoYXhpczJfY2hhcl90KilheHV0aWxfaGFzaF9nZXQobmFtZXNwYWNlcywgcW5hbWVfdXJpLCBBWElTMl9IQVNIX0tFWV9TVFJJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBpZihxbmFtZV9wcmVmaXggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAoQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KSkgKyAyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRleHRfdmFsdWUsICIlczolcyIsIHFuYW1lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkZhaWxlZCBpbiBzZXJpYWxpemVfdG9fc3RyaW5nIHZhbHVlIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVmaXggaXMgbm90IGRlY2xhcmVkIGJlb2ZyZSB1c2luZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfYm9vbF90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS10ZXh0X3ZhbHVlID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pPyJ0cnVlIjoiZmFsc2UiOy0tPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikoYXh1dGlsX3N0cmR1cChlbnYsICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KT8idHJ1ZSI6ImZhbHNlIikpOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfZGF0ZV90aW1lX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2RhdGVfdGltZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAgYXh1dGlsX2RhdGVfdGltZV9zZXJpYWxpemVfZGF0ZV90aW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9iYXNlNjRfYmluYXJ5X3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gIGF4dXRpbF9iYXNlNjRfYmluYXJ5X2dldF9lbmNvZGVkX2JpbmFyeSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIHNob3VsZCBiZSBpbiBhbiB1bnJlYWNoYWJsZSBwYXRoIC0tPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tVE9ETzogYWRkIG5ldyBwcm9wZXJ0eSB0eXBlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBub3QgaGFuZGxlIHRoZSBwcm9wZXJ0eSB0eXBlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDwhLS0gVGhlIHNlY3Rpb24gY292ZXJzIHRoZSBsaXN0IHR5cGVzLCB0aGlzIGlzIGEgbG9vcCBhbHdheXMgb2NjdXJzIGp1c3QgMSB0aW1lLS0+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbXR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIj5heHV0aWxfYXJyYXlfbGlzdF90KjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RfbmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqdXN0X25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotIAotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmF0aXZlUHJvcGVydHlUeXBlIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgYXJyYXlsaXN0LS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAdHlwZSkiPmF4aW9tX25vZGVfdCo8L3hzbDp3aGVuPiA8IS0tIHRoZXNlIGFyZSBhbm9ueW1vdXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+KjwveHNsOnRleHQ+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eUluc3RhbmNlTmFtZSI+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQ8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSI+ZWxlbWVudDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgZm9yKGkgPSAwLCBhbGxvY2F0ZWRfbGVuID0gMiwgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBheHV0aWxfc3RyZHVwKGVudiwgIiIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NpemVvZl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52KTsgaSArKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpzZXBlcmF0b3IgPSAoaSA9PSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2l6ZW9mXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYpIC0gMSk/IiI6QURCX0RFRkFVTFRfTElTVF9TRVBFUkFUT1I7Ci0gICAgICAgICAgICAgICAgICBlbGVtZW50ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2F0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9sZW4gKz0gc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfRElHSVRfTElNSVQgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX1JFQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSwgYWxsb2NhdGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlcyVkJXMiLCB0ZXh0X3ZhbHVlLCBlbGVtZW50LCBzZXBlcmF0b3IpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9ieXRlX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9sZW4gKz0gc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfRElHSVRfTElNSVQgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX1JFQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSwgYWxsb2NhdGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlcyVkJXMiLCB0ZXh0X3ZhbHVlLCBlbGVtZW50LCBzZXBlcmF0b3IpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGNoYXIgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2NoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfUkVBTExPQyAoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlLCBhbGxvY2F0ZWRfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVzJWMlcyIsIHRleHRfdmFsdWUsIGVsZW1lbnQsIHNlcGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgc2hvcnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRfbGVuICs9IHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9SRUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUsIGFsbG9jYXRlZF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJXMlZCVzIiwgdGV4dF92YWx1ZSwgZWxlbWVudCwgc2VwZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQ2NF90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9sZW4gKz0gc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfRElHSVRfTElNSVQgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX1JFQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSwgYWxsb2NhdGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlcyIgQVhJUzJfUFJJTlRGX0lOVDY0X0ZPUk1BVF9TUEVDSUZJRVIgIiVzIiwgdGV4dF92YWx1ZSwgZWxlbWVudCwgc2VwZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfUkVBTExPQyAoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlLCBhbGxvY2F0ZWRfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVzIiBBWElTMl9QUklOVEZfVUlOVDY0X0ZPUk1BVF9TUEVDSUZJRVIgIiVzIiwgdGV4dF92YWx1ZSwgZWxlbWVudCwgc2VwZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBmbG9hdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfUkVBTExPQyAoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlLCBhbGxvY2F0ZWRfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVzJWYlcyIsIHRleHRfdmFsdWUsIGVsZW1lbnQsIHNlcGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgZG91YmxlIHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfUkVBTExPQyAoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlLCBhbGxvY2F0ZWRfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVzJWYlcyIsIHRleHRfdmFsdWUsIGVsZW1lbnQsIHNlcGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90KiBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRfbGVuICs9IHNpemVvZiAoYXhpczJfY2hhcl90KSAqIGF4dXRpbF9zdHJsZW4oZWxlbWVudCkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX1JFQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSwgYWxsb2NhdGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlcyVzJXMiLCB0ZXh0X3ZhbHVlLCBlbGVtZW50LCBzZXBlcmF0b3IpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF91cmlfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICB0bXBfdmFsdWUgPSBheHV0aWxfdXJpX3RvX3N0cmluZyhlbGVtZW50LCBlbnYsIEFYSVMyX1VSSV9VTlBfT01JVFVTRVJJTkZPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBheHV0aWxfc3RybGVuKHRtcF92YWx1ZSkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX1JFQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSwgYWxsb2NhdGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlcyVzJXMiLCB0ZXh0X3ZhbHVlLCB0bXBfdmFsdWUsIHNlcGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX2R1cmF0aW9uX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICB0bXBfdmFsdWUgPSBheHV0aWxfZHVyYXRpb25fc2VyaWFsaXplX2R1cmF0aW9uKGVsZW1lbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9sZW4gKz0gc2l6ZW9mIChheGlzMl9jaGFyX3QpICogYXh1dGlsX3N0cmxlbih0bXBfdmFsdWUpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9SRUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUsIGFsbG9jYXRlZF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJXMlcyVzIiwgdGV4dF92YWx1ZSwgdG1wX3ZhbHVlLCBzZXBlcmF0b3IpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9xbmFtZV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfcW5hbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIG5hbWVzcGFjZXMgYXJlIGRlY2xhcmVkIGluIF9kZWNsYXJlX3BhcmVudF9uYW1lc3BhY2VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3VyaSA9IGF4dXRpbF9xbmFtZV9nZXRfdXJpKGVsZW1lbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYocW5hbWVfdXJpID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX3ZhbHVlID0gYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoZWxlbWVudCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9sZW4gKz0gc2l6ZW9mIChheGlzMl9jaGFyX3QpICogYXh1dGlsX3N0cmxlbih0bXBfdmFsdWUpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfUkVBTExPQyAoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlLCBhbGxvY2F0ZWRfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlcyVzJXMiLCB0ZXh0X3ZhbHVlLCB0bXBfdmFsdWUsIHNlcGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV9wcmVmaXggPSAoYXhpczJfY2hhcl90KilheHV0aWxfaGFzaF9nZXQobmFtZXNwYWNlcywgcW5hbWVfdXJpLCBBWElTMl9IQVNIX0tFWV9TVFJJTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYocW5hbWVfcHJlZml4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX3ZhbHVlID0gYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoZWxlbWVudCwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRfbGVuICs9IHNpemVvZiAoYXhpczJfY2hhcl90KSAqIChBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUICArIDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbih0bXBfdmFsdWUpICsgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9SRUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUsIGFsbG9jYXRlZF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiVzJXM6JXMlcyIsIHRleHRfdmFsdWUsIHFuYW1lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF92YWx1ZSwgc2VwZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkZhaWxlZCBpbiBzZXJpYWxpemVfdG9fc3RyaW5nIHZhbHVlIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlZml4IGlzIG5vdCBkZWNsYXJlZCBiZW9mcmUgdXNpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9ib29sX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICAgICA8IS0tdGV4dF92YWx1ZSA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KT8idHJ1ZSI6ImZhbHNlIjstLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSgoZWxlbWVudCk/InRydWUiOiJmYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBheHV0aWxfc3RybGVuKHRtcF92YWx1ZSkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9SRUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUsIGFsbG9jYXRlZF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVzJXMlcyIsIHRleHRfdmFsdWUsIHRtcF92YWx1ZSwgc2VwZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfZGF0ZV90aW1lX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF92YWx1ZSA9IGF4dXRpbF9kYXRlX3RpbWVfc2VyaWFsaXplX2RhdGVfdGltZShlbGVtZW50LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkX2xlbiArPSBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBheHV0aWxfc3RybGVuKHRtcF92YWx1ZSkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9SRUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUsIGFsbG9jYXRlZF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVzJXMlcyIsIHRleHRfdmFsdWUsIHRtcF92YWx1ZSwgc2VwZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfYmFzZTY0X2JpbmFyeV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wX3ZhbHVlID0gYXh1dGlsX2Jhc2U2NF9iaW5hcnlfZ2V0X2VuY29kZWRfYmluYXJ5KGVsZW1lbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRfbGVuICs9IHNpemVvZiAoYXhpczJfY2hhcl90KSAqIGF4dXRpbF9zdHJsZW4odG1wX3ZhbHVlKSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX1JFQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSwgYWxsb2NhdGVkX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJXMlcyVzIiwgdGV4dF92YWx1ZSwgdG1wX3ZhbHVlLCBzZXBlcmF0b3IpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIHNob3VsZCBiZSBpbiBhbiB1bnJlYWNoYWJsZSBwYXRoIC0tPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tVE9ETzogYWRkIG5ldyBwcm9wZXJ0eSB0eXBlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAvKiBjYW4gbm90IGhhbmRsZSB0aGUgcHJvcGVydHkgdHlwZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiovCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGV4dF92YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIAotICAgICAgICBheGlvbV9ub2RlX3QqIEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NlcmlhbGl6ZSgKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlvbV9ub2RlX3QgKnBhcmVudCwgYXhpb21fZWxlbWVudF90ICpwYXJlbnRfZWxlbWVudCwgaW50IHBhcmVudF90YWdfY2xvc2VkLCBheHV0aWxfaGFzaF90ICpuYW1lc3BhY2VzLCBpbnQgKm5leHRfbnNfaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIDwhLS0gZmlyc3QgZGVjbGFyYXRpb24gcGFydCAtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eS9AYXR0cmlidXRlIj4KLSAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICBheGlvbV9hdHRyaWJ1dGVfdCAqdGV4dF9hdHRyaSA9IE5VTEw7Ci0gICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGUgb3IgcHJvcGVydHkvQGF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgYXhpczJfY2hhcl90ICpzdHJpbmdfdG9fc3RyZWFtOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAKLSAgICAgICAgIGF4aW9tX25vZGVfdCAqY3VycmVudF9ub2RlID0gTlVMTDsKLSAgICAgICAgIGludCB0YWdfY2xvc2VkID0gMDsKLQotICAgICAgICAgPCEtLW5vdyBkaXN0aW5ndWlzZSB0aGUgcHJvcGVydGllcyBzcGVjaWZpYyB0byBzaW1wbGUgdHlwZXMgLS0+Ci0gICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBzaW1wbGUiPgotICAgICAgICAgICAgYXhpb21fZGF0YV9zb3VyY2VfdCAqZGF0YV9zb3VyY2UgPSBOVUxMOwotICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOwotICAgICAgICAgICAgYXhpczJfY2hhcl90ICp0ZXh0X3ZhbHVlOwotICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eS9AYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX3QgKm5zMSA9IE5VTEw7Ci0gICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnBfcHJlZml4ID0gTlVMTDsKLSAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgPCEtLSBub24gc2ltcGxlIHR5cGVzIC0tPgotICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfdCAqbnMxID0gTlVMTDsKLQotICAgICAgICAgICAgICAgIGF4aXMyX2NoYXJfdCAqcW5hbWVfdXJpID0gTlVMTDsKLSAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnFuYW1lX3ByZWZpeCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpwX3ByZWZpeCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpczJfYm9vbF90IG5zX2FscmVhZHlfZGVmaW5lZDsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwcm9wZXJ0eS9AaXNhcnJheSI+Ci0gICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgIHZvaWQgKmVsZW1lbnQgPSBOVUxMOwotICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icG9zaXRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIG9yIChAb3Vycz0neWVzJyBhbmQgKEB0eXBlPSd1cmknIG9yIEB0eXBlPSdxbmFtZScgb3IgQHR5cGU9J2RhdGVfdGltZScgb3IgQHR5cGU9J2Jhc2U2NF9iaW5hcnknIG9yIEB0eXBlPSdjaGFyJykpIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0nYXhpczJfY2hhcl90Kicgb3IgQHR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyBvciBAdHlwZT0nYXh1dGlsX2RhdGVfdGltZV90Kicgb3IgQHR5cGU9J2F4aW9tX25vZGVfdConIG9yIEB0eXBlPSdheHV0aWxfZHVyYXRpb25fdConIG9yIEB0eXBlPSdheHV0aWxfdXJpX3QqJyBvciBAdHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgIGF4aXMyX2NoYXJfdCAqdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+OwotICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPl90ZW1wOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90IHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPltBREJfREVGQVVMVF9ESUdJVF9MSU1JVF07Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5L0BhdHRyaWJ1dGUiPgotICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT0xIj4KLSAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnRleHRfdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InByb3BlcnR5IGFuZCAobm90KHByb3BlcnR5L0BhdHRyaWJ1dGUpIG9yIHByb3BlcnR5L0BhdHRyaWJ1dGU9Jycgb3IgcHJvcGVydHkvQG5vdGF0dHJpYnV0ZSkiPgotICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpzdGFydF9pbnB1dF9zdHIgPSBOVUxMOwotICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICplbmRfaW5wdXRfc3RyID0gTlVMTDsKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdGFydF9pbnB1dF9zdHJfbGVuID0gMDsKLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBlbmRfaW5wdXRfc3RyX2xlbiA9IDA7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwhLS0gRm9sbG93aW5nIGlzIGluIHNwZWNpYWwgc2l0dWF0aW9pbiB3aGVyZSBubyBwcm9wZXJ0aWVzIGV4aXN0IC0tPgotICAgICAgICAgICAgICAgYXhpb21fZGF0YV9zb3VyY2VfdCAqZGF0YV9zb3VyY2UgPSBOVUxMOwotICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOwotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdHlwZSkiPiA8IS0tIFNvIHRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIHNlcmlhbGl6YXRpb24gY2FsbCB0cmVlIC0tPgotICAgICAgICAgICAgICAgIGludCBuZXh0X25zX2luZGV4X3ZhbHVlID0gMDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBOVUxMKTsKLSAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgTlVMTCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0eXBlKSI+IDwhLS0gU28gdGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgc2VyaWFsaXphdGlvbiBjYWxsIHRyZWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBheHV0aWxfaGFzaF9tYWtlKGVudik7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRfbnNfaW5kZXggPSAmYW1wO25leHRfbnNfaW5kZXhfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5zdXJpIGFuZCAkbnN1cmkgIT0gJyciPiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMSA9IGF4aW9tX25hbWVzcGFjZV9jcmVhdGUgKGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuIik7IDwhLS0gd2UgYXJlIHVzaW5pZyAiIiBpbnN0ZWFkIG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2hpbGQtbnN1cmkiLz4gIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfc2V0KG5hbWVzcGFjZXMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zdXJpIi8+IiwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HLCBheHV0aWxfc3RyZHVwKGVudiwgIm4iKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zMSA9IE5VTEw7IAotICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBpZiBub3QoQHR5cGUpIHRoZW4gbm8gZG91YnQgdGhlIHBhcmVudCBpcyBOVUxMIC0tPiAKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50X2VsZW1lbnQgPSBheGlvbV9lbGVtZW50X2NyZWF0ZSAoZW52LCBOVUxMLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcmlnaW5hbE5hbWUiLz4iLCBuczEgLCAmYW1wO3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8IS0tIGF4aW9tX2VsZW1lbnRfZGVjbGFyZV9kZWZhdWx0X25hbWVzcGFjZShwYXJlbnRfZWxlbWVudCwgZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuc3VyaSIvPiIpOyAtLT4KLSAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9zZXRfbmFtZXNwYWNlKHBhcmVudF9lbGVtZW50LCBlbnYsIG5zMSwgcGFyZW50KTsKLQotCi0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4gPCEtLW90aGVyd2lzZSBmb3IgQHNpbXBsZSAtLT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGUgb3IgQHNpbXBsZSI+Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbm9kZSA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgZGF0YV9zb3VyY2UgPSAoYXhpb21fZGF0YV9zb3VyY2VfdCAqKWF4aW9tX25vZGVfZ2V0X2RhdGFfZWxlbWVudChjdXJyZW50X25vZGUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGF0YV9zb3VyY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gYXhpb21fZGF0YV9zb3VyY2VfZ2V0X3N0cmVhbShkYXRhX3NvdXJjZSwgZW52KTsgLyogYXNzdW1lIHBhcmVudCBpcyBvZiB0eXBlIGRhdGEgc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyZWFtKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHByb3BlcnR5KSE9MCI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdHlwZSkgYW5kIG5vdChAc2ltcGxlKSI+Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFfc291cmNlID0gYXhpb21fZGF0YV9zb3VyY2VfY3JlYXRlKGVudiwgcGFyZW50LCAmYW1wO2N1cnJlbnRfbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF4aW9tX2RhdGFfc291cmNlX2dldF9zdHJlYW0oZGF0YV9zb3VyY2UsIGVudik7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDwhLS1maXJzdCB3cml0ZSBhdHRyaWJ1dGVzIHRvdGhlIHBhcmVudC0tPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChwcm9wZXJ0eVtAYXR0cmlidXRlXSkhPTAgb3IgQHR5cGUiPgotICAgICAgICAgICAgaWYoIXBhcmVudF90YWdfY2xvc2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBvc2l0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3JpZ2luYWxOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlJbnN0YW5jZU5hbWUiPjwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSI+PCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPmVsZW1lbnQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWVzcGFjZVByZWZpeCI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbnNwcmVmaXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnNwcmVmaXgiLz48eHNsOnRleHQ+OjwveHNsOnRleHQ+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp0ZXh0PjwveHNsOnRleHQ+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icXVhbGlmaWVkUHJvcGVydHlOYW1lIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZXNwYWNlUHJlZml4Ii8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4KLSAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyZW50UHJvcGVydHlJbnN0YW5jZU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fYXR0cmlidXRlX3QqJyBhbmQgQGlzYXJyYXkiPjwhLS0gZm9yIGFueUF0dHJpYnV0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpICZsdDsgYXh1dGlsX2FycmF5X2xpc3Rfc2l6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudFByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOyBpICsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9hdHRyaWJ1dGVfdCAqdGhlX2F0dHJpYiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9hdHRyaWJ1dGVfdCAqZHVwX2F0dHJpYiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnVyaSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnBfcHJlZml4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV90ICpxbmFtZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnZhbHVlID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX2NoYXJfdCAqbG9jYWxfbmFtZSA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9hdHRyaWIgPSBheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnRQcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXhpb21fYXR0cmlidXRlX2dldF9xbmFtZSh0aGVfYXR0cmliLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gYXh1dGlsX3FuYW1lX2dldF91cmkocW5hbWUsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF4aW9tX2F0dHJpYnV0ZV9nZXRfdmFsdWUodGhlX2F0dHJpYiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX25hbWUgPSBheHV0aWxfcW5hbWVfZ2V0X2xvY2FscGFydChxbmFtZSwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXggPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJpKSAvKiBtZWFucyB3ZSBoYXZlIHRvIGdvIGZvciBhIHByZWZpeCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEocF9wcmVmaXggPSAoYXhpczJfY2hhcl90KilheHV0aWxfaGFzaF9nZXQobmFtZXNwYWNlcywgdXJpLCBBWElTMl9IQVNIX0tFWV9TVFJJTkcpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihwX3ByZWZpeCwgIm4lZCIsICgqbmV4dF9uc19pbmRleCkrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3NldChuYW1lc3BhY2VzLCB1cmksIEFYSVMyX0hBU0hfS0VZX1NUUklORywgcF9wcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2RlY2xhcmVfbmFtZXNwYWNlX2Fzc3VtZV9wYXJhbV9vd25lcnNoaXAocGFyZW50X2VsZW1lbnQsIGVudiwgYXhpb21fbmFtZXNwYWNlX2NyZWF0ZSAoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1ICArIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4obG9jYWxfbmFtZSkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKHZhbHVlKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0ZXh0X3ZhbHVlLCAiICVzJXMlcz1cIiVzXCIiLCBwX3ByZWZpeD9wX3ByZWZpeDoiIiwgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9uYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlLCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbnN1cmkgYW5kIEBuc3VyaSAhPSAnJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighKHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX2hhc2hfZ2V0KG5hbWVzcGFjZXMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXggPSAoYXhpczJfY2hhcl90KilBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocF9wcmVmaXgsICJuJWQiLCAoKm5leHRfbnNfaW5kZXgpKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3NldChuYW1lc3BhY2VzLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPiIsIEFYSVMyX0hBU0hfS0VZX1NUUklORywgcF9wcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfZGVjbGFyZV9uYW1lc3BhY2VfYXNzdW1lX3BhcmFtX293bmVyc2hpcChwYXJlbnRfZWxlbWVudCwgZW52LCBheGlvbV9uYW1lc3BhY2VfY3JlYXRlIChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXggPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBoZXJlIG9ubHkgc2ltcGxlIHR5cGUgcG9zc2libGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCAoNjQpIGJ5dGVzIGlzIHVzZWQgdG8gdGhlIHN0b3JlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBhbmQgdGhlIG5hbWVzcGFjZSBwcmVmaXggKyAiOiIgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURCX0RFRkFVTFRfRElHSVRfTElNSVQgKyA1ICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gaGVyZSBheHV0aWxfc3RybGVuKCI6PVwiXCIiKSArIDEoZm9yIE5VTEwgdGVybWluYXRvcikgPSA1IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0ZXh0X3ZhbHVlLCAiICVzJXMlcz1cIiVkXCIiLCBwX3ByZWZpeD9wX3ByZWZpeDoiIiwgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWUsIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2J5dGVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiAlcyVzJXM9XCIlZFwiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAgJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZSwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiAlcyVzJXM9XCIlY1wiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlLCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIHNob3J0IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIHNob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiAlcyVzJXM9XCIlZFwiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlLCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludDY0X3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBREJfREVGQVVMVF9ESUdJVF9MSU1JVCArIDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiAlcyVzJXM9XCIiIEFYSVMyX1BSSU5URl9JTlQ2NF9GT1JNQVRfU1BFQ0lGSUVSICAiXCIiLCBwX3ByZWZpeD9wX3ByZWZpeDoiIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZSwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURCX0RFRkFVTFRfRElHSVRfTElNSVQgKyA1ICArIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiAlcyVzJXM9XCIiIEFYSVMyX1BSSU5URl9VSU5UNjRfRk9STUFUX1NQRUNJRklFUiAgIlwiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWUsIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgZmxvYXQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQURCX0RFRkFVTFRfRElHSVRfTElNSVQgKyA1ICArIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRleHRfdmFsdWUsICIgJXMlcyVzPVwiJWZcIiIsIHBfcHJlZml4P3BfcHJlZml4OiIiLCAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZSwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBkb3VibGUgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUICsgNSAgKyBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0ZXh0X3ZhbHVlLCAiICVzJXMlcz1cIiVmXCIiLCBwX3ByZWZpeD9wX3ByZWZpeDoiIiwgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWUsIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSAgKyBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0ZXh0X3ZhbHVlLCAiICVzJXMlcz1cIiVzXCIiLCBwX3ByZWZpeD9wX3ByZWZpeDoiIiwgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWUsIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX3VyaV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4dXRpbF91cmlfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudiwgQVhJUzJfVVJJX1VOUF9PTUlUVVNFUklORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RvX3N0cmVhbSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1ICArIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZSkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0cmluZ190b19zdHJlYW0sICIgJXMlcyVzPVwiJXNcIiIsIHBfcHJlZml4P3BfcHJlZml4OiIiLCAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsICB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHN0cmluZ190b19zdHJlYW0sIGF4dXRpbF9zdHJsZW4oc3RyaW5nX3RvX3N0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHN0cmluZ190b19zdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX2R1cmF0aW9uX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBheHV0aWxfZHVyYXRpb25fc2VyaWFsaXplX2R1cmF0aW9uKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fc3RyZWFtID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyaW5nX3RvX3N0cmVhbSwgIiAlcyVzJXM9XCIlc1wiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RyaW5nX3RvX3N0cmVhbSwgYXh1dGlsX3N0cmxlbihzdHJpbmdfdG9fc3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgc3RyaW5nX3RvX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheHV0aWxfcW5hbWVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9xbmFtZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfdXJpID0gIGF4dXRpbF9xbmFtZV9nZXRfdXJpKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZihxbmFtZV91cmkgJmFtcDsmYW1wOyAhYXh1dGlsX3N0cmNtcChxbmFtZV91cmksICIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKHFuYW1lX3ByZWZpeCA9IChheGlzMl9jaGFyX3QqKWF4dXRpbF9oYXNoX2dldChuYW1lc3BhY2VzLCBxbmFtZV91cmksIEFYSVMyX0hBU0hfS0VZX1NUUklORykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHFuYW1lX3ByZWZpeCwgInElZCIsICgqbmV4dF9uc19pbmRleCkgKyspOyA8IS0tIGp1c3QgZGlmZmVyZW50IHByZWZpeCBmb3IgdGhlIHNwZWNpYWwgY2FzZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfc2V0KG5hbWVzcGFjZXMsIHFuYW1lX3VyaSwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HLCBxbmFtZV9wcmVmaXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfZGVjbGFyZV9uYW1lc3BhY2VfYXNzdW1lX3BhcmFtX293bmVyc2hpcChwYXJlbnRfZWxlbWVudCwgZW52LCBheGlvbV9uYW1lc3BhY2VfY3JlYXRlIChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3ByZWZpeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiArIGF4dXRpbF9zdHJsZW4ocW5hbWVfcHJlZml4KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRleHRfdmFsdWUsICIlcyVzJXMiLCBxbmFtZV9wcmVmaXgsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfcW5hbWVfZ2V0X2xvY2FscGFydCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX3N0cmR1cChlbnYsIGF4dXRpbF9xbmFtZV9nZXRfbG9jYWxwYXJ0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fc3RyZWFtID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyaW5nX3RvX3N0cmVhbSwgIiAlcyVzJXM9XCIlc1wiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIHRleHRfdmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdHJpbmdfdG9fc3RyZWFtLCBheHV0aWxfc3RybGVuKHN0cmluZ190b19zdHJlYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT5hbGxvY2F0b3IsIHN0cmluZ190b19zdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9ib29sX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ib29sX3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS10ZXh0X3ZhbHVlID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pPyJ0cnVlIjoiZmFsc2UiOy0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSgoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik/InRydWUiOiJmYWxzZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RvX3N0cmVhbSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1ICArIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZSkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0cmluZ190b19zdHJlYW0sICIgJXMlcyVzPVwiJXNcIiIsIHBfcHJlZml4P3BfcHJlZml4OiIiLCAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsICB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHN0cmluZ190b19zdHJlYW0sIGF4dXRpbF9zdHJsZW4oc3RyaW5nX3RvX3N0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHN0cmluZ190b19zdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2RhdGVfdGltZV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2RhdGVfdGltZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9ICBheHV0aWxfZGF0ZV90aW1lX3NlcmlhbGl6ZV9kYXRlX3RpbWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190b19zdHJlYW0gPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSAgKyBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKHRleHRfdmFsdWUpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdHJpbmdfdG9fc3RyZWFtLCAiICVzJXMlcz1cIiVzXCIiLCBwX3ByZWZpeD9wX3ByZWZpeDoiIiwgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCAgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdHJpbmdfdG9fc3RyZWFtLCBheHV0aWxfc3RybGVuKHN0cmluZ190b19zdHJlYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCBzdHJpbmdfdG9fc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9iYXNlNjQgX2JpbmFyeV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAgYXh1dGlsX2Jhc2U2NF9iaW5hcnlfZ2V0X2VuY29kZWRfYmluYXJ5KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fc3RyZWFtID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyaW5nX3RvX3N0cmVhbSwgIiAlcyVzJXM9XCIlc1wiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RyaW5nX3RvX3N0cmVhbSwgYXh1dGlsX3N0cmxlbihzdHJpbmdfdG9fc3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgc3RyaW5nX3RvX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2RlY2xhcmVfcGFyZW50X25hbWVzcGFjZXMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBwYXJlbnRfZWxlbWVudCwgbmFtZXNwYWNlcywgbmV4dF9uc19pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemVfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudiwgbmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdG9fc3RyZWFtID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUgICsgQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoc3RyaW5nX3RvX3N0cmVhbSwgIiAlcyVzJXM9XCIlc1wiIiwgcF9wcmVmaXg/cF9wcmVmaXg6IiIsIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RyaW5nX3RvX3N0cmVhbSwgYXh1dGlsX3N0cmxlbihzdHJpbmdfdG9fc3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgc3RyaW5nX3RvX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1UT0RPOiBhZGQgbmV3IGF0dHJpYnV0ZXMgdHlwZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBub3QgaGFuZGxlIHRoZSBhdHRyaWJ1dGUgdHlwZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+IDwhLS0gd2hldGhlciB0aGlzIGlzIGFuIGFueUF0dHJpYnV0ZSBvciBub3QgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG9wdGlvbmFsKSI+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fYXR0cmlidXRlX3QqJyBhbmQgQGlzYXJyYXkpIj48IS0tIGZvciBhbnlBdHRyaWJ1dGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5pbCB2YWx1ZSBmb3VuZCBpbiBub24tb3B0aW9uYWwgYXR0cmlidXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIDwveHNsOmlmPiA8IS0tIGlmIGZvciBhdHRyaWJ1dGUsIC0tPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZSI+Ci0gICAgICAgICAgICAgIHN0cmluZ190b19zdHJlYW0gPSAiJmd0OyI7IDwhLS0gVGhlIGVuZGluZyB0YWcgb2YgdGhlIHBhcmVudCAtLT4KLSAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RyaW5nX3RvX3N0cmVhbSwgYXh1dGlsX3N0cmxlbihzdHJpbmdfdG9fc3RyZWFtKSk7Ci0gICAgICAgICAgICAgIHRhZ19jbG9zZWQgPSAxOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICA8IS0tIGVuZCBicmFja2V0IGZvciBpZighcGFyZW50X3RhZ19jbG9zZWQpLS0+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHByb3BlcnR5W0BhdHRyaWJ1dGVdKSE9MCBvciBAdHlwZSI+Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAc2ltcGxlIj4KLSAgICAgICAgICAgICAgIGlmKCFwYXJlbnRfdGFnX2Nsb3NlZCAmYW1wOyZhbXA7ICF0YWdfY2xvc2VkKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9ICImZ3Q7IjsgPCEtLSBUaGUgZW5kaW5nIHRhZyBvZiB0aGUgcGFyZW50IC0tPgotICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZSwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICA8IS0tIGhvdyBpZiB0aGlzIHR5cGUgaXMgYSBxbmFtZSA6KCwgc2ltcGx5IHdlIGFyZSBub3QgaGFuZGxpbmcgdGhhdCBzaXR1YXRpb24uLiAtLT4KLSAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2VyaWFsaXplX3RvX3N0cmluZyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudiwgbmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlLCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwb3NpdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPmF4dXRpbF9hcnJheV9saXN0X3QqPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmF0aXZlUHJvcGVydHlUeXBlIj4gPCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9yaWdpbmFsTmFtZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlJbnN0YW5jZU5hbWUiPjwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSI+PCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPmVsZW1lbnQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJlbnRQcm9wZXJ0eUluc3RhbmNlTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGhlcmUgb25seSBzaW1wbGUgdHlwZSBwb3NzaWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgaWYocGFyZW50X3RhZ19jbG9zZWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fYXR0cmlidXRlX3QqJyBhbmQgQGlzYXJyYXkiPjwhLS0gZm9yIGFueUF0dHJpYnV0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgJmx0OyBheHV0aWxfYXJyYXlfbGlzdF9zaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50UHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7IGkgKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fYXR0cmlidXRlX3QgKnRoZV9hdHRyaWIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2F0dHJpYnV0ZV90ICpkdXBfYXR0cmliID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnVyaSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfY2hhcl90ICpwX3ByZWZpeCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX3QgKnFuYW1lID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKnZhbHVlID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9jaGFyX3QgKmxvY2FsX25hbWUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25hbWVzcGFjZV90ICpuczEgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlX2F0dHJpYiA9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudFByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYXhpb21fYXR0cmlidXRlX2dldF9xbmFtZSh0aGVfYXR0cmliLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSA9IGF4dXRpbF9xbmFtZV9nZXRfdXJpKHFuYW1lLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXhpb21fYXR0cmlidXRlX2dldF92YWx1ZSh0aGVfYXR0cmliLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX25hbWUgPSBheHV0aWxfcW5hbWVfZ2V0X2xvY2FscGFydChxbmFtZSwgZW52KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJlZml4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih1cmkpIC8qIG1lYW5zIHdlIGhhdmUgdG8gZ28gZm9yIGEgcHJlZml4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX2hhc2hfZ2V0KG5hbWVzcGFjZXMsIHVyaSwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocF9wcmVmaXgsICJuJWQiLCAoKm5leHRfbnNfaW5kZXgpKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfc2V0KG5hbWVzcGFjZXMsIHVyaSwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HLCBwX3ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2RlY2xhcmVfbmFtZXNwYWNlX2Fzc3VtZV9wYXJhbV9vd25lcnNoaXAocGFyZW50X2VsZW1lbnQsIGVudiwgYXhpb21fbmFtZXNwYWNlX2NyZWF0ZSAoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuczEgPSBheGlvbV9uYW1lc3BhY2VfY3JlYXRlIChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBfYXR0cmliID0gYXhpb21fYXR0cmlidXRlX2NyZWF0ZSAoZW52LCBsb2NhbF9uYW1lLCB2YWx1ZSwgbnMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHBhcmVudCBoZXJlIGNhbiBiZSBkYXRhX3NvdXJjZSBub2RlLCBub3QgZWxlbWVudCBub2RlIHNob3VsZCBiZSBmaXhlZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2FkZF9hdHRyaWJ1dGUgKHBhcmVudF9lbGVtZW50LCBlbnYsIGR1cF9hdHRyaWIsIHBhcmVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbnN1cmkgYW5kIEBuc3VyaSAhPSAnJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZighKHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX2hhc2hfZ2V0KG5hbWVzcGFjZXMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXggPSAoYXhpczJfY2hhcl90KilBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocF9wcmVmaXgsICJuJWQiLCAoKm5leHRfbnNfaW5kZXgpKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3NldChuYW1lc3BhY2VzLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPiIsIEFYSVMyX0hBU0hfS0VZX1NUUklORywgcF9wcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfZGVjbGFyZV9uYW1lc3BhY2VfYXNzdW1lX3BhcmFtX293bmVyc2hpcChwYXJlbnRfZWxlbWVudCwgZW52LCBheGlvbV9uYW1lc3BhY2VfY3JlYXRlIChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMxID0gYXhpb21fbmFtZXNwYWNlX2NyZWF0ZSAoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBuczEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPiA8IS0tIGNsb3NlIGZvciB0ZXN0IG5zdXJpIGFuZCBuc3VyaSAhPSAiIiAtLT4KLQotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJWQiLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHBhcmVudCBoZXJlIGNhbiBiZSBkYXRhX3NvdXJjZSBub2RlLCBub3QgZWxlbWVudCBub2RlIHNob3VsZCBiZSBmaXhlZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfYWRkX2F0dHJpYnV0ZSAocGFyZW50X2VsZW1lbnQsIGVudiwgdGV4dF9hdHRyaSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2J5dGVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJWQiLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2FkZF9hdHRyaWJ1dGUgKHBhcmVudF9lbGVtZW50LCBlbnYsIHRleHRfYXR0cmksIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9ESUdJVF9MSU1JVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlLCAiJWMiLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2FkZF9hdHRyaWJ1dGUgKHBhcmVudF9lbGVtZW50LCBlbnYsIHRleHRfYXR0cmksIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBzaG9ydCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfRElHSVRfTElNSVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVkIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2F0dHJpID0gYXhpb21fYXR0cmlidXRlX2NyZWF0ZSAoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCB0ZXh0X3ZhbHVlLCBuczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9hZGRfYXR0cmlidXRlIChwYXJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X2F0dHJpLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgaW50NjRfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsIEFYSVMyX1BSSU5URl9JTlQ2NF9GT1JNQVRfU1BFQ0lGSUVSLCAoaW50NjRfdCk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2FkZF9hdHRyaWJ1dGUgKHBhcmVudF9lbGVtZW50LCBlbnYsIHRleHRfYXR0cmksIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgdGV4dF92YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsIEFYSVMyX1BSSU5URl9VSU5UNjRfRk9STUFUX1NQRUNJRklFUiwgKHVpbnQ2NF90KTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hdHRyaSA9IGF4aW9tX2F0dHJpYnV0ZV9jcmVhdGUgKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgdGV4dF92YWx1ZSwgbnMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfYWRkX2F0dHJpYnV0ZSAocGFyZW50X2VsZW1lbnQsIGVudiwgdGV4dF9hdHRyaSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGZsb2F0IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAoYXhpczJfY2hhcl90KikgQVhJUzJfTUFMTE9DIChlbnYtPiBhbGxvY2F0b3IsIHNpemVvZiAoYXhpczJfY2hhcl90KSAqIEFEQl9ERUZBVUxUX0RJR0lUX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWUsICIlZiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hdHRyaSA9IGF4aW9tX2F0dHJpYnV0ZV9jcmVhdGUgKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgdGV4dF92YWx1ZSwgbnMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfYWRkX2F0dHJpYnV0ZSAocGFyZW50X2VsZW1lbnQsIGVudiwgdGV4dF9hdHRyaSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGRvdWJsZSBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IChheGlzMl9jaGFyX3QqKSBBWElTMl9NQUxMT0MgKGVudi0+IGFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfRElHSVRfTElNSVQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZSwgIiVmIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2F0dHJpID0gYXhpb21fYXR0cmlidXRlX2NyZWF0ZSAoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCB0ZXh0X3ZhbHVlLCBuczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9hZGRfYXR0cmlidXRlIChwYXJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X2F0dHJpLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIHRleHRfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfY2hhcl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2F0dHJpID0gYXhpb21fYXR0cmlidXRlX2NyZWF0ZSAoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCB0ZXh0X3ZhbHVlLCBuczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9hZGRfYXR0cmlidXRlIChwYXJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X2F0dHJpLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX3VyaV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZSA9IGF4dXRpbF91cmlfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudiwgQVhJUzJfVVJJX1VOUF9PTUlUVVNFUklORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hdHRyaSA9IGF4aW9tX2F0dHJpYnV0ZV9jcmVhdGUgKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgdGV4dF92YWx1ZSwgbnMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfYWRkX2F0dHJpYnV0ZSAocGFyZW50X2VsZW1lbnQsIGVudiwgdGV4dF9hdHRyaSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9kdXJhdGlvbl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gYXh1dGlsX2R1cmF0aW9uX3NlcmlhbGl6ZV9kdXJhdGlvbig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hdHRyaSA9IGF4aW9tX2F0dHJpYnV0ZV9jcmVhdGUgKGVudiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IiwgdGV4dF92YWx1ZSwgbnMxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfYWRkX2F0dHJpYnV0ZSAocGFyZW50X2VsZW1lbnQsIGVudiwgdGV4dF9hdHRyaSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9xbmFtZV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3VyaSA9ICBheHV0aWxfcW5hbWVfZ2V0X3VyaSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocW5hbWVfdXJpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEocW5hbWVfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX2hhc2hfZ2V0KG5hbWVzcGFjZXMsIHFuYW1lX3VyaSwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3ByZWZpeCA9IChheGlzMl9jaGFyX3QqKUFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihxbmFtZV9wcmVmaXgsICJxJWQiLCAoKm5leHRfbnNfaW5kZXgpICsrICk7IDwhLS0ganVzdCBkaWZmZXJlbnQgcHJlZml4IGZvciB0aGUgc3BlY2lhbCBjYXNlIC0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX3NldChuYW1lc3BhY2VzLCBxbmFtZV91cmksIEFYSVMyX0hBU0hfS0VZX1NUUklORywgcW5hbWVfcHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfZGVjbGFyZV9uYW1lc3BhY2VfYXNzdW1lX3BhcmFtX293bmVyc2hpcChwYXJlbnRfZWxlbWVudCwgZW52LCBheGlvbV9uYW1lc3BhY2VfY3JlYXRlIChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3VyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfcHJlZml4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyhlbnYtPiBhbGxvY2F0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiAoQURCX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWF9MSU1JVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbihheHV0aWxfcW5hbWVfZ2V0X2xvY2FscGFydCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpKSArIDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZSwgIiVzJXMlcyIsIHFuYW1lX3VyaT9xbmFtZV9wcmVmaXg6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3VyaT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2FkZF9hdHRyaWJ1dGUgKHBhcmVudF9lbGVtZW50LCBlbnYsIHRleHRfYXR0cmksIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+YWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4aXMyX2Jvb2xfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLXRleHRfdmFsdWUgPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik/InRydWUiOiJmYWxzZSI7LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gIChheGlzMl9jaGFyX3QqKSgoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik/YXh1dGlsX3N0cmR1cChlbnYsICJ0cnVlIik6YXh1dGlsX3N0cmR1cChlbnYsICJmYWxzZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2FkZF9hdHRyaWJ1dGUgKHBhcmVudF9lbGVtZW50LCBlbnYsIHRleHRfYXR0cmksIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+YWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9kYXRlX3RpbWVfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAgYXh1dGlsX2RhdGVfdGltZV9zZXJpYWxpemVfZGF0ZV90aW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2F0dHJpID0gYXhpb21fYXR0cmlidXRlX2NyZWF0ZSAoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCB0ZXh0X3ZhbHVlLCBuczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9hZGRfYXR0cmlidXRlIChwYXJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X2F0dHJpLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXhpczJfYmFzZTY0X2JpbmFyeV90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSAgYXh1dGlsX2Jhc2U2NF9iaW5hcnlfZ2V0X2VuY29kZWRfYmluYXJ5KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2F0dHJpID0gYXhpb21fYXR0cmlidXRlX2NyZWF0ZSAoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLCB0ZXh0X3ZhbHVlLCBuczEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9hZGRfYXR0cmlidXRlIChwYXJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X2F0dHJpLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2RlY2xhcmVfcGFyZW50X25hbWVzcGFjZXMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBwYXJlbnRfZWxlbWVudCwgbmFtZXNwYWNlcywgbmV4dF9uc19pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemVfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudiwgbmFtZXNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0X3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYXR0cmkgPSBheGlvbV9hdHRyaWJ1dGVfY3JlYXRlIChlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIsIHRleHRfdmFsdWUsIG5zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fZWxlbWVudF9hZGRfYXR0cmlidXRlIChwYXJlbnRfZWxlbWVudCwgZW52LCB0ZXh0X2F0dHJpLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IGFkZCBuZXcgYXR0cmlidXRlcyB0eXBlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuIG5vdCBoYW5kbGUgdGhlIGF0dHJpYnV0ZSB0eXBlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2VsZW1lbnQgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9hdHRyaSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAb3B0aW9uYWwpIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlvbV9hdHRyaWJ1dGVfdConIGFuZCBAaXNhcnJheSkiPjwhLS0gZm9yIGFueUF0dHJpYnV0ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTmlsIHZhbHVlIGZvdW5kIGluIG5vbi1vcHRpb25hbCBhdHRyaWJ1dGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+IAotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPiAKLSAgICAgICAgICAgICAgICAgIH08IS0tIEVuZCBicmFja2V0IGZvciBpZihwYXJlbnRfdGFnX2Nsb3NlZCktLT4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc2ltcGxlIj48L3hzbDp3aGVuPiA8IS0tSnVzdCB0byBpZ25vcmUgcGFyc2luZyBmb2xsb3dpbmcgY29kZSBhdCBzaW1wbGUgdHlwZXMtLT4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAKLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgIGlmKDAgPT0gYXh1dGlsX3N0cmNtcCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmN1cnJlbnRfY2hvaWNlLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5zdXJpIGFuZCBAbnN1cmkgIT0gJyciPgotICAgICAgICAgICAgICAgICAgICAgICBpZighKHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopYXh1dGlsX2hhc2hfZ2V0KG5hbWVzcGFjZXMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HKSkpCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYocF9wcmVmaXgsICJuJWQiLCAoKm5leHRfbnNfaW5kZXgpKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfc2V0KG5hbWVzcGFjZXMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HLCBwX3ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX2VsZW1lbnRfZGVjbGFyZV9uYW1lc3BhY2VfYXNzdW1lX3BhcmFtX293bmVyc2hpcChwYXJlbnRfZWxlbWVudCwgZW52LCBheGlvbV9uYW1lc3BhY2VfY3JlYXRlIChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPiA8IS0tIGNsb3NlIGZvciB0ZXN0IG5zdXJpIGFuZCBuc3VyaSAhPSAiIiAtLT4KLQotICAgICAgICAgICAgICAgICAgIGlmICghPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBtaW5PY2N1cnM9MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBuZWVkIHRvIGNvbXBsYWluIGZvciBtaW5vY2N1cnM9MCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBqdXN0IGlnbm9yZSB0aGUgZWxlbWVudC4uIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGp1c3Qgd3JpdGUgYSBuaWwgZWxlbWVudCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9pbnB1dF9zdHIgPSAoYXhpczJfY2hhcl90KilBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsIHNpemVvZihheGlzMl9jaGFyX3QpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSArIGF4dXRpbF9zdHJsZW4ocF9wcmVmaXgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmxlbigiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOm5pbD1cIjFcIiIpKSk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXh1dGlsX3N0cmxlbigiPDovPiIpICsgMSA9IDUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdGFydF9pbnB1dF9zdHIsICImbHQ7JXMlczx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOm5pbD1cIjFcIi8mZ3Q7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeD9wX3ByZWZpeDoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBheHV0aWxfc3RybGVuKHN0YXJ0X2lucHV0X3N0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT5hbGxvY2F0b3Isc3RhcnRfaW5wdXRfc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQG5pbGxhYmxlKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBtaW5PY2N1cnM9MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBuZWVkIHRvIGNvbXBsYWluIGZvciBtaW5vY2N1cnM9MCBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBqdXN0IGlnbm9yZSB0aGUgZWxlbWVudC4uIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGp1c3QgcmV0dXJuIGFuIGVycm9yIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTmlsIHZhbHVlIGZvdW5kIGluIG5vbi1uaWxsYWJsZSBwcm9wZXJ0eSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBzdGFydF9pbnB1dF9zdHIgPSAoYXhpczJfY2hhcl90KilBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsIHNpemVvZihheGlzMl9jaGFyX3QpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0ICsgYXh1dGlsX3N0cmxlbihwX3ByZWZpeCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RybGVuKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpKSk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBheHV0aWxfc3RybGVuKCI8Oj4iKSArIDEgPSA0IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXh1dGlsX3N0cmxlbigiJmx0OzomZ3Q7IikgKyAxID0gNCAqLwotICAgICAgICAgICAgICAgICAgICAgZW5kX2lucHV0X3N0ciA9IChheGlzMl9jaGFyX3QqKUFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwgc2l6ZW9mKGF4aXMyX2NoYXJfdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUgKyBheHV0aWxfc3RybGVuKHBfcHJlZml4KSArIGF4dXRpbF9zdHJsZW4oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBheHV0aWxfc3RybGVuKCImbHQ7LzomZ3Q7IikgKyAxID0gNSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXh1dGlsX3N0cmxlbigiPC86PiIpICsgMSA9IDUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlcyBhcnJheXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICogUGFyc2luZyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+IGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0YXJ0X2lucHV0X3N0ciwgIiZsdDslcyVzPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXg/cF9wcmVmaXg6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0YXJ0X2lucHV0X3N0ciwgIiZsdDslcyVzPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4mZ3Q7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJlZml4P3BfcHJlZml4OiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaW5wdXRfc3RyX2xlbiA9IGF4dXRpbF9zdHJsZW4oc3RhcnRfaW5wdXRfc3RyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZW5kX2lucHV0X3N0ciwgIiZsdDsvJXMlczx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Jmd0OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeD9wX3ByZWZpeDoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5wdXRfc3RyX2xlbiA9IGF4dXRpbF9zdHJsZW4oZW5kX2lucHV0X3N0cik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGF4dXRpbF9hcnJheV9saXN0X3NpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSAmbHQ7IGNvdW50OyBpICsrKQotICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gYXh1dGlsX2FycmF5X2xpc3RfZ2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52LCBpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gZWxlbWVudCkgPCEtLXZhbGlkdHkgb2YgaW5kaXZpZHVhbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICA8IS0tIGZvciBlYWNoIG5vbiBhdHRyaWJ1dGUgcHJvcGVydGllcyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhbiBlbGVtZW50LS0+Ci0gICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICogcGFyc2luZyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGhvdyB0byBidWlsZCBhbGwgdGhlIG91cnMgdGhpbmdzIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAaXNhcnJheSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHN0YXJ0X2lucHV0X3N0ciwgIiZsdDslcyVzPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmVmaXg/cF9wcmVmaXg6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9wcmVmaXggJmFtcDsmYW1wOyBheHV0aWxfc3RyY21wKHBfcHJlZml4LCAiIikpPyI6IjoiIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzdGFydF9pbnB1dF9zdHIsICImbHQ7JXMlczx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Jmd0OyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ByZWZpeD9wX3ByZWZpeDoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX3ByZWZpeCAmYW1wOyZhbXA7IGF4dXRpbF9zdHJjbXAocF9wcmVmaXgsICIiKSk/IjoiOiIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9pbnB1dF9zdHJfbGVuID0gYXh1dGlsX3N0cmxlbihzdGFydF9pbnB1dF9zdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbmRfaW5wdXRfc3RyLCAiJmx0Oy8lcyVzPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4mZ3Q7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJlZml4P3BfcHJlZml4OiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfcHJlZml4ICZhbXA7JmFtcDsgYXh1dGlsX3N0cmNtcChwX3ByZWZpeCwgIiIpKT8iOiI6IiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2lucHV0X3N0cl9sZW4gPSBheHV0aWxfc3RybGVuKGVuZF9pbnB1dF9zdHIpOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+IDwhLS0gQXMgdGhpcyBzaG93cywgZWxlbWVudHMgYXJlIG5vdCB3cml0aW5nIHRoZWlyIHRhZ3MgaGVyZSBmcm9tIHN0cmVhbS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgZG9uZSB1c2luZyBheGlvbSBtYW5pcHVhbGF0aW9uIGFib3ZlLi4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9pc19wYXJ0aWNsZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50X2Nsb3NlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Ii4uL0B0eXBlIj5BWElTMl9GQUxTRTwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgbWVhbiB0aGUgYW5vbnltb3VzIGhlYWRlciBpcyB3cml0aW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPkFYSVMyX0ZBTFNFPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPkFYSVMyX1RSVUU8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCA8IS0tIFRoaXMgd2lsbCBiZSBlaXRoZXIgZWxlbWVudCAoaW4gYXJyYXkpIG9yIGp1c3QgdGhlIHByb3BlcnR5IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LCBjdXJyZW50X25vZGUsIHBhcmVudF9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9pc19wYXJ0aWNsZSgpIHx8IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudF9jbG9zZWQiLz4sIG5hbWVzcGFjZXMsIG5leHRfbnNfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5faXNfcGFydGljbGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBpbnQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgQVhJUzJfUFJJTlRGX0lOVDMyX0ZPUk1BVF9TUEVDSUZJRVIsICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgQVhJUzJfUFJJTlRGX0lOVDMyX0ZPUk1BVF9TUEVDSUZJRVIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBBWElTMl9QUklOVEZfVUlOVDMyX0ZPUk1BVF9TUEVDSUZJRVIsICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgQVhJUzJfUFJJTlRGX1VJTlQzMl9GT1JNQVRfU1BFQ0lGSUVSLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHN0YXJ0X2lucHV0X3N0ciwgc3RhcnRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBlbmRfaW5wdXRfc3RyLCBlbmRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGNoYXIgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sICIlYyIsICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgIiVjIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdGFydF9pbnB1dF9zdHIsIHN0YXJ0X2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgZW5kX2lucHV0X3N0ciwgZW5kX2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgY2hhciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCAiJWMiLCAqKCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sICIlYyIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sICIlZCIsICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgIiVkIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdGFydF9pbnB1dF9zdHIsIHN0YXJ0X2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgZW5kX2lucHV0X3N0ciwgZW5kX2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBzaG9ydCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sICIlZCIsICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgIiVkIiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdGFydF9pbnB1dF9zdHIsIHN0YXJ0X2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgZW5kX2lucHV0X3N0ciwgZW5kX2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgIiVodSIsICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgIiVodSIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5PVEU6IGFycmF5cyBmb3IgaW50NjRfdCwgZmxvYXQsIGludCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4gdGhleSBhcmUgc3RvcmVkIGluIHBvaW50ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgaW50NjRfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgQVhJUzJfUFJJTlRGX0lOVDY0X0ZPUk1BVF9TUEVDSUZJRVIsIChpbnQ2NF90KSooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KillbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgQVhJUzJfUFJJTlRGX0lOVDY0X0ZPUk1BVF9TUEVDSUZJRVIsIChpbnQ2NF90KSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHN0YXJ0X2lucHV0X3N0ciwgc3RhcnRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBlbmRfaW5wdXRfc3RyLCBlbmRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGludDY0X3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBBWElTMl9QUklOVEZfVUlOVDY0X0ZPUk1BVF9TUEVDSUZJRVIsICh1aW50NjRfdCkqKCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIEFYSVMyX1BSSU5URl9VSU5UNjRfRk9STUFUX1NQRUNJRklFUiwgKHVpbnQ2NF90KTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgZmxvYXQgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCAiJWYiLCAoZmxvYXQpKigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4qKWVsZW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAodGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCAiJWYiLCAoZmxvYXQpPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdGFydF9pbnB1dF9zdHIsIHN0YXJ0X2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgZW5kX2lucHV0X3N0ciwgZW5kX2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBkb3VibGUgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgIiVmIiwgKGRvdWJsZSkqKCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiopZWxlbWVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sICIlZiIsIChkb3VibGUpPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdGFydF9pbnB1dF9zdHIsIHN0YXJ0X2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGF4dXRpbF9zdHJsZW4odGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgZW5kX2lucHV0X3N0ciwgZW5kX2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9jaGFyX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9jaGFyX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHN0YXJ0X2lucHV0X3N0ciwgc3RhcnRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPl90ZW1wID0gYXh1dGlsX3htbF9xdW90ZV9zdHJpbmcoZW52LCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIEFYSVMyX1RSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPl90ZW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPl90ZW1wLCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPl90ZW1wKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+X3RlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBlbmRfaW5wdXRfc3RyLCBlbmRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF91cmlfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF91cmlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9IGF4dXRpbF91cmlfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudiwgQVhJUzJfVVJJX1VOUF9PTUlUVVNFUklORk8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHN0YXJ0X2lucHV0X3N0ciwgc3RhcnRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBlbmRfaW5wdXRfc3RyLCBlbmRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIGF4dXRpbF9kdXJhdGlvbl90IHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSBheHV0aWxfZHVyYXRpb25fc2VyaWFsaXplX2R1cmF0aW9uKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgYXh1dGlsX3FuYW1lX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfcW5hbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGFuZGxlZCBhYm92ZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBzdGFydF9pbnB1dF9zdHIsIHN0YXJ0X2lucHV0X3N0cl9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETzogRG8gdGhpcyBpbiBzaW5nbGUgc3RlcCAtLT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfdXJpID0gIGF4dXRpbF9xbmFtZV9nZXRfdXJpKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZihxbmFtZV91cmkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIShxbmFtZV9wcmVmaXggPSAoYXhpczJfY2hhcl90KilheHV0aWxfaGFzaF9nZXQobmFtZXNwYWNlcywgcW5hbWVfdXJpLCBBWElTMl9IQVNIX0tFWV9TVFJJTkcpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVfcHJlZml4ID0gKGF4aXMyX2NoYXJfdCopQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCBzaXplb2YgKGF4aXMyX2NoYXJfdCkgKiBBREJfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYX0xJTUlUKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHFuYW1lX3ByZWZpeCwgInElZCIsICgqbmV4dF9uc19pbmRleCkgKysgKTsgPCEtLSBqdXN0IGRpZmZlcmVudCBwcmVmaXggZm9yIHRoZSBzcGVjaWFsIGNhc2UgLS0+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfc2V0KG5hbWVzcGFjZXMsIHFuYW1lX3VyaSwgQVhJUzJfSEFTSF9LRVlfU1RSSU5HLCBxbmFtZV9wcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9lbGVtZW50X2RlY2xhcmVfbmFtZXNwYWNlX2Fzc3VtZV9wYXJhbV9vd25lcnNoaXAocGFyZW50X2VsZW1lbnQsIGVudiwgYXhpb21fbmFtZXNwYWNlX2NyZWF0ZSAoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV91cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3ByZWZpeCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+ID0gKGF4aXMyX2NoYXJfdCopIEFYSVMyX01BTExPQyAoZW52LT4gYWxsb2NhdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChheGlzMl9jaGFyX3QpICogKEFEQl9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVhfTElNSVQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJsZW4oYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KSkgKyAyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYodGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCAiJXMlcyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZV91cmk/cW5hbWVfcHJlZml4OiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lX3VyaT8iOiI6IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFkZCBheGlzMl9ib29sX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ib29sX3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSh0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KT8idHJ1ZSI6ImZhbHNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGQgbm9kZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fbm9kZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGFub24gb3IgJGlzdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9IGF4aW9tX25vZGVfdG9fc3RyaW5nKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEBhbnkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgYXh1dGlsX3N0cmxlbih0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQGFueSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfc3RyZWFtX3dyaXRlKHN0cmVhbSwgZW52LCBlbmRfaW5wdXRfc3RyLCBlbmRfaW5wdXRfc3RyX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3ZhbHVlXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSBOVUxMOyAvKiBqdXN0IHRvIGJ5cGFzcyB0aGUgd2FybmluZyB1bnVzZWQgdmFyaWFibGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9hZGRfY2hpbGQocGFyZW50LCBlbnYsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+ID0gYXh1dGlsX2RhdGVfdGltZV9zZXJpYWxpemVfZGF0ZV90aW1lKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9YXh1dGlsX2Jhc2U2NF9iaW5hcnlfZ2V0X2VuY29kZWRfYmluYXJ5KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRhbm9uIG9yICRpc3R5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgc3RhcnRfaW5wdXRfc3RyLCBzdGFydF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3N0cmVhbV93cml0ZShzdHJlYW0sIGVudiwgdGV4dF92YWx1ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBheHV0aWxfc3RybGVuKHRleHRfdmFsdWVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkYW5vbiBvciAkaXN0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9zdHJlYW1fd3JpdGUoc3RyZWFtLCBlbnYsIGVuZF9pbnB1dF9zdHIsIGVuZF9pbnB1dF9zdHJfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBhbGwgdGhlIHR5cGVzIHRoYXQgc2hvdWxkIGJlIGZyZWVkLi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiB1bmtub3duIHR5cGUgb3IgYSBwcmltaXRpdmUuIGhhbmRsZSB0aGlzIG1hbnVhbGx5IGZvciB1bmtub3duIHR5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICA8IS0tIGNsb3NlIHRhZ3MgYXJyYXlzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhpcyB0d28gc2hvdWxkIGJlIGZyZWVkIGFmdGVyIHRoZSBsb29wIGZvciBhcnJheS0tPgotICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvcixzdGFydF9pbnB1dF9zdHIpOwotICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvcixlbmRfaW5wdXRfc3RyKTsKLSAgICAgICAgICAgICAgICAgfSA8IS0tIGVsc2UgZm9yIG5vbiBuaWxsYWJsZSAtLT4KLQotICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPiA8IS0tIG90aGV3aXNlIGZvciBub24gYXR0cmlidXRlcyAtLT4KLSAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0eXBlKSBhbmQgbm90KEBzaW1wbGUpIj4gPCEtLSBTbyB0aGlzIGlzIHRoZSByb290IG9mIHRoZSBzZXJpYWxpemF0aW9uIGNhbGwgdHJlZSAtLT4KLSAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICAgICAgaWYobmFtZXNwYWNlcykKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9oYXNoX2luZGV4X3QgKmhpOwotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvciAoaGkgPSBheHV0aWxfaGFzaF9maXJzdChuYW1lc3BhY2VzLCBlbnYpOyBoaTsgaGkgPSBheHV0aWxfaGFzaF9uZXh0KGVudiwgaGkpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2hhc2hfdGhpcyhoaSwgTlVMTCwgTlVMTCwgJmFtcDt2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgdmFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfaGFzaF9mcmVlKG5hbWVzcGFjZXMsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICByZXR1cm4gcGFyZW50OwotICAgICAgICB9Ci0KLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icHJvcGVydHkiPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+YXh1dGlsX2FycmF5X2xpc3RfdCo8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iQ05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAKLSAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJuYXRpdmVQcm9wZXJ0eVR5cGUiPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICA8IS0tIEp1c3QgdG8gaWRlbnRpeSB0aGUgcG9pbnRlciB0byBhcnJheXMgLS0+Ci0gICAgICAgICAgICAgIDwhLS0gU2ltbWlsYXIgdG8gbmF0aXZlIHByb3BlcnR5IHR5cGUgZXhjZXB0IGZvciBzaG9yLCB0aW50LCBmbG9hdCwgZG91YmxlIC0tPgotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IlByb3BlcnR5VHlwZUFycmF5UGFyYW0iPiA8IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQHR5cGUpIj5heGlvbV9ub2RlX3QqPC94c2w6d2hlbj4gPCEtLSB0aGVzZSBhcmUgYW5vbnltb3VzIC0tPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIG9yIEB0eXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yIEB0eXBlPSdheGlzMl9ieXRlX3QnIG9yIEB0eXBlPSdheGlzMl9ib29sX3QnIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0Pio8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5SW5zdGFuY2VOYW1lIj48IS0tdGhlc2UgYXJlIHVzZWQgaW4gYXJyYXlzIHRvIHRha2UgdGhlIG5hdGl2ZSB0eXBlLS0+Ci0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNhcnJheSI+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWVsZW1lbnQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Imp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSI+PCEtLXRoZXNlIGFyZSB1c2VkIGluIGFycmF5cyB0byB0YWtlIHRoZSBuYXRpdmUgdHlwZS0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPmVsZW1lbnQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29uc3RWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSdheGlzMl9jaGFyX3QqJyBvciBAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj5jb25zdCA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEdldHRlciBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gYnkgIFByb3BlcnR5IE51bWJlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZ2V0X3Byb3BlcnR5PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4oCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogZ2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gQVhJUzJfQ0FMTAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJHByb3BlcnR5VHlwZT0ndWludDY0X3QnIG9yICRwcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkcHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yICRwcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJHByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyBvciAkcHJvcGVydHlUeXBlPSdjaGFyJyBvciAkcHJvcGVydHlUeXBlPSdpbnQnIG9yICRwcm9wZXJ0eVR5cGU9J2Zsb2F0JyBvciAkcHJvcGVydHlUeXBlPSdkb3VibGUnIG9yICRwcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+KTApOwotICAgICAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikwKTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogc2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAaXNhcnJheSkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uc3RWYWx1ZSIvPjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PiBhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPikKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICBheGlzMl9ib29sX3Qgbm9uX25pbF9leGlzdHMgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGNob2ljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmN1cnJlbnRfY2hvaWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7IAotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICBzaXplID0gYXh1dGlsX2FycmF5X2xpc3Rfc2l6ZShhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHVuYm91bmQpIj4KLSAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplICZndDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhPY2N1cnMiLz4pCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBoYXMgZXhjZWVkIHRoZSBtYXhPY2N1cnMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhPY2N1cnMiLz4pIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICBpZiAoc2l6ZSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluT2NjdXJzIi8+KQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGhhcyBsZXNzIHRoYW4gbWluT2NjdXJzKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluT2NjdXJzIi8+KSIpOwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpICZsdDsgc2l6ZTsgaSArKyApCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gYXh1dGlsX2FycmF5X2xpc3RfZ2V0KGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpKQotICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9uaWxfZXhpc3RzID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9Im5vdChAbmlsbGFiZSkgYW5kIG5vdChAbWluT2NjdXJzPScwJykiPgotICAgICAgICAgICAgICAgICAgICBpZighbm9uX25pbF9leGlzdHMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiQWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gaXMgYmVpbmcgc2V0IHRvIE5VTEwsIGJ1dCBpdCBpcyBub3QgYSBudWxsYWJsZSBvciBtaW5PY2N1cnM9MCBlbGVtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4gPCEtLSBjbG9zZSBmb3IgdGhlIGlzYXJyYXkgLS0+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFibGUpIGFuZCBub3QoQG1pbk9jY3Vycz0nMCcpIGFuZCAoQG91cnMgb3Igbm90KCRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJHByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRwcm9wZXJ0eVR5cGU9J3VpbnQ2NF90JyBvciAkcHJvcGVydHlUeXBlPSdjaGFyJyBvciAkcHJvcGVydHlUeXBlPSdpbnQnIG9yICRwcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkcHJvcGVydHlUeXBlPSdmbG9hdCcgb3IgJHByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciAkcHJvcGVydHlUeXBlPSdheGlzMl9ieXRlX3QnIG9yICRwcm9wZXJ0eVR5cGU9J2RvdWJsZScgb3IgJHByb3BlcnR5VHlwZT0naW50NjRfdCcgb3IgJHByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JykpIj4KLSAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBpcyBiZWluZyBzZXQgdG8gTlVMTCwgYnV0IGl0IGlzIG5vdCBhIG51bGxhYmxlIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDwhLS0gZmlyc3QgcmVzZXQgd2hhdGV2ZXIgYWxyZWFkeSBpbiB0aGVyZSAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVzZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudik7Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IihAb3VycyBvciBub3QoJHByb3BlcnR5VHlwZT0ndW5zaWduZWQgY2hhcicgb3IgJHByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyBvciAkcHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgJHByb3BlcnR5VHlwZT0ndWludDY0X3QnIG9yICRwcm9wZXJ0eVR5cGU9J2NoYXInIG9yICRwcm9wZXJ0eVR5cGU9J2ludCcgb3IgJHByb3BlcnR5VHlwZT0nc2hvcnQnIG9yICRwcm9wZXJ0eVR5cGU9J2Zsb2F0JyBvciAkcHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yICRwcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJHByb3BlcnR5VHlwZT0nZG91YmxlJyBvciAkcHJvcGVydHlUeXBlPSdpbnQ2NF90JyBvciAkcHJvcGVydHlUeXBlPSdheGlzMl9ib29sX3QnKSkiPgotICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBXZSBhcmUgYWxyZWFkeSBkb25lICovCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihub25fbmlsX2V4aXN0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBlbHNlIGlzX3ZhbGlkXyogPSBBWElTMl9GQUxTRSBpcyBzZXQgYnkgdGhlIGFib3ZlIHJlc2V0IGZ1bmN0aW9uIC0tPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J2F4aXMyX2NoYXJfdConIGFuZCBub3QoQGlzYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IChheGlzMl9jaGFyX3QgKilheHV0aWxfc3RyZHVwKGVudiwgYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTlVMTCA9PSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJFcnJvciBhbGxvY2F0aW5nIG1lbWVvcnkgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+OwotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmN1cnJlbnRfY2hvaWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iOwotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNFbnVtPTEiPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtIj5hZGJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz5fZW51bV90PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBzcGVjaWFsaXplZCBlbnVtIGdldHRlciBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW0iLz4gQVhJUzJfQ0FMTAotICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9nZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9lbnVtKAotICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIC0xKTsKLSAgICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCAtMSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVudW1GYWNldCI+Ci0gICAgICAgICAgICAgICAgIGlmIChheHV0aWxfc3RyY21wKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL0BjYXBzLWNuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz47Ci0gICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8qIEVycm9yOiBub25lIG9mIHRoZSBzdHJpbmdzIG1hdGNoZWQ7IGludmFsaWQgZW51bSB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIAotICAgICAgICAgICAgIAotICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogc3BlY2lhbGl6ZWQgZW51bSBzZXR0ZXIgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2VudW0oCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnN0VmFsdWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW0iLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+IGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgIGF4aXMyX2Jvb2xfdCBub25fbmlsX2V4aXN0cyA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBBWElTMl9GQUlMVVJFKTsKLQotICAgICAgICAgICAgICAgIDwhLS0gZmlyc3QgcmVzZXQgd2hhdGV2ZXIgYWxyZWFkeSBpbiB0aGVyZSAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVzZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJlbnVtRmFjZXQiPgotICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9AY2Fwcy1jbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gKGF4aXMyX2NoYXJfdCAqKWF4dXRpbF9zdHJkdXAoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkVycm9yIHNldHRpbmcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz46IHVuZGVmaW5lZCBlbnVtIHZhbHVlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBpZihOVUxMID09IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmN1cnJlbnRfY2hvaWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnN1cmkiLz46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iOwotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogR2V0IGl0aCBlbGVtZW50IG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPiBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZ2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fYXQoCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgaSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz4gcmV0X3ZhbDsKLQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3VpbnQ2NF90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdzaG9ydCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nY2hhcicgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdmbG9hdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nZG91YmxlJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPikwKTsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pMCk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIE5VTEwpOwotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPikwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXRfdmFsID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPilheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpOwotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCcgb3IgQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnJldF92YWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPikwOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU2V0IHRoZSBpdGggZWxlbWVudCBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2F0KAotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGksCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uc3RWYWx1ZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+PHhzbDp0ZXh0PiBhcmdfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZvaWQgKmVsZW1lbnQgPSBOVUxMOwotICAgICAgICAgICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgICAgICBpbnQgbm9uX25pbF9jb3VudDsKLSAgICAgICAgICAgICAgICBheGlzMl9ib29sX3Qgbm9uX25pbF9leGlzdHMgPSBBWElTMl9GQUxTRTsKLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyBvciBAdHlwZT0nYXhpczJfYm9vbF90JyBvciBAdHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciAgQHR5cGU9J2F4aXMyX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPjx4c2w6dGV4dD4gcHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyBvciBAdHlwZT0nYXhpczJfYm9vbF90JyBvciBAdHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciBAdHlwZT0nYXhpczJfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgIGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09ICooKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPilheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpKSkKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPT0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmF0aXZlUHJvcGVydHlUeXBlIi8+KWF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSkpCi0gICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkY2hvaWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+Y3VycmVudF9jaG9pY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiI7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsgCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyBvciBAdHlwZT0nYXhpczJfYm9vbF90JyBvciBAdHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciBAdHlwZT0nYXhpczJfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgICBub25fbmlsX2V4aXN0cyA9IEFYSVMyX1RSVUU7IC8qIG5vIHdheSB0byBjaGVjayBmb3IgbmlsbCBmb3IgZWFjaCBlbGVtZW50cyBmb3IgcHJpbWl0aXZlIHR5cGVzICovCi0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9uaWxfZXhpc3RzID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBheHV0aWxfYXJyYXlfbGlzdF9zaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDAsIG5vbl9uaWxfY291bnQgPSAwOyBqICZsdDsgc2l6ZTsgaiArKyApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpID09IGopIGNvbnRpbnVlOyA8IS0tIHNob3VsZCBub3QgY291bnQgdGhlIGl0aCBlbGVtZW50IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMICE9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbl9uaWxfY291bnQgKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fbmlsX2V4aXN0cyA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihub25fbmlsX2NvdW50ID49IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWluT2NjdXJzIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAbmlsbGFiZSkgYW5kIG5vdChAbWluT2NjdXJzPScwJykiPiA8IS0tIGlmIG1pbk9jY3Vycz0wIHRoZW4gbm8gbmVlZCB0byBoYXZlIGVycm9yIG1lc3NhZ2VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBub25fbmlsX2NvdW50ICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIlNpemUgb2YgdGhlIGFycmF5IG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGlzIGJlaW5uZyBzZXQgdG8gYmUgc21hbGxlciB0aGFuIHRoZSBzcGVjaWZpY2VkIG51bWJlciBvZiBtaW5PY2N1cnMoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiLz4pIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0ibm90KEBuaWxsYWJlKSBhbmQgbm90KEBtaW5PY2N1cnM9JzAnKSI+Ci0gICAgICAgICAgICAgICAgICAgaWYoIW5vbl9uaWxfZXhpc3RzKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJBbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBpcyBiZWluZyBzZXQgdG8gTlVMTCwgYnV0IGl0IGlzIG5vdCBhIG51bGxhYmxlIG9yIG1pbk9jY3Vycz0wIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBheHV0aWxfYXJyYXlfbGlzdF9jcmVhdGUoZW52LCAxMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlcmUgYWxyZWFkeSBleGlzdCBhbiBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgZWxlbWVudCA9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSk7Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBlbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIDwhLS0gU29tZSByZXBlYXRlZCBjb2RlIC0tPgotICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgYWxsIGluc2lkZSB0aGUgY2hvb3NlLCBwcm9wZXJ0eUluc3RhbmNlTmFtZSA9IGVsZW1lbnQgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgY2hhcicgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYnl0ZV90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ib29sX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2NoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2RvdWJsZScgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmcmVlIGludHMsIGludDY0X3RzLCBmbG9hdCBpbiBhcnJheS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcCBwcmltdGl2ZXMgYXMgcG9pbnRlcnMgaW4gYXJyYXN5LCBzbyBuZWVkIHRvIGZyZWUgdGhlbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPCEtLSBmcmVlIGF4aXMyX2NoYXJfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2NoYXJfdConIGFuZCBub3QoQGlzYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBub2RlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlvbV9ub2RlX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9mcmVlX3RyZWUgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3VyaV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2R1cmF0aW9uX2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZGF0ZV90aW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2RhdGVfdGltZV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYmFzZTY0X2JpbmFyeV9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kdXJhdGlvbl9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBhbGwgdGhlIHR5cGVzIHRoYXQgc2hvdWxkIGJlIGZyZWVkLi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiB1bmtub3duIHR5cGUgb3IgYSBwcmltaXRpdmUuIFBsZWFzZSBmcmVlIHRoaXMgbWFudWFsbHkqLwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9IkBuaWxsYWJlIG9yIEBtaW5PY2N1cnM9JzAnIj4KLSAgICAgICAgICAgICAgICAgICAgaWYoIW5vbl9uaWxfZXhpc3RzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vIG5lZWQgdG8gd29ycnkgZnVydGhlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IEFYSVMyX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3Rfc2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAsIGVudiwgaSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2hvdWxkIG5vdCBjaGVjayB0aGUgY3VycmVudF9jaG9pY2UgaGVyZSwgc2luY2UgdGhpcyBpcyBhIHNldHRpbmcgdG8gbnVsbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIG9yIEB0eXBlPSdheGlzMl9ib29sX3QnIG9yIEB0eXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yIEB0eXBlPSdheGlzMl9ieXRlX3QnIj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+cHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9ICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwgc2l6ZW9mKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPikpOwotICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJGYWlsZWQgaW4gYWxsb2NhdHRpbmcgbWVtb3J5IGZvciBuZXcgdmFsdWUgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KnB0cl9wYXJhbV88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSA8eHNsOnRleHQ+YXJnXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9zZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICwgZW52LCBpLCA8eHNsOnRleHQ+cHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSdheGlzMl9jaGFyX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3Rfc2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAsIGVudiwgaSwgYXh1dGlsX3N0cmR1cChlbnYsIDx4c2w6dGV4dD5hcmdfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3Rfc2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAsIGVudiwgaSwgPHhzbDp0ZXh0PmFyZ188L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGNob2ljZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+Y3VycmVudF9jaG9pY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiI7Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQWRkIHRvIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnN0VmFsdWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gYXJnXzwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyBvciBAdHlwZT0nYXhpczJfYm9vbF90JyBvciBAdHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciBAdHlwZT0nYXhpczJfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIi8+PHhzbDp0ZXh0PiBwdHJfcGFyYW1fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+OwotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBBWElTMl9GQUlMVVJFKTsKLQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCcgb3IgQHR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICBpZihOVUxMID09IGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdCA9Im5vdChAbmlsbGFiZSkgYW5kIG5vdChAbWluT2NjdXJzPScwJykiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJBbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBpcyBiZWluZyBzZXQgdG8gTlVMTCwgYnV0IGl0IGlzIG5vdCBhIG51bGxhYmxlIG9yIG1pbk9jY3Vycz0wIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7IDwhLS0ganVzdCBubyBuZWVkIHRvIHdhaXN0IG1vcmUgdGltZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IGF4dXRpbF9hcnJheV9saXN0X2NyZWF0ZShlbnYsIDEwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkZhaWxlZCBpbiBhbGxvY2F0dGluZyBtZW1vcnkgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndW5zaWduZWQgY2hhcicgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3VpbnQ2NF90JyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyBvciBAdHlwZT0nYXhpczJfYm9vbF90JyBvciBAdHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciBAdHlwZT0nYXhpczJfYnl0ZV90JyI+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PnB0cl9wYXJhbV88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsIHNpemVvZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4pKTsKLSAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiRmFpbGVkIGluIGFsbG9jYXR0aW5nIG1lbW9yeSBmb3IgbmV3IHZhbHVlIG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PipwdHJfcGFyYW1fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gPHhzbDp0ZXh0PmFyZ188L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz47Ci0gICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfYWRkKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAsIGVudiwgPHhzbDp0ZXh0PnB0cl9wYXJhbV88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0nYXhpczJfY2hhcl90KiciPgotICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gLCBlbnYsIGF4dXRpbF9zdHJkdXAoZW52LCA8eHNsOnRleHQ+YXJnXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPikpOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gLCBlbnYsIDx4c2w6dGV4dD5hcmdfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBhcnJheS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IEFYSVMyX0NBTEwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zaXplb2ZfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgLTEpOwotICAgICAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgLTEpOwotICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBheHV0aWxfYXJyYXlfbGlzdF9zaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiByZW1vdmUgdGhlIGl0aCBlbGVtZW50LCBzYW1lIGFzIHNldF9uaWxfYXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9yZW1vdmVfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9hdCgKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fbmlsX2F0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgZW52LCBpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICA8L3hzbDppZj4gPCEtLSBjbG9zZXMgdGhlIGlzYXJyYXkgLS0+Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIHJlc2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVzZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgICAgdm9pZCAqZWxlbWVudCA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpc2FycmF5IG9yIEBvdXJzIG9yIEB0eXBlPSdheGlzMl9jaGFyX3QqJyBvciBAdHlwZT0nYXh1dGlsX3FuYW1lX3QqJyBvciBAdHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyBvciBAdHlwZT0nYXh1dGlsX3VyaV90Kicgb3IgQHR5cGU9J2F4dXRpbF9kYXRlX3RpbWVfdConIG9yIEB0eXBlPSdheHV0aWxfYmFzZTY0X2JpbmFyeV90KiciPgotICAgICAgICAgICAgICAgIDwhLS0gaGFuZGxlcyBhcnJheXMgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBheHV0aWxfYXJyYXlfbGlzdF9zaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgJmx0OyBjb3VudDsgaSArKykKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSk7Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8IS0tIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBjYW4gYmUgaW5zaWRlIGFycmF5IG9yIGV4aXN0IGluZGVwZW5kZW50bHktLT4KLSAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICA8IS0tIGhvdyB0byBmcmVlIGFsbCB0aGUgb3VycyB0aGluZ3MgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2Zsb2F0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAaXNhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZyZWUgaW50cywgaW50NjRfdHMsIGZsb2F0IGluIGFycmF5LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBrZWVwIHByaW10aXZlcyBhcyBwb2ludGVycyBpbiBhcnJhc3ksIHNvIG5lZWQgdG8gZnJlZSB0aGVtICovCi0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPCEtLSBmcmVlIGF4aXMyX2NoYXJfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2NoYXJfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBub2RlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlvbV9ub2RlX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9mcmVlX3RyZWUgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3VyaV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2R1cmF0aW9uX2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZGF0ZV90aW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2RhdGVfdGltZV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYmFzZTY0X2JpbmFyeV9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kdXJhdGlvbl9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBhbGwgdGhlIHR5cGVzIHRoYXQgc2hvdWxkIGJlIGZyZWVkLi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiB1bmtub3duIHR5cGUgb3IgYSBwcmltaXRpdmUuIFBsZWFzZSBmcmVlIHRoaXMgbWFudWFsbHkqLwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPCEtLS94c2w6aWYtLT4KLSAgICAgICAgICAgICAgICA8IS0tIGNsb3NlIHRhZ3MgYXJyYXlzIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGlzYXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgIDwveHNsOmlmPiA8IS0tY2xvc2UgZm9yIHRlc3Qgb2YgcHJpbWl0aXZlIHR5cGVzIC0tPgotICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gQVhJUzJfRkFMU0U7IAotICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogQ2hlY2sgd2hldGhlciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBpcyBuaWxsCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBheGlzMl9ib29sX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5faXNfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9uaWwoCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgQVhJUzJfVFJVRSk7Ci0gICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIEFYSVMyX1RSVUUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICByZXR1cm4gITx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gdG8gbmlsbCAoY3VycmVudGx5IHRoZSBzYW1lIGFzIHJlc2V0KQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fbmlsKAotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVzZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBpc2FycmF5Ij4KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIENoZWNrIHdoZXRoZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gaXMgbmlsbCBhdCBpCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBheGlzMl9ib29sX3QgQVhJUzJfQ0FMTAotICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5faXNfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9uaWxfYXQoCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIEFYSVMyX1RSVUUpOwotICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBBWElTMl9UUlVFKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPT0gQVhJUzJfRkFMU0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPT0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+IHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9PSBheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBTZXQgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gdG8gbmlsbCBhdCBpCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMCi0gICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9zZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPl9uaWxfYXQoCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2b2lkICplbGVtZW50ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICAgICAgYXhpczJfYm9vbF90IG5vbl9uaWxfZXhpc3RzID0gQVhJUzJfRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBpbnQgayA9IDA7Ci0KLSAgICAgICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIEFYSVMyX0ZBSUxVUkUpOwotCi0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPT0gQVhJUzJfRkFMU0UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8IS0tIGp1c3QgYXNzdW1lIGl0IHMgbnVsbCAtLT4KLSAgICAgICAgICAgICAgICAgICAgbm9uX25pbF9leGlzdHMgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGF4dXRpbF9hcnJheV9saXN0X3NpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDAsIGsgPSAwOyBqICZsdDsgc2l6ZTsgaiArKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT0gaikgY29udGludWU7IDwhLS0gc2hvdWxkIG5vdCBjb3VudCB0aGUgaXRoIGVsZW1lbnQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMICE9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgayArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25fbmlsX2V4aXN0cyA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGsgPj0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0ibm90KEBuaWxsYWJlKSBhbmQgbm90KEBtaW5PY2N1cnM9JzAnKSI+Ci0gICAgICAgICAgICAgICAgICAgaWYoIW5vbl9uaWxfZXhpc3RzKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJBbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiBpcyBiZWluZyBzZXQgdG8gTlVMTCwgYnV0IGl0IGlzIG5vdCBhIG51bGxhYmxlIG9yIG1pbk9jY3Vycz0wIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgaWYoIGsgJmx0OyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbk9jY3VycyIvPikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiU2l6ZSBvZiB0aGUgYXJyYXkgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4gaXMgYmVpbm5nIHNldCB0byBiZSBzbWFsbGVyIHRoYW4gdGhlIHNwZWNpZmljZWQgbnVtYmVyIG9mIG1pbk9jY3Vycyg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1pbk9jY3VycyIvPikiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgfQotIAotICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gQVhJUzJfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0ganVzdCBhc3N1bWUgaXQgcyBudWxsIC0tPgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZXJlIGFscmVhZHkgZXhpc3QgYW4gZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpOwotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICA8IS0tIFNvbWUgcmVwZWF0ZWQgY29kZSAtLT4KLSAgICAgICAgICAgICAgICAgIDwhLS0gRm9yIGFsbCBpbnNpZGUgdGhlIGNob29zZSwgcHJvcGVydHlJbnN0YW5jZU5hbWUgPSBlbGVtZW50IC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2Zsb2F0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBpbnRzLCBpbnQ2NF90cywgZmxvYXQgaW4gYXJyYXktLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXAgcHJpbXRpdmVzIGFzIHBvaW50ZXJzIGluIGFycmFzeSwgc28gbmVlZCB0byBmcmVlIHRoZW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBheGlzMl9jaGFyX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9jaGFyX3QqJyBhbmQgbm90KEBpc2FycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8IS0tIGZyZWUgbm9kZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fbm9kZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfZnJlZV90cmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9xbmFtZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF91cmlfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kdXJhdGlvbl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2RhdGVfdGltZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kYXRlX3RpbWVfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2Jhc2U2NF9iaW5hcnlfZnJlZSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfZHVyYXRpb25fZnJlZSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS1UT0RPOiBUaGlzIHNob3VsZCBiZSBleHRlbmRlZCBmb3IgYWxsIHRoZSB0eXBlcyB0aGF0IHNob3VsZCBiZSBmcmVlZC4uIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gdW5rbm93biB0eXBlIG9yIGEgcHJpbWl0aXZlLiBQbGVhc2UgZnJlZSB0aGlzIG1hbnVhbGx5Ki8KLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbmlsbGFiZSBvciBAbWluT2NjdXJzPScwJyI+Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFub25fbmlsX2V4aXN0cykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBuZWVkIHRvIHdvcnJ5IGZ1cnRoZXIgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X3NldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gLCBlbnYsIGksIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIDwhLS0gZm9yIGFsbCB0aGUgb3RoZXIgY2FzZSBqdXN0IHNldCB0aGUgaXRoIGVsZW1lbnQgTlVMTCAtLT4KLSAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9zZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICwgZW52LCBpLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLQotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgPC94c2w6aWY+IDwhLS0gZW5kIG9mIGNoZWNraWluZyBpcyBhcnJheSAtLT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgPCEtLSBUaGUgc2VjdGlvbiBjb3ZlcnMgdGhlIGxpc3QgdHlwZXMsIHRoaXMgYWxtb3N0IHJld3JpdGUgYWJvdmUgc2V0dGVycy9nZXR0ZXJzIC0tPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbXR5cGUiPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPmF4dXRpbF9hcnJheV9saXN0X3QqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqdXN0X25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJDTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqdXN0X25hbWUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hdGl2ZVByb3BlcnR5VHlwZSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgbmF0aXZlIHR5cGUtLT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iUHJvcGVydHlUeXBlQXJyYXlQYXJhbSI+IDwhLS10aGVzZSBhcmUgdXNlZCBpbiBhcnJheXMgdG8gdGFrZSB0aGUgdHlwZSBzdG9yZWQgaW4gdGhlIGFycmF5bGlzdC0tPgotICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ibm90KEB0eXBlKSI+YXhpb21fbm9kZV90KjwveHNsOndoZW4+IDwhLS0gdGhlc2UgYXJlIGFub255bW91cyAtLT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0nc2hvcnQnIG9yIEB0eXBlPSdjaGFyJyBvciBAdHlwZT0naW50JyBvciBAdHlwZT0nZmxvYXQnIG9yIEB0eXBlPSdkb3VibGUnIG9yIEB0eXBlPSdpbnQ2NF90JyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0Pio8L3hzbDp0ZXh0PjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5SW5zdGFuY2VOYW1lIj4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pZWxlbWVudDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJqdXN0UHJvcGVydHlJbnN0YW5jZU5hbWUiPmVsZW1lbnQ8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29uc3RWYWx1ZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSdheGlzMl9jaGFyX3QqJyBvciBAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGludCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIj5jb25zdCA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIGl0aCBlbGVtZW50IG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LgotICAgICAgICAgKi8KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4gQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fZ2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fYXQoCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz4gcmV0X3ZhbDsKLQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3VpbnQ2NF90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdzaG9ydCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nY2hhcicgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdmbG9hdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nZG91YmxlJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPikwKTsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz4pMCk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIE5VTEwpOwotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPikwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXRfdmFsID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPilheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpOwotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCcgb3IgQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2Jvb2xfdCciPgotICAgICAgICAgICAgICAgICAgICBpZihyZXRfdmFsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnJldF92YWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPikwOwotICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X3ZhbDsKLSAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgdGhlIGl0aCBlbGVtZW50IG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LiAoSWYgdGhlIGl0aCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIHJlcGxhY2VkKQotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz5fYXQoCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwgaW50IGksCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25zdFZhbHVlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IGFyZ188L3hzbDp0ZXh0PiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdm9pZCAqZWxlbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIG9yIEB0eXBlPSdheGlzMl9ib29sX3QnIG9yIEB0eXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yIEB0eXBlPSdheGlzMl9ieXRlX3QnIj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz48eHNsOnRleHQ+IHB0cl9wYXJhbV88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz47Ci0gICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gJmFtcDsmYW1wOwotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCcgb3IgQHR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgICBhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSAqKCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz4pYXh1dGlsX2FycmF5X2xpc3RfZ2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52LCBpKSkpCi0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPilheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpKQotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOyAKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gYXh1dGlsX2FycmF5X2xpc3RfY3JlYXRlKGVudiwgMTApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZXJlIGFscmVhZHkgZXhpc3QgYW4gZWxlbWVudCAqLwotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBheHV0aWxfYXJyYXlfbGlzdF9nZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYsIGkpOwotICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gZWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICA8IS0tIFNvbWUgcmVwZWF0ZWQgY29kZSAtLT4KLSAgICAgICAgICAgICAgICAgIDwhLS0gRm9yIGFsbCBpbnNpZGUgdGhlIGNob29zZSwgcHJvcGVydHlJbnN0YW5jZU5hbWUgPSBlbGVtZW50IC0tPgotICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2Zsb2F0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBpbnRzLCBpbnQ2NF90cywgZmxvYXQgaW4gYXJyYXktLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXAgcHJpbXRpdmVzIGFzIHBvaW50ZXJzIGluIGFycmFzeSwgc28gbmVlZCB0byBmcmVlIHRoZW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBheGlzMl9jaGFyX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9jaGFyX3QqJyBhbmQgbm90KEBpc2FycmF5KSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8IS0tIGZyZWUgbm9kZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fbm9kZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfZnJlZV90cmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9xbmFtZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF91cmlfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kdXJhdGlvbl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2RhdGVfdGltZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kYXRlX3RpbWVfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2Jhc2U2NF9iaW5hcnlfZnJlZSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfZHVyYXRpb25fZnJlZSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS1UT0RPOiBUaGlzIHNob3VsZCBiZSBleHRlbmRlZCBmb3IgYWxsIHRoZSB0eXBlcyB0aGF0IHNob3VsZCBiZSBmcmVlZC4uIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gdW5rbm93biB0eXBlIG9yIGEgcHJpbWl0aXZlLiBQbGVhc2UgZnJlZSB0aGlzIG1hbnVhbGx5Ki8KLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yIEB0eXBlPSd1bnNpZ25lZCBjaGFyJyBvciBAdHlwZT0ndW5zaWduZWQgaW50JyBvciBAdHlwZT0ndWludDY0X3QnIG9yIEB0eXBlPSdzaG9ydCcgb3IgQHR5cGU9J2NoYXInIG9yIEB0eXBlPSdpbnQnIG9yIEB0eXBlPSdmbG9hdCcgb3IgQHR5cGU9J2RvdWJsZScgb3IgQHR5cGU9J2ludDY0X3QnIG9yIEB0eXBlPSdheGlzMl9ib29sX3QnIG9yIEB0eXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yIEB0eXBlPSdheGlzMl9ieXRlX3QnIj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+cHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9ICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRQcm9wZXJ0eVR5cGVBcnJheVBhcmFtIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwgc2l6ZW9mKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPikpOwotICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJGYWlsZWQgaW4gYWxsb2NhdHRpbmcgbWVtb3J5IGZvciBuZXcgdmFsdWUgb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+KnB0cl9wYXJhbV88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSA8eHNsOnRleHQ+YXJnXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9zZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICwgZW52LCBpLCA8eHNsOnRleHQ+cHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSdheGlzMl9jaGFyX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3Rfc2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAsIGVudiwgaSwgYXh1dGlsX3N0cmR1cChlbnYsIDx4c2w6dGV4dD5hcmdfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KSk7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3Rfc2V0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAsIGVudiwgaSwgPHhzbDp0ZXh0PmFyZ188L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9UUlVFOwotICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotCi0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIHRvIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+LgotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fYWRkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudiwKLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnN0VmFsdWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hdGl2ZVByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gYXJnXzwveHNsOnRleHQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCcgb3IgQHR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkUHJvcGVydHlUeXBlQXJyYXlQYXJhbSIvPjx4c2w6dGV4dD4gcHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPjsKLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgQVhJUzJfRkFJTFVSRSk7Ci0KLSAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IGF4dXRpbF9hcnJheV9saXN0X2NyZWF0ZShlbnYsIDEwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkZhaWxlZCBpbiBhbGxvY2F0dGluZyBtZW1vcnkgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0eXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgQHR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yIEB0eXBlPSd1bnNpZ25lZCBpbnQnIG9yIEB0eXBlPSd1aW50NjRfdCcgb3IgQHR5cGU9J3Nob3J0JyBvciBAdHlwZT0nY2hhcicgb3IgQHR5cGU9J2ludCcgb3IgQHR5cGU9J2Zsb2F0JyBvciBAdHlwZT0nZG91YmxlJyBvciBAdHlwZT0naW50NjRfdCcgb3IgQHR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgQHR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgQHR5cGU9J2F4aXMyX2J5dGVfdCciPgotICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5wdHJfcGFyYW1fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJFByb3BlcnR5VHlwZUFycmF5UGFyYW0iLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTUFMTE9DKGVudi0+YWxsb2NhdG9yLCBzaXplb2YoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+KSk7Ci0gICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkZhaWxlZCBpbiBhbGxvY2F0dGluZyBtZW1vcnkgZm9yIG5ldyB2YWx1ZSBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4qcHRyX3BhcmFtXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IDx4c2w6dGV4dD5hcmdfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+OwotICAgICAgICAgICAgICAgICAgIGF4dXRpbF9hcnJheV9saXN0X2FkZCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gLCBlbnYsIDx4c2w6dGV4dD5wdHJfcGFyYW1fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHR5cGU9J2F4aXMyX2NoYXJfdConIj4KLSAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICwgZW52LCBheHV0aWxfc3RyZHVwKGVudiwgPHhzbDp0ZXh0PmFyZ188L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pKTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9hZGQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICwgZW52LCA8eHNsOnRleHQ+YXJnXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGFycmF5LgotICAgICAgICAgKi8KLSAgICAgICAgaW50IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NpemVvZl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fdCo8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCAKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCAtMSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCAtMSk7Ci0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF4dXRpbF9hcnJheV9saXN0X3NpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+LCBlbnYpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVtb3ZlIHRoZSBpdGggZWxlbWVudCBvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3JlbW92ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+X2F0KAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdm9pZCAqZWxlbWVudCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICAgICAgaW50IGsgPSAwOwotCi0gICAgICAgICAgICAgICAgQVhJUzJfRU5WX0NIRUNLKGVudiwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBBWElTMl9GQUlMVVJFKTsKLQotCi0gICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgPCEtLSBqdXN0IGFzc3VtZSBpdCBzIG51bGwgLS0+Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlcmUgYWxyZWFkeSBleGlzdCBhbiBlbGVtZW50ICovCi0gICAgICAgICAgICAgICAgZWxlbWVudCA9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSk7Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBlbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIDwhLS0gU29tZSByZXBlYXRlZCBjb2RlIC0tPgotICAgICAgICAgICAgICAgICAgPCEtLSBGb3IgYWxsIGluc2lkZSB0aGUgY2hvb3NlLCBwcm9wZXJ0eUluc3RhbmNlTmFtZSA9IGVsZW1lbnQgLS0+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSd1bnNpZ25lZCBzaG9ydCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgY2hhcicgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgaW50JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSd1aW50NjRfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX3Vuc2lnbmVkX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYnl0ZV90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9ib29sX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2NoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nZmxvYXQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2RvdWJsZScgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0naW50NjRfdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmcmVlIGludHMsIGludDY0X3RzLCBmbG9hdCBpbiBhcnJheS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2Uga2VlcCBwcmltdGl2ZXMgYXMgcG9pbnRlcnMgaW4gYXJyYXN5LCBzbyBuZWVkIHRvIGZyZWUgdGhlbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPiBhbGxvY2F0b3IsIGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPCEtLSBmcmVlIGF4aXMyX2NoYXJfdCBzIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2NoYXJfdConIGFuZCBub3QoQGlzYXJyYXkpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBub2RlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlvbV9ub2RlX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXhpb21fbm9kZV9mcmVlX3RyZWUgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3FuYW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3FuYW1lX2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfdXJpX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX3VyaV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2R1cmF0aW9uX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2R1cmF0aW9uX2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheHV0aWxfZGF0ZV90aW1lX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2RhdGVfdGltZV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdConIj4KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfYmFzZTY0X2JpbmFyeV9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kdXJhdGlvbl9mcmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPCEtLVRPRE86IFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBhbGwgdGhlIHR5cGVzIHRoYXQgc2hvdWxkIGJlIGZyZWVkLi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhbiB1bmtub3duIHR5cGUgb3IgYSBwcmltaXRpdmUuIFBsZWFzZSBmcmVlIHRoaXMgbWFudWFsbHkqLwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDwhLS0gZm9yIGFsbCB0aGUgb3RoZXIgY2FzZSBqdXN0IHNldCB0aGUgaXRoIGVsZW1lbnQgTlVMTCAtLT4KLSAgICAgICAgICAgICAgICBheHV0aWxfYXJyYXlfbGlzdF9zZXQoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICwgZW52LCBpLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXR0ZXIgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IGJ5ICBQcm9wZXJ0eSBOdW1iZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4KLSAgICAgICAgICovCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlUeXBlIi8+IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF9wcm9wZXJ0eTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpIi8+KAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X2dldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHRlciBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eU5hbWUiLz4uCi0gICAgICAgICAqLwotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl9nZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgewotICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIHNob3J0JyBvciAkcHJvcGVydHlUeXBlPSd1bnNpZ25lZCBjaGFyJyBvciAkcHJvcGVydHlUeXBlPSd1bnNpZ25lZCBpbnQnIG9yICRwcm9wZXJ0eVR5cGU9J3VpbnQ2NF90JyBvciAkcHJvcGVydHlUeXBlPSdzaG9ydCcgb3IgJHByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciAkcHJvcGVydHlUeXBlPSdheGlzMl9ieXRlX3QnIG9yICRwcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCcgb3IgJHByb3BlcnR5VHlwZT0nY2hhcicgb3IgJHByb3BlcnR5VHlwZT0naW50JyBvciAkcHJvcGVydHlUeXBlPSdmbG9hdCcgb3IgJHByb3BlcnR5VHlwZT0nZG91YmxlJyBvciAkcHJvcGVydHlUeXBlPSdpbnQ2NF90JyI+Ci0gICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPikwKTsKLSAgICAgICAgICAgICAgICAgQVhJUzJfUEFSQU1fQ0hFQ0soZW52LT5lcnJvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4pMCk7Ci0gICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgIEFYSVMyX0VOVl9DSEVDSyhlbnYsIE5VTEwpOwotICAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIE5VTEwpOwotICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz47Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPi4KLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3NldF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3QqPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwKLSAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+IGFyZ188eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+KQotICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgICBBWElTMl9QQVJBTV9DSEVDSyhlbnYtPmVycm9yLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+aXNfdmFsaWRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiA9PSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRjaG9pY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5jdXJyZW50X2Nob2ljZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zdXJpIi8+Ojx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlOYW1lIi8+IjsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOyAKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICA8IS0tIGZpcnN0IHJlc2V0IHdoYXRldmVyIGFscmVhZHkgaW4gdGhlcmUgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRheGlzMl9uYW1lIi8+X3Jlc2V0Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LCBlbnYpOwotCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoQG91cnMgb3Igbm90KCRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRwcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJHByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRwcm9wZXJ0eVR5cGU9J3VpbnQ2NF90JyBvciAkcHJvcGVydHlUeXBlPSdjaGFyJyBvciAkcHJvcGVydHlUeXBlPSdpbnQnIG9yICRwcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkcHJvcGVydHlUeXBlPSdmbG9hdCcgb3IgJHByb3BlcnR5VHlwZT0nYXhpczJfdW5zaWduZWRfYnl0ZV90JyBvciAgJHByb3BlcnR5VHlwZT0nYXhpczJfYnl0ZV90JyBvciAkcHJvcGVydHlUeXBlPSdkb3VibGUnIG9yICRwcm9wZXJ0eVR5cGU9J2ludDY0X3QnIG9yICRwcm9wZXJ0eVR5cGU9J2F4aXMyX2Jvb2xfdCcpKSI+Ci0gICAgICAgICAgICAgICAgaWYoTlVMTCA9PSBhcmdfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlIGFyZSBhbHJlYWR5IGRvbmUgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gYXJnXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz47Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5pc192YWxpZF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ID0gQVhJUzJfVFJVRTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlc2V0dGVyIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5TmFtZSIvPgotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfc3RhdHVzX3QgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGF4aXMyX25hbWUiLz5fcmVzZXRfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPigKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXhpczJfbmFtZSIvPl90Kjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4sCi0gICAgICAgICAgICBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLSAgICAgICAgewotICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgIHZvaWQgKmVsZW1lbnQgPSBOVUxMOwotCi0gICAgICAgICAgICAgICBBWElTMl9FTlZfQ0hFQ0soZW52LCBBWElTMl9GQUlMVVJFKTsKLSAgICAgICAgICAgICAgIEFYSVMyX1BBUkFNX0NIRUNLKGVudi0+ZXJyb3IsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPiwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIDwhLS0gVGhpcyBpcyBhbHdheXMgYW4gYXJyYXkgLS0+Ci0gICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LT5wcm9wZXJ0eV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJENOYW1lIi8+ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBheHV0aWxfYXJyYXlfbGlzdF9zaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPi0+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRDTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgJmx0OyBjb3VudDsgaSArKykKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGF4dXRpbF9hcnJheV9saXN0X2dldCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudiwgaSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8IS0tIHRoZSBmb2xsb3dpbmcgZWxlbWVudCBjYW4gYmUgaW5zaWRlIGFycmF5IG9yIGV4aXN0IGluZGVwZW5kZW50bHktLT4KLSAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGp1c3RQcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICA8IS0tIGhvdyB0byBmcmVlIGFsbCB0aGUgb3VycyB0aGluZ3MgLS0+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0ndW5zaWduZWQgc2hvcnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGNoYXInIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Vuc2lnbmVkIGludCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0ndWludDY0X3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J3Nob3J0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl91bnNpZ25lZF9ieXRlX3QnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4aXMyX2J5dGVfdCcgb3IgJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpczJfYm9vbF90JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdjaGFyJyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdpbnQnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2Zsb2F0JyBvciAkbmF0aXZlUHJvcGVydHlUeXBlPSdkb3VibGUnIG9yICRuYXRpdmVQcm9wZXJ0eVR5cGU9J2ludDY0X3QnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBpbnRzLCBpbnQ2NF90cywgZmxvYXQgaW4gYXJyYXktLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIGtlZXAgcHJpbXRpdmVzIGFzIHBvaW50ZXJzIGluIGFycmF5cywgc28gbmVlZCB0byBmcmVlIHRoZW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT4gYWxsb2NhdG9yLCBlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS0gZnJlZSBheGlzMl9jaGFyX3QgcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkbmF0aXZlUHJvcGVydHlUeXBlPSdheGlzMl9jaGFyX3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+IGFsbG9jYXRvciwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8IS0tIGZyZWUgbm9kZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXhpb21fbm9kZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfZnJlZV90cmVlICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9xbmFtZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9xbmFtZV9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX3VyaV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF91cmlfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRuYXRpdmVQcm9wZXJ0eVR5cGU9J2F4dXRpbF9kdXJhdGlvbl90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kdXJhdGlvbl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvcGVydHlJbnN0YW5jZU5hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG5hdGl2ZVByb3BlcnR5VHlwZT0nYXh1dGlsX2RhdGVfdGltZV90KiciPgotICAgICAgICAgICAgICAgICAgICAgIGF4dXRpbF9kYXRlX3RpbWVfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5SW5zdGFuY2VOYW1lIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2F4dXRpbF9iYXNlNjRfYmluYXJ5X3QqJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2Jhc2U2NF9iaW5hcnlfZnJlZSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdheHV0aWxfZHVyYXRpb25fdConIj4KLSAgICAgICAgICAgICAgICAgICAgICBheHV0aWxfZHVyYXRpb25fZnJlZSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eUluc3RhbmNlTmFtZSIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIDwhLS1UT0RPOiBUaGlzIHNob3VsZCBiZSBleHRlbmRlZCBmb3IgYWxsIHRoZSB0eXBlcyB0aGF0IHNob3VsZCBiZSBmcmVlZC4uIC0tPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gdW5rbm93biB0eXBlIG9yIGEgcHJpbWl0aXZlLiBQbGVhc2UgZnJlZSB0aGlzIG1hbnVhbGx5Ki8KLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqdXN0UHJvcGVydHlJbnN0YW5jZU5hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDwhLS0veHNsOmlmLS0+Ci0gICAgICAgICAgICAgICAgPCEtLSBjbG9zZSB0YWdzIGFycmF5cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgYXh1dGlsX2FycmF5X2xpc3RfZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPnByb3BlcnR5Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4tPmlzX3ZhbGlkXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkQ05hbWUiLz4gPSBBWElTMl9GQUxTRTsgCi0gICAgICAgICAgICAgICByZXR1cm4gQVhJUzJfU1VDQ0VTUzsKLQotICAgICAgICB9Ci0KLQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9QbGFpbkJlYW5UZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVtcGxhdGUvUGxhaW5CZWFuVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE3NTBkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZW1wbGF0ZS9QbGFpbkJlYW5UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0NCi0gICAgIDwhLS0gY2F0ZXIgZm9yIHRoZSBtdWx0aXBsZSBjbGFzc2VzIC0gd3JhcHBwZWQgbW9kZSAtLT4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2JlYW5zIj4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+DQotLyoqDQotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+LmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMNCi0gKi8NCi0NCi0gICAgICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ow0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gd3JhcHBlZCBiZWFuIGNsYXNzZXMNCi0gICAgICAgICovDQotICAgICAgICBwdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuYW1lIi8+ew0KLQ0KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLQ0KLSAgICAgICAgfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gICAgPCEtLWNhdGVyIGZvciB0aGUgbXVsdGlwbGUgY2xhc3NlcyAtIHVud3JhcHBwZWQgbW9kZSAtLT4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+DQotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLQ0KLQ0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJiZWFuIj4NCi0vKioNCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQ0KLSAqDQotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwNCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5Iw0KLSAqLw0KLQ0KLSAgICAgICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gYmVhbiBjbGFzcw0KLSAgICAgICAgKi8NCi0NCi0gICAgICAgIHB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4gPHhzbDppZiB0ZXN0PSJAZXh0ZW5zaW9uIj4gZXh0ZW5kcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGV4dGVuc2lvbiIvPjwveHNsOmlmPnsNCi0NCi0gICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdHlwZSI+LyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkDQotICAgICAgICAgICAgICAgIG5hbWUgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9yaWdpbmFsTmFtZSIvPg0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPg0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3ByZWZpeCIvPg0KLSAgICAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBNWV9RTkFNRSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKA0KLSAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuc3VyaSIvPiIsDQotICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9yaWdpbmFsTmFtZSIvPiIsDQotICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zcHJlZml4Ii8+Iik7DQotDQotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLQ0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5VHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InByb3BlcnR5TmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImphdmFOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmFuYW1lIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InZhck5hbWUiPmxvY2FsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICogZmllbGQgZm9yIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4NCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhdHRyaWJ1dGUiPiogVGhpcyB3YXMgYW4gQXR0cmlidXRlITwveHNsOmlmPg0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGFycmF5Ij4qIFRoaXMgd2FzIGFuIEFycmF5ITwveHNsOmlmPg0KLQ0KLSAgICAgICAgICAgICovDQotICAgICAgICAgICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnR5VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiIC8+IDsNCi0NCi0gICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QNCi0gICAgICAgICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4NCi0gICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIHB1YmxpYyAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRqYXZhTmFtZSIvPigpew0KLSAgICAgICAgICAgIHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZA0KLSAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4NCi0gICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkamF2YU5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0eVR5cGUiLz4gcGFyYW0pew0KLSAgICAgICAgICAgIDwhLS1BZGQgdGhlIHZhbGlkYXRpb24gY29kZS4gRm9yIG5vdyB3ZSBvbmx5IGFkZCB0aGUgdmFsaWRhdGlvbiBjb2RlIGZvciBhcnJheXMtLT4NCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBhcnJheSI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB1bmJvdW5kKSI+DQotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ubGVuZ3RoICZndDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtYXhPY2N1cnMiPjwveHNsOnZhbHVlLW9mPil7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG1pbk9jY3VycyI+DQotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ubGVuZ3RoICZsdDsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtaW5PY2N1cnMiPjwveHNsOnZhbHVlLW9mPil7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgdGhpcy48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHZhck5hbWUiLz49cGFyYW07DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICB9DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvQ1R5cGVNYXAuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL0NUeXBlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDVmOTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvQ1R5cGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIEMgdHlwZSBtYXAuIHVzZXMgYSBzdGF0aWMgbWFwIGZvciBjYWNoaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBDVHlwZU1hcCBpbXBsZW1lbnRzIFR5cGVNYXB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLyBUeXBlIG1hcCBmb3IgdGhlIHN0YW5kYXJkIHNjaGVtYSB0eXBlcwotICAgIHB1YmxpYyBNYXAgZ2V0VHlwZU1hcCgpewotICAgICAgICAgcmV0dXJuIHR5cGVNYXA7Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gSWYgU09BUCAxLjEgb3ZlciB0aGUgd2lyZSwgbWFwIHdyYXBwZXIgY2xhc3NlcyB0byBYU0QgcHJpbWl0aXZlcy4KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotCi0gICAgICAgIC8vIFRoZSBYU0QgUHJpbWl0aXZlcyBhcmUgbWFwcGVkIHRvIGF4aXMyL2MgcHJpbWl0aXZlcy4KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9CT09MRUFOLCAiYXhpczJfYm9vbF90Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRE9VQkxFLCAiZG91YmxlIik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRkxPQVQsICJmbG9hdCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lOVCwgImludCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTE9ORywgImludDY0X3QiKTsKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9TSE9SVCwgInNob3J0Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQllURSwgImF4aXMyX2J5dGVfdCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0FOWSwgImF4aW9tX25vZGVfdCoiKTsKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ERUNJTUFMLCAiZG91YmxlIik7Ci0KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9BTllUWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4aW9tX25vZGVfdCoiKTsKLQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF9xbmFtZV90KiIpOwotCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheHV0aWxfZGF0ZV90aW1lX3QqIik7Ci0KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9USU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF9kYXRlX3RpbWVfdCoiKTsKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9EQVRFVElNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheHV0aWxfZGF0ZV90aW1lX3QqIik7Ci0KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9CQVNFNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCoiKTsKLQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0hFWEJJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlvbV9ub2RlX3QqIik7Ci0KLSAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBnKiB0eXBlcyAoZ1llYXJNb250aCwgZXRjKSB3aGljaCBtYXAgdG8gQXhpcyB0eXBlcwotICAgICAgICAvLyBUaGVzZSB0eXBlcyBhcmUgbWFwcGVkIHRvIGFuIGludGVnZXIKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ZRUFSTU9OVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1lFQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTU9OVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX01PTlRIREFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF9kYXRlX3RpbWVfdCoiKTsKLQotICAgICAgICAvLyB4c2Q6dG9rZW4KLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9UT0tFTiwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpub3JtYWxpemVkU3RyaW5nCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9STUFMSVpFRFNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRMb25nCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVpbnQ2NF90Iik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRJbnQKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9VTlNJR05FRElOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQiKTsKLQotICAgICAgICAvLyBhIHhzZDp1bnNpZ25lZFNob3J0Ci0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURTSE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBzaG9ydCIpOwotCi0gICAgICAgIC8vIGEgeHNkOnVuc2lnbmVkQnl0ZQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1VOU0lHTkVEQllURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJheGlzMl91bnNpZ25lZF9ieXRlX3QiKTsKLQotICAgICAgICAvLyBhIHhzZDpub25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9OT05ORUdBVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50Iik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6bmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTkVHQVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIpOwotCi0gICAgICAgIC8vIGEgeHNkOnBvc2l0aXZlSW50ZWdlcgotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1BPU0lUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQiKTsKLQotICAgICAgICAvLyBhIHhzZDpub25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9OT05QT1NJVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50Iik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6TmFtZQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05BTUUsICJheGlzMl9jaGFyX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6TkNOYW1lCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTkNOQU1FLCAiYXhpczJfY2hhcl90KiIpOwotCi0gICAgICAgIC8vIGEgeHNkOklECi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSUQsICJheGlzMl9jaGFyX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6bGFuZ3VhZ2UKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9MQU5HVUFHRSwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpObVRva2VuCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk1UT0tFTiwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpObVRva2VucwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05NVE9LRU5TLCAiYXhpczJfY2hhcl90KiIpOwotCi0gICAgICAgIC8vIGEgeHNkOk5PVEFUSU9OCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9UQVRJT04sICJheGlvbV9ub2RlX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0VOVElUWQotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0VOVElUWSwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpYU0RfRU5USVRJRVMKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9FTlRJVElFUywgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpYU0RfSURSRUYKLSAgICAgICAgQ1R5cGVNYXAuYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9JRFJFRiwgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpYU0RfWFNEX0lEUkVGUwotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lEUkVGUywgImF4aXMyX2NoYXJfdCoiKTsKLQotICAgICAgICAvLyBhIHhzZDpEdXJhdGlvbgotICAgICAgICBDVHlwZU1hcC5hZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0RVUkFUSU9OLCAiYXh1dGlsX2R1cmF0aW9uX3QqIik7Ci0KLSAgICAgICAgLy8gYSB4c2Q6YW55VVJJCi0gICAgICAgIENUeXBlTWFwLmFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQU5ZVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4dXRpbF91cmlfdCoiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFR5cGVtYXBwaW5nKFFOYW1lIG5hbWUsIFN0cmluZyBzdHIpIHsKLSAgICAgICAgQ1R5cGVNYXAudHlwZU1hcC5wdXQobmFtZSwgc3RyKTsKLSAgICB9Ci0KLSAgICAvLyBUeXBlIG1hcCBmb3IgdGhlIHNvYXAgZW5jb2RpbmcgdHlwZXMKLSAgICBwdWJsaWMgTWFwIGdldFNvYXBFbmNvZGluZ1R5cGVzTWFwKCkgewotICAgICAgICByZXR1cm4gc29hcEVuY29kaW5nVHlwZU1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgc29hcEVuY29kaW5nVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgc29hcEVuY29kaW5nVHlwZU1hcAotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19BUlJBWSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2FycmF5X2xpc3RfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfU1RSVUNULAotICAgICAgICAgICAgICAgICJheGlvbV9ub2RlX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0JBU0U2NCwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgImF4dXRpbF9kdXJhdGlvbl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19EQVRFVElNRSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OT1RBVElPTiwKLSAgICAgICAgICAgICAgICAiYXhpb21fbm9kZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19USU1FLAotICAgICAgICAgICAgICAgICJheHV0aWxfZGF0ZV90aW1lX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RBVEUsCi0gICAgICAgICAgICAgICAgImF4dXRpbF9kYXRlX3RpbWVfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR1lFQVJNT05USCwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19HWUVBUiwKLSAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dNT05USERBWSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2RhdGVfdGltZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19HREFZLAotICAgICAgICAgICAgICAgICJpbnQiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR01PTlRILAotICAgICAgICAgICAgICAgICJpbnQiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfQk9PTEVBTiwKLSAgICAgICAgICAgICAgICAiYXhpczJfYm9vbF90Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0JBU0U2NEJJTkFSWSwKLSAgICAgICAgICAgICAgICAiYXh1dGlsX2Jhc2U2NF9iaW5hcnlfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfSEVYQklOQVJZLAotICAgICAgICAgICAgICAgICJheGlvbV9ub2RlX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0ZMT0FULAotICAgICAgICAgICAgICAgICJmbG9hdCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19ET1VCTEUsCi0gICAgICAgICAgICAgICAgImRvdWJsZSIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19BTllVUkksCi0gICAgICAgICAgICAgICAgImF4dXRpbF91cmlfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfUU5BTUUsCi0gICAgICAgICAgICAgICAgImF4dXRpbF9xbmFtZV90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19TVFJJTkcsCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTk9STUFMSVpFRFNUUklORywKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19UT0tFTiwKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19MQU5HVUFHRSwKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OQU1FLAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05NVE9LRU4sCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTkNOQU1FLAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lELAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lEUkVGLAotICAgICAgICAgICAgICAgICJheGlzMl9jaGFyX3QqIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0VOVElUWSwKLSAgICAgICAgICAgICAgICAiYXhpczJfY2hhcl90KiIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19JRFJFRlMsCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfRU5USVRJRVMsCi0gICAgICAgICAgICAgICAgImF4aXMyX2NoYXJfdCoiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfREVDSU1BTCwKLSAgICAgICAgICAgICAgICAiZG91YmxlIik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lOVEVHRVIsCi0gICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OT05QT1NJVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19ORUdBVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgImludCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19MT05HLAotICAgICAgICAgICAgICAgICJpbnQ2NF90Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lOVCwKLSAgICAgICAgICAgICAgICAiaW50Iik7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX1NIT1JULAotICAgICAgICAgICAgICAgICJzaG9ydCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CWVRFLAotICAgICAgICAgICAgICAgICJheGlzMl9ieXRlX3QiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTk9OTkVHQVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQiKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgICJ1aW50NjRfdCIpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19VTlNJR05FRElOVCwKLSAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhRTmFtZSBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHNvYXBFbmNvZGluZ1R5cGVNYXAucHV0KG5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvSmF2YVR5cGVNYXAuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL0phdmFUeXBlTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGEzMzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3R5cGVtYXAvSmF2YVR5cGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkSW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBqYXZhIHR5cGUgbWFwLiB1c2VzIGEgc3RhdGljIG1hcCBmb3IgY2FjaGluZwotICogTW9zdCBjb2RlIGZyb20gQXhpcyAxIENvZGViYXNlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZU1hcCBpbXBsZW1lbnRzIFR5cGVNYXAgewotCi0gICAgcHVibGljIE1hcCBnZXRUeXBlTWFwKCkgewotICAgICAgICByZXR1cm4gdHlwZU1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBJZiBTT0FQIDEuMSBvdmVyIHRoZSB3aXJlLCBtYXAgd3JhcHBlciBjbGFzc2VzIHRvIFhTRCBwcmltaXRpdmVzLgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1NUUklORywKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVGhlIFhTRCBQcmltaXRpdmVzIGFyZSBtYXBwZWQgdG8gamF2YSBwcmltaXRpdmVzLgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0JPT0xFQU4sIGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ET1VCTEUsIGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0ZMT0FULCBmbG9hdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0lOVCwgaW50LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSU5URUdFUiwKLSAgICAgICAgICAgICAgICBqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0xPTkcsIGxvbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9TSE9SVCwgc2hvcnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9CWVRFLCBieXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQU5ZLCBPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ERUNJTUFMLCBCaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy9hbnl0eXBlIGlzIG1hcHBlZCB0byB0aGUgT01FbGVtZW50IGluc3RlYWQgb2YgdGhlIGphdmEubGFuZy5PYmplY3QKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9BTllUWVBFLAotICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vUW5hbWUgbWFwcyB0byAgamF4IHJwYyBRTmFtZSBjbGFzcwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX1FOQU1FLAotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvL3hzZCBEYXRlIGlzIG1hcHBlZCB0byB0aGUgamF2YS51dGlsLmRhdGUhCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFURSwKLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRGF0ZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIE1hcHBpbmcgZm9yIHhzZDp0aW1lLiAgTWFwIHRvIEF4aXMgdHlwZSBUaW1lCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVElNRSwKLSAgICAgICAgICAgICAgICBUaW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfREFURVRJTUUsCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy9hcyBmb3IgdGhlIGJhc2UgNjQgZW5jb2RlZCBiaW5hcnkgc3R1ZmYgd2UgbWFwIGl0IHRvIGEgamF2YXguCi0gICAgICAgIC8vIGFjdGl2YXRpb24uRGF0YWhhbmRsZXIgb2JqZWN0Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQkFTRTY0LAotICAgICAgICAgICAgICAgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSEVYQklOLAotICAgICAgICAgICAgICAgIEhleEJpbmFyeS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgZyogdHlwZXMgKGdZZWFyTW9udGgsIGV0Yykgd2hpY2ggbWFwIHRvIEF4aXMgdHlwZXMKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ZRUFSTU9OVEgsCi0gICAgICAgICAgICAgICAgWWVhck1vbnRoLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfWUVBUiwKLSAgICAgICAgICAgICAgICBZZWFyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTU9OVEgsCi0gICAgICAgICAgICAgICAgTW9udGguY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9EQVksCi0gICAgICAgICAgICAgICAgRGF5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTU9OVEhEQVksCi0gICAgICAgICAgICAgICAgTW9udGhEYXkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyB4c2Q6dG9rZW4KLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9UT0tFTiwgVG9rZW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpub3JtYWxpemVkU3RyaW5nCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9STUFMSVpFRFNUUklORywKLSAgICAgICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRMb25nCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgIFVuc2lnbmVkTG9uZy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOnVuc2lnbmVkSW50Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURJTlQsCi0gICAgICAgICAgICAgICAgVW5zaWduZWRJbnQuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDp1bnNpZ25lZFNob3J0Ci0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURTSE9SVCwKLSAgICAgICAgICAgICAgICBVbnNpZ25lZFNob3J0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6dW5zaWduZWRCeXRlCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfVU5TSUdORURCWVRFLAotICAgICAgICAgICAgICAgIFVuc2lnbmVkQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOm5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05PTk5FR0FUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpuZWdhdGl2ZUludGVnZXIKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9ORUdBVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6cG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfUE9TSVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgIFBvc2l0aXZlSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOm5vblBvc2l0aXZlSW50ZWdlcgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05PTlBPU0lUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBOb25Qb3NpdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpOYW1lCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTkFNRSwgTmFtZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOk5DTmFtZQotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05DTkFNRSwgTkNOYW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6SUQKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9JRCwgSWQuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhtbDpsYW5nCi0gICAgICAgIC8vIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YTUxfTEFORyxMYW5ndWFnZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOmxhbmd1YWdlCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTEFOR1VBR0UsIExhbmd1YWdlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6Tm1Ub2tlbgotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05NVE9LRU4sIE5NVG9rZW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBhIHhzZDpObVRva2VucwotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX05NVE9LRU5TLCBOTVRva2Vucy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOk5PVEFUSU9OCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfTk9UQVRJT04sIE5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0VOVElUWQotICAgICAgICBhZGRUeXBlbWFwcGluZyhTY2hlbWFDb25zdGFudHMuWFNEX0VOVElUWSwgRW50aXR5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0VOVElUSUVTCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRU5USVRJRVMsIEVudGl0aWVzLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX0lEUkVGCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfSURSRUYsIElEUmVmLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6WFNEX1hTRF9JRFJFRlMKLSAgICAgICAgYWRkVHlwZW1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlhTRF9JRFJFRlMsIElEUmVmcy5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGEgeHNkOkR1cmF0aW9uCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfRFVSQVRJT04sIER1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgLy8gYSB4c2Q6YW55VVJJCi0gICAgICAgIGFkZFR5cGVtYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5YU0RfQU5ZVVJJLCBVUkkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUeXBlbWFwcGluZyhRTmFtZSBuYW1lLCBTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHR5cGVNYXAucHV0KG5hbWUsIHN0cik7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRTb2FwRW5jb2RpbmdUeXBlc01hcCgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBFbmNvZGluZ1R5cGVNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIHNvYXBFbmNvZGluZ1R5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHNvYXBFbmNvZGluZ1R5cGVNYXAKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfQVJSQVksCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfU1RSVUNULAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlN0cnVjdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CQVNFNjQsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQmFzZTY0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkR1cmF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RBVEVUSU1FLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRhdGVUaW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05PVEFUSU9OLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5PVEFUSU9OLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX1RJTUUsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuVGltZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19EQVRFLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRhdGUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR1lFQVJNT05USCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HWWVhck1vbnRoLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dZRUFSLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkdZZWFyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dNT05USERBWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HTW9udGhEYXkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfR0RBWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HRGF5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0dNT05USCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HTW9udGguY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfQk9PTEVBTiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CQVNFNjRCSU5BUlksCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQmFzZTY0QmluYXJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0hFWEJJTkFSWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5IZXhCaW5hcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfRkxPQVQsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuX2Zsb2F0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0RPVUJMRSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fZG91YmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0FOWVVSSSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BbnlVUkkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfUU5BTUUsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuUU5hbWUuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfU1RSSU5HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OT1JNQUxJWkVEU1RSSU5HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5vcm1hbGl6ZWRTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVE9LRU4sCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuVG9rZW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTEFOR1VBR0UsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTGFuZ3VhZ2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTkFNRSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5OYW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05NVE9LRU4sCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTk1UT0tFTi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19OQ05BTUUsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTkNOYW1lLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05NVE9LRU5TLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5NVE9LRU5TLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lELAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklELmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lEUkVGLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklEUkVGLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0VOVElUWSwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FTlRJVFkuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfSURSRUZTLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLklEUkVGUy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19FTlRJVElFUywKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FTlRJVElFUy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19ERUNJTUFMLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfSU5URUdFUiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05PTlBPU0lUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob25Qb3NpdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfTkVHQVRJVkVJTlRFR0VSLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5lZ2F0aXZlSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19MT05HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9sb25nLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX0lOVCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5faW50LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX1NIT1JULAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9zaG9ydC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19CWVRFLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9ieXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZFNvYXBFbmNvZGluZ1R5cGVNYXBwaW5nKFNjaGVtYUNvbnN0YW50cy5TT0FQX0VOQ09ESU5HX05PTk5FR0FUSVZFSU5URUdFUiwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob25OZWdhdGl2ZUludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVU5TSUdORURMT05HLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkTG9uZy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19VTlNJR05FRElOVCwKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5VbnNpZ25lZEludC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19VTlNJR05FRFNIT1JULAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkU2hvcnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYWRkU29hcEVuY29kaW5nVHlwZU1hcHBpbmcoU2NoZW1hQ29uc3RhbnRzLlNPQVBfRU5DT0RJTkdfVU5TSUdORURCWVRFLAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlVuc2lnbmVkQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhTY2hlbWFDb25zdGFudHMuU09BUF9FTkNPRElOR19QT1NJVElWRUlOVEVHRVIsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuUG9zaXRpdmVJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTb2FwRW5jb2RpbmdUeXBlTWFwcGluZyhRTmFtZSBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHNvYXBFbmNvZGluZ1R5cGVNYXAucHV0KG5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL1R5cGVNYXAuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90eXBlbWFwL1R5cGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYzdmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdHlwZW1hcC9UeXBlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgaXMgYSAgdHlwZW1hcHBlciBmb3IgdGhlIGJlYW4gd3JpdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZU1hcCB7Ci0KLSAgICBwdWJsaWMgTWFwIGdldFR5cGVNYXAoKTsKLQotICAgIHB1YmxpYyBNYXAgZ2V0U29hcEVuY29kaW5nVHlwZXNNYXAoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS91dGlsL1ByaW1pdGl2ZVR5cGVGaW5kZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS91dGlsL1ByaW1pdGl2ZVR5cGVGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1MDllYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdXRpbC9QcmltaXRpdmVUeXBlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2ltcGxlIHV0aWxpeSB0byBmaW5kIHdoZXRoZXIgYSBnaXZlbiBjbGFzcyBuYW1lIGlzCi0gKiBwcmltaXRpdmUgb3Igbm90Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVUeXBlRmluZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgcHJpbWl0aXZlQ2xhc3NOYW1lTGlzdDsKLQotICAgIHN0YXRpY3sKLSAgICAgICAgcHJpbWl0aXZlQ2xhc3NOYW1lTGlzdCA9ICBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vYWRkIHRoZSBqYXZhIHByaW1pdGl2ZSBjbGFzcyBuYW1lcwotICAgICAgICBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmFkZChpbnQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHJpbWl0aXZlQ2xhc3NOYW1lTGlzdC5hZGQobG9uZy5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmFkZChieXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmFkZChib29sZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKGZsb2F0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKHNob3J0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZUNsYXNzTmFtZUxpc3QuYWRkKGNoYXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKXsKLSAgICAgICAgLy9pZiBhbiBhcnJheSB0eXBlIGlzIHBhc3NlZCwgc3RyaXAgb3V0IHRoZSBbXSBwYXJ0Ci0gICAgICAgIGlmIChjbGFzc05hbWUuaW5kZXhPZigiW10iKSE9LTEpewotICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsY2xhc3NOYW1lLmluZGV4T2YoIltdIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVDbGFzc05hbWVMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3V0aWwvUHJpbWl0aXZlVHlwZVdyYXBwZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS91dGlsL1ByaW1pdGl2ZVR5cGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZGE3MjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3V0aWwvUHJpbWl0aXZlVHlwZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFByaW1pdGl2ZVR5cGVXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXA7Ci0KLSAgICBzdGF0aWN7Ci0gICAgICAgIHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcCA9ICBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL2FkZCB0aGUgamF2YSBwcmltaXRpdmUgY2xhc3MgbmFtZXMKLSAgICAgICAgcHJpbWl0aXZlVHlwZVdyYXBwZXJzTWFwLnB1dChpbnQuY2xhc3MuZ2V0TmFtZSgpLEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgcHJpbWl0aXZlVHlwZVdyYXBwZXJzTWFwLnB1dChsb25nLmNsYXNzLmdldE5hbWUoKSxMb25nLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcC5wdXQoYnl0ZS5jbGFzcy5nZXROYW1lKCksQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KGRvdWJsZS5jbGFzcy5nZXROYW1lKCksRG91YmxlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcC5wdXQoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCksQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KGZsb2F0LmNsYXNzLmdldE5hbWUoKSxGbG9hdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KHNob3J0LmNsYXNzLmdldE5hbWUoKSxTaG9ydC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAucHV0KGNoYXIuY2xhc3MuZ2V0TmFtZSgpLENoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJpbWl0aXZlY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V3JhcHBlcihTdHJpbmcgcHJpbWl0aXZlY2xhc3NOYW1lKXsKLSAgICAgICAgU3RyaW5nIHJldHVybkNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcmltaXRpdmVjbGFzc05hbWUudHJpbSgpLmVuZHNXaXRoKCJbXSIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcHJpbWl0aXZlY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwcmltaXRpdmVjbGFzc05hbWUubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgICAgIHJldHVybkNsYXNzTmFtZSA9IHByaW1pdGl2ZVR5cGVXcmFwcGVyc01hcC5nZXQoY2xhc3NOYW1lKSArICJbXSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm5DbGFzc05hbWUgPSAoU3RyaW5nKSBwcmltaXRpdmVUeXBlV3JhcHBlcnNNYXAuZ2V0KHByaW1pdGl2ZWNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdXRpbC9TY2hlbWFQcm9wZXJ0eUxvYWRlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3V0aWwvU2NoZW1hUHJvcGVydHlMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2NGJlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdXRpbC9TY2hlbWFQcm9wZXJ0eUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuVHlwZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKiogTG9hZHMgdGhlIHByb3BlcnRpZXMgIGZvciB0aGUgc2NoZW1hIGNvbXBpbGVyLiAqLwotcHVibGljIGNsYXNzIFNjaGVtYVByb3BlcnR5TG9hZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmVhblRlbXBsYXRlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBCZWFuV3JpdGVyIGJlYW5Xcml0ZXJJbnN0YW5jZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVHlwZU1hcCB0eXBlTWFwcGVySW5zdGFuY2UgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydHlNYXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURCX1BST1BFUlRZX0ZJTEVfS0VZID0gIm9yZy5hcGFjaGUuYWRiLnByb3BlcnRpZXMiOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vbG9hZCB0aGUgcHJvcGVydGllcwotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hUHJvcEZpbGVuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KEFEQl9QUk9QRVJUWV9GSUxFX0tFWSk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hUHJvcEZpbGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVyZSB3YXMgbm8gc3lzdGVtIHByb3BlcnR5IC5sb2FkIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChTY2hlbWFDb21waWxlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuU0NIRU1BX0NPTVBJTEVSX1BST1BFUlRJRVMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChTY2hlbWFDb21waWxlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHNjaGVtYVByb3BGaWxlbmFtZSkpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIFN0cmluZyBiZWFuV3JpdGVyQ2xhc3NOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuQkVBTl9XUklURVJfS0VZKTsKLSAgICAgICAgICAgIGlmIChiZWFuV3JpdGVyQ2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZWFuV3JpdGVySW5zdGFuY2UgPSAoQmVhbldyaXRlcilDbGFzcy5mb3JOYW1lKGJlYW5Xcml0ZXJDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGVyQ2xhc3NOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuQkVBTl9XUklURVJfVFlQRU1BUF9LRVkpOwotICAgICAgICAgICAgaWYgKHR5cGVNYXBwZXJDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHR5cGVNYXBwZXJJbnN0YW5jZSA9IChUeXBlTWFwKUNsYXNzLmZvck5hbWUodHlwZU1hcHBlckNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYmVhblRlbXBsYXRlID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYVByb3BlcnR5TmFtZXMuQkVBTl9XUklURVJfVEVNUExBVEVfS0VZKTsKLQotICAgICAgICAgICAgLy9zZXQgdGhlIHByb3BzIGFzIHRoZSBwcm9wZXJ0eSBtYXAKLSAgICAgICAgICAgIHByb3BlcnR5TWFwID0gcHJvcHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHBvc2VzIHRoZSB3aG9sZSBwcm9wZXJ0eSBzZXQKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBQcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0eU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5TWFwOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJlYW5UZW1wbGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGJlYW5UZW1wbGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJlYW5Xcml0ZXIgZ2V0QmVhbldyaXRlckluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gYmVhbldyaXRlckluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVHlwZU1hcCBnZXRUeXBlTWFwcGVySW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTWFwcGVySW5zdGFuY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9CZWFuV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0JlYW5Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwY2I0Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0JlYW5Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLkJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBiZWFuIHdyaXRlciBpbnRlcmZhY2UuIFRoZSBzY2hlbWEgY29tcGlsZXIgZXhwZWN0cyBvbmUgb2YgdGhlc2UgdG8gYmUKLSAqIHByZXNlbnRlZCB0byBpdCBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZHMKLSAqLwotcHVibGljIGludGVyZmFjZSBCZWFuV3JpdGVyIHsKLQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHdyaXRlciB3aXRoIGNvbXBpbGVyIG9wdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3B0aW9ucwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSB3cmFwcGVkIGNsYXNzLiBUaGlzIHdpbGwgaGF2ZSBlZmZlY3Qgb25seSBpZiB0aGUgQ29tcGlsZXJPcHRpb25zIHdyYXBjbGFzc3NlcwotICAgICAqIHJldHVybnMgdHJ1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJhdGNoKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1hcCBvZiBtb2RlbHMuIFRoaXMgaXMgdXNlZnVsIGZvciB0aWdodCBpbnRlZ3JhdGlvbnMgd2hlcmUgdGhlIGludGVybmFsIHdvcmtpbmdzCi0gICAgICogb2YgdGhlIHNjaGVtYSBjb21waWxlciBtYXkgYmUgZXhwb3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1vZGVsTWFwKCk7Ci0KLSAgICAvKiogTWFrZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGFuIGVsZW1lbnQgb3IgbmFtZWQgdHlwZQotICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIE5hbWUgZm9yIHRoaXMgZWxlbWVudCBvciB0eXBlIGluIHRoZSBzY2hlbWEKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB1c2UgaW4gZ2VuZXJhdGVkIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIG1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShRTmFtZSBxTmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGNvbXBsZXggdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBmdWxseVF1YWxpZmllZENsYXNzTmFtZSB0aGUgbmFtZSByZXR1cm5lZCBieSBtYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSBvciBudWxsIGlmIGl0IHdhc24ndCBjYWxsZWQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSBhIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYSBzaW1wbGUgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGUKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB3cml0ZShYbWxTY2hlbWFTaW1wbGVUeXBlIHNpbXBsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uOwotCi0KLSAgICAgLyoqCi0gICAgICogRmluZCB3aGV0aGVyIHRoZSBtYXBwZXIgY2xhc3MgbmFtZSBpcyBwcmVzZW50Ci0gICAgICogQHBhcmFtIG1hcHBlclBhY2thZ2VOYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoZSBtYXBwZXIgcGFja2FnZSBuYW1lIC0gdGhpcyBpcyByZWxldmFudCB0byBsYW5ndWFnZXMKLSAgICAgKiB0aGF0IGVuZm9yY2UgcGFja2FnaW5nIHN1Y2ggYXMgSmF2YSBvciBDIy4gTWF5IGJlIGlnbm9yZWQgaW4gb3RoZXIKLSAgICAgKiBsYW5ndWFnZXMKLSAgICAgKiBAcGFyYW0gbWFwcGVyUGFja2FnZU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZyBtYXBwZXJQYWNrYWdlTmFtZSk7Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBleHRlbnNpb25zIG1hcHBlciBjb21wb25lbnQgLSB0aGlzIGlzIHJlbGV2YW50IHRvIG9ubHkgdGhlIE9PUCBsYW5ndWFnZXMKLSAgICAgKiBhbmQgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG1heSBpZ25vcmUgdGhpcwotICAgICAqIEBwYXJhbSBtZXRhaW5mQXJyYXkKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVG9Vc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVuc2lvbk1hcHBlcihCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXJbXSBtZXRhaW5mQXJyYXkpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NBcnJheU5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYkNsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXR0cmliQXJyYXlDbGFzc05hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9DU3RydWN0V3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0NTdHJ1Y3RXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlNzVmMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvd3JpdGVyL0NTdHJ1Y3RXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5CZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuQ29tcGlsZXJPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pMThuLlNjaGVtYUNvbXBpbGVyTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudHlwZW1hcC5KYXZhVHlwZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsLlByaW1pdGl2ZVR5cGVGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudXRpbC5QcmltaXRpdmVUeXBlV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsLlNjaGVtYVByb3BlcnR5TG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRUZW1wbGF0ZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFV0aWxzOwotLy9pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkNVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuRE9NMldyaXRlcjsKLQotLyoqCi0gKiBKYXZhIEJlYW4gd3JpdGVyIGZvciB0aGUgc2NoZW1hIGNvbXBpbGVyLgotICovCi1wdWJsaWMgY2xhc3MgQ1N0cnVjdFdyaXRlciBpbXBsZW1lbnRzIEJlYW5Xcml0ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FID0gIldyYXBwZWREYXRhYmluZGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9QUkVGSVggPSAiYWRiXyI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgamF2YUJlYW5UZW1wbGF0ZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZW1wbGF0ZUxvYWRlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgVGVtcGxhdGVzIHNvdXJjZVRlbXBsYXRlQ2FjaGU7Ci0gICAgcHJpdmF0ZSBUZW1wbGF0ZXMgaGVhZGVyVGVtcGxhdGVDYWNoZTsKLQotICAgIHByaXZhdGUgTGlzdCBuYW1lc0xpc3Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ID0gMDsKLSAgICBwcml2YXRlIGJvb2xlYW4gd3JhcENsYXNzZXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gd3JpdGVDbGFzc2VzID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgRmlsZSByb290RGlyOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQ7Ci0gICAgcHJpdmF0ZSBEb2N1bWVudCBnbG9iYWxXcmFwcGVkSGVhZGVyRG9jdW1lbnQ7Ci0KLSAgICBwcml2YXRlIE1hcCBtb2RlbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9DTEFTU19QUkVGSVggPSAiYWRiXyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEQl9DTEFTU19QT1NURklYID0gIl90KiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ19DTEFTU19OQU1FID0gImF4aW9tX25vZGVfdCoiOwotCi0gICAgcHJpdmF0ZSBNYXAgYmFzZVR5cGVNYXAgPSBuZXcgSmF2YVR5cGVNYXAoKS5nZXRUeXBlTWFwKCk7Ci0KLSAgICAvLyBhIGxpc3Qgb2YgZXh0ZXJuYWxseSBpZGVudGlmaWVkIFFOYW1lcyB0byBiZSBwcm9jZXNzZWQuIFRoaXMgYmVjb21lcwotICAgIC8vIHVzZWZ1bCB3aGVuICBvbmx5IGEgbGlzdCBvZiBleHRlcm5hbCBlbGVtZW50cyBuZWVkIHRvIGJlIHByb2Nlc3NlZAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTEFTU19OQU1FID0gImF4aW9tX25vZGVfdCoiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xBU1NfQVJSQVlfTkFNRSA9ICJheGlvbV9ub2RlX3QqIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUUgPSAiYXhpb21fYXR0cmlidXRlX3QqIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FUVFJJQl9BUlJBWV9DTEFTU19OQU1FID0gImF4aW9tX2F0dHJpYnV0ZV90KiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RZUEVfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENTdHJ1Y3RXcml0ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyByZXR1cm5zIGEgbWFwIG9mIFFuYW1lcyB2cyBET01Eb2N1bWVudCBtb2RlbHMuIE9uZSBjYW4gdXNlIHRoaXMgbWV0aG9kIHRvCi0gICAgICogb2J0YWluIHRoZSByYXcgRE9NbW9kZWxzIHVzZWQgdG8gd3JpdGUgdGhlIGNsYXNzZXMuCi0gICAgICogVGhpcyBoYXMgbm8gbWVhbmluZyB3aGVuIHRoZSBjbGFzc2VzIGFyZSBzdXBwb3NlZCB0byBiZSB3cmFwcGVkICBzbyB0aGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAuCi0gICAgICogQHNlZSBCZWFuV3JpdGVyI2dldE1vZGVsTWFwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1vZGVsTWFwKCkgewotICAgICAgICByZXR1cm4gbW9kZWxNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENsYXNzQXJyYXlOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19BUlJBWV9OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXR0cmliQXJyYXlDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBERUZBVUxUX0FUVFJJQl9BUlJBWV9DTEFTU19OQU1FOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbXBpbGVyT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5pdFdpdGhGaWxlKG9wdGlvbnMuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlQ2xhc3NlcyA9IG9wdGlvbnMuaXNXcml0ZU91dHB1dCgpOwotICAgICAgICAgICAgaWYgKCF3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICB3cmFwQ2xhc3NlcyA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cmFwQ2xhc3NlcyA9IG9wdGlvbnMuaXNXcmFwQ2xhc3NlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2lmIHRoZSB3cmFwIG1vZGUgaXMgc2V0IHRoZW4gY3JlYXRlIGEgZ2xvYmFsIGRvY3VtZW50IHRvIGtlZXAgdGhlIHdyYXBwZWQKLSAgICAgICAgICAgIC8vZWxlbWVudCBtb2RlbHMKLSAgICAgICAgICAgIGlmIChvcHRpb25zLmlzV3JhcENsYXNzZXMoKSkgewotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWRTb3VyY2VEb2N1bWVudCA9IFhTTFRVdGlscy5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBYU0xUVXRpbHMuZ2V0RWxlbWVudChnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQsICJiZWFucyIpOwotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWRTb3VyY2VEb2N1bWVudC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQsICJuYW1lIiwgQ1N0cnVjdFdyaXRlci5XUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWRIZWFkZXJEb2N1bWVudCA9IFhTTFRVdGlscy5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50ID0gWFNMVFV0aWxzLmdldEVsZW1lbnQoZ2xvYmFsV3JhcHBlZEhlYWRlckRvY3VtZW50LCAiYmVhbnMiKTsKLSAgICAgICAgICAgICAgICBnbG9iYWxXcmFwcGVkSGVhZGVyRG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZ2xvYmFsV3JhcHBlZEhlYWRlckRvY3VtZW50LCAibmFtZSIsIENTdHJ1Y3RXcml0ZXIuV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7IC8vdG9kbyBuZWVkIHRvIHB1dCBjb3JyZWN0IGVycm9yIG1lc3NhZ2VzCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSB0eXBlTWFwCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gZWxlbWVudC5nZXRRTmFtZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBpc0Fic3RyYWN0Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5TY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBYnN0cmFjdCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBwYWNrYWdlIGZvciB0aGlzIHR5cGUuCi0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCBmYWxzZSwgaXNBYnN0cmFjdCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlciN3cml0ZUJhdGNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJhdGNoKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3cmFwQ2xhc3NlcykgewotCi0gICAgICAgICAgICAgICAgRmlsZSBvdXRTb3VyY2UgPSBjcmVhdGVPdXRGaWxlKENTdHJ1Y3RXcml0ZXIuV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FLCAiLmMiKTsKLSAgICAgICAgICAgICAgICBGaWxlIG91dEhlYWRlciA9IGNyZWF0ZU91dEZpbGUoQ1N0cnVjdFdyaXRlci5XUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUUsICIuaCIpOwotICAgICAgICAgICAgICAgIC8vcGFyc2Ugd2l0aCB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZSB0aGUgZmlsZXMKLSAgICAgICAgICAgICAgICBwYXJzZVNvdXJjZShnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQsIG91dFNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcGFyc2VIZWFkZXIoZ2xvYmFsV3JhcHBlZEhlYWRlckRvY3VtZW50LCBvdXRIZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNpbXBsZVR5cGUKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFhtbFNjaGVtYVNpbXBsZVR5cGUgc2ltcGxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9kZXRlcm1pbmUgdGhlIHBhY2thZ2UgZm9yIHRoaXMgdHlwZS4KLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc2ltcGxlVHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBxTmFtZSA9IChRTmFtZSkgc2ltcGxlVHlwZS5nZXRNZXRhSW5mb01hcCgpLmdldChTY2hlbWFDb25zdGFudHMuU2NoZW1hQ29tcGlsZXJJbmZvSG9sZGVyLkZBS0VfUU5BTUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0YWluZi5hZGR0U3RhdHVzKHFOYW1lLCBTY2hlbWFDb25zdGFudHMuU0lNUExFX1RZUEVfT1JfQ09OVEVOVCk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByb290RGlyCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuQmVhbldyaXRlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0V2l0aEZpbGUoRmlsZSByb290RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocm9vdERpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnJvb3REaXIgPSBuZXcgRmlsZSgiLiIpOwotICAgICAgICB9IGVsc2UgaWYgKCFyb290RGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS5yb290bm90Zm9sZGVyZXhjZXB0aW9uIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5yb290RGlyID0gcm9vdERpcjsKLSAgICAgICAgfQotCi0gICAgICAgIG5hbWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgamF2YUJlYW5UZW1wbGF0ZU5hbWUgPSBTY2hlbWFQcm9wZXJ0eUxvYWRlci5nZXRCZWFuVGVtcGxhdGUoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciBhbiBlbGVtZW50IG9yIG5hbWVkIHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIE5hbWUgZm9yIHRoaXMgZWxlbWVudCBvciB0eXBlIGluIHRoZSBzY2hlbWEKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB1c2UgaW4gZ2VuZXJhdGVkIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIG1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShRTmFtZSBxTmFtZSkgewotCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICByZXR1cm4gbWFrZVVuaXF1ZUNTdHJ1Y3ROYW1lKHRoaXMubmFtZXNMaXN0LCBvcmlnaW5hbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdXRpbCBtZXRob2QgdGhhdCBob2xkcyBjb21tb24gY29kZQotICAgICAqIGZvciB0aGUgY29tcGxldGUgc2NoZW1hIHRoYXQgdGhlIGdlbmVyYXRlZCBYTUwgY29tcGxpZXMgdG8KLSAgICAgKiBsb29rIHVuZGVyIG90aGVyL2JlYW5HZW5lcmF0aW9uU2NoZW1hLnhzZAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBpc0VsZW1lbnQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvY2VzcyhRTmFtZSBxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gbWV0YWluZi5nZXRPd25DbGFzc05hbWUoKTsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID09IG51bGwpCi0gICAgICAgICAgICBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IG1ha2VGdWxseVF1YWxpZmllZENsYXNzTmFtZShxTmFtZSk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQotCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBxTmFtZSA9PSBudWxsPyAiIiA6IHFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoIXRlbXBsYXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICBsb2FkVGVtcGxhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vaWYgd3JhcHBlZCB0aGVuIGRvIG5vdCB3cml0ZSB0aGUgY2xhc3NlcyBub3cgYnV0IGFkZCB0aGUgbW9kZWxzIHRvIGEgZ2xvYmFsIGRvY3VtZW50LiBIb3dldmVyIGluIG9yZGVyIHRvIHdyaXRlIHRoZQotICAgICAgICAvL2dsb2JhbCBjbGFzcyB0aGF0IGlzIGdlbmVyYXRlZCwgb25lIG5lZWRzIHRvIGNhbGwgdGhlIHdyaXRlQmF0Y2goKSBtZXRob2QKLSAgICAgICAgaWYgKHdyYXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICBnbG9iYWxXcmFwcGVkU291cmNlRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgIGdldEJlYW5FbGVtZW50KGdsb2JhbFdyYXBwZWRTb3VyY2VEb2N1bWVudCwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lLCBxTmFtZSwgaXNFbGVtZW50LCBpc0Fic3RyYWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCkpOwotCi0gICAgICAgICAgICBnbG9iYWxXcmFwcGVkSGVhZGVyRG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgIGdldEJlYW5FbGVtZW50KGdsb2JhbFdyYXBwZWRIZWFkZXJEb2N1bWVudCwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lLCBxTmFtZSwgaXNFbGVtZW50LCBpc0Fic3RyYWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCkpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgbW9kZWwKLSAgICAgICAgICAgIERvY3VtZW50IG1vZGVsU291cmNlID0gWFNMVFV0aWxzLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBtb2RlbEhlYWRlciA9IFhTTFRVdGlscy5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgLy9tYWtlIHRoZSBYTUwKLSAgICAgICAgICAgIG1vZGVsU291cmNlLmFwcGVuZENoaWxkKGdldEJlYW5FbGVtZW50KG1vZGVsU291cmNlLCBjbGFzc05hbWUsIG9yaWdpbmFsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUsIGlzRWxlbWVudCwgaXNBYnN0cmFjdCwgbWV0YWluZiwgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwKSk7Ci0gICAgICAgICAgICBtb2RlbEhlYWRlci5hcHBlbmRDaGlsZChnZXRCZWFuRWxlbWVudChtb2RlbEhlYWRlciwgY2xhc3NOYW1lLCBvcmlnaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lLCBpc0VsZW1lbnQsIGlzQWJzdHJhY3QsIG1ldGFpbmYsIHByb3BlcnR5TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCkpOwotCi0gICAgICAgICAgICBpZiAod3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgLy9jcmVhdGUgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDQsIGNsYXNzTmFtZS5sZW5ndGgoKSAtMyk7Ci0gICAgICAgICAgICAgICAgRmlsZSBvdXRTb3VyY2UgPSBjcmVhdGVPdXRGaWxlKGZpbGVOYW1lLCAiLmMiKTsKLSAgICAgICAgICAgICAgICBGaWxlIG91dEhlYWRlciA9IGNyZWF0ZU91dEZpbGUoZmlsZU5hbWUsICIuaCIpOwotICAgICAgICAgICAgICAgIC8vcGFyc2Ugd2l0aCB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZSB0aGUgZmlsZXMKLSAgICAgICAgICAgICAgICBwYXJzZVNvdXJjZShtb2RlbFNvdXJjZSwgb3V0U291cmNlKTsKLSAgICAgICAgICAgICAgICBwYXJzZUhlYWRlcihtb2RlbEhlYWRlciwgb3V0SGVhZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9hZGQgdGhlIG1vZGVsIHRvIHRoZSBtb2RlbCBtYXAKLSAgICAgICAgICAgIG1vZGVsTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBjbGFzc05hbWUpCi0gICAgICAgICAgICAgICAgICAgICwgbW9kZWxTb3VyY2UpOwotICAgICAgICAgICAgbW9kZWxNYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIGNsYXNzTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLCBtb2RlbEhlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcobW9kZWxTb3VyY2UuZ2V0Rmlyc3RDaGlsZCgpKSk7Ci0gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIH0KLQotICAgICAgICAvL3JldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICAgICAgcmV0dXJuIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHBhcmFtIG9yaWdpbmFsTmFtZQotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBpc0VsZW1lbnQKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRWxlbWVudC4KLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0QmVhbkVsZW1lbnQoCi0gICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgb3JpZ2luYWxOYW1lLAotICAgICAgICAgICAgUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICBib29sZWFuIGlzRWxlbWVudCwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNBYnN0cmFjdCwKLSAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TmFtZXMsCi0gICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXApCi0gICAgIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRWxlbWVudCByb290RWx0ID0gWFNMVFV0aWxzLmdldEVsZW1lbnQobW9kZWwsICJjbGFzcyIpOwotICAgICAgICBTdHJpbmcgc3RyaXBwZWRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDQsIGNsYXNzTmFtZS5sZW5ndGgoKSAtMyk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuYW1lIiwgc3RyaXBwZWRDbGFzc05hbWUsIHJvb3RFbHQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgb3JpZ2luYWxOYW1lLCByb290RWx0KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHJvb3RFbHQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnNwcmVmaXgiLCBnZXRQcmVmaXhGb3JVUkkocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lLmdldFByZWZpeCgpKSwgcm9vdEVsdCk7Ci0KLSAgICAgICAgLyogdXNlIGNhcHMgZm9yIG1hY3JvcyAqLwotICAgICAgICBTdHJpbmcgY2Fwc05hbWUgPSBzdHJpcHBlZENsYXNzTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiY2Fwcy1uYW1lIiwgY2Fwc05hbWUsIHJvb3RFbHQpOwotCi0KLSAgICAgICAgaWYgKCF3cmFwQ2xhc3NlcykgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVud3JhcHBlZCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0Fic3RyYWN0KSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaXNBYnN0cmFjdCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghd3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNFbGVtZW50KSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidHlwZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbm9uIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNFeHRlbnNpb24oKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImV4dGVuc2lvbiIsIG1ldGFpbmYuZ2V0RXh0ZW5zaW9uQ2xhc3NOYW1lKCksIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicmVzdHJpY3Rpb24iLCBtZXRhaW5mCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXN0cmljdGlvbkNsYXNzTmFtZSgpLCByb290RWx0KTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNDaG9pY2UoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNob2ljZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNVbmlvbigpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidW5pb24iLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc0xpc3QoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImxpc3QiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm9yZGVyZWQiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNFbGVtZW50ICYmIG1ldGFpbmYuaXNOaWxsYWJsZShxTmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuaWxsYWJsZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUGFydGljbGVDbGFzcygpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicGFydGljbGVDbGFzcyIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzSGFzUGFydGljbGVUeXBlKCkpewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImhhc1BhcnRpY2xlVHlwZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcG9wdWxhdGUgYWxsIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICBwb3B1bGF0ZUluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCwgZmFsc2UpOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzU2ltcGxlKCkgJiYgbWV0YWluZi5pc1VuaW9uKCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTWVtYmVySW5mbyhtZXRhaW5mLCBtb2RlbCwgcm9vdEVsdCwgdHlwZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpICYmIG1ldGFpbmYuaXNMaXN0KCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTGlzdEluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9vdEVsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpc3RJbmZvKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwKSB7Ci0KLSAgICAgICAgU3RyaW5nIGNOYW1lID0gbWFrZVVuaXF1ZUNTdHJ1Y3ROYW1lKG5ldyBBcnJheUxpc3QoKSwgbWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBFbGVtZW50IGl0ZW1UeXBlID0gWFNMVFV0aWxzLmFkZENoaWxkRWxlbWVudChtb2RlbCwgIml0ZW10eXBlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidHlwZSIsIG1ldGFpbmYuZ2V0SXRlbVR5cGVDbGFzc05hbWUoKSwgaXRlbVR5cGUpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnN1cmkiLCBtZXRhaW5mLmdldEl0ZW1UeXBlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgaXRlbVR5cGUpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgbWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIGl0ZW1UeXBlKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNuYW1lIiwgY05hbWUuc3Vic3RyaW5nKDQsIGNOYW1lLmxlbmd0aCgpLTMpLCBpdGVtVHlwZSk7Ci0KLSAgICAgICAgaWYgKHR5cGVNYXAuY29udGFpbnNLZXkobWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0SXRlbVR5cGVDbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInRydWUiLCBpdGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVGaW5kZXIuaXNQcmltaXRpdmUobWV0YWluZi5nZXRJdGVtVHlwZUNsYXNzTmFtZSgpKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInByaW1pdGl2ZSIsICJ5ZXMiLCBpdGVtVHlwZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWVtYmVySW5mbyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwKSB7Ci0gICAgICAgIE1hcCBtZW1iZXJUeXBlcyA9IG1ldGFpbmYuZ2V0TWVtYmVyVHlwZXMoKTsKLSAgICAgICAgUU5hbWUgbWVtYmVyUU5hbWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1lbWJlclR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgbWVtYmVyUU5hbWUgPSAoUU5hbWUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG1lbWJlckNsYXNzID0gKFN0cmluZykgbWVtYmVyVHlwZXMuZ2V0KG1lbWJlclFOYW1lKTsKLSAgICAgICAgICAgIGlmIChQcmltaXRpdmVUeXBlRmluZGVyLmlzUHJpbWl0aXZlKG1lbWJlckNsYXNzKSkgewotICAgICAgICAgICAgICAgICBtZW1iZXJDbGFzcyA9IFByaW1pdGl2ZVR5cGVXcmFwcGVyLmdldFdyYXBwZXIobWVtYmVyQ2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBtZW1iZXIgdHlwZSBlbGVtZW50Ci0gICAgICAgICAgICBFbGVtZW50IG1lbWJlclR5cGUgPSBYU0xUVXRpbHMuYWRkQ2hpbGRFbGVtZW50KG1vZGVsLCAibWVtYmVyVHlwZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlIiwgbWVtYmVyQ2xhc3MsIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgbWVtYmVyUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm9yaWdpbmFsTmFtZSIsIG1lbWJlclFOYW1lLmdldExvY2FsUGFydCgpLCBtZW1iZXJUeXBlKTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJjYXBzLW9yaWdpbmFsTmFtZSIsIG1lbWJlclFOYW1lLmdldExvY2FsUGFydCgpLnRvVXBwZXJDYXNlKCksIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVNYXAuY29udGFpbnNLZXkobWVtYmVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm91cnMiLCAidHJ1ZSIsIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSByb290RWx0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUluZm8oQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luaGVyaXRlZCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiAoIW1ldGFpbmYuaXNSZXN0cmljdGlvbigpIHx8IChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiBtZXRhaW5mLmlzU2ltcGxlKCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcG9wdWxhdGVJbmZvKG1ldGFpbmYuZ2V0UGFyZW50KCksIG1vZGVsLCByb290RWx0LCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICB0eXBlTWFwLCBncm91cFR5cGVNYXAsIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFByb3BlcnR5RW50cmllcyhtZXRhaW5mLCBtb2RlbCwgcm9vdEVsdCwgcHJvcGVydHlOYW1lcywgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCBpc0luaGVyaXRlZCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSByb290RWx0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLS0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlFbnRyaWVzKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsIEVsZW1lbnQgcm9vdEVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luaGVyaXRlZCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ28gaW4gdGhlIGxvb3AgYW5kIGFkZCB0aGUgcGFydCBlbGVtZW50cwotICAgICAgICBRTmFtZVtdIHFOYW1lOwotICAgICAgICBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHFOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIHBhcmVudE1ldGFJbmYgPSBtZXRhaW5mLmdldFBhcmVudCgpOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBxTmFtZSA9IG1ldGFpbmYuZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lID0gbWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFOYW1lLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBxTmFtZXMuYWRkKHFOYW1lW2ldKTsKLSAgICAgICAgfQotICAgICAgICAvL2FkZGluZyBtaXNzaW5nIFFOYW1lcyB0byB0aGUgZW5kLCBpbmNsdWRpbmcgZWxlbWVudHMgJiBhdHRyaWJ1dGVzLgotICAgICAgICAvLyBmb3IgdGhlIHNpbXBsZSB0eXBlcyB3ZSBoYXZlIGFscmVhZHkgYWRkIHRoZSBwYXJlbnQgZWxlbWVudHMKLSAgICAgICAgLy8gaXQgaXMgYWxtb3N0IGNvbnNpZGVyIGFzIGFuIGV4dGVuc2lvbgotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uKCkgJiYgIW1ldGFpbmYuaXNTaW1wbGUoKSkgewotICAgICAgICAgICAgYWRkTWlzc2luZ1FOYW1lcyhtZXRhaW5mLCBxTmFtZXMsIG1pc3NpbmdRTmFtZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWUgbmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxTmFtZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRWxlbWVudCBwcm9wZXJ0eSA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJwcm9wZXJ0eSIsIHJvb3RFbHQpOwotICAgICAgICAgICAgbmFtZSA9IHFOYW1lW2ldOwotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBtYWtlVW5pcXVlQ1N0cnVjdE5hbWUobmV3IEFycmF5TGlzdCgpLCBuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5hbWUiLCBuYW1lLmdldExvY2FsUGFydCgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgcHJvcGVydHkpOwotCi0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuc3VyaSIsIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHByb3BlcnR5KTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwcmVmaXgiLCBuYW1lLmdldFByZWZpeCgpLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJjbmFtZSIsIHhtbE5hbWUuc3Vic3RyaW5nKDQsIHhtbE5hbWUubGVuZ3RoKCkgLTMpLCBwcm9wZXJ0eSk7Ci0KLQotICAgICAgICAgICAgU3RyaW5nIENDbGFzc05hbWVGb3JFbGVtZW50ID0gbWV0YWluZi5nZXRDbGFzc05hbWVGb3JRTmFtZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKENDbGFzc05hbWVGb3JFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCA9IENTdHJ1Y3RXcml0ZXIuREVGQVVMVF9DX0NMQVNTX05BTUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCA9IGdldFNob3J0VHlwZU5hbWUoQ0NsYXNzTmFtZUZvckVsZW1lbnQpOwotCi0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlIiwgQ0NsYXNzTmFtZUZvckVsZW1lbnQsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBDYXBzIGZvciB1c2UgaW4gQyBtYWNyb3MKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNhcHMtY25hbWUiLCB4bWxOYW1lLnN1YnN0cmluZyg0LCB4bWxOYW1lLmxlbmd0aCgpIC0zICkudG9VcHBlckNhc2UoKSwgcHJvcGVydHkpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNhcHMtdHlwZSIsIENDbGFzc05hbWVGb3JFbGVtZW50LnRvVXBwZXJDYXNlKCksIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVGaW5kZXIuaXNQcmltaXRpdmUoQ0NsYXNzTmFtZUZvckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInByaW1pdGl2ZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2FkZCBhbiBhdHRyaWJ1dGUgdGhhdCBzYXlzIHRoZSB0eXBlIGlzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChpc0RlZmF1bHQoQ0NsYXNzTmFtZUZvckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImRlZmF1bHQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgLy8gYWRkIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc0RlZmF1bHRWYWx1ZUF2YWlsYWJsZShuYW1lKSl7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hUU5hbWUgPSBtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlTWFwLmNvbnRhaW5zS2V5KHNjaGVtYVFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJkZWZhdWx0VmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYuZ2V0RGVmYXVsdFZhbHVlRm9yUU5hbWUobmFtZSksIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKERFRkFVTFRfVFlQRV9OUykpCi0gICAgICAgICAgICAgICAgICAgICAmJiAhQ0NsYXNzTmFtZUZvckVsZW1lbnQuZXF1YWxzKERFRkFVTFRfQ19DTEFTU19OQU1FKQotICAgICAgICAgICAgICAgICAgICAgJiYgIUNDbGFzc05hbWVGb3JFbGVtZW50LmVxdWFscyhERUZBVUxUX0FUVFJJQl9DTEFTU19OQU1FKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInllcyIsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRBdHRyaWJ1dGVTdGF0dXNGb3JRTmFtZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhdHRyaWJ1dGUiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5vdGF0dHJpYnV0ZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzTmlsbGFibGUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibmlsbGFibGUiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc2hvcnRUeXBlTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vc2VlIHdoZXRoZXIgdGhlIFFOYW1lIGlzIGEgYmFzZXR5cGUKLSAgICAgICAgICAgICAgICBpZiAoYmFzZVR5cGVNYXAuY29udGFpbnNLZXkobWV0YWluZi5nZXRTY2hlbWFRTmFtZUZvclFOYW1lKG5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBzaG9ydFR5cGVOYW1lID0gbWV0YWluZi5nZXRTY2hlbWFRTmFtZUZvclFOYW1lKG5hbWUpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0VHlwZU5hbWUgPSBnZXRTaG9ydFR5cGVOYW1lKENDbGFzc05hbWVGb3JFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNob3J0VHlwZU5hbWUgPSBnZXRTaG9ydFR5cGVOYW1lKENDbGFzc05hbWVGb3JFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaG9ydHR5cGVuYW1lIiwgc2hvcnRUeXBlTmFtZSwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICBpZiAoaXNJbmhlcml0ZWQpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaW5oZXJpdGVkIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QW55U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYW55IiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QmluYXJ5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYmluYXJ5IiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0U2ltcGxlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wdXQgdGhlIG1pbiBvY2N1cnMgY291bnQgaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgaXQncyBhbiBhcnJheSBvciBub3QKLSAgICAgICAgICAgIGxvbmcgbWluT2NjdXJzID0gbWV0YWluZi5nZXRNaW5PY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWluT2NjdXJzIiwgbWluT2NjdXJzICsgIiIsIHByb3BlcnR5KTsKLQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRBcnJheVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgYXJyYXlUb2tlblN0YXJ0ID0gYXR0ck5hbWUuaW5kZXhPZigiQXJyYXkiKTsKLSAgICAgICAgICAgICAgICBpZiAoYXJyYXlUb2tlblN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFycmF5RWxlID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIGFycmF5VG9rZW5TdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhcnJheWVsZSIsIGFycmF5RWxlLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJpc2FycmF5IiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXlCYXNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgICAgIGxvbmcgbWF4T2NjdXJzID0gbWV0YWluZi5nZXRNYXhPY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1heE9jY3VycyA9PSBMb25nLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidW5ib3VuZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhPY2N1cnMiLCBtYXhPY2N1cnMgKyAiIiwgcHJvcGVydHkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgocGFyZW50TWV0YUluZiAhPSBudWxsKSAmJiBtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiBtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGRldGFpbHMgc2hvdWxkIGJlIHRoZXJlIHdpdGggdGhlIHBhcmVudCBtZXRhIEluZgotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZXNUb1Byb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TWV0YUluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENDbGFzc05hbWVGb3JFbGVtZW50KTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGVzVG9Qcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBDQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlc1RvUHJvcGVydHkoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIENDbGFzc05hbWVGb3JFbGVtZW50KSB7Ci0gICAgICAgICAgICAvLyBhZGQgYW4gYXR0cmlidXRlIHRoYXQgc2F5cyB0aGUgdHlwZSBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXREZWZhdWx0U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiZGVmYXVsdCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKERFRkFVTFRfVFlQRV9OUykpCi0gICAgICAgICAgICAgICAgICAgICAmJiAhQ0NsYXNzTmFtZUZvckVsZW1lbnQuZXF1YWxzKERFRkFVTFRfQ19DTEFTU19OQU1FKQotICAgICAgICAgICAgICAgICAgICAgJiYgIUNDbGFzc05hbWVGb3JFbGVtZW50LmVxdWFscyhERUZBVUxUX0FUVFJJQl9DTEFTU19OQU1FKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QXR0cmlidXRlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXR0cmlidXRlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNOaWxsYWJsZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuaWxsYWJsZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldE9wdGlvbmFsQXR0cmlidXRlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3B0aW9uYWwiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgc2hvcnRUeXBlTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGV0aGVyIHRoZSBRTmFtZSBpcyBhIGJhc2V0eXBlCi0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzaG9ydFR5cGVOYW1lID0gZ2V0U2hvcnRUeXBlTmFtZShDQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaG9ydFR5cGVOYW1lID0gZ2V0U2hvcnRUeXBlTmFtZShDQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2hvcnR0eXBlbmFtZSIsIHNob3J0VHlwZU5hbWUsIHByb3BlcnR5KTsKLQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRBbnlTdGF0dXNGb3JRTmFtZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5nZXRCaW5hcnlTdGF0dXNGb3JRTmFtZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJiaW5hcnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpIHx8IG1ldGFpbmYuZ2V0U2ltcGxlU3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHV0IHRoZSBtaW4gb2NjdXJzIGNvdW50IGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIGl0J3MgYW4gYXJyYXkgb3IKLSAgICAgICAgICAgIC8vIG5vdAotICAgICAgICAgICAgbG9uZyBtaW5PY2N1cnMgPSBtZXRhaW5mLmdldE1pbk9jY3VycyhuYW1lKTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5PY2N1cnMiLCBtaW5PY2N1cnMgKyAiIiwgcHJvcGVydHkpOwotCi0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhcnJheSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXggPSBDQ2xhc3NOYW1lRm9yRWxlbWVudC5pbmRleE9mKCJbIik7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImFycmF5QmFzZVR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDbGFzc05hbWVGb3JFbGVtZW50LnN1YnN0cmluZygwLCBlbmRJbmRleCksIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXJyYXlCYXNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NsYXNzTmFtZUZvckVsZW1lbnQsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsb25nIG1heE9jY3VycyA9IG1ldGFpbmYuZ2V0TWF4T2NjdXJzKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChtYXhPY2N1cnMgPT0gTG9uZy5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVuYm91bmQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhPY2N1cnMiLCBtYXhPY2N1cnMgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZXN0cmljdGlvbkJhc2VUeXBlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNFeHRlbnNpb25CYXNlVHlwZShuYW1lKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJleHRlbnNpb25CYXNlVHlwZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldExlbmd0aEZhY2V0KCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibGVuRmFjZXQiLCBtZXRhaW5mLmdldExlbmd0aEZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNYXhMZW5ndGhGYWNldCgpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1heExlbkZhY2V0IiwgbWV0YWluZi5nZXRNYXhMZW5ndGhGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWluTGVuZ3RoRmFjZXQoKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5MZW5GYWNldCIsIG1ldGFpbmYuZ2V0TWluTGVuZ3RoRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1heEV4Y2x1c2l2ZUZhY2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhFeEZhY2V0IiwgbWV0YWluZi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1pbkV4RmFjZXQiLCBtZXRhaW5mLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNYXhJbmNsdXNpdmVGYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWF4SW5GYWNldCIsIG1ldGFpbmYuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1pbkluY2x1c2l2ZUZhY2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5JbkZhY2V0IiwgbWV0YWluZi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtZXRhaW5mLmdldEVudW1GYWNldCgpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRKYXZhID0gdHJ1ZTsgICAgLy8gQXNzdW1lIGFsbCBlbnVtIHZhbHVlcyBhcmUgdmFsaWQgaWRzCi0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1ldGFpbmYuZ2V0RW51bUZhY2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSB2YWx1ZXMgbG9va2luZyBmb3IgaW52YWxpZCBpZHMKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFKYXZhVXRpbHMuaXNKYXZhSWQodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEphdmEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBpZCA9IDA7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBtZXRhaW5mLmdldEVudW1GYWNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVudW1GYWNldCA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJlbnVtRmFjZXQiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWx1ZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInZhbHVlIiwgYXR0cmliVmFsdWUsIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEphdmEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJpZCIsIGF0dHJpYlZhbHVlLnRvVXBwZXJDYXNlKCksIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBhbGwgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCBhcHBlbmQgYW4gaWQgdG8gYXZvaWQgY29sbGlzaW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImlkIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYlZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZUFsbCgiW15BLVowLTldIiwgIl8iKSArICJfIiArIGlkLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRQYXR0ZXJuRmFjZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInBhdHRlcm5GYWNldCIsIG1ldGFpbmYuZ2V0UGF0dGVybkZhY2V0KCksIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRNaXNzaW5nUU5hbWVzKEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLCBBcnJheUxpc3QgcU5hbWUsIEFycmF5TGlzdCBtaXNzaW5nUU5hbWVzKSB7Ci0KLSAgICAgICAgUU5hbWVbXSBxTmFtZXMgPSBudWxsOwotICAgICAgICBRTmFtZVtdIHBRTmFtZXMgPSBudWxsOwotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwYXJlbnRNZXRhSW5mID0gbWV0YWluZi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAobWV0YWluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgcU5hbWVzID0gbWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcU5hbWVzID0gbWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50TWV0YUluZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50TWV0YUluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhSW5mLmdldE9yZGVyZWRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhSW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IHBRTmFtZXMgIT0gbnVsbCAmJiBpIDwgcFFOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHFOYW1lTm90Rm91bmQocFFOYW1lc1tpXSwgbWV0YWluZikpIHsKLSAgICAgICAgICAgICAgICBtaXNzaW5nUU5hbWVzLmFkZChwUU5hbWVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2FkZGluZyBtaXNzaW5nIFFOYW1lcyB0byB0aGUgZW5kIG9mIGxpc3QuCi0gICAgICAgIGlmICghbWlzc2luZ1FOYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlzc2luZ1FOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHFOYW1lLmFkZChtaXNzaW5nUU5hbWVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBxTmFtZU5vdEZvdW5kKFFOYW1lIHFuYW1lLCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgewotCi0gICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgUU5hbWVbXSBxTmFtZXM7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0UU5hbWVBcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBxTmFtZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocU5hbWVzW2pdLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIWZvdW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gQ0NsYXNzTmFtZUZvckVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIGJvb2wKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBDQ2xhc3NOYW1lRm9yRWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdENsYXNzTmFtZSgpLmVxdWFscyhDQ2xhc3NOYW1lRm9yRWxlbWVudCkgfHwKLSAgICAgICAgICAgICAgICBnZXREZWZhdWx0Q2xhc3NBcnJheU5hbWUoKS5lcXVhbHMoQ0NsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gdGhlIHhtbCBuYW1lLCBtYWtlIGEgdW5pcXVlIGNsYXNzIG5hbWUgdGFraW5nIGludG8gYWNjb3VudCB0aGF0IHNvbWUKLSAgICAgKiBmaWxlIHN5c3RlbXMgYXJlIGNhc2Ugc2Vuc2l0aXZlIGFuZCBzb21lIGFyZSBub3QuCi0gICAgICogLUNvbnNpZGVyIHRoZSBKYXgtV1Mgc3BlYyBmb3IgdGhpcwotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RPZk5hbWVzCi0gICAgICogQHBhcmFtIHhtbE5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1ha2VVbmlxdWVDU3RydWN0TmFtZShMaXN0IGxpc3RPZk5hbWVzLCBTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICBTdHJpbmcgY05hbWU7Ci0gICAgICAgIGlmIChDVXRpbHMuaXNDS2V5d29yZCh4bWxOYW1lKSkgewotICAgICAgICAgICAgY05hbWUgPSBDVXRpbHMubWFrZU5vbkNLZXl3b3JkKHhtbE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9qYXZhTmFtZSA9IEphdmFVdGlscy5jYXBpdGFsaXplRmlyc3RDaGFyKEphdmFVdGlscy54bWxOYW1lVG9KYXZhKHhtbE5hbWUpKTsKLSAgICAgICAgICAgIGNOYW1lID0geG1sTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNOYW1lID0gY05hbWUucmVwbGFjZSgnLicsJ18nKTsKLSAgICAgICAgY05hbWUgPSBjTmFtZS5yZXBsYWNlKCctJywnXycpOwotCi0gICAgICAgIHdoaWxlIChsaXN0T2ZOYW1lcy5jb250YWlucyhjTmFtZS50b0xvd2VyQ2FzZSgpKSkgewotICAgICAgICAgICAgaWYgKCFsaXN0T2ZOYW1lcy5jb250YWlucygoY05hbWUgKyAiRSIpLnRvTG93ZXJDYXNlKCkpKXsKLSAgICAgICAgICAgICAgICBjTmFtZSA9IGNOYW1lICsgIkUiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjTmFtZSA9IGNOYW1lICsgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNOYW1lID0gY05hbWUgKyBDU3RydWN0V3JpdGVyLmNvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBsaXN0T2ZOYW1lcy5hZGQoY05hbWUudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG1vZGlmaWVkQ05hbWUgPSBBREJfQ0xBU1NfUFJFRklYICArIGNOYW1lICsgQURCX0NMQVNTX1BPU1RGSVg7Ci0gICAgICAgIHJldHVybiBtb2RpZmllZENOYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQSBiaXQgb2YgY29kZSBmcm9tIHRoZSBvbGQgY29kZSBnZW5lcmF0b3IuIFdlIGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSB0ZW1wbGF0ZQotICAgICAqIGVuZ2luZXMgYW5kIHN1Y2ggc3R1ZmYgdGhhdCdzIGFscmVhZHkgdGhlcmUuIEJ1dCB0aGUgY2xhc3Mgd3JpdGVycyBhcmUgaGFyZCB0byBiZQotICAgICAqIHJldXNlZCBzbyBzb21lIGNvZGUgbmVlZHMgdG8gYmUgcmVwZWF0ZWQgKGF0bGVhc3QgYSBiaXQpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRUZW1wbGF0ZSgpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy9maXJzdCBnZXQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnR5IG1hcAotICAgICAgICBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0geHNsU3RyZWFtOwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gamF2YUJlYW5UZW1wbGF0ZU5hbWU7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lICsgIlNvdXJjZS54c2wiOwotICAgICAgICAgICAgICAgIHhzbFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oc291cmNlVGVtcGxhdGVOYW1lKTsKLSAgICAgICAgICAgICAgICBzb3VyY2VUZW1wbGF0ZUNhY2hlID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsU3RyZWFtKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lICsgIkhlYWRlci54c2wiOwotICAgICAgICAgICAgICAgIHhzbFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0oaGVhZGVyVGVtcGxhdGVOYW1lKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJUZW1wbGF0ZUNhY2hlID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2UoeHNsU3RyZWFtKSk7Ci0KLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZUxvYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihTY2hlbWFDb21waWxlck1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYS50ZW1wbGF0ZUxvYWRFeGNlcHRpb24iKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEudGVtcGxhdGVOb3RGb3VuZEV4Y2VwdGlvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlTmFtZQotICAgICAqIEBwYXJhbSBleHRlbnNpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGNyZWF0ZU91dEZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZXh0ZW5zaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZSh0aGlzLnJvb3REaXIsCi0gICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgQVhJUzJfUFJFRklYICsgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBmaWxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG91dHB1dEZpbGUKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwYXJzZVNvdXJjZShEb2N1bWVudCBkb2MsIEZpbGUgb3V0cHV0RmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgWFNMVFRlbXBsYXRlUHJvY2Vzc29yLnBhcnNlKG91dFN0cmVhbSwKLSAgICAgICAgICAgICAgICBkb2MsCi0gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VUZW1wbGF0ZUNhY2hlLm5ld1RyYW5zZm9ybWVyKCkpOwotICAgICAgICBvdXRTdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgIG91dFN0cmVhbS53cml0ZSgnXG4nKTsKLSAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBvdXRwdXQgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VIZWFkZXIoRG9jdW1lbnQgZG9jLCBGaWxlIG91dHB1dEZpbGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIFhTTFRUZW1wbGF0ZVByb2Nlc3Nvci5wYXJzZShvdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgZG9jLAotICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyVGVtcGxhdGVDYWNoZS5uZXdUcmFuc2Zvcm1lcigpKTsKLSAgICAgICAgb3V0U3RyZWFtLndyaXRlKCdcbicpOwotICAgICAgICBvdXRTdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZWZpeCBmb3IgYSBuYW1lc3BhY2UgVVJJLiAgVGhpcyBtZXRob2Qgd2lsbCBBTFdBWVMKLSAgICAgKiByZXR1cm4gYSB2YWxpZCBwcmVmaXggLSBpZiB0aGUgZ2l2ZW4gVVJJIGlzIGFscmVhZHkgbWFwcGVkIGluIHRoaXMKLSAgICAgKiBzZXJpYWxpemF0aW9uLCB3ZSByZXR1cm4gdGhlIHByZXZpb3VzIHByZWZpeC4gIElmIGl0IGlzIG5vdCBtYXBwZWQsCi0gICAgICogd2Ugd2lsbCBhZGQgYSBuZXcgbWFwcGluZyBhbmQgcmV0dXJuIGEgZ2VuZXJhdGVkIHByZWZpeCBvZiB0aGUgZm9ybQotICAgICAqICJuczxudW0+Ii4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgaXMgdGhlIG5hbWVzcGFjZSB1cmkKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgcHJlZml4LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgcmV0dXJuIGdldFByZWZpeEZvclVSSSh1cmksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExhc3QgdXNlZCBpbmRleCBzdWZmaXggZm9yICJucyIKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBsYXN0UHJlZml4SW5kZXggPSAxOwotCi0gICAgLyoqCi0gICAgICogTWFwIG9mIG5hbWVzcGFjZXMgVVJJIHRvIHByZWZpeChlcykKLSAgICAgKi8KLSAgICBIYXNoTWFwIG1hcFVSSXRvUHJlZml4ID0gbmV3IEhhc2hNYXAoKTsKLSAgICBIYXNoTWFwIG1hcFByZWZpeHRvVVJJID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZWZpeCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZSBVUkkuICBJZiBvbmUgaGFzIGFscmVhZHkgYmVlbgotICAgICAqIGRlZmluZWQgaW4gdGhpcyBzZXJpYWxpemF0aW9uLCB1c2UgdGhhdC4gIE90aGVyd2lzZSwgbWFwIHRoZSBwYXNzZWQKLSAgICAgKiBkZWZhdWx0IHByZWZpeCB0byB0aGUgVVJJLCBhbmQgcmV0dXJuIHRoYXQuICBJZiBhIG51bGwgZGVmYXVsdCBwcmVmaXgKLSAgICAgKiBpcyBwYXNzZWQsIHVzZSBvbmUgb2YgdGhlIGZvcm0gIm5zPG51bT4iCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGb3JVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGRlZmF1bHRQcmVmaXgpIHsKLSAgICAgICAgaWYgKCh1cmkgPT0gbnVsbCkgfHwgKHVyaS5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbWFwVVJJdG9QcmVmaXguZ2V0KHVyaSk7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRlZmF1bHRQcmVmaXggPT0gbnVsbCB8fCBkZWZhdWx0UHJlZml4Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMiICsgbGFzdFByZWZpeEluZGV4Kys7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1hcFByZWZpeHRvVVJJLmdldChwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIGxhc3RQcmVmaXhJbmRleCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gZGVmYXVsdFByZWZpeDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hcFByZWZpeHRvVVJJLnB1dChwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICBtYXBVUkl0b1ByZWZpeC5wdXQodXJpLCBwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2hvcnRUeXBlTmFtZShTdHJpbmcgdHlwZUNsYXNzTmFtZSkgewotICAgICAgICBpZiAodHlwZUNsYXNzTmFtZS5lbmRzV2l0aCgiW10iKSkgewotICAgICAgICAgICAgdHlwZUNsYXNzTmFtZSA9IHR5cGVDbGFzc05hbWUuc3Vic3RyaW5nKDAsIHR5cGVDbGFzc05hbWUubGFzdEluZGV4T2YoIlsiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVDbGFzc05hbWU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHVuaW1wbGVtZW50ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXBwZXJQYWNrYWdlTmFtZQotICAgICAqIEBzZWUgQmVhbldyaXRlciNyZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZyBtYXBwZXJQYWNrYWdlTmFtZSkgewotICAgICAgICAvL3VuaW1wbGVtZW50ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHVuaW1wbGVtZW50ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRhaW5mQXJyYXkKLSAgICAgKiBAc2VlIEJlYW5Xcml0ZXIjd3JpdGVFeHRlbnNpb25NYXBwZXIob3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW10pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlbnNpb25NYXBwZXIoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW10gbWV0YWluZkFycmF5KSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL3VuaW1wbGVtZW50ZWQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBLZWVwIHVuaW1wbGVtZW50ZWQKLSAgICAgKgotICAgICAqIEBzZWUgQmVhbldyaXRlciNnZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb25NYXBwZXJQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9KYXZhQmVhbldyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3dyaXRlci9KYXZhQmVhbldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzA2NjA4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS93cml0ZXIvSmF2YUJlYW5Xcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLkJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmkxOG4uU2NoZW1hQ29tcGlsZXJNZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50eXBlbWFwLkphdmFUeXBlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWwuUHJpbWl0aXZlVHlwZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51dGlsLlByaW1pdGl2ZVR5cGVXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnV0aWwuU2NoZW1hUHJvcGVydHlMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUHJldHR5UHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVGVtcGxhdGVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogSmF2YSBCZWFuIHdyaXRlciBmb3IgdGhlIHNjaGVtYSBjb21waWxlci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFCZWFuV3JpdGVyIGltcGxlbWVudHMgQmVhbldyaXRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSmF2YUJlYW5Xcml0ZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBFRF9EQVRBQklORElOR19DTEFTU19OQU1FID0gIldyYXBwZWREYXRhYmluZGVyIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGphdmFCZWFuVGVtcGxhdGVOYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB0ZW1wbGF0ZUxvYWRlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBUZW1wbGF0ZXMgdGVtcGxhdGVDYWNoZTsKLQotICAgIHByaXZhdGUgTGlzdCBuYW1lTGlzdDsKLQotICAgIHByaXZhdGUgTWFwIHBhY2thZ2VOYW1lVG9DbGFzc05hbWVzTWFwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB3cmFwQ2xhc3NlcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdyaXRlQ2xhc3NlcyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVXNlV3JhcHBlckNsYXNzZXMgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgRmlsZSByb290RGlyOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBnbG9iYWxXcmFwcGVkRG9jdW1lbnQ7Ci0KLSAgICBwcml2YXRlIE1hcCBtb2RlbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQUNLQUdFID0gImFkYiI7Ci0KLSAgICBwcml2YXRlIE1hcCBiYXNlVHlwZU1hcCA9IG5ldyBKYXZhVHlwZU1hcCgpLmdldFR5cGVNYXAoKTsKLQotICAgIHByaXZhdGUgTWFwIG5zMnBhY2thZ2VOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0hlbHBlck1vZGUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHByZXNzUHJlZml4ZXNNb2RlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBwYWNrYWdlIGZvciB0aGUgbWFwcGluZyBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1hcHBpbmdDbGFzc1BhY2thZ2UgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX01BUFBFUl9DTEFTU05BTUUgPSAiRXh0ZW5zaW9uTWFwcGVyIjsKLS8vIGEgbGlzdCBvZiBleHRlcm5hbGx5IGlkZW50aWZpZWQgUU5hbWVzIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBiZWNvbWVzCi0gICAgLy8gdXNlZnVsIHdoZW4gIG9ubHkgYSBsaXN0IG9mIGV4dGVybmFsIGVsZW1lbnRzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMQVNTX05BTUUgPSBPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xBU1NfQVJSQVlfTkFNRSA9ICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUUgPSBPTUF0dHJpYnV0ZS5jbGFzcy5nZXROYW1lKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BVFRSSUJfQVJSQVlfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlW10iOwotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEphdmFCZWFuV3JpdGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmV0dXJucyBhIG1hcCBvZiBRbmFtZXMgdnMgRE9NRG9jdW1lbnQgbW9kZWxzLiBPbmUgY2FuIHVzZSB0aGlzCi0gICAgICogbWV0aG9kIHRvIG9idGFpbiB0aGUgcmF3IERPTW1vZGVscyB1c2VkIHRvIHdyaXRlIHRoZSBjbGFzc2VzLiBUaGlzIGhhcyBubwotICAgICAqIG1lYW5pbmcgd2hlbiB0aGUgY2xhc3NlcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JhcHBlZCBzbyB0aGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAuCi0gICAgICogQHNlZSBCZWFuV3JpdGVyI2dldE1vZGVsTWFwKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1vZGVsTWFwKCkgewotICAgICAgICByZXR1cm4gbW9kZWxNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENsYXNzQXJyYXlOYW1lKCkgewotICAgICAgICByZXR1cm4gREVGQVVMVF9DTEFTU19BUlJBWV9OQU1FOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIERFRkFVTFRfQVRUUklCX0NMQVNTX05BTUU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXR0cmliQXJyYXlDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBERUZBVUxUX0FUVFJJQl9BUlJBWV9DTEFTU19OQU1FOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb21waWxlck9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gc2V0IGFsbCBzdGF0ZSB2YXJpYWJsZXMgdG8gZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgICAgIG1vZGVsTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG5zMnBhY2thZ2VOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG1hcHBpbmdDbGFzc1BhY2thZ2UgPSBudWxsOwotCi0gICAgICAgICAgICBpbml0V2l0aEZpbGUob3B0aW9ucy5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gb3B0aW9ucy5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgd3JpdGVDbGFzc2VzID0gb3B0aW9ucy5pc1dyaXRlT3V0cHV0KCk7Ci0gICAgICAgICAgICBpc1VzZVdyYXBwZXJDbGFzc2VzID0gb3B0aW9ucy5pc1VzZVdyYXBwZXJDbGFzc2VzKCk7Ci0KLSAgICAgICAgICAgIGlmICghd3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgd3JhcENsYXNzZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3JhcENsYXNzZXMgPSBvcHRpb25zLmlzV3JhcENsYXNzZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgdGhlIHdyYXAgbW9kZSBpcyBzZXQgdGhlbiBjcmVhdGUgYSBnbG9iYWwgZG9jdW1lbnQgdG8ga2VlcCB0aGUKLSAgICAgICAgICAgIC8vIHdyYXBwZWQKLSAgICAgICAgICAgIC8vIGVsZW1lbnQgbW9kZWxzCi0gICAgICAgICAgICBpZiAob3B0aW9ucy5pc1dyYXBDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgICAgICBnbG9iYWxXcmFwcGVkRG9jdW1lbnQgPSBYU0xUVXRpbHMuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gWFNMVFV0aWxzLmdldEVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxXcmFwcGVkRG9jdW1lbnQsICJiZWFucyIpOwotICAgICAgICAgICAgICAgIGdsb2JhbFdyYXBwZWREb2N1bWVudC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShnbG9iYWxXcmFwcGVkRG9jdW1lbnQsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdSQVBQRURfREFUQUJJTkRJTkdfQ0xBU1NfTkFNRSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wUGFja2FnZU5hbWU7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5lbmRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBQYWNrYWdlTmFtZSA9IHRoaXMucGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGFja2FnZU5hbWUgPSBERUZBVUxUX1BBQ0tBR0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShnbG9iYWxXcmFwcGVkRG9jdW1lbnQsICJwYWNrYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBQYWNrYWdlTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIG5zIG1hcHBpbmdzCi0gICAgICAgICAgICB0aGlzLm5zMnBhY2thZ2VOYW1lTWFwID0gb3B0aW9ucy5nZXROczJQYWNrYWdlTWFwKCk7Ci0gICAgICAgICAgICAvL3NldCBoZWxwZXIgbW9kZQotICAgICAgICAgICAgdGhpcy5pc0hlbHBlck1vZGUgPSBvcHRpb25zLmlzSGVscGVyTW9kZSgpOwotICAgICAgICAgICAgLy8gc2V0IHN1cHByZXNzIHByZWZpeGVzIG1vZGUKLSAgICAgICAgICAgIHRoaXMuaXNTdXBwcmVzc1ByZWZpeGVzTW9kZSA9IG9wdGlvbnMuaXNTdXBwcmVzc1ByZWZpeGVzTW9kZSgpOwotCi0gICAgICAgICAgICAvL3NldCBtYXBwZXIgY2xhc3MgcGFja2FnZSBpZiBwcmVzZW50Ci0gICAgICAgICAgICBpZiAob3B0aW9ucy5pc01hcHBlckNsYXNzUGFja2FnZVByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIHRoaXMubWFwcGluZ0NsYXNzUGFja2FnZSA9IG9wdGlvbnMuZ2V0TWFwcGVyQ2xhc3NQYWNrYWdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsgLy8gdG9kbyBuZWVkIHRvIHB1dAotICAgICAgICAgICAgLy8gY29ycmVjdCBlcnJvcgotICAgICAgICAgICAgLy8gbWVzc2FnZXMKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3JpdGUoWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gZWxlbWVudC5nZXRRTmFtZSgpOwotCi0gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhxTmFtZSwgbWV0YWluZiwgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBgCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAcGFyYW0gbWV0YWluZgotICAgICAqIEBwYXJhbSBpc0Fic3RyYWN0Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFFOYW1lIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIHBhY2thZ2UgZm9yIHRoaXMgdHlwZS4KLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKHFOYW1lLCBtZXRhaW5mLCB0eXBlTWFwLCBncm91cFR5cGVNYXAsIGZhbHNlLGlzQWJzdHJhY3QpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIEBzZWUgQmVhbldyaXRlciN3cml0ZUJhdGNoKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJhdGNoKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3cmFwQ2xhc3NlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wUGFja2FnZTsKLSAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGFja2FnZSA9IERFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZW1wUGFja2FnZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBGaWxlIG91dCA9IGNyZWF0ZU91dEZpbGUodGVtcFBhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBXUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUUpOwotICAgICAgICAgICAgICAgIC8vIHBhcnNlIHdpdGggdGhlIHRlbXBsYXRlIGFuZCBjcmVhdGUgdGhlIGZpbGVzCi0KLSAgICAgICAgICAgICAgICBwYXJzZShnbG9iYWxXcmFwcGVkRG9jdW1lbnQsIG91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2ltcGxlVHlwZQotICAgICAqIEBwYXJhbSB0eXBlTWFwCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdyaXRlKFhtbFNjaGVtYVNpbXBsZVR5cGUgc2ltcGxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mKSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzaW1wbGVUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHFOYW1lID0gKFFOYW1lKSBzaW1wbGVUeXBlLmdldE1ldGFJbmZvTWFwKCkuZ2V0KFNjaGVtYUNvbnN0YW50cy5TY2hlbWFDb21waWxlckluZm9Ib2xkZXIuRkFLRV9RTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRhaW5mLmFkZHRTdGF0dXMocU5hbWUsIFNjaGVtYUNvbnN0YW50cy5TSU1QTEVfVFlQRV9PUl9DT05URU5UKTsKLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKHFOYW1lLCBtZXRhaW5mLCB0eXBlTWFwLCBncm91cFR5cGVNYXAsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByb290RGlyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEBzZWUgQmVhbldyaXRlciNpbml0KGphdmEuaW8uRmlsZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdFdpdGhGaWxlKEZpbGUgcm9vdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJvb3REaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5yb290RGlyID0gbmV3IEZpbGUoIi4iKTsKLSAgICAgICAgfSBlbHNlIGlmICghcm9vdERpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic2NoZW1hLnJvb3Rub3Rmb2xkZXJleGNlcHRpb24iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnJvb3REaXIgPSByb290RGlyOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWVUb0NsYXNzTmFtZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBqYXZhQmVhblRlbXBsYXRlTmFtZSA9IFNjaGVtYVByb3BlcnR5TG9hZGVyLmdldEJlYW5UZW1wbGF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciBhbiBlbGVtZW50IG9yIG5hbWVkIHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIE5hbWUgZm9yIHRoaXMgZWxlbWVudCBvciB0eXBlIGluIHRoZSBzY2hlbWEKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSB0byB1c2UgaW4gZ2VuZXJhdGVkCi0gICAgICogICAgICAgICBjb2RlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBtYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoUU5hbWUgcU5hbWUpIHsKLQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBiYXNlUGFja2FnZU5hbWU7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZShuYW1lc3BhY2VVUkkpOwotCi0gICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gd2hlbiB3cmFwcGluZyBjbGFzc2VzIGFsbCB0aGUgZGF0YSBiaW5kaW5nIGFuZCBleGNlcHRpb24gY2xhc3Mgc2hvdWxkIGhhdmUKLSAgICAgICAgLy8gYSB1bmlxdWUgbmFtZSBzaW5jZSBwYWNrYWdlIG5hbWUgaXMgbm90IGJlaW5nIGFwcGxpZWQuCi0gICAgICAgIC8vIG90aGVyZXdpc2Ugd2UgY2FuIG1ha2UgdW5pcXVlIHdpdGggdGhlIHBhY2thZ2UgbmFtZQotICAgICAgICBpZiAoIXdyYXBDbGFzc2VzKXsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1ha2VVbmlxdWVKYXZhQ2xhc3NOYW1lKHRoaXMubmFtZUxpc3QsIG9yaWdpbmFsTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucGFja2FnZU5hbWVUb0NsYXNzTmFtZXNNYXAuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wYWNrYWdlTmFtZVRvQ2xhc3NOYW1lc01hcC5wdXQocGFja2FnZU5hbWUsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBtYWtlVW5pcXVlSmF2YUNsYXNzTmFtZSgoTGlzdCkgdGhpcy5wYWNrYWdlTmFtZVRvQ2xhc3NOYW1lc01hcC5nZXQocGFja2FnZU5hbWUpLCBvcmlnaW5hbE5hbWUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBTdHJpbmcgcGFja2FnZVByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGx5cXVhbGlmaWVkQ2xhc3NOYW1lOwotCi0gICAgICAgIGlmICh3cmFwQ2xhc3NlcykKLSAgICAgICAgICAgIHBhY2thZ2VQcmVmaXggPSAodGhpcy5wYWNrYWdlTmFtZSA9PSBudWxsID8gREVGQVVMVF9QQUNLQUdFICsgIi4iCi0gICAgICAgICAgICAgICAgICAgIDogdGhpcy5wYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgKyBXUkFQUEVEX0RBVEFCSU5ESU5HX0NMQVNTX05BTUU7Ci0gICAgICAgIGVsc2UgaWYgKHdyaXRlQ2xhc3NlcykKLSAgICAgICAgICAgIHBhY2thZ2VQcmVmaXggPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgaWYgKHBhY2thZ2VQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgICAgIGZ1bGx5cXVhbGlmaWVkQ2xhc3NOYW1lID0gcGFja2FnZVByZWZpeAotICAgICAgICAgICAgICAgICAgICArIChwYWNrYWdlUHJlZml4LmVuZHNXaXRoKCIuIikgPyAiIiA6ICIuIikgKyBjbGFzc05hbWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZ1bGx5cXVhbGlmaWVkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgICAgIHJldHVybiBmdWxseXF1YWxpZmllZENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlTmFtZTsKLSAgICAgICAgaWYgKChuczJwYWNrYWdlTmFtZU1hcCAhPSBudWxsKSAmJiBuczJwYWNrYWdlTmFtZU1hcC5jb250YWluc0tleShuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICBiYXNlUGFja2FnZU5hbWUgPSAoU3RyaW5nKSBuczJwYWNrYWdlTmFtZU1hcC5nZXQobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJhc2VQYWNrYWdlTmFtZSA9IFVSTFByb2Nlc3Nvci5tYWtlUGFja2FnZU5hbWUobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLnBhY2thZ2VOYW1lID09IG51bGwgPyBiYXNlUGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICA6IHRoaXMucGFja2FnZU5hbWUgKyBiYXNlUGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsIG1ldGhvZCB0aGF0IGhvbGRzIGNvbW1vbiBjb2RlIGZvciB0aGUgY29tcGxldGUgc2NoZW1hIHRoYXQgdGhlCi0gICAgICogZ2VuZXJhdGVkIFhNTCBjb21wbGllcyB0byBsb29rIHVuZGVyIG90aGVyL2JlYW5HZW5lcmF0aW9uU2NoZW1hLnhzZAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEBwYXJhbSBpc0VsZW1lbnQKLSAgICAgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgdGhlIG5hbWUgcmV0dXJuZWQgYnkgbWFrZUZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgb3IgbnVsbCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCB3YXNuJ3QgY2FsbGVkCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3MoUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Fic3RyYWN0KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IG1ldGFpbmYuZ2V0T3duQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmIChmdWxseVF1YWxpZmllZENsYXNzTmFtZSA9PSBudWxsKQotICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBtYWtlRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUocU5hbWUpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLSAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEgKyBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlTmFtZTsKLSAgICAgICAgaWYgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsvLyBubyAnZG90cycgc28KLSAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlCi0gICAgICAgICAgICAvLyBpcyBub3QgdGhlcmUKLSAgICAgICAgICAgIGJhc2VQYWNrYWdlTmFtZSA9ICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYmFzZVBhY2thZ2VOYW1lID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsTmFtZSA9IHFOYW1lID09IG51bGwgPyAiIiA6IHFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoIXRlbXBsYXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICBsb2FkVGVtcGxhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdyYXBwZWQgdGhlbiBkbyBub3Qgd3JpdGUgdGhlIGNsYXNzZXMgbm93IGJ1dCBhZGQgdGhlIG1vZGVscyB0byBhCi0gICAgICAgIC8vIGdsb2JhbCBkb2N1bWVudC4gSG93ZXZlciBpbiBvcmRlciB0byB3cml0ZSB0aGUKLSAgICAgICAgLy8gZ2xvYmFsIGNsYXNzIHRoYXQgaXMgZ2VuZXJhdGVkLCBvbmUgbmVlZHMgdG8gY2FsbCB0aGUgd3JpdGVCYXRjaCgpCi0gICAgICAgIC8vIG1ldGhvZAotICAgICAgICBpZiAod3JhcENsYXNzZXMpIHsKLSAgICAgICAgICAgIGdsb2JhbFdyYXBwZWREb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgZ2V0QmVhbkVsZW1lbnQoZ2xvYmFsV3JhcHBlZERvY3VtZW50LCBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lLCBiYXNlUGFja2FnZU5hbWUsIHFOYW1lLCBpc0VsZW1lbnQsaXNBYnN0cmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLCBwcm9wZXJ0eU5hbWVzLCB0eXBlTWFwLCBncm91cFR5cGVNYXApKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBtb2RlbAotICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwgPSBYU0xUVXRpbHMuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIC8vIG1ha2UgdGhlIFhNTAotICAgICAgICAgICAgbW9kZWwuYXBwZW5kQ2hpbGQoZ2V0QmVhbkVsZW1lbnQobW9kZWwsIGNsYXNzTmFtZSwgb3JpZ2luYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICBiYXNlUGFja2FnZU5hbWUsIHFOYW1lLCBpc0VsZW1lbnQsaXNBYnN0cmFjdCwgbWV0YWluZiwgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgdHlwZU1hcCwgZ3JvdXBUeXBlTWFwKSk7Ci0KLSAgICAgICAgICAgIGlmICh3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlIG91dCA9IGNyZWF0ZU91dEZpbGUoYmFzZVBhY2thZ2VOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIC8vIHBhcnNlIHdpdGggdGhlIHRlbXBsYXRlIGFuZCBjcmVhdGUgdGhlIGZpbGVzCi0KLSAgICAgICAgICAgICAgICBpZiAoaXNIZWxwZXJNb2RlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImhlbHBlck1vZGUiLCAieWVzIiwgbW9kZWwuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEdlbmVyYXRlIGJlYW4gY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICBwYXJzZShtb2RlbCwgb3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0aW5nIHRoZSBoZWxwZXIgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICBvdXQgPSBjcmVhdGVPdXRGaWxlKGJhc2VQYWNrYWdlTmFtZSwgY2xhc3NOYW1lICsgIkhlbHBlciIpOwotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaGVscGVyIiwgInllcyIsIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2UobW9kZWwsIG91dCk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvL05vIGhlbHBlciBtb2RlIC0ganVzdCBnZW5lcmF0ZSB0aGUgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICBwYXJzZShtb2RlbCwgb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgbW9kZWwgdG8gdGhlIG1vZGVsIG1hcAotICAgICAgICAgICAgbW9kZWxNYXAucHV0KG5ldyBRTmFtZShxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgY2xhc3NOYW1lKSwgbW9kZWwpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAgICAgIHJldHVybiBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxOYW1lCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGlzRWxlbWVudAotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMKLSAgICAgKiBAcGFyYW0gdHlwZU1hcAotICAgICAqIEByZXR1cm4gUmV0dXJucyBFbGVtZW50LgotICAgICAqIEB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0QmVhbkVsZW1lbnQoRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWJzdHJhY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIEVsZW1lbnQgcm9vdEVsdCA9IFhTTFRVdGlscy5nZXRFbGVtZW50KG1vZGVsLCAiYmVhbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibmFtZSIsIGNsYXNzTmFtZSwgcm9vdEVsdCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvcmlnaW5hbE5hbWUiLCBvcmlnaW5hbE5hbWUsIHJvb3RFbHQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicGFja2FnZSIsIHBhY2thZ2VOYW1lLCByb290RWx0KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHJvb3RFbHQpOwotICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuc3ByZWZpeCIsIGlzU3VwcHJlc3NQcmVmaXhlc01vZGUgPyAiIiA6IGdldFByZWZpeEZvclVSSShxTmFtZQotICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VVUkkoKSwgcU5hbWUuZ2V0UHJlZml4KCkpLCByb290RWx0KTsKLQotICAgICAgICBpZiAoIXdyYXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidW53cmFwcGVkIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzQWJzdHJhY3QpewotICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaXNBYnN0cmFjdCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghd3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNFbGVtZW50KSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAidHlwZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzQW5vbnltb3VzKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbm9uIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzVXNlV3JhcHBlckNsYXNzZXMpewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVzZXdyYXBwZXJjbGFzc2VzIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNFeHRlbnNpb24oKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImV4dGVuc2lvbiIsIG1ldGFpbmYKLSAgICAgICAgICAgICAgICAgICAgLmdldEV4dGVuc2lvbkNsYXNzTmFtZSgpLCByb290RWx0KTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInJlc3RyaWN0aW9uIiwgbWV0YWluZgotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzdHJpY3Rpb25DbGFzc05hbWUoKSwgcm9vdEVsdCk7Ci0KLSAgICAgICAgfQotICAgICAgICAvL2FkZCB0aGUgbWFwcGVyIGNsYXNzIG5hbWUKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1hcHBlckNsYXNzIiwgZ2V0RnVsbHlRdWFsaWZpZWRNYXBwZXJDbGFzc05hbWUoKSwgcm9vdEVsdCk7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNDaG9pY2UoKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImNob2ljZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzU2ltcGxlKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaW1wbGUiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1VuaW9uKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ1bmlvbiIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzTGlzdCgpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibGlzdCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JkZXJlZCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0VsZW1lbnQgJiYgbWV0YWluZi5pc05pbGxhYmxlKHFOYW1lKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5pbGxhYmxlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNQYXJ0aWNsZUNsYXNzKCkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYXJ0aWNsZUNsYXNzIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNIYXNQYXJ0aWNsZVR5cGUoKSl7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiaGFzUGFydGljbGVUeXBlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9wdWxhdGUgYWxsIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICBwb3B1bGF0ZUluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHByb3BlcnR5TmFtZXMsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCwgZmFsc2UpOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzU2ltcGxlKCkgJiYgbWV0YWluZi5pc1VuaW9uKCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTWVtYmVySW5mbyhtZXRhaW5mLCBtb2RlbCwgcm9vdEVsdCwgdHlwZU1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1NpbXBsZSgpICYmIG1ldGFpbmYuaXNMaXN0KCkpIHsKLSAgICAgICAgICAgIHBvcHVsYXRlTGlzdEluZm8obWV0YWluZiwgbW9kZWwsIHJvb3RFbHQsIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWx0KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIHJldHVybiByb290RWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdEluZm8oQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBncm91cFR5cGVNYXApIHsKLQotICAgICAgICBTdHJpbmcgamF2YU5hbWUgPSBtYWtlVW5pcXVlSmF2YUNsYXNzTmFtZShuZXcgQXJyYXlMaXN0KCksIG1ldGFpbmYuZ2V0SXRlbVR5cGVRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgRWxlbWVudCBpdGVtVHlwZSA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJpdGVtdHlwZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInR5cGUiLCBtZXRhaW5mLmdldEl0ZW1UeXBlQ2xhc3NOYW1lKCksIGl0ZW1UeXBlKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgbWV0YWluZi5nZXRJdGVtVHlwZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIGl0ZW1UeXBlKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm9yaWdpbmFsTmFtZSIsIG1ldGFpbmYuZ2V0SXRlbVR5cGVRTmFtZSgpLmdldExvY2FsUGFydCgpLCBpdGVtVHlwZSk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJqYXZhbmFtZSIsIGphdmFOYW1lLCBpdGVtVHlwZSk7Ci0KLQotICAgICAgICBpZiAodHlwZU1hcC5jb250YWluc0tleShtZXRhaW5mLmdldEl0ZW1UeXBlUU5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICBncm91cFR5cGVNYXAuY29udGFpbnNLZXkobWV0YWluZi5nZXRJdGVtVHlwZUNsYXNzTmFtZSgpKSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm91cnMiLCAidHJ1ZSIsIGl0ZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUHJpbWl0aXZlVHlwZUZpbmRlci5pc1ByaW1pdGl2ZShtZXRhaW5mLmdldEl0ZW1UeXBlQ2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicHJpbWl0aXZlIiwgInllcyIsIGl0ZW1UeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzaG9ydFR5cGVOYW1lID0gZ2V0U2hvcnRUeXBlTmFtZShtZXRhaW5mLmdldEl0ZW1UeXBlQ2xhc3NOYW1lKCkpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2hvcnR0eXBlbmFtZSIsIHNob3J0VHlwZU5hbWUsIGl0ZW1UeXBlKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTWVtYmVySW5mbyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwKSB7Ci0gICAgICAgIE1hcCBtZW1iZXJUeXBlcyA9IG1ldGFpbmYuZ2V0TWVtYmVyVHlwZXMoKTsKLSAgICAgICAgUU5hbWUgbWVtYmVyUU5hbWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGFpbmYuZ2V0TWVtYmVyVHlwZXNLZXlzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBtZW1iZXJRTmFtZSA9IChRTmFtZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyQ2xhc3MgPSAoU3RyaW5nKSBtZW1iZXJUeXBlcy5nZXQobWVtYmVyUU5hbWUpOwotICAgICAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVGaW5kZXIuaXNQcmltaXRpdmUobWVtYmVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVyQ2xhc3MgPSBQcmltaXRpdmVUeXBlV3JhcHBlci5nZXRXcmFwcGVyKG1lbWJlckNsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG1lbWJlciB0eXBlIGVsZW1lbnQKLSAgICAgICAgICAgIEVsZW1lbnQgbWVtYmVyVHlwZSA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJtZW1iZXJUeXBlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInR5cGUiLCBtZW1iZXJDbGFzcywgbWVtYmVyVHlwZSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnN1cmkiLCBtZW1iZXJRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbWVtYmVyVHlwZSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3JpZ2luYWxOYW1lIiwgbWVtYmVyUU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVNYXAuY29udGFpbnNLZXkobWVtYmVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm91cnMiLCAidHJ1ZSIsIG1lbWJlclR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHNob3J0VHlwZU5hbWUgPSBnZXRTaG9ydFR5cGVOYW1lKG1lbWJlckNsYXNzKTsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaG9ydHR5cGVuYW1lIiwgc2hvcnRUeXBlTmFtZSwgbWVtYmVyVHlwZSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXRhaW5mCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIHJvb3RFbHQKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lcwotICAgICAqIEBwYXJhbSB0eXBlTWFwCi0gICAgICogQHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUluZm8oQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdEVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luaGVyaXRlZCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2Ugc2hvdWxkIGFkZCBwYXJlbnQgY2xhc3MgZGV0YWlscyBvbmx5IGlmIGl0IGlzCi0gICAgICAgIC8vIGFuIGV4dGVuc2lvbiBvciBzaW1wbGUgcmVzdHJpY3Rpb24KLSAgICAgICAgLy8gc2hvdWxkIG5vdCBpbiBjb21wbGV4IHJlc3RyaWN0aW9ucwotICAgICAgICBpZiAobWV0YWluZi5nZXRQYXJlbnQoKSAhPSBudWxsICYmICghbWV0YWluZi5pc1Jlc3RyaWN0aW9uKCkgfHwgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmIG1ldGFpbmYuaXNTaW1wbGUoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3B1bGF0ZUluZm8obWV0YWluZi5nZXRQYXJlbnQoKSwgbW9kZWwsIHJvb3RFbHQsIHByb3BlcnR5TmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsIGdyb3VwVHlwZU1hcCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUHJvcGVydHlFbnRyaWVzKG1ldGFpbmYsIG1vZGVsLCByb290RWx0LCBwcm9wZXJ0eU5hbWVzLCB0eXBlTWFwLCBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgaXNJbmhlcml0ZWQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1ldGFpbmYKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gcm9vdEVsdAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzCi0gICAgICogQHBhcmFtIHR5cGVNYXAKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5RW50cmllcyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IG1vZGVsLCBFbGVtZW50IHJvb3RFbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNJbmhlcml0ZWQpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdvIGluIHRoZSBsb29wIGFuZCBhZGQgdGhlIHBhcnQgZWxlbWVudHMKLSAgICAgICAgUU5hbWVbXSBxTmFtZTsKLSAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWVGb3JFbGVtZW50OwotICAgICAgICBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IHFOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgcGFyZW50TWV0YUluZiA9IG1ldGFpbmYuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIHFOYW1lID0gbWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcU5hbWUgPSBtZXRhaW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcU5hbWUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHFOYW1lcy5hZGQocU5hbWVbaV0pOwotICAgICAgICB9Ci0gICAgICAgIC8vYWRkaW5nIG1pc3NpbmcgUU5hbWVzIHRvIHRoZSBlbmQsIGluY2x1ZGluZyBlbGVtZW50cyAmIGF0dHJpYnV0ZXMuCi0gICAgICAgIC8vIGZvciB0aGUgc2ltcGxlIHR5cGVzIHdlIGhhdmUgYWxyZWFkeSBhZGQgdGhlIHBhcmVudCBlbGVtZW50cwotICAgICAgICAvLyBpdCBpcyBhbG1vc3QgY29uc2lkZXIgYXMgYW4gZXh0ZW5zaW9uCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiAhbWV0YWluZi5pc1NpbXBsZSgpKSB7Ci0gICAgICAgICAgICBhZGRNaXNzaW5nUU5hbWVzKG1ldGFpbmYsIHFOYW1lcywgbWlzc2luZ1FOYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgbmFtZTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbmFtZSA9IChRTmFtZSkgcU5hbWVzLmdldChpKTsKLSAgICAgICAgICAgIEVsZW1lbnQgcHJvcGVydHkgPSBYU0xUVXRpbHMuYWRkQ2hpbGRFbGVtZW50KG1vZGVsLCAicHJvcGVydHkiLCByb290RWx0KTsKLQotICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5hbWUiLCB4bWxOYW1lLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibnN1cmkiLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwcm9wZXJ0eSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXZhTmFtZTsKLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzSmF2YU5hbWVNYXBwaW5nQXZhaWxhYmxlKHhtbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamF2YU5hbWUgPSBtZXRhaW5mLmdldEphdmFOYW1lKHhtbE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBqYXZhTmFtZSA9IG1ha2VVbmlxdWVKYXZhQ2xhc3NOYW1lKHByb3BlcnR5TmFtZXMsIHhtbE5hbWUpOwotICAgICAgICAgICAgICAgIC8vIGluIGEgcmVzdHJpY3Rpb24gaWYgdGhpcyBlbGVtZW50IGFscmVhZHkgdGhlcmUgYW5kIGFycmF5IHN0YXR1cyBoYXZlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGhhdmUgdG8gZ2VuZXJhdGUgYSBuZXcgIG5hbWUgZm9yIHRoaXMKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50TWV0YUluZiAhPSBudWxsICYmIG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50TWV0YUluZi5nZXRBcnJheVN0YXR1c0ZvclFOYW1lKG5hbWUpICYmICFtZXRhaW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFOYW1lID0gbWFrZVVuaXF1ZUphdmFDbGFzc05hbWUocHJvcGVydHlOYW1lcywgeG1sTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGFpbmYuYWRkWG1sTmFtZUphdmFOYW1lTWFwcGluZyh4bWxOYW1lLGphdmFOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImphdmFuYW1lIiwgamF2YU5hbWUsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFJbmYgIT0gbnVsbCAmJiBtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiBtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZUZvckVsZW1lbnQgPSBwYXJlbnRNZXRhSW5mLmdldENsYXNzTmFtZUZvclFOYW1lKG5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCA9IG1ldGFpbmYuZ2V0Q2xhc3NOYW1lRm9yUU5hbWUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKGphdmFDbGFzc05hbWVGb3JFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCA9IGdldERlZmF1bHRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybihTY2hlbWFDb21waWxlck1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic2NoZW1hLnR5cGVNaXNzaW5nIiwgbmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb24oKSAmJiB0eXBlQ2hhbmdlZChuYW1lLCBtaXNzaW5nUU5hbWVzLCBtZXRhaW5mKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlQ2hhbmdlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgLy9YU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicmVzdHJpY3RlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbWluT2NjdXJzID0gbWV0YWluZi5nZXRNaW5PY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICBpZiAoUHJpbWl0aXZlVHlwZUZpbmRlci5pc1ByaW1pdGl2ZShqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaXNVc2VXcmFwcGVyQ2xhc3NlcyAmJiAoKG1pbk9jY3VycyA9PSAwKSB8fCBtZXRhaW5mLmlzTmlsbGFibGUobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gcHJpbWl0aXZlIGNsYXNzIGFuZCB1c2VyIHdhbnRzIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgLy8gd3JhcHBlciB0eXBlIHdlIGNoYW5nZSB0aGUgdHlwZSB0byB3cmFwcGVyIHR5cGUuCi0gICAgICAgICAgICAgICAgIGphdmFDbGFzc05hbWVGb3JFbGVtZW50ID0gUHJpbWl0aXZlVHlwZVdyYXBwZXIuZ2V0V3JhcHBlcihqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ0eXBlIiwgamF2YUNsYXNzTmFtZUZvckVsZW1lbnQsIHByb3BlcnR5KTsKLQotCi0gICAgICAgICAgICBpZiAoUHJpbWl0aXZlVHlwZUZpbmRlci5pc1ByaW1pdGl2ZShqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkpIHsKLQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwcmltaXRpdmUiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgLy8gYWRkIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICBpZiAobWV0YWluZi5pc0RlZmF1bHRWYWx1ZUF2YWlsYWJsZShuYW1lKSl7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hUU5hbWUgPSBtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlTWFwLmNvbnRhaW5zS2V5KHNjaGVtYVFOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJkZWZhdWx0VmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFpbmYuZ2V0RGVmYXVsdFZhbHVlRm9yUU5hbWUobmFtZSksIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vaW4gdGhlIGNhc2UgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgYW4gYXJyYXkgYnV0IHRoZSBkZXJpdmVkIG9uZSBpcyBub3QuCi0gICAgICAgICAgICBpZiAocGFyZW50TWV0YUluZiAhPSBudWxsICYmIG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIChwYXJlbnRNZXRhSW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkgJiYgIW1ldGFpbmYuZ2V0QXJyYXlTdGF0dXNGb3JRTmFtZShuYW1lKSkpIHsKLQotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZXdyaXRlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib2NjdXJhbmNlQ2hhbmdlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKG5hbWUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtaW5PY2N1cnNDaGFuZ2VkKG5hbWUsIG1pc3NpbmdRTmFtZXMsIG1ldGFpbmYpIHx8IG1heE9jY3Vyc0NoYW5nZWQobmFtZSwgbWlzc2luZ1FOYW1lcywgbWV0YWluZikpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInJlc3RyaWN0ZWQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvY2N1cmFuY2VDaGFuZ2VkIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBpcyBwYXJ0aWNsZSBjbGFzcwotICAgICAgICAgICAgaWYgKG1ldGFpbmYuZ2V0UGFydGljbGVUeXBlU3RhdHVzRm9yUU5hbWUobmFtZSkpewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYXJ0aWNsZUNsYXNzVHlwZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gcGFydGljbGUgY2xhc3MgaW4gYSBleHRlbnNpb24gY2xhc3MgdGhlbiB3ZSBoYXZlCi0gICAgICAgICAgICAvLyB0byBjb25zaWRlciB0aGUgd2hvbGUgY2xhc3MgaGFzIGEgcGFydGljbGUgdHlwZS4KLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNIYXNQYXJ0aWNsZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJoYXNQYXJ0aWNsZVR5cGUiLCAieWVzIiwgcm9vdEVsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdoYXQgaGFwcGVkIGlmIHRoaXMgY29udGFpbiBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgbWVhbmluZyBvZiB0aGlzIHJlbW92ZWQgcHJvcGVydHkKLQotICAgICAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbigpICYmIG1pc3NpbmdRTmFtZXMuY29udGFpbnMobmFtZSkgJiYgIW1ldGFpbmYuaXNTaW1wbGUoKSkgewotICAgICAgICAgICAgICAgIC8vWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInJlc3RyaWN0ZWQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZW1vdmVkIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzSW5oZXJpdGVkKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImluaGVyaXRlZCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXRhaW5mLmdldElubmVyQ2hvaWNlU3RhdHVzRm9yUU5hbWUobmFtZSkpewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJpbm5lcmNob2ljZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLQotCi0gICAgICAgICAgICBpZiAoKHBhcmVudE1ldGFJbmYgIT0gbnVsbCkgJiYgbWV0YWluZi5pc1Jlc3RyaWN0aW9uKCkgJiYgbWlzc2luZ1FOYW1lcy5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBkZXRhaWxzIHNob3VsZCBiZSB0aGVyZSB3aXRoIHRoZSBwYXJlbnQgbWV0YSBJbmYKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGVzVG9Qcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1ldGFJbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBncm91cFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlc1RvUHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhaW5mLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gIC8vIGVuZCBvZiBmb28KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlc1RvUHJvcGVydHkoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgdHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGdyb3VwVHlwZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc05hbWVGb3JFbGVtZW50KSB7Ci0gICAgICAgIC8vIGFkZCBhbiBhdHRyaWJ1dGUgdGhhdCBzYXlzIHRoZSB0eXBlIGlzIGRlZmF1bHQKLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0RGVmYXVsdFN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiZGVmYXVsdCIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZU1hcC5jb250YWluc0tleShtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkpIHx8Ci0gICAgICAgICAgICAgICAgZ3JvdXBUeXBlTWFwLmNvbnRhaW5zS2V5KG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJvdXJzIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmdldEF0dHJpYnV0ZVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXR0cmlidXRlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzTmlsbGFibGUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJuaWxsYWJsZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5nZXRPcHRpb25hbEF0dHJpYnV0ZVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAib3B0aW9uYWwiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNob3J0VHlwZU5hbWU7Ci0gICAgICAgIGlmIChtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2VlIHdoZXRoZXIgdGhlIFFOYW1lIGlzIGEgYmFzZXR5cGUKLSAgICAgICAgICAgIGlmIChiYXNlVHlwZU1hcC5jb250YWluc0tleShtZXRhaW5mLmdldFNjaGVtYVFOYW1lRm9yUU5hbWUobmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IG1ldGFpbmYuZ2V0U2NoZW1hUU5hbWVGb3JRTmFtZShuYW1lKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IGdldFNob3J0VHlwZU5hbWUoamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvcnRUeXBlTmFtZSA9IGdldFNob3J0VHlwZU5hbWUoamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJzaG9ydHR5cGVuYW1lIiwgc2hvcnRUeXBlTmFtZSwgcHJvcGVydHkpOwotCi0KLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QW55U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhbnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuZ2V0QmluYXJ5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJiaW5hcnkiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNTaW1wbGUoKSB8fCBtZXRhaW5mLmdldFNpbXBsZVN0YXR1c0ZvclFOYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2ltcGxlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHB1dCB0aGUgbWluIG9jY3VycyBjb3VudCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBpdCdzIGFuIGFycmF5IG9yCi0gICAgICAgIC8vIG5vdAotICAgICAgICBsb25nIG1pbk9jY3VycyA9IG1ldGFpbmYuZ2V0TWluT2NjdXJzKG5hbWUpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWluT2NjdXJzIiwgbWluT2NjdXJzICsgIiIsIHByb3BlcnR5KTsKLQotCi0gICAgICAgIGlmIChtZXRhaW5mLmdldEFycmF5U3RhdHVzRm9yUU5hbWUobmFtZSkpIHsKLQotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImFycmF5IiwgInllcyIsIHByb3BlcnR5KTsKLQotICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gamF2YUNsYXNzTmFtZUZvckVsZW1lbnQuaW5kZXhPZigiWyIpOwotICAgICAgICAgICAgaWYgKGVuZEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAiYXJyYXlCYXNlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudC5zdWJzdHJpbmcoMCwgZW5kSW5kZXgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJhcnJheUJhc2VUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzc05hbWVGb3JFbGVtZW50LCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbWF4T2NjdXJzID0gbWV0YWluZi5nZXRNYXhPY2N1cnMobmFtZSk7Ci0gICAgICAgICAgICBpZiAobWF4T2NjdXJzID09IExvbmcuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVuYm91bmQiLCAieWVzIiwgcHJvcGVydHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWF4T2NjdXJzIiwgbWF4T2NjdXJzICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJyZXN0cmljdGlvbkJhc2VUeXBlIiwgInllcyIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzRXh0ZW5zaW9uQmFzZVR5cGUobmFtZSkpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJleHRlbnNpb25CYXNlVHlwZSIsICJ5ZXMiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRMZW5ndGhGYWNldCgpICE9IC0xKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibGVuRmFjZXQiLCBtZXRhaW5mLmdldExlbmd0aEZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWF4TGVuZ3RoRmFjZXQoKSAhPSAtMSkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1heExlbkZhY2V0IiwgbWV0YWluZi5nZXRNYXhMZW5ndGhGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1pbkxlbmd0aEZhY2V0KCkgIT0gLTEpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5MZW5GYWNldCIsIG1ldGFpbmYuZ2V0TWluTGVuZ3RoRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtYXhFeEZhY2V0IiwgbWV0YWluZi5nZXRNYXhFeGNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm1pbkV4RmFjZXQiLCBtZXRhaW5mLmdldE1pbkV4Y2x1c2l2ZUZhY2V0KCkgKyAiIiwgcHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNSZXN0cmljdGlvbkJhc2VUeXBlKG5hbWUpICYmIG1ldGFpbmYuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibWF4SW5GYWNldCIsIG1ldGFpbmYuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKSArICIiLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YWluZi5pc1Jlc3RyaWN0aW9uQmFzZVR5cGUobmFtZSkgJiYgbWV0YWluZi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJtaW5JbkZhY2V0IiwgbWV0YWluZi5nZXRNaW5JbmNsdXNpdmVGYWNldCgpICsgIiIsIHByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWV0YWluZi5nZXRFbnVtRmFjZXQoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRKYXZhID0gdHJ1ZTsgICAgLy8gQXNzdW1lIGFsbCBlbnVtIHZhbHVlcyBhcmUgdmFsaWQgaWRzCi0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWV0YWluZi5nZXRFbnVtRmFjZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgLy8gV2FsayB0aGUgdmFsdWVzIGxvb2tpbmcgZm9yIGludmFsaWQgaWRzCi0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghSmF2YVV0aWxzLmlzSmF2YUlkKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICB2YWxpZEphdmEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpZCA9IDA7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG1ldGFpbmYuZ2V0RW51bUZhY2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVudW1GYWNldCA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQobW9kZWwsICJlbnVtRmFjZXQiLCBwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbHVlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJ2YWx1ZSIsIGF0dHJpYlZhbHVlLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICAgIGlmICh2YWxpZEphdmEpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImlkIiwgYXR0cmliVmFsdWUsIGVudW1GYWNldCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWQrKzsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgImlkIiwgInZhbHVlIiArIGlkLCBlbnVtRmFjZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzUmVzdHJpY3Rpb25CYXNlVHlwZShuYW1lKSAmJiBtZXRhaW5mLmdldFBhdHRlcm5GYWNldCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYXR0ZXJuRmFjZXQiLCBtZXRhaW5mLmdldFBhdHRlcm5GYWNldCgpLCBwcm9wZXJ0eSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTWlzc2luZ1FOYW1lcyhCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZiwgQXJyYXlMaXN0IHFOYW1lLCBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcykgewotCi0gICAgICAgIFFOYW1lW10gcU5hbWVzID0gbnVsbDsKLSAgICAgICAgUU5hbWVbXSBwUU5hbWVzID0gbnVsbDsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgcGFyZW50TWV0YUluZiA9IG1ldGFpbmYuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgaWYgKG1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0T3JkZXJlZFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHFOYW1lcyA9IG1ldGFpbmYuZ2V0UU5hbWVBcnJheSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudE1ldGFJbmYgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFJbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YUluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YUluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBwUU5hbWVzICE9IG51bGwgJiYgaSA8IHBRTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChxTmFtZU5vdEZvdW5kKHBRTmFtZXNbaV0sIG1ldGFpbmYpKSB7Ci0gICAgICAgICAgICAgICAgbWlzc2luZ1FOYW1lcy5hZGQocFFOYW1lc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9hZGRpbmcgbWlzc2luZyBRTmFtZXMgdG8gdGhlIGVuZCBvZiBsaXN0LgotICAgICAgICBpZiAoIW1pc3NpbmdRTmFtZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdRTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBxTmFtZS5hZGQobWlzc2luZ1FOYW1lcy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcU5hbWVOb3RGb3VuZChRTmFtZSBxbmFtZSwgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHsKLQotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIFFOYW1lW10gcU5hbWVzOwotCi0gICAgICAgIGlmIChtZXRhaW5mLmlzT3JkZXJlZCgpKSB7Ci0gICAgICAgICAgICBxTmFtZXMgPSBtZXRhaW5mLmdldE9yZGVyZWRRTmFtZUFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMgPSBtZXRhaW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBpZiAocW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKHFOYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICFmb3VuZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdHlwZUNoYW5nZWQoUU5hbWUgcW5hbWUsIEFycmF5TGlzdCBtaXNzaW5nUU5hbWVzLCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgewotCi0gICAgICAgIGJvb2xlYW4gdHlwZUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgUU5hbWVbXSBwUU5hbWVzOwotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwYXJlbnRNZXRhaW5mID0gbWV0YWluZi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAocGFyZW50TWV0YWluZiAhPSBudWxsICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKHFuYW1lKSkgewotCi0gICAgICAgICAgICBpZiAocGFyZW50TWV0YWluZi5pc09yZGVyZWQoKSkgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhaW5mLmdldE9yZGVyZWRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBRTmFtZXMgPSBwYXJlbnRNZXRhaW5mLmdldFFOYW1lQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwUU5hbWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHFuYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhwUU5hbWVzW2pdLmdldExvY2FsUGFydCgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhQ2xhc3NGb3JQYXJlbnRFbGVtZW50ID0gcGFyZW50TWV0YWluZi5nZXRDbGFzc05hbWVGb3JRTmFtZShwUU5hbWVzW2pdKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphdmFDbGFzc0ZvckVsZW1lbnQgPSBtZXRhaW5mLmdldENsYXNzTmFtZUZvclFOYW1lKHFuYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWphdmFDbGFzc0ZvclBhcmVudEVsZW1lbnQuZXF1YWxzKGphdmFDbGFzc0ZvckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YUNsYXNzRm9yUGFyZW50RWxlbWVudC5lbmRzV2l0aCgiW10iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoamF2YUNsYXNzRm9yUGFyZW50RWxlbWVudC5zdWJzdHJpbmcoMCwgamF2YUNsYXNzRm9yUGFyZW50RWxlbWVudC5pbmRleE9mKCdbJykpKS5lcXVhbHMoamF2YUNsYXNzRm9yRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGphdmFDbGFzc0ZvckVsZW1lbnQuZW5kc1dpdGgoIltdIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGphdmFDbGFzc0ZvckVsZW1lbnQuc3Vic3RyaW5nKDAsIGphdmFDbGFzc0ZvckVsZW1lbnQuaW5kZXhPZignWycpKSkuZXF1YWxzKGphdmFDbGFzc0ZvclBhcmVudEVsZW1lbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVDaGFuZ2VkOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBtaW5PY2N1cnNDaGFuZ2VkKFFOYW1lIHFuYW1lLCBBcnJheUxpc3QgbWlzc2luZ1FOYW1lcywgQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyIG1ldGFpbmYpIHRocm93cyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBtaW5DaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIFFOYW1lW10gcFFOYW1lczsKLQotICAgICAgICBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgcGFyZW50TWV0YWluZiA9IG1ldGFpbmYuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgaWYgKHBhcmVudE1ldGFpbmYgIT0gbnVsbCAmJiAhbWlzc2luZ1FOYW1lcy5jb250YWlucyhxbmFtZSkpIHsKLQotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcFFOYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocFFOYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWluZi5nZXRNaW5PY2N1cnMocW5hbWUpID4gcGFyZW50TWV0YWluZi5nZXRNaW5PY2N1cnMocFFOYW1lc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFpbmYuZ2V0TWluT2NjdXJzKHFuYW1lKSA8IHBhcmVudE1ldGFpbmYuZ2V0TWluT2NjdXJzKHBRTmFtZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJtaW5PY2N1cnMgV3JvbmchIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1pbkNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1heE9jY3Vyc0NoYW5nZWQoUU5hbWUgcW5hbWUsIEFycmF5TGlzdCBtaXNzaW5nUU5hbWVzLCBCZWFuV3JpdGVyTWV0YUluZm9Ib2xkZXIgbWV0YWluZikgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIG1heENoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgUU5hbWVbXSBwUU5hbWVzOwotCi0gICAgICAgIEJlYW5Xcml0ZXJNZXRhSW5mb0hvbGRlciBwYXJlbnRNZXRhaW5mID0gbWV0YWluZi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAocGFyZW50TWV0YWluZiAhPSBudWxsICYmICFtaXNzaW5nUU5hbWVzLmNvbnRhaW5zKHFuYW1lKSkgewotICAgICAgICAgICAgaWYgKHBhcmVudE1ldGFpbmYuaXNPcmRlcmVkKCkpIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRPcmRlcmVkUU5hbWVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUU5hbWVzID0gcGFyZW50TWV0YWluZi5nZXRRTmFtZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcFFOYW1lcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChxbmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMocFFOYW1lc1tqXS5nZXRMb2NhbFBhcnQoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWluZi5nZXRNYXhPY2N1cnMocW5hbWUpIDwgcGFyZW50TWV0YWluZi5nZXRNYXhPY2N1cnMocFFOYW1lc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heENoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFpbmYuZ2V0TWF4T2NjdXJzKHFuYW1lKSA+IHBhcmVudE1ldGFpbmYuZ2V0TWF4T2NjdXJzKHBRTmFtZXNbal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJtYXhPY2N1cnMgV3JvbmchIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXhDaGFuZ2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBtYXRjaGVzIHRoZSBkZWZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gamF2YUNsYXNzTmFtZUZvckVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkgewotICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdENsYXNzTmFtZSgpCi0gICAgICAgICAgICAgICAgLmVxdWFscyhqYXZhQ2xhc3NOYW1lRm9yRWxlbWVudCkKLSAgICAgICAgICAgICAgICB8fCBnZXREZWZhdWx0Q2xhc3NBcnJheU5hbWUoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoamF2YUNsYXNzTmFtZUZvckVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSB4bWwgbmFtZSwgbWFrZSBhIHVuaXF1ZSBjbGFzcyBuYW1lIHRha2luZyBpbnRvIGFjY291bnQgdGhhdAotICAgICAqIHNvbWUgZmlsZSBzeXN0ZW1zIGFyZSBjYXNlIHNlbnNpdGl2ZSBhbmQgc29tZSBhcmUgbm90LiAtQ29uc2lkZXIgdGhlCi0gICAgICogSmF4LVdTIHNwZWMgZm9yIHRoaXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0T2ZOYW1lcwotICAgICAqIEBwYXJhbSB4bWxOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYWtlVW5pcXVlSmF2YUNsYXNzTmFtZShMaXN0IGxpc3RPZk5hbWVzLCBTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICBTdHJpbmcgamF2YU5hbWU7Ci0gICAgICAgIGlmIChKYXZhVXRpbHMuaXNKYXZhS2V5d29yZCh4bWxOYW1lKSkgewotICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMubWFrZU5vbkphdmFLZXl3b3JkKHhtbE5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMuY2FwaXRhbGl6ZUZpcnN0Q2hhcihKYXZhVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLnhtbE5hbWVUb0phdmEoeG1sTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKGxpc3RPZk5hbWVzLmNvbnRhaW5zKGphdmFOYW1lLnRvTG93ZXJDYXNlKCkpKSB7Ci0gICAgICAgICAgICBpZiAoIWxpc3RPZk5hbWVzLmNvbnRhaW5zKChqYXZhTmFtZSArICJFIikudG9Mb3dlckNhc2UoKSkpewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gamF2YU5hbWUgKyAiRSI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gamF2YU5hbWUgKyBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbGlzdE9mTmFtZXMuYWRkKGphdmFOYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICByZXR1cm4gamF2YU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBiaXQgb2YgY29kZSBmcm9tIHRoZSBvbGQgY29kZSBnZW5lcmF0b3IuIFdlIGFyZSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQotICAgICAqIHRlbXBsYXRlIGVuZ2luZXMgYW5kIHN1Y2ggc3R1ZmYgdGhhdCdzIGFscmVhZHkgdGhlcmUuIEJ1dCB0aGUgY2xhc3MKLSAgICAgKiB3cml0ZXJzIGFyZSBoYXJkIHRvIGJlIHJldXNlZCBzbyBzb21lIGNvZGUgbmVlZHMgdG8gYmUgcmVwZWF0ZWQgKGF0bGVhc3QKLSAgICAgKiBhIGJpdCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFRlbXBsYXRlKCkgdGhyb3dzIFNjaGVtYUNvbXBpbGF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBmaXJzdCBnZXQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnR5IG1hcAotICAgICAgICBDbGFzcyBjbGF6eiA9IHRoaXMuZ2V0Q2xhc3MoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0geHNsU3RyZWFtOwotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gamF2YUJlYW5UZW1wbGF0ZU5hbWU7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB4c2xTdHJlYW0gPSBjbGF6ei5nZXRSZXNvdXJjZUFzU3RyZWFtKHRlbXBsYXRlTmFtZSk7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVDYWNoZSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RlbXBsYXRlcygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1Tb3VyY2UoeHNsU3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgdGVtcGxhdGVMb2FkZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNjaGVtYS50ZW1wbGF0ZUxvYWRFeGNlcHRpb24iKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic2NoZW1hLnRlbXBsYXRlTm90Rm91bmRFeGNlcHRpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBvdXRwdXQgZmlsZQotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKHRoaXMucm9vdERpciwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgZmlsZU5hbWUsICIuamF2YSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gb3V0cHV0RmlsZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhcnNlKERvY3VtZW50IGRvYywgRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICBYU0xUVGVtcGxhdGVQcm9jZXNzb3IucGFyc2Uob3V0U3RyZWFtLCBkb2MsIGdldFRyYW5zZm9ybWVyKCkpOwotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgUHJldHR5UHJpbnRlci5wcmV0dGlmeShvdXRwdXRGaWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkgdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDYWNoZQotICAgICAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgLy8gVW5kZXIgc29tZSBwZWN1bGlhciBjb25kaXRpb25zIChjbGFzc2xvYWRlciBpc3N1ZXMpLCBqdXN0IHNjcmFwIHRoZSBvbGQgdGVtcGxhdGVDYWNoZSwKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgIGxvYWRUZW1wbGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDYWNoZQotICAgICAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZWZpeCBmb3IgYSBuYW1lc3BhY2UgVVJJLiBUaGlzIG1ldGhvZCB3aWxsIEFMV0FZUyByZXR1cm4gYSB2YWxpZAotICAgICAqIHByZWZpeCAtIGlmIHRoZSBnaXZlbiBVUkkgaXMgYWxyZWFkeSBtYXBwZWQgaW4gdGhpcyBzZXJpYWxpemF0aW9uLCB3ZQotICAgICAqIHJldHVybiB0aGUgcHJldmlvdXMgcHJlZml4LiBJZiBpdCBpcyBub3QgbWFwcGVkLCB3ZSB3aWxsIGFkZCBhIG5ldwotICAgICAqIG1hcHBpbmcgYW5kIHJldHVybiBhIGdlbmVyYXRlZCBwcmVmaXggb2YgdGhlIGZvcm0gIm5zPG51bT4iLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSBpcyB0aGUgbmFtZXNwYWNlIHVyaQotICAgICAqIEByZXR1cm4gUmV0dXJucyBwcmVmaXguCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhGb3JVUkkoU3RyaW5nIHVyaSkgewotICAgICAgICByZXR1cm4gZ2V0UHJlZml4Rm9yVVJJKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGFzdCB1c2VkIGluZGV4IHN1ZmZpeCBmb3IgIm5zIgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGxhc3RQcmVmaXhJbmRleCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBNYXAgb2YgbmFtZXNwYWNlcyBVUkkgdG8gcHJlZml4KGVzKQotICAgICAqLwotICAgIEhhc2hNYXAgbWFwVVJJdG9QcmVmaXggPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgSGFzaE1hcCBtYXBQcmVmaXh0b1VSSSA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBwcmVmaXggZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UgVVJJLiBJZiBvbmUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgICogaW4gdGhpcyBzZXJpYWxpemF0aW9uLCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBtYXAgdGhlIHBhc3NlZCBkZWZhdWx0IHByZWZpeAotICAgICAqIHRvIHRoZSBVUkksIGFuZCByZXR1cm4gdGhhdC4gSWYgYSBudWxsIGRlZmF1bHQgcHJlZml4IGlzIHBhc3NlZCwgdXNlIG9uZQotICAgICAqIG9mIHRoZSBmb3JtICJuczxudW0+IgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmksIFN0cmluZyBkZWZhdWx0UHJlZml4KSB7Ci0gICAgICAgIGlmICgodXJpID09IG51bGwpIHx8ICh1cmkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIG1hcFVSSXRvUHJlZml4LmdldCh1cmkpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0UHJlZml4ID09IG51bGwgfHwgZGVmYXVsdFByZWZpeC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIGxhc3RQcmVmaXhJbmRleCsrOwotICAgICAgICAgICAgICAgIHdoaWxlIChtYXBQcmVmaXh0b1VSSS5nZXQocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBsYXN0UHJlZml4SW5kZXgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IGRlZmF1bHRQcmVmaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXBQcmVmaXh0b1VSSS5wdXQocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgbWFwVVJJdG9QcmVmaXgucHV0KHVyaSwgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4OwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNob3J0VHlwZU5hbWUoU3RyaW5nIHR5cGVDbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKHR5cGVDbGFzc05hbWUuZW5kc1dpdGgoIltdIikpIHsKLSAgICAgICAgICAgIHR5cGVDbGFzc05hbWUgPSB0eXBlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCB0eXBlQ2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgICAgIC5sYXN0SW5kZXhPZigiWyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0eXBlQ2xhc3NOYW1lLnN1YnN0cmluZyh0eXBlQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxLAotICAgICAgICAgICAgICAgIHR5cGVDbGFzc05hbWUubGVuZ3RoKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtYXBwZXIgY2xhc3MgbmFtZSAtIHRoZXJlIGlzIGdvaW5nIHRvIGJlIG9ubHkgb25lCi0gICAgICogbWFwcGVyIGNsYXNzIGZvciB0aGUgd2hvbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE1hcHBlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgaWYgKHdyYXBDbGFzc2VzIHx8ICF3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBFWFRFTlNJT05fTUFQUEVSX0NMQVNTTkFNRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBwaW5nQ2xhc3NQYWNrYWdlICsgIi4iICsgRVhURU5TSU9OX01BUFBFUl9DTEFTU05BTUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIG1hcHBlciBjbGFzcyBwYWNrYWdlIG5hbWUKLSAgICAgKiBNYXkgYmUgaWdub3JlZCBieSB0aGUgaW1wbGVtZW50ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZ0NsYXNzUGFja2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtYXBwaW5nIGNsYXNzIG5hbWUgb2YgdGhpcyB3cml0ZXIuIEEgbWFwcGluZyBjbGFzcwotICAgICAqIHBhY2thZ2Ugc2V0IGJ5IHRoZSBvcHRpb25zIG1heSBiZSBvdmVycmlkZGVuIGF0IHRoZSB0aGlzIHBvaW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwcGVyUGFja2FnZU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckV4dGVuc2lvbk1hcHBlclBhY2thZ2VOYW1lKFN0cmluZyBtYXBwZXJQYWNrYWdlTmFtZSkgewotICAgICAgICB0aGlzLm1hcHBpbmdDbGFzc1BhY2thZ2UgPSBtYXBwZXJQYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgZXh0ZW5zaW9uIGNsYXNzZXMgLSB0aGlzIGlzIG5lZWRlZCB0byBwcm9jZXNzCi0gICAgICogdGhlIGhpZXJhcmNoeSBvZiBjbGFzc2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0YWluZkFycmF5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlbnNpb25NYXBwZXIoQmVhbldyaXRlck1ldGFJbmZvSG9sZGVyW10gbWV0YWluZkFycmF5KSB0aHJvd3MgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL2dlbmVyYXRlIHRoZSBlbGVtZW50Ci0gICAgICAgIHRyeSB7Ci0KLQotICAgICAgICAgICAgU3RyaW5nIG1hcHBlckNsYXNzTmFtZSA9IGdldEZ1bGx5UXVhbGlmaWVkTWFwcGVyQ2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgICAgIERvY3VtZW50IG1vZGVsID0gWFNMVFV0aWxzLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50IHJvb3RFbHQgPSBYU0xUVXRpbHMuZ2V0RWxlbWVudChtb2RlbCwgIm1hcHBlciIpOwotICAgICAgICAgICAgU3RyaW5nIG1hcHBlck5hbWUgPSBtYXBwZXJDbGFzc05hbWUuc3Vic3RyaW5nKG1hcHBlckNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAibmFtZSIsIG1hcHBlck5hbWUsIHJvb3RFbHQpOwotICAgICAgICAgICAgU3RyaW5nIGJhc2VQYWNrYWdlTmFtZSA9ICIiOwotICAgICAgICAgICAgaWYgKG1hcHBlckNsYXNzTmFtZS5pbmRleE9mKCIuIikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBiYXNlUGFja2FnZU5hbWUgPSBtYXBwZXJDbGFzc05hbWUuc3Vic3RyaW5nKDAsIG1hcHBlckNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAicGFja2FnZSIsIGJhc2VQYWNrYWdlTmFtZSwgcm9vdEVsdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJwYWNrYWdlIiwgIiIsIHJvb3RFbHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXdyYXBDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgInVud3JhcHBlZCIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF3cml0ZUNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzSGVscGVyTW9kZSkgewotICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJoZWxwZXJtb2RlIiwgInllcyIsIHJvb3RFbHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGFpbmZBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFFOYW1lIG93blFuYW1lID0gbWV0YWluZkFycmF5W2ldLmdldE93blFuYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGFpbmZBcnJheVtpXS5nZXRPd25DbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAvL2RvICBub3QgYWRkIHdoZW4gdGhlIHFuYW1lIGlzIG5vdCBhdmFpbGJsZQotICAgICAgICAgICAgICAgIGlmIChvd25RbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgdHlwZUNoaWxkID0gWFNMVFV0aWxzLmFkZENoaWxkRWxlbWVudChtb2RlbCwgInR5cGUiLCByb290RWx0KTsKLSAgICAgICAgICAgICAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShtb2RlbCwgIm5zdXJpIiwgb3duUW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHR5cGVDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUobW9kZWwsICJjbGFzc25hbWUiLCBjbGFzc05hbWUgPT0gbnVsbCA/ICIiIDogY2xhc3NOYW1lLCB0eXBlQ2hpbGQpOwotICAgICAgICAgICAgICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKG1vZGVsLCAic2hvcnRuYW1lIiwgb3duUW5hbWUgPT0gbnVsbCA/ICIiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25RbmFtZS5nZXRMb2NhbFBhcnQoKSwgdHlwZUNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1vZGVsLmFwcGVuZENoaWxkKHJvb3RFbHQpOwotCi0gICAgICAgICAgICBpZiAoIXRlbXBsYXRlTG9hZGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFRlbXBsYXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3cmFwQ2xhc3NlcykgewotICAgICAgICAgICAgICAgIHJvb3RFbHQgPSAoRWxlbWVudCkgZ2xvYmFsV3JhcHBlZERvY3VtZW50LmltcG9ydE5vZGUocm9vdEVsdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy9hZGQgdG8gdGhlIGdsb2JhbCB3cmFwcGVkIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgZ2xvYmFsV3JhcHBlZERvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKHJvb3RFbHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAod3JpdGVDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICBGaWxlIG91dCA9IGNyZWF0ZU91dEZpbGUoYmFzZVBhY2thZ2VOYW1lLCBtYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2Ugd2l0aCB0aGUgdGVtcGxhdGUgYW5kIGNyZWF0ZSB0aGUgZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgcGFyc2UobW9kZWwsIG91dCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1vZGVsIHRvIHRoZSBtb2RlbCBtYXAKLSAgICAgICAgICAgICAgICBtb2RlbE1hcC5wdXQobmV3IFFOYW1lKG1hcHBlck5hbWUpLCBtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hQ29tcGlsYXRpb25FeGNlcHRpb24oU2NoZW1hQ29tcGlsZXJNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWEuZG9jdWVtZW50LmVycm9yIiksIGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFDb21waWxhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zdWItYnVpbGQueG1sIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vc3ViLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZGFkZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi9zdWItYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImFkYi1jb2RlZ2VuLXRlc3Qtc291cmNlLWdlbmVyYXRlIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQk8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEdlbmVyYXRlIHNvdXJjZSBjb2RlIGZvciB0ZXN0cy4uLgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLQk8dGFyZ2V0IG5hbWU9Im1haW4iPgotCi0JCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlZC5jbGFzc2VzLmRpciIgdmFsdWU9InRhcmdldC9jbGFzc2VzIi8+Ci0JCTwhLS0gVGhlcmVzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAtLT4KLQkJPHByb3BlcnR5IG5hbWU9InNjaGVtYS5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMveHNkIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXN0c3VpdGUuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpciIgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vc3JjIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9jbGFzc2VzIi8+Ci0JCTwhLS0gbWFrZSB0aGUgZGlycyAtLT4KLQkJPG1rZGlyIGRpcj0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfSIvPgotCQk8bWtkaXIgZGlyPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyfSIvPgotCQk8IS0tIFJ1biBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0JCTxlY2hvPkNvbXBpbGluZyBzaW1wbGVfbWF4T2NjdXJzMi54c2Q8L2VjaG8+Ci0JCTwhLS0gc2ltcGxlIG1heCBvY2N1cnMgMiB4c2QgLS0+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuc291cmNlLmRpcn0vc2ltcGxlX21heE9jY3VyczIueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0JCTxlY2hvPkNvbXBpbGluZyBhbm9ueW1vdXNfY29tcGxleFR5cGUueHNkPC9lY2hvPgotCQk8IS0tIGFub24gY29tcGxleCB0eXBlIHhzZCAtLT4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5zb3VyY2UuZGlyfS9hbm9ueW1vdXNfY29tcGxleFR5cGUueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0JCTwhLS0gYW5vbiBjaG9pY2UgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgc2ltcGxlX2Nob2ljZS54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuc291cmNlLmRpcn0vc2ltcGxlX2Nob2ljZS54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLQkJPCEtLSBhbm9uIHBhcnRpY2xlIGFsbCB4c2QgLS0+Ci0JCTxlY2hvPkNvbXBpbGluZyBzaW1wbGVfcGFydGljbGVfYWxsLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5zb3VyY2UuZGlyfS9zaW1wbGVfcGFydGljbGVfYWxsLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCQk8IS0tIHNpbXBsZSBtYXggb2NjdXJzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIHNpbXBsZV9tYXhPY2N1cnMueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLnNvdXJjZS5kaXJ9L3NpbXBsZV9tYXhPY2N1cnMueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0KLQkJPCEtLSBzaW1wbGUgYW55IHR5cGUgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgc2ltcGxlX2FueXR5cGUueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLnNvdXJjZS5kaXJ9L3NpbXBsZV9hbnl0eXBlLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0KLQkJPCEtLSBtaW4gb2NjdXJzIDAgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgc2ltcGxlLW1pbm9jY3VyczAueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLnNvdXJjZS5kaXJ9L3NpbXBsZS1taW5vY2N1cnMwLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0JCTwhLS0gY29tcGxleCBtaW4gb2NjdXJzIDAgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgY29tcGxleC1taW5vY2N1cnMwLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5zb3VyY2UuZGlyfS9jb21wbGV4LW1pbm9jY3VyczAueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0KLQkJPGVjaG8+Q29tcGlsaW5nIHNpbXBsZS1yZWN1cnNpdmUtZGF0YXR5cGVzLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5zb3VyY2UuZGlyfS9zaW1wbGUtcmVjdXJzaXZlLWRhdGF0eXBlcy54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLQotCQk8ZWNobz5Db21waWxpbmcgbWl4ZWRfbWlub2NjdXMwLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5zb3VyY2UuZGlyfS9taXhlZF9taW5vY2N1czAueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0JCTwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLQkJPCEtLSBBbGwgc2ltcGxlIHByaW1pdGl2ZSB0eXBlcyB4c2QgLS0+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuc291cmNlLmRpcn0vc2ltcGxlL3NpbXBsZVR5cGUtQWxsLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5zb3VyY2UuZGlyfS9kZXJpdmVkL2Rlcml2ZWRUeXBlLUFsbC54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLQkJPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotCQk8IS0tIEFsbCBzaW1wbGUgZGVyaXZlZCB0eXBlcyB4c2QgLS0+Ci0JCTxlY2hvPkNvbXBpbGluZyBjb21wbGV0ZS54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vY29tcGxldGUueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0JCTwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLQkJPCEtLSBBbGwgc2ltcGxlIGRlcml2ZWQgdHlwZXMgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgc2ltcGxlRXh0ZW5zaW9uLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9leHRlbnNpb25zLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0JCTwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLQkJPCEtLSBBbGwgc2ltcGxlIGRlcml2ZWQgdHlwZXMgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgdW5pb24ueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L3VuaW9uLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIGFsbC54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vYWxsLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIGVudW1lcmF0aW9uLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9lbnVtZXJhdGlvbi54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLQotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIHJlc3RyaWN0aW9ucy54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vcmVzdHJpY3Rpb25zLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIGNob2ljZS54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vY2hvaWNlLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0JCTwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLQkJPCEtLSBBbGwgc2ltcGxlIGRlcml2ZWQgdHlwZXMgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgbGlzdC54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vbGlzdC54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLQotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIGVsZW1lbnRfcmVmZXJlbmNlcy54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vZWxlbWVudF9yZWZlcmVuY2VzLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIGlubmVyc2VxdWVuY2VfY2hvaWNlLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9pbm5lcnNlcXVlbmNlX2Nob2ljZS54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLQotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIHRlc3RhdHRyaWJ1dGUueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L3Rlc3RhdHRyaWJ1dGUueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0KLQkJPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotCQk8IS0tIEFsbCBzaW1wbGUgZGVyaXZlZCB0eXBlcyB4c2QgLS0+Ci0JCTxlY2hvPkNvbXBpbGluZyBib29sZWFuLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9ib29sZWFuLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0JCTwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLQkJPCEtLSBBbGwgc2ltcGxlIGRlcml2ZWQgdHlwZXMgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgcGFydGljYWxNYXhPY2N1cmVzLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9wYXJ0aWNhbE1heE9jY3VyZXMueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0KLQkJPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotCQk8IS0tIEFsbCBzaW1wbGUgZGVyaXZlZCB0eXBlcyB4c2QgLS0+Ci0JCTxlY2hvPkNvbXBpbGluZyBpbm5lclBhcnRpY2xlcy54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vaW5uZXJQYXJ0aWNsZXMueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0KLQotCQk8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+Ci0JCTwhLS0gQWxsIHNpbXBsZSBkZXJpdmVkIHR5cGVzIHhzZCAtLT4KLQkJPGVjaG8+Q29tcGlsaW5nIGRlZmF1bHRfbmFtZXNwYWNlcy54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vZGVmYXVsdF9uYW1lc3BhY2VzLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0gICAgICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KLQkJPCEtLSBBbGwgc2ltcGxlIGRlcml2ZWQgdHlwZXMgeHNkIC0tPgotCQk8ZWNobz5Db21waWxpbmcgZ3JvdXBzLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9ncm91cHMueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0KLSAgICAgICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgotCQk8IS0tIEFsbCBzaW1wbGUgZGVyaXZlZCB0eXBlcyB4c2QgLS0+Ci0JCTxlY2hvPkNvbXBpbGluZyBiYXNlNjRiaW5hcnkueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L2Jhc2U2NGJpbmFyeS54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLSAgICAgICAgPGVjaG8+Q29tcGlsaW5nIGFic3RyYWN0LnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9hYnN0cmFjdC54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLSAgICAgICAgPGVjaG8+Q29tcGlsaW5nIGRlY2ltYWwueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L2RlY2ltYWwueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0gICAgICAgIDxlY2hvPkNvbXBpbGluZyBhbnR0eXBlLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9hbnl0eXBlLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotICAgICAgICA8ZWNobz5Db21waWxpbmcgcmFtcGFydC54c2Q8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmEiIGZvcms9InRydWUiPgotCQkJPGp2bWFyZyBsaW5lPSIke21hdmVuLmp1bml0Lmp2bWFyZ3N9Ii8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4KLQkJCTxhcmcgZmlsZT0iJHt0ZXN0c3VpdGUuc291cmNlLmRpcn0vcmFtcGFydC54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLSAgICAgICAgPGVjaG8+Q29tcGlsaW5nIGlubmVyUGFydGljbGVFeHRlbnNpb24ueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L2lubmVyUGFydGljbGVFeHRlbnNpb24ueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0gICAgICAgIDxlY2hvPkNvbXBpbGluZyB1bmlvbjIueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L3VuaW9uMi54c2QiLz4KLQkJCTxhcmcgZmlsZT0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+Ci0JCTwvamF2YT4KLSAgICAgICAgPGVjaG8+Q29tcGlsaW5nIGRlZmF1bHRfdmFsdWUueHNkPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLlhTRDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgbGluZT0iJHttYXZlbi5qdW5pdC5qdm1hcmdzfSIvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9Ii8+Ci0JCQk8YXJnIGZpbGU9IiR7dGVzdHN1aXRlLnNvdXJjZS5kaXJ9L2RlZmF1bHRfdmFsdWUueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0gICAgICAgIDxlY2hvPkNvbXBpbGluZyBjb21wbGV4RXh0ZW5zaW9uLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9jb21wbGV4RXh0ZW5zaW9uLnhzZCIvPgotCQkJPGFyZyBmaWxlPSIke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0iLz4KLQkJPC9qYXZhPgotCi0gICAgICAgICA8ZWNobz5Db21waWxpbmcgc29hcGVuY29kaW5nLnhzZDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5YU0QySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIGxpbmU9IiR7bWF2ZW4uanVuaXQuanZtYXJnc30iLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIvPgotCQkJPGFyZyBmaWxlPSIke3Rlc3RzdWl0ZS5zb3VyY2UuZGlyfS9zb2FwZW5jb2RpbmcueHNkIi8+Ci0JCQk8YXJnIGZpbGU9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIvPgotCQk8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy9lbmNvZGluZy54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy9zb2FwZW5jb2RpbmcvZW5jb2RpbmcueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQxMTQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy9lbmNvZGluZy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJvb3QiPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICdyb290JyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBzZXJpYWxpemF0aW9uIHJvb3RzIGZyb20gb3RoZXIKLSAgICAgICAgICAgICAgICBlbGVtZW50cyB0aGF0IGFyZSBwcmVzZW50IGluIGEgc2VyaWFsaXphdGlvbiBidXQgYXJlIG5vdCByb290cyBvZgotICAgICAgICAgICAgICAgIGEgc2VyaWFsaXplZCB2YWx1ZSBncmFwaAotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmJvb2xlYW4iPgotICAgICAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIwfDEiLz4KLSAgICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmF0dHJpYnV0ZT4KLQotICAgIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJjb21tb25BdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGNvbW1vbiB0byBhbGwgZWxlbWVudHMgdGhhdCBmdW5jdGlvbiBhcyBhY2Nlc3NvcnMgb3IKLSAgICAgICAgICAgICAgICByZXByZXNlbnQgaW5kZXBlbmRlbnQgKG11bHRpLXJlZikgdmFsdWVzLiBUaGUgaHJlZiBhdHRyaWJ1dGUgaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGEgbWFubmVyIGxpa2UgQ09OUkVGLiBUaGF0IGlzLCB0aGUgZWxlbWVudAotICAgICAgICAgICAgICAgIGNvbnRlbnQgc2hvdWxkIGJlIGVtcHR5IGlmZiB0aGUgaHJlZiBhdHRyaWJ1dGUgYXBwZWFycwotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzOmFubm90YXRpb24+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLSAgICA8IS0tIEdsb2JhbCBBdHRyaWJ1dGVzLiAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2FibGUgdmlhIHF1YWxpZmllZCBhdHRyaWJ1dGUgbmFtZXMgb24gYW55IGNvbXBsZXggdHlwZSByZWZlcmVuY2luZyB0aGVtLiAtLT4KLQotICAgIDwhLS0gQXJyYXkgYXR0cmlidXRlcy4gTmVlZGVkIHRvIGdpdmUgdGhlIHR5cGUgYW5kIGRpbWVuc2lvbnMgb2YgYW4gYXJyYXkncyBjb250ZW50cywgYW5kIHRoZSBvZmZzZXQgZm9yIHBhcnRpYWxseS10cmFuc21pdHRlZCBhcnJheXMuIC0tPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYXJyYXlDb29yZGluYXRlIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXJyYXlUeXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9mZnNldCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlBdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczphcnJheVR5cGUiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczpvZmZzZXQiLz4KLSAgICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwb3NpdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iYXJyYXlNZW1iZXJBdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InRuczpwb3NpdGlvbiIvPgotICAgIDwveHM6YXR0cmlidXRlR3JvdXA+Ci0KLQotICAgIDx4czplbGVtZW50IG5hbWU9IkFycmF5IiB0eXBlPSJ0bnM6QXJyYXkiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXkiPgotICAgICAgICA8eHM6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4czpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICdBcnJheScgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IHBvc2l0aW9uCi0gICAgICAgICAgICA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHM6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6YXJyYXlBdHRyaWJ1dGVzIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gJ1N0cnVjdCcgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5IG5hbWUuCi1Db25zdHJhaW50OiBObyBlbGVtZW50IG1heSBiZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW55IG90aGVyLAotbm9yIG1heSBhbnkgZWxlbWVudCBoYXZlIGEgbWF4T2NjdXJzID4gMS4gLS0+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3QiIHR5cGU9InRuczpTdHJ1Y3QiLz4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTdHJ1Y3QiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNhbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gJ0Jhc2U2NCcgY2FuIGJlIHVzZWQgdG8gc2VyaWFsaXplIGJpbmFyeSBkYXRhIHVzaW5nIGJhc2U2NCBlbmNvZGluZwotYXMgZGVmaW5lZCBpbiBSRkMyMDQ1IGJ1dCB3aXRob3V0IHRoZSBNSU1FIGxpbmUgbGVuZ3RoIGxpbWl0YXRpb24uIC0tPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmFzZTY0Ij4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSIvPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gRWxlbWVudCBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG9mIHRoZSBzaW1wbGUgdHlwZXMgaW4gdGhlCi0gWE1MIFNjaGVtYXMgU3BlY2lmaWNhdGlvbi4gLS0+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkdXJhdGlvbiIgdHlwZT0idG5zOmR1cmF0aW9uIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImR1cmF0aW9uIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmR1cmF0aW9uIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZVRpbWUiIHR5cGU9InRuczpkYXRlVGltZSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkYXRlVGltZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkYXRlVGltZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iTk9UQVRJT04iIHR5cGU9InRuczpOT1RBVElPTiIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOT1RBVElPTiI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idGltZSIgdHlwZT0idG5zOnRpbWUiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idGltZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp0aW1lIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0idG5zOmRhdGUiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGF0ZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkYXRlIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ1llYXJNb250aCIgdHlwZT0idG5zOmdZZWFyTW9udGgiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXJNb250aCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhck1vbnRoIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ1llYXIiIHR5cGU9InRuczpnWWVhciIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnWWVhciI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhciI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImdNb250aERheSIgdHlwZT0idG5zOmdNb250aERheSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnTW9udGhEYXkiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z01vbnRoRGF5Ij4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ0RheSIgdHlwZT0idG5zOmdEYXkiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ0RheSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnRGF5Ij4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ01vbnRoIiB0eXBlPSJ0bnM6Z01vbnRoIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdNb250aCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnTW9udGgiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJib29sZWFuIiB0eXBlPSJ0bnM6Ym9vbGVhbiIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJib29sZWFuIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJvb2xlYW4iPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJiYXNlNjRCaW5hcnkiIHR5cGU9InRuczpiYXNlNjRCaW5hcnkiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImhleEJpbmFyeSIgdHlwZT0idG5zOmhleEJpbmFyeSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZmxvYXQiIHR5cGU9InRuczpmbG9hdCIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJmbG9hdCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpmbG9hdCI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImRvdWJsZSIgdHlwZT0idG5zOmRvdWJsZSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3VibGUiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZG91YmxlIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYW55VVJJIiB0eXBlPSJ0bnM6YW55VVJJIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFueVVSSSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJRTmFtZSIgdHlwZT0idG5zOlFOYW1lIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlFOYW1lIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOlFOYW1lIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InRuczpzdHJpbmciLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9Im5vcm1hbGl6ZWRTdHJpbmciIHR5cGU9InRuczpub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5vcm1hbGl6ZWRTdHJpbmciPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InRva2VuIiB0eXBlPSJ0bnM6dG9rZW4iLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idG9rZW4iPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dG9rZW4iPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJsYW5ndWFnZSIgdHlwZT0idG5zOmxhbmd1YWdlIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Imxhbmd1YWdlIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmxhbmd1YWdlIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iTmFtZSIgdHlwZT0idG5zOk5hbWUiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOYW1lIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iTk1UT0tFTiIgdHlwZT0idG5zOk5NVE9LRU4iLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk1UT0tFTiI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOTVRPS0VOIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iTkNOYW1lIiB0eXBlPSJ0bnM6TkNOYW1lIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5DTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJOTVRPS0VOUyIgdHlwZT0idG5zOk5NVE9LRU5TIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5NVE9LRU5TIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU5TIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iSUQiIHR5cGU9InRuczpJRCIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRCI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IklEUkVGIiB0eXBlPSJ0bnM6SURSRUYiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSURSRUYiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SURSRUYiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJFTlRJVFkiIHR5cGU9InRuczpFTlRJVFkiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRU5USVRZIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOkVOVElUWSI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IklEUkVGUyIgdHlwZT0idG5zOklEUkVGUyIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRFJFRlMiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SURSRUZTIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iRU5USVRJRVMiIHR5cGU9InRuczpFTlRJVElFUyIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFTlRJVElFUyI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpFTlRJVElFUyI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImRlY2ltYWwiIHR5cGU9InRuczpkZWNpbWFsIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRlY2ltYWwiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImludGVnZXIiIHR5cGU9InRuczppbnRlZ2VyIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludGVnZXIiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9Im5vblBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOm5vblBvc2l0aXZlSW50ZWdlciIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIiB0eXBlPSJ0bnM6bmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpuZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJsb25nIiB0eXBlPSJ0bnM6bG9uZyIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb25nIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmxvbmciPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InRuczppbnQiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaW50Ij4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmludCI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InNob3J0IiB0eXBlPSJ0bnM6c2hvcnQiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2hvcnQiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c2hvcnQiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJieXRlIiB0eXBlPSJ0bnM6Ynl0ZSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJieXRlIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJ5dGUiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpub25OZWdhdGl2ZUludGVnZXIiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkTG9uZyIgdHlwZT0idG5zOnVuc2lnbmVkTG9uZyIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZExvbmciPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRJbnQiIHR5cGU9InRuczp1bnNpZ25lZEludCIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEludCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZEludCI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InRuczp1bnNpZ25lZFNob3J0Ii8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVuc2lnbmVkU2hvcnQiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRTaG9ydCI+Ci0gICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkQnl0ZSIgdHlwZT0idG5zOnVuc2lnbmVkQnl0ZSIvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRCeXRlIj4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ0bnM6cG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpwb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIi8+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy9zb2FwZW5jb2RpbmcveG1sc2NoZW1hLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy94bWxzY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjhlZDNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NvYXBlbmNvZGluZy94bWxzY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEvc2NoZW1hIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hL3NjaGVtYSI+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJiYXNlNjQiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImR1cmF0aW9uIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmR1cmF0aW9uIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkYXRlVGltZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpkYXRlVGltZSI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOT1RBVElPTiI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRpbWUiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGUiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZSI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXJNb250aCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhck1vbnRoIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnWWVhciI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnWWVhciI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoRGF5Ij4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aERheSI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ0RheSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpnRGF5Ij4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnTW9udGgiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z01vbnRoIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJib29sZWFuIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJvb2xlYW4iPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpoZXhCaW5hcnkiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImZsb2F0Ij4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmZsb2F0Ij4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkb3VibGUiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZG91YmxlIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbnlVUkkiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJRTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmciPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vcm1hbGl6ZWRTdHJpbmciPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRva2VuIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRva2VuIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsYW5ndWFnZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsYW5ndWFnZSI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOYW1lIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOTVRPS0VOIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU4iPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5DTmFtZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOQ05hbWUiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5NVE9LRU5TIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOk5NVE9LRU5TIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJRCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRCI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSURSRUYiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SURSRUYiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUWSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpFTlRJVFkiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklEUkVGUyI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpJRFJFRlMiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUSUVTIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOkVOVElUSUVTIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWNpbWFsIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRlY2ltYWwiPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImludGVnZXIiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibG9uZyI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsb25nIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbnQiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aW50Ij4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJzaG9ydCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzaG9ydCI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYnl0ZSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpieXRlIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6bm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZExvbmciPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEludCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZEludCI+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idW5zaWduZWRTaG9ydCI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZFNob3J0Ij4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRCeXRlIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwb3NpdGl2ZUludGVnZXIiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6cG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Fic3RyYWN0LnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hYnN0cmFjdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTFhZjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Fic3RyYWN0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9hYnN0cmFjdCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvYWJzdHJhY3QiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEFic3RyYWN0MSIgdHlwZT0idG5zOlRlc3RBYnN0cmFjdDIiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVGVzdEFic3RyYWN0MiIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hbGwueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2FsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTE5NmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2FsbC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotICAgIDx4czplbGVtZW50IG5hbWU9IlVwZGF0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6aW50IiBuYW1lPSJpZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCB0eXBlPSJ4czpzdHJpbmciIG5hbWU9ImFyZzAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgdHlwZT0ieHM6Ym9vbGVhbiIgbmFtZT0iYXJnMSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hbnl0eXBlLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9hbnl0eXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZTgwYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvYW55dHlwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYWRiLnRlc3QvYW55VHlwZSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vYWRiLnRlc3QvYW55VHlwZSIKLSAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlRWxlbWVudDEiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0QW55VHlwZUVsZW1lbnQyIiB0eXBlPSJ4czphbnlUeXBlIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlRWxlbWVudDMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czphbnlUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEFueVR5cGVFbGVtZW50NCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOmFueVR5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlRWxlbWVudDUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czphbnlUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlRWxlbWVudDYiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czphbnlUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0QW55VHlwZUVsZW1lbnQ3Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6YW55VHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEFueVR5cGVFbGVtZW50OCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOmFueVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEFueVR5cGVFbGVtZW50OSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOmFueVR5cGUiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0QW55VHlwZUVsZW1lbnQxMCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOmFueVR5cGUiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVGVzdENvbXBsZXhQYXJlbnQiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RDb21wbGV4Q2hpbGQiPgotICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpUZXN0Q29tcGxleFBhcmVudCI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVGVzdFNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRHluYW1pY1Byb3BlcnR5Ij4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWwiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ0bnM6RHluYW1pY1Byb3BlcnR5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLQotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9iYXNlNjRiaW5hcnkueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Jhc2U2NGJpbmFyeS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWEzM2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Jhc2U2NGJpbmFyeS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhwZWN0ZWRDb250ZW50VHlwZXMiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmhleEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdEJhc2U2NEJpbmFyeSIgdHlwZT0ieG1pbWU6YmFzZTY0QmluYXJ5Ij48L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RIZXhCaW5hcnkiIHR5cGU9InhtaW1lOmhleEJpbmFyeSI+PC94czplbGVtZW50PgotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJCeXRlQXJyYXkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4KLQotICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0QmFzZTY0TXVsdGlFbGVtZW50Ij4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6ZWxlbWVudD4KLQotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvYm9vbGVhbi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvYm9vbGVhbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2I2OTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Jvb2xlYW4ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2Jvb2xlYW4xIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ib29sZWFuMSI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0Qm9vbGVhbjEiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0Qm9vbGVhbjIiID4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2Nob2ljZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY2hvaWNlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkMDhkYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY2hvaWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0ib3JnLmFwYWNoZS5heGlzMi50ZXN0IgotICAgICAgICB4bWxuczp0ZXN0MT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0IgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Im9yZy5hcGFjaGUuYXhpczIudGVzdCI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0Q2hvaXNlIiA+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlSb290RWxlbSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDaGlsZDEiIHR5cGU9InhzZDppbnQiID48L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU29tZUNob2ljZTEiIHR5cGU9InRlc3QxOlNvbWVDaG9pY2UxX1R5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU29tZUNob2ljZTIiIHR5cGU9InRlc3QxOlNvbWVDaG9pY2UyX1R5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTb21lQ2hvaWNlMV9UeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTb21lQ2hvaWNlMUNoaWxkMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXN0MTpTb21lQ2hvaWNlMUNoaWxkMV9UeXBlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJTb21lQ2hvaWNlMUF0dHIxIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IlZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNvbWVDaG9pY2UyX1R5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlNvbWVDaG9pY2UyQ2hpbGQxIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU29tZUNob2ljZTJDaGlsZDIiIHR5cGU9InhzZDppbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iU29tZUNob2ljZTJBdHRyMSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU29tZUNob2ljZTFDaGlsZDFfVHlwZSI+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9jb21wbGV0ZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY29tcGxldGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWEwY2NhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9jb21wbGV0ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3R5cGVzLmVjaG8uc2VydmljZXMiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdHlwZXMuZWNoby5zZXJ2aWNlcyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCi0KLSAgICA8IS0tIHRlc3QgZWxlbWVudHMgZm9yIHhzZDphbnlUeXBlIC0tPgotICAgIDxlbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlMSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJUZXN0QW55VHlwZTIiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iVGVzdEFueVR5cGUzIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgdHlwZT0ieHNkOmFueVR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlNCI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlNSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9IlRlc3RBbnlUeXBlNiI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iVGVzdEFueVR5cGU3Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgdHlwZT0ieHNkOmFueVR5cGUiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJUZXN0QW55VHlwZTgiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8IS0tIGdlbmVyYXRpbmcgZWxlbWVucyBmb3IgcHJpbWl0aXZlIHR5cGVzIC0tPgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RJbnQxIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RJbnQyIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdEludDMiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0SW50NCI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdEludDUiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBuaWxsYWJsZT0idHJ1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RJbnQ2Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RJbnQ3Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RJbnQ4Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8IS0tIGdlbmVyYXRpbmcgZWxlbWVucyBmb3Igc3RyaW5nIHR5cGVzIC0tPgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RTdHJpbmcxIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdFN0cmluZzIiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0U3RyaW5nMyI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RTdHJpbmc0Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0U3RyaW5nNSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdFN0cmluZzYiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdFN0cmluZzciPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdFN0cmluZzgiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLQotICAgIDwhLS0gZ2VuZXJhdGluZyBlbGVtZW5zIGZvciBjdXN0ZW0gdHlwZXMgLS0+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdEJvb2tJbmZvcm1hdGlvbjEiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Qm9va0luZm9ybWF0aW9uMiI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIG1pbk9jY3Vycz0iMCIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RCb29rSW5mb3JtYXRpb24zIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOkJvb2tJbmZvcm1hdGlvbiIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdEJvb2tJbmZvcm1hdGlvbjQiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RCb29rSW5mb3JtYXRpb241Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgbmlsbGFibGU9InRydWUiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Qm9va0luZm9ybWF0aW9uNiI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Qm9va0luZm9ybWF0aW9uNyI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLSAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0Qm9va0luZm9ybWF0aW9uOCI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VmFsdWUiIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotCi0KLSAgICA8IS0tIGdlbmVyYXRpbmcgZWxlbWVucyBmb3IgYW55IGVsZW1lbnRzIC0tPgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RBbnkxIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxhbnkgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVzdEFueTIiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGFueSBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RBbnkzIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxhbnkgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9InRlc3RBbnk0Ij4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxhbnkvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8IS0tIHRlc3Qgc3RyaW5nIHZhcmlhYmxlcyAtLT4KLSAgICA8ZWxlbWVudCBuYW1lPSJPdXRlclRlc3RTdHJpbmcxIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgIDxlbGVtZW50IG5hbWU9Ik91dGVyVGVzdFN0cmluZzIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQotICAgIDwhLS0gdGVzdCBwcmltaXRpdmUgdmFyaWFibGVzIC0tPgotICAgIDxlbGVtZW50IG5hbWU9Ik91dGVyVGVzdEludDEiIHR5cGU9InhzZDppbnQiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iT3V0ZXJUZXN0SW50MiIgdHlwZT0ieHNkOmludCIvPgotCi0gICAgPCEtLSB0ZXN0IHhzZDphbnkgdmFyaWFibGVzIC0tPgotICAgIDxlbGVtZW50IG5hbWU9Ik91dGVyVGVzdEFueVR5cGUxIiB0eXBlPSJ4c2Q6YW55VHlwZSIgbmlsbGFibGU9InRydWUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJPdXRlclRlc3RBbnlUeXBlMiIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLQotICAgIDwhLS0gdGVzdCB4c2Q6YW55IHZhcmlhYmxlcyAtLT4KLSAgICA8ZWxlbWVudCBuYW1lPSJPdXRlclRlc3RCb29rSW5mb3JtYXRpb24xIiB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgIDxlbGVtZW50IG5hbWU9Ik91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjIiIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLQotICAgIDwhLS0gY29tcGxleHQgZWxlbWVudHMgLS0+Ci0gICAgPGVsZW1lbnQgbmFtZT0iT3V0ZXJUZXN0Q29tcGxleDEiIG5pbGxhYmxlPSJ0cnVlIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRlc3RWYWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iT3V0ZXJUZXN0Q29tcGxleDIiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLQotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJCb29rSW5mb3JtYXRpb24iPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhdXRob3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGl0bGUiIHR5cGU9InN0cmluZyIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlzYm4iIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvPgotICAgIDwvY29tcGxleFR5cGU+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY29tcGxleEV4dGVuc2lvbi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvY29tcGxleEV4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTEyMjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2NvbXBsZXhFeHRlbnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2NvbXBsZXhleHRlbnNpb24iCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2NvbXBsZXhleHRlbnNpb24iPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBhcmVudFR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InBhcmFtMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2hpbGRUeXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6UGFyZW50VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdENoaWxkRWxlbWVudCIgdHlwZT0idG5zOkNoaWxkVHlwZSIvPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZGVjaW1hbC54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZGVjaW1hbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzlhOTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2RlY2ltYWwueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvYm9vbGVhbjEiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2Jvb2xlYW4xIj4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZkRlY2ltYWwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlY2ltYWwiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRIaXN0b3JpY05hdlJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiBuYW1lPSJvdXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6QXJyYXlPZkRlY2ltYWwiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9kZWZhdWx0X25hbWVzcGFjZXMueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2RlZmF1bHRfbmFtZXNwYWNlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTQzMGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2RlZmF1bHRfbmFtZXNwYWNlcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICAgIDwhLS0gZXh0ZW5zaW9uIGNsYXNzIC0tPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXN0U2ltcGxlVW5pb24iPgotICAgICAgICA8eHNkOnVuaW9uIG1lbWJlclR5cGVzPSJ4c2Q6Ym9vbGVhbiB4c2Q6UU5hbWUiLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0RWxlbWVudDEiIHR5cGU9InRuczpUZXN0UGFyZW50VHlwZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdFBhcmVudFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOlFOYW1lIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdENoaWxkVHlwZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6VGVzdFBhcmVudFR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTMiIHR5cGU9InhzZDpRTmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW00IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTUiIHR5cGU9InRuczpUZXN0U2ltcGxlVW5pb24iLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMiIgdHlwZT0ieHNkOlFOYW1lIi8+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9kZWZhdWx0X3ZhbHVlLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9kZWZhdWx0X3ZhbHVlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5YTU0Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZGVmYXVsdF92YWx1ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvYm9vbGVhbjEiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2Jvb2xlYW4xIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MSIgdHlwZT0ieHM6aW50IiBkZWZhdWx0PSI1NiIvPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MiIgPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9InRlc3QiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZTEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZWxlbWVudF9yZWZlcmVuY2VzLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbGVtZW50X3JlZmVyZW5jZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjlkZjAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbGVtZW50X3JlZmVyZW5jZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuYW1lcmljYW5leHByZXNzLmNvbS93c2RsL2N0bi91dGlsaXRpZXMvYXRiIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly93d3cuYW1lcmljYW5leHByZXNzLmNvbS93c2RsL2N0bi91dGlsaXRpZXMvYXRiIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmFtZXJpY2FuZXhwcmVzcy5jb20vc2NoZW1hcy9jdG4vdXRpbGl0aWVzL2F0YiIvPgotCi0gICAgPGVsZW1lbnQgbmFtZT0iY2hlY2tFbGlnaWJpbGl0eTEiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0bnM6YXRiLXJlcXVlc3QtY2hlY2stZWxpZ2liaWxpdHkiLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotICAgIDxlbGVtZW50IG5hbWU9ImNoZWNrRWxpZ2liaWxpdHkyIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idG5zOmF0Yi1yZXF1ZXN0LWNoZWNrLWVsaWdpYmlsaXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iNSIvPgotICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICA8L2VsZW1lbnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iYXRiLXJlcXVlc3QtY2hlY2stZWxpZ2liaWxpdHkiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYXJkTnVtYmVyIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVBc09uQ2FyZCIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJleHBpcmF0aW9uRGF0ZSIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ5ZWFyT2ZSZWRlbXB0aW9uIiB0eXBlPSJpbnQiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsaWVudElkIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPC9lbGVtZW50PgotCi0gICAgPCEtLSBjaXJjdWxhciBlbGVtZW50IHJlZmVyZW5jZXMgLS0+Ci0gICAgPGVsZW1lbnQgbmFtZT0iRWxlbWVudDEiIHR5cGU9InRuczpDb21wbGV4VHlwZTEiLz4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iQ29tcGxleFR5cGUxIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ0bnM6RWxlbWVudDEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGVsZW1lbnQgbmFtZT0iRWxlbWVudDIiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9InRuczpFbGVtZW50MiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLQotICAgIDxlbGVtZW50IG5hbWU9ImF1dGhJbmZvIiA+Ci0JCTxzaW1wbGVUeXBlPgotCQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyIvPgotCQk8L3NpbXBsZVR5cGU+Ci0JPC9lbGVtZW50PgotCi0gICAgPGNvbXBsZXhUeXBlIG5hbWU9ImRpc2NhcmRfdHJhbnNmZXJUb2tlbiI+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IHJlZj0idG5zOmF1dGhJbmZvIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ic3RyaW5nIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQotICAgIDxlbGVtZW50IG5hbWU9IlRlc3RTaW1wbGVSZWZlcmVuY2UiIHR5cGU9InRuczpkaXNjYXJkX3RyYW5zZmVyVG9rZW4iLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbnVtZXJhdGlvbi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvZW51bWVyYXRpb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE2NTY1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9lbnVtZXJhdGlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iCi0gICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIj4KLSAgICA8czplbGVtZW50IG5hbWU9IkNvdW50UGxhY2VzSW5SZWN0Ij4KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ1cHBlcmxlZnQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ibG93ZXJyaWdodCIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJwdHlwZSIgdHlwZT0idG5zOlBsYWNlVHlwZSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgPC9zOmVsZW1lbnQ+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJQbGFjZVR5cGUiPgotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOnN0cmluZyI+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iVW5rbm93blBsYWNlVHlwZSIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IkFpclJhaWxTdGF0aW9uIi8+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iQmF5R3VsZiIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IkNhcGVQZW5pbnN1bGEiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJDaXR5VG93biIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IkhpbGxNb3VudGFpbiIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9IklzbGFuZCIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9Ikxha2UiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJPdGhlckxhbmRGZWF0dXJlIi8+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iT3RoZXJXYXRlckZlYXR1cmUiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJQYXJrQmVhY2giLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJQb2ludE9mSW50ZXJlc3QiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJSaXZlciIvPgotICAgICAgICA8L3M6cmVzdHJpY3Rpb24+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci08L3M6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2V4dGVuc2lvbnMueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2V4dGVuc2lvbnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjljZmEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9leHRlbnNpb25zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0ib3JnLmFwYWNoZS5heGlzMi50ZXN0IgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Im9yZy5hcGFjaGUuYXhpczIudGVzdCI+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idHlwZSI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImZpcnN0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im1pZGRsZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsYXN0IiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbQS1aXSoiPjwveHM6cGF0dGVybj4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYmFzZVR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iczEiPjwveHM6ZW51bWVyYXRpb24+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InMyIj48L3hzOmVudW1lcmF0aW9uPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJzMyI+PC94czplbnVtZXJhdGlvbj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iczQiPjwveHM6ZW51bWVyYXRpb24+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9ImZ1bGxOYW1lIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZ3VhZ2UiIHR5cGU9InhzOmxhbmd1YWdlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0idG5zOmJhc2VUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMiIgdHlwZT0idG5zOnNpbXBsZVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkV4dGVuZGVkQ29tcGxleFR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InRuczp0eXBlIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InBhcmVudEVsZW1lbnQxIiB0eXBlPSJ4czpzdHJpbmciPjwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyZW50RWxlbWVudDIiIHR5cGU9InhzOnN0cmluZyI+PC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RDb21wbGV4RWxlbWVudCIgdHlwZT0idG5zOkV4dGVuZGVkQ29tcGxleFR5cGUiPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQMmFwaUFnUGF0QXBwdCI+Ci0gICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOlAyYXBpRGF0YVJwdEdycCI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFHX01BWF9BUFBUX0RFVExfUk9XIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcHB0THN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQMmFwaURhdGFScHRHcnAiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNPUlRfQVNDRU5ESU5HIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic09SVF9ERVNDRU5ESU5HIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU09SVF9BU0NFTkRJTkciIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTT1JUX0RFU0NFTkRJTkciIHR5cGU9InhzOmludCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgCi0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9ncm91cHMueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2dyb3Vwcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMWZhNmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2dyb3Vwcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJvcmcuYXBhY2hlLmF4aXMyLnRlc3QuZ3JvdXAiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0Lmdyb3VwIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RTZXF1ZW5jZUdyb3VwRWxlbWVudCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4czpncm91cCByZWY9InRuczpUZXN0U2VxdWVuY2VHcm91cCIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmdyb3VwIG5hbWU9IlRlc3RTZXF1ZW5jZUdyb3VwIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VQYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VQYXJhbTIiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Z3JvdXA+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdENob2ljZUdyb3VwRWxlbWVudCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6VGVzdENob2ljZUdyb3VwIi8+Ci0gICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmdyb3VwIG5hbWU9IlRlc3RDaG9pY2VHcm91cCI+Ci0gICAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2VQYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlUGFyYW0yIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgPC94czpncm91cD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0U2VxdWVuY2VOZXN0ZWRHcm91cEVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6VGVzdFNlcXVlbmNlTmVzdGVkR3JvdXAiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czpncm91cCBuYW1lPSJUZXN0U2VxdWVuY2VOZXN0ZWRHcm91cCI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im5lc3RlZFNlcXVlbmNlUGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4czpncm91cCByZWY9InRuczpUZXN0U2VxdWVuY2VHcm91cCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Z3JvdXA+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6VGVzdENob2ljZU5lc3RlZEdyb3VwIi8+Ci0gICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmdyb3VwIG5hbWU9IlRlc3RDaG9pY2VOZXN0ZWRHcm91cCI+Ci0gICAgICAgIDx4czpjaG9pY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJuZXN0ZWRDaG9pY2VQYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmdyb3VwIHJlZj0idG5zOlRlc3RDaG9pY2VHcm91cCIvPgotICAgICAgICA8L3hzOmNob2ljZT4KLSAgICA8L3hzOmdyb3VwPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6VGVzdEF0dHJpYnV0ZUdyb3VwIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iVGVzdEF0dHJpYnV0ZUdyb3VwIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUxIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6VGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iVGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUyIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOlRlc3RBdHRyaWJ1dGVHcm91cCIgLz4KLSAgICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTEyYWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2lubmVyUGFydGljbGVFeHRlbnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9pbm5lcnBhcnRpY2FsZXh0ZW5zaW9uIgotICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2lubmVycGFydGljYWxleHRlbnNpb24iPgotCi0gICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iUGFyZW50VHlwZSI+Ci0gICAgICAgIDxzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgIDwvczpjaG9pY2U+Ci0gICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdEVsZW1lbnQiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iQ2hpbGRFbGVtZW50IiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZXh0ZW5zaW9uIGJhc2U9InRuczpQYXJlbnRUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9InRlc3RBdHRyaWJ1dGUiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvczpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgPC9zOmVsZW1lbnQ+Ci08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lclBhcnRpY2xlcy54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJQYXJ0aWNsZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE2MmI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lclBhcnRpY2xlcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9teW5hbWVzcGFjZS5jb20vdGVzdGlubmVycGFydGljbGUiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6dGVzdDE9Imh0dHA6Ly9teW5hbWVzcGFjZS5jb20vdGVzdGlubmVycGFydGljbGUiCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdElubmVyUGFydGljbGUxIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0SW5uZXJQYXJ0aWNsZTIiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW00IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdElubmVyUGFydGljbGUzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdElubmVyUGFydGljbGU0Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW00IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlc3RJbm5lclBhcnRpY2xlNSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtNiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uIiB0eXBlPSJ0ZXN0MTpUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZSIvPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRlc3QxOlRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvblBhcmVudENvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJhbTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJQYXJhbTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdENvbXBsZXhUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCByZWY9InRlc3QxOlRlc3RFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0SW5uZXJFbGVtZW50IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPC94c2Q6ZWxlbWVudD4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0Q29tcGxleFR5cGVFbGVtZW50IiB0eXBlPSJ0ZXN0MTpUZXN0Q29tcGxleFR5cGUiLz4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lcnNlcXVlbmNlX2Nob2ljZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvaW5uZXJzZXF1ZW5jZV9jaG9pY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGQzYzUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9pbm5lcnNlcXVlbmNlX2Nob2ljZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Im9yZy5hcGFjaGUuYXhpczIudGVzdCIKLSAgICAgICAgeG1sbnM6dGVzdDE9Im9yZy5hcGFjaGUuYXhpczIudGVzdCIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuYXBhY2hlLmF4aXMyLnRlc3QiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdElubmVyU2VxdWVuY2UxIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UyIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8eHM6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2UxIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RJbm5lclNlcXVlbmNlMiI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMSIgdHlwZT0ieHM6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaG9pY2UyIiB0eXBlPSJ4czppbnQiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RJbm5lclNlcXVlbmNlMyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlcXVlbmNlMiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPHhzOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMSIgdHlwZT0ieHM6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hvaWNlMiIgdHlwZT0ieHM6aW50IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvbGlzdC54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvbGlzdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjM4NWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL2xpc3QueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJvcmcuYXBhY2hlLmF4aXMyLnRlc3QiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0Ij4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IlRlc3RMaXN0UU5hbWUiPgotICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6UU5hbWUiPjwveHM6bGlzdD4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0TGlzdFFOYW1lRWxlbWVudCIgdHlwZT0idG5zOlRlc3RMaXN0UU5hbWUiLz4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IlRlc3RMaXN0U3RyaW5nIj4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyI+PC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RMaXN0U3RyaW5nRWxlbWVudCIgdHlwZT0idG5zOlRlc3RMaXN0U3RyaW5nIi8+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0U3RyaW5nIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6cGF0dGVybiB2YWx1ZT0iW0Etel0qIj48L3hzOnBhdHRlcm4+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iVGVzdExpc3RPdXJzIj4KLSAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InRuczpUZXN0U3RyaW5nIi8+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iVGVzdExpc3RPdXJzRWxlbWVudCIgdHlwZT0idG5zOlRlc3RMaXN0T3VycyIvPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iU3VwZXJUZXN0TGlzdFN0cmluZyI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ0bnM6VGVzdExpc3RTdHJpbmciLz4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0TGlzdEludCI+Ci0gICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czppbnQiPjwveHM6bGlzdD4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCIgdHlwZT0idG5zOlN1cGVyVGVzdExpc3RTdHJpbmciLz4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IklubmVyTGlzdFNpbXBsZVR5cGUiPgotICAgICAgICA8eHM6bGlzdD4KLSAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkV4aXN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQWNjZXNzIi8+Ci0gICAgICAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgPC94czpsaXN0PgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RJbm5lckxpc3RTaW1wbGVUeXBlIiB0eXBlPSJ0bnM6SW5uZXJMaXN0U2ltcGxlVHlwZSIvPgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvcGFydGljYWxNYXhPY2N1cmVzLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9wYXJ0aWNhbE1heE9jY3VyZXMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIwNTU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9wYXJ0aWNhbE1heE9jY3VyZXMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbXluYW1lc3BhY2UuY29tL3Rlc3RwYXJ0aWNsZW1heG9jY3VycyIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9teW5hbWVzcGFjZS5jb20vdGVzdHBhcnRpY2xlbWF4b2NjdXJzIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgIHZlcnNpb249IjEuMCI+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMiIHR5cGU9InRuczpUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFybTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJtMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczEiIHR5cGU9InRuczpUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMiIgdHlwZT0idG5zOlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTIiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InBhcm0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icGFybTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMyIgdHlwZT0idG5zOlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTMiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icGFybTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuaWxsYWJsZT0idHJ1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczQiIHR5cGU9InRuczpUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuaWxsYWJsZT0idHJ1ZSIgbmFtZT0icGFybTEiIHR5cGU9InRuczpUZXN0Q3VzdG9tVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5pbGxhYmxlPSJ0cnVlIiBuYW1lPSJwYXJtMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5pbGxhYmxlPSJ0cnVlIiBuYW1lPSJwYXJtMyIgdHlwZT0idG5zOlRlc3RDdXN0b21UeXBlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUiIHR5cGU9InRuczpUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icGFybTEiIHR5cGU9InRuczpUZXN0Q3VzdG9tVHlwZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5pbGxhYmxlPSJ0cnVlIiBuYW1lPSJwYXJtMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwYXJtMyIgdHlwZT0idG5zOlRlc3RDdXN0b21UeXBlIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczYiIHR5cGU9InRuczpUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBuYW1lPSJhdHRyaWJ1dGUxIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIG5hbWU9ImF0dHJpYnV0ZTIiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzIiB0eXBlPSJ0bnM6VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcm0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFybTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMxIiB0eXBlPSJ0bnM6VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTEiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxIj4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFybTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJtMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIiIHR5cGU9InRuczpUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTIiPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwYXJtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMyIgdHlwZT0idG5zOlRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMyI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5pbGxhYmxlPSJ0cnVlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icGFybTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuaWxsYWJsZT0idHJ1ZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCIgdHlwZT0idG5zOlRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Ii8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNCI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5pbGxhYmxlPSJ0cnVlIiBuYW1lPSJwYXJtMSIgdHlwZT0idG5zOlRlc3RDdXN0b21UeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmlsbGFibGU9InRydWUiIG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmlsbGFibGU9InRydWUiIG5hbWU9InBhcm0zIiB0eXBlPSJ0bnM6VGVzdEN1c3RvbVR5cGUiLz4KLSAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM1IiB0eXBlPSJ0bnM6VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Ij4KLSAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InBhcm0xIiB0eXBlPSJ0bnM6VGVzdEN1c3RvbVR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuaWxsYWJsZT0idHJ1ZSIgbmFtZT0icGFybTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icGFybTMiIHR5cGU9InRuczpUZXN0Q3VzdG9tVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IlRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczYiIHR5cGU9InRuczpUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNiIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTYiPgotICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcm0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgbmFtZT0iYXR0cmlidXRlMSIvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBuYW1lPSJhdHRyaWJ1dGUyIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0Q3VzdG9tVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmlsbGFibGU9InRydWUiIG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwYXJhbTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhcmFtMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3JhbXBhcnQueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3JhbXBhcnQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFhZjIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9yYW1wYXJ0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIj4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHM6bWluTGVuZ3RoIHZhbHVlPSIzIi8+Ci0gICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBlY3RlZENvbnRlbnRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0gICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgotICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIvPgotICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiPgotICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0ieG1pbWU6Y29udGVudFR5cGUiLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0RXh0ZW5zaW9uIiB0eXBlPSJ4bWltZTpiYXNlNjRCaW5hcnkiLz4KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvcmVzdHJpY3Rpb25zLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9yZXN0cmljdGlvbnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDdlNjJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS9yZXN0cmljdGlvbnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzZDpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvIgotICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vZ29vZ2xlLmNvbSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iQ2hpbGRTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFyZW50U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0idG5zOkNoaWxkU2ltcGxlVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXN0U2ltcGxlQXR0cmlidXRlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmliMSIgdHlwZT0idG5zOlBhcmVudFNpbXBsZVR5cGUiIHVzZT0icmVxdWlyZWQiPjwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmliMiIgdHlwZT0idG5zOlBhcmVudFNpbXBsZVR5cGUiIHVzZT0ib3B0aW9uYWwiPjwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphbGw+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVzdEVsZW1lbnQxIiB0eXBlPSJ4c2Q6UU5hbWUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZXN0RWxlbWVudDIiIHR5cGU9InhzZDpRTmFtZSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlc3RFbGVtZW50MyIgdHlwZT0ieHNkOlFOYW1lIi8+Ci0gICAgICAgIDwveHNkOmFsbD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCIgdHlwZT0idG5zOlRlc3RTaW1wbGVBdHRyaWJ1dGUiLz4KLQotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik5vcm1hbFNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpRTmFtZSIvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bWVyYXRpb25TaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibnMxOnRlc3QxIi8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuczE6dGVzdDIiLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5zMTp0ZXN0MyIvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhcmVudE5vcm1hbFNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2UgPSAidG5zOk5vcm1hbFNpbXBsZVR5cGUiLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlBhcmVudEVudW1lcmF0aW9uU2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0idG5zOkVudW1lcmF0aW9uU2ltcGxlVHlwZSIvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQiIHR5cGU9InRuczpQYXJlbnROb3JtYWxTaW1wbGVUeXBlIi8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9IkVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQiIHR5cGU9InRuczpQYXJlbnRFbnVtZXJhdGlvblNpbXBsZVR5cGUiLz4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzZVJlc3RyaWN0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZVR5cGVFbGVtZW50MSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZVR5cGVFbGVtZW50MiIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQYXJlbnRSZXN0cmljdGlvblR5cGUiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ0bnM6QmFzZVJlc3RyaWN0aW9uVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2VUeXBlRWxlbWVudDEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2VUeXBlRWxlbWVudDIiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQiIHR5cGU9InRuczpQYXJlbnRSZXN0cmljdGlvblR5cGUiLz4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcnJvckNvZGVUeXBlIj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCTx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzMCIvPgotCQkJPHhzZDptaW5MZW5ndGggdmFsdWU9IjEiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJUZXN0U2ltcGxlVHlwZVJlc3RyaWN0aW9uUGF0dGVybiI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlxkezR9KCgtXGR7Mn0pezAsMX0tXGR7Mn0pezAsMX0iPjwveHNkOnBhdHRlcm4+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJSRkNQcm9iYWJpbGl0eUNvZGVUeXBlMSI+Ci0gICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpkb3VibGUiPgotICAgICAgICAgICAgICAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IjEuNSIvPgotICAgICAgICAgICAgICAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9IjAuMSIvPgotICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9IlJGQ1Byb2JhYmlsaXR5Q29kZVR5cGUyIj4KLSAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOmxvbmciPgotICAgICAgICAgICAgICAgICAgIDx4czptYXhFeGNsdXNpdmUgdmFsdWU9IjUiLz4KLSAgICAgICAgICAgICAgICAgICA8eHM6bWluRXhjbHVzaXZlIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUkZDUHJvYmFiaWxpdHlDb2RlVHlwZTMiPgotICAgICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6aW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgICAgPHhzOm1heEV4Y2x1c2l2ZSB2YWx1ZT0iNSIvPgotICAgICAgICAgICAgICAgICAgIDx4czptaW5FeGNsdXNpdmUgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcnNvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZ2UiIHR5cGU9InhzZDppbnQiPjwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGFpckNvbG9yIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibGFjayI+PC94c2Q6ZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJicm93biI+PC94c2Q6ZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJibG9uZGUiPjwveHNkOmVudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZ3JheSI+PC94c2Q6ZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpcnRoRGF0ZSIgdHlwZT0ieHNkOmRhdGUiPjwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgdHlwZT0idG5zOkFkZHJlc3MiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj48L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpbmUxIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxpbmUyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtYXhPY2N1cnM9IjEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InppcCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbQS1aXSI+PC94c2Q6cGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9IlBlcnNvbkVsZW1lbnQiIHR5cGU9InRuczpQZXJzb24iLz4KLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTTVNFbGVtZW50Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkVuZERhdGUiIHR5cGU9InRuczpXU1R5cGVEYXRlIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTTVNfUHJvdmlkZXIiIHR5cGU9InRuczpXU1R5cGVDaGFyMyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iTXVsdGlwbGVSZXN0cmljdGlvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJTdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iQmFzZTY0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV1NUeXBlRGF0ZSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGUiPgotICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSdbMC05XXs0fS1bMC05XXsyfS1bMC05XXsyfScvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldTVHlwZUNoYXIzIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6bWF4TGVuZ3RoIHZhbHVlPSIzIi8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iR2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50IiB0eXBlPSJ0bnM6Z2V0RXhlbXBsYXJSZXNwb25zZVR5cGUiLz4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmFueVR5cGUiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGVtcGxhciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6UmVzcG9uc2VBdHRyaWJ1dGVHcm91cCIvPgotICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN1cHBvcnRlZE1ldGhvZHMiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLSAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmF0dHJpYnV0ZUdyb3VwIG5hbWU9IlJlc3BvbnNlQXR0cmlidXRlR3JvdXAiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXNwb25zZUNvZGUiIHR5cGU9InhzZDppbnRlZ2VyIiB1c2U9Im9wdGlvbmFsIiBkZWZhdWx0PSIwIi8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3BvbnNlTWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotICAgIDwveHNkOmF0dHJpYnV0ZUdyb3VwPgotCi08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3NvYXBlbmNvZGluZy54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvc29hcGVuY29kaW5nLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NGQ1Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvc29hcGVuY29kaW5nLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy9zb2FwZW5jb2RpbmciCi0gICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvc29hcGVuY29kaW5nIj4KLQotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdFNvYXBFbGVtZW50MSIgdHlwZT0ic29hcGVuYzpBcnJheSIvPgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdFNvYXBFbGVtZW50MiI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InNvYXBlbmM6QXJyYXkiLz4KLSAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczplbGVtZW50PgotICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IlRlc3RDb21wbGV4VHlwZSI+Ci0gICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0iczppbnQiLz4KLSAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgIDwvczpjb21wbGV4VHlwZT4KLQotPC9zOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvdGVzdGF0dHJpYnV0ZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvdGVzdGF0dHJpYnV0ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDg2MjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3Rlc3RhdHRyaWJ1dGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2F0dHJpYnV0ZSIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvYXR0cmlidXRlIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MiI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6aW50IiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50MyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RFbGVtZW50NCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlMSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUxIj4KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IlRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50IiB0eXBlPSJ0bnM6VGVzdEF0dHJpYnV0ZVJlZmVyZW5jZVR5cGUiLz4KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9IlRlc3RBdHRyaWJ1dGUxIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVGVzdEF0dHJpYnV0ZVJlZmVyZW5jZVR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSB1c2U9Im9wdGlvbmFsIiByZWY9InRuczpUZXN0QXR0cmlidXRlMSIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6YXR0cmlidXRlIG5hbWU9IlR5cGUiPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJTdHJpbmd8QmFzZTY0Ii8+Ci0gICAgICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czphdHRyaWJ1dGU+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJUZXN0VHlwZUVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOlR5cGUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS91bmlvbi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy90ZXN0c3VpdGUvdW5pb24ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM4NWEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS91bmlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvdW5pb24iCi0gICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvdW5pb24iPgotICAgIDxzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi8+Ci0KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IkZvb0VudW0iPgotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOmFueVVSSSI+Ci0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iaHR0cDovL0EiLz4KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJodHRwOi8vQiIvPgotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9Imh0dHA6Ly9DIi8+Ci0gICAgICAgIDwvczpyZXN0cmljdGlvbj4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IkZvb09wZW5FbnVtIj4KLSAgICAgICAgPHM6dW5pb24gbWVtYmVyVHlwZXM9InMwOkZvb0VudW0gczphbnlVUkkiLz4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IkRhdGVPckRhdGVUaW1lVHlwZSI+Ci0gICAgICAgIDxzOnVuaW9uIG1lbWJlclR5cGVzPSJzOmJvb2xlYW4gczppbnQgczpkYXRlIHM6ZGF0ZVRpbWUiLz4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czplbGVtZW50IG5hbWU9IlJlY29yZDEiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWxlbTEiIHR5cGU9InMwOkZvb09wZW5FbnVtIi8+Ci0gICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICA8L3M6ZWxlbWVudD4KLSAgICA8czplbGVtZW50IG5hbWU9IlJlY29yZDIiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWxlbTEiIHR5cGU9InMwOkRhdGVPckRhdGVUaW1lVHlwZSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgPC9zOmVsZW1lbnQ+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJVbmlvblFOYW1lVGVzdCI+Ci0gICAgICAgIDxzOnVuaW9uIG1lbWJlclR5cGVzPSJzOlFOYW1lIHM6c3RyaW5nIi8+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci0gICAgPHM6ZWxlbWVudCBuYW1lPSJVbmlvblFOYW1lVGVzdEVsZW1lbnQiIHR5cGU9InMwOlVuaW9uUU5hbWVUZXN0Ii8+Ci0KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iUGFja2luZ1R5cGVfVCI+Ci0gICAgICAgIDx4c2Q6dW5pb24+Ci0gICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJNSU5PUl8oW2Etel18W0EtWl18WzAtOV18KF98LSkpKiIvPgotICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlBST1BfKFthLXpdfFtBLVpdfFswLTldfChffC0pKSoiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9fUEFDS0lORyIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaSVAiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFSIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICA8L3hzZDp1bmlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJUZXN0SW5uZXJVbmlvblR5cGUiIHR5cGU9InMwOlBhY2tpbmdUeXBlX1QiLz4KLQotCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3Rlc3RzdWl0ZS91bmlvbjIueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3VuaW9uMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjdiMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMvdGVzdHN1aXRlL3VuaW9uMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL3VuaW9uMiIKLSAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy91bmlvbjIiPgotCi0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0VW5pb24xIj4KLSAgICAgICAgPHM6dW5pb24gbWVtYmVyVHlwZXM9InM6c3RyaW5nIHM6Ym9vbGVhbiB0bnM6VGVzdFJlc3RyaWN0aW9uIi8+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJUZXN0UmVzdHJpY3Rpb24iPgotICAgICAgICA8czpyZXN0cmljdGlvbiBiYXNlPSJzOnN0cmluZyI+Ci0gICAgICAgIDwvczpyZXN0cmljdGlvbj4KLSAgICA8L3M6c2ltcGxlVHlwZT4KLSAgICA8czplbGVtZW50IG5hbWU9IlRlc3RVbmlvbkVsZW1lbnQxIiB0eXBlPSJ0bnM6VGVzdFVuaW9uMSIvPgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdFVuaW9uRWxlbWVudDIiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ0bnM6VGVzdFVuaW9uMSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZTEiIHR5cGU9InRuczpUZXN0VW5pb24xIi8+Ci0gICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICA8L3M6ZWxlbWVudD4KLSAgICA8czpzaW1wbGVUeXBlIG5hbWU9IlRlc3RMaXN0MSI+Ci0gICAgICAgIDxzOmxpc3QgaXRlbVR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9zOnNpbXBsZVR5cGU+Ci0gICAgPHM6ZWxlbWVudCBuYW1lPSJUZXN0TGlzdEVsZW1lbnQxIj4KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0idG5zOlRlc3RMaXN0MSIvPgotICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZTEiIHR5cGU9InRuczpUZXN0TGlzdDEiLz4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczplbGVtZW50PgotICAgIDxzOmVsZW1lbnQgbmFtZT0iVGVzdEZ1enp5RGF0ZVR5cGUiIHR5cGU9InRuczpmdXp6eURhdGVUeXBlIi8+Ci0gICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJmdXp6eURhdGVUeXBlIj4KLSAgICAgICAgPHM6dW5pb24gbWVtYmVyVHlwZXM9InM6ZGF0ZSBzOmRhdGVUaW1lIHM6Z1llYXIgczpnWWVhck1vbnRoIj4KLSAgICAgICAgPC9zOnVuaW9uPgotICAgIDwvczpzaW1wbGVUeXBlPgotCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJUZXN0RWxlbWVudCI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImNyZWF0aW9uRGF0ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iQ3JlYXRpb25EYXRlIiB0eXBlPSJzOnN0cmluZyIvPiAKLSAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczplbGVtZW50PgotCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9hbm9ueW1vdXNfY29tcGxleFR5cGUueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Fub255bW91c19jb21wbGV4VHlwZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjQ3ZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Fub255bW91c19jb21wbGV4VHlwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcxL3R5cGVzIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcxL3R5cGVzIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGVsZW1lbnQgbmFtZT0idGVtcEVsdCI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgIDwvZWxlbWVudD4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9jb21wbGV4LW1pbm9jY3VyczAueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXgtbWlub2NjdXJzMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNGMwMGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXgtbWlub2NjdXJzMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0MS5vcmciCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3Rlc3QxLm9yZyI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icm9vdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJzb24iIHR5cGU9InRuczpwZXJzb25UeXBlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiB0eXBlPSJ0bnM6YWRkcmVzc1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJwZXJzb25UeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhZ2UiIHR5cGU9InhzOmludCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZHJlc3NUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RyZWV0TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJlZXRObyIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXhfYWxsLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9jb21wbGV4X2FsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjM3ZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXhfYWxsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuc3RyaWtlaXJvbi5jb20iIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzMD0iaHR0cDovL3d3dy5zdHJpa2Vpcm9uLmNvbSI+Ci0gICAgICA8czplbGVtZW50IG5hbWU9IkdldFF1b3RlcyI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iVGlja2VyU3ltYm9sTGlzdCIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0KLSAgICAgIDwvczplbGVtZW50PgotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRRdW90ZXNSZXNwb25zZSI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0UXVvdGVzUmVzdWx0IiB0eXBlPSJzMDpBcnJheU9mUmVhbFF1b3RlIiAvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mUmVhbFF1b3RlIj4KLQotICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9IlJlYWxRdW90ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InMwOlJlYWxRdW90ZSIgLz4KLSAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iUmVhbFF1b3RlIj4KLSAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iU3ltYm9sIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJDVVNJUCIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQ0lLIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJOYW1lIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJEYXRlIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJUaW1lIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJMYXN0IiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJRdWFudGl0eSIgdHlwZT0iczppbnQiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iQ2hhbmdlRnJvbVByZXZpb3VzIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJQZXJjZW50Q2hhbmdlRnJvbVByZXZpb3VzIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJPcGVuIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJDaGFuZ2VGcm9tT3BlbiIgdHlwZT0iczpkb3VibGUiIC8+Ci0KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJQZXJjZW50Q2hhbmdlRnJvbU9wZW4iIHR5cGU9InM6ZG91YmxlIiAvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJpZCIgdHlwZT0iczpkb3VibGUiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iQXNrIiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJTcHJlYWQiIHR5cGU9InM6ZG91YmxlIiAvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJpZFF1YW50aXR5IiB0eXBlPSJzOmludCIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJBc2tRdWFudGl0eSIgdHlwZT0iczppbnQiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iVm9sdW1lIiB0eXBlPSJzOmludCIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJFQ05Wb2x1bWUiIHR5cGU9InM6aW50IiAvPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkhpZ2hlc3QiIHR5cGU9InM6ZG91YmxlIiAvPgotCi0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iTG93ZXN0IiB0eXBlPSJzOmRvdWJsZSIgLz4KLSAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJSYW5rIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJSZXNwb25zZUluZm8iIHR5cGU9InMwOlJlc3BvbnNlSW5mbyIgLz4KLSAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IlJlc3BvbnNlSW5mbyI+Ci0gICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IlJlc3BvbnNlQ29kZSIgdHlwZT0iczppbnQiIC8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iUmVzcG9uc2UiIHR5cGU9InM6c3RyaW5nIiAvPgotCi0gICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0T25lUXVvdGUiPgotICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IlRpY2tlclN5bWJvbCIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICA8L3M6ZWxlbWVudD4KLQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRPbmVRdW90ZVJlc3BvbnNlIj4KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRPbmVRdW90ZVJlc3VsdCIgdHlwZT0iczA6UmVhbFF1b3RlIiAvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgPC9zOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvY29tcGxleF9jb250ZW50X2V4dGVuc2lvbi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvY29tcGxleF9jb250ZW50X2V4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTYyZWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2NvbXBsZXhfY29udGVudF9leHRlbnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0idXJuOnNvYmplY3QuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOnNvYmplY3QuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJzT2JqZWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmllbGRzVG9OdWxsIiAgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudCI+Ci0gICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0idG5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudE51bWJlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY3RpdmVfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW5udWFsUmV2ZW51ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nQ2l0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nQ291bnRyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nUG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nU3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50IiB0eXBlPSJ0bnM6QWNjb3VudCIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Rlcml2ZWQvZGVyaXZlZFR5cGUtQWxsLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9kZXJpdmVkL2Rlcml2ZWRUeXBlLUFsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDk4MjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2Rlcml2ZWQvZGVyaXZlZFR5cGUtQWxsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRQb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzOnBvc2l0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROZWdhdGl2ZUludGVnZXIiIHR5cGU9InhzOm5lZ2F0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROb25OZWdhdGl2ZUludGVnZXIiIHR5cGU9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzOm5vblBvc2l0aXZlSW50ZWdlciIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRVbnNpZ25lZFNob3J0IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0Ii8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFVuc2lnbmVkTG9uZyIgdHlwZT0ieHM6dW5zaWduZWRMb25nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFVuc2lnbmVkSW50IiB0eXBlPSJ4czp1bnNpZ25lZEludCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRVbnNpZ25lZEJ5dGUiIHR5cGU9InhzOnVuc2lnbmVkQnl0ZSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRMb25nIiB0eXBlPSJ4czpsb25nIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFNob3J0IiB0eXBlPSJ4czpzaG9ydCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRJbnQiIHR5cGU9InhzOmludCIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRCeXRlIiB0eXBlPSJ4czpieXRlIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZFRva2VuIiB0eXBlPSJ4czp0b2tlbiIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRMYW5ndWFnZSIgdHlwZT0ieHM6bGFuZ3VhZ2UiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTk1UT0tFTiIgdHlwZT0ieHM6Tk1UT0tFTiIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROTVRPS0VOUyIgdHlwZT0ieHM6Tk1UT0tFTlMiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkSUQiIHR5cGU9InhzOklEIi8+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iRGVyaXZlZElEUmVmIiB0eXBlPSJ4czpJRFJFRiIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRFbnRpdHkiIHR5cGU9InhzOkVOVElUWSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRFbnRpdGllcyIgdHlwZT0ieHM6RU5USVRJRVMiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTmFtZSIgdHlwZT0ieHM6TmFtZSIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWROYW1lVG9rZW4iIHR5cGU9InhzOk5NVE9LRU4iLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTkNOYW1lIiB0eXBlPSJ4czpOQ05hbWUiLz4KLQk8eHM6ZWxlbWVudCBuYW1lPSJEZXJpdmVkTm9ybWFsaXplZFN0cmluZyIgdHlwZT0ieHM6bm9ybWFsaXplZFN0cmluZyIvPgotCTx4czplbGVtZW50IG5hbWU9IkRlcml2ZWRJbnRlZ2VyIiB0eXBlPSJ4czppbnRlZ2VyIi8+Ci0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2ltcG9ydC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDI2YjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL2ltcG9ydC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zOnhzZDI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiIHNjaGVtYUxvY2F0aW9uPSJpbXBvcnQyLnhzZCI+PC9pbXBvcnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QyOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQyLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4YTA4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvaW1wb3J0Mi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPGFsbD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvYWxsPgotICAgIDwvY29tcGxleFR5cGU+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2QvbWl4ZWRfbWlub2NjdXMwLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9taXhlZF9taW5vY2N1czAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM4YTUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9taXhlZF9taW5vY2N1czAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vcmVjdXJzaW9uMS5vcmciCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3JlY3Vyc2lvbjEub3JnIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZ0xpc3RSZXNwb25zZUVsZW1lbnQiIHR5cGU9InRuczpTdHJpbmdMaXN0UmVzcG9uc2VUeXBlIi8+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdMaXN0UmVzcG9uc2VUeXBlIj4KLSAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nTGlzdCIgdHlwZT0idG5zOlN0cmluZ0xpc3QiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNlcHRpb24iIHR5cGU9InRuczpFeGNlcHRpb25UeXBlIi8+Ci0gICAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN0cmluZ0xpc3QiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhjZXB0aW9uVHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUtbWlub2NjdXJzMC54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlLW1pbm9jY3VyczAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMwNWRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUtbWlub2NjdXJzMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0Lm9yZyI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0icm9vdCI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJBIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJDIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS1yZWN1cnNpdmUtZGF0YXR5cGVzLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUtcmVjdXJzaXZlLWRhdGF0eXBlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODY4ZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS1yZWN1cnNpdmUtZGF0YXR5cGVzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3JlY3Vyc2lvbi5vcmciCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3JlY3Vyc2lvbi5vcmciCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iVHlwZUUiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJFIiB0eXBlPSJ0bnM6VHlwZUUiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGUvc2ltcGxlVHlwZS1BbGwueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS9zaW1wbGVUeXBlLUFsbC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGRiYTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS9zaW1wbGVUeXBlLUFsbC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxlbGVtZW50IG5hbWU9ImRhdGVQYXJhbSIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJkYXRlVGltZVBhcmFtIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJkYXlQYXJhbSIgdHlwZT0ieHNkOmdEYXkiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJkdXJhdGlvblBhcmFtIiB0eXBlPSJ4c2Q6ZHVyYXRpb24iLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJtb250aFBhcmFtIiB0eXBlPSJ4c2Q6Z01vbnRoIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0ibW9udGhEYXlQYXJhbSIgdHlwZT0ieHNkOmdNb250aERheSIvPgotICAgIDxlbGVtZW50IG5hbWU9InRpbWVQYXJhbSIgdHlwZT0ieHNkOnRpbWUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJ5ZWFyUGFyYW0iIHR5cGU9InhzZDpnWWVhciIvPgotICAgIDxlbGVtZW50IG5hbWU9InllYXJNb250aFBhcmFtIiB0eXBlPSJ4c2Q6Z1llYXJNb250aCIvPgotICAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZVBhcmFtIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0ic3RyaW5nUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQk8ZWxlbWVudCBuYW1lPSJib29sZWFuUGFyYW0iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JPGVsZW1lbnQgbmFtZT0iZGVjaW1hbFBhcmFtIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotCTxlbGVtZW50IG5hbWU9ImZsb2F0UGFyYW0iIHR5cGU9InhzZDpmbG9hdCIvPgotCTxlbGVtZW50IG5hbWU9ImhleEJpblBhcmFtIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0JPGVsZW1lbnQgbmFtZT0iYmFzZTY0QmluUGFyYW0iIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLQk8ZWxlbWVudCBuYW1lPSJhbnlVUklQYXJhbSIgdHlwZT0ieHNkOmFueVVSSSIvPgotCTxlbGVtZW50IG5hbWU9InFOYW1lUGFyYW0iIHR5cGU9InhzZDpRTmFtZSIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9hbnkueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9hbnkueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThiNDMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxhbnkvPiAgPCEtLSBub3RlIHRoZSBpbmNsdXNpb24gb2YgYW55IGhlcmUgLS0+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55X2F0dHJpYnV0ZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueV9hdHRyaWJ1dGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUzNjQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55X2F0dHJpYnV0ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgIDxhbnlBdHRyaWJ1dGUgLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55dHlwZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueXR5cGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODE4NzA4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYW55dHlwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgICA8ZWxlbWVudCBuYW1lPSJteU9iamVjdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYXR0cmliLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfYXR0cmliLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlMWQyMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2F0dHJpYi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxhbGw+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L2FsbD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlMSIgdHlwZT0ieHNkOnN0cmluZyI+PC9hdHRyaWJ1dGU+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZTIiIHR5cGU9InhzZDpzdHJpbmciPjwvYXR0cmlidXRlPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUzIiB0eXBlPSJ4c2Q6aW50Ij48L2F0dHJpYnV0ZT4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlNCIgdHlwZT0ieHNkOmZsb2F0Ij48L2F0dHJpYnV0ZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdQYXJhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RSZXR1cm4iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jaG9pY2UueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jaG9pY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJkYzhlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfY2hvaWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICA8L2Nob2ljZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15RWxlbWVudCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfY29udGVudF9leHRlbnNpb24ueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jb250ZW50X2V4dGVuc2lvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmJkOTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jb250ZW50X2V4dGVuc2lvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Im9yZy5hcGFjaGUuYXhpczIudGVzdDUiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0ib3JnLmFwYWNoZS5heGlzMi50ZXN0NSI+Ci0KLTx4czpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlIj4KLQk8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmlyc3QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJtaWRkbGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsYXN0IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotCi08eHM6ZWxlbWVudCBuYW1lPSJmdWxsTmFtZSI+Ci0gIDx4czpjb21wbGV4VHlwZT4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0idG5zOnR5cGUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Imxhbmd1YWdlIiB0eXBlPSJ4czpsYW5ndWFnZSIvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotIDwveHM6ZWxlbWVudD4KLQotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2VsZW1lbnQueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9lbGVtZW50LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxYWNiZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2VsZW1lbnQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UmV0dXJuIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfZWxlbWVudF9yZWZlcmVuY2UueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9lbGVtZW50X3JlZmVyZW5jZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjdiZGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9lbGVtZW50X3JlZmVyZW5jZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9InNPYmplY3QiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRuczpmaWVsZHNUb051bGwiIC8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRuczpJZCIgLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9ImZpZWxkc1RvTnVsbCIgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iSWQiICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnQiIHR5cGU9InRuczpzT2JqZWN0Ii8+Ci0gICAgCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3Vycy54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3Vycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOGY0OWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9tYXhPY2N1cnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZzIveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcyL3hzZCIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciIG1heE9jY3Vycz0iMTAiLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiIC8+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3VyczIueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9tYXhPY2N1cnMyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiN2E4NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX21heE9jY3VyczIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWF4T2NjdXJzPSIxMCIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3RBcnJheSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNvYXBTdHJ1Y3R1cmVzIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiIG1heE9jY3Vycz0iMTAiPjwvZWxlbWVudD4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15b2JqZWN0IiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3RBcnJheSIgLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfbmlsbGFibGUueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9uaWxsYWJsZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Zjg4MTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9uaWxsYWJsZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QxIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJteUVsZW1lbnROaWxsYWJsZSIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QxIiBuaWxsYWJsZT0idHJ1ZSIvPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9wYXJ0aWNsZV9hbGwueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9wYXJ0aWNsZV9hbGwueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTlkMzZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfcGFydGljbGVfYWxsLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU2ltcGxlUGFydGljbGVBbGxTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJteVBhcnRpY2xlQWxsRWxlbWVudCIgdHlwZT0idG5zOlNpbXBsZVBhcnRpY2xlQWxsU3RydWN0Ii8+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3JlY3Vyc2l2ZS54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3JlY3Vyc2l2ZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYTZjODkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZWN1cnNpdmUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0MSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY2hpbGQiIHR5cGU9InRuczpTT0FQU3RydWN0MSIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGVsZW1lbnQgbmFtZT0ibXlFbGVtZW50TmlsbGFibGUiIHR5cGU9InRuczpTT0FQU3RydWN0MSIgbmlsbGFibGU9InRydWUiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfcmVzdHJpY3Rpb24ueHNkIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZXN0cmljdGlvbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWU5YTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZXN0cmljdGlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hhciIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpjaGFyIi8+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iY2hhciI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnQiLz4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ3VpZCIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpndWlkIi8+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZ3VpZCI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9IltcZGEtZkEtRl17OH0tW1xkYS1mQS1GXXs0fS1bXGRhLWZBLUZdezR9LVtcZGEtZkEtRl17NH0tW1xkYS1mQS1GXXsxMn0iLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3NlcXVlbmNlLnhzZCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE3MmQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9Im15RWxlbWVudCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2VfMi54c2QgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3NlcXVlbmNlXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWViZGVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfc2VxdWVuY2VfMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0gICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPCEtLSBIYXMgb25lIG1vcmUgY29tcGxleCB0eXBlIHRoYXQgdXNlcyB0aGUgYWxyZWFkeSBkZWZpbmVkIGNvbXBsZXggdHlwZSAtLT4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdEZhdWx0Ij4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic29hcFN0cnVjdCIgdHlwZT0idG5zOlNPQVBTdHJ1Y3QiLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9InRlbXBFbHQiIHR5cGU9InRuczpTT0FQU3RydWN0RmF1bHQiLz4KLTwvc2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYWxsL0FsbFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYWxsL0FsbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjMmI4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2FsbC9BbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmFsbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuVXBkYXRlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGwoKXsKLSAgICAgICAgVXBkYXRlIHVwZGF0ZSA9IG5ldyBVcGRhdGUoKTsKLSAgICAgICAgdXBkYXRlLnNldEFyZzAoInRlc3QiKTsKLSAgICAgICAgdXBkYXRlLnNldEFyZzEodHJ1ZSk7Ci0gICAgICAgIHVwZGF0ZS5zZXRJZCgyKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdXBkYXRlLmdldE9NRWxlbWVudChVcGRhdGUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvbSBzdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gIjxuczE6VXBkYXRlIHhtbG5zOm5zMT1cImh0dHA6Ly90ZW1wdXJpLm9yZy9cIj48bnMxOmFyZzE+dHJ1ZTwvbnMxOmFyZzE+PG5zMTppZD4yPC9uczE6aWQ+PG5zMTphcmcwPnRlc3Q8L25zMTphcmcwPjwvbnMxOlVwZGF0ZT4iOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBVcGRhdGUgbmV3VXBkYXRlID0gVXBkYXRlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1cGRhdGUuZ2V0QXJnMCgpLG5ld1VwZGF0ZS5nZXRBcmcwKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVwZGF0ZS5nZXRBcmcxKCksbmV3VXBkYXRlLmdldEFyZzEoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModXBkYXRlLmdldElkKCksbmV3VXBkYXRlLmdldElkKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2FueXR5cGUvQW55VHlwZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYW55dHlwZS9BbnlUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWFhMjgyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYW55dHlwZS9BbnlUeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuYW55dHlwZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgdGVzdC5hZGIuYW55dHlwZS4qOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLQotcHVibGljIGNsYXNzIEFueVR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50MSgpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDEoInRlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDEuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDEgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RBbnlUeXBlRWxlbWVudDEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDEobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50MigpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MiB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDIoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDIoInRlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDIuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDIgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50Mi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RBbnlUeXBlRWxlbWVudDIoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDIoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDIobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQyIHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0QW55VHlwZUVsZW1lbnQyKCksbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQzKCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQzIHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDMoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QxIiwidGVzdDIifSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDMuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDMgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0MSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwidGVzdDIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQzKCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDMuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDMgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDMoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QiLG51bGx9KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50My5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MyByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMF0sInRlc3QiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ0KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ0IHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDQoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QxIiwidGVzdDIifSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDQuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDQgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0MSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwidGVzdDIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ0KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDQuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDQgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDQoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QiLG51bGx9KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50NC5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50NCByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQ0LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMF0sInRlc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50NSgpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50NSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ1KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobmV3IE9iamVjdFtdeyJ0ZXN0MSIsInRlc3QyIn0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ1Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ1IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSwidGVzdDEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sInRlc3QyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50NSgpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQuc2V0UGFyYW0xKG51bGwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ1Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ1IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSxudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ1KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobmV3IE9iamVjdFtdeyJ0ZXN0IixudWxsfSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDUgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50NS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzFdLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ2KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2IHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDYoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QxIiwidGVzdDIifSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDYuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDYgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50Ni5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCJ0ZXN0MSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwidGVzdDIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ2KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDYuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDYoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShuZXcgT2JqZWN0W117InRlc3QiLG51bGx9KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50Ni5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ2MSgpewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2IHRlc3RBbnlUeXBlRWxlbWVudDYgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50NigpOwotCi0gICAgICAgIFRlc3RDb21wbGV4UGFyZW50W10gdGVzdENvbXBsZXhQYXJlbnRzID0gbmV3IFRlc3RDb21wbGV4UGFyZW50WzJdOwotICAgICAgICB0ZXN0Q29tcGxleFBhcmVudHNbMF0gPSBuZXcgVGVzdENvbXBsZXhQYXJlbnQoKTsKLSAgICAgICAgdGVzdENvbXBsZXhQYXJlbnRzWzBdLnNldFBhcmFtMSgidGVzdCBwYXJhbTEiKTsKLQotICAgICAgICBUZXN0Q29tcGxleENoaWxkIHRlc3RDb21wbGV4Q2hpbGQgPSBuZXcgVGVzdENvbXBsZXhDaGlsZCgpOwotICAgICAgICB0ZXN0Q29tcGxleENoaWxkLnNldFBhcmFtMSgidGVzdCBwYXJhbTEiKTsKLSAgICAgICAgdGVzdENvbXBsZXhDaGlsZC5zZXRQYXJhbTIoMyk7Ci0gICAgICAgIHRlc3RDb21wbGV4UGFyZW50c1sxXSA9IHRlc3RDb21wbGV4Q2hpbGQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50Ni5zZXRQYXJhbTEodGVzdENvbXBsZXhQYXJlbnRzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudDYuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ2IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDYuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgcmVzdWx0UGFyZW50ID0gKFRlc3RDb21wbGV4UGFyZW50KSByZXN1bHQuZ2V0UGFyYW0xKClbMF07Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UGFyZW50LmdldFBhcmFtMSgpLCJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhDaGlsZCByZXN1bHRDaGlsZCA9IChUZXN0Q29tcGxleENoaWxkKSByZXN1bHQuZ2V0UGFyYW0xKClbMV07Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hpbGQuZ2V0UGFyYW0xKCksICJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENoaWxkLmdldFBhcmFtMigpLCAzKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ3KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ3IHRlc3RBbnlUeXBlRWxlbWVudDsKLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50NygpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQuc2V0UGFyYW0xKCJ0ZXN0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ3Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ3IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDcuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDcoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDcuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDcgcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50Ny5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50NzEoKXsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50NyB0ZXN0QW55VHlwZUVsZW1lbnQ3ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDcoKTsKLSAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgdGVzdENvbXBsZXhQYXJlbnQgPSBuZXcgVGVzdENvbXBsZXhQYXJlbnQoKTsKLSAgICAgICAgdGVzdENvbXBsZXhQYXJlbnQuc2V0UGFyYW0xKCJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQ3LnNldFBhcmFtMSh0ZXN0Q29tcGxleFBhcmVudCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQ3LmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50Ny5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ3IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDcuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgcmVzdWx0UGFyZW50ID0gKFRlc3RDb21wbGV4UGFyZW50KSByZXN1bHQuZ2V0UGFyYW0xKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UGFyZW50LmdldFBhcmFtMSgpLCJ0ZXN0IHBhcmFtMSIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZUVsZW1lbnQ4KCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ4IHRlc3RBbnlUeXBlRWxlbWVudDsKLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50OCgpOwotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQuc2V0UGFyYW0xKCJ0ZXN0Iik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ4Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ4IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDguRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDgoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDguTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50IFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBbnlUeXBlRWxlbWVudDggcmVzdWx0ID0gVGVzdEFueVR5cGVFbGVtZW50OC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFueVR5cGVFbGVtZW50OSgpIHsKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50OSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDkoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMSgidGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50OS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50OSByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQ5LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksInRlc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQ5KCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQ5Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQ5IHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDkuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSxudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlUeXBlRWxlbWVudDEwKCkgewotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxMCB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0KLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEwKCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRQYXJhbTEoInRlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDEwLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxMCByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQxMC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCJ0ZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0QW55VHlwZUVsZW1lbnQgPSBuZXcgVGVzdEFueVR5cGVFbGVtZW50MTAoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFBhcmFtMShudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBbnlUeXBlRWxlbWVudDEwLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlFbGVtZW50SW50ZWdlcigpewotICAgICAgICAvLyBkYXRhdHlwZSB0ZXN0cwotICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxIHRlc3RBbnlUeXBlRWxlbWVudDsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50ID0gbmV3IFRlc3RBbnlUeXBlRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdEFueVR5cGVFbGVtZW50LnNldFRlc3RBbnlUeXBlRWxlbWVudDEobmV3IEludGVnZXIoNSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGVFbGVtZW50MS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MSByZXN1bHQgPSBUZXN0QW55VHlwZUVsZW1lbnQxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEFueVR5cGVFbGVtZW50MSgpLG5ldyBJbnRlZ2VyKDUpKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlFbGVtZW50UU5hbWUoKXsKLSAgICAgICAgLy8gZGF0YXR5cGUgdGVzdHMKLSAgICAgICAgVGVzdEFueVR5cGVFbGVtZW50MSB0ZXN0QW55VHlwZUVsZW1lbnQ7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudCA9IG5ldyBUZXN0QW55VHlwZUVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RBbnlUeXBlRWxlbWVudC5zZXRUZXN0QW55VHlwZUVsZW1lbnQxKG5ldyBRTmFtZSgiaHR0cDovL3dzbzIub3JnIiwidGVzdEVsZW1lbnQiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEFueVR5cGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0QW55VHlwZUVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QW55VHlwZUVsZW1lbnQxIHJlc3VsdCA9IFRlc3RBbnlUeXBlRWxlbWVudDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0QW55VHlwZUVsZW1lbnQxKCksbmV3IFFOYW1lKCJodHRwOi8vd3NvMi5vcmciLCJ0ZXN0RWxlbWVudCIpKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0RWxlbWVudCgpewotICAgICAgICBUZXN0RWxlbWVudCB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudCgpOwotCi0gICAgICAgIER5bmFtaWNQcm9wZXJ0eVtdIGR5bmFtaWNQcm9wZXJ0aWVzID0gbmV3IER5bmFtaWNQcm9wZXJ0eVszXTsKLSAgICAgICAgVGVzdENvbXBsZXhQYXJlbnQgdGVzdENvbXBsZXhQYXJlbnQgPSBudWxsOwotCi0gICAgICAgIGR5bmFtaWNQcm9wZXJ0aWVzWzBdID0gbmV3IER5bmFtaWNQcm9wZXJ0eSgpOwotICAgICAgICBkeW5hbWljUHJvcGVydGllc1swXS5zZXROYW1lKCJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXNbMF0uc2V0VmFsKG5ldyBJbnRlZ2VyKDUpKTsKLQotICAgICAgICBkeW5hbWljUHJvcGVydGllc1sxXSA9IG5ldyBEeW5hbWljUHJvcGVydHkoKTsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXNbMV0uc2V0TmFtZSgidGVzdCBuYW1lIik7Ci0gICAgICAgIHRlc3RDb21wbGV4UGFyZW50ID0gbmV3IFRlc3RDb21wbGV4UGFyZW50KCk7Ci0gICAgICAgIHRlc3RDb21wbGV4UGFyZW50LnNldFBhcmFtMSgidGVzdCBjb21wbGV4dCB0eXBlIik7Ci0gICAgICAgIGR5bmFtaWNQcm9wZXJ0aWVzWzFdLnNldFZhbCh0ZXN0Q29tcGxleFBhcmVudCk7Ci0KLSAgICAgICAgVGVzdFNpbXBsZVR5cGUgdGVzdFNpbXBsZVR5cGUgPSBuZXcgVGVzdFNpbXBsZVR5cGUoKTsKLSAgICAgICAgdGVzdFNpbXBsZVR5cGUuc2V0VGVzdFNpbXBsZVR5cGUoInRlc3Qgc2ltcGxlIHN0cmluZyIpOwotICAgICAgICBkeW5hbWljUHJvcGVydGllc1syXSA9IG5ldyBEeW5hbWljUHJvcGVydHkoKTsKLSAgICAgICAgZHluYW1pY1Byb3BlcnRpZXNbMl0uc2V0TmFtZSgidGVzdCBuYW1lIik7Ci0gICAgICAgIGR5bmFtaWNQcm9wZXJ0aWVzWzJdLnNldFZhbCh0ZXN0U2ltcGxlVHlwZSk7Ci0KLQotICAgICAgICB0ZXN0RWxlbWVudC5zZXRQYXJhbTEoZHluYW1pY1Byb3BlcnRpZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0RWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50IHJlc3VsdCA9IFRlc3RFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIER5bmFtaWNQcm9wZXJ0eVtdIHJlc3VsdFByb3BlcnRpZXMgPSByZXN1bHQuZ2V0UGFyYW0xKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UHJvcGVydGllc1swXS5nZXROYW1lKCksICJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRQcm9wZXJ0aWVzWzBdLmdldFZhbCgpLCBuZXcgSW50ZWdlcig1KSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UHJvcGVydGllc1sxXS5nZXROYW1lKCksICJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKFRlc3RDb21wbGV4UGFyZW50KXJlc3VsdFByb3BlcnRpZXNbMV0uZ2V0VmFsKCkpLmdldFBhcmFtMSgpLCAidGVzdCBjb21wbGV4dCB0eXBlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0UHJvcGVydGllc1syXS5nZXROYW1lKCksICJ0ZXN0IG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKFRlc3RTaW1wbGVUeXBlKXJlc3VsdFByb3BlcnRpZXNbMl0uZ2V0VmFsKCkpLmdldFRlc3RTaW1wbGVUeXBlKCksInRlc3Qgc2ltcGxlIHN0cmluZyIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYXR0cmlidXRlL0F0dHJpYnV0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvYXR0cmlidXRlL0F0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YjA2NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2F0dHJpYnV0ZS9BdHRyaWJ1dGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5hdHRyaWJ1dGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy50ZW1wdXJpLmF0dHJpYnV0ZS4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudDEoKXsKLQotICAgICAgICBUZXN0RWxlbWVudDEgdGVzdEVsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RFbGVtZW50LnNldEF0dHJpYnV0ZTEoMSk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEVsZW1lbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQxIHJlc3VsdCA9IFRlc3RFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwxKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RFbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50MSgpOwotICAgICAgICB0ZXN0RWxlbWVudC5zZXRBdHRyaWJ1dGUxKEludGVnZXIuTUlOX1ZBTFVFKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RFbGVtZW50MSByZXN1bHQgPSBUZXN0RWxlbWVudDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdHRyaWJ1dGUxKCksSW50ZWdlci5NSU5fVkFMVUUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQyKCl7Ci0gICAgICAgIFRlc3RFbGVtZW50MiB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudDIoKTsKLSAgICAgICAgdGVzdEVsZW1lbnQuc2V0QXR0cmlidXRlMSgxKTsKLSAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RFbGVtZW50LmdldE9NRWxlbWVudChUZXN0RWxlbWVudDIuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQyIHJlc3VsdCA9IFRlc3RFbGVtZW50Mi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwxKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RFbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50MigpOwotICAgICAgICB0ZXN0RWxlbWVudC5zZXRBdHRyaWJ1dGUxKEludGVnZXIuTUlOX1ZBTFVFKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50Mi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnQzKCl7Ci0gICAgICAgIFRlc3RFbGVtZW50MyB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudDMoKTsKLSAgICAgICAgdGVzdEVsZW1lbnQuc2V0QXR0cmlidXRlMSgidGVzdCIpOwotICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50My5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0RWxlbWVudDMgcmVzdWx0ID0gVGVzdEVsZW1lbnQzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLCJ0ZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudDMoKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEVsZW1lbnQzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQzIHJlc3VsdCA9IFRlc3RFbGVtZW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSxudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudDQoKXsKLSAgICAgICAgVGVzdEVsZW1lbnQ0IHRlc3RFbGVtZW50ID0gbmV3IFRlc3RFbGVtZW50NCgpOwotICAgICAgICB0ZXN0RWxlbWVudC5zZXRBdHRyaWJ1dGUxKCJ0ZXN0Iik7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdEVsZW1lbnQ0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQ0IHJlc3VsdCA9IFRlc3RFbGVtZW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwidGVzdCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdEVsZW1lbnQgPSBuZXcgVGVzdEVsZW1lbnQ0KCk7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RFbGVtZW50NC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUoKXsKLSAgICAgICAgVGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUgdGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUgPSBuZXcgVGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUoKTsKLSAgICAgICAgQXR0cmlidXRlMV90eXBlMCBhdHRyaWJ1dGUxX3R5cGUwID0gbmV3IEF0dHJpYnV0ZTFfdHlwZTAoKTsKLSAgICAgICAgYXR0cmlidXRlMV90eXBlMC5zZXRBdHRyaWJ1dGUxX3R5cGUwKCJ0ZXN0IGF0dHJpYnV0ZSIpOwotICAgICAgICB0ZXN0QXR0cmlidXRlU2ltcGxlVHlwZS5zZXRBdHRyaWJ1dGUxKGF0dHJpYnV0ZTFfdHlwZTApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEF0dHJpYnV0ZVNpbXBsZVR5cGUuZ2V0T01FbGVtZW50KFRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTVN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlIHJlc3VsdCA9IFRlc3RBdHRyaWJ1dGVTaW1wbGVUeXBlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLmdldEF0dHJpYnV0ZTFfdHlwZTAoKSwidGVzdCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50KCl7Ci0gICAgICAgIFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50IHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50ID0gbmV3IFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50KCk7Ci0gICAgICAgIFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlID0gbmV3IFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlKCk7Ci0gICAgICAgIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlLnNldFBhcmFtMSgicGFyYW0xIik7Ci0gICAgICAgIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlLnNldFBhcmFtMigicGFyYW0yIik7Ci0gICAgICAgIHRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VUeXBlLnNldFRlc3RBdHRyaWJ1dGUxKCJhdHRyaWJ1dGUxIik7Ci0KLSAgICAgICAgdGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQuc2V0VGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQodGVzdEF0dHJpYnV0ZVJlZmVyZW5jZVR5cGUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQgcmVzdWx0ID0gVGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RBdHRyaWJ1dGVSZWZlcmVuY2VFbGVtZW50KCkuZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0QXR0cmlidXRlUmVmZXJlbmNlRWxlbWVudCgpLmdldFBhcmFtMigpLCJwYXJhbTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEF0dHJpYnV0ZVJlZmVyZW5jZUVsZW1lbnQoKS5nZXRUZXN0QXR0cmlidXRlMSgpLCJhdHRyaWJ1dGUxIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jhc2U2NGJpbmFyeS9CYXNlNjRCaW5hcnlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jhc2U2NGJpbmFyeS9CYXNlNjRCaW5hcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGUzMTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9iYXNlNjRiaW5hcnkvQmFzZTY0QmluYXJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuYmFzZTY0YmluYXJ5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnk7Ci1pbXBvcnQgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS4qOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBCYXNlNjRCaW5hcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NEJpbmFyeSgpewotICAgICAgICBUZXN0QmFzZTY0QmluYXJ5IHRlc3RCYXNlNjRCaW5hcnkgPSBuZXcgVGVzdEJhc2U2NEJpbmFyeSgpOwotICAgICAgICBCYXNlNjRCaW5hcnkgYmFzZTY0QmluYXJ5ID0gbmV3IEJhc2U2NEJpbmFyeSgpOwotICAgICAgICB0ZXN0QmFzZTY0QmluYXJ5LnNldFRlc3RCYXNlNjRCaW5hcnkoYmFzZTY0QmluYXJ5KTsKLQotICAgICAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJuZXcgdGVzdCBzdHJpbmciOwotCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBiYXNlNjRCaW5hcnkuc2V0QmFzZTY0QmluYXJ5KGRhdGFIYW5kbGVyKTsKLSAgICAgICAgQ29udGVudFR5cGVfdHlwZTAgY29udGVudFR5cGVfdHlwZTAgPSBuZXcgQ29udGVudFR5cGVfdHlwZTAoKTsKLSAgICAgICAgY29udGVudFR5cGVfdHlwZTAuc2V0Q29udGVudFR5cGVfdHlwZTAoInRlc3QgY29udGVudCB0eXBlIik7Ci0gICAgICAgIGJhc2U2NEJpbmFyeS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZV90eXBlMCk7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RCYXNlNjRCaW5hcnkuZ2V0T01FbGVtZW50KFRlc3RCYXNlNjRCaW5hcnkuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0QmFzZTY0QmluYXJ5IHJlc3VsdCA9IFRlc3RCYXNlNjRCaW5hcnkuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgRGF0YUhhbmRsZXIgcmVzdWx0RGF0YUhhbmRsZXIgPSByZXN1bHQuZ2V0VGVzdEJhc2U2NEJpbmFyeSgpLmdldEJhc2U2NEJpbmFyeSgpOwotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTI4XTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSByZXN1bHREYXRhSGFuZGxlci5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoYnl0ZXMpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdFN0cmluZyA9IG5ldyBTdHJpbmcoYnl0ZXMsMCxsZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFN0cmluZyx0ZXN0U3RyaW5nKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEJhc2U2NEJpbmFyeSgpLmdldENvbnRlbnRUeXBlKCkuZ2V0Q29udGVudFR5cGVfdHlwZTAoKSwidGVzdCBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIZXhCaW5hcnkoKXsKLSAgICAgICAgVGVzdEhleEJpbmFyeSB0ZXN0SGV4QmluYXJ5ID0gbmV3IFRlc3RIZXhCaW5hcnkoKTsKLSAgICAgICAgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS5IZXhCaW5hcnkgaGV4QmluYXJ5ID0gbmV3IG9yZy53My53d3cuXzIwMDUuXzA1LnhtbG1pbWUuSGV4QmluYXJ5KCk7Ci0gICAgICAgIHRlc3RIZXhCaW5hcnkuc2V0VGVzdEhleEJpbmFyeShoZXhCaW5hcnkpOwotCi0gICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gImFiIjsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeSBhZGJIZXhCaW5hcnkgPQotICAgICAgICAgICAgICAgIG5ldyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkodGVzdFN0cmluZyk7Ci0KLSAgICAgICAgaGV4QmluYXJ5LnNldEhleEJpbmFyeShhZGJIZXhCaW5hcnkpOwotICAgICAgICBDb250ZW50VHlwZV90eXBlMCBjb250ZW50VHlwZV90eXBlMCA9IG5ldyBDb250ZW50VHlwZV90eXBlMCgpOwotICAgICAgICBjb250ZW50VHlwZV90eXBlMC5zZXRDb250ZW50VHlwZV90eXBlMCgidGVzdCBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgaGV4QmluYXJ5LnNldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlX3R5cGUwKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEhleEJpbmFyeS5nZXRPTUVsZW1lbnQoVGVzdEJhc2U2NEJpbmFyeS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RIZXhCaW5hcnkgcmVzdWx0ID0gVGVzdEhleEJpbmFyeS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RIZXhCaW5hcnkoKS5nZXRIZXhCaW5hcnkoKS50b1N0cmluZygpLHRlc3RTdHJpbmcpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SGV4QmluYXJ5KCkuZ2V0Q29udGVudFR5cGUoKS5nZXRDb250ZW50VHlwZV90eXBlMCgpLCJ0ZXN0IGNvbnRlbnQgdHlwZSIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NE11bHRpRWxlbWVudCgpewotCi0gICAgICAgIFRlc3RCYXNlNjRNdWx0aUVsZW1lbnQgdGVzdEJhc2U2NE11bHRpRWxlbWVudCA9IG5ldyBUZXN0QmFzZTY0TXVsdGlFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3RpbmcgYmFzZSA2NCBlbGVtZW50cyI7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICB0ZXN0QmFzZTY0TXVsdGlFbGVtZW50LnNldFBhcmFtMShkYXRhSGFuZGxlcik7Ci0gICAgICAgIHRlc3RCYXNlNjRNdWx0aUVsZW1lbnQuc2V0UGFyYW0yKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICB0ZXN0QmFzZTY0TXVsdGlFbGVtZW50LnNldFBhcmFtMyg1KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RCYXNlNjRNdWx0aUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RCYXNlNjRNdWx0aUVsZW1lbnQuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEJhc2U2NE11bHRpRWxlbWVudCByZXN1bHQgPSBUZXN0QmFzZTY0TXVsdGlFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIHJlc3VsdERhdGFIYW5kbGVyID0gcmVzdWx0LmdldFBhcmFtMSgpOwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEyOF07Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVzdWx0RGF0YUhhbmRsZXIuZ2V0SW5wdXRTdHJlYW0oKS5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0U3RyaW5nID0gbmV3IFN0cmluZyhidWZmZXIsMCxsZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RTdHJpbmcscmVzdWx0U3RyaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jvb2xlYW50ZXN0L0Jvb2xlYW5UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Jvb2xlYW50ZXN0L0Jvb2xlYW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDAyMjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9ib29sZWFudGVzdC9Cb29sZWFuVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5ib29sZWFudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuVGVzdEJvb2xlYW4xOwotaW1wb3J0IG9yZy50ZW1wdXJpLmJvb2xlYW4xLlRlc3RCb29sZWFuMjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEJvb2xlYW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5UZXN0MSgpewotICAgICAgICBUZXN0Qm9vbGVhbjEgdGVzdEJvb2xlYW4gPSBuZXcgVGVzdEJvb2xlYW4xKCk7Ci0gICAgICAgIHRlc3RCb29sZWFuLnNldFRlc3RCb29sZWFuMSh0cnVlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RCb29sZWFuLmdldE9NRWxlbWVudChUZXN0Qm9vbGVhbjEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0Qm9vbGVhbjEgcmVzdWx0ID0gVGVzdEJvb2xlYW4xLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdEJvb2xlYW4xKCksdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhblRlc3QyKCl7Ci0gICAgICAgIFRlc3RCb29sZWFuMiB0ZXN0Qm9vbGVhbiA9IG5ldyBUZXN0Qm9vbGVhbjIoKTsKLSAgICAgICAgdGVzdEJvb2xlYW4uc2V0UGFyYW0xKGZhbHNlKTsKLSAgICAgICAgdGVzdEJvb2xlYW4uc2V0QXR0cmlidXRlMSh0cnVlKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Qm9vbGVhbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2xlYW4yLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEJvb2xlYW4yIHJlc3VsdCA9IFRlc3RCb29sZWFuMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLGZhbHNlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLHRydWUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Nob2ljZS9DaGljZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY2hvaWNlL0NoaWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJjNzNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY2hvaWNlL0NoaWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jaG9pY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy5UZXN0Q2hvaXNlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgQ2hpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdENob2ljZSgpewotICAgICAgICBUZXN0Q2hvaXNlIHRlc3RDaG9pc2UgPSBuZXcgVGVzdENob2lzZSgpOwotICAgICAgICB0ZXN0Q2hvaXNlLnNldENob2ljZTEoInRlc3QgMiIpOwotICAgICAgICB0ZXN0Q2hvaXNlLnNldENob2ljZTIoNSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Q2hvaXNlLmdldE9NRWxlbWVudChUZXN0Q2hvaXNlLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RDaG9pc2UgbmV3VGVzdENob2ljZSA9IFRlc3RDaG9pc2UuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsbmV3VGVzdENob2ljZS5nZXRDaG9pY2UyKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3Rlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0Fic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2NGM1ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5Db21waWxlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuU2NoZW1hQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKiBNYXZlbiBpcyBhIGxpdHRsZSBkdW1iIHdoZW4gaXQgY29tZXMgdG8gZXhlY3V0aW5nIHRlc3QgY2FzZXMuIEl0IHRyaWVzIHRvIHJ1biBldmVyeXRoaW5nCi0gIHRoYXQgZW5kcyB3aXRoICd0ZXN0JyBldmVuIGlmIHRoZSBjbGFzcyBpcyBhYnN0cmFjdCBvciBub24ganVuaXQhISEhIQotICBSYXRoZXIgdGhhbiBwdXR0aW5nIGFuIGV4cGxpY2l0IGV4Y2x1ZGUsIHRoaXMgaXMgYSBjaGVhcGVyIHdheSBvdXQKLSovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlciBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8vdGhpcyBzaG91bGQgYmUgYW4geHNkIG5hbWUgaW4gdGhlIHRlc3QtcmVzb3VyY2UgZGlyZWN0b3J5Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZSA9ICIiOwotICAgIHByb3RlY3RlZCAgWG1sU2NoZW1hIGN1cnJlbnRTY2hlbWE7Ci0gICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0Rm9sZGVyID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBURU1QX09VVF9GT0xERVI9InRlbXBfY29tcGlsZSI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2xvYWQgdGhlIGN1cnJlbnQgU2NoZW1hIHRocm91Z2ggYSBmaWxlCi0gICAgICAgIC8vZmlyc3QgcmVhZCB0aGUgZmlsZSBpbnRvIGEgRE9NCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9ICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrZmlsZU5hbWUpKTsKLQotICAgICAgICAvL25vdyByZWFkIGl0IHRvIGEgc2NoZW1hCi0gICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sID0gIGdldFNjaGVtYVJlYWRlcigpOwotICAgICAgICBjdXJyZW50U2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLG51bGwpOwotCi0gICAgICAgIG91dHB1dEZvbGRlciA9IG5ldyBGaWxlKFRFTVBfT1VUX0ZPTERFUik7Ci0gICAgICAgIGlmIChvdXRwdXRGb2xkZXIuZXhpc3RzKCkpewotICAgICAgICAgICAgaWYgKG91dHB1dEZvbGRlci5pc0ZpbGUoKSl7Ci0gICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlci5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgIFhtbFNjaGVtYUNvbGxlY3Rpb24gZ2V0U2NoZW1hUmVhZGVyKCl7Ci0gICAgICAgIHJldHVybiBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOwotICAgICAgICBjb21waWxlck9wdGlvbnMuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0Rm9sZGVyKTsKLSAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFdyYXBDbGFzc2VzKGZhbHNlKTsKLSAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFdyaXRlT3V0cHV0KHRydWUpOwotICAgICAgICBTY2hlbWFDb21waWxlciBjb21waWxlciA9IG5ldyBTY2hlbWFDb21waWxlcihjb21waWxlck9wdGlvbnMpOwotICAgICAgICBjb21waWxlci5jb21waWxlKGN1cnJlbnRTY2hlbWEpOwotICAgICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICBkZWxldGVEaXIob3V0cHV0Rm9sZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgdW5kZXIgZGlyLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGVsZXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC4KLSAgICAgKiBJZiBhIGRlbGV0aW9uIGZhaWxzLCB0aGUgbWV0aG9kIHN0b3BzIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuZCByZXR1cm5zIGZhbHNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0Fub255bW91c0NvbXBsZXhUeXBlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0Fub255bW91c0NvbXBsZXhUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjk5MDUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9Bbm9ueW1vdXNDb21wbGV4VHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIEFub255bW91c0NvbXBsZXhUeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL2Fub255bW91c19jb21wbGV4VHlwZS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9Db21wbGV4QWxsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0NvbXBsZXhBbGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZGI3NzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0NvbXBsZXhBbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4QWxsVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2QvY29tcGxleF9hbGwueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL0NvbXBsZXhFeHRlbnNpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQ29tcGxleEV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NDMzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvQ29tcGxleEV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIENvbXBsZXhFeHRlbnNpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlcnsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9jb21wbGV4X2NvbnRlbnRfZXh0ZW5zaW9uLnhzZCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9JbXBvcnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvSW1wb3J0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJmOTU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9JbXBvcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlcnsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9pbXBvcnQueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hQ29sbGVjdGlvbiBnZXRTY2hlbWFSZWFkZXIoKSB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gcmVhZGVyID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsKLSAgICAgICAgcmVhZGVyLnNldEJhc2VVcmkoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC1yZXNvdXJjZXMveHNkIik7Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1JlY3Vyc2l2ZUNvbXBpbGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvUmVjdXJzaXZlQ29tcGlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmZTQ2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvUmVjdXJzaXZlQ29tcGlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFJlY3Vyc2l2ZUNvbXBpbGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlciB7Ci0gICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3JlY3Vyc2l2ZS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQW55QXR0cmliVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueUF0dHJpYlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2OTJjMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQW55QXR0cmliVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQW55QXR0cmliVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9hbnlfYXR0cmlidXRlLnhzZCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVBbnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2ZlMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUFueVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVBbnlUeXBlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzgzMzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUFueVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBbnlUeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2FueXR5cGUueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQXR0cmlidXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzMjc5ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQXR0cmlidXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXR0cmlidXRlVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXIgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX2F0dHJpYi54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUNob2ljZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVDaG9pY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDllNDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUNob2ljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNob2ljZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9jaG9pY2UueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZUNvbnRlbnRFeHRlbnNpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQ29udGVudEV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxOTYwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlQ29udGVudEV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRlbnRFeHRlbnNpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RTY2hlbWFDb21waWxlclRlc3RlcnsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfY29udGVudF9leHRlbnNpb24ueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlRWxlbWVudFJlZmVyZW5jZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50UmVmZXJlbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzdmYTNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50UmVmZXJlbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRWxlbWVudFJlZmVyZW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfZWxlbWVudF9yZWZlcmVuY2UueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlRWxlbWVudFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlNTU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVFbGVtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRWxlbWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfZWxlbWVudC54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVQYXJ0aWNsZUFsbFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVQYXJ0aWNsZUFsbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzNzk0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlUGFydGljbGVBbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVQYXJ0aWNsZUFsbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9wYXJ0aWNsZV9hbGwueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVJlc3RyaWN0aW9uVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVJlc3RyaWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY1MTc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVSZXN0cmljdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVJlc3RyaWN0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXJ7Ci0gICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9yZXN0cmljdGlvbi54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVNlcXVlbmNlMlRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVTZXF1ZW5jZTJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1NpbXBsZVNlcXVlbmNlMlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVNlcXVlbmNlMlRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9ICJ0ZXN0LXJlc291cmNlcy94c2Qvc2ltcGxlX3NlcXVlbmNlXzIueHNkIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVTZXF1ZW5jZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9TaW1wbGVTZXF1ZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhYjRjYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvU2ltcGxlU2VxdWVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmNvbXBpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVTZXF1ZW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZV9zZXF1ZW5jZS54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2NvbXBpbGUvWG1sTWF4T2NjdXJzMlRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9YbWxNYXhPY2N1cnMyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjNDhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9YbWxNYXhPY2N1cnMyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlOwotCi1wdWJsaWMgY2xhc3MgWG1sTWF4T2NjdXJzMlRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfbWF4T2NjdXJzMi54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1htbG1heE9jY3Vyc1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9YbWxtYXhPY2N1cnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjM3YzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL1htbG1heE9jY3Vyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZTsKLQotcHVibGljIGNsYXNzIFhtbG1heE9jY3Vyc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLSAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gInRlc3QtcmVzb3VyY2VzL3hzZC9zaW1wbGVfbWF4T2NjdXJzLnhzZCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL3NpbXBsZS9TaW1wbGVUeXBlQWxsQ29tcGlsZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvY29tcGlsZS9zaW1wbGUvU2ltcGxlVHlwZUFsbENvbXBpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzFkNTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9jb21waWxlL3NpbXBsZS9TaW1wbGVUeXBlQWxsQ29tcGlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuY29tcGlsZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5jb21waWxlLkFic3RyYWN0U2NoZW1hQ29tcGlsZXJUZXN0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlQWxsQ29tcGlsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNjaGVtYUNvbXBpbGVyVGVzdGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSAidGVzdC1yZXNvdXJjZXMveHNkL3NpbXBsZS9zaW1wbGVUeXBlLUFsbC54c2QiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZGVjaW1hbC9EZWNpbWFsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9kZWNpbWFsL0RlY2ltYWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3N2E2Y2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9kZWNpbWFsL0RlY2ltYWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmRlY2ltYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuQXJyYXlPZkRlY2ltYWw7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuR2V0SGlzdG9yaWNOYXZSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi0KLXB1YmxpYyBjbGFzcyBEZWNpbWFsVGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbCgpewotICAgICAgICBHZXRIaXN0b3JpY05hdlJlc3BvbnNlIGdldEhpc3RvcmljTmF2UmVzcG9uc2UgPSBuZXcgR2V0SGlzdG9yaWNOYXZSZXNwb25zZSgpOwotICAgICAgICBBcnJheU9mRGVjaW1hbCBhcnJheU9mRGVjaW1hbCA9IG5ldyBBcnJheU9mRGVjaW1hbCgpOwotICAgICAgICBnZXRIaXN0b3JpY05hdlJlc3BvbnNlLnNldE91dChhcnJheU9mRGVjaW1hbCk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobnVsbCk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobnVsbCk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobmV3IEJpZ0RlY2ltYWwoIjExMS4zOCIpKTsKLSAgICAgICAgYXJyYXlPZkRlY2ltYWwuYWRkRGVjaW1hbChuZXcgQmlnRGVjaW1hbCgiMTExLjM4IikpOwotICAgICAgICBhcnJheU9mRGVjaW1hbC5hZGREZWNpbWFsKG5ldyBCaWdEZWNpbWFsKCIxMTEuMzgiKSk7Ci0gICAgICAgIGFycmF5T2ZEZWNpbWFsLmFkZERlY2ltYWwobmV3IEJpZ0RlY2ltYWwoIjExMS41NCIpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGdldEhpc3RvcmljTmF2UmVzcG9uc2UuZ2V0T01FbGVtZW50KEdldEhpc3RvcmljTmF2UmVzcG9uc2UuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBHZXRIaXN0b3JpY05hdlJlc3BvbnNlIHJlc3VsdCA9IEdldEhpc3RvcmljTmF2UmVzcG9uc2UuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbMF0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbMV0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbMl0udG9TdHJpbmcoKSwgIjExMS4zOCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbM10udG9TdHJpbmcoKSwgIjExMS4zOCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbNF0udG9TdHJpbmcoKSwgIjExMS4zOCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRPdXQoKS5nZXREZWNpbWFsKClbNV0udG9TdHJpbmcoKSwgIjExMS41NCIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdER1cmF0aW9uKCl7Ci0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRHVyYXRpb24gZHVyYXRpb24gPSBuZXcgRHVyYXRpb24oZmFsc2UsMCwwLDIzLDEyLDI0LDIzLjQ1KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEdXJhdGlvbiA9PT4gIiArIGR1cmF0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAvLyBQMjAwN1k1TTMwRFQ4SDQwTTU1Ljg3UwotICAgICAgICAvLyAiXFwtP1AoXFxkKkQpPyhUKFxcZCpIKT8oXFxkKk0pPyhcXGQqKFxcLlxcZCopP1MpPyk/IgotICAgICAgICBpZiAoZHVyYXRpb24udG9TdHJpbmcoKS5tYXRjaGVzKCJcXC0/UChcXGQqRCk/KFQoXFxkKkgpPyhcXGQqTSk/KFxcZCooXFwuXFxkKik/Uyk/KT8iKSl7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1hdGNoZXMiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZGVmYXVsdG5hbWVzcGFjZXMvRGVmYXVsdE5hbWVzcGFjZXNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2RlZmF1bHRuYW1lc3BhY2VzL0RlZmF1bHROYW1lc3BhY2VzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzE0MzVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZGVmYXVsdG5hbWVzcGFjZXMvRGVmYXVsdE5hbWVzcGFjZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmRlZmF1bHRuYW1lc3BhY2VzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcudGVtcHVyaS5kZWZhdWx0bmFtZXBhY2VzLlRlc3RDaGlsZFR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZGVmYXVsdG5hbWVwYWNlcy5UZXN0RWxlbWVudDE7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZGVmYXVsdG5hbWVwYWNlcy5UZXN0U2ltcGxlVW5pb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TmFtZXNwYWNlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEVsZW1lbnQxKCkgewotCi0gICAgICAgIFRlc3RFbGVtZW50MSB0ZXN0RWxlbWVudDEgPSBuZXcgVGVzdEVsZW1lbnQxKCk7Ci0KLSAgICAgICAgVGVzdENoaWxkVHlwZSB0ZXN0Q2hpbGRUeXBlID0gbmV3IFRlc3RDaGlsZFR5cGUoKTsKLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRQYXJhbTEobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTEiKSk7Ci0gICAgICAgIHRlc3RDaGlsZFR5cGUuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRQYXJhbTMobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTMiKSk7Ci0gICAgICAgIHRlc3RDaGlsZFR5cGUuc2V0UGFyYW00KCJQYXJhbTQiKTsKLQotICAgICAgICBUZXN0U2ltcGxlVW5pb24gdGVzdFNpbXBsZVVuaW9uMSA9IG5ldyBUZXN0U2ltcGxlVW5pb24oKTsKLSAgICAgICAgdGVzdFNpbXBsZVVuaW9uMS5zZXRPYmplY3QobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTUiKSk7Ci0KLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRQYXJhbTUodGVzdFNpbXBsZVVuaW9uMSk7Ci0KLSAgICAgICAgdGVzdENoaWxkVHlwZS5zZXRBdHRyaWJ1dGUxKCJhdHRyaWJ1dGUxIik7Ci0gICAgICAgIHRlc3RDaGlsZFR5cGUuc2V0QXR0cmlidXRlMihuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgImF0dHJpYnV0ZTIiKSk7Ci0KLSAgICAgICAgVGVzdFNpbXBsZVVuaW9uIHRlc3RTaW1wbGVVbmlvbjIgPSBuZXcgVGVzdFNpbXBsZVVuaW9uKCk7Ci0gICAgICAgIHRlc3RTaW1wbGVVbmlvbjIuc2V0T2JqZWN0KG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnL2RlZmF1bHRuYW1lcGFjZXMiLCAiYXR0cmlidXRlMyIpKTsKLQotCi0gICAgICAgIHRlc3RFbGVtZW50MS5zZXRUZXN0RWxlbWVudDEodGVzdENoaWxkVHlwZSk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKLSAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIgPSBuZXcgTVRPTUF3YXJlWE1MU2VyaWFsaXplcih4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgdGVzdEVsZW1lbnQxLmdldFRlc3RFbGVtZW50MSgpLnNlcmlhbGl6ZShuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgIlRlc3RFbGVtZW50MSIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLCBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQxIHJlc3VsdCA9IFRlc3RFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRUZXN0RWxlbWVudDEoKSBpbnN0YW5jZW9mIFRlc3RDaGlsZFR5cGUpOwotICAgICAgICAgICAgVGVzdENoaWxkVHlwZSByZXN1bHRUeXBlID0gKFRlc3RDaGlsZFR5cGUpIHJlc3VsdC5nZXRUZXN0RWxlbWVudDEoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRUeXBlLmdldFBhcmFtMSgpLCBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgInBhcmFtMSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRUeXBlLmdldFBhcmFtMigpLCAiUGFyYW0yIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0VHlwZS5nZXRQYXJhbTMoKSwgbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvZGVmYXVsdG5hbWVwYWNlcyIsICJwYXJhbTMiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0VHlwZS5nZXRQYXJhbTQoKSwgIlBhcmFtNCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0QXR0cmlidXRlMSgpLCAiYXR0cmlidXRlMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0QXR0cmlidXRlMigpLCBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy9kZWZhdWx0bmFtZXBhY2VzIiwgImF0dHJpYnV0ZTIiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2RlZmF1bHR2YWx1ZS9EZWZhdWx0VmFsdWVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2RlZmF1bHR2YWx1ZS9EZWZhdWx0VmFsdWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODA2ODUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9kZWZhdWx0dmFsdWUvRGVmYXVsdFZhbHVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5kZWZhdWx0dmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuYm9vbGVhbjEuVGVzdEVsZW1lbnQxOwotaW1wb3J0IG9yZy50ZW1wdXJpLmJvb2xlYW4xLlRlc3RFbGVtZW50MjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlcygpewotICAgICAgICBUZXN0RWxlbWVudDEgdGVzdEVsZW1lbnQxID0gbmV3IFRlc3RFbGVtZW50MSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModGVzdEVsZW1lbnQxLmdldFRlc3RFbGVtZW50MSgpLDU2KTsKLSAgICAgICAgVGVzdEVsZW1lbnQyIHRlc3RFbGVtZW50MiA9IG5ldyBUZXN0RWxlbWVudDIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RFbGVtZW50Mi5nZXRQYXJhbTEoKSwgInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RFbGVtZW50Mi5nZXRBdHRyaWJ1dGUxKCksdHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9lbnVtZXJhdGlvbi9FbnVtZXJhdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZW51bWVyYXRpb24vRW51bWVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDBhMGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9lbnVtZXJhdGlvbi9FbnVtZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuZW51bWVyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy50ZW1wdXJpLkNvdW50UGxhY2VzSW5SZWN0OwotaW1wb3J0IG9yZy50ZW1wdXJpLlBsYWNlVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGlvbigpewotCi0gICAgICAgIENvdW50UGxhY2VzSW5SZWN0IGNvdW50UGxhY2VzSW5SZWN0ID0gbmV3IENvdW50UGxhY2VzSW5SZWN0KCk7Ci0gICAgICAgIGNvdW50UGxhY2VzSW5SZWN0LnNldExvd2VycmlnaHQoImxvd2VycmlnaHQiKTsKLSAgICAgICAgY291bnRQbGFjZXNJblJlY3Quc2V0VXBwZXJsZWZ0KCJ1cHBlcmxlZnQiKTsKLSAgICAgICAgY291bnRQbGFjZXNJblJlY3Quc2V0UHR5cGUoUGxhY2VUeXBlLlJpdmVyKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gY291bnRQbGFjZXNJblJlY3QuZ2V0T01FbGVtZW50KENvdW50UGxhY2VzSW5SZWN0Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBDb3VudFBsYWNlc0luUmVjdCBuZXdPYmplY3QgPSBDb3VudFBsYWNlc0luUmVjdC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY291bnRQbGFjZXNJblJlY3QuZ2V0UHR5cGUoKSxQbGFjZVR5cGUuUml2ZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2V4dGVuc2lvbi9Db21wbGV4RXh0ZW5zdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL0NvbXBsZXhFeHRlbnN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTk2ODdmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL0NvbXBsZXhFeHRlbnN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5leHRlbnNpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy5CYXNlVHlwZTsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuRXh0ZW5kZWRDb21wbGV4VHlwZTsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuRnVsbE5hbWU7Ci1pbXBvcnQgdGVzdC5heGlzMi5hcGFjaGUub3JnLlRlc3RDb21wbGV4RWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RXh0ZW5zdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleEV4dGVuc2lvbigpIHsKLQotICAgICAgICBUZXN0Q29tcGxleEVsZW1lbnQgdGVzdENvbXBsZXhFbGVtZW50ID0gbmV3IFRlc3RDb21wbGV4RWxlbWVudCgpOwotICAgICAgICBFeHRlbmRlZENvbXBsZXhUeXBlIGV4dGVuZGVkQ29tcGxleFR5cGUgPSBuZXcgRXh0ZW5kZWRDb21wbGV4VHlwZSgpOwotICAgICAgICB0ZXN0Q29tcGxleEVsZW1lbnQuc2V0VGVzdENvbXBsZXhFbGVtZW50KGV4dGVuZGVkQ29tcGxleFR5cGUpOwotICAgICAgICBleHRlbmRlZENvbXBsZXhUeXBlLnNldEZpcnN0KCJBbWlsYSIpOwotICAgICAgICBleHRlbmRlZENvbXBsZXhUeXBlLnNldE1pZGRsZSgiQ2hpbnRoYWthIik7Ci0gICAgICAgIGV4dGVuZGVkQ29tcGxleFR5cGUuc2V0TGFzdCgiU3VyaWFyYWNoY2hpIik7Ci0gICAgICAgIGV4dGVuZGVkQ29tcGxleFR5cGUuc2V0UGFyZW50RWxlbWVudDEoInRlc3QxIik7Ci0gICAgICAgIGV4dGVuZGVkQ29tcGxleFR5cGUuc2V0UGFyZW50RWxlbWVudDIoInRlc3QyIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Q29tcGxleEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RDb21wbGV4RWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyOwotICAgICAgICAgICAgVGVzdENvbXBsZXhFbGVtZW50IHJlc3VsdDsKLQotICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICByZXN1bHQgPSBUZXN0Q29tcGxleEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0Q29tcGxleEVsZW1lbnQoKS5nZXRGaXJzdCgpLCJBbWlsYSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0Q29tcGxleEVsZW1lbnQoKS5nZXRNaWRkbGUoKSwiQ2hpbnRoYWthIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldExhc3QoKSwiU3VyaWFyYWNoY2hpIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnQxKCksInRlc3QxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnQyKCksInRlc3QyIik7Ci0KLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IFRlc3RDb21wbGV4RWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldEZpcnN0KCksIkFtaWxhIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4RWxlbWVudCgpLmdldE1pZGRsZSgpLCJDaGludGhha2EiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdENvbXBsZXhFbGVtZW50KCkuZ2V0TGFzdCgpLCJTdXJpYXJhY2hjaGkiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdENvbXBsZXhFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudDEoKSwidGVzdDEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdENvbXBsZXhFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudDIoKSwidGVzdDIiKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL1NpbXBsZUV4dGVuc2lvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZXh0ZW5zaW9uL1NpbXBsZUV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzZDEzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2V4dGVuc2lvbi9TaW1wbGVFeHRlbnNpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmV4dGVuc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZTsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuQmFzZVR5cGU7Ci1pbXBvcnQgdGVzdC5heGlzMi5hcGFjaGUub3JnLkZ1bGxOYW1lOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy5TaW1wbGVUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFNpbXBsZUV4dGVuc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUNvbXBsZXhFeHRlbnNpb24oKSB7Ci0gICAgICAgIEZ1bGxOYW1lIGZ1bGxOYW1lID0gbmV3IEZ1bGxOYW1lKCk7Ci0gICAgICAgIGZ1bGxOYW1lLnNldEZpcnN0KCJhbWlsYSIpOwotICAgICAgICBmdWxsTmFtZS5zZXRNaWRkbGUoImNoaW50aGFrYSIpOwotICAgICAgICBmdWxsTmFtZS5zZXRMYXN0KCJzdXJpYXJhY2hjaGkiKTsKLSAgICAgICAgZnVsbE5hbWUuc2V0TGFuZ3VhZ2UobmV3IExhbmd1YWdlKCJzaW5naGFsYSIpKTsKLSAgICAgICAgZnVsbE5hbWUuc2V0QXR0cmlidXRlMShCYXNlVHlwZS5GYWN0b3J5LmZyb21TdHJpbmcoQmFzZVR5cGUuX3MxLCAiIikpOwotCi0gICAgICAgIGZ1bGxOYW1lLnNldEF0dHJpYnV0ZTIoU2ltcGxlVHlwZS5GYWN0b3J5LmZyb21TdHJpbmcoIkFUVFJJQlVURSIsICIiKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBmdWxsTmFtZS5nZXRPTUVsZW1lbnQoRnVsbE5hbWUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlcjsKLSAgICAgICAgICAgIEZ1bGxOYW1lIG5ld0Z1bGxOYW1lOwotCi0gICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIG5ld0Z1bGxOYW1lID0gRnVsbE5hbWUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldEZpcnN0KCksICJhbWlsYSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldE1pZGRsZSgpLCAiY2hpbnRoYWthIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0TGFzdCgpLCAic3VyaWFyYWNoY2hpIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpLCAic2luZ2hhbGEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRBdHRyaWJ1dGUxKCkudG9TdHJpbmcoKSwgQmFzZVR5cGUuX3MxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRBdHRyaWJ1dGUyKCkudG9TdHJpbmcoKSwgIkFUVFJJQlVURSIpOwotCi0gICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBuZXdGdWxsTmFtZSA9IEZ1bGxOYW1lLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRGaXJzdCgpLCAiYW1pbGEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXdGdWxsTmFtZS5nZXRNaWRkbGUoKSwgImNoaW50aGFrYSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldExhc3QoKSwgInN1cmlhcmFjaGNoaSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0Z1bGxOYW1lLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSwgInNpbmdoYWxhIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0QXR0cmlidXRlMSgpLnRvU3RyaW5nKCksIEJhc2VUeXBlLl9zMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3RnVsbE5hbWUuZ2V0QXR0cmlidXRlMigpLnRvU3RyaW5nKCksICJBVFRSSUJVVEUiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZ3JvdXAvR3JvdXBUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2dyb3VwL0dyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZmM2I5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvZ3JvdXAvR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5ncm91cDsKLQotaW1wb3J0IGdyb3VwLnRlc3QuYXhpczIuYXBhY2hlLm9yZy4qOwotaW1wb3J0IGdyb3VwLnRlc3QuYXhpczIuYXBhY2hlLm9yZy5UZXN0QXR0cmlidXRlR3JvdXBFbGVtZW50OwotaW1wb3J0IGdyb3VwLnRlc3QuYXhpczIuYXBhY2hlLm9yZy5UZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBHcm91cFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQoKXsKLQotICAgICAgICBUZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQgdGVzdEdyb3VwU2VxdWVuY2VFbGVtZW50ID0gbmV3IFRlc3RTZXF1ZW5jZUdyb3VwRWxlbWVudCgpOwotICAgICAgICB0ZXN0R3JvdXBTZXF1ZW5jZUVsZW1lbnQuc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgVGVzdFNlcXVlbmNlR3JvdXAgdGVzdFNlcXVlbmNlR3JvdXAgPSBuZXcgVGVzdFNlcXVlbmNlR3JvdXAoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlR3JvdXAuc2V0U2VxdWVuY2VQYXJhbTEoInNlcXVlbmNlUGFyYW0xIik7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZUdyb3VwLnNldFNlcXVlbmNlUGFyYW0yKCJzZXF1ZW5jZVBhcmFtMiIpOwotICAgICAgICB0ZXN0R3JvdXBTZXF1ZW5jZUVsZW1lbnQuc2V0VGVzdFNlcXVlbmNlR3JvdXAodGVzdFNlcXVlbmNlR3JvdXApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgdGVzdEdyb3VwU2VxdWVuY2VFbGVtZW50LmdldE9NRWxlbWVudChUZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0U2VxdWVuY2VHcm91cEVsZW1lbnQgcmVzdWx0ID0gVGVzdFNlcXVlbmNlR3JvdXBFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0U2VxdWVuY2VHcm91cCgpLmdldFNlcXVlbmNlUGFyYW0xKCksInNlcXVlbmNlUGFyYW0xIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RTZXF1ZW5jZUdyb3VwKCkuZ2V0U2VxdWVuY2VQYXJhbTIoKSwic2VxdWVuY2VQYXJhbTIiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRTZXF1ZW5jZUdyb3VwRWxlbWVudCgpewotCi0gICAgICAgIFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudCB0ZXN0U2VxdWVuY2VOZXN0ZWRHcm91cEVsZW1lbnQgPSBuZXcgVGVzdFNlcXVlbmNlTmVzdGVkR3JvdXBFbGVtZW50KCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudC5zZXRQYXJhbTEoInBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwIHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwID0gbmV3IFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwLnNldE5lc3RlZFNlcXVlbmNlUGFyYW0xKCJuZXN0ZWRTZXF1ZW5jZVBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RTZXF1ZW5jZUdyb3VwIHRlc3RTZXF1ZW5jZUdyb3VwID0gbmV3IFRlc3RTZXF1ZW5jZUdyb3VwKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZUdyb3VwLnNldFNlcXVlbmNlUGFyYW0xKCJzZXF1ZW5jZVBhcmFtMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VHcm91cC5zZXRTZXF1ZW5jZVBhcmFtMigic2VxdWVuY2VQYXJhbTIiKTsKLQotICAgICAgICB0ZXN0U2VxdWVuY2VOZXN0ZWRHcm91cC5zZXRUZXN0U2VxdWVuY2VHcm91cCh0ZXN0U2VxdWVuY2VHcm91cCk7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlTmVzdGVkR3JvdXBFbGVtZW50LnNldFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwKHRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICB0ZXN0U2VxdWVuY2VOZXN0ZWRHcm91cEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNlcXVlbmNlTmVzdGVkR3JvdXBFbGVtZW50IHJlc3VsdCA9IFRlc3RTZXF1ZW5jZU5lc3RlZEdyb3VwRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCJwYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNlcXVlbmNlTmVzdGVkR3JvdXAoKS5nZXROZXN0ZWRTZXF1ZW5jZVBhcmFtMSgpLCJuZXN0ZWRTZXF1ZW5jZVBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0U2VxdWVuY2VOZXN0ZWRHcm91cCgpLmdldFRlc3RTZXF1ZW5jZUdyb3VwKCkuZ2V0U2VxdWVuY2VQYXJhbTEoKSwic2VxdWVuY2VQYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNlcXVlbmNlTmVzdGVkR3JvdXAoKS5nZXRUZXN0U2VxdWVuY2VHcm91cCgpLmdldFNlcXVlbmNlUGFyYW0yKCksInNlcXVlbmNlUGFyYW0yIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hvaWNlR3JvdXBFbGVtZW50KCl7Ci0KLSAgICAgICAgVGVzdENob2ljZUdyb3VwRWxlbWVudCB0ZXN0R3JvdXBDaG9pY2VFbGVtZW50ID0gbmV3IFRlc3RDaG9pY2VHcm91cEVsZW1lbnQoKTsKLSAgICAgICAgdGVzdEdyb3VwQ2hvaWNlRWxlbWVudC5zZXRQYXJhbTEoInBhcmFtMSIpOwotICAgICAgICBUZXN0Q2hvaWNlR3JvdXAgdGVzdENob2ljZUdyb3VwID0gbmV3IFRlc3RDaG9pY2VHcm91cCgpOwotICAgICAgICB0ZXN0Q2hvaWNlR3JvdXAuc2V0Q2hvaWNlUGFyYW0xKCJjaG9pY2VQYXJhbTEiKTsKLSAgICAgICAgdGVzdEdyb3VwQ2hvaWNlRWxlbWVudC5zZXRUZXN0Q2hvaWNlR3JvdXAodGVzdENob2ljZUdyb3VwKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgIHRlc3RHcm91cENob2ljZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RDaG9pY2VHcm91cEVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0Q2hvaWNlR3JvdXBFbGVtZW50IHJlc3VsdCA9IFRlc3RDaG9pY2VHcm91cEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0Q2hvaWNlR3JvdXAoKS5nZXRDaG9pY2VQYXJhbTEoKSwiY2hvaWNlUGFyYW0xIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ2hvaWNlR3JvdXBFbGVtZW50KCl7Ci0KLSAgICAgICAgVGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudCB0ZXN0Q2hvaWNlTmVzdGVkR3JvdXBFbGVtZW50ID0gbmV3IFRlc3RDaG9pY2VOZXN0ZWRHcm91cEVsZW1lbnQoKTsKLSAgICAgICAgdGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5zZXRQYXJhbTEoInBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDaG9pY2VOZXN0ZWRHcm91cCB0ZXN0Q2hvaWNlTmVzdGVkR3JvdXAgPSBuZXcgVGVzdENob2ljZU5lc3RlZEdyb3VwKCk7Ci0gICAgICAgIHRlc3RDaG9pY2VOZXN0ZWRHcm91cC5zZXROZXN0ZWRDaG9pY2VQYXJhbTEoIm5lc3RlZENob2ljZVBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDaG9pY2VHcm91cCB0ZXN0Q2hvaWNlR3JvdXAgPSBuZXcgVGVzdENob2ljZUdyb3VwKCk7Ci0gICAgICAgIHRlc3RDaG9pY2VHcm91cC5zZXRDaG9pY2VQYXJhbTEoImNob2ljZVBhcmFtMSIpOwotCi0gICAgICAgIHRlc3RDaG9pY2VOZXN0ZWRHcm91cC5zZXRUZXN0Q2hvaWNlR3JvdXAodGVzdENob2ljZUdyb3VwKTsKLQotICAgICAgICB0ZXN0Q2hvaWNlTmVzdGVkR3JvdXBFbGVtZW50LnNldFRlc3RDaG9pY2VOZXN0ZWRHcm91cCh0ZXN0Q2hvaWNlTmVzdGVkR3JvdXApOwotCi0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgdGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5nZXRPTUVsZW1lbnQodGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RDaG9pY2VOZXN0ZWRHcm91cEVsZW1lbnQgcmVzdWx0ID0gVGVzdENob2ljZU5lc3RlZEdyb3VwRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDaG9pY2VOZXN0ZWRHcm91cCgpLmdldFRlc3RDaG9pY2VHcm91cCgpLmdldENob2ljZVBhcmFtMSgpLCJjaG9pY2VQYXJhbTEiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlR3JvdXAoKXsKLSAgICAgICAgIFRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQgdGVzdEF0dHJpYnV0ZUdyb3VwID0gbmV3IFRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQoKTsKLSAgICAgICAgIHRlc3RBdHRyaWJ1dGVHcm91cC5zZXRBdHRyaWJ1dGUxKCJBdHRyaWJ1dGUxIik7Ci0gICAgICAgICB0ZXN0QXR0cmlidXRlR3JvdXAuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgdGVzdEF0dHJpYnV0ZUdyb3VwLmdldE9NRWxlbWVudChUZXN0QXR0cmlidXRlR3JvdXBFbGVtZW50Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgIFRlc3RBdHRyaWJ1dGVHcm91cEVsZW1lbnQgcmVzdWx0ID0gVGVzdEF0dHJpYnV0ZUdyb3VwRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwiUGFyYW0xIik7Ci0gICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdHRyaWJ1dGUxKCksIkF0dHJpYnV0ZTEiKTsKLSAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICB9Ci0KLSAgICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwKCl7Ci0gICAgICAgICBUZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50IHRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQgPSBuZXcgVGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwRWxlbWVudCgpOwotICAgICAgICAgdGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwRWxlbWVudC5zZXRBdHRyaWJ1dGUxKCJBdHRyaWJ1dGUxIik7Ci0gICAgICAgICB0ZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50LnNldEF0dHJpYnV0ZTIoIkF0dHJpYnV0ZTIiKTsKLSAgICAgICAgIHRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIHRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3ROZXN0ZWRBdHRyaWJ1dGVHcm91cEVsZW1lbnQuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgVGVzdE5lc3RlZEF0dHJpYnV0ZUdyb3VwRWxlbWVudCByZXN1bHQgPSBUZXN0TmVzdGVkQXR0cmlidXRlR3JvdXBFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCJQYXJhbTEiKTsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKSwiQXR0cmlidXRlMSIpOwotICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMigpLCJBdHRyaWJ1dGUyIik7Ci0gICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgfQotCi0gICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJDaG9pY2UvSW5uZXJDaG9pY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2lubmVyQ2hvaWNlL0lubmVyQ2hvaWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRkNWY1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJDaG9pY2UvSW5uZXJDaG9pY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pbm5lckNob2ljZTsKLQotaW1wb3J0IGNvbS5teW5hbWVzcGFjZS50ZXN0aW5uZXJwYXJ0aWNsZS5UZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IHRlc3QuYXhpczIuYXBhY2hlLm9yZy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIElubmVyQ2hvaWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lckNob2ljZTEoKSB7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMSB0ZXN0U2VxdWVuY2UgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UxKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTEoInRlc3Qgc2VxdWVuY2UiKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMigzKTsKLQotICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTFDaG9pY2VfdHlwZTAgVGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwID0gbmV3IFRlc3RJbm5lclNlcXVlbmNlMUNob2ljZV90eXBlMCgpOwotICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTFDaG9pY2VfdHlwZTAuc2V0Q2hvaWNlMSgidGVzdCBjaG9pY2UiKTsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwLnNldENob2ljZTIoNSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTFDaG9pY2VfdHlwZTAoVGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTZXF1ZW5jZS5nZXRPTUVsZW1lbnQoVGVzdElubmVyU2VxdWVuY2UxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTWVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTEgcmVzdWx0ID0gVGVzdElubmVyU2VxdWVuY2UxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U2VxdWVuY2UxKCksICJ0ZXN0IHNlcXVlbmNlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFNlcXVlbmNlMigpLCAzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyU2VxdWVuY2UxQ2hvaWNlX3R5cGUwKCkuZ2V0Q2hvaWNlMigpLCA1KTsKLQotICAgICAgICAgICAgLy8gd3JpdHRpZyByZXN1bHQgYmFjawotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgbXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyID0gbmV3IE1UT01Bd2FyZVhNTFNlcmlhbGl6ZXIoeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIudGVzdCIsICJUZXN0SW5uZXJTZXF1ZW5jZTEiLCAiZm9vIikKLSAgICAgICAgICAgICAgICAgICAgLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksIG10b21Bd2FyZVhNTFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyQ2hvaWNlMjEoKSB7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMiB0ZXN0U2VxdWVuY2UgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTEoInNlcXVlbmNlIik7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTIoMyk7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCB0ZXN0SW5uZXJTZXF1ZW5jZTJDaG9pY2VfdHlwZTEgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMS5zZXRDaG9pY2UxKG5ldyBTdHJpbmdbXXsiY2hvaWNlMSIsICJjaG9pY2UyIn0pOwotICAgICAgICB0ZXN0U2VxdWVuY2Uuc2V0VGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUwKHRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2VxdWVuY2UuZ2V0T01FbGVtZW50KFRlc3RJbm5lclNlcXVlbmNlMi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTWVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTIgcmVzdWx0ID0gVGVzdElubmVyU2VxdWVuY2UyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U2VxdWVuY2UxKCksICJzZXF1ZW5jZSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTIoKSwgMyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0LmdldFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCgpLmdldENob2ljZTEoKSwgbmV3IFN0cmluZ1tdeyJjaG9pY2UxIiwgImNob2ljZTIifSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyQ2hvaWNlMjIoKSB7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMiB0ZXN0U2VxdWVuY2UgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTEoInNlcXVlbmNlIik7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRTZXF1ZW5jZTIoMyk7Ci0gICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCB0ZXN0SW5uZXJTZXF1ZW5jZTJDaG9pY2VfdHlwZTEgPSBuZXcgVGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMS5zZXRDaG9pY2UyKG5ldyBpbnRbXXsyLCA0fSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTJDaG9pY2VfdHlwZTAodGVzdElubmVyU2VxdWVuY2UyQ2hvaWNlX3R5cGUxKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFNlcXVlbmNlLmdldE9NRWxlbWVudChUZXN0SW5uZXJTZXF1ZW5jZTIuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTWVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJTZXF1ZW5jZTIgcmVzdWx0ID0gVGVzdElubmVyU2VxdWVuY2UyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U2VxdWVuY2UxKCksICJzZXF1ZW5jZSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTIoKSwgMyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0LmdldFRlc3RJbm5lclNlcXVlbmNlMkNob2ljZV90eXBlMCgpLmdldENob2ljZTIoKSwgbmV3IGludFtdezIsIDR9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJDaG9pY2UzMSgpIHsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzIHRlc3RTZXF1ZW5jZSA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTMoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMSgic2VxdWVuY2UiKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMigzKTsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwIHRlc3RJbm5lclNlcXVlbmNlM0Nob2ljZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAoKTsKLSAgICAgICAgdGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwLnNldENob2ljZTEobmV3IFN0cmluZ1tdeyJjaG9pY2UxIiwgbnVsbCwgImNob2ljZTIifSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAodGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2VxdWVuY2UuZ2V0T01FbGVtZW50KFRlc3RJbm5lclNlcXVlbmNlMy5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NZWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMyByZXN1bHQgPSBUZXN0SW5uZXJTZXF1ZW5jZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTEoKSwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFNlcXVlbmNlMigpLCAzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHQuZ2V0VGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKCkuZ2V0Q2hvaWNlMSgpLCBuZXcgU3RyaW5nW117ImNob2ljZTEiLCBudWxsLCAiY2hvaWNlMiJ9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJDaG9pY2UzMigpIHsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzIHRlc3RTZXF1ZW5jZSA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTMoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMSgic2VxdWVuY2UiKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlLnNldFNlcXVlbmNlMigzKTsKLSAgICAgICAgVGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwIHRlc3RJbm5lclNlcXVlbmNlM0Nob2ljZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAoKTsKLSAgICAgICAgdGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwLnNldENob2ljZTIobmV3IGludFtdezIsIEludGVnZXIuTUlOX1ZBTFVFLCA2fSk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZS5zZXRUZXN0SW5uZXJTZXF1ZW5jZTNDaG9pY2VfdHlwZTAodGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKTsKLQotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2VxdWVuY2UuZ2V0T01FbGVtZW50KFRlc3RJbm5lclNlcXVlbmNlMy5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NZWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclNlcXVlbmNlMyByZXN1bHQgPSBUZXN0SW5uZXJTZXF1ZW5jZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTZXF1ZW5jZTEoKSwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFNlcXVlbmNlMigpLCAzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHQuZ2V0VGVzdElubmVyU2VxdWVuY2UzQ2hvaWNlX3R5cGUwKCkuZ2V0Q2hvaWNlMigpLCBuZXcgaW50W117MiwgSW50ZWdlci5NSU5fVkFMVUUsIDZ9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKFN0cmluZ1tdIHRlc3QxLCBTdHJpbmdbXSB0ZXN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSB0cnVlOwotICAgICAgICBpZiAodGVzdDEubGVuZ3RoICE9IHRlc3QyLmxlbmd0aCkgewotICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0MS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0MVtpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGVzdDFbaV0uZXF1YWxzKHRlc3QyW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdDJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKGludFtdIHRlc3QxLCBpbnRbXSB0ZXN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSB0cnVlOwotICAgICAgICBpZiAodGVzdDEubGVuZ3RoICE9IHRlc3QyLmxlbmd0aCkgewotICAgICAgICAgICAgaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0MS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0MVtpXSAhPSB0ZXN0MltpXSkgewotICAgICAgICAgICAgICAgICAgICBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2lubmVycGFydGljbGVleHRlbnNpb24vVGVzdElubmVyUGFydGljbGVFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJwYXJ0aWNsZWV4dGVuc2lvbi9UZXN0SW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNkNjc2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJwYXJ0aWNsZWV4dGVuc2lvbi9UZXN0SW5uZXJQYXJ0aWNsZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5pbm5lcnBhcnRpY2xlZXh0ZW5zaW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudGVtcHVyaS5pbm5lcnBhcnRpY2FsZXh0ZW5zaW9uLkNoaWxkRWxlbWVudF90eXBlMDsKLWltcG9ydCBvcmcudGVtcHVyaS5pbm5lcnBhcnRpY2FsZXh0ZW5zaW9uLlBhcmVudFR5cGVDaG9pY2U7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuaW5uZXJwYXJ0aWNhbGV4dGVuc2lvbi5UZXN0RWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5uZXJQYXJ0aWNsZUV4dGVuc2lvbiBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0RWxlbWVudCgpewotICAgICAgICBUZXN0RWxlbWVudCB0ZXN0RWxlbWVudCA9IG5ldyBUZXN0RWxlbWVudCgpOwotCi0gICAgICAgIENoaWxkRWxlbWVudF90eXBlMCBjaGlsZEVsZW1lbnRfdHlwZTBbXSA9IG5ldyBDaGlsZEVsZW1lbnRfdHlwZTBbMl07Ci0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFswXSA9IG5ldyBDaGlsZEVsZW1lbnRfdHlwZTAoKTsKLSAgICAgICAgY2hpbGRFbGVtZW50X3R5cGUwWzBdLnNldFRlc3RBdHRyaWJ1dGUoIlRlc3QgQXR0cmlidXRlIik7Ci0KLSAgICAgICAgUGFyZW50VHlwZUNob2ljZVtdIHBhcmVudFR5cGVDaG9pY2VzID0gbmV3IFBhcmVudFR5cGVDaG9pY2VbMl07Ci0gICAgICAgIHBhcmVudFR5cGVDaG9pY2VzWzBdID0gbmV3IFBhcmVudFR5cGVDaG9pY2UoKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMF0uc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMV0gPSBuZXcgUGFyZW50VHlwZUNob2ljZSgpOwotICAgICAgICBwYXJlbnRUeXBlQ2hvaWNlc1sxXS5zZXRQYXJhbTIoInBhcmFtMiIpOwotCi0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFswXS5zZXRQYXJlbnRUeXBlQ2hvaWNlKHBhcmVudFR5cGVDaG9pY2VzKTsKLQotICAgICAgICBjaGlsZEVsZW1lbnRfdHlwZTBbMV0gPSBuZXcgQ2hpbGRFbGVtZW50X3R5cGUwKCk7Ci0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFsxXS5zZXRUZXN0QXR0cmlidXRlKCJUZXN0IEF0dHJpYnV0ZSIpOwotCi0gICAgICAgIHBhcmVudFR5cGVDaG9pY2VzID0gbmV3IFBhcmVudFR5cGVDaG9pY2VbMl07Ci0gICAgICAgIHBhcmVudFR5cGVDaG9pY2VzWzBdID0gbmV3IFBhcmVudFR5cGVDaG9pY2UoKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMF0uc2V0UGFyYW0xKCJwYXJhbTEiKTsKLSAgICAgICAgcGFyZW50VHlwZUNob2ljZXNbMV0gPSBuZXcgUGFyZW50VHlwZUNob2ljZSgpOwotICAgICAgICBwYXJlbnRUeXBlQ2hvaWNlc1sxXS5zZXRQYXJhbTIoInBhcmFtMiIpOwotCi0gICAgICAgIGNoaWxkRWxlbWVudF90eXBlMFsxXS5zZXRQYXJlbnRUeXBlQ2hvaWNlKHBhcmVudFR5cGVDaG9pY2VzKTsKLQotICAgICAgICB0ZXN0RWxlbWVudC5zZXRDaGlsZEVsZW1lbnQoY2hpbGRFbGVtZW50X3R5cGUwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RFbGVtZW50LmdldE9NRWxlbWVudChUZXN0RWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgc3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEVsZW1lbnQgcmVzdWx0ID0gVGVzdEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVswXS5nZXRUZXN0QXR0cmlidXRlKCksIlRlc3QgQXR0cmlidXRlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldENoaWxkRWxlbWVudCgpWzFdLmdldFRlc3RBdHRyaWJ1dGUoKSwiVGVzdCBBdHRyaWJ1dGUiKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVswXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMF0uZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVswXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMV0uZ2V0UGFyYW0yKCksInBhcmFtMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVsxXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMF0uZ2V0UGFyYW0xKCksInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDaGlsZEVsZW1lbnQoKVsxXS5nZXRQYXJlbnRUeXBlQ2hvaWNlKClbMV0uZ2V0UGFyYW0yKCksInBhcmFtMiIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pbm5lcnBhcnRpY2xlcy9Jbm5lclBhcnRpY2xlc1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvaW5uZXJwYXJ0aWNsZXMvSW5uZXJQYXJ0aWNsZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOTdlNDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9pbm5lcnBhcnRpY2xlcy9Jbm5lclBhcnRpY2xlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLmlubmVycGFydGljbGVzOwotCi1pbXBvcnQgY29tLm15bmFtZXNwYWNlLnRlc3Rpbm5lcnBhcnRpY2xlLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotCi1wdWJsaWMgY2xhc3MgSW5uZXJQYXJ0aWNsZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGUxKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMSB0ZXN0SW5uZXJQYXJ0aWNsZTEgPSBuZXcgVGVzdElubmVyUGFydGljbGUxKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMS5zZXRQYXJhbTEoIlBhcmFtMSIpOwotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCB0ZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMC5zZXRQYXJhbTIoIlBhcmFtMiIpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMC5zZXRQYXJhbTMoIlBhcmFtMyIpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTEuc2V0VGVzdElubmVyUGFydGljbGUxU2VxdWVuY2VfdHlwZTAodGVzdElubmVyUGFydGljbGUxU2VxdWVuY2VfdHlwZTApOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTEuc2V0UGFyYW00KCJQYXJhbTQiKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0SW5uZXJQYXJ0aWNsZTEuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlMS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMSByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgIlBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJQYXJ0aWNsZTFTZXF1ZW5jZV90eXBlMCgpLmdldFBhcmFtMigpLCAiUGFyYW0yIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RJbm5lclBhcnRpY2xlMVNlcXVlbmNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGUyKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMiB0ZXN0SW5uZXJQYXJ0aWNsZTIgPSBuZXcgVGVzdElubmVyUGFydGljbGUyKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMi5zZXRQYXJhbTEoIlBhcmFtMSIpOwotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTAgdGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlMkNob2ljZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxLnNldFBhcmFtMygiUGFyYW0zIik7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMi5zZXRUZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTAodGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUyLnNldFBhcmFtNCgiUGFyYW00Iik7Ci0KLSAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGUyLmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTIuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTIgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGUyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksICJQYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGUzMSgpIHsKLQotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTMgdGVzdElubmVyUGFydGljbGUzID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlMygpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTMuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTMuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlMy5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMyByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgIlBhcmFtMSIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTMyKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMyB0ZXN0SW5uZXJQYXJ0aWNsZTMgPSBuZXcgVGVzdElubmVyUGFydGljbGUzKCk7Ci0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMCB0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEgPSBuZXcgVGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMS5zZXRQYXJhbTIoIlBhcmFtMiIpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEuc2V0UGFyYW0zKCJQYXJhbTMiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUzLnNldFRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMCh0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGUzLmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTMgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGUzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTMzKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlMyB0ZXN0SW5uZXJQYXJ0aWNsZTMgPSBuZXcgVGVzdElubmVyUGFydGljbGUzKCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMy5zZXRQYXJhbTEoIlBhcmFtMSIpOwotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTAgdGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUxID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlM0Nob2ljZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTEuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUxLnNldFBhcmFtMygiUGFyYW0zIik7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlMy5zZXRUZXN0SW5uZXJQYXJ0aWNsZTNDaG9pY2VfdHlwZTAodGVzdElubmVyUGFydGljbGUzQ2hvaWNlX3R5cGUxKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUzLnNldFBhcmFtNCgiUGFyYW00Iik7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGUzLmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTMgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGUzLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElubmVyUGFydGljbGU0MSgpIHsKLQotICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTQgdGVzdElubmVyUGFydGljbGU0ID0gbmV3IFRlc3RJbm5lclBhcnRpY2xlNCgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTQuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTQuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlNC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNCByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgIlBhcmFtMSIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lclBhcnRpY2xlNDIoKSB7Ci0KLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0IHRlc3RJbm5lclBhcnRpY2xlNCA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTQoKTsKLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAgPSBuZXcgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAoKTsKLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgVGVzdElubmVyUGFydGljbGU0U2VxdWVuY2VfdHlwZTAuc2V0UGFyYW0zKCJQYXJhbTMiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGU0LnNldFRlc3RJbm5lclBhcnRpY2xlNFNlcXVlbmNlX3R5cGUwKFRlc3RJbm5lclBhcnRpY2xlNFNlcXVlbmNlX3R5cGUwKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTQuZ2V0T01FbGVtZW50KFRlc3RJbm5lclBhcnRpY2xlNC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNCByZXN1bHQgPSBUZXN0SW5uZXJQYXJ0aWNsZTQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJQYXJ0aWNsZTRTZXF1ZW5jZV90eXBlMCgpLmdldFBhcmFtMigpLCAiUGFyYW0yIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RJbm5lclBhcnRpY2xlNFNlcXVlbmNlX3R5cGUwKCkuZ2V0UGFyYW0zKCksICJQYXJhbTMiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTQzKCkgewotCi0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNCB0ZXN0SW5uZXJQYXJ0aWNsZTQgPSBuZXcgVGVzdElubmVyUGFydGljbGU0KCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlNC5zZXRQYXJhbTQoIlBhcmFtNCIpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgdGVzdElubmVyUGFydGljbGU0LmdldE9NRWxlbWVudChUZXN0SW5uZXJQYXJ0aWNsZTQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJQYXJ0aWNsZTQgcmVzdWx0ID0gVGVzdElubmVyUGFydGljbGU0LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJQYXJ0aWNsZTUoKSB7Ci0KLSAgICAgICAgVGVzdElubmVyUGFydGljbGU1IHRlc3RJbm5lclBhcnRpY2xlNSA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTUoKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGU1LnNldFBhcmFtMSgiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RJbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUxIHRlc3RJbm5lclBhcnRpY2xlMkNob2ljZV90eXBlMSA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMSgpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEuc2V0UGFyYW0yKCJQYXJhbTIiKTsKLSAgICAgICAgdGVzdElubmVyUGFydGljbGUyQ2hvaWNlX3R5cGUxLnNldFBhcmFtMygiUGFyYW0zIik7Ci0KLSAgICAgICAgVGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTAgaW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCA9IG5ldyBUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCgpOwotICAgICAgICBpbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUwLnNldFBhcmFtNCgiUGFyYW00Iik7Ci0gICAgICAgIGlubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTAuc2V0UGFyYW01KCJQYXJhbTUiKTsKLQotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEuc2V0VGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTAoaW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCk7Ci0gICAgICAgIHRlc3RJbm5lclBhcnRpY2xlNS5zZXRUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMSh0ZXN0SW5uZXJQYXJ0aWNsZTJDaG9pY2VfdHlwZTEpOwotICAgICAgICB0ZXN0SW5uZXJQYXJ0aWNsZTUuc2V0UGFyYW02KCJQYXJhbTYiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RJbm5lclBhcnRpY2xlNS5nZXRPTUVsZW1lbnQoVGVzdElubmVyUGFydGljbGU1Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdElubmVyUGFydGljbGU1IHJlc3VsdCA9IFRlc3RJbm5lclBhcnRpY2xlNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCAiUGFyYW0xIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RJbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUxKCkuZ2V0UGFyYW0yKCksICJQYXJhbTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTEoKS5nZXRQYXJhbTMoKSwgIlBhcmFtMyIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMSgpLmdldFRlc3RJbm5lclBhcnRpY2xlNVNlcXVlbmNlX3R5cGUwKCkuZ2V0UGFyYW00KCksICJQYXJhbTQiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyUGFydGljbGU1U2VxdWVuY2VfdHlwZTEoKS5nZXRUZXN0SW5uZXJQYXJ0aWNsZTVTZXF1ZW5jZV90eXBlMCgpLmdldFBhcmFtNSgpLCAiUGFyYW01Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNigpLCAiUGFyYW02Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnR0ZXJQYXJ0aWNhbEV4dGVuc2lvbigpewotICAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uIHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbiA9IG5ldyBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24oKTsKLQotICAgICAgICBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlIHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbkNoaWxkQ29tcGxleFR5cGUgPQotICAgICAgICAgICAgICAgIG5ldyBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlKCk7Ci0gICAgICAgIHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbi5zZXRUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24odGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uQ2hpbGRDb21wbGV4VHlwZSk7Ci0KLSAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGVDaG9pY2VfdHlwZTAgdGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGVDaG9pY2VfdHlwZTAgPQotICAgICAgICAgICAgICAgIG5ldyBUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZUNob2ljZV90eXBlMCgpOwotICAgICAgICB0ZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlLnNldFRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvblBhcmVudENvbXBsZXhUeXBlQ2hvaWNlX3R5cGUwKHRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvblBhcmVudENvbXBsZXhUeXBlQ2hvaWNlX3R5cGUwKTsKLQotICAgICAgICB0ZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZUNob2ljZV90eXBlMC5zZXRQYXJhbTEoInBhcmFtMSIpOwotICAgICAgICB0ZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25QYXJlbnRDb21wbGV4VHlwZUNob2ljZV90eXBlMC5zZXRQYXJhbTIoInBhcmFtMiIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uLmdldE9NRWxlbWVudChUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24uTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uIHJlc3VsdCA9IFRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb24oKSBpbnN0YW5jZW9mIFRlc3RJbm50ZXJQYXJ0aWNsZUV4dGVuc2lvbkNoaWxkQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgVGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uQ2hpbGRDb21wbGV4VHlwZSByZXN1bHRDb21wbGV4VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgIChUZXN0SW5udGVyUGFydGljbGVFeHRlbnNpb25DaGlsZENvbXBsZXhUeXBlKSByZXN1bHQuZ2V0VGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q29tcGxleFR5cGUuZ2V0VGVzdElubnRlclBhcnRpY2xlRXh0ZW5zaW9uUGFyZW50Q29tcGxleFR5cGVDaG9pY2VfdHlwZTAoKS5nZXRQYXJhbTIoKSwicGFyYW0yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENvbXBsZXhUeXBlRWxlbWVudCgpewotICAgICAgICBUZXN0Q29tcGxleFR5cGVFbGVtZW50IHRlc3RDb21wbGV4VHlwZUVsZW1lbnQgPSBuZXcgVGVzdENvbXBsZXhUeXBlRWxlbWVudCgpOwotCi0gICAgICAgIFRlc3RDb21wbGV4VHlwZSB0ZXN0Q29tcGxleFR5cGUgPSBuZXcgVGVzdENvbXBsZXhUeXBlKCk7Ci0gICAgICAgIHRlc3RDb21wbGV4VHlwZUVsZW1lbnQuc2V0VGVzdENvbXBsZXhUeXBlRWxlbWVudCh0ZXN0Q29tcGxleFR5cGUpOwotCi0gICAgICAgIFRlc3RFbGVtZW50X3R5cGUwIHRlc3RFbGVtZW50X3R5cGUwID0gbmV3IFRlc3RFbGVtZW50X3R5cGUwKCk7Ci0gICAgICAgIHRlc3RFbGVtZW50X3R5cGUwLnNldFBhcmFtKCJwYXJhbSIpOwotICAgICAgICB0ZXN0Q29tcGxleFR5cGUuc2V0VGVzdEVsZW1lbnQodGVzdEVsZW1lbnRfdHlwZTApOwotCi0gICAgICAgIFRlc3RDb21wbGV4VHlwZVNlcXVlbmNlX3R5cGUwIHRlc3RDb21wbGV4VHlwZVNlcXVlbmNlX3R5cGUwID0gbmV3IFRlc3RDb21wbGV4VHlwZVNlcXVlbmNlX3R5cGUwKCk7Ci0gICAgICAgIHRlc3RDb21wbGV4VHlwZS5zZXRUZXN0Q29tcGxleFR5cGVTZXF1ZW5jZV90eXBlMCh0ZXN0Q29tcGxleFR5cGVTZXF1ZW5jZV90eXBlMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0Q29tcGxleFR5cGVFbGVtZW50LmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdENvbXBsZXhUeXBlRWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RDb21wbGV4VHlwZUVsZW1lbnQgcmVzdWx0ID0gVGVzdENvbXBsZXhUeXBlRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RDb21wbGV4VHlwZUVsZW1lbnQoKS5nZXRUZXN0RWxlbWVudCgpLmdldFBhcmFtKCksInBhcmFtIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvbGlzdC9MaXN0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9saXN0L0xpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2QwM2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9saXN0L0xpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5saXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCB0ZXN0LmF4aXMyLmFwYWNoZS5vcmcuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgTGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U3RyaW5nKCl7Ci0KLSAgICAgICAgVGVzdExpc3RTdHJpbmdFbGVtZW50IHRlc3RMaXN0U3RyaW5nRWxlbWVudCA9IG5ldyBUZXN0TGlzdFN0cmluZ0VsZW1lbnQoKTsKLSAgICAgICAgVGVzdExpc3RTdHJpbmcgdGVzdExpc3RTdHJpbmcgPSBuZXcgVGVzdExpc3RTdHJpbmcoKTsKLSAgICAgICAgdGVzdExpc3RTdHJpbmdFbGVtZW50LnNldFRlc3RMaXN0U3RyaW5nRWxlbWVudCh0ZXN0TGlzdFN0cmluZyk7Ci0gICAgICAgIHRlc3RMaXN0U3RyaW5nLnNldFN0cmluZyhuZXcgU3RyaW5nW117InN0cmluZzEiLCJzdHJpbmcyIn0pOwotCi0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RMaXN0U3RyaW5nRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdExpc3RTdHJpbmdFbGVtZW50Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RMaXN0U3RyaW5nRWxlbWVudCByZXN1bHQgPSBUZXN0TGlzdFN0cmluZ0VsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RMaXN0U3RyaW5nLnRvU3RyaW5nKCkscmVzdWx0LmdldFRlc3RMaXN0U3RyaW5nRWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0UU5hbWUoKXsKLQotICAgICAgICBUZXN0TGlzdFFOYW1lRWxlbWVudCB0ZXN0TGlzdFFOYW1lRWxlbWVudCA9IG5ldyBUZXN0TGlzdFFOYW1lRWxlbWVudCgpOwotICAgICAgICBUZXN0TGlzdFFOYW1lIHRlc3RMaXN0UU5hbWUgPSBuZXcgVGVzdExpc3RRTmFtZSgpOwotICAgICAgICB0ZXN0TGlzdFFOYW1lLnNldFFOYW1lKG5ldyBRTmFtZVtde25ldyBRTmFtZSgiaHR0cDovL3d3dy5nb29nbGUuY29tIiwidGVzdDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5nb29nbGUuY29tIiwidGVzdDIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5nb29nbGUiLCJ0ZXN0MyIpfSk7Ci0gICAgICAgIHRlc3RMaXN0UU5hbWVFbGVtZW50LnNldFRlc3RMaXN0UU5hbWVFbGVtZW50KHRlc3RMaXN0UU5hbWUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdExpc3RRTmFtZUVsZW1lbnQuZ2V0T01FbGVtZW50KFRlc3RMaXN0UU5hbWVFbGVtZW50Lk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdExpc3RRTmFtZUVsZW1lbnQgcmVzdWx0ID0gVGVzdExpc3RRTmFtZUVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0TGlzdFFOYW1lRWxlbWVudCgpLmdldFFOYW1lKClbMF0sdGVzdExpc3RRTmFtZS5nZXRRTmFtZSgpWzBdKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdExpc3RRTmFtZUVsZW1lbnQoKS5nZXRRTmFtZSgpWzFdLHRlc3RMaXN0UU5hbWUuZ2V0UU5hbWUoKVsxXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0UU5hbWVFbGVtZW50KCkuZ2V0UU5hbWUoKVsyXSx0ZXN0TGlzdFFOYW1lLmdldFFOYW1lKClbMl0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE91cnMoKXsKLQotICAgICAgICBUZXN0TGlzdE91cnNFbGVtZW50IHRlc3RMaXN0T3Vyc0VsZW1lbnQgPSBuZXcgVGVzdExpc3RPdXJzRWxlbWVudCgpOwotICAgICAgICBUZXN0TGlzdE91cnMgdGVzdExpc3RPdXJzID0gbmV3IFRlc3RMaXN0T3VycygpOwotICAgICAgICB0ZXN0TGlzdE91cnNFbGVtZW50LnNldFRlc3RMaXN0T3Vyc0VsZW1lbnQodGVzdExpc3RPdXJzKTsKLSAgICAgICAgVGVzdFN0cmluZyB0ZXN0U3RyaW5nMSA9IG5ldyBUZXN0U3RyaW5nKCk7Ci0gICAgICAgIHRlc3RTdHJpbmcxLnNldFRlc3RTdHJpbmcoInRlc3QiKTsKLSAgICAgICAgVGVzdFN0cmluZyB0ZXN0U3RyaW5nMiA9IG5ldyBUZXN0U3RyaW5nKCk7Ci0gICAgICAgIHRlc3RTdHJpbmcyLnNldFRlc3RTdHJpbmcoInRlc3QiKTsKLSAgICAgICAgVGVzdFN0cmluZyB0ZXN0U3RyaW5nMyA9IG5ldyBUZXN0U3RyaW5nKCk7Ci0gICAgICAgIHRlc3RTdHJpbmczLnNldFRlc3RTdHJpbmcoInRlc3QiKTsKLSAgICAgICAgdGVzdExpc3RPdXJzLnNldFRlc3RTdHJpbmcobmV3IFRlc3RTdHJpbmdbXXt0ZXN0U3RyaW5nMSx0ZXN0U3RyaW5nMix0ZXN0U3RyaW5nM30pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdExpc3RPdXJzRWxlbWVudC5nZXRPTUVsZW1lbnQoVGVzdExpc3RPdXJzRWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RMaXN0T3Vyc0VsZW1lbnQgcmVzdWx0ID0gVGVzdExpc3RPdXJzRWxlbWVudC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0T3Vyc0VsZW1lbnQoKS5nZXRUZXN0U3RyaW5nKClbMF0uZ2V0VGVzdFN0cmluZygpLHRlc3RTdHJpbmcxLmdldFRlc3RTdHJpbmcoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0T3Vyc0VsZW1lbnQoKS5nZXRUZXN0U3RyaW5nKClbMV0uZ2V0VGVzdFN0cmluZygpLHRlc3RTdHJpbmcyLmdldFRlc3RTdHJpbmcoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RMaXN0T3Vyc0VsZW1lbnQoKS5nZXRUZXN0U3RyaW5nKClbMl0uZ2V0VGVzdFN0cmluZygpLHRlc3RTdHJpbmczLmdldFRlc3RTdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0U3VwZXIoKXsKLQotICAgICAgICBTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCBzdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCA9IG5ldyBTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudCgpOwotICAgICAgICBTdXBlclRlc3RMaXN0U3RyaW5nIHN1cGVyVGVzdExpc3RTdHJpbmcgPSBuZXcgU3VwZXJUZXN0TGlzdFN0cmluZygpOwotICAgICAgICBzdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudC5zZXRTdXBlclRlc3RMaXN0U3RyaW5nRWxlbWVudChzdXBlclRlc3RMaXN0U3RyaW5nKTsKLSAgICAgICAgc3VwZXJUZXN0TGlzdFN0cmluZy5zZXRTdHJpbmcobmV3IFN0cmluZ1tdeyJ0ZXN0MSIsInRlc3QyIiwidGVzdDMifSk7Ci0KLSAgICAgICB0cnkgewotICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gc3VwZXJUZXN0TGlzdFN0cmluZ0VsZW1lbnQuZ2V0T01FbGVtZW50KFN1cGVyVGVzdExpc3RTdHJpbmdFbGVtZW50Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU3VwZXJUZXN0TGlzdFN0cmluZ0VsZW1lbnQgcmVzdWx0ID0gU3VwZXJUZXN0TGlzdFN0cmluZ0VsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN1cGVyVGVzdExpc3RTdHJpbmcuZ2V0U3RyaW5nKClbMF0scmVzdWx0LmdldFN1cGVyVGVzdExpc3RTdHJpbmdFbGVtZW50KCkuZ2V0U3RyaW5nKClbMF0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5uZXJTaW1wbGVUeXBlcygpewotICAgICAgICBUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSB0ZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSA9IG5ldyBUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSgpOwotICAgICAgICBJbm5lckxpc3RTaW1wbGVUeXBlIGlubmVyTGlzdFNpbXBsZVR5cGUgPSBuZXcgSW5uZXJMaXN0U2ltcGxlVHlwZSgpOwotICAgICAgICB0ZXN0SW5uZXJMaXN0U2ltcGxlVHlwZS5zZXRUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZShpbm5lckxpc3RTaW1wbGVUeXBlKTsKLSAgICAgICAgSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMFtdIGxpc3QgPSBuZXcgSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMFsyXTsKLSAgICAgICAgbGlzdFswXSA9IElubmVyTGlzdFNpbXBsZVR5cGVfdHlwZTAuQWNjZXNzOwotICAgICAgICBsaXN0WzFdID0gSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMC5FeGlzdDsKLQotICAgICAgICBpbm5lckxpc3RTaW1wbGVUeXBlLnNldElubmVyTGlzdFNpbXBsZVR5cGVfdHlwZTAobGlzdCk7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RJbm5lckxpc3RTaW1wbGVUeXBlLmdldE9NRWxlbWVudChUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lckxpc3RTaW1wbGVUeXBlIHJlc3VsdCA9IFRlc3RJbm5lckxpc3RTaW1wbGVUeXBlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdElubmVyTGlzdFNpbXBsZVR5cGUoKS5nZXRJbm5lckxpc3RTaW1wbGVUeXBlX3R5cGUwKClbMF0sSW5uZXJMaXN0U2ltcGxlVHlwZV90eXBlMC5BY2Nlc3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0SW5uZXJMaXN0U2ltcGxlVHlwZSgpLmdldElubmVyTGlzdFNpbXBsZVR5cGVfdHlwZTAoKVsxXSxJbm5lckxpc3RTaW1wbGVUeXBlX3R5cGUwLkV4aXN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wYXJ0aWNhbG1heG9jY3Vycy9QYXJ0aWNhbE1heE9jY3Vyc1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcGFydGljYWxtYXhvY2N1cnMvUGFydGljYWxNYXhPY2N1cnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMGVmMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wYXJ0aWNhbG1heG9jY3Vycy9QYXJ0aWNhbE1heE9jY3Vyc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBhcnRpY2FsbWF4b2NjdXJzOwotCi1pbXBvcnQgY29tLm15bmFtZXNwYWNlLnRlc3RwYXJ0aWNsZW1heG9jY3Vycy4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBQYXJ0aWNhbE1heE9jY3Vyc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIGludCBpID0gMDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVGVzdDEoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczEoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMSB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMxLnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMSh0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMSk7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMVNlcXVlbmNlW10gdGVzdFNlcXVlbmNlcyA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2VbMl07Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXS5zZXRQYXJtMSgiUGFyYW0xMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzBdLnNldFBhcm0yKCJQYXJhbTEyIik7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXS5zZXRQYXJtMSgiUGFyYW0yMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0yKCJQYXJhbTIyIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTEuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMVNlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMS5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMxIHJlc3VsdCA9IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUxU2VxdWVuY2VbXSByZXN1bHRTZXF1ZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMxKCkuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0xKCksICJQYXJhbTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0yKCksICJQYXJhbTEyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKCksICJQYXJhbTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKCksICJQYXJhbTIyIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVTZXF1ZW5jZU1heE9jY3VyczIoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMiB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczIoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMiB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMyLnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMih0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMik7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMlNlcXVlbmNlW10gdGVzdFNlcXVlbmNlcyA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2VbMl07Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXS5zZXRQYXJtMShuZXcgU3RyaW5nW117IlBhcmFtMTExIiwgIlBhcmFtMTEyIiwgIlBhcmFtMTEzIn0pOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzBdLnNldFBhcm0yKG5ldyBTdHJpbmdbXXsiUGFyYW0xMTEiLCAiUGFyYW0xMTIiLCAiUGFyYW0xMTMifSk7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXS5zZXRQYXJtMShuZXcgU3RyaW5nW117IlBhcmFtMTIxIiwgIlBhcmFtMTIyIiwgIlBhcmFtMTIzIn0pOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0yKG5ldyBTdHJpbmdbXXsiUGFyYW0xMjEiLCAiUGFyYW0xMjIiLCAiUGFyYW0xMjMifSk7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTIuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMlNlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsTWF4T2NjdXJlczIuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczIgcmVzdWx0ID0gVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTJTZXF1ZW5jZVtdIHJlc3VsdFNlcXVlbmNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczIoKS5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUyU2VxdWVuY2UoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTEoKVswXSwgIlBhcmFtMTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0xKClbMV0sICJQYXJhbTExMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMSgpWzJdLCAiUGFyYW0xMTMiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMV0uZ2V0UGFybTIoKVswXSwgIlBhcmFtMTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKClbMV0sICJQYXJhbTEyMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMigpWzJdLCAiUGFyYW0xMjMiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpY2xlU2VxdWVuY2VNYXhPY2N1cnMzKCkgewotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczMgdGVzdFBhcnRpY2FsTWF4T2NjdXJlczMgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMzKCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTMgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlMygpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMy5zZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczModGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTNTZXF1ZW5jZVtdIHRlc3RTZXF1ZW5jZXMgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlWzJdOwotCi0gICAgICAgIHRlc3RTZXF1ZW5jZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlKCk7Ci0gICAgICAgIHRlc3RTZXF1ZW5jZXNbMF0uc2V0UGFybTIobmV3IFN0cmluZ1tdeyJQYXJhbTExMSIsIG51bGwsICJQYXJhbTExMyJ9KTsKLQotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTNTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0xKG5ldyBTdHJpbmdbXXsiUGFyYW0xMjEiLCAiUGFyYW0xMjIiLCBudWxsfSk7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsTWF4T2NjdXJlczMuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMy5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMzIHJlc3VsdCA9IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzMy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGUzU2VxdWVuY2VbXSByZXN1bHRTZXF1ZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnMzKCkuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlM1NlcXVlbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0yKClbMF0sICJQYXJhbTExMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMigpWzFdLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTIoKVsyXSwgIlBhcmFtMTEzIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKClbMF0sICJQYXJhbTEyMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMSgpWzFdLCAiUGFyYW0xMjIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRTZXF1ZW5jZXNbMV0uZ2V0UGFybTEoKVsyXSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVTZXF1ZW5jZU1heE9jY3VyczQoKSB7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM0IHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczQoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0ID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTQoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM0LnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCh0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0KTsKLQotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbXSB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2UgPQotICAgICAgICAgICAgICAgIG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbM107Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNC5zZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2UodGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzBdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uc2V0UGFybTEoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMV0gPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMl0uc2V0UGFybTMoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNC5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM0Lk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCByZXN1bHQgPSBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlW10gcmVzdWx0U2VxdWVuY2VzID0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNCgpLmdldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1swXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU0U2VxdWVuY2VbMF0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTRTZXF1ZW5jZVsxXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMl0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMl0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMl0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNFNlcXVlbmNlWzJdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNsZVNlcXVlbmNlTWF4T2NjdXJzNSgpIHsKLQotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1ID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNSgpOwotICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1IHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTUgPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1KHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTUpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVtdIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVszXTsKLQotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1LnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZSh0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2UpOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVswXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLnNldFBhcm0xKG5ldyBUZXN0Q3VzdG9tVHlwZVtde2dldE5ld0N1c3RvbVR5cGUoKX0pOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMF0uc2V0UGFybTMobmV3IFRlc3RDdXN0b21UeXBlW117Z2V0TmV3Q3VzdG9tVHlwZSgpfSk7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzFdID0gbmV3IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uc2V0UGFybTEobmV3IFRlc3RDdXN0b21UeXBlW117Z2V0TmV3Q3VzdG9tVHlwZSgpfSk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsxXS5zZXRQYXJtMyhuZXcgVGVzdEN1c3RvbVR5cGVbXXtnZXROZXdDdXN0b21UeXBlKCl9KTsKLQotICAgICAgICB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMl0gPSBuZXcgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5zZXRQYXJtMShuZXcgVGVzdEN1c3RvbVR5cGVbXXtnZXROZXdDdXN0b21UeXBlKCl9KTsKLSAgICAgICAgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzJdLnNldFBhcm0zKG5ldyBUZXN0Q3VzdG9tVHlwZVtde2dldE5ld0N1c3RvbVR5cGUoKX0pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1LmdldE9NRWxlbWVudChUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUgcmVzdWx0ID0gVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM1LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVtdIHJlc3VsdFNlcXVlbmNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczUoKS5nZXRUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2UoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRTZXF1ZW5jZXNbMF0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNVNlcXVlbmNlWzBdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdFNlcXVlbmNlc1sxXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU1U2VxdWVuY2VbMV0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzJdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzJdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0U2VxdWVuY2VzWzJdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVHlwZTVTZXF1ZW5jZVsyXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzVGVzdDYoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNiB0ZXN0UGFydGljYWxNYXhPY2N1cmVzNiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczYoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNiB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNiA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXM2LnNldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNih0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNik7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNlNlcXVlbmNlW10gdGVzdFNlcXVlbmNlcyA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2VbMl07Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1swXS5zZXRQYXJtMSgiUGFyYW0xMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzBdLnNldFBhcm0yKCJQYXJhbTEyIik7Ci0KLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2UoKTsKLSAgICAgICAgdGVzdFNlcXVlbmNlc1sxXS5zZXRQYXJtMSgiUGFyYW0yMSIpOwotICAgICAgICB0ZXN0U2VxdWVuY2VzWzFdLnNldFBhcm0yKCJQYXJhbTIyIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTYuc2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNlNlcXVlbmNlKHRlc3RTZXF1ZW5jZXMpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNi5zZXRBdHRyaWJ1dGUxKCJBdHRyaWJ1dGUxIik7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGU2LnNldEF0dHJpYnV0ZTIoIkF0dHJpYnV0ZTIiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbE1heE9jY3VyZXM2LmdldE9NRWxlbWVudChUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3VyczYuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM2IHJlc3VsdCA9IFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxTZXF1ZW5jZU1heE9jY3Vyc1R5cGU2U2VxdWVuY2VbXSByZXN1bHRTZXF1ZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM2KCkuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnNUeXBlNlNlcXVlbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0xKCksICJQYXJhbTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzBdLmdldFBhcm0yKCksICJQYXJhbTEyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0xKCksICJQYXJhbTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0U2VxdWVuY2VzWzFdLmdldFBhcm0yKCksICJQYXJhbTIyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RQYXJ0aWNhbFNlcXVlbmNlTWF4T2NjdXJzNigpLmdldEF0dHJpYnV0ZTEoKSwgIkF0dHJpYnV0ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFBhcnRpY2FsU2VxdWVuY2VNYXhPY2N1cnM2KCkuZ2V0QXR0cmlidXRlMigpLCAiQXR0cmlidXRlMiIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVGVzdCgpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VycyA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMoKTsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZSB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vycyh0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlLnNldFBhcm0xKCJQYXJhbTEiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vycy5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIHN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VycyByZXN1bHQgPSBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMoKS5nZXRQYXJtMSgpLCAiUGFyYW0xIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUZXN0MSgpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMxKCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUxID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMxLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczEodGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTEpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxQ2hvaWNlW10gdGVzdENob2ljZXMgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTFDaG9pY2VbMl07Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTFDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMF0uc2V0UGFybTEoIlBhcmFtMTEiKTsKLQotICAgICAgICB0ZXN0Q2hvaWNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMUNob2ljZSgpOwotICAgICAgICB0ZXN0Q2hvaWNlc1sxXS5zZXRQYXJtMigiUGFyYW0xMiIpOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUxLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxQ2hvaWNlKHRlc3RDaG9pY2VzKTsKLQotICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsTWF4T2NjdXJlczEuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczEuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczEgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMUNob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMSgpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUxQ2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpLCAiUGFyYW0xMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKSwgIlBhcmFtMTIiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWNsZUNob2ljZU1heE9jY3VyczIoKSB7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIgdGVzdFBhcnRpY2FsTWF4T2NjdXJlczIgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMigpOwotICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMiB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMiA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMigpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMi5zZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMyKHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUyKTsKLQotICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMkNob2ljZVtdIHRlc3RDaG9pY2VzID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUyQ2hvaWNlWzJdOwotCi0gICAgICAgIHRlc3RDaG9pY2VzWzBdID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUyQ2hvaWNlKCk7Ci0gICAgICAgIHRlc3RDaG9pY2VzWzBdLnNldFBhcm0xKG5ldyBTdHJpbmdbXXsiUGFyYW0xMTEiLCAiUGFyYW0xMTIiLCAiUGFyYW0xMTMifSk7Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMV0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTJDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMV0uc2V0UGFybTIobmV3IFN0cmluZ1tdeyJQYXJhbTEyMSIsICJQYXJhbTEyMiIsICJQYXJhbTEyMyJ9KTsKLQotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlMi5zZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMkNob2ljZSh0ZXN0Q2hvaWNlcyk7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMyLmdldE9NRWxlbWVudChUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMyLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMyIHJlc3VsdCA9IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTJDaG9pY2VbXSByZXN1bHRDaG9pY2VzID0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczIoKS5nZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlMkNob2ljZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMF0uZ2V0UGFybTEoKVswXSwgIlBhcmFtMTExIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpWzFdLCAiUGFyYW0xMTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0xKClbMl0sICJQYXJhbTExMyIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKVswXSwgIlBhcmFtMTIxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1sxXS5nZXRQYXJtMigpWzFdLCAiUGFyYW0xMjIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0yKClbMl0sICJQYXJhbTEyMyIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpY2xlQ2hvaWNlTWF4T2NjdXJzMygpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMyB0ZXN0UGFydGljYWxNYXhPY2N1cmVzMyA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMzKCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUzID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzKCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMzLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczModGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTMpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzQ2hvaWNlW10gdGVzdENob2ljZXMgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTNDaG9pY2VbMl07Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTNDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMF0uc2V0UGFybTEobmV3IFN0cmluZ1tdeyJQYXJhbTExMSIsIG51bGwsICJQYXJhbTExMyJ9KTsKLQotICAgICAgICB0ZXN0Q2hvaWNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlM0Nob2ljZSgpOwotICAgICAgICB0ZXN0Q2hvaWNlc1sxXS5zZXRQYXJtMihuZXcgU3RyaW5nW117IlBhcmFtMTIxIiwgIlBhcmFtMTIyIiwgbnVsbH0pOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGUzLnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzQ2hvaWNlKHRlc3RDaG9pY2VzKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbE1heE9jY3VyZXMzLmdldE9NRWxlbWVudChUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnMzLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczMgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlM0Nob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzMygpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGUzQ2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpWzBdLCAiUGFyYW0xMTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0xKClbMV0sIG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMF0uZ2V0UGFybTEoKVsyXSwgIlBhcmFtMTEzIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1sxXS5nZXRQYXJtMigpWzBdLCAiUGFyYW0xMjEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0yKClbMV0sICJQYXJhbTEyMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKVsyXSwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVDaG9pY2VNYXhPY2N1cnM0KCkgewotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczQgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM0KCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0IHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0ID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczQuc2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCh0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNCk7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbXSB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzNdOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlKHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMF0uc2V0UGFybTEoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMl0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMl0uc2V0UGFybTMoZ2V0TmV3Q3VzdG9tVHlwZSgpKTsKLQotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNC5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNC5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNCByZXN1bHQgPSBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM0LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlW10gcmVzdWx0Q2hvaWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM0KCkuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2UoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzBdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzBdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzBdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU0Q2hvaWNlWzBdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMV0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMV0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTRDaG9pY2VbMV0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1syXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsyXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1syXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsyXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1syXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNENob2ljZVsyXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljbGVDaG9pY2VNYXhPY2N1cnM1KCkgewotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM1KCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1IHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1ID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUuc2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNSh0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNSk7Ci0KLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbXSB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzNdOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlKHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlKTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5zZXRQYXJtMShuZXcgVGVzdEN1c3RvbVR5cGVbXXtnZXROZXdDdXN0b21UeXBlKCl9KTsKLQotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVsxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZSgpOwotICAgICAgICB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVsxXS5zZXRQYXJtMigiUGFyYW0yIik7Ci0KLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2UoKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uc2V0UGFybTMobmV3IFRlc3RDdXN0b21UeXBlW117Z2V0TmV3Q3VzdG9tVHlwZSgpfSk7Ci0KLSAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUuZ2V0T01FbGVtZW50KFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczUgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNSgpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5nZXRQYXJtMSgpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMigpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5nZXRQYXJtMigpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzRXF1YWwocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMygpLCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNUNob2ljZVswXS5nZXRQYXJtMygpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0xKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzFdLmdldFBhcm0xKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0yKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzFdLmdldFBhcm0yKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNFcXVhbChyZXN1bHRDaG9pY2VzWzFdLmdldFBhcm0zKCksIHRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU1Q2hvaWNlWzFdLmdldFBhcm0zKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMl0uZ2V0UGFybTEoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uZ2V0UGFybTEoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMl0uZ2V0UGFybTIoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uZ2V0UGFybTIoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0VxdWFsKHJlc3VsdENob2ljZXNbMl0uZ2V0UGFybTMoKSwgdGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTVDaG9pY2VbMl0uZ2V0UGFybTMoKSkpOwotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUZXN0NigpIHsKLSAgICAgICAgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNiB0ZXN0UGFydGljYWxNYXhPY2N1cmVzNiA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnM2KCk7Ci0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2IHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGU2ID0gbmV3IFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2KCk7Ci0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3VyZXM2LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczYodGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTYpOwotCi0gICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2Q2hvaWNlW10gdGVzdENob2ljZXMgPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTZDaG9pY2VbMl07Ci0KLSAgICAgICAgdGVzdENob2ljZXNbMF0gPSBuZXcgVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzVHlwZTZDaG9pY2UoKTsKLSAgICAgICAgdGVzdENob2ljZXNbMF0uc2V0UGFybTEoIlBhcmFtMTEiKTsKLQotICAgICAgICB0ZXN0Q2hvaWNlc1sxXSA9IG5ldyBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNkNob2ljZSgpOwotICAgICAgICB0ZXN0Q2hvaWNlc1sxXS5zZXRQYXJtMigiUGFyYW0xMiIpOwotCi0gICAgICAgIHRlc3RQYXJ0aWNhbE1heE9jY3Vyc1R5cGU2LnNldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2Q2hvaWNlKHRlc3RDaG9pY2VzKTsKLSAgICAgICAgdGVzdFBhcnRpY2FsTWF4T2NjdXJzVHlwZTYuc2V0QXR0cmlidXRlMSgiQXR0cmlidXRlMSIpOwotICAgICAgICB0ZXN0UGFydGljYWxNYXhPY2N1cnNUeXBlNi5zZXRBdHRyaWJ1dGUyKCJBdHRyaWJ1dGUyIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0UGFydGljYWxNYXhPY2N1cmVzNi5nZXRPTUVsZW1lbnQoVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3VyczYgcmVzdWx0ID0gVGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBUZXN0UGFydGljYWxDaG9pY2VNYXhPY2N1cnNUeXBlNkNob2ljZVtdIHJlc3VsdENob2ljZXMgPQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNigpLmdldFRlc3RQYXJ0aWNhbENob2ljZU1heE9jY3Vyc1R5cGU2Q2hvaWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0Q2hvaWNlc1swXS5nZXRQYXJtMSgpLCAiUGFyYW0xMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdENob2ljZXNbMV0uZ2V0UGFybTIoKSwgIlBhcmFtMTIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNigpLmdldEF0dHJpYnV0ZTEoKSwgIkF0dHJpYnV0ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFBhcnRpY2FsQ2hvaWNlTWF4T2NjdXJzNigpLmdldEF0dHJpYnV0ZTIoKSwgIkF0dHJpYnV0ZTIiKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVGVzdEN1c3RvbVR5cGUgZ2V0TmV3Q3VzdG9tVHlwZSgpIHsKLSAgICAgICAgaSsrOwotICAgICAgICBUZXN0Q3VzdG9tVHlwZSB0ZXN0Q3VzdG9tVHlwZSA9IG5ldyBUZXN0Q3VzdG9tVHlwZSgpOwotICAgICAgICB0ZXN0Q3VzdG9tVHlwZS5zZXRQYXJhbTEoIlBhcmFtIiArIGkgKyAiMiIpOwotICAgICAgICB0ZXN0Q3VzdG9tVHlwZS5zZXRQYXJhbTIobmV3IFN0cmluZ1tdeyJQYXJhbSIgKyBpICsgIjIxIiwgIlBhcmFtIiArIGkgKyAiMjIiLCAiUGFyYW0iICsgaSArICIyMyJ9KTsKLSAgICAgICAgdGVzdEN1c3RvbVR5cGUuc2V0UGFyYW0zKCJQYXJhbSIgKyBpICsgIjMiKTsKLSAgICAgICAgcmV0dXJuIHRlc3RDdXN0b21UeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFsKFRlc3RDdXN0b21UeXBlIG9iamVjdDEsIFRlc3RDdXN0b21UeXBlIG9iamVjdDIpIHsKLSAgICAgICAgYm9vbGVhbiBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgIGlmICgob2JqZWN0MSAhPSBudWxsKSAmJiAob2JqZWN0MiAhPSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IGlzRXF1YWwob2JqZWN0MS5nZXRQYXJhbTEoKSwgb2JqZWN0Mi5nZXRQYXJhbTEoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgaXNFcXVhbChvYmplY3QxLmdldFBhcmFtMigpLCBvYmplY3QyLmdldFBhcmFtMigpKSAmJgotICAgICAgICAgICAgICAgICAgICBpc0VxdWFsKG9iamVjdDEuZ2V0UGFyYW0zKCksIG9iamVjdDIuZ2V0UGFyYW0zKCkpOwotICAgICAgICB9IGVsc2UgaWYgKChvYmplY3QxID09IG51bGwpICYmIChvYmplY3QyID09IG51bGwpKSB7Ci0gICAgICAgICAgICBpc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFcXVhbChUZXN0Q3VzdG9tVHlwZVtdIG9iamVjdDEsIFRlc3RDdXN0b21UeXBlW10gb2JqZWN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3QxICE9IG51bGwpICYmIChvYmplY3QyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0MS5sZW5ndGggPT0gb2JqZWN0Mi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdDEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsKG9iamVjdDFbaV0sIG9iamVjdDJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgob2JqZWN0MSA9PSBudWxsKSAmJiAob2JqZWN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXF1YWwoU3RyaW5nW10gb2JqZWN0MSwgU3RyaW5nW10gb2JqZWN0MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3QxICE9IG51bGwpICYmIChvYmplY3QyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0MS5sZW5ndGggPT0gb2JqZWN0Mi5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBpc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdDEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsKG9iamVjdDFbaV0sIG9iamVjdDJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgob2JqZWN0MSA9PSBudWxsKSAmJiAob2JqZWN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXF1YWwoU3RyaW5nIG9iamVjdDEsIFN0cmluZyBvYmplY3QyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICBpZiAoKG9iamVjdDEgIT0gbnVsbCkgJiYgKG9iamVjdDIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlzRXF1YWwgPSBvYmplY3QxLmVxdWFscyhvYmplY3QyKTsKLSAgICAgICAgfSBlbHNlIGlmICgob2JqZWN0MSA9PSBudWxsKSAmJiAob2JqZWN0MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL1V0aWwuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWVlZmZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGU7DQotDQotcHVibGljIGNsYXNzIFV0aWwgew0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEZhY3RvcnkoQ2xhc3MgY2xhenopICB7DQotICAgICAgICBDbGFzc1tdIGRlY2xhcmVkQ2xhc3NlID0gY2xhenouZ2V0RGVjbGFyZWRDbGFzc2VzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmVkQ2xhc3NlLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgQ2xhc3MgYUNsYXNzID0gZGVjbGFyZWRDbGFzc2VbaV07DQotICAgICAgICAgICAgaWYoYUNsYXNzICE9IG51bGwgJiYgYUNsYXNzLmdldE5hbWUoKS5lbmRzV2l0aCgiRmFjdG9yeSIpKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFDbGFzczsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFjdG9yeSBpbm5lciBjbGFzcyBub3QgZm91bmQiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjIxMDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Fic3RyYWN0RGVyaXZlZFBvcHVsYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5VdGlsOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyIGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgcmV1c2FibGUgbWV0aG9kIHRvIG1ha2Ugb2JqZWN0IGluc3RhbmNlcyB2aWEgcmVmbGVjdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgcHJvY2VzcyhTdHJpbmcgdGVzdFN0cmluZyxTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotCi0gICAgICAgIHJldHVybiBvYmo7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgIFN0cmluZyBjbGFzc05hbWU9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENsYXNzIHByb3BlcnR5Q2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogY2hlY2sgdmFsdWUgZnVuY3Rpb24gLSBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICAqIEBwYXJhbSB4bWxUb1NldAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tWYWx1ZShTdHJpbmcgeG1sVG9TZXQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBvID0gcHJvY2Vzcyh4bWxUb1NldCwgY2xhc3NOYW1lKTsKLSAgICAgICAgQ2xhc3MgYmVhbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgIEJlYW5JbmZvIGluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcERlc2NzID0gaW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcERlc2MgPSBwcm9wRGVzY3NbaV07Ci0KLSAgICAgICAgICAgIGlmICAocHJvcERlc2MuZ2V0UHJvcGVydHlUeXBlKCkuZXF1YWxzKHByb3BlcnR5Q2xhc3MpKXsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGNvbnZlcnRUb1N0cmluZyhwcm9wRGVzYy5nZXRSZWFkTWV0aG9kKCkuaW52b2tlKG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgICAgICBjb21wYXJlKHZhbHVlLHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBDb21wYXJlT01FbGVtbnRTZXJpYWxpemF0aW9ucyhvLCB4bWxUb1NldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgc2VyaWFsaXphdGlvbnMgLSBtYXkgYmUgb3ZlcnJpZGRlbgotICAgICAqIEBwYXJhbSBvCi0gICAgICogQHBhcmFtIHhtbFRvU2V0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBDb21wYXJlT01FbGVtbnRTZXJpYWxpemF0aW9ucyhPYmplY3QgbywgU3RyaW5nIHhtbFRvU2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBnZXRPTUVsZW1lbnQobyk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihiYW9zKTsKLSAgICAgICAgZWxlbWVudC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYmFvcy50b1N0cmluZygpLHhtbFRvU2V0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgT00gZWxlbWVudCB2aWEgcmVmbGVjdGlvbgotICAgICAqIEBwYXJhbSBiZWFuCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoT2JqZWN0IGJlYW4pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbWV0aG9kID0gYmVhbi5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0T01FbGVtZW50IiwgbmV3IENsYXNzW117Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZS5jbGFzcywKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeS5jbGFzc30pOwotCi0gICAgICAgIHJldHVybiAoT01FbGVtZW50KSBtZXRob2QuaW52b2tlKGJlYW4sIG5ldyBPYmplY3RbXXtudWxsLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKX0pOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29tYXBhcmUgbWV0aG9kIC0gbWF5IGJlIG92ZXJyaWRkZW4KLSAgICAgKiBAcGFyYW0gdmFsMQotICAgICAqIEBwYXJhbSB2YWwyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZShTdHJpbmcgdmFsMSxTdHJpbmcgdmFsMil7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLHZhbDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIG8KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUJ5dGVQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUJ5dGVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxZTNiNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVCeXRlUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLmRlcml2ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUJ5dGVQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICIwIiwKLSAgICAgICAgICAgICIyIgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRCeXRlIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkQnl0ZT4iLAotICAgICAgICAgICAgIjxEZXJpdmVkQnl0ZSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZEJ5dGU+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZEJ5dGUgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRCeXRlPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZEJ5dGUiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gYnl0ZS5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChCeXRlKW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUludFBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlSW50UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2YxYWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlSW50UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLmRlcml2ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUludFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjEyMjIyMiIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiLTIzNDQ1NTYiCi0gICAgfTsKLQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRJbnQ+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZEludCB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkSW50IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1syXSsiPC9EZXJpdmVkSW50PiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZEludCI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBpbnQuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVJbnRlZ2VyUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVJbnRlZ2VyUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjAxMmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUludGVnZXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxMjIyMjIiLAotICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgIi0yMzQ0NTU2IgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZEludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZEludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRJbnRlZ2VyPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZEludGVnZXIiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gQmlnSW50ZWdlci5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChCaWdJbnRlZ2VyKW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUxvbmdQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZUxvbmdQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0ZTUzNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVMb25nUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLmRlcml2ZWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkVHlwZUxvbmdQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjE3NTc4MjgzMjgyIiwKLSAgICAgICAgICAgICItMTIyODI4NDQ0MyIsCi0gICAgICAgICAgICAiMiIsCi0gICAgICAgICAgICBMb25nLk1BWF9WQUxVRSArICIiLAotICAgICAgICAgICAgTG9uZy5NSU5fVkFMVUUgKyAiIgotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8RGVyaXZlZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9EZXJpdmVkTG9uZz4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTG9uZyB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZExvbmc+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1s0XSsiPC9EZXJpdmVkTG9uZz4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRMb25nIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IGxvbmcuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoTG9uZylvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjE1NmMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVOZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0gICAgCi0gICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiLTE4NDQzIiwKLSAgICAgICAgICAgICItMSIsCi0gICAgICAgICAgICAiLTI2MzMiLAotICAgICAgICAgICAgIjI2NzU4MjIzMyIsCi0gICAgICAgICAgICAiMCIsCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8RGVyaXZlZE5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvRGVyaXZlZE5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9EZXJpdmVkTmVnYXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWROZWdhdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWROZWdhdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbM10rIjwvRGVyaXZlZE5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1s0XSsiPC9EZXJpdmVkTmVnYXRpdmVJbnRlZ2VyPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZE5lZ2F0aXZlSW50ZWdlciI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBOZWdhdGl2ZUludGVnZXIuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE5lZ2F0aXZlSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOb25OZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5vbk5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNmMWM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZU5vbk5lZ2F0aXZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVOb25OZWdhdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjE4NDQ0IiwKLSAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICIwIiAsCi0gICAgICAgICAgICAiLTEiICwKLSAgICAgICAgICAgICItMzQ1MzQzNCIKLQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8RGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvRGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9EZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWROb25OZWdhdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWROb25OZWdhdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbM10rIjwvRGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1s0XSsiPC9EZXJpdmVkTm9uTmVnYXRpdmVJbnRlZ2VyPiIKLSAgICB9OwotCi0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZE5vbk5lZ2F0aXZlSW50ZWdlciI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBOb25OZWdhdGl2ZUludGVnZXIuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChOb25OZWdhdGl2ZUludGVnZXIpbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlTm9uUG9zaXRpdmVJbnRlZ2VyUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOb25Qb3NpdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2MDdjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVOb25Qb3NpdGl2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIERlcml2ZWRUeXBlTm9uUG9zaXRpdmVJbnRlZ2VyUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICItMTg0NDQiLAotICAgICAgICAgICAgIi0xIiwKLSAgICAgICAgICAgICIwIiAsCi0gICAgICAgICAgICAiMSIgLAotICAgICAgICAgICAgIjM0NTM0MzQiCi0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWROb25Qb3NpdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkTm9uUG9zaXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1syXSsiPC9EZXJpdmVkTm9uUG9zaXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWROb25Qb3NpdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbNF0rIjwvRGVyaXZlZE5vblBvc2l0aXZlSW50ZWdlcj4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWROb25Qb3NpdGl2ZUludGVnZXIiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gbG9uZy5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE5vblBvc2l0aXZlSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVQb3NpdHZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlUG9zaXR2ZUludGVnZXJQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyNmFjNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVQb3NpdHZlSW50ZWdlclBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVQb3NpdHZlSW50ZWdlclBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLQotICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjE4NDQ0IiwKLSAgICAgICAgICAgICIxIiwKLSAgICAgICAgICAgICI1NjM2MzMyIiAsCi0gICAgICAgICAgICAiMCIgLAotICAgICAgICAgICAgIi0zNDUzNDM0IgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkUG9zaXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkUG9zaXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRQb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRQb3NpdGl2ZUludGVnZXI+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFBvc2l0aXZlSW50ZWdlciB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZFBvc2l0aXZlSW50ZWdlcj4iLAotICAgICAgICAgICAgIjxEZXJpdmVkUG9zaXRpdmVJbnRlZ2VyIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1szXSsiPC9EZXJpdmVkUG9zaXRpdmVJbnRlZ2VyPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRQb3NpdGl2ZUludGVnZXIgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRQb3NpdGl2ZUludGVnZXI+IgotICAgIH07Ci0KLQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EZXJpdmVkUG9zaXRpdmVJbnRlZ2VyIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IFBvc2l0aXZlSW50ZWdlci5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKFBvc2l0aXZlSW50ZWdlcilvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVTaG9ydFBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlU2hvcnRQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxMjhjZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVTaG9ydFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVTaG9ydFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLSAgICAgICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxNzQ0NCIsCi0gICAgICAgICAgICAiLTEyMzQzIiwKLSAgICAgICAgICAgICIyIiAsCi0gICAgICAgICAgICAiMCIgLAotICAgICAgICAgICAgIi02IgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRTaG9ydD4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRTaG9ydCI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBTaG9ydC5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoU2hvcnQpbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRCeXRlUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZEJ5dGVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5YmVlYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZEJ5dGVQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIERlcml2ZWRUeXBlVW5zaWduZWRCeXRlUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REZXJpdmVkUG9wdWxhdGVyewotICAgIAotICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjEiLAotICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgIjIiICwKLSAgICAgICAgICAgICItMSIgLAotICAgICAgICAgICAgIi02IgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRCeXRlIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkVW5zaWduZWRCeXRlPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZEJ5dGUgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRVbnNpZ25lZEJ5dGU+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkQnl0ZSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZFVuc2lnbmVkQnl0ZT4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRCeXRlIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1szXSsiPC9EZXJpdmVkVW5zaWduZWRCeXRlPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZEJ5dGUgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZEJ5dGU+IgotICAgIH07Ci0KLQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EZXJpdmVkVW5zaWduZWRCeXRlIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IFVuc2lnbmVkQnl0ZS5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChVbnNpZ25lZEJ5dGUpbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRJbnRQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZVVuc2lnbmVkSW50UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTg4ODcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRJbnRQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuZGVyaXZlZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVVbnNpZ25lZEludFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMSIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiMjY3NTgyMjMzIiAsCi0gICAgICAgICAgICAiLTEiICwKLSAgICAgICAgICAgICItMjY3NTgyMjMzIgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzNdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRJbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZEludD4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRVbnNpZ25lZEludCI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBVbnNpZ25lZEludC5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChVbnNpZ25lZEludClvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZExvbmdQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZVVuc2lnbmVkTG9uZ1BvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM0YzM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvZGVyaXZlZC9EZXJpdmVkVHlwZVVuc2lnbmVkTG9uZ1BvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgRGVyaXZlZFR5cGVVbnNpZ25lZExvbmdQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdERlcml2ZWRQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjEiLAotICAgICAgICAgICAgIjAiLAotICAgICAgICAgICAgIjI2NzU4MjIzMzM0MzM0IiAsCi0JICAgICIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCi0gICAgICAgICAgICAiLTEiICwKLSAgICAgICAgICAgICItMjY3NTgyMjMzIgotCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkVW5zaWduZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L0Rlcml2ZWRVbnNpZ25lZExvbmc+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkTG9uZyB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvRGVyaXZlZFVuc2lnbmVkTG9uZz4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRMb25nIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1szXSsiPC9EZXJpdmVkVW5zaWduZWRMb25nPiIsCi0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZExvbmcgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZExvbmc+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkTG9uZyB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbNV0rIjwvRGVyaXZlZFVuc2lnbmVkTG9uZz4iCi0gICAgfTsKLQotCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRlcml2ZWRVbnNpZ25lZExvbmciOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVW5zaWduZWRMb25nLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSA0OyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKFVuc2lnbmVkTG9uZylvKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZFNob3J0UG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL2Rlcml2ZWQvRGVyaXZlZFR5cGVVbnNpZ25lZFNob3J0UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGYyM2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9kZXJpdmVkL0Rlcml2ZWRUeXBlVW5zaWduZWRTaG9ydFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5kZXJpdmVkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIERlcml2ZWRUeXBlVW5zaWduZWRTaG9ydFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0RGVyaXZlZFBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMSIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiMjY3NSIgLAotICAgICAgICAgICAgIi0xIiAsCi0gICAgICAgICAgICAiLTI2NzU4MjMiCi0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPERlcml2ZWRVbnNpZ25lZFNob3J0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9EZXJpdmVkVW5zaWduZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRTaG9ydCB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvRGVyaXZlZFVuc2lnbmVkU2hvcnQ+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiID4iK3ZhbHVlc1syXSsiPC9EZXJpdmVkVW5zaWduZWRTaG9ydD4iLAotICAgICAgICAgICAgIjxEZXJpdmVkVW5zaWduZWRTaG9ydCB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbM10rIjwvRGVyaXZlZFVuc2lnbmVkU2hvcnQ+IiwKLSAgICAgICAgICAgICI8RGVyaXZlZFVuc2lnbmVkU2hvcnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzRdKyI8L0Rlcml2ZWRVbnNpZ25lZFNob3J0PiIKLSAgICB9OwotCi0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuRGVyaXZlZFVuc2lnbmVkU2hvcnQiOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVW5zaWduZWRTaG9ydC5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChVbnNpZ25lZFNob3J0KW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvQURCSW5PdXRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL0FEQkluT3V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzliMzlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvQURCSW5PdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBBREJJbk91dFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPHRlbXBFbHQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnMS90eXBlc1wiPiIgKwotICAgICAgICAgICAgImhlbGxvIiArCi0gICAgICAgICAgICAiPC90ZW1wRWx0PiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMiA9ICI8aGVhZGVyMSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcxL3R5cGVzXCI+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzwvdmFyU3RyaW5nPiIgKwotICAgICAgICAgICAgIjx2YXJJbnQ+NTwvdmFySW50PiIgKwotICAgICAgICAgICAgIjx2YXJGbG9hdD4zLjM8L3ZhckZsb2F0PiIgKwotICAgICAgICAgICAgIjwvaGVhZGVyMT4iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgd2hpbGUoeG1sU3RyZWFtUmVhZGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV2ZW50ICIgKyB4bWxTdHJlYW1SZWFkZXIubmV4dCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGV4dCAiICsgICh4bWxTdHJlYW1SZWFkZXIuaGFzVGV4dCgpP3htbFN0cmVhbVJlYWRlci5nZXRUZXh0KCk6IiIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lICIgKyAoeG1sU3RyZWFtUmVhZGVyLmhhc05hbWUoKT94bWxTdHJlYW1SZWFkZXIuZ2V0TG9jYWxOYW1lKCk6IiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcyLmdldEJ5dGVzKCkpKTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwMTFGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBkZWZhdWx0RW52ZWxvcGUgPSBzb2FwMTFGYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotCi0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyMikuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQyKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgd2hpbGUoeG1sU3RyZWFtUmVhZGVyLmhhc05leHQoKSl7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV2ZW50ICIgKyB4bWxTdHJlYW1SZWFkZXIubmV4dCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGV4dCAiICsgICh4bWxTdHJlYW1SZWFkZXIuaGFzVGV4dCgpP3htbFN0cmVhbVJlYWRlci5nZXRUZXh0KCk6IiIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lICIgKyAoeG1sU3RyZWFtUmVhZGVyLmhhc05hbWUoKT94bWxTdHJlYW1SZWFkZXIuZ2V0TG9jYWxOYW1lKCk6IiIpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBbm9uQ29tcGxleFR5cGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQW5vbkNvbXBsZXhUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI4NjQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBbm9uQ29tcGxleFR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUFub25Db21wbGV4VHlwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nID0gIjx0ZW1wRWx0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZzEvdHlwZXNcIj4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhckludD41PC92YXJJbnQ+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPC90ZW1wRWx0PiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZzEuc29hcGludGVyb3AudHlwZXMuVGVtcEVsdCIpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLQotCi0gICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhvYmouZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIE1ldGhvZCByZWFkTWV0aG9kOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKCJ2YXJJbnQiLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSxyZWFkTWV0aG9kLmludm9rZShvYmosKE9iamVjdFtdKSBudWxsKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJ2YXJGbG9hdCIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGbG9hdCgzLjMpLHJlYWRNZXRob2QuaW52b2tlKG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgfSAgZWxzZSBpZiAoInZhclN0cmluZyIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyIscmVhZE1ldGhvZC5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBbnlUeXBlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUFueVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YWZhZTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUFueVR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUG9wdWxhdGVBbnlUeXBlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15T2JqZWN0IHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMlwiIHhzaTp0eXBlPVwieHNkOmludFwiPiIgKwotICAgICAgICAgICAgIjUiICsKLSAgICAgICAgICAgICI8L215T2JqZWN0PiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnNvYXBpbnRlcm9wLnhzZDIuTXlPYmplY3QiKTsKLSAgICAgICAgICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLQotCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheUluQXJyYXlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQXJyYXlJbkFycmF5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkwMDE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheUluQXJyYXlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUFycmF5SW5BcnJheVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZXsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15b2JqZWN0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsKLSAgICAgICAgICAgICI8c29hcFN0cnVjdHVyZXM+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPHZhckludD41PC92YXJJbnQ+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzExPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzExPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzEyPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzEzPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPC9zb2FwU3RydWN0dXJlcz4iICsKLSAgICAgICAgICAgICI8c29hcFN0cnVjdHVyZXM+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzE8L3ZhckZsb2F0PiIgKwotICAgICAgICAgICAgIjx2YXJJbnQ+NTE8L3ZhckludD4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjE8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjE8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjI8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8dmFyU3RyaW5nPkhlbGxvMjM8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8L3NvYXBTdHJ1Y3R1cmVzPiIgKwotICAgICAgICAgICAgIjwvbXlvYmplY3Q+IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb257Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuc29hcGludGVyb3AueHNkLk15b2JqZWN0Iik7Ci0gICAgICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCi0KLSAgICAgICAgICAgIE9iamVjdCBteU9iamVjdCA9IG51bGwgOwotICAgICAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIm15b2JqZWN0Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICBteU9iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaixuZXcgT2JqZWN0W117fSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlPYmplY3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVBcnJheVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ODk3NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQXJyYXlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUFycmF5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15b2JqZWN0IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZzIveHNkXCI+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPHZhckludD41PC92YXJJbnQ+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzwvdmFyU3RyaW5nPiIgKwotICAgICAgICAgICAgIjx2YXJTdHJpbmc+SGVsbG8yPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPHZhclN0cmluZz5IZWxsbzM8L3ZhclN0cmluZz4iICsKLSAgICAgICAgICAgICI8L215b2JqZWN0PiI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uewotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZzIuc29hcGludGVyb3AueHNkLk15b2JqZWN0Iik7Ci0gICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBpbm5lckNsYXp6LmdldE1ldGhvZCgicGFyc2UiLG5ldyBDbGFzc1tde1hNTFN0cmVhbVJlYWRlci5jbGFzc30pOwotICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCi0gICAgICAgIE9iamVjdCBzb2FwU3RydWN0ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWV0aG9kIHJlYWRNZXRob2Q7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoIm15b2JqZWN0Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBzb2FwU3RydWN0ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzb2FwU3RydWN0KTsKLQotICAgICAgICBCZWFuSW5mbyBzdHJ1Y3RCZWFuSW5mbyA9ICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oc29hcFN0cnVjdC5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gc3RydWN0UHJvcGVydHlEZXNjcmlwdG9ycyA9IHN0cnVjdEJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJ1Y3RQcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gc3RydWN0UHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIGlmICgidmFySW50Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhckludCBpcyBub3QgcHJvcGVybHkgc2V0IixuZXcgSW50ZWdlcig1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2QuaW52b2tlKHNvYXBTdHJ1Y3QsIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgidmFyRmxvYXQiLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFyRmxvYXQgaXMgbm90IHByb3Blcmx5IHNldCIsbmV3IEZsb2F0KDMuMyksCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLmludm9rZShzb2FwU3RydWN0LCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgIH0gIGVsc2UgaWYgKCJ2YXJTdHJpbmciLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlN0cmluZyBhcnJheSBpcyBub3Qgc2V0IixyZWFkTWV0aG9kLmdldFJldHVyblR5cGUoKS5pc0FycmF5KCkpOwotICAgICAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IHJlYWRNZXRob2QuaW52b2tlKHNvYXBTdHJ1Y3QsIChPYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcnJheSBsZW5ndGggaXMgbm90IGNvcnJlY3QiLGxlbmd0aCwzKTsKLQotICAgICAgICAgICAgICAgIC8vY2hlY2sgdGhlIGl0ZW1zIGhlcmUKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVDaG9pY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlQ2hvaWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY4OThlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVDaG9pY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUNob2ljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nID0gIjxteUVsZW1lbnQgeG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzXCI+IiArCi0gICAgICAgICAgICAiPHZhckZsb2F0PjMuMzwvdmFyRmxvYXQ+IiArCi0gICAgICAgICAgICAiPC9teUVsZW1lbnQ+IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb257Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnNvYXBpbnRlcm9wLnR5cGVzLk15RWxlbWVudCIpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIixuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLQotICAgICAgICBPYmplY3QgbXlFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWV0aG9kIHJlYWRNZXRob2Q7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoIm15RWxlbWVudCIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgbXlFbGVtZW50ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCAoT2JqZWN0W10pIG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwobXlFbGVtZW50KTsKLQotICAgICAgICBCZWFuSW5mbyBzdHJ1Y3RCZWFuSW5mbyA9ICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8obXlFbGVtZW50LmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBzdHJ1Y3RQcm9wZXJ0eURlc2NyaXB0b3JzID0gc3RydWN0QmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cnVjdFByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBzdHJ1Y3RQcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKCJ2YXJGbG9hdCIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJGbG9hdCBpcyBub3QgcHJvcGVybHkgc2V0IixuZXcgRmxvYXQoMy4zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2QuaW52b2tlKG15RWxlbWVudCwgKE9iamVjdFtdKSBudWxsKSk7Ci0KLSAgICAgICAgICAgIH1lbHNlIGlmICgidmFySW50Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIG5vdCBiZSBzZXQgISAtIGl0IHNob3VsZCByZXR1cm4gemVybwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFySW50IGlzIG5vdCBwcm9wZXJseSBzZXQiLG5ldyBJbnRlZ2VyKDApLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5pbnZva2UobXlFbGVtZW50LCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUNvbXBsZXhNaW5PY2N1cnMwVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZUNvbXBsZXhNaW5PY2N1cnMwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgyOTY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVDb21wbGV4TWluT2NjdXJzMFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZUNvbXBsZXhNaW5PY2N1cnMwVGVzdCAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQotCi0gICAgLy8gYWxsIGFyZSBwcmVzZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMSA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0MS5vcmdcIj4iICsKLSAgICAgICAgICAgICI8Y2l0eT5Db2xvbWJvPC9jaXR5PiIgKwotICAgICAgICAgICAgIjxwZXJzb24+IiArCi0gICAgICAgICAgICAiPG5hbWU+QW15PC9uYW1lPiIgKwotICAgICAgICAgICAgIjxhZ2U+MTA8L2FnZT4iICsKLSAgICAgICAgICAgICI8L3BlcnNvbj4iICsKLSAgICAgICAgICAgICI8YWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8c3RyZWV0TmFtZT5NeSBTdHJlZXQ8L3N0cmVldE5hbWU+IiArCi0gICAgICAgICAgICAiPHN0cmVldE5vPjE8L3N0cmVldE5vPiIgKwotICAgICAgICAgICAgIjwvYWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotCi0KLSAgICAvL3BlcnNvbiBlbGVtZW50IGlzIG1pc3NpbmcKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcyID0gIjxyb290IHhtbG5zPVwiaHR0cDovL3Rlc3QxLm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxjaXR5PkNvbG9tYm88L2NpdHk+IiArCi0gICAgICAgICAgICAiPGFkZHJlc3M+IiArCi0gICAgICAgICAgICAiPHN0cmVldE5hbWU+TXkgU3RyZWV0PC9zdHJlZXROYW1lPiIgKwotICAgICAgICAgICAgIjxzdHJlZXRObz4xPC9zdHJlZXRObz4iICsKLSAgICAgICAgICAgICI8L2FkZHJlc3M+IiArCi0gICAgICAgICAgICAiPC9yb290PiI7Ci0KLSAgICAvL09ubHkgY2l0eSBpcyBwcmVzZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMyA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0MS5vcmdcIj4iICsKLSAgICAgICAgICAgICI8Y2l0eT5Db2xvbWJvPC9jaXR5PiIgKwotICAgICAgICAgICAgIjwvcm9vdD4iOwotCi0KLSAgICAvLyBhbGwgYXJlIHByZXNlbnQgd2l0aCB0d28gYWRkcmVzc2VzCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nNCA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0MS5vcmdcIj4iICsKLSAgICAgICAgICAgICI8Y2l0eT5Db2xvbWJvPC9jaXR5PiIgKwotICAgICAgICAgICAgIjxwZXJzb24+IiArCi0gICAgICAgICAgICAiPG5hbWU+QW15PC9uYW1lPiIgKwotICAgICAgICAgICAgIjxhZ2U+MTA8L2FnZT4iICsKLSAgICAgICAgICAgICI8L3BlcnNvbj4iICsKLSAgICAgICAgICAgICI8YWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8c3RyZWV0TmFtZT5NeSBTdHJlZXQ8L3N0cmVldE5hbWU+IiArCi0gICAgICAgICAgICAiPHN0cmVldE5vPjE8L3N0cmVldE5vPiIgKwotICAgICAgICAgICAgIjwvYWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8YWRkcmVzcz4iICsKLSAgICAgICAgICAgICI8c3RyZWV0TmFtZT5NeSBTdHJlZXQyPC9zdHJlZXROYW1lPiIgKwotICAgICAgICAgICAgIjxzdHJlZXRObz4yPC9zdHJlZXRObz4iICsKLSAgICAgICAgICAgICI8L2FkZHJlc3M+IiArCi0gICAgICAgICAgICAiPC9yb290PiI7Ci0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLCAxLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzIsIDEsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzMsIDAsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzQsIDIsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUFuZEFzc2VydChTdHJpbmcgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkQWRkcmVzc0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBlcnNvblByZXNlbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcudGVzdDEuUm9vdCIpOwotICAgICAgICBDbGFzcyBpbm5lckNsYXp6ID0gVXRpbC5nZXRGYWN0b3J5KGNsYXp6KTsKLSAgICAgICAgTWV0aG9kIHBhcnNlTWV0aG9kID0gaW5uZXJDbGF6ei5nZXRNZXRob2QoInBhcnNlIiwgbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsKLQotICAgICAgICBPYmplY3QgcGVyc29uT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IGFkZHJlc3NPYmplY3QgPSBudWxsOwotICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhvYmouZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIE1ldGhvZCByZWFkTWV0aG9kOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoInBlcnNvbiIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIHBlcnNvbk9iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGVyc29uUHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwZXJzb25PYmplY3QpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbChwZXJzb25PYmplY3QpOwotICAgICAgICAgICAgfWVsc2UgaWYgKCJhZGRyZXNzIi5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc09iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkQWRkcmVzc0NvdW50IT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9iakFycmF5ID0gKE9iamVjdFtdKWFkZHJlc3NPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFkZHJlc3NDb3VudCxvYmpBcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVNaW5PY2N1cnMwVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZU1pbk9jY3VyczBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YmY3ZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9vdGhlci9Qb3B1bGF0ZU1pbk9jY3VyczBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5vdGhlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLlV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUG9wdWxhdGVNaW5PY2N1cnMwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qCi0gICAgIDx4czplbGVtZW50IG5hbWU9IkEiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCSA8eHM6ZWxlbWVudCBuYW1lPSJCIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgPHhzOmVsZW1lbnQgbmFtZT0iQyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JIDx4czplbGVtZW50IG5hbWU9IkQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICovCi0KLSAgICAvLyBlbGVtZW50IEQgaXMgbWlzc2luZwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZzEgPSAiPHJvb3QgeG1sbnM9XCJodHRwOi8vdGVzdC5vcmdcIj4iICsKLSAgICAgICAgICAgICI8QT5JIGFtIEE8L0E+IiArCi0gICAgICAgICAgICAiPEI+SSBhbSBCMTwvQj4iICsKLSAgICAgICAgICAgICI8Qj5JIGFtIEIyPC9CPiIgKwotICAgICAgICAgICAgIjxDPkkgYW0gQzE8L0M+IiArCi0gICAgICAgICAgICAiPEM+SSBhbSBDMjwvQz4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotICAgIC8vQiBlbGVtZW50cyBhcmUgbWlzc2luZwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZzIgPSAiPHJvb3QgeG1sbnM9XCJodHRwOi8vdGVzdC5vcmdcIj4iICsKLSAgICAgICAgICAgICI8QT5JIGFtIEE8L0E+IiArCi0gICAgICAgICAgICAiPEM+SSBhbSBCMjwvQz4iICsKLSAgICAgICAgICAgICI8Qz5JIGFtIEIyPC9DPiIgKwotICAgICAgICAgICAgIjxEPkkgYW0gRDE8L0Q+IiArCi0gICAgICAgICAgICAiPC9yb290PiI7Ci0KLSAgICAvL09ubHkgQSBpcyBwcmVzZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMyA9ICI8cm9vdCB4bWxucz1cImh0dHA6Ly90ZXN0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxBPkkgYW0gQTwvQT4iICsKLSAgICAgICAgICAgICI8L3Jvb3Q+IjsKLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLCAyLCAiYiIpOwotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLCAyLCAiYyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVBbmRBc3NlcnQoeG1sU3RyaW5nMiwgMCwgImIiKTsKLSAgICAgICAgcG9wdWxhdGVBbmRBc3NlcnQoeG1sU3RyaW5nMiwgMiwgImMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzMsIDAsICJiIik7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzMsIDEsICJhIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQW5kQXNzZXJ0KFN0cmluZyBzLCBpbnQgZXhwZWN0ZWRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW10b1Rlc3QpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPQotICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoIm9yZy50ZXN0LlJvb3QiKTsKLSAgICAgICAgQ2xhc3MgaW5uZXJDbGF6eiA9IFV0aWwuZ2V0RmFjdG9yeShjbGF6eik7Ci0gICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsIG5ldyBDbGFzc1tde1hNTFN0cmVhbVJlYWRlci5jbGFzc30pOwotICAgICAgICBPYmplY3Qgb2JqID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtyZWFkZXJ9KTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKG9iaik7Ci0KLSAgICAgICAgT2JqZWN0IHN0cmluZ0FycmF5ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8ob2JqLmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKGl0ZW10b1Rlc3QuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIHN0cmluZ0FycmF5ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RlZENvdW50IT0wKXsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3RyaW5nQXJyYXkpOwotICAgICAgICAgICAgU3RyaW5nW10gYXJyYXkgPSAoU3RyaW5nW10pIHN0cmluZ0FycmF5OwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5Lmxlbmd0aCwgZXhwZWN0ZWRDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVNaXhlZE1pbm9jY3VyczBUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlTWl4ZWRNaW5vY2N1cnMwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JlMGJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVNaXhlZE1pbm9jY3VyczBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5vdGhlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLlV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUG9wdWxhdGVNaXhlZE1pbm9jY3VyczBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoKLQotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50IiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFJlc3BvbnNlVHlwZSIvPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RyaW5nTGlzdFJlc3BvbnNlVHlwZSI+Ci0gICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZ0xpc3QiIHR5cGU9InRuczpTdHJpbmdMaXN0Ii8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uIiB0eXBlPSJ0bnM6RXhjZXB0aW9uVHlwZSIvPgotICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdMaXN0Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAqLwotCi0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcxID0gIjxzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50ICIgKwotICAgICAgICAgICAgInhtbG5zPVwiaHR0cDovL3JlY3Vyc2lvbjEub3JnXCI+IiArCi0gICAgICAgICAgICAiPHN0cmluZ0xpc3Q+IiArCi0gICAgICAgICAgICAiPHM+aXRlbTE8L3M+IiArCi0gICAgICAgICAgICAiPHM+aXRlbTI8L3M+IiArCi0gICAgICAgICAgICAiPHM+aXRlbTM8L3M+IiArCi0gICAgICAgICAgICAiPC9zdHJpbmdMaXN0PiIgKwotICAgICAgICAgICAgIjwvc3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudD4iOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nMiA9ICI8c3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudCAiICsKLSAgICAgICAgICAgICJ4bWxucz1cImh0dHA6Ly9yZWN1cnNpb24xLm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxzdHJpbmdMaXN0PiIgKwotICAgICAgICAgICAgIjwvc3RyaW5nTGlzdD4iICsKLSAgICAgICAgICAgICI8L3N0cmluZ0xpc3RSZXNwb25zZUVsZW1lbnQ+IjsKLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZUFuZEFzc2VydCh4bWxTdHJpbmcxLDMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVBbmRBc3NlcnQoeG1sU3RyaW5nMiwwKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUFuZEFzc2VydChTdHJpbmcgcyxpbnQgY291bnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcucmVjdXJzaW9uMS5TdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50Iik7Ci0gICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBpbm5lckNsYXp6LmdldE1ldGhvZCgicGFyc2UiLCBuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotCi0gICAgICAgIE9iamVjdCBzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8ob2JqLmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoInN0cmluZ0xpc3RSZXNwb25zZUVsZW1lbnQiLmVxdWFscyhkaXNwbGF5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50ID0gcmVhZE1ldGhvZC5pbnZva2Uob2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudCk7Ci0KLSAgICAgICAgYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oc3RyaW5nTGlzdFJlc3BvbnNlRWxlbWVudC5nZXRDbGFzcygpKTsKLSAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgT2JqZWN0IHN0cmluZ0FycmF5ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgaWYgKCJzdHJpbmdMaXN0Ii5lcXVhbHMoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQXJyYXkgPSByZWFkTWV0aG9kLmludm9rZShzdHJpbmdMaXN0UmVzcG9uc2VFbGVtZW50LCBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3RyaW5nQXJyYXkpOwotCi0gICAgICAgIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHN0cmluZ0FycmF5LmdldENsYXNzKCkpOwotICAgICAgICBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBPYmplY3Qgc0FycmF5ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgaWYgKCJzdHJpbmdMaXN0Ii5lcXVhbHMoZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgc0FycmF5ID0gcmVhZE1ldGhvZC5pbnZva2Uoc3RyaW5nQXJyYXksIG51bGwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzQXJyYXkhPW51bGwpewotICAgICAgICAgICAgT2JqZWN0W10gYXJyYXkgPSAoT2JqZWN0W10pc0FycmF5OwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LGFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVQYXJ0aWNsZUFsbFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVQYXJ0aWNsZUFsbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1NmYxNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlUGFydGljbGVBbGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZVBhcnRpY2xlQWxsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmcgPSAiPG15UGFydGljbGVBbGxFbGVtZW50IHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlc1wiPiIgKwotICAgICAgICAgICAgIjx2YXJGbG9hdD4zLjM8L3ZhckZsb2F0PiIgKwotICAgICAgICAgICAgIjx2YXJTdHJpbmc+Zm9vPC92YXJTdHJpbmc+IiArCi0gICAgICAgICAgICAiPC9teVBhcnRpY2xlQWxsRWxlbWVudD4iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcuc29hcGludGVyb3AudHlwZXMuTXlQYXJ0aWNsZUFsbEVsZW1lbnQiKTsKLSAgICAgICAgQ2xhc3MgaW5uZXJDbGF6eiA9IFV0aWwuZ2V0RmFjdG9yeShjbGF6eik7Ci0gICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLSAgICAgICAgT2JqZWN0IG15UGFydGljbGVBbGxFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSAgSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydHlEZXNjcmlwdG9ycyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWV0aG9kIHJlYWRNZXRob2Q7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoIm15UGFydGljbGVBbGxFbGVtZW50Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBteVBhcnRpY2xlQWxsRWxlbWVudCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgKE9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKG15UGFydGljbGVBbGxFbGVtZW50KTsKLQotICAgICAgICBCZWFuSW5mbyBzdHJ1Y3RCZWFuSW5mbyA9ICBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8obXlQYXJ0aWNsZUFsbEVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHN0cnVjdFByb3BlcnR5RGVzY3JpcHRvcnMgPSBzdHJ1Y3RCZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RydWN0UHJvcGVydHlEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciA9IHN0cnVjdFByb3BlcnR5RGVzY3JpcHRvcnNbaV07Ci0gICAgICAgICAgICBpZiAoInZhckZsb2F0Ii5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICByZWFkTWV0aG9kID0gcHJvcGVydHlEZXNjcmlwdG9yLmdldFJlYWRNZXRob2QoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhckZsb2F0IGlzIG5vdCBwcm9wZXJseSBzZXQiLG5ldyBGbG9hdCgzLjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5pbnZva2UobXlQYXJ0aWNsZUFsbEVsZW1lbnQsIChPYmplY3RbXSkgbnVsbCkpOwotCi0gICAgICAgICAgICB9ZWxzZSBpZiAoInZhclN0cmluZyIuZXF1YWxzKHByb3BlcnR5RGVzY3JpcHRvci5nZXREaXNwbGF5TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBub3QgYmUgc2V0ICEgLSBpdCBzaG91bGQgcmV0dXJuIHplcm8KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhclN0cmluZyBpcyBub3QgcHJvcGVybHkgc2V0IiwiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2QuaW52b2tlKG15UGFydGljbGVBbGxFbGVtZW50LCAoT2JqZWN0W10pIG51bGwpKTsKLQotICAgICAgICAgICAgfWVsc2UgaWYgKCJ2YXJJbnQiLmVxdWFscyhwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0RGlzcGxheU5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJlYWRNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgbm90IGJlIHNldCAhIC0gaXQgc2hvdWxkIHJldHVybiB6ZXJvCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YXJJbnQgaXMgbm90IHByb3Blcmx5IHNldCIsbmV3IEludGVnZXIoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkTWV0aG9kLmludm9rZShteVBhcnRpY2xlQWxsRWxlbWVudCwgKE9iamVjdFtdKSBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVSZWN1cnNpdmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL290aGVyL1BvcHVsYXRlUmVjdXJzaXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQ3Y2E2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvb3RoZXIvUG9wdWxhdGVSZWN1cnNpdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLm90aGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1bGF0ZVJlY3Vyc2l2ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLS8vIGFsbCBhcmUgcHJlc2VudAotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZzEgPSAiPEUgeG1sbnM9XCJodHRwOi8vcmVjdXJzaW9uLm9yZ1wiPiIgKwotICAgICAgICAgICAgIjxFPnRlc3Q8L0U+IiArCi0gICAgICAgICAgICAiPC9FPiI7Ci0KLQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlQW5kQXNzZXJ0KHhtbFN0cmluZzEpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQW5kQXNzZXJ0KFN0cmluZyBzCi0gICAgKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnJlY3Vyc2lvbi5FIik7Ci0gICAgICAgIENsYXNzIGlubmVyQ2xhenogPSBVdGlsLmdldEZhY3RvcnkoY2xhenopOwotICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBpbm5lckNsYXp6LmdldE1ldGhvZCgicGFyc2UiLCBuZXcgQ2xhc3NbXXtYTUxTdHJlYW1SZWFkZXIuY2xhc3N9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBhcnNlTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotCi0gICAgICAgIE9iamVjdCBlT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8ob2JqLmdldENsYXNzKCkpOwotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gYmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBNZXRob2QgcmVhZE1ldGhvZDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3JzW2ldOwotICAgICAgICAgICAgaWYgKCJlIi5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yLmdldERpc3BsYXlOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZE1ldGhvZCA9IHByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgZU9iamVjdCA9IHJlYWRNZXRob2QuaW52b2tlKG9iaiwgbnVsbCk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVPYmplY3QpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlT2JqZWN0LmdldENsYXNzKCkuZXF1YWxzKENsYXNzLmZvck5hbWUoIm9yZy5yZWN1cnNpb24uVHlwZUUiKSkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL0Fic3RyYWN0U2ltcGxlUG9wdWxhdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9BYnN0cmFjdFNpbXBsZVBvcHVsYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU5NWNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL0Fic3RyYWN0U2ltcGxlUG9wdWxhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuVXRpbDsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2ltcGxlUG9wdWxhdGVyIGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgIFN0cmluZyBjbGFzc05hbWU9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENsYXNzIHByb3BlcnR5Q2xhc3MgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiAgU2ltcGxlIHJldXNhYmxlIG1ldGhvZCB0byBtYWtlIG9iamVjdCBpbnN0YW5jZXMgdmlhIHJlZmxlY3Rpb24KLSAgICAgKiBAcGFyYW0gdGVzdFN0cmluZwotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHByb2Nlc3MoU3RyaW5nIHRlc3RTdHJpbmcsU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgQ2xhc3MgaW5uZXJDbGF6eiA9IFV0aWwuZ2V0RmFjdG9yeShjbGF6eik7Ci0gICAgICAgIE1ldGhvZCBwYXJzZU1ldGhvZCA9IGlubmVyQ2xhenouZ2V0TWV0aG9kKCJwYXJzZSIsbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwYXJzZU1ldGhvZC5pbnZva2UobnVsbCxuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsKLQotICAgICAgICByZXR1cm4gb2JqOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltcGxlIG1ldGhvZCB0byBjb21wYXJlLiBNYXkgYmUgb3ZlcnJpZGRlbgotICAgICAqIEBwYXJhbSB4bWxUb1NldAotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tWYWx1ZShTdHJpbmcgeG1sVG9TZXQsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBvID0gcHJvY2Vzcyh4bWxUb1NldCwgY2xhc3NOYW1lKTsKLSAgICAgICAgQ2xhc3MgYmVhbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICBCZWFuSW5mbyBpbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW5DbGFzcyk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BEZXNjcyA9IGluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BEZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BEZXNjID0gcHJvcERlc2NzW2ldOwotICAgICAgICAgICAgaWYgIChwcm9wRGVzYy5nZXRQcm9wZXJ0eVR5cGUoKS5lcXVhbHMocHJvcGVydHlDbGFzcykpewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gY29udmVydFRvU3RyaW5nKHByb3BEZXNjLmdldFJlYWRNZXRob2QoKS5pbnZva2UobywKLSAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RbXSkgbnVsbCkpOwotICAgICAgICAgICAgICAgIGNvbXBhcmUodmFsdWUscyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgIC8qKgotICAgICAqIENvbXBhcmVzIHNlcmlhbGl6YXRpb25zIC0gbWF5IGJlIG92ZXJyaWRkZW4KLSAgICAgKiBAcGFyYW0gbwotICAgICAqIEBwYXJhbSB4bWxUb1NldAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgQ29tcGFyZU9NRWxlbW50U2VyaWFsaXphdGlvbnMoT2JqZWN0IG8sIFN0cmluZyB4bWxUb1NldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gZ2V0T01FbGVtZW50KG8pOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFvcyk7Ci0gICAgICAgIGVsZW1lbnQuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgIGFzc2VydFhNTEVxdWFsKGJhb3MudG9TdHJpbmcoKSx4bWxUb1NldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE9NIGVsZW1lbnQgdmlhIHJlZmxlY3Rpb24KLSAgICAgKiBAcGFyYW0gYmVhbgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KE9iamVjdCBiZWFuKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGJlYW4uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldE9NRWxlbWVudCIsIG5ldyBDbGFzc1tdewotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUuY2xhc3MsCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkuY2xhc3N9KTsKLQotICAgICAgICByZXR1cm4gKE9NRWxlbWVudCkgbWV0aG9kLmludm9rZShiZWFuLCBuZXcgT2JqZWN0W117bnVsbCwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCl9KTsKLQotICAgIH0KLSAgICAvKioKLSAgICAgKiB2YWx1ZSBjb21wYXJpc29tCi0gICAgICogQHBhcmFtIHZhbDEKLSAgICAgKiBAcGFyYW0gdmFsMgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmUoU3RyaW5nIHZhbDEsU3RyaW5nIHZhbDIpewotICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsdmFsMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udmVyc2lvbiAtIG1heSBiZSBvdmVycmlkZGVucwotICAgICAqIEBwYXJhbSBvCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKXsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQW55VVJJUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQW55VVJJUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDFlMTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUFueVVSSVBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVBbnlVUklQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXSA9IHsiaHR0cDovL3d3dy53aXNjLmVkdS9ncmFkL2VkdWNhdGlvbi9tYXMvMjI5Lmh0bWwiLAotICAgICAgICAgICAgImZ0cDovL2dyYWQvZWR1Y2F0aW9uL21hcy8yMjkuaHRtbCIsCi0gICAgICAgICAgICAiaHR0cDovL21haWwuZ29vZ2xlLmNvbS9tYWlsLz9hdXRoPURRQUFBSEVBQUFDMDQxIn07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGFueVVSSVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsgdmFsdWVzWzBdKyI8L2FueVVSSVBhcmFtPiIsCi0gICAgICAgICAgICAiPGFueVVSSVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsgdmFsdWVzWzFdKyI8L2FueVVSSVBhcmFtPiIsCi0gICAgICAgICAgICAiPGFueVVSSVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iICsgdmFsdWVzWzJdKyI8L2FueVVSSVBhcmFtPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuQW55VVJJUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVVJJLmNsYXNzOwotICAgIH0KLQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQmFzZTY0QmluUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQmFzZTY0QmluUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTEzNmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUJhc2U2NEJpblBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlQmFzZTY0QmluUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGJhc2U2NEJpblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj5hYmNkQUJDRDwvYmFzZTY0QmluUGFyYW0+IiwKLSAgICAgICAgICAgICI8YmFzZTY0QmluUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPmFiY2RBQkNEMDlyVDwvYmFzZTY0QmluUGFyYW0+IiwKLSAgICB9OwotCi0gICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkJhc2U2NEJpblBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IGJ5dGVbXS5jbGFzczsKLSAgICB9Ci0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwcm9jZXNzKHhtbFN0cmluZ1swXSwib3JnLnNvYXBpbnRlcm9wLnhzZC5CYXNlNjRCaW5QYXJhbSIpOwotICAgICAgICBwcm9jZXNzKHhtbFN0cmluZ1sxXSwib3JnLnNvYXBpbnRlcm9wLnhzZC5CYXNlNjRCaW5QYXJhbSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVCb29sZWFuUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlQm9vbGVhblBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDlkYTMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVCb29sZWFuUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVCb29sZWFuUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICJ0cnVlIiwKLSAgICAgICAgICAgICJmYWxzZSIKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGJvb2xlYW5QYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisgdmFsdWVzWzBdICsiPC9ib29sZWFuUGFyYW0+IiwKLSAgICAgICAgICAgICI8Ym9vbGVhblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iKyB2YWx1ZXNbMV0gKyI8L2Jvb2xlYW5QYXJhbT4iLAotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSJvcmcuc29hcGludGVyb3AueHNkLkJvb2xlYW5QYXJhbSI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBib29sZWFuLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRGF0ZVBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU0Yzg0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZURhdGVQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT17Ci0gICAgICAgICAgICAgICAgIjIwMDItMTAtMTBaIiwKLSAgICAgICAgICAgICAgICAiMjAwMC0xMi0zMSswNTozMCIsCi0gICAgICAgICAgICAgICAgIjIwMDItMDItMjhaIgotICAgIH0gOwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxkYXRlUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrCi0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZXNbMF0pKSArIjwvZGF0ZVBhcmFtPiIsCi0gICAgICAgICAgICAiPGRhdGVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHZhbHVlc1sxXSkpKyI8L2RhdGVQYXJhbT4iLAotICAgICAgICAgICAgIjxkYXRlUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrCi0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZXNbMl0pKSsiPC9kYXRlUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EYXRlUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gamF2YS51dGlsLkRhdGUuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERhdGUgZGF0ZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGRhdGUgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUodmFsdWVzW2ldKTsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGRhdGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIFN0cmluZyBzID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKERhdGUpIG8pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRGF0ZVRpbWVQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlVGltZVBvcHVsYXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVlMzMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXRlVGltZVBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZURhdGVUaW1lUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW10gPXsiMjAwMi0xMC0xMFQxMjowMDowMCswNTowMCIsCi0gICAgICAgICAgICAiMjAwMC0xMi0zMVQxMTo1OTo1OS0wNTowMCIsCi0gICAgICAgICAgICAiMjAwMi0xMC0xMFQwNzowMDowMFoiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZGF0ZVRpbWVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZXNbMF0pKSArIjwvZGF0ZVRpbWVQYXJhbT4iLAotICAgICAgICAgICAgIjxkYXRlVGltZVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iKwotICAgICAgICAgICAgICAgICAgICBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKHZhbHVlc1sxXSkpKyI8L2RhdGVUaW1lUGFyYW0+IiwKLSAgICAgICAgICAgICI8ZGF0ZVRpbWVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+IisKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZXNbMl0pKSsiPC9kYXRlVGltZVBhcmFtPiIKLSAgICB9OwotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gU2tpcCBmb3IgSkRLMS40Ci0gICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpLnN0YXJ0c1dpdGgoIjEuNC4iKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENhbGVuZGFyIGNhbGVuZGFyOwotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotICAgICAgICBzaW1wbGVEYXRlRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUodmFsdWVzW2ldKTsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGNhbGVuZGFyKSk7Ci0gICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRhdGVUaW1lUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gQ2FsZW5kYXIuY2xhc3M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChDYWxlbmRhcikgbyk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXlQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEYXlQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlY2RiNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRGF5UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVEYXlQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICItLS0wNSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiLS0tMDYiLAotICAgICAgICAgICAgICAgICAgICAgICAgIi0tLTEyIgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPGRheVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9kYXlQYXJhbT4iLAotICAgICAgICAgICAgIjxkYXlQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwvZGF5UGFyYW0+IiwKLSAgICAgICAgICAgICI8ZGF5UGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L2RheVBhcmFtPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0ib3JnLnNvYXBpbnRlcm9wLnhzZC5EYXlQYXJhbSI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBEYXkuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKERheSlvKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEb3VibGVQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEb3VibGVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlOTI2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRG91YmxlUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVEb3VibGVQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIjIwMzAwLjAwNTU0NDMzNDIyIiwKLSAgICAgICAgICAgICIyMDMwNDU1MzQyMzQiLAotICAgICAgICAgICAgIjY2NzMzLjAwNjA2MDQzNDMiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZG91YmxlUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L2RvdWJsZVBhcmFtPiIsCi0gICAgICAgICAgICAiPGRvdWJsZVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9kb3VibGVQYXJhbT4iLAotICAgICAgICAgICAgIjxkb3VibGVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvZG91YmxlUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLkRvdWJsZVBhcmFtIjsKLSAgICAgICBwcm9wZXJ0eUNsYXNzID0gZmxvYXQuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChEb3VibGUpbykgOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVEdXJhdGlvblBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUR1cmF0aW9uUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWJlYmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUR1cmF0aW9uUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZUR1cmF0aW9uUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICJQMVkyTVQySCIsCi0gICAgICAgICAgICAiUDEzNDdNIiwKLSAgICAgICAgICAgICJQMFkxMzQ3TTBEIgotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZHVyYXRpb25QYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvZHVyYXRpb25QYXJhbT4iLAotICAgICAgICAgICAgIjxkdXJhdGlvblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9kdXJhdGlvblBhcmFtPiIsCi0gICAgICAgICAgICAiPGR1cmF0aW9uUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L2R1cmF0aW9uUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5EdXJhdGlvblBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IER1cmF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYXJlKFN0cmluZyB2YWwxLCBTdHJpbmcgdmFsMikgewotICAgICAgICBhc3NlcnRUcnVlKG5ldyAgRHVyYXRpb24odmFsMSkuZXF1YWxzKG5ldyBEdXJhdGlvbih2YWwyKSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoRHVyYXRpb24pbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZUZsb2F0UG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRmxvYXRQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MzM2ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlRmxvYXRQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZUZsb2F0UG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0KLSAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109ewotICAgICAgICAgICAgICIyMDMwMC4wMDUiLAotICAgICAgICAgICAgICIzMDQ1NTM0MjM0IiwKLSAgICAgICAgICAgICAiNjY3MzMuODgiCi0KLSAgICB9OwotCi0KLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8ZmxvYXRQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvZmxvYXRQYXJhbT4iLAotICAgICAgICAgICAgIjxmbG9hdFBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9mbG9hdFBhcmFtPiIsCi0gICAgICAgICAgICAiPGZsb2F0UGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L2Zsb2F0UGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5GbG9hdFBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IGZsb2F0LmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZShTdHJpbmcgdmFsMSwgU3RyaW5nIHZhbDIpIHsKLSAgICAgICAgLy93ZSBuZWVkIHRvIHJldGhpbmsgYSB3YXkgdG8gY29tcGFyZSB0aGVzZSB2YWx1ZXMgc2luY2UgdGhlaXIgcHJlY2lzaW9uCi0gICAgICAgIC8vZGlmZmVycwotICAgICAgICAvL2NoZWNrIGZvciBudWxsIGZvciBub3cKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWwxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWwyKTsKLSAgICAgICAgLy8gc3VwZXIuY29tcGFyZSh2YWwxLCB2YWwyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKEZsb2F0KW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVIZXhCaW5hcnlQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVIZXhCaW5hcnlQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiYWI5Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlSGV4QmluYXJ5UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVIZXhCaW5hcnlQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMEZCNyIsCi0gICAgICAgICAgICAiRkZGRkZGRkYiLAotICAgICAgICAgICAgIjE5NzgiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8aGV4QmluUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L2hleEJpblBhcmFtPiIsCi0gICAgICAgICAgICAiPGhleEJpblBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9oZXhCaW5QYXJhbT4iLAotICAgICAgICAgICAgIjxoZXhCaW5QYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvaGV4QmluUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5IZXhCaW5QYXJhbSI7Ci0gICAgICAgIHByb3BlcnR5Q2xhc3MgPSBIZXhCaW5hcnkuY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgY2hlY2tWYWx1ZSh4bWxTdHJpbmdbaV0sdmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZygoSGV4QmluYXJ5KW8pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmUoU3RyaW5nIHZhbDEsIFN0cmluZyB2YWwyKSB7Ci0gICAgICAgYXNzZXJ0VHJ1ZSh2YWwxLmVxdWFsc0lnbm9yZUNhc2UodmFsMikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVNb250aERheVBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZU1vbnRoRGF5UG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2E2NjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZU1vbnRoRGF5UG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZU1vbnRoRGF5UG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT0gewotICAgICAgICAgICAgIi0tMDUtMTIiLAotICAgICAgICAgICAgIi0tMDYtMzAiLAotICAgICAgICAgICAgIi0tMTItMzEiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8bW9udGhEYXlQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMF0rIjwvbW9udGhEYXlQYXJhbT4iLAotICAgICAgICAgICAgIjxtb250aERheVBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC9tb250aERheVBhcmFtPiIsCi0gICAgICAgICAgICAiPG1vbnRoRGF5UGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L21vbnRoRGF5UGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5Nb250aERheVBhcmFtIjsKLSAgICAgICAgcHJvcGVydHlDbGFzcyA9IE1vbnRoRGF5LmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE1vbnRoRGF5KW8pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZVFOYW1lUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlUU5hbWVQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1NmMxMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlUU5hbWVQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuc2ltcGxlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZVFOYW1lUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPHFOYW1lUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPnVuaXZlcnNpdHk8L3FOYW1lUGFyYW0+IiwKLSAgICAgICAgICAgICI8cU5hbWVQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCIgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIj5uczE6YXhpczI8L3FOYW1lUGFyYW0+IgotICAgICAgICAgICAgLy8iPHFOYW1lUGFyYW0+aHR0cDovL21haWwuZ29vZ2xlLmNvbS9tYWlsLz9hdXRoPURRQUFBSEVBQUFDMDQxPC9xTmFtZVBhcmFtPiIKLSAgICB9OwotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzcyh4bWxTdHJpbmdbMF0sIm9yZy5zb2FwaW50ZXJvcC54c2QuUU5hbWVQYXJhbSIpOwotICAgICAgICBwcm9jZXNzKHhtbFN0cmluZ1sxXSwib3JnLnNvYXBpbnRlcm9wLnhzZC5RTmFtZVBhcmFtIik7Ci0gICAgICAgLy8gcHJvY2Vzcyh4bWxTdHJpbmdbMl0sIm9yZy5zb2FwaW50ZXJvcC5xTmFtZVBhcmFtIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZVRpbWVQb3B1bGF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVUaW1lUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjVmY2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZVRpbWVQb3B1bGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEucG9wdWxhdGUuc2ltcGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVUaW1lUG9wdWxhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXJ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVzW109IHsKLSAgICAgICAgICAgICIxMzoyMDowMFoiLAotICAgICAgICAgICAgIjIzOjU5OjU5KzA1OjMwIiwKLSAgICAgICAgICAgICIyMzo1OTo1OSIKLSAgICB9OwotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjx0aW1lUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzBdKyI8L3RpbWVQYXJhbT4iLAotICAgICAgICAgICAgIjx0aW1lUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L3RpbWVQYXJhbT4iLAotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5UaW1lUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gVGltZS5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgVGltZSB0aW1lOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgdGltZSA9IG5ldyBUaW1lKHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx0aW1lLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChUaW1lKW8pOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ01vbnRoUG9wdWxhdGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ01vbnRoUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNjlkZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdNb250aFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFNpbXBsZVR5cGVnTW9udGhQb3B1bGF0ZVRlc3QgIGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVQb3B1bGF0ZXIgewotICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZXNbXT17Ci0gICAgICAgICAgICAgIi0tMDEtLSIsCi0gICAgICAgICAgICAgIi0tMTItLSIsCi0gICAgICAgICAgICAgIi0tMDMtLSIKLQotICAgIH07Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZ1tdID0gewotICAgICAgICAgICAgIjxtb250aFBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC9tb250aFBhcmFtPiIsCi0gICAgICAgICAgICAiPG1vbnRoUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzFdKyI8L21vbnRoUGFyYW0+IiwKLSAgICAgICAgICAgICI8bW9udGhQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMl0rIjwvbW9udGhQYXJhbT4iCi0gICAgfTsKLQotCi0gICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNsYXNzTmFtZSA9ICJvcmcuc29hcGludGVyb3AueHNkLk1vbnRoUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gTW9udGguY2xhc3M7Ci0gICAgfQotCi0gICAgLy8gZm9yY2Ugb3RoZXJzIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3B1bGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKE1vbnRoKW8pOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ1llYXJNb250aFBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdZZWFyTW9udGhQb3B1bGF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNmEwNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9TaW1wbGVUeXBlZ1llYXJNb250aFBvcHVsYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5wb3B1bGF0ZS5zaW1wbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlZ1llYXJNb250aFBvcHVsYXRlVGVzdCBleHRlbmRzIEFic3RyYWN0U2ltcGxlUG9wdWxhdGVyewotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMDAwMS0wNSIsCi0gICAgICAgICAgICAiLTAyMzQtMDkiLAotICAgICAgICAgICAgIjE5NzgtMDEiLAotICAgICAgICAgICAgIjE5NzgtMDEtR01UIgotICAgIH07Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sU3RyaW5nW10gPSB7Ci0gICAgICAgICAgICAiPHllYXJNb250aFBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC95ZWFyTW9udGhQYXJhbT4iLAotICAgICAgICAgICAgIjx5ZWFyTW9udGhQYXJhbSB4bWxucz1cImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkXCI+Iit2YWx1ZXNbMV0rIjwveWVhck1vbnRoUGFyYW0+IiwKLSAgICAgICAgICAgICI8eWVhck1vbnRoUGFyYW0geG1sbnM9XCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZFwiPiIrdmFsdWVzWzJdKyI8L3llYXJNb250aFBhcmFtPiIKLSAgICB9OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5zb2FwaW50ZXJvcC54c2QuWWVhck1vbnRoUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gWWVhck1vbnRoLmNsYXNzOwotICAgIH0KLQotICAgIC8vIGZvcmNlIG90aGVycyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIGNoZWNrVmFsdWUoeG1sU3RyaW5nW2ldLHZhbHVlc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzcyh4bWxTdHJpbmdbM10sIm9yZy5zb2FwaW50ZXJvcC55ZWFyTW9udGhQYXJhbSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhPYmplY3QgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoKFllYXJNb250aClvKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL1NpbXBsZVR5cGVnWWVhclBvcHVsYXRlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdZZWFyUG9wdWxhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWQ4ZTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9wb3B1bGF0ZS9zaW1wbGUvU2ltcGxlVHlwZWdZZWFyUG9wdWxhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnBvcHVsYXRlLnNpbXBsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlZ1llYXJQb3B1bGF0ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVBvcHVsYXRlcnsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlc1tdPSB7Ci0gICAgICAgICAgICAiMDAwMSIsCi0gICAgICAgICAgICAiLTAyMzQiLAotICAgICAgICAgICAgIjE5NzgiCi0gICAgfTsKLSAgICBwcml2YXRlIFN0cmluZyB4bWxTdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICI8eWVhclBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1swXSsiPC95ZWFyUGFyYW0+IiwKLSAgICAgICAgICAgICI8eWVhclBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1sxXSsiPC95ZWFyUGFyYW0+IiwKLSAgICAgICAgICAgICI8eWVhclBhcmFtIHhtbG5zPVwiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2RcIj4iK3ZhbHVlc1syXSsiPC95ZWFyUGFyYW0+IgotICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjbGFzc05hbWUgPSAib3JnLnNvYXBpbnRlcm9wLnhzZC5ZZWFyUGFyYW0iOwotICAgICAgICBwcm9wZXJ0eUNsYXNzID0gWWVhci5jbGFzczsKLSAgICB9Ci0KLSAgICAvLyBmb3JjZSBvdGhlcnMgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcHVsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1ZhbHVlKHhtbFN0cmluZ1tpXSx2YWx1ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKChZZWFyKW8pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL3BhY2thZ2UuaHRtbCBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcG9wdWxhdGUvc2ltcGxlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0MDI2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3BvcHVsYXRlL3NpbXBsZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08aHRtbD4NCi08Ym9keT4NCi0gICBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyB0ZXN0cw0KLSAgIA0KLSAgICAgICAgMy4yLjEgc3RyaW5nDQotICAgICAgICAzLjIuMiBib29sZWFuDQotICAgICAgICAzLjIuMyBkZWNpbWFsDQotICAgICAgICAzLjIuNCBmbG9hdA0KLSAgICAgICAgMy4yLjUgZG91YmxlDQotICAgICAgICAzLjIuNiBkdXJhdGlvbg0KLSAgICAgICAgMy4yLjcgZGF0ZVRpbWUNCi0gICAgICAgIDMuMi44IHRpbWUNCi0gICAgICAgIDMuMi45IGRhdGUNCi0gICAgICAgIDMuMi4xMCBnWWVhck1vbnRoDQotICAgICAgICAzLjIuMTEgZ1llYXINCi0gICAgICAgIDMuMi4xMiBnTW9udGhEYXkNCi0gICAgICAgIDMuMi4xMyBnRGF5DQotICAgICAgICAzLjIuMTQgZ01vbnRoDQotICAgICAgICAzLjIuMTUgaGV4QmluYXJ5DQotICAgICAgICAzLjIuMTYgYmFzZTY0QmluYXJ5DQotICAgICAgICAzLjIuMTcgYW55VVJJDQotICAgICAgICAzLjIuMTggUU5hbWUNCi0gICAgICAgIDMuMi4xOSBOT1RBVElPTiAgJmx0Oz0gTm90IGNvbXBsZXRlbHkgdGVzdGVkDQotDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3JhbXBhcnQvUmFtcGFydFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmFtcGFydC9SYW1wYXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTk4NDk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmFtcGFydC9SYW1wYXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5yYW1wYXJ0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS5CYXNlNjRCaW5hcnk7Ci1pbXBvcnQgb3JnLnczLnd3dy5fMjAwNS5fMDUueG1sbWltZS5Db250ZW50VHlwZV90eXBlMDsKLWltcG9ydCBvcmcudzMud3d3Ll8yMDA1Ll8wNS54bWxtaW1lLlRlc3RFeHRlbnNpb247Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIFJhbXBhcnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbigpewotICAgICAgICBUZXN0RXh0ZW5zaW9uIHRlc3RFeHRlbnNpb24gPSBuZXcgVGVzdEV4dGVuc2lvbigpOwotCi0gICAgICAgIEJhc2U2NEJpbmFyeSBiYXNlNjRCaW5hcnkgPSBuZXcgQmFzZTY0QmluYXJ5KCk7Ci0gICAgICAgIHRlc3RFeHRlbnNpb24uc2V0VGVzdEV4dGVuc2lvbihiYXNlNjRCaW5hcnkpOwotCi0gICAgICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3QgYmFzZSA2NCBlbGVlbW50IjsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIGJhc2U2NEJpbmFyeS5zZXRCYXNlNjRCaW5hcnkoZGF0YUhhbmRsZXIpOwotCi0gICAgICAgIENvbnRlbnRUeXBlX3R5cGUwIGNvbnRlbnRUeXBlX3R5cGUwID0gbmV3IENvbnRlbnRUeXBlX3R5cGUwKCk7Ci0gICAgICAgIGNvbnRlbnRUeXBlX3R5cGUwLnNldENvbnRlbnRUeXBlX3R5cGUwKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICBiYXNlNjRCaW5hcnkuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVfdHlwZTApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdEV4dGVuc2lvbi5nZXRPTUVsZW1lbnQoVGVzdEV4dGVuc2lvbi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdEV4dGVuc2lvbiByZXN1bHQgPSBUZXN0RXh0ZW5zaW9uLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9yZWZlcmVuY2VzL0VsZW1lbnRSZWZlcmVuY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3JlZmVyZW5jZXMvRWxlbWVudFJlZmVyZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkOWUyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3JlZmVyZW5jZXMvRWxlbWVudFJlZmVyZW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnJlZmVyZW5jZXM7Ci0KLWltcG9ydCBjb20uYW1lcmljYW5leHByZXNzLnd3dy53c2RsLmN0bi51dGlsaXRpZXMuYXRiLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnRSZWZlcmVuY2UoKSB7Ci0gICAgICAgIENoZWNrRWxpZ2liaWxpdHkxIGVjaENoZWNrRWxpZ2liaWxpdHkxID0gbmV3IENoZWNrRWxpZ2liaWxpdHkxKCk7Ci0gICAgICAgIEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5X3R5cGUwIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5ID0gbmV3IEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5X3R5cGUwKCk7Ci0gICAgICAgIGVjaENoZWNrRWxpZ2liaWxpdHkxLnNldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkuc2V0Q2FyZE51bWJlcigiY2FybnVtYmVyIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5LnNldENsaWVudElkKCJjbGllbnRpZCIpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eS5zZXRFeHBpcmF0aW9uRGF0ZSgiZGF0ZSIpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eS5zZXROYW1lQXNPbkNhcmQoImNhcmRuYW1lIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5LnNldFllYXJPZlJlZGVtcHRpb24oMik7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGVjaENoZWNrRWxpZ2liaWxpdHkxLmdldE9NRWxlbWVudChDaGVja0VsaWdpYmlsaXR5MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBDaGVja0VsaWdpYmlsaXR5MSByZXN1bHQgPSBDaGVja0VsaWdpYmlsaXR5MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0Q2FyZE51bWJlcigpLCAiY2FybnVtYmVyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0Q2xpZW50SWQoKSwgImNsaWVudGlkIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0RXhwaXJhdGlvbkRhdGUoKSwgImRhdGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKS5nZXROYW1lQXNPbkNhcmQoKSwgImNhcmRuYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KCkuZ2V0WWVhck9mUmVkZW1wdGlvbigpLCAyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUVsZW1lbnRSZWZlcmVuY2UoKSB7Ci0gICAgICAgIENoZWNrRWxpZ2liaWxpdHkyIGVjaENoZWNrRWxpZ2liaWxpdHkyID0gbmV3IENoZWNrRWxpZ2liaWxpdHkyKCk7Ci0gICAgICAgIEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5X3R5cGUwW10gYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkgPSBuZXcgQXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlfdHlwZTBbMl07Ci0gICAgICAgIGVjaENoZWNrRWxpZ2liaWxpdHkyLnNldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KTsKLQotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVswXSA9IG5ldyBBdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eV90eXBlMCgpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVswXS5zZXRDYXJkTnVtYmVyKCJjYXJudW1iZXIiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMF0uc2V0Q2xpZW50SWQoImNsaWVudGlkIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzBdLnNldEV4cGlyYXRpb25EYXRlKCJkYXRlIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzBdLnNldE5hbWVBc09uQ2FyZCgiY2FyZG5hbWUiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMF0uc2V0WWVhck9mUmVkZW1wdGlvbigyKTsKLQotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVsxXSA9IG5ldyBBdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eV90eXBlMCgpOwotICAgICAgICBhdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eVsxXS5zZXRDYXJkTnVtYmVyKCJjYXJudW1iZXIiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMV0uc2V0Q2xpZW50SWQoImNsaWVudGlkIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzFdLnNldEV4cGlyYXRpb25EYXRlKCJkYXRlIik7Ci0gICAgICAgIGF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5WzFdLnNldE5hbWVBc09uQ2FyZCgiY2FyZG5hbWUiKTsKLSAgICAgICAgYXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHlbMV0uc2V0WWVhck9mUmVkZW1wdGlvbigyKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gZWNoQ2hlY2tFbGlnaWJpbGl0eTIuZ2V0T01FbGVtZW50KENoZWNrRWxpZ2liaWxpdHkyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIENoZWNrRWxpZ2liaWxpdHkyIHJlc3VsdCA9IENoZWNrRWxpZ2liaWxpdHkyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRDYXJkTnVtYmVyKCksICJjYXJudW1iZXIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRDbGllbnRJZCgpLCAiY2xpZW50aWQiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRFeHBpcmF0aW9uRGF0ZSgpLCAiZGF0ZSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdGJSZXF1ZXN0Q2hlY2tFbGlnaWJpbGl0eSgpWzBdLmdldE5hbWVBc09uQ2FyZCgpLCAiY2FyZG5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVswXS5nZXRZZWFyT2ZSZWRlbXB0aW9uKCksIDIpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0Q2FyZE51bWJlcigpLCAiY2FybnVtYmVyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0Q2xpZW50SWQoKSwgImNsaWVudGlkIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0RXhwaXJhdGlvbkRhdGUoKSwgImRhdGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXRiUmVxdWVzdENoZWNrRWxpZ2liaWxpdHkoKVsxXS5nZXROYW1lQXNPbkNhcmQoKSwgImNhcmRuYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0YlJlcXVlc3RDaGVja0VsaWdpYmlsaXR5KClbMV0uZ2V0WWVhck9mUmVkZW1wdGlvbigpLCAyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50MTEoKXsKLQotICAgICAgICBFbGVtZW50MSBlbGVtZW50MSA9IG5ldyBFbGVtZW50MSgpOwotICAgICAgICBDb21wbGV4VHlwZTEgY29tcGxleFR5cGUxID0gbmV3IENvbXBsZXhUeXBlMSgpOwotICAgICAgICBlbGVtZW50MS5zZXRFbGVtZW50MShjb21wbGV4VHlwZTEpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gZWxlbWVudDEuZ2V0T01FbGVtZW50KEVsZW1lbnQxLk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBFbGVtZW50MSByZXN1bHQgPSBFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudDEyKCl7Ci0KLSAgICAgICAgRWxlbWVudDEgZWxlbWVudDEgPSBuZXcgRWxlbWVudDEoKTsKLSAgICAgICAgQ29tcGxleFR5cGUxIGNvbXBsZXhUeXBlMSA9IG5ldyBDb21wbGV4VHlwZTEoKTsKLSAgICAgICAgZWxlbWVudDEuc2V0RWxlbWVudDEoY29tcGxleFR5cGUxKTsKLSAgICAgICAgQ29tcGxleFR5cGUxIGNvbXBsZXhUeXBlMiA9IG5ldyBDb21wbGV4VHlwZTEoKTsKLSAgICAgICAgY29tcGxleFR5cGUxLnNldEVsZW1lbnQxKGNvbXBsZXhUeXBlMik7Ci0gICAgICAgIENvbXBsZXhUeXBlMSBjb21wbGV4VHlwZTMgPSBuZXcgQ29tcGxleFR5cGUxKCk7Ci0gICAgICAgIGNvbXBsZXhUeXBlMi5zZXRFbGVtZW50MShjb21wbGV4VHlwZTMpOwotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBlbGVtZW50MS5nZXRPTUVsZW1lbnQoRWxlbWVudDEuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEVsZW1lbnQxIHJlc3VsdCA9IEVsZW1lbnQxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldEVsZW1lbnQxKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0RWxlbWVudDEoKS5nZXRFbGVtZW50MSgpKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50MjEoKXsKLSAgICAgICAgRWxlbWVudDIgZWxlbWVudDIgPSBuZXcgRWxlbWVudDIoKTsKLSAgICAgICAgRWxlbWVudDJfdHlwZTAgZWxlbWVudDJfdHlwZTAgPSBuZXcgRWxlbWVudDJfdHlwZTAoKTsKLSAgICAgICAgZWxlbWVudDIuc2V0RWxlbWVudDIoZWxlbWVudDJfdHlwZTApOwotICAgICAgICBlbGVtZW50Ml90eXBlMC5zZXRQYXJhbTEoInRlc3Qgc3RyaW5nMSIpOwotCi0gICAgICAgIEVsZW1lbnQyX3R5cGUwIGVsZW1lbnQyX3R5cGUxID0gbmV3IEVsZW1lbnQyX3R5cGUwKCk7Ci0gICAgICAgIGVsZW1lbnQyX3R5cGUxLnNldFBhcmFtMSgidGVzdCBzdHJpbmcyIik7Ci0gICAgICAgIGVsZW1lbnQyX3R5cGUwLnNldEVsZW1lbnQyKGVsZW1lbnQyX3R5cGUxKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGVsZW1lbnQyLmdldE9NRWxlbWVudChFbGVtZW50Mi5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbG1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBlbGVtZW50ID09PiIgKyBvbUVsbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbG1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgRWxlbWVudDIgcmVzdWx0ID0gRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRFbGVtZW50MigpLmdldFBhcmFtMSgpLCJ0ZXN0IHN0cmluZzEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0RWxlbWVudDIoKS5nZXRFbGVtZW50MigpLmdldFBhcmFtMSgpLCAidGVzdCBzdHJpbmcyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVmZXJlbmNlKCkgewotICAgICAgICBUZXN0U2ltcGxlUmVmZXJlbmNlIHRlc3RTaW1wbGVSZWZlcmVuY2UgPSBuZXcgVGVzdFNpbXBsZVJlZmVyZW5jZSgpOwotICAgICAgICBEaXNjYXJkX3RyYW5zZmVyVG9rZW4gZGlzY2FyZF90cmFuc2ZlclRva2VuID0gbmV3IERpc2NhcmRfdHJhbnNmZXJUb2tlbigpOwotLy8gRklYTUU6IEJyZWFrcyBpbiBJQk0gSkRLIDEuNSAtIHRoZSBnZW5lcmF0ZWQgY29kZSB0aGVyZSBpcyBsb29raW5nIGZvciBBdXRoSW5mb190eXBlMCBpbnN0ZWFkIG9mIEF1dGhJbmZvX3R5cGUxCi0vLyAgICAgICAgQXV0aEluZm9fdHlwZTEgYXV0aEluZm9fdHlwZTEgPSBuZXcgQXV0aEluZm9fdHlwZTEoKTsKLS8vICAgICAgICBhdXRoSW5mb190eXBlMS5zZXRBdXRoSW5mb190eXBlMSgiU2ltcGxlIHBhcmFtIik7Ci0vLyAgICAgICAgZGlzY2FyZF90cmFuc2ZlclRva2VuLnNldEF1dGhJbmZvKGF1dGhJbmZvX3R5cGUxKTsKLSAgICAgICAgZGlzY2FyZF90cmFuc2ZlclRva2VuLnNldFBhcmFtMSgiTmV3IHBhcm0iKTsKLSAgICAgICAgdGVzdFNpbXBsZVJlZmVyZW5jZS5zZXRUZXN0U2ltcGxlUmVmZXJlbmNlKGRpc2NhcmRfdHJhbnNmZXJUb2tlbik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U2ltcGxlUmVmZXJlbmNlLmdldE9NRWxlbWVudChUZXN0U2ltcGxlUmVmZXJlbmNlLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbG1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBlbGVtZW50ID09PiIgKyBvbUVsbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbG1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNpbXBsZVJlZmVyZW5jZSByZXN1bHQgPSBUZXN0U2ltcGxlUmVmZXJlbmNlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZVJlZmVyZW5jZSgpLmdldFBhcmFtMSgpLCJOZXcgcGFybSIpOwotLy8gU2VlIEZJWE1FIGFib3ZlOgotLy8gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RTaW1wbGVSZWZlcmVuY2UoKS5nZXRBdXRoSW5mbygpLmdldEF1dGhJbmZvX3R5cGUxKCksIlNpbXBsZSBwYXJhbSIpOwotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Jlc3RyaWN0aW9uL0NvbXBsZXhSZXN0cmljdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmVzdHJpY3Rpb24vQ29tcGxleFJlc3RyaWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2QzYzhiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmVzdHJpY3Rpb24vQ29tcGxleFJlc3RyaWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5yZXN0cmljdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuR2V0RXhlbXBsYXJSZXNwb25zZVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuR2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIENvbXBsZXhSZXN0cmljdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50KCl7Ci0gICAgICAgIEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudCBnZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQgPSBuZXcgR2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50KCk7Ci0gICAgICAgIEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlIGdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlID0gbmV3IEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlKCk7Ci0gICAgICAgIGdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlLnNldEV4ZW1wbGFyKCJ0ZXN0IHN0cmluZzEiKTsKLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGUuc2V0UmVzcG9uc2VDb2RlKG5ldyBCaWdJbnRlZ2VyKCIyMyIpKTsKLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGUuc2V0UmVzcG9uc2VNZXNzYWdlKCJ0ZXN0IHN0cmluZzIiKTsKLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGUuc2V0U3VwcG9ydGVkTWV0aG9kcygidGVzdCBzdHJpbmczIik7Ci0KLSAgICAgICAgZ2V0RXhlbXBsYXJSZXNwb25zZVR5cGVFbGVtZW50LnNldEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudChnZXRFeGVtcGxhclJlc3BvbnNlVHlwZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBnZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudC5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50IHN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEdldEV4ZW1wbGFyUmVzcG9uc2VUeXBlRWxlbWVudCByZXN1bHQgPSBHZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgR2V0RXhlbXBsYXJSZXNwb25zZVR5cGUgcmVzdWx0VHlwZSA9IHJlc3VsdC5nZXRHZXRFeGVtcGxhclJlc3BvbnNlVHlwZUVsZW1lbnQoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRUeXBlLmdldEV4ZW1wbGFyKCksInRlc3Qgc3RyaW5nMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0UmVzcG9uc2VNZXNzYWdlKCksInRlc3Qgc3RyaW5nMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdFR5cGUuZ2V0U3VwcG9ydGVkTWV0aG9kcygpLCJ0ZXN0IHN0cmluZzMiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9yZXN0cmljdGlvbi9TaW1wbGVSZXN0cmljdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvcmVzdHJpY3Rpb24vU2ltcGxlUmVzdHJpY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNmZiZjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS9yZXN0cmljdGlvbi9TaW1wbGVSZXN0cmljdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnJlc3RyaWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcudGVtcHVyaS5BZGRyZXNzOwotaW1wb3J0IG9yZy50ZW1wdXJpLkNvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudDsKLWltcG9ydCBvcmcudGVtcHVyaS5FbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50OwotaW1wb3J0IG9yZy50ZW1wdXJpLkhhaXJDb2xvcl90eXBlMTsKLWltcG9ydCBvcmcudGVtcHVyaS5Ob3JtYWxTaW1wbGVUeXBlRWxlbWVudDsKLWltcG9ydCBvcmcudGVtcHVyaS5QYXJlbnRFbnVtZXJhdGlvblNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuUGFyZW50Tm9ybWFsU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5QYXJlbnRSZXN0cmljdGlvblR5cGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuUGFyZW50U2ltcGxlVHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5QZXJzb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuUGVyc29uRWxlbWVudDsKLWltcG9ydCBvcmcudGVtcHVyaS5UZXN0U2ltcGxlQXR0cmlidXRlOwotaW1wb3J0IG9yZy50ZW1wdXJpLlRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50OwotaW1wb3J0IG9yZy50ZW1wdXJpLlppcF90eXBlMTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlUmVzdHJpY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCB0ZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCA9IG5ldyBUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCgpOwotCi0gICAgICAgIFRlc3RTaW1wbGVBdHRyaWJ1dGUgdGVzdFNpbXBsZUF0dHJpYnV0ZSA9IG5ldyBUZXN0U2ltcGxlQXR0cmlidXRlKCk7Ci0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50LnNldFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50KHRlc3RTaW1wbGVBdHRyaWJ1dGUpOwotICAgICAgICB0ZXN0U2ltcGxlQXR0cmlidXRlLnNldFRlc3RFbGVtZW50MShuZXcgUU5hbWUoImh0dHA6Ly93c28yLmNvbSIsICJ0ZXN0MSIpKTsKLSAgICAgICAgdGVzdFNpbXBsZUF0dHJpYnV0ZS5zZXRUZXN0RWxlbWVudDIobmV3IFFOYW1lKCJodHRwOi8vd3NvMi5jb20iLCAidGVzdDIiKSk7Ci0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGUuc2V0VGVzdEVsZW1lbnQzKG5ldyBRTmFtZSgiaHR0cDovL3dzbzIuY29tIiwgInRlc3QzIikpOwotCi0gICAgICAgIFBhcmVudFNpbXBsZVR5cGUgcGFyZW50U2ltcGxlVHlwZTEgPSBuZXcgUGFyZW50U2ltcGxlVHlwZSgpOwotICAgICAgICBwYXJlbnRTaW1wbGVUeXBlMS5zZXRDaGlsZFNpbXBsZVR5cGUoInRlc3Qgc2ltcGxlIHR5cGUgMSIpOwotCi0gICAgICAgIFBhcmVudFNpbXBsZVR5cGUgcGFyZW50U2ltcGxlVHlwZTIgPSBuZXcgUGFyZW50U2ltcGxlVHlwZSgpOwotICAgICAgICBwYXJlbnRTaW1wbGVUeXBlMi5zZXRDaGlsZFNpbXBsZVR5cGUoInRlc3Qgc2ltcGxlIHR5cGUgMiIpOwotCi0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGUuc2V0QXR0cmliMShwYXJlbnRTaW1wbGVUeXBlMSk7Ci0gICAgICAgIHRlc3RTaW1wbGVBdHRyaWJ1dGUuc2V0QXR0cmliMihwYXJlbnRTaW1wbGVUeXBlMik7Ci0KLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50LmdldE9NRWxlbWVudChUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50IHJlc3VsdCA9IFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZUF0dHJpYnV0ZUVsZW1lbnQoKS5nZXRUZXN0RWxlbWVudDEoKSwgdGVzdFNpbXBsZUF0dHJpYnV0ZS5nZXRUZXN0RWxlbWVudDEoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFRlc3RTaW1wbGVBdHRyaWJ1dGVFbGVtZW50KCkuZ2V0VGVzdEVsZW1lbnQyKCksIHRlc3RTaW1wbGVBdHRyaWJ1dGUuZ2V0VGVzdEVsZW1lbnQyKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRUZXN0U2ltcGxlQXR0cmlidXRlRWxlbWVudCgpLmdldFRlc3RFbGVtZW50MygpLCB0ZXN0U2ltcGxlQXR0cmlidXRlLmdldFRlc3RFbGVtZW50MygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZUF0dHJpYnV0ZUVsZW1lbnQoKS5nZXRBdHRyaWIxKCkuZ2V0Q2hpbGRTaW1wbGVUeXBlKCksIHBhcmVudFNpbXBsZVR5cGUxLmdldENoaWxkU2ltcGxlVHlwZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VGVzdFNpbXBsZUF0dHJpYnV0ZUVsZW1lbnQoKS5nZXRBdHRyaWIyKCkuZ2V0Q2hpbGRTaW1wbGVUeXBlKCksIHBhcmVudFNpbXBsZVR5cGUyLmdldENoaWxkU2ltcGxlVHlwZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQoKSB7Ci0KLSAgICAgICAgTm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQgbm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQgPSBuZXcgTm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQoKTsKLSAgICAgICAgUGFyZW50Tm9ybWFsU2ltcGxlVHlwZSBwYXJlbnROb3JtYWxTaW1wbGVUeXBlID0gbmV3IFBhcmVudE5vcm1hbFNpbXBsZVR5cGUoKTsKLSAgICAgICAgbm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQuc2V0Tm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQocGFyZW50Tm9ybWFsU2ltcGxlVHlwZSk7Ci0gICAgICAgIHBhcmVudE5vcm1hbFNpbXBsZVR5cGUuc2V0Tm9ybWFsU2ltcGxlVHlwZShuZXcgUU5hbWUoImh0dHA6Ly93c28yLmNvbSIsICJ0ZXN0IikpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KE5vcm1hbFNpbXBsZVR5cGVFbGVtZW50Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIE5vcm1hbFNpbXBsZVR5cGVFbGVtZW50IHJlc3VsdCA9IE5vcm1hbFNpbXBsZVR5cGVFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0Tm9ybWFsU2ltcGxlVHlwZUVsZW1lbnQoKS5nZXROb3JtYWxTaW1wbGVUeXBlKCksIHBhcmVudE5vcm1hbFNpbXBsZVR5cGUuZ2V0Tm9ybWFsU2ltcGxlVHlwZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50KCkgewotCi0gICAgICAgIEVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQgZW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudCA9IG5ldyBFbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50KCk7Ci0gICAgICAgIGVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQuc2V0RW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudChQYXJlbnRFbnVtZXJhdGlvblNpbXBsZVR5cGUudmFsdWUxKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQuZ2V0T01FbGVtZW50KEVudW1lcmF0aW9uU2ltcGxlVHlwZUVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgRW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudCByZXN1bHQgPSBFbnVtZXJhdGlvblNpbXBsZVR5cGVFbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0RW51bWVyYXRpb25TaW1wbGVUeXBlRWxlbWVudCgpLmdldFZhbHVlKCksIFBhcmVudEVudW1lcmF0aW9uU2ltcGxlVHlwZS52YWx1ZTEuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhSZXN0cmljdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgQ29tcGxleFJlc3RyaWN0aW9uVHlwZVRlc3RFbGVtZW50IGNvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudCA9IG5ldyBDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQoKTsKLSAgICAgICAgUGFyZW50UmVzdHJpY3Rpb25UeXBlIHBhcmVudFJlc3RyaWN0aW9uVHlwZSA9IG5ldyBQYXJlbnRSZXN0cmljdGlvblR5cGUoKTsKLSAgICAgICAgY29tcGxleFJlc3RyaWN0aW9uVHlwZVRlc3RFbGVtZW50LnNldENvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudChwYXJlbnRSZXN0cmljdGlvblR5cGUpOwotICAgICAgICBwYXJlbnRSZXN0cmljdGlvblR5cGUuc2V0QmFzZVR5cGVFbGVtZW50MSgidGVzdCAxIik7Ci0gICAgICAgIHBhcmVudFJlc3RyaWN0aW9uVHlwZS5zZXRCYXNlVHlwZUVsZW1lbnQyKDUpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGNvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudC5nZXRPTUVsZW1lbnQoQ29tcGxleFJlc3RyaWN0aW9uVHlwZVRlc3RFbGVtZW50Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIENvbXBsZXhSZXN0cmljdGlvblR5cGVUZXN0RWxlbWVudCByZXN1bHQgPSBDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQoKS5nZXRCYXNlVHlwZUVsZW1lbnQxKCksIHBhcmVudFJlc3RyaWN0aW9uVHlwZS5nZXRCYXNlVHlwZUVsZW1lbnQxKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQoKS5nZXRCYXNlVHlwZUVsZW1lbnQyKCksIHBhcmVudFJlc3RyaWN0aW9uVHlwZS5nZXRCYXNlVHlwZUVsZW1lbnQyKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc29uRWxlbWVudCgpIHsKLSAgICAgICAgUGVyc29uRWxlbWVudCBwZXJzb25FbGVtZW50ID0gbmV3IFBlcnNvbkVsZW1lbnQoKTsKLSAgICAgICAgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcGVyc29uRWxlbWVudC5zZXRQZXJzb25FbGVtZW50KHBlcnNvbik7Ci0gICAgICAgIHBlcnNvbi5zZXROYW1lKCJhbWlsYSIpOwotICAgICAgICBwZXJzb24uc2V0QWdlKDIzKTsKLSAgICAgICAgcGVyc29uLnNldEhhaXJDb2xvcihIYWlyQ29sb3JfdHlwZTEuYmxhY2spOwotICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICBwZXJzb24uc2V0QmlydGhEYXRlKGRhdGUpOwotICAgICAgICBBZGRyZXNzIGFkZHJlc3MgPSBuZXcgQWRkcmVzcygpOwotICAgICAgICBwZXJzb24uc2V0QWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgYWRkcmVzcy5zZXRDaXR5KCJHYWxsZSIpOwotICAgICAgICBhZGRyZXNzLnNldExpbmUxKCJsaW5lMSIpOwotICAgICAgICBhZGRyZXNzLnNldExpbmUyKCJsaW5lMiIpOwotICAgICAgICBhZGRyZXNzLnNldFN0YXRlKCJzdGF0ZSIpOwotICAgICAgICBaaXBfdHlwZTEgemlwdHlwZSA9IG5ldyBaaXBfdHlwZTEoKTsKLSAgICAgICAgYWRkcmVzcy5zZXRaaXAoemlwdHlwZSk7Ci0gICAgICAgIHppcHR5cGUuc2V0WmlwX3R5cGUwKCJDIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBwZXJzb25FbGVtZW50LmdldE9NRWxlbWVudChDb21wbGV4UmVzdHJpY3Rpb25UeXBlVGVzdEVsZW1lbnQuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgUGVyc29uRWxlbWVudCByZXN1bHQgPSBQZXJzb25FbGVtZW50LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldE5hbWUoKSwiYW1pbGEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldEFnZSgpLDIzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldEhhaXJDb2xvcigpLEhhaXJDb2xvcl90eXBlMS5ibGFjayk7Ci0gICAgICAgICAgICBBZGRyZXNzIHJlc3VsdEFkZHJlc3MgPSByZXN1bHQuZ2V0UGVyc29uRWxlbWVudCgpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRBZGRyZXNzLmdldENpdHkoKSwiR2FsbGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRBZGRyZXNzLmdldExpbmUxKCksImxpbmUxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0QWRkcmVzcy5nZXRMaW5lMigpLCJsaW5lMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdEFkZHJlc3MuZ2V0U3RhdGUoKSwic3RhdGUiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRBZGRyZXNzLmdldFppcCgpLmdldFppcF90eXBlMCgpLCJDIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc29hcGVuY29kaW5nL1NvYXBFbmNvZGluZ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvc29hcGVuY29kaW5nL1NvYXBFbmNvZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNzNmMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3NvYXBlbmNvZGluZy9Tb2FwRW5jb2RpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS5zb2FwZW5jb2Rpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9kb3VibGU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuc29hcGVuY29kaW5nLlRlc3RDb21wbGV4VHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5zb2FwZW5jb2RpbmcuVGVzdFNvYXBFbGVtZW50MTsKLWltcG9ydCBvcmcudGVtcHVyaS5zb2FwZW5jb2RpbmcuVGVzdFNvYXBFbGVtZW50MjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNvYXBFbmNvZGluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29hcEVsZW1lbnQxMSgpIHsKLQotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBhcnJheS5zZXRBcnJheVR5cGVRTmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgImRvdWJsZSIpKTsKLSAgICAgICAgX2RvdWJsZSB0ZXN0RG91YmxlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIHRlc3REb3VibGUgPSBuZXcgX2RvdWJsZSgpOwotICAgICAgICAgICAgdGVzdERvdWJsZS5zZXRfZG91YmxlKDIzLjQ1KTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0RG91YmxlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0U29hcEVsZW1lbnQxMShhcnJheSk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDIxKGFycmF5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U29hcEVsZW1lbnQxMigpIHsKLQotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBfZG91YmxlIHRlc3REb3VibGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgdGVzdERvdWJsZSA9IG5ldyBfZG91YmxlKCk7Ci0gICAgICAgICAgICB0ZXN0RG91YmxlLnNldF9kb3VibGUoMjMuNDUpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3REb3VibGUpOwotICAgICAgICB9Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDExKGFycmF5KTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MjEoYXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwRWxlbWVudDEzKCkgewotCi0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIGFycmF5LnNldEFycmF5VHlwZVFOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiZG91YmxlIikpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fZG91YmxlIHRlc3REb3VibGU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgdGVzdERvdWJsZSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fZG91YmxlKCk7Ci0gICAgICAgICAgICB0ZXN0RG91YmxlLnNldF9kb3VibGUoMjMuNDUpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3REb3VibGUpOwotICAgICAgICB9Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDEyKGFycmF5KTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MjIoYXJyYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwRWxlbWVudDE0KCkgewotCi0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9kb3VibGUgdGVzdERvdWJsZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0RG91YmxlID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9kb3VibGUoKTsKLSAgICAgICAgICAgIHRlc3REb3VibGUuc2V0X2RvdWJsZSgyMy40NSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdERvdWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MTIoYXJyYXkpOwotICAgICAgICB0ZXN0U29hcEVsZW1lbnQyMihhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvYXBFbGVtZW50MTUoKSB7Ci0KLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgYXJyYXkuc2V0QXJyYXlUeXBlUU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvc29hcGVuY29kaW5nIiwgIlRlc3RDb21wbGV4VHlwZSIpKTsKLSAgICAgICAgVGVzdENvbXBsZXhUeXBlIHRlc3RDb21wbGV4VHlwZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUgPSBuZXcgVGVzdENvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLSAgICAgICAgICAgIHRlc3RDb21wbGV4VHlwZS5zZXRQYXJhbTIoMik7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdENvbXBsZXhUeXBlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0U29hcEVsZW1lbnQzMShhcnJheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNvYXBFbGVtZW50MTYoKSB7Ci0KLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgICAgICAgVGVzdENvbXBsZXhUeXBlIHRlc3RDb21wbGV4VHlwZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUgPSBuZXcgVGVzdENvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUuc2V0UGFyYW0xKCJQYXJhbTEiKTsKLSAgICAgICAgICAgIHRlc3RDb21wbGV4VHlwZS5zZXRQYXJhbTIoMik7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdENvbXBsZXhUeXBlKTsKLSAgICAgICAgfQotICAgICAgICB0ZXN0U29hcEVsZW1lbnQzMShhcnJheSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTb2FwRWxlbWVudDExKEFycmF5IGFycmF5KSB7Ci0gICAgICAgIFRlc3RTb2FwRWxlbWVudDEgdGVzdFNvYXBFbGVtZW50MSA9IG5ldyBUZXN0U29hcEVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDEuc2V0VGVzdFNvYXBFbGVtZW50MShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U29hcEVsZW1lbnQxLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4iICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RTb2FwRWxlbWVudDEgcmVzdWx0ID0gVGVzdFNvYXBFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0VGVzdFNvYXBFbGVtZW50MSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2RvdWJsZSkgcmVzdWx0TGlzdC5nZXQoaSkpLmdldF9kb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoX2RvdWJsZSkgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLmdldChpKSkuZ2V0X2RvdWJsZSgpLDAuMDAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgcHJpdmF0ZSB2b2lkIHRlc3RTb2FwRWxlbWVudDIxKEFycmF5IGFycmF5KSB7Ci0gICAgICAgIFRlc3RTb2FwRWxlbWVudDIgdGVzdFNvYXBFbGVtZW50MiA9IG5ldyBUZXN0U29hcEVsZW1lbnQyKCk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDIuc2V0UGFyYW0xKCJ0ZXN0IHBhcmFtIik7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDIuc2V0UGFyYW0yKGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTb2FwRWxlbWVudDIuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0U29hcEVsZW1lbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MiByZXN1bHQgPSBUZXN0U29hcEVsZW1lbnQyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksInRlc3QgcGFyYW0iKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRQYXJhbTIoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5LmdldE9iamVjdExpc3QoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygoKF9kb3VibGUpIHJlc3VsdExpc3QuZ2V0KGkpKS5nZXRfZG91YmxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoKF9kb3VibGUpIGFycmF5LmdldE9iamVjdExpc3QoKS5nZXQoaSkpLmdldF9kb3VibGUoKSwwLjAwMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTb2FwRWxlbWVudDEyKEFycmF5IGFycmF5KSB7Ci0gICAgICAgIFRlc3RTb2FwRWxlbWVudDEgdGVzdFNvYXBFbGVtZW50MSA9IG5ldyBUZXN0U29hcEVsZW1lbnQxKCk7Ci0gICAgICAgIHRlc3RTb2FwRWxlbWVudDEuc2V0VGVzdFNvYXBFbGVtZW50MShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0ZXN0U29hcEVsZW1lbnQxLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4iICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RTb2FwRWxlbWVudDEgcmVzdWx0ID0gVGVzdFNvYXBFbGVtZW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0VGVzdFNvYXBFbGVtZW50MSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgcmVzdWx0TGlzdC5nZXQoaSkpLmdldF9kb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLmdldChpKSkuZ2V0X2RvdWJsZSgpLDAuMDAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNvYXBFbGVtZW50MjIoQXJyYXkgYXJyYXkpIHsKLSAgICAgICAgVGVzdFNvYXBFbGVtZW50MiB0ZXN0U29hcEVsZW1lbnQyID0gbmV3IFRlc3RTb2FwRWxlbWVudDIoKTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50Mi5zZXRQYXJhbTEoInRlc3QgcGFyYW0iKTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50Mi5zZXRQYXJhbTIoYXJyYXkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFNvYXBFbGVtZW50Mi5nZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIFRlc3RTb2FwRWxlbWVudDEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBTdHJpbmcgPT0+IiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0U29hcEVsZW1lbnQyIHJlc3VsdCA9IFRlc3RTb2FwRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwidGVzdCBwYXJhbSIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldFBhcmFtMigpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgcmVzdWx0TGlzdC5nZXQoaSkpLmdldF9kb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2RvdWJsZSkgYXJyYXkuZ2V0T2JqZWN0TGlzdCgpLmdldChpKSkuZ2V0X2RvdWJsZSgpLDAuMDAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNvYXBFbGVtZW50MzEoQXJyYXkgYXJyYXkpIHsKLSAgICAgICAgVGVzdFNvYXBFbGVtZW50MSB0ZXN0U29hcEVsZW1lbnQxID0gbmV3IFRlc3RTb2FwRWxlbWVudDEoKTsKLSAgICAgICAgdGVzdFNvYXBFbGVtZW50MS5zZXRUZXN0U29hcEVsZW1lbnQxKGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RTb2FwRWxlbWVudDEuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0U29hcEVsZW1lbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFNvYXBFbGVtZW50MSByZXN1bHQgPSBUZXN0U29hcEVsZW1lbnQxLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRUZXN0U29hcEVsZW1lbnQxKCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhUeXBlIHRlc3RDb21wbGV4VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q29tcGxleFR5cGUgPSAoVGVzdENvbXBsZXhUeXBlKSByZXN1bHRMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdENvbXBsZXhUeXBlLmdldFBhcmFtMSgpLCJQYXJhbTEiKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdENvbXBsZXhUeXBlLmdldFBhcmFtMigpLDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9BYnN0cmFjdFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0Fic3RyYWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGY5OTg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0Fic3RyYWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudGVzdHN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBzZXJ2aWNlcy5lY2hvLnR5cGVzLkJvb2tJbmZvcm1hdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUZXN0ICBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgICBwcm90ZWN0ZWQgT01FbGVtZW50IGdldE9NRWxlbWVudCgpewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5hbWVzcGFjZSA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3Rlc3Qud3MwMi5jb20iLCJuczEiKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIlRlc3RWYWx1ZSIsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgb21FbGVtZW50LmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQoInRlc3RTdHJpbmciKSk7Ci0gICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPTUVsZW1lbnRzRXF1YWwoT01FbGVtZW50IG9tRWxlbWVudDEsT01FbGVtZW50IG9tRWxlbWVudDIpewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvbUVsZW1lbnQxID09IG51bGwpIHx8IChvbUVsZW1lbnQyID09IG51bGwpKXsKLSAgICAgICAgICAgIGlzRXF1YWwgPSAob21FbGVtZW50MSA9PSBvbUVsZW1lbnQyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzRXF1YWwgPSBvbUVsZW1lbnQxLmdldExvY2FsTmFtZSgpLmVxdWFscyhvbUVsZW1lbnQyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci0KLSAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPYmplY3RzRXF1YWwoT2JqZWN0IG9iamVjdDEsT2JqZWN0IG9iamVjdDIpewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3QxID09IG51bGwpIHx8IChvYmplY3QyID09IG51bGwpKXsKLSAgICAgICAgICAgIGlzRXF1YWwgPSAob2JqZWN0MSA9PSBvYmplY3QyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzRXF1YWwgPSBvYmplY3QxLmVxdWFscyhvYmplY3QyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kKCl7Ci0JICAgIC8vIGR1bW15IHRlc3QgbWV0aG9kCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzZXJ0QXJyYXlFcXVhbChPYmplY3RbXSBvYmplY3RBcnJheTEsIE9iamVjdFtdIG9iamVjdEFycmF5MikgewotICAgICAgICBib29sZWFuIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgaWYgKChvYmplY3RBcnJheTEgPT0gbnVsbCkgfHwgKG9iamVjdEFycmF5MiA9PSBudWxsKSkgewotICAgICAgICAgICAgaXNFcXVhbCA9IChvYmplY3RBcnJheTEgPT0gb2JqZWN0QXJyYXkyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGkuZSBib3RoIGFyZSBub3QgbnVsbAotICAgICAgICAgICAgaWYgKG9iamVjdEFycmF5MS5sZW5ndGggPT0gb2JqZWN0QXJyYXkyLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkxLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNPYmplY3RDb250YWlucyhvYmplY3RBcnJheTIsIG9iamVjdEFycmF5MVtpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0VxdWFsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzT2JqZWN0Q29udGFpbnMoT2JqZWN0W10gb2JqZWN0QXJyYXksIE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgYm9vbGVhbiBpc0NvbnRhaW4gPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKChvYmplY3RBcnJheVtpXSA9PSBudWxsKSB8fCAob2JqZWN0ID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgaXNDb250YWluID0gIChvYmplY3RBcnJheVtpXSA9PSBvYmplY3QpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQm9va0luZm9ybWF0aW9uKXsKLSAgICAgICAgICAgICAgICAgICAgaXNDb250YWluID0gaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKChCb29rSW5mb3JtYXRpb24pb2JqZWN0QXJyYXlbaV0sKEJvb2tJbmZvcm1hdGlvbilvYmplY3QpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT01FbGVtZW50KXsKLSAgICAgICAgICAgICAgICAgICAgaXNDb250YWluID0gaXNPTUVsZW1lbnRzRXF1YWwoKE9NRWxlbWVudClvYmplY3RBcnJheVtpXSwoT01FbGVtZW50KW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaXNDb250YWluID0gb2JqZWN0QXJyYXlbaV0uZXF1YWxzKG9iamVjdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzQ29udGFpbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0NvbnRhaW47Ci0gICAgfQotCi0gICAgIHByb3RlY3RlZCBib29sZWFuIGlzQm9va0luZm9ybWF0aW9uT2JqZWN0c0VxdWFscyhCb29rSW5mb3JtYXRpb24gYm9va0luZm9ybWF0aW9uMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2tJbmZvcm1hdGlvbiBib29rSW5mb3JtYXRpb24yKXsKLSAgICAgICAgIGJvb2xlYW4gaXNFcXVhbDsKLSAgICAgICAgIGlmICgoYm9va0luZm9ybWF0aW9uMSA9PSBudWxsKSB8fCAoYm9va0luZm9ybWF0aW9uMiA9PSBudWxsKSl7Ci0gICAgICAgICAgICBpc0VxdWFsID0gKGJvb2tJbmZvcm1hdGlvbjEgPT0gYm9va0luZm9ybWF0aW9uMik7Ci0gICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICBpc0VxdWFsID0gYm9va0luZm9ybWF0aW9uMS5nZXRUeXBlKCkuZXF1YWxzKGJvb2tJbmZvcm1hdGlvbjIuZ2V0VHlwZSgpKSAmJgotICAgICAgICAgICAgICAgICAgICAgYm9va0luZm9ybWF0aW9uMS5nZXRUaXRsZSgpLmVxdWFscyhib29rSW5mb3JtYXRpb24yLmdldFRpdGxlKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICBib29rSW5mb3JtYXRpb24xLmdldElzYm4oKS5lcXVhbHMoYm9va0luZm9ybWF0aW9uMi5nZXRJc2JuKCkpOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGlzRXF1YWw7Ci0gICAgIH0KLQotICAgICBwcm90ZWN0ZWQgQm9va0luZm9ybWF0aW9uIGdldEJvb2tJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgQm9va0luZm9ybWF0aW9uIGJvb2tJbmZvcm1hdGlvbiA9IG5ldyBCb29rSW5mb3JtYXRpb24oKTsKLSAgICAgICAgYm9va0luZm9ybWF0aW9uLnNldFR5cGUoInRlc3QiKTsKLSAgICAgICAgYm9va0luZm9ybWF0aW9uLnNldFRpdGxlKCJ0ZXN0Iik7Ci0gICAgICAgIGJvb2tJbmZvcm1hdGlvbi5zZXRJc2JuKCJ0ZXN0Iik7Ci0gICAgICAgIHJldHVybiBib29rSW5mb3JtYXRpb247Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0FueUVsZW1lbnRzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvQW55RWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWQ5MzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvQW55RWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy5UZXN0QW55MTsKLWltcG9ydCBzZXJ2aWNlcy5lY2hvLnR5cGVzLlRlc3RBbnkyOwotaW1wb3J0IHNlcnZpY2VzLmVjaG8udHlwZXMuVGVzdEFueTM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy5UZXN0QW55NDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIEFueUVsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk8gPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9FUVVBTFNfT05FID0gMTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlBcnJheSgpIHsKLSAgICAgICAgT01FbGVtZW50W10gcmV0dXJuT2JqZWN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueUFycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobmV3IE9NRWxlbWVudFtde251bGx9LCBNSU5fRVFVQUxTX1pFUk8pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueUFycmF5KG5ldyBPTUVsZW1lbnRbXXtnZXRPTUVsZW1lbnQoKX0sIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT01FbGVtZW50W117Z2V0T01FbGVtZW50KCl9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobmV3IE9NRWxlbWVudFtde2dldE9NRWxlbWVudCgpLCBnZXRPTUVsZW1lbnQoKX0sIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT01FbGVtZW50W117Z2V0T01FbGVtZW50KCksIGdldE9NRWxlbWVudCgpfSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobnVsbCwgTUlOX0VRVUFMU19PTkUpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55QXJyYXkobmV3IE9NRWxlbWVudFtde251bGx9LCBNSU5fRVFVQUxTX09ORSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlBcnJheShuZXcgT01FbGVtZW50W117Z2V0T01FbGVtZW50KCksIGdldE9NRWxlbWVudCgpfSwgTUlOX0VRVUFMU19PTkUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9NRWxlbWVudFtde2dldE9NRWxlbWVudCgpLCBnZXRPTUVsZW1lbnQoKX0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudFtdIHRlc3RBbnlBcnJheShPTUVsZW1lbnRbXSBpbm5lck9iamVjdCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICBPTUVsZW1lbnRbXSByZXR1cm5PYmplY3QgPSBudWxsOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk8gOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueTEgdGVzdEFueSA9IG5ldyBUZXN0QW55MSgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnkuc2V0RXh0cmFFbGVtZW50KGlubmVyT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55LmdldE9NRWxlbWVudChUZXN0QW55MS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEFueTEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldEV4dHJhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORSA6IHsKLSAgICAgICAgICAgICAgICBUZXN0QW55MyB0ZXN0QW55ID0gbmV3IFRlc3RBbnkzKCk7Ci0gICAgICAgICAgICAgICAgdGVzdEFueS5zZXRFeHRyYUVsZW1lbnQoaW5uZXJPYmplY3QpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnkuZ2V0T01FbGVtZW50KFRlc3RBbnkzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0RXh0cmFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55KCkgewotICAgICAgICBPTUVsZW1lbnQgcmV0dXJuT2JqZWN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueShudWxsLCBNSU5fRVFVQUxTX1pFUk8pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09NRWxlbWVudHNFcXVhbChyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnkoZ2V0T01FbGVtZW50KCksIE1JTl9FUVVBTFNfWkVSTyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT01FbGVtZW50c0VxdWFsKHJldHVybk9iamVjdCwgZ2V0T01FbGVtZW50KCkpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnkobnVsbCwgTUlOX0VRVUFMU19PTkUpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55KGdldE9NRWxlbWVudCgpLCBNSU5fRVFVQUxTX09ORSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT01FbGVtZW50c0VxdWFsKHJldHVybk9iamVjdCwgZ2V0T01FbGVtZW50KCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IHRlc3RBbnkoT01FbGVtZW50IGlubmVyT2JqZWN0LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIE9NRWxlbWVudCByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk8gOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueTIgdGVzdEFueSA9IG5ldyBUZXN0QW55MigpOwotICAgICAgICAgICAgICAgIHRlc3RBbnkuc2V0RXh0cmFFbGVtZW50KGlubmVyT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55LmdldE9NRWxlbWVudChUZXN0QW55Mi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEFueTIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldEV4dHJhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORSA6IHsKLSAgICAgICAgICAgICAgICBUZXN0QW55NCB0ZXN0QW55ID0gbmV3IFRlc3RBbnk0KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEFueS5zZXRFeHRyYUVsZW1lbnQoaW5uZXJPYmplY3QpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnkuZ2V0T01FbGVtZW50KFRlc3RBbnk0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0RXh0cmFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvQ3VzdG9tRWxlbWVudHNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9DdXN0b21FbGVtZW50c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjOTUwOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9DdXN0b21FbGVtZW50c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnRlc3RzdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBzZXJ2aWNlcy5lY2hvLnR5cGVzLio7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21FbGVtZW50c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA9IDQ7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQXJyYXkoKSB7Ci0KLSAgICAgICAgQm9va0luZm9ybWF0aW9uW10gcmV0dXJuT2JqZWN0OwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDAgYW5kIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtudWxsfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCksIG51bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKSwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDAgYW5kIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tQXJyYXkobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCksIG51bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMSBhbmQgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IEJvb2tJbmZvcm1hdGlvbltde2dldEJvb2tJbmZvcm1hdGlvbigpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbUFycmF5KG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKSwgbnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCksIG51bGx9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgYW5kIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tQXJyYXkobnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117bnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tQXJyYXkobmV3IEJvb2tJbmZvcm1hdGlvbltde2dldEJvb2tJbmZvcm1hdGlvbigpLCBudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b21BcnJheShuZXcgQm9va0luZm9ybWF0aW9uW117Z2V0Qm9va0luZm9ybWF0aW9uKCl9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBCb29rSW5mb3JtYXRpb25bXXtnZXRCb29rSW5mb3JtYXRpb24oKX0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJvb2tJbmZvcm1hdGlvbltdIHRlc3RDdXN0b21BcnJheShCb29rSW5mb3JtYXRpb25bXSBpbm5lckVsZW1lbnQsIGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgQm9va0luZm9ybWF0aW9uW10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjEgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uMSgpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb24xLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjMgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uMygpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb24zLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RCb29rSW5mb3JtYXRpb241IHRlc3RCb29rSW5mb3JtYXRpb24gPSBuZXcgVGVzdEJvb2tJbmZvcm1hdGlvbjUoKTsKLSAgICAgICAgICAgICAgICB0ZXN0Qm9va0luZm9ybWF0aW9uLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RCb29rSW5mb3JtYXRpb24uZ2V0T01FbGVtZW50KFRlc3RCb29rSW5mb3JtYXRpb241Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0Qm9va0luZm9ybWF0aW9uNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjcgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uNygpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjcuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb243LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3Q7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMCBhbmQgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShnZXRCb29rSW5mb3JtYXRpb24oKSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzQm9va0luZm9ybWF0aW9uT2JqZWN0c0VxdWFscyhyZXR1cm5PYmplY3QsIGdldEJvb2tJbmZvcm1hdGlvbigpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIGFuZCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzQm9va0luZm9ybWF0aW9uT2JqZWN0c0VxdWFscyhyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b20oZ2V0Qm9va0luZm9ybWF0aW9uKCksIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgYW5kIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RDdXN0b20obnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEN1c3RvbShnZXRCb29rSW5mb3JtYXRpb24oKSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgYW5kIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tKG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Q3VzdG9tKGdldEJvb2tJbmZvcm1hdGlvbigpLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBCb29rSW5mb3JtYXRpb24gdGVzdEN1c3RvbShCb29rSW5mb3JtYXRpb24gaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0Qm9va0luZm9ybWF0aW9uMiB0ZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IFRlc3RCb29rSW5mb3JtYXRpb24yKCk7Ci0gICAgICAgICAgICAgICAgdGVzdEJvb2tJbmZvcm1hdGlvbi5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0Qm9va0luZm9ybWF0aW9uLmdldE9NRWxlbWVudChUZXN0Qm9va0luZm9ybWF0aW9uMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEJvb2tJbmZvcm1hdGlvbjIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0Qm9va0luZm9ybWF0aW9uNCB0ZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IFRlc3RCb29rSW5mb3JtYXRpb240KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEJvb2tJbmZvcm1hdGlvbi5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0Qm9va0luZm9ybWF0aW9uLmdldE9NRWxlbWVudChUZXN0Qm9va0luZm9ybWF0aW9uNC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEJvb2tJbmZvcm1hdGlvbjQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEJvb2tJbmZvcm1hdGlvbjYgdGVzdEJvb2tJbmZvcm1hdGlvbiA9IG5ldyBUZXN0Qm9va0luZm9ybWF0aW9uNigpOwotICAgICAgICAgICAgICAgIHRlc3RCb29rSW5mb3JtYXRpb24uc2V0VGVzdFZhbHVlKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoVGVzdEJvb2tJbmZvcm1hdGlvbjYuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RCb29rSW5mb3JtYXRpb242LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0Qm9va0luZm9ybWF0aW9uOCB0ZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IFRlc3RCb29rSW5mb3JtYXRpb244KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEJvb2tJbmZvcm1hdGlvbi5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0Qm9va0luZm9ybWF0aW9uLmdldE9NRWxlbWVudChUZXN0Qm9va0luZm9ybWF0aW9uOC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEJvb2tJbmZvcm1hdGlvbjguRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL0ludEVsZW1lbnRzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvSW50RWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGNjYTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvSW50RWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0KLXB1YmxpYyBjbGFzcyBJbnRFbGVtZW50c1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA9IDQ7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50QXJyYXkoKSB7Ci0gICAgICAgIGludFtdIHJldHVybk9iamVjdDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShuZXcgaW50W117NX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJldHVybk9iamVjdCwgbmV3IGludFtdezV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmV0dXJuT2JqZWN0LCBuZXcgaW50W117SW50ZWdlci5NSU5fVkFMVUV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFLDV9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSw1fSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShuZXcgaW50W117NX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXs1fSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmV0dXJuT2JqZWN0LCBuZXcgaW50W117SW50ZWdlci5NSU5fVkFMVUV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtdezV9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJldHVybk9iamVjdCwgbmV3IGludFtdezV9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtde0ludGVnZXIuTUlOX1ZBTFVFfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDEgbmlsbGFibGUgZmFsc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RJbnRBcnJheShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEludEFycmF5KG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRX0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0SW50QXJyYXkobmV3IGludFtdezV9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXR1cm5PYmplY3QsIG5ldyBpbnRbXXs1fSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnRbXSB0ZXN0SW50QXJyYXkoaW50W10gaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIGludFtdIHJldHVybk9iamVjdCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQxIHRlc3RJbnQgPSBuZXcgVGVzdEludDEoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0SW50MS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQzIHRlc3RJbnQgPSBuZXcgVGVzdEludDMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0SW50My5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0SW50NSB0ZXN0SW50ID0gbmV3IFRlc3RJbnQ1KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEludC5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0SW50LmdldE9NRWxlbWVudChUZXN0SW50NS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdEludDUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQ3IHRlc3RJbnQgPSBuZXcgVGVzdEludDcoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQ3Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0SW50Ny5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW4gPTAgYW5kIG5pbGxhYmxlIHRydWUgdGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoMSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCksIDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoSW50ZWdlci5NSU5fVkFMVUUsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoMSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpLCAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0SW50KEludGVnZXIuTUlOX1ZBTFVFLE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKSxJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoMSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdEludChJbnRlZ2VyLk1JTl9WQUxVRSxNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpLEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0SW50KDEsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpLCAxKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdEludChJbnRlZ2VyLk1JTl9WQUxVRSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCksIEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgdGVzdEludChpbnQgaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIGludCByZXR1cm5JbnQgPSAwOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQyIHRlc3RJbnQgPSBuZXcgVGVzdEludDIoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBUZXN0SW50Mi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQ0IHRlc3RJbnQgPSBuZXcgVGVzdEludDQoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQ0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBUZXN0SW50NC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0SW50NiB0ZXN0SW50ID0gbmV3IFRlc3RJbnQ2KCk7Ci0gICAgICAgICAgICAgICAgdGVzdEludC5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0SW50LmdldE9NRWxlbWVudChUZXN0SW50Ni5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuSW50ID0gVGVzdEludDYuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RJbnQ4IHRlc3RJbnQgPSBuZXcgVGVzdEludDgoKTsKLSAgICAgICAgICAgICAgICB0ZXN0SW50LnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbnQuZ2V0T01FbGVtZW50KFRlc3RJbnQ4Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBUZXN0SW50Ni5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkludDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9PdXRlckVsZW1lbnRzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvT3V0ZXJFbGVtZW50c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZjhiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3Rlc3RzdWl0ZS9PdXRlckVsZW1lbnRzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudGVzdHN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IHNlcnZpY2VzLmVjaG8udHlwZXMuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBPdXRlckVsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUxMQUJMRV9UUlVFID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOSUxMQUJMRV9GQUxTRSA9IDE7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gdGVzdFN0cmluZyhudWxsLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5TdHJpbmcsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gdGVzdFN0cmluZygiVGVzdCBTdHJpbmciLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5TdHJpbmcsICJUZXN0IFN0cmluZyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVyblN0cmluZyA9IHRlc3RTdHJpbmcobnVsbCwgTklMTEFCTEVfRkFMU0UpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5TdHJpbmcgPSB0ZXN0U3RyaW5nKCJUZXN0IFN0cmluZyIsIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5TdHJpbmcsICJUZXN0IFN0cmluZyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBOSUxMQUJMRV9UUlVFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdFN0cmluZzEgb3V0ZXJUZXN0U3RyaW5nID0gbmV3IE91dGVyVGVzdFN0cmluZzEoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RTdHJpbmcuc2V0T3V0ZXJUZXN0U3RyaW5nMShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0U3RyaW5nMS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gT3V0ZXJUZXN0U3RyaW5nMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0U3RyaW5nMSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE5JTExBQkxFX0ZBTFNFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdFN0cmluZzIgb3V0ZXJUZXN0U3RyaW5nID0gbmV3IE91dGVyVGVzdFN0cmluZzIoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RTdHJpbmcuc2V0T3V0ZXJUZXN0U3RyaW5nMihpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0U3RyaW5nMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gT3V0ZXJUZXN0U3RyaW5nMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0U3RyaW5nMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50KCkgewotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoNSwgTklMTEFCTEVfVFJVRSksIDUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoSW50ZWdlci5NSU5fVkFMVUUsIE5JTExBQkxFX1RSVUUpLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RJbnQoNSwgTklMTEFCTEVfRkFMU0UpLCA1KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdEludChJbnRlZ2VyLk1JTl9WQUxVRSwgTklMTEFCTEVfRkFMU0UpLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgdGVzdEludChpbnQgaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIGludCByZXR1cm5JbnQgPSAwOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTklMTEFCTEVfVFJVRSA6IHsKLSAgICAgICAgICAgICAgICBPdXRlclRlc3RJbnQxIG91dGVyVGVzdEludCA9IG5ldyBPdXRlclRlc3RJbnQxKCk7Ci0gICAgICAgICAgICAgICAgb3V0ZXJUZXN0SW50LnNldE91dGVyVGVzdEludDEoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBvdXRlclRlc3RJbnQuZ2V0T01FbGVtZW50KE91dGVyVGVzdEludDEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybkludCA9IE91dGVyVGVzdEludDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldE91dGVyVGVzdEludDEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTklMTEFCTEVfRkFMU0UgOiB7Ci0gICAgICAgICAgICAgICAgT3V0ZXJUZXN0SW50MiBvdXRlclRlc3RJbnQgPSBuZXcgT3V0ZXJUZXN0SW50MigpOwotICAgICAgICAgICAgICAgIG91dGVyVGVzdEludC5zZXRPdXRlclRlc3RJbnQyKGlubmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gb3V0ZXJUZXN0SW50LmdldE9NRWxlbWVudChPdXRlclRlc3RJbnQyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5JbnQgPSBPdXRlclRlc3RJbnQyLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRPdXRlclRlc3RJbnQyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZSgpIHsKLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG51bGwsIE5JTExBQkxFX1RSVUUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG5ldyBEb3VibGUoMjMuNDUpLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPYmplY3RzRXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgRG91YmxlKDIzLjQ1KSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG51bGwsIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPYmplY3RzRXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgRG91YmxlKDIzLjQ1KSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgdGVzdEFueVR5cGUoT2JqZWN0IGlubmVyRWxlbWVudCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTklMTEFCTEVfVFJVRSA6IHsKLSAgICAgICAgICAgICAgICBPdXRlclRlc3RBbnlUeXBlMSBvdXRlclRlc3RBbnlUeXBlID0gbmV3IE91dGVyVGVzdEFueVR5cGUxKCk7Ci0gICAgICAgICAgICAgICAgb3V0ZXJUZXN0QW55VHlwZS5zZXRPdXRlclRlc3RBbnlUeXBlMShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEFueVR5cGUuZ2V0T01FbGVtZW50KE91dGVyVGVzdEFueVR5cGUxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBPdXRlclRlc3RBbnlUeXBlMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0QW55VHlwZTEoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBOSUxMQUJMRV9GQUxTRSA6IHsKLSAgICAgICAgICAgICAgICBPdXRlclRlc3RBbnlUeXBlMiBvdXRlclRlc3RBbnlUeXBlID0gbmV3IE91dGVyVGVzdEFueVR5cGUyKCk7Ci0gICAgICAgICAgICAgICAgb3V0ZXJUZXN0QW55VHlwZS5zZXRPdXRlclRlc3RBbnlUeXBlMihpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEFueVR5cGUuZ2V0T01FbGVtZW50KE91dGVyVGVzdEFueVR5cGUyLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBPdXRlclRlc3RBbnlUeXBlMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0QW55VHlwZTIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCb29rSW5mb3JtYXRpb24oKSB7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3Q7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Qm9va0luZm9ybWF0aW9uKG51bGwsIE5JTExBQkxFX1RSVUUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0Jvb2tJbmZvcm1hdGlvbk9iamVjdHNFcXVhbHMocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Qm9va0luZm9ybWF0aW9uKGdldEJvb2tJbmZvcm1hdGlvbigpLCBOSUxMQUJMRV9UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNCb29rSW5mb3JtYXRpb25PYmplY3RzRXF1YWxzKHJldHVybk9iamVjdCwgZ2V0Qm9va0luZm9ybWF0aW9uKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0Qm9va0luZm9ybWF0aW9uKG51bGwsIE5JTExBQkxFX0ZBTFNFKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEJvb2tJbmZvcm1hdGlvbihnZXRCb29rSW5mb3JtYXRpb24oKSwgTklMTEFCTEVfRkFMU0UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc0Jvb2tJbmZvcm1hdGlvbk9iamVjdHNFcXVhbHMocmV0dXJuT2JqZWN0LCBnZXRCb29rSW5mb3JtYXRpb24oKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCb29rSW5mb3JtYXRpb24gdGVzdEJvb2tJbmZvcm1hdGlvbihCb29rSW5mb3JtYXRpb24gaW5uZXJFbGVtZW50LCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIEJvb2tJbmZvcm1hdGlvbiByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBOSUxMQUJMRV9UUlVFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjEgb3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjEoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RCb29rSW5mb3JtYXRpb24uc2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMS5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE5JTExBQkxFX0ZBTFNFIDogewotICAgICAgICAgICAgICAgIE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjIgb3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uID0gbmV3IE91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbjIoKTsKLSAgICAgICAgICAgICAgICBvdXRlclRlc3RCb29rSW5mb3JtYXRpb24uc2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMihpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG91dGVyVGVzdEJvb2tJbmZvcm1hdGlvbi5nZXRPTUVsZW1lbnQoT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gT3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0T3V0ZXJUZXN0Qm9va0luZm9ybWF0aW9uMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL1N0cmluZ0VsZW1lbnRzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvU3RyaW5nRWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWFmYjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvU3RyaW5nRWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFN0cmluZ0VsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUID0gNDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBcnJheSgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyAwIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tde251bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBTdHJpbmdbXXtudWxsfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBTdHJpbmdbXXsidGVzdCJ9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tdeyJ0ZXN0IiwgbnVsbH0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tdeyJ0ZXN0IiwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBtaW5PY2N1cnMgPSAwIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCIsIG51bGx9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBtaW5PY2N1cnMgPSAxIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tde251bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nQXJyYXkobmV3IFN0cmluZ1tdeyJ0ZXN0In0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXsidGVzdCIsIG51bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IFN0cmluZ1tdeyJ0ZXN0IiwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBtaW5PY2N1cnMgPSAxIG5pbGxhYmxlIGZhbHNlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZ0FycmF5KG5ldyBTdHJpbmdbXXtudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShuZXcgU3RyaW5nW117InRlc3QiLCBudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmdBcnJheShuZXcgU3RyaW5nW117InRlc3QifSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgU3RyaW5nW117InRlc3QifSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gdGVzdFN0cmluZ0FycmF5KFN0cmluZ1tdIGlubmVyU3RyaW5nLCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nMSB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmcxKCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmcxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RTdHJpbmczIHRlc3RTdHJpbmcgPSBuZXcgVGVzdFN0cmluZzMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0U3RyaW5nLnNldFRlc3RWYWx1ZShpbm5lclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoVGVzdFN0cmluZzMuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RTdHJpbmczLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RTdHJpbmc1IHRlc3RTdHJpbmcgPSBuZXcgVGVzdFN0cmluZzUoKTsKLSAgICAgICAgICAgICAgICB0ZXN0U3RyaW5nLnNldFRlc3RWYWx1ZShpbm5lclN0cmluZyk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdFN0cmluZy5nZXRPTUVsZW1lbnQoVGVzdFN0cmluZzUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RTdHJpbmc1LkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKS5nZXRUZXN0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nNyB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmc3KCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmc3Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nNy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB7Ci0KLSAgICAgICAgU3RyaW5nIHJldHVybk9iamVjdDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyAwIG5pbGxhYmxlIHRydWUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcoIlRlc3QiLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QsICJUZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgbWluT2NjdXJzID0gMCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZyhudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcoIlRlc3QiLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCAiVGVzdCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyA9IDEgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdFN0cmluZyhudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0U3RyaW5nKCJUZXN0IiwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QsICJUZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IG1pbk9jY3VycyA9IDEgbmlsbGFibGUgZmFsc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcobnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RTdHJpbmcoIlRlc3QiLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QsICJUZXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RTdHJpbmcoU3RyaW5nIGlubmVyU3RyaW5nLCBpbnQgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHJldHVybk9iamVjdCA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmc7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdFN0cmluZzIgdGVzdFN0cmluZyA9IG5ldyBUZXN0U3RyaW5nMigpOwotICAgICAgICAgICAgICAgIHRlc3RTdHJpbmcuc2V0VGVzdFZhbHVlKGlubmVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0U3RyaW5nLmdldE9NRWxlbWVudChUZXN0U3RyaW5nMi5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdFN0cmluZzIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nNCB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmc0KCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmc0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nNC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCA6IHsKLSAgICAgICAgICAgICAgICBUZXN0U3RyaW5nNiB0ZXN0U3RyaW5nID0gbmV3IFRlc3RTdHJpbmc2KCk7Ci0gICAgICAgICAgICAgICAgdGVzdFN0cmluZy5zZXRUZXN0VmFsdWUoaW5uZXJTdHJpbmcpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RTdHJpbmcuZ2V0T01FbGVtZW50KFRlc3RTdHJpbmc2Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0U3RyaW5nNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdFN0cmluZzggdGVzdFN0cmluZyA9IG5ldyBUZXN0U3RyaW5nOCgpOwotICAgICAgICAgICAgICAgIHRlc3RTdHJpbmcuc2V0VGVzdFZhbHVlKGlubmVyU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0U3RyaW5nLmdldE9NRWxlbWVudChUZXN0U3RyaW5nOC5NWV9RTkFNRSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gVGVzdFN0cmluZzguRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdGVzdHN1aXRlL1hzZEFueUVsZW1lbnRzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvWHNkQW55RWxlbWVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODA1MjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiLWNvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjaGVtYS90ZXN0c3VpdGUvWHNkQW55RWxlbWVudHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS50ZXN0c3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgc2VydmljZXMuZWNoby50eXBlcy4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFhzZEFueUVsZW1lbnRzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUID0gMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUID0gNDsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlUeXBlQXJyYXkoKSB7Ci0gICAgICAgIE9iamVjdFtdIHJldHVybk9iamVjdDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIGFuZCBuaWxsYWJsZSB0cnVlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG51bGwsIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobmV3IE9iamVjdFtde25ldyBEb3VibGUoNS42Nyl9LCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde25ldyBEb3VibGUoNS42NyksIG51bGx9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIGFuZCBuaWxsYWJsZSBmYWxzZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtudWxsfSwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KX0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0sIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAxIGFuZCBuaWxsYWJsZSB0cnVlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG51bGwsIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bnVsbH0pKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobmV3IE9iamVjdFtde251bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde251bGx9KSk7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfVFJVRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpfSkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMSBhbmQgbmlsbGFibGUgZmFsc2UiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobnVsbCwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBudWxsKSk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlQXJyYXkobmV3IE9iamVjdFtde251bGx9LCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXNzZXJ0QXJyYXlFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBPYmplY3RbXXtudWxsfSkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZUFycmF5KG5ldyBPYmplY3RbXXtuZXcgRG91YmxlKDUuNjcpLCBudWxsfSwgTUlOX0VRVUFMU19PTkVfTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGFzc2VydEFycmF5RXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KSwgbnVsbH0pKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGVBcnJheShuZXcgT2JqZWN0W117bmV3IERvdWJsZSg1LjY3KX0sIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhc3NlcnRBcnJheUVxdWFsKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde25ldyBEb3VibGUoNS42Nyl9KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gdGVzdEFueVR5cGVBcnJheShPYmplY3RbXSBpbm5lckVsZW1lbnQsIGludCB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgT2JqZWN0W10gcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGUxIHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlMSgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTEuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RBbnlUeXBlMyB0ZXN0QW55VHlwZSA9IG5ldyBUZXN0QW55VHlwZTMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0QW55VHlwZS5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZS5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGUzLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55VHlwZTMuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU1IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlNSgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTUuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlNS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU3IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlNygpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTcuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlNy5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW55VHlwZSgpIHsKLQotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0OwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1pbk9jY3VycyA9IDAgbmlsbGFibGUgdHJ1ZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobnVsbCwgTUlOX0VRVUFMU19aRVJPX05JTExBQkxFX1RSVUVfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2JqZWN0c0VxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBEb3VibGUoMjMuNDUpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAwIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZShudWxsLCBNSU5fRVFVQUxTX1pFUk9fTklMTEFCTEVfRkFMU0VfVEVTVCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2JqZWN0c0VxdWFsKHJldHVybk9iamVjdCwgbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPYmplY3RzRXF1YWwocmV0dXJuT2JqZWN0LCBuZXcgRG91YmxlKDIzLjQ1KSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWluT2NjdXJzID0gMSBuaWxsYWJsZSB0cnVlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG51bGwpKTsKLSAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHRlc3RBbnlUeXBlKG5ldyBEb3VibGUoMjMuNDUpLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBEb3VibGUoMjMuNDUpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtaW5PY2N1cnMgPSAxIG5pbGxhYmxlIGZhbHNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSB0ZXN0QW55VHlwZShudWxsLCBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9GQUxTRV9URVNUKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGVzdEFueVR5cGUobmV3IERvdWJsZSgyMy40NSksIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09iamVjdHNFcXVhbChyZXR1cm5PYmplY3QsIG5ldyBEb3VibGUoMjMuNDUpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgdGVzdEFueVR5cGUoT2JqZWN0IGlubmVyRWxlbWVudCwgaW50IHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZzsKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGUyIHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlMigpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTIuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlMi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfWkVST19OSUxMQUJMRV9GQUxTRV9URVNUIDogewotICAgICAgICAgICAgICAgIFRlc3RBbnlUeXBlNCB0ZXN0QW55VHlwZSA9IG5ldyBUZXN0QW55VHlwZTQoKTsKLSAgICAgICAgICAgICAgICB0ZXN0QW55VHlwZS5zZXRUZXN0VmFsdWUoaW5uZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSB0ZXN0QW55VHlwZS5nZXRPTUVsZW1lbnQoVGVzdEFueVR5cGU0Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBUZXN0QW55VHlwZTQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpLmdldFRlc3RWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBNSU5fRVFVQUxTX09ORV9OSUxMQUJMRV9UUlVFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU2IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlNigpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTYuTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlNi5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIE1JTl9FUVVBTFNfT05FX05JTExBQkxFX0ZBTFNFX1RFU1QgOiB7Ci0gICAgICAgICAgICAgICAgVGVzdEFueVR5cGU4IHRlc3RBbnlUeXBlID0gbmV3IFRlc3RBbnlUeXBlOCgpOwotICAgICAgICAgICAgICAgIHRlc3RBbnlUeXBlLnNldFRlc3RWYWx1ZShpbm5lckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RBbnlUeXBlLmdldE9NRWxlbWVudChUZXN0QW55VHlwZTguTVlfUU5BTUUsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IFRlc3RBbnlUeXBlOC5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcikuZ2V0VGVzdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLQotfQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24vVW5pb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3VuaW9uL1VuaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDA4NTEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24vVW5pb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51bmlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkk7Ci1pbXBvcnQgb3JnLnRlbXB1cmkudW5pb24uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFVuaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmQyKCl7Ci0gICAgICAgIE9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IHRlc3RSZWNvcmQyKG5ldyBJbnRlZ2VyKDEwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsbmV3IEludGVnZXIoMTApKTsKLSAgICAgICAgcmVzdWx0ID0gdGVzdFJlY29yZDIobmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LG5ldyBCb29sZWFuKHRydWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCB0ZXN0UmVjb3JkMihPYmplY3QgdGVzdE9iamVjdCkgewotICAgICAgICBSZWNvcmQyIHJlY29yZDIgPSBuZXcgUmVjb3JkMigpOwotICAgICAgICBEYXRlT3JEYXRlVGltZVR5cGUgZGF0ZU9yRGF0ZVRpbWVUeXBlID0gbmV3IERhdGVPckRhdGVUaW1lVHlwZSgpOwotICAgICAgICByZWNvcmQyLnNldEVsZW0xKGRhdGVPckRhdGVUaW1lVHlwZSk7Ci0gICAgICAgIGRhdGVPckRhdGVUaW1lVHlwZS5zZXRPYmplY3QodGVzdE9iamVjdCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSByZWNvcmQyLmdldE9NRWxlbWVudChSZWNvcmQyLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIFN0cmluZyA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFJlY29yZDIgbmV3UmVjb3JkMiA9IFJlY29yZDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuIG5ld1JlY29yZDIuZ2V0RWxlbTEoKS5nZXRPYmplY3QoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmQxKCkgewotICAgICAgICBPYmplY3QgcmVzdWx0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzdWx0ID0gdGVzdFJlY29yZDEobmV3IFVSSSgiaHR0cDovL3d3dy5nb29nbGUuY29tIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCxuZXcgVVJJKCJodHRwOi8vd3d3Lmdvb2dsZS5jb20iKSk7Ci0gICAgICAgICAgICByZXN1bHQgPSB0ZXN0UmVjb3JkMShGb29FbnVtLl92YWx1ZTEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCxGb29FbnVtLl92YWx1ZTEpOwotICAgICAgICB9IGNhdGNoIChVUkkuTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCB0ZXN0UmVjb3JkMShPYmplY3QgdGVzdE9iamVjdCkgewotICAgICAgICBSZWNvcmQxIHJlY29yZDEgPSBuZXcgUmVjb3JkMSgpOwotICAgICAgICBGb29PcGVuRW51bSBmb29PcGVuRW51bSA9IG5ldyBGb29PcGVuRW51bSgpOwotICAgICAgICByZWNvcmQxLnNldEVsZW0xKGZvb09wZW5FbnVtKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvb09wZW5FbnVtLnNldE9iamVjdCh0ZXN0T2JqZWN0KTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSByZWNvcmQxLmdldE9NRWxlbWVudChSZWNvcmQxLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgUmVjb3JkMSBuZXdSZWNvcmQxID0gUmVjb3JkMS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3UmVjb3JkMS5nZXRFbGVtMSgpLmdldE9iamVjdCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVuaW9uUU5hbWUoKXsKLSAgICAgICAgVW5pb25RTmFtZVRlc3RFbGVtZW50IHVuaW9uUU5hbWVUZXN0RWxlbWVudCA9IG5ldyBVbmlvblFOYW1lVGVzdEVsZW1lbnQoKTsKLSAgICAgICAgVW5pb25RTmFtZVRlc3QgdW5pb25RTmFtZVRlc3QgPSBuZXcgVW5pb25RTmFtZVRlc3QoKTsKLSAgICAgICAgdW5pb25RTmFtZVRlc3RFbGVtZW50LnNldFVuaW9uUU5hbWVUZXN0RWxlbWVudCh1bmlvblFOYW1lVGVzdCk7Ci0gICAgICAgIHVuaW9uUU5hbWVUZXN0LnNldE9iamVjdChuZXcgUU5hbWUoImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSIsInRlc3QiKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB1bmlvblFOYW1lVGVzdEVsZW1lbnQuZ2V0T01FbGVtZW50KFVuaW9uUU5hbWVUZXN0RWxlbWVudC5NWV9RTkFNRSxPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFVuaW9uUU5hbWVUZXN0RWxlbWVudCByZXN1bHQgPSBVbmlvblFOYW1lVGVzdEVsZW1lbnQuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVuaW9uUU5hbWVUZXN0LmdldE9iamVjdCgpLHJlc3VsdC5nZXRVbmlvblFOYW1lVGVzdEVsZW1lbnQoKS5nZXRPYmplY3QoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbm5lclNpbXBsZVR5cGVzKCl7Ci0gICAgICAgIFRlc3RJbm5lclVuaW9uVHlwZSB0ZXN0SW5uZXJVbmlvblR5cGUgPSBuZXcgVGVzdElubmVyVW5pb25UeXBlKCk7Ci0gICAgICAgIFBhY2tpbmdUeXBlX1QgcGFja2luZ1R5cGVfdCA9IG5ldyBQYWNraW5nVHlwZV9UKCk7Ci0gICAgICAgIHRlc3RJbm5lclVuaW9uVHlwZS5zZXRUZXN0SW5uZXJVbmlvblR5cGUocGFja2luZ1R5cGVfdCk7Ci0gICAgICAgIFBhY2tpbmdUeXBlX1RfdHlwZTAgcGFja2luZ1R5cGVfdF90eXBlMCA9IG5ldyBQYWNraW5nVHlwZV9UX3R5cGUwKCk7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3RfdHlwZTAuc2V0UGFja2luZ1R5cGVfVF90eXBlMCgiTUlOT1JfYSIpOwotICAgICAgICBwYWNraW5nVHlwZV90LnNldE9iamVjdChwYWNraW5nVHlwZV90X3R5cGUwKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbm5lclVuaW9uVHlwZS5nZXRPTUVsZW1lbnQoVGVzdElubmVyVW5pb25UeXBlLk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFRlc3RJbm5lclVuaW9uVHlwZSByZXN1bHQgPSBUZXN0SW5uZXJVbmlvblR5cGUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhY2tpbmdUeXBlX3RfdHlwZTAudG9TdHJpbmcoKSxyZXN1bHQuZ2V0VGVzdElubmVyVW5pb25UeXBlKCkuZ2V0T2JqZWN0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RJbm5lclVuaW9uVHlwZSA9IG5ldyBUZXN0SW5uZXJVbmlvblR5cGUoKTsKLSAgICAgICAgcGFja2luZ1R5cGVfdCA9IG5ldyBQYWNraW5nVHlwZV9UKCk7Ci0gICAgICAgIHRlc3RJbm5lclVuaW9uVHlwZS5zZXRUZXN0SW5uZXJVbmlvblR5cGUocGFja2luZ1R5cGVfdCk7Ci0gICAgICAgIFBhY2tpbmdUeXBlX1RfdHlwZTEgcGFja2luZ1R5cGVfdF90eXBlMSA9IG5ldyBQYWNraW5nVHlwZV9UX3R5cGUxKCk7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3RfdHlwZTEuc2V0UGFja2luZ1R5cGVfVF90eXBlMSgiUFJPUF9hIik7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3Quc2V0T2JqZWN0KHBhY2tpbmdUeXBlX3RfdHlwZTEpOwotCi0gICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbGVtZW50ID0gdGVzdElubmVyVW5pb25UeXBlLmdldE9NRWxlbWVudChUZXN0SW5uZXJVbmlvblR5cGUuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0SW5uZXJVbmlvblR5cGUgcmVzdWx0ID0gVGVzdElubmVyVW5pb25UeXBlLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWNraW5nVHlwZV90X3R5cGUxLnRvU3RyaW5nKCkscmVzdWx0LmdldFRlc3RJbm5lclVuaW9uVHlwZSgpLmdldE9iamVjdCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZXN0SW5uZXJVbmlvblR5cGUgPSBuZXcgVGVzdElubmVyVW5pb25UeXBlKCk7Ci0gICAgICAgIHBhY2tpbmdUeXBlX3QgPSBuZXcgUGFja2luZ1R5cGVfVCgpOwotICAgICAgICB0ZXN0SW5uZXJVbmlvblR5cGUuc2V0VGVzdElubmVyVW5pb25UeXBlKHBhY2tpbmdUeXBlX3QpOwotICAgICAgICBwYWNraW5nVHlwZV90LnNldE9iamVjdChQYWNraW5nVHlwZV9UX3R5cGUyLlRBUik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IHRlc3RJbm5lclVuaW9uVHlwZS5nZXRPTUVsZW1lbnQoVGVzdElubmVyVW5pb25UeXBlLk1ZX1FOQU1FLE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTSBFbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdElubmVyVW5pb25UeXBlIHJlc3VsdCA9IFRlc3RJbm5lclVuaW9uVHlwZS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGFja2luZ1R5cGVfVF90eXBlMi5UQVIscmVzdWx0LmdldFRlc3RJbm5lclVuaW9uVHlwZSgpLmdldE9iamVjdCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICB9Ci0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24yL1VuaW9uMlRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi1jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY2hlbWEvdW5pb24yL1VuaW9uMlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViNWE4MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGItY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3VuaW9uMi9VbmlvbjJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS51bmlvbjI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy50ZW1wdXJpLnVuaW9uMi4qOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotCi1wdWJsaWMgY2xhc3MgVW5pb24yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbmlvbkVsZW1lbnQyKCkgewotICAgICAgICBUZXN0VW5pb25FbGVtZW50MiB0ZXN0VW5pb25FbGVtZW50MiA9IG5ldyBUZXN0VW5pb25FbGVtZW50MigpOwotCi0gICAgICAgIFRlc3RVbmlvbjEgcGFyYW0xID0gbmV3IFRlc3RVbmlvbjEoKTsKLSAgICAgICAgcGFyYW0xLnNldE9iamVjdChCb29sZWFuLlRSVUUpOwotICAgICAgICB0ZXN0VW5pb25FbGVtZW50Mi5zZXRQYXJhbTEocGFyYW0xKTsKLQotICAgICAgICBUZXN0VW5pb24xIGF0dHJpYnV0ZTEgPSBuZXcgVGVzdFVuaW9uMSgpOwotICAgICAgICBhdHRyaWJ1dGUxLnNldE9iamVjdCgidGVzdCBhdHRyaWJ1dGUiKTsKLQotICAgICAgICB0ZXN0VW5pb25FbGVtZW50Mi5zZXRBdHRyaWJ1dGUxKGF0dHJpYnV0ZTEpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gdGVzdFVuaW9uRWxlbWVudDIuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0VW5pb25FbGVtZW50Mi5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgU3RyaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgVGVzdFVuaW9uRWxlbWVudDIgcmVzdWx0ID0gVGVzdFVuaW9uRWxlbWVudDIuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRPYmplY3QoKSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0QXR0cmlidXRlMSgpLmdldE9iamVjdCgpLCAidGVzdCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RWxlbWVudDIoKSB7Ci0gICAgICAgIFRlc3RMaXN0RWxlbWVudDEgdGVzdExpc3RFbGVtZW50MSA9IG5ldyBUZXN0TGlzdEVsZW1lbnQxKCk7Ci0KLSAgICAgICAgVGVzdExpc3QxIHBhcmFtMSA9IG5ldyBUZXN0TGlzdDEoKTsKLSAgICAgICAgcGFyYW0xLnNldFN0cmluZyhuZXcgU3RyaW5nW117InBhcmFtMSIsICJwYXJhbTIifSk7Ci0gICAgICAgIHRlc3RMaXN0RWxlbWVudDEuc2V0UGFyYW0xKHBhcmFtMSk7Ci0KLSAgICAgICAgVGVzdExpc3QxIGF0dHJpYnV0ZTEgPSBuZXcgVGVzdExpc3QxKCk7Ci0gICAgICAgIGF0dHJpYnV0ZTEuc2V0U3RyaW5nKG5ldyBTdHJpbmdbXXsiYXR0cmlidXRlMSIsImF0dHJpYnV0ZTIifSk7Ci0gICAgICAgIHRlc3RMaXN0RWxlbWVudDEuc2V0QXR0cmlidXRlMShhdHRyaWJ1dGUxKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RMaXN0RWxlbWVudDEuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBUZXN0TGlzdEVsZW1lbnQxLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBTdHJpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0TGlzdEVsZW1lbnQxIHJlc3VsdCA9IFRlc3RMaXN0RWxlbWVudDEuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRTdHJpbmcoKVswXSwgInBhcmFtMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRTdHJpbmcoKVsxXSwgInBhcmFtMiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRBdHRyaWJ1dGUxKCkuZ2V0U3RyaW5nKClbMF0sICJhdHRyaWJ1dGUxIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldEF0dHJpYnV0ZTEoKS5nZXRTdHJpbmcoKVsxXSwgImF0dHJpYnV0ZTIiKTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGdXp6RGF0ZVR5cGUoKXsKLSAgICAgICAgVGVzdEZ1enp5RGF0ZVR5cGUgdGVzdEZ1enp5RGF0ZVR5cGUgPSBuZXcgVGVzdEZ1enp5RGF0ZVR5cGUoKTsKLQotICAgICAgICBGdXp6eURhdGVUeXBlIGZ1enp5RGF0ZVR5cGUgPSBuZXcgRnV6enlEYXRlVHlwZSgpOwotICAgICAgICBmdXp6eURhdGVUeXBlLnNldE9iamVjdChuZXcgRGF0ZSgpKTsKLQotICAgICAgICB0ZXN0RnV6enlEYXRlVHlwZS5zZXRUZXN0RnV6enlEYXRlVHlwZShmdXp6eURhdGVUeXBlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHRlc3RGdXp6eURhdGVUeXBlLmdldE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgVGVzdEZ1enp5RGF0ZVR5cGUuTVlfUU5BTUUsT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBUZXN0RnV6enlEYXRlVHlwZSByZXN1bHQgPSBUZXN0RnV6enlEYXRlVHlwZS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL2FkYi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzY0ZTEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBEYXRhIEJpbmRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIERhdGEgQmluZGluZyBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2FkYjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2FkYjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvYWRiPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypQaGFzZVJlc29sdmluZ1Rlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmNTMxMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoKLSAqIEFEQkJlYW4gLSBBeGlzIERhdGEgQmluZGluZyBCZWFuLiBUaGlzIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHRoZSBiZWFucyB0aGF0IGFyZSBiZWluZyBnZW5lcmF0ZWQgYnkKLSAqIEF4aXMyIGRhdGEgYmluZGluZyBmcmFtZXdvcmsKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEFEQkJlYW4gZXh0ZW5kcyBTZXJpYWxpemFibGUgewotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZXMgYW4gQURCQmVhbi4gR2V0cyB0aGUgcHVsbCBwYXJzZXIgYW5kIGZldGNoZXMgdGhlIFhNTCBwdWxsIGV2ZW50cyB0byByZXByZXNlbnQgdGhlCi0gICAgICogYmVhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGJCZWFuUU5hbWUgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGlzIEFEQkJlYW4uCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgcHVsbCBwYXJzZXIgZm9yIHRoaXMgQURCQmVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoUU5hbWUgYWRiQmVhblFOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlcmUgd2lsbCBiZSBhIHNlbGYgZmFjdG9yeSBpbiBldmVyeSBnZW5lcmF0ZWQgZGF0YSBib3VuZCBjbGFzcyBYWFg6Ci0gICAgICogcHVibGljIHN0YXRpYyBYWFggcmVhZCAoWE1MU3RyZWFtUmVhZGVyKTsKLSAgICAgKi8KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJEYXRhU291cmNlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDU0ZTFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQURCRGF0YVNvdXJjZSBpbXBsZW1lbnRzIE9NRGF0YVNvdXJjZUV4dCB7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHBhcmVudFFOYW1lOwotICAgIHByaXZhdGUgQURCQmVhbiBiZWFuOwotICAgIAotICAgIEhhc2hNYXAgbWFwID0gbnVsbDsgIC8vIE1hcCBvZiBwcm9wZXJ0aWVzCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciB0YWtpbmcgaW4gYW4gQURCQmVhbgotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQURCRGF0YVNvdXJjZShBREJCZWFuIGJlYW4sIFFOYW1lIHBhcmVudFFOYW1lKSB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgICAgIHRoaXMucGFyZW50UU5hbWUgPSBwYXJlbnRRTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAc2VlIE9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5PdXRwdXRTdHJlYW0sIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dHB1dCk7Ci0gICAgICAgIHNlcmlhbGl6ZSh4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHBhcmFtIGZvcm1hdAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHNlZSBPTURhdGFTb3VyY2Ujc2VyaWFsaXplKGphdmEuaW8uV3JpdGVyLCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgd3JpdGVyLCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpOwotICAgICAgICBzZXJpYWxpemUoeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBuZWVkcyB0byBiZSBnZW5lcmF0ZWQgaW5zaWRlIHRoZSBBREIgYmVhbgotICAgICAqCi0gICAgICogQHBhcmFtIHhtbFdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHNlZSBPTURhdGFTb3VyY2Ujc2VyaWFsaXplKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgbXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyID0gbmV3IE1UT01Bd2FyZVhNTFNlcmlhbGl6ZXIoeG1sV3JpdGVyKTsKLSAgICAgICAgc2VyaWFsaXplKG10b21Bd2FyZVhNTFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIG10b21Bd2FyZVhNTFN0cmVhbVdyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UjZ2V0UmVhZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBzaW5jZSBvbmx5IEFEQkJlYW5zIHJlbGF0ZWQgdG8gZWxlbWVudHMgY2FuIGJlIHNlcmlhbGl6ZWQKLSAgICAgICAgLy8gd2UgYXJlIHNhZmUgaW4gcGFzc2luZyBudWxsIGhlcmUuCi0gICAgICAgIE1UT01Bd2FyZU9NQnVpbGRlciBtdG9tQXdhcmVPTUJ1aWxkZXIgPSBuZXcgTVRPTUF3YXJlT01CdWlsZGVyKCk7Ci0gICAgICAgIHNlcmlhbGl6ZShtdG9tQXdhcmVPTUJ1aWxkZXIpOwotICAgICAgICByZXR1cm4gbXRvbUF3YXJlT01CdWlsZGVyLmdldE9NRWxlbWVudCgpLmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJhY2tpbmcgT2JqZWN0LgotICAgICAqIEByZXR1cm4gT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcmVhZGluZyB0aGUgYmFja2luZyBvYmplY3QgaXMgZGVzdHJ1Y3RpdmUuCi0gICAgICogQW4gZXhhbXBsZSBvZiBhbiBvYmplY3Qgd2l0aCBhIGRlc3RydWN0aXZlIHJlYWQgaXMgYW4gSW5wdXRTdGVhbS4KLSAgICAgKiBUaGUgb3duaW5nIE9NU291cmNlZEVsZW1lbnQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIGRldGVtaW5lIGlmIE9NIHRyZWUKLSAgICAgKiBleHBhbnNpb24gaXMgbmVlZGVkIHdoZW4gcmVhZGluZyB0aGUgT01EYXRhU291cmNlRXh0LgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVSZWFkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB3cml0aW5nIHRoZSBiYWNraW5nIG9iamVjdCBpcyBkZXN0cnVjdGl2ZS4KLSAgICAgKiBBbiBleGFtcGxlIG9mIGFuIG9iamVjdCB3aXRoIGEgZGVzdHJ1Y3RpdmUgd3JpdGUgaXMgYW4gSW5wdXRTdHJlYW0uCi0gICAgICogVGhlIG93bmluZyBPTVNvdXJjZWRFbGVtZW50IHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlbWluZSBpZiBPTSB0cmVlCi0gICAgICogZXhwYW5zaW9uIGlzIG5lZWRlZCB3aGVuIHdyaXRpbmcgdGhlIE9NRGF0YVNvdXJjZUV4dC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIElucHV0U3RyZWFtIHJlcHJlc2VudGluZyB0aGUgeG1sIGRhdGEKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nIGVuY29kaW5nIG9mIElucHV0U3RyZWFtCi0gICAgICogQHJldHVybiBJbnB1dFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRYTUxJbnB1dFN0cmVhbShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShnZXRYTUxCeXRlcyhlbmNvZGluZykpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYnl0ZVtdIHJlcHJlc2VudGluZyB0aGUgeG1sIGRhdGEKLSAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nIGVuY29kaW5nIG9mIElucHV0U3RyZWFtCi0gICAgICogQHJldHVybiBieXRlW10KLSAgICAgKiBAc2VlIGdldFhNTElucHV0U3RyZWFtCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICBmb3JtYXQuc2V0Q2hhclNldEVuY29kaW5nKGVuY29kaW5nKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShiYW9zLCBmb3JtYXQpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbmV3IE9NRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBEYXRhU291cmNlIGFuZCBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHBhcmVudFFOYW1lID0gbnVsbDsKLSAgICAgICAgYmVhbiA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPTURhdGFTb3VyY2VFeHQgY29weSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MDEzNTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLQotLyoqCi0gKiB1c2VzIHRvIGhhbmRsZSBBREIgZXhjZXB0aW9ucwotICovCi0KLXB1YmxpYyBjbGFzcyBBREJFeGNlcHRpb24gZXh0ZW5kcyBEYXRhQmluZEV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgQURCRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBBREJFeGNlcHRpb24oU3RyaW5nIHN0cmluZykgewotICAgICAgICBzdXBlcihzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBBREJFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcih0aHJvd2FibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBREJFeGNlcHRpb24oU3RyaW5nIHN0cmluZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcihzdHJpbmcsIHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFEQkV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBMb2NhdGlvbiBsb2NhdGlvbiwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcihzdHJpbmcsIGxvY2F0aW9uLCB0aHJvd2FibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBREJFeGNlcHRpb24oU3RyaW5nIHN0cmluZywgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgICAgc3VwZXIoc3RyaW5nLCBsb2NhdGlvbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkhlbHBlckRhdGFTb3VyY2UuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJIZWxwZXJEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzdjNGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQkhlbHBlckRhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZUV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFEQkhlbHBlckRhdGFTb3VyY2UgaW1wbGVtZW50cyBPTURhdGFTb3VyY2VFeHQgewotCi0gICAgcHJvdGVjdGVkIFFOYW1lIHBhcmVudFFOYW1lOwotICAgIHByb3RlY3RlZCBPYmplY3QgYmVhbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGhlbHBlckNsYXNzTmFtZTsKLSAgICAKLSAgICBIYXNoTWFwIG1hcCA9IG51bGw7ICAvLyBNYXAgb2YgcHJvcGVydGllcwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGFraW5nIGluIGFuIEFEQkJlYW4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFEQkhlbHBlckRhdGFTb3VyY2UoT2JqZWN0IGJlYW4sIFFOYW1lIHBhcmVudFFOYW1lLCBTdHJpbmcgaGVscGVyQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuYmVhbiA9IGJlYW47Ci0gICAgICAgIHRoaXMucGFyZW50UU5hbWUgPSBwYXJlbnRRTmFtZTsKLSAgICAgICAgdGhpcy5oZWxwZXJDbGFzc05hbWUgPSBoZWxwZXJDbGFzc05hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3V0cHV0Ci0gICAgICogQHBhcmFtIGZvcm1hdAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKgotICAgICAqIEBzZWUgT01EYXRhU291cmNlI3NlcmlhbGl6ZShqYXZhLmlvLk91dHB1dFN0cmVhbSwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0cHV0KTsKLSAgICAgICAgc2VyaWFsaXplKHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci5mbHVzaCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gZm9ybWF0Ci0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAc2VlIE9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5Xcml0ZXIsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXIsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlcik7Ci0gICAgICAgIHNlcmlhbGl6ZSh4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBpbnNpZGUgdGhlIEFEQiBiZWFuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sV3JpdGVyCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAc2VlIE9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIpCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UjZ2V0UmVhZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBzaW5jZSBvbmx5IEFEQkJlYW5zIHJlbGF0ZWQgdG8gZWxlbWVudHMgY2FuIGJlIHNlcmlhbGl6ZWQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGhlbHBlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShoZWxwZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGhlbHBlckNsYXNzLmdldE1ldGhvZCgiZ2V0UHVsbFBhcnNlciIsIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBRTmFtZS5jbGFzcyB9KTsKLSAgICAgICAgICAgIHJldHVybiAoWE1MU3RyZWFtUmVhZGVyKW1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHsgYmVhbiwgcGFyZW50UU5hbWUgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiYWNraW5nIE9iamVjdC4KLSAgICAgKiBAcmV0dXJuIE9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHJlYWRpbmcgdGhlIGJhY2tpbmcgb2JqZWN0IGlzIGRlc3RydWN0aXZlLgotICAgICAqIEFuIGV4YW1wbGUgb2YgYW4gb2JqZWN0IHdpdGggYSBkZXN0cnVjdGl2ZSByZWFkIGlzIGFuIElucHV0U3RlYW0uCi0gICAgICogVGhlIG93bmluZyBPTVNvdXJjZWRFbGVtZW50IHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXRlbWluZSBpZiBPTSB0cmVlCi0gICAgICogZXhwYW5zaW9uIGlzIG5lZWRlZCB3aGVuIHJlYWRpbmcgdGhlIE9NRGF0YVNvdXJjZUV4dC4KLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgd3JpdGluZyB0aGUgYmFja2luZyBvYmplY3QgaXMgZGVzdHJ1Y3RpdmUuCi0gICAgICogQW4gZXhhbXBsZSBvZiBhbiBvYmplY3Qgd2l0aCBhIGRlc3RydWN0aXZlIHdyaXRlIGlzIGFuIElucHV0U3RyZWFtLgotICAgICAqIFRoZSBvd25pbmcgT01Tb3VyY2VkRWxlbWVudCB1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG8gZGV0ZW1pbmUgaWYgT00gdHJlZQotICAgICAqIGV4cGFuc2lvbiBpcyBuZWVkZWQgd2hlbiB3cml0aW5nIHRoZSBPTURhdGFTb3VyY2VFeHQuCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVdyaXRlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBJbnB1dFN0cmVhbSByZXByZXNlbnRpbmcgdGhlIHhtbCBkYXRhCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFN0cmluZyBlbmNvZGluZyBvZiBJbnB1dFN0cmVhbQotICAgICAqIEByZXR1cm4gSW5wdXRTdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0WE1MSW5wdXRTdHJlYW0oU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZ2V0WE1MQnl0ZXMoZW5jb2RpbmcpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJ5dGVbXSByZXByZXNlbnRpbmcgdGhlIHhtbCBkYXRhCi0gICAgICogQHBhcmFtIGVuY29kaW5nIFN0cmluZyBlbmNvZGluZyBvZiBJbnB1dFN0cmVhbQotICAgICAqIEByZXR1cm4gYnl0ZVtdCi0gICAgICogQHNlZSBnZXRYTUxJbnB1dFN0cmVhbQotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0WE1MQnl0ZXMoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBPTU91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgZm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhlbmNvZGluZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJpYWxpemUoYmFvcywgZm9ybWF0KTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIG5ldyBPTUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgRGF0YVNvdXJjZSBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBwYXJlbnRRTmFtZSA9IG51bGw7Ci0gICAgICAgIGJlYW4gPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQlNPQVBNb2RlbEJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9BREJTT0FQTW9kZWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjdhZjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQlNPQVBNb2RlbEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLS8qKiBCdWlsZHMgYSBTT0FQRW52ZWxvcGUgYXJvdW5kIGFuIEFEQiBwdWxsIHBhcnNlciAqLwotcHVibGljIGNsYXNzIEFEQlNPQVBNb2RlbEJ1aWxkZXIgZXh0ZW5kcyBTdEFYU09BUE1vZGVsQnVpbGRlciB7Ci0KLSAgICBwdWJsaWMgQURCU09BUE1vZGVsQnVpbGRlcihYTUxTdHJlYW1SZWFkZXIgcGFyc2VyLCBTT0FQRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKG5ldyBFbnZlbG9wZShwYXJzZXIpLgotICAgICAgICAgICAgICAgIGdldFB1bGxQYXJzZXIoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKGZhY3RvcnkuZ2V0U29hcFZlcnNpb25VUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQRU5WRUxPUEVfTE9DQUxfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWCkpLAotICAgICAgICAgICAgICBmYWN0b3J5LAotICAgICAgICAgICAgICBmYWN0b3J5LmdldFNvYXBWZXJzaW9uVVJJKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGUgZ2V0RW52ZWxvcGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTT0FQRW52ZWxvcGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudmVsb3BlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbiB7Ci0gICAgICAgIEJvZHkgYm9keTsKLQotICAgICAgICBFbnZlbG9wZShYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB7Ci0gICAgICAgICAgICBib2R5ID0gbmV3IEJvZHkocGFyc2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBRTmFtZShxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgIkhlYWRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuQk9EWV9OQU1FU1BBQ0VfUFJFRklYKSk7Ci0gICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IEhlYWRlcigpKTsKLSAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgUU5hbWUocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksICJCb2R5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5CT0RZX05BTUVTUEFDRV9QUkVGSVgpKTsKLSAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChib2R5KTsKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtV3JhcHBlcihuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpZGVudGlmeVNPQVBWZXJzaW9uKFN0cmluZyBzb2FwVmVyc2lvblVSSUZyb21UcmFuc3BvcnQpIHsKLSAgICAgICAgLy9EbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb2R5Ci0gICAgICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbiB7Ci0gICAgICAgIENoaWxkIGNoaWxkOwotCi0gICAgICAgIEJvZHkoWE1MU3RyZWFtUmVhZGVyIHBhcnNlcikgewotICAgICAgICAgICAgY2hpbGQgPSBuZXcgQ2hpbGQocGFyc2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKHFOYW1lKTsKLSAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChjaGlsZCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuIGltcGxlbWVudGVkIG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXIKLSAgICAgICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgewotICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGQKLSAgICAgICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlcjsKLQotICAgICAgICBDaGlsZChYTUxTdHJlYW1SZWFkZXIgcGFyc2VyKSB7Ci0gICAgICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuIGltcGxlbWVudGVkIG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0RhdGFCaW5kRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvRGF0YUJpbmRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhYTQ5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvRGF0YUJpbmRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogaGFuZGxlcyBkYXRhYmluZGluZyBleGNlcHRpb25zCi0gKi8KLQotcHVibGljIGNsYXNzIERhdGFCaW5kRXhjZXB0aW9uIGV4dGVuZHMgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBEYXRhQmluZEV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGF0YUJpbmRFeGNlcHRpb24oU3RyaW5nIHN0cmluZykgewotICAgICAgICBzdXBlcihzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZEV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHRocm93YWJsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kRXhjZXB0aW9uKFN0cmluZyBzdHJpbmcsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgc3VwZXIoc3RyaW5nLCB0aHJvd2FibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZEV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBMb2NhdGlvbiBsb2NhdGlvbiwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcihzdHJpbmcsIGxvY2F0aW9uLCB0aHJvd2FibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZEV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICBzdXBlcihzdHJpbmcsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9pMThuL0FEQk1lc3NhZ2VzLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvaTE4bi9BREJNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZkZDE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9pMThuL0FEQk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLmkxOG47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZUJ1bmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXNDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQURCTWVzc2FnZXMgewotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHRoaXNDbGFzcyA9IEFEQk1lc3NhZ2VzLmNsYXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9IE1lc3NhZ2VzQ29uc3RhbnRzLnByb2plY3ROYW1lOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX05BTUUgPSBNZXNzYWdlc0NvbnN0YW50cy5yZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIExPQ0FMID0gTWVzc2FnZXNDb25zdGFudHMubG9jYWxlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9IGdldFBhY2thZ2UodGhpc0NsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgQ0xBU1NfTE9BREVSID0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBQQVJFTlQgPQotICAgICAgICAgICAgKE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RQYWNrYWdlTmFtZS5lcXVhbHMoUEFDS0FHRV9OQU1FKSkKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogTWVzc2FnZXNDb25zdGFudHMucm9vdEJ1bmRsZTsKLQotCi0gICAgLyoqICoqIE5PIE5FRUQgVE8gQ0hBTkdFIEFOWVRISU5HIEJFTE9XICoqKiogKi8KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9Ci0gICAgICAgICAgICBuZXcgTWVzc2FnZUJ1bmRsZShQUk9KRUNUX05BTUUsIFBBQ0tBR0VfTkFNRSwgUkVTT1VSQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMLCBDTEFTU19MT0FERVIsIFBBUkVOVCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQnVuZGxlIGdldE1lc3NhZ2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpLmludGVybigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVhNWQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jIyMjIyMjIyMjIyMjIyMjIyMgQ29udmVydGVyIFV0aWwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY29udmVydGVyLmNhbm5vdEdlbmVyYXRlPUNhbm5vdCBnZW5lcmF0ZSBvYmplY3QgZm9yIHswfQotY29udmVydGVyLmNhbm5vdENvbnZlcnQ9Tm8gd2F5IHRvIGNvbnZlcnQgezB9Ci1jb252ZXJ0ZXIuY2Fubm90UGFyc2U9VW5hYmxlIHRvIHBhcnNlICcnezB9JycKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZW1hcHBpbmcvU2ltcGxlVHlwZU1hcHBlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVtYXBwaW5nL1NpbXBsZVR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwMWVlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZW1hcHBpbmcvU2ltcGxlVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlbWFwcGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMudXRpbHMuRGF0YUhhbmRsZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlTWFwcGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkcgPSAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdfSU5UID0gImphdmEubGFuZy5JbnRlZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19ET1VCTEUgPSAiamF2YS5sYW5nLkRvdWJsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdfTE9ORyA9ICJqYXZhLmxhbmcuTG9uZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdfQllURSA9ICJqYXZhLmxhbmcuQnl0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdfU0hPUlQgPSAiamF2YS5sYW5nLlNob3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19CT09MRUFOID0gImphdmEubGFuZy5Cb29sZWFuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19DSEFSID0gImphdmEubGFuZy5DaGFyYWN0ZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXX0ZMT0FUID0gImphdmEubGFuZy5GbG9hdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdfQ0FMRU5EQVIgPSAiamF2YS51dGlsLkNhbGVuZGFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV19EQVRFID0gImphdmEudXRpbC5EYXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UID0gImludCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU4gPSAiYm9vbGVhbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEUgPSAiYnl0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRSA9ICJkb3VibGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVCA9ICJzaG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkcgPSAibG9uZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMT0FUID0gImZsb2F0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUiA9ICJjaGFyIjsKLQotICAgIC8qCi0gICAgICogVG8gc3VwcG9ydCBkZXNlcmlhbGl6ZSBCaWdEZWNpbWFsLCBCaWdJbnRlZ2VyCi0gICAgICogRGF5LCBEdXJhdGlvbiwgTW9udGgsIE1vbnRoRGF5LCBUaW1lLCBZZWFyLCBZZWFyTW9udGgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHX0RFQ0lNQUwgPSAiamF2YS5tYXRoLkJpZ0RlY2ltYWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSUdfSU5URUdFUiA9ICJqYXZhLm1hdGguQmlnSW50ZWdlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBWSA9ICJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERVUkFUSU9OID0gIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT05USCA9ICJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEhfREFZID0gIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FID0gIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFlFQVIgPSAib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVBUl9NT05USCA9ICJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTaW1wbGVUeXBlT2JqZWN0KENsYXNzIHBhcmFtZXRlciwgT01FbGVtZW50IHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcGFyYW1ldGVyLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB2YWx1ZS5nZXRUZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBpZihuYW1lLmVxdWFscyhTVFJJTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgfSBlbHNlICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoSU5UKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEJPT0xFQU4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Cb29sZWFuKHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEJZVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGUodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRE9VQkxFKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoU0hPUlQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0KHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKExPTkcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExvbmcodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRkxPQVQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENIQVIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dC50b0NoYXJBcnJheSgpWzBdOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdfSU5UKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdfQk9PTEVBTikpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19CWVRFKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdfRE9VQkxFKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19TSE9SVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19MT05HKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nKHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdfRkxPQVQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0KHRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdfQ0hBUikpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvQ2hhckFycmF5KClbMF07Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19DQUxFTkRBUikpIHsKLSAgICAgICAgICAgIHJldHVybiBtYWtlQ2FsZW5kYXIodGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoV19EQVRFKSkgewotICAgICAgICAgICAgcmV0dXJuIG1ha2VEYXRlKHRleHQpOwotICAgICAgICB9LyoKLSAgICAgICAgICogcmV0dXJuIHRoZSBjb3JyZXBzb25kaW5nIG9iamVjdCBmb3IgYWRkaW5nIGRhdGEgdHlwZQotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSBpZihuYW1lLmVxdWFscyhCSUdfREVDSU1BTCkpIHsKLSAgICAgICAgCXJldHVybiBuZXcgamF2YS5tYXRoLkJpZ0RlY2ltYWwodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihuYW1lLmVxdWFscyhCSUdfSU5URUdFUikpIHsKLSAgICAgICAgCXJldHVybiBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIodGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihuYW1lLmVxdWFscyhEQVkpKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5KHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYobmFtZS5lcXVhbHMoRFVSQVRJT04pKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRHVyYXRpb24odGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihuYW1lLmVxdWFscyhNT05USCkpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCh0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKE1PTlRIX0RBWSkpIHsKLSAgICAgICAgCXJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheSh0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKFRJTUUpKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSh0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKFlFQVIpKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhcih0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKG5hbWUuZXF1YWxzKFlFQVJfTU9OVEgpKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoKHRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBnZXRBcnJheUxpc3QoT01FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRpdHIgPSBlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKGxvY2FsTmFtZSkpOwotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBjaGlsZGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChvKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEhhc2hTZXQgZ2V0SGFzaFNldChPTUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICBJdGVyYXRvciBjaGlsZGl0ciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUobG9jYWxOYW1lKSk7Ci0gICAgICAgIGZpbmFsIEhhc2hTZXQgbGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvID0gKE9NRWxlbWVudCkgY2hpbGRpdHIubmV4dCgpOwotICAgICAgICAgICAgbGlzdC5hZGQoby5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcihPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBPTU5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgT01UZXh0KSB7Ci0gICAgICAgICAgICBPTVRleHQgdHh0ID0gKE9NVGV4dClub2RlOwotICAgICAgICAgICAgaWYgKHR4dC5pc09wdGltaXplZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChEYXRhSGFuZGxlcil0eHQuZ2V0RGF0YUhhbmRsZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChEYXRhSGFuZGxlcilEYXRhSGFuZGxlclV0aWxzLmdldERhdGFIYW5kbGVyRnJvbVRleHQodHh0LmdldFRleHQoKSwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBnZXRBcnJheUxpc3QoT01FbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRpdHIgPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoY2hpbGRpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGNoaWxkaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoT2JqZWN0IG9iaikgewotICAgICAgICBTdHJpbmcgb2JqQ2xhc3NOYW1lID0gb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQ2FsZW5kYXIgfHwgb2JqIGluc3RhbmNlb2YgRGF0ZSB8fCBpc1NpbXBsZVR5cGUob2JqQ2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTaW1wbGVUeXBlKENsYXNzIG9iaikgewotICAgICAgICBTdHJpbmcgb2JqQ2xhc3NOYW1lID0gb2JqLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIGlzU2ltcGxlVHlwZShvYmpDbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RhdGFIYW5kbGVyKENsYXNzIG9iaikgewotICAgICAgIHJldHVybiBvYmouaXNBc3NpZ25hYmxlRnJvbShEYXRhSGFuZGxlci5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGFzaFNldChDbGFzcyBvYmopIHsKLSAgICAgICAgcmV0dXJuIGphdmEudXRpbC5IYXNoU2V0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbGxlY3Rpb24oQ2xhc3Mgb2JqKSB7Ci0gICAgICAgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2ltcGxlVHlwZShTdHJpbmcgb2JqQ2xhc3NOYW1lKSB7Ci0gICAgICAgIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFNUUklORykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoSU5UKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhCT09MRUFOKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhCWVRFKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhET1VCTEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFNIT1JUKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhMT05HKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhGTE9BVCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoQ0hBUikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoV19JTlQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzc05hbWUuZXF1YWxzKFdfQk9PTEVBTikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoV19CWVRFKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0RPVUJMRSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoV19TSE9SVCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG9iakNsYXNzTmFtZS5lcXVhbHMoV19MT05HKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0ZMT0FUKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0NBTEVOREFSKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqQ2xhc3NOYW1lLmVxdWFscyhXX0RBVEUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSAvKgotICAgICAgICAgKiBjb25zaWRlciBCaWdEZWNpbWFsLCBCaWdJbnRlZ2VyLCBEYXksIER1cmF0aW9uLCBNb250aAotICAgICAgICAgKiBNb250aERheSwgVGltZSwgWWVhciwgWWVhck1vbnRoIGFzIHNpbXBsZSB0eXBlCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIHJldHVybiBvYmpDbGFzc05hbWUuZXF1YWxzKEJJR19ERUNJTUFMKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKEJJR19JTlRFR0VSKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKERBWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2JqQ2xhc3NOYW1lLmVxdWFscyhEVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgfHwgb2JqQ2xhc3NOYW1lLmVxdWFscyhNT05USCkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2JqQ2xhc3NOYW1lLmVxdWFscyhNT05USF9EQVkpCi0gICAgICAgICAgICAgICAgICAgIHx8IG9iakNsYXNzTmFtZS5lcXVhbHMoVElNRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb2JqQ2xhc3NOYW1lLmVxdWFscyhZRUFSKQotICAgICAgICAgICAgICAgICAgICB8fCBvYmpDbGFzc05hbWUuZXF1YWxzKFlFQVJfTU9OVEgpIHx8IG9iakNsYXNzTmFtZS5lcXVhbHMoV19DSEFSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBGbG9hdCB8fAotICAgICAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgZG91YmxlIGRhdGE7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRmxvYXQpIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gKChGbG9hdClvYmopLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSAoRG91YmxlKW9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEb3VibGUuaXNOYU4oZGF0YSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIk5hTiI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJTkYiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhID09IERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiLUlORiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDYWxlbmRhcikgewotICAgICAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCB6dWx1ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MnWiciKTsKLSAgICAgICAgICAgIHp1bHUuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgICAgIHJldHVybiB6dWx1LmZvcm1hdCgoKENhbGVuZGFyKW9iaikuZ2V0VGltZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7Ci0gICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHp1bHUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOwotCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZjZSA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgZ2l2ZW4gYSBwaXJ0aWN1YWxyIHRpbWV6b25lIHdlIHVzZSBpdC4KLSAgICAgICAgICAgIGlmIChheGlzU2VydmNlLmdldFBhcmFtZXRlcigiVGltZVpvbmUiKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgIHp1bHUuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoKFN0cmluZylheGlzU2VydmNlLmdldFBhcmFtZXRlcigiVGltZVpvbmUiKS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB6dWx1LmZvcm1hdChvYmopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBtYWtlQ2FsZW5kYXIoU3RyaW5nIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZShzb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IG1ha2VEYXRlKFN0cmluZyBzb3VyY2UpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoc291cmNlKS5nZXRUaW1lKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRGF5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWE1OWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0RheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYSB0eXBlIGdEYXkKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnRGF5Ij5YTUwgU2NoZW1hIDMuMi4xMzwvYT4KLSAqLwotcHVibGljIGNsYXNzIERheSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtOTAyNDY2MjU1MzkxODU5ODEzMkw7Ci0KLSAgICBpbnQgZGF5OwotICAgIFN0cmluZyB0aW1lem9uZTsKLQotICAgIC8qKiBDb25zdHJ1Y3RzIGEgRGF5IHdpdGggdGhlIGdpdmVuIHZhbHVlcyBObyB0aW1lem9uZSBpcyBzcGVjaWZpZWQgKi8KLSAgICBwdWJsaWMgRGF5KGludCBkYXkpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShkYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBEYXkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLCBpbmNsdWRpbmcgYSB0aW1lem9uZSBzdHJpbmcgVGhlIHRpbWV6b25lIGlzIHZhbGlkYXRlZAotICAgICAqIGJ1dCBub3QgdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF5KGludCBkYXksIFN0cmluZyB0aW1lem9uZSkKLSAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShkYXksIHRpbWV6b25lKTsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RydWN0IGEgRGF5IGZyb20gYSBTdHJpbmcgaW4gdGhlIGZvcm1hdCAtLS1ERFt0aW1lem9uZV0gKi8KLSAgICBwdWJsaWMgRGF5KFN0cmluZyBzb3VyY2UpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpIDwgNSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXkwMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UuY2hhckF0KDApICE9ICctJyB8fAotICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQXQoMSkgIT0gJy0nIHx8Ci0gICAgICAgICAgICAgICAgc291cmNlLmNoYXJBdCgyKSAhPSAnLScpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkRGF5MDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRWYWx1ZShJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMywgNSkpLAotICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKDUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERheSgpIHsKLSAgICAgICAgcmV0dXJuIGRheTsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSBkYXkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXkoaW50IGRheSkgewotICAgICAgICAvLyB2YWxpZGF0ZSBkYXkKLSAgICAgICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkRGF5MDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5kYXkgPSBkYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaW1lem9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWV6b25lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWV6b25lKFN0cmluZyB0aW1lem9uZSkgewotICAgICAgICAvLyB2YWxpZGF0ZSB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCAmJiB0aW1lem9uZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIEZvcm1hdCBbKy8tXUhIOk1NCi0gICAgICAgICAgICBpZiAodGltZXpvbmUuY2hhckF0KDApID09ICcrJyB8fCAodGltZXpvbmUuY2hhckF0KDApID09ICctJykpIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZXpvbmUubGVuZ3RoKCkgIT0gNiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZS5jaGFyQXQoMykgIT0gJzonIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDQpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg1KSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aW1lem9uZS5lcXVhbHMoIloiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgd2UgZ290IHRoaXMgZmFyLCBpdHMgZ29vZAotICAgICAgICAgICAgdGhpcy50aW1lem9uZSA9IHRpbWV6b25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IGRheSwgU3RyaW5nIHRpbWV6b25lKQotICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldERheShkYXkpOwotICAgICAgICBzZXRUaW1lem9uZSh0aW1lem9uZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IGRheSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldERheShkYXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIC8vIHVzZSBOdW1iZXJGb3JtYXQgdG8gZW5zdXJlIGxlYWRpbmcgemVyb3MKLSAgICAgICAgTnVtYmVyRm9ybWF0IG5mID0gTnVtYmVyRm9ybWF0LmdldEluc3RhbmNlKCk7Ci0gICAgICAgIG5mLnNldEdyb3VwaW5nVXNlZChmYWxzZSk7Ci0KLSAgICAgICAgLy8gRGF5Ci0gICAgICAgIG5mLnNldE1pbmltdW1JbnRlZ2VyRGlnaXRzKDIpOwotICAgICAgICBTdHJpbmcgcyA9ICItLS0iICsgbmYuZm9ybWF0KGRheSk7Ci0KLSAgICAgICAgLy8gdGltZXpvbmUKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHMgPSBzICsgdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRGF5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBEYXkgb3RoZXIgPSAoRGF5KW9iajsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBib29sZWFuIGVxdWFscyA9ICh0aGlzLmRheSA9PSBvdGhlci5kYXkpOwotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIHRpbWV6b25lLmVxdWFscyhvdGhlci50aW1lem9uZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGRheSBYT1JlZCB3aXRoIHRoZSBoYXNoQ29kZSBvZiB0aW1lem9uZSBpZmYgb25lIGlzIGRlZmluZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbnVsbCA9PSB0aW1lem9uZSA/IGRheSA6IGRheSBeIHRpbWV6b25lLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0R1cmF0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRHVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5ZTE2Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRHVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgdHlwZSBkdXJhdGlvbi4gRHVyYXRpb24gc3VwcG9ydHMgYSBtaW5pbXVtIGZyYWN0aW9uYWwgc2Vjb25kCi0gKiBwcmVjaXNpb24gb2YgbWlsbGlzZWNvbmRzLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2R1cmF0aW9uIj5YTUwgU2NoZW1hIDMuMi42PC9hPgotICovCi1wdWJsaWMgY2xhc3MgRHVyYXRpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM3MzY3NjA5OTI1NDEzNjkwOThMOwotCi0gICAgYm9vbGVhbiBpc05lZ2F0aXZlOwotICAgIGludCB5ZWFyczsKLSAgICBpbnQgbW9udGhzOwotICAgIGludCBkYXlzOwotICAgIGludCBob3VyczsKLSAgICBpbnQgbWludXRlczsKLSAgICBkb3VibGUgc2Vjb25kczsKLQotICAgIC8qKiBEZWZhdWx0IG5vLWFyZyBjb25zdHJ1Y3RvciAqLwotICAgIHB1YmxpYyBEdXJhdGlvbigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmVnYXRpdmUKLSAgICAgKiBAcGFyYW0gYVllYXJzCi0gICAgICogQHBhcmFtIGFNb250aHMKLSAgICAgKiBAcGFyYW0gYURheXMKLSAgICAgKiBAcGFyYW0gYUhvdXJzCi0gICAgICogQHBhcmFtIGFNaW51dGVzCi0gICAgICogQHBhcmFtIGFTZWNvbmRzCi0gICAgICovCi0gICAgcHVibGljIER1cmF0aW9uKGJvb2xlYW4gbmVnYXRpdmUsIGludCBhWWVhcnMsIGludCBhTW9udGhzLCBpbnQgYURheXMsCi0gICAgICAgICAgICAgICAgICAgIGludCBhSG91cnMsIGludCBhTWludXRlcywgZG91YmxlIGFTZWNvbmRzKSB7Ci0gICAgICAgIGlzTmVnYXRpdmUgPSBuZWdhdGl2ZTsKLSAgICAgICAgeWVhcnMgPSBhWWVhcnM7Ci0gICAgICAgIG1vbnRocyA9IGFNb250aHM7Ci0gICAgICAgIGRheXMgPSBhRGF5czsKLSAgICAgICAgaG91cnMgPSBhSG91cnM7Ci0gICAgICAgIG1pbnV0ZXMgPSBhTWludXRlczsKLSAgICAgICAgc2V0U2Vjb25kcyhhU2Vjb25kcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBEdXJhdGlvbiBmcm9tIGEgU3RyaW5nIGluIGFuIHhzZDpkdXJhdGlvbiBmb3JtYXQgLSBQblluTW5EVG5Ibk1uUy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkdXJhdGlvbiBTdHJpbmcKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5LgotICAgICAqLwotICAgIHB1YmxpYyBEdXJhdGlvbihTdHJpbmcgZHVyYXRpb24pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpbnQgcG9zaXRpb24gPSAxOwotICAgICAgICBpbnQgdGltZVBvc2l0aW9uID0gZHVyYXRpb24uaW5kZXhPZigiVCIpOwotCi0gICAgICAgIC8vIFAgaXMgcmVxdWlyZWQgYnV0IFAgYnkgaXRzZWxmIGlzIGludmFsaWQKLSAgICAgICAgaWYgKGR1cmF0aW9uLmluZGV4T2YoIlAiKSA9PSAtMSB8fCBkdXJhdGlvbi5lcXVhbHMoIlAiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkRHVyYXRpb24iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBwcmVzZW50LCB0aW1lIGNhbm5vdCBiZSBlbXB0eQotICAgICAgICBpZiAoZHVyYXRpb24ubGFzdEluZGV4T2YoIlQiKSA9PSBkdXJhdGlvbi5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLS8vICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREdXJhdGlvbiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBzaWduCi0gICAgICAgIGlmIChkdXJhdGlvbi5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgIGlzTmVnYXRpdmUgPSB0cnVlOwotICAgICAgICAgICAgcG9zaXRpb24rKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnNlIHRpbWUgcGFydAotICAgICAgICBpZiAodGltZVBvc2l0aW9uICE9IC0xKSB7Ci0gICAgICAgICAgICBwYXJzZVRpbWUoZHVyYXRpb24uc3Vic3RyaW5nKHRpbWVQb3NpdGlvbiArIDEpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRpbWVQb3NpdGlvbiA9IGR1cmF0aW9uLmxlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcGFyc2UgZGF0ZSBwYXJ0Ci0gICAgICAgIGlmIChwb3NpdGlvbiAhPSB0aW1lUG9zaXRpb24pIHsKLSAgICAgICAgICAgIHBhcnNlRGF0ZShkdXJhdGlvbi5zdWJzdHJpbmcocG9zaXRpb24sIHRpbWVQb3NpdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBEdXJhdGlvbiBmcm9tIGEgQ2FsZW5kYXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsZW5kYXIgQ2FsZW5kYXIKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY2FsZW5kYXIgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhbnkgZGF0ZSBub3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBEdXJhdGlvbihib29sZWFuIG5lZ2F0aXZlLCBDYWxlbmRhciBjYWxlbmRhcikgdGhyb3dzCi0gICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aGlzLmlzTmVnYXRpdmUgPSBuZWdhdGl2ZTsKLSAgICAgICAgdGhpcy55ZWFycyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5ZRUFSKTsKLSAgICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTU9OVEgpOwotICAgICAgICB0aGlzLmRheXMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFURSk7Ci0gICAgICAgIHRoaXMuaG91cnMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUik7Ci0gICAgICAgIHRoaXMubWludXRlcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NSU5VVEUpOwotICAgICAgICB0aGlzLnNlY29uZHMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKLSAgICAgICAgdGhpcy5zZWNvbmRzICs9ICgoZG91YmxlKWNhbGVuZGFyLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpIC8gMTAwOwotICAgICAgICBpZiAoeWVhcnMgPT0gMCAmJiBtb250aHMgPT0gMCAmJiBkYXlzID09IDAgJiYgaG91cnMgPT0gMCAmJgotICAgICAgICAgICAgICAgIG1pbnV0ZXMgPT0gMCAmJiBzZWNvbmRzID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkQ2FsZW5kYXJGb3JEdXJhdGlvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgdGltZSBwb3J0aW9uIG9mIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB4c2Q6ZHVyYXRpb24gLSBuSG5NblMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRpbWUgZG9lcyBub3QgbWF0Y2ggcGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlVGltZShTdHJpbmcgdGltZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aW1lLmxlbmd0aCgpID09IDAgfHwgdGltZS5pbmRleE9mKCItIikgIT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZUR1cmF0aW9uIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGltZSBlbmRzIHdpdGggZWl0aGVyIEgsIE0sIG9yIFMKLSAgICAgICAgaWYgKCF0aW1lLmVuZHNXaXRoKCJIIikgJiYgIXRpbWUuZW5kc1dpdGgoIk0iKSAmJiAhdGltZS5lbmRzV2l0aCgiUyIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWVEdXJhdGlvbiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBwYXJzZSBzdHJpbmcgYW5kIGV4dHJhY3QgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzCi0gICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwotCi0gICAgICAgICAgICAvLyBIb3VycwotICAgICAgICAgICAgaW50IGVuZCA9IHRpbWUuaW5kZXhPZigiSCIpOwotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgSCBpbiBhIHN0cmluZyBidXQgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIGhvdXJzLAotICAgICAgICAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZUR1cmF0aW9uIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGhvdXJzID0gSW50ZWdlci5wYXJzZUludCh0aW1lLnN1YnN0cmluZygwLCBlbmQpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE1pbnV0ZXMKLSAgICAgICAgICAgIGVuZCA9IHRpbWUuaW5kZXhPZigiTSIpOwotICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgTSBpbiBhIHN0cmluZyBidXQgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIGhvdXJzLAotICAgICAgICAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lRHVyYXRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbmQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtaW51dGVzID0gSW50ZWdlci5wYXJzZUludCh0aW1lLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWNvbmRzCi0gICAgICAgICAgICBlbmQgPSB0aW1lLmluZGV4T2YoIlMiKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIFMgaW4gYSBzdHJpbmcgYnV0IHRoZXJlIGlzIG5vIHZhbHVlIGZvciBob3VycywKLSAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWVEdXJhdGlvbiIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVuZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHNldFNlY29uZHMoRG91YmxlLnBhcnNlRG91YmxlKHRpbWUuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWVEdXJhdGlvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgZGF0ZSBwb3J0aW9uIG9mIGEgU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB4c2Q6ZHVyYXRpb24gLSBuWW5NbkQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGRhdGUgZG9lcyBub3QgbWF0Y2ggcGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlRGF0ZShTdHJpbmcgZGF0ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkYXRlLmxlbmd0aCgpID09IDAgfHwgZGF0ZS5pbmRleE9mKCItIikgIT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkRGF0ZUR1cmF0aW9uIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgZGF0ZSBzdHJpbmcgZW5kcyB3aXRoIGVpdGhlciBZLCBNLCBvciBECi0gICAgICAgIGlmICghZGF0ZS5lbmRzV2l0aCgiWSIpICYmICFkYXRlLmVuZHNXaXRoKCJNIikgJiYgIWRhdGUuZW5kc1dpdGgoIkQiKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXRlRHVyYXRpb24iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYXRjaCBhbnkgcGFyc2luZyBleGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHBhcnNlIHN0cmluZyBhbmQgZXh0cmFjdCB5ZWFycywgbW9udGhzLCBkYXlzCi0gICAgICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICAgICAgaW50IGVuZCA9IGRhdGUuaW5kZXhPZigiWSIpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBZIGluIGEgc3RyaW5nIGJ1dCB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgeWVhcnMsCi0gICAgICAgICAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkRGF0ZUR1cmF0aW9uIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHllYXJzID0gSW50ZWdlci5wYXJzZUludChkYXRlLnN1YnN0cmluZygwLCBlbmQpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIG1vbnRocwotICAgICAgICAgICAgZW5kID0gZGF0ZS5pbmRleE9mKCJNIik7Ci0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBNIGluIGEgc3RyaW5nIGJ1dCB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgbW9udGhzLAotICAgICAgICAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkRGF0ZUR1cmF0aW9uIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIG1vbnRocyA9IEludGVnZXIucGFyc2VJbnQoZGF0ZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gZW5kICsgMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5kID0gZGF0ZS5pbmRleE9mKCJEIik7Ci0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBEIGluIGEgc3RyaW5nIGJ1dCB0aGVyZSBpcyBubyB2YWx1ZSBmb3IgZGF5cywKLSAgICAgICAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXRlRHVyYXRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZGF5cyA9IEludGVnZXIucGFyc2VJbnQoZGF0ZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWREYXRlRHVyYXRpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTmVnYXRpdmUoKSB7Ci0gICAgICAgIHJldHVybiBpc05lZ2F0aXZlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRZZWFycygpIHsKLSAgICAgICAgcmV0dXJuIHllYXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNb250aHMoKSB7Ci0gICAgICAgIHJldHVybiBtb250aHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERheXMoKSB7Ci0gICAgICAgIHJldHVybiBkYXlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRIb3VycygpIHsKLSAgICAgICAgcmV0dXJuIGhvdXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNaW51dGVzKCkgewotICAgICAgICByZXR1cm4gbWludXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0U2Vjb25kcygpIHsKLSAgICAgICAgcmV0dXJuIHNlY29uZHM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBuZWdhdGl2ZSAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROZWdhdGl2ZShib29sZWFuIG5lZ2F0aXZlKSB7Ci0gICAgICAgIGlzTmVnYXRpdmUgPSBuZWdhdGl2ZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHllYXJzICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFllYXJzKGludCB5ZWFycykgewotICAgICAgICB0aGlzLnllYXJzID0geWVhcnM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtb250aHMgICovCi0gICAgcHVibGljIHZvaWQgc2V0TW9udGhzKGludCBtb250aHMpIHsKLSAgICAgICAgdGhpcy5tb250aHMgPSBtb250aHM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBkYXlzICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERheXMoaW50IGRheXMpIHsKLSAgICAgICAgdGhpcy5kYXlzID0gZGF5czsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGhvdXJzICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvdXJzKGludCBob3VycykgewotICAgICAgICB0aGlzLmhvdXJzID0gaG91cnM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtaW51dGVzICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1pbnV0ZXMoaW50IG1pbnV0ZXMpIHsKLSAgICAgICAgdGhpcy5taW51dGVzID0gbWludXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2Vjb25kcwotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3NldFNlY29uZHMoZG91YmxlKSBzZXRTZWNvbmRzKGRvdWJsZSl9IGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWNvbmRzKGludCBzZWNvbmRzKSB7Ci0gICAgICAgIHRoaXMuc2Vjb25kcyA9IHNlY29uZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2Vjb25kcy4gTk9URTogVGhlIGZyYWN0aW9uYWwgdmFsdWUgb2Ygc2Vjb25kcyBpcyByb3VuZGVkIHVwIHRvIG1pbGxpc2Vjb25kcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWNvbmRzIGRvdWJsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZHMoZG91YmxlIHNlY29uZHMpIHsKLSAgICAgICAgdGhpcy5zZWNvbmRzID0gKChkb3VibGUpKE1hdGgucm91bmQoc2Vjb25kcyAqIDEwMCkpKSAvIDEwMDsKLSAgICB9Ci0KLSAgICAvKiogVGhpcyByZXR1cm5zIHRoZSB4bWwgcmVwcmVzZW50YXRpb24gb2YgYW4geHNkOmR1cmF0aW9uIG9iamVjdC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgZHVyYXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZHVyYXRpb24uYXBwZW5kKCJQIik7Ci0KLSAgICAgICAgaWYgKHllYXJzICE9IDApIHsKLSAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZCh5ZWFycykuYXBwZW5kKCJZIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vbnRocyAhPSAwKSB7Ci0gICAgICAgICAgICBkdXJhdGlvbi5hcHBlbmQobW9udGhzKS5hcHBlbmQoIk0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGF5cyAhPSAwKSB7Ci0gICAgICAgICAgICBkdXJhdGlvbi5hcHBlbmQoZGF5cykuYXBwZW5kKCJEIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhvdXJzICE9IDAgfHwgbWludXRlcyAhPSAwIHx8IHNlY29uZHMgIT0gMC4wKSB7Ci0gICAgICAgICAgICBkdXJhdGlvbi5hcHBlbmQoIlQiKTsKLQotICAgICAgICAgICAgaWYgKGhvdXJzICE9IDApIHsKLSAgICAgICAgICAgICAgICBkdXJhdGlvbi5hcHBlbmQoaG91cnMpLmFwcGVuZCgiSCIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWludXRlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24uYXBwZW5kKG1pbnV0ZXMpLmFwcGVuZCgiTSIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2Vjb25kcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlY29uZHMgPT0gKGludClzZWNvbmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZCgoaW50KXNlY29uZHMpLmFwcGVuZCgiUyIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLmFwcGVuZChzZWNvbmRzKS5hcHBlbmQoIlMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHVyYXRpb24ubGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgZHVyYXRpb24uYXBwZW5kKCJUMFMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc05lZ2F0aXZlKSB7Ci0gICAgICAgICAgICBkdXJhdGlvbi5pbnNlcnQoMCwgIi0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkdXJhdGlvbi50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBlcXVhbHMgbWV0aG9kIGNvbXBhcmVzIHRoZSB0aW1lIHJlcHJlc2VudGVkIGJ5IGR1cmF0aW9uIG9iamVjdCwgbm90IGl0cyBzdHJpbmcKLSAgICAgKiByZXByZXNlbnRhdGlvbi4gSGVuY2UsIGEgZHVyYXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyA2NSBtaW51dGVzIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG8gYQotICAgICAqIGR1cmF0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgMSBob3VyIGFuZCA1IG1pbnV0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRHVyYXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBEdXJhdGlvbiBkdXJhdGlvbiA9IChEdXJhdGlvbilvYmplY3Q7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuaXNOZWdhdGl2ZSA9PSBkdXJhdGlvbi5pc05lZ2F0aXZlICYmCi0gICAgICAgICAgICAgICAgdGhpcy5nZXRBc0NhbGVuZGFyKCkuZXF1YWxzKGR1cmF0aW9uLmdldEFzQ2FsZW5kYXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgY29tcGFyZShEdXJhdGlvbiBkdXJhdGlvbikgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRBc0NhbGVuZGFyKCkuZ2V0VGltZUluTWlsbGlzKCkgLSBkdXJhdGlvbi5nZXRBc0NhbGVuZGFyKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gMDsKLQotICAgICAgICBpZiAoaXNOZWdhdGl2ZSkgewotICAgICAgICAgICAgaGFzaENvZGUrKzsKLSAgICAgICAgfQotICAgICAgICBoYXNoQ29kZSArPSB5ZWFyczsKLSAgICAgICAgaGFzaENvZGUgKz0gbW9udGhzOwotICAgICAgICBoYXNoQ29kZSArPSBkYXlzOwotICAgICAgICBoYXNoQ29kZSArPSBob3VyczsKLSAgICAgICAgaGFzaENvZGUgKz0gbWludXRlczsKLSAgICAgICAgaGFzaENvZGUgKz0gc2Vjb25kczsKLSAgICAgICAgLy8gbWlsbGlzZWNvbmRzCi0gICAgICAgIGhhc2hDb2RlICs9IChzZWNvbmRzICogMTAwKSAlIDEwMDsKLQotICAgICAgICByZXR1cm4gaGFzaENvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkdXJhdGlvbiBhcyBhIGNhbGVuZGFyLiAgRHVlIHRvIHRoZSB3YXkgYSBDYWxlbmRhciBjbGFzcyB3b3JrcywgdGhlIHZhbHVlcyBmb3IKLSAgICAgKiBwYXJ0aWN1bGFyIGZpZWxkcyBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIG9idGFpbmVkIHRocm91Z2ggZ2V0dGVyIG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgaWYgYQotICAgICAqIGR1cmF0aW9uJ3Mgb2JqZWN0IGdldE1vbnRocyByZXR1cm5zIDIwLCBhIHNpbWlsYXIgY2FsbCBvbiBhIGNhbGVuZGFyIG9iamVjdCB3aWxsIHJldHVybiAxCi0gICAgICogeWVhciBhbmQgOCBtb250aHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENhbGVuZGFyCi0gICAgICovCi0gICAgcHVibGljIENhbGVuZGFyIGdldEFzQ2FsZW5kYXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBc0NhbGVuZGFyKENhbGVuZGFyLmdldEluc3RhbmNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZHVyYXRpb24gYXMgYSBjYWxlbmRhci4gIER1ZSB0byB0aGUgd2F5IGEgQ2FsZW5kYXIgY2xhc3Mgd29ya3MsIHRoZSB2YWx1ZXMgZm9yCi0gICAgICogcGFydGljdWxhciBmaWVsZHMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyBvYnRhaW5lZCB0aHJvdWdoIGdldHRlciBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIGlmIGEKLSAgICAgKiBEdXJhdGlvbidzIG9iamVjdCBnZXRNb250aHMgcmV0dXJucyAyMCwgYSBzaW1pbGFyIGNhbGwgb24gYSBDYWxlbmRhciBvYmplY3Qgd2lsbCByZXR1cm4gMQotICAgICAqIHllYXIgYW5kIDggbW9udGhzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0VGltZSBDYWxlbmRhcgotICAgICAqIEByZXR1cm4gQ2FsZW5kYXIKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2FsZW5kYXIgZ2V0QXNDYWxlbmRhcihDYWxlbmRhciBzdGFydFRpbWUpIHsKLSAgICAgICAgQ2FsZW5kYXIgcmV0ID0gKENhbGVuZGFyKXN0YXJ0VGltZS5jbG9uZSgpOwotICAgICAgICByZXQuc2V0KENhbGVuZGFyLllFQVIsIHllYXJzKTsKLSAgICAgICAgcmV0LnNldChDYWxlbmRhci5NT05USCwgbW9udGhzKTsKLSAgICAgICAgcmV0LnNldChDYWxlbmRhci5EQVRFLCBkYXlzKTsKLSAgICAgICAgcmV0LnNldChDYWxlbmRhci5IT1VSLCBob3Vycyk7Ci0gICAgICAgIHJldC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCBtaW51dGVzKTsKLSAgICAgICAgcmV0LnNldChDYWxlbmRhci5TRUNPTkQsIChpbnQpc2Vjb25kcyk7Ci0gICAgICAgIHJldC5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsCi0gICAgICAgICAgICAgICAgKGludCkoc2Vjb25kcyAqIDEwMCAtIE1hdGgucm91bmQoc2Vjb25kcykgKiAxMDApKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRW50aXRpZXMuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9FbnRpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjgxODlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9FbnRpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBFbnRpdGllcwotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI0VOVElUSUVTIj5YTUwgU2NoZW1hIDMuMy4xMiBFTlRJVElFUzwvYT4KLSAqLwotcHVibGljIGNsYXNzIEVudGl0aWVzIGV4dGVuZHMgTkNOYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00NTExMzY4MTk1MTQzNTYwODA5TDsKLQotICAgIHByaXZhdGUgRW50aXR5W10gZW50aXRpZXM7Ci0KLSAgICBwdWJsaWMgRW50aXRpZXMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgRW50aXRpZXMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXRpZXMoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdFZhbHVlKTsKLSAgICAgICAgaW50IGNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGVudGl0aWVzID0gbmV3IEVudGl0eVtjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZW50aXRpZXNbaV0gPSBuZXcgRW50aXR5KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRW50aXR5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiN2I0NTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIFhTRCBkYXRhIHR5cGUgRW50aXR5Ci0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jRU5USVRZIj5YTUwgU2NoZW1hIDMuMy4xMSBFTlRJVFk8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHkgZXh0ZW5kcyBOQ05hbWUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4Njg0MTA4ODM4NTY5NjE5NDJMOwotCi0gICAgcHVibGljIEVudGl0eSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBFbnRpdHkKLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5KFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoc3RWYWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0hleEJpbmFyeS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0hleEJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2ZjNmU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9IZXhCaW5hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMgOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBoZXhCaW5hcnkuICovCi1wdWJsaWMgY2xhc3MgSGV4QmluYXJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MDgyNDAzODk5OTg2NzIwNzY3TDsKLQotICAgIGJ5dGVbXSBtX3ZhbHVlOwotCi0gICAgcHVibGljIEhleEJpbmFyeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGV4QmluYXJ5KFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgbV92YWx1ZSA9IGRlY29kZShzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZXhCaW5hcnkoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgIG1fdmFsdWUgPSBieXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKCkgewotICAgICAgICByZXR1cm4gbV92YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZW5jb2RlKG1fdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIC8vVE9ETzogSG93IGRvIHdlIGhhc2ggdGhpcz8KLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgLy9UT0RPOiBJcyB0aGlzIGdvb2QgZW5vdWdoPwotICAgICAgICBTdHJpbmcgczEgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIHMyID0gdGhpcy50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gczEuZXF1YWxzKHMyKTsKLSAgICB9Ci0KLSAgICAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PRERfTlVNQkVSX09GX0RJR0lUUyA9Ci0gICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJvZGREaWdpdHMwMCIpOwotICAgIC8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQkFEX0NIQVJBQ1RFUl9JTl9IRVhfU1RSSU5HID0KLSAgICAvLyAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkQ2hhcnMwMSIpOwotCi0gICAgLy8gQ29kZSBmcm9tIEFqcDExLCBmcm9tIEFwYWNoZSdzIEpTZXJ2Ci0KLSAgICAvLyBUYWJsZSBmb3IgSEVYIHRvIERFQyBieXRlIHRyYW5zbGF0aW9uCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBERUMgPSB7Ci0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAwMCwgMDEsIDAyLCAwMywgMDQsIDA1LCAwNiwgMDcsIDgsIDksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZSBhcnJheSBieSBlbmNvZGluZyBlYWNoIHR3bwotICAgICAqIGhleGFkZWNpbWFsIGRpZ2l0cyBhcyBhIGJ5dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlnaXRzIEhleGFkZWNpbWFsIGRpZ2l0cyByZXByZXNlbnRhdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGludmFsaWQgaGV4YWRlY2ltYWwgZGlnaXQgaXMgZm91bmQsIG9yIHRoZSBpbnB1dAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250YWlucyBhbiBvZGQgbnVtYmVyIG9mIGhleGFkZWNpbWFsIGRpZ2l0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGRlY29kZShTdHJpbmcgZGlnaXRzKSB7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRzLmxlbmd0aCgpOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGNoYXIgYzEgPSBkaWdpdHMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKChpICsgMSkgPj0gZGlnaXRzLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICgpOy8vRVJST1JfT0REX05VTUJFUl9PRl9ESUdJVFMpOwotICAgICAgICAgICAgY2hhciBjMiA9IGRpZ2l0cy5jaGFyQXQoaSArIDEpOwotICAgICAgICAgICAgYnl0ZSBiID0gMDsKLSAgICAgICAgICAgIGlmICgoYzEgPj0gJzAnKSAmJiAoYzEgPD0gJzknKSkKLSAgICAgICAgICAgICAgICBiICs9ICgoYzEgLSAnMCcpICogMTYpOwotICAgICAgICAgICAgZWxzZSBpZiAoKGMxID49ICdhJykgJiYgKGMxIDw9ICdmJykpCi0gICAgICAgICAgICAgICAgYiArPSAoKGMxIC0gJ2EnICsgMTApICogMTYpOwotICAgICAgICAgICAgZWxzZSBpZiAoKGMxID49ICdBJykgJiYgKGMxIDw9ICdGJykpCi0gICAgICAgICAgICAgICAgYiArPSAoKGMxIC0gJ0EnICsgMTApICogMTYpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICgpOy8vRVJST1JfQkFEX0NIQVJBQ1RFUl9JTl9IRVhfU1RSSU5HKTsKLSAgICAgICAgICAgIGlmICgoYzIgPj0gJzAnKSAmJiAoYzIgPD0gJzknKSkKLSAgICAgICAgICAgICAgICBiICs9IChjMiAtICcwJyk7Ci0gICAgICAgICAgICBlbHNlIGlmICgoYzIgPj0gJ2EnKSAmJiAoYzIgPD0gJ2YnKSkKLSAgICAgICAgICAgICAgICBiICs9IChjMiAtICdhJyArIDEwKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKChjMiA+PSAnQScpICYmIChjMiA8PSAnRicpKQotICAgICAgICAgICAgICAgIGIgKz0gKGMyIC0gJ0EnICsgMTApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICgpOy8vRVJST1JfQkFEX0NIQVJBQ1RFUl9JTl9IRVhfU1RSSU5HKTsKLSAgICAgICAgICAgIGJhb3Mud3JpdGUoYik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChiYW9zLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGEgYnl0ZSBhcnJheSBpbnRvIGEgcHJpbnRhYmxlIGZvcm1hdCBjb250YWluaW5nIGEgU3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0Ci0gICAgICogY2hhcmFjdGVycyAodHdvIHBlciBieXRlKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBieXRlcyBCeXRlIGFycmF5IHJlcHJlc2VudGF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKGJ5dGUgYnl0ZXNbXSkgewotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoYnl0ZXMubGVuZ3RoICogMik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChjb252ZXJ0RGlnaXQoYnl0ZXNbaV0gPj4gNCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGNvbnZlcnREaWdpdChieXRlc1tpXSAmIDB4MGYpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCA0IGhleCBkaWdpdHMgdG8gYW4gaW50LCBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29udmVydGVkIGJ5dGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGhleCBCeXRlIGFycmF5IGNvbnRhaW5pbmcgZXhhY3RseSBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFuIGludmFsaWQgaGV4YWRlY2ltYWwgZGlnaXQgaXMgaW5jbHVkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0MkludChieXRlW10gaGV4KSB7Ci0gICAgICAgIC8vIENvZGUgZnJvbSBBanAxMSwgZnJvbSBBcGFjaGUncyBKU2VydgotCi0gICAgICAgIC8vIGFzc2VydCBiLmxlbmd0aD09NAotICAgICAgICAvLyBhc3NlcnQgdmFsaWQgZGF0YQotICAgICAgICBpbnQgbGVuOwotICAgICAgICBpZiAoaGV4Lmxlbmd0aCA8IDQpIHJldHVybiAwOwotICAgICAgICBpZiAoREVDW2hleFswXV0gPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOy8vRVJST1JfQkFEX0NIQVJBQ1RFUl9JTl9IRVhfU1RSSU5HKTsKLSAgICAgICAgbGVuID0gREVDW2hleFswXV07Ci0gICAgICAgIGxlbiA9IGxlbiA8PCA0OwotICAgICAgICBpZiAoREVDW2hleFsxXV0gPCAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOy8vRVJST1JfQkFEX0NIQVJBQ1RFUl9JTl9IRVhfU1RSSU5HKTsKLSAgICAgICAgbGVuICs9IERFQ1toZXhbMV1dOwotICAgICAgICBsZW4gPSBsZW4gPDwgNDsKLSAgICAgICAgaWYgKERFQ1toZXhbMl1dIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsvL0VSUk9SX0JBRF9DSEFSQUNURVJfSU5fSEVYX1NUUklORyk7Ci0gICAgICAgIGxlbiArPSBERUNbaGV4WzJdXTsKLSAgICAgICAgbGVuID0gbGVuIDw8IDQ7Ci0gICAgICAgIGlmIChERUNbaGV4WzNdXSA8IDApCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ly9FUlJPUl9CQURfQ0hBUkFDVEVSX0lOX0hFWF9TVFJJTkcpOwotICAgICAgICBsZW4gKz0gREVDW2hleFszXV07Ci0gICAgICAgIHJldHVybiBsZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogW1ByaXZhdGVdIENvbnZlcnQgdGhlIHNwZWNpZmllZCB2YWx1ZSAoMCAuLiAxNSkgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaGV4YWRlY2ltYWwgZGlnaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gYmUgY29udmVydGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2hhciBjb252ZXJ0RGlnaXQoaW50IHZhbHVlKSB7Ci0KLSAgICAgICAgdmFsdWUgJj0gMHgwZjsKLSAgICAgICAgaWYgKHZhbHVlID49IDEwKQotICAgICAgICAgICAgcmV0dXJuICgoY2hhcikodmFsdWUgLSAxMCArICdhJykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gKChjaGFyKSh2YWx1ZSArICcwJykpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lEUmVmLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSURSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjNWI2OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvSURSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIElEUmVmCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jSURSRUYiPlhNTCBTY2hlbWEgMy4zLjEwIElEUkVGUzwvYT4KLSAqLwotcHVibGljIGNsYXNzIElEUmVmIGV4dGVuZHMgTkNOYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4MjE4MzUwNjU5Mzk4Njg1NzZMOwotCi0gICAgcHVibGljIElEUmVmKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIElEUmVmCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIElEUmVmKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoc3RWYWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lEUmVmcy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lEUmVmcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjg2YzFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9JRFJlZnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBJRFJlZnMKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRFJFRlMiPlhNTCBTY2hlbWEgMy4zLjEwIElEUkVGUzwvYT4KLSAqLwotcHVibGljIGNsYXNzIElEUmVmcyBleHRlbmRzIE5DTmFtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1Mzk0MDk3Nzk4MzYxMDc1OTAyTDsKLQotICAgIHByaXZhdGUgSURSZWZbXSBpZHJlZnM7Ci0KLSAgICBwdWJsaWMgSURSZWZzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIElEUmVmcwotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBJRFJlZnMoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShzdFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RWYWx1ZSkgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdFZhbHVlKTsKLSAgICAgICAgaW50IGNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGlkcmVmcyA9IG5ldyBJRFJlZltjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWRyZWZzW2ldID0gbmV3IElEUmVmKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkcmVmcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSURSZWYgcmVmID0gaWRyZWZzW2ldOwotICAgICAgICAgICAgaWYgKGkgPiAwKSBidWYuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHJlZi50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSURSRUZzIGNhbiBiZSBlcXVhbCB3aXRob3V0IGhhdmluZyBpZGVudGljYWwgb3JkZXJpbmcgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCBhIHNldCBvZgotICAgICAqIHJlZmVyZW5jZXMuICBIZW5jZSB3ZSBoYXZlIHRvIGNvbXBhcmUgdmFsdWVzIGhlcmUgYXMgYSBzZXQsIG5vdCBhIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWUKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgLy8gc3VjY2VlZCBxdWlja2x5LCB3aGVuIHBvc3NpYmxlCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElEUmVmcykgewotICAgICAgICAgICAgSURSZWZzIHRoYXQgPSAoSURSZWZzKW9iamVjdDsKLSAgICAgICAgICAgIGlmICh0aGlzLmlkcmVmcy5sZW5ndGggPT0gdGhhdC5pZHJlZnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgU2V0IG91clNldCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QodGhpcy5pZHJlZnMpKTsKLSAgICAgICAgICAgICAgICBTZXQgdGhlaXJTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHRoYXQuaWRyZWZzKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG91clNldC5lcXVhbHModGhlaXJTZXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGhhc2hjb2RlcyBvZiB0aGUgdW5kZXJseWluZyBpZHJlZnMsIGFuIG9wZXJhdGlvbiB3aGljaCBpcyBub3QKLSAgICAgKiBzZW5zaXRpdmUgdG8gb3JkZXJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRyZWZzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBoYXNoICs9IGlkcmVmc1tpXS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9JZC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWMzZTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL0lkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBJRCBUaGUgYmFzZSB0eXBlIG9mIElkIGlzIE5DTmFtZS4KLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNJRCI+WE1MIFNjaGVtYSAzLjMuODwvYT4KLSAqLwotcHVibGljIGNsYXNzIElkIGV4dGVuZHMgTkNOYW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04NDQyNDM4MDgzMjE0MjExNDM3TDsKLQotICAgIHB1YmxpYyBJZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgSWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIElkKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVjYXN0IG5vcm1hbGl6ZWRTdHJpbmcgZXhjZXB0aW9uIGFzIHRva2VuIGV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRJZFR5cGUwMCIpICsgImRhdGE9WyIgKwotICAgICAgICAgICAgLy9zdFZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RWYWx1ZSBTdHJpbmcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbnZhbGlkIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFJZC5pc1ZhbGlkKHN0VmFsdWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkSWRUeXBlMDAiKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YT1bIiArIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICBtX3ZhbHVlID0gc3RWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBTYW1lIHZhbGlkYXRpb24gYXMgTkNOYW1lIGZvciB0aGUgdGltZSBiZWluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBOQ05hbWUuaXNWYWxpZChzdFZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTGFuZ3VhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9MYW5ndWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmZiMWIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9MYW5ndWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIFhTRCBkYXRhIHR5cGUgbGFuZ3VhZ2UgbGFuZ3VhZ2UgcmVwcmVzZW50cyBuYXR1cmFsIGxhbmd1YWdlCi0gKiBpZGVudGlmaWVycyBhcyBkZWZpbmVkIGJ5IFtSRkMgMTc2Nl0uIFRoZSB2YWx1ZSBzcGFjZSBvZiBsYW5ndWFnZSBpcyB0aGUgc2V0IG9mIGFsbCBzdHJpbmdzIHRoYXQKLSAqIGFyZSB2YWxpZCBsYW5ndWFnZSBpZGVudGlmaWVycyBhcyBkZWZpbmVkIGluIHRoZSBsYW5ndWFnZSBpZGVudGlmaWNhdGlvbiBzZWN0aW9uIG9mIFtYTUwgMS4wCi0gKiAoU2Vjb25kIEVkaXRpb24pXS4gVGhlIGxleGljYWwgc3BhY2Ugb2YgbGFuZ3VhZ2UgaXMgdGhlIHNldCBvZiBhbGwgc3RyaW5ncyB0aGF0IGFyZSB2YWxpZAotICogbGFuZ3VhZ2UgaWRlbnRpZmllcnMgYXMgZGVmaW5lZCBpbiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmljYXRpb24gc2VjdGlvbiBvZiBbWE1MIDEuMCAoU2Vjb25kCi0gKiBFZGl0aW9uKV0uIFRoZSBiYXNlIHR5cGUgb2YgbGFuZ3VhZ2UgaXMgdG9rZW4uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbGFuZ3VhZ2UiPlhNTCBTY2hlbWEgMy4zLjM8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBMYW5ndWFnZSBleHRlbmRzIFRva2VuIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00MTA1MzIwMjkzMDkwMDg3OTU5TDsKLQotICAgIHB1YmxpYyBMYW5ndWFnZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBMYW5ndWFnZQotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBMYW5ndWFnZShTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShzdFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJlY2FzdCBub3JtYWxpemVkU3RyaW5nIGV4Y2VwdGlvbiBhcyB0b2tlbiBleGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRMYW5ndWFnZTAwIikgKwotImRhdGE9WyIgKyBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24uIExhbmd1YWdlLVRhZyA9IFByaW1hcnktdGFnICooICItIiBTdWJ0YWcgKQotICAgICAqIFByaW1hcnktdGFnID0gMSo4QUxQSEEgU3VidGFnID0gMSo4QUxQSEEgVE9ETwotICAgICAqCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxNzY2LnR4dCI+UkZDMTc2NjwvYT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RWYWx1ZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTW9udGguamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Nb250aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQ0OGI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Nb250aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYSB0eXBlIGdNb250aAotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dNb250aCI+WE1MIFNjaGVtYSAzLjIuMTQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNb250aCBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NDY5MjY1ODAyODA3MjYyMzQ3TDsKLQotICAgIGludCBtb250aDsKLSAgICBTdHJpbmcgdGltZXpvbmU7Ci0KLSAgICAvKiogQ29uc3RydWN0cyBhIE1vbnRoIHdpdGggdGhlIGdpdmVuIHZhbHVlcyBObyB0aW1lem9uZSBpcyBzcGVjaWZpZWQgKi8KLSAgICBwdWJsaWMgTW9udGgoaW50IG1vbnRoKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobW9udGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBNb250aCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXMsIGluY2x1ZGluZyBhIHRpbWV6b25lIHN0cmluZyBUaGUgdGltZXpvbmUgaXMKLSAgICAgKiB2YWxpZGF0ZWQgYnV0IG5vdCB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyBNb250aChpbnQgbW9udGgsIFN0cmluZyB0aW1lem9uZSkKLSAgICAgICAgICAgIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShtb250aCwgdGltZXpvbmUpOwotICAgIH0KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBNb250aCBmcm9tIGEgU3RyaW5nIGluIHRoZSBmb3JtYXQgLS1NTS0tW3RpbWV6b25lXSAqLwotICAgIHB1YmxpYyBNb250aChTdHJpbmcgc291cmNlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGgoKSA8ICg2KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTW9udGgwMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb3VyY2UuY2hhckF0KDApICE9ICctJyB8fAotICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFyQXQoMSkgIT0gJy0nIHx8Ci0gICAgICAgICAgICAgICAgc291cmNlLmNoYXJBdCg0KSAhPSAnLScgfHwKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckF0KDUpICE9ICctJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aDAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFsdWUoSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDIsIDQpKSwKLSAgICAgICAgICAgICAgICAgc291cmNlLnN1YnN0cmluZyg2KSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNb250aCgpIHsKLSAgICAgICAgcmV0dXJuIG1vbnRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vbnRoKGludCBtb250aCkgewotICAgICAgICAvLyB2YWxpZGF0ZSBtb250aAotICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE1vbnRoMDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZXpvbmUoKSB7Ci0gICAgICAgIHJldHVybiB0aW1lem9uZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lem9uZShTdHJpbmcgdGltZXpvbmUpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgdGltZXpvbmUKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwgJiYgdGltZXpvbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBGb3JtYXQgWysvLV1ISDpNTQotICAgICAgICAgICAgaWYgKHRpbWV6b25lLmNoYXJBdCgwKSA9PSAnKycgfHwgKHRpbWV6b25lLmNoYXJBdCgwKSA9PSAnLScpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWV6b25lLmxlbmd0aCgpICE9IDYgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUuY2hhckF0KDMpICE9ICc6JyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg0KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoNSkpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aW1lem9uZS5lcXVhbHMoIloiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB3ZSBnb3QgdGhpcyBmYXIsIGl0cyBnb29kCi0gICAgICAgICAgICB0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgbW9udGgsIFN0cmluZyB0aW1lem9uZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldE1vbnRoKG1vbnRoKTsKLSAgICAgICAgc2V0VGltZXpvbmUodGltZXpvbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGludCBtb250aCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldE1vbnRoKG1vbnRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyB1c2UgTnVtYmVyRm9ybWF0IHRvIGVuc3VyZSBsZWFkaW5nIHplcm9zCi0gICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgICAgICBuZi5zZXRHcm91cGluZ1VzZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIG1vbnRoCi0gICAgICAgIG5mLnNldE1pbmltdW1JbnRlZ2VyRGlnaXRzKDIpOwotICAgICAgICBTdHJpbmcgcyA9ICItLSIgKyBuZi5mb3JtYXQobW9udGgpICsgIi0tIjsKLQotICAgICAgICAvLyB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgcyA9IHMgKyB0aW1lem9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBNb250aCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgTW9udGggb3RoZXIgPSAoTW9udGgpb2JqOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxzID0gKHRoaXMubW9udGggPT0gb3RoZXIubW9udGgpOwotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIHRpbWV6b25lLmVxdWFscyhvdGhlci50aW1lem9uZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIG1vbnRoIFhPUmVkIHdpdGggdGhlIGhhc2hDb2RlIG9mIHRpbWV6b25lIGlmZiBvbmUgaXMgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsID09IHRpbWV6b25lID8gbW9udGggOiBtb250aCBeIHRpbWV6b25lLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL01vbnRoRGF5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTW9udGhEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZDliOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTW9udGhEYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgdHlwZSBnTW9udGhEYXkKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNnTW9udGhEYXkiPlhNTCBTY2hlbWEgMy4yLjEyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTW9udGhEYXkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzQ1MTg5NjA5ODI1MjQ5MzE4TDsKLQotICAgIGludCBtb250aDsKLSAgICBpbnQgZGF5OwotICAgIFN0cmluZyB0aW1lem9uZTsKLQotICAgIC8qKiBDb25zdHJ1Y3RzIGEgTW9udGhEYXkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzIE5vIHRpbWV6b25lIGlzIHNwZWNpZmllZCAqLwotICAgIHB1YmxpYyBNb250aERheShpbnQgbW9udGgsIGludCBkYXkpCi0gICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobW9udGgsIGRheSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIE1vbnRoRGF5IHdpdGggdGhlIGdpdmVuIHZhbHVlcywgaW5jbHVkaW5nIGEgdGltZXpvbmUgc3RyaW5nIFRoZSB0aW1lem9uZSBpcwotICAgICAqIHZhbGlkYXRlZCBidXQgbm90IHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIE1vbnRoRGF5KGludCBtb250aCwgaW50IGRheSwgU3RyaW5nIHRpbWV6b25lKQotICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKG1vbnRoLCBkYXksIHRpbWV6b25lKTsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RydWN0IGEgTW9udGhEYXkgZnJvbSBhIFN0cmluZyBpbiB0aGUgZm9ybWF0IC0tTU0tRERbdGltZXpvbmVdICovCi0gICAgcHVibGljIE1vbnRoRGF5KFN0cmluZyBzb3VyY2UpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpIDwgNikgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aERheTAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5jaGFyQXQoMCkgIT0gJy0nIHx8Ci0gICAgICAgICAgICAgICAgc291cmNlLmNoYXJBdCgxKSAhPSAnLScgfHwKLSAgICAgICAgICAgICAgICBzb3VyY2UuY2hhckF0KDQpICE9ICctJykgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aERheTAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0VmFsdWUoSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDIsIDQpKSwKLSAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDUsIDcpKSwKLSAgICAgICAgICAgICAgICAgc291cmNlLnN1YnN0cmluZyg3KSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRNb250aCgpIHsKLSAgICAgICAgcmV0dXJuIG1vbnRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vbnRoKGludCBtb250aCkgewotICAgICAgICAvLyB2YWxpZGF0ZSBtb250aAotICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkTW9udGhEYXkwMCIpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREYXkoKSB7Ci0gICAgICAgIHJldHVybiBkYXk7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgZGF5IE5PVEU6IGlmIHRoZSBtb250aCBpc24ndCBzZXQgeWV0LCB0aGUgZGF5IGlzbid0IHZhbGlkYXRlZCAqLwotICAgIHB1YmxpYyB2b2lkIHNldERheShpbnQgZGF5KSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIGRheQotICAgICAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiAzMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aERheTAwIikpOwotICAgICAgICB9Ci0gICAgICAgIC8vIDMwIGRheXMgaGFzIFNlcHRlbWJlci4uLiBBbGwgdGhlIHJlc3QgaGF2ZSAzMSAoZXhjZXB0IEZlYiEpCi0gICAgICAgIC8vIE5PVEU6IGlmIG1vbnRoIGlzbid0IHNldCwgd2UgZG9uJ3QgdmFsaWRhdGUgZGF5LgotICAgICAgICBpZiAoKG1vbnRoID09IDIgJiYgZGF5ID4gMjkpIHx8Ci0gICAgICAgICAgICAgICAgKChtb250aCA9PSA5IHx8IG1vbnRoID09IDQgfHwgbW9udGggPT0gNiB8fCBtb250aCA9PSAxMSkgJiYgZGF5ID4gMzApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRNb250aERheTAwIikpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZGF5ID0gZGF5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZXpvbmUoKSB7Ci0gICAgICAgIHJldHVybiB0aW1lem9uZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lem9uZShTdHJpbmcgdGltZXpvbmUpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgdGltZXpvbmUKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwgJiYgdGltZXpvbmUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBGb3JtYXQgWysvLV1ISDpNTQotICAgICAgICAgICAgaWYgKHRpbWV6b25lLmNoYXJBdCgwKSA9PSAnKycgfHwgKHRpbWV6b25lLmNoYXJBdCgwKSA9PSAnLScpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWV6b25lLmxlbmd0aCgpICE9IDYgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUuY2hhckF0KDMpICE9ICc6JyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg0KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoNSkpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZXpvbmUwMCIpKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICghdGltZXpvbmUuZXF1YWxzKCJaIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgd2UgZ290IHRoaXMgZmFyLCBpdHMgZ29vZAotICAgICAgICAgICAgdGhpcy50aW1lem9uZSA9IHRpbWV6b25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IG1vbnRoLCBpbnQgZGF5LCBTdHJpbmcgdGltZXpvbmUpCi0gICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0TW9udGgobW9udGgpOwotICAgICAgICBzZXREYXkoZGF5KTsKLSAgICAgICAgc2V0VGltZXpvbmUodGltZXpvbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGludCBtb250aCwgaW50IGRheSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldE1vbnRoKG1vbnRoKTsKLSAgICAgICAgc2V0RGF5KGRheSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gdXNlIE51bWJlckZvcm1hdCB0byBlbnN1cmUgbGVhZGluZyB6ZXJvcwotICAgICAgICBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgbmYuc2V0R3JvdXBpbmdVc2VkKGZhbHNlKTsKLQotICAgICAgICAvLyBtb250aCAmIERheTogLS1NTS1ERAotICAgICAgICBuZi5zZXRNaW5pbXVtSW50ZWdlckRpZ2l0cygyKTsKLSAgICAgICAgU3RyaW5nIHMgPSAiLS0iICsgbmYuZm9ybWF0KG1vbnRoKSArICItIiArIG5mLmZvcm1hdChkYXkpOwotCi0gICAgICAgIC8vIHRpbWV6b25lCi0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzID0gcyArIHRpbWV6b25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1vbnRoRGF5KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBNb250aERheSBvdGhlciA9IChNb250aERheSlvYmo7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgYm9vbGVhbiBlcXVhbHMgPSAodGhpcy5tb250aCA9PSBvdGhlci5tb250aCAmJiB0aGlzLmRheSA9PSBvdGhlci5kYXkpOwotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgZXF1YWxzID0gZXF1YWxzICYmIHRpbWV6b25lLmVxdWFscyhvdGhlci50aW1lem9uZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIChtb250aCArIGRheSkgWE9SZWQgd2l0aCB0aGUgaGFzaENvZGUgb2YgdGltZXpvbmUgaWZmIG9uZSBpcyBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGwgPT0gdGltZXpvbmUKLSAgICAgICAgICAgICAgICA/IChtb250aCArIGRheSkKLSAgICAgICAgICAgICAgICA6IChtb250aCArIGRheSkgXiB0aW1lem9uZS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OQ05hbWUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OQ05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU1NWIyNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTkNOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MQ2hhcjsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIE5DTmFtZSBOQ05hbWUgcmVwcmVzZW50cyBYTUwgIm5vbi1jb2xvbml6ZWQiIE5hbWVzIFRoZQotICogYmFzZSB0eXBlIG9mIE5DTmFtZSBpcyBOYW1lLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI05DTmFtZSI+WE1MIFNjaGVtYSAzLjMuNzwvYT4KLSAqIEBzZWUgPEEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteG1sLW5hbWVzLTE5OTkwMTE0LyNOVC1OQ05hbWUiPk5DTmFtZSBQcm9kdWN0aW9uPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTkNOYW1lIGV4dGVuZHMgTmFtZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4NTczNDUxNjI4Mjc2ODk4Mjk3TDsKLQotICAgIHB1YmxpYyBOQ05hbWUoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgTkNOYW1lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIE5DTmFtZShTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShzdFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJlY2FzdCBub3JtYWxpemVkU3RyaW5nIGV4Y2VwdGlvbiBhcyB0b2tlbiBleGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE5DTmFtZVR5cGUwMCIpICsKLSAgICAgICAgICAgICAgICAgICAgImRhdGE9WyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGVzIHRoZSBkYXRhIGFuZCBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdFZhbHVlIFN0cmluZyB2YWx1ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGludmFsaWQgZm9ybWF0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoIU5DTmFtZS5pc1ZhbGlkKHN0VmFsdWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWROQ05hbWVUeXBlMDAiKSArCi0gICAgICAgICAgICAgICAgICAgICIgZGF0YT1bIiArIHN0VmFsdWUgKyAiXSIpOwotICAgICAgICBtX3ZhbHVlID0gc3RWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24KLSAgICAgKiA8cC8+Ci0gICAgICogTkNOYW1lIDo6PSAgKExldHRlciB8ICdfJykgKE5DTmFtZUNoYXIpKiBOQ05hbWVDaGFyIDo6PSAgTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfAotICAgICAqIENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdFZhbHVlKSB7Ci0gICAgICAgIGludCBzY2FuOwotICAgICAgICBib29sZWFuIGJWYWxpZCA9IHRydWU7Ci0KLSAgICAgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IHN0VmFsdWUubGVuZ3RoKCk7IHNjYW4rKykgewotICAgICAgICAgICAgaWYgKHNjYW4gPT0gMCkKLSAgICAgICAgICAgICAgICBiVmFsaWQgPSBYTUxDaGFyLmlzTkNOYW1lU3RhcnQoc3RWYWx1ZS5jaGFyQXQoc2NhbikpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJWYWxpZCA9IFhNTENoYXIuaXNOQ05hbWUoc3RWYWx1ZS5jaGFyQXQoc2NhbikpOwotICAgICAgICAgICAgaWYgKCFiVmFsaWQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJWYWxpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTk1Ub2tlbi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05NVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYmFlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTk1Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTENoYXI7Ci0KLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBOTVRva2VuCi0gKiA8cC8+Ci0gKiBOTVRPS0VOIHJlcHJlc2VudHMgdGhlIE5NVE9LRU4gYXR0cmlidXRlIHR5cGUgZnJvbSBbWE1MIDEuMChTZWNvbmQgRWRpdGlvbildLiBUaGUgdmFsdWUgc3BhY2Ugb2YKLSAqIE5NVE9LRU4gaXMgdGhlIHNldCBvZiB0b2tlbnMgdGhhdCBtYXRjaCB0aGUgTm10b2tlbiBwcm9kdWN0aW9uIGluIFtYTUwgMS4wIChTZWNvbmQgRWRpdGlvbildLiBUaGUKLSAqIGJhc2UgdHlwZSBvZiBOTVRPS0VOIGlzIHRva2VuLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25tdG9rZW4iPlhNTCBTY2hlbWEgMy4zLjQ8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOTVRva2VuIGV4dGVuZHMgVG9rZW4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTEzMTk3NDEwMDI3MzMxNzQzMjlMOwotCi0gICAgcHVibGljIE5NVG9rZW4oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgTk1Ub2tlbgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBOTVRva2VuKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVjYXN0IG5vcm1hbGl6ZWRTdHJpbmcgZXhjZXB0aW9uIGFzIHRva2VuIGV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgLy8gIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE5tdG9rZW4wMCIpICsgImRhdGE9WyIgKwotICAgICAgICAgICAgICAgICAgICBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbiBObXRva2VuICAgIDo6PSAgICAoTmFtZUNoYXIpKyBOYW1lQ2hhciAgICA6Oj0KLSAgICAgKiBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBzdFZhbHVlKSB7Ci0gICAgICAgIGludCBzY2FuOwotCi0gICAgICAgIGZvciAoc2NhbiA9IDA7IHNjYW4gPCBzdFZhbHVlLmxlbmd0aCgpOyBzY2FuKyspIHsKLSAgICAgICAgICAgIGlmICghWE1MQ2hhci5pc05hbWUoc3RWYWx1ZS5jaGFyQXQoc2NhbikpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9OTVRva2Vucy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05NVG9rZW5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzNjODkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05NVG9rZW5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBOTVRva2VucyAqLwotcHVibGljIGNsYXNzIE5NVG9rZW5zIGV4dGVuZHMgTkNOYW1lIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjQzNTg1NDgyNDIxNjE4MTE2NUw7Ci0gICAgcHJpdmF0ZSBOTVRva2VuW10gdG9rZW5zOwotCi0gICAgcHVibGljIE5NVG9rZW5zKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIE5NVG9rZW5zCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIE5NVG9rZW5zKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUoc3RWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHN0VmFsdWUpIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RWYWx1ZSk7Ci0gICAgICAgIGludCBjb3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotICAgICAgICB0b2tlbnMgPSBuZXcgTk1Ub2tlbltjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgdG9rZW5zW2ldID0gbmV3IE5NVG9rZW4odG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBOTVRva2VuIHRva2VuID0gdG9rZW5zW2ldOwotICAgICAgICAgICAgaWYgKGkgPiAwKSBidWYuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKHRva2VuLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOTVRva2VucyBjYW4gYmUgZXF1YWwgd2l0aG91dCBoYXZpbmcgaWRlbnRpY2FsIG9yZGVyaW5nIGJlY2F1c2UgdGhleSByZXByZXNlbnQgYSBzZXQgb2YKLSAgICAgKiByZWZlcmVuY2VzLiAgSGVuY2Ugd2UgaGF2ZSB0byBjb21wYXJlIHZhbHVlcyBoZXJlIGFzIGEgc2V0LCBub3QgYSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlCi0gICAgICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgIC8vIHN1Y2NlZWQgcXVpY2tseSwgd2hlbiBwb3NzaWJsZQotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOTVRva2VucykgewotICAgICAgICAgICAgTk1Ub2tlbnMgdGhhdCA9IChOTVRva2VucylvYmplY3Q7Ci0gICAgICAgICAgICBpZiAodGhpcy50b2tlbnMubGVuZ3RoID09IHRoYXQudG9rZW5zLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIFNldCBvdXJTZXQgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KHRoaXMudG9rZW5zKSk7Ci0gICAgICAgICAgICAgICAgU2V0IHRoZWlyU2V0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdCh0aGF0LnRva2VucykpOwotICAgICAgICAgICAgICAgIHJldHVybiBvdXJTZXQuZXF1YWxzKHRoZWlyU2V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBoYXNoY29kZXMgb2YgdGhlIHVuZGVybHlpbmcgdG9rZW5zLCBhbiBvcGVyYXRpb24gd2hpY2ggaXMgbm90Ci0gICAgICogc2Vuc2l0aXZlIHRvIG9yZGVyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGhhc2ggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaGFzaCArPSB0b2tlbnNbaV0uaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTmFtZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2ZjkzYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MQ2hhcjsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgWFNEIGRhdGEgdHlwZSBOYW1lIE5hbWUgcmVwcmVzZW50cyBYTUwgTmFtZXMuIFRoZSB2YWx1ZSBzcGFjZSBvZiBOYW1lCi0gKiBpcyB0aGUgc2V0IG9mIGFsbCBzdHJpbmdzIHdoaWNoIG1hdGNoIHRoZSBOYW1lIHByb2R1Y3Rpb24gb2YgW1hNTCAxLjAgKFNlY29uZCBFZGl0aW9uKV0uIFRoZSBiYXNlCi0gKiB0eXBlIG9mIE5hbWUgaXMgdG9rZW4uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jTmFtZSI+WE1MIFNjaGVtYSAzLjMuNjwvYT4KLSAqLwotcHVibGljIGNsYXNzIE5hbWUgZXh0ZW5kcyBUb2tlbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtODM1NDU5NDMwMTczNzM1ODQ0MUw7Ci0KLSAgICBwdWJsaWMgTmFtZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBOYW1lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIE5hbWUoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0VmFsdWUoc3RWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyByZWNhc3Qgbm9ybWFsaXplZFN0cmluZyBleGNlcHRpb24gYXMgdG9rZW4gZXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgdmFsdWUgZm9yIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICJkYXRhPVsiICsgc3RWYWx1ZSArICJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZXMgdGhlIGRhdGEgYW5kIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0VmFsdWUgU3RyaW5nIHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaW52YWxpZCBmb3JtYXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghTmFtZS5pc1ZhbGlkKHN0VmFsdWUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHZhbHVlIGZvciBuYW1lICIgKwotICAgICAgICAgICAgICAgICAgICAiIGRhdGE9WyIgKyBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgbV92YWx1ZSA9IHN0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uIE5hbWUgICAgOjo9ICAgIChMZXR0ZXIgfCAnXycgfCAnOicpICgKLSAgICAgKiBOYW1lQ2hhcikqIE5hbWVDaGFyICAgIDo6PSAgICAgTGV0dGVyIHwgRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwKLSAgICAgKiBFeHRlbmRlcgotICAgICAqLwotICAgIC8vdG9kbyAtIEZpeCB0aGlzCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0VmFsdWUpIHsKLSAgICAgICAgaW50IHNjYW47Ci0gICAgICAgIGJvb2xlYW4gYlZhbGlkID0gdHJ1ZTsKLQotICAgICAgICBmb3IgKHNjYW4gPSAwOyBzY2FuIDwgc3RWYWx1ZS5sZW5ndGgoKTsgc2NhbisrKSB7Ci0gICAgICAgICAgICBpZiAoc2NhbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYlZhbGlkID0gWE1MQ2hhci5pc05hbWVTdGFydChzdFZhbHVlLmNoYXJBdChzY2FuKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJWYWxpZCA9IFhNTENoYXIuaXNOYW1lKHN0VmFsdWUuY2hhckF0KHNjYW4pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYlZhbGlkKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJWYWxpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTmVnYXRpdmVJbnRlZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTmVnYXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGZkMzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05lZ2F0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgcHJpbWl0aXZlIFhTRCBkYXRhIHR5cGUgbmVnYXRpdmVpbnRlZ2VyCi0gKiA8cC8+Ci0gKiBuZWdhdGl2ZUludGVnZXIgaXMgZGVyaXZlZCBmcm9tIG5vblBvc2l0aXZlSW50ZWdlciBieSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBtYXhJbmNsdXNpdmUgdG8gYmUgLTEuCi0gKiBUaGlzIHJlc3VsdHMgaW4gdGhlIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBjb25jZXB0IG9mIHRoZSBuZWdhdGl2ZSBpbnRlZ2Vycy4gVGhlIHZhbHVlIHNwYWNlIG9mCi0gKiBuZWdhdGl2ZUludGVnZXIgaXMgdGhlIGluZmluaXRlIHNldCB7Li4uLC0yLC0xfS4gVGhlIGJhc2UgdHlwZSBvZiBuZWdhdGl2ZUludGVnZXIgaXMKLSAqIG5vblBvc2l0aXZlSW50ZWdlci4KLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNuZWdhdGl2ZUludGVnZXIiPlhNTCBTY2hlbWEgMy4zLjE1PC9hPgotICovCi1wdWJsaWMgY2xhc3MgTmVnYXRpdmVJbnRlZ2VyIGV4dGVuZHMgTm9uUG9zaXRpdmVJbnRlZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMjk1OTI4NzE1NjkzNjM5NDI3TDsKLQotICAgIHB1YmxpYyBOZWdhdGl2ZUludGVnZXIoYnl0ZVtdIHZhbCkgewotICAgICAgICBzdXBlcih2YWwpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTmVnYXRpdmVJbnRlZ2VyKGludCBzaWdudW0sIGJ5dGVbXSBtYWduaXR1ZGUpIHsKLSAgICAgICAgc3VwZXIoc2lnbnVtLCBtYWduaXR1ZGUpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTmVnYXRpdmVJbnRlZ2VyKGludCBiaXRMZW5ndGgsIGludCBjZXJ0YWludHksIFJhbmRvbSBybmQpIHsKLSAgICAgICAgc3VwZXIoYml0TGVuZ3RoLCBjZXJ0YWludHksIHJuZCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOZWdhdGl2ZUludGVnZXIoaW50IG51bUJpdHMsIFJhbmRvbSBybmQpIHsKLSAgICAgICAgc3VwZXIobnVtQml0cywgcm5kKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5lZ2F0aXZlSW50ZWdlcihTdHJpbmcgdmFsKSB7Ci0gICAgICAgIHN1cGVyKHZhbCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmVnYXRpdmVJbnRlZ2VyKFN0cmluZyB2YWwsIGludCByYWRpeCkgewotICAgICAgICBzdXBlcih2YWwsIHJhZGl4KTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgLyoqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbiAqLwotICAgIHByaXZhdGUgQmlnSW50ZWdlciB6ZXJvID0gbmV3IEJpZ0ludGVnZXIoIjAiKTsKLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1ZhbGlkaXR5KCkgewotICAgICAgICBpZiAoY29tcGFyZVRvKHplcm8pID49IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZG5lZ0ludDAwIikgKwotICAgICAgICAgICAgICAgICAgICAiOiAgIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfSAvLyBjaGVja1ZhbGlkaXR5Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrLWFyb3VuZCBmb3IgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNzgzNzAuaHRtbAotICAgICAqCi0gICAgICogQHJldHVybiBCaWdJbnRlZ2VyUmVwCi0gICAgICogQHRocm93cyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlclJlcCh0b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJSZXAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEyMDk2MTg0ODcwMzE0MDQxMTBMOwotICAgICAgICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKLQotICAgICAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlclJlcChieXRlW10gYXJyYXkpIHsKLSAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOZWdhdGl2ZUludGVnZXIoYXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotfSAvLyBjbGFzcyBOb25OZWdhdGl2ZUludGVnZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob25OZWdhdGl2ZUludGVnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob25OZWdhdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzZjVjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBub25OZWdhdGl2ZUludGVnZXIKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNub25OZWdhdGl2ZUludGVnZXIiPlhNTCBTY2hlbWEgMy4zLjIwPC9hPgotICovCi1wdWJsaWMgY2xhc3MgTm9uTmVnYXRpdmVJbnRlZ2VyIGV4dGVuZHMgQmlnSW50ZWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDg0NTc3ODYwMzUxNDA2MDU0TDsKLQotICAgIHB1YmxpYyBOb25OZWdhdGl2ZUludGVnZXIoYnl0ZVtdIHZhbCkgewotICAgICAgICBzdXBlcih2YWwpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTm9uTmVnYXRpdmVJbnRlZ2VyKGludCBzaWdudW0sIGJ5dGVbXSBtYWduaXR1ZGUpIHsKLSAgICAgICAgc3VwZXIoc2lnbnVtLCBtYWduaXR1ZGUpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTm9uTmVnYXRpdmVJbnRlZ2VyKGludCBiaXRMZW5ndGgsIGludCBjZXJ0YWludHksIFJhbmRvbSBybmQpIHsKLSAgICAgICAgc3VwZXIoYml0TGVuZ3RoLCBjZXJ0YWludHksIHJuZCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOb25OZWdhdGl2ZUludGVnZXIoaW50IG51bUJpdHMsIFJhbmRvbSBybmQpIHsKLSAgICAgICAgc3VwZXIobnVtQml0cywgcm5kKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5vbk5lZ2F0aXZlSW50ZWdlcihTdHJpbmcgdmFsKSB7Ci0gICAgICAgIHN1cGVyKHZhbCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm9uTmVnYXRpdmVJbnRlZ2VyKFN0cmluZyB2YWwsIGludCByYWRpeCkgewotICAgICAgICBzdXBlcih2YWwsIHJhZGl4KTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgLyoqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbiAqLwotICAgIHByaXZhdGUgQmlnSW50ZWdlciB6ZXJvID0gbmV3IEJpZ0ludGVnZXIoIjAiKTsKLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1ZhbGlkaXR5KCkgewotICAgICAgICBpZiAoY29tcGFyZVRvKHplcm8pIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWROb25OZWdJbnQwMCIpICsKLSI6ICAiICsgdGhpcyk7Ci0gICAgICAgIH0KLSAgICB9IC8vIGNoZWNrVmFsaWRpdHkKLQotICAgIC8qKgotICAgICAqIFdvcmstYXJvdW5kIGZvciBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM3ODM3MC5odG1sCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEJpZ0ludGVnZXJSZXAKLSAgICAgKiBAdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlclJlcCh0b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJSZXAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTM1MDY1NjA1NTE0Njc4Njg5TDsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gYXJyYXk7Ci0KLSAgICAgICAgcHJvdGVjdGVkIEJpZ0ludGVnZXJSZXAoYnl0ZVtdIGFycmF5KSB7Ci0gICAgICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9uTmVnYXRpdmVJbnRlZ2VyKGFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLX0gLy8gY2xhc3MgTm9uTmVnYXRpdmVJbnRlZ2VyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjZjYmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05vblBvc2l0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIG5vblBvc2l0aXZlSW50ZWdlcgotICogPHAvPgotICogbm9uUG9zaXRpdmVJbnRlZ2VyIGlzIGRlcml2ZWQgZnJvbSBpbnRlZ2VyIGJ5IHNldHRpbmcgdGhlIHZhbHVlIG9mIG1heEluY2x1c2l2ZSB0byBiZSAwLiBUaGlzCi0gKiByZXN1bHRzIGluIHRoZSBzdGFuZGFyZCBtYXRoZW1hdGljYWwgY29uY2VwdCBvZiB0aGUgbm9uLXBvc2l0aXZlIGludGVnZXJzLiBUaGUgdmFsdWUgc3BhY2Ugb2YKLSAqIG5vblBvc2l0aXZlSW50ZWdlciBpcyB0aGUgaW5maW5pdGUgc2V0IHsuLi4sLTIsLTEsMH0uCi0gKgotICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jbm9uUG9zaXRpdmVJbnRlZ2VyIj5YTUwgU2NoZW1hIDMuMy4xNDwvYT4KLSAqLwotcHVibGljIGNsYXNzIE5vblBvc2l0aXZlSW50ZWdlciBleHRlbmRzIEJpZ0ludGVnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg2MDkwNTE5NjE4MzgxMTc2MDBMOwotCi0gICAgcHVibGljIE5vblBvc2l0aXZlSW50ZWdlcihieXRlW10gdmFsKSB7Ci0gICAgICAgIHN1cGVyKHZhbCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOb25Qb3NpdGl2ZUludGVnZXIoaW50IHNpZ251bSwgYnl0ZVtdIG1hZ25pdHVkZSkgewotICAgICAgICBzdXBlcihzaWdudW0sIG1hZ25pdHVkZSk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBOb25Qb3NpdGl2ZUludGVnZXIoaW50IGJpdExlbmd0aCwgaW50IGNlcnRhaW50eSwgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihiaXRMZW5ndGgsIGNlcnRhaW50eSwgcm5kKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIE5vblBvc2l0aXZlSW50ZWdlcihpbnQgbnVtQml0cywgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihudW1CaXRzLCBybmQpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgTm9uUG9zaXRpdmVJbnRlZ2VyKFN0cmluZyB2YWwpIHsKLSAgICAgICAgc3VwZXIodmFsKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb25Qb3NpdGl2ZUludGVnZXIoU3RyaW5nIHZhbCwgaW50IHJhZGl4KSB7Ci0gICAgICAgIHN1cGVyKHZhbCwgcmFkaXgpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICAvKiogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uICovCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIHplcm8gPSBuZXcgQmlnSW50ZWdlcigiMCIpOwotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWRpdHkoKSB7Ci0gICAgICAgIGlmIChjb21wYXJlVG8oemVybykgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZE5vblBvc0ludDAwIikgKwotICAgICAgICAgICAgICAgICAgICAiOiAgIiArIHRoaXMpOwotICAgICAgICB9Ci0gICAgfSAvLyBjaGVja1ZhbGlkaXR5Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrLWFyb3VuZCBmb3IgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNzgzNzAuaHRtbAotICAgICAqCi0gICAgICogQHJldHVybiBCaWdJbnRlZ2VyUmVwCi0gICAgICogQHRocm93cyBqYXZhLmlvLk9iamVjdFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlclJlcCh0b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJSZXAgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNjAxMzU3NjkwMzY1Njk4NTE3TDsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gYXJyYXk7Ci0KLSAgICAgICAgcHJvdGVjdGVkIEJpZ0ludGVnZXJSZXAoYnl0ZVtdIGFycmF5KSB7Ci0gICAgICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9uUG9zaXRpdmVJbnRlZ2VyKGFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLX0gLy8gY2xhc3MgTm9uUG9zaXRpdmVJbnRlZ2VyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9ybWFsaXplZFN0cmluZy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL05vcm1hbGl6ZWRTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmOWY1Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm9ybWFsaXplZFN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIE5vcm1hbGl6ZWRTdHJpbmcuIG5vcm1hbGl6ZWRTdHJpbmcgcmVwcmVzZW50cyB3aGl0ZQotICogc3BhY2Ugbm9ybWFsaXplZCBzdHJpbmdzLiBUaGUgYmFzZSB0eXBlIG9mIG5vcm1hbGl6ZWRTdHJpbmcgaXMgc3RyaW5nLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI25vcm1hbGl6ZWRTdHJpbmciPlhNTCBTY2hlbWEgUGFydCAyOiBEYXRhdHlwZXMKLSAqICAgICAgMy4zLjE8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb3JtYWxpemVkU3RyaW5nIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI5MDg3ODE1MTg3MDM5OTQwMUw7Ci0KLSAgICBTdHJpbmcgbV92YWx1ZTsgICAvLyBKQVgtUlBDIG1hcHMgeHNkOnN0cmluZyB0byBqYXZhLmxhbmcuU3RyaW5nCi0KLSAgICBwdWJsaWMgTm9ybWFsaXplZFN0cmluZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBOb3JtYWxpemVkU3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RWYWx1ZSBpcyB0aGUgU3RyaW5nIHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaW52YWxpZCBmb3JtYXQKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9ybWFsaXplZFN0cmluZyhTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHN0VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RWYWx1ZSBTdHJpbmcgdmFsdWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbnZhbGlkIGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBzdFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFOb3JtYWxpemVkU3RyaW5nLmlzVmFsaWQoc3RWYWx1ZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWROb3JtYWxpemVkU3RyaW5nMDAiKSArCi0iIGRhdGE9WyIgKyBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgbV92YWx1ZSA9IHN0VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1fdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fdmFsdWUuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZSB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgeHNkIGRlZmluaXRpb24gZm9yIHRoZSBvYmplY3QKLSAgICAgKiA8cC8+Ci0gICAgICogVGhlIHZhbHVlIHNwYWNlIG9mIG5vcm1hbGl6ZWRTdHJpbmcgaXMgdGhlIHNldCBvZiBzdHJpbmdzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIGNhcnJpYWdlCi0gICAgICogcmV0dXJuICgjeEQpLCBsaW5lIGZlZWQgKCN4QSkgbm9yIHRhYiAoI3g5KSBjaGFyYWN0ZXJzLiBUaGUgbGV4aWNhbCBzcGFjZSBvZiBub3JtYWxpemVkU3RyaW5nCi0gICAgICogaXMgdGhlIHNldCBvZiBzdHJpbmdzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIGNhcnJpYWdlIHJldHVybiAoI3hEKSBub3IgdGFiICgjeDkpCi0gICAgICogY2hhcmFjdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdFZhbHVlIHRoZSBTdHJpbmcgdG8gdGVzdAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHZhbGlkIG5vcm1hbGl6ZWRTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHN0VmFsdWUpIHsKLSAgICAgICAgaW50IHNjYW47Ci0KLSAgICAgICAgZm9yIChzY2FuID0gMDsgc2NhbiA8IHN0VmFsdWUubGVuZ3RoKCk7IHNjYW4rKykgewotICAgICAgICAgICAgY2hhciBjRGlnaXQgPSBzdFZhbHVlLmNoYXJBdChzY2FuKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY0RpZ2l0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDA5OgotICAgICAgICAgICAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgICAgICAgICBjYXNlIDB4MEQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBTdHJpbmcgczEgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIHMxLmVxdWFscyhtX3ZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvTm90YXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNmMGRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Ob3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBYU0QgZGF0YSB0eXBlIE5PVEFUSU9OLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI2VsZW1lbnQtbm90YXRpb24iPlhNTCBTY2hlbWEgUGFydCAxOiAzLjEyCi0gKiAgICAgIE5vdGF0aW9uIERlY2xhcmF0aW9uczwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTm90YXRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzkzMDc0NjUxOTcyMTkyNTM2TDsKLQotICAgIE5DTmFtZSBuYW1lOwotICAgIFVSSSBwdWJsaWNVUkk7Ci0gICAgVVJJIHN5c3RlbVVSSTsKLQotICAgIHB1YmxpYyBOb3RhdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTm90YXRpb24oTkNOYW1lIG5hbWUsIFVSSSBwdWJsaWNVUkksIFVSSSBzeXN0ZW1VUkkpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5wdWJsaWNVUkkgPSBwdWJsaWNVUkk7Ci0gICAgICAgIHRoaXMuc3lzdGVtVVJJID0gc3lzdGVtVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBOQ05hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShOQ05hbWUgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkkgZ2V0UHVibGljKCkgewotICAgICAgICByZXR1cm4gcHVibGljVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFB1YmxpYyhVUkkgcHVibGljVVJJKSB7Ci0gICAgICAgIHRoaXMucHVibGljVVJJID0gcHVibGljVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkkgZ2V0U3lzdGVtKCkgewotICAgICAgICByZXR1cm4gc3lzdGVtVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbShVUkkgc3lzdGVtVVJJKSB7Ci0gICAgICAgIHRoaXMuc3lzdGVtVVJJID0gc3lzdGVtVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIE5vdGF0aW9uKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgTm90YXRpb24gb3RoZXIgPSAoTm90YXRpb24pb2JqOwotICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob3RoZXIubmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwdWJsaWNVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG90aGVyLnB1YmxpY1VSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFwdWJsaWNVUkkuZXF1YWxzKG90aGVyLnB1YmxpY1VSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3lzdGVtVVJJID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5zeXN0ZW1VUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3lzdGVtVVJJLmVxdWFscyhvdGhlci5zeXN0ZW1VUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBoYXNoY29kZXMgb2Yge25hbWUscHVibGljVVJJLHN5c3RlbVVSSX0gZm9yIHdoaWNoZXZlciBwcm9wZXJ0aWVzIGluCi0gICAgICogdGhhdCBzZXQgaXMgbm9uIG51bGwuICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgZXF1YWxzLCBhcyByZXF1aXJlZCBieQotICAgICAqIHtAbGluayBPYmplY3QjaGFzaENvZGUoKSBPYmplY3QuaGFzaENvZGV9LgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGhhc2ggPSAwOwotICAgICAgICBpZiAobnVsbCAhPSBuYW1lKSB7Ci0gICAgICAgICAgICBoYXNoICs9IG5hbWUuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSBwdWJsaWNVUkkpIHsKLSAgICAgICAgICAgIGhhc2ggKz0gcHVibGljVVJJLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgIT0gc3lzdGVtVVJJKSB7Ci0gICAgICAgICAgICBoYXNoICs9IHN5c3RlbVVSSS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGUgLSBBIGxvdCBvZiBjb2RlIHRoYXQgZGVwZW5kZWQgb24gY2VydGFpbiBkZXNjcmlwdGlvbnMgaGFzIGJlZW4gZGVsZXRlZCBmcm9tIHRoaXMgY2xhc3MKLSAgICAgKi8KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Bvc2l0aXZlSW50ZWdlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Bvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmIyNjQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIHBvc2l0aXZlSW50ZWdlcgotICogPHAvPgotICogcG9zaXRpdmVJbnRlZ2VyIGlzIGRlcml2ZWQgZnJvbSBub25OZWdhdGl2ZUludGVnZXIgYnkgc2V0dGluZyB0aGUgdmFsdWUgb2YgbWluSW5jbHVzaXZlIHRvIGJlIDEuCi0gKiBUaGlzIHJlc3VsdHMgaW4gdGhlIHN0YW5kYXJkIG1hdGhlbWF0aWNhbCBjb25jZXB0IG9mIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIG51bWJlcnMuIFRoZSB2YWx1ZQotICogc3BhY2Ugb2YgcG9zaXRpdmVJbnRlZ2VyIGlzIHRoZSBpbmZpbml0ZSBzZXQgezEsMiwuLi59LgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Bvc2l0aXZlSW50ZWdlciI+WE1MIFNjaGVtYSAzLjMuMjU8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQb3NpdGl2ZUludGVnZXIgZXh0ZW5kcyBOb25OZWdhdGl2ZUludGVnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ1NjIzMDE0MjMyMzE5MjA4MTNMOwotCi0gICAgcHVibGljIFBvc2l0aXZlSW50ZWdlcihieXRlW10gdmFsKSB7Ci0gICAgICAgIHN1cGVyKHZhbCk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBQb3NpdGl2ZUludGVnZXIoaW50IHNpZ251bSwgYnl0ZVtdIG1hZ25pdHVkZSkgewotICAgICAgICBzdXBlcihzaWdudW0sIG1hZ25pdHVkZSk7Ci0gICAgICAgIGNoZWNrVmFsaWRpdHkoKTsKLSAgICB9IC8vIGN0b3IKLQotICAgIHB1YmxpYyBQb3NpdGl2ZUludGVnZXIoaW50IGJpdExlbmd0aCwgaW50IGNlcnRhaW50eSwgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihiaXRMZW5ndGgsIGNlcnRhaW50eSwgcm5kKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0gLy8gY3RvcgotCi0gICAgcHVibGljIFBvc2l0aXZlSW50ZWdlcihpbnQgbnVtQml0cywgUmFuZG9tIHJuZCkgewotICAgICAgICBzdXBlcihudW1CaXRzLCBybmQpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICBwdWJsaWMgUG9zaXRpdmVJbnRlZ2VyKFN0cmluZyB2YWwpIHsKLSAgICAgICAgc3VwZXIodmFsKTsKLSAgICAgICAgY2hlY2tWYWxpZGl0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQb3NpdGl2ZUludGVnZXIoU3RyaW5nIHZhbCwgaW50IHJhZGl4KSB7Ci0gICAgICAgIHN1cGVyKHZhbCwgcmFkaXgpOwotICAgICAgICBjaGVja1ZhbGlkaXR5KCk7Ci0gICAgfSAvLyBjdG9yCi0KLSAgICAvKiogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uICovCi0gICAgcHJpdmF0ZSBCaWdJbnRlZ2VyIGlNaW5JbmNsdXNpdmUgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVmFsaWRpdHkoKSB7Ci0gICAgICAgIGlmIChjb21wYXJlVG8oaU1pbkluY2x1c2l2ZSkgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZHBvc0ludDAwIikKLSAgICAgICAgICAgICAgICAgICAgIjogICIgKyB0aGlzKTsKLSAgICAgICAgfQotICAgIH0gLy8gY2hlY2tWYWxpZGl0eQotCi0gICAgLyoqCi0gICAgICogV29yay1hcm91bmQgZm9yIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80Mzc4MzcwLmh0bWwKLSAgICAgKgotICAgICAqIEByZXR1cm4gQmlnSW50ZWdlclJlcAotICAgICAqIEB0aHJvd3MgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXJSZXAodG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCaWdJbnRlZ2VyUmVwIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMjUxNjY0MTYwOTM2MTUwNDk5TDsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gYXJyYXk7Ci0KLSAgICAgICAgcHJvdGVjdGVkIEJpZ0ludGVnZXJSZXAoYnl0ZVtdIGFycmF5KSB7Ci0gICAgICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRSZXNvbHZlKCkgdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpdmVJbnRlZ2VyKGFycmF5KTsKLSAgICAgICAgfQotICAgIH0KLX0gLy8gY2xhc3MgTm9uTmVnYXRpdmVJbnRlZ2VyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVGltZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1RpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzk3Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotLyoqIENsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgeHNkOnRpbWUgWE1MIFNjaGVtYSB0eXBlICovCi1wdWJsaWMgY2xhc3MgVGltZSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MDIyMjAxNTU1NTM1NTg5OTA4TDsKLQotICAgIHByaXZhdGUgQ2FsZW5kYXIgX3ZhbHVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0Zyb21TdHJpbmc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3JpZ2luYWxTdHJpbmc7Ci0KLSAgICAvKioKLSAgICAgKiBhIHNoYXJlZCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdCBpbnN0YW5jZSB1c2VkIGZvciBwYXJzaW5nIHRoZSBiYXNpYyBjb21wb25lbnQgb2YgdGhlCi0gICAgICogdGltZXN0YW1wCi0gICAgICovCi0KLSAgICAvKiogSW5pdGlhbGl6ZXMgd2l0aCBhIENhbGVuZGVyLiBZZWFyLCBtb250aCBhbmQgZGF0ZSBhcmUgaWdub3JlZC4gKi8KLSAgICBwdWJsaWMgVGltZShDYWxlbmRhciB2YWx1ZSkgewotICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5ZRUFSKTsKLSAgICAgICAgdGhpcy5fdmFsdWUuY2xlYXIoQ2FsZW5kYXIuTU9OVEgpOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5EQVRFKTsKLSAgICB9Ci0KLSAgICAvKiogQ29udmVydHMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIEhIOm1tOnNzWy5TU1NdWysvLW9mZnNldF0gKi8KLSAgICBwdWJsaWMgVGltZShTdHJpbmcgdmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBfdmFsdWUgPSBtYWtlVmFsdWUodmFsdWUpOwotICAgICAgICB0aGlzLmlzRnJvbVN0cmluZyA9IHRydWU7Ci0gICAgICAgIHRoaXMub3JpZ2luYWxTdHJpbmcgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIGFzIGEgY2FsZW5kYXIuIElnbm9yZXMgdGhlIHllYXIsIG1vbnRoIGFuZCBkYXRlIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBjYWxlbmRhciB2YWx1ZTsgbWF5IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIENhbGVuZGFyIGdldEFzQ2FsZW5kYXIoKSB7Ci0gICAgICAgIHJldHVybiBfdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdGltZTsgaWdub3JlcyB5ZWFyLCBtb250aCwgZGF0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKENhbGVuZGFyIGRhdGUpIHsKLSAgICAgICAgdGhpcy5fdmFsdWUgPSBkYXRlOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5ZRUFSKTsKLSAgICAgICAgdGhpcy5fdmFsdWUuY2xlYXIoQ2FsZW5kYXIuTU9OVEgpOwotICAgICAgICB0aGlzLl92YWx1ZS5jbGVhcihDYWxlbmRhci5EQVRFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aW1lIGZyb20gYSBkYXRlIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lKERhdGUgZGF0ZSkgewotICAgICAgICBfdmFsdWUuc2V0VGltZShkYXRlKTsKLSAgICAgICAgdGhpcy5fdmFsdWUuY2xlYXIoQ2FsZW5kYXIuWUVBUik7Ci0gICAgICAgIHRoaXMuX3ZhbHVlLmNsZWFyKENhbGVuZGFyLk1PTlRIKTsKLSAgICAgICAgdGhpcy5fdmFsdWUuY2xlYXIoQ2FsZW5kYXIuREFURSk7Ci0gICAgfQotCi0gICAgLyoqIFV0aWxpdHkgZnVuY3Rpb24gdGhhdCBwYXJzZXMgeHNkOnRpbWUgc3RyaW5ncyBhbmQgcmV0dXJucyBhIERhdGUgb2JqZWN0ICovCi0gICAgcHJpdmF0ZSBDYWxlbmRhciBtYWtlVmFsdWUoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gY2Fubm9uaWNhbCBmb3JtIG9mIHRoZSB0aW1lcyBpcyAgaGggJzonIG1tICc6JyBzcyAoJy4nIHMrKT8gKHp6enp6eik/Ci0gICAgICAgIGlmICgoc291cmNlID09IG51bGwpIHx8IChzb3VyY2UudHJpbSgpLmxlbmd0aCgpID09IDApKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc291cmNlID0gc291cmNlLnRyaW0oKTsKLQotICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGNhbGVuZGFyLmNsZWFyKCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldExlbmllbnQoZmFsc2UpOwotICAgICAgICBpbnQgaG91ciA9IDA7Ci0gICAgICAgIGludCBtaW5pdGUgPSAwOwotICAgICAgICBpbnQgc2Vjb25kID0gMDsKLSAgICAgICAgbG9uZyBtaWxpU2Vjb25kID0gMDsKLQotICAgICAgICBpbnQgdGltZVpvbmVPZmZTZXQgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCkuZ2V0UmF3T2Zmc2V0KCk7Ci0gICAgICAgICBpbnQgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGgoKSA+PSA4KSB7Ci0gICAgICAgICAgICBpZiAoKHNvdXJjZS5jaGFyQXQoMikgIT0gJzonICl8fCAoc291cmNlLmNoYXJBdCg1KSAhPSAnOicpKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCB0aW1lIGZvcm1hdCAoIiArIHNvdXJjZSArICIpIGhhdmluZyA6IHMgaW4gd3JvbmcgcGxhY2VzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBob3VyID0gSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKDAsIDIpKTsKLSAgICAgICAgICAgIG1pbml0ZSA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygzLCA1KSk7Ci0gICAgICAgICAgICBzZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoNiwgOCkpOwotCi0KLQotICAgICAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGgoKSA+IDgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdCA9IHNvdXJjZS5zdWJzdHJpbmcoOCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGhhdmUgdGhlICgnLidzKykgcGFydAotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5lbmRzV2l0aCgiWiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGluIGdtdCB0aW1lIHpvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIloiKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gcmVzdC5zdWJzdHJpbmcoMSxyZXN0Lmxhc3RJbmRleE9mKCJaIikpLnRyaW0oKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocmVzdC5sYXN0SW5kZXhPZigiKyIpID4gMCkgfHwgKHJlc3QubGFzdEluZGV4T2YoIi0iKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGdpdmVuIGluIGEgZ2VuZXJhbCB0aW1lIHppb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGltZU9mZlNldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5sYXN0SW5kZXhPZigiKyIpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPZmZTZXQgPSByZXN0LnN1YnN0cmluZyhyZXN0Lmxhc3RJbmRleE9mKCIrIikgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxpU2Vjb25kID0gSW50ZWdlci5wYXJzZUludChyZXN0LnN1YnN0cmluZygxLCByZXN0Lmxhc3RJbmRleE9mKCIrIikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY29uZFBhcnRMZW5ndGggPSByZXN0LnN1YnN0cmluZygxLCByZXN0Lmxhc3RJbmRleE9mKCIrIikpLnRyaW0oKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBrZWVwICsxIG9yIC0xIHRvIGZpbmFsbHkgY2FsY3VsYXRlIHRoZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0Lmxhc3RJbmRleE9mKCItIikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU9mZlNldCA9IHJlc3Quc3Vic3RyaW5nKHJlc3QubGFzdEluZGV4T2YoIi0iKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIi0iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIi0iKSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGtlZXAgKzEgb3IgLTEgdG8gZmluYWxseSBjYWxjdWxhdGUgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lT2ZmU2V0LmNoYXJBdCgyKSAhPSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCB0aW1lIHpvbmUgZm9ybWF0ICgiICsgc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIHdpdGhvdXQgOiBhdCBjb3JyZWN0IHBsYWNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaG91cnMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWVPZmZTZXQuc3Vic3RyaW5nKDAsIDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pdHMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWVPZmZTZXQuc3Vic3RyaW5nKDMsIDUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gKChob3VycyAqIDYwKSArIG1pbml0cykgKiA2MDAwMCAqIHRpbWVab25lT2ZmU2V0OwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUgaXQgZG9lcyBub3QgaGF2ZSB0aW1lIHpvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IHJlc3Quc3Vic3RyaW5nKDEpLnRyaW0oKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiWiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGluIGdtdCB0aW1lIHpvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0LnN0YXJ0c1dpdGgoIisiKSB8fCByZXN0LnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBnaXZlbiBpbiBhIGdlbmVyYWwgdGltZSB6aW9uZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QuY2hhckF0KDMpICE9ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIHRpbWUgem9uZSBmb3JtYXQgKCIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgd2l0aG91dCA6IGF0IGNvcnJlY3QgcGxhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBob3VycyA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoMSwgMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbml0cyA9IEludGVnZXIucGFyc2VJbnQocmVzdC5zdWJzdHJpbmcoNCwgNikpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAoKGhvdXJzICogNjApICsgbWluaXRzKSAqIDYwMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSB0aW1lWm9uZU9mZlNldCAqIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiaW4gdmFsaWQgdGltZSB6b25lIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgbWVzc2FnZSBzdHJpbmciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5IT1VSX09GX0RBWSwgaG91cik7Ci0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5NSU5VVEUsIG1pbml0ZSk7Ci0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5TRUNPTkQsIHNlY29uZCk7Ci0gICAgICAgIGlmIChtaWxsaVNlY29uZFBhcnRMZW5ndGggIT0gMykgewotICAgICAgICAgICAgLy8gbWlsaXNlY29uZCBwYXJ0IHJlcHJlc2Vuc3QgdGhlIGZyYWN0aW9uIG9mIHRoZSBzZWNvbmQgc28gd2UgaGF2ZSB0bwotICAgICAgICAgICAgLy8gZmluZCB0aGUgZnJhY3Rpb24gYW5kIG11bHRpcGx5IGl0IGJ5IDEwMDAuIFNvIGlmIG1pbGlzZWNvbmQgcGFydAotICAgICAgICAgICAgLy8gaGFzIHRocmVlIGRpZ2l0cyBub3RoaW5nIHJlcXVpcmVkCi0gICAgICAgICAgICBtaWxpU2Vjb25kID0gbWlsaVNlY29uZCAqIDEwMDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbGxpU2Vjb25kUGFydExlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IG1pbGlTZWNvbmQgLyAxMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIChpbnQpbWlsaVNlY29uZCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5aT05FX09GRlNFVCwgdGltZVpvbmVPZmZTZXQpOwotICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCwgMCk7Ci0KLSAgICAgICAgcmV0dXJuIGNhbGVuZGFyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGltZSBhcyBpdCB3b3VsZCBiZSBpbiBHTVQuIFRoaXMgaXMgYWNjdXJhdGUgdG8gdGhlIHNlY29uZHMuIE1pbGxpc2Vjb25kcwotICAgICAqIHByb2JhYmx5IGdldHMgbG9zdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKF92YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gInVuYXNzaWduZWQgVGltZSI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNGcm9tU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxTdHJpbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgdGltZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIENvbnZlcnRlclV0aWwuYXBwZW5kVGltZShfdmFsdWUsdGltZVN0cmluZyk7Ci0gICAgICAgICAgICBDb252ZXJ0ZXJVdGlsLmFwcGVuZFRpbWVab25lKF92YWx1ZSx0aW1lU3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aW1lU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBUaW1lKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBUaW1lIG90aGVyID0gKFRpbWUpb2JqOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotCi0gICAgICAgIGJvb2xlYW4gX2VxdWFsczsKLSAgICAgICAgX2VxdWFscyA9ICgoX3ZhbHVlID09IG51bGwgJiYgb3RoZXIuX3ZhbHVlID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgKF92YWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWUuZ2V0VGltZSgpLmVxdWFscyhvdGhlci5fdmFsdWUuZ2V0VGltZSgpKSkpOwotCi0gICAgICAgIHJldHVybiBfZXF1YWxzOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFzaGNvZGUgb2YgdGhlIHVuZGVybHlpbmcgY2FsZW5kYXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gX3ZhbHVlID09IG51bGwgPyAwIDogX3ZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Rva2VuLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0MTkxOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLS8qKgotICogQ3VzdG9tIGNsYXNzIGZvciBzdXBwb3J0aW5nIHByaW1pdGl2ZSBYU0QgZGF0YSB0eXBlIFRva2VuLiB0b2tlbiByZXByZXNlbnRzIHRva2VuaXplZCBzdHJpbmdzLgotICogVGhlIGJhc2UgdHlwZSBvZiB0b2tlbiBpcyBub3JtYWxpemVkU3RyaW5nLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Rva2VuIj5YTUwgU2NoZW1hIDMuMy4yPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVG9rZW4gZXh0ZW5kcyBOb3JtYWxpemVkU3RyaW5nIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MzcwNTI0NzQwNTE0NDY1NDY3TDsKLQotICAgIHB1YmxpYyBUb2tlbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBUb2tlbgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBUb2tlbihTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRWYWx1ZShzdFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHJlY2FzdCBub3JtYWxpemVkU3RyaW5nIGV4Y2VwdGlvbiBhcyB0b2tlbiBleGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVG9rZW4wMCIpICsKLSAgICAgICAgICAgICAgICAgICAgImRhdGE9WyIgKyBzdFZhbHVlICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgdmFsdWUgc3BhY2Ugb2YgdG9rZW4gaXMgdGhlIHNldCBvZiBzdHJpbmdzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIGxpbmUgZmVlZCAoI3hBKSBub3IKLSAgICAgKiB0YWIgKCN4OSkgY2hhcmFjdGVycywgdGhhdCBoYXZlIG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzICgjeDIwKSBhbmQgdGhhdCBoYXZlIG5vCi0gICAgICogaW50ZXJuYWwgc2VxdWVuY2VzIG9mIHR3byBvciBtb3JlIHNwYWNlcy4gVGhlIGxleGljYWwgc3BhY2Ugb2YgdG9rZW4gaXMgdGhlIHNldCBvZiBzdHJpbmdzCi0gICAgICogdGhhdCBkbyBub3QgY29udGFpbiB0aGUgbGluZSBmZWVkICgjeEEpIG5vciB0YWIgKCN4OSkgY2hhcmFjdGVycywgdGhhdCBoYXZlIG5vIGxlYWRpbmcgb3IKLSAgICAgKiB0cmFpbGluZyBzcGFjZXMgKCN4MjApIGFuZCB0aGF0IGhhdmUgbm8gaW50ZXJuYWwgc2VxdWVuY2VzIG9mIHR3byBvciBtb3JlIHNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgc3RWYWx1ZSkgewotICAgICAgICBpbnQgc2NhbjsKLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBzdHJpbmcgdG8gcmV2aWV3Ci0gICAgICAgIGlmICgoc3RWYWx1ZSA9PSBudWxsKSB8fCAoc3RWYWx1ZS5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIC8vIG5vIGxlYWRpbmcgc3BhY2UKLSAgICAgICAgaWYgKHN0VmFsdWUuY2hhckF0KDApID09IDB4MjApCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8gbm8gdHJhaWwgc3BhY2UKLSAgICAgICAgaWYgKHN0VmFsdWUuY2hhckF0KHN0VmFsdWUubGVuZ3RoKCkgLSAxKSA9PSAweDIwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoc2NhbiA9IDA7IHNjYW4gPCBzdFZhbHVlLmxlbmd0aCgpOyBzY2FuKyspIHsKLSAgICAgICAgICAgIGNoYXIgY0RpZ2l0ID0gc3RWYWx1ZS5jaGFyQXQoc2Nhbik7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNEaWdpdCkgewotICAgICAgICAgICAgICAgIGNhc2UgMHgwOToKLSAgICAgICAgICAgICAgICBjYXNlIDB4MEE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MjA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5vIGRvdWJsc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjYW4gKyAxIDwgc3RWYWx1ZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdFZhbHVlLmNoYXJBdChzY2FuICsgMSkgPT0gMHgyMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZXMgdGhlIGRhdGEgYW5kIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0VmFsdWUgU3RyaW5nIHZhbHVlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgaW52YWxpZCBmb3JtYXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghVG9rZW4uaXNWYWxpZChzdFZhbHVlKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVG9rZW4wMCIpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkYXRhPVsiICsgc3RWYWx1ZSArICJdIik7Ci0gICAgICAgIG1fdmFsdWUgPSBzdFZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1VSSS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1VSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmEzMjMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIDxpPkF4aXMgTm90ZTogVGhpcyBjbGFzcyB3YXMKLSAqICdib3Jyb3dlZCcgZnJvbSBYZXJjZXMgMi4wLjI8L2k+Ci0gKiA8cC8+Ci0gKiBBIGNsYXNzIHRvIHJlcHJlc2VudCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKS4gVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBoYW5kbGUgdGhlCi0gKiBwYXJzaW5nIG9mIFVSSXMgYW5kIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgKHNjaGVtZSwgaG9zdCwgcG9ydCwgdXNlcmluZm8sCi0gKiBwYXRoLCBxdWVyeSBzdHJpbmcgYW5kIGZyYWdtZW50KSB0aGF0IG1heSBjb25zdGl0dXRlIGEgVVJJLgotICogPHAvPgotICogUGFyc2luZyBvZiBhIFVSSSBzcGVjaWZpY2F0aW9uIGlzIGRvbmUgYWNjb3JkaW5nIHRvIHRoZSBVUkkgc3ludGF4IGRlc2NyaWJlZCBpbiA8YQotICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQ/bnVtYmVyPTIzOTYiPlJGQyAyMzk2PC9hPiwgYW5kIGFtZW5kZWQgYnkgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI3MzIudHh0P251bWJlcj0yNzMyIj5SRkMgMjczMjwvYT4uCi0gKiA8cC8+Ci0gKiBFdmVyeSBhYnNvbHV0ZSBVUkkgY29uc2lzdHMgb2YgYSBzY2hlbWUsIGZvbGxvd2VkIGJ5IGEgY29sb24gKCc6JyksIGZvbGxvd2VkIGJ5IGEKLSAqIHNjaGVtZS1zcGVjaWZpYyBwYXJ0LiBGb3IgVVJJcyB0aGF0IGZvbGxvdyB0aGUgImdlbmVyaWMgVVJJIiBzeW50YXgsIHRoZSBzY2hlbWUtc3BlY2lmaWMgcGFydAotICogYmVnaW5zIHdpdGggdHdvIHNsYXNoZXMgKCIvLyIpIGFuZCBtYXkgYmUgZm9sbG93ZWQgYnkgYW4gYXV0aG9yaXR5IHNlZ21lbnQgKGNvbXByaXNlZCBvZiB1c2VyCi0gKiBpbmZvcm1hdGlvbiwgaG9zdCwgYW5kIHBvcnQpLCBwYXRoIHNlZ21lbnQsIHF1ZXJ5IHNlZ21lbnQgYW5kIGZyYWdtZW50LiBOb3RlIHRoYXQgUkZDIDIzOTYgbm8KLSAqIGxvbmdlciBzcGVjaWZpZXMgdGhlIHVzZSBvZiB0aGUgcGFyYW1ldGVycyBzZWdtZW50IGFuZCBleGNsdWRlcyB0aGUgInVzZXI6cGFzc3dvcmQiIHN5bnRheCBhcwotICogcGFydCBvZiB0aGUgYXV0aG9yaXR5IHNlZ21lbnQuIElmICJ1c2VyOnBhc3N3b3JkIiBhcHBlYXJzIGluIGEgVVJJLCB0aGUgZW50aXJlIHVzZXIvcGFzc3dvcmQKLSAqIHN0cmluZyBpcyBzdG9yZWQgYXMgdXNlcmluZm8uCi0gKiA8cC8+Ci0gKiBGb3IgVVJJcyB0aGF0IGRvIG5vdCBmb2xsb3cgdGhlICJnZW5lcmljIFVSSSIgc3ludGF4IChlLmcuIG1haWx0byksIHRoZSBlbnRpcmUgc2NoZW1lLXNwZWNpZmljCi0gKiBwYXJ0IGlzIHRyZWF0ZWQgYXMgdGhlICJwYXRoIiBwb3J0aW9uIG9mIHRoZSBVUkkuCi0gKiA8cC8+Ci0gKiBOb3RlIHRoYXQsIHVubGlrZSB0aGUgamF2YS5uZXQuVVJMIGNsYXNzLCB0aGlzIGNsYXNzIGRvZXMgbm90IHByb3ZpZGUgYW55IGJ1aWx0LWluIG5ldHdvcmsKLSAqIGFjY2VzcyBmdW5jdGlvbmFsaXR5IG5vciBkb2VzIGl0IHByb3ZpZGUgYW55IHNjaGVtZS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5IChmb3IgZXhhbXBsZSwgaXQgZG9lcwotICogbm90IGtub3cgYSBkZWZhdWx0IHBvcnQgZm9yIGEgc3BlY2lmaWMgc2NoZW1lKS4gUmF0aGVyLCBpdCBvbmx5IGtub3dzIHRoZSBncmFtbWFyIGFuZCBiYXNpYyBzZXQKLSAqIG9mIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIFVSSS4KLSAqIDxwLz4KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjE3MjMwNjA0NDM2MTIyNzYyN0w7Ci0KLQotICAgIC8qKgotICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTWFsZm9ybWVkVVJJRXhjZXB0aW9ucyBhcmUKLSAgICAgKiB0aHJvd24gaW4gdGhlIHByb2Nlc3Mgb2YgYnVpbGRpbmcgYSBVUkkgb3Igc2V0dGluZyBmaWVsZHMgb24gYSBVUkkgd2hlbiBhbiBvcGVyYXRpb24gd291bGQKLSAgICAgKiByZXN1bHQgaW4gYW4gaW52YWxpZCBVUkkgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWxmb3JtZWRVUklFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg0ODg2OTI3NjA5NzU3Njg3NTdMOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RydWN0cyBhCi0gICAgICAgICAqIDxjb2RlPk1hbGZvcm1lZFVSSUV4Y2VwdGlvbjwvY29kZT4gd2l0aCBubyBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuCi0gICAgICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNYWxmb3JtZWRVUklFeGNlcHRpb24oKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbnN0cnVjdHMgYQotICAgICAgICAgKiA8Y29kZT5NYWxmb3JtZWRVUklFeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBfbXNnIHRoZSBkZXRhaWwgbWVzc2FnZS4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbihTdHJpbmcgcF9tc2cpIHsKLSAgICAgICAgICAgIHN1cGVyKHBfbXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgW10gZmdMb29rdXBUYWJsZSA9IG5ldyBieXRlWzEyOF07Ci0KLSAgICAvKioKLSAgICAgKiBDaGFyYWN0ZXIgQ2xhc3NlcwotICAgICAqLwotCi0gICAgLyoqIHJlc2VydmVkIGNoYXJhY3RlcnMgOy8/OkAmPSskLFtdICovCi0gICAgLy9SRkMgMjczMiBhZGRlZCAnWycgYW5kICddJyBhcyByZXNlcnZlZCBjaGFyYWN0ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEX0NIQVJBQ1RFUlMgPSAweDAxOwotCi0gICAgLyoqCi0gICAgICogVVJJIHB1bmN0dWF0aW9uIG1hcmsgY2hhcmFjdGVyczogLV8uIX4qJygpIC0gdGhlc2UsIGNvbWJpbmVkIHdpdGggYWxwaGFudW1lcmljcywgY29uc3RpdHV0ZSB0aGUKLSAgICAgKiAidW5yZXNlcnZlZCIgY2hhcmFjdGVycwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVJLX0NIQVJBQ1RFUlMgPSAweDAyOwotCi0gICAgLyoqIHNjaGVtZSBjYW4gYmUgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljcyBhbmQgdGhlc2UgY2hhcmFjdGVyczogKy0uICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDSEVNRV9DSEFSQUNURVJTID0gMHgwNDsKLQotICAgIC8qKiB1c2VyaW5mbyBjYW4gYmUgY29tcG9zZWQgb2YgdW5yZXNlcnZlZCwgZXNjYXBlZCBhbmQgdGhlc2UgY2hhcmFjdGVyczogOzomPSskLCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVU0VSSU5GT19DSEFSQUNURVJTID0gMHgwODsKLQotICAgIC8qKiBBU0NJSSBsZXR0ZXIgY2hhcmFjdGVycyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSV9BTFBIQV9DSEFSQUNURVJTID0gMHgxMDsKLQotICAgIC8qKiBBU0NJSSBkaWdpdCBjaGFyYWN0ZXJzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX0RJR0lUX0NIQVJBQ1RFUlMgPSAweDIwOwotCi0gICAgLyoqIEFTQ0lJIGhleCBjaGFyYWN0ZXJzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX0hFWF9DSEFSQUNURVJTID0gMHg0MDsKLQotICAgIC8qKiBQYXRoIGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFUSF9DSEFSQUNURVJTID0gMHg4MDsKLQotICAgIC8qKiBNYXNrIGZvciBhbHBoYS1udW1lcmljIGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19BTFBIQV9OVU1FUklDID0gQVNDSUlfQUxQSEFfQ0hBUkFDVEVSUyB8IEFTQ0lJX0RJR0lUX0NIQVJBQ1RFUlM7Ci0KLSAgICAvKiogTWFzayBmb3IgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfVU5SRVNFUlZFRF9NQVNLID0gTUFTS19BTFBIQV9OVU1FUklDIHwgTUFSS19DSEFSQUNURVJTOwotCi0gICAgLyoqIE1hc2sgZm9yIFVSSSBhbGxvd2FibGUgY2hhcmFjdGVycyBleGNlcHQgZm9yICUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19VUklfQ0hBUkFDVEVSID0gTUFTS19VTlJFU0VSVkVEX01BU0sgfCBSRVNFUlZFRF9DSEFSQUNURVJTOwotCi0gICAgLyoqIE1hc2sgZm9yIHNjaGVtZSBjaGFyYWN0ZXJzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfU0NIRU1FX0NIQVJBQ1RFUiA9IE1BU0tfQUxQSEFfTlVNRVJJQyB8IFNDSEVNRV9DSEFSQUNURVJTOwotCi0gICAgLyoqIE1hc2sgZm9yIHVzZXJpbmZvIGNoYXJhY3RlcnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19VU0VSSU5GT19DSEFSQUNURVIgPSBNQVNLX1VOUkVTRVJWRURfTUFTSyB8IFVTRVJJTkZPX0NIQVJBQ1RFUlM7Ci0KLSAgICAvKiogTWFzayBmb3IgcGF0aCBjaGFyYWN0ZXJzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BU0tfUEFUSF9DSEFSQUNURVIgPSBNQVNLX1VOUkVTRVJWRURfTUFTSyB8IFBBVEhfQ0hBUkFDVEVSUzsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIEFkZCBBU0NJSSBEaWdpdHMgYW5kIEFTQ0lJIEhleCBOdW1iZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAnMCc7IGkgPD0gJzknOyArK2kpIHsKLSAgICAgICAgICAgIGZnTG9va3VwVGFibGVbaV0gfD0gQVNDSUlfRElHSVRfQ0hBUkFDVEVSUyB8IEFTQ0lJX0hFWF9DSEFSQUNURVJTOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIEFTQ0lJIExldHRlcnMgYW5kIEFTQ0lJIEhleCBOdW1iZXJzCi0gICAgICAgIGZvciAoaW50IGkgPSAnQSc7IGkgPD0gJ0YnOyArK2kpIHsKLSAgICAgICAgICAgIGZnTG9va3VwVGFibGVbaV0gfD0gQVNDSUlfQUxQSEFfQ0hBUkFDVEVSUyB8IEFTQ0lJX0hFWF9DSEFSQUNURVJTOwotICAgICAgICAgICAgZmdMb29rdXBUYWJsZVtpICsgMHgwMDAwMDAyMF0gfD0gQVNDSUlfQUxQSEFfQ0hBUkFDVEVSUyB8IEFTQ0lJX0hFWF9DSEFSQUNURVJTOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIEFTQ0lJIExldHRlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9ICdHJzsgaSA8PSAnWic7ICsraSkgewotICAgICAgICAgICAgZmdMb29rdXBUYWJsZVtpXSB8PSBBU0NJSV9BTFBIQV9DSEFSQUNURVJTOwotICAgICAgICAgICAgZmdMb29rdXBUYWJsZVtpICsgMHgwMDAwMDAyMF0gfD0gQVNDSUlfQUxQSEFfQ0hBUkFDVEVSUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBSZXNlcnZlZCBDaGFyYWN0ZXJzCi0gICAgICAgIGZnTG9va3VwVGFibGVbJzsnXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycvJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnPyddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJzonXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWydAJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnJiddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJz0nXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycrJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnJCddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJywnXSB8PSBSRVNFUlZFRF9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWydbJ10gfD0gUkVTRVJWRURfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnXSddIHw9IFJFU0VSVkVEX0NIQVJBQ1RFUlM7Ci0KLSAgICAgICAgLy8gQWRkIE1hcmsgQ2hhcmFjdGVycwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyctJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWydfJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycuJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWychJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyd+J10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycqJ10gfD0gTUFSS19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWydcJyddIHw9IE1BUktfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnKCddIHw9IE1BUktfQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnKSddIHw9IE1BUktfQ0hBUkFDVEVSUzsKLQotICAgICAgICAvLyBBZGQgU2NoZW1lIENoYXJhY3RlcnMKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnKyddIHw9IFNDSEVNRV9DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyctJ10gfD0gU0NIRU1FX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJy4nXSB8PSBTQ0hFTUVfQ0hBUkFDVEVSUzsKLQotICAgICAgICAvLyBBZGQgVXNlcmluZm8gQ2hhcmFjdGVycwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyc7J10gfD0gVVNFUklORk9fQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnOiddIHw9IFVTRVJJTkZPX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJyYnXSB8PSBVU0VSSU5GT19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWyc9J10gfD0gVVNFUklORk9fQ0hBUkFDVEVSUzsKLSAgICAgICAgZmdMb29rdXBUYWJsZVsnKyddIHw9IFVTRVJJTkZPX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJyQnXSB8PSBVU0VSSU5GT19DSEFSQUNURVJTOwotICAgICAgICBmZ0xvb2t1cFRhYmxlWycsJ10gfD0gVVNFUklORk9fQ0hBUkFDVEVSUzsKLQotICAgICAgICAvLyBBZGQgUGF0aCBDaGFyYWN0ZXJzCi0gICAgICAgIGZnTG9va3VwVGFibGVbJzsnXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJy8nXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJzonXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJ0AnXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJyYnXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJz0nXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJysnXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJyQnXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgICAgIGZnTG9va3VwVGFibGVbJywnXSB8PSBQQVRIX0NIQVJBQ1RFUlM7Ci0gICAgfQotCi0gICAgLyoqIFN0b3JlcyB0aGUgc2NoZW1lICh1c3VhbGx5IHRoZSBwcm90b2NvbCkgZm9yIHRoaXMgVVJJLiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1fc2NoZW1lID0gbnVsbDsKLQotICAgIC8qKiBJZiBzcGVjaWZpZWQsIHN0b3JlcyB0aGUgdXNlcmluZm8gZm9yIHRoaXMgVVJJOyBvdGhlcndpc2UgbnVsbCAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1fdXNlcmluZm8gPSBudWxsOwotCi0gICAgLyoqIElmIHNwZWNpZmllZCwgc3RvcmVzIHRoZSBob3N0IGZvciB0aGlzIFVSSTsgb3RoZXJ3aXNlIG51bGwgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtX2hvc3QgPSBudWxsOwotCi0gICAgLyoqIElmIHNwZWNpZmllZCwgc3RvcmVzIHRoZSBwb3J0IGZvciB0aGlzIFVSSTsgb3RoZXJ3aXNlIC0xICovCi0gICAgcHJpdmF0ZSBpbnQgbV9wb3J0ID0gLTE7Ci0KLSAgICAvKiogSWYgc3BlY2lmaWVkLCBzdG9yZXMgdGhlIHJlZ2lzdHJ5IGJhc2VkIGF1dGhvcml0eSBmb3IgdGhpcyBVUkk7IG90aGVyd2lzZSAtMSAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1fcmVnQXV0aG9yaXR5ID0gbnVsbDsKLQotICAgIC8qKiBJZiBzcGVjaWZpZWQsIHN0b3JlcyB0aGUgcGF0aCBmb3IgdGhpcyBVUkk7IG90aGVyd2lzZSBudWxsICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9wYXRoID0gbnVsbDsKLQotICAgIC8qKiBJZiBzcGVjaWZpZWQsIHN0b3JlcyB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGlzIFVSSTsgb3RoZXJ3aXNlIG51bGwuICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9xdWVyeVN0cmluZyA9IG51bGw7Ci0KLSAgICAvKiogSWYgc3BlY2lmaWVkLCBzdG9yZXMgdGhlIGZyYWdtZW50IGZvciB0aGlzIFVSSTsgb3RoZXJ3aXNlIG51bGwgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtX2ZyYWdtZW50OwotCi0gICAgLyoqIENvbnN0cnVjdCBhIG5ldyBhbmQgdW5pbml0aWFsaXplZCBVUkkuICovCi0gICAgcHVibGljIFVSSSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVVJJIGZyb20gYW5vdGhlciBVUkkuIEFsbCBmaWVsZHMgZm9yIHRoaXMgVVJJIGFyZSBzZXQgZXF1YWwgdG8gdGhlIGZpZWxkcyBvZgotICAgICAqIHRoZSBVUkkgcGFzc2VkIGluLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfb3RoZXIgdGhlIFVSSSB0byBjb3B5IChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJJKFVSSSBwX290aGVyKSB7Ci0gICAgICAgIGluaXRpYWxpemUocF9vdGhlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFVSSSBmcm9tIGEgVVJJIHNwZWNpZmljYXRpb24gc3RyaW5nLiBJZiB0aGUgc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSAiZ2VuZXJpYwotICAgICAqIFVSSSIgc3ludGF4LCAodHdvIHNsYXNoZXMgZm9sbG93aW5nIHRoZSBmaXJzdCBjb2xvbiksIHRoZSBzcGVjaWZpY2F0aW9uIHdpbGwgYmUgcGFyc2VkCi0gICAgICogYWNjb3JkaW5nbHkgLSBzZXR0aW5nIHRoZSBzY2hlbWUsIHVzZXJpbmZvLCBob3N0LHBvcnQsIHBhdGgsIHF1ZXJ5IHN0cmluZyBhbmQgZnJhZ21lbnQgZmllbGRzCi0gICAgICogYXMgbmVjZXNzYXJ5LiBJZiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlICJnZW5lcmljIFVSSSIgc3ludGF4LCB0aGUgc3BlY2lmaWNhdGlvbgotICAgICAqIGlzIHBhcnNlZCBpbnRvIGEgc2NoZW1lIGFuZCBzY2hlbWUtc3BlY2lmaWMgcGFydCAoc3RvcmVkIGFzIHRoZSBwYXRoKSBvbmx5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBfdXJpU3BlYyB0aGUgVVJJIHNwZWNpZmljYXRpb24gc3RyaW5nIChjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3VyaVNwZWMgdmlvbGF0ZXMgYW55IHN5bnRheCBydWxlcwotICAgICAqLwotICAgIHB1YmxpYyBVUkkoU3RyaW5nIHBfdXJpU3BlYykgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMoKFVSSSludWxsLCBwX3VyaVNwZWMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBVUkkgZnJvbSBhIGJhc2UgVVJJIGFuZCBhIFVSSSBzcGVjaWZpY2F0aW9uIHN0cmluZy4gVGhlIFVSSSBzcGVjaWZpY2F0aW9uCi0gICAgICogc3RyaW5nIG1heSBiZSBhIHJlbGF0aXZlIFVSSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX2Jhc2UgICAgdGhlIGJhc2UgVVJJIChjYW5ub3QgYmUgbnVsbCBpZiBwX3VyaVNwZWMgaXMgbnVsbCBvciBlbXB0eSkKLSAgICAgKiBAcGFyYW0gcF91cmlTcGVjIHRoZSBVUkkgc3BlY2lmaWNhdGlvbiBzdHJpbmcgKGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5IGlmIHBfYmFzZSBpcyBudWxsKQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfdXJpU3BlYyB2aW9sYXRlcyBhbnkgc3ludGF4IHJ1bGVzCi0gICAgICovCi0gICAgcHVibGljIFVSSShVUkkgcF9iYXNlLCBTdHJpbmcgcF91cmlTcGVjKSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaW5pdGlhbGl6ZShwX2Jhc2UsIHBfdXJpU3BlYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFVSSSB0aGF0IGRvZXMgbm90IGZvbGxvdyB0aGUgZ2VuZXJpYyBVUkkgc3ludGF4LiBPbmx5IHRoZSBzY2hlbWUgYW5kCi0gICAgICogc2NoZW1lLXNwZWNpZmljIHBhcnQgKHN0b3JlZCBhcyB0aGUgcGF0aCkgYXJlIGluaXRpYWxpemVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfc2NoZW1lICAgICAgICAgICAgIHRoZSBVUkkgc2NoZW1lIChjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSkKLSAgICAgKiBAcGFyYW0gcF9zY2hlbWVTcGVjaWZpY1BhcnQgdGhlIHNjaGVtZS1zcGVjaWZpYyBwYXJ0IChjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3NjaGVtZSB2aW9sYXRlcyBhbnkgc3ludGF4IHJ1bGVzCi0gICAgICovCi0gICAgcHVibGljIFVSSShTdHJpbmcgcF9zY2hlbWUsIFN0cmluZyBwX3NjaGVtZVNwZWNpZmljUGFydCkKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpZiAocF9zY2hlbWUgPT0gbnVsbCB8fCBwX3NjaGVtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25zdHJ1Y3QgVVJJIHdpdGggbnVsbC9lbXB0eSBzY2hlbWUhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBfc2NoZW1lU3BlY2lmaWNQYXJ0ID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICBwX3NjaGVtZVNwZWNpZmljUGFydC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25zdHJ1Y3QgVVJJIHdpdGggbnVsbC9lbXB0eSBzY2hlbWUtc3BlY2lmaWMgcGFydCEiKTsKLSAgICAgICAgfQotICAgICAgICBzZXRTY2hlbWUocF9zY2hlbWUpOwotICAgICAgICBzZXRQYXRoKHBfc2NoZW1lU3BlY2lmaWNQYXJ0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVVJJIHRoYXQgZm9sbG93cyB0aGUgZ2VuZXJpYyBVUkkgc3ludGF4IGZyb20gaXRzIGNvbXBvbmVudCBwYXJ0cy4gRWFjaAotICAgICAqIGNvbXBvbmVudCBpcyB2YWxpZGF0ZWQgZm9yIHN5bnRheCBhbmQgc29tZSBiYXNpYyBzZW1hbnRpYyBjaGVja3MgYXJlIHBlcmZvcm1lZCBhcyB3ZWxsLiAgU2VlCi0gICAgICogdGhlIGluZGl2aWR1YWwgc2V0dGVyIG1ldGhvZHMgZm9yIHNwZWNpZmljcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3NjaGVtZSAgICAgIHRoZSBVUkkgc2NoZW1lIChjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSkKLSAgICAgKiBAcGFyYW0gcF9ob3N0ICAgICAgICB0aGUgaG9zdG5hbWUsIElQdjQgYWRkcmVzcyBvciBJUHY2IHJlZmVyZW5jZSBmb3IgdGhlIFVSSQotICAgICAqIEBwYXJhbSBwX3BhdGggICAgICAgIHRoZSBVUkkgcGF0aCAtIGlmIHRoZSBwYXRoIGNvbnRhaW5zICc/JyBvciAnIycsIHRoZW4gdGhlIHF1ZXJ5IHN0cmluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZC9vciBmcmFnbWVudCB3aWxsIGJlIHNldCBmcm9tIHRoZSBwYXRoOyBob3dldmVyLCBpZiB0aGUgcXVlcnkgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgYXJlIHNwZWNpZmllZCBib3RoIGluIHRoZSBwYXRoIGFuZCBhcyBzZXBhcmF0ZSBwYXJhbWV0ZXJzLCBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24KLSAgICAgKiBAcGFyYW0gcF9xdWVyeVN0cmluZyB0aGUgVVJJIHF1ZXJ5IHN0cmluZyAoY2Fubm90IGJlIHNwZWNpZmllZCBpZiBwYXRoIGlzIG51bGwpCi0gICAgICogQHBhcmFtIHBfZnJhZ21lbnQgICAgdGhlIFVSSSBmcmFnbWVudCAoY2Fubm90IGJlIHNwZWNpZmllZCBpZiBwYXRoIGlzIG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHZpb2xhdGVzIHN5bnRheCBydWxlcyBvciBzZW1hbnRpYyBydWxlcwotICAgICAqLwotICAgIHB1YmxpYyBVUkkoU3RyaW5nIHBfc2NoZW1lLCBTdHJpbmcgcF9ob3N0LCBTdHJpbmcgcF9wYXRoLAotICAgICAgICAgICAgICAgU3RyaW5nIHBfcXVlcnlTdHJpbmcsIFN0cmluZyBwX2ZyYWdtZW50KQotICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMocF9zY2hlbWUsIG51bGwsIHBfaG9zdCwgLTEsIHBfcGF0aCwgcF9xdWVyeVN0cmluZywgcF9mcmFnbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFVSSSB0aGF0IGZvbGxvd3MgdGhlIGdlbmVyaWMgVVJJIHN5bnRheCBmcm9tIGl0cyBjb21wb25lbnQgcGFydHMuIEVhY2gKLSAgICAgKiBjb21wb25lbnQgaXMgdmFsaWRhdGVkIGZvciBzeW50YXggYW5kIHNvbWUgYmFzaWMgc2VtYW50aWMgY2hlY2tzIGFyZSBwZXJmb3JtZWQgYXMgd2VsbC4gIFNlZQotICAgICAqIHRoZSBpbmRpdmlkdWFsIHNldHRlciBtZXRob2RzIGZvciBzcGVjaWZpY3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9zY2hlbWUgICAgICB0aGUgVVJJIHNjaGVtZSAoY2Fubm90IGJlIG51bGwgb3IgZW1wdHkpCi0gICAgICogQHBhcmFtIHBfdXNlcmluZm8gICAgdGhlIFVSSSB1c2VyaW5mbyAoY2Fubm90IGJlIHNwZWNpZmllZCBpZiBob3N0IGlzIG51bGwpCi0gICAgICogQHBhcmFtIHBfaG9zdCAgICAgICAgdGhlIGhvc3RuYW1lLCBJUHY0IGFkZHJlc3Mgb3IgSVB2NiByZWZlcmVuY2UgZm9yIHRoZSBVUkkKLSAgICAgKiBAcGFyYW0gcF9wb3J0ICAgICAgICB0aGUgVVJJIHBvcnQgKG1heSBiZSAtMSBmb3IgInVuc3BlY2lmaWVkIjsgY2Fubm90IGJlIHNwZWNpZmllZCBpZiBob3N0IGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbnVsbCkKLSAgICAgKiBAcGFyYW0gcF9wYXRoICAgICAgICB0aGUgVVJJIHBhdGggLSBpZiB0aGUgcGF0aCBjb250YWlucyAnPycgb3IgJyMnLCB0aGVuIHRoZSBxdWVyeSBzdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQvb3IgZnJhZ21lbnQgd2lsbCBiZSBzZXQgZnJvbSB0aGUgcGF0aDsgaG93ZXZlciwgaWYgdGhlIHF1ZXJ5IGFuZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50IGFyZSBzcGVjaWZpZWQgYm90aCBpbiB0aGUgcGF0aCBhbmQgYXMgc2VwYXJhdGUgcGFyYW1ldGVycywgYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gaXMgdGhyb3duCi0gICAgICogQHBhcmFtIHBfcXVlcnlTdHJpbmcgdGhlIFVSSSBxdWVyeSBzdHJpbmcgKGNhbm5vdCBiZSBzcGVjaWZpZWQgaWYgcGF0aCBpcyBudWxsKQotICAgICAqIEBwYXJhbSBwX2ZyYWdtZW50ICAgIHRoZSBVUkkgZnJhZ21lbnQgKGNhbm5vdCBiZSBzcGVjaWZpZWQgaWYgcGF0aCBpcyBudWxsKQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgcGFyYW1ldGVycyB2aW9sYXRlcyBzeW50YXggcnVsZXMgb3Igc2VtYW50aWMgcnVsZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJJKFN0cmluZyBwX3NjaGVtZSwgU3RyaW5nIHBfdXNlcmluZm8sCi0gICAgICAgICAgICAgICBTdHJpbmcgcF9ob3N0LCBpbnQgcF9wb3J0LCBTdHJpbmcgcF9wYXRoLAotICAgICAgICAgICAgICAgU3RyaW5nIHBfcXVlcnlTdHJpbmcsIFN0cmluZyBwX2ZyYWdtZW50KQotICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3NjaGVtZSA9PSBudWxsIHx8IHBfc2NoZW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKCJTY2hlbWUgaXMgcmVxdWlyZWQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9ob3N0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwX3VzZXJpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXJpbmZvIG1heSBub3QgYmUgc3BlY2lmaWVkIGlmIGhvc3QgaXMgbm90IHNwZWNpZmllZCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwX3BvcnQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlBvcnQgbWF5IG5vdCBiZSBzcGVjaWZpZWQgaWYgaG9zdCBpcyBub3Qgc3BlY2lmaWVkISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfcGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocF9wYXRoLmluZGV4T2YoJz8nKSAhPSAtMSAmJiBwX3F1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5IHN0cmluZyBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIHBhdGggYW5kIHF1ZXJ5IHN0cmluZyEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBfcGF0aC5pbmRleE9mKCcjJykgIT0gLTEgJiYgcF9mcmFnbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJGcmFnbWVudCBjYW5ub3QgYmUgc3BlY2lmaWVkIGluIGJvdGggdGhlIHBhdGggYW5kIGZyYWdtZW50ISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0U2NoZW1lKHBfc2NoZW1lKTsKLSAgICAgICAgc2V0SG9zdChwX2hvc3QpOwotICAgICAgICBzZXRQb3J0KHBfcG9ydCk7Ci0gICAgICAgIHNldFVzZXJpbmZvKHBfdXNlcmluZm8pOwotICAgICAgICBzZXRQYXRoKHBfcGF0aCk7Ci0gICAgICAgIHNldFF1ZXJ5U3RyaW5nKHBfcXVlcnlTdHJpbmcpOwotICAgICAgICBzZXRGcmFnbWVudChwX2ZyYWdtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIGFsbCBmaWVsZHMgb2YgdGhpcyBVUkkgZnJvbSBhbm90aGVyIFVSSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX290aGVyIHRoZSBVUkkgdG8gY29weSAoY2Fubm90IGJlIG51bGwpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoVVJJIHBfb3RoZXIpIHsKLSAgICAgICAgbV9zY2hlbWUgPSBwX290aGVyLmdldFNjaGVtZSgpOwotICAgICAgICBtX3VzZXJpbmZvID0gcF9vdGhlci5nZXRVc2VyaW5mbygpOwotICAgICAgICBtX2hvc3QgPSBwX290aGVyLmdldEhvc3QoKTsKLSAgICAgICAgbV9wb3J0ID0gcF9vdGhlci5nZXRQb3J0KCk7Ci0gICAgICAgIG1fcmVnQXV0aG9yaXR5ID0gcF9vdGhlci5nZXRSZWdCYXNlZEF1dGhvcml0eSgpOwotICAgICAgICBtX3BhdGggPSBwX290aGVyLmdldFBhdGgoKTsKLSAgICAgICAgbV9xdWVyeVN0cmluZyA9IHBfb3RoZXIuZ2V0UXVlcnlTdHJpbmcoKTsKLSAgICAgICAgbV9mcmFnbWVudCA9IHBfb3RoZXIuZ2V0RnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyB0aGlzIFVSSSBmcm9tIGEgYmFzZSBVUkkgYW5kIGEgVVJJIHNwZWNpZmljYXRpb24gc3RyaW5nLiBTZWUgUkZDIDIzOTYgU2VjdGlvbiA0IGFuZAotICAgICAqIEFwcGVuZGl4IEIgZm9yIHNwZWNpZmljYXRpb25zIG9uIHBhcnNpbmcgdGhlIFVSSSBhbmQgU2VjdGlvbiA1IGZvciBzcGVjaWZpY2F0aW9ucyBvbiByZXNvbHZpbmcKLSAgICAgKiByZWxhdGl2ZSBVUklzIGFuZCByZWxhdGl2ZSBwYXRocy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX2Jhc2UgICAgdGhlIGJhc2UgVVJJIChtYXkgYmUgbnVsbCBpZiBwX3VyaVNwZWMgaXMgYW4gYWJzb2x1dGUgVVJJKQotICAgICAqIEBwYXJhbSBwX3VyaVNwZWMgdGhlIFVSSSBzcGVjIHN0cmluZyB3aGljaCBtYXkgYmUgYW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJIChjYW4gb25seSBiZQotICAgICAqICAgICAgICAgICAgICAgICAgbnVsbC9lbXB0eSBpZiBwX2Jhc2UgaXMgbm90IG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF9iYXNlIGlzIG51bGwgYW5kIHBfdXJpU3BlYyBpcyBub3QgYW4gYWJzb2x1dGUgVVJJIG9yIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF91cmlTcGVjIHZpb2xhdGVzIHN5bnRheCBydWxlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKFVSSSBwX2Jhc2UsIFN0cmluZyBwX3VyaVNwZWMpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdXJpU3BlYyA9IHBfdXJpU3BlYzsKLSAgICAgICAgaW50IHVyaVNwZWNMZW4gPSAodXJpU3BlYyAhPSBudWxsKSA/IHVyaVNwZWMubGVuZ3RoKCkgOiAwOwotCi0gICAgICAgIGlmIChwX2Jhc2UgPT0gbnVsbCAmJiB1cmlTcGVjTGVuID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5pdGlhbGl6ZSBVUkkgd2l0aCBlbXB0eSBwYXJhbWV0ZXJzLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8ganVzdCBtYWtlIGEgY29weSBvZiB0aGUgYmFzZSBpZiBzcGVjIGlzIGVtcHR5Ci0gICAgICAgIGlmICh1cmlTcGVjTGVuID09IDApIHsKLSAgICAgICAgICAgIGluaXRpYWxpemUocF9iYXNlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHNjaGVtZSwgd2hpY2ggbXVzdCBiZSBiZWZvcmUgJy8nLCAnPycgb3IgJyMnLiBBbHNvIGhhbmRsZQotICAgICAgICAvLyBuYW1lcyB3aXRoIERPUyBkcml2ZSBsZXR0ZXJzICgnRDonKSwgc28gMS1jaGFyYWN0ZXIgc2NoZW1lcyBhcmUgbm90Ci0gICAgICAgIC8vIGFsbG93ZWQuCi0gICAgICAgIGludCBjb2xvbklkeCA9IHVyaVNwZWMuaW5kZXhPZignOicpOwotICAgICAgICBpZiAoY29sb25JZHggIT0gLTEpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzZWFyY2hGcm9tID0gY29sb25JZHggLSAxOwotICAgICAgICAgICAgLy8gc2VhcmNoIGJhY2t3YXJkcyBzdGFydGluZyBmcm9tIGNoYXJhY3RlciBiZWZvcmUgJzonLgotICAgICAgICAgICAgaW50IHNsYXNoSWR4ID0gdXJpU3BlYy5sYXN0SW5kZXhPZignLycsIHNlYXJjaEZyb20pOwotICAgICAgICAgICAgaW50IHF1ZXJ5SWR4ID0gdXJpU3BlYy5sYXN0SW5kZXhPZignPycsIHNlYXJjaEZyb20pOwotICAgICAgICAgICAgaW50IGZyYWdtZW50SWR4ID0gdXJpU3BlYy5sYXN0SW5kZXhPZignIycsIHNlYXJjaEZyb20pOwotCi0gICAgICAgICAgICBpZiAoY29sb25JZHggPCAyIHx8IHNsYXNoSWR4ICE9IC0xIHx8Ci0gICAgICAgICAgICAgICAgICAgIHF1ZXJ5SWR4ICE9IC0xIHx8IGZyYWdtZW50SWR4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBzdGFuZGFsb25lIGJhc2UgaXMgYSB2YWxpZCBVUkkgYWNjb3JkaW5nIHRvIHNwZWMKLSAgICAgICAgICAgICAgICBpZiAoY29sb25JZHggPT0gMCB8fCAocF9iYXNlID09IG51bGwgJiYgZnJhZ21lbnRJZHggIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigiTm8gc2NoZW1lIGZvdW5kIGluIFVSSS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluaXRpYWxpemVTY2hlbWUodXJpU3BlYyk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtX3NjaGVtZS5sZW5ndGgoKSArIDE7Ci0KLSAgICAgICAgICAgICAgICAvLyBOZWl0aGVyICdzY2hlbWU6JyBvciAnc2NoZW1lOiNmcmFnbWVudCcgYXJlIHZhbGlkIFVSSXMuCi0gICAgICAgICAgICAgICAgaWYgKGNvbG9uSWR4ID09IHVyaVNwZWNMZW4gLSAxIHx8IHVyaVNwZWMuY2hhckF0KGNvbG9uSWR4ICsgMSkgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oIlNjaGVtZSBzcGVjaWZpYyBwYXJ0IGNhbm5vdCBiZSBlbXB0eS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVHdvIHNsYXNoZXMgbWVhbnMgd2UgbWF5IGhhdmUgYXV0aG9yaXR5LCBidXQgZGVmaW5pdGVseSBtZWFucyB3ZSdyZSBlaXRoZXIKLSAgICAgICAgLy8gbWF0Y2hpbmcgbmV0X3BhdGggb3IgYWJzX3BhdGguIFRoZXNlIHR3byBwcm9kdWN0aW9ucyBhcmUgYW1iaWd1b3VzIGluIHRoYXQKLSAgICAgICAgLy8gZXZlcnkgbmV0X3BhdGggKGV4Y2VwdCB0aG9zZSBjb250YWluaW5nIGFuIElQdjZSZWZlcmVuY2UpIGlzIGFuIGFic19wYXRoLgotICAgICAgICAvLyBSRkMgMjM5NiByZXNvbHZlcyB0aGlzIGFtYmlndWl0eSBieSBhcHBseWluZyBhIGdyZWVkeSBsZWZ0IG1vc3QgbWF0Y2hpbmcgcnVsZS4KLSAgICAgICAgLy8gVHJ5IG1hdGNoaW5nIG5ldF9wYXRoIGZpcnN0LCBhbmQgaWYgdGhhdCBmYWlscyB3ZSBkb24ndCBoYXZlIGF1dGhvcml0eSBzbwotICAgICAgICAvLyB0aGVuIGF0dGVtcHQgdG8gbWF0Y2ggYWJzX3BhdGguCi0gICAgICAgIC8vCi0gICAgICAgIC8vIG5ldF9wYXRoID0gIi8vIiBhdXRob3JpdHkgWyBhYnNfcGF0aCBdCi0gICAgICAgIC8vIGFic19wYXRoID0gIi8iICBwYXRoX3NlZ21lbnRzCi0gICAgICAgIGlmICgoKGluZGV4ICsgMSkgPCB1cmlTcGVjTGVuKSAmJgotICAgICAgICAgICAgICAgICh1cmlTcGVjLmNoYXJBdChpbmRleCkgPT0gJy8nICYmIHVyaVNwZWMuY2hhckF0KGluZGV4ICsgMSkgPT0gJy8nKSkgewotICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgIGludCBzdGFydFBvcyA9IGluZGV4OwotCi0gICAgICAgICAgICAvLyBBdXRob3JpdHkgd2lsbCBiZSBldmVyeXRoaW5nIHVwIHRvIHBhdGgsIHF1ZXJ5IG9yIGZyYWdtZW50Ci0gICAgICAgICAgICBjaGFyIHRlc3RDaGFyID0gJ1wwJzsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IHVyaVNwZWNMZW4pIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IHVyaVNwZWMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJy8nIHx8IHRlc3RDaGFyID09ICc/JyB8fCB0ZXN0Q2hhciA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcGFyc2UgYXV0aG9yaXR5LiBJZiB0aGUgc2VjdGlvbiBpcyBhbiBlbXB0eSBzdHJpbmcKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYSB2YWxpZCBzZXJ2ZXIgYmFzZWQgYXV0aG9yaXR5LCBzbyBzZXQgdGhlIGhvc3QgdG8gdGhpcwotICAgICAgICAgICAgLy8gdmFsdWUuCi0gICAgICAgICAgICBpZiAoaW5kZXggPiBzdGFydFBvcykgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGF1dGhvcml0eSB3ZSBuZWVkIHRvIGJhY2sgdXAuIEF0dGVtcHQgdG8KLSAgICAgICAgICAgICAgICAvLyBtYXRjaCBhZ2FpbnN0IGFic19wYXRoIG5leHQuCi0gICAgICAgICAgICAgICAgaWYgKCFpbml0aWFsaXplQXV0aG9yaXR5KHVyaVNwZWMuc3Vic3RyaW5nKHN0YXJ0UG9zLCBpbmRleCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gc3RhcnRQb3MgLSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9ob3N0ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0aWFsaXplUGF0aCh1cmlTcGVjLCBpbmRleCk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBVUkkgdG8gYmFzZSBVUkkgLSBzZWUgUkZDIDIzOTYgU2VjdGlvbiA1LjIKLSAgICAgICAgLy8gSW4gc29tZSBjYXNlcywgaXQgbWlnaHQgbWFrZSBtb3JlIHNlbnNlIHRvIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAvLyAod2hlbiBzY2hlbWUgaXMgc3BlY2lmaWVkIGlzIHRoZSBzdHJpbmcgc3BlYyBhbmQgdGhlIGJhc2UgVVJJCi0gICAgICAgIC8vIGlzIGFsc28gc3BlY2lmaWVkLCBmb3IgZXhhbXBsZSksIGJ1dCB3ZSdyZSBqdXN0IGZvbGxvd2luZyB0aGUKLSAgICAgICAgLy8gUkZDIHNwZWNpZmljYXRpb25zCi0gICAgICAgIGlmIChwX2Jhc2UgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgY3VycmVudCBkb2MgLSBSRkMgMjM5NiA1LjIgIzIKLSAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHRoZSBSRkMgc3BlYyBpbiB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBpbmNsdWRlIHRoZSBjaGVjayBmb3IgcXVlcnkgc3RyaW5nIGJlaW5nIG51bGwKLSAgICAgICAgICAgIC8vIC0gdGhpcyBoYW5kbGVzIGNhc2VzIHdoZXJlIHRoZSB1cmlzcGVjIGlzIGp1c3QgYSBxdWVyeQotICAgICAgICAgICAgLy8gc3RyaW5nIG9yIGEgZnJhZ21lbnQgKGUuZy4gIj95IiBvciAiI3MiKSAtCi0gICAgICAgICAgICAvLyBzZWUgPGh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvfmZpZWxkaW5nL3VybC90ZXN0MS5odG1sPiB3aGljaAotICAgICAgICAgICAgLy8gaWRlbnRpZmllZCB0aGlzIGFzIGEgYnVnIGluIHRoZSBSRkMKLSAgICAgICAgICAgIGlmIChtX3BhdGgubGVuZ3RoKCkgPT0gMCAmJiBtX3NjaGVtZSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIG1faG9zdCA9PSBudWxsICYmIG1fcmVnQXV0aG9yaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtX3NjaGVtZSA9IHBfYmFzZS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgICAgICBtX3VzZXJpbmZvID0gcF9iYXNlLmdldFVzZXJpbmZvKCk7Ci0gICAgICAgICAgICAgICAgbV9ob3N0ID0gcF9iYXNlLmdldEhvc3QoKTsKLSAgICAgICAgICAgICAgICBtX3BvcnQgPSBwX2Jhc2UuZ2V0UG9ydCgpOwotICAgICAgICAgICAgICAgIG1fcmVnQXV0aG9yaXR5ID0gcF9iYXNlLmdldFJlZ0Jhc2VkQXV0aG9yaXR5KCk7Ci0gICAgICAgICAgICAgICAgbV9wYXRoID0gcF9iYXNlLmdldFBhdGgoKTsKLQotICAgICAgICAgICAgICAgIGlmIChtX3F1ZXJ5U3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9xdWVyeVN0cmluZyA9IHBfYmFzZS5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzY2hlbWUgLSBSRkMgMjM5NiA1LjIgIzMKLSAgICAgICAgICAgIC8vIGlmIHdlIGZvdW5kIGEgc2NoZW1lLCBpdCBtZWFucyBhYnNvbHV0ZSBVUkksIHNvIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgIGlmIChtX3NjaGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbV9zY2hlbWUgPSBwX2Jhc2UuZ2V0U2NoZW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGF1dGhvcml0eSAtIFJGQyAyMzk2IDUuMiAjNAotICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgYSBob3N0LCB0aGVuIHdlJ3ZlIGdvdCBhIG5ldHdvcmsgcGF0aCwgc28gd2UncmUgZG9uZQotICAgICAgICAgICAgaWYgKG1faG9zdCA9PSBudWxsICYmIG1fcmVnQXV0aG9yaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtX3VzZXJpbmZvID0gcF9iYXNlLmdldFVzZXJpbmZvKCk7Ci0gICAgICAgICAgICAgICAgbV9ob3N0ID0gcF9iYXNlLmdldEhvc3QoKTsKLSAgICAgICAgICAgICAgICBtX3BvcnQgPSBwX2Jhc2UuZ2V0UG9ydCgpOwotICAgICAgICAgICAgICAgIG1fcmVnQXV0aG9yaXR5ID0gcF9iYXNlLmdldFJlZ0Jhc2VkQXV0aG9yaXR5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGFic29sdXRlIHBhdGggLSBSRkMgMjM5NiA1LjIgIzUKLSAgICAgICAgICAgIGlmIChtX3BhdGgubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgIG1fcGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aAotICAgICAgICAgICAgLy8gUkZDIDIzOTYgNS4yICM2Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGJhc2VQYXRoID0gcF9iYXNlLmdldFBhdGgoKTsKLQotICAgICAgICAgICAgLy8gNmEgLSBnZXQgYWxsIGJ1dCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBiYXNlIFVSSSBwYXRoCi0gICAgICAgICAgICBpZiAoYmFzZVBhdGggIT0gbnVsbCAmJiBiYXNlUGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gYmFzZVBhdGgubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBpZiAobGFzdFNsYXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGggPSBiYXNlUGF0aC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BhdGgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9ICIvIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gNmIgLSBhcHBlbmQgdGhlIHJlbGF0aXZlIFVSSSBwYXRoCi0gICAgICAgICAgICBwYXRoID0gcGF0aC5jb25jYXQobV9wYXRoKTsKLQotICAgICAgICAgICAgLy8gNmMgLSByZW1vdmUgYWxsICIuLyIgd2hlcmUgIi4iIGlzIGEgY29tcGxldGUgcGF0aCBzZWdtZW50Ci0gICAgICAgICAgICBpbmRleCA9IC0xOwotICAgICAgICAgICAgd2hpbGUgKChpbmRleCA9IHBhdGguaW5kZXhPZigiLy4vIikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSkuY29uY2F0KHBhdGguc3Vic3RyaW5nKGluZGV4ICsgMykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyA2ZCAtIHJlbW92ZSAiLiIgaWYgcGF0aCBlbmRzIHdpdGggIi4iIGFzIGEgY29tcGxldGUgcGF0aCBzZWdtZW50Ci0gICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgiLy4iKSkgewotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDZlIC0gcmVtb3ZlIGFsbCAiPHNlZ21lbnQ+Ly4uLyIgd2hlcmUgIjxzZWdtZW50PiIgaXMgYSBjb21wbGV0ZQotICAgICAgICAgICAgLy8gcGF0aCBzZWdtZW50IG5vdCBlcXVhbCB0byAiLi4iCi0gICAgICAgICAgICBpbmRleCA9IDE7Ci0gICAgICAgICAgICBpbnQgc2VnSW5kZXggPSAtMTsKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wU3RyaW5nID0gbnVsbDsKLQotICAgICAgICAgICAgd2hpbGUgKChpbmRleCA9IHBhdGguaW5kZXhPZigiLy4uLyIsIGluZGV4KSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGVtcFN0cmluZyA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZigiLy4uLyIpKTsKLSAgICAgICAgICAgICAgICBzZWdJbmRleCA9IHRlbXBTdHJpbmcubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VnSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wU3RyaW5nLnN1YnN0cmluZyhzZWdJbmRleCkuZXF1YWxzKCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgc2VnSW5kZXggKyAxKS5jb25jYXQocGF0aC5zdWJzdHJpbmcoaW5kZXggKyA0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHNlZ0luZGV4OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIDZmIC0gcmVtb3ZlIGVuZGluZyAiPHNlZ21lbnQ+Ly4uIiB3aGVyZSAiPHNlZ21lbnQ+IiBpcyBhCi0gICAgICAgICAgICAvLyBjb21wbGV0ZSBwYXRoIHNlZ21lbnQKLSAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvLi4iKSkgewotICAgICAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gMyk7Ci0gICAgICAgICAgICAgICAgc2VnSW5kZXggPSB0ZW1wU3RyaW5nLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlZ0luZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBzZWdJbmRleCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcGF0aCA9IHBhdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBzY2hlbWUgZm9yIHRoaXMgVVJJIGZyb20gYSBVUkkgc3RyaW5nIHNwZWMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF91cmlTcGVjIHRoZSBVUkkgc3BlY2lmaWNhdGlvbiAoY2Fubm90IGJlIG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgVVJJIGRvZXMgbm90IGhhdmUgYSBjb25mb3JtYW50IHNjaGVtZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2NoZW1lKFN0cmluZyBwX3VyaVNwZWMpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHVyaVNwZWNMZW4gPSBwX3VyaVNwZWMubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIFN0cmluZyBzY2hlbWUgPSBudWxsOwotICAgICAgICBjaGFyIHRlc3RDaGFyID0gJ1wwJzsKLQotICAgICAgICB3aGlsZSAoaW5kZXggPCB1cmlTcGVjTGVuKSB7Ci0gICAgICAgICAgICB0ZXN0Q2hhciA9IHBfdXJpU3BlYy5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICc6JyB8fCB0ZXN0Q2hhciA9PSAnLycgfHwKLSAgICAgICAgICAgICAgICAgICAgdGVzdENoYXIgPT0gJz8nIHx8IHRlc3RDaGFyID09ICcjJykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgfQotICAgICAgICBzY2hlbWUgPSBwX3VyaVNwZWMuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotICAgICAgICBpZiAoc2NoZW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oIk5vIHNjaGVtZSBmb3VuZCBpbiBVUkkuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRTY2hlbWUoc2NoZW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIGF1dGhvcml0eSAoZWl0aGVyIHNlcnZlciBvciByZWdpc3RyeSBiYXNlZCkgZm9yIHRoaXMgVVJJIGZyb20gYSBVUkkgc3RyaW5nCi0gICAgICogc3BlYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3VyaVNwZWMgdGhlIFVSSSBzcGVjaWZpY2F0aW9uIChjYW5ub3QgYmUgbnVsbCkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBtYXRjaGVkIHNlcnZlciBvciByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZUF1dGhvcml0eShTdHJpbmcgcF91cmlTcGVjKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGVuZCA9IHBfdXJpU3BlYy5sZW5ndGgoKTsKLQotICAgICAgICBjaGFyIHRlc3RDaGFyID0gJ1wwJzsKLSAgICAgICAgU3RyaW5nIHVzZXJpbmZvID0gbnVsbDsKLQotICAgICAgICAvLyB1c2VyaW5mbyBpcyBldmVyeXRoaW5nIHVwIHRvIEAKLSAgICAgICAgaWYgKHBfdXJpU3BlYy5pbmRleE9mKCdAJywgc3RhcnQpICE9IC0xKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IHBfdXJpU3BlYy5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnQCcpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c2VyaW5mbyA9IHBfdXJpU3BlYy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBob3N0IGlzIGV2ZXJ5dGhpbmcgdXAgdG8gbGFzdCAnOicsIG9yIHVwIHRvCi0gICAgICAgIC8vIGFuZCBpbmNsdWRpbmcgJ10nIGlmIGZvbGxvd2VkIGJ5ICc6Jy4KLSAgICAgICAgU3RyaW5nIGhvc3QgPSBudWxsOwotICAgICAgICBzdGFydCA9IGluZGV4OwotICAgICAgICBib29sZWFuIGhhc1BvcnQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICBpZiAocF91cmlTcGVjLmNoYXJBdChzdGFydCkgPT0gJ1snKSB7Ci0gICAgICAgICAgICAgICAgaW50IGJyYWNrZXRJbmRleCA9IHBfdXJpU3BlYy5pbmRleE9mKCddJywgc3RhcnQpOwotICAgICAgICAgICAgICAgIGluZGV4ID0gKGJyYWNrZXRJbmRleCAhPSAtMSkgPyBicmFja2V0SW5kZXggOiBlbmQ7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGVuZCAmJiBwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMSkgPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1BvcnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvbG9uSW5kZXggPSBwX3VyaVNwZWMubGFzdEluZGV4T2YoJzonLCBlbmQpOwotICAgICAgICAgICAgICAgIGluZGV4ID0gKGNvbG9uSW5kZXggPiBzdGFydCkgPyBjb2xvbkluZGV4IDogZW5kOwotICAgICAgICAgICAgICAgIGhhc1BvcnQgPSAoaW5kZXggIT0gZW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBob3N0ID0gcF91cmlTcGVjLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotICAgICAgICBpbnQgcG9ydCA9IC0xOwotICAgICAgICBpZiAoaG9zdC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIHBvcnQKLSAgICAgICAgICAgIGlmIChoYXNQb3J0KSB7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGluZGV4OwotICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFN0ciA9IHBfdXJpU3BlYy5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydFN0ci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUkVWSVNJVDogUmVtb3ZlIHRoaXMgY29kZS4KLSAgICAgICAgICAgICAgICAgICAgLyoqIGZvciAoaW50IGkgPSAwOyBpIDwgcG9ydFN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRGlnaXQocG9ydFN0ci5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgcG9ydFN0ciArCi0gICAgICAgICAgICAgICAgICAgICAiIGlzIGludmFsaWQuIFBvcnQgc2hvdWxkIG9ubHkgY29udGFpbiBkaWdpdHMhIik7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9KiovCi0gICAgICAgICAgICAgICAgICAgIC8vIFJFVklTSVQ6IFJlbW92ZSB0aGlzIGNvZGUuCi0gICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHBvcnQgdmFsdWUgYXMgc3RyaW5nIGluc3RlYWQgb2YgaW50ZWdlci4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnRTdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gLTEpIC0tcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IC0yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzVmFsaWRTZXJ2ZXJCYXNlZEF1dGhvcml0eShob3N0LCBwb3J0LCB1c2VyaW5mbykpIHsKLSAgICAgICAgICAgIG1faG9zdCA9IGhvc3Q7Ci0gICAgICAgICAgICBtX3BvcnQgPSBwb3J0OwotICAgICAgICAgICAgbV91c2VyaW5mbyA9IHVzZXJpbmZvOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm90ZTogUmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSBhCi0gICAgICAgIC8vIG5ldyBzcGVjIGZvciBVUkkgd2hpY2ggd291bGQgb2Jzb2xldGUgUkZDIDIzOTYuIElmIHRoZQotICAgICAgICAvLyBzcGVjIGlzIGFkZGVkIHRvIFhNTCBlcnJhdGEsIHByb2Nlc3Npbmcgb2YgcmVnX25hbWUKLSAgICAgICAgLy8gbmVlZHMgdG8gYmUgcmVtb3ZlZC4gLSBtcmdsYXZhcy4KLSAgICAgICAgZWxzZSBpZiAoaXNWYWxpZFJlZ2lzdHJ5QmFzZWRBdXRob3JpdHkocF91cmlTcGVjKSkgewotICAgICAgICAgICAgbV9yZWdBdXRob3JpdHkgPSBwX3VyaVNwZWM7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb21wb25lbnRzIGhvc3QsIHBvcnQsIGFuZCB1c2VyIGluZm8gYXJlIHZhbGlkIGFzIGEgc2VydmVyIGF1dGhvcml0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBob3N0ICAgICB0aGUgaG9zdCBjb21wb25lbnQgb2YgYXV0aG9yaXR5Ci0gICAgICogQHBhcmFtIHBvcnQgICAgIHRoZSBwb3J0IG51bWJlciBjb21wb25lbnQgb2YgYXV0aG9yaXR5Ci0gICAgICogQHBhcmFtIHVzZXJpbmZvIHRoZSB1c2VyIGluZm8gY29tcG9uZW50IG9mIGF1dGhvcml0eQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gaG9zdCwgcG9ydCwgYW5kIHVzZXJpbmZvIGNvbXBvc2UgYSB2YWxpZCBzZXJ2ZXIgYXV0aG9yaXR5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRTZXJ2ZXJCYXNlZEF1dGhvcml0eShTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB1c2VyaW5mbykgewotCi0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBob3N0IGlzIHdlbGwgZm9ybWVkLgotICAgICAgICBpZiAoIWlzV2VsbEZvcm1lZEFkZHJlc3MoaG9zdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRoYXQgcG9ydCBpcyB3ZWxsIGZvcm1lZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFJFVklTSVQ6IFRoZXJlJ3Mgbm8gcmVzdHJpY3Rpb24gb24gcG9ydCB2YWx1ZSByYW5nZXMsIGJ1dAotICAgICAgICAvLyBwZXJmb3JtIHRoZSBzYW1lIGNoZWNrIGFzIGluIHNldFBvcnQgdG8gYmUgY29uc2lzdGVudC4gUGFzcwotICAgICAgICAvLyBpbiBhIHN0cmluZyB0byB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuCi0gICAgICAgIGlmIChwb3J0IDwgLTEgfHwgcG9ydCA+IDY1NTM1KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0aGF0IHVzZXJpbmZvIGlzIHdlbGwgZm9ybWVkIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgaWYgKHVzZXJpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFVzZXJpbmZvIGNhbiBjb250YWluIGFscGhhbnVtZXJpY3MsIG1hcmsgY2hhcmFjdGVycywgZXNjYXBlZAotICAgICAgICAgICAgLy8gYW5kICc7JywnOicsJyYnLCc9JywnKycsJyQnLCcsJwotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIGludCBlbmQgPSB1c2VyaW5mby5sZW5ndGgoKTsKLSAgICAgICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGVzdENoYXIgPSB1c2VyaW5mby5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMiA+PSBlbmQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgodXNlcmluZm8uY2hhckF0KGluZGV4ICsgMSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KHVzZXJpbmZvLmNoYXJBdChpbmRleCArIDIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNVc2VyaW5mb0NoYXJhY3Rlcih0ZXN0Q2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGF1dGhvcml0eSB0aGUgYXV0aG9yaXR5IGNvbXBvbmVudCBvZiBhIFVSSQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRSZWdpc3RyeUJhc2VkQXV0aG9yaXR5KFN0cmluZyBhdXRob3JpdHkpIHsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgaW50IGVuZCA9IGF1dGhvcml0eS5sZW5ndGgoKTsKLSAgICAgICAgY2hhciB0ZXN0Q2hhcjsKLQotICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHsKLSAgICAgICAgICAgIHRlc3RDaGFyID0gYXV0aG9yaXR5LmNoYXJBdChpbmRleCk7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciB2YWxpZCBlc2NhcGUgc2VxdWVuY2UKLSAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KGF1dGhvcml0eS5jaGFyQXQoaW5kZXggKyAxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChhdXRob3JpdHkuY2hhckF0KGluZGV4ICsgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNhbiBjaGVjayBhZ2FpbnN0IHBhdGggY2hhcmFjdGVycyBiZWNhdXNlIHRoZSBzZXQKLSAgICAgICAgICAgIC8vIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgJy8nIHdoaWNoIHdlJ3ZlIGFscmVhZHkgZXhjbHVkZWQuCi0gICAgICAgICAgICBlbHNlIGlmICghaXNQYXRoQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgcGF0aCBmb3IgdGhpcyBVUkkgZnJvbSBhIFVSSSBzdHJpbmcgc3BlYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3VyaVNwZWMgICAgIHRoZSBVUkkgc3BlY2lmaWNhdGlvbiAoY2Fubm90IGJlIG51bGwpCi0gICAgICogQHBhcmFtIHBfblN0YXJ0SW5kZXggdGhlIGluZGV4IHRvIGJlZ2luIHNjYW5uaW5nIGZyb20KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3VyaVNwZWMgdmlvbGF0ZXMgc3ludGF4IHJ1bGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYXRoKFN0cmluZyBwX3VyaVNwZWMsIGludCBwX25TdGFydEluZGV4KQotICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3VyaVNwZWMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbml0aWFsaXplIHBhdGggZnJvbSBudWxsIHN0cmluZyEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IHBfblN0YXJ0SW5kZXg7Ci0gICAgICAgIGludCBzdGFydCA9IHBfblN0YXJ0SW5kZXg7Ci0gICAgICAgIGludCBlbmQgPSBwX3VyaVNwZWMubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXIgdGVzdENoYXIgPSAnXDAnOwotCi0gICAgICAgIC8vIHBhdGggLSBldmVyeXRoaW5nIHVwIHRvIHF1ZXJ5IHN0cmluZyBvciBmcmFnbWVudAotICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgIC8vIFJGQyAyNzMyIG9ubHkgYWxsb3dzICdbJyBhbmQgJ10nIHRvIGFwcGVhciBpbiB0aGUgb3BhcXVlIHBhcnQuCi0gICAgICAgICAgICBpZiAoZ2V0U2NoZW1lKCkgPT0gbnVsbCB8fCBwX3VyaVNwZWMuY2hhckF0KHN0YXJ0KSA9PSAnLycpIHsKLQotICAgICAgICAgICAgICAgIC8vIFNjYW4gcGF0aC4KLSAgICAgICAgICAgICAgICAvLyBhYnNfcGF0aCA9ICIvIiAgcGF0aF9zZWdtZW50cwotICAgICAgICAgICAgICAgIC8vIHJlbF9wYXRoID0gcmVsX3NlZ21lbnQgWyBhYnNfcGF0aCBdCi0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RDaGFyID0gcF91cmlTcGVjLmNoYXJBdChpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHZhbGlkIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0aCBjb250YWlucyBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCBzZWdtZW50cyBjYW5ub3QgY29udGFpbiAnWycgb3IgJ10nIHNpbmNlIHBjaGFyCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y3Rpb24gd2FzIG5vdCBjaGFuZ2VkIGJ5IFJGQyAyNzMyLgotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNQYXRoQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICc/JyB8fCB0ZXN0Q2hhciA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXRoIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyOiAiICsgdGVzdENoYXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIFNjYW4gb3BhcXVlIHBhcnQuCi0gICAgICAgICAgICAgICAgLy8gb3BhcXVlX3BhcnQgPSB1cmljX25vX3NsYXNoICp1cmljCi0gICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RDaGFyID0gcF91cmlTcGVjLmNoYXJBdChpbmRleCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICc/JyB8fCB0ZXN0Q2hhciA9PSAnIycpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHZhbGlkIGVzY2FwZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAyID49IGVuZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BhcXVlIHBhcnQgY29udGFpbnMgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzY2hlbWUgc3BlY2lmaWMgcGFydCBpcyBvcGFxdWUsIGl0IGNhbiBjb250YWluICdbJwotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgJ10nLiB1cmljX25vX3NsYXNoIHdhc24ndCBtb2RpZmllZCBieSBSRkMgMjczMiwgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgLy8gSSd2ZSBpbnRlcnByZXRlZCBhcyBhbiBlcnJvciBpbiB0aGUgc3BlYywgc2luY2UgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb2R1Y3Rpb24gc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gKHVyaWMgLSAnLycpLCBhbmQgdXJpYwotICAgICAgICAgICAgICAgICAgICAvLyBjb250YWlucyAnWycgYW5kICddJy4gLSBtcmdsYXZhcwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNVUklDaGFyYWN0ZXIodGVzdENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BhcXVlIHBhcnQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICIgKyB0ZXN0Q2hhcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV9wYXRoID0gcF91cmlTcGVjLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotCi0gICAgICAgIC8vIHF1ZXJ5IC0gc3RhcnRzIHdpdGggPyBhbmQgdXAgdG8gZnJhZ21lbnQgb3IgZW5kCi0gICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnPycpIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBzdGFydCA9IGluZGV4OwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGVzdENoYXIgPSBwX3VyaVNwZWMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGVzdENoYXIgPT0gJyUnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDIgPj0gZW5kIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzSGV4KHBfdXJpU3BlYy5jaGFyQXQoaW5kZXggKyAxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5IHN0cmluZyBjb250YWlucyBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVVJJQ2hhcmFjdGVyKHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeSBzdHJpbmcgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICIgKyB0ZXN0Q2hhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3F1ZXJ5U3RyaW5nID0gcF91cmlTcGVjLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZnJhZ21lbnQgLSBzdGFydHMgd2l0aCAjCi0gICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnIycpIHsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICBzdGFydCA9IGluZGV4OwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0gICAgICAgICAgICAgICAgdGVzdENoYXIgPSBwX3VyaVNwZWMuY2hhckF0KGluZGV4KTsKLQotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMiA+PSBlbmQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91cmlTcGVjLmNoYXJBdChpbmRleCArIDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaVNwZWMuY2hhckF0KGluZGV4ICsgMikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnQgY29udGFpbnMgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UhIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1VSSUNoYXJhY3Rlcih0ZXN0Q2hhcikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXI6ICIgKyB0ZXN0Q2hhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2ZyYWdtZW50ID0gcF91cmlTcGVjLnN1YnN0cmluZyhzdGFydCwgaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzY2hlbWUgZm9yIHRoaXMgVVJJLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2NoZW1lIGZvciB0aGlzIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkgewotICAgICAgICByZXR1cm4gbV9zY2hlbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzY2hlbWUtc3BlY2lmaWMgcGFydCBmb3IgdGhpcyBVUkkgKGV2ZXJ5dGhpbmcgZm9sbG93aW5nIHRoZSBzY2hlbWUgYW5kIHRoZSBmaXJzdAotICAgICAqIGNvbG9uKS4gU2VlIFJGQyAyMzk2IFNlY3Rpb24gNS4yIGZvciBzcGVjLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2NoZW1lLXNwZWNpZmljIHBhcnQgZm9yIHRoaXMgVVJJCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWVTcGVjaWZpY1BhcnQoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzY2hlbWVzcGVjID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGlmIChtX2hvc3QgIT0gbnVsbCB8fCBtX3JlZ0F1dGhvcml0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZCgiLy8iKTsKLQotICAgICAgICAgICAgLy8gU2VydmVyIGJhc2VkIGF1dGhvcml0eS4KLSAgICAgICAgICAgIGlmIChtX2hvc3QgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgaWYgKG1fdXNlcmluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZChtX3VzZXJpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQoJ0AnKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZChtX2hvc3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1fcG9ydCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZCgnOicpOwotICAgICAgICAgICAgICAgICAgICBzY2hlbWVzcGVjLmFwcGVuZChtX3BvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFJlZ2lzdHJ5IGJhc2VkIGF1dGhvcml0eS4KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKG1fcmVnQXV0aG9yaXR5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQoKG1fcGF0aCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fcXVlcnlTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQoJz8nKTsKLSAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKG1fcXVlcnlTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fZnJhZ21lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZW1lc3BlYy5hcHBlbmQoJyMnKTsKLSAgICAgICAgICAgIHNjaGVtZXNwZWMuYXBwZW5kKG1fZnJhZ21lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjaGVtZXNwZWMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHVzZXJpbmZvIGZvciB0aGlzIFVSSS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHVzZXJpbmZvIGZvciB0aGlzIFVSSSAobnVsbCBpZiBub3Qgc3BlY2lmaWVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJpbmZvKCkgewotICAgICAgICByZXR1cm4gbV91c2VyaW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGhvc3QgZm9yIHRoaXMgVVJJLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgaG9zdCBmb3IgdGhpcyBVUkkgKG51bGwgaWYgbm90IHNwZWNpZmllZCkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotICAgICAgICByZXR1cm4gbV9ob3N0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcG9ydCBmb3IgdGhpcyBVUkkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IGZvciB0aGlzIFVSSSAoLTEgaWYgbm90IHNwZWNpZmllZCkuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQb3J0KCkgewotICAgICAgICByZXR1cm4gbV9wb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IGZvciB0aGlzIFVSSS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlZ2lzdHJ5IGJhc2VkIGF1dGhvcml0eSAobnVsbCBpZiBub3Qgc3BlY2lmaWVkKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ0Jhc2VkQXV0aG9yaXR5KCkgewotICAgICAgICByZXR1cm4gbV9yZWdBdXRob3JpdHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwYXRoIGZvciB0aGlzIFVSSSAob3B0aW9uYWxseSB3aXRoIHRoZSBxdWVyeSBzdHJpbmcgYW5kIGZyYWdtZW50KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX2luY2x1ZGVRdWVyeVN0cmluZyBpZiB0cnVlIChhbmQgcXVlcnkgc3RyaW5nIGlzIG5vdCBudWxsKSwgdGhlbiBhICI/IiBmb2xsb3dlZCBieSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgc3RyaW5nIHdpbGwgYmUgYXBwZW5kZWQKLSAgICAgKiBAcGFyYW0gcF9pbmNsdWRlRnJhZ21lbnQgICAgaWYgdHJ1ZSAoYW5kIGZyYWdtZW50IGlzIG5vdCBudWxsKSwgdGhlbiBhICIjIiBmb2xsb3dlZCBieSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgd2lsbCBiZSBhcHBlbmRlZAotICAgICAqIEByZXR1cm4gdGhlIHBhdGggZm9yIHRoaXMgVVJJIHBvc3NpYmx5IGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nIGFuZCBmcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aChib29sZWFuIHBfaW5jbHVkZVF1ZXJ5U3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBfaW5jbHVkZUZyYWdtZW50KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcihtX3BhdGgpOwotCi0gICAgICAgIGlmIChwX2luY2x1ZGVRdWVyeVN0cmluZyAmJiBtX3F1ZXJ5U3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhdGhTdHJpbmcuYXBwZW5kKCc/Jyk7Ci0gICAgICAgICAgICBwYXRoU3RyaW5nLmFwcGVuZChtX3F1ZXJ5U3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwX2luY2x1ZGVGcmFnbWVudCAmJiBtX2ZyYWdtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhdGhTdHJpbmcuYXBwZW5kKCcjJyk7Ci0gICAgICAgICAgICBwYXRoU3RyaW5nLmFwcGVuZChtX2ZyYWdtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF0aFN0cmluZy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGF0aCBmb3IgdGhpcyBVUkkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdGhlIHBhdGggb25seSBhbmQgZG9lcyBub3QgaW5jbHVkZQotICAgICAqIHRoZSBxdWVyeSBzdHJpbmcgb3IgZnJhZ21lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIGZvciB0aGlzIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBtX3BhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgVVJJLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGlzIFVSSS4gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGVyZSB3YXMgbm8gIj8iIGluIHRoZSBVUkkgc3BlYywKLSAgICAgKiAgICAgICAgIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgYSAiPyIgYnV0IG5vIHF1ZXJ5IHN0cmluZyBmb2xsb3dpbmcgaXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1fcXVlcnlTdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmcmFnbWVudCBmb3IgdGhpcyBVUkkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBmcmFnbWVudCBmb3IgdGhpcyBVUkkuIE51bGwgaXMgcmV0dXJuZWQgaWYgdGhlcmUgd2FzIG5vICIjIiBpbiB0aGUgVVJJIHNwZWMsIGVtcHR5Ci0gICAgICogICAgICAgICBzdHJpbmcgaWYgdGhlcmUgd2FzIGEgIiMiIGJ1dCBubyBmcmFnbWVudCBmb2xsb3dpbmcgaXQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGcmFnbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1fZnJhZ21lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzY2hlbWUgZm9yIHRoaXMgVVJJLiBUaGUgc2NoZW1lIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYmVmb3JlIGl0IGlzIHNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3NjaGVtZSB0aGUgc2NoZW1lIGZvciB0aGlzIFVSSSAoY2Fubm90IGJlIG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF9zY2hlbWUgaXMgbm90IGEgY29uZm9ybWFudCBzY2hlbWUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtZShTdHJpbmcgcF9zY2hlbWUpIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpZiAocF9zY2hlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgc2NoZW1lIGZyb20gbnVsbCBzdHJpbmchIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0NvbmZvcm1hbnRTY2hlbWVOYW1lKHBfc2NoZW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigiVGhlIHNjaGVtZSBpcyBub3QgY29uZm9ybWFudC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1fc2NoZW1lID0gcF9zY2hlbWUudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHVzZXJpbmZvIGZvciB0aGlzIFVSSS4gSWYgYSBub24tbnVsbCB2YWx1ZSBpcyBwYXNzZWQgaW4gYW5kIHRoZSBob3N0IHZhbHVlIGlzIG51bGwsCi0gICAgICogdGhlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfdXNlcmluZm8gdGhlIHVzZXJpbmZvIGZvciB0aGlzIFVSSQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfdXNlcmluZm8gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlcmluZm8oU3RyaW5nIHBfdXNlcmluZm8pIHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gewotICAgICAgICBpZiAocF91c2VyaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtX3VzZXJpbmZvID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX2hvc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVXNlcmluZm8gY2Fubm90IGJlIHNldCB3aGVuIGhvc3QgaXMgbnVsbCEiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdXNlcmluZm8gY2FuIGNvbnRhaW4gYWxwaGFudW1lcmljcywgbWFyayBjaGFyYWN0ZXJzLCBlc2NhcGVkCi0gICAgICAgICAgICAvLyBhbmQgJzsnLCc6JywnJicsJz0nLCcrJywnJCcsJywnCi0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgaW50IGVuZCA9IHBfdXNlcmluZm8ubGVuZ3RoKCk7Ci0gICAgICAgICAgICBjaGFyIHRlc3RDaGFyID0gJ1wwJzsKLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkgewotICAgICAgICAgICAgICAgIHRlc3RDaGFyID0gcF91c2VyaW5mby5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMiA+PSBlbmQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91c2VyaW5mby5jaGFyQXQoaW5kZXggKyAxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXNIZXgocF91c2VyaW5mby5jaGFyQXQoaW5kZXggKyAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyaW5mbyBjb250YWlucyBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVXNlcmluZm9DaGFyYWN0ZXIodGVzdENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXJpbmZvIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyOiIgKyB0ZXN0Q2hhcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV91c2VyaW5mbyA9IHBfdXNlcmluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+U2V0IHRoZSBob3N0IGZvciB0aGlzIFVSSS4gSWYgbnVsbCBpcyBwYXNzZWQgaW4sIHRoZSB1c2VyaW5mbyBmaWVsZCBpcyBhbHNvIHNldCB0byBudWxsIGFuZAotICAgICAqIHRoZSBwb3J0IGlzIHNldCB0byAtMS48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIG92ZXJ3cml0ZXMgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IGlmIGl0IHByZXZpb3VzbHkgZXhpc3RlZCBpbiB0aGlzCi0gICAgICogVVJJLjwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX2hvc3QgdGhlIGhvc3QgZm9yIHRoaXMgVVJJCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF9ob3N0IGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3Mgb3IgRE5TIGhvc3RuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIHBfaG9zdCkgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX2hvc3QgPT0gbnVsbCB8fCBwX2hvc3QubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKHBfaG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbV9yZWdBdXRob3JpdHkgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9ob3N0ID0gcF9ob3N0OwotICAgICAgICAgICAgbV91c2VyaW5mbyA9IG51bGw7Ci0gICAgICAgICAgICBtX3BvcnQgPSAtMTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmICghaXNXZWxsRm9ybWVkQWRkcmVzcyhwX2hvc3QpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKCJIb3N0IGlzIG5vdCBhIHdlbGwgZm9ybWVkIGFkZHJlc3MhIik7Ci0gICAgICAgIH0KLSAgICAgICAgbV9ob3N0ID0gcF9ob3N0OwotICAgICAgICBtX3JlZ0F1dGhvcml0eSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwb3J0IGZvciB0aGlzIFVSSS4gLTEgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwb3J0IGlzIG5vdCBzcGVjaWZpZWQsIG90aGVyd2lzZQotICAgICAqIHZhbGlkIHBvcnQgbnVtYmVycyBhcmUgIGJldHdlZW4gMCBhbmQgNjU1MzUuIElmIGEgdmFsaWQgcG9ydCBudW1iZXIgaXMgcGFzc2VkIGluIGFuZCB0aGUgaG9zdAotICAgICAqIGZpZWxkIGlzIG51bGwsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9wb3J0IHRoZSBwb3J0IG51bWJlciBmb3IgdGhpcyBVUkkKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX3BvcnQgaXMgbm90IC0xIGFuZCBub3QgYSB2YWxpZCBwb3J0IG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBfcG9ydCkgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3BvcnQgPj0gMCAmJiBwX3BvcnQgPD0gNjU1MzUpIHsKLSAgICAgICAgICAgIGlmIChtX2hvc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYWxmb3JtZWRVUklFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiUG9ydCBjYW5ub3QgYmUgc2V0IHdoZW4gaG9zdCBpcyBudWxsISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBfcG9ydCAhPSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigiSW52YWxpZCBwb3J0IG51bWJlciEiKTsKLSAgICAgICAgfQotICAgICAgICBtX3BvcnQgPSBwX3BvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+U2V0cyB0aGUgcmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IGZvciB0aGlzIFVSSS48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxwPk5vdGU6IFRoaXMgbWV0aG9kIG92ZXJ3cml0ZXMgc2VydmVyIGJhc2VkIGF1dGhvcml0eSBpZiBpdCBwcmV2aW91c2x5IGV4aXN0ZWQgaW4gdGhpcwotICAgICAqIFVSSS48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IHRoZSByZWdpc3RyeSBiYXNlZCBhdXRob3JpdHkgZm9yIHRoaXMgVVJJCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaXQgYXV0aG9yaXR5IGlzIG5vdCBhIHdlbGwgZm9ybWVkIHJlZ2lzdHJ5IGJhc2VkIGF1dGhvcml0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlZ0Jhc2VkQXV0aG9yaXR5KFN0cmluZyBhdXRob3JpdHkpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoYXV0aG9yaXR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1fcmVnQXV0aG9yaXR5ID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyByZWdfbmFtZSA9IDEqKCB1bnJlc2VydmVkIHwgZXNjYXBlZCB8ICIkIiB8ICIsIiB8Ci0gICAgICAgIC8vICAgICAgICAgICAgIjsiIHwgIjoiIHwgIkAiIHwgIiYiIHwgIj0iIHwgIisiICkKLSAgICAgICAgZWxzZSBpZiAoYXV0aG9yaXR5Lmxlbmd0aCgpIDwgMSB8fAotICAgICAgICAgICAgICAgICFpc1ZhbGlkUmVnaXN0cnlCYXNlZEF1dGhvcml0eShhdXRob3JpdHkpIHx8Ci0gICAgICAgICAgICAgICAgYXV0aG9yaXR5LmluZGV4T2YoJy8nKSAhPSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigiUmVnaXN0cnkgYmFzZWQgYXV0aG9yaXR5IGlzIG5vdCB3ZWxsIGZvcm1lZC4iKTsKLSAgICAgICAgfQotICAgICAgICBtX3JlZ0F1dGhvcml0eSA9IGF1dGhvcml0eTsKLSAgICAgICAgbV9ob3N0ID0gbnVsbDsKLSAgICAgICAgbV91c2VyaW5mbyA9IG51bGw7Ci0gICAgICAgIG1fcG9ydCA9IC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCBmb3IgdGhpcyBVUkkuIElmIHRoZSBzdXBwbGllZCBwYXRoIGlzIG51bGwsIHRoZW4gdGhlIHF1ZXJ5IHN0cmluZyBhbmQgZnJhZ21lbnQgYXJlCi0gICAgICogc2V0IHRvIG51bGwgYXMgd2VsbC4gSWYgdGhlIHN1cHBsaWVkIHBhdGggaW5jbHVkZXMgYSBxdWVyeSBzdHJpbmcgYW5kL29yIGZyYWdtZW50LCB0aGVzZSBmaWVsZHMKLSAgICAgKiB3aWxsIGJlIHBhcnNlZCBhbmQgc2V0IGFzIHdlbGwuIE5vdGUgdGhhdCwgZm9yIFVSSXMgZm9sbG93aW5nIHRoZSAiZ2VuZXJpYyBVUkkiIHN5bnRheCwgdGhlCi0gICAgICogcGF0aCBzcGVjaWZpZWQgc2hvdWxkIHN0YXJ0IHdpdGggYSBzbGFzaC4gRm9yIFVSSXMgdGhhdCBkbyBub3QgZm9sbG93IHRoZSBnZW5lcmljIFVSSSBzeW50YXgsCi0gICAgICogdGhpcyBtZXRob2Qgc2V0cyB0aGUgc2NoZW1lLXNwZWNpZmljIHBhcnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9wYXRoIHRoZSBwYXRoIGZvciB0aGlzIFVSSSAobWF5IGJlIG51bGwpCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF9wYXRoIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBfcGF0aCkgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgbV9wYXRoID0gbnVsbDsKLSAgICAgICAgICAgIG1fcXVlcnlTdHJpbmcgPSBudWxsOwotICAgICAgICAgICAgbV9mcmFnbWVudCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplUGF0aChwX3BhdGgsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIHBhdGggb2YgdGhpcyBVUkkuIElmIHRoZSBjdXJyZW50IHBhdGggZG9lcyBub3QgZW5kIGluIGEgc2xhc2ggYW5kIHRoZQotICAgICAqIHBhdGggdG8gYmUgYXBwZW5kZWQgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoLCBhIHNsYXNoIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGN1cnJlbnQgcGF0aAotICAgICAqIGJlZm9yZSB0aGUgbmV3IHNlZ21lbnQgaXMgYWRkZWQuIEFsc28sIGlmIHRoZSBjdXJyZW50IHBhdGggZW5kcyBpbiBhIHNsYXNoIGFuZCB0aGUgbmV3IHNlZ21lbnQKLSAgICAgKiBiZWdpbnMgd2l0aCBhIHNsYXNoLCB0aGUgZXh0cmEgc2xhc2ggd2lsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgbmV3IHNlZ21lbnQgaXMgYXBwZW5kZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcF9hZGRUb1BhdGggdGhlIG5ldyBzZWdtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHBhdGgKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBpZiBwX2FkZFRvUGF0aCBjb250YWlucyBzeW50YXggZXJyb3JzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kUGF0aChTdHJpbmcgcF9hZGRUb1BhdGgpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfYWRkVG9QYXRoID09IG51bGwgfHwgcF9hZGRUb1BhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNVUklTdHJpbmcocF9hZGRUb1BhdGgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiUGF0aCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX3BhdGggPT0gbnVsbCB8fCBtX3BhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGlmIChwX2FkZFRvUGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICBtX3BhdGggPSBwX2FkZFRvUGF0aDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9wYXRoID0gIi8iICsgcF9hZGRUb1BhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobV9wYXRoLmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIGlmIChwX2FkZFRvUGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICBtX3BhdGggPSBtX3BhdGguY29uY2F0KHBfYWRkVG9QYXRoLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fcGF0aCA9IG1fcGF0aC5jb25jYXQocF9hZGRUb1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBfYWRkVG9QYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIG1fcGF0aCA9IG1fcGF0aC5jb25jYXQocF9hZGRUb1BhdGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtX3BhdGggPSBtX3BhdGguY29uY2F0KCIvIiArIHBfYWRkVG9QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGlzIFVSSS4gQSBub24tbnVsbCB2YWx1ZSBpcyB2YWxpZCBvbmx5IGlmIHRoaXMgaXMgYW4gVVJJIGNvbmZvcm1pbmcKLSAgICAgKiB0byB0aGUgZ2VuZXJpYyBVUkkgc3ludGF4IGFuZCB0aGUgcGF0aCB2YWx1ZSBpcyBub3QgbnVsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3F1ZXJ5U3RyaW5nIHRoZSBxdWVyeSBzdHJpbmcgZm9yIHRoaXMgVVJJCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUklFeGNlcHRpb24gaWYgcF9xdWVyeVN0cmluZyBpcyBub3QgbnVsbCBhbmQgdGhpcyBVUkkgZG9lcyBub3QgY29uZm9ybSB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljIFVSSSBzeW50YXggb3IgaWYgdGhlIHBhdGggaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5U3RyaW5nKFN0cmluZyBwX3F1ZXJ5U3RyaW5nKSB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBfcXVlcnlTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbV9xdWVyeVN0cmluZyA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzR2VuZXJpY1VSSSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiUXVlcnkgc3RyaW5nIGNhbiBvbmx5IGJlIHNldCBmb3IgYSBnZW5lcmljIFVSSSEiKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1fcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiUXVlcnkgc3RyaW5nIGNhbm5vdCBiZSBzZXQgd2hlbiBwYXRoIGlzIG51bGwhIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzVVJJU3RyaW5nKHBfcXVlcnlTdHJpbmcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiUXVlcnkgc3RyaW5nIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyISIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9xdWVyeVN0cmluZyA9IHBfcXVlcnlTdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZyYWdtZW50IGZvciB0aGlzIFVSSS4gQSBub24tbnVsbCB2YWx1ZSBpcyB2YWxpZCBvbmx5IGlmIHRoaXMgaXMgYSBVUkkgY29uZm9ybWluZyB0bwotICAgICAqIHRoZSBnZW5lcmljIFVSSSBzeW50YXggYW5kIHRoZSBwYXRoIHZhbHVlIGlzIG5vdCBudWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIHBfZnJhZ21lbnQgdGhlIGZyYWdtZW50IGZvciB0aGlzIFVSSQotICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkVVJJRXhjZXB0aW9uIGlmIHBfZnJhZ21lbnQgaXMgbm90IG51bGwgYW5kIHRoaXMgVVJJIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYyBVUkkgc3ludGF4IG9yIGlmIHRoZSBwYXRoIGlzIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChTdHJpbmcgcF9mcmFnbWVudCkgdGhyb3dzIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwX2ZyYWdtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1fZnJhZ21lbnQgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKCFpc0dlbmVyaWNVUkkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZyYWdtZW50IGNhbiBvbmx5IGJlIHNldCBmb3IgYSBnZW5lcmljIFVSSSEiKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXRQYXRoKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkZyYWdtZW50IGNhbm5vdCBiZSBzZXQgd2hlbiBwYXRoIGlzIG51bGwhIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzVVJJU3RyaW5nKHBfZnJhZ21lbnQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRnJhZ21lbnQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIhIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2ZyYWdtZW50ID0gcF9mcmFnbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgaWYgdGhlIHBhc3NlZC1pbiBPYmplY3QgaXMgZXF1aXZhbGVudCB0byB0aGlzIFVSSS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwX3Rlc3QgdGhlIE9iamVjdCB0byB0ZXN0IGZvciBlcXVhbGl0eS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgcF90ZXN0IGlzIGEgVVJJIHdpdGggYWxsIHZhbHVlcyBlcXVhbCB0byB0aGlzIFVSSSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBwX3Rlc3QpIHsKLSAgICAgICAgaWYgKHBfdGVzdCBpbnN0YW5jZW9mIFVSSSkgewotICAgICAgICAgICAgVVJJIHRlc3RVUkkgPSAoVVJJKXBfdGVzdDsKLSAgICAgICAgICAgIGlmICgoKG1fc2NoZW1lID09IG51bGwgJiYgdGVzdFVSSS5tX3NjaGVtZSA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAgICAobV9zY2hlbWUgIT0gbnVsbCAmJiB0ZXN0VVJJLm1fc2NoZW1lICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NjaGVtZS5lcXVhbHModGVzdFVSSS5tX3NjaGVtZSkpKSAmJgotICAgICAgICAgICAgICAgICAgICAoKG1fdXNlcmluZm8gPT0gbnVsbCAmJiB0ZXN0VVJJLm1fdXNlcmluZm8gPT0gbnVsbCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV91c2VyaW5mbyAhPSBudWxsICYmIHRlc3RVUkkubV91c2VyaW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3VzZXJpbmZvLmVxdWFscyh0ZXN0VVJJLm1fdXNlcmluZm8pKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChtX2hvc3QgPT0gbnVsbCAmJiB0ZXN0VVJJLm1faG9zdCA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX2hvc3QgIT0gbnVsbCAmJiB0ZXN0VVJJLm1faG9zdCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2hvc3QuZXF1YWxzKHRlc3RVUkkubV9ob3N0KSkpICYmCi0gICAgICAgICAgICAgICAgICAgIG1fcG9ydCA9PSB0ZXN0VVJJLm1fcG9ydCAmJgotICAgICAgICAgICAgICAgICAgICAoKG1fcGF0aCA9PSBudWxsICYmIHRlc3RVUkkubV9wYXRoID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcGF0aCAhPSBudWxsICYmIHRlc3RVUkkubV9wYXRoICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGF0aC5lcXVhbHModGVzdFVSSS5tX3BhdGgpKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChtX3F1ZXJ5U3RyaW5nID09IG51bGwgJiYgdGVzdFVSSS5tX3F1ZXJ5U3RyaW5nID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcXVlcnlTdHJpbmcgIT0gbnVsbCAmJiB0ZXN0VVJJLm1fcXVlcnlTdHJpbmcgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9xdWVyeVN0cmluZy5lcXVhbHModGVzdFVSSS5tX3F1ZXJ5U3RyaW5nKSkpICYmCi0gICAgICAgICAgICAgICAgICAgICgobV9mcmFnbWVudCA9PSBudWxsICYmIHRlc3RVUkkubV9mcmFnbWVudCA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX2ZyYWdtZW50ICE9IG51bGwgJiYgdGVzdFVSSS5tX2ZyYWdtZW50ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnJhZ21lbnQuZXF1YWxzKHRlc3RVUkkubV9mcmFnbWVudCkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgaGFzaC1jb2RlIHZhbHVlIGZvciB0aGlzIFVSSS4gIFRoZSBoYXNoIGNvZGUgaXMgYmFzZWQgdXBvbiBhbGwgb2YgdGhlIFVSSSdzCi0gICAgICogY29tcG9uZW50cywgYW5kIHNhdGlzZmllcyB0aGUgZ2VuZXJhbCBjb250cmFjdCBvZiB0aGUge0BsaW5rIE9iamVjdCNoYXNoQ29kZSgpCi0gICAgICogT2JqZWN0Lmhhc2hDb2RlfSBtZXRob2QuIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBoYXNoLWNvZGUgdmFsdWUgZm9yIHRoaXMgVVJJCi0gICAgICovCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFVSSSBhcyBhIHN0cmluZyBzcGVjaWZpY2F0aW9uLiBTZWUgUkZDIDIzOTYgU2VjdGlvbiA1LjIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBVUkkgc3RyaW5nIHNwZWNpZmljYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgdXJpU3BlY1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBpZiAobV9zY2hlbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJpU3BlY1N0cmluZy5hcHBlbmQobV9zY2hlbWUpOwotICAgICAgICAgICAgdXJpU3BlY1N0cmluZy5hcHBlbmQoJzonKTsKLSAgICAgICAgfQotICAgICAgICB1cmlTcGVjU3RyaW5nLmFwcGVuZChnZXRTY2hlbWVTcGVjaWZpY1BhcnQoKSk7Ci0gICAgICAgIHJldHVybiB1cmlTcGVjU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRpY2F0b3IgYXMgdG8gd2hldGhlciB0aGlzIFVSSSB1c2VzIHRoZSAiZ2VuZXJpYyBVUkkiIHN5bnRheC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIFVSSSB1c2VzIHRoZSAiZ2VuZXJpYyBVUkkiIHN5bnRheCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmljVVJJKCkgewotICAgICAgICAvLyBwcmVzZW5jZSBvZiB0aGUgaG9zdCAod2hldGhlciB2YWxpZCBvciBlbXB0eSkgbWVhbnMKLSAgICAgICAgLy8gZG91YmxlLXNsYXNoZXMgd2hpY2ggbWVhbnMgZ2VuZXJpYyB1cmkKLSAgICAgICAgcmV0dXJuIChtX2hvc3QgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzY2hlbWUgY29uZm9ybXMgdG8gdGhlIHJ1bGVzIGZvciBhIHNjaGVtZSBuYW1lLiBBIHNjaGVtZSBpcyBjb25mb3JtYW50IGlmCi0gICAgICogaXQgc3RhcnRzIHdpdGggYW4gYWxwaGFudW1lcmljLCBhbmQgY29udGFpbnMgb25seSBhbHBoYW51bWVyaWNzLCAnKycsJy0nIGFuZCAnLicuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNjaGVtZSBpcyBjb25mb3JtYW50LCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25mb3JtYW50U2NoZW1lTmFtZShTdHJpbmcgcF9zY2hlbWUpIHsKLSAgICAgICAgaWYgKHBfc2NoZW1lID09IG51bGwgfHwgcF9zY2hlbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNBbHBoYShwX3NjaGVtZS5jaGFyQXQoMCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyIHRlc3RDaGFyOwotICAgICAgICBpbnQgc2NoZW1lTGVuZ3RoID0gcF9zY2hlbWUubGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2NoZW1lTGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHRlc3RDaGFyID0gcF9zY2hlbWUuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKCFpc1NjaGVtZUNoYXJhY3Rlcih0ZXN0Q2hhcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIHN0cmluZyBpcyBzeW50YWN0aWNhbGx5IGNhcGFibGUgb2YgcmVwcmVzZW50aW5nIGEgdmFsaWQgSVB2NCBhZGRyZXNzLCBJUHY2Ci0gICAgICogcmVmZXJlbmNlIG9yIHRoZSBkb21haW4gbmFtZSBvZiBhIG5ldHdvcmsgaG9zdC4gQSB2YWxpZCBJUHY0IGFkZHJlc3MgY29uc2lzdHMgb2YgZm91ciBkZWNpbWFsCi0gICAgICogZGlnaXQgZ3JvdXBzIHNlcGFyYXRlZCBieSBhICcuJy4gRWFjaCBncm91cCBtdXN0IGNvbnNpc3Qgb2Ygb25lIHRvIHRocmVlIGRpZ2l0cy4gU2VlIFJGQyAyNzMyCi0gICAgICogU2VjdGlvbiAzLCBhbmQgUkZDIDIzNzMgU2VjdGlvbiAyLjIsIGZvciB0aGUgZGVmaW5pdGlvbiBvZiBJUHY2IHJlZmVyZW5jZXMuIEEgaG9zdG5hbWUgY29uc2lzdHMKLSAgICAgKiBvZiBkb21haW4gbGFiZWxzIChlYWNoIG9mIHdoaWNoIG11c3QgYmVnaW4gYW5kIGVuZCB3aXRoIGFuIGFscGhhbnVtZXJpYyBidXQgbWF5IGNvbnRhaW4gJy0nKQotICAgICAqIHNlcGFyYXRlZCAmIGJ5IGEgJy4nLiBTZWUgUkZDIDIzOTYgU2VjdGlvbiAzLjIuMi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgc3ludGFjdGljYWxseSB2YWxpZCBJUHY0IGFkZHJlc3MsIElQdjYgcmVmZXJlbmNlIG9yIGhvc3RuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2VsbEZvcm1lZEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKLSAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGFkZHJMZW5ndGggPSBhZGRyZXNzLmxlbmd0aCgpOwotICAgICAgICBpZiAoYWRkckxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBpZiB0aGUgaG9zdCBpcyBhIHZhbGlkIElQdjZyZWZlcmVuY2UuCi0gICAgICAgIGlmIChhZGRyZXNzLnN0YXJ0c1dpdGgoIlsiKSkgewotICAgICAgICAgICAgcmV0dXJuIGlzV2VsbEZvcm1lZElQdjZSZWZlcmVuY2UoYWRkcmVzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDYW5ub3Qgc3RhcnQgd2l0aCBhICcuJywgJy0nLCBvciBlbmQgd2l0aCBhICctJy4KLSAgICAgICAgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgiLiIpIHx8Ci0gICAgICAgICAgICAgICAgYWRkcmVzcy5zdGFydHNXaXRoKCItIikgfHwKLSAgICAgICAgICAgICAgICBhZGRyZXNzLmVuZHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJpZ2h0bW9zdCBkb21haW4gbGFiZWwgc3RhcnRpbmcgd2l0aCBkaWdpdCBpbmRpY2F0ZXMgSVAgYWRkcmVzcwotICAgICAgICAvLyBzaW5jZSB0b3AgbGV2ZWwgZG9tYWluIGxhYmVsIGNhbiBvbmx5IHN0YXJ0IHdpdGggYW4gYWxwaGEKLSAgICAgICAgLy8gc2VlIFJGQyAyMzk2IFNlY3Rpb24gMy4yLjIKLSAgICAgICAgaW50IGluZGV4ID0gYWRkcmVzcy5sYXN0SW5kZXhPZignLicpOwotICAgICAgICBpZiAoYWRkcmVzcy5lbmRzV2l0aCgiLiIpKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGFkZHJlc3Muc3Vic3RyaW5nKDAsIGluZGV4KS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4ICsgMSA8IGFkZHJMZW5ndGggJiYgaXNEaWdpdChhZGRyZXNzLmNoYXJBdChpbmRleCArIDEpKSkgewotICAgICAgICAgICAgcmV0dXJuIGlzV2VsbEZvcm1lZElQdjRBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaG9zdG5hbWUgICAgICA9ICooIGRvbWFpbmxhYmVsICIuIiApIHRvcGxhYmVsIFsgIi4iIF0KLSAgICAgICAgICAgIC8vIGRvbWFpbmxhYmVsICAgPSBhbHBoYW51bSB8IGFscGhhbnVtICooIGFscGhhbnVtIHwgIi0iICkgYWxwaGFudW0KLSAgICAgICAgICAgIC8vIHRvcGxhYmVsICAgICAgPSBhbHBoYSB8IGFscGhhICooIGFscGhhbnVtIHwgIi0iICkgYWxwaGFudW0KLQotICAgICAgICAgICAgLy8gUkZDIDIzOTYgc3RhdGVzIHRoYXQgaG9zdG5hbWVzIHRha2UgdGhlIGZvcm0gZGVzY3JpYmVkIGluCi0gICAgICAgICAgICAvLyBSRkMgMTAzNCAoU2VjdGlvbiAzKSBhbmQgUkZDIDExMjMgKFNlY3Rpb24gMi4xKS4gQWNjb3JkaW5nCi0gICAgICAgICAgICAvLyB0byBSRkMgMTAzNCwgaG9zdG5hbWVzIGFyZSBsaW1pdGVkIHRvIDI1NSBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgaWYgKGFkZHJMZW5ndGggPiAyNTUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRvbWFpbiBsYWJlbHMgY2FuIGNvbnRhaW4gYWxwaGFudW1lcmljcyBhbmQgJy0iCi0gICAgICAgICAgICAvLyBidXQgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGggYW4gYWxwaGFudW1lcmljCi0gICAgICAgICAgICBjaGFyIHRlc3RDaGFyOwotICAgICAgICAgICAgaW50IGxhYmVsQ2hhckNvdW50ID0gMDsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRyTGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IGFkZHJlc3MuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FscGhhbnVtKGFkZHJlc3MuY2hhckF0KGkgLSAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBhZGRyTGVuZ3RoICYmICFpc0FscGhhbnVtKGFkZHJlc3MuY2hhckF0KGkgKyAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsYWJlbENoYXJDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNBbHBoYW51bSh0ZXN0Q2hhcikgJiYgdGVzdENoYXIgIT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUkZDIDEwMzQ6IExhYmVscyBtdXN0IGJlIDYzIGNoYXJhY3RlcnMgb3IgbGVzcy4KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgrK2xhYmVsQ2hhckNvdW50ID4gNjMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5EZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgaXMgYW4gSVB2NCBhZGRyZXNzIGFzIGRlZmluZWQgYnkgUkZDIDIzNzMsIGFuZCB1bmRlciB0aGUgZnVydGhlcgotICAgICAqIGNvbnN0cmFpbnQgdGhhdCBpdCBtdXN0IGJlIGEgMzItYml0IGFkZHJlc3MuIFRob3VnaCBub3QgZXhwcmVzc2VkIGluIHRoZSBncmFtbWFyLCBpbiBvcmRlciB0bwotICAgICAqIHNhdGlzZnkgdGhlIDMyLWJpdCBhZGRyZXNzIGNvbnN0cmFpbnQsIGVhY2ggc2VnbWVudCBvZiB0aGUgYWRkcmVzcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDI1NQotICAgICAqICg4IGJpdHMgb2YgaW5mb3JtYXRpb24pLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+PGNvZGU+SVB2NGFkZHJlc3MgPSAxKjNESUdJVCAiLiIgMSozRElHSVQgIi4iIDEqM0RJR0lUICIuIiAxKjNESUdJVDwvY29kZT48L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHN5bnRhY3RpY2FsbHkgdmFsaWQgSVB2NCBhZGRyZXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2VsbEZvcm1lZElQdjRBZGRyZXNzKFN0cmluZyBhZGRyZXNzKSB7Ci0KLSAgICAgICAgaW50IGFkZHJMZW5ndGggPSBhZGRyZXNzLmxlbmd0aCgpOwotICAgICAgICBjaGFyIHRlc3RDaGFyOwotICAgICAgICBpbnQgbnVtRG90cyA9IDA7Ci0gICAgICAgIGludCBudW1EaWdpdHMgPSAwOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IDEpIHdlIHNlZSBvbmx5IGRpZ2l0cyBhbmQgZG90IHNlcGFyYXRvcnMsIDIpIHRoYXQKLSAgICAgICAgLy8gYW55IGRvdCBzZXBhcmF0b3IgaXMgcHJlY2VkZWQgYW5kIGZvbGxvd2VkIGJ5IGEgZGlnaXQgYW5kCi0gICAgICAgIC8vIDMpIHRoYXQgd2UgZmluZCAzIGRvdHMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gUkZDIDI3MzIgYW1lbmRlZCBSRkMgMjM5NiBieSByZXBsYWNpbmcgdGhlIGRlZmluaXRpb24KLSAgICAgICAgLy8gb2YgSVB2NGFkZHJlc3Mgd2l0aCB0aGUgb25lIGRlZmluZWQgYnkgUkZDIDIzNzMuIC0gbXJnbGF2YXMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gSVB2NGFkZHJlc3MgPSAxKjNESUdJVCAiLiIgMSozRElHSVQgIi4iIDEqM0RJR0lUICIuIiAxKjNESUdJVAotICAgICAgICAvLwotICAgICAgICAvLyBPbmUgdG8gdGhyZWUgZGlnaXRzIG11c3QgYmUgaW4gZWFjaCBzZWdtZW50LgotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZHJMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGVzdENoYXIgPSBhZGRyZXNzLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGkgPiAwICYmICFpc0RpZ2l0KGFkZHJlc3MuY2hhckF0KGkgLSAxKSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaSArIDEgPCBhZGRyTGVuZ3RoICYmICFpc0RpZ2l0KGFkZHJlc3MuY2hhckF0KGkgKyAxKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnVtRGlnaXRzID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoKytudW1Eb3RzID4gMykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghaXNEaWdpdCh0ZXN0Q2hhcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiB0aHJlZSBkaWdpdHMKLSAgICAgICAgICAgIC8vIGluIHRoaXMgc2VnbWVudC4KLSAgICAgICAgICAgIGVsc2UgaWYgKCsrbnVtRGlnaXRzID4gMykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhpcyBzZWdtZW50IGlzIG5vdCBncmVhdGVyIHRoYW4gMjU1LgotICAgICAgICAgICAgZWxzZSBpZiAobnVtRGlnaXRzID09IDMpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGZpcnN0ID0gYWRkcmVzcy5jaGFyQXQoaSAtIDIpOwotICAgICAgICAgICAgICAgIGNoYXIgc2Vjb25kID0gYWRkcmVzcy5jaGFyQXQoaSAtIDEpOwotICAgICAgICAgICAgICAgIGlmICghKGZpcnN0IDwgJzInIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZmlyc3QgPT0gJzInICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgPCAnNScgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vjb25kID09ICc1JyAmJiB0ZXN0Q2hhciA8PSAnNScpKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChudW1Eb3RzID09IDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkRldGVybWluZXMgd2hldGhlciBhIHN0cmluZyBpcyBhbiBJUHY2IHJlZmVyZW5jZSBhcyBkZWZpbmVkIGJ5IFJGQyAyNzMyLCB3aGVyZSBJUHY2YWRkcmVzcwotICAgICAqIGlzIGRlZmluZWQgaW4gUkZDIDIzNzMuIFRoZSBJUHY2IGFkZHJlc3MgaXMgcGFyc2VkIGFjY29yZGluZyB0byBTZWN0aW9uIDIuMiBvZiBSRkMgMjM3Mywgd2l0aAotICAgICAqIHRoZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgdGhhdCB0aGUgYWRkcmVzcyBiZSBjb21wb3NlZCBvZiAxMjggYml0cyBvZiBpbmZvcm1hdGlvbi48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxwPjxjb2RlPklQdjZyZWZlcmVuY2UgPSAiWyIgSVB2NmFkZHJlc3MgIl0iPC9jb2RlPjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+Tm90ZTogVGhlIEJORiBleHByZXNzZWQgaW4gUkZDIDIzNzMgQXBwZW5kaXggQiBkb2VzIG5vdCBhY2N1cmF0ZWx5IGRlc2NyaWJlIHNlY3Rpb24gMi4yLCBhbmQKLSAgICAgKiB3YXMgaW4gZmFjdCByZW1vdmVkIGZyb20gUkZDIDM1MTMsIHRoZSBzdWNjZXNzb3Igb2YgUkZDIDIzNzMuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSBzeW50YWN0aWNhbGx5IHZhbGlkIElQdjYgcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2VsbEZvcm1lZElQdjZSZWZlcmVuY2UoU3RyaW5nIGFkZHJlc3MpIHsKLQotICAgICAgICBpbnQgYWRkckxlbmd0aCA9IGFkZHJlc3MubGVuZ3RoKCk7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGludCBlbmQgPSBhZGRyTGVuZ3RoIC0gMTsKLQotICAgICAgICAvLyBDaGVjayBpZiBzdHJpbmcgaXMgYSBwb3RlbnRpYWwgbWF0Y2ggZm9yIElQdjZyZWZlcmVuY2UuCi0gICAgICAgIGlmICghKGFkZHJMZW5ndGggPiAyICYmIGFkZHJlc3MuY2hhckF0KDApID09ICdbJwotICAgICAgICAgICAgICAgICYmIGFkZHJlc3MuY2hhckF0KGVuZCkgPT0gJ10nKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ291bnRlciBmb3IgdGhlIG51bWJlciBvZiAxNi1iaXQgc2VjdGlvbnMgcmVhZCBpbiB0aGUgYWRkcmVzcy4KLSAgICAgICAgaW50IFtdIGNvdW50ZXIgPSBuZXcgaW50WzFdOwotCi0gICAgICAgIC8vIFNjYW4gaGV4IHNlcXVlbmNlIGJlZm9yZSBwb3NzaWJsZSAnOjonIG9yIElQdjQgYWRkcmVzcy4KLSAgICAgICAgaW5kZXggPSBzY2FuSGV4U2VxdWVuY2UoYWRkcmVzcywgaW5kZXgsIGVuZCwgY291bnRlcik7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFkZHJlc3MgbXVzdCBjb250YWluIDEyOC1iaXRzIG9mIGluZm9ybWF0aW9uLgotICAgICAgICBlbHNlIGlmIChpbmRleCA9PSBlbmQpIHsKLSAgICAgICAgICAgIHJldHVybiAoY291bnRlclswXSA9PSA4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmRleCArIDEgPCBlbmQgJiYgYWRkcmVzcy5jaGFyQXQoaW5kZXgpID09ICc6JykgewotICAgICAgICAgICAgaWYgKGFkZHJlc3MuY2hhckF0KGluZGV4ICsgMSkgPT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgLy8gJzo6JyByZXByZXNlbnRzIGF0IGxlYXN0IG9uZSAxNi1iaXQgZ3JvdXAgb2YgemVyb3MuCi0gICAgICAgICAgICAgICAgaWYgKCsrY291bnRlclswXSA+IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIC8vIFRyYWlsaW5nIHplcm9zIHdpbGwgZmlsbCBvdXQgdGhlIHJlc3Qgb2YgdGhlIGFkZHJlc3MuCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGVuZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiB0aGUgc2Vjb25kIGNoYXJhY3RlciB3YXNuJ3QgJzonLCBpbiBvcmRlciB0byBiZSB2YWxpZCwKLSAgICAgICAgICAgIC8vIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBtdXN0IG1hdGNoIElQdjRBZGRyZXNzLAotICAgICAgICAgICAgLy8gYW5kIHdlIG11c3QgaGF2ZSByZWFkIGV4YWN0bHkgNiAxNi1iaXQgZ3JvdXBzLgotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChjb3VudGVyWzBdID09IDYpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBpc1dlbGxGb3JtZWRJUHY0QWRkcmVzcyhhZGRyZXNzLnN1YnN0cmluZyhpbmRleCArIDEsIGVuZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gMy4gU2NhbiBoZXggc2VxdWVuY2UgYWZ0ZXIgJzo6Jy4KLSAgICAgICAgaW50IHByZXZDb3VudCA9IGNvdW50ZXJbMF07Ci0gICAgICAgIGluZGV4ID0gc2NhbkhleFNlcXVlbmNlKGFkZHJlc3MsIGluZGV4LCBlbmQsIGNvdW50ZXIpOwotCi0gICAgICAgIC8vIFdlJ3ZlIGVpdGhlciByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmluZywgdGhlIGFkZHJlc3MgZW5kcyBpbgotICAgICAgICAvLyBhbiBJUHY0IGFkZHJlc3MsIG9yIGl0IGlzIGludmFsaWQuIHNjYW5IZXhTZXF1ZW5jZSBoYXMgYWxyZWFkeQotICAgICAgICAvLyBtYWRlIHN1cmUgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCBudW1iZXIgb2YgYml0cy4KLSAgICAgICAgcmV0dXJuIChpbmRleCA9PSBlbmQpIHx8Ci0gICAgICAgICAgICAgICAgKGluZGV4ICE9IC0xICYmIGlzV2VsbEZvcm1lZElQdjRBZGRyZXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdWJzdHJpbmcoKGNvdW50ZXJbMF0gPiBwcmV2Q291bnQpID8gaW5kZXggKyAxIDogaW5kZXgsIGVuZCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpc1dlbGxGb3JtZWRJUHY2UmVmZXJlbmNlIHdoaWNoIHNjYW5zIHRoZSBoZXggc2VxdWVuY2VzIG9mIGFuIElQdjYgYWRkcmVzcy4KLSAgICAgKiBJdCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgdG8gc2NhbiBpbiB0aGUgYWRkcmVzcywgb3IgLTEgaWYgdGhlIHN0cmluZyBjYW5ub3QKLSAgICAgKiBtYXRjaCBhIHZhbGlkIElQdjYgYWRkcmVzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBzdHJpbmcgdG8gYmUgc2Nhbm5lZAotICAgICAqIEBwYXJhbSBpbmRleCAgIHRoZSBiZWdpbm5pbmcgaW5kZXggKGluY2x1c2l2ZSkKLSAgICAgKiBAcGFyYW0gZW5kICAgICB0aGUgZW5kaW5nIGluZGV4IChleGNsdXNpdmUpCi0gICAgICogQHBhcmFtIGNvdW50ZXIgYSBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIDE2LWJpdCBzZWN0aW9ucyByZWFkIGluIHRoZSBhZGRyZXNzCi0gICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIHNjYW4sIG9yIC0xIGlmIHRoZSBzdHJpbmcgY2Fubm90IG1hdGNoIGEgdmFsaWQgSVB2NgotICAgICAqICAgICAgICAgYWRkcmVzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBzY2FuSGV4U2VxdWVuY2UoU3RyaW5nIGFkZHJlc3MsIGludCBpbmRleCwgaW50IGVuZCwgaW50IFtdIGNvdW50ZXIpIHsKLQotICAgICAgICBjaGFyIHRlc3RDaGFyOwotICAgICAgICBpbnQgbnVtRGlnaXRzID0gMDsKLSAgICAgICAgaW50IHN0YXJ0ID0gaW5kZXg7Ci0KLSAgICAgICAgLy8gVHJ5aW5nIHRvIG1hdGNoIHRoZSBmb2xsb3dpbmcgcHJvZHVjdGlvbnM6Ci0gICAgICAgIC8vIGhleHNlcSA9IGhleDQgKiggIjoiIGhleDQpCi0gICAgICAgIC8vIGhleDQgICA9IDEqNEhFWERJRwotICAgICAgICBmb3IgKDsgaW5kZXggPCBlbmQ7ICsraW5kZXgpIHsKLSAgICAgICAgICAgIHRlc3RDaGFyID0gYWRkcmVzcy5jaGFyQXQoaW5kZXgpOwotICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICc6JykgewotICAgICAgICAgICAgICAgIC8vIElQdjYgYWRkcmVzc2VzIGFyZSAxMjgtYml0LCBzbyB0aGVyZSBjYW4gYmUgYXQgbW9zdCBlaWdodCBzZWN0aW9ucy4KLSAgICAgICAgICAgICAgICBpZiAobnVtRGlnaXRzID4gMCAmJiArK2NvdW50ZXJbMF0gPiA4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSAnOjonLgotICAgICAgICAgICAgICAgIGlmIChudW1EaWdpdHMgPT0gMCB8fCAoKGluZGV4ICsgMSA8IGVuZCkgJiYgYWRkcmVzcy5jaGFyQXQoaW5kZXggKyAxKSA9PSAnOicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnVtRGlnaXRzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgYmUgaW52YWxpZCBvciBhbiBJUHY0YWRkcmVzcy4gSWYgaXQncyBwb3RlbnRpYWxseSBhbiBJUHY0YWRkcmVzcywKLSAgICAgICAgICAgIC8vIGJhY2t1cCB0byBqdXN0IGFmdGVyIHRoZSBsYXN0IHZhbGlkIGNoYXJhY3RlciB0aGF0IG1hdGNoZXMgaGV4c2VxLgotICAgICAgICAgICAgZWxzZSBpZiAoIWlzSGV4KHRlc3RDaGFyKSkgewotICAgICAgICAgICAgICAgIGlmICh0ZXN0Q2hhciA9PSAnLicgJiYgbnVtRGlnaXRzIDwgNCAmJiBudW1EaWdpdHMgPiAwICYmIGNvdW50ZXJbMF0gPD0gNikgewotICAgICAgICAgICAgICAgICAgICBpbnQgYmFjayA9IGluZGV4IC0gbnVtRGlnaXRzIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChiYWNrID49IHN0YXJ0KSA/IGJhY2sgOiAoYmFjayArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGVyZSBjYW4gYmUgYXQgbW9zdCA0IGhleCBkaWdpdHMgcGVyIGdyb3VwLgotICAgICAgICAgICAgZWxzZSBpZiAoKytudW1EaWdpdHMgPiA0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAobnVtRGlnaXRzID4gMCAmJiArK2NvdW50ZXJbMF0gPD0gOCkgPyBlbmQgOiAtMTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgY2hhciBpcyBhIGRpZ2l0LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyIGlzIGJldHdlZWVuICcwJyBhbmQgJzknLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlnaXQoY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuIHBfY2hhciA+PSAnMCcgJiYgcF9jaGFyIDw9ICc5JzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNoYXJhY3RlciBpcyBhIGhleGFkZWNpbWFsIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhciBpcyBiZXR3ZWVlbiAnMCcgYW5kICc5JywgJ2EnIGFuZCAnZicgb3IgJ0EnIGFuZCAnRicsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIZXgoY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuIChwX2NoYXIgPD0gJ2YnICYmIChmZ0xvb2t1cFRhYmxlW3BfY2hhcl0gJiBBU0NJSV9IRVhfQ0hBUkFDVEVSUykgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGFyIGlzIGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyOiBhLXogb3IgQS1aCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYWxwaGFiZXRpYywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FscGhhKGNoYXIgcF9jaGFyKSB7Ci0gICAgICAgIHJldHVybiAoKHBfY2hhciA+PSAnYScgJiYgcF9jaGFyIDw9ICd6JykgfHwgKHBfY2hhciA+PSAnQScgJiYgcF9jaGFyIDw9ICdaJykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgY2hhciBpcyBhbiBhbHBoYW51bWVyaWM6IDAtOSwgYS16IG9yIEEtWgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyIGlzIGFscGhhbnVtZXJpYywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FscGhhbnVtKGNoYXIgcF9jaGFyKSB7Ci0gICAgICAgIHJldHVybiAocF9jaGFyIDw9ICd6JyAmJiAoZmdMb29rdXBUYWJsZVtwX2NoYXJdICYgTUFTS19BTFBIQV9OVU1FUklDKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNoYXIgaXMgYSBVUkkgY2hhcmFjdGVyIChyZXNlcnZlZCBvciB1bnJlc2VydmVkLCBub3QgaW5jbHVkaW5nICclJyBmb3IKLSAgICAgKiBlc2NhcGVkIG9jdGV0cykuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYSBVUkkgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVVJJQ2hhcmFjdGVyKGNoYXIgcF9jaGFyKSB7Ci0gICAgICAgIHJldHVybiAocF9jaGFyIDw9ICd+JyAmJiAoZmdMb29rdXBUYWJsZVtwX2NoYXJdICYgTUFTS19VUklfQ0hBUkFDVEVSKSAhPSAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBhIGNoYXIgaXMgYSBzY2hlbWUgY2hhcmFjdGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyIGlzIGEgc2NoZW1lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NjaGVtZUNoYXJhY3RlcihjaGFyIHBfY2hhcikgewotICAgICAgICByZXR1cm4gKHBfY2hhciA8PSAneicgJiYgKGZnTG9va3VwVGFibGVbcF9jaGFyXSAmIE1BU0tfU0NIRU1FX0NIQVJBQ1RFUikgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGFyIGlzIGEgdXNlcmluZm8gY2hhcmFjdGVyLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjaGFyIGlzIGEgdXNlcmluZm8gY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXNlcmluZm9DaGFyYWN0ZXIoY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuIChwX2NoYXIgPD0gJ3onICYmIChmZ0xvb2t1cFRhYmxlW3BfY2hhcl0gJiBNQVNLX1VTRVJJTkZPX0NIQVJBQ1RFUikgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBjaGFyIGlzIGEgcGF0aCBjaGFyYWN0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNoYXIgaXMgYSBwYXRoIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhdGhDaGFyYWN0ZXIoY2hhciBwX2NoYXIpIHsKLSAgICAgICAgcmV0dXJuIChwX2NoYXIgPD0gJ34nICYmIChmZ0xvb2t1cFRhYmxlW3BfY2hhcl0gJiBNQVNLX1BBVEhfQ0hBUkFDVEVSKSAhPSAwKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gc3RyaW5nIGNvbnRhaW5zIG9ubHkgVVJJIGNoYXJhY3RlcnMgKGFsc28KLSAgICAgKiBjYWxsZWQgInVyaWMiIGluIFJGQyAyMzk2KS4gdXJpYyBjb25zaXN0IG9mIGFsbCByZXNlcnZlZAotICAgICAqIGNoYXJhY3RlcnMsIHVucmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgZXNjYXBlZCBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgY29tcHJpc2VkIG9mIHVyaWMsIGZhbHNlIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVUklTdHJpbmcoU3RyaW5nIHBfdXJpYykgewotICAgICAgICBpZiAocF91cmljID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZW5kID0gcF91cmljLmxlbmd0aCgpOwotICAgICAgICBjaGFyIHRlc3RDaGFyID0gJ1wwJzsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgdGVzdENoYXIgPSBwX3VyaWMuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKHRlc3RDaGFyID09ICclJykgewotICAgICAgICAgICAgICAgIGlmIChpICsgMiA+PSBlbmQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaWMuY2hhckF0KGkgKyAxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFpc0hleChwX3VyaWMuY2hhckF0KGkgKyAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgaWYgKCFpc1VSSUNoYXJhY3Rlcih0ZXN0Q2hhcikpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1VuaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5pb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliOThmOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5pb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLQotLyoqIHRoaXMgY2xhc3MgaXMgdGhlIHN1cGVyIGNsYXNzIG9mIGFsbCB0aGUgdW5pb24gc2ltcGxlIHR5cGVzICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVW5pb24gewotICAgIC8vIG9iamVjdCB0byBzdG9yZSB2YWx1ZXMKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGxvY2FsT2JqZWN0OwotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbE9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRPYmplY3QoT2JqZWN0IGxvY2FsT2JqZWN0KTsKLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2FsT2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbWV0aG9kIHRvIHBhcnNlIHhtbHNjaGVtYSBvYmplY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sU3RyZWFtUmVhZGVyCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICogQHRocm93cyBVUkkuTWFsZm9ybWVkVVJJRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdChYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSkgdGhyb3dzIFVSSS5NYWxmb3JtZWRVUklFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IHhtbFN0cmVhbVJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICBpZiAoInN0cmluZyIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QodmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKCJpbnQiLmVxdWFscyh0eXBlKSB8fCAiaW50ZWdlciIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IEludGVnZXIodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgiYm9vbGVhbiIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IEJvb2xlYW4odmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgiYW55VVJJIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgVVJJKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImRhdGUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJRTmFtZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZigiOiIpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIGkuZSBpdCBoYXMgYSBuYW1lIHNwYWNlCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZigiOiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICBzZXRPYmplY3QobmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0LCBwcmVmaXgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBRTmFtZSh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCJkYXRlVGltZSIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJ0aW1lIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1RpbWUodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBGbG9hdCh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJsb25nIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgTG9uZyh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBEb3VibGUodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgiZGVjaW1hbCIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IEJpZ0RlY2ltYWwodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRMb25nIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgVW5zaWduZWRMb25nKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoInVuc2lnbmVkSW50Ii5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgVW5zaWduZWRJbnQodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRTaG9ydCIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IFVuc2lnbmVkU2hvcnQodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgidW5zaWduZWRCeXRlIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgVW5zaWduZWRCeXRlKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoInBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IFBvc2l0aXZlSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKCJuZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgc2V0T2JqZWN0KG5ldyBOZWdhdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICgibm9uTmVnYXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHNldE9iamVjdChuZXcgTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIm5vblBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICBzZXRPYmplY3QobmV3IE5vblBvc2l0aXZlSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk9iamVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkQnl0ZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkQnl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE0YTNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZEJ5dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlczsKLQotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBVbnNpZ25lZEJ5dGUKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEJ5dGUiPlhNTCBTY2hlbWEgMy4zLjI0PC9hPgotICovCi1wdWJsaWMgY2xhc3MgVW5zaWduZWRCeXRlIGV4dGVuZHMgVW5zaWduZWRTaG9ydCB7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ2MzE3NTQ3ODcxNDU1MjY3NTlMOwotCi0gICAgcHVibGljIFVuc2lnbmVkQnl0ZSgpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGN0b3IgZm9yIFVuc2lnbmVkQnl0ZQotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdmFsaWRhdGlvbiBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBVbnNpZ25lZEJ5dGUobG9uZyBzVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShzVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZEJ5dGUoU3RyaW5nIHNWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKExvbmcucGFyc2VMb25nKHNWYWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc1ZhbHVlIHRoZSBudW1iZXIgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUobG9uZyBzVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAoIVVuc2lnbmVkQnl0ZS5pc1ZhbGlkKHNWYWx1ZSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRVbnNpZ25lZEJ5dGUwMCIpICsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc1ZhbHVlKSArICJdIik7Ci0gICAgICAgIGxWYWx1ZSA9IG5ldyBMb25nKHNWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCB2YWx1ZSBzcGFjZSBkZWZpbml0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc1ZhbHVlIG51bWJlciB0byBjaGVjayBhZ2FpbnN0IHJhbmdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQobG9uZyBzVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICEoKHNWYWx1ZSA8IDBMKSB8fCAoc1ZhbHVlID4gMjU1TCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1Vuc2lnbmVkSW50LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmMTk5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgcHJpbWl0aXZlIFhTRCBkYXRhIHR5cGUgVW5zaWduZWRJbnQKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZEludCI+WE1MIFNjaGVtYSAzLjMuMjI8L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVbnNpZ25lZEludCBleHRlbmRzIGphdmEubGFuZy5OdW1iZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg5MTUyMDQxNjgxNTQ3NDYzMDVMOwotCi0gICAgcHJvdGVjdGVkIExvbmcgbFZhbHVlID0gbmV3IExvbmcoMCk7Ci0KLSAgICBwdWJsaWMgVW5zaWduZWRJbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3RvciBmb3IgVW5zaWduZWRJbnQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHZhbGlkYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgVW5zaWduZWRJbnQobG9uZyBpVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShpVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZEludChTdHJpbmcgc3RWYWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKExvbmcucGFyc2VMb25nKHN0VmFsdWUpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHZhbGlkYXRlcyB0aGUgZGF0YSBhbmQgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaVZhbHVlIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUobG9uZyBpVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpZiAoIVVuc2lnbmVkSW50LmlzVmFsaWQoaVZhbHVlKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVW5zaWduZWRJbnQwMCIpICsKLVN0cmluZy52YWx1ZU9mKGlWYWx1ZSkgKyAiXSIpOwotICAgICAgICBsVmFsdWUgPSBuZXcgTG9uZyhpVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChsVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBsVmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaWYgKGxWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGxWYWx1ZS5oYXNoQ29kZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHhzZCBkZWZpbml0aW9uICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQobG9uZyBpVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICEoKGlWYWx1ZSA8IDBMKSB8fCAoaVZhbHVlID4gNDI5NDk2NzI5NUwpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBfX2VxdWFsc0NhbGMgPSBudWxsOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVuc2lnbmVkSW50KSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBVbnNpZ25lZEludCBvdGhlciA9IChVbnNpZ25lZEludClvYmo7Ci0gICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChfX2VxdWFsc0NhbGMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChfX2VxdWFsc0NhbGMgPT0gb2JqKTsKLSAgICAgICAgfQotICAgICAgICBfX2VxdWFsc0NhbGMgPSBvYmo7Ci0gICAgICAgIGJvb2xlYW4gX2VxdWFsczsKLSAgICAgICAgX2VxdWFscyA9ICgobFZhbHVlID09IG51bGwgJiYgb3RoZXIubFZhbHVlID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgKGxWYWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBsVmFsdWUuZXF1YWxzKG90aGVyLmxWYWx1ZSkpKTsKLSAgICAgICAgX19lcXVhbHNDYWxjID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIF9lcXVhbHM7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50IGphdmEubGFuZy5OdW1iZXIgaW50ZXJmYWNlCi0gICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmJ5dGVWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLnNob3J0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmxvbmdWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUuZG91YmxlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5mbG9hdFZhbHVlKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZExvbmcuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZExvbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2YzU1Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRMb25nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0vLyBDb25zaWRlciByZW1vdmluZyB0aGlzLgotLy8gQWxsIG9wZXJhdGlvbnMgYmVoYXZlIGFzIGlmIEJpZ0ludGVnZXJzIHdlcmUgcmVwcmVzZW50ZWQgaW4gdHdvJ3MtY29tcGxlbWVudCBub3RhdGlvbi4KLS8vIEluIGl0cyBwbGFjZSwgY29uc2lkZXIgdXNpbmcgcHJpbWl0aXZlIHR5cGUgbG9uZyAod2hpY2ggaXMgYWxyZWFkeSB0aGUgcmlnaHQgc2l6ZSkgdG8gaG9sZCB0aGUgZGF0YS4KLS8vIFRoaXMgY2xhc3MgY2FuIGhpZGUgdGhlIGZhY3QgdGhhdCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gYSBzaWduZWQgZW50aXR5LCBieSBjYXJlZnVsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGFzcycgbWV0aG9kcy4KLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0vKioKLSAqIEN1c3RvbSBjbGFzcyBmb3Igc3VwcG9ydGluZyBwcmltaXRpdmUgWFNEIGRhdGEgdHlwZSBVbnNpZ25lZExvbmcKLSAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN1bnNpZ25lZExvbmciPlhNTCBTY2hlbWEgMy4zLjIxPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVW5zaWduZWRMb25nIGV4dGVuZHMgamF2YS5sYW5nLk51bWJlciBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU5MTk5NDI1ODQyODQ4OTc1ODNMOwotCi0gICAgcHJvdGVjdGVkIEJpZ0ludGVnZXIgbFZhbHVlID0gQmlnSW50ZWdlci5aRVJPOwotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgTUFYID0gbmV3IEJpZ0ludGVnZXIoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1Iik7IC8vIG1heCB1bnNpZ25lZCBsb25nCi0KLSAgICBwdWJsaWMgVW5zaWduZWRMb25nKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZExvbmcoZG91YmxlIHZhbHVlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobmV3IEJpZ0ludGVnZXIoRG91YmxlLnRvU3RyaW5nKHZhbHVlKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZExvbmcoQmlnSW50ZWdlciB2YWx1ZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVW5zaWduZWRMb25nKGxvbmcgbFZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbmV3IFVuc2lnbmVkTG9uZyggMHhmZmZmZmZmZmZmZmZmZmZmTCApCi0gICAgICAgIC8vIHNob3VsZCBub3QgdGhyb3cgYW55IEV4Y2VwdGlvbiBiZWNhdXNlLCBhcyBhbiBVbnNpZ25lZExvbmcsIGl0IGlzIGluIHJhbmdlIGFuZCBub25uZWdhdGl2ZS4KLSAgICAgICAgc2V0VmFsdWUoQmlnSW50ZWdlci52YWx1ZU9mKGxWYWx1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZExvbmcoU3RyaW5nIHN0VmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIElmIHN0VmFsdWUgc3RhcnRzIHdpdGggYSBtaW51cyBzaWduLCB0aGF0IHdpbGwgYmUgYWNjZXB0YWJsZSB0byB0aGUgQmlnSW50ZWdlciBjb25zdHJ1Y3RvciwKLSAgICAgICAgLy8gYnV0IGl0IGlzIG5vdCBhY2NlcHRhYmxlIHRvIHVzLgotICAgICAgICAvLyBPbmNlIGVuY29kZWQgaW50byBiaW5hcnksIGl0IGlzIHRvbyBsYXRlIHRvIGRldGVjdCB0aGF0IHRoZSBjbGllbnQgaW50ZW5kZWQgYSBuZWdhdGl2ZSBpbnRlZ2VyLgotICAgICAgICAvLyBUaGF0IGRldGVjdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCBoZXJlLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHN0VmFsdWUuY2hhckF0KDApID09ICdcdTAwMmQnKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJBIFN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIGEgbWludXMgc2lnbiBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhbiBVbnNpZ25lZExvbmcuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRWYWx1ZShuZXcgQmlnSW50ZWdlcihzdFZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG51bWJlckZvcm1hdEV4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgbnVtYmVyRm9ybWF0RXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbikgewotICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgc3RWYWx1ZSBpcyBlbXB0eSB3aGVuIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IGEgbWludXMgc2lnbi4KLSAgICAgICAgICAgIC8vIEZyb20gdGhlIGNsaWVudCdzIHBvaW50IG9mIHZpZXcsIHRoZSBlbXB0eSBTdHJpbmcgc2hvdWxkIGNhdXNlIGEgTnVtYmVyRm9ybWF0RXhjZXB0aW9uLgotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkFuIGVtcHR5IHN0cmluZyBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhbiBVbnNpZ25lZExvbmcuIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZShCaWdJbnRlZ2VyIHZhbCkgewotICAgICAgICBpZiAoIVVuc2lnbmVkTG9uZy5pc1ZhbGlkKHZhbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVW5zaWduZWRMb25nMDAiKSArCi1TdHJpbmcudmFsdWVPZih2YWwpICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxWYWx1ZSA9IHZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0KLSAgICAgICAgLy8gQ29udmVydHMgdGhpcyBCaWdJbnRlZ2VyIHRvIGEgbG9uZy4KLSAgICAgICAgLy8gVGhpcyBjb252ZXJzaW9uIGlzIGFuYWxvZ291cyB0byBhIG5hcnJvd2luZyBwcmltaXRpdmUgY29udmVyc2lvbiBmcm9tIGxvbmcgdG8gaW50IGFzIGRlZmluZWQgaW4gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbjoKLSAgICAgICAgLy8gaWYgdGhpcyBCaWdJbnRlZ2VyIGlzIHRvbyBiaWcgdG8gZml0IGluIGEgbG9uZywgb25seSB0aGUgbG93LW9yZGVyIDY0IGJpdHMgYXJlIHJldHVybmVkLgotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBjb252ZXJzaW9uIGNhbiBsb3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdmVyYWxsIG1hZ25pdHVkZSBvZiB0aGUgQmlnSW50ZWdlciB2YWx1ZSBhcyB3ZWxsIGFzIHJldHVybiBhIHJlc3VsdCB3aXRoIHRoZSBvcHBvc2l0ZSBzaWduLgotICAgICAgICBsb25nIHVuc2lnbmVkTG9uZ1ZhbHVlID0gdmFsdWUubG9uZ1ZhbHVlKCk7Ci0KLSAgICAgICAgcmV0dXJuICEoY29tcGFyZSh1bnNpZ25lZExvbmdWYWx1ZSwgQmlnSW50ZWdlci5aRVJPLmxvbmdWYWx1ZSgpKSA8IDAgfHwgLy8gbGVzcyB0aGFuIHplcm8KLSAgICAgICAgICAgICAgICBjb21wYXJlKHVuc2lnbmVkTG9uZ1ZhbHVlLCBNQVgubG9uZ1ZhbHVlKCkpID4gMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChsVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBsVmFsdWUuaGFzaENvZGUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgX19lcXVhbHNDYWxjID0gbnVsbDsKLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBVbnNpZ25lZExvbmcpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFVuc2lnbmVkTG9uZyBvdGhlciA9IChVbnNpZ25lZExvbmcpb2JqOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotICAgICAgICBpZiAoX19lcXVhbHNDYWxjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoX19lcXVhbHNDYWxjID09IG9iaik7Ci0gICAgICAgIH0KLSAgICAgICAgX19lcXVhbHNDYWxjID0gb2JqOwotICAgICAgICBib29sZWFuIF9lcXVhbHM7Ci0gICAgICAgIF9lcXVhbHMgPSAoKGxWYWx1ZSA9PSBudWxsICYmIG90aGVyLmxWYWx1ZSA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgIChsVmFsdWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbFZhbHVlLmVxdWFscyhvdGhlci5sVmFsdWUpKSk7Ci0gICAgICAgIF9fZXF1YWxzQ2FsYyA9IG51bGw7Ci0gICAgICAgIHJldHVybiBfZXF1YWxzOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudCBqYXZhLmxhbmcuTnVtYmVyIGludGVyZmFjZQotICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5ieXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgc2hvcnRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5zaG9ydFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxWYWx1ZS5sb25nVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgewotICAgICAgICByZXR1cm4gbFZhbHVlLmRvdWJsZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBsVmFsdWUuZmxvYXRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIDAgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIFVuc2lnbmVkTG9uZyBudW1lcmljYWxseSBlcXVhbCB0byB0aGlzCi0gICAgICogICAgICAgICBVbnNpZ25lZExvbmc7IGEgdmFsdWUgbGVzcyB0aGFuIDAgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIFVuc2lnbmVkTG9uZyBudW1lcmljYWxseQotICAgICAqICAgICAgICAgZ3JlYXRlciB0aGFuIHRoaXMgVW5zaWduZWRMb25nOyBhbmQgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMCBpZiB0aGUgYXJndW1lbnQgaXMgYW4KLSAgICAgKiAgICAgICAgIFVuc2lnbmVkTG9uZyBudW1lcmljYWxseSBsZXNzIHRoYW4gdGhpcyBVbnNpZ25lZExvbmcuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLSAgICAgICAgaW50IHJldFZhbCA9Ci0gICAgICAgICAgICAgICAgMDsgLy8gYXJiaXRyYXJ5IGRlZmF1bHQgdmFsdWUgaW4gY2FzZSBvZiBleGNlcHRpb247IHJlcXVpcmVkIHJldHVybiB2YWx1ZSBpbiBjYXNlIHRoaXMgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0KLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCAhKG8gaW5zdGFuY2VvZiBVbnNpZ25lZExvbmcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJUaGUgYXJndW1lbnQgaXMgbm90IGFuIFVuc2lnbmVkTG9uZy4iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBPbmx5IG5lZWQgdG8gY2hhbmdlIHJldFZhbCBpZiB0aGlzIG9iamVjdCBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0gICAgICAgIHJldFZhbCA9IGNvbXBhcmUobG9uZ1ZhbHVlKCksICgoVW5zaWduZWRMb25nKW8pLmxvbmdWYWx1ZSgpKTsKLQotICAgICAgICByZXR1cm4gcmV0VmFsOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgMCBpZiB0aGF0TG9uZyBpcyBhIGxvbmcgbnVtZXJpY2FsbHkgZXF1YWwgdG8gdGhpc0xvbmc7IGEgdmFsdWUgbGVzcyB0aGFuIDAKLSAgICAgKiAgICAgICAgIGlmIHRoYXRMb25nIGlzIGEgbG9uZyBudW1lcmljYWxseSBncmVhdGVyIHRoYW4gdGhpc0xvbmc7IGFuZCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwCi0gICAgICogICAgICAgICBpZiB0aGF0TG9uZyBpcyBhIGxvbmcgbnVtZXJpY2FsbHkgbGVzcyB0aGFuIHRoaXNMb25nICh1bnNpZ25lZCBjb21wYXJpc29uKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZShsb25nIHRoaXNMb25nLCBsb25nIHRoYXRMb25nKSB7Ci0gICAgICAgIC8vIFRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiwgZG8gbm90IGluc3RhbnRpYXRlIFVuc2lnbmVkTG9uZyBpbiB0aGlzIG1ldGhvZCwgd2hpY2ggbWF5IGJlIGNhbGxlZCBkdXJpbmcgVW5zaWduZWRMb25nIGluc3RhbnRpYXRpb24uCi0KLSAgICAgICAgaWYgKHRoaXNMb25nID09IHRoYXRMb25nKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNMZXNzVGhhbjsgLy8gVGhpcyBpcyBsZXNzIHRoYW4gdGhhdC4KLQotICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbW9zdCBzaWduaWZpY2FudCBoYWxmIG9mIHRoZSBkYXRhIGZvciBjb21wYXJpc29uLgotICAgICAgICAgICAgLy8gVGhlIHNoaWZ0IGRpc3RhbmNlIGNhbiBiZSBhbnkgbnVtYmVyIGZyb20gMSB0byAzMiBpbmNsdXNpdmUgKDEgaXMgcHJvYmFibHkgZmFzdGVzdCkuCi0gICAgICAgICAgICAvLyBBIHNoaWZ0IGRpc3RhbmNlIG9mIG9uZSBpcyBzdWZmaWNpZW50IHRvIG1vdmUgdGhlIHNpZ25pZmljYW50IGRhdGEgb2ZmIG9mIHRoZSBzaWduIGJpdCwgYWxsb3dpbmcgZm9yIGEgc2lnbmVkIGNvbXBhcmlzb24gb2YgcG9zaXRpdmUgbnVtYmVycyAoaS5lLiBhbiB1bnNpZ25lZCBjb21wYXJpc29uKS4KLSAgICAgICAgICAgIGxvbmcgdGhpc0hhbGZMb25nID0gKHRoaXNMb25nICYgMHhmZmZmZmZmZjAwMDAwMDAwTCkgPj4+IDE7Ci0gICAgICAgICAgICBsb25nIHRoYXRIYWxmTG9uZyA9ICh0aGF0TG9uZyAmIDB4ZmZmZmZmZmYwMDAwMDAwMEwpID4+PiAxOwotCi0gICAgICAgICAgICBpZiAodGhpc0hhbGZMb25nID09IHRoYXRIYWxmTG9uZykgewotICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYWxzbyBsb29rIGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBoYWxmIG9mIHRoZSBkYXRhLgotCi0gICAgICAgICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgaGFsZiBvZiB0aGUgZGF0YSBmb3IgY29tcGFyaXNvbi4KLSAgICAgICAgICAgICAgICB0aGlzSGFsZkxvbmcgPSAodGhpc0xvbmcgJiAweDAwMDAwMDAwZmZmZmZmZmZMKTsKLSAgICAgICAgICAgICAgICB0aGF0SGFsZkxvbmcgPSAodGhhdExvbmcgJiAweDAwMDAwMDAwZmZmZmZmZmZMKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBkYXRhIGlzIG5vdCBlcXVhbC4KLSAgICAgICAgICAgICAgICBpc0xlc3NUaGFuID0gdGhpc0hhbGZMb25nIDwgdGhhdEhhbGZMb25nOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgYW5zd2VyIGlzIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGhhbGYgb2YgdGhlIGRhdGEuCi0gICAgICAgICAgICAgICAgaXNMZXNzVGhhbiA9IHRoaXNIYWxmTG9uZyA8IHRoYXRIYWxmTG9uZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzTGVzc1RoYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7IC8vIFJldHVybnMgYSBuZWdhdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgb2JqZWN0IGlzIGxlc3MgdGhhbiB0aGFuIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsgLy8gUmV0dXJucyBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMgZ3JlYXRlciB0aGFuIHRoYW4gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZFNob3J0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvVW5zaWduZWRTaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhiMGRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9VbnNpZ25lZFNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotLyoqCi0gKiBDdXN0b20gY2xhc3MgZm9yIHN1cHBvcnRpbmcgcHJpbWl0aXZlIFhTRCBkYXRhIHR5cGUgVW5zaWduZWRTaG9ydAotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3Vuc2lnbmVkU2hvcnQiPlhNTCBTY2hlbWEgMy4zLjIzPC9hPgotICovCi1wdWJsaWMgY2xhc3MgVW5zaWduZWRTaG9ydCBleHRlbmRzIFVuc2lnbmVkSW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4MjI1OTg0NDc2OTI4MTYzODBMOwotCi0gICAgcHVibGljIFVuc2lnbmVkU2hvcnQoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjdG9yIGZvciBVbnNpZ25lZFNob3J0Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB2YWxpZGF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIFVuc2lnbmVkU2hvcnQobG9uZyBzVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShzVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbnNpZ25lZFNob3J0KFN0cmluZyBzVmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShMb25nLnBhcnNlTG9uZyhzVmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB2YWxpZGF0ZXMgdGhlIGRhdGEgYW5kIHNldHMgdGhlIHZhbHVlIGZvciB0aGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNWYWx1ZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGxvbmcgc1ZhbHVlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFVbnNpZ25lZFNob3J0LmlzVmFsaWQoc1ZhbHVlKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFVuc2lnbmVkU2hvcnQwMCIpICsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc1ZhbHVlKSArICJdIik7Ci0gICAgICAgIGxWYWx1ZSA9IG5ldyBMb25nKHNWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqIHZhbGlkYXRlIHRoZSB2YWx1ZSBhZ2FpbnN0IHRoZSB4c2QgZGVmaW5pdGlvbiAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKGxvbmcgc1ZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAhKChzVmFsdWUgPCAwTCkgfHwgKHNWYWx1ZSA+IDY1NTM1TCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1llYXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9ZZWFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNmJhN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL1llYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXM7Ci0KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgdHlwZSBnWWVhcgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyIj5YTUwgU2NoZW1hIDMuMi4xMTwvYT4KLSAqLwotcHVibGljIGNsYXNzIFllYXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzQ5ODg3NjEyMDMzNDg1NzAxOUw7Ci0KLSAgICBpbnQgeWVhcjsKLSAgICBTdHJpbmcgdGltZXpvbmUgPSBudWxsOwotCi0gICAgLyoqIENvbnN0cnVjdHMgYSBZZWFyIHdpdGggdGhlIGdpdmVuIHZhbHVlcyBObyB0aW1lem9uZSBpcyBzcGVjaWZpZWQgKi8KLSAgICBwdWJsaWMgWWVhcihpbnQgeWVhcikgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHllYXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBZZWFyIHdpdGggdGhlIGdpdmVuIHZhbHVlcywgaW5jbHVkaW5nIGEgdGltZXpvbmUgc3RyaW5nIFRoZSB0aW1lem9uZSBpcwotICAgICAqIHZhbGlkYXRlZCBidXQgbm90IHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIFllYXIoaW50IHllYXIsIFN0cmluZyB0aW1lem9uZSkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHllYXIsIHRpbWV6b25lKTsKLSAgICB9Ci0KLSAgICAvKiogQ29uc3RydWN0IGEgWWVhciBmcm9tIGEgU3RyaW5nIGluIHRoZSBmb3JtYXQgWy1dQ0NZWVt0aW1lem9uZV0gKi8KLSAgICBwdWJsaWMgWWVhcihTdHJpbmcgc291cmNlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG5lZ2F0aXZlID0gMDsKLQotICAgICAgICBpZiAoc291cmNlLmNoYXJBdCgwKSA9PSAnLScpIHsKLSAgICAgICAgICAgIG5lZ2F0aXZlID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpIDwgKDQgKyBuZWdhdGl2ZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkWWVhcjAwIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2FsY3VsYXRlIGhvdyBtYW55IG1vcmUgdGhhbiA0IGRpZ2l0cyAoaWYgYW55KSBpbiB0aGUgeWVhcgotICAgICAgICBpbnQgcG9zID0gNCArIG5lZ2F0aXZlOyAgLy8gc2tpcCBtaW51cyBzaWduIGlmIHByZXNlbnQKLSAgICAgICAgd2hpbGUgKHBvcyA8IHNvdXJjZS5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNEaWdpdChzb3VyY2UuY2hhckF0KHBvcykpKSB7Ci0gICAgICAgICAgICArK3BvczsKLSAgICAgICAgfQotCi0gICAgICAgIHNldFZhbHVlKEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygwLCBwb3MpKSwKLSAgICAgICAgICAgICAgICAgc291cmNlLnN1YnN0cmluZyhwb3MpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFllYXIoKSB7Ci0gICAgICAgIHJldHVybiB5ZWFyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFllYXIoaW50IHllYXIpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgeWVhciwgbW9yZSB0aGFuIDQgZGlnaXRzIGFyZSBhbGxvd2VkIQotICAgICAgICBpZiAoeWVhciA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFllYXIwMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMueWVhciA9IHllYXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUaW1lem9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRpbWV6b25lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWV6b25lKFN0cmluZyB0aW1lem9uZSkgewotICAgICAgICAvLyB2YWxpZGF0ZSB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCAmJiB0aW1lem9uZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIEZvcm1hdCBbKy8tXUhIOk1NCi0gICAgICAgICAgICBpZiAodGltZXpvbmUuY2hhckF0KDApID09ICcrJyB8fCAodGltZXpvbmUuY2hhckF0KDApID09ICctJykpIHsKLSAgICAgICAgICAgICAgICBpZiAodGltZXpvbmUubGVuZ3RoKCkgIT0gNiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgxKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZS5jaGFyQXQoMykgIT0gJzonIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDQpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCg1KSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbWV6b25lLmVxdWFscygiWiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFRpbWV6b25lMDAiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiB3ZSBnb3QgdGhpcyBmYXIsIGl0cyBnb29kCi0gICAgICAgICAgICB0aGlzLnRpbWV6b25lID0gdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgeWVhciwgU3RyaW5nIHRpbWV6b25lKQotICAgICAgICAgICAgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFllYXIoeWVhcik7Ci0gICAgICAgIHNldFRpbWV6b25lKHRpbWV6b25lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgeWVhcikgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFllYXIoeWVhcik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgLy8gdXNlIE51bWJlckZvcm1hdCB0byBlbnN1cmUgbGVhZGluZyB6ZXJvcwotICAgICAgICBOdW1iZXJGb3JtYXQgbmYgPSBOdW1iZXJGb3JtYXQuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgbmYuc2V0R3JvdXBpbmdVc2VkKGZhbHNlKTsKLQotICAgICAgICAvLyB5ZWFyCi0gICAgICAgIG5mLnNldE1pbmltdW1JbnRlZ2VyRGlnaXRzKDQpOwotICAgICAgICBTdHJpbmcgcyA9IG5mLmZvcm1hdCh5ZWFyKTsKLQotICAgICAgICAvLyB0aW1lem9uZQotICAgICAgICBpZiAodGltZXpvbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgcyA9IHMgKyB0aW1lem9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBZZWFyKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBZZWFyIG90aGVyID0gKFllYXIpb2JqOwotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHJldHVybiB0cnVlOwotCi0gICAgICAgIGJvb2xlYW4gZXF1YWxzID0gKHRoaXMueWVhciA9PSBvdGhlci55ZWFyKTsKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVxdWFscyA9IGVxdWFscyAmJiB0aW1lem9uZS5lcXVhbHMob3RoZXIudGltZXpvbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcXVhbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB5ZWFyIFhPUmVkIHdpdGggdGhlIGhhc2hDb2RlIG9mIHRpbWV6b25lIGlmZiBvbmUgaXMgZGVmaW5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsID09IHRpbWV6b25lID8geWVhciA6IHllYXIgXiB0aW1lem9uZS5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9ZZWFyTW9udGguamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9ZZWFyTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmZTRjYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvWWVhck1vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzOwotCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnRleHQuTnVtYmVyRm9ybWF0OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgU2NoZW1hIHR5cGUgZ1llYXJNb250aAotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2dZZWFyTW9udGgiPlhNTCBTY2hlbWEgMy4yLjEwPC9hPgotICovCi1wdWJsaWMgY2xhc3MgWWVhck1vbnRoIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTEwNzM5ODQyNjYxNjkwNTUxTDsKLQotICAgIGludCB5ZWFyOwotICAgIGludCBtb250aDsKLSAgICBTdHJpbmcgdGltZXpvbmUgPSBudWxsOwotCi0gICAgLyoqIENvbnN0cnVjdHMgYSBZZWFyTW9udGggd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzIE5vIHRpbWV6b25lIGlzIHNwZWNpZmllZCAqLwotICAgIHB1YmxpYyBZZWFyTW9udGgoaW50IHllYXIsIGludCBtb250aCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFZhbHVlKHllYXIsIG1vbnRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgWWVhck1vbnRoIHdpdGggdGhlIGdpdmVuIHZhbHVlcywgaW5jbHVkaW5nIGEgdGltZXpvbmUgc3RyaW5nIFRoZSB0aW1lem9uZSBpcwotICAgICAqIHZhbGlkYXRlZCBidXQgbm90IHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIFllYXJNb250aChpbnQgeWVhciwgaW50IG1vbnRoLCBTdHJpbmcgdGltZXpvbmUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZSh5ZWFyLCBtb250aCwgdGltZXpvbmUpOwotICAgIH0KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBZZWFyTW9udGggZnJvbSBhIFN0cmluZyBpbiB0aGUgZm9ybWF0IFstXUNDWVktTU0gKi8KLSAgICBwdWJsaWMgWWVhck1vbnRoKFN0cmluZyBzb3VyY2UpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBpbnQgbmVnYXRpdmUgPSAwOwotCi0gICAgICAgIGlmIChzb3VyY2UuY2hhckF0KDApID09ICctJykgewotICAgICAgICAgICAgbmVnYXRpdmUgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzb3VyY2UubGVuZ3RoKCkgPCAoNyArIG5lZ2F0aXZlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkWWVhck1vbnRoMDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29rIGZvciBmaXJzdCAnLScKLSAgICAgICAgaW50IHBvcyA9IHNvdXJjZS5zdWJzdHJpbmcobmVnYXRpdmUpLmluZGV4T2YoJy0nKTsKLSAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkWWVhck1vbnRoMDAiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZ2F0aXZlID4gMCkgcG9zKys7ICAgIC8vYWRqdXN0IGluZGV4IGZvciBvcmdpbmFsIHN0cmluZwotCi0gICAgICAgIHNldFZhbHVlKEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygwLCBwb3MpKSwKLSAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChzb3VyY2Uuc3Vic3RyaW5nKHBvcyArIDEsIHBvcyArIDMpKSwKLSAgICAgICAgICAgICAgICAgc291cmNlLnN1YnN0cmluZyhwb3MgKyAzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRZZWFyKCkgewotICAgICAgICByZXR1cm4geWVhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRZZWFyKGludCB5ZWFyKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIHllYXIsIG1vcmUgdGhhbiA0IGRpZ2l0cyBhcmUgYWxsb3dlZCEKLSAgICAgICAgaWYgKHllYXIgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgLy8gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkWWVhck1vbnRoMDAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnllYXIgPSB5ZWFyOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TW9udGgoKSB7Ci0gICAgICAgIHJldHVybiBtb250aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb250aChpbnQgbW9udGgpIHsKLSAgICAgICAgLy8gdmFsaWRhdGUgbW9udGgKLSAgICAgICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VzLmdldE1lc3NhZ2UoImJhZFllYXJNb250aDAwIikpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubW9udGggPSBtb250aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWV6b25lKCkgewotICAgICAgICByZXR1cm4gdGltZXpvbmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGltZXpvbmUoU3RyaW5nIHRpbWV6b25lKSB7Ci0gICAgICAgIC8vIHZhbGlkYXRlIHRpbWV6b25lCi0gICAgICAgIGlmICh0aW1lem9uZSAhPSBudWxsICYmIHRpbWV6b25lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgLy8gRm9ybWF0IFsrLy1dSEg6TU0KLSAgICAgICAgICAgIGlmICh0aW1lem9uZS5jaGFyQXQoMCkgPT0gJysnIHx8ICh0aW1lem9uZS5jaGFyQXQoMCkgPT0gJy0nKSkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZS5sZW5ndGgoKSAhPSA2IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDEpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIUNoYXJhY3Rlci5pc0RpZ2l0KHRpbWV6b25lLmNoYXJBdCgyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lLmNoYXJBdCgzKSAhPSAnOicgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICFDaGFyYWN0ZXIuaXNEaWdpdCh0aW1lem9uZS5jaGFyQXQoNCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhQ2hhcmFjdGVyLmlzRGlnaXQodGltZXpvbmUuY2hhckF0KDUpKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIC8vTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkVGltZXpvbmUwMCIpKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICghdGltZXpvbmUuZXF1YWxzKCJaIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy9NZXNzYWdlcy5nZXRNZXNzYWdlKCJiYWRUaW1lem9uZTAwIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgd2UgZ290IHRoaXMgZmFyLCBpdHMgZ29vZAotICAgICAgICAgICAgdGhpcy50aW1lem9uZSA9IHRpbWV6b25lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHllYXIsIGludCBtb250aCwgU3RyaW5nIHRpbWV6b25lKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgc2V0WWVhcih5ZWFyKTsKLSAgICAgICAgc2V0TW9udGgobW9udGgpOwotICAgICAgICBzZXRUaW1lem9uZSh0aW1lem9uZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IHllYXIsIGludCBtb250aCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldFllYXIoeWVhcik7Ci0gICAgICAgIHNldE1vbnRoKG1vbnRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAvLyB1c2UgTnVtYmVyRm9ybWF0IHRvIGVuc3VyZSBsZWFkaW5nIHplcm9zCi0gICAgICAgIE51bWJlckZvcm1hdCBuZiA9IE51bWJlckZvcm1hdC5nZXRJbnN0YW5jZSgpOwotICAgICAgICBuZi5zZXRHcm91cGluZ1VzZWQoZmFsc2UpOwotCi0gICAgICAgIC8vIHllYXIKLSAgICAgICAgbmYuc2V0TWluaW11bUludGVnZXJEaWdpdHMoNCk7Ci0gICAgICAgIFN0cmluZyBzID0gbmYuZm9ybWF0KHllYXIpICsgIi0iOwotCi0gICAgICAgIC8vIG1vbnRoCi0gICAgICAgIG5mLnNldE1pbmltdW1JbnRlZ2VyRGlnaXRzKDIpOwotICAgICAgICBzICs9IG5mLmZvcm1hdChtb250aCk7Ci0KLSAgICAgICAgLy8gdGltZXpvbmUKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHMgPSBzICsgdGltZXpvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgWWVhck1vbnRoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBZZWFyTW9udGggb3RoZXIgPSAoWWVhck1vbnRoKW9iajsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBib29sZWFuIGVxdWFscyA9ICh0aGlzLnllYXIgPT0gb3RoZXIueWVhciAmJiB0aGlzLm1vbnRoID09IG90aGVyLm1vbnRoKTsKLSAgICAgICAgaWYgKHRpbWV6b25lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVxdWFscyA9IGVxdWFscyAmJiB0aW1lem9uZS5lcXVhbHMob3RoZXIudGltZXpvbmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlcXVhbHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiAobW9udGggKyB5ZWFyKSBYT1JlZCB3aXRoIHRoZSBoYXNoQ29kZSBvZiB0aW1lem9uZSBpZmYgb25lIGlzIGRlZmluZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gbnVsbCA9PSB0aW1lem9uZQotICAgICAgICAgICAgICAgID8gKG1vbnRoICsgeWVhcikKLSAgICAgICAgICAgICAgICA6IChtb250aCArIHllYXIpIF4gdGltZXpvbmUuaGFzaENvZGUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvcGFja2FnZS5odG1sIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1MmY3NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGh0bWw+DQotPGJvZHk+DQotVGhlc2UgY2xhc3NlcyBhcmUgZGlyZWN0bHkgc2FsdmFnZWQgZnJvbSBBeGlzIDEgY29kZWJhc2UuIE9yaWdpbmFsIGF1dGhvciBjb21tZW50cyBoYXZlIGJlZW4NCi1wcmVzZXJ2ZWQhDQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FueVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQW55VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDEzZGVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQW55VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBBbnlUeXBlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEFueVR5cGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgQW55VHlwZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwKLSAgICAgICAgICAgICAgICAiYW55VHlwZSIsCi0gICAgICAgICAgICAgICAgIlNPQVAtRU5DIik7Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBBbnlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBsb2NhbEFueVR5cGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0QW55VHlwZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFueVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQW55VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QW55VHlwZShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxBbnlUeXBlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLE1ZX1FOQU1FKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQW55VHlwZS50aGlzLnNlcmlhbGl6ZShNWV9RTkFNRSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgTVlfUU5BTUUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZSA9ICJhbnlUeXBlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHR5cGUgZGV0YWlscyBpZiB0aGlzIGlzIHVzZWQgaW4gYSBzaW1wbGUgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6YW55VHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQW55VHlwZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlZhbHVlIGNhbm5vdCBiZSBudWxsICEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxBbnlUeXBlLnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKE1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsQW55VHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBBbnlUeXBlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBBbnlUeXBlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFueVR5cGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSApewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNlIHRoZSBRTmFtZSBmcm9tIHRoZSBwYXJzZXIgYXMgdGhlIG5hbWUgZm9yIHRoZSBidWlsZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBzdGFydFFuYW1lMSA9IHJlYWRlci5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdyYXAgdGhlIHJlYWRlciBzbyB0aGF0IGl0IHByb2R1Y2VzIGEgZmFrZSBTVEFSVF9ET0NVTUVOVCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIGJ5IHRoZSBidWlsZGVyIGNsYXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlciBidWlsZGVyMSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLk5hbWVkU3RheE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcihyZWFkZXIpLHN0YXJ0UW5hbWUxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QW55VHlwZShidWlsZGVyMS5nZXRPTUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQW55VVJJLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FueVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDMyMDFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQW55VVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEFueVVSSS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBBbnlVUkkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgQW55VVJJCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gYW55VVJJCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgQW55VVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBsb2NhbEFueVVSSSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBnZXRBbnlVUkkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBbnlVUkk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQW55VVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbnlVUkkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQW55VVJJPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBbnlVUkkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQW55VVJJLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjphbnlVUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlVUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxBbnlVUkk9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYW55VVJJIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsQW55VVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEFueVVSSSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxBbnlVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYW55VVJJIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBBbnlVUkkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgQW55VVJJIHJldHVyblZhbHVlID0gbmV3ICBBbnlVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0QW55VVJJKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQW55VVJJKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBBbnlVUkkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFueVVSSS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW55VVJJLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBBbnlVUkkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEFueVVSSSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBBbnlVUkkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImFueVVSSSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEFueVVSSSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEFueVVSSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQW55VVJJKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXkuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4MmRlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FycmF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBBcnJheS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQXJyYXkgYmVhbiBjbGFzcwotICovCi0KLXB1YmxpYyBjbGFzcyBBcnJheSBpbXBsZW1lbnRzIEFEQkJlYW4gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIENISUxEX0xPQ0FMX05BTUUgPSAiaXRlbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNPQVBfTkFNRVNQQUNFX1BSRUZJWCA9ICJTT0FQLUVOQyI7Ci0KLSAgICBwdWJsaWMgQXJyYXkoKSB7Ci0gICAgICAgIHRoaXMub2JqZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgTGlzdCBvYmplY3RMaXN0OwotCi0gICAgcHVibGljIExpc3QgZ2V0T2JqZWN0TGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TGlzdChMaXN0IG9iamVjdExpc3QpIHsKLSAgICAgICAgdGhpcy5vYmplY3RMaXN0ID0gb2JqZWN0TGlzdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIHRoaXMub2JqZWN0TGlzdC5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBhcnJheVR5cGVRTmFtZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEFycmF5VHlwZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUpewotICAgICAgICBhcnJheVR5cGVRTmFtZSA9IHFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldEFycmF5VHlwZVFOYW1lKCl7Ci0gICAgICAgIHJldHVybiBhcnJheVR5cGVRTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBmaWVsZCBmb3IgQXJyYXlUeXBlCi0gICAgICogVGhpcyB3YXMgYW4gQXR0cmlidXRlIQotICAgICAqLwotCi0KLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBsb2NhbEFycmF5VHlwZTsKLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QXJyYXlUeXBlKCkgewotICAgICAgICByZXR1cm4gbG9jYWxBcnJheVR5cGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gQXJyYXlUeXBlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXlUeXBlKGphdmEubGFuZy5TdHJpbmcgcGFyYW0pIHsKLQotICAgICAgICB0aGlzLmxvY2FsQXJyYXlUeXBlID0gcGFyYW07Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogZmllbGQgZm9yIE9mZnNldAotICAgICAqIFRoaXMgd2FzIGFuIEF0dHJpYnV0ZSEKLSAgICAgKi8KLQotCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxPZmZzZXQ7Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE9mZnNldCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsT2Zmc2V0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIE9mZnNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9mZnNldChqYXZhLmxhbmcuU3RyaW5nIHBhcmFtKSB7Ci0KLSAgICAgICAgdGhpcy5sb2NhbE9mZnNldCA9IHBhcmFtOwotCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGZpZWxkIGZvciBJZAotICAgICAqIFRoaXMgd2FzIGFuIEF0dHJpYnV0ZSEKLSAgICAgKi8KLQotCi0gICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQgbG9jYWxJZDsKLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbElkOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIElkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBwYXJhbSkgewotCi0gICAgICAgIHRoaXMubG9jYWxJZCA9IHBhcmFtOwotCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGZpZWxkIGZvciBIcmVmCi0gICAgICogVGhpcyB3YXMgYW4gQXR0cmlidXRlIQotICAgICAqLwotCi0KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgbG9jYWxIcmVmOwotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJIGdldEhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbEhyZWY7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gSHJlZgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhyZWYob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgcGFyYW0pIHsKLQotICAgICAgICB0aGlzLmxvY2FsSHJlZiA9IHBhcmFtOwotCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBBREJFeGNlcHRpb24gewotCi0KLSAgICAgICAgT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPSBuZXcgQURCRGF0YVNvdXJjZSh0aGlzLCBwYXJlbnRRTmFtZSkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIEFycmF5LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLCBmYWN0b3J5LCB4bWxXcml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICByZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKHBhcmVudFFOYW1lLCBmYWN0b3J5LCBkYXRhU291cmNlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLCBmYWN0b3J5LCB4bWxXcml0ZXIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBwcmVmaXgsIHhtbFdyaXRlcik7Ci0KLSAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpIHsKLQotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXggKyAiOkFycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXJyYXlUeXBlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhcnJheVR5cGUgPSBudWxsOwotICAgICAgICBpZiAoYXJyYXlUeXBlUU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICBhcnJheVR5cGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGFycmF5VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIGFycmF5VHlwZSA9IGFycmF5VHlwZVFOYW1lLmdldExvY2FsUGFydCgpICsgIlsiICsgb2JqZWN0TGlzdC5zaXplKCkgKyAiXSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3cml0ZSBpdCBhcyB1ci10eXBlCi0gICAgICAgICAgICBhcnJheVR5cGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgYXJyYXlUeXBlID0gICJ1ci10eXBlWyIgKyBvYmplY3RMaXN0LnNpemUoKSArICJdIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoYXJyYXlUeXBlUHJlZml4ICE9IG51bGwpICYmIChhcnJheVR5cGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgIGFycmF5VHlwZSA9IGFycmF5VHlwZVByZWZpeCArICI6IiArIGFycmF5VHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlQXR0cmlidXRlKHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiksCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwKLSAgICAgICAgICAgICAgICAiYXJyYXlUeXBlIiwgYXJyYXlUeXBlLCB4bWxXcml0ZXIpOwotCi0gICAgICAgIGlmIChsb2NhbE9mZnNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLAotICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IiwgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxPZmZzZXQpLCB4bWxXcml0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2FsSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoIiIsICJpZCIsIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSWQpLCB4bWxXcml0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2FsSHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgiIiwgImhyZWYiLCBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEhyZWYpLCB4bWxXcml0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VyaWFsaXplIHRoZSBvYmplY3QgYXJyYXkKLSAgICAgICAgLy8gc2luY2Ugc29hcCBlbmNvZGluZyBkb2VzIG5vdCBlbmZvcmNlIHRoZSBuYW1lIG9mIHRoZSBjaGlsZHJlbiBpdGVtcwotICAgICAgICAvLyBoZXJlIHdlIHVzZSBpdGVtIGFzIHRoZSBjaGlsZCBuYW1lLgotCi0gICAgICAgIC8vIGFsbCB0aGUgbGlzdCBvYmplY3RzIG11c3QgYmUgQURCQmVhbnMgZm9yIGJhc2ljIHNjaGVtYSB0eXBlcyBzdWNoIGFzCi0gICAgICAgIC8vIGludCxmbG9hdCBjb3JyZXNwb25kaW5nIHNvYXBlbmNvZGluZyBjbGFzcyBtdXN0IGJlIHVzZWQKLSAgICAgICAgQURCQmVhbiBhZGJCZWFuOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYWRiQmVhbiA9IChBREJCZWFuKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChhZGJCZWFuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJyYXlUeXBlUU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXJyYXkgVHlwZSBpcyBnaXZlbiB0aGVuIGVhY2ggZWxlbWVudCBkb2VzIG5vdCBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIGFkYkJlYW4uc2VyaWFsaXplKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCIiLCBDSElMRF9MT0NBTF9OQU1FKSwgZmFjdG9yeSwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGJCZWFuLnNlcmlhbGl6ZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwgQ0hJTERfTE9DQUxfTkFNRSksIGZhY3RvcnksIHhtbFdyaXRlciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vd3JpdGUgdGhlIG51bGwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQoIiIsIENISUxEX0xPQ0FMX05BTUUsIG51bGwsIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJuaWwiLCAiMSIsIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbFBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbFBhcnQsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpIHRocm93cyBBREJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IHsKLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgICogSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgICogSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQXJyYXkgcGFyc2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgQ2xhc3MgbWFwcGVyQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgQXJyYXkgb2JqZWN0ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSAiIjsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLS8vICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiKSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0vLyAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCwgZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeCA9PSBudWxsID8gIiIgOiBuc1ByZWZpeDsKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSArIDEpOwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiQXJyYXkiLmVxdWFscyh0eXBlKSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQXJyYXkpIEV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KG5zVXJpLCB0eXBlLCByZWFkZXIpOwotLy8gICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICJhcnJheVR5cGUiCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAiYXJyYXlUeXBlIik7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnNldEFycmF5VHlwZShDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhhdHRyaWJ1dGVUeXBlKSk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVkQXR0cmlidXRlcy5hZGQoImFycmF5VHlwZSIpOwotCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGF0dHJpYnV0ZSAib2Zmc2V0IgotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgb2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCAib2Zmc2V0Iik7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnNldE9mZnNldChDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhvZmZzZXQpKTsKLQotICAgICAgICAgICAgICAgIGhhbmRsZWRBdHRyaWJ1dGVzLmFkZCgib2Zmc2V0Iik7Ci0KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICJpZCIKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJpZCIpOwotICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJZChDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEKGlkKSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlZEF0dHJpYnV0ZXMuYWRkKCJpZCIpOwotCi0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGF0dHJpYnV0ZSAiaHJlZiIKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGhyZWYgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImhyZWYiKTsKLSAgICAgICAgICAgICAgICBvYmplY3Quc2V0SHJlZihDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FueVVSSShocmVmKSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlZEF0dHJpYnV0ZXMuYWRkKCJocmVmIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGNoaWxkIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGFycmF5RWxlbWVudFFOYW1lID0gZ2V0SW5uZXJFbGVtZW50c1FOYW1lKGF0dHJpYnV0ZVR5cGUsIHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnNldEFycmF5VHlwZVFOYW1lKGFycmF5RWxlbWVudFFOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxvb3BEb25lID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFsb29wRG9uZSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGlzIG9iamVjdCBpcyBudWxsIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlVmFsdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwibmlsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgfHwgIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuYWRkT2JqZWN0KG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJyYXlFbGVtZW50UU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGFycmF5IGhhcyBzYW1lIGF0dHJpYnV0ZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5hZGRPYmplY3QoZ2V0T2JqZWN0KGFycmF5RWxlbWVudFFOYW1lLHJlYWRlcixtYXBwZXJDbGFzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5RWxlbWVudFFOYW1lIG51bGwgbWVhbnMgdGhpcyBkb2VzIG5vdCBoYXZlIGFuIGFycnkgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBkZWNsYXJhdGlvbiB3ZSBoYXZlIHRvIGNoZWNrIGZvciBlYWNoIGFuZCBldmVyeSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgdHlwZVFOYW1lID0gZ2V0VHlwZVFOYW1lKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlUU5hbWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlUU5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5hZGRPYmplY3QoZ2V0T2JqZWN0KHR5cGVRTmFtZSxyZWFkZXIsbWFwcGVyQ2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKSByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BEb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYSB0cmFpbGluZyBpbnZhbGlkIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHBhcnNpbmcgYXJyYXkiLGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXRPYmplY3QoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbWFwcGVyQ2xhc3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGJlIGEgZ2VuZXJhbCBvbmUgb2YgaGF2ZSB0byBjYWxsIGZvciB0aGUgc3lzdGVtIEV4dGVuc2lvbiBtYXBwZXIKLSAgICAgICAgICAgICAgICAvLyBpbnZva2luZyB0aGUgbWFwcGVyY2xhc3MgdXNpbmcgcmVmbGVjdGlvbgotICAgICAgICAgICAgICAgIE1ldGhvZCBnZXRPYmplY3RNZXRob2QgPSBtYXBwZXJDbGFzcy5nZXRNZXRob2QoImdldFR5cGVPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117amF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgWE1MU3RyZWFtUmVhZGVyLmNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0T2JqZWN0TWV0aG9kLmludm9rZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde3FOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZS5nZXRMb2NhbFBhcnQoKSwgcmVhZGVyfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBnZXRJbm5lckVsZW1lbnRzUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVHlwZSwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcil7Ci0gICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgdHlwZSBpcyBzaW1pbGFyIHRvIHhzZDp1ci10eXBlWzRdCi0gICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHR5cGVRTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gYXR0cmlidXRlVHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlVHlwZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGF0dHJpYnV0ZVR5cGUuc3Vic3RyaW5nKDAsYXR0cmlidXRlVHlwZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB0eXBlID0gYXR0cmlidXRlVHlwZS5zdWJzdHJpbmcoYXR0cmlidXRlVHlwZS5pbmRleE9mKCI6IikgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDAsdHlwZS5pbmRleE9mKCJbIikpOwotICAgICAgICAgICAgICAgIGlmICghdHlwZS5lcXVhbHMoInVyLXR5cGUiKSl7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVRTmFtZSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKG5hbWVzcGFjZSx0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVRTmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBnZXRUeXBlUU5hbWUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgdHlwZVFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeCA9PSBudWxsID8gIiIgOiBuc1ByZWZpeDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVFOYW1lID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUocmVhZGVyLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCksIHR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlUU5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheUNvb3JkaW5hdGUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXlDb29yZGluYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDgwNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheUNvb3JkaW5hdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQXJyYXlDb29yZGluYXRlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEFycmF5Q29vcmRpbmF0ZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBBcnJheUNvb3JkaW5hdGUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBNWV9RTkFNRSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsCi0gICAgICAgICAgICAgICAgImFycmF5Q29vcmRpbmF0ZSIsCi0gICAgICAgICAgICAgICAgIm5zMSIpOwotCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgQXJyYXlDb29yZGluYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsQXJyYXlDb29yZGluYXRlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS5sYW5nLlN0cmluZyBnZXRBcnJheUNvb3JkaW5hdGUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBcnJheUNvb3JkaW5hdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQXJyYXlDb29yZGluYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBcnJheUNvb3JkaW5hdGUoamF2YS5sYW5nLlN0cmluZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQXJyYXlDb29yZGluYXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQXJyYXlDb29yZGluYXRlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMsTVlfUU5BTUUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBBcnJheUNvb3JkaW5hdGUudGhpcy5zZXJpYWxpemUoTVlfUU5BTUUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIE1ZX1FOQU1FLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbG9jYWxOYW1lID0gcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSB0eXBlIGRldGFpbHMgaWYgdGhpcyBpcyB1c2VkIGluIGEgc2ltcGxlIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmFycmF5Q29vcmRpbmF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheUNvb3JkaW5hdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxBcnJheUNvb3JkaW5hdGU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJWYWx1ZSBjYW5ub3QgYmUgbnVsbCAhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMobG9jYWxBcnJheUNvb3JkaW5hdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vV2UgY2FuIHNhZmVseSBhc3N1bWUgYW4gZWxlbWVudCBoYXMgb25seSBvbmUgdHlwZSBhc3NvY2lhdGVkIHdpdGggaXQKLSAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKE1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsQXJyYXlDb29yZGluYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEFycmF5Q29vcmRpbmF0ZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBBcnJheUNvb3JkaW5hdGUgcmV0dXJuVmFsdWUgPSBuZXcgIEFycmF5Q29vcmRpbmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRBcnJheUNvb3JkaW5hdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEFycmF5Q29vcmRpbmF0ZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlDb29yZGluYXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheUNvb3JkaW5hdGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEFycmF5Q29vcmRpbmF0ZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgQXJyYXlDb29yZGluYXRlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5Q29vcmRpbmF0ZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QXJyYXlDb29yZGluYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheUUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXlFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDQ4OTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9BcnJheUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQXJyYXlFLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEFycmF5RSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBBcnJheUUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBNWV9RTkFNRSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsCi0gICAgICAgICAgICAgICAgIkFycmF5IiwKLSAgICAgICAgICAgICAgICAiU09BUC1FTkMiKTsKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BcnJheSBsb2NhbEFycmF5IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuQXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5IGdldEFycmF5KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQXJyYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEFycmF5KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEFycmF5PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLE1ZX1FOQU1FKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlFLnRoaXMuc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBNWV9RTkFNRSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxBcnJheT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUHJvcGVydHkgY2Fubm90IGJlIG51bGwhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEFycmF5LnNlcmlhbGl6ZShNWV9RTkFNRSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEFycmF5LmdldFB1bGxQYXJzZXIoTVlfUU5BTUUpOwotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBBcnJheUUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEFycmF5RSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSApewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmIG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIsIkFycmF5IikuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEFycmF5KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5LkZhY3RvcnkucGFyc2UocmVhZGVyLCBFeHRlbnNpb25NYXBwZXIuY2xhc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0Jhc2U2NC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9CYXNlNjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwZGQ3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0Jhc2U2NC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCYXNlNjQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgQmFzZTY0IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEJhc2U2NAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwKLSAgICAgICAgICAgICAgICAiYmFzZTY0IiwKLSAgICAgICAgICAgICAgICAiU09BUC1FTkMiKTsKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEJhc2U2NAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBsb2NhbEJhc2U2NCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgZ2V0QmFzZTY0KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmFzZTY0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEJhc2U2NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZTY0KGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEJhc2U2ND1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJhc2U2NC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLE1ZX1FOQU1FKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LnRoaXMuc2VyaWFsaXplKE1ZX1FOQU1FLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBNWV9RTkFNRSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsTmFtZSA9IHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgdHlwZSBkZXRhaWxzIGlmIHRoaXMgaXMgdXNlZCBpbiBhIHNpbXBsZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpiYXNlNjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsQmFzZTY0PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVmFsdWUgY2Fubm90IGJlIG51bGwgISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxCYXNlNjQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL1dlIGNhbiBzYWZlbHkgYXNzdW1lIGFuIGVsZW1lbnQgaGFzIG9ubHkgb25lIHR5cGUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChNWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5sYW5nLk9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEJhc2U2NCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjQgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgQmFzZTY0IHJldHVyblZhbHVlID0gbmV3ICBCYXNlNjQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0QmFzZTY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBCYXNlNjQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEJhc2U2NCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBCYXNlNjQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEJhc2U2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQmFzZTY0QmluYXJ5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0Jhc2U2NEJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODcyZWYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQmFzZTY0QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJhc2U2NEJpbmFyeS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBCYXNlNjRCaW5hcnkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgQmFzZTY0QmluYXJ5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gYmFzZTY0QmluYXJ5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgQmFzZTY0QmluYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGxvY2FsQmFzZTY0QmluYXJ5IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBnZXRCYXNlNjRCaW5hcnkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxCYXNlNjRCaW5hcnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQmFzZTY0QmluYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlNjRCaW5hcnkoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxCYXNlNjRCaW5hcnk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJhc2U2NEJpbmFyeS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBCYXNlNjRCaW5hcnkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmJhc2U2NEJpbmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2U2NEJpbmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxCYXNlNjRCaW5hcnkhPW51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVEYXRhSGFuZGxlcihsb2NhbEJhc2U2NEJpbmFyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKGxvY2FsQmFzZTY0QmluYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEJhc2U2NEJpbmFyeSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBCYXNlNjRCaW5hcnkgcmV0dXJuVmFsdWUgPSBuZXcgIEJhc2U2NEJpbmFyeSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRCYXNlNjRCaW5hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEJhc2U2NEJpbmFyeSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0QmluYXJ5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjRCaW5hcnkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEJhc2U2NEJpbmFyeSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgQmFzZTY0QmluYXJ5IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEJhc2U2NEJpbmFyeSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiYmFzZTY0QmluYXJ5Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQmFzZTY0QmluYXJ5KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhZGVyTVRPTUF3YXJlKHJlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfQklOQVJZKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NVE9NIGF3YXJlIHJlYWRlciAtIGdldCB0aGUgZGF0YWhhbmRsZXIgZGlyZWN0bHkgYW5kIHB1dCBpdCBpbiB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEJhc2U2NEJpbmFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKSByZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5EQVRBX0hBTkRMRVIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UICYmIHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9OQU1FU1BBQ0VfVVJJLCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50cy5YT1BfSU5DTFVERSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBpZCA9IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5FbGVtZW50SGVscGVyLmdldENvbnRlbnRJRChyZWFkZXIsICJVVEYtOCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QmFzZTY0QmluYXJ5KCgob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIpICgob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01TdEFYV3JhcHBlcikgcmVhZGVyKS5nZXRCdWlsZGVyKCkpLmdldERhdGFIYW5kbGVyKGlkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZWFkZXIuaGFzVGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRG8gdGhlIHVzdWFsIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEJhc2U2NEJpbmFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQmFzZTY0QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EYXRlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5MjdlNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRGF0ZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBEYXRlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIERhdGUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkYXRlCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkRhdGUgbG9jYWxEYXRlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS51dGlsLkRhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmEudXRpbC5EYXRlIGdldERhdGUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIERhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGUoamF2YS51dGlsLkRhdGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRGF0ZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEYXRlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERhdGU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGF0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGF0ZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEYXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRhdGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERhdGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRGF0ZSByZXR1cm5WYWx1ZSA9IG5ldyAgRGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRGF0ZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEYXRlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkYXRlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGF0ZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldERhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EYXRlVGltZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EYXRlVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y0ODA3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRGF0ZVRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRGF0ZVRpbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRGF0ZVRpbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRGF0ZVRpbWUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkYXRlVGltZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIERhdGVUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuQ2FsZW5kYXIgbG9jYWxEYXRlVGltZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5DYWxlbmRhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS51dGlsLkNhbGVuZGFyIGdldERhdGVUaW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRGF0ZVRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGVUaW1lKGphdmEudXRpbC5DYWxlbmRhciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxEYXRlVGltZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZVRpbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmRhdGVUaW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZVRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEYXRlVGltZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkYXRlVGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGVUaW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERhdGVUaW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGVUaW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRhdGVUaW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSByZXR1cm5WYWx1ZSA9IG5ldyAgRGF0ZVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0RGF0ZVRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGVUaW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIERhdGVUaW1lIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkYXRlVGltZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKERhdGVUaW1lKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0RGF0ZVRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRGVjaW1hbC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EZWNpbWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmUwNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9EZWNpbWFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIERlY2ltYWwuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRGVjaW1hbCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBEZWNpbWFsCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZGVjaW1hbAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIERlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEubWF0aC5CaWdEZWNpbWFsIGxvY2FsRGVjaW1hbCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmEubWF0aC5CaWdEZWNpbWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZhLm1hdGguQmlnRGVjaW1hbCBnZXREZWNpbWFsKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGVjaW1hbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBEZWNpbWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsKGphdmEubWF0aC5CaWdEZWNpbWFsIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbERlY2ltYWw9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbERlY2ltYWwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6ZGVjaW1hbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY2ltYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEZWNpbWFsPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRlY2ltYWwgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEZWNpbWFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERlY2ltYWwgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRGVjaW1hbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkZWNpbWFsIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEZWNpbWFsIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIERlY2ltYWwgcmV0dXJuVmFsdWUgPSBuZXcgIERlY2ltYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0RGVjaW1hbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RlY2ltYWwodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERlY2ltYWwgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIERlY2ltYWwgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIERlY2ltYWwgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgRGVjaW1hbCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZGVjaW1hbCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKERlY2ltYWwpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXREZWNpbWFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EZWNpbWFsKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRHVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRHVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0M2U1Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0R1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIER1cmF0aW9uLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIER1cmF0aW9uIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIER1cmF0aW9uCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZHVyYXRpb24KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbiBsb2NhbER1cmF0aW9uIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbiBnZXREdXJhdGlvbigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbER1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbER1cmF0aW9uPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEdXJhdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6ZHVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbER1cmF0aW9uPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImR1cmF0aW9uIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRHVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRHVyYXRpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRHVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZHVyYXRpb24gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIHJldHVyblZhbHVlID0gbmV3ICBEdXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0R1cmF0aW9uKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIER1cmF0aW9uLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRHVyYXRpb24gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImR1cmF0aW9uIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRHVyYXRpb24pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRHVyYXRpb24oY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9FTlRJVElFUy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9FTlRJVElFUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg0YzljLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvRU5USVRJRVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRU5USVRJRVMuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRU5USVRJRVMgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRU5USVRJRVMKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBFTlRJVElFUwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEVOVElUSUVTCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzIGxvY2FsRU5USVRJRVMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzIGdldEVOVElUSUVTKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRU5USVRJRVM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRU5USVRJRVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEVOVElUSUVTKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXRpZXMgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRU5USVRJRVM9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEVOVElUSUVTLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEVOVElUSUVTLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpFTlRJVElFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOVElUSUVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRU5USVRJRVM9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRJRVMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVElFUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFTlRJVElFUyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVElFUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJFTlRJVElFUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRJRVMgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRU5USVRJRVMgcmV0dXJuVmFsdWUgPSBuZXcgIEVOVElUSUVTKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEVOVElUSUVTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRJRVModmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUSUVTIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRJVElFUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5USVRJRVMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUSUVTIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBFTlRJVElFUyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBFTlRJVElFUygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiRU5USVRJRVMiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFTlRJVElFUylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEVOVElUSUVTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9FTlRJVElFUyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0VOVElUWS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9FTlRJVFkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhZDdiNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0VOVElUWS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFTlRJVFkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRU5USVRZIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEVOVElUWQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IEVOVElUWQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEVOVElUWQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHkgbG9jYWxFTlRJVFkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHkgZ2V0RU5USVRZKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRU5USVRZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEVOVElUWQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RU5USVRZKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXR5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEVOVElUWT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRU5USVRZLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEVOVElUWS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6RU5USVRZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRU5USVRZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRU5USVRZPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIkVOVElUWSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEVOVElUWSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFTlRJVFkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRU5USVRZKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIkVOVElUWSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRZIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEVOVElUWSByZXR1cm5WYWx1ZSA9IG5ldyAgRU5USVRZKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEVOVElUWSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0VOVElUWSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRZIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTlRJVFkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOVElUWS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRU5USVRZIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBFTlRJVFkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgRU5USVRZKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJFTlRJVFkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFTlRJVFkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRFTlRJVFkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0VOVElUWShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0V4dGVuc2lvbk1hcHBlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9FeHRlbnNpb25NYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1NDVjNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0V4dGVuc2lvbk1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFeHRlbnNpb25NYXBwZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0KLSAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEV4dGVuc2lvbk1hcHBlciBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRXh0ZW5zaW9uTWFwcGVyewotCi0gICAgICAgICAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuT2JqZWN0IGdldFR5cGVPYmplY3QoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImFycmF5Q29vcmRpbmF0ZSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5BcnJheUNvb3JkaW5hdGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJub25Qb3NpdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTm9uUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiaW50Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9pbnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJOTVRPS0VOIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5NVE9LRU4uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEludCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5VbnNpZ25lZEludC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIklEUkVGUyIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5JRFJFRlMuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJzaG9ydCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fc2hvcnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAibm9ybWFsaXplZFN0cmluZyIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ob3JtYWxpemVkU3RyaW5nLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiYm9vbGVhbiIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fYm9vbGVhbi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInVuc2lnbmVkTG9uZyIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5VbnNpZ25lZExvbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJJRFJFRiIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5JRFJFRi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImJhc2U2NEJpbmFyeSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5CYXNlNjRCaW5hcnkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJJRCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5JRC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImRvdWJsZSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5fZG91YmxlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiYW55VVJJIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFueVVSSS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImxhbmd1YWdlIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkxhbmd1YWdlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiRU5USVRZIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkVOVElUWS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInVuc2lnbmVkU2hvcnQiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuVW5zaWduZWRTaG9ydC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIk5NVE9LRU5TIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5NVE9LRU5TLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiTkNOYW1lIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLk5DTmFtZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImdNb250aERheSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HTW9udGhEYXkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJ0aW1lIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLlRpbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJ0b2tlbiIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5Ub2tlbi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInVuc2lnbmVkQnl0ZSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5VbnNpZ25lZEJ5dGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJub25OZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTm9uTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiYmFzZTY0Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkJhc2U2NC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgInN0cmluZyIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5TdHJpbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJoZXhCaW5hcnkiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuSGV4QmluYXJ5LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiTk9UQVRJT04iLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuTk9UQVRJT04uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJkYXRlIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkRhdGUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiTmFtZSIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5OYW1lLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZGVjaW1hbCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5EZWNpbWFsLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiUU5hbWUiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuUU5hbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZHVyYXRpb24iLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRHVyYXRpb24uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJTdHJ1Y3QiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuU3RydWN0LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZ1llYXJNb250aCIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HWWVhck1vbnRoLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZ01vbnRoIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkdNb250aC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImxvbmciLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuX2xvbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJnWWVhciIuZXF1YWxzKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5HWWVhci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuSW50ZWdlci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImdEYXkiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuR0RheS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgImZsb2F0Ii5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9mbG9hdC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgIkVOVElUSUVTIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkVOVElUSUVTLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAiZGF0ZVRpbWUiLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRGF0ZVRpbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICJieXRlIi5lcXVhbHModHlwZU5hbWUpKXsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLl9ieXRlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlICIgKyBuYW1lc3BhY2VVUkkgKyAiICIgKyB0eXBlTmFtZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dEYXkuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBlMzE1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR0RheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHRGF5LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEdEYXkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgR0RheQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdEYXkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBHRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSBsb2NhbEdEYXkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EYXkgZ2V0R0RheSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdEYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR0RheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R0RheShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHRGF5PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHRGF5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEdEYXkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdEYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnRGF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR0RheT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnRGF5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR0RheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHRGF5ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdEYXkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ0RheSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR0RheSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHRGF5IHJldHVyblZhbHVlID0gbmV3ICBHRGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEdEYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HRGF5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHRGF5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHRGF5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHRGF5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHRGF5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBHRGF5IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdEYXkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdEYXkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHRGF5KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R0RheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR0RheShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dNb250aC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MTk0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dNb250aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHTW9udGguamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR01vbnRoIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdNb250aAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdNb250aAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCBsb2NhbEdNb250aCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGggZ2V0R01vbnRoKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR01vbnRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEdNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R01vbnRoKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGggcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsR01vbnRoPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHTW9udGgudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR01vbnRoLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpnTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHTW9udGg9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ01vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR01vbnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdNb250aCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHTW9udGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ01vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGggZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgR01vbnRoIHJldHVyblZhbHVlID0gbmV3ICBHTW9udGgoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R01vbnRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR01vbnRoKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGggZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNb250aC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR01vbnRoLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHTW9udGggcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdNb250aCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBHTW9udGgoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdNb250aCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdNb250aClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEdNb250aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR01vbnRoKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR01vbnRoRGF5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0dNb250aERheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzBkMTJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR01vbnRoRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdNb250aERheS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHTW9udGhEYXkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgR01vbnRoRGF5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ01vbnRoRGF5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgR01vbnRoRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IGxvY2FsR01vbnRoRGF5IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheSBnZXRHTW9udGhEYXkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHTW9udGhEYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR01vbnRoRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRHTW9udGhEYXkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHTW9udGhEYXk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdNb250aERheS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBHTW9udGhEYXkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdNb250aERheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdNb250aERheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdNb250aERheT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnTW9udGhEYXkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHTW9udGhEYXkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR01vbnRoRGF5ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdNb250aERheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnTW9udGhEYXkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdNb250aERheSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHTW9udGhEYXkgcmV0dXJuVmFsdWUgPSBuZXcgIEdNb250aERheSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRHTW9udGhEYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HTW9udGhEYXkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdNb250aERheSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR01vbnRoRGF5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHTW9udGhEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEdNb250aERheSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgR01vbnRoRGF5IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdNb250aERheSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZ01vbnRoRGF5Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoR01vbnRoRGF5KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R01vbnRoRGF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HTW9udGhEYXkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HWWVhci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HWWVhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDNkOWJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR1llYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogR1llYXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR1llYXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgR1llYXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBnWWVhcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdZZWFyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXIgbG9jYWxHWWVhciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIGdldEdZZWFyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR1llYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdZZWFyKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHWWVhcj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR1llYXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdZZWFyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZ1llYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHWWVhcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnWWVhciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdZZWFyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdZZWFyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHWWVhciByZXR1cm5WYWx1ZSA9IG5ldyAgR1llYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R1llYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HWWVhcih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHWWVhci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdZZWFyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdZZWFyKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJnWWVhciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdZZWFyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R1llYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvR1llYXJNb250aC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HWWVhck1vbnRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDU5MjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9HWWVhck1vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdZZWFyTW9udGguamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR1llYXJNb250aCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHWWVhck1vbnRoCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ1llYXJNb250aAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdZZWFyTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoIGxvY2FsR1llYXJNb250aCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aCBnZXRHWWVhck1vbnRoKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXJNb250aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRHWWVhck1vbnRoKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdZZWFyTW9udGg9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdZZWFyTW9udGgudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR1llYXJNb250aC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z1llYXJNb250aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImdZZWFyTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHWWVhck1vbnRoPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyTW9udGggY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxHWWVhck1vbnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyTW9udGggIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXJNb250aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnWWVhck1vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhck1vbnRoIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdZZWFyTW9udGggcmV0dXJuVmFsdWUgPSBuZXcgIEdZZWFyTW9udGgoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R1llYXJNb250aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyTW9udGgodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyTW9udGggZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyTW9udGguRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyTW9udGguRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEdZZWFyTW9udGggcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdZZWFyTW9udGggb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR1llYXJNb250aCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZ1llYXJNb250aCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdZZWFyTW9udGgpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHWWVhck1vbnRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HWWVhck1vbnRoKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSGV4QmluYXJ5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0hleEJpbmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzlhYjg5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSGV4QmluYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEhleEJpbmFyeS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBIZXhCaW5hcnkgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSGV4QmluYXJ5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gaGV4QmluYXJ5Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgSGV4QmluYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeSBsb2NhbEhleEJpbmFyeSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeSBnZXRIZXhCaW5hcnkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxIZXhCaW5hcnk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSGV4QmluYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZXhCaW5hcnkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSGV4QmluYXJ5PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxIZXhCaW5hcnkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSGV4QmluYXJ5LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpoZXhCaW5hcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXhCaW5hcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxIZXhCaW5hcnk9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiaGV4QmluYXJ5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSGV4QmluYXJ5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEhleEJpbmFyeSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxIZXhCaW5hcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiaGV4QmluYXJ5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBIZXhCaW5hcnkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSGV4QmluYXJ5IHJldHVyblZhbHVlID0gbmV3ICBIZXhCaW5hcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0SGV4QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSGV4QmluYXJ5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBIZXhCaW5hcnkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhleEJpbmFyeS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSGV4QmluYXJ5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBIZXhCaW5hcnkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEhleEJpbmFyeSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBIZXhCaW5hcnkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImhleEJpbmFyeSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEhleEJpbmFyeSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEhleEJpbmFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSGV4QmluYXJ5KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSUQuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NGI0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0lELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIElELmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIElEIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIElECi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gSUQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBJRAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBsb2NhbElEIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBnZXRJRCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJRChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbElEPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBJRC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6SUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIklEIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSUQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSUQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIElEIHJldHVyblZhbHVlID0gbmV3ICBJRCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRJRCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSUQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElELkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJRCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgSUQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSUQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIklEIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSUQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJRCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSUQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JRFJFRi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JRFJFRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzViYzg1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSURSRUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSURSRUYuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSURSRUYgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSURSRUYKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBJRFJFRgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIElEUkVGCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmIGxvY2FsSURSRUYgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmIGdldElEUkVGKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSURSRUY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSURSRUYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElEUkVGKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWYgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSURSRUY9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEUkVGLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIElEUkVGLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpJRFJFRiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIklEUkVGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSURSRUY9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUYgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRFJFRiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJJRFJFRiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUYgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSURSRUYgcmV0dXJuVmFsdWUgPSBuZXcgIElEUkVGKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldElEUkVGKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUYodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRFJFRi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURSRUYuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJRFJFRiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBJRFJFRigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiSURSRUYiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJRFJFRilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElEUkVGKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JRFJFRihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0lEUkVGUy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9JRFJFRlMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2YmUwNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0lEUkVGUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJRFJFRlMuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSURSRUZTIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIElEUkVGUwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IElEUkVGUwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIElEUkVGUwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZnMgbG9jYWxJRFJFRlMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZnMgZ2V0SURSRUZTKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSURSRUZTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIElEUkVGUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SURSRUZTKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWZzIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbElEUkVGUz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSURSRUZTLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIElEUkVGUy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6SURSRUZTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSURSRUZTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSURSRUZTPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIklEUkVGUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbElEUkVGUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRFJFRlMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSURSRUZTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIklEUkVGUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUZTIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIElEUkVGUyByZXR1cm5WYWx1ZSA9IG5ldyAgSURSRUZTKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldElEUkVGUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEUkVGUyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUZTIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJRFJFRlMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEUkVGUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSURSRUZTIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJRFJFRlMgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSURSRUZTKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJJRFJFRlMiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJRFJFRlMpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJRFJFRlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEUkVGUyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0ludGVnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE5NDZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSW50ZWdlcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLm1hdGguQmlnSW50ZWdlciBsb2NhbEludGVnZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLm1hdGguQmlnSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0SW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW50ZWdlcihqYXZhLm1hdGguQmlnSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJbnRlZ2VyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJpbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiaW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImludGVnZXIiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSW50ZWdlcihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0xhbmd1YWdlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0xhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOWMyNGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9MYW5ndWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBMYW5ndWFnZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBMYW5ndWFnZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBMYW5ndWFnZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UgbG9jYWxMYW5ndWFnZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UgZ2V0TGFuZ3VhZ2UoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxMYW5ndWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBMYW5ndWFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2Uob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5MYW5ndWFnZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxMYW5ndWFnZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTGFuZ3VhZ2UudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmxhbmd1YWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibGFuZ3VhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxMYW5ndWFnZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJsYW5ndWFnZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbExhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbExhbmd1YWdlICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbExhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImxhbmd1YWdlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBMYW5ndWFnZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSByZXR1cm5WYWx1ZSA9IG5ldyAgTGFuZ3VhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TGFuZ3VhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9MYW5ndWFnZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2UgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExhbmd1YWdlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMYW5ndWFnZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2UgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIExhbmd1YWdlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IExhbmd1YWdlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJsYW5ndWFnZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKExhbmd1YWdlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TGFuZ3VhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xhbmd1YWdlKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTkNOYW1lLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05DTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjIwOTAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTkNOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5DTmFtZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOQ05hbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTkNOYW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTkNOYW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTkNOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5DTmFtZSBsb2NhbE5DTmFtZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5DTmFtZSBnZXROQ05hbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOQ05hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTkNOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROQ05hbWUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OQ05hbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTkNOYW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOQ05hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTkNOYW1lLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpOQ05hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ05hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOQ05hbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTkNOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTkNOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5DTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOQ05hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTkNOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOQ05hbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTkNOYW1lIHJldHVyblZhbHVlID0gbmV3ICBOQ05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TkNOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTkNOYW1lKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOQ05hbWUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5DTmFtZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkNOYW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOQ05hbWUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5DTmFtZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOQ05hbWUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIk5DTmFtZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5DTmFtZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5DTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTkNOYW1lKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTk1UT0tFTi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OTVRPS0VOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDFhMTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OTVRPS0VOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5NVE9LRU4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTk1UT0tFTiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOTVRPS0VOCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTk1UT0tFTgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5NVE9LRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbiBsb2NhbE5NVE9LRU4gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbiBnZXROTVRPS0VOKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTk1UT0tFTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOTVRPS0VOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROTVRPS0VOKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOTVRPS0VOPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5NVE9LRU4udGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5NVE9LRU4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJOTVRPS0VOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTk1UT0tFTj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTk1UT0tFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5NVE9LRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTk1UT0tFTiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOTVRPS0VOIHJldHVyblZhbHVlID0gbmV3ICBOTVRPS0VOKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5NVE9LRU4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOTVRPS0VOIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5NVE9LRU4oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIk5NVE9LRU4iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOTVRPS0VOKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tk1UT0tFTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTk1UT0tFTihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05NVE9LRU5TLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05NVE9LRU5TLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2FjNTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OTVRPS0VOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOTVRPS0VOUy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOTVRPS0VOUyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOTVRPS0VOUwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5NVE9LRU5TCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTk1UT0tFTlMKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMgbG9jYWxOTVRPS0VOUyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMgZ2V0Tk1UT0tFTlMoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOTVRPS0VOUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Tk1UT0tFTlMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VucyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOTVRPS0VOUz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTk1UT0tFTlMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTk1UT0tFTlMudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5NVE9LRU5TIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTk1UT0tFTlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOUz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5NVE9LRU5TKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5NVE9LRU5TICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5NVE9LRU5TKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5NVE9LRU5TIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOUyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOTVRPS0VOUyByZXR1cm5WYWx1ZSA9IG5ldyAgTk1UT0tFTlMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tk1UT0tFTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOUyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTlMgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5NVE9LRU5TLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTlMgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5NVE9LRU5TIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5NVE9LRU5TKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOTVRPS0VOUyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5NVE9LRU5TKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tk1UT0tFTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05NVE9LRU5TKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTk9UQVRJT04uamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTk9UQVRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4ODVhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05PVEFUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5PVEFUSU9OLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5PVEFUSU9OIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5PVEFUSU9OCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gTk9UQVRJT04KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBsb2NhbFFOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBnZXRRTmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFFOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFFOYW1lPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxRTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOT1RBVElPTi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Tk9UQVRJT04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJOT1RBVElPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFFOYW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlFOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRTmFtZShsb2NhbFFOYW1lLHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFFOYW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFFOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlFOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOT1RBVElPTiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOT1RBVElPTiByZXR1cm5WYWx1ZSA9IG5ldyAgTk9UQVRJT04oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0UU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9RTmFtZSh2YWx1ZSxuYW1lc3BhY2VVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5PVEFUSU9OIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RBVElPTi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UQVRJT04uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5PVEFUSU9OIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOT1RBVElPTiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOT1RBVElPTigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTk9UQVRJT04iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOT1RBVElPTilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnQuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbmRleCA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2V1cmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0UU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9RTmFtZShjb250ZW50LG5hbWVzcGFjZXVyaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9OYW1lLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMDQwNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTmFtZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOYW1lIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5hbWUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBOYW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lIGxvY2FsTmFtZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lIGdldE5hbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5hbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTmFtZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOYW1lIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWUgcmV0dXJuVmFsdWUgPSBuZXcgIE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05hbWUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5hbWUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTmFtZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTmFtZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5hbWUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OYW1lKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTmVnYXRpdmVJbnRlZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTZkMjk3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5lZ2F0aXZlSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOZWdhdGl2ZUludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlciBsb2NhbE5lZ2F0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlciBnZXROZWdhdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOZWdhdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROZWdhdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTmVnYXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOZWdhdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpuZWdhdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOZWdhdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibmVnYXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTmVnYXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5lZ2F0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOZWdhdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibmVnYXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBOZWdhdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TmVnYXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTmVnYXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5lZ2F0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOZWdhdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5lZ2F0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5lZ2F0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTmVnYXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM5NGQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9uTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOb25OZWdhdGl2ZUludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlciBsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlciBnZXROb25OZWdhdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb25OZWdhdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTm9uTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROb25OZWdhdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb25OZWdhdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTm9uTmVnYXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpub25OZWdhdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25OZWdhdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb25OZWdhdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9uTmVnYXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25OZWdhdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9uTmVnYXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb25OZWdhdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTm9uTmVnYXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBOb25OZWdhdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tm9uTmVnYXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb25OZWdhdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbk5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOb25OZWdhdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5vbk5lZ2F0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOb25OZWdhdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5vbk5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5vbk5lZ2F0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5vbk5lZ2F0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9uTmVnYXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL05vblBvc2l0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjNiZDNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5vblBvc2l0aXZlSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOb25Qb3NpdGl2ZUludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlciBsb2NhbE5vblBvc2l0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlciBnZXROb25Qb3NpdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb25Qb3NpdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROb25Qb3NpdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25Qb3NpdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb25Qb3NpdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpub25Qb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25Qb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb25Qb3NpdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9uUG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vblBvc2l0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25Qb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9uUG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb25Qb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBOb25Qb3NpdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tm9uUG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9uUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb25Qb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vblBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5vblBvc2l0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOb25Qb3NpdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5vblBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5vblBvc2l0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5vblBvc2l0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9uUG9zaXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvTm9ybWFsaXplZFN0cmluZy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob3JtYWxpemVkU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjQ2ZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ob3JtYWxpemVkU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5vcm1hbGl6ZWRTdHJpbmcuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTm9ybWFsaXplZFN0cmluZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOb3JtYWxpemVkU3RyaW5nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZFN0cmluZwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZyBsb2NhbE5vcm1hbGl6ZWRTdHJpbmcgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZyBnZXROb3JtYWxpemVkU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9ybWFsaXplZFN0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOb3JtYWxpemVkU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROb3JtYWxpemVkU3RyaW5nKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9ybWFsaXplZFN0cmluZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOb3JtYWxpemVkU3RyaW5nPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb3JtYWxpemVkU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGl6ZWRTdHJpbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5vcm1hbGl6ZWRTdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3JtYWxpemVkU3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9ybWFsaXplZFN0cmluZz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub3JtYWxpemVkU3RyaW5nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9ybWFsaXplZFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb3JtYWxpemVkU3RyaW5nICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vcm1hbGl6ZWRTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9ybWFsaXplZFN0cmluZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9ybWFsaXplZFN0cmluZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nIHJldHVyblZhbHVlID0gbmV3ICBOb3JtYWxpemVkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5vcm1hbGl6ZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob3JtYWxpemVkU3RyaW5nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb3JtYWxpemVkU3RyaW5nIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemVkU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemVkU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOb3JtYWxpemVkU3RyaW5nIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vcm1hbGl6ZWRTdHJpbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5vcm1hbGl6ZWRTdHJpbmciLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOb3JtYWxpemVkU3RyaW5nKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tm9ybWFsaXplZFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9ybWFsaXplZFN0cmluZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Bvc2l0aXZlSW50ZWdlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Qb3NpdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwZmFhOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Bvc2l0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBQb3NpdGl2ZUludGVnZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgUG9zaXRpdmVJbnRlZ2VyIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFBvc2l0aXZlSW50ZWdlcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHBvc2l0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFBvc2l0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXIgbG9jYWxQb3NpdGl2ZUludGVnZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXIgZ2V0UG9zaXRpdmVJbnRlZ2VyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUG9zaXRpdmVJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFBvc2l0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UG9zaXRpdmVJbnRlZ2VyKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuUG9zaXRpdmVJbnRlZ2VyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFBvc2l0aXZlSW50ZWdlcj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUG9zaXRpdmVJbnRlZ2VyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aXZlSW50ZWdlci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6cG9zaXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsUG9zaXRpdmVJbnRlZ2VyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInBvc2l0aXZlSW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFBvc2l0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxQb3NpdGl2ZUludGVnZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsUG9zaXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInBvc2l0aXZlSW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgUG9zaXRpdmVJbnRlZ2VyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFBvc2l0aXZlSW50ZWdlciByZXR1cm5WYWx1ZSA9IG5ldyAgUG9zaXRpdmVJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFBvc2l0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Bvc2l0aXZlSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgUG9zaXRpdmVJbnRlZ2VyIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQb3NpdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgUG9zaXRpdmVJbnRlZ2VyIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBQb3NpdGl2ZUludGVnZXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgUG9zaXRpdmVJbnRlZ2VyKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJwb3NpdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChQb3NpdGl2ZUludGVnZXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRQb3NpdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Bvc2l0aXZlSW50ZWdlcihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1FOYW1lLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1FOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OWYwMjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9RTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBRTmFtZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBRTmFtZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBRTmFtZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IFFOYW1lCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgbG9jYWxRTmFtZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgZ2V0UU5hbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxRTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxRTmFtZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUU5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOlFOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiUU5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxRTmFtZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJRTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobG9jYWxRTmFtZSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxRTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxRTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJRTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcmV0dXJuVmFsdWUgPSBuZXcgIFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUodmFsdWUsbmFtZXNwYWNlVVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUU5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgUU5hbWUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIlFOYW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUU5hbWUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50LmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNldXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUoY29udGVudCxuYW1lc3BhY2V1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvU3RyaW5nLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1N0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZjODA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFN0cmluZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBTdHJpbmcgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgU3RyaW5nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gc3RyaW5nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsU3RyaW5nIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS5sYW5nLlN0cmluZyBnZXRTdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoamF2YS5sYW5nLlN0cmluZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxTdHJpbmc9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0cmluZy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0cmluZz09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJzdHJpbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKGxvY2FsU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsU3RyaW5nICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJzdHJpbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuVmFsdWUgPSBuZXcgIFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgU3RyaW5nIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cmluZygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEic3RyaW5nIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9TdHJ1Y3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvU3RydWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjZkMzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9TdHJ1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NCArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogU3RydWN0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFN0cnVjdCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBTdHJ1Y3QKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBTdHJ1Y3QKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBFeHRyYUVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyB3YXMgYW4gQXJyYXkhCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdIGxvY2FsRXh0cmFFbGVtZW50IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgVGhpcyB0cmFja2VyIGJvb2xlYW4gd2lsIGJlIHVzZWQgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlIHVzZXIgY2FsbGVkIHRoZSBzZXQgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogICBmb3IgdGhpcyBhdHRyaWJ1dGUuIEl0IHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIHRoaXMgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbiB0aGUgc2VyaWFsaXplZCBYTUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2NhbEV4dHJhRWxlbWVudFRyYWNrZXIgPSBmYWxzZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdIGdldEV4dHJhRWxlbWVudCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEV4dHJhRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZhbGlkYXRlIHRoZSBhcnJheSBmb3IgRXh0cmFFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRXh0cmFFbGVtZW50KG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50W10gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBFeHRyYUVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYUVsZW1lbnQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbXSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVFeHRyYUVsZW1lbnQocGFyYW0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgc2V0dGluZyB0cmFja2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEV4dHJhRWxlbWVudFRyYWNrZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXh0cmFFbGVtZW50VHJhY2tlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEV4dHJhRWxlbWVudD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgYWRkIG1ldGhvZCBmb3IgdGhlIGFycmF5IGZvciBjb252ZW5pZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRFeHRyYUVsZW1lbnQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFeHRyYUVsZW1lbnQgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXh0cmFFbGVtZW50ID0gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50W117fTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgc2V0dGluZyB0cmFja2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRXh0cmFFbGVtZW50VHJhY2tlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwudG9MaXN0KGxvY2FsRXh0cmFFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChwYXJhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEV4dHJhRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudFtdKWxpc3QudG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbbGlzdC5zaXplKCldKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIElkCi0gICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgd2FzIGFuIEF0dHJpYnV0ZSEKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQgbG9jYWxJZCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSWQgZ2V0SWQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SWQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxJZD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEhyZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyB3YXMgYW4gQXR0cmlidXRlIQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgbG9jYWxIcmVmIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJIGdldEhyZWYoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxIcmVmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEhyZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEhyZWYob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSHJlZj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpTdHJ1Y3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJ1Y3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJZCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJZCksIHhtbFdyaXRlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxIcmVmICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHJlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSHJlZiksIHhtbFdyaXRlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFeHRyYUVsZW1lbnRUcmFja2VyKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFeHRyYUVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwO2kgPCBsb2NhbEV4dHJhRWxlbWVudC5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudFtpXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEV4dHJhRWxlbWVudFtpXS5zZXJpYWxpemUoeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGRvIG5vdGhpbmcgc2luY2UgbWluT2NjdXJlcyB6ZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJleHRyYUVsZW1lbnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudFRyYWNrZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwO2kgPCBsb2NhbEV4dHJhRWxlbWVudC5sZW5ndGg7aSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEV4dHJhRWxlbWVudFtpXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhRWxlbWVudCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRXh0cmFFbGVtZW50W2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZXh0cmFFbGVtZW50IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIiIsImlkIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIiIsImhyZWYiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYkxpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxIcmVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cnVjdCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgU3RydWN0IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cnVjdCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiU3RydWN0Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RydWN0KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICJpZCIKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0ZW1wQXR0cmliSWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCJpZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wQXR0cmliSWQhPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHRlbXBBdHRyaWJJZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSUQodGVtcEF0dHJpYklkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVkQXR0cmlidXRlcy5hZGQoImlkIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICJocmVmIgotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHRlbXBBdHRyaWJIcmVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwiaHJlZiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wQXR0cmliSHJlZiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gdGVtcEF0dHJpYkhyZWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SHJlZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQW55VVJJKHRlbXBBdHRyaWJIcmVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVkQXR0cmlidXRlcy5hZGQoImhyZWYiKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBsaXN0MSA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSBhcnJheSBhbmQgc3RlcCBwYXN0IGl0cyBmaW5hbCBlbGVtZW50J3MgZW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb29wRG9uZTE9ZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghbG9vcERvbmUxKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCl7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIHNvIHRoYXQgaXQgcHJvZHVjZXMgYSBmYWtlIFNUQVJUX0RPQ1VFTUVOVCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5OYW1lZFN0YXhPTUJ1aWxkZXIgYnVpbGRlcjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuTmFtZWRTdGF4T01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXIocmVhZGVyKSwgcmVhZGVyLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0MS5hZGQoYnVpbGRlcjEuZ2V0T01FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHR3byBjb3VudGludW9zIGVuZCBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wRG9uZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQgPT0gZXZlbnQpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wRG9uZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEV4dHJhRWxlbWVudCgob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnRbXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50LmNsYXNzLGxpc3QxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGEgdHJhaWxpbmcgaW52YWxpZCBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1RpbWUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA4MDhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaW1lLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFRpbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVGltZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHRpbWUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUgbG9jYWxUaW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUgZ2V0VGltZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVGltZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVGltZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBUaW1lLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFRpbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFRpbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVGltZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxUaW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInRpbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFRpbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVGltZSByZXR1cm5WYWx1ZSA9IG5ldyAgVGltZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRUaW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVGltZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVGltZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBUaW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ0aW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVGltZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1RpbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ub2tlbi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmM4NjY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVG9rZW4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVG9rZW4gYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVG9rZW4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlbgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuIGxvY2FsVG9rZW4gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuIGdldFRva2VuKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVG9rZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRva2VuKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVG9rZW4gcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVG9rZW49cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFRva2VuLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFRva2VuLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp0b2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVG9rZW49PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidG9rZW4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxUb2tlbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxUb2tlbiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxUb2tlbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ0b2tlbiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVG9rZW4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVG9rZW4gcmV0dXJuVmFsdWUgPSBuZXcgIFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFRva2VuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVG9rZW4odmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFRva2VuIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUb2tlbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFRva2VuIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBUb2tlbiBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBUb2tlbigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEidG9rZW4iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUb2tlbilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFRva2VuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ub2tlbihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkQnl0ZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZEJ5dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmMDcwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkQnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBVbnNpZ25lZEJ5dGUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVW5zaWduZWRCeXRlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFVuc2lnbmVkQnl0ZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHVuc2lnbmVkQnl0ZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFVuc2lnbmVkQnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEJ5dGUgbG9jYWxVbnNpZ25lZEJ5dGUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEJ5dGUgZ2V0VW5zaWduZWRCeXRlKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRCeXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFVuc2lnbmVkQnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VW5zaWduZWRCeXRlKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFVuc2lnbmVkQnl0ZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRCeXRlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkQnl0ZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dW5zaWduZWRCeXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRCeXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRCeXRlPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkQnl0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkQnl0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZEJ5dGUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRCeXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkQnl0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRCeXRlIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkQnl0ZSByZXR1cm5WYWx1ZSA9IG5ldyAgVW5zaWduZWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFVuc2lnbmVkQnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkQnl0ZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRCeXRlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZEJ5dGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkQnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRCeXRlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBVbnNpZ25lZEJ5dGUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVW5zaWduZWRCeXRlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ1bnNpZ25lZEJ5dGUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChVbnNpZ25lZEJ5dGUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRVbnNpZ25lZEJ5dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkQnl0ZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkSW50LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmU3ZmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZEludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBVbnNpZ25lZEludC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBVbnNpZ25lZEludCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBVbnNpZ25lZEludAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHVuc2lnbmVkSW50Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRJbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQgbG9jYWxVbnNpZ25lZEludCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQgZ2V0VW5zaWduZWRJbnQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBVbnNpZ25lZEludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VW5zaWduZWRJbnQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxVbnNpZ25lZEludD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRJbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRJbnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnVuc2lnbmVkSW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRJbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZEludD09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZEludCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkSW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkSW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkSW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkSW50IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEludCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZEludCByZXR1cm5WYWx1ZSA9IG5ldyAgVW5zaWduZWRJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZEludCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRJbnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkSW50LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZEludC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRJbnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkSW50IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFVuc2lnbmVkSW50KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ1bnNpZ25lZEludCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkSW50KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VW5zaWduZWRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkSW50KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRMb25nLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL1Vuc2lnbmVkTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE3MGNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRMb25nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkTG9uZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBVbnNpZ25lZExvbmcgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVW5zaWduZWRMb25nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZyBsb2NhbFVuc2lnbmVkTG9uZyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZyBnZXRVbnNpZ25lZExvbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZExvbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZExvbmcob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmcgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVW5zaWduZWRMb25nPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZExvbmcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRMb25nLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp1bnNpZ25lZExvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZExvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZExvbmc9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRMb25nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRMb25nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkTG9uZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZExvbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRMb25nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZExvbmcgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRMb25nIHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZExvbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRMb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRMb25nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZExvbmcgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkTG9uZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRMb25nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZExvbmcgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkTG9uZyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBVbnNpZ25lZExvbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkTG9uZyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkTG9uZylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFVuc2lnbmVkTG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRMb25nKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvVW5zaWduZWRTaG9ydC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZFNob3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjcxNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9VbnNpZ25lZFNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkU2hvcnQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVW5zaWduZWRTaG9ydCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBVbnNpZ25lZFNob3J0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFVuc2lnbmVkU2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydCBsb2NhbFVuc2lnbmVkU2hvcnQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkU2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydCBnZXRVbnNpZ25lZFNob3J0KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRTaG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBVbnNpZ25lZFNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZFNob3J0KG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxVbnNpZ25lZFNob3J0PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZFNob3J0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkU2hvcnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnVuc2lnbmVkU2hvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZFNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRTaG9ydD09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZFNob3J0IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRTaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZFNob3J0ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkU2hvcnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRTaG9ydCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRTaG9ydCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZFNob3J0IHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFVuc2lnbmVkU2hvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZFNob3J0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZFNob3J0IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZFNob3J0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZFNob3J0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZFNob3J0IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBVbnNpZ25lZFNob3J0IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFVuc2lnbmVkU2hvcnQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkU2hvcnQiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChVbnNpZ25lZFNob3J0KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VW5zaWduZWRTaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRTaG9ydChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19ib29sZWFuLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19ib29sZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTY0OTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fYm9vbGVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfYm9vbGVhbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfYm9vbGVhbiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfYm9vbGVhbgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGJvb2xlYW4KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfYm9vbGVhbgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2NhbF9ib29sZWFuIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgYm9vbGVhbiBnZXRfYm9vbGVhbigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9ib29sZWFuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIF9ib29sZWFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfYm9vbGVhbihib29sZWFuIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbF9ib29sZWFuPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfYm9vbGVhbiArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfYm9vbGVhbi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Ym9vbGVhbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYm9vbGVhbiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfYm9vbGVhbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9ib29sZWFuKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2Jvb2xlYW4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2Jvb2xlYW4gcmV0dXJuVmFsdWUgPSBuZXcgIF9ib29sZWFuKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9ib29sZWFuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQm9vbGVhbih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2Jvb2xlYW4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9ib29sZWFuLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYm9vbGVhbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2Jvb2xlYW4gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9ib29sZWFuIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9ib29sZWFuKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJib29sZWFuIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2Jvb2xlYW4pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfYm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQm9vbGVhbihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19ieXRlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19ieXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2I5YjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fYnl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfYnl0ZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfYnl0ZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfYnl0ZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGJ5dGUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYnl0ZSBsb2NhbF9ieXRlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgYnl0ZSBnZXRfYnl0ZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9ieXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIF9ieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfYnl0ZShieXRlIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbF9ieXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfYnl0ZSArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfYnl0ZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Ynl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfYnl0ZT09amF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImJ5dGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2J5dGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfYnl0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9ieXRlIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9ieXRlIHJldHVyblZhbHVlID0gbmV3ICBfYnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfYnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0J5dGUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9ieXRlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2J5dGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9ieXRlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfYnl0ZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfYnl0ZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiYnl0ZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9ieXRlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2J5dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0J5dGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fZG91YmxlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19kb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMGFmNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19kb3VibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2RvdWJsZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfZG91YmxlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9kb3VibGUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkb3VibGUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpewotICAgICAgICAgICAgICAgIHJldHVybiAiU09BUC1FTkMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfZG91YmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBkb3VibGUgbG9jYWxfZG91YmxlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gZG91YmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBkb3VibGUgZ2V0X2RvdWJsZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9kb3VibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2RvdWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0X2RvdWJsZShkb3VibGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2RvdWJsZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2RvdWJsZSArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfZG91YmxlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YS5sYW5nLkRvdWJsZS5pc05hTihsb2NhbF9kb3VibGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRvdWJsZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfZG91YmxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2RvdWJsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9kb3VibGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2RvdWJsZSByZXR1cm5WYWx1ZSA9IG5ldyAgX2RvdWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfZG91YmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRG91YmxlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfZG91YmxlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZG91YmxlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZG91YmxlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfZG91YmxlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfZG91YmxlIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9kb3VibGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImRvdWJsZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9kb3VibGUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfZG91YmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Eb3VibGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fZmxvYXQuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2Zsb2F0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjE3MTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fZmxvYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2Zsb2F0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9mbG9hdCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfZmxvYXQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBmbG9hdAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9mbG9hdAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZmxvYXQgbG9jYWxfZmxvYXQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBmbG9hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgZmxvYXQgZ2V0X2Zsb2F0KCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2Zsb2F0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIF9mbG9hdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0X2Zsb2F0KGZsb2F0IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbF9mbG9hdD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2Zsb2F0ICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9mbG9hdC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6ZmxvYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhLmxhbmcuRmxvYXQuaXNOYU4obG9jYWxfZmxvYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImZsb2F0IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9mbG9hdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9mbG9hdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9mbG9hdCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfZmxvYXQgcmV0dXJuVmFsdWUgPSBuZXcgIF9mbG9hdCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfZmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9GbG9hdCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2Zsb2F0IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZmxvYXQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9mbG9hdC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2Zsb2F0IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfZmxvYXQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX2Zsb2F0KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJmbG9hdCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9mbG9hdClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9mbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRmxvYXQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9faW50LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxNmZlMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9pbnQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2Rpbmc7Ci0KLQotLyoqCi0gKiBfaW50IGJlYW4gY2xhc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgX2ludAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbiB7Ci0gICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgbmFtZSA9IGludAotICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAqLwotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGZpZWxkIGZvciBfaW50Ci0gICAgICovCi0KLQotICAgIHByb3RlY3RlZCBpbnQgbG9jYWxfaW50OwotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0X2ludCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsX2ludDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbSBfaW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0X2ludChpbnQgcGFyYW0pIHsKLQotICAgICAgICB0aGlzLmxvY2FsX2ludCA9IHBhcmFtOwotCi0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgewotCi0gICAgICAgIHJldHVybiBsb2NhbF9pbnQgKyAiIjsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMsIHBhcmVudFFOYW1lKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfaW50LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLCBmYWN0b3J5LCB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZSwgZmFjdG9yeSwgZGF0YVNvdXJjZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24gewotICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlciwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0KLSAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJpYWxpemVUeXBlKSB7Ci0KLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4ICsgIjppbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jYWxfaW50ID09IGphdmEubGFuZy5JbnRlZ2VyLk1JTl9WQUxVRSkgewotCi0gICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImludCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9pbnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLQotICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9pbnQpKTsKLQotCi0gICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgewotCi0KLSAgICAgICAgcHVibGljIHN0YXRpYyBfaW50IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgICAgIF9pbnQgcmV0dXJuVmFsdWUgPSBuZXcgX2ludCgpOwotCi0gICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfaW50KAotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSW50KHZhbHVlKSk7Ci0KLQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBfaW50IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLCBjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBfaW50LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCBuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2ludC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwgIiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICAqIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICAqIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9pbnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBfaW50IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBfaW50KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSAiIjsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLQotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCwgZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4ID09IG51bGwgPyAiIiA6IG5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiaW50Ii5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9pbnQpIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksIHR5cGUsIHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotCi0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgfHwgcmVhZGVyLmhhc1RleHQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgfHwgcmVhZGVyLmhhc1RleHQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2ludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnQoY29udGVudCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotCi19Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2xvbmcuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvX2xvbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxMjljYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19sb25nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9sb25nLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9sb25nIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9sb25nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbG9uZwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQLUVOQyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIF9sb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBsb25nIGxvY2FsX2xvbmcgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBsb25nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBsb25nIGdldF9sb25nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2xvbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2xvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9sb25nKGxvbmcgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2xvbmc9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9sb25nICsgIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIF9sb25nLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpsb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbF9sb25nPT1qYXZhLmxhbmcuTG9uZy5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibG9uZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfbG9uZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9sb25nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2xvbmcgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgX2xvbmcgcmV0dXJuVmFsdWUgPSBuZXcgIF9sb25nKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9sb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTG9uZyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2xvbmcgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9sb25nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfbG9uZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2xvbmcgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9sb25nIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IF9sb25nKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJsb25nIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2xvbmcpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5zb2FwZW5jb2RpbmcuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRfbG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTG9uZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19zaG9ydC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3NvYXBlbmNvZGluZy9fc2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZTJjMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL19zaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfc2hvcnQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgX3Nob3J0IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9zaG9ydAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHNob3J0Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNPQVAtRU5DIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX3Nob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzaG9ydCBsb2NhbF9zaG9ydCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBzaG9ydCBnZXRfc2hvcnQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfc2hvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX3Nob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfc2hvcnQoc2hvcnQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX3Nob3J0PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfc2hvcnQgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX3Nob3J0LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpzaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3Nob3J0PT1qYXZhLmxhbmcuU2hvcnQuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInNob3J0IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9zaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9zaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9zaG9ydCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfc2hvcnQgcmV0dXJuVmFsdWUgPSBuZXcgIF9zaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfc2hvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TaG9ydCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX3Nob3J0IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2hvcnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zaG9ydC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX3Nob3J0IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfc2hvcnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX3Nob3J0KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJzaG9ydCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9zaG9ydClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9zaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU2hvcnQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9BbnlVUkkuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQW55VVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWRiMDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9BbnlVUkkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQW55VVJJLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEFueVVSSSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBBbnlVUkkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBhbnlVUkkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgQW55VVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBsb2NhbEFueVVSSSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVSSSBnZXRBbnlVUkkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBbnlVUkk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gQW55VVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbnlVUkkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQW55VVJJPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxBbnlVUkkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgQW55VVJJLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjphbnlVUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlVUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxBbnlVUkk9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYW55VVJJIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsQW55VVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEFueVVSSSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxBbnlVUkkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiYW55VVJJIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBBbnlVUkkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgQW55VVJJIHJldHVyblZhbHVlID0gbmV3ICBBbnlVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0QW55VVJJKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQW55VVJJKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBBbnlVUkkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFueVVSSS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW55VVJJLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBBbnlVUkkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEFueVVSSSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBBbnlVUkkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImFueVVSSSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEFueVVSSSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEFueVVSSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQW55VVJJKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQmFzZTY0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0Jhc2U2NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjM1NjEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQmFzZTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEJhc2U2NC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBCYXNlNjQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgQmFzZTY0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgTVlfUU5BTUUgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLAotICAgICAgICAgICAgICAgICJiYXNlNjQiLAotICAgICAgICAgICAgICAgICJ4c2QiKTsKLQotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBCYXNlNjQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgbG9jYWxCYXNlNjQgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGdldEJhc2U2NCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJhc2U2NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBCYXNlNjQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2U2NChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxCYXNlNjQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxCYXNlNjQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxNWV9RTkFNRSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEJhc2U2NC50aGlzLnNlcmlhbGl6ZShNWV9RTkFNRSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgTVlfUU5BTUUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWUgPSBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHR5cGUgZGV0YWlscyBpZiB0aGlzIGlzIHVzZWQgaW4gYSBzaW1wbGUgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6YmFzZTY0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2U2NCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEJhc2U2ND09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlZhbHVlIGNhbm5vdCBiZSBudWxsICEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsQmFzZTY0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy9XZSBjYW4gc2FmZWx5IGFzc3VtZSBhbiBlbGVtZW50IGhhcyBvbmx5IG9uZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwoTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEubGFuZy5PYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxCYXNlNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEJhc2U2NCByZXR1cm5WYWx1ZSA9IG5ldyAgQmFzZTY0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEJhc2U2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBCYXNlNjQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQmFzZTY0KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRCYXNlNjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0Jhc2U2NEJpbmFyeS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9CYXNlNjRCaW5hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhMGNkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0Jhc2U2NEJpbmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBCYXNlNjRCaW5hcnkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgQmFzZTY0QmluYXJ5IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEJhc2U2NEJpbmFyeQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGJhc2U2NEJpbmFyeQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBCYXNlNjRCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgbG9jYWxCYXNlNjRCaW5hcnkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGdldEJhc2U2NEJpbmFyeSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJhc2U2NEJpbmFyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBCYXNlNjRCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2U2NEJpbmFyeShqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEJhc2U2NEJpbmFyeT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQmFzZTY0QmluYXJ5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEJhc2U2NEJpbmFyeS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6YmFzZTY0QmluYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZTY0QmluYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEJhc2U2NEJpbmFyeSE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZURhdGFIYW5kbGVyKGxvY2FsQmFzZTY0QmluYXJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobG9jYWxCYXNlNjRCaW5hcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0QmluYXJ5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEJhc2U2NEJpbmFyeSByZXR1cm5WYWx1ZSA9IG5ldyAgQmFzZTY0QmluYXJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEJhc2U2NEJpbmFyeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jhc2U2NEJpbmFyeSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0QmluYXJ5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNlNjRCaW5hcnkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2U2NEJpbmFyeS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQmFzZTY0QmluYXJ5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBCYXNlNjRCaW5hcnkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgQmFzZTY0QmluYXJ5KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJiYXNlNjRCaW5hcnkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCYXNlNjRCaW5hcnkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSZWFkZXJNVE9NQXdhcmUocmVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19CSU5BUlkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01UT00gYXdhcmUgcmVhZGVyIC0gZ2V0IHRoZSBkYXRhaGFuZGxlciBkaXJlY3RseSBhbmQgcHV0IGl0IGluIHRoZSBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QmFzZTY0QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIpIHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLkRBVEFfSEFORExFUikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJiYgcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHMuWE9QX05BTUVTUEFDRV9VUkksIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzLlhPUF9JTkNMVURFKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlkID0gb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkVsZW1lbnRIZWxwZXIuZ2V0Q29udGVudElEKHJlYWRlciwgIlVURi04Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRCYXNlNjRCaW5hcnkoKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLk1UT01TdEFYU09BUE1vZGVsQnVpbGRlcikgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVN0QVhXcmFwcGVyKSByZWFkZXIpLmdldEJ1aWxkZXIoKSkuZ2V0RGF0YUhhbmRsZXIoaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHJlYWRlci5oYXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9EbyB0aGUgdXN1YWwgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0QmFzZTY0QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0RhdGUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTE2ZDc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBEYXRlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIERhdGUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRGF0ZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRhdGUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkRhdGUgbG9jYWxEYXRlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS51dGlsLkRhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmEudXRpbC5EYXRlIGdldERhdGUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIERhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGUoamF2YS51dGlsLkRhdGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRGF0ZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEYXRlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERhdGU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGF0ZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGF0ZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEYXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRhdGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERhdGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRGF0ZSByZXR1cm5WYWx1ZSA9IG5ldyAgRGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRGF0ZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEYXRlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkYXRlIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGF0ZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldERhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EYXRlVGltZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EYXRlVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFkNTRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGF0ZVRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRGF0ZVRpbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRGF0ZVRpbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRGF0ZVRpbWUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkYXRlVGltZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBEYXRlVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS51dGlsLkNhbGVuZGFyIGxvY2FsRGF0ZVRpbWUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLnV0aWwuQ2FsZW5kYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmEudXRpbC5DYWxlbmRhciBnZXREYXRlVGltZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbERhdGVUaW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIERhdGVUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRlVGltZShqYXZhLnV0aWwuQ2FsZW5kYXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRGF0ZVRpbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbERhdGVUaW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkYXRlVGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGVUaW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGF0ZVRpbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGF0ZVRpbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEYXRlVGltZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxEYXRlVGltZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEYXRlVGltZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkYXRlVGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWUgcmV0dXJuVmFsdWUgPSBuZXcgIERhdGVUaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldERhdGVUaW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZVRpbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBEYXRlVGltZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEYXRlVGltZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiZGF0ZVRpbWUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEYXRlVGltZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldERhdGVUaW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0RlY2ltYWwuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGVjaW1hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZkZDk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRGVjaW1hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBEZWNpbWFsLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIERlY2ltYWwgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRGVjaW1hbAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGRlY2ltYWwKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRGVjaW1hbAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS5tYXRoLkJpZ0RlY2ltYWwgbG9jYWxEZWNpbWFsIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gamF2YS5tYXRoLkJpZ0RlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmEubWF0aC5CaWdEZWNpbWFsIGdldERlY2ltYWwoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEZWNpbWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIERlY2ltYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlY2ltYWwoamF2YS5tYXRoLkJpZ0RlY2ltYWwgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRGVjaW1hbD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsRGVjaW1hbC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpkZWNpbWFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjaW1hbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbERlY2ltYWw9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZGVjaW1hbCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbERlY2ltYWwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRGVjaW1hbCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxEZWNpbWFsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImRlY2ltYWwgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERlY2ltYWwgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCByZXR1cm5WYWx1ZSA9IG5ldyAgRGVjaW1hbCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREZWNpbWFsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRGVjaW1hbCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGVjaW1hbCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGVjaW1hbCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRGVjaW1hbCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBEZWNpbWFsKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkZWNpbWFsIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGVjaW1hbClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldERlY2ltYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RlY2ltYWwoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EdXJhdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9EdXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZkYjU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRHVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRHVyYXRpb24uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRHVyYXRpb24gYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRHVyYXRpb24KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkdXJhdGlvbgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBEdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbiBsb2NhbER1cmF0aW9uIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbiBnZXREdXJhdGlvbigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbER1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIER1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREdXJhdGlvbihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbER1cmF0aW9uPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxEdXJhdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6ZHVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbER1cmF0aW9uPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImR1cmF0aW9uIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRHVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRHVyYXRpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRHVyYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZHVyYXRpb24gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIHJldHVyblZhbHVlID0gbmV3ICBEdXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0R1cmF0aW9uKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIER1cmF0aW9uLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRHVyYXRpb24gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImR1cmF0aW9uIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRHVyYXRpb24pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXREdXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRHVyYXRpb24oY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FTlRJVElFUy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FTlRJVElFUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk1NDgxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRU5USVRJRVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRU5USVRJRVMuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgRU5USVRJRVMgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgRU5USVRJRVMKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBFTlRJVElFUwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBFTlRJVElFUwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdGllcyBsb2NhbEVOVElUSUVTIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdGllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdGllcyBnZXRFTlRJVElFUygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEVOVElUSUVTOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIEVOVElUSUVTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFTlRJVElFUyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEVOVElUSUVTPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxFTlRJVElFUy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBFTlRJVElFUy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6RU5USVRJRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTlRJVElFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEVOVElUSUVTPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIkVOVElUSUVTIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRU5USVRJRVMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRU5USVRJRVMgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRU5USVRJRVMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRJRVMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEVOVElUSUVTIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEVOVElUSUVTIHJldHVyblZhbHVlID0gbmV3ICBFTlRJVElFUygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRFTlRJVElFUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0VOVElUSUVTKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVElFUyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5USVRJRVMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOVElUSUVTLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVElFUyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgRU5USVRJRVMgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgRU5USVRJRVMoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIkVOVElUSUVTIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRU5USVRJRVMpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRFTlRJVElFUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRJRVMoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FTlRJVFkuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRU5USVRZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDQzMjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9FTlRJVFkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogRU5USVRZLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIEVOVElUWSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBFTlRJVFkKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBFTlRJVFkKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgRU5USVRZCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0eSBsb2NhbEVOVElUWSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0eSBnZXRFTlRJVFkoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxFTlRJVFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gRU5USVRZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFTlRJVFkob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5FbnRpdHkgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsRU5USVRZPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxFTlRJVFkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgRU5USVRZLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpFTlRJVFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTlRJVFkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxFTlRJVFk9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRZIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsRU5USVRZKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEVOVElUWSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxFTlRJVFkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiRU5USVRZIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVFkgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgRU5USVRZIHJldHVyblZhbHVlID0gbmV3ICBFTlRJVFkoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0RU5USVRZKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRZKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVFkgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVOVElUWS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5USVRZLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBFTlRJVFkgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEVOVElUWSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBFTlRJVFkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIkVOVElUWSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEVOVElUWSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldEVOVElUWSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRU5USVRZKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRXh0ZW5zaW9uTWFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0V4dGVuc2lvbk1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMyYmY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvRXh0ZW5zaW9uTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFeHRlbnNpb25NYXBwZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0KLS8qKgotICogRXh0ZW5zaW9uTWFwcGVyIGNsYXNzCi0gKi8KLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbk1hcHBlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5PYmplY3QgZ2V0VHlwZU9iamVjdChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgaWYgKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEJ5dGUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlVuc2lnbmVkQnl0ZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIk5NVE9LRU4iLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5NVE9LRU4uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJkdXJhdGlvbiIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRHVyYXRpb24uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9pbnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlN0cmluZy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIk5PVEFUSU9OIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5OT1RBVElPTi5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInRpbWUiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlRpbWUuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJnRGF5Ii5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5HRGF5LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGV4QmluYXJ5Ii5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5IZXhCaW5hcnkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJub25OZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5vbk5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIk5DTmFtZSIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTkNOYW1lLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiTk1UT0tFTlMiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5NVE9LRU5TLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRJbnQiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlVuc2lnbmVkSW50LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRMb25nIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5VbnNpZ25lZExvbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImRhdGVUaW1lIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5EYXRlVGltZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkU2hvcnQiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlVuc2lnbmVkU2hvcnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJnWWVhck1vbnRoIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5HWWVhck1vbnRoLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiYm9vbGVhbiIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuX2Jvb2xlYW4uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJub25Qb3NpdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5vblBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImJhc2U2NCIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuQmFzZTY0LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG91YmxlIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fZG91YmxlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9mbG9hdC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImJhc2U2NEJpbmFyeSIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuQmFzZTY0QmluYXJ5LkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ01vbnRoRGF5Ii5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5HTW9udGhEYXkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5OYW1lLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiRU5USVRZIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FTlRJVFkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJieXRlIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fYnl0ZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImxvbmciLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLl9sb25nLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiSURSRUYiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLklEUkVGLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ1llYXIiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkdZZWFyLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiSUQiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLklELkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiYW55VVJJIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5BbnlVUkkuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbiIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuVG9rZW4uRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLlBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgInNob3J0Ii5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5fc2hvcnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJsYW5ndWFnZSIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuTGFuZ3VhZ2UuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJFTlRJVElFUyIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRU5USVRJRVMuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5EYXRlLkZhY3RvcnkucGFyc2UocmVhZGVyKTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIGlmICgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLmVxdWFscyhuYW1lc3BhY2VVUkkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciIuZXF1YWxzKHR5cGVOYW1lKSkgewotCi0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuSW50ZWdlci5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIlFOYW1lIi5lcXVhbHModHlwZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5RTmFtZS5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIm5vcm1hbGl6ZWRTdHJpbmciLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLk5vcm1hbGl6ZWRTdHJpbmcuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJJRFJFRlMiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLklEUkVGUy5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIi5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgImRlY2ltYWwiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkRlY2ltYWwuRmFjdG9yeS5wYXJzZShyZWFkZXIpOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICJnTW9udGgiLmVxdWFscyh0eXBlTmFtZSkpIHsKLQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkdNb250aC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7Ci0KLQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmFtZXMgcGFjZSA9PT4gIiArIG5hbWVzcGFjZVVSSSArICIgdHlwZSAiICsgdHlwZU5hbWUpOwotCi0gICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgdHlwZSAiICsgbmFtZXNwYWNlVVJJICsgIiAiICsgdHlwZU5hbWUpOwotICAgIH0KLQotfQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR0RheS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWIzOTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdEYXkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR0RheSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHRGF5Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ0RheQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBHRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSBsb2NhbEdEYXkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EYXkgZ2V0R0RheSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdEYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR0RheQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R0RheShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkRheSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHRGF5PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHRGF5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEdEYXkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdEYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnRGF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR0RheT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnRGF5IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR0RheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHRGF5ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdEYXkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ0RheSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR0RheSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHRGF5IHJldHVyblZhbHVlID0gbmV3ICBHRGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEdEYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HRGF5KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHRGF5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHRGF5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHRGF5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHRGF5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBHRGF5IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdEYXkoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdEYXkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHRGF5KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R0RheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR0RheShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dNb250aC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HTW9udGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZjJhNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dNb250aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHTW9udGguamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR01vbnRoIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdNb250aAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdNb250aAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBHTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGggbG9jYWxHTW9udGggOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoIGdldEdNb250aCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdNb250aDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHTW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdNb250aChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdNb250aD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR01vbnRoLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEdNb250aC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z01vbnRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZ01vbnRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR01vbnRoPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdNb250aCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdNb250aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHTW9udGggIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR01vbnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdNb250aCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdNb250aCByZXR1cm5WYWx1ZSA9IG5ldyAgR01vbnRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEdNb250aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dNb250aCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHTW9udGguRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNb250aC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBHTW9udGggb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR01vbnRoKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJnTW9udGgiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHTW9udGgpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHTW9udGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dNb250aChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dNb250aERheS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HTW9udGhEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlMjc2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dNb250aERheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHTW9udGhEYXkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR01vbnRoRGF5IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEdNb250aERheQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdNb250aERheQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBHTW9udGhEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGhEYXkgbG9jYWxHTW9udGhEYXkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IGdldEdNb250aERheSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdNb250aERheTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBHTW9udGhEYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdNb250aERheShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbEdNb250aERheT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR01vbnRoRGF5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEdNb250aERheS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Z01vbnRoRGF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZ01vbnRoRGF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR01vbnRoRGF5PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdNb250aERheSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdNb250aERheSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHTW9udGhEYXkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR01vbnRoRGF5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdNb250aERheSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoRGF5IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIEdNb250aERheSByZXR1cm5WYWx1ZSA9IG5ldyAgR01vbnRoRGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEdNb250aERheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dNb250aERheSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoRGF5IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHTW9udGhEYXkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdNb250aERheS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgR01vbnRoRGF5IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBHTW9udGhEYXkgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgR01vbnRoRGF5KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJnTW9udGhEYXkiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHTW9udGhEYXkpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRHTW9udGhEYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dNb250aERheShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dZZWFyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0dZZWFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNWJiNzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HWWVhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBHWWVhci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBHWWVhciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHWWVhcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdZZWFyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIEdZZWFyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXIgbG9jYWxHWWVhciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIGdldEdZZWFyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR1llYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdZZWFyKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHWWVhcj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsR1llYXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgR1llYXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdZZWFyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZ1llYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHWWVhcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnWWVhciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdZZWFyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEdZZWFyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdZZWFyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImdZZWFyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHWWVhciByZXR1cm5WYWx1ZSA9IG5ldyAgR1llYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0R1llYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HWWVhcih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdZZWFyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHWWVhci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIEdZZWFyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdZZWFyKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJnWWVhciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEdZZWFyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R1llYXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0dZZWFyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvR1llYXJNb250aC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HWWVhck1vbnRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTkxNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9HWWVhck1vbnRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEdZZWFyTW9udGguamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgR1llYXJNb250aCBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBHWWVhck1vbnRoCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZ1llYXJNb250aAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBHWWVhck1vbnRoCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aCBsb2NhbEdZZWFyTW9udGggOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGggZ2V0R1llYXJNb250aCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEdZZWFyTW9udGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gR1llYXJNb250aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0R1llYXJNb250aChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlllYXJNb250aCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxHWWVhck1vbnRoPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxHWWVhck1vbnRoLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEdZZWFyTW9udGgudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmdZZWFyTW9udGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJnWWVhck1vbnRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsR1llYXJNb250aD09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJnWWVhck1vbnRoIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsR1llYXJNb250aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxHWWVhck1vbnRoICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEdZZWFyTW9udGgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZ1llYXJNb250aCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgR1llYXJNb250aCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBHWWVhck1vbnRoIHJldHVyblZhbHVlID0gbmV3ICBHWWVhck1vbnRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEdZZWFyTW9udGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9HWWVhck1vbnRoKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhck1vbnRoIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHWWVhck1vbnRoLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHWWVhck1vbnRoLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBHWWVhck1vbnRoIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBHWWVhck1vbnRoIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEdZZWFyTW9udGgoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImdZZWFyTW9udGgiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChHWWVhck1vbnRoKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0R1llYXJNb250aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvR1llYXJNb250aChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0hleEJpbmFyeS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9IZXhCaW5hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0NDBiYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0hleEJpbmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBIZXhCaW5hcnkuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSGV4QmluYXJ5IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIEhleEJpbmFyeQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGhleEJpbmFyeQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBIZXhCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5IGxvY2FsSGV4QmluYXJ5IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5IZXhCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5IGdldEhleEJpbmFyeSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEhleEJpbmFyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBIZXhCaW5hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEhleEJpbmFyeShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkhleEJpbmFyeSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxIZXhCaW5hcnk9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEhleEJpbmFyeS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBIZXhCaW5hcnkudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmhleEJpbmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImhleEJpbmFyeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEhleEJpbmFyeT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJoZXhCaW5hcnkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxIZXhCaW5hcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSGV4QmluYXJ5ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEhleEJpbmFyeSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJoZXhCaW5hcnkgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBIZXhCaW5hcnkgcmV0dXJuVmFsdWUgPSBuZXcgIEhleEJpbmFyeSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRIZXhCaW5hcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9IZXhCaW5hcnkodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSGV4QmluYXJ5LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIZXhCaW5hcnkuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgSGV4QmluYXJ5IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhleEJpbmFyeSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiaGV4QmluYXJ5Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSGV4QmluYXJ5KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SGV4QmluYXJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9IZXhCaW5hcnkoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzI5YTc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSUQuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSUQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSUQKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBJRAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBJRAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBsb2NhbElEIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZCBnZXRJRCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJRChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklkIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbElEPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBJRC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6SUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIklEIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSUQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSUQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIElEIHJldHVyblZhbHVlID0gbmV3ICBJRCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRJRCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRCBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSUQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElELkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJRCBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgSUQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSUQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIklEIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSUQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJRCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSUQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRFJFRi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRFJFRi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTBlMjM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvSURSRUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSURSRUYuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSURSRUYgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgSURSRUYKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBJRFJFRgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBJRFJFRgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZiBsb2NhbElEUkVGIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZiBnZXRJRFJFRigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbElEUkVGOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIElEUkVGCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJRFJFRihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbElEUkVGPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRFJFRi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBJRFJFRi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6SURSRUYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRFJFRiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEUkVGPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIklEUkVGIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSURSRUYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSURSRUYgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSURSRUYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUYgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIElEUkVGIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIElEUkVGIHJldHVyblZhbHVlID0gbmV3ICBJRFJFRigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRJRFJFRigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0lEUkVGKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURSRUYuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEUkVGLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgSURSRUYgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSURSRUYoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIklEUkVGIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSURSRUYpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJRFJFRigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUYoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRFJFRlMuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvSURSRUZTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMmViYzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JRFJFRlMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSURSRUZTLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIElEUkVGUyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBJRFJFRlMKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBJRFJFRlMKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgSURSRUZTCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmcyBsb2NhbElEUkVGUyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWZzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLklEUmVmcyBnZXRJRFJFRlMoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRFJFRlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSURSRUZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJRFJFRlMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZnMgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSURSRUZTPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJRFJFRlMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgSURSRUZTLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpJRFJFRlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRFJFRlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJRFJFRlM9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUZTIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSURSRUZTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbElEUkVGUyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxJRFJFRlMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiSURSRUZTIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRlMgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgSURSRUZTIHJldHVyblZhbHVlID0gbmV3ICBJRFJFRlMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0SURSRUZTKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUZTKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRlMgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEUkVGUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURSRUZTLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJRFJFRlMgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIElEUkVGUyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBJRFJFRlMoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIklEUkVGUyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKElEUkVGUylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldElEUkVGUygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSURSRUZTKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvSW50ZWdlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmYzZWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9JbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEludGVnZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gaW50ZWdlcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZhLm1hdGguQmlnSW50ZWdlciBsb2NhbEludGVnZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZhLm1hdGguQmlnSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgamF2YS5tYXRoLkJpZ0ludGVnZXIgZ2V0SW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW50ZWdlcihqYXZhLm1hdGguQmlnSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxJbnRlZ2VyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJpbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbEludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiaW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImludGVnZXIiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvSW50ZWdlcihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0xhbmd1YWdlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL0xhbmd1YWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzM4YmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9MYW5ndWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBMYW5ndWFnZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBMYW5ndWFnZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBMYW5ndWFnZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIExhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkxhbmd1YWdlIGxvY2FsTGFuZ3VhZ2UgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkxhbmd1YWdlIGdldExhbmd1YWdlKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTGFuZ3VhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTGFuZ3VhZ2UgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTGFuZ3VhZ2U9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbExhbmd1YWdlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIExhbmd1YWdlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpsYW5ndWFnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhbmd1YWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTGFuZ3VhZ2U9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibGFuZ3VhZ2UgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxMYW5ndWFnZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxMYW5ndWFnZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxMYW5ndWFnZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJsYW5ndWFnZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTGFuZ3VhZ2UgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTGFuZ3VhZ2UgcmV0dXJuVmFsdWUgPSBuZXcgIExhbmd1YWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldExhbmd1YWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTGFuZ3VhZ2UodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIExhbmd1YWdlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMYW5ndWFnZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIExhbmd1YWdlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBMYW5ndWFnZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBMYW5ndWFnZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibGFuZ3VhZ2UiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChMYW5ndWFnZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldExhbmd1YWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9MYW5ndWFnZShjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05DTmFtZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OQ05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyOTg2My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05DTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOQ05hbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTkNOYW1lIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5DTmFtZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5DTmFtZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lIGxvY2FsTkNOYW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTkNOYW1lIGdldE5DTmFtZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5DTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOQ05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5DTmFtZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5DTmFtZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOQ05hbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5DTmFtZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOQ05hbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5DTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5DTmFtZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOQ05hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOQ05hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTkNOYW1lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5DTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOQ05hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOQ05hbWUgcmV0dXJuVmFsdWUgPSBuZXcgIE5DTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROQ05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OQ05hbWUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkNOYW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQ05hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTkNOYW1lIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5DTmFtZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTkNOYW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTkNOYW1lKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TkNOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OQ05hbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OTVRPS0VOLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05NVE9LRU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwNWU0YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05NVE9LRU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTk1UT0tFTi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOTVRPS0VOIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5NVE9LRU4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBOTVRPS0VOCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5NVE9LRU4KLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbiBsb2NhbE5NVE9LRU4gOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbiBnZXROTVRPS0VOKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTk1UT0tFTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOTVRPS0VOCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROTVRPS0VOKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbiBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOTVRPS0VOPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOTVRPS0VOLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5NVE9LRU4udGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOk5NVE9LRU4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJOTVRPS0VOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTk1UT0tFTj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTk1UT0tFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5NVE9LRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTk1UT0tFTiBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTiBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOTVRPS0VOIHJldHVyblZhbHVlID0gbmV3ICBOTVRPS0VOKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5NVE9LRU4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOTVRPS0VOIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOTVRPS0VOIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5NVE9LRU4oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIk5NVE9LRU4iLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOTVRPS0VOKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tk1UT0tFTigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTk1UT0tFTihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05NVE9LRU5TLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05NVE9LRU5TLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMmU3MzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OTVRPS0VOUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOTVRPS0VOUy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOTVRPS0VOUyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOTVRPS0VOUwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5NVE9LRU5TCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5NVE9LRU5TCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zIGxvY2FsTk1UT0tFTlMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW5zIGdldE5NVE9LRU5TKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTk1UT0tFTlM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTk1UT0tFTlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5NVE9LRU5TKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTk1Ub2tlbnMgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTk1UT0tFTlM9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5NVE9LRU5TLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5NVE9LRU5TLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpOTVRPS0VOUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5NVE9LRU5TIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTk1UT0tFTlM9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiTk1UT0tFTlMgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOTVRPS0VOUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOTVRPS0VOUyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOTVRPS0VOUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOTVRPS0VOUyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk1UT0tFTlMgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTk1UT0tFTlMgcmV0dXJuVmFsdWUgPSBuZXcgIE5NVE9LRU5TKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5NVE9LRU5TKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTk1UT0tFTlModmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU5TIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOTVRPS0VOUy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk1UT0tFTlMuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5NVE9LRU5TIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOTVRPS0VOUyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOTVRPS0VOUygpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTk1UT0tFTlMiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOTVRPS0VOUylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5NVE9LRU5TKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OTVRPS0VOUyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05PVEFUSU9OLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05PVEFUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMzUxOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9OT1RBVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEwICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOT1RBVElPTi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOT1RBVElPTiBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOT1RBVElPTgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5PVEFUSU9OCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGxvY2FsUU5hbWUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIGdldFFOYW1lKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsUU5hbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFFOYW1lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5PVEFUSU9OLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpOT1RBVElPTiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5PVEFUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsUU5hbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUU5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVFOYW1lKGxvY2FsUU5hbWUseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsUU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsUU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiUU5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5PVEFUSU9OIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5PVEFUSU9OIHJldHVyblZhbHVlID0gbmV3ICBOT1RBVElPTigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKHZhbHVlLG5hbWVzcGFjZVVSSSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTk9UQVRJT04gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVEFUSU9OLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RBVElPTi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTk9UQVRJT04gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5PVEFUSU9OIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5PVEFUSU9OKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJOT1RBVElPTiIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5PVEFUSU9OKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gY29udGVudC5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXVyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1FOYW1lKGNvbnRlbnQsbmFtZXNwYWNldXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05hbWUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTNiMDU5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOYW1lLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5hbWUgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTmFtZQotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IE5hbWUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lIGxvY2FsTmFtZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lIGdldE5hbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OYW1lIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5hbWU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTmFtZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIk5hbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJOYW1lIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOYW1lIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWUgcmV0dXJuVmFsdWUgPSBuZXcgIE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05hbWUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5hbWUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5hbWUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTmFtZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiTmFtZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5hbWUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9OYW1lKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTmVnYXRpdmVJbnRlZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05lZ2F0aXZlSW50ZWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQzYTFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTmVnYXRpdmVJbnRlZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5lZ2F0aXZlSW50ZWdlci5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBOZWdhdGl2ZUludGVnZXIgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgTmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbmVnYXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIE5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXIgbG9jYWxOZWdhdGl2ZUludGVnZXIgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXIgZ2V0TmVnYXRpdmVJbnRlZ2VyKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmVnYXRpdmVJbnRlZ2VyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIE5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmVnYXRpdmVJbnRlZ2VyKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTmVnYXRpdmVJbnRlZ2VyIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbE5lZ2F0aXZlSW50ZWdlcj1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmVnYXRpdmVJbnRlZ2VyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIE5lZ2F0aXZlSW50ZWdlci50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6bmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmVJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTmVnYXRpdmVJbnRlZ2VyPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIm5lZ2F0aXZlSW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5lZ2F0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOZWdhdGl2ZUludGVnZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTmVnYXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIm5lZ2F0aXZlSW50ZWdlciBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVJbnRlZ2VyIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIE5lZ2F0aXZlSW50ZWdlciByZXR1cm5WYWx1ZSA9IG5ldyAgTmVnYXRpdmVJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldE5lZ2F0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05lZ2F0aXZlSW50ZWdlcih2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVJbnRlZ2VyIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5lZ2F0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTmVnYXRpdmVJbnRlZ2VyIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBOZWdhdGl2ZUludGVnZXIgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTmVnYXRpdmVJbnRlZ2VyKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJuZWdhdGl2ZUludGVnZXIiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOZWdhdGl2ZUludGVnZXIpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXROZWdhdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05lZ2F0aXZlSW50ZWdlcihjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vbk5lZ2F0aXZlSW50ZWdlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob25OZWdhdGl2ZUludGVnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiMDVhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL05vbk5lZ2F0aXZlSW50ZWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBOb25OZWdhdGl2ZUludGVnZXIuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTm9uTmVnYXRpdmVJbnRlZ2VyIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIE5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IG5vbk5lZ2F0aXZlSW50ZWdlcgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOb25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uTmVnYXRpdmVJbnRlZ2VyIGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uTmVnYXRpdmVJbnRlZ2VyIGdldE5vbk5lZ2F0aXZlSW50ZWdlcigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBOb25OZWdhdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5vbk5lZ2F0aXZlSW50ZWdlcihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vbk5lZ2F0aXZlSW50ZWdlciBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxOb25OZWdhdGl2ZUludGVnZXI9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlci50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOm5vbk5lZ2F0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbk5lZ2F0aXZlSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcj09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25OZWdhdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25OZWdhdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9uTmVnYXRpdmVJbnRlZ2VyICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vbk5lZ2F0aXZlSW50ZWdlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJub25OZWdhdGl2ZUludGVnZXIgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBOb25OZWdhdGl2ZUludGVnZXIgcmV0dXJuVmFsdWUgPSBuZXcgIE5vbk5lZ2F0aXZlSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROb25OZWdhdGl2ZUludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25OZWdhdGl2ZUludGVnZXIodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uTmVnYXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25OZWdhdGl2ZUludGVnZXIuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTm9uTmVnYXRpdmVJbnRlZ2VyIG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IE5vbk5lZ2F0aXZlSW50ZWdlcigpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEibm9uTmVnYXRpdmVJbnRlZ2VyIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTm9uTmVnYXRpdmVJbnRlZ2VyKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0Tm9uTmVnYXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Ob25OZWdhdGl2ZUludGVnZXIoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzZiZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob25Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogTm9uUG9zaXRpdmVJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIE5vblBvc2l0aXZlSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOb25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBub25Qb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlciBsb2NhbE5vblBvc2l0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vblBvc2l0aXZlSW50ZWdlciBnZXROb25Qb3NpdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb25Qb3NpdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTm9uUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROb25Qb3NpdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25Qb3NpdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxOb25Qb3NpdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpub25Qb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25Qb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxOb25Qb3NpdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9uUG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsTm9uUG9zaXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vblBvc2l0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb25Qb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9uUG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb25Qb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTm9uUG9zaXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBOb25Qb3NpdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0Tm9uUG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9uUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBOb25Qb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vblBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBOb25Qb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIE5vblBvc2l0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOb25Qb3NpdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIm5vblBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5vblBvc2l0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5vblBvc2l0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9uUG9zaXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvTm9ybWFsaXplZFN0cmluZy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob3JtYWxpemVkU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDRmMDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ob3JtYWxpemVkU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIE5vcm1hbGl6ZWRTdHJpbmcuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgTm9ybWFsaXplZFN0cmluZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBOb3JtYWxpemVkU3RyaW5nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZFN0cmluZwotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBOb3JtYWxpemVkU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmcgbG9jYWxOb3JtYWxpemVkU3RyaW5nIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3JtYWxpemVkU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmcgZ2V0Tm9ybWFsaXplZFN0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbE5vcm1hbGl6ZWRTdHJpbmc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gTm9ybWFsaXplZFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Tm9ybWFsaXplZFN0cmluZyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5vcm1hbGl6ZWRTdHJpbmcgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsTm9ybWFsaXplZFN0cmluZz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTm9ybWFsaXplZFN0cmluZy50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVkU3RyaW5nLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpub3JtYWxpemVkU3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibm9ybWFsaXplZFN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE5vcm1hbGl6ZWRTdHJpbmc9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigibm9ybWFsaXplZFN0cmluZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5vcm1hbGl6ZWRTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTm9ybWFsaXplZFN0cmluZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxOb3JtYWxpemVkU3RyaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIm5vcm1hbGl6ZWRTdHJpbmcgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIE5vcm1hbGl6ZWRTdHJpbmcgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgTm9ybWFsaXplZFN0cmluZyByZXR1cm5WYWx1ZSA9IG5ldyAgTm9ybWFsaXplZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXROb3JtYWxpemVkU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvTm9ybWFsaXplZFN0cmluZyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgTm9ybWFsaXplZFN0cmluZyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9ybWFsaXplZFN0cmluZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9ybWFsaXplZFN0cmluZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTm9ybWFsaXplZFN0cmluZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgTm9ybWFsaXplZFN0cmluZyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBOb3JtYWxpemVkU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJub3JtYWxpemVkU3RyaW5nIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTm9ybWFsaXplZFN0cmluZylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5vcm1hbGl6ZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb05vcm1hbGl6ZWRTdHJpbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Qb3NpdGl2ZUludGVnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvUG9zaXRpdmVJbnRlZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMGYxOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Qb3NpdGl2ZUludGVnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogUG9zaXRpdmVJbnRlZ2VyLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFBvc2l0aXZlSW50ZWdlciBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBQb3NpdGl2ZUludGVnZXIKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBwb3NpdGl2ZUludGVnZXIKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlciBsb2NhbFBvc2l0aXZlSW50ZWdlciA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlBvc2l0aXZlSW50ZWdlciBnZXRQb3NpdGl2ZUludGVnZXIoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxQb3NpdGl2ZUludGVnZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gUG9zaXRpdmVJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb3NpdGl2ZUludGVnZXIob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXIgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsUG9zaXRpdmVJbnRlZ2VyPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxQb3NpdGl2ZUludGVnZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpwb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZUludGVnZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxQb3NpdGl2ZUludGVnZXI9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsUG9zaXRpdmVJbnRlZ2VyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFBvc2l0aXZlSW50ZWdlciAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxQb3NpdGl2ZUludGVnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigicG9zaXRpdmVJbnRlZ2VyIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgUG9zaXRpdmVJbnRlZ2VyIHJldHVyblZhbHVlID0gbmV3ICBQb3NpdGl2ZUludGVnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0UG9zaXRpdmVJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUG9zaXRpdmVJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludGVnZXIgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvc2l0aXZlSW50ZWdlci5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUG9zaXRpdmVJbnRlZ2VyLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBQb3NpdGl2ZUludGVnZXIgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFBvc2l0aXZlSW50ZWdlciBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBQb3NpdGl2ZUludGVnZXIoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFBvc2l0aXZlSW50ZWdlcilvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFBvc2l0aXZlSW50ZWdlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUG9zaXRpdmVJbnRlZ2VyKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvUU5hbWUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAxMzFlMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1FOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTAgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFFOYW1lLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFFOYW1lIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFFOYW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gUU5hbWUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgbG9jYWxRTmFtZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgZ2V0UU5hbWUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxRTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxRTmFtZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUU5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOlFOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiUU5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxRTmFtZT09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJRTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUU5hbWUobG9jYWxRTmFtZSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxRTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxRTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJRTmFtZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcmV0dXJuVmFsdWUgPSBuZXcgIFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUodmFsdWUsbmFtZXNwYWNlVVJJKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUU5hbWUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFFOYW1lLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBRTmFtZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgUU5hbWUgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIlFOYW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUU5hbWUpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50LmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNldXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvUU5hbWUoY29udGVudCxuYW1lc3BhY2V1cmkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvU3RyaW5nLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1N0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjE4ZTFlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFN0cmluZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBTdHJpbmcgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgU3RyaW5nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gc3RyaW5nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBsb2NhbFN0cmluZyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGphdmEubGFuZy5TdHJpbmcgZ2V0U3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RyaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RyaW5nPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpzdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxTdHJpbmc9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigic3RyaW5nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhsb2NhbFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFN0cmluZyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxTdHJpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigic3RyaW5nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldHVyblZhbHVlID0gbmV3ICBTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFN0cmluZyBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInN0cmluZyIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVGltZS5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9UaW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNWJlODAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9UaW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRpbWUuamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVGltZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBUaW1lCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdGltZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUgbG9jYWxUaW1lIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUgZ2V0VGltZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VGltZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRpbWUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVGltZT1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVGltZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBUaW1lLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp0aW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFRpbWU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidGltZSBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFRpbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVGltZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxUaW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInRpbWUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFRpbWUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVGltZSByZXR1cm5WYWx1ZSA9IG5ldyAgVGltZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRUaW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVGltZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGltZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVGltZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBUaW1lKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ0aW1lIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVGltZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1RpbWUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ub2tlbi5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWJiZjdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVG9rZW4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UICBCdWlsdCBvbiA6IERlYyAyMSwgMjAwNyAoMDQ6MDM6MzAgTEtUKQotICovCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiAgVG9rZW4gYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVG9rZW4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlbgotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBUb2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbiBsb2NhbFRva2VuIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ub2tlbiBnZXRUb2tlbigpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFRva2VuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFRva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlbihvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlRva2VuIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFRva2VuPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxUb2tlbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBUb2tlbi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dG9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFRva2VuPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInRva2VuIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVG9rZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVG9rZW4gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVG9rZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidG9rZW4gY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFRva2VuIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFRva2VuIHJldHVyblZhbHVlID0gbmV3ICBUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRUb2tlbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Rva2VuKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBUb2tlbiBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG9rZW4uRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRva2VuLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBUb2tlbiBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgVG9rZW4gb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVG9rZW4oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInRva2VuIi5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVG9rZW4pb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRUb2tlbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVG9rZW4oY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZEJ5dGUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRCeXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWUyZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9VbnNpZ25lZEJ5dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVW5zaWduZWRCeXRlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFVuc2lnbmVkQnl0ZSBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBVbnNpZ25lZEJ5dGUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSB1bnNpZ25lZEJ5dGUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZSBsb2NhbFVuc2lnbmVkQnl0ZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkQnl0ZSBnZXRVbnNpZ25lZEJ5dGUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEJ5dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gVW5zaWduZWRCeXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVbnNpZ25lZEJ5dGUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEJ5dGUgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsVW5zaWduZWRCeXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEJ5dGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRCeXRlLnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjp1bnNpZ25lZEJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZEJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZEJ5dGU9PW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBuaWwgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRCeXRlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRCeXRlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkQnl0ZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZEJ5dGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigidW5zaWduZWRCeXRlIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEJ5dGUgZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJKXsKLSAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRCeXRlIHJldHVyblZhbHVlID0gbmV3ICBVbnNpZ25lZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRCeXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRCeXRlKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEJ5dGUgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkQnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5zaWduZWRCeXRlLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEJ5dGUgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkQnl0ZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBVbnNpZ25lZEJ5dGUoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghInVuc2lnbmVkQnl0ZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkQnl0ZSlvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFVuc2lnbmVkQnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvVW5zaWduZWRCeXRlKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRJbnQuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMjQ2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Vuc2lnbmVkSW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkSW50LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFVuc2lnbmVkSW50IGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIFVuc2lnbmVkSW50Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRJbnQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRJbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQgbG9jYWxVbnNpZ25lZEludCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRJbnQgZ2V0VW5zaWduZWRJbnQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZEludDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBVbnNpZ25lZEludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VW5zaWduZWRJbnQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludCBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxVbnNpZ25lZEludD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRJbnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRJbnQudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOnVuc2lnbmVkSW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRJbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZEludD09bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIG5pbCBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZEludCBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkSW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkSW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkSW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkSW50IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZEludCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZEludCByZXR1cm5WYWx1ZSA9IG5ldyAgVW5zaWduZWRJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZEludCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRJbnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkSW50LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LG5hbWVzcGFjZVVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZEludC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRJbnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkSW50IG9iamVjdCA9Ci0gICAgICAgICAgICAgICAgbmV3IFVuc2lnbmVkSW50KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ1bnNpZ25lZEludCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkSW50KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0VW5zaWduZWRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkSW50KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRMb25nLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Vuc2lnbmVkTG9uZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmQ4MjAyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRMb25nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFVuc2lnbmVkTG9uZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBVbnNpZ25lZExvbmcgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVW5zaWduZWRMb25nCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gdW5zaWduZWRMb25nCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgICAgICAgICAgICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdlbmVyYXRlUHJlZml4KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICBpZihuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gInhzZCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICogZmllbGQgZm9yIFVuc2lnbmVkTG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmcgbG9jYWxVbnNpZ25lZExvbmcgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZExvbmcgZ2V0VW5zaWduZWRMb25nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRMb25nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFVuc2lnbmVkTG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VW5zaWduZWRMb25nKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRMb25nIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFVuc2lnbmVkTG9uZz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsVW5zaWduZWRMb25nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAvKioKLSAgICAgKiBpc1JlYWRlck1UT01Bd2FyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgdHJ5ewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gamF2YS5sYW5nLkJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpb20ub20uT01Db25zdGFudHMuSVNfREFUQV9IQU5ETEVSU19BV0FSRSkpOwotICAgICAgICB9Y2F0Y2goamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlYWRlck1UT01Bd2FyZTsKLSAgIH0KLSAgICAgCi0gICAgIAotICAgICAgICAvKioKLSAgICAgICAgKgotICAgICAgICAqIEBwYXJhbSBwYXJlbnRRTmFtZQotICAgICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudAotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQgKAotICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkRhdGFTb3VyY2UodGhpcyxwYXJlbnRRTmFtZSl7Ci0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkTG9uZy50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dW5zaWduZWRMb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWRMb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsVW5zaWduZWRMb25nPT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkTG9uZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbFVuc2lnbmVkTG9uZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZExvbmcgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRMb25nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkTG9uZyBjYW5ub3QgYmUgbnVsbCEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRMb25nIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkTG9uZyByZXR1cm5WYWx1ZSA9IG5ldyAgVW5zaWduZWRMb25nKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldFVuc2lnbmVkTG9uZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkTG9uZyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRMb25nIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVbnNpZ25lZExvbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkTG9uZy5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVW5zaWduZWRMb25nIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBVbnNpZ25lZExvbmcgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVW5zaWduZWRMb25nKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJ1bnNpZ25lZExvbmciLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChVbnNpZ25lZExvbmcpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRVbnNpZ25lZExvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkTG9uZyhjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL1Vuc2lnbmVkU2hvcnQuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRTaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzE5NDllLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvVW5zaWduZWRTaG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBVbnNpZ25lZFNob3J0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIFVuc2lnbmVkU2hvcnQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgVW5zaWduZWRTaG9ydAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IHVuc2lnbmVkU2hvcnQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgVW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0IGxvY2FsVW5zaWduZWRTaG9ydCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVW5zaWduZWRTaG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0IGdldFVuc2lnbmVkU2hvcnQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxVbnNpZ25lZFNob3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIFVuc2lnbmVkU2hvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVuc2lnbmVkU2hvcnQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZFNob3J0IHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbFVuc2lnbmVkU2hvcnQ9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFVuc2lnbmVkU2hvcnQudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgVW5zaWduZWRTaG9ydC50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6dW5zaWduZWRTaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkU2hvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxVbnNpZ25lZFNob3J0PT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgbmlsIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInVuc2lnbmVkU2hvcnQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxVbnNpZ25lZFNob3J0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFVuc2lnbmVkU2hvcnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsVW5zaWduZWRTaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJ1bnNpZ25lZFNob3J0IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBVbnNpZ25lZFNob3J0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIFVuc2lnbmVkU2hvcnQgcmV0dXJuVmFsdWUgPSBuZXcgIFVuc2lnbmVkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0VW5zaWduZWRTaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Vuc2lnbmVkU2hvcnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkU2hvcnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkU2hvcnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuc2lnbmVkU2hvcnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkU2hvcnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIFVuc2lnbmVkU2hvcnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVW5zaWduZWRTaG9ydCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEidW5zaWduZWRTaG9ydCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFVuc2lnbmVkU2hvcnQpb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2QuRXh0ZW5zaW9uTWFwcGVyLmdldFR5cGVPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNVcmksdHlwZSxyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSBhbGwgYXR0cmlidXRlcyB0aGF0IHdlcmUgaGFuZGxlZC4gVXNlZCB0byBkaWZmZXIgbm9ybWFsIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAvLyBmcm9tIGFueUF0dHJpYnV0ZXMuCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvciBoYW5kbGVkQXR0cmlidXRlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRVbnNpZ25lZFNob3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9VbnNpZ25lZFNob3J0KGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2Jvb2xlYW4uamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2Jvb2xlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2Zjg1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19ib29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfYm9vbGVhbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLQotCi0vKioKLSAqIF9ib29sZWFuIGJlYW4gY2xhc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgX2Jvb2xlYW4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4gewotICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgIG5hbWUgPSBib29sZWFuCi0gICAgTmFtZXNwYWNlIFVSSSA9IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICovCi0KLQotICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpIHsKLSAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGZpZWxkIGZvciBfYm9vbGVhbgotICAgICAqLwotCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2NhbF9ib29sZWFuOwotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRfYm9vbGVhbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsX2Jvb2xlYW47Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gX2Jvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRfYm9vbGVhbihib29sZWFuIHBhcmFtKSB7Ci0KLSAgICAgICAgdGhpcy5sb2NhbF9ib29sZWFuID0gcGFyYW07Ci0KLQotICAgIH0KLQotCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGxvY2FsX2Jvb2xlYW4gKyAiIjsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIHN1cHBvcnRzIE1UT00KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMsIHBhcmVudFFOYW1lKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfYm9vbGVhbi50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSwgZmFjdG9yeSwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsIGZhY3RvcnksIGRhdGFTb3VyY2UpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uIHsKLSAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLCBmYWN0b3J5LCB4bWxXcml0ZXIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLQotCi0gICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSkgewotCi0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCArICI6Ym9vbGVhbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgImJvb2xlYW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFsc2UpIHsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJib29sZWFuIGNhbm5vdCBiZSBudWxsISEiKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Jvb2xlYW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLQotICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9ib29sZWFuKSk7Ci0KLQotICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IHsKLQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2Jvb2xlYW4gZnJvbVN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgICAgIF9ib29sZWFuIHJldHVyblZhbHVlID0gbmV3IF9ib29sZWFuKCk7Ci0KLSAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9ib29sZWFuKAotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvQm9vbGVhbih2YWx1ZSkpOwotCi0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2Jvb2xlYW4gZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLCBjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBfYm9vbGVhbi5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwgbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib29sZWFuLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgICogSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgICogSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2Jvb2xlYW4gcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBfYm9vbGVhbiBvYmplY3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgX2Jvb2xlYW4oKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9ICIiOwotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAidHlwZSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLCBmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXggPT0gbnVsbCA/ICIiIDogbnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJib29sZWFuIi5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9ib29sZWFuKSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLCB0eXBlLCByZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQotCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpIHx8IHJlYWRlci5oYXNUZXh0KCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpIHx8IHJlYWRlci5oYXNUZXh0KCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9ib29sZWFuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Jvb2xlYW4oY29udGVudCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotCi19Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2J5dGUuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2J5dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlZmE2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19ieXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9ieXRlLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9ieXRlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9ieXRlCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gYnl0ZQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYnl0ZSBsb2NhbF9ieXRlIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgYnl0ZSBnZXRfYnl0ZSgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9ieXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIF9ieXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfYnl0ZShieXRlIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbF9ieXRlPXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfYnl0ZSArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfYnl0ZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6Ynl0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfYnl0ZT09amF2YS5sYW5nLkJ5dGUuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oImJ5dGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2J5dGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfYnl0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9ieXRlIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9ieXRlIHJldHVyblZhbHVlID0gbmV3ICBfYnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfYnl0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0J5dGUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9ieXRlIGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfYnl0ZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2J5dGUuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9ieXRlIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfYnl0ZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfYnl0ZSgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiYnl0ZSIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9ieXRlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2J5dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0J5dGUoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fZG91YmxlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19kb3VibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhOTk1MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19kb3VibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogX2RvdWJsZS5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfZG91YmxlIGJlYW4gY2xhc3MKLSAgICAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBwdWJsaWMgIGNsYXNzIF9kb3VibGUKLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57Ci0gICAgICAgIC8qIFRoaXMgdHlwZSB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBpZWNlIG9mIHNjaGVtYSB0aGF0IGhhZAotICAgICAgICAgICAgICAgIG5hbWUgPSBkb3VibGUKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX2RvdWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIGxvY2FsX2RvdWJsZSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGRvdWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyAgZG91YmxlIGdldF9kb3VibGUoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfZG91YmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIF9kb3VibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldF9kb3VibGUoZG91YmxlIHBhcmFtKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbF9kb3VibGU9cGFyYW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9kb3VibGUgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX2RvdWJsZS50aGlzLnNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgcGFyZW50UU5hbWUsZmFjdG9yeSxkYXRhU291cmNlKTsKLSAgICAgICAgICAgIAotICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0KLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gcGFyZW50UU5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlICE9IG51bGwpICYmIChuYW1lc3BhY2UudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgd3JpdGVyUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlclByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KG5hbWVzcGFjZSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocHJlZml4LCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZVR5cGUpewotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIik7Ci0gICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkgJiYgKG5hbWVzcGFjZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KyI6ZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmEubGFuZy5Eb3VibGUuaXNOYU4obG9jYWxfZG91YmxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJkb3VibGUgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2RvdWJsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9kb3VibGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfZG91YmxlIGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9kb3VibGUgcmV0dXJuVmFsdWUgPSBuZXcgIF9kb3VibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2RvdWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RvdWJsZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2RvdWJsZSBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RvdWJsZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RvdWJsZS5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX2RvdWJsZSBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgX2RvdWJsZSBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfZG91YmxlKCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJkb3VibGUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfZG91YmxlKW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2RvdWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvRG91YmxlKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2Zsb2F0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19mbG9hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI4MTc1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2Zsb2F0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9mbG9hdC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfZmxvYXQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX2Zsb2F0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gZmxvYXQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX2Zsb2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBmbG9hdCBsb2NhbF9mbG9hdCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGZsb2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBmbG9hdCBnZXRfZmxvYXQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfZmxvYXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2Zsb2F0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfZmxvYXQoZmxvYXQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2Zsb2F0PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfZmxvYXQgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX2Zsb2F0LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpmbG9hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmEubGFuZy5GbG9hdC5pc05hTihsb2NhbF9mbG9hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiZmxvYXQgY2Fubm90IGJlIG51bGwhISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Zsb2F0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2Zsb2F0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2Zsb2F0IGZyb21TdHJpbmcoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSl7Ci0gICAgICAgICAgICAgICAgICAgIF9mbG9hdCByZXR1cm5WYWx1ZSA9IG5ldyAgX2Zsb2F0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9mbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Zsb2F0KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfZmxvYXQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9mbG9hdC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCxuYW1lc3BhY2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2Zsb2F0LkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfZmxvYXQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9mbG9hdCBvYmplY3QgPQotICAgICAgICAgICAgICAgIG5ldyBfZmxvYXQoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImZsb2F0Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2Zsb2F0KW9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkLkV4dGVuc2lvbk1hcHBlci5nZXRUeXBlT2JqZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIE5vdGUgYWxsIGF0dHJpYnV0ZXMgdGhhdCB3ZXJlIGhhbmRsZWQuIFVzZWQgdG8gZGlmZmVyIG5vcm1hbCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgLy8gZnJvbSBhbnlBdHRyaWJ1dGVzLgotICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IgaGFuZGxlZEF0dHJpYnV0ZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICB8fCByZWFkZXIuaGFzVGV4dCgpKXsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0X2Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9GbG9hdChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19pbnQuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTQyMzEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfaW50LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCAgQnVpbHQgb24gOiBEZWMgMjEsIDIwMDcgKDA0OjAzOjMwIExLVCkKLSAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZDsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogIF9pbnQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX2ludAotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGludAotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYQotICAgICAgICAgICAgICAgIE5hbWVzcGFjZSBQcmVmaXggPSBuczEKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZW5lcmF0ZVByZWZpeChqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgaWYobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKSl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJ4c2QiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAqIGZpZWxkIGZvciBfaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBpbnQgbG9jYWxfaW50IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gaW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBpbnQgZ2V0X2ludCgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbF9pbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0X2ludChpbnQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX2ludD1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2ludCArICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgLyoqCi0gICAgICogaXNSZWFkZXJNVE9NQXdhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBzdXBwb3J0cyBNVE9NCi0gICAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIHRyeXsKLSAgICAgICAgICBpc1JlYWRlck1UT01Bd2FyZSA9IGphdmEubGFuZy5Cb29sZWFuLlRSVUUuZXF1YWxzKHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKTsKLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNSZWFkZXJNVE9NQXdhcmU7Ci0gICB9Ci0gICAgIAotICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICoKLSAgICAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAgICAqIEByZXR1cm4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZ2V0T01FbGVtZW50ICgKLSAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIGRhdGFTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJEYXRhU291cmNlKHRoaXMscGFyZW50UU5hbWUpewotCi0gICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICBfaW50LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjppbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxfaW50PT1qYXZhLmxhbmcuSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiaW50IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9pbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBwcmVmaXgsamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0KLSAgICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLCBqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiAgbWV0aG9kIHRvIGhhbmRsZSBRbmFtZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMocHJlZml4ICsgIjoiICsgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGRhdGEgdW50aWwgbGFzdCBtb21lbnQgc2luY2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIGFueQotICAgICAgICAgICAgICAgIC8vIG5hbWVzcGFjZSBkYXRhIGFmdGVyIHdyaXRpbmcgdGhlIGNoYXJhY3RvciBkYXRhCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJpbmdUb1dyaXRlID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxbmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IHFuYW1lc1tpXS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4Lmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhzdHJpbmdUb1dyaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgICAgICAvKioKLSAgICAgICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2UgcHJlZml4Ci0gICAgICAgICAqLwotICAgICAgICAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHJlZ2lzdGVyUHJlZml4KGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICAgICAgICAgIH0KLQotCi0gIAotICAgICAgICAvKioKLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLQotCi0gICAgICAgIAotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBhdHRyaWJMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXIuRUxFTUVOVF9URVhUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxfaW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGwocU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgCi0KLSAgICAgLyoqCi0gICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZAotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7Ci0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX2ludCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfaW50IHJldHVyblZhbHVlID0gbmV3ICBfaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnNldF9pbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9JbnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9pbnQgZnJvbVN0cmluZyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IGNvbnRlbnQuc3Vic3RyaW5nKDAsY29udGVudC5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVcmkgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9pbnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9pbnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsIiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAKLQotICAgICAgICAvKioKLSAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgICogUHJlY29uZGl0aW9uOiAgSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIGN1cnJlbnQgb3IgbmV4dCBzdGFydCBlbGVtZW50IHN0YXJ0cyB0aGlzIG9iamVjdCBhbmQgYW55IGludGVydmVuaW5nIHJlYWRlciBldmVudHMgYXJlIGlnbm9yYWJsZQotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIG5vdCBhbiBlbGVtZW50LCBpdCBpcyBhIGNvbXBsZXggdHlwZSBhbmQgdGhlIHJlYWRlciBpcyBhdCB0aGUgZXZlbnQganVzdCBhZnRlciB0aGUgb3V0ZXIgc3RhcnQgZWxlbWVudAotICAgICAgICAqIFBvc3Rjb25kaXRpb246IElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCBpdHMgZW5kIGVsZW1lbnQKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBhIGNvbXBsZXggdHlwZSwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgZWxlbWVudCBvZiBpdHMgb3V0ZXIgZWxlbWVudAotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIF9pbnQgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIF9pbnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX2ludCgpOwotCi0gICAgICAgICAgICBpbnQgZXZlbnQ7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSIiOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2V1cmkgPSIiOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiKSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUhPW51bGwpewotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoMCxmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuc1ByZWZpeCA9IG5zUHJlZml4PT1udWxsPyIiOm5zUHJlZml4OwotCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiaW50Ii5lcXVhbHModHlwZSkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZpbmQgbmFtZXNwYWNlIGZvciB0aGUgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoX2ludClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9pbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludChjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gRW5kIG9mIGlmIGZvciBleHBlY3RlZCBwcm9wZXJ0eSBzdGFydCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RhcnQgZWxlbWVudCB3ZSBhcmUgbm90IGV4cGVjdGluZyBpbmRpY2F0ZXMgYW4gaW52YWxpZCBwYXJhbWV0ZXIgd2FzIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWJlbGVtZW50ICIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIGVuZCBvZiB3aGlsZSBsb29wCi0gICAgICAgICAgICAgICAgICAgICAgICAKLQotCi0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLSAgICAgICAgCi0KLSAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19sb25nLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19sb25nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWFkOTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9fbG9uZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBfbG9uZy5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfbG9uZyBiZWFuIGNsYXNzCi0gICAgICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgcHVibGljICBjbGFzcyBfbG9uZwotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsKLSAgICAgICAgLyogVGhpcyB0eXBlIHdhcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGllY2Ugb2Ygc2NoZW1hIHRoYXQgaGFkCi0gICAgICAgICAgICAgICAgbmFtZSA9IGxvbmcKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX2xvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGxvbmcgbG9jYWxfbG9uZyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIGxvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgIGxvbmcgZ2V0X2xvbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfbG9uZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHNldHRlciBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJhbSBfbG9uZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0X2xvbmcobG9uZyBwYXJhbSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxfbG9uZz1wYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2xvbmcgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX2xvbmcudGhpcy5zZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgIHBhcmVudFFOYW1lLGZhY3RvcnksZGF0YVNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uLCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotCi0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHBhcmVudFFOYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAobmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHdyaXRlclByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXJQcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVUeXBlKXsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICAgICAgICAgICAgIGlmICgobmFtZXNwYWNlUHJlZml4ICE9IG51bGwpICYmIChuYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCsiOmxvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUF0dHJpYnV0ZSgieHNpIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX2xvbmc9PWphdmEubGFuZy5Mb25nLk1JTl9WQUxVRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJsb25nIGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9sb25nKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICB9Ci0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGggdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgcHJlZml4LGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgaWYgKHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLGF0dE5hbWUsYXR0VmFsdWUpOwotCi0gICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBVdGlsIG1ldGhvZCB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgd2l0aG91dCB0aGUgbnMgcHJlZml4Ci0gICAgICAgICAgKi8KLSAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dFZhbHVlLGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dE5hbWUsYXR0VmFsdWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotCi0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSwgamF2YS5sYW5nLlN0cmluZyBhdHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlZml4ID0gcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogIG1ldGhvZCB0byBoYW5kbGUgUW5hbWVzCi0gICAgICAgICAqLwotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHByZWZpeCArICI6IiArIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBxbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChxbmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gc3RvcmUgdGhpcyBkYXRhIHVudGlsIGxhc3QgbW9tZW50IHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSBhbnkKLSAgICAgICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc3RyaW5nVG9Xcml0ZSA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcW5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCxuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKHByZWZpeCkuYXBwZW5kKCI6IikuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZ2lzdGVyIGEgbmFtZXNwYWNlIHByZWZpeAotICAgICAgICAgKi8KLSAgICAgICAgIHByaXZhdGUgamF2YS5sYW5nLlN0cmluZyByZWdpc3RlclByZWZpeChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHhtbFdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbC5nZXRVbmlxdWVQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgICAgICAgICB9Ci0KLQotICAKLSAgICAgICAgLyoqCi0gICAgICAgICogZGF0YWJpbmRpbmcgbWV0aG9kIHRvIGdldCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0KLQotICAgICAgICAKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsX2xvbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotCi0gICAgICAgIH0KLQotICAKLQotICAgICAvKioKLSAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kCi0gICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeXsKLQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfbG9uZyBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfbG9uZyByZXR1cm5WYWx1ZSA9IG5ldyAgX2xvbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUuc2V0X2xvbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Mb25nKHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfbG9uZyBmcm9tU3RyaW5nKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBjb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0gY29udGVudC5zdWJzdHJpbmcoMCxjb250ZW50LmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVyaSA9IHhtbFN0cmVhbVJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2xvbmcuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9sb25nLkZhY3RvcnkuZnJvbVN0cmluZyhjb250ZW50LCIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdAotICAgICAgICAqIFByZWNvbmRpdGlvbjogIElmIHRoaXMgb2JqZWN0IGlzIGFuIGVsZW1lbnQsIHRoZSBjdXJyZW50IG9yIG5leHQgc3RhcnQgZWxlbWVudCBzdGFydHMgdGhpcyBvYmplY3QgYW5kIGFueSBpbnRlcnZlbmluZyByZWFkZXIgZXZlbnRzIGFyZSBpZ25vcmFibGUKLSAgICAgICAgKiAgICAgICAgICAgICAgICBJZiB0aGlzIG9iamVjdCBpcyBub3QgYW4gZWxlbWVudCwgaXQgaXMgYSBjb21wbGV4IHR5cGUgYW5kIHRoZSByZWFkZXIgaXMgYXQgdGhlIGV2ZW50IGp1c3QgYWZ0ZXIgdGhlIG91dGVyIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgKiBQb3N0Y29uZGl0aW9uOiBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgaXRzIGVuZCBlbGVtZW50Ci0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgYSBjb21wbGV4IHR5cGUsIHRoZSByZWFkZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIGVsZW1lbnQgb2YgaXRzIG91dGVyIGVsZW1lbnQKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBfbG9uZyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotICAgICAgICAgICAgX2xvbmcgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX2xvbmcoKTsKLQotICAgICAgICAgICAgaW50IGV2ZW50OwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuaWxsYWJsZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcHJlZml4ID0iIjsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNldXJpID0iIjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCJ0eXBlIikhPW51bGwpewotICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBmdWxsVHlwZU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7Ci0gICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1ByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKDAsZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsKLQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGUgPSBmdWxsVHlwZU5hbWUuc3Vic3RyaW5nKGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikrMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghImxvbmciLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluZCBuYW1lc3BhY2UgZm9yIHRoZSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKG5zUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfbG9uZylvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9sb25nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Mb25nKGNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBFbmQgb2YgaWYgZm9yIGV4cGVjdGVkIHByb3BlcnR5IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGFydCBlbGVtZW50IHdlIGFyZSBub3QgZXhwZWN0aW5nIGluZGljYXRlcyBhbiBpbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgLy8gZW5kIG9mIHdoaWxlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotICAgICAgICAKLQotICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX3Nob3J0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMveHNkL19zaG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI0NTE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvX3Nob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIF9zaG9ydC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogU05BUFNIT1QgIEJ1aWx0IG9uIDogRGVjIDIxLCAyMDA3ICgwNDowMzozMCBMS1QpCi0gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy54c2Q7Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqICBfc2hvcnQgYmVhbiBjbGFzcwotICAgICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyAgY2xhc3MgX3Nob3J0Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuewotICAgICAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICAgICAgICAgICAgICBuYW1lID0gc2hvcnQKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgVVJJID0gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2UgUHJlZml4ID0gbnMxCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2VuZXJhdGVQcmVmaXgoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIGlmKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIikpewotICAgICAgICAgICAgICAgIHJldHVybiAieHNkIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsLmdldFVuaXF1ZVByZWZpeCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWVsZCBmb3IgX3Nob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzaG9ydCBsb2NhbF9zaG9ydCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHNob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICBzaG9ydCBnZXRfc2hvcnQoKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfc2hvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyYW0gX3Nob3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRfc2hvcnQoc2hvcnQgcGFyYW0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsX3Nob3J0PXBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyB0b1N0cmluZygpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxfc2hvcnQgKyAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIC8qKgotICAgICAqIGlzUmVhZGVyTVRPTUF3YXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgc3VwcG9ydHMgTVRPTQotICAgICAqLwotICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBib29sZWFuIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICB0cnl7Ci0gICAgICAgICAgaXNSZWFkZXJNVE9NQXdhcmUgPSBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFLmVxdWFscyhyZWFkZXIuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFKSk7Ci0gICAgICAgIH1jYXRjaChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotICAgICAgICAgIGlzUmVhZGVyTVRPTUF3YXJlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzUmVhZGVyTVRPTUF3YXJlOwotICAgfQotICAgICAKLSAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAqCi0gICAgICAgICogQHBhcmFtIHBhcmVudFFOYW1lCi0gICAgICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgICAgKiBAcmV0dXJuIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldE9NRWxlbWVudCAoCi0gICAgICAgICAgICAgICBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBkYXRhU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRGF0YVNvdXJjZSh0aGlzLHBhcmVudFFOYW1lKXsKLQotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgX3Nob3J0LnRoaXMuc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICBwYXJlbnRRTmFtZSxmYWN0b3J5LGRhdGFTb3VyY2UpOwotICAgICAgICAgICAgCi0gICAgICAgfQotCi0gICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24sIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLGZhY3RvcnkseG1sV3JpdGVyLGZhbHNlKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiwgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb257Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotCi0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJlbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKG5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB3cml0ZXJQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVyUHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIHBhcmVudFFOYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQocGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplVHlwZSl7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKG5hbWVzcGFjZVByZWZpeCAhPSBudWxsKSAmJiAobmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApKXsKLSAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoInhzaSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgrIjpzaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJ4c2kiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsInR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsX3Nob3J0PT1qYXZhLmxhbmcuU2hvcnQuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oInNob3J0IGNhbm5vdCBiZSBudWxsISEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9zaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRoIHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAqLwotICAgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCxqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSxqYXZhLmxhbmcuU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0VmFsdWUsamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmICh4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSxhdHROYW1lLGF0dFZhbHVlKTsKLQotICAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogVXRpbCBtZXRob2QgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHdpdGhvdXQgdGhlIG5zIHByZWZpeAotICAgICAgICAgICovCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlLGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRWYWx1ZSxqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbnsKLSAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscygiIikpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLGF0dFZhbHVlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsYXR0TmFtZSxhdHRWYWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFV0aWwgbWV0aG9kIHRvIHdyaXRlIGFuIGF0dHJpYnV0ZSB3aXRob3V0IHRoZSBucyBwcmVmaXgKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2UsIGphdmEubGFuZy5TdHJpbmcgYXR0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUsIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgYXR0cmlidXRlTmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVQcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVQcmVmaXggKyAiOiIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBtZXRob2QgdG8gaGFuZGxlIFFuYW1lcwotICAgICAgICAgKi8KLQotICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcW5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgICAgICBpZiAocW5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAgICAgLy8gbmFtZXNwYWNlIGRhdGEgYWZ0ZXIgd3JpdGluZyB0aGUgY2hhcmFjdG9yIGRhdGEKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gcW5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHJlZml4ID09IG51bGwpIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChwcmVmaXgpLmFwcGVuZCgiOiIpLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZ1RvV3JpdGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgICovCi0gICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcmVnaXN0ZXJQcmVmaXgoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBnZW5lcmF0ZVByZWZpeChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh4bWxXcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICAgICAgfQotCi0KLSAgCi0gICAgICAgIC8qKgotICAgICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFB1bGxQYXJzZXIoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uewotCi0KLSAgICAgICAgCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlci5FTEVNRU5UX1RFWFQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbF9zaG9ydCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0KLSAgICAgICAgfQotCi0gIAotCi0gICAgIC8qKgotICAgICAgKiAgRmFjdG9yeSBjbGFzcyB0aGF0IGtlZXBzIHRoZSBwYXJzZSBtZXRob2QKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5ewotCi0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9zaG9ydCBmcm9tU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBuYW1lc3BhY2VVUkkpewotICAgICAgICAgICAgICAgICAgICBfc2hvcnQgcmV0dXJuVmFsdWUgPSBuZXcgIF9zaG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5zZXRfc2hvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TaG9ydCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX3Nob3J0IGZyb21TdHJpbmcoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZigiOiIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBwcmVmaXggPSBjb250ZW50LnN1YnN0cmluZygwLGNvbnRlbnQuaW5kZXhPZigiOiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVXJpID0geG1sU3RyZWFtUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2hvcnQuRmFjdG9yeS5mcm9tU3RyaW5nKGNvbnRlbnQsbmFtZXNwYWNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zaG9ydC5GYWN0b3J5LmZyb21TdHJpbmcoY29udGVudCwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIAotCi0gICAgICAgIC8qKgotICAgICAgICAqIHN0YXRpYyBtZXRob2QgdG8gY3JlYXRlIHRoZSBvYmplY3QKLSAgICAgICAgKiBQcmVjb25kaXRpb246ICBJZiB0aGlzIG9iamVjdCBpcyBhbiBlbGVtZW50LCB0aGUgY3VycmVudCBvciBuZXh0IHN0YXJ0IGVsZW1lbnQgc3RhcnRzIHRoaXMgb2JqZWN0IGFuZCBhbnkgaW50ZXJ2ZW5pbmcgcmVhZGVyIGV2ZW50cyBhcmUgaWdub3JhYmxlCi0gICAgICAgICogICAgICAgICAgICAgICAgSWYgdGhpcyBvYmplY3QgaXMgbm90IGFuIGVsZW1lbnQsIGl0IGlzIGEgY29tcGxleCB0eXBlIGFuZCB0aGUgcmVhZGVyIGlzIGF0IHRoZSBldmVudCBqdXN0IGFmdGVyIHRoZSBvdXRlciBzdGFydCBlbGVtZW50Ci0gICAgICAgICogUG9zdGNvbmRpdGlvbjogSWYgdGhpcyBvYmplY3QgaXMgYW4gZWxlbWVudCwgdGhlIHJlYWRlciBpcyBwb3NpdGlvbmVkIGF0IGl0cyBlbmQgZWxlbWVudAotICAgICAgICAqICAgICAgICAgICAgICAgIElmIHRoaXMgb2JqZWN0IGlzIGEgY29tcGxleCB0eXBlLCB0aGUgcmVhZGVyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGVuZCBlbGVtZW50IG9mIGl0cyBvdXRlciBlbGVtZW50Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgX3Nob3J0IHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257Ci0gICAgICAgICAgICBfc2hvcnQgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICBuZXcgX3Nob3J0KCk7Ci0KLSAgICAgICAgICAgIGludCBldmVudDsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbmlsbGFibGVWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IiI7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5hbWVzcGFjZXVyaSA9IiI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZnVsbFR5cGVOYW1lID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIpOwotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNQcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSA+IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5zUHJlZml4ID0gbnNQcmVmaXg9PW51bGw/IiI6bnNQcmVmaXg7Ci0KLSAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZyhmdWxsVHlwZU5hbWUuaW5kZXhPZigiOiIpKzEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISJzaG9ydCIuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkobnNQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9zaG9ydClvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnhzZC5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc1VyaSx0eXBlLHJlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgCi0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIGFsbCBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBoYW5kbGVkLiBVc2VkIHRvIGRpZmZlciBub3JtYWwgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgIC8vIGZyb20gYW55QXR0cmlidXRlcy4KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yIGhhbmRsZWRBdHRyaWJ1dGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAgfHwgcmVhZGVyLmhhc1RleHQoKSl7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgIHx8IHJlYWRlci5oYXNUZXh0KCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldF9zaG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU2hvcnQoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8vIEVuZCBvZiBpZiBmb3IgZXhwZWN0ZWQgcHJvcGVydHkgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHN0YXJ0IGVsZW1lbnQgd2UgYXJlIG5vdCBleHBlY3RpbmcgaW5kaWNhdGVzIGFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc3ViZWxlbWVudCAiICsgcmVhZGVyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAvLyBlbmQgb2Ygd2hpbGUgbG9vcAotICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcwotCi0gICAgICAgIAotCi0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0JlYW5VdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQmVhblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiNGM4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQmVhblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLmZhY3RvcnkuT01YTUxCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVtYXBwaW5nLlNpbXBsZVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5CZWFuRXhjbHVkZUluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5UeXBlVGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuT2JqZWN0U3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotcHVibGljIGNsYXNzIEJlYW5VdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBuc0NvdW50ID0gMTsKLQotCi0gICAgLyoqCi0gICAgICogVG8gU2VyaWxpemUgQmVhbiBvYmplY3QgdGhpcyBtZXRob2QgaXMgdXNlZCwgdGhpcyB3aWxsIGNyZWF0ZSBhbiBvYmplY3QgYXJyYXkgdXNpbmcgZ2l2ZW4KLSAgICAgKiBiZWFuIG9iamVjdAotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihPYmplY3QgYmVhbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGJlYW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVRhYmxlIHR5cGVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzaW5nRG9jTGl0QmFyZSkgewotCi0gICAgICAgIENsYXNzIGJlYW5DbGFzcyA9IGJlYW5PYmplY3QuZ2V0Q2xhc3MoKTsKLSAgICAgICAgTGlzdCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0ID0gZ2V0UHJvcGVydHlRbmFtZUxpc3QoYmVhbk9iamVjdCwKLSAgICAgICAgICAgICAgICBiZWFuQ2xhc3MsIGJlYW5OYW1lLCB0eXBlVGFibGUsIHF1YWxpZmllZCwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotCi0gICAgICAgIEFycmF5TGlzdCBvYmplY3RBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmICgodHlwZVRhYmxlICE9IG51bGwpKXsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lZm9ydGhlVHlwZSA9IHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUoZ2V0Q2xhc3NOYW1lKGJlYW5DbGFzcykpOwotICAgICAgICAgICAgaWYgKHFOYW1lZm9ydGhlVHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBvYmplY3RBdHRyaWJ1dGVzLmFkZChuZXcgUU5hbWUoQ29uc3RhbnRzLlhTSV9OQU1FU1BBQ0UsICJ0eXBlIiwgInhzaSIpKTsKLSAgICAgICAgICAgICAgICBvYmplY3RBdHRyaWJ1dGVzLmFkZChxTmFtZWZvcnRoZVR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKGJlYW5OYW1lLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LnRvQXJyYXkoKSwgb2JqZWN0QXR0cmlidXRlcy50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgdHlwZVRhYmxlLCBxdWFsaWZpZWQpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lLmluZGV4T2YoIiQiKSA+IDApIHsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyQnLCAnXycpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZ2V0UHJvcGVydHlRbmFtZUxpc3QoT2JqZWN0IGJlYW5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBiZWFuQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBiZWFuTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUYWJsZSB0eXBlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHF1YWxpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc2luZ0RvY0xpdEJhcmUpIHsKLSAgICAgICAgTGlzdCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0OwotICAgICAgICBDbGFzcyBzdXBwZXJDbGFzcyA9IGJlYW5DbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0KLSAgICAgICAgaWYgKCFnZXRRdWFsaWZpZWROYW1lKHN1cHBlckNsYXNzLmdldFBhY2thZ2UoKSkuc3RhcnRzV2l0aCgiamF2YS4iKSkgewotICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCA9IGdldFByb3BlcnR5UW5hbWVMaXN0KGJlYW5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgIHN1cHBlckNsYXNzLCBiZWFuTmFtZSwgdHlwZVRhYmxlLCBxdWFsaWZpZWQsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgZWxlbW50TmFtZVNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgIGlmICh0eXBlVGFibGUgIT0gbnVsbCAmJiBxdWFsaWZpZWQpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZWZvcnRoZVR5cGUgPSB0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKGJlYW5DbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZWZvcnRoZVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBxTmFtZWZvcnRoZVR5cGUgPSB0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKGJlYW5DbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHFOYW1lZm9ydGhlVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIk1hcHBpbmcgcW5hbWUgbm90IGZvbmQgZm9yIHRoZSBwYWNrYWdlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuT2JqZWN0LmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZWxlbW50TmFtZVNwYWNlID0gbmV3IFFOYW1lKHFOYW1lZm9ydGhlVHlwZS5nZXROYW1lc3BhY2VVUkkoKSwgImVsZW1lbnROYW1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQmVhbkV4Y2x1ZGVJbmZvIGJlYW5FeGNsdWRlSW5mbyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCAmJiBheGlzU2VydmljZS5nZXRFeGNsdWRlSW5mbygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiZWFuRXhjbHVkZUluZm8gPSBheGlzU2VydmljZS5nZXRFeGNsdWRlSW5mbygpLmdldEJlYW5FeGNsdWRlSW5mb0ZvckNsYXNzKGJlYW5DbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmVhbkluZm8gYmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oYmVhbkNsYXNzLCBiZWFuQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnRpZXMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHk7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eTEgOiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eTE7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKCJjbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYmVhbkV4Y2x1ZGVJbmZvID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eShwcm9wZXJ0eS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBwdHlwZSA9IHByb3BlcnR5LmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKHB0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCByZWFkTWV0aG9kID0gcHJvcGVydHkuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZWFkTWV0aG9kLmludm9rZShiZWFuT2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gbm90IGZpbmQgcmVhZCBtZXRob2QgZm9yIDogIiArIHByb3BlcnR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKHB0eXBlLmdldENvbXBvbmVudFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eS5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZWFkTWV0aG9kLmludm9rZShiZWFuT2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gbm90IGZpbmQgcmVhZCBtZXRob2QgZm9yIDogIiArIHByb3BlcnR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiYnl0ZSIuZXF1YWxzKHB0eXBlLmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQoQmFzZTY0LmVuY29kZSgoYnl0ZVtdKXZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpMSA9IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpMTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gQXJyYXkuZ2V0KHZhbHVlLCBqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LCBiZWFuTmFtZSwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChvID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVUeXBlTWFwcGVyLmdldFN0cmluZ1ZhbHVlKG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LCBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuTmFtZSwgcHJvY2Vzc2luZ0RvY0xpdEJhcmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eS5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZVtdID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoT2JqZWN0W10pcHJvcGVydHkuZ2V0UmVhZE1ldGhvZCgpLmludm9rZShiZWFuT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVRbmFtZShlbGVtbnROYW1lU3BhY2UsIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QsIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNDb2xsZWN0aW9uKHB0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCByZWFkTWV0aG9kID0gcHJvcGVydHkuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSByZWFkTWV0aG9kLmludm9rZShiZWFuT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gb2JqTGlzdCA9IChDb2xsZWN0aW9uKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmpMaXN0ICE9IG51bGwgJiYgb2JqTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyB3YXMgZ2l2ZW4gZXJyb3IgLCB3aGVuIHRoZSBhcnJheS5zaXplID0gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaWYgdGhlIGFycmF5IGNvbnRhaW4gc2ltcGxlIHR5cGUgLCB0aGVuIHRoZSBBREJQdWxsUGFyc2VyIGFza2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFB1bGxQYXJzZXIgZnJvbSBUaGF0IHNpbXBlbCB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBvYmpMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUobykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUeXBlUW5hbWUoZWxlbW50TmFtZVNwYWNlLCBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQobyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVRbmFtZShlbGVtbnROYW1lU3BhY2UsIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QsIHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbk5hbWUsIHByb2Nlc3NpbmdEb2NMaXRCYXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVHlwZVFuYW1lKGVsZW1udE5hbWVTcGFjZSwgcHJvcGVydHlRbmFtZVZhbHVlTGlzdCwgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5OYW1lLCBwcm9jZXNzaW5nRG9jTGl0QmFyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHJlYWRNZXRob2QgPSBwcm9wZXJ0eS5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHJlYWRNZXRob2QuaW52b2tlKGJlYW5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMocHR5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgTG9uZykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5UW5hbWVWYWx1ZUxpc3Q7Ci0KLSAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVHlwZVFuYW1lKFFOYW1lIGVsZW1udE5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHByb3BlcnR5UW5hbWVWYWx1ZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGJlYW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc2luZ0RvY0xpdEJhcmUpIHsKLSAgICAgICAgaWYgKGVsZW1udE5hbWVTcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChuZXcgUU5hbWUoZWxlbW50TmFtZVNwYWNlLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICBwcm9wRGVzYy5nZXROYW1lKCksIGVsZW1udE5hbWVTcGFjZS5nZXRQcmVmaXgoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHByb2Nlc3NpbmdEb2NMaXRCYXJlKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlRbmFtZVZhbHVlTGlzdC5hZGQobmV3IFFOYW1lKHByb3BEZXNjLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVFuYW1lVmFsdWVMaXN0LmFkZChuZXcgUU5hbWUoYmVhbk5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHByb3BEZXNjLmdldE5hbWUoKSwgYmVhbk5hbWUuZ2V0UHJlZml4KCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdG8gZ2V0IHRoZSBwdWxsIHBhcnNlciBmb3IgYSBnaXZlbiBiZWFuIG9iamVjdCAsIGdlbmVyYXRlIHRoZSB3cnBwZXIgZWxlbWVudCB1c2luZyBjbGFzcwotICAgICAqIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuT2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihPYmplY3QgYmVhbk9iamVjdCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gYmVhbk9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCIuIikgPiAwKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0UHVsbFBhcnNlcihiZWFuT2JqZWN0LCBuZXcgUU5hbWUoY2xhc3NOYW1lKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBkZXNlcmlhbGl6ZShDbGFzcyBiZWFuQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJlYW5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFN1cHBsaWVyIG9iamVjdFN1cHBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheUxvY2FsTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPYmplY3QgYmVhbk9iaiA9bnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEFkZGVkIHRoaXMgYmxvY2sgYXMgYSBmaXggZm9yIGlzc3VlcyBBWElTMi0yMDU1IGFuZCBBWElTMi0xODk5Ci0gICAgICAgICAgICAvLyB0byBzdXBwb3J0IHBvbHltb3JwaGlzbSBpbiBQT0pPIGFwcHJvYWNoLgotICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIHR5cGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgJ3R5cGUnIGF0dHJpYnV0ZQotICAgICAgICAgICAgLy8gYW5kIHJldHJpZXZlIHRoZSBjbGFzcy4KLSAgICAgICAgICAgIFN0cmluZyBpbnN0YW5jZVR5cGVOYW1lID0gYmVhbkVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKCJ0eXBlIikpOwotICAgICAgICAgICAgaWYgKChpbnN0YW5jZVR5cGVOYW1lICE9IG51bGwpICYmICghIGJlYW5DbGFzcy5pc0FycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYmVhbkNsYXNzID0gTG9hZGVyLmxvYWRDbGFzcyhiZWFuQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgaW5zdGFuY2VUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciBuaWwgYXR0cmlidXRlOgotICAgICAgICAgICAgUU5hbWUgbmlsQXR0TmFtZSA9IG5ldyBRTmFtZShDb25zdGFudHMuWFNJX05BTUVTUEFDRSwgQ29uc3RhbnRzLk5JTCwgInhzaSIpOwotICAgICAgICAgICAgaWYgKGJlYW5FbGVtZW50LmdldEF0dHJpYnV0ZShuaWxBdHROYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChiZWFuQ2xhc3MuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBhcnJheUNsYXNzVHlwZSA9IGJlYW5DbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJieXRlIi5lcXVhbHMoYXJyYXlDbGFzc1R5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZShiZWFuRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcnRzID0gYmVhbkVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFydHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqVmFsdWUgPSBwYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqVmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSAoT01FbGVtZW50KW9ialZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXJyYXlMb2NhbE5hbWUgIT0gbnVsbCkgJiYgIWFycmF5TG9jYWxOYW1lLmVxdWFscyhvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbXVsdGkgZGltZW50aW9uYWwgYXJyYXkgc28gYWx3YXlzIGlubmVyIGVsZW1lbnQgaXMgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gZGVzZXJpYWxpemUoYXJyYXlDbGFzc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RTdXBwbGllciwgImFycmF5Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCXZhbHVlTGlzdC5hZGQob2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9BcnJheShhcnJheUNsYXNzVHlwZSwgdmFsdWVMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzU2ltcGxlVHlwZShiZWFuQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTaW1wbGVUeXBlTWFwcGVyLmdldFNpbXBsZVR5cGVPYmplY3QoYmVhbkNsYXNzLCBiZWFuRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiamF2YS5sYW5nLk9iamVjdCIuZXF1YWxzKGJlYW5DbGFzcy5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJlYW5FbGVtZW50LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIYXNoTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGJlYW5DbGFzcyk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIFtdIHByb3BEZXNjcyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wcnR5IDogcHJvcERlc2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KHByb3BydHkuZ2V0TmFtZSgpLCBwcm9wcnR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZWxlbWVudHMgPSBiZWFuRWxlbWVudC5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgICAgIGJlYW5PYmogPSBvYmplY3RTdXBwbGllci5nZXRPYmplY3QoYmVhbkNsYXNzKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiZWFuQ2xhc3MgY291bGQgYmUgYW4gYWJzdHJhY3Qgb25lLgotICAgICAgICAgICAgICAgICAgICAvLyBzbyBjcmVhdGUgYW4gaW5zdGFuY2Ugb25seSBpZiB0aGVyZSBhcmUgZWxlbWVudHMsIGluCi0gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhc2UgYSBjb25jcmV0ZSBzdWJjbGFzcyBpcyBhdmFpbGFibGUgdG8gaW5zdGFudGlhdGUuCi0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9ialZhbHVlID0gZWxlbWVudHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqVmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gKE9NRWxlbWVudClvYmpWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHBhcnRzLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgIm5pbCIsICJ4c2kiKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFydHMvQGhyZWYgIT0gbnVsbCB0aGVuIG5lZWQgdG8gZmluZCBlbGVtZW50IHdpdGggaWQgYW5kIGRlc2VyaWFsaXplLgotICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhhdCBmaXJzdCBjaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiB0aGUgaGFzaHRhYmxlCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0c0xvY2FsTmFtZSA9IHBhcnRzLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJ0eSA9IChQcm9wZXJ0eURlc2NyaXB0b3IpcHJvcGVydGllcy5yZW1vdmUocGFydHNMb2NhbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbWV0ZXJzID0gcHJ0eS5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcnR5LmdldE5hbWUoKS5lcXVhbHMoImNsYXNzIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJ0T2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzU2ltcGxlVHlwZShwYXJhbWV0ZXJzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0T2JqID0gU2ltcGxlVHlwZU1hcHBlci5nZXRTaW1wbGVUeXBlT2JqZWN0KHBhcmFtZXRlcnMsIHBhcnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgIGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNIYXNoU2V0KHBhcmFtZXRlcnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRPYmogPSBTaW1wbGVUeXBlTWFwcGVyLmdldEhhc2hTZXQoKE9NRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5nZXRQYXJlbnQoKSwgcHJ0eS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0NvbGxlY3Rpb24ocGFyYW1ldGVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IFNpbXBsZVR5cGVNYXBwZXIuZ2V0QXJyYXlMaXN0KChPTUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuZ2V0UGFyZW50KCksIHBydHkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNEYXRhSGFuZGxlcihwYXJhbWV0ZXJzKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRPYmogPSBTaW1wbGVUeXBlTWFwcGVyLmdldERhdGFIYW5kbGVyKHBhcnRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRPYmogPSBkZXNlcmlhbGl6ZShwYXJhbWV0ZXJzLCAoT01FbGVtZW50KXBhcnRzLmdldFBhcmVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFN1cHBsaWVyLCBwcnR5LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IGRlc2VyaWFsaXplKHBhcmFtZXRlcnMsIHBhcnRzLCBvYmplY3RTdXBwbGllciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHsgcGFydE9iaiB9OwotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHdyaXRlTWV0aG9kID0gcHJ0eS5nZXRXcml0ZU1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTWV0aG9kLmludm9rZShiZWFuT2JqLCBwYXJtcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJlYW5PYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludHJvc3BlY3Rpb25FeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZGVzZXJpYWxpemUoQ2xhc3MgYmVhbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBiZWFuRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXJlZkhlbHBlciBoZWxwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0U3VwcGxpZXIgb2JqZWN0U3VwcGxpZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPYmplY3QgYmVhbk9iajsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhhc2hNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBCZWFuSW5mbyBiZWFuSW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhiZWFuQ2xhc3MpOwotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIFtdIHByb3BEZXNjcyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yIHByb3BydHkgPSBwcm9wRGVzY3NbaV07Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcHJ0eS5nZXROYW1lKCksIHByb3BydHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBiZWFuT2JqID0gb2JqZWN0U3VwcGxpZXIuZ2V0T2JqZWN0KGJlYW5DbGFzcyk7Ci0gICAgICAgICAgICBJdGVyYXRvciBlbGVtZW50cyA9IGJlYW5FbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGNoaWxkID0gZWxlbWVudHMubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwYXJ0czsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFydHMgPSAoT01FbGVtZW50KWNoaWxkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydHNMb2NhbE5hbWUgPSBwYXJ0cy5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJ0eSA9IChQcm9wZXJ0eURlc2NyaXB0b3IpcHJvcGVydGllcy5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0xvY2FsTmFtZS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAocHJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtZXRlcnMgPSBwcnR5LmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJ0eS5nZXROYW1lKCkuZXF1YWxzKCJjbGFzcyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJ0T2JqOwotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyID0gTXVsdGlyZWZIZWxwZXIucHJvY2Vzc1JlZkF0dChwYXJ0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWZJZCA9IE11bHRpcmVmSGVscGVyLmdldEF0dHZhbHVlKGF0dHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IGhlbHBlci5nZXRPYmplY3QocmVmSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRPYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRPYmogPSBoZWxwZXIucHJvY2Vzc1JlZihwYXJhbWV0ZXJzLCByZWZJZCwgb2JqZWN0U3VwcGxpZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IFNpbXBsZVR5cGVNYXBwZXIuZ2V0U2ltcGxlVHlwZU9iamVjdChwYXJhbWV0ZXJzLCBwYXJ0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydE9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE9iaiA9IGRlc2VyaWFsaXplKHBhcmFtZXRlcnMsIHBhcnRzLCBvYmplY3RTdXBwbGllciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIHBhcm1zID0gbmV3IE9iamVjdFtdIHsgcGFydE9iaiB9OwotICAgICAgICAgICAgICAgICAgICBNZXRob2Qgd3JpdGVNZXRob2QgPSBwcnR5LmdldFdyaXRlTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVNZXRob2QuaW52b2tlKGJlYW5PYmosIHBhcm1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludHJvc3BlY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbk9iajsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCBKYXZhT2JqZWN0cyBmcm9tIFhNTCBlbGVtbnQgLCB0aGUgZWxlbWVudCBtb3N0IG9mIHRoZSB0aW1lIGNvbnRhaW5zIG9ubHkgb25lIGVsZW1lbnQKLSAgICAgKiBpbiB0aGF0IGNhc2UgdGhhdCBlbGVtZW50IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBKYXZhVHlwZSBzcGVjaWZpZWQgYnkgdGhlIGphdmFUeXBlcyBhcnJheQotICAgICAqIFRoZSBhbGdvIGlzIGFzIGZvbGxvd3MsIGdldCB0aGUgY2hpbGRlcm5zIG9mIHRoZSByZXNwb25zZSBlbGVtZW50ICwgYW5kIGlmIGl0IGNvbmF0aWFuIG1vcmUKLSAgICAgKiB0aGFuIG9uZSBlbGVtZW50IHRoZW4gY2hlY2sgdGhlIHJldHVlbiB0eXBlIG9mIHRoYXQgZWxlbWVudCBhbmQgY29udmVyIHRoYXQgdG8gY29ycmVzcG9uZGluZwotICAgICAqIEphdmFUeXBlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgIE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBqYXZhVHlwZXMgQXJyYXkgb2YgSmF2YVR5cGVzCi0gICAgICogQHJldHVybiBBcnJheSBvZiBvYmplY3RzCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBbXSBkZXNlcmlhbGl6ZShPTUVsZW1lbnQgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IFtdIGphdmFUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRha2UgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoZSBtZXRob2QgYW5kICwgb25seSB0YWtlIHRoYXQgbXVjaCBvZiBjaGlsZCBlbGVtZW50cwotICAgICAgICAgKiBmcm9tIHRoZSBPTUVsZW1lbnQgLCBvdGhlciBhcmUgaWdub3JlICwgYXMgYW4gZXhhbXBsZQotICAgICAgICAgKiBpZiB0aGUgbWV0aG9kIGlzICwgZm9vKFN0cmluZyBhICwgaW50IGIpCi0gICAgICAgICAqIGFuZCBpZiB0aGUgT01FbGVtZXQKLSAgICAgICAgICogPGZvbz4KLSAgICAgICAgICogIDxhcmcwPlZhbDE8L2FyZzA+Ci0gICAgICAgICAqICA8YXJnMT5WYWwyPC9hcmcxPgotICAgICAgICAgKiAgPGFyZzI+VmFsMzwvYXJnMj4KLSAgICAgICAgICoKLSAgICAgICAgICogb25seSB0aGUgdmFsMSBhbmQgVmFsMiB0YWtlIGludG8gYWNjb3VudAotICAgICAgICAgKi8KLSAgICAgICAgaW50IGxlbmd0aCA9IGphdmFUeXBlcy5sZW5ndGg7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIE9iamVjdCBbXSByZXRPYmpzID0gbmV3IE9iamVjdFtsZW5ndGhdOwotCi0gICAgICAgIC8qCi0gICAgICAgICogSWYgdGhlIGJvZHkgZmlyc3QgY2hpbGQgY29udGFpbnMgLCB0aGVuIHRoZXJlIGNhbiBub3QgYmUgYW55IG90aGVyIGVsZW1lbnQgd2l0aG90Ci0gICAgICAgICogcmVmcyAsIHNvIEkgY2FuIGFzc3VtZSBpZiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGJvZHkgZmlyc3QgZWxlbWVudCBoYXMgcmVmIHRoZW4KLSAgICAgICAgKiB0aGUgbWVzc2FnZSBoYXMgdG8gaGFuZGxlIGFzIG11dGlyZWYgbWVzc2FnZS4KLSAgICAgICAgKiBhcyBhbiBleG1wbGUgaWYgdGhlIGJvZHkgaXMgbGlrZSBiZWxvdwotICAgICAgICAqIDxmb28+Ci0gICAgICAgICogIDxhcmcwIGhyZWY9IiMwIi8+Ci0gICAgICAgICogPC9mb28+Ci0gICAgICAgICoKLSAgICAgICAgKiB0aGVuIHRoZXJlIGNhbiBub3QgYmUgYW55IGVsZW1lbnQgd2l0aG91dCByZWZzICwgbWVhbmluZyBmb2xsb3dpbmcgd2UgYXJlIG5vdCBoYW5kbGluZwotICAgICAgICAqIDxmb28+Ci0gICAgICAgICogIDxhcmcwIGhyZWY9IiMwIi8+Ci0gICAgICAgICogIDxhcmcxPmFic2JzYnM8L2FyZzE+Ci0gICAgICAgICogPC9mb28+Ci0gICAgICAgICovCi0gICAgICAgIEl0ZXJhdG9yIHBhcnRzID0gcmVzcG9uc2UuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgLy90byBoYW5kbGUgbXVsdGlyZWZzCi0gICAgICAgIC8vaGF2ZSB0byBjaGVjayB0aGUgaW5zdGFuY2VvZgotICAgICAgICBNdWx0aXJlZkhlbHBlciBoZWxwZXIgPSBuZXcgTXVsdGlyZWZIZWxwZXIoKE9NRWxlbWVudClyZXNwb25zZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIC8vdG8gc3VwcG9ydCBhcnJheSAuIGlmIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBhcnJheSAsIHRoZW4gYWxsIHRoZSBvbWVsZW1udHMgd2l0aCB0aGF0IHBhcmFtdHJlIG5hbWUKLSAgICAgICAgLy8gaGFzIHRvICBnZXQgYW5kIGFkZCB0byB0aGUgbGlzdAotICAgICAgICBDbGFzcyBjbGFzc1R5cGU7Ci0gICAgICAgIFN0cmluZyBjdXJyZW50TG9jYWxOYW1lOwotICAgICAgICB3aGlsZSAocGFydHMuaGFzTmV4dCgpICYmIGNvdW50IDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqVmFsdWUgPSBwYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50OwotICAgICAgICAgICAgaWYgKG9ialZhbHVlIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gKE9NRWxlbWVudClvYmpWYWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50TG9jYWxOYW1lID0gb21FbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgY2xhc3NUeXBlID0gKENsYXNzKWphdmFUeXBlc1tjb3VudF07Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSBQcm9jZXNzRWxlbWVudChjbGFzc1R5cGUsIG9tRWxlbWVudCwgaGVscGVyLCBwYXJ0cywKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudExvY2FsTmFtZSwgcmV0T2JqcywgY291bnQsIG9iamVjdFN1cHBsaWVyKTsKLSAgICAgICAgICAgIHdoaWxlIChvbUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IFByb2Nlc3NFbGVtZW50KChDbGFzcylqYXZhVHlwZXNbY291bnRdLCBvbUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIsIHBhcnRzLCBvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIHJldE9ianMsIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3VwcGxpZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIGF0IGxlYXN0IGEgemVybyBlbGVtZW50IGFycmF5Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gKENsYXNzKWphdmFUeXBlc1tpXTsKLSAgICAgICAgICAgIGlmIChyZXRPYmpzW2ldID09IG51bGwgJiYgY2xhenouaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0T2Jqc1tpXSA9IEFycmF5Lm5ld0luc3RhbmNlKGNsYXp6LmdldENvbXBvbmVudFR5cGUoKSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBoZWxwZXIuY2xlYW4oKTsKLSAgICAgICAgcmV0dXJuIHJldE9ianM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT01FbGVtZW50IFByb2Nlc3NFbGVtZW50KENsYXNzIGNsYXNzVHlwZSwgT01FbGVtZW50IG9tRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlyZWZIZWxwZXIgaGVscGVyLCBJdGVyYXRvciBwYXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRMb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJldE9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0U3VwcGxpZXIgb2JqZWN0U3VwcGxpZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPYmplY3Qgb2JqVmFsdWU7Ci0gICAgICAgIGlmIChjbGFzc1R5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBib29sZWFuIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgQXJyYXlMaXN0IHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIENsYXNzIGFycmF5Q2xhc3NUeXBlID0gY2xhc3NUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmICgiYnl0ZSIuZXF1YWxzKGFycmF5Q2xhc3NUeXBlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXRPYmpzW2NvdW50XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT2JqZWN0KG9tRWxlbWVudCwgYXJyYXlDbGFzc1R5cGUsIGhlbHBlciwgdHJ1ZSwgb2JqZWN0U3VwcGxpZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKHByb2Nlc3NPYmplY3Qob21FbGVtZW50LCBhcnJheUNsYXNzVHlwZSwgaGVscGVyLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0U3VwcGxpZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBvYmpWYWx1ZSA9IHBhcnRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2JqVmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50ID0gKE9NRWxlbWVudClvYmpWYWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50TG9jYWxOYW1lLmVxdWFscyhvbUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gcHJvY2Vzc09iamVjdChvbUVsZW1lbnQsIGFycmF5Q2xhc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyLCB0cnVlLCBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgICAgICAgICAgdmFsdWVMaXN0LmFkZChvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHZhbHVlTGlzdC5nZXQoMCk9PW51bGwpewotICAgICAgICAgICAgICAgIHJldE9ianNbY291bnRdID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0T2Jqc1tjb3VudF0gPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KGFycmF5Q2xhc3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZG9uZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL2hhbmRsaW5nIHJlZnMKLSAgICAgICAgICAgIHJldE9ianNbY291bnRdID0gcHJvY2Vzc09iamVjdChvbUVsZW1lbnQsIGNsYXNzVHlwZSwgaGVscGVyLCBmYWxzZSwgb2JqZWN0U3VwcGxpZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHByb2Nlc3NPYmplY3QoT01FbGVtZW50IG9tRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXNzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcmVmSGVscGVyIGhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNBcnJheVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGJvb2xlYW4gaGFzUmVmID0gZmFsc2U7Ci0gICAgICAgIE9NQXR0cmlidXRlIG9tYXRyaWJ1dGUgPSBNdWx0aXJlZkhlbHBlci5wcm9jZXNzUmVmQXR0KG9tRWxlbWVudCk7Ci0gICAgICAgIFN0cmluZyByZWYgPSBudWxsOwotICAgICAgICBpZiAob21hdHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoYXNSZWYgPSB0cnVlOwotICAgICAgICAgICAgcmVmID0gTXVsdGlyZWZIZWxwZXIuZ2V0QXR0dmFsdWUob21hdHJpYnV0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE9NRWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChoYXNSZWYpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbW50ID0gaGVscGVyLmdldE9NRWxlbWVudChyZWYpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnByb2Nlc3NPTUVsZW1lbnRSZWYocmVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaGFzUmVmKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXRPYmplY3QocmVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuZ2V0T2JqZWN0KHJlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5wcm9jZXNzUmVmKGNsYXNzVHlwZSwgcmVmLCBvYmplY3RTdXBwbGllcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJuaWwiLCAieHNpIikpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXlUeXBlICYmICJieXRlIi5lcXVhbHMoY2xhc3NUeXBlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG9tRWxlbWVudC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2ltcGxlVHlwZU1hcHBlci5nZXRTaW1wbGVUeXBlT2JqZWN0KGNsYXNzVHlwZSwgb21FbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0NvbGxlY3Rpb24oY2xhc3NUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2ltcGxlVHlwZU1hcHBlci5nZXRBcnJheUxpc3Qob21FbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNEYXRhSGFuZGxlcihjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBTaW1wbGVUeXBlTWFwcGVyLmdldERhdGFIYW5kbGVyKG9tRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJlYW5VdGlsLmRlc2VyaWFsaXplKGNsYXNzVHlwZSwgb21FbGVtZW50LCBvYmplY3RTdXBwbGllciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLQotCi0KLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdldE9NRWxlbWVudChRTmFtZSBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBbXSBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVRhYmxlIHR5cGVUYWJsZSkgewotICAgICAgICBBcnJheUxpc3Qgb2JqZWN0czsKLSAgICAgICAgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGFyZ0NvdW50ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXJnID0gYXJnc1tpXTsKLSAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKCJpdGVtIiArIGFyZ0NvdW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKGFyZyk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBjbGllbnQgc2lkZSB0aGUgcGFydG5hbWUgaXMgYWx3YXlzIG51bGwuIEF0IGNsaWVudCBzaWRlIHRoaXMgbWVhbnMgdXNlciB0cnkgdG8KLSAgICAgICAgICAgICAgICAvLyBpbnZva2UgYSBzZXJ2aWNlIHdpdGggYW4gYXJyYXkgYXJndW1lbnQuCi0gICAgICAgICAgICAgICAgaWYgKHBhcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFycmF5IFtdID0gKE9iamVjdFtdKSBhcmc7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXJyYXkubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gYXJyYXlbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoIml0ZW0iICsgYXJnQ291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc1NpbXBsZVR5cGUobykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoIml0ZW0iICsgYXJnQ291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChTaW1wbGVUeXBlTWFwcGVyLmdldFN0cmluZ1ZhbHVlKG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChuZXcgUU5hbWUoIml0ZW0iICsgYXJnQ291bnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCB3cmFwcGluZ0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIml0ZW0iICsgYXJnQ291bnQsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nRWxlbWVudC5hZGRDaGlsZCgoT01FbGVtZW50KSBvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChwYXJ0TmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50LmFkZENoaWxkKChPTUVsZW1lbnQpIG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQod3JhcHBpbmdFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGF0IHRoZSBzZXJ2ZXIgc2lkZS4gdGhpcyBtZWFucyBpdCBpcyBhbiBtdWx0aWRpbWVudGlvbmFsIGFycmF5LgotICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKGFyZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzU2ltcGxlVHlwZShhcmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZCgiYXJnIiArIGFyZ0NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKHBhcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChTaW1wbGVUeXBlTWFwcGVyLmdldFN0cmluZ1ZhbHVlKGFyZykpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChuZXcgUU5hbWUoImFyZyIgKyBhcmdDb3VudCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQocGFydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCB3cmFwcGluZ0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZyIgKyBhcmdDb3VudCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50LmFkZENoaWxkKChPTUVsZW1lbnQpYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChwYXJ0TmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdFbGVtZW50LmFkZENoaWxkKChPTUVsZW1lbnQpYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKHdyYXBwaW5nRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChCYXNlNjQuZW5jb2RlKChieXRlW10pYXJnKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihTaW1wbGVUeXBlTWFwcGVyLmlzRGF0YUhhbmRsZXIoYXJnLmdldENsYXNzKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXNFbGVtdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCB3cmFwcGluZ0VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZyIgKyBhcmdDb3VudCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQocGFydE5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT01UZXh0IHRleHQgPSBmYWMuY3JlYXRlT01UZXh0KGFyZywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0VsZW1lbnQuYWRkQ2hpbGQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZCh3cmFwcGluZ0VsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5hZGQoYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ0NvdW50ICsrOwotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhyID0KLSAgICAgICAgICAgICAgICBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChvcE5hbWUsIG9iamVjdHMudG9BcnJheSgpLCBudWxsLCB0eXBlVGFibGUsIHF1YWxpZmVkKTsKLQotICAgICAgICBTdHJlYW1XcmFwcGVyIHBhcnNlciA9IG5ldyBTdHJlYW1XcmFwcGVyKHhyKTsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdEFYT01CdWlsZGVyID0KLSAgICAgICAgICAgICAgICBPTVhNTEJ1aWxkZXJGYWN0b3J5LmNyZWF0ZVN0QVhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksIHBhcnNlcik7Ci0gICAgICAgIHJldHVybiBzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIGdldFVuaXF1ZVByZWZpeCAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFN0cmluZyAgZ2V0VW5pcXVlUHJpZml4KCkgewotICAgICAgICByZXR1cm4gZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5jcmVtZW50cyB0aGUgbmFtZXNwYWNlIGNvdW50ZXIgYW5kIHJldHVybnMgYSBuZXcgcHJlZml4Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHVuaXF1ZSBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0VW5pcXVlUHJlZml4KCkgewotICAgICAgICBpZiAobnNDb3VudCA+IDEwMDApewotICAgICAgICAgICAgbnNDb3VudCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJzIiArIG5zQ291bnQrKzsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKFBhY2thZ2UgcGFja2FnZXopIHsKLSAgICAgICAgaWYgKHBhY2thZ2V6ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYWNrYWdlei5nZXROYW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyZmQwZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLk9NQXR0cmliS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLk9NRWxlbWVudEtleTsKLQotcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgewotCi0gICAgc3RhdGljIFN0cmluZyBOSUwgPSAibmlsIjsKLSAgICBzdGF0aWMgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7Ci0gICAgc3RhdGljIFN0cmluZyBYU0lfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgICBzdGF0aWMgU3RyaW5nIFhTRF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0gICAgc3RhdGljIE9iamVjdCBPTV9BVFRSSUJVVEVfS0VZID0gbmV3IE9NQXR0cmliS2V5KCk7Ci0gICAgc3RhdGljIE9iamVjdCBPTV9FTEVNRU5UX0tFWSA9IG5ldyBPTUVsZW1lbnRLZXkoKTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfQklOQVJZID0gT01Db25zdGFudHMuSVNfQklOQVJZOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9IQU5ETEVSID0gT01Db25zdGFudHMuREFUQV9IQU5ETEVSOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU1JWkFUSU9OX0VOQUJMRUQgPSBPTUNvbnN0YW50cy5JU19EQVRBX0hBTkRMRVJTX0FXQVJFOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnZlcnRlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAzYjhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKiogQ29udmVydGVyICovCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0KE9iamVjdCBhcmcsIENsYXNzIGRlc3RDbGFzcykgewotICAgICAgICBpZiAoZGVzdENsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyBhcmdIZWxkVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChhcmcgIT0gbnVsbCkgewotICAgICAgICAgICAgYXJnSGVsZFR5cGUgPSBnZXRIb2xkZXJWYWx1ZVR5cGUoYXJnLmdldENsYXNzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZyAhPSBudWxsICYmIGFyZ0hlbGRUeXBlID09IG51bGwgJiYgZGVzdENsYXNzLmlzQXNzaWduYWJsZUZyb20oYXJnLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VlIGlmIGEgcHJldmlvdXNseSBjb252ZXJ0ZWQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBhcmd1bWVudC4KLSAgICAgICAgT2JqZWN0IGRlc3RWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBkZXN0aW5hdGlvbiBoZWxkIHR5cGUgb3IgdGhlIGFyZ3VtZW50IGhlbGQgdHlwZSBpZiB0aGV5IGV4aXN0Ci0gICAgICAgIENsYXNzIGRlc3RIZWxkVHlwZSA9IGdldEhvbGRlclZhbHVlVHlwZShkZXN0Q2xhc3MpOwotCi0gICAgICAgIC8vIENvbnZlcnQgYmV0d2VlbiBDYWxlbmRhciBhbmQgRGF0ZQotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgQ2FsZW5kYXIgJiYgZGVzdENsYXNzID09IERhdGUuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKENhbGVuZGFyKWFyZykuZ2V0VGltZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBEYXRlICYmIGRlc3RDbGFzcyA9PSBDYWxlbmRhci5jbGFzcykgewotICAgICAgICAgICAgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgY2FsZW5kYXIuc2V0VGltZSgoRGF0ZSlhcmcpOwotICAgICAgICAgICAgcmV0dXJuIGNhbGVuZGFyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29udmVydCBiZXR3ZWVuIENhbGVuZGFyIGFuZCBqYXZhLnNxbC5EYXRlCi0gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBDYWxlbmRhciAmJiBkZXN0Q2xhc3MgPT0gamF2YS5zcWwuRGF0ZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBqYXZhLnNxbC5EYXRlKCgoQ2FsZW5kYXIpYXJnKS5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnZlcnQgYmV0d2VlbiBIYXNoTWFwIGFuZCBIYXNodGFibGUKLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIEhhc2hNYXAgJiYgZGVzdENsYXNzID09IEhhc2h0YWJsZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNodGFibGUoKEhhc2hNYXApYXJnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhbiBhcnJheSBhbmQgdGhlIHNvdXJjZQotICAgICAgICAvLyBpcyBhIHN1aXRhYmxlIGNvbXBvbmVudCwgcmV0dXJuIGFuIGFycmF5IHdpdGgKLSAgICAgICAgLy8gdGhlIHNpbmdsZSBpdGVtLgotICAgICAgICBpZiAoYXJnICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBkZXN0Q2xhc3MuaXNBcnJheSgpICYmCi0gICAgICAgICAgICAgICAgIWRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkuZXF1YWxzKE9iamVjdC5jbGFzcykgJiYKLSAgICAgICAgICAgICAgICBkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzQXNzaWduYWJsZUZyb20oYXJnLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXJyYXkgPQotICAgICAgICAgICAgICAgICAgICBBcnJheS5uZXdJbnN0YW5jZShkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLCAxKTsKLSAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgMCwgYXJnKTsKLSAgICAgICAgICAgIHJldHVybiBhcnJheTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldHVybiBpZiBubyBjb252ZXJzaW9uIGlzIGF2YWlsYWJsZQotICAgICAgICBpZiAoIShhcmcgaW5zdGFuY2VvZiBDb2xsZWN0aW9uIHx8Ci0gICAgICAgICAgICAgICAgKGFyZyAhPSBudWxsICYmIGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkpICYmCi0gICAgICAgICAgICAgICAgKChkZXN0SGVsZFR5cGUgPT0gbnVsbCAmJiBhcmdIZWxkVHlwZSA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGRlc3RIZWxkVHlwZSAhPSBudWxsICYmIGFyZ0hlbGRUeXBlICE9IG51bGwpKSkgewotICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZsb3cgdG8gaGVyZSBpbmRpY2F0ZXMgdGhhdCBuZWl0aGVyIGFyZyBvciBkZXN0Q2xhc3MgaXMgYSBIb2xkZXIKLQotICAgICAgICBpZiAoYXJnID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgYXJnIG1heSBiZSBhbiBhcnJheSBvciBMaXN0Ci0gICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICBpZiAoYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgoYXJnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlbmd0aCA9ICgoQ29sbGVjdGlvbilhcmcpLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVzdENsYXNzLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgaWYgKGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCi0gICAgICAgICAgICAgICAgT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoZGVzdENsYXNzLmdldENvbXBvbmVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBhcnJheSBlbGVtZW50cwotICAgICAgICAgICAgICAgIGlmIChhcmcuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCBpLCBBcnJheS5nZXQoYXJnLCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChDb2xsZWN0aW9uKWFyZykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgaWR4KyssIGkubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0VmFsdWUgPSBhcnJheTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgW10gYXJyYXk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXkgPSAoT2JqZWN0IFtdKUFycmF5Lm5ld0luc3RhbmNlKGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVXNlIGNvbnZlcnQgdG8gYXNzaWduIGFycmF5IGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIGlmIChhcmcuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBjb252ZXJ0KEFycmF5LmdldChhcmcsIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoQ29sbGVjdGlvbilhcmcpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVtpZHgrK10gPSBjb252ZXJ0KGkubmV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZXN0VmFsdWUgPSBhcnJheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZGVzdENsYXNzKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbiBuZXdMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgd2UgYXJlIHRyeWluZyB0byBjcmVhdGUgYW4gaW50ZXJmYWNlLCBidWlsZCBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZQotICAgICAgICAgICAgICAgIGlmIChkZXN0Q2xhc3MgPT0gQ29sbGVjdGlvbi5jbGFzcyB8fCBkZXN0Q2xhc3MgPT0gamF2YS51dGlsLkxpc3QuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RDbGFzcyA9PSBTZXQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TGlzdCA9IChDb2xsZWN0aW9uKWRlc3RDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgYnVpbGQgb25lIGZvciBzb21lIHJlYXNvbi4uLiBzbyBmb3JnZXQgaXQuCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQoQXJyYXkuZ2V0KGFyZywgaikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gKChDb2xsZWN0aW9uKWFyZykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgIGouaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZChqLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdFZhbHVlID0gbmV3TGlzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RWYWx1ZSA9IGFyZzsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZXN0VmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0SG9sZGVyVmFsdWVUeXBlKENsYXNzIGFDbGFzcykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29udmVydGVyVXRpbC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL0NvbnZlcnRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3N2YwZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29udmVydGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU3RBWFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuRWxlbWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLmkxOG4uQURCTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EYXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5EdXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkVudGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSGV4QmluYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuSURSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JRFJlZnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5JZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkxhbmd1YWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTW9udGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aERheTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5DTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5NVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OTVRva2VuczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25OZWdhdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob25Qb3NpdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Ob3JtYWxpemVkU3RyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuTm90YXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Qb3NpdGl2ZUludGVnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5UaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VUkk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEJ5dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5VbnNpZ25lZEludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkTG9uZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLlVuc2lnbmVkU2hvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuWWVhck1vbnRoOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLS8qKgotICogQ29udmVydGVyIG1ldGhvZHMgdG8gZ28gZnJvbSAxLiBzaW1wbGUgdHlwZSAtPiBTdHJpbmcgMi4gc2ltcGxlIHR5cGUgLT4gT2JqZWN0IDMuIFN0cmluZyAtPgotICogc2ltcGxldHlwZSA0LiBPYmplY3QgbGlzdCAtPiBhcnJheQotICovCi1wdWJsaWMgY2xhc3MgQ29udmVydGVyVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ29udmVydGVyVXRpbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TSVRJVkVfSU5GSU5JVFkgPSAiSU5GIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVHQVRJVkVfSU5GSU5JVFkgPSAiLUlORiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fUFJPUEVSVFlfQURCX0NPTlZFUlRFUlVUSUwgPSAiYWRiLmNvbnZlcnRlcnV0aWwiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0N1c3RvbUNsYXNzUHJlc2VudDsKLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBjdXN0b21DbGFzczsKLQotICAgIC8qIFN0cmluZyBjb252ZXJzaW9uIG1ldGhvZHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGZsb2F0IGkpIHsKLSAgICAgICAgcmV0dXJuIEZsb2F0LnRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhsb25nIGkpIHsKLSAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGRvdWJsZSBpKSB7Ci0gICAgICAgIHJldHVybiBEb3VibGUudG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGJ5dGUgaSkgewotICAgICAgICByZXR1cm4gQnl0ZS50b1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoY2hhciBpKSB7Ci0gICAgICAgIHJldHVybiBDaGFyYWN0ZXIudG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKHNob3J0IGkpIHsKLSAgICAgICAgcmV0dXJuIFNob3J0LnRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhib29sZWFuIGkpIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKERhdGUgdmFsdWUpIHsKLQotICAgICAgICBpZiAoaXNDdXN0b21DbGFzc1ByZXNlbnQpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdXNlciBoYXMgZGVmaW5lIGEgc2VwZXJhdGUgY29udmVydGVyIHV0aWwgY2xhc3MKLSAgICAgICAgICAgIHJldHVybiBpbnZva2VUb1N0cmluZ01ldGhvZCh2YWx1ZSxEYXRlLmNsYXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGxleGljYWwgZm9ybSBvZiB0aGUgZGF0ZSBpcyAnLSc/IHl5eXkgJy0nIG1tICctJyBkZCB6enp6eno/Ci0gICAgICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICBjYWxlbmRhci5jbGVhcigpOwotICAgICAgICAgICAgY2FsZW5kYXIuc2V0VGltZSh2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIWNhbGVuZGFyLmlzU2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSl7Ci0gICAgICAgICAgICAgICAgY2FsZW5kYXIuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBkYXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigxNik7Ci0gICAgICAgICAgICBhcHBlbmREYXRlKGRhdGVTdHJpbmcsIGNhbGVuZGFyKTsKLSAgICAgICAgICAgIGFwcGVuZFRpbWVab25lKGNhbGVuZGFyLCBkYXRlU3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRlU3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVGltZVpvbmUoQ2FsZW5kYXIgY2FsZW5kYXIsIFN0cmluZ0J1ZmZlciBkYXRlU3RyaW5nKSB7Ci0gICAgICAgIGludCB0aW1lem9uZU9mZlNldCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5aT05FX09GRlNFVCkgKyBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuRFNUX09GRlNFVCk7Ci0gICAgICAgIGludCB0aW1lem9uZU9mZlNldEluTWluaXRzID0gdGltZXpvbmVPZmZTZXQgLyA2MDAwMDsKLSAgICAgICAgaWYgKHRpbWV6b25lT2ZmU2V0SW5NaW5pdHMgPCAwKXsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCItIik7Ci0gICAgICAgICAgICB0aW1lem9uZU9mZlNldEluTWluaXRzID0gdGltZXpvbmVPZmZTZXRJbk1pbml0cyAqIC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIisiKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgaG91cnMgPSB0aW1lem9uZU9mZlNldEluTWluaXRzIC8gNjA7Ci0gICAgICAgIGludCBtaW5pdHMgPSB0aW1lem9uZU9mZlNldEluTWluaXRzICUgNjA7Ci0KLSAgICAgICAgaWYgKGhvdXJzIDwgMTApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoaG91cnMpLmFwcGVuZCgiOiIpOwotCi0gICAgICAgIGlmIChtaW5pdHMgPCAxMCl7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQobWluaXRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kRGF0ZShTdHJpbmdCdWZmZXIgZGF0ZVN0cmluZywgQ2FsZW5kYXIgY2FsZW5kYXIpIHsKLQotICAgICAgICBpbnQgeWVhciA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5ZRUFSKTsKLQotICAgICAgICBpZiAoeWVhciA8IDEwMDApewotICAgICAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoIjAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeWVhciA8IDEwMCl7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ZWFyIDwgMTApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQoeWVhcikuYXBwZW5kKCItIik7Ci0KLSAgICAgICAgLy8geG1sIGRhdGUgbW9udGggaXMgc3RhcnRlZCBmcm9tIDEgYW5kIGNhbGVuZGFyIG1vbnRoIGlzCi0gICAgICAgIC8vIHN0YXJ0ZWQgZnJvbSAwLiBzbyBoYXZlIHRvIGFkZCBvbmUKLSAgICAgICAgaW50IG1vbnRoID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDE7Ci0gICAgICAgIGlmIChtb250aCA8IDEwKXsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQobW9udGgpLmFwcGVuZCgiLSIpOwotICAgICAgICBpZiAoY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkgPCAxMCl7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKGNhbGVuZGFyLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW52b2tlVG9TdHJpbmdNZXRob2QoT2JqZWN0IHZhbHVlLCBDbGFzcyB0eXBlKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjdXN0b21DbGFzcy5nZXRNZXRob2QoImNvbnZlcnRUb1N0cmluZyIsIG5ldyBDbGFzc1tde3R5cGV9KTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSBtZXRob2QuaW52b2tlKG51bGwsbmV3IE9iamVjdFtde3ZhbHVlfSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbiBub3QgZmluZCB0aGUgbWV0aG9kIGNvbnZlcnRUb1N0cmluZygiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXROYW1lKCkgKyAiKSBpbiBjb252ZXJ0ZXIgdXRpbCBjbGFzcyAiICsgY3VzdG9tQ2xhc3MuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuIG5vdCBhY2Nlc3MgdGhlIG1ldGhvZCBjb252ZXJ0VG9TdHJpbmcoIgotICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0TmFtZSgpICsgIikgaW4gY29udmVydGVyIHV0aWwgY2xhc3MgIiArIGN1c3RvbUNsYXNzLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbiBub3QgaW52b2NhdGUgdGhlIG1ldGhvZCBjb252ZXJ0VG9TdHJpbmcoIgotICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0TmFtZSgpICsgIikgaW4gY29udmVydGVyIHV0aWwgY2xhc3MgIiArIGN1c3RvbUNsYXNzLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tQ2xhc3NQcmVzZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gaW52b2tlVG9TdHJpbmdNZXRob2QodmFsdWUsQ2FsZW5kYXIuY2xhc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbGV4aWNhbCBmb3JtIG9mIHRoZSBjYWxlbmRhciBpcyAnLSc/IHl5eXkgJy0nIG1tICctJyBkZCAnVCcgaGggJzonIG1tICc6JyBzcyAoJy4nIHMrKT8gKHp6enp6eik/Ci0gICAgICAgICAgICBpZiAodmFsdWUuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSA9PSAtMSl7Ci0gICAgICAgICAgICAgICAgdmFsdWUuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBkYXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigyOCk7Ci0gICAgICAgICAgICBhcHBlbmREYXRlKGRhdGVTdHJpbmcsIHZhbHVlKTsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCJUIik7Ci0gICAgICAgICAgICAvL2FkZGluZyBob3VycwotICAgICAgICAgICAgYXBwZW5kVGltZSh2YWx1ZSwgZGF0ZVN0cmluZyk7Ci0gICAgICAgICAgICBhcHBlbmRUaW1lWm9uZSh2YWx1ZSwgZGF0ZVN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gZGF0ZVN0cmluZy50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZFRpbWUoQ2FsZW5kYXIgdmFsdWUsIFN0cmluZ0J1ZmZlciBkYXRlU3RyaW5nKSB7Ci0gICAgICAgIGlmICh2YWx1ZS5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpIDwgMTApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQodmFsdWUuZ2V0KENhbGVuZGFyLkhPVVJfT0ZfREFZKSkuYXBwZW5kKCI6Iik7Ci0gICAgICAgIGlmICh2YWx1ZS5nZXQoQ2FsZW5kYXIuTUlOVVRFKSA8IDEwKSB7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKHZhbHVlLmdldChDYWxlbmRhci5NSU5VVEUpKS5hcHBlbmQoIjoiKTsKLSAgICAgICAgaWYgKHZhbHVlLmdldChDYWxlbmRhci5TRUNPTkQpIDwgMTApIHsKLSAgICAgICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKCIwIik7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0ZVN0cmluZy5hcHBlbmQodmFsdWUuZ2V0KENhbGVuZGFyLlNFQ09ORCkpLmFwcGVuZCgiLiIpOwotICAgICAgICBpZiAodmFsdWUuZ2V0KENhbGVuZGFyLk1JTExJU0VDT05EKSA8IDEwKSB7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZS5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpIDwgMTAwKSB7Ci0gICAgICAgICAgICBkYXRlU3RyaW5nLmFwcGVuZCgiMCIpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGVTdHJpbmcuYXBwZW5kKHZhbHVlLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEYXkgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhZZWFyTW9udGggbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhZZWFyIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoSGV4QmluYXJ5IG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoTW9udGhEYXkgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUaW1lIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQnl0ZSBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEJpZ0ludGVnZXIgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhJbnRlZ2VyIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoTG9uZyBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFNob3J0IG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoVW5zaWduZWRCeXRlIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoVW5zaWduZWRJbnQgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhVbnNpZ25lZExvbmcgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhRTmFtZSBvKSB7Ci0gICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvLmdldExvY2FsUGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKERvdWJsZSBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKER1cmF0aW9uIG8pIHsKLSAgICAgICAgcmV0dXJuIG8udG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRmxvYXQgbykgewotICAgICAgICByZXR1cm4gby50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhNb250aCBvKSB7Ci0gICAgICAgIHJldHVybiBvLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGJ5dGVbXSBieXRlcykgewotICAgICAgICByZXR1cm4gQmFzZTY0LmVuY29kZShieXRlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgaGFuZGxlcikgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nRnJvbURhdGFoYW5kbGVyKGhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCi0gICAgLyogU3RyaW5nIHRvIGphdmEgdHlwZSBjb252ZXJzaW9ucwotICAgICAgIFRoZXNlIG1ldGhvZHMgaGF2ZSBhIHNwZWNpYWwgc2lnbmF0dXJlIHN0cnVjdHVyZQotICAgICAgIDxjb2RlPmNvbnZlcnRUbzwvY29kZT4gZm9sbG93ZWQgYnkgdGhlIHNjaGVtYSB0eXBlIG5hbWUKLSAgICAgICBTYXkgZm9yIGludCwgY29udmVydFRvaW50KFN0cmluZykgaXMgdGhlIGNvbnZlcnRlciBtZXRob2QKLQotICAgICAgIE5vdCB2ZXJ5IGVsZWdhbnQgYnV0IGl0IHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSEKLQotICAgICovCi0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRUb0ludChTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJpZ0RlY2ltYWwgY29udmVydFRvQmlnRGVjaW1hbChTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBjb252ZXJ0VG9Eb3VibGUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLk5hTjsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUE9TSVRJVkVfSU5GSU5JVFkuZXF1YWxzKHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICB9IGVsc2UgaWYgKE5FR0FUSVZFX0lORklOSVRZLmVxdWFscyhzKSkgewotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5ORUdBVElWRV9JTkZJTklUWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmlnRGVjaW1hbCBjb252ZXJ0VG9EZWNpbWFsKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgY29udmVydFRvRmxvYXQoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gRmxvYXQuTmFOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChQT1NJVElWRV9JTkZJTklUWS5lcXVhbHMocykpIHsKLSAgICAgICAgICAgIHJldHVybiBGbG9hdC5QT1NJVElWRV9JTkZJTklUWTsKLSAgICAgICAgfSBlbHNlIGlmIChORUdBVElWRV9JTkZJTklUWS5lcXVhbHMocykpIHsKLSAgICAgICAgICAgIHJldHVybiBGbG9hdC5ORUdBVElWRV9JTkZJTklUWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGNvbnZlcnRUb0xvbmcoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gTG9uZy5NSU5fVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc2hvcnQgY29udmVydFRvU2hvcnQoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gU2hvcnQuTUlOX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTaG9ydC5wYXJzZVNob3J0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb252ZXJ0VG9Cb29sZWFuKFN0cmluZyBzKSB7Ci0KLSAgICAgICAgYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGZhbHNlOwotICAgICAgICBpZiAoKHMgIT0gbnVsbCkgJiYgKHMubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgaWYgKCIxIi5lcXVhbHMocykgfHwgcy50b0xvd2VyQ2FzZSgpLmVxdWFscygidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghIjAiLmVxdWFscyhzKSAmJiAhcy50b0xvd2VyQ2FzZSgpLmVxdWFscygiZmFsc2UiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbiB2YWxpZCBzdHJpbmcgLSIgKyBzICsgIiBmb3IgYm9vbGVhbiB2YWx1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BbnlTaW1wbGVUeXBlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGNvbnZlcnRUb0FueVR5cGUoU3RyaW5nIHMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksIHIpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgWWVhck1vbnRoIGNvbnZlcnRUb0dZZWFyTW9udGgoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFllYXJNb250aChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1vbnRoRGF5IGNvbnZlcnRUb0dNb250aERheShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTW9udGhEYXkocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBZZWFyIGNvbnZlcnRUb0dZZWFyKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBZZWFyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTW9udGggY29udmVydFRvR01vbnRoKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNb250aChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIERheSBjb252ZXJ0VG9HRGF5KFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBEYXkocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBjb252ZXJ0VG9EdXJhdGlvbihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRHVyYXRpb24ocyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIEhleEJpbmFyeSBjb252ZXJ0VG9IZXhCaW5hcnkoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEhleEJpbmFyeShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgY29udmVydFRvQmFzZTY0QmluYXJ5KFN0cmluZyBzKSB7Ci0gICAgICAgIC8vIHJldXNpbmcgdGhlIGJ5dGVBcnJheURhdGFTb3VyY2UgZnJvbSB0aGUgQXhpb20gY2xhc3NlcwotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEJ5dGVBcnJheURhdGFTb3VyY2UgYnl0ZUFycmF5RGF0YVNvdXJjZSA9IG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKAotICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUocykKLSAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlcihieXRlQXJyYXlEYXRhU291cmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIgY29udmVydFRvRGF0YUhhbmRsZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0Jhc2U2NEJpbmFyeShzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGdpdmVuIHN0cmluZyBpbnRvIGEgZGF0ZS4gQ29kZSBmcm9tIEF4aXMxIERhdGVEZXNlcmlhbGl6ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogQHJldHVybiBSZXR1cm5zIERhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEYXRlIGNvbnZlcnRUb0RhdGUoU3RyaW5nIHNvdXJjZSkgewotCi0gICAgICAgIC8vIHRoZSBsZXhpY2FsIGZvcm0gb2YgdGhlIGRhdGUgaXMgJy0nPyB5eXl5ICctJyBtbSAnLScgZGQgenp6enp6PwotICAgICAgICBpZiAoKHNvdXJjZSA9PSBudWxsKSB8fCBzb3VyY2UudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZSA9IHNvdXJjZS50cmltKCk7Ci0gICAgICAgIGJvb2xlYW4gYmMgPSBmYWxzZTsKLSAgICAgICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICBiYyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeWVhciA9IDA7Ci0gICAgICAgIGludCBtb250aCA9IDA7Ci0gICAgICAgIGludCBkYXkgPSAwOwotICAgICAgICBpbnQgdGltZVpvbmVPZmZTZXQgPSBUaW1lWm9uZS5nZXREZWZhdWx0KCkuZ2V0UmF3T2Zmc2V0KCk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZS5sZW5ndGgoKSA+PSAxMCkgewotICAgICAgICAgICAgLy9maXJzdCAxMCBudW1iZXJzIG11c3QgZ2l2ZSB0aGUgeWVhcgotICAgICAgICAgICAgaWYgKChzb3VyY2UuY2hhckF0KDQpICE9ICctJykgfHwgKHNvdXJjZS5jaGFyQXQoNykgIT0gJy0nKSl7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImludmFsaWQgZGF0ZSBmb3JtYXQgKCIgKyBzb3VyY2UgKyAiKSB3aXRoIG91dCAtIHMgYXQgY29ycmVjdCBwbGFjZSAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHllYXIgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMCw0KSk7Ci0gICAgICAgICAgICBtb250aCA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZyg1LDcpKTsKLSAgICAgICAgICAgIGRheSA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZyg4LDEwKSk7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UubGVuZ3RoKCkgPiAxMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXN0cGFydCA9IHNvdXJjZS5zdWJzdHJpbmcoMTApOwotICAgICAgICAgICAgICAgIGlmIChyZXN0cGFydC5zdGFydHNXaXRoKCJaIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGdtdCB0aW1lIHpvbmUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdHBhcnQuc3RhcnRzV2l0aCgiKyIpIHx8IHJlc3RwYXJ0LnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgc3BlY2lmaWMgdGltZSBmb3JtYXQgc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN0cGFydC5jaGFyQXQoMykgIT0gJzonKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIHRpbWUgem9uZSBmb3JtYXQgKCIgKyBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSB3aXRob3V0IDogYXQgY29ycmVjdCBwbGFjZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCBob3VycyA9IEludGVnZXIucGFyc2VJbnQocmVzdHBhcnQuc3Vic3RyaW5nKDEsMykpOwotICAgICAgICAgICAgICAgICAgICBpbnQgbWluaXRzID0gSW50ZWdlci5wYXJzZUludChyZXN0cGFydC5zdWJzdHJpbmcoNCw2KSk7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gKChob3VycyAqIDYwKSArIG1pbml0cykgKiA2MDAwMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3RwYXJ0LnN0YXJ0c1dpdGgoIi0iKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IHRpbWVab25lT2ZmU2V0ICogLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW4gdmFsaWQgc3RyaW5nIHN1Zml4Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluIHZhbGlkIHN0cmluZyB0byBwYXJzZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBjYWxlbmRhci5jbGVhcigpOwotICAgICAgICBjYWxlbmRhci5zZXRMZW5pZW50KGZhbHNlKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLllFQVIsIHllYXIpOwotICAgICAgICAvL3htbCBtb250aCBzdGFycyBmcm9tIHRoZSAxIGFuZCBjYWxlbmRhciBtb250aCBpcyBzdGFydHMgd2l0aCAwCi0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5NT05USCwgbW9udGggLSAxKTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgZGF5KTsKLSAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VULCB0aW1lWm9uZU9mZlNldCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5EU1RfT0ZGU0VULCAwKTsKLSAgICAgICAgY2FsZW5kYXIuZ2V0VGltZUluTWlsbGlzKCk7Ci0gICAgICAgIGlmIChiYyl7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuRVJBLCBHcmVnb3JpYW5DYWxlbmRhci5CQyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2FsZW5kYXIuZ2V0VGltZSgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaW1lIGNvbnZlcnRUb1RpbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFRpbWUocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUb2tlbiBjb252ZXJ0VG9Ub2tlbihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVG9rZW4ocyk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIE5vcm1hbGl6ZWRTdHJpbmcgY29udmVydFRvTm9ybWFsaXplZFN0cmluZyhTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTm9ybWFsaXplZFN0cmluZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkTG9uZyBjb252ZXJ0VG9VbnNpZ25lZExvbmcoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVuc2lnbmVkTG9uZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkSW50IGNvbnZlcnRUb1Vuc2lnbmVkSW50KFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBVbnNpZ25lZEludChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkU2hvcnQgY29udmVydFRvVW5zaWduZWRTaG9ydChTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLnN0YXJ0c1dpdGgoIisiKSkgewotICAgICAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVW5zaWduZWRTaG9ydChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFVuc2lnbmVkQnl0ZSBjb252ZXJ0VG9VbnNpZ25lZEJ5dGUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFVuc2lnbmVkQnl0ZShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5vbk5lZ2F0aXZlSW50ZWdlciBjb252ZXJ0VG9Ob25OZWdhdGl2ZUludGVnZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5vbk5lZ2F0aXZlSW50ZWdlcihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5lZ2F0aXZlSW50ZWdlciBjb252ZXJ0VG9OZWdhdGl2ZUludGVnZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5lZ2F0aXZlSW50ZWdlcihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFBvc2l0aXZlSW50ZWdlciBjb252ZXJ0VG9Qb3NpdGl2ZUludGVnZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFBvc2l0aXZlSW50ZWdlcihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5vblBvc2l0aXZlSW50ZWdlciBjb252ZXJ0VG9Ob25Qb3NpdGl2ZUludGVnZXIoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocy5zdGFydHNXaXRoKCIrIikpIHsKLSAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZygxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5vblBvc2l0aXZlSW50ZWdlcihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5hbWUgY29udmVydFRvTmFtZShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTmFtZShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5DTmFtZSBjb252ZXJ0VG9OQ05hbWUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE5DTmFtZShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElkIGNvbnZlcnRUb0lEKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJZChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElkIGNvbnZlcnRUb0lkKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0VG9JRChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhbmd1YWdlIGNvbnZlcnRUb0xhbmd1YWdlKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5NVG9rZW4gY29udmVydFRvTk1UT0tFTihTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTk1Ub2tlbihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5NVG9rZW5zIGNvbnZlcnRUb05NVE9LRU5TKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOTVRva2VucyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE5vdGF0aW9uIGNvbnZlcnRUb05PVEFUSU9OKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAvL3RvZG8gTmVlZCB0byBmaXggdGhpcwotICAgICAgICAvLyByZXR1cm4gbmV3IE5vdGF0aW9uKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRW50aXR5IGNvbnZlcnRUb0VOVElUWShTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRW50aXR5KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRW50aXRpZXMgY29udmVydFRvRU5USVRJRVMoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVudGl0aWVzKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSURSZWYgY29udmVydFRvSURSRUYoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IElEUmVmKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSURSZWZzIGNvbnZlcnRUb0lEUkVGUyhTdHJpbmcgcykgewotICAgICAgICBpZiAoKHMgPT0gbnVsbCkgfHwgcy5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgSURSZWZzKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVVJJIGNvbnZlcnRUb1VSSShTdHJpbmcgcyl7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0FueVVSSShzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFVSSSBjb252ZXJ0VG9BbnlVUkkoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkocyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSS5NYWxmb3JtZWRVUklFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdENvbnZlcnNpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIEFEQk1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRlci5jYW5ub3RQYXJzZSIsIHMpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBjb252ZXJ0VG9JbnRlZ2VyKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQmlnSW50ZWdlciBjb252ZXJ0VG9CaWdJbnRlZ2VyKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmICgocyA9PSBudWxsKSB8fCBzLmVxdWFscygiIikpewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiKyIpKSB7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0ludGVnZXIocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlIGNvbnZlcnRUb0J5dGUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKChzID09IG51bGwpIHx8IHMuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXR1cm4gQnl0ZS5NSU5fVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJ5dGUucGFyc2VCeXRlKHMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvZGUgZnJvbSBBeGlzMSBjb2RlIGJhc2UgTm90ZSAtIFdlIG9ubHkgZm9sbG93IHRoZSBjb252ZW50aW9uIGluIHRoZSBsYXRlc3Qgc2NoZW1hIHNwZWMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQ2FsZW5kYXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDYWxlbmRhciBjb252ZXJ0VG9EYXRlVGltZShTdHJpbmcgc291cmNlKSB7Ci0KLSAgICAgICAgaWYgKChzb3VyY2UgPT0gbnVsbCkgfHwgc291cmNlLnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2UgPSBzb3VyY2UudHJpbSgpOwotICAgICAgICAvLyB0aGUgbGV4aWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0ZSB0aW1lIGFzIGZvbGxvd3MKLSAgICAgICAgLy8gJy0nPyB5eXl5ICctJyBtbSAnLScgZGQgJ1QnIGhoICc6JyBtbSAnOicgc3MgKCcuJyBzKyk/ICh6enp6enopPwotICAgICAgICBEYXRlIGRhdGUgPSBudWxsOwotICAgICAgICBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGNhbGVuZGFyLmNsZWFyKCk7Ci0gICAgICAgIGNhbGVuZGFyLnNldExlbmllbnQoZmFsc2UpOwotCi0KLSAgICAgICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuRVJBLCBHcmVnb3JpYW5DYWxlbmRhci5CQyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgeWVhciA9IDA7Ci0gICAgICAgIGludCBtb250aCA9IDA7Ci0gICAgICAgIGludCBkYXkgPSAwOwotICAgICAgICBpbnQgaG91ciA9IDA7Ci0gICAgICAgIGludCBtaW5pdGUgPSAwOwotICAgICAgICBpbnQgc2Vjb25kID0gMDsKLSAgICAgICAgbG9uZyBtaWxpU2Vjb25kID0gMDsKLSAgICAgICAgaW50IHRpbWVab25lT2ZmU2V0ID0gVGltZVpvbmUuZ2V0RGVmYXVsdCgpLmdldFJhd09mZnNldCgpOwotCi0KLSAgICAgICAgaWYgKChzb3VyY2UgIT0gbnVsbCkgJiYgKHNvdXJjZS5sZW5ndGgoKSA+PSAxOSkpIHsKLSAgICAgICAgICAgIGlmICgoc291cmNlLmNoYXJBdCg0KSAhPSAnLScpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChzb3VyY2UuY2hhckF0KDcpICE9ICctJykgfHwKLSAgICAgICAgICAgICAgICAgICAgKHNvdXJjZS5jaGFyQXQoMTApICE9ICdUJykgfHwKLSAgICAgICAgICAgICAgICAgICAgKHNvdXJjZS5jaGFyQXQoMTMpICE9ICc6JykgfHwKLSAgICAgICAgICAgICAgICAgICAgKHNvdXJjZS5jaGFyQXQoMTYpICE9ICc6JykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBkYXRlIGZvcm1hdCAoIiArIHNvdXJjZSArICIpIHdpdGggb3V0IC0gcyBhdCBjb3JyZWN0IHBsYWNlICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeWVhciA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZygwLCA0KSk7Ci0gICAgICAgICAgICBtb250aCA9IEludGVnZXIucGFyc2VJbnQoc291cmNlLnN1YnN0cmluZyg1LCA3KSk7Ci0gICAgICAgICAgICBkYXkgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoOCwgMTApKTsKLSAgICAgICAgICAgIGhvdXIgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMTEsIDEzKSk7Ci0gICAgICAgICAgICBtaW5pdGUgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMTQsIDE2KSk7Ci0gICAgICAgICAgICBzZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHNvdXJjZS5zdWJzdHJpbmcoMTcsIDE5KSk7Ci0KLSAgICAgICAgICAgIGludCBtaWxsaVNlY29uZFBhcnRMZW5ndGggPSAwOwotCi0gICAgICAgICAgICBpZiAoc291cmNlLmxlbmd0aCgpID4gMTkpICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3QgPSBzb3VyY2Uuc3Vic3RyaW5nKDE5KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdC5zdGFydHNXaXRoKCIuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgaGF2ZSB0aGUgKCcuJ3MrKSBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN0LmVuZHNXaXRoKCJaIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaW4gZ210IHRpbWUgem9uZQotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXIuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIloiKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoID0gcmVzdC5zdWJzdHJpbmcoMSxyZXN0Lmxhc3RJbmRleE9mKCJaIikpLnRyaW0oKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocmVzdC5sYXN0SW5kZXhPZigiKyIpID4gMCkgfHwgKHJlc3QubGFzdEluZGV4T2YoIi0iKSA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGdpdmVuIGluIGEgZ2VuZXJhbCB0aW1lIHppb25lCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGltZU9mZlNldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdC5sYXN0SW5kZXhPZigiKyIpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPZmZTZXQgPSByZXN0LnN1YnN0cmluZyhyZXN0Lmxhc3RJbmRleE9mKCIrIikgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxpU2Vjb25kID0gSW50ZWdlci5wYXJzZUludChyZXN0LnN1YnN0cmluZygxLCByZXN0Lmxhc3RJbmRleE9mKCIrIikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY29uZFBhcnRMZW5ndGggPSByZXN0LnN1YnN0cmluZygxLCByZXN0Lmxhc3RJbmRleE9mKCIrIikpLnRyaW0oKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBrZWVwICsxIG9yIC0xIHRvIGZpbmFsbHkgY2FsY3VsYXRlIHRoZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN0Lmxhc3RJbmRleE9mKCItIikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU9mZlNldCA9IHJlc3Quc3Vic3RyaW5nKHJlc3QubGFzdEluZGV4T2YoIi0iKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIi0iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IHJlc3Quc3Vic3RyaW5nKDEsIHJlc3QubGFzdEluZGV4T2YoIi0iKSkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGtlZXAgKzEgb3IgLTEgdG8gZmluYWxseSBjYWxjdWxhdGUgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVpvbmVPZmZTZXQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lT2ZmU2V0LmNoYXJBdCgyKSAhPSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCB0aW1lIHpvbmUgZm9ybWF0ICgiICsgc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIHdpdGhvdXQgOiBhdCBjb3JyZWN0IHBsYWNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaG91cnMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWVPZmZTZXQuc3Vic3RyaW5nKDAsIDIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pdHMgPSBJbnRlZ2VyLnBhcnNlSW50KHRpbWVPZmZTZXQuc3Vic3RyaW5nKDMsIDUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gKChob3VycyAqIDYwKSArIG1pbml0cykgKiA2MDAwMCAqIHRpbWVab25lT2ZmU2V0OwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUgaXQgZG9lcyBub3QgaGF2ZSB0aW1lIHpvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbGlTZWNvbmQgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kUGFydExlbmd0aCA9IHJlc3Quc3Vic3RyaW5nKDEpLnRyaW0oKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiWiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhci5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBpbiBnbXQgdGltZSB6b25lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZlNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdC5zdGFydHNXaXRoKCIrIikgfHwgcmVzdC5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgZ2l2ZW4gaW4gYSBnZW5lcmFsIHRpbWUgemlvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0LmNoYXJBdCgzKSAhPSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCB0aW1lIHpvbmUgZm9ybWF0ICgiICsgc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIHdpdGhvdXQgOiBhdCBjb3JyZWN0IHBsYWNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaG91cnMgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDEsIDMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pdHMgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3Quc3Vic3RyaW5nKDQsIDYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gKChob3VycyAqIDYwKSArIG1pbml0cykgKiA2MDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0LnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lT2ZmU2V0ID0gdGltZVpvbmVPZmZTZXQgKiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oImluIHZhbGlkIHRpbWUgem9uZSBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5ZRUFSLCB5ZWFyKTsKLSAgICAgICAgICAgIC8vIHhtbCBtb250aCBpcyBzdGFydGVkIGZyb20gMSBhbmQgY2FsZW5kYXIgbW9udGggaXMgc3RhcnRlZCBmcm9tIDAKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5NT05USCwgbW9udGggLSAxKTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGRheSk7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVksIGhvdXIpOwotICAgICAgICAgICAgY2FsZW5kYXIuc2V0KENhbGVuZGFyLk1JTlVURSwgbWluaXRlKTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5TRUNPTkQsIHNlY29uZCk7Ci0gICAgICAgICAgICBpZiAobWlsbGlTZWNvbmRQYXJ0TGVuZ3RoICE9IDMpewotICAgICAgICAgICAgICAgIC8vIG1pbGlzZWNvbmQgcGFydCByZXByZXNlbnN0IHRoZSBmcmFjdGlvbiBvZiB0aGUgc2Vjb25kIHNvIHdlIGhhdmUgdG8KLSAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBmcmFjdGlvbiBhbmQgbXVsdGlwbHkgaXQgYnkgMTAwMC4gU28gaWYgbWlsaXNlY29uZCBwYXJ0Ci0gICAgICAgICAgICAgICAgLy8gaGFzIHRocmVlIGRpZ2l0cyBub3RoaW5nIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IG1pbGlTZWNvbmQgKiAxMDAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlsbGlTZWNvbmRQYXJ0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbWlsaVNlY29uZCA9IG1pbGlTZWNvbmQgLyAxMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQsIChpbnQpbWlsaVNlY29uZCk7Ci0gICAgICAgICAgICBjYWxlbmRhci5zZXQoQ2FsZW5kYXIuWk9ORV9PRkZTRVQsIHRpbWVab25lT2ZmU2V0KTsKLSAgICAgICAgICAgIGNhbGVuZGFyLnNldChDYWxlbmRhci5EU1RfT0ZGU0VULCAwKTsKLQotCi0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oImRhdGUgc3RyaW5nIGNhbiBub3QgYmUgbGVzcyB0aGFuIDE5IGNoYXJhY3RvcnMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjYWxlbmRhcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2RlIGZyb20gQXhpczEgY29kZSBiYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgY29udmVydFRvUU5hbWUoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIG5hbWVTcGFjZXVyaSkgewotICAgICAgICBzb3VyY2UgPSBzb3VyY2UudHJpbSgpOwotICAgICAgICBpbnQgY29sb24gPSBzb3VyY2UubGFzdEluZGV4T2YoIjoiKTsKLSAgICAgICAgLy9jb250ZXh0LmdldE5hbWVzcGFjZVVSSShzb3VyY2Uuc3Vic3RyaW5nKDAsIGNvbG9uKSk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBjb2xvbiA8IDAgPyBzb3VyY2UgOiBzb3VyY2Uuc3Vic3RyaW5nKGNvbG9uICsgMSk7Ci0gICAgICAgIFN0cmluZyBwZXJmaXggPSBjb2xvbiA8PSAwID8gIiIgOiBzb3VyY2Uuc3Vic3RyaW5nKDAsIGNvbG9uKTsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShuYW1lU3BhY2V1cmksIGxvY2FsUGFydCwgcGVyZml4KTsKLSAgICB9Ci0KLSAgICAvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAqLwotCi0gICAgLyogamF2YSBQcmltaXRpdmUgdHlwZXMgdG8gT2JqZWN0IGNvbnZlcnNpb24gbWV0aG9kcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnRUb09iamVjdChTdHJpbmcgaSkgewotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0VG9PYmplY3QoYm9vbGVhbiBpKSB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFRvT2JqZWN0KGRvdWJsZSBpKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRG91YmxlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnRUb09iamVjdChieXRlIGkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNvbnZlcnRUb09iamVjdChjaGFyIGkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFRvT2JqZWN0KHNob3J0IGkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaG9ydChpKTsKLSAgICB9Ci0KLSAgICAvKiBsaXN0IHRvIGFycmF5IGNvbnZlcnNpb24gbWV0aG9kcyAqLwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydFRvQXJyYXkoQ2xhc3MgYmFzZUFycmF5Q2xhc3MsIFN0cmluZ1tdIHZhbHVlQXJyYXkpIHsKLSAgICAgICAgLy9jcmVhdGUgYSBsaXN0IHVzaW5nIHRoZSBzdHJpbmcgYXJyYXkKLSAgICAgICAgTGlzdCB2YWx1ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZUFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdmFsdWVzTGlzdC5hZGQodmFsdWVBcnJheVtpXSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0VG9BcnJheShiYXNlQXJyYXlDbGFzcywgdmFsdWVzTGlzdCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYmFzZUFycmF5Q2xhc3MKLSAgICAgKiBAcGFyYW0gb2JqZWN0TGlzdCAgICAgLT4gZm9yIHByaW1pdGl2ZSB0eXBlIGFycmF5IGNvbnZlcnNpb24gd2UgYXNzdW1lIHRoZSBjb250ZW50IHRvIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MhCi0gICAgICogQHJldHVybiBSZXR1cm5zIE9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjb252ZXJ0VG9BcnJheShDbGFzcyBiYXNlQXJyYXlDbGFzcywgTGlzdCBvYmplY3RMaXN0KSB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IG9iamVjdExpc3Quc2l6ZSgpOwotICAgICAgICBPYmplY3QgcmV0dXJuQXJyYXkgPSBudWxsOwotICAgICAgICBpZiAoaW50LmNsYXNzLmVxdWFscyhiYXNlQXJyYXlDbGFzcykpIHsKLSAgICAgICAgICAgIGludFtdIGFycmF5ID0gbmV3IGludFtsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBJbnRlZ2VyLnBhcnNlSW50KG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm5BcnJheSA9IGFycmF5OwotICAgICAgICB9IGVsc2UgaWYgKGZsb2F0LmNsYXNzLmVxdWFscyhiYXNlQXJyYXlDbGFzcykpIHsKLSAgICAgICAgICAgIGZsb2F0W10gYXJyYXkgPSBuZXcgZmxvYXRbbGlzdFNpemVdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBvYmplY3RMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gRmxvYXQucGFyc2VGbG9hdChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gRmxvYXQuTmFOOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2hvcnQuY2xhc3MuZXF1YWxzKGJhc2VBcnJheUNsYXNzKSkgewotICAgICAgICAgICAgc2hvcnRbXSBhcnJheSA9IG5ldyBzaG9ydFtsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBTaG9ydC5wYXJzZVNob3J0KG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBTaG9ydC5NSU5fVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuQXJyYXkgPSBhcnJheTsKLSAgICAgICAgfSBlbHNlIGlmIChieXRlLmNsYXNzLmVxdWFscyhiYXNlQXJyYXlDbGFzcykpIHsKLSAgICAgICAgICAgIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlW2xpc3RTaXplXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IEJ5dGUucGFyc2VCeXRlKG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBCeXRlLk1JTl9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm5BcnJheSA9IGFycmF5OwotICAgICAgICB9IGVsc2UgaWYgKGxvbmcuY2xhc3MuZXF1YWxzKGJhc2VBcnJheUNsYXNzKSkgewotICAgICAgICAgICAgbG9uZ1tdIGFycmF5ID0gbmV3IGxvbmdbbGlzdFNpemVdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBvYmplY3RMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gTG9uZy5wYXJzZUxvbmcoby50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IExvbmcuTUlOX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYm9vbGVhbi5jbGFzcy5lcXVhbHMoYmFzZUFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBib29sZWFuW10gYXJyYXkgPSBuZXcgYm9vbGVhbltsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBvLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2hhci5jbGFzcy5lcXVhbHMoYmFzZUFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBjaGFyW10gYXJyYXkgPSBuZXcgY2hhcltsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBvLnRvU3RyaW5nKCkudG9DaGFyQXJyYXkoKVswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm5BcnJheSA9IGFycmF5OwotICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZS5jbGFzcy5lcXVhbHMoYmFzZUFycmF5Q2xhc3MpKSB7Ci0gICAgICAgICAgICBkb3VibGVbXSBhcnJheSA9IG5ldyBkb3VibGVbbGlzdFNpemVdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBvYmplY3RMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gRG91YmxlLnBhcnNlRG91YmxlKG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBEb3VibGUuTmFOOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ2FsZW5kYXIuY2xhc3MuZXF1YWxzKGJhc2VBcnJheUNsYXNzKSkgewotICAgICAgICAgICAgQ2FsZW5kYXJbXSBhcnJheSA9IG5ldyBDYWxlbmRhcltsaXN0U2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG9iamVjdExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpewotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKG8udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENhbGVuZGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9IChDYWxlbmRhcikgbzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybkFycmF5ID0gYXJyYXk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm5BcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGJhc2VBcnJheUNsYXNzLCBsaXN0U2l6ZSk7Ci0gICAgICAgICAgICBDb252ZXJ0VG9BcmJpdHJhcnlPYmplY3RBcnJheShyZXR1cm5BcnJheSwgYmFzZUFycmF5Q2xhc3MsIG9iamVjdExpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5BcnJheTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmV0dXJuQXJyYXkKLSAgICAgKiBAcGFyYW0gYmFzZUFycmF5Q2xhc3MKLSAgICAgKiBAcGFyYW0gb2JqZWN0TGlzdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ29udmVydFRvQXJiaXRyYXJ5T2JqZWN0QXJyYXkoT2JqZWN0IHJldHVybkFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYmFzZUFycmF5Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IG9iamVjdExpc3QpIHsKLSAgICAgICAgaWYgKCEoQURCQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJhc2VBcnJheUNsYXNzKSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gb2JqZWN0TGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdHJpbmcgaXMgbnVsbCB0aGUgb2JqZWN0IHZhbHVlIG11c3QgYmUgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2V0KHJldHVybkFycmF5LCBpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldChyZXR1cm5BcnJheSwgaSwgZ2V0T2JqZWN0Rm9yQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VBcnJheUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9vb3BzISAtIHRoaXMgY2Fubm90IGJlIGNvbnZlcnRlZCBmYWxsIHRocm91Z2ggYW5kCi0gICAgICAgICAgICAgICAgLy90cnkgdGhlIG90aGVyIGFsdGVybmF0aXZlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqZWN0TGlzdC50b0FycmF5KChPYmplY3RbXSlyZXR1cm5BcnJheSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL3dlIGFyZSBvdmVyIHdpdGggYWx0ZXJuYXRpdmVzIC0gdGhyb3cgdGhlCi0gICAgICAgICAgICAvL2NvbnZlcmlzb24gZXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdlIGNvdWxkIGhhdmUgdXNlZCB0aGUgQXJyYXlhLmFzTGlzdCgpIG1ldGhvZCBidXQgdGhhdCByZXR1cm5zIGFuICppbW11dGFibGUqIGxpc3QgISEhISEKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheQotICAgICAqIEByZXR1cm4gbGlzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCB0b0xpc3QoT2JqZWN0W10gYXJyYXkpIHsKLSAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChhcnJheVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnRWYWx1ZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKGludCBpbnRWYWx1ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpbnRWYWx1ZSAtIEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb3VibGVWYWx1ZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBjb21wYXJlKGRvdWJsZSBkb3VibGVWYWx1ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBkb3VibGVWYWx1ZSAtIERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmxvYXRWYWx1ZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZsb2F0IGNvbXBhcmUoZmxvYXQgZmxvYXRWYWx1ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBmbG9hdFZhbHVlIC0gRmxvYXQucGFyc2VGbG9hdCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxvbmdWYWx1ZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gMCBpZiBlcXVhbCAsICsgdmFsdWUgaWYgZ3JlYXRlciB0aGFuICwgLSB2YWx1ZSBpZiBsZXNzIHRoYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgY29tcGFyZShsb25nIGxvbmdWYWx1ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBsb25nVmFsdWUgLSBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNob3J0VmFsdWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIDAgaWYgZXF1YWwgLCArIHZhbHVlIGlmIGdyZWF0ZXIgdGhhbiAsIC0gdmFsdWUgaWYgbGVzcyB0aGFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShzaG9ydCBzaG9ydFZhbHVlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHNob3J0VmFsdWUgLSBTaG9ydC5wYXJzZVNob3J0KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYnl0ZVZsYXVlCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiAwIGlmIGVxdWFsICwgKyB2YWx1ZSBpZiBncmVhdGVyIHRoYW4gLCAtIHZhbHVlIGlmIGxlc3MgdGhhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmUoYnl0ZSBieXRlVmxhdWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gYnl0ZVZsYXVlIC0gQnl0ZS5wYXJzZUJ5dGUodmFsdWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJpbkJpZ0ludGVnZXIKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIDAgaWYgZXF1YWwgLCArIHZhbHVlIGlmIGdyZWF0ZXIgdGhhbiAsIC0gdmFsdWUgaWYgbGVzcyB0aGFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShCaWdJbnRlZ2VyIGJpbkJpZ0ludGVnZXIsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gYmluQmlnSW50ZWdlci5pbnRWYWx1ZSgpIC0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJpbkJpZ0RlY2ltYWwKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIDAgaWYgZXF1YWwgLCArIHZhbHVlIGlmIGdyZWF0ZXIgdGhhbiAsIC0gdmFsdWUgaWYgbGVzcyB0aGFuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBkb3VibGUgY29tcGFyZShCaWdEZWNpbWFsIGJpbkJpZ0RlY2ltYWwsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gYmluQmlnRGVjaW1hbC5kb3VibGVWYWx1ZSgpIC0gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgY29tcGFyZShEdXJhdGlvbiBkdXJhdGlvbiwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIER1cmF0aW9uIGNvbXBhcmVWYWx1ZSA9IG5ldyBEdXJhdGlvbih2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBkdXJhdGlvbi5jb21wYXJlKGNvbXBhcmVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGNvbXBhcmUoRGF0ZSBkYXRlLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgRGF0ZSBuZXdEYXRlID0gY29udmVydFRvRGF0ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSAtIG5ld0RhdGUuZ2V0VGltZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb21wYXJlKFRpbWUgdGltZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIFRpbWUgbmV3VGltZSA9IG5ldyBUaW1lKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRpbWUuZ2V0QXNDYWxlbmRhcigpLmdldFRpbWVJbk1pbGxpcygpIC0gbmV3VGltZS5nZXRBc0NhbGVuZGFyKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIGNvbXBhcmUoQ2FsZW5kYXIgY2FsZW5kYXIsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBDYWxlbmRhciBuZXdDYWxlbmRhciA9IGNvbnZlcnRUb0RhdGVUaW1lKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGNhbGVuZGFyLmdldFRpbWVJbk1pbGxpcygpIC0gbmV3Q2FsZW5kYXIuZ2V0VGltZUluTWlsbGlzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGdpdmVuIC5kYXRhaGFuZGxlciB0byBhIHN0cmluZwotICAgICAqCi0gICAgICogQHJldHVybiBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdGcm9tRGF0YWhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtOwotICAgICAgICAgICAgaWYgKGRhdGFIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpblN0cmVhbSA9IGRhdGFIYW5kbGVyLmdldERhdGFTb3VyY2UoKS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KGluU3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlKGRhdGEpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlZmxlY3Rpb24gYmFzZWQgbWV0aG9kIHRvIGdlbmVyYXRlIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3MgYW5kIHBvcHVsYXRlIGl0IHdpdGggYQotICAgICAqIGdpdmVuIHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldE9iamVjdEZvckNsYXNzKENsYXNzIGNsYXp6LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgLy9maXJzdCBzZWUgd2hldGhlciB0aGlzIGNsYXNzIGhhcyBhIGNvbnN0cnVjdG9yIHRoYXQgY2FuCi0gICAgICAgIC8vdGFrZSB0aGUgc3RyaW5nIGFzIGFuIGFyZ3VtZW50LgotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uc3RydWN0b3Igc3RyaW5nQ29uc3RydWN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmdDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyB2YWx1ZSB9KTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vb29wcyAtIG5vIHN1Y2ggY29uc3RydWN0b3JzIC0gY29udGludWUgd2l0aCB0aGUKLSAgICAgICAgICAgIC8vcGFyc2UgbWV0aG9kCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQURCTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY29udmVydGVyLmNhbm5vdEdlbmVyYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ei5nZXROYW1lKCkpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoInBhcnNlIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfSk7Ci0gICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlTWV0aG9kLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtdIHsgdmFsdWUgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBBREJNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0ZXIuY2Fubm90R2VuZXJhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiogQSBzaW1wbGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gdGhlIGNvbnZlcnNpb24gZmFpbHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdENvbnZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgcHVibGljIE9iamVjdENvbnZlcnNpb25FeGNlcHRpb24oKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0Q29udmVyc2lvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3RDb252ZXJzaW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy8gc2VyaWFsaXphdGlvbiBtZXRob2RzIGZvciB4c2QgYW55IHR5cGUKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplQW55VHlwZShPYmplY3QgdmFsdWUsIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoInN0cmluZyIsIHZhbHVlLnRvU3RyaW5nKCksIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJpbnQiLCB2YWx1ZS50b1N0cmluZygpLCB4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgiYm9vbGVhbiIsIHZhbHVlLnRvU3RyaW5nKCksIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVUkkpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImFueVVSSSIsIHZhbHVlLnRvU3RyaW5nKCksIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJieXRlIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoImRhdGUiLCBjb252ZXJ0VG9TdHJpbmcoKERhdGUpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbGVuZGFyKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJkYXRlVGltZSIsIGNvbnZlcnRUb1N0cmluZygoQ2FsZW5kYXIpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRpbWUpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoInRpbWUiLCBjb252ZXJ0VG9TdHJpbmcoKFRpbWUpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJmbG9hdCIsIHZhbHVlLnRvU3RyaW5nKCksIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJsb25nIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgiZG91YmxlIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJzaG9ydCIsIHZhbHVlLnRvU3RyaW5nKCksIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJkZWNpbWFsIiwgdmFsdWUudG9TdHJpbmcoKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGFIYW5kbGVyKSB7Ci0gICAgICAgICAgICBhZGRUeXBlQXR0cmlidXRlKHhtbFN0cmVhbVdyaXRlciwiYmFzZTY0QmluYXJ5Iik7Ci0gICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgbXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyID0gKE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcikgeG1sU3RyZWFtV3JpdGVyOwotICAgICAgICAgICAgbXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyLndyaXRlRGF0YUhhbmRsZXIoKERhdGFIYW5kbGVyKXZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFFOYW1lKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZVZhbHVlID0gKFFOYW1lKSB2YWx1ZTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB4bWxTdHJlYW1Xcml0ZXIuZ2V0UHJlZml4KHFOYW1lVmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgcU5hbWVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIHFOYW1lVmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcU5hbWVWYWx1ZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGlmICghcHJlZml4LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHByZWZpeCArICI6IiArIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgiUU5hbWUiLCBhdHRyaWJ1dGVWYWx1ZSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVuc2lnbmVkQnl0ZSkgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgidW5zaWduZWRCeXRlIiwgY29udmVydFRvU3RyaW5nKChVbnNpZ25lZEJ5dGUpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVuc2lnbmVkTG9uZykgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgidW5zaWduZWRMb25nIiwgY29udmVydFRvU3RyaW5nKChVbnNpZ25lZExvbmcpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVuc2lnbmVkU2hvcnQpIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZUFueVR5cGUoInVuc2lnbmVkU2hvcnQiLCBjb252ZXJ0VG9TdHJpbmcoKFVuc2lnbmVkU2hvcnQpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVuc2lnbmVkSW50KSB7Ci0gICAgICAgICAgICBzZXJpYWxpemVBbnlUeXBlKCJ1bnNpZ25lZEludCIsIGNvbnZlcnRUb1N0cmluZygoVW5zaWduZWRJbnQpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBvc2l0aXZlSW50ZWdlcikgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgicG9zaXRpdmVJbnRlZ2VyIiwgY29udmVydFRvU3RyaW5nKChQb3NpdGl2ZUludGVnZXIpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5lZ2F0aXZlSW50ZWdlcikgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgibmVnYXRpdmVJbnRlZ2VyIiwgY29udmVydFRvU3RyaW5nKChOZWdhdGl2ZUludGVnZXIpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5vbk5lZ2F0aXZlSW50ZWdlcikgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgibm9uTmVnYXRpdmVJbnRlZ2VyIiwgY29udmVydFRvU3RyaW5nKChOb25OZWdhdGl2ZUludGVnZXIpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5vblBvc2l0aXZlSW50ZWdlcikgewotICAgICAgICAgICAgc2VyaWFsaXplQW55VHlwZSgibm9uUG9zaXRpdmVJbnRlZ2VyIiwgY29udmVydFRvU3RyaW5nKChOb25Qb3NpdGl2ZUludGVnZXIpIHZhbHVlKSwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIlVua25vdyB0eXBlIGNhbiBub3Qgc2VyaWFsaXplIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHdyaXRlcyB0aGUgeHNpOnR5cGUgYXR0cnVidGUgYW5kIHRoZSB2YWx1ZSB0byB0aGUgeG1sc3RyZWFtd3JpdGVyCi0gICAgICogdG8gc2VyaWFsaXplIHRoZSBhbnl0eXBlIG9iamVjdAotICAgICAqIEBwYXJhbSB0eXBlICAtIHhzZCB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcGFyYW0gdmFsdWUgLSBzdHJpbmcgdmFsdWUgb2YgdGhlIG9iamVjdAotICAgICAqIEBwYXJhbSB4bWxTdHJlYW1Xcml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VyaWFsaXplQW55VHlwZShTdHJpbmcgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYWRkVHlwZUF0dHJpYnV0ZSh4bWxTdHJlYW1Xcml0ZXIsIHR5cGUpOwotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFR5cGVBdHRyaWJ1dGUoWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciwgU3RyaW5nIHR5cGUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlZml4ID0geG1sU3RyZWFtV3JpdGVyLmdldFByZWZpeChDb25zdGFudHMuWFNJX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgcHJlZml4ID0gQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBDb25zdGFudHMuWFNJX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgQ29uc3RhbnRzLlhTSV9OQU1FU1BBQ0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJlZml4ID0geG1sU3RyZWFtV3JpdGVyLmdldFByZWZpeChDb25zdGFudHMuWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgcHJlZml4ID0gQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBDb25zdGFudHMuWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHByZWZpeCArICI6IiArIHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLlhTSV9OQU1FU1BBQ0UsICJ0eXBlIiwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFueVR5cGVPYmplY3QoWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGV4dGVuc2lvbk1hcHBlckNsYXNzKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHJlYWRlciBpcyBhdCB0aGUgZmlyc3QgZWxlbWVudC4KLSAgICAgICAgd2hpbGUoIXhtbFN0cmVhbVJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgbnVsbCBvciBub3QKLSAgICAgICAgU3RyaW5nIG5pbGxhYmxlVmFsdWUgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlhTSV9OQU1FU1BBQ0UsICJuaWwiKTsKLSAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGVWYWx1ZSkgfHwgIjEiLmVxdWFscyhuaWxsYWJsZVZhbHVlKSl7Ci0gICAgICAgICAgICByZXR1cm5PYmplY3QgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlhTSV9OQU1FU1BBQ0UsICJ0eXBlIik7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVR5cGVQcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlVHlwZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVUeXBlUHJlZml4ID0gYXR0cmlidXRlVHlwZS5zdWJzdHJpbmcoMCxhdHRyaWJ1dGVUeXBlLmluZGV4T2YoIjoiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlLnN1YnN0cmluZyhhdHRyaWJ1dGVUeXBlLmluZGV4T2YoIjoiKSArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQgPSB4bWxTdHJlYW1SZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lU3BhY2UgPSBuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShhdHRyaWJ1dGVUeXBlUHJlZml4KTsKLQotICAgICAgICAgICAgICAgIGlmIChDb25zdGFudHMuWFNEX05BTUVTUEFDRS5lcXVhbHMoYXR0cmlidXRlTmFtZVNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoImJhc2U2NEJpbmFyeSIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0RGF0YUhhbmRsZXJPYmplY3QoeG1sU3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZG8gdGhpcyBvdGhlciB3aXNlIHhtbHN0cmVhbSBldmVudCB0eXBlIGlzIG5vdCBzZXQuCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbHVlID0geG1sU3RyZWFtUmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmliVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVUeXBlLmVxdWFscygic3RyaW5nIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gYXR0cmliVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVUeXBlLmVxdWFscygiaW50IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IEludGVnZXIoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlVHlwZS5lcXVhbHMoIlFOYW1lIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmliVmFsdWUuaW5kZXhPZigiOiIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCA9IGF0dHJpYlZhbHVlLnN1YnN0cmluZygwLCBhdHRyaWJWYWx1ZS5pbmRleE9mKCI6IikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gYXR0cmliVmFsdWUuc3Vic3RyaW5nKGF0dHJpYlZhbHVlLmluZGV4T2YoIjoiKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFFOYW1lKG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZVByZWZpeCksIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJib29sZWFuIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IEJvb2xlYW4oYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImFueVVSSSIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgVVJJKGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVVJJLk1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJJbnZhbGlkIFVSSSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiZGF0ZSIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZShhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiZGF0ZVRpbWUiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ0aW1lIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9UaW1lKGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJieXRlIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IEJ5dGUoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNob3J0Ii5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFNob3J0KGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBGbG9hdChhdHRyaWJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgibG9uZyIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBMb25nKGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhhdHRyaWJ1dGVUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5PYmplY3QgPSBuZXcgRG91YmxlKGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZWNpbWFsIi5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IEJpZ0RlY2ltYWwoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInVuc2lnbmVkTG9uZyIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBVbnNpZ25lZExvbmcoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInVuc2lnbmVkSW50Ii5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFVuc2lnbmVkSW50KGF0dHJpYlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ1bnNpZ25lZFNob3J0Ii5lcXVhbHMoYXR0cmlidXRlVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbmV3IFVuc2lnbmVkU2hvcnQoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInVuc2lnbmVkQnl0ZSIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBVbnNpZ25lZEJ5dGUoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBQb3NpdGl2ZUludGVnZXIoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBOZWdhdGl2ZUludGVnZXIoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm5vbk5lZ2F0aXZlSW50ZWdlciIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBOb25OZWdhdGl2ZUludGVnZXIoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm5vblBvc2l0aXZlSW50ZWdlciIuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBOb25Qb3NpdGl2ZUludGVnZXIoYXR0cmliVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBREJFeGNlcHRpb24oIlVua25vd24gdHlwZSA9PT4gIiArIGF0dHJpYnV0ZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFEQkV4Y2VwdGlvbigiQXR0cmlidXRlIHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgZ2V0T2JqZWN0TWV0aG9kID0gZXh0ZW5zaW9uTWFwcGVyQ2xhc3MuZ2V0TWV0aG9kKCJnZXRUeXBlT2JqZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFhNTFN0cmVhbVJlYWRlci5jbGFzc30pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0T2JqZWN0TWV0aG9kLmludm9rZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117YXR0cmlidXRlTmFtZVNwYWNlLCBhdHRyaWJ1dGVUeXBlLCB4bWxTdHJlYW1SZWFkZXJ9KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBREJFeGNlcHRpb24oIkNhbiBub3QgZmluZCB0aGUgZ2V0VHlwZU9iamVjdCBtZXRob2QgaW4gdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG1hcHBlciBjbGFzcyAiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQURCRXhjZXB0aW9uKCJDYW4gbm90IGFjY2VzcyB0aGUgZ2V0VHlwZU9iamVjdCBtZXRob2QgaW4gdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG1hcHBlciBjbGFzcyAiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQURCRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgZ2V0VHlwZU9iamVjdCBtZXRob2QgaW4gdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG1hcHBlciBjbGFzcyAiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBREJFeGNlcHRpb24oIkFueSB0eXBlIGVsZW1lbnQgdHlwZSBoYXMgbm90IGJlZW4gZ2l2ZW4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBnZXREYXRhSGFuZGxlck9iamVjdChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGRhdGFIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KE9NQ29uc3RhbnRzLklTX0RBVEFfSEFORExFUlNfQVdBUkUpKQotICAgICAgICAgICAgICAgICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMocmVhZGVyLmdldFByb3BlcnR5KE9NQ29uc3RhbnRzLklTX0JJTkFSWSkpKSB7Ci0gICAgICAgICAgICBkYXRhSGFuZGxlciA9IHJlYWRlci5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29uc3RhbnRzLkRBVEFfSEFORExFUik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UICYmCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKG5ldyBRTmFtZShNVE9NQ29uc3RhbnRzLlhPUF9OQU1FU1BBQ0VfVVJJLCBNVE9NQ29uc3RhbnRzLlhPUF9JTkNMVURFKSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBFbGVtZW50SGVscGVyLmdldENvbnRlbnRJRChyZWFkZXIsICJVVEYtOCIpOwotICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyID0gKChNVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIpICgoT01TdEFYV3JhcHBlcikgcmVhZGVyKS5nZXRCdWlsZGVyKCkpLmdldERhdGFIYW5kbGVyKGlkKTsKLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZWFkZXIuaGFzVGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9CYXNlNjRCaW5hcnkoY29udGVudCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgaXNDdXN0b21DbGFzc1ByZXNlbnQgPSAoU3lzdGVtLmdldFByb3BlcnR5KFNZU1RFTV9QUk9QRVJUWV9BREJfQ09OVkVSVEVSVVRJTCkgIT0gbnVsbCk7Ci0gICAgICAgIGlmIChpc0N1c3RvbUNsYXNzUHJlc2VudCl7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KFNZU1RFTV9QUk9QRVJUWV9BREJfQ09OVkVSVEVSVVRJTCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGN1c3RvbUNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW4gbm90IGxvYWQgdGhlIGNvbnZlcnRlciB1dGlsIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NOYW1lICsgIiB1c2luZyBkZWZhdWx0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbCBjbGFzcyIpOwotICAgICAgICAgICAgICAgIGlzQ3VzdG9tQ2xhc3NQcmVzZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9NdWx0aXJlZkhlbHBlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL011bHRpcmVmSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTQ1ZTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL011bHRpcmVmSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlbWFwcGluZy5TaW1wbGVUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk9iamVjdFN1cHBsaWVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIE11bHRpcmVmSGVscGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9SRUZfQVRUUiA9ICJyZWYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9SRUZfQVRUUiA9ICJocmVmIjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWxsZWRUYWJsZTsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IHBhcmVudDsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBvYmplY3RtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgSGFzaE1hcCBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIEhhc2hNYXAgb21FbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBNdWx0aXJlZkhlbHBlcihPTUVsZW1lbnQgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gb2JqZWN0bWFwLmdldChpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiAoT01FbGVtZW50KW9tRWxlbWVudE1hcC5nZXQoaWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgcHJvY2Vzc09NRWxlbWVudFJlZihTdHJpbmcgaWQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoIWZpbGxlZFRhYmxlKSB7Ci0gICAgICAgICAgICByZWFkYWxsQ2hpbGRFbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCB2YWwgPSAoT01FbGVtZW50KWVsZW1lbnRNYXAuZ2V0KGlkKTsKLSAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbnZhbGlkIHJlZmVyZW5jZSA6IiArIGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGUgPSBwcm9jZXNzRWxlbWVudGZvclJlZnModmFsKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBjbG9uZWVsZSA9IGVsZW1lbnRDbG9uZShlbGUpOwotICAgICAgICAgICAgb21FbGVtZW50TWFwLnB1dChpZCwgY2xvbmVlbGUpOwotICAgICAgICAgICAgcmV0dXJuIGNsb25lZWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRWxlbWVudGZvclJlZnMoT01FbGVtZW50IGVsZW1udHMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBJdGVyYXRvciBpdHIgPSBlbGVtbnRzLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KWl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaSA9IHByb2Nlc3NSZWZBdHQob21FbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChhdHRyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlZiA9IGdldEF0dHZhbHVlKGF0dHJpKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgdGVtcGVsZSA9IGdldE9NRWxlbWVudChyZWYpOwotICAgICAgICAgICAgICAgIGlmICh0ZW1wZWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcGVsZSA9IHByb2Nlc3NPTUVsZW1lbnRSZWYocmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZTIgPSBlbGVtZW50Q2xvbmUodGVtcGVsZSk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyQ2hpbGQgPSBlbGUyLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ckNoaWxkLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXRyQ2hpbGQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT01Ob2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQuYWRkQ2hpbGQoKE9NTm9kZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtbnRzOwotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGVsZW1lbnRDbG9uZShPTUVsZW1lbnQgZWxlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RBWE9NQnVpbGRlcihlbGUuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHJvY2Vzc1JlZihDbGFzcyBqYXZhdHlwZSwgU3RyaW5nIGlkLCBPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoIWZpbGxlZFRhYmxlKSB7Ci0gICAgICAgICAgICByZWFkYWxsQ2hpbGRFbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCB2YWwgPSAoT01FbGVtZW50KWVsZW1lbnRNYXAuZ2V0KGlkKTsKLSAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbnZhbGlkIHJlZmVyZW5jZSA6IiArIGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzU2ltcGxlVHlwZShqYXZhdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBpbiB0aGlzIGNhc2UgT00gZWxlbWVudCBjYW4gbm90IGNvbnRhaW5zIG1vcmUgY2hpbGQsIHRoYXQgaXMgbm8gd2F5IHRvIGdldAotICAgICAgICAgICAgICAgICAqIHRoZSB2YWx1ZSBhcyBhbiBleHAgLAotICAgICAgICAgICAgICAgICAqIDxyZWZlcm5jZSBpZD0iMTIiPgotICAgICAgICAgICAgICAgICAqICAgPHZhbHVlPmZvbzwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICogPC9yZWZlcm5jZT4KLSAgICAgICAgICAgICAgICAgKiB0aGUgYWJvdmUgb25lIGlzIG5vdCB2YWxpZCAsIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSBsaWtlIGJlbG93Ci0gICAgICAgICAgICAgICAgICogPHJlZmVybmNlIGlkPSIxMiI+Zm9vPC9yZWZlcm5jZT4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsT2JqID0gU2ltcGxlVHlwZU1hcHBlci5nZXRTaW1wbGVUeXBlT2JqZWN0KGphdmF0eXBlLCB2YWwpOwotICAgICAgICAgICAgICAgIG9iamVjdG1hcC5wdXQoaWQsIHZhbE9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbE9iajsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0NvbGxlY3Rpb24oamF2YXR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbG9iaiA9IFNpbXBsZVR5cGVNYXBwZXIuZ2V0QXJyYXlMaXN0KHZhbCk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0bWFwLnB1dChpZCwgdmFsb2JqKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsb2JqOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gQmVhblV0aWwuZGVzZXJpYWxpemUoamF2YXR5cGUsIHZhbCwgdGhpcywgb2JqZWN0U3VwcGxpZXIpOwotICAgICAgICAgICAgICAgIG9iamVjdG1hcC5wdXQoaWQsIG9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWFkYWxsQ2hpbGRFbGVtZW50cygpIHsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRzID0gcGFyZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KWNoaWxkcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBpZCA9IG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJpZCIpKTsKLSAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudE1hcC5wdXQoaWQuZ2V0QXR0cmlidXRlVmFsdWUoKSwgb21FbGVtZW50LmRldGFjaCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaWxsZWRUYWJsZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0dmFsdWUoT01BdHRyaWJ1dGUgb21hdHJpYnV0ZSkgewotICAgICAgICBTdHJpbmcgcmVmOwotICAgICAgICByZWYgPSBvbWF0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgIGlmIChyZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlZi5jaGFyQXQoMCkgPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgcmVmID0gcmVmLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT01BdHRyaWJ1dGUgcHJvY2Vzc1JlZkF0dChPTUVsZW1lbnQgb21FbGVtZW50KSB7Ci0gICAgICAgIE9NQXR0cmlidXRlIG9tYXRyaWJ1dGUgPSBvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShTT0FQMTFfUkVGX0FUVFIpKTsKLSAgICAgICAgaWYgKG9tYXRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgb21hdHJpYnV0ZSA9IG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFNPQVAxMl9SRUZfQVRUUikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbWF0cmlidXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFuKCkgewotICAgICAgICBlbGVtZW50TWFwLmNsZWFyKCk7Ci0gICAgICAgIG9iamVjdG1hcC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcHJvY2VzcyB0aGUgaHJlZiBhdHRyaWJ1dGVzIHdoaWNoIG1heSBjb21lcyB3aXRoIHRoZSBpbmNvbW1pbmcgc29hcCBtZXNhYWdlCi0gICAgICogPHNvYXA6Ym9keT4KLSAgICAgKiA8b3BlcmF0aW9uPgotICAgICAqIDxhcmcxIGhyZWY9IiNvYmoxIi8+Ci0gICAgICogPC9vcGVyYXRpb24+Ci0gICAgICogPG11bHRpcmVmIGlkPSJvYmoxIj4KLSAgICAgKiA8bmFtZT50aGUgcmVhbCBhcmd1bWVudDwvbmFtZT4KLSAgICAgKiA8Y29sb3I+Ymx1ZTwvY29sb3I+Ci0gICAgICogPC9tdWx0aXJlZj4KLSAgICAgKiA8L3NvYXA6Ym9keT4KLSAgICAgKiBoZXJlIHdlIGFzc3VtZSBmaXJzdCBjaGlsZCBvZiB0aGUgc29hcCBib2R5IGhhcyB0aGUgbWFpbiBvYmplY3Qgc3RydWN0dXJlIGFuZCBvdGhlcnMgY29udGFpbiB0aGUKLSAgICAgKiBtdWx0aXJlZiBwYXJ0cy4KLSAgICAgKiBTb2FwIHNwZWMgc2F5cyB0aGF0IHRob3NlIG11bHRpcmVmIHBhcnRzIG11c3QgYmUgdG9wIGxldmVsIGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBFbnZlbG9wZQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NIcmVmQXR0cmlidXRlcyhTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIGZpcnN0IHBvcHVsYXRlIHRoZSBtdWx0aXJlZiBwYXJ0cyB0byBhIGhhc2ggdGFibGUuCi0gICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgLy8gZmlyc3QgYnVpbGQgdGhlIHdob2xlIHRyZWUKLSAgICAgICAgc29hcEJvZHkuYnVpbGQoKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIE9NQXR0cmlidXRlIGlkQXR0cmlidXRlID0gbnVsbDsKLSAgICAgICAgTWFwIGlkQW5kT01FbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZSBpZCBpcyBhbiB1bnF1YWxpZmllZCBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGlkQXR0cmlidXRlID0gb21FbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUobnVsbCwgImlkIikpOwotICAgICAgICAgICAgaWYgKGlkQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgdGhlcmUgbWF5IG5vdCBoYXZlIGFuIGlkCi0gICAgICAgICAgICAgICAgaWRBbmRPTUVsZW1lbnRNYXAucHV0KGlkQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCksIG9tRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzdGFydCBwcm9jZXNzaW5nIGZyb20gdGhlIGZpcnN0IGNoaWxkCi0gICAgICAgIHByb2Nlc3NIcmVmQXR0cmlidXRlcyhpZEFuZE9NRWxlbWVudE1hcCwgc29hcEJvZHkuZ2V0Rmlyc3RFbGVtZW50KCksIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzSHJlZkF0dHJpYnV0ZXMoTWFwIGlkQW5kT01FbGVtZW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIGZpcnN0IGNoZWNrIHdoZXRoZXIgdGhpcyBlbGVtZW50IGhhcyBhbiBocmVmIHZhbHVlLgotICAgICAgICAvLyBocmVmIGlzIGFsc28gYW4gdW5xdWFsaWZlZCBhdHRyaWJ1dGUKLSAgICAgICAgT01BdHRyaWJ1dGUgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnRUb1Byb2Nlc3MuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShudWxsLCAiaHJlZiIpKTsKLSAgICAgICAgaWYgKGhyZWZBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaS5lIHRoaXMgaGFzIGFuIGhyZWYgYXR0cmlidXRlCi0gICAgICAgICAgICBTdHJpbmcgaHJlZkF0dHJpYnV0ZVZhbHVlID0gaHJlZkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFocmVmQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW4gdmFsaWQgaHJlZiA9PT4gIiArIGhyZWZBdHRyaWJ1dGVWYWx1ZSArICIgZG9lcyBub3Qgc3RhcnRzIHdpdGggIyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVmZXJlZE9NRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoT01FbGVtZW50KSBpZEFuZE9NRWxlbWVudE1hcC5nZXQoaHJlZkF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZmVyZWRPTUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbiB2YWxpZCBocmVmID09PiAiICsgaHJlZkF0dHJpYnV0ZVZhbHVlICsgIiBjYW4gbm90IGZpbmQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG1hdGNoaW5nIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgaGF2ZSB0byByZW1vdmUgdGhlIGhyZWZBdHRyaWJ1dGUgYW5kIGFkZCBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IGJlaW5nIHByb2NjZXNlZAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9Qcm9jZXNzLnJlbW92ZUF0dHJpYnV0ZShocmVmQXR0cmlidXRlKTsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGNsb25lZFJlZmVyZW5jZUVsZW1lbnQgPSBnZXRDbG9uZWRPTUVsZW1lbnQocmVmZXJlZE9NRWxlbWVudCwgb21GYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgT01Ob2RlIG9tTm9kZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNsb25lZFJlZmVyZW5jZUVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbU5vZGUgPSAoT01Ob2RlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb1Byb2Nlc3MuYWRkQ2hpbGQob21Ob2RlLmRldGFjaCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xvbmVkUmVmZXJlbmNlRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgb21BdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgdG8gcG9wdWxhdGUgdGhlIGlkIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbUF0dHJpYnV0ZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImlkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9Qcm9jZXNzLmFkZEF0dHJpYnV0ZShvbUF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjYWxsIHJlY3Vyc2l2ZWx5IHRvIHByb2NlcyBhbGwgZWxlbWVudHMKLSAgICAgICAgT01FbGVtZW50IGNoaWxkT01FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvUHJvY2Vzcy5nZXRDaGlsZEVsZW1lbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgY2hpbGRPTUVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHByb2Nlc3NIcmVmQXR0cmlidXRlcyhpZEFuZE9NRWxlbWVudE1hcCwgY2hpbGRPTUVsZW1lbnQsIG9tRmFjdG9yeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGFuIGNsb25lZCBvbSBlbGVtZW50IGZvciB0aGlzIE9NRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudAotICAgICAqIEByZXR1cm4gY2xvbmVkIG9tRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdldENsb25lZE9NRWxlbWVudChPTUVsZW1lbnQgb21FbGVtZW50LCBPTUZhY3Rvcnkgb21GYWN0b3J5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPTUVsZW1lbnQgbmV3T01FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChvbUVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0KLSAgICAgICAgLy8gY29weWluZyBhdHRyaWJ1dGVzCi0gICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlID0gbnVsbDsKLSAgICAgICAgT01BdHRyaWJ1dGUgbmV3T01BdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbUVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIG9tQXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghb21BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKS5lcXVhbHMoImlkIikpIHsKLSAgICAgICAgICAgICAgICBuZXdPTUF0dHJpYnV0ZSA9IG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tQXR0cmlidXRlLmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgb21BdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBvbUF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBuZXdPTUVsZW1lbnQuYWRkQXR0cmlidXRlKG5ld09NQXR0cmlidXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBPTU5vZGUgb21Ob2RlID0gbnVsbDsKLSAgICAgICAgT01UZXh0IG9tVGV4dCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9tRWxlbWVudC5nZXRDaGlsZHJlbigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIG9tTm9kZSA9IChPTU5vZGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9tTm9kZSBpbnN0YW5jZW9mIE9NVGV4dCkgewotICAgICAgICAgICAgICAgIG9tVGV4dCA9IChPTVRleHQpIG9tTm9kZTsKLSAgICAgICAgICAgICAgICBuZXdPTUVsZW1lbnQuYWRkQ2hpbGQob21GYWN0b3J5LmNyZWF0ZU9NVGV4dChvbVRleHQuZ2V0VGV4dCgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9tTm9kZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgIG5ld09NRWxlbWVudC5hZGRDaGlsZChnZXRDbG9uZWRPTUVsZW1lbnQoKE9NRWxlbWVudCkgb21Ob2RlLCBvbUZhY3RvcnkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5rbm93biBjaGlsZCBlbGVtZW50IHR5cGUgPT0+ICIgKyBvbU5vZGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdPTUVsZW1lbnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTmFtZWRTdGF4T01CdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvTmFtZWRTdGF4T01CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODYyZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL05hbWVkU3RheE9NQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lZFN0YXhPTUJ1aWxkZXIgewotCi0gICAgLy93cmFwIGEgU3RBWE9NQnVpbGRlcgotICAgIHByaXZhdGUgU3RBWE9NQnVpbGRlciBidWlsZGVyOwotICAgIHByaXZhdGUgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKLSAgICBwcml2YXRlIFFOYW1lIG5hbWVUb01hdGNoOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHhtbFN0cmVhbVJlYWRlcgotICAgICAqIEBwYXJhbSBuYW1lVG9NYXRjaAotICAgICAqLwotICAgIHB1YmxpYyBOYW1lZFN0YXhPTUJ1aWxkZXIoWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciwgUU5hbWUgbmFtZVRvTWF0Y2gpIHsKLSAgICAgICAgcmVhZGVyID0geG1sU3RyZWFtUmVhZGVyOwotICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoeG1sU3RyZWFtUmVhZGVyKTsKLSAgICAgICAgdGhpcy5uYW1lVG9NYXRjaCA9IG5hbWVUb01hdGNoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoKSB7Ci0gICAgICAgIC8vZm9yY2UgdG8gYnVpbGQgd2l0aGluIHRoZSBnaXZlbiBRTmFtZQotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgaW50IGRlcHRoID0gMDsKLSAgICAgICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyLmdldEV2ZW50VHlwZSgpID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGRlcHRoLS07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIGRlcHRoKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwICYmIHJlYWRlci5nZXRFdmVudFR5cGUoKSA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQgJiYKLSAgICAgICAgICAgICAgICAgICAgbmFtZVRvTWF0Y2guZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2NGI4MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBBIHN0YXRlIG1hY2hpbmUgdGhhdCByZWFkcyBhcnJheXMgd2l0aCBzaW1wbGUgY29udGVudC4gcmV0dXJucyBhIHN0cmluZyBhcnJheSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lIGltcGxlbWVudHMgU3RhdGVzLCBDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50TmFtZVRvVGVzdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFN0YXRlID0gSU5JVF9TVEFURTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbmlsbGFibGUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5iZUFic2VudCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKiogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmdzICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFRleHRBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoKSB7Ci0gICAgICAgIG5pbGxhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmJlQWJzZW50KCkgewotICAgICAgICByZXR1cm4gY2FuYmVBYnNlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FuYmVBYnNlbnQoYm9vbGVhbiBjYW5iZUFic2VudCkgewotICAgICAgICB0aGlzLmNhbmJlQWJzZW50ID0gY2FuYmVBYnNlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBtYWNoaW5lLiBPbmNlIHRoZSByZXNldCBpcyBjYWxsZWQgdGhlIHN0YXRlIG1hY2hpbmUgaXMgZ29vZCBlbm91Z2ggZm9yIGEKLSAgICAgKiBmcmVzaCBydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZWxlbWVudE5hbWVUb1Rlc3QgPSBudWxsOwotICAgICAgICBjdXJyZW50U3RhdGUgPSBJTklUX1NUQVRFOwotICAgICAgICBuaWxsYWJsZSA9IGZhbHNlOwotICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lVG9UZXN0KFFOYW1lIGVsZW1lbnROYW1lVG9UZXN0KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudE5hbWVUb1Rlc3QgPSBlbGVtZW50TmFtZVRvVGVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwdWJsaWMgcmVhZCBtZXRob2QgLSByZWFkcyBhIGdpdmVuIHJlYWRlciB0byBleHRyYWN0IHRoZSB0ZXh0IHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZChYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0ZShyZWFkZXIpOwotCi0gICAgICAgICAgICAvL3Rlc3QgZm9yIHRoZSBuaWxsYWJsZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9GT1VORF9TVEFURSAmJgotICAgICAgICAgICAgICAgICAgICBuaWxsYWJsZSkgewotICAgICAgICAgICAgICAgIGlmIChUUlVFLmVxdWFscyhyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoWFNJX05BTUVTUEFDRSwgTklMKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vZm9yY2UgdGhlIHN0YXRlIHRvIGJlIG51bGwgZm91bmQKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gTlVMTEVEX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBURVhUX0ZPVU5EX1NUQVRFKSB7Ci0gICAgICAgICAgICAgICAgLy9yZWFkIHRoZSB0ZXh0IHZhbHVlIGFuZCBzdG9yZSBpdCBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJlYWRlci5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9pbmNyZW1lbnQgdGhlIHBhcnNlciBvbmx5IGlmIHRoZSAgc3RhdGUgaXMKLSAgICAgICAgICAgIC8vbm90IGZpbmlzaGVkCi0gICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlICE9IEZJTklTSEVEX1NUQVRFCi0gICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRTdGF0ZSAhPSBJTExFR0FMX1NUQVRFKSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IHdoaWxlIChjdXJyZW50U3RhdGUgIT0gRklOSVNIRURfU1RBVEUKLSAgICAgICAgICAgICAgICAmJiBjdXJyZW50U3RhdGUgIT0gSUxMRUdBTF9TVEFURSk7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBJTExFR0FMX1NUQVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSWxsZWdhbCBzdGF0ZSEiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBldmVudCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLQotICAgICAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgewotCi0gICAgICAgICAgICBjYXNlIElOSVRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9ET0NVTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVEVEX1NUQVRFOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lVG9UZXN0LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBUlRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgZm91bmQgYSBzdGFydCBlbGVtZW50IHRoYXQgZG9lcyBub3QgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgbmFtZSBvZiB0aGUgZWxlbWVudAotCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBjYW5iZUFic2VudCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTklTSEVEX1NUQVRFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlRFRF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGVuZCBlbGVtZW50IGlzIGZvdW5kIGF0IHRoZSBpbml0IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBicmVhayB0aGUgcHJvY2VzcyBoZXJlID8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50TmFtZVRvVGVzdC5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IEZJTklTSEVEX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVJURURfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBJTExFR0FMX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRklOSVNIRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFRFWFRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRFWFRfRk9VTkRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBFTkRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IElMTEVHQUxfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vYW5vdGhlciBjaGFyIGV2ZW50IC0KLSAgICAgICAgICAgICAgICAgICAgLy9zbyBhcHBlbmQgaXQgdG8gdGhlIGN1cnJlbnQgdGV4dAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTlVMTEVEX1NUQVRFOgotICAgICAgICAgICAgICAgIC8vcmVhZCB1cHRvIHRoZSBlbmQgYW5kIHNldCB0aGUgc3RhdGUgdG8gRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEUKLSAgICAgICAgICAgICAgICB3aGlsZSAoZXZlbnQgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX0ZPVU5EX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICAvL3Jlc3RhcnQgdGhlIHBhcnNpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lVG9UZXN0LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBUlRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IEZJTklTSEVEX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vYW5vdGhlciBlbmQgZWxlbWVudCBmb3VuZCBhZnRlciBlbmQtZWxlbWVudAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IEZJTklTSEVEX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAvL2VuZCAgZG9jdW1lbnQgZm91bmQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotCi0gICAgICAgICAgICAgICAgLy9jaGFyYWN0ZXJzIGZvdW5kIC0gaWYgdGhpcyBpcyBhIGNoYXJhY3RlcnMgZXZlbnQgdGhhdCB3YXMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgdGhlbgotICAgICAgICAgICAgICAgIC8vaXQgd291bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBpZ25vcmFibGUKLSAgICAgICAgICAgICAgICAvL3doaXRlc3BhY2UgYW5kIGlmIG5vdCBwdXNoIHRoZSBzdGF0ZSBtYWNoaW5lIHRvIGEgaWxsZWdhbCBzdGF0ZS4KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlIHRleHQgaXMgZW1wdHkgLSBkb24ndCBjaGFuZ2UgdGhlIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3dlIGRvIE5PVCBoYW5kbGUgbWl4ZWQgY29udGVudAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gSUxMRUdBTF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gSUxMRUdBTF9TVEFURTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZThkMzhlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotLyoqCi0gKiBBIHN0YXRlIG1hY2hpbmUgdG8gcmVhZCBlbGVtZW50cyB3aXRoIHNpbXBsZSBjb250ZW50LiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGFuZCB0aGUKLSAqIHN0cmVhbSByZWFkZXIgd2lsbCBiZSBvbmUgZXZlbnQgYmV5b25kIHRoZSBlbmQgZWxlbWVudCBhdCByZXR1cm4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUgaW1wbGVtZW50cyBTdGF0ZXMsIENvbnN0YW50cyB7Ci0KLQotICAgIHByaXZhdGUgUU5hbWUgZWxlbWVudE5hbWVUb1Rlc3QgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZSA9IElOSVRfU1RBVEU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICIiOwotICAgIHByaXZhdGUgYm9vbGVhbiBlbGVtZW50U2tpcHBlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50U2tpcHBlZCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRTa2lwcGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKiogc2V0cyB0aGUgbmlsbGFibGUgZmxhZyAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5pbGxhYmxlKCkgewotICAgICAgICBuaWxsYWJsZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhlIFFuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGJlIHRlc3RlZAotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lVG9UZXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVUb1Rlc3QoUU5hbWUgZWxlbWVudE5hbWVUb1Rlc3QpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZVRvVGVzdCA9IGVsZW1lbnROYW1lVG9UZXN0OwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXRzIHRoZSBzdGF0ZSBtYWNoaW5lLiBPbmNlIHRoZSByZXNldCBpcyBjYWxsZWQgdGhlIHN0YXRlIG1hY2hpbmUgaXMgZ29vZCBlbm91Z2ggZm9yIGEKLSAgICAgKiBmcmVzaCBydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZWxlbWVudE5hbWVUb1Rlc3QgPSBudWxsOwotICAgICAgICBjdXJyZW50U3RhdGUgPSBJTklUX1NUQVRFOwotICAgICAgICBuaWxsYWJsZSA9IGZhbHNlOwotICAgICAgICB0ZXh0ID0gIiI7Ci0gICAgICAgIGVycm9yTWVzc2FnZSA9ICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHB1YmxpYyByZWFkIG1ldGhvZCAtIHJlYWRzIGEgZ2l2ZW4gcmVhZGVyIHRvIGV4dHJhY3QgdGhlIHRleHQgdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlKHJlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vdGVzdCBmb3IgdGhlIG5pbGxhYmxlIGF0dHJpYnV0ZQotICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFICYmCi0gICAgICAgICAgICAgICAgICAgIG5pbGxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRSVUUuZXF1YWxzKHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShYU0lfTkFNRVNQQUNFLCBOSUwpKSkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgLy9mb3JjZSB0aGUgc3RhdGUgdG8gYmUgbnVsbCBmb3VuZAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBOVUxMRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IFRFWFRfRk9VTkRfU1RBVEUpIHsKLSAgICAgICAgICAgICAgICAvL3JlYWQgdGhlIHRleHQgdmFsdWUgYW5kIHN0b3JlIGl0Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHJlYWRlci5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlICE9IEZJTklTSEVEX1NUQVRFCi0gICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRTdGF0ZSAhPSBJTExFR0FMX1NUQVRFKSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IHdoaWxlIChjdXJyZW50U3RhdGUgIT0gRklOSVNIRURfU1RBVEUKLSAgICAgICAgICAgICAgICAmJiBjdXJyZW50U3RhdGUgIT0gSUxMRUdBTF9TVEFURSk7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PSBJTExFR0FMX1NUQVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSWxsZWdhbCBzdGF0ZSEiICsgZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBzdGF0ZSBkZXBlbmRpbmcgb24gdGhlIHBhcnNlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGV2ZW50ID0gcmVhZGVyLmdldEV2ZW50VHlwZSgpOwotCi0KLSAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5JVF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFNUQVJURURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIC8vc3RhcnQgZWxlbWVudCBmb3VuZCBhdCBpbml0Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVUb1Rlc3QuZXF1YWxzKHJlYWRlci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBUlRFRF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGVuZCBlbGVtZW50IGlzIGZvdW5kIGF0IHRoZSBpbml0IHN0YXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBicmVhayB0aGUgcHJvY2VzcyBoZXJlID8KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRklOSVNIRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTa2lwcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBUlRFRF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lVG9UZXN0LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU1RBUlRfRUxFTUVOVF9GT1VORF9TVEFURTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUykgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBURVhUX0ZPVU5EX1NUQVRFOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZm9yY2UgdGhlIHRleHQgdG8gYmUgZW1wdHkhCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lVG9UZXN0LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBJTExFR0FMX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIldyb25nIGVsZW1lbnQgbmFtZSAiICsgcmVhZGVyLmdldE5hbWUoKTsgIC8vdG9kbyBJMThuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBURVhUX0ZPVU5EX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lVG9UZXN0LmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBJTExFR0FMX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJXcm9uZyBlbGVtZW50IG5hbWUgIiArIHJlYWRlci5nZXROYW1lKCk7ICAvL3RvZG8gSTE4biB0aGlzCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgcmVhZGVyLmdldFRleHQoKTsgIC8vYXBwZW5kIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vZG8gbm90IGNoYW5nZSB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRklOSVNIRURfU1RBVEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvL3RoZSBlbGVtZW50IHdhcyBmb3VuZCB0byBiZSBudWxsIGFuZCB0aGlzIHN0YXRlIHdhcyBmb3JjZWQuCi0gICAgICAgICAgICAgICAgLy93ZSBhcmUgc3VyZSBoZXJlIHRoYXQgdGhlIHBhcnNlciB3YXMgYXQgdGhlCi0gICAgICAgICAgICAgICAgLy9TVEFSVF9FTEVNRU5UX0ZPVU5EX1NUQVRFIGJlZm9yZQotICAgICAgICAgICAgICAgIC8vYmVpbmcgZm9yY2VkLiBIZW5jZSB3ZSBuZWVkIHRvIGFkdmFuY2UgdGhlIHBhcnNlciB1cHRvIHRoZQotICAgICAgICAgICAgICAgIC8vIGVuZCBlbGVtZW50IGFuZCBzZXQgdGhlIHN0YXRlIHRvIGJlIGVuZCBlbGVtZW50IGZvdW5kCi0gICAgICAgICAgICBjYXNlIE5VTExFRF9TVEFURToKLSAgICAgICAgICAgICAgICB3aGlsZSAoZXZlbnQgIT0gWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gRU5EX0VMRU1FTlRfRk9VTkRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbUNvbnN0YW50cy5DSEFSQUNURVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSB0ZXh0IGlzIGVtcHR5IC0gZG9uJ3QgY2hhbmdlIHRoZSBzdGF0ZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy93ZSBkbyBOT1QgaGFuZGxlIG1peGVkIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IElMTEVHQUxfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiTWl4ZWQgQ29udGVudCAiICsgcmVhZGVyLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IElMTEVHQUxfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJDdXJyZW50IHN0YXRlIGlzICIgKyBjdXJyZW50U3RhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1N0YXRlcy5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1N0YXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzViMjE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TdGF0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotcHVibGljIGludGVyZmFjZSBTdGF0ZXMgewotCi0gICAgc3RhdGljIGludCBJTklUX1NUQVRFID0gLTE7Ci0gICAgc3RhdGljIGludCBTVEFSVEVEX1NUQVRFID0gMDsKLSAgICBzdGF0aWMgaW50IFNUQVJUX0VMRU1FTlRfRk9VTkRfU1RBVEUgPSAxOwotICAgIHN0YXRpYyBpbnQgVEVYVF9GT1VORF9TVEFURSA9IDI7Ci0gICAgc3RhdGljIGludCBFTkRfRUxFTUVOVF9GT1VORF9TVEFURSA9IDM7Ci0gICAgc3RhdGljIGludCBGSU5JU0hFRF9TVEFURSA9IDQ7Ci0gICAgc3RhdGljIGludCBJTExFR0FMX1NUQVRFID0gNTsKLSAgICBzdGF0aWMgaW50IENPTlRFTlRfRk9VTkRfU1RBVEUgPSA2OwotICAgIHN0YXRpYyBpbnQgTlVMTEVEX1NUQVRFID0gNzsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJEYXRhSGFuZGxlclN0cmVhbVJlYWRlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJEYXRhSGFuZGxlclN0cmVhbVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDRhYmQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCRGF0YUhhbmRsZXJTdHJlYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQURCRGF0YUhhbmRsZXJTdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBBREJYTUxTdHJlYW1SZWFkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UX1NUQVRFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9TVEFURSA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORF9FTEVNRU5UX1NUQVRFID0gMjsKLQotICAgIHByaXZhdGUgQURCTmFtZXNwYWNlQ29udGV4dCBuYW1lc3BhY2VDb250ZXh0ID0KLSAgICAgICAgICAgIG5ldyBBREJOYW1lc3BhY2VDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7Ci0gICAgcHJpdmF0ZSBEYXRhSGFuZGxlciB2YWx1ZTsKLQotICAgIHByaXZhdGUgaW50IHN0YXRlID0gU1RBUlRfRUxFTUVOVF9TVEFURTsKLSAgICAvL2luaXRpYXRlIGF0IHRoZSBzdGFydCBlbGVtZW50IHN0YXRlCi0KLSAgICAvL2tlZXBzIHRyYWNrIHdoZXRoZXIgdGhlIG5hbWVzcGFjZSBpcyBkZWNsYXJlZAotICAgIC8vZmFsc2UgYnkgZGVmYXVsdAotICAgIHByaXZhdGUgYm9vbGVhbiBuc0RlY2xhcmVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgQURCRGF0YUhhbmRsZXJTdHJlYW1SZWFkZXIoUU5hbWUgbmFtZSwgRGF0YUhhbmRsZXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRlZFRleHQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByaWdodCBwcm9wZXJ0aWVzIGZvciB0aGUgb3B0aW1pemF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcEtleQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcEtleSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChPUFRJTUlaQVRJT05fRU5BQkxFRC5lcXVhbHMocHJvcEtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChJU19CSU5BUlkuZXF1YWxzKHByb3BLZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoREFUQV9IQU5ETEVSLmVxdWFscyhwcm9wS2V5KSkgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vIG5lZWQgdG8gaGFuZGxlIG51bGwgaGVyZS4gaXQgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkCi0gICAgICAgIC8vYWxyZWFkeQotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBURVhUX1NUQVRFOwotICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICAgICAgY2FzZSBFTkRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICAvL29vcHMsIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4hCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiZW5kIGFscmVhZHkgcmVhY2hlZCEiKTsKLSAgICAgICAgICAgIGNhc2UgVEVYVF9TVEFURToKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigidW5rbm93biBldmVudCB0eXBlISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgaSwgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vdCBpbXBsZW1lbnRlZAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIC8vbW92ZSB0byB0aGUgZW5kIHN0YXRlIGFuZCByZXR1cm4gdGhlIHZhbHVlCi0gICAgICAgICAgICBzdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgaWYgKGNvbnZlcnRlZFRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnZlcnRlZFRleHQgPSBDb252ZXJ0ZXJVdGlsLmdldFN0cmluZ0Zyb21EYXRhaGFuZGxlcih2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udmVydGVkVGV4dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOy8vdG9kbwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSAhPSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9EbyBub3RoaW5nIC0gd2UndmUgbm90aGluZyB0byBmcmVlIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IFRFWFRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy9ubyB3aGl0ZXNwYWNlcyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgaSkgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vbm8gYXR0cmlicyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIChuc0RlY2xhcmVkKSA/IDEgOiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIHJldHVybiAobnNEZWNsYXJlZCAmJiBpID09IDApID8gbmFtZS5nZXRQcmVmaXgoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChuc0RlY2xhcmVkICYmIGkgPT0gMCkgPyBuYW1lLmdldE5hbWVzcGFjZVVSSSgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0VMRU1FTlQ7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgVEVYVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUkFDVEVSUzsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy93ZSd2ZSBubyBpZGVhIHdoYXQgdGhpcyBpcyEhISEhCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRUZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuZ2V0U3RyaW5nRnJvbURhdGFoYW5kbGVyKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRUZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRUZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuZ2V0U3RyaW5nRnJvbURhdGFoYW5kbGVyKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRUZXh0LnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gY2hhcnMsIGludCBpMSwgaW50IGkyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3QgaW1wbGVtZW50ZWQKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0ZWRUZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWwuZ2V0U3RyaW5nRnJvbURhdGFoYW5kbGVyKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZWRUZXh0Lmxlbmd0aCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IFRFWFRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgIT0gVEVYVF9TVEFURSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7ICAvL3RvZG8gMS4wID8KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZUNvbnRleHQuc2V0UGFyZW50TnNDb250ZXh0KG5zQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgLy9qdXN0IGFkZCB0aGUgY3VycmVudCBlbGVtZW50cyBuYW1lc3BhY2UgYW5kIHByZWZpeCB0byB0aGUgdGhpcwotICAgICAgICAvL2VsZW1lbnRzIG5zY29udGV4dAotICAgICAgICBhZGRUb05zTWFwKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICogQHBhcmFtIHVyaQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRUb05zTWFwKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgLy90b2RvIC0gbmVlZCB0byBmaXggdGhpcyB1cCB0byBjYXRlciBmb3IgY2FzZXMgd2hlcmUKLSAgICAgICAgLy9uYW1lc3BhY2VzIGFyZSBoYXZpbmcgIG5vIHByZWZpeGVzCi0gICAgICAgIGlmICghdXJpLmVxdWFscyhuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKSkgewotICAgICAgICAgICAgLy90aGlzIG5hbWVzcGFjZSBpcyBub3QgdGhlcmUuIE5lZWQgdG8gZGVjbGFyZSBpdAotICAgICAgICAgICAgbmFtZXNwYWNlQ29udGV4dC5wdXNoTmFtZXNwYWNlKHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgIG5zRGVjbGFyZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCTmFtZXNwYWNlQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJOYW1lc3BhY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDk2M2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJOYW1lc3BhY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5BcnJheVN0YWNrOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQURCTmFtZXNwYWNlQ29udGV4dCBpbXBsZW1lbnRzIE5hbWVzcGFjZUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBOYW1lc3BhY2VDb250ZXh0IHBhcmVudE5zQ29udGV4dDsKLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldFBhcmVudE5zQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudE5zQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnROc0NvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBwYXJlbnROc0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnROc0NvbnRleHQgPSBwYXJlbnROc0NvbnRleHQ7Ci0gICAgfQotCi0gICAgLy9LZWVwIHR3byBhcnJheWxpc3RzIGZvciB0aGUgcHJlZml4ZXMgYW5kIG5hbWVzcGFjZXMuIFRoZXkgc2hvdWxkIGJlIGluIHN5bmMKLSAgICAvL3NpbmNlIHRoZSBpbmRleCBvZiB0aGUgZW50cnkgd2lsbCBiZSB1c2VkIHRvIHJlbGF0ZSB0aGVtCi0gICAgLy91c2UgdGhlIG1pbmltdW0gaW5pdGlhbCBjYXBhY2l0eSB0byBsZXQgdGhpbmdzIGhhbmRsZSBtZW1vcnkgYmV0dGVyCi0KLSAgICBwcml2YXRlIEFycmF5U3RhY2sgcHJlZml4U3RhY2sgPSBuZXcgQXJyYXlTdGFjaygpOwotICAgIHByaXZhdGUgQXJyYXlTdGFjayB1cmlTdGFjayA9IG5ldyBBcnJheVN0YWNrKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG5hbWVzcGFjZSBpbiB0aGlzIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVzaE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIHByZWZpeFN0YWNrLnB1c2gocHJlZml4KTsKLSAgICAgICAgdXJpU3RhY2sucHVzaCh1cmkpOwotCi0gICAgfQotCi0gICAgLyoqIFBvcCBhIG5hbWVzcGFjZSAqLwotICAgIHB1YmxpYyB2b2lkIHBvcE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcHJlZml4U3RhY2sucG9wKCk7Ci0gICAgICAgIHVyaVN0YWNrLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgLy9kbyB0aGUgY29ycmVjdGlvbnMgYXMgcGVyIHRoZSBqYXZhZG9jCi0gICAgICAgIGlmIChwcmVmaXhTdGFjay5jb250YWlucyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBwcmVmaXhTdGFjay5pbmRleE9mKHByZWZpeCk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZyl1cmlTdGFjay5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnROc0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5zQ29udGV4dC5nZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgdXJpKSB7Ci0gICAgICAgIC8vZG8gdGhlIGNvcnJlY3Rpb25zIGFzIHBlciB0aGUgamF2YWRvYwotICAgICAgICBpbnQgaW5kZXggPSB1cmlTdGFjay5pbmRleE9mKHVyaSk7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpcHJlZml4U3RhY2suZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnROc0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5zQ29udGV4dC5nZXRQcmVmaXgodXJpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJlZml4ZXMoU3RyaW5nIHVyaSkgewotICAgICAgICAvL2NyZWF0ZSBhbiBhcnJheWxpc3QgdGhhdCBjb250YWlucyB0aGUgcmVsZXZhbnQgcHJlZml4ZXMKLSAgICAgICAgU3RyaW5nW10gdXJpcyA9IChTdHJpbmdbXSl1cmlTdGFjay50b0FycmF5KG5ldyBTdHJpbmdbdXJpU3RhY2suc2l6ZSgpXSk7Ci0gICAgICAgIEFycmF5TGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodXJpc1tpXS5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgICAgIHRlbXBMaXN0LmFkZChwcmVmaXhTdGFjay5nZXQoaSkpOwotICAgICAgICAgICAgICAgIC8vd2UgYXNzdW1lIHRoYXQgYXJyYXkgY29udmVyc2lvbiBwcmVzZXJ2ZXMgdGhlIG9yZGVyCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9ieSBub3cgYWxsIHRoZSByZWxldmFudCBwcmVmaXhlcyBhcmUgY29sbGVjdGVkCi0gICAgICAgIC8vbWFrZSBhIG5ldyBpdGVyYXRvciBhbmQgcHJvdmlkZSBhIHdyYXBwZXIgaXRlcmF0b3IgdG8KLSAgICAgICAgLy9vYmV5IHRoZSBjb250cmFjdCBvbiB0aGUgQVBJCi0gICAgICAgIHJldHVybiBuZXcgV3JhcHBpbmdJdGVyYXRvcih0ZW1wTGlzdC5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgV3JhcHBpbmdJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotICAgICAgICBwcml2YXRlIEl0ZXJhdG9yIGNvbnRhaW5lZEl0ZXJhdG9yID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgV3JhcHBpbmdJdGVyYXRvcihJdGVyYXRvciBjb250YWluZWRJdGVyYXRvcikgewotICAgICAgICAgICAgdGhpcy5jb250YWluZWRJdGVyYXRvciA9IGNvbnRhaW5lZEl0ZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhdG9yIGdldENvbnRhaW5lZEl0ZXJhdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lZEl0ZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVkSXRlcmF0b3IoSXRlcmF0b3IgY29udGFpbmVkSXRlcmF0b3IpIHsKLSAgICAgICAgICAgIHRoaXMuY29udGFpbmVkSXRlcmF0b3IgPSBjb250YWluZWRJdGVyYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBcyBwZXIgdGhlIGNvbnRyYWN0IG9uIHRoZSBBUEkgb2YgTmFtZXNwYWNlIGNvbnRleHQgdGhlIHJldHVybmVkIGl0ZXJhdG9yIHNob3VsZCBiZQotICAgICAgICAgKiBpbW11dGFibGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250YWluZWRJdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFpbmVkSXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJYTUxTdHJlYW1SZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCWE1MU3RyZWFtUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDk1MjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJYTUxTdHJlYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotcHVibGljIGludGVyZmFjZSBBREJYTUxTdHJlYW1SZWFkZXIgZXh0ZW5kcyBYTUxTdHJlYW1SZWFkZXIsIENvbnN0YW50cyB7Ci0KLSAgICAvLyB0aGlzIHdpbGwgaGVscCB0byBoYW5kbGUgVGV4dCB3aXRoaW4gdGhlIGN1cnJlbnQgZWxlbWVudC4KLSAgICAvLyB1c2VyIHNob3VsZCBwYXNzIHRoZSBlbGVtZW50IHRleHQgdG8gdGhlIHByb3BlcnR5IGxpc3QgYXMgdGhpcwotICAgIC8vIEVMRU1FTlRfVEVYVCBhcyB0aGUga2V5LiBUaGlzIGtleSBkZWxpYmVyYXRlbHkgaGFzIGEgc3BhY2UgaW4gaXQKLSAgICAvLyBzbyB0aGF0IGl0IGlzIG5vdCBhIHZhbGlkIFhNTCBuYW1lCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RFWFQgPSAiRWxlbWVudCBUZXh0IjsKLQotICAgIC8qKiBFeHRyYSBtZXRob2QgdG8gcXVlcnkgdGhlIHN0YXRlIG9mIHRoZSBwdWxscGFyc2VyICovCi0gICAgYm9vbGVhbiBpc0RvbmUoKTsKLQotICAgIC8qKiBhZGQgdGhlIHBhcmVudCBuYW1lc3BhY2UgY29udGV4dCB0byB0aGlzIHBhcnNlciAqLwotICAgIHZvaWQgYWRkTmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWF0ZSB0aGUgcGFyc2VyIC0gdGhpcyB3aWxsIGRvIHdoYXRldmVyIHRoZSBuZWVkZWQgdGFza3MgdG8gaW5pdGlhdGUgdGhlIHBhcnNlciBhbmQgbXVzdAotICAgICAqIGJlIGNhbGxlZCBiZWZvcmUgYXR0ZW1wdGluZyBhbnkgc3BlY2lmaWMgcGFyc2luZyB1c2luZyB0aGlzIHBhcnNlcgotICAgICAqLwotICAgIHZvaWQgaW5pdCgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9BREJYTUxTdHJlYW1SZWFkZXJJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQlhNTFN0cmVhbVJlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3NGM1ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQlhNTFN0cmVhbVJlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwudXRpbC5PTVNlcmlhbGl6ZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVtYXBwaW5nLlNpbXBsZVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuVHlwZVRhYmxlOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQURCcHVsbGFwYXJzZXIuIFRoZSBhcHByb2FjaCBoZXJlIGlzIHNpbXBsZSBXaGVuIHRoZSBwdWxsCi0gKiBwYXJzZXIgbmVlZHMgdG8gZ2VuZXJhdGUgZXZlbnRzIGZvciBhIHBhcnRpY3VsYXIgbmFtZS12YWx1ZShzKSBwYWlyIGl0IGFsd2F5cyBoYW5kZXMgb3ZlcgotICogKGRlbGVnYXRlcykgdGhlIHRhc2sgdG8gYW5vdGhlciBwdWxsIHBhcnNlciB3aGljaCBrbm93cyBob3cgdG8gZGVhbCB3aXRoIGl0IFRoZSBjb21tb24gdHlwZXMgb2YKLSAqIG5hbWUgdmFsdWUgcGFpcnMgd2UnbGwgY29tZSBhY3Jvc3MgYXJlIDEuIFN0cmluZyBuYW1lL1FOYW1lIG5hbWUgLSBTdHJpbmcgdmFsdWUgMi4gU3RyaW5nCi0gKiBuYW1lL1FOYW1lIG5hbWUgLSBTdHJpbmdbXSB2YWx1ZSAzLiBPTUVsZW1lbnRrZXkgLSBPTUVsZW1lbnQgdmFsdWUgNC4gUU5hbWUgbmFtZS9TdHJpbmcgbmFtZSAgLQotICogQURCQmVhbiB2YWx1ZSA1LiBRTmFtZSBuYW1lL1N0cmluZyBuYW1lICAtIEphdmEgYmVhbiA1LiBRTmFtZSBuYW1lL1N0cmluZyBuYW1lICAtIERhdGFoYW5kbGVyCi0gKiA8cC8+Ci0gKiBBcyBmb3IgdGhlIGF0dHJpYnV0ZXMsIHRoZXNlIGFyZSB0aGUgcG9zc2libGUgY29tYmluYXRpb25zIGluIHRoZSBhcnJheSAxLiBTdHJpbmcgbmFtZS9RTmFtZSBuYW1lCi0gKiAtIFN0cmluZyB2YWx1ZSAyLiBPTUF0dHJpYnV0ZUtleSAtIE9NQXR0cmlidXRlCi0gKiA8cC8+Ci0gKiBOb3RlIHRoYXQgY2VydGFpbiBhcnJheSBtZXRob2RzIGhhdmUgIGJlZW4gZGVsaWJlcmF0ZWx5IHJlbW92ZWQgdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gVGhlCi0gKiBnZW5lcmF0ZWQgY29kZSB3aWxsIHRha2UgdGhlIHRyb3VibGUgdG8gbGF5IHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgaW4gdGhlIGNvcnJlY3Qgb3JkZXIKLSAqIDxwLz4KLSAqIDxwLz4KLSAqIEhlbmNlIHRoZXJlIHdpbGwgYmUgYSBwYXJzZXIgaW1wbCB0aGF0IGtub3dzIGhvdyB0byBoYW5kbGUgdGhlc2UgdHlwZXMsIGFuZCB0aGlzIHBhcmVudCBwYXJzZXIKLSAqIHdpbGwgYWx3YXlzIGRlbGVnYXRlIHRoZXNlIHRhc2tzIHRvIHRoZSBjaGlsZCBwdWxscGFyYXNlcnMgaW4gZWZmZWN0IHRoaXMgaXMgb25lIGh1Z2Ugc3RhdGUKLSAqIG1hY2hpbmUgdGhhdCBoYXMgb25seSBhIGZldyBzdGF0ZXMgYW5kIGRlbGVnYXRlcyB0aGluZ3MgZG93biB0byB0aGUgY2hpbGQgcGFyc2VycyB3aGVuZXZlcgotICogcG9zc2libGUKLSAqIDxwLz4KLSAqLwotcHVibGljIGNsYXNzIEFEQlhNTFN0cmVhbVJlYWRlckltcGwgaW1wbGVtZW50cyBBREJYTUxTdHJlYW1SZWFkZXIgewotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBwcm9wZXJ0aWVzOwotICAgIHByaXZhdGUgT2JqZWN0W10gYXR0cmlidXRlczsKLSAgICBwcml2YXRlIFFOYW1lIGVsZW1lbnRRTmFtZTsKLQotICAgIC8vVGhpcyBpcyB0byBzdG9yZSB0aGUgUU5hbWUgd2hpY2ggYXJlIGluIHRoZSB0eXBlVGFibGUgYWZ0ZXIgc2V0dGluZyB0aGUgY29ycmVjdCBwcmVmaXgKLSAgICBwcml2YXRlIEhhc2hNYXAgcW5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy93ZSBhbHdheXMgY3JlYXRlIGEgbmV3IG5hbWVzcGFjZSBjb250ZXh0Ci0gICAgcHJpdmF0ZSBBREJOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQgPSBuZXcgQURCTmFtZXNwYWNlQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBNYXAgZGVjbGFyZWROYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLy9zdGF0ZXMgZm9yIHRoaXMgcHVsbHBhcnNlciAtIGl0IGNhbiBvbmx5IGhhdmUgZm91ciBzdGF0ZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfRUxFTUVOVF9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVORF9FTEVNRU5UX1NUQVRFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMRUdBVEVEX1NUQVRFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVYVF9TVEFURSA9IDM7Ci0KLSAgICAvL2ludGVnZXIgZmllbGQgdGhhdCBrZWVwcyB0aGUgc3RhdGUgb2YgdGhpcwotICAgIC8vcGFyc2VyLgotICAgIHByaXZhdGUgaW50IHN0YXRlID0gU1RBUlRfRUxFTUVOVF9TVEFURTsKLQotICAgIC8vcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCByZWFkZXIKLSAgICBwcml2YXRlIEFEQlhNTFN0cmVhbVJlYWRlciBjaGlsZFJlYWRlcjsKLQotICAgIC8vY3VycmVudCBwcm9wZXJ0eSBpbmRleAotICAgIC8vaW5pdGlhbGl6ZWQgYXQgemVybwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRQcm9wZXJ0eUluZGV4ID0gMDsKLQotICAgIC8vVG8ga2VlcCBlbGVtZW50IGZvcm1kZWZhdWx0IHF1YWxpZmllZCBvciBub3QKLSAgICBwcml2YXRlIGJvb2xlYW4gcXVhbGlmaWVkID0gZmFsc2U7Ci0KLSAgICAvL3RvIGtlZXAgdGhlIGN1cnJlbnQgdHlwZXMgd2hpY2ggYXJlIGluIEF4aXNTZXJ2aWNlCi0gICAgcHJpdmF0ZSBUeXBlVGFibGUgdHlwZVRhYmxlID0gbnVsbDsKLQotCi0gICAgLyoKLSAgICAgKiB3ZSBuZWVkIHRvIHBhc3MgaW4gYSBuYW1lc3BhY2UgY29udGV4dCBzaW5jZSB3aGVuIGRlbGVnYXRlZCwgd2UndmUgbm8KLSAgICAqIGlkZWEgb2YgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIGNvbnRleHQuIFNvIGl0IG5lZWRzIHRvIGJlIHBhc3NlZCBvbgotICAgICogaGVyZSEKLSAgICAqLwotICAgIHB1YmxpYyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKFFOYW1lIGFkYkJlYW5zUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIC8vdmFsaWRhdGUgdGhlIGxlbmd0aHMsIHNpbmNlIGJvdGggdGhlIGFycmF5cyBhcmUgc3VwcG9zZWQKLSAgICAgICAgLy90byBoYXZlCi0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgICAgIHRoaXMuZWxlbWVudFFOYW1lID0gYWRiQmVhbnNRTmFtZTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQURCWE1MU3RyZWFtUmVhZGVySW1wbChRTmFtZSBhZGJCZWFuc1FOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlVGFibGUgdHlwZVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkKSB7Ci0gICAgICAgIHRoaXMoYWRiQmVhbnNRTmFtZSwgcHJvcGVydGllcywgYXR0cmlidXRlcyk7Ci0gICAgICAgIHRoaXMucXVhbGlmaWVkID0gcXVhbGlmaWVkOwotICAgICAgICB0aGlzLnR5cGVUYWJsZSA9IHR5cGVUYWJsZTsKLSAgICAgICAgaWYodGhpcy50eXBlVGFibGUhPW51bGwpewotICAgICAgICAgICAgTWFwIGNvbXBsZXhUeXBlTWFwID0gdGhpcy50eXBlVGFibGUuZ2V0Q29tcGxleFNjaGVtYU1hcCgpOwotICAgICAgICAgICAgaWYoY29tcGxleFR5cGVNYXAgIT1udWxsKXsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBrZXlzID0gY29tcGxleFR5cGVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IChRTmFtZSkgY29tcGxleFR5cGVNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHFuYW1lICE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID1xbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeCA9PW51bGwgJiYgIiIuZXF1YWxzKHByZWZpeCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IE9NU2VyaWFsaXplclV0aWwuZ2V0TmV4dE5TUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSxxbmFtZS5nZXRMb2NhbFBhcnQoKSxwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlVGFibGUuZ2V0Q29tcGxleFNjaGVtYU1hcCgpLnB1dChrZXkscW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVNYXAucHV0KHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRUb05zTWFwKHByZWZpeCwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGFkZCB0aGUgbmFtZXNwYWNlIGNvbnRleHQgKi8KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHsKLSAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIG5hbWVzcGFjZSBjb250ZXh0IHBhc3NlZCBpbiB0byB0aGlzCi0gICAgICAgIHRoaXMubmFtZXNwYWNlQ29udGV4dC5zZXRQYXJlbnROc0NvbnRleHQobnNDb250ZXh0KTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogd2UgbmVlZCB0byBzcGxpdCBvdXQgdGhlIGNhbGxpbmcgdG8gdGhlIHBvcHVsYXRlIG5hbWVzcGFjZXMgc2VwZXJhdGVseSBzaW5jZSB0aGlzIG5lZWRzIHRvIGJlCi0gICAgICogZG9uZSAqYWZ0ZXIqIHNldHRpbmcgdGhlIHBhcmVudCBuYW1lc3BhY2UgY29udGV4dC4gV2UgY2Fubm90IGFzc3VtZSBpdCB3aWxsIGhhcHBlbiBhdAotICAgICAqIGNvbnN0cnVjdGlvbiEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgYW4gZXh0cmEgaXNzdWUgdG8gYXR0ZW5kIHRvLiB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0gICAgICAgIC8vIHByZWZpeGVzIGFuZCB1cmlzICh0aGUgY29tYmluYXRpb24pIGFuZCBwb3B1bGF0ZSBhIGhhc2htYXAgb2YKLSAgICAgICAgLy8gbmFtZXNwYWNlcy4gVGhlIGhhc2htYXAgb2YgbmFtZXNwYWNlcyB3aWxsIGJlIHVzZWQgdG8gc2VydmUgdGhlCi0gICAgICAgIC8vIG5hbWVzcGFjZSBjb250ZXh0Ci0KLSAgICAgICAgcG9wdWxhdGVOYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKE9QVElNSVpBVElPTl9FTkFCTEVELmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChJU19CSU5BUlkuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBpLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0b2RvIGltcGxlbWVudCB0aGUgcmlnaHQgY29udHJhY3QgZm9yIHRoaXMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0RWxlbWVudFRleHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0b2RvIGltcGxlbWVudCB0aGlzCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRSZWFkZXIuaXNEb25lKCkpIHsKLSAgICAgICAgICAgICAgICAvL3RoZSBjaGlsZCByZWFkZXIgaXMgZG9uZS4gV2Ugc2hvdWxkbid0IGJlIGdldHRpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy9oYXNuZXh0IHJlc3VsdCBmcm9tIHRoZSBjaGlsZCBwdWxscGFyc2VyIHRoZW4KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmhhc05leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURQotICAgICAgICAgICAgICAgICAgICB8fCBzdGF0ZSA9PSBURVhUX1NUQVRFKTsKLQotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL2RvIG5vdGhpbmcgaGVyZSAtIHdlIGhhdmUgbm8gcmVzb3VyY2VzIHRvIGZyZWUKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuaXNTdGFydEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5pc0VuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFIHx8IHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmlzQ2hhcmFjdGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUgfHwgc3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8vICBhdHRyaWJ1dGUgaGFuZGxpbmcKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5zVXJpLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0KLSAgICAgICAgaW50IGF0dHJpYkNvdW50ID0gZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICAgICAgU3RyaW5nIHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgUU5hbWUgYXR0cmliUXVhbGlmaWVkTmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBhdHRyaWJRdWFsaWZpZWROYW1lID0gZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgICAgIGlmIChuc1VyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoYXR0cmliUXVhbGlmaWVkTmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhhdHRyaWJRdWFsaWZpZWROYW1lLmdldExvY2FsUGFydCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbnNVcmkuZXF1YWxzKGF0dHJpYlF1YWxpZmllZE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpID8KLSAgICAgICAgICAgICAgICBjaGlsZFJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpIDoKLSAgICAgICAgICAgICAgICAoKGF0dHJpYnV0ZXMgIT0gbnVsbCkgJiYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpID8gYXR0cmlidXRlcy5sZW5ndGggLyAyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaSAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgoaSA+PSAoYXR0cmlidXRlcy5sZW5ndGggLyAyKSkgfHwgaSA8IDApIHsgLy9vdXQgb2YgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGF0dHJpYnV0ZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhdHRyaWJQb2ludGVyID0gYXR0cmlidXRlc1tpICogMl07Ci0gICAgICAgICAgICAgICAgICAgIC8vY2FzZSBvbmUgLSBhdHRyaWIgbmFtZSBpcyBudWxsCi0gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgdGhlIHBvaW50ZXIgdG8gdGhlIE9NQXR0cmlidXRlIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYlBvaW50ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9tQXR0cmliT2JqID0gYXR0cmlidXRlc1soaSAqIDIpICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob21BdHRyaWJPYmogPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKG9tQXR0cmliT2JqIGluc3RhbmNlb2YgT01BdHRyaWJ1dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3Jvbmcgb2JqZWN0IHNldCB0byBoYXZlIGluIHRoZSBhdHRyaWIgYXJyYXkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBieSBub3cgYnV0IGp1c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHQgPSAoT01BdHRyaWJ1dGUpb21BdHRyaWJPYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0LmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmliUG9pbnRlciBpbnN0YW5jZW9mIE9NQXR0cmliS2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb21BdHRyaWJPYmogPSBhdHRyaWJ1dGVzWyhpICogMikgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbUF0dHJpYk9iaiA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEob21BdHRyaWJPYmogaW5zdGFuY2VvZiBPTUF0dHJpYnV0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyBvYmplY3Qgc2V0IHRvIGhhdmUgaW4gdGhlIGF0dHJpYiBhcnJheSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGJ5IG5vdyBidXQganVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dCA9IChPTUF0dHJpYnV0ZSlvbUF0dHJpYk9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSB0d28gLSBhdHRyaWIgbmFtZSBpcyBhIHBsYWluIHN0cmluZwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYlBvaW50ZXIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoKFN0cmluZylhdHRyaWJQb2ludGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJQb2ludGVyIGluc3RhbmNlb2YgUU5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUU5hbWUpYXR0cmliUG9pbnRlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOy8vYXMgcGVyIHRoZSBhcGkgY29udHJhY3QKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBnZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGdldEF0dHJpYnV0ZU5hbWUoaSk7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy9ub3Qgc3VwcG9ydGVkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoKGkgPj0gKGF0dHJpYnV0ZXMubGVuZ3RoIC8gMikpIHx8IGkgPCAwKSB7IC8vb3V0IG9mIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBhdHRyaWJ1dGUgcG9pbnRlcgotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXR0cmliUG9pbnRlciA9IGF0dHJpYnV0ZXNbaSAqIDJdOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb21BdHRyaWJPYmogPSBhdHRyaWJ1dGVzWyhpICogMikgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgLy9jYXNlIG9uZSAtIGF0dHJpYiBuYW1lIGlzIG51bGwKLSAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSB0aGUgcG9pbnRlciB0byB0aGUgT01BdHRyaWJ1dGUgdGhlbgotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmliUG9pbnRlciA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbUF0dHJpYk9iaiA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEob21BdHRyaWJPYmogaW5zdGFuY2VvZiBPTUF0dHJpYnV0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyBvYmplY3Qgc2V0IHRvIGhhdmUgaW4gdGhlIGF0dHJpYiBhcnJheSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGJ5IG5vdyBidXQganVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dCA9IChPTUF0dHJpYnV0ZSlvbUF0dHJpYk9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJQb2ludGVyIGluc3RhbmNlb2YgT01BdHRyaWJLZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbUF0dHJpYk9iaiA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEob21BdHRyaWJPYmogaW5zdGFuY2VvZiBPTUF0dHJpYnV0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cm9uZyBvYmplY3Qgc2V0IHRvIGhhdmUgaW4gdGhlIGF0dHJpYiBhcnJheSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGJ5IG5vdyBidXQganVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dCA9IChPTUF0dHJpYnV0ZSlvbUF0dHJpYk9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FzZSB0d28gLSBhdHRyaWIgbmFtZSBpcyBhIHBsYWluIHN0cmluZwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYlBvaW50ZXIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW9tQXR0cmliT2JqOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYlBvaW50ZXIgaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9tQXR0cmliT2JqIGluc3RhbmNlb2YgUU5hbWUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUgPSAoUU5hbWUpIG9tQXR0cmliT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaXQgaXMgYWxyZWFkeSB0aGVyZSBpZiBub3QgYWRkIHRoZSBuYW1lc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZXNwYWNlQ29udGV4dC5nZXRQcmVmaXgoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBPTVNlcmlhbGl6ZXJVdGlsLmdldE5leHROU1ByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTnNNYXAocHJlZml4LGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lLiB0aGlzIGlzIHRoZSBkZWZhdWx0IG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gcHJlZml4ICsgIjoiICsgYXR0cmlidXRlUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW9tQXR0cmliT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy9ub3Qgc3VwcG9ydGVkCi0gICAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLy8vLy8vICBlbmQgb2YgYXR0cmlidXRlIGhhbmRsaW5nCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8vLy8vLy8vLy8vLy8gICBuYW1lc3BhY2UgaGFuZGxpbmcKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGRlY2xhcmVkTmFtZXNwYWNlTWFwLnNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaSAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vb3JkZXIgdGhlIHByZWZpeGVzCi0gICAgICAgICAgICBTdHJpbmdbXSBwcmVmaXhlcyA9IG1ha2VQcmVmaXhBcnJheSgpOwotICAgICAgICAgICAgaWYgKChpID49IHByZWZpeGVzLmxlbmd0aCkgfHwgKGkgPCAwKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ZXNbaV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgcHJlZml4IGxpc3QgZnJvbSB0aGUgaGFzdGFibGUgYW5kIHRha2UgdGhhdCBpbnRvIGFuIGFycmF5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtYWtlUHJlZml4QXJyYXkoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByZWZpeGVzID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nW10pZGVjbGFyZWROYW1lc3BhY2VNYXAua2V5U2V0KCkuCi0gICAgICAgICAgICAgICAgICAgICAgICB0b0FycmF5KG5ldyBTdHJpbmdbZGVjbGFyZWROYW1lc3BhY2VNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIEFycmF5cy5zb3J0KHByZWZpeGVzKTsKLSAgICAgICAgcmV0dXJuIHByZWZpeGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCA9IGdldE5hbWVzcGFjZVByZWZpeChpKTsKLSAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VQcmVmaXggPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKWRlY2xhcmVkTmFtZXNwYWNlTWFwLmdldChuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQ7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLy8vLy8vLyAgZW5kIG9mIG5hbWVzcGFjZSBoYW5kbGluZwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBTVEFSVF9FTEVNRU5UOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gRU5EX0VMRU1FTlQ7Ci0gICAgICAgIH0gZWxzZSB7IC8vIHRoaXMgaXMgdGhlIGRlbGVnYXRlZCBzdGF0ZQotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldEV2ZW50VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRUZXh0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gcHJvcGVydGllc1tjdXJyZW50UHJvcGVydHlJbmRleCAtIDFdOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRGF0YUhhbmRsZXIpewotICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmdldFN0cmluZ0Zyb21EYXRhaGFuZGxlcigoRGF0YUhhbmRsZXIpcHJvcGVydHkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZylwcm9wZXJ0aWVzW2N1cnJlbnRQcm9wZXJ0eUluZGV4IC0gMV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydGllc1tjdXJyZW50UHJvcGVydHlJbmRleCAtIDFdID09IG51bGwgPyBuZXcgY2hhclswXSA6Ci0gICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKXByb3BlcnRpZXNbY3VycmVudFByb3BlcnR5SW5kZXggLSAxXSkudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKGksIGNoYXJzLCBpMSwgaTIpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vdG9kbyAgLSBpbXBsZW1lbnQgdGhpcwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldFRleHRTdGFydCgpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOy8vYXNzdW1lIHRleHQgYWx3YXlzIHN0YXJ0cyBhdCAwCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRUZXh0TGVuZ3RoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ly9hc3N1bWUgdGV4dCBhbHdheXMgc3RhcnRzIGF0IDAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXRFbmNvZGluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy93ZSd2ZSBubyBpZGVhIHdoYXQgdGhlIGVuY29kaW5nIGlzIGdvaW5nIHRvIGJlIGluIHRoaXMgY2FzZQotICAgICAgICAgICAgLy9wZXJoYXBzIHdlIG91Z2h0IHRvIHJldHVybiBzb21lIGNvbnN0YW50IGhlcmUsIHdoaWNoIHRoZSB1c2VyIG1pZ2h0Ci0gICAgICAgICAgICAvL2hhdmUgYWNjZXNzIHRvIGNoYW5nZSEKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGlzIGltcGxlbWVudGF0aW9uICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmhhc1RleHQoKTsKLSAgICAgICAgfSBlbHNlIHJldHVybiBzdGF0ZSA9PSBURVhUX1NUQVRFOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICovCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICAvL3JldHVybiBhIGRlZmF1bHQgbG9jYXRpb24KLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50UU5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgICAgIC8vc2luY2UgdGhpcyBwYXJzZXIgYWx3YXlzIGhhcyBhIG5hbWUsIHRoZSBoYXNuYW1lCi0gICAgICAgIC8vaGFzIHRvIHJldHVybiB0cnVlIGlmIHdlIGFyZSBzdGlsbCBuYXZpZ2F0aW5nIHRoaXMgZWxlbWVudAotICAgICAgICAvL2lmIG5vdCB3ZSBzaG91bGQgYXNrIHRoZSBjaGlsZCByZWFkZXIgZm9yIGl0LgotICAgICAgICBpZiAoc3RhdGUgPT0gREVMRUdBVEVEX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRSZWFkZXIuaGFzTmFtZSgpOwotICAgICAgICB9IGVsc2UgcmV0dXJuIHN0YXRlICE9IFRFWFRfU1RBVEU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBERUxFR0FURURfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZFJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IERFTEVHQVRFRF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIGNoaWxkUmVhZGVyLmdldFByZWZpeCgpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIHJldHVybiAiIi5lcXVhbHMocHJlZml4KSA/IG51bGwgOiBwcmVmaXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7ICAgLy90b2RvIC0gc2hvdWxkIHdlIHJldHVybiBzb21ldGhpbmcgZm9yIHRoaXMgPwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWWV0IHRvIGJlIGltcGxlbWVudGVkICEhIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWWV0IHRvIGJlIGltcGxlbWVudGVkICEhIik7Ci0gICAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vLyBPdGhlciB1dGlsaXR5IG1ldGhvZHMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotICAgIC8qKiBQb3B1bGF0ZXMgYSBuYW1lc3BhY2UgY29udGV4dCAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZU5hbWVzcGFjZUNvbnRleHQoKSB7Ci0KLSAgICAgICAgLy9maXJzdCBhZGQgdGhlIGN1cnJlbnQgZWxlbWVudCBuYW1lc3BhY2UgdG8gdGhlIG5hbWVzcGFjZSBjb250ZXh0Ci0gICAgICAgIC8vZGVjbGFyZSBpdCBpZiBub3QgZm91bmQKLSAgICAgICAgYWRkVG9Oc01hcChlbGVtZW50UU5hbWUuZ2V0UHJlZml4KCksIGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgICAgLy90cmF2ZXJzZSB0aHJvdWdoIHRoZSBhdHRyaWJ1dGVzIGFuZCBwb3B1bGF0ZSB0aGUgbmFtZXNwYWNlIGNvbnRleHQKLSAgICAgICAgLy90aGUgYXR0cmliIGxpc3QgY2FuIGJlIG9mIG1hbnkgY29tYmluYXRpb25zCi0gICAgICAgIC8vIHRoZSB2YWxpZCBjb21iaW5hdGlvbnMgYXJlCi0gICAgICAgIC8vIFN0cmluZyAtIFN0cmluZwotICAgICAgICAvLyBRTmFtZSAtIFFOYW1lCi0gICAgICAgIC8vIG51bGwgLSBPTUF0dHJpYnV0ZQotCi0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkgPSBpICsgMikgeyAvL2p1bXAgaW4gdHdvCi0gICAgICAgICAgICAgICAgT2JqZWN0IGF0dHJpYk5hbWUgPSBhdHRyaWJ1dGVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSB0aGUgT01BdHRyaWIgY2FzZSEKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgT01BdHRyaWIgPSAoT01BdHRyaWJ1dGUpYXR0cmlidXRlc1tpICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IE9NQXR0cmliLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTnNNYXAobmFtZXNwYWNlLmdldFByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJOYW1lIGluc3RhbmNlb2YgT01BdHRyaWJLZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy90aGlzIGlzIGRlZmluaXRlbHkgdGhlIE9NQXR0cmlidXRlIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgT01BdHRyaWIgPSAoT01BdHRyaWJ1dGUpYXR0cmlidXRlc1tpICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IE9NQXR0cmliLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvTnNNYXAobmFtZXNwYWNlLmdldFByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJOYW1lIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlIHRoaXMgY2FzZSAtIE5vdGhpbmcgdG8gZG8KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYk5hbWUgaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBhdHRyaWJRTmFtZSA9ICgoUU5hbWUpYXR0cmliTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRvTnNNYXAoYXR0cmliUU5hbWUuZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvTnNNYXAoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICBpZiAoIXVyaS5lcXVhbHMobmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSkpIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZUNvbnRleHQucHVzaE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICBkZWNsYXJlZE5hbWVzcGFjZU1hcC5wdXQocHJlZml4LCB1cmkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnkgZmFyIHRoaXMgc2hvdWxkIGJlIHRoZSBtb3N0IGltcG9ydGFudCBtZXRob2QgaW4gdGhpcyBjbGFzcyB0aGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBwYXJzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHJldHVybkV2ZW50ID0gLTE7IC8vaW52YWxpZCBzdGF0ZSBpcyB0aGUgZGVmYXVsdCBzdGF0ZQotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgLy9jdXJyZW50IGVsZW1lbnQgaXMgc3RhcnQgZWxlbWVudC4gV2Ugc2hvdWxkIGJlIGxvb2tpbmcgYXQgdGhlCi0gICAgICAgICAgICAgICAgLy9wcm9wZXJ0eSBsaXN0IGFuZCBtYWtpbmcgYSBwdWxscGFyc2VyIGZvciB0aGUgcHJvcGVydHkgdmFsdWUKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy9ubyBwcm9wZXJ0aWVzIC0gbW92ZSB0byB0aGUgZW5kIGVsZW1lbnQgc3RhdGUgc3RyYWlnaHRhd2F5Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkV2ZW50ID0gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy90aGVyZSBhcmUgcHJvcGVydGllcy4gbm93IHdlIHNob3VsZCBkZWxlZ2F0ZSB0aGlzIHRhc2sgdG8gYQotICAgICAgICAgICAgICAgICAgICAvL2NoaWxkIHJlYWRlciBkZXBlbmRpbmcgb24gdGhlIHByb3BlcnR5IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBwcm9jZXNzUHJvcGVydGllcygpOwotCi0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIC8vd2UndmUgcmVhY2hlZCB0aGUgZW5kIGVsZW1lbnQgYWxyZWFkeS4gSWYgdGhlIHVzZXIgdHJpZXMgdG8gcHVzaAotICAgICAgICAgICAgICAgIC8vIGZ1cnRoZXIgYWhlYWQgdGhlbiBpdCBpcyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcHVsbHBhcnNlciIpOwotCi0KLSAgICAgICAgICAgIGNhc2UgREVMRUdBVEVEX1NUQVRFOgotICAgICAgICAgICAgICAgIGlmIChjaGlsZFJlYWRlci5pc0RvbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAvL3dlJ3ZlIHJlYWNoZWQgdGhlIGVuZCEKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQcm9wZXJ0eUluZGV4ID4gKHByb3BlcnRpZXMubGVuZ3RoIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IEVORF9FTEVNRU5UOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBwcm9jZXNzUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBjaGlsZFJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRFWFRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGFueSBtb3JlIGV2ZW50IHdlIHNob3VsZCBiZSBkZWxlZ2F0aW5nIHRvCi0gICAgICAgICAgICAgICAgLy8gcHJvY2Vzc1Byb3BlcnRpZXMuIGlmIG5vdCB3ZSBqdXN0IHJldHVybiBhbiBlbmQgZWxlbWVudAotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcGVydHlJbmRleCA+IChwcm9wZXJ0aWVzLmxlbmd0aCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkV2ZW50ID0gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBwcm9jZXNzUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuRXZlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb252ZW5pZW50IG1ldGhvZCB0byByZXVzZSB0aGUgcHJvcGVydGllcwotICAgICAqCi0gICAgICogQHJldHVybiBldmVudCB0byBiZSB0aHJvd24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHByb2Nlc3NQcm9wZXJ0aWVzKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbW92ZSB0byB0aGUgbmV4dCBwcm9wZXJ0eSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgcHJvcGVydHkKLSAgICAgICAgLy9pbmRleAotICAgICAgICBPYmplY3QgcHJvcFBvaW50ZXIgPSBwcm9wZXJ0aWVzW2N1cnJlbnRQcm9wZXJ0eUluZGV4XTsKLSAgICAgICAgUU5hbWUgcHJvcGVydHlRTmFtZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gdGV4dEZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChwcm9wUG9pbnRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJwcm9wZXJ0eSBrZXkgY2Fubm90IGJlIG51bGwhIik7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcFBvaW50ZXIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIC8vIHByb3BQb2ludGVyIGJlaW5nIGEgU3RyaW5nIGhhcyBhIHNwZWNpYWwgY2FzZQotICAgICAgICAgICAgLy8gdGhhdCBpcyBpdCBjYW4gYmUgYSB0aGUgc3BlY2lhbCBjb25zdGFudCBFTEVNRU5UX1RFWFQgdGhhdAotICAgICAgICAgICAgLy8gc2F5cyB0aGlzIHRleHQgZXZlbnQKLSAgICAgICAgICAgIGlmIChFTEVNRU5UX1RFWFQuZXF1YWxzKHByb3BQb2ludGVyKSkgewotICAgICAgICAgICAgICAgIHRleHRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3BlcnR5UU5hbWUgPSBuZXcgUU5hbWUoKFN0cmluZylwcm9wUG9pbnRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcFBvaW50ZXIgaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgcHJvcGVydHlRTmFtZSA9IChRTmFtZSlwcm9wUG9pbnRlcjsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wUG9pbnRlciBpbnN0YW5jZW9mIE9NRWxlbWVudEtleSkgewotICAgICAgICAgICAgLy8gYWggLSBpbiB0aGlzIGNhc2UgdGhlcmUncyBub3RoaW5nIHRvIGJlIGRvbmUKLSAgICAgICAgICAgIC8vYWJvdXQgdGhlIHByb3BlcnR5UU5hbWUgaW4gdGhpcyBjYXNlIC0gd2UnbGwganVzdCBsZWF2ZQotICAgICAgICAgICAgLy9pdCBhcyBpdCBpcwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9vb3BzIC0gd2UndmUgbm8gaWRlYSB3aGF0IGtpbmQgb2Yga2V5IHRoaXMgaXMKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJ1bmlkZW50aWZpZWQgcHJvcGVydHkga2V5ISEhIiArIHByb3BQb2ludGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHByb3BlcnR5UU5hbWUhPW51bGwpewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIHFuYW1lTWFwLmdldChwcm9wZXJ0eVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIGlmKHByZWZpeCE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlRTmFtZSA9IG5ldyBRTmFtZShwcm9wZXJ0eVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLHByb3BlcnR5UU5hbWUuZ2V0TG9jYWxQYXJ0KCkscHJlZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vb2shIHdlIGdvdCB0aGUga2V5LiBOb3cgbG9vayBhdCB0aGUgdmFsdWUKLSAgICAgICAgT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0aWVzW2N1cnJlbnRQcm9wZXJ0eUluZGV4ICsgMV07Ci0gICAgICAgIC8vY2F0ZXIgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugbm93Ci0gICAgICAgIGlmICh0ZXh0Rm91bmQpIHsKLSAgICAgICAgICAgIC8vbm8gZGVsZWdhdGlvbiBoZXJlIC0gbWFrZSB0aGUgcGFyc2VyIG51bGwgYW5kIGltbWVkaWF0ZWx5Ci0gICAgICAgICAgICAvL3JldHVybiB3aXRoIHRoZSBldmVudCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBjaGlsZFJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICBzdGF0ZSA9IFRFWFRfU1RBVEU7Ci0gICAgICAgICAgICBjdXJyZW50UHJvcGVydHlJbmRleCA9IGN1cnJlbnRQcm9wZXJ0eUluZGV4ICsgMjsKLSAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy9pZiB0aGUgdmFsdWUgaXMgbnVsbCB3ZSBkZWxlZ2F0ZSB0aGUgd29yayB0byBhIG51bGxhYmxlCi0gICAgICAgICAgICAvLyBwYXJzZXIKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyID0gbmV3IE51bGxYTUxTdHJlYW1SZWFkZXIocHJvcGVydHlRTmFtZSk7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlci5hZGROYW1lc3BhY2VDb250ZXh0KHRoaXMubmFtZXNwYWNlQ29udGV4dCk7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlci5pbml0KCk7Ci0KLSAgICAgICAgICAgIC8vd2UndmUgYSBzcGVjaWFsIHB1bGxwYXJzZXIgZm9yIGEgZGF0YWhhbmRsZXIhCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIERhdGFIYW5kbGVyKSB7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlciA9IG5ldyBBREJEYXRhSGFuZGxlclN0cmVhbVJlYWRlcihwcm9wZXJ0eVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERhdGFIYW5kbGVyKXByb3BlcnR5VmFsdWUpOwotICAgICAgICAgICAgY2hpbGRSZWFkZXIuYWRkTmFtZXNwYWNlQ29udGV4dCh0aGlzLm5hbWVzcGFjZUNvbnRleHQpOwotICAgICAgICAgICAgY2hpbGRSZWFkZXIuaW5pdCgpOwotCi0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgLy9zdHJpbmdzIGFyZSBoYW5kbGVkIGJ5IHRoZSBOYW1lVmFsdWVQYWlyU3RyZWFtUmVhZGVyCi0gICAgICAgICAgICBjaGlsZFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBOYW1lVmFsdWVQYWlyU3RyZWFtUmVhZGVyKHByb3BlcnR5UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpcHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlci5hZGROYW1lc3BhY2VDb250ZXh0KHRoaXMubmFtZXNwYWNlQ29udGV4dCk7Ci0gICAgICAgICAgICBjaGlsZFJlYWRlci5pbml0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBhcnJhcnkgb2JqZWN0IGFuZCB3ZSBuZWVkIHRvIGdldCB0aGUgcHVsbCBwYXJzZXIgZm9yIHRoYXQKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgocHJvcGVydHlWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAvL2FkdmFuY2UgdGhlIGluZGV4Ci0gICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5SW5kZXggPSBjdXJyZW50UHJvcGVydHlJbmRleCArIDI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExpc3Qgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWVPYmplY3QgPSBudWxsOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy9mb3IgaW5udGVyIEFycmFyeSBDb21wbGV4IHR5cGVzIHdlIHVzZSB0aGUgc3BlY2lhbCBsb2NhbCBuYW1lIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYWRkKG5ldyBRTmFtZShwcm9wZXJ0eVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCAiYXJyYXkiKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0ID0gQXJyYXkuZ2V0KHByb3BlcnR5VmFsdWUsIGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlT2JqZWN0ICE9IG51bGwpICYmIFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKHZhbHVlT2JqZWN0KSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZChTaW1wbGVUeXBlTWFwcGVyLmdldFN0cmluZ1ZhbHVlKHZhbHVlT2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFkZCh2YWx1ZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBREJYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwocHJvcGVydHlRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMudG9BcnJheSgpLCBuZXcgQXJyYXlMaXN0KCkudG9BcnJheSgpLCB0eXBlVGFibGUsIHF1YWxpZmllZCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRSZWFkZXIgPSBuZXcgV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIocmVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgQURCQmVhbikgewotICAgICAgICAgICAgLy9BREJiZWFuIGhhcyBpdCdzIG93biBtZXRob2QgdG8gZ2V0IGEgcmVhZGVyCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gKChBREJCZWFuKXByb3BlcnR5VmFsdWUpLgotICAgICAgICAgICAgICAgICAgICBnZXRQdWxsUGFyc2VyKHByb3BlcnR5UU5hbWUpOwotICAgICAgICAgICAgLy8gd2Uga25vdyBmb3Igc3VyZSB0aGF0IHRoaXMgaXMgYW4gQURCIFhNTFN0cmVhbXJlYWRlci4KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBjb21wYXRpYmxlCi0gICAgICAgICAgICBpZiAocmVhZGVyIGluc3RhbmNlb2YgQURCWE1MU3RyZWFtUmVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRSZWFkZXIgPSAoQURCWE1MU3RyZWFtUmVhZGVyKXJlYWRlcjsKLSAgICAgICAgICAgICAgICBjaGlsZFJlYWRlci5hZGROYW1lc3BhY2VDb250ZXh0KHRoaXMubmFtZXNwYWNlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRSZWFkZXIuaW5pdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL3dyYXAgaXQgdG8gbWFrZSBjb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgY2hpbGRSZWFkZXIgPSBuZXcgV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgIC8vT01FbGVtZW50cyBkbyBub3QgcHJvdmlkZSB0aGUga2luZCBvZiBwYXJzZXIgd2UgbmVlZAotICAgICAgICAgICAgLy90aGVyZSBpcyBubyBvdGhlciBvcHRpb24gdGhhbiB3cmFwcGluZwotICAgICAgICAgICAgY2hpbGRSZWFkZXIgPSBuZXcgV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICgoT01FbGVtZW50KXByb3BlcnR5VmFsdWUpLmdldFhNTFN0cmVhbVJlYWRlcigpKTsKLSAgICAgICAgICAgIC8vd2UgY2Fubm90IHJlZ2lzdGVyIHRoZSBuYW1lc3BhY2UgY29udGV4dCBoZXJlISEKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9hbGwgc3BlY2lhbCBwb3NzaWJsaWxpdGllcyBoYXMgYmVlbiB0cmllZCEgTGV0J3MgdHJlYXQKLSAgICAgICAgICAgIC8vdGhlIHRoaW5nIGFzIGEgYmVhbiBhbmQgdHJ5IGdlbmVyYXRpbmcgZXZlbnRzIGZyb20gaXQKLSAgICAgICAgICAgIGNoaWxkUmVhZGVyID0gbmV3IFdyYXBwaW5nWE1MU3RyZWFtUmVhZGVyCi0gICAgICAgICAgICAgICAgICAgIChCZWFuVXRpbC5nZXRQdWxsUGFyc2VyKHByb3BlcnR5VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UU5hbWUsIHR5cGVUYWJsZSwgcXVhbGlmaWVkLCBmYWxzZSkpOwotICAgICAgICAgICAgLy93ZSBjYW5ub3QgcmVnaXN0ZXIgdGhlIG5hbWVzcGFjZSBjb250ZXh0IGhlcmUKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0IHRoZSBzdGF0ZSBoZXJlCi0gICAgICAgIHN0YXRlID0gREVMRUdBVEVEX1NUQVRFOwotICAgICAgICAvL3dlIGFyZSBkb25lIHdpdGggdGhlIGRlbGVnYXRpb24KLSAgICAgICAgLy9pbmNyZW1lbnQgdGhlIHByb3BlcnR5IGluZGV4Ci0gICAgICAgIGN1cnJlbnRQcm9wZXJ0eUluZGV4ID0gY3VycmVudFByb3BlcnR5SW5kZXggKyAyOwotICAgICAgICAvLyBJZiBuZWNlc3NhcnksIGRpc2NhcmQgdGhlIFNUQVJUX0RPQ1VNRU5UIGVsZW1lbnQgKEFYSVMyLTQyNzEpCi0gICAgICAgIGludCBldmVudFR5cGUgPSBjaGlsZFJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGV2ZW50VHlwZSA9PSBTVEFSVF9ET0NVTUVOVCA/IGNoaWxkUmVhZGVyLm5leHQoKSA6IGV2ZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKiogYXJlIHdlIGRvbmUgPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL05hbWVWYWx1ZUFycmF5U3RyZWFtUmVhZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL05hbWVWYWx1ZUFycmF5U3RyZWFtUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZmExMTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9OYW1lVmFsdWVBcnJheVN0cmVhbVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTmFtZVZhbHVlQXJyYXlTdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBBREJYTUxTdHJlYW1SZWFkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlRfU1RBVEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1NUQVRFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlRfU1RBVEUgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FTkRfRUxFTUVOVF9TVEFURSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMID0gNDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIE5JTF9RTkFNRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgIm5pbCIsICJ4c2kiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklMX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7Ci0KLQotICAgIHByaXZhdGUgQURCTmFtZXNwYWNlQ29udGV4dCBuYW1lc3BhY2VDb250ZXh0ID0KLSAgICAgICAgICAgIG5ldyBBREJOYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgLy90aGUgaW5kZXggb2YgdGhlIGFycmF5Ci0gICAgcHJpdmF0ZSBpbnQgYXJyYXlJbmRleCA9IDA7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSB2YWx1ZXM7Ci0KLSAgICAvL3N0YXJ0IGVsZW1lbnQgaXMgdGhlIGRlZmF1bHQgc3RhdGUKLSAgICBwcml2YXRlIGludCBzdGF0ZSA9IFNUQVJUX0VMRU1FTlRfU1RBVEU7Ci0KLQotICAgIHB1YmxpYyBOYW1lVmFsdWVBcnJheVN0cmVhbVJlYWRlcihRTmFtZSBuYW1lLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZUNvbnRleHQuc2V0UGFyZW50TnNDb250ZXh0KG5zQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgLy90b2RvIHdoYXQgaWYgdGhlIFFuYW1lIG5hbWVzcGFjZSBoYXMgbm90IGJlZW4gZGVjbGFyZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzdHJpbmcpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gICovCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBURVhUX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUkFDVEVSUzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEZJTkFMX0VORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMOgotICAgICAgICAgICAgICAgIGlmIChhcnJheUluZGV4ID09ICh2YWx1ZXMubGVuZ3RoIC0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBGSU5BTF9FTkRfRUxFTUVOVF9TVEFURTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICBjYXNlIEZJTkFMX0VORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIC8vb29wcywgbm90IHN1cHBvc2VkIHRvIGhhcHBlbiEKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJlbmQgYWxyZWFkeSByZWFjaGVkISIpOwotICAgICAgICAgICAgY2FzZSBFTkRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICAvL3dlJ3ZlIHRvIGhhdmUgbW9yZSB2YWx1ZXMgc2luY2UgdGhpcyBpcyBub3QgdGhlCi0gICAgICAgICAgICAgICAgLy9sYXN0IHZhbHVlCi0gICAgICAgICAgICAgICAgLy9pbmNyZW1lbnQgdGhlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICBhcnJheUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1thcnJheUluZGV4XSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFSVF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgVEVYVF9TVEFURToKLSAgICAgICAgICAgICAgICBpZiAoYXJyYXlJbmRleCA9PSAodmFsdWVzLmxlbmd0aCAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRklOQUxfRU5EX0VMRU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oInVua25vd24gZXZlbnQgdHlwZSEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3RoaW5nIGRvbmUgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7IC8vbm90IGltcGxlbWVudGVkCi0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOyAvL25vdCBpbXBsZW1lbnRlZAotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgLy90b2RvIHNvbWV0aGluZwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMKSByZXR1cm4gMTsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwgJiYgaSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5JTF9RTkFNRTsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMICYmIGkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBOSUxfUU5BTUUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFX1dJVEhfTlVMTCAmJiBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTklMX1FOQU1FLmdldExvY2FsUGFydCgpOwotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURV9XSVRIX05VTEwgJiYgaSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5JTF9RTkFNRS5nZXRQcmVmaXgoKTsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy9ub3QgaW1wbGVtZW50ZWQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFX1dJVEhfTlVMTCAmJiBpID09IDApCi0gICAgICAgICAgICByZXR1cm4gTklMX1ZBTFVFX1RSVUU7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9ub3Qgc3VwcG9ydGVkCi0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMICYmIGlzWHNpTmFtZXNwYWNlUHJlc2VudCgpKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMCi0gICAgICAgICAgICAgICAgJiYgaXNYc2lOYW1lc3BhY2VQcmVzZW50KCkgJiYgaSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5JTF9RTkFNRS5nZXRQcmVmaXgoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEVfV0lUSF9OVUxMCi0gICAgICAgICAgICAgICAgJiYgaXNYc2lOYW1lc3BhY2VQcmVzZW50KCkgJiYgaSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5JTF9RTkFNRS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gRklOQUxfRU5EX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0VMRU1FTlQ7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgVEVYVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUkFDVEVSUzsKLSAgICAgICAgICAgIGNhc2UgRklOQUxfRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL3dlJ3ZlIG5vIGlkZWEgd2hhdCB0aGlzIGlzISEhISEKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1thcnJheUluZGV4XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzW2FycmF5SW5kZXhdLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gY2hhcnMsIGludCBpMSwgaW50IGkyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3QgaW1wbGVtZW50ZWQKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbYXJyYXlJbmRleF0ubGVuZ3RoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gVEVYVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsgIC8vbm90IHN1cHBvcnRlZAotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgIT0gVEVYVF9TVEFURSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7ICAvL3RvZG8gMS4wID8KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSAhPSBGSU5BTF9FTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9EbyBub3RoaW5nIC0gd2UndmUgbm90aGluZyB0byBmcmVlIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IFNUQVJUX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSA9PSBFTkRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IFRFWFRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy9ubyB3aGl0ZXNwYWNlcyBoZXJlCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9Oc01hcChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIC8vdG9kbyAtIG5lZWQgdG8gZml4IHRoaXMgdXAgdG8gY2F0ZXIgZm9yIGNhc2VzIHdoZXJlCi0gICAgICAgIC8vbmFtZXNwYWNlcyBhcmUgaGF2aW5nICBubyBwcmVmaXhlcwotICAgICAgICBpZiAoIXVyaS5lcXVhbHMobmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSkpIHsKLSAgICAgICAgICAgIC8vdGhpcyBuYW1lc3BhY2UgaXMgbm90IHRoZXJlLiBOZWVkIHRvIGRlY2xhcmUgaXQKLSAgICAgICAgICAgIG5hbWVzcGFjZUNvbnRleHQucHVzaE5hbWVzcGFjZShwcmVmaXgsIHVyaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogVGVzdCB3aGV0aGVyIHRoZSB4c2kgbmFtZXNwYWNlIGlzIHByZXNlbnQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNYc2lOYW1lc3BhY2VQcmVzZW50KCkgewotICAgICAgICByZXR1cm4gKG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKE5JTF9RTkFNRS5nZXRQcmVmaXgoKSkgIT0gbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9OYW1lVmFsdWVQYWlyU3RyZWFtUmVhZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL05hbWVWYWx1ZVBhaXJTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwMWJiZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL05hbWVWYWx1ZVBhaXJTdHJlYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE5hbWVWYWx1ZVBhaXJTdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBBREJYTUxTdHJlYW1SZWFkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX0VMRU1FTlRfU1RBVEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVhUX1NUQVRFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlRfU1RBVEUgPSAyOwotCi0gICAgcHJpdmF0ZSBBREJOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQgPQotICAgICAgICAgICAgbmV3IEFEQk5hbWVzcGFjZUNvbnRleHQoKTsKLQotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIHByaXZhdGUgaW50IHN0YXRlID0gU1RBUlRfRUxFTUVOVF9TVEFURTsKLSAgICAvL2luaXRpYXRlIGF0IHRoZSBzdGFydCBlbGVtZW50IHN0YXRlCi0KLSAgICAvL2tlZXBzIHRyYWNrIHdoZXRoZXIgdGhlIG5hbWVzcGFjZSBpcyBkZWNsYXJlZAotICAgIC8vZmFsc2UgYnkgZGVmYXVsdAotICAgIHByaXZhdGUgYm9vbGVhbiBuc0RlY2xhcmVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgTmFtZVZhbHVlUGFpclN0cmVhbVJlYWRlcihRTmFtZSBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vc2luY2Ugb3B0aW1pemF0aW9uIGlzIGEgZ2xvYmFsIHByb3BlcnR5Ci0gICAgICAgIC8vd2UndmUgdG8gaW1wbGVtZW50IGl0IGV2ZXJ5d2hlcmUKLSAgICAgICAgaWYgKE9QVElNSVpBVElPTl9FTkFCTEVELmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIGlmIChJU19CSU5BUlkuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vIG5lZWQgdG8gaGFuZGxlIG51bGwgaGVyZS4gaXQgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkCi0gICAgICAgIC8vYWxyZWFkeQotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBURVhUX1NUQVRFOwotICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICAgICAgY2FzZSBFTkRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICAvL29vcHMsIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4hCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiZW5kIGFscmVhZHkgcmVhY2hlZCEiKTsKLSAgICAgICAgICAgIGNhc2UgVEVYVF9TVEFURToKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgIHJldHVybiBFTkRfRUxFTUVOVDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigidW5rbm93biBldmVudCB0eXBlISIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgaSwgU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL25vdCBpbXBsZW1lbnRlZAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIC8vbW92ZSB0byB0aGUgZW5kIHN0YXRlIGFuZCByZXR1cm4gdGhlIHZhbHVlCi0gICAgICAgICAgICBzdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7Ly90b2RvCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKHN0YXRlICE9IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL0RvIG5vdGhpbmcgLSB3ZSd2ZSBub3RoaW5nIHRvIGZyZWUgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gU1RBUlRfRUxFTUVOVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gVEVYVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7ICAvL25vIHdoaXRlc3BhY2VzIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgLy9ubyBhdHRyaWJzIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICByZXR1cm4gKG5zRGVjbGFyZWQpID8gMSA6IDA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChuc0RlY2xhcmVkICYmIGkgPT0gMCkgPyBuYW1lLmdldFByZWZpeCgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgaSkgewotICAgICAgICByZXR1cm4gKG5zRGVjbGFyZWQgJiYgaSA9PSAwKSA/IG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgICAgIGNhc2UgRU5EX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORF9FTEVNRU5UOwotICAgICAgICAgICAgY2FzZSBURVhUX1NUQVRFOgotICAgICAgICAgICAgICAgIHJldHVybiBDSEFSQUNURVJTOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAvL3dlJ3ZlIG5vIGlkZWEgd2hhdCB0aGlzIGlzISEhISEKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgaWYgKHN0YXRlID09IFRFWFRfU1RBVEUpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0NoYXJBcnJheSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgaSwgY2hhcltdIGNoYXJzLCBpbnQgaTEsIGludCBpMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm90IGltcGxlbWVudGVkCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dFN0YXJ0KCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiAoc3RhdGUgPT0gVEVYVF9TVEFURSk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJPZmZzZXQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChzdGF0ZSAhPSBURVhUX1NUQVRFKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gVEVYVF9TVEFURSkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBURVhUX1NUQVRFKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsgIC8vdG9kbyAxLjAgPwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gKHN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbnNDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlQ29udGV4dC5zZXRQYXJlbnROc0NvbnRleHQobnNDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICAvL2p1c3QgYWRkIHRoZSBjdXJyZW50IGVsZW1lbnRzIG5hbWVzcGFjZSBhbmQgcHJlZml4IHRvIHRoZSB0aGlzCi0gICAgICAgIC8vZWxlbWVudHMgbnNjb250ZXh0Ci0gICAgICAgIGFkZFRvTnNNYXAobmFtZS5nZXRQcmVmaXgoKSwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvTnNNYXAoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICAvL3RvZG8gLSBuZWVkIHRvIGZpeCB0aGlzIHVwIHRvIGNhdGVyIGZvciBjYXNlcyB3aGVyZQotICAgICAgICAvL25hbWVzcGFjZXMgYXJlIGhhdmluZyAgbm8gcHJlZml4ZXMKLSAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5hbWVzcGFjZUNvbnRleHQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkpKSB7Ci0gICAgICAgICAgICAvL3RoaXMgbmFtZXNwYWNlIGlzIG5vdCB0aGVyZS4gTmVlZCB0byBkZWNsYXJlIGl0Ci0gICAgICAgICAgICBuYW1lc3BhY2VDb250ZXh0LnB1c2hOYW1lc3BhY2UocHJlZml4LCB1cmkpOwotICAgICAgICAgICAgbnNEZWNsYXJlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvTnVsbFhNTFN0cmVhbVJlYWRlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9OdWxsWE1MU3RyZWFtUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzA0YjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3JlYWRlci9OdWxsWE1MU3RyZWFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBOdWxsWE1MU3RyZWFtUmVhZGVyIGltcGxlbWVudHMgQURCWE1MU3RyZWFtUmVhZGVyIHsKLQotICAgIHByaXZhdGUgUU5hbWUgb3V0ZXJRTmFtZSA9IG51bGw7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9FTEVNRU5UX1NUQVRFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EX0VMRU1FTlRfU1RBVEUgPSAyOwotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBOSUxfUU5BTUUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJuaWwiLCAieHNpIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTF9WQUxVRV9UUlVFID0gInRydWUiOwotCi0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFN0YXRlID0gU1RBUlRfRUxFTUVOVDsKLQotICAgIHB1YmxpYyBOdWxsWE1MU3RyZWFtUmVhZGVyKFFOYW1lIG91dGVyUU5hbWUpIHsKLSAgICAgICAgdGhpcy5vdXRlclFOYW1lID0gb3V0ZXJRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAvL3NpbmNlIG9wdGltaXphdGlvbiBpcyBhIGdsb2JhbCBwcm9wZXJ0eQotICAgICAgICAvL3dlJ3ZlIHRvIGltcGxlbWVudCBpdCBldmVyeXdoZXJlCi0gICAgICAgIGlmIChPUFRJTUlaQVRJT05fRU5BQkxFRC5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXR1cm5FdmVudCA9IFNUQVJUX0RPQ1VNRU5UOwotICAgICAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFSVF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IEVORF9FTEVNRU5UX1NUQVRFOwotICAgICAgICAgICAgICAgIHJldHVybkV2ZW50ID0gRU5EX0VMRU1FTlQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVORF9FTEVNRU5UX1NUQVRFOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oInBhcnNlciBjb21wbGV0ZWQhIik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5FdmVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBpLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm90aGluZwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChjdXJyZW50U3RhdGUgIT0gRU5EX0VMRU1FTlRfU1RBVEUpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIHN0cmluZykgewotICAgICAgICBpZiAob3V0ZXJRTmFtZS5nZXRQcmVmaXgoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgb3V0ZXJRTmFtZS5nZXRQcmVmaXgoKS5lcXVhbHMoc3RyaW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIG91dGVyUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKGN1cnJlbnRTdGF0ZSA9PSBTVEFSVF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoY3VycmVudFN0YXRlID09IEVORF9FTEVNRU5UX1NUQVRFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB7Ci0gICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCkgey8vbnVsbCBuYW1lc3BhY2UgLSBpZ25vcmUgaXQKLSAgICAgICAgICAgIGlmIChOSUxfUU5BTUUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKHN0cmluZzEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5JTF9WQUxVRV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaSA9PSAwKSA/IE5JTF9RTkFNRSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChpID09IDApID8gTklMX1FOQU1FLmdldE5hbWVzcGFjZVVSSSgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICByZXR1cm4gKGkgPT0gMCkgPyBOSUxfUU5BTUUuZ2V0TG9jYWxQYXJ0KCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaSA9PSAwKSA/IE5JTF9RTkFNRS5nZXRQcmVmaXgoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIChpID09IDApID8gTklMX1ZBTFVFX1RSVUUgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBpKSB7Ci0gICAgICAgIHJldHVybiAoaSA9PSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVByZWZpeChpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgaSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgaW50IHJldHVybkV2ZW50ID0gU1RBUlRfRE9DVU1FTlQ7Ci0gICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVJUX0VMRU1FTlRfU1RBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSBTVEFSVF9FTEVNRU5UOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFTkRfRUxFTUVOVF9TVEFURToKLSAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IEVORF9FTEVNRU5UOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkV2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBjaGFyWzBdOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gY2hhcnMsIGludCBpMSwgaW50IGkyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb2NhdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gb3V0ZXJRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG91dGVyUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBvdXRlclFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gb3V0ZXJRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChjdXJyZW50U3RhdGUgPT0gRU5EX0VMRU1FTlRfU1RBVEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBuc0NvbnRleHQpIHsKLSAgICAgICAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgewotICAgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvT01BdHRyaWJLZXkuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvT01BdHRyaWJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5M2VjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL09NQXR0cmliS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi0vKioKLSAqIEEgZHVtbXkgb2JqZWN0IHRoYXQgYWN0cyBhcyB0aGUga2V5IGZvciB0aGUgT01BdHRyaWJ1dGUgaW4gdGhlIGF0dHJpYnV0ZSBhcnJheSAtIHRoaXMgd2lsbCBiZQotICogcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBPTUF0dHJpYktleSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvT01FbGVtZW50S2V5LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL09NRWxlbWVudEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzhiOGJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvT01FbGVtZW50S2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi0vKioKLSAqIEEgZHVtbXkgY2xhc3MgdGhhdCBjcmVhdGVzIG5vdGhpbmcgYnV0IGEga2V5IGZvciB0aGUgT01FbGVtZW50IHdoZW4gaXQgaXMgcGFzc2VkIHRvIHRoZQotICogQURCUHVsbHBhcnNlcgotICovCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50S2V5IHsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjNTVkOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL1dyYXBwaW5nWE1MU3RyZWFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBXcmFwcGluZ1hNTFN0cmVhbVJlYWRlciBpbXBsZW1lbnRzIEFEQlhNTFN0cmVhbVJlYWRlciB7Ci0KLSAgICBwcml2YXRlIFhNTFN0cmVhbVJlYWRlciByZWFkZXI7Ci0KLSAgICBwdWJsaWMgV3JhcHBpbmdYTUxTdHJlYW1SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gIWhhc05leHQoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRQcm9wZXJ0eShzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZGVyLm5leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBpLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZGVyLm5leHRUYWcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VVUkkoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5pc0VuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaXNDaGFyYWN0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzV2hpdGVTcGFjZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShzdHJpbmcsIHN0cmluZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlVHlwZShpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5pc0F0dHJpYnV0ZVNwZWNpZmllZChpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgaSwgY2hhcltdIGNoYXJzLCBpbnQgaTEsIGludCBpMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoaSwgY2hhcnMsIGkxLCBpMik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFRleHRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEVuY29kaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5oYXNUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldExvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldExvY2FsTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuaGFzTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmlzU3RhbmRhbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuc3RhbmRhbG9uZVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldFBJVGFyZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0UElEYXRhKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCkgewotICAgICAgICAvL25vdGhpbmcgdG8gZG8gaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIC8vTm90aGluZyB0byBkbyBoZXJlCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9NVE9NQXdhcmVPTUJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvTVRPTUF3YXJlT01CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDMxODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9NVE9NQXdhcmVPTUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLQotcHVibGljIGNsYXNzIE1UT01Bd2FyZU9NQnVpbGRlciBpbXBsZW1lbnRzIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB7Ci0gICAgLy8gdGhpcyBpcyB0aGUgb20gRWxlbWVudCB3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBPTUZhY3Rvcnkgb21GYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgY3VycmVudE9NRWxlbWVudDsKLQotICAgIHByaXZhdGUgU3RhY2sgb21FbGVtZW50U3RhY2s7Ci0KLSAgICAvLyB0aGlzIG1hcCBjb250YWlucyB0aGUgbmFtZXNwYWNlIGtleSBhbmQgT01OYW1lc3BhY2UKLSAgICBwcml2YXRlIE1hcCBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcDsKLQotICAgIHByaXZhdGUgaW50IHByZWZpeE51bTsKLQotICAgIHByaXZhdGUgT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0IG9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dDsKLQotCi0gICAgcHVibGljIE1UT01Bd2FyZU9NQnVpbGRlcigpIHsKLSAgICAgICAgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIG9tRWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQgPSBudWxsOwotICAgICAgICBvbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQgPSBuZXcgT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgIG5hbWVzcGFjZU9NTmFtZXNhcGNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcHJlZml4TnVtID0gMDsKLQotICAgIH0KLQotICAgIC8vIHNlcmFpbGl6ZXIgbXVzdCBoYXZlIGZpbmlzaCBzZXJpYWxpemluZyB3aGVuIHdlIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFvbUVsZW1lbnRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIlRoaXMgaXMgYW4gaW52YWxpZCBYbWwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgT01OYW1lc3BhY2UgZ2V0T01OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlT01OYW1lc2FwY2VNYXAuY29udGFpbnNLZXkobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgIG9tTmFtZXNwYWNlID0gKE9NTmFtZXNwYWNlKSBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyArK3ByZWZpeE51bTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMub21TdHJlYW1OYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigidGhlIHByZWZpeCA9PT4gIiArIHByZWZpeCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBbHJlYWR5IGV4aXN0cyBmb3IgbmFtZXNwYWNlID09PiAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb21OYW1lc3BhY2UgPSBvbUZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgICAgICAgICAgICAgIHRoaXMub21TdHJlYW1OYW1lc3BhY2VDb250ZXh0LnJlZ2lzdGVyTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcC5wdXQobmFtZXNwYWNlLCBvbU5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9tTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOwotICAgICAgICBjdXJyZW50T01FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUsIG9tTmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKCFvbUVsZW1lbnRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBrZWVwIHRoZSBwYXJlbnQgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJlbnQgPSAoT01FbGVtZW50KSBvbUVsZW1lbnRTdGFjay5wZWVrKCk7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoY3VycmVudE9NRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpLmUgdGhpcyBtdXN0IGJlIGFuIHN0YXJ0IHJvb3QgZWxlbWVudAotICAgICAgICAgICAgcm9vdEVsZW1lbnQgPSBjdXJyZW50T01FbGVtZW50OwotICAgICAgICB9Ci0gICAgICAgIC8vIHNldCB0aGlzIGFzIHRoZSB0b3AgZWxlbWVudAotICAgICAgICBvbUVsZW1lbnRTdGFjay5wdXNoKGN1cnJlbnRPTUVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUVtcHR5RWxlbWVudChudWxsLCBsb2NhbE5hbWUsIG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgICAgICB3cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVFbXB0eUVsZW1lbnQobnVsbCwgbG9jYWxOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgb21FbGVtZW50U3RhY2sucG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIpIHsKLSAgICAgICAgT01UZXh0IG9tVGV4dCA9IG9tRmFjdG9yeS5jcmVhdGVPTVRleHQoZGF0YUhhbmRsZXIsIHRydWUpOwotICAgICAgICBjdXJyZW50T01FbGVtZW50LmFkZENoaWxkKG9tVGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKG51bGwsIG51bGwsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgY3VycmVudE9NRWxlbWVudC5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGdldE9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKG51bGwsIG5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpOwotICAgICAgICAgICAgY3VycmVudE9NRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG9tTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcm9vdEVsZW1lbnQuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01Db21tZW50KGN1cnJlbnRPTUVsZW1lbnQsIHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDRGF0YShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVEVEQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGN1cnJlbnRPTUVsZW1lbnQuc2V0VGV4dChzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhjaGFyW10gY2hhcnMsIGludCBpLCBpbnQgaTEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZUNoYXJhY3RlcnMobmV3IFN0cmluZyhjaGFycywgaSwgaTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub21TdHJlYW1OYW1lc3BhY2VDb250ZXh0LmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gdGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIG5hbWVzcGFjZSBjb3JyZWN0bHkuCi0gICAgICAgIGdldE9NTmFtZXNwYWNlKHVyaSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByb290RWxlbWVudC5kZWNsYXJlRGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICBnZXRPTU5hbWVzcGFjZShuYW1lc3BhY2UsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgbmFtZXNwYWNlQ29udGV4dCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzdHJpbmcpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURhdGFIYW5kbGVyKERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgT01UZXh0IG9tVGV4dCA9IG9tRmFjdG9yeS5jcmVhdGVPTVRleHQoZGF0YUhhbmRsZXIsIHRydWUpOwotICAgICAgICBjdXJyZW50T01FbGVtZW50LmFkZENoaWxkKG9tVGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9NVE9NQXdhcmVYTUxTZXJpYWxpemVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL01UT01Bd2FyZVhNTFNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2NzAzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL01UT01Bd2FyZVhNTFNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLS8qKgotICogdGhpcyBjbGFzcyB3cmFwcHMgdGhlIGV4aXN0aW5nIHhtbFN0cmVhbVdyaXRlciBhbmQgaW1wbGVtZW50cyB0aGUgbmV3IG1ldGhvZAotICogd3JpdGVEYXRhSGFuZGxlcgotICovCi1wdWJsaWMgY2xhc3MgTVRPTUF3YXJlWE1MU2VyaWFsaXplciBpbXBsZW1lbnRzIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB7Ci0KLSAgICBwcml2YXRlIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXI7Ci0KLSAgICBwdWJsaWMgTVRPTUF3YXJlWE1MU2VyaWFsaXplcihYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyKSB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyID0geG1sU3RyZWFtV3JpdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVTdGFydEVsZW1lbnQoc3RyaW5nLCBzdHJpbmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChzdHJpbmcsIHN0cmluZzEsIHN0cmluZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVFbXB0eUVsZW1lbnQoc3RyaW5nLCBzdHJpbmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUVtcHR5RWxlbWVudChzdHJpbmcsIHN0cmluZzEsIHN0cmluZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUVtcHR5RWxlbWVudChzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZERvY3VtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUF0dHJpYnV0ZShzdHJpbmcsIHN0cmluZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMiwgU3RyaW5nIHN0cmluZzMpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUF0dHJpYnV0ZShzdHJpbmcsIHN0cmluZzEsIHN0cmluZzIsIHN0cmluZzMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxLCBTdHJpbmcgc3RyaW5nMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlQXR0cmlidXRlKHN0cmluZywgc3RyaW5nMSwgc3RyaW5nMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVOYW1lc3BhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZU5hbWVzcGFjZShzdHJpbmcsIHN0cmluZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVEZWZhdWx0TmFtZXNwYWNlKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUNvbW1lbnQoc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHN0cmluZywgc3RyaW5nMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDRGF0YShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVDRGF0YShzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRFREKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZURURChzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZUVudGl0eVJlZihzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aGlzLnhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlU3RhcnREb2N1bWVudChzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgc3RyaW5nMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlU3RhcnREb2N1bWVudChzdHJpbmcsIHN0cmluZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIud3JpdGVDaGFyYWN0ZXJzKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSBjaGFycywgaW50IGksIGludCBpMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhjaGFycywgaSwgaTEpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy54bWxTdHJlYW1Xcml0ZXIuZ2V0UHJlZml4KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIuc2V0UHJlZml4KHN0cmluZywgc3RyaW5nMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIuc2V0RGVmYXVsdE5hbWVzcGFjZShzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBuYW1lc3BhY2VDb250ZXh0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy54bWxTdHJlYW1Xcml0ZXIuc2V0TmFtZXNwYWNlQ29udGV4dChuYW1lc3BhY2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy54bWxTdHJlYW1Xcml0ZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHN0cmluZykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmVhbVdyaXRlci5nZXRQcm9wZXJ0eShzdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBPTVRleHRJbXBsIG9tVGV4dCA9IG5ldyBPTVRleHRJbXBsKGRhdGFIYW5kbGVyLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIG9tVGV4dC5pbnRlcm5hbFNlcmlhbGl6ZUFuZENvbnN1bWUodGhpcy54bWxTdHJlYW1Xcml0ZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL01UT01Bd2FyZVhNTFN0cmVhbVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTA5ZjhiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotcHVibGljIGludGVyZmFjZSBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgZXh0ZW5kcyBYTUxTdHJlYW1Xcml0ZXIgewotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL09NRWxlbWVudFN0cmVhbVdyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9PTUVsZW1lbnRTdHJlYW1Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMTUwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL09NRWxlbWVudFN0cmVhbVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50U3RyZWFtV3JpdGVyIGltcGxlbWVudHMgWE1MU3RyZWFtV3JpdGVyIHsKLQotICAgIC8vIHRoaXMgaXMgdGhlIG9tIEVsZW1lbnQgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZQotICAgIHByaXZhdGUgT01FbGVtZW50IHJvb3RFbGVtZW50OwotICAgIHByaXZhdGUgT01GYWN0b3J5IG9tRmFjdG9yeTsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IGN1cnJlbnRPTUVsZW1lbnQ7Ci0KLSAgICBwcml2YXRlIFN0YWNrIG9tRWxlbWVudFN0YWNrOwotCi0gICAgLy8gdGhpcyBtYXAgY29udGFpbnMgdGhlIG5hbWVzcGFjZSBrZXkgYW5kIE9NTmFtZXNwYWNlCi0gICAgcHJpdmF0ZSBNYXAgbmFtZXNwYWNlT01OYW1lc2FwY2VNYXA7Ci0KLSAgICBwcml2YXRlIGludCBwcmVmaXhOdW07Ci0KLSAgICBwcml2YXRlIE9NU3RyZWFtTmFtZXNwYWNlQ29udGV4dCBvbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQ7Ci0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnRTdHJlYW1Xcml0ZXIoKSB7Ci0gICAgICAgIG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBvbUVsZW1lbnRTdGFjayA9IG5ldyBTdGFjaygpOwotICAgICAgICBjdXJyZW50T01FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgb21TdHJlYW1OYW1lc3BhY2VDb250ZXh0ID0gbmV3IE9NU3RyZWFtTmFtZXNwYWNlQ29udGV4dCgpOwotICAgICAgICBuYW1lc3BhY2VPTU5hbWVzYXBjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByZWZpeE51bSA9IDA7Ci0KLSAgICB9Ci0KLSAgICAvLyBzZXJhaWxpemVyIG11c3QgaGF2ZSBmaW5pc2ggc2VyaWFsaXppbmcgd2hlbiB3ZSBjYWxsIHRoaXMgbWV0aG9kLgotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghb21FbGVtZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJUaGlzIGlzIGFuIGludmFsaWQgWG1sICIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NTmFtZXNwYWNlIGdldE9NTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwcmVmaXgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBPTU5hbWVzcGFjZSBvbU5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZU9NTmFtZXNhcGNlTWFwLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICBvbU5hbWVzcGFjZSA9IChPTU5hbWVzcGFjZSkgbmFtZXNwYWNlT01OYW1lc2FwY2VNYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMiICsgKytwcmVmaXhOdW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dC5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oInRoZSBwcmVmaXggPT0+ICIgKyBwcmVmaXggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQWxyZWFkeSBleGlzdHMgZm9yIG5hbWVzcGFjZSA9PT4gIiArIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9tTmFtZXNwYWNlID0gb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICB0aGlzLm9tU3RyZWFtTmFtZXNwYWNlQ29udGV4dC5yZWdpc3Rlck5hbWVzcGFjZShuYW1lc3BhY2UsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlT01OYW1lc2FwY2VNYXAucHV0KG5hbWVzcGFjZSwgb21OYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbU5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQobnVsbCwgbG9jYWxOYW1lLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQobnVsbCwgbG9jYWxOYW1lLCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBPTU5hbWVzcGFjZSBvbU5hbWVzcGFjZSA9IGdldE9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KTsKLSAgICAgICAgY3VycmVudE9NRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQobG9jYWxOYW1lLCBvbU5hbWVzcGFjZSk7Ci0gICAgICAgIGlmICghb21FbGVtZW50U3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyB3ZSBhbHdheXMga2VlcCB0aGUgcGFyZW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyZW50ID0gKE9NRWxlbWVudCkgb21FbGVtZW50U3RhY2sucGVlaygpOwotICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKGN1cnJlbnRPTUVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaS5lIHRoaXMgbXVzdCBiZSBhbiBzdGFydCByb290IGVsZW1lbnQKLSAgICAgICAgICAgIHJvb3RFbGVtZW50ID0gY3VycmVudE9NRWxlbWVudDsKLSAgICAgICAgfQotICAgICAgICAvLyBzZXQgdGhpcyBhcyB0aGUgdG9wIGVsZW1lbnQKLSAgICAgICAgb21FbGVtZW50U3RhY2sucHVzaChjdXJyZW50T01FbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVFbXB0eUVsZW1lbnQobnVsbCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgd3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlRW1wdHlFbGVtZW50KG51bGwsIGxvY2FsTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbmRFbGVtZW50KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9tRWxlbWVudFN0YWNrLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkYXRhSGFuZGxlcil7Ci0gICAgICAgIE9NVGV4dCBvbVRleHQgPSBvbUZhY3RvcnkuY3JlYXRlT01UZXh0KGRhdGFIYW5kbGVyLHRydWUpOwotICAgICAgICBjdXJyZW50T01FbGVtZW50LmFkZENoaWxkKG9tVGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKG51bGwsIG51bGwsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgY3VycmVudE9NRWxlbWVudC5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUsIGdldE9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKG51bGwsIG5hbWVzcGFjZSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpOwotICAgICAgICAgICAgY3VycmVudE9NRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG9tTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcm9vdEVsZW1lbnQuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgZ2V0T01OYW1lc3BhY2UobmFtZXNwYWNlLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01Db21tZW50KGN1cnJlbnRPTUVsZW1lbnQsc3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHN0cmluZywgU3RyaW5nIHN0cmluZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNEYXRhKFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURURChTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbnRpdHlSZWYoU3RyaW5nIHN0cmluZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidGhpcyBtZXRob2QgaGFzIG5vdCB5ZXQgYmVlbiBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBzdHJpbmcpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdHJpbmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhTdHJpbmcgc3RyaW5nKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgY3VycmVudE9NRWxlbWVudC5zZXRUZXh0KHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKGNoYXJbXSBjaGFycywgaW50IGksIGludCBpMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlQ2hhcmFjdGVycyhuZXcgU3RyaW5nKGNoYXJzLCBpLCBpMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2UpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5vbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyB0aGlzIG1ldGhvZCB3aWxsIGFkZCB0aGUgbmFtZXNwYWNlIGNvcnJlY3RseS4KLSAgICAgICAgZ2V0T01OYW1lc3BhY2UodXJpLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJvb3RFbGVtZW50LmRlY2xhcmVEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgIGdldE9NTmFtZXNwYWNlKG5hbWVzcGFjZSwiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQ29udGV4dChOYW1lc3BhY2VDb250ZXh0IG5hbWVzcGFjZUNvbnRleHQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRoaXMgbWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gdGhpcy5vbVN0cmVhbU5hbWVzcGFjZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9PTVN0cmVhbU5hbWVzcGFjZUNvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMWVhNzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL3dyaXRlci9PTVN0cmVhbU5hbWVzcGFjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIE9NU3RyZWFtTmFtZXNwYWNlQ29udGV4dCBpbXBsZW1lbnRzIE5hbWVzcGFjZUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBNYXAgbmFtZXNwYWNlVG9QcmVmaXhNYXA7Ci0gICAgcHJpdmF0ZSBNYXAgcHJlZml4VG9OYW1lc3BhY2VNYXA7Ci0KLSAgICBwdWJsaWMgT01TdHJlYW1OYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVRvUHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy5wcmVmaXhUb05hbWVzcGFjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSxTdHJpbmcgcHJlZml4KXsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VUb1ByZWZpeE1hcC5wdXQobmFtZXNwYWNlLHByZWZpeCk7Ci0gICAgICAgIHRoaXMucHJlZml4VG9OYW1lc3BhY2VNYXAucHV0KHByZWZpeCxuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIHByZWZpeFRvTmFtZXNwYWNlTWFwLmdldChwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIG5hbWVzcGFjZVRvUHJlZml4TWFwLmdldChuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHJldHVybiBwcmVmaXhUb05hbWVzcGFjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL2NsaWVudC9SUENTZXJ2aWNlQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL2NsaWVudC9SUENTZXJ2aWNlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTFmMjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9jbGllbnQvUlBDU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZWZhdWx0T2JqZWN0U3VwcGxpZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFJQQ1NlcnZpY2VDbGllbnQgZXh0ZW5kcyBTZXJ2aWNlQ2xpZW50IHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBub3ROdWxsU2VydmljZTsKLQotICAgIHB1YmxpYyBSUENTZXJ2aWNlQ2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc3VwZXIoY29uZmlnQ29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5vdE51bGxTZXJ2aWNlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSUENTZXJ2aWNlQ2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFJQQ1NlcnZpY2VDbGllbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgd3NkbFVSTCwgUU5hbWUgd3NkbFNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGxVUkwsIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgICAgICBub3ROdWxsU2VydmljZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHZhbHVlIGNhbiBiZSBhIHNpbmdsZSBhIG9iamVjdCBvciBhbiBvYmplY3QgYXJyYXkgKGl0c2VsZiBhbiBvYmplY3QpICwgYnV0IGl0IGlzCi0gICAgICogZGlmZmljdWx0eSB0byBmaWd1cmUgdGhlIHJldHVybiBvYmplY3QgY29ycmVjdGx5IHVubGVzcyB3ZSBoYXZlIFR5ZXBNYXBwaW5nIGluIHRoZSBjbGllbnQKLSAgICAgKiBzaWRlIHRvby4gVW50aWwgaXQgaXMgZmluYWxpemVkIGxldHMgcmV0dXJuIE9NRWxlbWVudCBhcyByZXR1cm4gdmFsdWUuIEFuZCB0aGUgcmV0dWVuIHZhbHVlCi0gICAgICogd2lsbCBiZSB0aGUgYm9keSBmaXJzdCBlbGVtZW50IHVzZXIgaGFzIHRvIGRlYWwgd2l0aCB0aGF0IGFuZCBjcmVhdGUgaGlzIG93biBvYmplY3Qgb3V0IG9mCi0gICAgICogdGhhdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcE5hbWUgT3BlcmF0aW9uIFFOYW1lICh0byBnZXQgdGhlIGJvZHkgd3JhcHBlciBlbGVtZW50KQotICAgICAqIEBwYXJhbSBhcmdzICAgQXJyYXlsaXN0IG9mIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIFJlc3BvbnNlIE9NRWxlbWVudAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgYSBwcm9ibGVtIC0gdGhpcyBjYW4gZWl0aGVyIGJlIGEgcHJvY2Vzc2luZyBmYXVsdCBvciBhIHJlY2VpdmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgb24tdGhlLXdpcmUgZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBpbnZva2VCbG9ja2luZyhRTmFtZSBvcE5hbWUsIE9iamVjdCBbXSBhcmdzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IEJlYW5VdGlsLmdldE9NRWxlbWVudChvcE5hbWUsIGFyZ3MsIG51bGwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgaWYgKG5vdE51bGxTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuc2VuZFJlY2VpdmUob3BOYW1lLCBvbUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5zZW5kUmVjZWl2ZShvbUVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcE5hbWUgICAgICBPcGVyYXRpb24gUU5hbWUgKHRvIGdldCB0aGUgYm9keSB3cmFwcGVyIGVsZW1lbnQpCi0gICAgICogQHBhcmFtIGFyZ3MgICAgICAgIEFycmF5bGlzdCBvZiBvYmplY3RzCi0gICAgICogQHBhcmFtIHJldHVyblR5cGVzICwgdGhpcyBhcnJheSBjb250YWlucyB0aGUgSmF2YVR5cGVzIGZvciB0aGUgcmV0dXJuIG9iamVjdCAsIGl0IGNvdWxkIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgIG9uZSBvciBtb3JlIGRlcGVuZGluZyBvbiB0aGUgcmV0dXJuIHR5cGUgLCBtb3N0IG9mIHRoZSB0eXBlIGFycmF5IHdpbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgY29udGFpbiBqdXN0IG9uZSBlbGVtZW50IEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBhcnJheSBzaG91bGQgb25seQotICAgICAqICAgICAgICAgICAgICAgICAgICBjb250YWlucyBKYXZhVHlwZXMgTk9UIHJlYWwgb2JqZWN0ICwgd2hhdCB0aGlzIG1ldGhvZHMgZG9lcyBpcyAsIGdldCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgYm9keSBmaXJzdCBlbGVtZW50ICwgYW5kIGlmIGl0IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2hpbGRlcm4gdGFrZSBpdGgKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgY29udmVydCB0aGF0IHRvIGl0aCBqYXZhdHlwZSBhbmQgZmlsbCB0aGUgcmV0dXJuIGFycnlhIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICBhcnJheSB3aWxsIGxvb2sgbGlrZSBhcyBmb2xsb3dzIFtJbnRlZ2VyLCBTdHJpbmcsIE15QmVhbiAsIGV0Y10KLSAgICAgKiBAcmV0dXJuIE9iamVjdCBhcnJheSAsIHdoaWMgd2lsbCBjb250YWlucyByZWFsIG9iamVjdCAsIGJ1dCB0aGUgb2JqZWN0IGNhbiBlaXRoZXIgYmUgc2ltcGxlCi0gICAgICogICAgICAgICB0eXBlIG9iamVjdCBvciB0aGUgSmF2YUJlYW5zLCB0aGF0cyB3aGF0IHRoaXMgbWV0aG9kIGNhbiBoYW5kbGUgcmlnaHQgbm93IHRoZSByZXR1cm4KLSAgICAgKiAgICAgICAgIGFycmF5IHdpbGwgY29udGFpbnMgWzEwLCAiQXhpczJFY2hvIiwgeyJmb28iLCJiYWEiLCIxMSJ9XQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGEgcHJvYmxlbSBvY2N1cnJlZCwgZWl0aGVyIGxvY2FsbHkgb3Igb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIHdpcmUKLSAgICAgKi8KLQotICAgIHB1YmxpYyBPYmplY3RbXSBpbnZva2VCbG9ja2luZyhRTmFtZSBvcE5hbWUsIE9iamVjdCBbXSBhcmdzLCBDbGFzcyBbXSByZXR1cm5UeXBlcykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gQmVhblV0aWwuZ2V0T01FbGVtZW50KG9wTmFtZSwgYXJncywgbnVsbCwgZmFsc2UsIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2U7Ci0gICAgICAgIGlmIChub3ROdWxsU2VydmljZSkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBzdXBlci5zZW5kUmVjZWl2ZShvcE5hbWUsIG9tRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHN1cGVyLnNlbmRSZWNlaXZlKG9tRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJlYW5VdGlsLmRlc2VyaWFsaXplKHJlc3BvbnNlLCByZXR1cm5UeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIHRoZSBub25ibG9ja2luZy9Bc3luY2hyb25vdXMgY2FsbAotICAgICAqCi0gICAgICogQHBhcmFtIG9wTmFtZSBPcGVyYXRpb24gUU5hbWUgKHRvIGdldCB0aGUgYm9keSB3cmFwcGVyIGVsZW1lbnQpCi0gICAgICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgYXJndW1lbnQgT2JqZWN0cwotICAgICAqIEBwYXJhbSBjYWxsYmFjayBvYmplY3QgZXh0ZW5kaW5nIENhbGxiYWNrIHdoaWNoIHdpbGwgcmVjZWl2ZSBub3RpZmljYXRpb25zCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBhIGxvY2FsIHByb2Nlc3NpbmcgZXJyb3IKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSBBeGlzQ2FsbGJhY2sgaW50ZXJmYWNlIHJhdGhlciB0aGFuIENhbGxiYWNrLCB3aGljaCBoYXMgYmVlbiBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlTm9uQmxvY2tpbmcoUU5hbWUgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBbXSBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBCZWFuVXRpbC5nZXRPTUVsZW1lbnQob3BOYW1lLCBhcmdzLCBudWxsLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgIC8vIGNhbGwgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KLSAgICAgICAgaWYgKG5vdE51bGxTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBzdXBlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9wTmFtZSwgb21FbGVtZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9tRWxlbWVudCwgY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIHRoZSBub25ibG9ja2luZy9Bc3luY2hyb25vdXMgY2FsbAotICAgICAqCi0gICAgICogQHBhcmFtIG9wTmFtZSBPcGVyYXRpb24gUU5hbWUgKHRvIGdldCB0aGUgYm9keSB3cmFwcGVyIGVsZW1lbnQpCi0gICAgICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgYXJndW1lbnQgT2JqZWN0cwotICAgICAqIEBwYXJhbSBjYWxsYmFjayBvYmplY3QgaW1wbGVtZW50aW5nIEF4aXNDYWxsYmFjayB3aGljaCB3aWxsIHJlY2VpdmUgbm90aWZpY2F0aW9ucwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgYSBsb2NhbCBwcm9jZXNzaW5nIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlTm9uQmxvY2tpbmcoUU5hbWUgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBbXSBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDYWxsYmFjayBjYWxsYmFjaykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gQmVhblV0aWwuZ2V0T01FbGVtZW50KG9wTmFtZSwgYXJncywgbnVsbCwgZmFsc2UsIG51bGwpOwotICAgICAgICAvLyBjYWxsIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uCi0gICAgICAgIGlmIChub3ROdWxsU2VydmljZSkgewotICAgICAgICAgICAgc3VwZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhvcE5hbWUsIG9tRWxlbWVudCwgY2FsbGJhY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3VwZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhvbUVsZW1lbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludm9rZVJvYnVzdChRTmFtZSBvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBbXSBhcmdzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IEJlYW5VdGlsLmdldE9NRWxlbWVudChvcE5hbWUsIGFyZ3MsIG51bGwsIGZhbHNlLCBudWxsKTsKLSAgICAgICAgLy9jYWxsIHRoZSB1bmRlcmxpbmUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgaWYgKG5vdE51bGxTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBzdXBlci5zZW5kUm9idXN0KG9wTmFtZSwgb21FbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLnNlbmRSb2J1c3Qob21FbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL1JQQ0luT25seU1lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDU5ZGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KGluTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIENsYXNzIEltcGxDbGFzcyA9IG9iai5nZXRDbGFzcygpOwotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gaW5NZXNzYWdlLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50ID0gaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5BeGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IEltcGxDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSUENVdGlsLmludm9rZVNlcnZpY2VDbGFzcyhpbkF4aXNNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQsaW5NZXNzYWdlKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbGljYXRlU3RhdGUoaW5NZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBjYXVzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNhdXNlID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoY2F1c2UpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRkNmFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL1JQQ0luT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBSUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogcmVmbGVjdCBhbmQgZ2V0IHRoZSBKYXZhIG1ldGhvZCAtIGZvciBlYWNoIGkndGggcGFyYW0gaW4gdGhlIGphdmEgbWV0aG9kIC0gZ2V0IHRoZSBmaXJzdAotICAgICAqIGNoaWxkJ3MgaSd0aCBjaGlsZCAtaWYgdGhlIGVsZW0gaGFzIGFuIHhzaTp0eXBlIGF0dHIgdGhlbiBmaW5kIHRoZSBkZXNlcmlhbGl6ZXIgZm9yIGl0IC0gaWYKLSAgICAgKiBub3QgZm91bmQsIGxvb2t1cCBkZXNlciBmb3IgdGggaSd0aCBwYXJhbSAoamF2YSB0eXBlKSAtIGVycm9yIGlmIG5vdCBmb3VuZCAtIGRlc2VyaWFsaXplICYKLSAgICAgKiBzYXZlIGluIGFuIG9iamVjdCBhcnJheSAtIGVuZCBmb3IKLSAgICAgKiA8cC8+Ci0gICAgICogLSBpbnZva2UgbWV0aG9kIGFuZCBnZXQgdGhlIHJldHVybiB2YWx1ZQotICAgICAqIDxwLz4KLSAgICAgKiAtIGxvb2sgdXAgc2VyaWFsaXplciBmb3IgcmV0dXJuIHZhbHVlIGJhc2VkIG9uIHRoZSB2YWx1ZSBhbmQgdHlwZQotICAgICAqIDxwLz4KLSAgICAgKiAtIGNyZWF0ZSByZXNwb25zZSBtc2cgYW5kIGFkZCByZXR1cm4gdmFsdWUgYXMgZ3JhbmQgY2hpbGQgb2YgPHNvYXA6Ym9keT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbk1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gb3V0TWVzc2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KGluTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIENsYXNzIEltcGxDbGFzcyA9IG9iai5nZXRDbGFzcygpOwotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gaW5NZXNzYWdlLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBJbXBsQ2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2RzW2ldOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcmVzT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNPYmplY3QgPSBSUENVdGlsLmludm9rZVNlcnZpY2VDbGFzcyhpbmF4aXNNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQsaW5NZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBnZXRTT0FQRmFjdG9yeShpbk1lc3NhZ2UpOwotCi0gICAgICAgICAgICAvLyBIYW5kbGluZyB0aGUgcmVzcG9uc2UKLQotICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0YXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgaWYgKG91dGF4aXNNZXNzYWdlICE9IG51bGwgJiYgb3V0YXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkgIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IG91dGF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlID0gc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UobWVzc2FnZU5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDb250ZW50ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKXsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChvdXRNZXNzYWdlLmdldEF4aXNNZXNzYWdlKCkuZ2V0TmFtZSgpLCBucyk7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDaGlsZCk7Ci0gICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGFyYW1ldGVyIGdlbmVyYXRlQmFyZSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkVfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmF0ZUJhcmUhPW51bGwgJiYgInRydWUiLmVxdWFscyhnZW5lcmF0ZUJhcmUuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICBSUENVdGlsLnByb2Nlc3NSZXNvbnNlQXNEb2NMaXRCYXJlKHJlc09iamVjdCwgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLCBmYWMsIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNvbnRlbnQsIG91dE1lc3NhZ2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBSUENVdGlsLnByb2Nlc3NSZXNwb25zZUFzRG9jTGl0V3JhcHBlZChyZXNPYmplY3QsIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGVudmVsb3BlLCBmYWMsIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNvbnRlbnQsIG91dE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2cgPSAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBpbnZva2Ugc2VydmljZSBtZXRob2QgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBBeGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQXhpc0ZhdWx0KWNhdXNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2cpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDTWVzc2FnZVJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4YzI3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotKiBSZWZsZWN0aW9uIGJhc2VkIFJQQ01lc3NhZ2VSZWNlaXZlciAsIHJlcXVlc3Qgd2lsbCBiZSBwcm9jZXNzZWQgYnkgbG9va2luZyBhdCB0aGUgbWV0aG9kIHNpZ25hdHVyZQotKiBvZiB0aGUgaW52b2NhdGlvbiBtZXRob2QKLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUlBDTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJQQ01lc3NhZ2VSZWNlaXZlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiByZWZsZWN0IGFuZCBnZXQgdGhlIEphdmEgbWV0aG9kIC0gZm9yIGVhY2ggaSd0aCBwYXJhbSBpbiB0aGUgamF2YSBtZXRob2QgLSBnZXQgdGhlIGZpcnN0Ci0gICAgICogY2hpbGQncyBpJ3RoIGNoaWxkIC1pZiB0aGUgZWxlbSBoYXMgYW4geHNpOnR5cGUgYXR0ciB0aGVuIGZpbmQgdGhlIGRlc2VyaWFsaXplciBmb3IgaXQgLSBpZgotICAgICAqIG5vdCBmb3VuZCwgbG9va3VwIGRlc2VyIGZvciB0aCBpJ3RoIHBhcmFtIChqYXZhIHR5cGUpIC0gZXJyb3IgaWYgbm90IGZvdW5kIC0gZGVzZXJpYWxpemUgJgotICAgICAqIHNhdmUgaW4gYW4gb2JqZWN0IGFycmF5IC0gZW5kIGZvcgotICAgICAqIDxwLz4KLSAgICAgKiAtIGludm9rZSBtZXRob2QgYW5kIGdldCB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICogPHAvPgotICAgICAqIC0gbG9vayB1cCBzZXJpYWxpemVyIGZvciByZXR1cm4gdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIGFuZCB0eXBlCi0gICAgICogPHAvPgotICAgICAqIC0gY3JlYXRlIHJlc3BvbnNlIG1zZyBhbmQgYWRkIHJldHVybiB2YWx1ZSBhcyBncmFuZCBjaGlsZCBvZiA8c29hcDpib2R5PgotICAgICAqCi0gICAgICogQHBhcmFtIGluTWVzc2FnZSBpbmNvbWluZyBNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBvdXRNZXNzYWdlIG91dGdvaW5nIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0gICAgICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoaW5NZXNzYWdlKTsKLQotICAgICAgICAgICAgQ2xhc3MgSW1wbENsYXNzID0gb2JqLmdldENsYXNzKCk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBpbk1lc3NhZ2UuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIG1ldGhvZCA9IChNZXRob2QpKG9wLmdldFBhcmFtZXRlclZhbHVlKCJteU1ldGhvZCIpKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50ID0gaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluQXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSA9IG51bGw7Ci0KLQotICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IEltcGxDbGFzcy5nZXRNZXRob2RzKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QxIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kMS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2QxOwotICAgICAgICAgICAgICAgICAgICAgICAgb3AuYWRkUGFyYW1ldGVyKCJteU1ldGhvZCIsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gc3VjaCBtZXRob2QgJyIgKyBtZXRob2ROYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyBpbiBjbGFzcyAiICsgSW1wbENsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgT2JqZWN0IHJlc09iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzT2JqZWN0ID0gUlBDVXRpbC5pbnZva2VTZXJ2aWNlQ2xhc3MoaW5BeGlzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LGluTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjID0gZ2V0U09BUEZhY3RvcnkoaW5NZXNzYWdlKTsKLQotICAgICAgICAgICAgLy8gSGFuZGxpbmcgdGhlIHJlc3BvbnNlCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRheGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAob3V0YXhpc01lc3NhZ2UgIT0gbnVsbCAmJiBvdXRheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSAhPW51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlID0gb3V0YXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgPSBzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShtZXNzYWdlTmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KG91dE1lc3NhZ2UuZ2V0QXhpc01lc3NhZ2UoKS5nZXROYW1lKCksIG5zKTsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgZ2VuZXJhdGVCYXJlID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoSmF2YTJXU0RMQ29uc3RhbnRzLkRPQ19MSVRfQkFSRV9QQVJBTUVURVIpOwotICAgICAgICAgICAgaWYgKGdlbmVyYXRlQmFyZSE9bnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGdlbmVyYXRlQmFyZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgIFJQQ1V0aWwucHJvY2Vzc1Jlc29uc2VBc0RvY0xpdEJhcmUocmVzT2JqZWN0LCBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUsIGZhYywgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2R5Q29udGVudCwgb3V0TWVzc2FnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJQQ1V0aWwucHJvY2Vzc1Jlc3BvbnNlQXNEb2NMaXRXcmFwcGVkKHJlc09iamVjdCwgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgZW52ZWxvcGUsIGZhYywgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib2R5Q29udGVudCwgb3V0TWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKwotICAgICAgICAgICAgICAgIAkobWV0aG9kICE9IG51bGwgPyBtZXRob2QuZ2V0TmFtZSgpIDogIm51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2csIGNhdXNlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQXhpc0ZhdWx0KWNhdXNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgIH0gY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBpbnZva2Ugc2VydmljZSBtZXRob2QgIiArCi0gICAgICAgICAgICAJKG1ldGhvZCAhPSBudWxsID8gbWV0aG9kLmdldE5hbWUoKSA6ICJudWxsIik7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9SUENVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNmJiODkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvUlBDVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uZmFjdG9yeS5PTVhNTEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZW1hcHBpbmcuU2ltcGxlVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkJlYW5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLk51bGxYTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLlR5cGVUYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5PYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUlBDVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUkVUVVJOX1dSQVBQRVIgPSAicmV0dXJuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzUmVzcG9uc2UoU09BUEZhY3RvcnkgZmFjLCBPYmplY3QgcmVzT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWFsaWZpZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlVGFibGUgdHlwZVRhYmxlKSB7Ci0gICAgICAgIGlmIChyZXNPYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9zaW1wbGUgdHlwZQotICAgICAgICAgICAgaWYgKHJlc09iamVjdCBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSAoT01FbGVtZW50KSByZXNPYmplY3Q7Ci0gICAgICAgICAgICAgICAgYm9keUNvbnRlbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSArICJSZXNwb25zZSIsIG5zKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVzV3JhcHBlcjsKLSAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc1dyYXBwZXIgPSBmYWMuY3JlYXRlT01FbGVtZW50KFJFVFVSTl9XUkFQUEVSLCBucy5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBucy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzV3JhcHBlciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUkVUVVJOX1dSQVBQRVIsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNXcmFwcGVyLmFkZENoaWxkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQocmVzV3JhcHBlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKHJlc09iamVjdCkpIHsKLSAgICAgICAgICAgICAgICBib2R5Q29udGVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIiwgbnMpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBjaGlsZDsKLSAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChSRVRVUk5fV1JBUFBFUiwgbnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChSRVRVUk5fV1JBUFBFUiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQoY2hpbGQsIFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUocmVzT2JqZWN0KSkpOwotICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYm9keUNvbnRlbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSArICJSZXNwb25zZSIsIG5zKTsKLSAgICAgICAgICAgICAgICAvLyBKYXZhIEJlYW5zCi0gICAgICAgICAgICAgICAgUU5hbWUgcmV0dXJuV3JhcHBlcjsKLSAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybldyYXBwZXIgPSBuZXcgUU5hbWUobnMuZ2V0TmFtZXNwYWNlVVJJKCksIFJFVFVSTl9XUkFQUEVSLCBucy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuV3JhcHBlciA9IG5ldyBRTmFtZShSRVRVUk5fV1JBUFBFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4ciA9IEJlYW5VdGlsLmdldFB1bGxQYXJzZXIocmVzT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuV3JhcHBlciwgdHlwZVRhYmxlLCBxdWFsaWZpZWQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBTdEFYT01CdWlsZGVyIHN0QVhPTUJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgT01YTUxCdWlsZGVyRmFjdG9yeS5jcmVhdGVTdEFYT01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwgbmV3IFN0cmVhbVdyYXBwZXIoeHIpKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gc3RBWE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoZG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJvZHlDb250ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q29udGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc09iamVjdEFzRG9jTGl0QmFyZShTT0FQRmFjdG9yeSBmYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVUYWJsZSB0eXBlVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lKSB7Ci0gICAgICAgIGlmIChyZXNPYmplY3QgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSAoT01FbGVtZW50KSByZXNPYmplY3Q7Ci0gICAgICAgICAgICBib2R5Q29udGVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lLCBucyk7Ci0gICAgICAgICAgICBib2R5Q29udGVudC5hZGRDaGlsZChyZXN1bHQpOwotICAgICAgICB9IGVsc2UgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNTaW1wbGVUeXBlKHJlc09iamVjdCkpIHsKLSAgICAgICAgICAgIGJvZHlDb250ZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsIG5zKTsKLSAgICAgICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQoYm9keUNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgIFNpbXBsZVR5cGVNYXBwZXIuZ2V0U3RyaW5nVmFsdWUocmVzT2JqZWN0KSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUU5hbWUgcmV0dXJuV3JhcHBlciA9IG5ldyBRTmFtZShucy5nZXROYW1lc3BhY2VVUkkoKSwgcGFydE5hbWUsIG5zLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4ciA9IEJlYW5VdGlsLmdldFB1bGxQYXJzZXIocmVzT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICByZXR1cm5XcmFwcGVyLCB0eXBlVGFibGUsIHF1YWxpZmllZCwgdHJ1ZSk7Ci0gICAgICAgICAgICBTdEFYT01CdWlsZGVyIHN0QVhPTUJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBPTVhNTEJ1aWxkZXJGYWN0b3J5LmNyZWF0ZVN0QVhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksIG5ldyBTdHJlYW1XcmFwcGVyKHhyKSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gc3RBWE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChkb2N1bWVudEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChib2R5Q29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNvbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIHByb2Nlc3NSZXF1ZXN0KE9NRWxlbWVudCBtZXRob2RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCwgT2JqZWN0U3VwcGxpZXIgb2JqZWN0U3VwcGxpZXIpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIHJldHVybiBCZWFuVXRpbC5kZXNlcmlhbGl6ZShtZXRob2RFbGVtZW50LCBwYXJhbWV0ZXJzLCBvYmplY3RTdXBwbGllcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlU2VydmljZUNsYXNzKEF4aXNNZXNzYWdlIGluQXhpc01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbXBsQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0LAotICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIG1ldGhvZCBhY2NlcHQgZW1wdHkgU09BUGJvZHkKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGltcGxDbGFzcywgbmV3IE9iamVjdFswXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaCByZXF1aXJlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm91bmQgbm9uZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2VOYW1lU3BhY2UuZXF1YWxzKG5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibmFtZXNwYWNlIG1pc21hdGNoIHJlcXVpcmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCAiICsgbWV0aG9kRWxlbWVudC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlIG1pc21hdGNoLiBBeGlzIE9lcHJhdGlvbiBleHBlY3RzIG5vbi1uYW1lc3BhY2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZWQgZWxlbWVudC4gQnV0IHJlY2VpdmVkIGEgbmFtZXNwYWNlIHF1YWxpZmllZCBlbGVtZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RBcnJheTsKLSAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlLmlzV3JhcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0QXJyYXkgPSBSUENVdGlsLnByb2Nlc3NSZXF1ZXN0KG1ldGhvZEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpLmdldE9iamVjdFN1cHBsaWVyKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvYmplY3RBcnJheSA9IFJQQ1V0aWwucHJvY2Vzc1JlcXVlc3QoKE9NRWxlbWVudCkgbWV0aG9kRWxlbWVudC5nZXRQYXJlbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T2JqZWN0U3VwcGxpZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShpbXBsQ2xhc3MsIG9iamVjdEFycmF5KTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UmVzcG9uc2VFbGVtZW50KFFOYW1lIHJlc25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9ianMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlVGFibGUgdHlwZVRhYmxlKSB7Ci0gICAgICAgIGlmIChxdWFsaWZpZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBCZWFuVXRpbC5nZXRPTUVsZW1lbnQocmVzbmFtZSwgb2JqcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHJlc25hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX1dSQVBQRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbmFtZS5nZXRQcmVmaXgoKSksCi0gICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCwKLSAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCZWFuVXRpbC5nZXRPTUVsZW1lbnQocmVzbmFtZSwgb2JqcywKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFJFVFVSTl9XUkFQUEVSKSwgcXVhbGlmaWVkLAotICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NSZXNvbnNlQXNEb2NMaXRCYXJlKE9iamVjdCByZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlCi0gICAgKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gb3V0TWVzc2FnZS5nZXRBeGlzTWVzc2FnZSgpLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBvdXRNZXNzYWdlLmdldEF4aXNNZXNzYWdlKCkuZ2V0UGFydE5hbWUoKTsKLSAgICAgICAgaWYgKHJlc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9jZXNzTnVsbFJldHVybnMoc2VydmljZSwgZW52ZWxvcGUsIHBhcnROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZXNPYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotICAgICAgICAgICAgICAgIFFOYW1lIHJlc05hbWUgPSBuZXcgUU5hbWUoZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBSUENVdGlsLmdldFJlc3BvbnNlRWxlbWVudChyZXNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgKE9iamVjdFtdKSByZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFR5cGVUYWJsZSgpKTsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc09iamVjdC5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHJlc09iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmpBcnJheVtdOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzT2JqZWN0IGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpBcnJheSA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpBcnJheVswXSA9IEJhc2U2NC5lbmNvZGUoKGJ5dGVbXSkgcmVzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5ID0gbmV3IE9iamVjdFtsZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5W2ldID0gQXJyYXkuZ2V0KHJlc09iamVjdCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZXNOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNoaWxkID0gUlBDVXRpbC5nZXRSZXNwb25zZUVsZW1lbnQocmVzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRUeXBlVGFibGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzQ29sbGVjdGlvbihyZXNPYmplY3QuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSByZXNPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGNvbGxlY3Rpb24uc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlc1tdID0gbmV3IE9iamVjdFtzaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2NvdW50XSA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSByZXNOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNoaWxkID0gUlBDVXRpbC5nZXRSZXNwb25zZUVsZW1lbnQocmVzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU2ltcGxlVHlwZU1hcHBlci5pc0RhdGFIYW5kbGVyKHJlc09iamVjdC5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHJlc0VsZW10OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0VsZW10ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChwYXJ0TmFtZSwgbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNFbGVtdCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQocGFydE5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgT01UZXh0IHRleHQgPSBmYWMuY3JlYXRlT01UZXh0KHJlc09iamVjdCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNFbGVtdC5hZGRDaGlsZCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZXNFbGVtdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDVXRpbC5wcm9jZXNzT2JqZWN0QXNEb2NMaXRCYXJlKGZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ1V0aWwucHJvY2Vzc09iamVjdEFzRG9jTGl0QmFyZShmYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5Q29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dE1lc3NhZ2Uuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZSB0byB0byBjcmV0ZSB0aGUgcmVwb3NuZSB3aGVuICwgdGhlIHJldHVybiB2YWx1ZSBpcyBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZSAgQ3VycmVudCBBeGlzU2VydmljZQotICAgICAqIEBwYXJhbSBlbnZlbG9wZSByZXNwb25zZSBlbmV2ZWxvcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc051bGxSZXR1cm5zKEF4aXNTZXJ2aWNlIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlLCBTdHJpbmcgcGFydE5hbWUpIHsKLSAgICAgICAgUU5hbWUgcmVzTmFtZTsKLSAgICAgICAgaWYgKHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSkgewotICAgICAgICAgICAgcmVzTmFtZSA9IG5ldyBRTmFtZShzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNOYW1lID0gbmV3IFFOYW1lKHBhcnROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeHIgPSBuZXcgTnVsbFhNTFN0cmVhbVJlYWRlcihyZXNOYW1lKTsKLSAgICAgICAgU3RyZWFtV3JhcHBlciBwYXJzZXIgPSBuZXcgU3RyZWFtV3JhcHBlcih4cik7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgT01YTUxCdWlsZGVyRmFjdG9yeS5jcmVhdGVTdEFYT01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLCBwYXJzZXIpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoc3RBWE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1Jlc3BvbnNlQXNEb2NMaXRXcmFwcGVkKE9iamVjdCByZXNPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZQotICAgICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IG91dE1lc3NhZ2UuZ2V0QXhpc01lc3NhZ2UoKS5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgaWYgKHJlc09iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSByZXNOYW1lOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgIHJlc05hbWUgPSBuZXcgUU5hbWUoc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9XUkFQUEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc05hbWUgPSBuZXcgUU5hbWUoUkVUVVJOX1dSQVBQRVIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhyID0gbmV3IE51bGxYTUxTdHJlYW1SZWFkZXIocmVzTmFtZSk7Ci0gICAgICAgICAgICBTdHJlYW1XcmFwcGVyIHBhcnNlciA9IG5ldyBTdHJlYW1XcmFwcGVyKHhyKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIE9NWE1MQnVpbGRlckZhY3RvcnkuY3JlYXRlU3RBWE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksIHBhcnNlcik7Ci0gICAgICAgICAgICBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KG1ldGhvZC5nZXROYW1lKCkgKyAiUmVzcG9uc2UiLCBucyk7Ci0gICAgICAgICAgICBib2R5Q2hpbGQuYWRkQ2hpbGQoc3RBWE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZXNPYmplY3QgaW5zdGFuY2VvZiBPYmplY3RbXSkgewotCi0gICAgICAgICAgICAgICAgUU5hbWUgcmVzTmFtZSA9IG5ldyBRTmFtZShlbGVtZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IFJQQ1V0aWwuZ2V0UmVzcG9uc2VFbGVtZW50KHJlc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIHJlc09iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzT2JqZWN0LmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgocmVzT2JqZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iakFycmF5W107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNPYmplY3QgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5ID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5WzBdID0gQmFzZTY0LmVuY29kZSgoYnl0ZVtdKSByZXNPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXkgPSBuZXcgT2JqZWN0W2xlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqQXJyYXlbaV0gPSBBcnJheS5nZXQocmVzT2JqZWN0LCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlc05hbWUgPSBuZXcgUU5hbWUoZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCkgKyAiUmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBSUENVdGlsLmdldFJlc3BvbnNlRWxlbWVudChyZXNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFR5cGVUYWJsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGJvZHlDaGlsZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFNpbXBsZVR5cGVNYXBwZXIuaXNDb2xsZWN0aW9uKHJlc09iamVjdC5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHJlc09iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gY29sbGVjdGlvbi5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWVzW10gPSBuZXcgT2JqZWN0W3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbY291bnRdID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHJlc05hbWUgPSBuZXcgUU5hbWUoZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpICsgIlJlc3BvbnNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Q2hpbGQgPSBSUENVdGlsLmdldFJlc3BvbnNlRWxlbWVudChyZXNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRUeXBlVGFibGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTaW1wbGVUeXBlTWFwcGVyLmlzRGF0YUhhbmRsZXIocmVzT2JqZWN0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVzRWxlbXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KG1ldGhvZC5nZXROYW1lKCkgKyAiUmVzcG9uc2UiLCBucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTVRleHQgdGV4dCA9IGZhYy5jcmVhdGVPTVRleHQocmVzT2JqZWN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXR1cm5FbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNFbGVtZW50Rm9ybURlZmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFJFVFVSTl9XUkFQUEVSLCBucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFJFVFVSTl9XUkFQUEVSLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQuYWRkQ2hpbGQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNFbGVtdC5hZGRDaGlsZChyZXR1cm5FbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZXNFbGVtdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDVXRpbC5wcm9jZXNzUmVzcG9uc2UoZmFjLCByZXNPYmplY3QsIGJvZHlDb250ZW50LCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFR5cGVUYWJsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDVXRpbC5wcm9jZXNzUmVzcG9uc2UoZmFjLCByZXNPYmplY3QsIGJvZHlDb250ZW50LCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFR5cGVUYWJsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvdXRNZXNzYWdlLnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTQxZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQkluT25seU1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuZWpiOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFSkJJbk9ubHlNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBtYWtlTmV3U2VydmljZU9iamVjdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIEVKQlV0aWwubWFrZU5ld1NlcnZpY2VPYmplY3QobXNnQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQkluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL2VqYi9FSkJJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmU5NmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQkluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLmVqYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyOwotCi0vKioKLSAqIEFuIEVKQkluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIKLSAqCi0gKiBAZGVwcmVjYXRlZCB5b3UgY2FuIGp1c3QgdXNlIEVKQk1lc3NhZ2VSZWNlaXZlcgotICovCi1wdWJsaWMgY2xhc3MgRUpCSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIFJQQ01lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShmaW5hbCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbWVzc2FnZUN0eC5zZXRQcm9wZXJ0eShET19BU1lOQywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc3VwZXIucmVjZWl2ZShtZXNzYWdlQ3R4KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG1ha2VOZXdTZXJ2aWNlT2JqZWN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gRUpCVXRpbC5tYWtlTmV3U2VydmljZU9iamVjdChtc2dDb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCTWVzc2FnZVJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvcnBjL3JlY2VpdmVycy9lamIvRUpCTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODdkOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQk1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuZWpiOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFSkJNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBSUENNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBtYWtlTmV3U2VydmljZU9iamVjdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIEVKQlV0aWwubWFrZU5ld1NlcnZpY2VPYmplY3QobXNnQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQlV0aWwuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi9ycGMvcmVjZWl2ZXJzL2VqYi9FSkJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTIwM2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JwYy9yZWNlaXZlcnMvZWpiL0VKQlV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5lamI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbC5EZWZhdWx0VGhyZWFkRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBFSkJVdGlsIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUpCX0pORElfTkFNRSA9ICJiZWFuSm5kaU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfSE9NRV9JTlRFUkZBQ0VfTkFNRSA9ICJob21lSW50ZXJmYWNlTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVKQl9SRU1PVEVfSU5URVJGQUNFX05BTUUgPSAicmVtb3RlSW50ZXJmYWNlTmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVKQl9MT0NBTF9IT01FX0lOVEVSRkFDRV9OQU1FID0gImxvY2FsSG9tZUludGVyZmFjZU5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfTE9DQUxfSU5URVJGQUNFX05BTUUgPSAibG9jYWxJbnRlcmZhY2VOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUpCX0lOSVRJQUxfQ09OVEVYVF9GQUNUT1JZID0gImpuZGlDb250ZXh0Q2xhc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfUFJPVklERVJfVVJMID0gInByb3ZpZGVyVXJsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRUpCX0pORElfVVNFUk5BTUUgPSAiam5kaVVzZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBFSkJfSk5ESV9QQVNTV09SRCA9ICJqbmRpUGFzc3dvcmQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIHdvcmtlclBvb2wgPSBudWxsOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgd29ya2VyUG9vbCA9Ci0gICAgICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvcigxLCA1MCwgMTUwTCwgVGltZVVuaXQuU0VDT05EUywgbmV3IExpbmtlZEJsb2NraW5nUXVldWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0VGhyZWFkRmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZEdyb3VwKCJFSkIgcHJvdmlkZXIgdGhyZWFkIGdyb3VwIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFSkJQcm92aWRlciIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIHNlcnZpY2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBmYWlscwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IG1ha2VOZXdTZXJ2aWNlT2JqZWN0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDb3VudERvd25MYXRjaCBzdGFydExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBDb3VudERvd25MYXRjaCBzdG9wTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgIEVKQkNsaWVudFdvcmtlciB3b3JrZXIgPSBuZXcgRUpCQ2xpZW50V29ya2VyKG1zZ0NvbnRleHQsIHN0YXJ0TGF0Y2gsIHN0b3BMYXRjaCk7Ci0gICAgICAgIHdvcmtlclBvb2wuZXhlY3V0ZSh3b3JrZXIpOwotICAgICAgICBzdGFydExhdGNoLmNvdW50RG93bigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RvcExhdGNoLmF3YWl0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod29ya2VyLmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQod29ya2VyLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3b3JrZXIuZ2V0UmV0dXJuZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVKQkNsaWVudFdvcmtlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICAgICAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIHN0YXJ0TGF0Y2ggPSBudWxsOwotICAgICAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIHN0b3BMYXRjaCA9IG51bGw7Ci0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3NbXSBlbXB0eV9jbGFzc19hcnJheSA9IG5ldyBDbGFzc1swXTsKLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBlbXB0eV9vYmplY3RfYXJyYXkgPSBuZXcgT2JqZWN0WzBdOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBJbml0aWFsQ29udGV4dCBjYWNoZWRfY29udGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0IHJldHVybmVkVmFsdWUgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBFSkJDbGllbnRXb3JrZXIoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgQ291bnREb3duTGF0Y2ggc3RhcnRMYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBzdG9wTGF0Y2gpIHsKLSAgICAgICAgICAgIHRoaXMubXNnQ29udGV4dCA9IG1zZ0NvbnRleHQ7Ci0gICAgICAgICAgICB0aGlzLnN0YXJ0TGF0Y2ggPSBzdGFydExhdGNoOwotICAgICAgICAgICAgdGhpcy5zdG9wTGF0Y2ggPSBzdG9wTGF0Y2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN0YXJ0TGF0Y2guYXdhaXQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGV4dENsYXNzTG9hZGVyKHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciByZW1vdGVIb21lTmFtZSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEVKQl9IT01FX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgbG9jYWxIb21lTmFtZSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKEVKQl9MT0NBTF9IT01FX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgam5kaU5hbWUgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihFSkJfSk5ESV9OQU1FKTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgaG9tZU5hbWUgPSAocmVtb3RlSG9tZU5hbWUgIT0gbnVsbCA/IHJlbW90ZUhvbWVOYW1lIDogbG9jYWxIb21lTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoam5kaU5hbWUgPT0gbnVsbCB8fCBqbmRpTmFtZS5nZXRWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiam5kaSBuYW1lIGlzIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvbWVOYW1lID09IG51bGwgfHwgaG9tZU5hbWUuZ2V0VmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBmaW5kIGJvdGggcmVtb3RlIGhvbWUgYW5kIGxvY2FsIGhvbWUKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiZWpiIHJlbW90ZS9sb2NhbCBob21lIGNsYXNzIG5hbWUgaXMgbm90IHNwZWNpZmllZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSBlaXRoZXIgdGhlIGVqYiB1c2luZyBlaXRoZXIgdGhlIFJlbW90ZUhvbWUgb3IgTG9jYWxIb21lIG9iamVjdAotICAgICAgICAgICAgICAgIGlmIChyZW1vdGVIb21lTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFZhbHVlID0gY3JlYXRlUmVtb3RlRUpCKG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpam5kaU5hbWUuZ2V0VmFsdWUoKSkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKWhvbWVOYW1lLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFZhbHVlID0gY3JlYXRlTG9jYWxFSkIobXNnQ29udGV4dCwgKChTdHJpbmcpam5kaU5hbWUuZ2V0VmFsdWUoKSkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpaG9tZU5hbWUuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzdG9wTGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIEVKQiB1c2luZyBhIHJlbW90ZSBob21lIG9iamVjdAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICogQHBhcmFtIGJlYW5KbmRpTmFtZSBUaGUgSk5ESSBuYW1lIG9mIHRoZSBFSkIgcmVtb3RlIGhvbWUgY2xhc3MKLSAgICAgICAgICogQHBhcmFtIGhvbWVOYW1lICAgICB0aGUgbmFtZSBvZiB0aGUgaG9tZSBpbnRlcmZhY2UgY2xhc3MKLSAgICAgICAgICogQHJldHVybiBhbiBFSkIKLSAgICAgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgZmFpbHMKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IGNyZWF0ZVJlbW90ZUVKQihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBTdHJpbmcgYmVhbkpuZGlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvbWVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgRUpCIEhvbWUgb2JqZWN0IGZyb20gSk5ESQotICAgICAgICAgICAgT2JqZWN0IGVqYkhvbWUgPSBnZXRFSkJIb21lKG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKSwgYmVhbkpuZGlOYW1lKTsKLSAgICAgICAgICAgIENsYXNzIGNscyA9IGdldENvbnRleHRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhob21lTmFtZSk7Ci0gICAgICAgICAgICBPYmplY3QgZWhvbWUgPSBqYXZheC5ybWkuUG9ydGFibGVSZW1vdGVPYmplY3QubmFycm93KGVqYkhvbWUsIGNscyk7Ci0KLSAgICAgICAgICAgIC8vIEludm9rZSB0aGUgY3JlYXRlIG1ldGhvZCBvZiB0aGUgZWpiSG9tZSBjbGFzcyB3aXRob3V0IGFjdHVhbGx5Ci0gICAgICAgICAgICAvLyB0b3VjaGluZyBhbnkgRUpCIGNsYXNzZXMgKGkuZS4gbm8gY2FzdCB0byBFSkJIb21lKQotICAgICAgICAgICAgTWV0aG9kIGNyZWF0ZU1ldGhvZCA9IGNscy5nZXRNZXRob2QoImNyZWF0ZSIsIGVtcHR5X2NsYXNzX2FycmF5KTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1ldGhvZC5pbnZva2UoZWhvbWUsIGVtcHR5X29iamVjdF9hcnJheSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIEVKQiB1c2luZyBhIGxvY2FsIGhvbWUgb2JqZWN0Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgKiBAcGFyYW0gYmVhbkpuZGlOYW1lIFRoZSBKTkRJIG5hbWUgb2YgdGhlIEVKQiBsb2NhbCBob21lIGNsYXNzCi0gICAgICAgICAqIEBwYXJhbSBob21lTmFtZSAgICAgdGhlIG5hbWUgb2YgdGhlIGhvbWUgaW50ZXJmYWNlIGNsYXNzCi0gICAgICAgICAqIEByZXR1cm4gYW4gRUpCCi0gICAgICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIGZhaWxzCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVMb2NhbEVKQihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBTdHJpbmcgYmVhbkpuZGlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZU5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIEVKQiBIb21lIG9iamVjdCBmcm9tIEpOREkKLSAgICAgICAgICAgIE9iamVjdCBlamJIb21lID0gZ2V0RUpCSG9tZShtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCksIGJlYW5KbmRpTmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIHRoZSBob21lIG9iamVjdCBpcyBhIGxvY2FsIGhvbWUgb2JqZWN0Ci0gICAgICAgICAgICBPYmplY3QgZWhvbWU7Ci0KLSAgICAgICAgICAgIENsYXNzIGNscyA9IGdldENvbnRleHRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhob21lTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChjbHMuaXNJbnN0YW5jZShlamJIb21lKSkKLSAgICAgICAgICAgICAgICBlaG9tZSA9IGVqYkhvbWU7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJiYWQgZWpiIGhvbWUgdHlwZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJbnZva2UgdGhlIGNyZWF0ZSBtZXRob2Qgb2YgdGhlIGVqYkhvbWUgY2xhc3Mgd2l0aG91dCBhY3R1YWxseQotICAgICAgICAgICAgLy8gdG91Y2hpbmcgYW55IEVKQiBjbGFzc2VzIChpLmUuIG5vIGNhc3QgdG8gRUpCTG9jYWxIb21lKQotICAgICAgICAgICAgTWV0aG9kIGNyZWF0ZU1ldGhvZCA9IGNscy5nZXRNZXRob2QoImNyZWF0ZSIsIGVtcHR5X2NsYXNzX2FycmF5KTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1ldGhvZC5pbnZva2UoZWhvbWUsIGVtcHR5X29iamVjdF9hcnJheSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29tbW9uIHJvdXRpbmUgdG8gZG8gdGhlIEpOREkgbG9va3VwIG9uIHRoZSBIb21lIGludGVyZmFjZSBvYmplY3QgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0gICAgICAgICAqIGZvciBqbmRpIGxvb2t1cCBhcmUgZ290IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgbWVzc2FnZUNvbnRleHQgaWYgbm90IGZvdW5kIGluCi0gICAgICAgICAqIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXJ2aWNlICAgICAgQXhpc1NlcnZpY2Ugb2JqZWN0Ci0gICAgICAgICAqIEBwYXJhbSBiZWFuSm5kaU5hbWUgSk5ESSBuYW1lIG9mIHRoZSBFSkIgaG9tZSBvYmplY3QKLSAgICAgICAgICogQHJldHVybiBFSkIgaG9tZSBvYmplY3QKLSAgICAgICAgICogQHRocm93cyBBeGlzRmF1bHQgSWYgZmFscwotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgZ2V0RUpCSG9tZShBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgYmVhbkpuZGlOYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIE9iamVjdCBlamJIb21lOwotCi0gICAgICAgICAgICAvLyBTZXQgdXAgYW4gSW5pdGlhbENvbnRleHQgYW5kIHVzZSBpdCBnZXQgdGhlIGJlYW5KbmRpTmFtZSBmcm9tIEpOREkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBwcm9wZXJ0aWVzIHdlIG5lZWQgdG8gYWNjZXNzIEpOREk6Ci0gICAgICAgICAgICAgICAgLy8gdXNlcm5hbWUsIHBhc3N3b3JkLCBmYWN0b3J5Y2xhc3MsIGNvbnRleHRVcmwKLQotICAgICAgICAgICAgICAgIC8vIHVzZXJuYW1lCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHVzZXJuYW1lID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoRUpCX0pORElfVVNFUk5BTUUpOwotICAgICAgICAgICAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZyl1c2VybmFtZS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHBhc3N3b3JkCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhc3N3b3JkID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoRUpCX0pORElfUEFTU1dPUkQpOwotICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKXBhc3N3b3JkLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZmFjdG9yeSBjbGFzcwotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBmYWN0b3J5Q2xhc3MgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihFSkJfSU5JVElBTF9DT05URVhUX0ZBQ1RPUlkpOwotICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZylmYWN0b3J5Q2xhc3MuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb250ZXh0VXJsCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGNvbnRleHRVcmwgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihFSkJfUFJPVklERVJfVVJMKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dFVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb250ZXh0LlBST1ZJREVSX1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZyljb250ZXh0VXJsLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IGNvbnRleHQgdXNpbmcgdGhlc2UgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIEluaXRpYWxDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KHByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIGNvbnRleHQsIGZhaWwKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJjYW5ub3QgY3JlYXRlIGluaXRpYWwgY29udGV4dCIpOwotCi0gICAgICAgICAgICAgICAgZWpiSG9tZSA9IGdldEVKQkhvbWUoY29udGV4dCwgYmVhbkpuZGlOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChlamJIb21lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoImNhbm5vdCBmaW5kIGpuZGkgaG9tZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlamJIb21lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJbml0aWFsQ29udGV4dCBnZXRDYWNoZWRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoY2FjaGVkX2NvbnRleHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBjYWNoZWRfY29udGV4dCA9IG5ldyBJbml0aWFsQ29udGV4dCgpOwotICAgICAgICAgICAgcmV0dXJuIGNhY2hlZF9jb250ZXh0OwotICAgICAgICB9Ci0KLQotICAgICAgICBwcml2YXRlIEluaXRpYWxDb250ZXh0IGdldENvbnRleHQoUHJvcGVydGllcyBwcm9wZXJ0aWVzKQotICAgICAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQsIGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuICgocHJvcGVydGllcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IGdldENhY2hlZENvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbml0aWFsQ29udGV4dChwcm9wZXJ0aWVzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE9iamVjdCBnZXRFSkJIb21lKEluaXRpYWxDb250ZXh0IGNvbnRleHQsIFN0cmluZyBiZWFuSm5kaU5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCwgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5sb29rdXAoYmVhbkpuZGlOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmV0dXJuZWRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiByZXR1cm5lZFZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9qYXZhL0phdmFUcmFuc3BvcnRTZW5kZXIuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvamF2YS9KYXZhVHJhbnNwb3J0U2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTU2NWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9qYXZhL0phdmFUcmFuc3BvcnRTZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5qYXZhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZWZhdWx0T2JqZWN0U3VwcGxpZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk9iamVjdFN1cHBsaWVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDVXRpbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLXB1YmxpYyBjbGFzcyBKYXZhVHJhbnNwb3J0U2VuZGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgVHJhbnNwb3J0U2VuZGVyIHsNCi0NCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZDb250ZXh0LCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQpDQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsNCi0gICAgfQ0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQ0KLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgU09BUEVudmVsb3BlIHJlc3VsdEVudmVsb3BlID0gaW52b2tlSmF2YU1ldGhvZChtc2dDb250ZXh0KTsNCi0gICAgICAgIE9iamVjdCByZXNwb25zZU1DT2JqZWN0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoDQotICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7DQotICAgICAgICBpZiAocmVzcG9uc2VNQ09iamVjdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNQyA9IChNZXNzYWdlQ29udGV4dCkgcmVzcG9uc2VNQ09iamVjdDsNCi0gICAgICAgICAgICByZXNwb25zZU1DLnNldEVudmVsb3BlKHJlc3VsdEVudmVsb3BlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7DQotICAgIH0NCi0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgaW52b2tlSmF2YU1ldGhvZChNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpDQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBDbGFzcyBJbXBsQ2xhc3M7DQotICAgICAgICBPYmplY3Qgb2JqOw0KLSAgICAgICAgUGFyYW1ldGVyIGltcGxlbWVudGF0aW9uQ2xhc3MgPSBpbk1lc3NhZ2UuZ2V0UGFyYW1ldGVyKCJjbGFzc05hbWUiKTsNCi0gICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNsYXNzID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTZXJ2aWNlIENsYXNzIFBhcmFtYXRlciBkb2VzIG5vdCBmaW5kIGZvciB0aGUgc2VydmljZSA6ICINCi0gICAgICAgICAgICAgICAgICAgICsgaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlSW1wbGVDbGFzcyA9IGltcGxlbWVudGF0aW9uQ2xhc3MuZ2V0VmFsdWUoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSW1wbENsYXNzID0gQ2xhc3MuZm9yTmFtZShzZXJ2aWNlSW1wbGVDbGFzcy50b1N0cmluZygpKTsNCi0gICAgICAgICAgICBvYmogPSBJbXBsQ2xhc3MubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiRXhjZXB0aW9uIG9jY3VyIHdoaWxlIGNyZWF0aW5nIFsgIiArIHNlcnZpY2VJbXBsZUNsYXNzICsgIiBdIiwgZSk7DQotICAgICAgICB9DQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKQ0KLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSA9IGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2RFbGVtZW50LmdldExvY2FsTmFtZSgpOw0KLSAgICAgICAgLy9TZXJpdmUgaW1wcGxlbWVudGF0aW9uIGNsYXNzDQotICAgICAgICBNZXRob2QgbWV0aG9kID0gbnVsbDsNCi0gICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IEltcGxDbGFzcy5nZXRNZXRob2RzKCk7DQotCSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7DQotCSAgICAgICAgICAgIGlmIChtZXRob2RzW2ldLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsNCi0JICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZHNbaV07DQotCSAgICAgICAgICAgICAgICBicmVhazsNCi0JICAgICAgICAgICAgfQ0KLQkgICAgICAgIH0NCi0gICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibWV0aG9kIDogIiArIG1ldGhvZE5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgIiA6IGRvZXMgbm90IGZpbmQgaW4gdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgOiAiICsNCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbXBsZUNsYXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vZ2V0cyB0aGUgb2JqZWN0IGFycmF5IGZyb20gdGhlIHJlcXVlc3QgT01FbGVtZW50DQotICAgICAgICBPYmplY3RTdXBwbGllciBvYmoxID0gbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpOw0KLSAgICAgICAgT2JqZWN0W10gb2JqZWN0QXJyYXkgPSBSUENVdGlsLnByb2Nlc3NSZXF1ZXN0KG1ldGhvZEVsZW1lbnQsIG1ldGhvZCwgb2JqMSk7DQotICAgICAgICAvL3JlZmxlY3RpdmUgaW52b2NhdGlvbg0KLSAgICAgICAgT2JqZWN0IHJlc09iamVjdCA7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHJlc09iamVjdCA9IG1ldGhvZC5pbnZva2Uob2JqLCBvYmplY3RBcnJheSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkVycm9yIG9jY3VyZWQgd2hpbGUgaW52b2tpbmcgdGhlIG1ldGhvZCBbICIgKyBtZXRob2ROYW1lICsgIiBdIiwgZSk7DQotICAgICAgICB9DQotICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBnZXRTT0FQRmFjdG9yeShpbk1lc3NhZ2UpOw0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UobWVzc2FnZU5hbWVTcGFjZSwNCi0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQgPSBudWxsOw0KLSAgICAgICAgaWYgKHJlc09iamVjdCA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy9TZW5kIGVtcHR5IGJvZHkNCi0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NRWxlbWVudCgiaXRlbSIsIG5zKSk7DQotICAgICAgICB9IGVsc2UgaWYgKHJlc09iamVjdCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7DQotICAgICAgICAgICAgUU5hbWUgcmVzTmFtZSA9IG5ldyBRTmFtZShzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSArICJSZXNwb25zZSIsDQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsNCi0gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgb21lbGVtZW50IGZyb20gdGhlIHJlc3BvbnNlIGFycmF5DQotICAgICAgICAgICAgT01FbGVtZW50IGJvZHlDaGlsZCA9IFJQQ1V0aWwuZ2V0UmVzcG9uc2VFbGVtZW50KHJlc05hbWUsDQotICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIHJlc09iamVjdCwgZmFsc2UsIG51bGwpOw0KLSAgICAgICAgICAgIC8vcmV0dXJuIHR5cGUgaXMgc2VudCB3aXRoIGFycmF5IHNpemUNCi0gICAgICAgICAgICBib2R5Q2hpbGQuYWRkQXR0cmlidXRlKCJyZXR1cm5UeXBlIiwNCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAoKE9iamVjdFtdKSByZXNPYmplY3QpLmxlbmd0aCwNCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOw0KLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q2hpbGQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBSUENVdGlsLnByb2Nlc3NSZXNwb25zZShmYWMsIHJlc09iamVjdCwgYm9keUNvbnRlbnQsIG5zLCBlbnZlbG9wZSwgbWV0aG9kLCBmYWxzZSwgbnVsbCk7DQotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmFkZEF0dHJpYnV0ZSgicmV0dXJuVHlwZSIsDQotICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbnZlbG9wZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgU3RyaW5nIG5zVVJJID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5zVVJJKSkgew0KLSAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7DQotICAgICAgICB9IGVsc2UgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5zVVJJKSkgew0KLSAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZFNPQVB2ZXJzaW9uIikpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0FycmF5U3RhY2suamF2YSBiLzFfNS9tb2R1bGVzL2FkYi9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0FycmF5U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmMjk3Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9BcnJheVN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgamF2YS51dGlsLlN0YWNrfSBBUEkgdGhhdCBpcyBiYXNlZCBvbiBhbiA8Y29kZT5BcnJheUxpc3Q8L2NvZGU+Ci0gKiBpbnN0ZWFkIG9mIGEgPGNvZGU+VmVjdG9yPC9jb2RlPiwgc28gaXQgaXMgbm90IHN5bmNocm9uaXplZCB0byBwcm90ZWN0IGFnYWluc3QgbXVsdGktdGhyZWFkZWQKLSAqIGFjY2Vzcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGVyZWZvcmUgb3BlcmF0ZXMgZmFzdGVyIGluIGVudmlyb25tZW50cyB3aGVyZSB5b3UgZG8gbm90IG5lZWQgdG8KLSAqIHdvcnJ5IGFib3V0IG11bHRpcGxlIHRocmVhZCBjb250ZW50aW9uLgotICogPHAvPgotICogVGhlIHJlbW92YWwgb3JkZXIgb2YgYW4gPGNvZGU+QXJyYXlTdGFjazwvY29kZT4gaXMgYmFzZWQgb24gaW5zZXJ0aW9uIG9yZGVyOiBUaGUgbW9zdCByZWNlbnRseQotICogYWRkZWQgZWxlbWVudCBpcyByZW1vdmVkIGZpcnN0LiAgVGhlIGl0ZXJhdGlvbiBvcmRlciBpcyA8aT5ub3Q8L2k+IHRoZSBzYW1lIGFzIHRoZSByZW1vdmFsIG9yZGVyLgotICogIFRoZSBpdGVyYXRvciByZXR1cm5zIGVsZW1lbnRzIGZyb20gdGhlIGJvdHRvbSB1cCwgd2hlcmVhcyB0aGUge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIHJlbW92ZXMKLSAqIHRoZW0gZnJvbSB0aGUgdG9wIGRvd24uCi0gKiA8cC8+Ci0gKiBVbmxpa2UgPGNvZGU+U3RhY2s8L2NvZGU+LCA8Y29kZT5BcnJheVN0YWNrPC9jb2RlPiBhY2NlcHRzIG51bGwgZW50cmllcy4KLSAqLwotcHVibGljIGNsYXNzIEFycmF5U3RhY2sgZXh0ZW5kcyBBcnJheUxpc3QgewotCi0gICAgLyoqIEVuc3VyZSBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTMwMDc5MTU5OTMxNTc0NTk5TDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZW1wdHkgPGNvZGU+QXJyYXlTdGFjazwvY29kZT4uIFRoZSBpbml0aWFsIHNpemUgaXMgY29udHJvbGxlZCBieQotICAgICAqIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gYW5kIGlzIGN1cnJlbnRseSAxMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlTdGFjaygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IDxjb2RlPkFycmF5U3RhY2s8L2NvZGU+IHdpdGggYW4gaW5pdGlhbCBzaXplLgotICAgICAqCi0gICAgICogQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgdG8gdXNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBpbml0aWFsIHNpemUgaXMgbmVnYXRpdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlTdGFjayhpbnQgaW5pdGlhbFNpemUpIHsKLSAgICAgICAgc3VwZXIoaW5pdGlhbFNpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHN0YWNrIGlzIGN1cnJlbnRseSBlbXB0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgZXhpc3RzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggPGNvZGU+amF2YS51dGlsLlN0YWNrPC9jb2RlPi4gTmV3IHVzZXJzIG9mIHRoaXMKLSAgICAgKiBjbGFzcyBzaG91bGQgdXNlIDxjb2RlPmlzRW1wdHk8L2NvZGU+IGluc3RlYWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YWNrIGlzIGN1cnJlbnRseSBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotICAgICAgICByZXR1cm4gaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRvcCBpdGVtIG9mZiBvZiB0aGlzIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0b3AgaXRlbSBvbiB0aGUgc3RhY2sKLSAgICAgKiBAdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gaWYgdGhlIHN0YWNrIGlzIGVtcHR5Ci0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBwZWVrKCkgdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gewotICAgICAgICBpbnQgbiA9IHNpemUoKTsKLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXQobiAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbid0aCBpdGVtIGRvd24gKHplcm8tcmVsYXRpdmUpIGZyb20gdGhlIHRvcCBvZiB0aGlzIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGRvd24gdG8gZ28KLSAgICAgKiBAcmV0dXJuIHRoZSBuJ3RoIGl0ZW0gb24gdGhlIHN0YWNrLCB6ZXJvIHJlbGF0aXZlCi0gICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGl0ZW1zIG9uIHRoZSBzdGFjayB0byBzYXRpc2Z5IHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcGVlayhpbnQgbikgdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gewotICAgICAgICBpbnQgbSA9IChzaXplKCkgLSBuKSAtIDE7Ci0gICAgICAgIGlmIChtIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBnZXQobSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3BzIHRoZSB0b3AgaXRlbSBvZmYgb2YgdGhpcyBzdGFjayBhbmQgcmV0dXJuIGl0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdG9wIGl0ZW0gb24gdGhlIHN0YWNrCi0gICAgICogQHRocm93cyBFbXB0eVN0YWNrRXhjZXB0aW9uIGlmIHRoZSBzdGFjayBpcyBlbXB0eQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcG9wKCkgdGhyb3dzIEVtcHR5U3RhY2tFeGNlcHRpb24gewotICAgICAgICBpbnQgbiA9IHNpemUoKTsKLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZW1vdmUobiAtIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHVzaGVzIGEgbmV3IGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suIFRoZSBwdXNoZWQgaXRlbSBpcyBhbHNvIHJldHVybmVkLiBUaGlzIGlzCi0gICAgICogZXF1aXZhbGVudCB0byBjYWxsaW5nIDxjb2RlPmFkZDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byBiZSBhZGRlZAotICAgICAqIEByZXR1cm4gdGhlIGl0ZW0ganVzdCBwdXNoZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHB1c2goT2JqZWN0IGl0ZW0pIHsKLSAgICAgICAgYWRkKGl0ZW0pOwotICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbmUtYmFzZWQgcG9zaXRpb24gb2YgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHRvcCB0aGF0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGV4aXN0cwotICAgICAqIG9uIHRoaXMgc3RhY2ssIHdoZXJlIHRoZSB0b3AtbW9zdCBlbGVtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgYXQgZGlzdGFuY2UgPGNvZGU+MTwvY29kZT4uICBJZgotICAgICAqIHRoZSBvYmplY3QgaXMgbm90IHByZXNlbnQgb24gdGhlIHN0YWNrLCByZXR1cm4gPGNvZGU+LTE8L2NvZGU+IGluc3RlYWQuICBUaGUKLSAgICAgKiA8Y29kZT5lcXVhbHMoKTwvY29kZT4gbWV0aG9kIGlzIHVzZWQgdG8gY29tcGFyZSB0byB0aGUgaXRlbXMgaW4gdGhpcyBzdGFjay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBiZSBzZWFyY2hlZCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSAxLWJhc2VkIGRlcHRoIGludG8gdGhlIHN0YWNrIG9mIHRoZSBvYmplY3QsIG9yIC0xIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgc2VhcmNoKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgaW50IGkgPSBzaXplKCkgLSAxOyAgICAgICAgLy8gQ3VycmVudCBpbmRleAotICAgICAgICBpbnQgbiA9IDE7ICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGRpc3RhbmNlCi0gICAgICAgIHdoaWxlIChpID49IDApIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyZW50ID0gZ2V0KGkpOwotICAgICAgICAgICAgaWYgKChvYmplY3QgPT0gbnVsbCAmJiBjdXJyZW50ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGN1cnJlbnQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgbisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjawotICAgICAqIEB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKLSAgICAgICAgaW50IHNpemUgPSBzaXplKCk7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldChzaXplIC0gMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgZWxlbWVudAotICAgICAqIEB0aHJvd3MgRW1wdHlTdGFja0V4Y2VwdGlvbiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZSgpIHsKLSAgICAgICAgaW50IHNpemUgPSBzaXplKCk7Ci0gICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlbW92ZShzaXplIC0gMSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC1yZXNvdXJjZXMveG1scy9hcnJheTEueG1sIGIvMV81L21vZHVsZXMvYWRiL3Rlc3QtcmVzb3VyY2VzL3htbHMvYXJyYXkxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzNGYxOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC1yZXNvdXJjZXMveG1scy9hcnJheTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3JhcHBlcj4KLSAgICA8aXRlbT5vbmU8L2l0ZW0+Ci0gICAgPGl0ZW0+dHdvPC9pdGVtPgotICAgIDxpdGVtPnRocmVlPC9pdGVtPgotPC93cmFwcGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCU09BUE1vZGVsQnVpbGRlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQURCU09BUE1vZGVsQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxYjdmYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0FEQlNPQVBNb2RlbEJ1aWxkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRPT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLlByaW50RXZlbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyLkFEQlhNTFN0cmVhbVJlYWRlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBREJTT0FQTW9kZWxCdWlsZGVyVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQXJyYXlMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKwotICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgICAgICAgICAiPFBlcnNvbiB4bWxucz1cIlwiPiIgKwotICAgICAgICAgICAgICAgICI8TmFtZSB4bWxucz1cIlwiPkZvb09uZTwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAiPERlcGVuZGVudE9uZSB4bWxucz1cIlwiPjxOYW1lIHhtbG5zPVwiXCI+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICI8QWdlIHhtbG5zPVwiXCI+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAiPFNleCB4bWxucz1cIlwiPk1hbGU8L1NleD48L0RlcGVuZGVudE9uZT4iICsKLSAgICAgICAgICAgICAgICAiPERlcGVuZGVudFR3byB4bWxucz1cIlwiPiIgKwotICAgICAgICAgICAgICAgICI8TmFtZSB4bWxucz1cIlwiPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAiPEFnZSB4bWxucz1cIlwiPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgIjxTZXggeG1sbnM9XCJcIj5NYWxlPC9TZXg+PC9EZXBlbmRlbnRUd28+IiArCi0gICAgICAgICAgICAgICAgIjxPcmdhbml6YXRpb24geG1sbnM9XCJcIj5BcGFjaGU8L09yZ2FuaXphdGlvbj4iICsKLSAgICAgICAgICAgICAgICAiPC9QZXJzb24+PC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7Ci0gICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIk5hbWUiKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vT25lIik7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnRPbmUiKSk7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IER1bW15QURCQmVhbigpKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVuZGVudFR3byIpKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgRHVtbXlBREJCZWFuKCkpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJPcmdhbml6YXRpb24iKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiQXBhY2hlIik7Ci0gICAgICAgIFFOYW1lIHByb2plY3RRTmFtZSA9IG5ldyBRTmFtZSgiUGVyc29uIik7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPQotICAgICAgICAgICAgICAgIG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKHByb2plY3RRTmFtZSwgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgIEFEQlNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBREJTT0FQTW9kZWxCdWlsZGVyKAotICAgICAgICAgICAgICAgIHB1bGxQYXJzZXIsIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJvb3QgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJSb290IGVsZW1lbnQgY2FuIG5vdCBiZSBudWxsIiwgcm9vdCAhPSBudWxsKTsKLSAgICAgICAgRG9jdW1lbnQgZXhwZWN0ZWRET00gPSBuZXdEb2N1bWVudChleHBlY3RlZFhNTCk7Ci0gICAgICAgIERvY3VtZW50IGFjdHVhbERvbSA9IG5ld0RvY3VtZW50KHJvb3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydFhNTEVxdWFsKGFjdHVhbERvbSwgZXhwZWN0ZWRET00pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmludEV2ZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgciA9IGdldFRlc3RFbnZlbG9wZSgpLmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICBQcmludEV2ZW50cy5wcmludChyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRFdmVudHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogRklYTUUuIENoZWNrIHRoZSBvdXRwdXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB0aGUgdGVzdFByaW50RXZlbnRzIG1ldGhvZAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgciA9IGdldFRlc3RFbnZlbG9wZSgpLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgIFByaW50RXZlbnRzLnByaW50KHIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9ET09NKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IiArCi0gICAgICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+PG5zMTpjcmVhdGVBY2NvdW50UmVxdWVzdCB4bWxuczpuczE9XCJodHRwOi8vd3d3LndzbzIuY29tL3R5cGVzXCI+IiArCi0gICAgICAgICAgICAgICAgIjxjbGllbnRpbmZvIHhtbG5zPVwiaHR0cDovL3d3dy53c28yLmNvbS90eXBlc1wiPjxuYW1lPmJvYjwvbmFtZT48c3NuPjEyMzQ1Njc4OTwvc3NuPjwvY2xpZW50aW5mbz4iICsKLSAgICAgICAgICAgICAgICAiPHBhc3N3b3JkIHhtbG5zPVwiXCI+cGFzc3dkPC9wYXNzd29yZD48L25zMTpjcmVhdGVBY2NvdW50UmVxdWVzdD48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyMiA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcigKLSAgICAgICAgICAgICAgICBnZXRUZXN0RW52ZWxvcGUoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKSwKLSAgICAgICAgICAgICAgICBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBidWlsZGVyMi5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuYnVpbGQoKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBlbnZlbG9wZS5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgU3RyaW5nIHMyID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoczIsIHhtbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZ2V0VGVzdEVudmVsb3BlKCkgewotICAgICAgICBDcmVhdGVBY2NvdW50UmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZUFjY291bnRSZXF1ZXN0KCk7Ci0gICAgICAgIENsaWVudEluZm8gY2xpZW50SW5mbyA9IG5ldyBDbGllbnRJbmZvKCk7Ci0gICAgICAgIGNsaWVudEluZm8uc2V0TmFtZSgiYm9iIik7Ci0gICAgICAgIGNsaWVudEluZm8uc2V0U3NuKCIxMjM0NTY3ODkiKTsKLSAgICAgICAgcmVxdWVzdC5zZXRDbGllbnRJbmZvKGNsaWVudEluZm8pOwotICAgICAgICByZXF1ZXN0LnNldFBhc3N3b3JkKCJwYXNzd2QiKTsKLQotICAgICAgICBBREJTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQURCU09BUE1vZGVsQnVpbGRlcihyZXF1ZXN0Ci0gICAgICAgICAgICAgICAgLmdldFB1bGxQYXJzZXIoQ3JlYXRlQWNjb3VudFJlcXVlc3QuTVlfUU5BTUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyLmdldEVudmVsb3BlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0RPT00yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWwgPQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/Pjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+PG5zMTpjcmVhdGVBY2NvdW50UmVxdWVzdCB4bWxuczpuczE9XCJodHRwOi8vd3d3LndzbzIuY29tL3R5cGVzXCI+PG5zMTpjbGllbnRpbmZvPjxuYW1lIHhtbG5zPVwiXCI+Ym9iPC9uYW1lPjxzc24geG1sbnM9XCJcIj4xMjM0NTY3ODk8L3Nzbj48L25zMTpjbGllbnRpbmZvPjxwYXNzd29yZCB4bWxucz1cIlwiPnBhc3N3ZDwvcGFzc3dvcmQ+PC9uczE6Y3JlYXRlQWNjb3VudFJlcXVlc3Q+PC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgQ3JlYXRlQWNjb3VudFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVBY2NvdW50UmVxdWVzdCgpOwotICAgICAgICBDbGllbnRJbmZvIGNsaWVudEluZm8gPSBuZXcgQ2xpZW50SW5mbygpOwotICAgICAgICBjbGllbnRJbmZvLnNldE5hbWUoImJvYiIpOwotICAgICAgICBjbGllbnRJbmZvLnNldFNzbigiMTIzNDU2Nzg5Iik7Ci0gICAgICAgIHJlcXVlc3Quc2V0Q2xpZW50SW5mbyhjbGllbnRJbmZvKTsKLSAgICAgICAgcmVxdWVzdC5zZXRQYXNzd29yZCgicGFzc3dkIik7Ci0KLSAgICAgICAgQURCU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IEFEQlNPQVBNb2RlbEJ1aWxkZXIocmVxdWVzdAotICAgICAgICAgICAgICAgIC5nZXRQdWxsUGFyc2VyKENyZWF0ZUFjY291bnRSZXF1ZXN0Lk1ZX1FOQU1FKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gYnVpbGRlci5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKAotICAgICAgICAgICAgICAgIGdldFRlc3RFbnZlbG9wZSgpLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCksCi0gICAgICAgICAgICAgICAgRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGJ1aWxkZXIyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5idWlsZCgpOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGVudmVsb3BlLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IFN0cmluZ1JlYWRlcih3cml0ZXIudG9TdHJpbmcoKSkpOwotICAgICAgICBQcmludEV2ZW50cy5wcmludChyKTsKLQotICAgICAgICAvL1RPRE86IEZJWE1FLiBTaW1wbGVyIHRlc3QgaW4gdGVzdFByaW50RXZlbnRzMgotICAgICAgICAvL2Fzc2VydFhNTEVxdWFsKHdyaXRlci50b1N0cmluZygpLHhtbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIER1bW15QURCQmVhbiBpbXBsZW1lbnRzIEFEQkJlYW4gewotICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHB1YmxpYyBEdW1teUFEQkJlYW4oKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJOYW1lIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb29Ud28iKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkFnZSIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiMjUiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlNleCIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiTWFsZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIER1bW15QURCQmVhbiBhZGRBbm90aGVyQmVhbigpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbWRlbnQiKSk7Ci0gICAgICAgICAgICBEdW1teUFEQkJlYW4gZHVtbXlCZWFuID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotICAgICAgICAgICAgcmV0dXJuIGR1bW15QmVhbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcihRTmFtZSBhZGJCZWFuUU5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChhZGJCZWFuUU5hbWUsIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsZmFjdG9yeSx4bWxXcml0ZXIsZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXJpYWxpemVUeXBlKQotICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuIGltcGxlbWVudGVkIG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIERvY3VtZW50IG5ld0RvY3VtZW50KFN0cmluZyB4bWwpCi0gICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgcmV0dXJuIGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwuZ2V0Qnl0ZXMoKSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQ2xpZW50SW5mby5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9DbGllbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzFhZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy9DbGllbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBDbGllbnRJbmZvLmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0vKiogQ2xpZW50SW5mbyBiZWFuIGNsYXNzICovCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRJbmZvCi0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLSAgICAvKiBUaGlzIHR5cGUgd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBwaWVjZSBvZiBzY2hlbWEgdGhhdCBoYWQKLSAgICBuYW1lID0gQ2xpZW50SW5mbwotICAgIE5hbWVzcGFjZSBVUkkgPSBodHRwOi8vd3d3LndzbzIuY29tL3R5cGVzCi0gICAgTmFtZXNwYWNlIFByZWZpeCA9IG5zMQotICAgICovCi0KLSAgICBwdWJsaWMgQ2xpZW50SW5mbyhTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgbG9jYWxTc24pIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgICAgIHRoaXMubG9jYWxTc24gPSBsb2NhbFNzbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xpZW50SW5mbygpIHsKLSAgICB9Ci0KLSAgICAvKiogZmllbGQgZm9yIE5hbWUgKi8KLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBsb2NhbE5hbWU7Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIGdldHRlciBtZXRob2QKLSAgICAgKgotICAgICAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgcGFyYW0pIHsKLQotCi0gICAgICAgIHRoaXMubG9jYWxOYW1lID0gcGFyYW07Ci0gICAgfQotCi0KLSAgICAvKiogZmllbGQgZm9yIFNzbiAqLwotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsU3NuOwotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTc24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbFNzbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gU3NuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3NuKGphdmEubGFuZy5TdHJpbmcgcGFyYW0pIHsKLQotCi0gICAgICAgIHRoaXMubG9jYWxTc24gPSBwYXJhbTsKLSAgICB9Ci0KLQotICAgIC8qKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCAqLwotICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpIHsKLQotCi0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0KLSAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3d3LndzbzIuY29tL3R5cGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIikpOwotICAgICAgICBlbGVtZW50TGlzdAotICAgICAgICAgICAgICAgIC5hZGQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhsb2NhbE5hbWUpKTsKLQotICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly93d3cud3NvMi5jb20vdHlwZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNzbiIpKTsKLSAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobG9jYWxTc24pKTsKLQotCi0gICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbAotICAgICAgICAgICAgICAgIChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0LnRvQXJyYXkoKSk7Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLQotICAgIC8qKiBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSB7Ci0gICAgICAgIC8qKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xpZW50SW5mbyBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICAgICAgQ2xpZW50SW5mbyBvYmplY3QgPSBuZXcgQ2xpZW50SW5mbygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudCA9IDI7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy9ldmVudCBiZXR0ZXIgYmUgYSBTVEFSVF9FTEVNRU5ULiBpZiBub3Qgd2Ugc2hvdWxkIGdvIHVwIHRvIHRoZSBzdGFydCBlbGVtZW50IGhlcmUKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIHdoaWxlICghZG9uZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA9PSBldmVudCkgewotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKHJlYWRlci5nZXRMb2NhbE5hbWUoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJzc24iLmVxdWFscyhyZWFkZXIuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IHJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRTc24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPT0gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0gICAgfS8vZW5kIG9mIGZhY3RvcnkgY2xhc3MKLQotfQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQ3JlYXRlQWNjb3VudFJlcXVlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvQ3JlYXRlQWNjb3VudFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzNDdjZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL0NyZWF0ZUFjY291bnRSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBDcmVhdGVBY2NvdW50UmVxdWVzdC5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqIENyZWF0ZUFjY291bnRSZXF1ZXN0IGJlYW4gY2xhc3MgKi8KLQotcHVibGljIGNsYXNzIENyZWF0ZUFjY291bnRSZXF1ZXN0IGltcGxlbWVudHMKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBNWV9RTkFNRSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKAotICAgICAgICAgICAgImh0dHA6Ly93d3cud3NvMi5jb20vdHlwZXMiLCAiY3JlYXRlQWNjb3VudFJlcXVlc3QiLCAibnMxIik7Ci0KLSAgICAvKiogZmllbGQgZm9yIENsaWVudEluZm8gKi8KLSAgICBwcm90ZWN0ZWQgQ2xpZW50SW5mbyBsb2NhbENsaWVudEluZm87Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGNvbS53c28yLnd3dy50eXBlcy5DbGllbnRJbmZvCi0gICAgICovCi0gICAgcHVibGljIENsaWVudEluZm8gZ2V0Q2xpZW50SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsQ2xpZW50SW5mbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0gQ2xpZW50SW5mbwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudEluZm8oQ2xpZW50SW5mbyBwYXJhbSkgewotCi0gICAgICAgIHRoaXMubG9jYWxDbGllbnRJbmZvID0gcGFyYW07Ci0gICAgfQotCi0gICAgLyoqIGZpZWxkIGZvciBQYXNzd29yZCAqLwotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxvY2FsUGFzc3dvcmQ7Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBnZXR0ZXIgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQYXNzd29yZCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUGFzc3dvcmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgc2V0dGVyIG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIFBhc3N3b3JkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoamF2YS5sYW5nLlN0cmluZyBwYXJhbSkgewotCi0gICAgICAgIHRoaXMubG9jYWxQYXNzd29yZCA9IHBhcmFtOwotICAgIH0KLQotICAgIC8qKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCAqLwotICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKAotICAgICAgICAgICAgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSkgewotCi0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgZWxlbWVudExpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCi0gICAgICAgIGVsZW1lbnRMaXN0LmFkZChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53c28yLmNvbS90eXBlcyIsICJjbGllbnRpbmZvIikpOwotICAgICAgICBlbGVtZW50TGlzdC5hZGQobG9jYWxDbGllbnRJbmZvKTsKLQotICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIiIsICJwYXNzd29yZCIpKTsKLSAgICAgICAgZWxlbWVudExpc3QuYWRkKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQ29udmVydGVyVXRpbAotICAgICAgICAgICAgICAgIC5jb252ZXJ0VG9TdHJpbmcobG9jYWxQYXNzd29yZCkpOwotCi0gICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbAotICAgICAgICAgICAgICAgIChxTmFtZSwgZWxlbWVudExpc3QudG9BcnJheSgpLCBhdHRyaWJMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheSgpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLQotICAgIC8qKiBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSB7Ci0gICAgICAgIC8qKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0ICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQWNjb3VudFJlcXVlc3QgcGFyc2UoCi0gICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKQotICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIENyZWF0ZUFjY291bnRSZXF1ZXN0IG9iamVjdCA9IG5ldyBDcmVhdGVBY2NvdW50UmVxdWVzdCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgYXJndW1lbnRDb3VudCA9IDI7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgLy8gZXZlbnQgYmV0dGVyIGJlIGEgU1RBUlRfRUxFTUVOVC4gaWYgbm90IHdlIHNob3VsZCBnbyB1cCB0bwotICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBlbGVtZW50IGhlcmUKLSAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgPT0gZXZlbnQpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJjbGllbnRpbmZvIi5lcXVhbHMocmVhZGVyLmdldExvY2FsTmFtZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2xpZW50SW5mbyhDbGllbnRJbmZvLkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlKHJlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJwYXNzd29yZCIuZXF1YWxzKHJlYWRlci5nZXRMb2NhbE5hbWUoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFzc3dvcmQob3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb252ZXJ0VG9TdHJpbmcoY29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50Q291bnQgPT0gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgICB9Ci0gICAgfS8vIGVuZCBvZiBmYWN0b3J5IGNsYXNzCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdHlwZXMvc29hcGVuY29kaW5nL0FycmF5VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OGQxMGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy9zb2FwZW5jb2RpbmcvQXJyYXlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLnNvYXBlbmNvZGluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBBcnJheVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkxKCkgewotCi0gICAgICAgIEFycmF5RSBhcnJheUVsZW1lbnQgPSBuZXcgQXJyYXlFKCk7Ci0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgX2ludCB0ZXN0SW50OwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdEludCA9IG5ldyBfaW50KCk7Ci0gICAgICAgICAgICB0ZXN0SW50LnNldF9pbnQoaSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdEludCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcnJheS5zZXRBcnJheVR5cGVRTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCJpbnQiKSk7Ci0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2ludClyZXN1bHRMaXN0LmdldChpLTEpKS5nZXRfaW50KCksaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTIoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBEYXRlIHRlc3REYXRlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdERhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgdGVzdERhdGUuc2V0RGF0ZShuZXcgamF2YS51dGlsLkRhdGUoKSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdERhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJyYXkuc2V0QXJyYXlUeXBlUU5hbWUobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwiZGF0ZSIpKTsKLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMaXN0LnNpemUoKSw1KTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTMoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBfaW50IHRlc3RJbnQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICB0ZXN0SW50ID0gbmV3IF9pbnQoKTsKLSAgICAgICAgICAgIHRlc3RJbnQuc2V0X2ludChpKTsKLSAgICAgICAgICAgIGFycmF5LmFkZE9iamVjdCh0ZXN0SW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2ludClyZXN1bHRMaXN0LmdldChpLTEpKS5nZXRfaW50KCksaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTQoKSB7Ci0KLSAgICAgICAgQXJyYXlFIGFycmF5RWxlbWVudCA9IG5ldyBBcnJheUUoKTsKLSAgICAgICAgQXJyYXkgYXJyYXkgPSBuZXcgQXJyYXkoKTsKLQotICAgICAgICBEYXRlIHRlc3REYXRlOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdERhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgdGVzdERhdGUuc2V0RGF0ZShuZXcgamF2YS51dGlsLkRhdGUoKSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdERhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXJyYXlFbGVtZW50LnNldEFycmF5KGFycmF5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGFycmF5RWxlbWVudC5nZXRPTUVsZW1lbnQoQXJyYXlFLk1ZX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9IG9tRWxlbWVudC50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRMaXN0LnNpemUoKSw1KTsKLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcnJheTUoKSB7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSAiPG5zMTpBcnJheSB4bWxuczpuczE9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nL1wiIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIHhtbG5zOnMxPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIG5zMTphcnJheVR5cGU9XCJzMTp1ci10eXBlWzVdXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8bnMxOmludD4xPC9uczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPG5zMTppbnQ+MjwvbnMxOmludD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxuczE6aW50PjM8L25zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8bnMxOmludD40PC9uczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPG5zMTppbnQ+NTwvbnMxOmludD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9uczE6QXJyYXk+IjsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEFycmF5RSByZXN1bHQgPSBBcnJheUUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldEFycmF5KCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygoKF9pbnQpcmVzdWx0TGlzdC5nZXQoaS0xKSkuZ2V0X2ludCgpLGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFycmF5NigpIHsKLQotICAgICAgICBBcnJheUUgYXJyYXlFbGVtZW50ID0gbmV3IEFycmF5RSgpOwotICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBBcnJheSgpOwotICAgICAgICBhcnJheS5hZGRPYmplY3QobnVsbCk7Ci0KLSAgICAgICAgX2ludCB0ZXN0SW50OwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdEludCA9IG5ldyBfaW50KCk7Ci0gICAgICAgICAgICB0ZXN0SW50LnNldF9pbnQoaSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdEludCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcnJheS5zZXRBcnJheVR5cGVRTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLCJpbnQiKSk7Ci0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2ludClyZXN1bHRMaXN0LmdldChpKSkuZ2V0X2ludCgpLGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy90eXBlcy94c2QvQXJyYXlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9BcnJheVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyYWVkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3R5cGVzL3hzZC9BcnJheVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMueHNkOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuc29hcGVuY29kaW5nLkFycmF5RTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEFycmF5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkxKCkgewotCi0gICAgICAgIEFycmF5RSBhcnJheUVsZW1lbnQgPSBuZXcgQXJyYXlFKCk7Ci0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgX2ludCB0ZXN0SW50OwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdEludCA9IG5ldyBfaW50KCk7Ci0gICAgICAgICAgICB0ZXN0SW50LnNldF9pbnQoaSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdEludCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcnJheS5zZXRBcnJheVR5cGVRTmFtZShuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCJpbnQiKSk7Ci0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoX2ludClyZXN1bHRMaXN0LmdldChpLTEpKS5nZXRfaW50KCksaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkyKCkgewotCi0gICAgICAgIEFycmF5RSBhcnJheUVsZW1lbnQgPSBuZXcgQXJyYXlFKCk7Ci0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgRGF0ZSB0ZXN0RGF0ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgIHRlc3REYXRlID0gbmV3IERhdGUoKTsKLSAgICAgICAgICAgIHRlc3REYXRlLnNldERhdGUobmV3IGphdmEudXRpbC5EYXRlKCkpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3REYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5LnNldEFycmF5VHlwZVFOYW1lKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsImRhdGUiKSk7Ci0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0TGlzdC5zaXplKCksNSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXkzKCkgewotCi0gICAgICAgIEFycmF5RSBhcnJheUVsZW1lbnQgPSBuZXcgQXJyYXlFKCk7Ci0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgX2ludCB0ZXN0SW50OwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDY7IGkrKykgewotICAgICAgICAgICAgdGVzdEludCA9IG5ldyBfaW50KCk7Ci0gICAgICAgICAgICB0ZXN0SW50LnNldF9pbnQoaSk7Ci0gICAgICAgICAgICBhcnJheS5hZGRPYmplY3QodGVzdEludCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhcnJheUVsZW1lbnQuc2V0QXJyYXkoYXJyYXkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYXJyYXlFbGVtZW50LmdldE9NRWxlbWVudChBcnJheUUuTVlfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgb21FbGVtZW50U3RyaW5nID0gb21FbGVtZW50LnRvU3RyaW5nV2l0aENvbnN1bWUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT01FbGVtZW50ID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob21FbGVtZW50U3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIEFycmF5RSByZXN1bHQgPSBBcnJheUUuRmFjdG9yeS5wYXJzZSh4bWxSZWFkZXIpOwotICAgICAgICAgICAgTGlzdCByZXN1bHRMaXN0ID0gcmVzdWx0LmdldEFycmF5KCkuZ2V0T2JqZWN0TGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygoKF9pbnQpcmVzdWx0TGlzdC5nZXQoaS0xKSkuZ2V0X2ludCgpLGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBREJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXk0KCkgewotCi0gICAgICAgIEFycmF5RSBhcnJheUVsZW1lbnQgPSBuZXcgQXJyYXlFKCk7Ci0gICAgICAgIEFycmF5IGFycmF5ID0gbmV3IEFycmF5KCk7Ci0KLSAgICAgICAgRGF0ZSB0ZXN0RGF0ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgIHRlc3REYXRlID0gbmV3IERhdGUoKTsKLSAgICAgICAgICAgIHRlc3REYXRlLnNldERhdGUobmV3IGphdmEudXRpbC5EYXRlKCkpOwotICAgICAgICAgICAgYXJyYXkuYWRkT2JqZWN0KHRlc3REYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFycmF5RWxlbWVudC5zZXRBcnJheShhcnJheSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBhcnJheUVsZW1lbnQuZ2V0T01FbGVtZW50KEFycmF5RS5NWV9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBvbUVsZW1lbnRTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPTUVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvbUVsZW1lbnRTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgQXJyYXlFIHJlc3VsdCA9IEFycmF5RS5GYWN0b3J5LnBhcnNlKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBMaXN0IHJlc3VsdExpc3QgPSByZXN1bHQuZ2V0QXJyYXkoKS5nZXRPYmplY3RMaXN0KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0TGlzdC5zaXplKCksNSk7Ci0gICAgICAgIH0gY2F0Y2ggKEFEQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXJyYXk1KCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG9tRWxlbWVudFN0cmluZyA9ICI8bnMxOkFycmF5IHhtbG5zOm5zMT1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvXCIgeG1sbnM6czE9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgbnMxOmFycmF5VHlwZT1cInMxOnVyLXR5cGVbNV1cIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxzMTppbnQ+MTwvczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPHMxOmludD4yPC9zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8czE6aW50PjM8L3MxOmludD5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxzMTppbnQ+NDwvczE6aW50PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgICAgPHMxOmludD41PC9zMTppbnQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvbnMxOkFycmF5PiI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NRWxlbWVudCA9PT4gIiArIG9tRWxlbWVudFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9tRWxlbWVudFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBBcnJheUUgcmVzdWx0ID0gQXJyYXlFLkZhY3RvcnkucGFyc2UoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIExpc3QgcmVzdWx0TGlzdCA9IHJlc3VsdC5nZXRBcnJheSgpLmdldE9iamVjdExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChfaW50KXJlc3VsdExpc3QuZ2V0KGktMSkpLmdldF9pbnQoKSxpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQURCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db252ZXJ0ZXJVdGlsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9Db252ZXJ0ZXJVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Q0N2JhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvQ29udmVydGVyVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKiBUZXN0IGNvbnZlcnNpb24gb2YgQmlnIEludGVnZXIgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnSW50ZWdlcigpIHsKLSAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsLmFkZCgiMjM0NDUiKTsKLSAgICAgICAgbC5hZGQoIjIzNDQ2Iik7Ci0gICAgICAgIGwuYWRkKCIyMzQ1NjY0NiIpOwotICAgICAgICBsLmFkZCgiMTExMzY0NiIpOwotCi0gICAgICAgIE9iamVjdCBjb252ZXJ0ZWRPYmogPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0FycmF5KAotICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuY2xhc3MsIGwpOwotCi0gICAgICAgIGFzc2VydFRydWUoY29udmVydGVkT2JqLmdldENsYXNzKCkuaXNBcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb252ZXJ0ZWRPYmouZ2V0Q2xhc3MoKS5lcXVhbHMoQmlnSW50ZWdlcltdLmNsYXNzKSk7Ci0KLSAgICB9Ci0KLSAgICAvKiogaW50ZWdlciBhcnJheXMgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW50KCkgewotICAgICAgICBMaXN0IGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGwuYWRkKCIyMzQ0NSIpOwotICAgICAgICBsLmFkZCgiMjM0NDYiKTsKLSAgICAgICAgbC5hZGQoIjIzNDU2NjQ2Iik7Ci0gICAgICAgIGwuYWRkKCIxMTEzNjQ2Iik7Ci0KLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iaiA9IENvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgaW50LmNsYXNzLCBsKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGNvbnZlcnRlZE9iai5nZXRDbGFzcygpLmlzQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY29udmVydGVkT2JqLmdldENsYXNzKCkuZXF1YWxzKGludFtdLmNsYXNzKSk7Ci0KLSAgICB9Ci0KLSAgICAvKiogYm9vbGVhbiBhcnJheXMgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbCgpIHsKLSAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsLmFkZCgidHJ1ZSIpOwotICAgICAgICBsLmFkZCgiZmFsc2UiKTsKLSAgICAgICAgbC5hZGQoInRydWUiKTsKLSAgICAgICAgbC5hZGQoImZhbHNlIik7Ci0KLSAgICAgICAgT2JqZWN0IGNvbnZlcnRlZE9iaiA9IENvbnZlcnRlclV0aWwuY29udmVydFRvQXJyYXkoCi0gICAgICAgICAgICAgICAgYm9vbGVhbi5jbGFzcywgbCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb252ZXJ0ZWRPYmouZ2V0Q2xhc3MoKS5pc0FycmF5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnZlcnRlZE9iai5nZXRDbGFzcygpLmVxdWFscyhib29sZWFuW10uY2xhc3MpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9EYXRlVGltZSgpIHsKLQotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTU1oiKTsKLSAgICAgICAgQ2FsZW5kYXIgY2FsZW5kYXI7Ci0KLSAgICAgICAgY2FsZW5kYXIgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGVUaW1lKCIyMDA3LTAyLTE1VDE0OjU0OjI5Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVQxNDo1NDoyOSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1VDE0OjU0OjI5LjM5OSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNy0wMi0xNVQxNDo1NDoyOSswNTozMCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZyAgID09PiAiICsgIjIwMDctMDItMTVUMTQ6NTQ6MjkrMDU6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY2FsZW5kYXIpKTsKLQotICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoIjIwMDctMDItMTVUMTQ6NTQ6MjkuMzk5KzA1OjMwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTkrMDU6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY2FsZW5kYXIpKTsKLQotICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoIjIwMDctMDItMTVUMTQ6NTQ6MjlaIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVQxNDo1NDoyOVoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY2FsZW5kYXIpKTsKLQotICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoIjIwMDctMDItMTVUMTQ6NTQ6MjkuMzk5WiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZyAgID09PiAiICsgIjIwMDctMDItMTVUMTQ6NTQ6MjkuMzk5WiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoY2FsZW5kYXIuZ2V0VGltZSgpKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhjYWxlbmRhcikpOwotCi0gICAgICAgIGNhbGVuZGFyID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZSgiMjAwNi0xMi0xMVQyMzo1NzoxNi42MjVaIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNi0xMi0xMVQyMzo1NzoxNi42MjVaIik7Ci0gICAgICAgIHNpbXBsZURhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY2FsZW5kYXIpKTsKLQotICAgICAgICBjYWxlbmRhciA9IENvbnZlcnRlclV0aWwuY29udmVydFRvRGF0ZVRpbWUoIjIwMDctMDItMTVUMTQ6NTQ6MjkuMzk5LTA1OjMwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVQxNDo1NDoyOS4zOTktMDU6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGNhbGVuZGFyLmdldFRpbWUoKSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoY2FsZW5kYXIpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9EYXRlU3RyaW5nKCkgewotICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICBTdHJpbmcgZGF0ZVN0cmluZyA9IENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGRhdGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRhdGUgPT0+ICIgKyBkYXRlU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvRGF0ZSgpIHsKLQotICAgICAgICBEYXRlIGRhdGU7Ci0gICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2ltcGxlRGF0ZUZvcm1hdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkWiIpOwotICAgICAgICBkYXRlID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKCIyMDA3LTAyLTE1Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoZGF0ZSkpOwotCi0gICAgICAgIGRhdGUgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUoIjIwMDctMDItMTVaIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNVoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KGRhdGUpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjYWxlbmRhciA9PT4gIiArIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGRhdGUpKTsKLQotICAgICAgICBkYXRlID0gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKCIyMDA3LTAyLTE1KzA1OjMwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nICAgPT0+ICIgKyAiMjAwNy0wMi0xNSswNTozMCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgc2ltcGxlRGF0ZUZvcm1hdC5mb3JtYXQoZGF0ZSkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbGVuZGFyID09PiAiICsgQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoZGF0ZSkpOwotCi0gICAgICAgIGRhdGUgPSBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0RhdGUoIjIwMDctMDItMTUtMTI6MzAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdHJpbmcgICA9PT4gIiArICIyMDA3LTAyLTE1LTEyOjMwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdChkYXRlKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2FsZW5kYXIgPT0+ICIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhkYXRlKSk7Ci0KLSAgICAgICAgVGltZVpvbmUgdGltZVpvbmUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiQXVzdHJhbGlhL1BlcnRoIik7Ci0gICAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSh0aW1lWm9uZSk7Ci0gICAgICAgIGMuY2xlYXIoKTsKLSAgICAgICAgYy5zZXQoMjAwOCwgQ2FsZW5kYXIuSkFOVUFSWSwgMSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoYykuZW5kc1dpdGgoIiswODowMCIpKTsKLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL011bHRpcmVmSGVscGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9NdWx0aXJlZkhlbHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhMjI1My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL011bHRpcmVmSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBNdWx0aXJlZkhlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzSHJlZkF0dHJpYnV0ZXMxKCl7Ci0gICAgICAgIFN0cmluZyBib2R5RWxlbWVudCA9ICI8c29hcDpib2R5IHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8b3BlcmF0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPGFyZzEgaHJlZj1cIiNvYmoxXCIvPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8L29wZXJhdGlvbj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPG11bHRpcmVmIGlkPVwib2JqMVwiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5hbWU+dGhlIHJlYWwgYXJndW1lbnQ8L25hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8Y29sb3I+Ymx1ZTwvY29sb3I+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvbXVsdGlyZWY+XG4iICsKLSAgICAgICAgICAgICAgICAiPC9zb2FwOmJvZHk+IjsKLSAgICAgICAgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlcyhib2R5RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlMigpewotICAgICAgICBTdHJpbmcgYm9keUVsZW1lbnQgPSAiPHNvYXBlbnY6Qm9keSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPG5zMTpvcGVyYXRpb24geG1sbnM6bnMxPVwiaHR0cDp0ZW1wMS5vcmdcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczE6YXJnMSBocmVmPVwiI29iajFcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvbnMxOm9wZXJhdGlvbj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPG5zMjptdWx0aXJlZiBpZD1cIm9iajFcIiAgeG1sbnM6bnMyPVwiaHR0cDp0ZW1wMS5vcmdcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczI6bmFtZT50aGUgcmVhbCBhcmd1bWVudDwvbnMyOm5hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bnMyOmNvbG9yPmJsdWU8L25zMjpjb2xvcj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPC9uczI6bXVsdGlyZWY+XG4iICsKLSAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IjsKLSAgICAgICAgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlcyhib2R5RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlMygpewotICAgICAgICBTdHJpbmcgYm9keUVsZW1lbnQgPSAiPHNvYXBlbnY6Qm9keSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczE6b3BlcmF0aW9uIHhtbG5zOm5zMT1cImh0dHA6dGVtcDEub3JnXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPG5zMTphcmcxIGhyZWY9XCIjb2JqMVwiLz5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8bnMxOm9wZXJhdGlvbjI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIDxuczE6YXJnMSBocmVmPVwiI29iajFcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPC9uczE6b3BlcmF0aW9uMj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDwvbnMxOm9wZXJhdGlvbj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczI6bXVsdGlyZWYgeG1sbnM6bnMyPVwiaHR0cDp0ZW1wMS5vcmdcIiBpZD1cIm9iajFcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8bnMyOm5hbWU+dGhlIHJlYWwgYXJndW1lbnQ8L25zMjpuYW1lPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDxuczI6Y29sb3I+Ymx1ZTwvbnMyOmNvbG9yPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPC9uczI6bXVsdGlyZWY+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvc29hcGVudjpCb2R5PiI7Ci0gICAgICAgIHRlc3RQcm9jZXNzSHJlZkF0dHJpYnV0ZXMoYm9keUVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzSHJlZkF0dHJpYnV0ZTQoKXsKLSAgICAgICAgU3RyaW5nIGJvZHlFbGVtZW50ID0gIjxzb2FwZW52OkJvZHkgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxuczE6b3BlcmF0aW9uIHhtbG5zOm5zMT1cImh0dHA6dGVtcDEub3JnXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICA8bnMxOmFyZzEgaHJlZj1cIiNvYmoxXCIvPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMTpvcGVyYXRpb24yPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDxuczE6YXJnMSBocmVmPVwiI29iajFcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPG5zMTp0ZXN0IGhyZWY9XCIjb2JqMlwiLz5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDwvbnMxOm9wZXJhdGlvbjI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvbnMxOm9wZXJhdGlvbj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPG5zMjptdWx0aXJlZiB4bWxuczpuczI9XCJodHRwOnRlbXAxLm9yZ1wiIGlkPVwib2JqMVwiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMjpuYW1lPnRoZSByZWFsIGFyZ3VtZW50PC9uczI6bmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgICAgIDxuczI6Y29sb3I+Ymx1ZTwvbnMyOmNvbG9yPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5zMjpwZXJzb24gaHJlZj1cIiNvYmoyXCIvPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8L25zMjptdWx0aXJlZj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPG11bHRpcmVmIGlkPVwib2JqMlwiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPGFnZT4yMzwvYWdlPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICAgPG5hbWU+YW1pbGE8L25hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDwvbXVsdGlyZWY+XG4iICsKLSAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IjsKLSAgICAgICAgdGVzdFByb2Nlc3NIcmVmQXR0cmlidXRlcyhib2R5RWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQcm9jZXNzSHJlZkF0dHJpYnV0ZXMoU3RyaW5nIGJvZHlFbGVtZW50KXsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvZHlFbGVtZW50LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHhtbFJlYWRlcik7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZ2VuZXJhdGVkRWxlbWVudCA9IHN0QVhPTUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSAgc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdlbmVyYXRlZEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgICAgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc29hcEVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgb21FbGVtZW50U3RyaW5nOwotICAgICAgICAgICAgb21FbGVtZW50U3RyaW5nID0gc29hcEVudmVsb3BlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgYmVmb3JlIHByb2Nlc3NpbmcgPT0+ICIgKyBvbUVsZW1lbnRTdHJpbmcpOwotICAgICAgICAgICAgTXVsdGlyZWZIZWxwZXIucHJvY2Vzc0hyZWZBdHRyaWJ1dGVzKHNvYXBFbnZlbG9wZSk7Ci0gICAgICAgICAgICBvbUVsZW1lbnRTdHJpbmcgPSBzb2FwRW52ZWxvcGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gRWxlbWVudCBhZnRlciBwcm9jZXNzaW5nID09PiAiICsgb21FbGVtZW50U3RyaW5nKTsKLQotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9OYW1lZFN0YXhPTUJ1aWxkZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL05hbWVkU3RheE9NQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjN2U1ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL05hbWVkU3RheE9NQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlsczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotcHVibGljIGNsYXNzIE5hbWVkU3RheE9NQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZWRPTUJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgeG1sRG9jID0gIjx3cmFwcGVyPjxteUludFZhbD4yMDA8L215SW50VmFsPjwvd3JhcHBlcj4iOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHhtbERvYykpOwotCi0gICAgICAgIE5hbWVkU3RheE9NQnVpbGRlciBzbSA9IG5ldyBOYW1lZFN0YXhPTUJ1aWxkZXIocmVhZGVyLCBuZXcgUU5hbWUoIndyYXBwZXIiKSk7Ci0gICAgICAgIE9NRWxlbWVudCBlbHQgPSBzbS5nZXRPTUVsZW1lbnQoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGVsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbHQuZ2V0TG9jYWxOYW1lKCksICJ3cmFwcGVyIik7Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lZE9NQnVpbGRlcjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgeG1sRG9jID0gIjx3cmFwcGVyPjxteUludFZhbD4yMDA8L215SW50VmFsPjwvd3JhcHBlcj4iOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHhtbERvYykpOwotCi0gICAgICAgIC8vbW92ZSB1cHRvIHRoZSAgbXlJbnRWYWwgc3RhcnQgZWxlbWVudCBmaXJzdAotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgUU5hbWUgbmFtZVRvTWF0Y2ggPSBuZXcgUU5hbWUoIm15SW50VmFsIik7Ci0gICAgICAgIHdoaWxlICghZG9uZSkgewotICAgICAgICAgICAgaWYgKHJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmIG5hbWVUb01hdGNoLmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy93ZSBuZWVkIHRoZSB3cmFwcGVyIGhlcmUgLSBpdCBpcyB0aGUgbmF0dXJlIG9mIHRoZSBidWlsZGVycyB0aGF0Ci0gICAgICAgIC8vdGhleSBleHBlY3QgdGhlICpuZXh0KiBldmVudCB0byBiZSB0aGUgc3RhcnQgZWxlbWVudCAobm90IHRoZQotICAgICAgICAvL2N1cnJlbnQgb25lKSBTbyB3ZSBuZWVkIHRoZSB3cmFwcGVyIHRvIHNpbXVsYXRlIGEgZnVsbCBmbGVkZ2VkCi0gICAgICAgIC8vCi0gICAgICAgIE5hbWVkU3RheE9NQnVpbGRlciBzbSA9IG5ldyBOYW1lZFN0YXhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmVhbVdyYXBwZXIocmVhZGVyKSwgbmFtZVRvTWF0Y2gpOwotICAgICAgICBPTUVsZW1lbnQgZWx0ID0gc20uZ2V0T01FbGVtZW50KCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWx0LmdldExvY2FsTmFtZSgpLCAibXlJbnRWYWwiKTsKLQotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvUHJpbnRFdmVudHMuamF2YSBiLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvUHJpbnRFdmVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhZDY0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1ByaW50RXZlbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcmludEV2ZW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoWE1MU3RyZWFtUmVhZGVyIHhtbHIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAoeG1sci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHByaW50RXZlbnQoeG1scik7Ci0gICAgICAgICAgICB4bWxyLm5leHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRFdmVudChYTUxTdHJlYW1SZWFkZXIgeG1scikgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkVWRU5UOlsiICsgZ2V0RXZlbnRTdHJpbmcoeG1sci5nZXRFdmVudFR5cGUoKSkgKyAiXSAiKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgWyIpOwotCi0gICAgICAgIHN3aXRjaCAoeG1sci5nZXRFdmVudFR5cGUoKSkgewotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5UOgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIjwiKTsKLSAgICAgICAgICAgICAgICBwcmludE5hbWUoeG1scik7Ci0gICAgICAgICAgICAgICAgcHJpbnROYW1lc3BhY2VzKHhtbHIpOwotICAgICAgICAgICAgICAgIHByaW50QXR0cmlidXRlcyh4bWxyKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCI+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5UOgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIjwvIik7Ci0gICAgICAgICAgICAgICAgcHJpbnROYW1lKHhtbHIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIj4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1BBQ0U6Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlM6Ci0gICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0geG1sci5nZXRUZXh0U3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0geG1sci5nZXRUZXh0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChuZXcgU3RyaW5nKHhtbHIuZ2V0VGV4dENoYXJhY3RlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIjw/Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbHIuaGFzVGV4dCgpKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHhtbHIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCI/PiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DREFUQToKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCI8IVtDREFUQVsiKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IHhtbHIuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoID0geG1sci5nZXRUZXh0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChuZXcgU3RyaW5nKHhtbHIuZ2V0VGV4dENoYXJhY3RlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIl1dPiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5DT01NRU5UOgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIjwhLS0iKTsKLSAgICAgICAgICAgICAgICBpZiAoeG1sci5oYXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoeG1sci5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi0tPiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5FTlRJVFlfUkVGRVJFTkNFOgotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoeG1sci5nZXRMb2NhbE5hbWUoKSArICI9Iik7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbHIuaGFzVGV4dCgpKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJbIiArIHhtbHIuZ2V0VGV4dCgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQ6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPD94bWwiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgdmVyc2lvbj0nIiArIHhtbHIuZ2V0VmVyc2lvbigpICsgIiciKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgZW5jb2Rpbmc9JyIgKyB4bWxyLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgKyAiJyIpOwotICAgICAgICAgICAgICAgIGlmICh4bWxyLmlzU3RhbmRhbG9uZSgpKQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgc3RhbmRhbG9uZT0neWVzJyIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiIHN0YW5kYWxvbmU9J25vJyIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIj8+Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50TmFtZShYTUxTdHJlYW1SZWFkZXIgeG1scikgewotICAgICAgICBpZiAoeG1sci5oYXNOYW1lKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB4bWxyLmdldFByZWZpeCgpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHhtbHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0geG1sci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIHByaW50TmFtZShwcmVmaXgsIHVyaSwgbG9jYWxOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnROYW1lKFN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiAhKCIiLmVxdWFscyh1cmkpKSkgU3lzdGVtLm91dC5wcmludCgiWyciICsgdXJpICsgIiddOiIpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIFN5c3RlbS5vdXQucHJpbnQocHJlZml4ICsgIjoiKTsKLSAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKSBTeXN0ZW0ub3V0LnByaW50KGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludEF0dHJpYnV0ZXMoWE1MU3RyZWFtUmVhZGVyIHhtbHIpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4bWxyLmdldEF0dHJpYnV0ZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBdHRyaWJ1dGUoeG1sciwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50QXR0cmlidXRlKFhNTFN0cmVhbVJlYWRlciB4bWxyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbHIuZ2V0QXR0cmlidXRlUHJlZml4KGluZGV4KTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHhtbHIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGluZGV4KTsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHhtbHIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGluZGV4KTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0geG1sci5nZXRBdHRyaWJ1dGVWYWx1ZShpbmRleCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiKTsKLSAgICAgICAgcHJpbnROYW1lKHByZWZpeCwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCI9JyIgKyB2YWx1ZSArICInIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE5hbWVzcGFjZXMoWE1MU3RyZWFtUmVhZGVyIHhtbHIpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4bWxyLmdldE5hbWVzcGFjZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgcHJpbnROYW1lc3BhY2UoeG1sciwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50TmFtZXNwYWNlKFhNTFN0cmVhbVJlYWRlciB4bWxyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbHIuZ2V0TmFtZXNwYWNlUHJlZml4KGluZGV4KTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IHhtbHIuZ2V0TmFtZXNwYWNlVVJJKGluZGV4KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIpOwotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ4bWxucz0nIiArIHVyaSArICInIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInhtbG5zOiIgKyBwcmVmaXggKyAiPSciICsgdXJpICsgIiciKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RXZlbnRTdHJpbmcoaW50IGV2ZW50Q29kZSkgewotICAgICAgICBTdHJpbmcgZXZlbnQgPSAiIjsKLQotICAgICAgICBzd2l0Y2ggKGV2ZW50Q29kZSkgewotICAgICAgICAgICAgY2FzZSAxIDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJTVEFSVF9FTEVNRU5UIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMiA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiRU5EX0VMRU1FTlQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzIDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJQUk9DRVNTSU5HX0lOU1RSVUNUSU9OIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNCA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiQ0hBUkFDVEVSUyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDUgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIkNPTU1FTlQiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2IDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJTUEFDRSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDcgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIlNUQVJUX0RPQ1VNRU5UIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOCA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiRU5EX0RPQ1VNRU5UIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgOSA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiRU5USVRZX1JFRkVSRU5DRSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwIDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJBVFRSSUJVVEUiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMSA6Ci0gICAgICAgICAgICAgICAgZXZlbnQgPSAiRFREIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTIgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIkNEQVRBIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTMgOgotICAgICAgICAgICAgICAgIGV2ZW50ID0gIk5BTUVTUEFDRSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0IDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJOT1RBVElPTl9ERUNMQVJBVElPTiI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1IDoKLSAgICAgICAgICAgICAgICBldmVudCA9ICJFTlRJVFlfREVDTEFSQVRJT04iOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NmNDIxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlTWFjaGluZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgeG1sRG9jID0KLSAgICAgICAgICAgICAgICAiPHdyYXBwZXI+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PC93cmFwcGVyPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0gICAgICAgIFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lIHNtID0gbmV3IFNpbXBsZUFycmF5UmVhZGVyU3RhdGVNYWNoaW5lKCk7Ci0gICAgICAgIHNtLnNldEVsZW1lbnROYW1lVG9UZXN0KG5ldyBRTmFtZSgibXlJbnRWYWwiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbS5yZWFkKHJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHNtLmdldFRleHRBcnJheSgpLmxlbmd0aCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVNYWNoaW5lMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgeG1sRG9jID0KLSAgICAgICAgICAgICAgICAiPHdyYXBwZXI+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PC93cmFwcGVyPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0KLSAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGludCBldmVudCA9IHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQgJiYKLSAgICAgICAgICAgICAgICAgICAgIm15SW50VmFsIi5lcXVhbHMocmVhZGVyLmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZSBzbSA9IG5ldyBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZSgpOwotICAgICAgICBzbS5zZXRFbGVtZW50TmFtZVRvVGVzdChuZXcgUU5hbWUoIm15SW50VmFsIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc20ucmVhZChyZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscyg2LCBzbS5nZXRUZXh0QXJyYXkoKS5sZW5ndGgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YXRlTWFjaGluZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8d3JhcHBlcj48bXlJbnRWYWw+MjAwPC9teUludFZhbD48L3dyYXBwZXI+IjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcih4bWxEb2MpKTsKLSAgICAgICAgU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUgc20gPSBuZXcgU2ltcGxlQXJyYXlSZWFkZXJTdGF0ZU1hY2hpbmUoKTsKLSAgICAgICAgc20uc2V0RWxlbWVudE5hbWVUb1Rlc3QobmV3IFFOYW1lKCJteUludFZhbCIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNtLnJlYWQocmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjIwMCIsIHNtLmdldFRleHRBcnJheSgpWzBdKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVNYWNoaW5lRW1wdHlBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgeG1sRG9jID0gIjx3cmFwcGVyPjwvd3JhcHBlcj4iOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHhtbERvYykpOwotICAgICAgICBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZSBzbSA9IG5ldyBTaW1wbGVBcnJheVJlYWRlclN0YXRlTWFjaGluZSgpOwotICAgICAgICBzbS5zZXRFbGVtZW50TmFtZVRvVGVzdChuZXcgUU5hbWUoIm15SW50VmFsIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc20ucmVhZChyZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc20uZ2V0VGV4dEFycmF5KCkubGVuZ3RoKTsKLQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3V0aWxzL1NpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDBhOTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9TaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVNYWNoaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPG15SW50VmFsPjIwMDwvbXlJbnRWYWw+IjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcih4bWxEb2MpKTsKLSAgICAgICAgU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSBzbSA9IG5ldyBTaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lKCk7Ci0gICAgICAgIHNtLnNldEVsZW1lbnROYW1lVG9UZXN0KG5ldyBRTmFtZSgibXlJbnRWYWwiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbS5yZWFkKHJlYWRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyMDAiLCBzbS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZU1hY2hpbmUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHdyYXBwZXI+PG15SW50VmFsPjIwMDwvbXlJbnRWYWw+PC93cmFwcGVyPiI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoeG1sRG9jKSk7Ci0gICAgICAgIFNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUgc20gPSBuZXcgU2ltcGxlRWxlbWVudFJlYWRlclN0YXRlTWFjaGluZSgpOwotICAgICAgICBzbS5zZXRFbGVtZW50TmFtZVRvVGVzdChuZXcgUU5hbWUoIm15SW50VmFsIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc20ucmVhZChyZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscygiMjAwIiwgc20uZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVNYWNoaW5lMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgeG1sRG9jID0gIjxteUludFZhbD4yMDA8YS8+PC9teUludFZhbD4iOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKHhtbERvYykpOwotICAgICAgICBTaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lIHNtID0gbmV3IFNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUoKTsKLSAgICAgICAgc20uc2V0RWxlbWVudE5hbWVUb1Rlc3QobmV3IFFOYW1lKCJteUludFZhbCIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNtLnJlYWQocmVhZGVyKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICB9Ci0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCWE1MU3RyZWFtUmVhZGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy9yZWFkZXIvQURCWE1MU3RyZWFtUmVhZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVlN2I2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvcmVhZGVyL0FEQlhNTFN0cmVhbVJlYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMucmVhZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5CeXRlQXJyYXlEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5zZXJpYWxpemUuU3RyZWFtaW5nT01TZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFEQlhNTFN0cmVhbVJlYWRlclRlc3QgZXh0ZW5kcyBYTUxUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIERvY3VtZW50QnVpbGRlciBkYjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIH0KLQotICAgIC8qKiBjb21wbGV4IGFycmF5IHNjZW5hcmlvICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhPYmplY3RBcnJheVNjZW5hcmlvKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0KLSAgICAgICAgICAgICAgICAgICAgIjxuczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxGb28+U29tZSBUZXh0PC9Gb28+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9EZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9BZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L0FkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEJhcj5Tb21lIE1vcmUgVGV4dDwvQmFyPjwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL25zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8+IjsKLQotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkZvbyIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU29tZSBUZXh0Iik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBRTmFtZSgiRGVwZW5kZW50IikpOwotICAgICAgICAgICAgRHVtbXlBREJCZWFuIGR1bW15QmVhbiA9IG5ldyBEdW1teUFEQkJlYW4oKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZHVtbXlCZWFuKTsKLQotICAgICAgICAgICAgQURCQmVhbltdIGFkYkJlYW5zID0gbmV3IEFEQkJlYW5bNF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgIGFkYkJlYW5zW2ldID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGJCZWFucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJBZGRpdGlvbmFsRGVwZW5kZW50IikpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoYWRiQmVhbnNbaV0pOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkJhciIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU29tZSBNb3JlIFRleHQiKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZyIsICJUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8iLAotICAgICAgICAgICAgICAgICAgICAibnMxIiksIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotCi0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChuZXdEb2N1bWVudChleHBlY3RlZFhNTCksIG5ld0RvY3VtZW50KGFjdHVhbFhNTCkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBjb21wbGV4IGFycmF5IHNjZW5hcmlvIHdpdGggbnVsbHMgaW4gYmV0d2VlbiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4T2JqZWN0QXJyYXlTY2VuYXJpb1dpdGhOdWxscygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgICAgICI8bnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyB4bWxuczpuczE9XCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWdlPjI1PC9BZ2U+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L0FkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFkZGl0aW9uYWxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9BZGRpdGlvbmFsRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QWRkaXRpb25hbERlcGVuZGVudCB4c2k6bmlsPVwidHJ1ZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQWRkaXRpb25hbERlcGVuZGVudD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEJhcj5Tb21lIE1vcmUgVGV4dDwvQmFyPjwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL25zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8+IjsKLQotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgQURCQmVhbltdIGFkYkJlYW5zID0gbmV3IEFEQkJlYW5bNF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgIGFkYkJlYW5zW2ldID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGJCZWFuc1szXSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRiQmVhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBRTmFtZSgiQWRkaXRpb25hbERlcGVuZGVudCIpKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGFkYkJlYW5zW2ldKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJCYXIiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlNvbWUgTW9yZSBUZXh0Iik7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmciLCAiVGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIiwKLSAgICAgICAgICAgICAgICAgICAgIm5zMSIpLCBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEVtcHR5IGFycmF5ICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhPYmplY3RBcnJheVNjZW5hcmlvRW1wdHlBcnJheSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgICAgICI8bnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyB4bWxuczpuczE9XCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Rm9vPlNvbWUgVGV4dDwvRm9vPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8RGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFNleD5NYWxlPC9TZXg+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QmFyPlNvbWUgTW9yZSBUZXh0PC9CYXI+PCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbz4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTb21lIFRleHQiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnQiKSk7Ci0gICAgICAgICAgICBEdW1teUFEQkJlYW4gZHVtbXlCZWFuID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7fTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJBZGRpdGlvbmFsRGVwZW5kZW50IikpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChhcnJheSk7Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkJhciIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU29tZSBNb3JlIFRleHQiKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIiwgIm5zMSIpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChuZXdEb2N1bWVudChleHBlY3RlZFhNTCksIG5ld0RvY3VtZW50KGFjdHVhbFhNTCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHRlc3QgYSBjb21wbGV4IGFycmF5IGxpc3QgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleEFycmF5TGlzdCgpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgU3RyaW5nIGV4cHRlY3RlZFhNTCA9ICI8UGVyc29uPjxOYW1lPkZvb09uZTwvTmFtZT48T3JnYW5pemF0aW9uPkFwYWNoZTwvT3JnYW5pemF0aW9uPiIgKwotICAgICAgICAgICAgICAgICAgICAiPERlcGVuZGVudD48TmFtZT5Gb29Ud288L05hbWU+PEFnZT4yNTwvQWdlPjxTZXg+TWFsZTwvU2V4PjxEZXBlbWRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICI8TmFtZT5Gb29Ud288L05hbWU+PEFnZT4yNTwvQWdlPjxTZXg+TWFsZTwvU2V4PjxEZXBlbWRlbnQ+PE5hbWU+Rm9vVHdvPC9OYW1lPiIgKwotICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPjxTZXg+TWFsZTwvU2V4PjwvRGVwZW1kZW50PjwvRGVwZW1kZW50PjwvRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAiPHRlc3Q6RGVwZW5kZW50IHhtbG5zOnRlc3Q9XCJodHRwOi8vd2hhdGV2ZXIuY29tXCI+PE5hbWU+Rm9vVHdvPC9OYW1lPjxBZ2U+MjU8L0FnZT4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxTZXg+TWFsZTwvU2V4PjxEZXBlbWRlbnQ+PE5hbWU+Rm9vVHdvPC9OYW1lPjxBZ2U+MjU8L0FnZT48U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvRGVwZW1kZW50PjwvdGVzdDpEZXBlbmRlbnQ+PC9QZXJzb24+IjsKLQotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiTmFtZSIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vT25lIik7Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIk9yZ2FuaXphdGlvbiIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiQXBhY2hlIik7Ci0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnQiKSk7Ci0gICAgICAgICAgICBEdW1teUFEQkJlYW4gZHVtbXlCZWFuID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgRHVtbXlBREJCZWFuIG5leHRkdW1teUJlYW4gPSBkdW1teUJlYW4uYWRkQW5vdGhlckJlYW4oKTsKLSAgICAgICAgICAgIG5leHRkdW1teUJlYW4uYWRkQW5vdGhlckJlYW4oKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZHVtbXlCZWFuKTsKLQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoImh0dHA6Ly93aGF0ZXZlci5jb20iLCAiRGVwZW5kZW50IiwgInRlc3QiKSk7Ci0gICAgICAgICAgICBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICBkdW1teUJlYW4uYWRkQW5vdGhlckJlYW4oKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZHVtbXlCZWFuKTsKLQotICAgICAgICAgICAgUU5hbWUgcHJvamVjdFFOYW1lID0gbmV3IFFOYW1lKCJQZXJzb24iKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwocHJvamVjdFFOYW1lLCBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgYWN0dWFsRG9tID0gbmV3RG9jdW1lbnQoZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpKTsKLSAgICAgICAgICAgIERvY3VtZW50IGV4cGVjdGVkRG9jdW1lbnQgPSBuZXdEb2N1bWVudChleHB0ZWN0ZWRYTUwpOwotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYWN0dWFsRG9tLCBleHBlY3RlZERvY3VtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVtbXlBREJCZWFuIGltcGxlbWVudHMgQURCQmVhbiB7Ci0gICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHVibGljIER1bW15QURCQmVhbigpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIk5hbWUiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIkZvb1R3byIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiQWdlIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCIyNSIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU2V4Iik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJNYWxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRHVtbXlBREJCZWFuIGFkZEFub3RoZXJCZWFuKCkgewotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChuZXcgUU5hbWUoIkRlcGVtZGVudCIpKTsKLSAgICAgICAgICAgIER1bW15QURCQmVhbiBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGR1bW15QmVhbik7Ci0gICAgICAgICAgICByZXR1cm4gZHVtbXlCZWFuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKFFOYW1lIGFkYkJlYW5RTmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKGFkYkJlYW5RTmFtZSwgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShwYXJlbnRRTmFtZSxmYWN0b3J5LHhtbFdyaXRlcixmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aE9NRWxlbWVudHMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPQotICAgICAgICAgICAgICAgICI8T01FbGVtZW50VGVzdD48YXhpczI6Rmlyc3RPTUVsZW1lbnQgeG1sbnM6YXhpczI9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPGF4aXMyOlNlY29uZE9NRWxlbWVudD48L2F4aXMyOlNlY29uZE9NRWxlbWVudD48L2F4aXMyOkZpcnN0T01FbGVtZW50PjxGb28+U29tZSBUZXh0PC9Gb28+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPERlcGVuZGVudD48TmFtZT5Gb29Ud288L05hbWU+PEFnZT4yNTwvQWdlPjxTZXg+TWFsZTwvU2V4PjwvRGVwZW5kZW50PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjxheGlzMjpTZWNvbmRPTUVsZW1lbnQgeG1sbnM6YXhpczI9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPC9heGlzMjpTZWNvbmRPTUVsZW1lbnQ+PC9PTUVsZW1lbnRUZXN0PiI7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgYXhpczJOYW1lc3BhY2UgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCk7Ci0gICAgICAgIE9NRWxlbWVudCBmaXJzdEVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiRmlyc3RPTUVsZW1lbnQiLCBheGlzMk5hbWVzcGFjZSk7Ci0gICAgICAgIE9NRWxlbWVudCBzZWNvbmRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiU2Vjb25kT01FbGVtZW50IiwgYXhpczJOYW1lc3BhY2UsIGZpcnN0RWxlbWVudCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHByb3BlcnR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAvLyBhZGQgYW4gT01FbGVtZW50Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZmlyc3RFbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKGZpcnN0RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gYWRkIHNvbWUgbW9yZSBzdHVmZgotICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJGb28iKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU29tZSBUZXh0Iik7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnQiKSk7Ci0gICAgICAgIER1bW15QURCQmVhbiBkdW1teUJlYW4gPSBuZXcgRHVtbXlBREJCZWFuKCk7Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoZHVtbXlCZWFuKTsKLQotLy8gICAgICAgICBsZXRzIGFkZCBvbmUgbW9yZSBlbGVtZW50Ci0gICAgICAgIHByb3BlcnR5TGlzdC5hZGQoc2Vjb25kRWxlbWVudC5nZXRRTmFtZSgpKTsKLSAgICAgICAgcHJvcGVydHlMaXN0LmFkZChzZWNvbmRFbGVtZW50KTsKLQotCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwobmV3IFFOYW1lKCJPTUVsZW1lbnRUZXN0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBhY3R1YWxEb20gPSBuZXdEb2N1bWVudChzdHJpbmdYTUwpOwotICAgICAgICAgICAgRG9jdW1lbnQgZXhwZWN0ZWREb2N1bWVudCA9IG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKTsKLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKGFjdHVhbERvbSwgZXhwZWN0ZWREb2N1bWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKiBUZXN0IGEgY29tcGxldGVseSBudWxsIGVsZW1lbnQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbGFibGVBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBUaGlzIGlzIHdoYXQgSSBleHBlY3QgOgotCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGV4cHRlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgICAgICI8UGVyc29uIHhtbG5zPVwiXCI+PE5hbWUgeG1sbnM9XCJcIj5Gb29PbmU8L05hbWU+PERlcGVuZGVudE9uZSB4bWxucz1cIlwiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4c2k6bmlsPVwidHJ1ZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIvPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L1BlcnNvbj4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiTmFtZSIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vT25lIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKG5ldyBRTmFtZSgiRGVwZW5kZW50T25lIikpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChudWxsKTsKLQotICAgICAgICAgICAgUU5hbWUgcHJvamVjdFFOYW1lID0gbmV3IFFOYW1lKCJQZXJzb24iKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwocHJvamVjdFFOYW1lLCBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLQotICAgICAgICAgICAgRG9jdW1lbnQgYWN0dWFsRG9tID0gbmV3RG9jdW1lbnQoZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpKTsKLSAgICAgICAgICAgIERvY3VtZW50IGV4cGVjdGVkRG9jdW1lbnQgPSBuZXdEb2N1bWVudChleHB0ZWN0ZWRYTUwpOwotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwoYWN0dWFsRG9tLCBleHBlY3RlZERvY3VtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKiBUZXN0IGEgc2ltcGxlIGFycmF5ICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVN0cmluZ0FycmF5U2NlbmFyaW8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPQotICAgICAgICAgICAgICAgICAgICAiPG5zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8geG1sbnM6bnMxPVwiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmdcIj4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPFN0cmluZ0luZm8+PGFycmF5PlNvbWUgVGV4dCAwPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAxPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAyPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAzPC9hcnJheT48L1N0cmluZ0luZm8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvbnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbz4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbNF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgIHN0cmluZ0FycmF5W2ldID0gIlNvbWUgVGV4dCAiICsgaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlN0cmluZ0luZm8iKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoc3RyaW5nQXJyYXkpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcHVsbFBhcnNlciA9IG5ldyBBREJYTUxTdHJlYW1SZWFkZXJJbXBsKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8iLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TGlzdC50b0FycmF5KCksIG51bGwpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotCi0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChuZXdEb2N1bWVudChleHBlY3RlZFhNTCksIG5ld0RvY3VtZW50KGFjdHVhbFhNTCkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKiogVGVzdCBhIHNpbXBsZSBhcnJheSB3aXRoIG51bGwncyBpbmJldHdlZW4gKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyaW5nQXJyYXlTY2VuYXJpb1dpdGhOdWxscygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9Ci0gICAgICAgICAgICAgICAgICAgICI8bnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyB4bWxuczpuczE9XCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U3RyaW5nSW5mbz48YXJyYXk+U29tZSBUZXh0IDA8L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YXJyYXkgeHNpOm5pbD1cInRydWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiLz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAyPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAzPC9hcnJheT48L1N0cmluZ0luZm8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvbnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbz4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbNF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgIHN0cmluZ0FycmF5W2ldID0gIlNvbWUgVGV4dCAiICsgaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmluZ0FycmF5WzFdID0gbnVsbDsKLQotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiU3RyaW5nSW5mbyIpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChzdHJpbmdBcnJheSk7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsWE1MID0gZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpOwotCi0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi0gICAgLyoqIHRlc3QgdGhlIG1peGVkIGNvbnRlbnQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW9XaXRoTWl4ZWRDb250ZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0KLSAgICAgICAgICAgICAgICAgICAgIjxuczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIHhtbG5zOm5zMT1cImh0dHA6Ly90ZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8ub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxGb28+U29tZSBUZXh0PC9Gb28+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxEZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxOYW1lPkZvb1R3bzwvTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFnZT4yNTwvQWdlPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8U2V4Pk1hbGU8L1NleD4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9EZXBlbmRlbnQ+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxTdHJpbmdJbmZvPjxhcnJheT5Tb21lIFRleHQgMDwvYXJyYXk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxhcnJheT5Tb21lIFRleHQgMTwvYXJyYXk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxhcnJheT5Tb21lIFRleHQgMjwvYXJyYXk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxhcnJheT5Tb21lIFRleHQgMzwvYXJyYXk+PC9TdHJpbmdJbmZvPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8QmFyPlNvbWUgTW9yZSBUZXh0PC9CYXI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvbnMxOlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbz4iOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZCgiRm9vIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTb21lIFRleHQiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQobmV3IFFOYW1lKCJEZXBlbmRlbnQiKSk7Ci0gICAgICAgICAgICBEdW1teUFEQkJlYW4gZHVtbXlCZWFuID0gbmV3IER1bW15QURCQmVhbigpOwotICAgICAgICAgICAgcHJvcGVydHlMaXN0LmFkZChkdW1teUJlYW4pOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbNF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgIHN0cmluZ0FycmF5W2ldID0gIlNvbWUgVGV4dCAiICsgaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlN0cmluZ0luZm8iKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoc3RyaW5nQXJyYXkpOwotCi0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJCYXIiKTsKLSAgICAgICAgICAgIHByb3BlcnR5TGlzdC5hZGQoIlNvbWUgTW9yZSBUZXh0Iik7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpby5vcmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RDb21wbGV4U3RyaW5nQXJyYXlTY2VuYXJpbyIsICJuczEiKSwKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlMaXN0LnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsWE1MID0gZ2V0U3RyaW5nWE1MKHB1bGxQYXJzZXIpOwotCi0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIC8qKiBUZXN0IGEgc2ltcGxlIGFycmF5IHdpdGggb25lIGVsZW1lbnQgbmlsICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvV2l0aE51bGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPSAiPG5zMTpUZXN0Q29tcGxleFN0cmluZ0FycmF5U2NlbmFyaW8gIiArCi0gICAgICAgICAgICAgICAgICAgICJ4bWxuczpuczE9XCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZ1wiICIgKwotICAgICAgICAgICAgICAgICAgICAiPiIgKwotICAgICAgICAgICAgICAgICAgICAiPFN0cmluZ0luZm8+PGFycmF5PlNvbWUgVGV4dCAwPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxhcnJheSB4c2k6bmlsPVwidHJ1ZVwiICIgKwotICAgICAgICAgICAgICAgICAgICAieG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj48L2FycmF5PiIgKwotICAgICAgICAgICAgICAgICAgICAiPGFycmF5PlNvbWUgVGV4dCAyPC9hcnJheT4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxhcnJheT5Tb21lIFRleHQgMzwvYXJyYXk+PC9TdHJpbmdJbmZvPiIgKwotICAgICAgICAgICAgICAgICAgICAiPC9uczE6VGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvPiI7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0eUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1s0XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgIT0gMSkgc3RyaW5nQXJyYXlbaV0gPSAiU29tZSBUZXh0ICIgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyaW5nQXJyYXlbMV0gPSBudWxsOwotCi0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKCJTdHJpbmdJbmZvIik7Ci0gICAgICAgICAgICBwcm9wZXJ0eUxpc3QuYWRkKHN0cmluZ0FycmF5KTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvLm9yZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdENvbXBsZXhTdHJpbmdBcnJheVNjZW5hcmlvIiwgIm5zMSIpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUxpc3QudG9BcnJheSgpLCBudWxsKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0KLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtdWx0aXBsZSB1bnF1bGlmaWVkIGF0dHJpYnV0ZXMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPQotICAgICAgICAgICAgICAgICI8ZW1wOkVtcGxveWVlIHhtbG5zOmVtcD1cImh0dHA6Ly9lYy5vcmcvc29mdHdhcmVcIiBBdHRyMj1cIlZhbHVlIDJcIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyMz1cIlZhbHVlIDNcIiBBdHRyMT1cIlZhbHVlIDFcIiBBdHRyNT1cIlZhbHVlIDVcIiBBdHRyND1cIlZhbHVlIDRcIj48L2VtcDpFbXBsb3llZT4iOwotCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2VjLm9yZy9zb2Z0d2FyZSIsICJFbXBsb3llZSIsICJlbXAiKTsKLSAgICAgICAgT01BdHRyaWJ1dGVbXSBhdHRyaWJ1dGUgPSBuZXcgT01BdHRyaWJ1dGVbNV07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVtpXSA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoIkF0dHIiICsgKGkgKyAxKSwgbnVsbCwgIlZhbHVlICIgKyAoaSArIDEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Qgb21BdHRyaWJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgb21BdHRyaWJMaXN0LmFkZChDb25zdGFudHMuT01fQVRUUklCVVRFX0tFWSk7Ci0gICAgICAgICAgICBvbUF0dHJpYkxpc3QuYWRkKGF0dHJpYnV0ZVtpXSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFN0cmluZyBzdHJpbmdYTUwgPSBnZXRTdHJpbmdYTUwobmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoZWxlbWVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21BdHRyaWJMaXN0LnRvQXJyYXkoKSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnQgYWN0dWFsRG9tID0gbmV3RG9jdW1lbnQoc3RyaW5nWE1MKTsKLSAgICAgICAgICAgIERvY3VtZW50IGV4cGVjdGVkRG9jdW1lbnQgPSBuZXdEb2N1bWVudChleHBlY3RlZFhNTCk7Ci0gICAgICAgICAgICBhc3NlcnRYTUxFcXVhbChhY3R1YWxEb20sIGV4cGVjdGVkRG9jdW1lbnQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gaW4gcGFyc2luZyBkb2N1bWVudHMgIiArIGUpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIC8qKiBBIHRleHQgb25seSBlbGVtZW50ICovCi0gICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUZXh0KCkgewotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9ICI8bnMxOnRlc3RFbGVtZW50VGV4dCB4bWxuczpuczE9XCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgVGV4dCBmb3IgdGhlIGVsZW1lbnQ8L25zMTp0ZXN0RWxlbWVudFRleHQ+IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoQURCWE1MU3RyZWFtUmVhZGVyLkVMRU1FTlRfVEVYVCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZCgiVGhpcyBpcyBzb21lIFRleHQgZm9yIHRoZSBlbGVtZW50Iik7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RFbGVtZW50VGV4dC5vcmciLCAidGVzdEVsZW1lbnRUZXh0IiwgIm5zMSIpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnRvQXJyYXkoKSwgbnVsbCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotLy8vIHRvZG8gRmFpbHMgZHVlIHRvIGEgYnVnIGluIFdTVFggd3JpdGVyCi0vLyAgICAvKioKLS8vICAgICAqIFRlc3QgbXVsdGlwbGUgcXVhbGlmaWVkIGF0dHJpYnV0ZXMKLS8vICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzV2l0aE5hbWVzcGFjZXMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLS8vCi0vLyAgICAgICAgU3RyaW5nIGV4cGVjdGVkWE1MID0gIjxlbXA6RW1wbG95ZWUgeG1sbnM6ZW1wPVwiaHR0cDovL2VjLm9yZy9zb2Z0d2FyZVwiICIgKwotLy8gICAgICAgICAgICAgICAgInhtbG5zOmF0dHJOUz1cIm1haWx0bzp3aG9ldmVyQHdoYXRldmVyLmNvbVwiIGF0dHJOUzpBdHRyMj1cIlZhbHVlIDJcIiAiICsKLS8vICAgICAgICAgICAgICAgICJhdHRyTlM6QXR0cjM9XCJWYWx1ZSAzXCIgYXR0ck5TOkF0dHIxPVwiVmFsdWUgMVwiXG4iICsKLS8vICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGF0dHJOUzpBdHRyNT1cIlZhbHVlIDVcIiBhdHRyTlM6QXR0cjQ9XCJWYWx1ZSA0XCI+PC9lbXA6RW1wbG95ZWU+IjsKLS8vCi0vLyAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLS8vICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9lYy5vcmcvc29mdHdhcmUiLCAiRW1wbG95ZWUiLCAiZW1wIik7Ci0vLyAgICAgICAgT01OYW1lc3BhY2UgYXR0ck5TID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgibWFpbHRvOndob2V2ZXJAd2hhdGV2ZXIuY29tIiwgImF0dHJOUyIpOwotLy8KLS8vICAgICAgICAvLyBhZGQgc29tZSBhdHRyaWJ1dGVzIHdpdGggbmFtZXNwYWNlcwotLy8gICAgICAgIE9NQXR0cmlidXRlW10gYXR0cmlidXRlID0gbmV3IE9NQXR0cmlidXRlWzVdOwotLy8gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0vLyAgICAgICAgICAgIGF0dHJpYnV0ZVtpXSA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoIkF0dHIiICsgKGkgKyAxKSwgYXR0ck5TLCAiVmFsdWUgIiArIChpICsgMSkpOwotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgTGlzdCBvbUF0dHJpYkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGUubGVuZ3RoOyBpKyspIHsKLS8vICAgICAgICAgICAgb21BdHRyaWJMaXN0LmFkZChDb25zdGFudHMuT01fQVRUUklCVVRFX0tFWSk7Ci0vLyAgICAgICAgICAgIG9tQXR0cmliTGlzdC5hZGQoYXR0cmlidXRlW2ldKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgU3RyaW5nIHN0cmluZ1hNTCA9IGdldFN0cmluZ1hNTChuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbChlbGVtZW50UU5hbWUsCi0vLyAgICAgICAgICAgICAgICBudWxsLAotLy8gICAgICAgICAgICAgICAgb21BdHRyaWJMaXN0LnRvQXJyYXkoKSkpOwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIERvY3VtZW50IGFjdHVhbERvbSA9IG5ld0RvY3VtZW50KHN0cmluZ1hNTCk7Ci0vLyAgICAgICAgICAgIERvY3VtZW50IGV4cGVjdGVkRG9jdW1lbnQgPSBuZXdEb2N1bWVudChleHBlY3RlZFhNTCk7Ci0vLyAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKGFjdHVhbERvbSwgZXhwZWN0ZWREb2N1bWVudCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0vLyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGluIHBhcnNpbmcgZG9jdW1lbnRzICIgKyBlKTsKLS8vICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpbiBwYXJzaW5nIGRvY3VtZW50cyAiICsgZSk7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoqIHRlc3QgZm9yIHF1YWxpZmllZCBhdHRyaWJ1dGVzICovCi0gICAgcHVibGljIHZvaWQgdGVzdFVuUXVhbGlmaWVkQXR0cmlidXRlcygpIHsKLQotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPQotICAgICAgICAgICAgICAgICI8bnMxOnRlc3RFbGVtZW50VGV4dCB4bWxuczpuczE9XCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZ1wiIE15VW5RdWFsaWZpZWRBdHRyaWJ1dGU9XCJNeUF0dHJpYnV0ZVZhbHVlXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPG5zMjpRdWFsaWZpZWRFbGVtZW50IHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0UUVsZW1lbnRUZXh0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgc29tZSBUZXh0IGZvciB0aGUgZWxlbWVudDwvbnMyOlF1YWxpZmllZEVsZW1lbnQ+PC9uczE6dGVzdEVsZW1lbnRUZXh0PiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcHJvcGVydGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RRRWxlbWVudFRleHQub3JnIiwgIlF1YWxpZmllZEVsZW1lbnQiLCAibnMyIikpOwotICAgICAgICAgICAgcHJvcGVydGllcy5hZGQoIlRoaXMgaXMgc29tZSBUZXh0IGZvciB0aGUgZWxlbWVudCIpOwotCi0gICAgICAgICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXNbMF0gPSAiTXlVblF1YWxpZmllZEF0dHJpYnV0ZSI7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzWzFdID0gIk15QXR0cmlidXRlVmFsdWUiOwotCi0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBwdWxsUGFyc2VyID0gbmV3IEFEQlhNTFN0cmVhbVJlYWRlckltcGwoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3Rlc3RFbGVtZW50VGV4dC5vcmciLCAidGVzdEVsZW1lbnRUZXh0IiwgIm5zMSIpLAotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxYTUwgPSBnZXRTdHJpbmdYTUwocHVsbFBhcnNlcik7Ci0KLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIHRlc3QgZm9yIGJhc2U2NCAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNlNjRFbmNvZGVkVGV4dCgpIHsKLQotICAgICAgICBTdHJpbmcgdGV4dFRvYmVTZW50ID0gIjMzMzQ0TXRod3JyZXdySU9URU4pKCYqKl5FKFcpRVciOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFhNTCA9ICI8bnMxOnRlc3RFbGVtZW50VGV4dCB4bWxuczpuczE9XCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICI8bnMyOlF1YWxpZmllZEVsZW1lbnQgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RRRWxlbWVudFRleHQub3JnXCI+IiArCi0gICAgICAgICAgICAgICAgQmFzZTY0LmVuY29kZSh0ZXh0VG9iZVNlbnQuZ2V0Qnl0ZXMoKSkgKwotICAgICAgICAgICAgICAgICI8L25zMjpRdWFsaWZpZWRFbGVtZW50PjwvbnMxOnRlc3RFbGVtZW50VGV4dD4iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0UUVsZW1lbnRUZXh0Lm9yZyIsICJRdWFsaWZpZWRFbGVtZW50IiwgIm5zMiIpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBEYXRhSGFuZGxlcihuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZSh0ZXh0VG9iZVNlbnQuZ2V0Qnl0ZXMoKSkpKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZyIsICJ0ZXN0RWxlbWVudFRleHQiLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLQotICAgICAgICAgICAgYXNzZXJ0WE1MRXF1YWwobmV3RG9jdW1lbnQoZXhwZWN0ZWRYTUwpLCBuZXdEb2N1bWVudChhY3R1YWxYTUwpKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdGVzdCB0aGUgcXVhbGlmaWVkIGVsZW1lbnRzIEEgcXVsaWZpZWQgZWxlbWVudCBoYXMgYmVlbiBhc3NvY2lhdGVkIHdpdGggYSBuYW1lc3BhY2UgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UXVhbGlmaWVkRWxlbWVudCgpIHsKLQotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRYTUwgPSAiPG5zMTp0ZXN0RWxlbWVudFRleHQgeG1sbnM6bnMxPVwiaHR0cDovL3Rlc3RFbGVtZW50VGV4dC5vcmdcIj4iICsKLSAgICAgICAgICAgICAgICAiPG5zMjpRdWFsaWZpZWRFbGVtZW50IHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0UUVsZW1lbnRUZXh0Lm9yZ1wiPiIgKwotICAgICAgICAgICAgICAgICJUaGlzIGlzIHNvbWUgVGV4dCBmb3IgdGhlIGVsZW1lbnQ8L25zMjpRdWFsaWZpZWRFbGVtZW50PjwvbnMxOnRlc3RFbGVtZW50VGV4dD4iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLmFkZChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0UUVsZW1lbnRUZXh0Lm9yZyIsICJRdWFsaWZpZWRFbGVtZW50IiwgIm5zMiIpKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuYWRkKCJUaGlzIGlzIHNvbWUgVGV4dCBmb3IgdGhlIGVsZW1lbnQiKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHB1bGxQYXJzZXIgPSBuZXcgQURCWE1MU3RyZWFtUmVhZGVySW1wbCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vdGVzdEVsZW1lbnRUZXh0Lm9yZyIsICJ0ZXN0RWxlbWVudFRleHQiLCAibnMxIiksCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFhNTCA9IGdldFN0cmluZ1hNTChwdWxsUGFyc2VyKTsKLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ld0RvY3VtZW50KGV4cGVjdGVkWE1MKSwgbmV3RG9jdW1lbnQoYWN0dWFsWE1MKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXJyb3IgaGFzIG9jY3VycmVkICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIGhhcyBvY2N1cnJlZCAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciBoYXMgb2NjdXJyZWQgIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbCBtZXRob2QgdG8gY29udmVydCB0aGUgcHVsbHN0cmVhbSB0byBhIHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdYTUwoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vdGhlIHJldHVybmVkIHB1bGxwYXJzZXIgc3RhcnRzIGF0IGFuIEVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0Ci0gICAgICAgIC8vZG9jdW1lbnQgZXZlbnQuIFRoaXMgaXMgc29tZXdoYXQgZGlzdHVyYmluZyBidXQgc2luY2UgYW4gQURCQmVhbgotICAgICAgICAvL2Rlbm90ZXMgYW4gWE1MRnJhZ21lbnQsIGl0IGlzIGp1c3RpZmlhYmxlIHRvIGtlZXAgdGhlIGN1cnJlbnQgZXZlbnQKLSAgICAgICAgLy9hdCB0aGUgU3RhcnQtZWxlbWVudCByYXRoZXIgdGhhbiB0aGUgc3RhcnQgZG9jdW1lbnQKLSAgICAgICAgLy9XaGF0IGl0IGJvaWxzIGRvd24gdG8gaXMgdGhhdCB3ZSBuZWVkIHRvIHdyYXAgdGhlIHJlYWRlciBpbiBhCi0gICAgICAgIC8vc3RyZWFtIHdyYXBwZXIgdG8gZ2V0IGEgZmFrZSBzdGFydC1kb2N1bWVudCBldmVudAotCi0gICAgICAgIFN0cmVhbWluZ09NU2VyaWFsaXplciBzZXIgPSBuZXcgU3RyZWFtaW5nT01TZXJpYWxpemVyKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKGJ5dGVBcnJheU91dHB1dFN0cmVhbSk7Ci0gICAgICAgIHNlci5zZXJpYWxpemUoCi0gICAgICAgICAgICAgICAgbmV3IFN0cmVhbVdyYXBwZXIocmVhZGVyKSwKLSAgICAgICAgICAgICAgICB3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgcmV0dXJuIGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b1N0cmluZygpOwotICAgIH0KLQotLy8gICAgIC8qKgotLy8gICAgICogVXRpbCBtZXRob2QgdG8gY29udmVydCB0aGUgcHVsbHN0cmVhbSB0byBhIHN0cmluZwotLy8gICAgICogQHBhcmFtIHJlYWRlcgotLy8gICAgICogQHJldHVybgotLy8gICAgICovCi0vLyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdYTUwoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotLy8gICAgICAgIC8vdGhlIHJldHVybmVkIHB1bGxwYXJzZXIgc3RhcnRzIGF0IGFuIEVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0Ci0vLyAgICAgICAgLy9kb2N1bWVudCBldmVudC4gVGhpcyBpcyBzb21ld2hhdCBkaXN0dXJiaW5nIGJ1dCBzaW5jZSBhbiBBREJCZWFuCi0vLyAgICAgICAgLy9kZW5vdGVzIGFuIFhNTEZyYWdtZW50LCBpdCBpcyBqdXN0aWZpYWJsZSB0byBrZWVwIHRoZSBjdXJyZW50IGV2ZW50Ci0vLyAgICAgICAgLy9hdCB0aGUgU3RhcnQtZWxlbWVudCByYXRoZXIgdGhhbiB0aGUgc3RhcnQgZG9jdW1lbnQKLS8vICAgICAgICAvL1doYXQgaXQgYm9pbHMgZG93biB0byBpcyB0aGF0IHdlIG5lZWQgdG8gd3JhcCB0aGUgcmVhZGVyIGluIGEKLS8vICAgICAgICAvL3N0cmVhbSB3cmFwcGVyIHRvIGdldCBhIGZha2Ugc3RhcnQtZG9jdW1lbnQgZXZlbnQKLS8vICAgICAgICBTdEFYT01CdWlsZGVyIHN0QVhPTUJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcigKLS8vICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1XcmFwcGVyKHJlYWRlcikpOwotLy8gICAgICAgIC8vc3RBWE9NQnVpbGRlci5zZXREb0RlYnVnKHRydWUpOwotLy8gICAgICAgIE9NRWxlbWVudCBvbWVsZW1lbnQgPSBzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotLy8gICAgICAgIHJldHVybiBvbWVsZW1lbnQudG9TdHJpbmcoKTsKLS8vICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBET00gZG9jdW1lbnQgZnJvbSB0aGUgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudCBuZXdEb2N1bWVudChTdHJpbmcgeG1sKQotICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbC5nZXRCeXRlcygpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvT01FbGVtZW50U3RyZWFtV3JpdGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhYmluZGluZy91dGlscy93cml0ZXIvT01FbGVtZW50U3RyZWFtV3JpdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBiOWYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkYi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YWJpbmRpbmcvdXRpbHMvd3JpdGVyL09NRWxlbWVudFN0cmVhbVdyaXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBPTUVsZW1lbnRTdHJlYW1Xcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBpbnQgcHJlZml4TnVtOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE9NRWxlbWVudCgpIHsKLQotICAgICAgICBPTUVsZW1lbnRTdHJlYW1Xcml0ZXIgb21FbGVtZW50U3RyZWFtV3JpdGVyID0gbmV3IE9NRWxlbWVudFN0cmVhbVdyaXRlcigpOwotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KG51bGwsICJ0ZXN0MSIsIG9tRWxlbWVudFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCgiaHR0cDovL2FwYWNoLnRlbXAudXJpIiwgInRlc3QyIiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KCJodHRwOi8vYXBhY2gudGVtcC51cmkxIiwgInRlc3QzIiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmVhbVdyaXRlci53cml0ZUNoYXJhY3RlcnMoInRlc3Qgc3RyaW5nMyIpOwotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaC50ZW1wLnVyaSIsICJhdHRyaWJ1dGUxIiwgImF0dHJ1YnRlVmFsdWUxIiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlUU5hbWVzKG5ldyBRTmFtZVtde25ldyBRTmFtZSgiaHR0cDovL2F4aXMyLmFwYWNoLm9yZzEiLCAidGVzdFFOYW1lIiksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2F4aXMyLmFwYWNoLm9yZzIiLCAidGVzdFFOYW1lMiIpfSwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KCJodHRwOi8vYXBhY2gudGVtcC51cmkxIiwgInRlc3Q0Iiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKG51bGwsICJhdHRyaWJ1dGUxIiwgImF0dHJ1YnRlVmFsdWUxIiwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKCJuczEiLCAiaHR0cDovL2FwYWNoLnRlbXAudXJpIiwgImF0dHJpYnV0ZTEiLCAiYXR0cnVidGVWYWx1ZTEiLCBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgb21FbGVtZW50U3RyZWFtV3JpdGVyLndyaXRlQ2hhcmFjdGVycygidGVzdCBzdHJpbmc0Iik7Ci0gICAgICAgICAgICBvbUVsZW1lbnRTdHJlYW1Xcml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCgiaHR0cDovL3RlbXAubmV3Lm9yZyIsICJ0ZXN0YXR0cmlidXRlRWxlbWVudCIsIG9tRWxlbWVudFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lQXR0cmlidXRlKG51bGwsICJ0ZXN0UW5hbWUiLCBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wLm5ldy5vcmciLCAidGVzdFFOYW1lIiksIG9tRWxlbWVudFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZVFOYW1lKG5ldyBRTmFtZSgiaHR0cDovL2F4aXMyLmFwYWNoLm9yZyIsICJ0ZXN0UU5hbWUiKSwgb21FbGVtZW50U3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG9tRWxlbWVudFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG9tRWxlbWVudFN0cmVhbVdyaXRlci5nZXRPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT00gU3RyaW5nID09PiAiICsgb21FbGVtZW50LnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBzdEFYT01CdWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzdEFYT01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIHJlc3VsdCA9PT4gIiArIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVQcmVmaXgoU3RyaW5nIHN0cmluZykgewotICAgICAgICByZXR1cm4gIm5zIiArICsrcHJlZml4TnVtOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lLCBYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoKG5hbWVzcGFjZSAhPSBudWxsKSAmJiAhIG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArICsrcHJlZml4TnVtOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRWYWx1ZSwgWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoeG1sV3JpdGVyLmdldFByZWZpeChuYW1lc3BhY2UpID09IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0gICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShuYW1lc3BhY2UsIGF0dE5hbWUsIGF0dFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRWYWx1ZSwgWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgobmFtZXNwYWNlID09IG51bGwpIHx8IG5hbWVzcGFjZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVnaXN0ZXJQcmVmaXgoeG1sV3JpdGVyLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZSwgYXR0TmFtZSwgYXR0VmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUU5hbWVBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGF0dE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW5hbWUsIFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlUHJlZml4ID0geG1sV3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVOYW1lc3BhY2UpOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCA9IHJlZ2lzdGVyUHJlZml4KHhtbFdyaXRlciwgYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICBpZiAoYXR0cmlidXRlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlUHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2UgIT0gbnVsbCkgJiYgbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWdpc3RlclByZWZpeCh4bWxXcml0ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlLCBhdHROYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVRTmFtZShRTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwcmVmaXggKyAiOiIgKyBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVDaGFyYWN0ZXJzKENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVFOYW1lcyhRTmFtZVtdIHFuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHFuYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIHRoaXMgZGF0YSB1bnRpbCBsYXN0IG1vbWVudCBzaW5jZSBpdCBpcyBub3QgcG9zc2libGUgdG8gd3JpdGUgYW55Ci0gICAgICAgICAgICAvLyBuYW1lc3BhY2UgZGF0YSBhZnRlciB3cml0aW5nIHRoZSBjaGFyYWN0b3IgZGF0YQotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZ1RvV3JpdGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHFuYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VVUkkgPSBxbmFtZXNbaV0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVmaXggPT0gbnVsbCkgfHwgKHByZWZpeC5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIuc2V0UHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9Xcml0ZS5hcHBlbmQocHJlZml4KS5hcHBlbmQoIjoiKS5hcHBlbmQoQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcocW5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb1dyaXRlLmFwcGVuZChDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhxbmFtZXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvV3JpdGUuYXBwZW5kKENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHFuYW1lc1tpXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZUNoYXJhY3RlcnMoc3RyaW5nVG9Xcml0ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIFN0cmluZyByZWdpc3RlclByZWZpeChYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyLCBTdHJpbmcgbmFtZXNwYWNlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IGdlbmVyYXRlUHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB3aGlsZSAoeG1sV3JpdGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXROYW1lc3BhY2VVUkkocHJlZml4KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gQmVhblV0aWwuZ2V0VW5pcXVlUHJlZml4KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sV3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkMTVlNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmFkZHJlc3Npbmc8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBBZGRyZXNzaW5nPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5XUy1BZGRyZXNzaW5nIGltcGxlbWVudGF0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2FkZHJlc3Npbmc8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmNsYXNzcGF0aC1tb2R1bGU8L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA1ZjdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3Npbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0iYWRkcmVzc2luZyI+Ci0gICAgPERlc2NyaXB0aW9uPlRoaXMgaXMgdGhlIFdTLUFkZHJlc3NpbmcgaW1wbGVtZW50YXRpb24gb24gQXhpczIsIHN1cHBvcnRpbmcgdGhlIFdTLUFkZHJlc3NpbmcgMS4wIFJlY29tbWVuZGF0aW9uLCBhcyB3ZWxsIGFzIHRoZSBTdWJtaXNzaW9uIHZlcnNpb24gKDIwMDQvMDgpLjwvRGVzY3JpcHRpb24+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0luSGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZy5BZGRyZXNzaW5nSW5IYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIgYmVmb3JlPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nLkFkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIiBhZnRlcj0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8IS0tIFdlIGRvbid0IG5lZWQgdG8gaGF2ZSB0d28gaGFuZGxlcnMgdG8gaGFuZGxlIHRoZXNlIHR3byB2ZXJzaW9uLiBTbyBsZXRzIGhhbmRsZSBib3RoIG9mIHRoZW0gaW4gb25lLiAtLT4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ091dEhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3NpbmcuQWRkcmVzc2luZ091dEhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8T3V0RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nT3V0SGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZy5BZGRyZXNzaW5nT3V0SGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0RmF1bHRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nSW5IYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nLkFkZHJlc3NpbmdJbkhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIiBiZWZvcmU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nSW5GYXVsdEhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iUHJlRGlzcGF0Y2giIGFmdGVyPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPCEtLSBBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIgbm90IHByZXNlbnQgb24gdGhlIElOZmF1bHRmbG93IHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGZhdWx0cyBib3VuY2luZyBhcm91bmQgZm9yZXZlciAtLT4KLSAgICA8L0luRmF1bHRGbG93PgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmQ0YTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdJbkZhdWx0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0U3ViQ29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGV4dHJhY3QgV1MtQWRkcmVzc2luZyBTcGVjIGRlZmluZWQgRmF1bHRzIGFuZCBGYXVsdERldGFpbCBhbmQgY29udmVydCB0aGVtCi0gKiBpbnRvIHVuZGVyc3RhbmRhYmxlIEF4aXNGYXVsdCBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgQWRkcmVzc2luZ0NvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG1zZ0NvbnRleHQuZ2V0V1NBQWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKEZpbmFsLldTQV9GQVVMVF9BQ1RJT04uZXF1YWxzKGFjdGlvbikKLSAgICAgICAgICAgICAgICB8fCBGaW5hbC5XU0FfU09BUF9GQVVMVF9BQ1RJT04uZXF1YWxzKGFjdGlvbikKLSAgICAgICAgICAgICAgICB8fCBTdWJtaXNzaW9uLldTQV9GQVVMVF9BQ1RJT04uZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGVudmVsb3BlLmdldEJvZHkoKS5nZXRGYXVsdCgpOwotCi0gICAgICAgICAgICBpZiAoZmF1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkEgU29hcCBlbnZlbG9wZSB3aXRoIGZhdWx0IGFjdGlvbiAtIiArIGFjdGlvbiArICIgaGFzIGJlZW4gcmVjZWl2ZWQgd2l0aG91dCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhIGZhdWx0IGVsZW1lbnQgaW4gdGhlIHNvYXAgYm9keSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9ICgoU09BUEZhY3RvcnkpZW52ZWxvcGUuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgU09BUEZhdWx0RGV0YWlsIGRldGFpbCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gaGVhZGVyLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfSEVBREVSX0RFVEFJTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZXRhaWwgPSBzZi5jcmVhdGVTT0FQRmF1bHREZXRhaWwoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gZWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGRldGFpbEVsZW1lbnQgPSAoT01FbGVtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsLmFkZERldGFpbEVudHJ5KGRldGFpbEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXRhaWwgPSBmYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZhdWx0RGV0YWlsU3RyaW5nID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChkZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gZGV0YWlsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHREZXRhaWxTdHJpbmcgPSBlbGVtZW50LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBmYXVsdExvY2FsTmFtZTsKLSAgICAgICAgICAgIFNPQVBGYXVsdENvZGUgY29kZSA9IGZhdWx0LmdldENvZGUoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc3ViQ29kZSA9IGNvZGUuZ2V0U3ViQ29kZSgpOwotICAgICAgICAgICAgaWYgKHN1YkNvZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0TG9jYWxOYW1lID0gY29kZS5nZXRUZXh0QXNRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc3ViQ29kZS5nZXRTdWJDb2RlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdWJDb2RlID0gc3ViQ29kZS5nZXRTdWJDb2RlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZhdWx0TG9jYWxOYW1lID0gc3ViQ29kZS5nZXRWYWx1ZSgpLmdldFRleHRBc1FOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBuZXdSZWFzb24gPSBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRm9yQXhpc0ZhdWx0KGZhdWx0TG9jYWxOYW1lLCBmYXVsdERldGFpbFN0cmluZyk7Ci0KLSAgICAgICAgICAgIGlmIChuZXdSZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzZnIgPSBzZi5jcmVhdGVTT0FQRmF1bHRSZWFzb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2ZyLnNldFRleHQobmV3UmVhc29uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHNmdCA9IHNmLmNyZWF0ZVNPQVBGYXVsdFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2Z0LnNldFRleHQobmV3UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgc2ZyLmFkZFNPQVBUZXh0KHNmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIGVsc2UgY2FsbCB0aGUgb24gZXJyb3IgbWV0aG9kIHdpdGggdGhlIGZhdWx0Ci0gICAgICAgICAgICAgICAgQXhpc0ZhdWx0IGF4aXNGYXVsdCA9IG5ldyBBeGlzRmF1bHQoZmF1bHQuZ2V0Q29kZSgpLCBzZnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0Tm9kZSgpLCBmYXVsdC5nZXRSb2xlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsKTsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5JTkJPVU5EX0ZBVUxUX09WRVJSSURFLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdJbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1Y2JjMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nRmF1bHRzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0luSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEFkZHJlc3NpbmdDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPX0ZMQUcgPSAxLCBGUk9NX0ZMQUcgPSAyLCBSRVBMWVRPX0ZMQUcgPSAzLAotICAgICAgICAgICAgRkFVTFRPX0ZMQUcgPSA0LCBNRVNTQUdFSURfRkxBRyA9IDYsIEFDVElPTl9GTEFHID0gMDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nSW5IYW5kbGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkaXNhYmxlUmVmcGFyYW1FeHRyYWN0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFJvbGVQbGF5ZXIgcm9sZVBsYXllciA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcmRlc2MpewotICAgIAlzdXBlci5pbml0KGhhbmRsZXJkZXNjKTsKLSAgICAJLy8gY2hlY2sgd2hldGhlciB0byBwcm9jZXNzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBoYW5kbGVyZGVzYy5nZXRQYXJhbWV0ZXIoRElTQUJMRV9SRUZfUEFSQU1FVEVSX0VYVFJBQ1QpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShwYXJhbSk7Ci0gICAgICAgIGRpc2FibGVSZWZwYXJhbUV4dHJhY3QgPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseSh2YWx1ZSk7Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZGlzYWJsZVJlZnBhcmFtRXh0cmFjdD0iICsgZGlzYWJsZVJlZnBhcmFtRXh0cmFjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vU2V0IHRoZSBkZWZhdWx0cyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0LgotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KERJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KElTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRCwgQm9vbGVhbi5GQUxTRSk7Ci0KLSAgICAgICAgLy9EZXRlcm1pbmUgaWYgd2Ugd2FudCB0byBpZ25vcmUgYWRkcmVzc2luZyBoZWFkZXJzLiBUaGlzIHBhcmFtZXRlciBtdXN0Ci0gICAgICAgIC8vYmUgcmV0cmlldmVkIGZyb20gdGhlIG1lc3NhZ2UgY29udGV4dCBiZWNhdXNlIGl0J3MgdmFsdWUgY2FuIHZhcnkgb24gYQotICAgICAgICAvL3BlciBzZXJ2aWNlIGJhc2lzLgotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVBhcmFtID0gbXNnQ29udGV4dC5nZXRQYXJhbWV0ZXIoRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVQYXJhbSk7Ci0gICAgICAgIGlmIChKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseSh2YWx1ZSkpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBBZGRyZXNzaW5nSW5IYW5kbGVyIGhhcyBiZWVuIGRpc2FibGVkLiBObyBmdXJ0aGVyIHByb2Nlc3Npbmcgd2lsbCB0YWtlIHBsYWNlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBub3QgaGVhZGVycyBwdXQgYSBmbGFnIHRvIGRpc2FibGUgYWRkcmVzc2luZyB0ZW1wb3JhcnkKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCl7Ci0gICAgICAgIAlBeGlzQ29uZmlndXJhdGlvbiBjb25mID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIAlyb2xlUGxheWVyID0gKFJvbGVQbGF5ZXIpY29uZi5nZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuU09BUF9ST0xFX1BMQVlFUl9QQVJBTUVURVIpOwotICAgICAgICAJY29uZmlndXJhdGlvbiA9IGNvbmY7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgYW5vdGhlciBoYW5kbGVyIGhhcyBleHBsaWNpdGx5IHNldCB3aGljaCBhZGRyZXNzaW5nIG5hbWVzcGFjZSB0byBleHBlY3QuCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHNlcnZpY2UgaXMgY29uZmlndXJlZCB0byB1c2UgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgV1MtQWRkcmVzc2luZywKLSAgICAgICAgLy8gZS5nLiB2aWEgSkFYLVdTIGFubm90YXRpb25zLgotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBuYW1lc3BhY2VQYXJhbSA9IG1zZ0NvbnRleHQuZ2V0UGFyYW1ldGVyKFdTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShuYW1lc3BhY2VQYXJhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbmFtZXNwYWNlID0gRmluYWwuV1NBX05BTUVTUEFDRTsKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gaGVhZGVyLmdldEhlYWRlcnNUb1Byb2Nlc3Mocm9sZVBsYXllciwgbmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIGhlYWRlcnMgcHJlc2VudCBjb3JyZXNwb25kaW5nIHRvICIgKyBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRTsKLSAgICAgICAgICAgICAgICBpdGVyYXRvciA9IGhlYWRlci5nZXRIZWFkZXJzVG9Qcm9jZXNzKHJvbGVQbGF5ZXIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSB8fCBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gaGVhZGVyLmdldEhlYWRlcnNUb1Byb2Nlc3Mocm9sZVBsYXllciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBwcmVjb25maWd1cmVkIG5hbWVzcGFjZSBpcywgLCAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaGFuZGxlciwgIiArIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhuYW1lc3BhY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhlYWRlcnMgcHJlc2VudCBpbiB0aGUgU09BUCBtZXNzYWdlLiBTdGFydGluZyB0byBwcm9jZXNzIC4uLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL05lZWQgdG8gc2V0IHRoZXNlIHByb3BlcnRpZXMgaGVyZSwgYmVmb3JlIHdlIGV4dHJhY3QgdGhlIFdTLUFkZHJlc3NpbmcKLSAgICAgICAgICAgIC8vaW5mb3JtYXRpb24sIGluIGNhc2Ugd2UgdGhyb3cgYSBmYXVsdC4KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUywgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb24obXNnQ29udGV4dCwgaXRlcmF0b3IsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciByZWZlcmVuY2UgcGFyYW1ldGVycwotICAgICAgICAgICAgaWYgKCFkaXNhYmxlUmVmcGFyYW1FeHRyYWN0KSB7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdFRvRXByUmVmZXJlbmNlUGFyYW1ldGVycyhtc2dDb250ZXh0LmdldFRvKCksIGhlYWRlciwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9XZSBzaG91bGQgb25seSBnZXQgdG8gdGhpcyBwb2ludCBpZiB3ZSBoYXZlbid0IHRocm93biBhIGZhdWx0LgotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShJU19BRERSX0lORk9fQUxSRUFEWV9QUk9DRVNTRUQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gaGVhZGVycyBwcmVzZW50IGNvcnJlc3BvbmRpbmcgdG8gIiArIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1bGwgYWRkcmVzc2luZyBoZWFkZXJzIG91dCBmcm9tIHRoZSBTT0FQIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBoZWFkZXJzIGFuIEl0ZXJhdG9yIG92ZXIgdGhlIGFkZHJlc3NpbmcgaGVhZGVycyB0YXJnZXRlZCB0byBtZQotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UgdGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb24oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIEl0ZXJhdG9yIGhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3B0aW9ucyBtZXNzYWdlQ29udGV4dE9wdGlvbnMgPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGR1cGxpY2F0ZUhlYWRlck5hbWVzID0gbmV3IEFycmF5TGlzdCgxKTsgLy8gTm9ybWFsbHkgd2lsbCBub3QgYmUgdXNlZCBmb3IgbW9yZSB0aGFuIDEgaGVhZGVyCi0KLSAgICAgICAgQXJyYXlMaXN0IHJlbGF0ZXNUb0hlYWRlcnMgPSBudWxsOwotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgYWN0aW9uQmxvY2sgPSBudWxsLCB0b0Jsb2NrID0gbnVsbCwgbWVzc2FnZUlEQmxvY2sgPSBudWxsLCByZXBseVRvQmxvY2sgPQotICAgICAgICAgICAgICAgIG51bGwsIGZhdWx0VG9CbG9jayA9IG51bGwsIGZyb21CbG9jayA9IG51bGw7Ci0KLSAgICAgICAgLy8gUGVyIHRoZSBTT0FQIEJpbmRpbmcgc3BlYyAiaGVhZGVycyB3aXRoIGFuIGluY29ycmVjdCBjYXJkaW5hbGl0eSBNVVNUIE5PVCBiZSB1c2VkIiBTbyB0aGVzZSB2YXJpYWJsZXMKLSAgICAgICAgLy8gYXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBpbnZhbGlkIGNhcmRpbmFsaXR5IGhlYWRlcnMgc28gdGhleSBhcmUgbm90IGRlc2VyaWFsaXNlZC4KLSAgICAgICAgYm9vbGVhbltdIGlnbm9yZUhlYWRlcnMgPSBuZXcgYm9vbGVhbls3XTsKLSAgICAgICAgYm9vbGVhbltdIGNoZWNrZWRIZWFkZXJOYW1lcyA9IG5ldyBib29sZWFuWzddOwotCi0gICAgICAgIC8vIEZpcnN0IHBhc3MganVzdCBjaGVjayBmb3IgZHVwbGljYXRlcwotICAgICAgICB3aGlsZSAoaGVhZGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKWhlYWRlcnMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHNvYXBIZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChXU0FfQUNUSU9OLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uQmxvY2sgPSBzb2FwSGVhZGVyQmxvY2s7Ci0gICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGVIZWFkZXJzKFdTQV9BQ1RJT04sIEFDVElPTl9GTEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkSGVhZGVyTmFtZXMsIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NBX1RPLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdG9CbG9jayA9IHNvYXBIZWFkZXJCbG9jazsKLSAgICAgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZUhlYWRlcnMoV1NBX1RPLCBUT19GTEFHLCBjaGVja2VkSGVhZGVyTmFtZXMsIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NBX01FU1NBR0VfSUQuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlSURCbG9jayA9IHNvYXBIZWFkZXJCbG9jazsKLSAgICAgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZUhlYWRlcnMoV1NBX01FU1NBR0VfSUQsIE1FU1NBR0VJRF9GTEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkSGVhZGVyTmFtZXMsIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NBX1JFUExZX1RPLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHlUb0Jsb2NrID0gc29hcEhlYWRlckJsb2NrOwotICAgICAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlSGVhZGVycyhXU0FfUkVQTFlfVE8sIFJFUExZVE9fRkxBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEhlYWRlck5hbWVzLCBpZ25vcmVIZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVIZWFkZXJOYW1lcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFdTQV9GQVVMVF9UTy5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgICAgIGZhdWx0VG9CbG9jayA9IHNvYXBIZWFkZXJCbG9jazsKLSAgICAgICAgICAgICAgICBjaGVja0R1cGxpY2F0ZUhlYWRlcnMoV1NBX0ZBVUxUX1RPLCBGQVVMVE9fRkxBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEhlYWRlck5hbWVzLCBpZ25vcmVIZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVIZWFkZXJOYW1lcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFdTQV9GUk9NLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZnJvbUJsb2NrID0gc29hcEhlYWRlckJsb2NrOwotICAgICAgICAgICAgICAgIGNoZWNrRHVwbGljYXRlSGVhZGVycyhXU0FfRlJPTSwgRlJPTV9GTEFHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkSGVhZGVyTmFtZXMsIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUhlYWRlck5hbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoV1NBX1JFTEFURVNfVE8uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVsYXRlc1RvSGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGF0ZXNUb0hlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWxhdGVzVG9IZWFkZXJzLmFkZChzb2FwSGVhZGVyQmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdGlvbkJsb2NrICE9IG51bGwgJiYgIWlnbm9yZUhlYWRlcnNbQUNUSU9OX0ZMQUddKSB7Ci0gICAgICAgICAgICBleHRyYWN0QWN0aW9uSW5mb3JtYXRpb24oYWN0aW9uQmxvY2ssIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9CbG9jayAhPSBudWxsICYmICFpZ25vcmVIZWFkZXJzW1RPX0ZMQUddKSB7Ci0gICAgICAgICAgICBleHRyYWN0VG9FUFJJbmZvcm1hdGlvbih0b0Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWVzc2FnZUlEQmxvY2sgIT0gbnVsbCAmJiAhaWdub3JlSGVhZGVyc1tNRVNTQUdFSURfRkxBR10pIHsKLSAgICAgICAgICAgIGV4dHJhY3RNZXNzYWdlSURJbmZvcm1hdGlvbihtZXNzYWdlSURCbG9jaywgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWxhdGVzVG9IZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRlc1RvSGVhZGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGV4dHJhY3RSZWxhdGVzVG9JbmZvcm1hdGlvbigoU09BUEhlYWRlckJsb2NrKSByZWxhdGVzVG9IZWFkZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVwbHlUb0Jsb2NrICE9IG51bGwgJiYgIWlnbm9yZUhlYWRlcnNbUkVQTFlUT19GTEFHXSkgewotICAgICAgICAgICAgZXh0cmFjdFJlcGx5VG9FUFJJbmZvcm1hdGlvbihyZXBseVRvQmxvY2ssIG5hbWVzcGFjZSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmYXVsdFRvQmxvY2sgIT0gbnVsbCAmJiAhaWdub3JlSGVhZGVyc1tGQVVMVE9fRkxBR10pIHsKLSAgICAgICAgICAgIGV4dHJhY3RGYXVsdFRvRVBSSW5mb3JtYXRpb24oZmF1bHRUb0Jsb2NrLCBuYW1lc3BhY2UsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZnJvbUJsb2NrICE9IG51bGwgJiYgIWlnbm9yZUhlYWRlcnNbRlJPTV9GTEFHXSkgewotICAgICAgICAgICAgZXh0cmFjdEZyb21FUFJJbmZvcm1hdGlvbihmcm9tQmxvY2ssIG5hbWVzcGFjZSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSB2YWxpZCB3c2EgaGVhZGVycyBoYXZlIGJlZW4gcmVhZCwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBpbnZhbGlkIGNhcmRpbmFsaXR5Ci0gICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBmb3IgZXhhbXBsZSB0aGVyZSBhcmUgbXVsdGlwbGUgTWVzc2FnZUlEcyBhbmQgYSBGYXVsdFRvLCB0aGUgRmF1bHRUbyB3aWxsIGJlIHJlc3BlY3RlZC4KLSAgICAgICAgaWYgKCFkdXBsaWNhdGVIZWFkZXJOYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIFNpbXBseSBjaG9vc2UgdGhlIGZpcnN0IHByb2JsZW0gaGVhZGVyIHdlIGNhbWUgYWNyb3NzIGFzIHdlIGNhbiBvbmx5IGZhdWx0IGZvciBvbmUgb2YgdGhlbS4KLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0KG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZHVwbGljYXRlSGVhZGVyTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIG1hZGF0b3J5IGFkZHJlc3NpbmcgaGVhZGVycwotICAgICAgICBjaGVja0Zvck1hbmRhdG9yeUhlYWRlcnMoY2hlY2tlZEhlYWRlck5hbWVzLCBtZXNzYWdlQ29udGV4dCwgbmFtZXNwYWNlKTsKLQotICAgICAgICAvLyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvciBoZWFkZXJzIHRoYXQgaGF2ZSBub3QgYmVlbiBmb3VuZC4KLSAgICAgICAgc2V0RGVmYXVsdHMoY2hlY2tlZEhlYWRlck5hbWVzLCBtZXNzYWdlQ29udGV4dCwgbmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JNYW5kYXRvcnlIZWFkZXJzKGJvb2xlYW5bXSBhbHJlYWR5Rm91bmRBZGRySGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChGaW5hbC5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAvL1VuYWJsZSB0byB2YWxpZGF0ZSB0aGUgd3NhOk1lc3NhZ2VJRCBoZWFkZXIgaGVyZSBhcyB3ZSBkbyBub3QgeWV0IGtub3cgd2hpY2ggTUVQCi0gICAgICAgICAgICAvL2lzIGluIGVmZmVjdC4KLSAgICAgICAgICAgIC8vIEBzZWUgQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyI2NoZWNrTWVzc2FnZUlESGVhZGVyCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kQWRkckhlYWRlcltBQ1RJT05fRkxBR10pIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobWVzc2FnZUNvbnRleHQsIFdTQV9BQ1RJT04pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCFhbHJlYWR5Rm91bmRBZGRySGVhZGVyW1RPX0ZMQUddKSB7Ci0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyTWVzc2FnZUFkZHJlc3NpbmdSZXF1aXJlZEZhdWx0KG1lc3NhZ2VDb250ZXh0LCBXU0FfVE8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWFscmVhZHlGb3VuZEFkZHJIZWFkZXJbQUNUSU9OX0ZMQUddKSB7Ci0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobWVzc2FnZUNvbnRleHQsIFdTQV9BQ1RJT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYWxyZWFkeUZvdW5kQWRkckhlYWRlcltSRVBMWVRPX0ZMQUddIHx8Ci0gICAgICAgICAgICAgICAgICAgIGFscmVhZHlGb3VuZEFkZHJIZWFkZXJbRkFVTFRPX0ZMQUddKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlGb3VuZEFkZHJIZWFkZXJbTUVTU0FHRUlEX0ZMQUddKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgV1NBX01FU1NBR0VfSUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0cyhib29sZWFuW10gYWxyZWFkeUZvdW5kQWRkckhlYWRlciwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgaWYgKEZpbmFsLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIC8vQWNjb3JkaW5nIHRvIHRoZSBXUy1BZGRyZXNzaW5nIHNwZWMsIHdlIHNob3VsZCBkZWZhdWx0IHRoZSB3c2E6VG8gaGVhZGVyIHRvIHRoZQotICAgICAgICAgICAgLy9hbm9ueW1vdXMgVVJJLiBEb2luZyB0aGF0LCBob3dldmVyLCBtaWdodCBwcmV2ZW50IGEgZGlmZmVyZW50IHZhbHVlIGZyb20gYmVpbmcKLSAgICAgICAgICAgIC8vdXNlZCBpbnN0ZWFkLCBzdWNoIGFzIHRoZSB0cmFuc3BvcnQgVVJMLiBUaGVyZWZvcmUsIHdlIG9ubHkgYXBwbHkgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIC8vb24gdGhlIGluYm91bmQgcmVzcG9uc2Ugc2lkZSBvZiBhIHN5bmNocm9ub3VzIHJlcXVlc3QtcmVzcG9uc2UgZXhjaGFuZ2UuCi0gICAgICAgICAgICBpZiAoIWFscmVhZHlGb3VuZEFkZHJIZWFkZXJbVE9fRkxBR10gJiYgIW1lc3NhZ2VDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAiIHNldERlZmF1bHRzOiBTZXR0aW5nIFdTLUFkZHJlc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIFRvIHByb3BlcnR5LiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoRmluYWwuV1NBX0FOT05ZTU9VU19VUkwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFhbHJlYWR5Rm91bmRBZGRySGVhZGVyW1JFUExZVE9fRkxBR10pIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShGaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBzZXREZWZhdWx0czogU2V0dGluZyBXUy1BZGRyZXNzaW5nIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBSZXBseVRvIHByb3BlcnR5LiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vVGhlIG5vbmUgVVJJIGlzIG5vdCBkZWZpbmVkIGluIHRoZSAyMDA0LzA4IHNwZWMsIGJ1dCBpdCBpcyB1c2VkIGhlcmUgYW55d2F5Ci0gICAgICAgICAgICAvL2FzIGEgZmxhZyB0byBpbmRpY2F0ZSB0aGUgY29ycmVjdCBzZW1hbnRpY3MgdG8gYXBwbHksIGkuZS4gaW4gdGhlIDIwMDQvMDggc3BlYwotICAgICAgICAgICAgLy90aGUgYWJzZW5jZSBvZiBhIFJlcGx5VG8gaGVhZGVyIGluZGljYXRlcyB0aGF0IGEgcmVzcG9uc2UgaXMgTk9UIHJlcXVpcmVkLgotICAgICAgICAgICAgaWYgKCFhbHJlYWR5Rm91bmRBZGRySGVhZGVyW1JFUExZVE9fRkxBR10pIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShGaW5hbC5XU0FfTk9ORV9VUkkpKTsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldERlZmF1bHRzOiBTZXR0aW5nIFdTLUFkZHJlc3NpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIFJlcGx5VG8gcHJvcGVydHkuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRHVwbGljYXRlSGVhZGVycyhTdHJpbmcgYWRkcmVzc2luZ0hlYWRlck5hbWUsIGludCBoZWFkZXJGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbltdIGNoZWNrZWRIZWFkZXJOYW1lcywgYm9vbGVhbltdIGlnbm9yZUhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgZHVwbGljYXRlSGVhZGVyTmFtZXMpIHsvL3Rocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBJZiB0aGUgaGVhZGVyIG5hbWUgaGFzIGJlZW4gc2VlbiBiZWZvcmUgdGhlbiB3ZSBzaG91bGQgcmV0dXJuIHRydWUgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAvLyBvZiBkdXBsaWNhdGUgaGVhZGVyIG5hbWVzLiBPdGhlcndpc2UgaXQgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgc2VlbiB0aGUgaGVhZGVyIHNvIGFkZCBpdAotICAgICAgICAvLyB0byB0aGUgY2hlY2tlZCBsaWF0IGFuZCByZXR1cm4gZmFsc2UuCi0gICAgICAgIGlnbm9yZUhlYWRlcnNbaGVhZGVyRmxhZ10gPSBjaGVja2VkSGVhZGVyTmFtZXNbaGVhZGVyRmxhZ107Ci0gICAgICAgIGlmIChpZ25vcmVIZWFkZXJzW2hlYWRlckZsYWddKSB7Ci0gICAgICAgICAgICBkdXBsaWNhdGVIZWFkZXJOYW1lcy5hZGQoYWRkcmVzc2luZ0hlYWRlck5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hlY2tlZEhlYWRlck5hbWVzW2hlYWRlckZsYWddID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImNoZWNrRHVwbGljYXRlSGVhZGVyczogYWRkcmVzc2luZ0hlYWRlck5hbWU9IiArIGFkZHJlc3NpbmdIZWFkZXJOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgKyAiIGlzRHVwbGljYXRlPSIgKyBpZ25vcmVIZWFkZXJzW2hlYWRlckZsYWddKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0UmVsYXRlc1RvSW5mb3JtYXRpb24oU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgbWVzc2FnZUNvbnRleHRPcHRpb25zKSB7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzID0gc29hcEhlYWRlckJsb2NrLmdldFRleHQoKTsKLQotICAgICAgICAvLyBFeHRyYWN0IHRoZSBSZWxhdGlvbnNoaXBUeXBlIGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMKLSAgICAgICAgT01BdHRyaWJ1dGUgcmVsYXRpb25zaGlwVHlwZSA9Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckJsb2NrLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9SRUxBVEVTX1RPX1JFTEFUSU9OU0hJUF9UWVBFKSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGVTdHJpbmcgPQotICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGUgPT0gbnVsbCA/IG51bGwgOiByZWxhdGlvbnNoaXBUeXBlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdFJlbGF0ZXNUb0luZm9ybWF0aW9uOiBFeHRyYWN0ZWQgUmVsYXRpb25zaGlwLiBWYWx1ZT0iICsgYWRkcmVzcyArCi0gICAgICAgICAgICAgICAgICAgICAgIiBSZWxhdGlvbnNoaXBUeXBlPSIgKyByZWxhdGlvbnNoaXBUeXBlU3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlbGF0ZXNUbyByZWxhdGVzVG8gPSBuZXcgUmVsYXRlc1RvKGFkZHJlc3MsIHJlbGF0aW9uc2hpcFR5cGVTdHJpbmcpOwotCi0gICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gZXh0cmFjdEF0dHJpYnV0ZXNGcm9tU09BUEhlYWRlckJsb2NrKHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgIHJlbGF0ZXNUby5zZXRFeHRlbnNpYmlsaXR5QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMuYWRkUmVsYXRlc1RvKHJlbGF0ZXNUbyk7Ci0KLSAgICAgICAgLy8gQ29tcGxldGVkIHByb2Nlc3Npbmcgb2YgdGhpcyBoZWFkZXIKLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0RmF1bHRUb0VQUkluZm9ybWF0aW9uKFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcHRpb25zIG1lc3NhZ2VDb250ZXh0T3B0aW9ucyA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldEZhdWx0VG8oKTsKLSAgICAgICAgaWYgKGVwciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldEZhdWx0VG8oZXByKTsKLSAgICAgICAgfQotICAgICAgICBleHRyYWN0RVBSSW5mb3JtYXRpb24oc29hcEhlYWRlckJsb2NrLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdEZhdWx0VG9FUFJJbmZvcm1hdGlvbjogRXh0cmFjdGVkIEZhdWx0VG8gRVBSOiAiICsgZXByKTsKLSAgICAgICAgfQotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RSZXBseVRvRVBSSW5mb3JtYXRpb24oU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9wdGlvbnMgbWVzc2FnZUNvbnRleHRPcHRpb25zID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0UmVwbHlUbygpOwotICAgICAgICBpZiAoZXByID09IG51bGwpIHsKLSAgICAgICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dE9wdGlvbnMuc2V0UmVwbHlUbyhlcHIpOwotICAgICAgICB9Ci0gICAgICAgIGV4dHJhY3RFUFJJbmZvcm1hdGlvbihzb2FwSGVhZGVyQmxvY2ssIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJleHRyYWN0UmVwbHlUb0VQUkluZm9ybWF0aW9uOiBFeHRyYWN0ZWQgUmVwbHlUbyBFUFI6ICIgKyBlcHIpOwotICAgICAgICB9Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEZyb21FUFJJbmZvcm1hdGlvbihTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3B0aW9ucyBtZXNzYWdlQ29udGV4dE9wdGlvbnMgPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCk7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5nZXRGcm9tKCk7Ci0gICAgICAgIGlmIChlcHIgPT0gbnVsbCkgewotICAgICAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAiIik7ICAvLyBJIGRvbid0IGtub3cgdGhlIGFkZHJlc3Mgbm93LiBMZXQgbWUgcGFzcyB0aGUgZW1wdHkgc3RyaW5nIG5vdyBhbmQgZmlsbCB0aGlzCi0gICAgICAgICAgICAvLyBvbmNlIEkgcHJvY2VzcyB0aGUgRWxlbWVudHMgdW5kZXIgdGhpcy4KLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5zZXRGcm9tKGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgZXh0cmFjdEVQUkluZm9ybWF0aW9uKHNvYXBIZWFkZXJCbG9jaywgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImV4dHJhY3RGcm9tRVBSSW5mb3JtYXRpb246IEV4dHJhY3RlZCBGcm9tIEVQUjogIiArIGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0VG9FUFJJbmZvcm1hdGlvbihTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG1lc3NhZ2VDb250ZXh0T3B0aW9ucywgU3RyaW5nIG5hbWVzcGFjZSkgewotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwcjsKLSAgICAgICAgLy9oZXJlIHRoZSBhZGRyZXNzaW5nIGVwciBvdmVyaWRkZSB3aGF0IGV2ZXIgYWxyZWFkeSB0aGVyZSBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZShzb2FwSGVhZGVyQmxvY2suZ2V0VGV4dCgpKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldFRvKGVwcik7Ci0KLSAgICAgICAgLy8gY2hlY2sgZm9yIGFkZHJlc3MgYXR0cmlidXRlcwotICAgICAgICBJdGVyYXRvciBhZGRyZXNzQXR0cmlidXRlcyA9IHNvYXBIZWFkZXJCbG9jay5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhZGRyZXNzQXR0cmlidXRlcyAhPSBudWxsICYmIGFkZHJlc3NBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB3aGlsZSAoYWRkcmVzc0F0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0ciA9IChPTUF0dHJpYnV0ZSkgYWRkcmVzc0F0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGF0dHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXByLnNldEFkZHJlc3NBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImV4dHJhY3RUb0VQUkluZm9ybWF0aW9uOiBFeHRyYWN0ZWQgVG8gRVBSOiAiICsgZXByKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0VG9FcHJSZWZlcmVuY2VQYXJhbWV0ZXJzKEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSLCBTT0FQSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgaWYgKEZpbmFsLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGhlYWRlci5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBoZWFkZXJFbGVtZW50ID0gKE9NRWxlbWVudCloZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGlzUmVmUGFyYW1BdHRyID0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKG5hbWVzcGFjZSwgIklzUmVmZXJlbmNlUGFyYW1ldGVyIikpOwotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdFRvRXByUmVmZXJlbmNlUGFyYW1ldGVyczogQ2hlY2tpbmcgaGVhZGVyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXNSZWZQYXJhbUF0dHIgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGlzUmVmUGFyYW1BdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvRVBSLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihoZWFkZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiZXh0cmFjdFRvRXByUmVmZXJlbmNlUGFyYW1ldGVyczogSGVhZGVyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRWxlbWVudC5nZXRRTmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaGFzIElzUmVmZXJlbmNlUGFyYW1ldGVyIGF0dHJpYnV0ZS4gQWRkaW5nIHRvIHRvRVBSLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gZXhhY3Qgd2F5IHRvIGlkZW50aWZ5IHJlZiBwYXJhbWV0ZXJzIGZvciBTdWJtaXNzaW9uIHZlcnNpb24uIFNvIGxldCdzIGhhdmUgYSBoYW5kbGVyCi0gICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBmbG93LCB3aGljaCBwdXRzIGFsbCB0aGUgaGFuZGxlcnMgKHdoaWNoIGFyZSBvZiBjb3Vyc2UgbXVzdFVuZGVyc3RhbmQ9ZmFsc2UpCi0gICAgICAgICAgICAvLyBhcyByZWZlcmVuY2UgcGFyYW1ldGVycwotCi0gICAgICAgICAgICAvLyBUT0RPIDogQ2hpbnRoYWthCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1dlIGFzc3VtZSB0aGF0IGFueSBhY3Rpb24gdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWVzc2FnZSBjb250ZXh0IG11c3QgYmUgdGhlCi0gICAgLy9zb2FwYWN0aW9uLiBXZSBjb21wYXJlIHRoYXQgYWN0aW9uIHRvIHRoZSBXUy1BZGRyZXNzaW5nIGFjdGlvbiwgYW5kIGlmIHRoZXkgYXJlCi0gICAgLy9kaWZmZXJlbnQgd2UgdGhyb3cgYSBmYXVsdC4KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEFjdGlvbkluZm9ybWF0aW9uKFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcHRpb25zIG1lc3NhZ2VDb250ZXh0T3B0aW9ucyA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKTsKLSAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIFN0cmluZyB3c2FBY3Rpb24gPSBzb2FwSGVhZGVyQmxvY2suZ2V0VGV4dCgpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImV4dHJhY3RBY3Rpb25JbmZvcm1hdGlvbjogc29hcEFjdGlvbj0nIiArIHNvYXBBY3Rpb24gKyAiJyB3c2E6QWN0aW9uPSciICsKLSAgICAgICAgICAgICAgICAgICAgICB3c2FBY3Rpb24gKyAiJyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTmVlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSB3c2E6QWN0aW9uIGhlYWRlciBpcyBub3QgbnVsbCBvciB3aGl0ZXNwYWNlCi0gICAgICAgIGlmICgod3NhQWN0aW9uID09IG51bGwpIHx8ICIiLmVxdWFscyh3c2FBY3Rpb24udHJpbSgpKSkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyQWN0aW9uTm90U3VwcG9ydGVkRmF1bHQobWVzc2FnZUNvbnRleHQsIHdzYUFjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgaXNTZXJ2ZXJTaWRlIGNoZWNrIGlzIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgT3B0aW9ucyBvYmplY3QgaXMKLSAgICAgICAgLy8gc2hhcmVkIGJldHdlZW4gcmVxdWVzdCBhbmQgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHRzIGZvciBTeW5jCi0gICAgICAgIC8vIGludm9jYXRpb25zLiBJZiB0aGUgc29hcEFjdGlvbiBpcyBzZXQgb3V0Ym91bmQgYW5kIGEgd3NhOkFjdGlvbiBpcwotICAgICAgICAvLyByZWNlaXZlZCBvbiB0aGUgcmVzcG9uc2UgdGhleSB3aWxsIGRpZmZlciAoYmVjYXVzZSB0aGVyZSBpcyBubwotICAgICAgICAvLyBTT0FQQWN0aW9uIGhlYWRlciBvbiBhbiBIVFRQIHJlc3BvbnNlKS4gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCBub3QKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBzb2FwQWN0aW9uPT13c2E6QWN0aW9uCi0gICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgISIiLmVxdWFscyhzb2FwQWN0aW9uKSAmJiBtZXNzYWdlQ29udGV4dC5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgaWYgKCFzb2FwQWN0aW9uLmVxdWFscyh3c2FBY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyQWN0aW9uTWlzbWF0Y2hGYXVsdChtZXNzYWdlQ29udGV4dCwgc29hcEFjdGlvbiwgd3NhQWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5zZXRBY3Rpb24od3NhQWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gZXh0cmFjdEF0dHJpYnV0ZXNGcm9tU09BUEhlYWRlckJsb2NrKHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuQUNUSU9OX0FUVFJJQlVURVMsIGF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgc29hcEhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0TWVzc2FnZUlESW5mb3JtYXRpb24oU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpLnNldE1lc3NhZ2VJZChzb2FwSGVhZGVyQmxvY2suZ2V0VGV4dCgpKTsKLQotICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IGV4dHJhY3RBdHRyaWJ1dGVzRnJvbVNPQVBIZWFkZXJCbG9jayhzb2FwSGVhZGVyQmxvY2spOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLk1FU1NBR0VJRF9BVFRSSUJVVEVTLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiB0aGUgc29hcCBoZWFkZXIgYmxvY2ssIHRoaXMgc2hvdWxkIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIHdpdGhpbiBFUFIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyQmxvY2sgICAgICAgICBhIFNPQVAgaGVhZGVyIHdoaWNoIGlzIG9mIHR5cGUgRW5kcG9pbnRSZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gZXByICAgICAgICAgICAgICAgICB0aGUgRW5kcG9pbnRSZWZlcmVuY2UgdG8gZmlsbCBpbiB3aXRoIHRoZSBleHRyYWN0ZWQgZGF0YQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBXU0EgbmFtZXNwYWNlIFVSSQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCAgICAgIHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEVQUkluZm9ybWF0aW9uKFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaywgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShlcHIsIGhlYWRlckJsb2NrKTsgICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYWN0RVBSSW5mb3JtYXRpb246IEV4Y2VwdGlvbiBvY2N1cnJlZCBkZXNlcmlhbGlzaW5nIGFuIEVuZHBvaW50UmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyTWlzc2luZ0FkZHJlc3NJbkVQUkZhdWx0KG1lc3NhZ2VDb250ZXh0LCBoZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vQ2hlY2sgdGhhdCB0aGUgRVBSIGhhcyB0aGUgY29ycmVjdCBuYW1lc3BhY2UuCi0gICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdEVQUkluZm9ybWF0aW9uOiBBZGRyZXNzaW5nIG5hbWVzcGFjZSA9ICIgKyBhZGRyZXNzaW5nTmFtZXNwYWNlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIEVQUiBuYW1lc3BhY2UgPSAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJJbnZhbGlkRVBSRmF1bHQobWVzc2FnZUNvbnRleHQsIGhlYWRlckJsb2NrLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4dHJhY3RBdHRyaWJ1dGVzRnJvbVNPQVBIZWFkZXJCbG9jayhTT0FQSGVhZGVyQmxvY2sgc29hcEhlYWRlckJsb2NrKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGFjdGlvbkF0dHJpYnV0ZXMgPSBzb2FwSGVhZGVyQmxvY2suZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICBpZiAoYWN0aW9uQXR0cmlidXRlcyAhPSBudWxsICYmIGFjdGlvbkF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHdoaWxlIChhY3Rpb25BdHRyaWJ1dGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHIgPSAoT01BdHRyaWJ1dGUpIGFjdGlvbkF0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGF0dHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdPdXRIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ091dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwZmU5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ091dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQXR0cmlidXRlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5FbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLmkxOG4uQWRkcmVzc2luZ01lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0VuZHBvaW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ091dEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBBZGRyZXNzaW5nQ29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nT3V0SGFuZGxlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsSGVhZGVyczsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzYWJsZUFkZHJlc3Npbmc7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KEhhbmRsZXJEZXNjcmlwdGlvbiBhcmcwKSB7Ci0gICAgICAgIHN1cGVyLmluaXQoYXJnMCk7Ci0KLSAgICAgICAgLy9EZXRlcm1pbmUgd2hldGhlciB0byBpbmNsdWRlIG9wdGlvbmFsIGFkZHJlc3NpbmcgaGVhZGVycyBpbiB0aGUgb3V0cHV0IG1lc3NhZ2UuCi0gICAgICAgIC8vVGhlIGRlZmF1bHQgaXMgbm90IHRvIGluY2x1ZGUgYW55IGhlYWRlcnMgdGhhdCBjYW4gYmUgc2FmZWx5IG9taXR0ZWQuCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGFyZzAuZ2V0UGFyYW1ldGVyKElOQ0xVREVfT1BUSU9OQUxfSEVBREVSUyk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHBhcmFtKTsKLSAgICAgICAgaW5jbHVkZU9wdGlvbmFsSGVhZGVycyA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHZhbHVlKTsKLQotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJpbmNsdWRlT3B0aW9uYWxIZWFkZXJzPSIgKyBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vRGV0ZXJtaW5lIHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgaGFuZGxlciBieSBkZWZhdWx0LgotICAgICAgICBwYXJhbSA9IGFyZzAuZ2V0UGFyYW1ldGVyKERJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgdmFsdWUgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShwYXJhbSk7Ci0gICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkodmFsdWUpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImRpc2FibGVBZGRyZXNzaW5nPSIgKyBkaXNhYmxlQWRkcmVzc2luZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9kZXRlcm1pbmUgd2hldGhlciBvdXRib3VuZCBhZGRyZXNzaW5nIGhhcyBiZWVuIGRpc2FibGVkIG9yIG5vdC4KLSAgICAgICAgYm9vbGVhbiBkaXNhYmxlQWRkcmVzc2luZyA9Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKERJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLCB0aGlzLmRpc2FibGVBZGRyZXNzaW5nKTsKLQotICAgICAgICBpZiAoZGlzYWJsZUFkZHJlc3NpbmcpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIEFkZHJlc3NpbmcgaXMgZGlzYWJsZWQuIE5vdCBhZGRpbmcgV1MtQWRkcmVzc2luZyBoZWFkZXJzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgYWRkcmVzc2luIG5hbWVzcGFjZSBpbiBlZmZlY3QuCi0gICAgICAgIE9iamVjdCBhZGRyZXNzaW5nVmVyc2lvbkZyb21DdXJyZW50TXNnQ3R4dCA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiQWRkcmVzc2luZyB2ZXJzaW9uIHN0cmluZyBmcm9tIG1lc3NhZ2VDb250ZXh0PSIgKwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nVmVyc2lvbkZyb21DdXJyZW50TXNnQ3R4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBpc1N1Ym1pc3Npb25OYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ1ZlcnNpb25Gcm9tQ3VycmVudE1zZ0N0eHQpOwotCi0gICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRvIGluY2x1ZGUgb3B0aW9uYWwgYWRkcmVzc2luZyBoZWFkZXJzIGluIHRoZSBvdXRwdXQuCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsSGVhZGVycyA9Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKElOQ0xVREVfT1BUSU9OQUxfSEVBREVSUywgdGhpcy5pbmNsdWRlT3B0aW9uYWxIZWFkZXJzKTsKLQotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJpbmNsdWRlT3B0aW9uYWxIZWFkZXJzPSIgKyBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERldGVybWluZSBpZiBhIE11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvIGFsbCBoZWFkZXJzIGluIHRoZQotICAgICAgICAvLyBhZGRyZXNzaW5nIG5hbWVzcGFjZS4KLSAgICAgICAgYm9vbGVhbiBhZGRNdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5pc1Byb3BlcnR5VHJ1ZShBRERfTVVTVF9VTkRFUlNUQU5EX1RPX0FERFJFU1NJTkdfSEVBREVSUyk7Ci0KLSAgICAgICAgLy8gd2hhdCBpZiB0aGVyZSBhcmUgYWRkcmVzc2luZyBoZWFkZXJzIGFscmVhZHkgaW4gdGhlIG1lc3NhZ2UuIERvIHlvdSByZXBsYWNlIHRoYXQgb3Igbm90PwotICAgICAgICAvLyBMZXRzIGhhdmUgYSBwYXJhbWV0ZXIgdG8gY29udHJvbCB0aGF0LiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB5b3Ugd29uJ3QgcmVwbGFjZSBhZGRyZXNzaW5nCi0gICAgICAgIC8vIGhlYWRlcnMgaWYgdGhlcmUgYXJlIGFueSAodGhpcyB3YXMgdGhlIGNhc2Ugc28gZmFyKS4KLSAgICAgICAgYm9vbGVhbiByZXBsYWNlSGVhZGVycyA9IG1zZ0NvbnRleHQuaXNQcm9wZXJ0eVRydWUoUkVQTEFDRV9BRERSRVNTSU5HX0hFQURFUlMpOwotICAgICAgICAKLSAgICAgICAgLy8gQWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcm9sZSB0aGVzZSBXUy1BZGRyZXNzaW5nIGhlYWRlcnMgc2hvdWxkIGJlIHRhcmdldHRlZCBhdC4KLSAgICAgICAgU3RyaW5nIHJvbGUgPSAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KFNPQVBfUk9MRV9GT1JfQUREUkVTU0lOR19IRUFERVJTKTsKLQotICAgICAgICBXU0FIZWFkZXJXcml0ZXIgd3JpdGVyID0gbmV3IFdTQUhlYWRlcldyaXRlcihtc2dDb250ZXh0LCBpc1N1Ym1pc3Npb25OYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE11c3RVbmRlcnN0YW5kQXR0cmlidXRlLCByZXBsYWNlSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZU9wdGlvbmFsSGVhZGVycywgcm9sZSk7Ci0gICAgICAgIHdyaXRlci53cml0ZUhlYWRlcnMoKTsKLQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgV1NBSGVhZGVyV3JpdGVyIHsKLQotICAgICAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotICAgICAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBlbnZlbG9wZTsKLSAgICAgICAgcHJpdmF0ZSBTT0FQSGVhZGVyIGhlYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBTT0FQRmFjdG9yeSBmYWN0b3J5OwotICAgICAgICBwcml2YXRlIE9wdGlvbnMgbWVzc2FnZUNvbnRleHRPcHRpb25zOwotICAgICAgICBwcml2YXRlIE9NTmFtZXNwYWNlIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3Q7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2U7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3NpbmdSb2xlOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZE11c3RVbmRlcnN0YW5kQXR0cmlidXRlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVwbGFjZUhlYWRlcnM7ICAvLyBkZXRlcm1pbmVzIHdoZXRoZXIgd2UgcmVwbGFjZSB0aGUgZXhpc3RpbmcgaGVhZGVycyBvciBub3QsIGlmIHRoZXkgcHJlc2VudAotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsSGVhZGVyczsKLQotICAgICAgICBwcml2YXRlIEFycmF5TGlzdCBleGlzdGluZ1dTQUhlYWRlcnMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcHVibGljIFdTQUhlYWRlcldyaXRlcihNZXNzYWdlQ29udGV4dCBtYywgYm9vbGVhbiBpc1N1Ym1pc3Npb25OYW1lc3BhY2UsIGJvb2xlYW4gYWRkTVUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsYWNlLCBib29sZWFuIGluY2x1ZGVPcHRpb25hbCwgU3RyaW5nIHJvbGUpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0FIZWFkZXJXcml0ZXI6IGlzRmluYWw9IiArICFpc1N1Ym1pc3Npb25OYW1lc3BhY2UgKyAiIGFkZE1VPSIgKyBhZGRNVSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHJlcGxhY2U9IiArIHJlcGxhY2UgKyAiIGluY2x1ZGVPcHRpb25hbD0iICsgaW5jbHVkZU9wdGlvbmFsKyIgcm9sZT0iK3JvbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG1jOwotICAgICAgICAgICAgZW52ZWxvcGUgPSBtYy5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgZmFjdG9yeSA9IChTT0FQRmFjdG9yeSllbnZlbG9wZS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpOwotCi0gICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgaXNTdWJtaXNzaW9uTmFtZXNwYWNlID8gU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFIDogRmluYWwuV1NBX05BTUVTUEFDRTsKLQotICAgICAgICAgICAgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBzb2FwIGhlYWRlciBpbiB0aGUgZW52ZWxvcGUgYmVpbmcgcHJvY2Vzc2VkLCBhZGQgb25lLgotICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAJaGVhZGVyID0gZmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKGVudmVsb3BlKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgCUFycmF5TGlzdCBhZGRyZXNzaW5nSGVhZGVycyA9IGhlYWRlci5nZXRIZWFkZXJCbG9ja3NXaXRoTlNVUkkoYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICAJaWYoYWRkcmVzc2luZ0hlYWRlcnMhPW51bGwgJiYgIWFkZHJlc3NpbmdIZWFkZXJzLmlzRW1wdHkoKSl7Ci0gICAgICAgICAgICAJCWV4aXN0aW5nV1NBSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoYWRkcmVzc2luZ0hlYWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIAkJZm9yKEl0ZXJhdG9yIGl0ZXI9YWRkcmVzc2luZ0hlYWRlcnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgCQkJU09BUEhlYWRlckJsb2NrIG9lID0gKFNPQVBIZWFkZXJCbG9jaylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIAkJCWlmKGFkZHJlc3NpbmdSb2xlID09IG51bGwgfHwgYWRkcmVzc2luZ1JvbGUubGVuZ3RoKCkgPT0wIHx8IGFkZHJlc3NpbmdSb2xlLmVxdWFscyhvZS5nZXRSb2xlKCkpKXsKLSAgICAgICAgICAgIAkJCQlleGlzdGluZ1dTQUhlYWRlcnMuYWRkKG9lLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIAkJCX0KLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIAlpZihhZGRyZXNzaW5nSGVhZGVycyAhPSBudWxsICYmIGFkZHJlc3NpbmdIZWFkZXJzLnNpemUoKSA9PTApewotICAgICAgICAgICAgCQlhZGRyZXNzaW5nSGVhZGVycyA9IG51bGw7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSA9ICFpc1N1Ym1pc3Npb25OYW1lc3BhY2U7Ci0gICAgICAgICAgICBhZGRNdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZSA9IGFkZE1VOwotICAgICAgICAgICAgcmVwbGFjZUhlYWRlcnMgPSByZXBsYWNlOwotICAgICAgICAgICAgaW5jbHVkZU9wdGlvbmFsSGVhZGVycyA9IGluY2x1ZGVPcHRpb25hbDsKLSAgICAgICAgICAgIGFkZHJlc3NpbmdSb2xlID0gcm9sZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIWlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmIG1jLmdldFRvKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgICAJbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGVIZWFkZXJzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgICAgIC8vIGJ5IHRoaXMgdGltZSwgd2UgZGVmaW5pdGVseSBoYXZlIHNvbWUgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiB0byBiZSBzZW50LiBUaGlzIGlzIGJlY2F1c2UsCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIHRlc3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhpcyB3aGV0aGVyIG1lc3NhZ2VJbmZvcm1hdGlvbkhlYWRlcnMgYXJlIG51bGwgb3Igbm90LgotICAgICAgICAgICAgLy8gU28gcmF0aGVyIHRoYW4gZGVjbGFyaW5nIGFkZHJlc3NpbmcgbmFtZXNwYWNlIGluIGVhY2ggYW5kIGV2ZXJ5IGFkZHJlc3NpbmcgaGVhZGVyLCBsZXRzCi0gICAgICAgICAgICAvLyBkZWZpbmUgdGhhdCBpbiB0aGUgSGVhZGVyIGl0c2VsZi4KLSAgICAgICAgCWFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QgPSBoZWFkZXIuZGVjbGFyZU5hbWVzcGFjZShhZGRyZXNzaW5nTmFtZXNwYWNlLCBXU0FfREVGQVVMVF9QUkVGSVgpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIFdTQSBUbwotICAgICAgICAgICAgcHJvY2Vzc1RvRVBSKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgV1NBIHJlcGx5VG8KLSAgICAgICAgICAgIHByb2Nlc3NSZXBseVRvKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgV1NBIEZyb20KLSAgICAgICAgICAgIHByb2Nlc3NGcm9tRVBSKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgV1NBIEZhdWx0VG8KLSAgICAgICAgICAgIHByb2Nlc3NGYXVsdFRvRVBSKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgV1NBIE1lc3NhZ2VJRAotICAgICAgICAgICAgcHJvY2Vzc01lc3NhZ2VJRCgpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIFdTQSBBY3Rpb24KLSAgICAgICAgICAgIHByb2Nlc3NXU0FBY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBXU0EgUmVsYXRlc1RvCi0gICAgICAgICAgICBwcm9jZXNzUmVsYXRlc1RvKCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgZmF1bHQgaGVhZGVycywgaWYgcHJlc2VudAotICAgICAgICAgICAgcHJvY2Vzc0ZhdWx0c0luZm9JZlByZXNlbnQoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUsIGlmIHJlcXVpcmVkLgotICAgICAgICAgICAgcHJvY2Vzc011c3RVbmRlcnN0YW5kUHJvcGVydHkoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNZXNzYWdlSUQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldE1lc3NhZ2VJZCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0NoZWNrIHdoZXRoZXIgd2Ugd2FudCB0byBmb3JjZSBhIG1lc3NhZ2UgaWQgdG8gYmUgc2VudC4KLSAgICAgICAgICAgIGlmIChtZXNzYWdlSUQgPT0gbnVsbCAmJiBpbmNsdWRlT3B0aW9uYWxIZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUlEID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHRPcHRpb25zLnNldE1lc3NhZ2VJZChtZXNzYWdlSUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWVzc2FnZUlEICE9IG51bGwgJiYgIWlzQWRkcmVzc2luZ0hlYWRlckFscmVhZHlBdmFpbGFibGUoV1NBX01FU1NBR0VfSUQsIGZhbHNlKSkKLSAgICAgICAgICAgIHsvL29wdGlvbmFsCi0gICAgICAgICAgICAJQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSAoQXJyYXlMaXN0KW1lc3NhZ2VDb250ZXh0LmdldExvY2FsUHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLk1FU1NBR0VJRF9BVFRSSUJVVEVTKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVTT0FQSGVhZGVyQmxvY2sobWVzc2FnZUlELCBXU0FfTUVTU0FHRV9JRCwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1dTQUFjdGlvbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5nZXRBY3Rpb24oKTsKLQotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHByb2Nlc3NXU0FBY3Rpb246IGFjdGlvbiBmcm9tIG1lc3NhZ2VDb250ZXh0OiAiICsgYWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCB8fCBhY3Rpb24ubGVuZ3RoKCk9PTApIHsKLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE91dHB1dEFjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZihhY3Rpb24hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAJLy8gU2V0IHRoaXMgYWN0aW9uIGJhY2sgdG8gb2J2aWF0ZSBwb3NzaWJsZSBhY3Rpb24gbWlzbWF0Y2ggcHJvYmxlbXMKLSAgICAgICAgICAgICAgICAgICAgCW1lc3NhZ2VDb250ZXh0LnNldFdTQUFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvY2Vzc1dTQUFjdGlvbjogYWN0aW9uIGZyb20gQXhpc09wZXJhdGlvbjogIiArIGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZXsKLQkgICAgICAgICAgICAvLyBVc2UgdGhlIGNvcnJlY3QgZmF1bHQgYWN0aW9uIGZvciB0aGUgc2VsZWN0ZWQgbmFtZXNwYWNlCi0JICAgICAgICAgICAgaWYoaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UpewotCSAgICAgICAgICAgIAlpZihTdWJtaXNzaW9uLldTQV9GQVVMVF9BQ1RJT04uZXF1YWxzKGFjdGlvbikpewotCSAgICAgICAgICAgIAkJYWN0aW9uID0gRmluYWwuV1NBX0ZBVUxUX0FDVElPTjsKLQkgICAgICAgICAgICAJCW1lc3NhZ2VDb250ZXh0T3B0aW9ucy5zZXRBY3Rpb24oYWN0aW9uKTsKLQkgICAgICAgICAgICAJfQotCSAgICAgICAgICAgIH1lbHNlewotCSAgICAgICAgICAgIAlpZihGaW5hbC5XU0FfRkFVTFRfQUNUSU9OLmVxdWFscyhhY3Rpb24pKXsKLQkgICAgICAgICAgICAJCWFjdGlvbiA9IFN1Ym1pc3Npb24uV1NBX0ZBVUxUX0FDVElPTjsKLQkgICAgICAgICAgICAJCW1lc3NhZ2VDb250ZXh0T3B0aW9ucy5zZXRBY3Rpb24oYWN0aW9uKTsKLQkgICAgICAgICAgICAJfWVsc2UgaWYoRmluYWwuV1NBX1NPQVBfRkFVTFRfQUNUSU9OLmVxdWFscyhhY3Rpb24pKXsKLQkgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFN1Ym1pc3Npb24uV1NBX0ZBVUxUX0FDVElPTjsKLQkgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0T3B0aW9ucy5zZXRBY3Rpb24oYWN0aW9uKTsKLQkgICAgICAgICAgICAJfQotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UgbmVlZCB0byBhZGQgYSB3c2E6QWN0aW9uIGhlYWRlcgotICAgICAgICAgICAgaWYgKCFpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKFdTQV9BQ1RJT04sIGZhbHNlKSkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHByb2Nlc3NXU0FBY3Rpb246IE5vIGV4aXN0aW5nIHdzYTpBY3Rpb24gaGVhZGVyIGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gYWN0aW9uIHRvIGFkZCwKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgfHwgYWN0aW9uLmxlbmd0aCgpPT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvY2Vzc1dTQUFjdGlvbjogTm8gYWN0aW9uIHRvIGFkZCB0byBoZWFkZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBGYXVsdCB1bmxlc3MgdmFsaWRhdGlvbiBoYXMgYmVlbiBleHBsaWN0aWx5IHR1cm5lZCBvZmYKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlQ29udGV4dC5pc1Byb3BlcnR5VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfT1VUQk9VTkRfQUREUkVTU0lOR19WQUxJREFUSU9OKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3V0Ym91bmROb0FjdGlvbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJvY2Vzc1dTQUFjdGlvbjogQWRkaW5nIGFjdGlvbiB0byBoZWFkZXI6ICIgKyBhY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBqdXN0IGFkZCB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gKEFycmF5TGlzdCltZXNzYWdlQ29udGV4dC5nZXRMb2NhbFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuQUNUSU9OX0FUVFJJQlVURVMpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVTT0FQSGVhZGVyQmxvY2soYWN0aW9uLCBXU0FfQUNUSU9OLCBhdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZhdWx0c0luZm9JZlByZXNlbnQoKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZGV0YWlsRWxlbWVudCA9IEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldERldGFpbEVsZW1lbnRGb3JBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QpOwotICAgICAgICAgICAgaWYgKGRldGFpbEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBTT0FQIDEuMSBhbmQgU09BUCAxLjIgZmF1bHQgbWVzc2FnZXMgaXMgZXhwbGFpbmVkIGluIHRoZSBXUy1BZGRyZXNzaW5nIFNwZWNzLgotICAgICAgICAgICAgICAgIGlmIChpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSAmJiBtZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBkZXRhaWwgYXMgYSB3c2E6RmF1bHREZXRhaWwgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgIGlmICghaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZShGaW5hbC5GQVVMVF9IRUFERVJfREVUQUlMLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBmYXVsdERldGFpbCA9IGhlYWRlci5hZGRIZWFkZXJCbG9jaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSEVBREVSX0RFVEFJTCwgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdERldGFpbC5hZGRDaGlsZChFbGVtZW50SGVscGVyLmltcG9ydE9NRWxlbWVudChkZXRhaWxFbGVtZW50LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBkZXRhaWwgdG8gdGhlIEZhdWx0IGluIHRoZSBTT0FQIEJvZHkKLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gZW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXVsdCAhPSBudWxsICYmIGZhdWx0LmdldERldGFpbCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0LmdldERldGFpbCgpLmFkZERldGFpbEVudHJ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50SGVscGVyLmltcG9ydE9NRWxlbWVudChkZXRhaWxFbGVtZW50LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlbGF0ZXNUbygpIHsKLSAgICAgICAgICAgIGlmICghaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZShXU0FfUkVMQVRFU19UTywgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICBSZWxhdGVzVG9bXSByZWxhdGVzVG8gPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0UmVsYXRpb25zaGlwcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbGF0ZXNUbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSByZWxhdGVzVG8ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZWxhdGVzVG9IZWFkZXIgPSBjcmVhdGVTT0FQSGVhZGVyQmxvY2socmVsYXRlc1RvW2ldLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAJCVdTQV9SRUxBVEVTX1RPLCByZWxhdGVzVG9baV0uZ2V0RXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0ZXNUb1tpXS5nZXRSZWxhdGlvbnNoaXBUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsYXRlc1RvSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlpZighaW5jbHVkZU9wdGlvbmFsSGVhZGVycyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCWlmIChGaW5hbC5XU0FfREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRS5lcXVhbHMocmVsYXRpb25zaGlwVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXNzaW9uLldTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHJlbGF0aW9uc2hpcFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCQlyZWxhdGlvbnNoaXBUeXBlID0gbnVsbDsgLy9PbWl0IHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVsYXRpb25zaGlwVHlwZSAhPSBudWxsKXsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlc1RvSGVhZGVyLmFkZEF0dHJpYnV0ZShXU0FfUkVMQVRFU19UT19SRUxBVElPTlNISVBfVFlQRSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmF1bHRUb0VQUigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldEZhdWx0VG8oKTsKLSAgICAgICAgICAgIFN0cmluZyBoZWFkZXJOYW1lID0gQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRkFVTFRfVE87Ci0KLSAgICAgICAgICAgIC8vT21pdCB0aGUgaGVhZGVyIGlmIHRoZSBlcHIgaXMgbnVsbC4KLSAgICAgICAgICAgIGlmIChlcHIgIT0gbnVsbCAmJiAhaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZShoZWFkZXJOYW1lLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBhZGRUb1NPQVBIZWFkZXIoZXByLCBoZWFkZXJOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRnJvbUVQUigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldEZyb20oKTsKLSAgICAgICAgICAgIFN0cmluZyBoZWFkZXJOYW1lID0gQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRlJPTTsKLQotICAgICAgICAgICAgLy9PbWl0IHRoZSBoZWFkZXIgaWYgdGhlIGVwciBpcyBudWxsLgotICAgICAgICAgICAgaWYgKGVwciAhPSBudWxsICYmICFpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKGhlYWRlck5hbWUsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgIGFkZFRvU09BUEhlYWRlcihlcHIsIGhlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXBseVRvKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBtZXNzYWdlQ29udGV4dE9wdGlvbnMuZ2V0UmVwbHlUbygpOwotICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9SRVBMWV9UTzsKLQotICAgICAgICAgICAgLy9Eb24ndCBjaGVjayBlcHIgZm9yIG51bGwgaGVyZSBhcyBhZGRUb1NPQVBIZWFkZXIoKSB3aWxsIHByb3ZpZGUgYW4gYXBwcm9wcmlhdGUgZGVmYXVsdC4KLSAgICAgICAgICAgIC8vVGhpcyBkZWZhdWx0IGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvciBjbGllbnQgc2lkZSBvdXRib3VuZCBwcm9jZXNzaW5nLgotICAgICAgICAgICAgaWYgKCFpc0FkZHJlc3NpbmdIZWFkZXJBbHJlYWR5QXZhaWxhYmxlKGhlYWRlck5hbWUsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgIGFkZFRvU09BUEhlYWRlcihlcHIsIGhlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUb0VQUigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbWVzc2FnZUNvbnRleHRPcHRpb25zLmdldFRvKCk7Ci0gICAgICAgICAgICBpZiAoZXByICE9IG51bGwgJiYgIWlzQWRkcmVzc2luZ0hlYWRlckFscmVhZHlBdmFpbGFibGUoV1NBX1RPLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVG9FUFJSZWZlcmVuY2VJbmZvcm1hdGlvbihlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoInJlZmVyZW5jZVBhcmFtZXRlckVycm9yIiksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGVwci5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCAmJiBhZGRyZXNzLmxlbmd0aCgpIT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZU9wdGlvbmFsSGVhZGVycyAmJiBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwci5pc1dTQWRkcmVzc2luZ0Fub255bW91cygpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vT21pdCB0aGUgaGVhZGVyLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNPQVBIZWFkZXJCbG9jayhhZGRyZXNzLCBXU0FfVE8sIGVwci5nZXRBZGRyZXNzQXR0cmlidXRlcygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVTT0FQSGVhZGVyQmxvY2soU3RyaW5nIHZhbHVlLCBTdHJpbmcgaGVhZGVyTmFtZSwgQXJyYXlMaXN0IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJjcmVhdGVTT0FQSGVhZGVyQmxvY2s6IHZhbHVlPSIgKyB2YWx1ZSArICIgaGVhZGVyTmFtZT0iICsgaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSE9MCkgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmFkZEhlYWRlckJsb2NrKGhlYWRlck5hbWUsIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QpOwotICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJCbG9jay5hZGRDaGlsZChmYWN0b3J5LmNyZWF0ZU9NVGV4dCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJJdGVyYXRvciA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGF0dHJJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW1wb3J0T01BdHRyaWJ1dGUoKE9NQXR0cmlidXRlKWF0dHJJdGVyYXRvci5uZXh0KCksIHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUm9sZVRvSGVhZGVyKHNvYXBIZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJCbG9jazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZFRvU09BUEhlYWRlcihFbmRwb2ludFJlZmVyZW5jZSBlcHIsIFN0cmluZyBoZWFkZXJOYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBhZGRyZXNzaW5nTmFtZXNwYWNlT2JqZWN0LmdldFByZWZpeCgpOwotICAgICAgICAgICAgU3RyaW5nIGFub255bW91cyA9IGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlID8KLSAgICAgICAgICAgICAgICAgICAgRmluYWwuV1NBX0FOT05ZTU9VU19VUkwgOiBTdWJtaXNzaW9uLldTQV9BTk9OWU1PVVNfVVJMOwotCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiYWRkVG9TT0FQSGVhZGVyOiBlcHI9IiArIGVwciArICIgaGVhZGVyTmFtZT0iICsgaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZU9wdGlvbmFsSGVhZGVycyAmJiBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfUkVQTFlfVE8uZXF1YWxzKGhlYWRlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9PbWl0IHRoZSBoZWFkZXIuCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGFub255bW91cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmIGVwci5oYXNOb25lQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOyAvL09taXQgdGhlIGhlYWRlci4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVwci5pc1dTQWRkcmVzc2luZ0Fub255bW91cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZU9wdGlvbmFsSGVhZGVycyAmJiBpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfUkVQTFlfVE8uZXF1YWxzKGhlYWRlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9PbWl0IHRoZSBoZWFkZXIuCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXByLnNldEFkZHJlc3MoYW5vbnltb3VzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwSGVhZGVyQmxvY2sgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci50b09NKGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lLCBwcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICBhZGRSb2xlVG9IZWFkZXIoKFNPQVBIZWFkZXJCbG9jaykgc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgICAgIGhlYWRlci5hZGRDaGlsZChzb2FwSGVhZGVyQmxvY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgd2lsbCBhZGQgcmVmZXJlbmNlIHBhcmFtZXRlcnMgYW5kL29yIHJlZmVyZW5jZSBwcm9wZXJ0aWVzIGluIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByZWZlcmVuY2VJbmZvcm1hdGlvbiBhIE1hcCBmcm9tIFFOYW1lIC0+IE9NRWxlbWVudAotICAgICAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICAgICAgaXMgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHJlZmVyZW5jZXBhcmFtZXRlcnMgc2hvdWxkIGJlCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZAotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUb0VQUlJlZmVyZW5jZUluZm9ybWF0aW9uKE1hcCByZWZlcmVuY2VJbmZvcm1hdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlSW5mb3JtYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgicHJvY2Vzc1RvRVBSUmVmZXJlbmNlSW5mb3JtYXRpb246ICIgKyByZWZlcmVuY2VJbmZvcm1hdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVmZXJlbmNlSW5mb3JtYXRpb24udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIG5ld0VsZW1lbnQgPSBFbGVtZW50SGVscGVyLnRvU09BUEhlYWRlckJsb2NrKG9tRWxlbWVudCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpbmFsQWRkcmVzc2luZ05hbWVzcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5hZGRBdHRyaWJ1dGUoRmluYWwuV1NBX0lTX1JFRkVSRU5DRV9QQVJBTUVURVJfQVRUUklCVVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5XU0FfVFlQRV9BVFRSSUJVVEVfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJvbGVUb0hlYWRlcihuZXdFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmFkZENoaWxkKG5ld0VsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdyBhZGQgcmVmZXJlbmNlIHBhcmFtZXRlcnMgd2UgZm91bmQgaW4gdGhlIFdTREwgKGlmIGFueSkKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtZXNzYWdlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKXsKLSAgICAgICAgICAgIAlBeGlzRW5kcG9pbnQgZW5kcG9pbnQgPSBzZXJ2aWNlLmdldEVuZHBvaW50KHNlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpOwotICAgICAgICAgICAgCWlmKGVuZHBvaW50ICE9IG51bGwpewotICAgICAgICAgICAgCQlBcnJheUxpc3QgcmVmZXJlbmNlcGFyYW1ldGVycyA9IChBcnJheUxpc3QpIGVuZHBvaW50LmdldFBhcmFtZXRlclZhbHVlKFJFRkVSRU5DRV9QQVJBTUVURVJfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIAkJaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIAkJCWxvZy50cmFjZSgicHJvY2Vzc1RvRVBSUmVmZXJlbmNlSW5mb3JtYXRpb246IFJlZmVyZW5jZSBQYXJhbWV0ZXJzIGZyb20gV1NETDoiICsgcmVmZXJlbmNlcGFyYW1ldGVycyk7Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAkJaWYocmVmZXJlbmNlcGFyYW1ldGVycyE9bnVsbCl7Ci0gICAgICAgICAgICAJCQlJdGVyYXRvciBpdGVyYXRvciA9IHJlZmVyZW5jZXBhcmFtZXRlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIAkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIAkJCQlPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIG5ld0VsZW1lbnQgPSBFbGVtZW50SGVscGVyLnRvU09BUEhlYWRlckJsb2NrKG9tRWxlbWVudCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAJCQkJaWYgKGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlKSB7Ci0gICAgICAgICAgICAJCQkJCW5ld0VsZW1lbnQuYWRkQXR0cmlidXRlKEZpbmFsLldTQV9JU19SRUZFUkVOQ0VfUEFSQU1FVEVSX0FUVFJJQlVURSwKLSAgICAgICAgICAgIAkJCQkJCQlGaW5hbC5XU0FfVFlQRV9BVFRSSUJVVEVfVkFMVUUsCi0gICAgICAgICAgICAJCQkJCQkJYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICAJCQkJfQotICAgICAgICAgICAgCQkJCWFkZFJvbGVUb0hlYWRlcihuZXdFbGVtZW50KTsKLSAgICAgICAgICAgIAkJCQloZWFkZXIuYWRkQ2hpbGQobmV3RWxlbWVudCk7Ci0gICAgICAgICAgICAJCQl9Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyB3aWxsIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIG1lc3NhZ2UgaW5mb3JtYXRpb24gaGVhZGVycyBhbHJlYWR5IGluIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBoZWFkZXJzLCB0aGVuIHJlcGxhY2luZyB0aGVtIG9yIG5vdCBkZXBlbmRzIG9uIHRoZSByZXBsYWNlSGVhZGVycwotICAgICAgICAgKiBwcm9wZXJ0eS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG5hbWUgICAgICAgICAgICAtIE5hbWUgb2YgdGhlIG1lc3NhZ2UgaW5mb3JtYXRpb24gaGVhZGVyCi0gICAgICAgICAqIEBwYXJhbSBtdWx0aXBsZUhlYWRlcnMgLSBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gc2VhcmNoIGZvciBtdWx0aXBsZSBoZWFkZXJzLCBvciBub3QuCi0gICAgICAgICAqIEByZXR1cm4gZmFsc2UgLSBpZiBvbmUgY2FuIGFkZCBuZXcgaGVhZGVycyAoYWx3YXlzIHRoZSBjYXNlIGlmIG11bHRpcGxlSGVhZGVycyBpcyB0cnVlKSwKLSAgICAgICAgICogICAgICAgICB0cnVlIC0gaWYgbmV3IGhlYWRlcnMgY2FuJ3QgYmUgYWRkZWQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdWx0aXBsZUhlYWRlcnMpIHsKLSAgICAgICAgCWJvb2xlYW4gc3RhdHVzID0gZmFsc2U7Ci0KLSAgICAgICAgCWlmIChtdWx0aXBsZUhlYWRlcnMpIHsKLSAgICAgICAgCQlpZiAocmVwbGFjZUhlYWRlcnMpIHsKLSAgICAgICAgCQkJUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoYWRkcmVzc2luZ05hbWVzcGFjZSwgbmFtZSwgV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBoZWFkZXIuZ2V0Q2hpbGRyZW5XaXRoTmFtZShxbmFtZSk7Ci0gICAgICAgIAkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQkJCU9NRWxlbWVudCBhZGRyZXNzaW5nSGVhZGVyID0gKE9NRWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIAkJCQlhZGRyZXNzaW5nSGVhZGVyLmRldGFjaCgpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfSBlbHNlIHsKLSAgICAgICAgCQlib29sZWFuIGV4aXN0cyA9IGRpZEFkZHJlc3NpbmdIZWFkZXJFeGlzdChuYW1lKTsKLSAgICAgICAgCQlpZiAoZXhpc3RzICYmIHJlcGxhY2VIZWFkZXJzKSB7Ci0gICAgICAgIAkJCVFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKGFkZHJlc3NpbmdOYW1lc3BhY2UsIG5hbWUsIFdTQV9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgIAkJCU9NRWxlbWVudCBhZGRyZXNzaW5nSGVhZGVyID0gaGVhZGVyLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShxbmFtZSk7Ci0gICAgICAgIAkJCWlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgIAkJCQlsb2cudHJhY2UoImlzQWRkcmVzc2luZ0hlYWRlckFscmVhZHlBdmFpbGFibGU6IFJlbW92aW5nIGV4aXN0aW5nIGhlYWRlcjoiICsKLSAgICAgICAgCQkJCQkJYWRkcmVzc2luZ0hlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQkJYWRkcmVzc2luZ0hlYWRlci5kZXRhY2goKTsKLSAgICAgICAgCQl9IGVsc2UgewotICAgICAgICAJCQlzdGF0dXMgPSBleGlzdHM7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotCi0gICAgICAgIAlpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAJCWxvZy50cmFjZSgiaXNBZGRyZXNzaW5nSGVhZGVyQWxyZWFkeUF2YWlsYWJsZTogbmFtZT0iICsgbmFtZSArICIgc3RhdHVzPSIgKyBzdGF0dXMpOwotICAgICAgICAJfQotICAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaWRBZGRyZXNzaW5nSGVhZGVyRXhpc3QoU3RyaW5nIGhlYWRlck5hbWUpewotICAgICAgICAJaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgCQlsb2cudHJhY2UoImRpZEFkZHJlc3NpbmdIZWFkZXJFeGlzdDogaGVhZGVyTmFtZT0iICsgaGVhZGVyTmFtZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAJaWYoZXhpc3RpbmdXU0FIZWFkZXJzICE9IG51bGwpewotICAgICAgICAJCXJlc3VsdCA9IGV4aXN0aW5nV1NBSGVhZGVycy5jb250YWlucyhoZWFkZXJOYW1lKTsKLSAgICAgICAgCQlpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAJCQlsb2cudHJhY2UoImRpZEFkZHJlc3NpbmdIZWFkZXJFeGlzdDogZXhpc3RpbmdXU0FIZWFkZXJzPSIgKyBleGlzdGluZ1dTQUhlYWRlcnMrIiByZXN1bHQ9IityZXN1bHQpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCXJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBvbiBhbGwgaGVhZGVycyB0aGF0IGFyZSBmb3VuZCB3aXRoIHRoZSBhcHByb3ByaWF0ZQotICAgICAgICAgKiBhZGRyZXNzaW5nIG5hbWVzcGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTXVzdFVuZGVyc3RhbmRQcm9wZXJ0eSgpIHsKLSAgICAgICAgICAgIGlmIChhZGRNdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZSkgewotICAgICAgICAgICAgICAgIExpc3QgaGVhZGVycyA9IGhlYWRlci5nZXRIZWFkZXJCbG9ja3NXaXRoTlNVUkkoYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGhlYWRlcnMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKWhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzTXVzdFVuZGVyc3RhbmRQcm9wZXJ0eTogU2V0dGluZyBtdXN0VW5kZXJzdGFuZD10cnVlIG9uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVyQmxvY2suZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgYWRkUm9sZVRvSGVhZGVyKFNPQVBIZWFkZXJCbG9jayBoZWFkZXIpewotICAgICAgICAJaWYoYWRkcmVzc2luZ1JvbGUgPT0gbnVsbCB8fCBhZGRyZXNzaW5nUm9sZS5sZW5ndGgoKT09MCl7Ci0gICAgICAgIAkJcmV0dXJuOwotICAgICAgICAJfQotICAgICAgICAJaGVhZGVyLnNldFJvbGUoYWRkcmVzc2luZ1JvbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNjI0Y2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdGYXVsdHNIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBBZGRyZXNzaW5nQ29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIuY2xhc3MpOwotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyI2ludm9rZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT2JqZWN0IGZsYWcgPSBtc2dDb250ZXh0LmdldExvY2FsUHJvcGVydHkoSVNfQUREUl9JTkZPX0FMUkVBRFlfUFJPQ0VTU0VEKTsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImludm9rZTogSVNfQUREUl9JTkZPX0FMUkVBRFlfUFJPQ0VTU0VEPSIgKyBmbGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShmbGFnKSkgewotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHdzYTpNZXNzYWdlSUQgaXMgcmVxdWlyZWQgb3Igbm90LgotICAgICAgICAgICAgY2hlY2tNZXNzYWdlSURIZWFkZXIobXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBDaGVjayB0aGF0IGlmIHdzYWRkcmVzc2luZz1yZXF1aXJlZCB0aGF0IGFkZHJlc3NpbmcgaGVhZGVycyB3ZXJlIGZvdW5kIGluYm91bmQKLSAgICAgICAgICAgIGNoZWNrVXNpbmdBZGRyZXNzaW5nKG1zZ0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGF0IGlmIHdzYW1JbnZvY2F0aW9uUGF0dGVybiBmbGFnIGlzIGluIGVmZmVjdCB0aGF0IHRoZSByZXBseXRvIGFuZCBmYXVsdHRvIGFyZSB2YWxpZC4KLSAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWUobXNnQ29udGV4dC5nZXRQcm9wZXJ0eShBRERSX1ZBTElEQVRFX0lOVk9DQVRJT05fUEFUVEVSTiksIHRydWUpKSB7Ci0gICAgICAgICAgICBjaGVja1dTQU1JbnZvY2F0aW9uUGF0dGVybihtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCBpZiB0aGUgd3NhZGRyZXNzaW5nPSJyZXF1aXJlZCIgYXR0cmlidXRlIGV4aXN0cyBvbiB0aGUgc2VydmljZSBkZWZpbml0aW9uIG9yCi0gICAgICogPHdzYXc6VXNpbmdBZGRyZXNzaW5nIHdzZGw6cmVxdWlyZWQ9InRydWUiIC8+IHdhcyBmb3VuZCBpbiB0aGUgV1NETCB0aGF0IFdTLUFkZHJlc3NpbmcKLSAgICAgKiBoZWFkZXJzIHdlcmUgZm91bmQgb24gdGhlIGluYm91bmQgbWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1VzaW5nQWRkcmVzc2luZyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCUF4aXNEZXNjcmlwdGlvbiBhZCA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKGFkID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiY2hlY2tVc2luZ0FkZHJlc3Npbmc6IGF4aXNTZXJ2aWNlIG51bGwsIGNhbm5vdCBjaGVjayBVc2luZ0FkZHJlc3NpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZihtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSE9bnVsbCl7Ci0gICAgICAgIAlhZCA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nRmxhZyA9Ci0gICAgICAgICAgICBBZGRyZXNzaW5nSGVscGVyLmdldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKGFkKTsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImNoZWNrVXNpbmdBZGRyZXNzaW5nOiBXU0FkZHJlc3NpbmdGbGFnPSIgKyBhZGRyZXNzaW5nRmxhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRC5lcXVhbHMoYWRkcmVzc2luZ0ZsYWcpKSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhhdCBpZiBhIHdzYXc6QW5vbnltb3VzIHZhbHVlIHdhcyBzZXQgb24gdGhlIEF4aXNPcGVyYXRpb24gdGhhdCB0aGUgdmFsdWVzIGluIHRoZQotICAgICAqIFJlcGx5VG8rRmF1bHRUbyBhcmUgdmFsaWQgYW5kIGZhdWx0IGlmIG5vdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXU0FNSW52b2NhdGlvblBhdHRlcm4oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0hlbHBlci5nZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlKG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImNoZWNrV1NBTUludm9jYXRpb25QYXR0ZXJuOiB2YWx1ZT0iICsgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCFBZGRyZXNzaW5nQ29uc3RhbnRzLldTQU1fSU5WT0NBVElPTl9QQVRURVJOX0JPVEguZXF1YWxzKHZhbHVlKSl7Ci0gICAgICAgIAlpZiAoV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fU1lOQ0hST05PVVMuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAJCWlmICghQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNSZXBseUFsbG93ZWQobXNnQ29udGV4dCkpIHsKLSAgICAgICAgCQkJRW5kcG9pbnRSZWZlcmVuY2UgYW5vbkVQUiA9Ci0gICAgICAgIAkJCQluZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCk7Ci0gICAgICAgIAkJCW1zZ0NvbnRleHQuc2V0UmVwbHlUbyhhbm9uRVBSKTsKLSAgICAgICAgCQkJbXNnQ29udGV4dC5zZXRGYXVsdFRvKGFub25FUFIpOwotICAgICAgICAJCQlBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG1zZ0NvbnRleHQsCi0gICAgICAgIAkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfUkVQTFlfVE8pOwotICAgICAgICAJCX0KLSAgICAgICAgCQlpZiAoIUFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jRmF1bHRBbGxvd2VkKG1zZ0NvbnRleHQpKSB7Ci0gICAgICAgIAkJCUVuZHBvaW50UmVmZXJlbmNlIGFub25FUFIgPQotICAgICAgICAJCQkJbmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FOT05ZTU9VU19VUkwpOwotICAgICAgICAJCQltc2dDb250ZXh0LnNldFJlcGx5VG8oYW5vbkVQUik7Ci0gICAgICAgIAkJCW1zZ0NvbnRleHQuc2V0RmF1bHRUbyhhbm9uRVBSKTsKLSAgICAgICAgCQkJQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyT25seUFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdChtc2dDb250ZXh0LAotICAgICAgICAJCQkJCUFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0ZBVUxUX1RPKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9IGVsc2UgaWYgKFdTQU1fSU5WT0NBVElPTl9QQVRURVJOX0FTWU5DSFJPTk9VUy5lcXVhbHModmFsdWUpKSB7Ci0gICAgICAgIAkJaWYgKCFBZGRyZXNzaW5nSGVscGVyLmlzUmVwbHlSZWRpcmVjdGVkKG1zZ0NvbnRleHQpKSB7Ci0gICAgICAgIAkJCUFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlck9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQobXNnQ29udGV4dCwKLSAgICAgICAgCQkJCQlBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9SRVBMWV9UTyk7Ci0gICAgICAgIAkJfQotICAgICAgICAJCWlmICghQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtc2dDb250ZXh0KSkgewotICAgICAgICAJCQlBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJPbmx5Tm9uQW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG1zZ0NvbnRleHQsCi0gICAgICAgIAkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRkFVTFRfVE8pOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQgYSBtZXNzYWdlIGlkIGlzIHByZXNlbnQgd2hlbiByZXF1aXJlZC4gVGhlIGNoZWNrIGFwcGxpZWQgaGVyZSBvbmx5IGFwcGxpZXMgdG8KLSAgICAgKiBXUy1BZGRyZXNzaW5nIGhlYWRlcnMgdGhhdCBjb21wbHkgd2l0aCB0aGUgMjAwNS8wOCAoZmluYWwpIHNwZWMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICogQHNlZSBBZGRyZXNzaW5nSW5IYW5kbGVyI2NoZWNrRm9yTWFuZGF0b3J5SGVhZGVycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja01lc3NhZ2VJREhlYWRlcihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpbXNnQ29udGV4dC5nZXRMb2NhbFByb3BlcnR5KFdTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmICghRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVwID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgICAgICBpbnQgbWVwQ29uc3RhbnQgPSBVdGlscy5nZXRBeGlzU3BlY2lmTUVQQ29uc3RhbnQobWVwKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lcENvbnN0YW50ID09IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVCB8fAotICAgICAgICAgICAgICAgICAgICBtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PUFRJT05BTF9PVVQgfHwKLSAgICAgICAgICAgICAgICAgICAgbWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfUk9CVVNUX0lOX09OTFkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUlkID0gbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VJZCA9PSBudWxsIHx8ICIiLmVxdWFscyhtZXNzYWdlSWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobXNnQ29udGV4dCwgV1NBX01FU1NBR0VfSUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvT3V0SGFuZGxlclRlc3QueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9PdXRIYW5kbGVyVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzc2YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9PdXRIYW5kbGVyVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciIHhtbG5zOm15UmVmPSJodHRwOi8vcmVmZXJlbmNlLm9yZyI+Ci0gICAgICAgIDx3c2E6RnJvbT4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8UmVmZXJlbmNlMj5WYWx1ZSAyMDA8L1JlZmVyZW5jZTI+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOlRvPmh0dHA6Ly93d3cudG8ub3JnL3NlcnZpY2UvPC93c2E6VG8+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEPjEyMzQ1Ni03ODkwPC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlND5WYWx1ZSA0MDA8L215UmVmOlJlZmVyZW5jZTQ+Ci0gICAgICAgIDxteVJlZjpSZWZlcmVuY2UzPlZhbHVlIDMwMDwvbXlSZWY6UmVmZXJlbmNlMz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnJlcGx5VG8ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZT0iVGVzdFJlbGF0aW9uIj5odHRwOi8vd3d3LnJlbGF0ZXNUby5vcmcvc2VydmljZS88L3dzYTpSZWxhdGVzVG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5Pjwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyNWUxYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2VwclRlc3QueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9lcHJUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZGIzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2VwclRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6UmVmZXJlbmNlND5WYWx1ZSA0MDA8L3dzYTpSZWZlcmVuY2U0PgotICAgICAgICA8d3NhOlJlZmVyZW5jZTE+VmFsdWUgMTAwPC93c2E6UmVmZXJlbmNlMT4KLSAgICAgICAgPHdzYTpSZWZlcmVuY2UwPlZhbHVlIDA8L3dzYTpSZWZlcmVuY2UwPgotICAgICAgICA8d3NhOlJlZmVyZW5jZTI+VmFsdWUgMjAwPC93c2E6UmVmZXJlbmNlMj4KLSAgICAgICAgPHdzYTpSZWZlcmVuY2UzPlZhbHVlIDMwMDwvd3NhOlJlZmVyZW5jZTM+Ci0gICAgICAgIDx3c2E6VG8+aHR0cDovL3d3dy50by5vcmcvc2VydmljZS88L3dzYTpUbz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91cwotICAgICAgICAgICAgPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij51cm46dGVzdDoxMjM8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5Lz4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDExL0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDExL0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhOGJiYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMS9JbnZhbGlkQWRkcmVzc2luZ0hlYWRlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHdzYTpGYXVsdERldGFpbCB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8d3NhOlByb2JsZW1IZWFkZXJRTmFtZT53c2E6VG88L3dzYTpQcm9ibGVtSGVhZGVyUU5hbWU+Ci0KLSAgICAgICAgPC93c2E6RmF1bHREZXRhaWw+Ci0gICAgICAgIDx3c2E6VG8geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9mYXVsdDwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPnV1aWQ6RDFDMEI5MUUtMDEwOS00MDAwLUUwMDAtMDJBQ0MwQTgwMTVFPC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+dXJuOnV1aWQ6OWEzNWFmYzgtN2JlNi00YTQxLWJhNjQtOTJhNDRmNzNhM2Q3PC93c2E6UmVsYXRlc1RvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLQotICAgICAgICA8c29hcGVudjpGYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdGNvZGU+d3NhOkludmFsaWRBZGRyZXNzaW5nSGVhZGVyPC9mYXVsdGNvZGU+Ci0gICAgICAgICAgICA8ZmF1bHRzdHJpbmc+PCFbQ0RBVEFbQSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZF1dPjwvZmF1bHRzdHJpbmc+Ci0gICAgICAgIDwvc29hcGVudjpGYXVsdD4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTEvTWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZC54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMS9NZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3ZWQ3ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMS9NZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotCi0gICAgICAgIDx3c2E6RmF1bHREZXRhaWwgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgICAgICAgICAgPHdzYTpQcm9ibGVtSGVhZGVyUU5hbWU+d3NhOkFjdGlvbjwvd3NhOlByb2JsZW1IZWFkZXJRTmFtZT4KLSAgICAgICAgPC93c2E6RmF1bHREZXRhaWw+Ci0gICAgICAgIDx3c2E6VG8geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9mYXVsdDwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPnV1aWQ6RDFDMEMzREYtMDEwOS00MDAwLUUwMDAtMDJBQ0MwQTgwMTVFPC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+dXJuOnV1aWQ6MzIxMTlhYmYtOTRjNC00OGUwLWJkYTUtM2RhYWFhOTA3NzFlPC93c2E6UmVsYXRlc1RvPgotCi0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8c29hcGVudjpGYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdGNvZGU+d3NhOk1lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQ8L2ZhdWx0Y29kZT4KLSAgICAgICAgICAgIDxmYXVsdHN0cmluZz48IVtDREFUQVtBIHJlcXVpcmVkIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHByZXNlbnRdXT48L2ZhdWx0c3RyaW5nPgotICAgICAgICA8L3NvYXBlbnY6RmF1bHQ+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTIvSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9mYXVsdC1tZXNzYWdlcy9zb2FwMTIvSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2E1MGMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDEyL0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIiB4bWxuczpzb2FwZW5jPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW5jb2RpbmciIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXI+Ci0gICAgICAgIDx3c2E6VG8geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpUbz4KLQotICAgICAgICA8d3NhOkFjdGlvbiB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2ZhdWx0PC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+dXVpZDpEMUMwQzU1Qy0wMTA5LTQwMDAtRTAwMC0wMkFDQzBBODAxNUU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj51cm46dXVpZDo1M2ViNDJlYS1iM2U1LTRlNDctOTkxYS02MTIyMzY1MmU2Yzg8L3dzYTpSZWxhdGVzVG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8c29hcGVudjpGYXVsdD4KLSAgICAgICAgICAgIDxzb2FwZW52OkNvZGU+Ci0KLSAgICAgICAgICAgICAgICA8c29hcGVudjpWYWx1ZT5zb2FwZW52OlNlbmRlcjwvc29hcGVudjpWYWx1ZT4KLSAgICAgICAgICAgICAgICA8c29hcGVudjpTdWJjb2RlPgotICAgICAgICAgICAgICAgICAgICA8c29hcGVudjpWYWx1ZT53c2E6SW52YWxpZEFkZHJlc3NpbmdIZWFkZXI8L3NvYXBlbnY6VmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9zb2FwZW52OlN1YmNvZGU+Ci0gICAgICAgICAgICA8L3NvYXBlbnY6Q29kZT4KLSAgICAgICAgICAgIDxzb2FwZW52OlJlYXNvbj4KLSAgICAgICAgICAgICAgICA8c29hcGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+PCFbQ0RBVEFbQSBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCB2YWxpZCBhbmQgdGhlIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZF1dPjwvc29hcGVudjpUZXh0PgotICAgICAgICAgICAgPC9zb2FwZW52OlJlYXNvbj4KLQotICAgICAgICAgICAgPHNvYXBlbnY6RGV0YWlsPgotICAgICAgICAgICAgICAgIDx3c2E6UHJvYmxlbUhlYWRlclFOYW1lPndzYTpUbzwvd3NhOlByb2JsZW1IZWFkZXJRTmFtZT4KLSAgICAgICAgICAgIDwvc29hcGVudjpEZXRhaWw+Ci0gICAgICAgIDwvc29hcGVudjpGYXVsdD4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ZhdWx0LW1lc3NhZ2VzL3NvYXAxMi9NZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDEyL01lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IyNGQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvZmF1bHQtbWVzc2FnZXMvc29hcDEyL01lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHdzYTpUbyB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOlRvPgotCi0gICAgICAgIDx3c2E6QWN0aW9uIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvZmF1bHQ8L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj51dWlkOkQxQzBDRTZGLTAxMDktNDAwMC1FMDAwLTAyQUNDMEE4MDE1RTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8geG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPnVybjp1dWlkOmM5NmUwMTcyLWMyNWUtNGE2ZS1hOTBkLWExZmU5M2UxNDFmMDwvd3NhOlJlbGF0ZXNUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxzb2FwZW52OkZhdWx0PgotICAgICAgICAgICAgPHNvYXBlbnY6Q29kZT4KLQotICAgICAgICAgICAgICAgIDxzb2FwZW52OlZhbHVlPnNvYXBlbnY6U2VuZGVyPC9zb2FwZW52OlZhbHVlPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlN1YmNvZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwZW52OlZhbHVlPndzYTpJbnZhbGlkQWRkcmVzc2luZ0hlYWRlcjwvc29hcGVudjpWYWx1ZT4KLSAgICAgICAgICAgICAgICA8L3NvYXBlbnY6U3ViY29kZT4KLSAgICAgICAgICAgIDwvc29hcGVudjpDb2RlPgotICAgICAgICAgICAgPHNvYXBlbnY6UmVhc29uPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj48IVtDREFUQVtBIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkXV0+PC9zb2FwZW52OlRleHQ+Ci0gICAgICAgICAgICA8L3NvYXBlbnY6UmVhc29uPgotCi0gICAgICAgICAgICA8c29hcGVudjpEZXRhaWw+Ci0gICAgICAgICAgICAgICAgPHdzYTpQcm9ibGVtSGVhZGVyUU5hbWU+d3NhOlRvPC93c2E6UHJvYmxlbUhlYWRlclFOYW1lPgotICAgICAgICAgICAgPC9zb2FwZW52OkRldGFpbD4KLSAgICAgICAgPC9zb2FwZW52OkZhdWx0PgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlBY3Rpb25NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlBY3Rpb25NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkOGIyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5QWN0aW9uTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eUZhdWx0VG9NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlGYXVsdFRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmFkY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eUZhdWx0VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5RnJvbU1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eUZyb21NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwMTcwYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5RnJvbU1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5TWVzc2FnZUlETWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5TWVzc2FnZUlETWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzBhMDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eU1lc3NhZ2VJRE1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjgyMEM1MTkwLTBCOEYtMTFEOS04RERELUY2N0VERUVCRjdaNjwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eVJlcGx5VG9NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9maW5hbC9pbnZhbGlkQ2FyZGluYWxpdHlSZXBseVRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTg1ZTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eVJlcGx5VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDI8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL2ZpbmFsL2ludmFsaWRDYXJkaW5hbGl0eVRvTWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNjA3NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvZmluYWwvaW52YWxpZENhcmRpbmFsaXR5VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlBY3Rpb25NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUFjdGlvbk1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjczZDhjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUFjdGlvbk1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5RmF1bHRUb01lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5RmF1bHRUb01lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODExNWEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUZhdWx0VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUZyb21NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eUZyb21NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkYmQxOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlGcm9tTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlNZXNzYWdlSURNZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eU1lc3NhZ2VJRE1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE4MjY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eU1lc3NhZ2VJRE1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjgyMEM1MTkwLTBCOEYtMTFEOS04RERELUY2N0VERUVCRjdaNjwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlSZXBseVRvTWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlSZXBseVRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YWY2MTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9pbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzL3N1Ym1pc3Npb24vaW52YWxpZENhcmRpbmFsaXR5UmVwbHlUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3QyPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eVRvTWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL2ludmFsaWQtY2FyZGluYWxpdHktbWVzc2FnZXMvc3VibWlzc2lvbi9pbnZhbGlkQ2FyZGluYWxpdHlUb01lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA0Yzk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvaW52YWxpZC1jYXJkaW5hbGl0eS1tZXNzYWdlcy9zdWJtaXNzaW9uL2ludmFsaWRDYXJkaW5hbGl0eVRvTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL211c3RVbmRlcnN0YW5kVGVzdC54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL211c3RVbmRlcnN0YW5kVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzE0ZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9tdXN0VW5kZXJzdGFuZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiB4bWxuczpteVJlZj0iaHR0cDovL3JlZmVyZW5jZS5vcmciPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZTI+VmFsdWUgMjAwPC9SZWZlcmVuY2UyPgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIxIj5odHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLzwvd3NhOlRvPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIxIj4xMjM0NTYtNzg5MDwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTQ+VmFsdWUgNDAwPC9teVJlZjpSZWZlcmVuY2U0PgotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlMz5WYWx1ZSAzMDA8L215UmVmOlJlZmVyZW5jZTM+Ci0gICAgICAgIDx3c2E6QWN0aW9uIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPmh0dHA6Ly93d3cuYWN0aW9ucy5vcmcvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOlJlcGx5VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5yZXBseVRvLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiIFJlbGF0aW9uc2hpcFR5cGU9IlRlc3RSZWxhdGlvbiI+aHR0cDovL3d3dy5yZWxhdGVzVG8ub3JnL3NlcnZpY2UvPC93c2E6UmVsYXRlc1RvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT48L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9BY3Rpb25NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9BY3Rpb25NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkZTYxMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vQWN0aW9uTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0ZhdWx0VG9NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9GYXVsdFRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMTA4OTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0ZhdWx0VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0Zyb21NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9Gcm9tTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWE5NTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub0Zyb21NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vTWVzc2FnZUlETWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vTWVzc2FnZUlETWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNGI1NDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub01lc3NhZ2VJRE1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub1JlcGx5VG9NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvZmluYWwvbm9SZXBseVRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWNkYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub1JlcGx5VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9maW5hbC9ub1RvTWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vVG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkMzIzNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL2ZpbmFsL25vVG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6RmF1bHRUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub0FjdGlvbk1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vQWN0aW9uTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZDQyY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vQWN0aW9uTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6UmVwbHlUbz4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOkZhdWx0VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPgotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9GYXVsdFRvTWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9GYXVsdFRvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMmE4Y2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vRmF1bHRUb01lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjEyMzQ1Njc4OTwvYXhpczI6UGFyYW1PbmU+Ci0gICAgICAgIDxheGlzMjpQYXJhbVR3byB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPkFCQ0RFRkc8L2F4aXMyOlBhcmFtVHdvPgotICAgICAgICA8d3NhOlJlcGx5VG8+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3Q8L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgPC93c2E6UmVwbHlUbz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub0Zyb21NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub0Zyb21NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZTRkYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9Gcm9tTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vTWVzc2FnZUlETWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9NZXNzYWdlSURNZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4MzJmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9NZXNzYWdlSURNZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vTWVzc2FnZUlETm9SZXBseVRvTm9GYXVsdFRvTWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9NZXNzYWdlSUROb1JlcGx5VG9Ob0ZhdWx0VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZmMzQ0NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9NZXNzYWdlSUROb1JlcGx5VG9Ob0ZhdWx0VG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub1JlcGx5VG9NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub1JlcGx5VG9NZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkwMjYyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL29taXR0ZWQtaGVhZGVyLW1lc3NhZ2VzL3N1Ym1pc3Npb24vbm9SZXBseVRvTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPGF4aXMyOlBhcmFtT25lIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+MTIzNDU2Nzg5PC9heGlzMjpQYXJhbU9uZT4KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vVG9NZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvb21pdHRlZC1oZWFkZXItbWVzc2FnZXMvc3VibWlzc2lvbi9ub1RvTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZTZlODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9vbWl0dGVkLWhlYWRlci1tZXNzYWdlcy9zdWJtaXNzaW9uL25vVG9NZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpGYXVsdFRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZhdWx0VG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy9zb2FwMTFyb2xlVGVzdC54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3NvYXAxMXJvbGVUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyODMwNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3NvYXAxMXJvbGVUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiB4bWxuczpteVJlZj0iaHR0cDovL3JlZmVyZW5jZS5vcmciPg0KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6YWN0b3I9InVybjp0ZXN0OnJvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UyPlZhbHVlIDIwMDwvUmVmZXJlbmNlMj4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgICAgIDx3c2E6VG8gc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+aHR0cDovL3d3dy50by5vcmcvc2VydmljZS88L3dzYTpUbz4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6YWN0b3I9InVybjp0ZXN0OnJvbGUiPjEyMzQ1Ni03ODkwPC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTQgc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+VmFsdWUgNDAwPC9teVJlZjpSZWZlcmVuY2U0Pg0KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTMgc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+VmFsdWUgMzAwPC9teVJlZjpSZWZlcmVuY2UzPg0KLSAgICAgICAgPHdzYTpBY3Rpb24gc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+aHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb248L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8gc29hcGVudjphY3Rvcj0idXJuOnRlc3Q6cm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgPC93c2E6UmVwbHlUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIHNvYXBlbnY6YWN0b3I9InVybjp0ZXN0OnJvbGUiIFJlbGF0aW9uc2hpcFR5cGU9IlRlc3RSZWxhdGlvbiI+aHR0cDovL3d3dy5yZWxhdGVzVG8ub3JnL3NlcnZpY2UvPC93c2E6UmVsYXRlc1RvPg0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pjwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3NvYXAxMnJvbGVUZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvc29hcDEycm9sZVRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTVkYjJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvc29hcDEycm9sZVRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiB4bWxuczpteVJlZj0iaHR0cDovL3JlZmVyZW5jZS5vcmciPg0KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6cm9sZT0idXJuOnRlc3Q6cm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPFJlZmVyZW5jZTI+VmFsdWUgMjAwPC9SZWZlcmVuY2UyPg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICA8L3dzYTpGcm9tPg0KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52OnJvbGU9InVybjp0ZXN0OnJvbGUiPmh0dHA6Ly93d3cudG8ub3JnL3NlcnZpY2UvPC93c2E6VG8+DQotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52OnJvbGU9InVybjp0ZXN0OnJvbGUiPjEyMzQ1Ni03ODkwPC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTQgc29hcGVudjpyb2xlPSJ1cm46dGVzdDpyb2xlIj5WYWx1ZSA0MDA8L215UmVmOlJlZmVyZW5jZTQ+DQotICAgICAgICA8bXlSZWY6UmVmZXJlbmNlMyBzb2FwZW52OnJvbGU9InVybjp0ZXN0OnJvbGUiPlZhbHVlIDMwMDwvbXlSZWY6UmVmZXJlbmNlMz4NCi0gICAgICAgIDx3c2E6QWN0aW9uIHNvYXBlbnY6cm9sZT0idXJuOnRlc3Q6cm9sZSI+aHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb248L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8gc29hcGVudjpyb2xlPSJ1cm46dGVzdDpyb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5yZXBseVRvLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gc29hcGVudjpyb2xlPSJ1cm46dGVzdDpyb2xlIiBSZWxhdGlvbnNoaXBUeXBlPSJUZXN0UmVsYXRpb24iPmh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLzwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgPC9zb2FwZW52OkhlYWRlcj4NCi0gICAgPHNvYXBlbnY6Qm9keT48L3NvYXBlbnY6Qm9keT4NCi08L3NvYXBlbnY6RW52ZWxvcGU+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS5jdXN0b21yb2xlLnNvYXAxMi54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLmN1c3RvbXJvbGUuc29hcDEyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwMjM1Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL2ZpbmFsL3NvYXBtZXNzYWdlLmN1c3RvbXJvbGUuc29hcDEyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSINCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciPg0KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSIgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPg0KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQ+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvPnNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmludmFsaWQtbm90aW5yb2xlPC93c2E6VG8+DQotICAgICAgICA8d3NhOkZyb20+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWRkcmVzcz4NCi0gICAgICAgIDwvd3NhOkZyb20+DQotICAgICAgICA8d3NhOkFjdGlvbj5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbz4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgPC93c2E6UmVwbHlUbz4NCi0gICAgICAgIDx3c2E6RmF1bHRUbz4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgPC93c2E6RmF1bHRUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvPmludmFsaWQtbm90aW5yb2xlPC93c2E6UmVsYXRlc1RvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZT0iaHR0cDovL3NvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCI+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpSZWxhdGVzVG8+DQotICAgICAgICANCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjpyb2xlPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6cm9sZT0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPg0KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjpyb2xlPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0Pg0KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOkZyb20+DQotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6cm9sZT0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OnJvbGU9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0Pg0KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOlJlcGx5VG8+DQotICAgICAgICA8d3NhOkZhdWx0VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OnJvbGU9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4NCi0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpGYXVsdFRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OnJvbGU9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+aHR0cDovL3NvbWUucHJldmlvdXMubWVzc2FnZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGU9Imh0dHA6Ly9zb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiIHNvYXBlbnY6cm9sZT0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vaWRlbnRpZmllci5vZi5vdGhlci5tZXNzYWdlLzwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgPC9zb2FwZW52OkhlYWRlcj4NCi0gICAgPHNvYXBlbnY6Qm9keT4NCi0gICAgICAgIDxuczE6Z2V0QmFsYW5jZSBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4NCi0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4NCi0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+DQotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIg0KLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICAgICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iPg0KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPg0KLSAgICA8L3NvYXBlbnY6Qm9keT4NCi08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS5jdXN0b21yb2xlLnhtbCBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvZmluYWwvc29hcG1lc3NhZ2UuY3VzdG9tcm9sZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2ZmNzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS5jdXN0b21yb2xlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIg0KLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+DQotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczpmYWJyaWthbT0iaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtIiB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiI+DQotICAgICAgICA8d3NhOk1lc3NhZ2VJRD5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOk1lc3NhZ2VJRD4NCi0gICAgICAgIDx3c2E6VG8+c29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpUbz4NCi0gICAgICAgIDx3c2E6RnJvbT4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgICAgIDx3c2E6QWN0aW9uPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWN0aW9uPg0KLSAgICAgICAgPHdzYTpSZXBseVRvPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICAgICAgPHdzYTpGYXVsdFRvPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpGYXVsdFRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpSZWxhdGVzVG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBSZWxhdGlvbnNoaXBUeXBlPSJodHRwOi8vc29tZS5jdXN0b20ucmVsYXRpb25zaGlwIj5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgICAgIA0KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPg0KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4NCi0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICAgICAgPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOk1ldGFFeHQ+DQotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgICAgIDx3c2E6QWN0aW9uIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+DQotICAgICAgICA8d3NhOlJlcGx5VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4NCi0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICAgICAgPHdzYTpGYXVsdFRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0PC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6TWV0YWRhdGE+DQotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0Pg0KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOkZhdWx0VG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+aHR0cDovL3NvbWUucHJldmlvdXMubWVzc2FnZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGU9Imh0dHA6Ly9zb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+aHR0cDovL2lkZW50aWZpZXIub2Yub3RoZXIubWVzc2FnZS88L3dzYTpSZWxhdGVzVG8+DQotICAgIDwvc29hcGVudjpIZWFkZXI+DQotICAgIDxzb2FwZW52OkJvZHk+DQotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyINCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+DQotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+DQotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPg0KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCINCi0gICAgICAgICAgICAgICAgc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyINCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4NCi0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4NCi0gICAgPC9zb2FwZW52OkJvZHk+DQotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC1yZXNvdXJjZXMvdmFsaWQtbWVzc2FnZXMvZmluYWwvc29hcG1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDYxNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9maW5hbC9zb2FwbWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPgotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8YXhpczI6UGFyYW1PbmUgd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz4xMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPgotICAgICAgICA8YXhpczI6UGFyYW1Ud28gd3NhOklzUmVmZXJlbmNlUGFyYW1ldGVyPSd0cnVlJz5BQkNERUZHPC9heGlzMjpQYXJhbVR3bz4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPgotICAgICAgICAgICAgICAgIDxheGlzMjpNZXRhRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpNZXRhRXh0PgotICAgICAgICAgICAgPC93c2E6TWV0YWRhdGE+Ci0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+Ci0gICAgICAgIDwvd3NhOlJlcGx5VG8+Ci0gICAgICAgIDx3c2E6RmF1bHRUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgPHdzYTpNZXRhZGF0YT4KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4KLSAgICAgICAgICAgIDwvd3NhOk1ldGFkYXRhPgotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PgotICAgICAgICA8L3dzYTpGYXVsdFRvPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly9zb21lLnByZXZpb3VzLm1lc3NhZ2U8L3dzYTpSZWxhdGVzVG8+Ci0gICAgICAgIDx3c2E6UmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGU9Imh0dHA6Ly9zb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiPmh0dHA6Ly9pZGVudGlmaWVyLm9mLm90aGVyLm1lc3NhZ2UvPC93c2E6UmVsYXRlc1RvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vIGhyZWY9IiNpZDAiLz4KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4KLSAgICAgICAgPG11bHRpUmVmIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgICAgICBzb2FwZW52OmVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+Ci0gICAgICAgICAgICAxMDAxPC9tdWx0aVJlZj4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL3N1Ym1pc3Npb24vc29hcG1lc3NhZ2UuY3VzdG9tcm9sZS54bWwgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL3N1Ym1pc3Npb24vc29hcG1lc3NhZ2UuY3VzdG9tcm9sZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWY3NDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9zdWJtaXNzaW9uL3NvYXBtZXNzYWdlLmN1c3RvbXJvbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iDQotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIg0KLSAgICAgICAgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiPg0KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSI+DQotICAgICAgICA8d3NhOk1lc3NhZ2VJRD5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOk1lc3NhZ2VJRD4NCi0gICAgICAgIDx3c2E6VG8+c29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpUbz4NCi0gICAgICAgIDx3c2E6RnJvbT4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgICAgIDx3c2E6QWN0aW9uPmludmFsaWQtbm90aW5yb2xlPC93c2E6QWN0aW9uPg0KLSAgICAgICAgPHdzYTpSZXBseVRvPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICAgICAgPHdzYTpGYXVsdFRvPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOkFkZHJlc3M+DQotICAgICAgICA8L3dzYTpGYXVsdFRvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8+aW52YWxpZC1ub3RpbnJvbGU8L3dzYTpSZWxhdGVzVG8+DQotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBSZWxhdGlvbnNoaXBUeXBlPSJodHRwOi8vc29tZS5jdXN0b20ucmVsYXRpb25zaGlwIj5pbnZhbGlkLW5vdGlucm9sZTwvd3NhOlJlbGF0ZXNUbz4NCi0gICAgDQotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPg0KLSAgICAgICAgPHdzYTpGcm9tIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj4NCi0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUHJvcGVydGllcz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUHJvcGVydGllcz4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpGcm9tPg0KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6YWN0b3I9Imh0dHA6Ly9teS9jdXN0b20vcm9sZSI+DQotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06U2hvcHBpbmdDYXJ0PkFCQ0RFRkc8L2ZhYnJpa2FtOlNob3BwaW5nQ2FydD4NCi0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPg0KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4NCi0gICAgICAgIDwvd3NhOlJlcGx5VG8+DQotDQotICAgICAgICA8d3NhOkZhdWx0VG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5IiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vZmF1bHQ8L3dzYTpBZGRyZXNzPg0KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+DQotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0Pg0KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+DQotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0Pg0KLSAgICAgICAgPC93c2E6RmF1bHRUbz4NCi0gICAgICAgIDx3c2E6UmVsYXRlc1RvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjphY3Rvcj0iaHR0cDovL215L2N1c3RvbS9yb2xlIj5odHRwOi8vc29tZS5wcmV2aW91cy5tZXNzYWdlPC93c2E6UmVsYXRlc1RvPg0KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gUmVsYXRpb25zaGlwVHlwZT0iYXhpczI6c29tZS5jdXN0b20ucmVsYXRpb25zaGlwIiBzb2FwZW52OmFjdG9yPSJodHRwOi8vbXkvY3VzdG9tL3JvbGUiPmh0dHA6Ly9pZGVudGlmaWVyLm9mLm90aGVyLm1lc3NhZ2UvPC93c2E6UmVsYXRlc1RvPg0KLQ0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pg0KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPg0KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPg0KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4NCi0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiDQotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+DQotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+DQotICAgIDwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL3N1Ym1pc3Npb24vc29hcG1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0LXJlc291cmNlcy92YWxpZC1tZXNzYWdlcy9zdWJtaXNzaW9uL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxNjRjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3QtcmVzb3VyY2VzL3ZhbGlkLW1lc3NhZ2VzL3N1Ym1pc3Npb24vc29hcG1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciCi0gICAgICAgIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4KLSAgICA8c29hcGVudjpIZWFkZXIgeG1sbnM6ZmFicmlrYW09Imh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbSI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICB1dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPgotICAgICAgICAgICAgICAgIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9yb2xlL2Fub255bW91czwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUHJvcGVydGllcz4KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpBY3Rpb24gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9hY2N0PC93c2E6QWRkcmVzcz4KLSAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPgotICAgICAgICAgICAgPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PgotICAgICAgICA8L3dzYTpSZXBseVRvPgotCi0gICAgICAgIDx3c2E6RmF1bHRUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbS9mYXVsdDwvd3NhOkFkZHJlc3M+Ci0gICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+Ci0gICAgICAgICAgICA8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUHJvcGVydGllcz4KLSAgICAgICAgICAgIDxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij4xMjM0NTY3ODk8L2F4aXMyOkVQUkV4dD4KLSAgICAgICAgPC93c2E6RmF1bHRUbz4KLSAgICAgICAgPHdzYTpSZWxhdGVzVG8gYXhpczI6QXR0ckV4dD0iMTIzNDU2Nzg5Ij5odHRwOi8vc29tZS5wcmV2aW91cy5tZXNzYWdlPC93c2E6UmVsYXRlc1RvPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyBSZWxhdGlvbnNoaXBUeXBlPSJheGlzMjpzb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiPmh0dHA6Ly9pZGVudGlmaWVyLm9mLm90aGVyLm1lc3NhZ2UvPC93c2E6UmVsYXRlc1RvPgotCi0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0Ij4KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgaWQ9ImlkMCIgc29hcGVuYzpyb290PSIwIgotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgICAgeHNpOnR5cGU9InhzZDppbnQiIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4KLSAgICAgICAgICAgIDEwMDE8L211bHRpUmVmPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZpbmFsSW5IYW5kbGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmluYWxJbkhhbmRsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTgxNDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmluYWxJbkhhbmRsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0ZpbmFsSW5IYW5kbGVyVGVzdCBleHRlbmRzIEFkZHJlc3NpbmdJbkhhbmRsZXJUZXN0QmFzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWRkcmVzc2luZ0ZpbmFsSW5IYW5kbGVyVGVzdC5jbGFzcyk7Ci0KLSAgICAvKiogQHBhcmFtIHRlc3ROYW1lICAqLwotICAgIHB1YmxpYyBBZGRyZXNzaW5nRmluYWxJbkhhbmRsZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgaW5IYW5kbGVyID0gbmV3IEFkZHJlc3NpbmdJbkhhbmRsZXIoKTsKLSAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRTsKLSAgICAgICAgdmVyc2lvbkRpcmVjdG9yeSA9ICJmaW5hbCI7Ci0gICAgICAgIGZyb21BZGRyZXNzID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXMiOwotICAgICAgICBzZWNvbmRSZWxhdGlvbnNoaXBUeXBlID0gImh0dHA6Ly9zb21lLmN1c3RvbS5yZWxhdGlvbnNoaXAiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBleHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnMobnVsbCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMuZ2V0VG8oKSk7Ci0KLSAgICAgICAgICAgIE1hcCBhbGxSZWZlcmVuY2VQYXJhbWV0ZXJzID0gb3B0aW9ucy5nZXRUbygpLmdldEFsbFJlZmVyZW5jZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWxsUmVmZXJlbmNlUGFyYW1ldGVycyk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiIsICJQYXJhbU9uZSIsICJheGlzMiIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbGxSZWZlcmVuY2VQYXJhbWV0ZXJzLmdldChxTmFtZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRFUFJIYXNDb3JyZWN0TWV0YWRhdGEob3B0aW9ucy5nZXRGcm9tKCkpOwotICAgICAgICAgICAgYXNzZXJ0RVBSSGFzQ29ycmVjdE1ldGFkYXRhKG9wdGlvbnMuZ2V0RmF1bHRUbygpKTsKLSAgICAgICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldFJlcGx5VG8oKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0N1c3RvbVJvbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEZpbGVOYW1lID0gInNvYXBtZXNzYWdlLmN1c3RvbXJvbGUueG1sIjsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gZXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKG5ldyBSb2xlUGxheWVyKCkgewotICAgICAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGFsLmFkZCgiaHR0cDovL215L2N1c3RvbS9yb2xlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMuZ2V0VG8oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldEZyb20oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldEZhdWx0VG8oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldFJlcGx5VG8oKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzQ3VzdG9tUm9sZVNPQVAxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0ZXN0RmlsZU5hbWUgPSAic29hcG1lc3NhZ2UuY3VzdG9tcm9sZS5zb2FwMTIueG1sIjsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gZXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKG5ldyBSb2xlUGxheWVyKCkgewotICAgICAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGFsLmFkZCgiaHR0cDovL215L2N1c3RvbS9yb2xlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wdGlvbnMuZ2V0VG8oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldEZyb20oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldEZhdWx0VG8oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShvcHRpb25zLmdldFJlcGx5VG8oKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkQWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vQWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJBbiBBeGlzRmF1bHQgc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBBY3Rpb24gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vdGVzdCBwYXNzZWQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEZhdWx0VG8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9GYXVsdFRvIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBvcHRpb25zLmdldEZhdWx0VG8oKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIEZhdWx0VG8gZW5kcG9pbnQgcmVmZXJlbmNlIGlzIG5vdCBudWxsLiIsIGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBGYXVsdFRvIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEZyb20oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9Gcm9tIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBvcHRpb25zLmdldEZyb20oKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIEZyb20gZW5kcG9pbnQgcmVmZXJlbmNlIGlzIG5vdCBudWxsLiIsIGVwcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBGcm9tIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZE1lc3NhZ2VJRCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub01lc3NhZ2VJRCIpOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG9wdGlvbnMuZ2V0TWVzc2FnZUlkKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwoIlRoZSBtZXNzYWdlIGlkIGlzIG5vdCBudWxsLiIsIG1lc3NhZ2VJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBNZXNzYWdlSUQgaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkUmVwbHlUbygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub1JlcGx5VG8iKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG9wdGlvbnMuZ2V0UmVwbHlUbygpOwotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBlcHIuZ2V0QWRkcmVzcygpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBhZGRyZXNzIG9mIHRoZSBSZXBseVRvIGVuZHBvaW50IHJlZmVyZW5jZSBpcyBub3QgdGhlIGFub255bW91cyBVUkkuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMLCBhZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIFJlcGx5VG8gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkVG8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9UbyIpOwotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gb3B0aW9ucy5nZXRUbygpOwotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBlcHIuZ2V0QWRkcmVzcygpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBhZGRyZXNzIG9mIHRoZSBUbyBlbmRwb2ludCByZWZlcmVuY2UgaXMgbm90IHRoZSBhbm9ueW1vdXMgVVJJLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCwgYWRkcmVzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gZHVlIHRvIGEgbWlzc2luZyBUbyBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmZXJlbnRTb2FwQWN0aW9uUHJvY2Vzc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPSAidmFsaWQtbWVzc2FnZXMvIiArIHZlcnNpb25EaXJlY3RvcnkgKyAiL3NvYXBtZXNzYWdlLnhtbCI7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWMuc2V0U29hcEFjdGlvbigiaHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvZGlmZmVyZW50QWN0aW9uIik7Ci0gICAgICAgICAgICBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyh0ZXN0ZmlsZSwgbWMpOwotICAgICAgICAgICAgZmFpbCgiQW4gQXhpc0ZhdWx0IHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byB0aGUgc29hcGFjdGlvbiBiZWluZyBkaWZmZXJlbnQgdG8gdGhlIHdzLWEgYWN0aW9uLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vVGVzdCBwYXNzZWQuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZVNvYXBBY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3RmaWxlID0gInZhbGlkLW1lc3NhZ2VzLyIgKyB2ZXJzaW9uRGlyZWN0b3J5ICsgIi9zb2FwbWVzc2FnZS54bWwiOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgbWMuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1jLnNldFNvYXBBY3Rpb24oImh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbiIpOwotICAgICAgICAgICAgYmFzaWNFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnModGVzdGZpbGUsIG1jKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biB3aGlsZSB0ZXN0aW5nIHdpdGggYSBzb2FwYWN0aW9uIGFuZCB3cy1hIGFjdGlvbiB0aGF0IGFyZSB0aGUgc2FtZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVNvYXBBY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3RmaWxlID0gInZhbGlkLW1lc3NhZ2VzLyIgKyB2ZXJzaW9uRGlyZWN0b3J5ICsgIi9zb2FwbWVzc2FnZS54bWwiOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1jLnNldFNvYXBBY3Rpb24oIiIpOwotICAgICAgICAgICAgYmFzaWNFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnModGVzdGZpbGUsIG1jKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biB3aGlsZSB0ZXN0aW5nIHdpdGggYW4gZW1wdHkgc29hcGFjdGlvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU29hcEFjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPSAidmFsaWQtbWVzc2FnZXMvIiArIHZlcnNpb25EaXJlY3RvcnkgKyAiL3NvYXBtZXNzYWdlLnhtbCI7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWMuc2V0U29hcEFjdGlvbihudWxsKTsKLSAgICAgICAgICAgIGJhc2ljRXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzKHRlc3RmaWxlLCBtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgYWYucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIHVuZXhwZWN0ZWQgQXhpc0ZhdWx0IHdhcyB0aHJvd24gd2hpbGUgdGVzdGluZyB3aXRoIGEgbnVsbCBzb2FwYWN0aW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVQUkhhc0NvcnJlY3RNZXRhZGF0YShFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKLSAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhID0gZXByLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWQgPSAoT01FbGVtZW50KW1ldGFkYXRhLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhtZC5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiIsICJNZXRhRXh0IikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1kLmdldFRleHQoKSwgIjEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1kLmdldEF0dHJpYnV0ZVZhbHVlKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL25hbWVzcGFjZXMvYXhpczIiLCAiQXR0ckV4dCIpKSwgIjEyMzQ1Njc4OSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFpbCgiTm8gTWV0YWRhdGEgZm91bmQgaW4gRVBSIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdJbkZhdWx0SGFuZGxlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y1NmE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy51dGlsLlRlc3RVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdJbkZhdWx0SGFuZGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBUZXN0VXRpbCB0ZXN0VXRpbCA9IG5ldyBUZXN0VXRpbCgpOwotCi0gICAgLyoqIEBwYXJhbSB0ZXN0TmFtZSAgKi8KLSAgICBwdWJsaWMgQWRkcmVzc2luZ0luRmF1bHRIYW5kbGVyVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWRkcmVzc2luZ0hlYWRlcldzYVRvU09BUDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNGYXVsdCBhZiA9IGdldEZhdWx0Rm9yVGVzdCgiSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZmF1bHQgY29kZSEiLAotICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5RTkFNRV9JTlZBTElEX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgT01FbGVtZW50IHByb2JIZWFkZXJEZXRhaWwgPSBhZi5nZXRGYXVsdERldGFpbEVsZW1lbnQoKS5nZXRGaXJzdENoaWxkV2l0aE5hbWUoCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5RTkFNRV9QUk9CTEVNX0hFQURFUik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJvYkhlYWRlckRldGFpbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLlFOQU1FX1dTQV9UTywKLSAgICAgICAgICAgICAgICAgICAgIHByb2JIZWFkZXJEZXRhaWwuZ2V0VGV4dEFzUU5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdBY3Rpb25TT0FQMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc0ZhdWx0IGFmID0gZ2V0RmF1bHRGb3JUZXN0KCJNZXNzYWdlQWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkIiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWYpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWRkcmVzc2luZ0hlYWRlcldzYVRvU09BUDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNGYXVsdCBhZiA9IGdldEZhdWx0Rm9yVGVzdCgiSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGZhdWx0IGNvZGUiLCBTT0FQMTJDb25zdGFudHMuUU5BTUVfU0VOREVSX0ZBVUxUQ09ERSwgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICBMaXN0IHN1YkNvZGVzID0gYWYuZ2V0RmF1bHRTdWJDb2RlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN1YkNvZGVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN1YkNvZGVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZmF1bHQgc3ViY29kZSIsCi0gICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgc3ViQ29kZXMuZ2V0KDApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0FjdGlvblNPQVAxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzRmF1bHQgYWYgPSBnZXRGYXVsdEZvclRlc3QoIk1lc3NhZ2VBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQiLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYWYpOwotICAgIH0KLQotICAgIHByaXZhdGUgQXhpc0ZhdWx0IGdldEZhdWx0Rm9yVGVzdChTdHJpbmcgdGVzdE5hbWUsIGJvb2xlYW4gaXNTT0FQMTEpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPQotICAgICAgICAgICAgICAgICJmYXVsdC1tZXNzYWdlcy8iICsgKGlzU09BUDExID8gInNvYXAxMSIgOiAic29hcDEyIikgKyAiLyIgKyB0ZXN0TmFtZSArICIueG1sIjsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgb21CdWlsZGVyID0gdGVzdFV0aWwuZ2V0T01CdWlsZGVyKHRlc3RmaWxlKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gKChTT0FQRW52ZWxvcGUpb21CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtc2dDb250ZXh0LnNldENvbmZpZ3VyYXRpb25Db250ZXh0KAotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgQWRkcmVzc2luZ0luSGFuZGxlciBhZmloID0gbmV3IEFkZHJlc3NpbmdJbkhhbmRsZXIoKTsKLSAgICAgICAgYWZpaC5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgIEFkZHJlc3NpbmdJbkZhdWx0SGFuZGxlciBhaWZoID0gbmV3IEFkZHJlc3NpbmdJbkZhdWx0SGFuZGxlcigpOwotICAgICAgICBhaWZoLmludm9rZShtc2dDb250ZXh0KTsKLQotICAgICAgICByZXR1cm4gKEF4aXNGYXVsdCltc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5JTkJPVU5EX0ZBVUxUX09WRVJSSURFKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luSGFuZGxlclRlc3RCYXNlLmphdmEgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdJbkhhbmRsZXJUZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRlOGFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0luSGFuZGxlclRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy51dGlsLlRlc3RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWRkcmVzc2luZ0luSGFuZGxlclRlc3RCYXNlIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nSW5IYW5kbGVyVGVzdEJhc2UuY2xhc3MpOwotICAgIEFkZHJlc3NpbmdJbkhhbmRsZXIgaW5IYW5kbGVyOwotICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlOwotICAgIFRlc3RVdGlsIHRlc3RVdGlsID0gbmV3IFRlc3RVdGlsKCk7Ci0gICAgU3RyaW5nIHRlc3RGaWxlTmFtZSA9ICJzb2FwbWVzc2FnZS54bWwiOwotCi0gICAgU3RyaW5nIHZlcnNpb25EaXJlY3Rvcnk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uIjsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlSUQgPSAidXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTUiOwotICAgIFN0cmluZyBmcm9tQWRkcmVzczsKLSAgICBTdHJpbmcgc2Vjb25kUmVsYXRpb25zaGlwVHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyBmYXVsdEFkZHJlc3MgPSAiaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2ZhdWx0IjsKLSAgICBwcml2YXRlIFN0cmluZyByZXBseUFkZHJlc3MgPSAiaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtL2FjY3QiOwotICAgIHByaXZhdGUgU3RyaW5nIHRvQWRkcmVzcyA9ICJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI7Ci0KLSAgICAvKiogQHBhcmFtIHRlc3ROYW1lICAqLwotICAgIHB1YmxpYyBBZGRyZXNzaW5nSW5IYW5kbGVyVGVzdEJhc2UoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyhTdHJpbmcgdGVzdE1lc3NhZ2VQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIG9tQnVpbGRlciA9IHRlc3RVdGlsLmdldE9NQnVpbGRlcih0ZXN0TWVzc2FnZVBhdGgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoU09BUEVudmVsb3BlKW9tQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICBpbkhhbmRsZXIuaW52b2tlKG1jKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT3B0aW9ucyBleHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnMoUm9sZVBsYXllciByb2xlUGxheWVyKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ZmlsZSA9ICJ2YWxpZC1tZXNzYWdlcy8iICsgdmVyc2lvbkRpcmVjdG9yeSArICIvIiArIHRlc3RGaWxlTmFtZTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uQ29udGV4dCBjb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgaWYgKHJvbGVQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbWMuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNPQVBfUk9MRV9QTEFZRVJfUEFSQU1FVEVSLCByb2xlUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyh0ZXN0ZmlsZSwgbWMpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG1jLmdldE9wdGlvbnMoKTsKLQotICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKCJBZGRyZXNzaW5nIEluZm9ybWF0aW9uIEhlYWRlcnMgaGF2ZSBub3QgYmVlbiByZXRyaWV2ZWQgcHJvcGVybHkiKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoImFjdGlvbiBoZWFkZXIgaXMgbm90IGNvcnJlY3QiLCBhY3Rpb24sIG9wdGlvbnMuZ2V0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRBY3Rpb25IYXNFeHRlbnNpYmlsaXR5QXR0cmlidXRlKG1jKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlIGlkIGhlYWRlciBpcyBub3QgY29ycmVjdCIsCi0gICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldE1lc3NhZ2VJZCgpLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJRC50cmltKCkpOwotICAgICAgICBhc3NlcnRNZXNzYWdlSURIYXNFeHRlbnNpYmlsaXR5QXR0cmlidXRlKG1jKTsKLQotICAgICAgICBhc3NlcnRGdWxsRnJvbUVQUihvcHRpb25zLmdldEZyb20oKSk7Ci0gICAgICAgIGFzc2VydEZ1bGxGYXVsdEVQUihvcHRpb25zLmdldEZhdWx0VG8oKSk7Ci0gICAgICAgIGFzc2VydEZ1bGxSZXBseVRvRVBSKG9wdGlvbnMuZ2V0UmVwbHlUbygpKTsKLQotICAgICAgICBhc3NlcnRSZWxhdGlvbnNoaXBzKG9wdGlvbnMpOwotCi0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5KFN0cmluZyBoZWFkZXJOYW1lKSB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ZmlsZSA9ICJpbnZhbGlkLWNhcmRpbmFsaXR5LW1lc3NhZ2VzLyIgKyB2ZXJzaW9uRGlyZWN0b3J5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIi9pbnZhbGlkQ2FyZGluYWxpdHkiICsgaGVhZGVyTmFtZSArICJNZXNzYWdlLnhtbCI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgbWMuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiYXNpY0V4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyh0ZXN0ZmlsZSwgbWMpOwotICAgICAgICAgICAgICAgIGZhaWwoIkFuIEF4aXNGYXVsdCBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBkdWUgdG8gMiB3c2E6IiArIGhlYWRlck5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgIiBoZWFkZXJzLiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJObyBSZXBseVRvIHNob3VsZCBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0IiwgbWMuZ2V0UmVwbHlUbygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSZXBseVRvRVBSKG1jLmdldFJlcGx5VG8oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0ZBVUxUX1RPKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJObyBGYXVsdFRvIHNob3VsZCBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0IiwgbWMuZ2V0RmF1bHRUbygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYXVsdEVQUihtYy5nZXRGYXVsdFRvKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIk5vIEFjdGlvbiBzaG91bGQgYmUgc2V0IG9uIHRoZSBNZXNzYWdlQ29udGV4dCIsIG1jLmdldFdTQUFjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldTQUFjdGlvbiBwcm9wZXJ0eSBpcyBub3QgY29ycmVjdCIsIG1jLmdldFdTQUFjdGlvbigpLCBhY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9NRVNTQUdFX0lEKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJObyBNZXNzYWdlSUQgc2hvdWxkIGJlIHNldCBvbiB0aGUgTWVzc2FnZUNvbnRleHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jLmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2VJRCBwcm9wZXJ0eSBpcyBub3QgY29ycmVjdCIsIG1jLmdldE1lc3NhZ2VJRCgpLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJRC50cmltKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GUk9NKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJObyBGcm9tIHNob3VsZCBiZSBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0IiwgbWMuZ2V0RnJvbSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGcm9tRVBSKG1jLmdldEZyb20oKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1RPKSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJObyBUbyBzaG91bGQgYmUgc2V0IG9uIHRoZSBNZXNzYWdlQ29udGV4dCIsIG1jLmdldFRvKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRvRVBSKG1jLmdldFRvKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT3B0aW9ucyB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycyhTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVzdGZpbGUgPQotICAgICAgICAgICAgICAgICJvbWl0dGVkLWhlYWRlci1tZXNzYWdlcy8iICsgdmVyc2lvbkRpcmVjdG9yeSArICIvIiArIHRlc3ROYW1lICsgIk1lc3NhZ2UueG1sIjsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNjKTsKLSAgICAgICAgYmFzaWNFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnModGVzdGZpbGUsIG1jKTsKLQotICAgICAgICByZXR1cm4gbWMuZ2V0T3B0aW9ucygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHlSZXBseVRvKCkgewotICAgICAgICB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5KAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5RmF1bHRUbygpIHsKLSAgICAgICAgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9GQVVMVF9UTyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eUFjdGlvbigpIHsKLSAgICAgICAgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHlNZXNzYWdlSUQoKSB7Ci0gICAgICAgIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHkoCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfTUVTU0FHRV9JRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eUZyb20oKSB7Ci0gICAgICAgIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNJbnZhbGlkQ2FyZGluYWxpdHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRlJPTSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVyc0ludmFsaWRDYXJkaW5hbGl0eVRvKCkgewotICAgICAgICB0ZXN0RXh0cmFjdEFkZHJlc3NpbmdJbmZvcm1hdGlvbkZyb21IZWFkZXJzSW52YWxpZENhcmRpbmFsaXR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1RPKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RnJvbUVQUihFbmRwb2ludFJlZmVyZW5jZSBmcm9tRVBSKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWRkcmVzcyBpbiBGcm9tIEVQUiBpcyBub3QgdmFsaWQiLAotICAgICAgICAgICAgICAgICAgICAgZnJvbUVQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgZnJvbUFkZHJlc3MudHJpbSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmF1bHRFUFIoRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRFUFIpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIGluIEZhdWx0VG8gRVBSIGlzIG5vdCB2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICBmYXVsdEVQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgZmF1bHRBZGRyZXNzLnRyaW0oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlcGx5VG9FUFIoRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlFUFIpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIGluIFJlcGx5dFRvIEVQUiBpcyBub3QgdmFsaWQiLAotICAgICAgICAgICAgICAgICAgICAgcmVwbHlFUFIuZ2V0QWRkcmVzcygpLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgIHJlcGx5QWRkcmVzcy50cmltKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUb0VQUihFbmRwb2ludFJlZmVyZW5jZSB0b0VQUikgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9FUFIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3MgaW4gVG8gRVBSIGlzIG5vdCB2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICB0b0VQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgdG9BZGRyZXNzLnRyaW0oKSk7Ci0gICAgICAgIGFzc2VydEVQUkFkZHJlc3NIYXNFeHRlbnNpYmlsaXR5QXR0cmlidXRlKHRvRVBSKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RnVsbEZyb21FUFIoRW5kcG9pbnRSZWZlcmVuY2UgZnJvbUVQUikgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3MgaW4gRnJvbSBFUFIgaXMgbm90IHZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgIGZyb21FUFIuZ2V0QWRkcmVzcygpLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgIGZyb21BZGRyZXNzLnRyaW0oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUoZnJvbUVQUik7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RSZWZlcmVuY2VQYXJhbWV0ZXJzKGZyb21FUFIpOwotICAgICAgICBhc3NlcnRFUFJIYXNDb3JyZWN0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKGZyb21FUFIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGdWxsRmF1bHRFUFIoRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRFUFIpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIGluIEZhdWx0VG8gRVBSIGlzIG5vdCB2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICBmYXVsdEVQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgZmF1bHRBZGRyZXNzLnRyaW0oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUoZmF1bHRFUFIpOwotICAgICAgICBhc3NlcnRFUFJIYXNDb3JyZWN0UmVmZXJlbmNlUGFyYW1ldGVycyhmYXVsdEVQUik7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RFeHRlbnNpYmlsaXR5RWxlbWVudHMoZmF1bHRFUFIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGdWxsUmVwbHlUb0VQUihFbmRwb2ludFJlZmVyZW5jZSByZXBseUVQUikgewotICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZHJlc3MgaW4gUmVwbHl0VG8gRVBSIGlzIG5vdCB2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICByZXBseUVQUi5nZXRBZGRyZXNzKCkudHJpbSgpLAotICAgICAgICAgICAgICAgICAgICAgcmVwbHlBZGRyZXNzLnRyaW0oKSk7Ci0gICAgICAgIGFzc2VydEVQUkhhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUocmVwbHlFUFIpOwotICAgICAgICBhc3NlcnRFUFJIYXNDb3JyZWN0UmVmZXJlbmNlUGFyYW1ldGVycyhyZXBseUVQUik7Ci0gICAgICAgIGFzc2VydEVQUkhhc0NvcnJlY3RFeHRlbnNpYmlsaXR5RWxlbWVudHMocmVwbHlFUFIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFUFJIYXNDb3JyZWN0UmVmZXJlbmNlUGFyYW1ldGVycyhFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKLSAgICAgICAgLy88d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIC8vICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4KLSAgICAgICAgLy8gIDxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PgotICAgICAgICAvLzwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIE1hcCByZWZlcmVuY2VQYXJhbWV0ZXJzID0gZXByLmdldEFsbFJlZmVyZW5jZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlZnBhcm0xID0gKE9NRWxlbWVudClyZWZlcmVuY2VQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIC5nZXQobmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iLCAiQ3VzdG9tZXJLZXkiKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlZnBhcm0xKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVmZXJlbmNlUGFyYW1ldGVyIHZhbHVlIGluY29ycmVjdC4iLCByZWZwYXJtMS5nZXRUZXh0KCksICIxMjM0NTY3ODkiKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IHJlZnBhcm0yID0gKE9NRWxlbWVudClyZWZlcmVuY2VQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIC5nZXQobmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iLCAiU2hvcHBpbmdDYXJ0IikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWZwYXJtMik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlZmVyZW5jZVBhcmFtZXRlciB2YWx1ZSBpbmNvcnJlY3QuIiwgcmVmcGFybTIuZ2V0VGV4dCgpLCAiQUJDREVGRyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFpbCgiTm8gUmVmZXJlbmNlUGFyYW1ldGVycyBmb3VuZCBpbiBFUFIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBY3Rpb25IYXNFeHRlbnNpYmlsaXR5QXR0cmlidXRlKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIGJvb2xlYW4gYXR0cmlidXRlRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSAoQXJyYXlMaXN0KW1jLmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuQUNUSU9OX0FUVFJJQlVURVMpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb2EgPSAoT01BdHRyaWJ1dGUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9hLmdldExvY2FsTmFtZSgpLmVxdWFscygiQXR0ckV4dCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdHRyaWJ1dGUgdmFsdWUgaW5jb3JyZWN0bHkgZGVzZXJpYWxpc2VkIiwgb2EuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGUgbm90IGZvdW5kIG9uIEFjdGlvbiIsIGF0dHJpYnV0ZUZvdW5kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZUlESGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBib29sZWFuIGF0dHJpYnV0ZUZvdW5kID0gZmFsc2U7Ci0gICAgICAgIEFycmF5TGlzdCBhdHRyaWJ1dGVzID0gKEFycmF5TGlzdCltYy5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLk1FU1NBR0VJRF9BVFRSSUJVVEVTKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9hID0gKE9NQXR0cmlidXRlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkF0dHJFeHQiKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXR0cmlidXRlIHZhbHVlIGluY29ycmVjdGx5IGRlc2VyaWFsaXNlZCIsIG9hLmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIkV4dGVuc2liaWxpdHkgYXR0cmlidXRlIG5vdCBmb3VuZCBvbiBNZXNzYWdlSUQiLCBhdHRyaWJ1dGVGb3VuZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlbGF0ZXNUb0hhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUoUmVsYXRlc1RvIHJ0KSB7Ci0gICAgICAgIGJvb2xlYW4gYXR0cmlidXRlRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBydC5nZXRFeHRlbnNpYmlsaXR5QXR0cmlidXRlcygpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb2EgPSAoT01BdHRyaWJ1dGUpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9hLmdldExvY2FsTmFtZSgpLmVxdWFscygiQXR0ckV4dCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdHRyaWJ1dGUgdmFsdWUgaW5jb3JyZWN0bHkgZGVzZXJpYWxpc2VkIiwgb2EuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGUgbm90IGZvdW5kIG9uIFJlbGF0ZXNUbyIsIGF0dHJpYnV0ZUZvdW5kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RVBSQWRkcmVzc0hhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUoRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7Ci0gICAgICAgIGJvb2xlYW4gYXR0cmlidXRlRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBlcHIuZ2V0QWRkcmVzc0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9hID0gKE9NQXR0cmlidXRlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvYS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkF0dHJFeHQiKSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXR0cmlidXRlIHZhbHVlIGluY29ycmVjdGx5IGRlc2VyaWFsaXNlZCIsIG9hLmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIkV4dGVuc2liaWxpdHkgYXR0cmlidXRlIG5vdCBmb3VuZCBvbiBFUFIgQWRkcmVzcyIsIGF0dHJpYnV0ZUZvdW5kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RVBSSGFzRXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZShFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKLSAgICAgICAgYm9vbGVhbiBhdHRyaWJ1dGVGb3VuZCA9IGZhbHNlOwotICAgICAgICBBcnJheUxpc3QgYXR0cmlidXRlcyA9IGVwci5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvYSA9IChPTUF0dHJpYnV0ZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAob2EuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJBdHRyRXh0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkF0dHJpYnV0ZSB2YWx1ZSBpbmNvcnJlY3RseSBkZXNlcmlhbGlzZWQiLCBvYS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJFeHRlbnNpYmlsaXR5IGF0dHJpYnV0ZSBub3QgZm91bmQgb24gRVBSIiwgYXR0cmlidXRlRm91bmQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFUFJIYXNDb3JyZWN0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgewotICAgICAgICBBcnJheUxpc3QgZWVsZW1lbnRzID0gZXByLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotICAgICAgICBpZiAoZWVsZW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlZSA9IChPTUVsZW1lbnQpZWVsZW1lbnRzLmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiIsICJFUFJFeHQiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWUuZ2V0VGV4dCgpLCAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZWUuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMiIsICJBdHRyRXh0IikpLCAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJObyBFeHRlbnNpYmlsaXR5IEVsZW1lbnRzIGZvdW5kIGluIEVQUiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlbGF0aW9uc2hpcHMoT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3B0aW9ucy5nZXRSZWxhdGVzVG8oKSk7Ci0gICAgICAgIGFzc2VydFJlbGF0ZXNUb0hhc0V4dGVuc2liaWxpdHlBdHRyaWJ1dGUob3B0aW9ucy5nZXRSZWxhdGVzVG8oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcHRpb25zLmdldFJlbGF0ZXNUbygpLmdldFZhbHVlKCksICJodHRwOi8vc29tZS5wcmV2aW91cy5tZXNzYWdlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcHRpb25zLmdldFJlbGF0ZXNUbyhzZWNvbmRSZWxhdGlvbnNoaXBUeXBlKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9pZGVudGlmaWVyLm9mLm90aGVyLm1lc3NhZ2UvIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nT3V0SGFuZGxlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2FkZHJlc3NpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL2FkZHJlc3NpbmcvQWRkcmVzc2luZ091dEhhbmRsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1N2E5YTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nT3V0SGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS51dGlsLlhNTENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnV0aWwuVGVzdFV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ091dEhhbmRsZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBBZGRyZXNzaW5nQ29uc3RhbnRzIHsKLSAgICBwcml2YXRlIEFkZHJlc3NpbmdPdXRIYW5kbGVyIG91dEhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHh0OwotICAgIHByaXZhdGUgVGVzdFV0aWwgdGVzdFV0aWw7Ci0KLSAgICBwdWJsaWMgQWRkcmVzc2luZ091dEhhbmRsZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgb3V0SGFuZGxlciA9IG5ldyBBZGRyZXNzaW5nT3V0SGFuZGxlcigpOwotICAgICAgICB0ZXN0VXRpbCA9IG5ldyBUZXN0VXRpbCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFRvU09BUEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMiKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLyIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCAiUmVmZXJlbmNlIiArIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCksCi0gICAgICAgICAgICAgICAgICAgICJWYWx1ZSAiICsgaSAqIDEwMCk7Ci0KLSAgICAgICAgfQotCi0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGRlZmF1bHRFbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHh0ID0gY29uZmlnQ3R4LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoV1NfQUREUkVTU0lOR19WRVJTSU9OLCBTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICBtc2dDdHh0LnNldFRvKGVwcik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UmVwbHlUbyhyZXBseVRvKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRFbnZlbG9wZShkZWZhdWx0RW52ZWxvcGUpOwotICAgICAgICBtc2dDdHh0LnNldFdTQUFjdGlvbigiaHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb24iKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRNZXNzYWdlSUQoInVybjp0ZXN0OjEyMyIpOwotCi0gICAgICAgIE9NQXR0cmlidXRlIGV4dEF0dHIgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUF0dHJpYnV0ZSgiQXR0ckV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF4aXMyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5Iik7Ci0gICAgICAgIEFycmF5TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYWwuYWRkKGV4dEF0dHIpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5BQ1RJT05fQVRUUklCVVRFUywgYWwpOwotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuTUVTU0FHRUlEX0FUVFJJQlVURVMsIGFsKTsKLQotICAgICAgICBvdXRIYW5kbGVyLmludm9rZShtc2dDdHh0KTsKLQotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBvbUJ1aWxkZXIgPSB0ZXN0VXRpbC5nZXRPTUJ1aWxkZXIoImVwclRlc3QueG1sIik7Ci0KLSAgICAgICAgWE1MQ29tcGFyYXRvciB4bWxDb21wYXJhdG9yID0gbmV3IFhNTENvbXBhcmF0b3IoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgIHhtbENvbXBhcmF0b3IuY29tcGFyZShvbUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRFbnZlbG9wZSkpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckNyZWF0aW9uRnJvbU1zZ0N0eHRJbmZvcm1hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIG1zZ0N0eHQgPSBjZmdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihuZXcgUU5hbWUoIlJlZmVyZW5jZTIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgMjAwIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0RnJvbShlcHIpOwotCi0gICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy50by5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9yZWZlcmVuY2Uub3JnIiwgIlJlZmVyZW5jZTQiLCAibXlSZWYiKSwKLSAgICAgICAgICAgICAgICAiVmFsdWUgNDAwIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vcmVmZXJlbmNlLm9yZyIsICJSZWZlcmVuY2UzIiwgIm15UmVmIiksCi0gICAgICAgICAgICAgICAgIlZhbHVlIDMwMCIpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0VG8oZXByKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShXU19BRERSRVNTSU5HX1ZFUlNJT04sIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0KLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnJlcGx5VG8ub3JnL3NlcnZpY2UvIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UmVwbHlUbyhlcHIpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0TWVzc2FnZUlEKCIxMjM0NTYtNzg5MCIpOwotICAgICAgICBtc2dDdHh0LnNldFdTQUFjdGlvbigiaHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb24iKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvIHJlbGF0ZXNUbyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnJlbGF0ZXNUby5vcmcvc2VydmljZS8iLCAiVGVzdFJlbGF0aW9uIik7Ci0gICAgICAgIG1zZ0N0eHQuYWRkUmVsYXRlc1RvKHJlbGF0ZXNUbyk7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRFbnZlbG9wZSgKLSAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICBvdXRIYW5kbGVyLmludm9rZShtc2dDdHh0KTsKLQotICAgICAgICBYTUxDb21wYXJhdG9yIHhtbENvbXBhcmF0b3IgPSBuZXcgWE1MQ29tcGFyYXRvcigpOwotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgIHhtbENvbXBhcmF0b3IuY29tcGFyZShtc2dDdHh0LmdldEVudmVsb3BlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RVdGlsLmdldE9NQnVpbGRlcigiT3V0SGFuZGxlclRlc3QueG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnRFbGVtZW50KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVzdFVuZGVyc3RhbmRTdXBwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERfTVVTVF9VTkRFUlNUQU5EX1RPX0FERFJFU1NJTkdfSEVBREVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG5ldyBRTmFtZSgiUmVmZXJlbmNlMiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSAyMDAiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRGcm9tKGVwcik7Ci0KLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3JlZmVyZW5jZS5vcmciLCAiUmVmZXJlbmNlNCIsICJteVJlZiIpLAotICAgICAgICAgICAgICAgICJWYWx1ZSA0MDAiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9yZWZlcmVuY2Uub3JnIiwgIlJlZmVyZW5jZTMiLCAibXlSZWYiKSwKLSAgICAgICAgICAgICAgICAiVmFsdWUgMzAwIik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRUbyhlcHIpOwotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KFdTX0FERFJFU1NJTkdfVkVSU0lPTiwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRSZXBseVRvKGVwcik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRNZXNzYWdlSUQoIjEyMzQ1Ni03ODkwIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8gcmVsYXRlc1RvID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLyIsICJUZXN0UmVsYXRpb24iKTsKLSAgICAgICAgbXNnQ3R4dC5hZGRSZWxhdGVzVG8ocmVsYXRlc1RvKTsKLQotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKAotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIFhNTENvbXBhcmF0b3IgeG1sQ29tcGFyYXRvciA9IG5ldyBYTUxDb21wYXJhdG9yKCk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgeG1sQ29tcGFyYXRvci5jb21wYXJlKG1zZ0N0eHQuZ2V0RW52ZWxvcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFV0aWwuZ2V0T01CdWlsZGVyKCJtdXN0VW5kZXJzdGFuZFRlc3QueG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnRFbGVtZW50KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUFJvbGVTdXBwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5TT0FQX1JPTEVfRk9SX0FERFJFU1NJTkdfSEVBREVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJuOnRlc3Q6cm9sZSIpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG5ldyBRTmFtZSgiUmVmZXJlbmNlMiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSAyMDAiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRGcm9tKGVwcik7Ci0KLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnRvLm9yZy9zZXJ2aWNlLyIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3JlZmVyZW5jZS5vcmciLCAiUmVmZXJlbmNlNCIsICJteVJlZiIpLAotICAgICAgICAgICAgICAgICJWYWx1ZSA0MDAiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9yZWZlcmVuY2Uub3JnIiwgIlJlZmVyZW5jZTMiLCAibXlSZWYiKSwKLSAgICAgICAgICAgICAgICAiVmFsdWUgMzAwIik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRUbyhlcHIpOwotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KFdTX0FERFJFU1NJTkdfVkVSU0lPTiwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRSZXBseVRvKGVwcik7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRNZXNzYWdlSUQoIjEyMzQ1Ni03ODkwIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8gcmVsYXRlc1RvID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG8oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cucmVsYXRlc1RvLm9yZy9zZXJ2aWNlLyIsICJUZXN0UmVsYXRpb24iKTsKLSAgICAgICAgbXNnQ3R4dC5hZGRSZWxhdGVzVG8ocmVsYXRlc1RvKTsKLQotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKAotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIFhNTENvbXBhcmF0b3IgeG1sQ29tcGFyYXRvciA9IG5ldyBYTUxDb21wYXJhdG9yKCk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgeG1sQ29tcGFyYXRvci5jb21wYXJlKG1zZ0N0eHQuZ2V0RW52ZWxvcGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFV0aWwuZ2V0T01CdWlsZGVyKCJzb2FwMTFyb2xlVGVzdC54bWwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTJSb2xlU3VwcG9ydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIG1zZ0N0eHQgPSBjZmdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBtc2dDdHh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuU09BUF9ST0xFX0ZPUl9BRERSRVNTSU5HX0hFQURFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybjp0ZXN0OnJvbGUiKTsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihuZXcgUU5hbWUoIlJlZmVyZW5jZTIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgMjAwIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0RnJvbShlcHIpOwotCi0gICAgICAgIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3d3dy50by5vcmcvc2VydmljZS8iKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9yZWZlcmVuY2Uub3JnIiwgIlJlZmVyZW5jZTQiLCAibXlSZWYiKSwKLSAgICAgICAgICAgICAgICAiVmFsdWUgNDAwIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vcmVmZXJlbmNlLm9yZyIsICJSZWZlcmVuY2UzIiwgIm15UmVmIiksCi0gICAgICAgICAgICAgICAgIlZhbHVlIDMwMCIpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0VG8oZXByKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShXU19BRERSRVNTSU5HX1ZFUlNJT04sIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0KLSAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3d3LnJlcGx5VG8ub3JnL3NlcnZpY2UvIik7Ci0gICAgICAgIG1zZ0N0eHQuc2V0UmVwbHlUbyhlcHIpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0TWVzc2FnZUlEKCIxMjM0NTYtNzg5MCIpOwotICAgICAgICBtc2dDdHh0LnNldFdTQUFjdGlvbigiaHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb24iKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvIHJlbGF0ZXNUbyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnJlbGF0ZXNUby5vcmcvc2VydmljZS8iLCAiVGVzdFJlbGF0aW9uIik7Ci0gICAgICAgIG1zZ0N0eHQuYWRkUmVsYXRlc1RvKHJlbGF0ZXNUbyk7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRFbnZlbG9wZSgKLSAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICBvdXRIYW5kbGVyLmludm9rZShtc2dDdHh0KTsKLQotICAgICAgICBYTUxDb21wYXJhdG9yIHhtbENvbXBhcmF0b3IgPSBuZXcgWE1MQ29tcGFyYXRvcigpOwotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgIHhtbENvbXBhcmF0b3IuY29tcGFyZShtc2dDdHh0LmdldEVudmVsb3BlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RVdGlsLmdldE9NQnVpbGRlcigic29hcDEycm9sZVRlc3QueG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG9jdW1lbnRFbGVtZW50KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIHRoaXMgd2lsbCBjaGVjayB3aGV0aGVyIHdlIGNhbiBhZGQgdG8gZXByLCBpZiB0aGVyZSBpcyBvbmUgYWxyZWFkeS4KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByT25lID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd2hhdGV2ZXIub3JnIik7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGR1cGxpY2F0ZUVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3doYXRldmVyLmR1cGxpY2F0ZS5vcmciKTsKLSAgICAgICAgUmVsYXRlc1RvIHJlcGx5ID0gbmV3IFJlbGF0ZXNUbygidXJuOmlkIik7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4dCA9IGNmZ0N0eC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZGVmYXVsdEVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRFbnZlbG9wZShkZWZhdWx0RW52ZWxvcGUpOwotCi0gICAgICAgIG1zZ0N0eHQuYWRkUmVsYXRlc1RvKHJlcGx5KTsKLSAgICAgICAgbXNnQ3R4dC5zZXRUbyhlcHJPbmUpOwotICAgICAgICBtc2dDdHh0LnNldFdTQUFjdGlvbigiaHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb24iKTsKLSAgICAgICAgb3V0SGFuZGxlci5pbnZva2UobXNnQ3R4dCk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSBzb2FwIG1lc3NhZ2Ugd2l0aGluIHRoZSBtc2dDdHh0IG11c3QgaGF2ZSBhIHRvIGhlYWRlci4KLSAgICAgICAgLy8gbGV0cyBpbnZva2UgdHdpY2UgYW5kIHNlZQotICAgICAgICBtc2dDdHh0LnNldFRvKGR1cGxpY2F0ZUVwcik7Ci0gICAgICAgIG91dEhhbmRsZXIuaW52b2tlKG1zZ0N0eHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3doYXRldmVyLm9yZyIsIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKQotICAgICAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkV2l0aE5hbWUoRmluYWwuUU5BTUVfV1NBX1RPKS5nZXRUZXh0KCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpLmdldENoaWxkcmVuV2l0aE5hbWUoRmluYWwuUU5BTUVfV1NBX1JFTEFURVNfVE8pOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoIlJlcGx5IHNob3VsZCBiZSBhZGRlZCB0d2ljZS4iLCAyLCBpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlSGVhZGVyc1dpdGhPdmVycmlkaW5nT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyB0aGlzIHdpbGwgY2hlY2sgd2hldGhlciB3ZSBjYW4gYWRkIHRvIGVwciwgaWYgdGhlcmUgaXMgb25lIGFscmVhZHkuCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwck9uZSA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3doYXRldmVyLm9yZyIpOwotICAgICAgICBSZWxhdGVzVG8gY3VzdG9tID0gbmV3IFJlbGF0ZXNUbygidXJuOmlkIiwgImN1c3RvbVJlbGF0aW9uc2hpcCIpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIG1zZ0N0eHQgPSBjZmdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGRlZmF1bHRFbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIGFkZHJlc3NpbmdOYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoRmluYWwuV1NBX05BTUVTUEFDRSwgV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpLmFkZEhlYWRlckJsb2NrKFdTQV9UTywgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRUZXh0KCJodHRwOi8vb2xkRVBSLm9yZyIpOwotICAgICAgICBzb2FwSGVhZGVyQmxvY2sgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRIZWFkZXJCbG9jayhXU0FfUkVMQVRFU19UTywgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRUZXh0KCJ1cm46aWQiKTsKLSAgICAgICAgc29hcEhlYWRlckJsb2NrID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkuYWRkSGVhZGVyQmxvY2soV1NBX1JFTEFURVNfVE8sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0VGV4dCgidXJuOmlkIik7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jawotICAgICAgICAgICAgICAgIC5hZGRBdHRyaWJ1dGUoV1NBX1JFTEFURVNfVE9fUkVMQVRJT05TSElQX1RZUEUsIGN1c3RvbS5nZXRSZWxhdGlvbnNoaXBUeXBlKCksIG51bGwpOwotICAgICAgICBtc2dDdHh0LnNldEVudmVsb3BlKGRlZmF1bHRFbnZlbG9wZSk7Ci0KLSAgICAgICAgbXNnQ3R4dC5zZXRQcm9wZXJ0eShSRVBMQUNFX0FERFJFU1NJTkdfSEVBREVSUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgbXNnQ3R4dC5hZGRSZWxhdGVzVG8oY3VzdG9tKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRUbyhlcHJPbmUpOwotICAgICAgICBtc2dDdHh0LnNldFdTQUFjdGlvbigiaHR0cDovL3d3dy5hY3Rpb25zLm9yZy9hY3Rpb24iKTsKLSAgICAgICAgb3V0SGFuZGxlci5pbnZva2UobXNnQ3R4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd2hhdGV2ZXIub3JnIiwgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfVE8pLmdldFRleHQoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfUkVMQVRFU19UTyk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ3VzdG9tIHNob3VsZCByZXBsYWNlIHJlcGx5LiIsIDEsIGkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVIZWFkZXJzV2l0aE92ZXJyaWRpbmdPZmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyB0aGlzIHdpbGwgY2hlY2sgd2hldGhlciB3ZSBjYW4gYWRkIHRvIGVwciwgaWYgdGhlcmUgaXMgb25lIGFscmVhZHkuCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwck9uZSA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3doYXRldmVyLm9yZyIpOwotICAgICAgICBSZWxhdGVzVG8gY3VzdG9tID0gbmV3IFJlbGF0ZXNUbygidXJuOmlkIiwgImN1c3RvbVJlbGF0aW9uc2hpcCIpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIG1zZ0N0eHQgPSBjZmdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGRlZmF1bHRFbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIGFkZHJlc3NpbmdOYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoRmluYWwuV1NBX05BTUVTUEFDRSwgV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpLmFkZEhlYWRlckJsb2NrKFdTQV9UTywgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRUZXh0KCJodHRwOi8vb2xkRVBSLm9yZyIpOwotICAgICAgICBzb2FwSGVhZGVyQmxvY2sgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRFbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRIZWFkZXJCbG9jayhXU0FfUkVMQVRFU19UTywgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIHNvYXBIZWFkZXJCbG9jay5zZXRUZXh0KCJ1cm46aWQiKTsKLSAgICAgICAgbXNnQ3R4dC5zZXRFbnZlbG9wZShkZWZhdWx0RW52ZWxvcGUpOwotCi0gICAgICAgIG1zZ0N0eHQuc2V0UHJvcGVydHkoUkVQTEFDRV9BRERSRVNTSU5HX0hFQURFUlMsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBtc2dDdHh0LmFkZFJlbGF0ZXNUbyhjdXN0b20pOwotICAgICAgICBtc2dDdHh0LnNldFRvKGVwck9uZSk7Ci0gICAgICAgIG1zZ0N0eHQuc2V0V1NBQWN0aW9uKCJodHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbiIpOwotICAgICAgICBvdXRIYW5kbGVyLmludm9rZShtc2dDdHh0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vbGRFUFIub3JnIiwgZGVmYXVsdEVudmVsb3BlLmdldEhlYWRlcigpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfVE8pLmdldFRleHQoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICBkZWZhdWx0RW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShGaW5hbC5RTkFNRV9XU0FfUkVMQVRFU19UTyk7Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiQm90aCByZXBseSBhbmQgY3VzdG9tIHNob3VsZCBiZSBmb3VuZC4iLCAyLCBpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdTdWJtaXNzaW9uSW5IYW5kbGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nU3VibWlzc2lvbkluSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkNjE5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdTdWJtaXNzaW9uSW5IYW5kbGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ1N1Ym1pc3Npb25JbkhhbmRsZXJUZXN0IGV4dGVuZHMgQWRkcmVzc2luZ0luSGFuZGxlclRlc3RCYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBZGRyZXNzaW5nU3VibWlzc2lvbkluSGFuZGxlclRlc3QuY2xhc3MpOwotCi0gICAgLyoqIEBwYXJhbSB0ZXN0TmFtZSAgKi8KLSAgICBwdWJsaWMgQWRkcmVzc2luZ1N1Ym1pc3Npb25JbkhhbmRsZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgaW5IYW5kbGVyID0gbmV3IEFkZHJlc3NpbmdJbkhhbmRsZXIoKTsKLSAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFOwotICAgICAgICB2ZXJzaW9uRGlyZWN0b3J5ID0gInN1Ym1pc3Npb24iOwotICAgICAgICBmcm9tQWRkcmVzcyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMiOwotICAgICAgICBzZWNvbmRSZWxhdGlvbnNoaXBUeXBlID0gImF4aXMyOnNvbWUuY3VzdG9tLnJlbGF0aW9uc2hpcCI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBleHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnMobnVsbCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcHRpb25zKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcHRpb25zLmdldFRvKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0QWRkcmVzc2luZ0luZm9ybWF0aW9uRnJvbUhlYWRlcnNDdXN0b21Sb2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRlc3RGaWxlTmFtZSA9ICJzb2FwbWVzc2FnZS5jdXN0b21yb2xlLnhtbCI7Ci0gICAgICAgIGV4dHJhY3RBZGRyZXNzaW5nSW5mb3JtYXRpb25Gcm9tSGVhZGVycyhuZXcgUm9sZVBsYXllcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBMaXN0IGdldFJvbGVzKCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBhbCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBhbC5hZGQoImh0dHA6Ly9teS9jdXN0b20vcm9sZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBhbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVbHRpbWF0ZURlc3RpbmF0aW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub0FjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiQW4gQXhpc0ZhdWx0IHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgQWN0aW9uIGhlYWRlci4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvL3Rlc3QgcGFzc2VkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRGYXVsdFRvKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vRmF1bHRUbyIpOwotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gb3B0aW9ucy5nZXRGYXVsdFRvKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwoIlRoZSBGYXVsdFRvIGVuZHBvaW50IHJlZmVyZW5jZSBpcyBub3QgbnVsbC4iLCBlcHIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgRmF1bHRUbyBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRGcm9tKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vRnJvbSIpOwotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gb3B0aW9ucy5nZXRGcm9tKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwoIlRoZSBGcm9tIGVuZHBvaW50IHJlZmVyZW5jZSBpcyBub3QgbnVsbC4iLCBlcHIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgRnJvbSBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGZhaWwoIiBBbiBFeGNlcHRpb24gaGFzIG9jY3VyZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRNZXNzYWdlSUQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9NZXNzYWdlSUQiKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIEF4aXNGYXVsdCBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIE1lc3NhZ2VJRCBoZWFkZXIuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy90ZXN0IHBhc3NlZAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkTWVzc2FnZUlEUmVwbHlUb0FuZEZhdWx0VG8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9NZXNzYWdlSUROb1JlcGx5VG9Ob0ZhdWx0VG8iKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlSUQgPSBvcHRpb25zLmdldE1lc3NhZ2VJZCgpOwotCi0gICAgICAgICAgICBhc3NlcnROdWxsKCJUaGUgbWVzc2FnZSBpZCBpcyBub3QgbnVsbC4iLCBtZXNzYWdlSUQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIGFmLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCJBbiB1bmV4cGVjdGVkIEF4aXNGYXVsdCB3YXMgdGhyb3duIGR1ZSB0byBtaXNzaW5nIE1lc3NhZ2VJRCwgUmVwbHlUbywgYW5kIEZhdWx0VG8gaGVhZGVycy4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VXaXRoT21pdHRlZFJlcGx5VG8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9SZXBseVRvIik7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBvcHRpb25zLmdldFJlcGx5VG8oKTsKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzID0gZXByLmdldEFkZHJlc3MoKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYWRkcmVzcyBvZiB0aGUgUmVwbHlUbyBlbmRwb2ludCByZWZlcmVuY2UgaXMgbm90IHRoZSBub25lIFVSSS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJLCBhZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBhZi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiQW4gdW5leHBlY3RlZCBBeGlzRmF1bHQgd2FzIHRocm93biBkdWUgdG8gYSBtaXNzaW5nIFJlcGx5VG8gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBmYWlsKCIgQW4gRXhjZXB0aW9uIGhhcyBvY2N1cmVkICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkVG8oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9UbyIpOwotICAgICAgICAgICAgZmFpbCgiQW4gQXhpc0ZhdWx0IHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byBhIG1pc3NpbmcgVG8gaGVhZGVyLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vdGVzdCBwYXNzZWQKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgZmFpbCgiIEFuIEV4Y2VwdGlvbiBoYXMgb2NjdXJlZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvYWRkcmVzc2luZy9BZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3ZjgxZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9hZGRyZXNzaW5nL0FkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5Pbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnV0aWwuVGVzdFV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ1ZhbGlkYXRpb25IYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgQWRkcmVzc2luZ0NvbnN0YW50cyB7Ci0gICAgQWRkcmVzc2luZ0luSGFuZGxlciBpbkhhbmRsZXIgPSBuZXcgQWRkcmVzc2luZ0luSGFuZGxlcigpOwotICAgIEFkZHJlc3NpbmdWYWxpZGF0aW9uSGFuZGxlciB2YWxpZGF0aW9uSGFuZGxlciA9IG5ldyBBZGRyZXNzaW5nVmFsaWRhdGlvbkhhbmRsZXIoKTsKLSAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRTsKLSAgICBTdHJpbmcgdmVyc2lvbkRpcmVjdG9yeSA9ICJmaW5hbCI7Ci0gICAgVGVzdFV0aWwgdGVzdFV0aWwgPSBuZXcgVGVzdFV0aWwoKTsKLQotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycyhTdHJpbmcgdGVzdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGVzdEFkZHJlc3NpbmdNZXNzYWdlKCJvbWl0dGVkLWhlYWRlci1tZXNzYWdlcyIsIHRlc3ROYW1lICsgIk1lc3NhZ2UueG1sIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IHRlc3RBZGRyZXNzaW5nTWVzc2FnZShTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgdGVzdE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3RmaWxlID0gZGlyZWN0b3J5ICsgIi8iICsgdmVyc2lvbkRpcmVjdG9yeSArICIvIiArIHRlc3ROYW1lOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBvbUJ1aWxkZXIgPSB0ZXN0VXRpbC5nZXRPTUJ1aWxkZXIodGVzdGZpbGUpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShvbUJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCkpOwotCi0gICAgICAgIGluSGFuZGxlci5pbnZva2UobWMpOwotCi0gICAgICAgIHJldHVybiBtYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkTWVzc2FnZUlESW5PdXRNRVAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9NZXNzYWdlSUQiKTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKTsKLQotICAgICAgICBhc3NlcnROdWxsKCJUaGUgbWVzc2FnZSBpZCBpcyBub3QgbnVsbC4iLCBtZXNzYWdlSUQpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0aW9uSGFuZGxlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgZmFpbCgiQW4gQXhpc0ZhdWx0IHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byB0aGUgYWJzZW5jZSBvZiBhIG1lc3NhZ2UgaWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy9UZXN0IHBhc3NlZC4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRNZXNzYWdlSURJbk9ubHlNRVAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSB0ZXN0TWVzc2FnZVdpdGhPbWl0dGVkSGVhZGVycygibm9NZXNzYWdlSUQiKTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKTsKLQotICAgICAgICBhc3NlcnROdWxsKCJUaGUgbWVzc2FnZSBpZCBpcyBub3QgbnVsbC4iLCBtZXNzYWdlSUQpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgdmFsaWRhdGlvbkhhbmRsZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZVdpdGhNZXNzYWdlSURJbk91dE1FUCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IHRlc3RNZXNzYWdlV2l0aE9taXR0ZWRIZWFkZXJzKCJub0Zyb20iKTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJRCA9IG1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgbWVzc2FnZSBpZCBpcyBudWxsLiIsIG1lc3NhZ2VJRCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgIHZhbGlkYXRpb25IYW5kbGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluT3V0TWVzc2FnZVdpdGhPbWl0dGVkTWVzc2FnZUlEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gdGVzdE1lc3NhZ2VXaXRoT21pdHRlZEhlYWRlcnMoIm5vTWVzc2FnZUlEIik7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlSUQgPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZUlkKCk7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbCgiVGhlIG1lc3NhZ2UgaWQgaXMgbm90IG51bGwuIiwgbWVzc2FnZUlEKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsaWRhdGlvbkhhbmRsZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gQ29uZmlybSB0aGlzIGlzIHRoZSBjb3JyZWN0IGZhdWx0Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGZhdWx0IGNvZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmYWlsKCJWYWxpZGF0ZWQgbWVzc2FnZSB3aXRoIG1pc3NpbmcgbWVzc2FnZSBJRCEiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy91dGlsL1Rlc3RVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9hZGRyZXNzaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy91dGlsL1Rlc3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTU4YjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvYWRkcmVzc2luZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvdXRpbC9UZXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdFV0aWwgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fRklMRV9OQU1FID0gInNvYXBtZXNzYWdlLnhtbCI7Ci0gICAgcHJvdGVjdGVkIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXN0UmVzb3VyY2VEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRlc3QtcmVzb3VyY2VzIjsKLQotCi0gICAgcHVibGljIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGdldE9NQnVpbGRlcihTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIiIuZXF1YWxzKGZpbGVOYW1lKSB8fCBmaWxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IElOX0ZJTEVfTkFNRTsKLSAgICAgICAgfQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gU3RBWFV0aWxzCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlUmVhZGVyKGdldFRlc3RSZXNvdXJjZUZpbGUoZmlsZU5hbWUpKSk7Ci0gICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIocGFyc2VyLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsIHJlbGF0aXZlUGF0aCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9wb20ueG1sIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTcxN2RlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItY2x1c3RlcmluZzwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBDbHVzdGVyaW5nPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BeGlzMiBDbHVzdGVyaW5nIG1vZHVsZTwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1sb2NhbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpYmVzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdWxpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvY2x1c3RlcmluZzwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmc8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmc8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5tYXZlbi50ZXN0LmhhbHRhZnRlcmZhaWx1cmU8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmZhbHNlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+cnVuLmNsdXN0ZXJpbmcudGVzdHM8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7cnVuLmNsdXN0ZXJpbmcudGVzdHN9PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovVXBkYXRlU3RhdGVUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9Db25maWd1cmF0aW9uTWFuYWdlclRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3RlcmluZ1V0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3RlcmluZ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Y2E2MTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiAgQSBVdGlsaXR5IGZvciBoYW5kbGluZyBzb21lIG9mIHRoZSBmdW5jdGlvbnMgbmVlZGVkIGJ5IHRoZSBjbHVzdGVyaW5nIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbHVzdGVyaW5nVXRpbHMgewotCi0gICAgLyoqCi0gICAgICogTG9hZCBhIFNlcnZpY2VHcm91cCBoYXZpbmcgbmFtZSA8Y29kZT5zZXJ2aWNlR3JvdXBOYW1lPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cE5hbWUKLSAgICAgKiBAcGFyYW0gY29uZmlnQ3R4Ci0gICAgICogQHBhcmFtIHRlbXBEaXJlY3RvcnkKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU2VydmljZUdyb3VwKFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcERpcmVjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghc2VydmljZUdyb3VwTmFtZS5lbmRzV2l0aCgiLmFhciIpKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXBOYW1lICs9ICIuYWFyIjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHNlcnZpY2VBcmNoaXZlOwotICAgICAgICBTdHJpbmcgYXhpczJSZXBvID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnN0YW50cy5BWElTMl9SRVBPKTsKLSAgICAgICAgaWYgKGlzVVJMKGF4aXMyUmVwbykpIHsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gbmV3IERhdGFIYW5kbGVyKG5ldyBVUkwoYXhpczJSZXBvICsgInNlcnZpY2VzLyIgKyBzZXJ2aWNlR3JvdXBOYW1lKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGVtcERpciA9Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG5ldyBSYW5kb20oKS5uZXh0RG91YmxlKCkpOwotICAgICAgICAgICAgbmV3IEZpbGUodGVtcERpcikubWtkaXJzKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlQXJjaGl2ZSA9IG5ldyBGaWxlKHRlbXBEaXIgKyBGaWxlLnNlcGFyYXRvciArIHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzZXJ2aWNlQXJjaGl2ZSk7Ci0gICAgICAgICAgICBkaC53cml0ZVRvKG91dCk7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlcnZpY2VBcmNoaXZlID0gbmV3IEZpbGUoYXhpczJSZXBvICsgRmlsZS5zZXBhcmF0b3IgKyAic2VydmljZXMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyBzZXJ2aWNlR3JvdXBOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZighc2VydmljZUFyY2hpdmUuZXhpc3RzKCkpewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRmlsZSAiICsgc2VydmljZUFyY2hpdmUgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXNHcm91cCA9Ci0gICAgICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5sb2FkU2VydmljZUdyb3VwKHNlcnZpY2VBcmNoaXZlLCBjb25maWdDdHgpOwotICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlR3JvdXAoYXNHcm91cCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VSTChTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvRGVmYXVsdExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvRGVmYXVsdExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTVkYmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0RlZmF1bHRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTG9hZEJhbGFuY2VFdmVudEhhbmRsZXJ9Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgaW1wbGVtZW50cyBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBsaWNhdGlvbk1lbWJlckFkZGVkKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgVGhyZWFkIHRoID0gbmV3IFRocmVhZChuZXcgTWVtYmVyQWRkZXIobWVtYmVyKSk7Ci0gICAgICAgIHRoLnNldFByaW9yaXR5KFRocmVhZC5NQVhfUFJJT1JJVFkpOwotICAgICAgICB0aC5zdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGxpY2F0aW9uTWVtYmVyUmVtb3ZlZChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJBcHBsaWNhdGlvbiBtZW1iZXIgIiArIG1lbWJlciArICIgbGVmdCBjbHVzdGVyLiIpOwotICAgICAgICBtZW1iZXJzLnJlbW92ZShtZW1iZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1lbWJlcj4gZ2V0TWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZW1iZXJBZGRlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIE1lbWJlciBtZW1iZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBNZW1iZXJBZGRlcihNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgICAgICB0aGlzLm1lbWJlciA9IG1lbWJlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FuQ29ubmVjdChtZW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwMCk7ICAgLy8gU2xlZXAgZm9yIHNvbWV0aW1lIHRvIGFsbG93IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBub2RlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1lbWJlcnMuY29udGFpbnMobWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQXBwbGljYXRpb24gbWVtYmVyICIgKyBtZW1iZXIgKyAiIGpvaW5lZCBhcHBsaWNhdGlvbiBjbHVzdGVyIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ291bGQgbm90IGFkZCBhcHBsaWNhdGlvbiBtZW1iZXIgIiArIG1lbWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQmVmb3JlIGFkZGluZyBhIG1lbWJlciwgd2Ugd2lsbCB0cnkgdG8gdmVyaWZ5IHdoZXRoZXIgd2UgY2FuIGNvbm5lY3QgdG8gaXQKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHdob3NlIGNvbm5lY3R2aXR5IG5lZWRzIHRvIGJlIHZlcmlmaWVkCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIG1lbWJlciBjYW4gYmUgY29udGFjdGVkOyBmYWxzZSwgb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhbkNvbm5lY3QoTWVtYmVyIG1lbWJlcikgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gY29ubmVjdCB0byBtZW1iZXIgIiArIG1lbWJlciArICIuLi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IHJldHJpZXMgPSAzMDsgcmV0cmllcyA+IDA7IHJldHJpZXMtLSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUobWVtYmVyLmdldEhvc3ROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaHR0cFBvcnQgPSBtZW1iZXIuZ2V0SHR0cFBvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkhUVFAgUG9ydD0iICsgaHR0cFBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChodHRwUG9ydCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0QWRkcmVzcyBodHRwU29ja2FkZHIgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkciwgaHR0cFBvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvY2tldCgpLmNvbm5lY3QoaHR0cFNvY2thZGRyLCAxMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IGh0dHBzUG9ydCA9IG1lbWJlci5nZXRIdHRwc1BvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkhUVFBTIFBvcnQ9IiArIGh0dHBzUG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBzUG9ydCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0QWRkcmVzcyBodHRwc1NvY2thZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGFkZHIsIGh0dHBzUG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU29ja2V0KCkuY29ubmVjdChodHRwc1NvY2thZGRyLCAxMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmluZGV4T2YoIkNvbm5lY3Rpb24gcmVmdXNlZCIpID09IC0xICYmIG1zZy5pbmRleE9mKCJjb25uZWN0IHRpbWVkIG91dCIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBjb25uZWN0IHRvIG1lbWJlciAiICsgbWVtYmVyLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcExpc3RlbmVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL01lbWJlcnNoaXBMaXN0ZW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkODc0ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcExpc3RlbmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVyc2hpcExpc3RlbmVySW1wbCBpbXBsZW1lbnRzIE1lbWJlcnNoaXBMaXN0ZW5lcnsKLSAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyLCBib29sZWFuIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvcikgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQoTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBpc0xvY2FsTWVtYmVyQ29vcmRpbmF0b3IpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwU2NoZW1lLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcFNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQyZDZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSBtZW1iZXJzaGlwIHNjaGVtZSBzdWNoIGFzICJtdWx0aWNhc3QgYmFzZWQiIG9yICJ3ZWxsLWtub3duIGFkZHJlc3MgKFdLQSkKLSAqIGJhc2VkIiBzY2hlbWVzLiBUaGlzIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIG1lbWJlcnNoaXAgZGlzY292ZXJ5IG1lY2hhbmlzbS4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZW1iZXJzaGlwU2NoZW1lIHsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhpcyBtZW1iZXJzaGlwIHNjaGVtZQotICAgICAqCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGluaXRpYWxpemluZwotICAgICAqLwotICAgIHZvaWQgaW5pdCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBKT0lOIHRoZSBncm91cAotICAgICAqCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGpvaW5pbmcgdGhlIGdyb3VwCi0gICAgICovCi0gICAgdm9pZCBqb2luR3JvdXAoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWZiYmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkZDFiYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVzc2FnZVNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kcy5BcHBseVNlcnZpY2VQb2xpY3lDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzLkNvbW1pdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHMuRXhjZXB0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kcy5Mb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHMuUHJlcGFyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHMuUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHMuUm9sbGJhY2tDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzLlVubG9hZFNlcnZpY2VHcm91cHNDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlU2VuZGVyIHNlbmRlcjsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIHByaXZhdGUgTWFwIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUsIFN0cmluZyBwb2xpY3kpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OmFwcGx5UG9saWN5Iik7Ci0KLSAgICAgICAgQXBwbHlTZXJ2aWNlUG9saWN5Q29tbWFuZCBjb21tYW5kID0gbmV3IEFwcGx5U2VydmljZVBvbGljeUNvbW1hbmQoKTsKLSAgICAgICAgY29tbWFuZC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlR3JvdXBOYW1lKTsKLSAgICAgICAgY29tbWFuZC5zZXRQb2xpY3kocG9saWN5KTsKLSAgICAgICAgc2VuZChjb21tYW5kKTsKLQotICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjo6YXBwbHlQb2xpY3kiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgQ29tbWl0Q29tbWFuZCBjb21tYW5kID0gbmV3IENvbW1pdENvbW1hbmQoKTsKLSAgICAgICAgc2VuZChjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25PY2N1cnJlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgc2VuZGVyLnNlbmRUb0dyb3VwKG5ldyBFeGNlcHRpb25Db21tYW5kKHRocm93YWJsZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlR3JvdXBzKFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OmxvYWRTZXJ2aWNlR3JvdXBzIik7Ci0KLSAgICAgICAgTG9hZFNlcnZpY2VHcm91cHNDb21tYW5kIGNvbW1hbmQgPSBuZXcgTG9hZFNlcnZpY2VHcm91cHNDb21tYW5kKCk7Ci0gICAgICAgIGNvbW1hbmQuc2V0U2VydmljZUdyb3VwTmFtZXMoc2VydmljZUdyb3VwTmFtZXMpOwotICAgICAgICBzZW5kKGNvbW1hbmQpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiRXhpdDogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjpsb2FkU2VydmljZUdyb3VwcyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50ZXI6IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjo6cHJlcGFyZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJlcGFyZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBQcmVwYXJlQ29tbWFuZCgpOwotICAgICAgICBzZW5kKGNvbW1hbmQpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnByZXBhcmUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbG9hZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50ZXI6IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjo6cmVsb2FkQ29uZmlndXJhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IG5ldyBSZWxvYWRDb25maWd1cmF0aW9uQ29tbWFuZCgpOwotICAgICAgICBzZW5kKGNvbW1hbmQpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnJlbG9hZENvbmZpZ3VyYXRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnJvbGxiYWNrIik7Ci0gICAgICAgIH0KLQotICAgICAgICBSb2xsYmFja0NvbW1hbmQgY29tbWFuZCA9IG5ldyBSb2xsYmFja0NvbW1hbmQoKTsKLSAgICAgICAgc2VuZChjb21tYW5kKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhpdDogRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOjpyb2xsYmFjayIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5sb2FkU2VydmljZUdyb3VwcyhTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lcykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyOiBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI6OnVubG9hZFNlcnZpY2VHcm91cHMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVubG9hZFNlcnZpY2VHcm91cHNDb21tYW5kIGNvbW1hbmQgPSBuZXcgVW5sb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQoKTsKLSAgICAgICAgY29tbWFuZC5zZXRTZXJ2aWNlR3JvdXBOYW1lcyhzZXJ2aWNlR3JvdXBOYW1lcyk7Ci0gICAgICAgIHNlbmQoY29tbWFuZCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjo6dW5sb2FkU2VydmljZUdyb3VwcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2VuZChUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgc2VuZGVyLnNlbmRUb0dyb3VwKG5ldyBFeGNlcHRpb25Db21tYW5kKHRocm93YWJsZSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBzZW5kZXIuc2VuZFRvR3JvdXAoY29tbWFuZCk7Ci0KLSAgICAgICAgLy8gTmVlZCB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIHNlbGYgdG9vCi0gICAgICAgIHNlbmRlci5zZW5kVG9TZWxmKGNvbW1hbmQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbmRlcihNZXNzYWdlU2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBzd2l0Y2ggKGNvbW1hbmQuZ2V0Q29tbWFuZFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQuUkVMT0FEX0NPTkZJR1VSQVRJT046Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuY29uZmlndXJhdGlvblJlbG9hZGVkKGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQuTE9BRF9TRVJWSUNFX0dST1VQUzoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXJ2aWNlR3JvdXBzTG9hZGVkKGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQuVU5MT0FEX1NFUlZJQ0VfR1JPVVBTOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnNlcnZpY2VHcm91cHNVbmxvYWRlZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLkFQUExZX1NFUlZJQ0VfUE9MSUNZOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvbGljeUFwcGxpZWQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5QUkVQQVJFOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnByZXBhcmVDYWxsZWQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLkNPTU1JVDoKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5jb21taXRDYWxsZWQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLlJPTExCQUNLOgotICAgICAgICAgICAgICAgIGxpc3RlbmVyLnJvbGxiYWNrQ2FsbGVkKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5FWENFUFRJT046Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIuaGFuZGxlRXhjZXB0aW9uKCgoRXhjZXB0aW9uQ29tbWFuZCkgY29tbWFuZCkuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KCJJbnZhbGlkIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdGVuZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KHBhcmFtLmdldE5hbWUoKSwgcGFyYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZShwYXJhbS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoUGFyYW1ldGVyKSBwYXJhbWV0ZXJzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJhbWV0ZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgbGlzdC5hZGQocGFyYW1ldGVycy5nZXQoaXRlci5uZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckxvY2tlZChTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpLmlzTG9ja2VkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVQYXJhbWV0ZXJzKE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0RlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTgwMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXJ7Ci0gICAgcHVibGljIHZvaWQgc2VydmljZUdyb3Vwc0xvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZUdyb3Vwc1VubG9hZGVkKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb2xpY3lBcHBsaWVkKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uUmVsb2FkZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVDYWxsZWQoKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFja0NhbGxlZCgpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdENhbGxlZCgpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvQXBwbHlTZXJ2aWNlUG9saWN5Q29tbWFuZC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvQXBwbHlTZXJ2aWNlUG9saWN5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDgzMTM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0FwcGx5U2VydmljZVBvbGljeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXBwbHlTZXJ2aWNlUG9saWN5Q29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwb2xpY3k7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpQ3R4KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQVBQTFlfU0VSVklDRV9QT0xJQ1lfRVZFTlQiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBUFBMWV9TRVJWSUNFX1BPTElDWTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb2xpY3koU3RyaW5nIHBvbGljeSkgewotICAgICAgICB0aGlzLnBvbGljeSA9IHBvbGljeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0NvbW1pdENvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0NvbW1pdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhNzUzZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Db21taXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbW1pdENvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgewotICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBDT01NSVQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJDb21taXRDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9FeGNlcHRpb25Db21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9FeGNlcHRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2QwYTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvRXhjZXB0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25Db21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIHsKLSAgICBwcml2YXRlIFRocm93YWJsZSBleGNlcHRpb247Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uQ29tbWFuZChUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQuRVhDRVBUSU9OOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uID0gZXhjZXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiRXhjZXB0aW9uQ29tbWFuZFsiK2V4Y2VwdGlvbi5nZXRDbGFzcygpKyJdOiBcIiIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgIlwiIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Mb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0xvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjk0NWEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL0xvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQgZXh0ZW5kcyBDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgewotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cE5hbWVzKFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwTmFtZXMgPSBzZXJ2aWNlR3JvdXBOYW1lczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzOwotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maUN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkxPQURfU0VSVklDRV9HUk9VUFNfRVZFTlQiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBMT0FEX1NFUlZJQ0VfR1JPVVBTOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL1ByZXBhcmVDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9QcmVwYXJlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ4NjJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL2NvbW1hbmRzL1ByZXBhcmVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByZXBhcmVDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIHsKLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gUFJFUEFSRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlByZXBhcmVDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9SZWxvYWRDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUmVsb2FkQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2NTNmYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9SZWxvYWRDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxvYWRDb25maWd1cmF0aW9uQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBpbXBsCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcm9sbGJhY2soQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiTE9BRF9DT05GSUdVUkFUSU9OX0VWRU5UIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gUkVMT0FEX0NPTkZJR1VSQVRJT047Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvUm9sbGJhY2tDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Sb2xsYmFja0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4YzM5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9Sb2xsYmFja0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sbGJhY2tDb21tYW5kIGV4dGVuZHMgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIHsKLSAgICBwdWJsaWMgaW50IGdldENvbW1hbmRUeXBlKCkgewotICAgICAgICByZXR1cm4gUk9MTEJBQ0s7Ci0gICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGltcGxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiUm9sbGJhY2tDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9VbmxvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vY29tbWFuZHMvVW5sb2FkU2VydmljZUdyb3Vwc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3ZDZmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9jb21tYW5kcy9VbmxvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmxvYWRTZXJ2aWNlR3JvdXBzQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzOwotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maUN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21taXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETzogaW1wbAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE86IGltcGwKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlVOTE9BRF9TRVJWSUNFX0dST1VQU19FVkVOVCI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb21tYW5kVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFVOTE9BRF9TRVJWSUNFX0dST1VQUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR3JvdXBOYW1lcyhTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lcykgewotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cE5hbWVzID0gc2VydmljZUdyb3VwTmFtZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ2x1c3RlcmluZ0NvbnRleHRMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ2x1c3RlcmluZ0NvbnRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdiNDkwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0NsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZXNzYWdlU2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5BYnN0cmFjdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbnRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBDb250ZXh0TGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbHVzdGVyaW5nQ29udGV4dExpc3RlbmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgTWVzc2FnZVNlbmRlciBzZW5kZXI7Ci0KLSAgICBwdWJsaWMgQ2x1c3RlcmluZ0NvbnRleHRMaXN0ZW5lcihNZXNzYWdlU2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0Q3JlYXRlZChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRleHRSZW1vdmVkKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kID0KLSAgICAgICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmdldFJlbW92ZUNvbW1hbmQoY29udGV4dCk7Ci0gICAgICAgIGlmKGNvbW1hbmQgIT0gbnVsbCl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlbmRlci5zZW5kVG9Hcm91cChjb21tYW5kKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsdXN0ZXJpbmdGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3Qgc2VuZCBjb250ZXh0IHJlbW92ZWQgbWVzc2FnZSB0byBjbHVzdGVyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTY4MTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzLkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHMuRGVsZXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHMuVXBkYXRlQ29uZmlndXJhdGlvbkNvbnRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzLlVwZGF0ZUNvbnRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzLlVwZGF0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kcy5VcGRhdGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQWJzdHJhY3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuUHJvcGVydHlEaWZmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uCi0gICAgZ2V0Q29tbWFuZENvbGxlY3Rpb24oQWJzdHJhY3RDb250ZXh0W10gY29udGV4dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGV4Y2x1ZGVkUmVwbGljYXRpb25QYXR0ZXJucykgewotCi0gICAgICAgIEFycmF5TGlzdDxDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ+IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ+KGNvbnRleHRzLmxlbmd0aCk7Ci0gICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb24gY29sbGVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb24oY29tbWFuZHMpOwotICAgICAgICBmb3IgKEFic3RyYWN0Q29udGV4dCBjb250ZXh0IDogY29udGV4dHMpIHsKLSAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBjbWQgPSBnZXRVcGRhdGVDb21tYW5kKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFJlcGxpY2F0aW9uUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoY21kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kcy5hZGQoY21kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgICAgICAgICAgIFRoZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucyBUaGUgcHJvcGVydHkgcGF0dGVybnMgdG8gYmUgZXhjbHVkZWQKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUFsbFByb3BlcnRpZXMgICAgIFRydWUgLSBJbmNsdWRlIGFsbCBwcm9wZXJ0aWVzLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgLSBJbmNsdWRlIG9ubHkgcHJvcGVydHkgZGlmZmVyZW5jZXMKLSAgICAgKiBAcmV0dXJuIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIGdldFVwZGF0ZUNvbW1hbmQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZXhjbHVkZWRQcm9wZXJ0eVBhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWxsUHJvcGVydGllcykgewotCi0gICAgICAgIFVwZGF0ZUNvbnRleHRDb21tYW5kIGNtZCA9IHRvVXBkYXRlQ29udGV4dENvbW1hbmQoY29udGV4dCk7Ci0gICAgICAgIGlmIChjbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsbFByb3BlcnRpZXMoY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlmIChjbWQuaXNQcm9wZXJ0aWVzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNtZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNtZDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIGdldFVwZGF0ZUNvbW1hbmQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0eU5hbWVzKQotICAgICAgICAgICAgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgVXBkYXRlQ29udGV4dENvbW1hbmQgY21kID0gdG9VcGRhdGVDb250ZXh0Q29tbWFuZChjb250ZXh0KTsKLSAgICAgICAgaWYgKGNtZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxsUHJvcGVydGllcyhjbWQsIGNvbnRleHQsIHByb3BlcnR5TmFtZXMpOwotICAgICAgICAgICAgaWYgKGNtZC5pc1Byb3BlcnRpZXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY21kID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY21kOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFVwZGF0ZUNvbnRleHRDb21tYW5kIHRvVXBkYXRlQ29udGV4dENvbW1hbmQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVXBkYXRlQ29udGV4dENvbW1hbmQgY21kID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgY21kID0gbmV3IFVwZGF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0Q29tbWFuZCgpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnQ3R4ID0gKFNlcnZpY2VHcm91cENvbnRleHQpIGNvbnRleHQ7Ci0gICAgICAgICAgICBjbWQgPSBuZXcgVXBkYXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQoKTsKLSAgICAgICAgICAgIFVwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kIHVwZGF0ZVNnQ21kID0gKFVwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kKSBjbWQ7Ci0gICAgICAgICAgICB1cGRhdGVTZ0NtZC5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNnQ3R4LmdldERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgICAgIHVwZGF0ZVNnQ21kLnNldFNlcnZpY2VHcm91cENvbnRleHRJZChzZ0N0eC5nZXRJZCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0IGluc3RhbmNlb2YgU2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDdHggPSAoU2VydmljZUNvbnRleHQpIGNvbnRleHQ7Ci0gICAgICAgICAgICBjbWQgPSBuZXcgVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kKCk7Ci0gICAgICAgICAgICBVcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQgdXBkYXRlU2VydmljZUNtZCA9IChVcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQpIGNtZDsKLSAgICAgICAgICAgIFN0cmluZyBzZ05hbWUgPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ3R4LmdldFNlcnZpY2VHcm91cENvbnRleHQoKS5nZXREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VHcm91cE5hbWUoKTsKLSAgICAgICAgICAgIHVwZGF0ZVNlcnZpY2VDbWQuc2V0U2VydmljZUdyb3VwTmFtZShzZ05hbWUpOwotICAgICAgICAgICAgdXBkYXRlU2VydmljZUNtZC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoc2VydmljZUN0eC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB1cGRhdGVTZXJ2aWNlQ21kLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VDdHguZ2V0QXhpc1NlcnZpY2UoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHVwZGF0ZUNtZCAgICAgICAgICAgICAgICBUaGUgY29tbWFuZAotICAgICAqIEBwYXJhbSBjb250ZXh0ICAgICAgICAgICAgICAgICAgVGhlIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gZXhjbHVkZWRQcm9wZXJ0eVBhdHRlcm5zIFRoZSBwcm9wZXJ0eSBwYXR0ZXJucyB0byBiZSBleGNsdWRlZCBmcm9tIHJlcGxpY2F0aW9uCi0gICAgICogQHBhcmFtIGluY2x1ZGVBbGxQcm9wZXJ0aWVzICAgICBUcnVlIC0gSW5jbHVkZSBhbGwgcHJvcGVydGllcywKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIC0gSW5jbHVkZSBvbmx5IHByb3BlcnR5IGRpZmZlcmVuY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsUHJvcGVydGllcyhVcGRhdGVDb250ZXh0Q29tbWFuZCB1cGRhdGVDbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGNsdWRlZFByb3BlcnR5UGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVBbGxQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGlmICghaW5jbHVkZUFsbFByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29udGV4dCkgewotICAgICAgICAgICAgICAgIE1hcCBkaWZmcyA9IGNvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBkaWZmcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgbzsKLSAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlEaWZmZXJlbmNlIGRpZmYgPSAoUHJvcGVydHlEaWZmZXJlbmNlKSBkaWZmcy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZGlmZi5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGNoZWNrIHdoZXRoZXIgaXQgbWF0Y2hlcyBhbiBleGNsdWRlZCBwYXR0ZXJuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRXhjbHVkZWQoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRQcm9wZXJ0eVBhdHRlcm5zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNlbmRpbmcgcHJvcGVydHkgPSIgKyBrZXkgKyAiLSIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNtZC5hZGRQcm9wZXJ0eShkaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoY29udGV4dCkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvbnRleHQuZ2V0UHJvcGVydHlOYW1lcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjb250ZXh0LmdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV4dCBjaGVjayB3aGV0aGVyIGl0IG1hdGNoZXMgYW4gZXhjbHVkZWQgcGF0dGVybgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKGtleSwgY29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSwgZXhjbHVkZWRQcm9wZXJ0eVBhdHRlcm5zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNlbmRpbmcgcHJvcGVydHkgPSIgKyBrZXkgKyAiLSIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5RGlmZmVyZW5jZSBkaWZmID0gbmV3IFByb3BlcnR5RGlmZmVyZW5jZShrZXksIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ21kLmFkZFByb3BlcnR5KGRpZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsUHJvcGVydGllcyhVcGRhdGVDb250ZXh0Q29tbWFuZCB1cGRhdGVDbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBNYXAgZGlmZnMgPSBjb250ZXh0LmdldFByb3BlcnR5RGlmZmVyZW5jZXMoKTsKLSAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcHJvcGVydHlOYW1lcykgewotICAgICAgICAgICAgT2JqZWN0IHByb3AgPSBjb250ZXh0LmdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShrZXkpOwotCi0gICAgICAgICAgICAvLyBGaXJzdCBjaGVjayB3aGV0aGVyIGl0IGlzIHNlcmlhbGl6YWJsZQotICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZW5kaW5nIHByb3BlcnR5ID0iICsga2V5ICsgIi0iICsgcHJvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb3BlcnR5RGlmZmVyZW5jZSBkaWZmID0gKFByb3BlcnR5RGlmZmVyZW5jZSkgZGlmZnMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZmYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkaWZmLnNldFZhbHVlKHByb3ApOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDbWQuYWRkUHJvcGVydHkoZGlmZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBkaWZmPwotICAgICAgICAgICAgICAgICAgICBkaWZmcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byByZXBsaWNhdGUgbm9uLXNlcmlhbGl6YWJsZSBwcm9wZXJ0eSAiICsga2V5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gY29udGV4dCAiICsgY29udGV4dDsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhjbHVkZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN0eENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucykgewotCi0gICAgICAgIC8vIENoZWNrIGluIHRoZSBleGNsdWRlcyBsaXN0IHNwZWNpZmljIHRvIHRoZSBjb250ZXh0Ci0gICAgICAgIExpc3Qgc3BlY2lmaWNFeGNsdWRlcyA9Ci0gICAgICAgICAgICAgICAgKExpc3QpIGV4Y2x1ZGVkUHJvcGVydHlQYXR0ZXJucy5nZXQoY3R4Q2xhc3NOYW1lKTsKLSAgICAgICAgYm9vbGVhbiBpc0V4Y2x1ZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChzcGVjaWZpY0V4Y2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzRXhjbHVkZWQgPSBpc0V4Y2x1ZGVkKHNwZWNpZmljRXhjbHVkZXMsIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKSB7Ci0gICAgICAgICAgICAvLyBjaGVjayBpbiB0aGUgZGVmYXVsdCBleGNsdWRlcwotICAgICAgICAgICAgTGlzdCBkZWZhdWx0RXhjbHVkZXMgPQotICAgICAgICAgICAgICAgICAgICAoTGlzdCkgZXhjbHVkZWRQcm9wZXJ0eVBhdHRlcm5zLmdldChEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19ERUZBVUxUUyk7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdEV4Y2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpc0V4Y2x1ZGVkID0gaXNFeGNsdWRlZChkZWZhdWx0RXhjbHVkZXMsIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzRXhjbHVkZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKExpc3QgbGlzdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBmb3IgKE9iamVjdCBhTGlzdCA6IGxpc3QpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gKFN0cmluZykgYUxpc3Q7Ci0gICAgICAgICAgICBpZiAocGF0dGVybi5zdGFydHNXaXRoKCIqIikpIHsKLSAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlQWxsKCJcXCoiLCAiIik7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lbmRzV2l0aChwYXR0ZXJuKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uZW5kc1dpdGgoIioiKSkgewotICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnJlcGxhY2VBbGwoIlxcKiIsICIiKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgocGF0dGVybikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIGdldFJlbW92ZUNvbW1hbmQoQWJzdHJhY3RDb250ZXh0IGFic3RyYWN0Q29udGV4dCkgewotICAgICAgICBpZiAoYWJzdHJhY3RDb250ZXh0IGluc3RhbmNlb2YgU2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0N0eCA9IChTZXJ2aWNlR3JvdXBDb250ZXh0KSBhYnN0cmFjdENvbnRleHQ7Ci0gICAgICAgICAgICBEZWxldGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZCBjbWQgPSBuZXcgRGVsZXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQoKTsKLSAgICAgICAgICAgIGNtZC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoc2dDdHguZ2V0SWQoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjbWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvRGVmYXVsdENvbnRleHRNYW5hZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9EZWZhdWx0Q29udGV4dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwOWMwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9EZWZhdWx0Q29udGV4dE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kcy5Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXMuQ2hhbm5lbFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQWJzdHJhY3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGV4dE1hbmFnZXIgaW1wbGVtZW50cyBDb250ZXh0TWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0gICAgcHJpdmF0ZSBDb250ZXh0TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4oKTsKLQotICAgIHByaXZhdGUgQ2hhbm5lbFNlbmRlciBzZW5kZXI7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q+IGV4Y2x1ZGVkUmVwbGljYXRpb25QYXR0ZXJucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdD4oKTsKLQotICAgIC8vVE9ETzogVHJ5IGhvdyB0byB1c2UgYW4gaW50ZXJmYWNlCi0gICAgcHVibGljIHZvaWQgc2V0U2VuZGVyKENoYW5uZWxTZW5kZXIgc2VuZGVyKSB7Ci0gICAgICAgIHRoaXMuc2VuZGVyID0gc2VuZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWZhdWx0Q29udGV4dE1hbmFnZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQ29udGV4dChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBjbWQgPQotICAgICAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZEZhY3RvcnkuZ2V0VXBkYXRlQ29tbWFuZChjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFJlcGxpY2F0aW9uUGF0dGVybnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgaWYgKGNtZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZW5kZXIuc2VuZFRvR3JvdXAoY21kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY21kID0KLSAgICAgICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmdldFVwZGF0ZUNvbW1hbmQoY29udGV4dCwgcHJvcGVydHlOYW1lcyk7Ci0gICAgICAgIGlmIChjbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VuZGVyLnNlbmRUb0dyb3VwKGNtZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVDb250ZXh0cyhBYnN0cmFjdENvbnRleHRbXSBjb250ZXh0cykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb24gY21kID0KLSAgICAgICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmdldENvbW1hbmRDb2xsZWN0aW9uKGNvbnRleHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZWRSZXBsaWNhdGlvblBhdHRlcm5zKTsKLSAgICAgICAgc2VuZGVyLnNlbmRUb0dyb3VwKGNtZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBjbWQgPSBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRGYWN0b3J5LmdldFJlbW92ZUNvbW1hbmQoY29udGV4dCk7Ci0gICAgICAgIHNlbmRlci5zZW5kVG9Hcm91cChjbWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29udGV4dENsdXN0ZXJhYmxlKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiAoY29udGV4dCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25Db250ZXh0KSB8fAotICAgICAgICAgICAgICAgKGNvbnRleHQgaW5zdGFuY2VvZiBTZXJ2aWNlQ29udGV4dCkgfHwKLSAgICAgICAgICAgICAgIChjb250ZXh0IGluc3RhbmNlb2YgU2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcihDb250ZXh0TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29uZmlnQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdGVuZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhTdHJpbmcgY29udGV4dFR5cGUsIExpc3QgcGF0dGVybnMpIHsKLSAgICAgICAgZXhjbHVkZWRSZXBsaWNhdGlvblBhdHRlcm5zLnB1dChjb250ZXh0VHlwZSwgcGF0dGVybnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlZFJlcGxpY2F0aW9uUGF0dGVybnM7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZXRob2RzIGZyb20gUGFyYW1ldGVySW5jbHVkZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KHBhcmFtLmdldE5hbWUoKSwgcGFyYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZShwYXJhbS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbXNnIDogcGFyYW1ldGVycy5rZXlTZXQoKSkgewotICAgICAgICAgICAgbGlzdC5hZGQocGFyYW1ldGVycy5nZXQobXNnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKS5pc0xvY2tlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0RlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFkZTkwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0RlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lciBpbXBsZW1lbnRzIENvbnRleHRNYW5hZ2VyTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgIHB1YmxpYyB2b2lkIGNvbnRleHRVcGRhdGVkKENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCBtZXNzYWdlKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgbWVzc2FnZS5leGVjdXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvUHJvcGVydHlVcGRhdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Qcm9wZXJ0eVVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkZjMzZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Qcm9wZXJ0eVVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQWJzdHJhY3RDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Qcm9wZXJ0eURpZmZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VXBkYXRlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb3BlcnR5VXBkYXRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1hcCBwcm9wZXJ0aWVzOwotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUHJvcGVydGllcyhBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJVcGRhdGluZyBwcm9wcyBpbiAiICsgYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWJzdHJhY3RDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5RGlmZmVyZW5jZSBwcm9wRGlmZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlEaWZmZXJlbmNlKSBwcm9wZXJ0aWVzLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmIChwcm9wRGlmZi5pc1JlbW92ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdENvbnRleHQucmVtb3ZlUHJvcGVydHlOb25SZXBsaWNhYmxlKGtleSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIGl0IGlzIHVwZGF0ZWQvYWRkZWQKLSAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250ZXh0LnNldE5vblJlcGxpY2FibGVQcm9wZXJ0eShrZXksIHByb3BEaWZmLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgcHJvcD0iICsga2V5ICsgIiwgdmFsdWU9IiArIHByb3BEaWZmLmdldFZhbHVlKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gY29udGV4dCAiICsgYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRleHRQcm9wZXJ0eShQcm9wZXJ0eURpZmZlcmVuY2UgZGlmZikgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChkaWZmLmdldEtleSgpLCBkaWZmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OWFjY2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRDb2xsZWN0aW9uIGV4dGVuZHMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIHsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzOwotCi0gICAgcHVibGljIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb24oQXJyYXlMaXN0IGNvbW1hbmRzKSB7Ci0gICAgICAgIHRoaXMuY29tbWFuZHMgPSBjb21tYW5kczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbW1hbmRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY21kID0gKENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCkgY29tbWFuZHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNtZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY21kLmV4ZWN1dGUoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZENvbGxlY3Rpb24iOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL0RlbGV0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvRGVsZXRlU2VydmljZUNvbnRleHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwY2NkYjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvRGVsZXRlU2VydmljZUNvbnRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlU2VydmljZUNvbnRleHRDb21tYW5kIGV4dGVuZHMgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWU7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTmFtZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cE5hbWUoU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBOYW1lID0gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cENvbnRleHRJZChTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwQ29udGV4dElkID0gc2VydmljZUdyb3VwQ29udGV4dElkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnRhdGlvbgotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL0RlbGV0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9EZWxldGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2MzZDU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL0RlbGV0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZCBleHRlbmRzIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ29udGV4dElkKFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBDb250ZXh0SWQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LnJlbW92ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvY29tbWFuZHMvVXBkYXRlQ29uZmlndXJhdGlvbkNvbnRleHRDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVDb25maWd1cmF0aW9uQ29udGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2MjNlNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVDb25maWd1cmF0aW9uQ29udGV4dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0Q29tbWFuZCBleHRlbmRzIFVwZGF0ZUNvbnRleHRDb21tYW5kIHsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBwcm9wZXJ0eVVwZGF0ZXIudXBkYXRlUHJvcGVydGllcyhjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJVcGRhdGVDb25maWd1cmF0aW9uQ29udGV4dENvbW1hbmQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZUNvbnRleHRDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVDb250ZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg2YjMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZUNvbnRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LlByb3BlcnR5VXBkYXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuUHJvcGVydHlEaWZmZXJlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVDb250ZXh0Q29tbWFuZCBleHRlbmRzIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydHlVcGRhdGVyIHByb3BlcnR5VXBkYXRlciA9IG5ldyBQcm9wZXJ0eVVwZGF0ZXIoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydGllc0VtcHR5KCkgewotICAgICAgICBpZiAocHJvcGVydHlVcGRhdGVyLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVVwZGF0ZXIuc2V0UHJvcGVydGllcyhuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eVVwZGF0ZXIuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShQcm9wZXJ0eURpZmZlcmVuY2UgZGlmZikgewotICAgICAgICBpZiAocHJvcGVydHlVcGRhdGVyLmdldFByb3BlcnRpZXMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVVwZGF0ZXIuc2V0UHJvcGVydGllcyhuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcHJvcGVydHlVcGRhdGVyLmFkZENvbnRleHRQcm9wZXJ0eShkaWZmKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM0ZjEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZVNlcnZpY2VDb250ZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQgZXh0ZW5kcyBVcGRhdGVDb250ZXh0Q29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVXBkYXRlU2VydmljZUNvbnRleHRDb21tYW5kLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUdyb3VwTmFtZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VHcm91cENvbnRleHRJZDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwTmFtZShTdHJpbmcgc2VydmljZUdyb3VwTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cE5hbWUgPSBzZXJ2aWNlR3JvdXBOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ29udGV4dElkKFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBDb250ZXh0SWQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJVcGRhdGluZyBzZXJ2aWNlIGNvbnRleHQgcHJvcGVydGllcy4uLiIpOwotICAgICAgICB9Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDdHggPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgaWYgKHNnQ3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNnQ3R4LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVVwZGF0ZXIudXBkYXRlUHJvcGVydGllcyhzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZ0N0eCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHNjb3BlID0gYXhpc1NlcnZpY2UuZ2V0U2NvcGUoKTsKLSAgICAgICAgICAgIGlmIChzZ0N0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYoc2VydmljZUdyb3VwID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNnQ3R4ID0gbmV3IFNlcnZpY2VHcm91cENvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQsIHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgc2dDdHguc2V0SWQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKENvbnN0YW50cy5TQ09QRV9BUFBMSUNBVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9BcHBsaWNhdGlvblNjb3BlVGFibGUoc2dDdHgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKENvbnN0YW50cy5TQ09QRV9TT0FQX1NFU1NJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZ0N0eCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNnQ3R4LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVVwZGF0ZXIudXBkYXRlUHJvcGVydGllcyhzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJVcGRhdGVTZXJ2aWNlQ29udGV4dENvbW1hbmQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9jb21tYW5kcy9VcGRhdGVTZXJ2aWNlR3JvdXBDb250ZXh0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2M4OTU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L2NvbW1hbmRzL1VwZGF0ZVNlcnZpY2VHcm91cENvbnRleHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQgZXh0ZW5kcyBVcGRhdGVDb250ZXh0Q29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVXBkYXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlR3JvdXBOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlR3JvdXBOYW1lKFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwTmFtZSA9IHNlcnZpY2VHcm91cE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ29udGV4dElkKFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBDb250ZXh0SWQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0N0eCA9Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIFNlcnZpY2VHcm91cENvbnRleHQgaXMgbm90IGZvdW5kLCBjcmVhdGUgaXQKLSAgICAgICAgaWYgKHNnQ3R4ID09IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgICAgICBpZihheGlzU2VydmljZUdyb3VwID09IG51bGwpewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNnQ3R4ID0gbmV3IFNlcnZpY2VHcm91cENvbnRleHQoY29uZmlnQ29udGV4dCwgYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICBzZ0N0eC5zZXRJZChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2dDdHgpOyAgLy8gVE9ETzogQ2hlY2sgdGhpcwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJHb25uYSB1cGRhdGUgU0cgcHJvcCBpbiAiICsgc2VydmljZUdyb3VwQ29udGV4dElkICsgIj09PSIgKyBzZ0N0eCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydHlVcGRhdGVyLnVwZGF0ZVByb3BlcnRpZXMoc2dDdHgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVXBkYXRlU2VydmljZUdyb3VwQ29udGV4dENvbW1hbmQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0NvbnRyb2xDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9Db250cm9sQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGUxZTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0NvbnRyb2xDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBDb250cm9sIGNvbW1hbmQgc2VudCBmcm9tIG9uZSBOb2RlIHRvIGFub3RoZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRyb2xDb21tYW5kIGV4dGVuZHMgQ2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGlzIGNvbW1hbmQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldENvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRDb25maWd1cmF0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI4MzA4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldENvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEdldENvbmZpZ3VyYXRpb25Db21tYW5kIGV4dGVuZHMgQ29udHJvbENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzZXJ2aWNlR3JvdXBOYW1lczsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBMaXN0IHNlcnZpY2VHcm91cE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF4aXNDb25maWcuZ2V0U2VydmljZUdyb3VwcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgYm9vbGVhbiBleGNsdWRlU0cgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igc2VydmljZUl0ZXIgPSBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsgc2VydmljZUl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5nZXRQYXJhbWV0ZXIoQXhpc01vZHVsZS5NT0RVTEVfU0VSVklDRSkgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmlzQ2xpZW50U2lkZSgpKSB7IC8vIE5vIG5lZWQgdG8gc2VuZCBzZXJ2aWNlcyBkZXBsb3llZCB0aHJvdWdoIG1vZHVsZXMgb3IgY2xpZW50IHNpZGUgc2VydmljZXMKLSAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVNHID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL1RPRE86IEV4Y2x1ZGUgYWxsIHNlcnZpY2VzIGxvYWRlZCBmcm9tIG1vZHVsZXMuIEhvdyB0byBoYW5kbGUgZGF0YSBzZXJ2aWNlcyBldGMuPwotICAgICAgICAgICAgaWYgKCFleGNsdWRlU0cpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBOYW1lcy5hZGQoc2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBOYW1lcyA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZ1tdKSBzZXJ2aWNlR3JvdXBOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbc2VydmljZUdyb3VwTmFtZXMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZpY2VHcm91cE5hbWVzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwTmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJHZXRDb25maWd1cmF0aW9uQ29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjYyMTAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL0dldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEdldENvbmZpZ3VyYXRpb25SZXNwb25zZUNvbW1hbmQgZXh0ZW5kcyBDb250cm9sQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIHNlcnZpY2VHcm91cHM7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIFJ1biB0aGlzIGNvZGUgb25seSBpZiB0aGlzIG5vZGUgaXMgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKLSAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQuCi0gICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlOb25SZXBsaWNhYmxlKENsdXN0ZXJpbmdDb25zdGFudHMuUkVDRF9DT05GSUdfSU5JVF9NU0cpID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBjb25maWd1cmF0aW9uIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UiKTsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuCi0gICAgICAgICAgICAgICAgc2V0Tm9uUmVwbGljYWJsZVByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuUkVDRF9DT05GSUdfSU5JVF9NU0csICJ0cnVlIik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwcyAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBMb2FkIGFsbCB0aGUgc2VydmljZSBncm91cHMgdGhhdCBhcmUgc2VudCBieSB0aGUgbmVpZ2hib3VyCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlR3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXAgPSBzZXJ2aWNlR3JvdXBzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0xvYWQgdGhlIHNlcnZpY2UgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ1V0aWxzLmxvYWRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJheGlzMi53b3JrLmRpciIpKTsgLy9UT0RPOiBJbnRyb2R1Y2UgYSBjb25zdGFudC4gd29yayBkaXIgaXMgYSB0ZW1wIGRpci4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL1RPRE86IFdlIHN1cHBvcnQgb25seSBBQVIgZmlsZXMgZm9yIG5vdwotCi0gICAgICAgICAgICAgICAgLy8gVW5sb2FkIGFsbCBzZXJ2aWNlIGdyb3VwcyB3aGljaCB3ZXJlIG5vdCBzZW50IGJ5IHRoZSBuZWlnaGJvdXIsCi0gICAgICAgICAgICAgICAgLy8gYnV0IGhhdmUgYmVlbiBjdXJyZW50bHkgbG9hZGVkCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlR3JvdXBzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IChBeGlzU2VydmljZUdyb3VwKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZFNlcnZpY2VHcm91cCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VHcm91cHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gc2VydmljZUdyb3Vwc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpLmVxdWFscyhzZXJ2aWNlR3JvdXBOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2VydmljZUdyb3VwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU2VydmljZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG11c3RVbmxvYWRTZXJ2aWNlR3JvdXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhpcyBzZXJ2aWNlIHdhcyBub3QgbG9hZGVkIGZyb20gd2l0aGluIGEgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzbywgd2UgbXVzdCBub3QgdW5sb2FkIHN1Y2ggYSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VJdGVyID0gc2VydmljZUdyb3VwLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNDbGllbnRTaWRlKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5nZXRQYXJhbWV0ZXIoQXhpc01vZHVsZS5NT0RVTEVfU0VSVklDRSkgIT0gbnVsbCkgeyAvLyBEbyBub3QgdW5sb2FkIHNlcnZpY2UgZ3JvdXBzIGNvbnRhaW5pbmcgY2xpZW50IHNpZGUgc2VydmljZXMgb3Igb25lcyBkZXBsb3llZCBmcm9tIHdpdGhpbiBtb2R1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RVbmxvYWRTZXJ2aWNlR3JvdXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11c3RVbmxvYWRTZXJ2aWNlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZVNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cHMoU3RyaW5nW10gc2VydmljZUdyb3VwcykgewotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cHMgPSBzZXJ2aWNlR3JvdXBzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0U3RhdGVDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRTdGF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhN2E5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRTdGF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3Rlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdldFN0YXRlQ29tbWFuZCBleHRlbmRzIENvbnRyb2xDb21tYW5kIHsKLQotICAgIHByaXZhdGUgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kW10gY29tbWFuZHM7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0Q2x1c3Rlck1hbmFnZXIoKTsKLSAgICAgICAgaWYoY2x1c3Rlck1hbmFnZXIgPT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIgPSBjbHVzdGVyTWFuYWdlci5nZXRDb250ZXh0TWFuYWdlcigpOwotICAgICAgICBpZiAoY29udGV4dE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgTWFwIGV4Y2x1ZGVkUHJvcFBhdHRlcm5zID0gY29udGV4dE1hbmFnZXIuZ2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoKTsKLSAgICAgICAgICAgIExpc3Q8Q29udGV4dENsdXN0ZXJpbmdDb21tYW5kPiBjbWRMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQ+KCk7Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgc2VydmljZSBncm91cCBjb250ZXh0cywgc2VydmljZSBjb250ZXh0cyAmIHRoZWlyIHJlc3BlY3RpdmUgcHJvcGVydGllcwotICAgICAgICAgICAgU3RyaW5nW10gc2dDdHhJRHMgPSBjb25maWdDdHguZ2V0U2VydmljZUdyb3VwQ29udGV4dElEcygpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgc2dDdHhJRCA6IHNnQ3R4SURzKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0N0eCA9IGNvbmZpZ0N0eC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNnQ3R4SUQpOwotICAgICAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCB1cGRhdGVTZXJ2aWNlR3JvdXBDdHhDbWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRVcGRhdGVDb21tYW5kKHNnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkUHJvcFBhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICh1cGRhdGVTZXJ2aWNlR3JvdXBDdHhDbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjbWRMaXN0LmFkZCh1cGRhdGVTZXJ2aWNlR3JvdXBDdHhDbWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2dDdHguZ2V0U2VydmljZUNvbnRleHRzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gc2dDdHguZ2V0U2VydmljZUNvbnRleHRzKCk7IGl0ZXIyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDdHggPSAoU2VydmljZUNvbnRleHQpIGl0ZXIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCB1cGRhdGVTZXJ2aWNlQ3R4Q21kID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRVcGRhdGVDb21tYW5kKHNlcnZpY2VDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFByb3BQYXR0ZXJucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVNlcnZpY2VDdHhDbWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZExpc3QuYWRkKHVwZGF0ZVNlcnZpY2VDdHhDbWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgdXBkYXRlQ21kID0KLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kRmFjdG9yeS5nZXRVcGRhdGVDb21tYW5kKGNvbmZpZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkUHJvcFBhdHRlcm5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAodXBkYXRlQ21kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbWRMaXN0LmFkZCh1cGRhdGVDbWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjbWRMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gY21kTGlzdC50b0FycmF5KG5ldyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRbY21kTGlzdC5zaXplKCldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRbXSBnZXRDb21tYW5kcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbW1hbmRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiR2V0U3RhdGVDb21tYW5kIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRTdGF0ZVJlc3BvbnNlQ29tbWFuZC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjZDMwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC9HZXRTdGF0ZVJlc3BvbnNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdldFN0YXRlUmVzcG9uc2VDb21tYW5kIGV4dGVuZHMgQ29udHJvbENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEdldFN0YXRlUmVzcG9uc2VDb21tYW5kLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kW10gY29tbWFuZHM7Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZWQgc3RhdGUgaW5pdGlhbGl6YXRpb24gbWVzc2FnZSIpOwotICAgICAgICAKLSAgICAgICAgLy8gUnVuIHRoaXMgY29kZSBvbmx5IGlmIHRoaXMgbm9kZSBpcyBub3QgYWxyZWFkeSBpbml0aWFsaXplZAotICAgICAgICBpZiAoY29uZmlnQ29udGV4dC4KLSAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eU5vblJlcGxpY2FibGUoQ2x1c3RlcmluZ0NvbnN0YW50cy5SRUNEX1NUQVRFX0lOSVRfTVNHKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LgotICAgICAgICAgICAgICAgIHNldE5vblJlcGxpY2FibGVQcm9wZXJ0eShDbHVzdGVyaW5nQ29uc3RhbnRzLlJFQ0RfU1RBVEVfSU5JVF9NU0csICJ0cnVlIik7Ci0vLyAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBzdGF0ZSBpbml0aWFsaXphdGlvbiBtZXNzYWdlIik7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZHNbaV0uZXhlY3V0ZShjb25maWdDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kcyhDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmRbXSBjb21tYW5kcykgewotICAgICAgICB0aGlzLmNvbW1hbmRzID0gY29tbWFuZHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJHZXRTdGF0ZVJlc3BvbnNlQ29tbWFuZCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL0pvaW5Hcm91cENvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9Kb2luR3JvdXBDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlY2U1OGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL0pvaW5Hcm91cENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLkNvbnRyb2xDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBtZXNzYWdlIGEgbWVtYmVyIHdpbGwgc2VuZCB0byBhbm90aGVyIG1lbWJlciB3aGVuIGl0IGludGVuZHMgdG8gam9pbiBhIGdyb3VwLgotICogVGhpcyBpcyB1c2VkIHdpdGggV0tBIGJhc2VkIG1lbWJlcnNoaXAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Hcm91cENvbW1hbmQgZXh0ZW5kcyBDb250cm9sQ29tbWFuZCB7Ci0KLSAgICBwcml2YXRlIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKb2luR3JvdXBDb21tYW5kLmNsYXNzKTsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSk9JTiByZXF1ZXN0IHJlY2VpdmVkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL01lbWJlckpvaW5lZENvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9NZW1iZXJKb2luZWRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmU2NzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL01lbWJlckpvaW5lZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLkNvbnRyb2xDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXMuTWVtYmVyc2hpcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UgYSBtZW1iZXIgd2lsbCBzZW5kIHRvIGFsbCBvdGhlcnMgaW4gdGhlIGdyb3VwIGFmdGVyIGl0IGhhcwotICogam9pbmVkIHRoZSBncm91cC4gV2hlbiB0aGUgb3RoZXIgbWVtYmVycyByZWNlaXZlZCB0aGlzIG1lc3NhZ2UsIHRoZXkgd2lsbCBhZGQgdGhlIG5ld2x5IGpvaW5lZAotICogbWVtYmVyIHRvIHRoZWlyIG1lbWJlciBsaXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZW1iZXJKb2luZWRDb21tYW5kIGV4dGVuZHMgQ29udHJvbENvbW1hbmQgewotCi0gICAgcHJpdmF0ZSBNZW1iZXIgbWVtYmVyOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzaGlwTWFuYWdlcihNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBNYW5hZ2VyID0gbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1lbWJlciBnZXRNZW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIE1lbWJlciBsb2NhbE1lbWJlciA9IG1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCk7Ci0gICAgICAgIGlmIChsb2NhbE1lbWJlciA9PSBudWxsIHx8ICEoQXJyYXlzLmVxdWFscyhsb2NhbE1lbWJlci5nZXRIb3N0KCksIG1lbWJlci5nZXRIb3N0KCkpICYmCi0gICAgICAgICAgICAgIGxvY2FsTWVtYmVyLmdldFBvcnQoKSA9PSBtZW1iZXIuZ2V0UG9ydCgpKSkgewotICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIubWVtYmVyQWRkZWQobWVtYmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiTWVtYmVySm9pbmVkQ29tbWFuZDogIiArIG1lbWJlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udHJvbC93a2EvTWVtYmVyTGlzdENvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9NZW1iZXJMaXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDMzNmUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9NZW1iZXJMaXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuQ29udHJvbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5NZW1iZXJzaGlwTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzLlRyaWJlc1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogV2hlbiBhIG5ldyBtZW1iZXIgd2lzaGVzIHRvIGpvaW4gYSBncm91cCwgaXQgd2lsbCBzZW5kIGEge0BsaW5rIEpvaW5Hcm91cENvbW1hbmR9IG1lc3NhZ2UgdG8KLSAqIGEga25vd24gbWVtYmVyLiBUaGVuIHRoaXMga25vd24gbWVtYmVyIHdpbGwgcmVzcG9uZCB3aXRoIHRoaXMgTWVtYmVyTGlzdENvbW1hbmQgbWVzc2FnZS4KLSAqIFRoaXMgbWVzc2FnZSB3aWxsIGNvbnRhaW4gYSBsaXN0IG9mIGFsbCBjdXJyZW50IG1lbWJlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW1iZXJMaXN0Q29tbWFuZCBleHRlbmRzIENvbnRyb2xDb21tYW5kIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZW1iZXJMaXN0Q29tbWFuZC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1lbWJlcltdIG1lbWJlcnM7Ci0gICAgcHJpdmF0ZSBNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlcnNoaXBNYW5hZ2VyKE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubWVtYmVyc2hpcE1hbmFnZXIgPSBtZW1iZXJzaGlwTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKE1lbWJlcltdIG1lbWJlcnMpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNZW1iZXJzaGlwTWFuYWdlciNkb21haW46ICIgKyBuZXcgU3RyaW5nKG1lbWJlcnNoaXBNYW5hZ2VyLmdldERvbWFpbigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVtYmVyIGxvY2FsTWVtYmVyID0gbWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9jYWxNZW1iZXIoKTsKLSAgICAgICAgZm9yIChNZW1iZXIgbWVtYmVyIDogbWVtYmVycykgewotICAgICAgICAgICAgYWRkTWVtYmVyKGxvY2FsTWVtYmVyLCBtZW1iZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbG9jYWxNZW1iZXIsIE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgbG9nLmluZm8oIlRyeWluZyB0byBhZGQgbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIuLi4iKTsKLSAgICAgICAgaWYgKGxvY2FsTWVtYmVyID09IG51bGwgfHwKLSAgICAgICAgICAgICghKEFycmF5cy5lcXVhbHMobG9jYWxNZW1iZXIuZ2V0SG9zdCgpLCBtZW1iZXIuZ2V0SG9zdCgpKSAmJgotICAgICAgICAgICAgICBsb2NhbE1lbWJlci5nZXRQb3J0KCkgPT0gbWVtYmVyLmdldFBvcnQoKSkpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQWRkZWQgbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSk7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5tZW1iZXJBZGRlZChtZW1iZXIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL1JwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRyb2wvd2thL1JwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmE0YWZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250cm9sL3drYS9ScGNNZW1iZXJzaGlwUmVxdWVzdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcnNoaXBTY2hlbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5NZW1iZXJzaGlwTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzLlRyaWJlc1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5Xa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlJlbW90ZVByb2Nlc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUnBjQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBIYW5kbGVzIFJQQyBtZW1iZXJzaGlwIHJlcXVlc3RzIGZyb20gbWVtYmVycy4gVGhpcyBpcyB1c2VkIG9ubHkgaW4gY29uanVuY3Rpb24gd2l0aCBXS0EgYmFzZWQKLSAqIG1lbWJlcnNoaXAgbWFtYW5nZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFJwY01lbWJlcnNoaXBSZXF1ZXN0SGFuZGxlciBpbXBsZW1lbnRzIFJwY0NhbGxiYWNrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhScGNNZW1iZXJzaGlwUmVxdWVzdEhhbmRsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBXa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUgbWVtYmVyc2hpcFNjaGVtZTsKLQotICAgIHB1YmxpYyBScGNNZW1iZXJzaGlwUmVxdWVzdEhhbmRsZXIoTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUgbWVtYmVyc2hpcFNjaGVtZSkgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBNYW5hZ2VyID0gbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgICAgIHRoaXMubWVtYmVyc2hpcFNjaGVtZSA9IG1lbWJlcnNoaXBTY2hlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcmlhbGl6YWJsZSByZXBseVJlcXVlc3QoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgewotICAgICAgICBTdHJpbmcgZG9tYWluID0gbmV3IFN0cmluZyhzZW5kZXIuZ2V0RG9tYWluKCkpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNZW1iZXJzaGlwIHJlcXVlc3QgcmVjZWl2ZWQgYnkgUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyIGZvciBkb21haW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgZG9tYWluKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9jYWwgZG9tYWluOiAiICsgbmV3IFN0cmluZyhtZW1iZXJzaGlwTWFuYWdlci5nZXREb21haW4oKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIEpvaW5Hcm91cENvbW1hbmQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBKT0lOIG1lc3NhZ2UgZnJvbSAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHNlbmRlcikpOwotICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIubWVtYmVyQWRkZWQoc2VuZGVyKTsKLQotICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHNwZWNpZmljIGZvciB0aGUgbWVtYmVyc2hpcCBzY2hlbWUKLSAgICAgICAgICAgIG1lbWJlcnNoaXBTY2hlbWUucHJvY2Vzc0pvaW4oc2VuZGVyKTsKLQotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBsaXN0IG9mIGN1cnJlbnQgbWVtYmVycyB0byB0aGUgY2FsbGVyCi0gICAgICAgICAgICBNZW1iZXJMaXN0Q29tbWFuZCBtZW1MaXN0Q21kID0gbmV3IE1lbWJlckxpc3RDb21tYW5kKCk7Ci0gICAgICAgICAgICBtZW1MaXN0Q21kLnNldE1lbWJlcnMobWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVycygpKTsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbnQgTUVNQkVSX0xJU1QgdG8gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShzZW5kZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtZW1MaXN0Q21kOwotICAgICAgICB9IGVsc2UgaWYgKG1zZyBpbnN0YW5jZW9mIE1lbWJlckpvaW5lZENvbW1hbmQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBNRU1CRVJfSk9JTkVEIG1lc3NhZ2UgZnJvbSAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHNlbmRlcikpOwotICAgICAgICAgICAgTWVtYmVySm9pbmVkQ29tbWFuZCBjb21tYW5kID0gKE1lbWJlckpvaW5lZENvbW1hbmQpIG1zZzsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoY29tbWFuZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29tbWFuZC5zZXRNZW1iZXJzaGlwTWFuYWdlcihtZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2x1c3RlcmluZ0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNhbm5vdCBoYW5kbGUgTUVNQkVSX0pPSU5FRCBub3RpZmljYXRpb24iOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobXNnIGluc3RhbmNlb2YgTWVtYmVyTGlzdENvbW1hbmQpIHsKLSAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAvL1RPRE86IFdoYXQgaWYgd2UgcmVjZWl2ZSBtb3JlIHRoYW4gb25lIG1lbWJlciBsaXN0IG1lc3NhZ2U/Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVkIE1FTUJFUl9MSVNUIG1lc3NhZ2UgZnJvbSAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHNlbmRlcikpOwotICAgICAgICAgICAgICAgIE1lbWJlckxpc3RDb21tYW5kIGNvbW1hbmQgPSAoTWVtYmVyTGlzdENvbW1hbmQpIG1zZzsKLSAgICAgICAgICAgICAgICBjb21tYW5kLnNldE1lbWJlcnNoaXBNYW5hZ2VyKG1lbWJlcnNoaXBNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUobnVsbCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gIlByb2Nlc3NlZCBNRU1CRVJfTElTVCBtZXNzYWdlIjsKLSAgICAgICAgICAgICAgICAvL1RPRE8gU2VuZCBNRU1CRVJfSk9JTkVEIG1lc3NhZ2VzIHRvIGFsbCBub2RlcwotICAgICAgICAgICAgfSBjYXRjaCAoQ2x1c3RlcmluZ0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNhbm5vdCBoYW5kbGUgTUVNQkVSX0xJU1QgbWVzc2FnZSBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNVdGlsLmdldE5hbWUoc2VuZGVyKTsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihlcnJNc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxlZnRPdmVyKFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0FwcGxpY2F0aW9uTW9kZS5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BcHBsaWNhdGlvbk1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNjI5NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0FwcGxpY2F0aW9uTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuRG9tYWluRmlsdGVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqICBSZXByZXNlbnRzIGEgbWVtYmVyIHJ1bm5pbmcgaW4gYXBwbGljYXRpb24gbW9kZQotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Nb2RlIGltcGxlbWVudHMgT3BlcmF0aW9uTW9kZSB7Ci0KLSAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExvYWRCYWxhbmNlck1vZGUuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBieXRlW10gbG9hZEJhbGFuY2VyRG9tYWluOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25Nb2RlKGJ5dGVbXSBsb2FkQmFsYW5jZXJEb21haW4sIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubG9hZEJhbGFuY2VyRG9tYWluID0gbG9hZEJhbGFuY2VyRG9tYWluOwotICAgICAgICB0aGlzLm1lbWJlcnNoaXBNYW5hZ2VyID0gbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSW50ZXJjZXB0b3JzKENoYW5uZWwgY2hhbm5lbCkgewotICAgICAgICBEb21haW5GaWx0ZXJJbnRlcmNlcHRvciBkZmkgPSBuZXcgRG9tYWluRmlsdGVySW50ZXJjZXB0b3IoKTsKLSAgICAgICAgZGZpLnNldE9wdGlvbkZsYWcoVHJpYmVzQ29uc3RhbnRzLk1FTUJFUlNISVBfTVNHX09QVElPTik7Ci0gICAgICAgIGRmaS5zZXREb21haW4obG9hZEJhbGFuY2VyRG9tYWluKTsKLSAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihkZmkpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgRG9tYWluIEZpbHRlciBJbnRlcmNlcHRvciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDaGFubmVsIGNoYW5uZWwpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBiZSBkb25lCi0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+IGdldE1lbWJlcnNoaXBNYW5hZ2VycygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5TWVtYmVySm9pbihmaW5hbCBNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIFRocmVhZCB0aCA9IG5ldyBUaHJlYWQoKXsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5zZW5kTWVtYmVySm9pbmVkVG9BbGwobWVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdGguc3RhcnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0F0TW9zdE9uY2VJbnRlcmNlcHRvci5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BdE1vc3RPbmNlSW50ZXJjZXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzMDM2MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0F0TW9zdE9uY2VJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLkNoYW5uZWxJbnRlcmNlcHRvckJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogTWVzc2FnZSBpbnRlcmVjZXB0b3IgZm9yIGhhbmRsaW5nIGF0LW1vc3Qtb25jZSBtZXNzYWdlIHByb2Nlc3Npbmcgc2VtYW50aWNzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdE1vc3RPbmNlSW50ZXJjZXB0b3IgZXh0ZW5kcyBDaGFubmVsSW50ZXJjZXB0b3JCYXNlIHsgICAgICAgICAgCi0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXRNb3N0T25jZUludGVyY2VwdG9yLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2hhbm5lbE1lc3NhZ2UsIExvbmc+IHJlY2VpdmVkTWVzc2FnZXMgPQotICAgICAgICAgICAgbmV3IEhhc2hNYXA8Q2hhbm5lbE1lc3NhZ2UsIExvbmc+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGltZSBhIG1lc3NhZ2UgbGl2ZXMgaW4gdGhlIHJlY2VpdmVkTWVzc2FnZXMgTWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQgPSA1ICogNjAgKiAxMDAwOwotCi0gICAgcHVibGljIEF0TW9zdE9uY2VJbnRlcmNlcHRvcigpIHsKLSAgICAgICAgVGhyZWFkIGNsZWFudXBUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBNZXNzYWdlQ2xlYW51cFRhc2soKSk7Ci0gICAgICAgIGNsZWFudXBUaHJlYWQuc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSk7Ci0gICAgICAgIGNsZWFudXBUaHJlYWQuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgIGlmIChva1RvUHJvY2Vzcyhtc2cuZ2V0T3B0aW9ucygpKSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChyZWNlaXZlZE1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVkTWVzc2FnZXMuZ2V0KG1zZykgPT0gbnVsbCkgeyAgLy8gSWYgaXQgaXMgYSBuZXcgbWVzc2FnZSwga2VlcCB0cmFjayBvZiBpdAotICAgICAgICAgICAgICAgICAgICByZWNlaXZlZE1lc3NhZ2VzLnB1dChtc2csIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIubWVzc2FnZVJlY2VpdmVkKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIElmIGl0IGlzIGEgZHVwbGljYXRlIG1lc3NhZ2UsIGRpc2NhcmQgaXQuIGkuZS4gZG9udCBjYWxsIHN1cGVyLm1lc3NhZ2VSZWNlaXZlZAotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRHVwbGljYXRlIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1zZy5nZXRBZGRyZXNzKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVzc2FnZUNsZWFudXBUYXNrIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7IC8vIFRoaXMgdGFzayBzaG91bGQgbmV2ZXIgdGVybWluYXRlCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFRJTUVPVVQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxDaGFubmVsTWVzc2FnZT4gdG9CZVJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0PENoYW5uZWxNZXNzYWdlPigpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChyZWNlaXZlZE1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENoYW5uZWxNZXNzYWdlIG1zZyA6IHJlY2VpdmVkTWVzc2FnZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGFycml2YWxUaW1lID0gcmVjZWl2ZWRNZXNzYWdlcy5nZXQobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBhcnJpdmFsVGltZSA+PSBUSU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvQmVSZW1vdmVkLmFkZChtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9CZVJlbW92ZWQuc2l6ZSgpID4gMTAwMDApIHsgLy8gRG8gbm90IGFsbG93IHRoaXMgdGhyZWFkIHRvIHJ1biBmb3IgdG9vIGxvbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDaGFubmVsTWVzc2FnZSBtc2cgOiB0b0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkTWVzc2FnZXMucmVtb3ZlKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2xlYW5lZCB1cCBtZXNzYWdlICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjbGVhbnVwIG1lc3NhZ2VzIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9BeGlzMkNvb3JkaW5hdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0F4aXMyQ29vcmRpbmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1ODRjYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0F4aXMyQ29vcmRpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5Ob25CbG9ja2luZ0Nvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXJzaGlwTGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIG5vbi1ibG9ja2luZyBjb29yZGluYXRvciBpbnRlcmNlcHRvcgotICovCi1wdWJsaWMgY2xhc3MgQXhpczJDb29yZGluYXRvciBleHRlbmRzIE5vbkJsb2NraW5nQ29vcmRpbmF0b3IgewotCi0gICAgcHJpdmF0ZSBNZW1iZXJzaGlwTGlzdGVuZXIgbWVtYmVyc2hpcExpc3RlbmVyOwotCi0gICAgcHVibGljIEF4aXMyQ29vcmRpbmF0b3IoTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lcikgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBMaXN0ZW5lciA9IG1lbWJlcnNoaXBMaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIHN1cGVyLm1lbWJlckFkZGVkKG1lbWJlcik7Ci0gICAgICAgIGlmIChtZW1iZXJzaGlwTGlzdGVuZXIgIT0gbnVsbCAmJgotICAgICAgICAgICAgVHJpYmVzVXRpbC5hcmVJblNhbWVEb21haW4oZ2V0TG9jYWxNZW1iZXIodHJ1ZSksIG1lbWJlcikpIHsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBMaXN0ZW5lci5tZW1iZXJBZGRlZChUcmliZXNVdGlsLnRvQXhpczJNZW1iZXIobWVtYmVyKSwgaXNDb29yZGluYXRvcigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgc3VwZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKLSAgICAgICAgaWYoIVRyaWJlc1V0aWwuYXJlSW5TYW1lRG9tYWluKGdldExvY2FsTWVtYmVyKHRydWUpLCBtZW1iZXIpKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNDb29yZGluYXRvcigpKSB7Ci0gICAgICAgICAgICBpZiAoVHJpYmVzVXRpbC50b0F4aXMyTWVtYmVyKG1lbWJlcikuaXNBY3RpdmUoKSkgewotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxvY2FsIG1lbWJlciBpcyBQQVNTSVZFLCB3ZSB0cnkgdG8gYWN0aXZhdGUgaXQKLSAgICAgICAgICAgICAgICBpZiAoIVRyaWJlc1V0aWwudG9BeGlzMk1lbWJlcihnZXRMb2NhbE1lbWJlcih0cnVlKSkuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IEFDVElWQVRFIGxvY2FsIG1lbWJlcgotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNZW1iZXIgYU1lbWJlciA6IG1lbWJlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVHJpYmVzVXRpbC50b0F4aXMyTWVtYmVyKG1lbWJlcikuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNlbmQgQUNUSVZBVEUgbWVzc2FnZSB0byB0aGlzIHBhc3NpdmUgbWVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vVE9ETyBJZiBhIFBBU1NJVkUgbWVtYmVyIGRpc2FwcGVhcmVkLCB3ZSBtYXkgbmVlZCB0byBzdGFydHVwIGFub3RoZXIKLSAgICAgICAgICAgICAgICAvLyBwYXNzaXZlIG5vZGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWVtYmVyc2hpcExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBMaXN0ZW5lci5tZW1iZXJEaXNhcHBlYXJlZChUcmliZXNVdGlsLnRvQXhpczJNZW1iZXIobWVtYmVyKSwgaXNDb29yZGluYXRvcigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQ2hhbm5lbExpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0NoYW5uZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc2NDg2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQ2hhbm5lbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRDbHVzdGVyaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQnl0ZU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLlJlbW90ZVByb2Nlc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuUnBjTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5pby5YQnl0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQ2hhbm5lbExpc3RlbmVyIGltcGxlbWVudHMgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbExpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2hhbm5lbExpc3RlbmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgRGVmYXVsdENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyOwotICAgIHByaXZhdGUgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgIHB1YmxpYyBDaGFubmVsTGlzdGVuZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0Q29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uTWFuYWdlciA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotICAgICAgICB0aGlzLmNvbnRleHRNYW5hZ2VyID0gY29udGV4dE1hbmFnZXI7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0TWFuYWdlcihEZWZhdWx0Q29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0TWFuYWdlciA9IGNvbnRleHRNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcikgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gY29uZmlndXJhdGlvbk1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZWQgYnkgdGhlIGNoYW5uZWwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsaXN0ZW5lciB3aWxsIHByb2Nlc3MgdGhpcyBtZXNzYWdlIG9yIG5vdC4KLSAgICAgKiBAcGFyYW0gbXNnIFNlcmlhbGl6YWJsZQotICAgICAqIEBwYXJhbSBzZW5kZXIgTWVtYmVyCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBzZW5kZXIpIHsKLSAgICAgICAgcmV0dXJuICEobXNnIGluc3RhbmNlb2YgUnBjTWVzc2FnZSk7ICAvLyBScGNNZXNzYWdlcyAgd2lsbCBub3QgYmUgaGFuZGxlZCBieSB0aGlzIGxpc3RlbmVyCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgY2hhbm5lbAotICAgICAqIEBwYXJhbSBtc2cgU2VyaWFsaXphYmxlCi0gICAgICogQHBhcmFtIHNlbmRlciAtIHRoZSBzb3VyY2Ugb2YgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoU2VyaWFsaXphYmxlIG1zZywgTWVtYmVyIHNlbmRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBMaXN0PENsYXNzTG9hZGVyPiBjbGFzc0xvYWRlcnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzTG9hZGVyPigpOwotICAgICAgICAgICAgY2xhc3NMb2FkZXJzLmFkZChjb25maWd1cmF0aW9uLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgY2xhc3NMb2FkZXJzLmFkZChnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlndXJhdGlvbi5nZXRTZXJ2aWNlR3JvdXBzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgZ3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2xhc3NMb2FkZXJzLmFkZChncm91cC5nZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcihPYmplY3Qgb2JqOiBjb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKS52YWx1ZXMoKSl7ICAgIAotICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gKEF4aXNNb2R1bGUpIG9iajsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcnMuYWRkKG1vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBtZXNzYWdlID0gKChCeXRlTWVzc2FnZSkgbXNnKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBtc2cgPSBYQnl0ZUJ1ZmZlci5kZXNlcmlhbGl6ZShtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXJzLnRvQXJyYXkobmV3IENsYXNzTG9hZGVyW2NsYXNzTG9hZGVycy5zaXplKCldKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNhbm5vdCBkZXNlcmlhbGl6ZSByZWNlaXZlZCBtZXNzYWdlIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBzeXN0ZW0gaGFzIG5vdCBzdGlsbCBiZWVuIGludGlhbGl6ZWQsIHJlamVjdCBhbGwgaW5jb21pbmcgbWVzc2FnZXMsIGV4Y2VwdCB0aGUKLSAgICAgICAgLy8gR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQgbWVzc2FnZQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgZ2V0UHJvcGVydHlOb25SZXBsaWNhYmxlKENsdXN0ZXJpbmdDb25zdGFudHMuQ0xVU1RFUl9JTklUSUFMSVpFRCkgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLndhcm4oIlJlY2VpdmVkIG1lc3NhZ2UgIiArIG1zZyArCi0gICAgICAgICAgICAgICAgICAgICAiIGJlZm9yZSBjbHVzdGVyIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgVHJpYmVzVXRpbC5nZXROYW1lKHNlbmRlcikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWNlaXZlZCBtZXNzYWdlICIgKyBtc2cgKyAiIGZyb20gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShzZW5kZXIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9jZXNzTWVzc2FnZShtc2cpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDYW5ub3QgcHJvY2VzcyByZWNlaXZlZCBtZXNzYWdlIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWVzc2FnZShTZXJpYWxpemFibGUgbXNnKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCAmJiBjb250ZXh0TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgY3R4Q21kID0gKENvbnRleHRDbHVzdGVyaW5nQ29tbWFuZCkgbXNnOwotICAgICAgICAgICAgY3R4Q21kLmV4ZWN1dGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG1zZyBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCAmJiBjb25maWd1cmF0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uTWFuYWdlci5wcm9jZXNzKChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQpIG1zZyk7Ci0gICAgICAgIH0gCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9DaGFubmVsU2VuZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0NoYW5uZWxTZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyMTVmOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0NoYW5uZWxTZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVzc2FnZVNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5CeXRlTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENoYW5uZWxTZW5kZXIgaW1wbGVtZW50cyBNZXNzYWdlU2VuZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDaGFubmVsU2VuZGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIENoYW5uZWwgY2hhbm5lbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3luY2hyb25pemVBbGxNZW1iZXJzOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgQ2hhbm5lbFNlbmRlcihDaGFubmVsIGNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzeW5jaHJvbml6ZUFsbE1lbWJlcnMpIHsKLSAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTWFuYWdlciA9IG1lbWJlcnNoaXBNYW5hZ2VyOwotICAgICAgICB0aGlzLnN5bmNocm9uaXplQWxsTWVtYmVycyA9IHN5bmNocm9uaXplQWxsTWVtYmVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kVG9Hcm91cChDbHVzdGVyaW5nQ29tbWFuZCBtc2cpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBpZiAoY2hhbm5lbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IG1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsKLQotICAgICAgICAvLyBLZWVwIHJldHJ5aW5nLCBzaW5jZSBhdCB0aGUgcG9pbnQgb2YgdHJ5aW5nIHRvIHNlbmQgdGhlIG1zZywgYSBtZW1iZXIgbWF5IGxlYXZlIHRoZSBncm91cAotICAgICAgICAvLyBjYXVzaW5nIGEgdmlldyBjaGFuZ2UuIEFsbCBub2RlcyBpbiBhIHZpZXcgc2hvdWxkIGdldCB0aGUgbXNnCi0gICAgICAgIGlmIChtZW1iZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN5bmNocm9uaXplQWxsTWVtYmVycykgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNlbmQobWVtYmVycywgdG9CeXRlTWVzc2FnZShtc2cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfVVNFX0FDSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5NU0dfT1JERVJfT1BUSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5BVF9NT1NUX09OQ0VfT1BUSU9OKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGFubmVsLnNlbmQobWVtYmVycywgdG9CeXRlTWVzc2FnZShtc2cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbC5TRU5EX09QVElPTlNfQVNZTkNIUk9OT1VTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5NU0dfT1JERVJfT1BUSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5BVF9NT1NUX09OQ0VfT1BUSU9OKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VudCAiICsgbXNnICsgIiB0byBncm91cCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IHNlbmQgY29tbWFuZCBtZXNzYWdlICIgKyBtc2cgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0byBncm91cCBzaW5jZSBpdCBpcyBub3Qgc2VyaWFsaXphYmxlLiI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobWVzc2FnZSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDaGFubmVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gc29tZSBtZW1iZXJzIiwgZSk7Ci0gICAgICAgICAgICAgICAgQ2hhbm5lbEV4Y2VwdGlvbi5GYXVsdHlNZW1iZXJbXSBmYXVsdHlNZW1iZXJzID0gZS5nZXRGYXVsdHlNZW1iZXJzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChDaGFubmVsRXhjZXB0aW9uLkZhdWx0eU1lbWJlciBmYXVsdHlNZW1iZXIgOiBmYXVsdHlNZW1iZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBmYXVsdHlNZW1iZXIuZ2V0TWVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiTWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIgaXMgZmF1bHR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0eU1lbWJlci5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVycm9yIHNlbmRpbmcgY29tbWFuZCBtZXNzYWdlIDogIiArIG1zZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBSZWFzb24gIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGxvZy53YXJuKG1lc3NhZ2UsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCeXRlTWVzc2FnZSB0b0J5dGVNZXNzYWdlKENsdXN0ZXJpbmdDb21tYW5kIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYm9zKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1zZyk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlTWVzc2FnZShib3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZFRvU2VsZihDbHVzdGVyaW5nQ29tbWFuZCBtc2cpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBpZiAoY2hhbm5lbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5uZWwuc2VuZChuZXcgTWVtYmVyW117Y2hhbm5lbC5nZXRMb2NhbE1lbWJlcih0cnVlKX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9CeXRlTWVzc2FnZShtc2cpLAotICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0spOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW50ICIgKyBtc2cgKyAiIHRvIHNlbGYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kVG9NZW1iZXIoQ2x1c3RlcmluZ0NvbW1hbmQgY21kLCBNZW1iZXIgbWVtYmVyKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtZW1iZXIuaXNSZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbC5zZW5kKG5ldyBNZW1iZXJbXXttZW1iZXJ9LCB0b0J5dGVNZXNzYWdlKGNtZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX1VTRV9BQ0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19TWU5DSFJPTklaRURfQUNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzQ29uc3RhbnRzLk1TR19PUkRFUl9PUFRJT04gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuQVRfTU9TVF9PTkNFX09QVElPTik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VudCAiICsgY21kICsgIiB0byAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkNvdWxkIG5vdCBzZW5kIGNvbW1hbmQgbWVzc2FnZSB0byAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNpbmNlIGl0IGlzIG5vdCBzZXJpYWxpemFibGUuIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobWVzc2FnZSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSk7Ci0gICAgICAgICAgICBDaGFubmVsRXhjZXB0aW9uLkZhdWx0eU1lbWJlcltdIGZhdWx0eU1lbWJlcnMgPSBlLmdldEZhdWx0eU1lbWJlcnMoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiTWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIgaXMgZmF1bHR5IiwKLSAgICAgICAgICAgICAgICAgICAgICBmYXVsdHlNZW1iZXJzWzBdLmdldENhdXNlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBSZWFzb24gIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgbG9nLndhcm4obWVzc2FnZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0xvYWRCYWxhbmNlckludGVyY2VwdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL0xvYWRCYWxhbmNlckludGVyY2VwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDZhM2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Mb2FkQmFsYW5jZXJJbnRlcmNlcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5DaGFubmVsSW50ZXJjZXB0b3JCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLm1lbWJlcnNoaXAuTWVtYmVyc2hpcDsKLQotLyoqCi0gKiBUaGlzIGludGVyY2VwdG9yIGlzIHVzZWQgd2hlbiB0aGlzIG1lbWJlciBpcyBwYXJ0IG9mIGEgbG9hZCBiYWxhbmNlciBjbHVzdGVyLgotICogVGhpcyBsb2FkIGJhbGFuY2VyIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkIGJhbGFuY2luZyBhY3Jvc3MgYXBwbGljYXRpb25zIGRlcGxveWVkIGluCi0gKiBhbm90aGVyIGdyb3VwLgotICovCi1wdWJsaWMgY2xhc3MgTG9hZEJhbGFuY2VySW50ZXJjZXB0b3IgZXh0ZW5kcyBDaGFubmVsSW50ZXJjZXB0b3JCYXNlIHsKLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgdGhlIGxvYWQgYmFsYW5jZXIgZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWVtYmVyc2hpcCBsb2FkQmFsYW5jZXJNZW1iZXJzaGlwID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudHMgdGhlIGxvYWQgYmFsYW5jZXIgZ3JvdXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIGxvYWRCYWxhbmNlckRvbWFpbiA9IG5ldyBieXRlWzBdOwotCi0gICAgcHVibGljIExvYWRCYWxhbmNlckludGVyY2VwdG9yKGJ5dGVbXSBsb2FkQmFsYW5jZXJEb21haW4pIHsKLSAgICAgICAgdGhpcy5sb2FkQmFsYW5jZXJEb21haW4gPSBsb2FkQmFsYW5jZXJEb21haW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxNZXNzYWdlIG1zZykgewotICAgICAgICAvLyBJZ25vcmUgYWxsIG1lc3NhZ2VzIHdoaWNoIGFyZSBub3QgaW50ZW5kZWQgZm9yIHRoZSBsb2FkIGJhbGFuY2VyIGdyb3VwIG9yIHdoaWNoIGFyZSBub3QKLSAgICAgICAgLy8gbWVtYmVyc2hpcCBtZXNzYWdlcwotICAgICAgICBpZiAob2tUb1Byb2Nlc3MobXNnLmdldE9wdGlvbnMoKSkgfHwKLSAgICAgICAgICAgIFRyaWJlc1V0aWwuaXNJbkRvbWFpbihtc2cuZ2V0QWRkcmVzcygpLCBsb2FkQmFsYW5jZXJEb21haW4pKSB7Ci0gICAgICAgICAgICBzdXBlci5tZXNzYWdlUmVjZWl2ZWQobXNnKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTG9hZEJhbGFuY2VyTW9kZS5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Mb2FkQmFsYW5jZXJNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWJlNWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Mb2FkQmFsYW5jZXJNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTG9hZEJhbGFuY2VFdmVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wud2thLk1lbWJlckpvaW5lZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBtZW1iZXIgcnVubmluZyBpbiBsb2FkIGJhbGFuY2UgbW9kZQotICovCi1wdWJsaWMgY2xhc3MgTG9hZEJhbGFuY2VyTW9kZSBpbXBsZW1lbnRzIE9wZXJhdGlvbk1vZGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExvYWRCYWxhbmNlck1vZGUuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBieXRlW10gbG9hZEJhbGFuY2VyRG9tYWluOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTG9hZEJhbGFuY2VFdmVudEhhbmRsZXI+IGxiRXZlbnRIYW5kbGVyczsKLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+IG1lbWJlcnNoaXBNYW5hZ2VycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+KCk7Ci0gICAgcHJpdmF0ZSBNZW1iZXJzaGlwTWFuYWdlciBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXI7Ci0KLSAgICBwdWJsaWMgTG9hZEJhbGFuY2VyTW9kZShieXRlW10gbG9hZEJhbGFuY2VyRG9tYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyPiBsYkV2ZW50SGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyc2hpcE1hbmFnZXIgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMubG9hZEJhbGFuY2VyRG9tYWluID0gbG9hZEJhbGFuY2VyRG9tYWluOwotICAgICAgICB0aGlzLmxiRXZlbnRIYW5kbGVycyA9IGxiRXZlbnRIYW5kbGVyczsKLSAgICAgICAgdGhpcy5wcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIgPSBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSW50ZXJjZXB0b3JzKENoYW5uZWwgY2hhbm5lbCkgewotICAgICAgICBMb2FkQmFsYW5jZXJJbnRlcmNlcHRvciBsYkludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICBuZXcgTG9hZEJhbGFuY2VySW50ZXJjZXB0b3IobG9hZEJhbGFuY2VyRG9tYWluKTsKLSAgICAgICAgbGJJbnRlcmNlcHRvci5zZXRPcHRpb25GbGFnKFRyaWJlc0NvbnN0YW50cy5NRU1CRVJTSElQX01TR19PUFRJT04pOwotICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKGxiSW50ZXJjZXB0b3IpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgTG9hZCBCYWxhbmNlciBJbnRlcmNlcHRvciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDaGFubmVsIGNoYW5uZWwpIHsKLSAgICAgICAgLy8gSGF2ZSBtdWx0aXBsZSBSUEMgY2hhbm5lbHMgd2l0aCBtdWx0aXBsZSBSUEMgcmVxdWVzdCBoYW5kbGVycyBmb3IgZWFjaCBkb21haW4KLSAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgb25seSB3aGVuIHRoaXMgbWVtYmVyIGlzIHJ1bm5pbmcgYXMgYSBsb2FkIGJhbGFuY2VyCi0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBsYkV2ZW50SGFuZGxlcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSAoU3RyaW5nKSBvOwotICAgICAgICAgICAgZmluYWwgTWVtYmVyc2hpcE1hbmFnZXIgbWVtYmVyc2hpcE1hbmFnZXIgPSBuZXcgTWVtYmVyc2hpcE1hbmFnZXIoKTsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBNYW5hZ2VyLnNldERvbWFpbihkb21haW4uZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5zZXRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcihsYkV2ZW50SGFuZGxlcnMuZ2V0KGRvbWFpbikpOwotCi0gICAgICAgICAgICBNZW1iZXJzaGlwTGlzdGVuZXIgbWVtYmVyc2hpcExpc3RlbmVyID0gbmV3IE1lbWJlcnNoaXBMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckFkZGVkKG1lbWJlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWVtYmVyRGlzYXBwZWFyZWQob3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyIG1lbWJlcikgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5tZW1iZXJEaXNhcHBlYXJlZChtZW1iZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBjaGFubmVsLmFkZE1lbWJlcnNoaXBMaXN0ZW5lcihtZW1iZXJzaGlwTGlzdGVuZXIpOwotICAgICAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXJzLmFkZChtZW1iZXJzaGlwTWFuYWdlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJzaGlwTWFuYWdlcj4gZ2V0TWVtYmVyc2hpcE1hbmFnZXJzKCkgewotICAgICAgICByZXR1cm4gbWVtYmVyc2hpcE1hbmFnZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeU1lbWJlckpvaW4oZmluYWwgTWVtYmVyIG1lbWJlcikgewotCi0gICAgICAgIGlmIChUcmliZXNVdGlsLmlzSW5Eb21haW4obWVtYmVyLCBsb2FkQmFsYW5jZXJEb21haW4pKSB7ICAvLyBBIHBlZXIgbG9hZCBiYWxhbmNlciBoYXMgam9pbmVkCi0KLSAgICAgICAgICAgIC8vIE5vdGlmeSBhbGwgbWVtYmVycyBpbiB0aGUgTEIgZ3JvdXAKLSAgICAgICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5zZW5kTWVtYmVySm9pbmVkVG9BbGwobWVtYmVyKTsKLQotICAgICAgICAgICAgLy8gU2VuZCB0aGUgTUVNQkVSX0xJU1RTIG9mIGFsbCB0aGUgZ3JvdXBzIHRvIHRoZSB0aGUgbmV3IExCIG1lbWJlcgotICAgICAgICAgICAgZm9yIChNZW1iZXJzaGlwTWFuYWdlciBtYW5hZ2VyIDogbWVtYmVyc2hpcE1hbmFnZXJzKSB7Ci0gICAgICAgICAgICAgICAgbWFuYWdlci5zZW5kTWVtYmVyTGlzdChtZW1iZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBBbiBhcHBsaWNhdGlvbiBtZW1iZXIgaGFzIGpvaW5lZC4KLQotICAgICAgICAgICAgLy8gTmVlZCB0byBub3RpZnkgYWxsIG1lbWJlcnMgaW4gdGhlIGdyb3VwIG9mIHRoZSBuZXcgYXBwIG1lbWJlcgotICAgICAgICAgICAgVGhyZWFkIHRoID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyc2hpcE1hbmFnZXIgbWFuYWdlciA6IG1lbWJlcnNoaXBNYW5hZ2VycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRyaWJlc1V0aWwuaXNJbkRvbWFpbihtZW1iZXIsIG1hbmFnZXIuZ2V0RG9tYWluKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIE1FTUJFUl9KT0lORUQgdG8gdGhlIGdyb3VwIG9mIHRoZSBuZXcgbWVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5zZW5kTWVtYmVySm9pbmVkVG9BbGwobWVtYmVyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgTUVNQkVSX0pPSU5FRCB0byB0aGUgbG9hZCBiYWxhbmNlciBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZW1iZXJKb2luZWRUb0xvYWRCYWxhbmNlckdyb3VwKG1hbmFnZXIuZ2V0UnBjTWVtYmVyc2hpcENoYW5uZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogU2VuZCBNRU1CRVJfSk9JTkVEIHRvIHRoZSBsb2FkIGJhbGFuY2VyIGdyb3VwCi0gICAgICAgICAgICAgICAgICogQHBhcmFtIHJwY0NoYW5uZWwgVGhlIFJwY0NoYW5uZWwgY29ycmVzcG9uZGluZyB0byB0aGUgbWVtYmVyJ3MgZ3JvdXAKLSAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbWVtYmVyICBUaGUgbWVtYmVyIHdobyBqb2luZWQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgc2VuZE1lbWJlckpvaW5lZFRvTG9hZEJhbGFuY2VyR3JvdXAoUnBjQ2hhbm5lbCBycGNDaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbWJlckpvaW5lZENvbW1hbmQgY21kID0gbmV3IE1lbWJlckpvaW5lZENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgY21kLnNldE1lbWJlcihtZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnBjQ2hhbm5lbC5zZW5kKHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5nZXRNZW1iZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJwY0NoYW5uZWwuQUxMX1JFUExZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENoYW5uZWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJDb3VsZCBub3Qgc2VuZCBNRU1CRVJfSk9JTkVEWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSB0byBhbGwgbG9hZCBiYWxhbmNlciBtZW1iZXJzICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdGguc3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTWVtYmVyc2hpcE1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTWVtYmVyc2hpcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNDYxZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL01lbWJlcnNoaXBNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYS5NZW1iZXJKb2luZWRDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYS5NZW1iZXJMaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5ScGNDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5TdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5NZW1iZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbWVtYmVyc2hpcC4gSGFuZGxlcyBtZW1iZXJzaGlwIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZW1iZXJzaGlwTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVtYmVyc2hpcE1hbmFnZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBScGNDaGFubmVsIHJwY01lbWJlcnNoaXBDaGFubmVsOwotICAgIHByaXZhdGUgU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yIHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBkb21haW4gY29ycmVzcG9uZGluZyB0byB0aGUgbWVtYmVyc2hpcCBoYW5kbGVkIGJ5IHRoaXMgTWVtYmVyc2hpcE1hbmFnZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBkb21haW47Ci0gICAgcHJpdmF0ZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBsb2FkQmFsYW5jZUV2ZW50SGFuZGxlcjsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgTWVtYmVyc2hpcE1hbmFnZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBNZW1iZXJzaGlwTWFuYWdlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRScGNNZW1iZXJzaGlwQ2hhbm5lbChScGNDaGFubmVsIHJwY01lbWJlcnNoaXBDaGFubmVsKSB7Ci0gICAgICAgIHRoaXMucnBjTWVtYmVyc2hpcENoYW5uZWwgPSBycGNNZW1iZXJzaGlwQ2hhbm5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUnBjQ2hhbm5lbCBnZXRScGNNZW1iZXJzaGlwQ2hhbm5lbCgpIHsKLSAgICAgICAgcmV0dXJuIHJwY01lbWJlcnNoaXBDaGFubmVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcigKLSAgICAgICAgICAgIFN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvciBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IpIHsKLSAgICAgICAgdGhpcy5zdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IgPSBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZEJhbGFuY2VFdmVudEhhbmRsZXIoTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgbG9hZEJhbGFuY2VFdmVudEhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5sb2FkQmFsYW5jZUV2ZW50SGFuZGxlciA9IGxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihieXRlW10gZG9tYWluKSB7Ci0gICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0RG9tYWluKCkgewotICAgICAgICByZXR1cm4gZG9tYWluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgY3VycmVudCBtZW1iZXJzIGluIHRoZSBjbHVzdGVyLiBPbmx5IHRoZSBtZW1iZXJzIHdobyBhcmUgYWxpdmUgd2lsbCBiZSBpbiB0aGlzCi0gICAgICogbGlzdAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4oKTsKLQotICAgIC8qKgotICAgICAqIExpc3Qgb2YgV2VsbC1Lbm93biBtZW1iZXJzLiBUaGVzZSBtZW1iZXJzIG1heSBvciBtYXkgbm90IGJlIGFsaXZlIGF0IGEgZ2l2ZW4gbW9tZW50LgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxNZW1iZXI+IHdrYU1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4oKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZW1iZXIgcmVwcmVzZW50aW5nIHRoaXMgbm9kZQotICAgICAqLwotICAgIHByaXZhdGUgTWVtYmVyIGxvY2FsTWVtYmVyOwotCi0gICAgcHVibGljIE1lbWJlciBnZXRMb2NhbE1lbWJlcigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsTWVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWVtYmVyKE1lbWJlciBsb2NhbE1lbWJlcikgewotICAgICAgICB0aGlzLmxvY2FsTWVtYmVyID0gbG9jYWxNZW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkV2VsbEtub3duTWVtYmVyKE1lbWJlciB3a2FNZW1iZXIpIHsKLSAgICAgICAgd2thTWVtYmVycy5hZGQod2thTWVtYmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVXZWxsS25vd25NZW1iZXIoTWVtYmVyIHdrYU1lbWJlcikgewotICAgICAgICB3a2FNZW1iZXJzLnJlbW92ZSh3a2FNZW1iZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbmV3IG1lbWJlciBpcyBhZGRlZAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbmV3IG1lbWJlciB0aGF0IGpvaW5lZCB0aGUgY2x1c3RlcgotICAgICAqIEByZXR1cm4gdHJ1ZSAgSWYgdGhlIG1lbWJlciB3YXMgYWRkZWQgdG8gdGhlIDxjb2RlPm1lbWJlcnM8L2NvZGU+IGFycmF5OyBmYWxzZSwgb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKSB7Ci0KLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgbG9nLmRlYnVnKCJtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikgPSIgKyBtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikgKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSXMgaW4gbXkgZG9tYWluOiAiICsgVHJpYmVzVXRpbC5pc0luRG9tYWluKG1lbWJlciwgZG9tYWluKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGlzIG1lbWJlciBhbHJlYWR5IGV4aXN0cyBvciBpZiB0aGUgbWVtYmVyIGJlbG9uZ3MgdG8gYW5vdGhlciBkb21haW4sCi0gICAgICAgIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWRkIGl0Ci0gICAgICAgIGlmIChtZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikgfHwgIVRyaWJlc1V0aWwuaXNJbkRvbWFpbihtZW1iZXIsIGRvbWFpbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IgIT0gbnVsbCkgeyAvLyB0aGlzIGludGVyY2VwdG9yIGlzIG51bGwgd2hlbiBtdWx0aWNhc3QgYmFzZWQgc2NoZW1lIGlzIHVzZWQKLSAgICAgICAgICAgIHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvci5hZGRTdGF0aWNNZW1iZXIobWVtYmVyKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgc3RhdGljIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBzaG91bGRBZGRNZW1iZXIgPSBsb2NhbE1lbWJlciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzVXRpbC5hcmVJblNhbWVEb21haW4obG9jYWxNZW1iZXIsIG1lbWJlcik7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBtZW1iZXIgaXMgYSBsb2FkIGJhbGFuY2VyLCBub3RpZnkgdGhlIHJlc3BlY3RpdmUgbG9hZCBiYWxhbmNlIGV2ZW50IGhhbmRsZXI/Ci0gICAgICAgIGlmIChsb2FkQmFsYW5jZUV2ZW50SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQXBwbGljYXRpb24gbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIgam9pbmVkIGdyb3VwICIgKwotICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhtZW1iZXIuZ2V0RG9tYWluKCkpKTsKLSAgICAgICAgICAgIGxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyLmFwcGxpY2F0aW9uTWVtYmVyQWRkZWQoVHJpYmVzVXRpbC50b0F4aXMyTWVtYmVyKG1lbWJlcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNob3VsZEFkZE1lbWJlcikgewotICAgICAgICAgICAgaWYgKHJwY01lbWJlcnNoaXBDaGFubmVsICE9IG51bGwgJiYgaXNMb2NhbE1lbWJlckluaXRpYWxpemVkKCkgJiYKLSAgICAgICAgICAgICAgICB3a2FNZW1iZXJzLmNvbnRhaW5zKG1lbWJlcikpIHsgLy8gaWYgaXQgaXMgYSB3ZWxsLWtub3duIG1lbWJlcgotCi0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkEgV0tBIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICIganVzdCBqb2luZWQgdGhlIGdyb3VwLiBTZW5kaW5nIE1FTUJFUl9MSVNUIG1lc3NhZ2UuIik7Ci0gICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVtYmVyIGxpc3QgdG8gaXQKLSAgICAgICAgICAgICAgICBNZW1iZXJMaXN0Q29tbWFuZCBtZW1MaXN0Q21kOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbUxpc3RDbWQgPSBuZXcgTWVtYmVyTGlzdENvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4odGhpcy5tZW1iZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVycy5hZGQobG9jYWxNZW1iZXIpOyAvLyBOZWVkIHRvIHNldCB0aGUgbG9jYWwgbWVtYmVyIHRvbwotICAgICAgICAgICAgICAgICAgICBtZW1MaXN0Q21kLnNldE1lbWJlcnMobWVtYmVycy50b0FycmF5KG5ldyBNZW1iZXJbbWVtYmVycy5zaXplKCldKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VbXSByZXNwb25zZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwY01lbWJlcnNoaXBDaGFubmVsLnNlbmQobmV3IE1lbWJlcltde21lbWJlcn0sIG1lbUxpc3RDbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDaGFubmVsLkFMTF9SRVBMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwuU0VORF9PUFRJT05TX0FTWU5DSFJPTk9VUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuTUVNQkVSU0hJUF9NU0dfT1BUSU9OLCAxMDAwMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gT25jZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIFdLQSBtZW1iZXIgdG8gdGhlIE1FTUJFUl9MSVNUIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIGRvbWFpbiwgc2ltcGx5IHJlbW92ZSBpdCBmcm9tIHRoZSBtZW1iZXJzCi0gICAgICAgICAgICAgICAgICAgIGlmKHJlc3BvbnNlcyAhPSBudWxsICYmIHJlc3BvbnNlcy5sZW5ndGggPiAwICYmIHJlc3BvbnNlc1swXSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlciBzb3VyY2UgPSByZXNwb25zZXNbMF0uZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighVHJpYmVzVXRpbC5hcmVJblNhbWVEb21haW4oc291cmNlLCBtZW1iZXIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV0tBIE1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHNvdXJjZSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBiZWxvbmcgdG8gbG9jYWwgZG9tYWluICIgKyBuZXcgU3RyaW5nKGRvbWFpbikrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiBIZW5jZSByZW1vdmluZyBpdCBmcm9tIHRoZSBsaXN0LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLnJlbW92ZShtZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiQ291bGQgbm90IHNlbmQgTUVNQkVSX0xJU1QgdG8gd2VsbC1rbm93biBtZW1iZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW1vdGVQcm9jZXNzRXhjZXB0aW9uKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtYmVycy5hZGQobWVtYmVyKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgZ3JvdXAgbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKSArICIgdG8gZG9tYWluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKG1lbWJlci5nZXREb21haW4oKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgdGhlIGxpc3Qgb2YgbWVtYmVycyB0byB0aGUgPGNvZGU+bWVtYmVyPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHRvIHdob20gdGhlIG1lbWJlciBsaXN0IGhhcyB0byBiZSBzZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lbWJlckxpc3QoTWVtYmVyIG1lbWJlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVtYmVyTGlzdENvbW1hbmQgbWVtTGlzdENtZCA9IG5ldyBNZW1iZXJMaXN0Q29tbWFuZCgpOwotICAgICAgICAgICAgTGlzdDxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4odGhpcy5tZW1iZXJzKTsKLSAgICAgICAgICAgIG1lbUxpc3RDbWQuc2V0TWVtYmVycyhtZW1iZXJzLnRvQXJyYXkobmV3IE1lbWJlclttZW1iZXJzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIHJwY01lbWJlcnNoaXBDaGFubmVsLnNlbmQobmV3IE1lbWJlcltde21lbWJlcn0sIG1lbUxpc3RDbWQsIFJwY0NoYW5uZWwuQUxMX1JFUExZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNDb25zdGFudHMuTUVNQkVSU0hJUF9NU0dfT1BUSU9OLCAxMDAwMCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlbnQgTUVNQkVSX0xJU1QgdG8gIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiQ291bGQgbm90IHNlbmQgTUVNQkVSX0xJU1QgdG8gbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUobWVtYmVyKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlcnJNc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZm9ybSBhbGwgbWVtYmVycyB0aGF0IGEgcGFydGljdWxhciBtZW1iZXIganVzdCBqb2luZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB3aG8ganVzdCBqb2luZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kTWVtYmVySm9pbmVkVG9BbGwoTWVtYmVyIG1lbWJlcikgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBNZW1iZXJKb2luZWRDb21tYW5kIGNtZCA9IG5ldyBNZW1iZXJKb2luZWRDb21tYW5kKCk7Ci0gICAgICAgICAgICBjbWQuc2V0TWVtYmVyKG1lbWJlcik7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8TWVtYmVyPiBtZW1iZXJzVG9TZW5kID0gKEFycmF5TGlzdDxNZW1iZXI+KSAoKChBcnJheUxpc3QpIG1lbWJlcnMpLmNsb25lKCkpOwotICAgICAgICAgICAgbWVtYmVyc1RvU2VuZC5yZW1vdmUobWVtYmVyKTsgLy8gRG8gbm90IHNlbmQgTUVNQkVSX0pPSU5FRCB0byB0aGUgbmV3IG1lbWJlciB3aG8ganVzdCBqb2luZWQKLQotICAgICAgICAgICAgaWYgKG1lbWJlcnNUb1NlbmQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJwY01lbWJlcnNoaXBDaGFubmVsLnNlbmQobWVtYmVyc1RvU2VuZC50b0FycmF5KG5ldyBNZW1iZXJbbWVtYmVyc1RvU2VuZC5zaXplKCldKSwgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ2hhbm5lbC5BTExfUkVQTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpYmVzQ29uc3RhbnRzLk1FTUJFUlNISVBfTVNHX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW50IE1FTUJFUl9KT0lORURbIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIHRvIGFsbCBtZW1iZXJzIGluIGRvbWFpbiAiICsgbmV3IFN0cmluZyhkb21haW4pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNvdWxkIG5vdCBzZW5kIE1FTUJFUl9KT0lORURbIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSB0byBhbGwgbWVtYmVycyAiOwotICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihlcnJNc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvY2FsTWVtYmVySW5pdGlhbGl6ZWQoKSB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgY2x1c3RlckluaXRpYWxpemVkID0KLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShDbHVzdGVyaW5nQ29uc3RhbnRzLkNMVVNURVJfSU5JVElBTElaRUQpOwotICAgICAgICByZXR1cm4gY2x1c3RlckluaXRpYWxpemVkICE9IG51bGwgJiYgY2x1c3RlckluaXRpYWxpemVkLmVxdWFscygidHJ1ZSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbWVtYmVyIGRpc2FwcGVhcmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdGhhdCBsZWZ0IHRoZSBjbHVzdGVyCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgbWVtYmVycy5yZW1vdmUobWVtYmVyKTsKLQotICAgICAgICAvLyBJcyB0aGlzIGFuIGFwcGxpY2F0aW9uIGRvbWFpbiBtZW1iZXI/Ci0gICAgICAgIGlmIChsb2FkQmFsYW5jZUV2ZW50SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5hcHBsaWNhdGlvbk1lbWJlclJlbW92ZWQoVHJpYmVzVXRpbC50b0F4aXMyTWVtYmVyKG1lbWJlcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGN1cnJlbnQgbWVtYmVycwotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0IG9mIGN1cnJlbnQgbWVtYmVycwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWVtYmVyW10gZ2V0TWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnMudG9BcnJheShuZXcgTWVtYmVyW21lbWJlcnMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZW1iZXIgdGhhdCBoYXMgYmVlbiBhbGl2ZSBmb3IgdGhlIGxvbmdlc3QgdGltZQotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVtYmVyIHRoYXQgaGFzIGJlZW4gYWxpdmUgZm9yIHRoZSBsb25nZXN0IHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lbWJlciBnZXRMb25nZXN0TGl2aW5nTWVtYmVyKCkgewotICAgICAgICBNZW1iZXIgbG9uZ2VzdExpdmluZ01lbWJlciA9IG51bGw7Ci0gICAgICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIwID0gbWVtYmVycy5nZXQoMCk7Ci0gICAgICAgICAgICBsb25nIGxvbmdlc3RBbGl2ZVRpbWUgPSBtZW1iZXIwLmdldE1lbWJlckFsaXZlVGltZSgpOwotICAgICAgICAgICAgbG9uZ2VzdExpdmluZ01lbWJlciA9IG1lbWJlcjA7Ci0gICAgICAgICAgICBmb3IgKE1lbWJlciBtZW1iZXIgOiBtZW1iZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdlc3RBbGl2ZVRpbWUgPCBtZW1iZXIuZ2V0TWVtYmVyQWxpdmVUaW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdEFsaXZlVGltZSA9IG1lbWJlci5nZXRNZW1iZXJBbGl2ZVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdExpdmluZ01lbWJlciA9IG1lbWJlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvbmdlc3RMaXZpbmdNZW1iZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgcmFuZG9tIG1lbWJlciBmcm9tIHRoZSBsaXN0IG9mIGN1cnJlbnQgbWVtYmVycwotICAgICAqCi0gICAgICogQHJldHVybiBBIHJhbmRvbSBtZW1iZXIgZnJvbSB0aGUgbGlzdCBvZiBjdXJyZW50IG1lbWJlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE1lbWJlciBnZXRSYW5kb21NZW1iZXIoKSB7Ci0gICAgICAgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpbnQgbWVtYmVySW5kZXggPSBuZXcgUmFuZG9tKCkubmV4dEludChtZW1iZXJzLnNpemUoKSk7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzLmdldChtZW1iZXJJbmRleCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IG1lbWJlcnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgbWVtYmVycywgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnMuc2l6ZSgpID4gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZW1iZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG1lbWJlciB0byBiZSBmb3VuZAotICAgICAqIEByZXR1cm4gVGhlIG1lbWJlciwgaWYgaXQgaXMgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGlmIChoYXNNZW1iZXJzKCkpIHsKLSAgICAgICAgICAgIE1lbWJlckltcGwgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5tZW1iZXJzLnNpemUoKSAmJiByZXN1bHQgPT0gbnVsbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlcnMuZ2V0KGkpLmVxdWFscyhtZW1iZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChNZW1iZXJJbXBsKSBtZW1iZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTXVsdGljYXN0QmFzZWRNZW1iZXJzaGlwU2NoZW1lLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdEJhc2VkTWVtYmVyc2hpcFNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI2MmUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTXVsdGljYXN0QmFzZWRNZW1iZXJzaGlwU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXJzaGlwU2NoZW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXJzaGlwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1hbmFnZWRDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWxJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuT3JkZXJJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuVGNwRmFpbHVyZURldGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5Ob25CbG9ja2luZ0Nvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLnRyYW5zcG9ydC5SZWNlaXZlckJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbXVsdGljYXN0IGJhc2VkIG1lbWJlcnNoaXAgc2NoZW1lLiBJbiB0aGlzIHNjaGVtZSwgbWVtYmVyc2hpcCBpcyBkaXNjb3ZlcmVkCi0gKiB1c2luZyBtdWx0aWNhc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aWNhc3RCYXNlZE1lbWJlcnNoaXBTY2hlbWUgaW1wbGVtZW50cyBNZW1iZXJzaGlwU2NoZW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNdWx0aWNhc3RCYXNlZE1lbWJlcnNoaXBTY2hlbWUuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRyaWJlcyBjaGFubmVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRvbWFpbiB0byB3aGljaCB0aGlzIG5vZGUgYmVsb25ncyB0bwotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIGRvbWFpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtb2RlIGluIHdoaWNoIHRoaXMgbWVtYmVyIG9wZXJhdGVzIHN1Y2ggYXMgImxvYWRCYWxhbmNlIiBvciAiYXBwbGljYXRpb24iCi0gICAgICovCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25Nb2RlIG1vZGU7Ci0KLSAgICAvLyAgICBwcml2YXRlIE1lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZXJNc2dPcmRlcjsKLQotICAgIHB1YmxpYyBNdWx0aWNhc3RCYXNlZE1lbWJlcnNoaXBTY2hlbWUoTWFuYWdlZENoYW5uZWwgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbk1vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkb21haW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmVzZXJ2ZXJNc2dPcmRlcikgewotICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOwotICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLSAgICAgICAgdGhpcy5hdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljcyA9IGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzOwotICAgICAgICB0aGlzLnByZXNlcnZlck1zZ09yZGVyID0gcHJlc2VydmVyTXNnT3JkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBhZGRJbnRlcmNlcHRvcnMoKTsKLSAgICAgICAgY29uZmlndXJlTXVsdGljYXN0UGFyYW1ldGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGpvaW5Hcm91cCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZU11bHRpY2FzdFBhcmFtZXRlcnMoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgUHJvcGVydGllcyBtY2FzdFByb3BzID0gY2hhbm5lbC5nZXRNZW1iZXJzaGlwU2VydmljZSgpLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgUGFyYW1ldGVyIG1jYXN0QWRkcmVzcyA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTUNBU1RfQUREUkVTUyk7Ci0gICAgICAgIGlmIChtY2FzdEFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuTUNBU1RfQUREUkVTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdHJpbmcpIG1jYXN0QWRkcmVzcy5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBtY2FzdEJpbmRBZGRyZXNzID0gZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5NQ0FTVF9CSU5EX0FERFJFU1MpOwotICAgICAgICBpZiAobWNhc3RCaW5kQWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5NQ0FTVF9CSU5EX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtY2FzdEJpbmRBZGRyZXNzLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQYXJhbWV0ZXIgbWNhc3RQb3J0ID0gZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5NQ0FTVF9QT1JUKTsKLSAgICAgICAgaWYgKG1jYXN0UG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5NQ0FTVF9QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbWNhc3RQb3J0LmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyIG1jYXN0RnJlcXVlbmN5ID0gZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5NQ0FTVF9GUkVRVUVOQ1kpOwotICAgICAgICBpZiAobWNhc3RGcmVxdWVuY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuTUNBU1RfRlJFUVVFTkNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgbWNhc3RGcmVxdWVuY3kuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgfQotICAgICAgICBQYXJhbWV0ZXIgbWNhc3RNZW1iZXJEcm9wVGltZSA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTUVNQkVSX0RST1BfVElNRSk7Ci0gICAgICAgIGlmIChtY2FzdE1lbWJlckRyb3BUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLk1FTUJFUl9EUk9QX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3RyaW5nKSBtY2FzdE1lbWJlckRyb3BUaW1lLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIElQIGFkZHJlc3MgdGhhdCB3aWxsIGJlIGFkdmVydGlzZWQgYnkgdGhpcyBub2RlCi0gICAgICAgIFJlY2VpdmVyQmFzZSByZWNlaXZlciA9IChSZWNlaXZlckJhc2UpIGNoYW5uZWwuZ2V0Q2hhbm5lbFJlY2VpdmVyKCk7Ci0gICAgICAgIFBhcmFtZXRlciB0Y3BMaXN0ZW5Ib3N0ID0gZ2V0UGFyYW1ldGVyKFRyaWJlc0NvbnN0YW50cy5MT0NBTF9NRU1CRVJfSE9TVCk7Ci0gICAgICAgIGlmICh0Y3BMaXN0ZW5Ib3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBob3N0ID0gKChTdHJpbmcpIHRjcExpc3Rlbkhvc3QuZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgbWNhc3RQcm9wcy5zZXRQcm9wZXJ0eShUcmliZXNDb25zdGFudHMuVENQX0xJU1RFTl9IT1NULCBob3N0KTsKLSAgICAgICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLkJJTkRfQUREUkVTUywgaG9zdCk7Ci0gICAgICAgICAgICByZWNlaXZlci5zZXRBZGRyZXNzKGhvc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGhvc3Q7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBVdGlscy5nZXRJcEFkZHJlc3MoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3QgZ2V0IGxvY2FsIElQIGFkZHJlc3MiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLlRDUF9MSVNURU5fSE9TVCwgaG9zdCk7Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5CSU5EX0FERFJFU1MsIGhvc3QpOwotICAgICAgICAgICAgcmVjZWl2ZXIuc2V0QWRkcmVzcyhob3N0KTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbG9jYWxJUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDbHVzdGVyaW5nQ29uc3RhbnRzLkxPQ0FMX0lQX0FERFJFU1MpOwotICAgICAgICBpZiAobG9jYWxJUCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZWNlaXZlci5zZXRBZGRyZXNzKGxvY2FsSVApOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyYW1ldGVyIHRjcExpc3RlblBvcnQgPSBnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLkxPQ0FMX01FTUJFUl9QT1JUKTsKLSAgICAgICAgaWYgKHRjcExpc3RlblBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHBvcnQgPSAoKFN0cmluZykgdGNwTGlzdGVuUG9ydC5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICBtY2FzdFByb3BzLnNldFByb3BlcnR5KFRyaWJlc0NvbnN0YW50cy5UQ1BfTElTVEVOX1BPUlQsIHBvcnQpOwotICAgICAgICAgICAgcmVjZWl2ZXIuc2V0UG9ydChJbnRlZ2VyLnBhcnNlSW50KHBvcnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1jYXN0UHJvcHMuc2V0UHJvcGVydHkoVHJpYmVzQ29uc3RhbnRzLk1DQVNUX0NMVVNURVJfRE9NQUlOLCBuZXcgU3RyaW5nKGRvbWFpbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBDaGFubmVsSW50ZXJjZXB0b3JzLiBUaGUgb3JkZXIgb2YgdGhlIGludGVyY2VwdG9ycyB0aGF0IGFyZSBhZGRlZCB3aWxsIGRlcGVuZCBvbiB0aGUKLSAgICAgKiBtZW1iZXJzaGlwIG1hbmFnZW1lbnQgc2NoZW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEludGVyY2VwdG9ycygpIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIEludGVyY2VwdG9ycy4uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIGEgcmVsaWFibGUgZmFpbHVyZSBkZXRlY3RvcgotICAgICAgICBUY3BGYWlsdXJlRGV0ZWN0b3IgdGNwRmFpbHVyZURldGVjdG9yID0gbmV3IFRjcEZhaWx1cmVEZXRlY3RvcigpOwotICAgICAgICB0Y3BGYWlsdXJlRGV0ZWN0b3Iuc2V0Q29ubmVjdFRpbWVvdXQoMzAwMDApOwotICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKHRjcEZhaWx1cmVEZXRlY3Rvcik7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBUQ1AgRmFpbHVyZSBEZXRlY3RvciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBOb25CbG9ja2luZ0Nvb3JkaW5hdG9yLgotLy8gICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IobmV3IEF4aXMyQ29vcmRpbmF0b3IobWVtYmVyc2hpcExpc3RlbmVyKSk7Ci0KLSAgICAgICAgY2hhbm5lbC5nZXRNZW1iZXJzaGlwU2VydmljZSgpLnNldERvbWFpbihkb21haW4pOwotICAgICAgICBtb2RlLmFkZEludGVyY2VwdG9ycyhjaGFubmVsKTsKLQotICAgICAgICBpZiAoYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MpIHsKLSAgICAgICAgICAgIC8vIEFkZCBhIEF0TW9zdE9uY2VJbnRlcmNlcHRvciB0byBzdXBwb3J0IGF0LW1vc3Qtb25jZSBtZXNzYWdlIHByb2Nlc3Npbmcgc2VtYW50aWNzCi0gICAgICAgICAgICBBdE1vc3RPbmNlSW50ZXJjZXB0b3IgYXRNb3N0T25jZUludGVyY2VwdG9yID0gbmV3IEF0TW9zdE9uY2VJbnRlcmNlcHRvcigpOwotICAgICAgICAgICAgYXRNb3N0T25jZUludGVyY2VwdG9yLnNldE9wdGlvbkZsYWcoVHJpYmVzQ29uc3RhbnRzLkFUX01PU1RfT05DRV9PUFRJT04pOwotICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihhdE1vc3RPbmNlSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBBdC1tb3N0LW9uY2UgSW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmVzZXJ2ZXJNc2dPcmRlcikgewotICAgICAgICAgICAgLy8gQWRkIHRoZSBPcmRlckludGVyY2VwdG9yIHRvIHByZXNlcnZlIHNlbmRlciBvcmRlcmluZwotICAgICAgICAgICAgT3JkZXJJbnRlcmNlcHRvciBvcmRlckludGVyY2VwdG9yID0gbmV3IE9yZGVySW50ZXJjZXB0b3IoKTsKLSAgICAgICAgICAgIG9yZGVySW50ZXJjZXB0b3Iuc2V0T3B0aW9uRmxhZyhUcmliZXNDb25zdGFudHMuTVNHX09SREVSX09QVElPTik7Ci0gICAgICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKG9yZGVySW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBNZXNzYWdlIE9yZGVyIEludGVyY2VwdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9PcGVyYXRpb25Nb2RlLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL09wZXJhdGlvbk1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3MjdhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL09wZXJhdGlvbk1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBvcGVyYXRpbmcgc3VjaCBhIGxvYWRCYWxhbmNlIG9yIGFwcGxpY2F0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0aW9uTW9kZSB7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgY2hhbm5lbCBpbnRlcmVjcHRvcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjaGFubmVsIFRoZSBDaGFubmVsIHRvIHdoaWNoIGludGVyY2VwdG9ycyBuZWVkIHRvIGJlIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSW50ZXJjZXB0b3JzKENoYW5uZWwgY2hhbm5lbCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoaXMgbW9kZQotICAgICAqCi0gICAgICogQHBhcmFtIGNoYW5uZWwgVGhlIGNoYW5uZWwgcmVsYXRlZCB0byB0aGlzIG1lbWJlcgotICAgICAqLwotICAgIHZvaWQgaW5pdChDaGFubmVsIGNoYW5uZWwpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCB0aGUgbWVtYmVyc2hpcCBtYW5hZ2VycyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG1vZGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gbWVtYmVyc2hpcCBtYW5hZ2VycyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG1vZGUKLSAgICAgKi8KLSAgICBMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPiBnZXRNZW1iZXJzaGlwTWFuYWdlcnMoKTsKLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0byB0aGUgcmVsZXZhbnQgcGFydGllcyB0aGF0IGEgbWVtYmVyIDxjb2RlPm1lbWJlcjwvY29kZT4gam9pbmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgdG8gd2hvbSB0aGlzIG1lbWJlciBsaXN0cyBoYXZlIHRvIGJlIHNlbnQKLSAgICAgKi8KLSAgICB2b2lkIG5vdGlmeU1lbWJlckpvaW4oTWVtYmVyIG1lbWJlcik7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1JwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvUnBjSW5pdGlhbGl6YXRpb25SZXF1ZXN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdkNzg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvUnBjSW5pdGlhbGl6YXRpb25SZXF1ZXN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC5HZXRTdGF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRyb2wuR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5SZW1vdGVQcm9jZXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogSGFuZGxlcyBSUEMgaW5pdGlhbGl6YXRpb24gcmVxdWVzdHMgZnJvbSBtZW1iZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBScGNJbml0aWFsaXphdGlvblJlcXVlc3RIYW5kbGVyIGltcGxlbWVudHMgUnBjQ2FsbGJhY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgUnBjSW5pdGlhbGl6YXRpb25SZXF1ZXN0SGFuZGxlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJpYWxpemFibGUgcmVwbHlSZXF1ZXN0KFNlcmlhbGl6YWJsZSBtc2csIE1lbWJlciBpbnZva2VyKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbml0aWFsaXphdGlvbiByZXF1ZXN0IHJlY2VpdmVkIGJ5IFJwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgR2V0U3RhdGVDb21tYW5kKSB7Ci0gICAgICAgICAgICAvLyBJZiBhIEdldFN0YXRlUmVxdWVzdCBpcyByZWNlaXZlZCBieSBhIG5vZGUgd2hpY2ggaGFzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIC8vIHRoaXMgbm9kZSBjYW5ub3Qgc2VuZCBhIHJlc3BvbnNlIHRvIHRoZSBzdGF0ZSByZXF1ZXN0ZXIuIFNvIHdlIHNpbXBseSByZXR1cm4uCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShDbHVzdGVyaW5nQ29uc3RhbnRzLkNMVVNURVJfSU5JVElBTElaRUQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVkICIgKyBtc2cgKyAiIGluaXRpYWxpemF0aW9uIHJlcXVlc3QgbWVzc2FnZSBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc1V0aWwuZ2V0TmFtZShpbnZva2VyKSk7Ci0gICAgICAgICAgICAgICAgR2V0U3RhdGVDb21tYW5kIGNvbW1hbmQgPSAoR2V0U3RhdGVDb21tYW5kKSBtc2c7Ci0gICAgICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICBHZXRTdGF0ZVJlc3BvbnNlQ29tbWFuZCBnZXRTdGF0ZVJlc3BDbWQgPSBuZXcgR2V0U3RhdGVSZXNwb25zZUNvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICBnZXRTdGF0ZVJlc3BDbWQuc2V0Q29tbWFuZHMoY29tbWFuZC5nZXRDb21tYW5kcygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3RhdGVSZXNwQ21kOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2x1c3RlcmluZ0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyTXNnID0gIkNhbm5vdCBoYW5kbGUgaW5pdGlhbGl6YXRpb24gcmVxdWVzdCI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGVyck1zZywgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbW90ZVByb2Nlc3NFeGNlcHRpb24oZXJyTXNnLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtc2cgaW5zdGFuY2VvZiBHZXRDb25maWd1cmF0aW9uQ29tbWFuZCkgewotICAgICAgICAgICAgLy8gSWYgYSBHZXRDb25maWd1cmF0aW9uQ29tbWFuZCBpcyByZWNlaXZlZCBieSBhIG5vZGUgd2hpY2ggaGFzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQKLSAgICAgICAgICAgIC8vIHRoaXMgbm9kZSBjYW5ub3Qgc2VuZCBhIHJlc3BvbnNlIHRvIHRoZSBzdGF0ZSByZXF1ZXN0ZXIuIFNvIHdlIHNpbXBseSByZXR1cm4uCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShDbHVzdGVyaW5nQ29uc3RhbnRzLkNMVVNURVJfSU5JVElBTElaRUQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVkICIgKyBtc2cgKyAiIGluaXRpYWxpemF0aW9uIHJlcXVlc3QgbWVzc2FnZSBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc1V0aWwuZ2V0TmFtZShpbnZva2VyKSk7Ci0gICAgICAgICAgICAgICAgR2V0Q29uZmlndXJhdGlvbkNvbW1hbmQgY29tbWFuZCA9IChHZXRDb25maWd1cmF0aW9uQ29tbWFuZCkgbXNnOwotICAgICAgICAgICAgICAgIGNvbW1hbmQuZXhlY3V0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgR2V0Q29uZmlndXJhdGlvblJlc3BvbnNlQ29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnUmVzcENtZCA9IG5ldyBHZXRDb25maWd1cmF0aW9uUmVzcG9uc2VDb21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29uZmlnUmVzcENtZC5zZXRTZXJ2aWNlR3JvdXBzKGNvbW1hbmQuZ2V0U2VydmljZUdyb3VwTmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbmZpZ1Jlc3BDbWQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbHVzdGVyaW5nRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiQ2Fubm90IGhhbmRsZSBpbml0aWFsaXphdGlvbiByZXF1ZXN0IjsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVtb3RlUHJvY2Vzc0V4Y2VwdGlvbihlcnJNc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsZWZ0T3ZlcihTZXJpYWxpemFibGUgbXNnLCBNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNDbHVzdGVyTWFuYWdlci5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNDbHVzdGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ2MmFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzQ2x1c3Rlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5Mb2FkQmFsYW5jZUV2ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXJzaGlwU2NoZW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5SZXF1ZXN0QmxvY2tpbmdIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5DbHVzdGVyaW5nQ29udGV4dExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC5Db250cm9sQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC5HZXRDb25maWd1cmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC5HZXRTdGF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLkNoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NYW5hZ2VkQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuR3JvdXBDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0Lk11bHRpUG9pbnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlJlcGxpY2F0aW9uVHJhbnNtaXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgbWFpbiBDbHVzdGVyTWFuYWdlciBjbGFzcyBmb3IgdGhlIFRyaWJlcyBiYXNlZCBjbHVzdGVyaW5nIGltcGxlbWVudGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmliZXNDbHVzdGVyTWFuYWdlciBpbXBsZW1lbnRzIENsdXN0ZXJNYW5hZ2VyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmliZXNDbHVzdGVyTWFuYWdlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcjsKLSAgICBwcml2YXRlIERlZmF1bHRDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlcjsKLQotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4gcGFyYW1ldGVyczsKLSAgICBwcml2YXRlIE1hbmFnZWRDaGFubmVsIGNoYW5uZWw7Ci0gICAgcHJpdmF0ZSBScGNDaGFubmVsIHJwY0luaXRDaGFubmVsOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBDaGFubmVsTGlzdGVuZXIgY2hhbm5lbExpc3RlbmVyOwotICAgIHByaXZhdGUgQ2hhbm5lbFNlbmRlciBjaGFubmVsU2VuZGVyOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIHByaXZhdGUgUnBjSW5pdGlhbGl6YXRpb25SZXF1ZXN0SGFuZGxlciBycGNJbml0UmVxdWVzdEhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBNZW1iZXJzaGlwU2NoZW1lIG1lbWJlcnNoaXBTY2hlbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIG1lbWJlciBvcGVyYXRlcyBzdWNoIGFzICJsb2FkQmFsYW5jZSIgb3IgImFwcGxpY2F0aW9uIgotICAgICAqLwotICAgIHByaXZhdGUgT3BlcmF0aW9uTW9kZSBtb2RlOwotCi0gICAgLyoqCi0gICAgICogU3RhdGljIG1lbWJlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcj4gbWVtYmVyczsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTG9hZEJhbGFuY2VFdmVudEhhbmRsZXI+IGxiRXZlbnRIYW5kbGVycyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyPigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBsb2FkQmFsYW5jZU1vZGU7Ci0KLSAgICBwdWJsaWMgVHJpYmVzQ2x1c3Rlck1hbmFnZXIoKSB7Ci0gICAgICAgIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhcmFtZXRlcj4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZW1iZXJzKExpc3Q8b3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcj4gbWVtYmVycykgewotICAgICAgICB0aGlzLm1lbWJlcnMgPSBtZW1iZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXI+IGdldE1lbWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBwbGljYXRpb25Eb21haW4pIHsKLSAgICAgICAgbG9nLmluZm8oIkxvYWQgYmFsYW5jaW5nIGZvciBhcHBsaWNhdGlvbiBkb21haW4gIiArIGFwcGxpY2F0aW9uRG9tYWluICsKLSAgICAgICAgICAgICAgICAgIiB1c2luZyBldmVudCBoYW5kbGVyICIgKyBldmVudEhhbmRsZXIuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGxiRXZlbnRIYW5kbGVycy5wdXQoYXBwbGljYXRpb25Eb21haW4sIGV2ZW50SGFuZGxlcik7Ci0gICAgICAgIGxvYWRCYWxhbmNlTW9kZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIGdldExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKFN0cmluZyBhcHBsaWNhdGlvbkRvbWFpbikgewotICAgICAgICByZXR1cm4gbGJFdmVudEhhbmRsZXJzLmdldChhcHBsaWNhdGlvbkRvbWFpbik7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldERvbWFpbnMoKSB7Ci0gICAgICAgIHJldHVybiBsYkV2ZW50SGFuZGxlcnMua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRleHRNYW5hZ2VyIGdldENvbnRleHRNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gY29udGV4dE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbk1hbmFnZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgY2x1c3Rlci4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGluaXRpYWxpemF0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSW5pdGlhbGl6aW5nIGNsdXN0ZXIuLi4iKTsKLSAgICAgICAgYWRkUmVxdWVzdEJsb2NraW5nSGFuZGxlclRvSW5GbG93cygpOwotICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIgPSBuZXcgTWVtYmVyc2hpcE1hbmFnZXIoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgIGNoYW5uZWwgPSBuZXcgR3JvdXBDaGFubmVsKCk7Ci0gICAgICAgIGNoYW5uZWxTZW5kZXIgPSBuZXcgQ2hhbm5lbFNlbmRlcihjaGFubmVsLCBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIsIHN5bmNocm9uaXplQWxsTWVtYmVycygpKTsKLSAgICAgICAgY2hhbm5lbExpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgQ2hhbm5lbExpc3RlbmVyKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBjb25maWd1cmF0aW9uTWFuYWdlciwgY29udGV4dE1hbmFnZXIpOwotICAgICAgICBjaGFubmVsLmFkZENoYW5uZWxMaXN0ZW5lcihjaGFubmVsTGlzdGVuZXIpOwotCi0gICAgICAgIGJ5dGVbXSBkb21haW4gPSBnZXRDbHVzdGVyRG9tYWluKCk7Ci0gICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyIGRvbWFpbjogIiArIG5ldyBTdHJpbmcoZG9tYWluKSk7Ci0gICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5zZXREb21haW4oZG9tYWluKTsKLQotICAgICAgICAvLyBScGNDaGFubmVsIGlzIGEgQ2hhbm5lbExpc3RlbmVyLiBXaGVuIHRoZSByZXBseSB0byBhIHBhcnRpY3VsYXIgcmVxdWVzdCBjb21lcyBiYWNrLCBpdAotICAgICAgICAvLyBwaWNrcyBpdCB1cC4gRWFjaCBSUEMgaXMgZ2l2ZW4gYSBVVUlELCBoZW5jZSBjYW4gY29ycmVsYXRlIHRoZSByZXF1ZXN0LXJlc3BvbnNlIHBhaXIKLSAgICAgICAgcnBjSW5pdFJlcXVlc3RIYW5kbGVyID0gbmV3IFJwY0luaXRpYWxpemF0aW9uUmVxdWVzdEhhbmRsZXIoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICBycGNJbml0Q2hhbm5lbCA9Ci0gICAgICAgICAgICAgICAgbmV3IFJwY0NoYW5uZWwoVHJpYmVzVXRpbC5nZXRScGNJbml0Q2hhbm5lbElkKGRvbWFpbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwgcnBjSW5pdFJlcXVlc3RIYW5kbGVyKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgUlBDIENoYW5uZWwgZm9yIGRvbWFpbiAiICsgbmV3IFN0cmluZyhkb21haW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1heGltdW1SZXRyaWVzKCk7Ci0gICAgICAgIGNvbmZpZ3VyZU1vZGUoZG9tYWluKTsKLSAgICAgICAgY29uZmlndXJlTWVtYmVyc2hpcFNjaGVtZShkb21haW4sIG1vZGUuZ2V0TWVtYmVyc2hpcE1hbmFnZXJzKCkpOwotICAgICAgICBzZXRNZW1iZXJJbmZvKCk7Ci0KLSAgICAgICAgVHJpYmVzTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lciA9IG5ldyBUcmliZXNNZW1iZXJzaGlwTGlzdGVuZXIocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKTsKLSAgICAgICAgY2hhbm5lbC5hZGRNZW1iZXJzaGlwTGlzdGVuZXIobWVtYmVyc2hpcExpc3RlbmVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5uZWwuc3RhcnQoQ2hhbm5lbC5ERUZBVUxUKTsgLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBtZW1iZXIgam9pbnMgdGhlIGdyb3VwCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxIb3N0ID0gVHJpYmVzVXRpbC5nZXRMb2NhbEhvc3QoY2hhbm5lbCk7Ci0gICAgICAgICAgICBpZiAobG9jYWxIb3N0LnN0YXJ0c1dpdGgoIjEyNy4wLiIpKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbC5zdG9wKENoYW5uZWwuREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdCgiQ2Fubm90IGpvaW4gY2x1c3RlciB1c2luZyBJUCAiICsgbG9jYWxIb3N0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIFBsZWFzZSBzZXQgYW4gSVAgYWRkcmVzcyBvdGhlciB0aGFuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxIb3N0ICsgIiBpbiB0aGUgYXhpczIueG1sIGZpbGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ2hhbm5lbEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHN0YXJ0aW5nIFRyaWJlcyBjaGFubmVsIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmluZm8oIkxvY2FsIE1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXRMb2NhbEhvc3QoY2hhbm5lbCkpOwotICAgICAgICBUcmliZXNVdGlsLnByaW50TWVtYmVycyhwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIpOwotCi0gICAgICAgIG1lbWJlcnNoaXBTY2hlbWUuam9pbkdyb3VwKCk7Ci0KLSAgICAgICAgLy8gSWYgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IGlzIGVuYWJsZWQsIGdldCB0aGUgbGF0ZXN0IGNvbmZpZyBmcm9tIGEgbmVpZ2hib3VyCi0gICAgICAgIGlmIChjb25maWd1cmF0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uTWFuYWdlci5zZXRTZW5kZXIoY2hhbm5lbFNlbmRlcik7Ci0gICAgICAgICAgICBpbml0aWFsaXplU3lzdGVtKG5ldyBHZXRDb25maWd1cmF0aW9uQ29tbWFuZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGNvbnRleHQgcmVwbGljYXRpb24gaXMgZW5hYmxlZCwgZ2V0IHRoZSBsYXRlc3Qgc3RhdGUgZnJvbSBhIG5laWdoYm91cgotICAgICAgICBpZiAoY29udGV4dE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dE1hbmFnZXIuc2V0U2VuZGVyKGNoYW5uZWxTZW5kZXIpOwotICAgICAgICAgICAgY2hhbm5lbExpc3RlbmVyLnNldENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKTsKLSAgICAgICAgICAgIGluaXRpYWxpemVTeXN0ZW0obmV3IEdldFN0YXRlQ29tbWFuZCgpKTsKLSAgICAgICAgICAgIENsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIgY29udGV4dExpc3RlbmVyID0gbmV3IENsdXN0ZXJpbmdDb250ZXh0TGlzdGVuZXIoY2hhbm5lbFNlbmRlcik7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5hZGRDb250ZXh0TGlzdGVuZXIoY29udGV4dExpc3RlbmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAgICAgICAgICAgIHNldE5vblJlcGxpY2FibGVQcm9wZXJ0eShDbHVzdGVyaW5nQ29uc3RhbnRzLkNMVVNURVJfSU5JVElBTElaRUQsICJ0cnVlIik7Ci0gICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlZC4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVtYmVySW5mbygpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBQcm9wZXJ0aWVzIG1lbWJlckluZm8gPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBodHRwVHJhbnNwb3J0ID0gYXhpc0NvbmZpZy5nZXRUcmFuc3BvcnRJbigiaHR0cCIpOwotICAgICAgICBpZiAoaHR0cFRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcG9ydCA9IGh0dHBUcmFuc3BvcnQuZ2V0UGFyYW1ldGVyKCJwb3J0Iik7Ci0gICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVySW5mby5wdXQoImh0dHBQb3J0IiwgcG9ydC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGh0dHBzVHJhbnNwb3J0ID0gYXhpc0NvbmZpZy5nZXRUcmFuc3BvcnRJbigiaHR0cHMiKTsKLSAgICAgICAgaWYgKGh0dHBzVHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwb3J0ID0gaHR0cHNUcmFuc3BvcnQuZ2V0UGFyYW1ldGVyKCJwb3J0Iik7Ci0gICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVySW5mby5wdXQoImh0dHBzUG9ydCIsIHBvcnQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyIGlzQWN0aXZlUGFyYW0gPSBnZXRQYXJhbWV0ZXIoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLklTX0FDVElWRSk7Ci0gICAgICAgIGlmIChpc0FjdGl2ZVBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lbWJlckluZm8uc2V0UHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLklTX0FDVElWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgaXNBY3RpdmVQYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWJlckluZm8uc2V0UHJvcGVydHkoImhvc3ROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmliZXNVdGlsLmdldExvY2FsSG9zdChnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLkxPQ0FMX01FTUJFUl9IT1NUKSkpOwotCi0gICAgICAgIFBhcmFtZXRlciBwcm9wc1BhcmFtID0gZ2V0UGFyYW1ldGVyKCJwcm9wZXJ0aWVzIik7Ci0gICAgICAgIGlmKHByb3BzUGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1FbGUgPSBwcm9wc1BhcmFtLmdldFBhcmFtZXRlckVsZW1lbnQoKTsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdGVyID0gcGFyYW1FbGUuZ2V0Q2hpbGRyZW5XaXRoTG9jYWxOYW1lKCJwcm9wZXJ0eSIpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwcm9wRWxlID0gKE9NRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgbmFtZUF0dHJpYiA9IHByb3BFbGUuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgibmFtZSIpKTsKLSAgICAgICAgICAgICAgICBpZihuYW1lQXR0cmliICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSB2YWx1ZUF0dHJpYiA9IHByb3BFbGUuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgidmFsdWUiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICAodmFsdWVBdHRyaWIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbCA9IHZhbHVlQXR0cmliLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJWYWwgPSByZXBsYWNlUHJvcGVydHkoYXR0cmliVmFsLCBtZW1iZXJJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlckluZm8uc2V0UHJvcGVydHkobmFtZUF0dHJpYi5nZXRBdHRyaWJ1dGVWYWx1ZSgpLCBhdHRyaWJWYWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbWVtYmVySW5mby5yZW1vdmUoImhvc3ROYW1lIik7IC8vIHRoaXMgd2FzIG5lZWRlZCBvbmx5IHRvIHBvcHVsYXRlIG90aGVyIHByb3BlcnRpZXMuIE5vIG5lZWQgdG8gc2VuZCBpdC4KLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lbWJlckluZm8uc3RvcmUoYm91dCwgIiIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNhbm5vdCBzdG9yZSBtZW1iZXIgdHJhbnNwb3J0IHByb3BlcnRpZXMgaW4gdGhlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjaGFubmVsLmdldE1lbWJlcnNoaXBTZXJ2aWNlKCkuc2V0UGF5bG9hZChib3V0LnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlUHJvcGVydHkoU3RyaW5nIHRleHQsIFByb3BlcnRpZXMgcHJvcHMpIHsKLSAgICAgICAgaW50IGluZGV4T2ZTdGFydGluZ0NoYXJzID0gLTE7Ci0gICAgICAgIGludCBpbmRleE9mQ2xvc2luZ0JyYWNlOwotCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGRlYWxzIHdpdGggcHJvcGVydGllcy4KLSAgICAgICAgLy8gUHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGFzICR7c3lzdGVtLnByb3BlcnR5fSwKLSAgICAgICAgLy8gYW5kIGFyZSBhc3N1bWVkIHRvIGJlIFN5c3RlbSBwcm9wZXJ0aWVzCi0gICAgICAgIHdoaWxlIChpbmRleE9mU3RhcnRpbmdDaGFycyA8IHRleHQuaW5kZXhPZigiJHsiKSAmJgotICAgICAgICAgICAgICAgKGluZGV4T2ZTdGFydGluZ0NoYXJzID0gdGV4dC5pbmRleE9mKCIkeyIpKSAhPSAtMSAmJgotICAgICAgICAgICAgKGluZGV4T2ZDbG9zaW5nQnJhY2UgPSB0ZXh0LmluZGV4T2YoIn0iKSkgIT0gLTEpIHsgLy8gSXMgYSBwcm9wZXJ0eSB1c2VkPwotICAgICAgICAgICAgU3RyaW5nIHN5c1Byb3AgPSB0ZXh0LnN1YnN0cmluZyhpbmRleE9mU3RhcnRpbmdDaGFycyArIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZDbG9zaW5nQnJhY2UpOwotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KHN5c1Byb3ApOwotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4T2ZTdGFydGluZ0NoYXJzKSArIHByb3BWYWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKGluZGV4T2ZDbG9zaW5nQnJhY2UgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG1lbWJlcnNoaXAgc2NoZW1lIGFwcGxpY2FibGUgdG8gdGhpcyBjbHVzdGVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZW1iZXJzaGlwIHNjaGVtZS4gT25seSAid2thIiAmICJtdWx0aWNhc3QiIGFyZSB2YWxpZCByZXR1cm4gdmFsdWVzLgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHRoZSBtZW1iZXJzaGlwU2NoZW1lIHNwZWNpZmllZCBpbiB0aGUgYXhpczIueG1sIGZpbGUgaXMgaW52YWxpZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldE1lbWJlcnNoaXBTY2hlbWUoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgUGFyYW1ldGVyIG1lbWJlcnNoaXBTY2hlbWVQYXJhbSA9Ci0gICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5NRU1CRVJTSElQX1NDSEVNRSk7Ci0gICAgICAgIFN0cmluZyBtYnJTY2hlbWUgPSBDbHVzdGVyaW5nQ29uc3RhbnRzLk1lbWJlcnNoaXBTY2hlbWUuTVVMVElDQVNUX0JBU0VEOwotICAgICAgICBpZiAobWVtYmVyc2hpcFNjaGVtZVBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1iclNjaGVtZSA9ICgoU3RyaW5nKSBtZW1iZXJzaGlwU2NoZW1lUGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbWJyU2NoZW1lLmVxdWFscyhDbHVzdGVyaW5nQ29uc3RhbnRzLk1lbWJlcnNoaXBTY2hlbWUuTVVMVElDQVNUX0JBU0VEKSAmJgotICAgICAgICAgICAgIW1iclNjaGVtZS5lcXVhbHMoQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLldLQV9CQVNFRCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSW52YWxpZCBtZW1iZXJzaGlwIHNjaGVtZSAnIiArIG1iclNjaGVtZSArICInLiBTdXBwb3J0ZWQgc2NoZW1lcyBhcmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLk1VTFRJQ0FTVF9CQVNFRCArICIgJiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29uc3RhbnRzLk1lbWJlcnNoaXBTY2hlbWUuV0tBX0JBU0VEOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1iclNjaGVtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNsdXN0ZXJpbmcgZG9tYWluIHRvIHdoaWNoIHRoaXMgbm9kZSBiZWxvbmdzIHRvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjbHVzdGVyaW5nIGRvbWFpbiB0byB3aGljaCB0aGlzIG5vZGUgYmVsb25ncyB0bwotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIGdldENsdXN0ZXJEb21haW4oKSB7Ci0gICAgICAgIFBhcmFtZXRlciBkb21haW5QYXJhbSA9IGdldFBhcmFtZXRlcihDbHVzdGVyaW5nQ29uc3RhbnRzLlBhcmFtZXRlcnMuRE9NQUlOKTsKLSAgICAgICAgYnl0ZVtdIGRvbWFpbjsKLSAgICAgICAgaWYgKGRvbWFpblBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRvbWFpbiA9ICgoU3RyaW5nKSBkb21haW5QYXJhbS5nZXRWYWx1ZSgpKS5nZXRCeXRlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG9tYWluID0gQ2x1c3RlcmluZ0NvbnN0YW50cy5ERUZBVUxUX0RPTUFJTi5nZXRCeXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb21haW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzLCBpZiBtZXNzYWdlIHNlbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIG5vZGUgZmFpbHMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TWF4aW11bVJldHJpZXMoKSB7Ci0gICAgICAgIFBhcmFtZXRlciBtYXhSZXRyaWVzUGFyYW0gPSBnZXRQYXJhbWV0ZXIoVHJpYmVzQ29uc3RhbnRzLk1BWF9SRVRSSUVTKTsKLSAgICAgICAgaW50IG1heFJldHJpZXMgPSAxMDsKLSAgICAgICAgaWYgKG1heFJldHJpZXNQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXhSZXRyaWVzID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBtYXhSZXRyaWVzUGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVwbGljYXRpb25UcmFuc21pdHRlciByZXBsaWNhdGlvblRyYW5zbWl0dGVyID0KLSAgICAgICAgICAgICAgICAoUmVwbGljYXRpb25UcmFuc21pdHRlcikgY2hhbm5lbC5nZXRDaGFubmVsU2VuZGVyKCk7Ci0gICAgICAgIE11bHRpUG9pbnRTZW5kZXIgbXVsdGlQb2ludFNlbmRlciA9IHJlcGxpY2F0aW9uVHJhbnNtaXR0ZXIuZ2V0VHJhbnNwb3J0KCk7Ci0gICAgICAgIG11bHRpUG9pbnRTZW5kZXIuc2V0TWF4UmV0cnlBdHRlbXB0cyhtYXhSZXRyaWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIsIHdoaWNoIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gICAgICoge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXJ9IGlzIGFkZGVkIHRvIHRoZSBJbkZsb3cgJiBJbkZhdWx0Rmxvdy4gVGhpcyBoYW5kbGVyCi0gICAgICogaXMgdXNlZCBmb3IgcmVqZWN0aW5nIFdlYiBzZXJ2aWNlIHJlcXVlc3RzIHVudGlsIHRoaXMgbm9kZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gVGhpcyBoYW5kbGVyCi0gICAgICogY2FuIGFsc28gYmUgdXNlZCBmb3IgcmVqZWN0aW5nIHJlcXVlc3RzIHdoZW4gdGhpcyBub2RlIGlzIHJlaW5pdGlhbGl6aW5nIG9yIGlzIGluIGFuCi0gICAgICogaW5jb25zaXN0ZW50IHN0YXRlICh3aGljaCBjYW4gaGFwcGVuIHdoZW4gYSBjb25maWd1cmF0aW9uIGNoYW5nZSBpcyB0YWtpbmcgcGxhY2UpLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRSZXF1ZXN0QmxvY2tpbmdIYW5kbGVyVG9JbkZsb3dzKCkgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkpIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBvOwotICAgICAgICAgICAgaWYgKHBoYXNlIGluc3RhbmNlb2YgRGlzcGF0Y2hQaGFzZSkgewotICAgICAgICAgICAgICAgIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIgcmVxdWVzdEJsb2NraW5nSGFuZGxlciA9IG5ldyBSZXF1ZXN0QmxvY2tpbmdIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwaGFzZS5nZXRIYW5kbGVycygpLmNvbnRhaW5zKHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcnVsZS5zZXRBZnRlcigiU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bGUuc2V0QmVmb3JlKCJJbnN0YW5jZURpc3BhdGNoZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJEZXNjID0gcmVxdWVzdEJsb2NraW5nSGFuZGxlci5nZXRIYW5kbGVyRGVzYygpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyRGVzYy5zZXRIYW5kbGVyKHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyRGVzYy5zZXROYW1lKENsdXN0ZXJpbmdDb25zdGFudHMuUkVRVUVTVF9CTE9DS0lOR19IQU5ETEVSKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckRlc2Muc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIocmVxdWVzdEJsb2NraW5nSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCAiICsgQ2x1c3RlcmluZ0NvbnN0YW50cy5SRVFVRVNUX0JMT0NLSU5HX0hBTkRMRVIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZXR3ZWVuIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciAmIEluc3RhbmNlRGlzcGF0Y2hlciB0byBJbkZsb3ciKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBheGlzQ29uZmlnLmdldEluRmF1bHRGbG93UGhhc2VzKCkpIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBvOwotICAgICAgICAgICAgaWYgKHBoYXNlIGluc3RhbmNlb2YgRGlzcGF0Y2hQaGFzZSkgewotICAgICAgICAgICAgICAgIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIgcmVxdWVzdEJsb2NraW5nSGFuZGxlciA9IG5ldyBSZXF1ZXN0QmxvY2tpbmdIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwaGFzZS5nZXRIYW5kbGVycygpLmNvbnRhaW5zKHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcnVsZS5zZXRBZnRlcigiU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bGUuc2V0QmVmb3JlKCJJbnN0YW5jZURpc3BhdGNoZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJEZXNjID0gcmVxdWVzdEJsb2NraW5nSGFuZGxlci5nZXRIYW5kbGVyRGVzYygpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyRGVzYy5zZXRIYW5kbGVyKHJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyRGVzYy5zZXROYW1lKENsdXN0ZXJpbmdDb25zdGFudHMuUkVRVUVTVF9CTE9DS0lOR19IQU5ETEVSKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckRlc2Muc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIocmVxdWVzdEJsb2NraW5nSGFuZGxlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCAiICsgQ2x1c3RlcmluZ0NvbnN0YW50cy5SRVFVRVNUX0JMT0NLSU5HX0hBTkRMRVIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZXR3ZWVuIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciAmIEluc3RhbmNlRGlzcGF0Y2hlciB0byBJbkZhdWx0RmxvdyIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTW9kZShieXRlW10gZG9tYWluKSB7Ci0gICAgICAgIGlmIChsb2FkQmFsYW5jZU1vZGUpIHsKLSAgICAgICAgICAgIG1vZGUgPSBuZXcgTG9hZEJhbGFuY2VyTW9kZShkb21haW4sIGxiRXZlbnRIYW5kbGVycywgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1vZGUgPSBuZXcgQXBwbGljYXRpb25Nb2RlKGRvbWFpbiwgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICBtb2RlLmluaXQoY2hhbm5lbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIHJlbGF0ZWQgdG8gZGlmZmVyZW50IG1lbWJlcnNoaXAgbWFuYWdlbWVudCBzY2hlbWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2FsRG9tYWluICAgICAgICBUaGUgY2x1c3RlcmluZyBsb2FkQmFsYW5jZXJEb21haW4gdG8gd2hpY2ggdGhpcyBtZW1iZXIgYmVsb25ncyB0bwotICAgICAqIEBwYXJhbSBtZW1iZXJzaGlwTWFuYWdlcnMgTWVtYmVyc2hpcE1hbmFnZXJzIGZvciBkaWZmZXJlbnQgZG9tYWlucwotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHRoZSBtZW1iZXJzaGlwIHNjaGVtZSBpcyBpbnZhbGlkLCBvciBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBjb25maWd1cmluZyBtZW1iZXJzaGlwIHNjaGVtZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVNZW1iZXJzaGlwU2NoZW1lKGJ5dGVbXSBsb2NhbERvbWFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlcnNoaXBNYW5hZ2VyPiBtZW1iZXJzaGlwTWFuYWdlcnMpCi0gICAgICAgICAgICB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lcjsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihDbHVzdGVyaW5nQ29uc3RhbnRzLlBhcmFtZXRlcnMuTUVNQkVSU0hJUF9MSVNURU5FUik7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IHBhcmFtRWxlID0gcGFyYW1ldGVyLmdldFBhcmFtZXRlckVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGF6eiA9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoImNsYXNzIikpLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBMaXN0ZW5lciA9IChNZW1iZXJzaGlwTGlzdGVuZXIpIENsYXNzLmZvck5hbWUoY2xhenopLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ2Fubm90IGluc3RhbnRpYXRlIE1lbWJlcnNoaXBMaXN0ZW5lciAiICsgY2xheno7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT01FbGVtZW50IHByb3BzRWxlID0gcGFyYW1FbGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgicHJvcGVydGllcyIpKTsKLSAgICAgICAgICAgIGlmIChwcm9wc0VsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcHNFbGUuZ2V0Q2hpbGRFbGVtZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHByb3BFbGUgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgbmFtZUF0dHJpYiA9IHByb3BFbGUuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgibmFtZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVBdHRyaWIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lQXR0cmliLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnN0YW5jZVByb3BlcnR5KG5hbWUsIHByb3BFbGUuZ2V0VGV4dCgpLnRyaW0oKSwgbWVtYmVyc2hpcExpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzY2hlbWUgPSBnZXRNZW1iZXJzaGlwU2NoZW1lKCk7Ci0gICAgICAgIGxvZy5pbmZvKCJVc2luZyAiICsgc2NoZW1lICsgIiBiYXNlZCBtZW1iZXJzaGlwIG1hbmFnZW1lbnQgc2NoZW1lIik7Ci0gICAgICAgIGlmIChzY2hlbWUuZXF1YWxzKENsdXN0ZXJpbmdDb25zdGFudHMuTWVtYmVyc2hpcFNjaGVtZS5XS0FfQkFTRUQpKSB7Ci0gICAgICAgICAgICBtZW1iZXJzaGlwU2NoZW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFdrYUJhc2VkTWVtYmVyc2hpcFNjaGVtZShjaGFubmVsLCBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNoaXBNYW5hZ2VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycywgbG9jYWxEb21haW4sIG1lbWJlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm9vbGVhblBhcmFtKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5BVE1PU1RfT05DRV9NU0dfU0VNQU5USUNTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCb29sZWFuUGFyYW0oQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLlBSRVNFUlZFX01TR19PUkRFUikpOwotICAgICAgICB9IGVsc2UgaWYgKHNjaGVtZS5lcXVhbHMoQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLk1VTFRJQ0FTVF9CQVNFRCkpIHsKLSAgICAgICAgICAgIG1lbWJlcnNoaXBTY2hlbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTXVsdGljYXN0QmFzZWRNZW1iZXJzaGlwU2NoZW1lKGNoYW5uZWwsIG1vZGUsIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxEb21haW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm9vbGVhblBhcmFtKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5BVE1PU1RfT05DRV9NU0dfU0VNQU5USUNTKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCb29sZWFuUGFyYW0oQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLlBSRVNFUlZFX01TR19PUkRFUikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJbnZhbGlkIG1lbWJlcnNoaXAgc2NoZW1lICciICsgc2NoZW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJy4gU3VwcG9ydGVkIHNjaGVtZXMgYXJlIG11bHRpY2FzdCAmIHdrYSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnKTsKLSAgICAgICAgfQotICAgICAgICBtZW1iZXJzaGlwU2NoZW1lLmluaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhblBhcmFtKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJvb2xlYW4udmFsdWVPZigoKFN0cmluZykgdmFsdWUpLnRyaW0oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFuZCBpbnZva2UgdGhlIHNldHRlciBtZXRob2Qgd2l0aCB0aGUgbmFtZSBvZiBmb3JtIHNldFhYWCBwYXNzaW5nIGluIHRoZSB2YWx1ZSBnaXZlbgotICAgICAqIG9uIHRoZSBQT0pPIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgc2V0dGVyIGZpZWxkCi0gICAgICogQHBhcmFtIHZhbCAgdmFsdWUgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtIG9iaiAgUE9KTyBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBzZXR0aW5nIHRoZSBwcm9wZXJ0eQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRJbnN0YW5jZVByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsLCBPYmplY3Qgb2JqKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLQotICAgICAgICBTdHJpbmcgbU5hbWUgPSAic2V0IiArIENoYXJhY3Rlci50b1VwcGVyQ2FzZShuYW1lLmNoYXJBdCgwKSkgKyBuYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBib29sZWFuIGludm9rZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZDEgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OYW1lLmVxdWFscyhtZXRob2QxLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbXMgPSBtZXRob2QxLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbigiRGlkIG5vdCBmaW5kIGEgc2V0dGVyIG1ldGhvZCBuYW1lZCA6ICIgKyBtTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigpIHRoYXQgdGFrZXMgYSBzaW5nbGUgU3RyaW5nLCBpbnQsIGxvbmcsIGZsb2F0LCBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGJvb2xlYW4gcGFyYW1ldGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSB2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zWzBdLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgU3RyaW5nW117dmFsdWV9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zWzBdLmVxdWFscyhpbnQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBpbnQuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgSW50ZWdlcltde25ldyBJbnRlZ2VyKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXNbMF0uZXF1YWxzKGxvbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBsb25nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG9iaiwgbmV3IExvbmdbXXtuZXcgTG9uZyh2YWx1ZSl9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1zWzBdLmVxdWFscyhmbG9hdC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QobU5hbWUsIGZsb2F0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG9iaiwgbmV3IEZsb2F0W117bmV3IEZsb2F0KHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXNbMF0uZXF1YWxzKGRvdWJsZS5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QobU5hbWUsIGRvdWJsZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBEb3VibGVbXXtuZXcgRG91YmxlKHZhbHVlKX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbXNbMF0uZXF1YWxzKGJvb2xlYW4uY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1OYW1lLCBib29sZWFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKG9iaiwgbmV3IEJvb2xlYW5bXXtCb29sZWFuLnZhbHVlT2YodmFsdWUpfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbigiRGlkIG5vdCBmaW5kIGEgc2V0dGVyIG1ldGhvZCBuYW1lZCA6ICIgKyBtTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZywgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYm9vbGVhbiBwYXJhbWV0ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbMF0uZXF1YWxzKE9NRWxlbWVudC5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QobU5hbWUsIE9NRWxlbWVudC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBPTUVsZW1lbnRbXXsoT01FbGVtZW50KSB2YWx9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnZva2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghaW52b2tlZCkgewotICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbigiRGlkIG5vdCBmaW5kIGEgc2V0dGVyIG1ldGhvZCBuYW1lZCA6ICIgKyBtTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoKSB0aGF0IHRha2VzIGEgc2luZ2xlIFN0cmluZywgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYm9vbGVhbiBwYXJhbWV0ZXIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKCJFcnJvciBpbnZva2luZyBzZXR0ZXIgbWV0aG9kIG5hbWVkIDogIiArIG1OYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCkgdGhhdCB0YWtlcyBhIHNpbmdsZSBTdHJpbmcsIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYm9vbGVhbiBwYXJhbWV0ZXIiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oU3RyaW5nIG1zZykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KG1zZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHNvbWUgaW5mb3JtYXRpb24gZnJvbSBhIG5laWdoYm91ci4gVGhpcyBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhpcyBub2RlIHRvCi0gICAgICogaW5pdGlhbGl6ZSBpdHNlbGYKLSAgICAgKiA8cC8+Ci0gICAgICogcnBjQ2hhbm5lbCBpcyBUaGUgdXRpbGl0eSBmb3Igc2VuZGluZyBSUEMgc3R5bGUgbWVzc2FnZXMgdG8gdGhlIGNoYW5uZWwKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21tYW5kIFRoZSBjb250cm9sIGNvbW1hbmQgdG8gc2VuZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGluaXRpYWxpemF0aW9uIGNvZGUgZmFpbGVkIG9uIHRoaXMgbm9kZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU3lzdGVtKENvbnRyb2xDb21tYW5kIGNvbW1hbmQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbWVtYmVyIGluIHRoZSBjbHVzdGVyLAotICAgICAgICAvLyAgZ2V0IHRoZSBjdXJyZW50IGluaXRpYWxpemF0aW9uIGluZm8gZnJvbSBhIG1lbWJlcgotICAgICAgICBpbnQgbnVtYmVyT2ZUcmllcyA9IDA7IC8vIERvbid0IGtlZXAgb24gdHJ5aW5nIGluZGVmaW5pdGVseQotCi0gICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgbWVtYmVycyB0byB3aG9tIHdlIGFscmVhZHkgc2VudCBhbiBpbml0aWFsaXphdGlvbiBjb21tYW5kCi0gICAgICAgIC8vIERvIG5vdCBzZW5kIGFub3RoZXIgcmVxdWVzdCB0byB0aGVzZSBtZW1iZXJzCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzZW50TWVtYmVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgc2VudE1lbWJlcnNMaXN0LmFkZChUcmliZXNVdGlsLmdldExvY2FsSG9zdChjaGFubmVsKSk7Ci0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVycygpOwotICAgICAgICBpZiAobWVtYmVycy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG1lbWJlcnMubGVuZ3RoID4gMCAmJiBudW1iZXJPZlRyaWVzIDwgNSkgewotICAgICAgICAgICAgTWVtYmVyIG1lbWJlciA9IChudW1iZXJPZlRyaWVzID09IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9uZ2VzdExpdmluZ01lbWJlcigpIDogLy8gRmlyc3QgdHJ5IHRvIGdldCBmcm9tIHRoZSBsb25nZXN0IG1lbWJlciBhbGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5nZXRSYW5kb21NZW1iZXIoKTsgLy8gRWxzZSBnZXQgZnJvbSBhIHJhbmRvbSBtZW1iZXIKLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJIb3N0ID0gVHJpYmVzVXRpbC5nZXROYW1lKG1lbWJlcik7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVHJ5aW5nIHRvIHNlbmQgaW50aWFsaXphdGlvbiByZXF1ZXN0IHRvICIgKyBtZW1iZXJIb3N0KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZW50TWVtYmVyc0xpc3QuY29udGFpbnMobWVtYmVySG9zdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2VbXSByZXNwb25zZXM7Ci0vLyAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMgPSBycGNJbml0Q2hhbm5lbC5zZW5kKG5ldyBNZW1iZXJbXXttZW1iZXJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnBjQ2hhbm5lbC5GSVJTVF9SRVBMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDApOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IElmIHdlIGRvIG5vdCBnZXQgYSByZXNwb25zZSB3aXRoaW4gc29tZSB0aW1lLCB0cnkgdG8gcmVjb3ZlciBmcm9tIHRoaXMgZmF1bHQKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3BvbnNlcy5sZW5ndGggPT0gMCB8fCByZXNwb25zZXNbMF0gPT0gbnVsbCB8fCByZXNwb25zZXNbMF0uZ2V0TWVzc2FnZSgpID09IG51bGwpOyAgICAvLyBUT0RPOiAjIyMjIFdlIHdpbGwgbmVlZCB0byBjaGVjayB0aGlzCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZXMubGVuZ3RoICE9IDAgJiYgcmVzcG9uc2VzWzBdICE9IG51bGwgJiYgcmVzcG9uc2VzWzBdLmdldE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKENvbnRyb2xDb21tYW5kKSByZXNwb25zZXNbMF0uZ2V0TWVzc2FnZSgpKS5leGVjdXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsgLy8gRG8gdGhlIGluaXRpYWxpemF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZ2V0IGluaXRpYWxpemF0aW9uIGluZm9ybWF0aW9uIGZyb20gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlckhvc3QgKyAiLiBXaWxsIHJldHJ5IGluIDIgc2Vjcy4iLCBlKTsKLSAgICAgICAgICAgICAgICBzZW50TWVtYmVyc0xpc3QuYWRkKG1lbWJlckhvc3QpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW50ZXJydXB0ZWQiLCBpZ25vcmVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBudW1iZXJPZlRyaWVzKys7Ci0gICAgICAgICAgICBtZW1iZXJzID0gcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsKLSAgICAgICAgICAgIGlmIChudW1iZXJPZlRyaWVzID49IG1lbWJlcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uTWFuYWdlcihDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlcikgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25NYW5hZ2VyID0gKERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcikgY29uZmlndXJhdGlvbk1hbmFnZXI7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbk1hbmFnZXIuc2V0U2VuZGVyKGNoYW5uZWxTZW5kZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRNYW5hZ2VyKENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyKSB7Ci0gICAgICAgIHRoaXMuY29udGV4dE1hbmFnZXIgPSAoRGVmYXVsdENvbnRleHRNYW5hZ2VyKSBjb250ZXh0TWFuYWdlcjsKLSAgICAgICAgdGhpcy5jb250ZXh0TWFuYWdlci5zZXRTZW5kZXIoY2hhbm5lbFNlbmRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlcnMucHV0KHBhcmFtLmdldE5hbWUoKSwgcGFyYW0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgbXNnIDogcGFyYW1ldGVycy5rZXlTZXQoKSkgewotICAgICAgICAgICAgbGlzdC5hZGQocGFyYW1ldGVycy5nZXQobXNnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyICE9IG51bGwgJiYgcGFyYW1ldGVyLmlzTG9ja2VkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlcnMucmVtb3ZlKHBhcmFtLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2h1dGRvd24gdGhlIGNsdXN0ZXIuIFRoaXMgbWVtYmVyIHdpbGwgbGVhdmUgdGhlIGNsdXN0ZXIgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2h1dHRpbmcgZG93bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGxvZy5kZWJ1ZygiRW50ZXI6IFRyaWJlc0NsdXN0ZXJNYW5hZ2VyOjpzaHV0ZG93biIpOwotICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNoYW5uZWwucmVtb3ZlQ2hhbm5lbExpc3RlbmVyKHJwY0luaXRDaGFubmVsKTsKLSAgICAgICAgICAgICAgICBjaGFubmVsLnJlbW92ZUNoYW5uZWxMaXN0ZW5lcihjaGFubmVsTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIGNoYW5uZWwuc3RvcChDaGFubmVsLkRFRkFVTFQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2hhbm5lbEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBUcmliZXNDbHVzdGVyTWFuYWdlcjo6c2h1dGRvd24iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2x1c3RlcmluZ0ZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZygiRXhpdDogVHJpYmVzQ2x1c3Rlck1hbmFnZXI6OnNodXRkb3duIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICBpZiAocnBjSW5pdFJlcXVlc3RIYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJwY0luaXRSZXF1ZXN0SGFuZGxlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5uZWxMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGFubmVsTGlzdGVuZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHRNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB0byBjaGVjayB3aGV0aGVyIGFsbCBtZW1iZXJzIGluIHRoZSBjbHVzdGVyIGhhdmUgdG8gYmUga2VwdCBpbiBzeW5jIGF0IGFsbCB0aW1lcy4KLSAgICAgKiBUeXBpY2FsbHksIHRoaXMgd2lsbCByZXF1aXJlIGVhY2ggbWVtYmVyIGluIHRoZSBjbHVzdGVyIHRvIEFDS25vd2xlZGdlIHJlY2VpcHQgb2YgYQotICAgICAqIHBhcnRpY3VsYXIgbWVzc2FnZSwgd2hpY2ggbWF5IGhhdmUgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBoaXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgLSBpZiBhbGwgbWVtYmVycyBpbiB0aGUgY2x1c3RlciBzaG91bGQgYmUga2VwdCBpbiBzeW5jIGF0IGFsbCB0aW1lcywgZmFsc2UKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN5bmNocm9uaXplQWxsTWVtYmVycygpIHsKLSAgICAgICAgUGFyYW1ldGVyIHN5bmNBbGxQYXJhbSA9IGdldFBhcmFtZXRlcihDbHVzdGVyaW5nQ29uc3RhbnRzLlBhcmFtZXRlcnMuU1lOQ0hST05JWkVfQUxMX01FTUJFUlMpOwotICAgICAgICByZXR1cm4gc3luY0FsbFBhcmFtID09IG51bGwgfHwgQm9vbGVhbi5wYXJzZUJvb2xlYW4oKFN0cmluZykgc3luY0FsbFBhcmFtLmdldFZhbHVlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjgyNmU5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgd2hpY2ggYXJlIHNwZWNpZmljIHRvIFRyaWJlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJpYmVzQ29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBJRCBvZiB0aGUgUlBDIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgY2hhbm5lbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQ19JTklUX0NIQU5ORUwgPSAicnBjLmluaXQuY2hhbm5lbCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSUQgb2YgdGhlIFJQQyBtZW1iZXJzaGlwIG1lc3NhZ2UgY2hhbm5lbC4gVGhpcyBjaGFubmVsIGlzIG9ubHkgdXNlZCB3aGVuIFdLQQotICAgICAqIG1lbWJlcnNoaXAgZGlzY292ZXJ5IG1lY2hhbmlzbSBpcyB1c2VkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlBDX01FTUJFUlNISVBfQ0hBTk5FTCA9ICJycGMubWVtYmVyc2hpcC5jaGFubmVsIjsKLQotICAgIC8vIE1lc3NhZ2Ugc2VuZGluZyBhbmQgcmVjZWl2aW5nIG9wdGlvbnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1JERVJfT1BUSU9OID0gNTEyOwotCi0gICAgLy8gT3B0aW9uIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBtZXNzYWdlIGlzIHJlbGF0ZWQgdG8gbWVtYmVyc2hpcAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTUJFUlNISVBfTVNHX09QVElPTiA9IDEwMjQ7Ci0KLSAgICAvLyBPcHRpb24gdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIG1lc3NhZ2Ugc2hvdWxkIGJlIHByb2Nlc3NlZCBhdC1tb3N0IG9uY2UKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVF9NT1NUX09OQ0VfT1BUSU9OID0gMjA0ODsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFJQQ19DSEFOTkVMX0lEID0gImF4aXMyLnJwYy5jaGFubmVsIi5nZXRCeXRlcygpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfTUVNQkVSX0hPU1QgPSAibG9jYWxNZW1iZXJIb3N0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9NRU1CRVJfUE9SVCA9ICJsb2NhbE1lbWJlclBvcnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUNBU1RfQUREUkVTUyA9ICJtY2FzdEFkZHJlc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DQVNUX0JJTkRfQUREUkVTUyA9ICJtdWx0aWNhc3RCaW5kQWRkcmVzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUNBU1RfUE9SVCA9ICJtY2FzdFBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DQVNUX0ZSRVFVRU5DWSA9ICJtY2FzdEZyZXF1ZW5jeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNQkVSX0RST1BfVElNRSA9ICJtZW1iZXJEcm9wVGltZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUNBU1RfQ0xVU1RFUl9ET01BSU4gPSAibWNhc3RDbHVzdGVyRG9tYWluIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQ1BfTElTVEVOX0hPU1QgPSAidGNwTGlzdGVuSG9zdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORF9BRERSRVNTID0gImJpbmRBZGRyZXNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQ1BfTElTVEVOX1BPUlQgPSAidGNwTGlzdGVuUG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1JFVFJJRVMgPSAibWF4UmV0cmllcyI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc01lbWJlcnNoaXBMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNNZW1iZXJzaGlwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2MDUzZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL1RyaWJlc01lbWJlcnNoaXBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcnNoaXBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBNZW1iZXJzaGlwIGNoYW5nZXMgYXJlIG5vdGlmaWVkIHVzaW5nIHRoaXMgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFRyaWJlc01lbWJlcnNoaXBMaXN0ZW5lciBpbXBsZW1lbnRzIE1lbWJlcnNoaXBMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVHJpYmVzTWVtYmVyc2hpcExpc3RlbmVyLmNsYXNzKTsKLSAgICBwcml2YXRlIE1lbWJlcnNoaXBNYW5hZ2VyIG1lbWJlcnNoaXBNYW5hZ2VyOwotCi0gICAgcHVibGljIFRyaWJlc01lbWJlcnNoaXBMaXN0ZW5lcihNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBNYW5hZ2VyID0gbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWVtYmVyQWRkZWQoTWVtYmVyIG1lbWJlcikgewotICAgICAgICBpZiAobWVtYmVyc2hpcE1hbmFnZXIubWVtYmVyQWRkZWQobWVtYmVyKSkgewotICAgICAgICAgICAgbG9nLmluZm8oIk5ldyBtZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsgIiBqb2luZWQgY2x1c3Rlci4iKTsKLSAgICAgICAgICAgIC8qaWYgKFRyaWJlc1V0aWwudG9BeGlzMk1lbWJlcihtZW1iZXIpLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB9Ki8KLSAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIrKysrKysgSVMgQ09PUkQ9IitUcmliZXNDbHVzdGVyTWFuYWdlci5uYmMuaXNDb29yZGluYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZW1iZXJEaXNhcHBlYXJlZChNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJNZW1iZXIgIiArIFRyaWJlc1V0aWwuZ2V0TmFtZShtZW1iZXIpICsgIiBsZWZ0IGNsdXN0ZXIiKTsKLSAgICAgICAgbWVtYmVyc2hpcE1hbmFnZXIubWVtYmVyRGlzYXBwZWFyZWQobWVtYmVyKTsKLQotLy8gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiKysrKysrIElTIENPT1JEPSIrVHJpYmVzQ2x1c3Rlck1hbmFnZXIubmJjLmlzQ29vcmRpbmF0b3IoKSk7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvVHJpYmVzVXRpbC5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZGZkZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9UcmliZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuQ2hhbm5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRyaWJlc1V0aWwgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRyaWJlc1V0aWwuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWVtYmVycyhNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gbWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVycygpOwotICAgICAgICBpZiAobWVtYmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gbWVtYmVycy5sZW5ndGg7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJNZW1iZXJzIG9mIGN1cnJlbnQgY2x1c3RlciIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk1lbWJlciIgKyAoaSArIDEpICsgIiAiICsgZ2V0TmFtZShtZW1iZXJzW2ldKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiTm8gbWVtYmVycyBpbiBjdXJyZW50IGNsdXN0ZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoTWVtYmVyIG1lbWJlcikgewotICAgICAgICByZXR1cm4gZ2V0SG9zdChtZW1iZXIpICsgIjoiICsgbWVtYmVyLmdldFBvcnQoKSArICIoIiArIG5ldyBTdHJpbmcobWVtYmVyLmdldERvbWFpbigpKSArICIpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIb3N0KE1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgYnl0ZVtdIGhvc3RCeXRlcyA9IG1lbWJlci5nZXRIb3N0KCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBob3N0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpZiAoaG9zdEJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaG9zdEJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGhvc3RCeXRlID0gaG9zdEJ5dGVzW2ldID49IDAgPyAoaW50KSBob3N0Qnl0ZXNbaV0gOiAoaW50KSBob3N0Qnl0ZXNbaV0gKyAyNTY7Ci0gICAgICAgICAgICAgICAgaG9zdC5hcHBlbmQoaG9zdEJ5dGUpOwotICAgICAgICAgICAgICAgIGlmIChpIDwgaG9zdEJ5dGVzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaG9zdC5hcHBlbmQoIi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhvc3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbEhvc3QoQ2hhbm5lbCBjaGFubmVsKSB7Ci0gICAgICAgIHJldHVybiBnZXROYW1lKGNoYW5uZWwuZ2V0TG9jYWxNZW1iZXIodHJ1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsSG9zdChQYXJhbWV0ZXIgdGNwTGlzdGVuSG9zdCl7Ci0gICAgICAgIFN0cmluZyBob3N0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRjcExpc3Rlbkhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaG9zdCA9ICgoU3RyaW5nKSB0Y3BMaXN0ZW5Ib3N0LmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaG9zdCA9IFV0aWxzLmdldElwQWRkcmVzcygpOwotICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNvdWxkIG5vdCBnZXQgbG9jYWwgSVAgYWRkcmVzcyI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShDbHVzdGVyaW5nQ29uc3RhbnRzLkxPQ0FMX0lQX0FERFJFU1MpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5MT0NBTF9JUF9BRERSRVNTKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaG9zdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRScGNNZW1iZXJzaGlwQ2hhbm5lbElkKGJ5dGVbXSBkb21haW4pIHsKLSAgICAgICAgcmV0dXJuIChuZXcgU3RyaW5nKGRvbWFpbikgKyAiOiIgKyBUcmliZXNDb25zdGFudHMuUlBDX01FTUJFUlNISVBfQ0hBTk5FTCkuZ2V0Qnl0ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRScGNJbml0Q2hhbm5lbElkKGJ5dGVbXSBkb21haW4pIHsKLSAgICAgICAgcmV0dXJuIChuZXcgU3RyaW5nKGRvbWFpbikgKyAiOiIgKyBUcmliZXNDb25zdGFudHMuUlBDX0lOSVRfQ0hBTk5FTCkuZ2V0Qnl0ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbkRvbWFpbihNZW1iZXIgbWVtYmVyLCBieXRlW10gZG9tYWluKSB7Ci0gICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKGRvbWFpbiwgbWVtYmVyLmdldERvbWFpbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlSW5TYW1lRG9tYWluKE1lbWJlciBtZW1iZXIxLCBNZW1iZXIgbWVtYmVyMikgewotICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhtZW1iZXIxLmdldERvbWFpbigpLCBtZW1iZXIyLmdldERvbWFpbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXIgdG9BeGlzMk1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXIgYXhpczJNZW1iZXIgPQotICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyKFRyaWJlc1V0aWwuZ2V0SG9zdChtZW1iZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci5nZXRQb3J0KCkpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZ2V0UHJvcGVydGllcyhtZW1iZXIuZ2V0UGF5bG9hZCgpKTsKLQotICAgICAgICBTdHJpbmcgaHR0cFBvcnQgPSBwcm9wcy5nZXRQcm9wZXJ0eSgiaHR0cFBvcnQiKTsKLSAgICAgICAgaWYgKGh0dHBQb3J0ICE9IG51bGwgJiYgaHR0cFBvcnQudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGF4aXMyTWVtYmVyLnNldEh0dHBQb3J0KEludGVnZXIucGFyc2VJbnQoaHR0cFBvcnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBodHRwc1BvcnQgPSBwcm9wcy5nZXRQcm9wZXJ0eSgiaHR0cHNQb3J0Iik7Ci0gICAgICAgIGlmIChodHRwc1BvcnQgIT0gbnVsbCAmJiBodHRwc1BvcnQudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGF4aXMyTWVtYmVyLnNldEh0dHBzUG9ydChJbnRlZ2VyLnBhcnNlSW50KGh0dHBzUG9ydCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlzQWN0aXZlID0gcHJvcHMuZ2V0UHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLklTX0FDVElWRSk7Ci0gICAgICAgIGlmIChpc0FjdGl2ZSAhPSBudWxsICYmIGlzQWN0aXZlLnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBheGlzMk1lbWJlci5zZXRBY3RpdmUoQm9vbGVhbi52YWx1ZU9mKGlzQWN0aXZlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBheGlzMk1lbWJlci5zZXREb21haW4obmV3IFN0cmluZyhtZW1iZXIuZ2V0RG9tYWluKCkpKTsKLSAgICAgICAgYXhpczJNZW1iZXIuc2V0UHJvcGVydGllcyhwcm9wcyk7Ci0gICAgICAgIHJldHVybiBheGlzMk1lbWJlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoYnl0ZVtdIHBheWxvYWQpIHsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGF5bG9hZCk7Ci0gICAgICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBwcm9wcy5sb2FkKGJpbik7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZXJyb3Igd2lsbCBuZXZlciBvY2N1cgotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Xa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvV2thQmFzZWRNZW1iZXJzaGlwU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNDQ1ZjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Xa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MiArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcFNjaGVtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTWVtYmVyc2hpcExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYS5Kb2luR3JvdXBDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250cm9sLndrYS5NZW1iZXJMaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udHJvbC53a2EuUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5DaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1hbmFnZWRDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLlJwY0NoYW5uZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLk9yZGVySW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuZ3JvdXAuaW50ZXJjZXB0b3JzLlN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5ncm91cC5pbnRlcmNlcHRvcnMuVGNwRmFpbHVyZURldGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLmdyb3VwLmludGVyY2VwdG9ycy5UY3BQaW5nSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5TdGF0aWNNZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudHJhbnNwb3J0LlJlY2VpdmVyQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgdGhlIFdLQSh3ZWxsLWtub3duIGFkZHJlc3MpIGJhc2VkIG1lbWJlcnNoaXAgc2NoZW1lLiBJbiB0aGlzIHNjaGVtZSwKLSAqIG1lbWJlcnNoaXAgaXMgZGlzY292ZXJlZCB1c2luZyBhIGZldyB3ZWxsLWtub3duIG1lbWJlcnMgKHdobyBydW4gYXQgd2VsbC1rbm93biBJUCBhZGRyZXNzZXMpCi0gKi8KLXB1YmxpYyBjbGFzcyBXa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUgaW1wbGVtZW50cyBNZW1iZXJzaGlwU2NoZW1lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRyaWJlcyBjaGFubmVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYW5hZ2VkQ2hhbm5lbCBjaGFubmVsOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcE1hbmFnZXIgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyOwotICAgIHByaXZhdGUgTGlzdDxNZW1iZXJzaGlwTWFuYWdlcj4gYXBwbGljYXRpb25Eb21haW5NZW1iZXJzaGlwTWFuYWdlcnM7Ci0gICAgcHJpdmF0ZSBTdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3Igc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxvYWRCYWxhbmNlckRvbWFpbiB0byB3aGljaCB0aGUgbWVtYmVycyBiZWxvbmcgdG8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBsb2NhbERvbWFpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBzdGF0aWMod2VsbC1rbm93bikgbWVtYmVycwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxNZW1iZXI+IG1lbWJlcnM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGlzIG1lbWJlciBvcGVyYXRlcyBzdWNoIGFzICJsb2FkQmFsYW5jZSIgb3IgImFwcGxpY2F0aW9uIgotICAgICAqLwotICAgIHByaXZhdGUgT3BlcmF0aW9uTW9kZSBtb2RlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzOwotICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZXJNc2dPcmRlcjsKLQotICAgIHB1YmxpYyBXa2FCYXNlZE1lbWJlcnNoaXBTY2hlbWUoTWFuYWdlZENoYW5uZWwgY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbk1vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyc2hpcE1hbmFnZXI+IGFwcGxpY2F0aW9uRG9tYWluTWVtYmVyc2hpcE1hbmFnZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyc2hpcE1hbmFnZXIgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRvbWFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyPiBtZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJlc2VydmVyTXNnT3JkZXIpIHsKLSAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkRvbWFpbk1lbWJlcnNoaXBNYW5hZ2VycyA9IGFwcGxpY2F0aW9uRG9tYWluTWVtYmVyc2hpcE1hbmFnZXJzOwotICAgICAgICB0aGlzLnByaW1hcnlNZW1iZXJzaGlwTWFuYWdlciA9IHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlcjsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICAgICAgdGhpcy5sb2NhbERvbWFpbiA9IGRvbWFpbjsKLSAgICAgICAgdGhpcy5tZW1iZXJzID0gbWVtYmVyczsKLSAgICAgICAgdGhpcy5hdG1vc3RPbmNlTWVzc2FnZVNlbWFudGljcyA9IGF0bW9zdE9uY2VNZXNzYWdlU2VtYW50aWNzOwotICAgICAgICB0aGlzLnByZXNlcnZlck1zZ09yZGVyID0gcHJlc2VydmVyTXNnT3JkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoZSBtZW1iZXJzaGlwIHJlbGF0ZWQgdG8gdGhlIFdLQSBiYXNlZCBzY2hlbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdAotICAgICAqICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjb25maWd1cmluZyB0aGlzIHNjaGVtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgYWRkSW50ZXJjZXB0b3JzKCk7Ci0gICAgICAgIGNvbmZpZ3VyZVN0YXRpY01lbWJlcnNoaXAoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlU3RhdGljTWVtYmVyc2hpcCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotICAgICAgICBjaGFubmVsLnNldE1lbWJlcnNoaXBTZXJ2aWNlKG5ldyBXa2FNZW1iZXJzaGlwU2VydmljZShwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIpKTsKLSAgICAgICAgU3RhdGljTWVtYmVyIGxvY2FsTWVtYmVyID0gbmV3IFN0YXRpY01lbWJlcigpOwotICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuc2V0TG9jYWxNZW1iZXIobG9jYWxNZW1iZXIpOwotICAgICAgICBSZWNlaXZlckJhc2UgcmVjZWl2ZXIgPSAoUmVjZWl2ZXJCYXNlKSBjaGFubmVsLmdldENoYW5uZWxSZWNlaXZlcigpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogQ29uZmlndXJlIGFuZCBhZGQgdGhlIGxvY2FsIG1lbWJlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgUGFyYW1ldGVyIGxvY2FsSG9zdCA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTE9DQUxfTUVNQkVSX0hPU1QpOwotICAgICAgICBTdHJpbmcgaG9zdDsKLSAgICAgICAgaWYgKGxvY2FsSG9zdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBob3N0ID0gKChTdHJpbmcpIGxvY2FsSG9zdC5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIEluIGNhc2VzIHdoZXJlIHRoZSBsb2NhbGhvc3QgbmVlZHMgdG8gYmUgYXV0b21hdGljYWxseSBmaWd1cmVkIG91dAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBob3N0ID0gVXRpbHMuZ2V0SXBBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3QgZ2V0IGxvY2FsIElQIGFkZHJlc3MiOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3QgZ2V0IHRoZSBsb2NhbGhvc3QgbmFtZSI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJlY2VpdmVyLnNldEFkZHJlc3MoaG9zdCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2NhbE1lbWJlci5zZXRIb3N0bmFtZShob3N0KTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDb3VsZCBub3Qgc2V0IHRoZSBsb2NhbCBtZW1iZXIncyBuYW1lIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyYW1ldGVyIGxvY2FsUG9ydCA9IGdldFBhcmFtZXRlcihUcmliZXNDb25zdGFudHMuTE9DQUxfTUVNQkVSX1BPUlQpOwotICAgICAgICBpbnQgcG9ydDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2NhbFBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KCgoU3RyaW5nKSBsb2NhbFBvcnQuZ2V0VmFsdWUoKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICBwb3J0ID0gZ2V0TG9jYWxQb3J0KG5ldyBTZXJ2ZXJTb2NrZXQoKSwgbG9jYWxNZW1iZXIuZ2V0SG9zdG5hbWUoKSwgcG9ydCwgNDAwMCwgMTAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIEluIGNhc2VzIHdoZXJlIHRoZSBsb2NhbHBvcnQgbmVlZHMgdG8gYmUgYXV0b21hdGljYWxseSBmaWd1cmVkIG91dAotICAgICAgICAgICAgICAgIHBvcnQgPSBnZXRMb2NhbFBvcnQobmV3IFNlcnZlclNvY2tldCgpLCBsb2NhbE1lbWJlci5nZXRIb3N0bmFtZSgpLCAtMSwgNDAwMCwgMTAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBwb3J0IG9yIGEgcG9ydCBpbiB0aGUgcmFuZ2UgNDAwMC00MTAwICIgKwotICAgICAgICAgICAgICAgICAgICAiZm9yIGxvY2FsIGhvc3QgIiArIGxvY2FsTWVtYmVyLmdldEhvc3RuYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAiLiBDaGVjayB3aGV0aGVyIHRoZSBJUCBhZGRyZXNzIHNwZWNpZmllZCBvciBpbmZlcnJlZCBmb3IgdGhlIGxvY2FsICIgKwotICAgICAgICAgICAgICAgICAgICAibWVtYmVyIGlzIGNvcnJlY3QuIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENsdXN0ZXJpbmdGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnl0ZVtdIHBheWxvYWQgPSAicGluZyIuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgbG9jYWxNZW1iZXIuc2V0UGF5bG9hZChwYXlsb2FkKTsKLSAgICAgICAgcmVjZWl2ZXIuc2V0UG9ydChwb3J0KTsKLSAgICAgICAgbG9jYWxNZW1iZXIuc2V0UG9ydChwb3J0KTsKLSAgICAgICAgbG9jYWxNZW1iZXIuc2V0RG9tYWluKGxvY2FsRG9tYWluKTsKLSAgICAgICAgc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yLnNldExvY2FsTWVtYmVyKGxvY2FsTWVtYmVyKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0gRU5EOiBDb25maWd1cmUgYW5kIGFkZCB0aGUgbG9jYWwgbWVtYmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLSBTVEFSVDogQWRkIG90aGVyIG1lbWJlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGZvciAoTWVtYmVyIG1lbWJlciA6IG1lbWJlcnMpIHsKLSAgICAgICAgICAgIFN0YXRpY01lbWJlciB0cmliZXNNZW1iZXI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRyaWJlc01lbWJlciA9IG5ldyBTdGF0aWNNZW1iZXIobWVtYmVyLmdldEhvc3ROYW1lKCksIG1lbWJlci5nZXRQb3J0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBwYXlsb2FkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNvdWxkIG5vdCBhZGQgc3RhdGljIG1lbWJlciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmdldEhvc3ROYW1lKCkgKyAiOiIgKyBtZW1iZXIuZ2V0UG9ydCgpOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbHVzdGVyaW5nRmF1bHQobXNnLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRG8gbm90IGFkZCB0aGUgbG9jYWwgbWVtYmVyIHRvIHRoZSBsaXN0IG9mIG1lbWJlcnMKLSAgICAgICAgICAgIGlmICghKEFycmF5cy5lcXVhbHMobG9jYWxNZW1iZXIuZ2V0SG9zdCgpLCB0cmliZXNNZW1iZXIuZ2V0SG9zdCgpKSAmJgotICAgICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuZ2V0UG9ydCgpID09IHRyaWJlc01lbWJlci5nZXRQb3J0KCkpKSB7Ci0gICAgICAgICAgICAgICAgdHJpYmVzTWVtYmVyLnNldERvbWFpbihsb2NhbERvbWFpbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGFkZCB0aGUgbWVtYmVyIGV2ZW4gaWYgaXQgaXMgb2ZmbGluZSBhdCB0aGlzIG1vbWVudC4gV2hlbiB0aGUKLSAgICAgICAgICAgICAgICAvLyBtZW1iZXIgY29tZXMgb25saW5lLCBpdCB3aWxsIGJlIGRldGVjdGVkIGJ5IHRoZSBHTVMKLSAgICAgICAgICAgICAgICBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IuYWRkU3RhdGljTWVtYmVyKHRyaWJlc01lbWJlcik7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmFkZFdlbGxLbm93bk1lbWJlcih0cmliZXNNZW1iZXIpOwotICAgICAgICAgICAgICAgIGlmIChjYW5Db25uZWN0KG1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckFkZGVkKHRyaWJlc01lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBZGRlZCBzdGF0aWMgbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUodHJpYmVzTWVtYmVyKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkNvdWxkIG5vdCBjb25uZWN0IHRvIG1lbWJlciAiICsgVHJpYmVzVXRpbC5nZXROYW1lKHRyaWJlc01lbWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJlZm9yZSBhZGRpbmcgYSBzdGF0aWMgbWVtYmVyLCB3ZSB3aWxsIHRyeSB0byB2ZXJpZnkgd2hldGhlciB3ZSBjYW4gY29ubmVjdCB0byBpdAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHdob3NlIGNvbm5lY3R2aXR5IG5lZWRzIHRvIGJlIHZlcmlmaWVkCi0gICAgICogQHJldHVybiB0cnVlLCBpZiB0aGUgbWVtYmVyIGNhbiBiZSBjb250YWN0ZWQ7IGZhbHNlLCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbkNvbm5lY3Qob3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgZm9yIChpbnQgcmV0cmllcyA9IDU7IHJldHJpZXMgPiAwOyByZXRyaWVzLS0pIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShtZW1iZXIuZ2V0SG9zdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgU29ja2V0QWRkcmVzcyBzb2NrYWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLmdldFBvcnQoKSk7Ci0gICAgICAgICAgICAgICAgbmV3IFNvY2tldCgpLmNvbm5lY3Qoc29ja2FkZHIsIDUwMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGlmIChtc2cuaW5kZXhPZigiQ29ubmVjdGlvbiByZWZ1c2VkIikgPT0gLTEgJiYgbXNnLmluZGV4T2YoImNvbm5lY3QgdGltZWQgb3V0IikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY29ubmVjdCB0byBtZW1iZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuZ2V0SG9zdE5hbWUoKSArICI6IiArIG1lbWJlci5nZXRQb3J0KCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBnZXRMb2NhbFBvcnQoU2VydmVyU29ja2V0IHNvY2tldCwgU3RyaW5nIGhvc3RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVmZXJyZWRQb3J0LCBpbnQgcG9ydHN0YXJ0LCBpbnQgcmV0cmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByZWZlcnJlZFBvcnQgIT0gLTEpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsUG9ydChzb2NrZXQsIGhvc3RuYW1lLCBwcmVmZXJyZWRQb3J0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggYW5kIHRyeSBhIGRlZmF1bHQgcG9ydAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSBudWxsOwotICAgICAgICBpZiAocmV0cmllcyA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsUG9ydChzb2NrZXQsIGhvc3RuYW1lLCBwb3J0c3RhcnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotICAgICAgICAgICAgICAgIHJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGJpbmQgc2VydmVyIHNvY2tldCB0bzoiICsgYWRkciArICIgdGhyb3dpbmcgZXJyb3IuIik7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvcnRzdGFydCsrOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICBpZ25vcmVkLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnZXRMb2NhbFBvcnQoc29ja2V0LCBob3N0bmFtZSwgcG9ydHN0YXJ0LCByZXRyaWVzLCAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnRzdGFydDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRMb2NhbFBvcnQoU2VydmVyU29ja2V0IHNvY2tldCwgU3RyaW5nIGhvc3RuYW1lLCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkcjsKLSAgICAgICAgYWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0bmFtZSwgcG9ydCk7Ci0gICAgICAgIHNvY2tldC5iaW5kKGFkZHIpOwotICAgICAgICBsb2cuaW5mbygiUmVjZWl2ZXIgU2VydmVyIFNvY2tldCBib3VuZCB0bzoiICsgYWRkcik7Ci0gICAgICAgIHNvY2tldC5zZXRTb1RpbWVvdXQoNSk7Ci0gICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIGlnbm9yZWQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIENoYW5uZWxJbnRlcmNlcHRvcnMuIFRoZSBvcmRlciBvZiB0aGUgaW50ZXJjZXB0b3JzIHRoYXQgYXJlIGFkZGVkIHdpbGwgZGVwZW5kIG9uIHRoZQotICAgICAqIG1lbWJlcnNoaXAgbWFuYWdlbWVudCBzY2hlbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkSW50ZXJjZXB0b3JzKCkgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgSW50ZXJjZXB0b3JzLi4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgVGNwUGluZ0ludGVyY2VwdG9yIHRjcFBpbmdJbnRlcmNlcHRvciA9IG5ldyBUY3BQaW5nSW50ZXJjZXB0b3IoKTsKLSAgICAgICAgdGNwUGluZ0ludGVyY2VwdG9yLnNldEludGVydmFsKDEwMCk7Ci0gICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IodGNwUGluZ0ludGVyY2VwdG9yKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIFRDUCBQaW5nIEludGVyY2VwdG9yIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgYSByZWxpYWJsZSBmYWlsdXJlIGRldGVjdG9yCi0gICAgICAgIFRjcEZhaWx1cmVEZXRlY3RvciB0Y3BGYWlsdXJlRGV0ZWN0b3IgPSBuZXcgVGNwRmFpbHVyZURldGVjdG9yKCk7Ci0vLyAgICAgICAgdGNwRmFpbHVyZURldGVjdG9yLnNldFByZXZpb3VzKGRmaSk7IC8vVE9ETzogY2hlY2sgdGhpcwotICAgICAgICB0Y3BGYWlsdXJlRGV0ZWN0b3Iuc2V0UmVhZFRlc3RUaW1lb3V0KDEyMDAwMCk7Ci0gICAgICAgIHRjcEZhaWx1cmVEZXRlY3Rvci5zZXRDb25uZWN0VGltZW91dCg2MDAwMCk7Ci0gICAgICAgIGNoYW5uZWwuYWRkSW50ZXJjZXB0b3IodGNwRmFpbHVyZURldGVjdG9yKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGVkIFRDUCBGYWlsdXJlIERldGVjdG9yIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIE5vbkJsb2NraW5nQ29vcmRpbmF0b3IuCi0vLyAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihuZXcgQXhpczJDb29yZGluYXRvcihtZW1iZXJzaGlwTGlzdGVuZXIpKTsKLQotICAgICAgICBzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IgPSBuZXcgU3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKCk7Ci0gICAgICAgIHN0YXRpY01lbWJlcnNoaXBJbnRlcmNlcHRvci5zZXRMb2NhbE1lbWJlcihwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9jYWxNZW1iZXIoKSk7Ci0gICAgICAgIHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlci5zZXRTdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3Ioc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKTsKLSAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihzdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3IpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgU3RhdGljIE1lbWJlcnNoaXAgSW50ZXJjZXB0b3IiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYW5uZWwuZ2V0TWVtYmVyc2hpcFNlcnZpY2UoKS5zZXREb21haW4obG9jYWxEb21haW4pOwotICAgICAgICBtb2RlLmFkZEludGVyY2VwdG9ycyhjaGFubmVsKTsKLQotICAgICAgICBpZiAoYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MpIHsKLSAgICAgICAgICAgIC8vIEFkZCBhIEF0TW9zdE9uY2VJbnRlcmNlcHRvciB0byBzdXBwb3J0IGF0LW1vc3Qtb25jZSBtZXNzYWdlIHByb2Nlc3Npbmcgc2VtYW50aWNzCi0gICAgICAgICAgICBBdE1vc3RPbmNlSW50ZXJjZXB0b3IgYXRNb3N0T25jZUludGVyY2VwdG9yID0gbmV3IEF0TW9zdE9uY2VJbnRlcmNlcHRvcigpOwotICAgICAgICAgICAgYXRNb3N0T25jZUludGVyY2VwdG9yLnNldE9wdGlvbkZsYWcoVHJpYmVzQ29uc3RhbnRzLkFUX01PU1RfT05DRV9PUFRJT04pOwotICAgICAgICAgICAgY2hhbm5lbC5hZGRJbnRlcmNlcHRvcihhdE1vc3RPbmNlSW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBBdC1tb3N0LW9uY2UgSW50ZXJjZXB0b3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcmVzZXJ2ZXJNc2dPcmRlcikgewotICAgICAgICAgICAgLy8gQWRkIHRoZSBPcmRlckludGVyY2VwdG9yIHRvIHByZXNlcnZlIHNlbmRlciBvcmRlcmluZwotICAgICAgICAgICAgT3JkZXJJbnRlcmNlcHRvciBvcmRlckludGVyY2VwdG9yID0gbmV3IE9yZGVySW50ZXJjZXB0b3IoKTsKLSAgICAgICAgICAgIG9yZGVySW50ZXJjZXB0b3Iuc2V0T3B0aW9uRmxhZyhUcmliZXNDb25zdGFudHMuTVNHX09SREVSX09QVElPTik7Ci0gICAgICAgICAgICBjaGFubmVsLmFkZEludGVyY2VwdG9yKG9yZGVySW50ZXJjZXB0b3IpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBNZXNzYWdlIE9yZGVyIEludGVyY2VwdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKT0lOIHRoZSBncm91cCBhbmQgZ2V0IHRoZSBtZW1iZXIgbGlzdAotICAgICAqCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGpvaW5pbmcgdGhlIGdyb3VwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgam9pbkdyb3VwKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgLy8gSGF2ZSBtdWx0aXBsZSBSUEMgY2hhbm5lbHMgd2l0aCBtdWx0aXBsZSBSUEMgcmVxdWVzdCBoYW5kbGVycyBmb3IgZWFjaCBsb2NhbERvbWFpbgotICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBvbmx5IHdoZW4gdGhpcyBtZW1iZXIgaXMgcnVubmluZyBhcyBhIGxvYWQgYmFsYW5jZXIKLSAgICAgICAgZm9yIChNZW1iZXJzaGlwTWFuYWdlciBhcHBEb21haW5NZW1iZXJzaGlwTWFuYWdlciA6IGFwcGxpY2F0aW9uRG9tYWluTWVtYmVyc2hpcE1hbmFnZXJzKSB7Ci0gICAgICAgICAgICBhcHBEb21haW5NZW1iZXJzaGlwTWFuYWdlci5zZXRTdGF0aWNNZW1iZXJzaGlwSW50ZXJjZXB0b3Ioc3RhdGljTWVtYmVyc2hpcEludGVyY2VwdG9yKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIFJwY0NoYW5uZWwgZm9yIGVhY2ggbG9jYWxEb21haW4KLSAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBuZXcgU3RyaW5nKGFwcERvbWFpbk1lbWJlcnNoaXBNYW5hZ2VyLmdldERvbWFpbigpKTsKLSAgICAgICAgICAgIFJwY0NoYW5uZWwgcnBjTWVtYmVyc2hpcENoYW5uZWwgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUnBjQ2hhbm5lbChUcmliZXNVdGlsLmdldFJwY01lbWJlcnNoaXBDaGFubmVsSWQoYXBwRG9tYWluTWVtYmVyc2hpcE1hbmFnZXIuZ2V0RG9tYWluKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyKGFwcERvbWFpbk1lbWJlcnNoaXBNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKLSAgICAgICAgICAgIGFwcERvbWFpbk1lbWJlcnNoaXBNYW5hZ2VyLnNldFJwY01lbWJlcnNoaXBDaGFubmVsKHJwY01lbWJlcnNoaXBDaGFubmVsKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlZCBSUEMgTWVtYmVyc2hpcCBDaGFubmVsIGZvciBhcHBsaWNhdGlvbiBkb21haW4gIiArIGRvbWFpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgYSBNZW1iZXJzaGlwIGNoYW5uZWwgZm9yIGhhbmRsaW5nIG1lbWJlcnNoaXAgcmVxdWVzdHMKLSAgICAgICAgUnBjQ2hhbm5lbCBycGNNZW1iZXJzaGlwQ2hhbm5lbCA9Ci0gICAgICAgICAgICAgICAgbmV3IFJwY0NoYW5uZWwoVHJpYmVzVXRpbC5nZXRScGNNZW1iZXJzaGlwQ2hhbm5lbElkKGxvY2FsRG9tYWluKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBuZXcgUnBjTWVtYmVyc2hpcFJlcXVlc3RIYW5kbGVyKHByaW1hcnlNZW1iZXJzaGlwTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgcHJpbWFyeSBtZW1iZXJzaGlwIGNoYW5uZWwgIiArIG5ldyBTdHJpbmcobG9jYWxEb21haW4pKTsKLSAgICAgICAgfQotICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuc2V0UnBjTWVtYmVyc2hpcENoYW5uZWwocnBjTWVtYmVyc2hpcENoYW5uZWwpOwotCi0gICAgICAgIC8vIFNlbmQgSk9JTiBtZXNzYWdlIHRvIGEgV0tBIG1lbWJlcgotICAgICAgICBpZiAocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiU2VuZGluZyBKT0lOIG1lc3NhZ2UgdG8gV0tBIG1lbWJlcnMuLi4iKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcltdIHdrYU1lbWJlcnMgPSBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVycygpOyAvLyBUaGUgd2VsbC1rbm93biBtZW1iZXJzCi0gICAgICAgICAgICAvKnRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOyAvLyBXYWl0IGZvciBzb21ldGltZSBzbyB0aGF0IHRoZSBXS0EgbWVtYmVycyBjYW4gcmVjZWl2ZSB0aGUgTUVNQkVSX0xJU1QgbWVzc2FnZSwgaWYgdGhleSBoYXZlIGp1c3Qgam9pbmVkIHRoZSBncm91cAotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgfSovICAgLy9UT0RPOiAjIyMjIE5lZWQgdG8gZG91YmxlIGNoZWNrIHdoZXRoZXIgdGhpcyBzbGVlcCBpcyBuZWNlc3NhcnkKLSAgICAgICAgICAgIFJlc3BvbnNlW10gcmVzcG9uc2VzID0gbnVsbDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMgPSBycGNNZW1iZXJzaGlwQ2hhbm5lbC5zZW5kKHdrYU1lbWJlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpvaW5Hcm91cENvbW1hbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDaGFubmVsLkFMTF9SRVBMWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsLlNFTkRfT1BUSU9OU19BU1lOQ0hST05PVVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWJlc0NvbnN0YW50cy5NRU1CRVJTSElQX01TR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDApOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5vIHJlc3BvbnNlcyByZWNlaXZlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHNlbmQgSk9JTiByZXF1ZXN0IHRvIFdLQSBtZW1iZXJzIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdrYU1lbWJlcnMgPSBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TWVtYmVycygpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2thTWVtYmVycy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIlRoZXJlIGFyZSBubyB3ZWxsLWtub3duIG1lbWJlcnMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgd2UgZG8gbm90IGdldCBhIHJlc3BvbnNlIHdpdGhpbiBzb21lIHRpbWUsIHRyeSB0byByZWNvdmVyIGZyb20gdGhpcyBmYXVsdAotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHJlc3BvbnNlcyA9PSBudWxsIHx8IHJlc3BvbnNlcy5sZW5ndGggPT0gMCk7ICAvLyBXYWl0IHVudGlsIHdlJ3ZlIHJlY2VpdmVkIGF0IGxlYXN0IG9uZSByZXNwb25zZQotCi0gICAgICAgICAgICBmb3IgKFJlc3BvbnNlIHJlc3BvbnNlIDogcmVzcG9uc2VzKSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyTGlzdENvbW1hbmQgY29tbWFuZCA9IChNZW1iZXJMaXN0Q29tbWFuZCkgcmVzcG9uc2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGNvbW1hbmQuc2V0TWVtYmVyc2hpcE1hbmFnZXIocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBjb21tYW5kLmV4ZWN1dGUobnVsbCk7IC8vIFNldCB0aGUgbGlzdCBvZiBjdXJyZW50IG1lbWJlcnMKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBXS0EgbWVtYmVyIGlzIG5vdCBwYXJ0IG9mIHRoaXMgZ3JvdXAsIHJlbW92ZSBpdAotICAgICAgICAgICAgICAgIGlmICghVHJpYmVzVXRpbC5hcmVJblNhbWVEb21haW4ocmVzcG9uc2UuZ2V0U291cmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9jYWxNZW1iZXIoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLm1lbWJlckRpc2FwcGVhcmVkKHJlc3BvbnNlLmdldFNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92ZWQgbWVtYmVyICIgKyBUcmliZXNVdGlsLmdldE5hbWUocmVzcG9uc2UuZ2V0U291cmNlKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNpbmNlIGl0IGRvZXMgbm90IGJlbG9uZyB0byB0aGUgbG9jYWwgZG9tYWluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcocHJpbWFyeU1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCkuZ2V0RG9tYWluKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gYSBKT0lOIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgZnJvbSBzb21lIG90aGVyIG1lbWJlciwgaXQgaXMgbm90aWZpZWQgdXNpbmcgdGhpcyBtZXRob2QsCi0gICAgICogc28gdGhhdCBtZW1iZXJzaGlwIHNjaGVtZSBzcGVjaWZpYyBwcm9jZXNzaW5nIGNhbiBiZSBjYXJyaWVkIG91dAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBUaGUgbWVtYmVyIHdobyBqdXN0IGpvaW5lZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NKb2luKG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlciBtZW1iZXIpIHsKLSAgICAgICAgbW9kZS5ub3RpZnlNZW1iZXJKb2luKG1lbWJlcik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Xa2FNZW1iZXJzaGlwU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Xa2FNZW1iZXJzaGlwU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY1OTEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvV2thTWVtYmVyc2hpcFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgICAgICAgICAgICAgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuICAgICAgICAgICAgCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlICAgICAgICAgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gICAgCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kICAgICAgICAgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2F0YWxpbmEudHJpYmVzLk1lbWJlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhdGFsaW5hLnRyaWJlcy5NZW1iZXJzaGlwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMuTWVtYmVyc2hpcFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMubWVtYmVyc2hpcC5TdGF0aWNNZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXRhbGluYS50cmliZXMudXRpbC5VVUlER2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBNZW1iZXJzaGlwU2VydmljZSB3aGljaCBtYW5hZ2VzIGdyb3VwIG1lbWJlcnNoaXAgYmFzZWQgb24gYSBXZWxsLUtub3duIEFkZHJlc3NpbmcgKFdLQSkKLSAqIHNjaGVtZS4KLSAqLwotcHVibGljIGNsYXNzIFdrYU1lbWJlcnNoaXBTZXJ2aWNlIGltcGxlbWVudHMgTWVtYmVyc2hpcFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcjsKLQotCi0gICAgLyoqCi0gICAgICogVGhlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgIHByb3RlY3RlZCBieXRlW10gcGF5bG9hZDsKLQotICAgIHByb3RlY3RlZCBieXRlW10gZG9tYWluOwotICAgIHByaXZhdGUgTWVtYmVyc2hpcExpc3RlbmVyIG1lbWJlcnNoaXBMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBXa2FNZW1iZXJzaGlwU2VydmljZShNZW1iZXJzaGlwTWFuYWdlciBtZW1iZXJzaGlwTWFuYWdlcikgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBNYW5hZ2VyID0gbWVtYmVyc2hpcE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydChpbnQgaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoaW50IGkpIHsKLSAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBNYW5hZ2VyLmhhc01lbWJlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVtYmVyIGdldE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBtZW1iZXJzaGlwTWFuYWdlci5nZXRNZW1iZXIobWVtYmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnNoaXBNYW5hZ2VyLmdldE1lbWJlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVtYmVyIGdldExvY2FsTWVtYmVyKGJvb2xlYW4gYikgewotICAgICAgICByZXR1cm4gbWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9jYWxNZW1iZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWVtYmVyc0J5TmFtZSgpIHsKLSAgICAgICAgTWVtYmVyW10gY3VycmVudE1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7Ci0gICAgICAgIFN0cmluZ1tdIG1lbWJlcm5hbWVzOwotICAgICAgICBpZiAoY3VycmVudE1lbWJlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVtYmVybmFtZXMgPSBuZXcgU3RyaW5nW2N1cnJlbnRNZW1iZXJzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRNZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWVtYmVybmFtZXNbaV0gPSBjdXJyZW50TWVtYmVyc1tpXS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtYmVybmFtZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW1iZXJuYW1lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVtYmVyIGZpbmRNZW1iZXJCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgTWVtYmVyW10gY3VycmVudE1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7Ci0gICAgICAgIGZvciAoTWVtYmVyIGN1cnJlbnRNZW1iZXIgOiBjdXJyZW50TWVtYmVycykgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGN1cnJlbnRNZW1iZXIudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudE1lbWJlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1lbWJlclByb3BlcnRpZXMoU3RyaW5nIGxpc3Rlbkhvc3QsIGludCBsaXN0ZW5Qb3J0KSB7Ci0gICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoInRjcExpc3Rlbkhvc3QiLCBsaXN0ZW5Ib3N0KTsKLSAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgidGNwTGlzdGVuUG9ydCIsIFN0cmluZy52YWx1ZU9mKGxpc3RlblBvcnQpKTsKLSAgICAgICAgU3RhdGljTWVtYmVyIGxvY2FsTWVtYmVyID0gKFN0YXRpY01lbWJlcikgbWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9jYWxNZW1iZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2NhbE1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0SG9zdG5hbWUobGlzdGVuSG9zdCk7Ci0gICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0UG9ydChsaXN0ZW5Qb3J0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIgPSBuZXcgU3RhdGljTWVtYmVyKGxpc3Rlbkhvc3QsIGxpc3RlblBvcnQsIDApOwotICAgICAgICAgICAgICAgIGxvY2FsTWVtYmVyLnNldFVuaXF1ZUlkKFVVSURHZW5lcmF0b3IucmFuZG9tVVVJRCh0cnVlKSk7Ci0gICAgICAgICAgICAgICAgbG9jYWxNZW1iZXIuc2V0UGF5bG9hZChwYXlsb2FkKTsKLSAgICAgICAgICAgICAgICBsb2NhbE1lbWJlci5zZXREb21haW4oZG9tYWluKTsKLSAgICAgICAgICAgICAgICBtZW1iZXJzaGlwTWFuYWdlci5zZXRMb2NhbE1lbWJlcihsb2NhbE1lbWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2NhbE1lbWJlci5nZXREYXRhKHRydWUsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyc2hpcExpc3RlbmVyKE1lbWJlcnNoaXBMaXN0ZW5lciBtZW1iZXJzaGlwTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5tZW1iZXJzaGlwTGlzdGVuZXIgPSBtZW1iZXJzaGlwTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWVtYmVyc2hpcExpc3RlbmVyKCkgewotICAgICAgICB0aGlzLm1lbWJlcnNoaXBMaXN0ZW5lciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZChieXRlW10gcGF5bG9hZCkgewotICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOwotICAgICAgICAoKFN0YXRpY01lbWJlcikgbWVtYmVyc2hpcE1hbmFnZXIuZ2V0TG9jYWxNZW1iZXIoKSkuc2V0UGF5bG9hZChwYXlsb2FkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oYnl0ZVtdIGRvbWFpbikgewotICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLSAgICAgICAgKChTdGF0aWNNZW1iZXIpIG1lbWJlcnNoaXBNYW5hZ2VyLmdldExvY2FsTWVtYmVyKCkpLnNldERvbWFpbihkb21haW4pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3Rlck1hbmFnZXJUZXN0Q2FzZS5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyTWFuYWdlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViN2Q0YTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyTWFuYWdlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5UZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbHVzdGVyTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyMSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyMiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uMSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uMiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0MSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0MiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgY29uZmlnTWFuYWdlckxpc3RlbmVyMTsKLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciBjb25maWdNYW5hZ2VyTGlzdGVuZXIyOwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cDEgPSBudWxsOwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cDIgPSBudWxsOwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlMSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2UyID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lID0gInRlc3RTZXJ2aWNlIjsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDbHVzdGVyTWFuYWdlciBnZXRDbHVzdGVyTWFuYWdlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcENoYW5uZWxUZXN0cyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBUZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciBjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyOwotICAgIHByb3RlY3RlZCBEZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lciBjb250ZXh0TWFuYWdlckxpc3RlbmVyOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxID0gZ2V0Q2x1c3Rlck1hbmFnZXIoY29uZmlndXJhdGlvbkNvbnRleHQxKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIyID0gZ2V0Q2x1c3Rlck1hbmFnZXIoY29uZmlndXJhdGlvbkNvbnRleHQyKTsKLQotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29udGV4dE1hbmFnZXIoKS5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIuZ2V0Q29udGV4dE1hbmFnZXIoKS5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDIpOwotCi0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMi5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0Mik7Ci0KLSAgICAgICAgY29uZmlnTWFuYWdlckxpc3RlbmVyMSA9IG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcigpOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5zZXRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKGNvbmZpZ01hbmFnZXJMaXN0ZW5lcjEpOwotICAgICAgICBjb25maWdNYW5hZ2VyTGlzdGVuZXIyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKCk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMi5nZXRDb25maWd1cmF0aW9uTWFuYWdlcigpLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIoY29uZmlnTWFuYWdlckxpc3RlbmVyMik7Ci0KLSAgICAgICAgLy9naXZpbmcgYm90aCBOb2RlcyB0aGUgc2FtZSBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24xID0gY29uZmlndXJhdGlvbkNvbnRleHQxLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cDEgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlndXJhdGlvbjEpOwotICAgICAgICBzZXJ2aWNlMSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cDEuYWRkU2VydmljZShzZXJ2aWNlMSk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uMS5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwMSk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24yID0gY29uZmlndXJhdGlvbkNvbnRleHQyLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cDIgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlndXJhdGlvbjIpOwotICAgICAgICBzZXJ2aWNlMiA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cDIuYWRkU2VydmljZShzZXJ2aWNlMik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uMi5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwMik7Ci0KLSAgICAgICAgLy9Jbml0aWF0aW5nIENsdXN0ZXJNYW5hZ2VycwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ2x1c3RlcmluZ0NvbnN0YW50cy5MT0NBTF9JUF9BRERSRVNTLCBVdGlscy5nZXRJcEFkZHJlc3MoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbHVzdGVyTWFuYWdlcjEuaW5pdCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbHVzdGVyTWFuYWdlci0xIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogUExFQVNFIElHTk9SRSBUSEUgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBTVEFDS1RSQUNFUy4gVEhJUyBJUyBFWFBFQ1RFRCAqKioiKTsKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyMi5pbml0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsdXN0ZXJNYW5hZ2VyLTIgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKENsdXN0ZXJpbmdGYXVsdCBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBDbHVzdGVyTWFuYWdlcnMuIFBsZWFzZSBjaGVjayB0aGUgbmV0d29yayBjb25uZWN0aW9uIjsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlICsgIjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHNraXBDaGFubmVsVGVzdHMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLnNodXRkb3duKCk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMi5zaHV0ZG93bigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Db250ZXh0UmVwbGljYXRpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NvbnRleHRSZXBsaWNhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyYjA5MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NvbnRleHRSZXBsaWNhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkNvbnRleHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3RzIHRoZSByZXBsaWNhdGlvbiBvZiBwcm9wZXJ0aWVzIHBsYWNlZCB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQsIFNlcnZpY2VHcm91cENvbnRleHQgJgotICogU2VydmljZUNvbnRleHQKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRSZXBsaWNhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TRVJWSUNFX05BTUUgPSAidGVzdFNlcnZpY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyYW1ldGVyIGRvbWFpblBhcmFtID0KLSAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXIoQ2x1c3RlcmluZ0NvbnN0YW50cy5QYXJhbWV0ZXJzLkRPTUFJTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImF4aXMyLmRvbWFpbi4iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tIENsdXN0ZXItMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcml2YXRlIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyMTsKLSAgICBwcml2YXRlIENvbnRleHRNYW5hZ2VyIGN0eE1hbjE7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWdNYW4xOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQxOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAxOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTE7Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLSBDbHVzdGVyLTIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcjI7Ci0gICAgcHJpdmF0ZSBDb250ZXh0TWFuYWdlciBjdHhNYW4yOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuMjsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0MjsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwMjsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2UyOwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblJ1blRlc3RzOwotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UG9ydChpbnQgcG9ydFN0YXJ0LCBpbnQgcmV0cmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgYWRkciA9IG51bGw7Ci0gICAgICAgIFNlcnZlclNvY2tldCBzb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KCk7Ci0gICAgICAgIGludCBwb3J0ID0gLTE7Ci0gICAgICAgIHdoaWxlIChyZXRyaWVzID4gMCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldEJ5TmFtZShJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRIb3N0QWRkcmVzcygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRTdGFydCk7Ci0gICAgICAgICAgICAgICAgc29ja2V0LmJpbmQoYWRkcik7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IHBvcnRTdGFydDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbiBiaW5kIFNlcnZlciBTb2NrZXQgdG86IiArIGFkZHIpOwotICAgICAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24geCkgewotICAgICAgICAgICAgICAgIHJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGJpbmQgc2VydmVyIHNvY2tldCB0bzoiICsgYWRkciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRocm93aW5nIGVycm9yLiIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3J0U3RhcnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FuUnVuVGVzdHMoKSB7Ci0gICAgICAgIGlmKFN5c3RlbS5nZXRQcm9wZXJ0eSgicnVuLmNsdXN0ZXJpbmcudGVzdHMiLCAiZmFsc2UiKS5lcXVhbHMoImZhbHNlIikpewotICAgICAgICAgICAgY2FuUnVuVGVzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoaWNoIHBvcnQgc2hvdWxkIHdlIGxpc3RlbiB0bwotICAgICAgICBmaW5hbCBpbnQgcG9ydDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBvcnQgPSBnZXRQb3J0KDQwMDAsIDEwMDApOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgY2FuUnVuVGVzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdoaWNoIGFkZHJlc3MKLSAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwID0gIjIyNS40LjUuNiI7Ci0KLSAgICAgICAgVGhyZWFkIHJlY2VpdmVyID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RTb2NrZXQgcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQocG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIHMuam9pbkdyb3VwKEluZXRBZGRyZXNzLmdldEJ5TmFtZShncm91cCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIERhdGFncmFtUGFja2V0IGFuZCBkbyBhIHJlY2VpdmUKLSAgICAgICAgICAgICAgICAgICAgYnl0ZSBidWZbXSA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgICAgICBEYXRhZ3JhbVBhY2tldCBwYWNrID0gbmV3IERhdGFncmFtUGFja2V0KGJ1ZiwgYnVmLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHMucmVjZWl2ZShwYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBkYXRhIGZyb206ICIgKyBwYWNrLmdldEFkZHJlc3MoKS50b1N0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IiArIHBhY2suZ2V0UG9ydCgpICsgIiB3aXRoIGxlbmd0aDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgcy5sZWF2ZUdyb3VwKEluZXRBZGRyZXNzLmdldEJ5TmFtZShncm91cCkpOwotICAgICAgICAgICAgICAgICAgICBzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNhblJ1blRlc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBjYW5SdW5UZXN0cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLQotICAgICAgICBUaHJlYWQgc2VuZGVyID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBNdWx0aWNhc3RTb2NrZXQgcyA9IG5ldyBNdWx0aWNhc3RTb2NrZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZSBidWZbXSA9IG5ldyBieXRlWzEwXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9IChieXRlKSBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIERhdGFncmFtUGFja2V0IHBhY2sgPSBuZXcgRGF0YWdyYW1QYWNrZXQoYnVmLCBidWYubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZShncm91cCksIHBvcnQpOwotICAgICAgICAgICAgICAgICAgICBzLnNldFRpbWVUb0xpdmUoMik7Ci0gICAgICAgICAgICAgICAgICAgIHMuc2VuZChwYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZW50IHRlc3QgZGF0YSIpOwotICAgICAgICAgICAgICAgICAgICBzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgY2FuUnVuVGVzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNlbmRlci5zdGFydCgpOwotCi0gICAgICAgIC8vIEpvaW4gdGhlIHJlY2VpdmVyIHVudGlsIHdlIGNhbiB2ZXJpZnkgd2hldGhlciBtdWx0aWNhc3RpbmcgY2FuIGJlIGRvbmUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlY2VpdmVyLmpvaW4oMTAwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBuZXcgQ29udGV4dFJlcGxpY2F0aW9uVGVzdCgpLmNhblJ1blRlc3RzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY2FuUnVuVGVzdHMoKTsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbV0FSTklOR10gQWJvcnRpbmcgY2x1c3RlcmluZyB0ZXN0cyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuTE9DQUxfSVBfQUREUkVTUywgVXRpbHMuZ2V0SXBBZGRyZXNzKCkpOwotCi0gICAgICAgIC8vIEZpcnN0IGNsdXN0ZXIKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cDEgPSBjcmVhdGVBeGlzU2VydmljZUdyb3VwKGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0gICAgICAgIHNlcnZpY2UxID0gY3JlYXRlQXhpc1NlcnZpY2Uoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIGN0eE1hbjEgPSBnZXRDb250ZXh0TWFuYWdlcigpOwotICAgICAgICBjb25maWdNYW4xID0gZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxID0gZ2V0Q2x1c3Rlck1hbmFnZXIoY29uZmlndXJhdGlvbkNvbnRleHQxLCBjdHhNYW4xLCBjb25maWdNYW4xKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmFkZFBhcmFtZXRlcihkb21haW5QYXJhbSk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMS5pbml0KCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLSBDbHVzdGVyTWFuYWdlci0xIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCAtLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIC8vIFNlY29uZCBjbHVzdGVyCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBzZXJ2aWNlR3JvdXAyID0gY3JlYXRlQXhpc1NlcnZpY2VHcm91cChjb25maWd1cmF0aW9uQ29udGV4dDIpOwotICAgICAgICBzZXJ2aWNlMiA9IGNyZWF0ZUF4aXNTZXJ2aWNlKHNlcnZpY2VHcm91cDIpOwotICAgICAgICBjdHhNYW4yID0gZ2V0Q29udGV4dE1hbmFnZXIoKTsKLSAgICAgICAgY29uZmlnTWFuMiA9IGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMiA9IGdldENsdXN0ZXJNYW5hZ2VyKGNvbmZpZ3VyYXRpb25Db250ZXh0MiwgY3R4TWFuMiwgY29uZmlnTWFuMik7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyMi5hZGRQYXJhbWV0ZXIoZG9tYWluUGFyYW0pOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjIuaW5pdCgpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0gQ2x1c3Rlck1hbmFnZXItMiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgLS0tLS0tLS0tLS0iKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2x1c3Rlck1hbmFnZXIgZ2V0Q2x1c3Rlck1hbmFnZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlcikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9IG5ldyBUcmliZXNDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRDbHVzdGVyTWFuYWdlcihjbHVzdGVyTWFuYWdlcik7Ci0KLSAgICAgICAgY29uZmlnTWFuYWdlci4KLSAgICAgICAgICAgICAgICBzZXRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcigpKTsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnTWFuYWdlcik7Ci0KLSAgICAgICAgY29udGV4dE1hbmFnZXIuc2V0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcihuZXcgRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIoKSk7Ci0gICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKTsKLQotICAgICAgICBjbHVzdGVyTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotCi0gICAgICAgIHJldHVybiBjbHVzdGVyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2VHcm91cCBjcmVhdGVBeGlzU2VydmljZUdyb3VwKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZyk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlKEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29udGV4dE1hbmFnZXIgZ2V0Q29udGV4dE1hbmFnZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQ29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIgPSBuZXcgRGVmYXVsdENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyTGlzdGVuZXIobmV3IERlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyKCkpOwotICAgICAgICByZXR1cm4gY29udGV4dE1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gbmV3IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlcigpOwotICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKG5ldyBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcigpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHRNYW5hZ2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eUluQ29uZmlndXJhdGlvbkNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleTEgPSAiY29uZmlnQ3R4S2V5IjsKLSAgICAgICAgICAgIFN0cmluZyB2YWwxID0gImNvbmZpZ0N0eFZhbDEiOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBjb25maWd1cmF0aW9uQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsMSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleTIgPSAiY29uZmlnQ3R4S2V5MiI7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsMiA9ICJjb25maWdDdHhWYWwxIjsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5zZXRQcm9wZXJ0eShrZXkyLCB2YWwyKTsKLSAgICAgICAgICAgIGN0eE1hbjIudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDIpOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQxLmdldFByb3BlcnR5KGtleTIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDIsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wZXJ0eUZyb21Db25maWd1cmF0aW9uQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJjb25maWdDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJjb25maWdDdHhWYWwxIjsKLQotICAgICAgICAvLyBGaXJzdCBzZXQgdGhlIHByb3BlcnR5IG9uIGEgY2x1c3RlciAxIGFuZCByZXBsaWNhdGUgaXQKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBjb25maWd1cmF0aW9uQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsMSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTmV4dCByZW1vdmUgdGhpcyBwcm9wZXJ0eSBmcm9tIGNsdXN0ZXIgMiwgcmVwbGljYXRlIGl0LCBhbmQgY2hlY2sgdGhhdCBpdCBpcyB1bmF2YWlsYWJsZSBpbiBjbHVzdGVyIDEKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLnJlbW92ZVByb3BlcnR5KGtleTEpOwotICAgICAgICBjdHhNYW4yLnVwZGF0ZUNvbnRleHQoY29uZmlndXJhdGlvbkNvbnRleHQyKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQxLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgICAgIGFzc2VydE51bGwodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0eUluU2VydmljZUdyb3VwQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9BcHBsaWNhdGlvblNjb3BlVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQyID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAyKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDIuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9BcHBsaWNhdGlvblNjb3BlVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJzZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gInNnQ3R4VmFsMSI7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsMSwgc2VydmljZUdyb3VwQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wZXJ0eUZyb21TZXJ2aWNlR3JvdXBDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MSA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQxLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAic2dDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJzZ0N0eFZhbDEiOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHNlcnZpY2VHcm91cENvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3BlcnR5Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnJlbW92ZVByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICAgICAgY3R4TWFuMi51cGRhdGVDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MS5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5SW5TZXJ2aWNlR3JvdXBDb250ZXh0MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2djSUQgPSBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoc2djSUQpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKHNnY0lEKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkxID0gInNnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAic2dDdHhWYWwxIjsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHNlcnZpY2VHcm91cENvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcGVydHlGcm9tU2VydmljZUdyb3VwQ29udGV4dDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0eQotICAgICAgICBTdHJpbmcgc2djSUQgPSBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoc2djSUQpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKHNnY0lEKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkxID0gInNnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAic2dDdHhWYWwxIjsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHNlcnZpY2VHcm91cENvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIHByb3BlcnR5Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnJlbW92ZVByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICAgICAgY3R4TWFuMi51cGRhdGVDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MS5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5SW5TZXJ2aWNlQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDEgPSBzZXJ2aWNlR3JvdXBDb250ZXh0MS5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlMSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQyID0gc2VydmljZUdyb3VwQ29udGV4dDIuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZTIpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9BcHBsaWNhdGlvblNjb3BlVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlQ29udGV4dDIpOwotCi0gICAgICAgIFN0cmluZyBrZXkxID0gInNnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAic2dDdHhWYWwxIjsKLSAgICAgICAgc2VydmljZUNvbnRleHQxLnNldFByb3BlcnR5KGtleTEsIHZhbDEpOwotICAgICAgICBjdHhNYW4xLnVwZGF0ZUNvbnRleHQoc2VydmljZUNvbnRleHQxKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHModmFsMSwgc2VydmljZUNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydHlJblNlcnZpY2VDb250ZXh0MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQxID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAxKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDEuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDEgPSBzZXJ2aWNlR3JvdXBDb250ZXh0MS5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlMSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlQ29udGV4dDEpOwotCi0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDIpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0MiA9IHNlcnZpY2VHcm91cENvbnRleHQyLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UyKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VDb250ZXh0Mik7Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAic2dDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJzZ0N0eFZhbDEiOwotICAgICAgICBzZXJ2aWNlQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChzZXJ2aWNlQ29udGV4dDEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLCBzZXJ2aWNlQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wZXJ0eUZyb21TZXJ2aWNlQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDEgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDEpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0MS5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0MSA9IHNlcnZpY2VHcm91cENvbnRleHQxLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UxKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvQXBwbGljYXRpb25TY29wZVRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUNvbnRleHQxKTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQyID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXAyKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dDIuc2V0SWQoVEVTVF9TRVJWSUNFX05BTUUpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDIgPSBzZXJ2aWNlR3JvdXBDb250ZXh0Mi5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlMik7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VDb250ZXh0Mik7Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAic2dDdHhLZXkiOwotICAgICAgICBTdHJpbmcgdmFsMSA9ICJzZ0N0eFZhbDEiOwotICAgICAgICBzZXJ2aWNlQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChzZXJ2aWNlQ29udGV4dDEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyh2YWwxLCBzZXJ2aWNlQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSkpOwotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgcHJvcGVydHkKLSAgICAgICAgc2VydmljZUNvbnRleHQyLnJlbW92ZVByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2VDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgICAgIGN0eE1hbjIudXBkYXRlQ29udGV4dChzZXJ2aWNlQ29udGV4dDIpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2VDb250ZXh0MS5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVByb3BlcnR5RnJvbVNlcnZpY2VDb250ZXh0MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWNhblJ1blRlc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIHByb3BlcnR5Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDEgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cDEpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0MS5zZXRJZChURVNUX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0MSA9IHNlcnZpY2VHcm91cENvbnRleHQxLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UxKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQxLmFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0MSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUdyb3VwQ29udGV4dDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VDb250ZXh0MSk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0MiA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQyLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwMik7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQyLnNldElkKFRFU1RfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQyID0gc2VydmljZUdyb3VwQ29udGV4dDIuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZTIpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDIuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUNvbnRleHQyKTsKLQotICAgICAgICBTdHJpbmcga2V5MSA9ICJzZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gInNnQ3R4VmFsMSI7Ci0gICAgICAgIHNlcnZpY2VDb250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KHNlcnZpY2VDb250ZXh0MSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDEsIHNlcnZpY2VDb250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkxKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9wZXJ0eQotICAgICAgICBzZXJ2aWNlQ29udGV4dDIucmVtb3ZlUHJvcGVydHkoa2V5MSk7Ci0gICAgICAgIGFzc2VydE51bGwoc2VydmljZUNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICAgICAgY3R4TWFuMi51cGRhdGVDb250ZXh0KHNlcnZpY2VDb250ZXh0Mik7Ci0gICAgICAgIGFzc2VydE51bGwoc2VydmljZUNvbnRleHQxLmdldFByb3BlcnR5KGtleTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGljYXRpb25FeGNsdXNpb24wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FuUnVuVGVzdHMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBrZXkxID0gImxvY2FsX2NvbmZpZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gImNvbmZpZ0N0eFZhbDEiOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdXNpb25QYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBleGNsdXNpb25QYXR0ZXJucy5hZGQoIioiKTsgLy8gRXhjbHVkZSBhbGwgcHJvcGVydGllcwotICAgICAgICBjdHhNYW4xLnNldFJlcGxpY2F0aW9uRXhjbHVkZVBhdHRlcm5zKCJkZWZhdWx0cyIsIGV4Y2x1c2lvblBhdHRlcm5zKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlKTsgLy8gVGhlIHByb3BlcnR5IHNob3VsZCBub3QgaGF2ZSBnb3R0ZW4gcmVwbGljYXRlZAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsaWNhdGlvbkV4Y2x1c2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAibG9jYWxfY29uZmlnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAiY29uZmlnQ3R4VmFsMSI7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvblBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGV4Y2x1c2lvblBhdHRlcm5zLmFkZCgibG9jYWxfKiIpOwotICAgICAgICBjdHhNYW4xLnNldFJlcGxpY2F0aW9uRXhjbHVkZVBhdHRlcm5zKCJkZWZhdWx0cyIsIGV4Y2x1c2lvblBhdHRlcm5zKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlKTsgLy8gVGhlIHByb3BlcnR5IHNob3VsZCBub3QgaGF2ZSBnb3R0ZW4gcmVwbGljYXRlZAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsaWNhdGlvbkV4Y2x1c2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAibG9jYWxfY29uZmlnQ3R4S2V5IjsKLSAgICAgICAgU3RyaW5nIHZhbDEgPSAiY29uZmlnQ3R4VmFsMSI7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0MS5zZXRQcm9wZXJ0eShrZXkxLCB2YWwxKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvblBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGV4Y2x1c2lvblBhdHRlcm5zLmFkZCgibG9jYWxfKiIpOwotICAgICAgICBjdHhNYW4xLnNldFJlcGxpY2F0aW9uRXhjbHVkZVBhdHRlcm5zKCJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvblBhdHRlcm5zKTsKLSAgICAgICAgY3R4TWFuMS51cGRhdGVDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0MSk7Ci0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTEpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlKTsgLy8gVGhlIHByb3BlcnR5IHNob3VsZCBub3QgaGF2ZSBnb3R0ZW4gcmVwbGljYXRlZAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsaWNhdGlvbkV4Y2x1c2lvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFjYW5SdW5UZXN0cykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAibG9jYWwxX2NvbmZpZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwxID0gImNvbmZpZ0N0eFZhbDEiOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MSwgdmFsMSk7Ci0KLSAgICAgICAgU3RyaW5nIGtleTIgPSAibG9jYWwyX2NvbmZpZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwyID0gImNvbmZpZ0N0eFZhbDIiOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MiwgdmFsMik7Ci0KLSAgICAgICAgU3RyaW5nIGtleTMgPSAibG9jYWwzX2NvbmZpZ0N0eEtleSI7Ci0gICAgICAgIFN0cmluZyB2YWwzID0gImNvbmZpZ0N0eFZhbDMiOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dDEuc2V0UHJvcGVydHkoa2V5MywgdmFsMyk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvblBhdHRlcm5zMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBleGNsdXNpb25QYXR0ZXJuczEuYWRkKCJsb2NhbDFfKiIpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVzaW9uUGF0dGVybnMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGV4Y2x1c2lvblBhdHRlcm5zMi5hZGQoImxvY2FsMl8qIik7Ci0gICAgICAgIGN0eE1hbjEuc2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoIm9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVzaW9uUGF0dGVybnMxKTsKLSAgICAgICAgY3R4TWFuMS5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucygiZGVmYXVsdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2lvblBhdHRlcm5zMik7Ci0gICAgICAgIGN0eE1hbjEudXBkYXRlQ29udGV4dChjb25maWd1cmF0aW9uQ29udGV4dDEpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZTEgPSAoU3RyaW5nKSBjb25maWd1cmF0aW9uQ29udGV4dDIuZ2V0UHJvcGVydHkoa2V5MSk7Ci0gICAgICAgIGFzc2VydE51bGwodmFsdWUxKTsgLy8gVGhlIHByb3BlcnR5IHNob3VsZCBub3QgaGF2ZSBnb3R0ZW4gcmVwbGljYXRlZAotICAgICAgICBTdHJpbmcgdmFsdWUyID0gKFN0cmluZykgY29uZmlndXJhdGlvbkNvbnRleHQyLmdldFByb3BlcnR5KGtleTIpOwotICAgICAgICBhc3NlcnROdWxsKHZhbHVlMik7IC8vIFRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGhhdmUgZ290dGVuIHJlcGxpY2F0ZWQKLSAgICAgICAgU3RyaW5nIHZhbHVlMyA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb25Db250ZXh0Mi5nZXRQcm9wZXJ0eShrZXkzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbDMsIHZhbHVlMyk7IC8vIFRoZSBwcm9wZXJ0eSBzaG91bGQgaGF2ZSBnb3R0ZW4gcmVwbGljYXRlZAotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgaWYgKGNsdXN0ZXJNYW5hZ2VyMSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbHVzdGVyTWFuYWdlcjEuc2h1dGRvd24oKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIENMdXN0ZXItMSBzaHV0ZG93biBjb21wbGV0ZSAtLS0tLS0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2x1c3Rlck1hbmFnZXIyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyMi5zaHV0ZG93bigpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0gQ0x1c3Rlci0yIHNodXRkb3duIGNvbXBsZXRlIC0tLS0tLSIpOwotICAgICAgICB9Ci0vLyAgICAgICAgTWVtYmVyc2hpcE1hbmFnZXIucmVtb3ZlQWxsTWVtYmVycygpOwotICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL09iamVjdFNlcmlhbGl6YXRpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL09iamVjdFNlcmlhbGl6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDU4ZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9PYmplY3RTZXJpYWxpemF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VyaWFsaXphdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RETyB0ZXN0RE8gPSBuZXcgVGVzdERPKCJuYW1lIiwgInZhbHVlIik7Ci0gICAgICAgIFRlc3RETyB0ZXN0RE8yID0gKFRlc3RETykgY29weSh0ZXN0RE8pOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdERPMik7Ci0gICAgICAgIGFzc2VydEZhbHNlKHRlc3RETy5lcXVhbHModGVzdERPMikpOwotICAgICAgICBhc3NlcnRFcXVhbHModGVzdERPLmdldE5hbWUoKSwgdGVzdERPMi5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGVzdERPLmdldFZhbHVlKCksIHRlc3RETzIuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgb2JqZWN0IGNhbm5vdAotICAgICAqIGJlIHNlcmlhbGl6ZWQuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjb3B5KE9iamVjdCBvcmlnKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKLSAgICAgICAgLy8gV3JpdGUgdGhlIG9iamVjdCBvdXQgdG8gYSBieXRlIGFycmF5Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJvcyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChvcmlnKTsKLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotCi0gICAgICAgIC8vIE1ha2UgYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlIGJ5dGUgYXJyYXkgYW5kIHJlYWQKLSAgICAgICAgLy8gYSBjb3B5IG9mIHRoZSBvYmplY3QgYmFjayBpbi4KLSAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIG9iaiA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL1Rlc3RETy5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9UZXN0RE8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjYzA3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL1Rlc3RETy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdERPIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgcHVibGljIFRlc3RETyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0Q2FzZS5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyZjRmNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3Rlck1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdENhc2UgZXh0ZW5kcyBDbHVzdGVyTWFuYWdlclRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkU2VydmljZUdyb3VwKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSAidGVzdFNlcnZpY2UiOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5sb2FkU2VydmljZUdyb3VwcyhuZXcgU3RyaW5nW117c2VydmljZUdyb3VwTmFtZX0pOwotCi0gICAgICAgIC8qdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgZXZlbnRMaXN0ID0gY29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjIuZ2V0RXZlbnRMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnRMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TGlzdC5zaXplKCksIDEpOwotICAgICAgICBDb25maWd1cmF0aW9uRXZlbnQgZXZlbnQgPSAoQ29uZmlndXJhdGlvbkV2ZW50KSBldmVudExpc3QuZ2V0KDApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQpOwotCi0gICAgICAgIFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzID0gZXZlbnQuZ2V0U2VydmljZUdyb3VwTmFtZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlR3JvdXBOYW1lcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlR3JvdXBOYW1lc1swXSwgc2VydmljZUdyb3VwTmFtZSk7Ki8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5sb2FkU2VydmljZUdyb3VwKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSAidGVzdFNlcnZpY2UiOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS51bmxvYWRTZXJ2aWNlR3JvdXBzKG5ldyBTdHJpbmdbXXtzZXJ2aWNlR3JvdXBOYW1lfSk7Ci0KLSAgICAgICAgLyp0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBldmVudExpc3QgPSBjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyMi5nZXRFdmVudExpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudExpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25FdmVudCBldmVudCA9IChDb25maWd1cmF0aW9uRXZlbnQpIGV2ZW50TGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudCk7Ci0KLSAgICAgICAgU3RyaW5nW10gc2VydmljZUdyb3VwTmFtZXMgPSBldmVudC5nZXRTZXJ2aWNlR3JvdXBOYW1lcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VHcm91cE5hbWVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VHcm91cE5hbWVzWzBdLCBzZXJ2aWNlR3JvdXBOYW1lKTsqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBseVBvbGljeSgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQsIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSAidGVzdFNlcnZpY2UiOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5sb2FkU2VydmljZUdyb3VwcyhuZXcgU3RyaW5nW117c2VydmljZUdyb3VwTmFtZX0pOwotICAgICAgICBTdHJpbmcgcG9saWN5SUQgPSAicG9saWN5MSI7Ci0KLSAgICAgICAgLyp0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgUG9saWN5IHBvbGljeSA9IG5ldyBQb2xpY3koKTsKLSAgICAgICAgcG9saWN5LnNldElkKHBvbGljeUlEKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpOwotCi0gICAgICAgIHBvbGljeS5zZXJpYWxpemUoeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuYXBwbHlQb2xpY3koc2VydmljZUdyb3VwTmFtZSwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGV2ZW50TGlzdCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIyLmdldEV2ZW50TGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50TGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhldmVudExpc3Quc2l6ZSgpLCAyKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkV2ZW50IGV2ZW50ID0gKENvbmZpZ3VyYXRpb25FdmVudCkgZXZlbnRMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhldmVudC5nZXRTZXJ2aWNlTmFtZSgpLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQuZ2V0UG9saWN5KCkpOyovCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZSgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkucHJlcGFyZSgpOwotCi0gICAgICAgIC8qdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgZXZlbnRMaXN0ID0gY29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcjIuZ2V0RXZlbnRMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnRMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV2ZW50TGlzdC5zaXplKCksIDEpOwotICAgICAgICBDb25maWd1cmF0aW9uRXZlbnQgZXZlbnQgPSAoQ29uZmlndXJhdGlvbkV2ZW50KSBldmVudExpc3QuZ2V0KDApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQpOyovCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbW1pdCgpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuY29tbWl0KCk7Ci0KLSAgICAgICAgLyp0cnkgewotICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGV2ZW50TGlzdCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIyLmdldEV2ZW50TGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50TGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhldmVudExpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkV2ZW50IGV2ZW50ID0gKENvbmZpZ3VyYXRpb25FdmVudCkgZXZlbnRMaXN0LmdldCgwKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50KTsqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb2xsYmFjaygpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gInRlc3RTZXJ2aWNlIjsKLSAgICAgICAgY2x1c3Rlck1hbmFnZXIxLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkucm9sbGJhY2soKTsKLQotICAgICAgICAvKnRyeSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGV2ZW50TGlzdCA9IGNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIyLmdldEV2ZW50TGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50TGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhldmVudExpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkV2ZW50IGV2ZW50ID0gKENvbmZpZ3VyYXRpb25FdmVudCkgZXZlbnRMaXN0LmdldCgwKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGV2ZW50KTsqLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxvYWRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSAidGVzdFNlcnZpY2UiOwotICAgICAgICBjbHVzdGVyTWFuYWdlcjEuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5yZWxvYWRDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qTGlzdCBldmVudExpc3QgPSBjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyMi5nZXRFdmVudExpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudExpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXZlbnRMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25FdmVudCBldmVudCA9IChDb25maWd1cmF0aW9uRXZlbnQpIGV2ZW50TGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChldmVudCk7Ki8KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9UZXN0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL1Rlc3RDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTA2ZjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL1Rlc3RDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFRlc3RDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGltcGxlbWVudHMgQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kTGlzdDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0gICAgcHVibGljIFRlc3RDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKCkgewotICAgICAgICBjb21tYW5kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlR3JvdXBzTG9hZGVkKENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZCBjb21tYW5kKSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlR3JvdXBzVW5sb2FkZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvbGljeUFwcGxpZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25SZWxvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUNhbGxlZCgpIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJvbGxiYWNrQ2FsbGVkKCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tbWl0Q2FsbGVkKCkgewotICAgICAgICAvL1RPRE86IE1ldGhvZCBpbXBsZW1lbnRhdGlvbgotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvQ29uZmlndXJhdGlvbk1hbmFnZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Db25maWd1cmF0aW9uTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4NDFjMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9Db25maWd1cmF0aW9uTWFuYWdlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdCBleHRlbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyVGVzdENhc2UgewotCi0gICAgcHJvdGVjdGVkIENsdXN0ZXJNYW5hZ2VyIGdldENsdXN0ZXJNYW5hZ2VyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBUcmliZXNDbHVzdGVyTWFuYWdlciB0cmliZXNDbHVzdGVyTWFuYWdlciA9IG5ldyBUcmliZXNDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICB0cmliZXNDbHVzdGVyTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotICAgICAgICBEZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIgPSBuZXcgRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLgotICAgICAgICAgICAgICAgIHNldENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIobmV3IERlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyKCkpOwotICAgICAgICB0cmliZXNDbHVzdGVyTWFuYWdlci5zZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uTWFuYWdlcik7Ci0gICAgICAgIERlZmF1bHRDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IG5ldyBEZWZhdWx0Q29udGV4dE1hbmFnZXIoKTsKLSAgICAgICAgY29udGV4dE1hbmFnZXIuc2V0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcihuZXcgRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIoKSk7Ci0gICAgICAgIHRyaWJlc0NsdXN0ZXJNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKTsKLSAgICAgICAgcmV0dXJuIHRyaWJlc0NsdXN0ZXJNYW5hZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTXVsdGljYXN0UmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdFJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDAyY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY2x1c3RlcmluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy90cmliZXMvTXVsdGljYXN0UmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzOwotCi1pbXBvcnQgamF2YS5uZXQuRGF0YWdyYW1QYWNrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuTXVsdGljYXN0U29ja2V0OwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aWNhc3RSZWNlaXZlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBpcCA9ICIyMjguMS4yLjMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcnQgPSA0NTY3ODsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE11bHRpY2FzdFNvY2tldCBtc29ja2V0ID0gbmV3IE11bHRpY2FzdFNvY2tldChwb3J0KTsKLSAgICAgICAgSW5ldEFkZHJlc3MgZ3JvdXAgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaXApOwotICAgICAgICBtc29ja2V0LmpvaW5Hcm91cChncm91cCk7Ci0KLSAgICAgICAgYnl0ZVtdIGluYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIERhdGFncmFtUGFja2V0IHBhY2tldCA9IG5ldyBEYXRhZ3JhbVBhY2tldChpbmJ1ZiwgaW5idWYubGVuZ3RoKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBwYWNrZXQKLSAgICAgICAgbXNvY2tldC5yZWNlaXZlKHBhY2tldCk7Ci0KLSAgICAgICAgLy8gRGF0YSBpcyBub3cgaW4gaW5idWYKLSAgICAgICAgaW50IG51bUJ5dGVzUmVjZWl2ZWQgPSBwYWNrZXQuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjZDogIiArIG5ldyBTdHJpbmcoaW5idWYsIDAsIG51bUJ5dGVzUmVjZWl2ZWQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jbHVzdGVyaW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL3RyaWJlcy9NdWx0aWNhc3RTZW5kZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWFlNDMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NsdXN0ZXJpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvdHJpYmVzL011bHRpY2FzdFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy50cmliZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkRhdGFncmFtUGFja2V0OwotaW1wb3J0IGphdmEubmV0LkRhdGFncmFtU29ja2V0OwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGljYXN0U2VuZGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBpcCA9ICIyMjguMS4yLjMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBvcnQgPSA0NTY3ODsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIE11bHRpY2FzdCBzZW5kCi0gICAgICAgIGJ5dGVbXSBvdXRidWYgPSAiSGVsbG8gd29ybGQiLmdldEJ5dGVzKCk7Ci0KLQotICAgICAgICBEYXRhZ3JhbVNvY2tldCBzb2NrZXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29ja2V0ID0gbmV3IERhdGFncmFtU29ja2V0KCk7Ci0gICAgICAgICAgICBJbmV0QWRkcmVzcyBncm91cEFkZHIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaXApOwotICAgICAgICAgICAgRGF0YWdyYW1QYWNrZXQgcGFja2V0ID0gbmV3IERhdGFncmFtUGFja2V0KG91dGJ1Ziwgb3V0YnVmLmxlbmd0aCwgZ3JvdXBBZGRyLCBwb3J0KTsKLSAgICAgICAgICAgIHNvY2tldC5zZW5kKHBhY2tldCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZW50Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9idWlsZC13c2Rscy54bWwgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL2J1aWxkLXdzZGxzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwNDdiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL2J1aWxkLXdzZGxzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxwcm9qZWN0IG5hbWU9Iml0ZXN0IiBiYXNlZGlyPSIuIj4NCi0NCi0JPHRhcmdldCBuYW1lPSJ3c2RsLWNvZGVnZW4iIHVubGVzcz0idGVzdC5za2lwIj4NCi0JCTwhLS0gU2V0IGEgcHJvcGVydHkgdGhhdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gdGhlIGFudCBidWlsZC54bWwncyAtLT4NCi0NCi0JCTxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5qdW5pdC5qdm1hcmdzIiB2YWx1ZT0iIiAvPg0KLQkJPHBhdGggaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIj4NCi0JCQk8cGF0aCByZWZpZD0ibWF2ZW4uY29tcGlsZS5jbGFzc3BhdGgiIC8+DQotCQk8L3BhdGg+DQotCQk8IS0tIGNvbXBpbGluZyBzb21lIGN1c3RvbSB3c2RsIGZpbGVzIC0tPg0KLQkJPHByb3BlcnR5IG5hbWU9IndzZGwuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3dzZGxzIiAvPg0KLQkJPHByb3BlcnR5IG5hbWU9IndzZGwub3V0cHV0LmJhc2UuZGlyIiB2YWx1ZT0idGFyZ2V0L3dzZGxzIiAvPg0KLQkJPCEtLSBtYWtlIHRoZSBkaXJzIC0tPg0KLQkJPG1rZGlyIGRpcj0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0iIC8+DQotDQotCQk8ZWNobz5Db21waWxpbmcgVmVyc2lvbi53c2RsPC9lY2hvPg0KLSAgICA8ZGVsZXRlIGRpcj0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0vdmVyc2lvbiIvPg0KLQkJPG1rZGlyIGRpcj0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0vdmVyc2lvbiIgLz4NCi0gICAgPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPg0KLQ0KLQkJPGphdmEgZm9yaz0ieWVzIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZhaWxvbmVycm9yPSJ5ZXMiPg0KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnRlc3QuY2xhc3NwYXRoIiAvPg0KLQkJCTxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPg0KLQkJCTxhcmcgbGluZT0iLWFwIC1vICR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L3ZlcnNpb24gLWQgbm9uZSAtcyAtdSAtdXJpIHRlc3QtcmVzb3VyY2VzL3dzZGxzL1ZlcnNpb24ud3NkbCIgLz4NCi0JCTwvamF2YT4NCi0JCTxqYXZhYyBmb3JrPSJ5ZXMiIGRlc3RkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiIGRlYnVnPSJvbiI+DQotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4udGVzdC5jbGFzc3BhdGgiIC8+DQotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+DQotCQkJPHNyYyBwYXRoPSIke3dzZGwub3V0cHV0LmJhc2UuZGlyfS92ZXJzaW9uIiAvPg0KLQkJPC9qYXZhYz4NCi0gIDwvdGFyZ2V0Pg0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL290aGVyL01hcHBpbmdGaWxlLnhzZCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vb3RoZXIvTWFwcGluZ0ZpbGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2UyNmE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vb3RoZXIvTWFwcGluZ0ZpbGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBlZGl0ZWQgd2l0aCBYTUxTcHkgdjIwMDYgc3AyIFUgKGh0dHA6Ly93d3cuYWx0b3ZhLmNvbSkgYnkgQWppdGggSGFyc2hhbmEgUmFuYWJhaHUgKFczQykgLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ibWFwcGluZ3MiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPk1hcHBpbmdzIHJvb3Q8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im1hcHBpbmciIHR5cGU9Im1hcHBpbmdUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iZGJmIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBpbmdUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj5EZXNjcmlwdGlvbiBvZiB0aGUgbWFwcGluZyA8L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOnNlcXVlbmNlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0icW5hbWUiPgotCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQkJCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZGVmYXVsdD0iIi8+Ci0JCQkJCQk8L3hzOmV4dGVuc2lvbj4KLQkJCQkJPC94czpzaW1wbGVDb250ZW50PgotCQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9vdGhlci9iZWFuR2VuZXJhdGlvblNjaGVtYS54c2QgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL290aGVyL2JlYW5HZW5lcmF0aW9uU2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkNTUxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL290aGVyL2JlYW5HZW5lcmF0aW9uU2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gZWRpdGVkIHdpdGggWE1MU3B5IHYyMDA1IHJlbC4gMyBVIChodHRwOi8vd3d3LmFsdG92YS5jb20pIGJ5IEFqaXRoIEhhcnNoYW5hIFJhbmFiYWh1IChXU08yL0RldmVsb3BtZW50KSAtLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQotICAgICA8eHM6ZWxlbWVudCBuYW1lPSJiZWFucyI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHJlcHJlc2VudHMgdGhlIFhNTCBkb2N1ZW1lbnQgc3RydWN0dXJlIGphdmEgYmVhbiB3cml0ZXIgZ2VuZXJhdGVzIGZvcgotICAgICAgICAgICAgICAgIGEgbXVsdGlwbGUgY2xhc3NlcwotICAgICAgICAgICAgPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCByZWY9ImJlYW4iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQk8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ib3JpZ2luYWxOYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJiZWFuIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyB0aGUgWE1MIGRvY3VlbWVudCBzdHJ1Y3R1cmUgamF2YSBiZWFuIHdyaXRlciBnZW5lcmF0ZXMgZm9yCi0gICAgICAgICAgICAgICAgYSBzaW5nbGUgY2xhc3MKLSAgICAgICAgICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5VHlwZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcmlnaW5hbE5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibnN1cmkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuc3ByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZml4ZWQ9InllcyIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb24iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhbm9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIGZpeGVkPSJ5ZXMiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0idW53cmFwcGVkIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIGZpeGVkPSJ5ZXMiLz4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iamF2YW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9InNob3J0dHlwZW5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9Im91cnMiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZml4ZWQ9InllcyIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFueSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0ieWVzIi8+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0iYXJyYXkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgZml4ZWQ9InllcyIvPgotCQk8eHM6YXR0cmlidXRlIG5hbWU9ImFueUF0dCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0ieWVzIi8+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0idW5ib3VuZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiBmaXhlZD0ieWVzIi8+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibWluT2NjdXJzIiB0eXBlPSJ4czpsb25nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibWF4T2NjdXJzIiB0eXBlPSJ4czpsb25nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9wb20ueG1sIGIvMV81L21vZHVsZXMvY29kZWdlbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTMyY2RlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBDb2RlIEdlbmVyYXRpb248L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIENvZGUgR2VuZXJhdGlvbiBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1sb2NhbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvY29kZWdlbjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2NvZGVnZW48L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2NvZGVnZW48L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhzbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVtcGxhdGVzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNldCBhIHByb3BlcnR5IHRoYXQgY2FuIGJlIHBpY2tlZCB1cCBmcm9tIHRoZSBhbnQgYnVpbGQueG1sJ3MgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4uY2xhc3MucGF0aCIgcmVmaWQ9Im1hdmVuLnRlc3QuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+QnVpbGRpbmcgV1NETHMuLi48L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vdGFyZ2V0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmp1bml0Lmp2bWFyZ3MiIHZhbHVlPSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uY29tcGlsZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9ImJ1aWxkLXdzZGxzLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0iLiIgdGFyZ2V0PSJ3c2RsLWNvZGVnZW4iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aWQ+cHJvY2Vzcy1yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dHN0YW1wPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0IHByb3BlcnR5PSJidWlsZC50aW1lIiBwYXR0ZXJuPSJNTU0gZGQsIHl5eXkgKGhoOm1tOnNzIHopIiBsb2NhbGU9ImVuIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC90c3RhbXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0iJHtiYXNlZGlyfS90YXJnZXQvY2xhc3Nlcy8iIG92ZXJ3cml0ZT0idHJ1ZSIgZmlsdGVyaW5nPSJvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9zcmMvIiBpbmNsdWRlcz0iKiovKi54c2wiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJzZXQgYmVnaW50b2tlbj0iIyIgZW5kdG9rZW49IiMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImF4aXNWZXJzaW9uIiB2YWx1ZT0iJHtwcm9qZWN0LnZlcnNpb259IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49InRvZGF5IiB2YWx1ZT0iIEJ1aWx0IG9uIDogJHtidWlsZC50aW1lfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXJzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoaXMgZXhlY3V0aW9uIGlzIHVzZWQgdG8gY29weSB0ZXN0IHJlc291cmNlcyBmcm9tIG90aGVyIG1vZHVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSB0ZW1wb3JhcnkgYXJlYSBpbnNpZGUgdGhlIGNvZGVnZW4gbW9kdWxlICh3aGljaCBpcyB0aGVuIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgdGVzdFJlc291cmNlKS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbWF2ZW4tZWNsaXBlLXBsdWdpbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrIHByb3Blcmx5LCBiZWNhdXNlIEVjbGlwc2UgZG9lc24ndCBzdXBwb3J0IHNvdXJjZSBmb2xkZXJzIGxvY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgcHJvamVjdCBkaXJlY3RvcnkuIE5vdGUgdGhhdCBmb3IgTWF2ZW4sIGl0IHdvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2llbnQgdG8gc2ltcGx5IGluY2x1ZGUgdGhlc2UgZm9sZGVycyBhcyB0ZXN0UmVzb3VyY2VzLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LXRlbXBsYXRlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHktcmVzb3VyY2VzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVtcGxhdGVzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlcz4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vYWRiLWNvZGVnZW4vc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL3htbGJlYW5zL3NyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoueHNsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi9qYXhicmkvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL2ppYngvc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54c2w8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkMuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzYTI5Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETDJDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotcHVibGljIGNsYXNzIFdTREwyQyB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGNhcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDJdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGNhcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5hZGIucHJvcGVydGllcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL2Mtc2NoZW1hLWNvbXBpbGUucHJvcGVydGllcyIpOwotICAgICAgICBjYXJnc1thcmdzLmxlbmd0aF0gPSAiLWwiOwotICAgICAgICBjYXJnc1thcmdzLmxlbmd0aCArIDFdID0gImMiOwotCi0gICAgICAgIFdTREwyQ29kZS5tYWluKGNhcmdzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwyQ29kZS5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTREwyQ29kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIxZjA0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkNvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuV1NETDJKYXZhT3B0aW9uc1ZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFdTREwyQ29kZSB7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb21tYW5kTGluZU9wdGlvblBhcnNlciBjb21tYW5kTGluZU9wdGlvblBhcnNlciA9IG5ldyBDb21tYW5kTGluZU9wdGlvblBhcnNlcigKLSAgICAgICAgICAgICAgICBhcmdzKTsKLSAgICAgICAgaWYgKGlzT3B0aW9uc1ZhbGlkKGNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKSl7Ci0gICAgICAgICAgICBuZXcgQ29kZUdlbmVyYXRpb25FbmdpbmUoY29tbWFuZExpbmVPcHRpb25QYXJzZXIpLmdlbmVyYXRlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJ3c2RsMmNvZGUuYXJnIikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoIndzZGwyY29kZS5hcmcxIikpOwotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8PSA0OTsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIiArIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJ3c2RsMmNvZGUuYXJnIiArIGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09wdGlvbnNWYWxpZChDb21tYW5kTGluZU9wdGlvblBhcnNlciBwYXJzZXIpIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgaWYgKHBhcnNlci5nZXRJbnZhbGlkT3B0aW9ucyhuZXcgV1NETDJKYXZhT3B0aW9uc1ZhbGlkYXRvcigpKS5zaXplKCkgPiAwKXsKLSAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCA9PSBwYXJzZXIuZ2V0QWxsT3B0aW9ucygpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04pKXsKLSAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNWYWxpZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkphdmEuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMMkphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwYzE5Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETDJKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YSB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFdTREwyQ29kZS5tYWluKGFyZ3MpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5Db25maWd1cmF0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTE0OTY2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVHZW5Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29kZUdlbkNvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cyB7Ci0KLSAgICAvKiogQXhpcyBTZXJ2aWNlcyByZWZlcmVuY2UgKi8KLSAgICBwcml2YXRlIExpc3QgYXhpc1NlcnZpY2VzOwotCi0gICAgLyoqIEF4aXMgc2VydmljZSB0byB1c2UgKi8KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgLyoqIEJhc2UgVVJJICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVSSTsKLSAgICAvKiogcGF0aCB0byB0aGUgcmVwb3NpdG9yeSAtIHVzZWQgZm9yIGV2YWx1YXRpbmcgcG9saWN5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwb3NpdG9yeVBhdGg7Ci0gICAgLyoqIE1hcHBpbmcgZmlsZSBpbmNsdWRpbmcgdGhlIHFuYW1lIHRvIHR5cGUgbWFwICovCi0gICAgcHJpdmF0ZSBGaWxlIHR5cGVNYXBwaW5nRmlsZTsKLQotICAgIC8qKiBrZWVwcyB0aGUgV1NETCB2ZXJzaW9uICAtIGRlZmF1bHQgaXMgMS4xICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgV1NETFZlcnNpb24gPSBXU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OXzE7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gV1NETFZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V1NETFZlcnNpb24oU3RyaW5nIFdTRExWZXJzaW9uKSB7Ci0gICAgICAgIHRoaXMuV1NETFZlcnNpb24gPSBXU0RMVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRUeXBlTWFwcGluZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTWFwcGluZ0ZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZU1hcHBpbmdGaWxlKEZpbGUgdHlwZU1hcHBpbmdGaWxlKSB7Ci0gICAgICAgIHRoaXMudHlwZU1hcHBpbmdGaWxlID0gdHlwZU1hcHBpbmdGaWxlOwotICAgIH0KLQotICAgIC8qKiBBIG1hcCB0byBrZWVwIHRoZSBjdXN0b20gbmFtZXNwYWNlIGFuZCBwYWNrYWdlIG5hbWUgbWFwcGluZ3MgKi8KLSAgICBwcml2YXRlIE1hcCB1cmkyUGFja2FnZU5hbWVNYXA7Ci0KLQotICAgIHB1YmxpYyBNYXAgZ2V0VXJpMlBhY2thZ2VOYW1lTWFwKCkgewotICAgICAgICByZXR1cm4gdXJpMlBhY2thZ2VOYW1lTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVyaTJQYWNrYWdlTmFtZU1hcChNYXAgdXJpMlBhY2thZ2VOYW1lTWFwKSB7Ci0gICAgICAgIGlmICh0aGlzLnVyaTJQYWNrYWdlTmFtZU1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnVyaTJQYWNrYWdlTmFtZU1hcCA9IHVyaTJQYWNrYWdlTmFtZU1hcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMudXJpMlBhY2thZ2VOYW1lTWFwLnB1dEFsbCh1cmkyUGFja2FnZU5hbWVNYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEZ1bGwgcGF0aCBhbmQgbmFtZSBvZiBYTUxCZWFucyB4c2Rjb25maWcgZmlsZSB0byB1c2UgKi8KLSAgICBwcml2YXRlIFN0cmluZyB4c2RDb25maWdGaWxlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHhzZGNvbmZpZyBmaWxlIHRvIHVzZSBmb3IgWE1MQmVhbnMgZGF0YSBiaW5kaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBGdWxsIHBhdGggYW5kIG5hbWUgb2YgWE1MQmVhbnMgeHNkY29uZmlnIGZpbGUgdG8gdXNlCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhzZENvbmZpZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiB4c2RDb25maWdGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHhzZGNvbmZpZyBmaWxlIHRvIHVzZSBmb3IgWE1MQmVhbnMgZGF0YSBiaW5kaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHhzZENvbmZpZ0ZpbGUgRnVsbCBwYXRoIGFuZCBuYW1lIG9mIFhNTEJlYW5zIHhzZGNvbmZpZyBmaWxlIHRvIHVzZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WHNkQ29uZmlnRmlsZShTdHJpbmcgeHNkQ29uZmlnRmlsZSkgewotICAgICAgICB0aGlzLnhzZENvbmZpZ0ZpbGUgPSB4c2RDb25maWdGaWxlOwotICAgIH0KLQotICAgIC8qKiBTYXlzIHdoZXRoZXIgdG8gZmxhdHRlbiB0aGUgZmlsZXMgb3IgcHV0IHRoZW0gaW4gc3BlY2lmaWMgZm9sZGVycyAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGF0dGVuRmlsZXMgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmxhdHRlbkZpbGVzKCkgewotICAgICAgICByZXR1cm4gZmxhdHRlbkZpbGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZsYXR0ZW5GaWxlcyhib29sZWFuIGZsYXR0ZW5GaWxlcykgewotICAgICAgICB0aGlzLmZsYXR0ZW5GaWxlcyA9IGZsYXR0ZW5GaWxlczsKLSAgICB9Ci0KLSAgICAvKiogRm9sZGVyIG5hbWUgZm9yIHRoZSByZXNvdXJjZSBmaWxlcyAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlTG9jYXRpb24gPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0UmVzb3VyY2VGb2xkZXJOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTG9jYXRpb24oU3RyaW5nIHJlc291cmNlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogRm9sZGVyIG5hbWUgZm9yIHRoZSBzb3VyY2UgZmlsZXMgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzb3VyY2VMb2NhdGlvbiA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRTcmNGb2xkZXJOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gc291cmNlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlTG9jYXRpb24oU3RyaW5nIHNvdXJjZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMuc291cmNlTG9jYXRpb24gPSBzb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXJzIGFyZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB0cnVlIGJ5IGRlZmF1bHQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyc1dyYXBwZWQgPSB0cnVlOwotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlcnNXcmFwcGVkKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyc1dyYXBwZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyc1dyYXBwZWQoYm9vbGVhbiBwYXJhbWV0ZXJzV3JhcHBlZCkgewotICAgICAgICB0aGlzLnBhcmFtZXRlcnNXcmFwcGVkID0gcGFyYW1ldGVyc1dyYXBwZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotICAgICAgICByZXR1cm4gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVVJJKFN0cmluZyBiYXNlVVJJKSB7Ci0gICAgICAgIHRoaXMuYmFzZVVSSSA9IGJhc2VVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKE1hcCBjb25maWd1cmF0aW9uUHJvcGVydGllcykgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzID0gY29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRMYW5ndWFnZShTdHJpbmcgb3V0cHV0TGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRMYW5ndWFnZSA9IG91dHB1dExhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFkdmFuY2VkQ29kZUdlbkVuYWJsZWQoYm9vbGVhbiBhZHZhbmNlZENvZGVHZW5FbmFibGVkKSB7Ci0gICAgICAgIHRoaXMuYWR2YW5jZWRDb2RlR2VuRW5hYmxlZCA9IGFkdmFuY2VkQ29kZUdlbkVuYWJsZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXN5bmNPbihib29sZWFuIGFzeW5jT24pIHsKLSAgICAgICAgdGhpcy5hc3luY09uID0gYXN5bmNPbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTeW5jT24oYm9vbGVhbiBzeW5jT24pIHsKLSAgICAgICAgdGhpcy5zeW5jT24gPSBzeW5jT247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZShib29sZWFuIHNlcnZlclNpZGUpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcihib29sZWFuIGdlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVEZXBsb3llbWVudERlc2NyaXB0b3IgPSBnZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZVRlc3RDYXNlKGJvb2xlYW4gd3JpdGVUZXN0Q2FzZSkgewotICAgICAgICB0aGlzLndyaXRlVGVzdENhc2UgPSB3cml0ZVRlc3RDYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dExvY2F0aW9uKEZpbGUgb3V0cHV0TG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRMb2NhdGlvbiA9IG91dHB1dExvY2F0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBvdXRwdXRMb2NhdGlvbjsKLQotICAgIC8vZ2V0IHRoZSBkZWZhdWx0cyBmb3IgdGhlc2UgZnJvbSB0aGUgcHJvcGVydHkgZmlsZQotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dExhbmd1YWdlID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldERlZmF1bHRMYW5ndWFnZSgpOwotICAgIHByaXZhdGUgU3RyaW5nIGRhdGFiaW5kaW5nVHlwZSA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXREZWZhdWx0REJGcmFtZXdvcmtOYW1lKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGFkdmFuY2VkQ29kZUdlbkVuYWJsZWQgPSBmYWxzZTsKLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFzeW5jT24gPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzeW5jT24gPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXJ2ZXJTaWRlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRGVwbG95ZW1lbnREZXNjcmlwdG9yID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gd3JpdGVUZXN0Q2FzZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwTWVzc2FnZVJlY2VpdmVyID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBXcml0ZVdTRExzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBCdWlsZFhNTCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRvdXRwdXRTb3VyY2VMb2NhdGlvbiA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLQotICAgIC8vIERlZmF1bHQgcGFja0NsYXNzZXMgaXMgdHJ1ZSwgd2hpY2ggbWVhbnMgdGhlIGNsYXNzZXMgZ2VuZXJhdGVkCi0gICAgLy8gYnkgZGVmYXVsdCBhcmUgd3JhcHBlZC4gVGhlIGVmZmVjdCBvZiB0aGlzIHNldHRpbmcgd2lsbCBiZSBjb250cm9sbGVkCi0gICAgLy8gdG8gc29tZSBleHRlbnQsIGJ5IHRoZSBvdGhlciBzZXR0aW5ncyBhcyB3ZWxsLgotICAgIHByaXZhdGUgYm9vbGVhbiBwYWNrQ2xhc3NlcyA9IHRydWU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGwgPSBmYWxzZTsKLQotICAgIC8vdXNlciBzZWxlY3RlZCBwb3J0bmFtZQotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotICAgIC8vdXNlciBzZWxlY3RlZCBzZXJ2aWNlbmFtZQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgLy9vcHRpb24gdG8gZ2VuZXJhdGUgc2VydmVyIHNpZGUgaW50ZXJmYWNlIG9yIG5vdAotICAgIHByaXZhdGUgYm9vbGVhbiBzZXJ2ZXJTaWRlSW50ZXJmYWNlID0gZmFsc2U7Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclNpZGVJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZUludGVyZmFjZShib29sZWFuIHNlcnZlclNpZGVJbnRlcmZhY2UpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlSW50ZXJmYWNlID0gc2VydmVyU2lkZUludGVyZmFjZTsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gaXNTZXRvdXRwdXRTb3VyY2VMb2NhdGlvbigpewotICAgICAgcmV0dXJuICBzZXRvdXRwdXRTb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQSBoYXNobWFwIHRvIGhhbmcgdGhlIHByb3BlcnR5IG9iamVjdHMgKi8KLSAgICBwcml2YXRlIE1hcCBwb2xpY3lNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoKLSAgICAqIEEgaGFzaG1hcCBvZiBwcm9wZXJ0aWVzIHRoYXQgbWF5IGJlIHBvcHVsYXRlZCBvbiB0aGUgd2F5LiBleHRlbnNpb25zIGNhbiBwb3B1bGF0ZSBpdAotICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBrZWVwIG5vbiBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICAgICovCi0gICAgcHJpdmF0ZSBNYXAgY29uZmlndXJhdGlvblByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQWxsKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVBbGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVBbGwoYm9vbGVhbiBnZW5lcmF0ZUFsbCkgewotICAgICAgICB0aGlzLmdlbmVyYXRlQWxsID0gZ2VuZXJhdGVBbGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgd3JhcCBjbGFzc2VzIGZsYWcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBhIHdyYXAgY2xhc3MsIGVsc2UgcmV0dXJucyBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2tDbGFzc2VzKCkgewotICAgICAgICByZXR1cm4gcGFja0NsYXNzZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd3JhcCBjbGFzc2VzIGZsYWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFja0NsYXNzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrQ2xhc3Nlcyhib29sZWFuIHBhY2tDbGFzc2VzKSB7Ci0gICAgICAgIHRoaXMucGFja0NsYXNzZXMgPSBwYWNrQ2xhc3NlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwb2xpY3kgbWFwLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIE1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldFBvbGljeU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwb2xpY3kgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIHBvbGljeU1hcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeU1hcChNYXAgcG9saWN5TWFwKSB7Ci0gICAgICAgIHRoaXMucG9saWN5TWFwID0gcG9saWN5TWFwOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHV0cyBhIHByb3BlcnR5IGludG8gdGhlIGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvcGVydHkgYXMgT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IGtleSkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgcHJvcGVydHkgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNYXAgb2YgYWxsIHByb3BlcnRpZXMuCi0gICAgICovCi0gICAgcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUeXBlTWFwcGVyIHR5cGVNYXBwZXI7Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgVHlwZU1hcHBlci4gKi8KLSAgICBwdWJsaWMgVHlwZU1hcHBlciBnZXRUeXBlTWFwcGVyKCkgewotICAgICAgICByZXR1cm4gdHlwZU1hcHBlcjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHR5cGVNYXBwZXIgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZU1hcHBlcihUeXBlTWFwcGVyIHR5cGVNYXBwZXIpIHsKLSAgICAgICAgdGhpcy50eXBlTWFwcGVyID0gdHlwZU1hcHBlcjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIFN0cmluZy4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFiaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nVHlwZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGRhdGFiaW5kaW5nVHlwZSAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZ1R5cGUoU3RyaW5nIGRhdGFiaW5kaW5nVHlwZSkgewotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZSA9IGRhdGFiaW5kaW5nVHlwZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY29uZmlndXJhdGlvbi4gSXQgcG9wdWxhdGVzIHRoZSB2YWx1ZXMgdXNpbmcgdGhlIG9wdGlvbnMgbWFwLgotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbk1hcAotICAgICAqLwotICAgIHB1YmxpYyBDb2RlR2VuQ29uZmlndXJhdGlvbihNYXAgb3B0aW9uTWFwKSB7Ci0gICAgICAgIENvZGVnZW5Db25maWdMb2FkZXIubG9hZENvbmZpZyh0aGlzLCBvcHRpb25NYXApOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5vdXRwdXRYbWxGaWxlTmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgb3V0cHV0TG9jYXRpb24uICovCi0gICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dExhbmd1YWdlKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0TGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZHZhbmNlZENvZGVHZW5FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gYWR2YW5jZWRDb2RlR2VuRW5hYmxlZDsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhY2thZ2VOYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlTmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNPbigpIHsKLSAgICAgICAgcmV0dXJuIGFzeW5jT247Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNPbigpIHsKLSAgICAgICAgcmV0dXJuIHN5bmNPbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclNpZGUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJTaWRlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVEZXBsb3llbWVudERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcEJ1aWxkWE1MKCkgewotICAgICAgICByZXR1cm4gc2tpcEJ1aWxkWE1MOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBCdWlsZFhNTChib29sZWFuIHNraXBCdWlsZFhNTCkgewotICAgICAgICB0aGlzLnNraXBCdWlsZFhNTCA9IHNraXBCdWlsZFhNTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlVGVzdENhc2UoKSB7Ci0gICAgICAgIHJldHVybiB3cml0ZVRlc3RDYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcFdyaXRlV1NETHMoKSB7Ci0gICAgICAgIHJldHVybiBza2lwV3JpdGVXU0RMczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTa2lwV3JpdGVXU0RMcyhib29sZWFuIHdyaXRlV3JpdGVXU0RMcykgewotICAgICAgICB0aGlzLnNraXBXcml0ZVdTRExzID0gd3JpdGVXcml0ZVdTRExzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIHNraXBNZXNzYWdlUmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcE1lc3NhZ2VSZWNlaXZlcihib29sZWFuIHNraXBNZXNzYWdlUmVjZWl2ZXIpIHsKLSAgICAgICAgdGhpcy5za2lwTWVzc2FnZVJlY2VpdmVyID0gc2tpcE1lc3NhZ2VSZWNlaXZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5UGF0aChTdHJpbmcgcmVwb3NpdG9yeVBhdGgpIHsKLSAgICAgICAgdGhpcy5yZXBvc2l0b3J5UGF0aCA9IHJlcG9zaXRvcnlQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVBhdGgoKSB7Ci0gICAgICAgIHJldHVybiByZXBvc2l0b3J5UGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBeGlzU2VydmljZXMoKSB7Ci0gICAgICAgIHJldHVybiBheGlzU2VydmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXhpc1NlcnZpY2VzKExpc3QgYXhpc1NlcnZpY2VzKSB7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2VzID0gYXhpc1NlcnZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEF4aXNTZXJ2aWNlKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2VzLmFkZChheGlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGF4aXMgc2VydmljZXMKLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICAgICAgfSBlbHNlIGlmICgoYXhpc1NlcnZpY2VzICE9IG51bGwpICYmIChheGlzU2VydmljZXMuc2l6ZSgpID4gMCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoQXhpc1NlcnZpY2UpYXhpc1NlcnZpY2VzLmdldCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSBleHBlY3RlZCB0byBiZSBiYWNrd29yZCBjb21wYXRpYmxlCi0gICAgICogd2l0aCBBeGlzIDEueAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBiYWNrd29yZENvbXBhdGliaWxpdHlNb2RlID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBiYWNrd29yZENvbXBhdGliaWxpdHlNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoYm9vbGVhbiBiYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKSB7Ci0gICAgICAgIHRoaXMuYmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSA9IGJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGU7Ci0gICAgfQotCi0gICAgLyoqIFNob3VsZCB3ZSBzdXBwcmVzcyBuYW1lc3BhY2UgcHJlZml4ZXMgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NQcmVmaXhlc01vZGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcHJlc3NQcmVmaXhlc01vZGUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBwcmVzc1ByZWZpeGVzTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc1ByZWZpeGVzTW9kZShib29sZWFuIHN1cHByZXNzUHJlZml4ZXNNb2RlKSB7Ci0gICAgICAgIHRoaXMuc3VwcHJlc3NQcmVmaXhlc01vZGUgPSBzdXBwcmVzc1ByZWZpeGVzTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIGlmICgodGhpcy5heGlzU2VydmljZXMgIT0gbnVsbCkgJiYgKHRoaXMuYXhpc1NlcnZpY2VzLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAoKEF4aXNTZXJ2aWNlKXRoaXMuYXhpc1NlcnZpY2VzLmdldCgwKSkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFMaXN0Rm9yQWxsU2VydmljZXMoKSB7Ci0gICAgICAgIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzY2hlbWFzLmFkZEFsbChheGlzU2VydmljZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjaGVtYXM7Ci0gICAgfQotCi0gICAgLyoqIGtlZXAgdGhpcyB3c2RsIGRlZmluaXRpb24gdG8gd3JpdGUgdGhlIHdzZGwgZmlsZSBsYXRlciAqLwotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbjsKLQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdzZGxEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbERlZmluaXRpb24oRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbikgewotICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsUG9ydHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3ZlcnJpZGU7Ci0gICAgCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbFBvcnRzKCkgewotICAgICAgICByZXR1cm4gaXNBbGxQb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxQb3J0cyhib29sZWFuIGFsbFBvcnRzKSB7Ci0gICAgICAgIGlzQWxsUG9ydHMgPSBhbGxQb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRlKCkgewotICAgICAgICByZXR1cm4gaXNPdmVycmlkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7Ci0gICAgICAgIGlzT3ZlcnJpZGUgPSBvdmVycmlkZTsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIGlzIHVzZWQgdG8ga2VlcCB0aGUgZ2VuZXJhdGVkIHhtbCBmaWxlIGxpc3QgdG8gcHJldHR5IHByaW50LgotICAgIHByaXZhdGUgTGlzdCBvdXRwdXRYbWxGaWxlTmFtZXNMaXN0OwotCi0gICAgcHVibGljIExpc3QgZ2V0T3V0cHV0WG1sRmlsZU5hbWVzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dFhtbEZpbGVOYW1lc0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0WG1sRmlsZU5hbWVzTGlzdChMaXN0IG91dHB1dFhtbEZpbGVOYW1lc0xpc3QpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRYbWxGaWxlTmFtZXNMaXN0ID0gb3V0cHV0WG1sRmlsZU5hbWVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRYbWxGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpewotICAgICAgIHRoaXMub3V0cHV0WG1sRmlsZU5hbWVzTGlzdC5hZGQoZmlsZU5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRvdXRwdXRTb3VyY2VMb2NhdGlvbihib29sZWFuIHNldG91dHB1dHNvdXJjZWxvY2F0aW9uKQotICAgIHsKLSAgICAgICAgc2V0b3V0cHV0U291cmNlTG9jYXRpb24gPSB0cnVlOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBleGNsdWRlUHJvcGVydGllczsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlUHJvcGVydGllcyhTdHJpbmcgZXhjbHVkZVByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5leGNsdWRlUHJvcGVydGllcyA9IGV4Y2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNrZWx0b25JbnRlcmZhY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHNrZWx0b25DbGFzc05hbWU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNrZWx0b25JbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2tlbHRvbkludGVyZmFjZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tlbHRvbkludGVyZmFjZU5hbWUoU3RyaW5nIHNrZWx0b25JbnRlcmZhY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2tlbHRvbkludGVyZmFjZU5hbWUgPSBza2VsdG9uSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNrZWx0b25DbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBza2VsdG9uQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNrZWx0b25DbGFzc05hbWUoU3RyaW5nIHNrZWx0b25DbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5za2VsdG9uQ2xhc3NOYW1lID0gc2tlbHRvbkNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3M7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRlQWJzb2x1dGVBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gb3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MoYm9vbGVhbiBvdmVycmlkZUFic29sdXRlQWRkcmVzcykgewotICAgICAgICB0aGlzLm92ZXJyaWRlQWJzb2x1dGVBZGRyZXNzID0gb3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjZXB0aW9uQmFzZUNsYXNzTmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uQmFzZUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbkJhc2VDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhjZXB0aW9uQmFzZUNsYXNzTmFtZShTdHJpbmcgZXhjZXB0aW9uQmFzZUNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmV4Y2VwdGlvbkJhc2VDbGFzc05hbWUgPSBleGNlcHRpb25CYXNlQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1VzZU9wZXJhdGlvbk5hbWU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZU9wZXJhdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBpc1VzZU9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlT3BlcmF0aW9uTmFtZShib29sZWFuIHVzZU9wZXJhdGlvbk5hbWUpIHsKLSAgICAgICAgaXNVc2VPcGVyYXRpb25OYW1lID0gdXNlT3BlcmF0aW9uTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuZXJhdGlvbkVuZ2luZS5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZUdlbmVyYXRpb25FbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkYmRmZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuZXJhdGlvbkVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5FbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5Db2RlR2VuRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIENvZGVHZW5lcmF0aW9uRW5naW5lIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb2RlR2VuZXJhdGlvbkVuZ2luZS5jbGFzcyk7Ci0KLSAgICAvKiogQXJyYXkgTGlzdCBmb3IgcHJlLWV4dGVuc2lvbnMuIEV4dGVuc2lvbnMgdGhhdCBydW4gYmVmb3JlIHRoZSBlbWl0dGVyICovCi0gICAgcHJpdmF0ZSBMaXN0IHByZUV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgLyoqIEFycmF5IExpc3QgZm9yIHBvc3QtZXh0ZW5zaW9ucy4gRXh0ZW5zaW9ucyB0aGF0IHJ1biBhZnRlciB0aGUgY29kZWdlbnMgKi8KLSAgICBwcml2YXRlIExpc3QgcG9zdEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKiogQ29kZWdlbiBjb25maWd1cmF0aW9uICByZWZlcmVuY2UgKi8KLSAgICBwcml2YXRlIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotICAgICAqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29kZUdlbmVyYXRpb25FbmdpbmUoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICAgICAgbG9hZEV4dGVuc2lvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyc2VyCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb2RlR2VuZXJhdGlvbkVuZ2luZShDb21tYW5kTGluZU9wdGlvblBhcnNlciBwYXJzZXIpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBhbGxPcHRpb25zID0gcGFyc2VyLmdldEFsbE9wdGlvbnMoKTsKLSAgICAgICAgU3RyaW5nIHdzZGxVcmk7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChDb21tYW5kTGluZU9wdGlvbilhbGxPcHRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OKTsKLSAgICAgICAgICAgIHdzZGxVcmkgPSBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29kZUdlbkNvbmZpZ3VyYXRpb24oYWxsT3B0aW9ucyk7Ci0KLQotICAgICAgICAgICAgaWYgKENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fMi4KLSAgICAgICAgICAgICAgICAgICAgZXF1YWxzKGNvbmZpZ3VyYXRpb24uZ2V0V1NETFZlcnNpb24oKSkpIHsKLQotICAgICAgICAgICAgICAgIFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXI7Ci0KLSAgICAgICAgICAgICAgICAvLyBqaWJ4IGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpc2VydmljZQotICAgICAgICAgICAgICAgIGlmICgoY29uZmlndXJhdGlvbi5nZXRTZXJ2aWNlTmFtZSgpICE9IG51bGwpIHx8IChjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpLmVxdWFscygiamlieCIpKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxVcmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRTZXJ2aWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0UG9ydE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmlzQWxsUG9ydHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29kZWdlbih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5hZGRBeGlzU2VydmljZShidWlsZGVyLnBvcHVsYXRlU2VydmljZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcih3c2RsVXJpLCBjb25maWd1cmF0aW9uLmdldFBvcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0QWxsUG9ydHMoY29uZmlndXJhdGlvbi5pc0FsbFBvcnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldEF4aXNTZXJ2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcilidWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL0l0J2xsIGJlIFdTREwgMS4xCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3c2RsNGpEZWYgPSByZWFkSW5UaGVXU0RMRmlsZSh3c2RsVXJpKTsKLQotICAgICAgICAgICAgICAgIC8vIHdlIHNhdmUgdGhlIG9yaWdpbmFsIHdzZGwgZGVmaW5pdGlvbiB0byB3cml0ZSBpdCB0byB0aGUgcmVzb3VyY2UgZm9sZGVyIGxhdGVyCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBvbmx5IGlmIGl0IGhhcyBpbXBvcnRzCi0gICAgICAgICAgICAgICAgTWFwIGltcG9ydHMgPSB3c2RsNGpEZWYuZ2V0SW1wb3J0cygpOwotICAgICAgICAgICAgICAgIGlmICgoaW1wb3J0cyAhPSBudWxsKSAmJiAoaW1wb3J0cy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFdzZGxEZWZpbml0aW9uKHJlYWRJblRoZVdTRExGaWxlKHdzZGxVcmkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFdzZGxEZWZpbml0aW9uKHdzZGw0akRlZik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIG9uZSBzZXJ2aWNlIGFuZCBvbmUgcG9ydCBpZiB0aGUKLSAgICAgICAgICAgICAgICAvLyB1c2VyIGhhcyBzcGVjaWZpZWQgdGhlbS4KLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGV2ZXJ5IHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogZmluZCBvdXQgYSBwZXJtYW5hbnQgc29sdXRpb24gZm9yIHRoaXMuCi0gICAgICAgICAgICAgICAgUU5hbWUgc2VydmljZVFuYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldFNlcnZpY2VOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUW5hbWUgPSBuZXcgUU5hbWUod3NkbDRqRGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWlsZGVyOwotICAgICAgICAgICAgICAgIC8vIGppYnggY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlzZXJ2aWNlCi0gICAgICAgICAgICAgICAgaWYgKChzZXJ2aWNlUW5hbWUgIT0gbnVsbCkgfHwgKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkuZXF1YWxzKCJqaWJ4IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFBvcnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5pc0FsbFBvcnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uYWRkQXhpc1NlcnZpY2UoYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIod3NkbDRqRGVmLCBjb25maWd1cmF0aW9uLmdldFBvcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0QWxsUG9ydHMoY29uZmlndXJhdGlvbi5pc0FsbFBvcnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldEF4aXNTZXJ2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcilidWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0QmFzZVVSSShnZXRCYXNlVVJJKHdzZGxVcmkpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLndzZGxQYXJzaW5nRXhjZXB0aW9uIiksIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLndzZGxQYXJzaW5nRXhjZXB0aW9uIiksIGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZ2luZS53c2RsUGFyc2luZ0V4Y2VwdGlvbiIpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRFeHRlbnNpb25zKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIHJlbGV2YW50IHByZUV4dGVuc2lvbnMKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZEV4dGVuc2lvbnMoKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL2xvYWQgcHJlIGV4dGVuc2lvbnMKLSAgICAgICAgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXRFeHRlbnNpb25DbGFzc05hbWVzKCk7Ci0gICAgICAgIGlmIChleHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vbG9hZCB0aGUgRXh0ZW5zaW9uIGNsYXNzCi0gICAgICAgICAgICAgICAgYWRkUHJlRXh0ZW5zaW9uKChDb2RlR2VuRXh0ZW5zaW9uKWdldE9iamVjdEZyb21DbGFzc05hbWUoZXh0ZW5zaW9uc1tpXS50cmltKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vbG9hZCBwb3N0IGV4dGVuc2lvbnMKLSAgICAgICAgU3RyaW5nW10gcG9zdEV4dGVuc2lvbnMgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0UG9zdEV4dGVuc2lvbkNsYXNzTmFtZXMoKTsKLSAgICAgICAgaWYgKHBvc3RFeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9zdEV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvL2xvYWQgdGhlIEV4dGVuc2lvbiBjbGFzcwotICAgICAgICAgICAgICAgIGFkZFBvc3RFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAoQ29kZUdlbkV4dGVuc2lvbilnZXRPYmplY3RGcm9tQ2xhc3NOYW1lKHBvc3RFeHRlbnNpb25zW2ldLnRyaW0oKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZ2l2ZW4gZXh0ZW5zaW9uIHRvIHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByZUV4dGVuc2lvbihDb2RlR2VuRXh0ZW5zaW9uIGV4dCkgewotICAgICAgICBpZiAoZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByZUV4dGVuc2lvbnMuYWRkKGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZ2l2ZW4gZXh0ZW5zaW9uIHRvIHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBvc3RFeHRlbnNpb24oQ29kZUdlbkV4dGVuc2lvbiBleHQpIHsKLSAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwb3N0RXh0ZW5zaW9ucy5hZGQoZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIHRoZSBjb2RlISEKLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL2VuZ2FnZSB0aGUgcHJlLWV4dGVuc2lvbnMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlRXh0ZW5zaW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICgoQ29kZUdlbkV4dGVuc2lvbilwcmVFeHRlbnNpb25zLmdldChpKSkuZW5nYWdlKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbWl0dGVyIGVtaXR0ZXI7Ci0KLQotICAgICAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSBjb25maWd1cmF0aW9uLmdldFR5cGVNYXBwZXIoKTsKLSAgICAgICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgY2hlY2sgaXMgcmVkdW5kYW50IGhlcmUuIFRoZSBkZWZhdWx0IGRhdGFiaW5kaW5nIGV4dGVuc2lvbiBzaG91bGQKLSAgICAgICAgICAgICAgICAvLyBoYXZlIGFscmVhZHkgZmlndXJlZCB0aGlzIG91dCBhbmQgdGhyb3duIGFuIGVycm9yIG1lc3NhZ2UuIEhvd2V2ZXIgaW4gY2FzZSB0aGUKLSAgICAgICAgICAgICAgICAvLyB1c2VycyBkZWNpZGVzIHRvIG1lc3Mgd2l0aCB0aGUgY29uZmlnIGl0IGlzIHNhZmUgdG8ga2VlcCB0aGlzIGNoZWNrIGluIG9yZGVyIHRvIHRocm93Ci0gICAgICAgICAgICAgICAgLy8gYSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLm5vUHJvcGVyRGF0YWJpbmRpbmdFeGNlcHRpb24iKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vRmluZCBhbmQgaW52b2tlIHRoZSBlbWl0dGVyIGJ5IHJlZmxlY3Rpb24KLSAgICAgICAgICAgIE1hcCBlbWl0dGVyTWFwID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldExhbmd1YWdlRW1pdHRlck1hcCgpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpZW1pdHRlck1hcC5nZXQoY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVtaXR0ZXIgPSAoRW1pdHRlcilnZXRPYmplY3RGcm9tQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgZW1pdHRlci5zZXRDb2RlR2VuQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLnNldE1hcHBlcihtYXBwZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmdpbmUuZW1pdHRlck1pc3NpbmciKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vaW52b2tlIHRoZSBuZWNlc3NhcnkgbWV0aG9kcyBpbiB0aGUgZW1pdHRlcgotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXRTa2VsZXRvbigpOwotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB1c2VycyB3YW50IGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIsIGl0IHdvdWxkIGJlIGluIHRoZQotICAgICAgICAgICAgICAgIC8vIGdlbmVyYXRlIGFsbCBvcHRpb24KLSAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5pc0dlbmVyYXRlQWxsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0U3R1YigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0U3R1YigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2VuZ2FnZSB0aGUgcG9zdC1leHRlbnNpb25zCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvc3RFeHRlbnNpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgKChDb2RlR2VuRXh0ZW5zaW9uKXBvc3RFeHRlbnNpb25zLmdldChpKSkuZW5nYWdlKGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZ2luZS53cm9uZ0VtaXR0ZXIiKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBXU0RMIGZpbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkSW5UaGVXU0RMRmlsZShmaW5hbCBTdHJpbmcgdXJpKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImphdmF4LndzZGwuaW1wb3J0RG9jdW1lbnRzIiwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiByZWFkZXIucmVhZFdTREwodXJpKTsKLSAgICAgICAgCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBnZXRzIGEgb2JqZWN0IGZyb20gdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0RnJvbUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgZXh0ZW5zaW9uQ2xhc3MgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIFJFVklFVyBGT1IgSkFWQSA2Ci0gICAgICAgICAgICAvLyBJbiBKYXZhIDUsIGlmIHlvdSBwYXNzZWQgYW4gYXJyYXkgc3RyaW5nIHN1Y2ggYXMgIltMY29tLm15cGFja2FnZS5NeUNsYXNzOyIgdG8KLSAgICAgICAgICAgIC8vIGxvYWRDbGFzcywgdGhlIGNsYXNzIHdvdWxkIGluZGVlZCBiZSBsb2FkZWQuICAKLSAgICAgICAgICAgIC8vIEluIEpESzYsIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpcyB0aHJvd24uIAotICAgICAgICAgICAgLy8gVGhlIHdvcmstYXJvdW5kIGlzIHRvIHVzZSBjb2RlIENsYXNzLmZvck5hbWUgaW5zdGVhZC4KLSAgICAgICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgICAgICAvLyB0cnkgewotICAgICAgICAgICAgLy8gICAgICAgY2xhc3NMb2FkZXIubG9hZENsYXNzKG5hbWUpOwotICAgICAgICAgICAgLy8gIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gICAgICAgQ2xhc3MuZm9yTmFtZShuYW1lLCBmYWxzZSwgbG9hZGVyKTsKLSAgICAgICAgICAgIC8vICB9Ci0gICAgICAgICAgICBsb2cuZGVidWcoQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZ2luZS5leHRlbnNpb25Mb2FkUHJvYmxlbSIpLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZ2luZS5leHRlbnNpb25JbnN0YW50aWF0aW9uUHJvYmxlbSIpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZ2luZS5pbGxlZ2FsRXh0ZW5zaW9uIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5naW5lLmV4dGVuc2lvbkxvYWRQcm9ibGVtIiksIGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNhbGN1bGF0ZXMgdGhlIGJhc2UgVVJJIE5lZWRzIGltcHJvdmVtZW50IGJ1dCB3b3JrcyBmaW5lIGZvciBub3cgOykKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdXJyZW50VVJJCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZVVSSShTdHJpbmcgY3VycmVudFVSSSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjdXJyZW50VVJJKTsKLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB1cmlGcmFnbWVudCA9IGN1cnJlbnRVUkkuc3Vic3RyaW5nKDAsIGN1cnJlbnRVUkkubGFzdEluZGV4T2YoIi8iKSk7Ci0gICAgICAgIHJldHVybiB1cmlGcmFnbWVudCArICh1cmlGcmFnbWVudC5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNhbGN1bGF0ZXMgdGhlIFVSSQotICAgICAqIG5lZWRzIGltcHJvdmVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY3VycmVudFVSSQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldFVSSShTdHJpbmcgY3VycmVudFVSSSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRVUkkpOwotICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSl7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRVUkk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBDb2RlR2VuQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZUdlbmVyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkMGNjYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbjsKLQotcHVibGljIGNsYXNzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc3NjMxNDAwNzUxNjY4ODY3OTVMOwotCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCB0aHJvd2FibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHN1cGVyKHRocm93YWJsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZWdlbkNvbmZpZ0xvYWRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vQ29kZWdlbkNvbmZpZ0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg2YjY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL0NvZGVnZW5Db25maWdMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uWE1MQmVhbnNFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWNsYXNzIENvZGVnZW5Db25maWdMb2FkZXIgaW1wbGVtZW50cyBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9hZENvbmZpZyhDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWcsIE1hcCBvcHRpb25NYXApIHsKLSAgICAgICAgU3RyaW5nIG91dHB1dExvY2F0aW9uID0gIi4iOyAvL2RlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSBpcyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotICAgICAgICBDb21tYW5kTGluZU9wdGlvbiBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgIC8vc2V0IGlzb3V0cHV0U291cmNlTG9jYXRpb24gdHJ1ZSB3aGVuIHVzZXIgc3BlY2lmeSBhbiBvdXRwdXQgc291cmNlIGxvY2F0aW9uCi0gICAgICAgICAgICBjb25maWcuc2V0b3V0cHV0U291cmNlTG9jYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICBvdXRwdXRMb2NhdGlvbiA9IGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZSBvdXRwdXRMb2NhdGlvbkZpbGUgPSBuZXcgRmlsZShvdXRwdXRMb2NhdGlvbik7Ci0gICAgICAgIGNvbmZpZy5zZXRPdXRwdXRMb2NhdGlvbihvdXRwdXRMb2NhdGlvbkZpbGUpOwotCi0gICAgICAgIC8vY2hlY2sgYW5kIGNyZWF0ZSB0aGUgZGlyZWN0b3JpZXMKLSAgICAgICAgaWYgKG91dHB1dExvY2F0aW9uRmlsZS5leGlzdHMoKSkgey8vJE5PTi1TRUMtMgotICAgICAgICAgICAgaWYgKG91dHB1dExvY2F0aW9uRmlsZS5pc0ZpbGUoKSkgey8vJE5PTi1TRUMtMgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wdGlvbnMubm90QURpcmVjdG9yeUV4Y2VwdGlvbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dHB1dExvY2F0aW9uRmlsZS5ta2RpcnMoKTsvLyROT04tU0VDLTIKLSAgICAgICAgfQotCi0gICAgICAgIGNvbmZpZy5zZXRTZXJ2ZXJTaWRlKGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0gICAgICAgIGNvbmZpZy5zZXRHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGNvbmZpZy5zZXRXcml0ZVRlc3RDYXNlKGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9IG51bGwpOwotICAgICAgICBjb25maWcuc2V0U2tpcFdyaXRlV1NETHMobG9hZE9wdGlvbihudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OT19XU0RMU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9IG51bGwpOwotICAgICAgICBjb25maWcuc2V0U2tpcE1lc3NhZ2VSZWNlaXZlcihsb2FkT3B0aW9uKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5PX01FU1NBR0VfUkVDRUlWRVJfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPSBudWxsKTsKLSAgICAgICAgY29uZmlnLnNldFNraXBCdWlsZFhNTChsb2FkT3B0aW9uKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5PX0JVSUxEX1hNTF9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApICE9IG51bGwpOwotCi0gICAgICAgIGJvb2xlYW4gYXN5bmNGbGFnUHJlc2VudCA9Ci0gICAgICAgICAgICAgICAgKGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKSAhPSBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBzeW5jRmxhZ1ByZXNlbnQgPQotICAgICAgICAgICAgICAgIChsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTl9MT05HLCBvcHRpb25NYXApICE9IG51bGwpOwotICAgICAgICBpZiAoYXN5bmNGbGFnUHJlc2VudCAmJiAhc3luY0ZsYWdQcmVzZW50KSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0QXN5bmNPbih0cnVlKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTeW5jT24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzeW5jRmxhZ1ByZXNlbnQgJiYgIWFzeW5jRmxhZ1ByZXNlbnQpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRBc3luY09uKGZhbHNlKTsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTeW5jT24odHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0UGFja2FnZU5hbWUoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0T3V0cHV0TGFuZ3VhZ2UoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXREYXRhYmluZGluZ1R5cGUoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuVU5QQUNLX0NMQVNTRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVOUEFDS19DTEFTU0VTX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldFBhY2tDbGFzc2VzKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNvdXJjZSBmb2xkZXIKLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5TT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWcuc2V0U291cmNlTG9jYXRpb24oY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNvdXJjZSBmb2xkZXIKLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5SRVNPVVJDRV9GT0xERVJfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRSZXNvdXJjZUxvY2F0aW9uKGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgY29uZmlnLnNldFBvcnROYW1lKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwgPyBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpIDogbnVsbCk7Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgY29uZmlnLnNldFNlcnZpY2VOYW1lKAotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwgPyBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpIDogbnVsbCk7Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5SRVBPU0lUT1JZX1BBVEhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgY29uZmlnLnNldFJlcG9zaXRvcnlQYXRoKAotICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwgPyBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpIDogbnVsbCk7Ci0KLSAgICAgICAgY29uZmlnLnNldFNlcnZlclNpZGVJbnRlcmZhY2UobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgY29uZmlnLnNldEdlbmVyYXRlQWxsKGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgY29uZmlnLnNldFVzZU9wZXJhdGlvbk5hbWUobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuVVNFX09QRVJBVElPTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5VU0VfT1BFUkFUSU9OX05BTUVfTE9ORywgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICAvL3BvcHVsYXRlIHRoZSBleHRlcm5hbCBtYXBwaW5nCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhURVJOQUxfTUFQUElOR19PUFRJT04sCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYVEVSTkFMX01BUFBJTkdfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFR5cGVNYXBwaW5nRmlsZShuZXcgRmlsZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wdGlvbnMubm9tYXBwaW5nRmlsZSIpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvYWQgdGhlIG5hbWVzcGFjZSB0byBwYWNrYWdlIGxpc3QKLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vdGhlIHN5bnRheCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBuYW1lc3BhY2VzIGFuZCBwYWNrYWdlcyBpcwotICAgICAgICAgICAgLy90byBiZSBhIGNvbW1hIHNlcGVyYXRlZCBsaXN0IHdpdGggdXJpPXBhY2thZ2VuYW1lLHVyaT1wYWNrYWdlbmFtZS4uLgotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJ5IHRyZWF0aW5nIHRoZSB2YWx1ZXMgYXMgYSBuYW1lPXZhbHVlIHBhaXIgc2VwYXJhdGVkIGJ5IGNvbW1hJ3MKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignPScpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZXBhaXJzW10gPSB2YWx1ZS5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVwYWlycy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3B1dCB0aGVtIGluIHRoZSBoYXNoIG1hcAotICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCh2YWx1ZXBhaXJzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcGFpcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSB2YWx1ZXBhaXJzW2ldLnNwbGl0KCI9Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KHZhbHVlc1swXSwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0VXJpMlBhY2thZ2VOYW1lTWFwKG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUcnkgbG9hZGluZyB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBmaWxlIHNwZWNpZmllZAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsvLyROT04tU0VDLTMKLSAgICAgICAgICAgICAgICAgICAgICAgIHAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHZhbHVlKSk7Ly8kTk9OLVNFQy0yLy8kTk9OLVNFQy0zCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0VXJpMlBhY2thZ2VOYW1lTWFwKHApOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2UoIm9wdGlvbnMubm9GaWxlIiwgdmFsdWUpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0KLSAgICAgICAgICAgICAgICBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSU19MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRQYXJhbWV0ZXJzV3JhcHBlZChmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9Ci0gICAgICAgICAgICAgICAgbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG9wdGlvblZhbHVlID0gY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKFdTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fMi5lcXVhbHMob3B0aW9uVmFsdWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fMl9PUFRJT05BTC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy91c2VycyBjYW4gc2F5IGVpdGhlciAyLjAgb3IgMiAtIHdlICBqdXN0IHNldCBpdCB0byB0aGUgY29uc3RhbnQKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0V1NETFZlcnNpb24oV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl8yKTsKLSAgICAgICAgICAgIH0gLy9pZ25vcmUgdGhlIG90aGVyIGNhc2VzIC0gdGhleSdsbCBiZSB0YWtlbiBhcyAxLjEKLQotICAgICAgICB9Ci0KLSAgICAgICAgY29uZmlnCi0gICAgICAgICAgICAgICAgLnNldEZsYXR0ZW5GaWxlcyhsb2FkT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5CQUNLV09SRF9DT01QQVRJQklMSVRZX09QVElPTiwKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnLnNldEJhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24oCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1VQUFJFU1NfUFJFRklYRVNfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTdXBwcmVzc1ByZWZpeGVzTW9kZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihYTUxCZWFuc0V4dGVuc2lvbi5YU0RDT05GSUdfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MQmVhbnNFeHRlbnNpb24uWFNEQ09ORklHX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkucHV0KFhNTEJlYW5zRXh0ZW5zaW9uLlhTRENPTkZJR19PUFRJT04sIAotICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2V0dGluZyBodHRwIHByb3h5IGhvc3QgYW5kIGh0dHAgcHJveHkgcG9ydAotICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IGxvYWRPcHRpb24obnVsbCwgV1NETDJKYXZhQ29uc3RhbnRzLkhUVFBfUFJPWFlfSE9TVF9PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCBjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsvLyROT04tU0VDLTIKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihudWxsLCBXU0RMMkphdmFDb25zdGFudHMuSFRUUF9QUk9YWV9QT1JUX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwLnByb3h5UG9ydCIsIGNvbW1hbmRMaW5lT3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOy8vJE5PTi1TRUMtMgotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBsb2FkT3B0aW9uKFdTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKXsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRFeGNsdWRlUHJvcGVydGllcyhjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9JTlRFUkZBQ0VfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OX0xPTkcsIG9wdGlvbk1hcCk7Ci0gICAgICAgIGlmIChjb21tYW5kTGluZU9wdGlvbiAhPSBudWxsKXsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRTa2VsdG9uSW50ZXJmYWNlTmFtZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9DTEFTU19OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9DTEFTU19OQU1FX09QVElPTl9MT05HLCBvcHRpb25NYXApOwotICAgICAgICBpZiAoY29tbWFuZExpbmVPcHRpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICBjb25maWcuc2V0U2tlbHRvbkNsYXNzTmFtZShjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0gbG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuRVhDRVBUSU9OX0JBU0VfQ0xBU1NfT1BUSU9OLAotICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWENFUFRJT05fQkFTRV9DTEFTU19PUFRJT05fTE9ORywgb3B0aW9uTWFwKTsKLSAgICAgICAgaWYgKGNvbW1hbmRMaW5lT3B0aW9uICE9IG51bGwpewotICAgICAgICAgICAgY29uZmlnLnNldEV4Y2VwdGlvbkJhc2VDbGFzc05hbWUoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXR0aW5nIHRoZSBvdmVycmlkIGFuZCBhbGwgcG9ydHMgb3B0aW9ucwotICAgICAgICBjb25maWcuc2V0QWxsUG9ydHMobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuQWxsX1BPUlRTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICBjb25maWcuc2V0T3ZlcnJpZGUobG9hZE9wdGlvbihXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk1hcCkgIT0gbnVsbCk7Ci0KLSAgICAgICAgY29uZmlnLnNldE92ZXJyaWRlQWJzb2x1dGVBZGRyZXNzKGxvYWRPcHRpb24oV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX0FCU09MVVRFX0FERFJFU1NfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfQUJTT0xVVEVfQUREUkVTU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uTWFwKSAhPSBudWxsKTsKLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIG1hcCBhbmQgZmluZCBwYXJhbWV0ZXJzIGhhdmluZyB0aGUgZXh0cmEgcHJlZml4LgotICAgICAgICAvL3B1dCB0aGVtIGluIHRoZSBwcm9wZXJ0eSBtYXAKLSAgICAgICAgSXRlcmF0b3Iga2V5SXRlcmF0b3IgPSBvcHRpb25NYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9IChDb21tYW5kTGluZU9wdGlvbilvcHRpb25NYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAoa2V5LnRvU3RyaW5nKCkuc3RhcnRzV2l0aChXU0RMMkphdmFDb25zdGFudHMuRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVgpKSB7Ci0gICAgICAgICAgICAgICAgLy9hZGQgdGhpcyB0byB0aGUgcHJvcGVydHkgbWFwCi0gICAgICAgICAgICAgICAgY29uZmlnLmdldFByb3BlcnRpZXMoKS5wdXQoa2V5LnRvU3RyaW5nKCkucmVwbGFjZUZpcnN0KAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYVFJBX09QVElPTlRZUEVfUFJFRklYLCAiIiksIG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb21tYW5kTGluZU9wdGlvbiBsb2FkT3B0aW9uKFN0cmluZyBzaG9ydE9wdGlvbiwgU3RyaW5nIGxvbmdPcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgb3B0aW9ucykgewotICAgICAgICAvL3Nob3J0IG9wdGlvbiBnZXRzIHByZWNlZGVuY2UKLSAgICAgICAgQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGxvbmdPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKW9wdGlvbnMuZ2V0KGxvbmdPcHRpb24pOwotICAgICAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2hvcnRPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKW9wdGlvbnMuZ2V0KHNob3J0T3B0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcHRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9jb2RlZ2VuLWNvbmZpZy5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vY29kZWdlbi1jb25maWcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4N2Y1MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9jb2RlZ2VuLWNvbmZpZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIGNvZGUgZ2VuZXJhdG9yIHByb3BlcnR5IGZpbGUgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFeHRlbnNpb25zIC0gVGhlIGV4dGVuc2lvbiBjbGFzcyBuYW1lcyBhcmUgY29tbWEgc2VwYXJhdGVkCi0jIGFuZCB0aGVzZSBleHRlbnNpb25zIHdpbGwgcnVuIGJlZm9yZSB0aGUgbWFpbiBlbWl0dGVyCi0jIHRoZXNlIGFyZSBsb2FkZWQgaW4gdGhlaXIgbGV4aWNhbCBvcmRlcgotIyBOb3RlIHRoZSBsYXN0IGV4dGVuc2lvbiAtIEl0IGluY2x1ZGVzIGEgY2hlY2sgdG8gZmlndXJlIG91dCB3aGV0aGVyIHByb3BlciBkYXRhYmluZGluZyBoYXMgdGFrZW4gcGxhY2UKLSMgVGhpcyBleHRlbnNpb24gc2hvdWxkIGFwcGVhciBBRlRFUiBhbGwgdGhlIGRhdGFiaW5kaW5nIGV4dGVuc2lvbnMgaW5vcmRlciB0byBmdW5jdGlvbiBwcm9wZXJseQotY29kZWdlbi5leHRlbnNpb249b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlBhY2thZ2VGaW5kZXIsXAotb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkpBWFdTV2FwcGVyRXh0ZW5zaW9uLFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlNjaGVtYVVud3JhcHBlckV4dGVuc2lvbixcCi0gIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5YTUxCZWFuc0V4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uU2ltcGxlREJFeHRlbnNpb24sIFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkppQlhFeHRlbnNpb24sIFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkpBWEJSSUV4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uVHlwZU1hcHBlckV4dGVuc2lvbiwgXAotICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uRGVmYXVsdERhdGFiaW5kaW5nRXh0ZW5zaW9uLCBcCi0gIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5Qb2xpY3lFdmFsdWF0b3IKLSNleHRlbnNpb25zIHRoYXQgd29yayBhZnRlciB0aGUgbWFpbiBlbWl0dGVyLiBUaGVzZSB3aWxsIGluY2x1ZGUgZnVuY3Rpb25hbGl0eSBzdWNoIGFzCi0jZm9ybWF0dGVycwotcG9zdC5jb2RlZ2VuLmV4dGVuc2lvbj1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSmF2YVByZXR0eVByaW50ZXJFeHRlbnNpb24sIFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlhNTFByZXR0eVByaW50ZXJFeHRlbnNpb24sIFwKLSAgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLldTRExQcmV0dHlQcmludGVyRXh0ZW5zaW9uLCBcCi0gIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5FeGNsdWRlUGFja2FnZUV4dGVuc2lvbgotCi0jY29kZWdlbi5leHRlbnNpb249b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkF4aXNCaW5kaW5nQnVpbGRlcixvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uV1NETFZhbGlkYXRvckV4dGVuc2lvbixvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uUGFja2FnZUZpbmRlcixvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uU2ltcGxlREJFeHRlbnNpb24KLSMgVGhlIHRoaXJkIHBhcnR5IHNjaGVtYXMgdG8gYmUgbG9hZGVkLiBlLmcuIFRoZSBYbWltZSBleHRlbnNpb24KLSMgTm90ZSAtIHRoZXNlIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYSBwYWNrYWdlLgotIyBzbyB3aGF0ZXZlciB0aGUgdGhpcmQgcGFydHkgc2NoZW1hJ3MgdGhhdCBhcmUgbGlzdGVkIGhlcmUgc2hvdWxkIGJlIHByZXNlbnQgdGhlcmUKLSNjb2RlZ2VuLnRoaXJkcGFydHkuc2NoZW1hPQotY29kZWdlbi50aGlyZHBhcnR5LnNjaGVtYT14bWltZS54c2Qsc29hcC1lbmMueHNkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb2RlZ2VuIGRhdGEgYmluZGluZyBmcmFtZXdvcmtzIGFuZCB0aGVpciByZWxhdGVkIGluZm9ybWF0aW9uCi0jIFRoZSBuYW1lcyBvZiB0aGUgY29kZWdlbmVyYXRpb24gZnJhbWV3b3JrcyBpbiBsZXhpY2FsIG9yZGVyCi0jIHRoZXNlIGFyZSB0aGUgbmFtZXMgdGhhdCBzaG91bGQgYmUgcGFzc2VkIG9udG8gdGhlIHRvb2wgYXMgYXJndW1lbnRzIGFzIHdlbGwKLWNvZGVnZW4uZGF0YWJpbmRpbmcuZnJhbWV3b3Jrcz1hZGIseG1sYmVhbnMsamlieCxqYXhicmksbm9uZQotIyB0aGlzIHByb3BlcnR5IGtlZXBzIHRoZSBuYW1lcyBvZiB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrcyB3aGljaCBzdXBwb3J0Ci0jIHVud3JhcHBpbmcgCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLnVud3JhcC5zdXBwb3J0ZWQ9YWRiLHhtbGJlYW5zLGppYngsamF4YnJpCi0jIHRoaXMgcHJvcGVydHkga2VlcHMgdGhlIG5hbWVzIG9mIHRoZSBkYXRhYmluZGluZyBmcmFtZXdvcmtzIHRoYXQgaGFuZGxlIHVud3JhcHBpbmcKLSMgZGlyZWN0bHkgKHJhdGhlciB0aGFuIGJ5IHVzaW5nIHRoZSB1bndyYXBwZXIgZXh0ZW5zaW9uKQotY29kZWdlbi5kYXRhYmluZGluZy51bndyYXAuZGlyZWN0PWppYngKLSMgdGhlIHJlbGF0ZWQgZXh0ZW5zaW9ucyBmb3IgdGhlIHNwZWNpZmllZCBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrcyBhYm92ZQotIyBOb3RlIC0gIHRoZXNlIGFyZSBpbiB0aGUgbGV4aWNhbCBvcmRlciBvZiB0aGUgZnJhbWV3b3JrIG5hbWVzLiBUaGVyZSBpcyBhbiBpbXBsaWNpdCBhc3N1bXB0aW9uCi0jIHRoYXQgYSBnaXZlbiBkYXRhYmluZGluZyBmcmFtZXdvcmsgd2lsbCBiZSBwcm9jZXNzZWQgb25seSBieSBvbmUgZXh0ZW5zaW9uCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLmV4dGVuc2lvbnM9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlNpbXBsZURCRXh0ZW5zaW9uLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5YTUxCZWFuc0V4dGVuc2lvbixvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSmlCWEV4dGVuc2lvbixvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uSkFYQlJJRXh0ZW5zaW9uLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5EZWZhdWx0RGF0YWJpbmRpbmdFeHRlbnNpb24KLSMgdGhlIGRlZmF1bHQgZGF0YSBiaW5kaW5nIGZyYW1ld29yayBuYW1lCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLmZyYW1ld29ya3MuZGVmYXVsdD1hZGIKLSMgdGhlIGRhdGFiaW5kaW5nIHRlbXBsYXRlcyAtCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLmFkYi5zdXBwb3J0ZXIudGVtcGxhdGU9L29yZy9hcGFjaGUvYXhpczIvc2NoZW1hL3RlbXBsYXRlL0FEQkRhdGFiaW5kaW5nVGVtcGxhdGUueHNsCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLnhtbGJlYW5zLnN1cHBvcnRlci50ZW1wbGF0ZT0vb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy90ZW1wbGF0ZS9YbWxiZWFuc0RhdGFiaW5kaW5nVGVtcGxhdGUueHNsCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLmppYnguc3VwcG9ydGVyLnRlbXBsYXRlPS9vcmcvYXBhY2hlL2F4aXMyL2ppYngvdGVtcGxhdGUvSmliWERhdGFiaW5kaW5nVGVtcGxhdGUueHNsCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLmpheGJyaS5zdXBwb3J0ZXIudGVtcGxhdGU9L29yZy9hcGFjaGUvYXhpczIvamF4YnJpL3RlbXBsYXRlL0pheGJSSURhdGFiaW5kaW5nVGVtcGxhdGUueHNsCi1jb2RlZ2VuLmRhdGFiaW5kaW5nLm5vbmUuc3VwcG9ydGVyLnRlbXBsYXRlPS9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ob25lRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKLQotY29kZWdlbi5kYXRhYmluZGluZy50ZXN0b2JqZWN0LnRlbXBsYXRlPS9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0T2JqZWN0Q3JlYXRpb25UZW1wbGF0ZS54c2wKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIExhbmd1YWdlIHR5cGVzIC0gdGhlc2UgYXJlIHRoZSBsYW5ndWFnZSB0eXBlcyB0aGF0IHRoZSBjb2RlIGdlbmVyYXRvciB1bmRlcnN0YW5kcy4gQWdhaW4gdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSMgbGFuZ3VhZ2UgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGZyb20gdGhlIHRvb2wgYXMgd2VsbAotIwotY29kZWdlbi5sYW5ndWFnZXM9amF2YSxjLGpheC13cwotIyBFbWl0dGVyIGNsYXNzIGlzIHRoZSAgbWFqb3IgY29kZSBnZW5lcmF0b3IgY2xhc3MgdGhhdCBzaG91bGQgYmUgY2hhbmdlZCBhY2NvcmRpbmcgdG8gdGhlIGxhbmd1YWdlLgotIyBUaGUgZW1paXRlcnMgbmVlZCB0byBpbXBsZW1lbnQgdGhlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuRW1pdHRlciBpbnRlcmZhY2UKLSMgTm90ZSAtIFRoZSBlbWl0dGVycyBzaG91bGQgYXBwZWFyIGluIHRoZSBsZXhpY2FsIG9yZGVyIG9mIHRoZSBsYW5ndWFnZXMuIFNvIHRoZSBsYW5ndWFnZSBqYXZhIGluIHRoZSBhYm92ZQotIyBsaXN0IGNvcnJlc3BvbmRzIHRvIHRoZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLkphdmFFbWl0dGVyCi1jb2RlZ2VuLmVtaXR0ZXJzPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyLG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuQ0VtaXR0ZXIsb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5qYXh3cy5KQVhXUzIwRW1pdHRlcgotIyBEZWZhdWx0IGxhbmd1YWdlLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIHRoYXQgd291bGQgYmUgcGlja2VkIHdoZW4gbm8gbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkLiBpdCBzaG91bGQgYmUKLSMgb25lIG9mIHRoZSBsYW5ndWFnZXMgc3BlY2lmaWVkIGFib3ZlCi1jb2RlZ2VuLmxhbmd1YWdlcy5kZWZhdWx0PWphdmEKLSMgRGVmYXVsdCBzb3VyY2UgZm9sZGVyIG5hbWUKLWNvZGVnZW4uZ2VuZXJhbC5zcmMubmFtZT1zcmMKLSMgRGVmYXVsdCByZXNvdXJjZSBmb2xkZXIgbmFtZQotY29kZWdlbi5nZW5lcmFsLnJlc291cmNlLm5hbWU9cmVzb3VyY2VzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgTGFuZ3VhZ2Ugc3BlY2lmaWMgc2VjdGlvbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBsYW5ndWFnZSBzcGVjaWZpYyBzZWN0aW9uIGhhcyBhIHNwZWNpYWwgY3VzdG9tIHN0eWxlLiBUaGUgbGFuZ3VhZ2UgbmFtZSBjb21lcyBmaXJzdCBhbmQgc2VwYXJhdGVkIGZyb20gdGhlIHBlcmlvZAotIyBhIHVuaXF1ZSBuYW1lLiBUaGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gYSBoYXNobWFwIHRoYXQgaXMgd2lsbCBiZSBzdG9yZWQgaW4gYW5vdGhlciBoYXNoIG1hcCB3aXRoIHRoZQotIyBsYW5ndWFnZSBhcyB0aGUga2V5Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSmF2YSBzZWN0aW9uICAtIFRlbXBsYXRlcy4KLSMgVGhlIGZvcm1hdCBvZiB0aGUgdGVtcGxhdGVzIGlzIDx3cml0ZXItY2xhc3MtbmFtZT4sPHRlbXBsYXRlLW5hbWU+Ci0jIE5vdGUgdGhpcyBzZWN0aW9uIGlzIHNwZWNpZmljIHRvIHRoZSBlbWl0dGVyIGxvZ2ljLiBPbmUgY2FuIGhhdmUgYW55dGhpbmcgaGVyZSEKLWphdmEuaW50ZXJmYWNlLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5JbnRlcmZhY2VXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0ludGVyZmFjZVRlbXBsYXRlLnhzbAotamF2YS5pbnRlcmZhY2UuaW1wbC50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0ludGVyZmFjZUltcGxlbWVudGF0aW9uVGVtcGxhdGUueHNsCi1qYXZhLmJlYW4udGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkJlYW5Xcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0JlYW5UZW1wbGF0ZS54c2wKLWphdmEuY2FsbGJhY2sudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNhbGxiYWNrSGFuZGxlcldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvQ2FsbGJhY2tIYW5kbGVyVGVtcGxhdGUueHNsCi1qYXZhLmV4Y2VwdGlvbi50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuRXhjZXB0aW9uV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9FeGNlcHRpb25UZW1wbGF0ZS54c2wKLWphdmEuc2tlbGV0b24udGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNrZWxldG9uV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ta2VsZXRvblRlbXBsYXRlLnhzbAotamF2YS5za2VsZXRvbi5pbnRlcmZhY2UudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNrZWxldG9uSW50ZXJmYWNlV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ta2VsZXRvbkludGVyZmFjZVRlbXBsYXRlLnhzbAotamF2YS50ZXN0Y2xhc3MudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlRlc3RDbGFzc1dyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvVGVzdENsYXNzVGVtcGxhdGUueHNsCi1qYXZhLnNlcnZpY2UudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNlcnZpY2VYTUxXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKLWphdmEubWVzc2FnZS5yZWNlaXZlci50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuTWVzc2FnZVJlY2VpdmVyV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9NZXNzYWdlUmVjZWl2ZXJUZW1wbGF0ZS54c2wKLSMKLWphdmEuYW50YnVpbGQueG1sYmVhbnMudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkFudEJ1aWxkV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC94bWxiZWFuc0FudEJ1aWxkVGVtcGxhdGUueHNsCi1qYXZhLmFudGJ1aWxkLmppYngudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkFudEJ1aWxkV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qaWJ4QW50QnVpbGRUZW1wbGF0ZS54c2wKLWphdmEuYW50YnVpbGQuamF4YnJpLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5BbnRCdWlsZFdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamF4YnJpQW50QnVpbGRUZW1wbGF0ZS54c2wKLWphdmEuYW50YnVpbGQuYWRiLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5BbnRCdWlsZFdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvYWRiQW50QnVpbGRUZW1wbGF0ZS54c2wKLWphdmEuYW50YnVpbGQubm9uZS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQW50QnVpbGRXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2RlZmF1bHRBbnRCdWlsZFRlbXBsYXRlLnhzbAotIyBmaWxlIGV4dGVuc2lvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzIGZyb20gdGhpcyBsYW5ndWFnZQotamF2YS5maWxlbmFtZS5leHRlbnNpb249amF2YQotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEMgc2VjdGlvbiAgLSBUZW1wbGF0ZXMuCi0jIFRoZSBmb3JtYXQgb2YgdGhlIHRlbXBsYXRlcyBpcyA8d3JpdGVyLWNsYXNzLW5hbWU+LDx0ZW1wbGF0ZS1uYW1lPgotIyBOb3RlIHRoaXMgc2VjdGlvbiBpcyBzcGVjaWZpYyB0byB0aGUgZW1pdHRlciBsb2dpYy4gT25lIGNhbiBoYXZlIGFueXRoaW5nIGhlcmUhCi0KLWMuaW50ZXJmYWNlLmhlYWRlci50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1N0dWJIZWFkZXJXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJIZWFkZXJUZW1wbGF0ZS54c2wKLWMuaW50ZXJmYWNlLmltcGwudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNTdHViU291cmNlV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TdHViU291cmNlVGVtcGxhdGUueHNsCi1jLnNrZWxldG9uLmhlYWRlci50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1NrZWxIZWFkZXJXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxIZWFkZXJUZW1wbGF0ZS54c2wKLWMuc2tlbGV0b24uaW1wbC50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1NrZWxTb3VyY2VXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxTb3VyY2VUZW1wbGF0ZS54c2wKLWMuc3ZjX3NrZWxldG9uLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU3ZjU2tlbGV0b25Xcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NlcnZpY2VTa2VsZXRvbi54c2wKLWMuc2VydmljZS50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1NlcnZpY2VYTUxXcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKLWMuYnVpbGQudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNCdWlsZFNjcmlwdFdyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvQnVpbGRTY3JpcHRUZW1wbGF0ZS54c2wKLSMgZmlsZSBleHRlbnNpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgZnJvbSB0aGlzIGxhbmd1YWdlCi1jLmZpbGVuYW1lLmV4dGVuc2lvbj1jCi0KLWpheC13cy5leGNlcHRpb24udGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkV4Y2VwdGlvbldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NFeGNlcHRpb25UZW1wbGF0ZS54c2wKLWpheC13cy5pbnRlcmZhY2UuaW1wbC50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIsL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbFRlbXBsYXRlLnhzbAotamF4LXdzLnNrZWxldG9uLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5Ta2VsZXRvbldyaXRlciwvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlQ2xhc3NUZW1wbGF0ZS54c2wKLWpheC13cy5za2VsZXRvbi5pbnRlcmZhY2UudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNrZWxldG9uSW50ZXJmYWNlV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVRlbXBsYXRlLnhzbAotamF4LXdzLnRlc3RjbGFzcy50ZW1wbGF0ZT1vcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuVGVzdENsYXNzV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0Q2xhc3NUZW1wbGF0ZS54c2wKLWpheC13cy5zZXJ2aWNlLnRlbXBsYXRlPW9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5TZXJ2aWNlWE1MV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKLWpheC13cy5hbnRidWlsZC5qYXhicmkudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkFudEJ1aWxkV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qYXhicmlBbnRCdWlsZFRlbXBsYXRlLnhzbAotamF4LXdzLmFudGJ1aWxkLm5vbmUudGVtcGxhdGU9b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkFudEJ1aWxkV3JpdGVyLC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9kZWZhdWx0QW50QnVpbGRUZW1wbGF0ZS54c2wKLSMgZmlsZSBleHRlbnNpb24gZm9yIGdlbmVyYXRlZCBmaWxlcyBmcm9tIHRoaXMgbGFuZ3VhZ2UKLWpheC13cy5maWxlbmFtZS5leHRlbnNpb249amF2YQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0F4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9BeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNzMwMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0F4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmdNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyMERlZmF1bHRWYWx1ZUhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5IVFRQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLlNPQVBNb2R1bGVNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQW50QnVpbGRXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNhbGxiYWNrSGFuZGxlcldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuRXhjZXB0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5GaWxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5JbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuSW50ZXJmYWNlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5NZXNzYWdlUmVjZWl2ZXJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNjaGVtYVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2VydmljZVhNTFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25JbnRlcmZhY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNrZWxldG9uV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5UZXN0Q2xhc3NXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLldTREwxMVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuV1NETDIwV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLlR5cGVUZXN0ZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLlhTTFRJbmNsdWRlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlciBpbXBsZW1lbnRzIEVtaXR0ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYID0gIkNhbGxiYWNrSGFuZGxlciI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVQl9TVUZGSVggPSAiU3R1YiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TVUZGSVggPSAiVGVzdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tFTEVUT05fQ0xBU1NfU1VGRklYID0gIlNrZWxldG9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0VMRVRPTl9DTEFTU19TVUZGSVhfQkFDSyA9ICJJbXBsIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYID0gIlNrZWxldG9uSW50ZXJmYWNlIjsKLSAgICAvLyBrZWVwIGEgc2VwZXJhdGUgdmFyaWFibGUgZm9yICBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0sgYWx0aG91Z2ggaXQgaXMKLSAgICAvLyAiIiB0byBhY2NvbWFkYXRlIGFueSBmdXR1cmUgY2hhbmdlcyBlYXNpbHkuCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tFTEVUT05fSU5URVJGQUNFX1NVRkZJWF9CQUNLID0gIiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVQl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0sgPSAiU3R1YiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9SRUNFSVZFUl9TVUZGSVggPSAiTWVzc2FnZVJlY2VpdmVyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQklORElOR19TVVBQT1JURVJfTkFNRV9TVUZGSVggPSAiRGF0YWJpbmRpbmdTdXBwb3J0ZXIiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNYXAgbWVwVG9DbGFzc01hcDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE1hcCBtZXBUb1N1ZmZpeE1hcDsKLQotICAgIHByb3RlY3RlZCBBeGlzQmluZGluZyBheGlzQmluZGluZzsKLSAgICBwcm90ZWN0ZWQgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludDsKLQotICAgIHByb3RlY3RlZCBpbnQgdW5pcXVlRmF1bHROYW1lQ291bnRlciA9IDA7Ci0gICAgLyoqCi0gICAgICogRmllbGQgY29uc3RydWN0b3JNYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEhhc2hNYXAgY29uc3RydWN0b3JNYXAgPSBuZXcgSGFzaE1hcCg1MCk7Ci0KLSAgICAvL34tLS0gc3RhdGljIGluaXRpYWxpemVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHN0YXRpYyB7Ci0KLSAgICAgICAgLy8gVHlwZSBtYXBzIHRvIGEgdmFsaWQgaW5pdGlhbGl6YXRpb24gdmFsdWUgZm9yIHRoYXQgdHlwZQotICAgICAgICAvLyBUeXBlIHZhciA9IG5ldyBUeXBlKGFyZykKLSAgICAgICAgLy8gV2hlcmUgIlR5cGUiIGlzIHRoZSBrZXkgYW5kICJuZXcgVHlwZShhcmcpIiBpcyB0aGUgc3RyaW5nIHN0b3JlZAotICAgICAgICAvLyBVc2VkIGluIGVtaXR0aW5nIHRlc3QgY2FzZXMgYW5kIHNlcnZlciBza2VsZXRvbnMuCi0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiaW50IiwgIjAiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJmbG9hdCIsICIwIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiYm9vbGVhbiIsICJ0cnVlIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiZG91YmxlIiwgIjAiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJieXRlIiwgIihieXRlKTAiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJzaG9ydCIsICIoc2hvcnQpMCIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImxvbmciLCAiMCIpOwotICAgICAgICBjb25zdHJ1Y3Rvck1hcC5wdXQoImphdmEubGFuZy5Cb29sZWFuIiwgIm5ldyBqYXZhLmxhbmcuQm9vbGVhbihmYWxzZSkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuQnl0ZSIsICJuZXcgamF2YS5sYW5nLkJ5dGUoKGJ5dGUpMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuRG91YmxlIiwgIm5ldyBqYXZhLmxhbmcuRG91YmxlKDApIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiamF2YS5sYW5nLkZsb2F0IiwgIm5ldyBqYXZhLmxhbmcuRmxvYXQoMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuSW50ZWdlciIsICJuZXcgamF2YS5sYW5nLkludGVnZXIoMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuTG9uZyIsICJuZXcgamF2YS5sYW5nLkxvbmcoMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLmxhbmcuU2hvcnQiLCAibmV3IGphdmEubGFuZy5TaG9ydCgoc2hvcnQpMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLm1hdGguQmlnRGVjaW1hbCIsICJuZXcgamF2YS5tYXRoLkJpZ0RlY2ltYWwoMCkiKTsKLSAgICAgICAgY29uc3RydWN0b3JNYXAucHV0KCJqYXZhLm1hdGguQmlnSW50ZWdlciIsICJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIwXCIpIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiamF2YS5sYW5nLk9iamVjdCIsICJuZXcgamF2YS5sYW5nLlN0cmluZygpIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiYnl0ZVtdIiwgIm5ldyBieXRlWzBdIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiamF2YS51dGlsLkNhbGVuZGFyIiwgImphdmEudXRpbC5DYWxlbmRhci5nZXRJbnN0YW5jZSgpIik7Ci0gICAgICAgIGNvbnN0cnVjdG9yTWFwLnB1dCgiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIsCi0gICAgICAgICAgICAgICAgIm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKFwiaHR0cDovL2Zvb1wiLCBcImJhclwiKSIpOwotCi0gICAgICAgIC8vcG9wdWxhdGUgdGhlIE1FUCAtPiBjbGFzcyBtYXAKLSAgICAgICAgbWVwVG9DbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG1lcFRvQ2xhc3NNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlciIpOwotICAgICAgICBtZXBUb0NsYXNzTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlciIpOwotICAgICAgICBtZXBUb0NsYXNzTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciIpOwotCi0gICAgICAgIC8vcG9wdWxhdGUgdGhlIE1FUCAtPiBzdWZmaXggbWFwCi0gICAgICAgIG1lcFRvU3VmZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbWVwVG9TdWZmaXhNYXAucHV0KFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJJbk9ubHkiKTsKLSAgICAgICAgbWVwVG9TdWZmaXhNYXAucHV0KFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIkluT25seSIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotICAgICAgICAgICAgICAgIE1FU1NBR0VfUkVDRUlWRVJfU1VGRklYICsgIkluT25seSIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJSb2J1c3RJbk9ubHkiKTsKLSAgICAgICAgbWVwVG9TdWZmaXhNYXAucHV0KFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJSb2J1c3RJbk9ubHkiKTsKLSAgICAgICAgbWVwVG9TdWZmaXhNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0gICAgICAgICAgICAgICAgTUVTU0FHRV9SRUNFSVZFUl9TVUZGSVggKyAiUm9idXN0SW5Pbmx5Iik7Ci0gICAgICAgIG1lcFRvU3VmZml4TWFwLnB1dChXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJJbk91dCIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLSAgICAgICAgICAgICAgICBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWCArICJJbk91dCIpOwotICAgICAgICBtZXBUb1N1ZmZpeE1hcC5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQsCi0gICAgICAgICAgICAgICAgTUVTU0FHRV9SRUNFSVZFUl9TVUZGSVggKyAiSW5PdXQiKTsKLSAgICAgICAgLy9yZWdpc3RlciB0aGUgb3RoZXIgdHlwZXMgYXMgbmVjZXNzYXJ5Ci0gICAgfQotCi0gICAgLy9+LS0tIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyLmNsYXNzKTsKLSAgICBwcm90ZWN0ZWQgVVJJUmVzb2x2ZXIgcmVzb2x2ZXI7Ci0KLSAgICAvLyB0aGlzIGlzIHVzZWQgdG8ga2VlcCB0aGUgY3VycmVudCBzZXJ2aWNlIGluZm9Ib2xkZXIKLSAgICBwcm90ZWN0ZWQgTWFwIGluZm9Ib2xkZXI7Ci0gICAgLy8gdGhpcyBpcyB1c2VkIHRvIGtlZXAgaW5mb0hvbGRlcnMgZm9yIGFsbCBzZXJ2aWNlcwotICAgIHByb3RlY3RlZCBNYXAgYWxsU2VydmljZUluZm9Ib2xkZXI7Ci0KLSAgICBwcm90ZWN0ZWQgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZUdlbkNvbmZpZ3VyYXRpb247Ci0KLSAgICBwcm90ZWN0ZWQgVHlwZU1hcHBlciBtYXBwZXI7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBheGlzU2VydmljZXM7Ci0KLSAgICAvL2EgbWFwIHRvIGtlZXAgdGhlIGZhdWx0IGNsYXNzTmFtZXMKLSAgICBwcm90ZWN0ZWQgTWFwIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgZmF1bHRDbGFzc05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCBNYXAgZmF1bHRFbGVtZW50UU5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJvdGVjdGVkIE1hcCBpbnN0YW50aWF0YWJsZU1lc3NhZ2VDbGFzc05hbWVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1JDX0RJUl9OQU1FID0gInRlc3QiOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlSG9sZGVyQ2xhc3NfamF4d3MgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB3cmFwcGVkX2pheHdzID0gZmFsc2U7Ci0KLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgY29uc3RydWN0b3IgLSBidWlsZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VCYXNlZE11bHRpTGFuZ3VhZ2VFbWl0dGVyKCkgewotICAgICAgICBpbmZvSG9sZGVyID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYWxsU2VydmljZUluZm9Ib2xkZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHJlbGV2YW50IGNvZGVnZW4gY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAc2VlIEVtaXR0ZXIjc2V0Q29kZUdlbkNvbmZpZ3VyYXRpb24ob3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29kZUdlbkNvbmZpZ3VyYXRpb24oQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZXMgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHRoaXMuYXhpc0VuZHBvaW50ID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnQoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpOwotICAgICAgICB0aGlzLmF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLSAgICAgICAgcmVzb2x2ZXIgPSBuZXcgWFNMVEluY2x1ZGVSZXNvbHZlcihjb2RlR2VuQ29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdHlwZSBtYXBwZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBtYXBwZXIKLSAgICAgKiBAc2VlIEVtaXR0ZXIjc2V0TWFwcGVyKG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlcihUeXBlTWFwcGVyIG1hcHBlcikgewotICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oU3RyaW5nIG5hbWUsIFFOYW1lIHFOYW1lKSB7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBjb3JyZWN0IEF4aXNCaW5kaW5nT3BlcmF0aW9uIGNvcmVzcG9uZGluZyB0byB0aGUgQXhpc09wZXJhdGlvbgotICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmcuZ2V0Q2hpbGQocU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbnVsbDsKLQotICAgICAgICBpZiAoYXhpc0JpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydHkgPSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgocHJvcGVydHkgPT0gbnVsbCkgJiYgKGF4aXNCaW5kaW5nICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IGF4aXNCaW5kaW5nLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wZXJ0eTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUG9saWN5IGdldEJpbmRpbmdQb2xpY3lGcm9tTWVzc2FnZShBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5KSB7Ci0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2UgPSBudWxsOwotCi0gICAgICAgIGlmIChheGlzQmluZGluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldENoaWxkKGtleSk7Ci0gICAgICAgICAgICBpZiAoYXhpc0JpbmRpbmdNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXhpc0JpbmRpbmdNZXNzYWdlLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2UoU3RyaW5nIG5hbWUsIFFOYW1lIHFOYW1lLCBTdHJpbmcga2V5KSB7Ci0KLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbnVsbDsKLSAgICAgICAgLy8gR2V0IHRoZSBjb3JyZWN0IEF4aXNCaW5kaW5nT3BlcmF0aW9uIGNvcmVzcG9uZGluZyB0byB0aGUgQXhpc09wZXJhdGlvbgotICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmcuZ2V0Q2hpbGQocU5hbWUpOwotCi0gICAgICAgIH0KLQotICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldENoaWxkKGtleSk7Ci0gICAgICAgICAgICBpZiAoYXhpc0JpbmRpbmdNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGF4aXNCaW5kaW5nTWVzc2FnZS5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoKHByb3BlcnR5ID09IG51bGwpICYmIChheGlzQmluZGluZyAhPSBudWxsKSkgewotICAgICAgICAgICAgcHJvcGVydHkgPSBheGlzQmluZGluZy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IFdTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5nZXREZWZhdWx0VmFsdWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZUZhdWx0KFN0cmluZyBuYW1lLCBRTmFtZSBxTmFtZSwgU3RyaW5nIGtleSkgewotCi0gICAgICAgIE9iamVjdCBwcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgIC8vIEdldCB0aGUgY29ycmVjdCBBeGlzQmluZGluZ09wZXJhdGlvbiBjb3Jlc3BvbmRpbmcgdG8gdGhlIEF4aXNPcGVyYXRpb24KLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmcuZ2V0Q2hpbGQocU5hbWUpOwotCi0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2VGYXVsdCA9IG51bGw7Ci0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0ZhdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0ID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0RmF1bHQoa2V5KTsKLQotICAgICAgICAgICAgaWYgKGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eSA9IGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0LmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQgPSBheGlzQmluZGluZy5nZXRGYXVsdChrZXkpOwotICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gYXhpc0JpbmRpbmdGYXVsdC5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IFdTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5nZXREZWZhdWx0VmFsdWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgbWFwcGVyIGZvciB0aGUgc3R1YgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBlckZvclN0dWIoKSB7Ci0gICAgICAgIHVwZGF0ZU1hcHBlckNsYXNzbmFtZXMoZ2V0RnVsbHlRdWFsaWZpZWRTdHViTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgU3R1YiBuYW1lIHJldXNlZCBpbiBtYW55IG1ldGhvZHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gY2xhc3NuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFN0dWJOYW1lKCkgewotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgbG9jYWxQYXJ0ID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9jYWxQYXJ0ID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBsb2NhbFBhcnQgKyBTVFVCX1NVRkZJWDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXN0cyB0aGUgZmF1bHQgbmFtZSBtYXBzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRGYXVsdE5hbWVzKCkgewotICAgICAgICBmdWxseVF1YWxpZmllZEZhdWx0Q2xhc3NOYW1lTWFwLmNsZWFyKCk7Ci0gICAgICAgIGZhdWx0Q2xhc3NOYW1lTWFwLmNsZWFyKCk7Ci0gICAgICAgIGZhdWx0RWxlbWVudFFOYW1lTWFwLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGUgYSBtYXAgb2YgZmF1bHQgY2xhc3MgbmFtZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUFuZFBvcHVsYXRlRmF1bHROYW1lcygpIHsKLSAgICAgICAgLy9sb29wIHRocm91Z2ggYW5kIGZpbmQgdGhlIGZhdWx0cwotICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlOwotICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBmYXVsdE1lc3NhZ2VzID0gb3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRNZXNzYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgZmF1bHRNZXNzYWdlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgLy9tYWtlIGEgdW5pcXVlIG5hbWUgYW5kIHB1dCB0aGF0IGluIHRoZSBoYXNobWFwCi0gICAgICAgICAgICAgICAgaWYgKCFmdWxseVF1YWxpZmllZEZhdWx0Q2xhc3NOYW1lTWFwLgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNLZXkoZmF1bHRNZXNzYWdlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9tYWtlIGEgbmFtZQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoZmF1bHRNZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0UU5hbWUgPSBuZXcgUU5hbWUoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGZhdWx0TWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXBwZXIuZ2V0UU5hbWVUb01hcHBpbmdPYmplY3QoZmF1bHRRTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoY2xhc3NOYW1lICsgIkV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChmdWxseVF1YWxpZmllZEZhdWx0Q2xhc3NOYW1lTWFwLmNvbnRhaW5zVmFsdWUoY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoY2xhc3NOYW1lICsgKHVuaXF1ZUZhdWx0TmFtZUNvdW50ZXIrKykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRGYXVsdENsYXNzTmFtZU1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAvL3dlJ3ZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGZhdWx0IGJhc2UgbmFtZXMgc2VwZXJhdGVseQotICAgICAgICAgICAgICAgICAgICBmYXVsdENsYXNzTmFtZU1hcC5wdXQoZmF1bHRNZXNzYWdlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudFFOYW1lTWFwLnB1dChmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVtaXRzIHRoZSBzdHViY29kZSB3aXRoIGJpbmRpbmdzLgotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqIEBzZWUgRW1pdHRlciNlbWl0U3R1YigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW1pdFN0dWIoKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvL2ZpcnN0IGtlZXAgYSBzZXBlcmF0ZSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBtYXAgdG8gdXNlIGluCi0gICAgICAgICAgICAvLyBldmVyeSBpdGVyYXRpb24KLSAgICAgICAgICAgIC8vIGZvciBldmVyeSBpdGVyYXRpb24gIHFOYW1lMk5hbWVNYXAgaXMgY2hhbmdlZCBpbiB1cGRhdGVNYXBwZXJGb3JTdHViCi0gICAgICAgICAgICAvLyBtZXRob2QgaWYgaW4gdGhlIHBhY2tpbmcgbW9kZQotICAgICAgICAgICAgTWFwIG9yaWdpbmFsVHlwZU1hcCA9IGdldE5ld0NvcHkobWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCkpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGF4aXNTZXJ2aWNlc0l0ZXIgPSB0aGlzLmF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBheGlzU2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBheGlzU2VydmljZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGVhY2ggYmluaW5kaW5nCi0gICAgICAgICAgICAgICAgLy9mb3IgdGhlIG1vbWVudCBsZXRzIGdlbnJhdGUgdGhlIHN0dWIgbmFtZSB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYW5kIGVuZCBwb2ludCBuYW1lCi0gICAgICAgICAgICAgICAgdGhpcy5heGlzQmluZGluZyA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50KGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKS5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgY2FsbCBiYWNrIGhhbmRsZXJzCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlQ2FsbEJhY2tIYW5kbGVycygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1hcCBlbmRwb2ludHMgPSB0aGlzLmF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZW5kUG9pbnRzSXRlciA9IGVuZHBvaW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgZW5kUG9pbnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZW5kIHBvaW50IGRldGFpbHMuCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpc0VuZHBvaW50ID0gKEF4aXNFbmRwb2ludCkgZW5kUG9pbnRzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpc0JpbmRpbmcgPSB0aGlzLmF4aXNFbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEVuZHBvaW50TmFtZSh0aGlzLmF4aXNFbmRwb2ludC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRCaW5kaW5nTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF4aXNFbmRwb2ludC5nZXRCaW5kaW5nKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGNvbW1lbnQgYXQgdXBkYXRlTWFwcGVyQ2xhc3NuYW1lcyBmb3IgZGV0YWlscyBhbmQgcmVhc29ucyBmb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGluZyB0aGlzIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbWFwIHRvIG9yaWdpbmFsIG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgY29weU1hcChvcmlnaW5hbFR5cGVNYXAsIG1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hcHBlckZvclN0dWIoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlUb0ZhdWx0TWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvL2dlbmVyYXRlIGFuZCBwb3B1bGF0ZSB0aGUgZmF1bHQgbmFtZXMgYmVmb3JlIGhhbmQuIFdlIG5lZWQgdGhhdCBmb3IKLSAgICAgICAgICAgICAgICAgICAgLy90aGUgc21vb3RoIG9wcmF0aW9uIG9mIHRoZSB0aGluZwotICAgICAgICAgICAgICAgICAgICAvL2ZpcnN0IHJlc2V0IHRoZSBmYXVsdCBuYW1lcyBhbmQgcmVjcmVhdGUgaXQKLSAgICAgICAgICAgICAgICAgICAgcmVzZXRGYXVsdE5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlQW5kUG9wdWxhdGVGYXVsdE5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZhdWx0UGFja2FnZUZvclN0dWIoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgaW50ZWZhY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gZmVlZCB0aGUgYmluZGluZyBpbmZvcm1hdGlvbiBhbHNvCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyBub3QgY3JlYXRlIHRoaXMgaW50ZXJmYWNlIGlmIHRoZSB1c2VyIHN3aXRjaGVkIG9uIHRoZSB3cmFwIGNsYXNzZXMgbW9kZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGludGVyZmFjZSBhbHNvIGRlcGVuZHMgb24gdGhlIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW50ZXJmYWNlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBjYWxsIGJhY2sgaGFuZGxlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ2FsbEJhY2tIYW5kbGVycygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIEV4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVFeGNlcHRpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9ucwotICAgICAgICAgICAgICAgICAgICB3cml0ZUludGVyZmFjZUltcGxlbWVudGF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHRlc3QgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICB3cml0ZVRlc3RDbGFzc2VzKCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2F2ZSBiYWNrIHR5cGUgbWFwCi0gICAgICAgICAgICBpZiAodGhpcy5tYXBwZXIuaXNPYmplY3RNYXBwaW5nUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAgICAgY29weU1hcChvcmlnaW5hbFR5cGVNYXAsIHRoaXMubWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzU2tpcEJ1aWxkWE1MKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3cml0ZSBhbiBhbnQgYnVpbGQgZmlsZQotICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBhbnQgYnVpbGQgaXMgZ2VuZXJhdGVkIG9ubHkgb25jZQotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGF0IGhhcyB0byBoYXBwZW4gaGVyZSBvbmx5IGlmIHRoZQotICAgICAgICAgICAgICAgIC8vIGNsaWVudCBzaWRlIGNvZGUgaXMgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzR2VuZXJhdGVBbGwoKSkgewotICAgICAgICAgICAgICAgICAgICAvL291ciBsb2dpYyBmb3IgdGhlIGJ1aWxkIHhtbCBpcyB0aGF0IGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgLy9vbmx5IGJlIHdyaXR0ZW4gd2hlbiBub3QgZmxhdHRlbmVkCi0gICAgICAgICAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBbnRCdWlsZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgdGhyb3cgY2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldE5ld0NvcHkoTWFwIGNvcHlGb3JtTWFwKSB7Ci0gICAgICAgIE1hcCBjb3B5VG9NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBPYmplY3Qga2V5OwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5Rm9ybU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgY29weVRvTWFwLnB1dChrZXksIGNvcHlGb3JtTWFwLmdldChrZXkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29weVRvTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlNYXAoTWFwIGNvcHlGb3JtTWFwLCBNYXAgY29weVRvTWFwKSB7Ci0gICAgICAgIE9iamVjdCBrZXk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGNvcHlGb3JtTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAga2V5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBjb3B5VG9NYXAucHV0KGtleSwgY29weUZvcm1NYXAuZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIEFudCBidWlsZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBbnRCdWlsZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFdyaXRlIHRoZSBzZXJ2aWNlIHhtbCBpbiBhIGZvbGRlciB3aXRoIHRoZQotICAgICAgICBEb2N1bWVudCBza2VsZXRvbk1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JBbnRCdWlsZCgpOwotICAgICAgICBkZWJ1Z0xvZ0RvY3VtZW50KCJEb2N1bWVudCBmb3IgYW50IGJ1aWxkOiIsIHNrZWxldG9uTW9kZWwpOwotICAgICAgICBBbnRCdWlsZFdyaXRlciBhbnRCdWlsZFdyaXRlciA9IG5ldyBBbnRCdWlsZFdyaXRlcihjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIGFudEJ1aWxkV3JpdGVyLnNldERhdGFiaW5kaW5nRnJhbWV3b3JrKGNvZGVHZW5Db25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgYW50QnVpbGRXcml0ZXIuc2V0T3ZlcnJpZGUoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZSgpKTsKLSAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIGFudEJ1aWxkV3JpdGVyKTsKLSAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uYWRkWG1sRmlsZU5hbWUoYW50QnVpbGRXcml0ZXIuZ2V0T3V0cHV0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsvLyROT04tU0VDLTMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBET00gdHJlZSBmb3IgdGhlIEFudCBidWlsZC4gVXNlcyB0aGUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvckFudEJ1aWxkKCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYW50Iik7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZ1tdIGRvdFNlcGFyYXRlZFZhbHVlcyA9IHBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGRvdFNlcGFyYXRlZFZhbHVlc1swXSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHNlcnZpY2VOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzZXJ2aWNlbmFtZSIsIHNlcnZpY2VOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzcmMiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJyZXNvdXJjZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFJlc291cmNlTG9jYXRpb24oKSwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKS5zaXplKCkgPiAxKXsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJhcnRpZmFjdG5hbWUiLCAiU2VydmljZXMiLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiYXJ0aWZhY3RuYW1lIiwgdGhpcy5heGlzU2VydmljZS5nZXROYW1lKCkgLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzV3JpdGVUZXN0Q2FzZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidGVzdE9taXQiLCAidHJ1ZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywKLSAgICAgICAgICAgICAgICAgICAgImlzc2VydmVyc2lkZSIsCi0gICAgICAgICAgICAgICAgICAgICJ5ZXMiLAotICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZSB0aGUgdGVzdCBjbGFzc2VzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVUZXN0Q2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNXcml0ZVRlc3RDYXNlKCkpIHsKLSAgICAgICAgICAgIERvY3VtZW50IGNsYXNzTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvclRlc3RDYXNlKCk7Ci0gICAgICAgICAgICBkZWJ1Z0xvZ0RvY3VtZW50KCJEb2N1bWVudCBmb3IgdGVzdCBjYXNlOiIsIGNsYXNzTW9kZWwpOwotICAgICAgICAgICAgVGVzdENsYXNzV3JpdGVyIGNhbGxiYWNrV3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RDbGFzc1dyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TUkNfRElSX05BTUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotICAgICAgICAgICAgY2FsbGJhY2tXcml0ZXIuc2V0T3ZlcnJpZGUoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZSgpKTsKLSAgICAgICAgICAgIHdyaXRlRmlsZShjbGFzc01vZGVsLCBjYWxsYmFja1dyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBYTUwgTW9kZWwgZm9yIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gRE9NIGRvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yVGVzdENhc2UoKSB7Ci0gICAgICAgIFN0cmluZyBjb3JlQ2xhc3NOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzIik7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgIGlmICh0aGlzLmF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBURVNUX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICsgVEVTVF9TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdG9kbyBpcyB0aGlzIHJpZ2h0ID8/PwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZXNwYWNlIiwgYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImludGVyZmFjZU5hbWUiLCBjb3JlQ2xhc3NOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLCBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICArIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwgY29yZUNsYXNzTmFtZSArIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3R1Ym5hbWUiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXRCaW5kaW5nTmFtZSgpKSArIFNUVUJfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5heGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInN0dWJuYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgU1RVQl9TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInN0dWJuYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgKyBTVFVCX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvL2FkZCBiYWNrd29yZGNvbXBhdGliaWxpdHkgYXR0cmlidXRlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc2JhY2tjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSksCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBkYXRhYmluZCBzdXBwb3J0ZXJzLiBOb3cgdGhlIGRhdGFiaW5kIHN1cHBvcnRlcnMgYXJlIGNvbXBsZXRseSBjb250YWluZWQgaW5zaWRlCi0gICAgICAgIC8vIHRoZSBzdHVicyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90IHZpc2libGUgb3V0c2lkZQotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVET01FbGVtZW50Zm9yRGF0YWJpbmRlcnMoZG9jLCBmYWxzZSkpOwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBpbXBsZW1lbnRhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSW50ZXJmYWNlSW1wbGVtZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3IgdGhlIHBvbGljaWVzIGluIHRoaXMgc2VydmljZSBhbmQgd3JpdGUgdGhlbQotICAgICAgICBEb2N1bWVudCBpbnRlcmZhY2VJbXBsTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvckludGVyZmFjZUltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb246IiwgaW50ZXJmYWNlSW1wbE1vZGVsKTsKLSAgICAgICAgSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIgd3JpdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICB3cml0ZXIuc2V0T3ZlcnJpZGUoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZSgpKTsKLSAgICAgICAgd3JpdGVGaWxlKGludGVyZmFjZUltcGxNb2RlbCwgd3JpdGVyKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgRE9NIHRyZWUgZm9yIGltcGxlbWVudGF0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgc3R1Yk5hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkgKwotICAgICAgICAgICAgICAgIFNUVUJfU1VGRklYOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2xhc3MiKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIHBhY2thZ2VOYW1lLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNlcnZpY2VuYW1lIiwgbG9jYWxQYXJ0LCByb290RWxlbWVudCk7Ci0gICAgICAgIC8vVGhlIHRhcmdldCBuZW1lc3BhY2UgaXMgYWRkZWQgYXMgdGhlIG5hbWVzcGFjZSBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lc3BhY2UiLCBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImludGVyZmFjZU5hbWUiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUVUJfSU5URVJGQUNFX1NVRkZJWF9CQUNLLAotICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEJpbmRpbmdOYW1lKCkpICsgU1RVQl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW50ZXJmYWNlTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc3R1Yk5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImludGVyZmFjZU5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkgKyBTVFVCX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFja0NsYXNzZXMoKSkgewotICAgICAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjYWxsYmFja25hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhbGxiYWNrbmFtZSIsIGxvY2FsUGFydCArIENBTExfQkFDS19IQU5ETEVSX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIC8vYWRkIGJhY2t3b3JkY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGUKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImlzYmFja2NvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSB3cmFwIGNsYXNzZXMgZmxhZwotICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNQYWNrQ2xhc3NlcygpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAid3JhcHBlZCIsICJ5ZXMiLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgU09BUCB2ZXJzaW9uCi0gICAgICAgIGFkZFNvYXBWZXJzaW9uKGRvYywgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vIGFkZCB0aGUgZW5kIHBvaW50Ci0gICAgICAgIGFkZEVuZHBvaW50KGRvYywgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vIHNldCB0aGUgc3luYy9hc3luYyBhdHRyaWJ1dGVzCi0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIC8vIHRoaXMgYmxvY2sgb2YgY29kZSBzcGVjaWZpY2FsbHkgYXBwbGllcyB0byB0aGUgaW50ZWdyYXRpb24gb2YgZGF0YWJpbmRpbmcgY29kZSBpbnRvIHRoZQotICAgICAgICAvLyBnZW5lcmF0ZWQgY2xhc3NlcyB0aWdodGx5IChwcm9iYWJseSBhcyBpbm5lciBjbGFzc2VzKQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIC8vIGNoZWNrIGZvciB0aGUgc3BlY2lhbCBtb2RlbHMgaW4gdGhlIG1hcHBlciBhbmQgaWYgdGhleSBhcmUgcHJlc2VudCBwcm9jZXNzIHRoZW0KLSAgICAgICAgaWYgKG1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLQotICAgICAgICAgICAgLy8gYWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgcm9vdCBlbGVtZW50IHNob3dpbmcgdGhhdCB0aGUgd3JpdGluZyBoYXMgYmVlbiBza2lwcGVkCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tpcC13cml0ZSIsICJ5ZXMiLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG1hcHBlciBvYmplY3RzCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxPYmplY3RzKG1hcHBlci5nZXRBbGxNYXBwZWRPYmplY3RzKCksIHJvb3RFbGVtZW50LCBkb2MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSAgICAgICAgLy8gbG9hZCB0aGUgb3BlcmF0aW9ucwotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvLyBhZGQgdGhlIGRhdGFiaW5kIHN1cHBvcnRlcnMuIE5vdyB0aGUgZGF0YWJpbmQgc3VwcG9ydGVycyBhcmUgY29tcGxldGx5IGNvbnRhaW5lZCBpbnNpZGUKLSAgICAgICAgLy8gdGhlIHN0dWJzIGltcGxlbWVudGF0aW9uIGFuZCBub3QgdmlzaWJsZSBvdXRzaWRlCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGNyZWF0ZURPTUVsZW1lbnRmb3JEYXRhYmluZGVycyhkb2MsIGZhbHNlKSk7Ci0KLSAgICAgICAgT2JqZWN0IG1vZHVsZUNvZGVnZW5Qb2xpY3lFeHRlbnNpb25FbGVtZW50OwotCi0gICAgICAgIC8vaWYgc29tZSBleHRlbnNpb24gaGFzIGFkZGVkIHRoZSBzdHViIG1ldGhvZHMgcHJvcGVydHksIGFkZCB0aGVtIHRvIHRoZQotICAgICAgICAvL21haW4gZG9jdW1lbnQKLSAgICAgICAgaWYgKChtb2R1bGVDb2RlZ2VuUG9saWN5RXh0ZW5zaW9uRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoIm1vZHVsZS1jb2RlZ2VuLXBvbGljeS1leHRlbnNpb25zIikpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKAotICAgICAgICAgICAgICAgICAgICBkb2MuaW1wb3J0Tm9kZSgoRWxlbWVudCkgbW9kdWxlQ29kZWdlblBvbGljeUV4dGVuc2lvbkVsZW1lbnQsIHRydWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vYWRkIGFub3RoZXIgZWxlbWVudCB0byBoYXZlIHRoZSB1bmlxdWUgbGlzdCBvZiBmYXVsdHMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotCi0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdXRpbCBtZXRob2QgdGhhdCByZXR1cm5zIGEgdW5pcXVlIGxpc3Qgb2YgZmF1bHRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiBET00gZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmYXVsdC1saXN0Iik7Ci0gICAgICAgIEVsZW1lbnQgZmF1bHRFbGVtZW50OwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgZmF1bHRFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZhdWx0Iik7Ci0gICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vYXMgZm9yIHRoZSBuYW1lIG9mIGEgZmF1bHQsIHdlIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBmdWxseVF1YWxpZmllZEZhdWx0Q2xhc3NOYW1lTWFwLmdldChrZXkpLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNob3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZhdWx0Q2xhc3NOYW1lTWFwLmdldChrZXkpLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAvL3RoZSB0eXBlIHJlcHJlc2VudHMgdGhlIHR5cGUgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYnkgdGhpcwotICAgICAgICAgICAgLy9uYW1lCi0gICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmcgPQotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUoKFFOYW1lKSBmYXVsdEVsZW1lbnRRTmFtZU1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICh0eXBlTWFwcGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgIDogdHlwZU1hcHBpbmcsIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0cmliVmFsdWUgPSAoU3RyaW5nKSBpbnN0YW50aWF0YWJsZU1lc3NhZ2VDbGFzc05hbWVzLgotICAgICAgICAgICAgICAgICAgICBnZXQoa2V5KTsKLQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImluc3RhbnRpYXRhYmxlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYlZhbHVlID09IG51bGwgPyAiIiA6IGF0dHJpYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMKLSAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAobWFwcGVyLmdldERlZmF1bHRNYXBwaW5nTmFtZSgpLmVxdWFscyh0eXBlTWFwcGluZykpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGVmYXVsdCIsICJ5ZXMiLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgZ2V0UGFyYW1Jbml0aWFsaXplcih0eXBlTWFwcGluZyksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLQotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZmF1bHRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYWRkIHRoZSBxTmFtZXMgb2YgdGhlIG9wZXJhdGlvbiBmYXVsdCBtZXNzYWdlIG5hbWVzIHRvIGZhdWx0TWVzc2FnZXMgTWVwCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uRmF1bHRNZXNzYWdlcwotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VzVG9NZXAKLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEZhdWx0TWVzc2FnZXMoTGlzdCBvcGVyYXRpb25GYXVsdE1lc3NhZ2VzLCBTZXQgZmF1bHRNZXNzYWdlc1RvTWVwKSB7Ci0KLSAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcGVyYXRpb25GYXVsdE1lc3NhZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZmF1bHRNZXNzYWdlID0gKEF4aXNNZXNzYWdlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZXNUb01lcC5hZGQoZmF1bHRNZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdXRpbCBtZXRob2QgdGhhdCByZXR1cm5zIGEgdW5pcXVlIGxpc3Qgb2YgZmF1bHRzIGZvciBhIGdpdmVuIG1lcAotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gRE9NIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRVbmlxdWVMaXN0b2ZGYXVsdHNvZk1lcChEb2N1bWVudCBkb2MsIFN0cmluZyBtZXApIHsKLQotICAgICAgICAvLyAgbGlzdCB0byBrZWVwIGZhdWx0IG1lc3NhZ2UgcW5hbWVzIGZvciB0aGlzIG1lcAotICAgICAgICBTZXQgZmF1bHRMaXN0Rm9yTWVwID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyID0gdGhpcy5heGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLQotICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG1lcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBmYXVsdCBtZXNzYWdlcwotICAgICAgICAgICAgICAgIGFkZEZhdWx0TWVzc2FnZXMoYXhpc09wZXJhdGlvbi5nZXRGYXVsdE1lc3NhZ2VzKCksIGZhdWx0TGlzdEZvck1lcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtZXAuZXF1YWxzKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGZhdWx0IG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIGFkZEZhdWx0TWVzc2FnZXMoYXhpc09wZXJhdGlvbi5nZXRGYXVsdE1lc3NhZ2VzKCksIGZhdWx0TGlzdEZvck1lcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmYXVsdC1saXN0Iik7Ci0gICAgICAgIEVsZW1lbnQgZmF1bHRFbGVtZW50OwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZhdWx0TGlzdEZvck1lcC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmYXVsdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZmF1bHQiKTsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgLy9hcyBmb3IgdGhlIG5hbWUgb2YgYSBmYXVsdCwgd2UgZ2VuZXJhdGUgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuZ2V0KGtleSksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2hvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZmF1bHRDbGFzc05hbWVNYXAuZ2V0KGtleSksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vdGhlIHR5cGUgcmVwcmVzZW50cyB0aGUgdHlwZSB0aGF0IHdpbGwgYmUgd3JhcHBlZCBieSB0aGlzCi0gICAgICAgICAgICAvL25hbWUKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZSgoUU5hbWUpIGZhdWx0RWxlbWVudFFOYW1lTWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZywgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWx1ZSA9IChTdHJpbmcpIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMuCi0gICAgICAgICAgICAgICAgICAgIGdldChrZXkpOwotCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaW5zdGFudGlhdGFibGVUeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmliVmFsdWUgPT0gbnVsbCA/ICIiIDogYXR0cmliVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBleGNlcHRpb25OYW1lID0gKChRTmFtZSkgZmF1bHRFbGVtZW50UU5hbWVNYXAuZ2V0KGtleSkpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2FsbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk5hbWUgPT0gbnVsbCA/ICIiIDogZXhjZXB0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gYWRkIGFuIGV4dHJhIGF0dHJpYnV0ZSB0byBzYXkgd2hldGhlciB0aGUgdHlwZSBtYXBwaW5nIGlzCi0gICAgICAgICAgICAvLyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgaWYgKG1hcHBlci5nZXREZWZhdWx0TWFwcGluZ05hbWUoKS5lcXVhbHModHlwZU1hcHBpbmcpKSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRlZmF1bHQiLCAieWVzIiwgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIGdldFBhcmFtSW5pdGlhbGl6ZXIodHlwZU1hcHBpbmcpLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0KLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGZhdWx0RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGVuZHBvaW50IHRvIHRoZSBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRFbmRwb2ludChEb2N1bWVudCBkb2MsIEVsZW1lbnQgcm9vdEVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEVsZW1lbnQgZW5kcG9pbnRFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImVuZHBvaW50Iik7Ci0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50ID0gdGhpcy5heGlzRW5kcG9pbnQuZ2V0RW5kcG9pbnRVUkwoKTsKLSAgICAgICAgVGV4dCB0ZXh0ID0gZG9jLmNyZWF0ZVRleHROb2RlKChlbmRwb2ludCAhPSBudWxsKQotICAgICAgICAgICAgICAgID8gZW5kcG9pbnQKLSAgICAgICAgICAgICAgICA6ICIiKTsKLQotICAgICAgICBlbmRwb2ludEVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dCk7Ci0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGVuZHBvaW50RWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9va3MgZm9yIHRoZSBTT0FQVmVyc2lvbiBhbmQgYWRkcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwVmVyc2lvbihEb2N1bWVudCBkb2MsIEVsZW1lbnQgcm9vdEVsZW1lbnQpIHsKLSAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRvIGdldCB0byB0aGUgYmluZGluZ3MgZWxlbWVudAotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic29hcC12ZXJzaW9uIiwKLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBheGlzQmluZGluZy5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04pLAotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGV4Y2VwdGlvbnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnQgZmF1bHRFbGVtZW50OwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBmYXVsdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiZmF1bHQiKTsKLQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpLCBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vYXMgZm9yIHRoZSBuYW1lIG9mIGEgZmF1bHQsIHdlIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBmYXVsdENsYXNzTmFtZU1hcC5nZXQoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzaG9ydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBmYXVsdENsYXNzTmFtZU1hcC5nZXQoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICAgICAgLy9hZGRlZCB0aGUgYmFzZSBleGNlcHRpb24gY2xhc3MgbmFtZQotICAgICAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0RXhjZXB0aW9uQmFzZUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZXhjZXB0aW9uQmFzZUNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0RXhjZXB0aW9uQmFzZUNsYXNzTmFtZSgpLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnN0cnVjdG9yRGV0YWlscyhkb2MsIGZhdWx0RWxlbWVudCwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRFeGNlcHRpb25CYXNlQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQ2FuIG5vdCBsb2FkIHRoZSBFeGNlcHRpb24gYmFzZSBjbGFzcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImV4Y2VwdGlvbkJhc2VDbGFzcyIsIEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCksIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vdGhlIHR5cGUgcmVwcmVzZW50cyB0aGUgdHlwZSB0aGF0IHdpbGwgYmUgd3JhcHBlZCBieSB0aGlzCi0gICAgICAgICAgICAvL25hbWUKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZSgoUU5hbWUpIGZhdWx0RWxlbWVudFFOYW1lTWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZywgZmF1bHRFbGVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyaWJWYWx1ZSA9IChTdHJpbmcpIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMuCi0gICAgICAgICAgICAgICAgICAgIGdldChrZXkpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImluc3RhbnRpYXRhYmxlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYlZhbHVlID09IG51bGwgPyAiIiA6IGF0dHJpYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMKLSAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAobWFwcGVyLmdldERlZmF1bHRNYXBwaW5nTmFtZSgpLmVxdWFscyh0eXBlTWFwcGluZykpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGVmYXVsdCIsICJ5ZXMiLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgZ2V0UGFyYW1Jbml0aWFsaXplcih0eXBlTWFwcGluZyksCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICBFeGNlcHRpb25Xcml0ZXIgZXhjZXB0aW9uV3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgICAgIGRvYy5hcHBlbmRDaGlsZChmYXVsdEVsZW1lbnQpOwotICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcoZG9jKSk7Ci0gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgICAgIGV4Y2VwdGlvbldyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICAgICAgd3JpdGVGaWxlKGRvYywgZXhjZXB0aW9uV3JpdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb25zdHJ1Y3RvckRldGFpbHMoRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBmYXVsdEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzID0gQ2xhc3MuZm9yTmFtZShleGNlcHRpb25DbGFzc05hbWUpOwotICAgICAgICBDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycyA9ICBleGNlcHRpb25DbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEVsZW1lbnQgY29uc3RydWN0b3JFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNvbnN0cnVjdG9yIik7Ci0gICAgICAgICAgICBmYXVsdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29uc3RydWN0b3JFbGVtZW50KTsKLSAgICAgICAgICAgIENsYXNzW10gcGFyYW1ldGVycyA9IGNvbnN0cnVjdG9yc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgTGlzdCBleGlzdGluZ1BhcmFtTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhcmFtZXRlcnMubGVuZ3RoOyBqKyspewotICAgICAgICAgICAgICAgIEVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbWV0ZXJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlTmFtZShwYXJhbWV0ZXJzW2pdKSwgcGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVyTmFtZShwYXJhbWV0ZXJzW2pdLCBleGlzdGluZ1BhcmFtTmFtZXMpLCBwYXJhbWV0ZXJFbGVtZW50KTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1ldGVyTmFtZShDbGFzcyB0eXBlLCBMaXN0IGV4aXN0aW5nUGFyYW1OYW1lcykgewotICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBwYXJhbU5hbWUgPSBnZXRQYXJhbWV0ZXJOYW1lKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCBleGlzdGluZ1BhcmFtTmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpID4gMCkgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtTmFtZSA9IEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcihjbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKGV4aXN0aW5nUGFyYW1OYW1lcy5jb250YWlucyhwYXJhbU5hbWUpKXsKLSAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHBhcmFtTmFtZSArIGV4aXN0aW5nUGFyYW1OYW1lcy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGlzdGluZ1BhcmFtTmFtZXMuYWRkKHBhcmFtTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUeXBlTmFtZShDbGFzcyB0eXBlKXsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKXsKLSAgICAgICAgICAgIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUodHlwZS5nZXRDb21wb25lbnRUeXBlKCkpICsgIltdIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgbW9kZWwgZm9yIHRoZSBjYWxsYmFja3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yRXhjZXB0aW9uKCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2FsbGJhY2siKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vIFRPRE8gSkFYUlBDIG1hcHBpbmcgc3VwcG9ydCBzaG91bGQgYmUgY29uc2lkZXJlZCBoZXJlID8/Ci0gICAgICAgIHRoaXMubG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgY2FsbGJhY2sgaGFuZGxlcnMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDYWxsQmFja0hhbmRsZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0FzeW5jT24oKSkgewotICAgICAgICAgICAgRG9jdW1lbnQgaW50ZXJmYWNlTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvckNhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIGNhbGxiYWNrIGhhbmRsZXI6IiwgaW50ZXJmYWNlTW9kZWwpOwotICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyV3JpdGVyIGNhbGxiYWNrV3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENhbGxiYWNrSGFuZGxlcldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICBjYWxsYmFja1dyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICAgICAgd3JpdGVGaWxlKGludGVyZmFjZU1vZGVsLCBjYWxsYmFja1dyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIG1vZGVsIGZvciB0aGUgY2FsbGJhY2tzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvckNhbGxiYWNrSGFuZGxlcigpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNhbGxiYWNrIik7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkgJiYgdGhpcy5heGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gSkFYUlBDIG1hcHBpbmcgc3VwcG9ydCBzaG91bGQgYmUgY29uc2lkZXJlZCBoZXJlID8/Ci0gICAgICAgIHRoaXMubG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGludGVyZmFjZXMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSW50ZXJmYWNlKGJvb2xlYW4gd3JpdGVEYXRhYmluZGVycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IGludGVyZmFjZU1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JJbnRlcmZhY2Uod3JpdGVEYXRhYmluZGVycyk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBpbnRlcmZhY2U6IiwgaW50ZXJmYWNlTW9kZWwpOwotICAgICAgICBJbnRlcmZhY2VXcml0ZXIgaW50ZXJmYWNlV3JpdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgSW50ZXJmYWNlV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLSAgICAgICAgaW50ZXJmYWNlV3JpdGVyLnNldE92ZXJyaWRlKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGUoKSk7Ci0gICAgICAgIHdyaXRlRmlsZShpbnRlcmZhY2VNb2RlbCwgaW50ZXJmYWNlV3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBET00gdHJlZSBmb3IgdGhlIGludGVyZmFjZSBjcmVhdGlvbi4gVXNlcyB0aGUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvckludGVyZmFjZShib29sZWFuIHdyaXRlRGF0YWJpbmRlcnMpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIGxvY2FsUGFydCA9Ci0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpICsgU1RVQl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgICAgIGxvY2FsUGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkgKyBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvY2FsUGFydCA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBsb2NhbFBhcnQsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwKLSAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLAotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvL2FkZCBiYWNrd29yZGNvbXBhdGliaWxpdHkgYXR0cmlidXRlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc2JhY2tjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSksCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgLy8gdGhpcyBibG9jayBvZiBjb2RlIHNwZWNpZmljYWxseSBhcHBsaWVzIHRvIHRoZSBpbnRlZ3JhdGlvbiBvZiBkYXRhYmluZGluZyBjb2RlIGludG8gdGhlCi0gICAgICAgIC8vIGdlbmVyYXRlZCBjbGFzc2VzIHRpZ2h0bHkgKHByb2JhYmx5IGFzIGlubmVyIGNsYXNzZXMpCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBzcGVjaWFsIG1vZGVscyBpbiB0aGUgbWFwcGVyIGFuZCBpZiB0aGV5IGFyZSBwcmVzZW50IHByb2Nlc3MgdGhlbQotICAgICAgICBpZiAod3JpdGVEYXRhYmluZGVycykgewotICAgICAgICAgICAgaWYgKG1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHJvb3QgZWxlbWVudCBzaG93aW5nIHRoYXQgdGhlIHdyaXRpbmcgaGFzIGJlZW4gc2tpcHBlZAotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2lwLXdyaXRlIiwgInllcyIsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG1hcHBlciBvYmplY3RzCi0gICAgICAgICAgICAgICAgcHJvY2Vzc01vZGVsT2JqZWN0cyhtYXBwZXIuZ2V0QWxsTWFwcGVkT2JqZWN0cygpLCByb290RWxlbWVudCwgZG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgbWFwcGVyIGZvciBtZXNzYWdlIHJlY2VpdmVyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGVyRm9yTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICB1cGRhdGVNYXBwZXJDbGFzc25hbWVzKGdldEZ1bGx5UXVhbGlmaWVkTWVzc2FnZVJlY2VpdmVyTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGZ1bGx5IHF1YWxpZmllZCBNUiBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE1lc3NhZ2VSZWNlaXZlck5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBsb2NhbFBhcnQgKyBNRVNTQUdFX1JFQ0VJVkVSX1NVRkZJWDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGZ1bGx5IHF1YWxpZmllZCBza2VsZXRvbiBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFNrZWxldG9uTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBza2VsdG9uTmFtZTsKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIHNrZWx0b25OYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXRCaW5kaW5nTmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgIFNLRUxFVE9OX0NMQVNTX1NVRkZJWF9CQUNLOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2tlbHRvbk5hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIGxvY2FsUGFydCArIFNLRUxFVE9OX0NMQVNTX1NVRkZJWDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2tlbHRvbk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgc2tlbGV0b24gaW50ZXJmYWNlIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2tlbGV0b25JbnRlcmZhY2VOYW1lKCkgewotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHNrZWx0b25JbnRlcmZhY2VOYW1lOwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgc2tlbHRvbkludGVyZmFjZU5hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArCi0gICAgICAgICAgICAgICAgICAgIG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgIFNLRUxFVE9OX0lOVEVSRkFDRV9TVUZGSVhfQkFDSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNrZWx0b25JbnRlcmZhY2VOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBsb2NhbFBhcnQgKyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBza2VsdG9uSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbWl0cyB0aGUgc2tlbGV0b24KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbWl0U2tlbGV0b24oKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGFsbFNlcnZpY2VJbmZvSG9sZGVyID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIE1hcCBvcmlnaW5hbE1hcCA9IGdldE5ld0NvcHkodGhpcy5tYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKSk7Ci0gICAgICAgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgZm9sbG93aW5nIGZpbGVzIHNlcGVyYXRlbHkgcGVyIHNlcnZpY2UKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXhpc1NlcnZpY2VzSXRlciA9IHRoaXMuYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBoYXNoIG1hcCBmb3IgZWFjaCBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgdGhpcy5pbmZvSG9sZGVyID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBheGlzU2VydmljZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNCaW5kaW5nID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50KGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKS5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGNvbW1lbnQgYXQgdXBkYXRlTWFwcGVyQ2xhc3NuYW1lcyBmb3IgZGV0YWlscyBhbmQgcmVhc29ucyBmb3IKLSAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIHRoaXMgbWV0aG9kCi0gICAgICAgICAgICAgICAgaWYgKG1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29weU1hcChvcmlnaW5hbE1hcCwgdGhpcy5tYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1hcHBlckZvck1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlUb0ZhdWx0TWFwKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9oYW5kbGUgZmF1bHRzCi0gICAgICAgICAgICAgICAgZ2VuZXJhdGVBbmRQb3B1bGF0ZUZhdWx0TmFtZXMoKTsKLQotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzU2VydmVyU2lkZUludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vd3JpdGUgc2tlbGV0b25JbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTa2VsZXRvbkludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHNrZWxldG9uIG9ubHkgaWYgdGhlIHVzZWQgaGFzCi0gICAgICAgICAgICAgICAgLy8gYXNrZWQgZm9yIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW4gdGhlIGludGVyZmFjZSBtb2RlCi0gICAgICAgICAgICAgICAgLy8gZWxzZSB3cml0ZSBpdCBhbnl3YXkgOikKLSAgICAgICAgICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzR2VuZXJhdGVEZXBsb3llbWVudERlc2NyaXB0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTa2VsZXRvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVTa2VsZXRvbigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTa2lwTWVzc2FnZVJlY2VpdmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYSBNZXNzYWdlUmVjZWl2ZXIgZm9yIHRoaXMgcGFydGljdWxhciBzZXJ2aWNlLgotICAgICAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBFeGNlcHRpb25zCi0gICAgICAgICAgICAgICAgd3JpdGVFeGNlcHRpb25zKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzU2tpcFdyaXRlV1NETHMoKSkgewotICAgICAgICAgICAgICAgICAgICAvL2ZvciB0aGUgc2VydmVyIHNpZGUgY29kZWdlbgotICAgICAgICAgICAgICAgICAgICAvL3dlIG5lZWQgdG8gc2VyaWFsaXplIHRoZSBXU0RMJ3MKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVXU0RMRmlsZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgaW5mbyBob2xkZXIgd2l0aCB0aGUgc2VydmljZQotICAgICAgICAgICAgICAgIGFsbFNlcnZpY2VJbmZvSG9sZGVyLnB1dCh0aGlzLmF4aXNTZXJ2aWNlLmdldE5hbWUoKSx0aGlzLmluZm9Ib2xkZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzYXZlIGJhY2sgdHlwZSBtYXAKLSAgICAgICAgICAgIGlmICh0aGlzLm1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBjb3B5TWFwKG9yaWdpbmFsTWFwLCB0aGlzLm1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgc2VydmljZSB4bWwKLSAgICAgICAgICAgIC8vIGlmIGFza2VkCi0gICAgICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTZXJ2aWNlWG1sKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTa2lwQnVpbGRYTUwoKSkgewotICAgICAgICAgICAgICAgIC8vd3JpdGUgdGhlIGFudCBidWlsZAotICAgICAgICAgICAgICAgIC8vd2Ugc2tpcCB0aGlzIGZvciB0aGUgZmxhdHRlbmVkIGNhc2UKLSAgICAgICAgICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVBbnRCdWlsZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGNnRXhwKSB7Ci0gICAgICAgICAgICB0aHJvdyBjZ0V4cDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIG91dCB0aGUgV1NETCBmaWxlcyAoYW5kIHRoZSBzY2hlbWFzKSB3cml0aW5nIHRoZSBXU0RMIChhbmQgc2NoZW1hcykgaXMgc29tZXdoYXQgc3BlY2lhbAotICAgICAqIHNvIHdlIGNhbm5vdCBmb2xsb3cgdGhlIHVzdWFsIHBhdHRlcm4gb2YgdXNpbmcgdGhlIGNsYXNzIHdyaXRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlV1NETEZpbGVzKCkgewotCi0gICAgICAgIC8vZmlyc3QgbW9kaWZ5IHRoZSBzY2hlbWEgbmFtZXMgKGFuZCBsb2NhdGlvbnMpIHNvIHRoYXQKLSAgICAgICAgLy90aGV5IGhhdmUgdW5pcXVlIChmbGF0dGVuZWQpIG5hbWVzIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9ucwotICAgICAgICAvL2FyZSBhZGp1c3RlZCB0byBzdWl0IGl0Ci0gICAgICAgIGF4aXNTZXJ2aWNlLnNldEN1c3RvbVNjaGVtYU5hbWVQcmVmaXgoIiIpOy8vcHJlZml4IHdpdGggbm90aGluZwotICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21TY2hlbWFOYW1lU3VmZml4KCIueHNkIik7Ly9zdWZmaXggd2l0aCAueHNkIC0gdGhlIGZpbGUgbmFtZSBleHRlbnNpb24KLSAgICAgICAgLy9mb3JjZSB0aGUgbWFwcGluZ3MgdG8gYmUgcmVjb25zdHJ1Y3RlZAotICAgICAgICBheGlzU2VydmljZS5zZXRTY2hlbWFMb2NhdGlvbnNBZGp1c3RlZChmYWxzZSk7Ci0gICAgICAgIC8vd2hlbiBnZW5lcmF0aW5nIHRoZSBjb2RlIHdlIHNob3VsZCBjb3B5IGFsbCB0aGUgc2NoZW1hcyB0bwotICAgICAgICAvLyByZXNvdXJjZSBmb2xkZXIuCi0gICAgICAgIE1hcCBjaGFuZ2VkTWFwID0gYXhpc1NlcnZpY2UucG9wdWxhdGVTY2hlbWFNYXBwaW5ncyh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MoKSk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZXNlIHR3byBhdHRyaWJ1dGUgdG8gdXNlIHRoZSB1c2VyIGRlZmluZWQgd3NkbCB0byB1c2UuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigidXNlT3JpZ2luYWx3c2RsIiwgInRydWUiKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigibW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcyIsICJmYWxzZSIpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGlzIGV4Y3BldGlvbiB3aGlsZSBpbiBjb2RlZ2VuZXJhdGlvbgotICAgICAgICB9Ci0KLSAgICAgICAgLy9ub3cgZ2V0IHRoZSBzY2hlbWEgbGlzdCBhbmQgd3JpdGUgaXQgb3V0Ci0gICAgICAgIFNjaGVtYVdyaXRlciBzY2hlbWFXcml0ZXIgPSBuZXcgU2NoZW1hV3JpdGVyKAotICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRSZXNvdXJjZUxvY2F0aW9uKCkpKTsKLQotICAgICAgICAvLyBmaXJzdCB3cml0ZSBhbGwgdGhlIHNjaG1hcy4KLSAgICAgICAgLy8gdGhlbiB1c2UgdGhlIGNoYW5nZWRNYXAgZ290IGFib3ZlIHRvIGFkanVzdCB0aGUgbmFtZXMuCi0gICAgICAgIE1hcCBzY2hlbWFNYXBwaW5ncyA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYU1hcHBpbmdUYWJsZSgpOwotICAgICAgICBJdGVyYXRvciBrZXlzID0gc2NoZW1hTWFwcGluZ3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKCJodHRwIikpewotICAgICAgICAgICAgICAgc2NoZW1hV3JpdGVyLndyaXRlU2NoZW1hKChYbWxTY2hlbWEpIHNjaGVtYU1hcHBpbmdzLmdldChrZXkpLCBrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9zd2l0Y2ggYmV0d2VlbiB0aGUgY29ycmVjdCB3cml0ZXIKLSAgICAgICAgaWYgKENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fMi4KLSAgICAgICAgICAgICAgICBlcXVhbHMoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0V1NETFZlcnNpb24oKSkpIHsKLSAgICAgICAgICAgIC8vIFdvZGVuIGNhbm5vdCBzZXJpYWxpemUgdGhlIFdTREwgYXMgeWV0LCBzbyBsZXRzIHNlcmlhbGl6ZSB0aGUgYXhpc1NlcnZpY2UgZm9yIG5vdy4KLQotICAgICAgICAgICAgV1NETDIwV3JpdGVyIHdzZGwyMFdyaXRlciA9IG5ldyBXU0RMMjBXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzRmxhdHRlbkZpbGVzKCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRSZXNvdXJjZUxvY2F0aW9uKCkpKTsKLSAgICAgICAgICAgIHdzZGwyMFdyaXRlci53cml0ZVdTREwoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBoZXJlIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGUgd3NkbCBhbmQgaXRzIGltcG9ydHMKLSAgICAgICAgICAgIC8vIHdpdGggb3V0IHVzaW5nIHRoZSBheGlzIHNlcnZpY2UuCi0KLSAgICAgICAgICAgIFdTREwxMVdyaXRlciB3c2RsMTFXcml0ZXIgPSBuZXcgV1NETDExV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UmVzb3VyY2VMb2NhdGlvbigpKSk7Ci0gICAgICAgICAgICB3c2RsMTFXcml0ZXIud3JpdGVXU0RMKGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRXc2RsRGVmaW5pdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkTWFwKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY29weSB0aGUgZmF1bHRzIHRvIHRoZSBjb3JyZWN0IG1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlUb0ZhdWx0TWFwKCkgewotICAgICAgICBNYXAgY2xhc3NOYW1lTWFwID0gbWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBjbGFzc05hbWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBpbnN0YW50aWF0YWJsZU1lc3NhZ2VDbGFzc05hbWVzLnB1dChrZXksCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZU1hcC5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgdGhlIGZhdWx0IGNsYXNzbmFtZXMgdG8gZ28gd2l0aCB0aGUgcGFja2FnZSBhbmQgc3R1YgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUZhdWx0UGFja2FnZUZvclN0dWIoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGZhdWx0Q2xhc3NOYW1lS2V5cyA9IGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGZhdWx0Q2xhc3NOYW1lS2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBmYXVsdENsYXNzTmFtZUtleXMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAvL2FwcGVuZCB0aGUgc2tlbHRvbiBuYW1lCi0gICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRTdHViTmFtZSA9IGdldEZ1bGx5UXVhbGlmaWVkU3R1Yk5hbWUoKTsKLSAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAucHV0KGtleSwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKSArICIuIgotICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVNZXNzYWdlUmVjZWl2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9sb29wIHRocm91Z2ggdGhlIG1lcHMgYW5kIGdlbmVyYXRlIGNvZGUgZm9yIGVhY2ggbWVwCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWVwVG9DbGFzc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVwID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgRG9jdW1lbnQgY2xhc3NNb2RlbCA9IGNyZWF0ZURvY3VtZW50Rm9yTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICAgICBtZXAsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmlzU2VydmVyU2lkZUludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBtZXNzYWdlIHJlY2VpdmVyIChtZXA9IiArIG1lcCArCi0gICAgICAgICAgICAgICAgICAgICIpOiIsIGNsYXNzTW9kZWwpOwotICAgICAgICAgICAgLy93cml0ZSB0aGUgY2xhc3Mgb25seSBpZiBhbnkgbWV0aG9kcyBhcmUgZm91bmQKLSAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGluZm9Ib2xkZXIuZ2V0KG1lcCkpKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZVJlY2VpdmVyV3JpdGVyIHdyaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZVJlY2VpdmVyV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldE92ZXJyaWRlKGNvZGVHZW5Db25maWd1cmF0aW9uLmlzT3ZlcnJpZGUoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVGaWxlKGNsYXNzTW9kZWwsIHdyaXRlcik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXAKLSAgICAgKiBAcGFyYW0gaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnRGb3JNZXNzYWdlUmVjZWl2ZXIoU3RyaW5nIG1lcCwgYm9vbGVhbiBpc1NlcnZlclNpZGVJbnRlcmZhY2UpIHsKLQotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBsb2NhbFBhcnQgKyBtZXBUb1N1ZmZpeE1hcC5nZXQobWVwKSwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vIGhlcmUgc2V0IHRoZSBpc0xvd2VyQ2FzZU1ldGhvZE5hbWUgdmFyaWFibGUgdG8gaGF2ZSB0aGUgbmVnYXRpdmUgb24gdXNlT3BlcmF0aW9uTmFtZSB0bwotICAgICAgICAvLyBtYWtlIGl0IGVhc2llciB0byBoYW5kbGUgaW4gTWVzc2FnZSByZWNlaXZlciB0ZW1wbGF0ZS4KLSAgICAgICAgaWYgKCF0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzVXNlT3BlcmF0aW9uTmFtZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaXNMb3dlckNhc2VNZXRob2ROYW1lIiwgInRydWUiLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2FkZCBiYWNrd29yZGNvbXBhdGliaWxpdHkgYXR0cmlidXRlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc2JhY2tjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSksCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzQmFja3dvcmRDb21wYXRpYmlsaXR5TW9kZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0QmluZGluZ05hbWUoKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLRUxFVE9OX0NMQVNTX1NVRkZJWF9CQUNLLAotICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNrZWxldG9uSW50ZXJmYWNlTmFtZSIsIG1ha2VKYXZhQ2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpICsgU0tFTEVUT05fSU5URVJGQUNFX1NVRkZJWF9CQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRCaW5kaW5nTmFtZSgpKSArIFNLRUxFVE9OX0NMQVNTX1NVRkZJWF9CQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbm5hbWUiLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25DbGFzc05hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25uYW1lIiwgbG9jYWxQYXJ0ICsgU0tFTEVUT05fQ0xBU1NfU1VGRklYLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkludGVyZmFjZU5hbWUoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNrZWxldG9uSW50ZXJmYWNlTmFtZSIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkludGVyZmFjZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgbG9jYWxQYXJ0ICsgU0tFTEVUT05fSU5URVJGQUNFX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25DbGFzc05hbWUoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInNrZWxldG9uSW50ZXJmYWNlTmFtZSIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2VsZXRvbkludGVyZmFjZU5hbWUiLCBsb2NhbFBhcnQgKyBTS0VMRVRPTl9DTEFTU19TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImJhc2VyZWNlaXZlciIsIChTdHJpbmcpIG1lcFRvQ2xhc3NNYXAuZ2V0KG1lcCksIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAvLyB0aGlzIGJsb2NrIG9mIGNvZGUgc3BlY2lmaWNhbGx5IGFwcGxpZXMgdG8gdGhlIGludGVncmF0aW9uIG9mIGRhdGFiaW5kaW5nIGNvZGUgaW50byB0aGUKLSAgICAgICAgLy8gZ2VuZXJhdGVkIGNsYXNzZXMgdGlnaHRseSAocHJvYmFibHkgYXMgaW5uZXIgY2xhc3NlcykKLSAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAvLyBjaGVjayBmb3IgdGhlIHNwZWNpYWwgbW9kZWxzIGluIHRoZSBtYXBwZXIgYW5kIGlmIHRoZXkgYXJlIHByZXNlbnQgcHJvY2VzcyB0aGVtCi0gICAgICAgIGlmIChtYXBwZXIuaXNPYmplY3RNYXBwaW5nUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICAvLyBhZGQgYW4gYXR0cmlidXRlIHRvIHRoZSByb290IGVsZW1lbnQgc2hvd2luZyB0aGF0IHRoZSB3cml0aW5nIGhhcyBiZWVuIHNraXBwZWQKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2lwLXdyaXRlIiwgInllcyIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG1hcHBlciBvYmplY3RzCi0gICAgICAgICAgICBwcm9jZXNzTW9kZWxPYmplY3RzKG1hcHBlci5nZXRBbGxNYXBwZWRPYmplY3RzKCksIHJvb3RFbGVtZW50LCBkb2MpOwotICAgICAgICB9Ci0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0gICAgICAgIGJvb2xlYW4gaXNPcHNGb3VuZCA9IGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG1lcCk7Ci0gICAgICAgIC8vcHV0IHRoZSByZXN1bHQgaW4gdGhlIHByb3BlcnR5IG1hcAotICAgICAgICBpbmZvSG9sZGVyLnB1dChtZXAsIGlzT3BzRm91bmQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgLy9jcmVhdGUgdGhlIGRhdGFiaW5kZXIgZWxlbWVudCB3aXRoIHNlcnZlcnNpZGUgYXMgdHJ1ZQotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChjcmVhdGVET01FbGVtZW50Zm9yRGF0YWJpbmRlcnMoZG9jLCB0cnVlKSk7Ci0KLSAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHNvZk1lcChkb2MsIG1lcCkpOwotCi0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBhIGRvbSBlbGVtZW50IGZvciBkYXRhYmluZGVycy4gVGhpcyBpcyBjYWxsZWQgYnkgb3RoZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVET01FbGVtZW50Zm9yRGF0YWJpbmRlcnMoRG9jdW1lbnQgZG9jLCBib29sZWFuIGlzU2VydmVyc2lkZSkgewotCi0gICAgICAgIC8vIEZpcnN0IEl0ZXJhdGUgdGhyb3VnaCB0aGUgb3BlcmF0aW9ucyBhbmQgZmluZCB0aGUgcmVsZXZhbnQgZnJvbU9NIGFuZCB0b09NIG1ldGhvZHMgdG8gYmUgZ2VuZXJhdGVkCi0gICAgICAgIEFycmF5TGlzdCBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBiaW5kaW5nT3BlcmF0aW9uc0l0ZXIgPSB0aGlzLmF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbnNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9uc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBwYXJhbWV0ZXJzIHRvIGEgbWFwIHdpdGggdGhlaXIgdHlwZSBhcyB0aGUga2V5Ci0gICAgICAgICAgICAvLyB0aGlzIHN0ZXAgaXMgbmVlZGVkIHRvIHJlbW92ZSByZXBldGl0aW9ucwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBTdHJpbmcgTUVQID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAoTUVQKSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBpbnB1dFBhcmFtRWxlbWVudCA9IGdldElucHV0UGFyYW1FbGVtZW50KGRvYywgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dFBhcmFtRWxlbWVudC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvL2FkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIHBhcmFtZXRlciBzYXlpbmcgdGhhdCB0aGlzIGlzIGFuCi0gICAgICAgICAgICAgICAgICAgIC8vaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRpcmVjdGlvbiIsICJpbiIsIGlucHV0UGFyYW1FbGVtZW50W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgLy9hZGQgdGhlIHNob3J0IHR5cGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFBhcmFtRWxlbWVudFtpXSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBwcm9jZXNzIG91dHB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKE1FUCkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IG91dHB1dFBhcmFtRWxlbWVudCA9IGdldE91dHB1dFBhcmFtRWxlbWVudChkb2MsIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQYXJhbUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvL3NldCB0aGUgZGlyZWN0aW9uIGFzIG91dAotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGlyZWN0aW9uIiwgIm91dCIsIG91dHB1dFBhcmFtRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG91dHB1dFBhcmFtRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3Byb2Nlc3MgZmF1bHRzCi0gICAgICAgICAgICBFbGVtZW50W10gZmF1bHRQYXJhbUVsZW1lbnRzID0gZ2V0RmF1bHRQYXJhbUVsZW1lbnRzKGRvYywgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0UGFyYW1FbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vc2V0IHRoZSBkaXJlY3Rpb24gYXMgb3V0IC0gYWxsIGZhdWx0cyBhcmUgb3V0IG1lc3NhZ2VzID8KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGlyZWN0aW9uIiwgIm91dCIsIGZhdWx0UGFyYW1FbGVtZW50c1tpXSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQoZmF1bHRQYXJhbUVsZW1lbnRzW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaGVhZGVyIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEVsZW1lbnQgbmV3Q2hpbGQ7Ci0gICAgICAgICAgICBMaXN0IGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGFkZEhlYWRlck9wZXJhdGlvbnMoaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LCBheGlzQmluZGluZ09wZXJhdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICBMaXN0IHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gZ2V0UGFyYW1ldGVyRWxlbWVudExpc3QoZG9jLCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU09BUF9IRUFERVIpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbmV3Q2hpbGQgPSAoRWxlbWVudCkgcGFyYW1ldGVyRWxlbWVudExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG5ld0NoaWxkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50TGlzdC5jbGVhcigpOwotICAgICAgICAgICAgYWRkSGVhZGVyT3BlcmF0aW9ucyhoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBmYWxzZSk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50TGlzdCA9IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0KGRvYywgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLlNPQVBfSEVBREVSKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJFbGVtZW50TGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG5ld0NoaWxkID0gKEVsZW1lbnQpIHBhcmFtZXRlckVsZW1lbnRMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChuZXdDaGlsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImRhdGFiaW5kZXJzIik7Ci0gICAgICAgIC8vYWRkIHRoZSBkYiB0eXBlIGF0dHJpYnV0ZSAgLSB0aGUgbmFtZSBvZiB0aGUgZGF0YWJpbmRpbmcgdHlwZQotICAgICAgICAvL3RoaXMgd2lsbCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgY29ycmVjdCB0ZW1wbGF0ZQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGJ0eXBlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgLy9hZGQgdGhlIHdyYXBwZWQgZmxhZyBzdGF0ZSAtIHRoaXMgaXMgdXNlZCBieSBKaUJYLCBidXQgbWF5IGJlIHVzZWZ1bAotICAgICAgICAvL2ZvciBvdGhlciBmcmFtZXdvcmtzIGluIHRoZSBmdXR1cmUKLSAgICAgICAgU3RyaW5nIHdyYXBmbGFnID0gQm9vbGVhbi50b1N0cmluZyhjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAid3JhcHBlZCIsIHdyYXBmbGFnLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy9hdCB0aGlzIHBvaW50IHdlIG1heSBuZWVkIHRvIGNhcHR1cmUgdGhlIGV4dHJhIHBhcmFtZXRlcnMgcGFzc2VzIHRvIHRoZQotICAgICAgICAvL3BhcnRpY3VsYXIgZGF0YWJpbmRpbmcgZnJhbWV3b3JrCi0gICAgICAgIC8vdGhlc2UgcGFyYW1ldGVycyBzaG93dXAgaW4gdGhlIHByb3BlcnR5IG1hcCB3aXRoIFN0cmluZyBrZXlzLCBhbmQgd2UKLSAgICAgICAgLy9jYW4ganVzdCBjb3B5IHRoZXNlIGl0ZW1zIGFzIGF0dHJpYnV0ZXMgb2YgdGhlIDxleHRyYT4gZWxlbWVudC4KLSAgICAgICAgRWxlbWVudCBleHRyYUVsZW1lbnQgPSBhZGRFbGVtZW50KGRvYywgImV4dHJhIiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBNYXAgcHJvcGVydGllc01hcCA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnRpZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwcm9wZXJ0aWVzTWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIC8vaWYgdGhlIHZhbHVlIGlzIG51bGwgc2V0IGl0IHRvIGVtcHR5IHN0cmluZwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB2YWx1ZSA9ICIiOwotICAgICAgICAgICAgICAgIC8vYWRkIGtleT0idmFsdWUiIGF0dHJpYnV0ZSB0byBlbGVtZW50IGlmZiB2YWx1ZSBhIHN0cmluZwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAoU3RyaW5nKSBrZXksIChTdHJpbmcpIHZhbHVlLCBleHRyYUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vYWRkIHRoZSBzZXJ2ZXIgc2lkZSBhdHRyaWJ1dGUuIHRoaXMgaGVscHMgdGhlIGRhdGFiaW5kaW5nIHRlbXBsYXRlCi0gICAgICAgIC8vdG8gZGV0ZXJtaW5lIHRoZSBtZXRob2RzIHRvIGdlbmVyYXRlCi0gICAgICAgIGlmIChpc1NlcnZlcnNpZGUpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc3NlcnZlcnNpZGUiLCAieWVzIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGFkZCB0aGUgbmFtZXMgb2YgdGhlIGVsZW1lbnRzIHRoYXQgaGF2ZSBiYXNlIDY0IGNvbnRlbnQKLSAgICAgICAgLy8gaWYgdGhlIGJhc2U2NCBuYW1lIGxpc3QgaXMgbWlzc2luZyB0aGVuIHRoaXMgd2hvbGUgc3RlcCBpcyBza2lwcGVkCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldEJhc2U2NEVsZW1lbnRzKGRvYykpOwotCi0gICAgICAgIC8vYWRkIHRoZSBtZXRob2QgbmFtZXMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0T3BOYW1lcyhkb2MpKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZCgoRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbmlzaCB3aXRoIGFueSBleHRyYSBpbmZvcm1hdGlvbiBmcm9tIHNlcnZpY2UgYW5kIG9wZXJhdGlvbnMKLSAgICAgICAgUGFyYW1ldGVyIGRldGFpbHMgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkRBVEFCSU5ESU5HX1NFUlZJQ0VfREVUQUlMUyk7Ci0gICAgICAgIGlmIChkZXRhaWxzICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGRldGFpbHMuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChkb2MuaW1wb3J0Tm9kZSgoRWxlbWVudCkgdmFsdWUsIHRydWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KSBpdGVyLm5leHQoKSwgdHJ1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnNJdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICBvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9uc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGRldGFpbHMgPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfT1BFUkFUSU9OX0RFVEFJTFMpOwotICAgICAgICAgICAgaWYgKGRldGFpbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KSBkZXRhaWxzLmdldFZhbHVlKCksIHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkYXRhYmluZGluZyByb290IGVsZW1lbnQgIiArIERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIHJldHVybiByb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgdGhlIHNob3J0IHR5cGUgYXMgaXQgaXMgaW4gdGhlIGRhdGEgYmluZGluZwotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtRWxlbWVudAotICAgICAqIEBwYXJhbSB4bWxOYW1lCi0gICAgICovCi0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFNob3J0VHlwZShFbGVtZW50IHBhcmFtRWxlbWVudCwgU3RyaW5nIHhtbE5hbWUpIHsKLQotICAgICAgICBpZiAoeG1sTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YU5hbWU7Ci0gICAgICAgICAgICBpZiAoSmF2YVV0aWxzLmlzSmF2YUtleXdvcmQoeG1sTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBqYXZhTmFtZSA9IEphdmFVdGlscy5tYWtlTm9uSmF2YUtleXdvcmQoeG1sTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gSmF2YVV0aWxzLmNhcGl0YWxpemVGaXJzdENoYXIoSmF2YVV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAueG1sTmFtZVRvSmF2YSh4bWxOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUocGFyYW1FbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgInNob3J0dHlwZSIsCi0gICAgICAgICAgICAgICAgICAgIGphdmFOYW1lLAotICAgICAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKHBhcmFtRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICJzaG9ydHR5cGUiLAotICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIG9wZXJhdGlvbiBuYW1lcwotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gUmV0dXJucyBFbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldE9wTmFtZXMoRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvcG5hbWVzIik7Ci0gICAgICAgIEVsZW1lbnQgZWx0OwotCi0KLSAgICAgICAgZm9yIChJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgb3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgZWx0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm5hbWUiKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGVsdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEobG9jYWxQYXJ0KSkpOwotCi0gICAgICAgICAgICAvL3doYXQgbmVlZHMgdG8gYmUgcHV0IGhlcmUgYXMgdGhlIG9wZXJ0YXRpb24gbmFtZXNwYWNlIGlzIGFjdHVhbGx5IHRoZQotICAgICAgICAgICAgLy90cmFnZXQgbmFtZXNwYWNlIG9mIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3Buc3VyaSIsIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLCBlbHQpOwotICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChlbHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYmFzZTY0IHR5cGVzLiBJZiBub3QgYXZhaWxhYmxlIHRoaXMgd2lsbCBiZSBlbXB0eSEhIQotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEByZXR1cm4gUmV0dXJucyBFbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldEJhc2U2NEVsZW1lbnRzKERvY3VtZW50IGRvYykgewotICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgiYmFzZTY0RWxlbWVudHMiKTsKLSAgICAgICAgRWxlbWVudCBlbHQ7Ci0gICAgICAgIFFOYW1lIHFuYW1lOwotCi0gICAgICAgIC8vIHRoaXMgaXMgYSBsaXN0IG9mIFFOYW1lcwotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpLmdldChDb25zdGFudHMuQkFTRV82NF9QUk9QRVJUWV9LRVkpOwotCi0gICAgICAgIGlmICgobGlzdCAhPSBudWxsKSAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IGxpc3Quc2l6ZSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBxbmFtZSA9IChRTmFtZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZWx0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIm5hbWUiKTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibnMtdXJsIiwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIGVsdCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2FsTmFtZSIsIHFuYW1lLmdldExvY2FsUGFydCgpLCBlbHQpOwotICAgICAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvYmplY3RNYXBwaW5ncwotICAgICAqIEBwYXJhbSByb290Ci0gICAgICogQHBhcmFtIGRvYwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb2RlbE9iamVjdHMoTWFwIG9iamVjdE1hcHBpbmdzLCBFbGVtZW50IHJvb3QsIERvY3VtZW50IGRvYykgewotICAgICAgICBJdGVyYXRvciBvYmplY3RJdGVyYXRvciA9IG9iamVjdE1hcHBpbmdzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKG9iamVjdEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBvYmplY3RJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgICAgICAvL3dlIGNhbm5vdCBoYXZlIGFuIGVtcHR5IGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuaW1wb3J0Tm9kZSgoKERvY3VtZW50KSBvKS5nZXREb2N1bWVudEVsZW1lbnQoKSwgdHJ1ZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIG9vcHMgd2UgaGF2ZSBubyBpZGVhIGhvdyB0byBkbyB0aGlzLCBpZiB0aGUgbW9kZWwgcHJvdmlkZWQgaXMgbm90IGEgRE9NIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgLy8gd2UgYXJlIGRvbmUuIHdlIG1pZ2h0IGFzIHdlbGwgc2tpcCAgaXQgaGVyZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogd2UgbmVlZCB0byBtb2RpZnkgdGhlIG1hcHBlcidzIGNsYXNzIG5hbWUgbGlzdC4gVGhlIGlzc3VlIGhlcmUgaXMgdGhhdCBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90Ci0gICAgICogZXhwZWN0IHRoZSBmdWxseSBxdWxpZmllZCBjbGFzcyBuYW1lcyB0byBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBuYW1lcyBsaXN0IGR1ZSB0byB0aGUgc2ltcGxlCi0gICAgICogcmVhc29uIHRoYXQgdGhleSd2ZSBub3QgYmVlbiB3cml0dGVuIHlldCEgSGVuY2UgdGhlIG1hcHBlcnMgY2xhc3MgbmFtZSBsaXN0IG5lZWRzIHRvIGJlCi0gICAgICogdXBkYXRlZCB0byBzdWl0IHRoZSBleHBlY3RlZCBwYWNrYWdlIHRvIGJlIHdyaXR0ZW4gaW4gdGhpcyBjYXNlIHdlIG1vZGlmeSB0aGUgcGFja2FnZSBuYW1lIHRvCi0gICAgICogaGF2ZSB0aGUgY2xhc3MgYSBpbm5lciBjbGFzcyBvZiB0aGUgc3R1YiwgaW50ZXJmYWNlIG9yIHRoZSBtZXNzYWdlIHJlY2VpdmVyIGRlcGVuZGluZyBvbiB0aGUKLSAgICAgKiBzdHlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBlckNsYXNzbmFtZXMoU3RyaW5nIGZ1bGx5UXVsaWZpZWRJbmNsdWRpbmdDbGFzc05hbWVQcmVmaXgpIHsKLSAgICAgICAgTWFwIGNsYXNzTmFtZU1hcCA9IG1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpOwotICAgICAgICBJdGVyYXRvciBrZXlzID0gY2xhc3NOYW1lTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgY2xhc3NOYW1lTWFwLmdldChrZXkpOwotCi0gICAgICAgICAgICBTdHJpbmcgcmVhbENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZW5kc1dpdGgoIltdIikpewotICAgICAgICAgICAgICAgcmVhbENsYXNzTmFtZSA9IHJlYWxDbGFzc05hbWUuc3Vic3RyaW5nKDAscmVhbENsYXNzTmFtZS5pbmRleE9mKCJbXSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vdGhpcyBpcyBhIGdlbmVyYXRlZCBjbGFzcyBuYW1lIC0gdXBkYXRlIHRoZSBuYW1lCi0gICAgICAgICAgICBpZiAoIVR5cGVUZXN0ZXJVdGlsLmhhc1BhY2thZ2UocmVhbENsYXNzTmFtZSkgJiYgIVR5cGVUZXN0ZXJVdGlsLmlzUHJpbWl0aXZlKHJlYWxDbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lTWFwLnB1dChrZXksIGZ1bGx5UXVsaWZpZWRJbmNsdWRpbmdDbGFzc05hbWVQcmVmaXggKyAiLiIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGluc3RhbnRpYXRhYmxlTWVzc2FnZUNsYXNzTmFtZXMucHV0KGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVsaWZpZWRJbmNsdWRpbmdDbGFzc05hbWVQcmVmaXggKyAiJCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL3RoaXMgaXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSAtIGp1c3QgbGVhdmUgaXQgYXMgaXQgaXMKLSAgICAgICAgICAgICAgICBjbGFzc05hbWVNYXAucHV0KGtleSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpbnN0YW50aWF0YWJsZU1lc3NhZ2VDbGFzc05hbWVzLnB1dChrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIHNlcnZpY2UgWE1MCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2VydmljZVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFdyaXRlIHRoZSBzZXJ2aWNlIHhtbCBpbiBhIGZvbGRlciB3aXRoIHRoZQotICAgICAgICBEb2N1bWVudCBzZXJ2aWNlWE1MTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvclNlcnZpY2VYTUwoKTsKLSAgICAgICAgZGVidWdMb2dEb2N1bWVudCgiRG9jdW1lbnQgZm9yIHNlcnZpY2UgWE1MOiIsIHNlcnZpY2VYTUxNb2RlbCk7Ci0gICAgICAgIEZpbGVXcml0ZXIgc2VydmljZVhtbFdyaXRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VYTUxXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UmVzb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0gICAgICAgIHNlcnZpY2VYbWxXcml0ZXIuc2V0T3ZlcnJpZGUoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNPdmVycmlkZSgpKTsKLSAgICAgICAgd3JpdGVGaWxlKHNlcnZpY2VYTUxNb2RlbCwgc2VydmljZVhtbFdyaXRlcik7Ci0gICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmFkZFhtbEZpbGVOYW1lKHNlcnZpY2VYbWxXcml0ZXIuZ2V0T3V0cHV0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsvLyROT04tU0VDLTMKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNlcnZpY2VYTUwoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2VzIik7Ci0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5heGlzU2VydmljZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHRoaXMuYXhpc0JpbmRpbmcgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludChheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldEJpbmRpbmdOYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFNlcnZpY2VFbGVtZW50KHNlcnZpY2VOYW1lLCBjbGFzc05hbWUsIGRvYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHJlc3VzYWJsZSBtZXRob2QgdG8gcmV0dXJuIHRoZSBzZXJ2aWNlIGVsZW1lbnQgZm9yIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHhtbAotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIERPTSBFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0U2VydmljZUVsZW1lbnQoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBEb2N1bWVudCBkb2MpIHsKLQotICAgICAgICBpZiAoYWxsU2VydmljZUluZm9Ib2xkZXIuZ2V0KHNlcnZpY2VOYW1lKSAhPSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMuaW5mb0hvbGRlciA9IChNYXApIGFsbFNlcnZpY2VJbmZvSG9sZGVyLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsICIiLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjbGFzc3BhY2thZ2UiLCBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25DbGFzc05hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkNsYXNzTmFtZSgpLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgY2xhc3NOYW1lICsgU0tFTEVUT05fQ0xBU1NfU1VGRklYX0JBQ0ssIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBjbGFzc05hbWUgKyBTS0VMRVRPTl9DTEFTU19TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNXcml0ZVRlc3RDYXNlKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0ZXN0T21pdCIsICJ0cnVlIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzZXJ2aWNlbmFtZSIsIHNlcnZpY2VOYW1lLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtZXBUb0NsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKGluZm9Ib2xkZXIuZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbHQgPSBhZGRFbGVtZW50KGRvYywgIm1lc3NhZ2VyZWNlaXZlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShzZXJ2aWNlTmFtZSkgKyBtZXBUb1N1ZmZpeE1hcC5nZXQoa2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibWVwVVJJIiwga2V5LnRvU3RyaW5nKCksIGVsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIHJldHVybiByb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNrZWxldG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IHNrZWxldG9uTW9kZWwgPQotICAgICAgICAgICAgICAgIGNyZWF0ZURPTURvY3VtZW50Rm9yU2tlbGV0b24oY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkpOwotICAgICAgICBkZWJ1Z0xvZ0RvY3VtZW50KCJEb2N1bWVudCBmb3Igc2tlbGV0b246Iiwgc2tlbGV0b25Nb2RlbCk7Ci0gICAgICAgIEZpbGVXcml0ZXIgc2tlbGV0b25Xcml0ZXIgPSBuZXcgU2tlbGV0b25Xcml0ZXIoCi0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotICAgICAgICBza2VsZXRvbldyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICB3cml0ZUZpbGUoc2tlbGV0b25Nb2RlbCwgc2tlbGV0b25Xcml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBza2VsZXRvbkludGVyZmFjZQotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNrZWxldG9uSW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERvY3VtZW50IHNrZWxldG9uTW9kZWwgPSBjcmVhdGVET01Eb2N1bWVudEZvclNrZWxldG9uSW50ZXJmYWNlKCk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBza2VsZXRvbiBJbnRlcmZhY2U6Iiwgc2tlbGV0b25Nb2RlbCk7Ci0gICAgICAgIEZpbGVXcml0ZXIgc2tlbGV0b25JbnRlcmZhY2VXcml0ZXIgPSBuZXcgU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIoCi0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotICAgICAgICBza2VsZXRvbkludGVyZmFjZVdyaXRlci5zZXRPdmVycmlkZShjb2RlR2VuQ29uZmlndXJhdGlvbi5pc092ZXJyaWRlKCkpOwotICAgICAgICB3cml0ZUZpbGUoc2tlbGV0b25Nb2RlbCwgc2tlbGV0b25JbnRlcmZhY2VXcml0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTE1vZGVsIGZvciB0aGUgc2tlbGV0b24KLSAgICAgKgotICAgICAqIEBwYXJhbSBpc1NrZWxldG9uSW50ZXJmYWNlCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTa2VsZXRvbihib29sZWFuIGlzU2tlbGV0b25JbnRlcmZhY2UpIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXRCaW5kaW5nTmFtZSgpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tFTEVUT05fQ0xBU1NfU1VGRklYX0JBQ0ssCi0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25DbGFzc05hbWUoKSAhPSBudWxsKXsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uQ2xhc3NOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc2VydmljZU5hbWUgKyBTS0VMRVRPTl9DTEFTU19TVUZGSVgsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY2FsbGJhY2tuYW1lIiwgc2VydmljZU5hbWUgKyBDQUxMX0JBQ0tfSEFORExFUl9TVUZGSVgsCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAvL2FkZCBiYWNrd29yZGNvbXBhdGliaWxpdHkgYXR0cmlidXRlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc2JhY2tjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSksCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICBpZiAoaXNTa2VsZXRvbkludGVyZmFjZSkgewotICAgICAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkgKyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYX0JBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U2tlbHRvbkludGVyZmFjZU5hbWUoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uSW50ZXJmYWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2tlbGV0b25JbnRlcmZhY2VOYW1lIiwgc2VydmljZU5hbWUgKyBTS0VMRVRPTl9JTlRFUkZBQ0VfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZmlsbFN5bmNBdHRyaWJ1dGVzKGRvYywgcm9vdEVsZW1lbnQpOwotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhkb2MpKTsKLQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIHJldHVybiBkb2M7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBYTUwgbW9kZWwgZm9yIHRoZSBza2VsZXRvbiBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gRE9NIERvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU2tlbGV0b25JbnRlcmZhY2UoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgbWFrZUphdmFDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpICsKLSAgICAgICAgICAgICAgICAgICAgU0tFTEVUT05fSU5URVJGQUNFX1NVRkZJWF9CQUNLLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTa2VsdG9uSW50ZXJmYWNlTmFtZSgpICE9IG51bGwpewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNrZWx0b25JbnRlcmZhY2VOYW1lKCkgLCByb290RWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHNlcnZpY2VOYW1lICsgU0tFTEVUT05fSU5URVJGQUNFX1NVRkZJWCwgcm9vdEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhbGxiYWNrbmFtZSIsIHNlcnZpY2VOYW1lICsgQ0FMTF9CQUNLX0hBTkRMRVJfU1VGRklYLAotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAvL2FkZCBiYWNrd29yZGNvbXBhdGliaWxpdHkgYXR0cmlidXRlCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc2JhY2tjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSksCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGZpbGxTeW5jQXR0cmlidXRlcyhkb2MsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBvcGVyYXRpb25zCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50Ci0gICAgICogQHBhcmFtIG1lcAotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGxvYWRPcGVyYXRpb25zKERvY3VtZW50IGRvYywgRWxlbWVudCByb290RWxlbWVudCwgU3RyaW5nIG1lcCkgewotICAgICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1ha2VKYXZhQ2xhc3NOYW1lKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgYmluZGluZ09wZXJhdGlvbnMgPSB0aGlzLmF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIGJvb2xlYW4gb3BzRm91bmQgPSBmYWxzZTsKLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBudWxsOwotICAgICAgICB3aGlsZSAoYmluZGluZ09wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIC8vIHBvcHVsYXRlIGluZm8gaG9sZGVyIHdpdGggbWVwIGluZm9ybWF0aW9uLiBUaGlzIHdpbGwgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaAotICAgICAgICAgICAgLy8gbWVzc2FnZSByZWNlaXZlciB0byB1c2UsIGV0Yy4sCi0KLQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChpbmZvSG9sZGVyLmdldChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mb0hvbGRlci5wdXQobWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BzRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQgPSBnZW5lcmF0ZU1ldGhvZEVsZW1lbnQoZG9jLCBzZXJ2aWNlTmFtZSwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG1ldGhvZEVsZW1lbnQpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vbWVwIGlzIHByZXNlbnQgLSB3ZSBtb3ZlIGFoZWFkIG9ubHkgaWYgdGhlIGdpdmVuIG1lcCBtYXRjaGVzIHRoZSBtZXAgb2YgdGhpcyBvcGVyYXRpb24KLQotICAgICAgICAgICAgICAgIGlmIChtZXAuZXF1YWxzKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAvL2F0IHRoaXMgcG9pbnQgd2Uga25vdyBpdCdzIHRydWUKLSAgICAgICAgICAgICAgICAgICAgb3BzRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50ID0gZ2VuZXJhdGVNZXRob2RFbGVtZW50KGRvYywgc2VydmljZU5hbWUsIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcHNGb3VuZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21tb24gY29kZSB0byBnZW5lcmF0ZSBhIDxtZXRob2Q+IGVsZW1lbnQgZnJvbSBhbiBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIGVuZHBvaW50TmFtZQotICAgICAqIEBwYXJhbSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICogQHJldHVybiBnZW5lcmF0ZWQgZWxlbWVudAotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2VuZXJhdGVNZXRob2RFbGVtZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0gICAgICAgIExpc3Qgc29hcEhlYWRlcklucHV0UGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBzb2FwSGVhZGVyT3V0cHV0UGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbWV0aG9kRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJtZXRob2QiKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzVXNlT3BlcmF0aW9uTmFtZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhKGxvY2FsUGFydCksIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIobG9jYWxQYXJ0KSwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3JpZ2luYWxOYW1lIiwgbG9jYWxQYXJ0LCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWVzcGFjZSIsIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInN0eWxlIiwgKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbigKLSAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSksIG1ldGhvZEVsZW1lbnQpOwotCi0gICAgICAgIC8vIGFkZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIG9wZXJhdGlvbgotICAgICAgICBTdHJpbmcgY29tbWVudCA9ICIiOwotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICBjb21tZW50ID0gYXhpc09wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uKCkudHJpbSgpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjb21tZW50IiwgY29tbWVudCwgbWV0aG9kRWxlbWVudCk7Ci0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotICAgICAgICAvL0pheHdzIFNwZWNpZmljCi0gICAgICAgIGlmKCJqYXgtd3MiLmVxdWFscyhjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKSl7Ci0gICAgICAgICAgICBib29sZWFuIHdyYXBwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1zZyA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIGlmKG1zZy5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFyYW1ldGVyc3R5bGUiLCAod3JhcHBlZCk/IldSQVBQUEVEIjoiQkFSRSIsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICB9Ci0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGJzdXBwb3J0bmFtZSIsCi0gICAgICAgICAgICAgICAgZW5kcG9pbnROYW1lICsgbG9jYWxQYXJ0ICsgREFUQUJJTkRJTkdfU1VQUE9SVEVSX05BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibWVwIiwgVXRpbHMuZ2V0QXhpc1NwZWNpZk1FUENvbnN0YW50KG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pICsgIiIsCi0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtZXBVUkkiLCBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgUGFyYW1ldGVyIHdzZGwyU3R5bGVQYXJhbWV0ZXIgPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihXU0RMMkNvbnN0YW50cy5PUEVSQVRJT05fU1RZTEUpOwotICAgICAgICBpZiAod3NkbDJTdHlsZVBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBwcm92aWRlIFdTREwyIHN0eWxlcyB0byBhbGxvdyB0ZW1wbGF0ZXMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlbSwgaWYgZGVzaXJlZAotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIndzZGwyU3R5bGVzIiwgYXJyYXlUb1N0cmluZygoVVJJW10pd3NkbDJTdHlsZVBhcmFtZXRlci5nZXRWYWx1ZSgpKSwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBmb3IgdGhpcyBvcGVyYXRpb24gdG8gYmUgaGFuZGxlZCBkaXJlY3RseSBieSBkYXRhYmluZGluZyBjb2RlIGdlbmVyYXRpb24KLSAgICAgICAgUGFyYW1ldGVyIGRibWV0aG5hbWUgPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfR0VORVJBVEVEX1JFQ0VJVkVSKTsKLSAgICAgICAgaWYgKGRibWV0aG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInVzZWRibWV0aG9kIiwgKFN0cmluZykgZGJtZXRobmFtZS5nZXRWYWx1ZSgpLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBQYXJhbWV0ZXIgZGJnZW5pbXBsID0KLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfR0VORVJBVEVEX0lNUExFTUVOVEFUSU9OKTsKLSAgICAgICAgaWYgKGRiZ2VuaW1wbCAhPSBudWxsICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoZGJnZW5pbXBsLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidXNkYmltcGwiLCAidHJ1ZSIsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInVzZGJpbXBsIiwgImZhbHNlIiwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRTT0FQQWN0aW9uKGRvYywgbWV0aG9kRWxlbWVudCwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICBhZGRPdXRwdXRBbmRGYXVsdEFjdGlvbnMoZG9jLCBtZXRob2RFbGVtZW50LCBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYWRkSGVhZGVyT3BlcmF0aW9ucyhzb2FwSGVhZGVySW5wdXRQYXJhbWV0ZXJMaXN0LCBiaW5kaW5nT3BlcmF0aW9uLCB0cnVlKTsKLS8vICAgICAgICBhZGRIZWFkZXJPcGVyYXRpb25zKHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0LCBheGlzT3BlcmF0aW9uLCBmYWxzZSk7Ci0KLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgIGlmKCJqYXgtd3MiLmVxdWFscyhjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKSl7Ci0gICAgICAgICAgICAgICAgdXNlSG9sZGVyQ2xhc3NfamF4d3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGluTWVzc2FnZS5nZXROYW1lKCkuZXF1YWxzKG91dE1lc3NhZ2UuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbi9vdXQgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlSG9sZGVyQ2xhc3NfamF4d3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInVzZWhvbGRlciIsICJ0cnVlIiwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdldElucHV0RWxlbWVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24sIHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdldE91dHB1dEVsZW1lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVyT3V0cHV0UGFyYW1ldGVyTGlzdCkpOwotICAgICAgICB9Ci0gICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0RmF1bHRFbGVtZW50KGRvYywKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKSk7Ci0KLSAgICAgICAgc2V0VHJhbnNmZXJDb2RpbmcoYXhpc09wZXJhdGlvbiwgbWV0aG9kRWxlbWVudCwgZG9jKTsKLQotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUiwKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IiLAotICAgICAgICAgICAgICAgICAgICAiXCIiICsgcHJvcGVydHkgKyAiXCIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTiwKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0xPQ0FUSU9OIiwKLSAgICAgICAgICAgICAgICAgICAgIlwiIiArIHByb3BlcnR5ICsgIlwiIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1lcCA9IChTdHJpbmcpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NRVAsCi0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBiaW5kaW5nVHlwZSA9IGF4aXNCaW5kaW5nLmdldFR5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NPQVBfTUVQLmVxdWFsc0lnbm9yZUNhc2UobWVwKSkgewotICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX1JFU1QiLAotICAgICAgICAgICAgICAgICAgICAidHJ1ZSIpKTsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EIiwKLSAgICAgICAgICAgICAgICAgICAgIlwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkhUVFBfTUVUSE9EX0dFVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIikpOwotICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIlwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTUVESUFfVFlQRV9YX1dXV19GT1JNICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKSk7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5NRURJQV9UWVBFX1hfV1dXX0ZPUk0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpKTsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLlNPQVBfUkVTUE9OU0VfTUVQIiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUgIT0gbnVsbCAmJiBiaW5kaW5nVHlwZS5lcXVhbHMoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKSB7Ci0KLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9SRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiKSk7Ci0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbihXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHByb3BlcnR5ICsgIlwiIikpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghV1NETDJDb25zdGFudHMuVVJJX1dTT0FQX01FUC5lcXVhbHNJZ25vcmVDYXNlKG1lcCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBXSFRUUF9NRVRIT0QgZGVmaW5lZCB0aGVuIHdlIGJldHRlciBjb21wdXRlIHRoZSBkZWZhdWx0IHZhbHVlIHdoaWNoIGlzIGdldCBpZiB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgLy8gaXMgd3NkbHg6c2FmZSBvciBwb3N0IG90aGVyd2lzZQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBzYWZlID0gYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXIoV1NETDJDb25zdGFudHMuQVRUUl9XU0RMWF9TQUZFKTsKLSAgICAgICAgICAgICAgICBpZiAoc2FmZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKEJvb2xlYW4pIHNhZmUuZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkhUVFBfTUVUSE9EX0dFVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSFRUUF9NRVRIT0RfUE9TVCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQsCi0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHZhbHVlLmJvb2xlYW5WYWx1ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT0RFLAotICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPREUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHByb3BlcnR5ICsgIlwiIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21PcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSU5QVVRfU0VSSUFMSVpBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBwcm9wZXJ0eSArICJcIiIpKTsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdlbmVyYXRlT3B0aW9uUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBwcm9wZXJ0eSArICJcIiIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2RFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgYXJyYXkgZWxlbWVudHMuCi0gICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0byBiZSBwcm9jZXNzZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcgIiIgaWYgYXJyYXkgaXMgbnVsbCBvciBlbXB0eSwgdGhlIGFycmF5IGVsZW1lbnQgaWYgc2l6ZSBpcyAxLAotICAgICAqIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgd2hlbiBzaXplID4gMS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhcnJheVRvU3RyaW5nKE9iamVjdFtdIGFycmF5KSB7Ci0gICAgICAgIGlmIChhcnJheSA9PSBudWxsIHx8IGFycmF5Lmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNpemUgPSBhcnJheS5sZW5ndGg7Ci0gICAgICAgIGlmIChzaXplID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihhcnJheVswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoU3RyaW5nLnZhbHVlT2YoYXJyYXlbMF0pKTsKLSAgICAgICAgZm9yIChpbnQgaT0xOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChTdHJpbmcudmFsdWVPZihhcnJheVtpXSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRyYW5zZmVyIGNvZGluZyBwcm9wZXJ0eSBvZiB0aGUgaW5wdXQgbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VHJhbnNmZXJDb2RpbmcoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLCBFbGVtZW50IG1ldGhvZEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYykgewotICAgICAgICAvLyBBZGQgYSBvcHRpb25QYXJhbSBlbGVtZW50IHdoaWNoIGhvbGRzIHRoZSB2YWx1ZSBvZiB0cmFuc2ZlckNvZGluZwotICAgICAgICBTdHJpbmcgdHJhbnNmZXJDb2RpbmcgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlKFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKTsKLSAgICAgICAgaWYgKCEiIi5lcXVhbHModHJhbnNmZXJDb2RpbmcpKSB7Ci0gICAgICAgICAgICBpZiAoImd6aXAiLmVxdWFscyh0cmFuc2ZlckNvZGluZykgfHwgImNvbXByZXNzIi5lcXVhbHModHJhbnNmZXJDb2RpbmcpKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZW5lcmF0ZU9wdGlvblBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUNfR1pJUF9SRVFVRVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRodHRwIGhlYWRlciBwcm9wZXJ0aWVzIG5lZWRlZCBmb3IgdGhlIHN0dWIKLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uCi0gICAgICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEh0dHBIZWFkZXJPcHRpb25zKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiwgRWxlbWVudCBtZXRob2RFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgLy8gQWRkIGEgb3B0aW9uUGFyYW0gZWxlbWVudHMgaGVyZQotCi0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgVXRpbCBNZXRob2RzCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgZ2V0RW1wdHlEb2N1bWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd29yZAotICAgICAqIEByZXR1cm4gUmV0dXJucyBjaGFyYWN0ZXIgcmVtb3ZlZCBzdHJpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlSmF2YUNsYXNzTmFtZShTdHJpbmcgd29yZCkgewotICAgICAgICBpZiAoSmF2YVV0aWxzLmlzSmF2YUtleXdvcmQod29yZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBKYXZhVXRpbHMubWFrZU5vbkphdmFLZXl3b3JkKHdvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEphdmFVdGlscy5jYXBpdGFsaXplRmlyc3RDaGFyKEphdmFVdGlscy54bWxOYW1lVG9KYXZhKHdvcmQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGFkZCBhbiBhdHRyaWJ1dGUgdG8gYSBnaXZlbiBlbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIEF0dHJpYk5hbWUKLSAgICAgKiBAcGFyYW0gYXR0cmliVmFsdWUKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIEF0dHJpYk5hbWUsIFN0cmluZyBhdHRyaWJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jdW1lbnQsIEF0dHJpYk5hbWUsIGF0dHJpYlZhbHVlLCBlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHJvb3RFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbFN5bmNBdHRyaWJ1dGVzKERvY3VtZW50IGRvYywgRWxlbWVudCByb290RWxlbWVudCkgewotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaXNBc3luYyIsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNBc3luY09uKCkKLSAgICAgICAgICAgICAgICA/ICIxIgotICAgICAgICAgICAgICAgIDogIjAiLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpc1N5bmMiLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzU3luY09uKCkKLSAgICAgICAgICAgICAgICA/ICIxIgotICAgICAgICAgICAgICAgIDogIjAiLCByb290RWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZGVidWdnaW5nIG1ldGhvZCAtIHdyaXRlIHRoZSBvdXRwdXQgdG8gdGhlIGRlYnVnZ2VyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVidWdMb2dEb2N1bWVudChTdHJpbmcgZGVzY3JpcHRpb24sIERvY3VtZW50IGRvYykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3dyaXRlID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIHN3cml0ZS53cml0ZShkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgc3dyaXRlLndyaXRlKCJcbiIpOwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIm9taXQteG1sLWRlY2xhcmF0aW9uIiwgInllcyIpOwotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChzd3JpdGUpKTsKLQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhzd3JpdGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHNvdXJjZSBmaWxlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRwdXREaXIKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoRmlsZSBvdXRwdXREaXIsIFN0cmluZyBkaXIyKSB7Ci0gICAgICAgIGlmIChkaXIyICE9IG51bGwgJiYgISIiLmVxdWFscyhkaXIyKSkgewotICAgICAgICAgICAgb3V0cHV0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyLCBkaXIyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ly8kTk9OLVNFQy0zCi0gICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ly8kTk9OLVNFQy0yCi0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBvdXRwdXREaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSByZXN1c2FibGUgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiB3cml0aW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKERvY3VtZW50IG1vZGVsLCBGaWxlV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICB3cml0ZXIubG9hZFRlbXBsYXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbW9kZWwuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJwYWNrYWdlIik7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtb2RlbC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLQotICAgICAgICB3cml0ZXIuY3JlYXRlT3V0RmlsZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLQotICAgICAgICAvLyB1c2UgdGhlIGdsb2JhbCByZXNvbHZlcgotICAgICAgICB3cml0ZXIucGFyc2UobW9kZWwsIHJlc29sdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBzb2FwIGFjdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSByb290RWxlbWVudAotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFNPQVBBY3Rpb24oRG9jdW1lbnQgZG9jLCBFbGVtZW50IHJvb3RFbGVtZW50LCBRTmFtZSBxTmFtZSkgewotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic29hcGFjdGlvbiIsCi0gICAgICAgICAgICAgICAgKFN0cmluZykgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU9wZXJhdGlvbihXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0FDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lKSwKLSAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgb3V0cHV0IGFuZCBmYXVsdCBhY3Rpb25zCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZE91dHB1dEFuZEZhdWx0QWN0aW9ucyhEb2N1bWVudCBkb2MsIEVsZW1lbnQgbWV0aG9kRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvdXRwdXRBY3Rpb24gPSBvcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCk7Ci0gICAgICAgIGlmIChvdXRwdXRBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCBvdXRwdXRBY3Rpb25FbHQgPQotICAgICAgICAgICAgICAgICAgICBkb2MuY3JlYXRlRWxlbWVudChvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5PVVRQVVRfQUNUSU9OX01BUFBJTkcpOwotICAgICAgICAgICAgb3V0cHV0QWN0aW9uRWx0LnNldEF0dHJpYnV0ZShBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04sIG91dHB1dEFjdGlvbik7Ci0gICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKG91dHB1dEFjdGlvbkVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBmYXVsdEFjdGlvbk5hbWVzID0gb3BlcmF0aW9uLmdldEZhdWx0QWN0aW9uTmFtZXMoKTsKLSAgICAgICAgaWYgKGZhdWx0QWN0aW9uTmFtZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdEFjdGlvbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBmYXVsdEFjdGlvbkVsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2MuY3JlYXRlRWxlbWVudChvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5GQVVMVF9BQ1RJT05fTUFQUElORyk7Ci0gICAgICAgICAgICAgICAgZmF1bHRBY3Rpb25FbHQuc2V0QXR0cmlidXRlKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRBY3Rpb25OYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRBY3Rpb25FbHQuc2V0QXR0cmlidXRlKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRGYXVsdEFjdGlvbihmYXVsdEFjdGlvbk5hbWVzW2ldKSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChmYXVsdEFjdGlvbkVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwb3B1bGF0ZSB0aGUgaGVhZGVyIHBhcmFtZXRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwSGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0Ci0gICAgICogQHBhcmFtIGJpbmRpbmdPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gaW5wdXQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRIZWFkZXJPcGVyYXRpb25zKExpc3Qgc29hcEhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlucHV0KSB7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIEFycmF5TGlzdCBoZWFkZXJwYXJhbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgaWYgKGlucHV0KSB7Ci0gICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAoTUVQKSkgewotCi0gICAgICAgICAgICAgICAgaGVhZGVycGFyYW1MaXN0ID0gKEFycmF5TGlzdCkgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0hFQURFUiwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKE1FUCkpIHsKLSAgICAgICAgICAgICAgICBoZWFkZXJwYXJhbUxpc3QgPSAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSLCBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXJwYXJhbUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGhlYWRlcnBhcmFtTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlclBhcmFtZXRlclFOYW1lTGlzdC5hZGQoaGVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogcG9wdWxhdGUgdGhlIGhlYWRlciBwYXJhbWV0ZXJzIHRvIGZhdWx0cwotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBIZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QKLSAgICAgKiBAcGFyYW0gYXhpc09wZXJhdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZEhlYWRlck9wZXJhdGlvbnNUb0ZhdWx0KExpc3Qgc29hcEhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgQXJyYXlMaXN0IGhlYWRlcnBhcmFtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IGZhdWx0TWVzc2FnZXMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGZhdWx0TWVzc2FnZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzRmF1bHRNZXNzYWdlID0gKEF4aXNNZXNzYWdlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGhlYWRlcnBhcmFtTGlzdC5hZGRBbGwoKEFycmF5TGlzdCkgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2VGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9IRUFERVIsIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHRNZXNzYWdlLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlcnBhcmFtTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaGVhZGVycGFyYW1MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIgPSAoU09BUEhlYWRlck1lc3NhZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LmFkZChoZWFkZXIuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbnB1dCBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIGJpbmRpbmdPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0Ci0gICAgICogQHJldHVybiBET00gZWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldElucHV0RWxlbWVudChEb2N1bWVudCBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0KSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIEVsZW1lbnQgaW5wdXRFbHQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgICAgU3RyaW5nIG1lcCA9IG9wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0KLSAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG1lcCkpIHsKLQotICAgICAgICAgICAgRWxlbWVudFtdIHBhcmFtID0gZ2V0SW5wdXRQYXJhbUVsZW1lbnQoZG9jLCBvcGVyYXRpb24pOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlucHV0RWx0LmFwcGVuZENoaWxkKHBhcmFtW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBwYXJhbWV0ZXJFbGVtZW50TGlzdCA9IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0KGRvYywgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLlNPQVBfSEVBREVSKTsKLSAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnRMaXN0LmFkZEFsbChnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdEZvckh0dHBIZWFkZXIoZG9jLAotICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTiksCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSFRUUF9IRUFERVIpKTsKLSAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnRMaXN0LmFkZEFsbChnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdEZvclNPQVBNb2R1bGVzKGRvYywKLSAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdCkgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4pKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyRWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnB1dEVsdC5hcHBlbmRDaGlsZCgoRWxlbWVudCkgcGFyYW1ldGVyRWxlbWVudExpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogU2V0dGluZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBvZiBpbnB1dCBtZXNzYWdlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IGdldEJpbmRpbmdQb2xpY3lGcm9tTWVzc2FnZShiaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicG9saWN5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lVdGlsLmdldFNhZmVTdHJpbmcoUG9saWN5VXRpbC5wb2xpY3lDb21wb25lbnRUb1N0cmluZyhwb2xpY3kpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVsdCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjYW4ndCBzZXJpYWxpemUgdGhlIHBvbGljeSAuLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnB1dEVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZhdWx0IGVsZW1lbnQgLSBObyBoZWFkZXIgZmF1bHRzIGFyZSBzdXBwb3J0ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0RmF1bHRFbGVtZW50KERvY3VtZW50IGRvYywgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgICAgICAgRWxlbWVudCBmYXVsdEVsdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJmYXVsdCIpOwotICAgICAgICBFbGVtZW50W10gcGFyYW0gPSBnZXRGYXVsdFBhcmFtRWxlbWVudHMoZG9jLCBvcGVyYXRpb24pOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZhdWx0RWx0LmFwcGVuZENoaWxkKHBhcmFtW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYXVsdEVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyB0aGUgb3V0cHV0IGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIGJpbmRpbmdPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0T3V0cHV0RWxlbWVudChEb2N1bWVudCBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QpIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgRWxlbWVudCBvdXRwdXRFbHQgPSBkb2MuY3JlYXRlRWxlbWVudCgib3V0cHV0Iik7Ci0gICAgICAgIFN0cmluZyBtZXAgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotCi0KLSAgICAgICAgaWYgKFdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChtZXApKSB7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgcGFyYW0gPSBnZXRPdXRwdXRQYXJhbUVsZW1lbnQoZG9jLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dHB1dEVsdC5hcHBlbmRDaGlsZChwYXJhbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Qgb3V0cHV0RWxlbWVudExpc3QgPSBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdChkb2MsIGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5TT0FQX0hFQURFUik7Ci0gICAgICAgICAgICBvdXRwdXRFbGVtZW50TGlzdC5hZGRBbGwoZ2V0UGFyYW1ldGVyRWxlbWVudExpc3RGb3JIdHRwSGVhZGVyKGRvYywKLSAgICAgICAgICAgICAgICAgICAgKEFycmF5TGlzdCkgZ2V0QmluZGluZ1Byb3BlcnR5RnJvbU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9IRUFERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUKSwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5IVFRQX0hFQURFUikpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dEVsZW1lbnRMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RWx0LmFwcGVuZENoaWxkKChFbGVtZW50KSBvdXRwdXRFbGVtZW50TGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBTZXR0aW5nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGZvciB0aGUgb3V0cHV0IG1lc3NhZ2UuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IGdldEJpbmRpbmdQb2xpY3lGcm9tTWVzc2FnZShiaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBvbGljeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5VXRpbC5nZXRTYWZlU3RyaW5nKFBvbGljeVV0aWwucG9saWN5Q29tcG9uZW50VG9TdHJpbmcocG9saWN5KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RWx0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbid0IHNlcmlhbGl6ZSB0aGUgcG9saWN5IC4uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXRwdXRFbHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtZXRlciBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50W10gZ2V0RmF1bHRQYXJhbUVsZW1lbnRzKERvY3VtZW50IGRvYywgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24pIHsKLSAgICAgICAgQXJyYXlMaXN0IHBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IGZhdWx0TWVzc2FnZXMgPSBvcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpOwotCi0gICAgICAgIGlmIChmYXVsdE1lc3NhZ2VzICE9IG51bGwgJiYgIWZhdWx0TWVzc2FnZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBFbGVtZW50IHBhcmFtRWxlbWVudDsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1zZzsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRNZXNzYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICAgICAgICAgIG1zZyA9IChBeGlzTWVzc2FnZSkgZmF1bHRNZXNzYWdlcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobXNnLmdldEVsZW1lbnRRTmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVsZW1lbnQgUU5hbWUgaXMgbnVsbCBmb3IgIiArIG1zZy5nZXROYW1lKCkgKyAiISIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vYXMgZm9yIHRoZSBuYW1lIG9mIGEgZmF1bHQsIHdlIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdENvbW1lbnQgPSAiIjsKLSAgICAgICAgICAgICAgICBpZiAobXNnLmdldERvY3VtZW50YXRpb24oKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRDb21tZW50ID0gbXNnLmdldERvY3VtZW50YXRpb24oKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjb21tZW50IiwgZmF1bHRDb21tZW50LCBwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZ1bGx5UXVhbGlmaWVkRmF1bHRDbGFzc05hbWVNYXAuZ2V0KG1zZy5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2hvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZhdWx0Q2xhc3NOYW1lTWFwLmdldChtc2cuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggdGhlIG5hbWVzcGFjZSBhbmQgdGhlIGxvY2FsTmFtZQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmdldEVsZW1lbnRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRFbGVtZW50UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobXNnLmdldEVsZW1lbnRRTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBxTmFtZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicW5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5zdXJpIiwgbXNnLmdldEVsZW1lbnRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxuYW1lIiwgbXNnLmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQuYXBwZW5kQ2hpbGQocU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy90aGUgdHlwZSByZXByZXNlbnRzIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGJ5IHRoaXMKLSAgICAgICAgICAgICAgICAvL25hbWUKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKG1zZy5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAodHlwZU1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwZU1hcHBpbmcsIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAvL2FkZCB0aGUgc2hvcnQgbmFtZQotICAgICAgICAgICAgICAgIGFkZFNob3J0VHlwZShwYXJhbUVsZW1lbnQsIChtc2cuZ2V0RWxlbWVudFFOYW1lKCkgPT0gbnVsbCkgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5nZXRFbGVtZW50UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmliVmFsdWUgPSAoU3RyaW5nKSBpbnN0YW50aWF0YWJsZU1lc3NhZ2VDbGFzc05hbWVzLgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KG1zZy5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImluc3RhbnRpYXRhYmxlVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJWYWx1ZSA9PSBudWxsID8gIiIgOiBhdHRyaWJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMKLSAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgIGlmIChtYXBwZXIuZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkuZXF1YWxzKHR5cGVNYXBwaW5nKSkgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGVmYXVsdCIsICJ5ZXMiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBnZXRQYXJhbUluaXRpYWxpemVyKHR5cGVNYXBwaW5nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbXNnLmdldEV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBleHRlbnNpYmlsaXR5IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFyYW1zLmFkZChwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKEVsZW1lbnRbXSkgcGFyYW1zLnRvQXJyYXkobmV3IEVsZW1lbnRbcGFyYW1zLnNpemUoKV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50W117fTsvL3JldHVybiBlbXB0eSBhcnJheQotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtZXRlciBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50W10gZ2V0SW5wdXRQYXJhbUVsZW1lbnQoRG9jdW1lbnQgZG9jLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCi0gICAgICAgIEF4aXNNZXNzYWdlIGlucHV0TWVzc2FnZSA9IG9wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIExpc3QgcGFyYW1FbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGlucHV0TWVzc2FnZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlICB3cmFwcGVkIGNvbXBvbmVudCAtIGFkZCB0aGUgdHlwZSBtYXBwaW5nCi0gICAgICAgICAgICBFbGVtZW50IG1haW5QYXJhbWV0ZXIgPSBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0UGFyYW1ldGVyTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICBpbnB1dE1lc3NhZ2UuZ2V0UGFydE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UsZmFsc2UKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIHBhcmFtRWxlbWVudExpc3QuYWRkKG1haW5QYXJhbWV0ZXIpOwotCi0gICAgICAgICAgICAvL2lmIHRoZSB1bndyYXBwaW5nIG9yIGJhY2tXb3JkQ29tcGF0aWJpbGl0eSBmbGFnIGlzIG9uIHRoZW4gd2UgaGF2ZSB0bwotICAgICAgICAgICAgLy9wdXQgdGhlIGVsZW1lbnQgY29tcGxleCB0eXBlIGlmIGl0IGV4aXRzCi0gICAgICAgICAgICBpZiAodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc0JhY2t3b3JkQ29tcGF0aWJpbGl0eU1vZGUoKSB8fAotICAgICAgICAgICAgICAgICAgICAhdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ09NUExFWF9UWVBFKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBpbnB1dE1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5DT01QTEVYX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiY29tcGxleHR5cGUiLCAoU3RyaW5nKSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKSwgbWFpblBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2FkZGVkIHRoZSB1bndhcHBhcmFtZXRlcnMgYXR0cmlidXRlIHRoaXMgaXMgdXNlIGZ1bGwgdG8gdW53cmFwIGlmIHBhcmFtZXJ0ZXJzIGFyZQotICAgICAgICAgICAgLy96ZXJvCi0gICAgICAgICAgICBpZiAoIXRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNQYXJhbWV0ZXJzV3JhcHBlZCgpKXsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidW53cmFwcFBhcmFtZXRlcnMiLCAidHJ1ZSIsIG1haW5QYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB0aGlzIG1lc3NhZ2UgaGFzIGJlZW4gdW53cmFwcGVkIC0gZmluZCB0aGUgY29ycmVjdCByZWZlcmVuY2VzIG9mIHRoZQotICAgICAgICAgICAgLy8gdGhlIG1lc3NhZ2UgYnkgbG9va2luZyBhdCB0aGUgdW53cmFwcGVkIGRldGFpbHMgb2JqZWN0IGFuZCBhdHRhY2ggdGhlCi0gICAgICAgICAgICAvLyBuZWVkZWQgcGFyYW1ldGVycyBpbnNpZGUgbWFpbiBwYXJhbWV0ZXIgZWxlbWVudAotICAgICAgICAgICAgaWYgKGlucHV0TWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGlzIHVud3JhcHBlZCBlYXJsaWVyLiBnZXQgdGhlIGluZm8gaG9sZGVyCi0gICAgICAgICAgICAgICAgLy9hbmQgdGhlbiBsb29rIGF0IHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGRldGFpbHNQYXJhbWV0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgaW5mb0hvbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcikgZGV0YWlsc1BhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIExpc3QgcGFydHNMaXN0ID0gaW5mb0hvbGRlci5nZXRQYXJ0c0xpc3QoKTsKLSAgICAgICAgICAgICAgICB3cmFwcGVkX2pheHdzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBwYXJ0cyBsaXN0IC0gdGhpcyBsaXN0IGlzIG5lZWRlZCB0byBnZW5lcmF0ZSBtdWx0aXBsZQotICAgICAgICAgICAgICAgIC8vcGFyYW1ldGVycyBpbiB0aGUgc2lnbmF0dXJlcwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHNMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gKFFOYW1lKSBwYXJ0c0xpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBtYWluUGFyYW1ldGVyLmFwcGVuZENoaWxkKGdlbmVyYXRlUGFyYW1Db21wb25lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFBhcmFtZXRlck5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubWFwcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VHlwZU1hcHBpbmdTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lKSkpCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKEVsZW1lbnRbXSkgcGFyYW1FbGVtZW50TGlzdC50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50W3BhcmFtRWxlbWVudExpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb252ZW5pZW50IG1ldGhvZCBmb3IgdGhlIGdlbmVyYXRpbmcgdGhlIHBhcmFtZXRlciBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHBhcmFtTmFtZQotICAgICAqIEBwYXJhbSBwYXJhbVR5cGUKLSAgICAgKiBAcmV0dXJuIERPTSBFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2VuZXJhdGVQYXJhbUNvbXBvbmVudChEb2N1bWVudCBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJhbVFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KGRvYywgcGFyYW1OYW1lLCBwYXJhbVR5cGUsIG9wZXJhdGlvbk5hbWUsIHBhcmFtUU5hbWUsIG51bGwsCi0gICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNvbnZlbmllbnQgbWV0aG9kIGZvciB0aGUgZ2VuZXJhdGluZyB0aGUgcGFyYW1ldGVyIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gcGFyYW1OYW1lCi0gICAgICogQHBhcmFtIHBhcmFtVHlwZQotICAgICAqIEByZXR1cm4gRE9NIEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVQYXJhbUNvbXBvbmVudChkb2MsIHBhcmFtTmFtZSwgcGFyYW1UeXBlLCBudWxsLCBwYXJhbVFOYW1lLCBudWxsLCBmYWxzZSwKLSAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjb252ZW5pZW50IG1ldGhvZCBmb3IgdGhlIGdlbmVyYXRpbmcgb3B0aW9uUGFyYW0gY29tcG9uZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybiBFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2VuZXJhdGVPcHRpb25QYXJhbUNvbXBvbmVudChEb2N1bWVudCBkb2MsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQotICAgICAgICBFbGVtZW50IG9wdGlvblBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvcHRpb25QYXJhbSIpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIG5hbWUsIG9wdGlvblBhcmFtRWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIHZhbHVlLCBvcHRpb25QYXJhbUVsZW1lbnQpOwotICAgICAgICByZXR1cm4gb3B0aW9uUGFyYW1FbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY29udmVuaWVudCBtZXRob2QgZm9yIHRoZSBnZW5lcmF0aW5nIHRoZSBwYXJhbWV0ZXIgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlCi0gICAgICogQHBhcmFtIG9wTmFtZQotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQcmltaXRpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXkpIHsKLSAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLAotICAgICAgICAgICAgICAgIHBhcmFtTmFtZSwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS5lcXVhbHMoImpheC13cyIpICYmIHVzZUhvbGRlckNsYXNzX2pheHdzKSB7Ci0gICAgICAgICAgICBDbGFzcyBwcmltaXRpdmUgPSBKYXZhVXRpbHMuZ2V0V3JhcHBlckNsYXNzKHBhcmFtVHlwZSk7Ci0gICAgICAgICAgICBpZihwcmltaXRpdmUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgcGFyYW1UeXBlID0gcHJpbWl0aXZlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwKLSAgICAgICAgICAgICAgICAocGFyYW1UeXBlID09IG51bGwpID8gIiIgOiBwYXJhbVR5cGUsCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAvL2FkZHMgdGhlIHNob3J0IHR5cGUKLSAgICAgICAgYWRkU2hvcnRUeXBlKHBhcmFtRWxlbWVudCwgKHBhcmFtUU5hbWUgPT0gbnVsbCkgPyBudWxsIDogcGFyYW1RTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgLy8gYWRkIGFuIGV4dHJhIGF0dHJpYnV0ZSB0byBzYXkgd2hldGhlciB0aGUgdHlwZSBtYXBwaW5nIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgIGlmIChtYXBwZXIuZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkuZXF1YWxzKHBhcmFtVHlwZSkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgZ2V0UGFyYW1Jbml0aWFsaXplcihwYXJhbVR5cGUpLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICAvLyBhZGQgdGhpcyBhcyBhIGJvZHkgcGFyYW1ldGVyCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsICJib2R5IiwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAvL2lmIHRoZSBvcE5hbWUgYW5kIHBhcnROYW1lIGFyZSBwcmVzZW50ICwgYWRkIHRoZW0KLSAgICAgICAgaWYgKG9wTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gb3BOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm9wbmFtZSIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhKGxvY2FsUGFydCksIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1RTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IHFOYW1lRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJxbmFtZSIpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5zdXJpIiwgcGFyYW1RTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbG5hbWUiLCBwYXJhbVFOYW1lLmdldExvY2FsUGFydCgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgcGFyYW1FbGVtZW50LmFwcGVuZENoaWxkKHFOYW1lRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFydE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGphdmFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaXNKYXZhS2V5d29yZChwYXJ0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBqYXZhTmFtZSA9IEphdmFVdGlscy5tYWtlTm9uSmF2YUtleXdvcmQocGFydE5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS5lcXVhbHMoImpheC13cyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFOYW1lID0gSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKEphdmFVdGlscy54bWxOYW1lVG9KYXZhKHBhcnROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YU5hbWUgPSBKYXZhVXRpbHMuY2FwaXRhbGl6ZUZpcnN0Q2hhcihKYXZhVXRpbHMueG1sTmFtZVRvSmF2YShwYXJ0TmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYXJ0bmFtZSIsIGphdmFOYW1lLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzUHJpbWl0aXZlKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicHJpbWl0aXZlIiwgInllcyIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNBcnJheSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImFycmF5IiwgInllcyIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1FbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICogQHJldHVybiBSZXR1cm5zIEVsZW1lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgICBnZXRPdXRwdXRQYXJhbUVsZW1lbnQoRG9jdW1lbnQgZG9jLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBFbGVtZW50IHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBBeGlzTWVzc2FnZSBvdXRwdXRNZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgIFN0cmluZyB0eXBlTWFwcGluZ1N0cjsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWU7Ci0KLSAgICAgICAgaWYgKG91dHB1dE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IHRoaXMubWFwcGVyLmdldFBhcmFtZXRlck5hbWUob3V0cHV0TWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUob3V0cHV0TWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICB0eXBlTWFwcGluZ1N0ciA9ICh0eXBlTWFwcGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgIDogdHlwZU1hcHBpbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gIiI7Ci0gICAgICAgICAgICB0eXBlTWFwcGluZ1N0ciA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBwYXJhbWV0ZXJOYW1lLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsIHR5cGVNYXBwaW5nU3RyLCBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIC8vYWRkcyB0aGUgc2hvcnQgdHlwZQotICAgICAgICBhZGRTaG9ydFR5cGUocGFyYW1FbGVtZW50LAotICAgICAgICAgICAgICAgIChvdXRwdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpID09IG51bGwpID8gbnVsbCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAvLyBhZGQgYW4gZXh0cmEgYXR0cmlidXRlIHRvIHNheSB3aGV0aGVyIHRoZSB0eXBlIG1hcHBpbmcgaXMgdGhlIGRlZmF1bHQKLSAgICAgICAgaWYgKG1hcHBlci5nZXREZWZhdWx0TWFwcGluZ05hbWUoKS5lcXVhbHModHlwZU1hcHBpbmdTdHIpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiZGVmYXVsdCIsICJ5ZXMiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHRoaXMgYXMgYSBib2R5IHBhcmFtZXRlcgotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYXRpb24iLCAiYm9keSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBvcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3BuYW1lIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmEobG9jYWxQYXJ0KSwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAvL2lmIHRoZSB1bndyYXBwaW5nIG9yIGJhY2tXb3JkQ29tcGF0aWJpbGl0eSBmbGFnIGlzIG9uIHRoZW4gd2UgaGF2ZSB0bwotICAgICAgICAvL3B1dCB0aGUgZWxlbWVudCBjb21wbGV4IHR5cGUgaWYgaXQgZXhpdHMKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNCYWNrd29yZENvbXBhdGliaWxpdHlNb2RlKCkgfHwKLSAgICAgICAgICAgICAgICAhdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhcmFtZXRlcnNXcmFwcGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChvdXRwdXRNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ09NUExFWF9UWVBFKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG91dHB1dE1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5DT01QTEVYX1RZUEUpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJjb21wbGV4dHlwZSIsIChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IG91dHB1dE1lc3NhZ2UuZ2V0UGFydE5hbWUoKTsKLSAgICAgICAgaWYgKHBhcnROYW1lICE9IG51bGwgJiYgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS5lcXVhbHMoImpheC13cyIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YU5hbWUgPSBudWxsOwotICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc0phdmFLZXl3b3JkKHBhcnROYW1lKSkgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gSmF2YVV0aWxzLm1ha2VOb25KYXZhS2V5d29yZChwYXJ0TmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGphdmFOYW1lID0gSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKEphdmFVdGlscy54bWxOYW1lVG9KYXZhKHBhcnROYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFydG5hbWUiLCBqYXZhTmFtZSwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgbWVzc2FnZSBoYXMgYmVlbiB1bndyYXBwZWQgLSBmaW5kIHRoZSBjb3JyZWN0IHJlZmVyZW5jZXMgb2YgdGhlCi0gICAgICAgIC8vIHRoZSBtZXNzYWdlIGJ5IGxvb2tpbmcgYXQgdGhlIHVud3JhcHBlZCBkZXRhaWxzIG9iamVjdCBhbmQgYXR0YWNoIHRoZQotICAgICAgICAvLyBuZWVkZWQgcGFyYW1ldGVycyBpbnNpZGUgbWFpbiBwYXJhbWV0ZXIgZWxlbWVudAotICAgICAgICBpZiAob3V0cHV0TWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy93ZSBoYXZlIHRoaXMgdW53cmFwcGVkIGVhcmxpZXIuIGdldCB0aGUgaW5mbyBob2xkZXIKLSAgICAgICAgICAgIC8vYW5kIHRoZW4gbG9vayBhdCB0aGUgcGFyYW1ldGVycwotICAgICAgICAgICAgUGFyYW1ldGVyIGRldGFpbHNQYXJhbWV0ZXIgPQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMpOwotICAgICAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBpbmZvSG9sZGVyID0KLSAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIpIGRldGFpbHNQYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIExpc3QgcGFydHNMaXN0ID0gaW5mb0hvbGRlci5nZXRQYXJ0c0xpc3QoKTsKLQotICAgICAgICAgICAgLy9wb3B1bGF0ZSB0aGUgcGFydHMgbGlzdCAtIHRoaXMgbGlzdCBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgbXVsdGlwbGUKLSAgICAgICAgICAgIC8vcGFyYW1ldGVycyBpbiB0aGUgc2lnbmF0dXJlcwotICAgICAgICAgICAgLy8gaW4gb3V0IHB1dCBwYXJhbXMgd2Ugb25seSBpbnRlcnN0ZWQgaWYgdGhlcmUgaXMgb25seSBvbmUgcGFyYW1ldGVyCi0gICAgICAgICAgICAvLyBvdGhlcndpc2Ugd2UgY2FuIG5vdCB1bndyYXAgaXQuCi0gICAgICAgICAgICAvLyB0aGlzIGxvZ2ljIGhhbmRsZXMgYXQgdGhlIHRlbXBsYXRlIGxldmVsCi0gICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBudWxsOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGFydHNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHFOYW1lID0gKFFOYW1lKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBwYXJhbUVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2VuZXJhdGVQYXJhbUNvbXBvbmVudChkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHBlci5nZXRQYXJhbWV0ZXJOYW1lKHFOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lKSAhPSBudWxsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUlJBWV9UWVBFLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdTdGF0dXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUpKSkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBRTmFtZSBwYXJhbVFOYW1lID0gb3V0cHV0TWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICAgICAgaWYgKHBhcmFtUU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgRWxlbWVudCBxTmFtZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicW5hbWUiKTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuc3VyaSIsIHBhcmFtUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxuYW1lIiwgcGFyYW1RTmFtZS5nZXRMb2NhbFBhcnQoKSwgcU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgIHBhcmFtRWxlbWVudC5hcHBlbmRDaGlsZChxTmFtZUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJhbUluaXRpYWxpemVyKFN0cmluZyBwYXJhbVR5cGUpIHsKLQotICAgICAgICAvLyBMb29rIHVwIHBhcmFtVHlwZSBpbiB0aGUgdGFibGUKLSAgICAgICAgU3RyaW5nIG91dCA9IChTdHJpbmcpIGNvbnN0cnVjdG9yTWFwLmdldChwYXJhbVR5cGUpOwotCi0gICAgICAgIGlmIChvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0ID0gIm51bGwiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdChEb2N1bWVudCBkb2MsIExpc3QgcGFyYW1ldGVycywgU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIExpc3QgcGFyYW1ldGVyRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKChwYXJhbWV0ZXJzICE9IG51bGwpICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyYW1ldGVycy5zaXplKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgcGFyYW0gPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIgPSAoU09BUEhlYWRlck1lc3NhZ2UpIHBhcmFtZXRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIFFOYW1lIG5hbWUgPSBoZWFkZXIuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCB0aGlzLm1hcHBlci5nZXRQYXJhbWV0ZXJOYW1lKG5hbWUpLCBwYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nU3RyID0gKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVNYXBwaW5nOwotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCB0eXBlTWFwcGluZ1N0ciwgcGFyYW0pOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsIGxvY2F0aW9uLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlci5pc011c3RVbmRlcnN0YW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm11c3RVbmRlcnN0YW5kIiwgInRydWUiLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHFOYW1lRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJxbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibnN1cmkiLCBuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYWxuYW1lIiwgbmFtZS5nZXRMb2NhbFBhcnQoKSwgcU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uYXBwZW5kQ2hpbGQocU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkKHBhcmFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRWxlbWVudExpc3Q7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdEZvckh0dHBIZWFkZXIoRG9jdW1lbnQgZG9jLCBMaXN0IHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbikgewotCi0KLSAgICAgICAgTGlzdCBwYXJhbWV0ZXJFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoKHBhcmFtZXRlcnMgIT0gbnVsbCkgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICAgICAgICAgIEhUVFBIZWFkZXJNZXNzYWdlIGh0dHBIZWFkZXJNZXNzYWdlID0gKEhUVFBIZWFkZXJNZXNzYWdlKSBwYXJhbWV0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IGh0dHBIZWFkZXJNZXNzYWdlLmdldHFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBodHRwSGVhZGVyTWVzc2FnZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1c2UgbmFtZSBhcyB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKG5hbWUpLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgLy8gaGVhZGVyIG5hbWUgaXMgdG8gc2V0IHRoZSBoZWFkZXIgdmFsdWUKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAiaGVhZGVybmFtZSIsIG5hbWUsIHBhcmFtKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZyA9IHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZShxTmFtZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nU3RyID0gKHR5cGVNYXBwaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVNYXBwaW5nOwotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCB0eXBlTWFwcGluZ1N0ciwgcGFyYW0pOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsIGxvY2F0aW9uLCBwYXJhbSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkKHBhcmFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJFbGVtZW50TGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdEZvclNPQVBNb2R1bGVzKERvY3VtZW50IGRvYywgTGlzdCBwYXJhbWV0ZXJzKSB7Ci0KLSAgICAgICAgTGlzdCBwYXJhbWV0ZXJFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoKHBhcmFtZXRlcnMgIT0gbnVsbCkgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBwYXJhbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICAgICAgICAgIFNPQVBNb2R1bGVNZXNzYWdlIHNvYXBNb2R1bGVNZXNzYWdlID0gKFNPQVBNb2R1bGVNZXNzYWdlKSBwYXJhbWV0ZXJzLmdldChpKTsKLQotICAgICAgICAgICAgICAgIC8vIGhlYWRlciBuYW1lIGlzIHRvIHNldCB0aGUgaGVhZGVyIHZhbHVlCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInVyaSIsIHNvYXBNb2R1bGVNZXNzYWdlLmdldFVyaSgpLCBwYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYXRpb24iLCAid3NvYXBfbW9kdWxlIiwgcGFyYW0pOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnRMaXN0LmFkZChwYXJhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyRWxlbWVudExpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gYWRkIGFuIGF0dHJpYnV0ZSB0byBhIGdpdmVuIGVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gZWx0TmFtZQotICAgICAqIEBwYXJhbSBlbHRWYWx1ZQotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgYWRkRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVsdE5hbWUsIFN0cmluZyBlbHRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBFbGVtZW50IGVsdCA9IFhTTFRVdGlscy5hZGRDaGlsZEVsZW1lbnQoZG9jdW1lbnQsIGVsdE5hbWUsIGVsZW1lbnQpOwotICAgICAgICBpZiAoZWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgZWx0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVsdFZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9DRW1pdHRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9DRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNThkMWQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvQ0VtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuSFRUUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLlNPQVBIZWFkZXJNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DQnVpbGRTY3JpcHRXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNTZXJ2aWNlWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU2tlbEhlYWRlcldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1NrZWxTb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkNTdHViSGVhZGVyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5DU3R1YlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuQ1N2Y1NrZWxldG9uV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5GaWxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5DVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgQ0VtaXR0ZXIgZXh0ZW5kcyBBeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfU1RVQl9QUkVGSVggPSAiYXhpczJfc3R1Yl8iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfU0tFTF9QUkVGSVggPSAiYXhpczJfc2tlbF8iOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfU1ZDX1NLRUxfUFJFRklYID0gImF4aXMyX3N2Y19za2VsXyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TVFVCX1NVRkZJWCA9ICIiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfU0tFTF9TVUZGSVggPSAiIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDX1NWQ19TS0VMX1NVRkZJWCA9ICIiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9ERUZBVUxUX1RZUEUgPSAib3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENfREVGQVVMVF9UWVBFID0gImF4aW9tX25vZGVfdCoiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19PVVJfVFlQRV9QUkVGSVggPSAiYXhpczJfIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDX09VUl9UWVBFX1NVRkZJWCA9ICJfdCoiOwotCi0gICAgLyoqCi0gICAgICogRW1pdCB0aGUgc3R1YgotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVtaXRTdHViKCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gd3JpdGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9ucwotICAgICAgICAgICAgd3JpdGVDU3R1YigpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2xvZyB0aGUgZXJyb3IgaGVyZQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBFbWl0IHRoZSBza2VsdG9ucwotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVtaXRTa2VsZXRvbigpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB3cml0ZSBza2VsZXRvbgotICAgICAgICAgICAgd3JpdGVDU2tlbCgpOwotCi0gICAgICAgICAgICAvLyB3cml0ZSBhIFNlcnZpY2UgU2tlbGV0b24gZm9yIHRoaXMgcGFydGljdWxhciBzZXJ2aWNlLgotICAgICAgICAgICAgd3JpdGVDU2VydmljZVNrZWxldG9uKCk7Ci0gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgYnVpbGQgc2NyaXB0Ci0gICAgICAgICAgICBlbWl0QnVpbGRTY3JpcHQoKTsKLQotICAgICAgICAgICAgd3JpdGVTZXJ2aWNlWG1sKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogRW1pdCB0aGUgYnVpbGQgc2NyaXB0Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW1pdEJ1aWxkU2NyaXB0KCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCXdyaXRlQnVpbGRTY3JpcHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgU3R1Yi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDU3R1YigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGZpcnN0IGNoZWNrIGZvciB0aGUgcG9saWNpZXMgaW4gdGhpcyBzZXJ2aWNlIGFuZCB3cml0ZSB0aGVtCi0gICAgICAgIERvY3VtZW50IGludGVyZmFjZUltcGxNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9ySW50ZXJmYWNlSW1wbGVtZW50YXRpb24oKTsKLQotICAgICAgICBDU3R1YkhlYWRlcldyaXRlciB3cml0ZXJIU3R1YiA9Ci0gICAgICAgICAgICAgICAgbmV3IENTdHViSGVhZGVyV3JpdGVyKGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlRmlsZShpbnRlcmZhY2VJbXBsTW9kZWwsIHdyaXRlckhTdHViKTsKLSAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgQ1N0dWJTb3VyY2VXcml0ZXIgd3JpdGVyQ1N0dWIgPQotICAgICAgICAgICAgICAgIG5ldyBDU3R1YlNvdXJjZVdyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICB3cml0ZUZpbGUoaW50ZXJmYWNlSW1wbE1vZGVsLCB3cml0ZXJDU3R1Yik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgU2tlbC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDU2tlbCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERvY3VtZW50IHNrZWxldG9uTW9kZWwgPQotICAgICAgICAgICAgICAgIGNyZWF0ZURPTURvY3VtZW50Rm9yU2tlbGV0b24oY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkpOwotCi0KLSAgICAgICAgQ1NrZWxIZWFkZXJXcml0ZXIgc2tlbGV0b25Xcml0ZXIgPSBuZXcgQ1NrZWxIZWFkZXJXcml0ZXIoCi0gICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICB3cml0ZUZpbGUoc2tlbGV0b25Nb2RlbCwgc2tlbGV0b25Xcml0ZXIpOwotCi0gICAgICAgIENTa2VsU291cmNlV3JpdGVyIHNrZWxldG9uV3JpdGVyU3R1YiA9IG5ldyBDU2tlbFNvdXJjZVdyaXRlcigKLSAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCBza2VsZXRvbldyaXRlclN0dWIpOwotICAgIH0KLQotICAgIC8qKiBAdGhyb3dzIEV4Y2VwdGlvbiAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUNTZXJ2aWNlU2tlbGV0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEb2N1bWVudCBza2VsZXRvbk1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlU2tlbGV0b25YTUwoKTsKLSAgICAgICAgQ1N2Y1NrZWxldG9uV3JpdGVyIHdyaXRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IENTdmNTa2VsZXRvbldyaXRlcihnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCB3cml0ZXIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIEJ1aWxkIFNjcmlwdAotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQnVpbGRTY3JpcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigpKSB7Ci0KLSAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBzZXJ2aWNlIHhtbCBpbiBhIGZvbGRlciB3aXRoIHRoZQotICAgICAgICAgICAgRG9jdW1lbnQgYnVpbGRYTUxNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yQnVpbGRTY3JpcHQodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIGJ1aWxkWG1sV3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENCdWlsZFNjcmlwdFdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkodGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRTb3VyY2VMb2NhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgICAgICB3cml0ZUZpbGUoYnVpbGRYTUxNb2RlbCwgYnVpbGRYbWxXcml0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXJ2aWNlWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmlzR2VuZXJhdGVEZXBsb3llbWVudERlc2NyaXB0b3IoKSkgewotCi0gICAgICAgICAgICAvLyBXcml0ZSB0aGUgc2VydmljZSB4bWwgaW4gYSBmb2xkZXIgd2l0aCB0aGUKLSAgICAgICAgICAgIERvY3VtZW50IHNlcnZpY2VYTUxNb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yU2VydmljZVhNTCgpOwotICAgICAgICAgICAgRmlsZVdyaXRlciBzZXJ2aWNlWG1sV3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENTZXJ2aWNlWE1MV3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeSh0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFJlc291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpKTsKLQotICAgICAgICAgICAgd3JpdGVGaWxlKHNlcnZpY2VYTUxNb2RlbCwgc2VydmljZVhtbFdyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqIENyZWF0ZXMgdGhlIERPTSB0cmVlIGZvciBpbXBsZW1lbnRhdGlvbnMuICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9ySW50ZXJmYWNlSW1wbGVtZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlVG5zID0gYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ05hbWUgPSBtYWtlQ0NsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgc3R1Yk5hbWUgPSBDX1NUVUJfUFJFRklYICsgc2VydmljZUNOYW1lICsgQ19TVFVCX1NVRkZJWDsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RW1wdHlEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNsYXNzIik7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBzdHViTmFtZSwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicHJlZml4Iiwgc3R1Yk5hbWUsIHJvb3RFbGVtZW50KTsgLy9wcmVmaXggdG8gYmUgdXNlZCBieSB0aGUgZnVuY3Rpb25zCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJxbmFtZSIsIHNlcnZpY2VOYW1lICsgInwiICsgc2VydmljZVRucywgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2VydmljZW5hbWUiLCBzZXJ2aWNlQ05hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCAiIiwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lc3BhY2UiLCBzZXJ2aWNlVG5zLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJpbnRlcmZhY2VOYW1lIiwgc2VydmljZUNOYW1lLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLyogVGhlIGZvbGxvd2luZyBibG9jayBvZiBjb2RlIGlzIHNhbWUgYXMgZm9yIHRoZQotICAgICAgICAgKiBBeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIgY3JlYXRlRE9NRG9jdW1lbnRGb3JJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbigpCi0gICAgICAgICAqLwotICAgICAgICAvLyBhZGQgdGhlIHdyYXAgY2xhc3NlcyBmbGFnCi0gICAgICAgIGlmIChjb2RlR2VuQ29uZmlndXJhdGlvbi5pc1BhY2tDbGFzc2VzKCkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ3cmFwcGVkIiwgInllcyIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBTT0FQIHZlcnNpb24KLSAgICAgICAgYWRkU29hcFZlcnNpb24oZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gYWRkIHRoZSBlbmQgcG9pbnQKLSAgICAgICAgYWRkRW5kcG9pbnQoZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBzeW5jL2FzeW5jIGF0dHJpYnV0ZXMKLSAgICAgICAgZmlsbFN5bmNBdHRyaWJ1dGVzKGRvYywgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgLy8gdGhpcyBibG9jayBvZiBjb2RlIHNwZWNpZmljYWxseSBhcHBsaWVzIHRvIHRoZSBpbnRlZ3JhdGlvbiBvZiBkYXRhYmluZGluZyBjb2RlIGludG8gdGhlCi0gICAgICAgIC8vIGdlbmVyYXRlZCBjbGFzc2VzIHRpZ2h0bHkgKHByb2JhYmx5IGFzIGlubmVyIGNsYXNzZXMpCi0gICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSBzcGVjaWFsIG1vZGVscyBpbiB0aGUgbWFwcGVyIGFuZCBpZiB0aGV5IGFyZSBwcmVzZW50IHByb2Nlc3MgdGhlbQotICAgICAgICBpZiAobWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotCi0gICAgICAgICAgICAvLyBhZGQgYW4gYXR0cmlidXRlIHRvIHRoZSByb290IGVsZW1lbnQgc2hvd2luZyB0aGF0IHRoZSB3cml0aW5nIGhhcyBiZWVuIHNraXBwZWQKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJza2lwLXdyaXRlIiwgInllcyIsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWFwcGVyIG9iamVjdHMKLSAgICAgICAgICAgIHByb2Nlc3NNb2RlbE9iamVjdHMobWFwcGVyLmdldEFsbE1hcHBlZE9iamVjdHMoKSwgcm9vdEVsZW1lbnQsIGRvYyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotICAgICAgICAvLyBsb2FkIHRoZSBvcGVyYXRpb25zCi0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vIGFkZCB0aGUgZGF0YWJpbmQgc3VwcG9ydGVycy4gTm93IHRoZSBkYXRhYmluZCBzdXBwb3J0ZXJzIGFyZSBjb21wbGV0bHkgY29udGFpbmVkIGluc2lkZQotICAgICAgICAvLyB0aGUgc3R1YnMgaW1wbGVtZW50YXRpb24gYW5kIG5vdCB2aXNpYmxlIG91dHNpZGUKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlRE9NRWxlbWVudGZvckRhdGFiaW5kZXJzKGRvYywgZmFsc2UpKTsKLQotICAgICAgICBPYmplY3Qgc3R1Yk1ldGhvZHM7Ci0KLSAgICAgICAgLy9pZiBzb21lIGV4dGVuc2lvbiBoYXMgYWRkZWQgdGhlIHN0dWIgbWV0aG9kcyBwcm9wZXJ0eSwgYWRkIHRoZW0gdG8gdGhlCi0gICAgICAgIC8vbWFpbiBkb2N1bWVudAotICAgICAgICBpZiAoKHN0dWJNZXRob2RzID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoInN0dWJNZXRob2RzIikpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KXN0dWJNZXRob2RzLCB0cnVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL2FkZCBhbm90aGVyIGVsZW1lbnQgdG8gaGF2ZSB0aGUgdW5pcXVlIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhkb2MpKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU2tlbGV0b24oYm9vbGVhbiBpc1NrZWxldG9uSW50ZXJmYWNlKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZUNOYW1lID0gbWFrZUNDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHNrZWxOYW1lID0gQ19TS0VMX1BSRUZJWCArIHNlcnZpY2VDTmFtZSArIENfU0tFTF9TVUZGSVg7Ci0KLSAgICAgICAgLy8gb25seSB0aGUgbmFtZSBpcyB1c2VkCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc2tlbE5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBhY2thZ2UiLCAiIiwgcm9vdEVsZW1lbnQpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlVG5zID0gYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwcmVmaXgiLCBza2VsTmFtZSwgcm9vdEVsZW1lbnQpOyAvL3ByZWZpeCB0byBiZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInFuYW1lIiwgc2VydmljZU5hbWUgKyAifCIgKyBzZXJ2aWNlVG5zLCByb290RWxlbWVudCk7Ci0KLQotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vYXR0YWNoIGEgbGlzdCBvZiBmYXVsdHMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotCi0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBkb2M7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlU2tlbGV0b25YTUwoKSB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbWFrZUNDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHN2Y1NrZWxOYW1lID0gQ19TVkNfU0tFTF9QUkVGSVggKyBsb2NhbFBhcnQgKyBDX1NWQ19TS0VMX1NVRkZJWDsKLSAgICAgICAgU3RyaW5nIHNrZWxOYW1lID0gQ19TS0VMX1BSRUZJWCArIGxvY2FsUGFydCArIENfU0tFTF9TVUZGSVg7Ci0KLSAgICAgICAgLy8gb25seSB0aGUgbmFtZSBpcyB1c2VkCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgc3ZjU2tlbE5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInByZWZpeCIsIHN2Y1NrZWxOYW1lLCByb290RWxlbWVudCk7IC8vcHJlZml4IHRvIGJlIHVzZWQgYnkgdGhlIGZ1bmN0aW9ucwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlVG5zID0gYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJxbmFtZSIsIHNlcnZpY2VOYW1lICsgInwiICsgc2VydmljZVRucywgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJzdmNuYW1lIiwgc2tlbE5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInN2Y29wX3ByZWZpeCIsIHNrZWxOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgIiIsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBmaWxsU3luY0F0dHJpYnV0ZXMoZG9jLCByb290RWxlbWVudCk7Ci0gICAgICAgIGxvYWRPcGVyYXRpb25zKGRvYywgcm9vdEVsZW1lbnQsIG51bGwpOwotCi0gICAgICAgIC8vIGFkZCBTT0FQIHZlcnNpb24KLSAgICAgICAgYWRkU29hcFZlcnNpb24oZG9jLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvckJ1aWxkU2NyaXB0KENvZGVHZW5Db25maWd1cmF0aW9uIGNvZGVnZW4pIHsKLSAgICAJIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0KLSAgICAgICAgIFN0cmluZyBzZXJ2aWNlQ05hbWUgPSBtYWtlQ0NsYXNzTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAvLyBTdHJpbmcgc2tlbE5hbWUgPSBDX1NLRUxfUFJFRklYICsgc2VydmljZUNOYW1lICsgQ19TS0VMX1NVRkZJWDsKLSAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsInNlcnZpY2VuYW1lIixzZXJ2aWNlQ05hbWUscm9vdEVsZW1lbnQpOwotICAgICAgICAvL2lmIHVzZXIgc3BlY2lmeSBhIGxvY2F0aW9uIGZvciB0aGUgc291cmNlCi0gICAgICAgICBpZihjb2RlZ2VuLmlzU2V0b3V0cHV0U291cmNlTG9jYXRpb24oKSl7Ci0gICAgICAgICAgICAgU3RyaW5nIG91dHB1dExvY2F0aW9uID0gY29kZWdlbi5nZXRPdXRwdXRMb2NhdGlvbigpLmdldFBhdGgoKTsKLSAgICAgICAgICAgICBTdHJpbmcgIHRhcmdldHNvdXJjZUxvY2F0aW9uID0gY29kZWdlbi5nZXRTb3VyY2VMb2NhdGlvbigpOwotICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsIm9wdGlvbiIsIjEiLHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCJvdXRwdXRsb2NhdGlvbiIsb3V0cHV0TG9jYXRpb24scm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsInRhcmdldHNvdXJjZWxvY2F0aW9uIix0YXJnZXRzb3VyY2VMb2NhdGlvbixyb290RWxlbWVudCk7Ci0gICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsIm9wdGlvbiIsIjAiLHJvb3RFbGVtZW50KTsKLSAgICAgICAgIH0KLSAgICAgICAgZmlsbFN5bmNBdHRyaWJ1dGVzKGRvYywgcm9vdEVsZW1lbnQpOwotICAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0gICAgICAgICAvLyBhZGQgU09BUCB2ZXJzaW9uCi0gICAgICAgICBhZGRTb2FwVmVyc2lvbihkb2MsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgIAotICAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotCi0gICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd29yZAotICAgICAqIEByZXR1cm4gUmV0dXJucyBjaGFyYWN0ZXIgcmVtb3ZlZCBzdHJpbmcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtYWtlQ0NsYXNzTmFtZShTdHJpbmcgd29yZCkgewotICAgICAgICAvL2N1cnJlbnRseSBhdm9pZCBvbmx5IGphdmEga2V5IHdvcmRzIGFuZCBzZXJ2aWNlIG5hbWVzIHdpdGggJy4nIGNoYXJhY3RlcnMKLQotICAgICAgICBpZiAoQ1V0aWxzLmlzQ0tleXdvcmQod29yZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBDVXRpbHMubWFrZU5vbkNLZXl3b3JkKHdvcmQpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBvdXRXb3JkID0gd29yZC5yZXBsYWNlKCcuJywgJ18nKTsKLSAgICAgICAgcmV0dXJuIG91dFdvcmQucmVwbGFjZSgnLScsICdfJyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgb3BlcmF0aW9ucwotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSByb290RWxlbWVudAotICAgICAqIEBwYXJhbSBtZXAKLSAgICAgKiBAcmV0dXJuIG9wZXJhdGlvbnMgZm91bmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkT3BlcmF0aW9ucyhEb2N1bWVudCBkb2MsIEVsZW1lbnQgcm9vdEVsZW1lbnQsIFN0cmluZyBtZXApIHsKLSAgICAgICAgRWxlbWVudCBtZXRob2RFbGVtZW50OwotICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gbWFrZUNDbGFzc05hbWUoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLQotICAgICAgICBJdGVyYXRvciBiaW5kaW5nT3BlcmF0aW9ucyA9IHRoaXMuYXhpc0JpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgYm9vbGVhbiBvcHNGb3VuZCA9IGZhbHNlOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgd2hpbGUgKGJpbmRpbmdPcGVyYXRpb25zLmhhc05leHQoKSkgewotCi0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gcG9wdWxhdGUgaW5mbyBob2xkZXIgd2l0aCBtZXAgaW5mb3JtYXRpb24uIFRoaXMgd2lsbCB1c2VkIGluIGRldGVybWluaW5nIHdoaWNoCi0gICAgICAgICAgICAvLyBtZXNzYWdlIHJlY2VpdmVyIHRvIHVzZSwgZXRjLiwKLQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChpbmZvSG9sZGVyLmdldChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mb0hvbGRlci5wdXQobWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lcCA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBvcHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBzb2FwSGVhZGVyT3V0cHV0UGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgibWV0aG9kIik7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wQ05hbWUgPSBtYWtlQ0NsYXNzTmFtZShsb2NhbFBhcnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvcE5TID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIG9wQ05hbWUsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbHBhcnQiLCBsb2NhbFBhcnQsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJxbmFtZSIsIGxvY2FsUGFydCArICJ8IiArIG9wTlMsIG1ldGhvZEVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWVzcGFjZSIsIG9wTlMsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IGF4aXNPcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic3R5bGUiLCBzdHlsZSwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRic3VwcG9ydG5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUgKyBsb2NhbFBhcnQgKyBEQVRBQklORElOR19TVVBQT1JURVJfTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQpOwotCi0KLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibWVwIiwgVXRpbHMuZ2V0QXhpc1NwZWNpZk1FUENvbnN0YW50KAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpICsgIiIsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtZXBVUkkiLCBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0KLQotICAgICAgICAgICAgICAgIGFkZFNPQVBBY3Rpb24oZG9jLCBtZXRob2RFbGVtZW50LCBheGlzQmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIC8vYWRkIGhlYWRlciBvcHMgZm9yIGlucHV0Ci0gICAgICAgICAgICAgICAgYWRkSGVhZGVyT3BlcmF0aW9ucyhzb2FwSGVhZGVySW5wdXRQYXJhbWV0ZXJMaXN0LCBheGlzQmluZGluZ09wZXJhdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy9hZGQgaGVhZGVyIG9wcyBmb3Igb3V0cHV0Ci0gICAgICAgICAgICAgICAgYWRkSGVhZGVyT3BlcmF0aW9ucyhzb2FwSGVhZGVyT3V0cHV0UGFyYW1ldGVyTGlzdCwgYXhpc0JpbmRpbmdPcGVyYXRpb24sIGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSA9IGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5SW5jbHVkZSgpOwotICAgICAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBwb2xpY3lJbmNsdWRlLmdldFBvbGljeSgpOwotICAgICAgICAgICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBvbGljeSIsIFBvbGljeVV0aWwucG9saWN5Q29tcG9uZW50VG9TdHJpbmcocG9saWN5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuJ3Qgc2VyaWFsaXplIHRoZSBwb2xpY3kgdG8gYSBTdHJpbmcgIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldElucHV0RWxlbWVudChkb2MsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBzb2FwSGVhZGVySW5wdXRQYXJhbWV0ZXJMaXN0KSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dEVsZW1lbnQoZG9jLCBheGlzQmluZGluZ09wZXJhdGlvbiwgc29hcEhlYWRlck91dHB1dFBhcmFtZXRlckxpc3QpKTsKLSAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50LmFwcGVuZENoaWxkKGdldEZhdWx0RWxlbWVudChkb2MsIGF4aXNPcGVyYXRpb24pKTsKLQotICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL21lcCBpcyBwcmVzZW50IC0gd2UgbW92ZSBhaGVhZCBvbmx5IGlmIHRoZSBnaXZlbiBtZXAgbWF0Y2hlcyB0aGUgbWVwIG9mIHRoaXMgb3BlcmF0aW9uCi0KLSAgICAgICAgICAgICAgICBpZiAobWVwLmVxdWFscyhheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9hdCB0aGlzIHBvaW50IHdlIGtub3cgaXQncyB0cnVlCi0gICAgICAgICAgICAgICAgICAgIG9wc0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBzb2FwSGVhZGVySW5wdXRQYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJGYXVsdFBhcmFtZXRlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgibWV0aG9kIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wQ05hbWUgPSBtYWtlQ0NsYXNzTmFtZShsb2NhbFBhcnQpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BOUyA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgb3BDTmFtZSwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhbHBhcnQiLCBsb2NhbFBhcnQsIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicW5hbWUiLCBsb2NhbFBhcnQgKyAifCIgKyBvcE5TLCBtZXRob2RFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZXNwYWNlIiwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInN0eWxlIiwgYXhpc09wZXJhdGlvbi5nZXRTdHlsZSgpLCBtZXRob2RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImRic3VwcG9ydG5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVOYW1lICsgbG9jYWxQYXJ0ICsgREFUQUJJTkRJTkdfU1VQUE9SVEVSX05BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm1lcCIsIFV0aWxzLmdldEF4aXNTcGVjaWZNRVBDb25zdGFudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkgKyAiIiwgbWV0aG9kRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtZXBVUkkiLCBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQpOwotCi0KLSAgICAgICAgICAgICAgICAgICAgYWRkU09BUEFjdGlvbihkb2MsIG1ldGhvZEVsZW1lbnQsIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlck9wZXJhdGlvbnMoc29hcEhlYWRlcklucHV0UGFyYW1ldGVyTGlzdCwgYXhpc0JpbmRpbmdPcGVyYXRpb24sIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBhZGRIZWFkZXJPcGVyYXRpb25zKHNvYXBIZWFkZXJPdXRwdXRQYXJhbWV0ZXJMaXN0LCBheGlzQmluZGluZ09wZXJhdGlvbiwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFNldHRpbmcgdGhlIHBvbGljeSBvZiB0aGUgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIFBvbGljeSBwb2xpY3kgPSBheGlzT3BlcmF0aW9uLmdldFBvbGljeUluY2x1ZGUoKS5nZXRQb2xpY3koKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lVdGlsLnBvbGljeUNvbXBvbmVudFRvU3RyaW5nKHBvbGljeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbid0IHNlcmlhbGl6ZSB0aGUgcG9saWN5IHRvIGEgU3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0SW5wdXRFbGVtZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJJbnB1dFBhcmFtZXRlckxpc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZXRPdXRwdXRFbGVtZW50KGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhlYWRlck91dHB1dFBhcmFtZXRlckxpc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kRWxlbWVudC5hcHBlbmRDaGlsZChnZXRGYXVsdEVsZW1lbnQoZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG1ldGhvZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcHNGb3VuZDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEEgY29udmVuaWVudCBtZXRob2QgZm9yIHRoZSBnZW5lcmF0aW5nIHRoZSBwYXJhbWV0ZXIgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUKLSAgICAgKiBAcGFyYW0gcGFyYW1UeXBlCi0gICAgICogQHBhcmFtIG9wTmFtZQotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZW5lcmF0ZVBhcmFtQ29tcG9uZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1ByaW1pdGl2ZSkgewotCi0gICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgIC8vcmV0dXJuIHBhcmFtRWxlbWVudDsvKgotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUsIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nU3RyID0gKHBhcmFtVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICA6IHBhcmFtVHlwZTsKLQotCi0gICAgICAgIGlmIChKQVZBX0RFRkFVTFRfVFlQRS5lcXVhbHModHlwZU1hcHBpbmdTdHIpKSB7Ci0gICAgICAgICAgICB0eXBlTWFwcGluZ1N0ciA9IENfREVGQVVMVF9UWVBFOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCB0eXBlTWFwcGluZ1N0ciwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhcHMtdHlwZSIsIHR5cGVNYXBwaW5nU3RyLnRvVXBwZXJDYXNlKCksIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgLy9hZGRzIHRoZSBzaG9ydCB0eXBlCi0gICAgICAgIGFkZFNob3J0VHlwZShwYXJhbUVsZW1lbnQsIHBhcmFtVHlwZSk7Ci0KLSAgICAgICAgLy8gYWRkIGFuIGV4dHJhIGF0dHJpYnV0ZSB0byBzYXkgd2hldGhlciB0aGUgdHlwZSBtYXBwaW5nIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgIGlmIChtYXBwZXIuZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkuZXF1YWxzKHBhcmFtVHlwZSkpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgZ2V0UGFyYW1Jbml0aWFsaXplcihwYXJhbVR5cGUpLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICAvLyBhZGQgdGhpcyBhcyBhIGJvZHkgcGFyYW1ldGVyCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJsb2NhdGlvbiIsICJib2R5IiwgcGFyYW1FbGVtZW50KTsKLQotICAgICAgICAvL2lmIHRoZSBvcE5hbWUgYW5kIHBhcnROYW1lIGFyZSBwcmVzZW50ICwgYWRkIHRoZW0KLSAgICAgICAgaWYgKG9wTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAib3BuYW1lIiwgb3BOYW1lLmdldExvY2FsUGFydCgpLCBwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYXJ0bmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSmF2YVV0aWxzLmNhcGl0YWxpemVGaXJzdENoYXIocGFydE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNQcmltaXRpdmUpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwcmltaXRpdmUiLCAieWVzIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBuZXcgdHJpY2sgdG8gaWRlbnRpZnkgYWRiIHR5cGVzCi0gICAgICAgIGJvb2xlYW4gaXNPdXJzID0gdHJ1ZTsKLQotICAgICAgICBpZiAodHlwZU1hcHBpbmdTdHIubGVuZ3RoKCkgIT0gMCAmJiAhdHlwZU1hcHBpbmdTdHIuZXF1YWxzKCJ2b2lkIikgJiYKLSAgICAgICAgICAgICAgICAhdHlwZU1hcHBpbmdTdHIuZXF1YWxzKENfREVGQVVMVF9UWVBFKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm91cnMiLCAieWVzIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgICAgIGlzT3VycyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpc091cnMgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc091cnMpIHsKLSAgICAgICAgICAgIHR5cGVNYXBwaW5nU3RyID0gQ19PVVJfVFlQRV9QUkVGSVggKyB0eXBlTWFwcGluZ1N0ciArIENfT1VSX1RZUEVfU1VGRklYOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImF4aXMyLXR5cGUiLCB0eXBlTWFwcGluZ1N0ciwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImF4aXMyLWNhcHMtdHlwZSIsIHR5cGVNYXBwaW5nU3RyLnRvVXBwZXJDYXNlKCksIHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtRWxlbWVudDsgIC8vKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZENTcGVjaWZjQXR0cmlidXRlcyhEb2N1bWVudCBkb2MsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uLCBFbGVtZW50IHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZVR5cGUpIHsKLSAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nU3RyOwotICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlOwotCi0gICAgICAgIGlmIChtZXNzYWdlVHlwZS5lcXVhbHMoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSkKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0KLSAgICAgICAgUU5hbWUgdHlwZU1hcHBpbmcgPSBtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOwotCi0gICAgICAgIFN0cmluZyBwYXJhbVR5cGUgPSB0aGlzLm1hcHBlci5nZXRUeXBlTWFwcGluZ05hbWUobWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgIGlmIChkb2MgPT0gbnVsbCB8fCBwYXJhbVR5cGUgPT0gbnVsbCB8fCBwYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZShtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgIHR5cGVNYXBwaW5nU3RyID0gKHR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICA6IHR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eXBlTWFwcGluZ1N0ciA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhcHMtdHlwZSIsIHBhcmFtVHlwZS50b1VwcGVyQ2FzZSgpLCBwYXJhbSk7Ci0KLSAgICAgICAgaWYgKCFwYXJhbVR5cGUuZXF1YWxzKCIiKSAmJiAhcGFyYW1UeXBlLmVxdWFscygidm9pZCIpICYmCi0gICAgICAgICAgICAgICAgIXR5cGVNYXBwaW5nU3RyLmVxdWFscyhDX0RFRkFVTFRfVFlQRSkgJiYgdHlwZU1hcHBpbmdTdHIuY29udGFpbnMoImFkYl8iKSkgewotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm91cnMiLCAieWVzIiwgcGFyYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtZXRlciBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50W10gZ2V0SW5wdXRQYXJhbUVsZW1lbnQoRG9jdW1lbnQgZG9jLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBFbGVtZW50W10gcGFyYW0gPSBzdXBlci5nZXRJbnB1dFBhcmFtRWxlbWVudChkb2MsIG9wZXJhdGlvbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFkZENTcGVjaWZjQXR0cmlidXRlcyhkb2MsIG9wZXJhdGlvbiwgcGFyYW1baV0sIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRPdXRwdXRQYXJhbUVsZW1lbnQoRG9jdW1lbnQgZG9jLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBFbGVtZW50IHBhcmFtID0gc3VwZXIuZ2V0T3V0cHV0UGFyYW1FbGVtZW50KGRvYywgb3BlcmF0aW9uKTsKLSAgICAgICAgYWRkQ1NwZWNpZmNBdHRyaWJ1dGVzKGRvYywgb3BlcmF0aW9uLCBwYXJhbSwgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHNvdXJjZSBmaWxlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRwdXREaXIKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoRmlsZSBvdXRwdXREaXIsIFN0cmluZyBkaXIyKSB7Ci0gICAgICAgIGlmIChkaXIyICE9IG51bGwgJiYgISIiLmVxdWFscyhkaXIyKSkgewotICAgICAgICAgICAgaWYgKG91dHB1dERpci5nZXROYW1lKCkuZXF1YWxzKCIuIikpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXIsIGRpcjIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFvdXRwdXREaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIG91dHB1dERpci5ta2RpcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvdXRwdXREaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCi0gICAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0UGFyYW1ldGVyRWxlbWVudExpc3QoRG9jdW1lbnQgZG9jLCBMaXN0IHBhcmFtZXRlcnMsIFN0cmluZyBsb2NhdGlvbikgewotICAgICAgICBMaXN0IHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGlmICgocGFyYW1ldGVycyAhPSBudWxsKSAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHBhcmFtZXRlcnMuc2l6ZSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmFtID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBwYXJhbWV0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gaGVhZGVyLmdldEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgdGhpcy5tYXBwZXIuZ2V0UGFyYW1ldGVyTmFtZShuYW1lKSwgcGFyYW0pOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5tYXBwZXIuZ2V0VHlwZU1hcHBpbmdOYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTWFwcGluZ1N0ciA9ICh0eXBlTWFwcGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZzsKLQotICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgdHlwZU1hcHBpbmdTdHIsIHBhcmFtKTsKLSAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibG9jYXRpb24iLCBsb2NhdGlvbiwgcGFyYW0pOwotICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuaXNNdXN0VW5kZXJzdGFuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJtdXN0VW5kZXJzdGFuZCIsICJ0cnVlIiwgcGFyYW0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBxTmFtZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicW5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5zdXJpIiwgbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcU5hbWVFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImxvY2FsbmFtZSIsIG5hbWUuZ2V0TG9jYWxQYXJ0KCksIHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLmFwcGVuZENoaWxkKHFOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnRMaXN0LmFkZChwYXJhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IHRyaWNrIHRvIGlkZW50aWZ5IGFkYiB0eXBlcwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPdXJzID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGlmICh0eXBlTWFwcGluZ1N0ci5sZW5ndGgoKSAhPSAwICYmICF0eXBlTWFwcGluZ1N0ci5lcXVhbHMoInZvaWQiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIXR5cGVNYXBwaW5nU3RyLmVxdWFscyhDX0RFRkFVTFRfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm91cnMiLCAieWVzIiwgcGFyYW0pOwotICAgICAgICAgICAgICAgICAgICBpc091cnMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzT3VycyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc091cnMpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZU1hcHBpbmdTdHIgPSBDX09VUl9UWVBFX1BSRUZJWCArIHR5cGVNYXBwaW5nU3RyICsgQ19PVVJfVFlQRV9TVUZGSVg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImF4aXMyLXR5cGUiLCB0eXBlTWFwcGluZ1N0ciwgcGFyYW0pOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckVsZW1lbnRMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBvdXRwdXQgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRPdXRwdXRFbGVtZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGhlYWRlclBhcmFtZXRlclFOYW1lTGlzdCkgewotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBFbGVtZW50IG91dHB1dEVsdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJvdXRwdXQiKTsKLSAgICAgICAgU3RyaW5nIG1lcCA9IG9wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0KLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG1lcCkpIHsKLQotICAgICAgICAgICAgRWxlbWVudCBwYXJhbSA9IGdldE91dHB1dFBhcmFtRWxlbWVudChkb2MsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RWx0LmFwcGVuZENoaWxkKHBhcmFtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBvdXRwdXRFbGVtZW50TGlzdCA9IGdldFBhcmFtZXRlckVsZW1lbnRMaXN0KGRvYywgaGVhZGVyUGFyYW1ldGVyUU5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLlNPQVBfSEVBREVSKTsKLSAgICAgICAgICAgIG91dHB1dEVsZW1lbnRMaXN0LmFkZEFsbChnZXRQYXJhbWV0ZXJFbGVtZW50TGlzdEZvckh0dHBIZWFkZXIoZG9jLAotICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9PVVQpLAotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLkhUVFBfSEVBREVSKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0RWxlbWVudExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRFbHQuYXBwZW5kQ2hpbGQoKEVsZW1lbnQpIG91dHB1dEVsZW1lbnRMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFNldHRpbmcgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgZm9yIHRoZSBvdXRwdXQgbWVzc2FnZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0QmluZGluZ1BvbGljeUZyb21NZXNzYWdlKGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9PVVQpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicG9saWN5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lVdGlsLmdldFNhZmVTdHJpbmcoUG9saWN5VXRpbC5wb2xpY3lDb21wb25lbnRUb1N0cmluZyhwb2xpY3kpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbHQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2FuJ3Qgc2VyaWFsaXplIHRoZSBwb2xpY3kgLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dEVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGlucHV0IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbgotICAgICAqIEBwYXJhbSBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QKLSAgICAgKiBAcmV0dXJuIERPTSBlbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZ2V0SW5wdXRFbGVtZW50KERvY3VtZW50IGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QpIHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgRWxlbWVudCBpbnB1dEVsdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgICBTdHJpbmcgbWVwID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNJbnB1dFByZXNlbnRGb3JNRVAobWVwKSkgewotCi0gICAgICAgICAgICBFbGVtZW50W10gcGFyYW0gPSBnZXRJbnB1dFBhcmFtRWxlbWVudChkb2MsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRFbHQuYXBwZW5kQ2hpbGQocGFyYW1baV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IHBhcmFtZXRlckVsZW1lbnRMaXN0ID0gZ2V0UGFyYW1ldGVyRWxlbWVudExpc3QoZG9jLCBoZWFkZXJQYXJhbWV0ZXJRTmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU09BUF9IRUFERVIpOwotICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkQWxsKGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9ySHR0cEhlYWRlcihkb2MsCi0gICAgICAgICAgICAgICAgICAgIChBcnJheUxpc3QpIGdldEJpbmRpbmdQcm9wZXJ0eUZyb21NZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKSwKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5IVFRQX0hFQURFUikpOwotICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudExpc3QuYWRkQWxsKGdldFBhcmFtZXRlckVsZW1lbnRMaXN0Rm9yU09BUE1vZHVsZXMoZG9jLAotICAgICAgICAgICAgICAgICAgICAoQXJyYXlMaXN0KSBnZXRCaW5kaW5nUHJvcGVydHlGcm9tTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTikpKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJFbGVtZW50TGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlucHV0RWx0LmFwcGVuZENoaWxkKChFbGVtZW50KSBwYXJhbWV0ZXJFbGVtZW50TGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgKiBTZXR0aW5nIHRoZSBlZmZlY3RpdmUgcG9saWN5IG9mIGlucHV0IG1lc3NhZ2UKLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBQb2xpY3kgcG9saWN5ID0gZ2V0QmluZGluZ1BvbGljeUZyb21NZXNzYWdlKGJpbmRpbmdPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTik7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVV0aWwuZ2V0U2FmZVN0cmluZyhQb2xpY3lVdGlsLnBvbGljeUNvbXBvbmVudFRvU3RyaW5nKHBvbGljeSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RWx0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhbid0IHNlcmlhbGl6ZSB0aGUgcG9saWN5IC4uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlucHV0RWx0OwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0VtaXR0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZmYTI2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRW1pdHRlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2RlR2VuQ29uZmlndXJhdGlvbihDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlcihUeXBlTWFwcGVyIG1hcHBlcik7Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0U3R1YigpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGVtaXRTa2VsZXRvbigpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0phdmFFbWl0dGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL0phdmFFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWRlMWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9KYXZhRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkRlZmF1bHRUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtaXR0ZXIgZXh0ZW5kcyBBeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIgewotCi0gICAgcHVibGljIEphdmFFbWl0dGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gY29uZmlndXJhdGlvbiAgKi8KLSAgICBwdWJsaWMgSmF2YUVtaXR0ZXIoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICAgICAgdGhpcy5tYXBwZXIgPSBuZXcgRGVmYXVsdFR5cGVNYXBwZXIoKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gbWFwcGVyCi0gICAgICovCi0gICAgcHVibGljIEphdmFFbWl0dGVyKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFR5cGVNYXBwZXIgbWFwcGVyKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjsKLQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL2pheHdzL0Fubm90YXRpb25FbGVtZW50QnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9qYXh3cy9Bbm5vdGF0aW9uRWxlbWVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlMDQ3Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL2pheHdzL0Fubm90YXRpb25FbGVtZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5qYXh3czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25FbGVtZW50QnVpbGRlciB7Ci0KLSAgICBzdGF0aWMgRWxlbWVudCBidWlsZFdlYlNlcnZpY2VBbm5vdGF0aW9uRWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5TLCBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYykgewotCi0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYW5ub3RhdGlvbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCAiamF2YXguandzLldlYlNlcnZpY2UiLCBhbm5vdGF0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgIm5hbWUiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgbmFtZSwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgInRhcmdldE5hbWVzcGFjZSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCB0YXJnZXROUywgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkVsZW1lbnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIEVsZW1lbnQgYnVpbGRXZWJTZXJ2aWNlQW5ub3RhdGlvbkVsZW1lbnQoU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlLCBEb2N1bWVudCBkb2MpIHsKLQotICAgICAgICBFbGVtZW50IGFubm90YXRpb25FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFubm90YXRpb24iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgImphdmF4Lmp3cy5XZWJTZXJ2aWNlIiwgYW5ub3RhdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICJlbmRwb2ludEludGVyZmFjZSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBlbmRwb2ludEludGVyZmFjZSwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkVsZW1lbnQ7Ci0gICAgfQotCi0gICAgc3RhdGljIEVsZW1lbnQgYnVpbGRXZWJGYXVsdEFubm90YXRpb25FbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgdGFyZ2V0TlMsIERvY3VtZW50IGRvYykgewotICAgICAgICBFbGVtZW50IGFubm90YXRpb25FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFubm90YXRpb24iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgImphdmF4LnhtbC53cy5XZWJGYXVsdCIsIGFubm90YXRpb25FbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAibmFtZSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBuYW1lLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHBhcmFtRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJwYXJhbSIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAidGFyZ2V0TmFtZXNwYWNlIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIHRhcmdldE5TLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBhbm5vdGF0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChwYXJhbUVsZW1lbnQpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uRWxlbWVudDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRWxlbWVudCBidWlsZFdlYlNlcnZpY2VDbGllbnRBbm5vdGF0aW9uRWxlbWVudChTdHJpbmcgbmFtZSwgU3RyaW5nIHRhcmdldE5TLCBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYykgewotCi0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYW5ub3RhdGlvbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQiLCBhbm5vdGF0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgIm5hbWUiLCBwYXJhbUVsZW1lbnQpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgInZhbHVlIiwgbmFtZSwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgInRhcmdldE5hbWVzcGFjZSIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCB0YXJnZXROUywgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgYW5ub3RhdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQocGFyYW1FbGVtZW50KTsKLQotICAgICAgICBwYXJhbUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyYW0iKTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ0eXBlIiwgIndzZGxMb2NhdGlvbiIsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCB3c2RsTG9jYXRpb24sIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIGFubm90YXRpb25FbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FbGVtZW50OwotICAgIH0KLQotICAgIHN0YXRpYyBFbGVtZW50IGJ1aWxkV2ViRW5kUG9pbnRBbm5vdGF0aW9uRWxlbWVudChTdHJpbmcgbmFtZSwgRG9jdW1lbnQgZG9jKSB7Ci0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiYW5ub3RhdGlvbiIpOwotICAgICAgICBYU0xUVXRpbHMuYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCAiamF2YXgueG1sLndzLldlYkVuZHBvaW50IiwgYW5ub3RhdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgcGFyYW1FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInBhcmFtIik7Ci0gICAgICAgIFhTTFRVdGlscy5hZGRBdHRyaWJ1dGUoZG9jLCAidHlwZSIsICJuYW1lIiwgcGFyYW1FbGVtZW50KTsKLSAgICAgICAgWFNMVFV0aWxzLmFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIG5hbWUsIHBhcmFtRWxlbWVudCk7Ci0gICAgICAgIGFubm90YXRpb25FbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtRWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25FbGVtZW50OwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9qYXh3cy9KQVhXUzIwRW1pdHRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZW1pdHRlci9qYXh3cy9KQVhXUzIwRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDliODBhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvamF4d3MvSkFYV1MyMEVtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmVtaXR0ZXIuamF4d3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEpBWFdTMjBFbWl0dGVyIGV4dGVuZHMgSkFYV1NFbWl0dGVyIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIERPTSBEb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZvclNFSSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiamF2YUNvbnN0cnVjdCIpOwotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0TGlzdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbXBvcnRMaXN0Iik7Ci0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGltcG9ydExpc3QpOwotCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROUyA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gKFN0cmluZykgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUpOwotICAgICAgICBwb3J0VHlwZU5hbWUgPSByZXNvbHZlTmFtZUNvbGxpc2lvbihwb3J0VHlwZU5hbWUsIHBhY2thZ2VOYW1lLCBUWVBFX1NVRkZJWCk7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKEpBWFdTX1BPUlRfVFlQRV9OQU1FLCBwb3J0VHlwZU5hbWUpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgcGFja2FnZU5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInRhcmdldE5hbWVzcGFjZSIsIHRhcmdldE5TLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgcG9ydFR5cGVOYW1lLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50QnVpbGRlci5idWlsZFdlYlNlcnZpY2VBbm5vdGF0aW9uRWxlbWVudChwb3J0VHlwZU5hbWUsIHRhcmdldE5TLAotICAgICAgICAgICAgICAgICIiLCBkb2MpOwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChhbm5vdGF0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgbG9hZE9wZXJhdGlvbnMoZG9jLCByb290RWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy9hdHRhY2ggYSBsaXN0IG9mIGZhdWx0cwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRVbmlxdWVMaXN0b2ZGYXVsdHMoZG9jKSk7Ci0gICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oRE9NMldyaXRlci5ub2RlVG9TdHJpbmcocm9vdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIHJldHVybiBkb2M7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBYTUwgbW9kZWwgZm9yIHRoZSBTZXJ2aWNlIEVuZHBvaW50IGludGVyZmFjZQotICAgICAqCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTRUlJbXBsKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGdldEVtcHR5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXZhQ29uc3RydWN0Iik7Ci0KLSAgICAgICAgLy9FbGVtZW50IGltcG9ydExpc3QgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW1wb3J0TGlzdCIpOwotICAgICAgICAvL3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKGltcG9ydExpc3QpOwotCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROUyA9IGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gKFN0cmluZykgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUpOwotICAgICAgICBwb3J0VHlwZU5hbWUgPSByZXNvbHZlTmFtZUNvbGxpc2lvbihwb3J0VHlwZU5hbWUsIHBhY2thZ2VOYW1lLCBUWVBFX1NVRkZJWCk7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKEpBWFdTX1BPUlRfVFlQRV9OQU1FLCBwb3J0VHlwZU5hbWUpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgcGFja2FnZU5hbWUsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInRhcmdldE5hbWVzcGFjZSIsIHRhcmdldE5TLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEpBWFdTX1BPUlRfVFlQRV9OQU1FKS5nZXRWYWx1ZSgpICsgSkFYV1NfSU1QTF9TVUZGSVgsCi0gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBBbm5vdGF0aW9uRWxlbWVudEJ1aWxkZXIuYnVpbGRXZWJTZXJ2aWNlQW5ub3RhdGlvbkVsZW1lbnQoCi0gICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArIi4iICtheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoSkFYV1NfUE9SVF9UWVBFX05BTUUpLmdldFZhbHVlKCksIGRvYyk7Ci0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGFubm90YXRpb25FbGVtZW50KTsKLQotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvL2F0dGFjaCBhIGxpc3Qgb2YgZmF1bHRzCi0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGdldFVuaXF1ZUxpc3RvZkZhdWx0cyhkb2MpKTsKLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhyb290RWxlbWVudCkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgcmV0dXJuIGRvYzsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIFNlcnZpY2UgQ2xhc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gRE9NIERvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU2VydmljZUNsYXNzKCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiamF2YUNvbnN0cnVjdCIpOwotCi0gICAgICAgIEVsZW1lbnQgaW1wb3J0TGlzdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbXBvcnRMaXN0Iik7Ci0gICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGltcG9ydExpc3QpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGNhcGl0YWxpemVkU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gIk5lZWRzIHRvIGJlIGZpeGVkIjsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5TID0gY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgc2VydmljZU5hbWUgPSByZXNvbHZlTmFtZUNvbGxpc2lvbihzZXJ2aWNlTmFtZSwgcGFja2FnZU5hbWUsIFRZUEVfU1VGRklYKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIHBhY2thZ2VOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ0YXJnZXROYW1lc3BhY2UiLCB0YXJnZXROUywgcm9vdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAibmFtZSIsIHNlcnZpY2VOYW1lLCByb290RWxlbWVudCk7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ3c2RsTG9jYXRpb24iLCB3c2RsTG9jYXRpb24sIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNhcGl0YWxpemVkU2VydmljZU5hbWUiLCBjYXBpdGFsaXplZFNlcnZpY2VOYW1lLCByb290RWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBhbm5vdGF0aW9uRWxlbWVudCA9IEFubm90YXRpb25FbGVtZW50QnVpbGRlci5idWlsZFdlYlNlcnZpY2VDbGllbnRBbm5vdGF0aW9uRWxlbWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICB0YXJnZXROUywgd3NkbExvY2F0aW9uLCBkb2MpOwotICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChhbm5vdGF0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgLy9CdWlsZGluZyBwb3J0VHlwZSBFbGVtZW50cyAtLSB0aGluayBvZiBhIHN1aXRhYmxlIHNvbHV0aW9uCi0gICAgICAgIGZvciAoSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgcG9ydEl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IChTdHJpbmcpIHBvcnRJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgcG9ydEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicG9ydCIpOwotICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInBvcnROYW1lIiwgcG9ydE5hbWUsIHBvcnRFbGVtZW50KTsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwb3J0VHlwZU5hbWUiLCAoU3RyaW5nKSB0aGlzLmF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihKQVhXU19QT1JUX1RZUEVfTkFNRSkuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgcG9ydEVsZW1lbnQpOwotCi0gICAgICAgICAgICBFbGVtZW50IGVuZFBvaW50QW5ub0VsZW1lbnQgPSBBbm5vdGF0aW9uRWxlbWVudEJ1aWxkZXIuYnVpbGRXZWJFbmRQb2ludEFubm90YXRpb25FbGVtZW50KHBvcnROYW1lLCBkb2MpOwotICAgICAgICAgICAgcG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoZW5kUG9pbnRBbm5vRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHBvcnRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vYXR0YWNoIGEgbGlzdCBvZiBmYXVsdHMKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZ2V0VW5pcXVlTGlzdG9mRmF1bHRzKGRvYykpOwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKHJvb3RFbGVtZW50KSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgYSBFeGNlcHRpb24gQ2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgU3RyaW5nCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JFeGNlcHRpb24oU3RyaW5nIGtleSkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgZmF1bHRFbGVtZW50OwotCi0gICAgICAgIGZhdWx0RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXZhQ29uc3RydWN0Iik7Ci0gICAgICAgIEVsZW1lbnQgaW1wb3J0TGlzdCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbXBvcnRMaXN0Iik7Ci0gICAgICAgIGZhdWx0RWxlbWVudC5hcHBlbmRDaGlsZChpbXBvcnRMaXN0KTsKLQotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TlMgPSBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAicGFja2FnZSIsIHBhY2thZ2VOYW1lLCBmYXVsdEVsZW1lbnQpOwotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TlMsIGZhdWx0RWxlbWVudCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbkNsYXNzTmFtZSA9IChTdHJpbmcpIGZhdWx0Q2xhc3NOYW1lTWFwLmdldChrZXkpOwotICAgICAgICBTdHJpbmcgcmVzb2x2ZWRFeHBDbGFzcyA9IHJlc29sdmVOYW1lQ29sbGlzaW9uKGV4Y2VwdGlvbkNsYXNzTmFtZSwgcGFja2FnZU5hbWUsIEVYQ0VQVElPTl9TVUZGSVgpOwotCi0gICAgICAgIGlmICghcmVzb2x2ZWRFeHBDbGFzcy5lcXVhbHMoZXhjZXB0aW9uQ2xhc3NOYW1lKSkKLSAgICAgICAgICAgIGZhdWx0Q2xhc3NOYW1lTWFwLnB1dChrZXksIHJlc29sdmVkRXhwQ2xhc3MpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJuYW1lIiwgcmVzb2x2ZWRFeHBDbGFzcywgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICBTdHJpbmcgdHlwZU1hcHBpbmcgPQotICAgICAgICAgICAgICAgIHRoaXMubWFwcGVyLmdldFR5cGVNYXBwaW5nTmFtZSgoUU5hbWUpIGZhdWx0RWxlbWVudFFOYW1lTWFwLmdldChrZXkpKTsKLSAgICAgICAgU3RyaW5nIHNob3J0VHlwZSA9IGV4dHJhdENsYXNzTmFtZSh0eXBlTWFwcGluZyk7Ci0KLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgInR5cGUiLCAodHlwZU1hcHBpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/ICIiCi0gICAgICAgICAgICAgICAgOiB0eXBlTWFwcGluZywgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2hvcnRUeXBlIiwgKHNob3J0VHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgID8gIiIKLSAgICAgICAgICAgICAgICA6IHNob3J0VHlwZSwgZmF1bHRFbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IGltcG9ydEVsZW1lbnQ7Ci0gICAgICAgIGltcG9ydEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW1wb3J0Iik7Ci0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJ2YWx1ZSIsIHR5cGVNYXBwaW5nLCBpbXBvcnRFbGVtZW50KTsKLSAgICAgICAgaW1wb3J0TGlzdC5hcHBlbmRDaGlsZChpbXBvcnRFbGVtZW50KTsKLQotICAgICAgICBpZiAobWFwcGVyLmdldERlZmF1bHRNYXBwaW5nTmFtZSgpLmVxdWFscyh0eXBlTWFwcGluZykpIHsKLSAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJkZWZhdWx0IiwgInllcyIsIGZhdWx0RWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidmFsdWUiLCBnZXRQYXJhbUluaXRpYWxpemVyKHR5cGVNYXBwaW5nKSwKLSAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgYW5ub3RhdGlvbkVsZW1lbnQgPSBBbm5vdGF0aW9uRWxlbWVudEJ1aWxkZXIuYnVpbGRXZWJGYXVsdEFubm90YXRpb25FbGVtZW50KHR5cGVNYXBwaW5nLAotICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBkb2MpOwotICAgICAgICBmYXVsdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5ub3RhdGlvbkVsZW1lbnQpOwotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZmF1bHRFbGVtZW50KTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihET00yV3JpdGVyLm5vZGVUb1N0cmluZyhmYXVsdEVsZW1lbnQpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvamF4d3MvSkFYV1NFbWl0dGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9lbWl0dGVyL2pheHdzL0pBWFdTRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDljNDU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2VtaXR0ZXIvamF4d3MvSkFYV1NFbWl0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLmpheHdzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5lbWl0dGVyLkF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuRXhjZXB0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5GaWxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlci5JbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2tlbGV0b25JbnRlcmZhY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNrZWxldG9uV3JpdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpBWFdTRW1pdHRlciBleHRlbmRzIEF4aXNTZXJ2aWNlQmFzZWRNdWx0aUxhbmd1YWdlRW1pdHRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1NVRkZJWCA9ICJUeXBlIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWSUNFX1NVRkZJWCA9ICJTZXJ2aWNlIjsKLSAgICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFWENFUFRJT05fU1VGRklYID0gIkV4Y2VwdGlvbiI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFYV1NfUE9SVF9UWVBFX05BTUUgPSAiSmF4d3NQb3J0VHlwZU5hbWUiOwotICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBWFdTX0lNUExfU1VGRklYID0gIkltcGwiOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q29kZUdlbkNvbmZpZ3VyYXRpb24oQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBzdXBlci5zZXRDb2RlR2VuQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0U2tlbGV0b24oKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIE1hcCBvcmlnaW5hbE1hcCA9IGdldE5ld0NvcHkodGhpcy5tYXBwZXIuZ2V0QWxsTWFwcGVkTmFtZXMoKSk7Ci0gICAgICAgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgZm9sbG93aW5nIGZpbGVzIHNlcGVyYXRlbHkgcGVyIHNlcnZpY2UKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXhpc1NlcnZpY2VzSXRlciA9IHRoaXMuYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGF4aXNTZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHRoaXMuYXhpc0JpbmRpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnQoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkpLmdldEJpbmRpbmcoKTsKLQotICAgICAgICAgICAgICAgIC8vIHNlZSB0aGUgY29tbWVudCBhdCB1cGRhdGVNYXBwZXJDbGFzc25hbWVzIGZvciBkZXRhaWxzIGFuZCByZWFzb25zIGZvcgotICAgICAgICAgICAgICAgIC8vIGNhbGxpbmcgdGhpcyBtZXRob2QKLSAgICAgICAgICAgICAgICBpZiAobWFwcGVyLmlzT2JqZWN0TWFwcGluZ1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBjb3B5TWFwKG9yaWdpbmFsTWFwLCB0aGlzLm1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWFwcGVyRm9yTWVzc2FnZVJlY2VpdmVyKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29weVRvRmF1bHRNYXAoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2hhbmRsZSBmYXVsdHMKLSAgICAgICAgICAgICAgICBnZW5lcmF0ZUFuZFBvcHVsYXRlRmF1bHROYW1lcygpOwotCi0gICAgICAgICAgICAgICAgLy93cml0ZSB0aGUgRXhjZXB0aW9ucwotICAgICAgICAgICAgICAgIHdyaXRlRXhjZXB0aW9ucygpOwotCi0gICAgICAgICAgICAgICAgLy93cml0ZSB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLSAgICAgICAgICAgICAgICB3cml0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0gICAgICAgICAgICAgICAgLy93cml0ZSB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLSAgICAgICAgICAgICAgICB3cml0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKTsKLQotICAgICAgICAgICAgICAgIC8vd3JpdGUgdGhlIFNlcnZpY2UgQ2xhc3MKLSAgICAgICAgICAgICAgICB3cml0ZVNlcnZpY2VDbGFzcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzYXZlIGJhY2sgdHlwZSBtYXAKLSAgICAgICAgICAgIGlmICh0aGlzLm1hcHBlci5pc09iamVjdE1hcHBpbmdQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBjb3B5TWFwKG9yaWdpbmFsTWFwLCB0aGlzLm1hcHBlci5nZXRBbGxNYXBwZWROYW1lcygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd3JpdGUgc2VydmljZSB4bWwKLSAgICAgICAgICAgIC8vIGlmIGFza2VkCi0gICAgICAgICAgICBpZiAoY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNHZW5lcmF0ZURlcGxveWVtZW50RGVzY3JpcHRvcigpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTZXJ2aWNlWG1sKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vd3JpdGUgdGhlIGFudCBidWlsZAotICAgICAgICAgICAgLy93ZSBza2lwIHRoaXMgZm9yIHRoZSBmbGF0dGVuZWQgY2FzZQotICAgICAgICAgICAgaWYgKCFjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVBbnRCdWlsZCgpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfSBjYXRjaCAoQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gY2dFeHApIHsKLSAgICAgICAgICAgIHRocm93IGNnRXhwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRG9jdW1lbnQgc2tlbGV0b25Nb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yU0VJKCk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZToiLCBza2VsZXRvbk1vZGVsKTsKLSAgICAgICAgRmlsZVdyaXRlciBza2VsZXRvbkludGVyZmFjZVdyaXRlciA9IG5ldyBTa2VsZXRvbkludGVyZmFjZVdyaXRlcigKLSAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSkKLSAgICAgICAgICAgICAgICAsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIHNrZWxldG9uSW50ZXJmYWNlV3JpdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgc2tlbGV0b25Nb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yU0VJSW1wbCgpOwotICAgICAgICBkZWJ1Z0xvZ0RvY3VtZW50KCJEb2N1bWVudCBmb3IgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U6Iiwgc2tlbGV0b25Nb2RlbCk7Ci0gICAgICAgIEZpbGVXcml0ZXIgaW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIgPSBuZXcgSW50ZXJmYWNlSW1wbGVtZW50YXRpb25Xcml0ZXIoCi0gICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwgbnVsbCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RGlyZWN0b3J5KGNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpCi0gICAgICAgICAgICAgICAgLCB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkpOwotCi0gICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCBpbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBleGNlcHRpb24gY2Fsc3Nlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBmdWxseVF1YWxpZmllZEZhdWx0Q2xhc3NOYW1lTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQotCi0gICAgICAgICAgICBEb2N1bWVudCBza2VsZXRvbk1vZGVsID0gY3JlYXRlRE9NRG9jdW1lbnRGb3JFeGNlcHRpb24oa2V5KTsKLSAgICAgICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBFeGNlcHRpb24gQ2xhc3M6Iiwgc2tlbGV0b25Nb2RlbCk7Ci0gICAgICAgICAgICBFeGNlcHRpb25Xcml0ZXIgZXhjZXB0aW9uV3JpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbldyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlRmlsZShza2VsZXRvbk1vZGVsLCBleGNlcHRpb25Xcml0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIHNlcnZpY2UgY2xhc3MKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXJ2aWNlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgc2tlbGV0b25Nb2RlbCA9IGNyZWF0ZURPTURvY3VtZW50Rm9yU2VydmljZUNsYXNzKCk7Ci0gICAgICAgIGRlYnVnTG9nRG9jdW1lbnQoIkRvY3VtZW50IGZvciBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZToiLCBza2VsZXRvbk1vZGVsKTsKLSAgICAgICAgRmlsZVdyaXRlciBza2VsZXRvbkludGVyZmFjZVdyaXRlciA9IG5ldyBTa2VsZXRvbldyaXRlcigKLSAgICAgICAgICAgICAgICBjb2RlR2VuQ29uZmlndXJhdGlvbi5pc0ZsYXR0ZW5GaWxlcygpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dERpcmVjdG9yeShjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBudWxsKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXREaXJlY3RvcnkoY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TG9jYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0U291cmNlTG9jYXRpb24oKSkKLSAgICAgICAgICAgICAgICAsIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKSk7Ci0KLSAgICAgICAgd3JpdGVGaWxlKHNrZWxldG9uTW9kZWwsIHNrZWxldG9uSW50ZXJmYWNlV3JpdGVyKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTZXJ2aWNlWE1MKCkgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZXMiKTsKLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgdGhpcy5heGlzQmluZGluZyA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50KGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKS5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IChTdHJpbmcpYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEpBWFdTX1BPUlRfVFlQRV9OQU1FKS5nZXRWYWx1ZSgpICsgSkFYV1NfSU1QTF9TVUZGSVg7Ci0gICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChnZXRTZXJ2aWNlRWxlbWVudChzZXJ2aWNlTmFtZSwgY2xhc3NOYW1lLCBkb2MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgWE1MIG1vZGVsIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gRE9NIERvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU0VJKCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBYTUwgbW9kZWwgZm9yIHRoZSBTZXJ2aWNlIEVuZHBvaW50IGludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAqCi0gICAgICogQHJldHVybiBET00gRG9jdW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRG9jdW1lbnQgY3JlYXRlRE9NRG9jdW1lbnRGb3JTRUlJbXBsKCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIFhNTCBtb2RlbCBmb3IgdGhlIFNlcnZpY2UgQ2xhc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gRE9NIERvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yU2VydmljZUNsYXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSBYTUwgbW9kZWwgZm9yIGEgRXhjZXB0aW9uIENsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFN0cmluZwotICAgICAqIEByZXR1cm4gRE9NIERvY3VtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IERvY3VtZW50IGNyZWF0ZURPTURvY3VtZW50Rm9yRXhjZXB0aW9uKFN0cmluZyBrZXkpOwotCi0gICAgLyoqCi0gICAgICogQSByZXN1c2FibGUgbWV0aG9kIHRvIHJldHVybiB0aGUgc2VydmljZSBlbGVtZW50IGZvciBjcmVhdGluZyB0aGUgc2VydmljZSB4bWwKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZQotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiBET00gRWxlbWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldFNlcnZpY2VFbGVtZW50KFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgRG9jdW1lbnQgZG9jKSB7Ci0KLSAgICAgICAgaWYgKGFsbFNlcnZpY2VJbmZvSG9sZGVyLmdldChzZXJ2aWNlTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5pbmZvSG9sZGVyID0gKE1hcCkgYWxsU2VydmljZUluZm9Ib2xkZXIuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImludGVyZmFjZSIpOwotCi0gICAgICAgIGFkZEF0dHJpYnV0ZShkb2MsICJwYWNrYWdlIiwgIiIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgImNsYXNzcGFja2FnZSIsIGNvZGVHZW5Db25maWd1cmF0aW9uLmdldFBhY2thZ2VOYW1lKCksIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm5hbWUiLCBjbGFzc05hbWUsIHJvb3RFbGVtZW50KTsKLQotICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzV3JpdGVUZXN0Q2FzZSgpKSB7Ci0gICAgICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAidGVzdE9taXQiLCAidHJ1ZSIsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBhZGRBdHRyaWJ1dGUoZG9jLCAic2VydmljZW5hbWUiLCBzZXJ2aWNlTmFtZSwgcm9vdEVsZW1lbnQpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWVwVG9DbGFzc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpbmZvSG9sZGVyLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWx0ID0gYWRkRWxlbWVudChkb2MsICJtZXNzYWdlcmVjZWl2ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUphdmFDbGFzc05hbWUoc2VydmljZU5hbWUpICsgbWVwVG9TdWZmaXhNYXAuZ2V0KGtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgYWRkQXR0cmlidXRlKGRvYywgIm1lcFVSSSIsIGtleS50b1N0cmluZygpLCBlbHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBsb2FkT3BlcmF0aW9ucyhkb2MsIHJvb3RFbGVtZW50LCBudWxsKTsKLQotICAgICAgICByZXR1cm4gcm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLy9VdGlsIG1ldGhvZHMKLSAgICBwdWJsaWMgU3RyaW5nIGV4dHJhdENsYXNzTmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0gICAgICAgIGlmIChmdWxseVF1YWxpZmllZE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGZ1bGx5UXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoZnVsbHlRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCcuJyksCi0gICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWROYW1lLmxlbmd0aCgpKTsKLQotICAgICAgICBpZiAoY2xhc3NOYW1lLmNoYXJBdCgwKSA9PSAnLicpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLS8vICAgICAgICBjbGFzc05hbWUgPSBtYWtlSmF2YUNsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTmFtZUNvbGxpc2lvbihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgY2xhc3NOYW1lID0gbWFrZUphdmFDbGFzc05hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgU3RyaW5nIGZ1bGxRdWFsaWZpZWROYW1lID0gZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNsYXNzTmFtZSwgcGFja2FnZU5hbWUpOwotICAgICAgICBNYXAgbWFwID0gbWFwcGVyLmdldEFsbE1hcHBlZE5hbWVzKCk7Ci0gICAgICAgIGlmIChtYXAuY29udGFpbnNWYWx1ZShmdWxsUXVhbGlmaWVkTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUgKyBzdWZmaXg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbi5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0Fic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4YmEwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24gaW1wbGVtZW50cyBDb2RlR2VuRXh0ZW5zaW9uIHsKLQotICAgIHByb3RlY3RlZCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2codGhpcy5nZXRDbGFzcygpKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0Fic3RyYWN0REJQcm9jZXNzaW5nRXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzZTBkZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0REJQcm9jZXNzaW5nRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdG8gdGVzdCB3aGV0aGVyIHRoZSBwYXNzZWQgaW4gZnJhbWV3b3JrIG5hbWUgaXMgcmVsZXZhbnQgdG8gdGhpcyBleHRlbnNpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGJGcmFtZXdvcmtOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdGVzdEZhbGxUaHJvdWdoKFN0cmluZyBkYkZyYW1ld29ya05hbWUpIHsKLSAgICAgICAgTWFwIGV4dGVuc2lvbnNNYXAgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0RGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lVG9FeHRlbnNpb25NYXAoKTsKLSAgICAgICAgU3RyaW5nIG1hcHBlZEV4dGVuc2lvbiA9IGV4dGVuc2lvbnNNYXAuZ2V0KGRiRnJhbWV3b3JrTmFtZSkgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uc01hcC5nZXQoZGJGcmFtZXdvcmtOYW1lKS50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIHJldHVybiAhKGdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhtYXBwZWRFeHRlbnNpb24pKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9BYnN0cmFjdFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3NTBmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vQWJzdHJhY3RQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJldHR5UHJpbnRlckV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24gewotICAgIC8qKiBJZiB0aGUgZXh0ZW5zaW9uIGZvciBwcm9wZXJ0eSBmaWxlIGNoYW5nZXMgaXQgbWlnaHQgZWZmZWN0IHRoaXMgYXMgd2VsbCAhISEgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVFeHRlbnNpb24gPSAiIjsKLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vcmVjdXJzZSB0aHJvdWdoIHRoZSBvdXRwdXQgZmlsZXMgYW5kIHByZXR0aWZ5IHRoZW0KLSAgICAgICAgRmlsZSBvdXRwdXRGb2xkZXIgPSBjb25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCk7Ci0gICAgICAgIHByZXR0aWZ5KG91dHB1dEZvbGRlcixjb25maWd1cmF0aW9uKTsKLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVjdXJzaXZlIHByb2NlZHVyZSB0byBwcmV0dGlmeSB0aGUgZmlsZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJldHRpZnkoRmlsZSBmaWxlLCBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLSAgICAgICAgTGlzdCB4bWxGaWxlTGlzdCA9IGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0WG1sRmlsZU5hbWVzTGlzdCgpOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB4bWxGaWxlTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgcHJldHRpZnlGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudCB0aGlzIHRvIGNhbGwgdGhlIHByb3BlciBwcmV0dHkgcHJpbnRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJldHRpZnlGaWxlKEZpbGUgZmlsZSk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0NvZGVHZW5FeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9Db2RlR2VuRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjMxMjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0NvZGVHZW5FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29kZUdlbkV4dGVuc2lvbiB7Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9EZWZhdWx0RGF0YWJpbmRpbmdFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9EZWZhdWx0RGF0YWJpbmRpbmdFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjYzUxMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vRGVmYXVsdERhdGFiaW5kaW5nRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5DRGVmYXVsdFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkRlZmF1bHRUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERlZmF1bHREYXRhYmluZGluZ0V4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0REJQcm9jZXNzaW5nRXh0ZW5zaW9uIHsKLQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFR5cGVNYXBwZXIgbWFwcGVyID0gY29uZmlndXJhdGlvbi5nZXRUeXBlTWFwcGVyKCk7Ci0gICAgICAgIGlmICh0ZXN0RmFsbFRocm91Z2goY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLSAgICAgICAgICAgIC8vaWYgaXQncyBmYWxsIHRocm91Z2ggZm9yIHRoZSBkZWZhdWx0IGRhdGFiaW5kaW5nIGV4dGVuc2lvbiBhbmQgYSBtYXBwZXIgaGFzCi0gICAgICAgICAgICAvL25vdCB5ZXQgYmVpbmcgc2V0LCB0aGVuIHRoZXJlJ3MgYSBwcm9ibGVtLgotICAgICAgICAgICAgLy9IZW5jZSBjaGVjayB0aGUgbWFwcGVyIHN0YXR1cyBoZXJlCi0KLSAgICAgICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGRuJ3QgaGFwcGVuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi5ub1Byb3BlckRhdGFiaW5kaW5nIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8vdGhlIG1hcHBlciBoYXMgbm90IGJlZW4gcG9wdWxhdGVkIHlldC4gc2luY2UgdGhpcyBleHRlbnNpb24gaXMKLSAgICAgICAgLy9yZWdpc3RlcmVkIGZvciAtZCBub25lLCB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgbmV3IHR5cGUgbWFwcGVyCi0gICAgICAgIC8vdGhhdCBzZXJ2ZXMgb25seSB0aGUgZGVmYXVsdCB0eXBlcwotICAgICAgICBpZiAobWFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLnRyaW0oKS5lcXVhbHMoIiIpICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiYyIpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUeXBlTWFwcGVyKG5ldyBDRGVmYXVsdFR5cGVNYXBwZXIoKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUeXBlTWFwcGVyKG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0V4Y2x1ZGVQYWNrYWdlRXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vRXhjbHVkZVBhY2thZ2VFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NThiNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vRXhjbHVkZVBhY2thZ2VFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogdGhpcyBleHRlbnNpb24gZGVsZXRlcyB0aGUgcGFja2FnZXMgc2VwY2lmaWVzIGJ5IHRoZSB1c2VyIGZyb20gdGhlCi0gKiBnZW5lcmF0ZWQgY29kZS4KLSAqIHRoaXMgZmVhdHVyZSBpcyB2ZXJ5IGltcG9ydGFudCB0byByZW1vdmUgc29tZSBjb21tb25seSBnZW5lcmF0ZWQgY2xhc3Nlcy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRXhjbHVkZVBhY2thZ2VFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uIHsKLQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBleGNsdWRlUGFja2FnZXNTdHJpbmcgPSBjb25maWd1cmF0aW9uLmdldEV4Y2x1ZGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmICgoZXhjbHVkZVBhY2thZ2VzU3RyaW5nICE9IG51bGwpICYmIChleGNsdWRlUGFja2FnZXNTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVQYWNrYWdlcyA9IGV4Y2x1ZGVQYWNrYWdlc1N0cmluZy5zcGxpdCgiLCIpOwotICAgICAgICAgICAgRmlsZSBvdXRQdXRGaWxlTG9jYXRpb24gPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uaXNGbGF0dGVuRmlsZXMoKSkgewotICAgICAgICAgICAgICAgIG91dFB1dEZpbGVMb2NhdGlvbiA9IGdldE91dHB1dERpcmVjdG9yeShjb25maWd1cmF0aW9uLmdldE91dHB1dExvY2F0aW9uKCksIG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRQdXRGaWxlTG9jYXRpb24gPSBnZXRPdXRwdXREaXJlY3RvcnkoY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMb2NhdGlvbigpLCBjb25maWd1cmF0aW9uLmdldFNvdXJjZUxvY2F0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGV4Y2x1ZVBhY2thZ2UgPSBudWxsOwotICAgICAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVQYWNrYWdlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRlbXBGaWxlID0gb3V0UHV0RmlsZUxvY2F0aW9uOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gZXhjbHVkZVBhY2thZ2VzW2ldLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yICg7IGogPCBkaXJlY3Rvcmllcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLCBkaXJlY3Rvcmllc1tqXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGVtcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChqID09IGRpcmVjdG9yaWVzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoaXMgbG9vcCBoYXMgZ29uZSB0byBlbmQgYW5kIGEgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0cyBhdCB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZURpcmVjdG9yeSh0ZW1wRmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVEaXJlY3RvcnkoY2hpbGRyZW5baV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZHJlbltpXS5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBkZWxldGUgdGhpcyBkaXJlY3RvcnkKLSAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoRmlsZSBvdXRwdXREaXIsIFN0cmluZyBkaXIyKSB7Ci0gICAgICAgIGlmIChkaXIyICE9IG51bGwgJiYgISIiLmVxdWFscyhkaXIyKSkgewotICAgICAgICAgICAgb3V0cHV0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyLCBkaXIyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghb3V0cHV0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3V0cHV0RGlyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KQVhCUklFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KQVhCUklFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5Y2FiNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vSkFYQlJJRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25maWdQcm9wZXJ0eUZpbGVMb2FkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCUklFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdERCUHJvY2Vzc2luZ0V4dGVuc2lvbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRk9MREVSID0gInNjaGVtYXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR1MgPSAibWFwcGluZ3MiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkcgPSAibWFwcGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX05BTUUgPSAiamF2YWNsYXNzIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRk9MREVSID0gIk1hcHBpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFUl9GSUxFX05BTUUgPSAibWFwcGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfUEFUSCA9ICIvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1JJX0FQSV9DTEFTUyA9ICJqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9SSV9JTVBMX0NMQVNTID0gImNvbS5zdW4ueG1sLmJpbmQuVXRpbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9SSV9YSkNfQ0xBU1MgPSAiY29tLnN1bi50b29scy54amMuYXBpLlhKQyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1JJX1VUSUxJVFlfQ0xBU1MgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4YnJpLkNvZGVHZW5lcmF0aW9uVXRpbGl0eSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1JJX1BST0NFU1NfTUVUSE9EID0gInByb2Nlc3NTY2hlbWFzIjsKLQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotICAgICAgICAvL3Rlc3QgdGhlIGRhdGFiaW5kaW5nIHR5cGUuIElmIG5vdCBqdXN0IGZhbGwgdGhyb3VnaAotICAgICAgICBpZiAodGVzdEZhbGxUaHJvdWdoKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyB0cnkgZHVtbXkgbG9hZCBvZiBmcmFtZXdvcmsgY2xhc3NlcyBmaXJzdCB0byBjaGVjayBtaXNzaW5nIGphcnMKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgY2wubG9hZENsYXNzKEpBWEJfUklfQVBJX0NMQVNTKTsKLSAgICAgICAgICAgICAgICBjbC5sb2FkQ2xhc3MoSkFYQl9SSV9JTVBMX0NMQVNTKTsKLSAgICAgICAgICAgICAgICBjbC5sb2FkQ2xhc3MoSkFYQl9SSV9YSkNfQ0xBU1MpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpBWC1CIFJJIEpBUnMgbm90IG9uIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBsb2FkIHRoZSBhY3R1YWwgdXRpbGl0eSBjbGFzcwotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGF6eiA9IEpBWEJSSUV4dGVuc2lvbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhKQVhCX1JJX1VUSUxJVFlfQ0xBU1MpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpBWC1CIFJJIGJpbmRpbmcgZXh0ZW5zaW9uIG5vdCBpbiBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW52b2tlIHV0aWxpdHkgY2xhc3MgbWV0aG9kIGZvciBhY3R1YWwgcHJvY2Vzc2luZwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGNsYXp6LmdldE1ldGhvZChKQVhCX1JJX1BST0NFU1NfTUVUSE9ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IExpc3QuY2xhc3MsIEVsZW1lbnRbXS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuQ29uZmlndXJhdGlvbi5jbGFzcyB9KTsKLSAgICAgICAgICAgIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIExpc3QgYXhpc1NlcnZpY2VzID0gY29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZEFsbChheGlzU2VydmljZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbGVtZW50W10gYWRkaXRpb25hbFNjaGVtYXMgPSBsb2FkQWRkaXRpb25hbFNjaGVtYXMoKTsKLSAgICAgICAgICAgIFR5cGVNYXBwZXIgbWFwcGVyID0gKFR5cGVNYXBwZXIpbWV0aG9kLmludm9rZShudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHNjaGVtYXMsIGFkZGl0aW9uYWxTY2hlbWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB9KTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSB0eXBlIG1hcHBlciB0byB0aGUgY29uZmlnCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobWFwcGVyKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogTG9hZGluZyB0aGUgZXh0ZXJuYWwgc2NoZW1hcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZWxlbWVudCBhcnJheSBjb25zaXN0aW5nIG9mIHRoZSB0aGUgRE9NIGVsZW1lbnQgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBzY2hlbWFzCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50W10gbG9hZEFkZGl0aW9uYWxTY2hlbWFzKCkgewotICAgICAgICAvL2xvYWQgYWRkaXRpb25hbCBzY2hlbWFzCi0gICAgICAgIFN0cmluZ1tdIHNjaGVtYU5hbWVzID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldFRoaXJkUGFydHlTY2hlbWFOYW1lcygpOwotICAgICAgICBFbGVtZW50W10gc2NoZW1hRWxlbWVudHM7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBhZGRpdGlvbmFsU2NoZW1hRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZ2V0TmFtZXNwYWNlQXdhcmVEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvL3RoZSBsb2NhdGlvbiBmb3IgdGhlIHRoaXJkIHBhcnR5IHNjaGVtYTtzIGlzIGhhcmRjb2RlZAotICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKHNjaGVtYU5hbWVzW2ldLnRyaW0oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc2NoZW1hU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShTQ0hFTUFfUEFUSCArIHNjaGVtYU5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jdW1lbnRCdWlsZGVyLnBhcnNlKHNjaGVtYVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxTY2hlbWFFbGVtZW50cy5hZGQoZG9jLmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBTY2hlbWEgZWxlbWVudCBhcnJheQotICAgICAgICAgICAgc2NoZW1hRWxlbWVudHMgPSBuZXcgRWxlbWVudFthZGRpdGlvbmFsU2NoZW1hRWxlbWVudHMuc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNjaGVtYUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudHNbaV0gPSAoRWxlbWVudClhZGRpdGlvbmFsU2NoZW1hRWxlbWVudHMuZ2V0KGkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi5hZGRpdGlvbmFsU2NoZW1hRmFpbHVyZSIpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzY2hlbWFFbGVtZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50QnVpbGRlciBnZXROYW1lc3BhY2VBd2FyZURvY3VtZW50QnVpbGRlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KQVhXU1dhcHBlckV4dGVuc2lvbi5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0pBWFdTV2FwcGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzE3M2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0pBWFdTV2FwcGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgSkFYV1NXYXBwZXJFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uIHsKLSAgICBwcml2YXRlIENvZGVHZW5Db25maWd1cmF0aW9uIGNvZGVHZW5Db25maWd1cmF0aW9uOwotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29kZUdlbkNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotICAgICAgICBpZiAoIWNvZGVHZW5Db25maWd1cmF0aW9uLmlzUGFyYW1ldGVyc1dyYXBwZWQoKSAmJiBjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLmVxdWFscygiamF4LXdzIikpIHsKLQotICAgICAgICAgICAgLy93YWxrIHRoZSBzY2hlbWEgYW5kIGZpbmQgdGhlIHRvcCBsZXZlbCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXhpc1NlcnZpY2VzKCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBzZXJ2aWNlcy5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdyYXBwYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBpbnB1dCBwYXJhbWV0ZXIgZGV0YWlscyB0byB1bndyYXAgdGhlIHJlcXVlc3RzCi0gICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSAoKEF4aXNPcGVyYXRpb24pIG1lc3NhZ2UuZ2V0UGFyZW50KCkpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzY2hlbWFFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMob3BOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGFibGUgPSB3YWxrU2NoZW1hKG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIG91dCBwdXQgcGFyYW1ldGVyIGRldGFpbHMgYXMgd2VsbCB0byB1bndyYXAgdGhlIHJlc3BvbnNlcwotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkgJiYgd3JhcHBhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3YWxrU2NoZW1hKG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuT1VUUFVUX1BBUlRfUU5BTUVfU1VGRklYKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHdhbGtTY2hlbWEoQXhpc01lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHFuYW1lU3VmZml4KSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL25vdGhpbmcgdG8gdW53cmFwCi0gICAgICAgIGlmIChtZXNzYWdlLmdldFNjaGVtYUVsZW1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gbWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCk7Ci0vLyAgICAgICAgU3RyaW5nIG9wTmFtZSA9ICgoQXhpc09wZXJhdGlvbikgbWVzc2FnZS5nZXRQYXJlbnQoKSkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotLy8gICAgICAgIGlmKCFzY2hlbWFFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMob3BOYW1lKSkKLS8vICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlUW5hbWUgPSBzY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0KLSAgICAgICAgaWYgKHNjaGVtYVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGVRbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgc2NoZW1hIHR5cGUgZnJvbSBhbGwgdGhlIHNjaGVtYXMKLSAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBnZXQgdGhlIHNjaGVtYSBvZiB0aGUgZXh0ZW5zaW9uIHR5cGUgZnJvbSB0aGUgcGFyZW50IHNjaGVtYS4gRm9yIHRoYXQgbGV0J3MgZmlyc3QgcmV0cmlldmUKLSAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBtZXNzYWdlLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzY2hlbWFzTGlzdCA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2NoZW1hc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYSA9IChYbWxTY2hlbWEpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWEsIHNjaGVtYVR5cGVRbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgaWYoIWhhbmRsZUFsbENhc2VzT2ZDb21wbGV4VHlwZXMoc2NoZW1hVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCkpewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0vLyAgICAgICAgZWxzZSBpZiAoKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB8fAotLy8gICAgICAgICAgICAgICAgKChzY2hlbWFUeXBlUW5hbWUgIT0gbnVsbCkgJiYgKHNjaGVtYVR5cGVRbmFtZS5lcXVhbHMobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJhbnlUeXBlIikpKSkpIHsKLS8vICAgICAgICAgICAgUU5hbWUgb3BOYW1lID0gKChBeGlzT3BlcmF0aW9uKSBtZXNzYWdlLmdldFBhcmVudCgpKS5nZXROYW1lKCk7Ci0vLyAgICAgICAgICAgIHBhcnROYW1lTGlzdC5hZGQoV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLS8vICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLS8vICAgICAgICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKLS8vICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVR5cGUgPT0gbnVsbCkgewotLy8gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgZGV0ZXJtaW5lIHRoZSBzY2hlbWEgdHlwZSBmb3IgdGhlICIKLS8vICAgICAgICAgICAgICAgICAgICArIHNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpKTsKLS8vICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAvL3dlJ3ZlIG5vIGlkZWEgaG93IHRvIHVud3JhcCBhIG5vbiBjb21wbGV4VHlwZSEhISEhIQotLy8gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdCIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlLmdldE5hbWUoKSwgImNvbXBsZXhUeXBlIikpOwotLy8gICAgICAgIH0KLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL3NldCBpbiB0aGUgYXhpcyBtZXNzYWdlIHRoYXQgdGhlIHVud3JhcHBpbmcgd2FzIHN1Y2Nlc3MKLSAgICAgICAgICAgIG1lc3NhZ2UuYWRkUGFyYW1ldGVyKGdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVksCi0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSkpOwotCi0gICAgICAgICAgICAvLyBhdHRhY2ggdGhlIG9wTmFtZSBhbmQgdGhlIHBhcnRzIG5hbWUgbGlzdCBpbnRvIHRoZQotICAgICAgICAgICAgLy8gYXhpcyBtZXNzYWdlIGJ5IHVzaW5nIHRoZSBob2xkZXIKLSAgICAgICAgICAgIE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgaW5mb0hvbGRlciA9IG5ldyBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyKCk7Ci0gICAgICAgICAgICBpbmZvSG9sZGVyLnNldE9wZXJhdGlvbk5hbWUoKChBeGlzT3BlcmF0aW9uKSBtZXNzYWdlLmdldFBhcmVudCgpKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgaW5mb0hvbGRlci5zZXRQYXJ0c0xpc3QocGFydE5hbWVMaXN0KTsKLQotICAgICAgICAgICAgLy9hdHRhY2ggaXQgdG8gdGhlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIG1lc3NhZ2UuYWRkUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9ERVRBSUxTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9Ib2xkZXIpKTsKLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBhIHBhcmFtZXRlcyBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFBhcmFtZXRlciBteVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgbXlQYXJhbWV0ZXIuc2V0TmFtZShrZXkpOwotICAgICAgICBteVBhcmFtZXRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBteVBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYVR5cGUgZ2V0U2NoZW1hVHlwZShYbWxTY2hlbWEgc2NoZW1hLCBRTmFtZSB0eXBlTmFtZSkgewotICAgICAgICBYbWxTY2hlbWFUeXBlIHhtbFNjaGVtYVR5cGUgPSBudWxsOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVR5cGUgPSBzY2hlbWEuZ2V0VHlwZUJ5TmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoeG1sU2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgaW4gYW4gaW1wb3J0IG9yIGFuIGluY2x1ZGUKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaW5jbHVkZXNJdGVyID0gaW5jbHVkZXMuZ2V0SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmNsdWRlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBpbmNsdWRlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbXBvcnQpIG9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hVHlwZSA9IGdldFNjaGVtYVR5cGUoc2NoZW1hMSwgdHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWExLCB0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZUFsbENhc2VzT2ZDb21wbGV4VHlwZXMoWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lU3VmZml4KSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBpZiBhIGNvbXBsZXggdHlwZSBuYW1lIGV4aXRzIGZvciBhIGVsZW1lbnQgdGhlbgotICAgICAgICAvLyB3ZSBrZWVwIHRoYXQgY29tcGxleCB0eXBlIHRvIHN1cHBvcnQgdW53cmFwcGluZwotICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjbXBseFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHNjaGVtYVR5cGU7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24geG1sT2JqZWN0Q29sbGVjdGlvbiA9IGNtcGx4VHlwZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBpZiAoeG1sT2JqZWN0Q29sbGVjdGlvbi5nZXRDb3VudCgpICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoY21wbHhUeXBlLmdldENvbnRlbnRNb2RlbCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY21wbHhUeXBlLmdldFBhcnRpY2xlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1hNTFNjaGVtYVNlcXVlbmNlKGNtcGx4VHlwZS5nZXRQYXJ0aWNsZSgpLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbm93IGxldHMgaGFuZGxlIGNhc2Ugd2l0aCBleHRlbnNpb25zCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NDb21wbGV4Q29udGVudE1vZGVsKGNtcGx4VHlwZSwgbWVzc2FnZSwgcGFydE5hbWVMaXN0LCBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlcyBoZXJlCi0gICAgICAgICAgICAvLyBwcm9jZXNzQXR0cmlidXRlcyhjbXBseFR5cGUsIG1lc3NhZ2UsIHBhcnROYW1lTGlzdCwgcW5hbWVTdWZmaXgpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChYbWxTY2hlbWFDb21wbGV4VHlwZSBjbXBseFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETyBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzWE1MU2NoZW1hU2VxdWVuY2UoWG1sU2NoZW1hUGFydGljbGUgc2NoZW1hUGFydGljbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzY2hlbWFQYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiBuYW1lIGFuZCBuYW1lc3BhY2UsCi0gICAgICAgICAgICAvLyBwYXJ0IG5hbWUgYW5kIGhhbmcgdGhlbSBzb21ld2hlcmUgPyBUaGUgaWRlYWwgcGxhY2UKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIHRoZSBwcm9wZXJ0eSBiYWcgaW4gdGhlIGNvZGVnZW4gY29uZmlnIQotICAgICAgICAgICAgUU5hbWUgb3BOYW1lID0gKChBeGlzT3BlcmF0aW9uKSBtZXNzYWdlLmdldFBhcmVudCgpKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlID0gKFhtbFNjaGVtYVNlcXVlbmNlKSBzY2hlbWFQYXJ0aWNsZTsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSBzZXF1ZW5jZS5nZXRJdGVtcygpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGVtcHR5IHNlcXVlbmNlLCByZXR1cm4KLSAgICAgICAgICAgIGlmIChpdGVtcy5nZXRDb3VudCgpID09IDApIHsKLS8qYmUgY2FyZWZ1bGwgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGl0ZW1zLmdldEl0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IGVhY2ggYW5kIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYXZlcnNlIHRocm91Z2ggdGhlbQotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAvL2FkZCB0aGUgZWxlbWVudCBuYW1lIHRvIHRoZSBwYXJ0IG5hbWUgbGlzdAotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSAoWG1sU2NoZW1hRWxlbWVudCkgaXRlbTsKLS8vICAgICAgICAgICAgICAgICAgICBpZih4bWxTY2hlbWFFbGVtZW50LmlzTmlsbGFibGUoKSl7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLS8vICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hRWxlbWVudC5nZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSB4bWxTY2hlbWFFbGVtZW50LmdldFJlZk5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0geG1sU2NoZW1hRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyAgcGFydCBuYW1lcyBhcmUgbm90IHVuaXF1ZSBhY3Jvc3MgbWVzc2FnZXMuIEhlbmNlCi0gICAgICAgICAgICAgICAgICAgIC8vICB3ZSBuZWVkIHNvbWUgd2F5IG9mIG1ha2luZyB0aGUgcGFydCBuYW1lIGEgdW5pcXVlCi0gICAgICAgICAgICAgICAgICAgIC8vICBvbmUgKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgICAgICAgICAvLyAgaXMgYSBnbG9iYWwgbGlzdCBvZiB0eXBlcykuCi0gICAgICAgICAgICAgICAgICAgIC8vICBUaGUgc2VlbWluZ2x5IGJlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gIHNwZWNpZnkgYSBuYW1lc3BhY2UgZm9yIHRoZSBwYXJ0IFFOYW1lIHJlZmVyZW5jZSB3aGljaAotICAgICAgICAgICAgICAgICAgICAvLyAgaXMgc3RvcmVkIGluIHRoZSAgbGlzdC4gVGhpcyBwYXJ0IHFuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vICB0ZW1wb3JhcnkgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGl0J3MKLSAgICAgICAgICAgICAgICAgICAgLy8gIG5hbWVzcGFjZSBVUkkgKHdoaWNoIGhhcHBlbmVkIHRvIGJlIHRoZSBvcGVyYXRpb24gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLy8gIHdpdGggX2lucHV0IGF0dGFjaGVkIHRvIGl0Ci0KLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWVMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJ0aWNsZSBjb250YWlucyBhbnl0aGluZyBvdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgICAgIC8vIGEgWE1MU2NoZW1hRWxlbWVudCB0aGVuIHdlIGFyZSBub3QgaW4gYSBwb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyB0byB1bndyYXAgaXQKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFBbnkpIHsKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB4czphbnksIHRoZW4gdGhlcmUgaXMgbm8gcGFydCBuYW1lIGZvciBpdC4gVXNpbmcgQU5ZX0VMRU1FTlRfRklFTERfTkFNRQotLy8gICAgICAgICAgICAgICAgICAgIC8vIGZvciBpdCBmb3Igbm93Ci0vLwotLy8gICAgICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0byBoYW5kbGUgYm90aCBtYXhvY2N1cnMgMSBhbmQgbWF4b2NjdXJzID4gMSBzaXR1YXRpb24KLS8vICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFBbnkgeG1sU2NoZW1hQW55ID0gKFhtbFNjaGVtYUFueSkgaXRlbTsKLS8vCi0vLyAgICAgICAgICAgICAgICAgICAgcGFydE5hbWVMaXN0LmFkZCgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQU5ZX0VMRU1FTlRfRklFTERfTkFNRSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdCIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHR5cGUiLCAiRWxlbWVudCIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgLy93ZSBkbyBub3Qga25vdyBob3cgdG8gZGVhbCB3aXRoIG90aGVyIHBhcnRpY2xlcwotICAgICAgICAgICAgLy9zdWNoIGFzIHhzOmFsbCBvciB4czpjaG9pY2UuIFVzdWFsbHkgb2NjdXJzIHdoZW4KLSAgICAgICAgICAgIC8vcGFzc2VkIHdpdGggdGhlIHVzZXIgYnVpbHQgV1NETCB3aGVyZSB0aGUgc3R5bGUKLSAgICAgICAgICAgIC8vaXMgZG9jdW1lbnQuCi0vLyAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFQYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNob2ljZSkgewotLy8gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0vLyAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdCIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvaWNlIiwgInNlcXVlbmNlIikpOwotLy8KLS8vICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hQWxsKSB7Ci0vLyAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiLCAic2VxdWVuY2UiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLS8vICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIiwgInNlcXVlbmNlIikpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vSmF2YVByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KYXZhUHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJhODUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KYXZhUHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUHJldHR5UHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEphdmFQcmV0dHlQcmludGVyRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3RQcmV0dHlQcmludGVyRXh0ZW5zaW9uIHsKLQotCi0gICAgcHVibGljIEphdmFQcmV0dHlQcmludGVyRXh0ZW5zaW9uKCkgewotICAgICAgICAvKgotICAgICAgICAqIElmIHRoZSBleHRlbnNpb24gZm9yIHByb3BlcnR5IGZpbGUgY2hhbmdlcyBpdCBtaWdodCBlZmZlY3QgdGhpcyBhcwotICAgICAgICAqIHdlbGwgISEhCi0gICAgICAgICovCi0gICAgICAgIGZpbGVFeHRlbnNpb24gPSAiLmphdmEiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlY3Vyc2l2ZSBwcm9jZWR1cmUgdG8gcHJldHRpZnkgdGhlIGZpbGVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXR0aWZ5KEZpbGUgZmlsZSwgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICBpZiAoZmlsZS5pc0ZpbGUoKSAmJgotICAgICAgICAgICAgICAgIGZpbGUuZXhpc3RzKCkgJiYKLSAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGZpbGVFeHRlbnNpb24pKSB7Ci0gICAgICAgICAgICBwcmV0dGlmeUZpbGUoZmlsZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBGaWxlW10gY2hpbGRGaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGRGaWxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXR0aWZ5KGNoaWxkRmlsZXNbaV0sIGNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRkZW4gdG8gY2FsbCB0aGUgamF2YSBwcmV0dHkgcHJpbnRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmV0dGlmeUZpbGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIC8vIFNwZWNpYWwgY2FzZSBqYXhicmkgZ2VuZXJhdGVkIHBhY2thZ2UtaW5mby5qYXZhIAotICAgICAgICAvLyBhcyBqYWxvcHkgY29ycnVwdHMgdGhlIHBhY2thZ2UgbGV2ZWwgYW5ub3RhdGlvbnMKLSAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscygicGFja2FnZS1pbmZvLmphdmEiKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFByZXR0eVByaW50ZXIucHJldHRpZnkoZmlsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0ppQlhFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9KaUJYRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjA3ZjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL0ppQlhFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBDb2RlIGdlbmVyYXRpb24gZGF0YSBiaW5kaW5nIGV4dGVuc2lvbiBmb3IgSmlCWCBzdXBwb3J0LiBKaUJYIGN1cnJlbnRseSByZXF1aXJlcyBhIHByZWRlZmluZWQKLSAqIGJpbmRpbmcgZGVmaW5pdGlvbiB0byBiZSBzdXBwbGllZCBpbiBvcmRlciB0byBiZSB1c2VkIHdpdGggQXhpczIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKaUJYRXh0ZW5zaW9uIGV4dGVuZHMgQWJzdHJhY3REQlByb2Nlc3NpbmdFeHRlbnNpb24gewotCi0gICAgLyoqIE5hbWUgb2YgImV4dHJhIiBvcHRpb24gdXNlZCB0byBzdXBwbHkgYmluZGluZyBkZWZpbml0aW9uIHBhdGguICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19QQVRIX09QVElPTiA9ICJiaW5kaW5nZmlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpJQlhfTU9ERUxfQ0xBU1MgPQotICAgICAgICAgICAgIm9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuQmluZGluZ0VsZW1lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKSUJYX1VUSUxJVFlfQ0xBU1MgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamlieC5Db2RlR2VuZXJhdGlvblV0aWxpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKSUJYX1VUSUxJVFlfTUVUSE9EID0gImVuZ2FnZSI7Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCi0gICAgICAgIC8vIGp1c3QgcmV0dXJuIGlmIEppQlggYmluZGluZyBub3QgYWN0aXZlCi0gICAgICAgIGlmICh0ZXN0RmFsbFRocm91Z2goY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBKaUJYIGJpbmRpbmcgZGVmaW5pdGlvbiBmaWxlIHNwZWNpZmllZAotICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KEJJTkRJTkdfUEFUSF9PUFRJT04pOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyB0cnkgZHVtbXkgbG9hZCBvZiBmcmFtZXdvcmsgY2xhc3MgZmlyc3QgdG8gY2hlY2sgbWlzc2luZyBqYXJzCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoSklCWF9NT0RFTF9DTEFTUyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSmlCWCBmcmFtZXdvcmsgamFycyBub3QgaW4gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFjdHVhbCB1dGlsaXR5IGNsYXNzCi0gICAgICAgICAgICBDbGFzcyBjbGF6ejsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xhenogPSBKaUJYRXh0ZW5zaW9uLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKEpJQlhfVVRJTElUWV9DTEFTUyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSmlCWCBiaW5kaW5nIGV4dGVuc2lvbiBub3QgaW4gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MKLSAgICAgICAgICAgIE9iamVjdCBpbnN0ID0gbnVsbDsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0KLSAgICAgICAgICAgICAgICAgICAgY2xhenouZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBDb2RlR2VuQ29uZmlndXJhdGlvbi5jbGFzcyB9KTsKLSAgICAgICAgICAgIGluc3QgPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyBjb25maWd1cmF0aW9uIH0pOwotCi0gICAgICAgICAgICAvLyBpbnZva2UgdXRpbGl0eSBjbGFzcyBtZXRob2QgZm9yIGFjdHVhbCBwcm9jZXNzaW5nCi0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKEpJQlhfVVRJTElUWV9NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgbWV0aG9kLmludm9rZShpbnN0LCBuZXcgT2JqZWN0W10geyBwYXRoIH0pOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillOwotICAgICAgICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL01vZHVsZVBvbGljeUV4dGVuc2lvbi5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL01vZHVsZVBvbGljeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2E5YzVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9Nb2R1bGVQb2xpY3lFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlUG9saWN5RXh0ZW5zaW9uIHsKLQotICAgIHB1YmxpYyBQb2xpY3lFeHRlbnNpb24gZ2V0UG9saWN5RXh0ZW5zaW9uKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9QYWNrYWdlRmluZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vUGFja2FnZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg5MjE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9QYWNrYWdlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBQYWNrYWdlRmluZGVyIGV4dGVuZHMgQWJzdHJhY3RDb2RlR2VuZXJhdGlvbkV4dGVuc2lvbiB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNvbmZpZ3VyYXRpb24uZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRS5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIC8vdXNlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGZyb20gdGhlIGF4aXMgc2VydmljZSB0byBmb3JtIGEgcGFja2FnZSBuYW1lCi0gICAgICAgICAgICAvLyBzaW5jZSBhbGwgdGhlIHNlcnZpY2VzIGFyZSBpbiBzYW1lIG5hbWUgc3BhY2UKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lU3BhY2UgPSBjb25maWd1cmF0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIHRhcmdldCBuYW1lIHNwYWNlIGV4aXN0cyBpbiB0aGUgbnMycCB0aGVuIHdlIGhhdmUgdG8gZ2V0IHRoYXQgcGFja2FnZQotICAgICAgICAgICAgaWYgKChjb25maWd1cmF0aW9uLmdldFVyaTJQYWNrYWdlTmFtZU1hcCgpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0VXJpMlBhY2thZ2VOYW1lTWFwKCkuY29udGFpbnNLZXkodGFyZ2V0TmFtZVNwYWNlLnRyaW0oKSkpIHsKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IChTdHJpbmcpY29uZmlndXJhdGlvbi5nZXRVcmkyUGFja2FnZU5hbWVNYXAoKS5nZXQodGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lLiB1c2VyIGhhdmUgbm90IGdpdmVuIGFueSBuczJwIGluZm9ybWF0aW9uIGZvciB0aGlzIG5hbWUgc3BhY2UKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IFVSTFByb2Nlc3Nvci5tYWtlUGFja2FnZU5hbWUoY29uZmlndXJhdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChwYWNrYWdlTmFtZSA9PSBudWxsKSB8fCAiIi5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICBwYWNrYWdlTmFtZSA9IFVSTFByb2Nlc3Nvci5ERUZBVUxUX1BBQ0tBR0U7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25maWd1cmF0aW9uLnNldFBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1BvbGljeUV2YWx1YXRvci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1BvbGljeUV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGMzMTQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9Qb2xpY3lFdmFsdWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFBvbGljeUV2YWx1YXRvciBpbXBsZW1lbnRzIENvZGVHZW5FeHRlbnNpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBvbGljeUV2YWx1YXRvci5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogSW5pdCBtZXRob2QgdG8gaW5pdGlhbGl6YXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZTJFeHRzTWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgTWFwIG5hbWVzcGFjZTJFeHRzTWFwKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0KLSAgICAgICAgLy8gYWRkaW5nIGRlZmF1bHQgUG9saWN5RXh0ZW5zaW9ucwotICAgICAgICBuYW1lc3BhY2UyRXh0c01hcAotICAgICAgICAgICAgICAgIC5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5L29wdGltaXplZG1pbWVzZXJpYWxpemF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBNVE9NUG9saWN5RXh0ZW5zaW9uKGNvbmZpZ3VyYXRpb24pKTsKLSAgICAgICAgbmFtZXNwYWNlMkV4dHNNYXAucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeS9lbmNvZGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRW5jb2RlUG9saWN5RXh0ZW5zaW9uKCkpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnkgPSBjb25maWd1cmF0aW9uLmdldFJlcG9zaXRvcnlQYXRoKCk7Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKHJlcG9zaXRvcnksIG51bGwpOwotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uQ3R4Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0TW9kdWxlcygpLnZhbHVlcygpCi0gICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlcyA9IGF4aXNNb2R1bGUuZ2V0U3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNb2R1bGUgbW9kdWxlID0gYXhpc01vZHVsZS5nZXRNb2R1bGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIShtb2R1bGUgaW5zdGFuY2VvZiBNb2R1bGVQb2xpY3lFeHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFBvbGljeUV4dGVuc2lvbiBleHQgPSAoKE1vZHVsZVBvbGljeUV4dGVuc2lvbiltb2R1bGUpLmdldFBvbGljeUV4dGVuc2lvbigpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZTJFeHRzTWFwLnB1dChuYW1lc3BhY2VzW2ldLCBleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJjYW5ub3QgY3JlYXRlIHJlcG9zaXRvcnkgOiBwb2xpY3kgd2lsbCBub3QgYmUgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCi0gICAgICAgIE1hcCBuYW1lc3BhY2UyRXh0TWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgLy9pbml0aWFsaXplCi0gICAgICAgIGluaXQoY29uZmlndXJhdGlvbiwgbmFtZXNwYWNlMkV4dE1hcCk7Ci0KLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRFbXB0eURvY3VtZW50KCk7Ci0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtb2R1bGUtY29kZWdlbi1wb2xpY3ktZXh0ZW5zaW9ucyIpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLSAgICAgICAgUU5hbWUgb3BOYW1lOwotICAgICAgICBQb2xpY3lJbmNsdWRlIHBvbGljeUluY2x1ZGU7Ci0gICAgICAgIFBvbGljeSBwb2xpY3k7Ci0KLSAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjb25maWd1cmF0aW9uLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBheGlzU2VydmljZXMuaXRlcmF0b3IoKTsgc2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXNlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBvcE5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIHBvbGljeUluY2x1ZGUgPSBheGlzT3BlcmF0aW9uLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgICAgICAgICBwb2xpY3kgPSBwb2xpY3lJbmNsdWRlLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQb2xpY2llcyhkb2N1bWVudCwgcm9vdEVsZW1lbnQsIHBvbGljeSwgb3BOYW1lLCBuYW1lc3BhY2UyRXh0TWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiB0aGluayBhYm91dCB0aGlzIGhvdyBjYW4gd2Ugc3VwcG9ydCB0aGlzCi0gICAgICAgIGNvbmZpZ3VyYXRpb24ucHV0UHJvcGVydHkoIm1vZHVsZS1jb2RlZ2VuLXBvbGljeS1leHRlbnNpb25zIiwgcm9vdEVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgcG9saWNpZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSByb290RWxlbWVudAotICAgICAqIEBwYXJhbSBwb2xpY3kKLSAgICAgKiBAcGFyYW0gb3BOYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY2llcyhEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCByb290RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeSBwb2xpY3ksIFFOYW1lIG9wTmFtZSwgTWFwIG5zMkV4dHMpIHsKLQotICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvbGljeS5nZXRBbHRlcm5hdGl2ZXMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNhcGNlID0gbnVsbDsKLSAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb247Ci0gICAgICAgICAgICBMaXN0IGFzc2VydGlvbkxpc3Q7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXNzZXJ0aW9ucyA9ICgoTGlzdClpdGVyYXRvci5uZXh0KCkpLml0ZXJhdG9yKCk7IGFzc2VydGlvbnMuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uID0gKEFzc2VydGlvbilhc3NlcnRpb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc2FwY2UgPSBhc3NlcnRpb24uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKChhc3NlcnRpb25MaXN0ID0gKExpc3QpbWFwLmdldCh0YXJnZXROYW1lc2FwY2UpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQodGFyZ2V0TmFtZXNhcGNlLCBhc3NlcnRpb25MaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRpb25MaXN0LmFkZChhc3NlcnRpb25zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaGVyZSB3ZSBwaWNrIHRoZSBmaXJzdCBwb2xpY3kgYWx0ZXJuYXRpdmUgYW5kIGlnbm9yIHRoZSByZXN0Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgUG9saWN5RXh0ZW5zaW9uIHBvbGljeUV4dGVuc2lvbiA9IChQb2xpY3lFeHRlbnNpb24pbnMyRXh0cy5nZXQodGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeUV4dGVuc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oImNhbm5vdCBmaW5kIGEgUG9saWN5RXh0ZW5zaW9uIHRvIHByb2Nlc3MgIiArIHRhcmdldE5hbWVzcGFjZSArICJ0eXBlIGFzc2VydGlvbnMiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcG9saWN5RXh0ZW5zaW9uLmluaXQoY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBwb2xpY3lFeHRlbnNpb24uYWRkTWV0aG9kc1RvU3R1Yihkb2N1bWVudCwgcm9vdEVsZW1lbnQsIG9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMaXN0KW1hcC5nZXQodGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IGdldEVtcHR5RG9jdW1lbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgTVRPTVBvbGljeUV4dGVuc2lvbiBpbXBsZW1lbnRzIFBvbGljeUV4dGVuc2lvbiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNldE9uY2UgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGluaXQoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgTVRPTVBvbGljeUV4dGVuc2lvbihDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkTWV0aG9kc1RvU3R1YihEb2N1bWVudCBkb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBRTmFtZSBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucykgewotCi0gICAgICAgICAgICAvLyBGSVhNRQotCi0vLyAgICAgICAgICAgIGlmICghc2V0T25jZSkgewotLy8gICAgICAgICAgICAgICAgIE9iamVjdCBwbGFpbkJhc2U2NFByb3BlcnR5TWFwID0gY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShDb25zdGFudHMuUExBSU5fQkFTRV82NF9QUk9QRVJUWV9LRVkpOwotLy8gICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucHV0UHJvcGVydHkoQ29uc3RhbnRzLkJBU0VfNjRfUFJPUEVSVFlfS0VZLCBwbGFpbkJhc2U2NFByb3BlcnR5TWFwKTsKLS8vCi0vLyAgICAgICAgICAgICAgICAgc2V0T25jZSA9IHRydWU7Ci0vLyAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICAgIEVsZW1lbnQgb3B0aW1pemVDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW1pemVDb250ZW50Iik7Ci0vLyAgICAgICAgICAgIEVsZW1lbnQgb3BOYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wTmFtZSIpOwotLy8KLS8vICAgICAgICAgICAgb3BOYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5zLXVybCIsIG9wZXJhdGlvbk5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotLy8gICAgICAgICAgICBvcE5hbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgibG9jYWxOYW1lIiwgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0vLwotLy8gICAgICAgICAgICBvcHRpbWl6ZUNvbnRlbnQuYXBwZW5kQ2hpbGQob3BOYW1lRWxlbWVudCk7Ci0vLwotLy8gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG9wdGltaXplQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBFbmNvZGVQb2xpY3lFeHRlbnNpb24gaW1wbGVtZW50cyBQb2xpY3lFeHRlbnNpb24gewotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgaW5pdChDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZE1ldGhvZHNUb1N0dWIoRG9jdW1lbnQgZG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgUU5hbWUgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGFzc2VydGlvbnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGVuY29kaW5nCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vUG9saWN5RXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vUG9saWN5RXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDM1Y2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1BvbGljeUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBQb2xpY3lFeHRlbnNpb24gewotICAgIAotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZUdlbkNvbmZpZ3VyYXRpb24pOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGhvZHNUb1N0dWIoRG9jdW1lbnQgZG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgUU5hbWUgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9TY2hlbWFVbndyYXBwZXJFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9TY2hlbWFVbndyYXBwZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0OWJhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQWxsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQW55OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ2hvaWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbnRlbnRNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hVHlwZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gaW52b2tlcyB0aGUgc2NoZW1hIHVud3JhcHBlciBkZXBlbmRpbmcgb24gdGhlIHVzZXJzIHNldHRpbmcuIGl0IGlzIGRlc2lyYWJsZSB0bwotICogcHV0IHRoaXMgZXh0ZW5zaW9uIGJlZm9yZSBvdGhlciBleHRlbnNpb25zIHNpbmNlIGV4dG5zaW9ucyBzdWNoIGFzIHRoZSBkYXRhYmluZGluZyBleHRlbnNpb24gbWF5Ci0gKiB3ZWxsIGRlcGVuZCBvbiB0aGUgc2NoZW1hIGJlaW5nIHVud3JhcHBlZCBwcmV2aW91c2x5LiBGb3IgYSBjb21wbGV0ZSB1bndyYXAgdGhlIGZvbGxvd2luZyBmb3JtYXQKLSAqIG9mIHRoZSBzY2hlbWEgaXMgZXhwZWN0ZWQgJmx0OyBlbGVtZW50ICZndDsgJmx0OyBjb21wbGV4VHlwZSAmZ3Q7ICZsdDsgc2VxdWVuY2UgJmd0OyAmbHQ7IGVsZW1lbnQKLSAqIC8mZ3Q7ICZsdDsgL3NlcXVlbmNlICZndDsgJmx0OyAvY29tcGxleFR5cGUgJmd0OyAmbHQ7IC9lbGVtZW50ICZndDsKLSAqIDxwLz4KLSAqIFdoZW4gYW4gdW53cmFwcGVkIFdTREwgaXMgZW5jb3VudGVyZWQgQXhpczIgZ2VuZXJhdGVzIGEgd3JhcHBlciBzY2hlbWEgYW5kIHRoYXQgd3JhcHBlciBzY2hlbWEKLSAqIGhhcyB0aGUgYWJvdmUgbWVudGlvbmVkIGZvcm1hdC4gVGhpcyB1bndyYXBwaW5nIGFsZ29yaXRobSB3aWxsIHdvcmsgb24gYSBwdXJlIGRvYy9saXQgV1NETCBpZiBpdAotICogaGFzIHRoZSBhYm92ZSBtZW50aW9uZWQgZm9ybWF0IG9ubHkKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYVVud3JhcHBlckV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0Q29kZUdlbmVyYXRpb25FeHRlbnNpb24gewotCi0gICAgcHJpdmF0ZSBDb2RlR2VuQ29uZmlndXJhdGlvbiBjb2RlR2VuQ29uZmlndXJhdGlvbjsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvZGVHZW5Db25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQotICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb24uaXNQYXJhbWV0ZXJzV3JhcHBlZCgpICYmICFjb2RlR2VuQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLmVxdWFscygiamF4LXdzIikpIHsKLQotICAgICAgICAgICAgLy8gQSBjaGVjayB0byBhdm9pZCBuYXN0eSBzdXJwcmlzZXMgLSBTaW5jZSB1bndyYXBwaW5nIGlzIG5vdAotICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IGFsbCBmcmFtZXdvcmtzLCB3ZSBjaGVjayB0aGUgZnJhbWV3b3JrIG5hbWUgdG8gYmUKLSAgICAgICAgICAgIC8vIGNvbXBhdGlibGUKLSAgICAgICAgICAgIGlmICghQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldFVud3JhcFN1cHBvcnRlZEZyYW1ld29ya05hbWVzKCkuCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZGZvcnVud3JhcHBpbmciKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0VW53cmFwRGlyZWN0RnJhbWV3b3JrTmFtZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgY29udGFpbnMoY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLQotICAgICAgICAgICAgICAgIC8vd2FsayB0aGUgc2NoZW1hIGFuZCBmaW5kIHRoZSB0b3AgbGV2ZWwgZWxlbWVudHMKLSAgICAgICAgICAgICAgICBMaXN0IHNlcnZpY2VzID0gY29uZmlndXJhdGlvbi5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igc2VydmljZXNJdGVyID0gc2VydmljZXMuaXRlcmF0b3IoKTsgc2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1NjaGVtYShvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb3V0IHB1dCBwYXJhbWV0ZXIgZGV0YWlscyBhcyB3ZWxsIHRvIHVud3JhcCB0aGUgcmVzcG9uc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IHN1cHBvcnQgeG1sYmVhbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpLmVxdWFscygiYWRiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1NjaGVtYShvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuT1VUUFVUX1BBUlRfUU5BTUVfU1VGRklYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB3YWxrIHRoZSBnaXZlbiBzY2hlbWEgZWxlbWVudCBGb3IgYSBzdWNjZXNzZnVsIHVud3JhcHBpbmcgdGhlIGVsZW1lbnQgc2hvdWxkIGhhdmUgdGhlCi0gICAgICogZm9sbG93aW5nIHN0cnVjdHVyZSAmbHQ7IGVsZW1lbnQgJmd0OyAmbHQ7IGNvbXBsZXhUeXBlICZndDsgJmx0OyBzZXF1ZW5jZSAmZ3Q7ICZsdDsgZWxlbWVudAotICAgICAqIC8mZ3Q7ICZsdDsgL3NlcXVlbmNlICZndDsgJmx0OyAvY29tcGxleFR5cGUgJmd0OyAmbHQ7IC9lbGVtZW50ICZndDsKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHdhbGtTY2hlbWEoQXhpc01lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHFuYW1lU3VmZml4KQotICAgICAgICAgICAgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy9ub3RoaW5nIHRvIHVud3JhcAotICAgICAgICBpZiAobWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLQotICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gbWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlUW5hbWUgPSBzY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCk7Ci0gICAgICAgIGlmIChzY2hlbWFUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlUW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHNjaGVtYSB0eXBlIGZyb20gYWxsIHRoZSBzY2hlbWFzCi0gICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gZ2V0IHRoZSBzY2hlbWEgb2YgdGhlIGV4dGVuc2lvbiB0eXBlIGZyb20gdGhlIHBhcmVudCBzY2hlbWEuIEZvciB0aGF0IGxldCdzIGZpcnN0IHJldHJpZXZlCi0gICAgICAgICAgICAgICAgLy8gdGhlIHBhcmVudCBzY2hlbWEKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2UuZ2V0QXhpc09wZXJhdGlvbigpLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNjaGVtYXNMaXN0ID0gYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYSwgc2NoZW1hVHlwZVFuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICBoYW5kbGVBbGxDYXNlc09mQ29tcGxleFR5cGVzKHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgpOwotICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2ltcGxlVHlwZSkgfHwKLSAgICAgICAgICAgICAgICgoc2NoZW1hVHlwZVFuYW1lICE9IG51bGwpICYmIChzY2hlbWFUeXBlUW5hbWUuZXF1YWxzKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiYW55VHlwZSIpKSkpICkgewotICAgICAgICAgICAgUU5hbWUgb3BOYW1lID0gbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgcGFydE5hbWVMaXN0LmFkZChXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgZGV0ZXJtaW5lIHRoZSBzY2hlbWEgdHlwZSBmb3IgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgKyBzY2hlbWFFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3dlJ3ZlIG5vIGlkZWEgaG93IHRvIHVud3JhcCBhIG5vbiBjb21wbGV4VHlwZSEhISEhIQotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlLmdldE5hbWUoKSwgImNvbXBsZXhUeXBlIikpOwotICAgICAgICB9Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9zZXQgaW4gdGhlIGF4aXMgbWVzc2FnZSB0aGF0IHRoZSB1bndyYXBwaW5nIHdhcyBzdWNjZXNzCi0gICAgICAgICAgICBtZXNzYWdlLmFkZFBhcmFtZXRlcihnZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VTldSQVBQRURfS0VZLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpKTsKLQotICAgICAgICAgICAgLy8gYXR0YWNoIHRoZSBvcE5hbWUgYW5kIHRoZSBwYXJ0cyBuYW1lIGxpc3QgaW50byB0aGUKLSAgICAgICAgICAgIC8vIGF4aXMgbWVzc2FnZSBieSB1c2luZyB0aGUgaG9sZGVyCi0gICAgICAgICAgICBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIGluZm9Ib2xkZXIgPSBuZXcgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcigpOwotICAgICAgICAgICAgaW5mb0hvbGRlci5zZXRPcGVyYXRpb25OYW1lKG1lc3NhZ2UuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpbmZvSG9sZGVyLnNldFBhcnRzTGlzdChwYXJ0TmFtZUxpc3QpOwotCi0gICAgICAgICAgICAvL2F0dGFjaCBpdCB0byB0aGUgcGFyYW1ldGVycwotICAgICAgICAgICAgbWVzc2FnZS5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0hvbGRlcikpOwotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWxsQ2FzZXNPZkNvbXBsZXhUeXBlcyhYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gaWYgYSBjb21wbGV4IHR5cGUgbmFtZSBleGl0cyBmb3IgYSBlbGVtZW50IHRoZW4KLSAgICAgICAgLy8gd2Uga2VlcCB0aGF0IGNvbXBsZXggdHlwZSB0byBzdXBwb3J0IHVud3JhcHBpbmcKLSAgICAgICAgaWYgKHNjaGVtYVR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY21wbHhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOwotICAgICAgICAgICAgaWYgKGNtcGx4VHlwZS5nZXRDb250ZW50TW9kZWwoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNtcGx4VHlwZS5nZXRQYXJ0aWNsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1hNTFNjaGVtYVNlcXVlbmNlKGNtcGx4VHlwZS5nZXRQYXJ0aWNsZSgpLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbm93IGxldHMgaGFuZGxlIGNhc2Ugd2l0aCBleHRlbnNpb25zCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBsZXhDb250ZW50TW9kZWwoY21wbHhUeXBlLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGVzIGhlcmUKLSAgICAgICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKGNtcGx4VHlwZSwgbWVzc2FnZSwgcGFydE5hbWVMaXN0LCBxbmFtZVN1ZmZpeCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXR0cmlidXRlcyhYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgewotICAgICAgICBRTmFtZSBvcE5hbWUgPSBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24geG1sT2JqZWN0Q29sbGVjdGlvbiA9IGNvbXBsZXhUeXBlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgWG1sU2NoZW1hT2JqZWN0IGl0ZW07Ci0gICAgICAgIFhtbFNjaGVtYUF0dHJpYnV0ZSB4bWxTY2hlbWFBdHRyaWJ1dGU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHhtbE9iamVjdENvbGxlY3Rpb24uZ2V0SXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpdGVtID0gKFhtbFNjaGVtYU9iamVjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUF0dHJpYnV0ZSkgewotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUF0dHJpYnV0ZSA9IChYbWxTY2hlbWFBdHRyaWJ1dGUpIGl0ZW07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0geG1sU2NoZW1hQXR0cmlidXRlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBwYXJ0TmFtZUxpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcGxleENvbnRlbnRNb2RlbChYbWxTY2hlbWFDb21wbGV4VHlwZSBjbXBseFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVTdWZmaXgpIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbnRlbnRNb2RlbCBjb250ZW50TW9kZWwgPSBjbXBseFR5cGUuZ2V0Q29udGVudE1vZGVsKCk7Ci0gICAgICAgIGlmIChjb250ZW50TW9kZWwgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4Q29udGVudCkgewotICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleENvbnRlbnQgeG1sU2NoZW1hQ29tcGxleENvbnRlbnQgPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnQpIGNvbnRlbnRNb2RlbDsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbnRlbnQgY29udGVudCA9IHhtbFNjaGVtYUNvbXBsZXhDb250ZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4Q29udGVudEV4dGVuc2lvbiBzY2hlbWFFeHRlbnNpb24gPSAoWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24pIGNvbnRlbnQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHBhcnRpY2xlcyBpbnNpZGUgdGhpcyBleHRlbnNpb24sIGlmIGFueQotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFFeHRlbnNpb24uZ2V0UGFydGljbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NYTUxTY2hlbWFTZXF1ZW5jZShzY2hlbWFFeHRlbnNpb24uZ2V0UGFydGljbGUoKSwgbWVzc2FnZSwgcGFydE5hbWVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBnZXQgdGhlIHNjaGVtYSBvZiB0aGUgZXh0ZW5zaW9uIHR5cGUgZnJvbSB0aGUgcGFyZW50IHNjaGVtYS4gRm9yIHRoYXQgbGV0J3MgZmlyc3QgcmV0cmlldmUKLSAgICAgICAgICAgICAgICAvLyB0aGUgcGFyZW50IHNjaGVtYQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2NoZW1hc0xpc3QgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBleHRlbnNpb25TY2hlbWFUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzY2hlbWFzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNjaGVtYVR5cGUgPSBnZXRTY2hlbWFUeXBlKHNjaGVtYSwgc2NoZW1hRXh0ZW5zaW9uLmdldEJhc2VUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvblNjaGVtYVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBvayBub3cgd2UgZ290IHRoZSBwYXJlbnQgc2NoZW1hLiBOb3cgbGV0J3MgZ2V0IHRoZSBleHRlbnNpb24ncyBzY2hlbWEgdHlwZQotCi0gICAgICAgICAgICAgICAgaGFuZGxlQWxsQ2FzZXNPZkNvbXBsZXhUeXBlcyhleHRlbnNpb25TY2hlbWFUeXBlLCBtZXNzYWdlLCBwYXJ0TmFtZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYVR5cGUgZ2V0U2NoZW1hVHlwZShYbWxTY2hlbWEgc2NoZW1hLCBRTmFtZSB0eXBlTmFtZSkgewotICAgICAgICBYbWxTY2hlbWFUeXBlIHhtbFNjaGVtYVR5cGUgPSBudWxsOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYVR5cGUgPSBzY2hlbWEuZ2V0VHlwZUJ5TmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoeG1sU2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgaW4gYW4gaW1wb3J0IG9yIGFuIGluY2x1ZGUKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaW5jbHVkZXNJdGVyID0gaW5jbHVkZXMuZ2V0SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmNsdWRlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBpbmNsdWRlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbXBvcnQpIG9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hVHlwZSA9IGdldFNjaGVtYVR5cGUoc2NoZW1hMSwgdHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFUeXBlID0gZ2V0U2NoZW1hVHlwZShzY2hlbWExLCB0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NYTUxTY2hlbWFTZXF1ZW5jZShYbWxTY2hlbWFQYXJ0aWNsZSBzY2hlbWFQYXJ0aWNsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZVN1ZmZpeCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNjaGVtYVBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2VxdWVuY2UpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIG5hbWUgYW5kIG5hbWVzcGFjZSwKLSAgICAgICAgICAgIC8vIHBhcnQgbmFtZSBhbmQgaGFuZyB0aGVtIHNvbWV3aGVyZSA/IFRoZSBpZGVhbCBwbGFjZQotICAgICAgICAgICAgLy8gd291bGQgYmUgdGhlIHByb3BlcnR5IGJhZyBpbiB0aGUgY29kZWdlbiBjb25maWchCi0gICAgICAgICAgICBRTmFtZSBvcE5hbWUgPSBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlID0gKFhtbFNjaGVtYVNlcXVlbmNlKSBzY2hlbWFQYXJ0aWNsZTsKLSAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSBzZXF1ZW5jZS5nZXRJdGVtcygpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGVtcHR5IHNlcXVlbmNlLCByZXR1cm4KLSAgICAgICAgICAgIGlmIChpdGVtcy5nZXRDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBpdGVtcy5nZXRJdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIGdldCBlYWNoIGFuZCBldmVyeSBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZSBhbmQKLSAgICAgICAgICAgICAgICAvLyB0cmF2ZXJzZSB0aHJvdWdoIHRoZW0KLSAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9hZGQgdGhlIGVsZW1lbnQgbmFtZSB0byB0aGUgcGFydCBuYW1lIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpIGl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hRWxlbWVudC5nZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgPSB4bWxTY2hlbWFFbGVtZW50LmdldFJlZk5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0geG1sU2NoZW1hRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyAgcGFydCBuYW1lcyBhcmUgbm90IHVuaXF1ZSBhY3Jvc3MgbWVzc2FnZXMuIEhlbmNlCi0gICAgICAgICAgICAgICAgICAgIC8vICB3ZSBuZWVkIHNvbWUgd2F5IG9mIG1ha2luZyB0aGUgcGFydCBuYW1lIGEgdW5pcXVlCi0gICAgICAgICAgICAgICAgICAgIC8vICBvbmUgKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgICAgICAgICAvLyAgaXMgYSBnbG9iYWwgbGlzdCBvZiB0eXBlcykuCi0gICAgICAgICAgICAgICAgICAgIC8vICBUaGUgc2VlbWluZ2x5IGJlc3Qgd2F5IHRvIGRvIHRoYXQgaXMgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gIHNwZWNpZnkgYSBuYW1lc3BhY2UgZm9yIHRoZSBwYXJ0IFFOYW1lIHJlZmVyZW5jZSB3aGljaAotICAgICAgICAgICAgICAgICAgICAvLyAgaXMgc3RvcmVkIGluIHRoZSAgbGlzdC4gVGhpcyBwYXJ0IHFuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vICB0ZW1wb3JhcnkgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGl0J3MKLSAgICAgICAgICAgICAgICAgICAgLy8gIG5hbWVzcGFjZSBVUkkgKHdoaWNoIGhhcHBlbmVkIHRvIGJlIHRoZSBvcGVyYXRpb24gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLy8gIHdpdGggX2lucHV0IGF0dGFjaGVkIHRvIGl0Ci0KLQotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZUxpc3QuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZVN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcnRpY2xlIGNvbnRhaW5zIGFueXRoaW5nIG90aGVyIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgLy8gYSBYTUxTY2hlbWFFbGVtZW50IHRoZW4gd2UgYXJlIG5vdCBpbiBhIHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIHVud3JhcCBpdAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUFueSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgeHM6YW55LCB0aGVuIHRoZXJlIGlzIG5vIHBhcnQgbmFtZSBmb3IgaXQuIFVzaW5nIEFOWV9FTEVNRU5UX0ZJRUxEX05BTUUKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGl0IGZvciBub3cKLQotICAgICAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdG8gaGFuZGxlIGJvdGggbWF4b2NjdXJzIDEgYW5kIG1heG9jY3VycyA+IDEgc2l0dWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUFueSB4bWxTY2hlbWFBbnkgPSAoWG1sU2NoZW1hQW55KSBpdGVtOwotCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFV0aWwuZ2V0UGFydFFOYW1lKG9wTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lU3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFOWV9FTEVNRU5UX0ZJRUxEX05BTUUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biB0eXBlIiwgIkVsZW1lbnQiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3dlIGRvIG5vdCBrbm93IGhvdyB0byBkZWFsIHdpdGggb3RoZXIgcGFydGljbGVzCi0gICAgICAgICAgICAvL3N1Y2ggYXMgeHM6YWxsIG9yIHhzOmNob2ljZS4gVXN1YWxseSBvY2N1cnMgd2hlbgotICAgICAgICAgICAgLy9wYXNzZWQgd2l0aCB0aGUgdXNlciBidWlsdCBXU0RMIHdoZXJlIHRoZSBzdHlsZQotICAgICAgICAgICAgLy9pcyBkb2N1bWVudC4KLSAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFQYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNob2ljZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLnVuc3VwcG9ydGVkU2NoZW1hRm9ybWF0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hvaWNlIiwgInNlcXVlbmNlIikpOwotCi0gICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hUGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFBbGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbCIsICJzZXF1ZW5jZSIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4dGVuc2lvbi51bnN1cHBvcnRlZFNjaGVtYUZvcm1hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLCAic2VxdWVuY2UiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSBhIHBhcmFtZXRlcyBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFBhcmFtZXRlciBteVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgbXlQYXJhbWV0ZXIuc2V0TmFtZShrZXkpOwotICAgICAgICBteVBhcmFtZXRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBteVBhcmFtZXRlcjsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1NpbXBsZURCRXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vU2ltcGxlREJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjOTNiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vU2ltcGxlREJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqIEV4dGVuc2lvbiBmb3Igc2ltcGxlIGRhdGEgYmluZGluZy4gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVEQkV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0REJQcm9jZXNzaW5nRXh0ZW5zaW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREJfSU5WT0tFX0NMQVNTX05BTUUgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLkV4dGVuc2lvblV0aWxpdHkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZPS0VfTUVUSE9EX05BTUUgPQotICAgICAgICAgICAgImludm9rZSI7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotICAgICAgICAvL3Rlc3QgdGhlIGRhdGFiaW5kaW5nIHR5cGUuIElmIG5vdCBqdXN0IGZhbGwgdGhyb3VnaAotICAgICAgICBpZiAodGVzdEZhbGxUaHJvdWdoKGNvbmZpZ3VyYXRpb24uZ2V0RGF0YWJpbmRpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vaW52b2tlIHRoZSBhZGIgY29kZWdlbiBieSByZWZsZWN0aW9uCi0gICAgICAgICAgICBDbGFzcyBhZGJHZW5lcmF0b3JDbGFzcyA9IENsYXNzLgotICAgICAgICAgICAgICAgICAgICBmb3JOYW1lKEFEQl9JTlZPS0VfQ0xBU1NfTkFNRSk7Ci0gICAgICAgICAgICBNZXRob2QgaW52b2tlTWV0aG9kID0gYWRiR2VuZXJhdG9yQ2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICBJTlZPS0VfTUVUSE9EX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ29kZUdlbkNvbmZpZ3VyYXRpb24uY2xhc3MgfSk7Ci0gICAgICAgICAgICBpbnZva2VNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IGNvbmZpZ3VyYXRpb24gfSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9UeXBlTWFwcGVyRXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vVHlwZU1hcHBlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzdiMWJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9UeXBlTWFwcGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuRGVmYXVsdFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkNUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZXh0ZW5zaW9uIGlzIHRvIHBvcHVsYXRlIHRoZSB0eXBlIG1hcHBlciBmcm9tIHRoZSB0eXBlIG1hcHBpbmcgZmlsZS4gVGhlCi0gKiBmb3JtYXQgb2YgdGhlIHR5cGUgbWFwcGluZyBmaWxlIGlzIGFzIGZvbGxvd3MgPG1hcHBpbmdzIGRiZj0iYWRiIj4gPG1hcHBpbmc+IDxxbmFtZQotICogbmFtZXNwYWNlPSJucyIgcHJlZml4PSJwMSI+bG9jYWxOYW1lPC9xbmFtZT4gPHZhbHVlPnR5cGU8L3ZhbHVlPiA8L21hcHBpbmc+IDwvbWFwcGluZ3M+Ci0gKiA8cC8+Ci0gKiBJbiBhbnkgY2FzZSBpdCBpcyBiZXN0IHRoYXQgdGhlIHR5cGUgbWFwcGVyIGV4dGVuc2lvbiBiZSBhZnRlciBhbGwgdGhlIGRhdGFiaW5kaW5nIGV4dGVuc2lvbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgVHlwZU1hcHBlckV4dGVuc2lvbiBpbXBsZW1lbnRzIENvZGVHZW5FeHRlbnNpb24gewotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19FTEVNRU5UX05BTUUgPSAibWFwcGluZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9BVFRSSUJVVEVfTkFNRSA9ICJuYW1lc3BhY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRTkFNRV9FTEVNRU5UX05BTUUgPSAicW5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FTEVNRU5UX05BTUUgPSAidmFsdWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9GUkFNRVdPUktfQVRUUklCVVRFX05BTUUgPSAiZGJmIjsKLQotCi0gICAgLyoqIEB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlKENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldFR5cGVNYXBwaW5nRmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vYSB0eXBlIG1hcHBpbmcgaXMgcHJlc2VudC4gdHJ5IGJ1aWxkaW5nIHRoZQotICAgICAgICAgICAgLy9tYXBwaW5nIGZyb20gaXQKLQotICAgICAgICAgICAgLy8gaWYgdGhlIGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgYSBtYXBwaW5nIHRoZW4gdGFrZSBpdAotICAgICAgICAgICAgLy8gdGhlIGV4dGVybmFsIG1hcHBpbmdzIHdpbGwgb3ZlcnJpZGUgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUKLSAgICAgICAgICAgIC8vIG1hcHBpbmdzCi0gICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciA9IGNvbmZpZ3VyYXRpb24uZ2V0VHlwZU1hcHBlcigpOwotICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gbWFwcGVyIHByZXNlbnQgLSBzbyBqdXN0IGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldE91dHB1dExhbmd1YWdlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhY29uZmlndXJhdGlvbi5nZXRPdXRwdXRMYW5ndWFnZSgpLnRyaW0oKS5lcXVhbHMoIiIpICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0TGFuZ3VhZ2UoKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiYyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcHBlciA9IG5ldyBDVHlwZU1hcHBlcigpOwotICAgIAotICAgICAgICAgICAgICAgIH0gIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYXBwZXIgPSBuZXcgRGVmYXVsdFR5cGVNYXBwZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vcmVhZCB0aGUgZmlsZSBhcyBhIERPTQotICAgICAgICAgICAgRG9jdW1lbnQgbWFwcGluZ0RvY3VtZW50ID0gYnVpbGREb2N1bWVudChjb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIEVsZW1lbnQgcm9vdE1hcHBpbmdzRWxlbWVudCA9IG1hcHBpbmdEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgLy9vdmVycmlkZSB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIG5hbWUuIElmIGEgbWFwcGluZyBmaWxlIGlzCi0gICAgICAgICAgICAvL3ByZXNlbnQgdGhlbiB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIG5hbWUgd2lsbCBiZSBvdmVycmlkZGVuCi0gICAgICAgICAgICAvL2lmIHByZXNlbnQuIElmIGEgdXNlciB3YW50cyB0byBtaXggdHlwZXMgdGhlbiBpdCBtdXN0IGJlCi0gICAgICAgICAgICAvL2Zyb20gdGhlIHNhbWUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIQotCi0gICAgICAgICAgICAvL2ZpcnN0IGRvIGEgc2FuaXR5IGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSB1c2VyIGlzIHRyeWluZyB0bwotICAgICAgICAgICAgLy9taXggZGF0YWJpbmRpbmcgdHlwZXMhCi0KLSAgICAgICAgICAgIFN0cmluZyBkYXRhYmluZGluZ05hbWUgPSByb290TWFwcGluZ3NFbGVtZW50LgotICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGUoREJfRlJBTUVXT1JLX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgICAgIGlmICghZGF0YWJpbmRpbmdOYW1lLmVxdWFscyhjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLmRhdGFiaW5kaW5nTWlzbWF0Y2giKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICBzZXREYXRhYmluZGluZ1R5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJpbmRpbmdOYW1lKTsKLQotCi0gICAgICAgICAgICBOb2RlTGlzdCBtYXBwaW5nTGlzdCA9IHJvb3RNYXBwaW5nc0VsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRzQnlUYWdOYW1lKE1BUFBJTkdfRUxFTUVOVF9OQU1FKTsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBtYXBwaW5nTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IG1hcHBpbmdOb2RlID0gKEVsZW1lbnQpbWFwcGluZ0xpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICAvL3dlIGtub3cgdGhpcyBpcyBvbmx5IG9uZSAtIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0aGVuCi0gICAgICAgICAgICAgICAgLy9pdCBpcyBpbnZhbGlkCi0gICAgICAgICAgICAgICAgRWxlbWVudCBxTmFtZUNoaWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KW1hcHBpbmdOb2RlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZShRTkFNRV9FTEVNRU5UX05BTUUpLml0ZW0oMCk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCB2YWx1ZUNoaWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KW1hcHBpbmdOb2RlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZShWQUxVRV9FTEVNRU5UX05BTUUpLml0ZW0oMCk7Ci0gICAgICAgICAgICAgICAgLy9nZW5lcmF0ZSBhIFFuYW1lIGFuZCBhZGQgdG8gdGhlIHR5cGUgbWFwcGluZwotICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWVDaGlsZC5nZXRBdHRyaWJ1dGUoTkFNRVNQQUNFX0FUVFJJQlVURV9OQU1FKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFRleHRGcm9tRWxlbWVudChxTmFtZUNoaWxkKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZXh0RnJvbUVsZW1lbnQodmFsdWVDaGlsZCkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vc2V0IHRoZSB0eXBlIG1hcHBlciB0byB0aGUgY29uZmlndXJ0aW9uCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobWFwcGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGEgZG9tIGRvY3VtZW50IGZyb20gdGhlIG1hcHBpbmcgZmlsZQotICAgICAqCi0gICAgICogQHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgRG9jdW1lbnQgYnVpbGREb2N1bWVudChDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXIucGFyc2UoY29uZmlndXJhdGlvbi5nZXRUeXBlTWFwcGluZ0ZpbGUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzdHJpbmcgY29udGVudCBmcm9tIGFuIGVsZW1lbnQuIHJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gdGVzdCBub2RlcyBmb3VuZAotICAgICAqCi0gICAgICogQHBhcmFtIGVsdAotICAgICAqIEByZXR1cm4gdGV4dCBjb3RlbnQgb2YgdGhlIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUZXh0RnJvbUVsZW1lbnQoRWxlbWVudCBlbHQpIHsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbHQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gbnVsbDsKLSAgICAgICAgaW50IGxlbmd0aCA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKE5vZGUuVEVYVF9OT0RFID09IG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVyblN0cmluZyA9IChyZXR1cm5TdHJpbmcgPT0gbnVsbCA/ICIiIDogcmV0dXJuU3RyaW5nKSArIG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5TdHJpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1dTRExQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vV1NETFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NWQ3MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vV1NETFByZXR0eVByaW50ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFByZXR0eVByaW50ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMUHJldHR5UHJpbnRlckV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0UHJldHR5UHJpbnRlckV4dGVuc2lvbiB7Ci0KLSAgICBwdWJsaWMgV1NETFByZXR0eVByaW50ZXJFeHRlbnNpb24oKSB7Ci0gICAgICAgIGZpbGVFeHRlbnNpb24gPSAiLndzZGwiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByZXR0aWZ5RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgWE1MUHJldHR5UHJpbnRlci5wcmV0dGlmeShmaWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vV1NETFZhbGlkYXRvckV4dGVuc2lvbi5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1dTRExWYWxpZGF0b3JFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiNTNmNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vV1NETFZhbGlkYXRvckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0b3JFeHRlbnNpb24gZXh0ZW5kcyBBYnN0cmFjdENvZGVHZW5lcmF0aW9uRXh0ZW5zaW9uIHsKLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL1dTRExEZXNjcmlwdGlvbiB3b20gPSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0V29tKCk7Ci0gICAgICAgIExpc3Qgc2NoZW1hTGlzdCA9IGNvbmZpZ3VyYXRpb24uZ2V0U2NoZW1hTGlzdEZvckFsbFNlcnZpY2VzKCk7Ci0gICAgICAgIGlmIChzY2hlbWFMaXN0ID09IG51bGwgfHwgc2NoZW1hTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vdGhlcmUgYXJlIG5vIHR5cGVzIHRvIGJlIGNvbnNpZGVyZWQKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgWG1sU2NoZW1hIHMgPSAoWG1sU2NoZW1hKXNjaGVtYUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHMuZ2V0SW5jbHVkZXMoKS5nZXRDb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvL3RoZXJlIGFyZSBzb21lIGluY2x1ZGVkIC0gbm93IHNlZSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkKLSAgICAgICAgICAgICAgICAvL2VsZW1lbnRzIG9yIHR5cGVzIGRlY2xhcmVkIQotICAgICAgICAgICAgICAgIGlmIChzLmdldEVsZW1lbnRzKCkuZ2V0Q291bnQoKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzLmdldFNjaGVtYVR5cGVzKCkuZ2V0Q291bnQoKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzLmdldEdyb3VwcygpLmdldENvdW50KCkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gdGFyZ2V0TmFtZXNwYWNlIHRoZXJlJ3MgcHJvYmFibHkgbm8gbmFtZSwgYnV0IHRyeSBpdCBhbnl3YXkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJleHRlbnNpb24uaW52YWxpZFdTREwiLCBzLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vWE1MQmVhbnNFeHRlbnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9YTUxCZWFuc0V4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjdhNmYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9YTUxCZWFuc0V4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uc2NoZW1hLkF4aXNTZXJ2aWNlVG9wRWxlbWVudFNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxCZWFuc0V4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0REJQcm9jZXNzaW5nRXh0ZW5zaW9uIHsKLSAgICAvKiogTmFtZSBvZiAiZXh0cmEiIG9wdGlvbiB1c2VkIHRvIHN1cHBseSBwYWNrYWdlIG5hbWUgZm9yIHhzYiBmaWxlcy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFU1lTVEVNTkFNRV9PUFRJT04gPSAidHlwZXN5c3RlbW5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT0xERVIgPSAic2NoZW1hcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEQ09ORklHX09QVElPTiA9ICJ4YyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEQ09ORklHX09QVElPTl9MT05HID0gInhzZGNvbmZpZyI7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdTID0gIm1hcHBpbmdzIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HID0gIm1hcHBpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9OQU1FID0gImphdmFjbGFzcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0ZPTERFUiA9ICJNYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRVJfRklMRV9OQU1FID0gIm1hcHBlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1BBVEggPSAiL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MQkVBTlNfQ09ORklHX0NMQVNTID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLnhtbGJlYW5zLkJpbmRpbmdDb25maWciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTEJFQU5TX1VUSUxJVFlfQ0xBU1MgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnMuQ29kZUdlbmVyYXRpb25VdGlsaXR5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxCRUFOU19QUk9DRVNTX01FVEhPRCA9ICJwcm9jZXNzU2NoZW1hcyI7Ci0KLSAgICBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCi0gICAgICAgIC8vdGVzdCB0aGUgZGF0YWJpbmRpbmcgdHlwZS4gSWYgbm90IGp1c3QgZmFsbCB0aHJvdWdoCi0gICAgICAgIGlmICh0ZXN0RmFsbFRocm91Z2goY29uZmlndXJhdGlvbi5nZXREYXRhYmluZGluZ1R5cGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBKaUJYIGJpbmRpbmcgZGVmaW5pdGlvbiBmaWxlIHNwZWNpZmllZAotICAgICAgICBTdHJpbmcgdHlwZVN5c3RlbU5hbWUgPSAoU3RyaW5nKWNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpLmdldChUWVBFU1lTVEVNTkFNRV9PUFRJT04pOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB0cnkgZHVtbXkgbG9hZCBvZiBmcmFtZXdvcmsgY2xhc3MgZmlyc3QgdG8gY2hlY2sgbWlzc2luZyBqYXJzCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoWE1MQkVBTlNfQ09ORklHX0NMQVNTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJYTUxCZWFucyBmcmFtZXdvcmsgamFycyBub3QgaW4gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvYWQgdGhlIGFjdHVhbCB1dGlsaXR5IGNsYXNzCi0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsYXp6ID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhYTUxCRUFOU19VVElMSVRZX0NMQVNTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJYTUxCZWFucyBiaW5kaW5nIGV4dGVuc2lvbiBub3QgaW4gY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGludm9rZSB1dGlsaXR5IGNsYXNzIG1ldGhvZCBmb3IgYWN0dWFsIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBjbGF6ei5nZXRNZXRob2QoWE1MQkVBTlNfUFJPQ0VTU19NRVRIT0QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgTGlzdC5jbGFzcywgRWxlbWVudFtdLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSk7Ci0gICAgICAgICAgICBMaXN0IHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBMaXN0IGF4aXNTZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0QXhpc1NlcnZpY2VzKCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG51bGw7Ci0gICAgICAgICAgICBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5FeHRlbnNpb25Bcmd1bWVudHMuV0lUSE9VVF9EQVRBQklORF9DT0RFKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZHVtbXkgY29kZQotICAgICAgICAgICAgICAgICAgICBzY2hlbWFHZW5lcmF0b3IgPSBuZXcgQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hcy5hZGRBbGwoc2NoZW1hR2VuZXJhdG9yLmdldER1bW15U2NoZW1hTGlzdCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZEFsbChheGlzU2VydmljZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVsZW1lbnRbXSBhZGRpdGlvbmFsU2NoZW1hcyA9IGxvYWRBZGRpdGlvbmFsU2NoZW1hcygpOwotICAgICAgICAgICAgVHlwZU1hcHBlciBtYXBwZXIgPSAoVHlwZU1hcHBlciltZXRob2QuaW52b2tlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgc2NoZW1hcywgYWRkaXRpb25hbFNjaGVtYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLCB0eXBlU3lzdGVtTmFtZSB9KTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSB0eXBlIG1hcHBlciB0byB0aGUgY29uZmlnCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldFR5cGVNYXBwZXIobWFwcGVyKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkaW5nIHRoZSBleHRlcm5hbCBzY2hlbWFzLgotICAgICAqCi0gICAgICogQHJldHVybiBlbGVtZW50IGFycmF5IGNvbnNpc3Rpbmcgb2YgdGhlIHRoZSBET00gZWxlbWVudCBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHNjaGVtYXMKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnRbXSBsb2FkQWRkaXRpb25hbFNjaGVtYXMoKSB7Ci0gICAgICAgIC8vbG9hZCBhZGRpdGlvbmFsIHNjaGVtYXMKLSAgICAgICAgU3RyaW5nW10gc2NoZW1hTmFtZXMgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0VGhpcmRQYXJ0eVNjaGVtYU5hbWVzKCk7Ci0gICAgICAgIEVsZW1lbnRbXSBzY2hlbWFFbGVtZW50czsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGFkZGl0aW9uYWxTY2hlbWFFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBnZXROYW1lc3BhY2VBd2FyZURvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vdGhlIGxvY2F0aW9uIGZvciB0aGUgdGhpcmQgcGFydHkgc2NoZW1hO3MgaXMgaGFyZGNvZGVkCi0gICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoc2NoZW1hTmFtZXNbaV0udHJpbSgpKSkgewotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzY2hlbWFTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKFNDSEVNQV9QQVRIICsgc2NoZW1hTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2Uoc2NoZW1hU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFNjaGVtYUVsZW1lbnRzLmFkZChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIFNjaGVtYSBlbGVtZW50IGFycmF5Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50cyA9IG5ldyBFbGVtZW50W2FkZGl0aW9uYWxTY2hlbWFFbGVtZW50cy5zaXplKCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsU2NoZW1hRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50c1tpXSA9IChFbGVtZW50KWFkZGl0aW9uYWxTY2hlbWFFbGVtZW50cy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXh0ZW5zaW9uLmFkZGl0aW9uYWxTY2hlbWFGYWlsdXJlIiksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjaGVtYUVsZW1lbnRzOwotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnRCdWlsZGVyIGdldE5hbWVzcGFjZUF3YXJlRG9jdW1lbnRCdWlsZGVyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9YTUxQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9leHRlbnNpb24vWE1MUHJldHR5UHJpbnRlckV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTJmMDI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9YTUxQcmV0dHlQcmludGVyRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxQcmV0dHlQcmludGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgWE1MUHJldHR5UHJpbnRlckV4dGVuc2lvbiBleHRlbmRzIEFic3RyYWN0UHJldHR5UHJpbnRlckV4dGVuc2lvbiB7Ci0KLQotICAgIHB1YmxpYyBYTUxQcmV0dHlQcmludGVyRXh0ZW5zaW9uKCkgewotICAgICAgICBmaWxlRXh0ZW5zaW9uID0gIi54bWwiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNhbGxzIHRoZSB4bWwgcHJldHR5IHByaW50ZXJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXR0aWZ5RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgWE1MUHJldHR5UHJpbnRlci5wcmV0dGlmeShmaWxlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9BeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9BeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4OGI5Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uc2NoZW1hLmV4Y2VwdGlvbi5EdW1teVNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSBkdW1teSBzY2hlbWEgd2l0aCBvbmx5IHRvcCBsZXZlbAotICogZWxlbWVudHMgdG8gc3VwcG9ydCB4bWxiZWFucwotICovCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yIHsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RHVtbXlTY2hlbWFMaXN0KCkgdGhyb3dzIER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldCB0b3BFbGVtZW50cyA9IGdldFRvcEVsZW1lbnRzKCk7Ci0gICAgICAgIE1hcCBzY2hlbWFNYXAgPSBnZXRTY2hlbWFNYXAodG9wRWxlbWVudHMpOwotICAgICAgICByZXR1cm4gZ2V0WG1sU2NoZW1hTGlzdChzY2hlbWFNYXApOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFhtbFNjaGVtYUxpc3QoTWFwIHNjaGVtYU1hcCkgdGhyb3dzIER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgeG1sU2NoZW1hTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAvLyBjcmVhdGVzIHRoZSBidWlsZGVyIGZhY3RvcnkKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2NoZW1hTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHhtbFNjaGVtYSA9IChYbWxTY2hlbWEpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSB4bWxTY2hlbWEuZ2V0U2NoZW1hRWxlbWVudChkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiB4bWxTY2hlbWFDb2xsZWN0aW9uID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFMaXN0LmFkZCh4bWxTY2hlbWFDb2xsZWN0aW9uLnJlYWQoZWxlbWVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEdW1teVNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgYnVpbGQgdGhlIGRvbSB0cmVlIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRTY2hlbWFNYXAoU2V0IHRvcEVsZW1lbnRzKSB7Ci0gICAgICAgIE1hcCBzY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBUb3BFbGVtZW50IHRvcEVsZW1lbnQ7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWE7Ci0gICAgICAgIFhtbEVsZW1lbnQgeG1sRWxlbWVudDsKLSAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCA9IG5ldyBOYW1lc3BhY2VQcmVmaXgoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdG9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB0b3BFbGVtZW50ID0gKFRvcEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hRm9yTmFtZXNwYWNlKHRvcEVsZW1lbnQuZ2V0RWxlbWVudFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIHNjaGVtYU1hcCk7Ci0gICAgICAgICAgICBpZiAoIXhtbFNjaGVtYS5pc0VsZW1lbnRFeGlzdHModG9wRWxlbWVudC5nZXRFbGVtZW50UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaS5lIHRoaXMgZWxlbWVudCBpcyBhbiBhbm5vbnltb3VzIGNvbXBsZXggZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIGNhbiBhZGQgdGhpcyBlbGVtZW50IHdpdGggb3V0IGFueSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRFbGVtZW50KGdldFhtbEVsZW1lbnQodG9wRWxlbWVudCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBoYXMgYSBzdGFuZGFyZCBzY2hlbWEgdHlwZSB0aGVuIHdlIGRvIG5vdCBoYXZlIHRvIHdhcnJ5IGFib3V0IHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRFbGVtZW50KGdldFhtbEVsZW1lbnQodG9wRWxlbWVudCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgaGF2ZSBhbiBlbGVtZW50IHdpdGggYSBjb21wbGV4IHR5cGUuCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZXMgdGhlIGNvbXBsZXggdHlwZSBpZiBpdCBpcyBub3RlIGV4aXN0cwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgY29tcGxleEVsZW1lbnRTY2hlbWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFhtbFNjaGVtYUZvck5hbWVzcGFjZSh0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBsZXhFbGVtZW50U2NoZW1hLmlzQ29tcGxleFR5cGVFeGlzdHModG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbENvbXBsZXhUeXBlIHhtbENvbXBsZXhUeXBlID0gbmV3IFhtbENvbXBsZXhUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxDb21wbGV4VHlwZS5zZXROYW1lKHRvcEVsZW1lbnQuZ2V0VHlwZVFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ29tcGxleFR5cGUuc2V0TmFtZXNwYWNlKHRvcEVsZW1lbnQuZ2V0VHlwZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleEVsZW1lbnRTY2hlbWEuYWRkQ29tcGxleFR5cGUoeG1sQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBuYW1lc2FwY2UgaWYgbm90IGV4aXN0cy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlc1ByZWZpeE1hcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zS2V5KHRvcEVsZW1lbnQuZ2V0VHlwZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlc1ByZWZpeE1hcCgpLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wRWxlbWVudC5nZXRUeXBlUU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4LmdldE5leHROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0ID0gbmV3IFhtbEltcG9ydCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sSW1wb3J0LnNldFRhcmdldE5hbWVzcGFjZSh0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRJbXBvcnQoeG1sSW1wb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsbHkgYWRkIHRoZSBuYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEVsZW1lbnQoZ2V0WG1sRWxlbWVudCh0b3BFbGVtZW50KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY2hlbWFNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoVG9wRWxlbWVudCB0b3BFbGVtZW50KSB7Ci0gICAgICAgIFhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IG5ldyBYbWxFbGVtZW50KCk7Ci0gICAgICAgIHhtbEVsZW1lbnQuc2V0TmFtZSh0b3BFbGVtZW50LmdldEVsZW1lbnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgeG1sRWxlbWVudC5zZXROYW1lc3BhY2UodG9wRWxlbWVudC5nZXRFbGVtZW50UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIHhtbEVsZW1lbnQuc2V0VHlwZSh0b3BFbGVtZW50LmdldFR5cGVRTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIHhtbEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWEgZ2V0WG1sU2NoZW1hRm9yTmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIE1hcCBzY2hlbWFNYXApIHsKLSAgICAgICAgaWYgKCFzY2hlbWFNYXAuY29udGFpbnNLZXkodGFyZ2V0TmFtZXNwYWNlKSkgewotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IG5ldyBYbWxTY2hlbWEodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBnZXRUb3BFbGVtZW50cygpIHsKLQotICAgICAgICBTZXQgdG9wU2NoZW1hRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb247Ci0gICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlOwotICAgICAgICBUb3BFbGVtZW50IHRvcEVsZW1lbnQ7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudDsKLSAgICAgICAgU09BUEhlYWRlck1lc3NhZ2Ugc29hcEhlYWRlck1lc3NhZ2U7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBvcGVyYXRpb25JdGVyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBvcGVyYXRpb25JdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9uSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1lc3NhZ2VJdGVyID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlcygpOyBtZXNzYWdlSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgYXhpc01lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIG1lc3NhZ2VJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQoYXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gYXhpc01lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB0b3BFbGVtZW50LnNldFR5cGVRTmFtZSh4bWxTY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB0b3BTY2hlbWFFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyBoZWFkZXIgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzb2FwSGVhZGVySXRlciA9IGF4aXNNZXNzYWdlLmdldFNvYXBIZWFkZXJzKCkuaXRlcmF0b3IoKTsgc29hcEhlYWRlckl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2UgPSAoU09BUEhlYWRlck1lc3NhZ2UpIHNvYXBIZWFkZXJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcEVsZW1lbnQgPSBuZXcgVG9wRWxlbWVudChzb2FwSGVhZGVyTWVzc2FnZS5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9wU2NoZW1hRWxlbWVudHMuYWRkKHRvcEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGdldFNjaGVtYUVsZW1lbnQoc29hcEhlYWRlck1lc3NhZ2UuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcEVsZW1lbnQuc2V0VHlwZVFOYW1lKHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3BTY2hlbWFFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZmF1bHRNZXNzYWdlc0l0ZXIgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgYXhpc01lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIGZhdWx0TWVzc2FnZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQoYXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBheGlzTWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgdG9wRWxlbWVudC5zZXRUeXBlUU5hbWUoeG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB0b3BTY2hlbWFFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvcFNjaGVtYUVsZW1lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxTY2hlbWFFbGVtZW50IGdldFNjaGVtYUVsZW1lbnQoUU5hbWUgZWxlbWVudFFOYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdCBzY2hlbWFzID0gdGhpcy5heGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBzY2hlbWFJdGVyID0gc2NoZW1hcy5pdGVyYXRvcigpOyBzY2hlbWFJdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGdldFNjaGVtYUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYSlzY2hlbWFJdGVyLm5leHQoKSxlbGVtZW50UU5hbWUpOwotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFFbGVtZW50IGdldFNjaGVtYUVsZW1lbnQob3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWEgc2NoZW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSkgewotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudEJ5TmFtZShlbGVtZW50UU5hbWUpOwotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGluIGFuIGltcG9ydCBvciBhbiBpbmNsdWRlCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlcygpOwotICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGluY2x1ZGVzSXRlciA9IGluY2x1ZGVzLmdldEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmNsdWRlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBpbmNsdWRlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hIHNjaGVtYTEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYbWxTY2hlbWFJbXBvcnQpIG9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGdldFNjaGVtYUVsZW1lbnQoc2NoZW1hMSxlbGVtZW50UU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUluY2x1ZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYSBzY2hlbWExID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoWG1sU2NoZW1hSW5jbHVkZSkgb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gZ2V0U2NoZW1hRWxlbWVudChzY2hlbWExLGVsZW1lbnRRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hRWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hRWxlbWVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvTmFtZXNwYWNlUHJlZml4LmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvTmFtZXNwYWNlUHJlZml4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2FjNzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL05hbWVzcGFjZVByZWZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLS8qKgotICogcHJvdmlkZSBuYW1lc2FwY2UgcHJlZml4ZXMKLSAqLwotcHVibGljIGNsYXNzIE5hbWVzcGFjZVByZWZpeCB7Ci0KLSAgICBwcml2YXRlIGludCBpID0gMDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmV4dE5hbWVzcGFjZVByZWZpeCgpewotICAgICAgICByZXR1cm4gIm5zIiArIGkrKzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvVG9wRWxlbWVudC5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1RvcEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2YmU0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvVG9wRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHRvcCBlbGVtZW50Ci0gKiBkZXRhaWxzIG9mIHRoZSBzY2hlbWEKLSAqLwotcHVibGljIGNsYXNzIFRvcEVsZW1lbnQgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50UU5hbWU7Ci0gICAgcHJpdmF0ZSBRTmFtZSB0eXBlUU5hbWU7Ci0KLSAgICBwdWJsaWMgVG9wRWxlbWVudCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVG9wRWxlbWVudChRTmFtZSBlbGVtZW50UU5hbWUpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50UU5hbWUgPSBlbGVtZW50UU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50UU5hbWUoUU5hbWUgZWxlbWVudFFOYW1lKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudFFOYW1lID0gZWxlbWVudFFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRUeXBlUU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZVFOYW1lKFFOYW1lIHR5cGVRTmFtZSkgewotICAgICAgICB0aGlzLnR5cGVRTmFtZSA9IHR5cGVRTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0b3AgZWxlbWVudHMgc2hvdWxkIGhhdmUgYSB1bmlxdWUgbmFtZQotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIGVxdWFsIG9yIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNFcXVhbCA9IGZhbHNlOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVG9wRWxlbWVudCl7Ci0gICAgICAgICAgICBpc0VxdWFsID0gKChUb3BFbGVtZW50KW9iaikuZ2V0RWxlbWVudFFOYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudFFOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNFcXVhbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sQ29tcGxleFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxDb21wbGV4VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUyYmMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxDb21wbGV4VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYW4geG1sIGNvbXBsZXggdHlwZQotICoKLSAqLwotcHVibGljIGNsYXNzIFhtbENvbXBsZXhUeXBlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCl7Ci0gICAgICAgIEVsZW1lbnQgY29tcGxleEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsInhzZDpjb21wbGV4VHlwZSIpOwotICAgICAgICBjb21wbGV4RWxlbWVudC5zZXRQcmVmaXgoInhzZCIpOwotICAgICAgICBjb21wbGV4RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGlzLm5hbWUpOwotCi0gICAgICAgIEVsZW1lbnQgc2VxdWVuY2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOnNlcXVlbmNlIik7Ci0gICAgICAgIHNlcXVlbmNlRWxlbWVudC5zZXRQcmVmaXgoInhzZCIpOwotCi0gICAgICAgIGNvbXBsZXhFbGVtZW50LmFwcGVuZENoaWxkKHNlcXVlbmNlRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBjb21wbGV4RWxlbWVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sRWxlbWVudC5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1htbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjMDA0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYW4geG1sIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVsZW1lbnQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBRTmFtZSB0eXBlOwotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgTWFwIG5hbWVzcGFjZVByZWZpeE1hcCkgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJ4c2Q6ZWxlbWVudCIpOwotICAgICAgICBlbGVtZW50LnNldFByZWZpeCgieHNkIik7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgdGhpcy5uYW1lKTsKLSAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIGFubm5pbW91cyBjb21wbGV4IHR5cGUgZWxlbWVudAotICAgICAgICAgICAgRWxlbWVudCBjb21wbGV4dFR5cGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOmNvbXBsZXhUeXBlIik7Ci0gICAgICAgICAgICBjb21wbGV4dFR5cGVFbGVtZW50LnNldFByZWZpeCgieHNkIik7Ci0KLSAgICAgICAgICAgIEVsZW1lbnQgc2VxdWVuY2VFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOnNlcXVlbmNlIik7Ci0gICAgICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0UHJlZml4KCJ4c2QiKTsKLQotICAgICAgICAgICAgY29tcGxleHRUeXBlRWxlbWVudC5hcHBlbmRDaGlsZChzZXF1ZW5jZUVsZW1lbnQpOwotICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb21wbGV4dFR5cGVFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRC5lcXVhbHModGhpcy50eXBlLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHN0YW5kYXJkIHR5cGUKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInhzZDoiICsgdGhpcy50eXBlLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgZWxlbWVudCBwb2ludHMgdG8gYW4gY29tcGxleCB0eXBlCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlUHJlZml4TWFwLmdldCh0aGlzLnR5cGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwcmVmaXggKyAiOiIgKyB0aGlzLnR5cGUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFFOYW1lIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sSW1wb3J0LmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDgxYWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL1htbEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYW4geG1sIHNjaGVtYSBpbXBvcnQKLSAqLwotcHVibGljIGNsYXNzIFhtbEltcG9ydCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRYbWxTY2hlbWFFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KXsKLQotICAgICAgICBFbGVtZW50IGltcG9ydEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsInhzZDppbXBvcnQiKTsKLSAgICAgICAgaW1wb3J0RWxlbWVudC5zZXRQcmVmaXgoInhzZCIpOwotICAgICAgICBpbXBvcnRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIix0aGlzLnRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHJldHVybiBpbXBvcnRFbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxTY2hlbWEuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9YbWxTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkYzRjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvWG1sU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbmQgc2NoZW1hIG9iamVjdC4KLSAqIGl0IGlzIGFzc3VtZWQgdGhhdCB3ZSBjb25zaWRlciB0aGUgeHNkIHNjaGVtYWEKLSAqIGFzIHRoZSBkZWZ1YWx0IG5hbWUgc3BhY2UuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgWG1sU2NoZW1hIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOwotCi0gICAgcHJpdmF0ZSBNYXAgbmFtZXNwYWNlc1ByZWZpeE1hcDsKLSAgICBwcml2YXRlIE1hcCBpbXBvcnRzOwotICAgIHByaXZhdGUgTWFwIGVsZW1lbnRzOwotICAgIHByaXZhdGUgTWFwIGNvbXBsZXhUeXBlczsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0KLSAgICBwdWJsaWMgWG1sU2NoZW1hKCkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZXNQcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmltcG9ydHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmVsZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy5jb21wbGV4VHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxTY2hlbWEoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAvLyBhZGQgdGhlIHRhcmdldCBuYW1lc3BhY2UgdG8gbmFtZXNwYWNlIHByaWZpeCBtYXAKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VzUHJlZml4TWFwLnB1dCh0aGlzLnRhcmdldE5hbWVzcGFjZSwidG5zIik7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlc1ByZWZpeE1hcC5wdXQoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsInhzZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlLFN0cmluZyBwcmVmaXgpewotICAgICAgICB0aGlzLm5hbWVzcGFjZXNQcmVmaXhNYXAucHV0KG5hbWVzcGFjZSxwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChYbWxJbXBvcnQgeG1sSW1wb3J0KXsKLSAgICAgICB0aGlzLmltcG9ydHMucHV0KHhtbEltcG9ydC5nZXRUYXJnZXROYW1lc3BhY2UoKSx4bWxJbXBvcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhpc3RzKFhtbEltcG9ydCB4bWxJbXBvcnQpewotICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRzLmNvbnRhaW5zS2V5KHhtbEltcG9ydC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChYbWxFbGVtZW50IHhtbEVsZW1lbnQpewotICAgICAgICB0aGlzLmVsZW1lbnRzLnB1dCh4bWxFbGVtZW50LmdldE5hbWUoKSx4bWxFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aXN0cyhYbWxFbGVtZW50IHhtbEVsZW1lbnQpewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5jb250YWluc0tleSh4bWxFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50RXhpc3RzKFN0cmluZyBuYW1lKXsKLSAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuY29udGFpbnNLZXkobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29tcGxleFR5cGUoWG1sQ29tcGxleFR5cGUgeG1sQ29tcGxleFR5cGUpewotICAgICAgICB0aGlzLmNvbXBsZXhUeXBlcy5wdXQoeG1sQ29tcGxleFR5cGUuZ2V0TmFtZSgpLHhtbENvbXBsZXhUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aXN0cyhYbWxDb21wbGV4VHlwZSB4bWxDb21wbGV4VHlwZSl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXhUeXBlcy5jb250YWluc0tleSh4bWxDb21wbGV4VHlwZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGVFeGlzdHMoU3RyaW5nIG5hbWVDb21wbGV4VHlwZSl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXhUeXBlcy5jb250YWluc0tleShuYW1lQ29tcGxleFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFNjaGVtYUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpewotICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsInhzZDpzY2hlbWEiKTsKLSAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRQcmVmaXgoInhzZCIpOwotCi0gICAgICAgIC8vIHNldCB0YXJnZXQgbmFtZXNhcGNlCi0gICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCB0aGlzLnRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgLy8gcmVnaXN0ZXIgbmFtZXNhcGNlIHByZWZpeGVzCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgICAgIFN0cmluZyBwcmVmaXg7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubmFtZXNwYWNlc1ByZWZpeE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgbmFtZXNwYWNlID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSB0aGlzLm5hbWVzcGFjZXNQcmVmaXhNYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTE5TX05BTUVTUEFDRV9VUkksInhtbG5zOiIgKyBwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZGluZyBpbXBvcnRzCi0gICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQ7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuaW1wb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICB4bWxJbXBvcnQgPSAoWG1sSW1wb3J0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sSW1wb3J0LmdldFhtbFNjaGVtYUVsZW1lbnQoZG9jdW1lbnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZGluZyBlbGVtZW50cwotICAgICAgICBYbWxFbGVtZW50IHhtbEVsZW1lbnQ7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZWxlbWVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgeG1sRWxlbWVudCA9IChYbWxFbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sRWxlbWVudC5nZXRTY2hlbWFFbGVtZW50KGRvY3VtZW50LCB0aGlzLm5hbWVzcGFjZXNQcmVmaXhNYXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZGluZyBjb21wbGV4IHR5cGVzCi0gICAgICAgIFhtbENvbXBsZXhUeXBlIHhtbENvbXBsZXhUeXBlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmNvbXBsZXhUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICB4bWxDb21wbGV4VHlwZSA9IChYbWxDb21wbGV4VHlwZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LmFwcGVuZENoaWxkKHhtbENvbXBsZXhUeXBlLmdldFNjaGVtYUVsZW1lbnQoZG9jdW1lbnQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2NoZW1hRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXNQcmVmaXhNYXAoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VzUHJlZml4TWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZXNQcmVmaXhNYXAoTWFwIG5hbWVzcGFjZXNQcmVmaXhNYXApIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VzUHJlZml4TWFwID0gbmFtZXNwYWNlc1ByZWZpeE1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBpbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydHMoTWFwIGltcG9ydHMpIHsKLSAgICAgICAgdGhpcy5pbXBvcnRzID0gaW1wb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudHMoTWFwIGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldENvbXBsZXhUeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wbGV4VHlwZXMoTWFwIGNvbXBsZXhUeXBlcykgewotICAgICAgICB0aGlzLmNvbXBsZXhUeXBlcyA9IGNvbXBsZXhUeXBlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9leGNlcHRpb24vRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvZXhjZXB0aW9uL0R1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTdmMGE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9leGNlcHRpb24vRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYS5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRHVtbXlTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEdW1teVNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIER1bW15U2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9zb2FwLWVuYy54c2QgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvc29hcC1lbmMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNhNjI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9zb2FwLWVuYy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBTY2hlbWEgZm9yIHRoZSBTT0FQLzEuMSBlbmNvZGluZwotCi1UaGlzIHNjaGVtYSBoYXMgYmVlbiBwcm9kdWNlZCB1c2luZyBXM0MncyBTT0FQIFZlcnNpb24gMS4yIHNjaGVtYQotZm91bmQgYXQ6Ci0KLSAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNi9zb2FwLWVuY29kaW5nCi0KLSAgICAgQ29weXJpZ2h0IDIwMDEgTWFydGluIEd1ZGdpbiwgRGV2ZWxvcG1lbnRvci4KLQkgaHR0cDovL3d3dy5kZXZlbG9wLmNvLnVrCi0KLUNoYW5nZXMgbWFkZSBhcmUgdGhlIGZvbGxvd2luZzoKLS0gcmV2ZXJ0ZWQgbmFtZXNwYWNlIHRvIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0tIHJldmVydGVkIHJvb3QgdG8gb25seSBhbGxvdyAwIGFuZCAxIGFzIGxleGljYWwgdmFsdWVzCi0KLQotICAgICBPcmlnaW5hbCBjb3B5cmlnaHQ6Ci0KLUNvcHlyaWdodCAyMDAxIFczQyAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwKLUluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsCi1LZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KLQotICAgICBUaGlzIGRvY3VtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBXM0MgU29mdHdhcmUgTGljZW5zZSBbMV0gYXMKLSAgICAgZGVzY3JpYmVkIGluIHRoZSBGQVEgWzJdLgotCi1bMV1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAotWzJdaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9JUFItRkFRLTIwMDAwNjIwLmh0bWwjRFRECi0tLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iID4KLQotIDx4czphdHRyaWJ1dGUgbmFtZT0icm9vdCIgZGVmYXVsdD0iMCIgPgotICAgPHhzOmFubm90YXRpb24+Ci0gICAgIDx4czpkb2N1bWVudGF0aW9uPgotCSAgICdyb290JyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBzZXJpYWxpemF0aW9uIHJvb3RzIGZyb20KLSAgICAgICBvdGhlciBlbGVtZW50cyB0aGF0IGFyZSBwcmVzZW50IGluIGEgc2VyaWFsaXphdGlvbiBidXQgYXJlCi0gICAgICAgbm90IHJvb3RzIG9mIGEgc2VyaWFsaXplZCB2YWx1ZSBncmFwaAotCSA8L3hzOmRvY3VtZW50YXRpb24+Ci0gICA8L3hzOmFubm90YXRpb24+Ci0gICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9J3hzOmJvb2xlYW4nPgotCSAgIDx4czpwYXR0ZXJuIHZhbHVlPScwfDEnIC8+Ci0JIDwveHM6cmVzdHJpY3Rpb24+Ci0gICA8L3hzOnNpbXBsZVR5cGU+Ci0gPC94czphdHRyaWJ1dGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZUdyb3VwIG5hbWU9ImNvbW1vbkF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLQkgIDx4czpkb2N1bWVudGF0aW9uPgotCSAgICBBdHRyaWJ1dGVzIGNvbW1vbiB0byBhbGwgZWxlbWVudHMgdGhhdCBmdW5jdGlvbiBhcwotICAgICAgICBhY2Nlc3NvcnMgb3IgcmVwcmVzZW50IGluZGVwZW5kZW50IChtdWx0aS1yZWYpIHZhbHVlcy4KLSAgICAgICAgVGhlIGhyZWYgYXR0cmlidXRlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gYSBtYW5uZXIKLSAgICAgICAgbGlrZSBDT05SRUYuICBUaGF0IGlzLCB0aGUgZWxlbWVudCBjb250ZW50IHNob3VsZCBiZQotICAgICAgICBlbXB0eSBpZmYgdGhlIGhyZWYgYXR0cmlidXRlIGFwcGVhcnMKLQkgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzOmFubm90YXRpb24+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiIC8+Ci0gICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czphbnlVUkkiIC8+Ci0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gIDwhLS0gR2xvYmFsIEF0dHJpYnV0ZXMuICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVuZGVkCi0gICAgICAgdG8gYmUgdXNhYmxlIHZpYSBxdWFsaWZpZWQgYXR0cmlidXRlIG5hbWVzIG9uIGFueSBjb21wbGV4Ci0gICAgICAgdHlwZSByZWZlcmVuY2luZyB0aGVtLiAtLT4KLQotICA8IS0tIEFycmF5IGF0dHJpYnV0ZXMuIE5lZWRlZCB0byBnaXZlIHRoZSB0eXBlIGFuZCBkaW1lbnNpb25zCi0gICAgICAgb2YgYW4gYXJyYXkncyBjb250ZW50cywgYW5kIHRoZSBvZmZzZXQgZm9yCi0gICAgICAgcGFydGlhbGx5LXRyYW5zbWl0dGVkIGFycmF5cy4gLS0+Ci0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iYXJyYXlDb29yZGluYXRlIiA+Ci0gICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyIgLz4KLSAgPC94czpzaW1wbGVUeXBlPgotCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iYXJyYXlUeXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gIDx4czphdHRyaWJ1dGUgbmFtZT0ib2Zmc2V0IiB0eXBlPSJ0bnM6YXJyYXlDb29yZGluYXRlIiAvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJhcnJheUF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOmFycmF5VHlwZSIgLz4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOm9mZnNldCIgLz4KLSAgPC94czphdHRyaWJ1dGVHcm91cD4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ0bnM6YXJyYXlDb29yZGluYXRlIiAvPgotCi0gIDx4czphdHRyaWJ1dGVHcm91cCBuYW1lPSJhcnJheU1lbWJlckF0dHJpYnV0ZXMiID4KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOnBvc2l0aW9uIiAvPgotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPgotCi0gIDx4czpncm91cCBuYW1lPSJBcnJheSIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJBcnJheSIgdHlwZT0idG5zOkFycmF5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXkiID4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLQkgIDx4czpkb2N1bWVudGF0aW9uPgotCSAnQXJyYXknIGlzIGEgY29tcGxleCB0eXBlIGZvciBhY2Nlc3NvcnMgaWRlbnRpZmllZCBieSBwb3NpdGlvbgotCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLSAgICA8eHM6Z3JvdXAgcmVmPSJ0bnM6QXJyYXkiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6YXJyYXlBdHRyaWJ1dGVzIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gJ1N0cnVjdCcgaXMgYSBjb21wbGV4IHR5cGUgZm9yIGFjY2Vzc29ycyBpZGVudGlmaWVkIGJ5Ci0gICAgICAgbmFtZS4gQ29uc3RyYWludDogTm8gZWxlbWVudCBtYXkgYmUgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzCi0gICAgICAgYW55IG90aGVyLCBub3IgbWF5IGFueSBlbGVtZW50IGhhdmUgYSBtYXhPY2N1cnMgPiAxLiAtLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJTdHJ1Y3QiIHR5cGU9InRuczpTdHJ1Y3QiIC8+Ci0KLSAgPHhzOmdyb3VwIG5hbWU9IlN0cnVjdCIgPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+Ci0JPC94czpzZXF1ZW5jZT4KLSAgPC94czpncm91cD4KLQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU3RydWN0IiA+Ci0gICAgPHhzOmdyb3VwIHJlZj0idG5zOlN0cnVjdCIgbWluT2NjdXJzPSIwIiAvPgotICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIi8+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAnQmFzZTY0JyBjYW4gYmUgdXNlZCB0byBzZXJpYWxpemVBbmRDb25zdW1lIGJpbmFyeSBkYXRhIHVzaW5nIGJhc2U2NAotICAgICAgIGVuY29kaW5nIGFzIGRlZmluZWQgaW4gUkZDMjA0NSBidXQgd2l0aG91dCB0aGUgTUlNRSBsaW5lCi0gICAgICAgbGVuZ3RoIGxpbWl0YXRpb24uIC0tPgotCi0gIDx4czpzaW1wbGVUeXBlIG5hbWU9ImJhc2U2NCIgPgotICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiIC8+Ci0gIDwveHM6c2ltcGxlVHlwZT4KLQotIDwhLS0gRWxlbWVudCBkZWNsYXJhdGlvbnMgY29ycmVzcG9uZGluZyB0byBlYWNoIG9mIHRoZSBzaW1wbGUKLSAgICAgIHR5cGVzIGluIHRoZSBYTUwgU2NoZW1hcyBTcGVjaWZpY2F0aW9uLiAtLT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkdXJhdGlvbiIgdHlwZT0idG5zOmR1cmF0aW9uIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZHVyYXRpb24iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZHVyYXRpb24iID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0ZVRpbWUiIHR5cGU9InRuczpkYXRlVGltZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGVUaW1lIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRhdGVUaW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOT1RBVElPTiIgdHlwZT0idG5zOk5PVEFUSU9OIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTk9UQVRJT04iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6UU5hbWUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0aW1lIiB0eXBlPSJ0bnM6dGltZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dGltZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJkYXRlIiB0eXBlPSJ0bnM6ZGF0ZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZGF0ZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnWWVhck1vbnRoIiB0eXBlPSJ0bnM6Z1llYXJNb250aCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdZZWFyTW9udGgiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z1llYXJNb250aCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnWWVhciIgdHlwZT0idG5zOmdZZWFyIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ1llYXIiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z1llYXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZ01vbnRoRGF5IiB0eXBlPSJ0bnM6Z01vbnRoRGF5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ01vbnRoRGF5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmdNb250aERheSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnRGF5IiB0eXBlPSJ0bnM6Z0RheSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdEYXkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z0RheSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJnTW9udGgiIHR5cGU9InRuczpnTW9udGgiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJnTW9udGgiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Z01vbnRoIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW4iIHR5cGU9InRuczpib29sZWFuIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYm9vbGVhbiIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpib29sZWFuIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImJhc2U2NEJpbmFyeSIgdHlwZT0idG5zOmJhc2U2NEJpbmFyeSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaGV4QmluYXJ5IiB0eXBlPSJ0bnM6aGV4QmluYXJ5IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaGV4QmluYXJ5IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5IiA+Ci0gICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJmbG9hdCIgdHlwZT0idG5zOmZsb2F0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZmxvYXQiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6ZmxvYXQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZG91YmxlIiB0eXBlPSJ0bnM6ZG91YmxlIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZG91YmxlIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRvdWJsZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlVUkkiIHR5cGU9InRuczphbnlVUkkiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhbnlVUkkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IlFOYW1lIiB0eXBlPSJ0bnM6UU5hbWUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJRTmFtZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpRTmFtZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotCi0gIDx4czplbGVtZW50IG5hbWU9InN0cmluZyIgdHlwZT0idG5zOnN0cmluZyIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InN0cmluZyIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9ybWFsaXplZFN0cmluZyIKLSAgICAgICAgICAgICAgdHlwZT0idG5zOm5vcm1hbGl6ZWRTdHJpbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJub3JtYWxpemVkU3RyaW5nIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vcm1hbGl6ZWRTdHJpbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0idG9rZW4iIHR5cGU9InRuczp0b2tlbiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InRva2VuIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnRva2VuIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Imxhbmd1YWdlIiB0eXBlPSJ0bnM6bGFuZ3VhZ2UiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsYW5ndWFnZSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpsYW5ndWFnZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOYW1lIiB0eXBlPSJ0bnM6TmFtZSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6TmFtZSIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOTVRPS0VOIiB0eXBlPSJ0bnM6Tk1UT0tFTiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik5NVE9LRU4iID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6Tk1UT0tFTiIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJOQ05hbWUiIHR5cGU9InRuczpOQ05hbWUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOQ05hbWUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6TkNOYW1lIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9Ik5NVE9LRU5TIiB0eXBlPSJ0bnM6Tk1UT0tFTlMiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOTVRPS0VOUyIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpOTVRPS0VOUyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJJRCIgdHlwZT0idG5zOklEIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSUQiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6SUQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iSURSRUYiIHR5cGU9InRuczpJRFJFRiIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IklEUkVGIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEUkVGIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9IkVOVElUWSIgdHlwZT0idG5zOkVOVElUWSIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVOVElUWSIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpFTlRJVFkiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iSURSRUZTIiB0eXBlPSJ0bnM6SURSRUZTIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSURSRUZTIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOklEUkVGUyIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJFTlRJVElFUyIgdHlwZT0idG5zOkVOVElUSUVTIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRU5USVRJRVMiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6RU5USVRJRVMiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbCIgdHlwZT0idG5zOmRlY2ltYWwiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJkZWNpbWFsIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmRlY2ltYWwiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW50ZWdlciIgdHlwZT0idG5zOmludGVnZXIiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJpbnRlZ2VyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIgotICAgICAgICAgICAgICB0eXBlPSJ0bnM6bm9uUG9zaXRpdmVJbnRlZ2VyIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vblBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJuZWdhdGl2ZUludGVnZXIiIHR5cGU9InRuczpuZWdhdGl2ZUludGVnZXIiLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Im5lZ2F0aXZlSW50ZWdlciIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpuZWdhdGl2ZUludGVnZXIiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibG9uZyIgdHlwZT0idG5zOmxvbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJsb25nIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmxvbmciID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaW50IiB0eXBlPSJ0bnM6aW50IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iaW50IiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmludCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJzaG9ydCIgdHlwZT0idG5zOnNob3J0IiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ic2hvcnQiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c2hvcnQiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iYnl0ZSIgdHlwZT0idG5zOmJ5dGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJieXRlIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJ5dGUiID4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZUdyb3VwIHJlZj0idG5zOmNvbW1vbkF0dHJpYnV0ZXMiIC8+Ci0gICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibm9uTmVnYXRpdmVJbnRlZ2VyIgotICAgICAgICAgICAgICB0eXBlPSJ0bnM6bm9uTmVnYXRpdmVJbnRlZ2VyIiAvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ibm9uTmVnYXRpdmVJbnRlZ2VyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOm5vbk5lZ2F0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bnNpZ25lZExvbmciIHR5cGU9InRuczp1bnNpZ25lZExvbmciIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZExvbmciID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRMb25nIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkSW50IiB0eXBlPSJ0bnM6dW5zaWduZWRJbnQiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEludCIgPgotICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czp1bnNpZ25lZEludCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bnNpZ25lZFNob3J0IiB0eXBlPSJ0bnM6dW5zaWduZWRTaG9ydCIgLz4KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InVuc2lnbmVkU2hvcnQiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRTaG9ydCIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJ1bnNpZ25lZEJ5dGUiIHR5cGU9InRuczp1bnNpZ25lZEJ5dGUiIC8+Ci0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ1bnNpZ25lZEJ5dGUiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6dW5zaWduZWRCeXRlIiA+Ci0gICAgICAgIDx4czphdHRyaWJ1dGVHcm91cCByZWY9InRuczpjb21tb25BdHRyaWJ1dGVzIiAvPgotICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czplbGVtZW50IG5hbWU9InBvc2l0aXZlSW50ZWdlciIgdHlwZT0idG5zOnBvc2l0aXZlSW50ZWdlciIvPgotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiA+Ci0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnBvc2l0aXZlSW50ZWdlciIgPgotICAgICAgICA8eHM6YXR0cmlidXRlR3JvdXAgcmVmPSJ0bnM6Y29tbW9uQXR0cmlidXRlcyIgLz4KLSAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIiAvPgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL3htaW1lLnhzZCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS94bWltZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzJkMzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vc2NoZW1hL3htaW1lLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wNi94bWxtaW1lIgotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZSIgPgotIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiID4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgICAgPHhzOnBhdHRlcm4gdmFsdWU9Iih0ZXh0fGFwcGxpY2F0aW9ufGltYWdlfGF1ZGlvfHZpZGVvfG1vZGVsfHgtWy0uYS16MC05XSspL1thLXowLTldWy0uK2EtejAtOV0rKDtccz8uKz0uKykqIiAvPgotICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOmF0dHJpYnV0ZT4KLTx4czplbGVtZW50IG5hbWU9ImV4cGVjdGVkTWVkaWFUeXBlIiA+Ci0gICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICA8eHM6bGlzdCBpdGVtVHlwZT0idG5zOmV4cGVjdGVkTWVkaWFUeXBlSXRlbSIgLz4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08eHM6c2ltcGxlVHlwZSBuYW1lPSJleHBlY3RlZE1lZGlhVHlwZUl0ZW0iID4KLSAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiA+Ci0gICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSIodGV4dHxhcHBsaWNhdGlvbnxpbWFnZXxhdWRpb3x2aWRlb3xtb2RlbHx4LVstLmEtejAtOV0rKS8oKFthLXowLTldWy0uK2EtejAtOV0rKXxcKikiIC8+Ci0gICAgPC94czpyZXN0cmljdGlvbj4KLTwveHM6c2ltcGxlVHlwZT4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9BbnRCdWlsZFdyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0FudEJ1aWxkV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDMwZDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0FudEJ1aWxkV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFRlbXBsYXRlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEFudEJ1aWxkV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkYXRhYmluZGluZ0ZyYW1ld29yayA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXREZWZhdWx0REJGcmFtZXdvcmtOYW1lKCk7Ci0KLSAgICBwdWJsaWMgQW50QnVpbGRXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIEFudEJ1aWxkV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZ0ZyYW1ld29yayhTdHJpbmcgZGF0YWJpbmRpbmdGcmFtZXdvcmspIHsKLSAgICAgICAgdGhpcy5kYXRhYmluZGluZ0ZyYW1ld29yayA9IGRhdGFiaW5kaW5nRnJhbWV3b3JrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWlsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIueG1sIik7Ci0gICAgICAgIC8vc2V0IHRoZSBleGlzdGluZyBmbGFnCi0gICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL292ZXJyaWRkZW4gdG8gZ2V0IHRoZSBjb3JyZWN0IGJlaGF2aW9yCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kVGVtcGxhdGUoTWFwIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcCkgewotICAgICAgICBTdHJpbmcgb3duQ2xhenpOYW1lID0gdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5VmFsdWU7Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZU5hbWUgPSBudWxsOwotICAgICAgICBJdGVyYXRvciBrZXlzID0gbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnR5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vY2hlY2sgZm9yIHRlbXBsYXRlIGVudHJpZXMKLSAgICAgICAgICAgIGtleSA9IGtleXMubmV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKFRFTVBMQVRFX1NVRkZJWCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xhc3MgbmFtZSBpcyB0aGVyZQotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAuZ2V0KGtleSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZS5zdGFydHNXaXRoKG93bkNsYXp6TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKGRhdGFiaW5kaW5nRnJhbWV3b3JrKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lID0gcHJvcGVydHlWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKHByb3BlcnR5VmFsdWUuaW5kZXhPZihTRVBBUkFUT1JfU1RSSU5HKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0ZW1wbGF0ZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlKERvY3VtZW50IGRvYywgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIFhTTFRUZW1wbGF0ZVByb2Nlc3Nvci5wYXJzZSh0aGlzLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2x0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NCdWlsZFNjcmlwdFdyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NCdWlsZFNjcmlwdFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTM5MTZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DQnVpbGRTY3JpcHRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIENCdWlsZFNjcmlwdFdyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgICAgcHVibGljIENCdWlsZFNjcmlwdFdyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbixTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVPdXRGaWxlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0cHV0RmlsZSA9IG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZShvdXRwdXRGaWxlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWlsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnNoIik7Ci0gICAgICAgIC8vc2V0IHRoZSBleGlzdGluZyBmbGFnCi0gICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1NlcnZpY2VYTUxXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2VydmljZVhNTFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWIwNzlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2VydmljZVhNTFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ1NlcnZpY2VYTUxXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotCi0gICAgcHVibGljIENTZXJ2aWNlWE1MV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBDU2VydmljZVhNTFdyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVPdXRGaWxlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0cHV0RmlsZSA9IG9yZy5hcGFjaGUuYXhpczIudXRpbC5GaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZShvdXRwdXRGaWxlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnhtbCIpOwotICAgICAgICAvL3NldCB0aGUgZXhpc3RpbmcgZmxhZwotICAgICAgICBmaWxlRXhpc3RzID0gb3V0cHV0RmlsZS5leGlzdHMoKTsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NTa2VsSGVhZGVyV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1NrZWxIZWFkZXJXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5NDQzYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1NrZWxIZWFkZXJXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDU2tlbEhlYWRlcldyaXRlciBleHRlbmRzIENTdHViSGVhZGVyV3JpdGVyIHsKLQotICAgIHB1YmxpYyBDU2tlbEhlYWRlcldyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIENTa2VsSGVhZGVyV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgc3VwZXIob3V0cHV0RmlsZUxvY2F0aW9uLCBsYW5ndWFnZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1NrZWxTb3VyY2VXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2tlbFNvdXJjZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFlZmJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU2tlbFNvdXJjZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBDU2tlbFNvdXJjZVdyaXRlciBleHRlbmRzIENTdHViU291cmNlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBDU2tlbFNvdXJjZVdyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIENTa2VsU291cmNlV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgc3VwZXIob3V0cHV0RmlsZUxvY2F0aW9uLCBsYW5ndWFnZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1N0dWJIZWFkZXJXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3R1YkhlYWRlcldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzUzMmEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3R1YkhlYWRlcldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFRlbXBsYXRlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ1N0dWJIZWFkZXJXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBDU3R1YkhlYWRlcldyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1N0dWJIZWFkZXJXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmgiKTsKLSAgICAgICAgLy9zZXQgdGhlIGV4aXN0aW5nIGZsYWcKLSAgICAgICAgZmlsZUV4aXN0cyA9IG91dHB1dEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShEb2N1bWVudCBkb2MsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICBYU0xUVGVtcGxhdGVQcm9jZXNzb3IucGFyc2UodGhpcy5zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueHNsdFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlcik7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCdcbicpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1N0dWJTb3VyY2VXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3R1YlNvdXJjZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmU3ZjJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3R1YlNvdXJjZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWFNMVFRlbXBsYXRlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ1N0dWJTb3VyY2VXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBDU3R1YlNvdXJjZVdyaXRlcihTdHJpbmcgb3V0cHV0RmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gbmV3IEZpbGUob3V0cHV0RmlsZUxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1N0dWJTb3VyY2VXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlRXh0ZW5zaW9uRm9yTGFuZ3VhZ2UobGFuZ3VhZ2UpKTsKLSAgICAgICAgLy9zZXQgdGhlIGV4aXN0aW5nIGZsYWcKLSAgICAgICAgZmlsZUV4aXN0cyA9IG91dHB1dEZpbGUuZXhpc3RzKCk7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlKERvY3VtZW50IGRvYywgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIFhTTFRUZW1wbGF0ZVByb2Nlc3Nvci5wYXJzZSh0aGlzLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2x0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCdcbicpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3ZjU2tlbGV0b25Xcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DU3ZjU2tlbGV0b25Xcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5MzcwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvQ1N2Y1NrZWxldG9uV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YU0xUVGVtcGxhdGVQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBDU3ZjU2tlbGV0b25Xcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBDU3ZjU2tlbGV0b25Xcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIENTdmNTa2VsZXRvbldyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlT3V0RmlsZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dEZpbGUgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlci5jcmVhdGVDbGFzc0ZpbGUob3V0cHV0RmlsZUxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVFeHRlbnNpb25Gb3JMYW5ndWFnZShsYW5ndWFnZSkpOwotICAgICAgICAvL3NldCB0aGUgZXhpc3RpbmcgZmxhZwotICAgICAgICBmaWxlRXhpc3RzID0gb3V0cHV0RmlsZS5leGlzdHMoKTsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBvdXRwdXQgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhcnNlKERvY3VtZW50IGRvYywgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWZpbGVFeGlzdHMpIHsKLSAgICAgICAgICAgIFhTTFRUZW1wbGF0ZVByb2Nlc3Nvci5wYXJzZSh0aGlzLnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2x0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVyKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLndyaXRlKCdcbicpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0ud3JpdGUoJ1xuJyk7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NhbGxiYWNrSGFuZGxlcldyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0NhbGxiYWNrSGFuZGxlcldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2NiY2VhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9DYWxsYmFja0hhbmRsZXJXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLSAgICBwdWJsaWMgQ2FsbGJhY2tIYW5kbGVyV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxsYmFja0hhbmRsZXJXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvRXhjZXB0aW9uV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvRXhjZXB0aW9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MzhlMjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0V4Y2VwdGlvbldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25Xcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBFeGNlcHRpb25Xcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbldyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9GaWxlV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvRmlsZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Y3YWI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9GaWxlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhTTFRUZW1wbGF0ZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlV3JpdGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhGaWxlV3JpdGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0RmlsZSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0geHNsdFN0cmVhbSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBsYW5ndWFnZSA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXREZWZhdWx0TGFuZ3VhZ2UoKTsgLy9kZWZhdWx0IHdvdWxkIGphdmEKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX1NVRkZJWCA9ICIudGVtcGxhdGUiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9TVUZGSVggPSAiLmV4dGVuc2lvbiI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SX1NUUklORyA9ICIsIjsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbGVFeGlzdHMgPSBmYWxzZTsvL2EgZmxhZyBzYXlpbmcgdGhlIGZpbGUgaXMgZXhpc3RpbmcKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc092ZXJyaWRlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsYW5ndWFnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsYW5ndWFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0gICAgLyoqIExvYWRzIHRoZSB0ZW1wbGF0ZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkVGVtcGxhdGUoKSB0aHJvd3MgQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhlIGNsYXNzIHdyaXRlcnMgaXMgdG8gdXNlIHRoZSBwcm9wZXJ0eSBtYXAgZnJvbSB0aGUgbGFuZ3VnZSBzcGVjaWZpYyB0eXBlcwotICAgICAgICAvLyBUaGUgcHJvcGVydGllcyBhcmUgYXJyYW5nZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcgotICAgICAgICAvLyA8bGFuZy1uYW1lPi4qIC50ZW1wbGF0ZT08d3JpdGUtY2xhc3M+LDx0ZW1wbGF0ZS1uYW1lPgotCi0gICAgICAgIC8vZmlyc3QgZ2V0IHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBwcm9wZXJ0eSBtYXAKLSAgICAgICAgQ2xhc3MgY2xhenogPSB0aGlzLmdldENsYXNzKCk7Ci0gICAgICAgIE1hcCBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAgPQotICAgICAgICAgICAgICAgIChNYXApQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmdldExhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0aWVzTWFwKCkuZ2V0KHRoaXMubGFuZ3VhZ2UpOwotICAgICAgICBpZiAobGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnR5TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoIndyaXRlci5ub0xhbmdQcm9wZXJ0aWVzRXh0ZW5zaW9uIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlTmFtZSA9IGZpbmRUZW1wbGF0ZShsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXApOwotICAgICAgICBpZiAodGVtcGxhdGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMueHNsdFN0cmVhbSA9IGNsYXp6LmdldFJlc291cmNlQXNTdHJlYW0odGVtcGxhdGVOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbihDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3JpdGVyLnRlbXBsYXRlTWlzc2luZyIpKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRUZW1wbGF0ZShNYXAgbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnR5TWFwKSB7Ci0gICAgICAgIC8vc2VhcmNoIHRocm91Z2ggdGhlIHByb3BydHkgbmFtZXMgdG8gZmluZCB0aGUgdGVtcGxhdGUgcmVsZXZhbnQgdG8gdGhpcyBjbGFzcwotCi0gICAgICAgIFN0cmluZyBvd25DbGF6ek5hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZTsKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlTmFtZSA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vY2hlY2sgZm9yIHRlbXBsYXRlIGVudHJpZXMKLSAgICAgICAgICAgIGtleSA9IGtleXMubmV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKFRFTVBMQVRFX1NVRkZJWCkpIHsKLSAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY2xhc3MgbmFtZSBpcyB0aGVyZQotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPSBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAuZ2V0KGtleSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZS5zdGFydHNXaXRoKG93bkNsYXp6TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9iaW5nbyEgd2UgZm91bmQgdGhlIHJpZ2h0IHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS5zdWJzdHJpbmcocHJvcGVydHlWYWx1ZS5pbmRleE9mKFNFUEFSQVRPUl9TVFJJTkcpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wbGF0ZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlRXh0ZW5zaW9uRm9yTGFuZ3VhZ2UobGFuZ3VhZ2UpKTsKLSAgICAgICAgLy9zZXQgdGhlIGV4aXN0aW5nIGZsYWcKLSAgICAgICAgaWYgKHRoaXMuaXNPdmVycmlkZSkgewotICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZmlsZUV4aXN0c05vT3ZlcndyaXRlIiwgb3V0cHV0RmlsZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGxhbmd1YWdlCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmaWxlIGV4dGVuc2lvbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb25Gb3JMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgTWFwIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0eU1hcCA9Ci0gICAgICAgICAgICAgICAgKE1hcClDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0TGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnRpZXNNYXAoKS5nZXQodGhpcy5sYW5ndWFnZSk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgLy9jaGVjayBmb3IgdGVtcGxhdGUgZW50cmllcwotICAgICAgICAgICAga2V5ID0ga2V5cy5uZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoRVhURU5TSU9OX1NVRkZJWCkpIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb24gPSBsYW5ndWFnZVNwZWNpZmljUHJvcGVydHlNYXAuZ2V0KGtleSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAvL2FkZCBhIC4gdG8gdGhlIGZyb250Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gIi4iICsgZXh0ZW5zaW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvYwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGFyc2UoRG9jdW1lbnQgZG9jLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZmlsZUV4aXN0cykgewotICAgICAgICAgICAgWFNMVFRlbXBsYXRlUHJvY2Vzc29yLnBhcnNlKHRoaXMuc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhzbHRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXIpOwotICAgICAgICAgICAgdGhpcy5zdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIHRoaXMuc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRlKCkgewotICAgICAgICByZXR1cm4gaXNPdmVycmlkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZShib29sZWFuIG92ZXJyaWRlKSB7Ci0gICAgICAgIGlzT3ZlcnJpZGUgPSBvdmVycmlkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRPdXRwdXRGaWxlKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0RmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlKEZpbGUgb3V0cHV0RmlsZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGUgPSBvdXRwdXRGaWxlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9JbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZDE3M2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL0ludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0gICAgcHVibGljIEludGVyZmFjZUltcGxlbWVudGF0aW9uV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcmZhY2VJbXBsZW1lbnRhdGlvbldyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9JbnRlcmZhY2VXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9JbnRlcmZhY2VXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5OWVkMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvSW50ZXJmYWNlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEludGVyZmFjZVdyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0KLSAgICBwdWJsaWMgSW50ZXJmYWNlV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcmZhY2VXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvTWVzc2FnZVJlY2VpdmVyV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvTWVzc2FnZVJlY2VpdmVyV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTcyOTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL01lc3NhZ2VSZWNlaXZlcldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUmVjZWl2ZXJXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotICAgIHB1YmxpYyBNZXNzYWdlUmVjZWl2ZXJXcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VSZWNlaXZlcldyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvUG9saWN5RmlsZVdyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1BvbGljeUZpbGVXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyZTk4My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvUG9saWN5RmlsZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgUG9saWN5RmlsZVdyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0gICAgcHVibGljIFBvbGljeUZpbGVXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVPdXRGaWxlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnhtbCIpOwotICAgICAgICAvL3NldCB0aGUgZXhpc3RpbmcgZmxhZwotICAgICAgICBmaWxlRXhpc3RzID0gb3V0cHV0RmlsZS5leGlzdHMoKTsKLSAgICAgICAgaWYgKCFmaWxlRXhpc3RzKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2NoZW1hV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2NoZW1hV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNzYxYTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1NjaGVtYVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MUHJldHR5UHJpbnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiBBIGNvbnZlbmllbnQgY2xhc3MgdG8gd3JpdGUgb3V0IHRoZSBzY2hlbWFzIGludG8gYSBmaWxlIGluIHRoZSBvdXRwdXQgbG9jYXRpb24gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBGaWxlIGJhc2VGb2xkZXIgPSBudWxsOwotCi0gICAgcHVibGljIFNjaGVtYVdyaXRlcihGaWxlIGJhc2VGb2xkZXIpIHsKLSAgICAgICAgdGhpcy5iYXNlRm9sZGVyID0gYmFzZUZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVNjaGVtYShYbWxTY2hlbWEgc2NoZW1hLCBTdHJpbmcgc2NoZW1hRmlsZU5hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBGaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZShiYXNlRm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRmlsZU5hbWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVOYW1lLmxhc3RJbmRleE9mKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIueHNkIik7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vc2V0IHRoZSBvcHRpb25zIGZvciB0aGUgc2NoZW1hcwotICAgICAgICAgICAgICAgIHNjaGVtYS53cml0ZShmb3MsZ2V0RGVmYXVsdE9wdGlvbk1hcCgpKTsKLSAgICAgICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBYTUxQcmV0dHlQcmludGVyLnByZXR0aWZ5KG91dHB1dEZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNjaGVtYSB3cml0aW5nIGZhaWxlZCEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGdldERlZmF1bHRPcHRpb25NYXAoKXsKLSAgICAgICAgTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBvcHRpb25zLnB1dChPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCJubyIpOwotICAgICAgICBvcHRpb25zLnB1dChPdXRwdXRLZXlzLklOREVOVCwieWVzIik7Ci0KLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9TZXJ2aWNlWE1MV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2VydmljZVhNTFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJmOGVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9TZXJ2aWNlWE1MV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlWE1MV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLQotICAgIHB1YmxpYyBTZXJ2aWNlWE1MV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlWE1MV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU91dEZpbGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBvdXRwdXRGaWxlID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKG91dHB1dEZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIueG1sIik7Ci0gICAgICAgIC8vc2V0IHRoZSBleGlzdGluZyBmbGFnCi0gICAgICAgIGZpbGVFeGlzdHMgPSBvdXRwdXRGaWxlLmV4aXN0cygpOwotICAgICAgICBpZiAoIWZpbGVFeGlzdHMgfHwgdGhpcy5pc092ZXJyaWRlKSB7Ci0gICAgICAgICAgICB0aGlzLnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1NrZWxldG9uSW50ZXJmYWNlV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YWU3Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgU2tlbGV0b25JbnRlcmZhY2VXcml0ZXIgZXh0ZW5kcyBGaWxlV3JpdGVyIHsKLQotCi0gICAgcHVibGljIFNrZWxldG9uSW50ZXJmYWNlV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTa2VsZXRvbkludGVyZmFjZVdyaXRlcihGaWxlIG91dHB1dEZpbGVMb2NhdGlvbiwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uID0gb3V0cHV0RmlsZUxvY2F0aW9uOwotICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvU2tlbGV0b25Xcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Ta2VsZXRvbldyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWZlZGYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9Ta2VsZXRvbldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBTa2VsZXRvbldyaXRlciBleHRlbmRzIEZpbGVXcml0ZXIgewotCi0KLSAgICBwdWJsaWMgU2tlbGV0b25Xcml0ZXIoU3RyaW5nIG91dHB1dEZpbGVMb2NhdGlvbikgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG5ldyBGaWxlKG91dHB1dEZpbGVMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIFNrZWxldG9uV3JpdGVyKEZpbGUgb3V0cHV0RmlsZUxvY2F0aW9uLCBTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBvdXRwdXRGaWxlTG9jYXRpb247Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1Rlc3RDbGFzc1dyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1Rlc3RDbGFzc1dyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTdhMTNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9UZXN0Q2xhc3NXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzV3JpdGVyIGV4dGVuZHMgRmlsZVdyaXRlciB7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzV3JpdGVyKFN0cmluZyBvdXRwdXRGaWxlTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb24gPSBuZXcgRmlsZShvdXRwdXRGaWxlTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3NXcml0ZXIoRmlsZSBvdXRwdXRGaWxlTG9jYXRpb24sIFN0cmluZyBsYW5ndWFnZSkgewotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbiA9IG91dHB1dEZpbGVMb2NhdGlvbjsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvV1NETDExV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvV1NETDExV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWVhNDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vd3JpdGVyL1dTREwxMVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuRmlsZVdyaXRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETDExV3JpdGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9UQUcgPSAiaW1wb3J0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1RBRyA9ICJpbmNsdWRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotCi0gICAgcHJpdmF0ZSBGaWxlIGJhc2VGb2xkZXIgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGNvdW50OwotCi0KLSAgICBwdWJsaWMgV1NETDExV3JpdGVyKEZpbGUgYmFzZUZvbGRlcikgewotICAgICAgICB0aGlzLmJhc2VGb2xkZXIgPSBiYXNlRm9sZGVyOwotICAgICAgICB0aGlzLmNvdW50ID0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVdTREwoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy9jcmVhdGUgYSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IEZpbGVXcml0ZXIuY3JlYXRlQ2xhc3NGaWxlKGJhc2VGb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi53c2RsIik7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5wcmludFdTREwoZm9zKTsKLSAgICAgICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXU0RMIHdyaXRpbmcgZmFpbGVkISIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVXU0RMKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIE1hcCBjaGFuZ2VkTWFwKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1hcCBiYXNlVVJJd3NkbE5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW5pdGlhbCBkZWZpbml0aW9uIHRvIHRoZSBtYXAKLSAgICAgICAgICAgICAgICBiYXNlVVJJd3NkbE5hbWVNYXAucHV0KGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCksYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgIi53c2RsIik7Ci0gICAgICAgICAgICAgICAgd3JpdGVXU0RMKGRlZmluaXRpb24sIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArICIud3NkbCIsIGNoYW5nZWRNYXAsIGJhc2VVUkl3c2RsTmFtZU1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV1NETCB3cml0aW5nIGZhaWxlZCEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVdTREwoRGVmaW5pdGlvbiBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGNoYW5nZWRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgYmFzZVVSSXdzZGxOYW1lTWFwKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZmlyc3QgcHJvY2VzcyB0aGUgaW1wb3J0cyBhbmQgc2F2ZSB0aGVtLgotICAgICAgICBNYXAgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0SW1wb3J0cygpOwotICAgICAgICBpZiAoaW1wb3J0cyAhPSBudWxsICYmIChpbXBvcnRzLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICBWZWN0b3IgaW1wb3J0c1ZlY3RvciA9IG51bGw7Ci0gICAgICAgICAgICBJbXBvcnQgd3NkbEltcG9ydCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbE5hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGltcHJvdHNWZWN0b3JJdGVyID0gaW1wb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBpbXByb3RzVmVjdG9ySXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaW1wb3J0c1ZlY3RvciA9IChWZWN0b3IpaW1wcm90c1ZlY3Rvckl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaW1wb3J0c0l0ZXIgPSBpbXBvcnRzVmVjdG9yLml0ZXJhdG9yKCk7IGltcG9ydHNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEltcG9ydCA9IChJbXBvcnQpaW1wb3J0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSB3c2RsSW1wb3J0LmdldERlZmluaXRpb24oKS5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBwcm9jZXNzIHRoaXMgd3NkbCBmaWxlIG9ubHkgaWYgaXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCBlYXJsaWVyCi0gICAgICAgICAgICAgICAgICAgIGlmICghYmFzZVVSSXdzZGxOYW1lTWFwLmNvbnRhaW5zS2V5KHdzZGxMb2NhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxOYW1lID0gd3NkbExvY2F0aW9uLnN1YnN0cmluZyh3c2RsTG9jYXRpb24ubGFzdEluZGV4T2YoJy8nKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3c2RsTmFtZS5lbmRzV2l0aCgiLndzZGwiKSAmJiAhd3NkbE5hbWUuZW5kc1dpdGgoIi54c2QiKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNlZW1zIHRvIGJlIGFuIG9ubGluZSB3c2RsIHNvIHdlIGdlbmVyYXRlIGEgZHVtbXkgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzZGxOYW1lLmluZGV4T2YoInhzZCIpID4gLTEpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxOYW1lID0gInhzZCIgKyBjb3VudCsrICsgIi54c2QiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsTmFtZSA9ICJ3c2RsIiArIGNvdW50KysgKyAiLndzZGwiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3RyaW0gdGhlIHdzZGwgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJhc2VVUkl3c2RsTmFtZU1hcC5jb250YWluc1ZhbHVlKHdzZGxOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydCBmaWxlIG5hbWUgY2FuIGVpdGhlciBiZSB4c2Qgb3Igd3NkbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZVBhcnQgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCx3c2RsTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gd3NkbE5hbWUuc3Vic3RyaW5nKHdzZGxOYW1lLmxhc3RJbmRleE9mKCIuIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxOYW1lID0gZmlsZU5hbWVQYXJ0ICsgY291bnQrKyArIGV4dGVuc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkl3c2RsTmFtZU1hcC5wdXQod3NkbExvY2F0aW9uLCB3c2RsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGlubmVyRGVmaW5pdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVXU0RMKGlubmVyRGVmaW5pdGlvbiwgd3NkbE5hbWUsIGNoYW5nZWRNYXAsIGJhc2VVUkl3c2RsTmFtZU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB3c2RsSW1wb3J0LnNldExvY2F0aW9uVVJJKChTdHJpbmcpYmFzZVVSSXdzZGxOYW1lTWFwLmdldCh3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hhbmdlIHRoZSBsb2NhdGlvbnMgb24gdGhlIGltcG9ydGVkIHNjaGVtYXMKLSAgICAgICAgYWRqdXN0V1NETFNjaGVtYUxvY2F0aW9ucyhkZWZpbml0aW9uLCBjaGFuZ2VkTWFwKTsKLSAgICAgICAgLy8gZmluYWxseSBzYXZlIHRoZSBmaWxlCi0gICAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFdyaXRlcigpOwotICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBGaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZShiYXNlRm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBmaWxlTmFtZSwgbnVsbCk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0KLSAgICAgICAgLy8gd2UgaGF2ZSBhIGNhdGNoIGhlcmUKLSAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG11bHRpbXBsZSBzZXJ2aWNlcyBpbiB0aGUgZGVmaW5pdGlvbiBvYmplY3QKLSAgICAgICAgLy8gd2UgaGF2ZSB0byB3cml0ZSBvbmx5IHRoZSByZWxhdmVudCBzZXJ2aWNlLgotCi0KLSAgICAgICAgaWYgKGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS5zaXplKCkgPiAxKXsKLSAgICAgICAgICAgTGlzdCByZW1vdmVkU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgIExpc3Qgc2VydmljZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgICAgIE1hcCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHNlcnZpY2VzIGxpc3QKLSAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc2VydmljZXMudmFsdWVzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgc2VydmljZXNMaXN0LmFkZChpdGVyLm5leHQoKSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlOwotICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWVGcm9tRmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICAgICAgICAgaWYgKGZpbGVOYW1lLmluZGV4T2YoIi53c2RsIikgPiAtMSl7Ci0gICAgICAgICAgICAgICAgc2VydmljZU5hbWVGcm9tRmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCxmaWxlTmFtZS5sYXN0SW5kZXhPZigiLndzZGwiKSk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBpZiAoZmlsZU5hbWUuaW5kZXhPZigiLnhzZCIpID4gLTEpewotICAgICAgICAgICAgICAgc2VydmljZU5hbWVGcm9tRmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCxmaWxlTmFtZS5sYXN0SW5kZXhPZigiLnhzZCIpKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXJ2aWNlc0xpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgc2VydmljZSA9IChTZXJ2aWNlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgIGlmICghc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhzZXJ2aWNlTmFtZUZyb21GaWxlTmFtZSkpewotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24ucmVtb3ZlU2VydmljZShzZXJ2aWNlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgIHJlbW92ZWRTZXJ2aWNlcy5hZGQoc2VydmljZSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICAvL25vdyB3ZSBoYXZlIG9ubHkgdGhlIHJlcXVpcmVkIHNlcnZpY2Ugc28gd3JpdGUgaXQKLSAgICAgICAgICAgd3NkbFdyaXRlci53cml0ZVdTREwoZGVmaW5pdGlvbiwgb3V0KTsKLQotICAgICAgICAgICAvLyBhZ2FpbiBhZGQgdGhlIHJlbW92ZWQgc2VydmljZXMKLSAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFNlcnZpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIC8vIG5vIHByb2JsZW0gcHJvY2VlZCBub3JtYWx5Ci0gICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkICBwbGVhc2UgdXNlIGFkanVzdFdTRExTY2hlbWFMb2NhdGlvbnMKLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBjaGFuZ2VkU2NoZW1hTG9jYXRpb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRqdXN0V1NETFNjaGVtYUxvY2F0aW5zKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWFwIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpIHsKLSAgICAgICAgYWRqdXN0V1NETFNjaGVtYUxvY2F0aW9ucyhkZWZpbml0aW9uLCBjaGFuZ2VkU2NoZW1hTG9jYXRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGp1c3QgdGhlIHNjaGVtYSBsb2NhdGlvbnMgaW4gdGhlIG9yaWdpbmFsIHdzZGwKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHBhcmFtIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RXU0RMU2NoZW1hTG9jYXRpb25zKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWFwIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpIHsKLSAgICAgICAgVHlwZXMgd3NkbFR5cGVzID0gZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgICAgICBpZiAod3NkbFR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gd3NkbFR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgT2JqZWN0IGN1cnJlbnRPYmplY3Q7Ci0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGN1cnJlbnRPYmplY3QgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9iamVjdCBpbnN0YW5jZW9mIFNjaGVtYSkgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSAoU2NoZW1hKWN1cnJlbnRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZUxvY2F0aW9ucyhzY2hlbWEuZ2V0RWxlbWVudCgpLCBjaGFuZ2VkU2NoZW1hTG9jYXRpb25zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlTG9jYXRpb25zKEVsZW1lbnQgZWxlbWVudCwgTWFwIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpIHsKLSAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgU3RyaW5nIHRhZ05hbWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgdGFnTmFtZSA9IG5vZGVMaXN0Lml0ZW0oaSkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoSU1QT1JUX1RBRy5lcXVhbHModGFnTmFtZSkgfHwgSU5DTFVERV9UQUcuZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0ltcG9ydChub2RlTGlzdC5pdGVtKGkpLCBjaGFuZ2VkU2NoZW1hTG9jYXRpb25zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW1wb3J0KE5vZGUgaW1wb3J0Tm9kZSwgTWFwIGNoYW5nZWRTY2hlbWFMb2NhdGlvbnMpIHsKLSAgICAgICAgTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBpbXBvcnROb2RlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgTm9kZSBhdHRyaWJ1dGU7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5vZGVNYXAuaXRlbShpKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInNjaGVtYUxvY2F0aW9uIikpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZFNjaGVtYUxvY2F0aW9ucy5nZXQoYXR0cmlidXRlVmFsdWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLnNldE5vZGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKWNoYW5nZWRTY2hlbWFMb2NhdGlvbnMuZ2V0KGF0dHJpYnV0ZVZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9XU0RMMjBXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3dyaXRlci9XU0RMMjBXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkOTQ3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi93cml0ZXIvV1NETDIwV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLndyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkZpbGVXcml0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgV1NETDIwV3JpdGVyIHsKLSAgICBwcml2YXRlIEZpbGUgYmFzZUZvbGRlciA9IG51bGw7Ci0KLQotICAgIHB1YmxpYyBXU0RMMjBXcml0ZXIoRmlsZSBiYXNlRm9sZGVyKSB7Ci0gICAgICAgIHRoaXMuYmFzZUZvbGRlciA9IGJhc2VGb2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVXU0RMKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vY3JlYXRlIGEgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBGaWxlV3JpdGVyLmNyZWF0ZUNsYXNzRmlsZShiYXNlRm9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIud3NkbCIpOwotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UucHJpbnRXU0RMMihmb3MpOwotICAgICAgICAgICAgICAgIGZvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldTREwgd3JpdGluZyBmYWlsZWQhIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0NEZWZhdWx0VHlwZU1hcHBlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0NEZWZhdWx0VHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlZjczZWEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9DRGVmYXVsdFR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIENEZWZhdWx0VHlwZU1hcHBlciBleHRlbmRzIFR5cGVNYXBwaW5nQWRhcHRlciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFN0cnVjdE5hbWUgPSAiYXhpb21fbm9kZV90KiI7Ci0KLSAgICBwdWJsaWMgQ0RlZmF1bHRUeXBlTWFwcGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgbWFwcGluZyBuYW1lLiBhbHdheXMgcmV0dXJucyB0aGUgZGVmYXVsdCBtYXBwaW5nCi0gICAgICoKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjZ2V0VHlwZU1hcHBpbmdOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlTWFwcGluZ05hbWUoUU5hbWUgcW5hbWUpIHsKLQotICAgICAgICBpZiAoKHFuYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFN0cnVjdE5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0NUeXBlTWFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ1R5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhZWUxNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ1R5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBDVHlwZU1hcHBlciBleHRlbmRzIFR5cGVNYXBwaW5nQWRhcHRlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0U3RydWN0TmFtZSA9ICJheGlvbV9ub2RlX3QqIjsKLQotICAgIHB1YmxpYyBDVHlwZU1hcHBlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVNYXBwaW5nTmFtZShRTmFtZSBxbmFtZSkgewotCi0gICAgICAgIGlmICgocW5hbWUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gcU5hbWUyTmFtZU1hcC5nZXQocW5hbWUpOwotICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKW87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5YU0RfQU5ZVFlQRS5lcXVhbHMocW5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5YU0RfQU5ZLmVxdWFscyhxbmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFN0cnVjdE5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImRhdGFiaW5kaW5nLnR5cGVtYXBwZXIudHlwZXVubWF0Y2hlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdFN0cnVjdE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1hcHBpbmdOYW1lKFN0cmluZyBkZWZhdWx0TWFwcGluZykgewotICAgICAgICB0aGlzLmRlZmF1bHRTdHJ1Y3ROYW1lID0gZGVmYXVsdE1hcHBpbmc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ1V0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvQ1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjQ0OTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgQ1V0aWxzIHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5d29yZHNbXSA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGMvIGMrKyBrZXl3b3JkcwotICAgICAgICAgICAgICAgICAgICAiYXNtIiwgImF1dG8iLCAiYm9vbCIsICJicmVhayIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgImNoYXIiLCAiY2xhc3MiLCAiY29uc3QiLCAiY29uc3RfY2FzdCIsCi0gICAgICAgICAgICAgICAgICAgICJjb250aW51ZSIsICJkZWZhdWx0IiwgImRlbGV0ZSIsICJkbyIsICJkb3VibGUiLCAiZHluYW1pY19jYXN0IiwgImVsc2UiLCAiZW51bSIsICJleHBsaWNpdCIsCi0gICAgICAgICAgICAgICAgICAgICJleHBvcnQiLCAiZXh0ZXJuIiwgImZhbHNlIiwgImZsb2F0IiwgImZvciIsICJmcmllbmQiLCAiZ290byIsICJpZiIsICJpbmxpbmUiLCAiaW50IiwgImxvbmciLAotICAgICAgICAgICAgICAgICAgICAibXV0YWJsZSIsICJuYW1lc3BhY2UiLCAibmV3IiwgIm9wZXJhdG9yIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJyZWdpc3RlciIsCi0gICAgICAgICAgICAgICAgICAgICJyZWludGVycHJldF9jYXN0IiwgInJldHVybiIsICJzaG9ydCIsICJzaWduZWQiLCAic2l6ZW9mIiwgInN0YXRpYyIsICJzdGF0aWNfY2FzdCIsICJzdHJ1Y3QiLAotICAgICAgICAgICAgICAgICAgICAic3dpdGNoIiwgInRlbXBsYXRlIiwgInRoaXMiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAidHlwZWRlZiIsICJ0eXBlaWQiLCAidHlwZW5hbWUiLCAidW5pb24iLAotICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQiLCAidXNpbmciLCAidmlydHVhbCIsICJ2b2lkIiwgInZvbGF0aWxlIiwgIndjaGFyX3QiLCAid2hpbGUiLAotCi0gICAgICAgICAgICAgICAgICAgIC8vbWljcm9zb2Z0IGMrKyBrZXl3b3JkcyByZWZlcmVuY2U6IGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLVVTL2xpYnJhcnkvMmU2YTRhdDkoVlMuODApLmFzcHgKLSAgICAgICAgICAgICAgICAgICAgIl9fYWJzdHJhY3QiLCAiYWJzdHJhY3QiLCAiX19hbGlnbm9mIE9wZXJhdG9yIiwgImFycmF5IiwgIl9fYXNtIiwgIl9fYXNzdW1lIiwgIl9fYmFzZWQiLCAiYm9vbCIsCi0gICAgICAgICAgICAgICAgICAgICJfX2JveCIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgIl9fY2RlY2wiLCAiY2hhciIsICJjbGFzcyIsICJjb25zdCIsICJjb25zdF9jYXN0IiwgImNvbnRpbnVlIiwKLSAgICAgICAgICAgICAgICAgICAgIl9fZGVjbHNwZWMiLCAiZGVmYXVsdCIsICJfX2RlbGVnYXRlIiwgImRlbGVnYXRlIiwgImRlbGV0ZSIsICJkZXByZWNhdGVkIiwgImRsbGV4cG9ydCIsICJkbGxpbXBvcnQiLAotICAgICAgICAgICAgICAgICAgICAiZG8iLCAiZG91YmxlIiwgImR5bmFtaWNfY2FzdCIsICJlbHNlIiwgImVudW0iLCAiZW51bSBjbGFzcyIsICJlbnVtIHN0cnVjdCIsICJldmVudCIsICJfX2V2ZW50IiwKLSAgICAgICAgICAgICAgICAgICAgIl9fZXhjZXB0IiwgImV4cGxpY2l0IiwgImV4dGVybiIsICJmYWxzZSIsICJfX2Zhc3RjYWxsIiwgIl9fZmluYWxseSIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0gICAgICAgICAgICAgICAgICAgICJmb3IgZWFjaCIsICJpbiIsICJfX2ZvcmNlaW5saW5lIiwgImZyaWVuZCIsICJmcmllbmRfYXMiLCAiX19nYyIsICJnY25ldyIsICJnZW5lcmljIiwgImdvdG8iLAotICAgICAgICAgICAgICAgICAgICAiX19ob29rIiwgIl9faWRlbnRpZmllciIsICJpZiIsICJfX2lmX2V4aXN0cyIsICJfX2lmX25vdF9leGlzdHMiLCAiaW5pdG9ubHkiLCAiX19pbmxpbmUiLCAiaW5saW5lIiwKLSAgICAgICAgICAgICAgICAgICAgImludCIsICJfX2ludDgiLCAiX19pbnQxNiIsICJfX2ludDMyIiwgIl9faW50NjQiLCAiX19pbnRlcmZhY2UiLCAiaW50ZXJmYWNlIGNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZSBzdHJ1Y3QiLCAiaW50ZXJpb3JfcHRyIiwgIl9fbGVhdmUiLCAibGl0ZXJhbCIsICJsb25nIiwgIl9fbTY0IiwgIl9fbTEyOCIsICJfX20xMjhkIiwKLSAgICAgICAgICAgICAgICAgICAgIl9fbTEyOGkiLCAiX19tdWx0aXBsZV9pbmhlcml0YW5jZSIsICJtdXRhYmxlIiwgIm5ha2VkIiwgIm5hbWVzcGFjZSIsICJuZXciLCAibmV3IiwgIl9fbm9nYyIsCi0gICAgICAgICAgICAgICAgICAgICJub2lubGluZSIsICJfX25vb3AiLCAibm9yZXR1cm4iLCAibm90aHJvdyIsICJub3Z0YWJsZSIsICJudWxscHRyIiwgIm9wZXJhdG9yIiwgIl9fcGluIiwgInByaXZhdGUiLAotICAgICAgICAgICAgICAgICAgICAiX19wcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgIl9fcmFpc2UiLCAicmVmIHN0cnVjdCIsICJyZWYgY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXIiLCAicmVpbnRlcnByZXRfY2FzdCIsICJyZXR1cm4iLCAic2FmZWNhc3QiLCAiX19zZWFsZWQiLCAic2VhbGVkIiwgInNlbGVjdGFueSIsICJzaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICJzaWduZWQiLCAiX19zaW5nbGVfaW5oZXJpdGFuY2UiLCAic2l6ZW9mIiwgInN0YXRpYyIsICJzdGF0aWNfY2FzdCIsICJfX3N0ZGNhbGwiLCAic3RydWN0IiwKLSAgICAgICAgICAgICAgICAgICAgIl9fc3VwZXIiLCAic3dpdGNoIiwgInRlbXBsYXRlIiwgInRoaXMiLCAidGhyZWFkIiwgInRocm93IiwgInRydWUiLCAidHJ5IiwgIl9fdHJ5L19fZXhjZXB0IiwKLSAgICAgICAgICAgICAgICAgICAgIl9fdHJ5L19fZmluYWxseSIsICJfX3RyeV9jYXN0IiwgInR5cGVkZWYiLCAidHlwZWlkIiwgInR5cGVpZCIsICJ0eXBlbmFtZSIsICJfX3VuYWxpZ25lZCIsCi0gICAgICAgICAgICAgICAgICAgICJfX3VuaG9vayIsICJ1bmlvbiIsICJ1bnNpZ25lZCIsICJ1c2luZyBkZWNsYXJhdGlvbiIsICJ1c2luZyBkaXJlY3RpdmUiLCAidXVpZCIsICJfX3V1aWRvZiIsCi0gICAgICAgICAgICAgICAgICAgICJ2YWx1ZSBzdHJ1Y3QiLCAidmFsdWUgY2xhc3MiLCAiX192YWx1ZSIsICJ2aXJ0dWFsIiwgIl9fdmlydHVhbF9pbmhlcml0YW5jZSIsICJ2b2lkIiwgInZvbGF0aWxlIiwKLSAgICAgICAgICAgICAgICAgICAgIl9fdzY0IiwgIl9fd2NoYXJfdCIsICJ3Y2hhcl90IiwgIndoaWxlIiwKLSAgICAgICAgICAgIH07Ci0KLSAgICAvKiogQ29sbGF0b3IgZm9yIGNvbXBhcmluZyB0aGUgc3RyaW5ncyAqLwotICAgIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBlbmdsaXNoQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLSAgICAvKiogVXNlIHRoaXMgY2hhcmFjdGVyIGFzIHN1ZmZpeCAqLwotICAgIHN0YXRpYyBmaW5hbCBjaGFyIGtleXdvcmRQcmVmaXggPSAnXyc7Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgdmFsaWQgQyBrZXl3b3JkLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ0tleXdvcmQoU3RyaW5nIGtleXdvcmQpIHsKLSAgICAgICAgcmV0dXJuIChBcnJheXMuYmluYXJ5U2VhcmNoKGtleXdvcmRzLCBrZXl3b3JkLCBlbmdsaXNoQ29sbGF0b3IpID49IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR1cm5zIGEgQyBrZXl3b3JkIHN0cmluZyBpbnRvIGEgbm9uLUMga2V5d29yZCBzdHJpbmcuICAoUmlnaHQgbm93IHRoaXMgc2ltcGx5IG1lYW5zIGFwcGVuZGluZwotICAgICAqIGFuIHVuZGVyc2NvcmUuKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VOb25DS2V5d29yZChTdHJpbmcga2V5d29yZCkgewotICAgICAgICByZXR1cm4ga2V5d29yZFByZWZpeCArIGtleXdvcmQgOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvRGVmYXVsdFR5cGVNYXBwZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9EZWZhdWx0VHlwZU1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdjZmQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9EZWZhdWx0VHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKiBUaGUgZGVmYXVsdCB0eXBlIG1hcHBlci4gVGhpcyB0eXBlIG1hcHBlciBoYXMgbm8gZGVmYXVsdCBjb25maWd1cmF0aW9ucyAqLwotcHVibGljIGNsYXNzIERlZmF1bHRUeXBlTWFwcGVyIGV4dGVuZHMgVHlwZU1hcHBpbmdBZGFwdGVyIHsKLQotICAgIHB1YmxpYyBEZWZhdWx0VHlwZU1hcHBlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG1hcHBpbmcgbmFtZS4gYWx3YXlzIHJldHVybnMgdGhlIGRlZmF1bHQgbWFwcGluZwotICAgICAqCi0gICAgICogQHNlZSBUeXBlTWFwcGVyI2dldFR5cGVNYXBwaW5nTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU1hcHBpbmdOYW1lKFFOYW1lIHFuYW1lKSB7Ci0KLSAgICAgICAgaWYgKChxbmFtZSAhPSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGFzc05hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL0phdmFUeXBlTWFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvSmF2YVR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ZjE4Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvSmF2YVR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nOwotCi0KLS8qKgotICogVGhlIGphdmEgdHlwZSBtYXBwZXIgY2FuIGRvIHdpdGhvdXQgYW55IGRlZmF1bHQgY29uZmlndXJhdGlvbiBIb3dldmVyIGlmIGFueSBzdWNoIGRlZmF1bHQgdHlwZQotICogbWFwcGluZ3MgYXJlIG5lZWRlZCwgdGhleSBjYW4gYmUgcHV0IGluc2lkZSB0aGUgY29uc3RydWN0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFUeXBlTWFwcGVyIGV4dGVuZHMgVHlwZU1hcHBpbmdBZGFwdGVyIHsKLQotICAgIHB1YmxpYyBKYXZhVHlwZU1hcHBlcigpIHsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1R5cGVNYXBwZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9UeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjFiMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2RhdGFiaW5kaW5nL1R5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGludGVyZmFjZSBUeXBlTWFwcGVyIHsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBtYXBwaW5nIGlzIHRoZSBvYmplY3QgdHlwZSBvciB0aGUgbm9ybWFsIGNsYXNzIG5hbWUgdHlwZQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPYmplY3RNYXBwaW5nUHJlc2VudCgpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBtYXBwaW5nIGNsYXNzIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUgbmFtZSBvZiB0aGUgWE1MIGVsZW1lbnQgdG8gYmUgbWFwcGVkCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgcGFydGljdWxhciB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU1hcHBpbmdOYW1lKFFOYW1lIHFuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgbWFwcGluZyBPYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUgbmFtZSBvZiB0aGUgWE1MIGVsZW1lbnQgdG8gYmUgbWFwcGVkCi0gICAgICogQHJldHVybiBSZXR1cm5zIGFuIE9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnRpY3VsYXIgY2xhc3MgaW4gYSBwcmUgc3BlY2lmaWVkIGZvcm0uIEl0Ci0gICAgICogICAgICAgICBjYW4gYmUgYSBzcGVjaWZpYyBmb3JtYXQgdG8gdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yayB1c2VkLiBUaGlzIGFsbG93cyB0aWdodAotICAgICAqICAgICAgICAgaW50ZWdyYXRpb25zIHdpdGggdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yaywgYWxsb3dpbmcgdGhlIGVtaXR0ZXIgdG8gd3JpdGUgdGhlCi0gICAgICogICAgICAgICBkYXRhYmluZGluZyBjbGFzc2VzIGluIGl0cyBvd24gd2F5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VHlwZU1hcHBpbmdPYmplY3QoUU5hbWUgcW5hbWUpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRRTmFtZVRvTWFwcGluZ09iamVjdChRTmFtZSBxbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZSBuYW1lIG9mIHRoZSBYTUwgZWxlbWVudCB0byBnZXQgYSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYSB1bmlxdWUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKFFOYW1lIHFuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEFkZHMgYSB0eXBlIG1hcHBpbmcgbmFtZSB0byB0aGUgdHlwZSBtYXBwZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAc2VlICNnZXRUeXBlTWFwcGluZ05hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUeXBlTWFwcGluZ05hbWUoUU5hbWUgcW5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgdHlwZSBtYXBwaW5nIG9iamVjdCB0byB0aGUgdHlwZSBtYXBwZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUgdGhlIHhtbCBRbmFtZSB0aGF0IHRoaXMgdHlwZSByZWZlcnMgdG8KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHR5cGUgbWFwcGluZyBvYmplY3QKLSAgICAgKiBAc2VlICNnZXRUeXBlTWFwcGluZ09iamVjdChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVNYXBwaW5nT2JqZWN0KFFOYW1lIHFuYW1lLCBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyBhIG1hcCBjb250YWluaW5nIGFsbCB0eXBlIG1hcHBpbmcgbmFtZXMgaS5lLiBRbmFtZSB0byAgY2xhc3NuYW1lICovCi0gICAgcHVibGljIE1hcCBnZXRBbGxNYXBwZWROYW1lcygpOwotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyBhIG1hcCBjb250YWluaW5nIGFsbCB0eXBlIG1hcHBpbmcgbW9kZWwgb2JqZWN0cyBpLmUuIFFuYW1lIHRvIG1vZGVsIG9iamVjdHMgKi8KLSAgICBwdWJsaWMgTWFwIGdldEFsbE1hcHBlZE9iamVjdHMoKTsKLQotICAgIC8qKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG1hcHBpbmcgbmFtZSBmb3IgdGhpcyB0eXBlIG1hcHBlciAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHR5cGUgbWFwcGluZyAtIHRoZSBkYXRhYmluZGVycyBtYXkgY2hhbmdlIHRoZSBkZWZhdWx0IG1hcHBpbmcgdG8gc3VpdCB0aGVpcgotICAgICAqIGRlZmF1bHQgbWFwcGluZwotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmF1bHRNYXBwaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdE1hcHBpbmdOYW1lKFN0cmluZyBkZWZhdWx0TWFwcGluZyk7Ci0KLQotICAgIC8qKgotICAgICAqIEFsbG93cyB0aGUgc3RvcmFnZSBvZiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBhIG1hcHBpbmcgdG8gdGhlIHFuYW1lLiBUaGlzIG1heSBiZSB1c2VkIHRvIHN0b3JlCi0gICAgICogY2VydGFpbiBzdGF0dXMgaW5mb3JtYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgYnkgZGlmZmVyZW50IHR5cGUgbWFwcGVycy4gQSBnaXZlbiB0eXBlIG1hcHBlcgotICAgICAqIG1heSBjaG9vc2Ugbm90IHRvIGltcGxlbWVudCB0aGlzIQotICAgICAqCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHBhcmFtIHN0YXR1cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVNYXBwaW5nU3RhdHVzKFFOYW1lIHFOYW1lLCBPYmplY3Qgc3RhdHVzKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlbGV2YW50IHN0YXR1cyBvYmplY3QgZ2l2ZW4gdGhlIHFOYW1lIG9mIHRoZSB4bWwgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiB0aGUgc3RhdHVzIG9iamVjdAotICAgICAqIEBzZWUgI2FkZFR5cGVNYXBwaW5nU3RhdHVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFR5cGVNYXBwaW5nU3RhdHVzKFFOYW1lIHFOYW1lKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9UeXBlTWFwcGluZ0FkYXB0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9UeXBlTWFwcGluZ0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZTFkMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvVHlwZU1hcHBpbmdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bi5Db2RlZ2VuTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVNYXBwaW5nQWRhcHRlciBpbXBsZW1lbnRzIFR5cGVNYXBwZXIgewotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjbGFzcyBuYW1lIGlzIHRoZSBPTUVsZW1lbnQgb3IgdGhlIGRlZmF1bHQgY2FzZSBIb3dldmVyIHRoZSBleHRlbnNpb25zIGNhbiBvdmVycmlkZQotICAgICAqIHRoZSBkZWZhdWx0IGNsYXNzIHRvIHN1aXQgdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yayEKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDbGFzc05hbWUgPSBPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX1NDSEVNQV9VUkwgPSBDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRDsKLQotICAgIC8vaGFzaG1hcCB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlIG1hcHBpbmcgbmFtZXMKLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBxTmFtZTJOYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8vaGFzaG1hcCB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlIG1hcHBpbmcgb2JqZWN0cwotICAgIHByb3RlY3RlZCBIYXNoTWFwIHFOYW1lMk9iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvL2hhc2htYXAgZm9yIGtlZXBpbmcgdGhlIHN0YXR1cyBvYmplY3RzLgotICAgIHByb3RlY3RlZCBIYXNoTWFwIHFOYW1lMlN0YXR1c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvL2NvdW50ZXIgdmFyaWFibGUgdG8gZ2VuZXJhdGUgdW5pcXVlIHBhcmFtZXRlciBJRCdzCi0gICAgcHJvdGVjdGVkIGludCBjb3VudGVyID0gMDsKLQotICAgIC8vIHRoaXMgaXMgdG8ga2VlcCBnZW5lcmF0ZWQgcGFyYW1ldGVyIG5hbWVzCi0gICAgcHJvdGVjdGVkIExpc3QgcGFyYW1ldGVyTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc09iamVjdCA9IGZhbHNlOwotCi0gICAgLy9VcHBlciBsaW1pdCBmb3IgdGhlIHBhcmFtZXRlIGNvdW50Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVVBQRVJfUEFSQU1fTElNSVQgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTkFNRV9TVUZGSVggPSAicGFyYW0iOwotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG1hcHBpbmcgbmFtZS4gSWYgdHlwZSBtYXBwaW5nIGlzIG5vdCBmb3VuZCwgcmV0dXJucyBkZWZhdWx0LgotICAgICAqCi0gICAgICogQHNlZSBUeXBlTWFwcGVyI2dldFR5cGVNYXBwaW5nTmFtZShqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU1hcHBpbmdOYW1lKFFOYW1lIHFuYW1lKSB7Ci0KLSAgICAgICAgaWYgKChxbmFtZSAhPSBudWxsKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBxTmFtZTJOYW1lTWFwLmdldChxbmFtZSk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpbzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlhTRF9BTllUWVBFLmVxdWFscyhxbmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlhTRF9BTlkuZXF1YWxzKHFuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q2xhc3NOYW1lOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuWFNEX1NUUklORy5lcXVhbHMocW5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoImRhdGFiaW5kaW5nLnR5cGVtYXBwZXIudHlwZXVubWF0Y2hlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvKiogQHNlZSBUeXBlTWFwcGVyI2dldFBhcmFtZXRlck5hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgaWYgKGNvdW50ZXIgPT0gVVBQRVJfUEFSQU1fTElNSVQpIHsKLSAgICAgICAgICAgIGNvdW50ZXIgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocW5hbWUgIT0gbnVsbCkgJiYgKHFuYW1lLmdldExvY2FsUGFydCgpLmxlbmd0aCgpICE9IDApKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1OYW1lID0gSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5hbWVMaXN0LmNvbnRhaW5zKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBwYXJhbU5hbWUgKyBjb3VudGVyKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbWV0ZXJOYW1lTGlzdC5hZGQocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbU5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gUEFSQU1FVEVSX05BTUVfU1VGRklYICsgY291bnRlcisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgVHlwZU1hcHBlciNhZGRUeXBlTWFwcGluZ05hbWUoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSxTdHJpbmcpICovCi0gICAgcHVibGljIHZvaWQgYWRkVHlwZU1hcHBpbmdOYW1lKFFOYW1lIHFuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcU5hbWUyTmFtZU1hcC5wdXQocW5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgb2JqZWN0IHJlcHJlc2VudGluZyBhIHNwZWNpZmljIGZvcm0gb2YgdGhlIFhTRCBjb21waWxhdGlvbi4KLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjZ2V0VHlwZU1hcHBpbmdPYmplY3QoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFR5cGVNYXBwaW5nT2JqZWN0KFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBxTmFtZTJPYmplY3RNYXAuZ2V0KHFuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoaXMgUU5hbWUKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKiBAcmV0dXJuIHJldHVybiBjbGFzcyBuYW1lcwotICAgICAqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXRRTmFtZVRvTWFwcGluZ09iamVjdChRTmFtZSBxbmFtZSl7Ci0gICAgICAgIHJldHVybiBxTmFtZTJOYW1lTWFwLmdldChxbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHNlZSBUeXBlTWFwcGVyI2FkZFR5cGVNYXBwaW5nT2JqZWN0KGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUeXBlTWFwcGluZ09iamVjdChRTmFtZSBxbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlzT2JqZWN0ID0gdHJ1ZTsKLSAgICAgICAgcU5hbWUyT2JqZWN0TWFwLnB1dChxbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqIEBzZWUgVHlwZU1hcHBlciNpc09iamVjdE1hcHBpbmdQcmVzZW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdE1hcHBpbmdQcmVzZW50KCkgewotICAgICAgICByZXR1cm4gaXNPYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgVHlwZU1hcHBlciNnZXRBbGxNYXBwZWROYW1lcygpICovCi0gICAgcHVibGljIE1hcCBnZXRBbGxNYXBwZWROYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lMk5hbWVNYXA7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgVHlwZU1hcHBlciNnZXRBbGxNYXBwZWRPYmplY3RzKCkgKi8KLSAgICBwdWJsaWMgTWFwIGdldEFsbE1hcHBlZE9iamVjdHMoKSB7Ci0gICAgICAgIHJldHVybiBxTmFtZTJPYmplY3RNYXA7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgVHlwZU1hcHBlciNnZXREZWZhdWx0TWFwcGluZ05hbWUoKSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdOYW1lKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE1hcHBpbmcKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjc2V0RGVmYXVsdE1hcHBpbmdOYW1lKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWFwcGluZ05hbWUoU3RyaW5nIGRlZmF1bHRNYXBwaW5nKSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdENsYXNzTmFtZSA9IGRlZmF1bHRNYXBwaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBzdGF0dXMKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjYWRkVHlwZU1hcHBpbmdTdGF0dXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGVNYXBwaW5nU3RhdHVzKFFOYW1lIHFOYW1lLCBPYmplY3Qgc3RhdHVzKSB7Ci0gICAgICAgIHRoaXMucU5hbWUyU3RhdHVzTWFwLnB1dChxTmFtZSwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAc2VlIFR5cGVNYXBwZXIjZ2V0VHlwZU1hcHBpbmdTdGF0dXMoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFR5cGVNYXBwaW5nU3RhdHVzKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnFOYW1lMlN0YXR1c01hcC5nZXQocU5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9Vbm1hdGNoZWRUeXBlRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvZGF0YWJpbmRpbmcvVW5tYXRjaGVkVHlwZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjI3MWZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9kYXRhYmluZGluZy9Vbm1hdGNoZWRUeXBlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZzsKLQotLyoqIEEgc2ltcGxlIGV4Y2VwdGlvbiB0aGF0IHdpbGwgYmUgdGhyb3duIGlmIGEgdHlwZSBpcyBub3QgbWF0Y2hlZCEgKi8KLXB1YmxpYyBjbGFzcyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgVW5tYXRjaGVkVHlwZUV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVW5tYXRjaGVkVHlwZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVW5tYXRjaGVkVHlwZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbm1hdGNoZWRUeXBlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9pMThuL0NvZGVnZW5NZXNzYWdlcy5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2kxOG4vQ29kZWdlbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTRhMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL2kxOG4vQ29kZWdlbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuaTE4bjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlQnVuZGxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlc0NvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXMgVGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIGJ1dCBqdXN0IHRoaXNDbGFzcyBzdGF0aWMKLSAqICAgICAgcmVmZXJlbmNlIGhhcyBDb2RlZ2VuTWVzc2FnZXMuY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIENvZGVnZW5NZXNzYWdlcyB7Ci0KLSAgICAvL09ubHkgdGhpcyBjaGFuZ2VzIGZyb20gdGhlIG9yaWdpbmFsIGNsYXNzCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdGhpc0NsYXNzID0gQ29kZWdlbk1lc3NhZ2VzLmNsYXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gTWVzc2FnZXNDb25zdGFudHMucHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gTWVzc2FnZXNDb25zdGFudHMucmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBNZXNzYWdlc0NvbnN0YW50cy5sb2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlKHRoaXNDbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQgPQotICAgICAgICAgICAgKE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RQYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKQotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBNZXNzYWdlc0NvbnN0YW50cy5yb290QnVuZGxlOwotCi0KLSAgICAvKiogKiogTk8gTkVFRCBUTyBDSEFOR0UgQU5ZVEhJTkcgQkVMT1cgKioqKiAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0KLSAgICAgICAgICAgIG5ldyBNZXNzYWdlQnVuZGxlKHByb2plY3ROYW1lLCBwYWNrYWdlTmFtZSwgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLCBjbGFzc0xvYWRlciwgcGFyZW50KTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezR9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUJ1bmRsZSBnZXRNZXNzYWdlQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZignLicpKS5pbnRlcm4oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDc0MGQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMgV1NETDJDb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi13c2RsMmNvZGUuYXJnPVVzYWdlOiBXU0RMMkphdmEgW29wdGlvbnNdIC11cmkgPHVybCBvciBwYXRoPiA6IEEgdXJsIG9yIHBhdGggdG8gYSBXU0RMCi13c2RsMmNvZGUuYXJnMT1cbndoZXJlIFtvcHRpb25zXSBpbmNsdWRlOgotd3NkbDJjb2RlLmFyZzI9ICAtbyA8cGF0aD4gICAgICAgICAgICAgICAgU3BlY2lmeSBhIGRpcmVjdG9yeSBwYXRoIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCi13c2RsMmNvZGUuYXJnMz0gIC1hICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhc3luYyBzdHlsZSBjb2RlIG9ubHkgKERlZmF1bHQ6IG9mZikuCi13c2RsMmNvZGUuYXJnND0gIC1zICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBzeW5jIHN0eWxlIGNvZGUgb25seSAoRGVmYXVsdDogb2ZmKS4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIC1hLgotd3NkbDJjb2RlLmFyZzU9ICAtcCA8cGtnMT4gICAgICAgICAgICAgICAgU3BlY2lmeSBhIGN1c3RvbSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KLXdzZGwyY29kZS5hcmc2PSAgLWwgPGxhbmd1YWdlPiAgICAgICAgICAgIFZhbGlkIGxhbmd1YWdlcyBhcmUgamF2YSBhbmQgYyAoRGVmYXVsdDogamF2YSkuCi13c2RsMmNvZGUuYXJnNz0gIC10ICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIHRlc3QgY2FzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLgotd3NkbDJjb2RlLmFyZzg9ICAtc3MgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgc2VydmVyIHNpZGUgY29kZSAoaS5lLiBza2VsZXRvbnMpIChEZWZhdWx0OiBvZmYpLgotd3NkbDJjb2RlLmFyZzk9ICAtc2QgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgc2VydmljZSBkZXNjcmlwdG9yIChpLmUuIHNlcnZpY2VzLnhtbCkuIChEZWZhdWx0OiBvZmYpLiBWYWxpZCB3aXRoIC1zcy4KLXdzZGwyY29kZS5hcmcxMD0gIC1kIDxkYXRhYmluZGluZz4gICAgICAgICBWYWxpZCBkYXRhYmluZGluZyhzKSBhcmUgYWRiLCB4bWxiZWFucywgamlieCBhbmQgamF4YnJpIChEZWZhdWx0OiBhZGIpLgotd3NkbDJjb2RlLmFyZzExPSAgLWcgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlcyBhbGwgdGhlIGNsYXNzZXMuIFZhbGlkIG9ubHkgd2l0aCAtc3MuCi13c2RsMmNvZGUuYXJnMTI9ICAtcG4gPHBvcnRfbmFtZT4gICAgICAgICAgQ2hvb3NlIGEgc3BlY2lmaWMgcG9ydCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3J0cyBpbiB0aGUgd3NkbC4KLXdzZGwyY29kZS5hcmcxMz0gIC1zbiA8c2VydmljZV9uYW1lPiAgICAgICBDaG9vc2UgYSBzcGVjaWZpYyBzZXJ2aWNlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHNlcnZpY2VzIGluIHRoZSB3c2RsLgotd3NkbDJjb2RlLmFyZzE0PSAgLXUgICAgICAgICAgICAgICAgICAgICAgIFVucGFja3MgdGhlIGRhdGFiaW5kaW5nIGNsYXNzZXMKLXdzZGwyY29kZS5hcmcxNT0gIC1yIDxwYXRoPiAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgcmVwb3NpdG9yeSBhZ2FpbnN0IHdoaWNoIGNvZGUgaXMgZ2VuZXJhdGVkLgotd3NkbDJjb2RlLmFyZzE2PSAgLW5zMnAgbnMxPXBrZzEsbnMyPXBrZzIgIFNwZWNpZnkgYSBjdXN0b20gcGFja2FnZSBuYW1lIGZvciBlYWNoIG5hbWVzcGFjZSBzcGVjaWZpZWQgaW4gdGhlIHdzZGwncyBzY2hlbWEuCi13c2RsMmNvZGUuYXJnMTc9ICAtc3NpICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiAoRGVmYXVsdDogb2ZmKS4KLXdzZGwyY29kZS5hcmcxOD0gIC13diA8dmVyc2lvbj4gICAgICAgICAgICBXU0RMIFZlcnNpb24uIFZhbGlkIE9wdGlvbnMgOiAyLCAyLjAsIDEuMQotd3NkbDJjb2RlLmFyZzE5PSAgLVMgPHBhdGg+ICAgICAgICAgICAgICAgIFNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHNvdXJjZQotd3NkbDJjb2RlLmFyZzIwPSAgLVIgPHBhdGg+ICAgICAgICAgICAgICAgIFNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHJlc291cmNlcwotd3NkbDJjb2RlLmFyZzIxPSAgLWVtIDxmaWxlIHBhdGg+ICAgICAgICAgIFNwZWNpZnkgYW4gZXh0ZXJuYWwgbWFwcGluZyBmaWxlCi13c2RsMmNvZGUuYXJnMjI9ICAtZiAgICAgICAgICAgICAgICAgICAgICAgRmxhdHRlbnMgdGhlIGdlbmVyYXRlZCBmaWxlcwotd3NkbDJjb2RlLmFyZzIzPSAgLXV3ICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaCBvbiB1bi13cmFwcGluZy4KLXdzZGwyY29kZS5hcmcyND0gIC14c2Rjb25maWcgPGZpbGUgcGF0aD4gICBVc2UgWE1MQmVhbnMgLnhzZGNvbmZpZyBmaWxlLiBWYWxpZCBvbmx5IHdpdGggLWQgeG1sYmVhbnMuCi13c2RsMmNvZGUuYXJnMjU9ICAtYXAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgYWxsIHBvcnRzCi13c2RsMmNvZGUuYXJnMjY9ICAtb3IgICAgICAgICAgICAgICAgICAgICAgT3ZlcndyaXRlIHRoZSBleGlzdGluZyBjbGFzc2VzCi13c2RsMmNvZGUuYXJnMjc9ICAtYiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgQXhpcyAxLnggYmFja3dhcmQgY29tcGF0aWJsZSBjb2RlLgotd3NkbDJjb2RlLmFyZzI4PSAgLXNwICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzIG5hbWVzcGFjZSBwcmVmaXhlcyAoT3B0aW16YXRpb24gdGhhdCByZWR1Y2VzIHNpemUgb2Ygc29hcCByZXF1ZXN0L3Jlc3BvbnNlKQotd3NkbDJjb2RlLmFyZzI5PSAgLUU8a2V5PiA8dmFsdWU+ICAgICAgICAgIEV4dHJhIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzcGVjaWZpYyB0byBjZXJ0YWluIGRhdGFiaW5kaW5ncy4gRXhhbXBsZXM6Ci13c2RsMmNvZGUuYXJnMzA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcdFx0ICAgLUViaW5kaW5nZmlsZSA8cGF0aD4gICAgICAgICAgICAgICAgICAgKGZvciBqaWJ4KSAtIHNwZWNpZnkgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGJpbmRpbmcgZmlsZQotd3NkbDJjb2RlLmFyZzMxPSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdCAgIC1FdHlwZXN5c3RlbW5hbWUgPG15X3R5cGVfc3lzdGVtX25hbWU+IChmb3IgeG1sYmVhbnMpIC0gb3ZlcnJpZGUgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCB0eXBlIHN5c3RlbSBuYW1lCi13c2RsMmNvZGUuYXJnMzI9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcdFx0ICAgLUVqYXZhdmVyc2lvbiAxLjUgICAgICAgICAgICAgICAgICAgICAgKGZvciB4bWxiZWFucykgLSBnZW5lcmF0ZXMgSmF2YSAxLjUgY29kZSAodHlwZWQgbGlzdHMgaW5zdGVhZCBvZiBhcnJheXMpIAotd3NkbDJjb2RlLmFyZzMzPSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdCAgIC1FbXAgPHBhY2thZ2UgbmFtZT4gKGZvciBBREIpIC0gZXh0ZW5zaW9uIG1hcHBlciBwYWNrYWdlIG5hbWUKLXdzZGwyY29kZS5hcmczND0gICAgICAgICAgICAgICAgICAgICAgICAgICBcdFx0XHQgICAtRW9zdiAoZm9yIEFEQikgLSB0dXJuIG9mZiBzdHJpY3QgdmFsaWRhdGlvbi4KLXdzZGwyY29kZS5hcmczNT0gICAgICAgICAgICAgICAgICAgICAgICAgICBcdFx0XHQgICAtRXdkYyAoZm9yIHhtbGJlYW5zKSAtIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR1bW15IHNjaGVtYS4gaWYgc29tZW9uZSB1c2UgdGhpcyBvcHRpb24KLXdzZGwyY29kZS5hcmczNj0gICAgICAgICAgICAgICAgICAgICAgICAgICBcdFx0XHQgICAgICB0aGV5IGhhdmUgdG8gZ2VuZXJhdGUgdGhlIHhtbGJlYW5zIGNvZGUgc2VwZXJhdGVseSB3aXRoIHRoZSBzY29tcCBjb21tYW5kIGNvbWVzIHdpdGggdGhlCi13c2RsMmNvZGUuYXJnMzc9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHRcdFx0ICAgICAgeG1sYmVhbnMgZGlzdHJpYnV0aW9uIGFuZCByZXBsYWNlIHRoZSBBeGlzMiBnZW5lcmF0ZWQgY2xhc3NlcyB3aXRoIGNvcnJlY3QgY2xhc3Nlcwotd3NkbDJjb2RlLmFyZzM4PSAgLS1ub0J1aWxkWE1MICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIHRoZSBidWlsZC54bWwgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkKLXdzZGwyY29kZS5hcmczOT0gIC0tbm9XU0RMICAgICAgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBXU0RMJ3MgaW4gdGhlIHJlc291cmNlcyBkaXJlY3RvcnkKLXdzZGwyY29kZS5hcmc0MD0gIC0tbm9NZXNzYWdlUmVjZWl2ZXIgICAgICBEb24ndCBnZW5lcmF0ZSBhIE1lc3NhZ2VSZWNlaXZlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMKLXdzZGwyY29kZS5hcmc0MT0gIC0taHR0cC1wcm94eS1ob3N0IDxob3N0PiBQcm94eSBob3N0IGFkZHJlc3MgaWYgeW91IGFyZSBiZWhpbmQgYSBmaXJld2FsbAotd3NkbDJjb2RlLmFyZzQyPSAgLS1odHRwLXByb3h5LXBvcnQgPHBvcnQ+IFByb3h5IHBvcnQgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsCi13c2RsMmNvZGUuYXJnNDM9ICAtZXAgPHBhY2thZ2UtbmFtZS1saXN0PiAgRXhjbHVkZSBwYWNrYWdlcyAtIHRoZXNlIHBhY2thZ2VzIGFyZSBkZWxldGVkIGFmdGVyIGNvZGUgZ2VuZXJhdGlvbgotd3NkbDJjb2RlLmFyZzQ0PSAgLXNpbiA8aW50ZXJmYWNlLW5hbWU+ICAgIFNrZWxldG9uIGludGVyZmFjZSBuYW1lIC0gdXNlZCB0byBzcGVjaWZ5IGEgbmFtZSBmb3Igc2tlbGV0b24gaW50ZXJmYWNlIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgb25lIAotd3NkbDJjb2RlLmFyZzQ1PSAgLXNjbiA8Y2xhc3MtbmFtZT4gICAgICAgIFNrZWxldG9uIGNsYXNzIG5hbWUgLSB1c2VkIHRvIHNwZWNpZnkgYSBuYW1lIGZvciBza2VsZXRvbiBjbGFzcyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZQotd3NkbDJjb2RlLmFyZzQ2PSAgICAgICAgICAgICAgICAgICAgICAgICAgIFx0XHRcdCAgIC1FYmluZGluZ0ZpbGVOYW1lIDxwYXRoPiAgICAgICAgICAgICAgIChmb3IgamF4YnJpKSAtIHNwZWNpZnkgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIGVwaXNvZGUgZmlsZQotd3NkbDJjb2RlLmFyZzQ3PSAgLW9hYSA8b3ZlcnJpZGUtYWJzb2x1dGUtYWRkcmVzcz4gIC1jaGFuZ2UgdGhlIGFic29sdXRlIGh0dHAgYWRkcmVzc2VzIHRvIGxvY2FsIGZpbGUgYWRkcmVzc2VzIGdlbmVyYXRlZCBieSB3c2RsMmphdmEgdG9vbAotd3NkbDJjb2RlLmFyZzQ4PSAgLWViYyA8ZXhjZXB0aW9uLWJhc2UtY2xhc3M+ICAtZ2VuZXJhdGVkIEV4Y2VwdGlvbnMgYXJlIGluaGVyaXRlZCBmcm9tIHRoaXMgZXhjZXB0aW9uIHJhdGhlciB0aGFuIHRoZSBqYXZhLmxhbmcuRXhjZXB0aW9uIGNsYXNzCi13c2RsMmNvZGUuYXJnNDk9ICAtdW9uIDx1c2Utb3BlcmF0aW9uLW5hbWU+ICAtYnkgZGVmYXVsdCB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBnZW5lcmF0ZWQgbWV0aG9kIG5hbWUgY2hhbmdlZWQgdG8gbG93ZXJjYXNlLiBUaGlzIG9wdGlvbiBzdG9wcyB0aGF0IGFuZCBtYWtlIGl0IHNhbWUgYXMgb3BlcmF0aW9uIG5hbWUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIHByb3AgZmlsZSBsb2FkZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm9wZmlsZWxvYWQuZnJhbWV3b3JrTWlzbWF0Y2g9TnVtYmVyIG9mIGZyYW1ld29ya3MgYW5kIGV4dGVuc2lvbiBuYW1lcyBkbyBub3QgbWF0Y2ghCi1wcm9wZmlsZWxvYWQudW5rbm93bkZyYW1ld29yaz1Vbmtub3duIGZyYW1ld29yayBzcGVjaWZpZWQgZm9yIGRlZmF1bHQhCi1wcm9wZmlsZWxvYWQuZW1pdHRlck1pc3Npbmc9Tm8gZW1pdHRlcnMgZm91bmQhCi1wcm9wZmlsZWxvYWQudW5rbm93bkRlZmF1bHRMYW5nPVVua25vd24gTGFuZ3VhZ2Ugc3BlY2lmaWVkIGZvciBkZWZhdWx0IQotcHJvcGZpbGVsb2FkLmdlbmVyYWxFeGNlcHRpb249RXhjZXB0aW9uIHdoaWxlIGxvYWRpbmcgdGhlIHByb3BlcnR5IGZpbGUKLQotIyMjIyMjIyMjIyMjIyMjIyMgIHRlbXBsYXRlIHJlc29sdmVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcmVzb2x2ZXIudGVtcGxhdGVOb3RGb3VuZD17MH0gdGVtcGxhdGUgbm90IGZvdW5kIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIENvZGVnZW4gZW5naW5lICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lbmdpbmUud3NkbFBhcnNpbmdFeGNlcHRpb249RXJyb3IgcGFyc2luZyBXU0RMCi1lbmdpbmUuaW52YWxpZFdzZGxMb2NhdGlvbj1JbnZhbGlkIFdTREwgTG9jYXRpb24KLWVuZ2luZS5ub1Byb3BlckRhdGFiaW5kaW5nRXhjZXB0aW9uPVVuYWJsZSB0byB1c2Ugc3BlY2lmaWVkIGRhdGFiaW5kaW5nIQotZW5naW5lLmVtaXR0ZXJNaXNzaW5nPUVtaXR0ZXIgY2xhc3Mgbm90IGZvdW5kIQotZW5naW5lLndyb25nRW1pdHRlcj1Ob24gZW1pdHRlciBjbGFzcyBmb3VuZCEKLWVuZ2luZS5leHRlbnNpb25Mb2FkUHJvYmxlbT1FeHRlbnNpb24gY2xhc3MgbG9hZGluZyBwcm9ibGVtCi1lbmdpbmUuZXh0ZW5zaW9uSW5zdGFudGlhdGlvblByb2JsZW09RXh0ZW5zaW9uIGNsYXNzIGluc3RhbnRpYXRpb24gcHJvYmxlbQotZW5naW5lLmlsbGVnYWxFeHRlbnNpb249SWxsZWdhbCBleHRlbnNpb24hCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMgT3B0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3B0aW9ucy5ub3RBRGlyZWN0b3J5RXhjZXB0aW9uPVRoZSBzcGVjaWZpZWQgb3V0cHV0IGxvY2F0aW9uIGlzIG5vdCBhIGRpcmVjdG9yeSEKLW9wdGlvbnMubm9tYXBwaW5nRmlsZT1VbmFibGUgdG8gbG9hZCBtYXBwaW5nIGZpbGUhCi1vcHRpb25zLm5vRmlsZT1UaGUgc3BlY2lmaWVkIG91dHB1dCBsb2NhdGlvbiBpcyBub3QgYSBkaXJlY3RvcnkhCi0KLXdyaXRlci5ub0xhbmdQcm9wZXJ0aWVzRXh0ZW5zaW9uPU5vIGxhbmd1YWdlIHNwZWNpZmljIHByb3BlcnRpZXMhISEKLXdyaXRlci50ZW1wbGF0ZU1pc3Npbmc9dGVtcGxhdGUgZm9yIHRoaXMgd3JpdGVyIGlzIG5vdCBmb3VuZCEKLQotZXh0ZW5zaW9uLmJpbmRpbmdNaXNzaW5nPWJpbmRpbmdzIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQKLWV4dGVuc2lvbi5ub1Byb3BlckRhdGFiaW5kaW5nPU5vIHByb3BlciBkYXRhYmluZGluZyBoYXMgdGFrZW4gcGxhY2UKLWV4dGVuc2lvbi5pbnZhbGlkV1NETD1JbnZhbGlkIFdTREw6IFRoZSBXU0RMIFR5cGVzIFNjaGVtYSBkb2VzIG5vdCBkZWZpbmUgYSB0YXJnZXROYW1lc3BhY2UgaW4gezB9Ci1leHRlbnNpb24uYWRkaXRpb25hbFNjaGVtYUZhaWx1cmU9QWRkaXRpb25hbCBzY2hlbWEgbG9hZGluZyBmYWlsZWQhIQotZXh0ZW5zaW9uLmVuY29kZWROb3RTdXBwb3J0ZWQ9VGhlIHVzZSAnZW5jb2RlZCcgaXMgbm90IHN1cHBvcnRlZCEKLWV4dGVuc2lvbi5kYXRhYmluZGluZ01pc21hdGNoPVRoZSBzcGVjaWZpZWQgZGF0YWJpbmRpbmcgZnJhbWV3b3JrcyBkbyBub3QgbWF0Y2ghCi1leHRlbnNpb24udW5oYW5kbGVkU2NoZW1hQ29uc3RydWN0PVVuaGFuZGxlZCBzY2hlbWEgY29uc3RydWN0IQotZXh0ZW5zaW9uLnVuc3VwcG9ydGVkZm9ydW53cmFwcGluZz1VbnN1cHBvcnRlZCBmcmFtZXdvcmsgZm9yIHVud3JhcHBpbmchCi1leHRlbnNpb24udW5zdXBwb3J0ZWRTY2hlbWFGb3JtYXQ9VW5zdXBwb3J0ZWQgU2NoZW1hIGZvcm1hdCBmb3IgdW53cmFwcGluZyEgZm91bmQgezB9IGJ1dCBleHBlY3RlZCB7MX0KLQotZW1pdHRlci51bmtub3duU3R5bGU9VW5rbm93biBjb2RlIGdlbmVyYXRpb24gc3R5bGUgezB9Ci1lbWl0dGVyLmNhbm5vdEZpbmRCaW5kaW5nPUNhbm5vdCBmaW5kIGEgYmluZGluZyEhCi1lbWl0dGVyLmxvZ0VudHJ5SW50ZXJmYWNlMT1JbnRlcmZhY2UgbW9kZSBpcyBzZWxlY3RlZC5UaGUgZm9sbG93aW5nIGl0ZW1zIHdpbGwgbm90IGJlIGdlbmVyYXRlZAotZW1pdHRlci5sb2dFbnRyeUludGVyZmFjZTI9MS4gTWVzc2FnZSBSZWNlaXZlcgotZW1pdHRlci5sb2dFbnRyeUludGVyZmFjZTM9Mi4gU3R1YgotZW1pdHRlci5sb2dFbnRyeUludGVyZmFjZTQ9My4gQ2FsbGJhY2tIYW5kbGVyCi1lbWl0dGVyLmxvZ0VudHJ5SW50ZXJmYWNlNT00LiBUZXN0IENsYXNzZXMKLWVtaXR0ZXIubG9nRW50cnlJbnRlcmZhY2U2PTUuIERhdGFiaW5kaW5nIFN1cHBvcnRlcnMKLWVtaXR0ZXIuY29yZWNsYXNzTmFtZUVycm9yPUNhbm5vdCBmb3JtIHRoZSBjb3JlIGNsYXNzIG5hbWUKLWVtaXR0ZXIuc2VydmljZU5vdEZvdW5kRXJyb3I9c3BlY2lmaWVkIHNlcnZpY2UgezB9IG5vdCBmb3VuZAotZW1pdHRlci5lbmRwb2ludE5vdEZvdW5kRXJyb3I9c3BlY2lmaWVkIGVuZCBwb2ludCB7MH0gbm90IGZvdW5kCi1lbWl0dGVyLm5vRW5kcG9pbnRzRm91bmRFcnJvcj1lbmRwb2ludHMgbm90IGZvdW5kCi1lbWl0dGVyLndhcm5pbmdNdWx0aXBsZVNlcnZpY2VzPVdhcm5pbmcgLSBNdWx0aXBsZSBzZXJ2aWNlcyBmb3VuZCAtIHBpY2tpbmcgdGhlIGZpcnN0IHNlcnZpY2UhCi1lbWl0dGVyLndhcm5pbmdNdWx0aXBsZUVuZHBvaW50cz1XYXJuaW5nIC0gTXVsdGlwbGUgZW5kcG9pbnRzIGZvdW5kIC0gcGlja2luZyB0aGUgZmlyc3QgZW5kcG9pbnQhCi1lbWl0dGVyLnN3aXRjaGluZ01lc3NhZ2VzPVdhcm5pbmcgLU5vIHNlcnZpY2VzIGZvdW5kIC0gc3dpdGNoZWQgdG8gdGhlIGludGVyZmFjZSBtb2RlIQotZW1pdHRlci53YXJuaW5nTXVsdGlwbGVQb3J0dHlwZXM9V2FybmluZyAtIEZvdW5kIG11bHRpcGxlIHBvcnR0eXBlcyAtIHBpY2tpbmcgdGhlIGZpcnN0Ci0KLSMgVHlwZSBtYXBwZXJzCi1kYXRhYmluZGluZy50eXBlbWFwcGVyLnR5cGV1bm1hdGNoZWQ9Tm8gdHlwZSB3YXMgbWFwcGVkIHRvIHRoZSBuYW1lIHswfSB3aXRoIG5hbWVzcGFjZSB7MX0KLWRhdGFiaW5kaW5nLnR5cGVtYXBwZXIudHlwZXVubWF0Y2hlZC5udWxsPU5vIHR5cGUgY2FuIGJlIG1hdGNoZWQgdG8gYSBudWxsIFFOYW1lIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMgamF2YTJXU0RMCi1qYXZhMndzZGwuYXJnMT1Vc2FnZSBqYXZhMndzZGwgLWNuIDxmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZT4gOiBjbGFzcyBmaWxlIG5hbWUKLWphdmEyd3NkbC5hcmcyPS1vIDxvdXRwdXQgTG9jYXRpb24+IDogb3V0cHV0IGZpbGUgbG9jYXRpb24KLWphdmEyd3NkbC5hcmczPS1jcCA8Y2xhc3MgcGF0aCB1cmk+IDogbGlzdCBvZiBjbGFzc3BhdGggZW50cmllcyAtICh1cmxzKQotamF2YTJ3c2RsLmFyZzQ9LXRuIDx0YXJnZXQgbmFtZXNwYWNlPiA6IHRhcmdldCBuYW1lc3BhY2UKLWphdmEyd3NkbC5hcmc1PS10cCA8dGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXg+IDogdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXgKLWphdmEyd3NkbC5hcmc2PS1zdG4gPHNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlPiA6IHRhcmdldCBuYW1lc3BhY2UgZm9yIHNjaGVtYQotamF2YTJ3c2RsLmFyZzc9LXN0cCA8c2NoZW1hIHRhcmdldCBuYW1lc3BhY2UgcHJlZml4PiA6IHRhcmdldCBuYW1lc3BhY2UgcHJlZml4IGZvciBzY2hlbWEKLWphdmEyd3NkbC5hcmc4PS1zbiA8c2VydmljZSBuYW1lPiA6IHNlcnZpY2UgbmFtZQotamF2YTJ3c2RsLmFyZzk9LW9mIDxvdXRwdXQgZmlsZSBuYW1lPiA6IG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBXU0RMCi0KLWphdmEyd3NkbC5nZW5lcmFsRXJyb3I9QW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBnZW5lcmF0aW5nIGNvZGUKLWphdmEyd3NkbC5ub3RBRm9sZGVyPVRoZSBzcGVjaXZpZWQgbG9jYXRpb24gezB9IGlzIG5vdCBhIGZvbGRlcgotamF2YTJ3c2RsLmNsYXNzSXNNdXN0PWNsYXNzIG5hbWUgbXVzdCBiZSBwcmVzZW50IQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL0J1aWxkU2NyaXB0VGVtcGxhdGUueHNsIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvQnVpbGRTY3JpcHRUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzM2Y4MDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvQnVpbGRTY3JpcHRUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLTx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iaW50ZXJmYWNlIj4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2aWNlbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3B0aW9uIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dGxvY2F0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG91dHB1dGxvY2F0aW9uIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9InRhcmdldHNvdXJjZWxvY2F0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRhcmdldHNvdXJjZWxvY2F0aW9uIi8+PC94c2w6dmFyaWFibGU+Ci08eHNsOmNob29zZT4KLTx4c2w6d2hlbiB0ZXN0PSIkb3B0aW9uID0gMSI+Ci1nY2MgLWcgLXNoYXJlZCAtb2xpYjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4uc28gLUkgJEFYSVMyQ19IT01FL2luY2x1ZGUvYXhpczItMS41LjAvIC1JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXRzb3VyY2Vsb2NhdGlvbiIvPiAtTCRBWElTMkNfSE9NRS9saWIgXAotICAgIC1sYXh1dGlsIFwKLSAgICAtbGF4aXMyX2F4aW9tIFwKLSAgICAtbGF4aXMyX2VuZ2luZSBcCi0gICAgLWxheGlzMl9wYXJzZXIgXAotICAgIC1scHRocmVhZCBcCi0gICAgLWxheGlzMl9odHRwX3NlbmRlciBcCi0gICAgLWxheGlzMl9odHRwX3JlY2VpdmVyIFwKLSAgICAtbGd1dGh0aGlsYSBcCi0gICAgKi5jIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGFyZ2V0c291cmNlbG9jYXRpb24iLz4vKi5jCi08L3hzbDp3aGVuPgotPHhzbDpvdGhlcndpc2U+Ci1nY2MgLWcgLXNoYXJlZCAtb2xpYjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4uc28gLUkgJEFYSVMyQ19IT01FL2luY2x1ZGUvYXhpczItMS41LjAvICAtTCRBWElTMkNfSE9NRS9saWIgXAotICAgIC1sYXh1dGlsIFwKLSAgICAtbGF4aXMyX2F4aW9tIFwKLSAgICAtbGF4aXMyX2VuZ2luZSBcCi0gICAgLWxheGlzMl9wYXJzZXIgXAotICAgIC1scHRocmVhZCBcCi0gICAgLWxheGlzMl9odHRwX3NlbmRlciBcCi0gICAgLWxheGlzMl9odHRwX3JlY2VpdmVyIFwKLSAgICAtbGd1dGh0aGlsYSBcCi0gICAgKi5jIAotPC94c2w6b3RoZXJ3aXNlPgotPC94c2w6Y2hvb3NlPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVNrZWxldG9uLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NlcnZpY2VTa2VsZXRvbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODBmMTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVNrZWxldG9uLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDczOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotICAgICAgPCEtLVRlbXBsYXRlIGZvciBpbiBvdXQgbWVzc2FnZSByZWNlaXZlciAtLT4KLSAgICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2UiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNrZWxldG9ubmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZWZpeCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN2Y29wLXByZWZpeCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdmNvcF9wcmVmaXgiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdmNuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN2Y25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2aWNlbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdmNuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic29hcFZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc29hcC12ZXJzaW9uIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5jCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxbmFtZSIvPiIgc2VydmljZQotICAgICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4KLSAgICAgICAgICovCi0KLSAgICAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3Zjb3AtcHJlZml4Ii8+LmgiCi0gICAgICAgICNpbmNsdWRlICZsdDtheGlzMl9zdmNfc2tlbGV0b24uaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7Ci0gICAgICAgICNpbmNsdWRlICZsdDtheGlzMl9zdmMuaCZndDsKLQotICAgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKLSAgICAgICAgZXh0ZXJuICJDIiB7Ci0gICAgICAgICNlbmRpZgotICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogZnVuY3Rpb25zIHByb3RvdHlwZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgLyogT24gZmF1bHQsIGhhbmRsZSB0aGUgZmF1bHQgKi8KLSAgICAgICAgYXhpb21fbm9kZV90KiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9vbl9mYXVsdChheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIGF4aW9tX25vZGVfdCAqbm9kZSk7Ci0KLSAgICAgICAgLyogRnJlZSB0aGUgc2VydmljZSAqLwotICAgICAgICBpbnQgQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fZnJlZShheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgICAgIC8qIFRoaXMgbWV0aG9kIGludm9rZXMgdGhlIHJpZ2h0IHNlcnZpY2UgbWV0aG9kICovCi0gICAgICAgIGF4aW9tX25vZGVfdCogQVhJUzJfQ0FMTAotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5faW52b2tlKGF4aXMyX3N2Y19za2VsZXRvbl90ICpzdmNfc2tlbGV0b24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKm5vZGUsCi0gICAgICAgICAgICAgICAgICAgIGF4aXMyX21zZ19jdHhfdCAqbXNnX2N0eCk7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6aW5nIHRoZSBlbnZpcm9ubWVudCAgKi8KLSAgICAgICAgaW50IEFYSVMyX0NBTEwKLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2luaXQoYXhpczJfc3ZjX3NrZWxldG9uX3QgKnN2Y19za2VsZXRvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLQotICAgICAgICAvKiBDcmVhdGUgdGhlIHNlcnZpY2UgICovCi0gICAgICAgIGF4aXMyX3N2Y19za2VsZXRvbl90KiBBWElTMl9DQUxMCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9jcmVhdGUoY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgICAgIHN0YXRpYyBjb25zdCBheGlzMl9zdmNfc2tlbGV0b25fb3BzX3QgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz5fc3ZjX3NrZWxldG9uX29wc192YXIgPSB7Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5faW5pdCwKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9pbnZva2UsCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fb25fZmF1bHQsCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fZnJlZQotICAgICAgICB9OwotCi0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRm9sbG93aW5nIGJsb2NrIGRpc3Rpbmd1aXNoIHRoZSBleHBvc2VkIHBhcnQgb2YgdGhlIGRsbC4KLSAgICAgICAgICogY3JlYXRlIHRoZSBpbnN0YW5jZQotICAgICAgICAgKi8KLQotICAgICAgICBBWElTMl9FWFRFUk4gaW50Ci0gICAgICAgIGF4aXMyX2dldF9pbnN0YW5jZShzdHJ1Y3QgYXhpczJfc3ZjX3NrZWxldG9uICoqaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0gICAgICAgIEFYSVMyX0VYVEVSTiBpbnQgCi0gICAgICAgIGF4aXMyX3JlbW92ZV9pbnN0YW5jZShheGlzMl9zdmNfc2tlbGV0b25fdCAqaW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpOwotCi0KLSAgICAgICAgIC8qKgotICAgICAgICAgICogZnVuY3Rpb24gdG8gZnJlZSBhbnkgc29hcCBpbnB1dCBoZWFkZXJzCi0gICAgICAgICAgKi8KLSAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgdm9pZAotICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgdm9pZAotICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhjb25zdCBheHV0aWxfZW52X3QgKmVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2Qvb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ3JlYXRlIHRoZSByZXNwb25zZSBzb2FwIGVudmVsb3BlIHdoZW4gb3V0cHV0IGhlYWRlcnMgYXJlIHRvIGJlIHNldC4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfdCogQVhJUzJfQ0FMTAotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2NyZWF0ZV9yZXNwb25zZV9lbnZlbG9wZShjb25zdCBheHV0aWxfZW52X3QgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9tc2dfY3R4X3QgKmluX21zZ19jdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX21zZ19jdHhfdCAqbXNnX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmJvZHlfY29udGVudF9ub2RlKTsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKLSAgICAgICAgfQotICAgICAgICAjZW5kaWYKLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBmdW5jdGlvbnMKLSAgICAgICAgICovCi0KLQlheGlzMl9zdmNfc2tlbGV0b25fdCogQVhJUzJfQ0FMTAotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9jcmVhdGUoY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0JewotCSAgICBheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uID0gTlVMTDsKLSAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc3RydWN0cyAqLwotICAgICAgICBzdmNfc2tlbGV0b24gPSAoYXhpczJfc3ZjX3NrZWxldG9uX3QgKilBWElTMl9NQUxMT0MoZW52LT5hbGxvY2F0b3IsCi0gICAgICAgICAgICBzaXplb2YoYXhpczJfc3ZjX3NrZWxldG9uX3QpKTsKLQotICAgICAgICBzdmNfc2tlbGV0b24tPm9wcyA9ICZhbXA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz5fc3ZjX3NrZWxldG9uX29wc192YXI7Ci0KLQotCSAgICByZXR1cm4gc3ZjX3NrZWxldG9uOwotCX0KLQotCi0JaW50IEFYSVMyX0NBTEwKLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5faW5pdChheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KQotCXsKLQkgICAgLyogQW55IGluaXRpYWxpemF0aW9uIHN0dWZmIG9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ZjbmFtZSIvPiBnb2VzIGhlcmUgKi8KLQkgICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Ci0JfQotCi0JaW50IEFYSVMyX0NBTEwKLQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fZnJlZShheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uLAotCQkJCSBjb25zdCBheHV0aWxfZW52X3QgKmVudikKLQl7Ci0KLSAgICAgICAgLyogRnJlZSB0aGUgc2VydmljZSBza2VsZXRvbiAqLwotICAgICAgICBpZiAoc3ZjX3NrZWxldG9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBBWElTMl9GUkVFKGVudi0+YWxsb2NhdG9yLCBzdmNfc2tlbGV0b24pOwotICAgICAgICAgICAgc3ZjX3NrZWxldG9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBBWElTMl9TVUNDRVNTOwotCX0KLQotCi0KLSAgICAgLyoqCi0gICAgICAqIGZ1bmN0aW9uIHRvIGZyZWUgYW55IHNvYXAgaW5wdXQgaGVhZGVycwotICAgICAgKi8KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgIHZvaWQKLSAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfdmFyIj48eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAvKiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGZyZWUgb24gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+ICovCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0KLSAgICAgLyoqCi0gICAgICAqIGZ1bmN0aW9uIHRvIGZyZWUgYW55IHNvYXAgb3V0cHV0IGhlYWRlcnMKLSAgICAgICovCi0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgdm9pZAotICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVhZGVyX3ZhciI+PHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4gCi0gICAgICAgICAgICAgICAgICAgIC8qIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZnJlZSBvbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gKi8KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2Qvb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotCS8qCi0JICogQ3JlYXRlIHRoZSByZXNwb25zZSBzb2FwIGVudmVsb3BlIHdoZW4gb3V0cHV0IGhlYWRlcnMgYXJlIHRvIGJlIHNldC4uCi0JICovCi0JYXhpb21fc29hcF9lbnZlbG9wZV90KiBBWElTMl9DQUxMCi0JPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+X2NyZWF0ZV9yZXNwb25zZV9lbnZlbG9wZShjb25zdCBheHV0aWxfZW52X3QgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfbXNnX2N0eF90ICppbl9tc2dfY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfbXNnX2N0eF90ICptc2dfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmJvZHlfY29udGVudF9ub2RlKQotICAgIHsKLSAgICAgICAgY29uc3QgYXhpczJfY2hhcl90ICpzb2FwX25zID0gQVhJT01fU09BUDEyX1NPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgaW50IHNvYXBfdmVyc2lvbiA9IEFYSU9NX1NPQVAxMjsKLSAgICAgICAgYXhpb21fbmFtZXNwYWNlX3QgKmVudl9ucyA9IE5VTEw7Ci0gICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfdCAqZGVmYXVsdF9lbnZlbG9wZSA9IE5VTEw7Ci0gICAgICAgIGF4aW9tX3NvYXBfaGVhZGVyX3QgKm91dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICBheGlvbV9zb2FwX2JvZHlfdCAqb3V0X2JvZHkgPSBOVUxMOwotICAgICAgICBheGlvbV9ub2RlX3QgKm91dF9ub2RlID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIGlmIChpbl9tc2dfY3R4ICZhbXA7JmFtcDsgYXhpczJfbXNnX2N0eF9nZXRfaXNfc29hcF8xMShpbl9tc2dfY3R4LCBlbnYpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzb2FwX25zID0gQVhJT01fU09BUDExX1NPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsgLyogZGVmYXVsdCBpcyAxLjIgKi8KLSAgICAgICAgICAgIHNvYXBfdmVyc2lvbiA9IEFYSU9NX1NPQVAxMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNyZWF0ZSB0aGUgc29hcCBlbnZlbG9wZSBoZXJlICovCi0gICAgICAgIGVudl9ucyA9IGF4aW9tX25hbWVzcGFjZV9jcmVhdGUoZW52LCBzb2FwX25zLCAic29hcGVudiIpOwotICAgICAgICBpZiAoIWVudl9ucykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0X2VudmVsb3BlID0gYXhpb21fc29hcF9lbnZlbG9wZV9jcmVhdGUoZW52LCBlbnZfbnMpOwotCi0gICAgICAgIGlmICghZGVmYXVsdF9lbnZlbG9wZSkKLSAgICAgICAgewotICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2ZyZWUoZW52X25zLCBlbnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRfaGVhZGVyID0gYXhpb21fc29hcF9oZWFkZXJfY3JlYXRlX3dpdGhfcGFyZW50KGVudiwgZGVmYXVsdF9lbnZlbG9wZSk7Ci0gICAgICAgIGlmICghb3V0X2hlYWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgYXhpb21fc29hcF9lbnZlbG9wZV9mcmVlKGRlZmF1bHRfZW52ZWxvcGUsIGVudik7Ci0gICAgICAgICAgICBheGlvbV9uYW1lc3BhY2VfZnJlZShlbnZfbnMsIGVudik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dF9ib2R5ID0gYXhpb21fc29hcF9ib2R5X2NyZWF0ZV93aXRoX3BhcmVudChlbnYsIGRlZmF1bHRfZW52ZWxvcGUpOwotICAgICAgICBpZiAoIW91dF9ib2R5KQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlvbV9zb2FwX2JvZHlfZnJlZShvdXRfYm9keSwgZW52KTsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfZnJlZShkZWZhdWx0X2VudmVsb3BlLCBlbnYpOwotICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2ZyZWUoZW52X25zLCBlbnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRfbm9kZSA9IGF4aW9tX3NvYXBfYm9keV9nZXRfYmFzZV9ub2RlKG91dF9ib2R5LCBlbnYpOwotICAgICAgICBpZiAoIW91dF9ub2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlvbV9zb2FwX2JvZHlfZnJlZShvdXRfYm9keSwgZW52KTsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfZnJlZShkZWZhdWx0X2VudmVsb3BlLCBlbnYpOwotICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2ZyZWUoZW52X25zLCBlbnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAKLSAgICAgICAgaWYgKGJvZHlfY29udGVudF9ub2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlvbV9ub2RlX2FkZF9jaGlsZChvdXRfbm9kZSwgZW52LCBib2R5X2NvbnRlbnRfbm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKGF4aXMyX21zZ19jdHhfc2V0X3NvYXBfZW52ZWxvcGUobXNnX2N0eCwgZW52LCBkZWZhdWx0X2VudmVsb3BlKSA9PSBBWElTMl9GQUlMVVJFKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlvbV9zb2FwX2JvZHlfZnJlZShvdXRfYm9keSwgZW52KTsKLSAgICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfZnJlZShkZWZhdWx0X2VudmVsb3BlLCBlbnYpOwotICAgICAgICAgICAgYXhpb21fbmFtZXNwYWNlX2ZyZWUoZW52X25zLCBlbnYpOwotICAgICAgICAgICAgaWYgKGJvZHlfY29udGVudF9ub2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfZnJlZV90cmVlKGJvZHlfY29udGVudF9ub2RlLCBlbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRfZW52ZWxvcGU7Ci0gICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpbnZva2VzIHRoZSByaWdodCBzZXJ2aWNlIG1ldGhvZAotCSAqLwotCWF4aW9tX25vZGVfdCogQVhJUzJfQ0FMTAotCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9pbnZva2UoYXhpczJfc3ZjX3NrZWxldG9uX3QgKnN2Y19za2VsZXRvbiwKLQkJCQljb25zdCBheHV0aWxfZW52X3QgKmVudiwKLQkJCQlheGlvbV9ub2RlX3QgKmNvbnRlbnRfbm9kZSwKLQkJCQlheGlzMl9tc2dfY3R4X3QgKm1zZ19jdHgpCi0JewotICAgICAgICAgLyogZGVwZW5kaW5nIG9uIHRoZSBmdW5jdGlvbiBuYW1lIGludm9rZSB0aGUKLSAgICAgICAgICAqIGNvcnJlc3BvbmRpbmcgIG1ldGhvZAotICAgICAgICAgICovCi0KLSAgICAgICAgICBheGlzMl9vcF9jdHhfdCAqb3BlcmF0aW9uX2N0eCA9IE5VTEw7Ci0gICAgICAgICAgYXhpczJfb3BfdCAqb3BlcmF0aW9uID0gTlVMTDsKLSAgICAgICAgICBheHV0aWxfcW5hbWVfdCAqb3BfcW5hbWUgPSBOVUxMOwotICAgICAgICAgIGF4aXMyX2NoYXJfdCAqb3BfbmFtZSA9IE5VTEw7Ci0gICAgICAgICAgYXhpczJfbXNnX2N0eF90ICppbl9tc2dfY3R4ID0gTlVMTDsKLSAgICAgICAgICAKLSAgICAgICAgICBheGlvbV9zb2FwX2VudmVsb3BlX3QgKnJlcV9zb2FwX2VudiA9IE5VTEw7Ci0gICAgICAgICAgYXhpb21fc29hcF9oZWFkZXJfdCAqcmVxX3NvYXBfaGVhZGVyID0gTlVMTDsKLSAgICAgICAgICBheGlvbV9zb2FwX2VudmVsb3BlX3QgKnJlc19zb2FwX2VudiA9IE5VTEw7Ci0gICAgICAgICAgYXhpb21fc29hcF9oZWFkZXJfdCAqcmVzX3NvYXBfaGVhZGVyID0gTlVMTDsKLQotICAgICAgICAgIGF4aW9tX25vZGVfdCAqcmV0X25vZGUgPSBOVUxMOwotICAgICAgICAgIGF4aW9tX25vZGVfdCAqaW5wdXRfaGVhZGVyID0gTlVMTDsKLSAgICAgICAgICBheGlvbV9ub2RlX3QgKm91dHB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgIGF4aW9tX25vZGVfdCAqaGVhZGVyX2Jhc2Vfbm9kZSA9IE5VTEw7Ci0KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBvc2l0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj4KLSAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChvdXRwdXQvcGFyYW0vQHR5cGUpIj5heGlzMl9zdGF0dXNfdDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPiByZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPjsKLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQHR5cGUhPScnIj4KLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtL0B0eXBlIi8+IGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz47Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9IE5VTEw7Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICBvcGVyYXRpb25fY3R4ID0gYXhpczJfbXNnX2N0eF9nZXRfb3BfY3R4KG1zZ19jdHgsIGVudik7Ci0gICAgICAgICAgb3BlcmF0aW9uID0gYXhpczJfb3BfY3R4X2dldF9vcChvcGVyYXRpb25fY3R4LCBlbnYpOwotICAgICAgICAgIG9wX3FuYW1lID0gKGF4dXRpbF9xbmFtZV90ICopYXhpczJfb3BfZ2V0X3FuYW1lKG9wZXJhdGlvbiwgZW52KTsKLSAgICAgICAgICBvcF9uYW1lID0gYXh1dGlsX3FuYW1lX2dldF9sb2NhbHBhcnQob3BfcW5hbWUsIGVudik7Ci0KLSAgICAgICAgICBpZiAob3BfbmFtZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kL2lucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgIGlmKG9wZXJhdGlvbl9jdHgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGluX21zZ19jdHggPSBheGlzMl9vcF9jdHhfZ2V0X21zZ19jdHgob3BlcmF0aW9uX2N0eCwgZW52LCBBWElTMl9XU0RMX01FU1NBR0VfTEFCRUxfSU4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihpbl9tc2dfY3R4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxX3NvYXBfZW52ID0gYXhpczJfbXNnX2N0eF9nZXRfc29hcF9lbnZlbG9wZShpbl9tc2dfY3R4LCBlbnYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZighcmVxX3NvYXBfZW52KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAicmVxdWVzdCBldmVsb3BlIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcV9zb2FwX2hlYWRlciA9IGF4aW9tX3NvYXBfZW52ZWxvcGVfZ2V0X2hlYWRlcihyZXFfc29hcF9lbnYsIGVudik7Ci0KLSAgICAgICAgICAgICAgICBpZihyZXFfc29hcF9oZWFkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJfYmFzZV9ub2RlID0gYXhpb21fc29hcF9oZWFkZXJfZ2V0X2Jhc2Vfbm9kZShyZXFfc29hcF9oZWFkZXIsIGVudik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBvc2l0aW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtbnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+IDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0Q2Fwc1R5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQGNhcHMtdHlwZSIvPiA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtL0B0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLQotICAgICAgICAgICAgICAgIGlmICggYXh1dGlsX3N0cmNtcChvcF9uYW1lLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbHBhcnQiLz4iKSA9PSAwICkKLSAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AdHlwZSE9JyciPgotICAgICAgICAgICAgICAgICAgICBpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+ID0gPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iaW5wdXQvcGFyYW0vQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9jcmVhdGUoIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiggQVhJUzJfRkFJTFVSRSA9PSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShpbnB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2Rlc2VyaWFsaXplKGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudiwgJmFtcDtjb250ZW50X25vZGUsIE5VTEwsIEFYSVMyX0ZBTFNFKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShpbnB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2ZyZWUoaW5wdXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9FUlJPUl9TRVQoZW52LT5lcnJvciwgQVhJUzJfRVJST1JfREFUQV9FTEVNRU5UX0lTX05VTEwsIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgcmV0dXJudGVkIGZyb20gdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzaG91bGQgYmUgZHVlIHRvIGFuIGludmFsaWQgWE1MIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Y29udGVudF9ub2RlOzwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKT0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X2ZpcnN0X2NoaWxkKGhlYWRlcl9iYXNlX25vZGUsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGlucHV0X2hlYWRlciAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShpbnB1dF9oZWFkZXIsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcoaW5wdXRfaGVhZGVyLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X25leHRfc2libGluZyhpbnB1dF9oZWFkZXIsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGlucHV0X2hlYWRlciAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShpbnB1dF9oZWFkZXIsIGVudikgIT0gQVhJT01fRUxFTUVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcoaW5wdXRfaGVhZGVyLCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGhlcmUgdGhlIHBvc2l0aW9uIG1lYW4gdGhlIG51bWJlciBvZiB0aGUgbWV0aG9kIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl92YXIiPjx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE5VTEwgPT0gaW5wdXRfaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJSZXNwb25zZSBoZWFkZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgLyogeW91IGNhbid0IGhhdmUgYSByZXNwb25zZSBoZWFkZXIgTlVMTCwganVzdCBmcmVlIHRoaW5ncyBhbmQgZXhpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL2lucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkaW5wdXR0eXBlLCAnX3QqJykiLz5fZnJlZShpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2NyZWF0ZShlbnYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2Rlc2VyaWFsaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52LCAmYW1wO2lucHV0X2hlYWRlciwgTlVMTCwgQVhJUzJfRkFMU0UgKSA9PSBBWElTMl9GQUlMVVJFKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9kZXNlcmlhbGl6ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzaG91bGQgYmUgZHVlIHRvIGFuIGludmFsaWQgaW5wdXQgaGVhZGVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL2lucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0dHlwZSwgJ190KicpIi8+X2ZyZWUoaW5wdXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaGVhZGVyX3ZhciIvPiA9IGlucHV0X2hlYWRlcjsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtX3ZhbHVlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJpbnB1dC9wYXJhbS9AY29tcGxleHR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoLi4vQGNvbXBsZXh0eXBlLCAnX3QqJykiLz5fZ2V0X3Byb3BlcnR5PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkaW5wdXR0eXBlLCAnX3QqJykiLz5fZ2V0X3Byb3BlcnR5MShpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+PHhzbDp0ZXh0PiwgZW52KTwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+LCBlbnYpPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dHR5cGUsICdfdConKSIvPl9nZXRfcHJvcGVydHk8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPihpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+PHhzbDp0ZXh0PiwgZW52KTwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRwYXJhbV90eXBlcyIgc2VsZWN0PSJvdXRwdXQvcGFyYW0vcGFyYW0vQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0cGFyYW1fdHlwZXMiLz4gcmV0X3Vud3JhcHBlZCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3Zjb3AtcHJlZml4Ii8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz48eHNsOnRleHQ+KGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0cGFyYW1fdmFsdWVzIi8+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+JmFtcDtfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG91dHB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlLCAnX3QqJykiLz5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudiwgcmV0X3Vud3JhcHBlZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudiwgcmV0X3Vud3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtX3ZhbHVlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0B0eXBlIT0nJyI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQHR5cGUhPScnIj5pbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+PC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gPSAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdmNvcC1wcmVmaXgiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPjx4c2w6dGV4dD4oZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRwYXJhbV92YWx1ZXMiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mYW1wO188L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dHB1dC9wYXJhbS9AdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIE5VTEwgPT0gcmV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0VSUk9SX1NFVChlbnYtPmVycm9yLCBBWElTMl9FUlJPUl9EQVRBX0VMRU1FTlRfSVNfTlVMTCwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJOVUxMIHJldHVybnRlZCBmcm9tIHRoZSBidXNpbmVzcyBsb2dpYyBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9Ab3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZnJlZShpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGxvY2F0aW9uPSdzb2FwX2hlYWRlciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhlbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRfbm9kZSA9IDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRvdXRwdXR0eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKHJldF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkb3V0cHV0dHlwZSwgJ190KicpIi8+X2ZyZWUocmV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQHR5cGUhPScnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZnJlZShpbnB1dF92YWw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5yZXRfdmFsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPjs8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3NvYXBfZW52ID0gYXhpczJfbXNnX2N0eF9nZXRfcmVzcG9uc2Vfc29hcF9lbnZlbG9wZShtc2dfY3R4LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJlc19zb2FwX2VudikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfc29hcF9lbnYgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fY3JlYXRlX3Jlc3BvbnNlX2VudmVsb3BlKGVudiwgaW5fbXNnX2N0eCwgbXNnX2N0eCwgcmV0X25vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJlc19zb2FwX2VudikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJyZXNwb25zZSBldmVsb3BlIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbS9AbG9jYXRpb249J3NvYXBfaGVhZGVyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNfc29hcF9oZWFkZXIgPSBheGlvbV9zb2FwX2VudmVsb3BlX2dldF9oZWFkZXIocmVzX3NvYXBfZW52LCBlbnYpOwotIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzX3NvYXBfaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9iYXNlX25vZGUgPSBheGlvbV9zb2FwX2hlYWRlcl9nZXRfYmFzZV9ub2RlKHJlc19zb2FwX2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighaGVhZGVyX2Jhc2Vfbm9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwb3NpdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbS9AbG9jYXRpb249J3NvYXBfaGVhZGVyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3NrZWxfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiUmVxdWlyZWQgcmVzcG9uc2UgaGVhZGVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhZGRpbmcgb3V0cHV0IGhlYWRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaGVhZGVyID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaGVhZGVyID0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfYWRkX2NoaWxkKGhlYWRlcl9iYXNlX25vZGUsIGVudiwgb3V0cHV0X2hlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AbG9jYXRpb249J3NvYXBfaGVhZGVyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX2lucHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBvc2l0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9za2VsX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIEFYSVMyX0ZBSUxVUkUgPT0gcmV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4gKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUihlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgYnVzaW5lc3MgbG9naWMgZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AdHlwZSE9JyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoaW5wdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlKGlucHV0X3ZhbDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcG9zaXRpb24iLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGxvY2F0aW9uPSdzb2FwX2hlYWRlciciPgotICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc2tlbF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNpbmNlIHRoaXMgaGFzIG5vIG91dHB1dCBwYXJhbXMgaXQganVzdCByZXR1cm5zIE5VTEwgKi8gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj5yZXR1cm4gTlVMTDs8L3hzbDppZj4KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tlbGV0b25uYW1lIi8+IHNlcnZpY2UgRVJST1I6IGludmFsaWQgT00gcGFyYW1ldGVycyBpbiByZXF1ZXN0XG4iKTsKLSAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBheGlvbV9ub2RlX3QqIEFYSVMyX0NBTEwKLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1wcmVmaXgiLz5fb25fZmF1bHQoYXhpczJfc3ZjX3NrZWxldG9uX3QgKnN2Y19za2VsZXRvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBheGlvbV9ub2RlX3QgKm5vZGUpCi0JewotCQlheGlvbV9ub2RlX3QgKmVycm9yX25vZGUgPSBOVUxMOwotCQlheGlvbV9lbGVtZW50X3QgKmVycm9yX2VsZSA9IE5VTEw7Ci0JCWVycm9yX2VsZSA9IGF4aW9tX2VsZW1lbnRfY3JlYXRlKGVudiwgbm9kZSwgImZhdWx0IiwgTlVMTCwKLSAgICAJCQkJCSZhbXA7ZXJyb3Jfbm9kZSk7Ci0JCWF4aW9tX2VsZW1lbnRfc2V0X3RleHQoZXJyb3JfZWxlLCBlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHFuYW1lIi8+IGZhaWxlZCIsCi0gICAgCQkJCQllcnJvcl9ub2RlKTsKLQkJcmV0dXJuIGVycm9yX25vZGU7Ci0JfQotCi0KLQkvKioKLQkgKiBGb2xsb3dpbmcgYmxvY2sgZGlzdGluZ3Vpc2ggdGhlIGV4cG9zZWQgcGFydCBvZiB0aGUgZGxsLgotIAkgKi8KLQotICAgIEFYSVMyX0VYVEVSTiBpbnQKLSAgICBheGlzMl9nZXRfaW5zdGFuY2Uoc3RydWN0IGF4aXMyX3N2Y19za2VsZXRvbiAqKmluc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0JewotCQkqaW5zdCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl9jcmVhdGUoZW52KTsKLQotICAgICAgICBpZighKCppbnN0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFYSVMyX0ZBSUxVUkU7Ci0gICAgICAgIH0KLQotICAJCXJldHVybiBBWElTMl9TVUNDRVNTOwotCX0KLQotCUFYSVMyX0VYVEVSTiBpbnQgCi0gICAgYXhpczJfcmVtb3ZlX2luc3RhbmNlKGF4aXMyX3N2Y19za2VsZXRvbl90ICppbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KQotCXsKLSAgICAgICAgYXhpczJfc3RhdHVzX3Qgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAJaWYgKGluc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IEFYSVMyX1NWQ19TS0VMRVRPTl9GUkVFKGluc3QsIGVudik7Ci0gICAgICAgIH0KLSAgICAJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVhNTFRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjdmNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU2VydmljZVhNTFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+Ci0gICAgICAgIDx4c2w6Y29tbWVudD4gVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwgPC94c2w6Y29tbWVudD4KLSAgICAgICAgPHhzbDpjb21tZW50PiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IyA8L3hzbDpjb21tZW50PgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJpbnRlcmZhY2UiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNlcnZpY2VuYW1lIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoQHNlcnZpY2VuYW1lLCc6Li0nLCdfX18nKSIvPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4KLSAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNlcnZpY2VuYW1lIi8+IFNlcnZpY2UKLSAgICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLQkJCQk8b3BlcmF0aW9uPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FscGFydCIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcFVSSSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHNvYXBhY3Rpb24iPgotICAgICAgICAgICAgICA8cGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dGV4dD53c2FtYXBwaW5nPC94c2w6dGV4dD48L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIi8+Ci0gICAgICAgICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0JCQkJPC9vcGVyYXRpb24+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxIZWFkZXJUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9Ta2VsSGVhZGVyVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQ1MzJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxIZWFkZXJUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2ludGVyZmFjZSI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdmNfbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZWZpeCIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgIC8qKgotICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5oCi0gICAgICoKLSAgICAgKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETCBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcW5hbWUiLz4iIHNlcnZpY2UKLSAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyL0MgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IEF4aXMyL0Mgc2tlbGV0b24gZm9yIHRoZSBheGlzU2VydmljZS0gSGVhZGVyIGZpbGUKLSAgICAgKi8KLQotCi0JI2luY2x1ZGUgJmx0O2F4aXMyX3N2Y19za2VsZXRvbi5oJmd0OwotCSNpbmNsdWRlICZsdDtheHV0aWxfbG9nX2RlZmF1bHQuaCZndDsKLQkjaW5jbHVkZSAmbHQ7YXh1dGlsX2Vycm9yX2RlZmF1bHQuaCZndDsKLQkjaW5jbHVkZSAmbHQ7YXhpb21fdGV4dC5oJmd0OwotCSNpbmNsdWRlICZsdDtheGlvbV9ub2RlLmgmZ3Q7Ci0JI2luY2x1ZGUgJmx0O2F4aW9tX2VsZW1lbnQuaCZndDsKLSAgICAjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKLQotCi0gICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnIGFuZCBAb3Vyc10iPgotICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz4KLSAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+LmgiCi0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAdHlwZSE9JycgYW5kIEBvdXJzXSI+Ci0gICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz4KLSAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPi5oIgotICAgIDwveHNsOmZvci1lYWNoPgotICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQkjaWZkZWYgX19jcGx1c3BsdXMKLQlleHRlcm4gIkMiIHsKLQkjZW5kaWYKLQotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0b3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPgotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvdW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtKSIvPjwveHNsOnZhcmlhYmxlPgotCi0JCSA8IS0tIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5bmMgb3IgYXN5bmMgc3RhdHVzLCB0aGUgZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUgd291bGQgYmUganVzdCBhIHVzdWFsCi0JICAgICAgICAgICBjIGZ1bmN0aW9uLS0+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBhdXRvIGdlbmVyYXRlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbgotICAgICAgICAgKiBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz4iIG9wZXJhdGlvbi4KLSAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSk8eHNsOmlmIHRlc3Q9Im5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgKjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOnRleHQ+Ci0gICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIGRwXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiAtIG91dHB1dCBoZWFkZXI8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+Ci0gICAgICAgICAqLwotICAgICAgICA8L3hzbDp0ZXh0PgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRwYXJhbXMiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj5heGlzMl9zdGF0dXNfdCA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGUhPScnIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48L3hzbDp3aGVuPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtcHJlZml4Ii8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4oY29uc3QgYXh1dGlsX2Vudl90ICplbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHBhcmFtcyIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDppZiB0ZXN0PSJAb3VycyI+KjwveHNsOmlmPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IGRwXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0PiAvKiBvdXRwdXQgaGVhZGVyIGRvdWJsZSBwdHIqLzwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gKTsKLSAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQkjaWZkZWYgX19jcGx1c3BsdXMKLQl9Ci0JI2VuZGlmCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0gPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxTb3VyY2VUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9Ta2VsU291cmNlVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzc4MDg4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1NrZWxTb3VyY2VUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvaW50ZXJmYWNlIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN2Y19uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1wcmVmaXgiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJlZml4Ii8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJxbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgLyoqCi0gICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmMKLSAgICAgKgotICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxbmFtZSIvPiIgc2VydmljZQotICAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIvQyB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gQXhpczIvQyBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlCi0gICAgICovCi0KLSAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5oIgotCi0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRvdXJzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY291bnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChvdXRwdXQvcGFyYW0pIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL3BhcmFtL0B0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotCQkgPCEtLSByZWdhcmRsZXNzIG9mIHRoZSBzeW5jIG9yIGFzeW5jIHN0YXR1cywgdGhlIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIHdvdWxkIGJlIGp1c3QgYSB1c3VhbAotCSAgICAgICAgICAgYyBmdW5jdGlvbi0tPgotICAgICAgICAvKioKLSAgICAgICAgICogYXV0byBnZW5lcmF0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbiBzaWduYXR1cmUKLSAgICAgICAgICogZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHFuYW1lIi8+IiBvcGVyYXRpb24uCi0gICAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpPHhzbDppZiB0ZXN0PSJub3QoJGlzVW53cmFwUGFyYW1ldGVycykiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICo8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDp0ZXh0PgotICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBkcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gLSBvdXRwdXQgaGVhZGVyPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PgotICAgICAgICAgKi8KLSAgICAgICAgPC94c2w6dGV4dD4KLSAgICAgICAgIAotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0cGFyYW1zIj4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+YXhpczJfc3RhdHVzX3QgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlIT0nJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6d2hlbj4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLXByZWZpeCIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+KGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRwYXJhbXMiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6aWYgdGVzdD0iQG91cnMiPio8L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBkcF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4gLyogb3V0cHV0IGhlYWRlciBkb3VibGUgcHRyKi88L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFRPRE8gZmlsbCB0aGlzIHdpdGggdGhlIG5lY2Vzc2FyeSBidXNpbmVzcyBsb2dpYyAqLwotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG91dHB1dHR5cGUhPScnIj5yZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPilOVUxMOzwveHNsOmlmPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG91dHB1dHR5cGU9JyciPnJldHVybiBBWElTMl9TVUNDRVNTOzwveHNsOmlmPgotICAgICAgICB9Ci0gICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgPC94c2w6dGVtcGxhdGU+Ci0gPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJIZWFkZXJUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TdHViSGVhZGVyVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDc2ZjdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9jL1N0dWJIZWFkZXJUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9jbGFzcyI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW50ZXJmYWNlTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpbnRlcmZhY2VOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2FsbGJhY2tuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNhbGxiYWNrbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzU3luYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpc1N5bmMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc0FzeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzQXN5bmMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzb2FwVmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwLXZlcnNpb24iLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtcHJlZml4Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZWZpeCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InFuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHFuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2VydmljZW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VydmljZW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAvKioKLSAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uaAotICAgICAgICAqCi0gICAgICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwgZm9yICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHFuYW1lIi8+IiBzZXJ2aWNlCi0gICAgICAgICogYnkgdGhlIEFwYWNoZSBBeGlzMi9KYXZhIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICAgICAgICAqLwotCi0gICAgICAgICNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7YXhpb20uaCZndDsKLSAgICAgICAgI2luY2x1ZGUgJmx0O2F4dXRpbF91dGlscy5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7YXhpb21fc29hcC5oJmd0OwotICAgICAgICAjaW5jbHVkZSAmbHQ7YXhpczJfY2xpZW50LmgmZ3Q7Ci0gICAgICAgICNpbmNsdWRlICZsdDtheGlzMl9zdHViLmgmZ3Q7Ci0KLSAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJyBhbmQgQG91cnMgXSI+Ci0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz4KLSAgICAgICAgICNpbmNsdWRlICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPi5oIgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAdHlwZSE9JycgYW5kIEBvdXJzIF0iPgotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPgotICAgICAgICAgI2luY2x1ZGUgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPi5oIgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCSNpZmRlZiBfX2NwbHVzcGx1cwotCWV4dGVybiAiQyIgewotCSNlbmRpZgotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKiBmdW5jdGlvbiBwcm90b3R5cGVzIC0gZm9yIGhlYWRlciBmaWxlICoqKioqKioqKioqKiovCi0gICAgICAgIC8qKgotICAgICAgICAgKiBheGlzMl9zdHViX2NyZWF0ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Ci0gICAgICAgICAqIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBzdHViIHdpdGggc2VydmljZXMgcG9wdWxhdGVkCi0gICAgICAgICAqIEBwYXJhbSBlbnYgRW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpCi0gICAgICAgICAqIEBwYXJhbSBjbGllbnRfaG9tZSBBeGlzMi9DIGhvbWUgKCBtYW5kYXRvcnkgKQotICAgICAgICAgKiBAcGFyYW0gZW5kcG9pbnRfdXJpIFNlcnZpY2UgZW5kcG9pbnQgdXJpKCBvcHRpb25hbCApIC0gaWYgTlVMTCBkZWZhdWx0IHBpY2tlZCBmcm9tIFdTREwgdXNlZAotICAgICAgICAgKiBAcmV0dXJuIE5ld2x5IGNyZWF0ZWQgc3R1YiBvYmplY3QKLSAgICAgICAgICovCi0gICAgICAgIGF4aXMyX3N0dWJfdCogQVhJUzJfQ0FMTAotICAgICAgICBheGlzMl9zdHViX2NyZWF0ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF4aXMyX2NoYXJfdCAqY2xpZW50X2hvbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXhpczJfY2hhcl90ICplbmRwb2ludF91cmkpOwotICAgICAgICAvKioKLSAgICAgICAgICogYXhpczJfc3R1Yl9wb3B1bGF0ZV9zZXJ2aWNlc19mb3JfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPgotICAgICAgICAgKiBwb3B1bGF0ZSB0aGUgc3ZjIGluIHN0dWIgd2l0aCB0aGUgc2VydmljZSBhbmQgb3BlcmF0aW9ucwotICAgICAgICAgKiBAcGFyYW0gc3R1YiBUaGUgc3R1YgotICAgICAgICAgKiBAcGFyYW0gZW52IGVudmlyb25tZW50ICggbWFuZGF0b3J5KQotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBBWElTMl9DQUxMIAotICAgICAgICBheGlzMl9zdHViX3BvcHVsYXRlX3NlcnZpY2VzX2Zvcl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KCBheGlzMl9zdHViX3QgKnN0dWIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGF4aXMyX3N0dWJfZ2V0X2VuZHBvaW50X3VyaV9vZl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Ci0gICAgICAgICAqIFJldHVybiB0aGUgZW5kcG9pbnQgVVJJIHBpY2tlZCBmcm9tIFdTREwKLSAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSkKLSAgICAgICAgICogQHJldHVybiBUaGUgZW5kcG9pbnQgcGlja2VkIGZyb20gV1NETAotICAgICAgICAgKi8KLSAgICAgICAgYXhpczJfY2hhcl90KiBBWElTMl9DQUxMCi0gICAgICAgIGF4aXMyX3N0dWJfZ2V0X2VuZHBvaW50X3VyaV9vZl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52KTsKLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1N5bmM9JzEnIj4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSJAbWVwPScxMCcgb3IgQG1lcD0nMTInIj4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0b3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgKiBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz4iIG9wZXJhdGlvbi4KLSAgICAgICAgICAgICAqIEBwYXJhbSBzdHViIFRoZSBzdHViIChheGlzMl9zdHViX3QpCi0gICAgICAgICAgICAgKiBAcGFyYW0gZW52IGVudmlyb25tZW50ICggbWFuZGF0b3J5KTx4c2w6aWYgdGVzdD0ibm90KCRpc1Vud3JhcFBhcmFtZXRlcnMpIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgICAgIDwveHNsOnRleHQ+KiBAcGFyYW0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICAgICAgKjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBkcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gLSBvdXRwdXQgaGVhZGVyPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRwYXJhbXMiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj5heGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZSE9JyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPiBBWElTMl9DQUxMPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+KCBheGlzMl9zdHViX3QgKnN0dWIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0cGFyYW1zIi8+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOmlmIHRlc3Q9IkBvdXJzIj4qPC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gZHBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+IC8qIG91dHB1dCBoZWFkZXIgZG91YmxlIHB0ciovPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgIDwveHNsOmlmPgotICAgIDwveHNsOmZvci1lYWNoPgotICAgIDwveHNsOmlmPiAgPCEtLWNsb3NlIGZvciAgdGVzdD0iJGlzU3luYz0nMSctLT4KLQotICAgIDwhLS0gQXN5bmMgbWV0aG9kIHByb3RvdHlwZSBnZW5lcmF0aW9uIC0tPgotICAgIDx4c2w6aWYgdGVzdD0iJGlzQXN5bmM9JzEnIj4KLSAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vcGFyYW0vQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMiciPgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRwYXJhbXMiPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtW0B0eXBlIT0nJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZnVuY3Rpb24gZm9yIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucwotICAgICAgICAgKiBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz48eHNsOnRleHQ+IiBvcGVyYXRpb24uCi0gICAgICAgICAqIEBwYXJhbSBzdHViIFRoZSBzdHViCi0gICAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpPC94c2w6dGV4dD4KLSAgICAgICAgIDwhLS0gIHNlbGVjdCBvbmx5IHRoZSBib2R5IHBhcmFtZXRlcnMgIC0tPgotICAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoJGlzVW53cmFwUGFyYW1ldGVycykiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAqIEBwYXJhbSBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb2YgdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOmlmPgotICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgKiBAcGFyYW0gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICogQHBhcmFtIHVzZXJfZGF0YSB1c2VyIGRhdGEgdG8gYmUgYWNjZXNzZWQgYnkgdGhlIGNhbGxiYWNrcwotICAgICAgICAgKiBAcGFyYW0gb25fY29tcGxldGUgY2FsbGJhY2sgdG8gaGFuZGxlIG9uIGNvbXBsZXRlCi0gICAgICAgICAqIEBwYXJhbSBvbl9lcnJvciBjYWxsYmFjayB0byBoYW5kbGUgb24gZXJyb3IKLSAgICAgICAgICovCi0KLQotICAgICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgICAgYXhpczJfc3R1Yl9zdGFydF9vcF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiggYXhpczJfc3R1Yl90ICpzdHViLCBjb25zdCBheHV0aWxfZW52X3QgKmVudjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRwYXJhbXMiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgKCBBWElTMl9DQUxMICpvbl9jb21wbGV0ZSApIChjb25zdCBheHV0aWxfZW52X3QgKiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BuYW1lIi8+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaGVhZGVyX291dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHZvaWQgKmRhdGEpICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJfc3RhdHVzX3QgKCBBWElTMl9DQUxMICpvbl9lcnJvciApIChjb25zdCBheHV0aWxfZW52X3QgKiwgaW50IGV4Y2VwdGlvbiwgdm9pZCAqZGF0YSkgKTsKLQotICAgICAgICA8L3hzbDppZj4gIDwhLS1jbG9zZSBmb3IgIHRlc3Q9IiRtZXA9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQnIi0tPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC94c2w6aWY+ICA8IS0tY2xvc2UgZm9yICB0ZXN0PSIkaXNBc3luYz0nMSctLT4KLQotICAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZC9pbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgLyoqCi0gICAgICAgKiBmdW5jdGlvbiB0byBmcmVlIGFueSBzb2FwIGlucHV0IGhlYWRlcnMgCi0gICAgICAgKiBAcGFyYW0gZW52IGVudmlyb25tZW50ICggbWFuZGF0b3J5KQotICAgICAgICovCi0gICAgIDwveHNsOmlmPgotICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgdm9pZCBBWElTMl9DQUxMCi0gICAgICAgICBheGlzMl9zdHViX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+X2ZyZWVfaW5wdXRfaGVhZGVycyhjb25zdCBheHV0aWxfZW52X3QgKmVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICA8L3hzbDppZj4KLSAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZC9vdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgIC8qKgotICAgICAgICogZnVuY3Rpb24gdG8gZnJlZSBhbnkgc29hcCBvdXRwdXQgaGVhZGVycyAKLSAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpCi0gICAgICAgKi8KLSAgICAgPC94c2w6aWY+Ci0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgdm9pZCBBWElTMl9DQUxMCi0gICAgICAgICBheGlzMl9zdHViX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoY29uc3QgYXh1dGlsX2Vudl90ICplbnYsIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQkjaWZkZWYgX19jcGx1c3BsdXMKLQl9Ci0JI2VuZGlmCi0gICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TdHViU291cmNlVGVtcGxhdGUueHNsIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvU3R1YlNvdXJjZVRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3N2E5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9TdHViU291cmNlVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLQotICAgIAotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9jbGFzcyI+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImludGVyZmFjZU5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaW50ZXJmYWNlTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNTeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzU3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc0FzeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzQXN5bmMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic29hcFZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc29hcC12ZXJzaW9uIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhbGxiYWNrbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjYWxsYmFja25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLXByZWZpeCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVmaXgiLz48L3hzbDp2YXJpYWJsZT4gPCEtLSBUaGlzIGlzIG5vIGxvbmdlciB1c2luZyAtLT4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2VydmljZW5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VydmljZW5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgLyoqCi0gICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uYwotICAgICAgICoKLSAgICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxbmFtZSIvPiIgc2VydmljZQotICAgICAgICogYnkgdGhlIEFwYWNoZSBBeGlzMi9KYXZhIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICAgICAgICovCi0KLSAgICAgICNpbmNsdWRlICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uaCIKLSAgICAgICNpbmNsdWRlICZsdDtheGlzMl9tc2cuaCZndDsKLSAgICAgICNpbmNsdWRlICZsdDtheGlzMl9wb2xpY3lfaW5jbHVkZS5oJmd0OwotICAgICAgI2luY2x1ZGUgJmx0O25lZXRoaV9lbmdpbmUuaCZndDsKLQotCi0gICAgICAvKioKLSAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBDIGltcGxlbWVudGF0aW9uCi0gICAgICAgKi8KLQotICAgICAgYXhpczJfc3R1Yl90KiBBWElTMl9DQUxMCi0gICAgICBheGlzMl9zdHViX2NyZWF0ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKmNsaWVudF9ob21lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBheGlzMl9jaGFyX3QgKmVuZHBvaW50X3VyaSkKLSAgICAgIHsKLSAgICAgICAgIGF4aXMyX3N0dWJfdCAqc3R1YiA9IE5VTEw7Ci0gICAgICAgICBheGlzMl9lbmRwb2ludF9yZWZfdCAqZW5kcG9pbnRfcmVmID0gTlVMTDsKLSAgICAgICAgIEFYSVMyX0ZVTkNfUEFSQU1fQ0hFQ0sgKGNsaWVudF9ob21lLCBlbnYsIE5VTEwpCi0KLSAgICAgICAgIGlmIChOVUxMID09IGVuZHBvaW50X3VyaSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZHBvaW50X3VyaSA9IGF4aXMyX3N0dWJfZ2V0X2VuZHBvaW50X3VyaV9vZl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KGVudik7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGVuZHBvaW50X3JlZiA9IGF4aXMyX2VuZHBvaW50X3JlZl9jcmVhdGUoZW52LCBlbmRwb2ludF91cmkpOwotCi0gICAgICAgICBzdHViID0gYXhpczJfc3R1Yl9jcmVhdGVfd2l0aF9lbmRwb2ludF9yZWZfYW5kX2NsaWVudF9ob21lIChlbnYsIGVuZHBvaW50X3JlZiwgY2xpZW50X2hvbWUpOwotCi0gICAgICAgICBpZiAoTlVMTCA9PSBzdHViKQotICAgICAgICAgewotICAgICAgICAgICAgaWYoTlVMTCAhPSBlbmRwb2ludF9yZWYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXhpczJfZW5kcG9pbnRfcmVmX2ZyZWUoZW5kcG9pbnRfcmVmLCBlbnYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICB9Ci0KLQotICAgICAgICAgYXhpczJfc3R1Yl9wb3B1bGF0ZV9zZXJ2aWNlc19mb3JfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPihzdHViLCBlbnYpOwotICAgICAgICAgcmV0dXJuIHN0dWI7Ci0gICAgICB9Ci0KLQotICAgICAgdm9pZCBBWElTMl9DQUxMCi0gICAgICBheGlzMl9zdHViX3BvcHVsYXRlX3NlcnZpY2VzX2Zvcl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+KGF4aXMyX3N0dWJfdCAqc3R1YiwgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICB7Ci0gICAgICAgICBheGlzMl9zdmNfY2xpZW50X3QgKnN2Y19jbGllbnQgPSBOVUxMOwotICAgICAgICAgYXh1dGlsX3FuYW1lX3QgKnN2Y19xbmFtZSA9ICBOVUxMOwotICAgICAgICAgYXh1dGlsX3FuYW1lX3QgKm9wX3FuYW1lID0gIE5VTEw7Ci0gICAgICAgICBheGlzMl9zdmNfdCAqc3ZjID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX29wX3QgKm9wID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX29wX3QgKmFubm9uX29wID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX21zZ190ICptc2dfb3V0ID0gTlVMTDsKLSAgICAgICAgIGF4aXMyX21zZ190ICptc2dfaW4gPSBOVUxMOwotICAgICAgICAgYXhpczJfbXNnX3QgKm1zZ19vdXRfZmF1bHQgPSBOVUxMOwotICAgICAgICAgYXhpczJfbXNnX3QgKm1zZ19pbl9mYXVsdCA9IE5VTEw7Ci0gICAgICAgICBheGlzMl9wb2xpY3lfaW5jbHVkZV90ICpwb2xpY3lfaW5jbHVkZSA9IE5VTEw7Ci0KLSAgICAgICAgIGF4aXMyX2Rlc2NfdCAqZGVzYyA9IE5VTEw7Ci0gICAgICAgICBheGlvbV9ub2RlX3QgKnBvbGljeV9ub2RlID0gTlVMTDsKLSAgICAgICAgIGF4aW9tX2VsZW1lbnRfdCAqcG9saWN5X3Jvb3RfZWxlID0gTlVMTDsKLSAgICAgICAgIG5lZXRoaV9wb2xpY3lfdCAqbmVldGhpX3BvbGljeSA9IE5VTEw7Ci0gICAgICAgICBheGlzMl9zdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICAgICAgIC8qIE1vZGlmeWluZyB0aGUgU2VydmljZSAqLwotICAgICAgICAgc3ZjX2NsaWVudCA9IGF4aXMyX3N0dWJfZ2V0X3N2Y19jbGllbnQgKHN0dWIsIGVudiApOwotICAgICAgICAgc3ZjID0gKGF4aXMyX3N2Y190KilheGlzMl9zdmNfY2xpZW50X2dldF9zdmMoIHN2Y19jbGllbnQsIGVudiApOwotCi0gICAgICAgICBhbm5vbl9vcCA9IGF4aXMyX3N2Y19nZXRfb3Bfd2l0aF9uYW1lKHN2YywgZW52LCBBWElTMl9BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgICBtc2dfb3V0ID0gYXhpczJfb3BfZ2V0X21zZyhhbm5vbl9vcCwgZW52LCBBWElTMl9NU0dfT1VUKTsKLSAgICAgICAgIG1zZ19pbiA9IGF4aXMyX29wX2dldF9tc2coYW5ub25fb3AsIGVudiwgQVhJUzJfTVNHX0lOKTsKLSAgICAgICAgIG1zZ19vdXRfZmF1bHQgPSBheGlzMl9vcF9nZXRfbXNnKGFubm9uX29wLCBlbnYsIEFYSVMyX01TR19PVVRfRkFVTFQpOwotICAgICAgICAgbXNnX2luX2ZhdWx0ID0gYXhpczJfb3BfZ2V0X21zZyhhbm5vbl9vcCwgZW52LCBBWElTMl9NU0dfSU5fRkFVTFQpOwotCi0gICAgICAgICBzdmNfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPiIgLE5VTEwsIE5VTEwpOwotICAgICAgICAgYXhpczJfc3ZjX3NldF9xbmFtZSAoc3ZjLCBlbnYsIHN2Y19xbmFtZSk7Ci0JCSBheHV0aWxfcW5hbWVfZnJlZShzdmNfcW5hbWUsZW52KTsKLQotICAgICAgICAgLyogY3JlYXRpbmcgdGhlIG9wZXJhdGlvbnMqLwotCi0gICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgb3BfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxwYXJ0Ii8+IiAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICBvcCA9IGF4aXMyX29wX2NyZWF0ZV93aXRoX3FuYW1lKGVudiwgb3BfcW5hbWUpOwotICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG1lcD0nMTAnIj4KLSAgICAgICAgICAgICAgIGF4aXMyX29wX3NldF9tc2dfZXhjaGFuZ2VfcGF0dGVybihvcCwgZW52LCBBWElTMl9NRVBfVVJJX09VVF9PTkxZKTsKLSAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgYXhpczJfb3Bfc2V0X21zZ19leGNoYW5nZV9wYXR0ZXJuKG9wLCBlbnYsIEFYSVMyX01FUF9VUklfT1VUX0lOKTsKLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgYXhpczJfbXNnX2luY3JlbWVudF9yZWYobXNnX291dCwgZW52KTsKLSAgICAgICAgICAgYXhpczJfbXNnX2luY3JlbWVudF9yZWYobXNnX2luLCBlbnYpOwotICAgICAgICAgICBheGlzMl9tc2dfaW5jcmVtZW50X3JlZihtc2dfb3V0X2ZhdWx0LCBlbnYpOwotICAgICAgICAgICBheGlzMl9tc2dfaW5jcmVtZW50X3JlZihtc2dfaW5fZmF1bHQsIGVudik7Ci0gICAgICAgICAgIGF4aXMyX29wX2FkZF9tc2cob3AsIGVudiwgQVhJUzJfTVNHX09VVCwgbXNnX291dCk7Ci0gICAgICAgICAgIGF4aXMyX29wX2FkZF9tc2cob3AsIGVudiwgQVhJUzJfTVNHX0lOLCBtc2dfaW4pOwotICAgICAgICAgICBheGlzMl9vcF9hZGRfbXNnKG9wLCBlbnYsIEFYSVMyX01TR19PVVRfRkFVTFQsIG1zZ19vdXRfZmF1bHQpOwotICAgICAgICAgICBheGlzMl9vcF9hZGRfbXNnKG9wLCBlbnYsIEFYSVMyX01TR19JTl9GQVVMVCwgbXNnX2luX2ZhdWx0KTsKLSAgICAgICAKLSAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9AcG9saWN5Ij4KLSAgICAgICAgICAgLyogYWRkaW5nIHRoZSBpbnB1dCBwb2xpY2llcyAqLwotCi0gICAgICAgICAgIHBvbGljeV9ub2RlID0gYXhpb21fbm9kZV9jcmVhdGVfZnJvbV9idWZmZXIoZW52LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L0Bwb2xpY3kiLz4iKTsKLSAgICAgICAgICAgcG9saWN5X3Jvb3RfZWxlID0gKGF4aW9tX2VsZW1lbnRfdCAqKSBheGlvbV9ub2RlX2dldF9kYXRhX2VsZW1lbnQgKHBvbGljeV9ub2RlLCBlbnYpOwotCi0gICAgICAgICAgIG5lZXRoaV9wb2xpY3kgPSBuZWV0aGlfZW5naW5lX2dldF9wb2xpY3kgKGVudiwgcG9saWN5X25vZGUsIHBvbGljeV9yb290X2VsZSk7Ci0gICAgICAgICAgIHN0YXR1cyA9IGF4aXMyX3N2Y19jbGllbnRfc2V0X3BvbGljeShzdmNfY2xpZW50LCBlbnYsIG5lZXRoaV9wb2xpY3kpOwotCi0gICAgICAgICAgIGlmKHN0YXR1cyA9PSBBWElTMl9GQUlMVVJFKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX0lOVkFMSURfTlVMTF9QQVJBTSwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJuZWV0aGkgcG9saWN5IHNldHRpbmcgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgIGF4aXMyX3N2Y19hZGRfb3Aoc3ZjLCBlbnYsIG9wKTsKLSAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqcmV0dXJuIGVuZCBwb2ludCBwaWNrZWQgZnJvbSB3c2RsCi0gICAgICAgKi8KLSAgICAgIGF4aXMyX2NoYXJfdCogQVhJUzJfQ0FMTAotICAgICAgYXhpczJfc3R1Yl9nZXRfZW5kcG9pbnRfdXJpX29mXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz4oIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52ICkKLSAgICAgIHsKLSAgICAgICAgYXhpczJfY2hhcl90ICplbmRwb2ludF91cmkgPSBOVUxMOwotICAgICAgICAvKiBzZXQgdGhlIGFkZHJlc3MgZnJvbSBoZXJlICovCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJlbmRwb2ludCI+Ci0gICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKT0xIj4KLSAgICAgICAgICAgICAgZW5kcG9pbnRfdXJpID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IjsKLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIHJldHVybiBlbmRwb2ludF91cmk7Ci0gICAgICB9Ci0KLQotICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dG91cnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQG91cnMiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vcGFyYW0vQHR5cGUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhcHMtb3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AY2Fwcy10eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvYXBBY3Rpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc29hcGFjdGlvbiI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1ucyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4gPC94c2w6dmFyaWFibGU+Ci0KLSAgICA8IS0tIENvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIGluLW91dCBtZXAgLS0+Ci0gICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMiciPgotICAgICAgPHhzbDppZiB0ZXN0PSIkaXNTeW5jPScxJyI+Ci0gICAgICAgICAvKioKLSAgICAgICAgICAqIGF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUKLSAgICAgICAgICAqIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPiIgb3BlcmF0aW9uLgotICAgICAgICAgICogQHBhcmFtIHN0dWIgVGhlIHN0dWIgKGF4aXMyX3N0dWJfdCkKLSAgICAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpPHhzbDppZiB0ZXN0PSJub3QoJGlzVW53cmFwUGFyYW1ldGVycykiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICAqPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIGRwXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiAtIG91dHB1dCBoZWFkZXI8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+Ci0gICAgICAgICAgKi8KLQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtcyI+Ci0gICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPnZvaWQgQVhJUzJfQ0FMTDwveHNsOndoZW4+IDwhLS10aGlzIGNhc2UgaXMgdW5leHBlY3RlZC0tPgotICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+IEFYSVMyX0NBTEw8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICBheGlzMl9zdHViX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0PiggYXhpczJfc3R1Yl90ICpzdHViLCBjb25zdCBheHV0aWxfZW52X3QgKmVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHBhcmFtcyIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOmlmIHRlc3Q9IkBvdXJzIj4qPC94c2w6aWY+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBkcF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4gLyogb3V0cHV0IGhlYWRlciBkb3VibGUgcHRyKi88L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGF4aXMyX3N2Y19jbGllbnRfdCAqc3ZjX2NsaWVudCA9IE5VTEw7Ci0gICAgICAgICAgICBheGlzMl9vcHRpb25zX3QgKm9wdGlvbnMgPSBOVUxMOwotICAgICAgICAgICAgYXhpb21fbm9kZV90ICpyZXRfbm9kZSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGNvbnN0IGF4aXMyX2NoYXJfdCAqc29hcF9hY3Rpb24gPSBOVUxMOwotICAgICAgICAgICAgYXh1dGlsX3FuYW1lX3QgKm9wX3FuYW1lID0gIE5VTEw7Ci0gICAgICAgICAgICBheGlvbV9ub2RlX3QgKnBheWxvYWQgPSBOVUxMOwotICAgICAgICAgICAgYXhpczJfYm9vbF90IGlzX3NvYXBfYWN0X3NldCA9IEFYSVMyX1RSVUU7Ci0gICAgICAgICAgICBheHV0aWxfc3RyaW5nX3QgKnNvYXBfYWN0ID0gTlVMTDsKLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW0vQG91cnMiPgotICAgICAgICAgICAJICAgIDwhLS0gdGhpcyBtZWFucyBkYXRhIGJpbmRpbmcgaXMgZW5hYmxlIC0tPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz4gcmV0X3ZhbDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqaW5wdXRfaGVhZGVyID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICBheGlzMl9vcF9jbGllbnRfdCAqb3BfY2xpZW50ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBjb25zdCBheGlzMl9tc2dfY3R4X3QgKm1zZ19jdHggPSBOVUxMOwotICAgICAgICAgICAgICAgIGF4aW9tX3NvYXBfZW52ZWxvcGVfdCAqcmVzX3NvYXBfZW52ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBheGlvbV9zb2FwX2hlYWRlcl90ICpyZXNfc29hcF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqaGVhZGVyX2Jhc2Vfbm9kZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpvdXRwdXRfaGVhZGVyID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICA8IS0tIGZvciBzZXJ2aWNlIGNsaWVudCB0aGUgMXN0IGlucHV0IHBhcmFtIGlzIHRoZSBwYXlsb2FkIC0tPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaXJzdFBhcmFtIiBzZWxlY3Q9ImlucHV0L3BhcmFtWzFdIi8+Ci0KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkZmlyc3RQYXJhbS9AdHlwZSE9JyciPgotICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmaXJzdFBhcmFtL0BvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGZvciB1bndyYXBwZWQgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyX2FkYl9vYmoiPndyYXBwZXJfYWRiX29iajwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlyc3RQYXJhbS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRmaXJzdFBhcmFtL0B0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AY29tcGxleHR5cGUiPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlyc3RQYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD48eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+KTwveHNsOmlmPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX2FkYl9vYmoiLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlyc3RQYXJhbS9AbmFtZSIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0BuYW1lIi8+OwotICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgc3ZjX2NsaWVudCA9IGF4aXMyX3N0dWJfZ2V0X3N2Y19jbGllbnQoc3R1YiwgZW52ICk7Ci0gICAgICAgICAgICA8IS0tIGhhbmRsaW5nIGhlYWRlciBwYXJhbXMgLS0+Ci0gICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBhZGRpbmcgaW5wdXQgaGVhZGVycyAtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGZvciB1bndyYXBwZWQgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyX2FkYl9vYmoiPndyYXBwZXJfYWRiX29iajwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl90eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+ID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHdyYXBwZXJfdHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAY29tcGxleHR5cGUiPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQGNvbXBsZXh0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iQGNvbXBsZXh0eXBlIj4pPC94c2w6aWY+KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd3JhcHBlcl90eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+OwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgYXhpczJfc3ZjX2NsaWVudF9hZGRfaGVhZGVyKHN2Y19jbGllbnQsIGVudiwgaW5wdXRfaGVhZGVyKTsKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICBvcHRpb25zID0gYXhpczJfc3R1Yl9nZXRfb3B0aW9ucyggc3R1YiwgZW52KTsKLSAgICAgICAgICAgIGlmIChOVUxMID09IG9wdGlvbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRVJST1JfU0VUKGVudi0+ZXJyb3IsIEFYSVMyX0VSUk9SX0lOVkFMSURfTlVMTF9QQVJBTSwgQVhJUzJfRkFJTFVSRSk7Ci0gICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJvcHRpb25zIGlzIG51bGwgaW4gc3R1YiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KU5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb2FwX2FjdCA9IGF4aXMyX29wdGlvbnNfZ2V0X3NvYXBfYWN0aW9uKCBvcHRpb25zLCBlbnYgKTsKLSAgICAgICAgICAgIGlmIChOVUxMID09IHNvYXBfYWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc19zb2FwX2FjdF9zZXQgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgc29hcF9hY3Rpb24gPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb2FwQWN0aW9uIi8+IjsKLSAgICAgICAgICAgICAgc29hcF9hY3QgPSBheHV0aWxfc3RyaW5nX2NyZWF0ZShlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iKTsKLSAgICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF9hY3Rpb24ob3B0aW9ucywgZW52LCBzb2FwX2FjdCk7ICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNvYXBWZXJzaW9uPSdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUnIj4KLSAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X3NvYXBfdmVyc2lvbihvcHRpb25zLCBlbnYsIEFYSU9NX1NPQVAxMik7Ci0gICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X3NvYXBfdmVyc2lvbihvcHRpb25zLCBlbnYsIEFYSU9NX1NPQVAxMSk7Ci0gICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgcmV0X25vZGUgPSAgYXhpczJfc3ZjX2NsaWVudF9zZW5kX3JlY2VpdmVfd2l0aF9vcF9xbmFtZSggc3ZjX2NsaWVudCwgZW52LCBvcF9xbmFtZSwgcGF5bG9hZCk7Ci0gCi0gICAgICAgICAgICBpZiAoIWlzX3NvYXBfYWN0X3NldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkc3R5bGU9J2RvYyciPgotICAgICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX2FjdGlvbihvcHRpb25zLCBlbnYsIE5VTEwpOyAgICAKLSAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X2FjdGlvbiggb3B0aW9ucywgZW52LCBOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHNvYXBfYWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBheHV0aWxfc3RyaW5nX2ZyZWUoc29hcF9hY3QsIGVudik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIDwhLS0gZXh0cmFjdCBvdXQgdGhlIGhlYWRlcnMgYXQgdGhpcyBwb2ludCAtLT4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgb3BfY2xpZW50ID0gYXhpczJfc3ZjX2NsaWVudF9nZXRfb3BfY2xpZW50KHN2Y19jbGllbnQsIGVudik7Ci0gICAgICAgICAgICAgICAgaWYoIW9wX2NsaWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIm9wIGNsaWVudCBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KU5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1zZ19jdHggPSBheGlzMl9vcF9jbGllbnRfZ2V0X21zZ19jdHgob3BfY2xpZW50LCBlbnYsIEFYSVMyX1dTRExfTUVTU0FHRV9MQUJFTF9PVVQpOwotICAgICAgICAgICAgICAgIGlmKCFtc2dfY3R4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAicmVzcG9uc2UgbXNnIGN0eCBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KU5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc19zb2FwX2VudiA9IGF4aXMyX21zZ19jdHhfZ2V0X3Jlc3BvbnNlX3NvYXBfZW52ZWxvcGUobXNnX2N0eCwgZW52KTsKLSAgICAgICAgICAgICAgICBpZighcmVzX3NvYXBfZW52KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAicmVzcG9uc2UgZXZlbG9wZSBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KU5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc19zb2FwX2hlYWRlciA9IGF4aW9tX3NvYXBfZW52ZWxvcGVfZ2V0X2hlYWRlcihyZXNfc29hcF9lbnYsIGVudik7Ci0KLSAgICAgICAgICAgICAgICBpZihyZXNfc29hcF9oZWFkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJfYmFzZV9ub2RlID0gYXhpb21fc29hcF9oZWFkZXJfZ2V0X2Jhc2Vfbm9kZShyZXNfc29hcF9oZWFkZXIsIGVudik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIWhlYWRlcl9iYXNlX25vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJSZXF1aXJlZCByZXNwb25zZSBoZWFkZXIgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InBvc2l0aW9uKCk9MSI+Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9maXJzdF9jaGlsZChoZWFkZXJfYmFzZV9ub2RlLCBlbnYpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlKG91dHB1dF9oZWFkZXIgJmFtcDsmYW1wOyBheGlvbV9ub2RlX2dldF9ub2RlX3R5cGUob3V0cHV0X2hlYWRlciwgZW52KSAhPSBBWElPTV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaGVhZGVyID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKG91dHB1dF9oZWFkZXIsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaGVhZGVyID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKG91dHB1dF9oZWFkZXIsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUob3V0cHV0X2hlYWRlciAmYW1wOyZhbXA7IGF4aW9tX25vZGVfZ2V0X25vZGVfdHlwZShvdXRwdXRfaGVhZGVyLCBlbnYpICE9IEFYSU9NX0VMRU1FTlQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcob3V0cHV0X2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl92YXIiPjx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICAgICAgICAgIGlmKCBOVUxMID09IG91dHB1dF9oZWFkZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJSZXNwb25zZSBoZWFkZXIgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgLyogeW91IGNhbid0IGhhdmUgYSByZXNwb25zZSBoZWFkZXIgTlVMTCwganVzdCBmcmVlIHRoaW5ncyBhbmQgZXhpdCAqLwotICAgICAgICAgICAgICAgICAgICBheGlzMl9zdHViX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL291dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPilOVUxMOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogeW91IGNhbiBoYXZlIHRoZXNlIHBhcmFtZXRlcnMgTlVMTCwgdG8gYXZvaWQgZGVzZXJpYWxpemluZyB0aGVtICovCi0gICAgICAgICAgICAgICAgaWYoZHBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2NyZWF0ZShlbnYpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYsICZhbXA7b3V0cHV0X2hlYWRlciwgTlVMTCwgQVhJUzJfRkFMU0UgKSA9PSBBWElTMl9GQUlMVVJFKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgdG9vIHdpbGwgYmUgZnJlZWQgZnJvbSB0aGUgX2ZyZWVfb3V0cHV0X2hlYWRlcnMgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2ZyZWUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+LCBlbnYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+X2Rlc2VyaWFsaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIGJlIGR1ZSB0byBhbiBpbnZhbGlkIG91dHB1dCBoZWFkZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSBpbnB1dF9oZWFkZXI7Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgKmRwXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgPCEtLSBqdXN0IGhhbmRsZSBuZXh0IHR5cGUtLT4KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPgotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBOVUxMID09IHJldF9ub2RlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fY3JlYXRlKGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUocmV0X3ZhbCwgZW52LCAmYW1wO3JldF9ub2RlLCBOVUxMLCBBWElTMl9GQUxTRSApID09IEFYSVMyX0ZBSUxVUkUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldF92YWwgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlKHJldF92YWwsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgcmV0dXJudGVkIGZyb20gdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKG91dHB1dC9wYXJhbS9AdHlwZSwgJ190KicpIi8+X2Rlc2VyaWFsaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgc2hvdWxkIGJlIGR1ZSB0byBhbiBpbnZhbGlkIFhNTCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4pTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlLCAnX3QqJykiLz5fZnJlZV9wb3BwaW5nX3ZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZnJlZV9wb3BwaW5nX3ZhbHVlKHJldF92YWwsIGVudik8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbS9AY29tcGxleHR5cGUiPiwgZW52KTwveHNsOmlmPjsKLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0X25vZGU7Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPiAgPCEtLWNsb3NlIGZvciAgdGVzdD0iJGlzU3luYz0nMSctLT4KLSAgICAgICA8L3hzbDppZj4gPCEtLSBjbG9zZSBmb3IgIHRlc3Q9IiRtZXA9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQnIC0tPgotCi0gIDwveHNsOmZvci1lYWNoPgotCi0gIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0b3VycyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9Ab3VycyI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOnZhcmlhYmxlPgotCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dHBhcmFtcyI+Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6dmFyaWFibGU+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhcHMtb3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AY2Fwcy10eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0eWxlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvYXBBY3Rpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc29hcGFjdGlvbiI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1ucyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4gPC94c2w6dmFyaWFibGU+Ci0KLQotICAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzEyJyI+Ci0gICAgICAgIDwhLS0gQXN5bmMgbWV0aG9kIGdlbmVyYXRpb24gLS0+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzQXN5bmM9JzEnIj4KLQotICAgICAgICBzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhCi0gICAgICAgIHsgICAKLSAgICAgICAgICAgIHZvaWQgKmRhdGE7Ci0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCAoIEFYSVMyX0NBTEwgKm9uX2NvbXBsZXRlICkgKGNvbnN0IGF4dXRpbF9lbnZfdCAqLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQG5hbWUiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfb3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl9vdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+LCB2b2lkICpkYXRhKTsKLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190ICggQVhJUzJfQ0FMTCAqb25fZXJyb3IgKSAoY29uc3QgYXh1dGlsX2Vudl90ICosIGludCBleGNlcHRpb24sIHZvaWQgKmRhdGEpOwotICAgICAgICB9OwotCi0gICAgICAgIHN0YXRpYyBheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMIGF4aXMyX3N0dWJfb25fZXJyb3JfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oYXhpczJfY2FsbGJhY2tfdCAqY2FsbGJhY2ssIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCBpbnQgZXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCAoIEFYSVMyX0NBTEwgKm9uX2Vycm9yICkgKGNvbnN0IGF4dXRpbF9lbnZfdCAqLCBpbnQsIHZvaWQgKmRhdGEpOwotICAgICAgICAgICAgc3RydWN0IGF4aXMyX3N0dWJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fY2FsbGJhY2tfZGF0YSogY2FsbGJhY2tfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEgPSBOVUxMOwotCi0gICAgICAgICAgICBheGlzMl9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIAotICAgICAgICAgICAgY2FsbGJhY2tfZGF0YSA9IChzdHJ1Y3QgYXhpczJfc3R1Yl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPl9jYWxsYmFja19kYXRhKilheGlzMl9jYWxsYmFja19nZXRfZGF0YShjYWxsYmFjayk7Ci0gICAgICAgIAotICAgICAgICAgICAgdXNlcl9kYXRhID0gY2FsbGJhY2tfZGF0YS0+ZGF0YTsKLSAgICAgICAgICAgIG9uX2Vycm9yID0gY2FsbGJhY2tfZGF0YS0+b25fZXJyb3I7Ci0gICAgICAgIAotICAgICAgICAgICAgc3RhdHVzID0gb25fZXJyb3IoZW52LCBleGNlcHRpb24sIHVzZXJfZGF0YSk7Ci0KLSAgICAgICAgICAgIGlmKGNhbGxiYWNrX2RhdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQVhJUzJfRlJFRShlbnYtPmFsbG9jYXRvciwgY2FsbGJhY2tfZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9IAotCi0gICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwgYXhpczJfc3R1Yl9vbl9jb21wbGV0ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihheGlzMl9jYWxsYmFja190ICpjYWxsYmFjaywgY29uc3QgYXh1dGlsX2Vudl90ICplbnYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGF4aXMyX3N0YXR1c190ICggQVhJUzJfQ0FMTCAqb25fY29tcGxldGUgKSAoY29uc3QgYXh1dGlsX2Vudl90ICosIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjx4c2w6dGV4dD4gXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AbmFtZSIvPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl9vdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX291dHB1dHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHZvaWQgKmRhdGEpOwotICAgICAgICAgICAgc3RydWN0IGF4aXMyX3N0dWJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fY2FsbGJhY2tfZGF0YSogY2FsbGJhY2tfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgYXhpczJfc3RhdHVzX3Qgc3RhdHVzID0gQVhJUzJfU1VDQ0VTUzsKLSAKLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtL0BvdXJzIj4KLSAgICAgICAgICAgCSAgICA8IS0tIHRoaXMgbWVhbnMgZGF0YSBiaW5kaW5nIGlzIGVuYWJsZSAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIi8+IHJldF92YWw7Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICAgICAgYXhpb21fbm9kZV90ICpyZXRfbm9kZSA9IE5VTEw7Ci0gICAgICAgICAgICBheGlvbV9zb2FwX2VudmVsb3BlX3QgKnNvYXBfZW52ZWxvcGUgPSBOVUxMOwotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIGF4aW9tX3NvYXBfaGVhZGVyX3QgKnJlc19zb2FwX2hlYWRlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICpoZWFkZXJfYmFzZV9ub2RlID0gTlVMTDsKLSAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKm91dHB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEgPSAoc3RydWN0IGF4aXMyX3N0dWJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fY2FsbGJhY2tfZGF0YSopYXhpczJfY2FsbGJhY2tfZ2V0X2RhdGEoY2FsbGJhY2spOwotCi0gICAgICAgICAgICBzb2FwX2VudmVsb3BlID0gYXhpczJfY2FsbGJhY2tfZ2V0X2VudmVsb3BlKGNhbGxiYWNrLCBlbnYpOwotICAgICAgICAgICAgaWYoc29hcF9lbnZlbG9wZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBheGlvbV9zb2FwX2JvZHlfdCAqc29hcF9ib2R5OwotICAgICAgICAgICAgICAgIHNvYXBfYm9keSA9IGF4aW9tX3NvYXBfZW52ZWxvcGVfZ2V0X2JvZHkoc29hcF9lbnZlbG9wZSwgZW52KTsKLSAgICAgICAgICAgICAgICBpZihzb2FwX2JvZHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBheGlvbV9ub2RlX3QgKmJvZHlfbm9kZSA9IGF4aW9tX3NvYXBfYm9keV9nZXRfYmFzZV9ub2RlKHNvYXBfYm9keSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgaWYoYm9keV9ub2RlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRfbm9kZSA9IGF4aW9tX25vZGVfZ2V0X2ZpcnN0X2NoaWxkKGJvZHlfbm9kZSwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8IS0tIGV4dHJhY3Qgb3V0IHRoZSBoZWFkZXJzIGF0IHRoaXMgcG9pbnQgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgcmVzX3NvYXBfaGVhZGVyID0gYXhpb21fc29hcF9lbnZlbG9wZV9nZXRfaGVhZGVyKHNvYXBfZW52ZWxvcGUsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYocmVzX3NvYXBfaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfYmFzZV9ub2RlID0gYXhpb21fc29hcF9oZWFkZXJfZ2V0X2Jhc2Vfbm9kZShyZXNfc29hcF9oZWFkZXIsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZighaGVhZGVyX2Jhc2Vfbm9kZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiUmVxdWlyZWQgcmVzcG9uc2UgaGVhZGVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihoZWFkZXJfYmFzZV9ub2RlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09IEFYSVMyX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2hlYWRlciA9IGF4aW9tX25vZGVfZ2V0X2ZpcnN0X2NoaWxkKGhlYWRlcl9iYXNlX25vZGUsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKG91dHB1dF9oZWFkZXIgJmFtcDsmYW1wOyBheGlvbV9ub2RlX2dldF9ub2RlX3R5cGUob3V0cHV0X2hlYWRlciwgZW52KSAhPSBBWElPTV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcob3V0cHV0X2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfaGVhZGVyID0gYXhpb21fbm9kZV9nZXRfbmV4dF9zaWJsaW5nKG91dHB1dF9oZWFkZXIsIGVudik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKG91dHB1dF9oZWFkZXIgJmFtcDsmYW1wOyBheGlvbV9ub2RlX2dldF9ub2RlX3R5cGUob3V0cHV0X2hlYWRlciwgZW52KSAhPSBBWElPTV9FTEVNRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9oZWFkZXIgPSBheGlvbV9ub2RlX2dldF9uZXh0X3NpYmxpbmcob3V0cHV0X2hlYWRlciwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfdmFyIj48eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYoIE5VTEwgPT0gb3V0cHV0X2hlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiUmVzcG9uc2UgaGVhZGVyIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBpcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB5b3UgY2FuJ3QgaGF2ZSBhIHJlc3BvbnNlIGhlYWRlciBOVUxMLCBqdXN0IGZyZWUgdGhpbmdzIGFuZCBleGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9zdHViX29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPl9mcmVlX291dHB1dF9oZWFkZXJzKGVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL291dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQVhJUzJfRkFJTFVSRTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2NyZWF0ZShlbnYpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAdHlwZSwgJ190KicpIi8+X2Rlc2VyaWFsaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52LCAmYW1wO291dHB1dF9oZWFkZXIsIE5VTEwsIEFYSVMyX0ZBTFNFICkgPT0gQVhJUzJfRkFJTFVSRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgdG9vIHdpbGwgYmUgZnJlZWQgZnJvbSB0aGUgX2ZyZWVfb3V0cHV0X2hlYWRlcnMgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfS0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIk5VTEwgcmV0dXJudGVkIGZyb20gdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPl9kZXNlcmlhbGl6ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBzaG91bGQgYmUgZHVlIHRvIGFuIGludmFsaWQgb3V0cHV0IGhlYWRlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+X2ZyZWVfb3V0cHV0X2hlYWRlcnMoZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iLi4vLi4vb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpIT0xIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBWElTMl9GQUlMVVJFOyAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IG91dHB1dF9oZWFkZXI7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+IDwhLS0gZm9yIGVhY2ggb3V0cHV0IGhlYWRlciBwYXJhbSAtLT4KLQotICAgICAgICAgICAgICAgICAgICA8IS0tIGZyZWUgdGhlbSBpZiBhbnl0aGluZyBnb2VzIHdyb25nIC0tPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMgPT0gQVhJUzJfRkFJTFVSRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNlcl9kYXRhID0gY2FsbGJhY2tfZGF0YS0+ZGF0YTsKLSAgICAgICAgICAgIG9uX2NvbXBsZXRlID0gY2FsbGJhY2tfZGF0YS0+b25fY29tcGxldGU7Ci0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXRwdXQvcGFyYW0vQG91cnMiPgotICAgICAgICAgICAgICAgICAgICBpZihyZXRfbm9kZSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRfdmFsID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fY3JlYXRlKGVudik7Ci0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZGVzZXJpYWxpemUocmV0X3ZhbCwgZW52LCAmYW1wO3JldF9ub2RlLCBOVUxMLCBBWElTMl9GQUxTRSApID09IEFYSVMyX0ZBSUxVUkUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVhJUzJfTE9HX0VSUk9SKCBlbnYtPmxvZywgQVhJUzJfTE9HX1NJLCAiTlVMTCByZXR1cm50ZWQgZnJvbSB0aGUgTGVuZFJlc3BvbnNlX2Rlc2VyaWFsaXplOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHNob3VsZCBiZSBkdWUgdG8gYW4gaW52YWxpZCBYTUwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShvdXRwdXQvcGFyYW0vQHR5cGUsICdfdConKSIvPl9mcmVlKHJldF92YWwsIGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IE5VTEw7IAotICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGZvciB1bndyYXBwZWQgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYocmV0X3ZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb25fY29tcGxldGUoZW52LCAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9wYXJhbS9AdHlwZSIvPilOVUxMPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4sIHVzZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uX2NvbXBsZXRlKGVudiwgPHhzbDppZiB0ZXN0PSJvdXRwdXQvcGFyYW0vQGNvbXBsZXh0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSwgJ190KicpIi8+X2ZyZWVfcG9wcGluZ192YWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUob3V0cHV0L3BhcmFtL0B0eXBlLCAnX3QqJykiLz5fZnJlZV9wb3BwaW5nX3ZhbHVlKHJldF92YWwsIGVudik8eHNsOmlmIHRlc3Q9Im91dHB1dC9wYXJhbS9AY29tcGxleHR5cGUiPiwgZW52KTwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+LCB1c2VyX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uX2NvbXBsZXRlKGVudiwgcmV0X3ZhbDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+LCB1c2VyX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gb25fY29tcGxldGUoZW52LCByZXRfbm9kZTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pl88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPiwgdXNlcl9kYXRhKTsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gCi0gICAgICAgICAgICBpZihjYWxsYmFja19kYXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFYSVMyX0ZSRUUoZW52LT5hbGxvY2F0b3IsIGNhbGxiYWNrX2RhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgICogYXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZSBmb3IgYXN5bmNocm9ub3VzIGludm9jYXRpb25zCi0gICAgICAgICAgKiBmb3IgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcW5hbWUiLz48eHNsOnRleHQ+IiBvcGVyYXRpb24uCi0gICAgICAgICAgKiBAcGFyYW0gc3R1YiBUaGUgc3R1YgotICAgICAgICAgICogQHBhcmFtIGVudiBlbnZpcm9ubWVudCAoIG1hbmRhdG9yeSk8L3hzbDp0ZXh0PgotICAgICAgICAgIDwhLS0gIHNlbGVjdCBvbmx5IHRoZSBib2R5IHBhcmFtZXRlcnMgIC0tPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRpc1Vud3JhcFBhcmFtZXRlcnMpIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgICogQHBhcmFtIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+PHhzbDp0ZXh0PgotICAgICAgICAgICogQHBhcmFtIF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvZiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6Zm9yLWVhY2g+PC94c2w6aWY+Ci0gICAgICAgICAgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSB0byBiZSBhY2Nlc3NlZCBieSB0aGUgY2FsbGJhY2tzCi0gICAgICAgICAgKiBAcGFyYW0gb25fY29tcGxldGUgY2FsbGJhY2sgdG8gaGFuZGxlIG9uIGNvbXBsZXRlCi0gICAgICAgICAgKiBAcGFyYW0gb25fZXJyb3IgY2FsbGJhY2sgdG8gaGFuZGxlIG9uIGVycm9yCi0gICAgICAgICAgKi8KLQotICAgICAgICAgdm9pZCBBWElTMl9DQUxMCi0gICAgICAgICBheGlzMl9zdHViX3N0YXJ0X29wXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCBheGlzMl9zdHViX3QgKnN0dWIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHBhcmFtcyIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzMl9zdGF0dXNfdCAoIEFYSVMyX0NBTEwgKm9uX2NvbXBsZXRlICkgKGNvbnN0IGF4dXRpbF9lbnZfdCAqLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQG5hbWUiLz48eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfb3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl9vdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+LCB2b2lkICpkYXRhKSAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyX3N0YXR1c190ICggQVhJUzJfQ0FMTCAqb25fZXJyb3IgKSAoY29uc3QgYXh1dGlsX2Vudl90ICosIGludCBleGNlcHRpb24sIHZvaWQgKmRhdGEpICkKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgYXhpczJfY2FsbGJhY2tfdCAqY2FsbGJhY2sgPSBOVUxMOwotCi0gICAgICAgICAgICBheGlzMl9zdmNfY2xpZW50X3QgKnN2Y19jbGllbnQgPSBOVUxMOwotICAgICAgICAgICAgYXhpczJfb3B0aW9uc190ICpvcHRpb25zID0gTlVMTDsKLQotICAgICAgICAgICAgY29uc3QgYXhpczJfY2hhcl90ICpzb2FwX2FjdGlvbiA9IE5VTEw7Ci0gICAgICAgICAgICBheGlvbV9ub2RlX3QgKnBheWxvYWQgPSBOVUxMOwotCi0gICAgICAgICAgICBheGlzMl9ib29sX3QgaXNfc29hcF9hY3Rfc2V0ID0gQVhJUzJfVFJVRTsKLSAgICAgICAgICAgIGF4dXRpbF9zdHJpbmdfdCAqc29hcF9hY3QgPSBOVUxMOwotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICAgYXhpb21fbm9kZV90ICppbnB1dF9oZWFkZXIgPSBOVUxMOwotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0cnVjdCBheGlzMl9zdHViXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+X2NhbGxiYWNrX2RhdGEgKmNhbGxiYWNrX2RhdGE7Ci0KLSAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEgPSAoc3RydWN0IGF4aXMyX3N0dWJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fY2FsbGJhY2tfZGF0YSopIEFYSVMyX01BTExPQyhlbnYtPmFsbG9jYXRvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGF4aXMyX3N0dWJfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fY2FsbGJhY2tfZGF0YSkpOwotICAgICAgICAgICAgaWYoTlVMTCA9PSBjYWxsYmFja19kYXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFYSVMyX0VSUk9SX1NFVChlbnYtPmVycm9yLCBBWElTMl9FUlJPUl9OT19NRU1PUlksIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICAgIEFYSVMyX0xPR19FUlJPUiggZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIkNhbiBub3QgYWxsb2NhdGUgbWVtZW9yeSBmb3IgdGhlIGNhbGxiYWNrIGRhdGEgc3RydWN0dXJlcyIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwhLS0gZm9yIHNlcnZpY2UgY2xpZW50IGN1cnJlbnRseSBzdXBwcG9ydGVkIG9ubHkgMSBpbnB1dCBwYXJhbSAtLT4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaXJzdFBhcmFtIiBzZWxlY3Q9ImlucHV0L3BhcmFtWzFdIi8+Ci0KLQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkZmlyc3RQYXJhbS9AdHlwZSE9JyciPgotICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmaXJzdFBhcmFtL0BvdXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGZvciB1bndyYXBwZWQgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyX2FkYl9vYmoiPndyYXBwZXJfYWRiX29iajwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlyc3RQYXJhbS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPjx4c2w6dGV4dD4gPSA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRmaXJzdFBhcmFtL0B0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AY29tcGxleHR5cGUiPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKGlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlyc3RQYXJhbS9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD48eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtL0Bjb21wbGV4dHlwZSI+KTwveHNsOmlmPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZShfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0BuYW1lIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpcnN0UGFyYW0vQG5hbWUiLz47Ci0gICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6aWY+Ci0KLQotICAgICAgICAgICAgc3ZjX2NsaWVudCA9IGF4aXMyX3N0dWJfZ2V0X3N2Y19jbGllbnQoc3R1YiwgZW52ICk7Ci0gICAgICAgICAgICA8IS0tIGhhbmRsaW5nIGhlYWRlciBwYXJhbXMgLS0+Ci0gICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBhZGRpbmcgaW5wdXQgaGVhZGVycyAtLT4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIGZvciB1bndyYXBwZWQgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyX2FkYl9vYmoiPndyYXBwZXJfYWRiX29iajwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl90eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCR3cmFwcGVyX3R5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBjb21wbGV4dHlwZSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQGNvbXBsZXh0eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iQGNvbXBsZXh0eXBlIj4pPC94c2w6aWY+KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd3JhcHBlcl90eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3JhcHBlcl9hZGJfb2JqIi8+LCBlbnYsIE5VTEwsIE5VTEwsIEFYSVMyX1RSVUUsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICBpbnB1dF9oZWFkZXIgPSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+OwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgYXhpczJfc3ZjX2NsaWVudF9hZGRfaGVhZGVyKHN2Y19jbGllbnQsIGVudiwgaW5wdXRfaGVhZGVyKTsKLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICBvcHRpb25zID0gYXhpczJfc3R1Yl9nZXRfb3B0aW9ucyggc3R1YiwgZW52KTsKLSAgICAgICAgICAgIGlmIChOVUxMID09IG9wdGlvbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEFYSVMyX0VSUk9SX1NFVChlbnYtPmVycm9yLCBBWElTMl9FUlJPUl9JTlZBTElEX05VTExfUEFSQU0sIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoIGVudi0+bG9nLCBBWElTMl9MT0dfU0ksICJvcHRpb25zIGlzIG51bGwgaW4gc3R1YiIpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNvYXBfYWN0ID1heGlzMl9vcHRpb25zX2dldF9zb2FwX2FjdGlvbiAob3B0aW9ucywgZW52KTsKLSAgICAgICAgICAgIGlmIChOVUxMID09IHNvYXBfYWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc19zb2FwX2FjdF9zZXQgPSBBWElTMl9GQUxTRTsKLSAgICAgICAgICAgICAgc29hcF9hY3Rpb24gPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb2FwQWN0aW9uIi8+IjsKLSAgICAgICAgICAgICAgc29hcF9hY3QgPSBheHV0aWxfc3RyaW5nX2NyZWF0ZShlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iKTsKLSAgICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF9hY3Rpb24ob3B0aW9ucywgZW52LCBzb2FwX2FjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHNvYXBWZXJzaW9uPSdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUnIj4KLSAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X3NvYXBfdmVyc2lvbihvcHRpb25zLCBlbnYsIEFYSU9NX1NPQVAxMik7Ci0gICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X3NvYXBfdmVyc2lvbihvcHRpb25zLCBlbnYsIEFYSU9NX1NPQVAxMSk7Ci0gICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICBjYWxsYmFjayA9IGF4aXMyX2NhbGxiYWNrX2NyZWF0ZShlbnYpOwotICAgICAgICAgICAgLyogU2V0IG91ciBvbl9jb21wbGV0ZSBmdWNudGlvbiBwb2ludGVyIHRvIHRoZSBjYWxsYmFjayBvYmplY3QgKi8KLSAgICAgICAgICAgIGF4aXMyX2NhbGxiYWNrX3NldF9vbl9jb21wbGV0ZShjYWxsYmFjaywgYXhpczJfc3R1Yl9vbl9jb21wbGV0ZV88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VuYW1lIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPik7Ci0gICAgICAgICAgICAvKiBTZXQgb3VyIG9uX2Vycm9yIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIG9iamVjdCAqLwotICAgICAgICAgICAgYXhpczJfY2FsbGJhY2tfc2V0X29uX2Vycm9yKGNhbGxiYWNrLCBheGlzMl9zdHViX29uX2Vycm9yXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZW5hbWUiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KTsKLQotICAgICAgICAgICAgY2FsbGJhY2tfZGF0YS0+IGRhdGEgPSB1c2VyX2RhdGE7Ci0gICAgICAgICAgICBjYWxsYmFja19kYXRhLT4gb25fY29tcGxldGUgPSBvbl9jb21wbGV0ZTsKLSAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEtPiBvbl9lcnJvciA9IG9uX2Vycm9yOwotCi0gICAgICAgICAgICBheGlzMl9jYWxsYmFja19zZXRfZGF0YShjYWxsYmFjaywgKHZvaWQqKWNhbGxiYWNrX2RhdGEpOwotCi0gICAgICAgICAgICAvKiBTZW5kIHJlcXVlc3QgKi8KLSAgICAgICAgICAgIGF4aXMyX3N2Y19jbGllbnRfc2VuZF9yZWNlaXZlX25vbl9ibG9ja2luZyhzdmNfY2xpZW50LCBlbnYsIHBheWxvYWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFpc19zb2FwX2FjdF9zZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHN0eWxlPSdkb2MnIj4KLSAgICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF9hY3Rpb24ob3B0aW9ucywgZW52LCBOVUxMKTsKLSAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgIGF4aXMyX29wdGlvbnNfc2V0X2FjdGlvbihvcHRpb25zLCBlbnYsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICA8L3hzbDppZj4gIDwhLS1jbG9zZSBmb3IgIHRlc3Q9IiRpc0FTeW5jPScxJy0tPgotICAgICAgIDwhLS0gRW5kIG9mIGluLW91dCBtZXAgLS0+Ci0gICAgICAgPC94c2w6aWY+IDwhLS0gY2xvc2UgZm9yICB0ZXN0PSIkbWVwPSdodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0JyAtLT4KLQotICAgICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTAnIj4KLSAgICAgICAgIC8qKgotICAgICAgICAgICogYXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZSBmb3IgaW4gb25seSBtZXAgaW52b2NhdGlvbnMKLSAgICAgICAgICAqIGZvciAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBxbmFtZSIvPiIgb3BlcmF0aW9uLgotICAgICAgICAgICogQHBhcmFtIHN0dWIgVGhlIHN0dWIgKGF4aXMyX3N0dWJfdCkKLSAgICAgICAgICAqIEBwYXJhbSBlbnYgZW52aXJvbm1lbnQgKCBtYW5kYXRvcnkpPHhzbDppZiB0ZXN0PSJub3QoJGlzVW53cmFwUGFyYW1ldGVycykiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbVtAdHlwZSE9JyddIj48eHNsOnRleHQ+Ci0gICAgICAgICAgPC94c2w6dGV4dD4qIEBwYXJhbSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG9mIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDppZj4KLSAgICAgICAgICAqPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6dGV4dD4KLSAgICAgICAgICA8L3hzbDp0ZXh0PiogQHBhcmFtIGRwXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiAtIG91dHB1dCBoZWFkZXI8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAqIEByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+Ci0gICAgICAgICAgKi8KLSAgICAgICAgIGF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwKLSAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+KCBheGlzMl9zdHViX3QgKnN0dWIsIGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0cGFyYW1zIi8+KQotICAgICAgICAgewotICAgICAgICAgICAgYXhpczJfc3RhdHVzX3Qgc3RhdHVzOwotCi0gICAgICAgICAgICBheGlzMl9zdmNfY2xpZW50X3QgKnN2Y19jbGllbnQgPSBOVUxMOwotICAgICAgICAgICAgYXhpczJfb3B0aW9uc190ICpvcHRpb25zID0gTlVMTDsKLQotICAgICAgICAgICAgY29uc3QgYXhpczJfY2hhcl90ICpzb2FwX2FjdGlvbiA9IE5VTEw7Ci0gICAgICAgICAgICBheHV0aWxfcW5hbWVfdCAqb3BfcW5hbWUgPSAgTlVMTDsKLSAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqcGF5bG9hZCA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGF4dXRpbF9zdHJpbmdfdCAqc29hcF9hY3QgPSBOVUxMOwotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgIGF4aW9tX25vZGVfdCAqaW5wdXRfaGVhZGVyID0gTlVMTDsKLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICA8IS0tIGZvciBzZXJ2aWNlIGNsaWVudCBjdXJyZW50bHkgc3VwcHBvcnRlZCBvbmx5IDEgaW5wdXQgcGFyYW0gLS0+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpcnN0UGFyYW0iIHNlbGVjdD0iaW5wdXQvcGFyYW1bMV0iLz4KLQotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRmaXJzdFBhcmFtL0B0eXBlIT0nJyI+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGZpcnN0UGFyYW0vQG91cnMiPgotICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGUgZm9yIHVud3JhcHBlZCBtb2RlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZXJfYWRiX29iaiI+d3JhcHBlcl9hZGJfb2JqPC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPl90ICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX2FkYl9vYmoiLz4gPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkZmlyc3RQYXJhbS9AdHlwZSwgJ190KicpIi8+PHhzbDp0ZXh0Pl9jcmVhdGVfd2l0aF92YWx1ZXMoZW52PC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvcGFyYW0vQGNvbXBsZXh0eXBlIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShpbnB1dC9wYXJhbS9AY29tcGxleHR5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZpcnN0UGFyYW0vcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSJpbnB1dC9wYXJhbS9AY29tcGxleHR5cGUiPik8L3hzbDppZj4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cmFwcGVyX2FkYl9vYmoiLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGZpcnN0UGFyYW0vQHR5cGUsICdfdConKSIvPl9zZXJpYWxpemUoXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmlyc3RQYXJhbS9AbmFtZSIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaXJzdFBhcmFtL0BuYW1lIi8+OwotICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0KLSAgICAgICAgICAgIHN2Y19jbGllbnQgPSBheGlzMl9zdHViX2dldF9zdmNfY2xpZW50KHN0dWIsIGVudiApOwotICAgICAgICAgICAgPCEtLSBoYW5kbGluZyBoZWFkZXIgcGFyYW1zIC0tPgotICAgICAgICAgICAKLSAgICAgICAgICAgIDwhLS0gYWRkaW5nIGlucHV0IGhlYWRlcnMgLS0+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSBmb3IgdW53cmFwcGVkIG1vZGUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlcl9hZGJfb2JqIj53cmFwcGVyX2FkYl9vYmo8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyX3R5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfdHlwZSIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiA9ICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd3JhcHBlcl90eXBlLCAnX3QqJykiLz48eHNsOnRleHQ+X2NyZWF0ZV93aXRoX3ZhbHVlcyhlbnY8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBjb21wbGV4dHlwZSI+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZShAY29tcGxleHR5cGUsICdfdConKSIvPjx4c2w6dGV4dD5fY3JlYXRlX3dpdGhfdmFsdWVzKGVudjwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD48eHNsOmlmIHRlc3Q9IkBjb21wbGV4dHlwZSI+KTwveHNsOmlmPik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHdyYXBwZXJfdHlwZSwgJ190KicpIi8+X3NlcmlhbGl6ZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdyYXBwZXJfYWRiX29iaiIvPiwgZW52LCBOVUxMLCBOVUxMLCBBWElTMl9UUlVFLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2hlYWRlciA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fc2VyaWFsaXplKF88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sIGVudiwgTlVMTCwgTlVMTCwgQVhJUzJfVFJVRSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgaW5wdXRfaGVhZGVyID0gXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIGF4aXMyX3N2Y19jbGllbnRfYWRkX2hlYWRlcihzdmNfY2xpZW50LCBlbnYsIGlucHV0X2hlYWRlcik7Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgICAgICAgICBvcHRpb25zID0gYXhpczJfc3R1Yl9nZXRfb3B0aW9ucyggc3R1YiwgZW52KTsKLSAgICAgICAgICAgIGlmICggTlVMTCA9PSBvcHRpb25zICkKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgIEFYSVMyX0VSUk9SX1NFVChlbnYtPmVycm9yLCBBWElTMl9FUlJPUl9JTlZBTElEX05VTExfUEFSQU0sIEFYSVMyX0ZBSUxVUkUpOwotICAgICAgICAgICAgICBBWElTMl9MT0dfRVJST1IoZW52LT5sb2csIEFYSVMyX0xPR19TSSwgIm9wdGlvbnMgaXMgbnVsbCBpbiBzdHViIik7Ci0gICAgICAgICAgICAgIHJldHVybiBBWElTMl9GQUlMVVJFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3ZjX2NsaWVudCA9IGF4aXMyX3N0dWJfZ2V0X3N2Y19jbGllbnQgKHN0dWIsIGVudiApOwotICAgICAgICAgICAgc29hcF9hY3QgPSBheGlzMl9vcHRpb25zX2dldF9zb2FwX2FjdGlvbiAoIG9wdGlvbnMsIGVudiApOwotICAgICAgICAgICAgaWYgKCBOVUxMID09IHNvYXBfYWN0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcF9hY3Rpb24gPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb2FwQWN0aW9uIi8+IjsKLSAgICAgICAgICAgICAgc29hcF9hY3QgPSBheHV0aWxfc3RyaW5nX2NyZWF0ZShlbnYsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iKTsKLSAgICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF9hY3Rpb24ob3B0aW9ucywgZW52LCBzb2FwX2FjdCk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzb2FwVmVyc2lvbj0naHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlJyI+Ci0gICAgICAgICAgICBheGlzMl9vcHRpb25zX3NldF9zb2FwX3ZlcnNpb24ob3B0aW9ucywgZW52LCBBWElPTV9TT0FQMTIgKTsKLSAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgYXhpczJfb3B0aW9uc19zZXRfc29hcF92ZXJzaW9uKG9wdGlvbnMsIGVudiwgQVhJT01fU09BUDExICk7Ci0gICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgb3BfcW5hbWUgPSBheHV0aWxfcW5hbWVfY3JlYXRlKGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbHBhcnQiLz4iICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgc3RhdHVzID0gIGF4aXMyX3N2Y19jbGllbnRfc2VuZF9yb2J1c3Rfd2l0aF9vcF9xbmFtZSggc3ZjX2NsaWVudCwgZW52LCBvcF9xbmFtZSwgcGF5bG9hZCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotCi0gICAgICAgIH0KLSAgICAgICA8L3hzbDppZj4gPCEtLSBjbG9zZSBmb3IgIHRlc3Q9IiRtZXA9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5JyAtLT4KLSAgICAgPC94c2w6Zm9yLWVhY2g+ICAgPCEtLSBjbG9zZSBvZiBmb3ItZWFjaCBzZWxlY3QgPSAibWV0aG9kIiAtLT4KLQotCi0gICAgPHhzbDppZiB0ZXN0PSJtZXRob2QvaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgLyoqCi0gICAgICAqIGZ1bmN0aW9uIHRvIGZyZWUgYW55IHNvYXAgaW5wdXQgaGVhZGVycyAKLSAgICAgICovCi0gICAgPC94c2w6aWY+Ci0gICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9pbnB1dF9oZWFkZXJzKGNvbnN0IGF4dXRpbF9lbnZfdCAqZW52LCA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkhPTEiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz48eHNsOnRleHQ+IF88L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgIHsKLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJoZWFkZXJfdmFyIj48eHNsOnRleHQ+XzwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG91cnMiPgotICAgICAgICAgICAgICAgICAgICBpZig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKEB0eXBlLCAnX3QqJykiLz5fZnJlZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4sIGVudik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAvKiB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGZyZWUgb24gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoZWFkZXJfdmFyIi8+ICovCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgPHhzbDppZiB0ZXN0PSJtZXRob2Qvb3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgIC8qKgotICAgICAgKiBmdW5jdGlvbiB0byBmcmVlIGFueSBzb2FwIG91dHB1dCBoZWFkZXJzIAotICAgICAgKi8KLSAgICA8L3hzbDppZj4KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICB2b2lkIEFYSVMyX0NBTEwKLSAgICAgICAgIGF4aXMyX3N0dWJfb3BfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZXJ2aWNlbmFtZSIvPl88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz5fZnJlZV9vdXRwdXRfaGVhZGVycyhjb25zdCBheHV0aWxfZW52X3QgKmVudiwgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSE9MSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PHhzbDp0ZXh0PiBfPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pCi0gICAgICAgICB7Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nc29hcF9oZWFkZXInXSI+Ci0gICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImhlYWRlcl92YXIiPjx4c2w6dGV4dD5fPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3VycyI+Ci0gICAgICAgICAgICAgICAgICAgIGlmKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoQHR5cGUsICdfdConKSIvPl9mcmVlKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGVhZGVyX3ZhciIvPiwgZW52KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZnJlZSBvbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhlYWRlcl92YXIiLz4gKi8KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgIDwveHNsOmZvci1lYWNoPgotCi0gICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9wYWNrYWdlLmh0bWwgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvYy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjI5MzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08aHRtbD4KLTxib2R5PgotVGhpcyBwYWNrYWdlIGlzIGEgIm5vbiBjbGFzcyBjb250YWluaW5nIiBvbmUgdGhhdCBoYXMgdGhlIHhzbCB0ZW1wbGF0ZXMgZm9yIHRoZSBjIGNsYXNzIGdlbmVyYXRpb24KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvU2VydmljZVhNTFRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTAxOGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvU2VydmljZVhNTFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+DQotDQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPg0KLSAgICAgICAgPHhzbDpjb21tZW50PiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETCA8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgPHhzbDpjb21tZW50PiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IyA8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgPHNlcnZpY2VHcm91cD4NCi0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgICA8L3NlcnZpY2VHcm91cD4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImludGVyZmFjZXMvaW50ZXJmYWNlIj4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzc3BhY2thZ2UiLz48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgIDxzZXJ2aWNlPg0KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VydmljZW5hbWUiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXNzYWdlcmVjZWl2ZXIiPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8bWVzc2FnZVJlY2VpdmVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwVVJJIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFja2FnZT0nJyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L21lc3NhZ2VSZWNlaXZlcj4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLQ0KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhY2thZ2U9JyciPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDwvcGFyYW1ldGVyPg0KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlT3JpZ2luYWx3c2RsIj50cnVlPC9wYXJhbWV0ZXI+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtb2RpZnlVc2VyV1NETFBvcnRBZGRyZXNzIj50cnVlPC9wYXJhbWV0ZXI+DQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+DQotCQkJCTxvcGVyYXRpb24+DQotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9yaWdpbmFsTmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXBVUkkiLz48L3hzbDphdHRyaWJ1dGU+DQotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+PC94c2w6YXR0cmlidXRlPg0KLQkJCQkJPGFjdGlvbk1hcHBpbmc+DQotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIi8+DQotCQkJCQk8L2FjdGlvbk1hcHBpbmc+DQotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3V0cHV0QWN0aW9uTWFwcGluZyI+DQotCQkJCQk8b3V0cHV0QWN0aW9uTWFwcGluZz4NCi0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQEFjdGlvbiIvPg0KLQkJCQkJPC9vdXRwdXRBY3Rpb25NYXBwaW5nPg0KLQkJCQkJPC94c2w6Zm9yLWVhY2g+DQotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHRBY3Rpb25NYXBwaW5nIj4NCi0JCQkJCTxmYXVsdEFjdGlvbk1hcHBpbmc+DQotCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmF1bHROYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZhdWx0TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQEFjdGlvbiIvPg0KLQkJCQkJPC9mYXVsdEFjdGlvbk1hcHBpbmc+DQotCQkJCQk8L3hzbDpmb3ItZWFjaD4NCi0JCQkJPC9vcGVyYXRpb24+DQotCQkJPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICA8L3NlcnZpY2U+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvYWRiQW50QnVpbGRUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9hZGJBbnRCdWlsZFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwY2YzNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9hZGJBbnRCdWlsZFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvYW50Ij4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSIgc2VsZWN0PSJAcGFja2FnZSIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiIHNlbGVjdD0iQHNyYyIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNvdXJjZSIgc2VsZWN0PSJAcmVzb3VyY2UiLz4NCi0NCi0gICAgICAgIDxwcm9qZWN0IGJhc2VkaXI9Ii4iPg0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzc2VydmVyc2lkZSI+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5zZXJ2ZXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLmNsaWVudDwveHNsOmF0dHJpYnV0ZT4gDQotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgPHhzbDpjb21tZW50PkF1dG8gZ2VuZXJhdGVkIGFudCBidWlsZCBmaWxlPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7ZW52LkFYSVMyX0hPTUV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuYmFzZS5kaXIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+LjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJ0aWZhY3RuYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3JjIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS90ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vYnVpbGQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9jbGFzc2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpYiI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9saWI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNvdXJjZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXJzLm9rIiB2YWx1ZT0iIj48L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHtqYXZhLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke21hdmVuLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtheGlzMi5ob21lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPmxpYi8qLmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgIDwvcGF0aD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtsaWJ9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdGVzdE9taXQpIj4NCi0gICAgICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InByZS5jb21waWxlLnRlc3QiIGRlcGVuZHM9ImluaXQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+VGVzdCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIG5lY2VzYXJ5IGNsYXNzZXM8L3hzbDpjb21tZW50Pg0KLQ0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIiIHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lIiBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamFycy5vayI+DQotICAgICAgICAgICAgICAgICAgICA8YW5kPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImF4aXMyLmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+DQotICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+UHJpbnQgb3V0IHRoZSBhdmFpbGFiaWxpdGllczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+U3RheCBBdmFpbGFiaWxpdHk9ICR7c3RheC5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+QXhpczIgQXZhaWxhYmlsaXR5PSAke2F4aXMyLmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc3JjIiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIGRlYnVnPSJvbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIj4ke3NyY308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YWM+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnRlc3QiIGRlcGVuZHM9ImNvbXBpbGUuc3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIGRlYnVnPSJvbiI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNyYz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zcmM+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YWM+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJlY2hvLmNsYXNzcGF0aC5wcm9ibGVtIiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idW5sZXNzIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSJUaGUgY2xhc3MgcGF0aCBpcyBub3Qgc2V0IHJpZ2h0IQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgaW4gdGhlIGNsYXNzcGF0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBYbWxCZWFucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLiBTdGF4DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIEF4aXMyDQotICAgICAgICAgICAgICAgICI+PC9lY2hvPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLmFsbCIgZGVwZW5kcz0iamFyLnNlcnZlciwgamFyLmNsaWVudCI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLnNyYyxlY2hvLmNsYXNzcGF0aC5wcm9ibGVtIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWYiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxjb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7Y2xhc3Nlc30vTUVUQS1JTkY8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciI+ZmFsc2U8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7cmVzb3VyY2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLnhtbDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki53c2RsPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLnhzZDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS5hYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlcyI+KiovVGVzdC5jbGFzczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDwhLS0gc2VsZWN0IGJldHdlZW4gdGhlIC0tPg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLmNsaWVudCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICAgPCEtLXNldCB0aGUgY29ycmVjdCBkZXBlbmRzIHRhcmdldC0tPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdGVzdE9taXQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlcGVuZHMiPmNvbXBpbGUuc3JjPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlcGVuZHMiPmNvbXBpbGUudGVzdDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LXRlc3QtY2xpZW50LmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9NRVRBLUlORi8qLio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL2xpYi8qLio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypNZXNzYWdlUmVjZWl2ZXIuY2xhc3M8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypTa2VsZXRvbi5jbGFzczwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ibWFrZS5yZXBvIiBkZXBlbmRzPSJqYXIuc2VydmVyIiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vcmVwby88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vcmVwby9zZXJ2aWNlczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmaWxlIj4ke2J1aWxkfS9saWIvJHtuYW1lfS5hYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtidWlsZH0vcmVwby9zZXJ2aWNlcy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InN0YXJ0LnNlcnZlciIgZGVwZW5kcz0ibWFrZS5yZXBvIiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIiBmb3JrPSJ0cnVlIj4NCi0gICAgICAgICAgICAgICAgICAgIDxhcmc+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L3JlcG88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2FyZz4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icnVuLnRlc3QiIGRlcGVuZHM9ImNvbXBpbGUudGVzdCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3Rlc3QtcmVwb3J0cy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIj4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPnRlc3QuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2J1aWxkfS90ZXN0LXJlcG9ydHMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKlRlc3QqLmphdmE8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8L2JhdGNodGVzdD4NCi0gICAgICAgICAgICAgICAgPC9qdW5pdD4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4NCi0gICAgICAgICAgICAgICAgPGRlbGV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZGVsZXRlPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgPC9wcm9qZWN0Pg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2RlZmF1bHRBbnRCdWlsZFRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2RlZmF1bHRBbnRCdWlsZFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMWFjMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9kZWZhdWx0QW50QnVpbGRUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIG9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiLz4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2FudCI+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UiIHNlbGVjdD0iQHBhY2thZ2UiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3JjIiBzZWxlY3Q9IkBzcmMiLz4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmVzb3VyY2UiIHNlbGVjdD0iQHJlc291cmNlIi8+DQotDQotICAgICAgICA8cHJvamVjdCBiYXNlZGlyPSIuIj4NCi0gICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAaXNzZXJ2ZXJzaWRlIj4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLnNlcnZlcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuY2xpZW50PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgIDx4c2w6Y29tbWVudD5BdXRvIGdlbmVyYXRlZCBhbnQgYnVpbGQgZmlsZTwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2Vudi5BWElTMl9IT01FfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmJhc2UuZGlyIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPi48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzcmMiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L3Rlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS9idWlsZDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2NsYXNzZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2xpYjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNvdXJjZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJ0aWZhY3RuYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImphcnMub2siIHZhbHVlPSIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke2phdmEuY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7bWF2ZW4uY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2F4aXMyLmhvbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+bGliLyouamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgPC9wYXRoPg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2xpYn08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0ZXN0T21pdCkiPg0KLSAgICAgICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icHJlLmNvbXBpbGUudGVzdCIgZGVwZW5kcz0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5UZXN0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVjZXNhcnkgY2xhc3NlczwveHNsOmNvbW1lbnQ+DQotDQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciIgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lIiBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphcnMub2siID4NCi0gICAgICAgICAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICA8L2FuZD4NCi0gICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQotDQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5QcmludCBvdXQgdGhlIGF2YWlsYWJpbGl0aWVzPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5TdGF4IEF2YWlsYWJpbGl0eT0gJHtzdGF4LmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5BeGlzMiBBdmFpbGFiaWxpdHk9ICR7YXhpczIuYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLQ0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zcmMiIGRlcGVuZHM9ImVjaG8uY2xhc3NwYXRoLnByb2JsZW0iPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiPiR7c3JjfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudGVzdCIgZGVwZW5kcz0iY29tcGlsZS5zcmMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YWM+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJlY2hvLmNsYXNzcGF0aC5wcm9ibGVtIiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idW5sZXNzIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSJUaGUgY2xhc3MgcGF0aCBpcyBub3Qgc2V0IHJpZ2h0IQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgaW4gdGhlIGNsYXNzcGF0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLiBTdGF4DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIEF4aXMyDQotICAgICAgICAgICAgICAgICI+PC9lY2hvPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLmNsaWVudCIgIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0ZXN0T21pdCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS5zcmM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS50ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0tY2xpZW50LmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovTUVUQS1JTkYvKi4qPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovbGliLyouKjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypNZXNzYWdlUmVjZWl2ZXIuY2xhc3M8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qU2tlbGV0b24uY2xhc3M8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0NCi0NCi0NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5zZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUuc3JjLGVjaG8uY2xhc3NwYXRoLnByb2JsZW0iPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtjbGFzc2VzfS9NRVRBLUlORjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIj5mYWxzZTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtyZXNvdXJjZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLnhtbDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioud3NkbDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueHNkPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIj4qKi9UZXN0LmNsYXNzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuYWxsIiBkZXBlbmRzPSJqYXIuc2VydmVyLGphci5jbGllbnQiLz4NCi0gICAgICAgIDwvcHJvamVjdD4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC9qYXhicmlBbnRCdWlsZFRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2pheGJyaUFudEJ1aWxkVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTEwOWZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2pheGJyaUFudEJ1aWxkVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9hbnQiPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyIgc2VsZWN0PSJAc3JjIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9IkByZXNvdXJjZSIvPg0KLQ0KLSAgICAgICAgPHByb2plY3QgYmFzZWRpcj0iLiI+DQotICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzc2VydmVyc2lkZSI+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5zZXJ2ZXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLmNsaWVudDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICA8eHNsOmNvbW1lbnQ+QXV0byBnZW5lcmF0ZWQgYW50IGJ1aWxkIGZpbGU8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtlbnYuQVhJUzJfSE9NRX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4uPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2aWNlbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzcmMiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L3Rlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS9idWlsZDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2NsYXNzZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L2xpYjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXNvdXJjZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc291cmNlIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InhiZWFucy5wYWNrYWdlZC5qYXIubmFtZSIgdmFsdWU9IlhCZWFucy1wYWNrYWdlZC5qYXIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImphcnMub2siIHZhbHVlPSIiPjwvcHJvcGVydHk+DQotDQotICAgICAgICAgICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke2phdmEuY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7bWF2ZW4uY2xhc3MucGF0aH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2F4aXMyLmhvbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+bGliLyouamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgPC9wYXRoPg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2xpYn08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KEB0ZXN0T21pdCkiPg0KLSAgICAgICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLQ0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icHJlLmNvbXBpbGUudGVzdCIgZGVwZW5kcz0iaW5pdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5UZXN0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVjZXNhcnkgY2xhc3NlczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5hcGkuWEpDIiBwcm9wZXJ0eT0iamF4YnJpLmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciIgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUiIHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXJzLm9rIiA+DQotICAgICAgICAgICAgICAgICAgICA8YW5kPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamF4YnJpLmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImF4aXMyLmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hbmQ+DQotICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPg0KLQ0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+UHJpbnQgb3V0IHRoZSBhdmFpbGFiaWxpdGllczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+SkFYLUIgUkkgQXZhaWxhYmlsaXR5ID0gJHtqYXhicmkuYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPlN0YXggQXZhaWxhYmlsaXR5PSAke3N0YXguYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPkF4aXMyIEF2YWlsYWJpbGl0eT0gJHtheGlzMi5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotDQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnNyYyIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCIgPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiPiR7c3JjfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudGVzdCIgZGVwZW5kcz0iY29tcGlsZS5zcmMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotDQotICAgICAgICAgICAgICAgICAgICA8c3JjPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3NyYz4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gdG9kbyAtLT4NCi0NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImVjaG8uY2xhc3NwYXRoLnByb2JsZW0iIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ1bmxlc3MiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlRoZSBjbGFzcyBwYXRoIGlzIG5vdCBzZXQgcmlnaHQhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBpbiB0aGUgY2xhc3NwYXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFhtbEJlYW5zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIFN0YXgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gQXhpczINCi0gICAgICAgICAgICAgICAgIj48L2VjaG8+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuYWxsIiBkZXBlbmRzPSJqYXIuc2VydmVyLCBqYXIuY2xpZW50Ij4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5zZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUuc3JjLGVjaG8uY2xhc3NwYXRoLnByb2JsZW0iPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtjbGFzc2VzfS9NRVRBLUlORjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIj5mYWxzZTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtyZXNvdXJjZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueG1sPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLndzZGw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL3NjaGVtYW9yZ19hcGFjaGVfeG1sYmVhbi8qKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS5hYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlcyI+KiovVGVzdC5jbGFzczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLmNsaWVudCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8IS0tc2V0IHRoZSBjb3JyZWN0IGRlcGVuZHMgdGFyZ2V0LS0+DQotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkB0ZXN0T21pdCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS5zcmM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVwZW5kcyI+Y29tcGlsZS50ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL01FVEEtSU5GLyouKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovbGliLyouKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKk1lc3NhZ2VSZWNlaXZlci5jbGFzczwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKlNrZWxldG9uLmNsYXNzPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJtYWtlLnJlcG8iIGRlcGVuZHM9Imphci5zZXJ2ZXIiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS9yZXBvLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS9yZXBvL3NlcnZpY2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZpbGUiPiR7YnVpbGR9L2xpYi8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2J1aWxkfS9yZXBvL3NlcnZpY2VzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ic3RhcnQuc2VydmVyIiBkZXBlbmRzPSJtYWtlLnJlcG8iIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiIGZvcms9InRydWUiPg0KLSAgICAgICAgICAgICAgICAgICAgPGFyZz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vcmVwbzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvYXJnPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmE+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJydW4udGVzdCIgZGVwZW5kcz0iamFyLmNsaWVudCIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8cGF0aCBpZD0idGVzdC5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7bmFtZX0tdGVzdC1jbGllbnQuamFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICA8L3BhdGg+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vdGVzdC1yZXBvcnRzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJ5ZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+dGVzdC5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8+DQotICAgICAgICAgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InllcyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7YnVpbGR9L3Rlc3QtcmVwb3J0cy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qVGVzdCouamF2YTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDwvYmF0Y2h0ZXN0Pg0KLSAgICAgICAgICAgICAgICA8L2p1bml0Pg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPg0KLSAgICAgICAgICAgICAgICA8ZGVsZXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9kZWxldGU+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICA8L3Byb2plY3Q+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamF4bWVBbnRCdWlsZFRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2pheG1lQW50QnVpbGRUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGYwNzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamF4bWVBbnRCdWlsZFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvYW50Ij4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSIgc2VsZWN0PSJAcGFja2FnZSIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiIHNlbGVjdD0iQHNyYyIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNvdXJjZSIgc2VsZWN0PSJAcmVzb3VyY2UiLz4NCi0NCi0gICAgICAgIDxwcm9qZWN0IGJhc2VkaXI9Ii4iPg0KLSAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc3NlcnZlcnNpZGUiPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuc2VydmVyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5jbGllbnQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPHhzbDpjb21tZW50PkF1dG8gZ2VuZXJhdGVkIGFudCBidWlsZCBmaWxlPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7ZW52LkFYSVMyX0hPTUV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuYmFzZS5kaXIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+LjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJ0aWZhY3RuYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNyYyIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Ij4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vdGVzdDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9L2J1aWxkPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vY2xhc3NlczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtidWlsZH0vbGliPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNvdXJjZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YmVhbnMucGFja2FnZWQuamFyLm5hbWUiIHZhbHVlPSJYQmVhbnMtcGFja2FnZWQuamFyIj48L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXJzLm9rIiB2YWx1ZT0iIj48L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHtqYXZhLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke21hdmVuLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtheGlzMi5ob21lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPmxpYi8qLmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgIDwvcGF0aD4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtsaWJ9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnhiZWFucyI+DQotICAgICAgICAgICAgICAgIDwhLS0gamFyIHRoZSAgWE1MYmVhbnMgc3R1ZmYgdG8gdGhlIGxpYiBmb2xkZXItLT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImJhc2VkaXIiPiR7cmVzb3VyY2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHt4YmVhbnMucGFja2FnZWQuamFyLm5hbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiPioqL3NlcnZpY2VzLnhtbCwgKiovKi54c2Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icHJlLmNvbXBpbGUudGVzdCIgZGVwZW5kcz0iaW5pdCwgamFyLnhiZWFucyI+DQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5UZXN0IHRoZSBjbGFzc3BhdGggZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgbmVjZXNhcnkgY2xhc3NlczwveHNsOmNvbW1lbnQ+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdCIgcHJvcGVydHk9InhiZWFucy5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIiIHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lIiBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamFycy5vayIgPg0KLSAgICAgICAgICAgICAgICAgICAgPGFuZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InhiZWFucy5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InN0YXguYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJheGlzMi5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvYW5kPg0KLSAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCi0NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlByaW50IG91dCB0aGUgYXZhaWxhYmlsaXRpZXM8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5YbWxCZWFucyBBdmFpbGFiaWxpdHkgPSAke3hiZWFucy5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPlN0YXggQXZhaWxhYmlsaXR5PSAke3N0YXguYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5BeGlzMiBBdmFpbGFiaWxpdHk9ICR7YXhpczIuYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLQ0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5hbGwiIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgZGVidWc9Im9uIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiPiR7c3JjfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iPiR7bGlifS8ke3hiZWFucy5wYWNrYWdlZC5qYXIubmFtZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudGVzdCIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzcmM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHtzcmN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zcmM+DQotICAgICAgICAgICAgICAgICAgICA8c3JjPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InBhdGgiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3NyYz4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iPiR7bGlifS8ke3hiZWFucy5wYWNrYWdlZC5qYXIubmFtZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhYz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImVjaG8uY2xhc3NwYXRoLnByb2JsZW0iIGRlcGVuZHM9InByZS5jb21waWxlLnRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ1bmxlc3MiPmphcnMub2s8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IlRoZSBjbGFzcyBwYXRoIGlzIG5vdCBzZXQgcmlnaHQhDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBtYWtlIHN1cmUgdGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBpbiB0aGUgY2xhc3NwYXRoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuIFhtbEJlYW5zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIFN0YXgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4gQXhpczINCi0gICAgICAgICAgICAgICAgIj48L2VjaG8+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuYWxsIiBkZXBlbmRzPSJqYXIuc2VydmVyLCBqYXIuY2xpZW50Ij4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5zZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUuYWxsLGVjaG8uY2xhc3NwYXRoLnByb2JsZW0iPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZiI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtjbGFzc2VzfS9NRVRBLUlORjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIj5mYWxzZTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtyZXNvdXJjZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueG1sPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qLndzZGw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioueHNkPC94c2w6YXR0cmlidXRlPjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9zY2hlbWFvcmdfYXBhY2hlX3htbGJlYW4vKio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgIDxjb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmlsZSI+JHtsaWJ9LyR7eGJlYW5zLnBhY2thZ2VkLmphci5uYW1lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2NsYXNzZXN9L2xpYjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9jb3B5Pg0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LmFhcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIj4qKi9UZXN0LmNsYXNzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgPC9qYXI+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJqYXIuY2xpZW50IiBkZXBlbmRzPSJjb21waWxlLnRlc3QiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS10ZXN0LWNsaWVudC5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovTUVUQS1JTkYvKi4qPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9saWIvKi4qPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qTWVzc2FnZVJlY2VpdmVyLmNsYXNzPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qU2tlbGV0b24uY2xhc3M8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKi53c2RsPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qLnhzZDwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKi54bWw8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Im1ha2UucmVwbyIgZGVwZW5kcz0iamFyLnNlcnZlciIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3JlcG8vPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3JlcG8vc2VydmljZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxjb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmlsZSI+JHtidWlsZH0vbGliLyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7YnVpbGR9L3JlcG8vc2VydmljZXMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJzdGFydC5zZXJ2ZXIiIGRlcGVuZHM9Im1ha2UucmVwbyIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciIgZm9yaz0idHJ1ZSI+DQotICAgICAgICAgICAgICAgICAgICA8YXJnPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9yZXBvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hcmc+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InJ1bi50ZXN0IiBkZXBlbmRzPSJqYXIuY2xpZW50IiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIj4ke2xpYn0vJHtuYW1lfS10ZXN0LWNsaWVudC5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHBhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3BhdGg+DQotICAgICAgICAgICAgICAgIDwvcGF0aD4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS90ZXN0LXJlcG9ydHMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj50ZXN0LmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0ieWVzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtidWlsZH0vdGVzdC1yZXBvcnRzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypUZXN0Ki5qYXZhPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CQkJDQotICAgICAgICAgICAgICAgIDwvanVuaXQ+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+DQotICAgICAgICAgICAgICA8ZGVsZXRlPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgPC9kZWxldGU+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICA8L3Byb2plY3Q+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamlieEFudEJ1aWxkVGVtcGxhdGUueHNsIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwvamlieEFudEJ1aWxkVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU0ZjliLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9nZW5lcmFsL2ppYnhBbnRCdWlsZFRlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvYW50Ij4NCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSIgc2VsZWN0PSJAcGFja2FnZSIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzcmMiIHNlbGVjdD0iQHNyYyIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNvdXJjZSIgc2VsZWN0PSJAcmVzb3VyY2UiLz4NCi0NCi0gICAgICAgIDxwcm9qZWN0IGJhc2VkaXI9Ii4iPg0KLSAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBpc3NlcnZlcnNpZGUiPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0Ij5qYXIuc2VydmVyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5jbGllbnQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgPHhzbDpjb21tZW50PkF1dG8gZ2VuZXJhdGVkIGFudCBidWlsZCBmaWxlPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7ZW52LkFYSVMyX0hPTUV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuYmFzZS5kaXIiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+LjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJuYW1lIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYXJ0aWZhY3RuYW1lIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3JjIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS90ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vYnVpbGQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9jbGFzc2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpYiI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9saWI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNvdXJjZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXJzLm9rIiB2YWx1ZT0iIj48L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHtqYXZhLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke21hdmVuLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtheGlzMi5ob21lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPmxpYi8qLmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgIDwvcGF0aD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtsaWJ9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdGVzdE9taXQpIj4NCi0gICAgICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InByZS5jb21waWxlLnRlc3QiIGRlcGVuZHM9ImluaXQiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+VGVzdCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIG5lY2VzYXJ5IGNsYXNzZXM8L3hzbDpjb21tZW50Pg0KLQ0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIiIHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lIiBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9Im9yZy5qaWJ4LnJ1bnRpbWUuQmluZGluZ0RpcmVjdG9yeSIgcHJvcGVydHk9ImppYnguYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamFycy5vayI+DQotICAgICAgICAgICAgICAgICAgICA8YW5kPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImF4aXMyLmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamlieC5hdmFpbGFibGUiLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvYW5kPg0KLSAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4NCi0NCi0gICAgICAgICAgICAgICAgPHhzbDpjb21tZW50PlByaW50IG91dCB0aGUgYXZhaWxhYmlsaXRpZXM8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPlN0YXggQXZhaWxhYmlsaXR5PSAke3N0YXguYXZhaWxhYmxlfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9lY2hvPg0KLSAgICAgICAgICAgICAgICA8ZWNobz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiPkF4aXMyIEF2YWlsYWJpbGl0eT0gJHtheGlzMi5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+SmlCWCBBdmFpbGFiaWxpdHk9ICR7amlieC5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotDQotICAgICAgICAgICAgPC90YXJnZXQ+DQotDQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnNyYyIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyY2RpciI+JHtzcmN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJjb21waWxlLnNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzcmM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvc3JjPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iZWNoby5jbGFzc3BhdGgucHJvYmxlbSIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InVubGVzcyI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iVGhlIGNsYXNzIHBhdGggaXMgbm90IHNldCByaWdodCENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIGluIHRoZSBjbGFzc3BhdGgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gWG1sQmVhbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gU3RheA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBBeGlzMg0KLSAgICAgICAgICAgICAgICAiPjwvZWNobz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5hbGwiIGRlcGVuZHM9Imphci5zZXJ2ZXIsIGphci5jbGllbnQiPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS5zcmMsZWNoby5jbGFzc3BhdGgucHJvYmxlbSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2NsYXNzZXN9L01FVEEtSU5GPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiPmZhbHNlPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54bWw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioud3NkbDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54c2Q8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiPioqL1Rlc3QuY2xhc3M8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8IS0tIHNlbGVjdCBiZXR3ZWVuIHRoZSAtLT4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5jbGllbnQiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgIDwhLS1zZXQgdGhlIGNvcnJlY3QgZGVwZW5kcyB0YXJnZXQtLT4NCi0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQHRlc3RPbWl0Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRzIj5jb21waWxlLnNyYzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRzIj5jb21waWxlLnRlc3Q8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPGphcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIj4ke2xpYn0vJHtuYW1lfS10ZXN0LWNsaWVudC5qYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovTUVUQS1JTkYvKi4qPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9saWIvKi4qPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qTWVzc2FnZVJlY2VpdmVyLmNsYXNzPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qU2tlbGV0b24uY2xhc3M8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Im1ha2UucmVwbyIgZGVwZW5kcz0iamFyLnNlcnZlciIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3JlcG8vPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3JlcG8vc2VydmljZXM8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxjb3B5Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmlsZSI+JHtidWlsZH0vbGliLyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7YnVpbGR9L3JlcG8vc2VydmljZXMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJzdGFydC5zZXJ2ZXIiIGRlcGVuZHM9Im1ha2UucmVwbyIgaWY9ImphcnMub2siPg0KLSAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciIgZm9yaz0idHJ1ZSI+DQotICAgICAgICAgICAgICAgICAgICA8YXJnPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9yZXBvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hcmc+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj5heGlzMi5jbGFzcy5wYXRoPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgIDwvamF2YT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InJ1bi50ZXN0IiBkZXBlbmRzPSJjb21waWxlLnRlc3QiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPHBhdGggaWQ9InRlc3QuY2xhc3MucGF0aCI+DQotICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iPiR7bGlifS8ke25hbWV9LXRlc3QtY2xpZW50LmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8cGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgIDwvcGF0aD4NCi0gICAgICAgICAgICAgICAgPG1rZGlyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2J1aWxkfS90ZXN0LXJlcG9ydHMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9InllcyI+DQotICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InJlZmlkIj50ZXN0LmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0ieWVzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtidWlsZH0vdGVzdC1yZXBvcnRzLzwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Rlc3R9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypUZXN0Ki5qYXZhPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgPC9iYXRjaHRlc3Q+DQotICAgICAgICAgICAgICAgIDwvanVuaXQ+DQotICAgICAgICAgICAgPC90YXJnZXQ+DQotICAgICAgICAgICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+DQotICAgICAgICAgICAgICAgIDxkZWxldGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2RlbGV0ZT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgIDwvcHJvamVjdD4NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotPC94c2w6c3R5bGVzaGVldD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC94bWxiZWFuc0FudEJ1aWxkVGVtcGxhdGUueHNsIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2dlbmVyYWwveG1sYmVhbnNBbnRCdWlsZFRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzNWM5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvZ2VuZXJhbC94bWxiZWFuc0FudEJ1aWxkVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9hbnQiPg0KLQ0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIiBzZWxlY3Q9IkBwYWNrYWdlIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNyYyIgc2VsZWN0PSJAc3JjIi8+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJlc291cmNlIiBzZWxlY3Q9IkByZXNvdXJjZSIvPg0KLQ0KLSAgICAgICAgPHByb2plY3QgYmFzZWRpcj0iLiI+DQotICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGlzc2VydmVyc2lkZSI+DQotICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiPmphci5zZXJ2ZXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCI+amFyLmNsaWVudDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICA8eHNsOmNvbW1lbnQ+QXV0byBnZW5lcmF0ZWQgYW50IGJ1aWxkIGZpbGU8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtlbnYuQVhJUzJfSE9NRX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4uPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im5hbWUiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhcnRpZmFjdG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke3Byb2plY3QuYmFzZS5kaXJ9Lzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3JjIi8+PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRlc3QiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+JHtwcm9qZWN0LmJhc2UuZGlyfS90ZXN0PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vYnVpbGQ8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9jbGFzc2VzPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpYiI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj4ke2J1aWxkfS9saWI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgPC9wcm9wZXJ0eT4NCi0gICAgICAgICA8cHJvcGVydHkgbmFtZT0icmVzb3VyY2VzIj4NCi0gICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7cHJvamVjdC5iYXNlLmRpcn0vPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNvdXJjZSIvPjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ4YmVhbnMucGFja2FnZWQuamFyLm5hbWUiIHZhbHVlPSJYQmVhbnMtcGFja2FnZWQuamFyIj48L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXJzLm9rIiB2YWx1ZT0iIj48L3Byb3BlcnR5Pg0KLQ0KLSAgICAgICAgICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzcy5wYXRoIj4NCi0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHtqYXZhLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIj4ke21hdmVuLmNsYXNzLnBhdGh9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L3BhdGhlbGVtZW50Pg0KLSAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtheGlzMi5ob21lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPmxpYi8qLmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgIDwvcGF0aD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7Y2xhc3Nlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtsaWJ9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAdGVzdE9taXQpIj4NCi0gICAgICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L21rZGlyPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci54YmVhbnMiPg0KLSAgICAgICAgICAgICAgICA8IS0tIGphciB0aGUgIFhNTGJlYW5zIHN0dWZmIHRvIHRoZSBsaWIgZm9sZGVyLS0+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7eGJlYW5zLnBhY2thZ2VkLmphci5uYW1lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIj4qKi9zZXJ2aWNlcy54bWwsICoqLyoueHNkPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InByZS5jb21waWxlLnRlc3QiIGRlcGVuZHM9ImluaXQsIGphci54YmVhbnMiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNvbW1lbnQ+VGVzdCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIG5lY2VzYXJ5IGNsYXNzZXM8L3hzbDpjb21tZW50Pg0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QiIHByb3BlcnR5PSJ4YmVhbnMuYXZhaWxhYmxlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzLnBhdGgiLz4NCi0gICAgICAgICAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIiBwcm9wZXJ0eT0ic3RheC5hdmFpbGFibGUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3MucGF0aCIvPg0KLSAgICAgICAgICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZSIgcHJvcGVydHk9ImF4aXMyLmF2YWlsYWJsZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzcy5wYXRoIi8+DQotICAgICAgICAgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphcnMub2siID4NCi0gICAgICAgICAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ4YmVhbnMuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzdGF4LmF2YWlsYWJsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYXhpczIuYXZhaWxhYmxlIi8+DQotICAgICAgICAgICAgICAgICAgICA8L2FuZD4NCi0gICAgICAgICAgICAgICAgPC9jb25kaXRpb24+DQotDQotICAgICAgICAgICAgICAgIDx4c2w6Y29tbWVudD5QcmludCBvdXQgdGhlIGF2YWlsYWJpbGl0aWVzPC94c2w6Y29tbWVudD4NCi0gICAgICAgICAgICAgICAgPGVjaG8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIj5YbWxCZWFucyBBdmFpbGFiaWxpdHkgPSAke3hiZWFucy5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+U3RheCBBdmFpbGFiaWxpdHk9ICR7c3RheC5hdmFpbGFibGV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2VjaG8+DQotICAgICAgICAgICAgICAgIDxlY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSI+QXhpczIgQXZhaWxhYmlsaXR5PSAke2F4aXMyLmF2YWlsYWJsZX08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZWNobz4NCi0NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc3JjIiBkZXBlbmRzPSJwcmUuY29tcGlsZS50ZXN0IiA+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InNyY2RpciI+JHtzcmN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7eGJlYW5zLnBhY2thZ2VkLmphci5uYW1lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50ZXN0IiBkZXBlbmRzPSJjb21waWxlLnNyYyI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBkZWJ1Zz0ib24iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDxzcmM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icGF0aCI+JHt0ZXN0fTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvc3JjPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiI+JHtsaWJ9LyR7eGJlYW5zLnBhY2thZ2VkLmphci5uYW1lfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSB0b2RvIC0tPg0KLQ0KLSAgICAgICAgICAgICAgICA8L2phdmFjPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iZWNoby5jbGFzc3BhdGgucHJvYmxlbSIgZGVwZW5kcz0icHJlLmNvbXBpbGUudGVzdCI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InVubGVzcyI+amFycy5vazwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iVGhlIGNsYXNzIHBhdGggaXMgbm90IHNldCByaWdodCENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIGluIHRoZSBjbGFzc3BhdGgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4gWG1sQmVhbnMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gU3RheA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLiBBeGlzMg0KLSAgICAgICAgICAgICAgICAiPjwvZWNobz4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5hbGwiIGRlcGVuZHM9Imphci5zZXJ2ZXIsIGphci5jbGllbnQiPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS5zcmMsZWNoby5jbGFzc3BhdGgucHJvYmxlbSI+DQotICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImlmIj5qYXJzLm9rPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8Y29weT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2NsYXNzZXN9L01FVEEtSU5GPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiPmZhbHNlPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke3Jlc291cmNlc308L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54bWw8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioud3NkbDwveHNsOmF0dHJpYnV0ZT48L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+PHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+Ki54c2Q8L3hzbDphdHRyaWJ1dGU+PC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL3NjaGVtYW9yZ19hcGFjaGVfeG1sYmVhbi8qKjwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmaWxlIj4ke2xpYn0vJHt4YmVhbnMucGFja2FnZWQuamFyLm5hbWV9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idG9EaXIiPiR7Y2xhc3Nlc30vbGliPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICA8L2NvcHk+DQotICAgICAgICAgICAgICAgIDxqYXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSI+JHtsaWJ9LyR7bmFtZX0uYWFyPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZXMiPioqL1Rlc3QuY2xhc3M8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGlyIj4ke2NsYXNzZXN9PC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0Pg0KLSAgICAgICAgICAgICAgICA8L2phcj4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9Imphci5jbGllbnQiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPCEtLXNldCB0aGUgY29ycmVjdCBkZXBlbmRzIHRhcmdldC0tPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAdGVzdE9taXQiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlcGVuZHMiPmNvbXBpbGUuc3JjPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRlcGVuZHMiPmNvbXBpbGUudGVzdDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgICAgICA8amFyPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiPiR7bGlifS8ke25hbWV9LXRlc3QtY2xpZW50LmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtjbGFzc2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi9NRVRBLUlORi8qLio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqL2xpYi8qLio8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypNZXNzYWdlUmVjZWl2ZXIuY2xhc3M8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLypTa2VsZXRvbi5jbGFzczwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotDQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7cmVzb3VyY2VzfTwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qLndzZGw8L3hzbDphdHRyaWJ1dGU+PC9leGNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPioqLyoueHNkPC94c2w6YXR0cmlidXRlPjwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj4qKi8qLnhtbDwveHNsOmF0dHJpYnV0ZT48L2V4Y2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgIDwvamFyPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLQ0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0ibWFrZS5yZXBvIiBkZXBlbmRzPSJqYXIuc2VydmVyIiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vcmVwby88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxta2Rpcj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH0vcmVwby9zZXJ2aWNlczwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgPC9ta2Rpcj4NCi0gICAgICAgICAgICAgICAgPGNvcHk+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJmaWxlIj4ke2J1aWxkfS9saWIvJHtuYW1lfS5hYXI8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0b0RpciI+JHtidWlsZH0vcmVwby9zZXJ2aWNlcy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvY29weT4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9InN0YXJ0LnNlcnZlciIgZGVwZW5kcz0ibWFrZS5yZXBvIiBpZj0iamFycy5vayI+DQotICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIiBmb3JrPSJ0cnVlIj4NCi0gICAgICAgICAgICAgICAgICAgIDxhcmc+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiPiR7YnVpbGR9L3JlcG88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2FyZz4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPmF4aXMyLmNsYXNzLnBhdGg8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9qYXZhPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgICAgIDx0YXJnZXQgbmFtZT0icnVuLnRlc3QiIGRlcGVuZHM9Imphci5jbGllbnQiIGlmPSJqYXJzLm9rIj4NCi0gICAgICAgICAgICAgICAgPHBhdGggaWQ9InRlc3QuY2xhc3MucGF0aCI+DQotICAgICAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iPiR7bGlifS8ke25hbWV9LXRlc3QtY2xpZW50LmphcjwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGF0aGVsZW1lbnQ+DQotICAgICAgICAgICAgICAgICAgICA8cGF0aD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWZpZCI+YXhpczIuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvcGF0aD4NCi0gICAgICAgICAgICAgICAgPC9wYXRoPg0KLSAgICAgICAgICAgICAgICA8bWtkaXI+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7YnVpbGR9L3Rlc3QtcmVwb3J0cy88L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvbWtkaXI+DQotICAgICAgICAgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIj4NCi0gICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVmaWQiPnRlc3QuY2xhc3MucGF0aDwveHNsOmF0dHJpYnV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InRvRGlyIj4ke2J1aWxkfS90ZXN0LXJlcG9ydHMvPC94c2w6YXR0cmlidXRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJkaXIiPiR7dGVzdH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibmFtZSI+KiovKlRlc3QqLmphdmE8L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+DQotICAgICAgICAgICAgICAgICAgICA8L2JhdGNodGVzdD4NCi0gICAgICAgICAgICAgICAgPC9qdW5pdD4NCi0gICAgICAgICAgICA8L3RhcmdldD4NCi0gICAgICAgICAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4NCi0gICAgICAgICAgICAgICAgPGRlbGV0ZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImRpciI+JHtidWlsZH08L3hzbDphdHRyaWJ1dGU+DQotICAgICAgICAgICAgICAgIDwvZGVsZXRlPg0KLSAgICAgICAgICAgIDwvdGFyZ2V0Pg0KLSAgICAgICAgPC9wcm9qZWN0Pg0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0NhbGxiYWNrSGFuZGxlclRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0NhbGxiYWNrSGFuZGxlclRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZTM2Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9DYWxsYmFja0hhbmRsZXJUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2NhbGxiYWNrIj4KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotCi0gICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci0KLSAgICAvKioKLSAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IENhbGxiYWNrIGNsYXNzLCBVc2VycyBjYW4gZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudAotICAgICAqICB0aGVpciBvd24gcmVjZWl2ZVJlc3VsdCBhbmQgcmVjZWl2ZUVycm9yIG1ldGhvZHMuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPnsKLQotCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNsaWVudERhdGE7Ci0KLSAgICAvKioKLSAgICAqIFVzZXIgY2FuIHBhc3MgaW4gYW55IG9iamVjdCB0aGF0IG5lZWRzIHRvIGJlIGFjY2Vzc2VkIG9uY2UgdGhlIE5vbkJsb2NraW5nCi0gICAgKiBXZWIgc2VydmljZSBjYWxsIGlzIGZpbmlzaGVkIGFuZCBhcHByb3ByaWF0ZSBtZXRob2Qgb2YgdGhpcyBDYWxsQmFjayBpcyBjYWxsZWQuCi0gICAgKiBAcGFyYW0gY2xpZW50RGF0YSBPYmplY3QgbWVjaGFuaXNtIGJ5IHdoaWNoIHRoZSB1c2VyIGNhbiBwYXNzIGluIHVzZXIgZGF0YQotICAgICogdGhhdCB3aWxsIGJlIGF2aWxhYmxlIGF0IHRoZSB0aW1lIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLgotICAgICovCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihPYmplY3QgY2xpZW50RGF0YSl7Ci0gICAgICAgIHRoaXMuY2xpZW50RGF0YSA9IGNsaWVudERhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBQbGVhc2UgdXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IGRvbid0IHdhbnQgdG8gc2V0IGFueSBjbGllbnREYXRhCi0gICAgKi8KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCl7Ci0gICAgICAgIHRoaXMuY2xpZW50RGF0YSA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGllbnQgZGF0YQotICAgICAqLwotCi0gICAgIHB1YmxpYyBPYmplY3QgZ2V0Q2xpZW50RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGNsaWVudERhdGE7Ci0gICAgIH0KLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0UGFyYW1UeXBlIiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dFBhcmFtTmFtZSIgc2VsZWN0PSJvdXRwdXQvcGFyYW0vQG5hbWUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRQYXJhbUNvbXBsZXhUeXBlIiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRQYXJhbUNvdW50IiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVwIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPCEtLSBDb2RlIGdlbmVyYXRpb24gZm9yIGluLW91dCBvbmx5LiBOZWVkIHRvIGNvbnNpZGVyIHRoZSBvdGhlciBtZXBzIGFsc28KLSAgICAgICAgICAgICAgICAgICAgVGhleSBzaG91bGQgYmUgcGFydHMgb2YgdGhpcyB4c2w6Y2hvb3NlIGxvb3AgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRtZXA9JzEyJyI+Ci0gICAgICAgICAgIC8qKgotICAgICAgICAgICAgKiBhdXRvIGdlbmVyYXRlZCBBeGlzMiBjYWxsIGJhY2sgbWV0aG9kIGZvciA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gbWV0aG9kCi0gICAgICAgICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBoYW5kbGluZyBub3JtYWwgcmVzcG9uc2UgZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gb3BlcmF0aW9uCi0gICAgICAgICAgICAqLwotICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0UGFyYW1Db3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dFBhcmFtQ29tcGxleFR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0UGFyYW1Db21wbGV4VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRvdXRQYXJhbUNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0UGFyYW1UeXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dFBhcmFtVHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4pIHsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogYXV0byBnZW5lcmF0ZWQgQXhpczIgRXJyb3IgaGFuZGxlcgotICAgICAgICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGZvciBoYW5kbGluZyBlcnJvciByZXNwb25zZSBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBvcGVyYXRpb24KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgLy8gTm8gbWV0aG9kcyBnZW5lcmF0ZWQgZm9yIG1lcHMgb3RoZXIgdGhhbiBpbi1vdXQKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotCi0gICAgfQotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0V4Y2VwdGlvblRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0V4Y2VwdGlvblRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiYjQ4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9FeGNlcHRpb25UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvZmF1bHQiPg0KLS8qKg0KLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhDQotICoNCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjDQotICovDQotDQotcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47DQotDQotcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+IGV4dGVuZHMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBleGNlcHRpb25CYXNlQ2xhc3MiLz57DQotICAgIA0KLSAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBmYXVsdE1lc3NhZ2U7DQotDQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3NTaG9ydE5hbWUiIHNlbGVjdD0iQHNob3J0TmFtZSIvPg0KLSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGNvbnN0cnVjdG9yKSA+IDAiPg0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImNvbnN0cnVjdG9yIj4NCi0gICAgICAgICAgICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2xhc3NTaG9ydE5hbWUiLz4oPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgPiAxIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPikgew0KLSAgICAgICAgICAgICAgICBzdXBlcig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSA+IDEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDpmb3ItZWFjaD4pOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICA8L3hzbDppZj4NCi0gICAgPHhzbDppZiB0ZXN0PSJjb3VudChjb25zdHJ1Y3RvcikgPSAwIj4NCi0gICAgICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPigpIHsNCi0gICAgICAgICAgICBzdXBlcigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG9ydE5hbWUiLz4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPihqYXZhLmxhbmcuU3RyaW5nIHMpIHsNCi0gICAgICAgICAgIHN1cGVyKHMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnROYW1lIi8+KGphdmEubGFuZy5TdHJpbmcgcywgamF2YS5sYW5nLlRocm93YWJsZSBleCkgew0KLSAgICAgICAgICBzdXBlcihzLCBleCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG9ydE5hbWUiLz4oamF2YS5sYW5nLlRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsNCi0gICAgICAgIH0NCi0gICAgPC94c2w6aWY+DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0TWVzc2FnZSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gbXNnKXsNCi0gICAgICAgZmF1bHRNZXNzYWdlID0gbXNnOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IGdldEZhdWx0TWVzc2FnZSgpew0KLSAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlOw0KLSAgICB9DQotfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0ludGVyZmFjZUltcGxlbWVudGF0aW9uVGVtcGxhdGUueHNsIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSW50ZXJmYWNlSW1wbGVtZW50YXRpb25UZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NzdhNTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSW50ZXJmYWNlSW1wbGVtZW50YXRpb25UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotCi0gICAgPCEtLSBpbXBvcnQgdGhlIGRhdGFiaW5kaW5nIHRlbXBsYXRlLS0+Ci0gICAgPHhzbDppbmNsdWRlIGhyZWY9ImRhdGFiaW5kc3VwcG9ydGVyIi8+Ci0gICAgPCEtLSBpbXBvcnQgdGhlIG90aGVyIHRlbXBsYXRlcyBmb3IgZGF0YWJpbmRpbmcKLSAgICAgICAgIE5vdGUgIC0gIHRoZXNlIG5hbWVzIHdvdWxkIGJlIGhhbmRsZWQgYnkgYSBzcGVjaWFsCi0gICAgICAgICBVUkkgcmVzb2x2ZXIgZHVyaW5nIHRoZSB4c2x0IHRyYW5zZm9ybWF0aW9ucwotICAgICAtLT4KLSAgICA8eHNsOmluY2x1ZGUgaHJlZj0iZXh0ZXJuYWxUZW1wbGF0ZSIvPgotICAgIAotICAgIAotICAgIDx4c2w6aW5jbHVkZSBocmVmPSJwb2xpY3lFeHRlbnNpb25UZW1wbGF0ZSIvPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2NsYXNzIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnRlcmZhY2VOYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGludGVyZmFjZU5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjYWxsYmFja25hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2FsbGJhY2tuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNTeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzU3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzQXN5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNBc3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvYXBWZXJzaW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNvYXAtdmVyc2lvbiIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzYmFja2NvbXBhdGlibGUiIHNlbGVjdD0iQGlzYmFja2NvbXBhdGlibGUiLz4KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotICAgICAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPjsKLQotICAgICAgICA8IS0tIFB1dCB0aGUgTVRPTSBlbmFibGUgZmxhZyAtLT4KLQotICAgICAgICAvKgotICAgICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gamF2YSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAqLwotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlN0dWIKLSAgICAgICAgPHhzbDppZiB0ZXN0PSJub3QoQHdyYXBwZWQpIj5pbXBsZW1lbnRzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW50ZXJmYWNlTmFtZSIvPjwveHNsOmlmPnsKLSAgICAgICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbltdIF9vcGVyYXRpb25zOwotCi0gICAgICAgIC8vaGFzaG1hcHMgdG8ga2VlcCB0aGUgZmF1bHQgbWFwcGluZwotICAgICAgICBwcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIGZhdWx0RXhjZXB0aW9uTmFtZU1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwotICAgICAgICBwcml2YXRlIGphdmEudXRpbC5IYXNoTWFwIGZhdWx0RXhjZXB0aW9uQ2xhc3NOYW1lTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgamF2YS51dGlsLkhhc2hNYXAgZmF1bHRNZXNzYWdlTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBqYXZhLmxhbmcuU3RyaW5nIGdldFVuaXF1ZVN1ZmZpeCgpewotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGNvdW50ZXIgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIDk5OTk5Ci0gICAgICAgICAgICBpZiAoY291bnRlciA+IDk5OTk5KXsKLSAgICAgICAgICAgICAgICBjb3VudGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMTsgCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkxvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpICsgIl8iICsgY291bnRlcjsKLSAgICAgICAgfQotCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQXhpc1NlcnZpY2UoKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotCi0gICAgIC8vY3JlYXRpbmcgdGhlIFNlcnZpY2Ugd2l0aCBhIHVuaXF1ZSBuYW1lCi0gICAgIF9zZXJ2aWNlID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VydmljZW5hbWUiLz4iICsgZ2V0VW5pcXVlU3VmZml4KCkpOwotICAgICBhZGRBbm9ueW1vdXNPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgLy9jcmVhdGluZyB0aGUgb3BlcmF0aW9ucwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24gX19vcGVyYXRpb247Ci0KLSAgICAgICAgX29wZXJhdGlvbnMgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChtZXRob2QpIi8+XTsKLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG1lcD0nMTAnIj4KLSAgICAgICAgICAgICAgICAgICAgX19vcGVyYXRpb24gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRPbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBtZXA9JzExJyI+Ci0gICAgICAgICAgICAgICAgICAgIF9fb3BlcmF0aW9uID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgIF9fb3BlcmF0aW9uID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0SW5BeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICBfX29wZXJhdGlvbi5zZXROYW1lKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKSk7Ci0JICAgIF9zZXJ2aWNlLmFkZE9wZXJhdGlvbihfX29wZXJhdGlvbik7Ci0JICAgIAotCi0JICAgIDx4c2w6aWYgdGVzdD0iaW5wdXQvQHBvbGljeSI+Ci0JICAgIChfX29wZXJhdGlvbikuZ2V0TWVzc2FnZShvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSkuZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShnZXRQb2xpY3koIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9AcG9saWN5Ii8+IikpOwotCSAgICA8L3hzbDppZj4KLQkgICAgCi0JICAgIDx4c2w6aWYgdGVzdD0ib3V0cHV0L0Bwb2xpY3kiPgotCSAgICAoX19vcGVyYXRpb24pLmdldE1lc3NhZ2Uob3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSkuZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShnZXRQb2xpY3koIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvQHBvbGljeSIvPiIpKTsKLQkgICAgPC94c2w6aWY+Ci0JICAgIAotICAgICAgICAgICAgX29wZXJhdGlvbnNbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCktMSIvPl09X19vcGVyYXRpb247Ci0gICAgICAgICAgICAKLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIH0KLQotICAgIC8vcG9wdWxhdGVzIHRoZSBmYXVsdHMKLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVGYXVsdHMoKXsKLSAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJtZXRob2QiPgotICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW0iPgotICAgICAgICAgICAgICBmYXVsdEV4Y2VwdGlvbk5hbWVNYXAucHV0KCBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FsbmFtZSIvPiIpLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgZmF1bHRFeGNlcHRpb25DbGFzc05hbWVNYXAucHV0KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxuYW1lIi8+IiksIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpOwotICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VNYXAucHV0KCBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lc3BhY2UiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FsbmFtZSIvPiIpLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGluc3RhbnRpYXRhYmxlVHlwZSIvPiIpOwotICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAgKkNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgaW4gYSBjb25maWdDb250ZXh0Ci0gICAgICAqLwotCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgamF2YS5sYW5nLlN0cmluZyB0YXJnZXRFbmRwb2ludCkKLSAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotICAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uQ29udGV4dCx0YXJnZXRFbmRwb2ludCxmYWxzZSk7Ci0gICB9Ci0KLQotICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBpbiBhIGNvbmZpZ0NvbnRleHQgIGFuZCB1c2VzZXBlcmF0ZSBsaXN0bmVyCi0gICAgICovCi0gICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0YXJnZXRFbmRwb2ludCwgYm9vbGVhbiB1c2VTZXBhcmF0ZUxpc3RlbmVyKQotICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotICAgICAgICAgLy9UbyBwb3B1bGF0ZSBBeGlzU2VydmljZQotICAgICAgICAgcG9wdWxhdGVBeGlzU2VydmljZSgpOwotICAgICAgICAgcG9wdWxhdGVGYXVsdHMoKTsKLQotICAgICAgICBfc2VydmljZUNsaWVudCA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50KGNvbmZpZ3VyYXRpb25Db250ZXh0LF9zZXJ2aWNlKTsKLSAgICAgICAgPHhzbDppZiB0ZXN0PSIvL0Bwb2xpY3kiPgotICAgICAgICBfc2VydmljZS5hcHBseVBvbGljeSgpOwotICAgICAgICA8L3hzbDppZj4KLQkKLSAgICAgICAgX3NlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnNldFRvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgdGFyZ2V0RW5kcG9pbnQpKTsKLSAgICAgICAgX3NlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodXNlU2VwYXJhdGVMaXN0ZW5lcik7Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3RhcnRzLXdpdGgoJHNvYXBWZXJzaW9uLCdodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUnKSI+Ci0gICAgICAgICAgICAvL1NldCB0aGUgc29hcCB2ZXJzaW9uCi0gICAgICAgICAgICBfc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuc2V0U29hcFZlcnNpb25VUkkob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICA8L3hzbDppZj4KLSAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJlbmRwb2ludCI+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0icG9zaXRpb24oKT0xIj4KLSAgICAgICAgICAgICAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uQ29udGV4dCwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLz4iICk7Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgLy90aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiIgKTsKLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVuZHBvaW50Ij4KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgICAgICAgICB0aGlzKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPiIgKTsKLSAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAvL3RoaXMoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuIi8+IiApOwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGFraW5nIHRoZSB0YXJnZXQgZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGphdmEubGFuZy5TdHJpbmcgdGFyZ2V0RW5kcG9pbnQpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMobnVsbCx0YXJnZXRFbmRwb2ludCk7Ci0gICAgfQotCi0KLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIDwhLS0gSWYgdXNlZGJtZXRob2QgYXR0cmlidXRlIHByZXNlbnQsIGdpdmVzIG5hbWUgb2YgbWV0aG9kIHRvIGNhbGwgZm9yIGltcGxlbWVudGF0aW9uIC0tPgotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idXNlZGJpbXBsIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVzZGJpbXBsIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkdXNlZGJpbXBsIT0ndHJ1ZSciPgotICAgICAgICAgIAotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0B0eXBlIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dGNvbXBsZXh0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0Bjb21wbGV4dHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRvcG5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQG9wbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdHlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdHlsZSI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNvYXBBY3Rpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc29hcGFjdGlvbiI+PC94c2w6dmFsdWUtb2Y+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXAiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cGFyYW1jb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cGFyYW1zaG9ydHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQHNob3J0dHlwZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRwYXJhbXBhcnRuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0BwYXJ0bmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLSAgICAgICAgPCEtLSBNVE9NIC0tPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJtZXRob2QtbnMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZXNwYWNlIi8+IDwveHNsOnZhcmlhYmxlPgotICAgICAgICA8IS0tIE1UT00gLS0+Ci0KLSAgICAgICAgICAgIDwhLS0gQ29kZSBnZW5lcmF0aW9uIGZvciB0aGUgaW4tb3V0IG1lcCAtLT4KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTInIj4gIDwhLS0gVGhlc2UgY29uc3RhbnRzIGNhbiBiZSBmb3VuZCBpbiBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cyAtLT4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1N5bmM9JzEnIj4KLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAqIEBzZWUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW50ZXJmYWNlTmFtZSIvPiM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48eHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOnRleHQ+PC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBpZiAtYiBmbGFnIGlzIG9uIHRoZW4gd2UgaGF2ZSB0byB1bndyYXAgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNiYWNrY29tcGF0aWJsZSA9ICd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+dm9pZDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRjb21wbGV4dHlwZSIvPjwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRDb21wbGV4VHlwZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0Bjb21wbGV4dHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0Q29tcGxleFR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PCEtLSBKdXN0IGxlYXZlIGl0IC0gbm90aGluZyB3ZSBjYW4gZG8gaGVyZSAtLT48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaW5wdXRjb3VudD0xIGFuZCBpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPnZvaWQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0cGFyYW1jb3VudD0xIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0B0eXBlIi8+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dGNvbXBsZXh0eXBlIi8+PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRvdXRwdXRwYXJhbWNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPnZvaWQ8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRQYXJhbUNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0pIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKCRpbnB1dGNvdW50PTEgYW5kIGlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSkgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCgkaXNVbndyYXBQYXJhbWV0ZXJzIGFuZCAkaW5wdXRQYXJhbUNvdW50PTApIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgPCEtLWFkZCB0aGUgZmF1bHRzLS0+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+ewotICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgX21lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50IF9vcGVyYXRpb25DbGllbnQgPSBfc2VydmljZUNsaWVudC5jcmVhdGVDbGllbnQoX29wZXJhdGlvbnNbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCktMSIvPl0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNvYXBBY3Rpb24iLz4iKTsKLSAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KHRydWUpOwotCi0gICAgICAgICAgICAgIDwhLS0gYWRkIHRoZSBvdGhlciBwYXJhbWV0ZXIgb3B0aW9ucyB0byBvcGVyYXRpb25hbCBjbGllbnQgLS0+Ci0gICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvcHRpb25QYXJhbSI+Ci0gICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eVRvT3BlcmF0aW9uQ2xpZW50KF9vcGVyYXRpb25DbGllbnQsPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4pOwotICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgX21lc3NhZ2VDb250ZXh0ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgICAgICAgIDwhLS10b2RvIGlmIHRoZSBzdHViIHdhcyBnZW5lcmF0ZWQgd2l0aCB1bndyYXBwaW5nLCB3cmFwIGFsbCBwYXJhbWV0ZXJzIGludG8gYSBzaW5nbGUgZWxlbWVudC0tPgotCi0gICAgICAgICAgICAgIC8vIGNyZWF0ZSBTT0FQIGVudmVsb3BlIHdpdGggdGhhdCBwYXlsb2FkCi0gICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdCB0aGUgbnVtYmVyIG9mIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIGlzIG1vcmUgdGhlbiBqdXN0IHJ1biB0aGUgbm9ybWFsIHRlc3QtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY291bnQgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzdHlsZSBiZWluZyBkb2NsaXQgb3IgcnBjIGRvZXMgbm90IG1hdHRlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0ncnBjJyBvciAkc3R5bGU9J2RvY3VtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHVud3JhcHBpbmcgdGFrZXMgcGxhY2Ugb25seSBpZiB0aGUgYmFjayB3b3JkIGNvbXBhdGlibGl0eSBpcyBvZmYuIGlmIC1iIG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHdlIGRvIG5vdCB1bndyYXBwIGFuZCBvbmx5IHJlbW92ZSB0aGUgdG9wIGVsZW1lbnQgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BOYW1lIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG9wbmFtZSI+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCgkaXNiYWNrY29tcGF0aWJsZT0ndHJ1ZScpIGFuZCAoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0RWxlbWVudENvbXBsZXhUeXBlKSkgPiAwKSkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZXJlIGFyZSBubyB1bndyYXBwZWQgcGFyYW1ldGVycyAtIGdvIGFoZWFkIGFuZCB1c2UgdGhlIG5vcm1hbCB3cmFwcGVkIGNvZGVnZW4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BOYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IigkaXNVbndyYXBQYXJhbWV0ZXJzKSBhbmQgbm90KCRpc2JhY2tjb21wYXRpYmxlPSd0cnVlJykiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5kdW1teVdyYXBwZWRUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSB0b0VudmVsb3BlKGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+ZHVtbXlXcmFwcGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGVyZSBhcmUgbm8gdW53cmFwcGVkIHBhcmFtZXRlcnMgLSBnbyBhaGVhZCBhbmQgdXNlIHRoZSBub3JtYWwgd3JhcHBlZCBjb2RlZ2VuLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10pICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGNoaWxkcmVuIG9ubHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbXVzdFVuZGVyc3RhbmQgPSAndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlcihvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sZW52LHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlcihvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sZW52KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdodHRwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGNoaWxkcmVuIG9ubHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRIdHRwSGVhZGVyKF9tZXNzYWdlQ29udGV4dCwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBoZWFkZXJuYW1lIi8+Iiw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSBkZXRlY3RlZCAhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gaW5wdXQgcGFyYW1ldGVycyBwcmVzZW50LiBTbyBnZW5lcmF0ZSBhc3N1bWluZyBubyBpbnB1dCBwYXJhbWV0ZXJzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0ncnBjJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0eWxlIGlzIHRha2VuIHRvIGJlICJycGMiLiBObyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LmdldEJvZHkoKS5hZGRDaGlsZChmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsICIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J2RvY3VtZW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0eWxlIGlzIHRha2VuIHRvIGJlICJkb2N1bWVudCIuIE5vIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgV1MtQmFzaWMgcHJvZmlsZSBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzZW5kIGFuIGVtcHR5IHNvYXAgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Vbmtub3duIHN0eWxlIGRldGVjdGVkICEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgLy9hZGRpbmcgU09BUCBzb2FwX2hlYWRlcnMKLSAgICAgICAgIF9zZXJ2aWNlQ2xpZW50LmFkZEhlYWRlcnNUb0VudmVsb3BlKGVudik7Ci0gICAgICAgIC8vIHNldCB0aGUgbWVzc2FnZSBjb250ZXh0IHdpdGggdGhhdCBzb2FwIGVudmVsb3BlCi0gICAgICAgIF9tZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnYpOwotCi0gICAgICAgIC8vIGFkZCB0aGUgbWVzc2FnZSBjb250eHQgdG8gdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgICAgX29wZXJhdGlvbkNsaWVudC5hZGRNZXNzYWdlQ29udGV4dChfbWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIC8vZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIGNsaWVudAotICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgX3JldHVybk1lc3NhZ2VDb250ZXh0ID0gX29wZXJhdGlvbkNsaWVudC5nZXRNZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIF9yZXR1cm5FbnYgPSBfcmV0dXJuTWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICA8IS0tIHRvZG8gbmVlZCB0byBjaGFuZ2UgdGhpcyB0byBjYXRlciBmb3IgdW53cmFwcGVkIG1lc3NhZ2VzIChtdWx0aXBsZSBwYXJ0cykgLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J2RvY3VtZW50JyBvciAkc3R5bGU9J3JwYyciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0J5dGUoX3JldHVybkVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhfcmV0dXJuRW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2NoYXInIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvQ2hhcihfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b0RvdWJsZShfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvRmxvYXQoX3JldHVybkVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhfcmV0dXJuRW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2ludCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9JbnQoX3JldHVybkVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhfcmV0dXJuRW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvTG9uZyhfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvU2hvcnQoX3JldHVybkVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhfcmV0dXJuRW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2Jvb2xlYW4nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvQm9vbGVhbihfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBvYmplY3QgPSBmcm9tT00oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuRW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKF9yZXR1cm5FbnYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHBhcmFtY291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0cGFyYW1zaG9ydHR5cGUiLz48eHNsOnZhbHVlLW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkb3V0cHV0cGFyYW1wYXJ0bmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhpcyBjb3ZlcnMgYm90aCBiYWNrIGNvbXBhdGliaWxpdHkgYW5kIG5vcm1hbCB1bndyYXBwaW5nIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dG9wbmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJG91dHB1dHBhcmFtY291bnQ9MCkgYW5kICgkaXNVbndyYXBQYXJhbWV0ZXJzKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPilvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUgZGV0ZWN0ZWQgISEgTm8gY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgfWNhdGNoKG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGYpewotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBmYXVsdEVsdCA9IGYuZ2V0RGV0YWlsKCk7Ci0gICAgICAgICAgICBpZiAoZmF1bHRFbHQhPW51bGwpewotICAgICAgICAgICAgICAgIGlmIChmYXVsdEV4Y2VwdGlvbk5hbWVNYXAuY29udGFpbnNLZXkoZmF1bHRFbHQuZ2V0UU5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgICAvL21ha2UgdGhlIGZhdWx0IGJ5IHJlZmxlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyBleGNlcHRpb25DbGFzc05hbWUgPSAoamF2YS5sYW5nLlN0cmluZylmYXVsdEV4Y2VwdGlvbkNsYXNzTmFtZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgZXhjZXB0aW9uQ2xhc3MgPSBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShleGNlcHRpb25DbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbiBleD0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5FeGNlcHRpb24pIGV4Y2VwdGlvbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL21lc3NhZ2UgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbWVzc2FnZUNsYXNzTmFtZSA9IChqYXZhLmxhbmcuU3RyaW5nKWZhdWx0TWVzc2FnZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgbWVzc2FnZUNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IG1lc3NhZ2VPYmplY3QgPSBmcm9tT00oZmF1bHRFbHQsbWVzc2FnZUNsYXNzLG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPSBleGNlcHRpb25DbGFzcy5nZXRNZXRob2QoInNldEZhdWx0TWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmxhbmcuQ2xhc3NbXXttZXNzYWdlQ2xhc3N9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKGV4LG5ldyBqYXZhLmxhbmcuT2JqZWN0W117bWVzc2FnZU9iamVjdH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfWNhdGNoIChqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9ICBjYXRjaCAoamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gICBjYXRjaCAoamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBfbWVzc2FnZUNvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCkuZ2V0U2VuZGVyKCkuY2xlYW51cChfbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwhLS0gQXN5bmMgbWV0aG9kIGdlbmVyYXRpb24gLS0+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc0FzeW5jPScxJyI+Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIGZvciBBc3luY2hyb25vdXMgSW52b2NhdGlvbnMKLSAgICAgICAgICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPgotICAgICAgICAgICAgICAgICogQHNlZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnRlcmZhY2VOYW1lIi8+I3N0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPjx4c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8L3hzbDp0ZXh0PjwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljICB2b2lkIHN0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotCi0gICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0V3JhcHBlZENvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0pIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48IS0tIEp1c3QgbGVhdmUgaXQgLSBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIC0tPjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IigkaW5wdXRjb3VudD0xKSBhbmQgbm90KCRpc1Vud3JhcFBhcmFtZXRlcnMgYW5kICRpbnB1dFdyYXBwZWRDb3VudD0wKSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICAgIGZpbmFsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhbGxiYWNrbmFtZSIvPiBjYWxsYmFjaykKLQotICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb257Ci0KLSAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50IF9vcGVyYXRpb25DbGllbnQgPSBfc2VydmljZUNsaWVudC5jcmVhdGVDbGllbnQoX29wZXJhdGlvbnNbPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCktMSIvPl0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc29hcEFjdGlvbiIvPiIpOwotICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCh0cnVlKTsKLQotICAgICAgICAgICAgICA8IS0tIGFkZCB0aGUgb3RoZXIgcGFyYW1ldGVyIG9wdGlvbnMgdG8gb3BlcmF0aW9uYWwgY2xpZW50IC0tPgotICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3B0aW9uUGFyYW0iPgotICAgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlUb09wZXJhdGlvbkNsaWVudChfb3BlcmF0aW9uQ2xpZW50LDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+KTsKLSAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLQotICAgICAgICAgICAgICAvLyBjcmVhdGUgU09BUCBlbnZlbG9wZSB3aXRoIHRoYXQgcGF5bG9hZAotICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudj1udWxsOwotICAgICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgX21lc3NhZ2VDb250ZXh0ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQHR5cGUhPScnXSkiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRlc3QgdGhlIG51bWJlciBvZiBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBpcyBtb3JlIHRoZW4ganVzdCBydW4gdGhlIG5vcm1hbCB0ZXN0LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNvdW50ICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J2RvY3VtZW50JyBvciAkc3R5bGU9J3JwYyciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHlsZSBpcyBEb2MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PmR1bW15V3JhcHBlZFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IHRvRW52ZWxvcGUoZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gZHVtbXlXcmFwcGVkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGVyZSBhcmUgbm8gdW53cmFwcGVkIHBhcmFtZXRlcnMgLSBnbyBhaGVhZCBhbmQgdXNlIHRoZSBub3JtYWwgd3JhcHBlZCBjb2RlZ2VuLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J3NvYXBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHNvYXBfaGVhZGVycyBvbmx5IGlmIHRoZXkgYXJlIG5vdCBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG11c3RVbmRlcnN0YW5kID0gJ3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSB0b09NKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LGVudix0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gPSB0b09NKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiwgb3B0aW1pemVDb250ZW50KG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1ucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdodHRwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGNoaWxkcmVuIG9ubHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRIdHRwSGVhZGVyKF9tZXNzYWdlQ29udGV4dCwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBoZWFkZXJuYW1lIi8+Iiw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSBkZXRlY3RlZCAhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gaW5wdXQgcGFyYW1ldGVycyBwcmVzZW50LiBTbyBnZW5lcmF0ZSBhc3N1bWluZyBubyBpbnB1dCBwYXJhbWV0ZXJzLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0ncnBjJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0eWxlIGlzIERvYy4gTm8gaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRCb2R5KCkuYWRkQ2hpbGQoZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLCAiIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdkb2N1bWVudCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHlsZSBpcyB0YWtlbiB0byBiZSAiZG9jdW1lbnQiLiBObyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIFdTLUJhc2ljIHByb2ZpbGUgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2VuZCBhbiBlbXB0eSBzb2FwIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Vbmtub3duIHN0eWxlIGRldGVjdGVkICEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgLy8gYWRkaW5nIFNPQVAgc29hcF9oZWFkZXJzCi0gICAgICAgICBfc2VydmljZUNsaWVudC5hZGRIZWFkZXJzVG9FbnZlbG9wZShlbnYpOwotICAgICAgICAvLyBjcmVhdGUgbWVzc2FnZSBjb250ZXh0IHdpdGggdGhhdCBzb2FwIGVudmVsb3BlCi0gICAgICAgIF9tZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnYpOwotCi0gICAgICAgIC8vIGFkZCB0aGUgbWVzc2FnZSBjb250ZXh0IHRvIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgIF9vcGVyYXRpb25DbGllbnQuYWRkTWVzc2FnZUNvbnRleHQoX21lc3NhZ2VDb250ZXh0KTsKLQotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIHBhc3MgYXMgdGhlIGNhbGxiYWNrISEhCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LnNldENhbGxiYWNrKG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25NZXNzYWdlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCByZXN1bHRDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSByZXN1bHRFbnYgPSByZXN1bHRDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih0b0J5dGUocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nY2hhciciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4odG9DaGFyKHJlc3VsdEVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKHJlc3VsdEVudikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9J2RvdWJsZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4odG9Eb3VibGUocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nZmxvYXQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHRvRmxvYXQocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0naW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih0b0ludChyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhyZXN1bHRFbnYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPSdsb25nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih0b0xvbmcocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nc2hvcnQnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHRvU2hvcnQocmVzdWx0RW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nYm9vbGVhbiciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4odG9Cb29sZWFuKHJlc3VsdEVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKHJlc3VsdEVudikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IG9iamVjdCA9IGZyb21PTShyZXN1bHRFbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMocmVzdWx0RW52KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZVJlc3VsdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPik7PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHBhcmFtY291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0cGFyYW1zaG9ydHR5cGUiLz48eHNsOnZhbHVlLW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkb3V0cHV0cGFyYW1wYXJ0bmFtZSIvPigoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KW9iamVjdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dGNvbXBsZXh0eXBlIi8+KW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRvdXRwdXRwYXJhbWNvdW50PTApIGFuZCAoJGlzVW53cmFwUGFyYW1ldGVycykiPik7PC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+KW9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoamF2YS5sYW5nLkV4Y2VwdGlvbiBlcnJvcikgewotCQkJCQkJCQlpZiAoZXJyb3IgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCkgewotCQkJCQkJCQkJb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgZiA9IChvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCkgZXJyb3I7Ci0JCQkJCQkJCQlvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBmYXVsdEVsdCA9IGYuZ2V0RGV0YWlsKCk7Ci0JCQkJCQkJCQlpZiAoZmF1bHRFbHQhPW51bGwpewotCQkJCQkJCQkJCWlmIChmYXVsdEV4Y2VwdGlvbk5hbWVNYXAuY29udGFpbnNLZXkoZmF1bHRFbHQuZ2V0UU5hbWUoKSkpewotCQkJCQkJCQkJCQkvL21ha2UgdGhlIGZhdWx0IGJ5IHJlZmxlY3Rpb24KLQkJCQkJCQkJCQkJdHJ5ewotCQkJCQkJCQkJCQkJCWphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gKGphdmEubGFuZy5TdHJpbmcpZmF1bHRFeGNlcHRpb25DbGFzc05hbWVNYXAuZ2V0KGZhdWx0RWx0LmdldFFOYW1lKCkpOwotCQkJCQkJCQkJCQkJCWphdmEubGFuZy5DbGFzcyBleGNlcHRpb25DbGFzcyA9IGphdmEubGFuZy5DbGFzcy5mb3JOYW1lKGV4Y2VwdGlvbkNsYXNzTmFtZSk7Ci0JCQkJCQkJCQkJCQkJamF2YS5sYW5nLkV4Y2VwdGlvbiBleD0KLQkJCQkJCQkJCQkJCQkJKGphdmEubGFuZy5FeGNlcHRpb24pIGV4Y2VwdGlvbkNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCQkJCQkJLy9tZXNzYWdlIGNsYXNzCi0JCQkJCQkJCQkJCQkJamF2YS5sYW5nLlN0cmluZyBtZXNzYWdlQ2xhc3NOYW1lID0gKGphdmEubGFuZy5TdHJpbmcpZmF1bHRNZXNzYWdlTWFwLmdldChmYXVsdEVsdC5nZXRRTmFtZSgpKTsKLQkJCQkJCQkJCQkJCQkJamF2YS5sYW5nLkNsYXNzIG1lc3NhZ2VDbGFzcyA9IGphdmEubGFuZy5DbGFzcy5mb3JOYW1lKG1lc3NhZ2VDbGFzc05hbWUpOwotCQkJCQkJCQkJCQkJCWphdmEubGFuZy5PYmplY3QgbWVzc2FnZU9iamVjdCA9IGZyb21PTShmYXVsdEVsdCxtZXNzYWdlQ2xhc3MsbnVsbCk7Ci0JCQkJCQkJCQkJCQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPSBleGNlcHRpb25DbGFzcy5nZXRNZXRob2QoInNldEZhdWx0TWVzc2FnZSIsCi0JCQkJCQkJCQkJCQkJCQluZXcgamF2YS5sYW5nLkNsYXNzW117bWVzc2FnZUNsYXNzfSk7Ci0JCQkJCQkJCQkJCQkJbS5pbnZva2UoZXgsbmV3IGphdmEubGFuZy5PYmplY3RbXXttZXNzYWdlT2JqZWN0fSk7Ci0JCQkJCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtIj4KLQkJCQkJCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pewotCQkJCQkJCQkJCQkJCQljYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+KCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pZXgpOwotCQkJCQkJCQkJCQkgICAgICAgICAgICByZXR1cm47Ci0JCQkJCQkJCQkJICAgICAgICAgICAgfQotCQkJCQkJCQkJCSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCQkJCQkKLQkJCQkJCQkJCQkgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4obmV3IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5yZWNlaXZlRXJyb3I8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPihmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCQkJCQkgICAgfSBlbHNlIHsKLQkJCQkJCQkJCQkgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotCQkJCQkJCQkJICAgIH0KLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGYpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGVycm9yKTsKLQkJCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmF1bHQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGZhdWx0Q29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBmYXVsdCA9IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlscy5nZXRJbmJvdW5kRmF1bHRGcm9tTWVzc2FnZUNvbnRleHQoZmF1bHRDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXNzYWdlQ29udGV4dC5nZXRUcmFuc3BvcnRPdXQoKS5nZXRTZW5kZXIoKS5jbGVhbnVwKF9tZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXRpbC5DYWxsYmFja1JlY2VpdmVyIF9jYWxsYmFja1JlY2VpdmVyID0gbnVsbDsKLSAgICAgICAgaWYgKCBfb3BlcmF0aW9uc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKS0xIi8+XS5nZXRNZXNzYWdlUmVjZWl2ZXIoKT09bnVsbCAmYW1wOyZhbXA7ICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICBfY2FsbGJhY2tSZWNlaXZlciA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ2FsbGJhY2tSZWNlaXZlcigpOwotICAgICAgICAgIF9vcGVyYXRpb25zWzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz5dLnNldE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAgICAgX2NhbGxiYWNrUmVjZWl2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgICAgLy9leGVjdXRlIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZXhlY3V0ZShmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICAgIDwhLS0gRW5kIG9mIGluLW91dCBtZXAgLS0+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotCi0KLQotICAgICAgICAgICAgPCEtLSBTdGFydCBvZiBpbiBvbmx5IG1lcC0tPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMCcgb3IgJG1lcD0nMTEnIj4gPCEtLSBUaGVzZSBjb25zdGFudHMgY2FuIGJlIGZvdW5kIGluIG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzIC0tPgotICAgICAgICAgICAgICAgIDwhLS0gZm9yIHRoZSBpbiBvbmx5IG1lcCB0aGVyZSBpcyBubyBub3Rpb24gb2Ygc3luYyBvciBhc3luYy4gQW5kIHRoZXJlIGlzIG5vIHJldHVybiB0eXBlIGFsc28gLS0+Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUKLSAgICAgICAgICAgICAgICAgICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+Ci0gICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTEnIj4KLSAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICAgICAgICAgICAgICAgICAqIEB0aHJvd3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IDogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpbnB1dGNvdW50PTEgYW5kIGlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIDwhLS1hZGQgdGhlIGZhdWx0cy0tPgotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTEnIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IF9tZXNzYWdlQ29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRtZXA9JzExJyI+dHJ5IHs8L3hzbDppZj4KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQgX29wZXJhdGlvbkNsaWVudCA9IF9zZXJ2aWNlQ2xpZW50LmNyZWF0ZUNsaWVudChfb3BlcmF0aW9uc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKS0xIi8+XS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzb2FwQWN0aW9uIi8+Iik7Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KHRydWUpOwotCi0gICAgICAgICAgICAgICAgPCEtLSBhZGQgdGhlIG90aGVyIHBhcmFtZXRlciBvcHRpb25zIHRvIG9wZXJhdGlvbmFsIGNsaWVudCAtLT4KLSAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im9wdGlvblBhcmFtIj4KLSAgICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoX29wZXJhdGlvbkNsaWVudCw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPik7Ci0gICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0BBY3Rpb24hPScnXSI+X29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQEFjdGlvbiIvPiIpOzwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgX21lc3NhZ2VDb250ZXh0ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0ZXN0IHRoZSBudW1iZXIgb2YgaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyIGlzIG1vcmUgdGhlbiBqdXN0IHJ1biB0aGUgbm9ybWFsIHRlc3QtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNvdW50ICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzdHlsZSBiZWluZyBkb2NsaXQgb3IgcnBjIGRvZXMgbm90IG1hdHRlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkc3R5bGU9J3JwYycgb3IgJHN0eWxlPSdkb2N1bWVudCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3R5bGUgaXMgRG9jLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5kdW1teVdyYXBwZWRUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPmR1bW15V3JhcHBlZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGVyZSBhcmUgbm8gdW53cmFwcGVkIHBhcmFtZXRlcnMgLSBnbyBhaGVhZCBhbmQgdXNlIHRoZSBub3JtYWwgd3JhcHBlZCBjb2RlZ2VuLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IHRvRW52ZWxvcGUoZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gdG9FbnZlbG9wZShnZXRGYWN0b3J5KF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpLmdldFNvYXBWZXJzaW9uVVJJKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdzb2FwX2hlYWRlciddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBjaGlsZHJlbiBvbmx5IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG11c3RVbmRlcnN0YW5kID0gJ3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgb21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+ID0gdG9PTSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sIG9wdGltaXplQ29udGVudChuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtZXRob2QtbmFtZSIvPiIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEhlYWRlcihvbUVsZW1lbnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sZW52LHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IG9tRWxlbWVudDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA9IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LCBvcHRpbWl6ZUNvbnRlbnQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5hbWUiLz4iKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LGVudik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2h0dHBfaGVhZGVyJ10iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGNoaWxkcmVuIG9ubHkgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEh0dHBIZWFkZXIoX21lc3NhZ2VDb250ZXh0LCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhlYWRlcm5hbWUiLz4iLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUgZGV0ZWN0ZWQgISEgTm8gY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBpbnB1dCBwYXJhbWV0ZXJzIHByZXNlbnQuIFNvIGdlbmVyYXRlIGFzc3VtaW5nIG5vIGlucHV0IHBhcmFtZXRlcnMtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdycGMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1N0eWxlIGlzIHRha2VuIHRvIGJlICJkb2N1bWVudCIuIE5vIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0Qm9keSgpLmFkZENoaWxkKGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1ldGhvZC1uYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWV0aG9kLW5zIi8+IiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdkb2N1bWVudCciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vU3R5bGUgaXMgdGFrZW4gdG8gYmUgImRvY3VtZW50Ii4gTm8gaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgV1MtQmFzaWMgcHJvZmlsZSBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBzZW5kIGFuIGVtcHR5IHNvYXAgbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeShfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5nZXRTb2FwVmVyc2lvblVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUgZGV0ZWN0ZWQgISEgTm8gY29kZSBpcyBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAvL2FkZGluZyBTT0FQIHNvYXBfaGVhZGVycwotICAgICAgICAgX3NlcnZpY2VDbGllbnQuYWRkSGVhZGVyc1RvRW52ZWxvcGUoZW52KTsKLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgbWVzc2FnZSBjb250ZXh0IHdpdGggdGhhdCBzb2FwIGVudmVsb3BlCi0KLSAgICAgICAgICAgIF9tZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnYpOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIG1lc3NhZ2UgY29udHh0IHRvIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KF9tZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMSciPgotICAgICAgICAgICAgICAgfWNhdGNoKG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGYpewotICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZmF1bHRFbHQgPSBmLmdldERldGFpbCgpOwotICAgICAgICAgICAgICAgICAgaWYgKGZhdWx0RWx0IT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHRFeGNlcHRpb25OYW1lTWFwLmNvbnRhaW5zS2V5KGZhdWx0RWx0LmdldFFOYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tYWtlIHRoZSBmYXVsdCBieSByZWZsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gKGphdmEubGFuZy5TdHJpbmcpZmF1bHRFeGNlcHRpb25DbGFzc05hbWVNYXAuZ2V0KGZhdWx0RWx0LmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIGV4Y2VwdGlvbkNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoZXhjZXB0aW9uQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5FeGNlcHRpb24gZXg9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuRXhjZXB0aW9uKSBleGNlcHRpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tZXNzYWdlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG1lc3NhZ2VDbGFzc05hbWUgPSAoamF2YS5sYW5nLlN0cmluZylmYXVsdE1lc3NhZ2VNYXAuZ2V0KGZhdWx0RWx0LmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIG1lc3NhZ2VDbGFzcyA9IGphdmEubGFuZy5DbGFzcy5mb3JOYW1lKG1lc3NhZ2VDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBtZXNzYWdlT2JqZWN0ID0gZnJvbU9NKGZhdWx0RWx0LG1lc3NhZ2VDbGFzcyxudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtID0gZXhjZXB0aW9uQ2xhc3MuZ2V0TWV0aG9kKCJzZXRGYXVsdE1lc3NhZ2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YS5sYW5nLkNsYXNzW117bWVzc2FnZUNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShleCxuZXcgamF2YS5sYW5nLk9iamVjdFtde21lc3NhZ2VPYmplY3R9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KWV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChqYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaCAoamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwgQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgY2F0Y2ggKGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgY2F0Y2ggKGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbCBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBfbWVzc2FnZUNvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCkuZ2V0U2VuZGVyKCkuY2xlYW51cChfbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkbWVwPScxMScpIj4KLSAgICAgICAgICAgICAgX21lc3NhZ2VDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpLmdldFNlbmRlcigpLmNsZWFudXAoX21lc3NhZ2VDb250ZXh0KTsgCi0gICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgfQotICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0KLSAgICAgICAvKioKLSAgICAgICAgKiAgQSB1dGlsaXR5IG1ldGhvZCB0aGF0IGNvcGllcyB0aGUgbmFtZXBhY2VzIGZyb20gdGhlIFNPQVBFbnZlbG9wZQotICAgICAgICAqLwotICAgICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBnZXRFbnZlbG9wZU5hbWVzcGFjZXMob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYpewotICAgICAgICBqYXZhLnV0aWwuTWFwIHJldHVybk1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwotICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgbmFtZXNwYWNlSXRlcmF0b3IgPSBlbnYuZ2V0QWxsRGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHdoaWxlIChuYW1lc3BhY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgbnMgPSAob3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSkgbmFtZXNwYWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuTWFwLnB1dChucy5nZXRQcmVmaXgoKSxucy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICByZXR1cm4gcmV0dXJuTWFwOwotICAgIH0KLQotICAgIDx4c2w6aWYgdGVzdD0iLy9AcG9saWN5Ij4KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3kgZ2V0UG9saWN5IChqYXZhLmxhbmcuU3RyaW5nIHBvbGljeVN0cmluZykgewotICAgIAlqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShwb2xpY3lTdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0gICAgCXJldHVybiBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmUuZ2V0UG9saWN5KGJhaXMpOwotICAgIH0KLSAgICAKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICA8L3hzbDppZj4KLSAgICAKLSAgICBwcml2YXRlIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSBvcE5hbWVBcnJheSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG9wdGltaXplQ29udGVudChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIG9wTmFtZSkgewotICAgICAgICA8eHNsOmlmIHRlc3Q9InN0dWJNZXRob2RzIj4KLSAgICAgICAgICAgIHNldE9wTmFtZUFycmF5KCk7Ci0gICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIGlmIChvcE5hbWVBcnJheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBvcE5hbWVBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG9wTmFtZS5lcXVhbHMob3BOYW1lQXJyYXlbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAgLy88eHNsOmFwcGx5LXRlbXBsYXRlcz48eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGV4dCI+aW50ZXJmYWNlLWltcGxlbWVudGF0aW9uPC94c2w6d2l0aC1wYXJhbT48L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICB9Ci0gICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9JbnRlcmZhY2VUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9JbnRlcmZhY2VUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNDM5MjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSW50ZXJmYWNlVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+DQotDQotICAgICA8IS0tIGltcG9ydCB0aGUgZGF0YWJpbmRpbmcgdGVtcGxhdGUtLT4NCi0gICAgPHhzbDppbmNsdWRlIGhyZWY9ImRhdGFiaW5kc3VwcG9ydGVyIi8+DQotICAgIDwhLS0gaW1wb3J0IHRoZSBvdGhlciB0ZW1wbGF0ZXMgZm9yIGRhdGFiaW5kaW5nDQotICAgICAgICAgTm90ZSAgLSAgdGhlc2UgbmFtZXMgd291bGQgYmUgaGFuZGxlZCBieSBhIHNwZWNpYWwNCi0gICAgICAgICBVUkkgcmVzb2x2ZXIgZHVyaW5nIHRoZSB4c2x0IHRyYW5zZm9ybWF0aW9ucw0KLSAgICAgLS0+DQotICAgIDx4c2w6aW5jbHVkZSBocmVmPSJleHRlcm5hbFRlbXBsYXRlIi8+DQotDQotDQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2UiPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzU3luYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpc1N5bmMiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc0FzeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzQXN5bmMiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjYWxsYmFja25hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY2FsbGJhY2tuYW1lIi8+PC94c2w6dmFyaWFibGU+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+PC94c2w6dmFyaWFibGU+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNiYWNrY29tcGF0aWJsZSIgc2VsZWN0PSJAaXNiYWNrY29tcGF0aWJsZSIvPg0KLQ0KLS8qKg0KLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhDQotICoNCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjDQotICovDQotDQotICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ow0KLQ0KLSAgICAvKg0KLSAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGphdmEgaW50ZXJmYWNlDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+IHsNCi0gICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+DQotICAgICAgICAgICAgPCEtLSBDb2RlIGZvciBpbi1vdXQgbWVwIC0tPg0KLSAgICAgICAgIDx4c2w6aWYgdGVzdD0iQG1lcD0nMTInIj4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0Y29tcGxleHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vQGNvbXBsZXh0eXBlIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHBhcmFtY291bnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0pIj48L3hzbDp2YWx1ZS1vZj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLQ0KLSAgICAgICAgPCEtLSBzdGFydCBvZiB0aGUgc3luYyBibG9jayAtLT4NCi0gICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1N5bmM9JzEnIj4NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0gICAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4NCi0gICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIj48L3hzbDp2YWx1ZS1vZj48eHNsOnRleHQ+DQotICAgICAgICAgICAgICAgIDwveHNsOnRleHQ+PC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiA6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzYmFja2NvbXBhdGlibGU9J3RydWUnIj4NCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dGNvbXBsZXh0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXR0eXBlIi8+PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KA0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Q29tcGxleFR5cGUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AY29tcGxleHR5cGUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dENvbXBsZXhUeXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpbnB1dGNvdW50PTEgYW5kIGlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+LDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24NCi0gICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgcHVibGljIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRwdXR0eXBlPScnIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0cGFyYW1jb3VudD0xIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0B0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0cHV0Y29tcGxleHR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2YNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Iigkb3V0cHV0cGFyYW1jb3VudD0wKSBhbmQgKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KA0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48IS0tIEp1c3QgbGVhdmUgaXQgLSBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIC0tPjwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkaW5wdXRjb3VudD0xIGFuZCBpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPiw8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPikNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uDQotICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICA8L3hzbDpjaG9vc2U+DQotDQotICAgICAgICAgIDwhLS1hZGQgdGhlIGZhdWx0cy0tPg0KLSAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ow0KLQ0KLSAgICAgICAgPC94c2w6aWY+DQotDQotICAgICAgIDwhLS0gc3RhcnQgb2YgdGhlIGFzeW5jIGJsb2NrIC0tPg0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkaXNBc3luYz0nMSciPg0KLSAgICAgICAgIC8qKg0KLSAgICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZSBmb3IgQXN5bmNocm9ub3VzIEludm9jYXRpb25zDQotICAgICAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4NCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgICogQHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+PHhzbDp0ZXh0Pg0KLSAgICAgICAgICAgIDwveHNsOnRleHQ+PC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigNCi0NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0V3JhcHBlZENvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0pIi8+DQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKCRpbnB1dGNvdW50PTEpIGFuZCBub3QoJGlzVW53cmFwUGFyYW1ldGVycyBhbmQgJGlucHV0V3JhcHBlZENvdW50PTApIj4sPC94c2w6aWY+DQotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtub3QoQGxvY2F0aW9uPSdib2R5JykgYW5kIEB0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LA0KLSAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0NCi0gICAgICAgICAgICBmaW5hbCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYWxsYmFja25hbWUiLz4gY2FsbGJhY2spDQotDQotICAgICAgICAgICAgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsNCi0NCi0gICAgIDwveHNsOmlmPg0KLSAgICAgPC94c2w6aWY+DQotICAgICAgICA8IS0tIENvZGUgZm9yIGluLW9ubHkgbWVwIC0tPg0KLSAgICAgICA8eHNsOmlmIHRlc3Q9IkBtZXA9JzEwJyBvciBAbWVwPScxMSciPg0KLSAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXAiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgLyoqDQotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIGZvciBBc3luY2hyb25vdXMgSW52b2NhdGlvbnMNCi0gICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbWVwPScxMSciPg0KLSAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4NCi0gICAgICAgICAgICAgICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4NCi0gICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCA8eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KA0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlDQotICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlucHV0Y291bnQ9MSBhbmQgaW5wdXQvcGFyYW1bbm90KEBsb2NhdGlvbj0nYm9keScpIGFuZCBAdHlwZSE9JyddIj4sPC94c2w6aWY+DQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW25vdChAbG9jYXRpb249J2JvZHknKSBhbmQgQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLQ0KLSAgICAgICAgKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uDQotICAgICAgICA8IS0tYWRkIHRoZSBmYXVsdHMtLT4NCi0gICAgICAgIDx4c2w6aWYgdGVzdD0iJG1lcD0nMTEnIj4NCi0gICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgLDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgPC94c2w6aWY+Ow0KLQ0KLSAgICAgICAgPC94c2w6aWY+DQotDQotICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotICAgICAgIDwhLS0gQXBwbHkgb3RoZXIgdGVtcGxhdGVzIC0tPiANCi0gICAgICAgLy88eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgIH0NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotICAgPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c0V4Y2VwdGlvblRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzRXhjZXB0aW9uVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ3YTdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzRXhjZXB0aW9uVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRhcmdldE5zIiBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L0B0YXJnZXROYW1lc3BhY2UiLz4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphdmFDb25zdHJ1Y3QiPnBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+OwotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImltcG9ydExpc3QvaW1wb3J0Ij4KLWltcG9ydCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+OzwveHNsOmZvci1lYWNoPgotPHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGNsYXNzIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwuCi0gKiBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKgotICovCi08eHNsOmZvci1lYWNoIHNlbGVjdD0iYW5ub3RhdGlvbiI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJhbm5vcGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChwYXJhbSkiLz4KLUA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtIj4KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGFubm9wYXJhbWNvdW50ID0gcG9zaXRpb24oKSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0Pj08L3hzbDp0ZXh0PiI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+IjwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+PTwveHNsOnRleHQ+Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iLDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmZvci1lYWNoPik8L3hzbDpmb3ItZWFjaD4KLXB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gZXh0ZW5kcyBFeGNlcHRpb257Ci0KLSAgICAvKioKLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0VHlwZSIvPiBmYXVsdEluZm87Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KFN0cmluZyBtZXNzYWdlLCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0VHlwZSIvPiBmYXVsdEluZm8pIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmYXVsdEluZm8KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oU3RyaW5nIG1lc3NhZ2UsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvcnRUeXBlIi8+IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqICAgcmV0dXJucyBmYXVsdCBiZWFuOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0VHlwZSIvPgotICAgICAqLwotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0VHlwZSIvPiBnZXRGYXVsdEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdEluZm87Ci0gICAgfQotfQotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICA8IS0tIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldGhvZCI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbSkiLz4KLSAgICBAamF2YXguandzLldlYk1ldGhvZAotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHBhcmFtY291bnQgPSAwIj5AamF2YXguandzLk9uZXdheTwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPkBqYXZheC5qd3MuV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+Iik8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIHB1YmxpYyA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHBhcmFtY291bnQgPSAwIj52b2lkIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnBhcmFtY291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW0pIi8+Ci0gICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtIj4KLSAgICAgICAgQGphdmF4Lmp3cy5XZWJQYXJhbShuYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIsIHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IikKLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucGFyYW1jb3VudCA9IHBvc2l0aW9uKCkiPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmZvci1lYWNoPiktLT48IS0tPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICB0aHJvd3MgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4tLT48IS0tOwotICAgIDwveHNsOnRlbXBsYXRlPi0tPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlQ2xhc3NUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VDbGFzc1RlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlM2I1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VDbGFzc1RlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YXJnZXROcyIgc2VsZWN0PSIvamF2YUNvbnN0cnVjdC9AdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZXJ2aWNlTmFtZSIgc2VsZWN0PSIvamF2YUNvbnN0cnVjdC9AbmFtZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSIgc2VsZWN0PSIvamF2YUNvbnN0cnVjdC9AY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3NkbExvY2F0aW9uIiBzZWxlY3Q9Ii9qYXZhQ29uc3RydWN0L0B3c2RsTG9jYXRpb24iLz4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphdmFDb25zdHJ1Y3QiPnBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOzwhLS08eHNsOmZvci1lYWNoIHNlbGVjdD0iaW1wb3J0TGlzdC9pbXBvcnQiPi0tPgotPCEtLWltcG9ydCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+OzwveHNsOmZvci1lYWNoPi0tPgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgY2xhc3Mgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETC4KLSAqIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqCi0gKi8KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhbm5vdGF0aW9uIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFubm9wYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KHBhcmFtKSIvPgotQDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYW5ub3BhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+PTwveHNsOnRleHQ+Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD49PC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiIsPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+KTwveHNsOmZvci1lYWNoPgotcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZU5hbWUiLz4gZXh0ZW5kcyBTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgVVJMIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSIvPl9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3NkbExvY2F0aW9uIi8+Iik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FwaXRhbGl6ZWRTZXJ2aWNlTmFtZSIvPl9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlcnZpY2VOYW1lIi8+KCkgewotICAgICAgICBzdXBlcig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhcGl0YWxpemVkU2VydmljZU5hbWUiLz5fV1NETF9MT0NBVElPTiwKLSAgICAgICAgICAgIG5ldyBRTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXROcyIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZU5hbWUiLz4iKSk7Ci0gICAgfQotCi0gICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VydmljZU5hbWUiLz4oVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvamF2YUNvbnN0cnVjdC9wb3J0Ij4KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICByZXR1cm5zIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcG9ydFR5cGVOYW1lIi8+Ci0gICAgICovPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImFubm90YXRpb24iPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYW5ub3BhcmFtY291bnQiIHNlbGVjdD0iY291bnQocGFyYW0pIi8+Ci0gICAgQDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYW5ub3BhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+PTwveHNsOnRleHQ+Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD49PC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiIsPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+KTwveHNsOmZvci1lYWNoPgotICAgIHB1YmxpYyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBvcnRUeXBlTmFtZSIvPiBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBvcnROYW1lIi8+KCkgewotICAgICAgICByZXR1cm4gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcG9ydFR5cGVOYW1lIi8+KXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwb3J0TmFtZSIvPiIpLAotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcG9ydFR5cGVOYW1lIi8+LmNsYXNzKTsKLSAgICB9PC94c2w6Zm9yLWVhY2g+ICAgICAgICAKLX0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGxUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGxUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNzgyN2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0YXJnZXROcyIgc2VsZWN0PSIvamF2YUNvbnN0cnVjdC9AdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iamF2YUNvbnN0cnVjdCI+cGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci0KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGNsYXNzIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwuCi0gKiBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhbm5vdGF0aW9uIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFubm9wYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KHBhcmFtKSIvPgotQDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYW5ub3BhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ID0gPC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA9IDwveHNsOnRleHQ+Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iLDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmZvci1lYWNoPik8L3hzbDpmb3ItZWFjaD4KLXB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gewotPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotfQotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWV0aG9kIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHBhcmFtY291bnQiIHNlbGVjdD0iY291bnQob3V0cHV0L3BhcmFtKSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1ldGVyc3R5bGUiIHNlbGVjdD0iQHBhcmFtZXRlcnN0eWxlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2Vob2xkZXIiIHNlbGVjdD0iQHVzZWhvbGRlciIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic3R5bGUiIHNlbGVjdD0iQHN0eWxlIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dFdyYXBwZWRDb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbS9wYXJhbSkiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbSkiLz4KLSAgICAvKio8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJGlucHV0V3JhcHBlZENvdW50ICZndDsgMCI+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtIj4KLSAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSIkb3V0cGFyYW1jb3VudCAhPSAwIj4KLSAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHNob3J0dHlwZSIvPjwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtIj4KLSAgICAgKiBAcGFyYW0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+PHhzbDppZiB0ZXN0PSIkb3V0cGFyYW1jb3VudCAhPSAwIj4KLSAgICAgKiBAcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHNob3J0dHlwZSIvPjwveHNsOmlmPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJmYXVsdC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOm90aGVyd2lzZT4gPC94c2w6Y2hvb3NlPgotICAgICAqLwotICAgIHB1YmxpYyA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHBhcmFtY291bnQgPSAwIj52b2lkIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2Vob2xkZXIgPSAndHJ1ZSciPnZvaWQgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2Vob2xkZXIgPSAndHJ1ZSciPgotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbSI+Ci0gICAgICAgIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLCB0YXJnZXROYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXROcyIvPiIsIG1vZGUgPSBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZS5JTk9VVDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1ldGVyc3R5bGUgPSAnQkFSRSciPiwgcGFydE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPiI8L3hzbDp3aGVuPjwveHNsOmNob29zZT4pCi0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnBhcmFtY291bnQgPSBwb3NpdGlvbigpIj5qYXZheC54bWwud3MuSG9sZGVyJmx0Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mZ3Q7IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+amF2YXgueG1sLndzLkhvbGRlciZsdDs8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+Jmd0OyA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiw8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDpmb3ItZWFjaD48L3hzbDp3aGVuPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0V3JhcHBlZENvdW50ICZndDsgMCI+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0vcGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiw8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wYXJhbWNvdW50ID0gcG9zaXRpb24oKSI+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+PC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4pPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgdGhyb3dzIDwveHNsOmlmPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPgotICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4gewotICAgICAgICAvL1RPRE8gOiBmaWxsIHRoaXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGJ1c2luZXNzIGxvZ2ljCi0gICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlBsZWFzZSBpbXBsZW1lbnQgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICArICIjIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdNZXRob2QoKS5nZXROYW1lKCkpOwotICAgIH0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL0pheHdzU2VydmljZUVuZHBvaW50SW50ZXJmYWNlVGVtcGxhdGUueHNsIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZWQ4YzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGFyZ2V0TnMiIHNlbGVjdD0iL2phdmFDb25zdHJ1Y3QvQHRhcmdldE5hbWVzcGFjZSIvPgotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphdmFDb25zdHJ1Y3QiPnBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+OwotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImltcG9ydExpc3QvaW1wb3J0Ij4KLWltcG9ydCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlIi8+OzwveHNsOmZvci1lYWNoPgotPHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGNsYXNzIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwuCi0gKiBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhbm5vdGF0aW9uIj4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImFubm9wYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KHBhcmFtKSIvPgotQDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW0iPgotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkYW5ub3BhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4KLSAgICAgICAgICAgICAgICA8eHNsOnRleHQ+ID0gPC94c2w6dGV4dD4iPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB2YWx1ZSIvPiI8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiA9IDwveHNsOnRleHQ+Ijx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdmFsdWUiLz4iLDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOmZvci1lYWNoPik8L3hzbDpmb3ItZWFjaD4KLXB1YmxpYyBpbnRlcmZhY2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IHsKLTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLX0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldGhvZCI+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwYXJhbWNvdW50IiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbSkiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtZXRlcnN0eWxlIiBzZWxlY3Q9IkBwYXJhbWV0ZXJzdHlsZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idXNlaG9sZGVyIiBzZWxlY3Q9IkB1c2Vob2xkZXIiLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0eWxlIiBzZWxlY3Q9IkBzdHlsZSIvPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRXcmFwcGVkQ291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW0vcGFyYW0pIi8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnBhcmFtY291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW0pIi8+Ci0gICAgLyoqPHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9IiRpbnB1dFdyYXBwZWRDb3VudCAmZ3Q7IDAiPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbSI+Ci0gICAgICogQHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iJG91dHBhcmFtY291bnQgIT0gMCI+Ci0gICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BzaG9ydHR5cGUiLz48L3hzbDppZj48eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDpmb3ItZWFjaD48L3hzbDp3aGVuPjx4c2w6b3RoZXJ3aXNlPjx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbSI+Ci0gICAgICogQHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmZvci1lYWNoPjx4c2w6aWYgdGVzdD0iJG91dHBhcmFtY291bnQgIT0gMCI+Ci0gICAgICogQHJldHVybiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0BzaG9ydHR5cGUiLz48L3hzbDppZj48eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+Ci0gICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPjwveHNsOmZvci1lYWNoPjwveHNsOm90aGVyd2lzZT4gPC94c2w6Y2hvb3NlPgotICAgICAqLwotICAgIEBqYXZheC5qd3MuV2ViTWV0aG9kPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cGFyYW1jb3VudCA9IDAiPjx4c2w6dGV4dD4KLSAgICA8L3hzbDp0ZXh0PkBqYXZheC5qd3MuT25ld2F5PC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2Vob2xkZXIgPSAndHJ1ZSciPjwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dGV4dD4KLSAgICA8L3hzbDp0ZXh0PkBqYXZheC5qd3MuV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+Ijx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1ldGVyc3R5bGUgPSAnQkFSRSciPiwgcGFydE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AcGFydG5hbWUiLz4iPC94c2w6d2hlbj48L3hzbDpjaG9vc2U+KTwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgPSAwIj4KLSAgICBAamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKTwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgIEBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbS9AbmFtZSIvPiIsIHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IiwgY2xhc3NOYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbS9AdHlwZSIvPiIpPHhzbDppZiB0ZXN0PSIkb3V0cGFyYW1jb3VudCAhPSAwIj4KLSAgICBAamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AbmFtZSIvPiIsIHRhcmdldE5hbWVzcGFjZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhcmdldE5zIi8+IiwgY2xhc3NOYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz4iKTwveHNsOmlmPgotICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgIHB1YmxpYyA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHBhcmFtY291bnQgPSAwIj52b2lkIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2Vob2xkZXIgPSAndHJ1ZSciPnZvaWQgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0V3JhcHBlZENvdW50ICE9IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vcGFyYW0vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PC94c2w6d2hlbj4gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PjwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPig8eHNsOmNob29zZT4KLSAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR1c2Vob2xkZXIgPSAndHJ1ZSciPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0V3JhcHBlZENvdW50ID0gMCI+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbSI+Ci0gICAgICAgICAgICBAamF2YXguandzLldlYlBhcmFtKG5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IiwgdGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iLCBtb2RlID0gamF2YXguandzLldlYlBhcmFtLk1vZGUuSU5PVVQ8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcmFtZXRlcnN0eWxlID0gJ0JBUkUnIj4sIHBhcnROYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4iPC94c2w6d2hlbj48L3hzbDpjaG9vc2U+KTx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnBhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXImbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiZndDsgPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLSAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXImbHQ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDp0ZXh0PiZndDsgPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4sPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0PgotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtL3BhcmFtIj4KLSAgICAgICAgICAgIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLCB0YXJnZXROYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXROcyIvPiIsIG1vZGUgPSBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZS5JTk9VVDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1ldGVyc3R5bGUgPSAnQkFSRSciPiwgcGFydE5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPiI8L3hzbDp3aGVuPjwveHNsOmNob29zZT4pPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0V3JhcHBlZENvdW50ID0gcG9zaXRpb24oKSI+Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyJmx0Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mZ3Q7IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyJmx0Ozx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPgotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4mZ3Q7IDwveHNsOnRleHQ+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgJmd0OyAwIj4KLSAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbS9wYXJhbSI+Ci0gICAgICAgICAgICBAamF2YXguandzLldlYlBhcmFtKG5hbWUgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IiwgdGFyZ2V0TmFtZXNwYWNlID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFyZ2V0TnMiLz4iPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbWV0ZXJzdHlsZSA9ICdCQVJFJyI+LCBwYXJ0TmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+IjwveHNsOndoZW4+PC94c2w6Y2hvb3NlPikKLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRXcmFwcGVkQ291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtIj4KLSAgICAgICAgICAgIEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZSA9ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLCB0YXJnZXROYW1lc3BhY2UgPSAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXJnZXROcyIvPiI8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhcmFtZXRlcnN0eWxlID0gJ0JBUkUnIj4sIHBhcnROYW1lID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4iPC94c2w6d2hlbj48L3hzbDpjaG9vc2U+KQotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnBhcmFtY291bnQgPSBwb3NpdGlvbigpIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6Zm9yLWVhY2g+PC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4pPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPgotICAgICAgICAgICAgdGhyb3dzIDwveHNsOmlmPgotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNob3J0TmFtZSIvPgotICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD47Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9KYXh3c1NlcnZpY2VYTUxUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjhmZWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvSmF4d3NTZXJ2aWNlWE1MVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ieWVzIiBvbWl0LXhtbC1kZWNsYXJhdGlvbj0ieWVzIi8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KLSAgICAgICAgPHhzbDpjb21tZW50PiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETCA8L3hzbDpjb21tZW50PgotICAgICAgICA8eHNsOmNvbW1lbnQ+IEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMgPC94c2w6Y29tbWVudD4KLSAgICAgICAgPHNlcnZpY2VHcm91cD4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgICAgPC9zZXJ2aWNlR3JvdXA+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJpbnRlcmZhY2VzL2ludGVyZmFjZSI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjbGFzc3BhY2thZ2UiLz48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VydmljZW5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWVzc2FnZXJlY2VpdmVyIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ibWVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lcFVSSSIvPjwveHNsOmF0dHJpYnV0ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXI8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L21lc3NhZ2VSZWNlaXZlcj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHBhY2thZ2U9JyciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLQkJCQk8b3BlcmF0aW9uPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im1lcCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXBVUkkiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTxhY3Rpb25NYXBwaW5nPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIi8+Ci0JCQkJCTwvYWN0aW9uTWFwcGluZz4KLQkJCQk8L29wZXJhdGlvbj4KLQkJCTwveHNsOmZvci1lYWNoPgotICAgICAgICA8L3NlcnZpY2U+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL01lc3NhZ2VSZWNlaXZlclRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL01lc3NhZ2VSZWNlaXZlclRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4OTRjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9NZXNzYWdlUmVjZWl2ZXJUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0KLSAgICA8IS0tIGluY2x1ZGUgdGhlIGRhdGFiaW5kIHN1cHBvcnRlcnMgIC0tPgotICAgIDx4c2w6aW5jbHVkZSBocmVmPSJkYXRhYmluZHN1cHBvcnRlciIvPgotICAgIDwhLS0gaW1wb3J0IHRoZSBvdGhlciB0ZW1wbGF0ZXMgZm9yIGRhdGFiaW5kaW5nCi0gICAgICAgICAgIE5vdGUgIC0gIHRoZXNlIG5hbWVzIHdvdWxkIGJlIGhhbmRsZWQgYnkgYSBzcGVjaWFsCi0gICAgICAgICAgIFVSSSByZXNvbHZlciBkdXJpbmcgdGhlIHhzbHQgdHJhbnNmb3JtYXRpb25zCi0gICAgICAgLS0+Ci0gICAgPHhzbDppbmNsdWRlIGhyZWY9ImV4dGVybmFsVGVtcGxhdGUiLz4KLQotCi0gICAgPCEtLVRlbXBsYXRlIGZvciBpbiBvdXQgbWVzc2FnZSByZWNlaXZlciAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvaW50ZXJmYWNlW0BiYXNlcmVjZWl2ZXI9J29yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXInXSI+Ci0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJza2VsZXRvbm5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2tlbGV0b25JbnRlcmZhY2VOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNiYWNrY29tcGF0aWJsZSIgc2VsZWN0PSJAaXNiYWNrY29tcGF0aWJsZSIvPgotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0gICAgICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+OwotCi0gICAgICAgIC8qKgotICAgICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gbWVzc2FnZSByZWNlaXZlcgotICAgICAgICAqLwotCi0gICAgICAgIHB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gZXh0ZW5kcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJhc2VyZWNlaXZlciIvPnsKLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBuZXdNc2dDb250ZXh0KQotICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tlbGV0b25uYW1lIi8+IHNrZWwgPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4pb2JqOwotICAgICAgICAvL091dCBFbnZlbG9wCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBudWxsOwotICAgICAgICAvL0ZpbmQgdGhlIGF4aXNPcGVyYXRpb24gdGhhdCBoYXMgYmVlbiBzZXQgYnkgdGhlIERpc3BhdGNoIHBoYXNlLgotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24gb3AgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlmIChvcCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiT3BlcmF0aW9uIGlzIG5vdCBsb2NhdGVkLCBpZiB0aGlzIGlzIGRvY2xpdCBzdHlsZSB0aGUgU09BUC1BQ1RJT04gc2hvdWxkIHNwZWNpZmllZCB2aWEgdGhlIFNPQVAgQWN0aW9uIHRvIHVzZSB0aGUgUmF3WE1MUHJvdmlkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbWV0aG9kTmFtZTsKLSAgICAgICAgaWYoKG9wLmdldE5hbWUoKSAhPSBudWxsKSAmYW1wOyZhbXA7ICgobWV0aG9kTmFtZSA9IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMueG1sTmFtZVRvSmF2YTx4c2w6aWYgdGVzdD0iQGlzTG93ZXJDYXNlTWV0aG9kTmFtZSI+SWRlbnRpZmllcjwveHNsOmlmPihvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKSAhPSBudWxsKSl7Ci0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgPiAxIj59IGVsc2UgPC94c2w6aWY+Ci0KLSAgICAgICAgICAgIGlmKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iLmVxdWFscyhtZXRob2ROYW1lKSl7Ci0gICAgICAgICAgICAgICAgPCEtLSBJZiB1c2VkYm1ldGhvZCBhdHRyaWJ1dGUgcHJlc2VudCwgZ2l2ZXMgbmFtZSBvZiBtZXRob2QgdG8gY2FsbCBmb3IgaW1wbGVtZW50YXRpb24gLS0+Ci0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2VkYm1ldGhvZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1c2VkYm1ldGhvZCIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHVzZWRibWV0aG9kKSk9MCI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibmFtZXNwYWNlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWVzcGFjZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdHlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdHlsZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJldHVybnR5cGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0B0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJldHVybnZhcmlhYmxlIiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXR1cm5jb21wbGV4dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AY29tcGxleHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJucGFyYW1jb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJuc2hvcnR0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL0BzaG9ydHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJucGFydG5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0vQHBhcnRuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0KLQkJCQkJCTx4c2w6Y2hvb3NlPgotCSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcmV0dXJudHlwZSA9ICdieXRlJyBvciAkcmV0dXJudHlwZSA9ICdzaG9ydCcgb3IgJHJldHVybnR5cGUgPSAnaW50JyBvciAkcmV0dXJudHlwZSA9ICdsb25nJyBvciAkcmV0dXJudHlwZSA9ICdmbG9hdCcgb3IgJHJldHVybnR5cGUgPSAnZG91YmxlJyI+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudHlwZSIvPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CQotCSAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcmV0dXJudHlwZSA9ICdib29sZWFuJyI+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudHlwZSIvPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPSBmYWxzZTsKLQkgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgkgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQotCi0JICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRyZXR1cm50eXBlID0gJ2NoYXInIj4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm50eXBlIi8+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm52YXJpYWJsZSIvPiA9ICdcdTAwMDAnOwotCSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CQotCSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQotCSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkcmV0dXJudHlwZSkpICZndDsgMCI+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudHlwZSIvPgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPSBudWxsOwotCSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0JCQkJCQkKLQkJCQkJCTwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSByZWFsbHkgZG9uJ3QgbmVlZCB0byBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRzdHlsZT0nZG9jdW1lbnQnIG9yICRzdHlsZT0ncnBjJyI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQGNvbXBsZXh0eXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BlcmF0aW9uTmFtZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BvcG5hbWUiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNiYWNrY29tcGF0aWJsZSA9ICd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4gd3JhcHBlZFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+KWZyb21PTSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhtc2dDb250ZXh0LmdldEVudmVsb3BlKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgPiAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnZhcmlhYmxlIi8+ID08L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgPiAwKSBhbmQgKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm5jb21wbGV4dHlwZSkpID4gMCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wZXJhdGlvbk5hbWUiLz4oc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcGVyYXRpb25OYW1lIi8+KHdyYXBwZWRQYXJhbSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRpbnB1dENvbXBsZXhUeXBlKSkgPiAwKSAgYW5kIChzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkcmV0dXJuY29tcGxleHR5cGUpKSAmbHQ7IDEpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wZXJhdGlvbk5hbWUiLz4od3JhcHBlZFBhcmFtKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IihzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpICZsdDsgMSkgIGFuZCAoc3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybmNvbXBsZXh0eXBlKSkgPiAwKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BlcmF0aW9uTmFtZSIvPihza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPih3cmFwcGVkUGFyYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4od3JhcHBlZFBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgJmd0OyAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnZhcmlhYmxlIi8+ID08L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybmNvbXBsZXh0eXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcGVyYXRpb25OYW1lIi8+KHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPiB3cmFwcGVkUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPilmcm9tT00oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMobXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgJmd0OyAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnZhcmlhYmxlIi8+ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2V0IHRoZSByZXNwb25zZSB3cmFwcGVycyBpZiB1bndyYXBwaW5nIG9uIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRyZXR1cm5wYXJhbWNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXR1cm5zaG9ydHR5cGUiLz48eHNsOnZhbHVlLW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRyZXR1cm5wYXJ0bmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkcmV0dXJuY29tcGxleHR5cGUpKSAmZ3Q7IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcGVyYXRpb25OYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IigkcmV0dXJucGFyYW1jb3VudD0wKSBhbmQgKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BlcmF0aW9uTmFtZSIvPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lcmF0ZSB0aGUgcmVmZXJlbmNlcy4gdGhlIGdldHRlcnMgbmVlZCB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoZSBkYXRhYmluZGluZy0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd3JhcCBpdCBpZiBpdCBpbiB1bndhcnBpbmcgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgJmd0OyAxIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPih3cmFwcGVkUGFyYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KHdyYXBwZWRQYXJhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJHJldHVybnBhcmFtY291bnQ9MSkgb3IgKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm5jb21wbGV4dHlwZSkpICZndDsgMCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHJldHVybnR5cGUpKSAmZ3Q7IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHJldHVybnBhcmFtY291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybnNob3J0dHlwZSIvPjx4c2w6dmFsdWUtb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJHJldHVybnBhcnRuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm5jb21wbGV4dHlwZSkpICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG9wZXJhdGlvbk5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2VsLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoJHJldHVybnBhcmFtY291bnQ9MSkgb3IgKHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm5jb21wbGV4dHlwZSkpICZndDsgMCkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm50eXBlKSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSA9IHRvRW52ZWxvcGUoZ2V0U09BUEZhY3RvcnkobXNnQ29udGV4dCksIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJudmFyaWFibGUiLz4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSA9IGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmtub3duIFN0eWxlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUgPSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzZWRibWV0aG9kIi8+KG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksIHNrZWwsIGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oIm1ldGhvZCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0KLSAgICAgICAgbmV3TXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgIH0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0LWxpc3QvZmF1bHQiPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPn08L3hzbDppZj4gY2F0Y2ggKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBlKSB7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuRkFVTFRfTkFNRSwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbG5hbWUiLz4iKTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGYgPSBjcmVhdGVBeGlzRmF1bHQoZSk7Ci0gICAgICAgICAgICBpZiAoZS5nZXRGYXVsdE1lc3NhZ2UoKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBmLnNldERldGFpbCh0b09NKGUuZ2V0RmF1bHRNZXNzYWdlKCksZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICA8IS0tIHB1dCB0aGUgZXh0cmEgYnJhY2tldC0tPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KGZhdWx0LWxpc3QvZmF1bHQpPTAiPn08L3hzbDppZj4KLSAgICAgICAgY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICA8IS0tIENhbGwgdGVtcGxhdGVzIHJlY3Vyc2l2ZWx5LS0+Ci0gICAgICAgIC8vPHhzbDphcHBseS10ZW1wbGF0ZXM+PHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRleHQiPm1lc3NhZ2UtcmVjZWl2ZXI8L3hzbDp3aXRoLXBhcmFtPjwveHNsOmFwcGx5LXRlbXBsYXRlcz4KLQotICAgICAgICAvKioKLSAgICAgICAgKiAgQSB1dGlsaXR5IG1ldGhvZCB0aGF0IGNvcGllcyB0aGUgbmFtZXBhY2VzIGZyb20gdGhlIFNPQVBFbnZlbG9wZQotICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52KXsKLSAgICAgICAgamF2YS51dGlsLk1hcCByZXR1cm5NYXAgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLSAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIG5hbWVzcGFjZUl0ZXJhdG9yID0gZW52LmdldEFsbERlY2xhcmVkTmFtZXNwYWNlcygpOwotICAgICAgICB3aGlsZSAobmFtZXNwYWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgbnMgPSAob3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSkgbmFtZXNwYWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICByZXR1cm5NYXAucHV0KG5zLmdldFByZWZpeCgpLG5zLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBjcmVhdGVBeGlzRmF1bHQoamF2YS5sYW5nLkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGY7Ci0gICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGYgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoZS5nZXRNZXNzYWdlKCksIGNhdXNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGYgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGY7Ci0gICAgfQotCi0gICAgICAgIH0vL2VuZCBvZiBjbGFzcwotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIDwhLS0gZW5kIG9mIHRlbXBsYXRlIGZvciBpbi1vdXQgbWVzc2FnZSByZWNlaXZlciAtLT4KLQotICAgIDwhLS0gc3RhcnQgb2YgaW4tb25seSAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvaW50ZXJmYWNlW0BiYXNlcmVjZWl2ZXI9J29yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXInXSI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2tlbGV0b25uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNrZWxldG9uSW50ZXJmYWNlTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotCi0vKioKLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjCi0gKi8KLSAgICAgICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz47Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBtZXNzYWdlIHJlY2VpdmVyCi0gICAgICAgICovCi0KLSAgICAgICAgcHVibGljIGNsYXNzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBleHRlbmRzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYmFzZXJlY2VpdmVyIi8+ewotCi0gICAgICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0gICAgICAgIE9iamVjdCBvYmogPSBnZXRUaGVJbXBsZW1lbnRhdGlvbk9iamVjdChpbk1lc3NhZ2UpOwotCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tlbGV0b25uYW1lIi8+IHNrZWwgPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4pb2JqOwotICAgICAgICAvL091dCBFbnZlbG9wCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBudWxsOwotICAgICAgICAvL0ZpbmQgdGhlIGF4aXNPcGVyYXRpb24gdGhhdCBoYXMgYmVlbiBzZXQgYnkgdGhlIERpc3BhdGNoIHBoYXNlLgotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24gb3AgPSBpbk1lc3NhZ2UuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKG9wID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJPcGVyYXRpb24gaXMgbm90IGxvY2F0ZWQsIGlmIHRoaXMgaXMgZG9jbGl0IHN0eWxlIHRoZSBTT0FQLUFDVElPTiBzaG91bGQgc3BlY2lmaWVkIHZpYSB0aGUgU09BUCBBY3Rpb24gdG8gdXNlIHRoZSBSYXdYTUxQcm92aWRlciIpOwotICAgICAgICB9Ci0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBtZXRob2ROYW1lOwotICAgICAgICBpZigob3AuZ2V0TmFtZSgpICE9IG51bGwpICZhbXA7JmFtcDsgKChtZXRob2ROYW1lID0gb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscy54bWxOYW1lVG9KYXZhPHhzbDppZiB0ZXN0PSJAaXNMb3dlckNhc2VNZXRob2ROYW1lIj5JZGVudGlmaWVyPC94c2w6aWY+KG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpICE9IG51bGwpKXsKLQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ibWV0aG9kIj4KLQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdHlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdHlsZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgPiAxIj59IGVsc2UgPC94c2w6aWY+Ci0gICAgICAgICAgICBpZigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ii5lcXVhbHMobWV0aG9kTmFtZSkpewotICAgICAgICAgICAgPCEtLSBJZiB1c2VkYm1ldGhvZCBhdHRyaWJ1dGUgcHJlc2VudCwgZ2l2ZXMgbmFtZSBvZiBtZXRob2QgdG8gY2FsbCBmb3IgaW1wbGVtZW50YXRpb24gLS0+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZWRibWV0aG9kIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVzZWRibWV0aG9kIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHVzZWRibWV0aG9kKSk9MCI+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHN0eWxlIGRvZXMgbm90IG1hdHRlciBzaW5jZSB3ZSBjcmVhdGUgdGhlIG1lc3NhZ2UgZm9ybWF0cyBjb3JyZWN0bHkgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdycGMnIG9yICRzdHlsZT0nZG9jdW1lbnQnIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1Db3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1Db3VudCA9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPiB3cmFwcGVkUGFyYW0gPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz4pZnJvbU9NKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZlbG9wZU5hbWVzcGFjZXMoaW5NZXNzYWdlLmdldEVudmVsb3BlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSByZWZlcmVuY2VzLiB0aGUgZ2V0dGVycyBuZWVkIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBieSB0aGUgZGF0YWJpbmRpbmctLT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd3JhcCBpdCBpZiBpdCBpbiB1bndhcnBpbmcgbW9kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgJmd0OyAxIj4sPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KHdyYXBwZWRQYXJhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4od3JhcHBlZFBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Vua25vd24gc3R5bGUhISBObyBjb2RlIGlzIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVua25vd24gU3R5bGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzZWRibWV0aG9kIi8+KGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwgc2tlbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotCi0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJtZXRob2QiPgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oIm1ldGhvZCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICA8L3hzbDppZj4KLQotICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgPCEtLSBDYWxsIHRlbXBsYXRlcyByZWN1cnNpdmVseS0tPgotICAgICAgICAvLzx4c2w6YXBwbHktdGVtcGxhdGVzPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZXh0Ij5tZXNzYWdlLXJlY2VpdmVyPC94c2w6d2l0aC1wYXJhbT48L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBBIHV0aWxpdHkgbWV0aG9kIHRoYXQgY29waWVzIHRoZSBuYW1lcGFjZXMgZnJvbSB0aGUgU09BUEVudmVsb3BlCi0gICAgICAgICovCi0gICAgICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBnZXRFbnZlbG9wZU5hbWVzcGFjZXMob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYpewotICAgICAgICBqYXZhLnV0aWwuTWFwIHJldHVybk1hcCA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcCgpOwotICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgbmFtZXNwYWNlSXRlcmF0b3IgPSBlbnYuZ2V0QWxsRGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHdoaWxlIChuYW1lc3BhY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBucyA9IChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlKSBuYW1lc3BhY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHJldHVybk1hcC5wdXQobnMuZ2V0UHJlZml4KCksbnMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5NYXA7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgfS8vZW5kIG9mIGNsYXNzCi0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDwhLS1UZW1wbGF0ZSBmb3Igcm9idXN0IGluIG1lc3NhZ2UgcmVjZWl2ZXIgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2ludGVyZmFjZVtAYmFzZXJlY2VpdmVyPSdvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdE1lc3NhZ2VSZWNlaXZlciddIj4KLQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNrZWxldG9ubmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBza2VsZXRvbkludGVyZmFjZU5hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc2JhY2tjb21wYXRpYmxlIiBzZWxlY3Q9IkBpc2JhY2tjb21wYXRpYmxlIi8+Ci0KLS8qKgotICogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jICN0b2RheSMKLSAqLwotICAgICAgICBwYWNrYWdlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPjsKLQotICAgICAgICAvKioKLSAgICAgICAgKiAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgICAgKi8KLQotICAgICAgICBwdWJsaWMgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGV4dGVuZHMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYXNlcmVjZWl2ZXIiLz57Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tlbGV0b25uYW1lIi8+IHNrZWwgPSAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2VsZXRvbm5hbWUiLz4pb2JqOwotICAgICAgICAvL091dCBFbnZlbG9wCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBudWxsOwotICAgICAgICAvL0ZpbmQgdGhlIGF4aXNPcGVyYXRpb24gdGhhdCBoYXMgYmVlbiBzZXQgYnkgdGhlIERpc3BhdGNoIHBoYXNlLgotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24gb3AgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlmIChvcCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiT3BlcmF0aW9uIGlzIG5vdCBsb2NhdGVkLCBpZiB0aGlzIGlzIGRvY2xpdCBzdHlsZSB0aGUgU09BUC1BQ1RJT04gc2hvdWxkIHNwZWNpZmllZCB2aWEgdGhlIFNPQVAgQWN0aW9uIHRvIHVzZSB0aGUgUmF3WE1MUHJvdmlkZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgbWV0aG9kTmFtZTsKLSAgICAgICAgaWYoKG9wLmdldE5hbWUoKSAhPSBudWxsKSAmYW1wOyZhbXA7ICgobWV0aG9kTmFtZSA9IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMueG1sTmFtZVRvSmF2YTx4c2w6aWYgdGVzdD0iQGlzTG93ZXJDYXNlTWV0aG9kTmFtZSI+SWRlbnRpZmllcjwveHNsOmlmPihvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKSAhPSBudWxsKSl7Ci0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgPiAxIj59IGVsc2UgPC94c2w6aWY+Ci0gICAgICAgICAgICBpZigiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Ii5lcXVhbHMobWV0aG9kTmFtZSkpewotICAgICAgICAgICAgPCEtLSBJZiB1c2VkYm1ldGhvZCBhdHRyaWJ1dGUgcHJlc2VudCwgZ2l2ZXMgbmFtZSBvZiBtZXRob2QgdG8gY2FsbCBmb3IgaW1wbGVtZW50YXRpb24gLS0+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InVzZWRibWV0aG9kIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVzZWRibWV0aG9kIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHVzZWRibWV0aG9kKSk9MCI+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdHlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdHlsZSIvPjwveHNsOnZhcmlhYmxlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSByZWFsbHkgZG9uJ3QgbmVlZCB0byBtYWtlIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHN0eWxlPSdkb2N1bWVudCcgb3IgJHN0eWxlPSdycGMnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvYyBzdHlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXR0eXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wZXJhdGlvbk5hbWUiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9Ab3BuYW1lIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2JhY2tjb21wYXRpYmxlID0gJ3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPiB3cmFwcGVkUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+KWZyb21PTSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudmVsb3BlTmFtZXNwYWNlcyhtc2dDb250ZXh0LmdldEVudmVsb3BlKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRDb21wbGV4VHlwZSIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtKSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BlcmF0aW9uTmFtZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BvcG5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0Q29tcGxleFR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3BlcmF0aW9uTmFtZSIvPih3cmFwcGVkUGFyYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4od3JhcHBlZFBhcmFtKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXR0eXBlIi8+IHdyYXBwZWRQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dHR5cGUiLz4pZnJvbU9NKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0dHlwZSIvPi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52ZWxvcGVOYW1lc3BhY2VzKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWwuPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL3BhcmFtIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICZndDsgMSI+LDwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KHdyYXBwZWRQYXJhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4od3JhcHBlZFBhcmFtKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tlbC48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUgPSBnZXRTT0FQRmFjdG9yeShtc2dDb250ZXh0KS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5rbm93biBzdHlsZSEhIE5vIGNvZGUgaXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5rbm93biBTdHlsZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNlZGJtZXRob2QiLz4obXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSwgc2tlbCwgZ2V0U09BUEZhY3RvcnkobXNnQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im1ldGhvZCI+Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbigibWV0aG9kIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIH0KLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0LWxpc3QvZmF1bHQiPgotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPn08L3hzbDppZj4gY2F0Y2ggKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBlKSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkZBVUxUX05BTUUsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxuYW1lIi8+Iik7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBmID0gY3JlYXRlQXhpc0ZhdWx0KGUpOwotICAgICAgICAgICAgaWYgKGUuZ2V0RmF1bHRNZXNzYWdlKCkgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgZi5zZXREZXRhaWwodG9PTShlLmdldEZhdWx0TWVzc2FnZSgpLGZhbHNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgfQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgPCEtLSBwdXQgdGhlIGV4dHJhIGJyYWNrZXQtLT4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChmYXVsdC1saXN0L2ZhdWx0KT0wIj59PC94c2w6aWY+Ci0gICAgICAgIGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgPCEtLSBDYWxsIHRlbXBsYXRlcyByZWN1cnNpdmVseS0tPgotICAgICAgICAvLzx4c2w6YXBwbHktdGVtcGxhdGVzPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZXh0Ij5tZXNzYWdlLXJlY2VpdmVyPC94c2w6d2l0aC1wYXJhbT48L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIEEgdXRpbGl0eSBtZXRob2QgdGhhdCBjb3BpZXMgdGhlIG5hbWVwYWNlcyBmcm9tIHRoZSBTT0FQRW52ZWxvcGUKLSAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGdldEVudmVsb3BlTmFtZXNwYWNlcyhvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudil7Ci0gICAgICAgIGphdmEudXRpbC5NYXAgcmV0dXJuTWFwID0gbmV3IGphdmEudXRpbC5IYXNoTWFwKCk7Ci0gICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBuYW1lc3BhY2VJdGVyYXRvciA9IGVudi5nZXRBbGxEZWNsYXJlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIG5zID0gKG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UpIG5hbWVzcGFjZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgcmV0dXJuTWFwLnB1dChucy5nZXRQcmVmaXgoKSxucy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgY3JlYXRlQXhpc0ZhdWx0KGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBmOwotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KGUuZ2V0TWVzc2FnZSgpLCBjYXVzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgICAgICB9Ly9lbmQgb2YgY2xhc3MKLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLSAgICA8IS0tIGVuZCBvZiB0ZW1wbGF0ZSBmb3Igcm9idXN0IGluIG1lc3NhZ2UgcmVjZWl2ZXIgLS0+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ob25lRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ob25lRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGI5MGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvTm9uZURhdGFiaW5kaW5nVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci0KLQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBub25lIHRlbXBsYXRlISEhICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSdub25lJ10iPgotICAgICAgICBwcml2YXRlICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBmcm9tT00oCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLAotICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgdHlwZSwKLSAgICAgICAgamF2YS51dGlsLk1hcCBleHRyYU5hbWVzcGFjZXMpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBwYXJhbTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50ICB0b09NKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnksIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkKLSAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChwYXJhbSk7Ci0gICAgICAgIHJldHVybiBlbnZlbG9wZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAqICBnZXQgdGhlIGRlZmF1bHQgZW52ZWxvcGUKLSAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkpCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICB9Ci0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Qb2xpY3lFeHRlbnNpb25UZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Qb2xpY3lFeHRlbnNpb25UZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWY3NWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvUG9saWN5RXh0ZW5zaW9uVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtb2R1bGUtY29kZWdlbi1wb2xpY3ktZXh0ZW5zaW9ucyI+Ci0gICAgICAgIAotICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8vY3JlYXRlU2VxdWVuY2UiPgotICAgICAgICAvKioKLSAgICAgICAgICogU3RhcnRzIGEgcmVsaWFiZWwgbWVzc2FnZSBzZXF1ZW5jZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRTZXF1ZW5jZSgpIHsKLSAgICAgICAgICAgIF9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KCJTVEFSVF9STV9TRVFVRU5DRSIsICJ0cnVlIik7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIAotICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8vc2V0TGFzdE1lc3NhZ2UiPgotICAgICAgICAvKioKLSAgICAgICAgICogTWFya3MgdGhlIGxhc3QgbWVzc2FnZSBmb3IgdGhlIHNlcXVlbmNlCi0gICAgICAgICAqLwotICAgICAgICAgcHVibGljIHZvaWQgc2V0TGFzdE1lc3NhZ2UoKSB7Ci0gICAgICAgICAgICAgX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoIlNhbmRlc2hhMkNsaWVudEFQSVByb3BlcnR5V1NSTUxhc3RNZXNzYWdlIiwgInRydWUiKTsKLSAgICAgICAgIH0KLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIAotICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8vZW5kU2VxdWVuY2UiPgotICAgICAgICAvKioKLSAgICAgICAgICogVGVybWluYXRlcyB0aGUgcmVsaWFiZWwgbWVzc2FnZSBzZXF1ZW5jZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZW5kU2VxdWVuY2UoKSB7Ci0gICAgICAgICAgICBfZ2V0U2VydmljZUNsaWVudCgpLmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eSgiRU5EX1JNX1NFUVVFTkNFIiwgInRydWUiKTsKLSAgICAgICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW1pemVkIj4KLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvL29wdGltaXplQ29udGVudCIvPgotICAgICAgICA8L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICA8eHNsOmlmIHRlc3Q9Ii8vc2VjdXJpdHktY29kZWdlbi1wb2xpY3ktZXh0ZW5zaW9ucy91c2VybmFtZXRva2VuLWFjdGlvbiI+Ci0gICAgLy8gYXV0byBnZW5lbnJhdGVkIHN0dWIgbWV0aG9kcyAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShqYXZhLmxhbmcuU3RyaW5nIHVzZXJuYW1lKSB7Ci0gICAgICAgIF9zZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmhhbmRsZXIuV1NIYW5kbGVyQ29uc3RhbnRzLlVTRVIsIHVzZXJuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChqYXZhLmxhbmcuU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIF9VVENhbGxiYWNrIHB3Q2FsbGJhY2sgPSBuZXcgX1VUQ2FsbGJhY2soKTsKLSAgICAgICAgcHdDYWxsYmFjay5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgX3NlcnZpY2VDbGllbnQKLSAgICAgICAgICAgICAgICAuZ2V0T3B0aW9ucygpCi0gICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5oYW5kbGVyLldTSGFuZGxlckNvbnN0YW50cy5QQVNTV09SRF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgIlBhc3N3b3JkVGV4dCIpOwotICAgICAgICBfc2VydmljZUNsaWVudAotICAgICAgICAgICAgICAgIC5nZXRPcHRpb25zKCkKLSAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmhhbmRsZXIuV1NIYW5kbGVyQ29uc3RhbnRzLlBXX0NBTExCQUNLX1JFRiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3Q2FsbGJhY2spOyAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIF9VVENhbGxiYWNrIGltcGxlbWVudHMKLSAgICAgICAgICAgIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIHsKLQotICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgcGFzc3dvcmQ7Ci0KLSAgICAgICAgcHVibGljIF9VVENhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoamF2YS5sYW5nLlN0cmluZyBwYXNzd29yZCkgewotICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlKGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tbXSBjYWxsYmFja3MpCi0KLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5VbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHsKLQotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3NbaV0gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LldTUGFzc3dvcmRDYWxsYmFjaykgewotCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuV1NQYXNzd29yZENhbGxiYWNrIHBjID0gKG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuV1NQYXNzd29yZENhbGxiYWNrKSBjYWxsYmFja3NbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBjLmdldElkZW50aWZlcigpLmVxdWFscyhnZXRVc2VybmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGMuc2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYy5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NbaV0sICJVbnJlY29nbml6ZWQgQ2FsbGJhY2siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZ2V0VXNlcm5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgX3NlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmhhbmRsZXIuV1NIYW5kbGVyQ29uc3RhbnRzLlVTRVIpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgCi0KLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG9wdGltaXplZCI+Ci0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc2V0T3BOYW1lQXJyYXkoKXsKLSAgICAgICAgICAgIG9wTmFtZUFycmF5ID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWVbXSB7Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3B0aW1pemVDb250ZW50L29wTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiwKLSAgICAgICAgICAgICAgICA8L3hzbDppZj5uZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucy11cmwiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FsTmFtZSIvPiIpCi0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHNldE9wTmFtZUFycmF5KCl7Ci0gICAgICAgICAgICBvcE5hbWVBcnJheSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ta2VsZXRvbkludGVyZmFjZVRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uSW50ZXJmYWNlVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQzMDNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uSW50ZXJmYWNlVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2UiPg0KLS8qKg0KLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhDQotICoNCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjDQotICovDQotICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ow0KLSAgICAvKioNCi0gICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBqYXZhIHNrZWxldG9uIGludGVyZmFjZSBmb3IgdGhlIGF4aXNTZXJ2aWNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSI+PC94c2w6dmFsdWUtb2Y+IHsNCi0gICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNiYWNrY29tcGF0aWJsZSIgc2VsZWN0PSJAaXNiYWNrY29tcGF0aWJsZSIvPg0KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+DQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dGNvbXBsZXh0eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0Bjb21wbGV4dHlwZSIvPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0cGFyYW1jb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8IS0tIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5bmMgb3IgYXN5bmMgc3RhdHVzLCB0aGUgZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUgd291bGQgYmUganVzdCBhIHVzdWFsDQotICAgICAgICAgICAgICAgamF2YSBtZXRob2QgLS0+DQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0gICAgICAgICAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY29tbWVudCIvPg0KLSAgICAgICAgIA0KLSAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNiYWNrY29tcGF0aWJsZSA9ICd0cnVlJyI+DQotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNob3VsZCBwcm92aWRlIHRoZSBpbnRlciBjb21wbGV4IHR5cGUgdG8gbWV0aG9kIHNpZ25hdHVyZSBpZiBpcyBhdmFpbGFibGUgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQGNvbXBsZXh0eXBlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbTx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICogQHRocm93cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4NCi0gICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc2JhY2tjb21wYXRpYmxlID0gJ3RydWUnIj4NCi0gICAgICAgICAgICAgICAgcHVibGljIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkY291bnQ9MCBvciAkb3V0cHV0dHlwZT0nJyI+dm9pZDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJG91dHB1dGNvbXBsZXh0eXBlKSkgPiAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dGNvbXBsZXh0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZSE9JyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+DQotICAgICAgICAgICAgICAgICgNCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBzaG91bGQgcHJvdmlkZSB0aGUgaW50ZXIgY29tcGxleCB0eXBlIHRvIG1ldGhvZCBzaWduYXR1cmUgaWYgaXMgYXZhaWxhYmxlIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQGNvbXBsZXh0eXBlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0Q29tcGxleFR5cGUpKSA+IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRDb21wbGV4VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48IS0tIEp1c3QgbGVhdmUgaXQgLSBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIC0tPjwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICApDQotICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgcHVibGljIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjb3VudD0wIG9yICRvdXRwdXR0eXBlPScnIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0cGFyYW1jb3VudD0xIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0B0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0cHV0Y29tcGxleHR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Iigkb3V0cHV0cGFyYW1jb3VudD0wKSBhbmQgKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRjb3VudCIgc2VsZWN0PSJjb3VudChpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddKSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpbnB1dGNvdW50PTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV2ZW4gd2hlbiB0aGUgcGFyYW1ldGVycyBhcmUgMSB3ZSBoYXZlIHRvIHNlZSB3aGV0aGVyIHdlIGhhdmUgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNVbndyYXBQYXJhbWV0ZXJzIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHVud3JhcHBQYXJhbWV0ZXJzIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRpc1Vud3JhcFBhcmFtZXRlcnMiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vcGFyYW0iPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48IS0tIEp1c3QgbGVhdmUgaXQgLSBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIC0tPjwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICkNCi0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgPCEtLWFkZCB0aGUgZmF1bHRzLS0+DQotICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iZmF1bHQvcGFyYW1bQHR5cGUhPScnXSI+DQotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPTEiPnRocm93cyA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ow0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0gPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9Ta2VsZXRvblRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGE3NGVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1NrZWxldG9uVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4NCi0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+DQotICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9pbnRlcmZhY2UiPg0KLS8qKg0KLSAqIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPi5qYXZhDQotICoNCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjDQotICovDQotICAgIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+Ow0KLSAgICAvKioNCi0gICAgICogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBqYXZhIHNrZWxldG9uIGZvciB0aGUgYXhpc1NlcnZpY2UNCi0gICAgICovDQotICAgIHB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiPjwveHNsOnZhbHVlLW9mPg0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJAc2tlbGV0b25JbnRlcmZhY2VOYW1lIj4gaW1wbGVtZW50cyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNrZWxldG9uSW50ZXJmYWNlTmFtZSIvPjwveHNsOmlmPnsNCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNiYWNrY29tcGF0aWJsZSIgc2VsZWN0PSJAaXNiYWNrY29tcGF0aWJsZSIvPg0KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+DQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3VudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KG91dHB1dC9wYXJhbSkiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiIHNlbGVjdD0ib3V0cHV0L3BhcmFtL0B0eXBlIi8+DQotICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRjb21wbGV4dHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbS9AY29tcGxleHR5cGUiLz48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHBhcmFtY291bnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudChvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0pIi8+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgPCEtLSByZWdhcmRsZXNzIG9mIHRoZSBzeW5jIG9yIGFzeW5jIHN0YXR1cywgdGhlIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlIHdvdWxkIGJlIGp1c3QgYSB1c3VhbA0KLSAgICAgICAgICAgICAgIGphdmEgbWV0aG9kIC0tPg0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlDQotICAgICAgICAgKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbW1lbnQiLz4NCi0gICAgICAgICA8IS0tICBzZWxlY3Qgb25seSB0aGUgYm9keSBwYXJhbWV0ZXJzICAtLT4NCi0gICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzYmFja2NvbXBhdGlibGUgPSAndHJ1ZSciPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlucHV0Y291bnQ9MSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkIHBhcmFtZXRlcnMgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRDb21wbGV4VHlwZSIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0Bjb21wbGV4dHlwZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRDb21wbGV4VHlwZSkpID4gMCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbTx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0Y291bnQiIHNlbGVjdD0iY291bnQoaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXSkiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFdmVuIHdoZW4gdGhlIHBhcmFtZXRlcnMgYXJlIDEgd2UgaGF2ZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgcGFyYW1ldGVycyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGlzVW53cmFwUGFyYW1ldGVycyI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtPHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbTx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAqIEB0aHJvd3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IDogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjb21tZW50Ii8+DQotICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgKi8NCi0gICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNiYWNrY29tcGF0aWJsZSA9ICd0cnVlJyI+DQotICAgICAgICAgICAgICAgICAgcHVibGljICA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iJGNvdW50PTAgb3IgJG91dHB1dHR5cGU9JyciPnZvaWQ8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXRjb21wbGV4dHlwZSkpID4gMCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRjb21wbGV4dHlwZSIvPjwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGUhPScnIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dENvbXBsZXhUeXBlIiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQGNvbXBsZXh0eXBlIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0Q29tcGxleFR5cGUpKSA+IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRDb21wbGV4VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AbmFtZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0BuYW1lIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48IS0tIEp1c3QgbGVhdmUgaXQgLSBub3RoaW5nIHdlIGNhbiBkbyBoZXJlIC0tPjwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgKQ0KLSAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzVW53cmFwUGFyYW1ldGVycyIgc2VsZWN0PSJpbnB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknIGFuZCBAdHlwZSE9JyddL0B1bndyYXBwUGFyYW1ldGVycyIvPg0KLSAgICAgICAgICAgICAgICAgcHVibGljIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjb3VudD0wIG9yICRvdXRwdXR0eXBlPScnIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0cGFyYW1jb3VudD0xIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0cHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keSddL3BhcmFtL0B0eXBlIi8+PC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0cHV0Y29tcGxleHR5cGUpKSA+IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0Y29tcGxleHR5cGUiLz48L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Iigkb3V0cHV0cGFyYW1jb3VudD0wKSBhbmQgKCRpc1Vud3JhcFBhcmFtZXRlcnMpIj52b2lkPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0dHlwZSIvPjwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgIDx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAoDQotICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dGNvdW50IiBzZWxlY3Q9ImNvdW50KGlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10pIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaW5wdXRjb3VudD0xIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXZlbiB3aGVuIHRoZSBwYXJhbWV0ZXJzIGFyZSAxIHdlIGhhdmUgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCBwYXJhbWV0ZXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1Vud3JhcFBhcmFtZXRlcnMiIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9AdW53cmFwcFBhcmFtZXRlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkaXNVbndyYXBQYXJhbWV0ZXJzIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5JyBhbmQgQHR5cGUhPScnXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImlucHV0L3BhcmFtW0Bsb2NhdGlvbj0nYm9keScgYW5kIEB0eXBlIT0nJ10vQG5hbWUiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPjwhLS0gSnVzdCBsZWF2ZSBpdCAtIG5vdGhpbmcgd2UgY2FuIGRvIGhlcmUgLS0+PC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICApDQotICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgIDwhLS1hZGQgdGhlIGZhdWx0cy0tPg0KLSAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImZhdWx0L3BhcmFtW0B0eXBlIT0nJ10iPg0KLSAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT0xIj50aHJvd3MgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4NCi0gICAgICAgICAgIDwveHNsOmZvci1lYWNoPnsNCi0gICAgICAgICAgICAgICAgLy9UT0RPIDogZmlsbCB0aGlzIHdpdGggdGhlIG5lY2Vzc2FyeSBidXNpbmVzcyBsb2dpYw0KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRvdXRwdXR0eXBlKSkgJmd0OyAwIj50aHJvdyBuZXcgIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGxlYXNlIGltcGxlbWVudCAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIjPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Iik7PC94c2w6aWY+DQotICAgICAgICB9DQotICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgfQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0gPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0Q2xhc3NUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0Q2xhc3NUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGNlOTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvVGVzdENsYXNzVGVtcGxhdGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPgotICAgIDwhLS0gSW5jbGR1ZSB0aGUgdGVzdCBvYmplY3QgY3JlYXRpb24gdGVtcGxhdGUgIC0tPgotICAgIDx4c2w6aW5jbHVkZSBocmVmPSJ0ZXN0T2JqZWN0Ii8+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvY2xhc3MiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW50ZXJmYWNlTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpbnRlcmZhY2VOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNhbGxiYWNrbmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBjYWxsYmFja25hbWUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN0dWJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0dWJuYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1N5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaXNTeW5jIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc0FzeW5jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlzQXN5bmMiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlzYmFja2NvbXBhdGlibGUiIHNlbGVjdD0iQGlzYmFja2NvbXBhdGlibGUiLz4KLQotLyoqCi0gKiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4uamF2YQotICoKLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5IwotICovCi0gICAgcGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz47Ci0KLSAgICAvKgotICAgICAqICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gSnVuaXQgdGVzdCBjYXNlCi0gICAgKi8KLQotICAgIHB1YmxpYyBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2V7Ci0KLSAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGhvZCI+Ci0gICAgICAgICA8eHNsOmlmIHRlc3Q9IkBtZXA9JzEyJyI+Ci0KLSAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXRwdXQvcGFyYW0vQHR5cGUiPjwveHNsOnZhbHVlLW9mPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0UGFyYW1UeXBlIiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRQYXJhbUNvbXBsZXhUeXBlIiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0UGFyYW1Db3VudCIgc2VsZWN0PSJjb3VudChvdXRwdXQvcGFyYW1bQGxvY2F0aW9uPSdib2R5J10vcGFyYW0pIj48L3hzbDp2YXJpYWJsZT4KLQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc1N5bmM9JzEnIj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgIHZvaWQgdGVzdDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uewotCi0gICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0dWJuYW1lIi8+IHN0dWIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3R1Ym5hbWUiLz4oKTsvL3RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNob3VsZCBwb2ludCB0byB0aGUgcmlnaHQgZW5kcG9pbnQKLQotICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQoaW5wdXQvcGFyYW0pPjAiPgotICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD49Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOnRleHQ+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPilnZXRUZXN0T2JqZWN0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBGaWxsIGluIHRoZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4gaGVyZQotICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJG91dHB1dHR5cGU9JyciPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGZvciBub3cgdGhpbmsgdGhlcmUgaXMgb25seSBvbmUgaW5wdXQgZWxlbWVudCAtLT4KLSAgICAgICAgICAgICAgICAgICAgLy9UaGVyZSBpcyBubyBvdXRwdXQgdG8gYmUgdGVzdGVkIQotICAgICAgICAgICAgICAgICAgICBzdHViLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5hbWUiIHNlbGVjdD0iQG9wbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtbmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBsZXhUeXBlIiBzZWxlY3Q9IkBjb21wbGV4dHlwZSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0pIi8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKCRpc2JhY2tjb21wYXRpYmxlPSd0cnVlJykgYW5kIHN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRjb21wbGV4VHlwZSkpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG9wbmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IigkcGFyYW1jb3VudCA+IDApIGFuZCBub3QoJGlzYmFja2NvbXBhdGlibGU9J3RydWUnKSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJhbW5hbWUiLz4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHR5cGUhPScnIj48eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCk+MSI+LDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pOwotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW5wdXQvcGFyYW1bQHR5cGUhPScnXSI+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5hbWUiIHNlbGVjdD0iQG9wbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtbmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBsZXhUeXBlIiBzZWxlY3Q9IkBjb21wbGV4dHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtY291bnQiIHNlbGVjdD0iY291bnQocGFyYW1bQHR5cGUhPScnIGFuZCBAb3BuYW1lPSRvcG5hbWVdKSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IigkaXNiYWNrY29tcGF0aWJsZT0ndHJ1ZScpIGFuZCBzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkY29tcGxleFR5cGUpKSA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZSE9JyciPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvcG5hbWUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KTwveHNsOmlmPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIoJHBhcmFtY291bnQgPiAwKSBhbmQgbm90KCRpc2JhY2tjb21wYXRpYmxlPSd0cnVlJykiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bQHR5cGUhPScnIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj5nZXQ8eHNsOnZhbHVlLW9mICBzZWxlY3Q9IkBwYXJ0bmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtbmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZSE9JyciPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBpZiB0aGUgaW5wdXQvcGFyYW0gZWxlbWVudCBjb250YWluIGFueSBhdHRyaWJ1dGVzIHRoZW4gd2UgaGF2ZSB0byB1bndyYXAgdGhlbS0tPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4pKTsKLSAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkb3V0cHV0dHlwZT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgIC8vVGhlcmUgaXMgbm8gb3V0cHV0IHRvIGJlIHRlc3RlZCEKLSAgICAgICAgICAgICAgICAgICAgc3R1Yi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKTsKLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKSk7Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotCi0KLQotICAgICAgICB9Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRpc0FzeW5jPScxJyI+Ci0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRlbXBDYWxsYmFja05hbWUiPnRlbXBDYWxsYmFjazx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJnZW5lcmF0ZS1pZCgpIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICAgICAvKioKLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyAgdm9pZCB0ZXN0U3RhcnQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLSAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0dWJuYW1lIi8+IHN0dWIgPSBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3R1Ym5hbWUiLz4oKTsKLSAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQoaW5wdXQvcGFyYW0pPjAiPgotICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PHhzbDp0ZXh0Pj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6dGV4dD4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+KWdldFRlc3RPYmplY3QoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IEZpbGwgaW4gdGhlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiBoZXJlCi0gICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgICAgICAgICBzdHViLnN0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KAotICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5hbWUiIHNlbGVjdD0iQG9wbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtbmFtZSIgc2VsZWN0PSJAbmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtY291bnQiIHNlbGVjdD0iY291bnQocGFyYW1bQHR5cGUhPScnIGFuZCBAb3BuYW1lPSRvcG5hbWVdKSIvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwYXJhbWNvdW50ID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmFtbmFtZSIvPikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAdHlwZSE9JyciPjx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChpbnB1dC9wYXJhbVtAdHlwZSE9JyddKSA+IDAiPiw8L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcENhbGxiYWNrTmFtZSIvPigpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgc3R1Yi5zdGFydDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgICAgbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcENhbGxiYWNrTmFtZSIvPigpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlbXBDYWxsYmFja05hbWUiLz4gIGV4dGVuZHMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2FsbGJhY2tuYW1lIi8+ewotICAgICAgICAgICAgcHVibGljIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcENhbGxiYWNrTmFtZSIvPigpeyBzdXBlcihudWxsKTt9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVSZXN1bHQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRvdXRQYXJhbUNvdW50PTEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dHB1dC9wYXJhbVtAbG9jYXRpb249J2JvZHknXS9wYXJhbS9AdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0UGFyYW1Db21wbGV4VHlwZSkpID4gMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0UGFyYW1Db21wbGV4VHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD5yZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkb3V0UGFyYW1UeXBlKSkgPiAwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRQYXJhbVR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+cmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4pIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZUVycm9yPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KGphdmEubGFuZy5FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICA8L3hzbDppZj4KLSAgICAgIDwhLS0gZW5kIG9mIGluLW91dCBtZXAgLS0+Ci0gICAgICA8L3hzbDppZj4KLSAgICAgIDwhLS0gc3RhcnQgb2YgaW4tb25seSBtZXAtLT4KLSAgICAgIDx4c2w6aWYgdGVzdD0iQG1lcD0nMTAnIG9yIEBtZXA9JzExJyI+Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljICB2b2lkIHRlc3Q8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsKLQotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0dWJuYW1lIi8+IHN0dWIgPQotICAgICAgICAgIG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdHVibmFtZSIvPigpOy8vdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2hvdWxkIHBvaW50IHRvIHRoZSByaWdodCBlbmRwb2ludAotICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY291bnQoaW5wdXQvcGFyYW0pPjAiPgotICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImlucHV0L3BhcmFtW0B0eXBlIT0nJ10iPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48eHNsOnRleHQ+PQotICAgICAgICAgICAgICAgICAgPC94c2w6dGV4dD4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+KWdldFRlc3RPYmplY3QoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogRmlsbCBpbiB0aGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGhlcmUKLSAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCi0gICAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIG5vIG91dHB1dCB0byBiZSB0ZXN0ZWQhCi0gICAgICAgICAgICAgICAgICBzdHViLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigKLSAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbnB1dC9wYXJhbVtAdHlwZSE9JyddIj4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSJAb3BuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1uYW1lIiBzZWxlY3Q9IkBuYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFyYW1jb3VudCIgc2VsZWN0PSJjb3VudChwYXJhbVtAdHlwZSE9JycgYW5kIEBvcG5hbWU9JG9wbmFtZV0pIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvcnR0eXBlIiBzZWxlY3Q9IkBzaG9ydHR5cGUiLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1jb3VudCA+IDAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bQHR5cGUhPScnIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyYW1uYW1lIi8+KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+PHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDppZj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+KTsKLQotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLQotCi0gICAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIG5vIG91dHB1dCB0byBiZSB0ZXN0ZWQhCi0gICAgICAgICAgICAgICAgICBzdHViLjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPigpOwotCi0KLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICB9Ci0gICAgICA8L3hzbDppZj4KLQotICAgICA8L3hzbDpmb3ItZWFjaD4KLQotICAgICAgIDwhLS0gZ2VuZXJhdGUgdGhlIHRlc3Qgb2JqZWN0IC0tPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0KLSAgICB9Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSA8L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RPYmplY3RDcmVhdGlvblRlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC90ZW1wbGF0ZS9qYXZhL1Rlc3RPYmplY3RDcmVhdGlvblRlbXBsYXRlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiY2NkMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9UZXN0T2JqZWN0Q3JlYXRpb25UZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPg0KLSAgICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4NCi0gICAgPHhzbDprZXkgbmFtZT0icGFyYW1zSW4iIG1hdGNoPSIvL2RhdGFiaW5kZXJzL3BhcmFtW0BkaXJlY3Rpb249J2luJ10iIHVzZT0iQHR5cGUiLz4NCi0gICAgPHhzbDprZXkgbmFtZT0iaW5uZXJQYXJhbXMiIG1hdGNoPSIvL2RhdGFiaW5kZXJzL3BhcmFtW0BkaXJlY3Rpb249J2luJ10vcGFyYW0iIHVzZT0iQHBhcnRuYW1lIi8+DQotDQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgeG1sYmVhbnMgdGVtcGxhdGUgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSd4bWxiZWFucyddIj4NCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBkZXNpcmVkIFhtbE9iamVjdCBhbmQgcHJvdmlkZSBpdCBhcyB0aGUgdGVzdCBvYmplY3QNCi0gICAgICAgIHB1YmxpYyAgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QgZ2V0VGVzdE9iamVjdChqYXZhLmxhbmcuQ2xhc3MgdHlwZSkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257DQotICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgY3JlYXRvck1ldGhvZCA9IG51bGw7DQotICAgICAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9iamVjdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKXsNCi0gICAgICAgICAgICAgICAgICAgIENsYXNzW10gZGVjbGFyZWRDbGFzc2VzID0gdHlwZS5nZXREZWNsYXJlZENsYXNzZXMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgZGVjbGFyZWRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZGVjbGFyZWRDbGFzcyA9IGRlY2xhcmVkQ2xhc3Nlc1tpXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyZWRDbGFzcy5nZXROYW1lKCkuZW5kc1dpdGgoIiRGYWN0b3J5Iikpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yTWV0aG9kID0gZGVjbGFyZWRDbGFzcy5nZXRNZXRob2QoIm5ld0luc3RhbmNlIixudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChjcmVhdG9yTWV0aG9kIT1udWxsKXsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAgKG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0KWNyZWF0b3JNZXRob2QuaW52b2tlKG51bGwsbnVsbCk7DQotICAgICAgICAgICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oIkNyZWF0b3Igbm90IGZvdW5kISIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICB9DQotDQotICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im9wbmFtZXMvbmFtZSI+DQotDQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5hbWUiIHNlbGVjdD0iLiIvPg0KLQ0KLSAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSk9MSI+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSBnZXQgbWV0aG9kcyAtLT4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnQiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFNob3J0VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9Ac2hvcnR0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUVsZW1lbnQiIHNlbGVjdD0iLiI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJ0TmFtZSIgc2VsZWN0PSJAcGFydG5hbWUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKGdlbmVyYXRlLWlkKCRwYXJhbUVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdpbm5lclBhcmFtcycsICRwYXJ0TmFtZSlbMV0pKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgIChnZW5lcmF0ZS1pZCgkaW5wdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zSW4nLCAkaW5wdXRFbGVtZW50VHlwZSlbMV0pKSI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IGdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AdHlwZSIvPiB3cmFwcGVkVHlwZSl7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlcmUgaXMgbm90IGRpZmZlcmVuY2UgYmV0d2VlIGhhdmluZyBhIHNlcGVyYXRlIGNvbXBsZXggdHlwZSBhbmQgdGhlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgY29tcGxleCB0eXBlIGltcGxlbWVudGF0aW9uIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5Ij4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRUeXBlLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dEVsZW1lbnRTaG9ydFR5cGUsJ0RvY3VtZW50JykiLz4oKS54Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJ0TmFtZSIvPkFycmF5KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRUeXBlLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dEVsZW1lbnRTaG9ydFR5cGUsJ0RvY3VtZW50JykiLz4oKS54Z2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJ0TmFtZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotICAgIDwveHNsOnRlbXBsYXRlPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEFEQiB0ZW1wbGF0ZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YWJpbmRlcnNbQGRidHlwZT0nYWRiJ10iPg0KLSAgICAgICAgLy9DcmVhdGUgYW4gQURCQmVhbiBhbmQgcHJvdmlkZSBpdCBhcyB0aGUgdGVzdCBvYmplY3QNCi0gICAgICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4gZ2V0VGVzdE9iamVjdChqYXZhLmxhbmcuQ2xhc3MgdHlwZSkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257DQotICAgICAgICAgICByZXR1cm4gKG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbikgdHlwZS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgPCEtLSBnZW5lcmF0ZSB0aGUgZ2V0dGVyIG1ldGhvZHMgZm9yIGVhY2ggZGF0YWJpbmRlcnMgaWYgaXQgaXMgaW4gdXd3cmFwcGVkIG1vZGUgLS0+DQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ib3BuYW1lcy9uYW1lIj4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbmFtZSIgc2VsZWN0PSIuIi8+DQotDQotICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSk9MSI+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSBnZXQgbWV0aG9kcyAtLT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50IiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AdHlwZSI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFNob3J0VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9Ac2hvcnR0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQGNvbXBsZXh0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJhbUVsZW1lbnQiIHNlbGVjdD0iLiI+PC94c2w6dmFyaWFibGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYXJ0TmFtZSIgc2VsZWN0PSJAcGFydG5hbWUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iKGdlbmVyYXRlLWlkKCRwYXJhbUVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdpbm5lclBhcmFtcycsICRwYXJ0TmFtZSlbMV0pKSBvcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2VuZXJhdGUtaWQoJGlucHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc0luJywgJGlucHV0RWxlbWVudFR5cGUpWzFdKSkiPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHR5cGUiLz4gd3JhcHBlZFR5cGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08eHNsOndoZW4gdGVzdD0iJGlucHV0RWxlbWVudENvbXBsZXhUeXBlICE9ICcnIj4tLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUpKSA+IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVHlwZS5nZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFNob3J0VHlwZSIvPigpLmdldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFydG5hbWUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgICAgICAgIDwhLS0gdG8gc3VwcG9ydCBmb3IgYmFja3dvcmQgY29tcGF0aWJsaXR5IHdlIGhhdmUgdG8gYWRkIGFuZCB3cmFwcCBtZXRob2QtLT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iZ2VuZXJhdGUtaWQoJGlucHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc0luJywgJGlucHV0RWxlbWVudFR5cGUpWzFdKSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUpKSA+IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiLz4gZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkVHlwZSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRTaG9ydFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcG5hbWUiLz4oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiLz4gaW5uZXJUeXBlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkRWxlbWVudCA9IG5ldyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRFbGVtZW50LnNldDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50U2hvcnRUeXBlIi8+KGlubmVyVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPg0KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgIDwveHNsOmZvci1lYWNoPg0KLQ0KLSAgICA8L3hzbDp0ZW1wbGF0ZT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBqaWJ4IHRlbXBsYXRlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YWJpbmRlcnNbQGRidHlwZT0namlieCddIj4NCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgZGVzaXJlZCBvYmplY3QgYW5kIHByb3ZpZGUgaXQgYXMgdGhlIHRlc3Qgb2JqZWN0DQotICAgICAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRUZXN0T2JqZWN0KGphdmEubGFuZy5DbGFzcyB0eXBlKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIHR5cGUubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgSmF4YnJpIHRlbXBsYXRlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSdqYXhicmknXSI+DQotICAgICAgICAvL0NyZWF0ZSBhbiBvYmplY3QgYW5kIHByb3ZpZGUgaXQgYXMgdGhlIHRlc3Qgb2JqZWN0DQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFRlc3RPYmplY3QoamF2YS5sYW5nLkNsYXNzIHR5cGUpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uew0KLSAgICAgICAgICAgcmV0dXJuIHR5cGUubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIH0NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgbm9uZSB0ZW1wbGF0ZSEhISAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIC0tPg0KLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJkYXRhYmluZGVyc1tAZGJ0eXBlPSdub25lJ10iPg0KLSAgICAgICAgLy9DcmVhdGUgYW4gT01FbGVtZW50IGFuZCBwcm92aWRlIGl0IGFzIHRoZSB0ZXN0IG9iamVjdA0KLSAgICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldFRlc3RPYmplY3QoamF2YS5sYW5nLk9iamVjdCBkdW1teSl7DQotICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5ID0gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsNCi0gICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgZGVmTmFtZXNwYWNlID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiIixudWxsKTsNCi0gICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudCgidGVzdCIsZGVmTmFtZXNwYWNlKTsNCi0gICAgICAgIH0NCi0gICAgPC94c2w6dGVtcGxhdGU+DQotDQotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9wYWNrYWdlLmh0bWwgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdGVtcGxhdGUvamF2YS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYjkwYzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3RlbXBsYXRlL2phdmEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGh0bWw+DQotPGJvZHk+DQotVGhpcyBwYWNrYWdlIGlzIGEgIm5vbiBjbGFzcyBjb250YWluaW5nIiBvbmUgdGhhdCBoYXMgdGhlIHhzbCB0ZW1wbGF0ZXMgZm9yIHRoZSBKYXZhIGNsYXNzIGdlbmVyYXRpb24NCi0NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL0NvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjBhNmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5pMThuLkNvZGVnZW5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKiBMb2FkcyB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBjb25maWcgcHJvcGVydGllcy4gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIgewotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgZGJTdXBwb3J0ZXJUZW1wbGF0ZU5hbWVNYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RPYmplY3RUZW1wbGF0ZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNyY0ZvbGRlck5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc291cmNlRm9sZGVyTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBleHRlbnNpb25DbGFzc05hbWVzOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHBvc3RFeHRlbnNpb25DbGFzc05hbWVzOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRoaXJkUGFydHlTY2hlbWFOYW1lczsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBsYW5ndWFnZVR5cGVzOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdW53cmFwU3VwcG9lcnRlZGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdW53cmFwRGlyZWN0ZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lczsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBsYW5ndWFnZUVtaXR0ZXJNYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0aWVzTWFwOwotICAgIHByaXZhdGUgc3RhdGljIE1hcCBkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVUb0V4dGVuc2lvbk1hcDsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0TGFuZ3VhZ2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHREQkZyYW1ld29ya05hbWU7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0dFTl9LRVlfUFJFRklYID0gImNvZGVnZW4uZXh0ZW5zaW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVF9DT0RFX0dFTl9LRVlfUFJFRklYID0gInBvc3QuY29kZWdlbi5leHRlbnNpb24iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSElSRF9QQVJUWV9TQ0hFTUFfS0VZX1BSRUZJWCA9ICJjb2RlZ2VuLnRoaXJkcGFydHkuc2NoZW1hIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFOR1VBR0VfVFlQRV9LRVlfUFJFRklYID0gImNvZGVnZW4ubGFuZ3VhZ2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MQU5HVUFHRV9UWVBFX0tFWSA9ICJjb2RlZ2VuLmxhbmd1YWdlcy5kZWZhdWx0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1JVFRFUl9DTEFTU19LRVkgPSAiY29kZWdlbi5lbWl0dGVycyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19GUkFNRVdPUktfTkFNRV9LRVkgPSAiY29kZWdlbi5kYXRhYmluZGluZy5mcmFtZXdvcmtzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX1VOV1JBUF9TVVBQT1JURURfRlJBTUVXT1JLX05BTUVfS0VZID0KLSAgICAgICAgICAgICJjb2RlZ2VuLmRhdGFiaW5kaW5nLnVud3JhcC5zdXBwb3J0ZWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfVU5XUkFQX0RJUkVDVF9GUkFNRVdPUktfTkFNRV9LRVkgPQotICAgICAgICAgICAgImNvZGVnZW4uZGF0YWJpbmRpbmcudW53cmFwLmRpcmVjdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19GUkFNRVdPUktfREVGQVVMVF9OQU1FX0tFWSA9Ci0gICAgICAgICAgICAiY29kZWdlbi5kYXRhYmluZGluZy5mcmFtZXdvcmtzLmRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfRlJBTUVXT1JLX0VYVEVOU0lPTl9OQU1FX0tFWSA9Ci0gICAgICAgICAgICAiY29kZWdlbi5kYXRhYmluZGluZy5leHRlbnNpb25zIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX1RFTVBMQVRFX05BTUVfS0VZX1BSRUZJWCA9ICJjb2RlZ2VuLmRhdGFiaW5kaW5nLiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19URU1QTEFURV9OQU1FX0tFWV9TVUZGSVggPSAidGVtcGxhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0JJTkRJTkdfVEVTVF9PQkpFQ1RfVEVNUExBVEVfTkFNRV9LRVkgPQotICAgICAgICAgICAgImNvZGVnZW4uZGF0YWJpbmRpbmcudGVzdG9iamVjdC50ZW1wbGF0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9GT0xERVJfTkFNRV9LRVkgPSAiY29kZWdlbi5nZW5lcmFsLnNyYy5uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSX05BTUVfS0VZID0gImNvZGVnZW4uZ2VuZXJhbC5yZXNvdXJjZS5uYW1lIjsKLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT0RFR0VOX0NPTkZJR19QUk9QRVJUSUVTID0KLSAgICAgICAgICAgICIvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vY29kZWdlbi1jb25maWcucHJvcGVydGllcyI7Ci0KLSAgICAvKiBOb3RlIC0gU2hvdWxkIGJlIGEgbm9uIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXIuIElmIG5vdCBpdCBzaG91bGQgYmUgcHJvcGVybHkgZXNjYXBlZCAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfQ0hBUiA9ICIsIjsKLQotICAgIC8qKgotICAgICAqIExvYWRzIGEgc3RyZWFtIGZyb20gdGhlIGdpdmVuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllc1JlZmVyZW5jZQotICAgICAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0U3RyZWFtKFN0cmluZyBwcm9wZXJ0aWVzUmVmZXJlbmNlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0KLSAgICAgICAgICAgICAgICBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShwcm9wZXJ0aWVzUmVmZXJlbmNlKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyLmNsYXNzLmdldFJlc291cmNlKHByb3BlcnRpZXNSZWZlcmVuY2UpOwotICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmVhbTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBsb2FkQWxsUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWQoKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIGxvYWRBbGxQcm9wZXJ0aWVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgZGJTdXBwb3J0ZXJUZW1wbGF0ZU5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0ZXN0T2JqZWN0VGVtcGxhdGVOYW1lID0gbnVsbDsKLSAgICAgICAgZXh0ZW5zaW9uQ2xhc3NOYW1lcyA9IG51bGw7Ci0gICAgICAgIHRoaXJkUGFydHlTY2hlbWFOYW1lcyA9IG51bGw7Ci0gICAgICAgIGxhbmd1YWdlVHlwZXMgPSBudWxsOwotICAgICAgICBkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzID0gbnVsbDsKLSAgICAgICAgbGFuZ3VhZ2VFbWl0dGVyTWFwID0gbnVsbDsKLSAgICAgICAgbGFuZ3VhZ2VTcGVjaWZpY1Byb3BlcnRpZXNNYXAgPSBudWxsOwotICAgICAgICBkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVUb0V4dGVuc2lvbk1hcCA9IG51bGw7Ci0gICAgICAgIGRlZmF1bHRMYW5ndWFnZSA9IG51bGw7Ci0gICAgICAgIGRlZmF1bHREQkZyYW1ld29ya05hbWUgPSBudWxsOwotICAgICAgICBzcmNGb2xkZXJOYW1lID0gbnVsbDsKLSAgICAgICAgcmVzb3VyY2VGb2xkZXJOYW1lID0gbnVsbDsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZEFsbFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL2xvb2sgZm9yIHRoZSBzeXN0ZW0gcHJvcGVydHkgIm9yZy5hcGFjaGUuYXhpczIuY29kZWdlbi5jb25maWciIHRvIGZvciBhIHByb3BlcnR5Ci0gICAgICAgICAgICAvL2VudHJ5IHJlZmVyaW5nIHRvIHRoZSBjb25maWcgcHJvcGVydGllcwotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmF4aXMyLmNvZGVnZW4uY29uZmlnIik7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW07Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gZ2V0U3RyZWFtKHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gZ2V0U3RyZWFtKERFRkFVTFRfQ09ERUdFTl9DT05GSUdfUFJPUEVSVElFUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3BmaWxlbG9hZC5nZW5lcmFsRXhjZXB0aW9uIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHByb3BzLmxvYWQoc3RyZWFtKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgYSBuZXcgbWFwIGZvciB0aGUgbGFuZyBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBsYW5ndWFnZVNwZWNpZmljUHJvcGVydGllc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vY3JlYXRlIGEgbmV3IG1hcCBmb3IgdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29ya3MgYW5kIHRoZWlyIGV4dGVuc2lvbnMKLSAgICAgICAgICAgIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZVRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgLy9sb2FkIHRoZSBleHRlbnNpb24gY2xhc3MgbmFtZXMKLSAgICAgICAgICAgIFN0cmluZyB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoQ09ERV9HRU5fS0VZX1BSRUZJWCk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uQ2xhc3NOYW1lcyA9IHRlbXBTdHJpbmcuc3BsaXQoU0VQQVJBVE9SX0NIQVIpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9hZCB0aGUgcG9zdCBleHRlbnNpb24gY2xhc3MgbmFtZXMKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShQT1NUX0NPREVfR0VOX0tFWV9QUkVGSVgpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvc3RFeHRlbnNpb25DbGFzc05hbWVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vbG9hZCB0aGUgZGF0YSBiaW5kaW5nIGZyYW1ld29yayBuYW1lcwotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KERBVEFfQklORElOR19GUkFNRVdPUktfTkFNRV9LRVkpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9sb2FkIHRoZSB1bndyYXAgc3VwcG9ydGVkIGRhdGEgYmluZGluZyBmcmFtZXdvcmsgbmFtZXMKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShEQVRBX0JJTkRJTkdfVU5XUkFQX1NVUFBPUlRFRF9GUkFNRVdPUktfTkFNRV9LRVkpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVud3JhcFN1cHBvZXJ0ZWRkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9hZCB0aGUgdW53cmFwIHN1cHBvcnRlZCBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrIG5hbWVzCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoREFUQV9CSU5ESU5HX1VOV1JBUF9ESVJFQ1RfRlJBTUVXT1JLX05BTUVfS0VZKTsKLSAgICAgICAgICAgIGlmICh0ZW1wU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1bndyYXBEaXJlY3RkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9hZCB0aGUgc291cmNlIGZvbGRlcgotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KFNPVVJDRV9GT0xERVJfTkFNRV9LRVkpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNyY0ZvbGRlck5hbWUgPSB0ZW1wU3RyaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2xvYWQgdGhlIHJlc291cmNlIGZvbGRlciBuYW1lCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoUkVTT1VSQ0VfRk9MREVSX05BTUVfS0VZKTsKLSAgICAgICAgICAgIGlmICh0ZW1wU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZUZvbGRlck5hbWUgPSB0ZW1wU3RyaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrIG5hbWUgdG8gZXh0ZW5zaW9uIG5hbWUgbWFwCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoREFUQV9CSU5ESU5HX0ZSQU1FV09SS19FWFRFTlNJT05fTkFNRV9LRVkpOwotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZyYW1ld29ya0V4dGVuc2lvbk5hbWVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1ld29ya0V4dGVuc2lvbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVUb0V4dGVuc2lvbk1hcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KGRhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXNbaV0sIGZyYW1ld29ya0V4dGVuc2lvbk5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3BmaWxlbG9hZC5mcmFtZXdvcmtNaXNtYXRjaCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9sb2FkIHRoZSBkZWZhdWx0IGZyYW1ld29yayBuYW1lCi0gICAgICAgICAgICB0ZW1wU3RyaW5nID0gcHJvcHMuZ2V0UHJvcGVydHkoREFUQV9CSU5ESU5HX0ZSQU1FV09SS19ERUZBVUxUX05BTUVfS0VZKTsKLQotICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAhZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lVG9FeHRlbnNpb25NYXAuY29udGFpbnNLZXkodGVtcFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm9wZmlsZWxvYWQudW5rbm93bkZyYW1ld29yayIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHREQkZyYW1ld29ya05hbWUgPSB0ZW1wU3RyaW5nOwotICAgICAgICAgICAgLy9sb2FkIHRoZSB0aGlyZCBwYXJ0eSBzY2hlbWEgbmFtZXMKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShUSElSRF9QQVJUWV9TQ0hFTUFfS0VZX1BSRUZJWCk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcmRQYXJ0eVNjaGVtYU5hbWVzID0gdGVtcFN0cmluZy5zcGxpdChTRVBBUkFUT1JfQ0hBUik7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wb3B1bGF0ZSB0aGUgZGIgc3VwcG9ydGVyIHRlbXBsYXRlIG5hbWVzLgotICAgICAgICAgICAgZGJTdXBwb3J0ZXJUZW1wbGF0ZU5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYWxsUHJvcGVydGllcyA9IHByb3BzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGFsbFByb3BlcnRpZXMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGtleSA9IChTdHJpbmcpYWxsUHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKERBVEFfQklORElOR19URU1QTEFURV9OQU1FX0tFWV9QUkVGSVgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXkuZW5kc1dpdGgoREFUQV9CSU5ESU5HX1RFTVBMQVRFX05BTUVfS0VZX1NVRkZJWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGJTdXBwb3J0ZXJUZW1wbGF0ZU5hbWVNYXAucHV0KGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZXN0T2JqZWN0VGVtcGxhdGVOYW1lID0gcHJvcHMuZ2V0UHJvcGVydHkoREFUQV9CSU5ESU5HX1RFU1RfT0JKRUNUX1RFTVBMQVRFX05BTUVfS0VZKTsKLQotICAgICAgICAgICAgLy9sb2FkIHRoZSBsYW5ndWFnZSBuYW1lcwotICAgICAgICAgICAgdGVtcFN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KExBTkdVQUdFX1RZUEVfS0VZX1BSRUZJWCk7Ci0gICAgICAgICAgICBpZiAodGVtcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGFuZ3VhZ2VUeXBlcyA9IHRlbXBTdHJpbmcuc3BsaXQoU0VQQVJBVE9SX0NIQVIpOwotCi0gICAgICAgICAgICAgICAgLy9sb2FkIHRoZSBsYW5ndWFnZSBlbWl0dGVyIG1hcAotICAgICAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShFTUlUVEVSX0NMQVNTX0tFWSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXBTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm9wZmlsZWxvYWQuZW1pdHRlck1pc3NpbmciKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdGVtcENsYXNzTmFtZXMgPSB0ZW1wU3RyaW5nLnNwbGl0KFNFUEFSQVRPUl9DSEFSKTsKLSAgICAgICAgICAgICAgICAgICAgLy9wb3B1bGF0ZSB0aGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlRW1pdHRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcENsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlRW1pdHRlck1hcC5wdXQobGFuZ3VhZ2VUeXBlc1tpXSwgdGVtcENsYXNzTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxvYWQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKLSAgICAgICAgICAgIHRlbXBTdHJpbmcgPSBwcm9wcy5nZXRQcm9wZXJ0eShERUZBVUxUX0xBTkdVQUdFX1RZUEVfS0VZKTsKLSAgICAgICAgICAgIGlmIChudWxsID09IHRlbXBTdHJpbmcgfHwgIWxhbmd1YWdlRW1pdHRlck1hcC5jb250YWluc0tleSh0ZW1wU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oQ29kZWdlbk1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3BmaWxlbG9hZC51bmtub3duRGVmYXVsdExhbmciKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2UgPSB0ZW1wU3RyaW5nOwotCi0gICAgICAgICAgICAvLyBydW4gdGhyb3VnaCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgcHJvcGVydGllcyBhbmQgcG9wdWxhdGUgdGhlCi0gICAgICAgICAgICAvLyBsYW5ndWFnZSBzcGVjaWZpYyBwcm9wZXJ0eSBtYXAKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2VUeXBlOwotICAgICAgICAgICAgU3RyaW5nIHRlbXBrZXk7Ci0gICAgICAgICAgICBIYXNoTWFwIGxhbmdTcGVjaWZpY01hcDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFuZ3VhZ2VUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGxhbmd1YWdlVHlwZSA9IGxhbmd1YWdlVHlwZXNbaV07Ci0gICAgICAgICAgICAgICAgbGFuZ1NwZWNpZmljTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlFbnVtID0gcHJvcHMua2V5cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChrZXlFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBrZXkgPSBrZXlFbnVtLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBrZXkuc3RhcnRzV2l0aChsYW5ndWFnZVR5cGUgKyAiLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYW5nU3BlY2lmaWNNYXAucHV0KHRlbXBrZXksIHByb3BzLmdldCh0ZW1wa2V5KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9ub3cgYWRkIHRoaXMgdG8gdGhlIGxhbmcgc3BlY2lmaWMgcHJvcGVydGllcyBtYXAKLSAgICAgICAgICAgICAgICBsYW5ndWFnZVNwZWNpZmljUHJvcGVydGllc01hcC5wdXQobGFuZ3VhZ2VUeXBlLCBsYW5nU3BlY2lmaWNNYXApOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihDb2RlZ2VuTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJvcGZpbGVsb2FkLmdlbmVyYWxFeGNlcHRpb24iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIgbmFtZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlRm9sZGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlRm9sZGVyTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBmb2xkZXIgbmFtZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNyY0ZvbGRlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzcmNGb2xkZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRlc3Qgb2JqZWN0IHN1cHBvcnQgdGVtcGxhdGUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIHRlc3QgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRlc3RPYmplY3RUZW1wbGF0ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0ZXN0T2JqZWN0VGVtcGxhdGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRhdGFiaW5kZXIgdGVtcGxhdGUgbmFtZXMuIFRoaXMgaXMgdGhlIHRlbXBsYXRlIHRoYXQgaGFzIHRoZSBsb2dpYyBmb3IgY3JlYXRpbmcgdGhlCi0gICAgICogZGF0YWJpbmQgc3VwcG9ydGVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXAgZ2V0RGJTdXBwb3J0ZXJUZW1wbGF0ZXNNYXAoKSB7Ci0gICAgICAgIHJldHVybiBkYlN1cHBvcnRlclRlbXBsYXRlTmFtZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBleHRlbnNpb24gY2xhc3MgbmFtZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nW10uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25DbGFzc05hbWVzKCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uQ2xhc3NOYW1lczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIHBvc3QgZXh0ZW5zaW9uIGNsYXNzIG5hbWVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nW10uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQb3N0RXh0ZW5zaW9uQ2xhc3NOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHBvc3RFeHRlbnNpb25DbGFzc05hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRoaXJkIHBhcnR5IHNjaGVtYSBuYW1lcyBsaXN0LgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZ1tdLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VGhpcmRQYXJ0eVNjaGVtYU5hbWVzKCkgewotICAgICAgICByZXR1cm4gdGhpcmRQYXJ0eVNjaGVtYU5hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhbmd1YWdlIHR5cGUgbmFtZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nW10uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRMYW5ndWFnZVR5cGVzKCkgewotICAgICAgICByZXR1cm4gbGFuZ3VhZ2VUeXBlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBlbWl0dGVyIG5hbWVzIG1hcCBrZXlzIHdpdGggdGhlIGxhbmd1YWdlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWFwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldExhbmd1YWdlRW1pdHRlck1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlRW1pdHRlck1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgdW53cmFwIHN1cHBvcnRlZCBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrcwotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVud3JhcFN1cHBvcnRlZEZyYW1ld29ya05hbWVzKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh1bndyYXBTdXBwb2VydGVkZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIGRhdGEgYmluZGluZyBmcmFtZXdvcmtzIHRoYXQgaGFuZGxlIHVud3JhcHBpbmcgZGlyZWN0bHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5hbWVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVud3JhcERpcmVjdEZyYW1ld29ya05hbWVzKCkgewotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh1bndyYXBEaXJlY3RkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRMYW5ndWFnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIE1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRMYW5ndWFnZVNwZWNpZmljUHJvcGVydGllc01hcCgpIHsKLSAgICAgICAgcmV0dXJuIGxhbmd1YWdlU3BlY2lmaWNQcm9wZXJ0aWVzTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yayBuYW1lcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldERhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0ZyYW1ld29ya05hbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGV4dGVuc2lvbnMgbWFwIGZvciB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3Jrcy4gVGhlIGVudHJpZXMgYXJlIGtleXMgYnkgdGhlIGZyYW1ld29yawotICAgICAqIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWFwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwIGdldERhdGFiaW5kaW5nRnJhbWV3b3JrTmFtZVRvRXh0ZW5zaW9uTWFwKCkgewotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdGcmFtZXdvcmtOYW1lVG9FeHRlbnNpb25NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBEQiBmcmFtd29yayBuYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0REJGcmFtZXdvcmtOYW1lKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdERCRnJhbWV3b3JrTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9Db25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBjN2FjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgewotCi0gICAgU3RyaW5nIEJBU0VfNjRfUFJPUEVSVFlfS0VZID0gImJhc2U2NG1hcCI7Ci0gICAgU3RyaW5nIFBMQUlOX0JBU0VfNjRfUFJPUEVSVFlfS0VZID0gInBsYWluYmFzZTY0bWFwIjsKLQotICAgIFN0cmluZyBFWFRFUk5BTF9URU1QTEFURV9QUk9QRVJUWV9LRVkgPSAiZXh0ZXJuYWxUZW1wbGF0ZSI7Ci0gICAgU3RyaW5nIFhTTFRfSU5DTFVERV9EQVRBQklORF9TVVBQT1JURVJfSFJFRl9LRVkgPSAiZGF0YWJpbmRzdXBwb3J0ZXIiOwotICAgIFN0cmluZyBYU0xUX0lOQ0xVREVfVEVTVF9PQkpFQ1RfSFJFRl9LRVkgPSAidGVzdE9iamVjdCI7Ci0gICAgU3RyaW5nIFVOV1JBUFBFRF9LRVkgPSAiVW5XcmFwcGVkIjsKLSAgICBTdHJpbmcgVU5XUkFQUEVEX0RFVEFJTFMgPSAiVW5XcmFwcGVkX2RldGFpbHMiOwotCi0gICAgU3RyaW5nIENPTVBMRVhfVFlQRSA9ICJjb21wbGV4VHlwZSI7Ci0gICAgU3RyaW5nIEFSUkFZX1RZUEUgPSAiYXJyYXlUeXBlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWV9FTEVNRU5UX0ZJRUxEX05BTUUgPSAiZXh0cmFFbGVtZW50IjsKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IGZvciBtZXNzYWdlIHJlY2VpdmVyIG9wZXJhdGlvbiBtZXRob2QgaGFuZGxlZCBieSBkYXRhYmluZGluZyBjb2RlIGdlbmVyYXRpb24uIFRoaXMKLSAgICAgKiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgZm9yIGFuIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb259LiBJZgotICAgICAqIHByZXNlbnQsIHRoZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiBhIG1ldGhvZCB0byBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRhdGFiaW5kaW5nIGNvZGUgZ2VuZXJhdGlvbgotICAgICAqIGFuZCBjYWxsZWQgYnkgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIgY29kZSBnZW5lcmF0aW9uIGluIG9yZGVyIHRvIHByb2Nlc3MgdGhlIE9NRWxlbWVudCBhbmQKLSAgICAgKiBpbnZva2UgdGhlIHNlcnZpY2UgbWV0aG9kLgotICAgICAqLwotICAgIFN0cmluZyBEQVRBQklORElOR19HRU5FUkFURURfUkVDRUlWRVIgPSAiZGF0YWJpbmRpbmctZ2VuZXJhdGVkLXJlY2VpdmVyIjsKLQotICAgIC8qKgotICAgICAqIFByb3BlcnR5IGZvciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gbWV0aG9kIGhhbmRsZWQgYnkgZGF0YWJpbmRpbmcgY29kZSBnZW5lcmF0aW9uLiBUaGlzIGlzCi0gICAgICogYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGZvciBhbiB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9ufS4gSWYgcHJlc2VudCwKLSAgICAgKiB0aGUgdmFsdWUgaXMgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoYXQKLSAgICAgKiBvcGVyYXRpb24gd2lsbCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRhdGEgYmluZGluZyBjb2RlIGdlbmVyYXRpb24uCi0gICAgICovCi0gICAgU3RyaW5nIERBVEFCSU5ESU5HX0dFTkVSQVRFRF9JTVBMRU1FTlRBVElPTiA9ICJkYXRhYmluZGluZy1nZW5lcmF0ZWQtaW1wbGVtZW50YXRpb24iOwotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgZm9yIGRldGFpbHMgdG8gYmUgcGFzc2VkIGluc2lkZSB0aGUgJmx0O2RhdGFiaW5kZXJzPiBlbGVtZW50LiBUaGlzIGlzIGFuIG9wdGlvbmFsCi0gICAgICogcGFyYW1ldGVyIGZvciBhbiB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9ufS4gSWYgcHJlc2VudCwgdGhlIHZhbHVlIGlzCi0gICAgICogYSBET00gZWxlbWVudCB0byBiZSBhcHBlbmRlZCB0byB0aGUgJmx0O2RhdGFiaW5kZXJzPiBjb250ZW50LgotICAgICAqLwotICAgIFN0cmluZyBEQVRBQklORElOR19PUEVSQVRJT05fREVUQUlMUyA9ICJkYXRhYmluZGluZy1vcGVyYXRpb24tZGV0YWlscyI7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9wZXJ0eSBmb3IgZGV0YWlscyB0byBiZSBwYXNzZWQgaW5zaWRlIHRoZSAmbHQ7ZGF0YWJpbmRlcnM+IGVsZW1lbnQuIFRoaXMgaXMgYW4gb3B0aW9uYWwKLSAgICAgKiBwYXJhbWV0ZXIgZm9yIGFuIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlfS4gSWYgcHJlc2VudCwgdGhlIHZhbHVlIGlzIGEKLSAgICAgKiBET00gZWxlbWVudCB0byBiZSBhcHBlbmRlZCB0byB0aGUgJmx0O2RhdGFiaW5kZXJzPiBjb250ZW50LgotICAgICAqLwotICAgIFN0cmluZyBEQVRBQklORElOR19TRVJWSUNFX0RFVEFJTFMgPSAiZGF0YWJpbmRpbmctc2VydmljZS1kZXRhaWxzIjsKLQotCi0gICAgcHVibGljIGludGVyZmFjZSBDb2RlZ2VuU3R5bGUgewotICAgICAgICBmaW5hbCBpbnQgQVVUT01BVElDID0gMDsKLSAgICAgICAgZmluYWwgaW50IElOVEVSRkFDRSA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQklORElORyA9IDI7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL01lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL01lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlYmJmOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWN0cyBhcyB0aGUgaG9sZGVyIGZvciB0aGUgaW5mb3JtYXRpb24gdGhhdCBpcyByZXF1aXJlZCB0byBiZSBhdHRhY2hlZCB0byB0aGUKLSAqIEF4aXNNZXNzYWdlIGR1cmluZyB1bndyYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIHsKLQotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZTsKLSAgICBwcml2YXRlIExpc3QgcGFydHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIFFOYW1lIGdldE9wZXJhdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbk5hbWUoUU5hbWUgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICB0aGlzLm9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb25OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFBhcnRzTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcnRzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0c0xpc3QoTGlzdCBwYXJ0c0xpc3QpIHsKLSAgICAgICAgdGhpcy5wYXJ0c0xpc3QgPSBwYXJ0c0xpc3Q7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1R5cGVUZXN0ZXJVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9UeXBlVGVzdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTVjMjQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1R5cGVUZXN0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1wdWJsaWMgY2xhc3MgVHlwZVRlc3RlclV0aWwgewotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciBhIGdpdmVuIGNsYXNzbmFtZSBpcyBwcmltaXRpdmVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQotICAgICAgICByZXR1cm4gImludCIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICAgICAgImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICAgICAgImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAiYnl0ZSIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAic2hvcnQiLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICAgICAgImxvbmciLmVxdWFscyhjbGFzc05hbWUpOwotCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBjbGFzc25hbWUgaGFzIGEgcGFja2FnZSB0aGUgY3VycmVudCBsb2dpYyBpcyBzaW1wbGUgd2hlcmUgd2UgbG9vawotICAgICAqIGZvciBhICcuJyBpbnNpZGUgdGhlIGNsYXNzbmFtZSBzdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUGFja2FnZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoY2xhc3NOYW1lLmluZGV4T2YoJy4nKSAhPSAtMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETDJKYXZhT3B0aW9uc1ZhbGlkYXRvci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETDJKYXZhT3B0aW9uc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTY4ZDRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTREwySmF2YU9wdGlvbnNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5leHRlbnNpb24uWE1MQmVhbnNFeHRlbnNpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFPcHRpb25zVmFsaWRhdG9yIGltcGxlbWVudHMgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMsIE9wdGlvbnNWYWxpZGF0b3IgewotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnZhbGlkKENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbikgewotCi0gICAgICAgIGJvb2xlYW4gaW52YWxpZDsKLSAgICAgICAgU3RyaW5nIG9wdGlvblR5cGUgPSBvcHRpb24uZ2V0T3B0aW9uVHlwZSgpOwotCi0gICAgICAgIGlmIChvcHRpb25UeXBlLnN0YXJ0c1dpdGgoV1NETDJKYXZhQ29uc3RhbnRzLkVYVFJBX09QVElPTlRZUEVfUFJFRklYKSkgewotICAgICAgICAgICAgaW52YWxpZCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW52YWxpZCA9ICEoV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQWxsX1BPUlRTX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWFRFUk5BTF9NQVBQSU5HX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5FWFRFUk5BTF9NQVBQSU5HX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OT19CVUlMRF9YTUxfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5OT19XU0RMU19PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhDRVBUSU9OX0JBU0VfQ0xBU1NfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0VQVElPTl9CQVNFX0NMQVNTX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX0FCU09MVVRFX0FERFJFU1NfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX0FCU09MVVRFX0FERFJFU1NfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5SRVBPU0lUT1JZX1BBVEhfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5SRVNPVVJDRV9GT0xERVJfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU1VQUFJFU1NfUFJFRklYRVNfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVOUEFDS19DTEFTU0VTX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSUy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSU19MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5IVFRQX1BST1hZX0hPU1RfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuSFRUUF9QUk9YWV9QT1JUX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0xVREVfUEFLQUdFU19PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuRVhDTFVERV9QQUtBR0VTX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuU0tFTFRPTl9DTEFTU19OQU1FX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFdTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFDb25zdGFudHMuVVNFX09QRVJBVElPTl9OQU1FLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgV1NETDJKYXZhQ29uc3RhbnRzLlVTRV9PUEVSQVRJT05fTkFNRV9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgWE1MQmVhbnNFeHRlbnNpb24uWFNEQ09ORklHX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFhNTEJlYW5zRXh0ZW5zaW9uLlhTRENPTkZJR19PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpCi0gICAgICAgICAgICApOwotCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW52YWxpZDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvWFNMVEluY2x1ZGVSZXNvbHZlci5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvWFNMVEluY2x1ZGVSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWE0NDdjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1hTTFRJbmNsdWRlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmkxOG4uQ29kZWdlbk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBYU0xUSW5jbHVkZVJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIsIENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIENvZGVHZW5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9URU1QTEFURSA9ICI8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj1cIjEuMFwiIHhtbG5zOnhzbD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybVwiLz4iOwotCi0gICAgcHVibGljIFhTTFRJbmNsdWRlUmVzb2x2ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBjb25maWcgICovCi0gICAgcHVibGljIFhTTFRJbmNsdWRlUmVzb2x2ZXIoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc29sdmVzIGEgZ2l2ZW4gaHJlZiBhbmQgYmFzZSBjb21iaW5hdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGhyZWYKLSAgICAgKiBAcGFyYW0gYmFzZQotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU291cmNlIHJlc29sdmUoU3RyaW5nIGhyZWYsIFN0cmluZyBiYXNlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lOwotICAgICAgICBNYXAgZXh0ZXJuYWxQcm9wZXJ0eU1hcCA9IGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgIElucHV0U3RyZWFtIHN1cHBvcnRlclRlbXBsYXRlU3RyZWFtOwotICAgICAgICBpZiAoWFNMVF9JTkNMVURFX0RBVEFCSU5EX1NVUFBPUlRFUl9IUkVGX0tFWS5lcXVhbHMoaHJlZikpIHsKLSAgICAgICAgICAgIC8vdXNlIHRoZSBsYW5ndWFnZSBuYW1lIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdG8gc2VhcmNoIHRoZSBrZXkKLSAgICAgICAgICAgIC8vb3VyIHNlYXJjaCBvbmx5IGNvbnNpc3RzIG9mIGxvb2tpbmcgZm9yIHRoZSBkYXRhIGJpbmRpbmcgbmFtZQotICAgICAgICAgICAgLy9pbiB0aGUga2V5Ci0gICAgICAgICAgICBNYXAgZGJTdXBwb3J0ZXJNYXAgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0RGJTdXBwb3J0ZXJUZW1wbGF0ZXNNYXAoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGtleXMgPSBkYlN1cHBvcnRlck1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBrZXlzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBrZXkgPSAoU3RyaW5nKWtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihjb25maWd1cmF0aW9uLmdldERhdGFiaW5kaW5nVHlwZSgpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlRnJvbVRlbXBsYXRlTmFtZSgoU3RyaW5nKWRiU3VwcG9ydGVyTWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoWFNMVF9JTkNMVURFX1RFU1RfT0JKRUNUX0hSRUZfS0VZLmVxdWFscygoaHJlZikpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlRnJvbVRlbXBsYXRlTmFtZShDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0VGVzdE9iamVjdFRlbXBsYXRlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHRlcm5hbFByb3BlcnR5TWFwLmdldChocmVmKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0ZW1wbGF0ZU5hbWUgPSBleHRlcm5hbFByb3BlcnR5TWFwLmdldChocmVmKS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKHRlbXBsYXRlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVyVGVtcGxhdGVTdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odGVtcGxhdGVOYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShzdXBwb3J0ZXJUZW1wbGF0ZVN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKGhyZWYgIT0gbnVsbCkgJiYgKCFocmVmLmVxdWFscygiZXh0ZXJuYWxUZW1wbGF0ZSIpKSl7Ci0gICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gZ2V0U291cmNlRnJvbVRlbXBsYXRlTmFtZShocmVmKTsKLSAgICAgICAgICAgIGlmICgoc291cmNlICE9IG51bGwpICYmICgoU3RyZWFtU291cmNlKXNvdXJjZSkuZ2V0SW5wdXRTdHJlYW0oKSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldEVtcHR5U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9pZiBub3RoaW5nIGNvdWxkIGJlIGZvdW5kIHJldHVybiBhbiBlbXB0eSBzb3VyY2UKLSAgICAgICAgcmV0dXJuIGdldEVtcHR5U291cmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbG9hZCB0aGUgdGVtcGxhdGUgZnJvbSBhIGdpdmVuIHJlc291cmNlIHBhdGgKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZWQgdHJhbnNmb3JtIHNvdXJjZQotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIFNvdXJjZSBnZXRTb3VyY2VGcm9tVGVtcGxhdGVOYW1lKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIHN1cHBvcnRlclRlbXBsYXRlU3RyZWFtOwotICAgICAgICBpZiAodGVtcGxhdGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN1cHBvcnRlclRlbXBsYXRlU3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHRlbXBsYXRlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbVNvdXJjZShzdXBwb3J0ZXJUZW1wbGF0ZVN0cmVhbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5NZXNzYWdlcy5nZXRNZXNzYWdlKCJyZXNvbHZlci50ZW1wbGF0ZU5vdEZvdW5kIiwgdGVtcGxhdGVOYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIGFuIGVtcHR5IHNvdXJjZQotICAgICAqCi0gICAgICogQHJldHVybiBzdHJlYW0gc291cmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTb3VyY2UgZ2V0RW1wdHlTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShFTVBUWV9URU1QTEFURS5nZXRCeXRlcygpKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0xLnhzZCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMWU1NzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLQotICAgIEFkZFJlcXVlc3QgaXMgYSBjb21wbGV4IHR5cGUKLS0tPgotCi08eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIgeG1sbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiCi0gICAgICAgICAgIHhtbG5zOm5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx4czplbGVtZW50IG5hbWU9IkFkZFJlcXVlc3QiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlck9uZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlclR3byIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtMi54c2QgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZkNGI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLSAgICAxLiBBZGRSZXF1ZXN0IGlzIG9mIEFkZFJlcXVlc3RUeXBlCi0gICAgMi4gQWRkUmVxdWVzdFR5cGUgaGFzIGEgc2VxdWVuY2UKLS0tPgotCi08eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIgeG1sbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiCi0gICAgICAgICAgIHhtbG5zOm5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx4czplbGVtZW50IG5hbWU9IkFkZFJlcXVlc3QiIHR5cGU9IkFkZFJlcXVlc3RUeXBlIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFkZFJlcXVlc3RUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlck9uZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyVHdvIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0zLnhzZCBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMvc2NoZW1hcy9zY2hlbWEtMy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTRkYmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tCi0gICAgIDEuIEFkZFJlcXVlc3QgaXMgb2YgQWRkUmVxdWVzdFR5cGUKLSAgICAgMi4gQWRkUmVxdWVzdFR5cGUgZXh0ZW5kcyBmcm9tIEFic3RyYWN0UGFyYW1ldGVyVHlwZQotICAgICAzLiBBYnN0cmFjdFBhcmFtZXRlclR5cGUgaGFzIHByaW1pdGl2ZSB0eXBlcyBvbmx5Ci0gLS0+Ci0KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIKLSAgICAgICAgICAgeG1sbnM6bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkUmVxdWVzdCIgdHlwZT0iQWRkUmVxdWVzdFR5cGUiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQWRkUmVxdWVzdFR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9Im5zOkFic3RyYWN0UGFyYW1ldGVyVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlLz4KLSAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIGFic3RyYWN0PSJ0cnVlIiBuYW1lPSJBYnN0cmFjdFBhcmFtZXRlclR5cGUiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyT25lIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIxIiBuYW1lPSJQYXJhbWV0ZXJUd28iIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTQueHNkIGIvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS00LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyZDJlNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tCi0gICAgMS4gQWRkUmVxdWVzdCBpcyBvZiBBZGRSZXF1ZXN0VHlwZQotICAgIDIuIEFkZFJlcXVlc3RUeXBlIGV4dGVuZHMgZnJvbSBBYnN0cmFjdFBhcmFtZXRlclR5cGUgYW5kIGl0IEFkZFJlcXVlc3RUeXBlIGhhcyBtb3JlIHN0dWZmIGRlZmluZWQgaW4gYSBzZXF1ZW5jZSwgaW4KLSAgICBhZGRpdGlvbiB0byB0aGUgZXh0ZW5zaW9uLgotICAgIDMuIEFic3RyYWN0UGFyYW1ldGVyVHlwZSBoYXMgcHJpbWl0aXZlIHR5cGVzIG9ubHkKLS0tPgotCi08eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2NoZW1hcy9heGlzMiIgeG1sbnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3NjaGVtYXMvYXhpczIiCi0gICAgICAgICAgIHhtbG5zOm5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx4czplbGVtZW50IG5hbWU9IkFkZFJlcXVlc3QiIHR5cGU9IkFkZFJlcXVlc3RUeXBlIi8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFkZFJlcXVlc3RUeXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJuczpBYnN0cmFjdFBhcmFtZXRlclR5cGUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlclRocmVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlckZvdXIiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czpjb21wbGV4VHlwZSBhYnN0cmFjdD0idHJ1ZSIgbmFtZT0iQWJzdHJhY3RQYXJhbWV0ZXJUeXBlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiIG5hbWU9IlBhcmFtZXRlck9uZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMSIgbmFtZT0iUGFyYW1ldGVyVHdvIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy93c2Rscy9WZXJzaW9uLndzZGwgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3dzZGxzL1ZlcnNpb24ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1NGVjYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3dzZGxzL1ZlcnNpb24ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOm5zMD0iaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiDQotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iDQotICAgICAgICAgICAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyINCi0gICAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyL3hzZCINCi0gICAgICAgICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgICAgICAgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiDQotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9heGlzdmVyc2lvbi5zYW1wbGUveHNkIj4NCi0gIDx3c2RsOnR5cGVzPg0KLSAgICA8eHM6c2NoZW1hIHhtbG5zOm5zPSJodHRwOi8vYXhpc3ZlcnNpb24uc2FtcGxlL3hzZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCINCi0gICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9heGlzdmVyc2lvbi5zYW1wbGUveHNkIj4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeGNlcHRpb25GYXVsdCI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4Y2VwdGlvbiIgbmlsbGFibGU9InRydWUiDQotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6YW55VHlwZSIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzOmVsZW1lbnQ+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VmVyc2lvblJlc3BvbnNlIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPC94czpzY2hlbWE+DQotICA8L3dzZGw6dHlwZXM+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25SZXF1ZXN0Ii8+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnMwOmdldFZlcnNpb25SZXNwb25zZSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25GYXVsdCI+DQotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnMwOkV4Y2VwdGlvbkZhdWx0Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlZlcnNpb25Qb3J0VHlwZSI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczA6Z2V0VmVyc2lvblJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46Z2V0VmVyc2lvbiIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczA6Z2V0VmVyc2lvblJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOmdldFZlcnNpb25SZXNwb25zZSIvPg0KLSAgICAgIDx3c2RsOmZhdWx0IG1lc3NhZ2U9Im5zMDpnZXRWZXJzaW9uRmF1bHQiIG5hbWU9ImdldFZlcnNpb25GYXVsdCINCi0gICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmdldFZlcnNpb25GYXVsdCIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICA8IS0tIFRoaXMgc2hvdWxkIHR1cm4gaW50byAiZm9vQmFyKCkiIC0tPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZm9vLWJhciI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iZ2V0VmVyc2lvblJlcXVlc3QiLz4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gICAgPCEtLSBUaGlzIHNob3VsZCB0dXJuIGludG8gImZvb0JhUjIoKSIgLS0+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJGb28tYmEucjIiPg0KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImdldFZlcnNpb25SZXF1ZXN0Ii8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICA8L3dzZGw6cG9ydFR5cGU+DQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlZlcnNpb25TT0FQMTFCaW5kaW5nIiB0eXBlPSJuczA6VmVyc2lvblBvcnRUeXBlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFZlcnNpb24iIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImdldFZlcnNpb25GYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9ImdldFZlcnNpb25GYXVsdCIvPg0KLSAgICAgIDwvd3NkbDpmYXVsdD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZvby1iYXIiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Zm9vLWJhciIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkZvby1iYS5yMiI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpmb28tYmFyIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgPC93c2RsOmJpbmRpbmc+DQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlZlcnNpb24iPg0KLSAgICA8d3NkbDpwb3J0IG5hbWU9IlZlcnNpb25TT0FQMTFwb3J0X2h0dHAiIGJpbmRpbmc9Im5zMDpWZXJzaW9uU09BUDExQmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEyNy4wLjAuMTo4MDAwL2F4aXMyL3NlcnZpY2VzL1ZlcnNpb24iLz4NCi0gICAgPC93c2RsOnBvcnQ+DQotICA8L3dzZGw6c2VydmljZT4NCi08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy94bWxzL011bHRpRGltQXJyYXkueG1sIGIvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0LXJlc291cmNlcy94bWxzL011bHRpRGltQXJyYXkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGUwYmQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMveG1scy9NdWx0aURpbUFycmF5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdyYXBwZXI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxpbm5lcj5vbmU8L2lubmVyPgotICAgICAgICA8aW5uZXI+dHdvPC9pbm5lcj4KLSAgICA8L2l0ZW0+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxpbm5lcj4xPC9pbm5lcj4KLSAgICAgICAgPGlubmVyPjI8L2lubmVyPgotICAgICAgICA8aW5uZXI+MzwvaW5uZXI+Ci0gICAgPC9pdGVtPgotPC93cmFwcGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMveG1scy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3QtcmVzb3VyY2VzL3htbHMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ZkY2Q0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC1yZXNvdXJjZXMveG1scy9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlcmFsaXplTG9jYXRpb24iPi48L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIFJlcXVlc3QgUmVzcG9uc2Ugc3R5bGUgT3BlcmF0aW9ucyAtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTRExTZXJ2aWNlQnVpbGRlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETFNlcnZpY2VCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE4ZDc1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETFNlcnZpY2VCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkxpc3RlbmVyTWFuYWdlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VydmljZUJ1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotICAgIExpc3RlbmVyTWFuYWdlciBsbTsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIG51bGwpOwotICAgICAgICBsbSA9IG5ldyBMaXN0ZW5lck1hbmFnZXIoKTsKLSAgICAgICAgbG0uaW5pdChjb25maWdDb250ZXh0KTsKLSAgICAgICAgbG0uc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdGVzdFJlc291cmNlRmlsZSA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1jbGFzc2VzIik7Ci0gICAgICAgIEZpbGUgb3V0TG9jYXRpb24gPSBuZXcgRmlsZSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzIik7Ci0gICAgICAgIG91dExvY2F0aW9uLm1rZGlycygpOwotICAgICAgICBpZiAodGVzdFJlc291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZSBmaWxlcyBbXSA9IHRlc3RSZXNvdXJjZUZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKEZpbGUgZmlsZTEgOiBmaWxlcykgewotICAgICAgICAgICAgICAgIGlmIChmaWxlMS5pc0ZpbGUoKSAmJiBmaWxlMS5nZXROYW1lKCkuZW5kc1dpdGgoIi53c2RsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUxLmdldE5hbWUoKS5lcXVhbHMoInBpbmctbW9kaWZpZWQud3NkbCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlMS5nZXROYW1lKCkuZXF1YWxzKCJwaW5nLXVuYm91bmQud3NkbCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlMS5nZXROYW1lKCkuZXF1YWxzKCJ3c2F0LndzZGwiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTEuZ2V0TmFtZSgpLmVxdWFscygibm8tc2VydmljZS53c2RsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWlsZGVyID0gbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdGluZiBmaWxlOiAiICsgZmlsZTEuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKG91dExvY2F0aW9uLCBmaWxlMS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UucHJpbnRXU0RMKG91dCwgImh0dHA6Ly9nb29nbGUuY29tL2F4aXMyL3NlcnZpY2VzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnJlbW92ZVNlcnZpY2Uoc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIGZpbGUxLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vWE1MMkphdmFNYXBwaW5nVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL1hNTDJKYXZhTWFwcGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NjY3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vWE1MMkphdmFNYXBwaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIFdTTzIgSW5jLiAoaHR0cDovL3d3dy53c28yLm9yZykgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBYTUwySmF2YU1hcHBpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgQ2xhc3MgaWZhY2UgPSBDbGFzcy5mb3JOYW1lKCJzYW1wbGUuYXhpc3ZlcnNpb24ueHNkLlZlcnNpb24iKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaWZhY2UuZ2V0TWV0aG9kKCJnZXRWZXJzaW9uIikpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpZmFjZS5nZXRNZXRob2QoImZvb0JhciIpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaWZhY2UuZ2V0TWV0aG9kKCJmb29CYVIyIikpOw0KLSAgICAgICAgYm9vbGVhbiBjYXVnaHRFeGNlcHRpb24gPSBmYWxzZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWZhY2UuZ2V0TWV0aG9kKCJmb29iYXIyIik7DQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGNhdWdodEV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgY2F0Y2ggZXhwZWN0ZWQgRXhjZXB0aW9uISIsIGNhdWdodEV4Y2VwdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL2V4dGVuc2lvbi9TY2hlbWFVbndyYXBwZXJFeHRlbnNpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1NjaGVtYVVud3JhcHBlckV4dGVuc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4YTVkOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb2RlZ2VuL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi93c2RsL2NvZGVnZW4vZXh0ZW5zaW9uL1NjaGVtYVVud3JhcHBlckV4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfT05FID0gIlBhcmFtZXRlck9uZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9UV08gPSAiUGFyYW1ldGVyVHdvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1RIUkVFID0gIlBhcmFtZXRlclRocmVlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0ZPVVIgPSAiUGFyYW1ldGVyRm91ciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9PUEVSQVRJT04gPSAiQWRkIjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24obmV3IFFOYW1lKEFERF9PUEVSQVRJT04pKTsKLSAgICAgICAgYXhpc01lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgYXhpc01lc3NhZ2Uuc2V0TmFtZSgiQWRkUmVxdWVzdCIpOwotICAgICAgICBheGlzTWVzc2FnZS5zZXRFbGVtZW50UU5hbWUobmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9zY2hlbWFzL2F4aXMyIiwgIkFkZFJlcXVlc3QiKSk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uYWRkTWVzc2FnZShheGlzTWVzc2FnZSwgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgYXhpc01lc3NhZ2Uuc2V0UGFyZW50KGF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJEdW1teVNlcnZpY2UiKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBheGlzT3BlcmF0aW9uLnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqIFRoaXMgcmVmZXJzIHRvIHRoZSBzY2hlbWEtMS54c2Qgd2hpY2ggaGFzIGFuIEFkZFJlcXVlc3QgZWxlbWVudCB3aGljaCBpcyBvZiBjb21wbGV4IHR5cGUgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NlbmFyaW9PbmUoKSB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0xLnhzZCI7Ci0KLSAgICAgICAgY3JlYXRlQW5kV2Fsa1NjaGVtYShzY2hlbWFMb2NhdGlvbik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpLmdldFZhbHVlKCkgPT0gQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gYXhpc01lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfREVUQUlMUyk7Ci0gICAgICAgIE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgbWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIpcGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIExpc3QgcGFydHNMaXN0ID0gbWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlci5nZXRQYXJ0c0xpc3QoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5jb250YWlucyhXU0RMVXRpbC5nZXRQYXJ0UU5hbWUoQUREX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTUVURVJfT05FKSkpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5jb250YWlucyhXU0RMVXRpbC5nZXRQYXJ0UU5hbWUoQUREX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTUVURVJfVFdPKSkpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5zaXplKCkgPT0gMik7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcmVmZXJzIHRvIHRoZSBzY2hlbWEtMi54c2Qgd2hpY2ggaGFzIGFuIEFkZFJlcXVlc3QgZWxlbWVudCB3aGljaCBpcyBvZiBBZGRSZXF1ZXN0VHlwZS4KLSAgICAgKiBBZGRSZXF1ZXN0VHlwZSBpcyBhIGNvbXBsZXggdHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpb1R3bygpIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTIueHNkIjsKLQotICAgICAgICBjcmVhdGVBbmRXYWxrU2NoZW1hKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9ERVRBSUxTKTsKLSAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyID0KLSAgICAgICAgICAgICAgICAoTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcilwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyLmdldFBhcnRzTGlzdCgpOwotCi0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9PTkUpKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9UV08pKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LnNpemUoKSA9PSAyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAxLiBBZGRSZXF1ZXN0IGlzIG9mIEFkZFJlcXVlc3RUeXBlIDIuIEFkZFJlcXVlc3RUeXBlIGV4dGVuZHMgZnJvbSBBYnN0cmFjdFBhcmFtZXRlclR5cGUgMy4KLSAgICAgKiBBYnN0cmFjdFBhcmFtZXRlclR5cGUgaGFzIHByaW1pdGl2ZSB0eXBlcyBvbmx5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvVGhyZWUoKSB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy9zY2hlbWFzL3NjaGVtYS0zLnhzZCI7Ci0KLSAgICAgICAgY3JlYXRlQW5kV2Fsa1NjaGVtYShzY2hlbWFMb2NhdGlvbik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpLmdldFZhbHVlKCkgPT0gQm9vbGVhbi5UUlVFKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gYXhpc01lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfREVUQUlMUyk7Ci0gICAgICAgIE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIgbWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIpcGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIExpc3QgcGFydHNMaXN0ID0gbWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlci5nZXRQYXJ0c0xpc3QoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5jb250YWlucyhXU0RMVXRpbC5nZXRQYXJ0UU5hbWUoQUREX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTUVURVJfT05FKSkpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5jb250YWlucyhXU0RMVXRpbC5nZXRQYXJ0UU5hbWUoQUREX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTUVURVJfVFdPKSkpOwotICAgICAgICBhc3NlcnRUcnVlKHBhcnRzTGlzdC5zaXplKCkgPT0gMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogMS4gQWRkUmVxdWVzdCBpcyBvZiBBZGRSZXF1ZXN0VHlwZSAyLiBBZGRSZXF1ZXN0VHlwZSBleHRlbmRzIGZyb20gQWJzdHJhY3RQYXJhbWV0ZXJUeXBlIGFuZAotICAgICAqIGl0IEFkZFJlcXVlc3RUeXBlIGhhcyBtb3JlIHN0dWZmIGRlZmluZWQgaW4gYSBzZXF1ZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIGV4dGVuc2lvbi4gMy4KLSAgICAgKiBBYnN0cmFjdFBhcmFtZXRlclR5cGUgaGFzIHByaW1pdGl2ZSB0eXBlcyBvbmx5Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvRm91cigpIHsKLSAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3NjaGVtYXMvc2NoZW1hLTQueHNkIjsKLQotICAgICAgICBjcmVhdGVBbmRXYWxrU2NoZW1hKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNNZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9ERVRBSUxTKTsKLSAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyID0KLSAgICAgICAgICAgICAgICAoTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlcilwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBtZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyLmdldFBhcnRzTGlzdCgpOwotCi0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9PTkUpKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9UV08pKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LmNvbnRhaW5zKFdTRExVdGlsLmdldFBhcnRRTmFtZShBRERfT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNRVRFUl9USFJFRSkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwYXJ0c0xpc3QuY29udGFpbnMoV1NETFV0aWwuZ2V0UGFydFFOYW1lKEFERF9PUEVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1FVEVSX0ZPVVIpKSk7Ci0gICAgICAgIGFzc2VydFRydWUocGFydHNMaXN0LnNpemUoKSA9PSA0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5kV2Fsa1NjaGVtYShTdHJpbmcgc2NoZW1hTG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBsb2FkU2NoZW1hKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgU2NoZW1hVW53cmFwcGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IG5ldyBTY2hlbWFVbndyYXBwZXJFeHRlbnNpb24oKTsKLSAgICAgICAgICAgIGV4dGVuc2lvbi53YWxrU2NoZW1hKGF4aXNNZXNzYWdlLCBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoc2NoZW1hTG9jYXRpb24gKyAiIGZpbGUgY2FuIG5vdCBiZSBmb3VuZCIpOwotICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hIGxvYWRTY2hlbWEoU3RyaW5nIHNjaGVtYUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiBzY2hlbWFDb2wgPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICByZXR1cm4gc2NoZW1hQ29sLnJlYWQobmV3IFN0cmVhbVNvdXJjZShpcyksIG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvZGVnZW4vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9BeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Nzg5YzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29kZWdlbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvd3NkbC9jb2RlZ2VuL3NjaGVtYS9BeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLnNjaGVtYTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFHZW5lcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2VUb3BFbGVtZW50U2NoZW1hR2VuZXJhdG9yIHNjaGVtYUdlbmVyYXRvciA9IG5ldyBBeGlzU2VydmljZVRvcEVsZW1lbnRTY2hlbWFHZW5lcmF0b3IobnVsbCk7Ci0KLSAgICAgICAgU2V0IHRvcEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgICAgICBUb3BFbGVtZW50IHRvcEVsZW1lbnQ7Ci0KLSAgICAgICAgdG9wRWxlbWVudCA9IG5ldyBUb3BFbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QuY29tIiwidGVzdEVsZW1lbnQxIikpOwotICAgICAgICB0b3BFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0gICAgICAgIHRvcEVsZW1lbnQgPSBuZXcgVG9wRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0MS5jb20iLCJ0ZXN0RWxlbWVudDIiKSk7Ci0gICAgICAgIHRvcEVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLSAgICAgICAgdG9wRWxlbWVudCA9IG5ldyBUb3BFbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QxLmNvbSIsInRlc3RFbGVtZW50MyIpKTsKLSAgICAgICAgdG9wRWxlbWVudC5zZXRUeXBlUU5hbWUobmV3IFFOYW1lKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCJzdHJpbmciKSk7Ci0gICAgICAgIHRvcEVsZW1lbnRzLmFkZCh0b3BFbGVtZW50KTsKLQotICAgICAgICB0b3BFbGVtZW50ID0gbmV3IFRvcEVsZW1lbnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdDEuY29tIiwidGVzdEVsZW1lbnQ0IikpOwotICAgICAgICB0b3BFbGVtZW50LnNldFR5cGVRTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0MS5jb20iLCJ0ZXN0Q29tcGxleFR5cGUxIikpOwotICAgICAgICB0b3BFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0KLSAgICAgICAgdG9wRWxlbWVudCA9IG5ldyBUb3BFbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QxLmNvbSIsInRlc3RFbGVtZW50NSIpKTsKLSAgICAgICAgdG9wRWxlbWVudC5zZXRUeXBlUU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdC5jb20iLCJ0ZXN0Q29tcGxleFR5cGUyIikpOwotICAgICAgICB0b3BFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0KLSAgICAgICAgdG9wRWxlbWVudCA9IG5ldyBUb3BFbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QuY29tIiwidGVzdEVsZW1lbnQ2IikpOwotICAgICAgICB0b3BFbGVtZW50LnNldFR5cGVRTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0Mi5jb20iLCJ0ZXN0Q29tcGxleFR5cGUyIikpOwotICAgICAgICB0b3BFbGVtZW50cy5hZGQodG9wRWxlbWVudCk7Ci0KLSAgICAgICAgTWFwIHNjaGVtYU1hcCA9IHNjaGVtYUdlbmVyYXRvci5nZXRTY2hlbWFNYXAodG9wRWxlbWVudHMpOwotICAgICAgICBzY2hlbWFHZW5lcmF0b3IuZ2V0WG1sU2NoZW1hTGlzdChzY2hlbWFNYXApOwotCi0vLyAgICAgICAgTGlzdCB4bWxTY2hlbWFMaXN0ID0gc2NoZW1hR2VuZXJhdG9yLmdldFhtbFNjaGVtYUxpc3Qoc2NoZW1hTWFwKTsKLS8vICAgICAgICBmb3IgKE9iamVjdCBhWG1sU2NoZW1hTGlzdCA6IHhtbFNjaGVtYUxpc3QpIHsKLS8vICAgICAgICAgICAgKChvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYSlhWG1sU2NoZW1hTGlzdCkud3JpdGUoU3lzdGVtLm91dCk7Ci0vLyAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9jb3JiYS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWE2YTNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItY29yYmE8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gQ09SQkE8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIENPUkJBIG1vZHVsZTwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5hbnRscjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHthbnRsci52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1ldGFkYXRhPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvY29yYmE8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9jb3JiYTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvY29yYmE8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9Db3JiYUNvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvQ29yYmFDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0YmY5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9Db3JiYUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5kZXBsb3llcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIENvcmJhQ29uc3RhbnRzIHsNCi0gICAgLy8gQ29uc3RhbnRzIGZvciBTZXJ2aWNlIEREIFhNTA0KLSAgICBTdHJpbmcgSURMX0ZJTEUgPSAiaWRsRmlsZSI7DQotDQotICAgIC8vIFRvIHVzZSBhIGN1c3RvbSBPUkINCi0gICAgU3RyaW5nIE9SQl9DTEFTUyA9ICJvcmJDbGFzcyI7DQotICAgIFN0cmluZyBPUkJfU0lOR0xFVE9OX0NMQVNTID0gIm9yYlNpbmdsZXRvbkNsYXNzIjsNCi0NCi0gICAgLy8gT25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgcmVxdWlyZWQgdG8gbG9jYXRlIHRoZSBDT1JCQSBzZXJ2aWNlDQotICAgIFN0cmluZyBOQU1JTkdfU0VSVklDRV9VUkwgPSAibmFtaW5nU2VydmljZVVybCI7DQotICAgIFN0cmluZyBJT1JfRklMRV9QQVRIID0gImlvckZpbGVQYXRoIjsNCi0gICAgU3RyaW5nIElPUl9TVFJJTkcgPSAiaW9yU3RyaW5nIjsNCi0NCi0gICAgLy8gUmVxdWlyZWQgb25seSBpZiBuYW1pbmdTZXJ2aWNlVXJsIGlzIHByb3ZpZGVkIA0KLSAgICBTdHJpbmcgT0JKRUNUX05BTUUgPSAib2JqZWN0TmFtZSI7DQotDQotICAgIC8vIE5hbWUgb2YgdGhlIENPUkJBIGludGVyZmFjZQ0KLSAgICBTdHJpbmcgSU5URVJGQUNFX05BTUUgPSAiaW50ZXJmYWNlTmFtZSI7DQotDQotICAgIC8vIENvbnN0YW50cyBmb3IgcHJvY2Vzc2luZyB0aGUgY29yYmEgd2ViIHNlcnZpY2VzDQotICAgIFN0cmluZyBPUkJfTElURVJBTCA9ICJvcmIiOw0KLSAgICBTdHJpbmcgSURMX0xJVEVSQUwgPSAiaWRsIjsNCi0gICAgU3RyaW5nIFJFVFVSTl9XUkFQUEVSID0gInJldHVybiI7DQotICAgIFN0cmluZyBWT0lEID0gInZvaWQiOw0KLSAgICBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOw0KLSAgICBTdHJpbmcgRkFVTFQgPSAiRmF1bHQiOw0KLSAgICBTdHJpbmcgQVJSQVlfSVRFTSA9ICJpdGVtIjsNCi0gICAgU3RyaW5nIE9SR19PTUdfQ09SQkFfT1JCQ0xBU1MgPSAib3JnLm9tZy5DT1JCQS5PUkJDbGFzcyI7DQotICAgIFN0cmluZyBERUZBVUxSX09SQl9DTEFTUyA9ICJvcmcuYXBhY2hlLnlva28ub3JiLkNPUkJBLk9SQiI7DQotICAgIFN0cmluZyBPUkdfT01HX0NPUkJBX09SQlNJTkdMRVRPTl9DTEFTUyA9ICJvcmcub21nLkNPUkJBLk9SQlNpbmdsZXRvbkNsYXNzIjsNCi0gICAgU3RyaW5nIERFRkFVTFRfT1JCU0lOR0xFVE9OX0NMQVNTID0gIm9yZy5hcGFjaGUueW9rby5vcmIuQ09SQkEuT1JCU2luZ2xldG9uIjsNCi0NCi0gICAgU3RyaW5nIE5BTUVfU1BBQ0VfUFJFRklYID0gImF4MiI7IC8vIGF4aXMyIG5hbWUgc3BhY2UNCi0gICAgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7DQotICAgIGNoYXIgUEFDS0FHRV9DTEFTU19ERUxJTUlURVIgPSAnLic7DQotICAgIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFX0VYVE4gPSAiL3hzZCI7DQotICAgIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FU1BBQ0VfUFJFRklYID0gInhzIjsNCi0gICAgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOw0KLSAgICBTdHJpbmcgRk9STV9ERUZBVUxUX1VOUVVBTElGSUVEID0gInVucXVhbGlmaWVkIjsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvQ29yYmFEZXBsb3llci5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvQ29yYmFEZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzBiY2FmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2RlcGxveWVyL0NvcmJhRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYVV0aWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RW5naW5lOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXNjcmlwdGlvbkJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuRGVwbG95bWVudEZpbGVEYXRhOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5QaGFzZXNJbmZvOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlckluY2x1ZGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuVHlwZVRhYmxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEudXRpbHMuTmFtZXNwYWNlTWFwOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5PUkI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBDb3JiYURlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIsIERlcGxveW1lbnRDb25zdGFudHMsIENvcmJhQ29uc3RhbnRzIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhRGVwbG95ZXIuY2xhc3MpOw0KLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7DQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4Ow0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgew0KLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7DQotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSB0aGlzLmNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgLyp0cnkgew0KLSAgICAgICAgICAgIFN5c3RlbS5pbi5yZWFkKCk7DQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotDQotICAgICAgICB9Ki8NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuc2V0Q2xhc3NMb2FkZXIoYXhpc0NvbmZpZy5nZXRTZXJ2aWNlQ2xhc3NMb2FkZXIoKSk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlnKTsNCi0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoZGVwbG95bWVudEZpbGVEYXRhLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IHByb2Nlc3NTZXJ2aWNlKGRlcGxveW1lbnRGaWxlRGF0YSwgc2VydmljZUdyb3VwLCBjb25maWdDdHgpOw0KLSAgICAgICAgICAgIERlcGxveW1lbnRFbmdpbmUuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwgc2VydmljZUxpc3QsIGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkudG9VUkwoKSwgZGVwbG95bWVudEZpbGVEYXRhLCBheGlzQ29uZmlnKTsNCi0gICAgICAgICAgICBuYW1lID0gZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95aW5nICIgKyBuYW1lKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGRlcGxveWluZyAiICsgbmFtZSwgYXhpc0ZhdWx0KTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB3aGlsZSBkZXBsb3lpbmcgIiArIG5hbWUsIGUpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGRlcGxveWluZyAiICsgbmFtZSwgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc1NlcnZpY2UoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSwgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7DQotICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpKTsNCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IERlc2NyaXB0aW9uQnVpbGRlci5nZXRTaG9ydEZpbGVOYW1lKGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0UGFyZW50KHNlcnZpY2VHcm91cCk7DQotICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihkZXBsb3ltZW50RmlsZURhdGEuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotDQotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXIoaW4sIGNvbmZpZ0N0eCk7DQotICAgICAgICAgICAgT01FbGVtZW50IHJvb3RFbGVtZW50ID0gYnVpbGRlci5idWlsZE9NKCk7DQotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gcm9vdEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICAgICAgaWYgKFRBR19TRVJWSUNFLmVxdWFscyhlbGVtZW50TmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVTZXJ2aWNlKGF4aXNTZXJ2aWNlLCByb290RWxlbWVudCwgZmlsZS5nZXRQYXJlbnQoKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW52YWxpZCAiICsgZGVwbG95bWVudEZpbGVEYXRhLmdldEFic29sdXRlUGF0aCgpICsgIiBmb3VuZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRklMRV9OT1RfRk9VTkQsIGUuZ2V0TWVzc2FnZSgpKSk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLlhNTF9TVFJFQU1fRVhDRVBUSU9OLCBlLmdldE1lc3NhZ2UoKSkpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXJyb3JpbmlucHV0c3RyZWFtY2xvc2UiKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBBcnJheUxpc3Qgc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBzZXJ2aWNlTGlzdC5hZGQoYXhpc1NlcnZpY2UpOw0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VMaXN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVNlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSwgT01FbGVtZW50IHNlcnZpY2VfZWxlbWVudCwgU3RyaW5nIGRpcmVjdG9yeSkNCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIFByb2Nlc3Npbmcgc2VydmljZSBsZXZlbCBwYXJhbWV0ZXJzDQotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VydmljZV9lbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsNCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIHNlcnZpY2UsIHNlcnZpY2UuZ2V0UGFyZW50KCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIHByb2Nlc3Mgc2VydmljZSBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIE9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfREVTQ1JJUFRJT04pKTsNCi0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25FbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IGRlc2NyaXB0aW9uVmFsdWUgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvblZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblZhbHVlLmJ1aWxkKCk7DQotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblZhbHVlLnNlcmlhbGl6ZSh3cml0ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldERvY3VtZW50YXRpb24od3JpdGVyLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uKGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUZXh0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgc2VydmljZU5hbWVhdHQgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWVhdHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKS50cmltKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uKHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHNlcnZpY2VOYW1lYXR0ID0gc2VydmljZV9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX05BTUUpKTsNCi0NCi0gICAgICAgICAgICAvLyBJZiB0aGUgc2VydmljZSBuYW1lIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlcy54bWwNCi0gICAgICAgICAgICAvLyB0aGVuIHVzZSB0aGF0IGFzIHRoZSBzZXJ2aWNlIG5hbWUNCi0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWVhdHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhzZXJ2aWNlTmFtZWF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLnRyaW0oKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0TmFtZShzZXJ2aWNlTmFtZWF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldERvY3VtZW50YXRpb24oKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uKHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFByb2Nlc3MgV1MtQWRkcmVzc2luZyBmbGFnIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGFkZHJlc3NpbmdSZXF1aXJlZGF0dCA9IHNlcnZpY2VfZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgQVRUUklCVVRFX1dTQUREUkVTU0lORykpOw0KLSAgICAgICAgICAgIGlmIChhZGRyZXNzaW5nUmVxdWlyZWRhdHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nID0gYWRkcmVzc2luZ1JlcXVpcmVkYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdIZWxwZXIuc2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoc2VydmljZSwgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gU2V0dGluZyBzZXJ2aWNlIHRhcmdldCBuYW1lc3BhY2UgaWYgYW55DQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgdGFyZ2V0TmFtZVNwYWNlID0gc2VydmljZV9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFSR0VUX05BTUVfU1BBQ0UpKTsNCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZVNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVTcGVjZVZhbGUgPSB0YXJnZXROYW1lU3BhY2UuZ2V0QXR0cmlidXRlVmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5hbWVTcGVjZVZhbGUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKG5hbWVTcGVjZVZhbGUpKSB7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldFRhcmdldE5hbWVzcGFjZShuYW1lU3BlY2VWYWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgIiIuZXF1YWxzKHNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldFRhcmdldE5hbWVzcGFjZShKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBTZXR0aW5nIHNjaGVtYSBuYW1lc3BlY2UgaWYgYW55DQotICAgICAgICAgICAgT01FbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShTQ0hFTUEpKTsNCi0gICAgICAgICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIHNjaGVtYU5hbWVTcGFjZSA9IHNjaGVtYUVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShTQ0hFTUFfTkFNRV9TUEFDRSkpOw0KLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1hTmFtZVNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lU3BlY2VWYWxlID0gc2NoZW1hTmFtZVNwYWNlLmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVNwZWNlVmFsZSAhPSBudWxsICYmICEiIi5lcXVhbHMobmFtZVNwZWNlVmFsZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShuYW1lU3BlY2VWYWxlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBlbGVtZW50Rm9ybURlZmF1bHQgPSBzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoDQotICAgICAgICAgICAgICAgICAgICAgICAgU0NIRU1BX0VMRU1FTlRfUVVBTElGSUVEKSk7DQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50Rm9ybURlZmF1bHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZWxlbWVudEZvcm1EZWZhdWx0LmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyh2YWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIFJlbW92aW5nIGV4Y2x1ZGUgb3BlcmF0aW9ucw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBleGNsdWRlT3BlcmF0aW9ucyA9IHNlcnZpY2VfZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19FWENMVURFX09QRVJBVElPTlMpKTsNCi0gICAgICAgICAgICBBcnJheUxpc3QgZXhjbHVkZW9wcyA9IG51bGw7DQotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVPcGVyYXRpb25zICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZXhjbHVkZW9wcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZXhjbHVkZU9wX2l0ciA9IGV4Y2x1ZGVPcGVyYXRpb25zLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGV4Y2x1ZGVPcF9pdHIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb3BOYW1lID0gKE9NRWxlbWVudCkgZXhjbHVkZU9wX2l0ci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBleGNsdWRlb3BzLmFkZChvcE5hbWUuZ2V0VGV4dCgpLnRyaW0oKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVvcHMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBleGNsdWRlb3BzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHNlcnZpY2Utd2lkZSBtb2R1bGVzIHdoaWNoIHJlcXVpcmVkIHRvIGVuZ2FnZSBnbG9iYWxseQ0KLSAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZVJlZnMgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01PRFVMRSkpOw0KLSAgICAgICAgICAgIHdoaWxlIChtb2R1bGVSZWZzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7DQotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG1vZHVsZVJlZkF0dHJpYnV0ZSA9IG1vZHVsZXJlZi5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19SRUZFUkVOQ0UpKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlZk5hbWUgPSBtb2R1bGVSZWZBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRHbG9iYWxNb2R1bGVSZWYocmVmTmFtZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXNzYWdlUmVjZWl2ZXIgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFRBR19NRVNTQUdFX1JFQ0VJVkVSUykpOw0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0NCi0gICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBtZXNzYWdlIHJlY2lldmVycw0KLSAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZVJlY2VpdmVyKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsDQotICAgICAgICAgICAgICAgICAgICBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgIm9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzLkNvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIikpOw0KLSAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZVJlY2VpdmVyKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvcm9idXN0LWluLW9ubHkiLA0KLSAgICAgICAgICAgICAgICAgICAgbG9hZE1lc3NhZ2VSZWNlaXZlcihsb2FkZXIsICJvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYUluT25seU1lc3NhZ2VSZWNlaXZlciIpKTsNCi0gICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VSZWNlaXZlcigiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsDQotICAgICAgICAgICAgICAgICAgICBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgIm9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzLkNvcmJhTWVzc2FnZVJlY2VpdmVyIikpOw0KLSAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZVJlY2VpdmVyKCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3B0LW91dCIsDQotICAgICAgICAgICAgICAgICAgICBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgIm9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzLkNvcmJhSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciIpKTsNCi0NCi0gICAgICAgICAgICBpZiAobWVzc2FnZVJlY2VpdmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgSGFzaE1hcCBtcnMgPSBwcm9jZXNzTWVzc2FnZVJlY2VpdmVycyhsb2FkZXIsIG1lc3NhZ2VSZWNlaXZlcik7DQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGtleXMgPSBtcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VSZWNlaXZlcihrZXksIChNZXNzYWdlUmVjZWl2ZXIpIG1ycy5nZXQoa2V5KSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyB0cmFuc3BvcnRzDQotICAgICAgICAgICAgT01FbGVtZW50IHRyYW5zcG9ydHMgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfVFJBTlNQT1JUUykpOw0KLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnRzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgdHJhbnNwb3J0X2l0ciA9IHRyYW5zcG9ydHMuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RSQU5TUE9SVCkpOw0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdHJzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAodHJhbnNwb3J0X2l0ci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCB0cnNFbGUgPSAoT01FbGVtZW50KSB0cmFuc3BvcnRfaXRyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJuc3BvcnROYW1lID0gdHJzRWxlLmdldFRleHQoKS50cmltKCk7DQotICAgICAgICAgICAgICAgICAgICB0cnMuYWRkKHRhcm5zcG9ydE5hbWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0RXhwb3NlZFRyYW5zcG9ydHModHJzKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBvcGVyYXRpb25zDQotICAgICAgICAgICAgcHJvY2Vzc09wZXJhdGlvbnMoc2VydmljZSwgYXhpc0NvbmZpZywgZXhjbHVkZW9wcywgbnVsbCwgZGlyZWN0b3J5KTsNCi0gICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbkRlc2MgPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9uc0l0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHdzYW1hcHBpbmdzID0gb3BlcmF0aW9uRGVzYy5nZXRXU0FNYXBwaW5nTGlzdCgpOw0KLSAgICAgICAgICAgICAgICBpZiAod3NhbWFwcGluZ3MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbkRlc2MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihvcGVyYXRpb25EZXNjKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzYW1hcHBpbmdzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFwcGluZyA9IChTdHJpbmcpIHdzYW1hcHBpbmdzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nLmxlbmd0aCgpID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24obWFwcGluZywgb3BlcmF0aW9uRGVzYyk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlb3BzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSAoU3RyaW5nKSBleGNsdWRlb3BzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgc2VydmljZS5yZW1vdmVPcGVyYXRpb24obmV3IFFOYW1lKG9wTmFtZSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuT1BFUkFUSU9OX1BST0NFU1NfRVJST1IsIGF4aXNGYXVsdC5nZXRNZXNzYWdlKCkpLCBheGlzRmF1bHQpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9jZXNzTWVzc2FnZVJlY2VpdmVycyhDbGFzc0xvYWRlciBsb2FkZXIsIE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7DQotICAgICAgICBIYXNoTWFwIG1lcHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NRVNTQUdFX1JFQ0VJVkVSKSk7DQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgT01FbGVtZW50IHJlY2VpdmVyRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBPTUF0dHJpYnV0ZSByZWNlaXZlck5hbWUgPSByZWNlaXZlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOw0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSByZWNlaXZlck5hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKTsNCi0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBsb2FkTWVzc2FnZVJlY2VpdmVyKGxvYWRlciwgY2xhc3NOYW1lKTsNCi0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtZXBBdHQgPSByZWNlaXZlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfTUVQKSk7DQotICAgICAgICAgICAgbWVwcy5wdXQobWVwQXR0LmdldEF0dHJpYnV0ZVZhbHVlKCksIHJlY2VpdmVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZXBzOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBNZXNzYWdlUmVjZWl2ZXIgbG9hZE1lc3NhZ2VSZWNlaXZlcihDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsYXNzIG1lc3NhZ2VSZWNlaXZlcjsNCi0gICAgICAgICAgICBpZiAoKGNsYXNzTmFtZSAhPSBudWxsKSAmJiAhIiIuZXF1YWxzKGNsYXNzTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyID0gTG9hZGVyLmxvYWRDbGFzcyhsb2FkZXIsIGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgICAgIHJlY2VpdmVyID0gKE1lc3NhZ2VSZWNlaXZlcikgbWVzc2FnZVJlY2VpdmVyLm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24ob3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzLmdldE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLkVSUk9SX0lOX0xPQURJTkdfTUVTU0FHRV9SRUNFSVZFUiwNCi0gICAgICAgICAgICAgICAgICAgICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwgY2xhc3NOYW1lKSwgZSk7DQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLA0KLSAgICAgICAgICAgICAgICAgICAgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24iLCBjbGFzc05hbWUpLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlcy5nZXRNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5FUlJPUl9JTl9MT0FESU5HX01FU1NBR0VfUkVDRUlWRVIsDQotICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFyYW1ldGVycyhJdGVyYXRvciBwYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJbmNsdWRlIHBhcmFtZXRlckluY2x1ZGUsDQotICAgICAgICAgICAgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIHdoaWxlIChwYXJhbWV0ZXJzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gY2hlY2sgd2hldGhlciBzb21lIG9uZSBoYXMgbG9ja2VkIHRoZSBwYXJtZXRlciBhdCB0aGUNCi0gICAgICAgICAgICAvLyB0b3AgbGV2ZWwNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IChPTUVsZW1lbnQpIHBhcmFtZXRlcnMubmV4dCgpOw0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7DQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXJFbGVtZW50DQotICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlckVsZW1lbnQocGFyYW1ldGVyRWxlbWVudCk7DQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgTmFtZQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFtTmFtZSA9IHBhcmFtZXRlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOw0KLSAgICAgICAgICAgIGlmIChwYXJhbU5hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQkFEX1BBUkFNRVRFUl9BUkdVTUVOVCwgcGFyYW1ldGVyRWxlbWVudC50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHBhcmFtZXRlci5zZXROYW1lKHBhcmFtTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsNCi0gICAgICAgICAgICAvLyBzZXR0aW5nIHBhcmFtZXRlciBWYWx1ZSAodGhlIGNoaWxkIGVsZW1lbnQgb2YgdGhlIHBhcmFtZXRlcikNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1WYWx1ZSA9IHBhcmFtZXRlckVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgaWYgKHBhcmFtVmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUocGFyYW1ldGVyRWxlbWVudCk7DQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJUeXBlKFBhcmFtZXRlci5PTV9QQVJBTUVURVIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhdGV4dFZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRUZXh0KCk7DQotDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRWYWx1ZShwYXJhdGV4dFZhbHVlKTsNCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlclR5cGUoUGFyYW1ldGVyLlRFWFRfUEFSQU1FVEVSKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gc2V0dGluZyBsb2NraW5nIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFtTG9ja2VkID0gcGFyYW1ldGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9MT0NLRUQpKTsNCi0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyZW50UGFyYW0gPSBudWxsOw0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBwYXJlbnRQYXJhbSA9IHBhcmVudC5nZXRQYXJhbWV0ZXIocGFyYW1ldGVyLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwYXJhbUxvY2tlZCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NrZWRWYWx1ZSA9IHBhcmFtTG9ja2VkLmdldEF0dHJpYnV0ZVZhbHVlKCk7DQotICAgICAgICAgICAgICAgIGlmIChCT09MRUFOX1RSVUUuZXF1YWxzKGxvY2tlZFZhbHVlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgYXQgc29tZSBsZXZlbCBwYXJhbWV0ZXIgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYnkgdGhhdA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgcGFyZW50LmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlci5nZXROYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQ09ORklHX05PVF9GT1VORCwgcGFyYW1ldGVyLmdldE5hbWUoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TG9ja2VkKHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldExvY2tlZChmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmVudFBhcmFtID09IG51bGwpIHx8ICFwYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPcGVyYXRpb25zKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgZXhjbHVkZU9wZXJhdGlvbnMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBub25ScGNNZXRob2RzLCBTdHJpbmcgZGlyTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBPUkIgb3JiID0gQ29yYmFVdGlsLmdldE9SQihheGlzU2VydmljZSk7DQotICAgICAgICBJREwgaWRsID0gQ29yYmFVdGlsLmdldElETChheGlzU2VydmljZSwgb3JiLCBkaXJOYW1lKTsNCi0NCi0gICAgICAgIFBhcmFtZXRlciBvcmJQYXJhbSA9IG5ldyBQYXJhbWV0ZXIoT1JCX0xJVEVSQUwsIG9yYik7DQotICAgICAgICBQYXJhbWV0ZXIgaWRsUGFyYW0gPSBuZXcgUGFyYW1ldGVyKElETF9MSVRFUkFMLCBpZGwpOw0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG9yYlBhcmFtKTsNCi0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihpZGxQYXJhbSk7DQotDQotICAgICAgICAvLyBhZGRpbmcgbmFtZSBzcGFjZXMNCi0gICAgICAgIE5hbWVzcGFjZU1hcCBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7DQotICAgICAgICBtYXAucHV0KEphdmEyV1NETENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYLCBKYXZhMldTRExDb25zdGFudHMuQVhJUzJfWFNEKTsNCi0gICAgICAgIG1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfU0NIRU1BX05BTUVTUEFDRV9QUkVGSVgsIEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsNCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWVzcGFjZU1hcChtYXApOw0KLQ0KLSAgICAgICAgUGFyYW1ldGVyIGludGVyZmFjZU5hbWVQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihJTlRFUkZBQ0VfTkFNRSk7DQotICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IChTdHJpbmcpICgoaW50ZXJmYWNlTmFtZVBhcmFtPT1udWxsKSA/IG51bGwgOiBpbnRlcmZhY2VOYW1lUGFyYW0uZ2V0VmFsdWUoKSk7DQotICAgICAgICBTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gbmV3IFNjaGVtYUdlbmVyYXRvcihpZGwsIGludGVyZmFjZU5hbWUsDQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLA0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7DQotICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0RXhjbHVkZU1ldGhvZHMoZXhjbHVkZU9wZXJhdGlvbnMpOw0KLSAgICAgICAgc2NoZW1hR2VuZXJhdG9yLnNldE5vblJwY01ldGhvZHMobm9uUnBjTWV0aG9kcyk7DQotICAgICAgICBpZiAoIWF4aXNTZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCkpIHsNCi0gICAgICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEphdmEyV1NETENvbnN0YW50cy5GT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwDQotICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0UGtnMm5zbWFwKGF4aXNTZXJ2aWNlLmdldFAybk1hcCgpKTsNCi0gICAgICAgIENvbGxlY3Rpb24gc2NoZW1hcyA9IHNjaGVtYUdlbmVyYXRvci5nZW5lcmF0ZVNjaGVtYSgpOw0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkU2NoZW1hKHNjaGVtYXMpOw0KLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvci5nZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKSk7DQotICAgICAgICBheGlzU2VydmljZS5zZXRUeXBlVGFibGUoc2NoZW1hR2VuZXJhdG9yLmdldFR5cGVUYWJsZSgpKTsNCi0gICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFLmVxdWFscygNCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0VGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvci5nZXRUYXJnZXROYW1lc3BhY2UoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBJbnRlcmZhY2UgaW50ZiA9IChJbnRlcmZhY2UpIGlkbC5nZXRJbnRlcmZhY2VzKCkuZ2V0KGludGVyZmFjZU5hbWUpOw0KLSAgICAgICAgT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9IGludGYuZ2V0T3BlcmF0aW9ucygpOw0KLQ0KLSAgICAgICAgVHlwZVRhYmxlIHRhYmxlID0gc2NoZW1hR2VuZXJhdG9yLmdldFR5cGVUYWJsZSgpOw0KLSAgICAgICAgUGhhc2VzSW5mbyBwaW5mbyA9IGF4aXNDb25maWcuZ2V0UGhhc2VzSW5mbygpOw0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT3BlcmF0aW9uIGNvcmJhT3BlcmF0aW9uID0gb3BlcmF0aW9uc1tpXTsNCi0gICAgICAgICAgICBTdHJpbmcgb3BOYW1lID0gY29yYmFPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChleGNsdWRlT3BlcmF0aW9ucyAhPSBudWxsICYmIGV4Y2x1ZGVPcGVyYXRpb25zLmNvbnRhaW5zKG9wTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsNCi0gICAgICAgICAgICAvLyBpZiB0aGUgb3BlcmF0aW9uIHRoZXJlIGluIHNlcnZpY2VzLnhtbCB0aGVuIHRyeSB0byBzZXQgaXQgc2NoZW1hIGVsZW1lbnQgbmFtZQ0KLSAgICAgICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOw0KLSAgICAgICAgICAgICAgICBpZiAoaW5NZXNzYWdlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5zZXROYW1lKG9wTmFtZSArIEphdmEyV1NETENvbnN0YW50cy5NRVNTQUdFX1NVRkZJWCk7DQotICAgICAgICAgICAgICAgICAgICBRTmFtZSBjb21wbGV4U2NoZW1hVHlwZSA9IHRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKG9wTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKGNvbXBsZXhTY2hlbWFUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wbGV4U2NoZW1hVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhjb21wbGV4U2NoZW1hVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgcmV0dXJuVHlwZSA9IGNvcmJhT3BlcmF0aW9uLmdldFJldHVyblR5cGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCAmJiAhQ29yYmFVdGlsLmdldFF1YWxpZmllZE5hbWUocmV0dXJuVHlwZSkuZXF1YWxzKFZPSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7DQotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZWZvcnRoZVR5cGUgPSB0YWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUob3BOYW1lICsgUkVTUE9OU0UpOw0KLSAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUocU5hbWVmb3J0aGVUeXBlKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChxTmFtZWZvcnRoZVR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcocU5hbWVmb3J0aGVUeXBlLCBvcGVyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXROYW1lKG9wTmFtZSArIFJFU1BPTlNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoY29yYmFPcGVyYXRpb24uaGFzUmFpc2VzKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIExpc3QgZXh0eXBlcyA9IGNvcmJhT3BlcmF0aW9uLmdldFJhaXNlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHR5cGVzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgZXh0eXBlcy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4bmFtZSA9IGV4dHlwZS5nZXROYW1lKCkgOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGV4dHlwZXMuc2l6ZSgpPjEpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0TmFtZShvcE5hbWUgKyBGQVVMVCArIGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldE5hbWUob3BOYW1lICsgRkFVTFQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUoZXhuYW1lICsgRkFVTFQpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gZ2V0QXhpc09wZXJhdGlvbmZvckNvcmJhT3BlcmF0aW9uKGNvcmJhT3BlcmF0aW9uLCB0YWJsZSk7DQotICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtciA9IGF4aXNTZXJ2aWNlLmdldE1lc3NhZ2VSZWNlaXZlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobXIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbXIgPSBheGlzQ29uZmlnLmdldE1lc3NhZ2VSZWNlaXZlcihvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsNCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHBpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcGVyYXRpb24pOw0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldFNvYXBBY3Rpb24oInVybjoiICsgb3BOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb25mb3JDb3JiYU9wZXJhdGlvbihPcGVyYXRpb24gY29yYmFPcGVyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVRhYmxlIHRhYmxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uOw0KLSAgICAgICAgU3RyaW5nIG9wTmFtZSA9IGNvcmJhT3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgIERhdGFUeXBlIHJldHVyblR5cGUgPSBjb3JiYU9wZXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICBpZiAocmV0dXJuVHlwZSA9PSBudWxsIHx8IENvcmJhVXRpbC5nZXRRdWFsaWZpZWROYW1lKHJldHVyblR5cGUpLmVxdWFscyhWT0lEKSkgew0KLSAgICAgICAgICAgIGlmIChjb3JiYU9wZXJhdGlvbi5oYXNSYWlzZXMoKSkgew0KLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRBeGlzT3BlcmF0aW9uKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVCk7DQotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsNCi0gICAgICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUodGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG9wTmFtZSArIFJFU1BPTlNFKSk7DQotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShvcE5hbWUgKyBSRVNQT05TRSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkuZ2V0QXhpc09wZXJhdGlvbihXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PTkxZKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG9wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldEF4aXNPcGVyYXRpb24oV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUKTsNCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoDQotICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsNCi0gICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0YWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUob3BOYW1lICsgUkVTUE9OU0UpKTsNCi0gICAgICAgICAgICBvdXRNZXNzYWdlLnNldE5hbWUob3BOYW1lICsgUkVTUE9OU0UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNvcmJhT3BlcmF0aW9uLmhhc1JhaXNlcygpKSB7DQotICAgICAgICAgICAgTGlzdCBleHR5cGVzID0gY29yYmFPcGVyYXRpb24uZ2V0UmFpc2VzKCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaj0gMCA7IGogPCBleHR5cGVzLnNpemUoKSA7IGorKykgew0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgZXh0eXBlcy5nZXQoaik7DQotICAgICAgICAgICAgICAgIFN0cmluZyBleG5hbWUgPSBleHR5cGUuZ2V0TmFtZSgpIDsNCi0gICAgICAgICAgICAgICAgaWYoZXh0eXBlcy5zaXplKCkgPjEpew0KLSAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldE5hbWUob3BOYW1lICsgRkFVTFQgKyBqKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXROYW1lKG9wTmFtZSArIEZBVUxUKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKGV4bmFtZSArIEZBVUxUKSk7DQotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRGYXVsdE1lc3NhZ2VzKGZhdWx0TWVzc2FnZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgb3BlcmF0aW9uLnNldE5hbWUobmV3IFFOYW1lKG9wTmFtZSkpOw0KLSAgICAgICAgQXhpc01lc3NhZ2UgaW5NZXNzYWdlID0gb3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsNCi0gICAgICAgIGlmIChpbk1lc3NhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGluTWVzc2FnZS5zZXRFbGVtZW50UU5hbWUodGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUob3BOYW1lKSk7DQotICAgICAgICAgICAgaW5NZXNzYWdlLnNldE5hbWUob3BOYW1lICsgSmF2YTJXU0RMQ29uc3RhbnRzLk1FU1NBR0VfU1VGRklYKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvcGVyYXRpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBmaWxlTmFtZSA9IFV0aWxzLmdldFNob3J0RmlsZU5hbWUoZmlsZU5hbWUpOw0KLSAgICAgICAgICAgIGF4aXNDb25maWcucmVtb3ZlU2VydmljZUdyb3VwKGZpbGVOYW1lKTsNCi0gICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9SRU1PVkVELCBmaWxlTmFtZSkpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgIGF4aXNDb25maWcucmVtb3ZlRmF1bHR5U2VydmljZShmaWxlTmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZGVwbG95ZXIvU2NoZW1hR2VuZXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9TY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0YzQ0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9kZXBsb3llci9TY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BYnN0cmFjdENvbGxlY3Rpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BcnJheVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkNvbXBvc2l0ZURhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5EYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRW51bVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkV4Y2VwdGlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLklETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuSW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk9wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuUHJpbWl0aXZlRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlR5cGVkZWY7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlVuaW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnMuQ29yYmFVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLk5hbWVzcGFjZUdlbmVyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuVHlwZVRhYmxlOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDaG9pY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29sbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFDb21wbGV4VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUVudW1lcmF0aW9uRmFjZXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRm9ybTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VNYXA7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRvciBpbXBsZW1lbnRzIENvcmJhQ29uc3RhbnRzIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHByZWZpeENvdW50ID0gMTsNCi0gICAgcHJvdGVjdGVkIE1hcCB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAgPSBuZXcgSGFzaHRhYmxlKCk7DQotICAgIHByb3RlY3RlZCBNYXAgc2NoZW1hTWFwID0gbmV3IEhhc2h0YWJsZSgpOw0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hQ29sbGVjdGlvbiB4bWxTY2hlbWFDb2xsZWN0aW9uID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsNCi0gICAgcHJpdmF0ZSBJREwgaWRsOw0KLSAgICBwcml2YXRlIFN0cmluZyBpbnRlcmZhY2VOYW1lOw0KLSAgICBwcml2YXRlIFR5cGVUYWJsZSB0eXBlVGFibGUgPSBuZXcgVHlwZVRhYmxlKCk7DQotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVTcGFjZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hX25hbWVzcGFjZV9wcmVmaXg7DQotICAgIHByaXZhdGUgU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdCA9IG51bGw7DQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4Y2x1ZGVNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICBwcml2YXRlIEFycmF5TGlzdCBleHRyYUNsYXNzZXMgPSBudWxsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlV1NETFR5cGVzTmFtZXNwYWNlID0gZmFsc2U7DQotICAgIHByaXZhdGUgTWFwIHBrZzJuc21hcCA9IG51bGw7DQotICAgIHByaXZhdGUgTmFtZXNwYWNlR2VuZXJhdG9yIG5zR2VuID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgbm9uUnBjTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gICAgcHVibGljIE5hbWVzcGFjZUdlbmVyYXRvciBnZXROc0dlbigpIHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKCBuc0dlbiA9PSBudWxsICkgew0KLSAgICAgICAgICAgIG5zR2VuID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuc0dlbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROc0dlbihOYW1lc3BhY2VHZW5lcmF0b3IgbnNHZW4pIHsNCi0gICAgICAgIHRoaXMubnNHZW4gPSBuc0dlbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yKElETCBpZGwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUsIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkNCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRoaXMuaWRsID0gaWRsOw0KLSAgICAgICAgdGhpcy5pbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsNCi0NCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuYW1lc3BhY2VGcm9tTW9kdWxlTmFtZShpbnRlcmZhY2VOYW1lLCBnZXROc0dlbigpKTsNCi0gICAgICAgIGlmIChzdHJpbmdCdWZmZXIubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHN0cmluZ0J1ZmZlci50b1N0cmluZygpOw0KLQ0KLSAgICAgICAgaWYgKHNjaGVtYXRhcmdldE5hbWVzcGFjZSAhPSBudWxsDQotICAgICAgICAgICAgICAgICYmIHNjaGVtYXRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgIT0gMCkgew0KLSAgICAgICAgICAgIHRoaXMuc2NoZW1hVGFyZ2V0TmFtZVNwYWNlID0gc2NoZW1hdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzdHJpbmdCdWZmZXIgPSBuYW1lc3BhY2VGcm9tTW9kdWxlTmFtZShpbnRlcmZhY2VOYW1lLCBnZXROc0dlbigpKTsNCi0gICAgICAgICAgICBpZiAoc3RyaW5nQnVmZmVyLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChTQ0hFTUFfTkFNRVNQQUNFX0VYVE4pOw0KLSAgICAgICAgICAgIHRoaXMuc2NoZW1hVGFyZ2V0TmFtZVNwYWNlID0gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4ICE9IG51bGwNCi0gICAgICAgICAgICAgICAgJiYgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4LnRyaW0oKS5sZW5ndGgoKSAhPSAwKSB7DQotICAgICAgICAgICAgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCA9IHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCA9IEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfTkFNRVNQQUNFX1BSRklYOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tTW9kdWxlTmFtZShTdHJpbmcgaW50ZXJmYWNlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbikgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IG51bGw7DQotICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW50IGkgPSBpbnRlcmZhY2VOYW1lLmxhc3RJbmRleE9mKCI6OiIpOw0KLSAgICAgICAgICAgIGlmIChpID4gMCkNCi0gICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IGludGVyZmFjZU5hbWUuc3Vic3RyaW5nKDAsIGkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1vZHVsZU5hbWU9PW51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gbnNHZW4ubmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKG1vZHVsZU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gbWV0aG9kLiBGaXJzdCBnZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgZGlmZmVyZW50DQotICAgICAqIHBhcmFtZXRlciB0eXBlIGFuZCBsYXRlciByZWZlcnMgdG8gdGhlbS4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBSZXR1cm5zIFhtbFNjaGVtYS4NCi0gICAgICogQHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gaWYgZmFpbGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZW5lcmF0ZVNjaGVtYSgpIHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gew0KLSAgICAgICAgTWFwIGludGVyZmFjZXMgPSBpZGwuZ2V0SW50ZXJmYWNlcygpOw0KLQ0KLSAgICAgICAgaWYgKGludGVyZmFjZXM9PW51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbigiTm8gaW50ZXJmYWNlcyBkZWZpbmVkIik7DQotDQotICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZT09bnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKCJJbnRlcmZhY2UgbmFtZSByZXF1aXJlZCIpOw0KLQ0KLSAgICAgICAgSW50ZXJmYWNlIGludGYgPSAoSW50ZXJmYWNlKSBpbnRlcmZhY2VzLmdldChpbnRlcmZhY2VOYW1lKTsNCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogU2NoZW1hIGdlbmVydGFpb24gZG9uZSBpbiB0d28gc3RhZ2UgMS4gTG9hZCBhbGwgdGhlIG1ldGhvZHMgYW5kDQotICAgICAgICAgKiBjcmVhdGUgdHlwZSBmb3IgbWV0aG9kcyBwYXJhbWV0ZXJzIChpZiB0aGUgcGFyYW1ldGVycyBhcmUgQmVhbnMNCi0gICAgICAgICAqIHRoZW4gaXQgd2lsbCBjcmVhdGUgQ29tcGxleCB0eXBlcyBmb3IgdGhvc2UgLCBhbmQgaWYgdGhlDQotICAgICAgICAgKiBwYXJhbWV0ZXJzIGFyZSBzaW1wbGUgdHlwZSB3aGljaCBkZWNyaWJlIGluIFNpbXBsZVR5cGVUYWJsZQ0KLSAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcw0KLSAgICAgICAgICogbWVzc2FnZXMgYW5kIHBvcnQgdHlwZXMgd2lsbCBiZSBjcmV0ZWF0ZWQNCi0gICAgICAgICAqLw0KLQ0KLSAgICAgICAgaWYgKGludGY9PW51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbigiSW50ZXJmYWNlICIgKyBpbnRlcmZhY2VOYW1lICsgIiBkb2VzIG5vdCBleGlzdHMiKTsNCi0gICAgICAgIE9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPSBpbnRmLmdldE9wZXJhdGlvbnMoKTsNCi0NCi0gICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG92ZXJsb2FkDQotICAgICAgICBIYXNoTWFwIHVuaXF1ZU1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgbWV0aG9kU2NoZW1hVHlwZTsNCi0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlID0gbnVsbDsNCi0gICAgICAgIExpc3QgcHJvY2Vzc2VkRXhzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG9wZXJhdGlvbnNbaV07DQotICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChleGNsdWRlTWV0aG9kcy5jb250YWlucyhvcGVyYXRpb25OYW1lKSkgew0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgaWYgKHVuaXF1ZU1ldGhvZHMuZ2V0KG9wZXJhdGlvbk5hbWUpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAiIFNvcnJ5IHdlIGRvbid0IHN1cHBvcnQgbWV0aG9kcyBvdmVybG9hZGluZyAhISEhICIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmhhc1JhaXNlcygpKSB7DQotICAgICAgICAgICAgICAgIExpc3QgZXh0eXBlcyA9IG9wZXJhdGlvbi5nZXRSYWlzZXMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHR5cGVzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25UeXBlIGV4dHlwZSA9IChFeGNlcHRpb25UeXBlKSBleHR5cGVzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWRFeHMuY29udGFpbnMoZXh0eXBlLmdldE5hbWUoKSkpDQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRFeHMuYWRkKGV4dHlwZS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZSA9IGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KGV4dHlwZS5nZXROYW1lKCkrICJGYXVsdCIpOw0KLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgZXh0eXBlLCBleHR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHVuaXF1ZU1ldGhvZHMucHV0KG9wZXJhdGlvbk5hbWUsIG9wZXJhdGlvbik7DQotICAgICAgICAgICAgLy9jcmVhdGUgdGhlIHNjaGVtYSB0eXBlIGZvciB0aGUgbWV0aG9kIHdyYXBwZXINCi0gICAgICAgICAgICBMaXN0IHBhcmFzID0gb3BlcmF0aW9uLmdldFBhcmFtcygpOw0KLSAgICAgICAgICAgIGlmIChwYXJhcyAhPSBudWxsICYmIHBhcmFzLnNpemUoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsNCi0gICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZSA9IGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KG9wZXJhdGlvbk5hbWUpOw0KLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgTGlzdCBvdXRwYXJhcyA9IG51bGw7DQotICAgICAgICAgICAgaWYgKHBhcmFzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhcy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgTWVtYmVyIHBhcmFtID0gKE1lbWJlcikgcGFyYXMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBwYXJhbS5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSBwYXJhVHlwZSA9IHBhcmFtLmdldERhdGFUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoTWVtYmVyLk1PREVfSU5PVVQuZXF1YWxzKHBhcmFtLmdldE1vZGUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cGFyYXM9PW51bGwpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHBhcmFzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHBhcmFzLmFkZChwYXJhbSk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lbWJlci5NT0RFX09VVC5lcXVhbHMocGFyYW0uZ2V0TW9kZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwYXJhcz09bnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cGFyYXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cGFyYXMuYWRkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmKG5vblJwY01ldGhvZHMuY29udGFpbnMob3BlcmF0aW9uTmFtZSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgbnVsbCwgb3BlcmF0aW9uTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgcGFyYVR5cGUsIHBhcmFtZXRlck5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIERhdGFUeXBlIHJldHVyblR5cGUgPSBvcGVyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmICgocmV0dXJuVHlwZSAhPSBudWxsICYmICFDb3JiYVV0aWwuZ2V0UXVhbGlmaWVkTmFtZShyZXR1cm5UeXBlKS5lcXVhbHMoVk9JRCkpIHx8IG91dHBhcmFzIT1udWxsKSB7DQotICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUgPSBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChvcGVyYXRpb25OYW1lICsgUkVTUE9OU0UpOw0KLSAgICAgICAgICAgICAgICBzZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOw0KLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gbnVsbCAmJiAhQ29yYmFVdGlsLmdldFF1YWxpZmllZE5hbWUocmV0dXJuVHlwZSkuZXF1YWxzKFZPSUQpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuTmFtZSA9InJldHVybiI7DQotICAgICAgICAgICAgICAgICAgICBpZihub25ScGNNZXRob2RzLmNvbnRhaW5zKG9wZXJhdGlvbk5hbWUpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG51bGwsIHJldHVybk5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIHJldHVyblR5cGUsIHJldHVybk5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChvdXRwYXJhcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG91dHBhcmFzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyIHBhcmFtID0gKE1lbWJlcikgb3V0cGFyYXMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gcGFyYW0uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlIHBhcmFUeXBlID0gcGFyYW0uZ2V0RGF0YVR5cGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihub25ScGNNZXRob2RzLmNvbnRhaW5zKG9wZXJhdGlvbk5hbWUpKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBudWxsLCBvcGVyYXRpb25OYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBwYXJhVHlwZSwgcGFyYW1ldGVyTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLyp9IGVsc2Ugew0KLSAgICAgICAgLy9nZW5lcmF0ZSB0aGUgc2NoZW1hIHR5cGUgZm9yIGV4dHJhIGNsYXNzZXMNCi0gICAgICAgIGV4dHJhU2NoZW1hVHlwZU5hbWUgPSB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoZ2V0UXVhbGlmaWVkTmFtZShqY2xhc3MpKTsNCi0gICAgICAgIGlmIChleHRyYVNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYShqY2xhc3MpOw0KLSAgICAgICAgfSovDQotICAgICAgICByZXR1cm4gc2NoZW1hTWFwLnZhbHVlcygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBKQU0gY29udmVydCBmaXJzdCBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBpbnRvIFVwcGVyQ2FzZSBhcyBhbiBleGFtcGxlIGlmIHRoZXJlIGlzIGEgaW5zdGFuY2UNCi0gICAgICogdmFyaWFibGUgY2FsbGVkIGZvbyBpbiBhIGJlYW4gLCB0aGVuIEphbSBnaXZlIHRoYXQgYXMgRm9vIHNvIHRoaXMgbWV0aG9kIGlzIHRvIGNvcnJlY3QgdGhhdA0KLSAgICAgKiBlcnJvcg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gd3JvbmdOYW1lIHdyb25nIG5hbWUNCi0gICAgICogQHJldHVybiB0aGUgcmlnaHQgbmFtZSwgdXNpbmcgZW5nbGlzaCBhcyB0aGUgbG9jYWxlIGZvciBjYXNlIGNvbnZlcnNpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3ROYW1lKFN0cmluZyB3cm9uZ05hbWUpIHsNCi0gICAgICAgIGlmICh3cm9uZ05hbWUubGVuZ3RoKCkgPiAxKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdyb25nTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpDQotICAgICAgICAgICAgICAgICAgICArIHdyb25nTmFtZS5zdWJzdHJpbmcoMSwgd3JvbmdOYW1lLmxlbmd0aCgpKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIHdyb25nTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZW5lcmF0ZSBzY2hlbWEgY29uc3RydWN0IGZvciBnaXZlbiB0eXBlDQotICAgICAqDQotICAgICAqIEBwYXJhbSBkYXRhVHlwZSBvYmplY3QNCi0gICAgICogQHJldHVybiBRbmFtZQ0KLSAgICAgKiBAdGhyb3dzIFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbiBpZiBmYWlscw0KLSAgICAgKi8NCi0gICAgLy9wcml2YXRlIFFOYW1lIGdlbmVyYXRlU2NoZW1hKEpDbGFzcyBkYXRhVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgIHByaXZhdGUgUU5hbWUgZ2VuZXJhdGVTY2hlbWEoQ29tcG9zaXRlRGF0YVR5cGUgZGF0YVR5cGUpIHRocm93cyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBDb3JiYVV0aWwuZ2V0UXVhbGlmaWVkTmFtZShkYXRhVHlwZSk7DQotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShuYW1lKTsNCi0gICAgICAgIGlmIChzY2hlbWFUeXBlTmFtZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUgPSAgZ2V0U2ltcGxlTmFtZShkYXRhVHlwZSk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0TW9kdWxlTmFtZShkYXRhVHlwZSk7DQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVTcGFjZSA9IHJlc29sdmVTY2hlbWFOYW1lc3BhY2UocGFja2FnZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEodGFyZ2V0TmFtZVNwYWNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gKFN0cmluZykgdGFyZ2V0TmFtZXNwYWNlUHJlZml4TWFwLmdldCh0YXJnZXROYW1lU3BhY2UpOw0KLSAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID0gbmV3IFFOYW1lKHRhcmdldE5hbWVTcGFjZSwgc2ltcGxlTmFtZSwgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KTsNCi0NCi0gICAgICAgICAgICBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBFbnVtVHlwZSkgew0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSBuZXcgWG1sU2NoZW1hU2ltcGxlVHlwZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb24gcmVzdHJpY3Rpb24gPSBuZXcgWG1sU2NoZW1hU2ltcGxlVHlwZVJlc3RyaWN0aW9uKCk7DQotICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLnNldEJhc2VUeXBlTmFtZSh0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoImphdmEubGFuZy5TdHJpbmciKSk7DQotICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0Q29udGVudChyZXN0cmljdGlvbik7DQotICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUuc2V0TmFtZShzaW1wbGVOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBmYWNldHMgPSByZXN0cmljdGlvbi5nZXRGYWNldHMoKTsNCi0gICAgICAgICAgICAgICAgRW51bVR5cGUgZW51bVR5cGUgPSAoRW51bVR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgICAgICAgICBMaXN0IGVudW1NZW1iZXJzID0gZW51bVR5cGUuZ2V0RW51bU1lbWJlcnMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtTWVtYmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgZmFjZXRzLmFkZChuZXcgWG1sU2NoZW1hRW51bWVyYXRpb25GYWNldChlbnVtTWVtYmVycy5nZXQoaSksIGZhbHNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHRPdXRlciA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgIGVsdE91dGVyLnNldE5hbWUoc2ltcGxlTmFtZSk7DQotICAgICAgICAgICAgICAgIGVsdE91dGVyLnNldFFOYW1lKHNjaGVtYVR5cGVOYW1lKTsNCi0NCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGVsdE91dGVyKTsNCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBlbHRPdXRlcik7DQotICAgICAgICAgICAgICAgIGVsdE91dGVyLnNldFNjaGVtYVR5cGVOYW1lKHNpbXBsZVR5cGUuZ2V0UU5hbWUoKSk7DQotDQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChzaW1wbGVUeXBlKTsNCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBzaW1wbGVUeXBlKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRoaXMgdHlwZSB0byB0aGUgdGFibGUNCi0gICAgICAgICAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobmFtZSwgZWx0T3V0ZXIuZ2V0UU5hbWUoKSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIFVuaW9uVHlwZSkgew0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDaG9pY2UgY2hvaWNlID0gbmV3IFhtbFNjaGVtYUNob2ljZSgpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGl0ZW1zID0gY2hvaWNlLmdldEl0ZW1zKCk7DQotDQotICAgICAgICAgICAgICAgIFVuaW9uVHlwZSB1bmlvblR5cGUgPSAoVW5pb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IHVuaW9uVHlwZS5nZXRNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgaXRlbXMuYWRkKGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsIG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc1tpXS5nZXROYW1lKCksIHRydWUpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZS5zZXRQYXJ0aWNsZShjaG9pY2UpOw0KLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZS5zZXROYW1lKHNpbXBsZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsdE91dGVyID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0TmFtZShzaW1wbGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0UU5hbWUoc2NoZW1hVHlwZU5hbWUpOw0KLQ0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZWx0T3V0ZXIpOw0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoc2NoZW1hVHlwZU5hbWUsIGVsdE91dGVyKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0U2NoZW1hVHlwZU5hbWUoY29tcGxleFR5cGUuZ2V0UU5hbWUoKSk7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChjb21wbGV4VHlwZSk7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZChzY2hlbWFUeXBlTmFtZSwgY29tcGxleFR5cGUpOw0KLQ0KLSAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShuYW1lLCBlbHRPdXRlci5nZXRRTmFtZSgpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsdE91dGVyID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0TmFtZShzaW1wbGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgZWx0T3V0ZXIuc2V0UU5hbWUoc2NoZW1hVHlwZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBjb21wbGV4VHlwZS5zZXRQYXJ0aWNsZShzZXF1ZW5jZSk7DQotICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldE5hbWUoc2ltcGxlTmFtZSk7DQotDQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChlbHRPdXRlcik7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRFbGVtZW50cygpLmFkZChzY2hlbWFUeXBlTmFtZSwgZWx0T3V0ZXIpOw0KLSAgICAgICAgICAgICAgICBlbHRPdXRlci5zZXRTY2hlbWFUeXBlTmFtZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGNvbXBsZXhUeXBlKTsNCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBjb21wbGV4VHlwZSk7DQotDQotICAgICAgICAgICAgICAgIC8vIGFkZGluZyB0aGlzIHR5cGUgdG8gdGhlIHRhYmxlDQotICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5hZGRDb21wbGV4U2NoZW1hKG5hbWUsIGVsdE91dGVyLmdldFFOYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBUeXBlZGVmKSB7DQotICAgICAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSAoVHlwZWRlZikgZGF0YVR5cGU7DQotICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSBhbGlhc1R5cGUgPSB0eXBlZGVmLmdldERhdGFUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZChnZW5lcmF0ZVNjaGVtYWZvckZpZWxkc2FuZFByb3BlcnRpZXMoeG1sU2NoZW1hLCBhbGlhc1R5cGUsICJpdGVtIiwgZmFsc2UpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vU2V0IHByb3BlcnRpZXNOYW1lcyA9IG5ldyBIYXNoU2V0KCkgOw0KLSAgICAgICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGRhdGFUeXBlLmdldE1lbWJlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBtZW1iZXJzW2ldOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBtZW1iZXIuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlIHByb3BlcnR5VHlwZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU3RyaW5nIHByb3BuYW1lID0gZ2V0Q29ycmVjdE5hbWUocHJvcGVydHkuZ2V0U2ltcGxlTmFtZSgpKSA7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm9wZXJ0aWVzTmFtZXMuYWRkKHByb3BlcnR5TmFtZSkgOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLmdldEl0ZW1zKCkuYWRkKGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsIHByb3BlcnR5VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwgZmFsc2UpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLyBtb3ZlZCBjb2RlIGNvbW1vbiB0byBGaWVsZHMgJiBwcm9wZXJ0aWVzIG91dCBvZiBhYm92ZSBtZXRob2QNCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFFbGVtZW50IGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyhYbWxTY2hlbWEgeG1sU2NoZW1hLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlIHR5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gZm9yY2VOb3ROaWxsYWJsZSkgdGhyb3dzIFNjaGVtYUdlbmVyYXRvckV4Y2VwdGlvbiB7DQotICAgICAgICBib29sZWFuIGlzQXJyeVR5cGUgPSBmYWxzZTsNCi0gICAgICAgIGxvbmcgbWF4T2NjdXJzID0gMDsNCi0gICAgICAgIGxvbmcgbWluT2NjdXJzID0gMDsNCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgew0KLSAgICAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICB0eXBlID0gY29sbGVjdGlvblR5cGUuZ2V0RGF0YVR5cGUoKTsNCi0gICAgICAgICAgICBpc0FycnlUeXBlID0gdHJ1ZTsNCi0gICAgICAgICAgICBpbnQgZWxlbWVudENvdW50ID0gY29sbGVjdGlvblR5cGUuZ2V0RWxlbWVudENvdW50KCk7DQotICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb25UeXBlLmlzQXJyYXkoKSkgew0KLSAgICAgICAgICAgICAgICBtaW5PY2N1cnMgPSBtYXhPY2N1cnMgPSBlbGVtZW50Q291bnQ7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xsZWN0aW9uVHlwZS5pc1NlcXVlbmNlKCkpIHsNCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzID0gMDsNCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzID0gKGVsZW1lbnRDb3VudCA9PSAwKSA/IExvbmcuTUFYX1ZBTFVFIDogZWxlbWVudENvdW50Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIHsNCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjaGlsZCA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSB0eXBlOw0KLSAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSBuZXcgVHlwZWRlZigpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldERhdGFUeXBlKHR5cGUpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE1vZHVsZShjaGlsZC5nZXRFbGVtZW50TW9kdWxlKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE5hbWUoIl8iICsgKGNoaWxkLmdldERlcHRoKCkgLSAxKSArICJfIiArIGNoaWxkLmdldEVsZW1lbnROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlID0gdHlwZWRlZjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcHJvcGVydHlUeXBlTmFtZSA9IENvcmJhVXRpbC5nZXRRdWFsaWZpZWROYW1lKHR5cGUpOw0KLQ0KLSAgICAgICAgaWYoaXNBcnJ5VHlwZSYmImJ5dGUiLmVxdWFscyhwcm9wZXJ0eVR5cGVOYW1lKSl7DQotICAgICAgICAgICAgcHJvcGVydHlUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHQxID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsNCi0gICAgICAgIGVsdDEuc2V0TmFtZShuYW1lKTsNCi0NCi0gICAgICAgIGlmIChpc0FycnlUeXBlICYmICghcHJvcGVydHlUeXBlTmFtZS5lcXVhbHMoImJhc2U2NEJpbmFyeSIpKSl7DQotICAgICAgICAgICAgZWx0MS5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsNCi0gICAgICAgICAgICBlbHQxLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYoaXNOaWxsYWJsZSh0eXBlKSAmJiAhZm9yY2VOb3ROaWxsYWJsZSkNCi0gICAgICAgICAgICBlbHQxLnNldE5pbGxhYmxlKHRydWUpIDsNCi0NCi0gICAgICAgIGlmICh0eXBlVGFibGUuaXNTaW1wbGVUeXBlKHByb3BlcnR5VHlwZU5hbWUpKSB7DQotICAgICAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZSh0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUocHJvcGVydHlUeXBlTmFtZSkpOw0KLQ0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYSgoQ29tcG9zaXRlRGF0YVR5cGUpIHR5cGUpOw0KLSAgICAgICAgICAgIGVsdDEuc2V0U2NoZW1hVHlwZU5hbWUodHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKHByb3BlcnR5VHlwZU5hbWUpKTsNCi0NCi0gICAgICAgICAgICBpZiAoISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4NCi0gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zKHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eVR5cGVOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7DQotICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0TmFtZXNwYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eVR5cGVOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSk7DQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChpbXBvcnRFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgKChOYW1lc3BhY2VNYXApIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCkpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dChnZW5lcmF0ZVByZWZpeCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKHByb3BlcnR5VHlwZU5hbWUpLmdldE5hbWVzcGFjZVVSSSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHR5cGU6IiArIHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGVsdDE7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTmlsbGFibGUoRGF0YVR5cGUgdHlwZSkgew0KLSAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDb21wb3NpdGVEYXRhVHlwZSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUHJpbWl0aXZlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBQcmltaXRpdmVEYXRhVHlwZSBwcmltaXRpdmVEYXRhVHlwZSA9IChQcmltaXRpdmVEYXRhVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICBpZiAocHJpbWl0aXZlRGF0YVR5cGUuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5TdHJpbmciKSkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSBRTmFtZSBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UsIERhdGFUeXBlIHR5cGUsIFN0cmluZyBwYXJ0TmFtZSkNCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNBcnJheVR5cGUgPSBmYWxzZTsNCi0gICAgICAgIGlmKHR5cGUhPW51bGwpew0KLSAgICAgICAgICAgIGlzQXJyYXlUeXBlID0gKHR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzQXJyYXlUeXBlKSB7DQotICAgICAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZSA9IChBcnJheVR5cGUpIHR5cGU7DQotICAgICAgICAgICAgdHlwZSA9IGFycmF5VHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIGNsYXNzVHlwZU5hbWU7DQotICAgICAgICBpZih0eXBlPT1udWxsKXsNCi0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gImphdmEubGFuZy5PYmplY3QiOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gQ29yYmFVdGlsLmdldFF1YWxpZmllZE5hbWUodHlwZSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgew0KLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSAiYmFzZTY0QmluYXJ5IjsNCi0gICAgICAgICAgICBpc0FycmF5VHlwZSA9IGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSl7DQotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUgPSB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoY2xhc3NUeXBlTmFtZSk7DQotICAgICAgICBpZiAoc2NoZW1hVHlwZU5hbWUgPT0gbnVsbCAmJiB0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSA9IGdlbmVyYXRlU2NoZW1hKChDb21wb3NpdGVEYXRhVHlwZSkgdHlwZSk7DQotICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwNCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsDQotICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7DQotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWVzcGFjZTsNCi0gICAgICAgICAgICBzY2hlbWFOYW1lc3BhY2UgPSByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKGdldE1vZHVsZU5hbWUodHlwZSkpOw0KLSAgICAgICAgICAgIGFkZEltcG9ydChnZXRYbWxTY2hlbWEoc2NoZW1hTmFtZXNwYWNlKSwgc2NoZW1hVHlwZU5hbWUpOw0KLQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSwNCi0gICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5KSB7DQotICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsdDEgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOw0KLSAgICAgICAgZWx0MS5zZXROYW1lKHBhcmFOYW1lKTsNCi0gICAgICAgIGVsdDEuc2V0U2NoZW1hVHlwZU5hbWUoc2NoZW1hVHlwZU5hbWUpOw0KLSAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoZWx0MSk7DQotDQotICAgICAgICBpZiAoaXNBcnJheSkgew0KLSAgICAgICAgICAgIGVsdDEuc2V0TWF4T2NjdXJzKExvbmcuTUFYX1ZBTFVFKTsNCi0gICAgICAgICAgICBlbHQxLnNldE1pbk9jY3VycygxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsdDEuc2V0TmlsbGFibGUodHJ1ZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFDb21wbGV4VHlwZSBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChTdHJpbmcgbG9jYWxQYXJ0TmFtZSkgew0KLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpOw0KLSAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQ0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUodGhpcy5zY2hlbWFUYXJnZXROYW1lU3BhY2UsIGxvY2FsUGFydE5hbWUsIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOw0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsNCi0NCi0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZ2xvYmFsRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7DQotICAgICAgICBnbG9iYWxFbGVtZW50LnNldFNjaGVtYVR5cGUoY29tcGxleFR5cGUpOw0KLSAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXROYW1lKGxvY2FsUGFydE5hbWUpOw0KLSAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXRRTmFtZShlbGVtZW50TmFtZSk7DQotICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZ2xvYmFsRWxlbWVudCk7DQotICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoZWxlbWVudE5hbWUsIGdsb2JhbEVsZW1lbnQpOw0KLQ0KLSAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobG9jYWxQYXJ0TmFtZSwgZWxlbWVudE5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgWG1sU2NoZW1hIGdldFhtbFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7DQotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hOw0KLQ0KLSAgICAgICAgaWYgKCh4bWxTY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSkpID09IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4Ow0KLQ0KLSAgICAgICAgICAgIGlmICggdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhzY2hlbWFUYXJnZXROYW1lU3BhY2UpICYmDQotICAgICAgICAgICAgICAgICAgICBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCAhPSBudWxsICkgew0KLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBnZW5lcmF0ZVByZWZpeCgpOw0KLSAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICB4bWxTY2hlbWEgPSBuZXcgWG1sU2NoZW1hKHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hQ29sbGVjdGlvbik7DQotICAgICAgICAgICAgeG1sU2NoZW1hLnNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KGdldEF0dHJGb3JtRGVmYXVsdFNldHRpbmcoKSk7DQotICAgICAgICAgICAgeG1sU2NoZW1hLnNldEVsZW1lbnRGb3JtRGVmYXVsdChnZXRFbGVtZW50Rm9ybURlZmF1bHRTZXR0aW5nKCkpOw0KLQ0KLQ0KLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOw0KLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWEpOw0KLQ0KLSAgICAgICAgICAgIE5hbWVzcGFjZU1hcCBwcmVmaXhtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7DQotICAgICAgICAgICAgcHJlZml4bWFwLnB1dChERUZBVUxUX1NDSEVNQV9OQU1FU1BBQ0VfUFJFRklYLCBVUklfMjAwMV9TQ0hFTUFfWFNEKTsNCi0gICAgICAgICAgICBwcmVmaXhtYXAucHV0KHRhcmdldE5hbWVzcGFjZVByZWZpeCwgdGFyZ2V0TmFtZXNwYWNlKTsNCi0gICAgICAgICAgICB4bWxTY2hlbWEuc2V0TmFtZXNwYWNlQ29udGV4dChwcmVmaXhtYXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZVRhYmxlIGdldFR5cGVUYWJsZSgpIHsNCi0gICAgICAgIHJldHVybiB0eXBlVGFibGU7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVQcmVmaXgoKSB7DQotICAgICAgICByZXR1cm4gTkFNRV9TUEFDRV9QUkVGSVggKyBwcmVmaXhDb3VudCsrOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVNZXRob2RzKEFycmF5TGlzdCBleGNsdWRlTWV0aG9kcykgew0KLSAgICAgICAgaWYgKGV4Y2x1ZGVNZXRob2RzID09IG51bGwpIGV4Y2x1ZGVNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgdGhpcy5leGNsdWRlTWV0aG9kcyA9IGV4Y2x1ZGVNZXRob2RzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZVNwYWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHNjaGVtYVRhcmdldE5hbWVTcGFjZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkSW1wb3J0KFhtbFNjaGVtYSB4bWxTY2hlbWEsIFFOYW1lIHNjaGVtYVR5cGVOYW1lKSB7DQotICAgICAgICBpZiAoISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4NCi0gICAgICAgICAgICAgICAgY29udGFpbnMoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7DQotICAgICAgICAgICAgaW1wb3J0RWxlbWVudC5zZXROYW1lc3BhY2Uoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChpbXBvcnRFbGVtZW50KTsNCi0gICAgICAgICAgICAoKE5hbWVzcGFjZU1hcCkgeG1sU2NoZW1hLmdldE5hbWVzcGFjZUNvbnRleHQoKSkuDQotICAgICAgICAgICAgICAgICAgICBwdXQoZ2VuZXJhdGVQcmVmaXgoKSwgc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1EZWZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIGF0dHJGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyRm9ybURlZmF1bHQoU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCkgew0KLSAgICAgICAgdGhpcy5hdHRyRm9ybURlZmF1bHQgPSBhdHRyRm9ybURlZmF1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7DQotICAgICAgICByZXR1cm4gZWxlbWVudEZvcm1EZWZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRGb3JtRGVmYXVsdChTdHJpbmcgZWxlbWVudEZvcm1EZWZhdWx0KSB7DQotICAgICAgICB0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUZvcm0gZ2V0QXR0ckZvcm1EZWZhdWx0U2V0dGluZygpIHsNCi0gICAgICAgIGlmIChGT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQuZXF1YWxzKGdldEF0dHJGb3JtRGVmYXVsdCgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2NoZW1hRm9ybShYbWxTY2hlbWFGb3JtLlVOUVVBTElGSUVEKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTY2hlbWFGb3JtKFhtbFNjaGVtYUZvcm0uUVVBTElGSUVEKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUZvcm0gZ2V0RWxlbWVudEZvcm1EZWZhdWx0U2V0dGluZygpIHsNCi0gICAgICAgIGlmIChGT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQuZXF1YWxzKGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sU2NoZW1hRm9ybShYbWxTY2hlbWFGb3JtLlVOUVVBTElGSUVEKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxTY2hlbWFGb3JtKFhtbFNjaGVtYUZvcm0uUVVBTElGSUVEKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEV4dHJhQ2xhc3NlcygpIHsNCi0gICAgICAgIGlmIChleHRyYUNsYXNzZXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGV4dHJhQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBleHRyYUNsYXNzZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc2VzKEFycmF5TGlzdCBleHRyYUNsYXNzZXMpIHsNCi0gICAgICAgIHRoaXMuZXh0cmFDbGFzc2VzID0gZXh0cmFDbGFzc2VzOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVTY2hlbWFOYW1lc3BhY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmICh1c2VXU0RMVHlwZXNOYW1lc3BhY2UpIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcGtnMm5zbWFwLmdldCgiYWxsIik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChwa2cybnNtYXAgIT0gbnVsbCAmJiAhcGtnMm5zbWFwLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAvL2lmIHR5cGVzIHNob3VsZCBnbyBpbnRvIG5hbWVzcGFjZXMgdGhhdCBhcmUgbWFwcGVkIGFnYWluc3QgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIHR5cGUNCi0gICAgICAgICAgICAgICAgaWYgKHBrZzJuc21hcC5nZXQocGFja2FnZU5hbWUpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoYXQgbWFwcGluZw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHBrZzJuc21hcC5nZXQocGFja2FnZU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE5zR2VuKCkuc2NoZW1hTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gaWYgIHBrZzJuc21hcCBpcyBudWxsIGFuZCBpZiBub3QgZGVmYXVsdCBzY2hlbWEgbnMgZm91bmQgZm9yIHRoZSBjdXN0b20gYmVhbg0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TnNHZW4oKS5zY2hlbWFOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUpLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlV1NETFR5cGVzTmFtZXNwYWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHVzZVdTRExUeXBlc05hbWVzcGFjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VXU0RMVHlwZXNOYW1lc3BhY2UoYm9vbGVhbiB1c2VXU0RMVHlwZXNOYW1lc3BhY2UpIHsNCi0gICAgICAgIHRoaXMudXNlV1NETFR5cGVzTmFtZXNwYWNlID0gdXNlV1NETFR5cGVzTmFtZXNwYWNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0UGtnMm5zbWFwKCkgew0KLSAgICAgICAgcmV0dXJuIHBrZzJuc21hcDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQa2cybnNtYXAoTWFwIHBrZzJuc21hcCkgew0KLSAgICAgICAgdGhpcy5wa2cybnNtYXAgPSBwa2cybnNtYXA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2ltcGxlTmFtZShEYXRhVHlwZSB0eXBlKXsNCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBDb21wb3NpdGVEYXRhVHlwZSBjb21wb3NpdGVUeXBlID0gKENvbXBvc2l0ZURhdGFUeXBlKSB0eXBlOw0KLSAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGVUeXBlLmdldE5hbWUoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIENvcmJhVXRpbC5nZXRRdWFsaWZpZWROYW1lKHR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5vblJwY01ldGhvZHMoQXJyYXlMaXN0IG5vblJwY01ldGhvZHMpIHsNCi0gICAgICAgIGlmKG5vblJwY01ldGhvZHMhPW51bGwpew0KLSAgICAgICAgICAgIHRoaXMubm9uUnBjTWV0aG9kcyA9IG5vblJwY01ldGhvZHM7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kdWxlTmFtZShEYXRhVHlwZSB0eXBlKSB7DQotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENvbXBvc2l0ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgQ29tcG9zaXRlRGF0YVR5cGUgY29tcG9zaXRlVHlwZSA9IChDb21wb3NpdGVEYXRhVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gY29tcG9zaXRlVHlwZS5nZXRNb2R1bGUoKTsNCi0gICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGUucmVwbGFjZUFsbCgiOjoiLCAiLiIpOw0KLSAgICAgICAgICAgIGlmIChtb2R1bGUuZW5kc1dpdGgoIi4iKSkgew0KLSAgICAgICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3Vic3RyaW5nKDAsIG1vZHVsZS5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbW9kdWxlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTcwMzJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvQ29yYmFFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9uczsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gew0KLSAgICBwdWJsaWMgQ29yYmFFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb3JiYUV4Y2VwdGlvbigpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvcmJhRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29yYmFFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihjYXVzZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUludm9jYXRpb25FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzAzNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9Db3JiYUludm9jYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9uczsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gew0KLSAgICBwdWJsaWMgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCkgew0KLQkgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSURMUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9leGNlcHRpb25zL0lETFByb2Nlc3NvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk4ZDUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSURMUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnM7DQotDQotcHVibGljIGNsYXNzIElETFByb2Nlc3NvckV4Y2VwdGlvbiBleHRlbmRzIENvcmJhRXhjZXB0aW9uIHsNCi0gICAgcHVibGljIElETFByb2Nlc3NvckV4Y2VwdGlvbigpIHsNCi0JICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElETFByb2Nlc3NvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElETFByb2Nlc3NvckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKGNhdXNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSURMUHJvY2Vzc29yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9leGNlcHRpb25zL0ludmFsaWRJRExFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSW52YWxpZElETEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGE2NjUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvSW52YWxpZElETEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBJbnZhbGlkSURMRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gewotICAgIHB1YmxpYyBJbnZhbGlkSURMRXhjZXB0aW9uKCkgewotCSAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZhbGlkSURMRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZhbGlkSURMRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEludmFsaWRJRExFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9QcmVQcm9jZXNzb3JFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvUHJlUHJvY2Vzc29yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTE4YTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9QcmVQcm9jZXNzb3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zOwotCi1wdWJsaWMgY2xhc3MgUHJlUHJvY2Vzc29yRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gewotCi0gICAgcHVibGljIFByZVByb2Nlc3NvckV4Y2VwdGlvbihTdHJpbmcgc3RyaW5nLCBFeGNlcHRpb24gZSkgewotICAgICAgICBzdXBlcihzdHJpbmcsIGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oU3RyaW5nIHN0cmluZykgewotICAgICAgICBzdXBlcihzdHJpbmcpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9TY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2V4Y2VwdGlvbnMvU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYTkxNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvZXhjZXB0aW9ucy9TY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9uczsNCi0NCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uIGV4dGVuZHMgQ29yYmFFeGNlcHRpb24gew0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKCkgew0KLQkgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdG9yRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIoY2F1c2UpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTY2hlbWFHZW5lcmF0b3JFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC9JRExQcm9jZXNzb3IuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC9JRExQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlOTIyYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvSURMUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbDsNCi0NCi1pbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuSURMUHJvY2Vzc29yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC5wYXJzZXIuSURMTGV4ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlci5JRExQYXJzZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlci5JRExWaXNpdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIElETFByb2Nlc3NvciB7DQotDQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBzdHJlYW07DQotDQotICAgIHB1YmxpYyBJRExQcm9jZXNzb3IoSW5wdXRTdHJlYW0gc3RyZWFtKSB7DQotICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSURMIHByb2Nlc3MoKSB0aHJvd3MgSURMUHJvY2Vzc29yRXhjZXB0aW9uIHsNCi0gICAgICAgIElETCBpZGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElETFBhcnNlciBwYXJzZXIgPSBuZXcgSURMUGFyc2VyKG5ldyBJRExMZXhlcihzdHJlYW0pKTsNCi0gICAgICAgICAgICBwYXJzZXIuc3BlY2lmaWNhdGlvbigpOw0KLSAgICAgICAgICAgIEFTVCBpZGxUcmVlID0gcGFyc2VyLmdldEFTVCgpOw0KLQ0KLSAgICAgICAgICAgIC8vIG5ldyBEdW1wQVNUVmlzaXRvcigpLnZpc2l0KGlkbFRyZWUpOyAvLyBwcmludCB0aGUgQVNUIHN0cnVjdHVyZQ0KLQ0KLSAgICAgICAgICAgIElETFZpc2l0b3IgdmlzaXRvciA9IG5ldyBJRExWaXNpdG9yKCk7DQotICAgICAgICAgICAgdmlzaXRvci52aXNpdChpZGxUcmVlKTsNCi0gICAgICAgICAgICBpZGwgPSB2aXNpdG9yLmdldElETCgpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElETFByb2Nlc3NvckV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpZGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL1ByZVByb2Nlc3NvcklucHV0U3RyZWFtLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViMjJkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zLlByZVByb2Nlc3NvckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBNQVhfREVQVEggPSA5OTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSB1c2VySW5jbHVkZVBhdGhzOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzeXN0ZW1JbmNsdWRlUGF0aHM7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RmlsZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudFBhdGg7Ci0gICAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBpZGxDb250ZW50OwotICAgIHByb3RlY3RlZCBpbnQgY29udGVudExlbmd0aDsKLSAgICBwcm90ZWN0ZWQgaW50IGxhc3RSZWFkID0gMDsKLQotICAgIHB1YmxpYyBQcmVQcm9jZXNzb3JJbnB1dFN0cmVhbShTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIGlkbEZpbGVuYW1lKQotICAgICAgICAgICAgdGhyb3dzIFByZVByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMocGFyZW50UGF0aCwgaWRsRmlsZW5hbWUsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFN0cmluZ1tdIHt9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0oU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyBpZGxGaWxlbmFtZSwKLSAgICAgICAgICAgIFN0cmluZ1tdIHVzZXJJbmNsdWRlUGF0aHMsIFN0cmluZ1tdIHN5c3RlbUluY2x1ZGVQYXRocykKLSAgICAgICAgICAgIHRocm93cyBQcmVQcm9jZXNzb3JFeGNlcHRpb24gewotICAgICAgICB0aGlzLnVzZXJJbmNsdWRlUGF0aHMgPSB1c2VySW5jbHVkZVBhdGhzOwotICAgICAgICB0aGlzLnN5c3RlbUluY2x1ZGVQYXRocyA9IHN5c3RlbUluY2x1ZGVQYXRoczsKLSAgICAgICAgdGhpcy5wYXJlbnRQYXRoID0gcGFyZW50UGF0aDsKLSAgICAgICAgdGhpcy5jdXJyZW50RmlsZSA9IHBhcmVudFBhdGggKyBGaWxlLnNlcGFyYXRvciArIGlkbEZpbGVuYW1lOwotICAgICAgICBJbnB1dFN0cmVhbSBpZGxTdHJlYW0gPSBnZXRJbnB1dFN0cmVhbShwYXJlbnRQYXRoLCBpZGxGaWxlbmFtZSk7Ci0gICAgICAgIGlmIChpZGxGaWxlbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICArIHBhcmVudFBhdGggKyBGaWxlLnNlcGFyYXRvciArIGlkbEZpbGVuYW1lKTsKLQotICAgICAgICBpZGxDb250ZW50ID0gcmVhZElkbChpZGxTdHJlYW0sIDApOwotICAgICAgICBjb250ZW50TGVuZ3RoID0gaWRsQ29udGVudC5sZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHJlYWRJZGwoSW5wdXRTdHJlYW0gaWRsU3RyZWFtLCBpbnQgZGVwdGgpCi0gICAgICAgICAgICB0aHJvd3MgUHJlUHJvY2Vzc29yRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgTGluZU51bWJlclJlYWRlciBsaW5lTnVtYmVyUmVhZGVyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoCi0gICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKGlkbFN0cmVhbSkpOwotICAgICAgICBsaW5lTnVtYmVyUmVhZGVyLnNldExpbmVOdW1iZXIoMSk7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICBNYXAgZGVmcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFN0YWNrIGlmZGVmVmFsdWUgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgYm9vbGVhbiB2YWxpZExpbmUgPSB0cnVlOwotICAgICAgICBib29sZWFuIGVsc2VOb3RWYWxpZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgbGFzdExpbmUgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZU51bWJlclJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oIkVycm9yIHdoaWxlIHJlYWRpbmcgbmV4dCBsaW5lIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRMaW5lTm9TdHJpbmcobGluZU51bWJlclJlYWRlciksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxhc3RMaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGFzdExpbmUgKyAiICIgKyBsaW5lOwotICAgICAgICAgICAgICAgIGxhc3RMaW5lID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFpZmRlZlZhbHVlLmVtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgISgoQm9vbGVhbikgaWZkZWZWYWx1ZS5wZWVrKCkpLmJvb2xlYW5WYWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSAmJiBsaW5lLmVuZHNXaXRoKCJcXCIpKSB7Ci0gICAgICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxhc3RJbmRleE9mKCJcXCIpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjaW5jbHVkZSIpICYmIHZhbGlkTGluZSkgewotICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8IE1BWF9ERVBUSCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5jID0gbGluZS5yZXBsYWNlQWxsKCIjaW5jbHVkZSIsICIiKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5jaXMgPSByZXNvbHZlSW5jbHVkZShpbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGluZU5vU3RyaW5nKGxpbmVOdW1iZXJSZWFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChyZWFkSWRsKGluY2lzLCBkZXB0aCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29tbWVudChidWZmZXIsICJlbmQgb2YgIiArIGxpbmUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oIk1vcmUgdGhhbiAiICsgTUFYX0RFUFRICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5lc3RlZCAjaW5jbHVkZXMgYXJlIG5vdCBhbGxvd2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TGluZU5vU3RyaW5nKGxpbmVOdW1iZXJSZWFkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI2RlZmluZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRlZiA9IGxpbmUucmVwbGFjZUFsbCgiI2RlZmluZSIsICIiKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZGVmID0gZGVmLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRlZiwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rLmNvdW50VG9rZW5zKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBkZWYgPSB0b2submV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWZzLmNvbnRhaW5zS2V5KGRlZikpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJlUHJvY2Vzc29yRXhjZXB0aW9uKCJWYXJpYWJsZSAiICsgZGVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBhbHJlYWR5IGRlZmluZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TGluZU5vU3RyaW5nKGxpbmVOdW1iZXJSZWFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVmcy5wdXQoZGVmLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvay5jb3VudFRva2VucygpID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVmcy5wdXQodG9rLm5leHRUb2tlbigpLCB0b2submV4dFRva2VuKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRDb21tZW50KGJ1ZmZlciwgbGluZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI3VuZGVmIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmID0gbGluZS5yZXBsYWNlQWxsKCIjdW5kZWYiLCAiIikudHJpbSgpOwotICAgICAgICAgICAgICAgIGRlZiA9IGRlZi5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcy5jb250YWluc0tleShkZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZnMucmVtb3ZlKGRlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5kaWZpbmVkIHZhcmlhYmxlICIgKyBkZWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjaWZkZWYiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkZWYgPSBsaW5lLnJlcGxhY2VBbGwoIiNpZmRlZiIsICIiKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZGVmID0gZGVmLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICAgICAgICAgIGlmIChkZWZzLmNvbnRhaW5zS2V5KGRlZikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWZkZWZWYWx1ZS5wdXNoKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRMaW5lID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmZGVmVmFsdWUucHVzaChCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZU5vdFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYWRkQ29tbWVudChidWZmZXIsIGxpbmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNpZm5kZWYiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkZWYgPSBsaW5lLnJlcGxhY2VBbGwoIiNpZm5kZWYiLCAiIikudHJpbSgpOwotICAgICAgICAgICAgICAgIGRlZiA9IGRlZi5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcy5jb250YWluc0tleShkZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkTGluZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZmRlZlZhbHVlLnB1c2goQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWZkZWZWYWx1ZS5wdXNoKEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2VOb3RWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjZWxzZSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsc2VOb3RWYWxpZCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiSW52YWxpZCAjZWxzZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIiArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGludmVydCBsYXN0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBib29sZWFuIGxhc3R2YWwgPSAoKEJvb2xlYW4pIGlmZGVmVmFsdWUucGVlaygpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZmRlZlZhbHVlLnNldEVsZW1lbnRBdChuZXcgQm9vbGVhbighbGFzdHZhbCksIGlmZGVmVmFsdWUuc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgdmFsaWRMaW5lID0gaXNBbGxUcnVlKGlmZGVmVmFsdWUpOwotICAgICAgICAgICAgICAgIGVsc2VOb3RWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYWRkQ29tbWVudChidWZmZXIsIGxpbmUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNlbmRpZiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlmZGVmVmFsdWUuZW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiSW52YWxpZCAjZW5kaWYgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSIgKyBnZXRMaW5lTm9TdHJpbmcobGluZU51bWJlclJlYWRlcikpOwotICAgICAgICAgICAgICAgIGlmZGVmVmFsdWUucG9wKCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRMaW5lID0gaXNBbGxUcnVlKGlmZGVmVmFsdWUpOwotICAgICAgICAgICAgICAgIGVsc2VOb3RWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGFkZENvbW1lbnQoYnVmZmVyLCBsaW5lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBsb2cKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiSWdub3JpbmcgdW5zdXBwb3J0ZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluZSArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkTGluZSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlmZGVmVmFsdWUuZW1wdHkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk9uZSBvciBtb3JlICNpZmRlZi8jaWZuZGVmIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFyZSBub3QgcHJvcGVybHkgY2xvc2VkIiArIGdldExpbmVOb1N0cmluZyhsaW5lTnVtYmVyUmVhZGVyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbGluZU51bWJlclJlYWRlci5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHJlc29sdmVJbmNsdWRlKFN0cmluZyBpbmNsdWRlLCBTdHJpbmcgbGluZU5vU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIFByZVByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGluY0ZpbGU7Ci0gICAgICAgICAgICBpZiAoaW5jbHVkZS5zdGFydHNXaXRoKCJcIiIpICYmIGluY2x1ZGUuc3RhcnRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBpbmNsdWRlLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZShpbmNsdWRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5jRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IGluY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGluY0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IGdldElucHV0U3RyZWFtKHBhcmVudFBhdGgsIGluY2x1ZGUpOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXNlckluY2x1ZGVQYXRocy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAodXNlckluY2x1ZGVQYXRoc1tpXS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZSh1c2VySW5jbHVkZVBhdGhzW2ldICsgaW5jbHVkZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmNGaWxlID0gbmV3IEZpbGUodXNlckluY2x1ZGVQYXRoc1tpXSArIEZpbGUuc2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5jbHVkZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluY0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWxlID0gaW5jRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKGluY0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgaW5jbHVkZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGluY2x1ZGUgKyBsaW5lTm9TdHJpbmcpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGUuc3RhcnRzV2l0aCgiPCIpICYmIGluY2x1ZGUuc3RhcnRzV2l0aCgiPiIpKSB7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZSA9IGluY2x1ZGUucmVwbGFjZUFsbCgiPCIsICIiKTsKLSAgICAgICAgICAgICAgICBpbmNsdWRlID0gaW5jbHVkZS5yZXBsYWNlQWxsKCI+IiwgIiIpOwotCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeXN0ZW1JbmNsdWRlUGF0aHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN5c3RlbUluY2x1ZGVQYXRoc1tpXS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZShzeXN0ZW1JbmNsdWRlUGF0aHNbaV0gKyBpbmNsdWRlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY0ZpbGUgPSBuZXcgRmlsZShzeXN0ZW1JbmNsdWRlUGF0aHNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIGluY2x1ZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmlsZSA9IGluY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShpbmNGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJlUHJvY2Vzc29yRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzb2x2ZSBpbmNsdWRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaW5jbHVkZSArIGxpbmVOb1N0cmluZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcmVQcm9jZXNzb3JFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiSW5jbHVkZSBuYW1lIG11c3QgYmUgZW5jbG9zZWQgaW4gJzwgPicgb3IgJ1wiIFwiJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lTm9TdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgaW5jbHVkZSAiCi0gICAgICAgICAgICAgICAgICAgICsgaW5jbHVkZSArIGxpbmVOb1N0cmluZywgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIHBhcmVudCwgU3RyaW5nIGZpbGVuYW1lKQotICAgICAgICAgICAgdGhyb3dzIFByZVByb2Nlc3NvckV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgcGFyZW50RmlsZSA9IG5ldyBGaWxlKHBhcmVudCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFyZW50ICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RmlsZSkpOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGZpbGVuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHppbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByZVByb2Nlc3NvckV4Y2VwdGlvbigiVW5hYmxlIHRvIHByZS1wcm9jZXNzIGZpbGUgIiArIHBhcmVudAotICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWUsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsVHJ1ZShTdGFjayBzdGFjaykgewotICAgICAgICBpZiAoc3RhY2suZW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3RhY2suaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1lbnQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgiLyogIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobGluZSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAqL1xuIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGluZU5vU3RyaW5nKExpbmVOdW1iZXJSZWFkZXIgbGluZU51bWJlclJlYWRlcikgewotICAgICAgICBpZiAobGluZU51bWJlclJlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGluZU5vID0gbGluZU51bWJlclJlYWRlci5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICBpZiAobGluZU5vID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiIChmaWxlOiIgKyBjdXJyZW50RmlsZSArICIsIGxpbmU6IiArIChsaW5lTm8gLSAxKSArICIpIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChjb250ZW50TGVuZ3RoID4gbGFzdFJlYWQpID8gaWRsQ29udGVudC5jaGFyQXQobGFzdFJlYWQrKykgOiAtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETExleGVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETExleGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOWYzYTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExMZXhlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy8gJEFOVExSIDIuNy42ICgyMDA1LTEyLTIyKTogIm9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLmciIC0+ICJJRExMZXhlci5qYXZhIiQNCi0NCi0gIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwucGFyc2VyOw0KLQ0KLWltcG9ydCBhbnRsci5BTlRMUkhhc2hTdHJpbmc7DQotaW1wb3J0IGFudGxyLkJ5dGVCdWZmZXI7DQotaW1wb3J0IGFudGxyLkNoYXJCdWZmZXI7DQotaW1wb3J0IGFudGxyLkNoYXJTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGFudGxyLkNoYXJTdHJlYW1JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuSW5wdXRCdWZmZXI7DQotaW1wb3J0IGFudGxyLkxleGVyU2hhcmVkSW5wdXRTdGF0ZTsNCi1pbXBvcnQgYW50bHIuTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uOw0KLWltcG9ydCBhbnRsci5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuVG9rZW47DQotaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtOw0KLWltcG9ydCBhbnRsci5Ub2tlblN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuVG9rZW5TdHJlYW1SZWNvZ25pdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuaW1wbC5CaXRTZXQ7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLQ0KLXB1YmxpYyBjbGFzcyBJRExMZXhlciBleHRlbmRzIGFudGxyLkNoYXJTY2FubmVyIGltcGxlbWVudHMgSURMVG9rZW5UeXBlcywgVG9rZW5TdHJlYW0NCi0gew0KLXB1YmxpYyBJRExMZXhlcihJbnB1dFN0cmVhbSBpbikgew0KLQl0aGlzKG5ldyBCeXRlQnVmZmVyKGluKSk7DQotfQ0KLXB1YmxpYyBJRExMZXhlcihSZWFkZXIgaW4pIHsNCi0JdGhpcyhuZXcgQ2hhckJ1ZmZlcihpbikpOw0KLX0NCi1wdWJsaWMgSURMTGV4ZXIoSW5wdXRCdWZmZXIgaWIpIHsNCi0JdGhpcyhuZXcgTGV4ZXJTaGFyZWRJbnB1dFN0YXRlKGliKSk7DQotfQ0KLXB1YmxpYyBJRExMZXhlcihMZXhlclNoYXJlZElucHV0U3RhdGUgc3RhdGUpIHsNCi0Jc3VwZXIoc3RhdGUpOw0KLQljYXNlU2Vuc2l0aXZlTGl0ZXJhbHMgPSB0cnVlOw0KLQlzZXRDYXNlU2Vuc2l0aXZlKHRydWUpOw0KLQlsaXRlcmFscyA9IG5ldyBIYXNodGFibGUoKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN3aXRjaCIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHlwZXByZWZpeCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3OSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY2FzZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig1OCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiZmluZGVyIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDk0KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJtYW5hZ2VzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkyKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbnRlcmZhY2UiLCB0aGlzKSwgbmV3IEludGVnZXIoNykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicHJvdmlkZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoODUpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImV4Y2VwdGlvbiIsIHRoaXMpLCBuZXcgSW50ZWdlcig2OCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicHJpbWFyeWtleSIsIHRoaXMpLCBuZXcgSW50ZWdlcig5MykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygic2VxdWVuY2UiLCB0aGlzKSwgbmV3IEludGVnZXIoNjEpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInVzZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoODYpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImNvbnN1bWVzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ2b2lkIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDcwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJmYWN0b3J5IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDIzKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbXBvcnQiLCB0aGlzKSwgbmV3IEludGVnZXIoNzcpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImZsb2F0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ0KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJwdWJsaXNoZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoODkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInByaXZhdGUiLCB0aGlzKSwgbmV3IEludGVnZXIoMjIpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImJvb2xlYW4iLCB0aGlzKSwgbmV3IEludGVnZXIoNTEpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN0cmluZyIsIHRoaXMpLCBuZXcgSW50ZWdlcig2NCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiZ2V0cmFpc2VzIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDgyKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJlbWl0cyIsIHRoaXMpLCBuZXcgSW50ZWdlcig4OCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY3VzdG9tIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDgpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImNvbXBvbmVudCIsIHRoaXMpLCBuZXcgSW50ZWdlcig4NCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY29udGV4dCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3NCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygib2N0ZXQiLCB0aGlzKSwgbmV3IEludGVnZXIoNTIpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm9uZXdheSIsIHRoaXMpLCBuZXcgSW50ZWdlcig2OSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygibG9uZyIsIHRoaXMpLCBuZXcgSW50ZWdlcig0NikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiVmFsdWVCYXNlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDc2KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJpbiIsIHRoaXMpLCBuZXcgSW50ZWdlcigyNikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHJ1bmNhdGFibGUiLCB0aGlzKSwgbmV3IEludGVnZXIoMTkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIkZBTFNFIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJyZWFkb25seSIsIHRoaXMpLCBuZXcgSW50ZWdlcig4MCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHlwZWRlZiIsIHRoaXMpLCBuZXcgSW50ZWdlcig0MikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygic3VwcG9ydHMiLCB0aGlzKSwgbmV3IEludGVnZXIoMjApKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInNob3J0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ3KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJUUlVFIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJmaXhlZCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3NSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiT2JqZWN0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDU0KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJlbnVtIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDYwKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJob21lIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJtdWx0aXBsZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig4NykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiYXR0cmlidXRlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDgxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJjaGFyIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDQ5KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ1bmlvbiIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygibG9jYWwiLCB0aGlzKSwgbmV3IEludGVnZXIoNikpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiY29uc3QiLCB0aGlzKSwgbmV3IEludGVnZXIoMjcpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInNldHJhaXNlcyIsIHRoaXMpLCBuZXcgSW50ZWdlcig4MykpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiYWJzdHJhY3QiLCB0aGlzKSwgbmV3IEludGVnZXIoNSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidmFsdWV0eXBlIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImlub3V0IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDcyKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJyYWlzZXMiLCB0aGlzKSwgbmV3IEludGVnZXIoNzMpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm91dCIsIHRoaXMpLCBuZXcgSW50ZWdlcig3MSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidHlwZWlkIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDc4KSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJ3Y2hhciIsIHRoaXMpLCBuZXcgSW50ZWdlcig1MCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygiYW55IiwgdGhpcyksIG5ldyBJbnRlZ2VyKDUzKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJkb3VibGUiLCB0aGlzKSwgbmV3IEludGVnZXIoNDUpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImRlZmF1bHQiLCB0aGlzKSwgbmV3IEludGVnZXIoNTkpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoImV2ZW50dHlwZSIsIHRoaXMpLCBuZXcgSW50ZWdlcigxMCkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygid3N0cmluZyIsIHRoaXMpLCBuZXcgSW50ZWdlcig2NSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygidW5zaWduZWQiLCB0aGlzKSwgbmV3IEludGVnZXIoNDgpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoInN0cnVjdCIsIHRoaXMpLCBuZXcgSW50ZWdlcig1NSkpOw0KLQlsaXRlcmFscy5wdXQobmV3IEFOVExSSGFzaFN0cmluZygicHVibGljIiwgdGhpcyksIG5ldyBJbnRlZ2VyKDIxKSk7DQotCWxpdGVyYWxzLnB1dChuZXcgQU5UTFJIYXNoU3RyaW5nKCJtb2R1bGUiLCB0aGlzKSwgbmV3IEludGVnZXIoMTEpKTsNCi0JbGl0ZXJhbHMucHV0KG5ldyBBTlRMUkhhc2hTdHJpbmcoIm5hdGl2ZSIsIHRoaXMpLCBuZXcgSW50ZWdlcig0MykpOw0KLX0NCi0NCi1wdWJsaWMgVG9rZW4gbmV4dFRva2VuKCkgdGhyb3dzIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JVG9rZW4gdGhlUmV0VG9rZW49bnVsbDsNCi10cnlBZ2FpbjoNCi0JZm9yICg7Oykgew0KLQkJVG9rZW4gX3Rva2VuID0gbnVsbDsNCi0JCWludCBfdHR5cGUgPSBUb2tlbi5JTlZBTElEX1RZUEU7DQotCQlyZXNldFRleHQoKTsNCi0JCXRyeSB7ICAgLy8gZm9yIGNoYXIgc3RyZWFtIGVycm9yIGhhbmRsaW5nDQotCQkJdHJ5IHsgICAvLyBmb3IgbGV4aWNhbCBlcnJvciBoYW5kbGluZw0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlICc7JzoNCi0JCQkJew0KLQkJCQkJbVNFTUkodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICc/JzoNCi0JCQkJew0KLQkJCQkJbVFVRVNUSU9OKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnKCc6DQotCQkJCXsNCi0JCQkJCW1MUEFSRU4odHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICcpJzoNCi0JCQkJew0KLQkJCQkJbVJQQVJFTih0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ1snOg0KLQkJCQl7DQotCQkJCQltTEJSQUNLKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnXSc6DQotCQkJCXsNCi0JCQkJCW1SQlJBQ0sodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICd7JzoNCi0JCQkJew0KLQkJCQkJbUxDVVJMWSh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ30nOg0KLQkJCQl7DQotCQkJCQltUkNVUkxZKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnfCc6DQotCQkJCXsNCi0JCQkJCW1PUih0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ14nOg0KLQkJCQl7DQotCQkJCQltWE9SKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnJic6DQotCQkJCXsNCi0JCQkJCW1BTkQodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICcsJzoNCi0JCQkJew0KLQkJCQkJbUNPTU1BKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnPSc6DQotCQkJCXsNCi0JCQkJCW1BU1NJR04odHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICchJzoNCi0JCQkJew0KLQkJCQkJbU5PVCh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJysnOg0KLQkJCQl7DQotCQkJCQltUExVUyh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJy0nOg0KLQkJCQl7DQotCQkJCQltTUlOVVModHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICd+JzoNCi0JCQkJew0KLQkJCQkJbVRJTERFKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnKic6DQotCQkJCXsNCi0JCQkJCW1TVEFSKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnJSc6DQotCQkJCXsNCi0JCQkJCW1NT0QodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICdcdCc6ICBjYXNlICdcbic6ICBjYXNlICdccic6ICBjYXNlICcgJzoNCi0JCQkJew0KLQkJCQkJbVdTKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnIyc6DQotCQkJCXsNCi0JCQkJCW1QUkVQUk9DX0RJUkVDVElWRSh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ1wnJzoNCi0JCQkJew0KLQkJCQkJbUNIQVJfTElURVJBTCh0cnVlKTsNCi0JCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJyInOg0KLQkJCQl7DQotCQkJCQltU1RSSU5HX0xJVEVSQUwodHJ1ZSk7DQotCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQljYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6ICBjYXNlICc0JzoNCi0JCQkJY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOiAgY2FzZSAnOCc6DQotCQkJCWNhc2UgJzknOg0KLQkJCQl7DQotCQkJCQltSU5UKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnXyc6DQotCQkJCXsNCi0JCQkJCW1FU0NBUEVEX0lERU5UKHRydWUpOw0KLQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJZGVmYXVsdDoNCi0JCQkJCWlmICgoTEEoMSk9PSc8JykgJiYgKExBKDIpPT0nPCcpKSB7DQotCQkJCQkJbUxTSElGVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSc+JykgJiYgKExBKDIpPT0nPicpKSB7DQotCQkJCQkJbVJTSElGVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSc6JykgJiYgKExBKDIpPT0nOicpKSB7DQotCQkJCQkJbVNDT1BFT1AodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLycpICYmIChMQSgyKT09Jy8nKSkgew0KLQkJCQkJCW1TTF9DT01NRU5UKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09Jy8nKSAmJiAoTEEoMik9PScqJykpIHsNCi0JCQkJCQltTUxfQ09NTUVOVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSdMJykgJiYgKExBKDIpPT0nXCcnKSkgew0KLQkJCQkJCW1XSURFX0NIQVJfTElURVJBTCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSdMJykgJiYgKExBKDIpPT0nIicpKSB7DQotCQkJCQkJbVdJREVfU1RSSU5HX0xJVEVSQUwodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nMCcpICYmIChMQSgyKT09J1gnfHxMQSgyKT09J3gnKSkgew0KLQkJCQkJCW1IRVgodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLicpICYmICgoTEEoMikgPj0gJzAnICYmIExBKDIpIDw9ICc5JykpKSB7DQotCQkJCQkJbUZMT0FUKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09JzonKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCQltQ09MT04odHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nLicpICYmICh0cnVlKSkgew0KLQkJCQkJCW1ET1QodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT0nPCcpICYmICh0cnVlKSkgew0KLQkJCQkJCW1MVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCQllbHNlIGlmICgoTEEoMSk9PSc+JykgJiYgKHRydWUpKSB7DQotCQkJCQkJbUdUKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09Jy8nKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCQltRElWKHRydWUpOw0KLQkJCQkJCXRoZVJldFRva2VuPV9yZXR1cm5Ub2tlbjsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKChMQSgxKT09JzAnKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCQltT0NUQUwodHJ1ZSk7DQotCQkJCQkJdGhlUmV0VG9rZW49X3JldHVyblRva2VuOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKF90b2tlblNldF8wLm1lbWJlcihMQSgxKSkpICYmICh0cnVlKSkgew0KLQkJCQkJCW1JREVOVCh0cnVlKTsNCi0JCQkJCQl0aGVSZXRUb2tlbj1fcmV0dXJuVG9rZW47DQotCQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKExBKDEpPT1FT0ZfQ0hBUikge3Vwb25FT0YoKTsgX3JldHVyblRva2VuID0gbWFrZVRva2VuKFRva2VuLkVPRl9UWVBFKTt9DQotCQkJCWVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpO30NCi0JCQkJfQ0KLQkJCQl9DQotCQkJCWlmICggX3JldHVyblRva2VuPT1udWxsICkgY29udGludWUgdHJ5QWdhaW47IC8vIGZvdW5kIFNLSVAgdG9rZW4NCi0JCQkJX3R0eXBlID0gX3JldHVyblRva2VuLmdldFR5cGUoKTsNCi0JCQkJX3R0eXBlID0gdGVzdExpdGVyYWxzVGFibGUoX3R0eXBlKTsNCi0JCQkJX3JldHVyblRva2VuLnNldFR5cGUoX3R0eXBlKTsNCi0JCQkJcmV0dXJuIF9yZXR1cm5Ub2tlbjsNCi0JCQl9DQotCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtUmVjb2duaXRpb25FeGNlcHRpb24oZSk7DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKENoYXJTdHJlYW1FeGNlcHRpb24gY3NlKSB7DQotCQkJaWYgKCBjc2UgaW5zdGFuY2VvZiBDaGFyU3RyZWFtSU9FeGNlcHRpb24gKSB7DQotCQkJCXRocm93IG5ldyBUb2tlblN0cmVhbUlPRXhjZXB0aW9uKCgoQ2hhclN0cmVhbUlPRXhjZXB0aW9uKWNzZSkuaW8pOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IFRva2VuU3RyZWFtRXhjZXB0aW9uKGNzZS5nZXRNZXNzYWdlKCkpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgbVNFTUkoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFNFTUk7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJzsnKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1RVUVTVElPTihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gUVVFU1RJT047DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJz8nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1MUEFSRU4oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IExQQVJFTjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnKCcpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbVJQQVJFTihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gUlBBUkVOOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcpJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTEJSQUNLKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBMQlJBQ0s7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJ1snKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1SQlJBQ0soYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFJCUkFDSzsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnXScpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUxDVVJMWShib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTENVUkxZOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCd7Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtUkNVUkxZKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBSQ1VSTFk7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJ30nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1PUihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gT1I7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJ3wnKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1YT1IoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFhPUjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnXicpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUFORChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gQU5EOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcmJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtQ09MT04oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IENPTE9OOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCc6Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtQ09NTUEoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IENPTU1BOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcsJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtRE9UKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBET1Q7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJy4nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1BU1NJR04oYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEFTU0lHTjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnPScpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbU5PVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTk9UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCchJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTFQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IExUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCc8Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTFNISUZUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBMU0hJRlQ7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goIjw8Iik7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtR1QoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEdUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCc+Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtUlNISUZUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBSU0hJRlQ7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goIj4+Iik7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtRElWKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBESVY7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJy8nKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1QTFVTKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBQTFVTOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCcrJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTUlOVVMoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IE1JTlVTOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCctJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtVElMREUoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFRJTERFOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCd+Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtU1RBUihib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gU1RBUjsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnKicpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbU1PRChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTU9EOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCclJyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtU0NPUEVPUChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gU0NPUEVPUDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgiOjoiKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1XUyhib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gV1M7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJew0KLQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCWNhc2UgJyAnOg0KLQkJew0KLQkJCW1hdGNoKCcgJyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdcdCc6DQotCQl7DQotCQkJbWF0Y2goJ1x0Jyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdcbic6DQotCQl7DQotCQkJbWF0Y2goJ1xuJyk7DQotCQkJbmV3bGluZSgpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnXHInOg0KLQkJew0KLQkJCW1hdGNoKCdccicpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJZGVmYXVsdDoNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCX0NCi0JCX0NCi0JCX0NCi0JCV90dHlwZSA9IFRva2VuLlNLSVA7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtUFJFUFJPQ19ESVJFQ1RJVkUoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFBSRVBST0NfRElSRUNUSVZFOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCcjJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCXsNCi0JCV9sb29wMzIyOg0KLQkJZG8gew0KLQkJCWlmICgoX3Rva2VuU2V0XzEubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJbWF0Y2hOb3QoJ1xuJyk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDMyMjsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdcbicpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtU0xfQ09NTUVOVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gU0xfQ09NTUVOVDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgiLy8iKTsNCi0JCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJew0KLQkJX2xvb3AzMjU6DQotCQlkbyB7DQotCQkJaWYgKChfdG9rZW5TZXRfMS5tZW1iZXIoTEEoMSkpKSkgew0KLQkJCQltYXRjaE5vdCgnXG4nKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWJyZWFrIF9sb29wMzI1Ow0KLQkJCX0NCi0JCQkNCi0JCX0gd2hpbGUgKHRydWUpOw0KLQkJfQ0KLQkJbWF0Y2goJ1xuJyk7DQotCQlfdHR5cGUgPSBUb2tlbi5TS0lQOyBuZXdsaW5lKCk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtTUxfQ09NTUVOVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTUxfQ09NTUVOVDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgiLyoiKTsNCi0JCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJew0KLQkJX2xvb3AzMzM6DQotCQlkbyB7DQotCQkJaWYgKChMQSgxKT09JyonKSAmJiAoX3Rva2VuU2V0XzIubWVtYmVyKExBKDIpKSkpIHsNCi0JCQkJew0KLQkJCQlpbnQgX2NudDMyOT0wOw0KLQkJCQlfbG9vcDMyOToNCi0JCQkJZG8gew0KLQkJCQkJaWYgKChMQSgxKT09JyonKSkgew0KLQkJCQkJCW1hdGNoKCcqJyk7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlpZiAoIF9jbnQzMjk+PTEgKSB7IGJyZWFrIF9sb29wMzI5OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpO30NCi0JCQkJCX0NCi0JCQkJCQ0KLQkJCQkJX2NudDMyOSsrOw0KLQkJCQl9IHdoaWxlICh0cnVlKTsNCi0JCQkJfQ0KLQkJCQl7DQotCQkJCWlmICgoTEEoMSk9PSdcbicpKSB7DQotCQkJCQltYXRjaCgnXG4nKTsNCi0JCQkJCW5ld2xpbmUoKTsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoX3Rva2VuU2V0XzMubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCXsNCi0JCQkJCW1hdGNoKF90b2tlblNldF8zKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09J1xuJykpIHsNCi0JCQkJbWF0Y2goJ1xuJyk7DQotCQkJCW5ld2xpbmUoKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKF90b2tlblNldF80Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCXsNCi0JCQkJbWF0Y2goX3Rva2VuU2V0XzQpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDMzMzsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCIqLyIpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQlfdHR5cGUgPSBUb2tlbi5TS0lQOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUNIQVJfTElURVJBTChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gQ0hBUl9MSVRFUkFMOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdcJycpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQl7DQotCQlpZiAoKExBKDEpPT0nXFwnKSkgew0KLQkJCW1FU0MoZmFsc2UpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoKF90b2tlblNldF81Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJbWF0Y2hOb3QoJ1wnJyk7DQotCQl9DQotCQllbHNlIHsNCi0JCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCX0NCi0JCQ0KLQkJfQ0KLQkJX3NhdmVJbmRleD10ZXh0Lmxlbmd0aCgpOw0KLQkJbWF0Y2goJ1wnJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIG1FU0MoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEVTQzsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgnXFwnKTsNCi0JCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJew0KLQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCWNhc2UgJ24nOg0KLQkJew0KLQkJCW1hdGNoKCduJyk7DQotCQkJdGV4dC5zZXRMZW5ndGgoX2JlZ2luKTsgdGV4dC5hcHBlbmQoIlxuIik7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICd0JzoNCi0JCXsNCi0JCQltYXRjaCgndCcpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcdCIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAndic6DQotCQl7DQotCQkJbWF0Y2goJ3YnKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiXDAxMyIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnYic6DQotCQl7DQotCQkJbWF0Y2goJ2InKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiXGIiKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgJ3InOg0KLQkJew0KLQkJCW1hdGNoKCdyJyk7DQotCQkJdGV4dC5zZXRMZW5ndGgoX2JlZ2luKTsgdGV4dC5hcHBlbmQoIlxyIik7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdmJzoNCi0JCXsNCi0JCQltYXRjaCgnZicpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcciIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnYSc6DQotCQl7DQotCQkJbWF0Y2goJ2EnKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiXDAwNyIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnXFwnOg0KLQkJew0KLQkJCW1hdGNoKCdcXCcpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcXCIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnPyc6DQotCQl7DQotCQkJbWF0Y2goJz8nKTsNCi0JCQl0ZXh0LnNldExlbmd0aChfYmVnaW4pOyB0ZXh0LmFwcGVuZCgiPyIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnXCcnOg0KLQkJew0KLQkJCW1hdGNoKCdcJycpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCInIik7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICciJzoNCi0JCXsNCi0JCQltYXRjaCgnIicpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKCJcIiIpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQljYXNlICc0JzogIGNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzoNCi0JCXsNCi0JCQltT0NURElHSVQoZmFsc2UpOw0KLQkJCXsNCi0JCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzcnKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJbU9DVERJR0lUKGZhbHNlKTsNCi0JCQkJew0KLQkJCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzcnKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCW1PQ1RESUdJVChmYWxzZSk7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoKChMQSgxKSA+PSAnXHUwMDAwJyAmJiBMQSgxKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkgJiYgKHRydWUpKSB7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJfQ0KLQkJCX0NCi0JCQllbHNlIGlmICgoKExBKDEpID49ICdcdTAwMDAnICYmIExBKDEpIDw9ICdcdWZmZmUnKSkgJiYgKHRydWUpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCX0NCi0JCQkNCi0JCQl9DQotCQkJY2hhciByZWFsYyA9IChjaGFyKSBJbnRlZ2VyLnZhbHVlT2YobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLF9iZWdpbix0ZXh0Lmxlbmd0aCgpLV9iZWdpbiksIDgpLmludFZhbHVlKCk7IHRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKHJlYWxjKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgJ3gnOg0KLQkJew0KLQkJCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCQltYXRjaCgneCcpOw0KLQkJCXRleHQuc2V0TGVuZ3RoKF9zYXZlSW5kZXgpOw0KLQkJCW1IRVhESUdJVChmYWxzZSk7DQotCQkJew0KLQkJCWlmICgoX3Rva2VuU2V0XzYubWVtYmVyKExBKDEpKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJbUhFWERJR0lUKGZhbHNlKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKChMQSgxKSA+PSAnXHUwMDAwJyAmJiBMQSgxKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkgJiYgKHRydWUpKSB7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQl9DQotCQkJDQotCQkJfQ0KLQkJCWNoYXIgcmVhbGMgPSAoY2hhcikgSW50ZWdlci52YWx1ZU9mKG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSxfYmVnaW4sdGV4dC5sZW5ndGgoKS1fYmVnaW4pLCAxNikuaW50VmFsdWUoKTsgdGV4dC5zZXRMZW5ndGgoX2JlZ2luKTsgdGV4dC5hcHBlbmQocmVhbGMpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAndSc6DQotCQl7DQotCQkJX3NhdmVJbmRleD10ZXh0Lmxlbmd0aCgpOw0KLQkJCW1hdGNoKCd1Jyk7DQotCQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQkJbUhFWERJR0lUKGZhbHNlKTsNCi0JCQl7DQotCQkJaWYgKChfdG9rZW5TZXRfNi5tZW1iZXIoTEEoMSkpKSAmJiAoKExBKDIpID49ICdcdTAwMDAnICYmIExBKDIpIDw9ICdcdWZmZmUnKSkgJiYgKHRydWUpICYmICh0cnVlKSkgew0KLQkJCQltSEVYRElHSVQoZmFsc2UpOw0KLQkJCQl7DQotCQkJCWlmICgoX3Rva2VuU2V0XzYubWVtYmVyKExBKDEpKSkgJiYgKChMQSgyKSA+PSAnXHUwMDAwJyAmJiBMQSgyKSA8PSAnXHVmZmZlJykpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJCW1IRVhESUdJVChmYWxzZSk7DQotCQkJCQl7DQotCQkJCQlpZiAoKF90b2tlblNldF82Lm1lbWJlcihMQSgxKSkpICYmICgoTEEoMikgPj0gJ1x1MDAwMCcgJiYgTEEoMikgPD0gJ1x1ZmZmZScpKSAmJiAodHJ1ZSkgJiYgKHRydWUpKSB7DQotCQkJCQkJbUhFWERJR0lUKGZhbHNlKTsNCi0JCQkJCX0NCi0JCQkJCWVsc2UgaWYgKCgoTEEoMSkgPj0gJ1x1MDAwMCcgJiYgTEEoMSkgPD0gJ1x1ZmZmZScpKSAmJiAodHJ1ZSkgJiYgKHRydWUpICYmICh0cnVlKSkgew0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoKExBKDEpID49ICdcdTAwMDAnICYmIExBKDEpIDw9ICdcdWZmZmUnKSkgJiYgKHRydWUpICYmICh0cnVlKSAmJiAodHJ1ZSkpIHsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2UgaWYgKCgoTEEoMSkgPj0gJ1x1MDAwMCcgJiYgTEEoMSkgPD0gJ1x1ZmZmZScpKSAmJiAodHJ1ZSkgJiYgKHRydWUpICYmICh0cnVlKSkgew0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCQ0KLQkJCX0NCi0JCQljaGFyIHJlYWxjID0gKGNoYXIpIEludGVnZXIudmFsdWVPZihuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksX2JlZ2luLHRleHQubGVuZ3RoKCktX2JlZ2luKSwgMTYpLmludFZhbHVlKCk7IHRleHQuc2V0TGVuZ3RoKF9iZWdpbik7IHRleHQuYXBwZW5kKHJlYWxjKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWRlZmF1bHQ6DQotCQl7DQotCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQl9DQotCQl9DQotCQl9DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtV0lERV9DSEFSX0xJVEVSQUwoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFdJREVfQ0hBUl9MSVRFUkFMOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdMJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCW1DSEFSX0xJVEVSQUwoZmFsc2UpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbVNUUklOR19MSVRFUkFMKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBTVFJJTkdfTElURVJBTDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQlfc2F2ZUluZGV4PXRleHQubGVuZ3RoKCk7DQotCQltYXRjaCgnIicpOw0KLQkJdGV4dC5zZXRMZW5ndGgoX3NhdmVJbmRleCk7DQotCQl7DQotCQlfbG9vcDMzOToNCi0JCWRvIHsNCi0JCQlpZiAoKExBKDEpPT0nXFwnKSkgew0KLQkJCQltRVNDKGZhbHNlKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKF90b2tlblNldF83Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCW1hdGNoTm90KCciJyk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDMzOTsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCciJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1XSURFX1NUUklOR19MSVRFUkFMKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBXSURFX1NUUklOR19MSVRFUkFMOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCV9zYXZlSW5kZXg9dGV4dC5sZW5ndGgoKTsNCi0JCW1hdGNoKCdMJyk7DQotCQl0ZXh0LnNldExlbmd0aChfc2F2ZUluZGV4KTsNCi0JCW1TVFJJTkdfTElURVJBTChmYWxzZSk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtT0NURElHSVQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IE9DVERJR0lUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoUmFuZ2UoJzAnLCc3Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtSEVYRElHSVQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IEhFWERJR0lUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzoNCi0JCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOg0KLQkJY2FzZSAnOCc6ICBjYXNlICc5JzoNCi0JCXsNCi0JCQltYXRjaFJhbmdlKCcwJywnOScpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6DQotCQljYXNlICdlJzogIGNhc2UgJ2YnOg0KLQkJew0KLQkJCW1hdGNoUmFuZ2UoJ2EnLCdmJyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoNCi0JCWNhc2UgJ0UnOiAgY2FzZSAnRic6DQotCQl7DQotCQkJbWF0Y2hSYW5nZSgnQScsJ0YnKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWRlZmF1bHQ6DQotCQl7DQotCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQl9DQotCQl9DQotCQl9DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBtVk9DQUIoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IFZPQ0FCOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoUmFuZ2UoJ1wzJywnXDM3NycpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbURJR0lUKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBESUdJVDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaFJhbmdlKCcwJywnOScpOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgbU5PTlpFUk9ESUdJVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gTk9OWkVST0RJR0lUOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoUmFuZ2UoJzEnLCc5Jyk7DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtSEVYKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBIRVg7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJew0KLQkJaWYgKChMQSgxKT09JzAnKSAmJiAoTEEoMik9PSd4JykpIHsNCi0JCQltYXRjaCgiMHgiKTsNCi0JCX0NCi0JCWVsc2UgaWYgKChMQSgxKT09JzAnKSAmJiAoTEEoMik9PSdYJykpIHsNCi0JCQltYXRjaCgiMFgiKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJfQ0KLQkJDQotCQl9DQotCQl7DQotCQlpbnQgX2NudDM1OD0wOw0KLQkJX2xvb3AzNTg6DQotCQlkbyB7DQotCQkJaWYgKChfdG9rZW5TZXRfNi5tZW1iZXIoTEEoMSkpKSkgew0KLQkJCQltSEVYRElHSVQoZmFsc2UpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJaWYgKCBfY250MzU4Pj0xICkgeyBicmVhayBfbG9vcDM1ODsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTt9DQotCQkJfQ0KLQkJCQ0KLQkJCV9jbnQzNTgrKzsNCi0JCX0gd2hpbGUgKHRydWUpOw0KLQkJfQ0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbUlOVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gSU5UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1OT05aRVJPRElHSVQoZmFsc2UpOw0KLQkJew0KLQkJX2xvb3AzNjE6DQotCQlkbyB7DQotCQkJaWYgKCgoTEEoMSkgPj0gJzAnICYmIExBKDEpIDw9ICc5JykpKSB7DQotCQkJCW1ESUdJVChmYWxzZSk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlicmVhayBfbG9vcDM2MTsNCi0JCQl9DQotCQkJDQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICcuJzoNCi0JCXsNCi0JCQltYXRjaCgnLicpOw0KLQkJCXsNCi0JCQlfbG9vcDM2NDoNCi0JCQlkbyB7DQotCQkJCWlmICgoKExBKDEpID49ICcwJyAmJiBMQSgxKSA8PSAnOScpKSkgew0KLQkJCQkJbURJR0lUKGZhbHNlKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMzY0Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdFJzogIGNhc2UgJ2UnOg0KLQkJCXsNCi0JCQkJew0KLQkJCQl7DQotCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCWNhc2UgJ2UnOg0KLQkJCQl7DQotCQkJCQltYXRjaCgnZScpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnRSc6DQotCQkJCXsNCi0JCQkJCW1hdGNoKCdFJyk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlkZWZhdWx0Og0KLQkJCQl7DQotCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQkJfQ0KLQkJCQl9DQotCQkJCX0NCi0JCQkJew0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlICcrJzoNCi0JCQkJew0KLQkJCQkJbWF0Y2goJysnKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJy0nOg0KLQkJCQl7DQotCQkJCQltYXRjaCgnLScpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQkJCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOg0KLQkJCQljYXNlICc4JzogIGNhc2UgJzknOg0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlkZWZhdWx0Og0KLQkJCQl7DQotCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQkJfQ0KLQkJCQl9DQotCQkJCX0NCi0JCQkJew0KLQkJCQlpbnQgX2NudDM3MD0wOw0KLQkJCQlfbG9vcDM3MDoNCi0JCQkJZG8gew0KLQkJCQkJaWYgKCgoTEEoMSkgPj0gJzAnICYmIExBKDEpIDw9ICc5JykpKSB7DQotCQkJCQkJbURJR0lUKGZhbHNlKTsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWlmICggX2NudDM3MD49MSApIHsgYnJlYWsgX2xvb3AzNzA7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlfY250MzcwKys7DQotCQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCQl9DQotCQkJCX0NCi0JCQkJX3R0eXBlID0gRkxPQVQ7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdEJzogIGNhc2UgJ2QnOg0KLQkJCXsNCi0JCQkJew0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlICdkJzoNCi0JCQkJew0KLQkJCQkJbWF0Y2goJ2QnKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgJ0QnOg0KLQkJCQl7DQotCQkJCQltYXRjaCgnRCcpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJZGVmYXVsdDoNCi0JCQkJew0KLQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJCX0NCi0JCQkJfQ0KLQkJCQl9DQotCQkJCV90dHlwZSA9IEZJWEVEOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQkJew0KLQkJCQkJX3R0eXBlID0gRkxPQVQ7DQotCQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnRSc6ICBjYXNlICdlJzoNCi0JCXsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdlJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdlJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdFJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdFJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSAnKyc6DQotCQkJew0KLQkJCQltYXRjaCgnKycpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnLSc6DQotCQkJew0KLQkJCQltYXRjaCgnLScpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6DQotCQkJY2FzZSAnOCc6ICBjYXNlICc5JzoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJew0KLQkJCWludCBfY250Mzc1PTA7DQotCQkJX2xvb3AzNzU6DQotCQkJZG8gew0KLQkJCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzknKSkpIHsNCi0JCQkJCW1ESUdJVChmYWxzZSk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlpZiAoIF9jbnQzNzU+PTEgKSB7IGJyZWFrIF9sb29wMzc1OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpO30NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJX2NudDM3NSsrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlfdHR5cGUgPSBGTE9BVDsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgJ0QnOiAgY2FzZSAnZCc6DQotCQl7DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSAnZCc6DQotCQkJew0KLQkJCQltYXRjaCgnZCcpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnRCc6DQotCQkJew0KLQkJCQltYXRjaCgnRCcpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCV90dHlwZSA9IEZJWEVEOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJfQ0KLQkJfQ0KLQkJfQ0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgbU9DVEFMKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBPQ1RBTDsNCi0JCWludCBfc2F2ZUluZGV4Ow0KLQkJDQotCQltYXRjaCgnMCcpOw0KLQkJew0KLQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCWNhc2UgJzAnOiAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOg0KLQkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6DQotCQljYXNlICc4JzogIGNhc2UgJzknOg0KLQkJew0KLQkJCXsNCi0JCQlpbnQgX2NudDM4MD0wOw0KLQkJCV9sb29wMzgwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKCgoTEEoMSkgPj0gJzAnICYmIExBKDEpIDw9ICc5JykpKSB7DQotCQkJCQltRElHSVQoZmFsc2UpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250MzgwPj0xICkgeyBicmVhayBfbG9vcDM4MDsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTt9DQotCQkJCX0NCi0JCQkJDQotCQkJCV9jbnQzODArKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICcuJzoNCi0JCXsNCi0JCQltRkxPQVQoZmFsc2UpOw0KLQkJCV90dHlwZSA9IEZMT0FUOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnRCc6ICBjYXNlICdkJzoNCi0JCXsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdkJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdkJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdEJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdEJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJX3R0eXBlID0gRklYRUQ7DQotCQkJYnJlYWs7DQotCQl9DQotCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJX3R0eXBlID0gSU5UOw0KLQkJCX0NCi0JCX0NCi0JCX0NCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1GTE9BVChib29sZWFuIF9jcmVhdGVUb2tlbikgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBDaGFyU3RyZWFtRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQlpbnQgX3R0eXBlOyBUb2tlbiBfdG9rZW49bnVsbDsgaW50IF9iZWdpbj10ZXh0Lmxlbmd0aCgpOw0KLQkJX3R0eXBlID0gRkxPQVQ7DQotCQlpbnQgX3NhdmVJbmRleDsNCi0JCQ0KLQkJbWF0Y2goJy4nKTsNCi0JCXsNCi0JCWludCBfY250Mzg0PTA7DQotCQlfbG9vcDM4NDoNCi0JCWRvIHsNCi0JCQlpZiAoKChMQSgxKSA+PSAnMCcgJiYgTEEoMSkgPD0gJzknKSkpIHsNCi0JCQkJbURJR0lUKGZhbHNlKTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCWlmICggX2NudDM4ND49MSApIHsgYnJlYWsgX2xvb3AzODQ7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQ0KLQkJCX0NCi0JCQkNCi0JCQlfY250Mzg0Kys7DQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICdFJzogIGNhc2UgJ2UnOg0KLQkJew0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgJ2UnOg0KLQkJCXsNCi0JCQkJbWF0Y2goJ2UnKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJ0UnOg0KLQkJCXsNCi0JCQkJbWF0Y2goJ0UnKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICcrJzoNCi0JCQl7DQotCQkJCW1hdGNoKCcrJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICctJzoNCi0JCQl7DQotCQkJCW1hdGNoKCctJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICcwJzogIGNhc2UgJzEnOiAgY2FzZSAnMic6ICBjYXNlICczJzoNCi0JCQljYXNlICc0JzogIGNhc2UgJzUnOiAgY2FzZSAnNic6ICBjYXNlICc3JzoNCi0JCQljYXNlICc4JzogIGNhc2UgJzknOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJaW50IF9jbnQzODk9MDsNCi0JCQlfbG9vcDM4OToNCi0JCQlkbyB7DQotCQkJCWlmICgoKExBKDEpID49ICcwJyAmJiBMQSgxKSA8PSAnOScpKSkgew0KLQkJCQkJbURJR0lUKGZhbHNlKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDM4OT49MSApIHsgYnJlYWsgX2xvb3AzODk7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250Mzg5Kys7DQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnRCc6ICBjYXNlICdkJzoNCi0JCXsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdkJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdkJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdEJzoNCi0JCQl7DQotCQkJCW1hdGNoKCdEJyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0Rm9yQ2hhckV4Y2VwdGlvbigoY2hhcilMQSgxKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJX3R0eXBlID0gRklYRUQ7DQotCQkJYnJlYWs7DQotCQl9DQotCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQl9DQotCQl9DQotCQl9DQotCQlpZiAoIF9jcmVhdGVUb2tlbiAmJiBfdG9rZW49PW51bGwgJiYgX3R0eXBlIT1Ub2tlbi5TS0lQICkgew0KLQkJCV90b2tlbiA9IG1ha2VUb2tlbihfdHR5cGUpOw0KLQkJCV90b2tlbi5zZXRUZXh0KG5ldyBTdHJpbmcodGV4dC5nZXRCdWZmZXIoKSwgX2JlZ2luLCB0ZXh0Lmxlbmd0aCgpLV9iZWdpbikpOw0KLQkJfQ0KLQkJX3JldHVyblRva2VuID0gX3Rva2VuOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtSURFTlQoYm9vbGVhbiBfY3JlYXRlVG9rZW4pIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgQ2hhclN0cmVhbUV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJaW50IF90dHlwZTsgVG9rZW4gX3Rva2VuPW51bGw7IGludCBfYmVnaW49dGV4dC5sZW5ndGgoKTsNCi0JCV90dHlwZSA9IElERU5UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCXsNCi0JCXN3aXRjaCAoIExBKDEpKSB7DQotCQljYXNlICdhJzogIGNhc2UgJ2InOiAgY2FzZSAnYyc6ICBjYXNlICdkJzoNCi0JCWNhc2UgJ2UnOiAgY2FzZSAnZic6ICBjYXNlICdnJzogIGNhc2UgJ2gnOg0KLQkJY2FzZSAnaSc6ICBjYXNlICdqJzogIGNhc2UgJ2snOiAgY2FzZSAnbCc6DQotCQljYXNlICdtJzogIGNhc2UgJ24nOiAgY2FzZSAnbyc6ICBjYXNlICdwJzoNCi0JCWNhc2UgJ3EnOiAgY2FzZSAncic6ICBjYXNlICdzJzogIGNhc2UgJ3QnOg0KLQkJY2FzZSAndSc6ICBjYXNlICd2JzogIGNhc2UgJ3cnOiAgY2FzZSAneCc6DQotCQljYXNlICd5JzogIGNhc2UgJ3onOg0KLQkJew0KLQkJCW1hdGNoUmFuZ2UoJ2EnLCd6Jyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoNCi0JCWNhc2UgJ0UnOiAgY2FzZSAnRic6ICBjYXNlICdHJzogIGNhc2UgJ0gnOg0KLQkJY2FzZSAnSSc6ICBjYXNlICdKJzogIGNhc2UgJ0snOiAgY2FzZSAnTCc6DQotCQljYXNlICdNJzogIGNhc2UgJ04nOiAgY2FzZSAnTyc6ICBjYXNlICdQJzoNCi0JCWNhc2UgJ1EnOiAgY2FzZSAnUic6ICBjYXNlICdTJzogIGNhc2UgJ1QnOg0KLQkJY2FzZSAnVSc6ICBjYXNlICdWJzogIGNhc2UgJ1cnOiAgY2FzZSAnWCc6DQotCQljYXNlICdZJzogIGNhc2UgJ1onOg0KLQkJew0KLQkJCW1hdGNoUmFuZ2UoJ0EnLCdaJyk7DQotCQkJYnJlYWs7DQotCQl9DQotCQlkZWZhdWx0Og0KLQkJew0KLQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEZvckNoYXJFeGNlcHRpb24oKGNoYXIpTEEoMSksIGdldEZpbGVuYW1lKCksIGdldExpbmUoKSwgZ2V0Q29sdW1uKCkpOw0KLQkJfQ0KLQkJfQ0KLQkJfQ0KLQkJew0KLQkJX2xvb3AzOTQ6DQotCQlkbyB7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlICdhJzogIGNhc2UgJ2InOiAgY2FzZSAnYyc6ICBjYXNlICdkJzoNCi0JCQljYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzoNCi0JCQljYXNlICdpJzogIGNhc2UgJ2onOiAgY2FzZSAnayc6ICBjYXNlICdsJzoNCi0JCQljYXNlICdtJzogIGNhc2UgJ24nOiAgY2FzZSAnbyc6ICBjYXNlICdwJzoNCi0JCQljYXNlICdxJzogIGNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzoNCi0JCQljYXNlICd1JzogIGNhc2UgJ3YnOiAgY2FzZSAndyc6ICBjYXNlICd4JzoNCi0JCQljYXNlICd5JzogIGNhc2UgJ3onOg0KLQkJCXsNCi0JCQkJbWF0Y2hSYW5nZSgnYScsJ3onKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJ0EnOiAgY2FzZSAnQic6ICBjYXNlICdDJzogIGNhc2UgJ0QnOg0KLQkJCWNhc2UgJ0UnOiAgY2FzZSAnRic6ICBjYXNlICdHJzogIGNhc2UgJ0gnOg0KLQkJCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOg0KLQkJCWNhc2UgJ00nOiAgY2FzZSAnTic6ICBjYXNlICdPJzogIGNhc2UgJ1AnOg0KLQkJCWNhc2UgJ1EnOiAgY2FzZSAnUic6ICBjYXNlICdTJzogIGNhc2UgJ1QnOg0KLQkJCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOg0KLQkJCWNhc2UgJ1knOiAgY2FzZSAnWic6DQotCQkJew0KLQkJCQltYXRjaFJhbmdlKCdBJywnWicpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnXyc6DQotCQkJew0KLQkJCQltYXRjaCgnXycpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSAnMCc6ICBjYXNlICcxJzogIGNhc2UgJzInOiAgY2FzZSAnMyc6DQotCQkJY2FzZSAnNCc6ICBjYXNlICc1JzogIGNhc2UgJzYnOiAgY2FzZSAnNyc6DQotCQkJY2FzZSAnOCc6ICBjYXNlICc5JzoNCi0JCQl7DQotCQkJCW1hdGNoUmFuZ2UoJzAnLCc5Jyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJYnJlYWsgX2xvb3AzOTQ7DQotCQkJfQ0KLQkJCX0NCi0JCX0gd2hpbGUgKHRydWUpOw0KLQkJfQ0KLQkJX3R0eXBlID0gdGVzdExpdGVyYWxzVGFibGUoX3R0eXBlKTsNCi0JCWlmICggX2NyZWF0ZVRva2VuICYmIF90b2tlbj09bnVsbCAmJiBfdHR5cGUhPVRva2VuLlNLSVAgKSB7DQotCQkJX3Rva2VuID0gbWFrZVRva2VuKF90dHlwZSk7DQotCQkJX3Rva2VuLnNldFRleHQobmV3IFN0cmluZyh0ZXh0LmdldEJ1ZmZlcigpLCBfYmVnaW4sIHRleHQubGVuZ3RoKCktX2JlZ2luKSk7DQotCQl9DQotCQlfcmV0dXJuVG9rZW4gPSBfdG9rZW47DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1FU0NBUEVEX0lERU5UKGJvb2xlYW4gX2NyZWF0ZVRva2VuKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIENoYXJTdHJlYW1FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCWludCBfdHR5cGU7IFRva2VuIF90b2tlbj1udWxsOyBpbnQgX2JlZ2luPXRleHQubGVuZ3RoKCk7DQotCQlfdHR5cGUgPSBFU0NBUEVEX0lERU5UOw0KLQkJaW50IF9zYXZlSW5kZXg7DQotCQkNCi0JCW1hdGNoKCdfJyk7DQotCQl7DQotCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6DQotCQljYXNlICdlJzogIGNhc2UgJ2YnOiAgY2FzZSAnZyc6ICBjYXNlICdoJzoNCi0JCWNhc2UgJ2knOiAgY2FzZSAnaic6ICBjYXNlICdrJzogIGNhc2UgJ2wnOg0KLQkJY2FzZSAnbSc6ICBjYXNlICduJzogIGNhc2UgJ28nOiAgY2FzZSAncCc6DQotCQljYXNlICdxJzogIGNhc2UgJ3InOiAgY2FzZSAncyc6ICBjYXNlICd0JzoNCi0JCWNhc2UgJ3UnOiAgY2FzZSAndic6ICBjYXNlICd3JzogIGNhc2UgJ3gnOg0KLQkJY2FzZSAneSc6ICBjYXNlICd6JzoNCi0JCXsNCi0JCQltYXRjaFJhbmdlKCdhJywneicpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSAnQSc6ICBjYXNlICdCJzogIGNhc2UgJ0MnOiAgY2FzZSAnRCc6DQotCQljYXNlICdFJzogIGNhc2UgJ0YnOiAgY2FzZSAnRyc6ICBjYXNlICdIJzoNCi0JCWNhc2UgJ0knOiAgY2FzZSAnSic6ICBjYXNlICdLJzogIGNhc2UgJ0wnOg0KLQkJY2FzZSAnTSc6ICBjYXNlICdOJzogIGNhc2UgJ08nOiAgY2FzZSAnUCc6DQotCQljYXNlICdRJzogIGNhc2UgJ1InOiAgY2FzZSAnUyc6ICBjYXNlICdUJzoNCi0JCWNhc2UgJ1UnOiAgY2FzZSAnVic6ICBjYXNlICdXJzogIGNhc2UgJ1gnOg0KLQkJY2FzZSAnWSc6ICBjYXNlICdaJzoNCi0JCXsNCi0JCQltYXRjaFJhbmdlKCdBJywnWicpOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJZGVmYXVsdDoNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRGb3JDaGFyRXhjZXB0aW9uKChjaGFyKUxBKDEpLCBnZXRGaWxlbmFtZSgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpKTsNCi0JCX0NCi0JCX0NCi0JCX0NCi0JCXsNCi0JCV9sb29wMzk4Og0KLQkJZG8gew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSAnYSc6ICBjYXNlICdiJzogIGNhc2UgJ2MnOiAgY2FzZSAnZCc6DQotCQkJY2FzZSAnZSc6ICBjYXNlICdmJzogIGNhc2UgJ2cnOiAgY2FzZSAnaCc6DQotCQkJY2FzZSAnaSc6ICBjYXNlICdqJzogIGNhc2UgJ2snOiAgY2FzZSAnbCc6DQotCQkJY2FzZSAnbSc6ICBjYXNlICduJzogIGNhc2UgJ28nOiAgY2FzZSAncCc6DQotCQkJY2FzZSAncSc6ICBjYXNlICdyJzogIGNhc2UgJ3MnOiAgY2FzZSAndCc6DQotCQkJY2FzZSAndSc6ICBjYXNlICd2JzogIGNhc2UgJ3cnOiAgY2FzZSAneCc6DQotCQkJY2FzZSAneSc6ICBjYXNlICd6JzoNCi0JCQl7DQotCQkJCW1hdGNoUmFuZ2UoJ2EnLCd6Jyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlICdBJzogIGNhc2UgJ0InOiAgY2FzZSAnQyc6ICBjYXNlICdEJzoNCi0JCQljYXNlICdFJzogIGNhc2UgJ0YnOiAgY2FzZSAnRyc6ICBjYXNlICdIJzoNCi0JCQljYXNlICdJJzogIGNhc2UgJ0onOiAgY2FzZSAnSyc6ICBjYXNlICdMJzoNCi0JCQljYXNlICdNJzogIGNhc2UgJ04nOiAgY2FzZSAnTyc6ICBjYXNlICdQJzoNCi0JCQljYXNlICdRJzogIGNhc2UgJ1InOiAgY2FzZSAnUyc6ICBjYXNlICdUJzoNCi0JCQljYXNlICdVJzogIGNhc2UgJ1YnOiAgY2FzZSAnVyc6ICBjYXNlICdYJzoNCi0JCQljYXNlICdZJzogIGNhc2UgJ1onOg0KLQkJCXsNCi0JCQkJbWF0Y2hSYW5nZSgnQScsJ1onKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJ18nOg0KLQkJCXsNCi0JCQkJbWF0Y2goJ18nKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgJzAnOiAgY2FzZSAnMSc6ICBjYXNlICcyJzogIGNhc2UgJzMnOg0KLQkJCWNhc2UgJzQnOiAgY2FzZSAnNSc6ICBjYXNlICc2JzogIGNhc2UgJzcnOg0KLQkJCWNhc2UgJzgnOiAgY2FzZSAnOSc6DQotCQkJew0KLQkJCQltYXRjaFJhbmdlKCcwJywnOScpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCWJyZWFrIF9sb29wMzk4Ow0KLQkJCX0NCi0JCQl9DQotCQl9IHdoaWxlICh0cnVlKTsNCi0JCX0NCi0JCV9iZWdpbisrO190dHlwZSA9IElERU5UOw0KLQkJaWYgKCBfY3JlYXRlVG9rZW4gJiYgX3Rva2VuPT1udWxsICYmIF90dHlwZSE9VG9rZW4uU0tJUCApIHsNCi0JCQlfdG9rZW4gPSBtYWtlVG9rZW4oX3R0eXBlKTsNCi0JCQlfdG9rZW4uc2V0VGV4dChuZXcgU3RyaW5nKHRleHQuZ2V0QnVmZmVyKCksIF9iZWdpbiwgdGV4dC5sZW5ndGgoKS1fYmVnaW4pKTsNCi0JCX0NCi0JCV9yZXR1cm5Ub2tlbiA9IF90b2tlbjsNCi0JfQ0KLQkNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8wKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1sxMDI1XTsNCi0JCWRhdGFbMV09NTc2NDYwNzQzODQ3NzA2NjIyTDsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8wID0gbmV3IEJpdFNldChta190b2tlblNldF8wKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMSgpIHsNCi0JCWxvbmdbXSBkYXRhID0gbmV3IGxvbmdbMjA0OF07DQotCQlkYXRhWzBdPS0xMDI1TDsNCi0JCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tMTQwNzM3NDg4MzU1MzI5TDsNCi0JCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzMoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tMTQ1MTM1NTM0ODY3NDU3TDsNCi0JCWZvciAoaW50IGkgPSAxOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tNDM5ODA0NjUxMjEyOUw7DQotCQlmb3IgKGludCBpID0gMTsgaTw9MTAyMjsgaSsrKSB7IGRhdGFbaV09LTFMOyB9DQotCQlkYXRhWzEwMjNdPTkyMjMzNzIwMzY4NTQ3NzU4MDdMOw0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSBuZXcgbG9uZ1syMDQ4XTsNCi0JCWRhdGFbMF09LTU0OTc1NTgxMzg4OUw7DQotCQlkYXRhWzFdPS0yNjg0MzU0NTdMOw0KLQkJZm9yIChpbnQgaSA9IDI7IGk8PTEwMjI7IGkrKykgeyBkYXRhW2ldPS0xTDsgfQ0KLQkJZGF0YVsxMDIzXT05MjIzMzcyMDM2ODU0Nzc1ODA3TDsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81ID0gbmV3IEJpdFNldChta190b2tlblNldF81KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNigpIHsNCi0JCWxvbmdbXSBkYXRhID0gbmV3IGxvbmdbMTAyNV07DQotCQlkYXRhWzBdPTI4Nzk0ODkwMTE3NTAwMTA4OEw7DQotCQlkYXRhWzFdPTU0MTE2NTg3OTQyMkw7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzcoKSB7DQotCQlsb25nW10gZGF0YSA9IG5ldyBsb25nWzIwNDhdOw0KLQkJZGF0YVswXT0tMTcxNzk4NjkxODVMOw0KLQkJZGF0YVsxXT0tMjY4NDM1NDU3TDsNCi0JCWZvciAoaW50IGkgPSAyOyBpPD0xMDIyOyBpKyspIHsgZGF0YVtpXT0tMUw7IH0NCi0JCWRhdGFbMTAyM109OTIyMzM3MjAzNjg1NDc3NTgwN0w7DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNygpKTsNCi0JDQotCX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFBhcnNlci5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNzk1ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk5NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy8gJEFOVExSIDIuNy42ICgyMDA1LTEyLTIyKTogIm9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLmciIC0+ICJJRExQYXJzZXIuamF2YSIkDQotDQotICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlcjsNCi0NCi1pbXBvcnQgYW50bHIuQVNURmFjdG9yeTsNCi1pbXBvcnQgYW50bHIuQVNUUGFpcjsNCi1pbXBvcnQgYW50bHIuTm9WaWFibGVBbHRFeGNlcHRpb247DQotaW1wb3J0IGFudGxyLlBhcnNlclNoYXJlZElucHV0U3RhdGU7DQotaW1wb3J0IGFudGxyLlJlY29nbml0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBhbnRsci5Ub2tlbjsNCi1pbXBvcnQgYW50bHIuVG9rZW5CdWZmZXI7DQotaW1wb3J0IGFudGxyLlRva2VuU3RyZWFtOw0KLWltcG9ydCBhbnRsci5Ub2tlblN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgYW50bHIuY29sbGVjdGlvbnMuQVNUOw0KLWltcG9ydCBhbnRsci5jb2xsZWN0aW9ucy5pbXBsLkJpdFNldDsNCi0NCi0vKioNCi0gKiAgVGhpcyBpcyBhIGNvbXBsZXRlIHBhcnNlciBmb3IgdGhlIElETCBsYW5ndWFnZSBhcyBkZWZpbmVkDQotICogIGJ5IHRoZSBDT1JCQSAzLjAuMiBzcGVjaWZpY2F0aW9uLiAgSXQgd2lsbCBhbGxvdyB0aG9zZSB3aG8NCi0gKiAgbmVlZCBhbiBJREwgcGFyc2VyIHRvIGdldCB1cC1hbmQtcnVubmluZyB2ZXJ5IHF1aWNrbHkuDQotICogIFRob3VnaCBJREwncyBzeW50YXggaXMgdmVyeSBzaW1pbGFyIHRvIEMrKywgaXQgaXMgYWxzbw0KLSAqICBtdWNoIHNpbXBsZXIsIGR1ZSBpbiBsYXJnZSBwYXJ0IHRvIHRoZSBmYWN0IHRoYXQgaXQgaXMNCi0gKiAgYSBkZWNsYXJhdGl2ZS1vbmx5IGxhbmd1YWdlLg0KLSAqDQotICogIFNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBhcmU6IFN5bWJvbCB0YWJsZSBjb25zdHJ1Y3Rpb24NCi0gKiAgKGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHBhcnNpbmcsIGJ0dykgYW5kIHByZXByb2Nlc3NpbmcgKGZvcg0KLSAqICBJREwgY29tcGlsZXIgI3ByYWdtYSBkaXJlY3RpdmVzKS4gWW91IGNhbiB1c2UganVzdCBhYm91dCBhbnkNCi0gKiAgQyBvciBDKysgcHJlcHJvY2Vzc29yLCBidXQgdGhlcmUgaXMgYW4gaW50ZXJlc3Rpbmcgc2VtYW50aWMNCi0gKiAgaXNzdWUgaWYgeW91IGFyZSBnb2luZyB0byBnZW5lcmF0ZSBjb2RlOiBJbiBDLCAjaW5jbHVkZSBpcw0KLSAqICBhIGxpdGVyYWwgaW5jbHVkZSwgaW4gSURMLCAjaW5jbHVkZSBpcyBtb3JlIGxpa2UgSmF2YSdzIGltcG9ydDoNCi0gKiAgSXQgYWRkcyBkZWZpbml0aW9ucyB0byB0aGUgc2NvcGUgb2YgdGhlIHBhcnNlLCBidXQgaW5jbHVkZWQNCi0gKiAgZGVmaW5pdGlvbnMgYXJlIG5vdCBnZW5lcmF0ZWQuDQotICoNCi0gKiAgSmltIENva2VyLCBqY29rZXJAbWFnZWxhbmcuY29tDQotICogIEdhcnkgRHV6YW4sIGdkdXphbkBiYm4uY29tDQotICovDQotcHVibGljIGNsYXNzIElETFBhcnNlciBleHRlbmRzIGFudGxyLkxMa1BhcnNlciAgICAgICBpbXBsZW1lbnRzIElETFRva2VuVHlwZXMNCi0gew0KLQ0KLXByb3RlY3RlZCBJRExQYXJzZXIoVG9rZW5CdWZmZXIgdG9rZW5CdWYsIGludCBrKSB7DQotICBzdXBlcih0b2tlbkJ1ZixrKTsNCi0gIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsNCi0gIGJ1aWxkVG9rZW5UeXBlQVNUQ2xhc3NNYXAoKTsNCi0gIGFzdEZhY3RvcnkgPSBuZXcgQVNURmFjdG9yeShnZXRUb2tlblR5cGVUb0FTVENsYXNzTWFwKCkpOw0KLX0NCi0NCi1wdWJsaWMgSURMUGFyc2VyKFRva2VuQnVmZmVyIHRva2VuQnVmKSB7DQotICB0aGlzKHRva2VuQnVmLDQpOw0KLX0NCi0NCi1wcm90ZWN0ZWQgSURMUGFyc2VyKFRva2VuU3RyZWFtIGxleGVyLCBpbnQgaykgew0KLSAgc3VwZXIobGV4ZXIsayk7DQotICB0b2tlbk5hbWVzID0gX3Rva2VuTmFtZXM7DQotICBidWlsZFRva2VuVHlwZUFTVENsYXNzTWFwKCk7DQotICBhc3RGYWN0b3J5ID0gbmV3IEFTVEZhY3RvcnkoZ2V0VG9rZW5UeXBlVG9BU1RDbGFzc01hcCgpKTsNCi19DQotDQotcHVibGljIElETFBhcnNlcihUb2tlblN0cmVhbSBsZXhlcikgew0KLSAgdGhpcyhsZXhlciw0KTsNCi19DQotDQotcHVibGljIElETFBhcnNlcihQYXJzZXJTaGFyZWRJbnB1dFN0YXRlIHN0YXRlKSB7DQotICBzdXBlcihzdGF0ZSw0KTsNCi0gIHRva2VuTmFtZXMgPSBfdG9rZW5OYW1lczsNCi0gIGJ1aWxkVG9rZW5UeXBlQVNUQ2xhc3NNYXAoKTsNCi0gIGFzdEZhY3RvcnkgPSBuZXcgQVNURmFjdG9yeShnZXRUb2tlblR5cGVUb0FTVENsYXNzTWFwKCkpOw0KLX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgc3BlY2lmaWNhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzcGVjaWZpY2F0aW9uX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCV9sb29wMzoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUxJVEVSQUxfaW1wb3J0KSkgew0KLQkJCQkJaW1wb3J0X2RjbCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AzOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl7DQotCQkJaW50IF9jbnQ1PTA7DQotCQkJX2xvb3A1Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMC5tZW1iZXIoTEEoMSkpKSkgew0KLQkJCQkJZGVmaW5pdGlvbigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250NT49MSApIHsgYnJlYWsgX2xvb3A1OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250NSsrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlzcGVjaWZpY2F0aW9uX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3BlY2lmaWNhdGlvbl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGltcG9ydF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW1wb3J0X2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxX0FTVCA9IG51bGw7DQotCQkJdG1wMV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9pbXBvcnQpOw0KLQkJCWltcG9ydGVkX3Njb3BlKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFNFTUkpOw0KLQkJCWltcG9ydF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbXBvcnRfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVmaW5pdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBkZWZpbml0aW9uX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVkZWY6DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCWNhc2UgTElURVJBTF91bmlvbjoNCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCXR5cGVfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY29uc3Q6DQotCQkJew0KLQkJCQljb25zdF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9leGNlcHRpb246DQotCQkJew0KLQkJCQlleGNlcHRfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfbW9kdWxlOg0KLQkJCXsNCi0JCQkJbW9kdWxlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfdHlwZWlkOg0KLQkJCXsNCi0JCQkJdHlwZV9pZF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF90eXBlcHJlZml4Og0KLQkJCXsNCi0JCQkJdHlwZV9wcmVmaXhfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY29tcG9uZW50Og0KLQkJCXsNCi0JCQkJY29tcG9uZW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfaG9tZToNCi0JCQl7DQotCQkJCWhvbWVfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkMTAgPSBmYWxzZTsNCi0JCQkJaWYgKCgoKExBKDEpID49IExJVEVSQUxfYWJzdHJhY3QgJiYgTEEoMSkgPD0gTElURVJBTF9pbnRlcmZhY2UpKSAmJiAoTEEoMik9PUxJVEVSQUxfaW50ZXJmYWNlfHxMQSgyKT09SURFTlQpICYmIChfdG9rZW5TZXRfMy5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzQubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQlpbnQgX20xMCA9IG1hcmsoKTsNCi0JCQkJCXN5blByZWRNYXRjaGVkMTAgPSB0cnVlOw0KLQkJCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQl7DQotCQkJCQkJew0KLQkJCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCQkJCXsNCi0JCQkJCQkJbWF0Y2goTElURVJBTF9hYnN0cmFjdCk7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCQljYXNlIExJVEVSQUxfbG9jYWw6DQotCQkJCQkJew0KLQkJCQkJCQltYXRjaChMSVRFUkFMX2xvY2FsKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJCWNhc2UgTElURVJBTF9pbnRlcmZhY2U6DQotCQkJCQkJew0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQkJZGVmYXVsdDoNCi0JCQkJCQl7DQotCQkJCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJbWF0Y2goTElURVJBTF9pbnRlcmZhY2UpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwZSkgew0KLQkJCQkJCXN5blByZWRNYXRjaGVkMTAgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCXJld2luZChfbTEwKTsNCi1pbnB1dFN0YXRlLmd1ZXNzaW5nLS07DQotCQkJCX0NCi0JCQkJaWYgKCBzeW5QcmVkTWF0Y2hlZDEwICkgew0KLQkJCQkJaW50ZXJmKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCQltYXRjaChTRU1JKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJvb2xlYW4gc3luUHJlZE1hdGNoZWQxMyA9IGZhbHNlOw0KLQkJCQkJaWYgKCgoTEEoMSk9PUxJVEVSQUxfYWJzdHJhY3R8fExBKDEpPT1MSVRFUkFMX2N1c3RvbXx8TEEoMSk9PUxJVEVSQUxfdmFsdWV0eXBlKSAmJiAoTEEoMik9PUxJVEVSQUxfdmFsdWV0eXBlfHxMQSgyKT09SURFTlQpICYmIChfdG9rZW5TZXRfNS5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzYubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQkJaW50IF9tMTMgPSBtYXJrKCk7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQxMyA9IHRydWU7DQotCQkJCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCXsNCi0JCQkJCQkJew0KLQkJCQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQkJCQljYXNlIExJVEVSQUxfYWJzdHJhY3Q6DQotCQkJCQkJCXsNCi0JCQkJCQkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOw0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJY2FzZSBMSVRFUkFMX2N1c3RvbToNCi0JCQkJCQkJew0KLQkJCQkJCQkJbWF0Y2goTElURVJBTF9jdXN0b20pOw0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJY2FzZSBMSVRFUkFMX3ZhbHVldHlwZToNCi0JCQkJCQkJew0KLQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCX0NCi0JCQkJCQkJZGVmYXVsdDoNCi0JCQkJCQkJew0KLQkJCQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCQl9DQotCQkJCQkJCX0NCi0JCQkJCQkJbWF0Y2goTElURVJBTF92YWx1ZXR5cGUpOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwZSkgew0KLQkJCQkJCQlzeW5QcmVkTWF0Y2hlZDEzID0gZmFsc2U7DQotCQkJCQkJfQ0KLQkJCQkJCXJld2luZChfbTEzKTsNCi1pbnB1dFN0YXRlLmd1ZXNzaW5nLS07DQotCQkJCQl9DQotCQkJCQlpZiAoIHN5blByZWRNYXRjaGVkMTMgKSB7DQotCQkJCQkJdmFsdWUoKTsNCi0JCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCQkJbWF0Y2goU0VNSSk7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkMTYgPSBmYWxzZTsNCi0JCQkJCQlpZiAoKChMQSgxKT09TElURVJBTF9hYnN0cmFjdHx8TEEoMSk9PUxJVEVSQUxfY3VzdG9tfHxMQSgxKT09TElURVJBTF9ldmVudHR5cGUpICYmIChMQSgyKT09TElURVJBTF9ldmVudHR5cGV8fExBKDIpPT1JREVOVCkgJiYgKF90b2tlblNldF83Lm1lbWJlcihMQSgzKSkpICYmIChfdG9rZW5TZXRfOC5tZW1iZXIoTEEoNCkpKSkpIHsNCi0JCQkJCQkJaW50IF9tMTYgPSBtYXJrKCk7DQotCQkJCQkJCXN5blByZWRNYXRjaGVkMTYgPSB0cnVlOw0KLQkJCQkJCQlpbnB1dFN0YXRlLmd1ZXNzaW5nKys7DQotCQkJCQkJCXRyeSB7DQotCQkJCQkJCQl7DQotCQkJCQkJCQl7DQotCQkJCQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQkJCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCQkJCQkJew0KLQkJCQkJCQkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOw0KLQkJCQkJCQkJCWJyZWFrOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJY2FzZSBMSVRFUkFMX2N1c3RvbToNCi0JCQkJCQkJCXsNCi0JCQkJCQkJCQltYXRjaChMSVRFUkFMX2N1c3RvbSk7DQotCQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCQl9DQotCQkJCQkJCQljYXNlIExJVEVSQUxfZXZlbnR0eXBlOg0KLQkJCQkJCQkJew0KLQkJCQkJCQkJCWJyZWFrOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJZGVmYXVsdDoNCi0JCQkJCQkJCXsNCi0JCQkJCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQkJbWF0Y2goTElURVJBTF9ldmVudHR5cGUpOw0KLQkJCQkJCQkJfQ0KLQkJCQkJCQl9DQotCQkJCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBwZSkgew0KLQkJCQkJCQkJc3luUHJlZE1hdGNoZWQxNiA9IGZhbHNlOw0KLQkJCQkJCQl9DQotCQkJCQkJCXJld2luZChfbTE2KTsNCi1pbnB1dFN0YXRlLmd1ZXNzaW5nLS07DQotCQkJCQkJfQ0KLQkJCQkJCWlmICggc3luUHJlZE1hdGNoZWQxNiApIHsNCi0JCQkJCQkJZXZlbnQoKTsNCi0JCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJCQltYXRjaChTRU1JKTsNCi0JCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQkJfX19DQotCQkJCQl9DQotCQkJCQlkZWZpbml0aW9uX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQl9DQotCQkJCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfOSk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJICB0aHJvdyBleDsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlyZXR1cm5BU1QgPSBkZWZpbml0aW9uX0FTVDsNCi0JCQl9DQotCQkJDQotCXB1YmxpYyBmaW5hbCB2b2lkIHR5cGVfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHR5cGVfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfdHlwZWRlZjoNCi0JCQl7DQotCQkJCUFTVCB0bXAxNF9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTRfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF90eXBlZGVmKTsNCi0JCQkJdHlwZV9kZWNsYXJhdG9yKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdHlwZV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCWVudW1fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQl7DQotCQkJCUFTVCB0bXAxNV9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTVfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9uYXRpdmUpOw0KLQkJCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQkJYm9vbGVhbiBzeW5QcmVkTWF0Y2hlZDExMSA9IGZhbHNlOw0KLQkJCQlpZiAoKChMQSgxKT09TElURVJBTF9zdHJ1Y3QpICYmIChMQSgyKT09SURFTlQpICYmIChMQSgzKT09TENVUkxZKSkpIHsNCi0JCQkJCWludCBfbTExMSA9IG1hcmsoKTsNCi0JCQkJCXN5blByZWRNYXRjaGVkMTExID0gdHJ1ZTsNCi0JCQkJCWlucHV0U3RhdGUuZ3Vlc3NpbmcrKzsNCi0JCQkJCXRyeSB7DQotCQkJCQkJew0KLQkJCQkJCXN0cnVjdF90eXBlKCk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQxMTEgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCXJld2luZChfbTExMSk7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCQl9DQotCQkJCWlmICggc3luUHJlZE1hdGNoZWQxMTEgKSB7DQotCQkJCQlzdHJ1Y3RfdHlwZSgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJdHlwZV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkMTEzID0gZmFsc2U7DQotCQkJCQlpZiAoKChMQSgxKT09TElURVJBTF91bmlvbikgJiYgKExBKDIpPT1JREVOVCkgJiYgKExBKDMpPT1MSVRFUkFMX3N3aXRjaCkpKSB7DQotCQkJCQkJaW50IF9tMTEzID0gbWFyaygpOw0KLQkJCQkJCXN5blByZWRNYXRjaGVkMTEzID0gdHJ1ZTsNCi0JCQkJCQlpbnB1dFN0YXRlLmd1ZXNzaW5nKys7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJew0KLQkJCQkJCQl1bmlvbl90eXBlKCk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJCXN5blByZWRNYXRjaGVkMTEzID0gZmFsc2U7DQotCQkJCQkJfQ0KLQkJCQkJCXJld2luZChfbTExMyk7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKCBzeW5QcmVkTWF0Y2hlZDExMyApIHsNCi0JCQkJCQl1bmlvbl90eXBlKCk7DQotCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQkJfQ0KLQkJCQkJZWxzZSBpZiAoKExBKDEpPT1MSVRFUkFMX3N0cnVjdHx8TEEoMSk9PUxJVEVSQUxfdW5pb24pICYmIChMQSgyKT09SURFTlQpICYmIChMQSgzKT09U0VNSSkpIHsNCi0JCQkJCQljb25zdHJfZm9yd2FyZF9kZWNsKCk7DQotCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJCXR5cGVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCX0NCi0JCQkJfX0NCi0JCQl9DQotCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJCX0gZWxzZSB7DQotCQkJCSAgdGhyb3cgZXg7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuQVNUID0gdHlwZV9kY2xfQVNUOw0KLQkJfQ0KLQkJDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnN0X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb25zdF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTZfQVNUID0gbnVsbDsNCi0JCQl0bXAxNl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfY29uc3QpOw0KLQkJCWNvbnN0X3R5cGUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChBU1NJR04pOw0KLQkJCWNvbnN0X2V4cCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQljb25zdF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29uc3RfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXhjZXB0X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBleGNlcHRfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE4X0FTVCA9IG51bGw7DQotCQkJdG1wMThfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMThfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2V4Y2VwdGlvbik7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCW9wdF9tZW1iZXJfbGlzdCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWV4Y2VwdF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZXhjZXB0X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGludGVyZigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfYWJzdHJhY3Q6DQotCQkJew0KLQkJCQlBU1QgdG1wMjFfQVNUID0gbnVsbDsNCi0JCQkJdG1wMjFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDIxX0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfYWJzdHJhY3QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2xvY2FsOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDIyX0FTVCA9IG51bGw7DQotCQkJCXRtcDIyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAyMl9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2xvY2FsKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9pbnRlcmZhY2U6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJQVNUIHRtcDIzX0FTVCA9IG51bGw7DQotCQkJdG1wMjNfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2ludGVyZmFjZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExDVVJMWToNCi0JCQljYXNlIENPTE9OOg0KLQkJCXsNCi0JCQkJaW50ZXJmYWNlX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJaW50ZXJmX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGludGVyZl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1vZHVsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtb2R1bGVfQVNUID0gbnVsbDsNCi0JCUFTVCBkX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDI0X0FTVCA9IG51bGw7DQotCQkJdG1wMjRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjRfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX21vZHVsZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCWRlZmluaXRpb25fbGlzdCgpOw0KLQkJCWRfQVNUID0gKEFTVClyZXR1cm5BU1Q7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJbW9kdWxlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG1vZHVsZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCXsNCi0JCQkJdmFsdWVfYWJzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY3VzdG9tOg0KLQkJCXsNCi0JCQkJdmFsdWVfY3VzdG9tX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCQlpZiAoKExBKDEpPT1MSVRFUkFMX3ZhbHVldHlwZSkgJiYgKExBKDIpPT1JREVOVCkgJiYgKExBKDMpPT1MQ1VSTFl8fExBKDMpPT1DT0xPTnx8TEEoMyk9PUxJVEVSQUxfc3VwcG9ydHMpKSB7DQotCQkJCQl2YWx1ZV9kY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoTEEoMSk9PUxJVEVSQUxfdmFsdWV0eXBlKSAmJiAoTEEoMik9PUlERU5UKSAmJiAoX3Rva2VuU2V0XzExLm1lbWJlcihMQSgzKSkpKSB7DQotCQkJCQl2YWx1ZV9ib3hfZGNsKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoKExBKDEpPT1MSVRFUkFMX3ZhbHVldHlwZSkgJiYgKExBKDIpPT1JREVOVCkgJiYgKExBKDMpPT1TRU1JKSkgew0KLQkJCQkJdmFsdWVfZm9yd2FyZF9kY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXZhbHVlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHZhbHVlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdHlwZV9pZF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdHlwZV9pZF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjdfQVNUID0gbnVsbDsNCi0JCQl0bXAyN19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyN19BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfdHlwZWlkKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlzdHJpbmdfbGl0ZXJhbCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl0eXBlX2lkX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB0eXBlX2lkX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHR5cGVfcHJlZml4X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB0eXBlX3ByZWZpeF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjhfQVNUID0gbnVsbDsNCi0JCQl0bXAyOF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyOF9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfdHlwZXByZWZpeCk7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJdHlwZV9wcmVmaXhfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHR5cGVfcHJlZml4X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGV2ZW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2Fic3RyYWN0Og0KLQkJCXsNCi0JCQkJZXZlbnRfYWJzKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9jdXN0b206DQotCQkJew0KLQkJCQlldmVudF9jdXN0b20oKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2V2ZW50dHlwZToNCi0JCQl7DQotCQkJCWV2ZW50X2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlldmVudF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBldmVudF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb21wb25lbnRfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjlfQVNUID0gbnVsbDsNCi0JCQl0bXAyOV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyOV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfY29tcG9uZW50KTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCWNhc2UgQ09MT046DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCXsNCi0JCQkJY29tcG9uZW50X2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJY29tcG9uZW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNvbXBvbmVudF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGhvbWVfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaG9tZV9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaG9tZV9ib2R5KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWhvbWVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGhvbWVfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgaWRlbnRpZmllcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpZGVudGlmaWVyX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDMwX0FTVCA9IG51bGw7DQotCQkJdG1wMzBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMzBfQVNUKTsNCi0JCQltYXRjaChJREVOVCk7DQotCQkJaWRlbnRpZmllcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpZGVudGlmaWVyX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVmaW5pdGlvbl9saXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGRlZmluaXRpb25fbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDIwPTA7DQotCQkJX2xvb3AyMDoNCi0JCQlkbyB7DQotCQkJCWlmICgoX3Rva2VuU2V0XzAubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWRlZmluaXRpb24oKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDIwPj0xICkgeyBicmVhayBfbG9vcDIwOyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250MjArKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJZGVmaW5pdGlvbl9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGRlZmluaXRpb25fbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGludGVyZmFjZV9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZXJmYWNlX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWludGVyZmFjZV9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goTENVUkxZKTsNCi0JCQlpbnRlcmZhY2VfYm9keSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWludGVyZmFjZV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGludGVyZmFjZV9oZWFkZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZXJmYWNlX2hlYWRlcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgQ09MT046DQotCQkJew0KLQkJCQlpbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExDVVJMWToNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlpbnRlcmZhY2VfaGVhZGVyX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGludGVyZmFjZV9oZWFkZXJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfYm9keSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfYm9keV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlfbG9vcDI5Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyOTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJaW50ZXJmYWNlX2JvZHlfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX2JvZHlfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAzM19BU1QgPSBudWxsOw0KLQkJCXRtcDMzX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDMzX0FTVCk7DQotCQkJbWF0Y2goQ09MT04pOw0KLQkJCXNjb3BlZF9uYW1lX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBleHBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZXhwb3J0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVkZWY6DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCWNhc2UgTElURVJBTF91bmlvbjoNCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCXR5cGVfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY29uc3Q6DQotCQkJew0KLQkJCQljb25zdF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9leGNlcHRpb246DQotCQkJew0KLQkJCQlleGNlcHRfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWF0dHJfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX29uZXdheToNCi0JCQljYXNlIExJVEVSQUxfdm9pZDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCXsNCi0JCQkJb3BfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfdHlwZWlkOg0KLQkJCXsNCi0JCQkJdHlwZV9pZF9kY2woKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChTRU1JKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF90eXBlcHJlZml4Og0KLQkJCXsNCi0JCQkJdHlwZV9wcmVmaXhfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFBSRVBST0NfRElSRUNUSVZFOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDQxX0FTVCA9IG51bGw7DQotCQkJCXRtcDQxX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA0MV9BU1QpOw0KLQkJCQltYXRjaChQUkVQUk9DX0RJUkVDVElWRSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlleHBvcnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZXhwb3J0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYXR0cl9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9yZWFkb25seToNCi0JCQl7DQotCQkJCXJlYWRvbmx5X2F0dHJfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWF0dHJfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWF0dHJfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWF0dHJfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBhdHRyX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG9wX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBvcF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfb25ld2F5Og0KLQkJCXsNCi0JCQkJb3BfYXR0cmlidXRlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgTElURVJBTF9mbG9hdDoNCi0JCQljYXNlIExJVEVSQUxfZG91YmxlOg0KLQkJCWNhc2UgTElURVJBTF9sb25nOg0KLQkJCWNhc2UgTElURVJBTF9zaG9ydDoNCi0JCQljYXNlIExJVEVSQUxfdW5zaWduZWQ6DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX3djaGFyOg0KLQkJCWNhc2UgTElURVJBTF9ib29sZWFuOg0KLQkJCWNhc2UgTElURVJBTF9vY3RldDoNCi0JCQljYXNlIExJVEVSQUxfYW55Og0KLQkJCWNhc2UgTElURVJBTF9PYmplY3Q6DQotCQkJY2FzZSBMSVRFUkFMX3N0cmluZzoNCi0JCQljYXNlIExJVEVSQUxfd3N0cmluZzoNCi0JCQljYXNlIExJVEVSQUxfdm9pZDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCW9wX3R5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlBU1QgdG1wNDJfQVNUID0gbnVsbDsNCi0JCQl0bXA0Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA0Ml9BU1QpOw0KLQkJCW1hdGNoKElERU5UKTsNCi0JCQlwYXJhbWV0ZXJfZGNscygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfcmFpc2VzOg0KLQkJCXsNCi0JCQkJcmFpc2VzX2V4cHIoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTRU1JOg0KLQkJCWNhc2UgTElURVJBTF9jb250ZXh0Og0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9jb250ZXh0Og0KLQkJCXsNCi0JCQkJY29udGV4dF9leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0VNSToNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlvcF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gb3BfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2NvcGVkX25hbWVfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzY29wZWRfbmFtZV9saXN0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wMzY6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDM2Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlzY29wZWRfbmFtZV9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xNyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNjb3BlZF9uYW1lX2xpc3RfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfbmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfbmFtZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWludGVyZmFjZV9uYW1lX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xOCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGludGVyZmFjZV9uYW1lX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2NvcGVkX25hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc2NvcGVkX25hbWVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJew0KLQkJCQlBU1QgdG1wNDRfQVNUID0gbnVsbDsNCi0JCQkJdG1wNDRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDQ0X0FTVCk7DQotCQkJCW1hdGNoKFNDT1BFT1ApOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlBU1QgdG1wNDVfQVNUID0gbnVsbDsNCi0JCQl0bXA0NV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA0NV9BU1QpOw0KLQkJCW1hdGNoKElERU5UKTsNCi0JCQl7DQotCQkJX2xvb3A0MDoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PVNDT1BFT1ApKSB7DQotCQkJCQltYXRjaChTQ09QRU9QKTsNCi0JCQkJCWlkZW50aWZpZXIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wNDA7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCXNjb3BlZF9uYW1lX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNjb3BlZF9uYW1lX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA0N19BU1QgPSBudWxsOw0KLQkJCXRtcDQ3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDQ3X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF92YWx1ZXR5cGUpOw0KLQkJCWlkZW50aWZpZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCXsNCi0JCQlfbG9vcDUyOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMjAubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCXZhbHVlX2VsZW1lbnQoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wNTI7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJdmFsdWVfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHZhbHVlX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX2Fic19kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfYWJzX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA1MF9BU1QgPSBudWxsOw0KLQkJCXRtcDUwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDUwX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9hYnN0cmFjdCk7DQotCQkJQVNUIHRtcDUxX0FTVCA9IG51bGw7DQotCQkJdG1wNTFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ZhbHVldHlwZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExDVVJMWToNCi0JCQljYXNlIENPTE9OOg0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCXZhbHVlX2Fic19mdWxsX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJdmFsdWVfYWJzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9hYnNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfYm94X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9ib3hfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDUyX0FTVCA9IG51bGw7DQotCQkJdG1wNTJfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTJfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ZhbHVldHlwZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl0eXBlX3NwZWMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJdmFsdWVfYm94X2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9ib3hfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfY3VzdG9tX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9jdXN0b21fZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDUzX0FTVCA9IG51bGw7DQotCQkJdG1wNTNfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2N1c3RvbSk7DQotCQkJdmFsdWVfZGNsKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXZhbHVlX2N1c3RvbV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfY3VzdG9tX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX2ZvcndhcmRfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX2ZvcndhcmRfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDU0X0FTVCA9IG51bGw7DQotCQkJdG1wNTRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNTRfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ZhbHVldHlwZSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl2YWx1ZV9mb3J3YXJkX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9mb3J3YXJkX2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHR5cGVfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB0eXBlX3NwZWNfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgTElURVJBTF9mbG9hdDoNCi0JCQljYXNlIExJVEVSQUxfZG91YmxlOg0KLQkJCWNhc2UgTElURVJBTF9sb25nOg0KLQkJCWNhc2UgTElURVJBTF9zaG9ydDoNCi0JCQljYXNlIExJVEVSQUxfdW5zaWduZWQ6DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX3djaGFyOg0KLQkJCWNhc2UgTElURVJBTF9ib29sZWFuOg0KLQkJCWNhc2UgTElURVJBTF9vY3RldDoNCi0JCQljYXNlIExJVEVSQUxfYW55Og0KLQkJCWNhc2UgTElURVJBTF9PYmplY3Q6DQotCQkJY2FzZSBMSVRFUkFMX3NlcXVlbmNlOg0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX2ZpeGVkOg0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJew0KLQkJCQlzaW1wbGVfdHlwZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3N0cnVjdDoNCi0JCQljYXNlIExJVEVSQUxfdW5pb246DQotCQkJY2FzZSBMSVRFUkFMX2VudW06DQotCQkJew0KLQkJCQljb25zdHJfdHlwZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjEpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB0eXBlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWx1ZV9hYnNfZnVsbF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfYWJzX2Z1bGxfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCXsNCi0JCQlfbG9vcDQ5Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3A0OTsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJbWF0Y2goUkNVUkxZKTsNCi0JCQl2YWx1ZV9hYnNfZnVsbF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfYWJzX2Z1bGxfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9pbmhlcml0YW5jZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBDT0xPTjoNCi0JCQl7DQotCQkJCXZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMQ1VSTFk6DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCXZhbHVlX2ludGVyZmFjZV9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXZhbHVlX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfaW5oZXJpdGFuY2Vfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX2VsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfZWxlbWVudF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgUFJFUFJPQ19ESVJFQ1RJVkU6DQotCQkJY2FzZSBTQ09QRU9QOg0KLQkJCWNhc2UgSURFTlQ6DQotCQkJY2FzZSBMSVRFUkFMX2NvbnN0Og0KLQkJCWNhc2UgTElURVJBTF90eXBlZGVmOg0KLQkJCWNhc2UgTElURVJBTF9uYXRpdmU6DQotCQkJY2FzZSBMSVRFUkFMX2Zsb2F0Og0KLQkJCWNhc2UgTElURVJBTF9kb3VibGU6DQotCQkJY2FzZSBMSVRFUkFMX2xvbmc6DQotCQkJY2FzZSBMSVRFUkFMX3Nob3J0Og0KLQkJCWNhc2UgTElURVJBTF91bnNpZ25lZDoNCi0JCQljYXNlIExJVEVSQUxfY2hhcjoNCi0JCQljYXNlIExJVEVSQUxfd2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX2Jvb2xlYW46DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCWNhc2UgTElURVJBTF9hbnk6DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCWNhc2UgTElURVJBTF91bmlvbjoNCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQljYXNlIExJVEVSQUxfc3RyaW5nOg0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCWNhc2UgTElURVJBTF9leGNlcHRpb246DQotCQkJY2FzZSBMSVRFUkFMX29uZXdheToNCi0JCQljYXNlIExJVEVSQUxfdm9pZDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCWNhc2UgTElURVJBTF90eXBlaWQ6DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVwcmVmaXg6DQotCQkJY2FzZSBMSVRFUkFMX3JlYWRvbmx5Og0KLQkJCWNhc2UgTElURVJBTF9hdHRyaWJ1dGU6DQotCQkJew0KLQkJCQlleHBvcnQoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3B1YmxpYzoNCi0JCQljYXNlIExJVEVSQUxfcHJpdmF0ZToNCi0JCQl7DQotCQkJCXN0YXRlX21lbWJlcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZmFjdG9yeToNCi0JCQl7DQotCQkJCWluaXRfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXZhbHVlX2VsZW1lbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIyKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfZWxlbWVudF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfdmFsdWVfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA1N19BU1QgPSBudWxsOw0KLQkJCXRtcDU3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDU3X0FTVCk7DQotCQkJbWF0Y2goQ09MT04pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF90cnVuY2F0YWJsZToNCi0JCQl7DQotCQkJCUFTVCB0bXA1OF9BU1QgPSBudWxsOw0KLQkJCQl0bXA1OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNThfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF90cnVuY2F0YWJsZSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl2YWx1ZV9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDYwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQl2YWx1ZV9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDYwOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl2YWx1ZV92YWx1ZV9pbmhlcml0YW5jZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA2MF9BU1QgPSBudWxsOw0KLQkJCXRtcDYwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDYwX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zdXBwb3J0cyk7DQotCQkJaW50ZXJmYWNlX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wNjM6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCWludGVyZmFjZV9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDYzOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9pbnRlcmZhY2VfaW5oZXJpdGFuY2Vfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHZhbHVlX25hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdmFsdWVfbmFtZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXZhbHVlX25hbWVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdmFsdWVfbmFtZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHN0YXRlX21lbWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdGF0ZV9tZW1iZXJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfcHVibGljOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDYyX0FTVCA9IG51bGw7DQotCQkJCXRtcDYyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA2Ml9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX3B1YmxpYyk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcHJpdmF0ZToNCi0JCQl7DQotCQkJCUFTVCB0bXA2M19BU1QgPSBudWxsOw0KLQkJCQl0bXA2M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNjNfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9wcml2YXRlKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXR5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlkZWNsYXJhdG9ycygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChTRU1JKTsNCi0JCQlzdGF0ZV9tZW1iZXJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIyKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3RhdGVfbWVtYmVyX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdF9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW5pdF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wNjVfQVNUID0gbnVsbDsNCi0JCQl0bXA2NV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA2NV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZmFjdG9yeSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMUEFSRU4pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9pbjoNCi0JCQl7DQotCQkJCWluaXRfcGFyYW1fZGVjbHMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBSUEFSRU46DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJbWF0Y2goUlBBUkVOKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfcmFpc2VzOg0KLQkJCXsNCi0JCQkJcmFpc2VzX2V4cHIoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTRU1JOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCW1hdGNoKFNFTUkpOw0KLQkJCWluaXRfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGluaXRfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVjbGFyYXRvcnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZGVjbGFyYXRvcnNfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlkZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDEyNDoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgew0KLQkJCQkJbWF0Y2goQ09NTUEpOw0KLQkJCQkJZGVjbGFyYXRvcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AxMjQ7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWRlY2xhcmF0b3JzX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGRlY2xhcmF0b3JzX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgaW5pdF9wYXJhbV9kZWNscygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbml0X3BhcmFtX2RlY2xzX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaW5pdF9wYXJhbV9kZWNsKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDc0Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQlpbml0X3BhcmFtX2RlY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wNzQ7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWluaXRfcGFyYW1fZGVjbHNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI1KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW5pdF9wYXJhbV9kZWNsc19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJhaXNlc19leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHJhaXNlc19leHByX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDcxX0FTVCA9IG51bGw7DQotCQkJdG1wNzFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wNzFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3JhaXNlcyk7DQotCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQlzY29wZWRfbmFtZV9saXN0KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFJQQVJFTik7DQotCQkJcmFpc2VzX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcmFpc2VzX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0X3BhcmFtX2RlY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW5pdF9wYXJhbV9kZWNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaW5pdF9wYXJhbV9hdHRyaWJ1dGUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJcGFyYW1fdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXNpbXBsZV9kZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWluaXRfcGFyYW1fZGVjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjcpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbml0X3BhcmFtX2RlY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbml0X3BhcmFtX2F0dHJpYnV0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbml0X3BhcmFtX2F0dHJpYnV0ZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA3NF9BU1QgPSBudWxsOw0KLQkJCXRtcDc0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDc0X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9pbik7DQotCQkJaW5pdF9wYXJhbV9hdHRyaWJ1dGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI4KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW5pdF9wYXJhbV9hdHRyaWJ1dGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBwYXJhbV90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcGFyYW1fdHlwZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJew0KLQkJCQliYXNlX3R5cGVfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXBhcmFtX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJew0KLQkJCQlzdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXBhcmFtX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXBhcmFtX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlwYXJhbV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHBhcmFtX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNpbXBsZV9kZWNsYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNpbXBsZV9kZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlzaW1wbGVfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaW1wbGVfZGVjbGFyYXRvcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnN0X3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY29uc3RfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJew0KLQkJCQljaGFyX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3djaGFyOg0KLQkJCXsNCi0JCQkJd2lkZV9jaGFyX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2Jvb2xlYW46DQotCQkJew0KLQkJCQlib29sZWFuX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3N0cmluZzoNCi0JCQl7DQotCQkJCXN0cmluZ190eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJY29uc3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZml4ZWQ6DQotCQkJew0KLQkJCQlmaXhlZF9wdF9jb25zdF90eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJY29uc3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCXsNCi0JCQkJb2N0ZXRfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCQlib29sZWFuIHN5blByZWRNYXRjaGVkODAgPSBmYWxzZTsNCi0JCQkJaWYgKCgoKExBKDEpID49IExJVEVSQUxfbG9uZyAmJiBMQSgxKSA8PSBMSVRFUkFMX3Vuc2lnbmVkKSkgJiYgKExBKDIpPT1JREVOVHx8TEEoMik9PUxJVEVSQUxfbG9uZ3x8TEEoMik9PUxJVEVSQUxfc2hvcnQpICYmIChMQSgzKT09SURFTlR8fExBKDMpPT1BU1NJR058fExBKDMpPT1MSVRFUkFMX2xvbmcpICYmIChfdG9rZW5TZXRfMzEubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQlpbnQgX204MCA9IG1hcmsoKTsNCi0JCQkJCXN5blByZWRNYXRjaGVkODAgPSB0cnVlOw0KLQkJCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQl7DQotCQkJCQkJaW50ZWdlcl90eXBlKCk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQ4MCA9IGZhbHNlOw0KLQkJCQkJfQ0KLQkJCQkJcmV3aW5kKF9tODApOw0KLWlucHV0U3RhdGUuZ3Vlc3NpbmctLTsNCi0JCQkJfQ0KLQkJCQlpZiAoIHN5blByZWRNYXRjaGVkODAgKSB7DQotCQkJCQlpbnRlZ2VyX3R5cGUoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJCWNvbnN0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCX0NCi0JCQkJZWxzZSBpZiAoKChMQSgxKSA+PSBMSVRFUkFMX2Zsb2F0ICYmIExBKDEpIDw9IExJVEVSQUxfbG9uZykpICYmIChMQSgyKT09SURFTlR8fExBKDIpPT1MSVRFUkFMX2RvdWJsZSkgJiYgKExBKDMpPT1JREVOVHx8TEEoMyk9PUFTU0lHTikgJiYgKF90b2tlblNldF8zMS5tZW1iZXIoTEEoNCkpKSkgew0KLQkJCQkJZmxvYXRpbmdfcHRfdHlwZSgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJY29uc3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI5KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29uc3RfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnN0X2V4cCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb25zdF9leHBfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlvcl9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWNvbnN0X2V4cF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb25zdF9leHBfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlZ2VyX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZWdlcl90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJew0KLQkJCQlzaWduZWRfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJaW50ZWdlcl90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCXsNCi0JCQkJdW5zaWduZWRfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJaW50ZWdlcl90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbnRlZ2VyX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjaGFyX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY2hhcl90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDc1X0FTVCA9IG51bGw7DQotCQkJdG1wNzVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNzVfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2NoYXIpOw0KLQkJCWNoYXJfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjaGFyX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB3aWRlX2NoYXJfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB3aWRlX2NoYXJfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA3Nl9BU1QgPSBudWxsOw0KLQkJCXRtcDc2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDc2X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF93Y2hhcik7DQotCQkJd2lkZV9jaGFyX3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gd2lkZV9jaGFyX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBib29sZWFuX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYm9vbGVhbl90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDc3X0FTVCA9IG51bGw7DQotCQkJdG1wNzdfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNzdfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2Jvb2xlYW4pOw0KLQkJCWJvb2xlYW5fdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBib29sZWFuX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmbG9hdGluZ19wdF90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGZsb2F0aW5nX3B0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9mbG9hdDoNCi0JCQl7DQotCQkJCUFTVCB0bXA3OF9BU1QgPSBudWxsOw0KLQkJCQl0bXA3OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wNzhfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9mbG9hdCk7DQotCQkJCWZsb2F0aW5nX3B0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZG91YmxlOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDc5X0FTVCA9IG51bGw7DQotCQkJCXRtcDc5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA3OV9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2RvdWJsZSk7DQotCQkJCWZsb2F0aW5nX3B0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQl7DQotCQkJCUFTVCB0bXA4MF9BU1QgPSBudWxsOw0KLQkJCQl0bXA4MF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wODBfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9sb25nKTsNCi0JCQkJQVNUIHRtcDgxX0FTVCA9IG51bGw7DQotCQkJCXRtcDgxX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA4MV9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2RvdWJsZSk7DQotCQkJCWZsb2F0aW5nX3B0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGZsb2F0aW5nX3B0X3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzdHJpbmdfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdHJpbmdfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA4Ml9BU1QgPSBudWxsOw0KLQkJCXRtcDgyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDgyX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zdHJpbmcpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTFQ6DQotCQkJew0KLQkJCQltYXRjaChMVCk7DQotCQkJCXBvc2l0aXZlX2ludF9jb25zdCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKEdUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0VNSToNCi0JCQljYXNlIENPTU1BOg0KLQkJCWNhc2UgSURFTlQ6DQotCQkJY2FzZSBHVDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlzdHJpbmdfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzdHJpbmdfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHdpZGVfc3RyaW5nX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgd2lkZV9zdHJpbmdfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXA4NV9BU1QgPSBudWxsOw0KLQkJCXRtcDg1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDg1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF93c3RyaW5nKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExUOg0KLQkJCXsNCi0JCQkJbWF0Y2goTFQpOw0KLQkJCQlwb3NpdGl2ZV9pbnRfY29uc3QoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQltYXRjaChHVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJY2FzZSBDT01NQToNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgR1Q6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJd2lkZV9zdHJpbmdfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB3aWRlX3N0cmluZ190eXBlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZml4ZWRfcHRfY29uc3RfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBmaXhlZF9wdF9jb25zdF90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDg4X0FTVCA9IG51bGw7DQotCQkJdG1wODhfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wODhfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2ZpeGVkKTsNCi0JCQlmaXhlZF9wdF9jb25zdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGZpeGVkX3B0X2NvbnN0X3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvY3RldF90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIG9jdGV0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wODlfQVNUID0gbnVsbDsNCi0JCQl0bXA4OV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXA4OV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfb2N0ZXQpOw0KLQkJCW9jdGV0X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gb2N0ZXRfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG9yX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgb3JfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXhvcl9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDg0Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09T1IpKSB7DQotCQkJCQlBU1QgdG1wOTBfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDkwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wOTBfQVNUKTsNCi0JCQkJCW1hdGNoKE9SKTsNCi0JCQkJCXhvcl9leHByKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDg0Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlvcl9leHByX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zMik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9yX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB4b3JfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB4b3JfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWFuZF9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDg3Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09WE9SKSkgew0KLQkJCQkJQVNUIHRtcDkxX0FTVCA9IG51bGw7DQotCQkJCQl0bXA5MV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDkxX0FTVCk7DQotCQkJCQltYXRjaChYT1IpOw0KLQkJCQkJYW5kX2V4cHIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wODc7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCXhvcl9leHByX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHhvcl9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYW5kX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYW5kX2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzaGlmdF9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDkwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09QU5EKSkgew0KLQkJCQkJQVNUIHRtcDkyX0FTVCA9IG51bGw7DQotCQkJCQl0bXA5Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDkyX0FTVCk7DQotCQkJCQltYXRjaChBTkQpOw0KLQkJCQkJc2hpZnRfZXhwcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3A5MDsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJYW5kX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYW5kX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzaGlmdF9leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNoaWZ0X2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlhZGRfZXhwcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJX2xvb3A5NDoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUxTSElGVHx8TEEoMSk9PVJTSElGVCkpIHsNCi0JCQkJCXsNCi0JCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCQljYXNlIExTSElGVDoNCi0JCQkJCXsNCi0JCQkJCQlBU1QgdG1wOTNfQVNUID0gbnVsbDsNCi0JCQkJCQl0bXA5M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA5M19BU1QpOw0KLQkJCQkJCW1hdGNoKExTSElGVCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQljYXNlIFJTSElGVDoNCi0JCQkJCXsNCi0JCQkJCQlBU1QgdG1wOTRfQVNUID0gbnVsbDsNCi0JCQkJCQl0bXA5NF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXA5NF9BU1QpOw0KLQkJCQkJCW1hdGNoKFJTSElGVCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQlkZWZhdWx0Og0KLQkJCQkJew0KLQkJCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCQlhZGRfZXhwcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3A5NDsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJc2hpZnRfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzcpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaGlmdF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYWRkX2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQltdWx0X2V4cHIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wOTg6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1QTFVTfHxMQSgxKT09TUlOVVMpKSB7DQotCQkJCQl7DQotCQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQkJY2FzZSBQTFVTOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5NV9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk1X0FTVCk7DQotCQkJCQkJbWF0Y2goUExVUyk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQljYXNlIE1JTlVTOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5Nl9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk2X0FTVCk7DQotCQkJCQkJbWF0Y2goTUlOVVMpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQkJZGVmYXVsdDoNCi0JCQkJCXsNCi0JCQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJbXVsdF9leHByKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDk4Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlhZGRfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzgpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBhZGRfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG11bHRfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtdWx0X2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl1bmFyeV9leHByKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDEwMjoNCi0JCQlkbyB7DQotCQkJCWlmICgoKExBKDEpID49IFNUQVIgJiYgTEEoMSkgPD0gTU9EKSkpIHsNCi0JCQkJCXsNCi0JCQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJCQljYXNlIFNUQVI6DQotCQkJCQl7DQotCQkJCQkJQVNUIHRtcDk3X0FTVCA9IG51bGw7DQotCQkJCQkJdG1wOTdfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wOTdfQVNUKTsNCi0JCQkJCQltYXRjaChTVEFSKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWNhc2UgRElWOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5OF9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk4X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk4X0FTVCk7DQotCQkJCQkJbWF0Y2goRElWKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWNhc2UgTU9EOg0KLQkJCQkJew0KLQkJCQkJCUFTVCB0bXA5OV9BU1QgPSBudWxsOw0KLQkJCQkJCXRtcDk5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDk5X0FTVCk7DQotCQkJCQkJbWF0Y2goTU9EKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJCWRlZmF1bHQ6DQotCQkJCQl7DQotCQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQkJCX0NCi0JCQkJCX0NCi0JCQkJCX0NCi0JCQkJCXVuYXJ5X2V4cHIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTAyOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQltdWx0X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM5KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gbXVsdF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdW5hcnlfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB1bmFyeV9leHByX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFBMVVM6DQotCQkJY2FzZSBNSU5VUzoNCi0JCQljYXNlIFRJTERFOg0KLQkJCXsNCi0JCQkJew0KLQkJCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCQljYXNlIE1JTlVTOg0KLQkJCQl7DQotCQkJCQlBU1QgdG1wMTAwX0FTVCA9IG51bGw7DQotCQkJCQl0bXAxMDBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxMDBfQVNUKTsNCi0JCQkJCW1hdGNoKE1JTlVTKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgUExVUzoNCi0JCQkJew0KLQkJCQkJQVNUIHRtcDEwMV9BU1QgPSBudWxsOw0KLQkJCQkJdG1wMTAxX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTAxX0FTVCk7DQotCQkJCQltYXRjaChQTFVTKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWNhc2UgVElMREU6DQotCQkJCXsNCi0JCQkJCUFTVCB0bXAxMDJfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDEwMl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEwMl9BU1QpOw0KLQkJCQkJbWF0Y2goVElMREUpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJZGVmYXVsdDoNCi0JCQkJew0KLQkJCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQkJfQ0KLQkJCQl9DQotCQkJCX0NCi0JCQkJcHJpbWFyeV9leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5hcnlfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCWNhc2UgTFBBUkVOOg0KLQkJCWNhc2UgTElURVJBTF9UUlVFOg0KLQkJCWNhc2UgTElURVJBTF9GQUxTRToNCi0JCQljYXNlIElOVDoNCi0JCQljYXNlIE9DVEFMOg0KLQkJCWNhc2UgSEVYOg0KLQkJCWNhc2UgU1RSSU5HX0xJVEVSQUw6DQotCQkJY2FzZSBXSURFX1NUUklOR19MSVRFUkFMOg0KLQkJCWNhc2UgQ0hBUl9MSVRFUkFMOg0KLQkJCWNhc2UgV0lERV9DSEFSX0xJVEVSQUw6DQotCQkJY2FzZSBGSVhFRDoNCi0JCQljYXNlIEZMT0FUOg0KLQkJCXsNCi0JCQkJcHJpbWFyeV9leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5hcnlfZXhwcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5hcnlfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHByaW1hcnlfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwcmltYXJ5X2V4cHJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlwcmltYXJ5X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfVFJVRToNCi0JCQljYXNlIExJVEVSQUxfRkFMU0U6DQotCQkJY2FzZSBJTlQ6DQotCQkJY2FzZSBPQ1RBTDoNCi0JCQljYXNlIEhFWDoNCi0JCQljYXNlIFNUUklOR19MSVRFUkFMOg0KLQkJCWNhc2UgV0lERV9TVFJJTkdfTElURVJBTDoNCi0JCQljYXNlIENIQVJfTElURVJBTDoNCi0JCQljYXNlIFdJREVfQ0hBUl9MSVRFUkFMOg0KLQkJCWNhc2UgRklYRUQ6DQotCQkJY2FzZSBGTE9BVDoNCi0JCQl7DQotCQkJCWxpdGVyYWwoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlwcmltYXJ5X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExQQVJFTjoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDNfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTAzX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxMDNfQVNUKTsNCi0JCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQkJY29uc3RfZXhwKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJQVNUIHRtcDEwNF9BU1QgPSBudWxsOw0KLQkJCQl0bXAxMDRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDEwNF9BU1QpOw0KLQkJCQltYXRjaChSUEFSRU4pOw0KLQkJCQlwcmltYXJ5X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80MCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHByaW1hcnlfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBJTlQ6DQotCQkJY2FzZSBPQ1RBTDoNCi0JCQljYXNlIEhFWDoNCi0JCQl7DQotCQkJCWludGVnZXJfbGl0ZXJhbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWxpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlsaXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBXSURFX1NUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfbGl0ZXJhbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWxpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIENIQVJfTElURVJBTDoNCi0JCQl7DQotCQkJCWNoYXJhY3Rlcl9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgV0lERV9DSEFSX0xJVEVSQUw6DQotCQkJew0KLQkJCQl3aWRlX2NoYXJhY3Rlcl9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgRklYRUQ6DQotCQkJew0KLQkJCQlmaXhlZF9wdF9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgRkxPQVQ6DQotCQkJew0KLQkJCQlmbG9hdGluZ19wdF9saXRlcmFsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9UUlVFOg0KLQkJCWNhc2UgTElURVJBTF9GQUxTRToNCi0JCQl7DQotCQkJCWJvb2xlYW5fbGl0ZXJhbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWxpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80MCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGxpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlZ2VyX2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgaW50ZWdlcl9saXRlcmFsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIElOVDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDVfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTA1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDVfQVNUKTsNCi0JCQkJbWF0Y2goSU5UKTsNCi0JCQkJaW50ZWdlcl9saXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBPQ1RBTDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDZfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTA2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDZfQVNUKTsNCi0JCQkJbWF0Y2goT0NUQUwpOw0KLQkJCQlpbnRlZ2VyX2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEhFWDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxMDdfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTA3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDdfQVNUKTsNCi0JCQkJbWF0Y2goSEVYKTsNCi0JCQkJaW50ZWdlcl9saXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBpbnRlZ2VyX2xpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzdHJpbmdfbGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdHJpbmdfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDI4Mj0wOw0KLQkJCV9sb29wMjgyOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09U1RSSU5HX0xJVEVSQUwpKSB7DQotCQkJCQlBU1QgdG1wMTA4X0FTVCA9IG51bGw7DQotCQkJCQl0bXAxMDhfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDhfQVNUKTsNCi0JCQkJCW1hdGNoKFNUUklOR19MSVRFUkFMKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDI4Mj49MSApIHsgYnJlYWsgX2xvb3AyODI7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTt9DQotCQkJCX0NCi0JCQkJDQotCQkJCV9jbnQyODIrKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJc3RyaW5nX2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3RyaW5nX2xpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB3aWRlX3N0cmluZ19saXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHdpZGVfc3RyaW5nX2xpdGVyYWxfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJaW50IF9jbnQyODU9MDsNCi0JCQlfbG9vcDI4NToNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PVdJREVfU1RSSU5HX0xJVEVSQUwpKSB7DQotCQkJCQlBU1QgdG1wMTA5X0FTVCA9IG51bGw7DQotCQkJCQl0bXAxMDlfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMDlfQVNUKTsNCi0JCQkJCW1hdGNoKFdJREVfU1RSSU5HX0xJVEVSQUwpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250Mjg1Pj0xICkgeyBicmVhayBfbG9vcDI4NTsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpO30NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJX2NudDI4NSsrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQl3aWRlX3N0cmluZ19saXRlcmFsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80MCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHdpZGVfc3RyaW5nX2xpdGVyYWxfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjaGFyYWN0ZXJfbGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjaGFyYWN0ZXJfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMTBfQVNUID0gbnVsbDsNCi0JCQl0bXAxMTBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTEwX0FTVCk7DQotCQkJbWF0Y2goQ0hBUl9MSVRFUkFMKTsNCi0JCQljaGFyYWN0ZXJfbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjaGFyYWN0ZXJfbGl0ZXJhbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHdpZGVfY2hhcmFjdGVyX2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMTFfQVNUID0gbnVsbDsNCi0JCQl0bXAxMTFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTExX0FTVCk7DQotCQkJbWF0Y2goV0lERV9DSEFSX0xJVEVSQUwpOw0KLQkJCXdpZGVfY2hhcmFjdGVyX2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGZpeGVkX3B0X2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZml4ZWRfcHRfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMTJfQVNUID0gbnVsbDsNCi0JCQl0bXAxMTJfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTEyX0FTVCk7DQotCQkJbWF0Y2goRklYRUQpOw0KLQkJCWZpeGVkX3B0X2xpdGVyYWxfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZml4ZWRfcHRfbGl0ZXJhbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGZsb2F0aW5nX3B0X2xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZmxvYXRpbmdfcHRfbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJVG9rZW4gIGYgPSBudWxsOw0KLQkJQVNUIGZfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlmID0gTFQoMSk7DQotCQkJZl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShmKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIGZfQVNUKTsNCi0JCQltYXRjaChGTE9BVCk7DQotCQkJZmxvYXRpbmdfcHRfbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBmbG9hdGluZ19wdF9saXRlcmFsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgYm9vbGVhbl9saXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGJvb2xlYW5fbGl0ZXJhbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX1RSVUU6DQotCQkJew0KLQkJCQlBU1QgdG1wMTEzX0FTVCA9IG51bGw7DQotCQkJCXRtcDExM19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTEzX0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfVFJVRSk7DQotCQkJCWJvb2xlYW5fbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9GQUxTRToNCi0JCQl7DQotCQkJCUFTVCB0bXAxMTRfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTE0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMTRfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9GQUxTRSk7DQotCQkJCWJvb2xlYW5fbGl0ZXJhbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYm9vbGVhbl9saXRlcmFsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcG9zaXRpdmVfaW50X2NvbnN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHBvc2l0aXZlX2ludF9jb25zdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWNvbnN0X2V4cCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlwb3NpdGl2ZV9pbnRfY29uc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQxKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcG9zaXRpdmVfaW50X2NvbnN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdHlwZV9kZWNsYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHR5cGVfZGVjbGFyYXRvcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXR5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlkZWNsYXJhdG9ycygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl0eXBlX2RlY2xhcmF0b3JfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdHlwZV9kZWNsYXJhdG9yX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc3RydWN0X3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc3RydWN0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTE1X0FTVCA9IG51bGw7DQotCQkJdG1wMTE1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDExNV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfc3RydWN0KTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExDVVJMWSk7DQotCQkJbWVtYmVyX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goUkNVUkxZKTsNCi0JCQlzdHJ1Y3RfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjEpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzdHJ1Y3RfdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHVuaW9uX3R5cGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdW5pb25fdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMThfQVNUID0gbnVsbDsNCi0JCQl0bXAxMThfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTE4X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF91bmlvbik7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3N3aXRjaCk7DQotCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQlzd2l0Y2hfdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKFJQQVJFTik7DQotCQkJbWF0Y2goTENVUkxZKTsNCi0JCQlzd2l0Y2hfYm9keSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCXVuaW9uX3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIxKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5pb25fdHlwZV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGVudW1fdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBlbnVtX3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTI0X0FTVCA9IG51bGw7DQotCQkJdG1wMTI0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEyNF9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZW51bSk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCWVudW1lcmF0b3JfbGlzdCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWVudW1fdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDIpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBlbnVtX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjb25zdHJfZm9yd2FyZF9kZWNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbnN0cl9mb3J3YXJkX2RlY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9zdHJ1Y3Q6DQotCQkJew0KLQkJCQlBU1QgdG1wMTI3X0FTVCA9IG51bGw7DQotCQkJCXRtcDEyN19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTI3X0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfc3RydWN0KTsNCi0JCQkJaWRlbnRpZmllcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0cl9mb3J3YXJkX2RlY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfdW5pb246DQotCQkJew0KLQkJCQlBU1QgdG1wMTI4X0FTVCA9IG51bGw7DQotCQkJCXRtcDEyOF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTI4X0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfdW5pb24pOw0KLQkJCQlpZGVudGlmaWVyKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJY29uc3RyX2ZvcndhcmRfZGVjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29uc3RyX2ZvcndhcmRfZGVjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNpbXBsZV90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc2ltcGxlX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2Zsb2F0Og0KLQkJCWNhc2UgTElURVJBTF9kb3VibGU6DQotCQkJY2FzZSBMSVRFUkFMX2xvbmc6DQotCQkJY2FzZSBMSVRFUkFMX3Nob3J0Og0KLQkJCWNhc2UgTElURVJBTF91bnNpZ25lZDoNCi0JCQljYXNlIExJVEVSQUxfY2hhcjoNCi0JCQljYXNlIExJVEVSQUxfd2NoYXI6DQotCQkJY2FzZSBMSVRFUkFMX2Jvb2xlYW46DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCWNhc2UgTElURVJBTF9hbnk6DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQljYXNlIExJVEVSQUxfVmFsdWVCYXNlOg0KLQkJCXsNCi0JCQkJYmFzZV90eXBlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlzaW1wbGVfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3NlcXVlbmNlOg0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX2ZpeGVkOg0KLQkJCXsNCi0JCQkJdGVtcGxhdGVfdHlwZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJc2ltcGxlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlzaW1wbGVfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaW1wbGVfdHlwZV9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY29uc3RyX3R5cGVfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb25zdHJfdHlwZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfc3RydWN0Og0KLQkJCXsNCi0JCQkJc3RydWN0X3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQljb25zdHJfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3VuaW9uOg0KLQkJCXsNCi0JCQkJdW5pb25fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0cl90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCWVudW1fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWNvbnN0cl90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yMSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNvbnN0cl90eXBlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBiYXNlX3R5cGVfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBiYXNlX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2NoYXI6DQotCQkJew0KLQkJCQljaGFyX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQl7DQotCQkJCXdpZGVfY2hhcl90eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYmFzZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQl7DQotCQkJCWJvb2xlYW5fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJhc2VfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX29jdGV0Og0KLQkJCXsNCi0JCQkJb2N0ZXRfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJhc2VfdHlwZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQl7DQotCQkJCWFueV90eXBlKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYmFzZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCXsNCi0JCQkJb2JqZWN0X3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJew0KLQkJCQl2YWx1ZV9iYXNlX3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJCWJvb2xlYW4gc3luUHJlZE1hdGNoZWQxMTkgPSBmYWxzZTsNCi0JCQkJaWYgKCgoKExBKDEpID49IExJVEVSQUxfZmxvYXQgJiYgTEEoMSkgPD0gTElURVJBTF9sb25nKSkgJiYgKF90b2tlblNldF80My5tZW1iZXIoTEEoMikpKSAmJiAoX3Rva2VuU2V0XzQ0Lm1lbWJlcihMQSgzKSkpICYmIChfdG9rZW5TZXRfNDUubWVtYmVyKExBKDQpKSkpKSB7DQotCQkJCQlpbnQgX20xMTkgPSBtYXJrKCk7DQotCQkJCQlzeW5QcmVkTWF0Y2hlZDExOSA9IHRydWU7DQotCQkJCQlpbnB1dFN0YXRlLmd1ZXNzaW5nKys7DQotCQkJCQl0cnkgew0KLQkJCQkJCXsNCi0JCQkJCQlmbG9hdGluZ19wdF90eXBlKCk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQkJc3luUHJlZE1hdGNoZWQxMTkgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJCXJld2luZChfbTExOSk7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCQl9DQotCQkJCWlmICggc3luUHJlZE1hdGNoZWQxMTkgKSB7DQotCQkJCQlmbG9hdGluZ19wdF90eXBlKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCQliYXNlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmICgoKExBKDEpID49IExJVEVSQUxfbG9uZyAmJiBMQSgxKSA8PSBMSVRFUkFMX3Vuc2lnbmVkKSkgJiYgKF90b2tlblNldF80Ni5tZW1iZXIoTEEoMikpKSAmJiAoX3Rva2VuU2V0XzQ3Lm1lbWJlcihMQSgzKSkpICYmIChfdG9rZW5TZXRfNDUubWVtYmVyKExBKDQpKSkpIHsNCi0JCQkJCWludGVnZXJfdHlwZSgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJYmFzZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGJhc2VfdHlwZV9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdGVtcGxhdGVfdHlwZV9zcGVjKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3NlcXVlbmNlOg0KLQkJCXsNCi0JCQkJc2VxdWVuY2VfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJew0KLQkJCQlzdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF93c3RyaW5nOg0KLQkJCXsNCi0JCQkJd2lkZV9zdHJpbmdfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXRlbXBsYXRlX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF9maXhlZDoNCi0JCQl7DQotCQkJCWZpeGVkX3B0X3R5cGUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl0ZW1wbGF0ZV90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHRlbXBsYXRlX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGFueV90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGFueV90eXBlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDEyOV9BU1QgPSBudWxsOw0KLQkJCXRtcDEyOV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxMjlfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2FueSk7DQotCQkJYW55X3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzM0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYW55X3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvYmplY3RfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBvYmplY3RfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMzBfQVNUID0gbnVsbDsNCi0JCQl0bXAxMzBfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTMwX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9PYmplY3QpOw0KLQkJCW9iamVjdF90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9iamVjdF90eXBlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdmFsdWVfYmFzZV90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHZhbHVlX2Jhc2VfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxMzFfQVNUID0gbnVsbDsNCi0JCQl0bXAxMzFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTMxX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9WYWx1ZUJhc2UpOw0KLQkJCXZhbHVlX2Jhc2VfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB2YWx1ZV9iYXNlX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXF1ZW5jZV90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNlcXVlbmNlX3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTMyX0FTVCA9IG51bGw7DQotCQkJdG1wMTMyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEzMl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfc2VxdWVuY2UpOw0KLQkJCW1hdGNoKExUKTsNCi0JCQlzaW1wbGVfdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW9wdF9wb3NfaW50KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKEdUKTsNCi0JCQlzZXF1ZW5jZV90eXBlX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zNCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNlcXVlbmNlX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmaXhlZF9wdF90eXBlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGZpeGVkX3B0X3R5cGVfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTM1X0FTVCA9IG51bGw7DQotCQkJdG1wMTM1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEzNV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZml4ZWQpOw0KLQkJCW1hdGNoKExUKTsNCi0JCQlwb3NpdGl2ZV9pbnRfY29uc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goQ09NTUEpOw0KLQkJCXBvc2l0aXZlX2ludF9jb25zdCgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChHVCk7DQotCQkJZml4ZWRfcHRfdHlwZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBmaXhlZF9wdF90eXBlX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBkZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWYgKChMQSgxKT09SURFTlQpICYmIChMQSgyKT09U0VNSXx8TEEoMik9PUNPTU1BKSkgew0KLQkJCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWRlY2xhcmF0b3JfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09SURFTlQpICYmIChMQSgyKT09TEJSQUNLKSkgew0KLQkJCQljb21wbGV4X2RlY2xhcmF0b3IoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlkZWNsYXJhdG9yX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJDQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzQ4KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZGVjbGFyYXRvcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBsZXhfZGVjbGFyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb21wbGV4X2RlY2xhcmF0b3JfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlhcnJheV9kZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWNvbXBsZXhfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDgpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb21wbGV4X2RlY2xhcmF0b3JfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBhcnJheV9kZWNsYXJhdG9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGFycmF5X2RlY2xhcmF0b3JfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTM5X0FTVCA9IG51bGw7DQotCQkJdG1wMTM5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDEzOV9BU1QpOw0KLQkJCW1hdGNoKElERU5UKTsNCi0JCQl7DQotCQkJaW50IF9jbnQxNzM9MDsNCi0JCQlfbG9vcDE3MzoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUxCUkFDSykpIHsNCi0JCQkJCWZpeGVkX2FycmF5X3NpemUoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlmICggX2NudDE3Mz49MSApIHsgYnJlYWsgX2xvb3AxNzM7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTt9DQotCQkJCX0NCi0JCQkJDQotCQkJCV9jbnQxNzMrKzsNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJYXJyYXlfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNDgpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBhcnJheV9kZWNsYXJhdG9yX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2lnbmVkX2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzaWduZWRfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWYgKChMQSgxKT09TElURVJBTF9zaG9ydCkpIHsNCi0JCQkJc2lnbmVkX3Nob3J0X2ludCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXNpZ25lZF9pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09TElURVJBTF9sb25nKSAmJiAoX3Rva2VuU2V0XzMzLm1lbWJlcihMQSgyKSkpKSB7DQotCQkJCXNpZ25lZF9sb25nX2ludCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXNpZ25lZF9pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKChMQSgxKT09TElURVJBTF9sb25nKSAmJiAoTEEoMik9PUxJVEVSQUxfbG9uZykpIHsNCi0JCQkJc2lnbmVkX2xvbmdsb25nX2ludCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXNpZ25lZF9pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaWduZWRfaW50X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgdW5zaWduZWRfaW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHVuc2lnbmVkX2ludF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCWlmICgoTEEoMSk9PUxJVEVSQUxfdW5zaWduZWQpICYmIChMQSgyKT09TElURVJBTF9zaG9ydCkpIHsNCi0JCQkJdW5zaWduZWRfc2hvcnRfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5zaWduZWRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIGlmICgoTEEoMSk9PUxJVEVSQUxfdW5zaWduZWQpICYmIChMQSgyKT09TElURVJBTF9sb25nKSAmJiAoX3Rva2VuU2V0XzMzLm1lbWJlcihMQSgzKSkpKSB7DQotCQkJCXVuc2lnbmVkX2xvbmdfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5zaWduZWRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIGlmICgoTEEoMSk9PUxJVEVSQUxfdW5zaWduZWQpICYmIChMQSgyKT09TElURVJBTF9sb25nKSAmJiAoTEEoMyk9PUxJVEVSQUxfbG9uZykpIHsNCi0JCQkJdW5zaWduZWRfbG9uZ2xvbmdfaW50KCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJdW5zaWduZWRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJDQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzMzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5zaWduZWRfaW50X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc2lnbmVkX3Nob3J0X2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzaWduZWRfc2hvcnRfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0MF9BU1QgPSBudWxsOw0KLQkJCXRtcDE0MF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDBfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Nob3J0KTsNCi0JCQlzaWduZWRfc2hvcnRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNpZ25lZF9zaG9ydF9pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzaWduZWRfbG9uZ19pbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc2lnbmVkX2xvbmdfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0MV9BU1QgPSBudWxsOw0KLQkJCXRtcDE0MV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2xvbmcpOw0KLQkJCXNpZ25lZF9sb25nX2ludF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBzaWduZWRfbG9uZ19pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzaWduZWRfbG9uZ2xvbmdfaW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHNpZ25lZF9sb25nbG9uZ19pbnRfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTQyX0FTVCA9IG51bGw7DQotCQkJdG1wMTQyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0Ml9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfbG9uZyk7DQotCQkJQVNUIHRtcDE0M19BU1QgPSBudWxsOw0KLQkJCXRtcDE0M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2xvbmcpOw0KLQkJCXNpZ25lZF9sb25nbG9uZ19pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzMzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc2lnbmVkX2xvbmdsb25nX2ludF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHVuc2lnbmVkX3Nob3J0X2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB1bnNpZ25lZF9zaG9ydF9pbnRfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMTQ0X0FTVCA9IG51bGw7DQotCQkJdG1wMTQ0X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0NF9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfdW5zaWduZWQpOw0KLQkJCUFTVCB0bXAxNDVfQVNUID0gbnVsbDsNCi0JCQl0bXAxNDVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTQ1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zaG9ydCk7DQotCQkJdW5zaWduZWRfc2hvcnRfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8zMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHVuc2lnbmVkX3Nob3J0X2ludF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHVuc2lnbmVkX2xvbmdfaW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHVuc2lnbmVkX2xvbmdfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0Nl9BU1QgPSBudWxsOw0KLQkJCXRtcDE0Nl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDZfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Vuc2lnbmVkKTsNCi0JCQlBU1QgdG1wMTQ3X0FTVCA9IG51bGw7DQotCQkJdG1wMTQ3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0N19BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfbG9uZyk7DQotCQkJdW5zaWduZWRfbG9uZ19pbnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzMzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gdW5zaWduZWRfbG9uZ19pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB1bnNpZ25lZF9sb25nbG9uZ19pbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgdW5zaWduZWRfbG9uZ2xvbmdfaW50X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE0OF9BU1QgPSBudWxsOw0KLQkJCXRtcDE0OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNDhfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Vuc2lnbmVkKTsNCi0JCQlBU1QgdG1wMTQ5X0FTVCA9IG51bGw7DQotCQkJdG1wMTQ5X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE0OV9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfbG9uZyk7DQotCQkJQVNUIHRtcDE1MF9BU1QgPSBudWxsOw0KLQkJCXRtcDE1MF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNTBfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2xvbmcpOw0KLQkJCXVuc2lnbmVkX2xvbmdsb25nX2ludF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMzMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSB1bnNpZ25lZF9sb25nbG9uZ19pbnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBtZW1iZXJfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtZW1iZXJfbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDE0Nz0wOw0KLQkJCV9sb29wMTQ3Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTEubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCW1lbWJlcigpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKCBfY250MTQ3Pj0xICkgeyBicmVhayBfbG9vcDE0NzsgfSBlbHNlIHt0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpO30NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJX2NudDE0NysrOw0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQltZW1iZXJfbGlzdF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBtZW1iZXJfbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIG1lbWJlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBtZW1iZXJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl0eXBlX3NwZWMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZGVjbGFyYXRvcnMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goU0VNSSk7DQotCQkJbWVtYmVyX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF80OSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG1lbWJlcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHN3aXRjaF90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc3dpdGNoX3R5cGVfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX2xvbmc6DQotCQkJY2FzZSBMSVRFUkFMX3Nob3J0Og0KLQkJCWNhc2UgTElURVJBTF91bnNpZ25lZDoNCi0JCQl7DQotCQkJCWludGVnZXJfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfY2hhcjoNCi0JCQl7DQotCQkJCWNoYXJfdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQl7DQotCQkJCWJvb2xlYW5fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZW51bToNCi0JCQl7DQotCQkJCWVudW1fdHlwZSgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCXN3aXRjaF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJc3dpdGNoX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI1KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3dpdGNoX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHN3aXRjaF9ib2R5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHN3aXRjaF9ib2R5X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJY2FzZV9zdG10X2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJc3dpdGNoX2JvZHlfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3dpdGNoX2JvZHlfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjYXNlX3N0bXRfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjYXNlX3N0bXRfbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDE1ND0wOw0KLQkJCV9sb29wMTU0Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09TElURVJBTF9jYXNlfHxMQSgxKT09TElURVJBTF9kZWZhdWx0KSkgew0KLQkJCQkJY2FzZV9zdG10KCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlpZiAoIF9jbnQxNTQ+PTEgKSB7IGJyZWFrIF9sb29wMTU0OyB9IGVsc2Uge3Rocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7fQ0KLQkJCQl9DQotCQkJCQ0KLQkJCQlfY250MTU0Kys7DQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWNhc2Vfc3RtdF9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMyk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNhc2Vfc3RtdF9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY2FzZV9zdG10KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNhc2Vfc3RtdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlpbnQgX2NudDE1Nz0wOw0KLQkJCV9sb29wMTU3Og0KLQkJCWRvIHsNCi0JCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQkJY2FzZSBMSVRFUkFMX2Nhc2U6DQotCQkJCXsNCi0JCQkJCUFTVCB0bXAxNTJfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDE1Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE1Ml9BU1QpOw0KLQkJCQkJbWF0Y2goTElURVJBTF9jYXNlKTsNCi0JCQkJCWNvbnN0X2V4cCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJbWF0Y2goQ09MT04pOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJY2FzZSBMSVRFUkFMX2RlZmF1bHQ6DQotCQkJCXsNCi0JCQkJCUFTVCB0bXAxNTRfQVNUID0gbnVsbDsNCi0JCQkJCXRtcDE1NF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE1NF9BU1QpOw0KLQkJCQkJbWF0Y2goTElURVJBTF9kZWZhdWx0KTsNCi0JCQkJCW1hdGNoKENPTE9OKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWRlZmF1bHQ6DQotCQkJCXsNCi0JCQkJCWlmICggX2NudDE1Nz49MSApIHsgYnJlYWsgX2xvb3AxNTc7IH0gZWxzZSB7dGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTt9DQotCQkJCX0NCi0JCQkJfQ0KLQkJCQlfY250MTU3Kys7DQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCWVsZW1lbnRfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChTRU1JKTsNCi0JCQljYXNlX3N0bXRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzUwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY2FzZV9zdG10X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZWxlbWVudF9zcGVjKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGVsZW1lbnRfc3BlY19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXR5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlkZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWVsZW1lbnRfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBlbGVtZW50X3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBlbnVtZXJhdG9yX2xpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZW51bWVyYXRvcl9saXN0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJZW51bWVyYXRvcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJX2xvb3AxNjI6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCWVudW1lcmF0b3IoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTYyOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQllbnVtZXJhdG9yX2xpc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZW51bWVyYXRvcl9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZW51bWVyYXRvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBlbnVtZXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQllbnVtZXJhdG9yX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81MSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGVudW1lcmF0b3JfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvcHRfcG9zX2ludCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBvcHRfcG9zX2ludF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgQ09NTUE6DQotCQkJew0KLQkJCQltYXRjaChDT01NQSk7DQotCQkJCXBvc2l0aXZlX2ludF9jb25zdCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIEdUOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCW9wdF9wb3NfaW50X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81Mik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9wdF9wb3NfaW50X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZml4ZWRfYXJyYXlfc2l6ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBmaXhlZF9hcnJheV9zaXplX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJbWF0Y2goTEJSQUNLKTsNCi0JCQlwb3NpdGl2ZV9pbnRfY29uc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goUkJSQUNLKTsNCi0JCQlmaXhlZF9hcnJheV9zaXplX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81Myk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGZpeGVkX2FycmF5X3NpemVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCByZWFkb25seV9hdHRyX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcmVhZG9ubHlfYXR0cl9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE2MV9BU1QgPSBudWxsOw0KLQkJCXRtcDE2MV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAxNjFfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3JlYWRvbmx5KTsNCi0JCQlBU1QgdG1wMTYyX0FTVCA9IG51bGw7DQotCQkJdG1wMTYyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE2Ml9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfYXR0cmlidXRlKTsNCi0JCQlwYXJhbV90eXBlX3NwZWMoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJcmVhZG9ubHlfYXR0cl9kZWNsYXJhdG9yKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXJlYWRvbmx5X2F0dHJfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSByZWFkb25seV9hdHRyX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBhdHRyX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE2M19BU1QgPSBudWxsOw0KLQkJCXRtcDE2M19BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNjNfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2F0dHJpYnV0ZSk7DQotCQkJcGFyYW1fdHlwZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWF0dHJfZGVjbGFyYXRvcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlhdHRyX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYXR0cl9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgb3B0X21lbWJlcl9saXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIG9wdF9tZW1iZXJfbGlzdF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlfbG9vcDE3OToNCi0JCQlkbyB7DQotCQkJCWlmICgoX3Rva2VuU2V0XzExLm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCQltZW1iZXIoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTc5Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlvcHRfbWVtYmVyX2xpc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gb3B0X21lbWJlcl9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgb3BfYXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIG9wX2F0dHJpYnV0ZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxNjRfQVNUID0gbnVsbDsNCi0JCQl0bXAxNjRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTY0X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9vbmV3YXkpOw0KLQkJCW9wX2F0dHJpYnV0ZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNTQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBvcF9hdHRyaWJ1dGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBvcF90eXBlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgb3BfdHlwZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX1ZhbHVlQmFzZToNCi0JCQl7DQotCQkJCXBhcmFtX3R5cGVfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW9wX3R5cGVfc3BlY19BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTElURVJBTF92b2lkOg0KLQkJCXsNCi0JCQkJQVNUIHRtcDE2NV9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNjVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHRtcDE2NV9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX3ZvaWQpOw0KLQkJCQlvcF90eXBlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8yOSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IG9wX3R5cGVfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHBhcmFtZXRlcl9kY2xzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIHBhcmFtZXRlcl9kY2xzX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJbWF0Y2goTFBBUkVOKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfaW46DQotCQkJY2FzZSBMSVRFUkFMX291dDoNCi0JCQljYXNlIExJVEVSQUxfaW5vdXQ6DQotCQkJew0KLQkJCQlwYXJhbV9kY2xfbGlzdCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFJQQVJFTjoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCXBhcmFtZXRlcl9kY2xzX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF81NSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHBhcmFtZXRlcl9kY2xzX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY29udGV4dF9leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbnRleHRfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxNjhfQVNUID0gbnVsbDsNCi0JCQl0bXAxNjhfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTY4X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9jb250ZXh0KTsNCi0JCQltYXRjaChMUEFSRU4pOw0KLQkJCXN0cmluZ19saXRlcmFsX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJbWF0Y2goUlBBUkVOKTsNCi0JCQljb250ZXh0X2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29udGV4dF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcGFyYW1fZGNsX2xpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcGFyYW1fZGNsX2xpc3RfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlwYXJhbV9kY2woKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wMTkwOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQlwYXJhbV9kY2woKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMTkwOw0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQlwYXJhbV9kY2xfbGlzdF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMjUpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBwYXJhbV9kY2xfbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIHBhcmFtX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwYXJhbV9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfaW46DQotCQkJew0KLQkJCQlBU1QgdG1wMTcyX0FTVCA9IG51bGw7DQotCQkJCXRtcDE3Ml9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTcyX0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfaW4pOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX291dDoNCi0JCQl7DQotCQkJCUFTVCB0bXAxNzNfQVNUID0gbnVsbDsNCi0JCQkJdG1wMTczX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNzNfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9vdXQpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2lub3V0Og0KLQkJCXsNCi0JCQkJQVNUIHRtcDE3NF9BU1QgPSBudWxsOw0KLQkJCQl0bXAxNzRfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDE3NF9BU1QpOw0KLQkJCQltYXRjaChMSVRFUkFMX2lub3V0KTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXBhcmFtX3R5cGVfc3BlYygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlwYXJhbV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI3KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcGFyYW1fZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgc3RyaW5nX2xpdGVyYWxfbGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzdHJpbmdfbGl0ZXJhbF9saXN0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCV9sb29wMTk3Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQltYXRjaChDT01NQSk7DQotCQkJCQlzdHJpbmdfbGl0ZXJhbCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AxOTc7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCXN0cmluZ19saXRlcmFsX2xpc3RfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI1KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gc3RyaW5nX2xpdGVyYWxfbGlzdF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGltcG9ydGVkX3Njb3BlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGltcG9ydGVkX3Njb3BlX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQl7DQotCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJaW1wb3J0ZWRfc2NvcGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNUUklOR19MSVRFUkFMOg0KLQkJCXsNCi0JCQkJc3RyaW5nX2xpdGVyYWwoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlpbXBvcnRlZF9zY29wZV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW1wb3J0ZWRfc2NvcGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCByZWFkb25seV9hdHRyX2RlY2xhcmF0b3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcmVhZG9ubHlfYXR0cl9kZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc2ltcGxlX2RlY2xhcmF0b3IoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMSVRFUkFMX3JhaXNlczoNCi0JCQl7DQotCQkJCXJhaXNlc19leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgU0VNSToNCi0JCQljYXNlIENPTU1BOg0KLQkJCXsNCi0JCQkJew0KLQkJCQlfbG9vcDIxMToNCi0JCQkJZG8gew0KLQkJCQkJaWYgKChMQSgxKT09Q09NTUEpKSB7DQotCQkJCQkJbWF0Y2goQ09NTUEpOw0KLQkJCQkJCXNpbXBsZV9kZWNsYXJhdG9yKCk7DQotCQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQkJfQ0KLQkJCQkJZWxzZSB7DQotCQkJCQkJYnJlYWsgX2xvb3AyMTE7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXJlYWRvbmx5X2F0dHJfZGVjbGFyYXRvcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSByZWFkb25seV9hdHRyX2RlY2xhcmF0b3JfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBhdHRyX2RlY2xhcmF0b3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9kZWNsYXJhdG9yX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJc2ltcGxlX2RlY2xhcmF0b3IoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCWJvb2xlYW4gc3luUHJlZE1hdGNoZWQyMTYgPSBmYWxzZTsNCi0JCQlpZiAoKChMQSgxKT09U0VNSXx8TEEoMSk9PUxJVEVSQUxfZ2V0cmFpc2VzfHxMQSgxKT09TElURVJBTF9zZXRyYWlzZXMpICYmIChfdG9rZW5TZXRfNTYubWVtYmVyKExBKDIpKSkgJiYgKF90b2tlblNldF81Ny5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzU4Lm1lbWJlcihMQSg0KSkpKSkgew0KLQkJCQlpbnQgX20yMTYgPSBtYXJrKCk7DQotCQkJCXN5blByZWRNYXRjaGVkMjE2ID0gdHJ1ZTsNCi0JCQkJaW5wdXRTdGF0ZS5ndWVzc2luZysrOw0KLQkJCQl0cnkgew0KLQkJCQkJew0KLQkJCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQkJCWNhc2UgTElURVJBTF9nZXRyYWlzZXM6DQotCQkJCQl7DQotCQkJCQkJbWF0Y2goTElURVJBTF9nZXRyYWlzZXMpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQkJY2FzZSBMSVRFUkFMX3NldHJhaXNlczoNCi0JCQkJCXsNCi0JCQkJCQltYXRjaChMSVRFUkFMX3NldHJhaXNlcyk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQlkZWZhdWx0Og0KLQkJCQkJew0KLQkJCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHBlKSB7DQotCQkJCQlzeW5QcmVkTWF0Y2hlZDIxNiA9IGZhbHNlOw0KLQkJCQl9DQotCQkJCXJld2luZChfbTIxNik7DQotaW5wdXRTdGF0ZS5ndWVzc2luZy0tOw0KLQkJCX0NCi0JCQlpZiAoIHN5blByZWRNYXRjaGVkMjE2ICkgew0KLQkJCQlhdHRyX3JhaXNlc19leHByKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl9DQotCQkJZWxzZSBpZiAoKExBKDEpPT1TRU1JfHxMQSgxKT09Q09NTUEpICYmIChfdG9rZW5TZXRfNTkubWVtYmVyKExBKDIpKSkgJiYgKF90b2tlblNldF82MC5tZW1iZXIoTEEoMykpKSAmJiAoX3Rva2VuU2V0XzYxLm1lbWJlcihMQSg0KSkpKSB7DQotCQkJCXsNCi0JCQkJX2xvb3AyMTg6DQotCQkJCWRvIHsNCi0JCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgew0KLQkJCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCQlzaW1wbGVfZGVjbGFyYXRvcigpOw0KLQkJCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWJyZWFrIF9sb29wMjE4Ow0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQkNCi0JCQl9DQotCQkJYXR0cl9kZWNsYXJhdG9yX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGF0dHJfZGVjbGFyYXRvcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGF0dHJfcmFpc2VzX2V4cHIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgYXR0cl9yYWlzZXNfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9nZXRyYWlzZXM6DQotCQkJew0KLQkJCQlnZXRfZXhjZXBfZXhwcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJY2FzZSBMSVRFUkFMX3NldHJhaXNlczoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfc2V0cmFpc2VzOg0KLQkJCXsNCi0JCQkJc2V0X2V4Y2VwX2V4cHIoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTRU1JOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCWF0dHJfcmFpc2VzX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gYXR0cl9yYWlzZXNfZXhwcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGdldF9leGNlcF9leHByKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGdldF9leGNlcF9leHByX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE3OF9BU1QgPSBudWxsOw0KLQkJCXRtcDE3OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxNzhfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2dldHJhaXNlcyk7DQotCQkJZXhjZXB0aW9uX2xpc3QoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZ2V0X2V4Y2VwX2V4cHJfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzYyKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZ2V0X2V4Y2VwX2V4cHJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRfZXhjZXBfZXhwcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBzZXRfZXhjZXBfZXhwcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxNzlfQVNUID0gbnVsbDsNCi0JCQl0bXAxNzlfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTc5X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9zZXRyYWlzZXMpOw0KLQkJCWV4Y2VwdGlvbl9saXN0KCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXNldF9leGNlcF9leHByX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHNldF9leGNlcF9leHByX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXhjZXB0aW9uX2xpc3QoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZXhjZXB0aW9uX2xpc3RfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQltYXRjaChMUEFSRU4pOw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlfbG9vcDIyNjoNCi0JCQlkbyB7DQotCQkJCWlmICgoTEEoMSk9PUNPTU1BKSkgew0KLQkJCQkJbWF0Y2goQ09NTUEpOw0KLQkJCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMjI2Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCWV4Y2VwdGlvbl9saXN0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF82Mik7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV4Y2VwdGlvbl9saXN0X0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgY29tcG9uZW50X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBjb21wb25lbnRfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBDT0xPTjoNCi0JCQl7DQotCQkJCWNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfc3VwcG9ydHM6DQotCQkJew0KLQkJCQlzdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMQ1VSTFk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJbWF0Y2goTENVUkxZKTsNCi0JCQljb21wb25lbnRfYm9keSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSQ1VSTFkpOw0KLQkJCWNvbXBvbmVudF9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29tcG9uZW50X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE4NV9BU1QgPSBudWxsOw0KLQkJCXRtcDE4NV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxODVfQVNUKTsNCi0JCQltYXRjaChDT0xPTik7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJY29tcG9uZW50X2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzIzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gY29tcG9uZW50X2luaGVyaXRhbmNlX3NwZWNfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBzdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1Qgc3VwcG9ydGVkX2ludGVyZmFjZV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE4Nl9BU1QgPSBudWxsOw0KLQkJCXRtcDE4Nl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxODZfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3N1cHBvcnRzKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQl7DQotCQkJX2xvb3AyMzQ6DQotCQkJZG8gew0KLQkJCQlpZiAoKExBKDEpPT1DT01NQSkpIHsNCi0JCQkJCW1hdGNoKENPTU1BKTsNCi0JCQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCX0NCi0JCQkJZWxzZSB7DQotCQkJCQlicmVhayBfbG9vcDIzNDsNCi0JCQkJfQ0KLQkJCQkNCi0JCQl9IHdoaWxlICh0cnVlKTsNCi0JCQl9DQotCQkJc3VwcG9ydGVkX2ludGVyZmFjZV9zcGVjX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF82Myk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHN1cHBvcnRlZF9pbnRlcmZhY2Vfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudF9ib2R5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGNvbXBvbmVudF9ib2R5X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCV9sb29wMjM4Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfNjQubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWNvbXBvbmVudF9leHBvcnQoKTsNCi0JCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWJyZWFrIF9sb29wMjM4Ow0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gd2hpbGUgKHRydWUpOw0KLQkJCX0NCi0JCQljb21wb25lbnRfYm9keV9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTMpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb21wb25lbnRfYm9keV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbXBvbmVudF9leHBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY29tcG9uZW50X2V4cG9ydF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9wcm92aWRlczoNCi0JCQl7DQotCQkJCXByb3ZpZGVzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3VzZXM6DQotCQkJew0KLQkJCQl1c2VzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2VtaXRzOg0KLQkJCXsNCi0JCQkJZW1pdHNfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcHVibGlzaGVzOg0KLQkJCXsNCi0JCQkJcHVibGlzaGVzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX2NvbnN1bWVzOg0KLQkJCXsNCi0JCQkJY29uc3VtZXNfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWF0dHJfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQljb21wb25lbnRfZXhwb3J0X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF82NSk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGNvbXBvbmVudF9leHBvcnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBwcm92aWRlc19kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgcHJvdmlkZXNfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE5NF9BU1QgPSBudWxsOw0KLQkJCXRtcDE5NF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxOTRfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3Byb3ZpZGVzKTsNCi0JCQlpbnRlcmZhY2VfdHlwZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXByb3ZpZGVzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBwcm92aWRlc19kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCB1c2VzX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCB1c2VzX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxOTVfQVNUID0gbnVsbDsNCi0JCQl0bXAxOTVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTk1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF91c2VzKTsNCi0JCQl7DQotCQkJc3dpdGNoICggTEEoMSkpIHsNCi0JCQljYXNlIExJVEVSQUxfbXVsdGlwbGU6DQotCQkJew0KLQkJCQlBU1QgdG1wMTk2X0FTVCA9IG51bGw7DQotCQkJCXRtcDE5Nl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgdG1wMTk2X0FTVCk7DQotCQkJCW1hdGNoKExJVEVSQUxfbXVsdGlwbGUpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBTQ09QRU9QOg0KLQkJCWNhc2UgSURFTlQ6DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlpbnRlcmZhY2VfdHlwZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXVzZXNfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHVzZXNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZW1pdHNfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGVtaXRzX2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAxOTdfQVNUID0gbnVsbDsNCi0JCQl0bXAxOTdfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMTk3X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9lbWl0cyk7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQllbWl0c19kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZW1pdHNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcHVibGlzaGVzX2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwdWJsaXNoZXNfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE5OF9BU1QgPSBudWxsOw0KLQkJCXRtcDE5OF9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxOThfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3B1Ymxpc2hlcyk7DQotCQkJc2NvcGVkX25hbWUoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJaWRlbnRpZmllcigpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlwdWJsaXNoZXNfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IHB1Ymxpc2hlc19kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBjb25zdW1lc19kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgY29uc3VtZXNfZGNsX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDE5OV9BU1QgPSBudWxsOw0KLQkJCXRtcDE5OV9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAxOTlfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX2NvbnN1bWVzKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWNvbnN1bWVzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBjb25zdW1lc19kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBpbnRlcmZhY2VfdHlwZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBpbnRlcmZhY2VfdHlwZV9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgU0NPUEVPUDoNCi0JCQljYXNlIElERU5UOg0KLQkJCXsNCi0JCQkJc2NvcGVkX25hbWUoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX09iamVjdDoNCi0JCQl7DQotCQkJCUFTVCB0bXAyMDBfQVNUID0gbnVsbDsNCi0JCQkJdG1wMjAwX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCB0bXAyMDBfQVNUKTsNCi0JCQkJbWF0Y2goTElURVJBTF9PYmplY3QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJaW50ZXJmYWNlX3R5cGVfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzI5KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaW50ZXJmYWNlX3R5cGVfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBob21lX2hlYWRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBob21lX2hlYWRlcl9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAyMDFfQVNUID0gbnVsbDsNCi0JCQl0bXAyMDFfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjAxX0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9ob21lKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgQ09MT046DQotCQkJew0KLQkJCQlob21lX2luaGVyaXRhbmNlX3NwZWMoKTsNCi0JCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCWNhc2UgTElURVJBTF9tYW5hZ2VzOg0KLQkJCXsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWRlZmF1bHQ6DQotCQkJew0KLQkJCQl0aHJvdyBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oTFQoMSksIGdldEZpbGVuYW1lKCkpOw0KLQkJCX0NCi0JCQl9DQotCQkJfQ0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9zdXBwb3J0czoNCi0JCQl7DQotCQkJCXN1cHBvcnRlZF9pbnRlcmZhY2Vfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfbWFuYWdlczoNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQltYXRjaChMSVRFUkFMX21hbmFnZXMpOw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9wcmltYXJ5a2V5Og0KLQkJCXsNCi0JCQkJcHJpbWFyeV9rZXlfc3BlYygpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExDVVJMWToNCi0JCQl7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlkZWZhdWx0Og0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKExUKDEpLCBnZXRGaWxlbmFtZSgpKTsNCi0JCQl9DQotCQkJfQ0KLQkJCX0NCi0JCQlob21lX2hlYWRlcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTQpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBob21lX2hlYWRlcl9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfYm9keSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBob21lX2JvZHlfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQltYXRjaChMQ1VSTFkpOw0KLQkJCXsNCi0JCQlfbG9vcDI1ODoNCi0JCQlkbyB7DQotCQkJCWlmICgoX3Rva2VuU2V0XzY2Lm1lbWJlcihMQSgxKSkpKSB7DQotCQkJCQlob21lX2V4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyNTg7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJaG9tZV9ib2R5X0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGhvbWVfYm9keV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfaW5oZXJpdGFuY2Vfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBob21lX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjA1X0FTVCA9IG51bGw7DQotCQkJdG1wMjA1X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIwNV9BU1QpOw0KLQkJCW1hdGNoKENPTE9OKTsNCi0JCQlzY29wZWRfbmFtZSgpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQlob21lX2luaGVyaXRhbmNlX3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzY3KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaG9tZV9pbmhlcml0YW5jZV9zcGVjX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgcHJpbWFyeV9rZXlfc3BlYygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBwcmltYXJ5X2tleV9zcGVjX0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJQVNUIHRtcDIwNl9BU1QgPSBudWxsOw0KLQkJCXRtcDIwNl9BU1QgPSBhc3RGYWN0b3J5LmNyZWF0ZShMVCgxKSk7DQotCQkJYXN0RmFjdG9yeS5tYWtlQVNUUm9vdChjdXJyZW50QVNULCB0bXAyMDZfQVNUKTsNCi0JCQltYXRjaChMSVRFUkFMX3ByaW1hcnlrZXkpOw0KLQkJCXNjb3BlZF9uYW1lKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXByaW1hcnlfa2V5X3NwZWNfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzE0KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gcHJpbWFyeV9rZXlfc3BlY19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGhvbWVfZXhwb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGhvbWVfZXhwb3J0X0FTVCA9IG51bGw7DQotCQkNCi0JCXRyeSB7ICAgICAgLy8gZm9yIGVycm9yIGhhbmRsaW5nDQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBQUkVQUk9DX0RJUkVDVElWRToNCi0JCQljYXNlIFNDT1BFT1A6DQotCQkJY2FzZSBJREVOVDoNCi0JCQljYXNlIExJVEVSQUxfY29uc3Q6DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVkZWY6DQotCQkJY2FzZSBMSVRFUkFMX25hdGl2ZToNCi0JCQljYXNlIExJVEVSQUxfZmxvYXQ6DQotCQkJY2FzZSBMSVRFUkFMX2RvdWJsZToNCi0JCQljYXNlIExJVEVSQUxfbG9uZzoNCi0JCQljYXNlIExJVEVSQUxfc2hvcnQ6DQotCQkJY2FzZSBMSVRFUkFMX3Vuc2lnbmVkOg0KLQkJCWNhc2UgTElURVJBTF9jaGFyOg0KLQkJCWNhc2UgTElURVJBTF93Y2hhcjoNCi0JCQljYXNlIExJVEVSQUxfYm9vbGVhbjoNCi0JCQljYXNlIExJVEVSQUxfb2N0ZXQ6DQotCQkJY2FzZSBMSVRFUkFMX2FueToNCi0JCQljYXNlIExJVEVSQUxfT2JqZWN0Og0KLQkJCWNhc2UgTElURVJBTF9zdHJ1Y3Q6DQotCQkJY2FzZSBMSVRFUkFMX3VuaW9uOg0KLQkJCWNhc2UgTElURVJBTF9lbnVtOg0KLQkJCWNhc2UgTElURVJBTF9zdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX3dzdHJpbmc6DQotCQkJY2FzZSBMSVRFUkFMX2V4Y2VwdGlvbjoNCi0JCQljYXNlIExJVEVSQUxfb25ld2F5Og0KLQkJCWNhc2UgTElURVJBTF92b2lkOg0KLQkJCWNhc2UgTElURVJBTF9WYWx1ZUJhc2U6DQotCQkJY2FzZSBMSVRFUkFMX3R5cGVpZDoNCi0JCQljYXNlIExJVEVSQUxfdHlwZXByZWZpeDoNCi0JCQljYXNlIExJVEVSQUxfcmVhZG9ubHk6DQotCQkJY2FzZSBMSVRFUkFMX2F0dHJpYnV0ZToNCi0JCQl7DQotCQkJCWV4cG9ydCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZmFjdG9yeToNCi0JCQl7DQotCQkJCWZhY3RvcnlfZGNsKCk7DQotCQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQkJbWF0Y2goU0VNSSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIExJVEVSQUxfZmluZGVyOg0KLQkJCXsNCi0JCQkJZmluZGVyX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCW1hdGNoKFNFTUkpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJaG9tZV9leHBvcnRfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzY4KTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gaG9tZV9leHBvcnRfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmYWN0b3J5X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBmYWN0b3J5X2RjbF9BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAyMDlfQVNUID0gbnVsbDsNCi0JCQl0bXAyMDlfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjA5X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9mYWN0b3J5KTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExQQVJFTik7DQotCQkJaW5pdF9wYXJhbV9kZWNscygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9yYWlzZXM6DQotCQkJew0KLQkJCQlyYWlzZXNfZXhwcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZmFjdG9yeV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZmFjdG9yeV9kY2xfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBmaW5kZXJfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGZpbmRlcl9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjEyX0FTVCA9IG51bGw7DQotCQkJdG1wMjEyX0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIxMl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZmluZGVyKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExQQVJFTik7DQotCQkJaW5pdF9wYXJhbV9kZWNscygpOw0KLQkJCWFzdEZhY3RvcnkuYWRkQVNUQ2hpbGQoY3VycmVudEFTVCwgcmV0dXJuQVNUKTsNCi0JCQltYXRjaChSUEFSRU4pOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTElURVJBTF9yYWlzZXM6DQotCQkJew0KLQkJCQlyYWlzZXNfZXhwcigpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZmluZGVyX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBmaW5kZXJfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXZlbnRfYWJzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGV2ZW50X2Fic19BU1QgPSBudWxsOw0KLQkJDQotCQl0cnkgeyAgICAgIC8vIGZvciBlcnJvciBoYW5kbGluZw0KLQkJCUFTVCB0bXAyMTVfQVNUID0gbnVsbDsNCi0JCQl0bXAyMTVfQVNUID0gYXN0RmFjdG9yeS5jcmVhdGUoTFQoMSkpOw0KLQkJCWFzdEZhY3RvcnkubWFrZUFTVFJvb3QoY3VycmVudEFTVCwgdG1wMjE1X0FTVCk7DQotCQkJbWF0Y2goTElURVJBTF9hYnN0cmFjdCk7DQotCQkJZXZlbnRfaGVhZGVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCXsNCi0JCQlzd2l0Y2ggKCBMQSgxKSkgew0KLQkJCWNhc2UgTENVUkxZOg0KLQkJCWNhc2UgQ09MT046DQotCQkJY2FzZSBMSVRFUkFMX3N1cHBvcnRzOg0KLQkJCXsNCi0JCQkJZXZlbnRfYWJzX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZXZlbnRfYWJzX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV2ZW50X2Fic19BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50X2N1c3RvbSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBldmVudF9jdXN0b21fQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjE2X0FTVCA9IG51bGw7DQotCQkJdG1wMjE2X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIxNl9BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfY3VzdG9tKTsNCi0JCQlldmVudF9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZXZlbnRfZWxlbV9kY2woKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJZXZlbnRfY3VzdG9tX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV2ZW50X2N1c3RvbV9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50X2RjbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBldmVudF9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlldmVudF9oZWFkZXIoKTsNCi0JCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJew0KLQkJCXN3aXRjaCAoIExBKDEpKSB7DQotCQkJY2FzZSBMQ1VSTFk6DQotCQkJY2FzZSBDT0xPTjoNCi0JCQljYXNlIExJVEVSQUxfc3VwcG9ydHM6DQotCQkJew0KLQkJCQlldmVudF9lbGVtX2RjbCgpOw0KLQkJCQlhc3RGYWN0b3J5LmFkZEFTVENoaWxkKGN1cnJlbnRBU1QsIHJldHVybkFTVCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQljYXNlIFNFTUk6DQotCQkJew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJZGVmYXVsdDoNCi0JCQl7DQotCQkJCXRocm93IG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihMVCgxKSwgZ2V0RmlsZW5hbWUoKSk7DQotCQkJfQ0KLQkJCX0NCi0JCQl9DQotCQkJZXZlbnRfZGNsX0FTVCA9IChBU1QpY3VycmVudEFTVC5yb290Ow0KLQkJfQ0KLQkJY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIGV4KSB7DQotCQkJaWYgKGlucHV0U3RhdGUuZ3Vlc3Npbmc9PTApIHsNCi0JCQkJcmVwb3J0RXJyb3IoZXgpOw0KLQkJCQlyZWNvdmVyKGV4LF90b2tlblNldF8xMCk7DQotCQkJfSBlbHNlIHsNCi0JCQkgIHRocm93IGV4Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybkFTVCA9IGV2ZW50X2RjbF9BU1Q7DQotCX0NCi0JDQotCXB1YmxpYyBmaW5hbCB2b2lkIGV2ZW50X2hlYWRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiwgVG9rZW5TdHJlYW1FeGNlcHRpb24gew0KLQkJDQotCQlyZXR1cm5BU1QgPSBudWxsOw0KLQkJQVNUUGFpciBjdXJyZW50QVNUID0gbmV3IEFTVFBhaXIoKTsNCi0JCUFTVCBldmVudF9oZWFkZXJfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQlBU1QgdG1wMjE3X0FTVCA9IG51bGw7DQotCQkJdG1wMjE3X0FTVCA9IGFzdEZhY3RvcnkuY3JlYXRlKExUKDEpKTsNCi0JCQlhc3RGYWN0b3J5Lm1ha2VBU1RSb290KGN1cnJlbnRBU1QsIHRtcDIxN19BU1QpOw0KLQkJCW1hdGNoKExJVEVSQUxfZXZlbnR0eXBlKTsNCi0JCQlpZGVudGlmaWVyKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCWV2ZW50X2hlYWRlcl9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfNjkpOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBldmVudF9oZWFkZXJfQVNUOw0KLQl9DQotCQ0KLQlwdWJsaWMgZmluYWwgdm9pZCBldmVudF9hYnNfZGNsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uLCBUb2tlblN0cmVhbUV4Y2VwdGlvbiB7DQotCQkNCi0JCXJldHVybkFTVCA9IG51bGw7DQotCQlBU1RQYWlyIGN1cnJlbnRBU1QgPSBuZXcgQVNUUGFpcigpOw0KLQkJQVNUIGV2ZW50X2Fic19kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl2YWx1ZV9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExDVVJMWSk7DQotCQkJew0KLQkJCV9sb29wMjcyOg0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyNzI7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJZXZlbnRfYWJzX2RjbF9BU1QgPSAoQVNUKWN1cnJlbnRBU1Qucm9vdDsNCi0JCX0NCi0JCWNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgew0KLQkJCWlmIChpbnB1dFN0YXRlLmd1ZXNzaW5nPT0wKSB7DQotCQkJCXJlcG9ydEVycm9yKGV4KTsNCi0JCQkJcmVjb3ZlcihleCxfdG9rZW5TZXRfMTApOw0KLQkJCX0gZWxzZSB7DQotCQkJICB0aHJvdyBleDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm5BU1QgPSBldmVudF9hYnNfZGNsX0FTVDsNCi0JfQ0KLQkNCi0JcHVibGljIGZpbmFsIHZvaWQgZXZlbnRfZWxlbV9kY2woKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24sIFRva2VuU3RyZWFtRXhjZXB0aW9uIHsNCi0JCQ0KLQkJcmV0dXJuQVNUID0gbnVsbDsNCi0JCUFTVFBhaXIgY3VycmVudEFTVCA9IG5ldyBBU1RQYWlyKCk7DQotCQlBU1QgZXZlbnRfZWxlbV9kY2xfQVNUID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsgICAgICAvLyBmb3IgZXJyb3IgaGFuZGxpbmcNCi0JCQl2YWx1ZV9pbmhlcml0YW5jZV9zcGVjKCk7DQotCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCW1hdGNoKExDVVJMWSk7DQotCQkJew0KLQkJCV9sb29wMjc4Og0KLQkJCWRvIHsNCi0JCQkJaWYgKChfdG9rZW5TZXRfMTUubWVtYmVyKExBKDEpKSkpIHsNCi0JCQkJCWV4cG9ydCgpOw0KLQkJCQkJYXN0RmFjdG9yeS5hZGRBU1RDaGlsZChjdXJyZW50QVNULCByZXR1cm5BU1QpOw0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJYnJlYWsgX2xvb3AyNzg7DQotCQkJCX0NCi0JCQkJDQotCQkJfSB3aGlsZSAodHJ1ZSk7DQotCQkJfQ0KLQkJCW1hdGNoKFJDVVJMWSk7DQotCQkJZXZlbnRfZWxlbV9kY2xfQVNUID0gKEFTVCljdXJyZW50QVNULnJvb3Q7DQotCQl9DQotCQljYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsNCi0JCQlpZiAoaW5wdXRTdGF0ZS5ndWVzc2luZz09MCkgew0KLQkJCQlyZXBvcnRFcnJvcihleCk7DQotCQkJCXJlY292ZXIoZXgsX3Rva2VuU2V0XzEwKTsNCi0JCQl9IGVsc2Ugew0KLQkJCSAgdGhyb3cgZXg7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuQVNUID0gZXZlbnRfZWxlbV9kY2xfQVNUOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfdG9rZW5OYW1lcyA9IHsNCi0JCSI8MD4iLA0KLQkJIkVPRiIsDQotCQkiPDI+IiwNCi0JCSJOVUxMX1RSRUVfTE9PS0FIRUFEIiwNCi0JCSI7IiwNCi0JCSJcImFic3RyYWN0XCIiLA0KLQkJIlwibG9jYWxcIiIsDQotCQkiXCJpbnRlcmZhY2VcIiIsDQotCQkiXCJjdXN0b21cIiIsDQotCQkiXCJ2YWx1ZXR5cGVcIiIsDQotCQkiXCJldmVudHR5cGVcIiIsDQotCQkiXCJtb2R1bGVcIiIsDQotCQkieyIsDQotCQkifSIsDQotCQkiYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIiwNCi0JCSI6IiwNCi0JCSIsIiwNCi0JCSI6OiIsDQotCQkiYW4gaWRlbnRpZmVyIiwNCi0JCSJcInRydW5jYXRhYmxlXCIiLA0KLQkJIlwic3VwcG9ydHNcIiIsDQotCQkiXCJwdWJsaWNcIiIsDQotCQkiXCJwcml2YXRlXCIiLA0KLQkJIlwiZmFjdG9yeVwiIiwNCi0JCSIoIiwNCi0JCSIpIiwNCi0JCSJcImluXCIiLA0KLQkJIlwiY29uc3RcIiIsDQotCQkiPSIsDQotCQkifCIsDQotCQkiXiIsDQotCQkiJiIsDQotCQkiPDwiLA0KLQkJIj4+IiwNCi0JCSIrIiwNCi0JCSItIiwNCi0JCSIqIiwNCi0JCSIvIiwNCi0JCSIlIiwNCi0JCSJ+IiwNCi0JCSJcIlRSVUVcIiIsDQotCQkiXCJGQUxTRVwiIiwNCi0JCSJcInR5cGVkZWZcIiIsDQotCQkiXCJuYXRpdmVcIiIsDQotCQkiXCJmbG9hdFwiIiwNCi0JCSJcImRvdWJsZVwiIiwNCi0JCSJcImxvbmdcIiIsDQotCQkiXCJzaG9ydFwiIiwNCi0JCSJcInVuc2lnbmVkXCIiLA0KLQkJIlwiY2hhclwiIiwNCi0JCSJcIndjaGFyXCIiLA0KLQkJIlwiYm9vbGVhblwiIiwNCi0JCSJcIm9jdGV0XCIiLA0KLQkJIlwiYW55XCIiLA0KLQkJIlwiT2JqZWN0XCIiLA0KLQkJIlwic3RydWN0XCIiLA0KLQkJIlwidW5pb25cIiIsDQotCQkiXCJzd2l0Y2hcIiIsDQotCQkiXCJjYXNlXCIiLA0KLQkJIlwiZGVmYXVsdFwiIiwNCi0JCSJcImVudW1cIiIsDQotCQkiXCJzZXF1ZW5jZVwiIiwNCi0JCSI8IiwNCi0JCSI+IiwNCi0JCSJcInN0cmluZ1wiIiwNCi0JCSJcIndzdHJpbmdcIiIsDQotCQkiWyIsDQotCQkiXSIsDQotCQkiXCJleGNlcHRpb25cIiIsDQotCQkiXCJvbmV3YXlcIiIsDQotCQkiXCJ2b2lkXCIiLA0KLQkJIlwib3V0XCIiLA0KLQkJIlwiaW5vdXRcIiIsDQotCQkiXCJyYWlzZXNcIiIsDQotCQkiXCJjb250ZXh0XCIiLA0KLQkJIlwiZml4ZWRcIiIsDQotCQkiXCJWYWx1ZUJhc2VcIiIsDQotCQkiXCJpbXBvcnRcIiIsDQotCQkiXCJ0eXBlaWRcIiIsDQotCQkiXCJ0eXBlcHJlZml4XCIiLA0KLQkJIlwicmVhZG9ubHlcIiIsDQotCQkiXCJhdHRyaWJ1dGVcIiIsDQotCQkiXCJnZXRyYWlzZXNcIiIsDQotCQkiXCJzZXRyYWlzZXNcIiIsDQotCQkiXCJjb21wb25lbnRcIiIsDQotCQkiXCJwcm92aWRlc1wiIiwNCi0JCSJcInVzZXNcIiIsDQotCQkiXCJtdWx0aXBsZVwiIiwNCi0JCSJcImVtaXRzXCIiLA0KLQkJIlwicHVibGlzaGVzXCIiLA0KLQkJIlwiY29uc3VtZXNcIiIsDQotCQkiXCJob21lXCIiLA0KLQkJIlwibWFuYWdlc1wiIiwNCi0JCSJcInByaW1hcnlrZXlcIiIsDQotCQkiXCJmaW5kZXJcIiIsDQotCQkiYW4gaW50ZWdlciB2YWx1ZSIsDQotCQkiYW4gb2N0YWwgdmFsdWUiLA0KLQkJImEgaGV4YWRlY2ltYWwgdmFsdWUgdmFsdWUiLA0KLQkJImEgc3RyaW5nIGxpdGVyYWwiLA0KLQkJImEgd2lkZSBzdHJpbmcgbGl0ZXJhbCIsDQotCQkiYSBjaGFyYWN0ZXIgbGl0ZXJhbCIsDQotCQkiYSB3aWRlIGNoYXJhY3RlciBsaXRlcmFsIiwNCi0JCSJGSVhFRCIsDQotCQkiYSBmbG9hdGluZyBwb2ludCB2YWx1ZSIsDQotCQkiPyIsDQotCQkiLiIsDQotCQkiISIsDQotCQkid2hpdGUgc3BhY2UiLA0KLQkJImEgY29tbWVudCIsDQotCQkiYSBjb21tZW50IiwNCi0JCSJhbiBlc2NhcGUgc2VxdWVuY2UiLA0KLQkJImFuIGVzY2FwZWQgY2hhcmFjdGVyIHZhbHVlIiwNCi0JCSJhIGRpZ2l0IiwNCi0JCSJhIG5vbi16ZXJvIGRpZ2l0IiwNCi0JCSJhbiBvY3RhbCBkaWdpdCIsDQotCQkiYSBoZXhhZGVjaW1hbCBkaWdpdCIsDQotCQkiYW4gZXNjYXBlZCBpZGVudGlmZXIiDQotCX07DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFRva2VuVHlwZUFTVENsYXNzTWFwKCkgew0KLQkJdG9rZW5UeXBlVG9BU1RDbGFzc01hcD1udWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjYxMDIxMDg5OTM3NDkzOTg0TCwgMTM1MzE1NDcyTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8wID0gbmV3IEJpdFNldChta190b2tlblNldF8wKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAyTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEyNjEwMjEwODk5Mzc0OTM5ODRMLCAxMzUzMjM2NjRMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDI5OTAyNEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zID0gbmV3IEJpdFNldChta190b2tlblNldF8zKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0NzcwODY4MjEwTCwgMTM1NTE2Mjc1TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80ID0gbmV3IEJpdFNldChta190b2tlblNldF80KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzNjAyODYyMTA5NzExODMxMDU2TCwgNjE0N0wsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzYoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNTkwODcxODMxMzIxNDUwOTA0MkwsIDEzNTUxNjI3NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzcoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTM0NzYwMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF83ID0gbmV3IEJpdFNldChta190b2tlblNldF83KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfOCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0NzcyNDQxMDc0TCwgMTM1NTE2Mjc1TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF84ID0gbmV3IEJpdFNldChta190b2tlblNldF84KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfOSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjYxMDIxMDg5OTM3NTAyMTc4TCwgMTM1MzE1NDcyTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF85ID0gbmV3IEJpdFNldChta190b2tlblNldF85KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTAoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTZMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTAgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEwKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTEoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMzYwMjg2MjEwOTcxMDc0NTYwMEwsIDYxNDdMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzExID0gbmV3IEJpdFNldChta190b2tlblNldF8xMSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzEyKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC01NDc2Mzk0MTg5NTI5MzA1MDcyTCwgMTc5ODU5Njg2NTFMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzEyID0gbmV3IEJpdFNldChta190b2tlblNldF8xMigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzEzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgxOTJMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTMgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzEzKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTQoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNDA5NkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0NzcwODE5MDcyTCwgMjQ5OTcxTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8xNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMTUoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8xNigpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0Nzg1NTA3MzI4TCwgMTA3Mzk5MTc5NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTYgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE2KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTcoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMzM1NTg1MjhMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTcgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE3KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTgoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNjk2MzJMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMTkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzE0ODc2MDA4NjUyNjRMLCAxNzk4NTE3NTU2MEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMTkgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzE5KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjAoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTI5NzAzMjI5NDc4NTQ5OTEzNkwsIDI0OTk3MUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjAgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIwKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjEoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMjYyMTYwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIxID0gbmV3IEJpdFNldChta190b2tlblNldF8yMSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIyKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEyOTcwMzIyOTQ3ODU1MDczMjhMLCAyNDk5NzFMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzIyID0gbmV3IEJpdFNldChta190b2tlblNldF8yMigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzIzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEwNTI2NzJMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjMgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzIzKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjQoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTExODIwOEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8yNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMjQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzMzU1NDQzMkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8yNSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMjUoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8yNigpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxNkwsIDEwMjRMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI2ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzI3KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDMzNjE5OTY4TCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI3ID0gbmV3IEJpdFNldChta190b2tlblNldF8yNygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzI4KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDM2MDExMjA0ODMzMzEyNzY4TCwgNDA5OUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMjggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzI4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMjkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMjYyMTQ0TCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzI5ID0gbmV3IEJpdFNldChta190b2tlblNldF8yOSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzMwKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDMzNjE5OTg0TCwgNzg2OTQ0TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zMCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzAoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zMSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzOTAwMTE1OTEwNjU2TCwgMTA5NzM2NDE0NDEyOEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMzEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzMxKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMzIoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzIwMzY4MjExMjMwNTZMLCA4TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zMiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzIoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zMygpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjgyMDg5MzY4MEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zMyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzMoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zNCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjg1NDQ0ODExMkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zNCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzQoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zNSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjI4NDI1MjE0NEwsIDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzM1ID0gbmV3IEJpdFNldChta190b2tlblNldF8zNSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzM2KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC05MjIzMzcyMDM1MjEwNTEwMzIwTCwgOEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMzYgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzM2KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfMzcoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzIwMzMwNjMwMjY2NzJMLCA4TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF8zNyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfMzcoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF8zOCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAyMDE3ODEyNDc4NEwsIDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzM4ID0gbmV3IEJpdFNldChta190b2tlblNldF8zOCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzM5KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC05MjIzMzcxOTY4NjM4NTE3MjMyTCwgOEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfMzkgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzM5KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNDAoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzE0ODc2MDIxODAwODBMLCA4TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80MCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDAoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80MSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzM3MjAzNjg1NDcxMDI3MkwsIDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQxID0gbmV3IEJpdFNldChta190b2tlblNldF80MSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQyKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDMzODE2NTkyTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQyID0gbmV3IEJpdFNldChta190b2tlblNldF80MigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC05MjIzMzM2ODUyNDgyMzU5MjgwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQzID0gbmV3IEJpdFNldChta190b2tlblNldF80MygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQ0KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IC03OTYyMzQ3MDQ3MDM2MTc4NDQ2TCwgMTA5NzUwMDI0NjU0OEwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNDQgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzQ0KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNDUoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTQ3NTU4MDEyMDY3NzMyODg5NzRMLCAxMDk4Njk3OTI0NTk5TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80NSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDUoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80NigpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtOTIyMzE2MDkzMDYyMTkxNTEyMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80NiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDYoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF80NygpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAtNzk2MjI3NjY3ODI5MjAwMDc4MkwsIDEwOTc1MDAyNDY1NDhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQ3ID0gbmV3IEJpdFNldChta190b2tlblNldF80NygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQ4KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDY1NTUyTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzQ4ID0gbmV3IEJpdFNldChta190b2tlblNldF80OCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzQ5KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDM2MDI4NjIxMDk3MTA3NTM3OTJMLCA2MTQ3TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF80OSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNDkoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81MCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyA4NjQ2OTExMjg0NTUxNDM0MjRMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTAgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzUwKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTEoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNzM3MjhMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzUxKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTIoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTIgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzUyKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTMoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgNjU1NTJMLCA0TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81MyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNTMoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81NCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAzNjAxMTIwNDgzMzMxMjc2OEwsIDQxNjNMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzU0ID0gbmV3IEJpdFNldChta190b2tlblNldF81NCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzU1KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDE2TCwgMTUzNkwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTUgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzU1KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTYoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTI5NzAzMjI5NDgwMjI4NDU0NEwsIDExOTc3MjM3NjNMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzU2ID0gbmV3IEJpdFNldChta190b2tlblNldF81NigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzU3KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgyMTQ1NjEzMjI0MjY1ODkyMDBMLCAxMDgyMzgyNDUxTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF81NyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNTcoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF81OCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyA4MzU4NjgwNDEwMzgzMTU1MTg2TCwgMTA5ODU3MzQwNDI3NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNTggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzU4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNTkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTI5NzAzMjI5NDc4NTUwNzMyOEwsIDExOTc3MjM3NjNMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzU5ID0gbmV3IEJpdFNldChta190b2tlblNldF81OSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzYwKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgyMTQ1NjEzMjI0MjY2NTQ3MzZMLCAxMDgyMzgyNDUxTCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82MCA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjAoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF82MSgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyA4MzU4NjgwNDEwMzQ5NTM1MjE4TCwgMTA5ODY5NzEzNjI0M0wsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNjEgPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzYxKCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNjIoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTZMLCA1MjQyODhMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzYyID0gbmV3IEJpdFNldChta190b2tlblNldF82MigpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzYzKCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDQwOTZMLCAyNjg0MzU0NTZMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzYzID0gbmV3IEJpdFNldChta190b2tlblNldF82MygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzY0KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDBMLCAxMjM5Mjg1NzZMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzY0ID0gbmV3IEJpdFNldChta190b2tlblNldF82NCgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzY1KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDgxOTJMLCAxMjM5Mjg1NzZMLCAwTCwgMEx9Ow0KLQkJcmV0dXJuIGRhdGE7DQotCX0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCaXRTZXQgX3Rva2VuU2V0XzY1ID0gbmV3IEJpdFNldChta190b2tlblNldF82NSgpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZ1tdIG1rX3Rva2VuU2V0XzY2KCkgew0KLQkJbG9uZ1tdIGRhdGEgPSB7IDEyOTcwMzIyOTQ3NzkyMDc2ODBMLCAxMDczOTkxNzk1TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82NiA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjYoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF82NygpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMDQ4NTc2TCwgMjY4NDM1NDU2TCwgMEwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82NyA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjcoKSk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmdbXSBta190b2tlblNldF82OCgpIHsNCi0JCWxvbmdbXSBkYXRhID0geyAxMjk3MDMyMjk0Nzc5MjE1ODcyTCwgMTA3Mzk5MTc5NUwsIDBMLCAwTH07DQotCQlyZXR1cm4gZGF0YTsNCi0JfQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpdFNldCBfdG9rZW5TZXRfNjggPSBuZXcgQml0U2V0KG1rX3Rva2VuU2V0XzY4KCkpOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nW10gbWtfdG9rZW5TZXRfNjkoKSB7DQotCQlsb25nW10gZGF0YSA9IHsgMTA4NTQ1NkwsIDBMfTsNCi0JCXJldHVybiBkYXRhOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQml0U2V0IF90b2tlblNldF82OSA9IG5ldyBCaXRTZXQobWtfdG9rZW5TZXRfNjkoKSk7DQotCQ0KLQl9DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExUb2tlblR5cGVzLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFRva2VuVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhODY3ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFRva2VuVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLy8gJEFOVExSIDIuNy42ICgyMDA1LTEyLTIyKTogIm9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLmciIC0+ICJJRExQYXJzZXIuamF2YSIkDQotDQotICBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnBhcnNlcjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElETFRva2VuVHlwZXMgew0KLQlpbnQgRU9GID0gMTsNCi0JaW50IE5VTExfVFJFRV9MT09LQUhFQUQgPSAzOw0KLQlpbnQgU0VNSSA9IDQ7DQotCWludCBMSVRFUkFMX2Fic3RyYWN0ID0gNTsNCi0JaW50IExJVEVSQUxfbG9jYWwgPSA2Ow0KLQlpbnQgTElURVJBTF9pbnRlcmZhY2UgPSA3Ow0KLQlpbnQgTElURVJBTF9jdXN0b20gPSA4Ow0KLQlpbnQgTElURVJBTF92YWx1ZXR5cGUgPSA5Ow0KLQlpbnQgTElURVJBTF9ldmVudHR5cGUgPSAxMDsNCi0JaW50IExJVEVSQUxfbW9kdWxlID0gMTE7DQotCWludCBMQ1VSTFkgPSAxMjsNCi0JaW50IFJDVVJMWSA9IDEzOw0KLQlpbnQgUFJFUFJPQ19ESVJFQ1RJVkUgPSAxNDsNCi0JaW50IENPTE9OID0gMTU7DQotCWludCBDT01NQSA9IDE2Ow0KLQlpbnQgU0NPUEVPUCA9IDE3Ow0KLQlpbnQgSURFTlQgPSAxODsNCi0JaW50IExJVEVSQUxfdHJ1bmNhdGFibGUgPSAxOTsNCi0JaW50IExJVEVSQUxfc3VwcG9ydHMgPSAyMDsNCi0JaW50IExJVEVSQUxfcHVibGljID0gMjE7DQotCWludCBMSVRFUkFMX3ByaXZhdGUgPSAyMjsNCi0JaW50IExJVEVSQUxfZmFjdG9yeSA9IDIzOw0KLQlpbnQgTFBBUkVOID0gMjQ7DQotCWludCBSUEFSRU4gPSAyNTsNCi0JaW50IExJVEVSQUxfaW4gPSAyNjsNCi0JaW50IExJVEVSQUxfY29uc3QgPSAyNzsNCi0JaW50IEFTU0lHTiA9IDI4Ow0KLQlpbnQgT1IgPSAyOTsNCi0JaW50IFhPUiA9IDMwOw0KLQlpbnQgQU5EID0gMzE7DQotCWludCBMU0hJRlQgPSAzMjsNCi0JaW50IFJTSElGVCA9IDMzOw0KLQlpbnQgUExVUyA9IDM0Ow0KLQlpbnQgTUlOVVMgPSAzNTsNCi0JaW50IFNUQVIgPSAzNjsNCi0JaW50IERJViA9IDM3Ow0KLQlpbnQgTU9EID0gMzg7DQotCWludCBUSUxERSA9IDM5Ow0KLQlpbnQgTElURVJBTF9UUlVFID0gNDA7DQotCWludCBMSVRFUkFMX0ZBTFNFID0gNDE7DQotCWludCBMSVRFUkFMX3R5cGVkZWYgPSA0MjsNCi0JaW50IExJVEVSQUxfbmF0aXZlID0gNDM7DQotCWludCBMSVRFUkFMX2Zsb2F0ID0gNDQ7DQotCWludCBMSVRFUkFMX2RvdWJsZSA9IDQ1Ow0KLQlpbnQgTElURVJBTF9sb25nID0gNDY7DQotCWludCBMSVRFUkFMX3Nob3J0ID0gNDc7DQotCWludCBMSVRFUkFMX3Vuc2lnbmVkID0gNDg7DQotCWludCBMSVRFUkFMX2NoYXIgPSA0OTsNCi0JaW50IExJVEVSQUxfd2NoYXIgPSA1MDsNCi0JaW50IExJVEVSQUxfYm9vbGVhbiA9IDUxOw0KLQlpbnQgTElURVJBTF9vY3RldCA9IDUyOw0KLQlpbnQgTElURVJBTF9hbnkgPSA1MzsNCi0JaW50IExJVEVSQUxfT2JqZWN0ID0gNTQ7DQotCWludCBMSVRFUkFMX3N0cnVjdCA9IDU1Ow0KLQlpbnQgTElURVJBTF91bmlvbiA9IDU2Ow0KLQlpbnQgTElURVJBTF9zd2l0Y2ggPSA1NzsNCi0JaW50IExJVEVSQUxfY2FzZSA9IDU4Ow0KLQlpbnQgTElURVJBTF9kZWZhdWx0ID0gNTk7DQotCWludCBMSVRFUkFMX2VudW0gPSA2MDsNCi0JaW50IExJVEVSQUxfc2VxdWVuY2UgPSA2MTsNCi0JaW50IExUID0gNjI7DQotCWludCBHVCA9IDYzOw0KLQlpbnQgTElURVJBTF9zdHJpbmcgPSA2NDsNCi0JaW50IExJVEVSQUxfd3N0cmluZyA9IDY1Ow0KLQlpbnQgTEJSQUNLID0gNjY7DQotCWludCBSQlJBQ0sgPSA2NzsNCi0JaW50IExJVEVSQUxfZXhjZXB0aW9uID0gNjg7DQotCWludCBMSVRFUkFMX29uZXdheSA9IDY5Ow0KLQlpbnQgTElURVJBTF92b2lkID0gNzA7DQotCWludCBMSVRFUkFMX291dCA9IDcxOw0KLQlpbnQgTElURVJBTF9pbm91dCA9IDcyOw0KLQlpbnQgTElURVJBTF9yYWlzZXMgPSA3MzsNCi0JaW50IExJVEVSQUxfY29udGV4dCA9IDc0Ow0KLQlpbnQgTElURVJBTF9maXhlZCA9IDc1Ow0KLQlpbnQgTElURVJBTF9WYWx1ZUJhc2UgPSA3NjsNCi0JaW50IExJVEVSQUxfaW1wb3J0ID0gNzc7DQotCWludCBMSVRFUkFMX3R5cGVpZCA9IDc4Ow0KLQlpbnQgTElURVJBTF90eXBlcHJlZml4ID0gNzk7DQotCWludCBMSVRFUkFMX3JlYWRvbmx5ID0gODA7DQotCWludCBMSVRFUkFMX2F0dHJpYnV0ZSA9IDgxOw0KLQlpbnQgTElURVJBTF9nZXRyYWlzZXMgPSA4MjsNCi0JaW50IExJVEVSQUxfc2V0cmFpc2VzID0gODM7DQotCWludCBMSVRFUkFMX2NvbXBvbmVudCA9IDg0Ow0KLQlpbnQgTElURVJBTF9wcm92aWRlcyA9IDg1Ow0KLQlpbnQgTElURVJBTF91c2VzID0gODY7DQotCWludCBMSVRFUkFMX211bHRpcGxlID0gODc7DQotCWludCBMSVRFUkFMX2VtaXRzID0gODg7DQotCWludCBMSVRFUkFMX3B1Ymxpc2hlcyA9IDg5Ow0KLQlpbnQgTElURVJBTF9jb25zdW1lcyA9IDkwOw0KLQlpbnQgTElURVJBTF9ob21lID0gOTE7DQotCWludCBMSVRFUkFMX21hbmFnZXMgPSA5MjsNCi0JaW50IExJVEVSQUxfcHJpbWFyeWtleSA9IDkzOw0KLQlpbnQgTElURVJBTF9maW5kZXIgPSA5NDsNCi0JaW50IElOVCA9IDk1Ow0KLQlpbnQgT0NUQUwgPSA5NjsNCi0JaW50IEhFWCA9IDk3Ow0KLQlpbnQgU1RSSU5HX0xJVEVSQUwgPSA5ODsNCi0JaW50IFdJREVfU1RSSU5HX0xJVEVSQUwgPSA5OTsNCi0JaW50IENIQVJfTElURVJBTCA9IDEwMDsNCi0JaW50IFdJREVfQ0hBUl9MSVRFUkFMID0gMTAxOw0KLQlpbnQgRklYRUQgPSAxMDI7DQotCWludCBGTE9BVCA9IDEwMzsNCi0JaW50IFFVRVNUSU9OID0gMTA0Ow0KLQlpbnQgRE9UID0gMTA1Ow0KLQlpbnQgTk9UID0gMTA2Ow0KLQlpbnQgV1MgPSAxMDc7DQotCWludCBTTF9DT01NRU5UID0gMTA4Ow0KLQlpbnQgTUxfQ09NTUVOVCA9IDEwOTsNCi0JaW50IEVTQyA9IDExMDsNCi0JaW50IFZPQ0FCID0gMTExOw0KLQlpbnQgRElHSVQgPSAxMTI7DQotCWludCBOT05aRVJPRElHSVQgPSAxMTM7DQotCWludCBPQ1RESUdJVCA9IDExNDsNCi0JaW50IEhFWERJR0lUID0gMTE1Ow0KLQlpbnQgRVNDQVBFRF9JREVOVCA9IDExNjsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9JRExWaXNpdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNjFmMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvcGFyc2VyL0lETFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC5wYXJzZXI7DQotDQotaW1wb3J0IGFudGxyLmNvbGxlY3Rpb25zLkFTVDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQXJyYXlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Db21wb3NpdGVEYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkVudW1UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5PcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlByaW1pdGl2ZURhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5TZXF1ZW5jZVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlN0cnVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVHlwZWRlZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVW5pb25NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlVuaW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVmFsdWVUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuSW52YWxpZElETEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4NCi0gKiBVc2VyOiBFcmFuZ2ENCi0gKiBEYXRlOiBGZWIgMTEsIDIwMDcNCi0gKiBUaW1lOiAxMDowNjoyMyBQTQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJRExWaXNpdG9yIC8qaW1wbGVtZW50cyBBU1RWaXNpdG9yKi8gew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSURMVmlzaXRvci5jbGFzcyk7DQotICAgIHByaXZhdGUgSURMIGlkbCA9IG5ldyBJREwoKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlID0gIiI7DQotICAgIHByaXZhdGUgU3RyaW5nIG1vZHVsZUZvcklubmVyVHlwZXMgPSBudWxsOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJUWVBFX1NVRkZJWCA9ICJQYWNrYWdlIjsNCi0NCi0gICAgcHVibGljIElETCBnZXRJREwoKSB7DQotICAgICAgICByZXR1cm4gaWRsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldElETChJREwgaWRsKSB7DQotICAgICAgICB0aGlzLmlkbCA9IGlkbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChBU1Qgbm9kZSkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfaW50ZXJmYWNlOiB7DQotICAgICAgICAgICAgICAgICAgICBpZGwuYWRkSW50ZXJmYWNlKHZpc2l0SW50ZXJmYWNlKG5vZGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX21vZHVsZTogew0KLSAgICAgICAgICAgICAgICAgICAgQVNUIG1vZHVsZU5hbWUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgICAgIElETFZpc2l0b3IgbW9kdWxlVmlzaXRvciA9IG5ldyBJRExWaXNpdG9yKCk7DQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVWaXNpdG9yLnNldElETChpZGwpOw0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlVmlzaXRvci5zZXRNb2R1bGUobW9kdWxlICsgbW9kdWxlTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVWaXNpdG9yLnZpc2l0KG1vZHVsZU5hbWUuZ2V0TmV4dFNpYmxpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZGwuYWRkSURMKG1vZHVsZVZpc2l0b3IuZ2V0SURMKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfc3RydWN0OiB7DQotICAgICAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZSh2aXNpdFN0cnVjdChub2RlKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF92YWx1ZXR5cGU6IHsNCi0gICAgICAgICAgICAgICAgICAgIGlkbC5hZGRUeXBlKHZpc2l0VmFsdWVUeXBlKG5vZGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF9leGNlcHRpb246IHsNCi0gICAgICAgICAgICAgICAgICAgIGlkbC5hZGRUeXBlKHZpc2l0RXhjZXB0aW9uKG5vZGUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX2VudW06IHsNCi0gICAgICAgICAgICAgICAgICAgIGlkbC5hZGRUeXBlKHZpc2l0RW51bShub2RlKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF91bmlvbjogew0KLSAgICAgICAgICAgICAgICAgICAgaWRsLmFkZFR5cGUodmlzaXRVbmlvbihub2RlKSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF90eXBlZGVmOiB7DQotICAgICAgICAgICAgICAgICAgICB2aXNpdEFuZEFkZFR5cGVkZWZzKG5vZGUsIG1vZHVsZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZElETEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgSURMIHRva2VuICIgKyBub2RlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RydWN0IHZpc2l0U3RydWN0KEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBBU1Qgc3RydWN0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgU3RyaW5nIHN0cnVjdE5hbWUgPSBzdHJ1Y3ROb2RlLnRvU3RyaW5nKCk7DQotICAgICAgICBTdHJ1Y3Qgc3RydWN0ID0gbmV3IFN0cnVjdCgpOw0KLSAgICAgICAgc3RydWN0LnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgc3RydWN0LnNldE5hbWUoc3RydWN0TmFtZSk7DQotICAgICAgICBBU1QgbWVtYmVyVHlwZU5vZGUgPSBzdHJ1Y3ROb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB3aGlsZSAobWVtYmVyVHlwZU5vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBmaW5kRGF0YVR5cGUobWVtYmVyVHlwZU5vZGUsIHN0cnVjdE5hbWUpOw0KLSAgICAgICAgICAgIEFTVCBtZW1iZXJOb2RlID0gbWVtYmVyVHlwZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlck5vZGUuZ2V0VGV4dCgpOw0KLSAgICAgICAgICAgIGludCBkaW1lbnNpb25zID0gbWVtYmVyTm9kZS5nZXROdW1iZXJPZkNoaWxkcmVuKCk7DQotICAgICAgICAgICAgaWYgKGRpbWVuc2lvbnMgPiAwKSB7DQotICAgICAgICAgICAgICAgIEFTVCBkaW1lbnNpb25Ob2RlID0gbWVtYmVyTm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBBcnJheVR5cGUgcm9vdEFycmF5VHlwZSA9IG51bGw7DQotICAgICAgICAgICAgICAgIGludCBpID0gMTsNCi0gICAgICAgICAgICAgICAgd2hpbGUoZGltZW5zaW9uTm9kZSE9bnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgQXJyYXlUeXBlIHRlbXAgPSBuZXcgQXJyYXlUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wLnNldEVsZW1lbnRNb2R1bGUobW9kdWxlKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0RWxlbWVudE5hbWUobWVtYmVyTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wLnNldERlcHRoKGkpOw0KLSAgICAgICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlLnNldERhdGFUeXBlKHRlbXApOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByb290QXJyYXlUeXBlID0gdGVtcDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZSA9IHRlbXA7DQotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUuc2V0RWxlbWVudENvdW50KEludGVnZXIucGFyc2VJbnQoZGltZW5zaW9uTm9kZS5nZXRUZXh0KCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbk5vZGUgPSBkaW1lbnNpb25Ob2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGFycmF5VHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICB9DQotLy8gICAgICAgICAgICAgICAgZGF0YVR5cGUgPSByb290QXJyYXlUeXBlOw0KLSAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSBuZXcgVHlwZWRlZigpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldERhdGFUeXBlKHJvb3RBcnJheVR5cGUpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgICAgICAgICB0eXBlZGVmLnNldE5hbWUoc3RydWN0TmFtZSArICdfJyArIG1lbWJlck5hbWUpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICAgICAgZGF0YVR5cGUgPSB0eXBlZGVmOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBtZW1iZXIuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgICAgIG1lbWJlci5zZXROYW1lKG1lbWJlck5hbWUpOw0KLSAgICAgICAgICAgIHN0cnVjdC5hZGRNZW1iZXIobWVtYmVyKTsNCi0gICAgICAgICAgICBtZW1iZXJUeXBlTm9kZSA9IG1lbWJlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzdHJ1Y3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBWYWx1ZVR5cGUgdmlzaXRWYWx1ZVR5cGUoQVNUIG5vZGUpIHRocm93cyBJbnZhbGlkSURMRXhjZXB0aW9uIHsNCi0gICAgICAgIEFTVCB2YWx1ZU5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIFZhbHVlVHlwZSB2YWx1ZSA9IG5ldyBWYWx1ZVR5cGUoKTsNCi0gICAgICAgIHZhbHVlLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlTmFtZSA9IHZhbHVlTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgdmFsdWUuc2V0TmFtZSh2YWx1ZU5hbWUpOw0KLSAgICAgICAgQVNUIG1lbWJlck1vZGlmaWVyTm9kZSA9IHZhbHVlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgd2hpbGUgKG1lbWJlck1vZGlmaWVyTm9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlck1vZGlmaWVyTmFtZSA9IG1lbWJlck1vZGlmaWVyTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIGlmICghbWVtYmVyTW9kaWZpZXJOYW1lLmVxdWFscygicHJpdmF0ZSIpICYmICFtZW1iZXJNb2RpZmllck5hbWUuZXF1YWxzKCJwdWJsaWMiKSkgew0KLSAgICAgICAgICAgICAgICBpZiAoSURMVG9rZW5UeXBlcy5QUkVQUk9DX0RJUkVDVElWRT09bWVtYmVyTW9kaWZpZXJOb2RlLmdldFR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlck1vZGlmaWVyTmFtZS5zdGFydHNXaXRoKCJwcmFnbWEgSUQgIikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJNb2RpZmllck5hbWUgPSBtZW1iZXJNb2RpZmllck5hbWUuc3Vic3RyaW5nKDEwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcmFnbWEgPSBtZW1iZXJNb2RpZmllck5hbWUuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJhZ21hLmxlbmd0aD09MiAmJiBwcmFnbWFbMF0hPW51bGwgJiYgcHJhZ21hWzFdIT1udWxsICYmIHByYWdtYVswXS5lcXVhbHModmFsdWUuZ2V0TmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmFnbWFbMV0gPSBwcmFnbWFbMV0ucmVwbGFjZSgnIicsICcgJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldElkKHByYWdtYVsxXS50cmltKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGFic3RyYWN0IG9wZXJhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuYWRkT3BlcmF0aW9uKHZpc2l0T3BlcmF0aW9uKG1lbWJlck1vZGlmaWVyTm9kZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG1lbWJlck1vZGlmaWVyTm9kZSA9IG1lbWJlck1vZGlmaWVyTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgTWVtYmVyIG1lbWJlclR5cGUgPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgbWVtYmVyVHlwZS5zZXRNb2RpZmllcihtZW1iZXJNb2RpZmllck5hbWUpOw0KLSAgICAgICAgICAgIEFTVCBtZW1iZXJUeXBlTm9kZSA9IG1lbWJlck1vZGlmaWVyTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIG1lbWJlclR5cGUuc2V0RGF0YVR5cGUoZmluZERhdGFUeXBlKG1lbWJlclR5cGVOb2RlLCB2YWx1ZU5hbWUpKTsNCi0gICAgICAgICAgICBBU1QgbWVtYmVyTm9kZSA9IG1lbWJlclR5cGVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgbWVtYmVyVHlwZS5zZXROYW1lKG1lbWJlck5vZGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgdmFsdWUuYWRkTWVtYmVyKG1lbWJlclR5cGUpOw0KLSAgICAgICAgICAgIG1lbWJlck1vZGlmaWVyTm9kZSA9IG1lbWJlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEludGVyZmFjZSB2aXNpdEludGVyZmFjZShBU1Qgbm9kZSkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgSW50ZXJmYWNlIGludGYgPSBuZXcgSW50ZXJmYWNlKCk7DQotICAgICAgICBpbnRmLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgQVNUIGludGVyZmFjZU5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgaW50Zi5zZXROYW1lKGludGVyZmFjZU5hbWUpOw0KLSAgICAgICAgbW9kdWxlRm9ySW5uZXJUeXBlcyA9IG1vZHVsZSArIGludGVyZmFjZU5hbWUgKyBJTk5FUlRZUEVfU1VGRklYICsgQ29tcG9zaXRlRGF0YVR5cGUuTU9EVUxFX1NFUEVSQVRPUjsNCi0gICAgICAgIEFTVCBub2RlMiA9IGludGVyZmFjZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIHdoaWxlIChub2RlMiAhPSBudWxsKSB7DQotICAgICAgICAgICAgc3dpdGNoIChub2RlMi5nZXRUeXBlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF9zdHJ1Y3Q6DQotICAgICAgICAgICAgICAgIFN0cnVjdCBpbm5lclN0cnVjdCA9IHZpc2l0U3RydWN0KG5vZGUyKTsNCi0gICAgICAgICAgICAgICAgaW5uZXJTdHJ1Y3Quc2V0TW9kdWxlKG1vZHVsZUZvcklubmVyVHlwZXMpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZShpbm5lclN0cnVjdCk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX3ZhbHVldHlwZToNCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJVbnN1cHBvcnRlZCBJREwgdG9rZW4gIiArIG5vZGUyKTsNCi0gICAgICAgICAgICAgICAgLy8gQ09SQkEgMy5PIHNwZWMgZG9lcyBub3Qgc3VwcG9ydCB0aGlzDQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX2V4Y2VwdGlvbjoNCi0gICAgICAgICAgICAgICAgU3RydWN0IGlubmVyRXggPSB2aXNpdEV4Y2VwdGlvbihub2RlMik7DQotICAgICAgICAgICAgICAgIGlubmVyRXguc2V0TW9kdWxlKG1vZHVsZUZvcklubmVyVHlwZXMpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZShpbm5lckV4KTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfZW51bToNCi0gICAgICAgICAgICAgICAgRW51bVR5cGUgaW5uZXJFbnVtID0gdmlzaXRFbnVtKG5vZGUyKTsNCi0gICAgICAgICAgICAgICAgaW5uZXJFbnVtLnNldE1vZHVsZShtb2R1bGVGb3JJbm5lclR5cGVzKTsNCi0gICAgICAgICAgICAgICAgaWRsLmFkZFR5cGUoaW5uZXJFbnVtKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfdW5pb246DQotICAgICAgICAgICAgICAgIFVuaW9uVHlwZSBpbm5lclVuaW9uID0gdmlzaXRVbmlvbihub2RlMik7DQotICAgICAgICAgICAgICAgIGlubmVyVW5pb24uc2V0TW9kdWxlKG1vZHVsZUZvcklubmVyVHlwZXMpOw0KLSAgICAgICAgICAgICAgICBpZGwuYWRkVHlwZShpbm5lclVuaW9uKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBJRExUb2tlblR5cGVzLkxJVEVSQUxfdHlwZWRlZjoNCi0gICAgICAgICAgICAgICAgdmlzaXRBbmRBZGRUeXBlZGVmcyhub2RlMiwgbW9kdWxlRm9ySW5uZXJUeXBlcyk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgSURMVG9rZW5UeXBlcy5MSVRFUkFMX2NvbnN0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIlVuc3VwcG9ydGVkIElETCB0b2tlbiAiICsgbm9kZTIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIElETFRva2VuVHlwZXMuTElURVJBTF9hdHRyaWJ1dGU6DQotICAgICAgICAgICAgICAgIGludGYuYWRkT3BlcmF0aW9uKHZpc2l0R2V0QXR0cmlidXRlKG5vZGUyKSk7DQotICAgICAgICAgICAgICAgIGludGYuYWRkT3BlcmF0aW9uKHZpc2l0U2V0QXR0cmlidXRlKG5vZGUyKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGlmIChub2RlMi50b1N0cmluZygpLnN0YXJ0c1dpdGgoInByYWdtYSBJRCAiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByYWdtYUlkID0gbm9kZTIudG9TdHJpbmcoKS5zdWJzdHJpbmcoMTApOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJhZ21hID0gcHJhZ21hSWQuc3BsaXQoIiAiKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChwcmFnbWEubGVuZ3RoPT0yICYmIHByYWdtYVswXSE9bnVsbCAmJiBwcmFnbWFbMV0hPW51bGwgJiYgcHJhZ21hWzBdLmVxdWFscyhpbnRmLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmFnbWFbMV0gPSBwcmFnbWFbMV0ucmVwbGFjZSgnIicsICcgJyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50Zi5zZXRJZChwcmFnbWFbMV0udHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGludGYuYWRkT3BlcmF0aW9uKHZpc2l0T3BlcmF0aW9uKG5vZGUyKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG5vZGUyID0gbm9kZTIuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG1vZHVsZUZvcklubmVyVHlwZXMgPSBudWxsOw0KLSAgICAgICAgcmV0dXJuIGludGY7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPcGVyYXRpb24gdmlzaXRHZXRBdHRyaWJ1dGUoQVNUIG5vZGUpIHRocm93cyBJbnZhbGlkSURMRXhjZXB0aW9uIHsNCi0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKCk7DQotICAgICAgICBBU1QgdHlwZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgQVNUIG5hbWUgPSB0eXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7DQotICAgICAgICBvcGVyYXRpb24uc2V0UmV0dXJuVHlwZShmaW5kRGF0YVR5cGUodHlwZSwgYXR0ck5hbWUpKTsNCi0gICAgICAgIG9wZXJhdGlvbi5zZXROYW1lKCJfZ2V0XyIgKyBhdHRyTmFtZSk7DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT3BlcmF0aW9uIHZpc2l0U2V0QXR0cmlidXRlKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbigpOw0KLSAgICAgICAgQVNUIHR5cGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIG9wZXJhdGlvbi5zZXRSZXR1cm5UeXBlKFByaW1pdGl2ZURhdGFUeXBlLmdldFByaW1pdGl2ZURhdGFUeXBlKCJ2b2lkIikpOw0KLSAgICAgICAgQVNUIG5hbWUgPSB0eXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7DQotICAgICAgICBvcGVyYXRpb24uc2V0TmFtZSgiX3NldF8iICsgYXR0ck5hbWUpOw0KLSAgICAgICAgTWVtYmVyIHBhcmFtID0gbmV3IE1lbWJlcigpOw0KLSAgICAgICAgcGFyYW0uc2V0TmFtZShhdHRyTmFtZSk7DQotICAgICAgICBwYXJhbS5zZXREYXRhVHlwZShmaW5kRGF0YVR5cGUodHlwZSwgYXR0ck5hbWUpKTsNCi0gICAgICAgIG9wZXJhdGlvbi5hZGRQYXJhbShwYXJhbSk7DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT3BlcmF0aW9uIHZpc2l0T3BlcmF0aW9uKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IE9wZXJhdGlvbigpOw0KLSAgICAgICAgU3RyaW5nIG9wTmFtZSA9IG5vZGUudG9TdHJpbmcoKTsNCi0gICAgICAgIG9wZXJhdGlvbi5zZXROYW1lKG9wTmFtZSk7DQotICAgICAgICBBU1QgdHlwZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgb3BlcmF0aW9uLnNldFJldHVyblR5cGUoZmluZERhdGFUeXBlKHR5cGUsIG9wTmFtZSkpOw0KLSAgICAgICAgQVNUIG1vZGUgPSB0eXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB3aGlsZShtb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoSURMVG9rZW5UeXBlcy5MSVRFUkFMX3JhaXNlcyA9PSBtb2RlLmdldFR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICBBU1QgaWRsVHlwZSA9IG1vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgICAgICAgICB3aGlsZShpZGxUeXBlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRSYWlzZXMoKEV4Y2VwdGlvblR5cGUpIGZpbmREYXRhVHlwZShpZGxUeXBlLCBvcE5hbWUpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlkbFR5cGUgPSBpZGxUeXBlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBNZW1iZXIgcGFyYW0gPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgICAgIHBhcmFtLnNldE1vZGUobW9kZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgQVNUIGlkbFR5cGUgPSBtb2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgQVNUIHBhcmFtTmFtZSA9IGlkbFR5cGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZVN0ciA9IHBhcmFtTmFtZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICBwYXJhbS5zZXREYXRhVHlwZShmaW5kRGF0YVR5cGUoaWRsVHlwZSwgcGFyYW1OYW1lU3RyKSk7DQotICAgICAgICAgICAgICAgIHBhcmFtLnNldE5hbWUocGFyYW1OYW1lU3RyKTsNCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZFBhcmFtKHBhcmFtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgbW9kZSA9IG1vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvcGVyYXRpb247DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBFeGNlcHRpb25UeXBlIHZpc2l0RXhjZXB0aW9uKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBFeGNlcHRpb25UeXBlIHJhaXNlc1R5cGUgPSBuZXcgRXhjZXB0aW9uVHlwZSgpOw0KLSAgICAgICAgQVNUIGV4Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgU3RyaW5nIGV4TmFtZSA9IGV4Tm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgcmFpc2VzVHlwZS5zZXRNb2R1bGUobW9kdWxlKTsNCi0gICAgICAgIHJhaXNlc1R5cGUuc2V0TmFtZShleE5hbWUpOw0KLSAgICAgICAgQVNUIG1lbWJlclR5cGVOb2RlID0gZXhOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB3aGlsZSAobWVtYmVyVHlwZU5vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSBuZXcgTWVtYmVyKCk7DQotICAgICAgICAgICAgbWVtYmVyLnNldERhdGFUeXBlKGZpbmREYXRhVHlwZShtZW1iZXJUeXBlTm9kZSwgZXhOYW1lKSk7DQotICAgICAgICAgICAgQVNUIG1lbWJlck5vZGUgPSBtZW1iZXJUeXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIG1lbWJlci5zZXROYW1lKG1lbWJlck5vZGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgcmFpc2VzVHlwZS5hZGRNZW1iZXIobWVtYmVyKTsNCi0gICAgICAgICAgICBtZW1iZXJUeXBlTm9kZSA9IG1lbWJlck5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByYWlzZXNUeXBlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgRGF0YVR5cGUgZmluZERhdGFUeXBlKEFTVCB0eXBlTm9kZSwgU3RyaW5nIHBhcmVudE5hbWUpIHRocm93cyBJbnZhbGlkSURMRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBmaW5kRGF0YVR5cGUodHlwZU5vZGUsIHBhcmVudE5hbWUsIHRydWUsIGZhbHNlKTsNCi0gICAgfQ0KLSAgICBwcml2YXRlIERhdGFUeXBlIGZpbmREYXRhVHlwZShBU1QgdHlwZU5vZGUsIFN0cmluZyBwYXJlbnROYW1lLCBib29sZWFuIHJvb3QsIGJvb2xlYW4gbm9UeXBlRGVmRm9yU2VxcykgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHNlcXVlbmNlcw0KLSAgICAgICAgaWYgKHR5cGVOb2RlLmdldFR5cGUoKT09SURMVG9rZW5UeXBlcy5MSVRFUkFMX3NlcXVlbmNlKSB7DQotICAgICAgICAgICAgU2VxdWVuY2VUeXBlIHNlcXVlbmNlVHlwZSA9IHZpc2l0QW5vbnltb3VzU2VxdWVuY2UodHlwZU5vZGUsIHBhcmVudE5hbWUsIHJvb3QpOw0KLSAgICAgICAgICAgIGlmIChub1R5cGVEZWZGb3JTZXFzKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZVR5cGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IG5ldyBUeXBlZGVmKCk7DQotICAgICAgICAgICAgdHlwZWRlZi5zZXREYXRhVHlwZShzZXF1ZW5jZVR5cGUpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0TW9kdWxlKG1vZHVsZSk7DQotICAgICAgICAgICAgdHlwZWRlZi5zZXROYW1lKHBhcmVudE5hbWUgKyAnXycgKyBzZXF1ZW5jZVR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZGwuYWRkVHlwZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICByZXR1cm4gdHlwZWRlZjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gbnVsbDsNCi0gICAgICAgIE1hcCBjb21wb3NpdGVEYXRhVHlwZXMgPSBpZGwuZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCk7DQotDQotICAgICAgICBTdHJpbmcgdHlwZU5hbWU7DQotICAgICAgICBpZiAodHlwZU5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF91bnNpZ25lZCkgew0KLSAgICAgICAgICAgIEFTVCBuZXh0Tm9kZSA9IHR5cGVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgaWYgKG5leHROb2RlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRJRExFeGNlcHRpb24oIid1bnNpZ25lZCcgd2l0aG91dCBhIGRhdGEgdHlwZSIpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dE5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF9zaG9ydCkgew0KLSAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXROZXh0U2libGluZyhuZXh0Tm9kZS5nZXROZXh0U2libGluZygpKTsNCi0gICAgICAgICAgICAgICAgdHlwZU5vZGUuc2V0Rmlyc3RDaGlsZChuZXh0Tm9kZS5nZXRGaXJzdENoaWxkKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlTmFtZSA9ICJ1c2hvcnQiOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dE5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF9sb25nKSB7DQotICAgICAgICAgICAgICAgIEFTVCBuZXh0VG9Mb25nID0gbmV4dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG5leHRUb0xvbmcgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRJRExFeGNlcHRpb24oImFuIGlkZW50aWZpZXIgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlICdsb25nJyBrZXl3b3JkIik7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dFRvTG9uZy5nZXRUeXBlKCkgPT0gSURMVG9rZW5UeXBlcy5MSVRFUkFMX2xvbmcpIHsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOb2RlLnNldE5leHRTaWJsaW5nKG5leHRUb0xvbmcuZ2V0TmV4dFNpYmxpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXRGaXJzdENoaWxkKG5leHRUb0xvbmcuZ2V0Rmlyc3RDaGlsZCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gInVsb25nbG9uZyI7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXROZXh0U2libGluZyhuZXh0Tm9kZS5nZXROZXh0U2libGluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOb2RlLnNldEZpcnN0Q2hpbGQobmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpKTsNCi0gICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gInVsb25nIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSURMRXhjZXB0aW9uKCJlaXRoZXIgJ2xvbmcnIG9yICdzaG9ydCcgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlICd1bnNpZ25lZCcga2V5d29yZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZU5vZGUuZ2V0VHlwZSgpID09IElETFRva2VuVHlwZXMuTElURVJBTF9sb25nKSB7DQotICAgICAgICAgICAgQVNUIG5leHRUb0xvbmcgPSB0eXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIGlmIChuZXh0VG9Mb25nID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRJRExFeGNlcHRpb24oImFuIGlkZW50aWZpZXIgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlICdsb25nJyBrZXl3b3JkIik7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0VG9Mb25nLmdldFR5cGUoKSA9PSBJRExUb2tlblR5cGVzLkxJVEVSQUxfbG9uZykgew0KLSAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXROZXh0U2libGluZyhuZXh0VG9Mb25nLmdldE5leHRTaWJsaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB0eXBlTm9kZS5zZXRGaXJzdENoaWxkKG5leHRUb0xvbmcuZ2V0Rmlyc3RDaGlsZCgpKTsNCi0gICAgICAgICAgICAgICAgdHlwZU5hbWUgPSAibG9uZ2xvbmciOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gImxvbmciOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdHlwZU5hbWUgPSBnZXRUeXBlTmFtZSh0eXBlTm9kZSk7ICAgIA0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgaWYgKGNvbXBvc2l0ZURhdGFUeXBlcyE9bnVsbCkgew0KLSAgICAgICAgICAgIGlmICghbW9kdWxlLmVxdWFscygiIikpIHsNCi0gICAgICAgICAgICAgICAgaWYgKCF0eXBlTmFtZS5zdGFydHNXaXRoKG1vZHVsZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gKERhdGFUeXBlKSBpZGwuZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCkuZ2V0KG1vZHVsZSArIHR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGF0YVR5cGU9PW51bGwgJiYgbW9kdWxlRm9ySW5uZXJUeXBlcyE9bnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoIXR5cGVOYW1lLnN0YXJ0c1dpdGgobW9kdWxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUgPSAoRGF0YVR5cGUpIGlkbC5nZXRDb21wb3NpdGVEYXRhVHlwZXMoKS5nZXQobW9kdWxlRm9ySW5uZXJUeXBlcyArIHR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGF0YVR5cGU9PW51bGwpDQotICAgICAgICAgICAgICAgIGRhdGFUeXBlID0gKERhdGFUeXBlKSBpZGwuZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCkuZ2V0KHR5cGVOYW1lKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChkYXRhVHlwZT09bnVsbCkNCi0gICAgICAgICAgICBkYXRhVHlwZSA9IFByaW1pdGl2ZURhdGFUeXBlLmdldFByaW1pdGl2ZURhdGFUeXBlKHR5cGVOYW1lKTsNCi0NCi0gICAgICAgIGlmIChkYXRhVHlwZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkSURMRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgdHlwZTogIiArIHR5cGVOYW1lKTsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKEFTVCBub2RlKSB7DQotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBub2RlLmdldFRleHQoKTsNCi0gICAgICAgIEFTVCBtZW1iZXJUeXBlTm9kZUNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICB3aGlsZShtZW1iZXJUeXBlTm9kZUNoaWxkIT1udWxsKSB7DQotICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZSArIENvbXBvc2l0ZURhdGFUeXBlLk1PRFVMRV9TRVBFUkFUT1IgKyBtZW1iZXJUeXBlTm9kZUNoaWxkLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgbWVtYmVyVHlwZU5vZGVDaGlsZCA9IG1lbWJlclR5cGVOb2RlQ2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0eXBlTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSkgew0KLSAgICAgICAgaWYgKG1vZHVsZT09bnVsbCB8fCBtb2R1bGUubGVuZ3RoKCk8MSkNCi0gICAgICAgICAgICBtb2R1bGUgPSAiIjsNCi0gICAgICAgIGVsc2UgaWYgKCFtb2R1bGUuZW5kc1dpdGgoQ29tcG9zaXRlRGF0YVR5cGUuTU9EVUxFX1NFUEVSQVRPUikpDQotICAgICAgICAgICAgbW9kdWxlICs9IENvbXBvc2l0ZURhdGFUeXBlLk1PRFVMRV9TRVBFUkFUT1I7DQotICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEVudW1UeXBlIHZpc2l0RW51bShBU1Qgbm9kZSkgew0KLSAgICAgICAgQVNUIGVudW1Ob2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBTdHJpbmcgZW51bU5hbWUgPSBlbnVtTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgRW51bVR5cGUgZW51bVR5cGUgPSBuZXcgRW51bVR5cGUoKTsNCi0gICAgICAgIGVudW1UeXBlLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgZW51bVR5cGUuc2V0TmFtZShlbnVtTmFtZSk7DQotICAgICAgICBBU1QgbWVtYmVyVHlwZU5vZGUgPSBlbnVtTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgd2hpbGUgKG1lbWJlclR5cGVOb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBlbnVtVHlwZS5hZGRFbnVtTWVtYmVyKG1lbWJlclR5cGVOb2RlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIG1lbWJlclR5cGVOb2RlID0gbWVtYmVyVHlwZU5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbnVtVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFVuaW9uVHlwZSB2aXNpdFVuaW9uKEFTVCBub2RlKSB0aHJvd3MgSW52YWxpZElETEV4Y2VwdGlvbiB7DQotICAgICAgICBVbmlvblR5cGUgdW5pb25UeXBlID0gbmV3IFVuaW9uVHlwZSgpOw0KLSAgICAgICAgQVNUIHVuTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgU3RyaW5nIHVuTmFtZSA9IHVuTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgdW5pb25UeXBlLnNldE1vZHVsZShtb2R1bGUpOw0KLSAgICAgICAgdW5pb25UeXBlLnNldE5hbWUodW5OYW1lKTsNCi0gICAgICAgIEFTVCBzd2l0Y2hUeXBlTm9kZSA9IHVuTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgdW5pb25UeXBlLnNldERpc2NyaW1pbmF0b3JUeXBlKGZpbmREYXRhVHlwZShzd2l0Y2hUeXBlTm9kZSwgdW5OYW1lKSk7DQotICAgICAgICBBU1QgY2FzZU9yRGVmYXVsdE5vZGUgPSBzd2l0Y2hUeXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgd2hpbGUgKGNhc2VPckRlZmF1bHROb2RlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBVbmlvbk1lbWJlciB1bmlvbk1lbWJlciA9IG5ldyBVbmlvbk1lbWJlcigpOw0KLSAgICAgICAgICAgIEFTVCB0eXBlTm9kZTsNCi0gICAgICAgICAgICBpZiAoSURMVG9rZW5UeXBlcy5MSVRFUkFMX2RlZmF1bHQgPT0gY2FzZU9yRGVmYXVsdE5vZGUuZ2V0VHlwZSgpKSB7DQotICAgICAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldERlZmF1bHQodHJ1ZSk7DQotICAgICAgICAgICAgICAgIHR5cGVOb2RlID0gY2FzZU9yRGVmYXVsdE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldERlZmF1bHQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICBBU1QgY2FzZVZhbHVlTm9kZSA9IGNhc2VPckRlZmF1bHROb2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgdW5pb25NZW1iZXIuc2V0RGlzY3JpbWluYXRvclZhbHVlKGNhc2VWYWx1ZU5vZGUuZ2V0VGV4dCgpKTsNCi0gICAgICAgICAgICAgICAgdHlwZU5vZGUgPSBjYXNlVmFsdWVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldERhdGFUeXBlKGZpbmREYXRhVHlwZSh0eXBlTm9kZSwgdW5OYW1lKSk7DQotDQotICAgICAgICAgICAgQVNUIG1lbWJlck5vZGUgPSB0eXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyLnNldE5hbWUobWVtYmVyTm9kZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB1bmlvblR5cGUuYWRkTWVtYmVyKHVuaW9uTWVtYmVyKTsNCi0gICAgICAgICAgICBjYXNlT3JEZWZhdWx0Tm9kZSA9IGNhc2VPckRlZmF1bHROb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdW5pb25UeXBlOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB2aXNpdEFuZEFkZFR5cGVkZWZzKEFTVCBub2RlLCBTdHJpbmcgbW9kdWxlTmFtZSkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgQVNUIHR5cGVkZWZOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotDQotICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZTsNCi0gICAgICAgIC8vU2VxdWVuY2VUeXBlIHNlcXVlbmNlID0gbnVsbDsNCi0gICAgICAgIC8vaWYgKHR5cGVkZWZOb2RlLmdldFR5cGUoKT09SURMVG9rZW5UeXBlcy5MSVRFUkFMX3NlcXVlbmNlKSB7DQotICAgICAgICAvLyAgICBzZXF1ZW5jZSA9IHZpc2l0QW5vbnltb3VzU2VxdWVuY2UodHlwZWRlZk5vZGUpOw0KLSAgICAgICAgLy8gICAgZGF0YVR5cGUgPSBzZXF1ZW5jZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgLy99IGVsc2Ugew0KLSAgICAgICAgICAgIGRhdGFUeXBlID0gZmluZERhdGFUeXBlKHR5cGVkZWZOb2RlLCBudWxsLCB0cnVlLCB0cnVlKTsNCi0gICAgICAgIC8vfQ0KLSAgICAgICAgQVNUIHR5cGVkZWZOYW1lTm9kZSA9IHR5cGVkZWZOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICBBU1QgZGltZW5zaW9uTm9kZTsNCi0gICAgICAgIFN0cmluZyB0eXBlZGVmTmFtZSA9IHR5cGVkZWZOYW1lTm9kZS50b1N0cmluZygpOw0KLSAgICAgICAgVHlwZWRlZiB0eXBlZGVmOw0KLSAgICAgICAgd2hpbGUgKHR5cGVkZWZOYW1lTm9kZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW50IGRpbWVuc2lvbnMgPSB0eXBlZGVmTmFtZU5vZGUuZ2V0TnVtYmVyT2ZDaGlsZHJlbigpOw0KLSAgICAgICAgICAgIGlmIChkaW1lbnNpb25zID4gMCkgew0KLSAgICAgICAgICAgICAgICBkaW1lbnNpb25Ob2RlID0gdHlwZWRlZk5hbWVOb2RlLmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgICAgICAgICAgQXJyYXlUeXBlIGFycmF5VHlwZSA9IG51bGw7DQotICAgICAgICAgICAgICAgIEFycmF5VHlwZSByb290QXJyYXlUeXBlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaW50IGkgPSAxOw0KLSAgICAgICAgICAgICAgICB3aGlsZShkaW1lbnNpb25Ob2RlIT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBBcnJheVR5cGUgdGVtcCA9IG5ldyBBcnJheVR5cGUoKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0RWxlbWVudE1vZHVsZShtb2R1bGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXAuc2V0RWxlbWVudE5hbWUodHlwZWRlZk5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgdGVtcC5zZXREZXB0aChpKTsNCi0gICAgICAgICAgICAgICAgICAgIGkrKzsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZS5zZXREYXRhVHlwZSh0ZW1wKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEFycmF5VHlwZSA9IHRlbXA7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGUgPSB0ZW1wOw0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlLnNldEVsZW1lbnRDb3VudChJbnRlZ2VyLnBhcnNlSW50KGRpbWVuc2lvbk5vZGUuZ2V0VGV4dCgpKSk7DQotICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25Ob2RlID0gZGltZW5zaW9uTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlLnNldERhdGFUeXBlKGRhdGFUeXBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBkYXRhVHlwZSA9IHJvb3RBcnJheVR5cGU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHR5cGVkZWYgPSBuZXcgVHlwZWRlZigpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0TW9kdWxlKG1vZHVsZU5hbWUpOw0KLSAgICAgICAgICAgIHR5cGVkZWYuc2V0TmFtZSh0eXBlZGVmTmFtZSk7DQotICAgICAgICAgICAgaWRsLmFkZFR5cGUodHlwZWRlZik7DQotICAgICAgICAgICAgdHlwZWRlZk5hbWVOb2RlID0gdHlwZWRlZk5hbWVOb2RlLmdldE5leHRTaWJsaW5nKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTZXF1ZW5jZVR5cGUgdmlzaXRBbm9ueW1vdXNTZXF1ZW5jZShBU1Qgbm9kZSwgU3RyaW5nIHBhcmVudE5hbWUsIGJvb2xlYW4gcm9vdCkgdGhyb3dzIEludmFsaWRJRExFeGNlcHRpb24gew0KLSAgICAgICAgQVNUIHR5cGVOb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBTZXF1ZW5jZVR5cGUgc2VxdWVuY2VUeXBlID0gbmV3IFNlcXVlbmNlVHlwZSgpOw0KLSAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBmaW5kRGF0YVR5cGUodHlwZU5vZGUsIHBhcmVudE5hbWUsIGZhbHNlLCBmYWxzZSk7DQotICAgICAgICBzZXF1ZW5jZVR5cGUuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOw0KLSAgICAgICAgc2VxdWVuY2VUeXBlLnNldEVsZW1lbnRNb2R1bGUobW9kdWxlKTsNCi0gICAgICAgIEFTVCBlbGVtZW50Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsNCi0gICAgICAgIGlmIChlbGVtZW50Tm9kZSAhPSBudWxsICYmIHJvb3QpIHsNCi0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50Tm9kZS5nZXRUZXh0KCk7DQotICAgICAgICAgICAgc2VxdWVuY2VUeXBlLnNldE5hbWUoZWxlbWVudE5hbWUpOw0KLSAgICAgICAgICAgIFNlcXVlbmNlVHlwZSB0ZW1wU2VxVHlwZSA9IHNlcXVlbmNlVHlwZTsNCi0gICAgICAgICAgICBpbnQgaSA9IDE7DQotICAgICAgICAgICAgRGF0YVR5cGUgdGVtcERhdGFUeXBlOw0KLSAgICAgICAgICAgIHdoaWxlKHRydWUpIHsNCi0gICAgICAgICAgICAgICAgdGVtcFNlcVR5cGUuc2V0RWxlbWVudE5hbWUoZWxlbWVudE5hbWUpOw0KLSAgICAgICAgICAgICAgICB0ZW1wU2VxVHlwZS5zZXREZXB0aChpKTsNCi0gICAgICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgICAgICB0ZW1wRGF0YVR5cGUgPSB0ZW1wU2VxVHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFUeXBlIGluc3RhbmNlb2YgU2VxdWVuY2VUeXBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wU2VxVHlwZSA9IChTZXF1ZW5jZVR5cGUpIHRlbXBEYXRhVHlwZTsgICAgDQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEFTVCBjb3VudE5vZGUgPSB0eXBlTm9kZS5nZXROZXh0U2libGluZygpOw0KLSAgICAgICAgaWYgKGNvdW50Tm9kZSE9bnVsbCkgew0KLSAgICAgICAgICAgIHNlcXVlbmNlVHlwZS5zZXRFbGVtZW50Q291bnQoSW50ZWdlci5wYXJzZUludChjb3VudE5vZGUuZ2V0VGV4dCgpKSk7DQotICAgICAgICAgICAgLy9zZXF1ZW5jZVR5cGUuc2V0Qm91bmRlZCh0cnVlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgc2VxdWVuY2VUeXBlLnNldEVsZW1lbnRDb3VudCgwKTsNCi0gICAgICAgICAgICAvL3NlcXVlbmNlVHlwZS5zZXRCb3VuZGVkKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBzZXF1ZW5jZVR5cGU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9pZGwuZyBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC9wYXJzZXIvaWRsLmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTk5NDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3BhcnNlci9pZGwuZworKysgL2Rldi9udWxsCkBAIC0xLDE0MTkgKzAsMCBAQAotaGVhZGVyIHsNCi0gIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGw7DQotDQotICBpbXBvcnQgamF2YS5pby4qOw0KLSAgaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotICBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0gfQ0KLQ0KLS8qKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogIFRoaXMgaXMgYSBjb21wbGV0ZSBwYXJzZXIgZm9yIHRoZSBJREwgbGFuZ3VhZ2UgYXMgZGVmaW5lZA0KLSAqICBieSB0aGUgQ09SQkEgMy4wLjIgc3BlY2lmaWNhdGlvbi4gIEl0IHdpbGwgYWxsb3cgdGhvc2Ugd2hvDQotICogIG5lZWQgYW4gSURMIHBhcnNlciB0byBnZXQgdXAtYW5kLXJ1bm5pbmcgdmVyeSBxdWlja2x5Lg0KLSAqICBUaG91Z2ggSURMJ3Mgc3ludGF4IGlzIHZlcnkgc2ltaWxhciB0byBDKyssIGl0IGlzIGFsc28NCi0gKiAgbXVjaCBzaW1wbGVyLCBkdWUgaW4gbGFyZ2UgcGFydCB0byB0aGUgZmFjdCB0aGF0IGl0IGlzDQotICogIGEgZGVjbGFyYXRpdmUtb25seSBsYW5ndWFnZS4NCi0gKg0KLSAqICBTb21lIHRoaW5ncyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgYXJlOiBTeW1ib2wgdGFibGUgY29uc3RydWN0aW9uDQotICogIChpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBwYXJzaW5nLCBidHcpIGFuZCBwcmVwcm9jZXNzaW5nIChmb3INCi0gKiAgSURMIGNvbXBpbGVyICNwcmFnbWEgZGlyZWN0aXZlcykuIFlvdSBjYW4gdXNlIGp1c3QgYWJvdXQgYW55DQotICogIEMgb3IgQysrIHByZXByb2Nlc3NvciwgYnV0IHRoZXJlIGlzIGFuIGludGVyZXN0aW5nIHNlbWFudGljDQotICogIGlzc3VlIGlmIHlvdSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgY29kZTogSW4gQywgI2luY2x1ZGUgaXMNCi0gKiAgYSBsaXRlcmFsIGluY2x1ZGUsIGluIElETCwgI2luY2x1ZGUgaXMgbW9yZSBsaWtlIEphdmEncyBpbXBvcnQ6DQotICogIEl0IGFkZHMgZGVmaW5pdGlvbnMgdG8gdGhlIHNjb3BlIG9mIHRoZSBwYXJzZSwgYnV0IGluY2x1ZGVkDQotICogIGRlZmluaXRpb25zIGFyZSBub3QgZ2VuZXJhdGVkLg0KLSAqDQotICogIEppbSBDb2tlciwgamNva2VyQG1hZ2VsYW5nLmNvbQ0KLSAqICBHYXJ5IER1emFuLCBnZHV6YW5AYmJuLmNvbQ0KLSAqLw0KLWNsYXNzIElETFBhcnNlciBleHRlbmRzIFBhcnNlcjsNCi1vcHRpb25zIHsNCi0JZXhwb3J0Vm9jYWI9SURMOw0KLQlidWlsZEFTVD10cnVlOw0KLQlrPTQ7DQotfQ0KLQ0KLXNwZWNpZmljYXRpb24NCi0JOiAgIChpbXBvcnRfZGNsKSogKGRlZmluaXRpb24pKw0KLQk7DQotDQotDQotZGVmaW5pdGlvbg0KLQk6ICAgKCAgIHR5cGVfZGNsIFNFTUkhDQotCSAgICB8ICAgY29uc3RfZGNsIFNFTUkhDQotCSAgICB8ICAgZXhjZXB0X2RjbCBTRU1JIQ0KLQkgICAgfCAgICgoImFic3RyYWN0IiB8ICJsb2NhbCIpPyAiaW50ZXJmYWNlIikgPT4gaW50ZXJmIFNFTUkhDQotCSAgICB8ICAgbW9kdWxlIFNFTUkhDQotCSAgICB8ICAgKCgiYWJzdHJhY3QiIHwgImN1c3RvbSIpPyAidmFsdWV0eXBlIikgPT4gdmFsdWUgU0VNSSENCi0JICAgIHwgICB0eXBlX2lkX2RjbCBTRU1JIQ0KLQkgICAgfCAgIHR5cGVfcHJlZml4X2RjbCBTRU1JIQ0KLQkgICAgfCAgICgoImFic3RyYWN0IiB8ICJjdXN0b20iKT8gImV2ZW50dHlwZSIpID0+IGV2ZW50IFNFTUkhDQotCSAgICB8ICAgY29tcG9uZW50IFNFTUkhDQotCSAgICB8ICAgaG9tZV9kY2wgU0VNSSENCi0JICAgICkNCi0JOw0KLQ0KLW1vZHVsZQ0KLQk6ICAgICJtb2R1bGUiXg0KLQkgICAgIGlkZW50aWZpZXINCi0JICAgICBMQ1VSTFkhIGQ6ZGVmaW5pdGlvbl9saXN0IFJDVVJMWSENCi0JOw0KLQ0KLWRlZmluaXRpb25fbGlzdA0KLQk6ICAgKGRlZmluaXRpb24pKw0KLQk7DQotDQotaW50ZXJmDQotCTogICAoICJhYnN0cmFjdCIgfCAibG9jYWwiICk/DQotCSAgICAiaW50ZXJmYWNlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgIC8vIGludGVyZmFjZV9uYW1lX2RjbA0KLQkgICAgKCAgIGludGVyZmFjZV9kY2wNCi0JICAgIHwgICAvLyBmb3J3YXJkX2RjbA0KLQkgICAgKQ0KLQk7DQotDQotaW50ZXJmYWNlX2RjbA0KLQk6ICAgaW50ZXJmYWNlX2hlYWRlcg0KLQkgICAgTENVUkxZISBpbnRlcmZhY2VfYm9keSBSQ1VSTFkhDQotCTsNCi0NCi0vLyBmb3J3YXJkX2RjbA0KLS8vIAk6ICAgLy8gaW50ZXJmYWNlX25hbWVfZGNsDQotLy8gCTsNCi0NCi0vLyBpbnRlcmZhY2VfbmFtZV9kY2wNCi0vLyAJOiAgICggImFic3RyYWN0IiB8ICJsb2NhbCIgKT8NCi0vLyAJICAgICJpbnRlcmZhY2UiXg0KLS8vIAkgICAgaWRlbnRpZmllcg0KLS8vIAk7DQotDQotaW50ZXJmYWNlX2hlYWRlcg0KLQk6ICAgLy8gaW50ZXJmYWNlX25hbWVfZGNsDQotCSAgICAoIGludGVyZmFjZV9pbmhlcml0YW5jZV9zcGVjICk/DQotCTsNCi0NCi1pbnRlcmZhY2VfYm9keQ0KLQk6ICAgKCBleHBvcnQgKSoNCi0JOw0KLQ0KLWV4cG9ydA0KLQk6ICAgKCAgIHR5cGVfZGNsIFNFTUkhDQotCSAgICB8ICAgY29uc3RfZGNsIFNFTUkhDQotCSAgICB8ICAgZXhjZXB0X2RjbCBTRU1JIQ0KLQkgICAgfCAgIGF0dHJfZGNsIFNFTUkhDQotCSAgICB8ICAgb3BfZGNsIFNFTUkhDQotCSAgICB8ICAgdHlwZV9pZF9kY2wgU0VNSSENCi0JICAgIHwgICB0eXBlX3ByZWZpeF9kY2wgU0VNSSENCi0JICAgIHwgICBQUkVQUk9DX0RJUkVDVElWRQ0KLQkgICAgKQ0KLQk7DQotDQotDQotaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWMNCi0JOiAgIENPTE9OXiBzY29wZWRfbmFtZV9saXN0DQotCTsNCi0NCi1pbnRlcmZhY2VfbmFtZQ0KLQk6ICAgc2NvcGVkX25hbWUNCi0JOw0KLQ0KLXNjb3BlZF9uYW1lX2xpc3QNCi0JOiAgICBzY29wZWRfbmFtZSAoQ09NTUEhIHNjb3BlZF9uYW1lKSoNCi0JOw0KLQ0KLQ0KLXNjb3BlZF9uYW1lDQotCTogICAoIFNDT1BFT1BeICk/IElERU5UXiAvKiBpZGVudGlmaWVyICovIChTQ09QRU9QISBpZGVudGlmaWVyKSoNCi0JOw0KLQ0KLS8qdmFsdWUNCi0JOiAgICggdmFsdWVfZGNsKQ0KLQk7Ki8NCi0NCi12YWx1ZQ0KLQk6ICAgKCB2YWx1ZV9kY2wNCi0JICAgIHwgdmFsdWVfYWJzX2RjbA0KLQkgICAgfCB2YWx1ZV9ib3hfZGNsDQotCSAgICB8IHZhbHVlX2N1c3RvbV9kY2wNCi0JICAgIHwgdmFsdWVfZm9yd2FyZF9kY2wNCi0JICAgICkNCi0JOw0KLQ0KLXZhbHVlX2ZvcndhcmRfZGNsDQotCTogICAidmFsdWV0eXBlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JOw0KLQ0KLXZhbHVlX2JveF9kY2wNCi0JOiAgICJ2YWx1ZXR5cGUiXg0KLQkgICAgaWRlbnRpZmllcg0KLQkgICAgdHlwZV9zcGVjDQotCTsNCi0NCi12YWx1ZV9hYnNfZGNsDQotCTogICAiYWJzdHJhY3QiDQotCSAgICAidmFsdWV0eXBlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgICggdmFsdWVfYWJzX2Z1bGxfZGNsDQotCSAgICB8IC8vIHZhbHVlX2Fic19mb3J3YXJkX2RjbA0KLQkgICAgKQ0KLQk7DQotDQotdmFsdWVfYWJzX2Z1bGxfZGNsDQotCTogICB2YWx1ZV9pbmhlcml0YW5jZV9zcGVjDQotCSAgICBMQ1VSTFkhICggZXhwb3J0ICkqIFJDVVJMWSENCi0JOw0KLQ0KLS8vIHZhbHVlX2Fic19mb3J3YXJkX2RjbA0KLS8vIAk6DQotLy8gCTsNCi0NCi12YWx1ZV9kY2wNCi0JOiAgICJ2YWx1ZXR5cGUiXg0KLQkgICAgaWRlbnRpZmllcg0KLQkgICAgdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYw0KLQkgICAgTENVUkxZISAodmFsdWVfZWxlbWVudCkqIFJDVVJMWSENCi0JOw0KLQ0KLS8qdmFsdWVfZGNsDQotCTogICB2YWx1ZV9oZWFkZXINCi0JICAgIExDVVJMWSEgKCB2YWx1ZV9lbGVtZW50ICkqIFJDVVJMWSENCi0JOw0KLSovDQotdmFsdWVfY3VzdG9tX2RjbA0KLQk6ICAgImN1c3RvbSJeDQotCSAgICB2YWx1ZV9kY2wNCi0JOw0KLQ0KLS8qdmFsdWVfaGVhZGVyDQotCTogICAidmFsdWV0eXBlIl4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgIHZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JOw0KLSovDQotdmFsdWVfaW5oZXJpdGFuY2Vfc3BlYw0KLS8qDQotCTogICAoIENPTE9OICggInRydW5jYXRhYmxlIiApPw0KLQkgICAgICB2YWx1ZV9uYW1lICggQ09NTUEhIHZhbHVlX25hbWUgKSoNCi0JICAgICk/DQotCSAgICAoICJzdXBwb3J0cyIgaW50ZXJmYWNlX25hbWUgKCBDT01NQSEgaW50ZXJmYWNlX25hbWUgKSogKT8NCi0JOw0KLSovDQotCTogICAoIHZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMgKT8NCi0JICAgICggdmFsdWVfaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWMgKT8NCi0JOw0KLQ0KLXZhbHVlX3ZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JOiAgIENPTE9OXiAoICJ0cnVuY2F0YWJsZSIgKT8NCi0JICAgIHZhbHVlX25hbWUgKCBDT01NQSEgdmFsdWVfbmFtZSApKg0KLQk7DQotDQotdmFsdWVfaW50ZXJmYWNlX2luaGVyaXRhbmNlX3NwZWMNCi0JOiAgICJzdXBwb3J0cyJeIGludGVyZmFjZV9uYW1lICggQ09NTUEhIGludGVyZmFjZV9uYW1lICkqDQotCTsNCi0NCi12YWx1ZV9uYW1lDQotCTogICBzY29wZWRfbmFtZQ0KLQk7DQotDQotdmFsdWVfZWxlbWVudA0KLQk6ICAgKCBleHBvcnQNCi0JICAgIHwgc3RhdGVfbWVtYmVyDQotCSAgICB8IGluaXRfZGNsDQotCSAgICApDQotCTsNCi0NCi1zdGF0ZV9tZW1iZXINCi0JOiAgICggInB1YmxpYyIgfCAicHJpdmF0ZSIgKQ0KLQkgICAgdHlwZV9zcGVjIGRlY2xhcmF0b3JzIFNFTUkhDQotCTsNCi0NCi1pbml0X2RjbA0KLQk6ICAgImZhY3RvcnkiXiBpZGVudGlmaWVyDQotCSAgICBMUEFSRU4hIChpbml0X3BhcmFtX2RlY2xzKT8gUlBBUkVOIQ0KLQkgICAgKHJhaXNlc19leHByKT8NCi0JICAgIFNFTUkhDQotCTsNCi0NCi1pbml0X3BhcmFtX2RlY2xzDQotCTogICBpbml0X3BhcmFtX2RlY2wgKCBDT01NQSEgaW5pdF9wYXJhbV9kZWNsICkqDQotCTsNCi0NCi1pbml0X3BhcmFtX2RlY2wNCi0JOiAgIGluaXRfcGFyYW1fYXR0cmlidXRlDQotCSAgICBwYXJhbV90eXBlX3NwZWMNCi0JICAgIHNpbXBsZV9kZWNsYXJhdG9yDQotCTsNCi0NCi1pbml0X3BhcmFtX2F0dHJpYnV0ZQ0KLQk6ICAgImluIg0KLQk7DQotDQotY29uc3RfZGNsDQotCTogICAiY29uc3QiXiBjb25zdF90eXBlIGlkZW50aWZpZXIgQVNTSUdOISBjb25zdF9leHANCi0JOw0KLQ0KLWNvbnN0X3R5cGUNCi0JOiAgIChpbnRlZ2VyX3R5cGUpID0+IGludGVnZXJfdHlwZQ0KLQl8ICAgY2hhcl90eXBlDQotCXwgICB3aWRlX2NoYXJfdHlwZQ0KLQl8ICAgYm9vbGVhbl90eXBlDQotCXwgICBmbG9hdGluZ19wdF90eXBlDQotCXwgICBzdHJpbmdfdHlwZQ0KLQl8ICAgd2lkZV9zdHJpbmdfdHlwZQ0KLQl8ICAgZml4ZWRfcHRfY29uc3RfdHlwZQ0KLQl8ICAgc2NvcGVkX25hbWUNCi0JfCAgIG9jdGV0X3R5cGUNCi0JOw0KLQ0KLQ0KLS8qICAgRVhQUkVTU0lPTlMgICAqLw0KLQ0KLWNvbnN0X2V4cA0KLQk6ICAgb3JfZXhwcg0KLQk7DQotDQotb3JfZXhwcg0KLQk6ICAgeG9yX2V4cHINCi0JICAgICggT1JeIC8vIG9yX29wDQotCSAgICAgIHhvcl9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8gb3Jfb3ANCi0vLyAJOiAgICBPUg0KLS8vIAk7DQotDQotDQoteG9yX2V4cHINCi0JOiAgIGFuZF9leHByDQotCSAgICAoIFhPUl4gLy8geG9yX29wDQotCSAgICAgIGFuZF9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8geG9yX29wDQotLy8gCTogICAgWE9SDQotLy8gCTsNCi0NCi1hbmRfZXhwcg0KLQk6ICAgc2hpZnRfZXhwcg0KLQkgICAgKCBBTkReIC8vIGFuZF9vcA0KLQkgICAgICBzaGlmdF9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8gYW5kX29wDQotLy8gCTogICAgQU5EDQotLy8gCTsNCi0NCi0NCi1zaGlmdF9leHByDQotCTogICBhZGRfZXhwcg0KLQkgICAgKCAoIExTSElGVF4NCi0JICAgICAgfCBSU0hJRlReDQotCSAgICAgICkgLy8gc2hpZnRfb3ANCi0JICAgIGFkZF9leHByDQotCSAgICApKg0KLQk7DQotDQotLy8gc2hpZnRfb3ANCi0vLyAJOiAgICBMU0hJRlQNCi0vLyAJfCAgICBSU0hJRlQNCi0vLyAJOw0KLQ0KLQ0KLWFkZF9leHByDQotCTogICBtdWx0X2V4cHINCi0JICAgICggKCBQTFVTXg0KLQkgICAgICB8IE1JTlVTXg0KLQkgICAgICApIC8vIGFkZF9vcA0KLQkgICAgICBtdWx0X2V4cHINCi0JICAgICkqDQotCTsNCi0NCi0vLyBhZGRfb3ANCi0vLyAJOiAgICBQTFVTDQotLy8gCXwgICAgTUlOVVMNCi0vLyAJOw0KLQ0KLW11bHRfZXhwcg0KLQk6ICAgdW5hcnlfZXhwcg0KLQkgICAgKCAoIFNUQVJeDQotCSAgICAgIHwgRElWXg0KLQkgICAgICB8IE1PRF4NCi0JICAgICAgKSAvLyBtdWx0X29wDQotCSAgICAgIHVuYXJ5X2V4cHINCi0JICAgICkqDQotCTsNCi0NCi0vLyBtdWx0X29wDQotLy8gCTogICAgU1RBUg0KLS8vIAl8ICAgIERJVg0KLS8vIAl8ICAgIE1PRA0KLS8vIAk7DQotDQotdW5hcnlfZXhwcg0KLQk6ICAgKCBNSU5VU14NCi0JICAgIHwgUExVU14NCi0JICAgIHwgVElMREVeDQotCSAgICApIC8vIHVuYXJ5X29wZXJhdG9yDQotCSAgICBwcmltYXJ5X2V4cHINCi0JfCAgIHByaW1hcnlfZXhwcg0KLQk7DQotDQotLy8gdW5hcnlfb3BlcmF0b3INCi0vLyAJOiAgIE1JTlVTDQotLy8gCXwgICBQTFVTDQotLy8gCXwgICBUSUxERQ0KLS8vIAk7DQotDQotLy8gTm9kZSBvZiB0eXBlIFRQcmltYXJ5RXhwIHNlcnZlcyB0byBhdm9pZCBpbmYuIHJlY3Vyc2lvbiBvbiB0cmVlIHBhcnNlDQotcHJpbWFyeV9leHByDQotCTogICBzY29wZWRfbmFtZQ0KLQl8ICAgbGl0ZXJhbA0KLQl8ICAgTFBBUkVOXiBjb25zdF9leHAgUlBBUkVODQotCTsNCi0NCi1saXRlcmFsDQotCTogICBpbnRlZ2VyX2xpdGVyYWwNCi0JfCAgIHN0cmluZ19saXRlcmFsDQotCXwgICB3aWRlX3N0cmluZ19saXRlcmFsDQotCXwgICBjaGFyYWN0ZXJfbGl0ZXJhbA0KLQl8ICAgd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbA0KLQl8ICAgZml4ZWRfcHRfbGl0ZXJhbA0KLQl8ICAgZmxvYXRpbmdfcHRfbGl0ZXJhbA0KLQl8ICAgYm9vbGVhbl9saXRlcmFsDQotCTsNCi0NCi1ib29sZWFuX2xpdGVyYWwNCi0JOiAgICJUUlVFIg0KLQl8ICAgIkZBTFNFIg0KLQk7DQotDQotcG9zaXRpdmVfaW50X2NvbnN0DQotCTogICAgY29uc3RfZXhwDQotCTsNCi0NCi0NCi10eXBlX2RjbA0KLQk6ICAgInR5cGVkZWYiXiB0eXBlX2RlY2xhcmF0b3INCi0JfCAgIChzdHJ1Y3RfdHlwZSkgPT4gc3RydWN0X3R5cGUNCi0JfCAgICh1bmlvbl90eXBlKSA9PiB1bmlvbl90eXBlDQotCXwgICBlbnVtX3R5cGUNCi0JfCAgICJuYXRpdmUiXiBzaW1wbGVfZGVjbGFyYXRvcg0KLQl8ICAgY29uc3RyX2ZvcndhcmRfZGVjbA0KLQk7DQotDQotdHlwZV9kZWNsYXJhdG9yDQotCTogICB0eXBlX3NwZWMgZGVjbGFyYXRvcnMNCi0JOw0KLQ0KLXR5cGVfc3BlYw0KLQk6ICAgc2ltcGxlX3R5cGVfc3BlYw0KLQl8ICAgY29uc3RyX3R5cGVfc3BlYw0KLQk7DQotDQotc2ltcGxlX3R5cGVfc3BlYw0KLQk6ICAgYmFzZV90eXBlX3NwZWMNCi0JfCAgIHRlbXBsYXRlX3R5cGVfc3BlYw0KLQl8ICAgc2NvcGVkX25hbWUNCi0JOw0KLQ0KLWJhc2VfdHlwZV9zcGVjDQotCTogICAoZmxvYXRpbmdfcHRfdHlwZSkgPT4gZmxvYXRpbmdfcHRfdHlwZQkNCi0JfCAgIGludGVnZXJfdHlwZQkNCi0JfCAgIGNoYXJfdHlwZQkJDQotCXwgICB3aWRlX2NoYXJfdHlwZQkJDQotCXwgICBib29sZWFuX3R5cGUJDQotCXwgICBvY3RldF90eXBlDQotCXwgICBhbnlfdHlwZQ0KLQl8ICAgb2JqZWN0X3R5cGUNCi0JfCAgIHZhbHVlX2Jhc2VfdHlwZQ0KLQk7DQotDQotdGVtcGxhdGVfdHlwZV9zcGVjDQotCTogICBzZXF1ZW5jZV90eXBlDQotCXwgICBzdHJpbmdfdHlwZQ0KLQl8ICAgd2lkZV9zdHJpbmdfdHlwZQ0KLQl8ICAgZml4ZWRfcHRfdHlwZQ0KLQk7DQotDQotY29uc3RyX3R5cGVfc3BlYw0KLQk6ICAgc3RydWN0X3R5cGUNCi0JfCAgIHVuaW9uX3R5cGUNCi0JfCAgIGVudW1fdHlwZQ0KLQk7DQotDQotZGVjbGFyYXRvcnMNCi0JOiAgIGRlY2xhcmF0b3IgKENPTU1BISBkZWNsYXJhdG9yKSoNCi0JOw0KLQ0KLWRlY2xhcmF0b3INCi0JOiAgIHNpbXBsZV9kZWNsYXJhdG9yDQotCXwgICBjb21wbGV4X2RlY2xhcmF0b3INCi0JOw0KLQ0KLXNpbXBsZV9kZWNsYXJhdG9yDQotCTogICBpZGVudGlmaWVyDQotCTsNCi0NCi1jb21wbGV4X2RlY2xhcmF0b3INCi0JOiAgIGFycmF5X2RlY2xhcmF0b3INCi0JOw0KLQ0KLWZsb2F0aW5nX3B0X3R5cGUNCi0JOiAgICJmbG9hdCINCi0JfCAgICJkb3VibGUiDQotCXwgICAibG9uZyJeICJkb3VibGUiDQotCTsNCi0NCi1pbnRlZ2VyX3R5cGUNCi0JOiAgc2lnbmVkX2ludA0KLQl8ICB1bnNpZ25lZF9pbnQNCi0JOw0KLQ0KLXNpZ25lZF9pbnQNCi0JOiAgc2lnbmVkX3Nob3J0X2ludA0KLQl8ICBzaWduZWRfbG9uZ19pbnQNCi0JfCAgc2lnbmVkX2xvbmdsb25nX2ludA0KLQk7DQotDQotc2lnbmVkX3Nob3J0X2ludA0KLQk6ICAic2hvcnQiDQotCTsNCi0NCi1zaWduZWRfbG9uZ19pbnQNCi0JOiAgImxvbmciDQotCTsNCi0NCi1zaWduZWRfbG9uZ2xvbmdfaW50DQotCTogICJsb25nIiAibG9uZyINCi0JOw0KLQ0KLXVuc2lnbmVkX2ludA0KLQk6ICB1bnNpZ25lZF9zaG9ydF9pbnQNCi0JfCAgdW5zaWduZWRfbG9uZ19pbnQNCi0JfCAgdW5zaWduZWRfbG9uZ2xvbmdfaW50DQotCTsNCi0NCi11bnNpZ25lZF9zaG9ydF9pbnQNCi0JOiAgInVuc2lnbmVkIiAic2hvcnQiDQotCTsNCi0NCi11bnNpZ25lZF9sb25nX2ludA0KLQk6ICAidW5zaWduZWQiICJsb25nIg0KLQk7DQotDQotdW5zaWduZWRfbG9uZ2xvbmdfaW50DQotCTogICJ1bnNpZ25lZCIgImxvbmciICJsb25nIg0KLQk7DQotDQotY2hhcl90eXBlDQotCTogICAiY2hhciINCi0JOw0KLQ0KLXdpZGVfY2hhcl90eXBlDQotCTogICAid2NoYXIiDQotCTsNCi0NCi1ib29sZWFuX3R5cGUNCi0JOiAgICJib29sZWFuIg0KLQk7DQotDQotb2N0ZXRfdHlwZQ0KLQk6ICAgIm9jdGV0Ig0KLQk7DQotDQotYW55X3R5cGUNCi0JOiAgICJhbnkiDQotCTsNCi0NCi1vYmplY3RfdHlwZQ0KLQk6ICAgIk9iamVjdCINCi0JOw0KLQ0KLXN0cnVjdF90eXBlDQotCTogICAic3RydWN0Il4NCi0JICAgIGlkZW50aWZpZXINCi0JICAgIExDVVJMWSEgbWVtYmVyX2xpc3QgUkNVUkxZIQ0KLQk7DQotDQotbWVtYmVyX2xpc3QNCi0JOiAgIChtZW1iZXIpKw0KLQk7DQotDQotbWVtYmVyDQotCTogICB0eXBlX3NwZWMgZGVjbGFyYXRvcnMgU0VNSSENCi0JOw0KLQ0KLXVuaW9uX3R5cGUNCi0JOiAgICJ1bmlvbiJeDQotCSAgICBpZGVudGlmaWVyDQotCSAgICAic3dpdGNoIiEgTFBBUkVOISBzd2l0Y2hfdHlwZV9zcGVjIFJQQVJFTiENCi0JICAgIExDVVJMWSEgc3dpdGNoX2JvZHkgUkNVUkxZIQ0KLQk7DQotDQotc3dpdGNoX3R5cGVfc3BlYw0KLQk6ICAgaW50ZWdlcl90eXBlDQotCXwgICBjaGFyX3R5cGUNCi0JfCAgIGJvb2xlYW5fdHlwZQ0KLQl8ICAgZW51bV90eXBlDQotCXwgICBzY29wZWRfbmFtZQ0KLQk7DQotDQotc3dpdGNoX2JvZHkNCi0JOiAgIGNhc2Vfc3RtdF9saXN0DQotCTsNCi0NCi1jYXNlX3N0bXRfbGlzdA0KLQk6ICAoY2FzZV9zdG10KSsNCi0JOw0KLQ0KLWNhc2Vfc3RtdA0KLQk6ICAgLy8gY2FzZV9sYWJlbF9saXN0DQotCSAgICAoICJjYXNlIl4gY29uc3RfZXhwIENPTE9OIQ0KLQkgICAgfCAiZGVmYXVsdCJeIENPTE9OIQ0KLQkgICAgKSsNCi0JICAgIGVsZW1lbnRfc3BlYyBTRU1JIQ0KLQk7DQotDQotLy8gY2FzZV9sYWJlbF9saXN0DQotLy8gCTogICAoY2FzZV9sYWJlbCkrDQotLy8gCTsNCi0NCi0NCi0vLyBjYXNlX2xhYmVsDQotLy8gCTogICAiY2FzZSJeIGNvbnN0X2V4cCBDT0xPTiENCi0vLyAJfCAgICJkZWZhdWx0Il4gQ09MT04hDQotLy8gCTsNCi0NCi1lbGVtZW50X3NwZWMNCi0JOiAgIHR5cGVfc3BlYyBkZWNsYXJhdG9yDQotCTsNCi0NCi1lbnVtX3R5cGUNCi0JOiAgICJlbnVtIl4gaWRlbnRpZmllciBMQ1VSTFkhIGVudW1lcmF0b3JfbGlzdCBSQ1VSTFkhDQotCTsNCi0NCi1lbnVtZXJhdG9yX2xpc3QNCi0JOiAgICBlbnVtZXJhdG9yIChDT01NQSEgZW51bWVyYXRvcikqDQotCTsNCi0NCi1lbnVtZXJhdG9yDQotCTogICBpZGVudGlmaWVyDQotCTsNCi0NCi1zZXF1ZW5jZV90eXBlDQotCTogICAic2VxdWVuY2UiXg0KLQkgICAgIExUISBzaW1wbGVfdHlwZV9zcGVjIG9wdF9wb3NfaW50IEdUIQ0KLQk7DQotDQotb3B0X3Bvc19pbnQNCi0JOiAgICAoQ09NTUEhIHBvc2l0aXZlX2ludF9jb25zdCk/DQotCTsNCi0NCi1zdHJpbmdfdHlwZQ0KLQk6ICAgInN0cmluZyJeIChMVCEgcG9zaXRpdmVfaW50X2NvbnN0IEdUISk/DQotCTsNCi0NCi13aWRlX3N0cmluZ190eXBlDQotCTogICAid3N0cmluZyJeIChMVCEgcG9zaXRpdmVfaW50X2NvbnN0IEdUISk/DQotCTsNCi0NCi1hcnJheV9kZWNsYXJhdG9yDQotCTogICBJREVOVF4JCQkJCS8vIGlkZW50aWZpZXINCi0JICAgIChmaXhlZF9hcnJheV9zaXplKSsNCi0JOw0KLQ0KLWZpeGVkX2FycmF5X3NpemUNCi0JOiAgIExCUkFDSyEgcG9zaXRpdmVfaW50X2NvbnN0IFJCUkFDSyENCi0JOw0KLQ0KLWF0dHJfZGNsDQotCTogICByZWFkb25seV9hdHRyX3NwZWMNCi0JfCAgIGF0dHJfc3BlYw0KLQk7DQotDQotZXhjZXB0X2RjbA0KLQk6ICAgImV4Y2VwdGlvbiJeDQotCSAgICBpZGVudGlmaWVyDQotCSAgICBMQ1VSTFkhIG9wdF9tZW1iZXJfbGlzdCBSQ1VSTFkhDQotCTsNCi0NCi0NCi1vcHRfbWVtYmVyX2xpc3QNCi0JOiAgICAobWVtYmVyKSoNCi0JOw0KLQ0KLW9wX2RjbA0KLQk6ICAgKG9wX2F0dHJpYnV0ZSk/DQotCSAgICBvcF90eXBlX3NwZWMNCi0JICAgIElERU5UXgkJCQkvLyBpZGVudGlmaWVyDQotCSAgICBwYXJhbWV0ZXJfZGNscw0KLQkgICAgKHJhaXNlc19leHByKT8NCi0JICAgIChjb250ZXh0X2V4cHIpPw0KLQk7DQotDQotb3BfYXR0cmlidXRlDQotCTogICAib25ld2F5Ig0KLQk7DQotDQotb3BfdHlwZV9zcGVjDQotCTogICBwYXJhbV90eXBlX3NwZWMNCi0JfCAgICJ2b2lkIg0KLQk7DQotDQotcGFyYW1ldGVyX2RjbHMNCi0JOiAgIExQQVJFTiEgKHBhcmFtX2RjbF9saXN0KT8gUlBBUkVOIQ0KLQk7DQotDQotcGFyYW1fZGNsX2xpc3QNCi0JOiAgIHBhcmFtX2RjbCAoQ09NTUEhIHBhcmFtX2RjbCkqDQotCTsNCi0NCi1wYXJhbV9kY2wNCi0JOiAgICgiaW4iXiB8ICJvdXQiXiB8ICJpbm91dCJeKQkJLy8gcGFyYW1fYXR0cmlidXRlDQotCSAgICBwYXJhbV90eXBlX3NwZWMgc2ltcGxlX2RlY2xhcmF0b3INCi0JOw0KLQ0KLS8vIHBhcmFtX2F0dHJpYnV0ZQ0KLS8vIAk6ICAgImluIg0KLS8vIAl8ICAgIm91dCINCi0vLyAJfCAgICJpbm91dCINCi0vLyAJOw0KLQ0KLXJhaXNlc19leHByDQotCTogICAicmFpc2VzIl4gTFBBUkVOISBzY29wZWRfbmFtZV9saXN0IFJQQVJFTiENCi0JOw0KLQ0KLWNvbnRleHRfZXhwcg0KLQk6ICAgImNvbnRleHQiXiBMUEFSRU4hIHN0cmluZ19saXRlcmFsX2xpc3QgUlBBUkVOIQ0KLQk7DQotDQotc3RyaW5nX2xpdGVyYWxfbGlzdA0KLQk6ICAgIHN0cmluZ19saXRlcmFsIChDT01NQSEgc3RyaW5nX2xpdGVyYWwpKg0KLQk7DQotDQotcGFyYW1fdHlwZV9zcGVjDQotCTogICBiYXNlX3R5cGVfc3BlYw0KLQl8ICAgc3RyaW5nX3R5cGUNCi0JfCAgIHdpZGVfc3RyaW5nX3R5cGUNCi0JfCAgIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1maXhlZF9wdF90eXBlDQotCTogICAiZml4ZWQiXiBMVCEgcG9zaXRpdmVfaW50X2NvbnN0IENPTU1BISBwb3NpdGl2ZV9pbnRfY29uc3QgR1QhDQotCTsNCi0NCi1maXhlZF9wdF9jb25zdF90eXBlDQotCTogICAiZml4ZWQiDQotCTsNCi0NCi12YWx1ZV9iYXNlX3R5cGUNCi0JOiAgICJWYWx1ZUJhc2UiDQotCTsNCi0NCi1jb25zdHJfZm9yd2FyZF9kZWNsDQotCTogICAic3RydWN0Il4gaWRlbnRpZmllcg0KLQl8ICAgInVuaW9uIl4gaWRlbnRpZmllcg0KLQk7DQotDQotaW1wb3J0X2RjbA0KLQk6ICAgImltcG9ydCJeIGltcG9ydGVkX3Njb3BlIFNFTUkhDQotCTsNCi0NCi1pbXBvcnRlZF9zY29wZQ0KLQk6ICAgc2NvcGVkX25hbWUNCi0JfCAgIHN0cmluZ19saXRlcmFsDQotCTsNCi0NCi10eXBlX2lkX2RjbA0KLQk6ICAgInR5cGVpZCJeDQotCSAgICBzY29wZWRfbmFtZQ0KLQkgICAgc3RyaW5nX2xpdGVyYWwNCi0JOw0KLQ0KLXR5cGVfcHJlZml4X2RjbA0KLQk6ICAgInR5cGVwcmVmaXgiXg0KLQkgICAgc2NvcGVkX25hbWUNCi0JICAgIHN0cmluZ19saXRlcmFsDQotCTsNCi0NCi1yZWFkb25seV9hdHRyX3NwZWMNCi0JOiAgICJyZWFkb25seSIgImF0dHJpYnV0ZSJeDQotCSAgICBwYXJhbV90eXBlX3NwZWMNCi0JICAgIHJlYWRvbmx5X2F0dHJfZGVjbGFyYXRvcg0KLQk7DQotDQotcmVhZG9ubHlfYXR0cl9kZWNsYXJhdG9yDQotCTogICBzaW1wbGVfZGVjbGFyYXRvcg0KLQkgICAgKCByYWlzZXNfZXhwcg0KLQkgICAgfCAoQ09NTUEhIHNpbXBsZV9kZWNsYXJhdG9yKSoNCi0JICAgICkNCi0JOw0KLQ0KLWF0dHJfc3BlYw0KLQk6ICAgImF0dHJpYnV0ZSJeIHBhcmFtX3R5cGVfc3BlYyBhdHRyX2RlY2xhcmF0b3INCi0JOw0KLQ0KLWF0dHJfZGVjbGFyYXRvcg0KLQk6ICAgc2ltcGxlX2RlY2xhcmF0b3INCi0JICAgICggKCJnZXRyYWlzZXMiIHwgInNldHJhaXNlcyIpID0+IGF0dHJfcmFpc2VzX2V4cHINCi0JICAgIHwgKENPTU1BISBzaW1wbGVfZGVjbGFyYXRvcikqDQotCSAgICApDQotCTsNCi0NCi1hdHRyX3JhaXNlc19leHByDQotCTogICAoZ2V0X2V4Y2VwX2V4cHIpPw0KLQkgICAgKHNldF9leGNlcF9leHByKT8NCi0JOw0KLQ0KLWdldF9leGNlcF9leHByDQotCTogICAiZ2V0cmFpc2VzIl4gZXhjZXB0aW9uX2xpc3QNCi0JOw0KLQ0KLXNldF9leGNlcF9leHByDQotCTogICAic2V0cmFpc2VzIl4gZXhjZXB0aW9uX2xpc3QNCi0JOw0KLQ0KLWV4Y2VwdGlvbl9saXN0DQotCTogICBMUEFSRU4hIHNjb3BlZF9uYW1lIChDT01NQSEgc2NvcGVkX25hbWUpKiBSUEFSRU4hDQotCTsNCi0NCi0vLyBDb21wb25lbnQgU3R1ZmYNCi0NCi1jb21wb25lbnQNCi0JOiAgICJjb21wb25lbnQiXg0KLQkgICAgaWRlbnRpZmllcg0KLQkgICAgKGNvbXBvbmVudF9kY2wpPw0KLQk7DQotDQotY29tcG9uZW50X2RjbA0KLQk6ICAgKGNvbXBvbmVudF9pbmhlcml0YW5jZV9zcGVjKT8NCi0JICAgIChzdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMpPw0KLQkgICAgTENVUkxZISBjb21wb25lbnRfYm9keSBSQ1VSTFkhDQotCTsNCi0NCi1zdXBwb3J0ZWRfaW50ZXJmYWNlX3NwZWMNCi0JOiAgICJzdXBwb3J0cyJeIHNjb3BlZF9uYW1lICggQ09NTUEhIHNjb3BlZF9uYW1lICkqDQotCTsNCi0NCi1jb21wb25lbnRfaW5oZXJpdGFuY2Vfc3BlYw0KLQk6ICAgQ09MT05eIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1jb21wb25lbnRfYm9keQ0KLQk6ICAgKGNvbXBvbmVudF9leHBvcnQpKg0KLQk7DQotDQotY29tcG9uZW50X2V4cG9ydA0KLQk6ICAgKCBwcm92aWRlc19kY2wgU0VNSSENCi0JICAgIHwgdXNlc19kY2wgU0VNSSENCi0JICAgIHwgZW1pdHNfZGNsIFNFTUkhDQotCSAgICB8IHB1Ymxpc2hlc19kY2wgU0VNSSENCi0JICAgIHwgY29uc3VtZXNfZGNsIFNFTUkhDQotCSAgICB8IGF0dHJfZGNsIFNFTUkhDQotCSAgICApDQotCTsNCi0NCi1wcm92aWRlc19kY2wNCi0JOiAgICJwcm92aWRlcyJeIGludGVyZmFjZV90eXBlIGlkZW50aWZpZXINCi0JOw0KLQ0KLWludGVyZmFjZV90eXBlDQotCTogICAoIHNjb3BlZF9uYW1lDQotCSAgICB8ICJPYmplY3QiDQotCSAgICApDQotCTsNCi0NCi11c2VzX2RjbA0KLQk6ICAgInVzZXMiXiAoIm11bHRpcGxlIik/IGludGVyZmFjZV90eXBlIGlkZW50aWZpZXINCi0JOw0KLQ0KLWVtaXRzX2RjbA0KLQk6ICAgImVtaXRzIl4gc2NvcGVkX25hbWUgaWRlbnRpZmllcg0KLQk7DQotDQotcHVibGlzaGVzX2RjbA0KLQk6ICAgInB1Ymxpc2hlcyJeIHNjb3BlZF9uYW1lIGlkZW50aWZpZXINCi0JOw0KLQ0KLWNvbnN1bWVzX2RjbA0KLQk6ICAgImNvbnN1bWVzIl4gc2NvcGVkX25hbWUgaWRlbnRpZmllcg0KLQk7DQotDQotaG9tZV9kY2wNCi0JOiAgIGhvbWVfaGVhZGVyIGhvbWVfYm9keQ0KLQk7DQotDQotaG9tZV9oZWFkZXINCi0JOiAgICJob21lIl4gaWRlbnRpZmllcg0KLQkgICAgKGhvbWVfaW5oZXJpdGFuY2Vfc3BlYyk/DQotCSAgICAoc3VwcG9ydGVkX2ludGVyZmFjZV9zcGVjKT8NCi0JICAgICJtYW5hZ2VzIiEgc2NvcGVkX25hbWUNCi0JICAgIChwcmltYXJ5X2tleV9zcGVjKT8NCi0JOw0KLQ0KLWhvbWVfaW5oZXJpdGFuY2Vfc3BlYw0KLQk6ICAgQ09MT05eIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1wcmltYXJ5X2tleV9zcGVjDQotCTogICAicHJpbWFyeWtleSJeIHNjb3BlZF9uYW1lDQotCTsNCi0NCi1ob21lX2JvZHkNCi0JOiAgIExDVVJMWSEgKGhvbWVfZXhwb3J0KSogUkNVUkxZIQ0KLQk7DQotDQotaG9tZV9leHBvcnQNCi0JOiAgICggZXhwb3J0DQotCSAgICB8IGZhY3RvcnlfZGNsIFNFTUkhDQotCSAgICB8IGZpbmRlcl9kY2wgU0VNSSENCi0JICAgICkNCi0JOw0KLQ0KLWZhY3RvcnlfZGNsDQotCTogICAiZmFjdG9yeSJeIGlkZW50aWZpZXINCi0JICAgIExQQVJFTiEgaW5pdF9wYXJhbV9kZWNscyBSUEFSRU4hDQotCSAgICAocmFpc2VzX2V4cHIpPw0KLQk7DQotDQotZmluZGVyX2RjbA0KLQk6ICAgImZpbmRlciJeIGlkZW50aWZpZXINCi0JICAgIExQQVJFTiEgaW5pdF9wYXJhbV9kZWNscyBSUEFSRU4hDQotCSAgICAocmFpc2VzX2V4cHIpPw0KLQk7DQotDQotZXZlbnQNCi0JOiAgICggZXZlbnRfYWJzDQotCSAgICB8IGV2ZW50X2N1c3RvbQ0KLQkgICAgfCBldmVudF9kY2wNCi0JICAgICkNCi0JOw0KLQ0KLWV2ZW50X2hlYWRlcg0KLQk6ICAgImV2ZW50dHlwZSJeDQotCSAgICBpZGVudGlmaWVyDQotCTsNCi0NCi1ldmVudF9hYnMNCi0JOiAgICJhYnN0cmFjdCJeDQotCSAgICBldmVudF9oZWFkZXINCi0JICAgIChldmVudF9hYnNfZGNsKT8NCi0JOw0KLQ0KLWV2ZW50X2Fic19kY2wNCi0JOiAgIHZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JICAgIExDVVJMWSEgKGV4cG9ydCkqIFJDVVJMWSENCi0JOw0KLQ0KLWV2ZW50X2N1c3RvbQ0KLQk6ICAgImN1c3RvbSJeDQotCSAgICBldmVudF9oZWFkZXINCi0JICAgIGV2ZW50X2VsZW1fZGNsDQotCTsNCi0NCi1ldmVudF9kY2wNCi0JOiAgIGV2ZW50X2hlYWRlcg0KLQkgICAgKCBldmVudF9lbGVtX2RjbA0KLQkgICAgfCAvLyBldmVudF9mb3J3YXJkX2RjbA0KLQkgICAgKQ0KLQk7DQotDQotZXZlbnRfZWxlbV9kY2wNCi0JOiAgIHZhbHVlX2luaGVyaXRhbmNlX3NwZWMNCi0JICAgIExDVVJMWSEgKGV4cG9ydCkqIFJDVVJMWSENCi0JOw0KLQ0KLS8vIGV2ZW50X2ZvcndhcmRfZGNsDQotLy8gCToNCi0vLyAJOw0KLQ0KLS8qIGxpdGVyYWxzICovDQotaW50ZWdlcl9saXRlcmFsDQotCTogICBJTlQNCi0JfCAgIE9DVEFMDQotCXwgICBIRVgNCi0JOw0KLQ0KLXN0cmluZ19saXRlcmFsDQotCTogIChTVFJJTkdfTElURVJBTCkrDQotCTsNCi0NCi13aWRlX3N0cmluZ19saXRlcmFsDQotCTogIChXSURFX1NUUklOR19MSVRFUkFMKSsNCi0JOw0KLQ0KLWNoYXJhY3Rlcl9saXRlcmFsDQotCTogIENIQVJfTElURVJBTA0KLQk7DQotDQotd2lkZV9jaGFyYWN0ZXJfbGl0ZXJhbA0KLQk6ICBXSURFX0NIQVJfTElURVJBTA0KLQk7DQotDQotZml4ZWRfcHRfbGl0ZXJhbA0KLQk6ICBGSVhFRA0KLQk7DQotDQotZmxvYXRpbmdfcHRfbGl0ZXJhbA0KLQk6ICAgZjpGTE9BVA0KLQk7DQotDQotaWRlbnRpZmllcg0KLQk6ICAgSURFTlQNCi0JOw0KLQ0KLS8qIElETCBMRVhJQ0FMIFJVTEVTICAqLw0KLWNsYXNzIElETExleGVyIGV4dGVuZHMgTGV4ZXI7DQotb3B0aW9ucyB7DQotCWV4cG9ydFZvY2FiPUlETDsNCi0JY2hhclZvY2FidWxhcnk9J1x1MDAwMCcuLidcdUZGRkUnOw0KLQlrPTQ7DQotfQ0KLQ0KLVNFTUkNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiOyI7DQotfQ0KLQk6CSc7Jw0KLQk7DQotDQotUVVFU1RJT04NCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiPyI7DQotfQ0KLQk6CSc/Jw0KLQk7DQotDQotTFBBUkVODQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIigiOw0KLX0NCi0JOgknKCcNCi0JOw0KLQ0KLVJQQVJFTg0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIpIjsNCi19DQotCToJJyknDQotCTsNCi0NCi1MQlJBQ0sNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiWyI7DQotfQ0KLQk6CSdbJw0KLQk7DQotDQotUkJSQUNLDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIl0iOw0KLX0NCi0JOgknXScNCi0JOw0KLQ0KLUxDVVJMWQ0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJ7IjsNCi19DQotCToJJ3snDQotCTsNCi0NCi1SQ1VSTFkNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAifSI7DQotfQ0KLQk6CSd9Jw0KLQk7DQotDQotT1INCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAifCI7DQotfQ0KLQk6CSd8Jw0KLQk7DQotDQotWE9SDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIl4iOw0KLX0NCi0JOgknXicNCi0JOw0KLQ0KLUFORA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICImIjsNCi19DQotCToJJyYnDQotCTsNCi0NCi1DT0xPTg0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICI6IjsNCi19DQotCToJJzonDQotCTsNCi0NCi1DT01NQQ0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIsIjsNCi19DQotCToJJywnDQotCTsNCi0NCi1ET1QNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiLiI7DQotfQ0KLQk6CScuJw0KLQk7DQotDQotQVNTSUdODQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIj0iOw0KLX0NCi0JOgknPScNCi0JOw0KLQ0KLU5PVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIhIjsNCi19DQotCToJJyEnDQotCTsNCi0NCi1MVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICI8IjsNCi19DQotCToJJzwnDQotCTsNCi0NCi1MU0hJRlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiPDwiOw0KLX0NCi0JOiAiPDwiDQotCTsNCi0NCi1HVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICI+IjsNCi19DQotCToJJz4nDQotCTsNCi0NCi1SU0hJRlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiPj4iOw0KLX0NCi0JOiAiPj4iDQotCTsNCi0NCi1ESVYNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiLyI7DQotfQ0KLQk6CScvJw0KLQk7DQotDQotUExVUw0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIrIjsNCi19DQotCToJJysnDQotCTsNCi0NCi1NSU5VUw0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICItIjsNCi19DQotCToJJy0nDQotCTsNCi0NCi1USUxERQ0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJ+IjsNCi19DQotCToJJ34nDQotCTsNCi0NCi1TVEFSDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIioiOw0KLX0NCi0JOgknKicNCi0JOw0KLQ0KLU1PRA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICIlIjsNCi19DQotCToJJyUnDQotCTsNCi0NCi0NCi1TQ09QRU9QDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gIjo6IjsNCi19DQotCTogIAkiOjoiDQotCTsNCi0NCi1XUw0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJ3aGl0ZSBzcGFjZSI7DQotfQ0KLQk6CSgnICcNCi0JfAknXHQnDQotCXwJJ1xuJyAgeyBuZXdsaW5lKCk7IH0NCi0JfAknXHInKQ0KLQkJeyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgfQ0KLQk7DQotDQotDQotUFJFUFJPQ19ESVJFQ1RJVkUNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIjsNCi19DQotDQotCToNCi0JJyMnIQ0KLQkofidcbicpKiAnXG4nIQ0KLQk7DQotDQotDQotU0xfQ09NTUVOVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGNvbW1lbnQiOw0KLX0NCi0NCi0JOg0KLQkiLy8iIQ0KLQkofidcbicpKiAnXG4nDQotCXsgJHNldFR5cGUoVG9rZW4uU0tJUCk7IG5ld2xpbmUoKTsgfQ0KLQk7DQotDQotTUxfQ09NTUVOVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGNvbW1lbnQiOw0KLX0NCi0JOg0KLQkiLyoiIQ0KLQkoDQotCQkJJ1xuJyB7IG5ld2xpbmUoKTsgfQ0KLQkJfAkoJyonKSsNCi0JCQkoCSdcbicgeyBuZXdsaW5lKCk7IH0NCi0JCQl8CX4oJyonIHwgJy8nIHwgJ1xuJykNCi0JCQkpDQotCQl8CX4oJyonIHwgJ1xuJykNCi0JKSoNCi0JIiovIiENCi0JeyAkc2V0VHlwZShUb2tlbi5TS0lQKTsgIH0NCi0JOw0KLQ0KLUNIQVJfTElURVJBTA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGNoYXJhY3RlciBsaXRlcmFsIjsNCi19DQotCToNCi0JJ1wnJyENCi0JKCBFU0MgfCB+J1wnJyApDQotCSdcJychDQotCTsNCi0NCi1XSURFX0NIQVJfTElURVJBTA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIHdpZGUgY2hhcmFjdGVyIGxpdGVyYWwiOw0KLX0NCi0JOiAnTCchIENIQVJfTElURVJBTA0KLQk7DQotDQotU1RSSU5HX0xJVEVSQUwNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBzdHJpbmcgbGl0ZXJhbCI7DQotfQ0KLQk6DQotCSciJyENCi0JKEVTQ3x+JyInKSoNCi0JJyInIQ0KLQk7DQotDQotDQotV0lERV9TVFJJTkdfTElURVJBTA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIHdpZGUgc3RyaW5nIGxpdGVyYWwiOw0KLX0NCi0JOg0KLQknTCchIFNUUklOR19MSVRFUkFMDQotCTsNCi0NCi1wcm90ZWN0ZWQNCi1FU0MNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gZXNjYXBlIHNlcXVlbmNlIjsNCi19DQotCToJJ1xcJyENCi0JCSgJJ24nCQl7JHNldFRleHQoIlxuIik7fQ0KLQkJfAkndCcJCXskc2V0VGV4dCgiXHQiKTt9DQotCQl8CSd2JwkJeyRzZXRUZXh0KCJcMDEzIik7fQ0KLQkJfAknYicJCXskc2V0VGV4dCgiXGIiKTt9DQotCQl8CSdyJwkJeyRzZXRUZXh0KCJcciIpO30NCi0JCXwJJ2YnCQl7JHNldFRleHQoIlxyIik7fQ0KLQkJfAknYScgIAkJeyRzZXRUZXh0KCJcMDA3Iik7fQ0KLQkJfAknXFwnCQl7JHNldFRleHQoIlxcIik7fQ0KLQkJfAknPycgICAgIAl7JHNldFRleHQoIj8iKTt9DQotCQl8CSdcJycJCXskc2V0VGV4dCgiJyIpO30NCi0JCXwJJyInCQl7JHNldFRleHQoIlwiIik7fQ0KLQkJfAlPQ1RESUdJVA0KLQkJCShvcHRpb25zIHtncmVlZHk9dHJ1ZTt9Ok9DVERJR0lUDQotCQkJICAob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpPQ1RESUdJVCk/DQotCQkJKT8NCi0JCQl7Y2hhciByZWFsYyA9IChjaGFyKSBJbnRlZ2VyLnZhbHVlT2YoJGdldFRleHQsIDgpLmludFZhbHVlKCk7ICRzZXRUZXh0KHJlYWxjKTt9DQotCQl8ICAgICAgICd4JyEgSEVYRElHSVQNCi0JCQkob3B0aW9ucyB7Z3JlZWR5PXRydWU7fTpIRVhESUdJVCk/DQotCQkJe2NoYXIgcmVhbGMgPSAoY2hhcikgSW50ZWdlci52YWx1ZU9mKCRnZXRUZXh0LCAxNikuaW50VmFsdWUoKTsgJHNldFRleHQocmVhbGMpO30NCi0JCXwJJ3UnIQ0KLQkJCUhFWERJR0lUDQotCQkJKG9wdGlvbnMge2dyZWVkeT10cnVlO306SEVYRElHSVQNCi0JCQkgIChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9OkhFWERJR0lUDQotCQkJICAgIChvcHRpb25zIHtncmVlZHk9dHJ1ZTt9OkhFWERJR0lUKT8NCi0JCQkgICk/DQotCQkJKT8NCi0JCQl7Y2hhciByZWFsYyA9IChjaGFyKSBJbnRlZ2VyLnZhbHVlT2YoJGdldFRleHQsIDE2KS5pbnRWYWx1ZSgpOyAkc2V0VGV4dChyZWFsYyk7fQ0KLQkJKQ0KLQk7DQotDQotcHJvdGVjdGVkDQotVk9DQUINCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gZXNjYXBlZCBjaGFyYWN0ZXIgdmFsdWUiOw0KLX0NCi0JOgknXDMnLi4nXDM3NycNCi0JOw0KLQ0KLXByb3RlY3RlZA0KLURJR0lUDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gImEgZGlnaXQiOw0KLX0NCi0JOgknMCcuLic5Jw0KLQk7DQotDQotcHJvdGVjdGVkDQotTk9OWkVST0RJR0lUDQotb3B0aW9ucyB7DQotICBwYXJhcGhyYXNlID0gImEgbm9uLXplcm8gZGlnaXQiOw0KLX0NCi0JOgknMScuLic5Jw0KLQk7DQotDQotcHJvdGVjdGVkDQotT0NURElHSVQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gb2N0YWwgZGlnaXQiOw0KLX0NCi0JOgknMCcuLic3Jw0KLQk7DQotDQotcHJvdGVjdGVkDQotSEVYRElHSVQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBoZXhhZGVjaW1hbCBkaWdpdCI7DQotfQ0KLQk6CSgnMCcuLic5JyB8ICdhJy4uJ2YnIHwgJ0EnLi4nRicpDQotCTsNCi0NCi1IRVgNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYSBoZXhhZGVjaW1hbCB2YWx1ZSB2YWx1ZSI7DQotfQ0KLQ0KLQk6ICAgICgiMHgiIHwgIjBYIikgKEhFWERJR0lUKSsNCi0JOw0KLQ0KLUlOVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhbiBpbnRlZ2VyIHZhbHVlIjsNCi19DQotCTogICAgTk9OWkVST0RJR0lUIChESUdJVCkqICAgICAgICAgICAgICAgICAgLy8gYmFzZS0xMA0KLQkgICAgICggICcuJyAoRElHSVQpKg0KLQkJICggKCgnZScgfCAnRScpICgnKycgfCAnLScpPyAoRElHSVQpKykJeyRzZXRUeXBlKEZMT0FUKTt9DQotCQkgfCAoJ2QnIHwgJ0QnKSEJCQkJeyRzZXRUeXBlKEZJWEVEKTt9DQotCQkgfAkJCQkJeyRzZXRUeXBlKEZMT0FUKTt9DQotCQkgKQ0KLQkgICAgIHwgICAoJ2UnIHwgJ0UnKSAoJysnIHwgJy0nKT8gKERJR0lUKSsgICAJeyRzZXRUeXBlKEZMT0FUKTt9DQotCSAgICAgfCAgICgnZCcgfCAnRCcpIQkJCQl7JHNldFR5cGUoRklYRUQpO30NCi0JICAgICApPw0KLQk7DQotDQotT0NUQUwNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gb2N0YWwgdmFsdWUiOw0KLX0NCi0JOiAgICAnMCcNCi0JICAgICAoIChESUdJVCkrDQotCSAgICAgfCBGTE9BVAkJCQkJeyRzZXRUeXBlKEZMT0FUKTt9DQotCSAgICAgfCAoJ2QnIHwgJ0QnKSEJCQkJeyRzZXRUeXBlKEZJWEVEKTt9DQotCSAgICAgfAkJCQkJCXskc2V0VHlwZShJTlQpO30NCi0JICAgICApDQotCTsNCi0NCi0NCi1GTE9BVA0KLW9wdGlvbnMgew0KLSAgcGFyYXBocmFzZSA9ICJhIGZsb2F0aW5nIHBvaW50IHZhbHVlIjsNCi19DQotDQotCTogICAgJy4nIChESUdJVCkrDQotCSAgICAgKCAoJ2UnIHwgJ0UnKSAoJysnIHwgJy0nKT8gKERJR0lUKSsNCi0JICAgICB8ICgnZCcgfCAnRCcpIQkJCQl7JHNldFR5cGUoRklYRUQpO30NCi0JICAgICApPw0KLQk7DQotDQotSURFTlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gaWRlbnRpZmVyIjsNCi0gIHRlc3RMaXRlcmFscyA9IHRydWU7DQotfQ0KLQ0KLQk6ICAgKCdhJy4uJ3onfCdBJy4uJ1onKSAoJ2EnLi4neid8J0EnLi4nWid8J18nfCcwJy4uJzknKSoNCi0JOw0KLQ0KLUVTQ0FQRURfSURFTlQNCi1vcHRpb25zIHsNCi0gIHBhcmFwaHJhc2UgPSAiYW4gZXNjYXBlZCBpZGVudGlmZXIiOw0KLSAgdGVzdExpdGVyYWxzID0gZmFsc2U7CQkJLy8gcmVkdW5kYW50LCBidXQgZXhwbGljaXQgaXMgZ29vZC4NCi19DQotICAgIC8vIE5PVEU6IEFkZGluZyBhICEgdG8gdGhlICdfJyBkb2Vzbid0IHNlZW0gdG8gd29yaywNCi0gICAgLy8gICAgICAgc28gd2UgYWRqdXN0IF9iZWdpbiBtYW51YWxseS4NCi0NCi0JOiAgICdfJyAoJ2EnLi4neid8J0EnLi4nWicpICgnYScuLid6J3wnQScuLidaJ3wnXyd8JzAnLi4nOScpKg0KLQkJCQkJCQl7X2JlZ2luKys7JHNldFR5cGUoSURFTlQpO30NCi0JOw0KLQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BYnN0cmFjdENvbGxlY3Rpb25UeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvQWJzdHJhY3RDb2xsZWN0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY1OTdmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BYnN0cmFjdENvbGxlY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBleHRlbmRzIENvbXBvc2l0ZURhdGFUeXBlIHsNCi0gICAgcHJvdGVjdGVkIGludCBlbGVtZW50Q291bnQ7DQotICAgIHByb3RlY3RlZCBEYXRhVHlwZSBkYXRhVHlwZTsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50TW9kdWxlOw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnROYW1lOw0KLSAgICBwcm90ZWN0ZWQgaW50IGRlcHRoOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50Q291bnQoaW50IGVsZW1lbnRDb3VudCkgew0KLSAgICAgICAgdGhpcy5lbGVtZW50Q291bnQgPSBlbGVtZW50Q291bnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoKSB7DQotICAgICAgICByZXR1cm4gZWxlbWVudENvdW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7DQotICAgICAgICByZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBBcnJheVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VxdWVuY2UoKSB7DQotICAgICAgICByZXR1cm4gKHRoaXMgaW5zdGFuY2VvZiBTZXF1ZW5jZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE1vZHVsZSgpIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50TW9kdWxlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRNb2R1bGUoU3RyaW5nIGVsZW1lbnRNb2R1bGUpIHsNCi0gICAgICAgIHRoaXMuZWxlbWVudE1vZHVsZSA9IGVsZW1lbnRNb2R1bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBlbGVtZW50TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZShTdHJpbmcgZWxlbWVudE5hbWUpIHsNCi0gICAgICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoKCkgew0KLSAgICAgICAgcmV0dXJuIGRlcHRoOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERlcHRoKGludCBkZXB0aCkgew0KLSAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BcnJheVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9BcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2ZjdhNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotcHVibGljIGNsYXNzIEFycmF5VHlwZSBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgew0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBPUkIuaW5pdCgpLmNyZWF0ZV9hcnJheV90YyhlbGVtZW50Q291bnQsIGRhdGFUeXBlLmdldFR5cGVDb2RlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9Db21wb3NpdGVEYXRhVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0NvbXBvc2l0ZURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDRkY2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0NvbXBvc2l0ZURhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZURhdGFUeXBlIGV4dGVuZHMgRGF0YVR5cGUgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRExfUkVQT19TVFJJTkcgPSAiSURMOiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElETF9WRVJTSU9OID0gIjoxLjAiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfU0VQRVJBVE9SID0gIjo6IjsNCi0NCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsNCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1vZHVsZTsNCi0JcHJvdGVjdGVkIExpc3QgbWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0gICAgICAgIGlmIChpZD09bnVsbCkNCi0gICAgICAgICAgICBpZCA9IElETF9SRVBPX1NUUklORyArIG1vZHVsZS5yZXBsYWNlQWxsKE1PRFVMRV9TRVBFUkFUT1IsICIvIikgKyBuYW1lICsgSURMX1ZFUlNJT047DQotICAgICAgICByZXR1cm4gaWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7DQotICAgICAgICB0aGlzLmlkID0gaWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZSgpIHsNCi0gICAgICAgIHJldHVybiBtb2R1bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlKFN0cmluZyBtb2R1bGUpIHsNCi0gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE1lbWJlcihNZW1iZXIgbWVtYmVyKSB7DQotICAgICAgICBtZW1iZXJzLmFkZChtZW1iZXIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRNZW1iZXJzKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVyc0FycmF5ID0gbmV3IE1lbWJlclttZW1iZXJzLnNpemUoKV07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJzQXJyYXlbaV0gPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZW1iZXJzQXJyYXk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0RhdGFUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3MjgwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhVHlwZSB7DQotICAgIHByb3RlY3RlZCBUeXBlQ29kZSB0eXBlQ29kZTsNCi0NCi0gICAgcHVibGljIFR5cGVDb2RlIGdldFR5cGVDb2RlKCkgew0KLSAgICAgICAgaWYgKHR5cGVDb2RlPT1udWxsKQ0KLSAgICAgICAgICAgIHR5cGVDb2RlID0gZ2VuZXJhdGVUeXBlQ29kZSgpOw0KLSAgICAgICAgcmV0dXJuIHR5cGVDb2RlOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUeXBlQ29kZSBnZW5lcmF0ZVR5cGVDb2RlKCk7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9FbnVtVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0VudW1UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDY4NDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0VudW1UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBFbnVtVHlwZSBleHRlbmRzIENvbXBvc2l0ZURhdGFUeXBlIHsNCi0gICAgcHJpdmF0ZSBMaXN0IGVudW1NZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIFN0cmluZ1tdIGFyck1lbWJlcnMgPSBuZXcgU3RyaW5nW2VudW1NZW1iZXJzLnNpemUoKV07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1NZW1iZXJzLnNpemUoKTsgaSsrKQ0KLSAgICAgICAgICAgIGFyck1lbWJlcnNbaV0gPSAoU3RyaW5nKSBlbnVtTWVtYmVycy5nZXQoaSk7DQotDQotICAgICAgICByZXR1cm4gT1JCLmluaXQgKCkuY3JlYXRlX2VudW1fdGMgKGdldElkKCksIGdldE5hbWUoKSwgYXJyTWVtYmVycyk7ICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRFbnVtTWVtYmVycygpIHsNCi0gICAgICAgIHJldHVybiBlbnVtTWVtYmVyczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnVtTWVtYmVycyhMaXN0IGVudW1NZW1iZXJzKSB7DQotICAgICAgICB0aGlzLmVudW1NZW1iZXJzID0gZW51bU1lbWJlcnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRW51bU1lbWJlcihTdHJpbmcgcykgew0KLSAgICAgICAgZW51bU1lbWJlcnMuYWRkKHMpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9FeGNlcHRpb25UeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvRXhjZXB0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTEwM2Y1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9FeGNlcHRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotcHVibGljIGNsYXNzIEV4Y2VwdGlvblR5cGUgZXh0ZW5kcyBTdHJ1Y3Qgew0KLQlwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpew0KLQkJcmV0dXJuIE9SQi5pbml0KCkuY3JlYXRlX2V4Y2VwdGlvbl90YyhnZXRJZCgpLCBnZXROYW1lKCksIHByZXBhaXJTdHJ1Y3RNZW1iZXJzKCkpOw0KLQl9DQotDQotLy8gICAgcHVibGljIENsYXNzIGdldEphdmFUeXBlKCkgew0KLS8vICAgICAgICByZXR1cm4gRXhjZXB0aW9uVmFsdWUuY2xhc3M7DQotLy8gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvSURMLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvSURMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjYxMDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL0lETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBJREwgew0KLQlwcml2YXRlIE1hcCBjb21wb3NpdGVEYXRhVHlwZXM7DQotCXByaXZhdGUgTWFwIGludGVyZmFjZXM7DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0Q29tcG9zaXRlRGF0YVR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZURhdGFUeXBlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wb3NpdGVEYXRhVHlwZXMoamF2YS51dGlsLk1hcCBjb21wb3NpdGVEYXRhVHlwZXMpIHsNCi0gICAgICAgIHRoaXMuY29tcG9zaXRlRGF0YVR5cGVzID0gY29tcG9zaXRlRGF0YVR5cGVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFR5cGUoQ29tcG9zaXRlRGF0YVR5cGUgZGF0YVR5cGUpIHsNCi0gICAgICAgIGlmIChjb21wb3NpdGVEYXRhVHlwZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICBjb21wb3NpdGVEYXRhVHlwZXMgPSBuZXcgVHJlZU1hcCgpOw0KLSAgICAgICAgY29tcG9zaXRlRGF0YVR5cGVzLnB1dChkYXRhVHlwZS5nZXRNb2R1bGUoKSArIGRhdGFUeXBlLmdldE5hbWUoKSwgZGF0YVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBqYXZhLnV0aWwuTWFwIGdldEludGVyZmFjZXMoKSB7DQotICAgICAgICByZXR1cm4gaW50ZXJmYWNlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VzKGphdmEudXRpbC5NYXAgaW50ZXJmYWNlcykgew0KLSAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gaW50ZXJmYWNlczsNCi0gICAgICAgIGlmIChjb21wb3NpdGVEYXRhVHlwZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICBjb21wb3NpdGVEYXRhVHlwZXMgPSBuZXcgVHJlZU1hcCgpOw0KLSAgICAgICAgdGhpcy5jb21wb3NpdGVEYXRhVHlwZXMucHV0QWxsKGludGVyZmFjZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEludGVyZmFjZShJbnRlcmZhY2UgaW50Zikgew0KLSAgICAgICAgaWYgKGludGVyZmFjZXMgPT0gbnVsbCkNCi0gICAgICAgICAgICBpbnRlcmZhY2VzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgIGludGVyZmFjZXMucHV0KGludGYuZ2V0TW9kdWxlKCkgKyBpbnRmLmdldE5hbWUoKSwgaW50Zik7DQotICAgICAgICBpZiAoY29tcG9zaXRlRGF0YVR5cGVzID09IG51bGwpDQotICAgICAgICAgICAgY29tcG9zaXRlRGF0YVR5cGVzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgIGNvbXBvc2l0ZURhdGFUeXBlcy5wdXQoaW50Zi5nZXRNb2R1bGUoKSArIGludGYuZ2V0TmFtZSgpLCBpbnRmKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRJREwgKElETCBjaGlsZElkbCkgew0KLSAgICAgICAgTWFwIHRlbXAgPSBjaGlsZElkbC5nZXRJbnRlcmZhY2VzKCk7DQotICAgICAgICBpZiAodGVtcCE9bnVsbCkgew0KLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzPT1udWxsKQ0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgICAgICBpbnRlcmZhY2VzLnB1dEFsbCh0ZW1wKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRlbXAgPSBjaGlsZElkbC5nZXRDb21wb3NpdGVEYXRhVHlwZXMoKTsNCi0gICAgICAgIGlmICh0ZW1wIT1udWxsKSB7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZURhdGFUeXBlcz09bnVsbCkNCi0gICAgICAgICAgICAgICAgY29tcG9zaXRlRGF0YVR5cGVzID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgICAgICBjb21wb3NpdGVEYXRhVHlwZXMucHV0QWxsKHRlbXApOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9JbnRlcmZhY2UuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9JbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1YWIzMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlIGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLQlwcml2YXRlIGphdmEudXRpbC5NYXAgb3BlcmF0aW9uczsNCi0NCi0gICAgcHJvdGVjdGVkIFR5cGVDb2RlIGdlbmVyYXRlVHlwZUNvZGUoKXsNCi0gICAgICAgIHJldHVybiBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9pbnRlcmZhY2VfdGMgKGdldElkKCksIGdldE5hbWUoKSk7DQotCX0NCi0NCi0gICAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0T3BlcmF0aW9uc01hcCgpIHsNCi0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPcGVyYXRpb25bXSBnZXRPcGVyYXRpb25zKCkgew0KLSAgICAgICAgT3BlcmF0aW9uW10gb3BlcmF0aW9uc0FyciA9IG5ldyBPcGVyYXRpb25bb3BlcmF0aW9ucy5zaXplKCldOw0KLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IG9wZXJhdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIG9wZXJhdGlvbnNBcnJbaV0gPSAoT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICBpKys7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uc0FycjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikgew0KLSAgICAgICAgaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCkNCi0gICAgICAgICAgICBvcGVyYXRpb25zID0gbmV3IFRyZWVNYXAoKTsNCi0gICAgICAgIG9wZXJhdGlvbnMucHV0KG9wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL01lbWJlci5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL01lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmEyYzVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9NZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLXB1YmxpYyBjbGFzcyBNZW1iZXIgew0KLQlwcm90ZWN0ZWQgRGF0YVR5cGUgZGF0YVR5cGU7DQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsNCi0JcHJvdGVjdGVkIFN0cmluZyBtb2RlOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG1vZGlmaWVyOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFX0lOID0gImluIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9JTk9VVCA9ICJpbm91dCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVfT1VUID0gIm91dCI7DQotDQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNb2RlKCkgew0KLSAgICAgICAgcmV0dXJuIG1vZGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShTdHJpbmcgbW9kZSkgew0KLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGlmaWVyKCkgew0KLSAgICAgICAgcmV0dXJuIG1vZGlmaWVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1vZGlmaWVyKFN0cmluZyBtb2RpZmllcikgew0KLSAgICAgICAgdGhpcy5tb2RpZmllciA9IG1vZGlmaWVyOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9PcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0NzBiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIE9wZXJhdGlvbiB7DQotCXByaXZhdGUgU3RyaW5nIG5hbWU7DQotCXByaXZhdGUgTGlzdCBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCXByaXZhdGUgRGF0YVR5cGUgcmV0dXJuVHlwZTsNCi0JcHJpdmF0ZSBMaXN0IHJhaXNlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRQYXJhbXMoKSB7DQotICAgICAgICByZXR1cm4gcGFyYW1zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtcyhMaXN0IHBhcmFtcykgew0KLSAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW0oTWVtYmVyIHBhcmFtKSB7DQotICAgICAgICBwYXJhbXMuYWRkKHBhcmFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0YVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiByZXR1cm5UeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJldHVyblR5cGUoRGF0YVR5cGUgcmV0dXJuVHlwZSkgew0KLSAgICAgICAgdGhpcy5yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRSYWlzZXMoKSB7DQotICAgICAgICByZXR1cm4gcmFpc2VzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc1JhaXNlcygpIHsNCi0gICAgICAgIHJldHVybiByYWlzZXMgIT0gbnVsbCAmJiAocmFpc2VzLnNpemUoKSA+IDApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFJhaXNlcyhMaXN0IHJhaXNlcykgew0KLSAgICAgICAgdGhpcy5yYWlzZXMgPSByYWlzZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkUmFpc2VzKEV4Y2VwdGlvblR5cGUgZXhjZXB0aW9uVHlwZSkgew0KLSAgICAgICAgcmFpc2VzLmFkZChleGNlcHRpb25UeXBlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvUHJpbWl0aXZlRGF0YVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9QcmltaXRpdmVEYXRhVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJlYzVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9QcmltaXRpdmVEYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlRDS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFByaW1pdGl2ZURhdGFUeXBlIGV4dGVuZHMgRGF0YVR5cGUgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJpbWl0aXZlRGF0YVR5cGUuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgUFJJTUlUSVZFX1RZUEVTID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIE9SQiBvcmIgPSBPUkIuaW5pdCgpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgibG9uZyIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX2xvbmcpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoInVsb25nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfdWxvbmcpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoImxvbmdsb25nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfbG9uZ2xvbmcpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoInVsb25nbG9uZyIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX3Vsb25nbG9uZykpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgic2hvcnQiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19zaG9ydCkpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgidXNob3J0IixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfdXNob3J0KSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJmbG9hdCIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX2Zsb2F0KSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJkb3VibGUiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19kb3VibGUpKTsNCi0gICAgICAgIFBSSU1JVElWRV9UWVBFUy5wdXQoImNoYXIiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19jaGFyKSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJ3Y2hhciIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX3djaGFyKSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJib29sZWFuIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfYm9vbGVhbikpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgib2N0ZXQiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19vY3RldCkpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgic3RyaW5nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfc3RyaW5nKSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJ3c3RyaW5nIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfd3N0cmluZykpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgiYW55IixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfYW55KSk7DQotICAgICAgICBQUklNSVRJVkVfVFlQRVMucHV0KCJsb25nZG91YmxlIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfbG9uZ2RvdWJsZSkpOw0KLSAgICAgICAgUFJJTUlUSVZFX1RZUEVTLnB1dCgidm9pZCIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX3ZvaWQpKTsNCi0gICAgICAgIC8vUFJJTUlUSVZFX1RZUEVTLnB1dCgiZGF0ZVRpbWUiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19kYXRlVGltZSkpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJkYXRlIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfZGF0ZSkpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJ0aW1lIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfdGltZSkpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJwb3NpdGl2ZUludGVnZXIiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19wb3NpdGl2ZUludGVnZXIpKTsNCi0gICAgICAgIC8vUFJJTUlUSVZFX1RZUEVTLnB1dCgibm9uUG9zaXRpdmVJbnRlZ2VyIixvcmIuZ2V0X3ByaW1pdGl2ZV90YyhUQ0tpbmQudGtfbm9uUG9zaXRpdmVJbnRlZ2VyKSk7DQotICAgICAgICAvL1BSSU1JVElWRV9UWVBFUy5wdXQoIm5lZ2F0aXZlSW50ZWdlciIsb3JiLmdldF9wcmltaXRpdmVfdGMoVENLaW5kLnRrX25lZ2F0aXZlSW50ZWdlcikpOw0KLSAgICAgICAgLy9QUklNSVRJVkVfVFlQRVMucHV0KCJub25OZWdhdGl2ZUludGVnZXIiLG9yYi5nZXRfcHJpbWl0aXZlX3RjKFRDS2luZC50a19ub25OZWdhdGl2ZUludGVnZXIpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVDb2RlIGdldFR5cGVDb2RlKFN0cmluZyB0eXBlTmFtZSkgew0KLSAgICAgICAgVHlwZUNvZGUgdHlwZUNvZGUgPSAoVHlwZUNvZGUpIFBSSU1JVElWRV9UWVBFUy5nZXQodHlwZU5hbWUpOw0KLSAgICAgICAgaWYgKHR5cGVDb2RlID09IG51bGwgJiYgdHlwZU5hbWUgIT0gbnVsbCAmJiB0eXBlTmFtZS5jb250YWlucygiOjoiKSkgew0KLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZTIgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUuaW5kZXhPZigiOjoiKSk7DQotICAgICAgICAgICAgdHlwZUNvZGUgPSAoVHlwZUNvZGUpIFBSSU1JVElWRV9UWVBFUy5nZXQodHlwZU5hbWUyKTsNCi0gICAgICAgICAgICByZXR1cm4gdHlwZUNvZGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHlwZUNvZGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFR5cGVDb2RlIHR5cGVDb2RlKSB7DQotICAgICAgICByZXR1cm4gdHlwZUNvZGUgIT0gbnVsbCAmJiBQUklNSVRJVkVfVFlQRVMudmFsdWVzKCkuY29udGFpbnModHlwZUNvZGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlRGF0YVR5cGUgZ2V0UHJpbWl0aXZlRGF0YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7DQotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZURhdGFUeXBlKGdldFR5cGVDb2RlKHR5cGVOYW1lKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByaW1pdGl2ZURhdGFUeXBlKFR5cGVDb2RlIHR5cGVDb2RlKXsNCi0gICAgICAgIHRoaXMudHlwZUNvZGUgPSB0eXBlQ29kZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiB0eXBlQ29kZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgew0KLSAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7DQotICAgICAgICBpZiAodHlwZUNvZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFRDS2luZCBraW5kID0gdHlwZUNvZGUua2luZCgpOw0KLSAgICAgICAgICAgIGlmIChraW5kICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgc3dpdGNoKGtpbmQudmFsdWUoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2xvbmcgOiByZXQgPSAiaW50IjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmcgOiByZXQgPSAiaW50IjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZ2xvbmcgOiByZXQgPSAibG9uZyI7IGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nbG9uZyA6IHJldCA9ICJsb25nIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2hvcnQgOiByZXQgPSAic2hvcnQiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191c2hvcnQgOiByZXQgPSAic2hvcnQiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19mbG9hdCA6IHJldCA9ICJmbG9hdCI7IGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZSA6IHJldCA9ICJkb3VibGUiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19jaGFyIDogcmV0ID0gImNoYXIiOyBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a193Y2hhciA6IHJldCA9ICJjaGFyIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYm9vbGVhbiA6IHJldCA9ICJib29sZWFuIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQgOiByZXQgPSAiYnl0ZSI7IGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cmluZyA6IHJldCA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd3N0cmluZyA6IHJldCA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdm9pZCA6IHJldCA9ICJ2b2lkIjsgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCBwcmltaXRpdmUgZGF0YSB0eXBlIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TZXF1ZW5jZVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TZXF1ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmMTkwMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvU2VxdWVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlczsNCi0NCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVHlwZUNvZGU7DQotDQotcHVibGljIGNsYXNzIFNlcXVlbmNlVHlwZSBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgew0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBPUkIuaW5pdCgpLmNyZWF0ZV9zZXF1ZW5jZV90YyhlbGVtZW50Q291bnQsIGRhdGFUeXBlLmdldFR5cGVDb2RlKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TdHJ1Y3QuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9TdHJ1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViNGQzYmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1N0cnVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlN0cnVjdE1lbWJlcjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1wdWJsaWMgY2xhc3MgU3RydWN0IGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpew0KLSAgICAgICAgcmV0dXJuIE9SQi5pbml0KCkuY3JlYXRlX3N0cnVjdF90YyhnZXRJZCgpLCBnZXROYW1lKCksIHByZXBhaXJTdHJ1Y3RNZW1iZXJzKCkpOw0KLQl9DQotDQotICAgIHByb3RlY3RlZCBTdHJ1Y3RNZW1iZXJbXSBwcmVwYWlyU3RydWN0TWVtYmVycygpIHsNCi0gICAgICAgIFN0cnVjdE1lbWJlcltdIHN0cnVjdE1lbWJlcnMgPSBuZXcgU3RydWN0TWVtYmVyW21lbWJlcnMuc2l6ZSgpXTsNCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsNCi0gICAgICAgICAgICBUeXBlQ29kZSB0eXBlQ29kZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpLmdldFR5cGVDb2RlKCk7DQotICAgICAgICAgICAgc3RydWN0TWVtYmVyc1tpXSA9IG5ldyBvcmcub21nLkNPUkJBLlN0cnVjdE1lbWJlcihtZW1iZXIuZ2V0TmFtZSgpLCB0eXBlQ29kZSwgbnVsbCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gc3RydWN0TWVtYmVyczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVHlwZWRlZi5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1R5cGVkZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiMTJkNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVHlwZWRlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUeXBlZGVmIGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLSAgICBwcml2YXRlIERhdGFUeXBlIGRhdGFUeXBlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBPUkIuaW5pdCAoKS5jcmVhdGVfYWxpYXNfdGMgKGdldElkKCksIGdldE5hbWUoKSwgZGF0YVR5cGUuZ2V0VHlwZUNvZGUoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERhdGFUeXBlIGdldERhdGFUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFUeXBlKERhdGFUeXBlIGRhdGFUeXBlKSB7DQotICAgICAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1VuaW9uTWVtYmVyLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVW5pb25NZW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxYzdiMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVW5pb25NZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLXB1YmxpYyBjbGFzcyBVbmlvbk1lbWJlciBleHRlbmRzIE1lbWJlciB7DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHQ7DQotICAgIHByaXZhdGUgU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZTsNCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIGlzRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gYURlZmF1bHQpIHsNCi0gICAgICAgIGlzRGVmYXVsdCA9IGFEZWZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkgew0KLSAgICAgICAgcmV0dXJuIGRpc2NyaW1pbmF0b3JWYWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZSkgew0KLSAgICAgICAgdGhpcy5kaXNjcmltaW5hdG9yVmFsdWUgPSBkaXNjcmltaW5hdG9yVmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1VuaW9uVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1VuaW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQxNTQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC90eXBlcy9VbmlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYVV0aWw7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQW55Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi0NCi1wdWJsaWMgY2xhc3MgVW5pb25UeXBlIGV4dGVuZHMgQ29tcG9zaXRlRGF0YVR5cGUgew0KLSAgICBwcml2YXRlIERhdGFUeXBlIGRpc2NyaW1pbmF0b3JUeXBlOw0KLQ0KLSAgICBwcm90ZWN0ZWQgVHlwZUNvZGUgZ2VuZXJhdGVUeXBlQ29kZSgpIHsNCi0gICAgICAgIE9SQiBvcmIgPSBPUkIuaW5pdCgpOw0KLSAgICAgICAgVHlwZUNvZGUgZGlzVHlwZUNvZGUgPSBkaXNjcmltaW5hdG9yVHlwZS5nZXRUeXBlQ29kZSgpOw0KLSAgICAgICAgb3JnLm9tZy5DT1JCQS5Vbmlvbk1lbWJlcltdIHVubWVtYmVycyA9IG5ldyBvcmcub21nLkNPUkJBLlVuaW9uTWVtYmVyIFttZW1iZXJzLnNpemUoKV07DQotDQotICAgICAgICBBbnkgbWVtYmVyQW55Ow0KLSAgICAgICAgVW5pb25NZW1iZXIgdW5pb25NZW1iZXI7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICB1bmlvbk1lbWJlciA9IChVbmlvbk1lbWJlcikgbWVtYmVycy5nZXQoaSk7DQotICAgICAgICAgICAgbWVtYmVyQW55ID0gb3JiLmNyZWF0ZV9hbnkoKTsNCi0gICAgICAgICAgICBpZiAodW5pb25NZW1iZXIuaXNEZWZhdWx0KCkpIHsNCi0gICAgICAgICAgICAgICAgbWVtYmVyQW55Lmluc2VydF9vY3RldCgoYnl0ZSkgMCk7IC8vIGRlZmF1bHQgbWVtYmVyIGxhYmVsDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQ29yYmFVdGlsLmluc2VydFZhbHVlKG1lbWJlckFueSwgZGlzY3JpbWluYXRvclR5cGUsIENvcmJhVXRpbC5wYXJzZVZhbHVlKGRpc2NyaW1pbmF0b3JUeXBlLCB1bmlvbk1lbWJlci5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB1bm1lbWJlcnNbaV0gPSBuZXcgb3JnLm9tZy5DT1JCQS5Vbmlvbk1lbWJlciAoDQotICAgICAgICAgICAgICAgICAgICB1bmlvbk1lbWJlci5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICBtZW1iZXJBbnksDQotICAgICAgICAgICAgICAgICAgICB1bmlvbk1lbWJlci5nZXREYXRhVHlwZSgpLmdldFR5cGVDb2RlKCksDQotICAgICAgICAgICAgICAgICAgICBudWxsKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvcmIuY3JlYXRlX3VuaW9uX3RjIChnZXRJZCgpLCBuYW1lLCBkaXNUeXBlQ29kZSwgdW5tZW1iZXJzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0YVR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7DQotICAgICAgICByZXR1cm4gZGlzY3JpbWluYXRvclR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGF0YVR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsNCi0gICAgICAgIHRoaXMuZGlzY3JpbWluYXRvclR5cGUgPSBkaXNjcmltaW5hdG9yVHlwZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVmFsdWVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdHlwZXMvVmFsdWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNWEzYTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3R5cGVzL1ZhbHVlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXM7DQotDQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuT1JCOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlRDS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZVBhY2thZ2UuQmFkS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5WYWx1ZU1lbWJlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotcHVibGljIGNsYXNzIFZhbHVlVHlwZSBleHRlbmRzIENvbXBvc2l0ZURhdGFUeXBlIHsNCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIG9wZXJhdGlvbnM7DQotDQotCXByb3RlY3RlZCBvcmcub21nLkNPUkJBLlR5cGVDb2RlIGdlbmVyYXRlVHlwZUNvZGUoKXsNCi0gICAgICAgIE9SQiBvcmIgPSBPUkIuaW5pdCgpOw0KLSAgICAgICAgVmFsdWVNZW1iZXJbXSB2YWx1ZU1lbWJlcnMgPSBuZXcgVmFsdWVNZW1iZXJbbWVtYmVycy5zaXplKCldOw0KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0SWQoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBtZW1iZXJzLmdldChpKTsNCi0gICAgICAgICAgICBUeXBlQ29kZSB0eXBlQ29kZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpLmdldFR5cGVDb2RlKCk7DQotICAgICAgICAgICAgVENLaW5kIGtpbmQgPSB0eXBlQ29kZS5raW5kKCk7DQotICAgICAgICAgICAgc3dpdGNoKGtpbmQudmFsdWUoKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWUgOg0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lbWJlclR5cGVJZCA9ICIiOw0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJUeXBlSWQgPSB0eXBlQ29kZS5pZCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkS2luZCBiYWRLaW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgYmFkS2luZC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlTWVtYmVyc1tpXSA9IG5ldyBvcmcub21nLkNPUkJBLlZhbHVlTWVtYmVyKG1lbWJlci5nZXROYW1lKCksIG1lbWJlclR5cGVJZCwgaWQsICIiLCB0eXBlQ29kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxvcmcub21nLkNPUkJBLlBSSVZBVEVfTUVNQkVSLnZhbHVlKTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWVNZW1iZXJzW2ldID0gbmV3IG9yZy5vbWcuQ09SQkEuVmFsdWVNZW1iZXIobWVtYmVyLmdldE5hbWUoKSwgIiIsIGlkLCAiIiwgdHlwZUNvZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsb3JnLm9tZy5DT1JCQS5QUklWQVRFX01FTUJFUi52YWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3JiLmNyZWF0ZV92YWx1ZV90YyAoaWQsIGdldE5hbWUoKSwgKHNob3J0KTAsIG51bGwsIHZhbHVlTWVtYmVycyk7DQotCX0NCi0NCi0vLyAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YVR5cGUoKSB7DQotLy8gICAgICAgIHJldHVybiBPYmplY3RCeVZhbHVlLmNsYXNzOw0KLS8vICAgIH0NCi0NCi0gICAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0T3BlcmF0aW9ucygpIHsNCi0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbnMoamF2YS51dGlsLk1hcCBvcGVyYXRpb25zKSB7DQotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBvcGVyYXRpb25zOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSB7DQotICAgICAgICBpZiAob3BlcmF0aW9ucyA9PSBudWxsKQ0KLSAgICAgICAgICAgIG9wZXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgb3BlcmF0aW9ucy5wdXQob3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjk1OGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9BYnN0cmFjdENvbGxlY3Rpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BYnN0cmFjdENvbGxlY3Rpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Db21wb3NpdGVEYXRhVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlIHsNCi0gICAgcHJvdGVjdGVkIE9iamVjdFtdIHZhbHVlcyA9IG51bGw7DQotDQotICAgIHB1YmxpYyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZShDb21wb3NpdGVEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgc3VwZXIoZGF0YVR5cGUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgc3VwZXIoZGF0YVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRWYWx1ZXMoKSB7DQotICAgICAgICByZXR1cm4gdmFsdWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsNCi0gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7DQotICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuaXNBcnJheSgpKQ0KLSAgICAgICAgICAgIHR5cGUgPSAiQXJyYXk6ICI7DQotICAgICAgICBlbHNlIGlmIChjb2xsZWN0aW9uVHlwZS5pc1NlcXVlbmNlKCkpDQotICAgICAgICAgICAgdHlwZSA9ICJTZXF1ZW5jZTogIjsNCi0gICAgICAgIHJldHVybiB0eXBlICsgY29sbGVjdGlvbjJTdHJpbmcodmFsdWVzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBjb2xsZWN0aW9uMlN0cmluZyhPYmplY3RbXSBjb2xsZWN0aW9uVmFsdWVzKSB7DQotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uVmFsdWVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY29sbGVjdGlvblZhbHVlc1tpXTsNCi0gICAgICAgICAgICBTdHJpbmcgZWxlbTsNCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkgew0KLSAgICAgICAgICAgICAgICBlbGVtID0gY29sbGVjdGlvbjJTdHJpbmcoKE9iamVjdFtdKSB2YWx1ZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSB2YWx1ZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9ICJudWxsIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdHIuYXBwZW5kKCIsICIpOw0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoZWxlbSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gInsiICsgc3RyLnN1YnN0cmluZygyKSArICJ9IjsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0Fic3RyYWN0VmFsdWUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvQWJzdHJhY3RWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGEzZjVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvQWJzdHJhY3RWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQXJyYXlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Db21wb3NpdGVEYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkVudW1UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlNlcXVlbmNlVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuU3RydWN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5UeXBlZGVmOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5VbmlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Bbnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuVENLaW5kOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWx1ZSB7DQotICAgIHByb3RlY3RlZCBPYmplY3RbXSBtZW1iZXJWYWx1ZXM7DQotICAgIHByb3RlY3RlZCBDb21wb3NpdGVEYXRhVHlwZSBkYXRhVHlwZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0VmFsdWUuY2xhc3MpOw0KLQ0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RWYWx1ZSAoQ29tcG9zaXRlRGF0YVR5cGUgZGF0YVR5cGUpIHsNCi0gICAgICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVtYmVyW10gZ2V0TWVtYmVycygpIHsNCi0gICAgICAgIHJldHVybiBkYXRhVHlwZS5nZXRNZW1iZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyVmFsdWVzKE9iamVjdFtdIG1lbWJlclZhbHVlcykgew0KLSAgICAgICAgdGhpcy5tZW1iZXJWYWx1ZXMgPSBtZW1iZXJWYWx1ZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdFtdIGdldE1lbWJlclZhbHVlcygpIHsNCi0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFR5cGVDb2RlIGdldFR5cGVDb2RlKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldFR5cGVDb2RlKCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoT2JqZWN0IHZhbHVlLCBEYXRhVHlwZSBkYXRhVHlwZSwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgew0KLSAgICAgICAgVENLaW5kIGtpbmQgPSBkYXRhVHlwZS5nZXRUeXBlQ29kZSgpLmtpbmQoKTsNCi0gICAgICAgIHN3aXRjaChraW5kLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZyA6IG91dHB1dFN0cmVhbS53cml0ZV9sb25nKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfdWxvbmcoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZyA6IG91dHB1dFN0cmVhbS53cml0ZV9sb25nbG9uZygoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZ2xvbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfdWxvbmdsb25nKCgoTG9uZykgdmFsdWUpLmxvbmdWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Nob3J0IDogb3V0cHV0U3RyZWFtLndyaXRlX3Nob3J0KCgoU2hvcnQpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdXNob3J0IDogb3V0cHV0U3RyZWFtLndyaXRlX3VzaG9ydCgoKFNob3J0KSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0IDogb3V0cHV0U3RyZWFtLndyaXRlX2Zsb2F0KCgoRmxvYXQpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZG91YmxlIDogb3V0cHV0U3RyZWFtLndyaXRlX2RvdWJsZSgoKERvdWJsZSkgdmFsdWUpLmZsb2F0VmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19jaGFyIDogb3V0cHV0U3RyZWFtLndyaXRlX2NoYXIoKChDaGFyYWN0ZXIpIHZhbHVlKS5jaGFyVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a193Y2hhciA6IG91dHB1dFN0cmVhbS53cml0ZV93Y2hhcigoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Jvb2xlYW4gOiBvdXRwdXRTdHJlYW0ud3JpdGVfYm9vbGVhbigoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vY3RldCA6IG91dHB1dFN0cmVhbS53cml0ZV9vY3RldCgoKEJ5dGUpIHZhbHVlKS5ieXRlVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJpbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfc3RyaW5nKChTdHJpbmcpIHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3dzdHJpbmcgOiBvdXRwdXRTdHJlYW0ud3JpdGVfd3N0cmluZygoU3RyaW5nKSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19hbnkgOiBvdXRwdXRTdHJlYW0ud3JpdGVfYW55KChBbnkpIHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3ZhbHVlIDogb3V0cHV0U3RyZWFtLndyaXRlX3ZhbHVlKChTZXJpYWxpemFibGUpIHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cnVjdCA6ICgoU3RydWN0VmFsdWUpIHZhbHVlKS53cml0ZShvdXRwdXRTdHJlYW0pOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZW51bSA6ICgoRW51bVZhbHVlKSB2YWx1ZSkud3JpdGUob3V0cHV0U3RyZWFtKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3VuaW9uOiAoKFVuaW9uVmFsdWUpIHZhbHVlKS53cml0ZShvdXRwdXRTdHJlYW0pOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYWxpYXM6ICgoQWxpYXNWYWx1ZSkgdmFsdWUpLndyaXRlKG91dHB1dFN0cmVhbSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zZXF1ZW5jZTogKChTZXF1ZW5jZVZhbHVlKSB2YWx1ZSkud3JpdGUob3V0cHV0U3RyZWFtKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FycmF5OiAoKEFycmF5VmFsdWUpIHZhbHVlKS53cml0ZShvdXRwdXRTdHJlYW0pOyBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZChEYXRhVHlwZSBkYXRhVHlwZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIFRDS2luZCBraW5kID0gZGF0YVR5cGUuZ2V0VHlwZUNvZGUoKS5raW5kKCk7DQotICAgICAgICBPYmplY3QgcmV0ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaChraW5kLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZzogcmV0ID0gbmV3IEludGVnZXIoaW5wdXRTdHJlYW0ucmVhZF9sb25nKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmc6IHJldCA9IG5ldyBJbnRlZ2VyKGlucHV0U3RyZWFtLnJlYWRfdWxvbmcoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZzogcmV0ID0gbmV3IExvbmcoaW5wdXRTdHJlYW0ucmVhZF9sb25nbG9uZygpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nbG9uZzogcmV0ID0gbmV3IExvbmcoaW5wdXRTdHJlYW0ucmVhZF91bG9uZ2xvbmcoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zaG9ydDogcmV0ID0gbmV3IFNob3J0KGlucHV0U3RyZWFtLnJlYWRfc2hvcnQoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191c2hvcnQ6IHJldCA9IG5ldyBTaG9ydChpbnB1dFN0cmVhbS5yZWFkX3VzaG9ydCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0OiByZXQgPSBuZXcgRmxvYXQoaW5wdXRTdHJlYW0ucmVhZF9mbG9hdCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZTogcmV0ID0gbmV3IERvdWJsZShpbnB1dFN0cmVhbS5yZWFkX2RvdWJsZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXI6IHJldCA9IG5ldyBDaGFyYWN0ZXIoaW5wdXRTdHJlYW0ucmVhZF9jaGFyKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6IHJldCA9IG5ldyBDaGFyYWN0ZXIoaW5wdXRTdHJlYW0ucmVhZF93Y2hhcigpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Jvb2xlYW46IHJldCA9IEJvb2xlYW4udmFsdWVPZihpbnB1dFN0cmVhbS5yZWFkX2Jvb2xlYW4oKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vY3RldDogcmV0ID0gbmV3IEJ5dGUoaW5wdXRTdHJlYW0ucmVhZF9vY3RldCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cmluZzogcmV0ID0gaW5wdXRTdHJlYW0ucmVhZF9zdHJpbmcoKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3dzdHJpbmc6IHJldCA9IGlucHV0U3RyZWFtLnJlYWRfd3N0cmluZygpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYW55OiByZXQgPSBpbnB1dFN0cmVhbS5yZWFkX2FueSgpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWU6IHJldCA9IGlucHV0U3RyZWFtLnJlYWRfdmFsdWUoKTsgYnJlYWs7DQotICAgICAgICAgICAgLy9jYXNlIFRDS2luZC5fdGtfbG9uZ2RvdWJsZSA6DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cnVjdDoNCi0gICAgICAgICAgICAgICAgU3RydWN0VmFsdWUgc3RydWN0VmFsdWUgPSBuZXcgU3RydWN0VmFsdWUoKFN0cnVjdCkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICBzdHJ1Y3RWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gc3RydWN0VmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19lbnVtOg0KLSAgICAgICAgICAgICAgICBFbnVtVmFsdWUgZW51bVZhbHVlID0gbmV3IEVudW1WYWx1ZSgoRW51bVR5cGUpIGRhdGFUeXBlKTsNCi0gICAgICAgICAgICAgICAgZW51bVZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSBlbnVtVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25WYWx1ZSB1bmlvblZhbHVlID0gbmV3IFVuaW9uVmFsdWUoKFVuaW9uVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSB1bmlvblZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYWxpYXM6DQotICAgICAgICAgICAgICAgIEFsaWFzVmFsdWUgYWxpYXNWYWx1ZSA9IG5ldyBBbGlhc1ZhbHVlKChUeXBlZGVmKSBkYXRhVHlwZSk7DQotICAgICAgICAgICAgICAgIGFsaWFzVmFsdWUucmVhZChpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIHJldCA9IGFsaWFzVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zZXF1ZW5jZToNCi0gICAgICAgICAgICAgICAgU2VxdWVuY2VWYWx1ZSBzZXF1ZW5jZVZhbHVlID0gbmV3IFNlcXVlbmNlVmFsdWUoKFNlcXVlbmNlVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICBzZXF1ZW5jZVZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSBzZXF1ZW5jZVZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYXJyYXk6DQotICAgICAgICAgICAgICAgIEFycmF5VmFsdWUgYXJyYXlWYWx1ZSA9IG5ldyBBcnJheVZhbHVlKChBcnJheVR5cGUpIGRhdGFUeXBlKTsNCi0gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gYXJyYXlWYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2V4Y2VwdDoNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVmFsdWUgZXhWYWx1ZSA9IG5ldyBFeGNlcHRpb25WYWx1ZSgoRXhjZXB0aW9uVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICBleFZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXQgPSBleFZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFN0cmluZyByZXQgPSAiQ29tcG9zaXRlRGF0YVR5cGUgbmFtZTogIiArIGRhdGFUeXBlLmdldE1vZHVsZSgpICsgZGF0YVR5cGUuZ2V0TmFtZSgpICsgJ1xuJzsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1lbWJlclZhbHVlc1tpXTsNCi0gICAgICAgICAgICByZXQgKz0gJ1x0JyArIG1lbWJlcnNbaV0uZ2V0TmFtZSgpICsgIjogIiArIHZhbHVlICsgJ1xuJzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9BbGlhc1ZhbHVlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FsaWFzVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhMTA4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FsaWFzVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVHlwZWRlZjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQWxpYXNWYWx1ZSBleHRlbmRzIEFic3RyYWN0VmFsdWUgew0KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsNCi0gICAgcHVibGljIEFsaWFzVmFsdWUoVHlwZWRlZiBkYXRhVHlwZSkgew0KLSAgICAgICAgc3VwZXIoZGF0YVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVhZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgew0KLSAgICAgICAgdmFsdWUgPSByZWFkKCgoVHlwZWRlZikgZGF0YVR5cGUpLmdldERhdGFUeXBlKCksIGlucHV0U3RyZWFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7DQotICAgICAgICB3cml0ZSh2YWx1ZSwgKChUeXBlZGVmKSBkYXRhVHlwZSkuZ2V0RGF0YVR5cGUoKSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsKT8gIiBOVUxMIHZhbHVlIiA6ICJBbGlhcyBvZjogIiArIHZhbHVlLnRvU3RyaW5nKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9BcnJheVZhbHVlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FycmF5VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1YzFmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0FycmF5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQWJzdHJhY3RDb2xsZWN0aW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQXJyYXlUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5EYXRhVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZSBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlIHsNCi0gICAgcHVibGljIEFycmF5VmFsdWUoQXJyYXlUeXBlIGFycmF5VHlwZSkgew0KLSAgICAgICAgc3VwZXIoYXJyYXlUeXBlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb25UeXBlIGNvbGxlY3Rpb25UeXBlID0gKEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgRGF0YVR5cGUgbWVtYmVyVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCk7DQotICAgICAgICBpbnQgbGVuZ3RoID0gY29sbGVjdGlvblR5cGUuZ2V0RWxlbWVudENvdW50KCk7DQotICAgICAgICB2YWx1ZXMgPSBuZXcgT2JqZWN0W2xlbmd0aF07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgdmFsdWVzW2ldID0gcmVhZChtZW1iZXJUeXBlLCBpbnB1dFN0cmVhbSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgew0KLSAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgIERhdGFUeXBlIG1lbWJlclR5cGUgPSBjb2xsZWN0aW9uVHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgaW50IGxlbmd0aCA9IGNvbGxlY3Rpb25UeXBlLmdldEVsZW1lbnRDb3VudCgpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHdyaXRlKHZhbHVlc1tpXSwgbWVtYmVyVHlwZSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0VudW1WYWx1ZS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9FbnVtVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiNjc2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0VudW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FbnVtVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgRW51bVZhbHVlIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZSB7DQotICAgIHByaXZhdGUgaW50IGluZGV4Ow0KLQ0KLSAgICBwdWJsaWMgRW51bVZhbHVlKEVudW1UeXBlIGVudW1UeXBlKSB7DQotICAgICAgICBzdXBlcihlbnVtVHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoaW50IGluZGV4KSB7DQotICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0gICAgICAgIHJldHVybiBpbmRleDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlQXNTdHJpbmcoKSB7DQotICAgICAgICByZXR1cm4gKFN0cmluZykgKChFbnVtVHlwZSkgZGF0YVR5cGUpLmdldEVudW1NZW1iZXJzKCkuZ2V0KGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldE1vZHVsZSgpICsgZGF0YVR5cGUuZ2V0TmFtZSgpICsgIiA6ICIgKyBpbmRleDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBpbmRleCA9IGlucHV0U3RyZWFtLnJlYWRfbG9uZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgIG91dHB1dFN0cmVhbS53cml0ZV9sb25nKGluZGV4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsNCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgRW51bVZhbHVlKSB7DQotICAgICAgICAgICAgaWYgKGdldFZhbHVlQXNTdHJpbmcoKS5lcXVhbHMoKChFbnVtVmFsdWUpIG8pLmdldFZhbHVlQXNTdHJpbmcoKSkpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvRXhjZXB0aW9uVmFsdWUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvRXhjZXB0aW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3ZTFjYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL0V4Y2VwdGlvblZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkV4Y2VwdGlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIEV4Y2VwdGlvblZhbHVlIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZSB7DQotDQotICAgIHB1YmxpYyBFeGNlcHRpb25WYWx1ZShFeGNlcHRpb25UeXBlIGV4Y2VwdGlvblR5cGUpIHsNCi0gICAgICAgIHN1cGVyKGV4Y2VwdGlvblR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7DQotICAgICAgICBPYmplY3RbXSBtZW1iZXJWYWx1ZXMgPSBuZXcgT2JqZWN0W21lbWJlcnMubGVuZ3RoXTsNCi0gICAgICAgIGlmICghZGF0YVR5cGUuZ2V0SWQoKS5lcXVhbHMoaW5wdXRTdHJlYW0ucmVhZF9zdHJpbmcoKSkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc21hY2hpbmcgSURzIik7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZXNbaV0gPSByZWFkKG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc2V0TWVtYmVyVmFsdWVzKG1lbWJlclZhbHVlcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiBnZXRFeGNlcHRpb24oKSB7DQotICAgICAgICByZXR1cm4gbmV3IENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbih0b1N0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFN0cmluZyByZXQgPSAiRXhjZXB0aW9uIG5hbWU6ICIgKyBkYXRhVHlwZS5nZXRNb2R1bGUoKSArIGRhdGFUeXBlLmdldE5hbWUoKSArICdcbic7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtZW1iZXJWYWx1ZXNbaV07DQotICAgICAgICAgICAgcmV0ICs9ICdcdCcgKyBtZW1iZXJzW2ldLmdldE5hbWUoKSArICI6ICIgKyB2YWx1ZSArICdcbic7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvT2JqZWN0QnlWYWx1ZS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9PYmplY3RCeVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzM3YmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9PYmplY3RCeVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVmFsdWVUeXBlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLlR5cGVDb2RlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtOw0KLWltcG9ydCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgT2JqZWN0QnlWYWx1ZSBleHRlbmRzIEFic3RyYWN0VmFsdWUgaW1wbGVtZW50cyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLlN0cmVhbWFibGVWYWx1ZSB7DQotDQotICAgIHB1YmxpYyBPYmplY3RCeVZhbHVlKFZhbHVlVHlwZSB2YWx1ZVR5cGUpIHsNCi0gICAgICAgIHN1cGVyKHZhbHVlVHlwZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgX3JlYWQoSW5wdXRTdHJlYW0gaXMpIHsNCi0gICAgICAgIHJlYWQoaXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIF93cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsNCi0gICAgICAgIHdyaXRlKG9zKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZUNvZGUgX3R5cGUoKSB7DQotICAgICAgICByZXR1cm4gZGF0YVR5cGUuZ2V0VHlwZUNvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gX3RydW5jYXRhYmxlX2lkcygpIHsNCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge2RhdGFUeXBlLmdldElkKCl9Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCByZWFkKElucHV0U3RyZWFtIGlzKSB7DQotICAgICAgICBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbQ0KLSAgICAgICAgICAgICAgICA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgaXM7DQotICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gZGF0YVR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgbWVtYmVyVmFsdWVzID0gbmV3IE9iamVjdFttZW1iZXJzLmxlbmd0aF07DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJWYWx1ZXNbaV0gPSByZWFkKG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsNCi0gICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0NCi0gICAgICAgICAgICAgICAgPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBvczsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBkYXRhVHlwZS5nZXRNZW1iZXJzKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICB3cml0ZShtZW1iZXJWYWx1ZXNbaV0sIG1lbWJlcnNbaV0uZ2V0RGF0YVR5cGUoKSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1NlcXVlbmNlVmFsdWUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU2VxdWVuY2VWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY0NjY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU2VxdWVuY2VWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5BYnN0cmFjdENvbGxlY3Rpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5EYXRhVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuU2VxdWVuY2VUeXBlOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBTZXF1ZW5jZVZhbHVlIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUgew0KLSAgICBwdWJsaWMgU2VxdWVuY2VWYWx1ZShTZXF1ZW5jZVR5cGUgc2VxdWVuY2VUeXBlKSB7DQotICAgICAgICBzdXBlcihzZXF1ZW5jZVR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICBEYXRhVHlwZSBtZW1iZXJUeXBlID0gY29sbGVjdGlvblR5cGUuZ2V0RGF0YVR5cGUoKTsNCi0gICAgICAgIGludCBsZW5ndGggPSBpbnB1dFN0cmVhbS5yZWFkX2xvbmcoKTsNCi0gICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbbGVuZ3RoXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICB2YWx1ZXNbaV0gPSByZWFkKG1lbWJlclR5cGUsIGlucHV0U3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7DQotICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb25UeXBlIGNvbGxlY3Rpb25UeXBlID0gKEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgRGF0YVR5cGUgbWVtYmVyVHlwZSA9IGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCk7DQotICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aDsNCi0gICAgICAgIG91dHB1dFN0cmVhbS53cml0ZV9sb25nKGxlbmd0aCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgd3JpdGUodmFsdWVzW2ldLCBtZW1iZXJUeXBlLCBvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU3RyZWFtYWJsZVZhbHVlRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9TdHJlYW1hYmxlVmFsdWVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNWUyMjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9TdHJlYW1hYmxlVmFsdWVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlZhbHVlVHlwZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5WYWx1ZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLk9SQjsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW07DQotDQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJlYW1hYmxlVmFsdWVGYWN0b3J5IGltcGxlbWVudHMgVmFsdWVGYWN0b3J5IHsNCi0gICAgcHJpdmF0ZSBWYWx1ZVR5cGUgdmFsdWVUeXBlOw0KLQ0KLSAgICBwcml2YXRlIFN0cmVhbWFibGVWYWx1ZUZhY3RvcnkoVmFsdWVUeXBlIHZhbHVlVHlwZSkgew0KLSAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcmlhbGl6YWJsZSByZWFkX3ZhbHVlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZF92YWx1ZShuZXcgT2JqZWN0QnlWYWx1ZSh2YWx1ZVR5cGUpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoT1JCIG9yYiwgVmFsdWVUeXBlIHZhbHVlVHlwZSkgew0KLSAgICAgICAgb3JiLnJlZ2lzdGVyX3ZhbHVlX2ZhY3RvcnkodmFsdWVUeXBlLmdldElkKCksIG5ldyBTdHJlYW1hYmxlVmFsdWVGYWN0b3J5KHZhbHVlVHlwZSkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU3RydWN0VmFsdWUuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL2lkbC92YWx1ZXMvU3RydWN0VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1ZWY3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1N0cnVjdFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuU3RydWN0Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3RWYWx1ZSBleHRlbmRzIEFic3RyYWN0VmFsdWUgew0KLQ0KLSAgICBwdWJsaWMgU3RydWN0VmFsdWUgKFN0cnVjdCBzdHJ1Y3QpIHsNCi0gICAgICAgIHN1cGVyKHN0cnVjdCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHdyaXRlKG1lbWJlclZhbHVlc1tpXSwgbWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpLCBvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSBnZXRNZW1iZXJzKCk7DQotICAgICAgICBtZW1iZXJWYWx1ZXMgPSBuZXcgT2JqZWN0W21lbWJlcnMubGVuZ3RoXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIG1lbWJlclZhbHVlc1tpXSA9IHJlYWQobWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpLCBpbnB1dFN0cmVhbSk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvaWRsL3ZhbHVlcy9VbmlvblZhbHVlLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1VuaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxNDY3ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9pZGwvdmFsdWVzL1VuaW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FbnVtVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5Vbmlvbk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVW5pb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVycy5Db3JiYVV0aWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UQ0tpbmQ7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtOw0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5PdXRwdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIFVuaW9uVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFVuaW9uVmFsdWUuY2xhc3MpOw0KLSAgICBwcml2YXRlIE9iamVjdCBkaXNjcmltaW5hdG9yOw0KLSAgICBwcml2YXRlIFN0cmluZyBtZW1iZXJOYW1lOw0KLSAgICBwcml2YXRlIE9iamVjdCBtZW1iZXJWYWx1ZTsNCi0gICAgcHJpdmF0ZSBEYXRhVHlwZSBtZW1iZXJUeXBlOw0KLQ0KLQ0KLSAgICBwdWJsaWMgVW5pb25WYWx1ZShVbmlvblR5cGUgdW5pb25UeXBlKSB7DQotICAgICAgICBzdXBlcih1bmlvblR5cGUpOyAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBVbmlvblR5cGUgdW5pb25UeXBlID0gKFVuaW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICBkaXNjcmltaW5hdG9yID0gcmVhZCh1bmlvblR5cGUuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgcG9wdWxhdGVWYWx1ZSgpOw0KLSAgICAgICAgbWVtYmVyVmFsdWUgPSByZWFkKGdldE1lbWJlclR5cGUoKSwgaW5wdXRTdHJlYW0pOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVZhbHVlKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFVuaW9uTWVtYmVyIHVuaW9uTWVtYmVyID0gbnVsbDsNCi0NCi0gICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yU3RyOw0KLSAgICAgICAgaWYgKGRpc2NyaW1pbmF0b3IgaW5zdGFuY2VvZiBFbnVtVmFsdWUpIHsNCi0gICAgICAgICAgICBkaXNjcmltaW5hdG9yU3RyID0gKChFbnVtVmFsdWUpIGRpc2NyaW1pbmF0b3IpLmdldFZhbHVlQXNTdHJpbmcoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZGlzY3JpbWluYXRvclN0ciA9IGRpc2NyaW1pbmF0b3IudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyID0gKFVuaW9uTWVtYmVyKSBtZW1iZXJzW2ldOw0KLSAgICAgICAgICAgIGlmIChkaXNjcmltaW5hdG9yU3RyLmVxdWFscyh1bmlvbk1lbWJlci5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSkpDQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHVuaW9uTWVtYmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtZW1iZXJOYW1lID0gdW5pb25NZW1iZXIuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIHNldE1lbWJlclR5cGUodW5pb25NZW1iZXIuZ2V0RGF0YVR5cGUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGxvZy5lcnJvcigiVW5pb24gbXVzdCBoYXZlIGF0bGVhc3Qgb25lIG1lbWJlcnMiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEaXNjcmltaW5hdG9yKCkgew0KLSAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IGdldE1lbWJlcnMoKTsNCi0gICAgICAgIFVuaW9uTWVtYmVyIHVuaW9uTWVtYmVyID0gbnVsbDsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIHVuaW9uTWVtYmVyID0gKFVuaW9uTWVtYmVyKSBtZW1iZXJzW2ldOw0KLSAgICAgICAgICAgIGlmICh1bmlvbk1lbWJlci5nZXROYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKQ0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh1bmlvbk1lbWJlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2V0TWVtYmVyVHlwZSh1bmlvbk1lbWJlci5nZXREYXRhVHlwZSgpKTsNCi0gICAgICAgICAgICBpZiAoIXVuaW9uTWVtYmVyLmlzRGVmYXVsdCgpKSB7DQotICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBDb3JiYVV0aWwucGFyc2VWYWx1ZSgoKFVuaW9uVHlwZSlkYXRhVHlwZSkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgdW5pb25NZW1iZXIuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pb25NZW1iZXIuaXNEZWZhdWx0KCkpIHsNCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgZGlzY3JpbWluYXRvclR5cGUgPSAoKFVuaW9uVHlwZSlkYXRhVHlwZSkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsNCi0gICAgICAgICAgICAgICAgaW50IGtpbmRWYWwgPSBkaXNjcmltaW5hdG9yVHlwZS5nZXRUeXBlQ29kZSgpLmtpbmQoKS52YWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGtpbmRWYWwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBJbnRlZ2VyLnZhbHVlT2YoLTIxNDc0ODM2NDgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXI6DQotICAgICAgICAgICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6DQotICAgICAgICAgICAgICAgICAgICAgICAgZGlzY3JpbWluYXRvciA9IENoYXJhY3Rlci52YWx1ZU9mKCdcdTAwMDAnKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19lbnVtOg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVudW1UeXBlIGVudW1UeXBlID0gKEVudW1UeXBlKSBkaXNjcmltaW5hdG9yVHlwZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWUgZW51bVZhbHVlID0gbmV3IEVudW1WYWx1ZShlbnVtVHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlLnNldFZhbHVlKDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBlbnVtVmFsdWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVW5zdXBwb3J0ZWQgdW5pb24gbWVtYmVyIHR5cGUiKTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7DQotICAgICAgICBwb3B1bGF0ZURpc2NyaW1pbmF0b3IoKTsNCi0gICAgICAgIHdyaXRlKGRpc2NyaW1pbmF0b3IsICgoVW5pb25UeXBlKSBkYXRhVHlwZSkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgb3V0cHV0U3RyZWFtKTsNCi0gICAgICAgIHdyaXRlKG1lbWJlclZhbHVlLCBnZXRNZW1iZXJUeXBlKCksIG91dHB1dFN0cmVhbSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRNZW1iZXJOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG1lbWJlck5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyTmFtZShTdHJpbmcgbWVtYmVyTmFtZSkgew0KLSAgICAgICAgdGhpcy5tZW1iZXJOYW1lID0gbWVtYmVyTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE1lbWJlclZhbHVlKCkgew0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE1lbWJlclZhbHVlKE9iamVjdCBtZW1iZXJWYWx1ZSkgew0KLSAgICAgICAgdGhpcy5tZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXRNZW1iZXJUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG1lbWJlclR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVyVHlwZShEYXRhVHlwZSBtZW1iZXJUeXBlKSB7DQotICAgICAgICB0aGlzLm1lbWJlclR5cGUgPSBtZW1iZXJUeXBlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUluT25seU1lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjFlYTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyLkNvcmJhQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JREw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLk9SQjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIENvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlciBpbXBsZW1lbnRzIENvcmJhQ29uc3RhbnRzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBPUkIgb3JiID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBNYXAgaW52b2tlckNhY2hlID0gbmV3IEhhc2hNYXAoKTsNCi0NCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGludm9rZShpbk1lc3NhZ2UpOw0KLSAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5UUkFOU0lFTlQgZSkgew0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJvcmcub21nLkNPUkJBLlRSQU5TSUVOVCBleGNlcHRpb24gdGhyb3duLiIpOw0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgKiBJZiBjYW5ub3QgY29ubmVjdCB0byB0aGUgY29yYmEgc2VydmVyDQotICAgICAgICAgICAgKiB0cnkgYWdhaW4gYWZ0ZXIgY2xlYXJpbmcgdGhlIGNhY2hlDQotICAgICAgICAgICAgKiAoZWcuIGlmIHRoZSBDb3JiYSBzZXJ2ZXIgaXMgcmVzdGFydGVkKQ0KLSAgICAgICAgICAgICovDQotICAgICAgICAgICAgaW52b2tlckNhY2hlLmNsZWFyKCk7DQotICAgICAgICAgICAgaW52b2tlKGluTWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGludm9rZShNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gaW5NZXNzYWdlLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2RFbGVtZW50ID0gaW5NZXNzYWdlLmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluQXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7DQotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lU3BhY2U7DQotICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lOw0KLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7DQotDQotICAgICAgICAgICAgSW52b2tlciBpbnZva2VyID0gKEludm9rZXIpIGludm9rZXJDYWNoZS5nZXQobWV0aG9kTmFtZSk7DQotICAgICAgICAgICAgaWYgKGludm9rZXI9PW51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG9yYj09bnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIG9yYlBhcmFtID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoT1JCX0xJVEVSQUwpOw0KLSAgICAgICAgICAgICAgICAgICAgb3JiID0gb3JiUGFyYW0gIT0gbnVsbCA/IChPUkIpIG9yYlBhcmFtLmdldFZhbHVlKCkgOiBDb3JiYVV0aWwuZ2V0T1JCKHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iaiA9IENvcmJhVXRpbC5yZXNvbHZlT2JqZWN0KHNlcnZpY2UsIG9yYik7DQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBpZGxQYXJhbWV0ZXIgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihJRExfTElURVJBTCk7DQotICAgICAgICAgICAgICAgIGlmIChpZGxQYXJhbWV0ZXI9PW51bGwpDQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJObyBJREwgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgSURMIGlkbCA9IChJREwpIGlkbFBhcmFtZXRlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyID0gQ29yYmFVdGlsLmdldEludm9rZXIoc2VydmljZSwgb2JqLCBpZGwsIG1ldGhvZE5hbWUpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyQ2FjaGUucHV0KG1ldGhvZE5hbWUsIGludm9rZXIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpIT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVzc2FnZU5hbWVTcGFjZS5lcXVhbHMobmFtZXNwYWNlLmdldE5hbWVzcGFjZVVSSSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2ggcmVxdWlyZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTmFtZVNwYWNlICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvdW5kICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2guIEF4aXMgT2VwcmF0aW9uIGV4cGVjdHMgbm9uLW5hbWVzcGFjZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZWQgZWxlbWVudC4gQnV0IHJlY2VpdmVkIGEgbmFtZXNwYWNlIHF1YWxpZmllZCBlbGVtZW50Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvYmplY3RBcnJheSA9IENvcmJhVXRpbC5leHRyYWN0UGFyYW1ldGVycyhtZXRob2RFbGVtZW50LCBpbnZva2VyLmdldFBhcmFtZXRlck1lbWJlcnMoKSk7DQotICAgICAgICAgICAgICAgICAgICBpbnZva2VyLnNldFBhcmFtZXRlcnMob2JqZWN0QXJyYXkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGludm9rZXIuaW52b2tlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTdHJpbmcgbXNnOw0KLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKyBtZXRob2ROYW1lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vbG9nLmVycm9yKG1zZywgZSk7DQotICAgICAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEF4aXNGYXVsdCkgY2F1c2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtc2cgPSBlLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2cpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxOWJhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZGVwbG95ZXIuQ29yYmFDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLklETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkFfMl8zLk9SQjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIENvcmJhSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBpbXBsZW1lbnRzIENvcmJhQ29uc3RhbnRzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhSW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5jbGFzcyk7DQotICAgIHByaXZhdGUgT1JCIG9yYiA9IG51bGw7DQotICAgIHByaXZhdGUgTWFwIGludm9rZXJDYWNoZSA9IG5ldyBIYXNoTWFwKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBpbnZva2UoaW5NZXNzYWdlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEuVFJBTlNJRU5UIGUpIHsNCi0gICAgICAgICAgICBsb2cuaW5mbygib3JnLm9tZy5DT1JCQS5UUkFOU0lFTlQgZXhjZXB0aW9uIHRocm93bi4iKTsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICogSWYgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGNvcmJhIHNlcnZlcg0KLSAgICAgICAgICAgICogdHJ5IGFnYWluIGFmdGVyIGNsZWFyaW5nIHRoZSBjYWNoZQ0KLSAgICAgICAgICAgICogKGVnLiBpZiB0aGUgQ29yYmEgc2VydmVyIGlzIHJlc3RhcnRlZCkNCi0gICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGludm9rZXJDYWNoZS5jbGVhcigpOw0KLSAgICAgICAgICAgIGludm9rZShpbk1lc3NhZ2UsIG91dE1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBpbnZva2UoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IGluTWVzc2FnZS5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpOw0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0NCi0gICAgICAgICAgICBBeGlzTWVzc2FnZSBpbkF4aXNNZXNzYWdlID0gb3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOw0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZVNwYWNlID0gbnVsbDsNCi0gICAgICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWU7DQotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsNCi0NCi0gICAgICAgICAgICBJbnZva2VyIGludm9rZXIgPSAoSW52b2tlcikgaW52b2tlckNhY2hlLmdldChtZXRob2ROYW1lKTsNCi0gICAgICAgICAgICBpZiAoaW52b2tlcj09bnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAob3JiPT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgb3JiUGFyYW0gPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihPUkJfTElURVJBTCk7DQotICAgICAgICAgICAgICAgICAgICBvcmIgPSBvcmJQYXJhbSAhPSBudWxsID8gKE9SQikgb3JiUGFyYW0uZ2V0VmFsdWUoKSA6IENvcmJhVXRpbC5nZXRPUkIoc2VydmljZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqID0gQ29yYmFVdGlsLnJlc29sdmVPYmplY3Qoc2VydmljZSwgb3JiKTsNCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGlkbFBhcmFtZXRlciA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKElETF9MSVRFUkFMKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlkbFBhcmFtZXRlcj09bnVsbCkNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oIklETCBub3QgZm91bmQiKTsNCi0gICAgICAgICAgICAgICAgSURMIGlkbCA9IChJREwpIGlkbFBhcmFtZXRlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyID0gQ29yYmFVdGlsLmdldEludm9rZXIoc2VydmljZSwgb2JqLCBpZGwsIG1ldGhvZE5hbWUpOw0KLSAgICAgICAgICAgICAgICBpbnZva2VyQ2FjaGUucHV0KG1ldGhvZE5hbWUsIGludm9rZXIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBPYmplY3QgcmVzT2JqZWN0ID0gbnVsbDsNCi0gICAgICAgICAgICBNZW1iZXJbXSBwYXJhbXMgPSBudWxsOw0KLSAgICAgICAgICAgIE9iamVjdFtdIG91dFBhcmFtVmFsdWVzID0gbnVsbDsNCi0gICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpIT1udWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8ICFtZXNzYWdlTmFtZVNwYWNlLmVxdWFscyhuYW1lc3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaCByZXF1aXJlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm91bmQgIiArIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJuYW1lc3BhY2UgbWlzbWF0Y2guIEF4aXMgT2VwcmF0aW9uIGV4cGVjdHMgbm9uLW5hbWVzcGFjZSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaWZpZWQgZWxlbWVudC4gQnV0IHJlY2VpdmVkIGEgbmFtZXNwYWNlIHF1YWxpZmllZCBlbGVtZW50Iik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvYmplY3RBcnJheSA9IENvcmJhVXRpbC5leHRyYWN0UGFyYW1ldGVycyhtZXRob2RFbGVtZW50LCBpbnZva2VyLmdldFBhcmFtZXRlck1lbWJlcnMoKSk7DQotICAgICAgICAgICAgICAgICAgICBpbnZva2VyLnNldFBhcmFtZXRlcnMob2JqZWN0QXJyYXkpOw0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gaW52b2tlci5nZXRQYXJhbWV0ZXJNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICBvdXRQYXJhbVZhbHVlcyA9IGludm9rZXIuZ2V0T3V0UGFyYW1ldGVyVmFsdWVzcygpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJlc09iamVjdCA9IGludm9rZXIuaW52b2tlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KGluTWVzc2FnZSk7DQotDQotICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0YXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOw0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlTmFtZVNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBvdXRheGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHFuYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBIYW5kbGluZyB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBDb3JiYVV0aWwucHJvY2Vzc1Jlc3BvbnNlKHJlc09iamVjdCwgcGFyYW1zLCBvdXRQYXJhbVZhbHVlcywgaW52b2tlci5nZXRSZXR1cm5UeXBlKCksIHNlcnZpY2UsIG1ldGhvZE5hbWUsIGZhYywNCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UsIG91dE1lc3NhZ2UpOw0KLSAgICAgICAgfSBjYXRjaCAoQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTdHJpbmcgbXNnOw0KLSAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbXNnID0gIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW52b2tlIHNlcnZpY2UgbWV0aG9kICIgKyBtZXRob2ROYW1lOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vbG9nLmVycm9yKG1zZywgZSk7DQotICAgICAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEF4aXNGYXVsdCkgY2F1c2U7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBtc2cgPSBlLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2cpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXIuamF2YSBiLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2MWI3Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FeGNlcHRpb25UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk1lbWJlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuRXhjZXB0aW9uVmFsdWU7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQW55Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBLkV4Y2VwdGlvbkxpc3Q7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuUmVxdWVzdDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5Vbmtub3duVXNlckV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIENvcmJhSW52b2tlciBpbXBsZW1lbnRzIEludm9rZXIgew0KLSAgICBwcml2YXRlIE9wZXJhdGlvbiBvcGVyYXRpb247DQotICAgIHByaXZhdGUgSW50ZXJmYWNlIGludGY7DQotICAgIC8vcHJpdmF0ZSBNYXAgY29tcG9zaXRlRGF0YVR5cGVzOw0KLSAgICBwcml2YXRlIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iamVjdDsNCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBwYXJhbWV0ZXJzOw0KLSAgICBwcml2YXRlIExpc3QgcGFyYW1ldGVyVHlwZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgIHByaXZhdGUgTGlzdCByZXR1cm5lZFBhcmFtczsNCi0NCi0gICAgcHJvdGVjdGVkIENvcmJhSW52b2tlcihPcGVyYXRpb24gb3BlcmF0aW9uLCBJbnRlcmZhY2UgaW50Ziwgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqZWN0KSB7DQotICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsNCi0gICAgICAgIHRoaXMuaW50ZiA9IGludGY7DQotICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsNCi0NCi0gICAgICAgIExpc3QgcGFyYW1zID0gb3BlcmF0aW9uLmdldFBhcmFtcygpOw0KLSAgICAgICAgaWYgKHBhcmFtcyE9bnVsbCkgew0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBwYXJhbXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlTGlzdC5hZGQobWVtYmVyKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoKSB0aHJvd3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSByZXF1ZXN0DQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3QgPSBvYmplY3QuX3JlcXVlc3Qob3BlcmF0aW9uLmdldE5hbWUoKSk7DQotDQotICAgICAgICAvLyBTZXQgcGFyYW1ldGVycw0KLSAgICAgICAgQW55IGFyZyA9IG51bGw7DQotICAgICAgICBMaXN0IG1lbUFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBpZiAocGFyYW1ldGVycyE9bnVsbCkgew0KLSAgICAgICAgICAgIExpc3QgcGF0YW1MaXN0ID0gbmV3IExpbmtlZExpc3QoQXJyYXlzLmFzTGlzdChwYXJhbWV0ZXJzKSk7DQotICAgICAgICAgICAgSXRlcmF0b3IgcGFyYW1zSXRlciA9IHBhdGFtTGlzdC5pdGVyYXRvcigpOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZUxpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgTWVtYmVyIG1lbWJlciA9IChNZW1iZXIpIHBhcmFtZXRlclR5cGVMaXN0LmdldChpKTsNCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgdHlwZSA9IG1lbWJlci5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IG1lbWJlci5nZXRNb2RlKCk7DQotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNZW1iZXIuTU9ERV9JTikpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFyZyA9IHJlcXVlc3QuYWRkX2luX2FyZygpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbXNJdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgfWVsc2UgaWYgKG1vZGUuZXF1YWxzKE1lbWJlci5NT0RFX0lOT1VUKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYXJnID0gcmVxdWVzdC5hZGRfaW5vdXRfYXJnKCk7DQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtc0l0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuZXF1YWxzKE1lbWJlci5NT0RFX09VVCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGFyZyA9IHJlcXVlc3QuYWRkX291dF9hcmcoKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQ29yYmFVdGlsLmdldEVtcHR5VmFsdWUodHlwZSk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbWVtQXJncy5hZGQoYXJnKTsNCi0gICAgICAgICAgICAgICAgQ29yYmFVdGlsLmluc2VydFZhbHVlKGFyZywgdHlwZSwgdmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFNldCByZXR1cm4gdHlwZQ0KLSAgICAgICAgRGF0YVR5cGUgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbi5nZXRSZXR1cm5UeXBlKCk7DQotICAgICAgICBpZiAocmV0dXJuVHlwZSE9bnVsbCkgew0KLSAgICAgICAgICAgIFR5cGVDb2RlIHR5cGVDb2RlID0gcmV0dXJuVHlwZS5nZXRUeXBlQ29kZSgpOw0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0X3JldHVybl90eXBlKHR5cGVDb2RlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFNldCBleGNlcHRpb25zDQotICAgICAgICBMaXN0IGV4Y2VwdGlvbnMgPSBvcGVyYXRpb24uZ2V0UmFpc2VzKCk7DQotICAgICAgICBpZiAoZXhjZXB0aW9ucyE9bnVsbCAmJiAhZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBFeGNlcHRpb25MaXN0IGV4Y2VwdGlvbkxpc3QgPSByZXF1ZXN0LmV4Y2VwdGlvbnMoKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbnMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleFR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgZXhjZXB0aW9ucy5nZXQoaSk7DQotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkxpc3QuYWRkKGV4VHlwZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBJbnZva2UNCi0gICAgICAgIHJlcXVlc3QuaW52b2tlKCk7DQotDQotICAgICAgICAvLyBHZXQgZXhjZXB0aW9uDQotICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHJlcXVlc3QuZW52KCkuZXhjZXB0aW9uKCk7DQotICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSByZXR1cm4gdmFsdWUNCi0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIEFueSByZXR1cm5lZCA9IHJlcXVlc3QucmV0dXJuX3ZhbHVlKCk7DQotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gQ29yYmFVdGlsLmV4dHJhY3RWYWx1ZShyZXR1cm5UeXBlLCByZXR1cm5lZCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHZhbHVlcyBvZiBpbm91dCBhbmQgb3V0IHBhcmFtZXRlcnMNCi0gICAgICAgICAgICByZXR1cm5lZFBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBwYXJhbWV0ZXJUeXBlTGlzdC5nZXQoaSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyBtb2RlID0gbWVtYmVyLmdldE1vZGUoKTsNCi0gICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1lbWJlci5NT0RFX0lOT1VUKSB8fCBtb2RlLmVxdWFscyhNZW1iZXIuTU9ERV9PVVQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm5lZFBhcmFtcy5hZGQoQ29yYmFVdGlsLmV4dHJhY3RWYWx1ZShtZW1iZXIuZ2V0RGF0YVR5cGUoKSwgKEFueSkgbWVtQXJncy5nZXQoaSkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYoZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5rbm93blVzZXJFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgICAgVW5rbm93blVzZXJFeGNlcHRpb24gdXNlckV4Y2VwdGlvbiA9IChVbmtub3duVXNlckV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgICAgICAgICBUeXBlQ29kZSBleFR5cGVDb2RlID0gdXNlckV4Y2VwdGlvbi5leGNlcHQudHlwZSgpOw0KLSAgICAgICAgICAgICAgICBFeGNlcHRpb25UeXBlIGV4Y2VwdGlvblR5cGUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9ucyE9bnVsbCAmJiAhZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblR5cGUgZXhUeXBlID0gKEV4Y2VwdGlvblR5cGUpIGV4Y2VwdGlvbnMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleFR5cGVDb2RlLmVxdWFsKGV4VHlwZS5nZXRUeXBlQ29kZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25UeXBlID0gZXhUeXBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvblR5cGU9PW51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oZXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblZhbHVlIGV4Y2VwdGlvblZhbHVlID0gKEV4Y2VwdGlvblZhbHVlKSBDb3JiYVV0aWwuZXh0cmFjdFZhbHVlKGV4Y2VwdGlvblR5cGUsIHVzZXJFeGNlcHRpb24uZXhjZXB0KTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25WYWx1ZSE9bnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleGNlcHRpb25WYWx1ZS5nZXRFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oZXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhPYmplY3RbXSBwYXJhbWV0ZXJzKXsNCi0gICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnRlcmZhY2VOYW1lKCl7DQotICAgICAgICByZXR1cm4gaW50Zi5nZXROYW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCl7DQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGF0YVR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBvcGVyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRPdXRQYXJhbWV0ZXJWYWx1ZXNzKCkgew0KLSAgICAgICAgaWYgKHJldHVybmVkUGFyYW1zID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICBlbHNlDQotICAgICAgICAgICAgcmV0dXJuIHJldHVybmVkUGFyYW1zLnRvQXJyYXkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVtYmVyW10gZ2V0UGFyYW1ldGVyTWVtYmVycygpIHsNCi0gICAgICAgIE1lbWJlcltdIG1lbWJlcnNBcnJheSA9IG5ldyBNZW1iZXJbcGFyYW1ldGVyVHlwZUxpc3Quc2l6ZSgpXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZUxpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBtZW1iZXJzQXJyYXlbaV0gPSAoTWVtYmVyKSBwYXJhbWV0ZXJUeXBlTGlzdC5nZXQoaSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWVtYmVyc0FycmF5Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXJGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFJbnZva2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRkMWU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYUludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zLkNvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuSURMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5JbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLk9wZXJhdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFJbnZva2VyRmFjdG9yeSBpbXBsZW1lbnRzIEludm9rZXJGYWN0b3J5IHsNCi0gICAgLy9wcml2YXRlIE1hcCBjb21wb3NpdGVEYXRhVHlwZXM7DQotICAgIHByaXZhdGUgTWFwIGludGVyZmFjZXM7DQotDQotICAgIHB1YmxpYyBDb3JiYUludm9rZXJGYWN0b3J5KElETCBpZGwpew0KLSAgICAgICAgLy90aGlzLmNvbXBvc2l0ZURhdGFUeXBlcyA9IGlkbC5nZXRDb21wb3NpdGVEYXRhVHlwZXMoKTsNCi0gICAgICAgIHRoaXMuaW50ZXJmYWNlcyA9IGlkbC5nZXRJbnRlcmZhY2VzKCk7DQotICAgIH0NCi0NCi0JcHVibGljIEludm9rZXIgbmV3SW52b2tlcihTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iamVjdCkgdGhyb3dzIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiB7DQotICAgICAgICBJbnRlcmZhY2UgaW50ZiA9IChJbnRlcmZhY2UpIGludGVyZmFjZXMuZ2V0KGludGVyZmFjZU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKGludGY9PW51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbigiSW50ZXJmYWNlICIgKyBpbnRlcmZhY2VOYW1lICsgIiBub3QgZm91bmQiKTsNCi0NCi0gICAgICAgIE1hcCBvcGVyYXRpb25zID0gaW50Zi5nZXRPcGVyYXRpb25zTWFwKCk7DQotDQotICAgICAgICBpZiAob3BlcmF0aW9ucz09bnVsbCB8fCBvcGVyYXRpb25zLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJJbnRlcmZhY2UgIiArIGludGVyZmFjZU5hbWUgKyAiIGRvZXMgbm90IGhhdmUgb3BlcmF0aW9ucyIpOw0KLQ0KLSAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbk5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKG9wZXJhdGlvbj09bnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJPcGVyYXRpb24gIiArIG9wZXJhdGlvbk5hbWUgKyAiIG5vdCBmb3VuZCBpbiBpbnRlcmZhY2UgIiArIGludGVyZmFjZU5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG5ldyBDb3JiYUludm9rZXIob3BlcmF0aW9uLCBpbnRmLCAvKmNvbXBvc2l0ZURhdGFUeXBlcywqLyBvYmplY3QpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9Db3JiYU1lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDhmNzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZGVwbG95ZXIuQ29yYmFDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLklETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuTWVtYmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0TWVzc2FnZVJlY2VpdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5PUkI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBDb3JiYU1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIgaW1wbGVtZW50cyBDb3JiYUNvbnN0YW50cyB7DQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb3JiYU1lc3NhZ2VSZWNlaXZlci5jbGFzcyk7DQotICAgIHByaXZhdGUgT1JCIG9yYiA9IG51bGw7DQotICAgIHByaXZhdGUgTWFwIGludm9rZXJDYWNoZSA9IG5ldyBIYXNoTWFwKCk7IC8vIEhhc2htYXAgdG8gY2FjaGUgaW52b2tlciBvYmplY3RzIHRvIGluY3JlYXNlIHByZWZvcm1hbmNlDQotDQotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBpbnZva2UoaW5NZXNzYWdlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEuVFJBTlNJRU5UIGUpIHsNCi0gICAgICAgICAgICBsb2cuaW5mbygib3JnLm9tZy5DT1JCQS5UUkFOU0lFTlQgZXhjZXB0aW9uIHRocm93bi4iKTsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICogSWYgY2Fubm90IGNvbm5lY3QgdG8gdGhlIGNvcmJhIHNlcnZlcg0KLSAgICAgICAgICAgICogdHJ5IGFnYWluIGFmdGVyIGNsZWFyaW5nIHRoZSBjYWNoZQ0KLSAgICAgICAgICAgICogKGVnLiBpZiB0aGUgQ29yYmEgc2VydmVyIGlzIHJlc3RhcnRlZCkgDQotICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBpbnZva2VyQ2FjaGUuY2xlYXIoKTsNCi0gICAgICAgICAgICBpbnZva2UoaW5NZXNzYWdlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgaW52b2tlKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZSkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBpbk1lc3NhZ2UuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldEF4aXNPcGVyYXRpb24oKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gaW5NZXNzYWdlLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgT01FbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBpbk1lc3NhZ2UuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5BeGlzTWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsNCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSA9IG51bGw7DQotICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lOw0KLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7DQotDQotICAgICAgICAgICAgSW52b2tlciBpbnZva2VyID0gKEludm9rZXIpIGludm9rZXJDYWNoZS5nZXQobWV0aG9kTmFtZSk7DQotICAgICAgICAgICAgaWYgKGludm9rZXI9PW51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKG9yYj09bnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIG9yYlBhcmFtID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoT1JCX0xJVEVSQUwpOw0KLSAgICAgICAgICAgICAgICAgICAgb3JiID0gb3JiUGFyYW0gIT0gbnVsbCA/IChPUkIpIG9yYlBhcmFtLmdldFZhbHVlKCkgOiBDb3JiYVV0aWwuZ2V0T1JCKHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iaiA9IENvcmJhVXRpbC5yZXNvbHZlT2JqZWN0KHNlcnZpY2UsIG9yYik7DQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBpZGxQYXJhbWV0ZXIgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihJRExfTElURVJBTCk7DQotICAgICAgICAgICAgICAgIGlmIChpZGxQYXJhbWV0ZXI9PW51bGwpDQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJJREwgbm90IGZvdW5kIik7DQotICAgICAgICAgICAgICAgIElETCBpZGwgPSAoSURMKSBpZGxQYXJhbWV0ZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlciA9IENvcmJhVXRpbC5nZXRJbnZva2VyKHNlcnZpY2UsIG9iaiwgaWRsLCBtZXRob2ROYW1lKTsNCi0gICAgICAgICAgICAgICAgaW52b2tlckNhY2hlLnB1dChtZXRob2ROYW1lLCBpbnZva2VyKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgT2JqZWN0IHJlc09iamVjdCA9IG51bGw7DQotICAgICAgICAgICAgTWVtYmVyW10gcGFyYW1zID0gbnVsbDsNCi0gICAgICAgICAgICBPYmplY3RbXSBvdXRQYXJhbVZhbHVlcyA9IG51bGw7DQotICAgICAgICAgICAgaWYgKGluQXhpc01lc3NhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaW5BeGlzTWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBpbkF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IGVsZW1lbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZU5hbWVTcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaCByZXF1aXJlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VOYW1lU3BhY2UgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm91bmQgbm9uZSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2VOYW1lU3BhY2UuZXF1YWxzKG5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibmFtZXNwYWNlIG1pc21hdGNoIHJlcXVpcmUgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCAiICsgbWV0aG9kRWxlbWVudC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm5hbWVzcGFjZSBtaXNtYXRjaC4gQXhpcyBPZXByYXRpb24gZXhwZWN0cyBub24tbmFtZXNwYWNlICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YWxpZmllZCBlbGVtZW50LiBCdXQgcmVjZWl2ZWQgYSBuYW1lc3BhY2UgcXVhbGlmaWVkIGVsZW1lbnQiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdEFycmF5ID0gQ29yYmFVdGlsLmV4dHJhY3RQYXJhbWV0ZXJzKG1ldGhvZEVsZW1lbnQsIGludm9rZXIuZ2V0UGFyYW1ldGVyTWVtYmVycygpKTsNCi0gICAgICAgICAgICAgICAgICAgIGludm9rZXIuc2V0UGFyYW1ldGVycyhvYmplY3RBcnJheSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmVzT2JqZWN0ID0gaW52b2tlci5pbnZva2UoKTsNCi0gICAgICAgICAgICAgICAgcGFyYW1zID0gaW52b2tlci5nZXRQYXJhbWV0ZXJNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgIG91dFBhcmFtVmFsdWVzID0gaW52b2tlci5nZXRPdXRQYXJhbWV0ZXJWYWx1ZXNzKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlTmFtZVNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0YXhpc01lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG91dGF4aXNNZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocW5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU5hbWVTcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIEhhbmRsaW5nIHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KGluTWVzc2FnZSk7DQotICAgICAgICAgICAgQ29yYmFVdGlsLnByb2Nlc3NSZXNwb25zZShyZXNPYmplY3QsIHBhcmFtcywgb3V0UGFyYW1WYWx1ZXMsIGludm9rZXIuZ2V0UmV0dXJuVHlwZSgpLCBzZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgZmFjLCBtZXNzYWdlTmFtZVNwYWNlLCBvdXRNZXNzYWdlKTsNCi0gICAgICAgIH0gY2F0Y2ggKENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3RyaW5nIG1zZzsNCi0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7DQotICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgbXNnID0gY2F1c2UuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAobXNnID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1zZyA9ICJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGludm9rZSBzZXJ2aWNlIG1ldGhvZCAiICsgbWV0aG9kTmFtZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAvL2xvZy5lcnJvcihtc2csIGUpOw0KLSAgICAgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBBeGlzRmF1bHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IChBeGlzRmF1bHQpIGNhdXNlOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbXNnID0gZS5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXNnLCBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvQ29yYmFVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTM1YmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0NvcmJhVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29yYmEucmVjZWl2ZXJzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmRlcGxveWVyLkNvcmJhQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmV4Y2VwdGlvbnMuQ29yYmFFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLklETFByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwuUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW07DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkFic3RyYWN0Q29sbGVjdGlvblR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkFycmF5VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuQ29tcG9zaXRlRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5FbnVtVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuRXhjZXB0aW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuSURMOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlByaW1pdGl2ZURhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5TZXF1ZW5jZVR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlN0cnVjdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVHlwZWRlZjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVW5pb25NZW1iZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLlVuaW9uVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudHlwZXMuVmFsdWVUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5BYnN0cmFjdFZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuQWxpYXNWYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzLkFycmF5VmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5FbnVtVmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5FeGNlcHRpb25WYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzLk9iamVjdEJ5VmFsdWU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnZhbHVlcy5TZXF1ZW5jZVZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuU3RyZWFtYWJsZVZhbHVlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5pZGwudmFsdWVzLlN0cnVjdFZhbHVlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC52YWx1ZXMuVW5pb25WYWx1ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLlR5cGVUYWJsZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQW55Ow0KLWltcG9ydCBvcmcub21nLkNPUkJBLlRDS2luZDsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZTsNCi1pbXBvcnQgb3JnLm9tZy5DT1JCQV8yXzMuT1JCOw0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0Ow0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0SGVscGVyOw0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5DYW5ub3RQcm9jZWVkOw0KLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5JbnZhbGlkTmFtZTsNCi1pbXBvcnQgb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UuTm90Rm91bmQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0vL2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLS8vaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7DQotLy9pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29yYmFVdGlsIGltcGxlbWVudHMgQ29yYmFDb25zdGFudHMgew0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXAgSURMX0NBQ0hFID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvcmJhVXRpbC5jbGFzcyk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQV8yXzMuT1JCIGdldE9SQihBeGlzU2VydmljZSBzZXJ2aWNlKSB7DQotICAgICAgICBQYXJhbWV0ZXIgb3JiQ2xhc3MgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihPUkJfQ0xBU1MpOw0KLSAgICAgICAgUGFyYW1ldGVyIG9yYlNpbmdsZXRvbkNsYXNzID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoT1JCX1NJTkdMRVRPTl9DTEFTUyk7DQotICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsNCi0NCi0gICAgICAgIGlmIChvcmJDbGFzcyE9bnVsbCkNCi0gICAgICAgICAgICBwcm9wcy5wdXQoT1JHX09NR19DT1JCQV9PUkJDTEFTUywgKChTdHJpbmcpIG9yYkNsYXNzLmdldFZhbHVlKCkpLnRyaW0oKSk7DQotICAgICAgICBlbHNlDQotICAgICAgICAgICAgcHJvcHMucHV0KE9SR19PTUdfQ09SQkFfT1JCQ0xBU1MsIERFRkFVTFJfT1JCX0NMQVNTKTsNCi0NCi0gICAgICAgIGlmIChvcmJTaW5nbGV0b25DbGFzcyE9bnVsbCkNCi0gICAgICAgICAgICBwcm9wcy5wdXQoT1JHX09NR19DT1JCQV9PUkJTSU5HTEVUT05fQ0xBU1MsICgoU3RyaW5nKSBvcmJTaW5nbGV0b25DbGFzcy5nZXRWYWx1ZSgpKS50cmltKCkpOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHByb3BzLnB1dChPUkdfT01HX0NPUkJBX09SQlNJTkdMRVRPTl9DTEFTUywgREVGQVVMVF9PUkJTSU5HTEVUT05fQ0xBU1MpOw0KLQ0KLSAgICAgICAgcmV0dXJuIChPUkIpIE9SQi5pbml0KG5ldyBTdHJpbmdbXXt9LCBwcm9wcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBvcmcub21nLkNPUkJBLk9iamVjdCByZXNvbHZlT2JqZWN0KEF4aXNTZXJ2aWNlIHNlcnZpY2UsIG9yZy5vbWcuQ09SQkFfMl8zLk9SQiBvcmIpIHRocm93cyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24gew0KLSAgICAgICAgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBQYXJhbWV0ZXIgbmFtaW5nU2VydmljZVVybCA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKE5BTUlOR19TRVJWSUNFX1VSTCk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIG9iamVjdE5hbWUgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihPQkpFQ1RfTkFNRSk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIGlvckZpbGVQYXRoID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoSU9SX0ZJTEVfUEFUSCk7DQotICAgICAgICAgICAgUGFyYW1ldGVyIGlvclN0cmluZyA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKElPUl9TVFJJTkcpOw0KLQ0KLSAgICAgICAgICAgIGlmIChuYW1pbmdTZXJ2aWNlVXJsIT1udWxsICYmIG9iamVjdE5hbWUhPW51bGwpIHsNCi0gICAgICAgICAgICAgICAgb2JqID0gb3JiLnN0cmluZ190b19vYmplY3QoKChTdHJpbmcpIG5hbWluZ1NlcnZpY2VVcmwuZ2V0VmFsdWUoKSkudHJpbSgpKTsNCi0gICAgICAgICAgICAgICAgTmFtaW5nQ29udGV4dEV4dCBuYyA9IE5hbWluZ0NvbnRleHRFeHRIZWxwZXIubmFycm93KG9iaik7DQotICAgICAgICAgICAgICAgIG9iaiA9IG5jLnJlc29sdmUobmMudG9fbmFtZSgoKFN0cmluZykgb2JqZWN0TmFtZS5nZXRWYWx1ZSgpKS50cmltKCkpKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlvckZpbGVQYXRoIT1udWxsKSB7DQotICAgICAgICAgICAgICAgIEZpbGVSZWFkZXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCgoU3RyaW5nKSBpb3JGaWxlUGF0aC5nZXRWYWx1ZSgpKS50cmltKCkpOw0KLSAgICAgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbMTAwMF07DQotICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZChidWYpOw0KLSAgICAgICAgICAgICAgICBvYmogPSBvcmIuc3RyaW5nX3RvX29iamVjdCgobmV3IFN0cmluZyhidWYpKS50cmltKCkpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW9yU3RyaW5nIT1udWxsKSB7DQotICAgICAgICAgICAgICAgIG9iaiA9IG9yYi5zdHJpbmdfdG9fb2JqZWN0KCgoU3RyaW5nKSBpb3JTdHJpbmcuZ2V0VmFsdWUoKSkudHJpbSgpKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJjYW5ub3QgcmVzb2x2ZSBvYmplY3QiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChOb3RGb3VuZCBub3RGb3VuZCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImNhbm5vdCByZXNvbHZlIG9iamVjdCIsIG5vdEZvdW5kKTsNCi0gICAgICAgIH0gY2F0Y2ggKENhbm5vdFByb2NlZWQgY2Fubm90UHJvY2VlZCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImNhbm5vdCByZXNvbHZlIG9iamVjdCIsIGNhbm5vdFByb2NlZWQpOw0KLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZE5hbWUgaW52YWxpZE5hbWUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJjYW5ub3QgcmVzb2x2ZSBvYmplY3QiLCBpbnZhbGlkTmFtZSk7DQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbigiY2Fubm90IHJlc29sdmUgb2JqZWN0IiwgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb2JqOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgSURMIGdldElETChBeGlzU2VydmljZSBzZXJ2aWNlLCBPUkIgb3JiLCBTdHJpbmcgZGlyTmFtZSkgdGhyb3dzIENvcmJhRXhjZXB0aW9uIHsNCi0gICAgICAgIFBhcmFtZXRlciBpZGxGaWxlID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoSURMX0ZJTEUpOw0KLQ0KLSAgICAgICAgaWYgKGlkbEZpbGUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IHRoZSBJREwgZmlsZSIpOyAgICANCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFN0cmluZyBpZGxGaWxlTmFtZSA9ICgoU3RyaW5nKSBpZGxGaWxlLmdldFZhbHVlKCkpLnRyaW0oKTsNCi0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9IGRpck5hbWUgKyBGaWxlLnNlcGFyYXRvciArIGlkbEZpbGVOYW1lOw0KLSAgICAgICAgSURMIGlkbCA9IChJREwpIElETF9DQUNIRS5nZXQoY2FjaGVLZXkpOw0KLSAgICAgICAgaWYgKGlkbD09bnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8qRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyTmFtZSk7DQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbTsNCi0gICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjYWNoZUtleSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsNCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaWRsRmlsZU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJjYW5ub3QgZmluZCAiICsgaWRsRmlsZU5hbWUgKyAiIGluICIgKyBmaWxlLmdldFBhdGgoKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSB6aW47DQotICAgICAgICAgICAgICAgIH0qLw0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgUHJlUHJvY2Vzc29ySW5wdXRTdHJlYW0oZGlyTmFtZSwgaWRsRmlsZU5hbWUpOw0KLSAgICAgICAgICAgICAgICAvL1RPRE86IFNldCBwcmUtcHJvY2Vzc29yIHN5c3RlbSBhbmQgdXNlciBpbnB1dCBwYXRocw0KLSAgICAgICAgICAgICAgICBJRExQcm9jZXNzb3IgaWRsUHJvY2Vzc29yID0gbmV3IElETFByb2Nlc3NvcihzdHJlYW0pOw0KLSAgICAgICAgICAgICAgICBpZGwgPSBpZGxQcm9jZXNzb3IucHJvY2VzcygpOw0KLSAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgSURMX0NBQ0hFLnB1dChjYWNoZUtleSwgaWRsKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImNhbm5vdCBwcm9jZXNzIGlkbCBmaWxlIiwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWFwIHR5cGVzID0gaWRsLmdldENvbXBvc2l0ZURhdGFUeXBlcygpOw0KLSAgICAgICAgaWYgKHR5cGVzIT1udWxsKSB7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIERhdGFUeXBlIHR5cGUgPSAgKERhdGFUeXBlKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBWYWx1ZVR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmVhbWFibGVWYWx1ZUZhY3RvcnkucmVnaXN0ZXIob3JiLCAoVmFsdWVUeXBlKSB0eXBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpZGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBJbnZva2VyIGdldEludm9rZXIoQXhpc1NlcnZpY2Ugc2VydmljZSwgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqLCBJREwgaWRsLCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbiB7DQotICAgICAgICBJbnZva2VyRmFjdG9yeSBpbnZva2VyRmFjdG9yeSA9IG5ldyBDb3JiYUludm9rZXJGYWN0b3J5KGlkbCk7DQotICAgICAgICBQYXJhbWV0ZXIgaW50ZXJmYWNlTmFtZSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKElOVEVSRkFDRV9OQU1FKTsNCi0gICAgICAgIGlmIChpbnRlcmZhY2VOYW1lPT1udWxsKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24oImludGVyZmFjZU5hbWUgY2Fubm90IGJlIG51bGwiKTsNCi0gICAgICAgIHJldHVybiBpbnZva2VyRmFjdG9yeS5uZXdJbnZva2VyKCgoU3RyaW5nKSBpbnRlcmZhY2VOYW1lLmdldFZhbHVlKCkpLnRyaW0oKSwgbWV0aG9kTmFtZSwgb2JqKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGV4dHJhY3RQYXJhbWV0ZXJzKE9NRWxlbWVudCBtZXRob2RFbGVtZW50LCBNZW1iZXJbXSBwYXJhbWV0ZXJNZW1iZXJzKSB0aHJvd3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChwYXJhbWV0ZXJNZW1iZXJzPT1udWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQ0KLSAgICAgICAgT2JqZWN0W10gcmV0T2JqcyA9IG5ldyBPYmplY3RbcGFyYW1ldGVyTWVtYmVycy5sZW5ndGhdOw0KLQ0KLSAgICAgICAgaWYgKG1ldGhvZEVsZW1lbnQ9PW51bGwpDQotICAgICAgICAgICAgcmV0dXJuIHJldE9ianM7DQotDQotICAgICAgICBJdGVyYXRvciBwYXJhbXNJdGVyID0gbWV0aG9kRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7DQotICAgICAgICBNYXAgcGFyYW1zTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWU7DQotICAgICAgICB3aGlsZShwYXJhbXNJdGVyIT1udWxsICYmIHBhcmFtc0l0ZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgT01FbGVtZW50IHBhcmFtID0gKE9NRWxlbWVudCkgcGFyYW1zSXRlci5uZXh0KCk7DQotICAgICAgICAgICAgbG9jYWxOYW1lID0gcGFyYW0uZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICAgICAgaWYgKHBhcmFtc01hcC5jb250YWluc0tleShsb2NhbE5hbWUpKSB7DQotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtc01hcC5nZXQobG9jYWxOYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgew0KLSAgICAgICAgICAgICAgICAgICAgKChMaXN0KSB2YWx1ZSkuYWRkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIExpc3QgdmFsdWVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWVMaXN0LmFkZCh2YWx1ZSk7DQotICAgICAgICAgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtc01hcC5wdXQobG9jYWxOYW1lLCB2YWx1ZUxpc3QpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1zTWFwLnB1dChsb2NhbE5hbWUsIHBhcmFtKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTdHJpbmcgcGFyYW1OYW1lOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJNZW1iZXJzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgcGFyYW1OYW1lID0gcGFyYW1ldGVyTWVtYmVyc1tpXS5nZXROYW1lKCk7DQotICAgICAgICAgICAgcmV0T2Jqc1tpXSA9IGV4dHJhY3RWYWx1ZShwYXJhbWV0ZXJNZW1iZXJzW2ldLmdldERhdGFUeXBlKCksIHBhcmFtc01hcC5nZXQocGFyYW1OYW1lKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0T2JqczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZXh0cmFjdFZhbHVlKERhdGFUeXBlIGRhdGFUeXBlLCBPYmplY3QgcGFyYW0pIHRocm93cyBDb3JiYUludm9jYXRpb25FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGRhdGFUeXBlIGluc3RhbmNlb2YgVHlwZWRlZikgew0KLSAgICAgICAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IChUeXBlZGVmKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICBBbGlhc1ZhbHVlIGFsaWFzVmFsdWUgPSBuZXcgQWxpYXNWYWx1ZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1FbGVtZW50Ow0KLSAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIE9NRWxlbWVudCkNCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gKE9NRWxlbWVudCkgcGFyYW07DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgICAgICAgICBEYXRhVHlwZSBhbGlhc1R5cGUgPSB0eXBlZGVmLmdldERhdGFUeXBlKCk7DQotICAgICAgICAgICAgaWYgKCEoYWxpYXNUeXBlIGluc3RhbmNlb2YgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSkpIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gcGFyYW1FbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1FbGVtZW50ID09IG51bGwgfHwgIUFSUkFZX0lURU0uZXF1YWxzKHBhcmFtRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpDQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYWxpYXNWYWx1ZS5zZXRWYWx1ZShleHRyYWN0VmFsdWUoYWxpYXNUeXBlLCBwYXJhbUVsZW1lbnQpKTsNCi0gICAgICAgICAgICByZXR1cm4gYWxpYXNWYWx1ZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBQcmltaXRpdmVEYXRhVHlwZSkgew0KLSAgICAgICAgICAgIGlmIChwYXJhbSE9bnVsbCkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWUoZGF0YVR5cGUsICgoT01FbGVtZW50KSBwYXJhbSkuZ2V0VGV4dCgpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSB7DQotICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYW1FbGVtZW50Ow0KLSAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIE9NRWxlbWVudCkNCi0gICAgICAgICAgICAgICAgcGFyYW1FbGVtZW50ID0gKE9NRWxlbWVudCkgcGFyYW07DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0NCi0gICAgICAgICAgICBJdGVyYXRvciBwYXJhbXNJdGVyID0gcGFyYW1FbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsNCi0gICAgICAgICAgICBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIHdoaWxlIChwYXJhbXNJdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoZXh0cmFjdFZhbHVlKGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCksIHBhcmFtc0l0ZXIubmV4dCgpKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlIGNvbGxlY3Rpb25WYWx1ZTsNCi0gICAgICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuaXNBcnJheSgpKSB7DQotICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25WYWx1ZSA9IG5ldyBBcnJheVZhbHVlKChBcnJheVR5cGUpIGNvbGxlY3Rpb25UeXBlKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb25UeXBlLmlzU2VxdWVuY2UoKSkgew0KLSAgICAgICAgICAgICAgICBjb2xsZWN0aW9uVmFsdWUgPSBuZXcgU2VxdWVuY2VWYWx1ZSgoU2VxdWVuY2VUeXBlKSBjb2xsZWN0aW9uVHlwZSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGNvbGxlY3Rpb25WYWx1ZS5zZXRWYWx1ZXMoY2hpbGRyZW4udG9BcnJheSgpKTsNCi0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvblZhbHVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIEVudW1UeXBlKSB7DQotICAgICAgICAgICAgRW51bVR5cGUgZW51bVR5cGUgPSAoRW51bVR5cGUpIGRhdGFUeXBlOw0KLSAgICAgICAgICAgIFN0cmluZyBlbnVtVGV4dCA9ICgoT01FbGVtZW50KSBwYXJhbSkuZ2V0VGV4dCgpOw0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGVudW1UeXBlLmdldEVudW1NZW1iZXJzKCkuaW5kZXhPZihlbnVtVGV4dCk7DQotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsNCi0gICAgICAgICAgICAgICAgRW51bVZhbHVlIGVudW1WYWx1ZSA9IG5ldyBFbnVtVmFsdWUoZW51bVR5cGUpOw0KLSAgICAgICAgICAgICAgICBlbnVtVmFsdWUuc2V0VmFsdWUoaW5kZXgpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZW51bVZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBVbmlvblR5cGUpIHsNCi0gICAgICAgICAgICBVbmlvblR5cGUgdW5pb25UeXBlID0gKFVuaW9uVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICAgICAgT01FbGVtZW50IHVuRWxlbWVudCA9ICgoT01FbGVtZW50KSBwYXJhbSkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIHVuaW9uTWVtYmVyTmFtZSA9IHVuRWxlbWVudC5nZXRMb2NhbE5hbWUoKTsNCi0gICAgICAgICAgICBVbmlvblZhbHVlIHVuaW9uVmFsdWUgPSBuZXcgVW5pb25WYWx1ZSh1bmlvblR5cGUpOw0KLSAgICAgICAgICAgIHVuaW9uVmFsdWUuc2V0TWVtYmVyTmFtZSh1bmlvbk1lbWJlck5hbWUpOw0KLSAgICAgICAgICAgIE1lbWJlcltdIG1lbWJlcnMgPSB1bmlvblR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgIFVuaW9uTWVtYmVyIG1lbWJlciA9IG51bGw7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIG1lbWJlciA9IChVbmlvbk1lbWJlcikgbWVtYmVyc1tpXTsNCi0gICAgICAgICAgICAgICAgaWYgKG1lbWJlci5nZXROYW1lKCkuZXF1YWxzKHVuaW9uTWVtYmVyTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtZW1iZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnNldE1lbWJlclZhbHVlKGV4dHJhY3RWYWx1ZShtZW1iZXIuZ2V0RGF0YVR5cGUoKSwgdW5FbGVtZW50KSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB1bmlvblZhbHVlOw0KLSAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIENvbXBvc2l0ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgQ29tcG9zaXRlRGF0YVR5cGUgY29tcG9zaXRlVHlwZSA9IChDb21wb3NpdGVEYXRhVHlwZSkgZGF0YVR5cGU7DQotICAgICAgICAgICAgTWVtYmVyW10gY29tcG9zaXRlTWVtYmVycyA9IGNvbXBvc2l0ZVR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgIE9iamVjdFtdIGNvbXBvc2l0ZVZhbHVlcyA9IGV4dHJhY3RQYXJhbWV0ZXJzKCgoT01FbGVtZW50KSBwYXJhbSksIGNvbXBvc2l0ZU1lbWJlcnMpOw0KLQ0KLSAgICAgICAgICAgIEFic3RyYWN0VmFsdWUgdmFsdWU7DQotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZVR5cGUgaW5zdGFuY2VvZiBWYWx1ZVR5cGUpDQotICAgICAgICAgICAgICAgIHZhbHVlID0gbmV3IE9iamVjdEJ5VmFsdWUoKFZhbHVlVHlwZSkgY29tcG9zaXRlVHlwZSk7DQotICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9zaXRlVHlwZSBpbnN0YW5jZW9mIFN0cnVjdCkNCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RydWN0VmFsdWUoKFN0cnVjdCkgY29tcG9zaXRlVHlwZSk7DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uKCJQYXJhbWV0ZXIgdHlwZSBub3Qgc3VwcG9ydGVkIik7DQotDQotICAgICAgICAgICAgdmFsdWUuc2V0TWVtYmVyVmFsdWVzKGNvbXBvc2l0ZVZhbHVlcyk7DQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3NSZXNwb25zZShPYmplY3QgcmVzT2JqZWN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJlcltdIHBhcmFtcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvdXRQYXJhbVZhbHVlcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWVTcGFjZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIGJvb2xlYW4gcXVhbGlmaWVkID0gc2VydmljZS5pc0VsZW1lbnRGb3JtRGVmYXVsdCgpOw0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UobWVzc2FnZU5hbWVTcGFjZSwgc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7DQotICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KG1ldGhvZE5hbWUgKyBSRVNQT05TRSwgbnMpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkOw0KLQ0KLSAgICAgICAgaWYgKHF1YWxpZmllZCkgew0KLSAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChSRVRVUk5fV1JBUFBFUiwgbnMpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBjaGlsZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUkVUVVJOX1dSQVBQRVIsIG51bGwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoY2hpbGQpOw0KLQ0KLSAgICAgICAgaWYgKGRhdGFUeXBlIT1udWxsDQotICAgICAgICAgICAgICAgICYmICFnZXRRdWFsaWZpZWROYW1lKGRhdGFUeXBlKS5lcXVhbHMoVk9JRCkNCi0gICAgICAgICAgICAgICAgJiYgcmVzT2JqZWN0IT1udWxsKSB7DQotICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKGNoaWxkLCBib2R5Q29udGVudCwgcmVzT2JqZWN0LCBkYXRhVHlwZSwgZmFjLCBucywgcXVhbGlmaWVkLCBzZXJ2aWNlKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgY2hpbGQuYWRkQXR0cmlidXRlKCJuaWwiLCAidHJ1ZSIsIGZhYy5jcmVhdGVPTU5hbWVzcGFjZShDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSSwNCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5OU19QUkVGSVhfU0NIRU1BX1hTSSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVtYmVyIHBhcmFtOw0KLSAgICAgICAgTGlzdCBvdXRQYXJhbUxpc3QgPSBBcnJheXMuYXNMaXN0KG91dFBhcmFtVmFsdWVzKTsNCi0gICAgICAgIEl0ZXJhdG9yIHBhcmFtc0l0ZXIgPSBvdXRQYXJhbUxpc3QuaXRlcmF0b3IoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgcGFyYW0gPSBwYXJhbXNbaV07DQotICAgICAgICAgICAgaWYgKE1lbWJlci5NT0RFX0lOT1VULmVxdWFscyhwYXJhbS5nZXRNb2RlKCkpDQotICAgICAgICAgICAgICAgICAgICB8fCBNZW1iZXIuTU9ERV9PVVQuZXF1YWxzKHBhcmFtLmdldE1vZGUoKSkpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHF1YWxpZmllZCkgew0KLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcmFtLmdldE5hbWUoKSwgbnMpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KHBhcmFtLmdldE5hbWUoKSwgbnVsbCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYm9keUNvbnRlbnQuYWRkQ2hpbGQoY2hpbGQpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UoY2hpbGQsIGJvZHlDb250ZW50LCBwYXJhbXNJdGVyLm5leHQoKSwgcGFyYW0uZ2V0RGF0YVR5cGUoKSwgZmFjLCBucywgcXVhbGlmaWVkLCBzZXJ2aWNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoYm9keUNvbnRlbnQpOw0KLSAgICAgICAgb3V0TWVzc2FnZS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzUmVzcG9uc2UoT01FbGVtZW50IGNoaWxkLCBPTUVsZW1lbnQgYm9keUNvbnRlbnQsIE9iamVjdCByZXNPYmplY3QsIERhdGFUeXBlIGRhdGFUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMsIE9NTmFtZXNwYWNlIGRlZmF1bHROUywgYm9vbGVhbiBxdWFsaWZpZWQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsNCi0gICAgICAgIGlmIChkYXRhVHlwZSBpbnN0YW5jZW9mIFByaW1pdGl2ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgY2hpbGQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChjaGlsZCwgcmVzT2JqZWN0LnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBUeXBlZGVmKSB7DQotICAgICAgICAgICAgVHlwZWRlZiB0eXBlZGVmID0gKFR5cGVkZWYpIGRhdGFUeXBlOw0KLSAgICAgICAgICAgIEFsaWFzVmFsdWUgYWxpYXNWYWx1ZSA9IChBbGlhc1ZhbHVlKSByZXNPYmplY3Q7DQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBnZXROYW1lU3BhY2VGb3JUeXBlKGZhYywgc2VydmljZSwgdHlwZWRlZik7DQotICAgICAgICAgICAgT01FbGVtZW50IGl0ZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KEFSUkFZX0lURU0sIG5zLCBjaGlsZCk7DQotICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKGl0ZW0sIGNoaWxkLCBhbGlhc1ZhbHVlLmdldFZhbHVlKCksIHR5cGVkZWYuZ2V0RGF0YVR5cGUoKSwgZmFjLCBucywgcXVhbGlmaWVkLCBzZXJ2aWNlKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSB7DQotICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IChBYnN0cmFjdENvbGxlY3Rpb25UeXBlKSBkYXRhVHlwZTsNCi0gICAgICAgICAgICBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZSBjb2xsZWN0aW9uVmFsdWUgPSAoQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWUpIHJlc09iamVjdDsNCi0gICAgICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSBjb2xsZWN0aW9uVmFsdWUuZ2V0VmFsdWVzKCk7DQotICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7DQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvdXRlciA9IGJvZHlDb250ZW50Ow0KLSAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuZ2V0RGF0YVR5cGUoKSBpbnN0YW5jZW9mIEFic3RyYWN0Q29sbGVjdGlvblR5cGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIG91dGVyID0gY2hpbGQ7DQotICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFSUkFZX0lURU0sIGRlZmF1bHROUyk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBUlJBWV9JVEVNLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG91dGVyLmFkZENoaWxkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UoY2hpbGQsIG91dGVyLCB2YWx1ZXNbaV0sIGNvbGxlY3Rpb25UeXBlLmdldERhdGFUeXBlKCksIGZhYywgZGVmYXVsdE5TLCBxdWFsaWZpZWQsIHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICBpZiAoaSA8IChsZW5ndGggLTEpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAocXVhbGlmaWVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFSUkFZX0lURU0sIGRlZmF1bHROUyk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBUlJBWV9JVEVNLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50LmFkZENoaWxkKGNoaWxkKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBWYWx1ZVR5cGUgfHwgZGF0YVR5cGUgaW5zdGFuY2VvZiBTdHJ1Y3QpIHsNCi0gICAgICAgICAgICBBYnN0cmFjdFZhbHVlIHJlc1ZhbHVlID0gKEFic3RyYWN0VmFsdWUpIHJlc09iamVjdDsNCi0gICAgICAgICAgICBNZW1iZXJbXSBtZW1iZXJzID0gcmVzVmFsdWUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgIE9iamVjdFtdIG1lbWJlclZhbHVlcyA9IHJlc1ZhbHVlLmdldE1lbWJlclZhbHVlcygpOw0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZ2V0TmFtZVNwYWNlRm9yVHlwZShmYWMsIHNlcnZpY2UsIChDb21wb3NpdGVEYXRhVHlwZSkgZGF0YVR5cGUpOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVyVmFsdWVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZW1iZXJFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChtZW1iZXJzW2ldLmdldE5hbWUoKSwgbnMpOw0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UobWVtYmVyRWxlbWVudCwgYm9keUNvbnRlbnQsIG1lbWJlclZhbHVlc1tpXSwgbWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpLCBmYWMsIG5zLCBxdWFsaWZpZWQsIHNlcnZpY2UpOw0KLSAgICAgICAgICAgICAgICBjaGlsZC5hZGRDaGlsZChtZW1iZXJFbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlIGluc3RhbmNlb2YgVW5pb25UeXBlKSB7DQotICAgICAgICAgICAgVW5pb25WYWx1ZSB1bmlvblZhbHVlID0gKFVuaW9uVmFsdWUpIHJlc09iamVjdDsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgdW5NZW1iZXI7DQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBnZXROYW1lU3BhY2VGb3JUeXBlKGZhYywgc2VydmljZSwgKENvbXBvc2l0ZURhdGFUeXBlKSBkYXRhVHlwZSk7DQotICAgICAgICAgICAgaWYgKHF1YWxpZmllZCkgew0KLSAgICAgICAgICAgICAgICB1bk1lbWJlciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQodW5pb25WYWx1ZS5nZXRNZW1iZXJOYW1lKCksIG5zKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB1bk1lbWJlciA9IGZhYy5jcmVhdGVPTUVsZW1lbnQodW5pb25WYWx1ZS5nZXRNZW1iZXJOYW1lKCksIG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UodW5NZW1iZXIsIGNoaWxkLCB1bmlvblZhbHVlLmdldE1lbWJlclZhbHVlKCksIHVuaW9uVmFsdWUuZ2V0TWVtYmVyVHlwZSgpLCBmYWMsIG5zLCBxdWFsaWZpZWQsIHNlcnZpY2UpOw0KLSAgICAgICAgICAgIGNoaWxkLmFkZENoaWxkKHVuTWVtYmVyKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgaW5zdGFuY2VvZiBFbnVtVHlwZSkgew0KLSAgICAgICAgICAgIEVudW1WYWx1ZSBlbnVtVmFsdWUgPSAoRW51bVZhbHVlKSByZXNPYmplY3Q7DQotICAgICAgICAgICAgY2hpbGQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChjaGlsZCwgZW51bVZhbHVlLmdldFZhbHVlQXNTdHJpbmcoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIE9NTmFtZXNwYWNlIGdldE5hbWVTcGFjZUZvclR5cGUoU09BUEZhY3RvcnkgZmFjLCBBeGlzU2VydmljZSBzZXJ2aWNlLCBDb21wb3NpdGVEYXRhVHlwZSBkYXRhVHlwZSkgew0KLSAgICAgICAgVHlwZVRhYmxlIHR5cGVUYWJsZSA9IHNlcnZpY2UuZ2V0VHlwZVRhYmxlKCk7DQotICAgICAgICBTdHJpbmcgZnVsbG5hbWUgPSAoZGF0YVR5cGUuZ2V0TW9kdWxlKCkhPW51bGwpID8gZGF0YVR5cGUuZ2V0TW9kdWxlKCkgKyBkYXRhVHlwZS5nZXROYW1lKCkgOiBkYXRhVHlwZS5nZXROYW1lKCk7DQotICAgICAgICBmdWxsbmFtZSA9IGZ1bGxuYW1lLnJlcGxhY2VBbGwoQ29tcG9zaXRlRGF0YVR5cGUuTU9EVUxFX1NFUEVSQVRPUiwgIi4iKTsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gdHlwZVRhYmxlLmdldFFOYW1lZm9ydGhlVHlwZShmdWxsbmFtZSk7DQotICAgICAgICBpZiAocW5hbWU9PW51bGwpDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICByZXR1cm4gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRQcmVmaXgoKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShEYXRhVHlwZSB0eXBlKXsNCi0gICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ29tcG9zaXRlRGF0YVR5cGUpIHsNCi0gICAgICAgICAgICBDb21wb3NpdGVEYXRhVHlwZSBjb21wb3NpdGVUeXBlID0gKENvbXBvc2l0ZURhdGFUeXBlKSB0eXBlOw0KLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGUgPSBjb21wb3NpdGVUeXBlLmdldE1vZHVsZSgpOw0KLSAgICAgICAgICAgIG1vZHVsZSA9IChtb2R1bGUgPT0gbnVsbCkgPyAiIiA6IG1vZHVsZS5yZXBsYWNlQWxsKCI6OiIsICIuIik7DQotICAgICAgICAgICAgcmV0dXJuICBtb2R1bGUgKyBjb21wb3NpdGVUeXBlLmdldE5hbWUoKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFByaW1pdGl2ZURhdGFUeXBlKSB7DQotICAgICAgICAgICAgUHJpbWl0aXZlRGF0YVR5cGUgcHJpbWl0aXZlRGF0YVR5cGUgPSAoUHJpbWl0aXZlRGF0YVR5cGUpIHR5cGU7DQotICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZURhdGFUeXBlLmdldFR5cGVOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0VmFsdWUoQW55IGFyZywgRGF0YVR5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICBzd2l0Y2godHlwZS5nZXRUeXBlQ29kZSgpLmtpbmQoKS52YWx1ZSgpKSB7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2xvbmc6IGFyZy5pbnNlcnRfbG9uZygoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nOiBhcmcuaW5zZXJ0X3Vsb25nKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZ2xvbmc6IGFyZy5pbnNlcnRfbG9uZ2xvbmcoKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdWxvbmdsb25nOiBhcmcuaW5zZXJ0X3Vsb25nbG9uZygoKExvbmcpIHZhbHVlKS5sb25nVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zaG9ydDogYXJnLmluc2VydF9zaG9ydCgoKFNob3J0KSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3VzaG9ydDogYXJnLmluc2VydF91c2hvcnQoKChTaG9ydCkgdmFsdWUpLnNob3J0VmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19mbG9hdDogYXJnLmluc2VydF9mbG9hdCgoKEZsb2F0KSB2YWx1ZSkuZmxvYXRWYWx1ZSgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZTogYXJnLmluc2VydF9kb3VibGUoKChEb3VibGUpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfY2hhcjogYXJnLmluc2VydF9jaGFyKCgoQ2hhcmFjdGVyKSB2YWx1ZSkuY2hhclZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6IGFyZy5pbnNlcnRfd2NoYXIoKChDaGFyYWN0ZXIpIHZhbHVlKS5jaGFyVmFsdWUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19ib29sZWFuOiBhcmcuaW5zZXJ0X2Jvb2xlYW4oKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQ6IGFyZy5pbnNlcnRfb2N0ZXQoKChCeXRlKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc3RyaW5nOiBhcmcuaW5zZXJ0X3N0cmluZygoU3RyaW5nKSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a193c3RyaW5nOiBhcmcuaW5zZXJ0X3dzdHJpbmcoKFN0cmluZykgdmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYW55OiBhcmcuaW5zZXJ0X2FueSgoQW55KSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a192YWx1ZTogYXJnLmluc2VydF9WYWx1ZSgoU2VyaWFsaXphYmxlKSB2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vYmpyZWY6IGFyZy5pbnNlcnRfT2JqZWN0KChvcmcub21nLkNPUkJBLk9iamVjdCkgdmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc3RydWN0Og0KLSAgICAgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdHJ1Y3RWYWx1ZSA9IChTdHJ1Y3RWYWx1ZSkgdmFsdWU7DQotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBhcmcuY3JlYXRlX291dHB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgYXJnLnR5cGUoc3RydWN0VmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIHN0cnVjdFZhbHVlLndyaXRlKG91dHB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIGFyZy5yZWFkX3ZhbHVlKG91dHB1dFN0cmVhbS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCBzdHJ1Y3RWYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2VudW06DQotICAgICAgICAgICAgICAgIEVudW1WYWx1ZSBlbnVtVmFsdWUgPSAoRW51bVZhbHVlKSB2YWx1ZTsNCi0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSkgYXJnLmNyZWF0ZV9vdXRwdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGFyZy50eXBlKGVudW1WYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgZW51bVZhbHVlLndyaXRlKG91dHB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIGFyZy5yZWFkX3ZhbHVlKG91dHB1dFN0cmVhbS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCBlbnVtVmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25WYWx1ZSB1bmlvblZhbHVlID0gKFVuaW9uVmFsdWUpIHZhbHVlOw0KLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBhcmcuY3JlYXRlX291dHB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgYXJnLnR5cGUodW5pb25WYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgdW5pb25WYWx1ZS53cml0ZShvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICBhcmcucmVhZF92YWx1ZShvdXRwdXRTdHJlYW0uY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdW5pb25WYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FsaWFzOg0KLSAgICAgICAgICAgICAgICBBbGlhc1ZhbHVlIGFsaWFzVmFsdWUgPSAoQWxpYXNWYWx1ZSkgdmFsdWU7DQotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5PdXRwdXRTdHJlYW0pIGFyZy5jcmVhdGVfb3V0cHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBhcmcudHlwZShhbGlhc1ZhbHVlLmdldFR5cGVDb2RlKCkpOw0KLSAgICAgICAgICAgICAgICBhbGlhc1ZhbHVlLndyaXRlKG91dHB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIGFyZy5yZWFkX3ZhbHVlKG91dHB1dFN0cmVhbS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCBhbGlhc1ZhbHVlLmdldFR5cGVDb2RlKCkpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2VxdWVuY2U6DQotICAgICAgICAgICAgICAgIFNlcXVlbmNlVmFsdWUgc2VxdWVuY2VWYWx1ZSA9IChTZXF1ZW5jZVZhbHVlKSB2YWx1ZTsNCi0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSkgYXJnLmNyZWF0ZV9vdXRwdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGFyZy50eXBlKHNlcXVlbmNlVmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIHNlcXVlbmNlVmFsdWUud3JpdGUob3V0cHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgYXJnLnJlYWRfdmFsdWUob3V0cHV0U3RyZWFtLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHNlcXVlbmNlVmFsdWUuZ2V0VHlwZUNvZGUoKSk7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19hcnJheToNCi0gICAgICAgICAgICAgICAgQXJyYXlWYWx1ZSBhcnJheVZhbHVlID0gKEFycmF5VmFsdWUpIHZhbHVlOw0KLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSBhcmcuY3JlYXRlX291dHB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgYXJnLnR5cGUoYXJyYXlWYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYXJyYXlWYWx1ZS53cml0ZShvdXRwdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICBhcmcucmVhZF92YWx1ZShvdXRwdXRTdHJlYW0uY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgYXJyYXlWYWx1ZS5nZXRUeXBlQ29kZSgpKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFUlJPUiEgSW52YWxpZCBkYXRhVHlwZSIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBleHRyYWN0VmFsdWUoRGF0YVR5cGUgcmV0dXJuVHlwZSwgQW55IHJldHVybmVkKSB7DQotICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOw0KLSAgICAgICAgVHlwZUNvZGUgdHlwZUNvZGUgPSByZXR1cm5UeXBlLmdldFR5cGVDb2RlKCk7DQotICAgICAgICBzd2l0Y2godHlwZUNvZGUua2luZCgpLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdm9pZDogcmV0dXJuVmFsdWUgPSBudWxsOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZzogcmV0dXJuVmFsdWUgPSBuZXcgSW50ZWdlcihyZXR1cm5lZC5leHRyYWN0X2xvbmcoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZzogcmV0dXJuVmFsdWUgPSBuZXcgSW50ZWdlcihyZXR1cm5lZC5leHRyYWN0X3Vsb25nKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZ2xvbmc6IHJldHVyblZhbHVlID0gbmV3IExvbmcocmV0dXJuZWQuZXh0cmFjdF9sb25nbG9uZygpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Vsb25nbG9uZzogcmV0dXJuVmFsdWUgPSBuZXcgTG9uZyhyZXR1cm5lZC5leHRyYWN0X3Vsb25nbG9uZygpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3Nob3J0OiByZXR1cm5WYWx1ZSA9IG5ldyBTaG9ydChyZXR1cm5lZC5leHRyYWN0X3Nob3J0KCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdXNob3J0OiByZXR1cm5WYWx1ZSA9IG5ldyBTaG9ydChyZXR1cm5lZC5leHRyYWN0X3VzaG9ydCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0OiByZXR1cm5WYWx1ZSA9IG5ldyBGbG9hdChyZXR1cm5lZC5leHRyYWN0X2Zsb2F0KCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZG91YmxlOiByZXR1cm5WYWx1ZSA9IG5ldyBEb3VibGUocmV0dXJuZWQuZXh0cmFjdF9kb3VibGUoKSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19jaGFyOiByZXR1cm5WYWx1ZSA9IG5ldyBDaGFyYWN0ZXIocmV0dXJuZWQuZXh0cmFjdF9jaGFyKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXI6IHJldHVyblZhbHVlID0gbmV3IENoYXJhY3RlcihyZXR1cm5lZC5leHRyYWN0X3djaGFyKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYm9vbGVhbjogcmV0dXJuVmFsdWUgPSBCb29sZWFuLnZhbHVlT2YocmV0dXJuZWQuZXh0cmFjdF9ib29sZWFuKCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQ6IHJldHVyblZhbHVlID0gbmV3IEJ5dGUocmV0dXJuZWQuZXh0cmFjdF9vY3RldCgpKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3N0cmluZzogcmV0dXJuVmFsdWUgPSByZXR1cm5lZC5leHRyYWN0X3N0cmluZygpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd3N0cmluZzogcmV0dXJuVmFsdWUgPSByZXR1cm5lZC5leHRyYWN0X3dzdHJpbmcoKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FueTogcmV0dXJuVmFsdWUgPSByZXR1cm5lZC5leHRyYWN0X2FueSgpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWU6IHJldHVyblZhbHVlID0gcmV0dXJuZWQuZXh0cmFjdF9WYWx1ZSgpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2JqcmVmOiByZXR1cm5WYWx1ZSA9IHJldHVybmVkLmV4dHJhY3RfT2JqZWN0KCk7IGJyZWFrOw0KLSAgICAgICAgICAgIC8vY2FzZSBUQ0tpbmQuX3RrX2xvbmdkb3VibGUgOg0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJ1Y3Q6DQotICAgICAgICAgICAgICAgIFN0cnVjdCBzdHJ1Y3QgPSAoU3RydWN0KSByZXR1cm5UeXBlOw0KLSAgICAgICAgICAgICAgICBTdHJ1Y3RWYWx1ZSBzdHJ1Y3RWYWx1ZSA9IG5ldyBTdHJ1Y3RWYWx1ZShzdHJ1Y3QpOw0KLSAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgcmV0dXJuZWQuY3JlYXRlX2lucHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBzdHJ1Y3RWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzdHJ1Y3RWYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2V4Y2VwdDoNCi0gICAgICAgICAgICAgICAgRXhjZXB0aW9uVHlwZSBleGNlcHRpb25UeXBlID0gKEV4Y2VwdGlvblR5cGUpIHJldHVyblR5cGU7DQotICAgICAgICAgICAgICAgIEV4Y2VwdGlvblZhbHVlIGV4Y2VwdGlvblZhbHVlID0gbmV3IEV4Y2VwdGlvblZhbHVlKGV4Y2VwdGlvblR5cGUpOw0KLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgcmV0dXJuZWQuY3JlYXRlX2lucHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBleGNlcHRpb25WYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBleGNlcHRpb25WYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2VudW06DQotICAgICAgICAgICAgICAgIEVudW1UeXBlIGVudW1UeXBlID0gKEVudW1UeXBlKSByZXR1cm5UeXBlOw0KLSAgICAgICAgICAgICAgICBFbnVtVmFsdWUgZW51bVZhbHVlID0gbmV3IEVudW1WYWx1ZShlbnVtVHlwZSk7DQotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtKSByZXR1cm5lZC5jcmVhdGVfaW5wdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIGVudW1WYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBlbnVtVmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25UeXBlIHVuaW9uVHlwZSA9IChVbmlvblR5cGUpIHJldHVyblR5cGU7DQotICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtKSByZXR1cm5lZC5jcmVhdGVfaW5wdXRfc3RyZWFtKCk7DQotICAgICAgICAgICAgICAgIFVuaW9uVmFsdWUgdW5pb25WYWx1ZSA9IG5ldyBVbmlvblZhbHVlKHVuaW9uVHlwZSk7DQotICAgICAgICAgICAgICAgIHVuaW9uVmFsdWUucmVhZChpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gdW5pb25WYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FsaWFzOg0KLSAgICAgICAgICAgICAgICBUeXBlZGVmIHR5cGVkZWYgPSAoVHlwZWRlZikgcmV0dXJuVHlwZTsNCi0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW0pIHJldHVybmVkLmNyZWF0ZV9pbnB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgQWxpYXNWYWx1ZSBhbGlhc1ZhbHVlID0gbmV3IEFsaWFzVmFsdWUodHlwZWRlZik7DQotICAgICAgICAgICAgICAgIGFsaWFzVmFsdWUucmVhZChpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gYWxpYXNWYWx1ZTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3NlcXVlbmNlOg0KLSAgICAgICAgICAgICAgICBTZXF1ZW5jZVR5cGUgc2VxdWVuY2VUeXBlID0gKFNlcXVlbmNlVHlwZSkgcmV0dXJuVHlwZTsNCi0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW0pIHJldHVybmVkLmNyZWF0ZV9pbnB1dF9zdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgU2VxdWVuY2VWYWx1ZSBzZXF1ZW5jZVZhbHVlID0gbmV3IFNlcXVlbmNlVmFsdWUoc2VxdWVuY2VUeXBlKTsNCi0gICAgICAgICAgICAgICAgc2VxdWVuY2VWYWx1ZS5yZWFkKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBzZXF1ZW5jZVZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYXJyYXk6DQotICAgICAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSByZXR1cm5UeXBlOw0KLSAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSkgcmV0dXJuZWQuY3JlYXRlX2lucHV0X3N0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBBcnJheVZhbHVlIGFycmF5VmFsdWUgPSBuZXcgQXJyYXlWYWx1ZShhcnJheVR5cGUpOw0KLSAgICAgICAgICAgICAgICBhcnJheVZhbHVlLnJlYWQoaW5wdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGFycmF5VmFsdWU7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRVJST1IhIEludmFsaWQgZGF0YVR5cGUiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2VWYWx1ZShEYXRhVHlwZSB0eXBlLCBTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7DQotICAgICAgICBPYmplY3QgcmV0ID0gbnVsbDsNCi0gICAgICAgIHN3aXRjaCh0eXBlLmdldFR5cGVDb2RlKCkua2luZCgpLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZyA6IHJldCA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZyA6IHJldCA9IEludGVnZXIudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZyA6IHJldCA9IExvbmcudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZ2xvbmcgOiByZXQgPSBMb25nLnZhbHVlT2YodmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2hvcnQgOiByZXQgPSBTaG9ydC52YWx1ZU9mKHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3VzaG9ydCA6IHJldCA9IFNob3J0LnZhbHVlT2YodmFsdWUpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZmxvYXQgOiByZXQgPSBGbG9hdC52YWx1ZU9mKHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2RvdWJsZSA6IHJldCA9IERvdWJsZS52YWx1ZU9mKHZhbHVlKTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXIgOiByZXQgPSBDaGFyYWN0ZXIudmFsdWVPZih2YWx1ZS5jaGFyQXQoMCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd2NoYXIgOiByZXQgPSBDaGFyYWN0ZXIudmFsdWVPZih2YWx1ZS5jaGFyQXQoMCkpOyBicmVhazsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYm9vbGVhbiA6IHJldCA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19vY3RldCA6IHJldCA9IEJ5dGUudmFsdWVPZih2YWx1ZSk7IGJyZWFrOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJpbmcgOiByZXQgPSB2YWx1ZTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3dzdHJpbmcgOiByZXQgPSB2YWx1ZTsgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2VudW0gOg0KLSAgICAgICAgICAgICAgICBFbnVtVHlwZSBlbnVtVHlwZSA9IChFbnVtVHlwZSkgdHlwZTsNCi0gICAgICAgICAgICAgICAgRW51bVZhbHVlIGVudW1WYWx1ZSA9IG5ldyBFbnVtVmFsdWUoZW51bVR5cGUpOw0KLSAgICAgICAgICAgICAgICBpbnQgaSA9IGVudW1UeXBlLmdldEVudW1NZW1iZXJzKCkuaW5kZXhPZih2YWx1ZSk7DQotICAgICAgICAgICAgICAgIGVudW1WYWx1ZS5zZXRWYWx1ZShpKTsNCi0gICAgICAgICAgICAgICAgcmV0ID0gZW51bVZhbHVlOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJldDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRFbXB0eVZhbHVlKERhdGFUeXBlIHR5cGUpIHsNCi0gICAgICAgIHN3aXRjaCh0eXBlLmdldFR5cGVDb2RlKCkua2luZCgpLnZhbHVlKCkpIHsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfbG9uZzogcmV0dXJuIG5ldyBJbnRlZ2VyKDApOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZzogcmV0dXJuIG5ldyBJbnRlZ2VyKDApOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19sb25nbG9uZzogcmV0dXJuIG5ldyBMb25nKDApOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bG9uZ2xvbmc6IHJldHVybiBuZXcgTG9uZygwKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2hvcnQ6IHJldHVybiBuZXcgU2hvcnQoIjAiKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdXNob3J0OiByZXR1cm4gbmV3IFNob3J0KCIwIik7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2Zsb2F0OiByZXR1cm4gbmV3IEZsb2F0KDBmKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfZG91YmxlOiByZXR1cm4gbmV3IERvdWJsZSgwZCk7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2NoYXI6IHJldHVybiBuZXcgQ2hhcmFjdGVyKCcwJyk7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX3djaGFyOiByZXR1cm4gbmV3IENoYXJhY3RlcignMCcpOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19ib29sZWFuOiByZXR1cm4gQm9vbGVhbi5GQUxTRTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfb2N0ZXQ6IHJldHVybiBuZXcgQnl0ZSgiMCIpOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19zdHJpbmc6IHJldHVybiAiIjsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfd3N0cmluZzogcmV0dXJuICIiOw0KLSAgICAgICAgICAgIC8vY2FzZSBUQ0tpbmQuX3RrX2FueTogcmV0dXJuIG5ldyBBbnkoKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfdmFsdWU6IHJldHVybiAiIjsNCi0gICAgICAgICAgICAvL2Nhc2UgVENLaW5kLl90a19vYmpyZWY6IHJldHVybiBuZXcgb3JnLm9tZy5DT1JCQS5PYmplY3QoKTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc3RydWN0Og0KLSAgICAgICAgICAgICAgICBTdHJ1Y3Qgc3RydWN0ID0gKFN0cnVjdCkgdHlwZTsNCi0gICAgICAgICAgICAgICAgU3RydWN0VmFsdWUgdmFsdWUgPSBuZXcgU3RydWN0VmFsdWUoc3RydWN0KTsNCi0gICAgICAgICAgICAgICAgTWVtYmVyW10gbWVtYmVycyA9IHN0cnVjdC5nZXRNZW1iZXJzKCk7DQotICAgICAgICAgICAgICAgIE9iamVjdFtdIG1lbWJlclZhbHVlcyA9IG5ldyBPYmplY3RbbWVtYmVycy5sZW5ndGhdOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlc1tpXSA9IGdldEVtcHR5VmFsdWUobWVtYmVyc1tpXS5nZXREYXRhVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB2YWx1ZS5zZXRNZW1iZXJWYWx1ZXMobWVtYmVyVmFsdWVzKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a19lbnVtOiByZXR1cm4gbmV3IEVudW1WYWx1ZSgoRW51bVR5cGUpIHR5cGUpOw0KLSAgICAgICAgICAgIGNhc2UgVENLaW5kLl90a191bmlvbjoNCi0gICAgICAgICAgICAgICAgVW5pb25UeXBlIHVuaW9uVHlwZSA9IChVbmlvblR5cGUpIHR5cGU7DQotICAgICAgICAgICAgICAgIFVuaW9uVmFsdWUgdW5pb25WYWx1ZSA9IG5ldyBVbmlvblZhbHVlKHVuaW9uVHlwZSk7DQotICAgICAgICAgICAgICAgIG1lbWJlcnMgPSB1bmlvblR5cGUuZ2V0TWVtYmVycygpOw0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnNldE1lbWJlck5hbWUobWVtYmVyc1swXS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB1bmlvblZhbHVlLnNldE1lbWJlclR5cGUobWVtYmVyc1swXS5nZXREYXRhVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgdW5pb25WYWx1ZS5zZXRNZW1iZXJWYWx1ZShnZXRFbXB0eVZhbHVlKG1lbWJlcnNbMF0uZ2V0RGF0YVR5cGUoKSkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdW5pb25WYWx1ZTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfYWxpYXM6DQotICAgICAgICAgICAgICAgIFR5cGVkZWYgdHlwZWRlZiA9IChUeXBlZGVmKSB0eXBlOw0KLSAgICAgICAgICAgICAgICBBbGlhc1ZhbHVlIGFsaWFzVmFsdWUgPSBuZXcgQWxpYXNWYWx1ZSh0eXBlZGVmKTsNCi0gICAgICAgICAgICAgICAgYWxpYXNWYWx1ZS5zZXRWYWx1ZShnZXRFbXB0eVZhbHVlKHR5cGVkZWYuZ2V0RGF0YVR5cGUoKSkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gYWxpYXNWYWx1ZTsNCi0gICAgICAgICAgICBjYXNlIFRDS2luZC5fdGtfc2VxdWVuY2U6DQotICAgICAgICAgICAgICAgIFNlcXVlbmNlVHlwZSBzZXF1ZW5jZVR5cGUgPSAoU2VxdWVuY2VUeXBlKSB0eXBlOw0KLSAgICAgICAgICAgICAgICBTZXF1ZW5jZVZhbHVlIHNlcXVlbmNlVmFsdWUgPSBuZXcgU2VxdWVuY2VWYWx1ZShzZXF1ZW5jZVR5cGUpOw0KLSAgICAgICAgICAgICAgICBzZXF1ZW5jZVZhbHVlLnNldFZhbHVlcyhuZXcgT2JqZWN0WzBdKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlVmFsdWU7DQotICAgICAgICAgICAgY2FzZSBUQ0tpbmQuX3RrX2FycmF5Og0KLSAgICAgICAgICAgICAgICBBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSkgdHlwZTsNCi0gICAgICAgICAgICAgICAgQXJyYXlWYWx1ZSBhcnJheVZhbHVlID0gbmV3IEFycmF5VmFsdWUoYXJyYXlUeXBlKTsNCi0gICAgICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbYXJyYXlUeXBlLmdldEVsZW1lbnRDb3VudCgpXTsNCi0gICAgICAgICAgICAgICAgRGF0YVR5cGUgYXJyYXlEYXRhVHlwZSA9IGFycmF5VHlwZS5nZXREYXRhVHlwZSgpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdHNbaV0gPSBnZXRFbXB0eVZhbHVlKGFycmF5RGF0YVR5cGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFycmF5VmFsdWUuc2V0VmFsdWVzKG9iamVjdHMpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlWYWx1ZTsNCi0gICAgICAgICAgICBkZWZhdWx0Og0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SISBJbnZhbGlkIGRhdGFUeXBlIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvSW52b2tlci5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0ludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwMGYxOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9jb3JiYS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb3JiYS9yZWNlaXZlcnMvSW52b2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5yZWNlaXZlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuZXhjZXB0aW9ucy5Db3JiYUludm9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29yYmEuaWRsLnR5cGVzLkRhdGFUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLmlkbC50eXBlcy5NZW1iZXI7DQotDQotcHVibGljIGludGVyZmFjZSBJbnZva2VyIHsNCi0JcHVibGljIE9iamVjdCBpbnZva2UoKSB0aHJvd3MgQ29yYmFJbnZvY2F0aW9uRXhjZXB0aW9uOw0KLQlwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKTsNCi0JcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCk7DQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoT2JqZWN0W10gcGFyYW1ldGVycyk7DQotICAgIHB1YmxpYyBEYXRhVHlwZSBnZXRSZXR1cm5UeXBlKCk7DQotICAgIHB1YmxpYyBNZW1iZXJbXSBnZXRQYXJhbWV0ZXJNZW1iZXJzKCk7DQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRPdXRQYXJhbWV0ZXJWYWx1ZXNzKCk7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2NvcmJhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvcmJhL3JlY2VpdmVycy9JbnZva2VyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0ludm9rZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGQ0YTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvY29yYmEvc3JjL29yZy9hcGFjaGUvYXhpczIvY29yYmEvcmVjZWl2ZXJzL0ludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvcmJhLnJlY2VpdmVyczsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb3JiYS5leGNlcHRpb25zLkNvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEludm9rZXJGYWN0b3J5IHsNCi0JcHVibGljIEludm9rZXIgbmV3SW52b2tlcihTdHJpbmcgaW50ZXJmYWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUsIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iamVjdCkgdGhyb3dzIENvcmJhSW52b2NhdGlvbkV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9kaXN0cmlidXRpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM0MzI4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kaXN0cmlidXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0Ci0gICAgICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmRpc3RyaWJ1dGlvbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBEaXN0cmlidXRpb248L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFwYWNoZSBBeGlzMiBEaXN0cmlidXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGRvY3MuZm9sZGVyLnZlcnNpb24+MV81PC9kb2NzLmZvbGRlci52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXhtbGJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamlieDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWpzb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zcHJpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zb2FwbW9uaXRvci1zZXJ2bGV0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItZmFzdGluZm9zZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXhicmk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1ldGFkYXRhPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY2x1c3RlcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNhYWo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hbnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29yYmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tdG9tcG9saWN5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c29hcG1vbml0b3I8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZGRyZXNzaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwb20udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNjcmlwdGluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cG9tLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm10b21wb2xpY3k8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnZlcnNpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3BvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPmFhcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBBeGlzMiBoYXMgYWx3YXlzIGJlZW4gc2hpcHBlZCB3aXRoIFN1bidzIGltcGxlbWVudGF0aW9ucyBvZgotICAgICAgICAgICAgIEphdmFNYWlsIGFuZCBKQUYsIGFsdGhvdWdoIEF4aW9tIGRlcGVuZHMgb24gKGFuZCBoYXMgYmVlbiB0ZXN0ZWQKLSAgICAgICAgICAgICB3aXRoKSBHZXJvbmltbydzIGltcGxlbWVudGF0aW9ucy4gVGhpcyBzaG91bGQgcHJvYmFibHkgcmVldmFsdWF0ZWQuIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4Lm1haWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYWlsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtqYXZheC5tYWlsLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8IS0tIEphbG9weSBpcyB1c2VkIGJ5IHRoZSBQcmV0dHlQcmludGVyIGNsYXNzIGluIHRoZSBrZXJuZWwsCi0gICAgICAgICAgICAgYnV0IGl0IGlzIGludm9rZWQgdXNpbmcgcmVmbGVjdGlvbiAoYW5kIG9ubHkgaWYgaXQgaXMKLSAgICAgICAgICAgICBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoKS4gVGhlcmVmb3JlIGl0IGlzIG5vdCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgYWRkZWQgYXMgYSB0cmFuc2l0aXZlIGRlcGVuZGVuY3kuIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphbG9weTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmphbG9weTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBOb25lIG9mIHRoZSBBeGlzMiBhcnRpZmFjdHMgc2hvdWxkIGhhdmUgYSBkZXBlbmRlbmN5IG9uIGxvZzRqCi0gICAgICAgICAgICAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGltcG9zZSBhIHBhcnRpY3VsYXIgbG9nZ2luZyBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgIG9uIG91ciB1c2Vycy4gSG93ZXZlciwgZm9yIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uLCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgY2hvb3NlIG9uZS4gLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPCEtLSBUaGlzIGlzIG5lZWRlZCB0byBidWlsZCB0aGUgV0FSIGRpc3RyaWJ1dGlvbiAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItd2ViYXBwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9kaXN0cmlidXRpb248L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ21hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdtYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGltZXN0YW1wPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5leGVjdXRlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuRGF0ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnByb3BlcnRpZXNbJ2J1aWxkVGltZXN0YW1wJ10gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiezAsZGF0ZSxkZC1NTS15eXl5fSIsIG5ldyBEYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNyZWF0ZS1yZXBvc2l0b3J5PC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdG1wLXJlcG9zaXRvcnk8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2VuZXJhdGVGaWxlTGlzdHM+dHJ1ZTwvZ2VuZXJhdGVGaWxlTGlzdHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRpc3RyaWJ1dGlvbi1wYWNrYWdlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5heGlzMi0ke3Byb2plY3QudmVyc2lvbn08L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3dhci1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS0gV2UgZG9uJ3Qgd2FudCB0byBkZXBsb3kgdGhlIGRpc3RyaWJ1dGlvbnMgdG8gdGhlIE1hdmVuIHJlcG9zaXRvcnkuCi0gICAgICAgICAgICAgICAgICAgICBSZWFzb25zOgotICAgICAgICAgICAgICAgICAgICAgICogRGVwbG95aW5nIHRoZSBkaXN0cmlidXRpb25zIHdpbGwgaGVhdmlseSBpbmNyZWFzZSB0aGUgc2l6ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCByZWxlYXNlIG9uIHRoZSBNYXZlbiByZXBvcy4KLSAgICAgICAgICAgICAgICAgICAgICAqIFRoZXJlIGlzIGFsc28gdGhlIHJpc2sgdGhhdCB1c2VycyBtYXkgc3RhcnQgZG93bmxvYWRpbmcgdGhlIG5vbi1NYXZlbgotICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZXMgZnJvbSBNYXZlbiByZXBvcyByYXRoZXIgdGhhbiB0aGUgbWlycm9ycy4gLS0+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvYmluLWFzc2VtYmx5LnhtbCBiLzFfNS9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9iaW4tYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxOTk2YzZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9iaW4tYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5PgotICAgIDxpZD5iaW48L2lkPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT50cnVlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4gCi0gICAgPGJhc2VEaXJlY3Rvcnk+YXhpczItJHt2ZXJzaW9ufTwvYmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLSAgICAgICAgPCEtLTxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+ICAvL3VuY29tbWVudCxpZiB0YXIuZ3ogYXJjaGl2ZSBuZWVkZWQtLT4KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8L2Zvcm1hdHM+Ci0KLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDwhLS0qKioqKioqKioqKioqKioqKioqKioqIGNyZWF0aW5nIHRoZSByZXBvc2l0b3J5ICoqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdG1wLXJlcG9zaXRvcnk8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVwb3NpdG9yeTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKiogY3JlYXRpbmcgdGhlIGJpbiAqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgICAgICA8IS0tIENvcHkgYmluIHNjcmlwdHMgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3Rvb2wvc2NyaXB0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmJpbjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPiouYmF0PC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3Rvb2wvc2NyaXB0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmJpbjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPiouc2g8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPGZpbGVNb2RlPjc1NTwvZmlsZU1vZGU+Ci0gICAgICAgIDwvZmlsZVNldD4KLQotICAgICAgICA8IS0tKioqKioqKioqKioqKioqKioqKioqKiBjcmVhdGluZyB0aGUgY29uZiAqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgICAgICA8IS0tIGNvcHkgdGhlIGF4aXMyLnhtbCBpbnRvIGNvbmYgZGlyZWN0b3kgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL2tlcm5lbC9jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPCEtLSoqKioqKioqKioqKioqKioqKioqKiogY3JlYXRpbmcgdGhlIHdlYmFwcHAgKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAgICAgPCEtLSBjb3B5IHRoZSBidWlsZC54bWwgaW50byB3ZWJhcHAgZGlyZWN0b3J5IC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy93ZWJhcHAvc2NyaXB0czwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT53ZWJhcHA8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5idWlsZC54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL2xlZ2FsPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDwhLS0gVE9ETzogTmVlZCB0byByZW5hbWUgdGhpcyBmaWxlIHRvIElOU1RBTEwudHh0IC0tPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5SRUFETUUtc3RkLWJpbi50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+aW5zdGFsbGF0aW9uLXN0ZC1iaW4udHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICAgICAgPC9maWxlU2V0PgotCi0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL2tlcm5lbC9jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmxvZzRqLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+UkVBRE1FLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5yZWxlYXNlLW5vdGVzLmh0bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPCEtLSBjb3B5IHNhbXBsZXMgLS0+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9tb2R1bGVzL3NhbXBsZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c2FtcGxlczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmRhdGFiaW5kaW5nLyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+ZmF1bHRoYW5kbGluZy8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmpheHdzLWNhbGN1bGF0b3IvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5qYXh3cy1hZGRyZXNzYm9vay8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmpheHdzLXNhbXBsZXMvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5qYXZhX2ZpcnN0X2pheHdzLyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+amF4d3MtaW50ZXJvcC8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmpheHdzLWR5bmFtaWMvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5qYXh3cy12ZXJzaW9uLyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+bXRvbS8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvam8vKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5wb2pvZ3VpZGUvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5wb2pvZ3VpZGVzcHJpbmcvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5xdWlja3N0YXJ0LyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+cXVpY2tzdGFydGFkYi8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnF1aWNrc3RhcnRheGlvbS8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnF1aWNrc3RhcnRqaWJ4LyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+cXVpY2tzdGFydHhtbGJlYW5zLyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+c2VydmljZWxpZmVjeWNsZS8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnNvYXB3aXRoYXR0YWNobWVudHMvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT51c2VyZ3VpZGUvKiovKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT52ZXJzaW9uLyoqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+d3NkbC8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnlhaG9vanNvbnNlYXJjaC8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnlhaG9vcmVzdHNlYXJjaC8qKi8qPC9pbmNsdWRlPiAgICAgICAgICAgIAotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmltbDwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotICAgIAotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPio6KjpqYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzOmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzOmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLnNwcmluZ2ZyYW1ld29yazpzcHJpbmctYmVhbnM6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuc3ByaW5nZnJhbWV3b3JrOnNwcmluZy1jb250ZXh0OmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLnNwcmluZ2ZyYW1ld29yazpzcHJpbmctY29yZTpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5zcHJpbmdmcmFtZXdvcms6c3ByaW5nLXdlYjpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYW50OmFudDpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuYW50OmFudC1sYXVuY2hlcjpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmFvcGFsbGlhbmNlOmFvcGFsbGlhbmNlOmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+YnNmOmJzZjpqYXI8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0OkZhc3RJbmZvc2V0OmphcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+cmhpbm86anM6amFyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXdlYmFwcDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+d2ViYXBwPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8dW5wYWNrT3B0aW9ucz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPldFQi1JTkYvY2xhc3Nlcy8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5XRUItSU5GL3dlYi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmF4aXMyLXdlYi8qKi8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3VucGFja09wdGlvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS9kb2MtYXNzZW1ibHkueG1sIGIvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L2RvYy1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTE5ZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L2RvYy1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseT4KLSAgICA8aWQ+ZG9jczwvaWQ+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PiAKLSAgICA8YmFzZURpcmVjdG9yeT5heGlzMi0ke3ZlcnNpb259PC9iYXNlRGlyZWN0b3J5PgotICAgIDxmb3JtYXRzPgotCTwhLS08Zm9ybWF0PnRhci5nejwvZm9ybWF0PiAgLy91bmNvbW1lbnQsaWYgdGFyLmd6IGFyY2hpdmUgbmVlZGVkLS0+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotCi0gICAgPGZpbGVTZXRzPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3RtcC1kb2MtZGlzdHJvL3hkb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvY3MveGRvY3M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4uc3ZuLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vbW9kdWxlcy9kb2N1bWVudGF0aW9uL3RhcmdldC9hcGlkb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRvY3MvamF2YWRvY3M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4uc3ZuLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3RtcC1kb2MtZGlzdHJvL2RvY3M8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZG9jczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFQURNRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+cmVsZWFzZS1ub3Rlcy5odG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3RtcC1kb2MtZGlzdHJvL2RvY3M8L2RpcmVjdG9yeT4KLQkgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLQkgICAgPGluY2x1ZGVzPgotCSAgICAgICA8aW5jbHVkZT5SRUFETUUtZG9jcy50eHQ8L2luY2x1ZGU+Ci0JICAgIDwvaW5jbHVkZXM+Ci0JPC9maWxlU2V0PgotICAgIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy1hc3NlbWJseS54bWwgYi8xXzUvbW9kdWxlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvc3JjLWFzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTlkYmQ4Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kaXN0cmlidXRpb24vc3JjL21haW4vYXNzZW1ibHkvc3JjLWFzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseT4KLSAgICA8aWQ+c3JjPC9pZD4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+IAotICAgIDxiYXNlRGlyZWN0b3J5PmF4aXMyLSR7dmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDwhLS08Zm9ybWF0PnRhci5nejwvZm9ybWF0PiAgLy91bmNvbW1lbnQsaWYgdGFyLmd6IGFyY2hpdmUgbmVlZGVkLS0+Ci0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotCi0gICAgPGZpbGVTZXRzPgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5wb20ueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmV0Yy8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5tb2R1bGVzLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPmxlZ2FsLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnJlbGVhc2UtZG9jcy8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFQURNRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+cmVsZWFzZS1ub3Rlcy5odG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPnNyYy8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8IS0tIEV4Y2x1ZGUgc291cmNlcyBmb3IgbW9kdWxlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYnVpbGQgLS0+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+bW9kdWxlcy9ybWkvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPCEtLSBGb3IgUERFIHN1cHBvcnQsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc29tZSBmaWxlcyBvdXRzaWRlIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IGRpcmVjdG9yeS4gVGhleSBhcmUgcmVtb3ZlZCBkdXJpbmcgdGhlIGNsZWFuIHBoYXNlLCBidXQKLSAgICAgICAgICAgICAgICAgICAgIHdlIGFsc28gbmVlZCB0byBleGNsdWRlIHRoZW0gaGVyZS4gLS0+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+bW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vTUVUQS1JTkYvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+bW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vbGliLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm1vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL01FVEEtSU5GLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm1vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2xpYi8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8IS0tIFRoZXNlIGRpcmVjdG9yaWVzIGFyZSBub3QgZXhjbHVkZWQgYnkgdGhlIHJ1bGVzIGJlbG93IGJlY2F1c2Ugb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAic3JjIiBjb21wb25lbnQgaW4gdGhlIHBhdGguIFdlIG5lZWQgdG8gZXhjbHVkZSB0aGVtIGV4cGxpY2l0bHkuIC0tPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm1vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3RhcmdldC8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS90YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBub3Qgc3VyZSB3aGF0IHRob3NlIGFyZSBmb3IgLS0+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Li4vLi4vbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPi4uLy4uL21vZHVsZXMvc2FtcGxlcy9zZWN1cml0eS8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT54ZG9jcy8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8IS0tIEV4Y2x1c2lvbnMgZnJvbSBvcmcuYXBhY2hlLnJlc291cmNlczphcGFjaGUtc291cmNlLXJlbGVhc2UtYXNzZW1ibHktZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGV5IGFzc3VtZSB0aGF0IGFsbCBzb3VyY2VzIGFyZSBsb2NhdGVkIHVuZGVyIGFuICJzcmMiIGRpcmVjdG9yeS4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHRoZSBjYXNlIGZvciBBeGlzMiwgd2hpY2ggZG9lc24ndCB1c2UgdGhlIHN0YW5kYXJkIE1hdmVuIDIgY29udmVudGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICBUaHVzIHdlIG1heSBzdGlsbCBlbmNvdW50ZXIgc29tZSBpc3N1ZXMgaGVyZS4gLS0+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKS4qJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0uKl08L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP21hdmVuLWVjbGlwc2VcLnhtbF08L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP1wucHJvamVjdF08L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP1wuY2xhc3NwYXRoXTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/W14vXSpcLml3c108L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP1teL10qXC5pcHJdPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9bXi9dKlwuaW1sXTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/XC5zZXR0aW5ncygvLiopP108L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP1wuZXh0ZXJuYWxUb29sQnVpbGRlcnMoLy4qKT9dPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9cLmRlcGxveWFibGVzKC8uKik/XTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/XC53dHBtb2R1bGVzKC8uKik/XTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/ISR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LylbXi9dKy8pKnNyYy8pKC4qLyk/Y29iZXJ0dXJhXC5zZXJdPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEoKD8hJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vKVteL10rLykqc3JjLykoLiovKT9wb21cLnhtbFwucmVsZWFzZUJhY2t1cF08L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+JXJlZ2V4Wyg/ISgoPyEke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8pW14vXSsvKSpzcmMvKSguKi8pP3JlbGVhc2VcLnByb3BlcnRpZXNdPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLQotICAgICAgICA8L2ZpbGVTZXQ+Ci0KLSAgICAgICAgPCEtLSBjb3B5aW5nIHRvb2xzIHNlY3Rpb24gb2YgeGRvY3MuIFRoaXMgaXMgbmVlZGVkIGJ5IGVjbGlwc2UgcGx1Z2lucyAtLT4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uL3hkb2NzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pnhkb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+dG9vbHMvKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPlJFQURNRS1zdGQtc3JjLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2Rpc3RyaWJ1dGlvbi9zcmMvbWFpbi9hc3NlbWJseS93YXItYXNzZW1ibHkueG1sIGIvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L3dhci1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyN2E4MWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L3dhci1hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseT4KLSAgICA8aWQ+d2FyPC9pZD4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItd2ViYXBwPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+YXhpczIud2FyPC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0UudHh0PC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPk5PVElDRS50eHQ8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+UkVBRE1FLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5yZWxlYXNlLW5vdGVzLmh0bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWI3NDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDc3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+ZG9jdW1lbnRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBEb2N1bWVudGF0aW9uPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BcGFjaGUgQXhpczIgRG9jdW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF4d3NfMi4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPkZhc3RJbmZvc2V0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD50cmliZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvbnRleHQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qZXR0aXNvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHRpc29uPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmppYng8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qaWJ4LWJpbmQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamlieDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmppYngtcnVuPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5uZWV0aGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZWV0aGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtzdGF4LmltcGwuZ3JvdXBpZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3N0YXguaW1wbC5hcnRpZmFjdH08L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hbm5vdGF0aW9uXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF4ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPndzZGw0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndzZGw0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueG1sYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxiZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnNmPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amFsb3B5PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFsb3B5PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1pbXBsLWRvbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7d29kZW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLWFwaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLXJlc29sdmVyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLXJlc29sdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4ZG9jRGlyZWN0b3J5PiR7YmFzZWRpcn0veGRvY3M8L3hkb2NEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZXNEaXJlY3Rvcnk+JHtiYXNlZGlyfS94ZG9jcy9yZXNvdXJjZXM8L3Jlc291cmNlc0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+aW5zdGFsbDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2l0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2VydmljZS1tb2R1bGUtbGlzdC1nZW5lcmF0aW9uPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC9zaXRlL0BheGlzMl92ZXJzaW9uX2RpckAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ4ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnBuZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouZ2lmIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qcGciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9hcGlkb2NzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhZG9jIHBhY2thZ2VuYW1lcz0ib3JnLmFwYWNoZS5heGlzMi4qIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9hcGlkb2NzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhtZW1vcnk9IjEyOG0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3d0aXRsZT0iQXhpczIgQVBJIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N0aXRsZT0iQXhpczIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICYjMTY5OyAyMDA3IEFwYWNoZSBXZWIgU2VydmljZXMgUHJvamVjdC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL2tlcm5lbC9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9hZGIvc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvYWRiLWNvZGVnZW4vc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvYWRkcmVzc2luZy9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9jbHVzdGVyaW5nL3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL2NvZGVnZW4vc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL2phdmEyd3NkbC9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9qYXhicmkvc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvamF4d3Mvc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvamlieC9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9qc29uL3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL21ldGFkYXRhL3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL21leC9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9tdG9tcG9saWN5L3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL3Bpbmcvc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvc2Fhai9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9zY3JpcHRpbmcvc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvc29hcG1vbml0b3Ivc3JjIiBkZWZhdWx0ZXhjbHVkZXM9InllcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImphdmF4LyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhY2thZ2VzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFja2FnZXNldCBkaXI9Ii4uLy4uL21vZHVsZXMvc3ByaW5nL3NyYyIgZGVmYXVsdGV4Y2x1ZGVzPSJ5ZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqYXZheC8qKiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYWNrYWdlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhY2thZ2VzZXQgZGlyPSIuLi8uLi9tb2R1bGVzL3dlYmFwcC9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy94bWxiZWFucy9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iLi4vLi4vbW9kdWxlcy9jb3JiYS9zcmMiIGRlZmF1bHRleGNsdWRlcz0ieWVzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyLyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iamF2YXgvKioiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFja2FnZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhZG9jPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cGFja2FnZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3hkb2NzLWNoYW5nZWQvJHtkb2NzLmZvbGRlci52ZXJzaW9ufSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Inhkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlciBmaWx0ZXJzZmlsZT0ieGRvY3MvZHluYW1pYy1sYWJlbHMucHJvcGVydGllcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3hkb2NzLWNoYW5nZWQvJHtkb2NzLmZvbGRlci52ZXJzaW9ufSIgZmlsdGVyaW5nPSJvbiIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnbG9ibWFwcGVyIGZyb209IioueG1sIiB0bz0iKi54bWwiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ieGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3hkb2NzLWNoYW5nZWQiIGZpbHRlcmluZz0ib24iIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z2xvYm1hcHBlciBmcm9tPSIqLnhtbCIgdG89IioueG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Inhkb2NzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJAYXhpczJfdmVyc2lvbl9kaXJALyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5naWYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmpwZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLyoucG5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQveGRvY3MtY2hhbmdlZCIgZmlsdGVyaW5nPSJvZmYiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Inhkb2NzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJAYXhpczJfdmVyc2lvbl9kaXJALyoqIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5naWYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmpwZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucG5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jc3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhzZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY2dpIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wcm9wZXJ0aWVzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnJlbmFtZS1zaXRlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5pbnN0YWxsPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIGZpbHRlcnNmaWxlPSJ4ZG9jcy9keW5hbWljLWxhYmVscy5wcm9wZXJ0aWVzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC9zaXRlMiIgZmlsdGVyaW5nPSJvbiIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdsb2JtYXBwZXIgZnJvbT0iKi5odG1sIiB0bz0iKi5odG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3NpdGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC9zaXRlMiIgZmlsdGVyaW5nPSJvZmYiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3NpdGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKi5odG1sIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvc2l0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9InRhcmdldC9zaXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC9zaXRlIiBmaWx0ZXJpbmc9Im9mZiIgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvc2l0ZTIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvc2l0ZTIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3hkb2NzLWNoYW5nZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5zaXRlLXN0YWdlPC9uYW1lPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4ZG9jRGlyZWN0b3J5PiR7YmFzZWRpcn0veGRvY3M8L3hkb2NEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlc0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3hkb2NzL3Jlc291cmNlczwvcmVzb3VyY2VzRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmRlcGxveTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0YWdlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24vc3JjL3NpdGUvc2l0ZS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVmNzRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBBeGlzMiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMjwvbmFtZT4KLSAgICA8c3JjPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbWFnZXMvYXNmX2xvZ29fd2lkZS5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxzcmM+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvaW1hZ2VzL2F4aXMuanBnPC9zcmM+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0gIDxib2R5PgotCQk8bGlua3M+Ci0JCQk8aXRlbSBuYW1lPSJBeGlzMi9KYXZhIiBocmVmPSJpbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iQXhpczIvQyIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYyIgLz4KLQkJCTxpdGVtIG5hbWU9IkFwYWNoZSBXUyIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmciIC8+Ci0JCQk8aXRlbSBuYW1lPSJBcGFjaGUJIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciIC8+Ci0JCTwvbGlua3M+Ci0KLQkJPG1lbnUgbmFtZT0iQXhpczIvSmF2YSI+Ci0JCQk8aXRlbSBuYW1lPSJIb21lIiBocmVmPSJpbmRleC5odG1sIiAvPgotCQk8L21lbnU+Ci0JCTxtZW51IG5hbWU9IkRvd25sb2FkcyI+Ci0JCQk8aXRlbSBuYW1lPSJSZWxlYXNlcyIgaHJlZj0iZG93bmxvYWQuY2dpIiAvPgotCQkJPGl0ZW0gbmFtZT0iTW9kdWxlcyIgaHJlZj0ibW9kdWxlcy9pbmRleC5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iVG9vbHMiIGhyZWY9InRvb2xzL2luZGV4Lmh0bWwiIC8+Ci0JCTwvbWVudT4KLQkJPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDEuNS4xIiBocmVmPSIvQGF4aXMyX3ZlcnNpb25fZGlyQC9jb250ZW50cy5odG1sIiA+Ci0JCQkgICA8aXRlbSBuYW1lPSJUYWJsZSBvZiBDb250ZW50cyIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC90b2MuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9Ikluc3RhbGxhdGlvbiBHdWlkZSIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC9pbnN0YWxsYXRpb25ndWlkZS5odG1sIiAvPgotCQkJICAgPGl0ZW0gbmFtZT0iUXVpY2tTdGFydCBHdWlkZSIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC9xdWlja3N0YXJ0Z3VpZGUuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9IlVzZXIgR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLmh0bWwiIC8+Ci0JCQkgICA8aXRlbSBuYW1lPSJKQVhXUyBHdWlkZSIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC9qYXh3cy1ndWlkZS5odG1sIiAvPgotCQkJICAgPGl0ZW0gbmFtZT0iUE9KTyBHdWlkZSIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC9wb2pvZ3VpZGUuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9IlNwcmluZyBHdWlkZSIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC9zcHJpbmcuaHRtbCIgLz4KLQkJCSAgIDxpdGVtIG5hbWU9IldlYiBBZG1pbmlzdHJhdG9yJ3MgR3VpZGUiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvd2ViYWRtaW5ndWlkZS5odG1sIiAvPgotCQkJICAgPGl0ZW0gbmFtZT0iTWlncmF0aW9uIEd1aWRlIChmcm9tIEF4aXMxKSIgaHJlZj0iQGF4aXMyX3ZlcnNpb25fZGlyQC9taWdyYXRpb24uaHRtbCIgLz4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtIG5hbWU9IlZlcnNpb24gMS41IiBocmVmPSIvMV81L2NvbnRlbnRzLmh0bWwiLz4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9IlZlcnNpb24gMS40LjEiIGhyZWY9Ii8xXzRfMS9jb250ZW50cy5odG1sIi8+Ci0gICAgICAgICAgICA8aXRlbSBuYW1lPSJWZXJzaW9uIDEuNCIgaHJlZj0iLzFfNC9jb250ZW50cy5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJWZXJzaW9uIDEuMyIgaHJlZj0iLzFfMy9jb250ZW50cy5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVmVyc2lvbiAxLjIiIGhyZWY9Ii8xXzIvY29udGVudHMuaHRtbCIgLz4KLQkJCTxpdGVtIG5hbWU9IlZlcnNpb24gMS4xLjEiIGhyZWY9Ii8xXzFfMS9jb250ZW50cy5odG1sIiAvPgotCQkJPGl0ZW0gbmFtZT0iVmVyc2lvbiAxLjEiIGhyZWY9Ii8xXzEvY29udGVudHMuaHRtbCIgLz4KLQkJCTxpdGVtIG5hbWU9IlZlcnNpb24gMS4wIiBocmVmPSIvMV8wL2luZGV4Lmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDAuOTUiIGhyZWY9Ii8wXzk1L2luZGV4Lmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDAuOTQiIGhyZWY9Ii8wXzk0L2luZGV4Lmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJWZXJzaW9uIDAuOTMiIGhyZWY9Ii8wXzkzL2luZGV4Lmh0bWwiIC8+Ci0JCTwvbWVudT4KLQkJPG1lbnUgbmFtZT0iUmVzb3VyY2VzIj4KLQkJPGl0ZW0gbmFtZT0iRkFRIiBocmVmPSJmYXEuaHRtbCIgLz4KLQkJPGl0ZW0gbmFtZT0iQXJ0aWNsZXMiIGhyZWY9ImFydGljbGVzLmh0bWwiIC8+Ci0JCTxpdGVtIG5hbWU9Ildpa2kiIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvd3MvRnJvbnRQYWdlL0F4aXMyLyIgLz4KLQkJCTxpdGVtIG5hbWU9IlJlZmVyZW5jZSBMaWJyYXJ5IiBocmVmPSJyZWZMaWIuaHRtbCIgLz4KLQkJCTxpdGVtIG5hbWU9Ik9ubGluZSBKYXZhIERvY3MiIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvYXBpL2luZGV4Lmh0bWwiIC8+Ci0JCTwvbWVudT4KLQkJPG1lbnUgbmFtZT0iR2V0IEludm9sdmVkIiBocmVmPSJvdmVydmlldy5odG1sIj4KLQkJPGl0ZW0gbmFtZT0iT3ZlcnZpZXciIGhyZWY9Im92ZXJ2aWV3Lmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJDaGVja291dCB0aGUgU291cmNlIiBocmVmPSJzdm4uaHRtbCIgLz4KLQkJIDxpdGVtIG5hbWU9Ik1haWxpbmcgTGlzdHMiIGhyZWY9Im1haWwtbGlzdHMuaHRtbCIgLz4KLSAgICAgICAgIDxpdGVtIG5hbWU9IlJlbGVhc2UgUHJvY2VzcyIgaHJlZj0icmVsZWFzZS1wcm9jZXNzLmh0bWwiLz4KLSAgICAgICAgICAgIDxpdGVtIG5hbWU9IkRldmVsb3BlciBHdWlkZWxpbmVzIiBocmVmPSJndWlkZWxpbmVzLmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJCdWlsZCB0aGUgU2l0ZSIgaHJlZj0ic2l0ZUhvd1RvLmh0bWwiIC8+CQotCQk8L21lbnU+Ci0JCTxtZW51IG5hbWU9IlByb2plY3QgSW5mb3JtYXRpb24iPgotCQkJPGl0ZW0gbmFtZT0iUHJvamVjdCBUZWFtIiBocmVmPSJ0ZWFtLWxpc3QuaHRtbCIgLz4KLQkJCQk8aXRlbSBuYW1lPSJJc3N1ZSBUcmFja2luZyIgaHJlZj0iaXNzdWUtdHJhY2tpbmcuaHRtbCIgLz4KLQkJCTxpdGVtIG5hbWU9IlNvdXJjZSBDb2RlIgotCQkJCWhyZWY9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay8/cm9vdD1BcGFjaGUtU1ZOIiAvPgotCQkJPGl0ZW0gbmFtZT0iQWNrbm93bGVkZ2VtZW50cyIgaHJlZj0idGhhbmtzLmh0bWwiIC8+Ci0JCQk8aXRlbSBuYW1lPSJMaWNlbnNlIgotCQkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sIiAvPgotCQk8L21lbnU+Ci0KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMi1ycGMtc3VwcG9ydC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvQXhpczItcnBjLXN1cHBvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNjOTkzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMi1ycGMtc3VwcG9ydC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiBSUEMgU3VwcG9ydDwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPkF4aXMyIFJQQyBTdXBwb3J0PC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBBeGlzMidzIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBzdXBwb3J0IGluDQotYSBzZXQgb2YgZWFzeSB0byB1bmRlcnN0YW5kIGltcGxlbWVudGF0aW9uIHN0ZXBzLjwvcD4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5BeGlzMiBSZW1vdGUgUHJvY2VkdXJlIENhbGwgKFJQQykgc3VwcG9ydCBtYXkgc2VlbSBzb21ld2hhdA0KLXRyaWNreSBhbmQgY29uZnVzaW5nIGF0IGZpcnN0IGdsYW5jZS4gSG93ZXZlciwgQXhpczIgUlBDIHN0cmF0ZWd5DQotaXMgYmFzZWQgb24gYSBzZXQgb2Ygd2VsbCBkZWZpbmVkIHJ1bGVzLiBUaGlzIGRvY3VtZW50IGFpbXMgdG8NCi1kcmlsbCBkb3duIHRvIHRoZSBkZXRhaWxzIG9mIHRoZSBzdHJhdGVneSBhbmQgcmVzb2x2ZSBtb3N0IG9mIHRoZQ0KLXVua25vd24gYml0cyBhbmQgcGllY2VzLiBOb3RlIHRoYXQgQXhpczIgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQNCi10aGUgcnBjL2VuY29kZWQgc3R5bGUuIEJ1dCBpdCBmdWxseSBzdXBwb3J0cyB0aGUgcnBjL2xpdGVyYWwgDQotc3R5bGUuPC9wPg0KLTxwPldlIHdpbGwgZGlzY3VzcyB0aGUgQXhpczIgUlBDIHN0cmF0ZWd5IGluIHRoZSBmb2xsb3dpbmcNCi1zdGVwczwvcD4NCi08aDI+U3RlcCAxIC0gQ29udmVydGluZyBSUEMgU3R5bGUgV1NETCdzIGludG8gRG9jL0xpdCBTdHlsZQ0KLVdTREw8L2gyPg0KLTxwPlRoaXMgaXMgcHJvYmFibHkgdGhlIG1vc3QgY29uZnVzaW5nIHBhcnQgb2YgdGhlIFJQQyBzdHJhdGVneS4NCi1TaW5jZSB0aGUgQXhpczIgY29kZSBnZW5lcmF0b3IgaXMgYmFzZWQgb24gcHVyZSBkb2MvbGl0IHN0eWxlLCB0aGUNCi1maXJzdCBzdGVwIG9mIHRoZSBjb2RlIGdlbmVyYXRpb24gcHJvY2VzcyBpcyB0byBnZW5lcmF0ZSBhIHdyYXBwZXINCi1zY2hlbWEuIFRoaXMgd3JhcHBlciBnZW5lcmF0aW9uIGNhbiBiZSBlYXNpbHkgZXhwbGFpbmVkIGJ5IHVzaW5nIGFuDQotZXhhbXBsZS48L3A+DQotPHA+VGFrZSB0aGUgZm9sbG93aW5nIHBpZWNlIG9mIFdTREw8L3A+DQotPHByZT4NCi0gLi4uLi4NCi0gICAgJmx0O21lc3NhZ2UgbmFtZT0icmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtwYXJ0IG5hbWU9InBhcnQyIiB0eXBlPSJ4czppbnQiLyZndDsNCi0gICAgICAgICZsdDsvbWVzc2FnZSZndDsNCi0gICAgICAgICZsdDttZXNzYWdlIG5hbWU9InJlc3BvbnNlTWVzc2FnZSImZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtwYXJ0IG5hbWU9InBhcnQxIiB0eXBlPSJ4czpzdHJpbmciLyZndDsNCi0gICAgICAgICZsdDsvbWVzc2FnZSZndDsNCi0gICAgICAgICZsdDtwb3J0VHlwZSBuYW1lPSJlY2hvUG9ydFR5cGUiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImVjaG8iJmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtpbnB1dCBtZXNzYWdlPSJ5OnJlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O291dHB1dCBtZXNzYWdlPSJ5OnJlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAgICAgICZsdDsvcG9ydFR5cGUmZ3Q7DQotICAgICAgICAmbHQ7YmluZGluZyBuYW1lPSJlY2hvQmluZGluZyIgdHlwZT0ieTplY2hvUG9ydFR5cGUiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8mZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtvcGVyYXRpb24gbmFtZT0iZWNobyImZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3NvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG8iLyZndDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aW5wdXQmZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvaW5wdXQmZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O291dHB1dCZndDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy9vdXRwdXQmZ3Q7DQotICAgICAgICAgICAgICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAgICAgICAgJmx0Oy9iaW5kaW5nJmd0Ow0KLS4uLi4uDQotPC9wcmU+DQotPHA+VGhlIGJpbmRpbmcgc2F5cyBycGMvbGl0IGlzIHJlcXVpcmVkIGFuZCBpbiB0aGlzIGNhc2UgdGhlDQotbWVzc2FnZSBwYXJ0cyB3aWxsIG5lZWQgd3JhcHBpbmcgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjo8L3A+DQotPG9sPg0KLTxsaT5UaGUgZmlyc3QgZWxlbWVudCBuZWVkcyB0byBoYXZlIHRoZSBvcGVyYXRpb24gbmFtZSBhcyB0aGUgbG9jYWwNCi1uYW1lIGFuZCB0aGUgb3BlcmF0aW9uIG5hbWVzcGFjZS4gKFRoaXMgaGFwcGVucyB0byBiZSB0aGUgbmFtZXNwYWNlDQotb2YgdGhlIHBvcnR0eXBlIC0gaW4gdGhpcyBjYXNlIHRoZSB0YXJnZXRuYW1lc3BhY2Ugb2YgdGhlDQotV1NETC4pPC9saT4NCi08bGk+VGhlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudCBhcmUgbm9uIG5hbWVzcGFjZSBxdWFsaWZpZWQNCi1lbGVtZW50cyB3aXRoIHRoZSBwYXJ0IG5hbWVzIGFzIGxvY2FsIG5hbWVzIChyZWZlcnJlZCB0byBhcw0KLTxzdHJvbmc+cGFydCBlbGVtZW50PC9zdHJvbmc+KTwvbGk+DQotPGxpPkluIGNhc2UgdGhlIHBhcnQgcmVmZXJzIHRvIGEgc3RhbmRhcmQgdHlwZSBsaWtlIHRoZSBleGFtcGxlDQotV1NETCwgdGhlIGNvbnRlbnQgb2YgdGhlIHBhcnQgZWxlbWVudCB3b3VsZCBiZSBvZiB0aGF0IHR5cGUuIElmIHRoZQ0KLXBhcnQgcmVmZXJzIHRvIGEgY29tcGxleCB0eXBlIGRlZmluZWQgaW4gdGhlIHNjaGVtYSwgdGhlIGNvbnRlbnQgb2YNCi10aGUgcGFydCBlbGVtZW50IGJlY29tZXMgb2YgdGhhdCB0eXBlLiBIYXZpbmcgYW4gZWxlbWVudCByZWZlcmVuY2UNCi1pbiB0aGUgcGFydCB3aGVuIHRoZSBiaW5kaW5nIGlzIHJwYyBpcyBpbnZhbGlkLjwvbGk+DQotPC9vbD4NCi08cD5Gb3IgZXhhbXBsZSwgdGhlIGlucHV0IHdpcmUgbWVzc2FnZSBmb3IgdGhlIGVjaG8gb3BlcmF0aW9uDQotbWVudGlvbmVkIGluIHRoZSBhYm92ZSBXU0RMIGZyYWdtZW50IHdvdWxkIGxvb2sgbGlrZSB0aGlzOjwvcD4NCi08cHJlPg0KLSAmbHQ7b3A6PHN0cm9uZz5lY2hvPC9zdHJvbmc+IHhtbG5zOm9wPSJwb3J0dHlwZSBuYW1lc3BhY2UiJmd0Ow0KLSAgJmx0OzxzdHJvbmc+cGFydDE8L3N0cm9uZz4mZ3Q7SGVsbG8gV29ybGQmbHQ7L3BhcnQxJmd0Ow0KLSAgJmx0OzxzdHJvbmc+cGFydDI8L3N0cm9uZz4mZ3Q7MTIzJmx0Oy9wYXJ0MiZndDsNCi0gJmx0Oy9vcDplY2hvJmd0Ow0KLTwvcHJlPg0KLTxwPk5vdGUgdGhhdCB0aGUgZWxlbWVudCBuYW1lIGlzIGluIGJvbGQuIFRoZSBmaXJzdCBvbmUgaXMgdGhlDQotb3BlcmF0aW9uIG5hbWUsIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZSBwYXJ0IG5hbWVzLiBJdCBjYW4gYmUgc2Vlbg0KLXRoYXQgaXQgaXMgcG9zc2libGUgdG8gZ2VuZXJhdGUgYSBzY2hlbWEgcmVwcmVzZW50aW5nIHRoaXMNCi1zdHJ1Y3R1cmUsIGFuZCB0aGVuIHRyZWF0IHRoZSB3aG9sZSBzZXJ2aWNlIGFzIGEgcHVyZSBkb2MvbGl0DQotc2VydmljZS4gSW4gdGhpcyBjYXNlLCB0aGUgZm9sbG93aW5nIHBpZWNlIG9mIHNjaGVtYSBpcyBnZW5lcmF0ZWQNCi10byBtYWtlIHRoZSBycGMgdG8gZG9jIGNvbnZlcnNpb24uIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIHdpcmUNCi1tZXNzYWdlIHN0YXlzIHVuY2hhbmdlZC4gSXQgaXMgb25seSBhIGRpZmZlcmVudCBXU0RMIGF1dGhvcmluZw0KLXN0eWxlPC9wPg0KLTxwcmU+DQotICZsdDt4czplbGVtZW50IG5hbWU9ImVjaG8iJmd0Ow0KLSAgICAmbHQ7eHM6Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0O3hzOnNlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7eHM6ZWxlbWVudCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIiAvJmd0OyANCi0gICAgICAgICAgICAgICAgJmx0O3hzOmVsZW1lbnQgbmFtZT0icGFydDIiIHR5cGU9InhzOmludCIgLyZndDsgDQotICAgICAgICAgICAmbHQ7L3hzOnNlcXVlbmNlJmd0OyAgICANCi0gICAgJmx0Oy94czpjb21wbGV4VHlwZSZndDsNCi0gJmx0Oy94czplbGVtZW50Jmd0Ow0KLTwvcHJlPg0KLTxwPldoYXQgdGhlIEF4aXMyIGNvZGUgZ2VuZXJhdG9yIGRvZXMgaXMgZXhhY3RseSB0aGlzLiBCeSBsb29raW5nDQotYXQgdGhlIGJpbmRpbmcgc3R5bGUsIGl0IGdlbmVyYXRlcyBhIHdyYXBwZXIgc2NoZW1hIGluIHBsYWNlcw0KLXJlcXVpcmVkIGJlZm9yZSBoYW5kaW5nIG92ZXIgdGhlIEF4aXMqIGhpZXJhcmNoeSB0byB0aGUgY29kZQ0KLWdlbmVyYXRvciBlbmdpbmUuIEluIGV2ZXJ5IGNhc2UgKGV2ZW4gd2hlbiB0aGUgc2NoZW1hIG5lZWRzIHRvIGJlDQotdW53cmFwcGVkKSB0aGlzIHdyYXBwaW5nIHBhcnQgd2lsbCB0YWtlIHBsYWNlITwvcD4NCi08aDI+U3RlcCAyIC0gVW53cmFwcGluZyB0aGUgU2NoZW1hPC9oMj4NCi08cD5JZiB0aGUgc2NoZW1hIG5lZWRzIHRvIGJlIHVud3JhcHBlZCwgaXQgYnJpbmdzIHVwIGEgZmV3IGlzc3Vlcy4NCi1UaGlzIGlzIG1haW5seSBiZWNhdXNlIHRoZSBvbmx5IHRoaW5nIHRoYXQgdGhlIGVtaXR0ZXJzIHJlbHkgb24NCi13aGVuIGdlbmVyYXRpbmcgY29kZSBpcyBhIG1hcHBpbmcgdGFibGUuPC9wPg0KLTxvbD4NCi08bGk+V2hlbiB0aGUgc2NoZW1hIGlzIHVud3JhcHBlZCwgd2hlcmUgd2lsbCB0aGUgdW53cmFwcGluZw0KLWluZm9ybWF0aW9uIHJlbWFpbj8NCi08cD5UaGVyZSBoYXMgdG8gYmUgYSBzdG9yZSB0byBrZWVwIHRoZSBpbmZvcm1hdGlvbiBzZXBlcmF0ZWQuIFRoZQ0KLUF4aXMgKiBoaWVyYXJjaHkgY2FuIGJlIHVzZWQgZm9yIHRoaXMuIEl0IGhhcyBuaWNlbHkgc2VwYXJhdGVkDQotaW5mb3JtYXRpb24gaG9sZGVycyBhbmQgYSBwYXJhbWV0ZXIgc3RvcmUgdGhhdCBjYW4gaG9sZCBhbg0KLWluZm9ybWF0aW9uIGJlYW4uPC9wPg0KLTwvbGk+DQotPGxpPkhvdyBkbyB3ZSBtYWludGFpbiB1bmlxdWVuZXNzIGFtb25nIG1lc3NhZ2UgcGFydCBuYW1lcz8NCi08cD5QYXJ0IG5hbWVzIGFyZSBvbmx5IHVuaXF1ZSBhY3Jvc3MgYSBtZXNzYWdlIGFuZCBub3QgZ2xvYmFsbHkuDQotSG93ZXZlciwgZHVlIHRvIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZSBhIGdsb2JhbCBtYXBwaW5nIHRhYmxlLCB3ZQ0KLW5lZWQgYSB3YXkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHBhcnRzIG9mIGRpZmZlcmVudCBtZXNzYWdlcy4NCi1UaGUgdGVjaG5pcXVlIHVzZWQgaGVyZSBpcyB0byBnZW5lcmF0ZSBhIFFOYW1lIHRoYXQgaGFzIHRoZQ0KLW9wZXJhdGlvbiBuYW1lIGFzIGEgbmFtZXNwYWNlIGFuZCBhIHN1ZmZpeCAobGlrZSBfaW5wdXQpIGFwcGVuZGVkDQotdG8gdGhlIGxvY2FsIG5hbWUuPC9wPg0KLTwvbGk+DQotPC9vbD4NCi08cD5HaXZlbiB0aGVzZSBzb2x1dGlvbnMsIHRoZSBmaXJzdCBzdGVwIGluIHVud3JhcHBpbmcgaXMgdG8gd2Fsaw0KLXRoZSBzY2hlbWEgYW5kIGZpZ3VyZSBvdXQgdGhlIHVud3JhcHBhYmxlIGl0ZW1zLiBUaGUga2V5IHBsYXllciBvZg0KLXRoZSB1bndyYXBwaW5nIHByb2Nlc3MgaXMgdGhlIHVud3JhcHBpbmcgZXh0ZW5zaW9uLiBJdCB3YWxrcyBhDQotZ2l2ZW4gc2NoZW1hIGFuZCBmaWd1cmUgb3V0IHRoZSB1bndyYXBwYWJsZSBwYXJ0cyBpZiB0aGVyZSBhcmUNCi1hbnkuPC9wPg0KLTxwPlRoZSBjdXJyZW50IHVud3JhcHBlciBsb29rcyBmb3IgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhbmQgZmFpbHMNCi1pZiBpdCBpcyBub3QgZm91bmQhPC9wPg0KLTxwcmU+DQotJmx0OyBlbGVtZW50ICZndDsNCi0gICAgICAmbHQ7IGNvbXBsZXhUeXBlICZndDsNCi0gICAgICAgICAgICZsdDsgc2VxdWVuY2UgJmd0Ow0KLSAgICAgICAgICAgICAgICZsdDsgZWxlbWVudCAvJmd0Ow0KLSAgICAgICAgICAgJmx0OyAvc2VxdWVuY2UgJmd0Ow0KLSAgICAgICAmbHQ7IC9jb21wbGV4VHlwZSAmZ3Q7DQotICAmbHQ7IC9lbGVtZW50ICZndDsNCi0gDQotPC9wcmU+DQotPHA+T25jZSB0aGlzIHBhdHRlcm4gaXMgZGV0ZWN0ZWQsIHRoZSB1bndyYXBwZXIgZGV0YWlscyB3aWxsIGJlDQotYWRkZWQgdG8gdGhlIHJlbGV2YW50IEF4aXNNZXNzYWdlIGNvbXBvbmVudC48L3A+DQotPGgyPlN0ZXAgMyAtIFBvcHVsYXRlIFR5cGUgSW5mb3JtYXRpb248L2gyPg0KLTxwPlRoZSBuZXh0IHN0ZXAgaXMgdG8gcG9wdWxhdGUgdGhlIFR5cGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwYXJ0cy4NCi1UaGlzIGhhcyB0byBiZSBleHBsaWNpdGx5IGRvbmUgYnkgdGhlIGRhdGEgYmluZGluZyBleHRlbnNpb25zLCBhbmQNCi1jdXJyZW50bHkgdGhlIEFEQiBhbmQgWE1MYmVhbnMgZXh0ZW5zaW9ucyBwb3B1bGF0ZSB0aGUgcmVsZXZhbnQNCi1BeGlzTWVzc2FnZSBieSBsb29raW5nIHVwIHRoZWlyIGdlbmVyYXRlZCB0eXBlIHN5c3RlbXMuIFRoaXMgdHlwZQ0KLWluZm9ybWF0aW9uIGdvZXMgaW50byB0aGUgQXhpc01lc3NhZ2UgaW5zaWRlIGENCi1NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyIGluc3RhbmNlLjwvcD4NCi08cD5UaGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQgZnJvbSB0aGUgQURCIGV4dGVuc2lvbiBzaG93cyBob3cgdGhlDQotQXhpc01lc3NhZ2VzIGdldCBwb3B1bGF0ZWQgd2l0aCB0aGUgcmVsZXZhbnQgdHlwZSBpbmZvcm1hdGlvbi4gVGhlDQotY29kZSBpcyBhbG1vc3QgdGhlIHNhbWUgZm9yIHRoZSBYTUxCZWFucyBleHRlbnNpb24uIE5vdGUgdGhlIGl0ZW1zDQotaW4gYm9sZC48L3A+DQotPHByZT4NCi0gaWYgKG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlID0gbWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCkuZ2V0U2NoZW1hVHlwZSgpOw0KLSAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsNCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY21wbHhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSBzY2hlbWFUeXBlOw0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IGNtcGx4VHlwZS5nZXRQYXJ0aWNsZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTZXF1ZW5jZSkgew0KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpdGVtcyA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoWG1sU2NoZW1hU2VxdWVuY2UpIHBhcnRpY2xlKS5nZXRJdGVtcygpOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaXRlbXMuZ2V0SXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSAoWG1sU2NoZW1hRWxlbWVudCkgaXRlbTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hVHlwZSBlbHRTY2hlbWFUeXBlID0geG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbHRTY2hlbWFUeXBlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+cG9wdWxhdGVDbGFzc05hbWUoZWx0U2NoZW1hVHlwZSxtYXBwZXIsb3BOYW1lLHhtbFNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpKTs8L3N0cm9uZz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4bWxTY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGVOYW1lKCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsdFNjaGVtYVR5cGUgPSBmaW5kU2NoZW1hVHlwZShzY2hlbWFNYXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWx0U2NoZW1hVHlwZSE9bnVsbCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVDbGFzc05hbWUoZWx0U2NoZW1hVHlwZSxtYXBwZXIsb3BOYW1lLHhtbFNjaGVtYUVsZW1lbnQuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgfQ0KLSAgICAgICAgIH0NCi0gICB9DQotPC9wcmU+DQotPHA+VGhlIHBvcHVsYXRlQ2xhc3NOYW1lIGxvb2tzIGxpa2UgdGhpczwvcD4NCi08cHJlPg0KLSBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlQ2xhc3NOYW1lKFhtbFNjaGVtYVR5cGUgZWx0U2NoZW1hVHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlTWFwcGVyIHR5cGVNYXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUpIHsNCi0gICAgICAgIE1hcCBtZXRhSW5mb01hcCA9IGVsdFNjaGVtYVR5cGUuZ2V0TWV0YUluZm9NYXAoKTsNCi0gICAgICAgIGlmIChtZXRhSW5mb01hcCAhPSBudWxsKSB7DQotICAgICAgICAgICAgPHN0cm9uZz5TdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgbWV0YUluZm9NYXAuDQotICAgICAgICAgICAgICAgICAgICBnZXQoU2NoZW1hQ29uc3RhbnRzLlNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfS0VZKTsNCi0gICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPSBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3BOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwNCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lKTsNCi0gICAgICAgICAgICB0eXBlTWFwLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsY2xhc3NOYW1lKTs8L3N0cm9uZz4NCi0gICAgICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgIG1ldGFJbmZvTWFwLmdldChTY2hlbWFDb25zdGFudHMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVySW5mb0hvbGRlci5DTEFTU05BTUVfUFJJTUlUVkVfS0VZKSkpew0KLSAgICAgICAgICAgICAgICAvL3RoaXMgdHlwZSBpcyBwcmltaXRpdmUgLSBhZGQgdGhhdCB0byB0aGUgdHlwZSBtYXBwZXIgc3RhdHVzDQotICAgICAgICAgICAgICAgIC8vZm9yIG5vdyBsZXRzIGFkZCBhIGJvb2xlYW4NCi0gICAgICAgICAgICAgICAgdHlwZU1hcC5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgIH0NCi08L3ByZT4NCi08aDI+U3RlcCA0IC0gR2VuZXJhdGUgQ29kZSB3aXRoIFVud3JhcHBlZCBQYXJhbWV0ZXJzPC9oMj4NCi08cD5UaGUgbmV4dCBzdGVwIGlzIGdlbmVyYXRpbmcgdGhlIGFjdHVhbCBjb2RlLiBUaGUNCi1BeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXIgaGFzIGEgbWV0aG9kIHRoYXQgZ2VuZXJhdGVzDQotdGhlIFhNTCBtb2RlbCBmb3IgdGhlIGlucHV0IHBhcmFtZXRlcnMsIGFuZCB0aGF0IG1ldGhvZCBpbmNsdWRlcw0KLXRoZSByZWxldmFudCBwYXJ0IHBhcmFtZXRlcnMgaW5zaWRlIHRoZSByZWxhdmFudCB0b3AgbGV2ZWwgaW5wdXQNCi1wYXJhbWV0ZXIgZWxlbWVudC48L3A+DQotPHA+VGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIFhNTCBtb2RlbCBsb29rcyBsaWtlIHRoaXMuIE5vdGUgdGhhdA0KLXRoaXMgaW50ZXJtZWRpYXRlIFhNTCBtb2RlbCBpcyB0aGUgb25lIHRoYXQgaXMgcGFyc2VkIGFnYWluc3QgdGhlDQotU3R5bGVzaGVldHMgdG8gZ2VuZXJhdGUgdGhlIGNvZGUuPC9wPg0KLTxwcmU+DQotJmx0O2lucHV0Jmd0Ow0KLSAmbHQ7cGFyYW0gbmFtZT0icGFyYW00IiB0eXBlPSJjb20uZXhhbXBsZS53d3cuU2VydmljZU5hbWVTdHViLkVjaG8iIHNob3J0dHlwZT0iRWNobyIgdmFsdWU9Im51bGwiIGxvY2F0aW9uPSJib2R5IiBvcG5hbWU9ImVjaG8iJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtIG5hbWU9InBhcmFtNSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgc2hvcnR0eXBlPSJTdHJpbmciIHZhbHVlPSJudWxsIiBsb2NhdGlvbj0iYm9keSIgb3BuYW1lPSJlY2hvIiBwYXJ0bmFtZT0iUGFydDEiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZT0ieWVzIi8mZ3Q7DQotICAgICAgICAmbHQ7cGFyYW0gbmFtZT0icGFyYW02IiB0eXBlPSJpbnQiIHNob3J0dHlwZT0iaW50IiB2YWx1ZT0iMCIgbG9jYXRpb249ImJvZHkiIG9wbmFtZT0iZWNobyIgcGFydG5hbWU9IlBhcnQyIiBwcmltaXRpdmU9InllcyIvJmd0Ow0KLSAgJmx0Oy9wYXJhbSZndDsNCi0mbHQ7L2lucHV0Jmd0Ow0KLTwvcHJlPg0KLTxwPlRoZSBuZXh0IHBhcnQgaXMgaGFuZGxlZCBieSB0aGUgdGVtcGxhdGUuIEJhc2ljYWxseSwgdGhlDQotdGVtcGxhdGUgbG9va3MgYWZ0ZXIgdGhlIGdlbmVyYXRpb24gb2YgbXVsdGlwbGUgcGFyYW1ldGVycyBpbnRvIHRoZQ0KLW1ldGhvZCBzaWduYXR1cmVzLCBhbmQgdGhlbiB0aGUgZ2VuZXJhdGluZyBvZiB0aGUgcmVsZXZhbnQNCi1zZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3IgdGhlIHBhcmFtZXRlcnMuPC9wPg0KLTxoMj5CcmluZ2luZyB0aGUgUGFyYW1ldGVycyBUb2dldGhlciBhbmQgRXhwbG9kaW5nIFRoZW08L2gyPg0KLTxwPlRoaXMgaXMgYSBzb21ld2hhdCBjb250cm92ZXJzaWFsIGFyZWEuIFRoZSBjdXJyZW50IEF4aXMyIGNvZGUNCi1nZW5lcmF0b3IgZG9lcyB0aGUgd3JhcHBpbmcgYW5kIHVud3JhcHBpbmcgYXQgdGhlIG9iamVjdCBsZXZlbCBhbmQNCi1ub3QgdGhlIFhNTCBsZXZlbC4gSW4gc2hvcnQsIHRoZSBleHBsb2RlZCBwYXJhbWV0ZXJzIGFyZSBvbmx5IGENCi1jb252ZW5pZW5jZSBhbmQgdGhlIGV4cGxvc2lvbiBkb2VzIG5vdCBydW4gZG93biB0byB0aGUgWE1MIGxldmVsLg0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBvZiBnZW5lcmF0ZWQgc291cmNlIGNvZGUgbWFrZXMgdGhpcw0KLWNsZWFyOjwvcD4NCi08cHJlPg0KLSBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZSgNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCBqYXZhLmxhbmcuU3RyaW5nIHBhcmFtMSwNCi0gICAgICAgIGludCBwYXJhbTIsIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KSB7DQotICAgICAgICA8c3Ryb25nPmNvbS5leGFtcGxlLnd3dy5TZXJ2aWNlTmFtZVN0dWIuRWNobyB3cmFwcGVkVHlwZSA9IG5ldyBjb20uZXhhbXBsZS53d3cuU2VydmljZU5hbWVTdHViLkVjaG8oKTsNCi0gICAgICAgIHdyYXBwZWRUeXBlLnNldFBhcnQxKHBhcmFtMSk7DQotICAgICAgICB3cmFwcGVkVHlwZS5zZXRQYXJ0MihwYXJhbTIpOzwvc3Ryb25nPg0KLSAgICAgICAgcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVtcHR5RW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOw0KLSAgICAgICAgZW1wdHlFbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQod3JhcHBlZFR5cGUuZ2V0T01FbGVtZW50KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5leGFtcGxlLnd3dy5TZXJ2aWNlTmFtZVN0dWIuRWNoby5NWV9RTkFNRSwgZmFjdG9yeSkpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZW1wdHlFbnZlbG9wZTsNCi19DQotPC9wcmU+DQotPHA+Tm90ZSB0aGUgbGluZXMgaW4gYm9sZC4gVGhlIHdyYXBwZWQgY2xhc3Mgd2lsbCBhbnl3YXkgYmUNCi1pbnN0YW50aWF0ZWQgYW5kIHVzZWQgYXQgdGhlIGVuZCwgYnV0IHdoYXQgdGhlIHVzZXIgc2VlcyBpcw0KLWRpZmZlcmVudC4gRXhwbG9kaW5nIHRoZSBwYXJhbWV0ZXJzIGhhcHBlbnMgaW4gYSBzaW1pbGFyIHdheSE8L3A+DQotPGgyPkNvbmNsdXNpb248L2gyPg0KLTxwPkF4aXMyIFJQQyBzdXBwb3J0IGlzIHNvcnQgb2YgYSBtaXN0eSBhcmVhLCBidXQgaXQgaXMgYmFzZWQgb24gYQ0KLXdlbGwgZGVmaW5lZCBzZXQgb2YgcnVsZXMgd2hpY2ggbWFrZXMgaXQgbm90IDxlbT50aGF0PC9lbT4gbWlzdHkNCi1hZnRlciBhbGwhPC9wPg0KLTxociAvPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2NTc0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5NSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiBBcmNoaXRlY3R1cmUgR3VpZGU8L3RpdGxlPg0KLTxtZXRhIGNvbnRlbnQ9IjIwMDUwOTE2OzIyNDU1Mjg4IiAvPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuLVVTIiBkaXI9Imx0ciIgeG1sOmxhbmc9ImVuLVVTIj4NCi08aDEgYWxpZ249ImNlbnRlciI+QXBhY2hlIEF4aXMyIEFyY2hpdGVjdHVyZSBHdWlkZTwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBnaXZlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gQXhpczIncyBtb2R1bGFyDQotYXJjaGl0ZWN0dXJlIHdpdGggZXhwbGFuYXRpb25zIG9uIGV2ZXJ5IG1vZHVsZS48L3A+DQotPGgyPkNvbnRlbnRzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNibUJQIj5UaGUgQmlnIFBpY3R1cmU8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI3JlcXVpcmVtZW50cyI+UmVxdWlyZW1lbnQgb2YgQXhpczI8L2E+PC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiN0aGVhcmNoaSI+QXhpczIgQXJjaGl0ZWN0dXJlPC9hPg0KLTx1bD4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2JtY29yZSI+Q29yZSBNb2R1bGVzPC9hPjwvcD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYm1vdGhlciI+T3RoZXIgTW9kdWxlczwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1JbmZvTW9kIj5JbmZvcm1hdGlvbiBNb2RlbDwvYT48L3A+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2JtWE1MIj5YTUwgUHJvY2Vzc2luZyBNb2RlbDwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1TT0FQUE0iPlNPQVAgUHJvY2Vzc2luZyBNb2RlbDwvYT48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjZGVmYXVsdCI+QXhpczIgRGVmYXVsdCBQcm9jZXNzaW5nIE1vZGVsPC9hPjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNpbmNvbWluZ3NvYXAiPlByb2Nlc3NpbmcgYW4gSW5jb21pbmcgU09BUA0KLU1lc3NhZ2U8L2E+PC9wPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNvdXRnb2luZyI+UHJvY2Vzc2luZyBvZiB0aGUgT3V0Z29pbmcgTWVzc2FnZTwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjZXh0ZW5kaW5nIj5FeHRlbmRpbmcgdGhlIFNPQVAgUHJvY2Vzc2luZyBNb2RlbDwvYT48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjZXh0ZW5kaW5nd2l0aGhhbmRsZXJzIj5FeHRlbmRpbmcgdGhlIFNPQVAgUHJvY2Vzc2luZw0KLU1vZGVsIHdpdGggSGFuZGxlcnM8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2V4dGVuZGluZ3dpdGhtb2R1bGVzIj5FeHRlbmRpbmcgdGhlIFNPQVAgUHJvY2Vzc2luZw0KLU1vZGVsIHdpdGggTW9kdWxlczwvYT48L3A+DQotPC9saT4NCi08L3VsPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYm1EZXBsb3ltZW50Ij5EZXBsb3ltZW50PC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI3htbGZpbGUiPlRoZSA8ZW0+YXhpczIueG1sPC9lbT4gZmlsZTwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjc2VydmljZWFyY2hpdmUiPlNlcnZpY2UgQXJjaGl2ZTwvYT48L3A+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI21vZHVsZWFyY2hpdmUiPk1vZHVsZSBBcmNoaXZlPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1DbGllbnRBUEkiPkNsaWVudCBBUEk8L2E+PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI29uZXdheSI+T25lIFdheSBNZXNzYWdpbmcgU3VwcG9ydDwvYT48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjcmVxdWVzdHJlc3BvbnNlIj5SZXF1ZXN0IFJlc3BvbnNlIE1lc3NhZ2luZw0KLVN1cHBvcnQ8L2E+PC9wPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYm1UcmFuc3BvcnRzIj5UcmFuc3BvcnRzPC9hPjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNibVdTREwiPkNvZGUgR2VuZXJhdGlvbjwvYT48L3A+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2JtREIiPkRhdGEgQmluZGluZzwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRlZ3JhdGlvbiI+SW50ZWdyYXRpb24gd2l0aCBDb2RlIEdlbmVyYXRpb24NCi1FbmdpbmU8L2E+PC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI3NlcmlhbCI+U2VyaWFsaXphdGlvbiBhbmQgRGUtU2VyaWFsaXphdGlvbjwvYT48L3A+DQotPC9saT4NCi08L3VsPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iYm1CUCIgaWQ9ImJtQlAiPjwvYT4NCi08aDI+VGhlIEJpZyBQaWN0dXJlPC9oMj4NCi08cD5BIG5ldyBhcmNoaXRlY3R1cmUgZm9yIEF4aXMgd2FzIGludHJvZHVjZWQgZHVyaW5nIHRoZSBBdWd1c3QNCi0yMDA0IFN1bW1pdCBpbiBDb2xvbWJvLCBTcmkgTGFua2EuIFRoaXMgbmV3IGFyY2hpdGVjdHVyZSBvbiB3aGljaA0KLUF4aXMyIGlzIGJhc2VkIGlzIG1vcmUgZmxleGlibGUsIGVmZmljaWVudCwgYW5kIGNvbmZpZ3VyYWJsZSBpbg0KLWNvbXBhcmlzb24gdG8gPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpcy9qYXZhL2FyY2hpdGVjdHVyZS1ndWlkZS5odG1sIj5BeGlzMS54DQotYXJjaGl0ZWN0dXJlPC9hPi4gU29tZSB3ZWxsIGVzdGFibGlzaGVkIGNvbmNlcHRzIGZyb20gQXhpcyAxLngsDQotbGlrZSBoYW5kbGVycyBldGMuLCBoYXZlIGJlZW4gcHJlc2VydmVkIGluIHRoaXMgbmV3DQotYXJjaGl0ZWN0dXJlLjwvcD4NCi08cD5BbnkgYXJjaGl0ZWN0dXJlIGlzIGEgcmVzdWx0IG9mIHdoYXQgdGhhdCBhcmNoaXRlY3R1cmUgc2hvdWxkDQoteWllbGQuIFRoZSBzdWNjZXNzIG9mIGFuIGFyY2hpdGVjdHVyZSBzaG91bGQgYmUgZXZhbHVhdGVkIGJhc2VkIG9uDQotdGhlIHJlcXVpcmVtZW50cyBleHBlY3RlZCB0byBiZSBtZXQgYnkgdGhhdCBhcmNoaXRlY3R1cmUuIExldCB1cw0KLXN0YXJ0IG91ciBqb3VybmV5IGludG8gQXhpczIgYnkgbG9va2luZyBhdCB0aGUgcmVxdWlyZW1lbnRzLjwvcD4NCi08YSBuYW1lPSJyZXF1aXJlbWVudHMiIGlkPSJyZXF1aXJlbWVudHMiPjwvYT4NCi08aDI+UmVxdWlyZW1lbnQgb2YgQXhpczI8L2gyPg0KLTxwPkluIFNPQVAgdGVybWlub2xvZ3ksIGEgcGFydGljaXBhbnQgd2hvIGlzIHRha2luZyBwYXJ0IGluIGEgV2ViDQotc2VydmljZSBpbnRlcmFjdGlvbiBpcyBrbm93biBhcyBhIFNPQVAgTm9kZS4gRGVsaXZlcnkgb2YgYSBzaW5nbGUNCi1TT0FQIE1lc3NhZ2UgaXMgZGVmaW5lZCBiYXNlZCBvbiB0d28gcGFydGljaXBhbnRzLCBTT0FQIFNlbmRlciBhbmQNCi1TT0FQIFJlY2VpdmVyLiBFYWNoIFNPQVAgbWVzc2FnZSBpcyBzZW50IGJ5IGEgU09BUCBTZW5kZXIgYW5kDQotcmVjZWl2ZWQgYnkgYSBTT0FQIFJlY2VpdmVyLiBBIHNpbmdsZSBTT0FQIGRlbGl2ZXJ5IGlzIHRoZSBtb3N0DQotYmFzaWMgdW5pdCB0aGF0IGJ1aWxkcyB0aGUgV2ViIHNlcnZpY2UgaW50ZXJhY3Rpb24uPC9wPg0KLTxwPkVhY2ggU09BUCBOb2RlIG1heSBiZSB3cml0dGVuIGluIHNwZWNpZmljIHByb2dyYW1taW5nIGxhbmd1YWdlLA0KLW1heSBpdCBiZSBKYXZhLCBDKyssIC5ORVQgb3IgUGVybCwgYnV0IHRoZSBXZWIgc2VydmljZXMgYWxsb3cgdGhlbQ0KLXRvIGludGVyb3BlcmF0ZS4gVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG9uIHRoZSB3aXJlIGVhY2ggV2ViDQotc2VydmljZSBpbnRlcmFjdGlvbiBpcyBkb25lIHZpYSBTT0FQLCB3aGljaCBpcyBjb21tb24gdG8gZXZlcnkgU09BUA0KLU5vZGUuPC9wPg0KLTxwPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL2FyY2hpLWd1aWRlL3NvYXAuZ2lmIiBuYW1lPSJHcmFwaGljMSINCi1hbGlnbj0iYm90dG9tIiB3aWR0aD0iNjkxIiBoZWlnaHQ9IjMxOSIgYm9yZGVyPSIwIiBpZD0NCi0iR3JhcGhpYzEiIC8+PC9wPg0KLTxwPldlYiBzZXJ2aWNlIG1pZGRsZXdhcmUgaGFuZGxlcyB0aGUgY29tcGxleGl0eSBpbiBTT0FQIG1lc3NhZ2luZw0KLWFuZCBsZXRzIHRoZSB1c2VycyB3b3JrIHdpdGggdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHRoZXkgYXJlDQotYWNjdXN0b21lZCB0by4gQXhpczIgYWxsb3dzIEphdmEgdXNlcnMgdG8gaW52b2tlIFdlYiBzZXJ2aWNlcyB1c2luZw0KLUphdmEgcmVwcmVzZW50YXRpb25zLCBhbmQgaGFuZGxlcyB0aGUgU09BUCBtZXNzYWdpbmcgYmVoaW5kIHRoZQ0KLWN1cnRhaW4uPC9wPg0KLTxwPkF4aXMyIGhhbmRsZXMgU09BUCBwcm9jZXNzaW5nIGFsb25nIHdpdGggbnVtZXJvdXMgb3RoZXIgdGFza3MuDQotVGhpcyBtYWtlcyBsaWZlIG9mIGEgV2ViIHNlcnZpY2UgZGV2ZWxvcGVyIGEgd2hvbGUgbG90IGVhc2llci4NCi1Gb2xsb3dpbmcgYXJlIHRoZSBpZGVudGlmaWVkIHJlcXVpcmVtZW50czo8L3A+DQotPG9sPg0KLTxsaT5Qcm92aWRlIGEgZnJhbWV3b3JrIHRvIHByb2Nlc3MgdGhlIFNPQVAgbWVzc2FnZXMuIFRoZSBmcmFtZXdvcmsNCi1zaG91bGQgYmUgZXh0ZW5zaWJsZSBhbmQgdGhlIHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIGV4dGVuZCB0aGUNCi1TT0FQIHByb2Nlc3NpbmcgcGVyIHNlcnZpY2Ugb3IgcGVyIG9wZXJhdGlvbiBiYXNpcy4gRnVydGhlcm1vcmUsIGl0DQotc2hvdWxkIGJlIGFibGUgdG8gbW9kZWwgZGlmZmVyZW50IE1lc3NhZ2UgRXhjaGFuZ2UgUGF0dGVybnMgKE1FUHMpDQotdXNpbmcgdGhlIHByb2Nlc3NpbmcgZnJhbWV3b3JrLjwvbGk+DQotPGxpPkFiaWxpdHkgdG8gZGVwbG95IGEgV2ViIHNlcnZpY2UgKHdpdGggb3Igd2l0aG91dCBXU0RMKTwvbGk+DQotPGxpPlByb3ZpZGUgYSBDbGllbnQgQVBJIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW52b2tlIFdlYiBzZXJ2aWNlcy4NCi1UaGlzIEFQSSBzaG91bGQgc3VwcG9ydCBib3RoIHRoZSBTeW5jaHJvbm91cyBhbmQgQXN5bmNocm9ub3VzDQotcHJvZ3JhbW1pbmcgbW9kZWxzLjwvbGk+DQotPGxpPkFiaWxpdHkgdG8gY29uZmlndXJlIEF4aXMyIGFuZCBpdHMgY29tcG9uZW50cyB0aHJvdWdoDQotZGVwbG95bWVudC48L2xpPg0KLTxsaT5BYmlsaXR5IHRvIHNlbmQgYW5kIHJlY2VpdmUgU09BUCBtZXNzYWdlcyB3aXRoIGRpZmZlcmVudA0KLXRyYW5zcG9ydHMuPC9saT4NCi08L29sPg0KLTxwPkFwYXJ0IGZyb20gdGhlIGFib3ZlIGZ1bmN0aW9uYWxpdGllcywgcGVyZm9ybWFuY2UgaW4gdGVybXMgb2YNCi1tZW1vcnkgYW5kIHNwZWVkIGlzIGEgbWFqb3IgY29uc2lkZXJhdGlvbiBmb3IgQXhpczIuIEF4aXMyIENvcmUNCi1BcmNoaXRlY3R1cmUgaXMgYnVpbHQgb24gdGhyZWUgc3BlY2lmaWNhdGlvbnMtIDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL1RSL3dzZGwiPldTREw8L2E+LCA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi9zb2FwLyI+U09BUDwvYT4gYW5kIDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL1N1Ym1pc3Npb24vd3MtYWRkcmVzc2luZy8iPldTLUFkZHJlc3Npbmc8L2E+Lg0KLU90aGVyIHNwZWNpZmljYXRpb25zIGxpa2UgSkFYLVJQQywgPGEgaHJlZj0NCi0iaHR0cDovL2phdmEuc3VuLmNvbS93ZWJzZXJ2aWNlcy9zYWFqL2luZGV4LmpzcCI+U0FBSjwvYT4gYW5kDQotPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvU3VibWlzc2lvbi9XUy1Qb2xpY3kvIj5XUy1Qb2xpY3k8L2E+IGFyZQ0KLWxheWVyZWQgb24gdG9wIG9mIHRoZSBDb3JlIEFyY2hpdGVjdHVyZS48L3A+DQotPGEgbmFtZT0idGhlYXJjaGkiIGlkPSJ0aGVhcmNoaSI+PC9hPg0KLTxoMj5BeGlzMiBBcmNoaXRlY3R1cmU8L2gyPg0KLUF4aXMyIGFyY2hpdGVjdHVyZSBsYXlzIG91dCBzb21lIHByaW5jaXBhbHMgdG8gcHJlc2VydmUgdGhlDQotdW5pZm9ybWl0eS4gVGhleSBhcmUgYXMgZm9sbG93czoNCi08dWw+DQotPGxpPg0KLTxwPkF4aXMyIGFyY2hpdGVjdHVyZSBzZXBhcmF0ZXMgdGhlIGxvZ2ljIGFuZCB0aGUgc3RhdGVzLiBDb2RlIHRoYXQNCi1kb2VzIHRoZSBwcm9jZXNzaW5nIGRvZXMgbm90IGhhdmUgYSBzdGF0ZSBpbnNpZGUgQXhpczIuIFRoaXMgYWxsb3dzDQotY29kZSB0byBiZSBleGVjdXRlZCBmcmVlbHkgYnkgcGFyYWxsZWwgdGhyZWFkcy48L3A+DQotPC9saT4NCi08bGk+QWxsIHRoZSBpbmZvcm1hdGlvbiBpcyBrZXB0IGluIG9uZSBpbmZvcm1hdGlvbiBtb2RlbCwgYWxsb3dpbmcNCi10aGUgc3lzdGVtIHRvIGJlIHN1c3BlbmRlZCBhbmQgcmVzdW1lZC48L2xpPg0KLTwvdWw+DQotPHA+QXhpczIgYXJjaGl0ZWN0dXJlIGlzIG1vZHVsYXIuIFRoZXJlZm9yZSwgQXhpczIgRnJhbWV3b3JrIGlzDQotYnVpbHQgdXAgb2YgY29yZSBtb2R1bGVzIHRoYXQgY29sbGVjdGl2ZWx5IG1ha2UgdXAgdGhlIGNvcmUNCi1hcmNoaXRlY3R1cmUgb2YgQXhpczIuIE5vbi1jb3JlL290aGVyIG1vZHVsZXMgYXJlIGxheWVyZWQgb24gdG9wIG9mDQotdGhlc2UgY29yZSBtb2R1bGVzLjwvcD4NCi08YSBuYW1lPSJibWNvcmUiIGlkPSJibWNvcmUiPjwvYT4NCi08aDM+Q29yZSBNb2R1bGVzOjwvaDM+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjYm1JbmZvTW9kIj5JbmZvcm1hdGlvbiBNb2RlbDwvYT4gLSBBeGlzMiBkZWZpbmVzIGENCi1tb2RlbCB0byBoYW5kbGUgaW5mb3JtYXRpb24gYW5kIGFsbCBzdGF0ZXMgYXJlIGtlcHQgaW4gdGhpcyBtb2RlbC4NCi1UaGUgbW9kZWwgY29uc2lzdHMgb2YgYSBoaWVyYXJjaHkgb2YgaW5mb3JtYXRpb24uIFRoZSBzeXN0ZW0NCi1tYW5hZ2VzIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBvYmplY3RzIGluIHRoaXMgaGllcmFyY2h5LjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNibVhNTCI+WE1MIHByb2Nlc3NpbmcgTW9kZWw8L2E+IC0gSGFuZGxpbmcgdGhlIFNPQVANCi1NZXNzYWdlIGlzIHRoZSBtb3N0IGltcG9ydGFudCBhbmQgbW9zdCBjb21wbGV4IHRhc2suIFRoZSBlZmZpY2llbmN5DQotb2YgdGhpcyBpcyB0aGUgc2luZ2xlIG1vc3QgaW1wb3J0YW50IGZhY3RvciB0aGF0IGRlY2lkZXMgdGhlDQotcGVyZm9ybWFuY2UuIEl0IG1ha2VzIHNlbnNlIHRvIGRlbGVnYXRlIHRoaXMgdGFzayB0byBhIHNlcGFyYXRlDQotc3ViLXByb2plY3QgdW5kZXIgdGhlIFdlYiBzZXJ2aWNlcyBwcm9qZWN0LCBhbGxvd2luZyB0aGF0DQotc3ViLXByb2plY3QgKDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvYXhpb20vaW5kZXguaHRtbCI+QVhJT008L2E+IG9yIEFYaXMNCi1PYmplY3QgTW9kZWwpIHRvIHByb3ZpZGUgYSBzaW1wbGUgQVBJIGZvciBTT0FQIGFuZCBYTUwgaW5mby1zZXQuIEl0DQotaGlkZXMgdGhlIGNvbXBsZXhpdGllcyBvZiBlZmZpY2llbnQgWE1MIHByb2Nlc3Npbmcgd2l0aGluIGl0cw0KLWltcGxlbWVudGF0aW9uLjwvcD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjYm1TT0FQUE0iPlNPQVAgUHJvY2Vzc2luZyBNb2RlbDwvYT4gLSBUaGlzIGNvbnRyb2xzDQotdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcHJvY2Vzc2luZy4gVGhlIG1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHBoYXNlcw0KLXRoZSBleGVjdXRpb24gd291bGQgd2FsayB0aHJvdWdoLCBhbmQgdGhlIHVzZXIgY2FuIGV4dGVuZCB0aGUNCi1Qcm9jZXNzaW5nIE1vZGVsIGF0IHNwZWNpZmljIHBsYWNlcy48L2xpPg0KLTxsaT4NCi08cD48YSBocmVmPSIjYm1EZXBsb3ltZW50Ij5EZXBsb3ltZW50IE1vZGVsPC9hPiAtIFRoZSBBeGlzMg0KLWRlcGxveW1lbnQgbW9kZWwgYWxsb3dzIHRoZSB1c2VyIHRvIGRlcGxveSBzZXJ2aWNlcywgY29uZmlndXJlIHRoZQ0KLXRyYW5zcG9ydHMsIGFuZCBleHRlbmQgdGhlIFNPQVAgUHJvY2Vzc2luZyBtb2RlbCBwZXIgc3lzdGVtLA0KLXNlcnZpY2UsIG9yIG9wZXJhdGlvbiBiYXNpcy48L3A+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2JtQ2xpZW50QVBJIj5DbGllbnQgQVBJPC9hPiAtIFRoaXMgcHJvdmlkZXMgYQ0KLWNvbnZlbmllbnQgQVBJIGZvciB1c2VycyB0byBjb21tdW5pY2F0ZSB3aXRoIFdlYiBzZXJ2aWNlcyB1c2luZw0KLUF4aXMyLiBUaGVyZSBhcmUgYSBzZXQgb2YgY2xhc3NlcyB0byBpbnRlcmFjdCB3aXRoIElOLU9VVCBhbmQNCi1JTi1Pbmx5IHN0eWxlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvY2cvMi8wNy9tZXBzLmh0bWwiPk1lc3NhZ2UgRXhjaGFuZ2UNCi1QYXR0ZXJucyAoTUVQcyk8L2E+LCB3aGVyZSB0aGV5IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhbnkgb3RoZXINCi1NRVAuIChQbGVhc2Ugbm90ZSB0aGF0IGV2ZW4gaWYgdGhlIGNsaWVudCBBUEkgaGFzIGluLWJ1aWx0IHN1cHBvcnQNCi1mb3IgdGhlIGFib3ZlIG5hbWVkIE1FUHMsIGl0IGRvZXMgbm90IGJ5IGFueSBtZWFucyBsaW1pdCBBeGlzMidzDQotZmxleGliaWxpdHkgdG8gc3VwcG9ydCBjdXN0b20gTUVQcy4pPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2JtVHJhbnNwb3J0cyI+VHJhbnNwb3J0czwvYT4gLSBBeGlzMiBkZWZpbmVzIGENCi10cmFuc3BvcnQgZnJhbWV3b3JrIHRoYXQgZW5hYmxlcyB0aGUgdXNlciB0byB1c2UgbXVsdGlwbGUgZGlmZmVyZW50DQotdHJhbnNwb3J0cy4gVGhlIHRyYW5zcG9ydHMgZml0IGludG8gc3BlY2lmaWMgcGxhY2VzIGluIHRoZSBTT0FQDQotcHJvY2Vzc2luZyBtb2RlbC4gVGhlIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGEgZmV3IGNvbW1vbg0KLXRyYW5zcG9ydHMgYW5kIHRoZSB1c2VyIGNhbiB3cml0ZSBvciBwbHVnLWluIG5ldyBvbmVzIGlmIGFuZCB3aGVuDQotaXQgaXMgbmVlZGVkLjwvcD4NCi08L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iYm1vdGhlciIgaWQ9ImJtb3RoZXIiPjwvYT4NCi08aDM+T3RoZXIgTW9kdWxlczo8L2gzPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2JtV1NETCI+Q29kZSBHZW5lcmF0aW9uPC9hPiAtIEF4aXMyIHByb3ZpZGVzIGEgY29kZQ0KLWdlbmVyYXRpb24gdG9vbCB0aGF0IGdlbmVyYXRlcyBzZXJ2ZXIgc2lkZSBhbmQgY2xpZW50IHNpZGUgY29kZQ0KLWFsb25nIHdpdGggZGVzY3JpcHRvcnMgYW5kIGEgdGVzdCBjYXNlLiBUaGUgZ2VuZXJhdGVkIGNvZGUNCi1zaW1wbGlmaWVzIHRoZSBzZXJ2aWNlIGRlcGxveW1lbnQgYW5kIHRoZSBzZXJ2aWNlIGludm9jYXRpb24sDQotaW5jcmVhc2luZyB0aGUgdXNhYmlsaXR5IG9mIEF4aXMyLjwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNibURCIj5EYXRhIEJpbmRpbmc8L2E+IC0gVGhlIGJhc2ljIGNsaWVudCBBUEkgb2YgQXhpczINCi1sZXRzIHRoZSB1c2VycyBwcm9jZXNzIFNPQVAgYXQgdGhlIGluZm9zZXQgbGV2ZWwsIHdoZXJlYXMgZGF0YQ0KLWJpbmRpbmcgZXh0ZW5kcyBpdCB0byBtYWtlIGl0IG1vcmUgY29udmVuaWVudCB0byB1c2VycyBieQ0KLWVuY2Fwc3VsYXRpbmcgdGhlIGluZm9zZXQgbGF5ZXIgYW5kIHByb3ZpZGluZyBhIHByb2dyYW1taW5nDQotbGFuZ3VhZ2Ugc3BlY2lmaWMgaW50ZXJmYWNlLjwvcD4NCi08L2xpPg0KLTwvdWw+DQotPG1hcCBuYW1lPSJHcmFwaGljMk1hcCIgaWQ9ImcybSI+DQotPGFyZWEgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTIzLDMxLDIyMiw5NyIgaHJlZj0iI2JtSW5mb01vZCIgYWx0PQ0KLSIiIC8+DQotPGFyZWEgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMjM5LDYyLDMxOSwxMzQiIGhyZWY9IiNibVhNTCIgYWx0PSIiIC8+DQotPGFyZWEgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMTI3LDExMiwyMTgsMTc3IiBocmVmPSIjYm1TT0FQUE0iIGFsdD0NCi0iIiAvPg0KLTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjEyLDM5LDg5LDk1IiBocmVmPSIjYm1EZXBsb3ltZW50IiBhbHQ9DQotIiIgLz4NCi08YXJlYSBzaGFwZT0icmVjdCIgY29vcmRzPSIwLDEwOCw5NCwxNTYiIGhyZWY9IiNibVdTREwiIGFsdD0iIiAvPg0KLTxhcmVhIHNoYXBlPSJyZWN0IiBjb29yZHM9IjM1MCwzMSw0MjYsODYiIGhyZWY9IiNibUNsaWVudEFQSSIgYWx0PQ0KLSIiIC8+DQotPGFyZWEgc2hhcGU9InJlY3QiIGNvb3Jkcz0iMzUwLDExNCw0MjEsMTY0IiBocmVmPSIjYm1UcmFuc3BvcnRzIg0KLWFsdD0iIiAvPjwvbWFwPg0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvYXJjaGktZ3VpZGUvYWxsLnBuZyIgbmFtZT0iR3JhcGhpYzIiIHdpZHRoPQ0KLSI0MjYiIGFsdD0iIiBoZWlnaHQ9IjE4OSIgYm9yZGVyPSIwIiBhbGlnbj0iYm90dG9tIiB1c2VtYXA9DQotIiNHcmFwaGljMk1hcCIgaWQ9IkdyYXBoaWMyIiAvPjwvcD4NCi08YSBuYW1lPSJibUluZm9Nb2QiIGlkPSJibUluZm9Nb2QiPjwvYT4NCi08aDI+SW5mb3JtYXRpb24gTW9kZWw8L2gyPg0KLTxwPlRoZSBJbmZvcm1hdGlvbiBNb2RlbCBoYXMgdHdvIG1haW4gaGllcmFyY2hpZXMtLUNvbnRleHRzIGFuZA0KLURlc2NyaXB0aW9ucy4gVGhpcyBtb2RlbCBpcyBkZXNjcmliZWQgaW4gVU1MIG5vdGF0aW9ucyBiZWxvdy48L3A+DQotPHA+PGltZyBzcmM9ImltYWdlcy9hcmNoaS1ndWlkZS9jb250ZXh0cy5wbmciIG5hbWU9IkdyYXBoaWMzIg0KLWFsaWduPSJib3R0b20iIGFsdD0iIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQ0MyIgYm9yZGVyPSIwIiBpZD0NCi0iR3JhcGhpYzMiIC8+PC9wPg0KLTxwPiggQSAtLS0tJmx0OyZndDsgQiBzYXlzLCBCIGhhcyAxIG9yIG1vcmUgb2JqZWN0cyBvZiBBLg0KLUEtLS0tLS0mZ3Q7QiBzYXlzLCB0aGUgZ2l2ZW4gcmVsYXRpb25zaGlwIGhvbGRzIGJldHdlZW4gQSBhbmQNCi1CLik8L3A+DQotPHA+VGhlIHR3byBoaWVyYXJjaGllcyBhcmUgY29ubmVjdGVkIGFzIHNob3duIGluIHRoZSBhYm92ZSBmaWd1cmUuDQotVGhlIERlc2NyaXB0aW9uIGhpZXJhcmNoeSByZXByZXNlbnRzIHRoZSBzdGF0aWMgZGF0YS4gVGhpcyBkYXRhIG1heQ0KLWJlIGxvYWRlZCBmcm9tIGEgY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgZXhpc3RzIHRocm91Z2hvdXQgdGhlDQotbGlmZXRpbWUgb2YgQXhpczIuIEZvciBleGFtcGxlLCBkZXBsb3llZCBXZWIgc2VydmljZXMsIG9wZXJhdGlvbnMsDQotZXRjLiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGNvbnRleHQgaGllcmFyY2h5IGhvbGRzIG1vcmUgZHluYW1pYw0KLWluZm9ybWF0aW9uIGFib3V0IG9iamVjdHMgdGhhdCBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGluc3RhbmNlDQotKGUuZy4sIE1lc3NhZ2UgQ29udGV4dHMpLjwvcD4NCi08cD5UaGVzZSB0d28gaGllcmFyY2hpZXMgY3JlYXRlIGEgbW9kZWwgdGhhdCBwcm92aWRlcyB0aGUgYWJpbGl0eQ0KLXRvIHNlYXJjaCBmb3Iga2V5LXZhbHVlIHBhaXJzLiBXaGVuIHRoZSB2YWx1ZXMgYXJlIHNlYXJjaGVkIGF0IGENCi1naXZlbiBsZXZlbCwgdGhleSBhcmUgc2VhcmNoZWQgd2hpbGUgbW92aW5nIHVwIHRoZSBoaWVyYXJjaHkgdW50aWwNCi1hIG1hdGNoIGlzIGZvdW5kLiBJbiB0aGUgcmVzdWx0aW5nIG1vZGVsLCB0aGUgbG93ZXIgbGV2ZWxzIG92ZXJyaWRlDQotdGhlIHZhbHVlcyBpbiB0aGUgdXBwZXIgbGV2ZWxzLiBGb3IgZXhhbXBsZSwgd2hlbiBhIHZhbHVlIGlzIGxvb2tlZA0KLXVwIGluIHRoZSBNZXNzYWdlIENvbnRleHQgYW5kIGlzIG5vdCBmb3VuZCwgaXQgd291bGQgYmUgbG9va2VkIHVwDQotaW4gdGhlIE9wZXJhdGlvbiBDb250ZXh0LCBldGMsIHVwIHRoZSBoaWVyYXJjaHkuIFRoZSBTZWFyY2ggaXMNCi1maXJzdCBkb25lIHVwIHRoZSBoaWVyYXJjaHksIGFuZCBpZiB0aGUgc3RhcnRpbmcgcG9pbnQgaXMgYSBDb250ZXh0DQotdGhlbiBpdCBzZWFyY2hlcyBpbiB0aGUgRGVzY3JpcHRpb24gaGllcmFyY2h5IGFzIHdlbGwuPC9wPg0KLTxwPlRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGRlY2xhcmUgYW5kIG92ZXJyaWRlIHZhbHVlcywgd2l0aCB0aGUNCi1yZXN1bHQgYmVpbmcgYSB2ZXJ5IGZsZXhpYmxlIGNvbmZpZ3VyYXRpb24gbW9kZWwuIFRoaXMgZmxleGliaWxpdHkNCi1jb3VsZCBiZSB0aGUgPGVtPkFjaGlsbGVzIGhlZWw8L2VtPiBmb3IgdGhlIHN5c3RlbSwgaG93ZXZlciwgYXMNCi1zZWFyY2hlcyBhcmUgZXhwZW5zaXZlLCBlc3BlY2lhbGx5IGZvciBwYXJhbWV0ZXJzIHRoYXQgdHVybiBvdXQgbm90DQotdG8gZXhpc3QuIFlldCBpbiB0aGUgZmluYWwgYW5hbHlzaXMsIHRoZSBBeGlzIFRlYW0gYmVsaWV2ZXMgdGhhdA0KLXRoaXMgZmxleGliaWxpdHkgc2VydmVzIGRldmVsb3BlcnMgYmV0dGVyIG92ZXJhbGwuPC9wPg0KLTx0YWJsZSB3aWR0aD0iOTU1IiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMyI+DQotPGNvbCB3aWR0aD0iMTEyIiAvPg0KLTxjb2wgd2lkdGg9IjM3MSIgLz4NCi08Y29sIHdpZHRoPSIxMDMiIC8+DQotPGNvbCB3aWR0aD0iMzM2IiAvPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPjxzdHJvbmc+Q29udGV4dDwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkNvbmZpZ3VyYXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjExMiI+DQotPHA+Q29uZmlndXJhdGlvbiBDb250ZXh0PC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzNzEiPg0KLTxwPkhvbGRzIHRoZSBBeGlzMidzIHJ1biB0aW1lIHN0YXR1cy4gQSBkZWVwIGNvcHkgb2YgdGhpcyB3b3VsZA0KLWVzc2VudGlhbGx5IG1ha2UgYSBjb3B5IG9mIEF4aXMyLjwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMTAzIj4NCi08cD5BeGlzIENvbmZpZ3VyYXRpb248L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjMzNiI+DQotPHA+SG9sZHMgYWxsIGdsb2JhbCBjb25maWd1cmF0aW9uczogdHJhbnNwb3J0cywgZ2xvYmFsIG1vZHVsZXMsDQotcGFyYW1ldGVycywgc2VydmljZXMsIGV0Yy48L3A+DQotPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjExMiI+DQotPHA+U2VydmljZSBHcm91cCBDb250ZXh0PC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzNzEiPg0KLTxwPkhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciB1c2FnZSBvZiB0aGUgcmVzcGVjdGl2ZQ0KLXNlcnZpY2UgZ3JvdXAuIFRoZSBsaWZlIG9mIGEgU2VydmljZSBHcm91cCBDb250ZXh0IHN0YXJ0cyB3aGVuIGENCi11c2VyIHN0YXJ0cyBpbnRlcmFjdGluZyB3aXRoIGEgc2VydmljZSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBzZXJ2aWNlDQotZ3JvdXAuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2hhcmUgaW5mb3JtYXRpb24gYmV0d2VlbiBzZXJ2aWNlcw0KLSh3aXRoaW4gdGhlIHNhbWUgc2VydmljZSBncm91cCkgaW4gYSBzaW5nbGUgaW50ZXJhY3Rpb24uPC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIxMDMiPg0KLTxwPkF4aXNTZXJ2aWNlR3JvdXA8L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjMzNiI+DQotPHA+SG9sZHMgZGVwbG95bWVudCB0aW1lIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBzZXJ2aWNlDQotZ3JvdXAuPC9wPg0KLTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIxMTIiPg0KLTxwPlNlcnZpY2UgQ29udGV4dDwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzcxIj4NCi08cD5UaGlzIGNvbnRleHQgaXMgYXZhaWxhYmxlIHRocm91Z2hvdXQgdGhlIHVzYWdlIG9mIHRoZSByZXNwZWN0aXZlDQotc2VydmljZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBzaGFyZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIHNldmVyYWwgTUVQcw0KLW9mIHRoZSBzYW1lIHNlcnZpY2UsIHdpdGhpbiBhIHNpbmdsZSBpbnRlcmFjdGlvbi4gVGhlIGxpZmUgY3ljbGUNCi1kZXBlbmRzIG9uIHRoZSBzY29wZSBvZiB0aGUgc2VydmljZS48L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjEwMyI+DQotPHA+QXhpc1NlcnZpY2U8L3A+DQotPC90ZD4NCi08dGQgd2lkdGg9IjMzNiI+DQotPHA+SG9sZHMgdGhlIE9wZXJhdGlvbnMgYW5kIHRoZSBzZXJ2aWNlIGxldmVsIGNvbmZpZ3VyYXRpb25zPC9wPg0KLTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIxMTIiPg0KLTxwPk9wZXJhdGlvbiBDb250ZXh0PC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzNzEiPg0KLTxwPkhvbGRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBNRVAgaW5zdGFuY2UsIG1haW50YWlucw0KLXRoZSBtZXNzYWdlcyBpbiB0aGUgY3VycmVudCBNRVAgZXRjLjwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMTAzIj4NCi08cD5BeGlzT3BlcmF0aW9uPC9wPg0KLTwvdGQ+DQotPHRkIHdpZHRoPSIzMzYiPg0KLTxwPkhvbGRzIHRoZSBvcGVyYXRpb24gbGV2ZWwgY29uZmlndXJhdGlvbnM8L3A+DQotPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjExMiI+PGEgbmFtZT0ibWVzc2FnZUNvbnRleHQiIGlkPSJtZXNzYWdlQ29udGV4dCI+PC9hPg0KLTxwPk1lc3NhZ2UgQ29udGV4dDwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzcxIj4NCi08cD5Ib2xkcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXNzYWdlIGN1cnJlbnRseSBiZWluZw0KLWV4ZWN1dGVkLjwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMTAzIj4NCi08cD5BeGlzTWVzc2FnZTwvcD4NCi08L3RkPg0KLTx0ZCB3aWR0aD0iMzM2Ij4NCi08cD5Ib2xkcyBtZXNzYWdlIGxldmVsIHN0YXRpYyBpbmZvcm1hdGlvbiBsaWtlIHRoZSBzY2hlbWEgb2YgdGhlDQotcGFydGljdWxhciBtZXNzYWdlLjwvcD4NCi08L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxhIG5hbWU9ImJtWE1MIiBpZD0iYm1YTUwiPjwvYT4NCi08aDI+WE1MIFByb2Nlc3NpbmcgTW9kZWw8L2gyPg0KLTxwPkFzIG1lbnRpb25lZCBhYm92ZSwgdGhlIFhNTCBwcm9jZXNzaW5nIG1vZGVsIG9mIEF4aXMyIGhhcyBiZWNvbWUNCi1hIHNlcGFyYXRlIHN1Yi1wcm9qZWN0LCBjYWxsZWQgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvY29tbW9ucy9heGlvbS9pbmRleC5odG1sIj5BcGFjaGUgQXhpb208L2E+LA0KLWluIHRoZSBBcGFjaGUgV2ViIHNlcnZpY2VzIHByb2plY3QuIFBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0NCi0iT01UdXRvcmlhbC5odG1sIj5PTSBUdXRvcmlhbDwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPg0KLTxhIG5hbWU9ImJtU09BUFBNIiBpZD0iYm1TT0FQUE0iPjwvYT4NCi08aDI+U09BUCBQcm9jZXNzaW5nIE1vZGVsPC9oMj4NCi08cD48aW1nIHNyYz0iaW1hZ2VzL2FyY2hpLWd1aWRlL3NvYXAtcHJvY2Vzc2luZy5naWYiIG5hbWU9DQotIkdyYXBoaWM0IiBhbHQ9IiIgYWxpZ249ImJvdHRvbSIgd2lkdGg9Ijc1NSIgaGVpZ2h0PSIzNDgiIGJvcmRlcj0NCi0iMCIgaWQ9IkdyYXBoaWM0IiAvPjwvcD4NCi08cD5UaGUgYXJjaGl0ZWN0dXJlIGlkZW50aWZpZWQgdHdvIGJhc2ljIGFjdGlvbnMgYSBTT0FQIHByb2Nlc3Nvcg0KLXNob3VsZCBwZXJmb3JtLCBzZW5kaW5nIGFuZCByZWNlaXZpbmcgU09BUCBtZXNzYWdlcy4gVGhlDQotYXJjaGl0ZWN0dXJlIHByb3ZpZGVzIHR3byBwaXBlcyAob3IgZmxvd3MpIHRvIHBlcmZvcm0gdGhlc2UgdHdvDQotYmFzaWMgYWN0aW9ucy4gVGhlIEF4aXMgRW5naW5lIG9yIHRoZSBkcml2ZXIgb2YgQXhpczIgZGVmaW5lcyB0d28NCi1tZXRob2RzLCBzZW5kKCkgYW5kIHJlY2VpdmUoKSwgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBwaXBlcy4gVGhlDQotdHdvIHBpcGVzIGFyZSBuYW1lZCA8aT48Yj5JbjwvYj4gUGlwZTwvaT4gYW5kIDxpPjxiPk91dDwvYj4NCi1QaXBlPC9pPiwgYW5kIGNvbXBsZXggTWVzc2FnZSBFeGNoYW5nZSBQYXR0ZXJucyAoTUVQcykgYXJlDQotY29uc3RydWN0ZWQgYnkgY29tYmluaW5nIHRoZXNlIHR3byBwaXBlcy48L3A+DQotPHA+RXh0ZW5zaWJpbGl0eSBvZiB0aGUgU09BUCBwcm9jZXNzaW5nIG1vZGVsIGlzIHByb3ZpZGVkIHRocm91Z2gNCi1oYW5kbGVycy4gV2hlbiBhIFNPQVAgbWVzc2FnZSBpcyBiZWluZyBwcm9jZXNzZWQsIHRoZSBoYW5kbGVycyB0aGF0DQotYXJlIHJlZ2lzdGVyZWQgd2lsbCBiZSBleGVjdXRlZC4gVGhlIGhhbmRsZXJzIGNhbiBiZSByZWdpc3RlcmVkIGluDQotZ2xvYmFsLCBzZXJ2aWNlLCBvciBvcGVyYXRpb24gc2NvcGUgYW5kIHRoZSBmaW5hbCBoYW5kbGVyIGNoYWluIGlzDQotY2FsY3VsYXRlZCBjb21iaW5pbmcgdGhlIGhhbmRsZXJzIGZyb20gYWxsIHRoZSBzY29wZXMuPC9wPg0KLTxwPlRoZSBoYW5kbGVycyBhY3QgYXMgaW50ZXJjZXB0b3JzIGFuZCB0aGV5IHByb2Nlc3MgcGFydHMgb2YgdGhlDQotU09BUCBtZXNzYWdlIGFuZCBwcm92aWRlIGFkZC1vbiBzZXJ2aWNlcy4gVXN1YWxseSBoYW5kbGVycyB3b3JrIG9uDQotdGhlIFNPQVAgaGVhZGVycywgeWV0IHRoZXkgbWF5IGFjY2VzcyBvciBjaGFuZ2UgdGhlIFNPQVAgYm9keSBhcw0KLXdlbGwuPC9wPg0KLTxwPldoZW4gYSBTT0FQIG1lc3NhZ2UgaXMgYmVpbmcgc2VudCB0aHJvdWdoIHRoZSBDbGllbnQgQVBJLCBhbg0KLTxpPk91dCBQaXBlPC9pPiBhY3RpdmF0ZXMuIFRoZSA8aT5PdXQgUGlwZTwvaT4gd2lsbCBpbnZva2UgdGhlDQotaGFuZGxlcnMgYW5kIGVuZCB3aXRoIGEgVHJhbnNwb3J0IFNlbmRlciB0aGF0IHNlbmRzIHRoZSBTT0FQDQotbWVzc2FnZSB0byB0aGUgdGFyZ2V0IGVuZHBvaW50LiBUaGUgU09BUCBtZXNzYWdlIGlzIHJlY2VpdmVkIGJ5IGENCi1UcmFuc3BvcnQgUmVjZWl2ZXIgYXQgdGhlIHRhcmdldCBlbmRwb2ludCwgd2hpY2ggcmVhZHMgdGhlIFNPQVANCi1tZXNzYWdlIGFuZCBzdGFydHMgdGhlIDxpPkluIFBpcGU8L2k+LiBUaGUgPGVtPkluIFBpcGU8L2VtPg0KLWNvbnNpc3RzIG9mIGhhbmRsZXJzIGFuZCBlbmRzIHdpdGggdGhlIDxhIGhyZWY9IiNtciI+TWVzc2FnZQ0KLVJlY2VpdmVyPC9hPiwgd2hpY2ggY29uc3VtZXMgdGhlIFNPQVAgbWVzc2FnZS48L3A+DQotPHA+VGhlIHByb2Nlc3NpbmcgZXhwbGFpbmVkIGFib3ZlIGhhcHBlbnMgZm9yIGVhY2ggYW5kIGV2ZXJ5IFNPQVANCi1tZXNzYWdlIHRoYXQgaXMgZXhjaGFuZ2VkLiBBZnRlciBwcm9jZXNzaW5nIG9uZSBtZXNzYWdlLCBBeGlzMiBtYXkNCi1kZWNpZGUgdG8gY3JlYXRlIG90aGVyIFNPQVAgbWVzc2FnZXMsIGluIHdoaWNoIGNhc2UgbW9yZSBjb21wbGV4DQotbWVzc2FnZSBwYXR0ZXJucyBlbWVyZ2UuIEhvd2V2ZXIsIEF4aXMyIGFsd2F5cyB2aWV3cyB0aGUgU09BUA0KLW1lc3NhZ2UgaW4gdGVybXMgb2YgcHJvY2Vzc2luZyBhIHNpbmdsZSBtZXNzYWdlLiBUaGUgY29tYmluYXRpb24gb2YNCi10aGUgbWVzc2FnZXMgYXJlIGxheWVyZWQgb24gdG9wIG9mIHRoYXQgYmFzaWMgZnJhbWV3b3JrLjwvcD4NCi08cD5UaGUgdHdvIHBpcGVzIGRvIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIFNlcnZlciBhbmQgdGhlDQotQ2xpZW50LiBUaGUgU09BUCBQcm9jZXNzaW5nIE1vZGVsIGhhbmRsZXMgdGhlIGNvbXBsZXhpdHkgYW5kDQotcHJvdmlkZXMgdHdvIGFic3RyYWN0IHBpcGVzIHRvIHRoZSB1c2VyLiBUaGUgZGlmZmVyZW50IGFyZWFzIG9yIHRoZQ0KLXN0YWdlcyBvZiB0aGUgcGlwZXMgYXJlIGNhbGxlZCAncGhhc2VzJyB3aXRoaW4gQXhpczIuIEEgSGFuZGxlcg0KLWFsd2F5cyBydW5zIGluc2lkZSBhIHNwZWNpZmljIHBoYXNlLCBhbmQgdGhlIHBoYXNlIHByb3ZpZGVzIGENCi1tZWNoYW5pc20gdG8gc3BlY2lmeSB0aGUgb3JkZXJpbmcgb2YgaGFuZGxlcnMuIEJvdGggUGlwZXMgaGF2ZQ0KLWJ1aWx0LWluIHBoYXNlcywgYW5kIGJvdGggZGVmaW5lIHRoZSBhcmVhcyBmb3IgJ1VzZXIgUGhhc2VzJyB3aGljaA0KLWNhbiBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyLjwvcD4NCi08YSBuYW1lPSJkZWZhdWx0IiBpZD0iZGVmYXVsdCI+PC9hPg0KLTxoMz5BeGlzMiBEZWZhdWx0IFByb2Nlc3NpbmcgTW9kZWw8L2gzPg0KLTxwPkF4aXMyIGhhcyBzb21lIGluYnVpbHQgaGFuZGxlcnMgdGhhdCBydW4gaW4gaW5idWlsdCBwaGFzZXMgYW5kDQotdGhleSBjcmVhdGUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgQXhpczIuIFdlIHdpbGwgYmUgbG9va2luZw0KLW1vcmUgaW4gdG8gaG93IHRvIGV4dGVuZCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIE1vZGVsIGluIHRoZSBuZXh0DQotc2VjdGlvbi48L3A+DQotVGhlcmUgYXJlIHRocmVlIHNwZWNpYWwgaGFuZGxlcnMgZGVmaW5lZCBpbiBBeGlzMi4NCi08b2w+DQotPGxpPkRpc3BhdGNoZXJzIC0gRmluZHMgdGhlIHNlcnZpY2UgYW5kIHRoZSBvcGVyYXRpb24gdGhlIFNPQVANCi1tZXNzYWdlIGlzIGRpcmVjdGVkIHRvLiBEaXNwYXRjaGVycyBhbHdheXMgcnVuIG9uIHRoZQ0KLTxlbT5Jbi1QaXBlPC9lbT4gYW5kIGluc2lkZSB0aGUgRGlzcGF0Y2ggcGhhc2UuIFRoZSBpbi1idWlsdA0KLWRpc3BhdGNoZXJzIGRpc3BhdGNoIHRvIGEgcGFydGljdWxhciBvcGVyYXRpb24gZGVwZW5kaW5nIG9uIHZhcmlvdXMNCi1jb25kaXRpb25zIGxpa2UgV1MtQWRkcmVzc2luZyBpbmZvcm1hdGlvbiwgVVJJIGluZm9ybWF0aW9uLCBTT0FQDQotYWN0aW9uIGluZm9ybWF0aW9uLCBldGMuICggU2VlIG1vcmUgaW5mb3JtYXRpb24gb24gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53c28yLm5ldC90dXRvcmlhbHMvYXhpczIvamF2YS8yMDA2LzA2LzE4L29wZXJhdGlvbi1zZXJ2aWNlLW1lc3NhZ2UtaXMtZGVzdGluZWQtdG8iPg0KLURpc3BhdGNoaW5nPC9hPik8L2xpPg0KLTwvb2w+DQotPHVsPg0KLTxsaT48YSBuYW1lPSJtciIgaWQ9Im1yIj48L2E+TWVzc2FnZSBSZWNlaXZlciAtIENvbnN1bWVzIHRoZSBTT0FQDQotbWVzc2FnZSBhbmQgaGFuZHMgaXQgb3ZlciB0byB0aGUgYXBwbGljYXRpb24uIFRoZSBtZXNzYWdlIHJlY2VpdmVyDQotaXMgdGhlIGxhc3QgaGFuZGxlciBvZiB0aGUgaW4tcGlwZTwvbGk+DQotPGxpPg0KLTxwPlRyYW5zcG9ydCBTZW5kZXIgLSBTZW5kcyB0aGUgU09BUCBtZXNzYWdlIHRvIHRoZSBTT0FQIGVuZHBvaW50DQotdGhlIG1lc3NhZ2UgaXMgZGVzdGluZWQgdG8uIEFsd2F5cyBydW5zIGFzIHRoZSBsYXN0IGhhbmRsZXIgaW4gdGhlDQotb3V0LXBpcGU8L3A+DQotPC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImluY29taW5nc29hcCIgaWQ9ImluY29taW5nc29hcCI+PC9hPg0KLTxoMz5Qcm9jZXNzaW5nIGFuIEluY29taW5nIFNPQVAgTWVzc2FnZTwvaDM+DQotPHA+QW4gaW5jb21pbmcgU09BUCBtZXNzYWdlIGlzIGFsd2F5cyByZWNlaXZlZCBieSBhIFRyYW5zcG9ydA0KLVJlY2VpdmVyIHdhaXRpbmcgZm9yIHRoZSBTT0FQIG1lc3NhZ2VzLiBPbmNlIHRoZSBTT0FQIG1lc3NhZ2UNCi1hcnJpdmVzLCB0aGUgdHJhbnNwb3J0IEhlYWRlcnMgYXJlIHBhcnNlZCBhbmQgYSA8YSBocmVmPQ0KLSIjbWVzc2FnZUNvbnRleHQiPk1lc3NhZ2UgQ29udGV4dDwvYT4gaXMgY3JlYXRlZCBmcm9tIHRoZSBpbmNvbWluZw0KLVNPQVAgbWVzc2FnZS4gVGhpcyBtZXNzYWdlIGNvbnRleHQgZW5jYXBzdWxhdGVzIGFsbCB0aGUNCi1pbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBTT0FQIG1lc3NhZ2UgaXRzZWxmLCB0cmFuc3BvcnQgaGVhZGVycywNCi1ldGMuLCBpbnNpZGUgaXQuIFRoZW4gdGhlIDxpPkluIFBpcGU8L2k+IGlzIGV4ZWN1dGVkIHdpdGggdGhlDQotTWVzc2FnZSBDb250ZXh0LjwvcD4NCi08cD5MZXQgdXMgc2VlIHdoYXQgaGFwcGVucyBhdCBlYWNoIHBoYXNlIG9mIHRoZSBleGVjdXRpb24uIFRoaXMNCi1wcm9jZXNzIGNhbiBoYXBwZW4gaW4gdGhlIHNlcnZlciBvciBpbiB0aGUgY2xpZW50LjwvcD4NCi08b2w+DQotPGxpPjxzdHJvbmc+VHJhbnNwb3J0IFBoYXNlPC9zdHJvbmc+IC0gVGhlIGhhbmRsZXJzIGFyZSBpbiB0aGUNCi1waGFzZSB0aGF0IHByb2Nlc3NlcyB0cmFuc3BvcnQgc3BlY2lmaWMgaW5mb3JtYXRpb24gc3VjaCBhcw0KLXZhbGlkYXRpbmcgaW5jb21pbmcgbWVzc2FnZXMgYnkgbG9va2luZyBhdCB2YXJpb3VzIHRyYW5zcG9ydA0KLWhlYWRlcnMsIGFkZGluZyBkYXRhIGludG8gbWVzc2FnZSBjb250ZXh0cywgZXRjLjwvbGk+DQotPGxpPjxzdHJvbmc+UHJlLURpc3BhdGNoIFBoYXNlPC9zdHJvbmc+LSBUaGUgbWFpbiBmdW5jdGlvbmFsaXR5IG9mDQotdGhlIGhhbmRsZXJzIGluIHRoaXMgcGhhc2UgaXMgdG8gcG9wdWxhdGUgbWVzc2FnZSBjb250ZXh0IHRvIGRvIHRoZQ0KLWRpc3BhdGNoaW5nLiBGb3IgZXhhbXBsZSwgcHJvY2Vzc2luZyBvZiBhZGRyZXNzaW5nIGhlYWRlcnMgb2YgdGhlDQotU09BUCBtZXNzYWdlLCBpZiBhbnksIGhhcHBlbnMgaW4gdGhpcyBwaGFzZS4gQWRkcmVzc2luZyBoYW5kbGVycw0KLWV4dHJhY3QgaW5mb3JtYXRpb24gYW5kIHB1dCB0aGVtIGluIHRvIHRoZSBtZXNzYWdlIGNvbnRleHQuPC9saT4NCi08bGk+PHN0cm9uZz5EaXNwYXRjaCBQaGFzZTwvc3Ryb25nPiAtIFRoZSBEaXNwYXRjaGVycyBydW4gaW4gdGhpcw0KLXBoYXNlIGFuZCB0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBzZXJ2aWNlIGFuZCBvcGVyYXRpb24gdGhpcw0KLXBhcnRpY3VsYXIgbWVzc2FnZSBpcyBkZXN0aW5lZCBmb3IuPGJyIC8+DQotVGhlIHBvc3QgY29uZGl0aW9uIG9mIHRoZSBkaXNwYXRjaCBwaGFzZSAoYW55IHBoYXNlIGNhbiBjb250YWluIGENCi1wb3N0IGNvbmRpdGlvbikgY2hlY2tzIHdoZXRoZXIgYSBzZXJ2aWNlIGFuZCBhbiBvcGVyYXRpb24gd2VyZQ0KLWZvdW5kIGJ5IHRoZSBkaXNwYXRjaGVycy4gSWYgbm90LCB0aGUgZXhlY3V0aW9uIHdpbGwgaGFsdCBhbmQNCi1yZXR1cm4gYSAic2VydmljZSBub3QgZm91bmQnIGVycm9yLjwvbGk+DQotPGxpPjxzdHJvbmc+VXNlciBEZWZpbmVkIFBoYXNlczwvc3Ryb25nPiAtIFVzZXJzIGNhbiBlbmdhZ2UgdGhlaXINCi1jdXN0b20gaGFuZGxlcnMgaGVyZS48L2xpPg0KLTxsaT48c3Ryb25nPk1lc3NhZ2UgVmFsaWRhdGlvbiBQaGFzZTwvc3Ryb25nPiAtIE9uY2UgdGhlIHVzZXIgbGV2ZWwNCi1leGVjdXRpb24gaGFzIHRha2VuIHBsYWNlLCB0aGlzIHBoYXNlIHZhbGlkYXRlcyB3aGV0aGVyIFNPQVANCi1NZXNzYWdlIFByb2Nlc3NpbmcgaGFzIHRha2VuIHBsYWNlIGNvcnJlY3RseS48L2xpPg0KLTxsaT48c3Ryb25nPk1lc3NhZ2UgUHJvY2Vzc2luZyBQaGFzZTwvc3Ryb25nPiAtIFRoZSBCdXNpbmVzcyBsb2dpYw0KLW9mIHRoZSBTT0FQIG1lc3NhZ2UgaXMgZXhlY3V0ZWQgaGVyZS4gQSA8YSBocmVmPSIjbXIiPk1lc3NhZ2UNCi1SZWNlaXZlcjwvYT4gaXMgcmVnaXN0ZXJlZCB3aXRoIGVhY2ggT3BlcmF0aW9uLiBUaGlzIG1lc3NhZ2UNCi1yZWNlaXZlciAoYXNzb2NpYXRlZCB0byB0aGUgcGFydGljdWxhciBvcGVyYXRpb24pIHdpbGwgYmUgZXhlY3V0ZWQNCi1hcyB0aGUgbGFzdCBoYW5kbGVyIG9mIHRoaXMgcGhhc2UuPC9saT4NCi08L29sPg0KLTxwPlRoZXJlIG1heSBiZSBvdGhlciBoYW5kbGVycyBpbiBhbnkgb2YgdGhlc2UgcGhhc2VzLiBVc2VycyBtYXkNCi11c2UgY3VzdG9tIGhhbmRsZXJzIHRvIG92ZXJyaWRlIHRoZSBwcm9jZXNzaW5nIGxvZ2ljIGluIGVhY2ggb2YNCi10aGVzZSBwaGFzZXMuPC9wPg0KLTxhIG5hbWU9Im91dGdvaW5nIiBpZD0ib3V0Z29pbmciPjwvYT4NCi08aDM+UHJvY2Vzc2luZyBvZiB0aGUgT3V0Z29pbmcgTWVzc2FnZTwvaDM+DQotPHA+VGhlIDxlbT5PdXQgUGlwZTwvZW0+IGlzIHNpbXBsZXIgYmVjYXVzZSB0aGUgc2VydmljZSBhbmQgdGhlDQotb3BlcmF0aW9uIHRvIGRpc3BhdGNoIGFyZSBrbm93biBieSB0aGUgdGltZSB0aGUgcGlwZSBpcyBleGVjdXRlZC4NCi1UaGUgPGVtPk91dCBQaXBlPC9lbT4gbWF5IGJlIGluaXRpYXRlZCBieSB0aGU8L3A+DQotPGEgaHJlZj0iI21yIj5NZXNzYWdlIFJlY2VpdmVyPC9hPiBvciB0aGUgQ2xpZW50IEFQSQ0KLWltcGxlbWVudGF0aW9uLiBQaGFzZXMgb2YgdGhlIDxlbT5PdXQgUGlwZTwvZW0+IGFyZSBkZXNjcmliZWQNCi1iZWxvdzoNCi08b2w+DQotPGxpPjxzdHJvbmc+TWVzc2FnZSBJbml0aWFsaXplIFBoYXNlPC9zdHJvbmc+IC0gRmlyc3QgcGhhc2Ugb2YgdGhlDQotPGVtPk91dCBQaXBlPC9lbT4uIFNlcnZlcyBhcyB0aGUgcGxhY2Vob2xkZXIgZm9yIHRoZSBjdXN0b20NCi1oYW5kbGVycy48L2xpPg0KLTxsaT48c3Ryb25nPlVzZXIgUGhhc2VzPC9zdHJvbmc+IC0gRXhlY3V0ZXMgaGFuZGxlcnMgaW4NCi11c2VyLWRlZmluZWQgcGhhc2VzLjwvbGk+DQotPGxpPjxzdHJvbmc+VHJhbnNwb3J0cyBQaGFzZTwvc3Ryb25nPiAtIEV4ZWN1dGVzIGFueSB0cmFuc3BvcnQNCi1oYW5kbGVycyB0YWtlbiBmcm9tIHRoZSBhc3NvY2lhdGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBUaGUNCi1sYXN0IGhhbmRsZXIgd291bGQgYmUgYSB0cmFuc3BvcnQgc2VuZGVyIHdoaWNoIHdpbGwgc2VuZCB0aGUgU09BUA0KLW1lc3NhZ2UgdG8gdGhlIHRhcmdldCBlbmRwb2ludC48L2xpPg0KLTwvb2w+DQotPGEgbmFtZT0iZXh0ZW5kaW5nIiBpZD0iZXh0ZW5kaW5nIj48L2E+DQotPGgzPkV4dGVuZGluZyB0aGUgU09BUCBQcm9jZXNzaW5nIE1vZGVsPC9oMz4NCi08cD5BYm92ZSwgd2UgZGlzY3Vzc2VkIHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcgbW9kZWwgb2YgQXhpczIuIE5vdw0KLWxldCB1cyBkaXNjdXNzIHRoZSBleHRlbnNpb24gbWVjaGFuaXNtIGZvciB0aGUgU09BUCBwcm9jZXNzaW5nDQotbW9kZWwuIEFmdGVyIGFsbCwgdGhlIHdob2xlIGVmZm9ydCBvZiBtYWtpbmcgdGhpcyBTT0FQDQotZW5naW5lL3Byb2Nlc3NpbmcgbW9kZWwgd2FzIGZvY3VzZWQgb24gbWFraW5nIGl0IGV4dGVuZGFibGUuPC9wPg0KLTxwPlRoZSBpZGVhIGJlaGluZCBpbnRyb2R1Y2luZyBzdGVwLXdpc2UgcHJvY2Vzc2luZyBvZiB0aGUgU09BUA0KLW1lc3NhZ2UgaW4gdGVybXMgb2YgaGFuZGxlcnMgYW5kIHBoYXNlcyBpcyB0byBhbGxvdyBlYXNpZXINCi1tb2RpZmljYXRpb24gb2YgdGhlIHByb2Nlc3Npbmcgb3JkZXIuIFRoZSBub3Rpb24gb2YgcGhhc2VzIG1ha2VzIGl0DQotZWFzaWVyIHRvIHBsYWNlIGhhbmRsZXJzIGluIGJldHdlZW4gb3RoZXIgaGFuZGxlcnMuIFRoaXMgZW5hYmxlcw0KLW1vZGlmaWNhdGlvbiBvZiB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIGJlaGF2aW9yLiBUaGUgU09BUA0KLVByb2Nlc3NpbmcgTW9kZWwgY2FuIGJlIGV4dGVuZGVkIHdpdGggPGEgaHJlZj0NCi0iI2V4dGVuZGluZ3dpdGhoYW5kbGVycyI+aGFuZGxlcnM8L2E+IG9yIDxhIGhyZWY9DQotIiNleHRlbmRpbmd3aXRobW9kdWxlcyI+bW9kdWxlczwvYT4uPC9wPg0KLTxoND5FeHRlbmRpbmcgdGhlIFNPQVAgUHJvY2Vzc2luZyBNb2RlbCB3aXRoIEhhbmRsZXJzPC9oND4NCi08cD5UaGUgaGFuZGxlcnMgaW4gYSBtb2R1bGUgY2FuIHNwZWNpZnkgdGhlIHBoYXNlIHRoZXkgbmVlZCB0byBiZQ0KLXBsYWNlZCBpbi4gRnVydGhlcm1vcmUsIHRoZXkgY2FuIHNwZWNpZnkgdGhlaXIgbG9jYXRpb24gaW5zaWRlIGENCi1waGFzZSBieSBwcm92aWRpbmcgcGhhc2UgcnVsZXMuIFBoYXNlIHJ1bGVzIHdpbGwgcGxhY2UgYQ0KLWhhbmRsZXIsPC9wPg0KLTxvbD4NCi08bGk+YXMgdGhlIGZpcnN0IGhhbmRsZXIgaW4gYSBwaGFzZSw8L2xpPg0KLTxsaT5hcyB0aGUgbGFzdCBoYW5kbGVyIGluIGEgcGhhc2UsPC9saT4NCi08bGk+YmVmb3JlIGEgZ2l2ZW4gaGFuZGxlciw8L2xpPg0KLTxsaT5vciBhZnRlciBhIGdpdmVuIGhhbmRsZXIuPC9saT4NCi08L29sPg0KLTxhIG5hbWU9ImV4dGVuZGluZ3dpdGhtb2R1bGVzIiBpZD0iZXh0ZW5kaW5nd2l0aG1vZHVsZXMiPjwvYT4NCi08aDQ+RXh0ZW5kaW5nIHRoZSBTT0FQIFByb2Nlc3NpbmcgTW9kZWwgd2l0aCBNb2R1bGVzPC9oND4NCi08cD5BeGlzMiBkZWZpbmVzIGFuIGVudGl0eSBjYWxsZWQgYSAnbW9kdWxlJyB0aGF0IGNhbiBpbnRyb2R1Y2UNCi1oYW5kbGVycyBhbmQgV2ViIHNlcnZpY2Ugb3BlcmF0aW9ucy4gQSBNb2R1bGUgaW4gdGVybXMgb2YgQXhpczINCi11c3VhbGx5IGFjdHMgYXMgYSBjb252ZW5pZW50IHBhY2thZ2luZyB0aGF0IGluY2x1ZGVzOjwvcD4NCi08dWw+DQotPGxpPkEgc2V0IG9mIGhhbmRsZXJzIGFuZDwvbGk+DQotPGxpPkFuIGFzc29jaWF0ZWQgZGVzY3JpcHRvciB3aGljaCBpbmNsdWRlcyB0aGUgcGhhc2UgcnVsZXM8L2xpPg0KLTwvdWw+DQotPHA+TW9kdWxlcyBoYXZlIHRoZSBjb25jZXB0IG9mIGJlaW5nICdhdmFpbGFibGUnIGFuZCAnZW5nYWdlZCcuDQotJ0F2YWlsYWJpbGl0eScgbWVhbnMgdGhlIG1vZHVsZSBpcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0sIGJ1dCBoYXMNCi1ub3QgYmVlbiBhY3RpdmF0ZWQsIGkuZS4sIHRoZSBoYW5kbGVycyBpbmNsdWRlZCBpbnNpZGUgdGhlIG1vZHVsZQ0KLWhhdmUgbm90IGJlZW4gdXNlZCBpbiB0aGUgcHJvY2Vzc2luZyBtZWNoYW5pc20uIFdoZW4gYSBtb2R1bGUgaXMNCi0nZW5nYWdlZCcgaXQgYmVjb21lcyBhY3RpdmUgYW5kIHRoZSBoYW5kbGVycyBnZXQgcGxhY2VkIGluIHRoZQ0KLXByb3BlciBwaGFzZXMuIFRoZSBoYW5kbGVycyB3aWxsIGFjdCBpbiB0aGUgc2FtZSB3YXkgYXMgZXhwbGFpbmVkDQotaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24uIFVzdWFsbHkgYSBtb2R1bGUgd2lsbCBiZSB1c2VkIHRvIGltcGxlbWVudA0KLWEgV1MtKiBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgV1MtQWRkcmVzc2luZy48L3A+DQotPHA+QXBhcnQgZnJvbSB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSBiYXNlZCBvbiB0aGUgaGFuZGxlcnMsIHRoZQ0KLVdTLSogc3BlY2lmaWNhdGlvbnMgbWF5IHN1Z2dlc3QgYSByZXF1aXJlbWVudCBmb3IgYWRkaW5nIG5ldw0KLW9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCBvbmNlIGEgdXNlciBhZGRzIFJlbGlhYmxlIE1lc3NhZ2luZw0KLWNhcGFiaWxpdHkgdG8gYSBzZXJ2aWNlLCB0aGUgIkNyZWF0ZSBTZXF1ZW5jZSIgb3BlcmF0aW9uIG5lZWRzIHRvDQotYmUgYXZhaWxhYmxlIHRvIHRoZSBzZXJ2aWNlIGVuZHBvaW50LiBUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBieQ0KLWxldHRpbmcgdGhlIG1vZHVsZXMgZGVmaW5lIHRoZSBvcGVyYXRpb25zLiBPbmNlIHRoZSBtb2R1bGUgaXMNCi1lbmdhZ2VkIHRvIGEgc2VydmljZSwgdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb25zIHdpbGwgYmUgYWRkZWQgdG8NCi10aGF0IHNlcnZpY2UuPC9wPg0KLTxwPkEgc2VydmljZSwgb3BlcmF0aW9uLCBvciB0aGUgc3lzdGVtIG1heSBlbmdhZ2UgYSBtb2R1bGUuIE9uY2UNCi10aGUgbW9kdWxlIGlzIGVuZ2FnZWQsIHRoZSBoYW5kbGVycyBhbmQgdGhlIG9wZXJhdGlvbnMgZGVmaW5lZCBpbg0KLXRoZSBtb2R1bGUgYXJlIGFkZGVkIHRvIHRoZSBlbnRpdHkgdGhhdCBlbmdhZ2VkIHRoZW0uPC9wPg0KLTxwPk1vZHVsZXMgY2Fubm90IGJlIGFkZGVkIChubyBob3QgZGVwbG95bWVudCkgd2hpbGUgdGhlIEF4aXMyDQotZW5naW5lIGlzIHJ1bm5pbmcsIGJ1dCB0aGV5IHdpbGwgYmUgYXZhaWxhYmxlIG9uY2UgdGhlIHN5c3RlbSBpcw0KLXJlc3RhcnRlZC48L3A+DQotPGEgbmFtZT0iYm1EZXBsb3ltZW50IiBpZD0iYm1EZXBsb3ltZW50Ij48L2E+DQotPGgyPkRlcGxveW1lbnQ8L2gyPg0KLTxwPlRoZSBEZXBsb3ltZW50IE1vZGVsIHByb3ZpZGVzIGEgY29uY3JldGUgbWVjaGFuaXNtIHRvIGNvbmZpZ3VyZQ0KLUF4aXMyLiBUaGlzIG1vZGVsIGhhcyB0aHJlZSBlbnRpdGllcyB0aGF0IHByb3ZpZGUgdGhlDQotY29uZmlndXJhdGlvbi48L3A+DQotPGEgbmFtZT0ieG1sZmlsZSIgaWQ9InhtbGZpbGUiPjwvYT4NCi08aDM+VGhlIGF4aXMyLnhtbCBmaWxlPC9oMz4NCi08cD5UaGlzIGZpbGUgaG9sZHMgdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgY2xpZW50IGFuZA0KLXNlcnZlciwgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246PC9wPg0KLTxvbD4NCi08bGk+VGhlIGdsb2JhbCBwYXJhbWV0ZXJzPC9saT4NCi08bGk+UmVnaXN0ZXJlZCB0cmFuc3BvcnQtaW4gYW5kIHRyYW5zcG9ydC1vdXRzPC9saT4NCi08bGk+VXNlci1kZWZpbmVkIHBoYXNlIG5hbWVzPC9saT4NCi08bGk+TW9kdWxlcyB0aGF0IGFyZSBlbmdhZ2VkIGdsb2JhbGx5ICh0byBhbGwgc2VydmljZXMpPC9saT4NCi08bGk+R2xvYmFsbHkgZGVmaW5lZCA8YSBocmVmPSIjbXIiPk1lc3NhZ2UgUmVjZWl2ZXJzPC9hPjwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJzZXJ2aWNlYXJjaGl2ZSIgaWQ9InNlcnZpY2VhcmNoaXZlIj48L2E+DQotPGgzPlNlcnZpY2UgQXJjaGl2ZTwvaDM+DQotPHA+VGhlIFNlcnZpY2UgYXJjaGl2ZSBtdXN0IGhhdmUgYSA8ZW0+TUVUQS1JTkYvc2VydmljZXMueG1sPC9lbT4gZmlsZSBhbmQgbWF5DQotY29udGFpbiB0aGUgZGVwZW5kZW50IGNsYXNzZXMuIFBsZWFzZSBzZWUgbW9kdWxlcy9rZXJuZWwvcmVzb3VyY2VzL3NlcnZpY2VzLnhzZCBpbiANCi10aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHNjaGVtYSBmb3Igc2VydmljZXMueG1sLiBUaGUgPGVtPnNlcnZpY2VzLnhtbDwvZW0+IGZpbGUgaGFzDQotdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbi48L3A+DQotPG9sPg0KLTxsaT5TZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnM8L2xpPg0KLTxsaT5Nb2R1bGVzIHRoYXQgYXJlIGVuZ2FnZWQgYXQgc2VydmljZSBsZXZlbDwvbGk+DQotPGxpPlNlcnZpY2UgU3BlY2lmaWMgPGEgaHJlZj0iI21yIj5NZXNzYWdlIFJlY2VpdmVyczwvYT48L2xpPg0KLTxsaT5PcGVyYXRpb25zIGluc2lkZSB0aGUgc2VydmljZTwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJtb2R1bGVhcmNoaXZlIiBpZD0ibW9kdWxlYXJjaGl2ZSI+PC9hPg0KLTxoMz5Nb2R1bGUgQXJjaGl2ZTwvaDM+DQotPHA+TW9kdWxlIGFyY2hpdmUgbXVzdCBoYXZlIGEgTUVUQS1JTkYvPGEgaHJlZj0NCi0icmVzb3VyY2VzL3NjaGVtYXMvbW9kdWxlLnhzZCI+bW9kdWxlLnhtbDwvYT4gZmlsZSBhbmQgZGVwZW5kZW50DQotY2xhc3Nlcy4gVGhlIDxlbT5tb2R1bGUueG1sPC9lbT4gZmlsZSBoYXMgTW9kdWxlIHBhcmFtZXRlcnMgYW5kIHRoZQ0KLU9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLjwvcD4NCi08cD5XaGVuIHRoZSBzeXN0ZW0gc3RhcnRzIHVwLCBBeGlzMiBwcm9tcHRzIHRoZSBkZXBsb3ltZW50IG1vZGVsIHRvDQotY3JlYXRlIGFuIEF4aXMgQ29uZmlndXJhdGlvbi4gVGhlIGRlcGxveW1lbnQgbW9kZWwgZmlyc3QgZmluZHMgdGhlDQotYXhpczIueG1sIGZpbGUgYW5kIGJ1aWxkcyB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24uIFRoZW4gaXQgY2hlY2tzDQotZm9yIHRoZSBtb2R1bGUgYXJjaGl2ZXMgYW5kIHRoZW4gZm9yIHRoZSBzZXJ2aWNlIGFyY2hpdmVzLiBBZnRlcg0KLXRoYXQsIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZpY2VzIGFuZCBtb2R1bGVzIGFyZSBhZGRlZCB0byB0aGUgQXhpcw0KLUNvbmZpZ3VyYXRpb24uIFRoZSBzeXN0ZW0gd2lsbCBidWlsZCBjb250ZXh0cyBvbiB0b3Agb2YgdGhlIEF4aXMNCi1Db25maWd1cmF0aW9uLiBBZnRlciB0aGlzLCBBeGlzMiBpcyByZWFkeSB0byBzZW5kIG9yIHJlY2VpdmUgU09BUA0KLW1lc3NhZ2VzLiBIb3QgZGVwbG95bWVudCBpcyBvbmx5IGFsbG93ZWQgZm9yIHNlcnZpY2VzLjwvcD4NCi08YSBuYW1lPSJibUNsaWVudEFQSSIgaWQ9ImJtQ2xpZW50QVBJIj48L2E+DQotPGgyPkNsaWVudCBBUEk8L2gyPg0KLTxwPlRoZXJlIGFyZSB0aHJlZSBwYXJhbWV0ZXJzIHRoYXQgZGVjaWRlIHRoZSBuYXR1cmUgb2YgdGhlIFdlYg0KLXNlcnZpY2UgaW50ZXJhY3Rpb24uPC9wPg0KLTxvbD4NCi08bGk+TWVzc2FnZSBFeGNoYW5nZSBQYXR0ZXJuIChNRVApPC9saT4NCi08bGk+VGhlIGJlaGF2aW9yIG9mIHRoZSB0cmFuc3BvcnQsIHdoZXRoZXIgaXQncyBPbmUtV2F5IG9yDQotVHdvLVdheTwvbGk+DQotPGxpPlN5bmNocm9ub3VzL0FzeW5jaHJvbm91cyBiZWhhdmlvciBvZiB0aGUgQ2xpZW50IEFQSTwvbGk+DQotPC9vbD4NCi08cD5WYXJpYXRpb25zIG9mIHRoZSB0aHJlZSBwYXJhbWV0ZXJzIGNhbiByZXN1bHQgaW4gYW4gaW5kZWZpbml0ZQ0KLW51bWJlciBvZiBzY2VuYXJpb3MuIEV2ZW4gdGhvdWdoIEF4aXMyIGlzIGJ1aWx0IG9uIGEgY29yZSB0aGF0DQotc3VwcG9ydHMgYW55IG1lc3NhZ2luZyBpbnRlcmFjdGlvbiwgdGhlIGRldmVsb3BlcnMgd2VyZSBjb21wZWxsZWQNCi10byBwcm92aWRlIGJ1aWx0LWluIHN1cHBvcnQgZm9yIG9ubHkgdGhlIHR3byBtb3N0IHdpZGVseSB1c2VkDQotTWVzc2FnZSBFeGNoYW5nZSBQYXR0ZXJucyAoTUVQcykuPC9wPg0KLTxwPlRoZSB0d28gc3VwcG9ydGVkIE1FUHMgYXJlIE9uZS1XYXkgYW5kIHRoZSBJbi1PdXQNCi0oUmVxdWVzdC1SZXNwb25zZSkgc2NlbmFyaW9zIGluIHRoZSBDbGllbnQgQVBJLiBUaGUgaW1wbGVtZW50YXRpb24NCi1pcyBiYXNlZCBvbiBhIGNsYXNzIGNhbGxlZCA8Y29kZT5TZXJ2aWNlQ2xpZW50PC9jb2RlPiBhbmQgdGhlcmUgYXJlDQotZXh0ZW5zaW9ucyBmb3IgZWFjaCBNRVAgdGhhdCBBeGlzMiBDbGllbnQgQVBJIHN1cHBvcnRzLjwvcD4NCi08YSBuYW1lPSJvbmV3YXkiIGlkPSJvbmV3YXkiPjwvYT4NCi08aDM+T25lIFdheSBNZXNzYWdpbmcgU3VwcG9ydDwvaDM+DQotPHA+VGhlIE9uZS1XYXkgc3VwcG9ydCBpcyBwcm92aWRlZCBieSB0aGUNCi08Y29kZT5maXJlQW5kRm9yZ2V0PC9jb2RlPiBtZXRob2Qgb2YgPGNvZGU+U2VydmljZUNsaWVudDwvY29kZT4uDQotRm9yIG9uZSB3YXkgaW52b2NhdGlvbnMsIG9uZSBjYW4gdXNlIEhUVFAsIFNNVFAgYW5kIFRDUCB0cmFuc3BvcnRzLg0KLUluIHRoZSBjYXNlIG9mIHRoZSBIVFRQIHRyYW5zcG9ydCwgdGhlIHJldHVybiBjaGFubmVsIGlzIG5vdCB1c2VkLA0KLWFuZCB0aGUgSFRUUCAyMDIgT0sgaXMgcmV0dXJuZWQgaW4gdGhlIHJldHVybiBjaGFubmVsLjwvcD4NCi08YSBuYW1lPSJyZXF1ZXN0cmVzcG9uc2UiIGlkPSJyZXF1ZXN0cmVzcG9uc2UiPjwvYT4NCi08aDM+SW4tT3V0IChSZXF1ZXN0IFJlc3BvbnNlKSBNZXNzYWdpbmcgU3VwcG9ydDwvaDM+DQotPHA+VGhlIEluLU91dCBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IHRoZSA8Y29kZT5zZW5kUmVjZWl2ZSgpPC9jb2RlPg0KLW1ldGhvZCBpbiBTZXJ2aWNlQ2xpZW50LiBUaGlzIHByb3ZpZGVzIGEgc2ltcGxlciBpbnRlcmZhY2UgZm9yIHRoZQ0KLXVzZXIuIFRoZSBDbGllbnQgQVBJIGhhcyBmb3VyIHdheXMgdG8gY29uZmlndXJlIGEgZ2l2ZW4gbWVzc2FnZQ0KLWV4Y2hhbmdlPC9wPg0KLTxvbD4NCi08bGk+QmxvY2tpbmcgb3IgTm9uLUJsb2NraW5nIG5hdHVyZSAtIHRoaXMgY2FuIGJlIGRlY2lkZWQgYnkgdXNpbmcNCi08Y29kZT5zZW5kUmVjZWl2ZSgpPC9jb2RlPiBvciA8Y29kZT5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKCk8L2NvZGU+DQotbWV0aG9kczwvbGk+DQotPGxpPlNlbmRlciB0cmFuc3BvcnQgLSB0cmFuc3BvcnQgdGhhdCBzZW5kcyB0aGUgU09BUCBtZXNzYWdlPC9saT4NCi08bGk+TGlzdGVuZXIgdHJhbnNwb3J0IC0gdHJhbnNwb3J0IHRoYXQgcmVjZWl2ZXMgdGhlIHJlc3BvbnNlPC9saT4NCi08bGk+VXNlIFNlcGFyYXRlIENoYW5uZWwgLSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHJlc3BvbnNlIGlzIHNlbnQNCi1vdmVyIGEgc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24gb3Igbm90LiBUaGlzIGNhbiBiZSBmYWxzZSBvbmx5DQotd2hlbiB0aGUgc2VuZGVyIGFuZCBsaXN0ZW5lciB0cmFuc3BvcnQgaXMgc2FtZSBhbmQgaXMgYSBUd28tV2F5DQotdHJhbnNwb3J0LjwvbGk+DQotPC9vbD4NCi08cD5EZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiB0aGUgYWJvdmUgZm91ciBwYXJhbWV0ZXJzLCBBeGlzMg0KLWJlaGF2ZXMgZGlmZmVyZW50bHkuPC9wPg0KLTxhIG5hbWU9ImJtVHJhbnNwb3J0cyIgaWQ9ImJtVHJhbnNwb3J0cyI+PC9hPg0KLTxoMj5UcmFuc3BvcnRzPC9oMj4NCi08cD5BeGlzMiBoYXMgdHdvIGJhc2ljIGNvbnN0cnVjdHMgZm9yIHRyYW5zcG9ydHMsIG5hbWVseTogVHJhbnNwb3J0DQotU2VuZGVycyBhbmQgVHJhbnNwb3J0IFJlY2VpdmVycy4gVGhlc2UgYXJlIGFjY2Vzc2VkIHZpYSB0aGUNCi1BeGlzQ29uZmlndXJhdGlvbi48L3A+DQotPHA+VGhlIGluY29taW5nIHRyYW5zcG9ydCBpcyB0aGUgdHJhbnNwb3J0IHZpYSB3aGljaCB0aGUgQXhpc0VuZ2luZQ0KLXJlY2VpdmVzIHRoZSBtZXNzYWdlLiBUaGUgb3V0Z29pbmcgdHJhbnNwb3J0IGlzIGRlY2lkZWQgYmFzZWQgb24NCi10aGUgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiAod3NhOlJlcGx5VG8gYW5kIHdzYTpGYXVsdFRvKS4gSWYNCi1hZGRyZXNzaW5nIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgYW5kIGlmIHRoZSBzZXJ2ZXIgaXMgdHJ5aW5nDQotdG8gcmVzcG9uZCwgdGhlbiB0aGUgb3V0IGdvaW5nIHRyYW5zcG9ydCB3aWxsIGJlIHRoZSBvdXRwdXQgc3RyZWFtDQotb2YgdGhlIGluY29taW5nIHRyYW5zcG9ydCAoaWYgaXQgaXMgdHdvLXdheSB0cmFuc3BvcnQpLjwvcD4NCi08cD5BdCB0aGUgY2xpZW50IHNpZGUsIHRoZSB1c2VyIGlzIGZyZWUgdG8gc3BlY2lmeSB0aGUgdHJhbnNwb3J0IHRvDQotYmUgdXNlZC48L3A+DQotPHA+VHJhbnNwb3J0IFNlbmRlcnMgYW5kIFRyYW5zcG9ydCBSZWNlaXZlcnMgY29udGFpbiB0aGUgZm9sbG93aW5nDQotaW5mb3JtYXRpb24uPC9wPg0KLTxvbD4NCi08bGk+VHJhbnNwb3J0IFNlbmRlciBmb3IgT3V0IENvbmZpZ3VyYXRpb248L2xpPg0KLTxsaT5UcmFuc3BvcnQgTGlzdGVuZXIgZm9yIEluIENvbmZpZ3VyYXRpb248L2xpPg0KLTxsaT5QYXJhbWV0ZXJzIG9mIHRoZSB0cmFuc3BvcnQ8L2xpPg0KLTwvb2w+DQotPHA+RWFjaCBhbmQgZXZlcnkgdHJhbnNwb3J0IG91dCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB0cmFuc3BvcnQNCi1zZW5kZXIuIFRoZSB0cmFuc3BvcnQgc2VuZGVyIHNlbmRzIHRoZSBTT0FQIG1lc3NhZ2UgZGVwZW5kaW5nIG9uDQotaXRzIGNvbmZpZ3VyYXRpb24uPC9wPg0KLTxwPlRoZSB0cmFuc3BvcnQgcmVjZWl2ZXIgd2FpdHMgZm9yIHRoZSBTT0FQIG1lc3NhZ2VzLCBhbmQgZm9yIGVhY2gNCi1TT0FQIG1lc3NhZ2UgdGhhdCBhcnJpdmVzLCBpdCB1c2VzIHRoZSA8aT5JbiBQaXBlPC9pPiB0byBwcm9jZXNzDQotdGhlIFNPQVAgbWVzc2FnZS48L3A+DQotPHA+QXhpczIgcHJlc2VudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdHJhbnNwb3J0czo8L3A+DQotPG9sPg0KLTxsaT5IVFRQIC0gSW4gSFRUUCB0cmFuc3BvcnQsIHRoZSB0cmFuc3BvcnQgbGlzdGVuZXIgaXMgYSBzZXJ2bGV0DQotb3Igb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIHByb3ZpZGVkIGJ5DQotQXhpczIuIFRoZSB0cmFuc3BvcnQgc2VuZGVyIHVzZXMgY29tbW9ucy1odHRwY2xpZW50IHRvIGNvbm5lY3QgYW5kDQotc2VuZCB0aGUgU09BUCBtZXNzYWdlLjwvbGk+DQotPGxpPlRDUCAtIFRoaXMgaXMgdGhlIHNpbXBsZXN0IHRyYW5zcG9ydCwgYnV0IG5lZWRzIFdTLUFkZHJlc3NpbmcNCi1zdXBwb3J0IHRvIGJlIGZ1bmN0aW9uYWwuPC9saT4NCi08bGk+U01UUCAtIFRoaXMgd29ya3Mgb2ZmIGEgc2luZ2xlIGVtYWlsIGFjY291bnQuIFRyYW5zcG9ydA0KLXJlY2VpdmVyIGlzIGEgdGhyZWFkIHRoYXQgY2hlY2tzIGZvciBlbWFpbHMgYXQgZml4ZWQgdGltZQ0KLWludGVydmFscy48L2xpPg0KLTxsaT5KTVM8L2xpPg0KLTwvb2w+DQotPGEgbmFtZT0iYm1XU0RMIiBpZD0iYm1XU0RMIj48L2E+DQotPGgyPkNvZGUgR2VuZXJhdGlvbjwvaDI+DQotPHA+QWx0aG91Z2ggdGhlIGJhc2ljIG9iamVjdGl2ZSBvZiB0aGUgY29kZSBnZW5lcmF0aW9uIHRvb2xzIGhhcw0KLW5vdCBjaGFuZ2VkLCB0aGUgY29kZSBnZW5lcmF0aW9uIG1vZHVsZSBvZiBBeGlzMiBoYXMgdGFrZW4gYQ0KLWRpZmZlcmVudCBhcHByb2FjaCB0byBnZW5lcmF0ZSBjb2RlLiBQcmltYXJpbHksIHRoZSBjaGFuZ2UgaXMgaW4NCi10aGUgdXNlIG9mIHRlbXBsYXRlcywgbmFtZWx5IFhTTCB0ZW1wbGF0ZXMsIHdoaWNoIGdpdmVzIHRoZSBjb2RlDQotZ2VuZXJhdG9yIHRoZSBmbGV4aWJpbGl0eSB0byBnZW5lcmF0ZSBjb2RlIGluIG11bHRpcGxlDQotbGFuZ3VhZ2VzLjwvcD4NCi08cD5UaGUgYmFzaWMgYXBwcm9hY2ggaXMgdG8gc2V0IHRoZSBjb2RlIGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhbg0KLVhNTCwgYW5kIHBhcnNlIGl0IHdpdGggYSB0ZW1wbGF0ZSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmaWxlLiBUaGUNCi1mb2xsb3dpbmcgZmlndXJlIGRlc2NyaWJlcyBob3cgdGhpcyBzaG93cyB1cCBpbiB0aGUgYXJjaGl0ZWN0dXJlIG9mDQotdGhlIHRvb2wuPC9wPg0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS1uZXcuZ2lmIiBuYW1lPQ0KLSJHcmFwaGljNiIgYWx0PSIiIGFsaWduPSJib3R0b20iIGJvcmRlcj0iMCIgaWQ9IkdyYXBoaWM2IiAvPjwvcD4NCi08cD5UaGUgZmFjdCBoZXJlIGlzIHRoYXQgaXQgaXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gdGhhdCBpcw0KLWV4dHJhY3RlZCBmcm9tIHRoZSBXU0RMIG5vIG1hdHRlciB3aGF0IG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4NCi1GaXJzdCwgYW4gQXhpc1NlcnZpY2UgaXMgcG9wdWxhdGVkIGZyb20gYSBXU0RMLiBUaGVuIHRoZSBjb2RlDQotZ2VuZXJhdG9yIGV4dHJhY3RzIGluZm9ybWF0aW9uIGZyb20gdGhlIEF4aXNTZXJ2aWNlIGFuZCBjcmVhdGVzIGFuDQotWE1MLCB3aGljaCBpcyBsYW5ndWFnZSBpbmRlcGVuZGVudC4gVGhpcyBlbWl0dGVkIFhNTCBpcyB0aGVuIHBhcnNlZA0KLXdpdGggdGhlIHJlbGV2YW50IFhTTCB0byBnZW5lcmF0ZSBjb2RlIGluIHRoZSBkZXNpcmVkIG91dHB1dA0KLWxhbmd1YWdlLiBObyBtYXR0ZXIgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlIGlzLCB0aGUgcHJvY2VzcyBpcyB0aGUNCi1zYW1lIGV4Y2VwdCBmb3IgdGhlIFhTTCB0ZW1wbGF0ZSB0aGF0IGlzIHVzZWQuPC9wPg0KLTxhIG5hbWU9ImJtREIiIGlkPSJibURCIj48L2E+DQotPGgyPkRhdGEgQmluZGluZzwvaDI+DQotPGgzPkludGVncmF0aW9uIHdpdGggdGhlIENvZGUgR2VuZXJhdGlvbiBFbmdpbmU8L2gzPg0KLTxwPkRhdGFiaW5kaW5nIGZvciBBeGlzMiBpcyBpbXBsZW1lbnRlZCBpbiBhbiBpbnRlcmVzdGluZyBtYW5uZXIuDQotRGF0YWJpbmRpbmcgaGFzIG5vdCBiZWVuIGluY2x1ZGVkIGluIHRoZSBjb3JlIGRlbGliZXJhdGVseSwgYW5kDQotaGVuY2UgdGhlIGNvZGUgZ2VuZXJhdGlvbiBhbGxvd3MgZGlmZmVyZW50IGRhdGEgYmluZGluZyBmcmFtZXdvcmtzDQotdG8gYmUgcGx1Z2dlZCBpbi4gVGhpcyBpcyBkb25lIHRocm91Z2ggYW4gZXh0ZW5zaW9uIG1lY2hhbmlzbSB3aGVyZQ0KLXRoZSBjb2RlZ2VuIGVuZ2luZSBmaXJzdCBjYWxscyB0aGUgZXh0ZW5zaW9ucyBhbmQgdGhlbiBleGVjdXRlcyB0aGUNCi1jb3JlIGVtaXR0ZXIuIFRoZSBleHRlbnNpb25zIHBvcHVsYXRlIGEgbWFwIG9mIFFOYW1lcyB2cy4gY2xhc3MNCi1uYW1lcyB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY29kZSBnZW5lcmF0b3Igb24gd2hpY2ggdGhlIGVtaXR0ZXINCi1vcGVyYXRlcyBvbi48L3A+DQotPHA+PHN0cm9uZz5UaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MgdGhlIHN0cnVjdHVyZTo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBzcmM9ImltYWdlcy9jb2RlZ2VuLmdpZiIgbmFtZT0iR3JhcGhpYzciIGFsaWduPSJib3R0b20iDQotYm9yZGVyPSIwIiBpZD0iR3JhcGhpYzciIC8+PC9wPg0KLTxwPjxzdHJvbmc+VGhlIGZvbGxvd2luZyBkYXRhYmluZGluZyBleHRlbnNpb25zIGFyZQ0KLWF2YWlsYWJsZTo8L3N0cm9uZz48L3A+DQotPG9sPg0KLTxsaT48c3Ryb25nPkFEQjwvc3Ryb25nPiAtIEFEQiAoQXhpcyBEYXRhIEJpbmRpbmcgKSBpcyBhIHNpbXBsZQ0KLWZyYW1ld29yayB0aGF0IGFsbG93cyBzaW1wbGUgc2NoZW1hcyB0byBiZSBjb21waWxlZC4gSXQgaXMNCi1saWdodHdlaWdodCBhbmQgc2ltcGxlLCB3b3JrcyBvZmYgU3RBWCBhbmQgZmFpcmx5IHBlcmZvcm1hbnQuDQotSG93ZXZlciwgaXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29tcGxldGUgc2V0IG9mIHNjaGVtYSBjb25zdHJ1Y3RzDQotYW5kIGlzIGxpa2VseSB0byBjb21wbGFpbiBmb3IgY2VydGFpbiBzY2hlbWFzITwvbGk+DQotPGxpPjxzdHJvbmc+WE1MQmVhbnM8L3N0cm9uZz4gLSBYTUxiZWFucyBjbGFpbXMgdGhhdCBpdCBzdXBwb3J0cw0KLXRoZSBjb21wbGV0ZSBzY2hlbWEgc3BlY2lmaWNhdGlvbiwgYW5kIGl0IGlzIHByZWZlcnJlZCBpZiBmdWxsDQotc2NoZW1hIHN1cHBvcnQgaXMgbmVlZGVkITwvbGk+DQotPGxpPjxzdHJvbmc+SkFYQi1SSTwvc3Ryb25nPiAtIEpBWEIyIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgaW4gYQ0KLXNpbWlsYXIgbWFubmVyIHRvIFhNTGJlYW5zIGFuZCBzZXJ2ZXMgYXMgYW5vdGhlciBvcHRpb24gZm9yIHRoZQ0KLXVzZXI8L2xpPg0KLTxsaT48c3Ryb25nPkppYlg8L3N0cm9uZz4gLSBUaGlzIGlzIHRoZSBtb3N0IHJlY2VudCBhZGRpdGlvbiB0byB0aGUNCi1mYW1pbHkgb2YgZGF0YWJpbmRpbmcgZXh0ZW5zaW9ucywgYW5kIGl0IGlzIGFsc28gYW5vdGhlciBvcHRpb24NCi11c2VycyBoYXZlIGZvciBkYXRhIGJpbmRpbmcuPC9saT4NCi08L29sPg0KLTxhIG5hbWU9InNlcmlhbCIgaWQ9InNlcmlhbCI+PC9hPg0KLTxoMz5TZXJpYWxpemF0aW9uIGFuZCBEZS1TZXJpYWxpemF0aW9uIG9mIERhdGEgYm91bmQgY2xhc3NlczwvaDM+DQotPHA+QVhJT00gaXMgYmFzZWQgb24gdGhlIFN0QVggQVBJIChTdHJlYW1pbmcgQVBJIGZvciBYTUwpLg0KLVhtbC1iZWFucyBhbHNvIHN1cHBvcnRzIHRoaXMgQVBJLiBEYXRhIGJpbmRpbmcgaW4gQXhpczIgaXMgYWNoaWV2ZWQNCi10aHJvdWdoIGludGVyZmFjaW5nIHRoZSBBWElPTSB3aXRoIHRoZSBYbWwtYmVhbnMgdXNpbmcgdGhlIFN0QVgNCi1BUEkuIEF0IHRoZSB0aW1lIG9mIGNvZGUgZ2VuZXJhdGlvbiwgdGhlcmUgd2lsbCBiZSB1dGlsaXR5IG1ldGhvZHMNCi1nZW5lcmF0ZWQgaW5zaWRlIHRoZSBzdHViIChvciB0aGUgbWVzc2FnZSByZWNlaXZlcikgdGhhdCBjYW4NCi1kZS1zZXJpYWxpemUgZnJvbSBBWElPTSB0byBhIGRhdGEgYm91bmQgb2JqZWN0IGFuZCBzZXJpYWxpemUgZnJvbSBhDQotZGF0YSBib3VuZCBvYmplY3QgdG8gQVhJT00uIEZvciBleGFtcGxlLCBpZiB0aGUgV1NETCBoYXMgYW4NCi1vcGVyYXRpb24gY2FsbGVkICJlY2hvU3RyaW5nIiwgb25jZSB0aGUgY29kZSBpcyBnZW5lcmF0ZWQsIHRoZQ0KLWZvbGxvd2luZyBtZXRob2RzIHdpbGwgYmUgZ2VuZXJhdGVkIGluc2lkZSB0aGUgcmVsZXZhbnQNCi1jbGFzc2VzLjwvcD4NCi08cHJlPg0KLXB1YmxpYyBzdGF0aWMNCi1vcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB0b09NKG9yZy5zb2FwaW50ZXJvcC54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQNCi1wYXJhbSkvLyBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSB0aGUgc2VyaWFsaXphdGlvbi4NCi0NCi1wdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0DQotZnJvbU9NKG9yZy5hcGFjaGUuYXhpczIub20uT01FbGVtZW50IHBhcmFtLCBqYXZhLmxhbmcuQ2xhc3MgdHlwZSkgLy9UaGlzDQotbWV0aG9kIHdpbGwgaGFuZGxlIHRoZSBkZS1zZXJpYWxpemF0aW9uLg0KLTwvcHJlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL1dTX3BvbGljeS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvV1NfcG9saWN5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1NDAyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvV1NfcG9saWN5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPg0KLTx0aXRsZT5XUyBQb2xpY3kgU3VwcG9ydCBpbiBBeGlzMjwvdGl0bGU+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJhbWF5YSA5LjIuMSwgc2VlIGh0dHA6Ly93d3cudzMub3JnL0FtYXlhLyIgLz4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDEgYWxpZ249ImNlbnRlciI+V2ViIFNlcnZpY2VzIFBvbGljeSBTdXBwb3J0IEluIEFwYWNoZSBBeGlzMjwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBnaXZlcyB5b3UgYW4gaW50cm9kdWN0aW9uIHRvIHRoZSByb2xlIG9mIFdlYg0KLXNlcnZpY2VzIHBvbGljeSBpbiBBcGFjaGUgQXhpczIuPC9wPg0KLTxwPlNlbmQgeW91ciBmZWVkYmFjayB0bzogPGEgaHJlZj0NCi0ibWFpbHRvOmF4aXMtZGV2QHdzLmFwYWNoZS5vcmc/c3ViamVjdD1bQXhpczJdIj5heGlzLWRldkB3cy5hcGFjaGUub3JnPC9hPi4NCi0oU3Vic2NyaXB0aW9uIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbWFpbC1saXN0cy5odG1sIj5BeGlzMiBzaXRlPC9hPi4pDQotS2luZGx5IHByZWZpeCBldmVyeSBlbWFpbCBzdWJqZWN0IHdpdGggW0F4aXMyXS48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI3doYXQiPldoYXQgaXMgV2ViIFNlcnZpY2VzIChXUykgUG9saWN5PzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY2xpZW50Ij5DbGllbnQgU2lkZSBXUy1Qb2xpY3kgU3VwcG9ydDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc2VydmVyIj5TZXJ2ZXIgU2lkZSBXUy1Qb2xpY3kgU3VwcG9ydDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjcmVzb3VyY2VzIj5SZXNvdXJjZXM8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9IndoYXQiIGlkPSJ3aGF0Ij48L2E+DQotPGgyPldoYXQgaXMgV2ViIFNlcnZpY2VzIChXUykgUG9saWN5PzwvaDI+DQotPHA+VG8gY29uc3VtZSBub24gdHJpdmlhbCB3ZWIgc2VydmljZXMgeW91IG11c3QgZnVsbHkgdW5kZXJzdGFuZA0KLWl0cyBYTUwgY29udHJhY3QgKFdTREwpIGFsb25nIHdpdGggYW55IG90aGVyIGFkZGl0aW9uYWwNCi1yZXF1aXJlbWVudHMsIGNhcGFiaWxpdGllcywgb3IgcHJlZmVyZW5jZXMgdGhhdCB0cmFuc2xhdGUgdG8gdGhlDQotY29uZmlndXJhdGlvbiBvZiB0aGUgc2VydmljZSBhbmQgZXNzZW50aWFsbHkgYmVjb21lcyB0aGUgcG9saWNpZXMNCi1vZiB0aGUgc2VydmljZS48L3A+DQotPHA+V1MgUG9saWN5IGZyYW1ld29yayBwcm92aWRlcyBhIHdheSB0byBleHByZXNzIHRoZSBwb2xpY2llcyBvZiBhDQotc2VydmljZSBpbiBhIG1hY2hpbmUtcmVhZGFibGUgd2F5LiBBIFdlYiBzZXJ2aWNlcyBpbmZyYXN0cnVjdHVyZQ0KLWNhbiBiZSBlbmhhbmNlZCB0byB1bmRlcnN0YW5kIGFuZCBlbmZvcmNlIHBvbGljaWVzIGF0IHJ1bnRpbWUuIEZvcg0KLWluc3RhbmNlLCBhIHNlcnZpY2UgYXV0aG9yIG1pZ2h0IHdyaXRlIGEgcG9saWN5IHJlcXVpcmluZyBhIGRpZ2l0YWwNCi1zaWduYXR1cmUgYW5kIGVuY3J5cHRpb24sIHdoaWxlIHNlcnZpY2UgY29uc3VtZXJzIGNhbiB1c2UgdGhlDQotcG9saWN5IGluZm9ybWF0aW9uIHRvIHJlYXNvbiBvdXQgd2hldGhlciB0aGV5IGNhbiBhZGhlcmUgdG8gdGhpcw0KLXBvbGljeSBpbmZvcm1hdGlvbiB0byB1c2UgdGhlIHNlcnZpY2UuPC9wPg0KLTxwPkZ1cnRoZXJtb3JlLCBXZWIgc2VydmljZSBpbmZyYXN0cnVjdHVyZSBjYW4gYmUgZW5oYW5jZWQgdG8NCi1lbmZvcmNlIHRob3NlIHJlcXVpcmVtZW50cyB3aXRob3V0IHJlcXVpcmluZyB0aGUgc2VydmljZSBhdXRob3IgdG8NCi13cml0ZSBldmVuIGEgc2luZ2xlIGxpbmUgb2YgY29kZS48L3A+DQotPGEgbmFtZT0iY2xpZW50IiBpZD0iY2xpZW50Ij48L2E+DQotPGgyPkNsaWVudCBTaWRlIFdTLVBvbGljeSBTdXBwb3J0PC9oMj4NCi08cD5UaGlzIHJlbGVhc2UgPHN0cm9uZz5mdWxseSBzdXBwb3J0cyBXUyBQb2xpY3kgYXQNCi1jbGllbnQtc2lkZTwvc3Ryb25nPi4gSXQgbWVhbnMgdGhhdCB3aGVuIHlvdSBjb2RlZ2VuIGEgc3R1YiBhZ2FpbnN0DQotYSBXU0xEIHdoaWNoIGNvbnRhaW5zIHBvbGljaWVzLCB0aGUgc3R1YiB3aWxsIGNvbnRhaW4gdGhlDQotY2FwYWJpbGl0eSB0byBlbmdhZ2UgdGhlIHJlcXVpcmVkIG1vZHVsZXMgd2l0aCB0aGUgYXBwcm9wcmlhdGUNCi1jb25maWd1cmF0aW9ucywgcGx1cyBpdCB3aWxsIGdlbmVyYXRlIGFkZGl0aW9uYWwgbWV0aG9kcyBpbiB0aGUNCi1zdHViIHdoZXJlIHRoZSB1c2VyIGNhbiBzZXQgY2VydGFpbiBwcm9wZXJ0aWVzLiBGb3IgaW5zdGFuY2UsIGlmDQotdGhlcmUgaXMgYSBzZWN1cml0eSBwb2xpY3kgYXR0YWNoZWQgdG8gYSBiaW5kaW5nLCB0aGUgZ2VuZXJhdGVkDQotc3R1YiB3aWxsIGVuZ2FnZSB0aGUgc2VjdXJpdHkgbW9kdWxlIGZvciB0aGF0IHNlcnZpY2Ugd2l0aCB0aGUNCi1hcHByb3ByaWF0ZSBzZWN1cml0eSBjb25maWd1cmF0aW9ucyB3aXRoIHNvbWUgYWRkdGlvbmFsIG1ldGhvZHMNCi10aGF0IHRoZSB1c2VyIGNhbiB1c2UgdG8gc2V0IHByb3BlcnRpZXMgaW4gdGhlIGdlbmVyYXRlZCBzdHViLjwvcD4NCi08aDM+SG93IGl0IHdvcmtzOjwvaDM+DQotPGg0PlBoYXNlIDE6IEF0IFBvbGljeUV2YWx1YXRvcjwvaDQ+DQotPHA+VGhlIENvZGVnZW4gZW5naW5lIHJ1bnMgYSBmZXcgb2YgaXRzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucw0KLWJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIHN0dWIuIFdoZW4gdGhlIFBvbGljeUV2YWx1dG9yICh3aGljaCBpcyBhDQotcmVnaXN0ZXJlZCBDb2RlZ2VuIGV4dGVuc2lvbikgaXMgaW5pdGlhbGl6ZWQsIGl0IHBvcHVsYXRlcyBhDQotcmVnaXN0cnkgb2YgUU5hbWVzIG9mIHN1cHBvcnRlZCBwb2xpY3kgYXNzZXJ0aW9ucyB0bw0KLVBvbGljeUV4dGVuc2lvbnMuPC9wPg0KLTxwPkZvciBpbnN0YW5jZSwgbW9kdWxlIEZvbyBtaWdodCBoYXZlIGEgbWFwcGluZyBvZiBhc3NlcnRpb24NCi17aHR0cDovL3Rlc3QuY29tL2ZvbywgZm9vfSB3aGljaCBtZWFucyBhbnkgYXNzZXJ0aW9uIHRoYXQgaGFzIHRoaXMNCi1uYW1lIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgbW9kdWxlLiBUaGUgRm9vIG1vZHVsZSBtaWdodA0KLWltcGxlbWVudCB0aGUgTW9kdWxlUG9saWN5RXh0ZW5zaW9uIGludGVyZmFjZSB0aHJvdWdoIHdoaWNoIHRoZQ0KLVBvbGljeUV4dGVuc2lvbiBvYmplY3QgY2FuIGJlIG9idGFpbmVkLjwvcD4NCi08cD5BIDxzdHJvbmc+UG9saWN5RXh0ZW5zaW9uPC9zdHJvbmc+IGlzIHRoZSBhY2Nlc3MgcG9pbnQgZm9yIGENCi1tb2R1bGUgdG8gYWRkIGFueSBhZGRpdGlvbmFsIG1ldGhvZHMgdG8gdGhlIHN0dWIuIEZvciBpbnN0YW5jZSBhDQotUmVsaWFibGUgTWVzc2FnaW5nIG1vZHVsZSBjYW4gYWRkIHN0YXJ0U2VxdWVuY2UoKSBhbmQgZW5kU2VxdWVuY2UoKQ0KLW1ldGhvZHMgdG8gdGhlIHN0dWIsIHRoYXQgdGhlIHVzZXIgbXVzdCBjYWxsIHRvIHN0YXJ0IGFuZCBlbmQgYW4gUk0NCi1zZXF1ZW5jZS48L3A+DQotPHA+VGhlbiBhdCB0aGUgZW5nYWdlbWVudCBvZiB0aGUgUG9saWN5RXZhbHVhdG9yLCB0aGUgZWZmZWN0aXZlDQotcG9saWN5IG9mIGVhY2ggbWVzc2FnZSBvZiBldmVyeSBvcGVyYXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbg0KLXBvbGljeSBpbmZvcm1hdGlvbiBkZWNsYXJlZCBpbiB0aGUgV1NETCBkb2N1bWVudC4gSGVyZSB3ZSBhc3N1bWUNCi10aGF0IHRoZSBlZmZlY3RpdmUgcG9saWN5IG9mIGFuIG9wZXJhdGlvbiBjb250YWlucyBhIHNpbmdsZQ0KLWFsdGVybmF0aXZlICg8c3Ryb25nPk11bHRpcGxlIHBvbGljeSBhbHRlcm5hdGl2ZXMgYXJlIG5vdA0KLXN1cHBvcnRlZDwvc3Ryb25nPikuIFRoZW4gd2Ugc3BsaXQgdGhhdCBwb2xpY3kgYXMgZm9sbG93cyBpbnRvIGZldw0KLW90aGVyIHBvbGljaWVzIHN1Y2ggdGhhdCwgZWFjaCBwb2xpY3kgd2lsbCBjb250YWluIGFzc2VydGlvbnMgdGhhdA0KLWNhbiBiZSBwcm9jZXNzZWQgYnkgYSBzaW5nbGUgbW9kdWxlLjwvcD4NCi08cHJlPg0KLSAgJmx0O3dzcDpQb2xpY3kmZ3Q7ICAgICAgICAgJmx0O3dzcDpQb2xpY3kmZ3Q7ICAgICAgICZsdDt3c3A6UG9saWN5Jmd0OyAgICAgICAgDQotICAgICZsdDthOkZvby8mZ3Q7ICAgICAgICAgICAgICZsdDthOkZvby8mZ3Q7ICAgICAgICAgICAmbHQ7YjpGb28vJmd0OyAgICAgICAgICAgICAgIA0KLSAgICAmbHQ7YjpCYXIvJmd0OyAgICAgID0mZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvd3NwOlBvbGljeSZndDsgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7L3dzcDpQb2xpY3kmZ3Q7DQotICAmbHQ7L3dzcDpQb2xpY3kmZ3Q7DQotPC9wcmU+DQotPHA+VGhlbiBlYWNoIHBvbGljeSBpcyBnaXZlbiB0aGUgYXBwcm9wcmlhdGUgUG9saWN5RXh0ZW5zaW9uIHdpdGgNCi1hbiBvcmcudzNjLkVsZW1lbnQgdHlwZSBvYmplY3QgdG8gd2hpY2ggdGhlIG1vZHVsZSBjYW4gYXBwZW5kIGFueQ0KLW90aGVyIGVsZW1lbnRzL2F0dHJpYnV0ZXMgaXQgd2lzaGVzLiBUaG9zZSBhdHRyaWJ1dGVzL2VsZW1lbnRzDQotc2hvdWxkIHJlc29sdmUgdG8gbWVhbmluZ2Z1bCBzdHViIGZ1bmN0aW9ucyB0aHJvdWdoIHRoZSBDdXN0b20NCi1Qb2xpY3lFeHRlbnNpb25UZW1wbGF0ZS54c2wgYXQgYSBsYXR0ZXIgcG9pbnQgb2YgdGltZS48L3A+DQotPHA+Rm9yIGluc3RhbmNlLCBkZXBlbmRpbmcgb24gdGhlIHBvbGljeSwgdGhlIFNlY3VyaXR5IG1vZHVsZSBjYW4NCi1hcHBlbmQgJmx0O3VzZXJuYW1lJmd0OywgJmx0O3Bhc3N3ZCZndDsgZWxlbWVudHMgdG8gdGhlIGdpdmVuDQotZWxlbWVudCBhcyBjaGlsZHJlbiwgd2hpY2ggYXJlIGxhdGVyIHJlc29sdmVkIGludG8gc2V0VXNlcm5hbWUoLi4pLA0KLXNldFBhc3N3ZCguLiksIGZ1bmN0aW9ucyBvZiB0aGUgc3R1Yi4gVGhpcyB3YXkgYSBtb2R1bGUgY2FuIGluY2x1ZGUNCi1hZGRpdGlvbmFsIG1ldGhvZHMgdG8gdGhlIHN0dWIgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgc3BlY2lmaWMNCi1wcm9wcmV0aWVzIGZyb20gdGhlIHVzZXIuIFRoZXNlIG1ldGhvZHMgc3RvcmUgYW55IHVzZXIgaW5wdXQgaW4gdGhlDQotU2VydmljZUNsaWVudCBwcm9wZXJ0aWVzDQotKFNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnB1dFByb3BlcnR5KC4uLikpIHdoaWNoIGNhbiBsYXRlciBiZQ0KLWFjY2Vzc2VkIGJ5IHRoZSBtb2R1bGUuPC9wPg0KLTxoND5QaGFzZSAyOiBBdCBBeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUNsaWVudEVtaXR0ZXI8L2g0Pg0KLTxwPkZ1cnRoZXIsIHBvbGljaWVzIChiYXNlZCBvbiB0aGUgV1NETCkgYXQgYXBwcm9wcmlhdGUgbGV2ZWxzDQotKHNlcnZpY2UgbGV2ZWwsIG9wZXJhdGlvbiBsZXZlbCkgYXJlIHN0b3JlZCBhcyBwb2xpY3kgc3RyaW5ncyBpbg0KLXRoZSBzdHViLiBJZiB0aGVyZSBhcmUgYSBmZXcgcG9saWNpZXMgYXQgYSBnaXZlbiBsZXZlbCwgdGhleSBhcmUNCi1tZXJnZWQgdG9nZXRoZXIgYW5kIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlIHBvbGljeSBpbiB0aGUgc3R1Yi4gRmV3DQotbW9yZSBnZW5lcmljIG1ldGhvZHMgYXJlIGFsc28gYWRkZWQgdG8gdGhlIHN0dWIgd2hpY2ggYXJlIHVzZWQgdG8NCi1ldmFsdWF0ZSBhbmQgcHJvY2VzcyB0aGUgcG9saWNpZXMgYXQgcnVudGltZS48L3A+DQotPGg0PlBoYXNlIDM6IFJ1bnRpbWU8L2g0Pg0KLTxwPldoZW4gYSBuZXcgc3R1YiBvYmplY3QgaXMgY3JlYXRlZCwgdGhlIHBvbGljeSBzdHJpbmdzIGluIHRoZQ0KLXN0dWIgYXJlIGNvbnZlcnRlZCBpbnRvIHBvbGljeSBvYmplY3RzIGFuZCBhcmUgc2V0IGluIHRoZQ0KLUF4aXNEZXNjcmlwdGlvbiBoaWVyYXJjaHkgdGhhdCBpcyB1c2VkIGluIHRoZSBzdHViLiBJbiBvdGhlciB3b3JkcywNCi1hbnkgcG9saWN5IGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUgV1NETCB3aWxsIGJlIHByZXNlcnZlZCBpbg0KLXRoZSBBeGlzU2VydmljZSBvYmplY3QgdGhhdCBpcyB1c2VkIGluIHRoZSBzdHViLjwvcD4NCi08cD5UaGVuIGJhc2VkIG9uIGl0cyBwb2xpY3ksIGVhY2ggQXhpc0Rlc2NyaXB0aW9uIGlzIGVuZ2FnZWQgdG8gYQ0KLXNldCBvZiBtb2R1bGVzLiBNb2R1bGVzIGNhbiBkbyBhIHByaW9yIGNhbGN1bGF0aW9uIG9mDQotY29uZmlndXJhdGlvbnMgaWYgbmVlZGVkIGF0IHRoZSBlbmdhZ2VtZW50LjwvcD4NCi08cD5XaGVuIHRoZSBzdHViIG1ldGhvZCBpcyBpbnZva2VkLCB0aG9zZSBtb2R1bGVzIHdoaWNoIGFyZSBlbmdhZ2VkDQotdG8gdGhhdCBBeGlzRGVzY3JpcHRpb24sIGFjY2VzcyB0aGUgcG9saWN5IGZvciB0aGF0IG9wZXJhdGlvbiB2aWENCi10aGUgQXhpc0Rlc2NyaXB0aW9uIG9iamVjdC4gSXQgY2FuIGdldCB0aGUgb3RoZXIgcmVxdWlyZWQNCi1pbmZvcm1hdGlvbiBmcm9tIHRoZSBNZXNzYWdlQ29udGV4dCwgd2hpY2ggaXMgc3RvcmVkIGJ5IHN0dWINCi1tZXRob2RzIHRoYXQgdGhlIG1vZHVsZSBoYXMgYWRkZWQgdG8gdGhlIHN0dWIgZWFybGllciwgdGhyb3VnaCB0aGUNCi1Nb2R1bGVQb2xpY3lFeHRlbnNpb24gaW1wbGVtZW50YXRpb24uIFRoZSBtb2R1bGVzIGFyZSByZXF1aXJlZCB0bw0KLWxvYWQgdGhlaXIgY29uZmlndXJhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBlZmZlY3RpdmUgcG9saWN5LCB3aGljaA0KLWlzIHNldCBhdCBBeGlzRGVzY3JpcHRpb24sIGFuZCB0aGUgcHJvcGVydGllcyB0aGV5IGdldCB2aWENCi1NZXNzYWdlQ29udGV4dC48L3A+DQotPGEgbmFtZT0ic2VydmVyIiBpZD0ic2VydmVyIj48L2E+DQotPGgyPlNlcnZlciBTaWRlIFdTLVBvbGljeSBTdXBwb3J0PC9oMj4NCi08cD5JbiB0aGlzIGN1cnJlbnQgcmVsZWFzZSwgdGhlIEFwYWNoZSBBeGlzMiBmcmFtZXdvcmsgdXNlcyB0aGUNCi1XUy1Db21tb25zL05lZXRoaSBmcmFtZXdvcmsgdG8gbWFuaXB1bGF0ZSBwb2xpY3kgZG9jdW1lbnRzLiBBbGwgaXRzDQotZGVzY3JpcHRpb24gYnVpbGRlcnMgc3RvcmUgdGhlIHBvbGljeSBpbmZvcm1hdGlvbiBpbmNsdWRlZCBpbg0KLWRlc2NyaXB0aW9uIGRvY3VtZW50cyAoc2VydmljZXMueG1sLCBheGlzMi54bWwsIC4uIGV0YykgaW4gdGhlDQotYXBwcm9wcmlhdGUgZGVzY3JpcHRpb24gY2xhc3Nlcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgYXQNCi1ib3RoIGRlcGxveW1lbnQgYW5kIHJ1biB0aW1lIHZpYSB0aGVzZSBkZXNjcmlwdGlvbiBjbGFzc2VzLjwvcD4NCi08cD5XaGVuIGdlbmVyYXRpbmcgV1NETCBkeW5hbWljYWxseSBmb3IgZWFjaCBzZXJ2aWNlLCBwb2xpY3kNCi1pbmZvcm1hdGlvbiBpbiB0aGUgZGVzY3JpcHRpb24gY2xhc3NlcyBpcyBpbmNsdWRlZC4gRm9yIGluc3RhbmNlLA0KLWlmIHlvdSBkZWNsYXJlIGEgcG9saWN5IGluIGF4aXMyLnhtbCwgdGhlbiB0aGF0IHBvbGljeSBpcyByZWZsZWN0ZWQNCi1pbiB0aGUgc2VydmljZSBlbGVtZW50cyBvZiB0aGUgV1NETCBvZiBldmVyeSBzZXJ2aWNlLiBJZiBhIHBvbGljeQ0KLWlzIGRlY2xhcmVkIGluIGEgc2VydmljZXMueG1sLCBpdCBpcyBzaG93biBpbiB0aGUgc2VydmljZSBlbGVtZW50DQotb2YgV1NETCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHNlcnZpY2UuPC9wPg0KLTxwPkZ1cnRoZXIsIHdoZW4gYSBzZXJ2aWNlIGlzIGRlcGxveWVkLCBhbiBhcmJpdGFyeSBwb2xpY3kNCi1hbHRlcm5hdGl2ZSBpcyBzZWxlY3RlZCBhbmQgc2V0IGZvciBlYWNoIEF4aXNPcGVyYXRpb24gYW5kDQotQXhpc01lc3NhZ2VzIG9mIHRoZSBBeGlzU2VydmljZS4gSWYgdGhlIHNlbGVjdGVkIFBvbGljeSBhbHRlcm5hdGl2ZQ0KLWNhbm5vdCBiZSBzdXBwb3J0ZWQgYnkgYW55IG1vZHVsZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBwcm9jZXNzaW5nDQotdGhlIHNlbGVjdGl2ZSBhbHRlcm5hdGl2ZSwgdGhlbiB0aGUgc2VydmljZSBpcyBjb25zaWRlcmVkIGFzIGENCi1mYXVsdHkgc2VydmljZS4gRWxzZSwgdGhlIHNldCBvZiBtb2R1bGVzIGlzIGVuZ2FnZWQgYXQgYXBwcm9wcmlhdGUNCi1sZXZlbHMgdG8gc3VwcG9ydCB0aGUgcmVxdWlybWVudHMgYW5kIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBkZWZpbmVkDQotaW4gdGhlIFBvbGljaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXhpc0Rlc2NyaXB0aW9uLjwvcD4NCi08cD5JdCBpcyBldmlkZW50IHRoYXQgdGhlcmUgaXMgc29tZSB3b3JrIGxlZnQgdG8gbWFrZSBBcGFjaGUgQXhpczINCi1hIGZ1bGx5IGZsZWRnZWQgd3MtcG9saWN5IHN1cHBvcnRlZCBXZWIgc2VydmljZSBpbmZyYXN0cnVjdHVyZS4NCi1Ib3dldmVyLCBpdCBpcyBlbmNvdXJhZ2luZyB0byBub3RlIHRoYXQgd2UndmUgdGFrZW4gdGhlIGZpcnN0IHN0ZXBzDQotdG93YXJkcyB0aGlzIGdvYWwuIFdlIGFwcHJlY2lhdGUgYW55IHN1Z2dlc3Rpb25zLCBwYXRjaGVzLCBldGMuLA0KLXlvdSBzZW5kIHVzIGluIHRoaXMgcmVnYXJkLiBLZWVwIG9uIGNvbnRyaWJ1dGluZyE8L3A+DQotPGEgbmFtZT0icmVzb3VyY2VzIiBpZD0icmVzb3VyY2VzIj48L2E+DQotPGgyPlJlc291cmNlczwvaDI+DQotPHVsPg0KLTxsaT5BcGFjaGUgTmVldGhpIChXUyBQb2xpY3kgSW1wbGVtZW50YXRpb24pIG9mZmljaWFsIHNpdGUtDQotPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvY29tbW9ucy9uZWV0aGkvaW5kZXguaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPkhvbWUgUGFnZTwvYT48L2xpPg0KLTxsaT5TYW5rYSBTYW1hcmFuYXlha2UsIE1hcmNoIDIwMDYuIDxhIGhyZWY9DQotImh0dHA6Ly93d3cud3NvMi5uZXQvYXJ0aWNsZXMvbmVldGhpL2phdmEvMjAwNi8wMS8yNC93cy1wb2xpY3kiDQotdGFyZ2V0PSJfYmxhbmsiPldlYiBzZXJ2aWNlcyBQb2xpY3kgLSBXaHksIFdoYXQgJmFtcDsgSG93PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS93ZWJzZXJ2aWNlcy9jb21tb25zL3RydW5rL21vZHVsZXMvbmVldGhpLyINCi10YXJnZXQ9Il9ibGFuayI+V1MtY29tbW9ucy9wb2xpY3kgU1ZOPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly9zcGVjcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeS93cy1wb2xpY3kucGRmIiB0YXJnZXQ9DQotIl9ibGFuayI+V2ViIFNlcnZpY2VzIFBvbGljeSBGcmFtZXdvcmsgKFdTLVBvbGljeSk8L2E+PC9saT4NCi08L3VsPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItYWR2YW5jZWQueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItYWR2YW5jZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzlmNDE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLWFkdmFuY2VkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPg0KLTx0aXRsZT5BZHZhbmNlZCBBeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgRmVhdHVyZXM8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDE+QWR2YW5jZWQgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrIEZlYXR1cmVzPC9oMT4NCi08cD5UaGUgYWltIG9mIHRoaXMgc2VjdGlvbiBpcyBwcm92aWRlIGFuIGluc2lnaHQgaW50byB0aGUgbmV3bHkNCi1hZGRlZCBhZHZhbmNlZCBmZWF0dXJlcyBvZiB0aGUgQXhpczIgRGF0YWJpbmRpbmcgKEFEQikNCi1GcmFtZXdvcmsuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN0eXBlU3VwcG9ydCI+eHNpOnR5cGUgU3VwcG9ydDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjaGVscGVyIj5IZWxwZXIgTW9kZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjbW9yZSI+QWRkaXRpb25hbCBBREIgVG9waWNzPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJ0eXBlU3VwcG9ydCIgaWQ9InR5cGVTdXBwb3J0Ij48L2E+DQotPGgyPnhzaTp0eXBlIFN1cHBvcnQ8L2gyPg0KLTxwPlRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgYWRkaW5nIGEgZXh0ZW5zaW9uIG1hcHBpbmcgY2xhc3MuIFRoZQ0KLWNvZGUgdGhhdCBjYWxscyB0aGUgZXh0ZW5zaW9uIG1hcHBlciBpcyBnZW5lcmF0ZWQgaW5zaWRlIHRoZQ0KLUZhY3RvcnkucGFyc2UgbWV0aG9kIG9mIHRoZSBiZWFucyBhbmQgZ2V0cyBhY3RpdmF0ZWQgd2hlbiB0aGUNCi14c2k6dHlwZSBhdHRyaWJ1dGUgaXMgcHJlc2VudC4gVGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IHNob3dzDQotd2hhdCB0aGUgZ2VuZXJhdGVkIHR5cGUgbWFwcGVyIGxvb2tzIGxpa2UgOjwvcD4NCi08cHJlPg0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLk9iamVjdCBnZXRUeXBlT2JqZWN0KGphdmEubGFuZy5TdHJpbmcgbmFtZXNwYWNlVVJJLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb257DQotICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICBpZiAoDQotICAgICAgICAgICAgICAgICAgImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiLmVxdWFscyhuYW1lc3BhY2VVUkkpICZhbXA7JmFtcDsNCi0gICAgICAgICAgICAgICAgICAiU09BUFN0cnVjdCIuZXF1YWxzKHR5cGVOYW1lKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgY29tLnRlc3QuU09BUFN0cnVjdC5GYWN0b3J5LnBhcnNlKHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB0eXBlICIgKyBuYW1lc3BhY2VVUkkgKyAiICIgKyB0eXBlTmFtZSk7DQotICAgICAgICAgICAgfQ0KLTwvcHJlPg0KLTxwPkluc2lkZSBldmVyeSBGYWN0b3J5LnBhcnNlIG1ldGhvZCwgdGhlIGV4dGVuc2lvbiBtYXBwZXIgZ2V0cw0KLWNhbGxlZCB3aGVuIGEgeHNpOnR5cGUgYXR0cmlidXRlIGlzIGVuY291bnRlcmVkDQotPHN0cm9uZz5hbmQ8L3N0cm9uZz4gdGhhdCB0eXBlIGlzIG5vdCB0aGUgdHlwZSB0aGF0IGlzIGN1cnJlbnRseQ0KLWJlaW5nIHBhcnNlZC48L3A+DQotPHA+VGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IHNob3dzIGhvdyB0aGUgQURCIGRlc2VyaWFsaXplIG1ldGhvZA0KLWNhbGxzIHRoZSBtYXBwZXIgY2xhc3M6PC9wPg0KLTxwcmU+DQotICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwidHlwZSIpIT1udWxsKXsNCi0gICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGZ1bGxUeXBlTmFtZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIik7DQotICAgICAgICAgICAgICAgICAgaWYgKGZ1bGxUeXBlTmFtZSE9bnVsbCl7DQotICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5zUHJlZml4ID0gZnVsbFR5cGVOYW1lLnN1YnN0cmluZygwLGZ1bGxUeXBlTmFtZS5pbmRleE9mKCI6IikpOw0KLSAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXggPSBuc1ByZWZpeD09bnVsbD8iIjpuc1ByZWZpeDsNCi0NCi0gICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSA9IGZ1bGxUeXBlTmFtZS5zdWJzdHJpbmcoZnVsbFR5cGVOYW1lLmluZGV4T2YoIjoiKSsxKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghIlNPQVBTdHJ1Y3QiLmVxdWFscyh0eXBlKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9maW5kIG5hbWVzcGFjZSBmb3IgdGhlIHByZWZpeA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgbnNVcmkgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTT0FQU3RydWN0KW9yZy5zb2FwaW50ZXJvcC50eXBlcy5FeHRlbnNpb25NYXBwZXIuZ2V0VHlwZU9iamVjdCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zVXJpLHR5cGUscmVhZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgIH0NCi08L3ByZT4NCi08cD5UaGlzIG1ha2VzIHhzaTp0eXBlIGJhc2VkIHBhcnNpbmcgcG9zc2libGUgYW5kIHJlc3VsdHMgaW4gcHJvcGVyDQoteHNpOnR5cGUgYmFzZWQgc2VyaWFsaXphdGlvbnMgYXQgcnVudGltZS48L3A+DQotPHA+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgcGFja2FnZSBpcyBkZXJpdmVkIGZyb20gdGhlDQotdGFyZ2V0bmFtZXNwYWNlIG9mIHRoZSBmaXJzdCBzY2hlbWEgdGhhdCBpcyBlbmNvdW50ZXJlZC4gVGhlDQotcGFja2FnZSBuYW1lIGNhbiBhbHNvIGJlIGV4cGxpY2l0bHkgc2V0IGJ5IGEgQ29tcGlsZXJPcHRpb246PC9wPg0KLTxwcmU+DQotICAgDQotICAgICAgICBDb21waWxlck9wdGlvbnMgY29tcGlsZXJPcHRpb25zID0gbmV3IENvbXBpbGVyT3B0aW9ucygpOw0KLSAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldFdyaXRlT3V0cHV0KHRydWUpOw0KLSAgICAgICAgPHN0cm9uZz5jb21waWxlck9wdGlvbnMuc2V0TWFwcGVyQ2xhc3NQYWNrYWdlKCJjb20udGVzdCIpOzwvc3Ryb25nPg0KLSAgICAgICAgY29tcGlsZXJPcHRpb25zLnNldE91dHB1dExvY2F0aW9uKG5ldyBGaWxlKCJzcmMiKSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyIHNjaGVtYUNvbXBpbGVyID0gbmV3IFNjaGVtYUNvbXBpbGVyKGNvbXBpbGVyT3B0aW9ucyk7DQotICAgICAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiB4bWxTY2hlbWFDb2xsZWN0aW9uID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsNCi0gICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID14bWxTY2hlbWFDb2xsZWN0aW9uLnJlYWQobmV3IEZpbGVSZWFkZXIoInNjaGVtYS9zYW1wbGUueHNkIiksbnVsbCk7DQotICAgICAgICAgICAgc2NoZW1hQ29tcGlsZXIuY29tcGlsZSh4bWxTY2hlbWEpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLTwvcHJlPg0KLTxhIG5hbWU9ImhlbHBlciIgaWQ9ImhlbHBlciI+PC9hPg0KLTxoMj5IZWxwZXIgbW9kZTwvaDI+DQotPHA+SGVscGVyIG1vZGUgaXMgYSBmYWlybHkgbmV3IGZlYXR1cmUuIEluIHRoZSBoZWxwZXIgbW9kZSwgdGhlDQotYmVhbnMgYXJlIHBsYWluIEphdmEgYmVhbnMgYW5kIGFsbCB0aGUNCi1kZXNlcmlhbGl6YXRpb24vc2VyaWFsaXphdGlvbiBjb2RlIGlzIG1vdmVkIHRvIGEgaGVscGVyIGNsYXNzLiBGb3INCi1leGFtcGxlLCB0aGUgc2ltcGxlIHNjaGVtYSBtZW50aW9uZWQgaW4gdGhlIEFEQi1ob3d0byBkb2N1bWVudCB3aWxsDQoteWllbGQgZm91ciBjbGFzc2VzIGluc3RlYWQgb2YgdGhlIHR3byBwcmV2aW91c2x5IGdlbmVyYXRlZDo8L3A+DQotPG9sPg0KLTxsaT5NeUVsZW1lbnQuamF2YTwvbGk+DQotPGxpPk15RWxlbWVudEhlbHBlci5qYXZhPC9saT4NCi08bGk+U09BUFN0cnVjdC5qYXZhPC9saT4NCi08bGk+U09BUFN0cnVjdEhlbHBlci5qYXZhPC9saT4NCi08L29sPg0KLTxwPlRoZSBoZWxwZXJzIGJhc2ljYWxseSBjb250YWluIGFsbCB0aGUgc2VyaWFsaXphdGlvbiBjb2RlIHRoYXQNCi1vdGhlcndpc2Ugd291bGQgZ28gaW50byB0aGUgQURCQmVhbnMuIEhlbmNlIHRoZSBiZWFucyBpbiB0aGUgaGVscGVyDQotbW9kZSBhcmUgbXVjaCBtb3JlIHNpbXBsaWZpZWQuIEFsc28gbm90ZSB0aGF0IHRoZSBoZWxwZXIgbW9kZSBpcw0KLWF2YWlsYWJsZSBvbmx5IGlmIHlvdSBhcmUgaW4gdW5wYWNrZWQgbW9kZS4gVGhlIGNvZGUgZ2VuZXJhdG9yIGJ5DQotZGVmYXVsdCBkb2VzIG5vdCBleHBhbmQgdGhlIGNsYXNzZXMuPC9wPg0KLTxwPkhlbHBlciBtb2RlIGNhbiBiZSBzd2l0Y2hlZCBvbiBieSB1c2luZyB0aGUgc2V0SGVscGVyTW9kZSBtZXRob2QNCi1pbiBDb21waWxlck9wdGlvbnM6PC9wPg0KLTxwcmU+DQotPHN0cm9uZz5jb21waWxlck9wdGlvbnMuc2V0SGVscGVyTW9kZSh0cnVlKTs8L3N0cm9uZz4NCi08L3ByZT4NCi08YSBuYW1lPSJtb3JlIiBpZD0ibW9yZSI+PC9hPg0KLTxoMj5BZGRpdGlvbmFsIEFEQiBUb3BpY3M8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iYWRiLXR3ZWFraW5nLmh0bWwiPlR3ZWFraW5nIHRoZSBBREIgQ29kZQ0KLUdlbmVyYXRvcjwvYT4tIGV4cGxhaW5zIGF2YWlsYWJsZSBtZWNoYW5pc21zIHRvIGV4dGVuZCBBREIgYW5kDQotcG9zc2libHkgYWRvcHQgaXQgdG8gY29tcGlsZSBzY2hlbWFzIHRvIHN1cHBvcnQgb3RoZXINCi1sYW5ndWFnZXMuPC9saT4NCi08bGk+PGEgaHJlZj0iYWRiLWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCI+QURCIGFuZCBBeGlzMg0KLUludGVncmF0aW9uPC9hPiAtIGV4cGxhaW5zIGhvdyB0aGUgQURCIHNjaGVtYSBjb21waWxlciB3YXMgYXR0YWNoZWQNCi10byB0aGUgQXhpczIgZnJhbWV3b3JrPC9saT4NCi08L3VsPg0KLTxociAvPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItY29kZWdlbi1pbnRlZ3JhdGlvbi54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi1jb2RlZ2VuLWludGVncmF0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwZWNkZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi1jb2RlZ2VuLWludGVncmF0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTx0aXRsZT5BREIgSW50ZWdyYXRpb24gV2l0aCBBeGlzMjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5BREIgSW50ZWdyYXRpb24gV2l0aCBBeGlzMjwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCB3aWxsIGFzc2lzdCB5b3UgaW4gd3JpdGluZyBhbiBleHRlbnNpb24gdXNpbmcgdGhlDQotaW50ZWdyYXRvciBpbiBvcmRlciB0byBpbnRlZ3JhdGUgQURCIHdpdGggQXhpczIuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNzZWxlY3RfbW9kZXMiPlNlbGVjdGlvbiBvZiBHZW5lcmF0aW9uIE1vZGVzIGZvcg0KLUFEQjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjcmVtZW1iZXIiPlRoaW5ncyB0byBSZW1lbWJlcjwvYT48L2xpPg0KLTwvdWw+DQotPGgyPjxhIG5hbWU9ImludHJvIiBpZD0iaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2gyPg0KLTxwPkFEQiBJbnRlZ3JhdGlvbiB3aXRoIEF4aXMyIGlzIHNpbXBsZSBhbmQgc3RyYWlnaHRmb3J3YXJkLiBHaXZlbg0KLXRoZSBleHRlbnNpb24gbWVjaGFuaXNtIG9mIHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvciwgdGhlIG9idmlvdXMNCi1jaG9pY2UgZm9yIHRoZSBpbnRlZ3JhdG9yIGlzIHRvIHdyaXRlIGFuIGV4dGVuc2lvbi4gVGhlIGV4dGVuc2lvbg0KLXRoYXQgaXMgYWRkZWQgdG8gc3VwcG9ydCBBREIgaXMgdGhlIFNpbXBsZURCRXh0ZW5zaW9uDQotKDxzdHJvbmc+b3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlNpbXBsZURCRXh0ZW5zaW9uPC9zdHJvbmc+KQ0KLWFuZCBjYW4gYmUgZm91bmQgaW4gdGhlIGV4dGVuc2lvbnMgbGlzdCBvZiB0aGUNCi1jb2RlZ2VuLWNvbmZpZy5wcm9wZXJ0aWVzIGZpbGUuPC9wPg0KLTxhIG5hbWU9InNlbGVjdF9tb2RlcyIgaWQ9InNlbGVjdF9tb2RlcyI+PC9hPg0KLTxoMj5TZWxlY3Rpb24gb2YgR2VuZXJhdGlvbiBNb2RlcyBmb3IgQURCPC9oMj4NCi08cD5UaGUgZXh0ZW5zaW9uIHNldHMgdGhlIG9wdGlvbnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvciB2aWEgdGhlDQotQ29tcGlsZXJPcHRpb25zLCBkZXBlbmRpbmcgb24gdGhlIHVzZXIncyBzZXR0aW5ncy4gVGhlIGZvbGxvd2luZw0KLXRhYmxlIHN1bW1hcml6ZXMgdGhlIHVzZSBvZiBvcHRpb25zLiBQbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9DQotImFkYi1ob3d0by5odG1sIiB0YXJnZXQ9Il9ibGFuayI+QURCLUhvdyB0byBkb2N1bWVudDwvYT4gZm9yIHRoZQ0KLWRpZmZlcmVudCBnZW5lcmF0aW9uIG1vZGVzIGFuZCB0aGVpciBkZXNjcmlwdGlvbnMuPC9wPg0KLTx0YWJsZSBib3JkZXI9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPjxzdHJvbmc+VXNlciBwYXJhbWV0ZXJzPC9zdHJvbmc+PC90ZD4NCi08dGQ+PHN0cm9uZz5TZWxlY3RlZCBjb2RlIGdlbmVyYXRpb24gcGFyYW1ldGVyczwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPk5vbmUgKG5vIHBhcmFtZXRlciBvdGhlciB0aGFuIG1hbmRhdG9yeSBvbmVzKTwvdGQ+DQotPHRkPndyYXBDbGFzc2VzPWZhbHNlLHdyaXRlQ2xhc3Nlcz1mYWxzZTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPi1zcyAoc2VydmVyIHNpZGUpPC90ZD4NCi08dGQ+d3JhcENsYXNzZXM9ZmFsc2Usd3JpdGVDbGFzc2VzPXRydWU8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD4tdSAodW53cmFwIGNsYXNzZXMpPC90ZD4NCi08dGQ+d3JhcENsYXNzZXM9ZmFsc2Usd3JpdGVDbGFzc2VzPXRydWU8L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxwPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyAocHJlZml4ZWQgd2l0aCAtRSkgY2FuIGJlIHVzZWQgdG8NCi1vdmVycmlkZSB0aGVzZSBzZXR0aW5ncyBtYW51YWxseTo8L3A+DQotPHRhYmxlIGJvcmRlcj0iMSI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5QYXJhbWV0ZXIgTmFtZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+QWxsb3dlZCB2YWx1ZXM8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+cjwvdGQ+DQotPHRkPnRydWUsIGZhbHNlPC90ZD4NCi08dGQ+U2V0cyB0aGUgd3JpdGUgZmxhZy4gSWYgc2V0IHRvIHRydWUgdGhlIGNsYXNzZXMgd2lsbCBiZSB3cml0dGVuDQotYnkgQURCPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dzwvdGQ+DQotPHRkPnRydWUsIGZhbHNlPC90ZD4NCi08dGQ+U2V0cyB0aGUgd3JhcHBpbmcgZmxhZy4gaWYgdHJ1ZSB0aGUgY2xhc3NlcyB3aWxsIGJlDQotd3JhcHBlZC48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxwPk5vdGUgdGhhdCB0aGVzZSBwYXJhbWV0ZXJzIGhhdmUgbm8gY29ycmVzcG9uZGluZyBsb25nIG5hbWVzIGFuZA0KLU1VU1QgYmUgcHJlZml4ZWQgd2l0aCBhIC1FIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IuDQotRm9yIGV4YW1wbGU6PC9wPg0KLTxwcmU+DQotV1NETDJKYXZhIC4uLi4gLUVyIHRydWUNCi08L3ByZT4NCi08YSBuYW1lPSJyZW1lbWJlciIgaWQ9InJlbWVtYmVyIj48L2E+DQotPGgyPlRoaW5ncyB0byBSZW1lbWJlcjwvaDI+DQotPG9sPg0KLTxsaT5TaW1wbGVEQkV4dGVuc2lvbiBpcyBmb3IgdGhlIEFEQiBkYXRhYmluZGluZyBmcmFtZXdvcmsgb25seSBhbmQNCi13aWxsIHByb2Nlc3MgcmVxdWVzdHMgb25seSB3aGVuIHRoaXMgZnJhbWV3b3JrIGlzIHNwZWNpZmllZCBkdXJpbmcNCi1jb2RlIGdlbmVyYXRpb24gKHVzaW5nIHRoZSBzd2l0Y2ggLWQgYWRiKS4gSW4gdGhlIG1vc3QgcmVjZW50DQotcmVsZWFzZSwgdGhlIGRlZmF1bHQgaGFzIGJlZW4gc2V0IGFzIEFEQiBhbmQgaGVuY2UgaWYgdGhlIC1kIG9wdGlvbg0KLWlzIG1pc3NpbmcgdGhlbiB0aGUgZGF0YWJpbmRpbmcgZnJhbWV3b3JrIHdpbGwgYmUgQURCLjwvbGk+DQotPC9vbD4NCi08aHIgLz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLWhvd3RvLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLWhvd3RvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4OWUxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2FkYi1ob3d0by54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9DQotInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4NCi08dGl0bGU+QURCIC0gSG93dG88L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDE+QXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGFpbXMgdG8gcHJvdmlkZSBhbiBhcmNoaXRlY3R1cmFsIG92ZXJ2aWV3IG9mIHRoZQ0KLUF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAocmVmZXJyZWQgdG8gYXMgQURCIGZyb20gaGVyZSBvbndhcmRzKQ0KLWFuZCBiZSBhIGd1aWRlIHRvIGFueW9uZSB3aG8gd2FudHMgdG8gdXNlIGFuZCBtb2RpZnkgQURCLiBUaGUNCi1pbmZvcm1hdGlvbiBpcyBwcmVzZW50ZWQgdW5kZXIgdGhlIGZvbGxvd2luZyB0b3BpY3MuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNhcmNoaSI+QXJjaGl0ZWN0dXJhbCBPdmVydmlldzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY29kZV9kZXBlbmQiPkNvZGUgYW5kIERlcGVuZGVuY2llczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY29kZV9nZW4iPkludm9raW5nIHRoZSBBREIgQ29kZSBHZW5lcmF0b3I8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjc2NoZW1hX2NvbXBpbGVyIj5BcyBhIFN0YW5kLWFsb25lIFNjaGVtYQ0KLUNvbXBpbGVyPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNhcGkiPlRocm91Z2ggdGhlIEFQSTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2dlbl9tb2RlcyI+R2VuZXJhdGlvbiBNb2RlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjZGVlcCI+RGVlcCBpbnRvIEdlbmVyYXRlZCBDb2RlPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2V4YW1wbGUiPkFuIEV4YW1wbGUhPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjbGltaXRhdGlvbiI+S25vd24gTGltaXRhdGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI21vcmUiPldhbnQgdG8gTGVhcm4gTW9yZT88L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImludHJvIiBpZD0iaW50cm8iPjwvYT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5UaGUgb2JqZWN0aXZlIG9mIHRoZSBBeGlzMiBEYXRhYmluZGluZyBmcmFtZXdvcmsgaXMgdG8gcHJvdmlkZSBhDQotbGlnaHR3ZWlnaHQgYW5kIHNpbXBsZSBzY2hlbWEgY29tcGlsZXIvSmF2YSBiZWFuIGdlbmVyYXRvciBmb3INCi1BeGlzMi4gQnkgbm8gbWVhbnMgaXMgaXQgaW50ZW5kZWQgdG8gYmUgYSBmdWxseSBmdW5jdGlvbmFsIHNjaGVtYQ0KLWNvbXBpbGVyIGxpa2UgWE1MQmVhbnMuIE5vdGUgdGhhdCBBREIgaXMgd3JpdHRlbiBpbiBhIGZhc2hpb24gdGhhdA0KLWFsbG93cyBpdCB0byBiZSB1c2VkIGFzIGEgc3RhbmQtYWxvbmUgc2NoZW1hIGNvbXBpbGVyIGFuZCBhbHNvIHRvDQotYmUgZXh0ZW5kZWQgdG8gZ2VuZXJhdGUgY29kZSBmb3Igb3RoZXIgbGFuZ3VhZ2VzLjwvcD4NCi08YSBuYW1lPSJhcmNoaSIgaWQ9ImFyY2hpIj48L2E+DQotPGgyPkFyY2hpdGVjdHVyYWwgT3ZlcnZpZXc8L2gyPg0KLTxwPkFEQiBpcyBidWlsdCBvbiBhIG1vZHVsYXIgYXJjaGl0ZWN0dXJlIHRoYXQgYWxsb3dzIGl0IHRvIHV0aWxpemUNCi1hIHByZS1jb25maWd1cmVkIHdyaXRlciBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZ3VyYXRpb24uIFRoZSAnYmlnDQotYmxvY2sgZGlhZ3JhbScgZm9yIHRoZSBjb2RlIGdlbmVyYXRvciBhcmNoaXRlY3R1cmUgaXMgZGVwaWN0ZWQNCi1iZWxvdy48L3A+DQotPHA+PGltZyBzcmM9ImltYWdlcy9BREIuanBnIiBhbHQ9IkFEQiBhcmNoaXRlY3R1cmUiIC8+PC9wPg0KLTxwPkFEQiB1dGlsaXplcyB0aGUgV1MtQ29tbW9ucyA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL1htbFNjaGVtYS9pbmRleC5odG1sIj5YbWxTY2hlbWENCi1saWJyYXJ5PC9hPiBmb3IgcmVhZGluZyB0aGUgU2NoZW1hLiBUaGUgb2JqZWN0IG1vZGVsIGZvciB0aGUgc2NoZW1hDQotY29tZXMgaW4gdGhlIGZvcm0gb2YgYW4gWG1sU2NoZW1hIG9iamVjdC4gVGhlIHNjaGVtYSBjb21waWxlciBrZWVwcw0KLWFuIGluc3RhbmNlIG9mIHRoZSB3cml0ZXIgKGluIHRoZSBkZWZhdWx0IGNhc2UgaXQncyB0aGUNCi1KYXZhQmVhbldyaXRlcikgd2hpY2ggYWN0dWFsbHkgd3JpdGVzIHRoZSBjbGFzc2VzLiBUaGUgd3JpdGVycyBtYXkNCi11c2Ugd2hhdGV2ZXIgdGVjaG5pcXVlIHRoZXkgcHJlZmVyLCBpbiB0aGUgY2FzZSBvZiB0aGUNCi1KYXZhQmVhbldyaXRlciwgaXQgdXNlcyBhbiBYU0xUIHRlbXBsYXRlLiBUaGUgU2NoZW1hQ29tcGlsZXIgYWxzbw0KLXVzZXMgYSB0eXBlbWFwcGVyIG9iamVjdCB0aGF0IHRlbGxzIGl0IHdoYXQgY2xhc3NuYW1lcyB0byB1c2UgZm9yDQotdGhlIFFOYW1lcyB0aGF0IGl0IGVuY291bnRlcnMuIFRoaXMgdHlwZSBtYXBwZXIgaXMgYWxzbyBwYXJ0IG9mIHRoZQ0KLWNvbmZpZ3VyYXRpb24gYW5kIHRoZSB1c2VycyBjYW4gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdHlwZSBtYXBwZXIgYnkNCi1vdmVycmlkaW5nIHRoZSBwcm9wZXJ0eSBzZXR0aW5nLjwvcD4NCi08YSBuYW1lPSJjb2RlX2RlcGVuZCIgaWQ9ImNvZGVfZGVwZW5kIj48L2E+DQotPGgyPkNvZGUgYW5kIERlcGVuZGVuY2llczwvaDI+DQotPHA+QXMgZXhwbGFpbmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGUgc2NoZW1hIGNvbXBpbGVyDQotZGVwZW5kcyBvbiB0aGUgV1MtQ29tbW9ucyBYbWxTY2hlbWEgbGlicmFyeS4gVGhlIFhTTFQNCi10cmFuc2Zvcm1hdGlvbnMgYXJlIGRlcGVuZGVudCBvbiB0aGUgSlZNJ3MgRE9NIGltcGxlbWVudGF0aW9uDQotKGVpdGhlciBDcmltc29uIG9yIFhlcmNlcykgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdW5kZXJseWluZyBKVk0NCi1zaG91bGQgYmUgMS40IG9yIGhpZ2hlci4gQXBhcnQgZnJvbSB0aGF0IEFEQiBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uDQotYW55IG90aGVyIHNwZWNpYWwgamFyIGZpbGVzLiBUaGUgY29kZSBmb3IgdGhlIHNjaGVtYSBjb21waWxlciBpcw0KLWNvbXBsZXRlbHkgaW4gdGhlIDxzdHJvbmc+b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuKjwvc3Ryb25nPg0KLXBhY2thZ2UuIFRoaXMgcGFja2FnZSByZXNpZGVzIGluIHRoZSBjb2RlZ2VuIG1vZHVsZSBvZiB0aGUgQXhpczINCi1zb3VyY2UgdHJlZS48L3A+DQotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIGltcG9ydGFudCBjbGFzc2VzIGFuZCBmaWxlcyBvZiBBREI6PC9wPg0KLTxvbD4NCi08bGk+PHN0cm9uZz5TY2hlbWFDb21waWxlcjwvc3Ryb25nPiAtIFRoZSB3b3JrIGhvcnNlIHRoYXQgcmVhbGx5DQotY29tcGlsZXMgdGhlIHNjaGVtYSBpbnRvIGNsYXNzZXMuPC9saT4NCi08bGk+PHN0cm9uZz5CZWFuV3JpdGVyPC9zdHJvbmc+IC0gQmVhbldyaXRlcnMgaGFuZGxlIHRoZSB0aGUgYWN0dWFsDQotcmVuZGVyaW5nIG9mIHRoZSBjbGFzc2VzLiBCZWFuV3JpdGVyIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCB3cml0ZXJzDQotbmVlZCB0byBpbXBsZW1lbnQgaW4gb3JkZXIgdG8gYmUgdXNlZCBieSB0aGUgU2NoZW1hQ29tcGlsZXIuPC9saT4NCi08bGk+PHN0cm9uZz5KYXZhQmVhbldyaXRlcjwvc3Ryb25nPiAtIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mDQotdGhlIEJlYW5Xcml0ZXIgaW50ZXJmYWNlLjwvbGk+DQotPGxpPjxzdHJvbmc+VHlwZU1hcDwvc3Ryb25nPiAtIHJlcHJlc2VudHMgdGhlIGludGVyZmFjZSB0aGF0IHRoZQ0KLXNjaGVtYSBjb21waWxlciB1c2VzIHRvIGZpbmQgY2xhc3MgbmFtZXMgZm9yIGEgZ2l2ZW4gUU5hbWUuPC9saT4NCi08bGk+PHN0cm9uZz5KYXZhVHlwZU1hcDwvc3Ryb25nPiAtIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mDQotdGhlIFR5cGVNYXA8L2xpPg0KLTxsaT48c3Ryb25nPkFEQkJlYW5UZW1wbGF0ZS54c2w8L3N0cm9uZz4gLSB0aGUgWFNMdGVtcGxhdGUgdGhlDQotSmF2YUJlYW5Xcml0ZXIgdXNlcy48L2xpPg0KLTxsaT48c3Ryb25nPlNjaGVtYS1jb21waWxlLnByb3BlcnRpZXM8L3N0cm9uZz4gLSBUaGUgcHJvcGVydHkgZmlsZQ0KLWZvciB0aGUgc2NoZW1hIGNvbXBpbGVyPC9saT4NCi08L29sPg0KLTxwPlRoZSBlYXNpZXN0IHdheSB0byBvYnRhaW4gdGhlIEFEQiBiaW5hcmllcyBpcyB0byBydW4gdGhlIG1hdmVuDQotYnVpbGQgZm9yIHRoZSBBeGlzMiBhZGItY29kZWdlbiBtb2R1bGUuIFRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUNCi08c3Ryb25nPmF4aXMyLWFkYi1jb2RlZ2VuLXskdmVyc2lvbn0uamFyPC9zdHJvbmc+IGluc2lkZSB0aGUgdGFyZ2V0DQotZm9sZGVyIHdoaWNoIGlzIGRpcmVjdGx5IHVzYWJsZSB3aGVuIHRoZSBBREIgc2NoZW1hIGNvbXBpbGVyIGlzDQotcmVxdWlyZWQuPC9wPg0KLTxwPlRoZSBydW50aW1lIGRlcGVuZGVuY2llcyBmb3IgdGhlIEFEQiBnZW5lcmF0ZWQgY2xhc3NlcyBpcyBpbiB0aGUNCi1BeGlzMiBhZGIgbW9kdWxlIGFuZCB0aGUga2VybmFsIG1vZHVsZS4gSGVuY2UgdG8gY29tcGlsZSBhbmQgd29yaw0KLXdpdGggdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHRoZQ0KLTxzdHJvbmc+YXhpczItYWRiLXskdmVyc2lvbn0uamFyPC9zdHJvbmc+IGFuZA0KLTxzdHJvbmc+YXhpczIta2VybmFsLXskdmVyc2lvbn0uamFyPC9zdHJvbmc+IG5lZWRzIHRvIGJlIGluIHRoZQ0KLWNsYXNzcGF0aCBpbiBhZGRpdGlvbiB0byBvdGhlciBkZXBlbmRlbmNpZXMgc3VjaCBhcyBTdEFYLCBBeGlvbSwNCi1Db21tb25zLWxvZ2dpbmcgYW5kIGphdmF4LmFjdGl2YXRpb24uPC9wPg0KLTxhIG5hbWU9ImNvZGVfZ2VuIiBpZD0iY29kZV9nZW4iPjwvYT4NCi08aDI+SW52b2tpbmcgdGhlIEFEQiBDb2RlIEdlbmVyYXRvcjwvaDI+DQotPGEgbmFtZT0ic2NoZW1hX2NvbXBpbGVyIiBpZD0ic2NoZW1hX2NvbXBpbGVyIj48L2E+DQotPGgzPkFzIGEgU3RhbmRhbG9uZSBTY2hlbWEgQ29tcGlsZXI8L2gzPg0KLTxwPkFEQiBjb21lcyB3aXRoIGEgWFNEMkphdmEgY29kZSBnZW5lcmF0b3IgdGhhdCBhbGxvd3MgdGhlIHNjaGVtYXMNCi10byBiZSBjb21waWxlZCBqdXN0IGJ5IGdpdmluZyB0aGUgc2NoZW1hIGZpbGUgcmVmZXJlbmNlLiBUaGlzIG1haW4NCi1jbGFzcyBpcyBwcmVzZW50bHkgcmF0aGVyIHByaW1pdGl2ZSBhbmQgZG9lcyBub3QgcHJvdmlkZSBtdWNoDQotY29udHJvbCBvdmVyIHRoZSBjb2RlIGdlbmVyYXRpb24gcHJvY2Vzcy4gVGhpcyBpcyBib3VuZCB0byBpbXByb3ZlDQotaW4gdGhlIG5lYXIgZnV0dXJlLjwvcD4NCi08cD5YU0QySmF2YSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczo8L3A+DQotPG9sPg0KLTxsaT5UaGUgU2NoZW1hIGZpbGUgbmFtZSAtIFRoaXMgc2hvdWxkIGJlIGEgY29tcGxldGUgZmlsZSBuYW1lDQotcG9pbnRpbmcgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtPC9saT4NCi08bGk+VGhlIG91dHB1dCBmb2xkZXIgbmFtZSAtIFRoaXMgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgZm9sZGVyDQotd2l0aGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbTwvbGk+DQotPC9vbD4NCi08cD5TaW5jZSB0aGUgY29kZSBnZW5lcmF0b3IgcHJlc2VudGx5IGhhcyBubyB2YWxpZGF0aW9ucyBidWlsdCBpbnRvDQotaXQsIHRoZSBjb21waWxlciBpcyBsaWtlbHkgdG8gc2hvdyB2YXJpb3VzIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXNlDQotcGFyYW1ldGVycyBhcmUgbm90IHN1cHBsaWVkIHByb3Blcmx5LjwvcD4NCi08YSBuYW1lPSJhcGkiIGlkPSJhcGkiPjwvYT4NCi08aDM+VGhyb3VnaCB0aGUgQVBJPC9oMz4NCi08cD5UaGlzIGlzIHRoZSBvbmx5IHdheSB0byBoYXJuZXNzIHRoZSBmdWxsIHBvdGVudGlhbCBvZiB0aGUgc2NoZW1hDQotY29tcGlsZXIuIFRoZSBjdXJyZW50IEF4aXMyIGludGVncmF0aW9uIG9mIEFEQiBoYXBwZW5zIHRocm91Z2ggdGhpcw0KLUFQSS4gVGhlIG1vc3QgaW1wb3J0YW50IGNsYXNzZXMgYW5kIG1ldGhvZHMgb2YgdGhlIFNjaGVtYSBjb21waWxlcg0KLWFyZSBhcyBmb2xsb3dzLjwvcD4NCi08dWw+DQotPGxpPjxzdHJvbmc+U2NoZW1hQ29tcGlsZXIgLSBDb25zdHJ1Y3Rvcjwvc3Ryb25nPg0KLTxwPlRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc2NoZW1hIGNvbXBpbGVyIGV4cGVjdHMgYSBDb21waWxlck9wdGlvbnMNCi1vYmplY3QuIFRoaXMgY29tcGlsZXJPcHRpb25zIG9iamVjdCBpcyBtb3JlIG9mIGEgaG9sZGVyIGZvciB0aGUNCi1wYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgU2NoZW1hQ29tcGlsZXIuIFRoZSBvbmx5DQotbWFuZGF0b3J5IHBhcmFtZXRlciBpbiB0aGUgQ29tcGlsZXJPcHRpb25zIGlzIHRoZSBvdXRwdXQNCi1kaXJlY3RvcnkuPC9wPg0KLTwvbGk+DQotPGxpPjxzdHJvbmc+U2NoZW1hQ29tcGlsZXIgLSBDb21waWxlKFhNTFNjaGVtYSBzY2hlbWEpPC9zdHJvbmc+DQotPHA+VGhlIGNvbXBpbGUgbWV0aG9kIHRvIGNhbGwgZm9yIGEgc2luZ2xlIHNjaGVtYS4gVGhlIGV4cGVjdGVkDQotb2JqZWN0IGlzIGEgWE1MU2NoZW1hIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFhtbFNjaGVtYSBsaWJyYXJ5LjwvcD4NCi08L2xpPg0KLTxsaT48c3Ryb25nPlNjaGVtYUNvbXBpbGVyIC0gQ29tcGlsZShMaXN0IHNjaGVtYUxpc3QpPC9zdHJvbmc+DQotPHA+U2ltaWxhciB0byB0aGUgcHJldmlvdXMgbWV0aG9kIGJ1dCBhY2NlcHRzIGEgbGlzdCBvZiBzY2hlbWFzDQotaW5zdGVhZCBvZiBvbmUuPC9wPg0KLTwvbGk+DQotPC91bD4NCi08cD5Gb3IgYSBjb21wcmVoZW5zaXZlIGNvZGUgc2FtcGxlIGluIGludm9raW5nIHRoZSBzY2hlbWEgY29tcGlsZXINCi10aHJvdWdoIHRoZSBBUEksIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyB3b3VsZCBiZSBoZWxwZnVsLiBPbmUgd291bGQNCi1hbHNvIG5lZWQgYW4gdW5kZXJzdGFuZGluZyBvZiB0aGUgZ2VuZXJhdGlvbiBtb2RlcyBvZiB0aGUgQURCDQotc2NoZW1hIGNvbXBpbGVyIHdoZW4gdXNpbmcgaXQgdGhyb3VnaCB0aGUgQVBJLiBIZW5jZSB0aGUgZm9sbG93aW5nDQotc2VjdGlvbiBpbmNsdWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBnZW5lcmF0aW9uIG1vZGVzLjwvcD4NCi08dWw+DQotPGxpPjxzdHJvbmc+b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEuWFNEMkphdmE8L3N0cm9uZz48L2xpPg0KLTxsaT48c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLkV4dGVuc2lvblV0aWxpdHk8L3N0cm9uZz48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iZ2VuX21vZGVzIiBpZD0iZ2VuX21vZGVzIj48L2E+DQotPGgyPkdlbmVyYXRpb24gTW9kZXM8L2gyPg0KLTxwPkFEQiBleHRlbnNpb24gcHJvdmlkZXMgc2V2ZXJhbCBnZW5lcmF0aW9uIG1vZGVzIGZvciB0aGUgZGF0YQ0KLWJvdW5kIGNsYXNzZXMuPC9wPg0KLTxvbD4NCi08bGk+PHN0cm9uZz5JbnRlZ3JhdGVkIE1vZGU8L3N0cm9uZz4NCi08cD5JbiB0aGlzIG1vZGUgdGhlIGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBhcyBpbm5lciBjbGFzc2VzIG9mIHRoZQ0KLXN0dWIsIG1lc3NhZ2UgcmVjZWl2ZXIgb3IgdGhlIGludGVyZmFjZS4gVGhlIEFEQiBmcmFtZXdvcmsgZG9lcyBub3QNCi1hY3R1YWxseSB3cml0ZSB0aGUgY2xhc3NlcyBidXQgaW5zdGVhZCBwcm92aWRlcyBhIG1hcCBvZiBET00NCi1kb2N1bWVudCBvYmplY3RzIHRoYXQgY29udGFpbnMgdGhlIG1vZGVsIGZvciB0aGUgZGF0YWJpbmRpbmcNCi1jbGFzc2VzLiBUaGUgQXhpczIgY29kZWdlbiBlbmdpbmUgaW4gdHVybiBwYXJzZXMgdGhlc2UgZG9jdW1lbnRzDQotd2l0aGluIGl0cyBvd24gWFNMVCBwYXJzZXIgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgY2xhc3Nlcy4NCi1JbXBsZW1lbnRlcnMgYXJlIGZyZWUgdG8gdXNlIHRoZXNlIG1vZGVscyBkaWZmZXJlbnRseSBmb3IgdGhlaXIgb3duDQotcGFydGljdWxhciBuZWVkcy48L3A+DQotPHA+SW50ZWdyYXRlZCBtb2RlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdG9vbCBidWlsZGVycy48L3A+DQotPC9saT4NCi08bGk+PHN0cm9uZz5XcmFwcGVkIE1vZGU8L3N0cm9uZz4NCi08cD5JbiB0aGUgd3JhcHBlZCBtb2RlLCB0aGUgQURCIGRhdGFiaW5kZXIgZ2VuZXJhdGVzIG9uZSBjbGFzcyB0aGF0DQotY29udGFpbnMgYWxsIHRoZSBkYXRhYm91bmQgY2xhc3Nlcy4gVGhpcyBpcyBjb252ZW5pZW50IHdoZW4gdGhlDQotbnVtYmVyIG9mIGNsYXNzZXMgbmVlZCB0byBiZSBsaW1pdGVkLjwvcD4NCi08L2xpPg0KLTxsaT48c3Ryb25nPkV4cGFuZGVkIE1vZGU8L3N0cm9uZz4NCi08cD5UaGlzIGlzIHRoZSB1c3VhbCBtb2RlIHdoZXJlIHRoZSBjb2RlIGdlbmVyYXRvciBnZW5lcmF0ZXMgYQ0KLWNsYXNzIGZvciBlYWNoIG9mIHRoZSBvdXRlciBlbGVtZW50cyBhbmQgdGhlIG5hbWVkIGNvbXBsZXggdHlwZXMuDQotVGhlIGNvbW1hbmQgbGluZSB0b29sIChYU0QySmF2YSkgYWx3YXlzIGdlbmVyYXRlcyBjb2RlIGluIHRoZQ0KLWV4cGFuZGVkIG1vZGUuPC9wPg0KLTwvbGk+DQotPC9vbD4NCi08cD5UaGUgcnVsZXMgZm9yIGdlbmVyYXRpbmcgY29kZSAoZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24pDQotYXBwbGllcyByZWdhcmRsZXNzIG9mIHRoZSBtb2RlLiBTd2l0Y2hpbmcgdGhlc2UgbW9kZXMgY2FuIGJlIGRvbmUNCi1ieSBwYXNzaW5nIHRoZSBjb3JyZWN0IG9wdGlvbnMgdmlhIHRoZSBDb21waWxlck9wdGlvbnMgb2JqZWN0LiBUaGUNCi1mb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIG9wdGlvbnMgYW5kIHRoZSBlZmZlY3RzIG9mIHVzaW5nDQotdGhlbS48L3A+DQotPHRhYmxlIGJvcmRlcj0iMSIgc3VtbWFyeT0iT3B0aW9ucyBhbmQgZGVzY3JpcHRpb25zIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkZpZWxkIE5hbWUgaW4gT3B0aW9uczwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD53cml0ZU91dHB1dDwvdGQ+DQotPHRkPlRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHdyaXRlIHRoZSBvdXRwdXQgb3Igbm90LiBJZiB0aGUgZmxhZw0KLWlzIG9uIHRoZW4gdGhlIGNsYXNzZXMgd2lsbCBiZSB3cml0dGVuIGJ5IEFEQi4gVGhlIGRlZmF1bHQgaXMNCi1vZmYuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+d3JhcENsYXNzZXM8L3RkPg0KLTx0ZD5UaGlzIGRldGVybWluZXMgd2hldGhlciB0byB3cmFwIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4gSWYgdGhlDQotZmxhZyBpcyBvbiB0aGVuIGEgc2luZ2xlIGNsYXNzICh3aXRoIGFkYiBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZQ0KLXNwZWNpZmllZCBwYWNrYWdlKSB3aWxsIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgb2ZmLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPm1hcHBlckNsYXNzUGFja2FnZTwvdGQ+DQotPHRkPlRoZSBwYWNrYWdlIG5hbWUgZm9yIHRoZSBtYXBwZXIgY2xhc3MuIFBsZWFzZSBzZWUgdGhlIGFkdmFuY2VkDQotc2VjdGlvbiBmb3IgZGV0YWlscyBvZiB0aGUgbWFwcGVyIGNsYXNzLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmhlbHBlck1vZGU8L3RkPg0KLTx0ZD5UaGUgc3dpdGNoIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHN3aXRjaCB0byBoZWxwZXIgbW9kZSBvcg0KLW5vdC4gUGxlYXNlIHNlZSB0aGUgYWR2YW5jZWQgc2VjdGlvbiBmb3IgZGV0YWlscyBvZiBoZWxwZXINCi1tb2RlLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPm5zMlBhY2thZ2VNYXA8L3RkPg0KLTx0ZD5BIG1hcCB0aGF0IHN0b3JlcyB0aGUgbmFtZXNwYWNlIG5hbWUgYWdhaW5zdCB0aGUgcGFja2FnZSBuYW1lDQotVGhlc2UgZGV0YWlscyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYWNrYWdlczwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPGEgbmFtZT0iZGVlcCIgaWQ9ImRlZXAiPjwvYT4NCi08aDI+RGVlcCBpbnRvIEdlbmVyYXRlZCBDb2RlPC9oMj4NCi08cD5XaGVuIHRoZSBzY2hlbWEgY29tcGlsZXIgaXMgaW52b2tlZCAob25lLXdheSBvciBhbm90aGVyKSBpdA0KLWdlbmVyYXRlcyBjb2RlIGRlcGVuZGluZyBvbiB0aGUgZm9sbG93aW5nIHJ1bGVzOjwvcD4NCi08b2w+DQotPGxpPkFsbCBuYW1lZCBjb21wbGV4IHR5cGVzIGJlY29tZSBiZWFuIGNsYXNzZXMuIEFueSBhdHRyaWJ1dGUgb3INCi1lbGVtZW50IGVuY2Fwc3VsYXRlZCBpbiB0aGlzIGNvbXBsZXggdHlwZSB3aWxsIGJlY29tZSBhIGZpZWxkIGluDQotdGhlIGdlbmVyYXRlZCBjbGFzcy4gTm90ZSB0aGF0IHRoZSBzdXBwb3J0IGZvciBjb25zdHJ1Y3RzIG90aGVyDQotdGhhbiB4c2Q6c2VxdWVuY2UgYW5kIHhzZDphbGwgaXMgbm90IHlldCBpbXBsZW1lbnRlZC48L2xpPg0KLTxsaT5BbGwgdG9wIGxldmVsIGVsZW1lbnRzIGJlY29tZSBjbGFzc2VzLiBUaGlzIGlzIGEgcmF0aGVyIG9idmlvdXMNCi1mZWF0dXJlIHNpbmNlIHVubGVzcyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoZSB0b3AgbGV2ZWwNCi1lbGVtZW50cyB0aGUgaGFuZGxpbmcgb2YgZWxlbWVudHMgYmVjb21lcyBkaWZmaWN1bHQgYW5kIG1lc3N5ITwvbGk+DQotPGxpPlNpbXBsZVR5cGUgcmVzdHJpY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHJlcGxhY2luZyB0aGUgcmVsZXZhbnQNCi10eXBlIHdpdGggdGhlIGJhc2V0eXBlPC9saT4NCi08L29sPg0KLTxwPk9uY2UgdGhlIGNvZGUgaXMgZ2VuZXJhdGVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgaXQgbG9va3MgbGlrZQ0KLXRoZSBmb2xsb3dpbmcuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc2NoZW1hOjwvcD4NCi08cHJlPg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIiANCi1lbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgJmd0Ow0KLSZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvJmd0Ow0KLSAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCImZ3Q7DQotICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgJmx0O2VsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgJmx0O2VsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgJmx0O2VsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvJmd0Ow0KLSAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0mbHQ7ZWxlbWVudCBuYW1lPSJteUVsZW1lbnQiIHR5cGU9InRuczpTT0FQU3RydWN0Ii8mZ3Q7DQotJmx0Oy9zY2hlbWEmZ3Q7DQotPC9wcmU+DQotPHA+Rm9yIGNvbXByZWhlbnNpb24gbGV0IHVzIGNvbnNpZGVyIHRoZSBleHBhbmRlZCBtb2RlIGZvciB0aGUgY29kZQ0KLWdlbmVyYXRvci4gVW5sZXNzIHNwZWNpZmljYWxseSBtZW50aW9uZWQsIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQNCi1hc3N1bWVzIHRoYXQgdGhlIGV4cGFuZGVkIG1vZGUgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbiBpcyB1c2VkLiBUaGlzDQotcGFydGljdWxhciBzY2hlbWEgd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nIHR3byBjbGFzc2VzIGluIHRoZQ0KLWRlc2lnbmF0ZWQgcGFja2FnZSwgd2hpY2ggaW4gdGhpcyBjYXNlIHdvdWxkIGJlDQotPHN0cm9uZz5vcmcuc29hcGludGVyb3AudHlwZXM8L3N0cm9uZz4uIFRoZSBwYWNrYWdlIG5hbWUgaXMgZGVyaXZlZA0KLWZyb20gdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS48L3A+DQotPG9sPg0KLTxsaT5NeUVsZW1lbnQuamF2YTwvbGk+DQotPGxpPlNPQVBTdHJ1Y3QuamF2YTwvbGk+DQotPC9vbD4NCi08cD5BcyBleHBsYWluZWQgZWFybGllciwgU09BUFN0cnVjdCByZWZlcnMgdG8gdGhlIGNvbXBsZXhUeXBlLg0KLU15RWxlbWVudCBpcyB0aGUgY2xhc3MgdGhhdCByZWZlcnMgdG8gdGhlIGVsZW1lbnQuIEp1c3QgYXMNCi1leHBlY3RlZCwgdGhlIFNPQVBTdHJ1Y3QgYmVhbiBoYXMgZ2V0dGVycyBhbmQgc2V0dGVycyBmb3INCi12YXJTdHJpbmcsIHZhckludCBhbmQgdmFyRmxvYXQgd2hpY2ggYXJlIFN0cmluZywgaW50IGFuZCBmbG9hdA0KLXJlc3BlY3RpdmVseS4gTXlFbGVtZW50IG9uIHRoZSBvdGhlciBoYW5kIGhhcyBhIHNpbmdsZSBmaWVsZA0KLXJlcHJlc2VudGluZyB0aGUgU09BUFN0cnVjdCBvYmplY3QgdGhhdCBpdCBlbmNhcHN1bGF0ZXMuPC9wPg0KLTxwPlRoZSBtb3N0IGltcG9ydGFudCBhc3BlY3Qgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGlzIHRoYXQgaXQNCi1lbmNhcHN1bGF0ZXMgdHdvIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGFuZCBzZXJpYWxpemluZyB0aGUgYmVhbnMuDQotTm90ZSB0aGF0IHRvIG1ha2UgdGhpcyB3b3JrLCB0aGUgZ2VuZXJhdGVkIGJlYW5zIGltcGxlbWVudCB0aGUNCi08c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbjwvc3Ryb25nPiBpbnRlcmZhY2U8L3A+DQotPHA+VGhlIGNyZWF0b3IgYW5kIHNlcmlhbGl6ZXIgbWV0aG9kcyBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+DQotPHVsPg0KLTxsaT4NCi08cHJlPg0KLXB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcg0KLSAgICBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpDQotPC9wcmU+DQotPHA+VGhpcyBtZXRob2QgcmV0dXJucyBhIHB1bGwgcGFyc2VyIHRoYXQgdGhyb3dzIHRoZSByaWdodCBldmVudHMNCi1mb3IgdGhpcyBwYXJ0aWN1bGFyIG9iamVjdC4gSG93ZXZlciB0aGVyZSBpcyBhIHN1YnRsZSBkaWZmZXJlbmNlDQotYmV0d2VlbiBlbGVtZW50IGJhc2VkIGNsYXNzZXMgYW5kIGNvbXBsZXhUeXBlIGJhc2VkIGNsYXNzZXM8L3A+DQotPG9sPg0KLTxsaT5BbiBlbGVtZW50IGJhc2VkIGJlYW4gY2xhc3MgKGxpa2UgTXlFbGVtZW50LmphdmEgaW4gdGhlDQotZXhhbXBsZSkgd2lsbCA8c3Ryb25nPjxlbT5pZ25vcmUgdGhlIHBhc3NlZCBpbiBRTmFtZTwvZW0+PC9zdHJvbmc+Lg0KLUluc3RlYWQgb2YgdXNpbmcgdGhlIHBhc3NlZCBpbiBRTmFtZSBpdCdsbCB1dGlsaXplIGl0cyBvd24gUU5hbWUNCi13aGljaCBpcyBlbWJlZGRlZCBpbiB0aGUgY2xhc3MgdW5kZXIgdGhlIGNvbnN0YW50IE1ZX1FOQU1FLCBkdXJpbmcNCi10aGUgY29kZSBnZW5lcmF0aW9uLiBIZW5jZSBpdCBpcyB1c3VhbCB0byBjYWxsIGdldFB1bGxwYXJzZXIoKSB3aXRoDQotYSBudWxsIHBhcmFtZXRlciBmb3IgZWxlbWVudHMuPC9saT4NCi08bGk+QSBDb21wbGV4VHlwZSBiYXNlZCBiZWFuIGNsYXNzIChsaWtlIFNPQVBTdHJ1Y3QuamF2YSBpbiB0aGUNCi1leGFtcGxlKSB3aWxsIHVzZSB0aGUgcGFzc2VkLWluIFFOYW1lIHRvIHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUNCi1BREJwdWxscGFyc2VyLiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkgd3JhcCB0aGUgZWxlbWVudHMgaW5zaWRlIHdpdGgNCi1hbiBlbGVtZW50IGhhdmluZyB0aGUgcGFzc2VkIFFOYW1lPC9saT4NCi08L29sPg0KLTwvbGk+DQotPGxpPg0KLTxwcmU+DQotIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBnZXRPTUVsZW1lbnQoDQotICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBwYXJlbnRRTmFtZSwNCi0gICAgICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeSBmYWN0b3J5KXsNCi08L3ByZT4NCi08cD5UaGlzIG1ldGhvZCByZXR1cm5zIGFuIE9NRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIEFEQiBiZWFuDQotb2JqZWN0LjwvcD4NCi08b2w+DQotPGxpPkluc2lkZSB0aGUgZ2V0T01FbGVtZW50IG1ldGhvZCBhbiBhbm9ueW1vdXMgQURCRGF0YVNvdXJjZSBjbGFzcw0KLWlzIGNyZWF0ZWQuIFRoaXMgYW5vbnltb3VzIGNsYXNzIGltcGxlbWVudHMgYSBzZXJpYWxpemUoKSBtZXRob2QNCi13aGVyZSB0aGUgc2VyaWFsaXphdGlvbiBsb2dpYyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGJlYW4gY2xhc3MgaXMNCi1oYW5kbGVkLiBGaW5hbGx5IGFuIE9NU291cmNlZEVsZW1lbnRJbXBsIG9iamVjdCB3aXRoIHRoZSBhYm92ZQ0KLWFub255bW91cyBjbGFzcyB0eXBlIG9iamVjdCBhcyB0aGUgZGF0YSBzb3VyY2UgaXMgcmV0dXJuZWQuPC9saT4NCi08L29sPg0KLTwvbGk+DQotPGxpPg0KLTxwcmU+DQotIHB1YmxpYyBzdGF0aWMgW09iamVjdF0uRmFjdG9yeS4gDQotICAgICAgICAgICAgIHBhcnNlKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgDQotICAgICAgICAgICAgIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIA0KLTwvcHJlPg0KLTxwPlRoaXMgbWV0aG9kIHJldHVybnMgYSBwb3B1bGF0ZWQgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGluDQotcXVlc3Rpb24uIE5vdGUgdGhhdDwvcD4NCi08cHJlPg0KLVtPYmplY3RdDQotPC9wcmU+DQotd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgYWN0dWFsIGNsYXNzIHRoYXQgY29udGFpbnMgdGhpcyBtZXRob2QuIFNheQ0KLWZvciBTT0FQU3RydWN0IHRoZSBtZXRob2QgbG9va3MgbGlrZQ0KLTxwcmU+DQotcHVibGljIHN0YXRpYyBTT0FQU3RydWN0LkZhY3RvcnkuIA0KLSAgICAgICAgICAgICAgICBwYXJzZShqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciByZWFkZXIpIA0KLSAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbg0KLTwvcHJlPg0KLTxwPkFsc28gbm90ZSB0aGF0IHRoZSBhYm92ZSBwYXJzZSBtZXRob2QgaXMgYXZhaWxhYmxlIGluIHRoZQ0KLTxzdHJvbmc+RmFjdG9yeTwvc3Ryb25nPiBuZXN0ZWQgY2xhc3Mgd2l0aGluIHRoZSByZWxldmFudCB0b3AgbGV2ZWwNCi1jbGFzcy4gSGVuY2Ugb25lIHdpbGwgaGF2ZSB0byBnZXQgdGhlIHN0YXRpYyBGYWN0b3J5IGluc3RhbmNlDQotYmVmb3JlIGNhbGxpbmcgdGhlIHBhcnNlIG1ldGhvZC48L3A+DQotPC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImV4YW1wbGUiIGlkPSJleGFtcGxlIj48L2E+DQotPGgzPkFuIEV4YW1wbGUhPC9oMz4NCi08cD5Db25zaWRlciB0aGUgZm9sbG93aW5nIFhNTCBmcmFnbWVudDwvcD4NCi08cHJlPg0KLSZsdDtteUVsZW1lbnQgeG1sbnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiJmd0Ow0KLSAgJmx0O3ZhckludCZndDs1Jmx0Oy92YXJJbnQmZ3Q7DQotICAmbHQ7dmFyU3RyaW5nJmd0O0hlbGxvJmx0Oy92YXJTdHJpbmcmZ3Q7DQotICAmbHQ7dmFyRmxvYXQmZ3Q7My4zJmx0Oy92YXJGbG9hdCZndDsNCi0mbHQ7L215RWxlbWVudCZndDsNCi08L3ByZT4NCi08cD5FbnRodXNpYXN0aWMgcmVhZGVycyBtaWdodCBhbHJlYWR5IGhhdmUgZmlndXJlZCBvdXQgdGhhdCB0aGlzDQotWE1MIGZyYWdtZW50IGNvbXBsaWVzIHdpdGggdGhlIFNjaGVtYSBtZW50aW9uZWQgYWJvdmUuIFRoZQ0KLWZvbGxvd2luZyBjb2RlIHNuaXBwZXQgc2hvd3MgaG93IHRvIGJ1aWxkIGEgcG9wdWxhdGVkIGluc3RhbmNlIG9mDQotTXlFbGVtZW50IHdpdGggdGhlIFhNTCBhYm92ZTo8L3A+DQotPHByZT4NCi1YTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVYTUxTdHJlYW1SZWFkZXIoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOw0KLU15RWxlbWVudCBlbHQgPSBNeUVsZW1lbnQuRmFjdG9yeS5wYXJzZShyZWFkZXIpOw0KLTwvcHJlPg0KLTxwPk9wdGlvbmFsbHksIHRoZSBhYm92ZSB4bWwgZnJhZ21lbnQgY2FuIGJlIHJlcHJvZHVjZWQgd2l0aCB0aGUNCi1mb2xsb3dpbmcgY29kZSBmcmFnbWVudDo8L3A+DQotPHByZT4NCi1PTUVsZW1lbnQgb21FbGVtZW50ID0gbXlFbGVtZW50LmdldE9NRWxlbWVudA0KLSAgICAgICAgICAgICAgICAoTXlFbGVtZW50Lk1ZX1FOQU1FLCBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOw0KLVN0cmluZyB4bWxTdHJpbmcgPSBvbUVsZW1lbnQudG9TdHJpbmdXaXRoQ29uc3VtZSgpOw0KLTwvcHJlPg0KLTxwPkFsdGhvdWdoIHRoaXMgZXhhbXBsZSB0YWtlcyBvbiB0aGUgdGVkaW91cyBlZmZvcnQgb2YgY3JlYXRpbmcgYQ0KLXJlYWRlciBvdXQgb2YgYSBTdHJpbmcsIGluc2lkZSB0aGUgQXhpczIgZW52aXJvbm1lbnQgYW4NCi1YTUxTdHJlYW1SZWFkZXIgY2FuIGJlIGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIE9NRWxlbWVudCEgSGVuY2UsDQotdGhlIHBhcnNlIG1ldGhvZCBiZWNvbWVzIGEgaHVnZSBhZHZhbnRhZ2UgZm9yIGhhc3NsZSBmcmVlIG9iamVjdA0KLWNyZWF0aW9uLjwvcD4NCi08cD5TaW1pbGFybHkgdGhlIHJlYWRlciBvYnRhaW5lZCBmcm9tIHRoZSBvYmplY3QgY2FuIGFsc28gYmUNCi11dGlsaXplZCBhcyBuZWVkZWQuIFRoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cyBob3cgdG8NCi11dGlsaXplIHRoZSBnZXRQdWxsUGFyc2VyIG1ldGhvZCB0byBjcmVhdGUgYW4gT01FbGVtZW50IDo8L3A+DQotPHByZT4NCi1YTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZWx0LmdldFB1bGxQYXJzZXIobnVsbCk7DQotT01FbGVtZW50IG9tRWx0ID0gIG5ldyBTdEFYT01CdWlsZGVyKHJlYWRlcikuZ2V0RG9jdW1lbnRFbGVtZW50KCk7DQotPC9wcmU+DQotPHA+VGhhdCdzIGFsbCB0byBpdCEgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIG1vcmUgb24gQURCDQotdGhlIGZvbGxvd2luZyBkb2N1bWVudHMgbWF5IGFsc28gYmUgaGVscGZ1bC4gSG93ZXZlciwgYmUgc3VyZSB0bw0KLWNoZWNrIHRoZSBsaW1pdGF0aW9ucyBzZWN0aW9uIHRoYXQgZm9sbG93cyBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvDQotdXNlIEFEQiBmb3Igc29tZXRoaW5nIHNlcmlvdXMuPC9wPg0KLTxhIG5hbWU9ImxpbWl0YXRpb24iIGlkPSJsaW1pdGF0aW9uIj48L2E+DQotPGgyPktub3duIExpbWl0YXRpb25zPC9oMj4NCi08cD5BREIgaXMgbWVhbnQgdG8gYmUgYSAnU2ltcGxlJyBkYXRhYmluZGluZyBmcmFtZXdvcmsgYW5kIHdhcyBub3QNCi1tZWFudCB0byBjb21waWxlIGFsbCB0eXBlcyBvZiBzY2hlbWFzLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zDQotYXJlIHRoZSBtb3N0IGhpZ2hsaWdodGVkLjwvcD4NCi08b2w+DQotPGxpPkNvbXBsZXggVHlwZSBFeHRlbnNpb25zIGFuZCBSZXN0cmljdGlvbnMuPC9saT4NCi08L29sPg0KLTxhIG5hbWU9Im1vcmUiIGlkPSJtb3JlIj48L2E+DQotPGgyPldhbnQgdG8gTGVhcm4gTW9yZT88L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iYWRiLWFkdmFuY2VkLmh0bWwiPkFkdmFuY2VkIGZlYXR1cmVzIG9mIHRoZSBBREIgY29kZQ0KLWdlbmVyYXRvcjwvYT4gLSBleHBsYWlucyB4c2k6dHlwZSBiYXNlZCBkZXNlcmlhbGl6YXRpb24gYW5kIGhlbHBlcg0KLW1vZGU8L2xpPg0KLTxsaT48YSBocmVmPSJhZGItdHdlYWtpbmcuaHRtbCI+VHdlYWtpbmcgdGhlIEFEQiBDb2RlIEdlbmVyYXRvcjwvYT4NCi0tIGV4cGxhaW5zIGF2YWlsYWJsZSBtZWNoYW5pc21zIHRvIGV4dGVuZCBBREIgYW5kIHBvc3NpYmx5IGFkb3B0IGl0DQotdG8gY29tcGlsZSBzY2hlbWFzIHRvIHN1cHBvcnQgb3RoZXIgbGFuZ3VhZ2VzLjwvbGk+DQotPGxpPjxhIGhyZWY9ImFkYi1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwiPkFEQiBhbmQgQXhpczINCi1JbnRlZ3JhdGlvbjwvYT4gLSBleHBsYWlucyBob3cgdGhlIEFEQiBzY2hlbWEgY29tcGlsZXIgd2FzIGF0dGFjaGVkDQotdG8gdGhlIEF4aXMyIGZyYW1ld29yazwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLXR3ZWFraW5nLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZGIvYWRiLXR3ZWFraW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3ZmU2N2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9hZGItdHdlYWtpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPHRpdGxlPkFEQiBUd2Vha2luZyBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5BREIgVHdlYWtpbmcgR3VpZGU8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlIG1lY2hhbmlzbXMgYXZhaWxhYmxlIHRvIGV4dGVuZCBBREINCi1hbmQgcG9zc2libHkgYWRvcHQgaXQgdG8gY29tcGlsZSBzY2hlbWFzIHRvIHN1cHBvcnQgb3RoZXINCi1sYW5ndWFnZXMuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNjb25maWciPktub3cgdGhlIENvbmZpZ3VyYXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2ZpcnN0X3R3ZWFrIj5UaGUgRmlyc3QgVHdlYWsgLSBHZW5lcmF0ZSBQbGFpbiBKYXZhDQotQmVhbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2FkdmFuY2VkX3R3ZWFrIj5BIE1vcmUgQWR2YW5jZWQgVHdlYWsgLSBHZW5lcmF0ZSBDb2RlDQotZm9yIEFub3RoZXIgTGFuZ3VhZ2U8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImludHJvIiBpZD0iaW50cm8iPjwvYT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5BREIgd2FzIHdyaXR0ZW4gd2l0aCBmdXR1cmUgZXh0ZW5zaWJpbGl0eSBpbiBtaW5kLCB3aXRoIGEgY2xlYXINCi1hbmQgZmxleGlibGUgd2F5IHRvIGV4dGVuZCBvciBtb2RpZnkgaXRzIGZ1bmN0aW9uYWxpdHkuIEF2YWlsYWJsZQ0KLW1lY2hhbmlzbXMgdG8gZXh0ZW5kIEFEQiBhbmQgcG9zc2libHkgYWRvcHQgaXQgdG8gY29tcGlsZSBzY2hlbWFzDQotdG8gc3VwcG9ydCBvdGhlciBsYW5ndWFnZXMgYXJlIGRlc2NyaWJlZCBiZWxvdy48L3A+DQotPGEgbmFtZT0iY29uZmlnIiBpZD0iY29uZmlnIj48L2E+DQotPGgyPktub3cgdGhlIENvbmZpZ3VyYXRpb248L2gyPg0KLTxwPlRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQURCIGZyYW1ld29yayBpcyBpbiB0aGUNCi08c3Ryb25nPnNjaGVtYS1jb21waWxlLnByb3BlcnRpZXM8L3N0cm9uZz4gZmlsZSBmb3VuZCBpbiB0aGUNCi08c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hPC9zdHJvbmc+IHBhY2thZ2UuIFRoaXMgcHJvcGVydGllcw0KLWZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgaW1wb3J0YW50IHByb3BlcnRpZXM8L3A+DQotPHVsPg0KLTxsaT5zY2hlbWEuYmVhbi53cml0ZXIuY2xhc3MNCi08cD5UaGlzIGlzIHRoZSB3cml0ZXIgY2xhc3MuIFRoaXMgaXMgdXNlZCBieSB0aGUgc2NoZW1hIGNvbXBpbGVyIHRvDQotd3JpdGUgdGhlIGJlYW5zIGFuZCBzaG91bGQgaW1wbGVtZW50IHRoZQ0KLTxzdHJvbmc+b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEud3JpdGVyLkJlYW5Xcml0ZXI8L3N0cm9uZz4NCi1pbnRlcmZhY2UuIFRoZSBzY2hlbWEgY29tcGlsZXIgZGVsZWdhdGVzIHRoZSBiZWFuIHdyaXRpbmcgdGFzayB0bw0KLXRoZSBzcGVjaWZpZWQgaW5zdGFuY2Ugb2YgdGhlIEJlYW5Xcml0ZXIuPC9wPg0KLTwvbGk+DQotPGxpPnNjaGVtYS5iZWFuLndyaXRlci50ZW1wbGF0ZQ0KLTxwPlRoaXMgc3BlY2lmaWVzIHRoZSB0ZW1wbGF0ZSB0byBiZSB1c2VkIGluIHRoZSBCZWFuV3JpdGVyLiBUaGUNCi1CZWFuV3JpdGVyIGF1dGhvciBpcyBmcmVlIHRvIHVzZSBhbnkgbWVjaGFuaXNtIHRvIHdyaXRlIHRoZSBjbGFzc2VzDQotYnV0IHRoZSBkZWZhdWx0IG1lY2hhbmlzbSBpcyB0byB1c2UgYSB4c2wgdGVtcGxhdGUuIFRoaXMgcHJvcGVydHkNCi1tYXkgYmUgbGVmdCBibGFuayBpZiB0aGUgQmVhbldyaXRlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCB1c2UgYQ0KLXRlbXBsYXRlLjwvcD4NCi08L2xpPg0KLTxsaT5zY2hlbWEuYmVhbi50eXBlbWFwDQotPHA+VGhpcyBpcyB0aGUgdHlwZSBtYXAgdG8gYmUgdXNlZCBieSB0aGUgc2NoZW1hIGNvbXBpbGVyLiBJdA0KLXNob3VsZCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUNCi08c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnR5cGVtYXAuVHlwZU1hcDwvc3Ryb25nPiBpbnRlcmZhY2UuDQotVGhlIGRlZmF1bHQgdHlwZW1hcCBpbXBsZW1lbnRhdGlvbiBlbmNhcHN1bGF0ZXMgYSBoYXNobWFwIHdpdGggdHlwZQ0KLVFOYW1lIHRvIENsYXNzIG5hbWUgc3RyaW5nIG1hcHBpbmcuPC9wPg0KLTwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJmaXJzdF90d2VhayIgaWQ9ImZpcnN0X3R3ZWFrIj48L2E+DQotPGgyPlRoZSBGaXJzdCBUd2VhayAtIEdlbmVyYXRlIFBsYWluIEphdmEgQmVhbnM8L2gyPg0KLTxwPlRoZSBmaXJzdCwgbW9zdCBzaW1wbGUgdHdlYWsgZm9yIHRoZSBjb2RlIGdlbmVyYXRvciBjb3VsZCBiZSB0bw0KLXN3aXRjaCB0byBwbGFpbiBiZWFuIGdlbmVyYXRpb24uIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBBREINCi1mcmFtZXdvcmsgaXMgdG8gZ2VuZXJhdGUgQURCQmVhbnMsIGJ1dCBtb3N0IHVzZXJzLCBpZiB0aGV5IHdhbnQgdG8NCi11c2UgQURCIGFzIGEgc3RhbmRhbG9uZSBjb21waWxlciwgd291bGQgcHJlZmVyIHRvIGhhdmUgcGxhaW4gamF2YQ0KLWJlYW5zLiBUaGlzIGNhbiBpbiBmYWN0IGJlIGRvbmUgYnkgc2ltcGx5IGNoYW5naW5nIHRoZSB0ZW1wbGF0ZQ0KLXVzZWQuPC9wPg0KLTxwPlRoZSB0ZW1wbGF0ZSBmb3IgcGxhaW4gamF2YSBiZWFucyBpcyBhbHJlYWR5IGF2YWlsYWJsZSBpbiB0aGUNCi08c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuc2NoZW1hLnRlbXBsYXRlPC9zdHJvbmc+IHBhY2thZ2UuIFRvIG1ha2UNCi10aGlzIHdvcmsgcmVwbGFjZSB0aGUNCi08c3Ryb25nPi9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3NjaGVtYS90ZW1wbGF0ZS9BREJCZWFuVGVtcGxhdGUueHNsPC9zdHJvbmc+DQotd2l0aCB0aGUNCi08c3Ryb25nPi9vcmcvYXBhY2hlL2F4aXMyL2RhdGFiaW5kaW5nL3NjaGVtYS90ZW1wbGF0ZS9QbGFpbkJlYW5UZW1wbGF0ZS54c2w8L3N0cm9uZz4NCi1pbiB0aGUgc2NoZW1hLWNvbXBpbGUucHJvcGVydGllczxzdHJvbmc+Ljwvc3Ryb25nPjwvcD4NCi08cD5Db25ncmF0dWxhdGlvbnMhIFlvdSBqdXN0IHR3ZWFrZWQgQURCIHRvIGdlbmVyYXRlIHBsYWluIGphdmENCi1iZWFucy48L3A+DQotPHA+VG8gZ2VuZXJhdGUgY3VzdG9tIGZvcm1hdHMsIHRoZSB0ZW1wbGF0ZXMgbmVlZCB0byBiZSBtb2RpZmllZC4NCi1UaGUgc2NoZW1hIGZvciB0aGUgeG1sIGdlbmVyYXRlZCBieSB0aGUgSmF2YUJlYW5Xcml0ZXIgaXMgYXZhaWxhYmxlDQotaW4gdGhlIHNvdXJjZSB0cmVlIHVuZGVyIHRoZSBPdGhlciBkaXJlY3RvcnkgaW4gdGhlIGNvZGVnZW4gbW9kdWxlLg0KLUFkdmFuY2VkIHVzZXJzIHdpdGgga25vd2xlZGdlIG9mIFhTTFQgY2FuIGVhc2lseSBtb2RpZnkgdGhlDQotdGVtcGxhdGVzIHRvIGdlbmVyYXRlIGNvZGUgaW4gdGhlaXIgb3duIGZvcm1hdHMuPC9wPg0KLTxhIG5hbWU9ImFkdmFuY2VkX3R3ZWFrIiBpZD0iYWR2YW5jZWRfdHdlYWsiPjwvYT4NCi08aDI+QSBNb3JlIEFkdmFuY2VkIFR3ZWFrIC0gR2VuZXJhdGUgQ29kZSBmb3IgQW5vdGhlciBMYW5ndWFnZTwvaDI+DQotPHA+VG8gZ2VuZXJhdGUgY29kZSBmb3IgYW5vdGhlciBsYW5ndWFnZSwgdGhlcmUgYXJlIHR3byBtYWluDQotY29tcG9uZW50cyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbi48L3A+DQotPHVsPg0KLTxsaT5UaGUgQmVhbldyaXRlcg0KLTxwPkltcGxlbWVudCB0aGUgQmVhbldyaXRlciBpbnRlcmZhY2UgZm9yIHRoaXMgY2xhc3MuIEEgbmljZQ0KLWV4YW1wbGUgaXMgdGhlDQotPHN0cm9uZz5vcmcuYXBhY2hlLmF4aXMyLnNjaGVtYS53cml0ZXIuSmF2YUJlYW5Xcml0ZXI8L3N0cm9uZz4NCi13aGljaCBoYXMgYSBsb3Qgb2YgcmV1c2FibGUgY29kZS4gSW4gZmFjdCBpZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGlzDQotb2JqZWN0LW9yaWVudGVkIChzdWNoIGFzIEMjIG9yIGV2ZW4gQysrKSwgb25lIHdvdWxkIGV2ZW4gYmUgYWJsZSB0bw0KLWV4dGVuZCB0aGUgSmF2YUJlYW5Xcml0ZXIgaXRzZWxmLjwvcD4NCi08L2xpPg0KLTxsaT5UaGUgVHlwZU1hcA0KLTxwPkltcGxlbWVudCB0aGUgVHlwZU1hcCBpbnRlcmZhY2UgZm9yIHRoaXMgY2xhc3MuIFRoZQ0KLTxzdHJvbmc+b3JnLmFwYWNoZS5heGlzMi5zY2hlbWEudHlwZW1hcC5KYXZhVHlwZU1hcDwvc3Ryb25nPiBjbGFzcw0KLWlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgdHlwZW1hcCB3aGVyZSB0aGUgUU5hbWUgdG8gY2xhc3MNCi1uYW1lIHN0cmluZ3MgYXJlIGtlcHQgaW5zaWRlIGEgaGFzaG1hcCBpbnN0YW5jZS4gVGhpcyB0ZWNobmlxdWUgaXMNCi1mYWlybHkgc3VmZmljaWVudCBhbmQgb25seSB0aGUgdHlwZSBuYW1lcyB3b3VsZCBuZWVkIHRvIGNoYW5nZSB0bw0KLXN1cHBvcnQgYW5vdGhlciBsYW5ndWFnZS48L3A+DQotPC9saT4NCi08L3VsPg0KLTxwPlN1cnByaXNpbmdseSwgdGhpcyBpcyBhbGwgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGhhdmUgb3RoZXINCi1sYW5ndWFnZSBzdXBwb3J0IGZvciBBREIuIENoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBhbmQgeW91IGFyZQ0KLXJlYWR5IHRvIGdlbmVyYXRlIGNvZGUgZm9yIG90aGVyIGxhbmd1YWdlcyE8L3A+DQotPHA+VGhpcyB0d2Vha2luZyBndWlkZSBpcyBzdXBwb3NlZCB0byBiZSBhIHNpbXBsZSBndWlkZWxpbmUgZm9yDQotYW55b25lIHdobyB3aXNoZXMgdG8gZGlnIGRlZXAgaW50byB0aGUgbWVjaGFuaWNzIG9mIHRoZSBBREIgY29kZQ0KLWdlbmVyYXRvci4gVXNlcnMgYXJlIGZyZWUgdG8gZXhwZXJpbWVudCB3aXRoIGl0IGFuZCBtb2RpZnkgdGhlDQotc2NoZW1hIGNvbXBpbGVyIGFjY29yZGluZ2x5IHRvIHRoZWlyIG5lZWRzLiBBbHNvIG5vdGUgdGhhdCB0aGUNCi1pbnRlbnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIDxlbT5ub3Q8L2VtPiB0byBiZSBhIHN0ZXAgYnkgc3RlcA0KLWd1aWRlIHRvIGN1c3RvbSBjb2RlIGdlbmVyYXRpb24uIEFueW9uZSB3aG8gd2lzaCB0byBkbyBzbyB3b3VsZA0KLW5lZWQgdG8gZGlnIGludG8gdGhlIGNvZGUgYW5kIGdldCB0aGVpciBoYW5kcyBkaXJ0eSE8L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2ltYWdlcy9BREIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FkYi9pbWFnZXMvQURCLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjNjRiMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYWRiL2ltYWdlcy9BREIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2Fkdi11c2VyZ3VpZGUueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2Fkdi11c2VyZ3VpZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2YzNjBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hZHYtdXNlcmd1aWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIi8+Ci0gIDx0aXRsZT5BeGlzMiBBZHZhbmNlZCBVc2VyJ3MgR3VpZGU8L3RpdGxlPgotICA8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLSAgbWVkaWE9ImFsbCIvPgotPC9oZWFkPgotCi08Ym9keSBkaXI9Imx0ciIgbGFuZz0iZW4tVVMiPgotPGEgbmFtZT0iX1RvYzk2Njk3ODQ5IiBpZD0iX1RvYzk2Njk3ODQ5Ij48L2E+Ci0KLTxoMSBhbGlnbj0iY2VudGVyIj5BcGFjaGUgQXhpczIgQWR2YW5jZWQgVXNlcidzIEd1aWRlPC9oMT4KLQotPHA+VGhpcyBndWlkZSB3aWxsIGhlbHAgeW91IGdldCBzdGFydGVkIHdpdGggQXhpczIsIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YKLUFwYWNoZSBBeGlzISBJdCBnaXZlcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9uIGhvdyB0byB3cml0ZSBXZWIgc2VydmljZXMgYW5kCi1XZWIgc2VydmljZSBjbGllbnRzIHVzaW5nIEF4aXMyLCBob3cgdG8gd3JpdGUgY3VzdG9tIG1vZHVsZXMsIGFuZCBob3cgdG8gdXNlCi10aGVtIHdpdGggYSBXZWIgc2VydmljZS4gQWR2YW5jZWQgdG9waWNzIGFuZCBzYW1wbGVzIHRoYXQgYXJlIHNoaXBwZWQgd2l0aAotdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQXhpczIgYXJlIGFsc28gZGlzY3Vzc2VkLjwvcD4KLTxhIG5hbWU9IkludHJvZHVjdGlvbiI+PC9hPgotCi08aDI+SW50cm9kdWN0aW9uPC9oMj4KLQotPHA+VGhpcyB1c2VyIGd1aWRlIGlzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIDxhCi1ocmVmPSIuLi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmh0bWwvI3N0ZC1iaW4iPkF4aXMyIFN0YW5kYXJkIEJpbmFyeQotRGlzdHJpYnV0aW9uPC9hPi4gVGhlIFN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb24gY2FuIGJlIGRpcmVjdGx5IDxhCi1ocmVmPSIuLi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmh0bWwvI3N0ZC1iaW4iPmRvd25sb2FkZWQ8L2E+IG9yIGJ1aWx0IHVzaW5nCi10aGUgPGEgaHJlZj0iLi4vZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5odG1sI3NyYyI+U291cmNlIERpc3RyaWJ1dGlvbjwvYT4uIElmCi15b3UgY2hvb3NlIHRoZSBsYXR0ZXIsIHRoZW4gdGhlIDxhIGhyZWY9Imluc3RhbGxhdGlvbmd1aWRlLmh0bWwiPkluc3RhbGxhdGlvbgotR3VpZGU8L2E+IHdpbGwgaW5zdHJ1Y3QgeW91IG9uIGhvdyB0byBidWlsZCBBeGlzMiBTdGFuZGFyZCBCaW5hcnkKLURpc3RyaWJ1dGlvbiB1c2luZyB0aGUgc291cmNlLjwvcD4KLQotPHA+UGxlYXNlIG5vdGUgdGhhdCBBeGlzMiBpcyBhbiBvcGVuLXNvdXJjZSBlZmZvcnQuIElmIHlvdSBmZWVsIHRoZSBjb2RlCi1jb3VsZCB1c2Ugc29tZSBuZXcgZmVhdHVyZXMgb3IgZml4ZXMsIHBsZWFzZSBnZXQgaW52b2x2ZWQgYW5kIGxlbmQgdXMgYSBoYW5kIQotVGhlIEF4aXMgZGV2ZWxvcGVyIGNvbW11bml0eSB3ZWxjb21lcyB5b3VyIHBhcnRpY2lwYXRpb24uPC9wPgotCi08cD5MZXQgdXMga25vdyB3aGF0IHlvdSB0aGluayEgU2VuZCB5b3VyIGZlZWRiYWNrIHRvICI8YQotaHJlZj0ibWFpbHRvOmF4aXMtdXNlckB3cy5hcGFjaGUub3JnP3N1YmplY3Q9W0F4aXMyXSI+YXhpcy11c2VyQHdzLmFwYWNoZS5vcmc8L2E+Ii4KLShTdWJzY3JpcHRpb24gZGV0YWlscyBhcmUgYXZhaWxhYmxlIG9uIHRoZSA8YQotaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbWFpbC1saXN0cy5odG1sIj5BeGlzMiBzaXRlPC9hPi4pIEtpbmRseQotcHJlZml4IHRoZSBzdWJqZWN0IG9mIHRoZSBtYWlsIHdpdGggW0F4aXMyXS48L3A+Ci0KLTxoMj5HZXR0aW5nIFN0YXJ0ZWQ8L2gyPgotCi08cD5UaGUgZmlyc3QgdHdvIHNlY3Rpb25zIG9mIHRoZSB1c2VyIGd1aWRlIGV4cGxhaW4gaG93IHRvIHdyaXRlIGFuZCBkZXBsb3kgYQotbmV3IFdlYiBTZXJ2aWNlIHVzaW5nIEF4aXMyLCBhbmQgaG93IHRvIHdyaXRlIGEgV2ViIFNlcnZpY2UgY2xpZW50IHVzaW5nCi1BeGlzMi4gVGhlIG5leHQgc2VjdGlvbiAtIDxhIGhyZWY9IiNjb25maWciPiBDb25maWd1cmluZyBBeGlzMjwvYT4gLSBwcm92aWRlcwotYW4gaW50cm9kdWN0aW9uIHRvIGltcG9ydGFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaW4gQXhpczIuIFRoZSBmaW5hbAotc2VjdGlvbiAtIDxhIGhyZWY9IiNhZHZhbmNlZCI+QWR2YW5jZWQgVG9waWNzPC9hPiAtIHByb3ZpZGVzIHJlZmVyZW5jZXMgdG8KLW90aGVyIGZlYXR1cmVzLjwvcD4KLQotPHA+SW4gdGhpcyAoZmlyc3QpIHNlY3Rpb24sIHdlIHdpbGwgbGVhcm4gaG93IHRvIHdyaXRlIGFuZCBkZXBsb3kgV2ViCi1zZXJ2aWNlcyB1c2luZyBBeGlzMi4gQWxsIHRoZSBzYW1wbGVzIG1lbnRpb25lZCBpbiB0aGlzIGd1aWRlIGFyZSBsb2NhdGVkIGluCi10aGUgPGI+InNhbXBsZXMvdXNlcmd1aWRlL3NyYyI8L2I+IGRpcmVjdG9yeSBvZiA8YQotaHJlZj0iLi4vZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5odG1sLyNzdGQtYmluIj5BeGlzMiBzdGFuZGFyZCBiaW5hcnkKLWRpc3RyaWJ1dGlvbjwvYT4uPC9wPgotCi08cD5QbGVhc2UgZGVwbG95IGF4aXMyLndhciBpbiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIGFuZCBlbnN1cmUgdGhhdCBpdCB3b3JrcwotZmluZS4gVGhlIDxhIGhyZWY9Imluc3RhbGxhdGlvbmd1aWRlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5JbnN0YWxsYXRpb24KLUd1aWRlPC9hPiBnaXZlcyB5b3Ugc3RlcC1ieS1zdGVwIGluc3RydWN0aW9ucyBvbiBqdXN0IGhvdyB0byBidWlsZCBheGlzMi53YXIKLWFuZCBkZXBsb3kgaXQgaW4geW91ciBzZXJ2bGV0IGNvbnRhaW5lci48L3A+Ci08YSBuYW1lPSJ3c19jb2RlZ2VuIj48L2E+PGEgbmFtZT0iV2ViX1NlcnZpY2VzX1VzaW5nX0F4aXMyIj48L2E+Ci0KLTxoMj5DcmVhdGluZyBhIE5ldyBXZWIgU2VydmljZTwvaDI+Ci0KLTxwPklmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBob3cgdG8gd3JpdGUgYSBXZWIgU2VydmljZSBjbGllbnQgdXNpbmcgQXhpczIsIGl0Ci1pcyBkZXNjcmliZWQgdW5kZXIgPGEgaHJlZj0iI2NsaWVudCI+V3JpdGluZyBhIFdlYiBTZXJ2aWNlIENsaWVudDwvYT4uIEF4aXMyCi1wcm92aWRlcyB0d28gd2F5cyB0byBjcmVhdGUgbmV3IFdlYiBTZXJ2aWNlcywgdXNpbmcgPHN0cm9uZz5jb2RlCi1nZW5lcmF0aW9uPC9zdHJvbmc+IGFuZCB1c2luZyA8c3Ryb25nPlhNTCBiYXNlZCBwcmltYXJ5IEFQSXM8L3N0cm9uZz4uIFRoZQotZm9sbG93aW5nIHNlY3Rpb24gZXhwbGFpbnMgaG93IHRvIHN0YXJ0IGZyb20gYSBXU0RMLCBhbmQgY3JlYXRlIGEgbmV3IHNlcnZpY2UKLXdpdGggY29kZSBnZW5lcmF0aW9uLiBGb3IgdGhlIFhNTCBiYXNlZCBwcmltYXJ5IEFQSSwgcGxlYXNlIHJlZmVyIHRvIHRoZQotc2VjdGlvbiA8YSBocmVmPSJ4bWxiYXNlZC1zZXJ2ZXIuaHRtbCI+V3JpdGluZyBXZWIgU2VydmljZXMgVXNpbmcgQXhpczIncwotUHJpbWFyeSBBUElzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gSG93ZXZlciwgaWYgeW91IGFyZSBhIG5ldyB1c2VyLCBpdCBpcwotYmV0dGVyIHRvIGZvbGxvdyB0aGUgY29kZSBnZW5lcmF0aW9uIGFwcHJvYWNoIGZpcnN0IChnaXZlbiBiZWxvdyk8L3A+Ci0KLTxoMz5TdGFydGluZyB3aXRoIFdTREwsIENyZWF0aW5nIGFuZCBEZXBsb3lpbmcgYSBTZXJ2aWNlPC9oMz4KLQotPHA+V2Ugc3RhcnQgd2l0aCBhIFdTREwsIGhvd2V2ZXIgaWYgeW91IGRvIG5vdCBoYXZlIGEgV1NETCBhbmQgbmVlZCB0byBjcmVhdGUKLWEgV1NETCBmcm9tIGEgamF2YSBjbGFzcywgcGxlYXNlIHVzZSB0aGUgPGEKLWhyZWY9InJlZmVyZW5jZS5odG1sI3dzZGwyamF2YSI+SmF2YTJXU0RMIHRvb2w8L2E+IHRvIGNyZWF0ZSB0aGUgV1NETC4gQXMgeW91Ci1taWdodCBhbHJlYWR5IGtub3csIGEgV1NETCBkZXNjcmlwdGlvbiBvZiBhIHNlcnZpY2UgcHJvdmlkZXMgYSBwcmVjaXNlCi1kZWZpbml0aW9uIG9mIHRoYXQgd2ViIHNlcnZpY2UuIEF4aXMyIGNhbiBwcm9jZXNzIHRoZSBXU0RMIGFuZCBnZW5lcmF0ZSBqYXZhCi1jb2RlIHRoYXQgZG9lcyBtb3N0IG9mIHRoZSB3b3JrIGZvciB5b3UuIEF0IHRoZSBzZXJ2ZXIgc2lkZSwgd2UgY2FsbCB0aGVtCi1Ta2VsZXRvbnMsIGFuZCBhdCB0aGUgY2xpZW50IHNpZGUsIFN0dWJzLjwvcD4KLVRoaXMgbWV0aG9kIG9mIHdyaXRpbmcgYSBXZWIgc2VydmljZSB3aXRoIEF4aXMyIGludm9sdmVzIGZvdXIgc3RlcHM6Ci08b2w+Ci0gIDxsaT5HZW5lcmF0ZSB0aGUgc2tlbGV0b24gY29kZS48L2xpPgotICA8bGk+QWRkIGJ1c2luZXNzIGxvZ2ljLjwvbGk+Ci0gIDxsaT5DcmVhdGUgYSAqLmFhciBhcmNoaXZlIChBeGlzIEFyY2hpdmUpIGZvciB0aGUgV2ViIHNlcnZpY2UuPC9saT4KLSAgPGxpPkRlcGxveSB0aGUgV2ViIHNlcnZpY2UuPC9saT4KLTwvb2w+Ci08YSBuYW1lPSJTdGVwMV86R2VuZXJhdGVfc2tlbGV0b24iPjwvYT4KLQotPGgzPlN0ZXAxOiBHZW5lcmF0ZSBTa2VsZXRvbiBDb2RlPC9oMz4KLQotPHA+VG8gZ2VuZXJhdGUgdGhlIHNrZWxldG9uIGFuZCByZXF1aXJlZCBjbGFzc2VzLCB5b3UgY2FuIHVzZSB0aGUgV1NETDJKYXZhCi10b29sIHByb3ZpZGVkIGluIEF4aXMyLiBUaGlzIHRvb2wgaXMgbG9jYXRlZCBpbiB0aGUgYmluIGRpcmVjdG9yeSBvZiB0aGUKLWRpc3RyaWJ1dGlvbiBhbmQgY2FuIGJlIGV4ZWN1dGVkIHVzaW5nIHRoZSBwcm92aWRlZCBzY3JpcHRzICguYmF0IG9yIC5zaCkuCi1UaGUgdG9vbCdzIHBhcmFtZXRlciBsaXN0IGNhbiBiZSBmb3VuZCBpbiB0aGUgPGEKLWhyZWY9InJlZmVyZW5jZS5odG1sI3dzZGwyY29kZSI+QXhpczIgUmVmZXJlbmNlIERvY3VtZW50PC9hPi48L3A+Ci0KLTxwPlRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgd3NkbDJqYXZhIHRvb2wgaW4gb3VyIGV4YW1wbGUgYXJlIGFzIGZvbGxvd3MuCi1QbGVhc2Ugbm90ZSB0aGF0LCBmb3IgdGhpcyBleGFtcGxlLCB3ZSBhcmUgdXNpbmcgeG1sYmVhbnMgYXMgdGhlIGRhdGEgYmluZGluZyBmcmFtZXdvcmssIGFuZCB0aGUgZ2VuZXJhdGVkCi1jb2RlIHdpbGwgYmUgcGxhY2VkIGluIGEgInNhbXBsZXMiIGRpcmVjdG9yeS4gPC9wPgotPHByZT53c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCAtc3MgLXNkIC1kIHhtbGJlYW5zIAotLW8gLi4vc2FtcGxlcyAtcCBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZTwvcHJlPgotCi08cD5UaGlzIHdpbGwgZ2VuZXJhdGUgdGhlIHJlcXVpcmVkIGNsYXNzZXMgaW4gdGhlIDxiPiJzYW1wbGUvc3JjIjwvYj4KLWRpcmVjdG9yeSwgYW5kIHRoZSBzY2hlbWEgY2xhc3NlcyBpbiB0aGUKLTxzdHJvbmc+InNhbXBsZXMvcmVzb3VyY2VzL3NjaGVtYW9yZ19hcGFjaGVfeG1sYmVhbnMiPC9zdHJvbmc+Ci1kaXJlY3Rvcnk8c3Ryb25nPjwvc3Ryb25nPi4gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3Qgc291cmNlIGZpbGVzIGFuZCBzaG91bGQKLWJlIGF2YWlsYWJsZSBpbiB0aGUgY2xhc3MgcGF0aCBpbiBvcmRlciB0byBjb21waWxlIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy48L3A+Ci08YSBuYW1lPSJTdGVwMl9JbXBsZW1lbnRfQnVzaW5lc3NfTG9naWMiPjwvYT4KLQotPGgzPlN0ZXAgMjogSW1wbGVtZW50IEJ1c2luZXNzIExvZ2ljPC9oMz4KLQotPHA+Tm93IHlvdSBzaG91bGQgZmlsbCB0aGUgYnVzaW5lc3MgbG9naWMgaW4gdGhlIHNrZWxldG9uIGNsYXNzLiBZb3UgY2FuIGZpbmQKLXRoZSBza2VsZXRvbiBjbGFzcyAtQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU2tlbGV0b24uamF2YS0gYW1vbmcgdGhlCi1nZW5lcmF0ZWQgY2xhc3NlcyBpbiB0aGUKLTxzdHJvbmc+InNhbXBsZXMvc3JjL29yZy9hcGFjaGUvYXhpczIvdXNlcmd1aWRlPC9zdHJvbmc+IGRpcmVjdG9yeS4gTGV0J3MKLWZpbGwgdGhlIDxjb2RlPmVjaG9TdHJpbmcoLi4pPC9jb2RlPiBtZXRob2QgaW4gdGhlIHNrZWxldG9uIGFzIHNob3duIGJlbG93LgotT3VyIHNhbXBsZSBXU0RMLUF4aXMyU2FtcGxlRG9jTGl0LndzZGwgaW4gPHN0cm9uZz4ic2FtcGxlcy93c2RsIjwvc3Ryb25nPgotZGlyZWN0b3J5IGhhcyB0aHJlZSBvcGVyYXRpb25zOiBlY2hvU3RyaW5nLCBlY2hvU3RyaW5nQXJyYXksIGVjaG9TdHJ1Y3QuIFRvCi1zZWUgaG93IHRoZSBvdGhlcnMgd2lsbCBsb29rIHdoZW4gdGhleSBhcmUgZmlsbGVkIHVwLCBzZWUgPGEKLWhyZWY9InNyYy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VDb2RlLmh0bWwiPkNvZGUgTGlzdGluZyBGb3IKLUF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSBTZXJ2aWNlPC9hPjwvcD4KLTxzb3VyY2U+PHByZT5wdWJsaWMgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdSZXR1cm5Eb2N1bWVudCAKLSAgICBlY2hvU3RyaW5nKG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUGFyYW1Eb2N1bWVudCBwYXJhbTQpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vVXNlIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB0aGUgb3V0cHV0IGRvY3VtZW50LgotICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQgcmV0RG9jID0gCi0gICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIC8vc2VuZCB0aGUgc3RyaW5nIGJhY2suCi0gICAgcmV0RG9jLnNldEVjaG9TdHJpbmdSZXR1cm4ocGFyYW00LmdldEVjaG9TdHJpbmdQYXJhbSgpKTsKLSAgIHJldHVybiByZXREb2M7PGJyLz48L3ByZT4KLTwvc291cmNlPjxhIG5hbWU9IlN0ZXA0X0NyZWF0ZV9hcmNoaXZlIj48L2E+Ci0KLTxoMz5TdGVwIDM6IENyZWF0ZSBBcmNoaXZlIEZpbGU8L2gzPgotCi08cD5BbiBBeGlzMiBzZXJ2aWNlIG11c3QgYmUgYnVuZGxlZCBhcyBhIHNlcnZpY2UgYXJjaGl2ZS4gVGhlIG5leHQgc3RlcCBpcyB0bwotcGFja2FnZSB0aGUgY2xhc3NlcyBpbiBhbiAuYWFyIChheGlzMiBhcmNoaXZlKSBhbmQgZGVwbG95IGl0IGluIEF4aXMyLiBUaGVyZQotaXMgYW4gYW50IGZpbGUgZ2VuZXJhdGVkIHdpdGggdGhlIGNvZGU7IGl0IHdpbGwgZ2VuZXJhdGUgdGhlIEF4aXMyIHNlcnZpY2UKLWFyY2hpdmUgZm9yIHlvdS4gSG93ZXZlciwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSBhbnQsIHlvdSBjYW4gY3JlYXRlIGFuCi1hcmNoaXZlIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwcyA6PC9wPgotPG9sPgotICA8bGk+Q29tcGlsZSB0aGUgZ2VuZXJhdGVkIGNvZGUuPC9saT4KLSAgPGxpPkNvcHkgPHN0cm9uZz4icmVzb3VyY2VzL3NjaGVtYW9yZ19hcGFjaGVfeG1sYmVhbnM8L3N0cm9uZz4iIHhtbGJlYW5zCi0gICAgY2xhc3NlcyB0byB5b3VyIGNsYXNzIGZvbGRlci48L2xpPgotICA8bGk+QW1vbmcgdGhlIGdlbmVyYXRlZCBmaWxlcywgdGhlcmUgd2lsbCBiZSBhIHNlcnZpY2VzLnhtbCBmaWxlLCB3aGljaCBpcwotICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIEF4aXMyIHNlcnZpY2UuWzxhCi0gICAgaHJlZj0icmVmZXJlbmNlLmh0bWwjc2VydmljZWRkIj5sZWFybiBtb3JlIGFib3V0IGl0PC9hPl0uIENvcHkgdGhlCi0gICAgcmVzb3VyY2VzL3NlcnZpY2UueG1sIHRvIE1FVEEtSU5GL3NlcnZpY2VzLnhtbDwvbGk+Ci0KLSAgPHA+KFRvIHdyaXRlIHlvdXIgb3duIHNlcnZpY2UueG1sIGZpbGUsIHNlZSB0aGUgc3ViIHNlY3Rpb24gaW4gPGEKLSAgaHJlZj0ieG1sYmFzZWQtc2VydmVyLmh0bWwjU3RlcDJfOldyaXRlX3RoZV9zZXJ2aWNlc194bWxfZmlsZSI+V3JpdGluZyBXZWIKLSAgU2VydmljZXMgVXNpbmcgQXhpczIncyBQcmltYXJ5IEFQSXM8L2E+ICk8L3A+Ci0gIDxsaT5DcmVhdGUgdGhlIGFyY2hpdmUgdXNpbmcgY29udGVudCBvZiB0aGUgY2xhc3MgZm9sZGVyLiBDaGFuZ2UgdGhlCi0gICAgZGlyZWN0b3J5IHRvIHRoZSBjbGFzcyBmb2xkZXIgYW5kIHJ1biA8Y29kZT5qYXIgLWNmCi0gICAgJmx0O3NlcnZpY2UtbmFtZSZndDsuYWFyPC9jb2RlPiB0byBjcmVhdGUgdGhlIGFyY2hpdmUuPC9saT4KLTwvb2w+Ci0KLTxwPk9uY2UgdGhlIGFyY2hpdmUgaXMgY3JlYXRlZCwgdGhlIGNvbnRlbnQgb2YgdGhlIEpBUiBzaG91bGQgbG9vayBsaWtlCi10aGlzOjwvcD4KLQotPHA+PGltZyBzcmM9ImltYWdlcy91c2VyZ3VpZGUvRGlyZWN0b3J5U3RydWN0dXJlLmpwZyIgYWxpZ249ImJvdHRvbSIKLWJvcmRlcj0iMCIvPjwvcD4KLTxhIG5hbWU9IlN0ZXA1X0RlcGxveV93ZWJfc2VydmljZSI+PC9hPgotCi08aDM+U3RlcCA0OiBEZXBsb3kgV2ViIFNlcnZpY2U8L2gzPgotCi08cD5UaGUgc2VydmljZSBjYW4gYmUgZGVwbG95ZWQgYnkgc2ltcGx5IGRyb3BwaW5nIHRoZSAiLmFhciIgZmlsZSBpbnRvIHRoZQotInNlcnZpY2VzIiBkaXJlY3RvcnkgaW4gIi93ZWJhcHBzL2F4aXMyL1dFQi1JTkYiIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIuCi1XZSByZWNvbW1lbmQgdXNpbmcgPGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLyI+QXBhY2hlIFRvbWNhdDwvYT4gYXMKLXRoZSBzZXJ2bGV0IGNvbnRhaW5lci4gPHN0cm9uZz5QbGVhc2UgTm90ZSB0aGF0IHRoZSBzZXJ2aWNlcyBkaXJlY3RvcnkgaXMKLWF2YWlsYWJsZSBvbmx5IGFmdGVyIGF4aXMyLndhciBoYXMgYmVlbiBleHBsb2RlZCBieSBUb21jYXQuIEhvd2V2ZXIsIHRoZSBlYXNpZXN0Ci13YXkgdG8gZG8gaXQgaXMgdG8gc3RhcnQgVG9tY2F0IGFmdGVyIGF4aXMyLndhciBpcyBjb3BpZWQgdG8gdGhlIHdlYmFwcHMKLWRpcmVjdG9yeTwvc3Ryb25nPiAoaWYgeW91IGhhdmUgbm90IGFscmVhZHkgc3RhcnRlZCBpdCkuIENoZWNrIHRoZSAiU2VydmljZXMiCi1saW5rIG9uIHRoZSA8YSBocmVmPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvIiB0YXJnZXQ9Il9ibGFuayI+SG9tZSBwYWdlCi1vZiBBeGlzMiBXZWIgQXBwbGljYXRpb248L2E+IChodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIpIGFuZCBzZWUgd2hldGhlcgotdGhlIEF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSBpcyBkaXNwbGF5ZWQgdW5kZXIgdGhlIGRlcGxveWVkIHNlcnZpY2VzLjwvcD4KLQotPHA+V2UgcmVjb21tZW5kIHVzaW5nIHRoZSBleHBsb2RlZCBjb25maWd1cmF0aW9uIHRvIGRlcGxveSBBeGlzMiBXQVIgaW4KLTxzdHJvbmc+V2ViTG9naWMgYW5kIFdlYlNwaGVyZTwvc3Ryb25nPiBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHRvIHN1cHBvcnQgdGhlCi1ob3R1cGRhdGUvaG90ZGVwbG95bWVudCBmZWF0dXJlcyBvZiBBeGlzMi4gU2VlIDxhCi1ocmVmPSJhcHBfc2VydmVyLmh0bWwjd2VibG9naWNfd2Vic3BoZXJlIj5BcHBsaWNhdGlvbiBTZXJ2ZXIgU3BlY2lmaWMKLUNvbmZpZ3VyYXRpb24gR3VpZGU8L2E+IGZvciBkZXRhaWxzLjwvcD4KLQotPHA+Tm90ZTogQXhpczIgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gZGVwbG95IFdlYiBTZXJ2aWNlcyB1c2luZyB0aGUgIlVwbG9hZAotU2VydmljZSIgdG9vbCBpbiB0aGUgQXhpczIgV2ViIEFwcGxpY2F0aW9uJ3MgQWRtaW5pc3RyYXRpb24gbW9kdWxlLiAoU2VlIHRoZQotPGEgaHJlZj0id2ViYWRtaW5ndWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+V2ViIEFkbWluaXN0cmF0aW9uIEd1aWRlPC9hPiBmb3IKLW1vcmUgaW5mb3JtYXRpb24pPC9wPgotPGEgbmFtZT0iY2xpZW50Ij48L2E+Ci0KLTxoMj5Xcml0aW5nIGEgV2ViIFNlcnZpY2UgQ2xpZW50PC9oMj4KLQotPHA+QXhpczIgYWxzbyBwcm92aWRlcyBhIG1vcmUgY29tcGxleCwgeWV0IHBvd2VyZnVsIFhNTCBiYXNlZCBjbGllbnQgQVBJCi13aGljaCBpcyBpbnRlbmRlZCBmb3IgYWR2YW5jZWQgdXNlcnMuIFJlYWQgPGEgaHJlZj0iZGlpLmh0bWwiPldyaXRpbmcgV2ViCi1TZXJ2aWNlIENsaWVudHMgVXNpbmcgQXhpczIncyBQcmltYXJ5IEFQSXM8L2E+IHRvIGxlYXJuIG1vcmUgYWJvdXQgaXQuCi1Ib3dldmVyLCBpZiB5b3UgYXJlIGEgbmV3IHVzZXIsIHdlIHJlY29tbWVuZCB1c2luZyB0aGUgPHN0cm9uZz5jb2RlCi1nZW5lcmF0aW9uPC9zdHJvbmc+IGFwcHJvYWNoIHByZXNlbnRlZCBiZWxvdy48L3A+Ci0KLTxoMz5HZW5lcmF0ZSBTdHViczwvaDM+Ci0KLTxwPkxldCdzIHNlZSBob3cgd2UgY291bGQgZ2VuZXJhdGUgamF2YSBjb2RlIChTdHViKSB0byBoYW5kbGUgdGhlIGNsaWVudCBzaWRlCi1XZWIgU2VydmljZSBpbnZvY2F0aW9uIGZvciB5b3UuIFRoaXMgY2FuIGJlIGRvbmUgYnkgcnVubmluZyB0aGUgV1NETDJKYXZhCi10b29sIHVzaW5nIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzPC9wPgotPHNvdXJjZT48cHJlPndzZGwyamF2YS5zaCAtdXJpIC4uL3NhbXBsZXMvd3NkbC9BeGlzMlNhbXBsZURvY0xpdC53c2RsIC1kIHhtbGJlYW5zIAotICAgICAtbyAuLi9zYW1wbGVzL3NyYyAtcCBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZTwvcHJlPgotPC9zb3VyY2U+Ci08cD5UaGlzIHdpbGwgZ2VuZXJhdGUgY2xpZW50IHNpZGUgc3R1YnMgYW5kIHhtbGJlYW5zIHR5cGVzIGZvciB5b3VyIHR5cGVzLgotVGhlIFN0dWIgY2xhc3MgdGhhdCB5b3UgbmVlZCB0byB1c2Ugd2lsbCBiZSBvZiB0aGUgZm9ybQotPHN0cm9uZz4mbHQ7c2VydmljZS1uYW1lJmd0O1N0dWI8L3N0cm9uZz4uIEluIG91ciBleGFtcGxlLCBpdCB3aWxsIGJlIGNhbGxlZAotIkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIuamF2YSI8L3A+Ci0KLTxwPkF4aXMyIGNsaWVudHMgY2FuIGludm9rZSBXZWIgU2VydmljZXMgYm90aCBpbiBhIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcKLW1hbm5lci4gSW4gYSBibG9ja2luZyBpbnZvY2F0aW9uLCB0aGUgY2xpZW50IHdhaXRzIHRpbGwgdGhlIHNlcnZpY2UgcGVyZm9ybXMKLWl0cyB0YXNrIHdpdGhvdXQgcHJvY2VlZGluZyB0byB0aGUgbmV4dCBzdGVwLiBOb3JtYWxseSwgdGhlIGNsaWVudCB3YWl0cyB0aWxsCi10aGUgcmVzcG9uc2UgdG8gaXRzIHBhcnRpY3VsYXIgcmVxdWVzdCBhcnJpdmVzLiBJbiBhIG5vbi1ibG9ja2luZyBpbnZvY2F0aW9uLAotdGhlIGNsaWVudCBwcm9jZWVkcyB0byB0aGUgbmV4dCBzdGVwIGltbWVkaWF0ZWx5LCBhbmQgdGhlIHJlc3BvbnNlcyAoaWYgYW55KQotYXJlIGhhbmRsZWQgdXNpbmcgYSBDYWxsYmFjayBtZWNoYW5pc20uIFBsZWFzZSBub3RlIHRoYXQgc29tZSBleHBsYW5hdGlvbnMKLXVzZSB0aGUgdGVybXMgU3luY2hyb25vdXMgYW5kIEFzeW5jaHJvbm91cyB0byBkZXNjcmliZSB0aGUgc2ltaWxhciBpbnZvY2F0aW9uCi1zdHJhdGVnaWVzLjwvcD4KLQotPGgzPkRvIGEgQmxvY2tpbmcgSW52b2NhdGlvbjwvaDM+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCBzaG93cyB0aGUgbmVjZXNzYXJ5IGNvZGUgY2FsbGluZwotPGNvZGU+ZWNob1N0cmluZzwvY29kZT4gb3BlcmF0aW9uIG9mIHRoZQotPGNvZGU+QXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlPC9jb2RlPiB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkZXBsb3llZC4gVGhlIGNvZGUKLWlzIGV4dHJlbWVseSBzaW1wbGUgdG8gdW5kZXJzdGFuZCBhbmQgdGhlIGV4cGxhbmF0aW9ucyBhcmUgaW4gdGhlIGZvcm0gb2YKLWNvbW1lbnRzLjwvcD4KLTxzb3VyY2U+PHByZT4gICAgIHRyeSB7Ci0gICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViIHN0dWIgCi0gICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlIik7Ci0gICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHJlcXVlc3QgZG9jdW1lbnQgdG8gYmUgc2VudC4KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQgcmVxRG9jID0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIHJlcURvYy5zZXRFY2hvU3RyaW5nUGFyYW0oIkF4aXMyIEVjaG8iKTsKLSAgICAgICAgICAgICAgICAvL2ludm9rZXMgdGhlIFdlYiBzZXJ2aWNlLgotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUmV0dXJuRG9jdW1lbnQgcmVzRG9jID0gCi0gICAgICAgICAgICAgICAgc3R1Yi5lY2hvU3RyaW5nKHJlcURvYyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc0RvYy5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOwotICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgIH08L3ByZT4KLTwvc291cmNlPgotPHA+Rmlyc3QgYXJndW1lbnQgb2YgPGNvZGU+QXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZVN0dWI8L2NvZGU+IHNob3VsZCBiZSB0aGUKLUF4aXMyIHJlcG9zaXRvcnkgZm9yIHRoZSBjbGllbnQuIEhlcmUgd2UgdXNlIG51bGwgdG8gbWFrZSB0aGUgc3R1YiB1c2UKLWRlZmF1bHQgY29uZmlndXJhdGlvbnMuIEhvd2V2ZXIsIHlvdSBjYW4gbWFrZSBBeGlzMiB1c2UgeW91ciBvd24gcmVwb3NpdG9yeQotYnkgcHJvdmlkaW5nIGl0IGhlcmUuIFlvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZnJvbSB0aGUgPGEKLWhyZWY9IiNjb25maWciPkF4aXMyIENvbmZpZ3VyYXRpb24gc2VjdGlvbjwvYT4uIFlvdSBjYW4gZmluZCBjb2RlIHRvIGludm9rZQotb3RoZXIgb3BlcmF0aW9ucyBmcm9tIDxhIGhyZWY9InNyYy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VDb2RlLmh0bWwiPkNvZGUKLUxpc3RpbmcgRm9yIEF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSBTZXJ2aWNlPC9hPjwvcD4KLQotPGgzPkRvIGEgTm9uLUJsb2NraW5nIEludm9jYXRpb248L2gzPgotCi08cD5UaGUgc3R1YnMgYWxzbyBpbmNsdWRlIGEgbWV0aG9kIHRoYXQgYWxsb3dzIHlvdSB0byBkbyBhIG5vbi1ibG9ja2luZwotaW5ub3ZhdGlvbi4gRm9yIGVhY2ggbWV0aG9kIGluIHRoZSBTZXJ2aWNlLCB0aGVyZSB3aWxsIGJlIGEgbWV0aG9kCi08c3Ryb25nPnN0YXJ0Jmx0O21ldGhvZC1uYW1lJmd0Ozwvc3Ryb25nPi4gVGhlc2UgbWV0aG9kcyBhY2NlcHQgYSBjYWxsYmFjawotb2JqZWN0LCB3aGljaCB3b3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuIFNhbXBsZSBjb2RlIHRoYXQKLWRvZXMgYW4gYXN5bmNocm9ub3VzIGludGVyYWN0aW9uIGlzIGdpdmVuIGJlbG93LjwvcD4KLTxzb3VyY2U+PHByZT50cnkgewotICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU3R1YiBzdHViCi0gICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIobnVsbCwKLSAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyU2FtcGxlRG9jTGl0U2VydmljZSIpOwotICAgICAgICAgICAgIC8vaW1wbGVtZW50aW5nIHRoZSBjYWxsYmFjayBvbmxpbmUKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZUNhbGxiYWNrSGFuZGxlciBjYWxsYmFjayA9Ci0gICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlUmVzdWx0ZWNob1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IHJlc0RvYykgewotICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzRG9jLmdldEVjaG9TdHJpbmdSZXR1cm4oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUGFyYW1Eb2N1bWVudCByZXFEb2MgPSAKLSAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICByZXFEb2Muc2V0RWNob1N0cmluZ1BhcmFtKCJBeGlzMiBFY2hvIik7Ci0gICAgICAgICAgIHN0dWIuc3RhcnRlY2hvU3RyaW5nKHJlcURvYywgY2FsbGJhY2spOwotICAgICAgICB9IGNhdGNoIChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgfTwvcHJlPgotPC9zb3VyY2U+Ci08cD5FdmVuIHRob3VnaCB0aGUgYWJvdmUgY29kZSBkb2VzIGEgbm9uLWJsb2NraW5nIGludm9jYXRpb24gYXQgdGhlIGNsaWVudAotQVBJLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24gbWF5IHN0aWxsIG9wZXJhdGUgaW4gYSBibG9ja2luZyBmYXNoaW9uLiBGb3IKLWV4YW1wbGUsIGEgc2luZ2xlIEhUVFAgY29ubmVjdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBXZWIgU2VydmljZSByZXF1ZXN0Ci1hbmQgdG8gZ2V0IHRoZSByZXNwb25zZSB3aGVuIGEgYmxvY2tpbmcgaW52b2NhdGlvbiBoYXBwZW5zIGF0IHRoZSB0cmFuc3BvcnQKLWxldmVsLiBUbyBwZXJmb3JtIGEgInRydWUiIG5vbi1ibG9ja2luZyBpbnZvY2F0aW9uIGluIHdoaWNoIHR3byBzZXBhcmF0ZQotdHJhbnNwb3J0IGNvbm5lY3Rpb25zIGFyZSB1c2VkIGZvciB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlLCBwbGVhc2UgYWRkCi10aGUgZm9sbG93aW5nIGNvZGUgc2VnbWVudCBhZnRlciBjcmVhdGluZyB0aGUgc3R1Yi4gSXQgd2lsbCBmb3JjZSBBeGlzMiB0bwotdXNlIHR3byB0cmFuc3BvcnQgY29ubmVjdGlvbnMgZm9yIHRoZSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2Ugd2hpbGUgdGhlCi1jbGllbnQgdXNlcyBhIENhbGxiYWNrIHRvIHByb2Nlc3MgdGhlIHJlc3BvbnNlLjwvcD4KLTxzb3VyY2U+PHByZT5zdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZW5nYWdlTW9kdWxlKG5ldyBRTmFtZSgiYWRkcmVzc2luZyIpKTsKLXN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTs8L3ByZT4KLTwvc291cmNlPgotPHA+T25jZSB0aG9zZSBvcHRpb25zIGFyZSBzZXQsIEF4aXMyIGNsaWVudCBkb2VzIHRoZSBmb2xsb3dpbmc6PC9wPgotPG9sPgotICA8bGk+U3RhcnRzIGEgbmV3IFRyYW5zcG9ydCBMaXN0ZW5lcihTZXJ2ZXIpIGF0IHRoZSBjbGllbnQgc2lkZS48L2xpPgotICA8bGk+U2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgVHJhbnNwb3J0IExpc3RlbmVyLCBhcyB0aGUgUmVwbHlUbwotICAgIFdTLUFkZHJlc3NpbmcgSGVhZGVyIG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2U8L2xpPgotICA8bGk+QWNjb3JkaW5nIHRvIHRoZSBXUy1BZGRyZXNzaW5nIHJ1bGVzLCB0aGUgU2VydmVyIHdpbGwgcHJvY2VzcyB0aGUKLSAgICByZXF1ZXN0IG1lc3NhZ2UgYW5kIHNlbmQgdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIFJlcGx5VG8gYWRkcmVzcy48L2xpPgotICA8bGk+Q2xpZW50IGFjY2VwdHMgdGhlIHJlc3BvbnNlLCBwcm9jZXNzZXMgaXQgYW5kIGludm9rZXMgdGhlIGNhbGxiYWNrIHdpdGgKLSAgICB0aGUgcmVzcG9uc2UgcGFyYW1ldGVycy48L2xpPgotPC9vbD4KLQotPGgzPlVzaW5nIFlvdXIgT3duIFJlcG9zaXRvcnk8L2gzPgotCi08cD5Zb3UgY2FuIGFsc28gdXNlIHlvdXIgb3duIHJlcG9zaXRvcnkgd2l0aCBhbiBBeGlzMiBDbGllbnQuICBUaGUgY29kZSBiZWxvdyBzaG93cyBob3cKLXRvIGRvIHRoaXMuPC9wPgotPHNvdXJjZT48cHJlPlN0cmluZyBheGlzMlJlcG8gPSAuLi4KLVN0cmluZyBheGlzMnhtbCA9IC4uLgotQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci1Db25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShheGlzMlJlcG8sIGF4aXMyeG1sKTsKLVNlcnZpY2UxU3R1YiBzdHViMSA9IG5ldyBTZXJ2aWNlMVN0dWIoY29uZmlnQ29udGV4dCwuLi4pOwotLy9pbnZva2UgU2VydmljZTEKLVNlcnZpY2UyU3R1YiBzdHViMiA9IG5ldyBTZXJ2aWNlMlN0dWIoY29uZmlnQ29udGV4dCwuLi4pOwotLy9pbnZva2UgU2VydmljZTI8L3ByZT4KLTwvc291cmNlPgotPHA+Tm90ZSBieSBjcmVhdGluZyB0aGUgPGNvZGU+Q29uZmlndXJhdGlvbkNvbnRleHQ8L2NvZGU+IG91dHNpZGUgYW5kIHBhc3NpbmcKLWl0IHRvIHRoZSBzdHVicywgeW91IGNvdWxkIG1ha2UgbnVtYmVyIG9mIHN0dWJzIHRvIHVzZSBzYW1lIHJlcG9zaXRvcnksIHRodXMKLXNhdmluZyB0aGUgY29uZmlndXJhdGlvbiBsb2FkaW5nIG92ZXJoZWFkIGZyb20gZWFjaCByZXF1ZXN0LjwvcD4KLTxhIG5hbWU9ImNvbmZpZyI+PC9hPgotCi08aDI+Q29uZmlndXJpbmcgQXhpczI8L2gyPgotCi08aDM+QXhpczIgUmVwb3NpdG9yeTwvaDM+Ci0KLTxwPkF4aXMyIGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24gYSByZXBvc2l0b3J5IGFuZCBzdGFuZGFyZCBhcmNoaXZlIGZvcm1hdC4KLUEgcmVwb3NpdG9yeSBpcyBhIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0sIGFuZCBpdCBzaG91bGQgaGF2ZSB0aGUKLWZvbGxvd2luZzo8L3A+Ci08b2w+Ci0gIDxsaT48c3Ryb25nPmF4aXMyLnhtbDwvc3Ryb25nPiwgdGhlIEF4aXMyIGdsb2JhbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW4KLSAgICBjb25mL2F4aXMyLnhtbCBmaWxlPC9saT4KLSAgPGxpPjxzdHJvbmc+c2VydmljZXM8L3N0cm9uZz4gZGlyZWN0b3J5LCB3aGljaCB3aWxsIGhhdmUgdGhlIHNlcnZpY2UKLSAgICBhcmNoaXZlczwvbGk+Ci0gIDxsaT48c3Ryb25nPm1vZHVsZXM8L3N0cm9uZz4gZGlyZWN0b3J5IChvcHRpb25hbCksIHdoaWNoIHdpbGwgaGF2ZSB0aGUKLSAgICBtb2R1bGUgYXJjaGl2ZXM8L2xpPgotPC9vbD4KLQotPHA+Qm90aCBzZXJ2aWNlcyBhbmQgbW9kdWxlcyB3aWxsIGJlIGlkZW50aWZpZWQgYW5kIGRlcGxveWVkIG9uY2UgdGhlaXIKLWFyY2hpdmVzIGFyZSBjb3BpZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0b3JpZXMuIEF0IHRoZSBzZXJ2ZXIgc2lkZSwKLXVzZXJzIHNob3VsZCBzcGVjaWZ5IHRoZSByZXBvc2l0b3J5IGZvbGRlciBhdCB0aGUgdGltZSBvZiBzdGFydGluZyB0aGUgQXhpczIKLVNlcnZlciAoZS5nLiBIVFRQIG9yIFRDUCkuIEluIFRvbWNhdCwgPGNvZGU+d2ViYXBwcy9heGlzMi9XRUItSU5GPC9jb2RlPgotZm9sZGVyIGFjdHMgYXMgdGhlIHJlcG9zaXRvcnkuIEF0IHRoZSBjbGllbnQgc2lkZSwgYmluYXJ5IGRpc3RyaWJ1dGlvbiBjYW4KLWl0c2VsZiBiZSBhIHJlcG9zaXRvcnkuIFlvdSBjYW4gY29weSB0aGUgY29uZiBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgdGhlCi1heGlzMi54bWwgZmlsZSBmcm9tIHRoZSBleHBsb2RlZCBheGlzMi53YXIgYW5kIGVkaXQgaXQgdG8gY2hhbmdlIHRoZSBnbG9iYWwKLWNvbmZpZ3VyYXRpb25zIHJlcG9zaXRvcnkuPC9wPgotCi08aDM+R2xvYmFsIENvbmZpZ3VyYXRpb25zPC9oMz4KLQotPHA+VGhlIEdsb2JhbCBjb25maWd1cmF0aW9uIGNhbiBiZSBjaGFuZ2VkIGJ5IGVkaXRpbmcgdGhlIGF4aXMyLnhtbCBmaWxlLAotcmVmZXIgdG8gdGhlIDxhIGhyZWY9ImF4aXMyY29uZmlnLmh0bWwjR2xvYmFsX0NvbmZpZ3VyYXRpb24iPkF4aXMyCi1Db25maWd1cmF0aW9uIEd1aWRlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci0KLTxoMz5BZGQgTmV3IFNlcnZpY2VzPC9oMz4KLQotPHA+TmV3IHNlcnZpY2VzIGNhbiBiZSB3cml0dGVuIGVpdGhlciB1c2luZyBXU0RMIGJhc2VkIGNvZGUgZ2VuZXJhdGlvbiBhcyB3ZQotZGlkLCBvciBmcm9tIHNjcmF0Y2ggYXMgZXhwbGFpbmVkIGluIDxhIGhyZWY9InhtbGJhc2VkLXNlcnZlci5odG1sIj5Xcml0aW5nCi1XZWIgU2VydmljZXMgVXNpbmcgQXhpczIncyBQcmltYXJ5IEFQSXM8L2E+LiAgUmVhZCA8YQotaHJlZj0ieG1sYmFzZWQtc2VydmVyLmh0bWwiPkNyZWF0aW5nIGEgU2VydmljZSBmcm9tIFNjcmF0Y2g8L2E+IGZvciBtb3JlCi1pbmZvcm1hdGlvbi4gQWxzbyByZWZlciB0byA8YQotaHJlZj0iYXhpczJjb25maWcuaHRtbCNTZXJ2aWNlX0NvbmZpZ3VyYXRpb24iPkF4aXMyIENvbmZpZ3VyYXRpb24gR3VpZGU8L2E+Ci1mb3IgYSByZWZlcmVuY2Ugb24gPHN0cm9uZz5zZXJ2aWNlcy54bWw8L3N0cm9uZz4gZmlsZS48L3A+Ci0KLTxoMyBuYW1lPSJtb2R1bGVfZW5nYWdlIj5FbmdhZ2luZyBNb2R1bGVzPC9oMz4KLQotPHA+RWFjaCBtb2R1bGUoLm1hciBmaWxlKSBwcm92aWRlcyBleHRlbnNpb25zIHRvIEF4aXMyLiBBIG1vZHVsZSBjYW4gYmUKLWRlcGxveWVkIGJ5IGNvcHlpbmcgaXQgdG8gdGhlIG1vZHVsZXMgZGlyZWN0b3J5IGluIHRoZSByZXBvc2l0b3J5LiBUaGVuIGl0Ci1iZWNvbWVzIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGVuZ2FnZWQgYXQgYSBnbG9iYWwsIHNlcnZpY2Ugb3Igb3BlcmF0aW9uIHNjb3BlLgotT25jZSBlbmdhZ2VkLCBpdCBiZWNvbWVzIGFjdGl2ZSAoYWRkcyBoYW5kbGVycyB0byB0aGUgZXhlY3V0aW9uIGZsb3cpIGF0IHRoZQotcmVzcGVjdGl2ZSBzY29wZS4gUGxlYXNlIHJlZmVyIHRvIDxhIGhyZWY9IkF4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbCI+QXhpczIKLWFyY2hpdGVjdHVyZSBndWlkZTwvYT4gZm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLiBUaGUgZm9sbG93aW5nIHRhYmxlIGV4cGxhaW5zCi10aGUgc2VtYW50aWNzIG9mIHNjb3BlLCBhbmQgaG93IHRvIGVuZ2FnZSBtb2R1bGVzIGluIHRob3NlIHNjb3Blcy48L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotICA8dGJvZHk+Ci0gICAgPHRyPgotICAgICAgPHRoPlNjb3BlPC90aD4KLSAgICAgIDx0aD5TZW1hbnRpY3M8L3RoPgotICAgICAgPHRoPkhvdyB0byBFbmdhZ2U8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPkdsb2JhbDwvdGQ+Ci0gICAgICA8dGQ+QWRkIGhhbmRsZXJzIGluIHRoZSBtb2R1bGUgdG8gYWxsIHRoZSBzZXJ2aWNlcy4gQWRkcmVzc2luZyBIYW5kbGVyCi0gICAgICAgIGNhbiBiZSBvbmx5IGVuZ2FnZWQgYXMgZ2xvYmFsPC90ZD4KLSAgICAgIDx0ZD5CeSBhZGRpbmcgYSAmbHQ7bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvJmd0OyB0byB0aGUgQXhpczIgeG1sIGZpbGUKLSAgICAgICAgb3IgY2FsbGluZwotICAgICAgICA8cHJlPnN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5lbmdhZ2VNb2R1bGUobW9kdWxlTmFtZSk8L3ByZT4KLSAgICAgICAgYXQgY2xpZW50IHNpZGU8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPlNlcnZpY2U8L3RkPgotICAgICAgPHRkPkFkZCBoYW5kbGVycyBpbiB0aGUgbW9kdWxlIHRvIGEgc3BlY2lmaWMgc2VydmljZTwvdGQ+Ci0gICAgICA8dGQ+QnkgYWRkaW5nIGEgJmx0O21vZHVsZSByZWY9ImFkZHJlc3NpbmciLyZndDsgdG8gYSBzZXJ2aWNlLnhtbCBmaWxlCi0gICAgICAgIGluIGEgc2VydmljZSBhcmNoaXZlPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5PcGVyYXRpb248L3RkPgotICAgICAgPHRkPkFkZCBoYW5kbGVycyBpbiB0aGUgbW9kdWxlIHRvIGEgc3BlY2lmaWMgb3BlcmF0aW9uPC90ZD4KLSAgICAgIDx0ZD5CeSBhZGRpbmcgYSAmbHQ7bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvJmd0OyBpbnNpZGUgYW4gb3BlcmF0aW9uCi0gICAgICAgIHRhZyBvZiBhIHNlcnZpY2UueG1sIGZpbGUgaW4gYSBzZXJ2aWNlIGFyY2hpdmU8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGJvZHk+Ci08L3RhYmxlPgotCi08cD4qIElmIGEgaGFuZGxlciBpcyBhZGRlZCB0byBhIHNlcnZpY2Ugb3IgYW4gb3BlcmF0aW9uLCBpdCB3aWxsIGJlIGludm9rZWQKLWZvciBldmVyeSByZXF1ZXN0IHJlY2VpdmVkIGJ5IHRoYXQgc2VydmljZSBvciBvcGVyYXRpb248L3A+Ci0KLTxwPkF4aXMyIHByb3ZpZGVzIGEgbnVtYmVyIG9mIGJ1aWx0IGluIE1vZHVsZXMgKHN1Y2ggYXMgPGEKLWhyZWY9IiI+YWRkcmVzc2luZzwvYT4sPGEgaHJlZj0iIj5TZWN1cml0eTwvYT4sIDxhIGhyZWY9IiI+V1MtUmVsaWFibGUKLU1lc3NhZ2luZzwvYT4pLCBhbmQgdGhleSBjYW4gYmUgZW5nYWdlZCBhcyBzaG93biBhYm92ZS4gUGxlYXNlIHJlZmVyIHRvIGVhY2gKLW1vZHVsZSBvbiBob3cgdG8gdXNlIGFuZCBjb25maWd1cmUgdGhlbS4gWW91IGNhbiBhbHNvIDxhCi1ocmVmPSJtb2R1bGVzLmh0bWwiPmNyZWF0ZSB5b3VyIG93biBtb2R1bGVzIHdpdGggQXhpczI8L2E+LiBBbHNvIHJlZmVyIHRvIDxhCi1ocmVmPSJheGlzMmNvbmZpZy5odG1sI0dsb2JhbF9Db25maWd1cmF0aW9uIj5BeGlzMiBDb25maWd1cmF0aW9uIEd1aWRlPC9hPgotZm9yIGEgcmVmZXJlbmNlIG9uIHRoZSBtb2R1bGUueG1sIGZpbGUuPC9wPgotCi08aDM+V1MtQWRkcmVzc2luZyBTdXBwb3J0PC9oMz4KLQotPHA+V1MtQWRkcmVzc2luZyBzdXBwb3J0IGZvciBBeGlzMiBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYWRkcmVzc2luZyBtb2R1bGUuCi1UbyBlbmFibGUgYWRkcmVzc2luZywgeW91IG5lZWQgdG8gZW5nYWdlIHRoZSBhZGRyZXNzaW5nIG1vZHVsZSBpbiBib3RoIHNlcnZlcgotYW5kIGNsaWVudCBzaWRlcy48L3A+Ci08b2w+Ci0gIDxsaT5UbyA8c3Ryb25nPmVuYWJsZTwvc3Ryb25nPiBhZGRyZXNzaW5nIGF0IHRoZSBzZXJ2ZXIgc2lkZSwgeW91IG5lZWQgdG8KLSAgICBjb3B5IHRoZSBhZGRyZXNzaW5nLm1hciBmaWxlIHRvIHRoZSBtb2R1bGVzIGRpcmVjdG9yeSBvZiB0aGUgc2VydmVyJ3MKLSAgICBheGlzMiByZXBvc2l0b3J5LiBUbyBlbmdhZ2UgdGhlIG1vZHVsZSwgYWRkIGEgJmx0O21vZHVsZQotICAgIHJlZj0iYWRkcmVzc2luZyIvJmd0OyB0byBheGlzMi54bWwuIFRoZSA8c3Ryb25nPkFkZHJlc3NpbmcgbW9kdWxlIGNhbiBiZQotICAgIGVuZ2FnZWQgb25seSBhdCBnbG9iYWwgbGV2ZWwuPC9zdHJvbmc+PC9saT4KLSAgPGxpPlRvIDxzdHJvbmc+ZW5hYmxlPC9zdHJvbmc+IGFkZHJlc3NpbmcgYXQgdGhlIGNsaWVudCBzaWRlLCB5b3Ugc2hvdWxkCi0gICAgYWRkIGl0IHRvIHRoZSByZXBvc2l0b3J5IGFuZCBwcm92aWRlIHRoZSByZXBvc2l0b3J5IGFzIGFuIGFyZ3VtZW50IHRvIHRoZQotICAgIDxhIGhyZWY9ImRpaS5odG1sIj5TZXJ2aWNlQ2xpZW50PC9hPiBvciA8YSBocmVmPSIjY2xpZW50Ij5nZW5lcmF0ZWQKLSAgICBzdHViPC9hPiBvciBoYXZlIGl0IGluIHlvdXIgY2xhc3NwYXRoLjwvbGk+Ci0gIDxsaT5UbyA8c3Ryb25nPmVuZ2FnZTwvc3Ryb25nPiB0aGUgYWRkcmVzc2luZyBtb2R1bGUsIHlvdSBzaG91bGQgZWl0aGVyIGFkZAotICAgICZsdDttb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8mZ3Q7IHRvIHRoZSBheGlzMi54bWwgZmlsZSBhdCB0aGUgY2xpZW50IHNpZGUKLSAgICBvciBjYWxsCi0gICAgPHByZT5zdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZW5nYWdlTW9kdWxlKG1vZHVsZU5hbWUpPC9wcmU+Ci0gIDwvbGk+Ci08L29sPgotPGEgbmFtZT0iYWR2YW5jZWQiPjwvYT4KLQotPGgyPkFkdmFuY2VkIFRvcGljczwvaDI+Ci0KLTxoMz5UcmFuc3BvcnRzPC9oMz4KLQotPHA+QnkgZGVmYXVsdCwgQXhpczIgaXMgY29uZmlndXJlZCB0byB1c2UgSFRUUCBhcyB0aGUgdHJhbnNwb3J0LiBIb3dldmVyLAotQXhpczIgc3VwcG9ydHMgSFRUUCwgU01UUCwgVENQIGFuZCBKTVMgdHJhbnNwb3J0cy4gWW91IGNhbiBhbHNvIHdyaXRlIHlvdXIKLW93biB0cmFuc3BvcnRzLCBhbmQgZGVwbG95IHRoZW0gYnkgYWRkaW5nIG5ldyB0cmFuc3BvcnRSZWNlaXZlciBvcgotdHJhbnNwb3J0U2VuZGVyIHRhZ3MgdG8gYXhpczIueG1sLiBUbyBsZWFybiBob3cgdG8gY29uZmlndXJlIGFuZCB1c2UKLWRpZmZlcmVudCB0cmFuc3BvcnRzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGZvbGxvd2luZyBkb2N1bWVudHMuPC9wPgotPG9sPgotICA8bGk+PGEgaHJlZj0idGNwLXRyYW5zcG9ydC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+VENQIFRyYW5zcG9ydDwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cC10cmFuc3BvcnQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkhUVFAgVHJhbnNwb3J0czwvYT48L2xpPgotPC9vbD4KLQotPGgzPkF0dGFjaG1lbnRzPC9oMz4KLQotPHA+QXhpczIgcHJvdmlkZXMgYXR0YWNobWVudCBzdXBwb3J0IHVzaW5nIDxhCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9zb2FwMTItbXRvbS8iPk1UT008L2E+LiBQbGVhc2UgcmVmZXIgdG8gPGEKLWhyZWY9Im10b20tZ3VpZGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPk1UT00gd2l0aCBBeGlzMjwvYT4gZm9yIG1vcmUKLWluZm9ybWF0aW9uLjwvcD4KLQotPGgzPlNlY3VyaXR5PC9oMz4KLQotPHA+QXhpczIgcHJvdmlkZXMgU2VjdXJpdHkgc3VwcG9ydCB1c2luZyA8YQotaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9yYW1wYXJ0LzFfMC9zZWN1cml0eS1tb2R1bGUuaHRtbCI+QXBhY2hlCi1SYW1wYXJ0PC9hPi4gUGxlYXNlIHJlZmVyIHRvIDxhCi1ocmVmPSIuLi9tb2R1bGVzL3dzczRqLzFfMC9zZWN1cml0eS1tb2R1bGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPlNlY3VyaW5nCi1TT0FQIE1lc3NhZ2VzIHdpdGggQXBhY2hlIFJhbXBhcnQ8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLQotPGgzPlJFU1QgV2ViIFNlcnZpY2U8L2gzPgotCi08cD5QbGVhc2UgcmVmZXIgdG8gPGEgaHJlZj0icmVzdC13cy5odG1sIiB0YXJnZXQ9Il9ibGFuayI+UkVTVGZ1bCBXZWIKLVNlcnZpY2VzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci0KLTxoMz5QbHVnZ2FibGUgRGF0YSBCaW5kaW5nPC9oMz4KLQotPHA+QXhpczIgc2hpcHMgd2l0aCBBeGlzIERhdGEgQmluZGluZyhBREIpIGFzIHRoZSBkZWZhdWx0IGRhdGEgYmluZGluZwotZnJhbWV3b3JrLiBIb3dldmVyLCBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrcyBhcmUgcGx1Z2dhYmxlIHRvIEF4aXMyLCBhbmQKLXRoZXJlZm9yZSB5b3UgY2FuIHVzZSBvdGhlciBkYXRhIGJpbmRpbmcgZnJhbWV3b3JrcyB3aXRoIEF4aXMyLiBQbGVhc2UgcmVmZXIKLXRvIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLQotPGg0PkF4aXMyIERhdGEgQmluZGluZyhBREIpPC9oND4KLTxvbD4KLSAgPGxpPjxhIGhyZWY9ImFkYi9hZGItaG93dG8uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkF4aXMyIERhdGFiaW5kaW5nCi0gICAgRnJhbWV3b3JrPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJhZGIvYWRiLWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkFEQgotICAgIEludGVncmF0aW9uIFdpdGggQXhpczI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImFkYi9hZGItYWR2YW5jZWQuaHRtbCI+QWR2YW5jZWQgQXhpczIgRGF0YWJpbmRpbmcgRnJhbWV3b3JrCi0gICAgRmVhdHVyZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImFkYi9hZGItdHdlYWtpbmcuaHRtbCI+QURCIFR3ZWFraW5nIEd1aWRlPC9hPjwvbGk+Ci08L29sPgotCi08aDQ+SmlCWDwvaDQ+Ci08YSBocmVmPSJqaWJ4L2ppYngtY29kZWdlbi1pbnRlZ3JhdGlvbi5odG1sIj5KaUJYIEludGVncmF0aW9uIFdpdGggQXhpczI8L2E+Ci0KLTxoMz5PdGhlciBUb3BpY3M8L2gzPgotPG9sPgotICA8bGk+PGEgaHJlZj0ic3ByaW5nLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5BeGlzMiBJbnRlZ3JhdGlvbiBXaXRoIFRoZSBTcHJpbmcKLSAgICBGcmFtZXdvcms8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IldTX3BvbGljeS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+V2ViIFNlcnZpY2VzIFBvbGljeSBTdXBwb3J0IEluCi0gICAgQXhpczI8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImF4aXMyY29uZmlnLmh0bWwjR2xvYmFsX0NvbmZpZ3VyYXRpb24iPkF4aXMyIENvbmZpZ3VyYXRpb24KLSAgICBHdWlkZTwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iQXhpczItcnBjLXN1cHBvcnQuaHRtbCI+QXhpczIgUlBDIFN1cHBvcnQ8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Im1pZ3JhdGlvbi5odG1sIj5NaWdyYXRpbmcgZnJvbSBBcGFjaGUgQXhpcyAxLnggdG8gQXhpcwotICAyPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJtb2R1bGVzLmh0bWwiPldyaXRpbmcgeW91ciBPd24gQXhpczIgTW9kdWxlPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJzb2FwbW9uaXRvci1tb2R1bGUuaHRtbCI+VXNpbmcgdGhlIFNPQVAgTW9uaXRvcjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0ieG1sYmFzZWQtc2VydmVyLmh0bWwiPldyaXRpbmcgV2ViIFNlcnZpY2VzIFVzaW5nIEF4aXMyJ3MKLSAgICBQcmltYXJ5IEFQSXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImRpaS5odG1sIj5Xcml0aW5nIFdlYiBTZXJ2aWNlIENsaWVudHMgVXNpbmcgQXhpczIncyBQcmltYXJ5Ci0gICAgQVBJczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iYXBwX3NlcnZlci5odG1sIj5BcHBsaWNhdGlvbiBTZXJ2ZXIgU3BlY2lmaWMgQ29uZmlndXJhdGlvbgotICAgIEd1aWRlPC9hPjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FwcF9zZXJ2ZXIueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2FwcF9zZXJ2ZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzE3NmY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9hcHBfc2VydmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPkFwcGxpY2F0aW9uIFNlcnZlciBTcGVjaWZpYyBDb25maWd1cmF0aW9uIEd1aWRlPC90aXRsZT4NCi08bWV0YSBjb250ZW50PSJhbWF5YSA5LjIuMSwgc2VlIGh0dHA6Ly93d3cudzMub3JnL0FtYXlhLyIgLz4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+QXBwbGljYXRpb24gU2VydmVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24gR3VpZGU8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3INCi15b3VyIEFwcGxpY2F0aW9uIFNlcnZlciB0byBydW4gQXBhY2hlIEF4aXMyIHRvIGl0cyBmdWxsZXN0DQotcG90ZW50aWFsLjwvcD4NCi08aDM+V2ViTG9naWMvIFdlYlNwaGVyZTwvaDM+DQotPHA+PHN0cm9uZz4xLiBVc2UgZXhwbG9kZWQgY29uZmlndXJhdGlvbiB0byBkZXBsb3kgQXhpczINCi1XQVI8L3N0cm9uZz48L3A+DQotPHA+V2UgcmVjb21tZW5kIHVzaW5nIHRoZSBleHBsb2RlZCBjb25maWd1cmF0aW9uIHRvIGRlcGxveSBBeGlzMg0KLVdBUiBpbiBXZWJMb2dpYyBhbmQgV2ViU3BoZXJlIGFwcGxpY2F0aW9uIHNlcnZlcnMgdG8gc3VwcG9ydCB0aGUNCi1ob3R1cGRhdGUvIGhvdGRlcGxveW1lbnQgZmVhdHVyZXMgaW4gQXhpczIuIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvDQotZGVwbG95IGN1c3RvbSBXQVJzLCBzYXkgaW4gYSBjbHVzdGVyaW5nIGVudmlyb25tZW50LCB5b3UgbmVlZCB0bw0KLWFkZCB0d28gYWRkaXRpb25hbCBmaWxlcyBpbnRvIHRoZSBXRUItSU5GIG5hbWVkICJzZXJ2aWNlcy5saXN0IiBhbmQNCi0ibW9kdWxlcy5saXN0IiB1bmRlciB0aGUgbW9kdWxlcyBhbmQgc2VydmljZXMgZGlyZWN0b3J5DQotcmVzcGVjdGl2ZWx5LjwvcD4NCi08dWw+DQotPGxpPjxiPldFQi1JTkYvc2VydmljZXMvc2VydmljZXMubGlzdDwvYj4gOiBzaG91bGQgbGlzdCBhbGwgdGhlDQotc2VydmljZXMgKGFhciBmaWxlcykgdGhhdCB5b3Ugd2FudCB0byBleHBvc2UuPC9saT4NCi08bGk+PGI+V0VCLUlORi9tb2R1bGVzL21vZHVsZXMubGlzdDwvYj4gOiBzaG91bGQgbGlzdCBhbGwgdGhlDQotbW9kdWxlcyAobWFyIGZpbGVzKSB0aGF0IHlvdSB3YW50IHRvIHVzZS48L2xpPg0KLTwvdWw+DQotTk9URTogSW4gYm90aCBjYXNlcywgcGxlYXNlIGxpc3Qgb25lIGVudHJ5IHBlciBsaW5lLg0KLTxwPldlYkxvZ2ljIHNoaXBzIHdpdGggSkFScyB0aGF0IGNvbmZsaWN0IHdpdGggSkFScyBwcmVzZW50IGluDQotQXhpczIuIFRoZXJlZm9yZSB1c2UgJmx0O3ByZWZlci13ZWItaW5mLWNsYXNzZXMmZ3Q7IHRvIGVuc3VyZSB0aGF0DQotSkFScyBwYWNrYWdlZCBpbiBBeGlzMiBXQVIgYXJlIHBpY2tlZCB1cCBmcm9tIFdFQi1JTkYvbGliLiBZb3UgY2FuDQotZG8gdGhpcyBieSBzZXR0aW5nIHRoZSAmbHQ7cHJlZmVyLXdlYi1pbmYtY2xhc3NlcyZndDsgZWxlbWVudCBpbg0KLVdFQi1JTkYvd2VibG9naWMueG1sIHRvIHRydWUuIEFuIGV4YW1wbGUgb2Ygd2VibG9naWMueG1sIGlzIHNob3duDQotYmVsb3c6PC9wPg0KLTxwcmU+DQotJmx0O3dlYmxvZ2ljLXdlYi1hcHAmZ3Q7DQotICZsdDtjb250YWluZXItZGVzY3JpcHRvciZndDsNCi0gICAgJmx0O3ByZWZlci13ZWItaW5mLWNsYXNzZXMmZ3Q7dHJ1ZSZsdDsvcHJlZmVyLXdlYi1pbmYtY2xhc3NlcyZndDsNCi0gICZsdDsvY29udGFpbmVyLWRlc2NyaXB0b3ImZ3Q7DQotJmx0Oy93ZWJsb2dpYy13ZWItYXBwJmd0Ow0KLTwvcHJlPg0KLTxwPklmIHNldCB0byB0cnVlLCB0aGUgJmx0O3ByZWZlci13ZWItaW5mLWNsYXNzZXMmZ3Q7IGVsZW1lbnQgd2lsbA0KLWZvcmNlIFdlYkxvZ2ljJ3MgY2xhc3Nsb2FkZXIgdG8gbG9hZCBjbGFzc2VzIGxvY2F0ZWQgaW4gdGhlIFdFQi1JTkYNCi1kaXJlY3Rvcnkgb2YgYSBXZWIgYXBwbGljYXRpb24gaW4gcHJlZmVyZW5jZSB0byBhcHBsaWNhdGlvbiBvcg0KLXN5c3RlbSBjbGFzc2VzLiBUaGlzIGlzIGEgcmVjb21tZW5kZWQgYXBwcm9hY2ggc2luY2UgaXQgb25seQ0KLWltcGFjdHMgYSBzaW5nbGUgV2ViIG1vZHVsZS48L3A+DQotPHA+UGxlYXNlIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzIGluIFdlYkxvZ2ljLyBXZWJTcGhlcmUNCi1mb3IgbW9yZSBpbmZvcm1hdGlvbjo8L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vZS1kb2NzLmJlYS5jb20vd2xzL2RvY3M4MS9wcm9ncmFtbWluZy9jbGFzc2xvYWRpbmcuaHRtbCI+V2ViTG9naWMNCi1TZXJ2ZXJBcHBsaWNhdGlvbiBDbGFzc2xvYWRpbmc8L2E+LSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cNCi1XZWJMb2dpYydzIGNsYXNzIGxvYWRlciB3b3JrczwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly9lLWRvY3MuYmVhLmNvbS93bHMvZG9jczgxL3dlYmFwcC9kZXBsb3ltZW50Lmh0bWwiPlJlZGVwbG95aW5nDQotYSBXZWIgQXBwbGljYXRpb24gaW4gRXhwbG9kZWQgRGlyZWN0b3J5IEZvcm1hdDwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vcHVibGliLmJvdWxkZXIuaWJtLmNvbS9pbmZvY2VudGVyL3dzaWloZWxwL3Y4cjMvaW5kZXguanNwP3RvcGljPS9jb20uaWJtLndlYnNwaGVyZS5paS5wcm9kdWN0LmNlLmRvYy9jb25maWd1cmluZy9paXl2aWlnZGVwd2ViZXhwbC5odG0iPg0KLURlcGxveWluZyB0aGUgV2ViIGFwcGxpY2F0aW9uIGluIGV4cGxvZGVkIGZvcm08L2E+PC9saT4NCi08L3VsPg0KLTxwPjxzdHJvbmc+Mi4gTGFjayBvZiBuYW1lc3BhY2luZyBvbiBzZXJpYWxpc2VkIGl0ZW1zPC9zdHJvbmc+PC9wPg0KLTxwPkJFQSBXZWJMb2dpYyBTZXJ2ZXIgOS4wIGNvbWVzIHdpdGggaXRzIG93biBTdEFYIGltcGxlbWVudGF0aW9uLg0KLVRoaXMgcmVzdWx0cyBpbiBsYWNrIG9mIG5hbWVzcGFjaW5nIG9uIHNlcmlhbGlzZWQgaXRlbXMuIEluIHR1cm4sDQotV2ViTG9naWMgc2VydmVyIChXTFMpIGJyZWFrcyB3aXRoIEFYSU9NIG9uIHRoZSBXTFMgY2xhc3NwYXRoLiBIZW5jZQ0KLWEgZmlsdGVyaW5nIGNsYXNzbG9hZGVyIGlzIHJlcXVpcmVkOjwvcD4NCi08cD5BZGRpbmcgdGhlIGZvbGxvd2luZyB0byB3ZWJsb2dpYy1hcHBsaWNhdGlvbi54bWwgc2hvdWxkIHJlc29sdmUNCi10aGlzIGlzc3VlOjwvcD4NCi08cHJlPg0KLSZsdDtwcmVmZXItYXBwbGljYXRpb24tcGFja2FnZXMmZ3Q7DQotJmx0O3BhY2thZ2UtbmFtZSZndDtjb20uY3RjLndzdHguKiZsdDsvcGFja2FnZS1uYW1lJmd0Ow0KLSZsdDtwYWNrYWdlLW5hbWUmZ3Q7amF2YXgueG1sLiombHQ7L3BhY2thZ2UtbmFtZSZndDsNCi0mbHQ7cGFja2FnZS1uYW1lJmd0O29yZy5hcGFjaGUuKiZsdDsvcGFja2FnZS1uYW1lJmd0Ow0KLSZsdDsvcHJlZmVyLWFwcGxpY2F0aW9uLXBhY2thZ2VzJmd0Ow0KLTwvcHJlPg0KLTxwPk5vdGUgdGhhdCB0aGUgbGlicmFyaWVzIGxpc3RlZC0tWGVyY2VzLCBTdEFYIEFQSSwgV29vZHN0b3gtLW5lZWQNCi10byBiZSBvbiB0aGUgYXBwbGljYXRpb24gY2xhc3NwYXRoLjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9heGlzMmNvbmZpZy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvYXhpczJjb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTYyOTk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9heGlzMmNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPgotICA8dGl0bGU+QXhpczIgQ29uZmlndXJhdGlvbiBEb2N1bWVudHM8L3RpdGxlPgotICA8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLSAgbWVkaWE9ImFsbCIvPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJlbiI+Ci08aDE+QXhpczIgQ29uZmlndXJhdGlvbiBHdWlkZTwvaDE+Ci0KLTxwPkluIEF4aXMyLCB0aGVyZSBhcmUgdGhyZWUga2luZHMgb2YgY29uZmlndXJhdGlvbiBmaWxlcyB0byBjb25maWd1cmUgdGhlCi1zeXN0ZW0uIFRoZSBmaXJzdCBvbmUgaXMgdG8gY29uZmlndXJlIHRoZSB3aG9sZSBzeXN0ZW0gKGdsb2JhbAotY29uZmlndXJhdGlvbiksIHRoZSBzZWNvbmQgb25lIGlzIHRvIGNvbmZpZ3VyZSBhIHNlcnZpY2UgKHNlcnZpY2UKLWNvbmZpZ3VyYXRpb24pLCBhbmQgdGhlIHRoaXJkIG9uZSBpcyB0byBjb25maWd1cmUgYSBtb2R1bGUgKG1vZHVsZQotY29uZmlndXJhdGlvbikuIFRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlIGFib3ZlIGNvbmZpZ3VyYXRpb25zIGluIGRldGFpbC48L3A+Ci0KLTxoMj5Db250ZW50PC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiNHbG9iYWxfQ29uZmlndXJhdGlvbiI+R2xvYmFsIENvbmZpZ3VyYXRpb24KLSAgKGF4aXMyLnhtbCk8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNTZXJ2aWNlX0NvbmZpZ3VyYXRpb24iPlNlcnZpY2UgQ29uZmlndXJhdGlvbgotICAgIChzZXJ2aWNlcy54bWwpPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjTW9kdWxlX0NvbmZpZ3VyYXRpb24iPk1vZHVsZSBDb25maWd1cmF0aW9uCi0gIChtb2R1bGUueG1sKTwvYT48L2xpPgotPC91bD4KLTxhIG5hbWU9Ikdsb2JhbF9Db25maWd1cmF0aW9uIj48L2E+Ci0KLTxoMj5HbG9iYWwgQ29uZmlndXJhdGlvbjwvaDI+Ci08dWw+Ci0gIDxsaT5Xcml0aW5nIGF4aXMyLnhtbDwvbGk+Ci08L3VsPgotCi08cD5BbGwgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgcmVxdWlyZSBzdGFydGluZyBBeGlzMiBhcmUgb2J0YWluZWQgZnJvbQotYXhpczIueG1sLiBUaGUgd2F5IHRvIHNwZWNpZnkgdGhlbSBpcyBleHRyZW1lbHkgc2ltcGxlIGFuZCBlYXN5LiBUaGUgZG9jdW1lbnQKLWlzIGFsbCBhYm91dCB0aGUgcHJvcGVyIHdheSBvZiBzcGVjaWZ5aW5nIHRoZSBjb25maWd1cmF0aW9ucyBpbiBheGlzMi54bWwuCi1UaGVyZSBhcmUgc2l4IHRvcCBsZXZlbCBlbGVtZW50cyB0aGF0IGNhbiBiZSBzZWVuIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLWFuZCBjYW4gYmUgbGlzdGVkIGFzIGZvbGxvd3M6PC9wPgotPHVsPgotICA8bGk+PGEgaHJlZj0iI1BhcmFtZXRlciI+UGFyYW1ldGVyPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjUmVjZWl2ZXIiPlRyYW5zcG9ydCBSZWNlaXZlcjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI1NlbmRlciI+VHJhbnNwb3J0IFNlbmRlcjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI1BoYXNlX09yZGVyIj5QaGFzZSBPcmRlcjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI1JlZmVyZW5jZXMiPk1vZHVsZSBSZWZlcmVuY2VzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjTGlzdGVuZXJzIj5MaXN0ZW5lcnMgKE9ic2VydmVycyk8L2E+PC9saT4KLTwvdWw+Ci08YSBuYW1lPSJQYXJhbWV0ZXIiPjwvYT4KLQotPGgzPlBhcmFtZXRlcjwvaDM+Ci0KLTxwPkluIEF4aXMyLCBhIHBhcmFtZXRlciBpcyBub3RoaW5nIGJ1dCBhIG5hbWUtdmFsdWUgcGFpci4gRWFjaCBhbmQgZXZlcnkgdG9wCi1sZXZlbCBwYXJhbWV0ZXIgYXZhaWxhYmxlIGluIHRoZSBheGlzMi54bWwgKGRpcmVjdCBzdWIgZWxlbWVudHMgb2YgdGhlIHJvb3QKLWVsZW1lbnQpIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byBwcm9wZXJ0aWVzIGluIEF4aXNDb25maWd1cmF0aW9uLiBUaGVyZWZvcmUsCi10aGUgdG9wIGxldmVsIHBhcmFtZXRlcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZG9jdW1lbnQgY2FuIGJlIGFjY2Vzc2VkIHZpYQotQXhpc0NvbmZpZ3VyYXRpb24gaW4gdGhlIHJ1bm5pbmcgc3lzdGVtLiBUaGUgY29ycmVjdCB3YXkgb2YgZGVmaW5pbmcgYQotcGFyYW1ldGVyIGlzIHNob3duIGJlbG93OjwvcD4KLTxzb3VyY2U+PHByZT4gCi0gICZsdDtwYXJhbWV0ZXIgbmFtZT0ibmFtZSBvZiB0aGUgcGFyYW1ldGVyIiAmZ3Q7cGFyYW1ldGVyIHZhbHVlICZsdDsvcGFyYW1ldGVyJmd0OzwvcHJlPgotPC9zb3VyY2U+PGEgbmFtZT0iUmVjZWl2ZXIiPjwvYT4KLQotPGgzPlRyYW5zcG9ydCBSZWNlaXZlcjwvaDM+Ci0KLTxwPkRlcGVuZGluZyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgb24gd2hpY2ggQXhpczIgaXMgZ29pbmcgdG8gcnVuLCB5b3UKLW5lZWQgdG8gaGF2ZSBkaWZmZXJlbnQgdHJhbnNwb3J0IHJlY2VpdmVycy4gVGhlIHdheSB5b3UgYWRkIHRoZW0gdG8gdGhlCi1zeXN0ZW0gaXMgYXMgZm9sbG93czo8L3A+IDxzb3VyY2U+Ci08cHJlPgotJmx0O3RyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiJmd0OwotICAgICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9InBvcnQiICZndDs2MDYwJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gJmx0Oy90cmFuc3BvcnRSZWNlaXZlciZndDsgCi0gPC9wcmU+Ci08L3NvdXJjZT5UaGUgYWJvdmUgZWxlbWVudHMgc2hvdyBob3cgdG8gZGVmaW5lIHRyYW5zcG9ydCByZWNlaXZlcnMgaW4KLWF4aXMyLnhtbC4gSGVyZSB0aGUgIm5hbWUiIGF0dHJpYnV0ZSBvZiB0aGUgJmx0O3RyYW5zcG9ydFJlY2VpdmVyLyZndDsgZWxlbWVudCBpZGVudGlmaWVzIHRoZQotdHlwZSBvZiB0aGUgdHJhbnNwb3J0IHJlY2VpdmVyLiBJdCBjYW4gYmUgSFRUUCwgVENQLCBTTVRQLCBDb21tb25zSFRUUCwgZXRjLgotV2hlbiB0aGUgc3lzdGVtIHN0YXJ0cyB1cCBvciB3aGVuIHlvdSBzZXQgdGhlIHRyYW5zcG9ydCBhdCB0aGUgY2xpZW50IHNpZGUsCi15b3UgY2FuIHVzZSB0aGVzZSB0cmFuc3BvcnQgbmFtZXMgdG8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgdHJhbnNwb3J0LiBUaGUgImNsYXNzIgotYXR0cmlidXRlIGlzIGZvciBzcGVjaWZ5aW5nIHRoZSBhY3R1YWwgamF2YSBjbGFzcyB0aGF0IHdpbGwgaW1wbGVtZW50IHRoZSByZXF1aXJlZAotaW50ZXJmYWNlcyBmb3IgdGhlIHRyYW5zcG9ydC4gQW55IHRyYW5zcG9ydCBjYW4gaGF2ZSB6ZXJvIG9yIG1vcmUgcGFyYW1ldGVycywKLWFuZCBhbnkgcGFyYW1ldGVycyBnaXZlbiBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBjb3JyZXNwb25kaW5nCi10cmFuc3BvcnQgcmVjZWl2ZXIuIDxhIG5hbWU9IlNlbmRlciI+PC9hPgotCi08aDM+VHJhbnNwb3J0IFNlbmRlcjwvaDM+Ci0KLTxwPkp1c3QgbGlrZSB0aGUgdHJhbnNwb3J0IHJlY2VpdmVycywgeW91IGNhbiByZWdpc3RlciB0cmFuc3BvcnQgc2VuZGVycyBpbiB0aGUKLXN5c3RlbSwgYW5kIGxhdGVyIGF0IHJ1biB0aW1lLCB0aGUgc2VuZGVycyBjYW4gYmUgdXNlZCB0byBzZW5kIHRoZSBtZXNzYWdlcy4KLUZvciBleGFtcGxlLCBjb25zaWRlciBBeGlzMiBydW5uaW5nIHVuZGVyIEFwYWNoZSBUb21jYXQuIFRoZW4gQXhpczIgY2FuIHVzZQotVENQIHRyYW5zcG9ydCBzZW5kZXJzIHRvIHNlbmQgbWVzc2FnZXMgcmF0aGVyIHRoYW4gSFRUUC4gVGhlIG1ldGhvZCBvZgotc3BlY2lmeWluZyB0cmFuc3BvcnQgc2VuZGVycyBpcyBhcyBmb2xsb3dzOjwvcD4KLTxwcmU+IAotJmx0O3RyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciImZ3Q7Ci0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiIGxvY2tlZD0ieHNkOmZhbHNlIiZndDtIVFRQLzEuMCZsdDsvcGFyYW1ldGVyJmd0OwotICZsdDsvdHJhbnNwb3J0U2VuZGVyJmd0OyAKLSA8L3ByZT4KLTxzdHJvbmc+bmFtZTo8L3N0cm9uZz4gTmFtZSBvZiB0aGUgdHJhbnNwb3J0ICh5b3UgY2FuIGhhdmUgSFRUUCBhbmQgSFRUUDEgYXMKLXRoZSB0cmFuc3BvcnQgbmFtZSkKLQotPHA+PHN0cm9uZz5jbGFzczo8L3N0cm9uZz4gSW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLXRyYW5zcG9ydC48L3A+Ci0KLTxwPkp1c3QgbGlrZSB0aGUgdHJhbnNwb3J0IHJlY2VpdmVycywgdHJhbnNwb3J0IHNlbmRlcnMgY2FuIGhhdmUgemVybwotb3IgbW9yZSBwYXJhbWV0ZXJzLCBhbmQgaWYgdGhlcmUgYXJlIGFueSwgdGhleSBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZQotY29ycmVzcG9uZGluZyB0cmFuc3BvcnQgc2VuZGVyLjwvcD4KLTxhIG5hbWU9IlBoYXNlX09yZGVyIj48L2E+Ci0KLTxoMz5QaGFzZSBPcmRlcjwvaDM+Ci0KLTxwPlNwZWNpZnlpbmcgdGhlIG9yZGVyIG9mIHBoYXNlcyBpbiB0aGUgZXhlY3V0aW9uIGNoYWluIGhhcyB0byBiZSBkb25lIHVzaW5nCi10aGUgcGhhc2Ugb3JkZXIgZWxlbWVudC4gSXQgd2lsbCBsb29rIGFzIGZvbGxvd3M6PC9wPgotPHByZT4mbHQ7cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciJmd0OwotICAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8mZ3Q7Ci0gICAgICAgICAuCi0gICAgICAgICAuCi0mbHQ7L3BoYXNlT3JkZXImZ3Q7ICAgPC9wcmU+Ci0KLTxwPlRoZSBtb3N0IGludGVyZXN0aW5nIHRoaW5nIGlzIHRoYXQgeW91IGNhbiBhZGQgaGFuZGxlcnMgaGVyZSBhcyB3ZWxsLiBJZgoteW91IHdhbnQgdG8gYWRkIGEgaGFuZGxlciB0aGF0IHNob3VsZCBnbyBpbnRvIHRoYXQgcGhhc2UsIHlvdSBjYW4gZGlyZWN0bHkgZG8KLXRoYXQgYnkgYWRkaW5nIGEgaGFuZGxlciBlbGVtZW50IGludG8gaXQuIEluIGFkZGl0aW9uIHRvIHRoYXQsIHRoZXJlIGlzIG5vCi1oYXJkIGNvZGluZyB3b3JrIGZvciB0aGUgaGFuZGxlciBjaGFpbiBhbnl3aGVyZSBpbiBBeGlzMiAoYXQgYW55IEF4aXMqKS4gU28KLWFsbCB0aG9zZSBjb25maWd1cmF0aW9ucyBhcmUgYWxzbyBkb25lIGluIHRoZSBwaGFzZSBvcmRlciBlbGVtZW50LiBUaGUKLWNvbXBsZXRlIGNvbmZpZ3VyYXRpb25zIHdpbGwgbG9vayBhcyBmb2xsb3dzOiA8L3A+PHNvdXJjZT4KLTxwcmU+Jmx0O3BoYXNlT3JkZXIgdHlwZT0iSW5GbG93IiZndDsKLSAgICAgICAgJmx0OyEtLSAgIEdsb2JhbCBwaGFzZXMgICAgLS0mZ3Q7Ci0gICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iVHJhbnNwb3J0IiZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgJmx0Oy9waGFzZSZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlNlY3VyaXR5Ii8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIiZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0KLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJJbnN0YW5jZURpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSW5zdGFuY2VEaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICZsdDsvcGhhc2UmZ3Q7Ci0gICAgICAgICZsdDshLS0gICBHbG9iYWwgcGhhc2VzICAgLS0mZ3Q7Ci0gICAgICAgICZsdDshLS0gICBBZnRlciB0aGUgRGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50cyAgICAtLSZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLyZndDsKLSAgICAmbHQ7L3BoYXNlT3JkZXImZ3Q7Ci0gICAgJmx0O3BoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS0gICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLSZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8mZ3Q7Ci0gICAgICAgICZsdDshLS0gIEdsb2JhbCBwaGFzZXMgIC0tJmd0OwotICAgICAgICAmbHQ7IS0tICB0aGVzZSBwaGFzZXMgd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlICAtLSZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLyZndDsKLSAgICAmbHQ7L3BoYXNlT3JkZXImZ3Q7Ci0gICAgJmx0O3BoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9Ikluc3RhbmNlRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5JbnN0YW5jZURpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgJmx0Oy9waGFzZSZndDsKLSAgICAgICAgJmx0OyEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLSZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLyZndDsKLSAgICAmbHQ7L3BoYXNlT3JkZXImZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPjxzdHJvbmc+dHlwZTo8L3N0cm9uZz4gdGhlIGF0dHJpYnV0ZSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIHRoZSBmbG93LiBJdAotY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotICA8bGk+SW5GbG93PC9saT4KLSAgPGxpPk91dEZsb3c8L2xpPgotICA8bGk+SW5GYXVsdEZsb3c8L2xpPgotICA8bGk+T3V0RmF1bHRGbG93PC9saT4KLTwvdWw+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIHRoYXQsIHRoZSBvbmx5IGNoaWxkIGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIGluc2lkZQotInBoYXNlT3JkZXIiIGlzIHRoZSAicGhhc2UiIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgYXZhaWxhYmxlIHBoYXNlcyBpbgotdGhlIGV4ZWN1dGlvbiBjaGFpbi4gVGhlIG1ldGhvZCBvZiBzcGVjaWZ5aW5nIHBoYXNlcyBpbnNpZGUgInBoYXNlT3JkZXIiIGlzCi1hcyBmb2xsb3dzOjwvcD48c291cmNlPgotPHByZT4gJmx0O3BoYXNlIG5hbWU9IlRyYW5zcG9ydCIvJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD48c3Ryb25nPm5hbWU6PC9zdHJvbmc+IE5hbWUgb2YgdGhlIHBoYXNlLiA8YnIvPgotPC9wPgotCi08cD5UaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIHRoYXQgb25lIGhhcyB0byBrZWVwIGluIG1pbmQgd2hlbiBjaGFuZ2luZyBhCi1waGFzZU9yZGVyOjwvcD4KLQotPHA+Rm9yIHRoZSBwaGFzZU9yZGVyIHR5cGVzIDxzdHJvbmc+IkluRmxvdyI8L3N0cm9uZz4gYW5kCi08c3Ryb25nPiJJbkZhdWx0RmxvdyI8L3N0cm9uZz48L3A+Ci08dWw+Ci0gIDxsaT5BbGwgdGhlIHBoYXNlcyB0aGF0IGFyZSBhYm92ZSB0aGUgIkRpc3BhdGNoIiBwaGFzZSwgaW5jbHVkaW5nIHRoZQotICAgICJEaXNwYXRjaCIgcGhhc2UsIGFyZSBrbm93biBhcyAiR2xvYmFsIHBoYXNlcyIgLiBZb3UgY2FuIGFkZCBhbnkgbnVtYmVyCi0gICAgb2YgbmV3IHBoYXNlcyBoZXJlIGFuZCB0aGV5IHdpbGwgYmUgY29uc2lkZXJlZCBnbG9iYWwuPC9saT4KLSAgPGxpPkluIHRoZXNlIHR3byBwaGFzZU9yZGVyIHR5cGVzLCB0aGUgcGhhc2VzIGFkZGVkIGFmdGVyIHRoZSAiRGlzcGF0Y2giCi0gICAgcGhhc2UgYXJlIGtub3duIGFzICJPcGVyYXRpb24gcGhhc2VzIi48L2xpPgotPC91bD4KLQotPHA+Rm9yIHRoZSBwaGFzZU9yZGVyIHR5cGVzIDxzdHJvbmc+Ik91dEZsb3ciPC9zdHJvbmc+IGFuZAotPHN0cm9uZz4iT3V0RmF1bHRGbG93Ijwvc3Ryb25nPjwvcD4KLTx1bD4KLSAgPGxpPkFsbCB0aGUgcGhhc2VzIHRoYXQgYXJlIGJlbG93IHRoZSAiTWVzc2FnZU91dCIgcGhhc2UsIGluY2x1ZGluZyB0aGUKLSAgICAiTWVzc2FnZU91dCIgcGhhc2UsIGFyZSBrbm93biBhcyAiR2xvYmFsIHBoYXNlcyIuIFlvdSBjYW4gYWRkIG5ldyBwaGFzZXMKLSAgICBhY2NvcmRpbmcgdG8geW91ciByZXF1aXJlbWVudC48L2xpPgotICA8bGk+VGhlIHBoYXNlcyBhZGRlZCBiZWZvcmUgdGhlICJNZXNzYWdlT3V0IiBwaGFzZSBhcmUga25vd24gYXMgIk9wZXJhdGlvbgotICAgIHBoYXNlcyIuPC9saT4KLQotICA8cD48c3Ryb25nPk5vdGUgOjwvc3Ryb25nPiBJZiB5b3UgbG9vayBjbG9zZWx5IGF0IHRoZSBkZWZhdWx0IGF4aXMyLnhtbCwKLSAgeW91IHdpbGwgYmUgYWJsZSB0byBjbGVhcmx5IGlkZW50aWZ5IGl0LjwvcD4KLTwvdWw+Ci08YSBuYW1lPSJSZWZlcmVuY2VzIj48L2E+Ci0KLTxoMz5Nb2R1bGUgUmVmZXJlbmNlczwvaDM+Ci0KLTxwPklmIHlvdSB3YW50IHRvIGVuZ2FnZSBhIG1vZHVsZSwgc3lzdGVtIHdpZGUsIHlvdSBjYW4gZG8gaXQgYnkgYWRkaW5nIGEgdG9wCi1sZXZlbCBtb2R1bGUgZWxlbWVudCBpbiBheGlzMi54bWwuIEl0IHNob3VsZCBsb29rIGFzIGZvbGxvd3M6PC9wPjxzb3VyY2U+Ci08cHJlPiZsdDttb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8mZ3Q7ICA8L3ByZT4KLTwvc291cmNlPgotPHA+PHN0cm9uZz5yZWY6PC9zdHJvbmc+IHRoZSBtb2R1bGUgbmFtZSB3aGljaCBpcyBnb2luZyB0byBiZSBlbmdhZ2VkLCBzeXN0ZW0KLXdpZGUuPC9wPgotPGEgbmFtZT0iTGlzdGVuZXJzIj48L2E+Ci0KLTxoMz48c3Ryb25nPkxpc3RlbmVycyAoT2JzZXJ2ZXJzKTwvc3Ryb25nPjwvaDM+Ci0KLTxwPkluIEF4aXMyLCBBeGlzQ29uZmlndXJhdGlvbiBpcyBvYnNlcnZhYmxlIHNvIHRoYXQgeW91IGNhbiByZWdpc3Rlcgotb2JzZXJ2ZXJzIGludG8gdGhhdC4gVGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5mb3JtZWQgd2hlbmV2ZXIgYSBjaGFuZ2UKLW9jY3VycyBpbiBBeGlzQ29uZmlndXJhdGlvbi4gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBvYnNlcnZlcnMgYXJlCi1pbmZvcm1lZCBvZiB0aGUgZm9sbG93aW5nIGV2ZW50czo8L3A+Ci08dWw+Ci0gIDxsaT5EZXBsb3lpbmcgYSBTZXJ2aWNlPC9saT4KLSAgPGxpPlJlbW92aW5nIGEgc2VydmljZTwvbGk+Ci0gIDxsaT5BY3RpdmF0ZS9JbmFjdGl2YXRlIFNlcnZpY2U8L2xpPgotICA8bGk+TW9kdWxlIGRlcGxveTwvbGk+Ci0gIDxsaT5Nb2R1bGUgcmVtb3ZlPC9saT4KLTwvdWw+Ci0KLTxwPlJlZ2lzdGVyaW5nIE9ic2VydmVycyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgYWRkaXRpb25hbCBmZWF0dXJlcyBzdWNoIGFzIFJTUwotZmVlZCBnZW5lcmF0aW9uLCB3aGljaCB3aWxsIHByb3ZpZGUgc2VydmljZSBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmVycy4gVGhlCi1jb3JyZWN0IHdheSBvZiByZWdpc3RlcmluZyBvYnNlcnZlcnMgc2hvdWxkIGFzIGZvbGxvd3M6PC9wPjxzb3VyY2U+Ci08cHJlPiZsdDtsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCIgJmd0O2h0dHA6Ly8xMjcuMC4wLjEvcnNzJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICZsdDsvbGlzdGVuZXImZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPjxzdHJvbmc+Y2xhc3M6PC9zdHJvbmc+IFJlcHJlc2VudHMgYW4gSW1wbGVtZW50YXRpb24gY2xhc3Mgb2Ygb2JzZXJ2ZXIsCi1hbmQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIEltcGxlbWVudGF0aW9uIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQKLUF4aXNPYnNlcnZlciBpbnRlcmZhY2UsIGFuZCB0aGUgY2xhc3MgaGFzIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoLgotPGEgbmFtZT0iU2VydmljZV9Db25maWd1cmF0aW9uIj48L2E+PC9wPgotCi08aDI+PGZvbnQ+U2VydmljZSBDb25maWd1cmF0aW9uPC9mb250PjwvaDI+Ci08dWw+Ci0gIDxsaT48Zm9udD5Xcml0aW5nIHNlcnZpY2VzLnhtbDwvZm9udD48L2xpPgotPC91bD4KLQotPHA+PGZvbnQ+VGhlIGRlc2NyaXB0aW9uIG9mIHNlcnZpY2VzIGFyZSBzcGVjaWZpZWQgdXNpbmcgc2VydmljZXMueG1sLiBFYWNoCi1zZXJ2aWNlIGFyY2hpdmUgZmlsZSBuZWVkcyB0byBoYXZlIGEgc2VydmljZXMueG1sIGluIG9yZGVyIHRvIGJlIGEgdmFsaWQKLXNlcnZpY2UgYW5kIGl0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSBvZiB0aGUgYXJjaGl2ZQotZmlsZS4gQSB2ZXJ5IHNpbXBsZSBzZXJ2aWNlcy54bWwgaXMgc2hvd24gYmVsb3c6PC9mb250PjwvcD4KLTxzb3VyY2U+PHByZT4mbHQ7c2VydmljZSBuYW1lPSJuYW1lIG9mIHRoZSBzZXJ2aWNlIiBzY29wZT0ibmFtZSBvZiB0aGUgc2NvcGUiIGNsYXNzPSJmdWxsIHF1YWxpZmlkZSBuYW1lIHRoZSBzZXJ2aWNlIGxpZmVjeWNsZSBjbGFzcyIgICB0YXJnZXROYW1lc3BhY2U9InRhcmdldCBuYW1lc3Bhc2UgZm9yIHRoZSBzZXJ2aWNlIiZndDsKLSAgICAmbHQ7RGVzY3JpcHRpb24mZ3Q7IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VydmljZSAgJmx0Oy9EZXNjcmlwdGlvbiZndDsgIAotCi0gICAgJmx0O3RyYW5zcG9ydHMmZ3Q7IAotICAgICAgICZsdDt0cmFuc3BvcnQmZ3Q7SFRUUCZsdDsvdHJhbnNwb3J0Jmd0OwotICAgICZsdDsvdHJhbnNwb3J0cyZndDsKLSAgICAKLSAgICAmbHQ7c2NoZW1hIHNjaGVtYU5hbWVzcGFjZT0ic2NoZW1hIG5hbWVzcGFjZSIvJmd0OyAKLSAgICAgCi0gICAgJmx0O21lc3NhZ2VSZWNlaXZlcnMmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLyZndDsKLSAgICAmbHQ7L21lc3NhZ2VSZWNlaXZlcnMmZ3Q7Ci0gICAgIAotICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgbG9ja2VkPSJ4c2Q6ZmFsc2UiJmd0O29yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGwmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAKLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIG1lcD0ib3BlcmF0aW9uIE1FUCImZ3Q7IAotICAgICAgICAmbHQ7YWN0aW9uTWFwcGluZyZndDtNYXBwaW5nIHRvIGFjdGlvbiZsdDsvYWN0aW9uTWFwcGluZyZndDsKLSAgICAgICAgJmx0O21vZHVsZSByZWY9IiBhIG1vZHVsZSBuYW1lICIvJmd0OwotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0OwotICAgICZsdDsvb3BlcmF0aW9uJmd0OwotICAmbHQ7L3NlcnZpY2UmZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPjxzdHJvbmc+bmFtZTwvc3Ryb25nPjogVGhlIHNlcnZpY2UgbmFtZSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlCi1maWxlIGlmIHRoZSAuYWFyIGZpbGUgY29udGFpbnMgb25seSBvbmUgc2VydmljZSwgb3IgZWxzZSB0aGUgbmFtZSBvZiB0aGUKLXNlcnZpY2Ugd2lsbCBiZSB0aGUgbmFtZSBnaXZlbiBieSB0aGUgbmFtZSBhdHRyaWJ1dGUuPC9wPgotCi08cD48c3Ryb25nPnNjb3BlPC9zdHJvbmc+OiAoT3B0aW9uYWwgQXR0cmlidXRlKSBUaGUgdGltZSBwZXJpb2QgZHVyaW5nIHdoaWNoCi1ydW50aW1lIGluZm9ybWF0aW9uIG9mIHRoZSBkZXBsb3llZCBzZXJ2aWNlcyB3aWxsIGJlIGF2YWlsYWJsZS4gU2NvcGUgaXMgb2YKLXNldmVyYWwgdHlwZXMtICJhcHBsaWNhdGlvbiIsICJzb2Fwc2Vzc2lvbiIsICJ0cmFuc3BvcnRzZXNzaW9uIiwgInJlcXVlc3QiLgotVGhlIGRlZmF1bHQgdmFsdWUgKGlmIHlvdSBkb24ndCBlbnRlciBhbnkgdmFsdWUpIHdpbGwgYmUgInJlcXVlc3QiPC9wPgotCi08cD48c3Ryb25nPmNsYXNzPC9zdHJvbmc+OiAoT3B0aW9uYWwgYXR0cmlidXRlKSBUaGUgZnVsbCBxdWFsaWZpZWQgbmFtZSBvZgotdGhlIHNlcnZpY2UgbGlmZWN5Y2xlIGltcGxlbWVudGF0aW9uIGNsYXNzLiBTZXJ2aWNlTGlmZUN5Y2xlIGNsYXNzIGlzIHVzZWZ1bAotd2hlbiB5b3Ugd2FudCB0byBkbyBzb21lIHRhc2tzIHdoZW4gdGhlIHN5c3RlbSBzdGFydHMgYW5kIHdoZW4gaXQKLXNodXRzIGRvd24uPC9wPgotCi08cD48c3Ryb25nPnRhcmdldE5hbWVzcGFjZTwvc3Ryb25nPjogKE9wdGlvbmFsIEF0dHJpYnV0ZSkgVGFyZ2V0IG5hbWUgc3BhY2UKLW9mIHRoZSBzZXJ2aWNlLiBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIFdTREwuIElmIHlvdSBkbwotbm90IHNwZWNpZnkgdGhpcyB2YWx1ZSwgdGhlIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBwYWNrYWdlIG5hbWUgb2YKLXRoZSBzZXJ2aWNlIGltcGwgY2xhc3MuPC9wPgotCi08cD48Zm9udD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+OiAoT3B0aW9uYWwpIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgYW55Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgc2VydmljZSB2aWEgQXhpczIgd2ViLWFkbWluIG1vZHVsZSwgdGhlbiB0aGUKLWRlc2NyaXB0aW9uIGNhbiBiZSBzcGVjaWZpZWQgaGVyZS48L2ZvbnQ+PC9wPgotCi08cD48c3Ryb25nPnRyYW5zcG9ydHM8L3N0cm9uZz4gOiAoT3B0aW9uYWwpIFRoZSB0cmFuc3BvcnRzIHRvIHdoaWNoIHRoZQotc2VydmljZSBpcyBnb2luZyB0byBiZSBleHBvc2VkLiBJZiB0aGUgdHJhbnNwb3J0IGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZW4KLXRoZSBzZXJ2aWNlIHdpbGwgYmUgZXhwb3NlZCBpbiBhbGwgdGhlIHRyYW5zcG9ydHMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uCi1UaGUgdHJhbnNwb3J0IGNoaWxkIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0cmFuc3BvcnQgcHJlZml4ICh0aGUgbmFtZSBvZiB0aGUKLXRyYW5zcG9ydCBzcGVjaWZpZWQgaW4gYXhpczIueG1sKS48L3A+Ci0KLTxwPjxiPnBhcmFtZXRlcnM6PC9iPiBBIHNlcnZpY2VzLnhtbCBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIHRvcCBsZXZlbAotcGFyYW1ldGVycyBhbmQgYWxsIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gc2VydmljZQotcHJvcGVydGllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBBeGlzU2VydmljZS4gVGhlcmUgaXMgYSBjb21wdWxzb3J5IHBhcmFtZXRlcgotaW4gc2VydmljZXMueG1sIGNhbGxlZCBTZXJ2aWNlQ2xhc3MgdGhhdCBzcGVjaWZpZXMgdGhlIEphdmEgY2xhc3MsIHdoaWNoCi1wZXJmb3JtcyB0aGUgYWJvdmUgdHJhbnNmb3JtYXRpb24uIFRoaXMgY2xhc3MgaXMgbG9hZGVkIGJ5IHRoZQotTWVzc2FnZVJlY2VpdmVyLjwvcD4KLQotPHA+PGI+b3BlcmF0aW9ucyA6PC9iPiBJZiB0aGUgc2VydmljZSBpbXBsIGNsYXNzIGlzIEphdmEsIHRoZW4gYWxsIHRoZSBwdWJsaWMKLW1ldGhvZHMgaW4gdGhhdCBzZXJ2aWNlIHdpbGwgYmUgZXhwb3NlZC4gSWYgdGhlIHVzZXIgd2FudHMgdG8gb3ZlcnJpZGUgaXQsIGhlCi1oYXMgdG8gYWRkIHRoZSAib3BlcmF0aW9uIiB0YWcgYW5kIG92ZXJyaWRlIGl0LiBJbiBhIG5vbi1KYXZhIHNjZW5hcmlvIG9yIGlmCi15b3UgZG8gbm90IGhhdmUgYSBzZXJ2aWNlIGNsYXNzLCB0aGVuIGFsbCB0aGUgb3BlcmF0aW9ucyB0aGUgdXNlciB3YW50cyB0bwotZXhwb3NlIGJ5IHRoZSBzZXJ2aWNlIGhhcyB0byBiZSBpbmRpY2F0ZWQgaW4gdGhlIHNlcnZpY2VzLnhtbC4gSXQgaXMKLXNwZWNpZmllZCBhcyBmb2xsb3dzOjwvcD4gIDxzb3VyY2U+Ci08cHJlPiAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciJmd0OwotICAgICAgICAmbHQ7bW9kdWxlIHJlZj0iIGEgbW9kdWxlIG5hbWUgIi8mZ3Q7Ci0gICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7Ci0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSBvbmx5IGNvbXB1bHNvcnkgYXR0cmlidXRlIGhlcmUgaXMgIm5hbWUiLCB3aGljaCByZXByZXNlbnRzIHRoZQotb3BlcmF0aW9uIG5hbWUgdGhhdCBpcyBnb2luZyB0byBiZSBleHBvc2VkLiBBbnkgb3BlcmF0aW9uIGNhbiBjb250YWluIG1vZHVsZQotcmVmZXJlbmNlcyBhcyB3ZWxsIGFzIGFueSBudW1iZXIgb2YgcGFyYW1ldGVycy4gVGhlIG1vc3QgaW50ZXJlc3RpbmcgdGhpbmcgaXMKLXRoYXQgeW91IGNhbiByZWdpc3RlciBjdXN0b20gbWVzc2FnZSByZWNlaXZlcnMgcGVyIG9wZXJhdGlvbi4gVGhlbiB0aGUKLXJlZ2lzdGVyZWQgbWVzc2FnZSByZWNlaXZlciB3aWxsIGJlIHRoZSBtZXNzYWdlIHJlY2VpdmVyIGZvciB0aGUKLWNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uLiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIG1lc3NhZ2UgcmVjZWl2ZXIsIHRoZW4gdGhlCi1kZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIgd2lsbCBwZXJmb3JtIHRoZSBvcGVyYXRpb24uIDxici8+Ci08YSBuYW1lPSJNb2R1bGVfQ29uZmlndXJhdGlvbiI+PC9hPjwvcD4KLQotPGgyPk1vZHVsZSBDb25maWd1cmF0aW9uPC9oMj4KLTx1bD4KLSAgPGxpPldyaXRpbmcgbW9kdWxlLnhtbDwvbGk+Ci08L3VsPgotCi08cD5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1vZHVsZSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIG1vZHVsZS54bWwuIEVhY2gKLW1vZHVsZSBhcmNoaXZlIGZpbGUgbmVlZHMgdG8gaGF2ZSBhIG1vZHVsZS54bWwgaW4gb3JkZXIgdG8gYmUgYSB2YWxpZCBtb2R1bGUsCi1hbmQgaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5IG9mIHRoZSBhcmNoaXZlIGZpbGUuIDxici8+Ci08L3A+Ci0KLTxwPkEgdmVyeSBzaW1wbGUgbW9kdWxlLnhtbCBpcyBzaG93biBiZWxvdzo8L3A+IDxzb3VyY2U+Ci08cHJlPiZsdDttb2R1bGUgY2xhc3M9Im9yZy5hcGFjaGUubW9kdWxlLk1vZHVsZTFJbXBsIiZndDsKLSAgICAmbHQ7SW5GbG93Jmd0OwotICAgICAgICAuCi0gICAgICAgIC4KLSAgICAmbHQ7L0luRmxvdyZndDsKLSAgICAmbHQ7T3V0RmxvdyZndDsKLSAgICAgICAgLgotICAgICAgICAuCi0gICAgJmx0Oy9PdXRGbG93Jmd0OwotCi0gICAgJmx0O091dEZhdWx0RmxvdyZndDsKLSAgICAgICAgLiAgIAotICAgICAgICAuCi0gICAgJmx0Oy9PdXRGYXVsdEZsb3cmZ3Q7Ci0KLSAgICAmbHQ7SW5GYXVsdEZsb3cmZ3Q7Ci0gICAgICAgIC4gICAgICAgICAKLSAgICAgICAgLgotICAgICZsdDsvSW5GYXVsdEZsb3cmZ3Q7Ci0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImNyZWF0U2VxIiBtZXA9Ik1FUF9VUklfSU5fT1VUIiZndDsKLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsKLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJwYXJhMSIgbG9ja2VkPSJ4c2Q6dHJ1ZSImZ3Q7MTAmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7L29wZXJhdGlvbiZndDsKLSZsdDsvbW9kdWxlJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD48c3Ryb25nPmNsYXNzOjwvc3Ryb25nPiAoT3B0aW9uYWwgYXR0cmlidXRlKSBJbmRpY2F0ZXMgdGhlIG1vZHVsZQotaW1wbGVtZW50YXRpb24gY2xhc3MuIEEgbW9kdWxlIG1heSBvciBtYXkgbm90IGNvbnRhaW4gYSBtb2R1bGUgaW1wbGVtZW50YXRpb24KLWNsYXNzIHNpbmNlIHRoZSBtb2R1bGUgY2FuIGFsc28gYmUgYSBjb2xsZWN0aW9uIG9mIGhhbmRsZXJzLiBJZiBhIG1vZHVsZQotY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZQotb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZSBpbnRlcmZhY2UgYXQgZGVwbG95bWVudCwgaXRzCi08Y29kZT5pbml0KCk7PC9jb2RlPiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuPC9wPgotCi08cD48Yj5wYXJhbWV0ZXI6PC9iPiBBIG1vZHVsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIGFsbAotdGhlIGxpc3RlZCBwYXJhbWV0ZXJzIGluIHRoZSBtb2R1bGUueG1sIHdpbGwgYmUgdHJhbnNmb3JtZWQgaW50byB0aGUKLWNvcnJlc3BvbmRpbmcgQXhpc01vZHVsZSBvZiB0aGUgbW9kdWxlLjwvcD4KLQotPHA+PGI+ZmxvdzogPC9iPkRlZmluaW5nIG9mIGhhbmRsZXJzIGluIGEgbW9kdWxlIGhhcyB0byBiZSBkb25lIGluc2lkZSBmbG93cy4KLVRoZXJlIGFyZSBmb3VyIHR5cGVzIG9mIGZsb3dzIGFzIGxpc3RlZCBiZWxvdy48L3A+Ci0KLTxwPllvdSBjYW4gYWRkIGFueSBudW1iZXIgb2YgaGFuZGxlcnMgaW50byBhIGZsb3csIGFuZCB0aG9zZSBoYW5kbGVycyB3aWxsIGJlCi1hdmFpbGFibGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2hhaW5zIGF0IHJ1bnRpbWUsIHdoZW4gdGhleSBhcmUgZW5nYWdlZC48L3A+Ci08dWw+Ci0gIDxsaT5JbkZsb3c8L2xpPgotICA8bGk+T3V0RmxvdzwvbGk+Ci0gIDxsaT5JbkZhdWx0RmxvdzwvbGk+Ci0gIDxsaT5PdXRGYXVsdEZsb3c8L2xpPgotPC91bD4KLQotPHA+PGI+b3BlcmF0aW9uczogPC9iPiBJZiBhIG1vZHVsZSB3YW50cyB0byBhZGQgYW4gb3BlcmF0aW9uIHdoZW4gaXQgaXMKLWVuZ2FnZWQgaW50byBhIHNlcnZpY2UsIGl0IGNhbiBiZSBkb25lIGJ5IGFkZGluZyBhbiBvcGVyYXRpb24gdGFnIGluCi1tb2R1bGUueG1sLiBUaGUgbWV0aG9kIG9mIHNwZWNpZnlpbmcgdGhlIG9wZXJhdGlvbiBpcyB0aGUgc2FtZSBhcyBvcGVyYXRpb24KLWluIHNlcnZpY2VzLnhtbC48L3A+Ci0KLTxwPjxiPmhhbmRsZXI6PC9iPiBUaGUgSGFuZGxlciBlbGVtZW50IGNvbnNpc3RzIG9mIGNvbXB1bHNvcnkgYW5kIG9wdGlvbmFsCi1hdHRyaWJ1dGVzLiBUaGUgbWV0aG9kIG9mIGRlZmluaW5nIGEgaGFuZGxlciB3aWxsIGxvb2sgYXMgZm9sbG93czo8L3A+IDxzb3VyY2U+Ci08cHJlPiZsdDtoYW5kbGVyIG5hbWU9ImhhbmRsZXIxIiBjbGFzcz0iaGFuZGxlckNsYXNzICImZ3Q7Ci0gICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9InVzZXJwaGFzZTEiIC8mZ3Q7Ci0gJmx0Oy9oYW5kbGVyJmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD48Yj48aT5Db21wdWxzb3J5IEF0dHJpYnV0ZXM8L2k+PC9iPiA8YnIvPgotPGI+bmFtZTo8L2I+IE5hbWUgb2YgdGhlIGhhbmRsZXIuPGJyLz4KLTxiPmNsYXNzOjwvYj4gSGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy48YnIvPgotPGI+cGhhc2U6PC9iPiBOYW1lIG9mIHRoZSBwaGFzZSB0aGF0IHRoZSBoYW5kbGVyIHNob3VsZCByZW1haW4sIGluIHRoZQotZXhlY3V0aW9uIGNoYWluLiA8YnIvPgotPGJyLz4KLTxpPjxiPk9wdGlvbmFsIEF0dHJpYnV0ZXMgOjwvYj48L2k+PGJyLz4KLTxiPnBoYXNlTGFzdDo8L2I+IEluZGljYXRlcyB0aGF0IHRoZSBoYW5kbGVyIGlzIHRoZSBsYXN0IGhhbmRsZXIgb2YgdGhlCi1waGFzZS48YnIvPgotPGI+cGhhc2VGaXJzdDo8L2I+IEluZGljYXRlIHRoYXQgdGhlIGhhbmRsZXIgaXMgdGhlIGZpcnN0IGhhbmRsZXIgb2YgdGhlCi1waGFzZS48YnIvPgotPGI+YmVmb3JlIDo8L2I+IEluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGhhbmRsZXIgc2hvdWxkIGJlIGludm9rZWQgYmVmb3JlCi10aGUgaGFuZGxlciBzcGVjaWZpZWQgYnkgdGhlIGJlZm9yZSBoYW5kbGVyPGJyLz4KLTxiPmFmdGVyOjwvYj4gSW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgaGFuZGxlciBzaG91bGQgYmUgaW52b2tlZCBhZnRlciB0aGUKLWhhbmRsZXIgc3BlY2lmaWVkIGJ5IHRoZSBhZnRlciBoYW5kbGVyPGJyLz4KLTwvcD4KLQotPHA+PGJyLz4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9jbHVzdGVyaW5nLWd1aWRlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9jbHVzdGVyaW5nLWd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxNWEyMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvY2x1c3RlcmluZy1ndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+Ci08dGl0bGU+QXhpczIgQ2x1c3RlcmluZyBTdXBwb3J0PC90aXRsZT4KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotbWVkaWE9ImFsbCIgLz4KLTwvaGVhZD4KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotCi08IS0tIEludHJvZHVjdGlvbiBQYXJhIC0tPgotPGgxPkF4aXMyIENsdXN0ZXJpbmcgU3VwcG9ydDwvaDE+Ci08cD5BcmUgeW91IGludGVyZXN0ZWQgaW4gaW1wcm92aW5nIFNjYWxhYmlsaXR5IGFuZCBIaWdoIEF2YWlsYWJpbGl0eSBvZiB5b3VyIFdlYiBTZXJ2aWNlcz88L3A+Ci08cD5BeGlzMiAxLjQgcHJvdmlkZXMgZXhwZXJpbWVudGFsIGNsdXN0ZXJpbmcgc3VwcG9ydCB0byBhZGQgPGI+PGk+U2NhbGFiaWxpdHksIEZhaWxvdmVyIGFuZCBIaWdoIEF2YWlsYWJpbGl0eTwvaT48L2I+IHRvIHlvdXIgV2ViIFNlcnZpY2VzLgotVGhpcyBndWlkZSB3aWxsIGV4cGxhaW4gdGhlIGV4dGVudCBvZiBjbHVzdGVyaW5nIHN1cHBvcnQgYW5kIGl0J3MgdGhlIGN1cnJlbnQgbGltaXRhdGlvbnMuCi1JdCBhbHNvIGhpZ2hsaWdodHMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoZXMgdXNpbmcgZXhhbXBsZXMuPC9wPgotPHA+QXhpczIgY2x1c3RlcmluZyBzdXBwb3J0IGNhbiBiZSB1c2VkIGluIHNldmVyYWwgc2NlbmFyaW9zLgotSG93ZXZlciBpdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGUgY3VycmVudCBsaW1pdGF0aW9ucyBhbmQgdGhlIHJpc2tzL2ltcGFjdHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggc2NlbmFyaW8uCi08L3A+Ci0KLTwhLS0gQ29udGVudCBtZW51IC0tPgotPGgyPkNvbnRlbnQ8L2gyPgotPHVsPgotPGxpPjxhIGhyZWY9IiNpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNzY2FsYWJpbGl0eSI+U2NhbGFiaWxpdHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZmFpbG92ZXIiPkZhaWxvdmVyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2hhIj5IaWdoIEF2YWlsYWJpbGl0eTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNzdGF0ZWxlc3Nfd2Vic2VydmljZXMiPkNsdXN0ZXJpbmcgZm9yIFN0YXRlbGVzcyBXZWIgU2VydmljZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc3RhdGVmdWwgV2ViIFNlcnZpY2VzIj5DbHVzdGVyaW5nIGZvciBTdGF0ZWZ1bCBXZWIgU2VydmljZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjY29uZmlnIj5Db25maWd1cmluZyBBeGlzMiB0byBhZGQgQ2x1c3RlcmluZyBTdXBwb3J0PC9hPjwvbGk+Ci0KLTxsaT48YSBocmVmPSIjc2NhbGFiaWxpdHlfc3RhdGVsZXNzX2V4YW1wbGUiPkV4YW1wbGUgMTogU2NhbGFiaWxpdHkgYW5kIEhBIHdpdGggU3RhdGVsZXNzIFdlYiBTZXJ2aWNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNmYWlsb3Zlcl9zdGF0ZWZ1bF9leGFtcGxlIj5FeGFtcGxlIDI6IEZhaWxvdmVyIGZvciBTdGF0ZWZ1bCBXZWIgU2VydmljZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc2NhbGFiaWxpdHlfc3RhdGVmdWxfZXhhbXBsZSI+RXhhbXBsZSAzOiBTY2FsYWJpbGl0eSBhbmQgSEEgd2l0aCBTdGF0ZWZ1bCBXZWIgU2VydmljZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjc3VtbWFyeSI+U3VtbWFyeTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNmdXJ0aGVyc3R1ZHkiPkZvciBGdXJ0aGVyIFN0dWR5PC9hPjwvbGk+Ci08L3VsPgotCi08IS0tIEludHJvIC0tPgotPGEgbmFtZT0iaW50cm9kdWN0aW9uIiBpZD0iaW50cm9kdWN0aW9uIj48L2E+Ci08aDI+SW50cm9kdWN0aW9uPC9oMj4KLTxwPkluIHRoZSBjb250ZXh0IG9mIEF4aXMyIGNsdXN0ZXJpbmcsIGEgbm9kZSBpcyBkZWZpbmVkIGFzIGEgc2VwYXJhdGUgcHJvY2VzcyB3aXRoIGEgdW5pcXVlIHBvcnQgbnVtYmVyIHdoZXJlIGl0IGxpc3RlbnMgZm9yIHJlcXVlc3RzIG9uIGEgZ2l2ZW4gdHJhbnNwb3J0IC4gQSBwaHlzaWNhbCBtYWNoaW5lIGNhbiBjb250YWluIG1vcmUgdGhhbiBvbmUgbm9kZS48L3A+Ci0KLTwhLS0gU2NhbGFiaWxpdHkgLS0+Ci08YSBuYW1lPSJzY2FsYWJpbGl0eSIgaWQ9InNjYWxhYmlsaXR5Ij48L2E+Ci08aDI+U2NhbGFiaWxpdHk8L2gyPgotPHA+SW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIHNhbWUgbGV2ZWwgb2Ygc2VydmljZWFiaWxpdHkgKFFvUykgZHVyaW5nIGFuIGluY3JlYXNlIGluIGxvYWQgeW91IG5lZWQgdGhlIGFiaWxpdHkgdG8gc2NhbGUuCi1BeGlzMiBwcm92aWRlcyByZXBsaWNhdGlvbiBzdXBwb3J0IHRvIHNjYWxlIGhvcml6b250YWxseS4gVGhhdCBpcywgeW91IGNhbiBkZXBsb3kgdGhlIHNhbWUgc2VydmljZSBpbiBtb3JlIHRoYW4gb25lIG5vZGUgdG8gc2hhcmUgdGhlIHdvcmsgbG9hZCwgdGhlcmVieSBpbmNyZWFzaW5nIG9yIG1haW50YWluaW5nIHRoZSBzYW1lIGxldmVsIG9mIHNlcnZpY2VhYmlsaXR5ICh0aHJvdWdocHV0IGV0YykuPC9wPgotCi08IS0tIEZhaWxvdmVyIC0tPgotPGEgbmFtZT0iZmFpbG92ZXIiIGlkPSJmYWlsb3ZlciI+PC9hPgotPGgyPkZhaWxvdmVyPC9oMj4KLTxwPkF4aXMyIHByb3ZpZGVzIGV4Y2VsbGVudCBzdXBwb3J0IGZvciBGYWlsb3ZlciBieSByZXBsaWNhdGluZyB0byBiYWNrdXAgbm9kZShzKS4gCi1JZiB5b3UgZGVwbG95IHlvdXIgU3RhdGVmdWwgV2ViIFNlcnZpY2VzIGluIHRoaXMgbW9kZSwgeW91IGNhbiBkZXNpZ25hdGUgMS0yIGJhY2t1cHMgYW5kIHJlcGxpY2F0ZSBzdGF0ZS4gCi1JbiB0aGUgZXZlbnQgdGhlIHByaW1hcnkgbm9kZSBmYWlscywgdGhlIGNsaWVudHMgY2FuIHN3aXRjaCB0byBvbmUgb2YgdGhlIGJhY2t1cHMuIAotSWYgeW91IHVzZSBTeW5hcHNlIHdpdGggdGhlIEZhaWxvdmVyIG1lZGlhdG9yIHlvdSBjYW4gcHJvdmlkZSB0cmFuc3BhcmVudCBGYWlsb3Zlci48L3A+Ci0KLTwhLS0gSEEgLS0+Ci08YSBuYW1lPSJoYSIgaWQ9ImhhIj48L2E+Ci08aDI+SGlnaCBBdmFpbGFiaWxpdHk8L2gyPgotPHA+WW91IGNhbiBpbXByb3ZlIHRoZSBhdmFpbGFiaWxpdHkgb2YgeW91ciBXZWIgU2VydmljZSBieSB1c2luZyB0aGUgZm9sbG93aW5nIEF4aXMyIGZ1bmN0aW9uYWxpdHkuIAotPHVsPgotPGxpPjxiPkZhaWxvdmVyPC9iPiBzdXBwb3J0IHdpbGwgZW5zdXJlIHRoYXQgYSBjbGllbnQgd2lsbCBjb250aW51ZWQgYmUgc2VydmVkLCB3aXRob3V0IGFueSBpbnRlcnJ1cHRpb24gZHVlIHRvIGEgbm9kZSBmYWlsdXJlLjwvbGk+Ci08bGk+PGI+U2NhbGFiaWxpdHk8L2I+IHN1cHBvcnQgd2lsbCBlbnN1cmUgdGhhdCB5b3VyIHNlcnZpY2VzIGNhbiBtYWludGFpbiB0aGUgc2FtZSBsZXZlbCBvZiBzZXJ2aWNlYWJpbGl0eS9hdmFpbGFiaWxpdHkgKFFvUykgaW4gaW5jcmVhc2VkIGxvYWQgY29uZGl0aW9ucy48L2xpPgotPGxpPjxiPkhvdCBEZXBsb3k8L2I+IGZlYXR1cmUgZW5zdXJlcyB0aGF0IHlvdSBjb3VsZCBkZXBsb3kgbmV3IHNlcnZpY2VzIHdpdGhvdXQgc2h1dHRpbmcgZG93biB5b3VyIGV4aXN0aW5nIHNlcnZpY2VzLjwvbGk+Ci08L3VsPgotPC9wPgotCi08IS0tIFN0YXRlbGVzcyBXZWIgU2VydmljZXMgLS0+Ci08YSBuYW1lPSJzdGF0ZWxlc3Nfd2Vic2VydmljZXMiIGlkPSJzdGF0ZWxlc3Nfd2Vic2VydmljZXMiPjwvYT4KLTxoMj5DbHVzdGVyaW5nIGZvciBTdGF0ZWxlc3MgV2ViIFNlcnZpY2VzPC9oMj4KLTxwPlRoaXMgaXMgdGhlIHNpbXBsZXN0IHVzZSBjYXNlLiAKLUlmIHlvdXIgV2ViIFNlcnZpY2UgZG9lcyBub3Qgc3RvcmUgYW55IHN0YXRlIGluIHRoZSBjb250ZXh0IGhpZXJhcmNoeSB0aGVuIHlvdSBjb3VsZCBkZXBsb3kgeW91ciBzZXJ2aWNlIGluICJuIiBudW1iZXIgb2Ygbm9kZXMuIFRvIGVuc3VyZSBpZGVudGljYWwgY29uZmlndXJhdGlvbiBmb3IgeW91ciBzZXJ2aWNlcywgeW91IGNhbiBsb2FkIGZyb20gYSBjZW50cmFsIHJlcG9zaXRvcnkgdXNpbmcgdGhlIFVSTEJhc2VkQXhpc0NvbmZpZ3VyYXRvci4gVGhpcyBpcyBub3QgYSBtdXN0LCBidXQgaXQgbWFrZXMgbWFuYWdlbWVudCBvZiB0aGUgY2x1c3RlciBlYXN5IGFuZCBsZXNzIGVycm9yIHByb25lLjwvcD4KLQotPHA+U2luY2UgaXQgaXMgc3RhdGVsZXNzIG5vIGV4cGxpY2l0IHJlcGxpY2F0aW9uIGlzIG5lZWRlZC4gSWYgYSBub2RlIGZhaWxzIGFueSBvdGhlciBub2RlIGluIHRoZSBjbHVzdGVyIGNhbiB0YWtlIG92ZXIuIFlvdSBjYW4gdXNlIGEgbG9hZCBiYWxhbmNlciB0byBkaXJlY3QgcmVxdWVzdHMgYmFzZWQgb24gYSBwYXJ0aWN1bGFyIGFsZ29yaXRobSAoRXg6IFJvdW5kIFJvYmluLCBXZWlnaHQgYmFzZWQsIEFmZmluaXR5IGJhc2VkKS4gWW91IGNhbiBpbmNyZWFzZSB0aGUgbm8gb2Ygbm9kZXMgdG8gaGFuZGxlIHNjYWxhYmlsaXR5ICh0byBzY2FsZSB2ZXJ0aWNhbGx5KSB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBvdmVyaGVhZCBvZiByZXBsaWNhdGlvbiBhcyB0aGUgc2VydmljZXMgYXJlIHN0YXRlbGVzczwvcD4KLQotPCEtLSBTdGF0ZWZ1bCBXZWIgU2VydmljZXMgLS0+Ci08YSBuYW1lPSJzdGF0ZWZ1bF93ZWJzZXJ2aWNlcyIgaWQ9InN0YXRlZnVsX3dlYnNlcnZpY2VzIj48L2E+Ci08aDI+Q2x1c3RlcmluZyBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzPC9oMj4KLTxwPlRoaXMgaXMgYSBtb3JlIGNvbXBsaWNhdGVkIHVzZSBjYXNlIHdoZXJlIHlvdXIgV2ViIFNlcnZpY2UgbmVlZHMgdG8gc3RvcmUgc3RhdGUgaW4gdGhlIGNvbnRleHQgaGllcmFyY2h5LiBFYWNoIFdlYiBTZXJ2aWNlIGluc3RhbmNlIChkZXBsb3llZCBpbiBzZXBhcmF0ZSBub2Rlcykgd2lsbCBuZWVkIHRvIHNoYXJlIHN0YXRlIGFtb25nIHRoZW1zZWx2ZXMuIEF4aXMyIHByb3ZpZGVzIHJlcGxpY2F0aW9uIHRvIHN1cHBvcnQgc2hhcmluZyBvZiBzdGF0ZSBhbW9uZyBzZXJ2aWNlcy48L3A+Ci0KLTxwPkhvd2V2ZXIsIGlmIG1vcmUgdGhhbiBvbmUgbm9kZSB0cmllcyB0byB1cGRhdGUgdGhlIHNhbWUgc3RhdGUgaW4gdGhlIGNvbnRleHQgaGllcmFyY2h5LCBjb25mbGljdHMgd2lsbCBhcmlzZSBhbmQgdGhlIGludGVncml0eSBvZiB5b3VyIGRhdGEgd2lsbCBiZSBjb21wcm9taXNlZC4gTm93IHlvdXIgY2x1c3RlciB3aWxsIGhhdmUgaW5jb25zaXN0ZW50IHN0YXRlLiBUaGlzIGNhbiBiZSBhdm9pZGVkIHVzaW5nIGEgbG9ja2luZyBtZWNoYW5pc20uIEhvd2V2ZXIgQXhpczIgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgaXQgeWV0LjwvcD4KLQotPHA+SWYgdGhpcyBzaGFyZWQgc3RhdGUgaXMgcmVhZCBtb3JlIGZyZXF1ZW50bHkgYW5kIHVwZGF0ZWQgcmFyZWx5IHRoZSBwcm9iYWJpbGl0eSBvZiBjb25mbGljdHMgZGVjcmVhc2UuIFlvdSBtYXkgdXNlIEF4aXMyIGluIHRoZSBhYm92ZSB1c2UgY2FzZSBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzIGJhc2VkIG9uIHlvdXIgZGlzY3JldGlvbi4gSG93ZXZlciBpdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0IHRoZXJlIGNhbiBiZSBjb25mbGljdHMuPGk+PGI+SWYgeW91IGhhdmUgZnJlcXVlbnQgd3JpdGVzIGl0IGlzIG5vdCBhZHZpc2FibGUgdG8gdXNlIEF4aXMyIHVudGlsIHdlIGludHJvZHVjZSBsb2NraW5nIHN1cHBvcnQ8L2I+PC9pPjwvcD4KLQotPHA+UGxlYXNlIG5vdGUgdGhpcyB3YXJuaW5nIGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgZm9sbG93aW5nIHVzZSBjYXNlcy4KLTx1bD4KLTxsaT5Zb3VyIFNlcnZpY2UgaXMgZGVwbG95ZWQgaW4gQXBwbGljYXRpb24gU2NvcGU8L2xpPgotPGxpPllvdSBzdG9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgU2VydmljZUdyb3VwQ29udGV4dCAoaXJyZXNwZWN0aXZlIG9mIHlvdXIgc2NvcGUpPC9saT4KLTwvdWw+Ci08L3A+Ci0KLTxwPllvdSBtYXkgc2FmZWx5IHVzZSBzZXJ2aWNlcyBpbiAic29hcHNlc3Npb24iIHNjb3BlIHByb3ZpZGVkIHlvdSA8aT48Yj5kb24ndCBtb2RpZnkgKG9yIG1vZGlmeSBhdCBhbGwpIHN0YXRlIGluIFNlcnZpY2VHcm91cENvbnRleHQgZnJlcXVlbnRseTwvYj48L2k+LiBJbiBzb2FwLXNlc3Npb24gdGhlIHNlcnZpY2UgY29udGV4dCBpcyBleGNsdXNpdmUgdG8gdGhlIGNsaWVudCB3aG8gb3ducyB0aGUgc2Vzc2lvbi4gVGhlcmVmb3JlIG9ubHkgdGhhdCBjbGllbnQgY2FuIG1vZGlmeSBzdGF0ZS4gQSBjb25mbGljdCBtaWdodCBhcmlzZSBpZiB0aGUgc2FtZSBjbGllbnQgdHJpZXMgdG8gYWNjZXNzIHRoZSBzYW1lIHNlcnZpY2UgaW4gdHdvIGRpZmZlcmVudCBub2RlcyBzaW11bHRhbmVvdXNseSB3aGljaCBoYXBwZW5zIHRvIG1vZGlmeSB0aGUgc2FtZSBzdGF0ZS4gSG93ZXZlciB0aGlzIGlzIHJhcmUsIGJ1dCBtaWdodCBhcmlzZSBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGxvYWQgYmFsYW5jZXIgb3IgdGhlIGNsaWVudC4gSWYgeW91IHVzZSBTdGlja3kgc2Vzc2lvbnMsIGl0IHdpbGwgZW5zdXJlIHRoYXQgc3RhdGUgd2lsbCBiZSBjaGFuZ2VkIGluIG9uZSBub2RlIG9ubHkgYnkgZGlyZWN0aW5nIGFsbCByZXF1ZXN0cyBieSB0aGUgc2FtZSBjbGllbnQgdG8gdGhlIHNhbWUgbm9kZS4gVGhpcyBpcyB0aGUgc2FmZXN0IHdheSB0byB1c2UgQXhpczIgY2x1c3RlcmluZyBzdXBwb3J0IGZvciBTdGF0ZWZ1bCBXZWIgU2VydmljZXMgdG8gYWNoZWl2ZSBzY2FsYWJpbGl0eS4KLTwvcD4KLQotPCEtLSBDb25maWd1cmluZyBBeGlzMiB0byBhZGQgQ2x1c3RlcmluZyBzdXBwb3J0IC0tPgotCi08YSBuYW1lPSJjb25maWciIGlkPSJjb25maWciPjwvYT4KLTxoMj5Db25maWd1cmluZyBBeGlzMiB0byBhZGQgQ2x1c3RlcmluZyBTdXBwb3J0PC9oMj4KLTxwPllvdSBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIHNuaXBwZXQgdG8geW91ciBheGlzMi54bWw8L3A+Ci08cHJlPgotICAgJmx0O2NsdXN0ZXIgY2xhc3M9JnF1b3Q7b3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLnRyaWJlcy5UcmliZXNDbHVzdGVyTWFuYWdlciZxdW90OyZndDsKLSAgICAgJmx0O2NvbnRleHRNYW5hZ2VyIGNsYXNzPSZxdW90O29yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlciZxdW90OyZndDsKLSAgICAgICAgJmx0O2xpc3RlbmVyIGNsYXNzPSZxdW90O29yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O3JlcGxpY2F0aW9uJmd0OwotICAgICAgICAgICAgJmx0O2RlZmF1bHRzJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7bG9jYWxfKiZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtMT0NBTF8qJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDsvZGVmYXVsdHMmZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y29udGV4dCBjbGFzcz0mcXVvdDtvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtTZXF1ZW5jZVByb3BlcnR5QmVhbk1hcCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtOZXh0TXNnQmVhbk1hcCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtSZXRyYW5zbWl0dGVyQmVhbk1hcCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtTdG9yYWdlTWFwQmVhbk1hcCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtDcmVhdGVTZXF1ZW5jZUJlYW5NYXAmcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Q29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtDb250YWluZXJNYW5hZ2VkJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDsvY29udGV4dCZndDsKLSAgICAgICAgICAgICZsdDtjb250ZXh0IGNsYXNzPSZxdW90O29yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7bXkuc2FuZGVzaGEuKiZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2NvbnRleHQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y29udGV4dCBjbGFzcz0mcXVvdDtvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDtteS5zYW5kZXNoYS4qJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDsvY29udGV4dCZndDsKLSAgICAgICAgJmx0Oy9yZXBsaWNhdGlvbiZndDsKLSAgICAgJmx0Oy9jb250ZXh0TWFuYWdlciZndDsKLSAgICZsdDsvY2x1c3RlciZndDsKLTwvcHJlPgotPHA+VGhlIGV4Y2x1ZGUgdGFnIHRlbGxzIHRoZSBzeXN0ZW0gdG8gYXZvaWQgcmVwbGljYXRpbmcgdGhhdCBwYXJ0aWN1bGFyIHByb3BlcnR5LiBUaGlzIGlzIGEgdXNlZnVsCi1mZWF0dXJlIGFzIHlvdSB3b3VsZCBuZWVkIHRvIGhhdmUgcHJvcGVydGllcyB0aGF0IGlzIG5vZGUgc3BlY2lmaWMgb25seS4gCi1UaGUgZGVmYXVsdCBjb25maWcgaW4gYXhpczIgd2lsbCBoYXZlIGFsbCBwcm9wZXJ0aWVzIHRoZSBheGlzMiBzeXN0ZW0gZG9lc24ndCB3YW50IHRvIHJlcGxpY2F0ZS4gV2ViIFNlcnZpY2UgZGV2ZWxvcGVycyBjYW4gYWxzbyB1c2UgdGhpcyB0byBmaWx0ZXIgb3V0IHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUgbG9jYWwgb25seS4KLTwvcD4KLQotPCEtLSBFeGFtcGxlMSBTY2FsYWJpbGl0eSAmIEhBIHdpdGggU3RhdGVsZXNzIFdlYiBTZXJ2aWNlIC0tPgotPGEgbmFtZT0ic2NhbGFiaWxpdHlfc3RhdGVsZXNzX2V4YW1wbGUiIGlkPSJzY2FsYWJpbGl0eV9zdGF0ZWxlc3NfZXhhbXBsZSI+PC9hPgotPGgyPkV4YW1wbGUgMTogU2NhbGFiaWxpdHkgYW5kIEhBIHdpdGggU3RhdGVsZXNzIFdlYiBTZXJ2aWNlczwvaDI+Ci08cD5UaGUgZm9sbG93aW5nIGlzIGEgZ29vZCBleGFtcGxlIGZvciBkZXBsb3lpbmcgYSBTdGF0ZWxlc3MgV2ViIFNlcnZpY2UgZm9yIFNjYWxhYmlsaXR5IGFuZCBIaWdoIEF2YWlsYWJpbGl0eS4KLVRoZSBmb2xsb3dpbmcgc2VydmljZSBjYW4gYmUgZGVwbG95ZWQgaW4gImFwcGxpY2F0aW9uIiBzY29wZSBpbiAibiIgbm9kZXMgdXNpbmcgYSBjZW50cmFsIHJlcG9zaXRvcnkuIAotT25jZSBzdGF0ZSBpcyBsb2FkZWQgYnkgYSBwYXJ0aWN1bGFyIG5vZGUgaXQgd2lsbCBiZSBzaGFyZWQgYnkgb3RoZXIgbm9kZXMgYXMgdGhlIGNvbmZpZyBjb250ZXh0IHdpbGwgcmVwbGljYXRlIHRoZSBkYXRhLgotRXZlbiBpZiB0d28gbm9kZXMgbG9hZCB0aGUgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLCB0aGVyZSB3YW50IGJlIGFueSBjb25mbGljdHMgYXMgaXQgaXMgdGhlIHNhbWUgc2V0IG9mIGRhdGEuCi0oQWxsIG5vZGVzIHNob3VsZCBzeW5jaHJvbml6ZSB0aGVpciBjbG9ja3MgdXNpbmcgYSB0aW1lIHNlcnZlciB0byBhdm9pZCBsb2FkaW5nIGRpZmZlcmVudCBzZXRzIG9mIGRhdGEpPC9wPgotCi08cD5Gb3IgdGhlIHNha2Ugb2YgdGhpcyBleGFtcGxlIHdlIGFzc3VtZSByZXBsaWNhdGlvbiBpcyBjaGVhcGVyIHRoYW4gcXVlcnlpbmcgdGhlIGRhdGFiYXNlLgotU28gb25jZSBxdWVyaWVkIGl0IHdpbGwgYmUgcmVwbGljYXRlZCB0byB0aGUgY2x1c3RlcjwvcD4KLTxwcmU+Ci0vKioKLSAqIFRoaXMgU2VydmljZSBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIHRoZSB0b3AgNQotICogc3RvY2tzIGZvciB0aGUgZGF5LCB3ZWVrIG9yIHF1YXJ0ZXIKLSAqLwotcHVibGljIGNsYXNzIFRvcDVTdG9ja1NlcnZpY2UKLXsKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VG9wNVN0b2Nrc0ZvclRvZGF5KCkKLQl7Ci0JCS8vIElmIGNhY2hlIGlzIG51bGwgb3IgaW52YWxpZCBmZXRjaCBpdCBmcm9tIGRhdGEgYmFzZQotCQlDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0JCQotCQlTdHJpbmdbXSAgc3ltYm9scyA9IChTdHJpbmdbXSljb25maWdDb250ZXh0LmdldFByb3BlcnR5KFRPUDVfVE9EQVkpOwotCQlpZiAoIWNoZWNrVmFsaWRpdHkoY29uZmlnQ29udGV4dC5nZXRQcm9wZXJ0eShUT1A1X1RPREFZX0xPQURfVElNRSkpKQotICAgICAgICAgICAgICAgIHsKLQkJICAgIHN5bWJvbHMgPSBsb2FkRnJvbURhdGFiYXNlKFRPUDVfVE9EQVkpOwotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LnNldFByb3BlcnR5KFRPUDVfVE9EQVksc3ltYm9scyk7Ci0JCSAgICBjb25maWdDb250ZXh0LnNldFByb3BlcnR5KFRPUDVfVE9EQVlfTE9BRF9USU1FLG5ldyBqYXZhLnV0aWwuRGF0ZSgpKTsgCSAKLSAgICAgICAgICAgICAgICB9IAotCQkKLQkJcmV0dXJuIHN5bWJvbHM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRUb3A1U3RvY2tzRm9yVGhlV2VlaygpCi0JewotCQkgLy8gSWYgY2FjaGUgaXMgbnVsbCBvciBpbnZhbGlkIGZldGNoIGl0IGZyb20gZGF0YSBiYXNlCi0JCS4uLi4uLi4uLi4uLi4KLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFRvcDVTdG9ja3NGb3JUaGVRdWFydGVyKCkKLQl7Ci0JCS8vIElmIGNhY2hlIGlzIG51bGwgb3IgaW52YWxpZCBmZXRjaCBpdCBmcm9tIGRhdGEgYmFzZQotICAgICAgICAgICAgICAgIC4uLi4uLi4uLi4uLgotCX0KLX0KLTwvcHJlPgotCi08IS0tIEV4YW1wbGUyIEZhaWxvdmVyIGZvciBTdGF0ZWZ1bCBXZWIgU2VydmljZSAtLT4KLTxhIG5hbWU9ImZhaWxvdmVyX3N0YXRlZnVsX2V4YW1wbGUiIGlkPSJmYWlsb3Zlcl9zdGF0ZWZ1bF9leGFtcGxlIj48L2E+Ci08aDI+RXhhbXBsZSAyOiBGYWlsb3ZlciBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzPC9oMj4KLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgRmFpbG92ZXIgc3VwcG9ydCBieSByZXBsaWNhdGluZyBzdGF0ZSBpbiBhIHNlcnZpY2UgZGVwbG95ZWQgaW4gInNvYXBzZXNzaW9uIiBzY29wZS4KLVlvdSBjYW4gZGVwbG95IHRoZSBzZXJ2aWNlIGluIDIgbm9kZXMuIFRoZW4gcG9pbnQgYSBjbGllbnQgdG8gdGhlIGZpcnN0IG5vZGUgYW5kIGFkZCBhIGZldyBpdGVtcyB0byB0aGUgc2hvcHBpbmcgY2FydC4KLUFzc3VtaW5nIHRoZSBwcmltYXJ5IG5vZGUgaGFzIGNyYXNoZWQsIHBvaW50IHRoZSBjbGllbnQgdG8gdGhlIGJhY2t1cCBub2RlLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gY2hlY2tvdXQgdGhlIGNhcnQgd2l0aCB0aGUgaXRlbXMgeW91IGFkZGVkIGluIHRoZSBmaXJzdCBub2RlLjwvcD4KLQotPHByZT4KLXB1YmxpYyBjbGFzcyBTaG9wcGluZ0NhcnQKLXsJCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0hPUFBJTkdfQ0FSVCA9ICJTSE9QUElOR19DQVJUIjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVNDT1VOVCA9ICJESVNDT1VOVCI7Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlU2Vzc2lvbigpCi0JewotCQlMaXN0Jmx0O0l0ZW0mZ3Q7IGNhcnQgPSBuZXcgQXJyYXlMaXN0Jmx0O0l0ZW0mZ3Q7KCk7Ci0JCVNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0JCXNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KFNIT1BQSU5HX0NBUlQsIGNhcnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRJdGVtKEl0ZW0gaXRlbSkKLQl7Ci0JCVNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0JCUxpc3QmbHQ7SXRlbSZndDsgY2FydCA9IChMaXN0Jmx0O0l0ZW0mZ3Q7KXNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KFNIT1BQSU5HX0NBUlQpOwotCQljYXJ0LmFkZChpdGVtKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSXRlbShJdGVtIGl0ZW0pCi0JewotCQlTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCQlMaXN0Jmx0O0l0ZW0mZ3Q7IGNhcnQgPSAoTGlzdCZsdDtJdGVtJmd0OylzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShTSE9QUElOR19DQVJUKTsKLQkJY2FydC5yZW1vdmUoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyBkb3VibGUgY2hlY2tvdXQoKQotCXsKLQkJU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHQoKTsKLQkJTGlzdCZsdDtJdGVtJmd0OyBjYXJ0ID0gKExpc3QmbHQ7SXRlbSZndDspc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHkoU0hPUFBJTkdfQ0FSVCk7Ci0JCQotCQlkb3VibGUgZGlzY291bnQgPSAoRG91YmxlKXNlcnZpY2VDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoKS5nZXRQcm9wZXJ0eShESVNDT1VOVCk7Ci0JCQotCQlkb3VibGUgdG90YWwgPSAwOwotCQlmb3IgKEl0ZW0gaSA6IGNhcnQpCi0JCXsKLQkJCXRvdGFsID0gdG90YWwgKyBpLmdldFByaWNlKCk7Ci0JCX0KLQkJCi0JCXRvdGFsID0gdG90YWwgLSB0b3RhbCAqIChkaXNjb3VudC8xMDApOwotCQkKLQkJcmV0dXJuIHRvdGFsOwotCX0JCi19Ci08L3ByZT4KLQotPCEtLSBFeGFtcGxlIDMgU2NhbGFiaWxpdHkgJiBIQSB3aXRoIFN0YXRlZnVsIFdlYiBTZXJ2aWNlcyAtLT4KLTxhIG5hbWU9InNjYWxhYmlsaXR5X3N0YXRlZnVsX2V4YW1wbGUiIGlkPSJzY2FsYWJpbGl0eV9zdGF0ZWZ1bF9leGFtcGxlIj48L2E+Ci08aDI+RXhhbXBsZTM6IFNjYWxhYmlsaXR5IGFuZCBIQSB3aXRoIFN0YXRlZnVsIFdlYiBTZXJ2aWNlczwvaDI+Ci08cD5Zb3UgY2FuIGRlcGxveSB0aGUgdGhlIGFib3ZlIFNob3BwaW5nIENhcnQgc2VydmljZSBpbiBzZXZlcmFsIGFjdGl2ZSBub2RlcyAod2l0aCBhIGJhY2t1cChzKSBmb3IgZWFjaCBub2RlKS4gCi1Zb3Ugb25seSByZXBsaWNhdGUgdG8geW91ciBiYWNrdXAgbm9kZXMgZm9yIEZhaWxvdmVyLiBUaGUgbG9hZCBiYWxhbmNlciBzaG91bGQgZW5zdXJlIHN0aWNreSBzZXNzaW9ucy4gCi0gVGhlIHN0cmF0ZWd5IGlzIHRvIHBhcnRpdGlvbiB5b3VyIGxvYWQgYmV0d2VlbiB0aGUgYWN0aXZlIG5vZGVzIHRvIGFjaGlldmUgc2NhbGFiaWxpdHkgYW5kIHJlcGxpY2F0aW9uIHRvIHRoZSBiYWNrdXBzIHRvIGFjaGlldmUgRmFpbG92ZXIuIFRoZXNlIGluIHR1cm4gd2lsbCBpbmNyZWFzZSB0aGUgaGlnaCBhdmFpbGFiaWxpdHkgb2YgeW91ciBzZXJ2aWNlcy4gU2luY2UgdGhlIGFib3ZlIGV4YW1wbGUgZG9lc24ndCB1c2UgU2VydmljZSBHcm91cCBDb250ZXh0IHRvIHdyaXRlIGFueSBzdGF0ZSB0aGVyZSB3YW50IGJlIGFueSBjb25mbGljdHMuPC9wPgotCi08cD5Gb3IgdGhlIHNha2Ugb2YgdGhpcyBleGFtcGxlIHdlIGFzc3VtZSB0aGF0IGFsbCByZWFkIG9ubHkgcHJvcGVydGllcyBmb3IgdGhlIFNlcnZpY2UgR3JvdXAgQ29udGV4dCBpcyBsb2FkZWQgYXQgaW5pdGlhbGl6YXRpb24KLSA8Yj48aT5QbGVhc2Ugbm90ZSB0aGlzIGlzIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaCBmb3IgU3RhdGVmdWwgV2ViIFNlcnZpY2VzIGR1ZSB0byB0aGUgY3VycmVudCBsaW1pdGF0aW9uczwvaT48L2I+Ci08L3A+Ci0KLQotPGEgbmFtZT0ic3VtbWFyeSIgaWQ9InN1bW1hcnkiPjwvYT4KLTxoMj5TdW1tYXJ5PC9oMj4KLTxwPkFwYWNoZSBBeGlzMiBwcm92aWRlcyBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgY2x1c3RlcmluZyB0byBpbXByb3ZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZiB5b3VyIFdlYiBTZXJ2aWNlcy4KLTx1bD4KLTxsaT5TY2FsYWJpbGl0eTwvbGk+Ci08bGk+RmFpbG92ZXI8L2xpPgotPGxpPkhpZ2ggQXZhaWxhYmlsaXR5PC9saT4KLTwvdWw+Ci1JdCBpcyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGUgY3VycmVudCBsaW1pdGF0aW9ucyB3aGVuIGxldmVyYWdpbmcgY2x1c3RlcmluZyBzdXBwb3J0LgotPC9wPgotCi0KLTxhIG5hbWU9ImZ1cnRoZXJzdHVkeSIgaWQ9ImZ1cnRoZXJzdHVkeSI+PC9hPgotPGgyPkZvciBGdXJ0aGVyIFN0dWR5PC9oMj4KLTxwPkFwYWNoZSBBeGlzMi08YSBocmVmPQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvPC9hPjwvcD4KLTxwPkF4aXMyIEFyY2hpdGVjdHVyZS08YSBocmVmPQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWw8L2E+PC9wPgotPHA+SW50cm9kdWN0aW9uIHRvIEFwYWNoZSBBeGlzMi08YSBocmVmPQotImh0dHA6Ly93d3cucmVkaGF0LmNvbS9tYWdhemluZS8wMjFqdWwwNi9mZWF0dXJlcy9hcGFjaGVfYXhpczIvIj5odHRwOi8vd3d3LnJlZGhhdC5jb20vbWFnYXppbmUvMDIxanVsMDYvZmVhdHVyZXMvYXBhY2hlX2F4aXMyLzwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvY29udGVudHMueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvbnRlbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3MWMzYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvY29udGVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPkF4aXMyL0phdmEgQGF4aXMyX3ZlcnNpb25AIERvY3VtZW50YXRpb24gSG9tZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkFwYWNoZSBBeGlzMi9KYXZhIFZlcnNpb24gQGF4aXMyX3ZlcnNpb25AIERvY3VtZW50YXRpb24NCi1JbmRleDwvaDE+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+QXBhY2hlIEF4aXMyLCB0aGUgdGhpcmQgZ2VuZXJhdGlvbiBXZWIgc2VydmljZXMgZW5naW5lIGlzIG1vcmUNCi1lZmZpY2llbnQsIG1vcmUgbW9kdWxhciBhbmQgbW9yZSBYTUwtb3JpZW50ZWQgdGhhbiBpdHMgcHJlZGVjZXNzb3INCi08YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzLyI+QXBhY2hlIEF4aXM8L2E+LiBJdCBpcw0KLWNhcmVmdWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IHRoZSBlYXN5IGFkZGl0aW9uIG9mIHBsdWctaW4gbW9kdWxlcw0KLXRoYXQgZXh0ZW5kIGl0cyBmdW5jdGlvbmFsaXR5IGZvciBmZWF0dXJlcyBzdWNoIGFzIHNlY3VyaXR5IGFuZA0KLWluY3JlYXNlZCByZWxpYWJpbGl0eS48L3A+DQotPHA+QXBhY2hlIEF4aXMyIFZlcnNpb24gQGF4aXMyX3ZlcnNpb25AIGlzIGEgYnVnZml4IHJlbGVhc2UsIGZpeGluZyBzZXZlcmFsDQotcHJvYmxlbXMgaW4gdmVyc2lvbiAxLjUuICBQbGVhc2Ugc2VlIHRoZSByZWxlYXNlIG5vdGVzIGZvciBtb3JlDQotZGV0YWlscy48L3A+DQotPHA+VGhpcyBwYWdlIGRlc2NyaWJlcyBvdXIgbGlzdCBvZiBhdmFpbGFibGUgZG9jdW1lbnRzLjwvcD4NCi08aDI+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZTwvaDI+DQotPHA+WW91IGNhbiBnZXQgc3RhcnRlZCB3aXRoIEF4aXMyIHdpdGggdGhlIGFzc2lzdGFuY2Ugb2YgdGhlDQotZm9sbG93aW5nIGRvY3VtZW50cy4gVGhleSB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBBeGlzMg0KLWRvd25sb2FkLCBpbnN0YWxsYXRpb24gKGJvdGggYXMgYSBzdGFuZGFsb25lIFdlYiBzZXJ2aWNlcyBlbmdpbmUNCi1hbmQgYXMgcGFydCBvZiBhIEoyRUUgY29tcGxpYW50IHNlcnZsZXQgY29udGFpbmVyKSwgYW5kDQotaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byB3cml0ZSBXZWIgc2VydmljZXMgYW5kIFdlYiBzZXJ2aWNlcyBjbGllbnQNCi11c2luZyBBcGFjaGUgQXhpczIuPC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaW50cm8iPkludHJvZHVjdGlvbjwvYT4tIEdpdmVzIHlvdSBhbg0KLWludHJvZHVjdGlvbiB0byB3aGF0IEF4aXMyIGlzLCB0aGUgbGlmZSBjeWNsZSBvZiBhIFdlYiBzZXJ2aWNlcw0KLW1lc3NhZ2UsIGhvdyBBeGlzMiBoYW5kbGVzIFNPQVAgbWVzc2FnZXMgYW5kIGFsc28gaW5jbHVkZXMgYSBiYXNpYw0KLWRlc2NyaXB0aW9uIG9uIEF4aXMyIGRpc3RyaWJ1dGlvbnMsIGFuZCBob3cgQXhpczIgYmVoYXZlcyBhcyBwYXJ0DQotb2YgYSBXZWIgYXBwbGljYXRpb24gb3IgYXMgYSBzdGFuZGFsb25lIGNsaWVudCB0aGF0IGlzIG5vdCBwYXJ0IG9mDQotYSBKMkVFIGFwcGxpY2F0aW9uLjwvbGk+DQotPGxpPjxhIGhyZWY9Imluc3RhbGxhdGlvbmd1aWRlLmh0bWwiPkRvd25sb2FkIGFuZCBJbnN0YWxsYXRpb248L2E+LQ0KLUxpc3RzIHRoZSBkaWZmZXJlbnQgZGlzdHJpYnV0aW9uIHBhY2thZ2VzIG9mZmVyZWQgYnkgQXhpczIgYW5kDQotZ2l2ZXMgaW4tZGVwdGggaW5zdHJ1Y3Rpb25zIG9uIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIHN0YW5kYWxvbmUNCi1tZXRob2QgYW5kIGFzIHBhcnQgb2YgYSBKMkVFIHNlcnZsZXQgY29udGFpbmVyLjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy5odG1sIj5UZXN0aW5nIENsaWVudA0KLUNvZGU8L2E+IC0gVGhlIGJlc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgc3lzdGVtIGlzIHJ1bm5pbmcNCi1BeGlzMiBpcyB0byBpbnN0YWxsIGFuZCB0ZXN0IGJvdGggYSBzZXJ2aWNlIGFuZCBhIGNsaWVudC4gVGhpcw0KLWRvY3VtZW50IGRlc2NyaWJlcyB0aGlzIHByb2Nlc3MgaW4gZWFzeSB0byB1bmRlcnN0YW5kIHN0ZXBzLjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCI+SW50cm9kdWN0aW9uIHRvDQotU2VydmljZXM8L2E+IC0gVGhlIHRlcm0gIldlYiBzZXJ2aWNlcyIgY2FuIGFwcGx5IHRvIGEgbnVtYmVyIG9mDQotZGlmZmVyZW50IHdheXMgb2Ygc2VuZGluZyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aC4gSG93ZXZlciwgdGhpcw0KLWd1aWRlIGZvY3VzZXMgb24gdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBvZiBTT0FQIG1lc3NhZ2VzIGFuZA0KLU1lc3NhZ2UgRXhjaGFuZ2UgUGF0dGVybnMgKE1FUHMpLjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCI+Q3JlYXRpbmcgQ2xpZW50cyBmcm9tDQotV1NETDwvYT4gLSBXaGVuIGl0IGNvbWVzIHRvIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgY2xpZW50LCB5b3UgY2FuDQotZG8gaXQgbWFudWFsbHkgYXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IGRvY3VtZW50LiBIb3dldmVyLCBpbiBtb3N0DQotY2FzZXMsIHlvdSB3aWxsIGhhdmUgYSBXZWIgU2VydmljZSBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkNCi1kZWZpbml0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSBtZXNzYWdlcyB0aGF0IGNsaWVudHMgc2hvdWxkIHNlbmQgYW5kDQotZXhwZWN0IHRvIHJlY2VpdmUuIEF4aXMyIHByb3ZpZGVzIHNldmVyYWwgd2F5cyB0byB1c2UgdGhpcw0KLWRlZmluaXRpb24gdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIGNsaWVudC4gVGhpcyBkb2N1bWVudA0KLWV4cGxhaW5zIGhvdyB0byBjcmVhdGUgYSBjbGllbnQgdXNpbmcgV1NETCBkZWZpbml0aW9ucy48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sIj5CdWlsZGluZyBTZXJ2aWNlcw0KLWZyb20gU2NyYXRjaDwvYT4gLSBOb3cgdGhhdCB5b3Uga25vdyBob3cgdG8gdXNlIEF4aXMyIHRvIGdlbmVyYXRlDQotY2xpZW50cyBmcm9tIFdTREwgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudCBiZWZvcmUsIHRoaXMNCi1kb2N1bWVudCBkaWdzIGEgbGl0dGxlIGRlZXBlciwgc2hvd2luZyB5b3UgaG93IHRvIGNyZWF0ZSBzZXJ2aWNlcywNCi1hbmQgaG93IHRvIGNyZWF0ZSBib3RoIHNlcnZpY2VzIGFuZCBjbGllbnRzICJmcm9tIHNjcmF0Y2giLCBzbyB0bw0KLXNwZWFrLjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+IC0gVGhlIEF4aXMyDQotU3RhbmRhcmQgRGlzdHJpYnV0aW9uIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHNhbXBsZXMgeW91IGNhbiB1c2UgYXMgYQ0KLWd1aWRlIGZvciBpbXBsZW1lbnRpbmcgc3BlY2lmaWMgZmVhdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gVGhlc2UNCi1zZXJ2aWNlcyBhcmUgbGlzdGVkIGluIHRoaXMgZG9jdW1lbnQgYWxvbmcgd2l0aCBiYXNpYyBpbnRyb2R1Y3Rpb25zDQotZm9yIGVhY2ggb25lLjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+Rm9yIEZ1cnRoZXIgU3R1ZHk8L2E+DQotLSBUaGlzIHNlY3Rpb24gbGlzdHMgcmVzb3VyY2UgZG9jdW1lbnRzIGZvciBmdXJ0aGVyIHN0dWR5Lg0KLTx1bD4NCi08bGk+PGEgaHJlZj0icG9qb2d1aWRlLmh0bWwiPlBPSk8gV2ViIFNlcnZpY2VzIHVzaW5nIEFwYWNoZQ0KLUF4aXMyPC9hPi1UaGlzIGd1aWRlIHdpbGwgc2hvdyB5b3UgaG93IHRvIGNyZWF0ZSBhIFBsYWluIE9sZCBKYXZhDQotT2JqZWN0IChQT0pPKSBmb3IgZGVwbG95aW5nIHVzaW5nIEFwYWNoZSBBeGlzMiBvbiBBcGFjaGUgVG9tY2F0Lg0KLVBPSk9zIGFyZSBmYXN0IHRvIGJ1aWxkIGFuZCBlYXN5IHRvIG1haW50YWluLCB3aGljaCBtZWFucyB5b3UnbGwNCi1zYXZlIGEgbG90IG9mIHRpbWUgYnVpbGRpbmcgYW5kIGRlYnVnZ2luZyB5b3VyIGNvZGU8L2xpPg0KLTxsaT48YSBocmVmPSJxdWlja3N0YXJ0Z3VpZGUuaHRtbCI+QXhpczIgUXVpY2sgU3RhcnQgR3VpZGU8L2E+LVRoZQ0KLXB1cnBvc2Ugb2YgdGhpcyBndWlkZSBpcyB0byBnZXQgeW91IHN0YXJ0ZWQgb24gY3JlYXRpbmcgc2VydmljZXMNCi1hbmQgY2xpZW50cyB1c2luZyBBeGlzMiBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiBJdCBkZW1vbnN0cmF0ZXMgaG93DQotdG8gY3JlYXRlIFdlYiBzZXJ2aWNlcyB1c2luZyBhIHZhcmlldHkgb2YgZGlmZmVyZW50DQotdGVjaG5vbG9naWVzLiZsdDsvJmd0OzwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotQWxzbyBzZWUgb3VyIDxhIGhyZWY9Ii4uL2ZhcS5odG1sIj5GQVEgcGFnZTwvYT4gdG8gYW5zd2VyIHRob3NlDQotY29tbW9uIHF1ZXN0aW9ucyBpbiBtaW5kLg0KLTxoMj5Ib3cgVG88L2gyPg0KLTxwPlRoaXMgc2VjdGlvbiBkZWFscyB3aXRoIG1vcmUgYWR2YW5jZWQgdG9waWNzIGluY2x1ZGluZyBBeGlzMg0KLXN1cHBvcnQgZmVhdHVyZXMgc3VjaCBhcyBUcmFuc3BvcnRzLCBBdHRhY2htZW50cywgUGx1Z2dhYmxlIERhdGENCi1CaW5kaW5nLCBTZWN1cml0eSwgYW5kIFJFU1QgV2ViIHNlcnZpY2VzIGluIGRldGFpbC48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ3ZWJhZG1pbmd1aWRlLmh0bWwiPldlYiBBZG1pbmlzdHJhdG9yJ3MgR3VpZGU8L2E+IC0NCi1EZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUgb2YgQXhpczIgV2ViDQotYXBwbGljYXRpb24sIHdoaWNoIHByb3ZpZGVzIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb24gb2YgQXhpczIuPC9saT4NCi08bGk+PGEgaHJlZj0ibWlncmF0aW9uLmh0bWwiPk1pZ3JhdGluZyBmcm9tIEF4aXMgMS54IHRvIEF4aXMgMjwvYT4NCi0tIEd1aWRpbmcgQXhpcyAxLnggdXNlcnMgaW4gdXBncmFkaW5nIHRvIEF4aXMyPC9saT4NCi08bGk+PGEgaHJlZj0iYXBwX3NlcnZlci5odG1sIj5BcHBsaWNhdGlvbiBTZXJ2ZXIgU3BlY2lmaWMNCi1Db25maWd1cmF0aW9uIEd1aWRlPC9hPiAtIFByb3ZpZGVzIGV4dHJhIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24NCi1yZXF1aXJlZCBmb3IgYXBwbGljYXRpb24gc2VydmVycyB0byBydW4gQXhpczIgdG8gaXRzIGZ1bGxlc3QNCi1wb3RlbnRpYWw8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL2F4aW9tL09NVHV0b3JpYWwuaHRtbCI+QVhJT00NCi1UdXRvcmlhbDwvYT4tQW4gaW50cm9kdWN0aW9uIHRvIEF4aXMyJ3MgT2JqZWN0IE1vZGVsPC9saT4NCi08bGk+PGEgaHJlZj0icmVzdC13cy5odG1sIj5SRVNUIFN1cHBvcnQ8L2E+LUludHJvZHVjdGlvbiBvbg0KLVJlcHJlc2VudGF0aW9uYWwgU3RhdGUgVHJhbnNmZXI8L2xpPg0KLTxsaT48YSBocmVmPSJBeGlzMi1ycGMtc3VwcG9ydC5odG1sIj5BeGlzMiBSUEMgU3VwcG9ydDwvYT4gLSBUaGlzDQotZG9jdW1lbnQgdGFsa3MgYWJvdXQgdGhlIEF4aXMyJ3MgUmVtb3RlIFByb2NlZHVyZSBDYWxscyBzdXBwb3J0IGluDQotYSBzZXQgb2YgZWFzeSB0byB1bmRlcnN0YW5kIGltcGxlbWVudGF0aW9uIHN0ZXBzPC9saT4NCi08bGk+PGEgaHJlZj0ibXRvbS1ndWlkZS5odG1sIj5NVE9NIEd1aWRlIC1TZW5kaW5nIEJpbmFyeSBEYXRhIHdpdGgNCi1TT0FQPC9hPiAtIEV4cGxhaW5zIGhvdyB0byBzZW5kIGJpbmFyeSBkYXRhIHVzaW5nIHRoZSBTT0FQIE1lc3NhZ2UNCi1UcmFuc21pc3Npb24gT3B0aW1pemF0aW9uIE1lY2hhbmlzbTwvbGk+DQotPGxpPjxhIGhyZWY9ImF4aXMyY29uZmlnLmh0bWwiPkF4aXMyIENvbmZpZ3VyYXRpb24gR3VpZGU8L2E+IC0NCi1FeHBsYWlucyB0aGUgdGhyZWUgY29uZmlndXJhdGlvbnMgaW4gQXhpczI6IGdsb2JhbCwgc2VydmljZSwgYW5kDQotbW9kdWxlPC9saT4NCi08bGk+PGEgaHJlZj0ic29hcG1vbml0b3ItbW9kdWxlLmh0bWwiPlNPQVAgTW9uaXRvciBIb3ctdG88L2E+IC0gQQ0KLWd1aWRlIG9uIHRoZSB1dGlsaXRpZXMgdXNlZCB0byBtb25pdG9yIHRoZSBTT0FQIG1lc3NhZ2VzIHRoYXQNCi1pbnZva2UgV2ViIHNlcnZpY2VzLCBhbG9uZyB3aXRoIHRoZSByZXN1bHRzIG9mIHRob3NlIG1lc3NhZ2VzPC9saT4NCi08bGk+PGEgaHJlZj0iV1NfcG9saWN5Lmh0bWwiPldlYiBTZXJ2aWNlcyBQb2xpY3kgU3VwcG9ydCBJbg0KLUF4aXMyPC9hPiAtIEludHJvZHVjdGlvbiB0byB0aGUgcm9sZSBvZiBXZWIgc2VydmljZXMgcG9saWN5IGluDQotQXhpczI8L2xpPg0KLTxsaT48YSBocmVmPSJzcHJpbmcuaHRtbCI+U3ByaW5nIEZyYW1ld29yazwvYT4gLSBBIGd1aWRlIG9uIGhvdyB0bw0KLXVzZSBBeGlzMiB3aXRoIHRoZSBTcHJpbmcgRnJhbWV3b3JrPC9saT4NCi08bGk+PGEgaHJlZj0ianNvbl9zdXBwb3J0Lmh0bWwiPkpTT04gU3VwcG9ydDwvYT4gLSBUaGlzIGRvY3VtZW50DQotZXhwbGFpbnMgaG93IHRvIHVzZSBKU09OIHN1cHBvcnQgaW1wbGVtZW50YXRpb24gaW4gQXhpczIuIEluY2x1ZGVzDQotZGV0YWlscyBvbiB0ZXN0IGNhc2VzIGFuZCBzYW1wbGVzPC9saT4NCi08bGk+PGEgaHJlZj0iY29yYmEtZGVwbG95ZXIuaHRtbCI+RXhwb3NpbmcgQ09SQkEgU2VydmljZXMgYXMgV2ViIFNlcnZpY2VzPC9hPiAtIFRoaXMgZ3VpZGUgZXhwbGFpbnMgaG93IHRvIGV4cG9zZSBhIENPUkJBIFNlcnZpY2VzIGFzIGEgV2ViIFNlcnZpY2VzIGluIEF4aXMyDQotdXNpbmcgYW4gZXhhbXBsZTwvbGk+DQotPGxpPjxhIGhyZWY9ImVqYi1wcm92aWRlci5odG1sIj5HdWlkZSB0byB1c2luZyBFSkIgUHJvdmlkZXIgaW4NCi1BeGlzMjwvYT4gLSBUaGlzIGd1aWRlIGV4cGxhaW5zIGhvdyB0byB1c2UgYW4gRUpCIHByb3ZpZGVyIGluIEF4aXMyDQotdXNpbmcgYW4gZXhhbXBsZTwvbGk+DQotPGxpPjxhIGhyZWY9ImNsdXN0ZXJpbmctZ3VpZGUuaHRtbCI+Q2x1c3RlcmluZyBHdWlkZTwvYT4gLSBUaGlzIGd1aWRlIHdpbGwgc2hvdyBob3cgeW91IGNhbiBsZXZlcmFnZSBjbHVzdGVyaW5nIHN1cHBvcnQgdG8gaW1wcm92ZSBTY2FsYWJpbGl0eSwgRmFpbG92ZXIgYW5kIEhpZ2ggQXZhaWxhYmlsaXR5IG9mIHlvdXIgV2ViIFNlcnZpY2VzPC9saT4NCi0NCi08L3VsPg0KLQ0KLTxwPjxzdHJvbmc+RGF0YSBCaW5kaW5nczo8L3N0cm9uZz48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSJhZGIvYWRiLWhvd3RvLmh0bWwiPkFEQiBIb3ctdG88L2E+IC0gQSBndWlkZSBvbiB0aGUNCi1BeGlzMiBEYXRhYmluZGluZyBGcmFtZXdvcmsgKEFEQik8L2xpPg0KLTxsaT48YSBocmVmPSJhZGIvYWRiLWFkdmFuY2VkLmh0bWwiPkFkdmFuY2VkIEFEQiBGcmFtZXdvcmsNCi1GZWF0dXJlczwvYT4gLSBQcm92aWRlcyBhbiBpbnNpZ2h0IGludG8gdGhlIG5ld2x5IGFkZGVkIGFkdmFuY2VkDQotZmVhdHVyZXMgb2YgQURCPC9saT4NCi08bGk+PGEgaHJlZj0iYWRiL2FkYi10d2Vha2luZy5odG1sIj5Ud2Vha2luZyB0aGUgQURCIENvZGUNCi1HZW5lcmF0b3I8L2E+IC0gRXhwbGFpbnMgdGhlIGF2YWlsYWJsZSBtZWNoYW5pc21zIHRvIGV4dGVuZA0KLUFEQjwvbGk+DQotPGxpPjxhIGhyZWY9ImFkYi9hZGItY29kZWdlbi1pbnRlZ3JhdGlvbi5odG1sIj5BREIgSW50ZWdyYXRpb24gd2l0aA0KLUF4aXMyPC9hPiAtIEEgZ3VpZGUgdG8gd3JpdGluZyBhbiBleHRlbnNpb24gdXNpbmcgdGhlIGludGVncmF0b3IgaW4NCi1vcmRlciB0byBpbnRlZ3JhdGUgQURCIHdpdGggQXhpczI8L2xpPg0KLTxsaT48YSBocmVmPSJqaWJ4L2ppYngtY29kZWdlbi1pbnRlZ3JhdGlvbi5odG1sIj5KaUJYIEludGVncmF0aW9uDQotV2l0aCBBeGlzMjwvYT4gLSBBIGd1aWRlIHRvIHVzaW5nIEppQlggd2l0aCBBeGlzMiBpbiBvcmRlciB0bw0KLWV4cG9zZSBleGlzdGluZyBKYXZhIGNvZGUgYXMgYSBXZWIgc2VydmljZSBhbmQgdG8gaW1wbGVtZW50IGENCi1jbGllbnQgZm9yIGFuIGV4aXN0aW5nIFdlYiBzZXJ2aWNlPC9saT4NCi08L3VsPg0KLTxwPjxzdHJvbmc+VHJhbnNwb3J0czo8L3N0cm9uZz48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ0Y3AtdHJhbnNwb3J0Lmh0bWwiPlRDUCBUcmFuc3BvcnQ8L2E+IC0gQSBndWlkZSB0bw0KLXNlbmRpbmcgYW5kIHJlY2VpdmluZyBTT0FQIG1lc3NhZ2VzIHZpYSBUQ1AgaW4gQXhpczI8L2xpPg0KLTxsaT48YT5IVFRQIFRyYW5zcG9ydHM8L2E+IC0gQSBkZXNjcmlwdGlvbiBvbiBIVFRQIHNlbmRlciBhbmQgSFRUUA0KLXJlY2VpdmVyIGluIEF4aXMyPC9saT4NCi08bGk+PGEgaHJlZj0idHJhbnNwb3J0X2hvd3RvLmh0bWwiPldyaXRlIFlvdXIgT3duIEF4aXMyDQotVHJhbnNwb3J0PC9hPiAtIEEgcXVpY2sgYW5kIGVhc3kgZ3VpZGUgdG8gY3JlYXRlIHlvdXIgb3duIEF4aXMyDQotVHJhbnNwb3J0IHByb3RvY29sPC9saT4NCi08L3VsPg0KLTxwPjxzdHJvbmc+QXhpczIgVG9vbHM6PC9zdHJvbmc+PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9Db2RlZ2VuVG9vbFJlZmVyZW5jZS5odG1sIj5Db2RlDQotR2VuZXJhdG9yIFRvb2wgR3VpZGUgZm9yIENvbW1hbmQgTGluZSBhbmQgQW50IFRhc2tzPC9hPiAtIExpc3RzDQotY29tbWFuZCBsaW5lIGFuZCBBbnQgdGFzayByZWZlcmVuY2VzLiBIb3cgdG8gYnVpbGQgYSBmaWxlIHVzaW5nDQotY3VzdG9tIEFudCB0YXNrcyBhbmQgaG93IHRvIGludm9rZSBhIENvZGUgR2VuZXJhdG9yIGZyb20gQW50PC9saT4NCi08bGk+PGEgaHJlZj0NCi0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCI+Q29kZQ0KLUdlbmVyYXRvciBXaXphcmQgR3VpZGUgZm9yIEVjbGlwc2UgUGx1Zy1pbjwvYT4gLSBFeHBsYWlucyB0aGUgdXNhZ2UNCi1vZiB0aGUgY29kZSBnZW5lcmF0b3IgRWNsaXBzZSBwbHVnLWluIGZvciBXU0RMMkphdmEgYW5kL29yDQotSmF2YTJXU0RMIG9wZXJhdGlvbnM8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSIuLi90b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj5TZXJ2aWNlDQotQXJjaGl2ZSBHZW5lcmF0b3IgV2l6YXJkIEd1aWRlIGZvciBFY2xpcHNlIFBsdWctaW48L2E+IC0gRGVzY3JpYmVzDQotdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEVjbGlwc2UgcGx1Z2luIHNlcnZpY2UgYXJjaGl2ZSBnZW5lcmF0b3INCi10b29sPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCI+Q29kZQ0KLUdlbmVyYXRvciBXaXphcmQgR3VpZGUgZm9yIEludGVsbGlKIElERUEgUGx1Zy1pbjwvYT4gLSBBIGd1aWRlIG9uDQotdGhlIHVzYWdlIG9mIHRoZSBJREVBIGNvZGUgZ2VuZXJhdGlvbiBwbHVnLWluIHRvIGNyZWF0ZSBzZXJ2aWNlDQotYXJjaGl2ZXMgYW5kIGdlbmVyYXRlIEphdmEgY2xhc3MgZmlsZXMgZnJvbSBXU0RMIGZpbGVzPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotQUFSIFBsdWctaW4gR3VpZGU8L2E+IC0gQSBndWlkZSB0byBnZW5lcmF0ZSBhbiBBeGlzIDIgc2VydmljZSBmaWxlDQotKEFBUiBmaWxlKSB1c2luZyB0aGUgTWF2ZW4gcGx1Zy1pbi48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSIuLi90b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIj4NCi1NYXZlbjIgSmF2YTJXU0RMIFBsdWctaW4gR3VpZGU8L2E+IC0gQSBndWlkZSB0byB1c2luZyBKYXZhMldTREwNCi1NYXZlbiAyIFBsdWctaW4gdGhhdCB0YWtlcyBhIEphdmEgY2xhc3MgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBhDQotV1NETCwgd2hpY2ggZGVzY3JpYmVzIGEgV2ViIHNlcnZpY2UgZm9yIGludm9raW5nIHRoZSBjbGFzcw0KLW1ldGhvZHM8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSIuLi90b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi5odG1sIj4NCi1NYXZlbjIgV1NETDJDb2RlIFBsdWctaW4gR3VpZGU8L2E+IC0gQSBndWlkZSB0byB1c2luZyB0aGlzIHBsdWdpbg0KLXRoYXQgdGFrZXMgYXMgaW5wdXQgYSBXU0RMIGFuZCBnZW5lcmF0ZXMgY2xpZW50IGFuZCBzZXJ2ZXIgc3R1YnMNCi1mb3IgY2FsbGluZyBvciBpbXBsZW1lbnRpbmcgYSBXZWIgc2VydmljZSBtYXRjaGluZyB0aGUgV1NETC48L2xpPg0KLTwvdWw+DQotPGgyPkFwYWNoZSBBeGlzMiBEZXZlbG9wZXJzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9ImFkdi11c2VyZ3VpZGUuaHRtbCI+QWR2YW5jZWQgVXNlcidzIEd1aWRlPC9hPiAtIEENCi1xdWljayBzdGFydCB1c2VyJ3MgZ3VpZGUgZm9yIG1vcmUgZXhwZXJpZW5jZWQgdXNlcnMgYW5kIGRldmVsb3BlcnMNCi1vbiBob3cgdG8gaW5zdGFsbCwgY3JlYXRlIFdlYiBzZXJ2aWNlcyBhbmQgV2ViIHNlcnZpY2UgY2xpZW50cw0KLXVzaW5nIEF4aXMyLg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPiAtDQotT3V0bGluZXMgdGhlIG92ZXJhbGwgZGlyZWN0aW9uIG9mIHRoZSB1c2VyIGd1aWRlLCB3aXRoIGEgaGlnaCBsZXZlbA0KLWludHJvZHVjdGlvbiBvbiBBeGlzMjwvbGk+DQotPGxpPjxhIGhyZWY9Imluc3RhbGxhdGlvbmd1aWRlLmh0bWwiPkRvd25sb2FkIGFuZCBJbnN0YWxsYXRpb248L2E+DQotLSBMaXN0cyB0aGUgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbiBwYWNrYWdlcyBvZmZlcmVkIGJ5IEF4aXMyLCBhbmQNCi10aGUgaW5zdGFsbGF0aW9ucyBmb3IgdGhlIHN0YW5kYWxvbmUgYW5kIGFzIHBhcnQgb2YgYSBKMkVFIHNlcnZsZXQNCi1jb250YWluZXIgbWV0aG9kcy48L2xpPg0KLTxsaT48YSBocmVmPSJhZHYtdXNlcmd1aWRlLmh0bWwjd3NfY29kZWdlbiI+Q3JlYXRpbmcgYSBuZXcgV2ViDQotU2VydmljZSB3aXRoIENvZGUgR2VuZXJhdGlvbjwvYT4gLSBBeGlzMiBwcm92aWRlcyB0d28gd2F5cyB0bw0KLWNyZWF0ZSBuZXcgV2ViIFNlcnZpY2VzOiB1c2luZyBjb2RlIGdlbmVyYXRpb24gYW5kIFhNTCBiYXNlZA0KLXByaW1hcnkgQVBJcy4gVGhpcyBzZWN0aW9uIGV4cGxhaW5zIGhvdyB0byBzdGFydCBmcm9tIGEgV1NETCwgYW5kDQotY3JlYXRlIGEgbmV3IFNlcnZpY2Ugd2l0aCBjb2RlIGdlbmVyYXRpb248L2xpPg0KLTxsaT48YSBocmVmPSJ4bWxiYXNlZC1zZXJ2ZXIuaHRtbCI+V3JpdGluZyBXZWIgU2VydmljZXMgVXNpbmcNCi1BeGlzMidzIFByaW1hcnkgQVBJczwvYT4gLSBFeHBsYWlucyBob3cgdG8gY3JlYXRlIG5ldyBXZWIgU2VydmljZXMNCi11c2luZyBYTUwgYmFzZWQgcHJpbWFyeSBBUElzPC9saT4NCi08bGk+PGEgaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sI2NsaWVudCI+V3JpdGluZyBhIFdlYiBTZXJ2aWNlDQotQ2xpZW50IHdpdGggQ29kZSBHZW5lcmF0aW9uPC9hPiAtIEF4aXMyIGFsc28gcHJvdmlkZXMgYSBtb3JlDQotY29tcGxleCwgeWV0IHBvd2VyZnVsIFhNTCBiYXNlZCBjbGllbnQgQVBJIHRoYXQgaXMgaW50ZW5kZWQgZm9yDQotYWR2YW5jZWQgdXNlcnMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYSBuZXcgdXNlciB3ZSByZWNvbW1lbmQgdXNpbmcNCi10aGUgY29kZSBnZW5lcmF0aW9uIGFwcHJvYWNoIHByZXNlbnRlZCBiZWxvdzwvbGk+DQotPGxpPjxhIGhyZWY9ImRpaS5odG1sIj5Xcml0aW5nIFdlYiBTZXJ2aWNlIENsaWVudHMgVXNpbmcgQXhpczIncw0KLVByaW1hcnkgQVBJczwvYT4gLSBUaGlzIHNlY3Rpb24gcHJlc2VudHMgY29tcGxleCB5ZXQgcG93ZXJmdWwgWE1MDQotYmFzZWQgY2xpZW50IEFQSXMsIHdoaWNoIGlzIGludGVuZGVkIGZvciBhZHZhbmNlZCB1c2VycyB0byB3cml0ZQ0KLVdlYiBzZXJ2aWNlcyBjbGllbnRzPC9saT4NCi08bGk+PGEgaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sI2NvbmZpZyI+Q29uZmlndXJpbmcgQXhpczI8L2E+IC0NCi1BeGlzMiBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIGEgcmVwb3NpdG9yeSBhbmQgc3RhbmRhcmQgYXJjaGl2ZQ0KLWZvcm1hdHMuIEhlcmUgeW91IHdpbGwgZmluZCBkZXRhaWxzIG9uIGhvdyB0byBjb25maWd1cmUgQXhpczIuIFlvdQ0KLXdpbGwgYWxzbyBmaW5kIHJlZmVyZW5jZSBkb2N1bWVudHMgdGhhdCBsZWFkIHRvIGdyZWF0ZXIgZGV0YWlsIGluDQotdGhpcyBhcmVhLjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJBeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWwiPkF4aXMyIEFyY2hpdGVjdHVyZQ0KLUd1aWRlPC9hPiAtIEludHJvZHVjdGlvbiB0byBBeGlzMidzIG1vZHVsYXIgYXJjaGl0ZWN0dXJlPC9saT4NCi08IS0tPGxpPjxhIGhyZWY9ImFwaS9pbmRleC5odG1sIj5PbmxpbmUgSmF2YSBEb2NzPC9hPi1KYXZhIEFQSQ0KLSAgZG9jdW1lbnRhdGlvbjwvbGk+LS0+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvYXBpL2luZGV4Lmh0bWwiPk9ubGluZQ0KLUphdmEgRG9jczwvYT4gLSBKYXZhIEFQSSBkb2N1bWVudGF0aW9uPC9saT4NCi08bGk+PGEgaHJlZj0iLi4vcmVmTGliLmh0bWwiPlJlZmVyZW5jZSBMaWJyYXJ5PC9hPiAtIFRoaXMgZG9jdW1lbnQNCi1wcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGRldmVsb3BlcnMgb24gV1MtKg0KLXNwZWNpZmljYXRpb25zLCBKYXZhIGxhbmd1YWdlIHNwZWNpZmljYXRpb25zLCBTdWJ2ZXJzaW9uIChTVk4pDQotY29udHJvbCBldGMuPC9saT4NCi08L3VsPg0KLTxoMj5SZWZlcmVuY2VzPC9oMj4NCi08cD5HaXZlcyB5b3UgYSBsaXN0IG9mIHB1Ymxpc2hlZCBhcnRpY2xlcywgdHV0b3JpYWxzIGFuZA0KLVF1ZXN0aW9ucy1BbnN3ZXJzIG9uIEFwYWNoZSBBeGlzMi4gPGEgaHJlZj0iLi4vYXJ0aWNsZXMuaHRtbCI+Q2hlY2sNCi10aGVtIG91dDwvYT4gZm9yIHRoYXQgZXh0cmEga25vd2xlZGdlIG9uIHRoZSBuZXh0IGdlbmVyYXRpb24gV2ViDQotc2VydmljZXMgZW5naW5lIEFwYWNoZSBBeGlzMi4gQmUgaW5mb3JtZWQgYW5kIHVwLXRvLWRhdGUhPC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvcmJhLWRlcGxveWVyLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9jb3JiYS1kZXBsb3llci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTE1Y2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2NvcmJhLWRlcGxveWVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPkV4cG9zaW5nIENPUkJBIFNlcnZpY2VzIGFzIFdlYiBTZXJ2aWNlczwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IHhtbDpsYW5nPSJlbiI+DQotPGgxPkV4cG9zaW5nIENPUkJBIFNlcnZpY2VzIGFzIFdlYiBTZXJ2aWNlczwvaDE+Ci0KLTxoMj5PdmVydmlldzwvaDI+Ci08aDM+V2hhdCBpcyBDT1JCQT88L2gzPgotQ09SQkEgc3RhbmRzIGZvciBDb21tb24gT2JqZWN0IFJlcXVlc3QgQnJva2VyIEFyY2hpdGVjdHVyZS4gSXQgYWxsb3dzIGNsaWVudHMgdG8gaW52b2tlIG1ldGhvZHMgb2YgcmVtb3RlIG9iamVjdHMgcnVubmluZyBvbiByZW1vdGUgbWFjaGluZXMgdGhyb3VnaCBhIGJpbmFyeSBwcm90b2NvbCBzdWNoIGFzIElJT1AuCi0KLTxoMz5XaGF0IEF4aXMyIENPUkJBIG1vZHVsZSBkb2VzPzwvaDM+Ci0KLVRoZSBBeGlzMiBDT1JCQSBtb2R1bGUgYWN0cyBhcyBhIGJyaWRnZSBiZXR3ZWVuIFNPQVAgYW5kIElJT1AgcHJvdG9jb2xzIGJ5IGNvbnZlcnRpbmcgU09BUCBtZXNzYWdlcyBvcmlnaW5hdGVkIGZyb20gYSB3ZWIgc2VydmljZXMgY2xpZW50IHRvIElJT1AgbWVzc2FnZXMgYW5kIHZpc2UgdmVyc2EuIEluIG90aGVyIHdvcmRzLCBBeGlzMiBDT1JCQSBtb2R1bGUgYWxsb3dzIHdlYiBzZXJ2aWNlIGNsaWVudCB0byBpbnZva2UgbWV0aG9kcyBvbiBhIHJlbW90ZSBDT1JCQSBzZXJ2ZXIuCi08aDQ+RmVhdHVyZXM8L2g0PgotPHVsPgotPGxpPlN1cHBvcnRzIGFsbCB0aGUgcHJpbWl0aXZlIGFuZCBjb21wb3NpdGUgSURMIGRhdGEgdHlwZXMgaW5jbHVkaW5nIFZhbHVlIHR5cGVzIChvYmplY3RzIGJ5IHZhbHVlKSwgU3RydWN0dXJlcywgVW5pb24sIFNlcXVlbmNlcyBhbmQgQXJyYXlzIChpbmNsdWRpbmcgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMpLCBFbnVtZXJhdGlvbnMgYW5kIEV4Y2VwdGlvbnMuPC9saT4KLTxsaT5EeW5hbWljIGNvbnZlcnNpb24gb2YgY29tcGxleCBkYXRhIHR5cGVzPC9saT4KLTxsaT5JREwgZHJpdmVuIFdTREwgZ2VuZXJhdGlvbjwvbGk+Ci08bGk+U3VwcG9ydHMgQ09SQkEgcHJlLXByb2Nlc3NvciBkaXJlY3RpdmVzPC9saT4KLTwvdWw+Ci0KLTxoMz5XaHkgaXQgaXMgVXNlZnVsPzwvaDM+Ci08dWw+Ci08bGk+Q29udmVydCBsZWdhY3kgQ09SQkEgc2VydmljZXMgaW50byB3ZWIgc2VydmljZXM8L2xpPgotPGxpPkZhY2lsaXRhdGUgaW50ZXJvcGVyYWJpbGl0eSBiZXR3ZWVuIGhldGVyb2dlbmVvdXMgc3lzdGVtczwvbGk+Ci08bGk+SW50ZWdyYXRlIENPUkJBIHNlcnZpY2VzIHdpdGggRW50ZXJwcmlzZSBTZXJ2aWNlIEJ1c2VzIChFU0JzKTwvbGk+Ci08L3VsPgotCi0KLTxoMj5UdXRvcmlhbDwvaDI+Ci0KLVRoaXMgdHV0b3JpYWwgZXhwbGFpbnMgaG93IHRvIHdyaXRlIGEgc2ltcGxlIENPUkJBIHNlcnZpY2UgYW5kIGhvdyB0byBtYWtlIGl0IGF2YWlsYWJsZSBhcyBhIHdlYiBzZXJ2aWNlIHVzaW5nIHRoZSBBeGlzMiBDT1JCQSBtb2R1bGUuIExldCdzIHN0YXJ0IHRoZSB0dXRvcmlhbCBieSBjcmVhdGluZyBhbiBJREwgZmlsZS4KLQotPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotPHVsPgotPGxpPlN1biBKREsgdmVyc2lvbiA1LjAgb3IgaGlnaGVyPC9saT4KLTxsaT5MYXRlc3QgdmVyc2lvbiBvZiBBeGlzMiB3aXRoIEF4aXMyIENPUkJBIG1vZHVsZTwvbGk+Ci08L3VsPgotCi08aDM+Q3JlYXRpbmcgdGhlIElETCBmaWxlPC9oMz4KLVRoZSBJbnRlcmZhY2UgRGVmaW5pdGlvbiBMYW5ndWFnZSAoSURMKSBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBpbnRlcmZhY2UgdG8gYSBDT1JCQSBvYmplY3QuIEFuIElETCBmaWxlIGNhbiB0aGVuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgQ09SQkEgc2VydmVyLgotCi1Db3B5IHRoZSBmb2xsb3dpbmcgbGlzdGluZyBhbmQgc2F2ZSBhcyBhIHRleHQgZmlsZSBuYW1lZCA8dHQ+Y2FsY3VsYXRvci5pZGw8L3R0Pi4KLQotPHByZT4KLS8vIEFkZHJlc3MgYm9vayBzeXN0ZW0gbW9kdWxlCi1tb2R1bGUgZXhhbXBsZQotewotICAgIC8vIEEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgdHdvIGludGVnZXIgdmFsdWVzCi0gICAgc3RydWN0IG51bWJlcnMKLSAgICB7Ci0gICAgICAgIGxvbmcgZmlyc3Q7Ci0gICAgICAgIGxvbmcgc2Vjb25kOwotICAgIH07Ci0gCi0gICAgLy8gU3BlY2lmeSBpbnRlcmZhY2UgdG8gb3VyIGFkZHJlc3MgYm9vawotICAgIGludGVyZmFjZSBjYWxjdWxhdG9yCi0gICAgewotICAgICAgICAvLyByZXR1cm5zIG4uZmlyc3QgKyBuLnNlY29uZAotICAgICAgICBsb25nIGFkZChpbiBudW1iZXJzIG4pOwotCi0gICAgICAgIC8vIHJldHVybnMgbi5maXJzdCArIG4uc2Vjb25kCi0gICAgICAgIGxvbmcgc3VidHJhY3QoaW4gbnVtYmVycyBuKTsKLSAgICB9OwotfTsKLTwvcHJlPgotCi08aDM+Q3JlYXRpbmcgdGhlIENPUkJBIHNlcnZlcjwvaDM+Ci1PcGVuIGEgY29uc29sZSB3aW5kb3cgYW5kIHR5cGUgdGhlIGZvbGxvd2luZyBjb21tYW5kLiAoTWFrZSBzdXJlIEpBVkFfSE9NRS9iaW4gaXMgaW5jbHVkZWQgdG8gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUpCi0KLTxwcmU+aWRsaiAtZmFsbCBjYWxjdWxhdG9yLmlkbDwvcHJlPgotCi1pZGxqIGdlbmVyYXRlcyBzZXZlcmFsIGNsYXNzZXMgbmVlZGVkIGZvciBDT1JCQSBzZXJ2ZXJzIGFuZCBjbGllbnQuIFR5cGljYWxseSwgaWRsaiBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBmaWxlIHN0cnVjdHVyZS4KLQotPHByZT4KLXwKLXwgICBjYWxjdWxhdG9yLmlkbAotfAotXC0tLWV4YW1wbGUKLSAgICAgICAgbnVtYmVyc0hlbHBlci5qYXZhCi0gICAgICAgIG51bWJlcnNIb2xkZXIuamF2YQotICAgICAgICBudW1iZXJzLmphdmEKLSAgICAgICAgY2FsY3VsYXRvclBPQS5qYXZhCi0gICAgICAgIF9jYWxjdWxhdG9yU3R1Yi5qYXZhCi0gICAgICAgIGNhbGN1bGF0b3JIb2xkZXIuamF2YQotICAgICAgICBjYWxjdWxhdG9ySGVscGVyLmphdmEKLSAgICAgICAgY2FsY3VsYXRvci5qYXZhCi0gICAgICAgIGNhbGN1bGF0b3JPcGVyYXRpb25zLmphdmEKLTwvcHJlPgotCi1Hb3RvIHRoZSBleGFtcGxlIHN1YmRpcmVjdG9yeSBhbmQgY3JlYXRlIDx0dD5jYWxjdWxhdG9ySW1wbC5qYXZhPC90dD4gZmlsZSBhcyBmb2xsb3dzLgotCi08cHJlPgotcGFja2FnZSBleGFtcGxlOwotCi1pbXBvcnQgZXhhbXBsZS5jYWxjdWxhdG9yUGFja2FnZS5udW1iZXJzOwotCi1wdWJsaWMgY2xhc3MgY2FsY3VsYXRvckltcGwgZXh0ZW5kcyBjYWxjdWxhdG9yUE9BIHsKLQotCXB1YmxpYyBpbnQgYWRkKG51bWJlcnMgbikgewotCQlyZXR1cm4gbi5maXJzdCArIG4uc2Vjb25kOwotCX0KLQotCXB1YmxpYyBpbnQgc3VidHJhY3QobnVtYmVycyBuKSB7Ci0JCXJldHVybiBuLmZpcnN0IC0gbi5zZWNvbmQ7Ci0JfQotfQotPC9wcmU+Ci0KLUdvIGJhY2sgdG8gdGhlIHJvb3QgZGlyZWN0b3J5ICh0aGUgZGlyZWN0b3J5IHdoZXJlIGNhbGN1bGF0b3IuaWRsIGlzIGxvY2F0ZWQpIGFuZCBjcmVhdGUgPHR0PlNlcnZlci5qYXZhPC90dD4gYXMgZm9sbG93cy4KLQotPHByZT4KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dEV4dDsKLWltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0SGVscGVyOwotaW1wb3J0IGV4YW1wbGUuY2FsY3VsYXRvckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXIgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgb3JnLm9tZy5DT1JCQV8yXzMuT1JCIG9yYiA9IAotICAgICAgICAJKG9yZy5vbWcuQ09SQkFfMl8zLk9SQikgb3JnLm9tZy5DT1JCQS5PUkIuaW5pdChhcmdzLCBudWxsKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BIHBvYSA9IAotICAgICAgICAgICAgCW9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BSGVscGVyLm5hcnJvdygKLSAgICAgICAgICAgIAkJCW9yYi5yZXNvbHZlX2luaXRpYWxfcmVmZXJlbmNlcygiUm9vdFBPQSIpKTsKLSAgICAgICAgICAgIHBvYS50aGVfUE9BTWFuYWdlcigpLmFjdGl2YXRlKCk7Ci0gICAgICAgICAgICBvcmcub21nLkNPUkJBLk9iamVjdCBvID0gCi0gICAgICAgICAgICAJcG9hLnNlcnZhbnRfdG9fcmVmZXJlbmNlKG5ldyBjYWxjdWxhdG9ySW1wbCgpKTsKLSAgICAgICAgICAgIGlmKGFyZ3MubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwcyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShhcmdzWzBdKSk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnRsbihvcmIub2JqZWN0X3RvX3N0cmluZyhvKSk7Ci0gICAgICAgICAgICAgICAgcHMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTmFtaW5nQ29udGV4dEV4dCBuYyA9IAotICAgICAgICAgICAgICAgIAlOYW1pbmdDb250ZXh0RXh0SGVscGVyLm5hcnJvdygKLSAgICAgICAgICAgICAgICAJCQlvcmIucmVzb2x2ZV9pbml0aWFsX3JlZmVyZW5jZXMoIk5hbWVTZXJ2aWNlIikpOwotICAgICAgICAgICAgICAgIG5jLmJpbmQobmMudG9fbmFtZSgiY2FsY3VsYXRvciIpLCBvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3JiLnJ1bigpOwotICAgIH0KLX0KLTwvcHJlPgotCi1Db21waWxlIGFsbCB0aGUgSmF2YSBjbGFzc2VzIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZC4KLTxwcmU+amF2YWMgKi5qYXZhPC9wcmU+Ci0KLTxoMz5DcmVhdGluZyB0aGUgQ09SQkEgd2ViIHNlcnZpY2U8L2gzPgotTm93IHdlIGFyZSByZWFkeSB0byBjcmVhdGUgYSBDT1JCQSB3ZWIgc2VydmljZSB1c2luZyB0aGUgQXhpczIgQ09SQkEgbW9kdWxlLiBGaXJzdCBvZiBhbGwgd2UgaGF2ZSB0byBwcmVwYXJlIEF4aXMyIHRvIHdvcmsgd2l0aCBDT1JCQSBtb2R1bGUuCi08YnIgLz48YnIgLz4KLTEuIE1ha2Ugc3VyZSBheGlzMi1jb3JiYS17dmVyc2lvbn0uamFyIGlzIGF2YWlsYWJsZSBpbiBBWElTMl9IT01FL2xpYiBkaXJlY3RvcnkuCi08YnIgLz48YnIgLz4KLTIuIERvd25sb2FkIGxhdGVzdCBBcGFjaGUgWW9rbyBiaW5hcnkgZGlzdHJpYnV0aW9uIGZvcm0gaHR0cDovL2N3aWtpLmFwYWNoZS5vcmcvWU9LTy9kb3dubG9hZC5odG1sLiBFeHRyYWN0IHRoZSBkb3dubG9hZGVkIGFyY2hpdmUgdG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBjb3B5IHlva28tY29yZS17dmVyc2lvbn0uamFyIGFuZCB5b2tvLXNwZWMtY29yYmF7dmVyc2lvbn0uamFyIHRvIEFYSVMyX0hPTUUvbGliIGRpcmVjdG9yeS4gKEF4aXMyIENPUkJBIG1vZHVsZSBjYW4gYWxzbyB3b3JrIHdpdGggb3RoZXIgQ09SQkEgaW1wbGVtZW50YXRpb25zLiBSZWZlciAnQWRkaXRpb25hbCBDb25maWd1cmF0aW9uIERldGFpbHMnIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uKQotPGJyIC8+PGJyIC8+Ci0zLiBBZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSAmbHQ7YXhpc2NvbmZpZyZndDsgc2VjdGlvbiBvZiB0aGUgYXhpczIueG1sIGZpbGUgd2hpY2ggaXMgbG9jYXRlZCBpbiBBWElTMl9IT01FL2NvbmYgZGlyZWN0b3J5LjxiciAvPgotPHByZT4mbHQ7ZGVwbG95ZXIgZXh0ZW5zaW9uPSIueG1sIiBkaXJlY3Rvcnk9ImNvcmJhIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jb3JiYS5kZXBsb3llci5Db3JiYURlcGxveWVyIi8mZ3Q7PC9wcmU+Ci08YnIgLz4KLTQuQ3JlYXRlIGEgbmV3IGRpcmVjdG9yeSBuYW1lZCBjb3JiYSBpbnNpZGUgIEFYSVMyX0hPTUUvcmVwb3NpdG9yeSBkaXJlY3RvcnkuCi08YnIgLz48YnIgLz4KLQotTm93LCB5b3VyIEF4aXMyIHNlcnZlciBpcyByZWFkeSB0byBkZXBsb3kgQ09SQkEgd2ViIHNlcnZpY2VzLiBDb3B5IGNhbGN1bGF0b3IuaWRsIGZpbGUgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgY29yYmEgZGlyZWN0b3J5IGFuZCBjcmVhdGUgYSBuZXcgZmlsZSBuYW1lZCA8dHQ+Y2FsY3VsYXRvci54bWw8L3R0PiBhcyBmb2xsb3dzIGluc2lkZSB0aGUgc2FtZSBkaXJlY3RvcnkuCi0KLTxwcmU+Ci0mbHQ7c2VydmljZSBuYW1lPSJDYWxjdWxhdG9yIj4KLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Q2FsY3VsYXRvciBTZXJ2aWNlJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImlkbEZpbGUiJmd0O2NhbGN1bGF0b3IuaWRsJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJpbnRlcmZhY2VOYW1lIiZndDtleGFtcGxlOjpjYWxjdWxhdG9yJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJuYW1pbmdTZXJ2aWNlVXJsIiZndDtjb3JiYWxvYzo6bG9jYWxob3N0OjkwMC9OYW1lU2VydmljZSZsdDsvcGFyYW1ldGVyJmd0OwotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0ib2JqZWN0TmFtZSImZ3Q7Y2FsY3VsYXRvciZsdDsvcGFyYW1ldGVyJmd0OwotJmx0Oy9zZXJ2aWNlJmd0OwotPC9wcmU+Ci0KLVJ1bm5pbmcgdGhlIEV4YW1wbGUKLQotU3RhcnQgYSBjb25zb2xlIHdpbmRvdyBhbmQgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gc3RhcnQgdGhlIENPUkJBIG5hbWUgc2VydmljZS4KLTxwcmU+dG5hbWVzZXJ2IC1PUkJJbml0aWFsUG9ydCA5MDA8L3ByZT4KLQotU3RhcnQgYW4gb3RoZXIgY29uc29sZSB3aW5kb3cgYW5kIGdvdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBTZXJ2ZXIuamF2YSBpcyBsb2NhdGVkLiBFeGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBzdGFydCB0aGUgQ09SQkEgc2VydmVyLgotPHByZT5qYXZhIFNlcnZlcjwvcHJlPgotCi1TdGFydCB0aGUgQXhpczIgc2VydmVyLiBUaGUgRVBSIG9mIHRoZSBuZXcgQ2FsY3VsYXRvciB3ZWIgc2VydmljZSB3aWxsIGJlIDx0dD5odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQ2FsY3VsYXRvcjwvdHQ+LiBUaGUgV1NETCBpcyBsb2NhdGVkIGF0IDx0dD5odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQ2FsY3VsYXRvcj93c2RsPC90dD4uIE5vdyB5b3UgY2FuIGNyZWF0ZSBhIHdlYiBzZXJ2aWNlIGNsaWVudCBhbmQgdXNlIGl0IHRvIGludm9rZSBtZXRob2RzIG9uIHRoZSBDT1JCQSBzZXJ2ZXIuCi0KLTxoMz5BZGRpdGlvbmFsIENvbmZpZ3VyYXRpb24gZGV0YWlsczwvaDM+Ci1UaGUgc2VydmljZSBkZWZpbml0aW9uIGZpbGUgKGVnLiBjYWxjdWxhdG9yLnhtbCkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzLgotPGJyIC8+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotPHRyPgotPHRoPlBhcmFtZXRlciBOYW1lPC90aD4KLTx0aD5EZXNjcmlwdGlvbjwvdGg+Ci08dGg+UmVxdWlyZWQ8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD5pZGxGaWw8L3RkPgotPHRkPlJlbGF0aXZlIHBhdGggdG8gdGhlIElETCBmaWxlPC90ZD4KLTx0ZD5ZZXM8L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5vcmJDbGFzczwvdGQ+Ci08dGQ+T3ZlcnJpZGVzIHRoZSBkZWZhdWx0IG9yYiBjbGFzcyBuYW1lLjwvdGQ+Ci08dGQ+Tm88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5vcmJTaW5nbGV0b25DbGFzczwvdGQ+Ci08dGQ+T3ZlcnJpZGVzIHRoZSBkZWZhdWx0IG9yYiBzaW5nbGV0b24gY2xhc3MgbmFtZS4KLShEZWZhdWx0OiBvcmcuYXBhY2hlLnlva28ub3JiLkNPUkJBLk9SQik8L3RkPgotPHRkPk5vPC90ZD4KLTwvdHI+Ci08dHI+Ci08dGQ+bmFtaW5nU2VydmljZVVybDwvdGQ+Ci08dGQ+VVJMIG9mIHRoZSBDT1JCQSBuYW1pbmcgc2VydmljZQotKERlZmF1bHQ6IG9yZy5hcGFjaGUueW9rby5vcmIuQ09SQkEuT1JCU2luZ2xldG9uKTwvdGQ+Ci08dGQ+Tm88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5pb3JGaWxlUGF0aDwvdGQ+Ci08dGQ+UGF0aCB0byBJT1IgZmlsZTwvdGQ+Ci08dGQ+Tm88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5pb3JTdHJpbmc8L3RkPgotPHRkPklPUiBhcyBhIHN0cmluZzwvdGQ+Ci08dGQ+Tm88L3RkPgotPC90cj4KLTx0cj4KLTx0ZD5vYmplY3ROYW1lPC90ZD4KLTx0ZD5OYW1lIG9mIHRoZSBDT1JCQSBzZXJ2aWNlIHdoaWNoIHVzZWQgaW4gdGhlIG5hbWluZyBzZXJ2aWNlCi1SZXF1aXJlZCBpZiBuYW1pbmdTZXJ2aWNlVXJsIGlzIHByZXNlbnQKLWludGVyZmFjZU5hbWUKLUZ1bGwgbmFtZSBvZiB0aGUgSURMIGludGVyZmFjZSB1c2VkIGZvciB0aGUgd2ViIHNlcnZpY2UuICh1c2UgOjogYXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIG1vZHVsZSBhbmQgaW50ZXJmYWNlIG5hbWVzKTwvdGQ+Ci08dGQ+WWVzPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YnIgLz4KLTxoMz5Ob3Rlczo8L2gzPgotMS4gQXhpczIgQ09SQkEgbW9kdWxlIHVzZXMgQXBhY2hlIFlva28gYXMgdGhlIGRlZmF1bHQgQ09SQkEgaW1wbGVtZW50YXRpb24uIElmIHlvdSB3YW50IHRvIHVzZSBhIENPUkJBIGltcGxlbWVudGF0aW9uIG90aGVyIHRoYW4gQXBhY2hlIFlva28sIG92ZXJyaWRlIG9yYkNsYXNzIGFuZCBvcmJTaW5nbGV0b25DbGFzcyBwcm9wZXJ0aWVzLgotPGJyIC8+PGJyIC8+Ci0yLiBUbyBydW4gdGhlIGFib3ZlIHR1dG9yaWFsIHdpdGhvdXQgYSBuYW1pbmcgc2VydmljZTo8YnIgLz4KLQkJVXNlIDx0dD5qYXZhIFNlcnZlciAvcGF0aC90by9hL25ldy9maWxlPC90dD4gdG8gc3RhcnQgdGhlIHNlcnZlci4gUmVtb3ZlIDx0dD5uYW1pbmdTZXJ2aWNlVXJsPC90dD4gYW5kIDx0dD5vYmplY3ROYW1lPC90dD4gcHJvcGVydGllcyBmcm9tIHRoZSA8dHQ+Y2FsY3VsYXRvci54bWw8L3R0PiBmaWxlIGFuZCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSAJc2FtZSBmaWxlLgotCQk8cHJlPiZsdDtwYXJhbWV0ZXIgbmFtZT0iaW9yRmlsZVBhdGgiJmd0Oy9wYXRoL3RvL2EvbmV3L2ZpbGUmbHQ7L3BhcmFtZXRlciZndDs8L3ByZT4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2RpaS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvZGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4NjJhYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvZGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIi8+Ci0gIDx0aXRsZT48L3RpdGxlPgotICA8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLSAgbWVkaWE9ImFsbCIvPgotPC9oZWFkPgotCi08Ym9keT4KLTxhIG5hbWU9IldlYl9TZXJ2aWNlX0NsaWVudHNfVXNpbmdfQXhpczIiPjwvYT4KLQotPGgxPldyaXRpbmcgV2ViIFNlcnZpY2UgQ2xpZW50cyBVc2luZyBBeGlzMidzIFByaW1hcnkgQVBJczwvaDE+Ci0KLTxwPlRoaXMgc2VjdGlvbiBwcmVzZW50cyBhIGNvbXBsZXggeWV0IHBvd2VyZnVsIDxzdHJvbmc+WE1MIGJhc2VkIGNsaWVudAotQVBJPC9zdHJvbmc+LCB3aGljaCBpcyBpbnRlbmRlZCBmb3IgYWR2YW5jZWQgdXNlcnMuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYSBuZXcKLXVzZXIsIHdlIHJlY29tbWVuZCB1c2luZyBjb2RlIGdlbmVyYXRpb24gZ2l2ZW4gaW4gdGhlIDxhCi1ocmVmPSJhZHYtdXNlcmd1aWRlLmh0bWwiPkFkdmFuY2VkIFVzZXIncyBHdWlkZTwvYT4uPC9wPgotCi08cD5XZWIgc2VydmljZXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHdpZGUtcmFuZ2Ugb2YgZnVuY3Rpb25hbGl0eSB0byB0aGUKLXVzZXIgZnJvbSBzaW1wbGUsIHF1aWNrIG9wZXJhdGlvbnMgc3VjaCBhcyAiZ2V0U3RvY2tRdW90ZSIgdG8gdGltZSBjb25zdW1pbmcKLWJ1c2luZXNzIHNlcnZpY2VzLiBXaGVuIHdlIHV0aWxpemUgKGludm9rZSB1c2luZyBjbGllbnQgYXBwbGljYXRpb25zKSB0aGVzZQotV2ViIHNlcnZpY2VzLCB3ZSBjYW5ub3QgYWx3YXlzIHVzZSBzaW1wbGUgZ2VuZXJpYyBpbnZvY2F0aW9uIHBhcmFkaWdtcyB0aGF0IHN1aXRlCi1hbGwgdGhlIHRpbWluZyBjb21wbGV4aXRpZXMgaW52b2x2ZWQgaW4gdGhlIHNlcnZpY2Ugb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsCi1pZiB3ZSB1c2UgYSBzaW5nbGUgdHJhbnNwb3J0IGNoYW5uZWwgKHN1Y2ggYXMgSFRUUCkgdG8gaW52b2tlIGEgV2ViIHNlcnZpY2UKLXdpdGggYW4gSU4tT1VUIG9wZXJhdGlvbiB0aGF0IHRha2VzIGEgbG9uZyB0aW1lIHRvIGNvbXBsZXRlLCB0aGVuIG1vc3Qgb2Z0ZW4KLXdlIG1heSBlbmQgdXAgd2l0aCAiY29ubmVjdGlvbiB0aW1lIG91dHMiLiBGdXJ0aGVyLCBpZiB0aGVyZSBhcmUKLXNpbXVsdGFuZW91cyBzZXJ2aWNlIGludm9jYXRpb25zIHRoYXQgd2UgbmVlZCB0byBwZXJmb3JtIGZyb20gYSBzaW5nbGUgY2xpZW50Ci1hcHBsaWNhdGlvbiwgdGhlbiB0aGUgdXNlIG9mIGEgImJsb2NraW5nIiBjbGllbnQgQVBJIHdpbGwgZGVncmFkZSB0aGUKLXBlcmZvcm1hbmNlIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24uIFNpbWlsYXJseSwgdGhlcmUgYXJlIHZhcmlvdXMgb3RoZXIKLWNvbnNlcXVlbmNlcyBzdWNoIGFzIE9uZS1XYXkgdHJhbnNwb3J0cyB0aGF0IGNvbWUgaW50byBwbGF5IHdoZW4gd2UgbmVlZAotdGhlbS4gTGV0J3MgdHJ5IHRvIGFuYWx5emUgc29tZSBjb21tb24gc2VydmljZSBpbnZvY2F0aW9uIHBhcmFkaWdtcy48L3A+Ci0KLTxwPk1hbnkgV2ViIHNlcnZpY2UgZW5naW5lcyBwcm92aWRlIHVzZXJzIHdpdGggQmxvY2tpbmcgYW5kIE5vbi1CbG9ja2luZwotY2xpZW50IEFQSXMuPC9wPgotPHVsPgotICA8bGk+PHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PGI+QmxvY2tpbmcgQVBJPC9iPiAtIE9uY2UgdGhlIHNlcnZpY2UKLSAgICBpbnZvY2F0aW9uIGlzIGNhbGxlZCwgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBoYW5ncywgcmVnYWluaW5nIGNvbnRyb2wKLSAgICBvbmx5IHdoZW4gdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMsIGFmdGVyIHdoaWNoIHRoZSBjbGllbnQgcmVjZWl2ZXMgYQotICAgIHJlc3BvbnNlIG9yIGEgZmF1bHQuIFRoaXMgaXMgdGhlIHNpbXBsZXN0IHdheSBvZiBpbnZva2luZyBXZWIgc2VydmljZXMsCi0gICAgYW5kIGl0IGFsc28gc3VpdGVzIG1hbnkgYnVzaW5lc3Mgc2l0dWF0aW9ucy48L3A+Ci0gIDwvbGk+Ci0gIDxsaT48cD48Yj5Ob24tQmxvY2tpbmcgQVBJIDwvYj4tIFRoaXMgaXMgYSBjYWxsYmFjayBvciBwb2xsaW5nIGJhc2VkIEFQSS4KLSAgICBIZXJlLCBvbmNlIGEgc2VydmljZSBpbnZvY2F0aW9uIGlzIGNhbGxlZCwgdGhlIGNsaWVudCBhcHBsaWNhdGlvbgotICAgIGltbWVkaWF0ZWx5IHJlZ2FpbnMgY29udHJvbCBhbmQgdGhlIHJlc3BvbnNlIGlzIHJldHJpZXZlZCB1c2luZyB0aGUKLSAgICBjYWxsYmFjayBvYmplY3QgcHJvdmlkZWQuIFRoaXMgYXBwcm9hY2ggYWxsb3dzIHRoZQotICAgIGNsaWVudCBhcHBsaWNhdGlvbiB0byBpbnZva2Ugc2V2ZXJhbCBXZWIgc2VydmljZXMgc2ltdWx0YW5lb3VzbHkgd2l0aG91dAotICAgIG5lZWRpbmcgdG8gd2FpdCBmb3IgdGhlIHJlc3BvbnNlIG9mIHByZXZpb3VzIG9wZXJhdGlvbnMuPC9wPgotICA8L2xpPgotPC91bD4KLQotPHA+Qm90aCB0aGVzZSBtZWNoYW5pc21zIHdvcmsgYXQgdGhlIEFQSSBsZXZlbC4gTGV0J3MgbmFtZSB0aGUgYXN5bmNocm9ub3VzCi1iZWhhdmlvciB0aGF0IHdlIGNhbiBnZXQgdXNpbmcgdGhlIE5vbi1CbG9ja2luZyBBUEkgYXMgPGI+QVBJIExldmVsCi1Bc3luY2hyb255LjwvYj48L3A+Ci0KLTxwPkJvdGggbWVjaGFuaXNtcyB1c2Ugc2luZ2xlIHRyYW5zcG9ydCBjb25uZWN0aW9ucyB0byBzZW5kIHRoZSByZXF1ZXN0IGFuZAotdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2UuIFRoZXkgc2V2ZXJlbHkgbGFnIHRoZSBjYXBhYmlsaXR5IG9mIHVzaW5nIHR3bwotdHJhbnNwb3J0IGNvbm5lY3Rpb25zIGZvciB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlIChlaXRoZXIgT25lLVdheSBvcgotVHdvLVdheSkuIFNvIGJvdGggdGhlc2UgbWVjaGFuaXNtcyBmYWlsIHRvIGFkZHJlc3MgdGhlIHByb2JsZW0gb2YgbG9uZwotcnVubmluZyB0cmFuc2FjdGlvbnMsIGFzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbiBtYXkgc3RpbGwgdGltZS1vdXQgYmVmb3JlIHRoZQotb3BlcmF0aW9uIGNvbXBsZXRlcy4gQSBwb3NzaWJsZSBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdHdvIHNlcGFyYXRlCi10cmFuc3BvcnQgY29ubmVjdGlvbnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlLiBUaGUgYXN5bmNocm9ub3VzIGJlaGF2aW9yCi10aGF0IHdlIGdhaW4gdXNpbmcgdGhpcyBzb2x1dGlvbiBjYW4gYmUgY2FsbGVkIDxiPlRyYW5zcG9ydCBMZXZlbAotQXN5bmNocm9ueTwvYj4uPC9wPgotCi08cD5CeSA8c3Ryb25nPmNvbWJpbmluZyBBUEkgTGV2ZWwgQXN5bmNocm9ueSBhbmQgVHJhbnNwb3J0IExldmVsCi1Bc3luY2hyb255PC9zdHJvbmc+LCB3ZSBjYW4gb2J0YWluIGZvdXIgZGlmZmVyZW50IGludm9jYXRpb24gcGF0dGVybnMgZm9yIFdlYgotc2VydmljZXMgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS48L3A+Ci08YSBuYW1lPSJ0YWJsZTEiPjwvYT4KLQotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0Ym9keT4KLSAgICA8dHI+Ci0gICAgICA8dGQgd2lkdGg9IjMzJSIgaGVpZ2h0PSIxOSI+PHA+PHN0cm9uZz5BUEkKLSAgICAgICAgKEJsb2NraW5nL05vbi1CbG9ja2luZyk8L3N0cm9uZz48L3A+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHdpZHRoPSIzMyUiPjxwPjxzdHJvbmc+RHVhbCBUcmFuc3BvcnRzIChZZXMvTm8pPC9zdHJvbmc+PC9wPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9wPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB3aWR0aD0iMzMlIiBoZWlnaHQ9IjE5Ij48cD5CbG9ja2luZzwvcD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+Tm88L3A+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHdpZHRoPSIzMyUiPjxwPlRoZSBzaW1wbGVzdCBhbmQgbW9zdCBmYW1pbGlhciBpbnZvY2F0aW9uIHBhdHRlcm48L3A+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHdpZHRoPSIzMyUiIGhlaWdodD0iMTkiPjxwPk5vbi1CbG9ja2luZzwvcD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+Tm88L3A+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHdpZHRoPSIzMyUiPjxwPlVzaW5nIGNhbGxiYWNrcyBvciBwb2xsaW5nPC9wPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB3aWR0aD0iMzMlIiBoZWlnaHQ9IjE5Ij48cD5CbG9ja2luZzwvcD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+WWVzPC9wPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD5UaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBzZXJ2aWNlIG9wZXJhdGlvbiBpcyBSZXF1ZXN0LVJlc3BvbnNlCi0gICAgICAgIGluIG5hdHVyZSBidXQgdGhlIHRyYW5zcG9ydCB1c2VkIGlzIE9uZS1XYXkgKGUuZy4gU01UUCk8L3A+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHdpZHRoPSIzMyUiIGhlaWdodD0iMTkiPjxwPk5vbi1CbG9ja2luZzwvcD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgd2lkdGg9IjMzJSI+PHA+WWVzPC9wPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB3aWR0aD0iMzMlIj48cD5UaGlzIGlzIGNhbiBiZSB1c2VkIHRvIGdhaW4gdGhlIG1heGltdW0gYXN5bmNocm9ub3VzCi0gICAgICAgIGJlaGF2aW9yLiBOb24gYmxvY2tpbmcgYXQgdGhlIEFQSSBsZXZlbCBhbmQgYWxzbyBhdCB0aGUgdHJhbnNwb3J0Ci0gICAgICAgIGxldmVsLjwvcD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90Ym9keT4KLTwvdGFibGU+Ci0KLTxwPkF4aXMyIHByb3ZpZGVzIHRoZSB1c2VyIHdpdGggYWxsIHRoZXNlIHBvc3NpYmlsaXRpZXMgdG8gaW52b2tlIFdlYgotc2VydmljZXMuPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIHNlY3Rpb24gcHJlc2VudHMgY2xpZW50cyB0aGF0IHVzZSBzb21lIG9mIHRoZSBkaWZmZXJlbnQKLXBvc3NpYmlsaXRpZXMgcHJlc2VudGVkIGFib3ZlIHRvIGludm9rZSBhIFdlYiBTZXJ2aWNlIHVzaW5nCi08Y29kZT5TZXJ2aWNlQ2xpZW50PC9jb2RlPnMuIEFsbCB0aGUgc2FtcGxlcyBtZW50aW9uZWQgaW4gdGhpcyBndWlkZSBhcmUKLWxvY2F0ZWQgYXQgdGhlIDxiPjxmb250IGNvbG9yPSIjMDAwMDAwIj4ic2FtcGxlc1x1c2VyZ3VpZGVcc3JjIjwvZm9udD48L2I+Ci1kaXJlY3Rvcnkgb2YgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24uPC9wPgotCi08cD5UaGlzIHNlY3Rpb24gcHJlc2VudHMgZm91ciB0eXBlcyBvZiBjbGllbnRzLjwvcD4KLTxvbD4KLSAgPGxpPlJlcXVlc3QtUmVzcG9uc2UsIEJsb2NraW5nIENsaWVudDwvbGk+Ci0gIDxsaT5PbmUgV2F5IENsaWVudCwgTm9uLUJsb2NraW5nPC9saT4KLSAgPGxpPlJlcXVlc3QtUmVzcG9uc2UsIE5vbi1CbG9ja2luZyB0aGF0IHVzZXMgb25lIHRyYW5zcG9ydCBjb25uZWN0aW9uPC9saT4KLSAgPGxpPlJlcXVlc3QtUmVzcG9uc2UsIE5vbi1CbG9ja2luZyB0aGF0IHVzZXMgdHdvIHRyYW5zcG9ydCBjb25uZWN0aW9uczwvbGk+Ci08L29sPgotPGEgbmFtZT0iRWNob0Jsb2NraW5nQ2xpZW50Ij48L2E+Ci0KLTxoND5SZXF1ZXN0LVJlc3BvbnNlLCBCbG9ja2luZyBDbGllbnQ8L2g0PgotCi08cD5UaGUgY2xpZW50IGNvZGUgYmVsb3cgd2lsbCBpbnZva2UgdGhlICJlY2hvIiBvcGVyYXRpb24gb2YgCi0iTXlTZXJ2aWNlIiB1c2luZyBhIHB1cmUgYmxvY2tpbmcgc2luZ2xlLWNoYW5uZWwgaW52b2NhdGlvbi48L3A+Ci08c291cmNlPgotPHByZT4gIAotICAgdHJ5IHsKLSAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDM2LCAxOTMsIDE5KTsiPiAgICAgICAgICAgIAotICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBDbGllbnRVdGlsLmdldEVjaG9PTUVsZW1lbnQoKTsKLSAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7IC8vIHRoaXMgc2V0cyB0aGUgbG9jYXRpb24gb2YgTXlTZXJ2aWNlIHNlcnZpY2UKLSAgICAgICAgICAgIAotICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgIHNlcnZpY2VDbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlcnZpY2VDbGllbnQuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICA8L3NwYW4+Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKLSAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgIH0gCi19PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSBsaW5lcyBoaWdobGlnaHRlZCBpbiBncmVlbiBzaG93IHRoZSBzZXQgb2Ygb3BlcmF0aW9ucyB0aGF0IHlvdSBuZWVkCi10byBwZXJmb3JtIGluIG9yZGVyIHRvIGludm9rZSB0aGUgV2ViIHNlcnZpY2UgaW4gdGhpcyBtYW5uZXIuPC9wPgotCi08cD5UbyB0ZXN0IHRoaXMgY2xpZW50LCB1c2UgdGhlIHByb3ZpZGVkIEFudCBidWlsZCBmaWxlIHRoYXQgY2FuIGJlIGZvdW5kIGluCi10aGUgIjxzdHJvbmc+QXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZTwvc3Ryb25nPiIgZGlyZWN0b3J5LiBSdW4gdGhlCi0icnVuLmNsaWVudC5ibG9ja2luZyIgdGFyZ2V0LiBJZiB5b3UgY2FuIHNlZSB0aGUgcmVzcG9uc2UgT01FbGVtZW50IHByaW50ZWQKLWluIHlvdXIgY29tbWFuZCBsaW5lLCB0aGVuIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgdGhlIGNsaWVudC48L3A+Ci08YSBuYW1lPSJQaW5nQ2xpZW50Ij48L2E+Ci0KLTxoND5PbmUgV2F5IENsaWVudCwgTm9uLUJsb2NraW5nPC9oND4KLQotPHA+SW4gdGhlIFdlYiBzZXJ2aWNlICJNeVNlcnZpY2UiLCB3ZSBoYWQgYW4gSU4tT05MWSBvcGVyYXRpb24gd2l0aCB0aGUgbmFtZQotInBpbmciIChzZWUgPGEgaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sI1dlYl9TZXJ2aWNlc19Vc2luZ19BeGlzMiI+Q3JlYXRpbmcgYQotTmV3IFdlYiBTZXJ2aWNlPC9hPikuIExldCdzIHdyaXRlIGEgY2xpZW50IHRvIGludm9rZSB0aGlzIG9wZXJhdGlvbi4gVGhlCi1jbGllbnQgY29kZSBpcyBhcyBmb2xsb3dzOjwvcD4KLTxwcmU+IAotICAgdHJ5IHsKLSAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRQaW5nT01FbGVtZW50KCk7Ci0gICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgIHNlcnZpY2VDbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgIHNlcnZpY2VDbGllbnQuZmlyZUFuZEZvcmdldChwYXlsb2FkKTsKLSAgICAgIC8qKgotICAgICAgICogV2UgbmVlZCB0byB3YWl0IHNvbWUgdGltZSBmb3IgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudC4gIE90aGVyd2lzZSwKLSAgICAgICAqIGlmIHdlIGltbWVkaWF0ZWx5IGV4aXQgdGhpcyBmdW5jdGlvbiB1c2luZyB0aGUgbWFpbiB0aHJlYWQsIAotICAgICAgICogdGhlIHJlcXVlc3Qgd29uJ3QgYmUgc2VudC4KLSAgICAgICAqLwotICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7Ci0gICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICB9Ci08L3ByZT4KLQotPHA+U2luY2Ugd2UgYXJlIGNhbGxpbmcgYW4gSU4tT05MWSB3ZWIgc2VydmljZSwgd2UgY2FuIGRpcmVjdGx5IHVzZSB0aGUKLTxjb2RlPmZpcmVBbmRGb3JnZXQoKTwvY29kZT4gaW4gdGhlIFNlcnZpY2VDbGllbnQgdG8gaW52b2tlIHRoaXMgb3BlcmF0aW9uLgotVGhpcyB3aWxsIG5vdCBibG9jayB0aGUgaW52b2NhdGlvbiBhbmQgd2lsbCByZXR1cm4gdGhlIGNvbnRyb2wgaW1tZWRpYXRlbHkKLWJhY2sgdG8gdGhlIGNsaWVudC4gWW91IGNhbiB0ZXN0IHRoaXMgY2xpZW50IGJ5IHJ1bm5pbmcgdGhlIHRhcmdldAotInJ1bi5jbGllbnQucGluZyIgb2YgdGhlIEFudCBidWlsZCBmaWxlIGF0Ci0iPHN0cm9uZz5BeGlzMkhvbWUvc2FtcGxlcy91c2VyZ3VpZGU8L3N0cm9uZz4iLjwvcD4KLQotPGEgbmFtZT0iRWNob05vbkJsb2NraW5nQ2xpZW50Ij48L2E+Ci0KLTxoND5SZXF1ZXN0LVJlc3BvbnNlLCBOb24tQmxvY2tpbmcgdGhhdCB1c2VzIG9uZSB0cmFuc3BvcnQgY29ubmVjdGlvbjwvaDQ+Ci0KLTxwPkluIHRoZSAiRWNob0Jsb2NraW5nQ2xpZW50IiBvbmNlIHRoZQotPGNvZGU+c2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShwYXlsb2FkKTs8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIGNsaWVudCBpcwotYmxvY2tlZCB0aWxsIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGUuIFRoaXMgYmVoYXZpb3IgaXMgbm90IGRlc2lyYWJsZSB3aGVuCi10aGVyZSBhcmUgbWFueSBXZWIgc2VydmljZSBpbnZvY2F0aW9ucyB0byBiZSBkb25lIGluIGEgc2luZ2xlIGNsaWVudAotYXBwbGljYXRpb24gb3Igd2l0aGluIGEgR1VJLiBBIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSBhIE5vbi1CbG9ja2luZyBBUEkgdG8KLWludm9rZSBXZWIgc2VydmljZXMuIEF4aXMyIHByb3ZpZGVzIGEgY2FsbGJhY2sgYmFzZWQgbm9uLWJsb2NraW5nIEFQSSBmb3IKLXVzZXJzLjwvcD4KLQotPHA+QSBzYW1wbGUgY2xpZW50IGZvciB0aGlzIGNhbiBiZSBmb3VuZCB1bmRlcgotIjxzdHJvbmc+QXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHM8L3N0cm9uZz4iIHdpdGgKLXRoZSBuYW1lICJFY2hvTm9uQmxvY2tpbmdDbGllbnQiLiBJZiB3ZSBjb25zaWRlciB0aGUgY2hhbmdlcyB0aGF0IHRoZSBkZXZlbG9wZXIgbWF5Ci1oYXZlIHRvIGRvIHdpdGggcmVzcGVjdCB0byB0aGUgIkVjaG9CbG9ja2luZ0NsaWVudCIgdGhhdCB3ZSBoYXZlIGFscmVhZHkKLXNlZW4sIGl0IHdpbGwgYmUgYXMgZm9sbG93czo8L3A+Ci08cHJlIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwLjJpbiI+c2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZU5vbmJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTs8L3ByZT4KLQotPHA+VGhlIGludm9jYXRpb24gYWNjZXB0cyBhIENhbGxiYWNrIG9iamVjdCBhcyBhIHBhcmFtZXRlci4gQXhpczIgY2xpZW50IEFQSQotcHJvdmlkZXMgYW4gYWJzdHJhY3QgQ2FsbGJhY2sgd2l0aCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PC9wPgotPHByZT5wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCk7Ci1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKTsKLXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7fTwvcHJlPgotCi08cD5UaGUgZGV2ZWxvcGVyIGlzIGV4cGVjdGVkIHRvIG92ZXJyaWRlIHRoZSBvbkNvbXBsZXRlKCkgYW5kIG9uRXJyb3IoKSBtZXRob2RzCi1vZiB0aGVpciBDYWxsYmFjayBzdWJjbGFzcy4gVGhlIEF4aXMyIGVuZ2luZSBjYWxscyB0aGUgb25Db21wbGV0ZSgpCi1tZXRob2Qgb25jZSB0aGUgV2ViIHNlcnZpY2UgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgYnkgdGhlIEF4aXMyIENsaWVudCBBUEkKLShTZXJ2aWNlQ2xpZW50KS4gVGhpcyBlbGltaW5hdGVzIHRoZSBibG9ja2luZyBuYXR1cmUgb2YgdGhlIHdlYiBzZXJ2aWNlCi1yZXF1ZXN0LXJlc3BvbnNlIGludm9jYXRpb24uPC9wPgotCi08cD5UbyBydW4gdGhlIHNhbXBsZSBjbGllbnQgKCJFY2hvTm9uQmxvY2tpbmdDbGllbnQiKSB5b3UgY2FuIHNpbXBseSB1c2UgdGhlCi08Y29kZT5ydW4uY2xpZW50Lm5vbmJsb2NraW5nPC9jb2RlPiB0YXJnZXQgb2YgdGhlIEFudCBmaWxlIGZvdW5kIGluIHRoZQotIjxzdHJvbmc+QXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZTwvc3Ryb25nPiIgZGlyZWN0b3J5LjwvcD4KLTxhIG5hbWU9IkVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQiPjwvYT4KLQotPGg0PlJlcXVlc3QtUmVzcG9uc2UsIE5vbi1CbG9ja2luZyB0aGF0IHVzZXMgdHdvIHRyYW5zcG9ydCBjb25uZWN0aW9uczwvaDQ+Ci0KLTxwPlRoZSBzb2x1dGlvbiBwcm92aWRlZCBhYm92ZSBieSB0aGUgTm9uLUJsb2NraW5nIEFQSSBoYXMgb25lIGxpbWl0YXRpb24gd2hlbiBpdAotY29tZXMgdG8gV2ViIHNlcnZpY2UgaW52b2NhdGlvbnMgdGhhdCB0YWtlIGEgbG9uZyB0aW1lIHRvIGNvbXBsZXRlLiBUaGUKLWxpbWl0YXRpb24gaXMgZHVlIHRvIHRoZSB1c2Ugb2Ygc2luZ2xlIHRyYW5zcG9ydCBjb25uZWN0aW9ucyB0byBpbnZva2UgdGhlCi1XZWIgc2VydmljZSBhbmQgcmV0cmlldmUgdGhlIHJlc3BvbnNlLiBJbiBvdGhlciB3b3JkcywgdGhlIGNsaWVudCBBUEkgcHJvdmlkZXMgYQotbm9uLWJsb2NraW5nIGludm9jYXRpb24gbWVjaGFuaXNtIGZvciBkZXZlbG9wZXJzLCBidXQgdGhlIHJlcXVlc3QgYW5kIHRoZSByZXNwb25zZQotc3RpbGwgY29tZSBpbiBhIHNpbmdsZSB0cmFuc3BvcnQgKFR3by1XYXkgdHJhbnNwb3J0KSBjb25uZWN0aW9uIGxpa2UgSFRUUC4gTG9uZwotcnVubmluZyBXZWIgc2VydmljZSBpbnZvY2F0aW9ucyBvciBXZWIgc2VydmljZSBpbnZvY2F0aW9ucyB1c2luZyBPbmUtV2F5Ci10cmFuc3BvcnRzIHN1Y2ggYXMgU01UUCBjYW5ub3QgYmUgdXRpbGl6ZWQgYnkgc2ltcGx5IHVzaW5nIGEgbm9uLWJsb2NraW5nCi1BUEkgaW52b2NhdGlvbi48L3A+Ci0KLTxwPlRoZSBzaW1wbGVzdCBzb2x1dGlvbiBpcyB0byB1c2Ugc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25zIChlaXRoZXIKLU9uZS1XYXkgb3IgVHdvLVdheSkgZm9yIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZS4gVGhlIG5leHQgcHJvYmxlbSB0aGF0IG5lZWRzCi10byBiZSBzb2x2ZWQsIGhvd2V2ZXIsIGlzIHN1YnNlcXVlbnRseSBjb3JyZWxhdGluZyBlYWNoIHJlcXVlc3Qgd2l0aCBpdHMgcmVzcG9uc2UuCi08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2FkZHIvIiB0YXJnZXQ9Il9ibGFuayI+V1MtQWRkcmVzc2luZzwvYT4KLXByb3ZpZGVzIGEgbmVhdCBzb2x1dGlvbiB0byB0aGlzIHVzaW5nICZsdDt3c2E6TWVzc2FnZUlEJmd0OyBhbmQKLSZsdDt3c2E6UmVsYXRlc1RvJmd0OyBoZWFkZXJzLiBBeGlzMiBwcm92aWRlcyBzdXBwb3J0IGZvciBhbiBhZGRyZXNzaW5nIGJhc2VkCi1jb3JyZWxhdGlvbiBtZWNoYW5pc20gYW5kIGEgY29tcGx5aW5nIENsaWVudCBBUEkgdG8gaW52b2tlIFdlYiBzZXJ2aWNlcyB3aXRoCi10d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zLiAoVGhlIGNvcmUgb2YgQXhpczIgZG9lcyBub3QgZGVwZW5kIG9uCi1XUy1BZGRyZXNzaW5nLCBidXQgY29udGFpbnMgYSBzZXQgb2YgcGFyYW1ldGVycywgbGlrZSBpbiBhZGRyZXNzaW5nLCB0aGF0IGNhbgotYmUgcG9wdWxhdGVkIGJ5IGFueSBtZXRob2QuIFdTLUFkZHJlc3NpbmcgaXMgb25lIG9mIHRoZSB1c2VzIHRoYXQgbWF5Ci1wb3B1bGF0ZSB0aGVtLiBFdmVuIHRoZSB0cmFuc3BvcnRzIGNhbiBwb3B1bGF0ZSB0aGVtLiBIZW5jZSwgQXhpczIgaGFzIHRoZQotZmxleGliaWxpdHkgdG8gdXNlIGRpZmZlcmVudCBhZGRyZXNzaW5nIHN0YW5kYXJkcy4pPC9wPgotCi08cD5Vc2VycyBjYW4gc2VsZWN0IGJldHdlZW4gQmxvY2tpbmcgYW5kIE5vbi1CbG9ja2luZyBBUElzIGZvciB0aGUgV2ViCi1zZXJ2aWNlIGNsaWVudHMgd2l0aCB0d28gdHJhbnNwb3J0IGNvbm5lY3Rpb25zLiBCeSBzaW1wbHkgdXNpbmcgYSBib29sZWFuCi1mbGFnLCB0aGUgc2FtZSBBUEkgY2FuIGJlIHVzZWQgdG8gaW52b2tlIFdlYiBzZXJ2aWNlcyAoSU4tT1VUIG9wZXJhdGlvbnMpCi11c2luZyB0d28gc2VwYXJhdGUgdHJhbnNwb3J0IGNvbm5lY3Rpb25zLiBMZXQncyBzZWUgaG93IGl0J3MgZG9uZSB1c2luZyBhbgotZXhhbXBsZS4gVGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IHNob3dzIGhvdyB0byBpbnZva2UgdGhlIHNhbWUgImVjaG8iCi1vcGVyYXRpb24gdXNpbmcgTm9uLUJsb2NraW5nIEFQSSB3aXRoIHR3byB0cmFuc3BvcnQgY29ubmVjdGlvbnM8c3Ryb25nPi4gVGhlCi11bHRpbWF0ZSBhc3luY2hyb255ISE8L3N0cm9uZz48L3A+Ci08cHJlPgotICAgdHJ5IHsKLSAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRFY2hvT01FbGVtZW50KCk7Ci0KLSAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNobyIpOyAgLy8gdGhpcyBpcyB0aGUgYWN0aW9uIG1hcHBpbmcgd2UgcHV0IHdpdGhpbiB0aGUgc2VydmljZS54bWwKLQotICAgICAgLy9DYWxsYmFjayB0byBoYW5kbGUgdGhlIHJlc3BvbnNlCi0gICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKSk7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICB9Ci0gICAgICB9OwotCi0gICAgICAvL05vbi1CbG9ja2luZyBJbnZvY2F0aW9uICAgICAgICAgICAgCi0gICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOyAgICAgICAgICAgIAotICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZShuZXcgUU5hbWUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKSk7Ci0gICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsgICAgICAgICAgICAKLSAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsgICAgICAgICAgICAKLSAgIAotICAgICAgLy9XYWl0IHRpbGwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSByZXNwb25zZS4gICAgICAgICAgICAKLSAgICAgIHdoaWxlICghY2FsbGJhY2suaXNDb21wbGV0ZSgpKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOyAgICAgICAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgIAotICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgeyAgICAgICAgICAgIAotICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICB9IGZpbmFsbHkgewotICAgICAgdHJ5IHsKLSAgICAgICAgIC8vQ2xvc2UgdGhlIENsaWVudCBTaWRlIExpc3RlbmVyLgotICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgLy9oYXZlIHRvIGlnbm9yZSB0aGlzCi0gICAgICB9Ci0gICB9Ci08L3ByZT4KLQotPHA+VGhlIGJvb2xlYW4gZmxhZyAodmFsdWUgVHJ1ZSkgaW4gdGhlCi08Yj48Y29kZT5vcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIoLi4uKTwvY29kZT48L2I+IG1ldGhvZCBpbmZvcm1zIHRoZQotQXhpczIgZW5naW5lIHRvIHVzZSBzZXBhcmF0ZSB0cmFuc3BvcnQgY29ubmVjdGlvbnMgZm9yIHRoZSByZXF1ZXN0IGFuZAotcmVzcG9uc2UuIEZpbmFsbHkgPGI+PGNvZGU+c2VuZGVyLmNsZWFudXAoKTwvY29kZT48L2I+IGluZm9ybXMgdGhlIEF4aXMyCi1lbmdpbmUgdG8gc3RvcCB0aGUgY2xpZW50IHNpZGUgbGlzdGVuZXIsIHdoaWNoIHN0YXJ0ZWQgdG8gcmV0cmlldmUgdGhlCi1yZXNwb25zZS48L3A+Ci0KLTxwPlRvIHJ1biB0aGUgc2FtcGxlIGNsaWVudCAoIkVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQiKSB5b3UgY2FuIHNpbXBseSB1c2UKLXRoZSAicnVuLmNsaWVudC5ub25ibG9ja2luZ2R1YWwiIHRhcmdldCBvZiB0aGUgQW50IGZpbGUgZm91bmQgaW4gdGhlCi0iPHN0cm9uZz5BeGlzMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlLzwvc3Ryb25nPiIgZGlyZWN0b3J5LjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9lamItcHJvdmlkZXIueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2VqYi1wcm92aWRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDAwOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2VqYi1wcm92aWRlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPg0KLTx0aXRsZT5HdWlkZSB0byB1c2luZyBFSkIgUHJvdmlkZXIgZm9yIEF4aXMyPC90aXRsZT4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotImFtYXlhIDkuMi4xLCBzZWUgaHR0cDovL3d3dy53My5vcmcvQW1heWEvIiAvPg0KLTwvaGVhZD4NCi08Ym9keSB4bWw6bGFuZz0iZW4iPg0KLTxoMT5HdWlkZSB0byB1c2luZyBFSkIgUHJvdmlkZXIgZm9yIEF4aXMyPC9oMT4NCi08cD5UaGUgRUpCIG1lc3NhZ2UgcmVjZWl2ZXIgYWxsb3dzIG9uZSB0byBhY2Nlc3Mgc3RhdGVsZXNzIHNlc3Npb24NCi1FSkJzIChFbnRlcnByaXNlIEphdmFCZWFucykgdGhyb3VnaCBXZWIgc2VydmljZXMuIFRoZSBleGFtcGxlIHVzZWQNCi1pbiB0aGlzIGd1aWRlIGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgdGhlIEVKQiBwcm92aWRlciB0aGF0IHNoaXBzDQotd2l0aCBBeGlzMiB0byBhY2Nlc3MgRUpCcyBkZXBsb3llZCBvbiBhIEoyRUUgc2VydmVyIHN1Y2ggYXMNCi1HZXJvbmltbyBvciBKQm9zcy48L3A+DQotPHA+VGhpcyBleGFtcGxlIGV4cGxhaW5zIGhvdyB0byB1c2UgR2Vyb25pbW8gMS4xIGFuZCBKQm9zcyA0LjAuNC5HQQ0KLWFzIGFwcGxpY2F0aW9uIHNlcnZlci48L3A+DQotPHA+VGhlIGZvbGxvd2luZyBzdGVwcyB3aWxsIHRha2UgeW91IHRocm91Z2ggdGhlIGV4YW1wbGUgdGhyb3VnaA0KLXdoaWNoIHdlIHdpbGwgZXhwbGFpbiBob3cgdG8gdXNlIGFuIEVKQiBwcm92aWRlciBpbiBBeGlzMjwvcD4NCi08aDI+MS4gQ3JlYXRpbmcgYSBTaW1wbGUgU3RhdGVsZXNzIFNlc3Npb24gRUpCPC9oMj4NCi08cD5GaXJzdCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHN0YXRlbGVzcyBzZXNzaW9uIEVKQi4gVXNlIHRoZQ0KLWZvbGxvd2luZyBmaWxlcyB0byBtYWtlIGFuIEVKQiBmb3IgdGVzdGluZzo8L3A+DQotPHByZT4NCi1SZW1vdGUgaW50ZXJmYWNlIChIZWxsby5qYXZhKQ0KLXBhY2thZ2UgbXkuZWpiOw0KLWltcG9ydCBqYXZheC5lamIuRUpCT2JqZWN0Ow0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSGVsbG8gZXh0ZW5kcyBFSkJPYmplY3QsIEhlbGxvQnVzaW5lc3Mgew0KLX0NCi08L3ByZT4NCi08cD5UaGUgZm9sbG93aW5nIGludGVyZmFjZSBkZWZpbmVzIHRoZSBidXNpbmVzcyBtZXRob2RzIGF2YWlsYWJsZQ0KLWluPC9wPg0KLTxwPjxjb2RlPjEuPC9jb2RlPkhlbGxvQnVzaW5lc3MuamF2YTwvcD4NCi08cHJlPg0KLXBhY2thZ2UgbXkuZWpiOw0KLWltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247DQotDQotcHVibGljIGludGVyZmFjZSBIZWxsb0J1c2luZXNzIHsNCi0gICBwdWJsaWMgU3RyaW5nIHNheUhlbGxvKFN0cmluZyBuYW1lKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOw0KLX0NCi08L3ByZT4NCi08cD4yLCBSZW1vdGUgaG9tZSBpbnRlcmZhY2UgLSBIZWxsb0hvbWUuamF2YTwvcD4NCi08cHJlPg0KLXBhY2thZ2UgbXkuZWpiOw0KLWltcG9ydCBqYXZheC5lamIuRUpCSG9tZTsNCi1pbXBvcnQgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSGVsbG9Ib21lIGV4dGVuZHMgRUpCSG9tZSB7DQotICAgcHVibGljIEhlbGxvIGNyZWF0ZSgpIHRocm93cyBDcmVhdGVFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbjsNCi19DQotPC9wcmU+DQotPHA+My4gQmVhbiBjbGFzcyAtIEhlbGxvQmVhbi5qYXZhPC9wPg0KLTxwcmU+DQotcGFja2FnZSBteS5lamI7DQotaW1wb3J0IGphdmF4LmVqYi5TZXNzaW9uQmVhbjsNCi1pbXBvcnQgamF2YXguZWpiLlNlc3Npb25Db250ZXh0Ow0KLWltcG9ydCBqYXZheC5lamIuRUpCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBIZWxsb0JlYW4gaW1wbGVtZW50cyBTZXNzaW9uQmVhbiB7DQotICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNvbnRleHQoU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQpIHRocm93cw0KLSAgICAgIEVKQkV4Y2VwdGlvbiB7fQ0KLQ0KLSAgIHB1YmxpYyB2b2lkIGVqYlJlbW92ZSgpIHRocm93cyBFSkJFeGNlcHRpb24ge30NCi0gICBwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHRocm93cyBFSkJFeGNlcHRpb24ge30NCi0gICBwdWJsaWMgdm9pZCBlamJQYXNzaXZhdGUoKSB0aHJvd3MgRUpCRXhjZXB0aW9uIHt9DQotICAgcHVibGljIHZvaWQgZWpiQ3JlYXRlKCkgdGhyb3dzIENyZWF0ZUV4Y2VwdGlvbiB7fQ0KLQ0KLSAgIHB1YmxpYyBTdHJpbmcgc2F5SGVsbG8oU3RyaW5nIG5hbWUpIHsNCi0gICAgICByZXR1cm4gIkhlbGxvICIgKyBuYW1lICsgIiwgSGF2ZSBhIG5pY2UgZGF5ISI7DQotICAgfQ0KLQ0KLX0NCi08L3ByZT4NCi08cD40LiBEZXBsb3ltZW50IGRlc2NyaXB0b3IgLSBlamItamFyLnhtbDwvcD4NCi08cHJlPg0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7DQotJmx0O2VqYi1qYXIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiDQotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlDQotICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCINCi0gICAgICAgIHZlcnNpb249IjIuMSImZ3Q7DQotDQotICAmbHQ7ZW50ZXJwcmlzZS1iZWFucyZndDsNCi0gICAgICZsdDtzZXNzaW9uJmd0Ow0KLSAgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7SGVsbG8mbHQ7L2VqYi1uYW1lJmd0Ow0KLSAgICAgICAmbHQ7aG9tZSZndDtteS5lamIuSGVsbG9Ib21lJmx0Oy9ob21lJmd0Ow0KLSAgICAgICAmbHQ7cmVtb3RlJmd0O215LmVqYi5IZWxsbyZsdDsvcmVtb3RlJmd0Ow0KLSAgICAgICAmbHQ7ZWpiLWNsYXNzJmd0O215LmVqYi5IZWxsb0JlYW4mbHQ7L2VqYi1jbGFzcyZndDsNCi0gICAgICAgJmx0O3Nlc3Npb24tdHlwZSZndDtTdGF0ZWxlc3MmbHQ7L3Nlc3Npb24tdHlwZSZndDsNCi0gICAgICAgJmx0O3RyYW5zYWN0aW9uLXR5cGUmZ3Q7QmVhbiZsdDsvdHJhbnNhY3Rpb24tdHlwZSZndDsNCi0gICAgICZsdDsvc2Vzc2lvbiZndDsNCi0gICZsdDsvZW50ZXJwcmlzZS1iZWFucyZndDsNCi0gICZsdDthc3NlbWJseS1kZXNjcmlwdG9yJmd0Ow0KLSAgICAgJmx0O2NvbnRhaW5lci10cmFuc2FjdGlvbiZndDsNCi0gICAgICAgJmx0O21ldGhvZCZndDsNCi0gICAgICAgICAgJmx0O2VqYi1uYW1lJmd0O0hlbGxvJmx0Oy9lamItbmFtZSZndDsNCi0gICAgICAgICAgJmx0O21ldGhvZC1uYW1lJmd0OyombHQ7L21ldGhvZC1uYW1lJmd0Ow0KLSAgICAgICAmbHQ7L21ldGhvZCZndDsNCi0gICAgICAgJmx0O3RyYW5zLWF0dHJpYnV0ZSZndDtSZXF1aXJlZCZsdDsvdHJhbnMtYXR0cmlidXRlJmd0Ow0KLSAgICAgJmx0Oy9jb250YWluZXItdHJhbnNhY3Rpb24mZ3Q7DQotICAmbHQ7L2Fzc2VtYmx5LWRlc2NyaXB0b3ImZ3Q7DQotJmx0Oy9lamItamFyJmd0Ow0KLTwvcHJlPg0KLTxwPk5vdyB3ZSBoYXZlIHRvIHdyaXRlIGFwcGxpY2F0aW9uIHNlcnZlciBzcGVjaWZpYyBkZXBsb3ltZW50DQotZGVzY3JpcHRvcihzKSBmb3IgdGhlIEhlbGxvIEVKQi4gVGhlIGZvbGxvd2luZyBsaXN0aW5nIHNob3dzIGFuDQotZXhhbXBsZSBHZXJvbmltby9PcGVuRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcg0KLShvcGVuZWpiLWphci54bWwpPC9wPg0KLTxwcmU+DQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsNCi0mbHQ7b3BlbmVqYi1qYXIgDQotICAgIHhtbG5zPSJodHRwOi8vd3d3Lm9wZW5lamIub3JnL3htbC9ucy9vcGVuZWpiLWphci0yLjEiDQotICAgIHhtbG5zOm5hbWluZz0iaHR0cDovL2dlcm9uaW1vLmFwYWNoZS5vcmcveG1sL25zL25hbWluZy0xLjEiDQotICAgIHhtbG5zOnNlY3VyaXR5PSJodHRwOi8vZ2Vyb25pbW8uYXBhY2hlLm9yZy94bWwvbnMvc2VjdXJpdHktMS4xIg0KLSAgICB4bWxuczpzeXM9Imh0dHA6Ly9nZXJvbmltby5hcGFjaGUub3JnL3htbC9ucy9kZXBsb3ltZW50LTEuMSINCi0gICAgeG1sbnM6cGtnZW49Imh0dHA6Ly93d3cub3BlbmVqYi5vcmcveG1sL25zL3BrZ2VuLTIuMCImZ3Q7DQotICAgICZsdDtlbnRlcnByaXNlLWJlYW5zJmd0Ow0KLSAgICAgICAgJmx0O3Nlc3Npb24mZ3Q7DQotICAgICAgICAgICAgJmx0O2VqYi1uYW1lJmd0O0hlbGxvJmx0Oy9lamItbmFtZSZndDsNCi0gICAgICAgICAgICAmbHQ7am5kaS1uYW1lJmd0O215L2VqYi9IZWxsb0JlYW4mbHQ7L2puZGktbmFtZSZndDsNCi0gICAgICAgICZsdDsvc2Vzc2lvbiZndDsNCi0gICAgJmx0Oy9lbnRlcnByaXNlLWJlYW5zJmd0Ow0KLSZsdDsvb3BlbmVqYi1qYXImZ3Q7DQotPC9wcmU+DQotPHA+SWYgeW91IHdhbnQgdG8gdGVzdCBvbiBKQm9zcywgdXNlIHRoZSBmb2xsb3dpbmcgSkJvc3MgZGVwbG95bWVudA0KLWRlc2NyaXB0b3IgKGpib3NzLnhtbCk8L3A+DQotPHByZT4NCi0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsNCi0mbHQ7IURPQ1RZUEUgamJvc3MgUFVCTElDICItLy9KQm9zcy8vRFREIEpCT1NTIDQuMC8vRU4iDQotICAgICAgImh0dHA6Ly93d3cuamJvc3Mub3JnL2oyZWUvZHRkL2pib3NzXzRfMC5kdGQiJmd0Ow0KLSZsdDtqYm9zcyZndDsNCi0gICAgJmx0O2VudGVycHJpc2UtYmVhbnMmZ3Q7DQotICAgICAgJmx0O3Nlc3Npb24mZ3Q7DQotICAgICAgICAgJmx0O2VqYi1uYW1lJmd0O0hlbGxvJmx0Oy9lamItbmFtZSZndDsNCi0gICAgICAgICAmbHQ7am5kaS1uYW1lJmd0O215L2VqYi9IZWxsb0JlYW4mbHQ7L2puZGktbmFtZSZndDsNCi0gICAgICAmbHQ7L3Nlc3Npb24mZ3Q7DQotICAgICZsdDsvZW50ZXJwcmlzZS1iZWFucyZndDsNCi0mbHQ7L2pib3NzJmd0Ow0KLTwvcHJlPg0KLTxwPkNvbXBpbGUgdGhlIGFib3ZlIGphdmEgY2xhc3NlcyBhbmQgYnVuZGxlIHRoZSBjb21waWxlZCBjbGFzc2VzDQotYW5kIHRoZSBYTUwgZmlsZXMgaW50byBhIGphciBmaWxlIChIZWxsb0VKQi5qYXIpIGFzIHNob3duDQotYmVsb3cuPC9wPg0KLTxwcmU+DQotIA0KLUhlbGxvRUpCLmphcg0KLSAgfA0KLSAgKy0tTUVUQS1JTkYNCi0gIHwgICAgKy0tZWpiLWphci54bWwNCi0gIHwgICAgKy0tamJvc3MueG1sIFtJZiB5b3Ugd2FudCB0byBkZXBsb3kgb24gSmJvc3NdDQotICB8ICAgICstLW9wZW5lamItamFyLnhtbCAgW0lmIHlvdSB3YW50IHRvIGRlcGxveSBvbiBHZXJvbmltby9PcGVuZWpiXQ0KLSAgfA0KLSAgKy0tbXkNCi0gICAgICAgKy0tZWpiDQotICAgICAgICAgICAgIHwNCi0gICAgICAgICAgICAgKy0tSGVsbG8uY2xhc3MNCi0gICAgICAgICAgICAgKy0tSGVsbG9CZWFuLmNsYXNzDQotICAgICAgICAgICAgICstLUhlbGxvQnVzaW5lc3MuY2xhc3MNCi0gICAgICAgICAgICAgKy0tSGVsbG9Ib21lLmNsYXNzDQotIA0KLTwvcHJlPg0KLTxwPk5leHQsIGRlcGxveSB0aGUgSGVsbG9FSkIuamFyIGZpbGUgb250byB0aGUgYXBwcm9wcmlhdGUgSjJFRQ0KLWFwcGxpY2F0aW9uIHNlcnZlci48L3A+DQotPGgyPkNyZWF0aW5nIHRoZSBBeGlzMiBTZXJ2aWNlIEFyY2hpdmU8L2gyPg0KLTxwPk5vdyB3ZSBuZWVkIHRvIG1ha2UgdGhlIHNlcnZpY2VzLnhtbCBmaWxlLjwvcD4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlR3JvdXAmZ3Q7DQotICAgICZsdDtzZXJ2aWNlIG5hbWU9IkhlbGxvQmVhblNlcnZpY2UiJmd0Ow0KLSAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0O0hlbGxvISB3ZWIgc2VydmljZSZsdDsvZGVzY3JpcHRpb24mZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVycyZndDsNCi0gICAgICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuZWpiLkVKQkluT25seU1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuZWpiLkVKQk1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAgICAgJmx0Oy9tZXNzYWdlUmVjZWl2ZXJzJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiJmd0O215LmVqYi5IZWxsb0J1c2luZXNzJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9InJlbW90ZUludGVyZmFjZU5hbWUiJmd0O215LmVqYi5IZWxsbyZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJob21lSW50ZXJmYWNlTmFtZSImZ3Q7bXkuZWpiLkhlbGxvSG9tZSZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJiZWFuSm5kaU5hbWUiJmd0O215L2VqYi9IZWxsb0JlYW4mbHQ7L3BhcmFtZXRlciZndDsNCi0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0icHJvdmlkZXJVcmwiJmd0O1tVUkxdJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImpuZGlDb250ZXh0Q2xhc3MiJmd0O1tDb250ZXh0IEZhY3RvcnkgQ2xhc3MNCi0gICAgICAgICAgICAgTmFtZV0mbHQ7L3BhcmFtZXRlciZndDsNCi0gICAgICZsdDsvc2VydmljZSZndDsNCi0mbHQ7L3NlcnZpY2VHcm91cCZndDsNCi08L3ByZT4NCi08cD5JbiB0aGUgYWJvdmUgc2VydmljZXMueG1sIGZpbGUsIHJlcGxhY2UgdGhlIFtVUkxdIGFuZCBbQ29udGV4dA0KLUZhY3RvcnkgQ2xhc3MgTmFtZV0gd2l0aCB2YWxpZCB2YWx1ZXMgYXMgZm9sbG93czo8L3A+DQotPHA+PHN0cm9uZz5pLmUuIElmIHRoZSBFSkIgaXMgZGVwbG95ZWQgb24gR2Vyb25pbW86PC9zdHJvbmc+PC9wPg0KLTxwPlJlcGxhY2UgW1VSTF0gYnkgMTI3LjAuMC4xOjQyMDE8L3A+DQotPHA+UmVwbGFjZSBbQ29udGV4dCBGYWN0b3J5IENsYXNzIE5hbWVdIGJ5DQotb3JnLm9wZW5lamIuY2xpZW50LkpORElDb250ZXh0PC9wPg0KLTxwPjxzdHJvbmc+Rm9yIEpib3NzOjwvc3Ryb25nPjwvcD4NCi08cD5SZXBsYWNlIFtVUkxdIGJ5IGpucDovL2xvY2FsaG9zdDoxMDk5PC9wPg0KLTxwPlJlcGxhY2UgW0NvbnRleHQgRmFjdG9yeSBDbGFzcyBOYW1lXSBieQ0KLW9yZy5qbnAuaW50ZXJmYWNlcy5OYW1pbmdDb250ZXh0RmFjdG9yeTwvcD4NCi08cD5CdW5kbGUgdGhlIEhlbGxvQmVhblNlcnZpY2Uud3NkbCwgc2VydmljZXMueG1sLCByZW1vdGUgaW50ZXJmYWNlDQotY2xhc3MgYW5kIGhvbWUgaW50ZXJmYWNlIGNsYXNzIGFzIGlsbHVzdHJhdGVkIGJlbG93OjwvcD4NCi08cHJlPg0KLSANCi1IZWxsb0JlYW5TZXJ2aWNlLmFhcg0KLSAgfA0KLSAgKy0tTUVUQS1JTkYNCi0gIHwgICAgKy0tc2VydmljZXMueG1sDQotICB8DQotICArLS1saWINCi0gIHwgICAgKy0tW2phcnMgdXNlZCBieSB0aGUgZWpiIGNsaWVudCBlZy5pbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzc2VzXQ0KLSAgfA0KLSAgKy0tbXkNCi0gICAgICAgKy0tZWpiDQotICAgICAgICAgICAgICstLUhlbGxvLmNsYXNzDQotICAgICAgICAgICAgICstLUhlbGxvQnVzaW5lc3MuY2xhc3MNCi0gICAgICAgICAgICAgKy0tSGVsbG9Ib21lLmNsYXNzDQotIA0KLTwvcHJlPg0KLTxwPlRoZSBsaWIgZGlyZWN0b3J5IG9mIEhlbGxvQmVhblNlcnZpY2UuYWFyIG11c3QgY29udGFpbiBhbGwgdGhlDQotbGlicmFyaWVzIG5lZWRlZCB0byBhY2Nlc3MgdGhlIEVKQi4gSWYgdGhlIEVKQiBpcyBkZXBsb3llZCBvbg0KLTxzdHJvbmc+R2Vyb25pbW88L3N0cm9uZz4sIGFkZCB0aGUgZm9sbG93aW5nIGphciBmaWxlcyB0byB0aGUgbGliDQotZGlyZWN0b3J5LjwvcD4NCi08dWw+DQotPGxpPmNnbGliLW5vZGVwLTIuMV8zLmphcjwvbGk+DQotPGxpPmdlcm9uaW1vLWVqYl8yLjFfc3BlYy0xLjAuMS5qYXI8L2xpPg0KLTxsaT5nZXJvbmltby1qMmVlLWphY2NfMS4wX3NwZWMtMS4wLjEuamFyPC9saT4NCi08bGk+Z2Vyb25pbW8ta2VybmVsLTEuMS5qYXI8L2xpPg0KLTxsaT5nZXJvbmltby1zZWN1cml0eS0xLjEuamFyPC9saT4NCi08bGk+b3BlbmVqYi1jb3JlLTIuMS5qYXI8L2xpPg0KLTwvdWw+DQotPHA+Rm9yIDxzdHJvbmc+SkJvc3M8L3N0cm9uZz4gYWRkIHRoZSBmb2xsb3dpbmcgamFyIGZpbGVzLjwvcD4NCi08dWw+DQotPGxpPmpucC1jbGllbnQuamFyPC9saT4NCi08bGk+amJvc3MtY2xpZW50LmphcjwvbGk+DQotPGxpPmpib3NzLWNvbW1vbi1jbGllbnQuamFyPC9saT4NCi08bGk+amJvc3MtcmVtb3RpbmcuamFyPC9saT4NCi08bGk+amJvc3Mtc2VyaWFsaXphdGlvbi5qYXI8L2xpPg0KLTxsaT5qYm9zcy10cmFuc2FjdGlvbi1jbGllbnQuamFyPC9saT4NCi08bGk+Y29uY3VycmVudC5qYXI8L2xpPg0KLTxsaT5qYm9zc3N4LWNsaWVudC5qYXI8L2xpPg0KLTxsaT5qYm9zcy1qMmVlLmphcjwvbGk+DQotPC91bD4NCi08cD5EZXBsb3kgSGVsbG9CZWFuU2VydmljZS5hYXIgb24gYW4gQXhpczIgc2VydmVyLjwvcD4NCi08cD5Ob3cgeW91IGNhbiBhY2Nlc3MgdGhlIEhlbGxvIEVKQiB0aHJvdWdoIFdlYiBzZXJ2aWNlcy4gU2luY2Ugb3VyDQotRUpCIG1lc3NhZ2UgcmVjZWl2ZXJzIGV4dGVuZCBSUEMgbWVzc2FnZSByZWNlaXZlcnMsDQotb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50LlJQQ1NlcnZpY2VDbGllbnQgY2FuIGJlIHVzZWQgdG8gaW52b2tlDQotdGhlIHNlcnZpY2UgYXMgaWxsdXN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50LjwvcD4NCi08cHJlPg0KLS4uLg0KLQ0KLVJQQ1NlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBSUENTZXJ2aWNlQ2xpZW50KCk7DQotT3B0aW9ucyBvcHRpb25zID0gc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCk7DQotDQotRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3DQotICAgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9IZWxsb0JlYW5TZXJ2aWNlIik7DQotDQotb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KLVFOYW1lIGhlbGxvID0gbmV3IFFOYW1lKCJodHRwOi8vZWpiLm15L3hzZCIsICJzYXlIZWxsbyIpOw0KLU9iamVjdFtdIGhlbGxvQXJncyA9IG5ldyBPYmplY3RbXSB7IkpvaG4ifTsNCi0NCi1TeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhoZWxsbywNCi0gICBoZWxsb0FyZ3MpLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSk7DQotDQotLi4uDQotPC9wcmU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaHR0cC10cmFuc3BvcnQueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2h0dHAtdHJhbnNwb3J0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNGVhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaHR0cC10cmFuc3BvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHZlcnNpb249Ii0vL1czQy8vRFREWEhUTUwxLjEvL0VOIj4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPgotICA8dGl0bGU+SFRUUCB0cmFuc3BvcnRzPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0gIG1lZGlhPSJhbGwiLz4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iZW4iPgotPGEgbmFtZT0iY29uZmlnVHJhbnNwb3J0Ij48L2E+Ci0KLTxoMT5IVFRQIFRyYW5zcG9ydDwvaDE+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgY292ZXJzIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZpbmcgb2YgU09BUCBtZXNzYWdlcyB3aXRoIEF4aXMyIHVzaW5nIEhUVFAKLWFzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtLjwvcD4KLQotPGgyPkNvbnRlbnRzPC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiNDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Q29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI8L2E+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiNodHRwc3VwcG9ydCI+SFRUUFMgc3VwcG9ydDwvYT48L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0gIDxsaT48YSBocmVmPSIjdGltZW91dF9jb25maWciPlRpbWVvdXQgQ29uZmlndXJhdGlvbjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3ZlcnNpb25fY29uZmlnIj5IVFRQIFZlcnNpb24gQ29uZmlndXJhdGlvbjwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2F1dGgiPlByb3h5IEF1dGhlbnRpY2F0aW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcHJlZW1wdGl2ZV9hdXRoIj5CYXNpYywgRGlnZXN0IGFuZCBOVExNIEF1dGhlbnRpY2F0aW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcmV1c2luZ19odHRwY2xpZW50X29iamVjdCI+UmV1c2luZyB0aGUgaHR0cGNsaWVudCBvYmplY3Q8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNzZXR0aW5nX2NhY2hlZF9odHRwY2xpZW50X29iamVjdCI+U2V0dGluZyB0aGUgY2FjaGVkIGh0dHBjbGllbnQgb2JqZWN0PC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0iQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPjwvYT4KLQotPGgyPkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyPC9oMj4KLQotPHA+Q29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIgaXMgdGhlIHRyYW5zcG9ydCBzZW5kZXIgdGhhdCBpcyB1c2VkIGJ5IGRlZmF1bHQgaW4gYm90aAotdGhlIFNlcnZlciBhbmQgQ2xpZW50IEFQSXMuIEFzIGl0cyBuYW1lIGltcGxpZXMsIGl0IGlzIGJhc2VkIG9uIDxhCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6c3BhY2U9InByZXNlcnZlIiBocmVmPSJodHRwOi8vaGMuYXBhY2hlLm9yZy9odHRwY2xpZW50LTMueC8iPmNvbW1vbnMtaHR0cGNsaWVudC0zLjE8L2E+LgotRm9yIG1heGltdW0gZmxleGliaWxpdHksIHRoaXMgc2VuZGVyIHN1cHBvcnRzIGJvdGggdGhlIEhUVFAgR0VUIGFuZCBQT1NUIGludGVyZmFjZXMuCi0oUkVTVCBpbiBBeGlzMiBhbHNvIHN1cHBvcnRzIGJvdGggaW50ZXJmYWNlcy4pPC9wPgotCi08cD5BeGlzMiB1c2VzIGEgc2luZ2xlIEhUVFBDbGllbnQgaW5zdGFuY2UgcGVyIENvbmZpZ3VyYXRpb25Db250ZXh0ICh3aGljaCB1c3VhbGx5IG1lYW5zIHBlciBpbnN0YW5jZQotb2YgU2VydmljZUNsaWVudCkuICBUaGlzIHBhdHRlcm4gYWxsb3dzIGZvciBIVFRQIDEuMSB0byBhdXRvbWF0aWNhbGx5IHJldXNlIFRDUCBjb25uZWN0aW9ucyAtIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgQXhpczIgdGhlIFJFVVNFX0hUVFBfQ0xJRU5UIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgd2FzIG5lY2Vzc2FyeSB0byBlbmFibGUgdGhpcyBmdW5jdGlvbmFsaXR5LCBidXQgYXMgb2YgMS41IHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS48L3A+Ci0KLTxwPkNvbW1vbnMgSHR0cENsaWVudCBhbHNvIHByb3ZpZGVzIEhUVFAgMS4xLCBDaHVua2luZyBhbmQgS2VlcEFsaXZlIHN1cHBvcnQgZm9yIEF4aXMyLjwvcD4KLQotCi08cD5UaGUgJmx0O3RyYW5zcG9ydFNlbmRlci8mZ3Q7IGVsZW1lbnQgZGVmaW5lcyB0cmFuc3BvcnQgc2VuZGVycyBpbgotdGhlIGF4aXMyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUgYXMgZm9sbG93czo8L3A+Ci08cHJlPgotJmx0O3RyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciImZ3Q7Ci0gICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIiZndDtIVFRQLzEuMSZsdDsvcGFyYW1ldGVyJmd0OwotICAgJmx0O3BhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyImZ3Q7Y2h1bmtlZCZsdDsvcGFyYW1ldGVyJmd0OwotJmx0Oy90cmFuc3BvcnRTZW5kZXImZ3Q7Ci08L3ByZT4KLQotPHA+VGhlIGFib3ZlIGNvZGUgc25pcHBldCBzaG93cyB0aGUgc2ltcGxlc3QgY29uZmlndXJhdGlvbiBvZiBhIHRyYW5zcG9ydAotc2VuZGVyIGZvciBjb21tb24gdXNlLiBUaGUgJmx0O3BhcmFtZXRlci8mZ3Q7IGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwKLWNvbnN0cmFpbnRzIHRoYXQgdGhlIHNlbmRlciBzaG91bGQgY29tcGx5IHdpdGguIFRoZSBIVFRQIFBST1RPQ09MIHBhcmFtZXRlcgotc2hvdWxkIGJlIHNldCBhcyBIVFRQLzEuMCBvciBIVFRQLzEuMS4gVGhlIGRlZmF1bHQgdmVyc2lvbiBpcyBIVFRQLzEuMS4gTm90ZSB0aGF0Ci1jaHVua2luZyBzdXBwb3J0IGlzIGF2YWlsYWJsZSBvbmx5IGZvciBIVFRQLzEuMS4gVGh1cywgZXZlbiBpZiAiY2h1bmtlZCIgaXMgc3BlY2lmaWVkCi1hcyBhIHBhcmFtZXRlciwgaWYgdGhlIEhUVFAgdmVyc2lvbiBpcyAxLjAsIHRoaXMgc2V0dGluZyB3aWxsIGJlCi1pZ25vcmVkIGJ5IHRoZSB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBbHNvLCBLZWVwQWxpdmUgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluCi1IVFRQLzEuMS48L3A+Ci08cD5JZiB5b3UgdXNlIEhUVFAxLjEgZm9yIGl0cyBLZWVwLUFsaXZlIGFiaWxpdHksIGJ1dCB5b3UgbmVlZCB0byBkaXNhYmxlCi1jaHVua2luZyBhdCBydW50aW1lIChzb21lIHNlcnZlcnMgZG9uJ3QgYWxsb3cgY2h1bmtlZCByZXF1ZXN0cyB0bwotcHJldmVudCBkZW5pYWwgb2Ygc2VydmljZSksIHlvdSBjYW4gZG8gc28gaW4gdGhlIFN0dWI6Ci08L3A+Ci0gICAgCi08cHJlPgotb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNIVU5LRUQsICJmYWxzZSIpOwotPC9wcmU+Ci0KLTxwPlNvbWUgYWJzb2x1dGUgcHJvcGVydGllcyBhcmUgcHJvdmlkZWQgYXQgcnVudGltZSBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUsIGNoYXJhY3RlcgotZW5jb2Rpbmcgc3R5bGUgKFVURi04LCBVVEYtMTYsIGV0Yy4pIGlzIHByb3ZpZGVkIHZpYSBNZXNzYWdlQ29udGV4dC48L3A+Ci08YSBuYW1lPSJodHRwc3VwcG9ydCI+PC9hPgotCi08aDM+SFRUUFMgc3VwcG9ydDwvaDM+Ci1Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciBjYW4gYmUgYWxzbyB1c2VkIHRvIGNvbW11bmljYXRlIG92ZXIgaHR0cHMuCi0KLTxwcmU+Ci0gICAmbHQ7dHJhbnNwb3J0U2VuZGVyIG5hbWU9IjxiPmh0dHBzPC9iPiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiJmd0OwotICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCImZ3Q7SFRUUC8xLjEmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciJmd0O2NodW5rZWQmbHQ7L3BhcmFtZXRlciZndDsKLSAgICZsdDsvdHJhbnNwb3J0U2VuZGVyJmd0OwotPC9wcmU+Ci0KLTxwPlBsZWFzZSBub3RlIHRoYXQgYnkgZGVmYXVsdCBIVFRQUyB3b3JrcyBvbmx5IHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdAotZXhwZWN0IHRvIGF1dGhlbnRpY2F0ZSB0aGUgY2xpZW50cyAoMS13YXkgU1NMIG9ubHkpIGFuZCB3aGVyZSB0aGUKLXNlcnZlciBoYXMgdGhlIGNsaWVudHMnIHB1YmxpYyBrZXlzIGluIGl0cyB0cnVzdCBzdG9yZS4KLQotSWYgeW91IHdhbnQgdG8gcGVyZm9ybSBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uICgyLXdheSBTU0wpLCB5b3UgbWF5Ci11c2UgdGhlIFByb3RvY29sLnJlZ2lzdGVyUHJvdG9jb2wgZmVhdHVyZSBvZiBIdHRwQ2xpZW50LiBZb3UgY2FuCi1vdmVyd3JpdGUgdGhlICJodHRwcyIgcHJvdG9jb2wsIG9yIHVzZSBhIGRpZmZlcmVudCBwcm90b2NvbCBmb3IgeW91cgotU1NMIGNsaWVudCBhdXRoZW50aWNhdGlvbiBjb21tdW5pY2F0aW9ucyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBtZXNzCi13aXRoIHJlZ3VsYXIgaHR0cHMuIEZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhdAotPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2h0dHBjbGllbnQvc3NsZ3VpZGUuaHRtbCI+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2h0dHBjbGllbnQvc3NsZ3VpZGUuaHRtbDwvYT48L3A+Ci08YSBuYW1lPSJ0aW1lb3V0X2NvbmZpZyI+PC9hPgotCi08aDI+VGltZW91dCBDb25maWd1cmF0aW9uPC9oMj4KLQotPHA+VHdvIHRpbWVvdXQgaW5zdGFuY2VzIGV4aXN0IGluIHRoZSB0cmFuc3BvcnQgbGV2ZWwsIFNvY2tldCB0aW1lb3V0IAotYW5kIENvbm5lY3Rpb24gdGltZW91dC4gVGhlc2UgY2FuIGJlIGNvbmZpZ3VyZWQgZWl0aGVyIGF0IGRlcGxveW1lbnQKLW9yIHJ1biB0aW1lLiAgSWYgY29uZmlndXJpbmcgYXQgZGVwbG95bWVudCB0aW1lLCB0aGUgdXNlciBoYXMgdG8gYWRkIHRoZQotZm9sbG93aW5nIGxpbmVzIGluIGF4aXMyLnhtbC48L3A+Ci0KLTxwPkZvciBTb2NrZXQgdGltZW91dDo8L3A+Ci08cHJlPiZsdDtwYXJhbWV0ZXIgbmFtZT0iU09fVElNRU9VVCImZ3Q7c29tZV9pbnRlZ2VyX3ZhbHVlJmx0Oy9wYXJhbWV0ZXImZ3Q7PC9wcmU+Ci0KLTxwPkZvciBDb25uZWN0aW9uIHRpbWVvdXQ6PC9wPgotPHByZT4gJmx0O3BhcmFtZXRlciBuYW1lPSJDT05ORUNUSU9OX1RJTUVPVVQiJmd0O3NvbWVfaW50ZWdlcl92YWx1ZSZsdDsvcGFyYW1ldGVyJmd0OzwvcHJlPgotPGJyLz4KLQotRm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbiwgaXQgY2FuIGJlIHNldCBhcyBmb2xsb3dzIHdpdGhpbiB0aGUgY2xpZW50IHN0dWI6PHNvdXJjZT4KLTxwcmU+Ci0uLi4KLU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci1vcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuU09fVElNRU9VVCwgbmV3IEludGVnZXIodGltZU91dEluTWlsbGlTZWNvbmRzKSk7Ci1vcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VULCBuZXcgSW50ZWdlcih0aW1lT3V0SW5NaWxsaVNlY29uZHMpKTsKLQotLy8gb3IKLW9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKHRpbWVPdXRJbk1pbGxpU2Vjb25kcyk7Ci0uLi4KLTwvcHJlPgotCi08L3NvdXJjZT48YSBuYW1lPSJ2ZXJzaW9uX2NvbmZpZyI+PC9hPgotCi08aDI+SFRUUCBWZXJzaW9uIENvbmZpZ3VyYXRpb248L2gyPgotCi08cD5UaGUgZGVmYXVsdCBIVFRQIHZlcnNpb24gaXMgMS4xLiBUaGVyZSBhcmUgdHdvIG1ldGhvZHMgaW4gd2hpY2ggdGhlIHVzZXIKLWNhbiBjaGFuZ2UgdGhlIEhUVFAgdmVyc2lvbiB0byAxLjA8L3A+Ci08dWw+Ci0gIDxsaT5CeSBkZWZpbmluZyB0aGUgdmVyc2lvbiBpbiBheGlzMi54bWwgYXMgc2hvd24gYmVsb3cuCi0gIDxwcmU+ICZsdDtwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiJmd0O0hUVFAvMS4wJmx0Oy9wYXJhbWV0ZXImZ3Q7PC9wcmU+PC9saT4KLSAgPGxpPkJ5IGNoYW5naW5nIHRoZSB2ZXJzaW9uIGF0IHJ1bnRpbWUgYnkgdXNpbmcgY29kZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6Ci08cHJlPgotLi4uCi1vcHRpb25zLnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dENvbnN0YW50cy5IVFRQX1BST1RPQ09MX1ZFUlNJT04sCi0gICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzEwKTsKLS4uLgotPC9wcmU+PC9saT4KLTwvdWw+Ci08YSBuYW1lPSJhdXRoIj48L2E+Ci0KLTxoMj5Qcm94eSBBdXRoZW50aWNhdGlvbjwvaDI+Ci0KLTxwPlRoZSBDb21tb25zLWh0dHAgY2xpZW50IGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvciBwcm94eQotYXV0aGVudGljYXRpb24uIEF4aXMyIHVzZXMgZGVwbG95bWVudCB0aW1lIGFuZCBydW50aW1lIG1lY2hhbmlzbXMgdG8KLWF1dGhlbnRpY2F0ZSBwcm94aWVzLiBBdCBkZXBsb3ltZW50IHRpbWUsIHRoZSB1c2VyIGhhcyB0byBjaGFuZ2UgdGhlCi1heGlzMi54bWwgYXMgZm9sbG93cy4gVGhpcyBhdXRoZW50aWNhdGlvbiBpcyBhdmFpbGFibGUgZm9yIGJvdGggSFRUUCBhbmQKLUhUVFBTLjwvcD4KLTxwcmU+Ci0mbHQ7dHJhbnNwb3J0U2VuZGVyIG5hbWU9IjxiPmh0dHA8L2I+IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciImZ3Q7Ci0gICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIiZndDtIVFRQLzEuMSZsdDsvcGFyYW1ldGVyJmd0OwotICAgJmx0O3BhcmFtZXRlciBuYW1lPSJQUk9YWSIgcHJveHlfaG9zdD0icHJveHlfaG9zdF9uYW1lIiBwcm94eV9wb3J0PSJwcm94eV9ob3N0X3BvcnQiCi0gICAgICAmZ3Q7dXNlck5hbWU6ZG9tYWluOnBhc3NXb3JkJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0mbHQ7L3RyYW5zcG9ydFNlbmRlciZndDs8L3ByZT4KLQotPHA+Rm9yIGEgcGFydGljdWxhciBwcm94eSwgaWYgYXV0aGVudGljYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgZW50ZXIgdGhlCi0idXNlck5hbWU6ZG9tYWluOnBhc3NXb3JkIiBhcyAiYW5vbnltb3VzOmFub255bW91czphbm9ueW1vdXMiLjwvcD4KLQotPHA+UHJpb3Igc2hvd24gY29uZmlndXJhdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkIGFmdGVyIEF4aXMyIDEuMiByZWxlYXNlIGFuZCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdXNpbmcgdGhlIG5ldwotcHJveHkgY29uZmlndXJhdGlvbiBhcyBiZWxvdy4gPC9wPgotPHA+Ci0gICAgTmV3IHByb3h5IGNvbmZpZ3VyYXRpb24gd291bGQgcmVxdWlyZSB0aGUgdXNlciB0byBhZGQgYSBUT1AgbGV2ZWwgcGFyYW1ldGVyIGluIHRoZSBheGlzMi54bWwgbmFtZWQgIlByb3h5Ii4KLTwvcD4KLSAgICA8cHJlPgotICAgICAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlByb3h5IiZndDsKLSAgICAgICAgICAgICAmbHQ7Q29uZmlndXJhdGlvbiZndDsKLSAgICAgICAgICAgICAgICAgICAgICAmbHQ7UHJveHlIb3N0Jmd0O2V4YW1wbGUub3JnJmx0Oy9Qcm94eUhvc3QmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgJmx0O1Byb3h5UG9ydCZndDs1Njc4Jmx0Oy9Qcm94eVBvcnQmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgJmx0O1Byb3h5VXNlciZndDtFWEFNUExFXHNhbWluZGEmbHQ7L1Byb3h5VXNlciZndDsKLSAgICAgICAgICAgICAgICAgICAgICAmbHQ7UHJveHlQYXNzd29yZD5wcHAmbHQ7L1Byb3h5UGFzc3dvcmQmZ3Q7Ci0gICAgICAgICAgICAgICZsdDsvQ29uZmlndXJhdGlvbiZndDsKLSZsdDsvcGFyYW1ldGVyJmd0OwotICAgIDwvcHJlPgotCi0gICAgPHA+IFRodXMsIGlmIGl0cyBhIG9wZW4gcHJveHksIHVzZXIgY2FuIGlnbm9yZSBQcm94eVVzZXIgYW5kIFByb3h5UGFzc3dvcmQgZWxlbWVudHMuIDwvcD4KLQotICAgIDxwPkluIGFkZGl0aW9uIHRvIHRoaXMsIGlmIHlvdSBkb24ndCB3YW50IHRvIGdvIHRocm91Z2ggd3JpdGluZyB0aGUgYWJvdmUgcGFyYW1ldGVyIHlvdSBjb3VsZAotICAgICAgICB1c2UgSmF2YSBOZXR3b3JraW5nIFByb3BlcnRpZXMgZm9yIG9wZW4gcHJveGllcywKLS1EaHR0cC5wcm94eUhvc3Q9MTAuMTUwLjExMi4yNTQgLURodHRwLnByb3h5UG9ydD04MDgwIDwvcD4KLQotPHA+QXQgcnVudGltZSwgdGhlIHVzZXIgY2FuIG92ZXJyaWRlIHRoZSBQUk9YWSBzZXR0aW5ncyB1c2luZyB0aGUKLUh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLlByb3h5UHJvcGVydGllcyBvYmplY3QuIFdpdGhpbiB5b3VyIGNsaWVudCBzdHViLCAKLWNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIG9iamVjdCwgY29uZmlndXJlIHByb3h5IHZhbHVlcyBmb3IgaXQsCi1hbmQgdGhlbiBzZXQgaXQgdG8gdGhlIE1lc3NhZ2VDb250ZXh0J3MgcHJvcGVydHkgYmFnIHZpYSBvcHRpb25zLnNldFByb3BlcnR5KCkuCi1Gb3IgZXhhbXBsZTo8L3A+Ci08c291cmNlPgotPHByZT4KLS4uLgotT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLS4uLgotCi1IdHRwVHJhbnNwb3J0UHJvcGVydGllcy5Qcm94eVByb3BlcnRpZXMgcHJveHlQcm9wZXJ0aWVzID0gbmV3IEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLm5ldyBQcm94eVByb3BlcnRpZXMoKTsKLXByb3h5UHJvcGVydGllcy5zZXRQcm94eUhvc3ROYW1lKC4uLi4pOwotcHJveHlQcm9wZXJ0aWVzLnNldFByb3h5UG9ydCguLi4pOwotLi4uCi1vcHRpb25zLnNldFByb3BlcnR5KEh0dHBDb25zdGFudHMuUFJPWFksIHByb3h5UHJvcGVydGllcyk7Ci0uLi4KLTwvcHJlPgotPC9zb3VyY2U+Ci08cD5UaGUgYWJvdmUgY29kZSB3aWxsIG92ZXJyaWRlIHRoZSBkZXBsb3ltZW50IHByb3h5IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuPC9wPgotPGEgbmFtZT0icHJlZW1wdGl2ZV9hdXRoIj48L2E+Ci0KLTxoMj5CYXNpYywgRGlnZXN0IGFuZCBOVExNIEF1dGhlbnRpY2F0aW9uPC9oMj4KLQotPHA+SHR0cENsaWVudCBzdXBwb3J0cyB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YgSFRUUCBhdXRoZW50aWNhdGlvbiBzY2hlbWVzOgotQmFzaWMsIERpZ2VzdCBhbmQgTlRMTS4gQmFzZWQgb24gdGhlIGNoYWxsZW5nZSBwcm92aWRlZCBieSB0aGUgc2VydmVyLAotSHR0cENsaWVudCBhdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB3aXRoIHdoaWNoIHRoZQotcmVxdWVzdCBzaG91bGQgYmUgYXV0aGVudGljYXRlZC4gIFRoZSBtb3N0IHNlY3VyZSBtZXRob2QgaXMgTlRMTSBhbmQgdGhlIEJhc2ljCi1pcyB0aGUgbGVhc3Qgc2VjdXJlLjwvcD4KLQotPHA+TlRMTSBpcyB0aGUgbW9zdCBjb21wbGV4IG9mIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbHMgc3VwcG9ydGVkIGJ5Ci1IdHRwQ2xpZW50LiBJdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBOVENyZWRlbnRpYWxzIHRvIGJlIGF2YWlsYWJsZSBmb3IgdGhlCi1kb21haW4gbmFtZSBvZiB0aGUgc2VydmVyIG9yIHRoZSBkZWZhdWx0IGNyZWRlbnRpYWxzLiBOb3RlIHRoYXQgc2luY2UgTlRMTQotZG9lcyBub3QgdXNlIHRoZSBub3Rpb24gb2YgcmVhbG1zLCBIdHRwQ2xpZW50IHVzZXMgdGhlIGRvbWFpbiBuYW1lIG9mIHRoZQotc2VydmVyIGFzIHRoZSBuYW1lIG9mIHRoZSByZWFsbS4gQWxzbyBub3RlIHRoYXQgdGhlIHVzZXJuYW1lIHByb3ZpZGVkIHRvIHRoZQotTlRDcmVkZW50aWFscyBzaG91bGQgbm90IGJlIHByZWZpeGVkIHdpdGggdGhlIGRvbWFpbiAtIGllOiAiYXhpczIiIGlzIGNvcnJlY3QKLXdoZXJlYXMgIkRPTUFJTlxheGlzMiIgaXMgbm90IGNvcnJlY3QuPC9wPgotCi08cD5UaGVyZSBhcmUgc29tZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiB0aGUgd2F5IHRoYXQgTlRMTSB3b3JrcyBjb21wYXJlZAotd2l0aCBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBUaGVzZSBkaWZmZXJlbmNlcyBhcmUgZ2VuZXJhbGx5IGhhbmRsZWQKLWJ5IEh0dHBDbGllbnQsIGhvd2V2ZXIgaGF2aW5nIGFuIHVuZGVyc3RhbmRpbmcgb2YgdGhlc2UgZGlmZmVyZW5jZXMgY2FuIGhlbHAKLWF2b2lkIHByb2JsZW1zIHdoZW4gdXNpbmcgTlRMTSBhdXRoZW50aWNhdGlvbi48L3A+Ci08b2w+Ci0gIDxsaT5OVExNIGF1dGhlbnRpY2F0aW9uIHdvcmtzIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgZm9ybQotICAgIG9mIGF1dGhlbnRpY2F0aW9uIGluIHRlcm1zIG9mIHRoZSBIdHRwQ2xpZW50IEFQSS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcwotICAgIHRoYXQgeW91IG5lZWQgdG8gc3VwcGx5ICdOVENyZWRlbnRpYWxzJyBpbnN0ZWFkIG9mCi0gICAgJ1VzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscycgKE5UQ3JlZGVudGlhbHMgYWN0dWFsbHkgZXh0ZW5kcwotICAgIFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyBzbyB5b3UgY2FuIHVzZSBOVENyZWRlbnRpYWxzIHJpZ2h0IHRocm91Z2hvdXQKLSAgICB5b3VyIGFwcGxpY2F0aW9uIGlmIG5lZWQgYmUpLjwvbGk+Ci0gIDxsaT5UaGUgcmVhbG0gZm9yIE5UTE0gYXV0aGVudGljYXRpb24gaXMgdGhlIGRvbWFpbiBuYW1lIG9mIHRoZSBjb21wdXRlciB0bwotICAgIHdoaWNoIHlvdSBhcmUgYmVpbmcgY29ubmVjdGVkLiBUaGlzIGNhbiBiZWNvbWUgdHJvdWJsZXNvbWUgYXMgc2VydmVycyBvZnRlbgotICAgIGhhdmUgbXVsdGlwbGUgZG9tYWluIG5hbWVzIHRoYXQgcmVmZXIgdG8gdGhlbS4gT25seSB0aGUgZG9tYWluIG5hbWUgdGhhdAotICAgIHRoZSBIdHRwQ2xpZW50IGNvbm5lY3RzIHRvIChhcyBzcGVjaWZpZWQgYnkgdGhlIEhvc3RDb25maWd1cmF0aW9uKSBpcwotICAgIHVzZWQgdG8gbG9vayB1cCB0aGUgY3JlZGVudGlhbHMuIEl0IGlzIGdlbmVyYWxseSBhZHZpc2VkIHRoYXQgd2hpbGUKLSAgICBpbml0aWFsbHkgdGVzdGluZyBOVExNIGF1dGhlbnRpY2F0aW9uLCB5b3UgcGFzcyB0aGUgcmVhbG0gYXMgbnVsbCwgd2hpY2gKLSAgICBpcyBpdHMgZGVmYXVsdCB2YWx1ZS48L2xpPgotICA8bGk+TlRMTSBhdXRoZW50aWNhdGVzIGEgY29ubmVjdGlvbiBhbmQgbm90IGEgcmVxdWVzdC4gU28geW91IG5lZWQgdG8KLSAgICBhdXRoZW50aWNhdGUgZXZlcnkgdGltZSBhIG5ldyBjb25uZWN0aW9uIGlzIG1hZGUsIGFuZCBrZWVwaW5nIHRoZQotICAgIGNvbm5lY3Rpb24gb3BlbiBkdXJpbmcgYXV0aGVudGljYXRpb24gaXMgdml0YWwuIEJlY2F1c2Ugb2YgdGhpcywgTlRMTSBjYW5ub3QKLSAgICBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGJvdGggYSBwcm94eSBhbmQgdGhlIHNlcnZlciwgbm9yIGNhbiBOVExNIGJlCi0gICAgdXNlZCB3aXRoIEhUVFAgMS4wIGNvbm5lY3Rpb25zIG9yIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBIVFRQCi0gICAga2VlcC1hbGl2ZXMuPC9saT4KLTwvb2w+Ci0KLTxwPkF4aXMyIGFsc28gYWxsb3dzIGFkZGluZyBhIGN1c3RvbSBBdXRoZW50aWNhdGlvbiBTY2hlbWUgdG8gSHR0cENsaWVudC48L3A+Ci0KLTxwPlRoZSBzdGF0aWMgaW5uZXIgYmVhbiBBdXRoZW50aWNhdG9yIG9mIEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzIHdpbGwgaG9sZAotdGhlIHN0YXRlIG9mIHRoZSBzZXJ2ZXIgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoLiBPbmNlIGZpbGxlZCwgaXQgaGFzIHRvIGJlCi1zZXQgdG8gdGhlIE9wdGlvbnMncyBwcm9wZXJ0eSBiYWcgd2l0aCB0aGUga2V5IGFzIEhUVFBDb25zdGFudHMuQVVUSEVOVElDQVRFLgotVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgc2hvd3MgaG93IHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0Ci1mcmFtZXdvcmsgdG8gdXNlIEJhc2ljIEF1dGhlbnRpY2F0aW9uOjwvcD4KLTxzb3VyY2U+Ci08cHJlPgotLi4uCi1PcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotIAotSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvcgotICAgYXV0aCA9IG5ldyBIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yKCk7Ci1hdXRoLnNldFVzZXJuYW1lKCJ1c2VybmFtZSIpOwotYXV0aC5zZXRQYXNzd29yZCgicGFzc3dvcmQiKTsKLS8vIHNldCBpZiByZWFsbSBvciBkb21haW4gaXMga25vd24KLQotb3B0aW9ucy5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuQVVUSEVOVElDQVRFLCBhdXRoKTsKLS4uLgotPC9wcmU+Ci08L3NvdXJjZT4KLTxhIG5hbWU9InJldXNpbmdfaHR0cGNsaWVudF9vYmplY3QiPjwvYT4KLTxoMj5SZXVzaW5nIHRoZSBodHRwY2xpZW50IG9iamVjdDwvaDI+Ci0KLTxwPkJ5IGRlZmF1bHQsIGEgbmV3IGh0dHBjbGllbnQgb2JqZWN0IGlzIGNyZWF0ZWQgZm9yIGVhY2ggc2VuZC4gSXQgbWF5Ci1iZSB3b3J0aHdoaWxlIHRvIHJldXNlIHRoZSBzYW1lIGh0dHBjbGllbnQgb2JqZWN0IHRvIHRha2UgYWR2YW50YWdlIG9mCi1IVFRQMS4xIEtlZXAtQWxpdmUsIGVzcGVjaWFsbHkgaW4gSFRUUFMgZW52aXJvbm1lbnQsIHdoZXJlIHRoZSBTU0wKLWhhbmRzaGFrZSBtYXkgbm90IGJlIG9mIG5lZ2xpZ2libGUgY29zdC4gVG8gcmV1c2UgdGhlIHNhbWUgaHR0cGNsaWVudAotb2JqZWN0LCB5b3UgY2FuIHNldCB0aGUgcmVsZXZhbnQgcHJvcGVydHkgaW4gdGhlIFN0dWI6Ci08L3A+Ci0KLSAgICA8c291cmNlPgotICAgICAgICA8cHJlPgotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLlJFVVNFX0hUVFBfQ0xJRU5ULCAidHJ1ZSIpOwotICAgICAgICA8L3ByZT4KLSAgICA8L3NvdXJjZT4KLQotICAgIDxhIG5hbWU9InNldHRpbmdfY2FjaGVkX2h0dHBjbGllbnRfb2JqZWN0Ij48L2E+Ci08aDI+U2V0dGluZyB0aGUgY2FjaGVkIGh0dHBjbGllbnQgb2JqZWN0PC9oMj4KLQotVG8gY29udHJvbCB0aGUgbWF4IGNvbm5lY3Rpb25zIHBlciBob3N0IGF0dGVtcHRlZCBpbiBwYXJhbGxlbCBieSBhCi1yZXVzZWQgaHR0cGNsaWVudCAodGhpcyBjYW4gYmUgd29ydGh3aGlsZSBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAyCi1jb25uZWN0aW9ucyBwZXIgaG9zdCksIG9yIGFueSBvdGhlciBhZHZhbmNlZCBwYXJhbWV0ZXJzLCB5b3UgbmVlZCB0bwotc2V0IHRoZSBjYWNoZWQgaHR0cGNsaWVudCBvYmplY3Qgd2hlbiB5b3VyIGFwcGxpY2F0aW9uIHN0YXJ0cyB1cAotKGJlZm9yZSBhbnkgYWN0dWFsIGF4aXMgcmVxdWVzdCkuIFlvdSBjYW4gc2V0IHRoZSByZWxldmFudCBwcm9wZXJ0eSBpbgotdGhlIFN0dWI6Ci0KLSAgICA8c291cmNlPgotICAgIDxwcmU+Ci1NdWx0aVRocmVhZGVkSHR0cENvbm5lY3Rpb25NYW5hZ2VyIGNvbm1nciA9IG5ldwotTXVsdGlUaHJlYWRlZEh0dHBDb25uZWN0aW9uTWFuYWdlcigpOwotY29ubWdyLmdldFBhcmFtcygpLnNldERlZmF1bHRNYXhDb25uZWN0aW9uc1Blckhvc3QoMTApOwotSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudChjb25tZ3IpOwotY29uZmlndXJhdGlvbkNvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DQUNIRURfSFRUUF9DTElFTlQsIGNsaWVudCk7Ci08L3ByZT4KLSAgICA8L3NvdXJjZT4KLSAgICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXJjaGl0ZWN0dXJlLmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXJjaGl0ZWN0dXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMzBhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL0FyY2hpdGVjdHVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL0F4aXNTZXJ2aWNlLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXhpc1NlcnZpY2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdhNDhkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQXhpc1NlcnZpY2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9Db21wb25lbnQucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9Db21wb25lbnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg4ZGFiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvQ29tcG9uZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvSkFYQl9hcmNoaXRlY3R1cmUuZ2lmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9KQVhCX2FyY2hpdGVjdHVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Yjk3MDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9KQVhCX2FyY2hpdGVjdHVyZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDAxLmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMxODMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwMi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDAyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhMzBkYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjY5YTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA0LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDliZDIxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwNS5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyMDllNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDYuZ2lmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTdlZDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA3LmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBmZTUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00wMDcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9PTTAwOC5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1YTRhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMDA4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00xLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvT00xLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5YjljOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL09NMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZlclNpZGVGYXVsdC5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZlclNpZGVGYXVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGY5NTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9TZXJ2ZXJTaWRlRmF1bHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9TZXJ2aWNlRGVzYy5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZpY2VEZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2YTUwNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1NlcnZpY2VEZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvVG90YWxBcmNoLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvVG90YWxBcmNoLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiZGNlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1RvdGFsQXJjaC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1dvbUJ1aWxkZXIucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9Xb21CdWlsZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNTRhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL1dvbUJ1aWxkZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hY3RpdmF0ZS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FjdGl2YXRlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyODcxOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FjdGl2YXRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYWRtaW4uanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODkwNzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FkbWlubG9naW4uanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbmxvZ2luLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzNWUyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FkbWlubG9naW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbm1haW4uanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hZG1pbm1haW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjE0OTAxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYWRtaW5tYWluLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYW50LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYW50LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MzFlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FudC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL0NvZGVnZW5BcmNoaXRlY3R1cmUtbmV3LmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS1uZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjYxYzVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS1uZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9Db2RlZ2VuQXJjaGl0ZWN0dXJlLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvQ29kZWdlbkFyY2hpdGVjdHVyZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExN2M0NTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9Db2RlZ2VuQXJjaGl0ZWN0dXJlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYWxsLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5OTE1Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2FsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2JpZy1waWN0dXJlLmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYmlnLXBpY3R1cmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDIzZjAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvYmlnLXBpY3R1cmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9jb250ZXh0cy5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2NvbnRleHRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYjg4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL2NvbnRleHRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvcGhhc2VzLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvcGhhc2VzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjYTAwOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL3BoYXNlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL3NvYXAtcHJvY2Vzc2luZy5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpLWd1aWRlL3NvYXAtcHJvY2Vzc2luZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2VjNTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLXByb2Nlc3NpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGktZ3VpZGUvc29hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZWZiYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaS1ndWlkZS9zb2FwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDEuZ2lmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTA0NzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDAyLmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTU2Nzk3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwMy5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDAzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2ZmU4Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDAzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDQuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTI1ZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA1LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q3MDNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhMjEyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDcuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZGI0MzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwNy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA4LmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFkYzM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAwOS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiZGQwYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDA5LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTAuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWQwMjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDExLmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODkxZWJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDEyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5Yjg2YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDEyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTMuZ2lmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmMwZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE0LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjE4ZWZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxNS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFiMjcwYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTYuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjA2M2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE3LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZkZTE4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxOC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3Y2YyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDE4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMTkuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxOS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTg3YjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAxOS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIwLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDMxYzYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyMS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExOWE1Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NmNkNTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDIzLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdhMjI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyNC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDI0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhZGYyZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDI0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjUuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjI4OGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcmNoaTAyNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2FyY2hpMDI2LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBhNTBkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJjaGkwMjYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19sZWZ0LmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJyb3dfbGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTAwZWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXJyb3dfcmlnaHQuZ2lmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzFkOTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9hcnJvd19yaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2F4aXMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9heGlzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzNzFkOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2F4aXMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9heW5jcmVzdWx0LnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvYXluY3Jlc3VsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTE2YmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9heW5jcmVzdWx0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbC5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NhbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTkyN2U0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NhbGxiYWNrLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbGJhY2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTYyYjNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2FsbGJhY2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jYXNlcy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2Nhc2VzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwYjk0NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2Nhc2VzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpZW50QVBpLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpZW50QVBpLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyMDVkNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaWVudEFQaS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaWVudHNpZGUucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGllbnRzaWRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3MGZhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaWVudHNpZGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDAyLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDU4MzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwNC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMDQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJkYWU5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMDYuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDA2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0N2ZhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMDYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDA4LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAwOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjQ4MTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDA4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxMC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTIzNWEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDEyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4YzYzMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDE0LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NmNhMDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDE0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxNi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTc1MGE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAxNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTguanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDE4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZTBjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMTguanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDIwLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNmIyZDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyMi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2YyYTU5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMjQuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDI0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3MDU3MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NsaXBfaW1hZ2UwMjQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDI2LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY2xpcF9pbWFnZTAyNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YmNjZTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jbGlwX2ltYWdlMDI2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY29kZWdlbi5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NvZGVnZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjBjNjUyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvY29kZWdlbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NvcnJlbGF0b3IucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9jb3JyZWxhdG9yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1MTFmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2NvcnJlbGF0b3IucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9kZXBsb3ltZXRuY29tcG9uZW50LnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZGVwbG95bWV0bmNvbXBvbmVudC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyY2RiYTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9kZXBsb3ltZXRuY29tcG9uZW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZWRpdHNlcnZpZWNwYXJhLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZWRpdHNlcnZpZWNwYXJhLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5YTU5Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2VkaXRzZXJ2aWVjcGFyYS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2VuZ2luZTEucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9lbmdpbmUxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNTEyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2VuZ2luZTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9mYXVsdG1zZy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZhdWx0bXNnLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmMjhlZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZhdWx0bXNnLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmF1bHRzZXJ2aWNlLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmF1bHRzZXJ2aWNlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzNmUwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZhdWx0c2VydmljZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzAxLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg5ODFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwMi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzAyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlOGY4NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGM5MTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzA0LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ3Mzg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwNS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzA1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljZWUwOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ZpZzA1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZmlnMDYuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDU0NDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9maWcwNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2dsb2JhbGNoYWluLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZ2xvYmFsY2hhaW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk0ZGI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvZ2xvYmFsY2hhaW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9oYXBweWF4aXMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9oYXBweWF4aXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBmOTkxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaGFwcHlheGlzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDEucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjA1ZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDAyLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBiYzExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwMy5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDAzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NGI2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDQuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzcwYzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA1LmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIwOWU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0NDQxMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDYuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTY3NTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA3LnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkyYzVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwOC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1YjNlOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDA4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMDkucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Nzc3MjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDEwLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjA0MzhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAxMS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4YTg2Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAxMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDRiMWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbWFnZTAxMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL2ltYWdlMDEzLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDBhMjEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW1hZ2UwMTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbmFjdGl2YXRlLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvaW5hY3RpdmF0ZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YWQ3YjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9pbmFjdGl2YXRlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbW9kdWxlLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbW9kdWxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5YTAyZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL21vZHVsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL21vZHVsZWVuZ2FnZS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL21vZHVsZWVuZ2FnZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTg3NjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9tb2R1bGVlbmdhZ2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9tb2R1bGVzLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbW9kdWxlcy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjNhNjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9tb2R1bGVzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbmV3LmdpZiBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5Mzg2My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL29tMi5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL29tMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTIwOTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9vbTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9vbTMucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9vbTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzlkZTM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvb20zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvcGFyYW1ldGVycy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3BhcmFtZXRlcnMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDRlMjIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvcGFyYW1ldGVycy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbGVjdF9zZXJ2aWNlX2Zvcl9oYW5kbGVyLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VsZWN0X3NlcnZpY2VfZm9yX2hhbmRsZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjgxNGQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VsZWN0X3NlcnZpY2VfZm9yX2hhbmRsZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODc5MmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZEFzeW5jLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZEFzeW5jLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlZjMxMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbmRBc3luYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbmRSZWNpZXZjZS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlbmRSZWNpZXZjZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjFkNGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2Y2UucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZUFzeW5jLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZFJlY2lldmVBc3luYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjNjNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZUFzeW5jLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VuZFJlY2lldmVXaXRoTGlzdG5lcmUucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZVdpdGhMaXN0bmVyZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2RjMGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZW5kUmVjaWV2ZVdpdGhMaXN0bmVyZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZlclNpZGUucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2ZXJTaWRlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3NDBlZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZlclNpZGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2aWNlLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VydmljZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDhiZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2aWNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VydmljZUhhbmRsZXJzLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvc2VydmljZUhhbmRsZXJzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2N2RmOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZpY2VIYW5kbGVycy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZpY2Vncm91cHMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy9zZXJ2aWNlZ3JvdXBzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYzNkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3NlcnZpY2Vncm91cHMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvRGlyZWN0b3J5U3RydWN0dXJlLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL0RpcmVjdG9yeVN0cnVjdHVyZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1M2MzMzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvRGlyZWN0b3J5U3RydWN0dXJlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL01vZHVsZVZpZXcuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvTW9kdWxlVmlldy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjdiMDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvTW9kdWxlVmlldy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9NeVNlcnZpY2VEZXBsb3llZC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9NeVNlcnZpY2VEZXBsb3llZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZThjYzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvTXlTZXJ2aWNlRGVwbG95ZWQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvU2VydmljZURlcGxveWVkLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1NlcnZpY2VEZXBsb3llZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODY0ZDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvU2VydmljZURlcGxveWVkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1NlcnZpY2VJdGVtcy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9TZXJ2aWNlSXRlbXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ3YzA0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1NlcnZpY2VJdGVtcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3VzZXJndWlkZS9UZXN0Q2xpZW50LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1Rlc3RDbGllbnQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA0M2IyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL1Rlc3RDbGllbnQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvaHR0cC1nZXQtd3MuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy91c2VyZ3VpZGUvaHR0cC1nZXQtd3MuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTYyOWUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdXNlcmd1aWRlL2h0dHAtZ2V0LXdzLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdmlld3BoYXNlcy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3ZpZXdwaGFzZXMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMwZWFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbWFnZXMvdmlld3BoYXNlcy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3dvbS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW1hZ2VzL3dvbS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2U5ZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ltYWdlcy93b20ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2luZGV4LnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGFmZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08dGl0bGU+PC90aXRsZT4NCi08L2hlYWQ+DQotPGZyYW1lc2V0IGNvbHM9IjI2MCwqIiBib3JkZXI9IjEiIGZyYW1lYm9yZGVyPSJ5ZXMiIGZyYW1lc3BhY2luZz0NCi0iMCIgbWFyZ2luPSIwIj4NCi08ZnJhbWUgbmFtZT0ibGVmdEZyYW1lIiBzcmM9InRvYy5odG1sIiBub3Jlc2l6ZT0ibm9yZXNpemUiDQotc2Nyb2xsaW5nPSJ5ZXMiIC8+DQotPGZyYW1lIG5hbWU9Im1haW5GcmFtZSIgc3JjPSJjb250ZW50cy5odG1sIiAvPg0KLTxub2ZyYW1lcz4NCi08Ym9keT4NCi08L2JvZHk+DQotPC9ub2ZyYW1lcz4NCi08L2ZyYW1lc2V0Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW5zdGFsbGF0aW9uZ3VpZGUueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2luc3RhbGxhdGlvbmd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3YTI0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvaW5zdGFsbGF0aW9uZ3VpZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIEluc3RhbGxhdGlvbiBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxIGFsaWduPSJjZW50ZXIiPkFwYWNoZSBBeGlzMiBJbnN0YWxsYXRpb24gR3VpZGU8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gQXhpczIgZGlzdHJpYnV0aW9uDQotcGFja2FnZXMsIHN5c3RlbSBwcmVyZXF1aXNpdGVzIGFuZCBzZXR0aW5nIHVwIGVudmlyb25tZW50IHZhcmlhYmxlcw0KLWFuZCB0b29scyBmb2xsb3dlZCBieSBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGF0aW9uDQotbWV0aG9kcy48L3A+DQotPHA+PGk+U2VuZCB5b3VyIGZlZWRiYWNrIHRvOiA8YSBocmVmPQ0KLSJtYWlsdG86YXhpcy1kZXZAd3MuYXBhY2hlLm9yZz9zdWJqZWN0PVtBeGlzMl0iPmF4aXMtZGV2QHdzLmFwYWNoZS5vcmc8L2E+PC9pPg0KLW1haWxpbmcgbGlzdC4gKFN1YnNjcmlwdGlvbiBkZXRhaWxzIGFyZSBhdmFpbGFibGUgb24gPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbWFpbC1saXN0cy5odG1sIj5BeGlzMiBzaXRlPC9hPi4pDQotS2luZGx5IHByZWZpeCBldmVyeSBlbWFpbCBzdWJqZWN0IHdpdGggW0F4aXMyXS48L3A+DQotPGgyPkNvbnRlbnRzPC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNEb3dubG9hZF9BeGlzMiI+QXhpczIgRGlzdHJpYnV0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjcmVxdWlyZW1lbnRzIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNzdGFuZGFsb25lIj5JbnN0YWxsaW5nIEF4aXMyIGFzIGEgU3RhbmRhbG9uZSBTZXJ2ZXINCi11c2luZyB0aGUgU3RhbmRhcmQgQmluYXJ5IERpc3RyaWJ1dGlvbjwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNzdGFuZGFsb25lMSI+SW5zdGFsbGluZyB0aGUgQXBhY2hlIEF4aXMyIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc3RhbmRhbG9uZTIiPlN0YXJ0aW5nIHVwIEF4aXMyIFN0YW5kYWxvbmUNCi1TZXJ2ZXI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3N0YW5kYWxvbmUzIj5CdWlsZGluZyB0aGUgQXhpczIgV0FSIEZpbGUgVXNpbmcgdGhlDQotU3RhbmRhcmQgQmluYXJ5IERpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc3RhbmRhbG9uZTQiPkdldHRpbmcgRmFtaWxpYXIgd2l0aCBDb252ZW5pZW50IEF4aXMyDQotU2NyaXB0czwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI3NlcnZsZXRfY29udGFpbmVyIj5JbnN0YWxsaW5nIEF4aXMyIGluIGEgU2VydmxldA0KLUNvbnRhaW5lcjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjdXBsb2FkIj5VcGxvYWRpbmcgU2VydmljZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2FkdmFuY2VkIj5BZHZhbmNlZDwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNzb3VyY2UiPkF4aXMyIFNvdXJjZSBEaXN0cmlidXRpb248L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjX1RvYzk2Njk4MDgzIj5TZXR0aW5nIHVwIHRoZSBFbnZpcm9ubWVudCBhbmQNCi1Ub29sczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjX1RvYzk2Njk4MDg1Ij5CdWlsZGluZyBBeGlzMiBCaW5hcmllcyBhbmQgdGhlIFdBUg0KLWZpbGUgVXNpbmcgdGhlIFNvdXJjZSBEaXN0cmlidXRpb248L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iRG93bmxvYWRfQXhpczIiIGlkPSJEb3dubG9hZF9BeGlzMiI+PC9hPg0KLTxoMj5BeGlzMiBEaXN0cmlidXRpb25zPC9oMj4NCi08cD5BeGlzMiBpcyBkaXN0cmlidXRlZCBpbiBzZXZlcmFsIGNvbnZlbmllbnQgZGlzdHJpYnV0aW9uIHBhY2thZ2VzDQotYW5kIGNhbiBiZSBpbnN0YWxsZWQgZWl0aGVyIGFzIGEgc3RhbmRhbG9uZSBzZXJ2ZXIgb3IgYXMgcGFydCBvZiBhDQotSjJFRSBjb21wbGlhbnQgc2VydmxldCBjb250YWluZXIuIEF4aXMyIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQ0KLUFwYWNoZSBMaWNlbnNlLCB2ZXJzaW9uIDIuMC4gVGhpcyBJbnN0YWxsYXRpb24gR3VpZGUgd2lsbCBtYWlubHkNCi1mb2N1cyBvbiBydW5uaW5nIEFwYWNoZSBBeGlzMiB1c2luZyB0aGUgU3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uLjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSI+DQotRG93bmxvYWQ8L2E+IGRpc3RyaWJ1dGlvbiBwYWNrYWdlcyBvZiB0aGUgQXBhY2hlIEF4aXMyDQotQGF4aXMyX3ZlcnNpb25AIHZlcnNpb24gKGxhdGVzdCkuPC9wPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQ8L2E+DQotZGlzdHJpYnV0aW9uIHBhY2thZ2VzIG9mIGFsbCB2ZXJzaW9ucyBvZiBBcGFjaGUgQXhpczIuPC9wPg0KLTxwPlRoZSBkaXN0cmlidXRpb24gcGFja2FnZXMgcHJvdmlkZWQgYXJlIGFzIGZvbGxvd3M6PC9wPg0KLTxhIG5hbWU9InN0ZC1iaW4iIGlkPSJzdGQtYmluIj48L2E+DQotPGgzPjEuIFN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPlRoaXMgaXMgdGhlIGNvbXBsZXRlIHZlcnNpb24gb2YgQXhpczIgYW5kIGluY2x1ZGVzIHNhbXBsZXMgYW5kDQotY29udmVuaWVudCBzY3JpcHRzIGFzIHdlbGwuPC9wPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpIj4NCi1Eb3dubG9hZDwvYT4gU3RhbmRhcmQgQmluYXJ5IERpc3RyaWJ1dGlvbjwvcD4NCi08YSBuYW1lPSJ3YXIxIiBpZD0id2FyMSI+PC9hPg0KLTxoMz4yLiBXQVIgKFdlYiBBcmNoaXZlKSBEaXN0cmlidXRpb248L2gzPg0KLTxwPlRoaXMgaXMgdGhlIFdlYiBhcHBsaWNhdGlvbiBvZiBBeGlzMiwgd2hpY2ggY2FuIGJlIGRlcGxveWVkIGluDQotbW9zdCBvZiB0aGUgc2VydmxldCBjb250YWluZXJzLjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSI+DQotRG93bmxvYWQ8L2E+IFdBUiAoV2ViIEFyY2hpdmUpIERpc3RyaWJ1dGlvbjwvcD4NCi08aDM+My4gRG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+VGhpcyBjb250YWlucyBhbGwgdGhlIGRvY3VtZW50YXRpb24gaW4gb25lIHBhY2thZ2UuIFRoZSBwYWNrYWdlDQotaW5jbHVkZXMgdGhlIHhkb2NzIGFuZCB0aGUgSmF2YSBBUEkgZG9jcyBvZiB0aGlzIHByb2plY3QuPC9wPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpIj4NCi1Eb3dubG9hZDwvYT4gRG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvcD4NCi08aDM+NC4gU291cmNlIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+VGhpcyBjb250YWlucyB0aGUgc291cmNlcyBvZiBBeGlzMiBzdGFuZGFyZCBkaXN0cmlidXRpb24sIGFuZCBpcw0KLW1haW5seSBmb3IgdGhlIGJlbmVmaXQgb2YgYWR2YW5jZWQgdXNlcnMuIE9uZSBjYW4gZ2VuZXJhdGUgYSBiaW5hcnkNCi1kaXN0cmlidXRpb24gdXNpbmcgdGhlIHNvdXJjZSBieSB0eXBpbmcgPHNwYW4gY2xhc3M9InN0eWxlMSI+JG12bg0KLS1EcmVsZWFzZSBpbnN0YWxsLjwvc3Bhbj4gWW91IG5lZWQgdG8gc2V0IHVwIHRoZSBBeGlzMiBlbnZpcm9ubWVudCBiZWZvcmUNCi1ydW5uaW5nIHRoaXMgY29tbWFuZC4gU3RlcCBieSBzdGVwIGRldGFpbHMgb24gaG93IHRvIGNyZWF0ZSB0aGUNCi1iaW5hcnkgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgPGEgaHJlZj0NCi0iI2FkdmFuY2VkIj5BZHZhbmNlZDwvYT4gc2VjdGlvbi48L3A+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5jZ2kiPg0KLURvd25sb2FkPC9hPiBTb3VyY2UgRGlzdHJpYnV0aW9uPC9wPg0KLTxhIG5hbWU9InJlcXVpcmVtZW50cyIgaWQ9InJlcXVpcmVtZW50cyI+PC9hPg0KLTxoMj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9oMj4NCi08dGFibGUgYm9yZGVyPSIyIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZD5KYXZhIERldmVsb3BtZW50IEtpdCAoSkRLKTwvdGQ+DQotPHRkPjEuNSBvciBsYXRlciAoRm9yIGluc3RydWN0aW9ucyBvbiBzZXR0aW5nIHVwIHRoZSBKREsgaW4NCi1kaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMsIHZpc2l0IDxhIGhyZWY9DQotImh0dHA6Ly9qYXZhLnN1bi5jb20vIj5odHRwOi8vamF2YS5zdW4uY29tPC9hPik8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5EaXNrPC90ZD4NCi08dGQ+QXBwcm94aW1hdGVseSAxMSBNQiBzZXBhcmF0ZWx5IGZvciBzdGFuZGFyZCBiaW5hcnkNCi1kaXN0cmlidXRpb248L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5PcGVyYXRpbmcgc3lzdGVtPC90ZD4NCi08dGQ+VGVzdGVkIG9uIFdpbmRvd3MgWFAsIExpbnV4LCBNYWMgT1MgWCwgRmVkb3JhIGNvcmUsIFVidW50dSwNCi1HZW50b288L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkJ1aWxkIFRvb2w8L3N0cm9uZz4tPGEgaHJlZj0NCi0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QXBhY2hlIEFudDwvYT4NCi08cD5UbyBydW4gc2FtcGxlcyBhbmQgdG8gYnVpbGQgV0FSIGZpbGVzIGZyb20gQXhpczIgYmluYXJ5DQotZGlzdHJpYnV0aW9uLjwvcD4NCi08L3RkPg0KLTx0ZD5WZXJzaW9uIDEuNi41IG9yIGhpZ2hlciAoPGEgaHJlZj0NCi0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+KS48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkJ1aWxkIFRvb2w8L3N0cm9uZz4tIDxhIGhyZWY9DQotImh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyI+QXBhY2hlIE1hdmVuIDIueDwvYT4NCi08cD5SZXF1aXJlZCA8ZW0+b25seTwvZW0+IGZvciBidWlsZGluZyBBeGlzMiBmcm9tIFNvdXJjZQ0KLURpc3RyaWJ1dGlvbjwvcD4NCi08L3RkPg0KLTx0ZD4yLjAuNyBvciBoaWdoZXIgaW4gTWF2ZW4gMi54IHNlcmllcyAoPGEgaHJlZj0NCi0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCI+ZG93bmxvYWQ8L2E+KS4NCi08c3Ryb25nPlBsZWFzZSBkb3dubG9hZCBNYXZlbiAyLnggdmVyc2lvbi4gQXhpczIgZG9lcyBub3Qgc3VwcG9ydA0KLU1hdmVuIDEueCBhbnltb3JlLjwvc3Ryb25nPjwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPHA+TWFrZSBzdXJlIHRoYXQgdGhlIGFib3ZlIHByZXJlcXVpc2l0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlDQotQXhpczIgaW5zdGFsbGF0aW9uLjwvcD4NCi08YSBuYW1lPSJzdGFuZGFsb25lIiBpZD0ic3RhbmRhbG9uZSI+PC9hPg0KLTxoMj5JbnN0YWxsaW5nIEF4aXMyIGFzIGEgU3RhbmRhbG9uZSBTZXJ2ZXIgdXNpbmcgdGhlIFN0YW5kYXJkDQotQmluYXJ5IERpc3RyaWJ1dGlvbjwvaDI+DQotPGEgbmFtZT0ic3RhbmRhbG9uZTEiIGlkPSJzdGFuZGFsb25lMSI+PC9hPg0KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uPC9wPg0KLTxvbD4NCi08bGk+SW5zdGFsbCBBeGlzMiBhcyBhIHN0YW5kYWxvbmUgc2VydmVyIHVzaW5nIHRoZSBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2xpPg0KLTxsaT5TdGFydCB1cCB0aGUgQXhpczIgc3RhbmRhbG9uZSBzZXJ2ZXI8L2xpPg0KLTxsaT5CdWlsZGluZyB0aGUgYXhpczIud2FyIGZpbGUgKHVzaW5nIHRoZSBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb24pIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHJ1biBBeGlzMiBhcyBwYXJ0IG9mIGEgSjJFRQ0KLWNvbXBsaWFudCBzZXJ2bGV0IGNvbnRhaW5lcjwvbGk+DQotPGxpPlJ1bm5pbmcgQXhpczIgY29udmVuaWVudCBzY3JpcHRzPC9saT4NCi08L29sPg0KLTxoMz4xLiBEb3dubG9hZCBhbmQgSW5zdGFsbCB0aGUgQXBhY2hlIEF4aXMyIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLyI+RG93bmxvYWQ8L2E+IGFuZCBpbnN0YWxsIGENCi1KYXZhIERldmVsb3BtZW50IEtpdCAoSkRLKSByZWxlYXNlICh2ZXJzaW9uIDEuNSBvciBsYXRlcikuIEluc3RhbGwNCi10aGUgSkRLIGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb25zIGluY2x1ZGVkIHdpdGggdGhlIHJlbGVhc2UuDQotU2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlIEpBVkFfSE9NRSB0byB0aGUgcGF0aG5hbWUgb2YgdGhlDQotZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGluc3RhbGxlZCB0aGUgSkRLIHJlbGVhc2UuPC9wPg0KLTxwPkRvd25sb2FkIGFuZCB1bnBhY2sgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpIj4NCi1BeGlzMiBTdGFuZGFyZCBCaW5hcnkgRGlzdHJpYnV0aW9uPC9hPiBpbnRvIGEgY29udmVuaWVudCBsb2NhdGlvbg0KLXNvIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiByZXNpZGVzIGluIGl0cyBvd24gZGlyZWN0b3J5LiBTZXQgYW4NCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBBWElTMl9IT01FIHRvIHRoZSBwYXRobmFtZSBvZiB0aGUgZXh0cmFjdGVkDQotZGlyZWN0b3J5IG9mIEF4aXMyIChFZzogL29wdC9heGlzMi1AYXhpczJfdmVyc2lvbkApLiBMaW51eCB1c2Vycw0KLWNhbiBhbHRlcm5hdGl2ZWx5IHJ1biB0aGUgc2V0ZW52LnNoIGZpbGUgYXZhaWxhYmxlIGluIHRoZQ0KLUFYSVMyX0hPTUUvYmluIGRpcmVjdG9yeSB0byBzZXQgdGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUNCi10byB0aGUgQXhpczIgY2xhc3NwYXRoLjwvcD4NCi08aDM+Mi4gU3RhcnRpbmcgdXAgQXhpczIgU3RhbmRhbG9uZSBTZXJ2ZXI8L2gzPg0KLTxwPlRoZSBzdGFuZGFsb25lIEF4aXMyIHNlcnZlciBjYW4gYmUgc3RhcnRlZCBieSBleGVjdXRpbmcgdGhlDQotZm9sbG93aW5nIGNvbW1hbmRzOjxiciAvPg0KLSVBWElTMl9IT01FJVxiaW5cYXhpczJzZXJ2ZXIuYmF0IChXaW5kb3dzKTxiciAvPg0KLSRBWElTMl9IT01FL2Jpbi9heGlzMnNlcnZlci5zaCAoVW5peCk8L3A+DQotPHA+QWZ0ZXIgc3RhcnR1cCwgdGhlIGRlZmF1bHQgd2ViIHNlcnZpY2VzIGluY2x1ZGVkIHdpdGggQXhpczIgd2lsbA0KLWJlIGF2YWlsYWJsZSBieSB2aXNpdGluZyBodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvPC9wPg0KLTxhIG5hbWU9InN0YW5kYWxvbmUzIiBpZD0ic3RhbmRhbG9uZTMiPjwvYT4NCi08aDM+My4gQnVpbGRpbmcgdGhlIEF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoYXhpczIud2FyKSBVc2luZw0KLVN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPkRvd25sb2FkPC9hPiBhbmQNCi1pbnN0YWxsIEFwYWNoZSBBbnQgKHZlcnNpb24gMS42LjUgb3IgbGF0ZXIpLiBJbnN0YWxsIEFwYWNoZSBBbnQNCi1hY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucyBpbmNsdWRlZCB3aXRoIHRoZSBBbnQgcmVsZWFzZS48L3A+DQotPHA+TG9jYXRlIHRoZSBBbnQgYnVpbGQgZmlsZSAoYnVpbGQueG1sKSBpbnNpZGUgdGhlIHdlYmFwcA0KLWRpcmVjdG9yeSwgd2hpY2ggcmVzaWRlcyBpbiB5b3VyIEF4aXMyIGhvbWUgZGlyZWN0b3J5IChpLmU6LQ0KLSRBWElTX0hPTUUvd2ViYXBwKSIuIFJ1biB0aGUgQW50IGJ1aWxkIGJ5IGV4ZWN1dGluZyAiYW50DQotY3JlYXRlLndhciIgaW5zaWRlIHRoZSBBWElTMl9IT01FL3dlYmFwcHMgZm9sZGVyLiBZb3UgY2FuIGZpbmQgdGhlDQotZ2VuZXJhdGVkIGF4aXMyLndhciBpbnNpZGUgdGhlIEFYSVMyX0hPTUUvZGlzdCBkaXJlY3RvcnkuIEFsbCB0aGUNCi1zZXJ2aWNlcyBhbmQgbW9kdWxlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSBBWElTMl9IT01FL3JlcG9zaXRvcnkNCi13aWxsIGJlIHBhY2tlZCBpbnRvIHRoZSBjcmVhdGVkIGF4aXMyLndhciB0b2dldGhlciB3aXRoIHRoZSBBeGlzMg0KLWNvbmZpZ3VyYXRpb24gZm91bmQgYXQgQVhJUzJfSE9NRS9jb25mL2F4aXMyLnhtbC48L3A+DQotPHA+UmVhZCA8YSBocmVmPSIjc2VydmxldF9jb250YWluZXIiPkluc3RhbGxpbmcgQXhpczIgaW4gYSBTZXJ2bGV0DQotQ29udGFpbmVyPC9hPiB0byBmaW5kIG91dCBob3cgdG8gZGVwbG95IHRoZSBBeGlzMiBXZWIgYXBwbGljYXRpb24NCi1pbiBhIHNlcnZsZXQgY29udGFpbmVyLjwvcD4NCi08YSBuYW1lPSJzdGFuZGFsb25lNCIgaWQ9InN0YW5kYWxvbmU0Ij48L2E+DQotPGgzPjQuIEdldHRpbmcgRmFtaWxpYXIgd2l0aCB0aGUgQ29udmVuaWVudCBBeGlzMiBTY3JpcHRzPC9oMz4NCi08cD5JdCBpcyBhZHZpc2VkIHRvIGFkZCB0aGUgQVhJUzJfSE9NRS9iaW4gdG8gdGhlIFBBVEgsIHNvIHRoYXQNCi15b3UnbGwgYmUgYWJsZSB0byBydW4gdGhlIGZvbGxvd2luZyBzY3JpcHRzIGZyb20gYW55d2hlcmUuPC9wPg0KLTx0YWJsZSBib3JkZXI9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPjxiPlNjcmlwdCBOYW1lPC9iPjwvdGQ+DQotPHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmF4aXMyLntiYXR8c2h9PC90ZD4NCi08dGQ+WW91IGNhbiB1c2UgdGhpcyBzY3JpcHQgdG8gcnVuIHdlYiBzZXJ2aWNlIGNsaWVudHMgd3JpdHRlbg0KLXVzaW5nIEF4aXMyLiBUaGlzIHNjcmlwdCBjYWxscyB0aGUgImphdmEiIGNvbW1hbmQgYWZ0ZXIgYWRkaW5nIHRoZQ0KLWNsYXNzcGF0aCBmb3IgQXhpczIgZGVwZW5kZW50IGxpYnJhcmllcyAoKi5qYXIgZmlsZXMgcHJlc2VudCBpbg0KLXlvdXIgQVhJUzJfSE9NRS9saWIpLCBzZXR0aW5nIHRoZSBBeGlzMiByZXBvc2l0b3J5IGxvY2F0aW9uDQotKEFYSVMyX0hPTUUvcmVwb3NpdG9yeSkgYW5kIHNldHRpbmcgdGhlIEF4aXMyIGNvbmZpZ3VyYXRpb24gZmlsZQ0KLWxvY2F0aW9uKEFYSVMyX0hPTUUvY29uZi9heGlzMi54bWwpIGZvciB5b3UuIFdpdGggdGhpcyB5b3UgY2FuIGJlDQotcmVsaWV2ZWQgZnJvbSBzZXR0aW5nIGFsbCB0aGUgYWJvdmUgQXhpczIgc3BlY2lmaWMNCi1wYXJhbWV0ZXJzLjxiciAvPg0KLTxwPjxlbT5Vc2FnZSA6IGF4aXMyLntzaC5iYXR9IFstb3B0aW9uc10gY2xhc3MgW2FyZ3MuLi5dPC9lbT48L3A+DQotPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+YXhpczJzZXJ2ZXIue3NofGJhdH08L3RkPg0KLTx0ZD5UaGlzIHNjcmlwdCB3aWxsIHN0YXJ0IGEgc3RhbmRhbG9uZSBBeGlzMiBzZXJ2ZXIgdXNpbmcgdGhlDQotQVhJUzJfSE9NRS9yZXBvc2l0b3J5IGFzIHRoZSBBeGlzMiByZXBvc2l0b3J5IGFuZCB0aGUNCi1BWElTMl9IT01FL2NvbmYvYXhpczIueG1sIGFzIHRoZSBBeGlzMiBjb25maWd1cmF0aW9uIGZpbGUuIFRoaXMNCi13aWxsIHN0YXJ0IGFsbCB0aGUgdHJhbnNwb3J0IGxpc3RlbmVycyBsaXN0ZWQgaW4gdGhlDQotQVhJUzJfSE9NRS9jb25mL2F4aXMyLnhtbC4NCi08cD5Gb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gZGVwbG95IGEgc2VydmljZSB1c2luZyBhIHN0YW5kYWxvbmUNCi1BeGlzMiBzZXJ2ZXIsdGhlbiBjb3B5IHlvdXIgc2VydmljZSBhcmNoaXZlIHRvIHRoZQ0KLUFYSVMyX0hPTUUvcmVwb3NpdG9yeS9zZXJ2aWNlcyBkaXJlY3RvcnkuIE5leHQsIGdvIHRvIHRoZQ0KLSJUcmFuc3BvcnQgSW5zIiBzZWN0aW9uIG9mIHRoZSBBWElTMl9IT01FL2NvbmYvYXhpczIueG1sIGFuZA0KLWNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IHJlY2VpdmVycyAoc2ltcGxlSHR0cFNlcnZlciBpbiBwb3J0IDgwODAgaXMNCi1saXN0ZWQgYnkgZGVmYXVsdCkuIFRoZW4gaW52b2tlIHRoaXMgc2NyaXB0LjwvcD4NCi08L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD53c2RsMmphdmEue2JhdHxzaH08L3RkPg0KLTx0ZD5UaGlzIHNjcmlwdCBnZW5lcmF0ZXMgSmF2YSBjb2RlIGFjY29yZGluZyB0byBhIGdpdmVuIFdTREwgZmlsZQ0KLXRvIGhhbmRsZSBXZWIgc2VydmljZSBpbnZvY2F0aW9ucyAoY2xpZW50LXNpZGUgc3R1YnMpLiBUaGlzIHNjcmlwdA0KLWFsc28gaGFzIHRoZSBhYmlsaXR5IHRvIGdlbmVyYXRlIHdlYiBzZXJ2aWNlIHNrZWxldG9ucyBhY2NvcmRpbmcgdG8NCi10aGUgZ2l2ZW4gV1NETC48YnIgLz4NCi08cD48ZW0+VXNhZ2U6IHdzZGwyamF2YS57c2h8YmF0fSBbT1BUSU9OXS4uLiAtdXJpICZsdDtMb2NhdGlvbiBvZg0KLVdTREwmZ3Q7PC9lbT48L3A+DQotPHA+ZS5nLiwgd3NkbDJqYXZhLnNoIC11cmkgLi4vd3NkbC9BeGlzMlNhbXBsZS53c2RsPC9wPg0KLTxwPkEgbW9yZSBkZXRhaWxlZCByZWZlcmVuY2UgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGZvdW5kDQotPGEgaHJlZj0icmVmZXJlbmNlLmh0bWwiPmhlcmU8L2E+PC9wPg0KLTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmphdmEyd3NkbC57YmF0fHNofTwvdGQ+DQotPHRkPlRoaXMgc2NyaXB0IGdlbmVyYXRlcyB0aGUgYXBwcm9wcmlhdGUgV1NETCBmaWxlIGZvciBhIGdpdmVuDQotSmF2YSBjbGFzcy48YnIgLz4NCi08cD48ZW0+VXNhZ2U6IEphdmEyV1NETC57c2h8YmF0fSBbT1BUSU9OXS4uLiAtY24gJmx0O2Z1bGx5DQotcXVhbGlmaWVkIGNsYXNzIG5hbWUmZ3Q7PC9lbT48L3A+DQotPHA+ZS5nLiwgSmF2YTJXU0RMLnNoIC1jbiAuLi9zYW1wbGVzL3Rlc3Qvc2VhcmNoVG9vbC5TZWFyY2g8L3A+DQotPHA+QSBtb3JlIGRldGFpbGVkIHJlZmVyZW5jZSBhYm91dCB0aGlzIHNjcmlwdCBjYW4gYmUgZm91bmQNCi08YSBocmVmPSJyZWZlcmVuY2UuaHRtbCI+aGVyZTwvYT48L3A+DQotPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08YSBuYW1lPSJzZXJ2bGV0X2NvbnRhaW5lciIgaWQ9InNlcnZsZXRfY29udGFpbmVyIj48L2E+DQotPGgyPkluc3RhbGxpbmcgQXhpczIgaW4gYSBTZXJ2bGV0IENvbnRhaW5lcjwvaDI+DQotPHA+V2hpY2hldmVyIHRoZSBkaXN0cmlidXRpb24sIGluc3RhbGxpbmcgQXhpczIgaW4gYSBKMkVFIGNvbXBsaWFudA0KLXNlcnZsZXQgY29udGFpbmVyIGlzIGFzIGZvbGxvd3M6PC9wPg0KLTxvbD4NCi08bGk+QnVpbGQgdGhlIEF4aXMyIFdBUiBmaWxlIHVzaW5nIHRoZSBBeGlzMiA8YSBocmVmPQ0KLSIjc3RhbmRhbG9uZTMiPlN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2E+LiAoQWx0ZXJuYXRpdmVseSB5b3UNCi1jYW4gPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5jZ2kiPg0KLWRvd25sb2FkPC9hPiB0aGUgYXhpczIud2FyIGZpbGUgb3IgeW91IGNhbiBidWlsZCBheGlzMi53YXIgdXNpbmcNCi10aGUgPGEgaHJlZj0iI3dhciI+U291cmNlIERpc3RyaWJ1dGlvbjwvYT4uPC9saT4NCi08bGk+RHJvcCB0aGUgV0FSIGZpbGUgaW4gdGhlIHdlYmFwcHMgZm9sZGVyIG9mIHRoZSBzZXJ2bGV0DQotY29udGFpbmVyLiBNb3N0IHNlcnZsZXQgY29udGFpbmVycyB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCB0aGUNCi1XQVIgZmlsZS4gKFNvbWUgc2VydmxldCBjb250YWluZXJzIG1heSByZXF1aXJlIGEgcmVzdGFydCBpbiBvcmRlcg0KLXRvIGNhcHR1cmUgdGhlIG5ldyB3ZWIgYXBwbGljYXRpb24uIFJlZmVyIHRvIHlvdXIgc2VydmxldCBjb250YWluZXINCi1kb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLikNCi08cCBhbGlnbj0iY2VudGVyIj48c3Ryb25nPjxpbWcgc3JjPSJpbWFnZXMvY2xpcF9pbWFnZTAwNi5qcGciIGFsdD0NCi0iIiAvPjwvc3Ryb25nPjwvcD4NCi08L2xpPg0KLTxsaT5PbmNlIHRoZSBXQVIgaXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCwgdGVzdCBpdCBieSBwb2ludGluZyB0aGUNCi13ZWIgYnJvd3NlciB0byB0aGUgPHN0cm9uZz5odHRwOi8vJmx0O2hvc3QNCi06cG9ydCZndDsvYXhpczIuPC9zdHJvbmc+IEl0IHNob3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgcGFnZQ0KLXdoaWNoIGlzIHRoZSA8c3Ryb25nPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiBIb21lIFBhZ2U8L3N0cm9uZz4uPC9saT4NCi08bGk+VXNlIHRoZSBsaW5rICJWYWxpZGF0ZSIgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZyBpcyBydW5uaW5nDQotY29ycmVjdGx5LiBJZiB0aGUgdmFsaWRhdGlvbiBmYWlscyB0aGVuIHRoZSBXQVIgaGFzIGZhaWxlZCB0bw0KLWluc3RhbGwgcHJvcGVybHkgb3Igc29tZSBlc3NlbnRpYWwgamFycyBhcmUgbWlzc2luZy4gSW4gc3VjaCBhDQotc2l0dWF0aW9uLCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgcGFydGljdWxhciBzZXJ2bGV0DQotY29udGFpbmVyIHRvIGZpbmQgdGhlIHByb2JsZW0uIFRoZSBmb2xsb3dpbmcgcGFnZSBzaG93cyBhDQotc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uLiBOb3RlIHRoZSBzdGF0ZW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIGNvcmUNCi1BeGlzMiBsaWJyYXJpZXMgYXJlIHByZXNlbnQuPC9saT4NCi08L29sPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvaGFwcHlheGlzLmpwZyIgLz48L3A+DQotPGEgbmFtZT0idXBsb2FkIiBpZD0idXBsb2FkIj48L2E+DQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBGb3IgYW55IEFwcGxpY2F0aW9uIHNlcnZlciBzcGVjaWZpYw0KLWluc3RhbGxhdGlvbiBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIDxhIGhyZWY9DQotImFwcF9zZXJ2ZXIuaHRtbCI+QXBwbGljYXRpb24gU2VydmVyIFNwZWNpZmljIENvbmZpZ3VyYXRpb24NCi1HdWlkZTwvYT4uPC9wPg0KLTxoMj5VcGxvYWRpbmcgU2VydmljZXM8L2gyPg0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPg0KLTxwPlRoZSBBeGlzMiBXZWIgYXBwbGljYXRpb24gYWxzbyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdXBsb2FkDQotc2VydmljZXMuIE9uY2UgYSBzZXJ2aWNlIGFyY2hpdmUgZmlsZSBpcyBjcmVhdGVkIGFjY29yZGluZyB0byB0aGUNCi1zZXJ2aWNlIHNwZWNpZmljYXRpb24gYXMgZGVzY3JpYmVkIGluIHRoZSA8YSBuYW1lPQ0KLSJhZHYtdXNlcmd1aWRlLmh0bWwiIHRhcmdldD0iX2JsYW5rIiBpZD0NCi0iYWR2LXVzZXJndWlkZS5odG1sIj5BZHZhbmNlZCBVc2VyJ3MgR3VpZGU8L2E+LCB0aGF0IC5hYXIgZmlsZSBjYW4NCi1iZSB1cGxvYWRlZCB1c2luZyB0aGUgdXBsb2FkIHBhZ2UuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxzdHJvbmc+PGltZyBzcmM9ImltYWdlcy9jbGlwX2ltYWdlMDEwLmpwZyIgYWx0PQ0KLSIiIC8+PC9zdHJvbmc+PC9wPg0KLTxwPlRoZSB1cGxvYWRlZCAuYWFyIGZpbGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBkZWZhdWx0IHNlcnZpY2UNCi1kaXJlY3RvcnkuIEZvciBBeGlzMiwgdGhpcyB3aWxsIGJlIHRoZQ0KLSZsdDt3ZWJhcHBzJmd0Oy9heGlzMi9XRUItSU5GL3NlcnZpY2VzIGRpcmVjdG9yeS4gT25jZSBhIHNlcnZpY2UgaXMNCi11cGxvYWRlZCwgaXQgd2lsbCBiZSBpbnN0YWxsZWQgaW5zdGFudGx5LjwvcD4NCi08YSBuYW1lPSJob3RfZGVwbG95bWVudCIgaWQ9ImhvdF9kZXBsb3ltZW50Ij48L2E+DQotPHA+U2luY2UgQXhpczIgc3VwcG9ydHMgPHN0cm9uZz5ob3QgZGVwbG95bWVudDwvc3Ryb25nPiwgeW91IGNhbg0KLWRyb3AgdGhlIHNlcnZpY2UgYXJjaGl2ZSBkaXJlY3RseSB0aHJvdWdoIHRoZSBmaWxlIHN5c3RlbSB0byB0aGUNCi1hYm92ZSBtZW50aW9uZWQgc2VydmljZXMgZGlyZWN0b3J5LiBJdCB3aWxsIGFsc28gY2F1c2UgdGhlIHNlcnZpY2UNCi10byBiZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCB3aXRob3V0IHRoZSBjb250YWluZXIgYmVpbmcNCi1yZXN0YXJ0ZWQuPC9wPg0KLTxwPlVzZSB0aGUgJ1NlcnZpY2VzJyBsaW5rIG9uIHRoZSBXZWIgQXBwbGljYXRpb24gaG9tZSBwYWdlIHRvDQotY2hlY2sgdGhlIHN1Y2Nlc3NmdWwgaW5zdGFsbGF0aW9uIG9mIGEgc2VydmljZS4gVGhlIHNlcnZpY2VzIGFuZA0KLXRoZSBvcGVyYXRpb25zIG9mIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgc2VydmljZXMgd2lsbCBiZSBkaXNwbGF5ZWQNCi1vbiB0aGUgYXZhaWxhYmxlIHNlcnZpY2VzIHBhZ2UuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvY2xpcF9pbWFnZTAxMi5qcGciIGFsdD0iIiAvPjwvcD4NCi08cD5JZiB0aGUgc2VydmljZSBoYXMgZGVwbG95bWVudCB0aW1lIGVycm9ycyBpdCB3aWxsIGxpc3QgdGhvc2UNCi1zZXJ2aWNlcyBhcyBmYXVsdHkgc2VydmljZXMuIElmIHlvdSBjbGljayBvbiB0aGUgbGluaywgeW91IHdpbGwgc2VlDQotdGhlIGRlcGxveW1lbnQgZmF1bHQgZXJyb3IgbWVzc2FnZXMuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvZmF1bHRzZXJ2aWNlLmpwZyIgYWx0PSIiIC8+PC9wPg0KLTxwPkRlcGxveW1lbnQgdGltZSBlcnJvciBtZXNzYWdlPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxzdHJvbmc+PGltZyBzcmM9ImltYWdlcy9mYXVsdG1zZy5qcGciIGFsdD0NCi0iIiAvPjwvc3Ryb25nPjwvcD4NCi08cD5BeGlzMiBBZG1pbmlzdHJhdGlvbiBpcyBhbGwgYWJvdXQgY29uZmlndXJpbmcgQXhpczIgYXQgdGhlIHJ1bg0KLXRpbWUgYW5kIHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgdHJhbnNpZW50LiBNb3JlIGRlc2NyaXB0aW9ucyBhcmUNCi1hdmFpbGFibGUgaW4gdGhlIDxhIGhyZWY9IndlYmFkbWluZ3VpZGUuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPkF4aXMyDQotV2ViIEFkbWluaXN0cmF0aW9uIEd1aWRlPC9hPjwvcD4NCi08L2Rpdj4NCi08YSBuYW1lPSJhZHZhbmNlZCIgaWQ9ImFkdmFuY2VkIj48L2E+DQotPGgyPkFkdmFuY2VkPC9oMj4NCi08YSBuYW1lPSJzb3VyY2UiIGlkPSJzb3VyY2UiPjwvYT4NCi08aDI+QXhpczIgU291cmNlIERpc3RyaWJ1dGlvbjwvaDI+DQotPGEgbmFtZT0iX1RvYzk2Njk4MDgzIj48L2E+IEJ5IHVzaW5nIHRoZSBTb3VyY2UgRGlzdHJpYnV0aW9uLCBib3RoDQotYmluYXJ5IGZpbGVzICh3aGljaCBjYW4gYmUgZG93bmxvYWRlZCBhcyB0aGUgPGEgaHJlZj0NCi0iI3N0ZC1iaW4iPlN0YW5kYXJkIEJpbmFyeSBEaXN0cmlidXRpb248L2E+KSBhbmQgdGhlIGF4aXMyLndhciBmaWxlDQotKHdoaWNoIGNhbiBiZSBkb3dubG9hZGVkIGFzIHRoZSA8YSBocmVmPSIjd2FyMSI+V0FSDQotZGlzdHJpYnV0aW9uPC9hPikgY2FuIGJlIGJ1aWx0IHVzaW5nIE1hdmVuIGNvbW1hbmRzLg0KLTxwPlJlcXVpcmVkIGphciBmaWxlcyBkbyBub3QgY29tZSB3aXRoIHRoZSBkaXN0cmlidXRpb24gYW5kIHRoZXkNCi13aWxsIGFsc28gaGF2ZSB0byBiZSBidWlsdCBieSBydW5uaW5nIHRoZSBtYXZlbiBjb21tYW5kLiBCZWZvcmUgd2UNCi1nbyBhbnkgZnVydGhlciwgaXQgaXMgbmVjZXNzYXJ5IHRvIGluc3RhbGwgPGEgaHJlZj0NCi0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvIiB0YXJnZXQ9Il9ibGFuayI+TWF2ZW4yPC9hPiBhbmQNCi1zZXQgdXAgaXRzIGVudmlyb25tZW50LCBhcyBleHBsYWluZWQgYmVsb3cuPC9wPg0KLTxhIG5hbWU9ImVudi1zcmMiIGlkPSJlbnYtc3JjIj48L2E+DQotPGgzPlNldHRpbmcgVXAgdGhlIEVudmlyb25tZW50IGFuZCBUb29sczwvaDM+DQotPGEgbmFtZT0ibWF2ZW4iIGlkPSJtYXZlbiI+PC9hPg0KLTxoND5NYXZlbjwvaDQ+DQotPHA+VGhlIEF4aXMyIGJ1aWxkIGlzIGJhc2VkIG9uIDxhIGhyZWY9DQotImh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyIgdGFyZ2V0PSJfYmxhbmsiPk1hdmVuMjwvYT4gLg0KLUhlbmNlIHRoZSBvbmx5IHByZXJlcXVpc2l0ZSB0byBidWlsZCBBeGlzMiBmcm9tIHRoZSBzb3VyY2UNCi1kaXN0cmlidXRpb24gaXMgdG8gaGF2ZSBNYXZlbiBpbnN0YWxsZWQuIEV4dGVuc2l2ZSBpbnN0cnVjdGlvbg0KLWd1aWRlcyBhcmUgYXZhaWxhYmxlIGF0IHRoZSBNYXZlbiBzaXRlLiBUaGlzIGd1aWRlIGhvd2V2ZXIgY29udGFpbnMNCi10aGUgZWFzaWVzdCBwYXRoIGZvciBxdWljayBlbnZpcm9ubWVudCBzZXR0aW5nLiBBZHZhbmNlZCB1c2VycyB3aG8NCi13aXNoIHRvIGtub3cgbW9yZSBhYm91dCBNYXZlbiBjYW4gdmlzaXQgPGEgaHJlZj0NCi0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvdXNlcnMvaW5kZXguaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPnRoaXMgc2l0ZS48L2E+PC9wPg0KLTx1bD4NCi08bGk+TVMgV2luZG93czwvbGk+DQotPC91bD4NCi08b2w+DQotPGxpPkRvd25sb2FkIGFuZCBydW4gdGhlIFdpbmRvd3MgaW5zdGFsbGVyIHBhY2thZ2UgZm9yIE1hdmVuLjwvbGk+DQotPGxpPlNldCB0aGUgJ0Vudmlyb25tZW50IFZhcmlhYmxlcycgKCBjcmVhdGUgc3lzdGVtIHZhcmlhYmxlDQotTUFWRU5fSE9NRSBhbmQgZWRpdCBwYXRoLiBlZzogIkM6XFByb2dyYW0gRmlsZXNcQXBhY2hlIFNvZnR3YXJlDQotRm91bmRhdGlvblxtYXZlbi0yLjAuNyI7IHBhdGggJU1BVkVOX0hPTUUlXGJpbik8L2xpPg0KLTxsaT5NYWtlIHN1cmUgdGhhdCB0aGUgc3lzdGVtIHZhcmlhYmxlIEpBVkFfSE9NRSBpcyBzZXQgdG8gdGhlDQotbG9jYXRpb24gb2YgeW91ciBKREssIGVnLiBDOlxQcm9ncmFtIEZpbGVzXEphdmFcamRrMS41LjBfMTE8L2xpPg0KLTxsaT5SdW4gbXZuIC12IG9yIG12biAtdmVyc2lvbiB0byB2ZXJpZnkgdGhhdCBpdCBpcyBjb3JyZWN0bHkNCi0gaW5zdGFsbGVkLjwvbGk+DQotPC9vbD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iY2xpcF9pbWFnZTAwMiAoMTVLKSIgc3JjPQ0KLSJpbWFnZXMvY2xpcF9pbWFnZTAwMi5qcGciIC8+PC9wPg0KLTx1bD4NCi08bGk+VW5peCBiYXNlZCBPUyAoTGludXggZXRjKTwvbGk+DQotPC91bD4NCi08cD5UaGUgdGFyIGJhbGwgb3IgdGhlIHppcCBhcmNoaXZlIGlzIHRoZSBiZXN0IG9wdGlvbi4gT25jZSB0aGUNCi1hcmNoaXZlIGlzIGRvd25sb2FkZWQgZXhwYW5kIGl0IHRvIGEgZGlyZWN0b3J5IG9mIGNob2ljZSBhbmQgc2V0DQotdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE1BVkVOX0hPTUUgYW5kIGFkZCBNQVZFTl9IT01FL2JpbiB0byB0aGUNCi1wYXRoIGFzIHdlbGwuIDxhIGhyZWY9DQotImh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2Rvd25sb2FkLmh0bWwiPk1vcmUNCi1pbnN0cnVjdGlvbnM8L2E+IGZvciBpbnN0YWxsaW5nIE1hdmVuIGluIFVuaXggYmFzZWQgb3BlcmF0aW5nDQotc3lzdGVtcy48L3A+DQotPHA+T25jZSBNYXZlbiBpcyBwcm9wZXJseSBpbnN0YWxsZWQsIHlvdSBjYW4gc3RhcnQgYnVpbGRpbmcNCi1BeGlzMi48L3A+DQotPHA+PGEgaHJlZj0iLi4vZmFxLmh0bWwjZDQiPk1hdmVuIGNvbW1hbmRzIHRoYXQgYXJlIGZyZXF1ZW50bHkNCi11c2VkPC9hPiBpbiBBeGlzMiBhcmUgbGlzdGVkIG9uIHRoZSA8YSBocmVmPSIuLi9mYXEuaHRtbCI+RkFRczwvYT4NCi1wYWdlLjwvcD4NCi08YSBuYW1lPSJfVG9jOTY2OTgwODUiPjwvYT4NCi08aDM+QnVpbGRpbmcgQmluYXJpZXMgYW5kIHRoZSBXQVIgRmlsZSBVc2luZyB0aGUgU291cmNlDQotRGlzdHJpYnV0aW9uPC9oMz4NCi08cD5UaGUgU291cmNlIERpc3RyaWJ1dGlvbiBpcyBhdmFpbGFibGUgYXMgYSB6aXBwZWQgYXJjaGl2ZS4gQWxsDQotdGhlIG5lY2Vzc2FyeSBidWlsZCBzY3JpcHRzIGFyZSBpbmNsdWRlZCB3aXRoIHRoZSBzb3VyY2UNCi1kaXN0cmlidXRpb24uIE9uY2UgdGhlIHNvdXJjZSBhcmNoaXZlIGlzIGV4cGFuZGVkIGludG8gYSBkaXJlY3RvcnkNCi1vZiBjaG9pY2UsIG1vdmluZyB0byB0aGUgcGFydGljdWxhciBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcNCi08Y29kZT5tdm4gaW5zdGFsbDwvY29kZT4gY29tbWFuZCB3aWxsIGJ1aWxkIHRoZSBBeGlzMiBqYXIgZmlsZS48L3A+DQotPHA+T25jZSB0aGUgY29tbWFuZCBjb21wbGV0ZXMsIHRoZSBiaW5hcmllcyAoamFyIGZpbGVzIGluIHRoaXMNCi1jYXNlKSBjYW4gYmUgZm91bmQgYXQgYSBuZXdseSBjcmVhdGVkICJ0YXJnZXQiIGRpcmVjdG9yeS48L3A+DQotPHA+PHN0cm9uZz5Ob3RlOiBGb3IgdGhlIGZpcnN0IE1hdmVuIGJ1aWxkIChpZiB0aGUgbWF2ZW4gcmVwb3NpdG9yeQ0KLWlzIG5vdCBidWlsdCBmaXJzdCkgaXQgd2lsbCB0YWtlIGEgd2hpbGUgc2luY2UgdGhlIHJlcXVpcmVkIGphcnMNCi1uZWVkIHRvIGJlIGRvd25sb2FkZWQuIEhvd2V2ZXIsIHRoaXMgaXMgYSBvbmNlIG9ubHkgcHJvY2VzcyBhbmQNCi13aWxsIG5vdCBhZmZlY3QgYW55IHN1Y2Nlc3NpdmUgYnVpbGRzLjwvc3Ryb25nPjwvcD4NCi08YSBuYW1lPSJ3YXIiIGlkPSJ3YXIiPjwvYT4NCi08cD5UaGUgZGVmYXVsdCBtYXZlbiBidWlsZCB3aWxsIGdlbmVyYXRlIHRoZSB3YXIgdW5kZXIgbW9kdWxlcy93ZWJhcHAvdGFyZ2V0IGRpcmVjdG9yeTwvcD4NCi08YSBuYW1lPSJfVG9jOTY2OTgwODYiPjwvYT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qYXh3cy1ndWlkZS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvamF4d3MtZ3VpZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJkNTk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qYXh3cy1ndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjk1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi0NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotICA8dGl0bGU+SkFYLVdTIEd1aWRlPC90aXRsZT4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotICA8aDE+SkFYLVdTIEd1aWRlPC9oMT4NCi0NCi0gIDxoMj5UYWJsZSBvZiBDb250ZW50czwvaDI+DQotDQotICA8b2w+DQotICAgIDxsaT48YSBocmVmPSIjSkFYV1NJbnRybyI+SW50cm9kdWN0aW9uIHRvIEpBWC1XUzwvYT48L2xpPg0KLQ0KLSAgICA8bGk+PGEgaHJlZj0iI0pBWEJJbnRybyI+SW50cm9kdWN0aW9uIHRvIEpBWEI8L2E+PC9saT4NCi0NCi0gICAgPGxpPg0KLSAgICAgIDxhIGhyZWY9IiNEZXZlbG9wU2VydmljZSI+RGV2ZWxvcGluZyBKQVgtV1MgV2ViIHNlcnZpY2VzPC9hPg0KLQ0KLSAgICAgIDxvbCB0eXBlPSdhJz4NCi0gICAgICAgIDxsaT48YSBocmVmPSIjQm90dG9tVXBTZXJ2aWNlIj5Gcm9tIGEgSmF2YUJlYW4NCi0gICAgICAgIChib3R0b20tdXApPC9hPjwvbGk+DQotDQotICAgICAgICA8bGk+PGEgaHJlZj0iI1RvcERvd25TZXJ2aWNlIj5Gcm9tIGEgV1NETCBkb2N1bWVudA0KLSAgICAgICAgKHRvcC1kb3duKTwvYT48L2xpPg0KLSAgICAgIDwvb2w+DQotICAgIDwvbGk+DQotDQotICAgIDxsaT4NCi0gICAgICA8YSBocmVmPSIjRGVwbG95U2VydmljZSI+UGFja2FnaW5nIGFuZCBkZXBsb3lpbmcgYSBKQVgtV1MNCi0gICAgICBzZXJ2aWNlPC9hPg0KLQ0KLSAgICAgIDxvbCB0eXBlPSdhJz4NCi0gICAgICAgIDxsaT48YSBocmVmPSIjUHJveHlDbGllbnQiPkRldmVsb3BpbmcgYSBKQVgtV1MgY2xpZW50IGZyb20NCi0gICAgICAgIGEgV1NETCBkb2N1bWVudDwvYT48L2xpPg0KLQ0KLSAgICAgICAgPGxpPjxhIGhyZWY9IiNEaXNwYXRjaENsaWVudCI+RGV2ZWxvcGluZyBhIGR5bmFtaWMgY2xpZW50DQotICAgICAgICB1c2luZyBKQVgtV1MgQVBJczwvYT48L2xpPg0KLSAgICAgIDwvb2w+DQotICAgIDwvbGk+DQotDQotICAgIDxsaT48YSBocmVmPSIjRGV2ZWxvcENsaWVudCI+RGV2ZWxvcGluZyBKQVgtV1MgY2xpZW50czwvYT48L2xpPg0KLQ0KLSAgICA8bGk+PGEgaHJlZj0iI1J1bkNsaWVudCI+UnVubmluZyBhIEpBWC1XUyBjbGllbnQ8L2E+PC9saT4NCi0NCi0gICAgPGxpPjxhIGhyZWY9IiNBc3luYyI+SW52b2tpbmcgSkFYLVdTIFdlYiBzZXJ2aWNlcw0KLSAgICBhc3luY2hyb25vdXNseTwvYT48L2xpPg0KLQ0KLSAgICA8bGk+PGEgaHJlZj0iI0hhbmRsZXJzIj5Vc2luZyBoYW5kbGVycyBpbiBKQVgtV1MgV2ViDQotICAgIHNlcnZpY2VzPC9hPjwvbGk+DQotDQotICAgIDxsaT48YSBocmVmPSIjSFRUUFNlc3Npb24iPkVuYWJsaW5nIEhUVFAgc2Vzc2lvbiBtYW5hZ2VtZW50DQotICAgIHN1cHBvcnQgZm9yIEpBWC1XUyBhcHBsaWNhdGlvbnM8L2E+PC9saT4NCi0NCi0gICAgPGxpPjxhIGhyZWY9IiNNVE9NIj5FbmFibGluZyBNVE9NPC9hPjwvbGk+DQotICA8L29sPg0KLQ0KLSAgPGgyPjxhIG5hbWU9IkpBWFdTSW50cm8iIGlkPSJKQVhXU0ludHJvIj5JbnRyb2R1Y3Rpb24gdG8NCi0gIEpBWC1XUzwvYT48L2gyPkpBWC1XUyAyLjAgaXMgYSBuZXcgcHJvZ3JhbW1pbmcgbW9kZWwgdGhhdA0KLSAgc2ltcGxpZmllcyBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0aHJvdWdoIHN1cHBvcnQgb2YgYSBzdGFuZGFyZCwNCi0gIGFubm90YXRpb24tYmFzZWQgbW9kZWwgdG8gZGV2ZWxvcCBXZWIgU2VydmljZSBhcHBsaWNhdGlvbnMgYW5kDQotICBjbGllbnRzLiBUaGUgSkFYLVdTIDIuMCBzcGVjaWZpY2F0aW9uIHN0cmF0ZWdpY2FsbHkgYWxpZ25zIGl0c2VsZg0KLSAgd2l0aCB0aGUgY3VycmVudCBpbmR1c3RyeSB0cmVuZCB0b3dhcmRzIGEgbW9yZSBkb2N1bWVudC1jZW50cmljDQotICBtZXNzYWdpbmcgbW9kZWwgYW5kIHJlcGxhY2VzIHRoZSByZW1vdGUgcHJvY2VkdXJlIGNhbGwNCi0gIHByb2dyYW1taW5nIG1vZGVsIGFzIGRlZmluZWQgYnkgSkFYLVJQQy4gSkFYLVdTIGlzIHRoZSBzdHJhdGVnaWMNCi0gIHByb2dyYW1taW5nIG1vZGVsIGZvciBkZXZlbG9waW5nIFdlYiBzZXJ2aWNlcyBhbmQgaXMgYSByZXF1aXJlZA0KLSAgcGFydCBvZiB0aGUgSmF2YSBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIDUgKEphdmEgRUUgNSkuIFRoZQ0KLSAgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWC1XUyBwcm9ncmFtbWluZyBzdGFuZGFyZCBwcm92aWRlcyB0aGUNCi0gIGZvbGxvd2luZyBlbmhhbmNlbWVudHMgZm9yIGRldmVsb3BpbmcgV2ViIHNlcnZpY2VzIGFuZCBjbGllbnRzOg0KLQ0KLSAgPHVsPg0KLSAgICA8bGk+QmV0dGVyIHBsYXRmb3JtIGluZGVwZW5kZW5jZSBmb3IgSmF2YSBhcHBsaWNhdGlvbnMuPC9saT4NCi0NCi0gICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj48YnIgLz4NCi0gICAgVXNpbmcgSkFYLVdTIEFQSXMsIGRldmVsb3BtZW50IG9mIFdlYiBzZXJ2aWNlcyBhbmQgY2xpZW50cyBpcw0KLSAgICBzaW1wbGlmaWVkIHdpdGggYmV0dGVyIHBsYXRmb3JtIGluZGVwZW5kZW5jZSBmb3IgSmF2YQ0KLSAgICBhcHBsaWNhdGlvbnMuIEpBWC1XUyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGR5bmFtaWMgcHJveHkNCi0gICAgbWVjaGFuaXNtIHRvIHByb3ZpZGUgYSBmb3JtYWwgZGVsZWdhdGlvbiBtb2RlbCB3aXRoIGEgcGx1Z2dhYmxlDQotICAgIHByb3ZpZGVyLiBUaGlzIGlzIGFuIGVuaGFuY2VtZW50IG92ZXIgSkFYLVJQQywgd2hpY2ggcmVsaWVzIG9uDQotICAgIHRoZSBnZW5lcmF0aW9uIG9mIHZlbmRvci1zcGVjaWZpYyBzdHVicyBmb3IgaW52b2NhdGlvbi48YnIgLz4NCi0gICAgPGJyIC8+PC9saT4NCi0NCi0gICAgPGxpPkFubm90YXRpb25zPC9saT4NCi0NCi0gICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj4NCi0gICAgICA8YnIgLz4NCi0gICAgICBKQVgtV1MgaW50cm9kdWNlcyBzdXBwb3J0IGZvciBhbm5vdGF0aW5nIEphdmEgY2xhc3NlcyB3aXRoDQotICAgICAgbWV0YWRhdGEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgSmF2YSBjbGFzcyBpcyBhIFdlYiBzZXJ2aWNlLg0KLSAgICAgIEpBWC1XUyBzdXBwb3J0cyB0aGUgdXNlIG9mIGFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBNZXRhZGF0YQ0KLSAgICAgIEZhY2lsaXR5IGZvciB0aGUgSmF2YSBQcm9ncmFtbWluZyBMYW5ndWFnZSAoSlNSIDE3NSkNCi0gICAgICBzcGVjaWZpY2F0aW9uLCB0aGUgV2ViIFNlcnZpY2VzIE1ldGFkYXRhIGZvciB0aGUgSmF2YQ0KLSAgICAgIFBsYXRmb3JtIChKU1IgMTgxKSBzcGVjaWZpY2F0aW9uIGFuZCBhbm5vdGF0aW9ucyBkZWZpbmVkIGJ5DQotICAgICAgdGhlIEpBWC1XUyAyLjAgc3BlY2lmaWNhdGlvbi4gVXNpbmcgYW5ub3RhdGlvbnMgd2l0aGluIHRoZQ0KLSAgICAgIEphdmEgc291cmNlIGFuZCB3aXRoaW4gdGhlIEphdmEgY2xhc3Mgc2ltcGxpZmllcyBkZXZlbG9wbWVudA0KLSAgICAgIG9mIFdlYiBzZXJ2aWNlcyBieSBkZWZpbmluZyBzb21lIG9mIHRoZSBhZGRpdGlvbmFsDQotICAgICAgaW5mb3JtYXRpb24gdGhhdCBpcyB0eXBpY2FsbHkgb2J0YWluZWQgZnJvbSBkZXBsb3ltZW50DQotICAgICAgZGVzY3JpcHRvciBmaWxlcywgV1NETCBmaWxlcywgb3IgbWFwcGluZyBtZXRhZGF0YSBmcm9tIFhNTA0KLSAgICAgIGFuZCBXU0RMIGZpbGVzIGludG8gdGhlIHNvdXJjZSBhcnRpZmFjdHMuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZW1iZWQgYSBzaW1wbGUgQFdlYlNlcnZpY2UgdGFnIGluIHRoZQ0KLSAgICAgIEphdmEgc291cmNlIHRvIGV4cG9zZSB0aGUgYmVhbiBhcyBhIFdlYiBzZXJ2aWNlLg0KLSAgICAgIDxwcmU+DQotICAgICAgQFdlYlNlcnZpY2UgDQotDQotICAgICAgcHVibGljIGNsYXNzIFF1b3RlQmVhbiBpbXBsZW1lbnRzIFN0b2NrUXVvdGUgew0KLQ0KLSAgICAgICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UXVvdGUoU3RyaW5nIHN5bSkgeyAuLi4gfQ0KLQ0KLSAgICAgIH0NCi08L3ByZT5UaGUgPGNvZGU+QFdlYlNlcnZpY2U8L2NvZGU+IGFubm90YXRpb24gdGVsbHMgdGhlIHNlcnZlcg0KLXJ1bnRpbWUgdG8gZXhwb3NlIGFsbCBwdWJsaWMgbWV0aG9kcyBvbiB0aGF0IGJlYW4gYXMgYSBXZWIgc2VydmljZS4NCi1BZGRpdGlvbmFsIGxldmVscyBvZiBncmFudWxhcml0eSBjYW4gYmUgY29udHJvbGxlZCBieSBhZGRpbmcNCi1hZGRpdGlvbmFsIGFubm90YXRpb25zIG9uIGluZGl2aWR1YWwgbWV0aG9kcyBvciBwYXJhbWV0ZXJzLiBVc2luZw0KLWFubm90YXRpb25zIG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGV4cG9zZSBKYXZhIGFydGlmYWN0cyBhcyBXZWINCi1zZXJ2aWNlcy4gSW4gYWRkaXRpb24sIGFzIGFydGlmYWN0cyBhcmUgY3JlYXRlZCBmcm9tIHVzaW5nIHNvbWUgb2YNCi10aGUgdG9wLWRvd24gbWFwcGluZyB0b29scyBzdGFydGluZyBmcm9tIGEgV1NETCBmaWxlLCBhbm5vdGF0aW9ucw0KLWFyZSBpbmNsdWRlZCB3aXRoaW4gdGhlIHNvdXJjZSBhbmQgSmF2YSBjbGFzc2VzIGFzIGEgd2F5IG9mDQotY2FwdHVyaW5nIHRoZSBtZXRhZGF0YSBhbG9uZyB3aXRoIHRoZSBzb3VyY2UgZmlsZXMuPGJyIC8+DQotICAgICAgVXNpbmcgYW5ub3RhdGlvbnMgYWxzbyBpbXByb3ZlcyB0aGUgZGV2ZWxvcG1lbnQgb2YgV2ViDQotICAgICAgc2VydmljZXMgd2l0aGluIGEgdGVhbSBzdHJ1Y3R1cmUgYmVjYXVzZSB5b3UgZG8gbm90IG5lZWQgdG8NCi0gICAgICBkZWZpbmUgZXZlcnkgV2ViIHNlcnZpY2UgaW4gYSBzaW5nbGUgb3IgY29tbW9uIGRlcGxveW1lbnQNCi0gICAgICBkZXNjcmlwdG9yIGFzIHJlcXVpcmVkIHdpdGggSkFYLVJQQyBXZWIgc2VydmljZXMuIFRha2luZw0KLSAgICAgIGFkdmFudGFnZSBvZiBhbm5vdGF0aW9ucyB3aXRoIEpBWC1XUyBXZWIgc2VydmljZXMgYWxsb3dzDQotICAgICAgcGFyYWxsZWwgZGV2ZWxvcG1lbnQgb2YgdGhlIHNlcnZpY2UgYW5kIHRoZSByZXF1aXJlZA0KLSAgICAgIG1ldGFkYXRhLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICA8L2xpPg0KLQ0KLSAgICA8bGk+SW52b2tpbmcgV2ViIHNlcnZpY2VzIGFzeW5jaHJvbm91c2x5PC9saT4NCi0NCi0gICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj4NCi0gICAgICA8YnIgLz4NCi0gICAgICBXaXRoIEpBWC1XUywgV2ViIHNlcnZpY2VzIGFyZSBjYWxsZWQgYm90aCBzeW5jaHJvbm91c2x5IGFuZA0KLSAgICAgIGFzeW5jaHJvbm91c2x5LiBKQVgtV1MgYWRkcyBzdXBwb3J0IGZvciBib3RoIGEgcG9sbGluZyBhbmQNCi0gICAgICBjYWxsYmFjayBtZWNoYW5pc20gd2hlbiBjYWxsaW5nIFdlYiBzZXJ2aWNlcyBhc3luY2hyb25vdXNseS4NCi0gICAgICBVc2luZyBhIHBvbGxpbmcgbW9kZWwsIGEgY2xpZW50IGNhbiBpc3N1ZSBhIHJlcXVlc3QsIGdldCBhDQotICAgICAgcmVzcG9uc2Ugb2JqZWN0IGJhY2ssIHdoaWNoIGlzIHBvbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlDQotICAgICAgc2VydmVyIGhhcyByZXNwb25kZWQuIFdoZW4gdGhlIHNlcnZlciByZXNwb25kcywgdGhlIGFjdHVhbA0KLSAgICAgIHJlc3BvbnNlIGlzIHJldHJpZXZlZC4gVXNpbmcgdGhlIGNhbGxiYWNrIG1vZGVsLCB0aGUgY2xpZW50DQotICAgICAgcHJvdmlkZXMgYSBjYWxsYmFjayBoYW5kbGVyIHRvIGFjY2VwdCBhbmQgcHJvY2VzcyB0aGUgaW5ib3VuZA0KLSAgICAgIHJlc3BvbnNlIG9iamVjdC4gQm90aCB0aGUgcG9sbGluZyBhbmQgY2FsbGJhY2sgbW9kZWxzIGVuYWJsZQ0KLSAgICAgIHRoZSBjbGllbnQgdG8gZm9jdXMgb24gY29udGludWluZyB0byBwcm9jZXNzIHdvcmsgd2l0aG91dA0KLSAgICAgIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdG8gcmV0dXJuLCB3aGlsZSBwcm92aWRpbmcgZm9yIGEgbW9yZQ0KLSAgICAgIGR5bmFtaWMgYW5kIGVmZmljaWVudCBtb2RlbCB0byBpbnZva2UgV2ViIHNlcnZpY2VzLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIEZvciBleGFtcGxlLCBhIFdlYiBzZXJ2aWNlIGludGVyZmFjZSBtaWdodCBoYXZlIG1ldGhvZHMgZm9yDQotICAgICAgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHJlcXVlc3RzLiBBc3luY2hyb25vdXMNCi0gICAgICByZXF1ZXN0cyBhcmUgaWRlbnRpZmllZCBpbiBib2xkIGJlbG93Og0KLSAgICAgIDxwcmU+DQotICAgICAgQFdlYlNlcnZpY2UNCi0gICAgICBwdWJsaWMgaW50ZXJmYWNlIENyZWRpdFJhdGluZ1NlcnZpY2Ugew0KLSAgICAgICAgICAgIC8vIHN5bmMgb3BlcmF0aW9uDQotICAgICAgICAgICAgU2NvcmUgICAgICBnZXRDcmVkaXRTY29yZShDdXN0b21lciBjdXN0b21lcik7DQotICAgICAgICAgICAgLy8gYXN5bmMgb3BlcmF0aW9uIHdpdGggcG9sbGluZw0KLSAgICAgICAgICAgIDxiPlJlc3BvbnNlJmx0O1Njb3JlJmd0OzwvYj4gZ2V0Q3JlZGl0U2NvcmVBc3luYyhDdXN0b21lciBjdXN0b21lcik7DQotICAgICAgICAgICAgLy8gYXN5bmMgb3BlcmF0aW9uIHdpdGggY2FsbGJhY2sNCi0gICAgICAgICAgICA8Yj5GdXR1cmUmbHQ7PyZndDs8L2I+IGdldENyZWRpdFNjb3JlQXN5bmMoQ3VzdG9tZXIgY3VzdG9tZXIsIA0KLSAgICAgICAgICAgICAgIDxiPkFzeW5jSGFuZGxlciZsdDtTY29yZSZndDs8L2I+IGhhbmRsZXIpOw0KLSAgICAgIH0NCi08L3ByZT5UaGUgYXN5bmNocm9ub3VzIGludm9jYXRpb24gdGhhdCB1c2VzIHRoZSBjYWxsYmFjayBtZWNoYW5pc20NCi1yZXF1aXJlcyBhbiBhZGRpdGlvbmFsIGlucHV0IGJ5IHRoZSBjbGllbnQgcHJvZ3JhbW1lci4gVGhlIGNhbGxiYWNrDQotaXMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdGhhdCB3aWxsIGJlDQotZXhlY3V0ZWQgd2hlbiBhbiBhc3luY2hyb25vdXMgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuIFRoZSBmb2xsb3dpbmcNCi1pcyBhIGNvZGUgZXhhbXBsZSBmb3IgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIGhhbmRsZXI6DQotICAgICAgPHByZT4NCi0gICAgICBDcmVkaXRSYXRpbmdTZXJ2aWNlIHN2YyA9IC4uLjsNCi0NCi0gICAgICA8Yj5GdXR1cmUmbHQ7PyZndDs8L2I+IGludm9jYXRpb24gPSBzdmMuZ2V0Q3JlZGl0U2NvcmVBc3luYyhjdXN0b21lckZyZWQsDQotICAgICAgICA8Yj5uZXcgQXN5bmNIYW5kbGVyJmx0O1Njb3JlJmd0OygpIHsNCi0gICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlICgNCi0gICAgICAgICAgICAgICBSZXNwb25zZSZsdDtTY29yZSZndDsgcmVzcG9uc2UpDQotICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICBTY29yZSBzY29yZSA9IHJlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgICAgICAgIC8vIGRvIHdvcmsgaGVyZS4uLg0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgfTwvYj4NCi0gICAgICApOw0KLTwvcHJlPlRoZSBmb2xsb3dpbmcgaXMgYSBjb2RlIGV4YW1wbGUgZm9yIGFuIGFzeW5jaHJvbm91cyBwb2xsaW5nDQotY2xpZW50Og0KLSAgICAgIDxwcmU+DQotICAgICAgQ3JlZGl0UmF0aW5nU2VydmljZSBzdmMgPSAuLi47DQotICAgICAgPGI+UmVzcG9uc2UmbHQ7U2NvcmUmZ3Q7IHJlc3BvbnNlPC9iPiA9IHN2Yy5nZXRDcmVkaXRTY29yZUFzeW5jKGN1c3RvbWVyRnJlZCk7DQotDQotICAgICAgd2hpbGUgKDxiPiFyZXNwb25zZS5pc0RvbmUoKTwvYj4pIHsNCi0gICAgICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdoaWxlIHdlIHdhaXQNCi0gICAgICB9DQotDQotICAgICAgLy8gbm8gY2FzdCBuZWVkZWQsIHRoYW5rcyB0byBnZW5lcmljcw0KLSAgICAgIFNjb3JlIHNjb3JlID0gPGI+cmVzcG9uc2UuZ2V0KCk8L2I+Ow0KLTwvcHJlPjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICA8L2xpPg0KLQ0KLSAgICA8bGk+VXNpbmcgcmVzb3VyY2UgaW5qZWN0aW9uPC9saT4NCi0NCi0gICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj5KQVgtV1Mgc3VwcG9ydHMgcmVzb3VyY2UgaW5qZWN0aW9uDQotICAgIHRvIGZ1cnRoZXIgc2ltcGxpZnkgZGV2ZWxvcG1lbnQgb2YgV2ViIHNlcnZpY2VzLiBKQVgtV1MgdXNlcw0KLSAgICB0aGlzIGtleSBmZWF0dXJlIG9mIEphdmEgRUUgNSB0byBzaGlmdCB0aGUgYnVyZGVuIG9mIGNyZWF0aW5nDQotICAgIGFuZCBpbml0aWFsaXppbmcgY29tbW9uIHJlc291cmNlcyBpbiBhIEphdmEgcnVudGltZSBlbnZpcm9ubWVudA0KLSAgICBmcm9tIHlvdXIgV2ViIHNlcnZpY2UgYXBwbGljYXRpb24gdG8gdGhlIGFwcGxpY2F0aW9uIGNvbnRhaW5lcg0KLSAgICBlbnZpcm9ubWVudCBpdHNlbGYuIEpBWC1XUyBwcm92aWRlcyBzdXBwb3J0IGZvciBhIHN1YnNldCBvZg0KLSAgICBhbm5vdGF0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIGluIEpTUi0yNTAgZm9yIHJlc291cmNlIGluamVjdGlvbg0KLSAgICBhbmQgYXBwbGljYXRpb24gbGlmZWN5Y2xlIGluIGl0cyBydW50aW1lLjxiciAvPg0KLSAgICAgIEF4aXMyIHN1cHBvcnRzIHRoZSBKQVgtV1MgdXNhZ2Ugb2YgdGhlIDxjb2RlPkBSZXNvdXJjZTwvY29kZT4NCi0gICAgICBhbm5vdGF0aW9uIGZvciByZXNvdXJjZSBpbmplY3Rpb24uIFRoZSA8Y29kZT5AUmVzb3VyY2U8L2NvZGU+DQotICAgICAgYW5ub3RhdGlvbiBpcyBkZWZpbmVkIGJ5IHRoZSBKU1ItMjUwLCBDb21tb24gQW5ub3RhdGlvbnMNCi0gICAgICBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgaW5jbHVkZWQgaW4gSmF2YSBQbGF0Zm9ybSwgRW50ZXJwcmlzZQ0KLSAgICAgIEVkaXRpb24gNSAoSmF2YSBFRSA1KS4gQnkgcGxhY2luZyB0aGUgPGNvZGU+QFJlc291cmNlPC9jb2RlPg0KLSAgICAgIGFubm90YXRpb24gb24gYSBzZXJ2aWNlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uLCB5b3UgY2FuDQotICAgICAgcmVxdWVzdCBhIHJlc291cmNlIGluamVjdGlvbiBhbmQgY29sbGVjdCB0aGUNCi0gICAgICA8Y29kZT5qYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ8L2NvZGU+IGludGVyZmFjZSByZWxhdGVkDQotICAgICAgdG8gdGhhdCBwYXJ0aWN1bGFyIGVuZHBvaW50IGludm9jYXRpb24uIFdoZW4gdGhlIGVuZHBvaW50DQotICAgICAgc2VlcyB0aGUgPGNvZGU+QFJlc291cmNlPC9jb2RlPiBhbm5vdGF0aW9uLCB0aGUgZW5kcG9pbnQgYWRkcw0KLSAgICAgIHRoZSBhbm5vdGF0ZWQgdmFyaWFibGUgd2l0aCBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBiZWZvcmUgdGhlDQotICAgICAgc2VydmxldCBpcyBwbGFjZWQgaW50byBzZXJ2aWNlLiBGcm9tIHRoZQ0KLSAgICAgIDxjb2RlPldlYlNlcnZpY2VDb250ZXh0PC9jb2RlPiBpbnRlcmZhY2UsIHlvdSBjYW4gY29sbGVjdCB0aGUNCi0gICAgICA8Y29kZT5NZXNzYWdlQ29udGV4dDwvY29kZT4gZm9yIHRoZSByZXF1ZXN0IGFzc29jaWF0ZWQgd2l0aA0KLSAgICAgIHRoZSBwYXJ0aWN1bGFyIG1ldGhvZCBjYWxsIHVzaW5nIHRoZQ0KLSAgICAgIDxjb2RlPmdldE1lc3NhZ2VDb250ZXh0KCk8L2NvZGU+IG1ldGhvZC48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdXNpbmcgdGhlDQotICAgICAgPGNvZGU+QFJlc291cmNlPC9jb2RlPiBhbm5vdGF0aW9uIGZvciByZXNvdXJjZSBpbmplY3Rpb246DQotICAgICAgPHByZT5AV2ViU2VydmljZQ0KLXB1YmxpYyBjbGFzcyBNeVNlcnZpY2Ugew0KLSAgICANCi0gICAgQFJlc291cmNlDQotICAgIHByaXZhdGUgV2ViU2VydmljZUNvbnRleHQgY3R4Ow0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8gKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAg4oCmDQotICAgIH0NCi0gICAgIA0KLX0NCi08L3ByZT5SZWZlciB0byBzZWN0aW9ucyA1LjIuMSBhbmQgNS4zIG9mIHRoZSBKQVgtV1MgMi4wDQotc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiByZXNvdXJjZSBpbmplY3Rpb24uPGJyIC8+DQotDQotICAgICAgPGJyIC8+DQotICAgIDwvbGk+DQotDQotICAgIDxsaT5EYXRhIGJpbmRpbmcgd2l0aCBKYXZhIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcgKEpBWEIpDQotICAgIDIuMDwvbGk+DQotDQotICAgIDxsaSBzdHlsZT0ibGlzdC1zdHlsZTogbm9uZSI+PGJyIC8+DQotICAgIEpBWC1XUyBsZXZlcmFnZXMgdGhlIEpBWEIgMi4wIEFQSSBhbmQgdG9vbHMgYXMgdGhlIGJpbmRpbmcNCi0gICAgdGVjaG5vbG9neSBmb3IgbWFwcGluZ3MgYmV0d2VlbiBKYXZhIG9iamVjdHMgYW5kIFhNTCBkb2N1bWVudHMuDQotICAgIEpBWC1XUyB0b29saW5nIHJlbGllcyBvbiBKQVhCIHRvb2xpbmcgZm9yIGRlZmF1bHQgZGF0YSBiaW5kaW5nDQotICAgIGZvciB0d28td2F5IG1hcHBpbmdzIGJldHdlZW4gSmF2YSBvYmplY3RzIGFuZCBYTUwNCi0gICAgZG9jdW1lbnRzLjxiciAvPg0KLSAgICA8YnIgLz48L2xpPg0KLQ0KLSAgICA8bGk+RHluYW1pYyBhbmQgc3RhdGljIGNsaWVudHM8L2xpPg0KLQ0KLSAgICA8bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmUiPjxiciAvPg0KLSAgICBUaGUgZHluYW1pYyBjbGllbnQgQVBJIGZvciBKQVgtV1MgaXMgY2FsbGVkIHRoZSBkaXNwYXRjaCBjbGllbnQNCi0gICAgKDxjb2RlPmphdmF4LnhtbC53cy5EaXNwYXRjaDwvY29kZT4pLiBUaGUgZGlzcGF0Y2ggY2xpZW50IGlzIGFuDQotICAgIFhNTCBtZXNzYWdpbmcgb3JpZW50ZWQgY2xpZW50LiBUaGUgZGF0YSBpcyBzZW50IGluIGVpdGhlcg0KLSAgICA8Y29kZT5QQVlMT0FEPC9jb2RlPiBvciA8Y29kZT5NRVNTQUdFPC9jb2RlPiBtb2RlLiBXaGVuIHVzaW5nDQotICAgIHRoZSA8Y29kZT5QQVlMT0FEPC9jb2RlPiBtb2RlLCB0aGUgZGlzcGF0Y2ggY2xpZW50IGlzIG9ubHkNCi0gICAgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgY29udGVudHMgb2YgdGhlICZsdDtzb2FwOkJvZHkmZ3Q7DQotICAgIGFuZCBKQVgtV1MgYWRkcyB0aGUgJmx0O3NvYXA6RW52ZWxvcGUmZ3Q7IGFuZA0KLSAgICAmbHQ7c29hcDpIZWFkZXImZ3Q7IGVsZW1lbnRzLiBXaGVuIHVzaW5nIHRoZQ0KLSAgICA8Y29kZT5NRVNTQUdFPC9jb2RlPiBtb2RlLCB0aGUgZGlzcGF0Y2ggY2xpZW50IGlzIHJlc3BvbnNpYmxlDQotICAgIGZvciBwcm92aWRpbmcgdGhlIGVudGlyZSBTT0FQIGVudmVsb3BlIGluY2x1ZGluZyB0aGUNCi0gICAgJmx0O3NvYXA6RW52ZWxvcGUmZ3Q7LCAmbHQ7c29hcDpIZWFkZXImZ3Q7LCBhbmQNCi0gICAgJmx0O3NvYXA6Qm9keSZndDsgZWxlbWVudHMgYW5kIEpBWC1XUyBkb2VzIG5vdCBhZGQgYW55dGhpbmcNCi0gICAgYWRkaXRpb25hbCB0byB0aGUgbWVzc2FnZS4gVGhlIGRpc3BhdGNoIGNsaWVudCBzdXBwb3J0cw0KLSAgICBhc3luY2hyb25vdXMgaW52b2NhdGlvbnMgdXNpbmcgYSBjYWxsYmFjayBvciBwb2xsaW5nDQotICAgIG1lY2hhbmlzbS48YnIgLz4NCi0gICAgVGhlIHN0YXRpYyBjbGllbnQgcHJvZ3JhbW1pbmcgbW9kZWwgZm9yIEpBWC1XUyBpcyB0aGUgY2FsbGVkDQotICAgIHRoZSBwcm94eSBjbGllbnQuIFRoZSBwcm94eSBjbGllbnQgaW52b2tlcyBhIFdlYiBzZXJ2aWNlIGJhc2VkDQotICAgIG9uIGEgU2VydmljZSBFbmRwb2ludCBpbnRlcmZhY2UgKFNFSSkgd2hpY2ggbXVzdCBiZQ0KLSAgICBwcm92aWRlZC48YnIgLz4NCi0gICAgPGJyIC8+PC9saT4NCi0NCi0gICAgPGxpPlN1cHBvcnQgZm9yIE1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXplZCBNZWNoYW5pc20NCi0gICAgKE1UT00pPC9saT4NCi0NCi0gICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj48YnIgLz4NCi0gICAgVXNpbmcgSkFYLVdTLCB5b3UgY2FuIHNlbmQgYmluYXJ5IGF0dGFjaG1lbnRzIHN1Y2ggYXMgaW1hZ2VzIG9yDQotICAgIGZpbGVzIGFsb25nIHdpdGggV2ViIHNlcnZpY2VzIHJlcXVlc3RzLiBKQVgtV1MgYWRkcyBzdXBwb3J0IGZvcg0KLSAgICBvcHRpbWl6ZWQgdHJhbnNtaXNzaW9uIG9mIGJpbmFyeSBkYXRhIGFzIHNwZWNpZmllZCBieSBNZXNzYWdlDQotICAgIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtIChNVE9NKS48YnIgLz4NCi0gICAgPGJyIC8+PC9saT4NCi0NCi0gICAgPGxpPk11bHRpcGxlIGRhdGEgYmluZGluZyB0ZWNobm9sb2dpZXM8L2xpPg0KLQ0KLSAgICA8bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmUiPjxiciAvPg0KLSAgICBKQVgtV1MgZXhwb3NlcyB0aGUgZm9sbG93aW5nIGJpbmRpbmcgdGVjaG5vbG9naWVzIHRvIHRoZSBlbmQNCi0gICAgdXNlcjogWE1MIFNvdXJjZSwgU09BUCBBdHRhY2htZW50cyBBUEkgZm9yIEphdmEgKFNBQUopIDEuMywgYW5kDQotICAgIEphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQikgMi4wLiBYTUwgU291cmNlDQotICAgIGVuYWJsZXMgYSB1c2VyIHRvIHBhc3MgYSBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSBpbnRvIHRoZQ0KLSAgICBydW50aW1lIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRhdGEgaW4gYSBTb3VyY2Ugb2JqZWN0IHRvIGJlDQotICAgIHByb2Nlc3NlZC4gU0FBSiAxLjMgbm93IGhhcyB0aGUgYWJpbGl0eSB0byBwYXNzIGFuIGVudGlyZSBTT0FQDQotICAgIGRvY3VtZW50IGFjcm9zcyB0aGUgaW50ZXJmYWNlIHJhdGhlciB0aGFuIGp1c3QgdGhlIHBheWxvYWQNCi0gICAgaXRzZWxmLiBUaGlzIGlzIGRvbmUgYnkgdGhlIGNsaWVudCBwYXNzaW5nIHRoZSBTQUFKDQotICAgIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiBvYmplY3QgYWNyb3NzIHRoZSBpbnRlcmZhY2UuIEpBWC1XUw0KLSAgICBsZXZlcmFnZXMgdGhlIEpBWEIgMi4wIHN1cHBvcnQgYXMgdGhlIGRhdGEgYmluZGluZyB0ZWNobm9sb2d5DQotICAgIG9mIGNob2ljZSBiZXR3ZWVuIEphdmEgYW5kIFhNTC48YnIgLz4NCi0gICAgPGJyIC8+PC9saT4NCi0NCi0gICAgPGxpPlN1cHBvcnQgZm9yIFNPQVAgMS4yPC9saT4NCi0NCi0gICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lIj48YnIgLz4NCi0gICAgU3VwcG9ydCBmb3IgU09BUCAxLjIgaGFzIGJlZW4gYWRkZWQgdG8gSkFYLVdTIDIuMC4gSkFYLVdTDQotICAgIHN1cHBvcnRzIGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yIHNvIHRoYXQgeW91IGNhbiBzZW5kIGJpbmFyeQ0KLSAgICBhdHRhY2htZW50cyBzdWNoIGFzIGltYWdlcyBvciBmaWxlcyBhbG9uZyB3aXRoIFdlYiBzZXJ2aWNlcw0KLSAgICByZXF1ZXN0cy4gSkFYLVdTIGFkZHMgc3VwcG9ydCBmb3Igb3B0aW1pemVkIHRyYW5zbWlzc2lvbiBvZg0KLSAgICBiaW5hcnkgZGF0YSBhcyBzcGVjaWZpZWQgYnkgTVRPTS48YnIgLz4NCi0gICAgPGJyIC8+PC9saT4NCi0NCi0gICAgPGxpPk5ldyBkZXZlbG9wbWVudCB0b29sczwvbGk+DQotDQotICAgIDxsaSBzdHlsZT0ibGlzdC1zdHlsZTogbm9uZSI+DQotICAgICAgPGJyIC8+DQotICAgICAgSkFYLVdTIHByb3ZpZGVzIHRoZSA8Yj53c2dlbjwvYj4gYW5kIDxiPndzaW1wb3J0PC9iPg0KLSAgICAgIGNvbW1hbmQtbGluZSB0b29scyBmb3IgZ2VuZXJhdGluZyBwb3J0YWJsZSBhcnRpZmFjdHMgZm9yDQotICAgICAgSkFYLVdTIFdlYiBzZXJ2aWNlcy4gV2hlbiBjcmVhdGluZyBKQVgtV1MgV2ViIHNlcnZpY2VzLCB5b3UNCi0gICAgICBjYW4gc3RhcnQgd2l0aCBlaXRoZXIgYSBXU0RMIGZpbGUgb3IgYW4gaW1wbGVtZW50YXRpb24gYmVhbg0KLSAgICAgIGNsYXNzLiBJZiB5b3Ugc3RhcnQgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGNsYXNzLCB1c2UNCi0gICAgICB0aGUgd3NnZW4gY29tbWFuZC1saW5lIHRvb2wgdG8gZ2VuZXJhdGUgYWxsIHRoZSBXZWIgc2VydmljZXMNCi0gICAgICBzZXJ2ZXIgYXJ0aWZhY3RzLCBpbmNsdWRpbmcgYSBXU0RMIGZpbGUgaWYgcmVxdWVzdGVkLiBJZiB5b3UNCi0gICAgICBzdGFydCB3aXRoIGEgV1NETCBmaWxlLCB1c2UgdGhlIHdzaW1wb3J0IGNvbW1hbmQtbGluZSB0b29sIHRvDQotICAgICAgZ2VuZXJhdGUgYWxsIHRoZSBXZWIgc2VydmljZXMgYXJ0aWZhY3RzIGZvciBlaXRoZXIgdGhlIHNlcnZlcg0KLSAgICAgIG9yIHRoZSBjbGllbnQuIFRoZSB3c2ltcG9ydCBjb21tYW5kIGxpbmUgdG9vbCBwcm9jZXNzZXMgdGhlDQotICAgICAgV1NETCBmaWxlIHdpdGggc2NoZW1hIGRlZmluaXRpb25zIHRvIGdlbmVyYXRlIHRoZSBwb3J0YWJsZQ0KLSAgICAgIGFydGlmYWN0cywgd2hpY2ggaW5jbHVkZSB0aGUgc2VydmljZSBjbGFzcywgdGhlIHNlcnZpY2UNCi0gICAgICBlbmRwb2ludCBpbnRlcmZhY2UgY2xhc3MsIGFuZCB0aGUgSkFYQiAyLjAgY2xhc3NlcyBmb3IgdGhlDQotICAgICAgY29ycmVzcG9uZGluZyBYTUwgc2NoZW1hLg0KLQ0KLSAgICAgIDxoMj48YSBuYW1lPSJKQVhCSW50cm8iIGlkPSJKQVhCSW50cm8iPkludHJvZHVjdGlvbiB0bw0KLSAgICAgIEpBWEI8L2E+PC9oMj5KYXZhIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcgKEpBWEIpIGlzIGENCi0gICAgICBKYXZhIHRlY2hub2xvZ3kgdGhhdCBwcm92aWRlcyBhbiBlYXN5IGFuZCBjb252ZW5pZW50IHdheSB0bw0KLSAgICAgIG1hcCBKYXZhIGNsYXNzZXMgYW5kIFhNTCBzY2hlbWEgZm9yIHNpbXBsaWZpZWQgZGV2ZWxvcG1lbnQgb2YNCi0gICAgICBXZWIgc2VydmljZXMuIEpBWEIgbGV2ZXJhZ2VzIHRoZSBmbGV4aWJpbGl0eSBvZg0KLSAgICAgIHBsYXRmb3JtLW5ldXRyYWwgWE1MIGRhdGEgaW4gSmF2YSBhcHBsaWNhdGlvbnMgdG8gYmluZCBYTUwNCi0gICAgICBzY2hlbWEgdG8gSmF2YSBhcHBsaWNhdGlvbnMgd2l0aG91dCByZXF1aXJpbmcgZXh0ZW5zaXZlDQotICAgICAga25vd2xlZGdlIG9mIFhNTCBwcm9ncmFtbWluZy48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBBeGlzMiBwcm92aWRlcyBKQVhCIDIuMCBzdGFuZGFyZHMuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgSkFYQiBpcyBhbiBYTUwgdG8gSmF2YSBiaW5kaW5nIHRlY2hub2xvZ3kgdGhhdCBzdXBwb3J0cw0KLSAgICAgIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gc2NoZW1hIGFuZCBKYXZhIG9iamVjdHMgYW5kIGJldHdlZW4NCi0gICAgICBYTUwgaW5zdGFuY2UgZG9jdW1lbnRzIGFuZCBKYXZhIG9iamVjdCBpbnN0YW5jZXMuIEpBWEINCi0gICAgICBjb25zaXN0cyBvZiBhIHJ1bnRpbWUgYXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIChBUEkpDQotICAgICAgYW5kIGFjY29tcGFueWluZyB0b29scyB0aGF0IHNpbXBsaWZ5IGFjY2VzcyB0byBYTUwgZG9jdW1lbnRzLg0KLSAgICAgIEpBWEIgYWxzbyBoZWxwcyB0byBidWlsZCBYTUwgZG9jdW1lbnRzIHRoYXQgYm90aCBjb25mb3JtIGFuZA0KLSAgICAgIHZhbGlkYXRlIHRvIHRoZSBYTUwgc2NoZW1hLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIEpBWEIgcHJvdmlkZXMgdGhlIDxiPnhqYzwvYj4gc2NoZW1hIGNvbXBpbGVyIHRvb2wsIHRoZQ0KLSAgICAgIDxiPnNjaGVtYWdlbjwvYj4gc2NoZW1hIGdlbmVyYXRvciB0b29sLCBhbmQgYSBydW50aW1lDQotICAgICAgZnJhbWV3b3JrLiBZb3UgY2FuIHVzZSB0aGUgPGI+eGpjPC9iPiBzY2hlbWEgY29tcGlsZXIgdG9vbCB0bw0KLSAgICAgIHN0YXJ0IHdpdGggYW4gWE1MIHNjaGVtYSBkZWZpbml0aW9uIChYU0QpIHRvIGNyZWF0ZSBhIHNldCBvZg0KLSAgICAgIEphdmFCZWFucyB0aGF0IG1hcCB0byB0aGUgZWxlbWVudHMgYW5kIHR5cGVzIGRlZmluZWQgaW4gdGhlDQotICAgICAgWFNEIHNjaGVtYS4gWW91IGNhbiBhbHNvIHN0YXJ0IHdpdGggYSBzZXQgb2YgSmF2YUJlYW5zIGFuZA0KLSAgICAgIHVzZSB0aGUgPGI+c2NoZW1hZ2VuPC9iPiBzY2hlbWEgZ2VuZXJhdG9yIHRvb2wgdG8gY3JlYXRlIHRoZQ0KLSAgICAgIFhNTCBzY2hlbWEuIE9uY2UgdGhlIG1hcHBpbmcgYmV0d2VlbiBYTUwgc2NoZW1hIGFuZCBKYXZhDQotICAgICAgY2xhc3NlcyBleGlzdHMsIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMgY2FuIGJlIGNvbnZlcnRlZCB0bw0KLSAgICAgIGFuZCBmcm9tIEphdmEgb2JqZWN0cyB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIEpBWEIgYmluZGluZw0KLSAgICAgIHJ1bnRpbWUgQVBJLiBEYXRhIHN0b3JlZCBpbiBYTUwgZG9jdW1lbnRzIGNhbiBiZSBhY2Nlc3NlZA0KLSAgICAgIHdpdGhvdXQgdGhlIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmUuIFlvdSBjYW4NCi0gICAgICB0aGVuIHVzZSB0aGUgcmVzdWx0aW5nIEphdmEgY2xhc3NlcyB0byBhc3NlbWJsZSBhIFdlYg0KLSAgICAgIHNlcnZpY2VzIGFwcGxpY2F0aW9uLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIEpBWEIgYW5ub3RhdGVkIGNsYXNzZXMgYW5kIGFydGlmYWN0cyBjb250YWluIGFsbCB0aGUNCi0gICAgICBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIEpBWEIgcnVudGltZSBBUEkgdG8gcHJvY2VzcyBYTUwNCi0gICAgICBpbnN0YW5jZSBkb2N1bWVudHMuIFRoZSBKQVhCIHJ1bnRpbWUgQVBJIHN1cHBvcnRzIG1hcnNoYWxpbmcNCi0gICAgICBvZiBKQVhCIG9iamVjdHMgdG8gWE1MIGFuZCB1bm1hcnNoYWxpbmcgdGhlIFhNTCBkb2N1bWVudCBiYWNrDQotICAgICAgdG8gSkFYQiBjbGFzcyBpbnN0YW5jZXMuIE9wdGlvbmFsbHksIHlvdSBjYW4gdXNlIEpBWEIgdG8NCi0gICAgICBwcm92aWRlIFhNTCB2YWxpZGF0aW9uIHRvIGVuZm9yY2UgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmcNCi0gICAgICBYTUwgZG9jdW1lbnRzIHRvIGNvbmZvcm0gdG8gdGhlIFhNTCBjb25zdHJhaW50cyBkZWZpbmVkDQotICAgICAgd2l0aGluIHRoZSBYTUwgc2NoZW1hLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIEpBWEIgaXMgdGhlIGRlZmF1bHQgZGF0YSBiaW5kaW5nIHRlY2hub2xvZ3kgdXNlZCBieSB0aGUgSmF2YQ0KLSAgICAgIEFQSSBmb3IgWE1MIFdlYiBTZXJ2aWNlcyAoSkFYLVdTKSAyLjAgdG9vbGluZyBhbmQNCi0gICAgICBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gdGhpcyBwcm9kdWN0LiBZb3UgY2FuIGRldmVsb3AgSkFYQg0KLSAgICAgIG9iamVjdHMgZm9yIHVzZSB3aXRoaW4gSkFYLVdTIGFwcGxpY2F0aW9ucy48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBZb3UgY2FuIGFsc28gdXNlIEpBWEIgaW5kZXBlbmRlbnRseSBvZiBKQVgtV1Mgd2hlbiB5b3Ugd2FudA0KLSAgICAgIHRvIGxldmVyYWdlIHRoZSBYTUwgZGF0YSBiaW5kaW5nIHRlY2hub2xvZ3kgdG8gbWFuaXB1bGF0ZSBYTUwNCi0gICAgICB3aXRoaW4geW91ciBKYXZhIGFwcGxpY2F0aW9ucy48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaWxsdXN0cmF0ZXMgdGhlIEpBWEINCi0gICAgICBhcmNoaXRlY3R1cmUuPGJyIC8+DQotICAgICAgPGltZyBzcmM9ImltYWdlcy9KQVhCX2FyY2hpdGVjdHVyZS5naWYiIHdpZHRoPSI2MDAiIGhlaWdodD0iMzAxIg0KLSAgICAgIGJvcmRlcj0iMCIgYWx0PSIiIC8+DQotDQotICAgICAgPGgyPjxhIG5hbWU9IkRldmVsb3BTZXJ2aWNlIiBpZD0iRGV2ZWxvcFNlcnZpY2UiPkRldmVsb3BpbmcNCi0gICAgICBKQVgtV1MgV2ViIHNlcnZpY2VzPC9hPjwvaDI+DQotDQotICAgICAgPGgzPjxhIG5hbWU9IkJvdHRvbVVwU2VydmljZSIgaWQ9IkJvdHRvbVVwU2VydmljZSI+RGV2ZWxvcGluZw0KLSAgICAgIGEgSkFYLVdTIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhQmVhbiAoYm90dG9tLXVwDQotICAgICAgZGV2ZWxvcG1lbnQpPC9hPjwvaDM+V2hlbiBkZXZlbG9waW5nIGEgSkFYLVdTIFdlYiBzZXJ2aWNlDQotICAgICAgc3RhcnRpbmcgZnJvbSBKYXZhQmVhbnMsIHlvdSBjYW4gdXNlIGEgYmVhbiB0aGF0IGFscmVhZHkNCi0gICAgICBleGlzdHMgYW5kIHRoZW4gZW5hYmxlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgSkFYLVdTIFdlYg0KLSAgICAgIHNlcnZpY2VzLiBUaGUgdXNlIG9mIGFubm90YXRpb25zIHNpbXBsaWZpZXMgdGhlIGVuYWJsaW5nIG9mIGENCi0gICAgICBiZWFuIGZvciBXZWIgc2VydmljZXMuIEFkZGluZyB0aGUgPGNvZGU+QFdlYlNlcnZpY2U8L2NvZGU+DQotICAgICAgYW5ub3RhdGlvbiB0byB0aGUgYmVhbiBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBhcyBhIFdlYg0KLSAgICAgIHNlcnZpY2UgYW5kIGhvdyBhIGNsaWVudCBjYW4gYWNjZXNzIHRoZSBXZWIgc2VydmljZS4NCi0gICAgICBKYXZhQmVhbnMgY2FuIGhhdmUgYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSwgYnV0IGl0IGlzDQotICAgICAgbm90IHJlcXVpcmVkLiBFbmFibGluZyBKYXZhQmVhbnMgZm9yIFdlYiBzZXJ2aWNlcyBpbmNsdWRlcw0KLSAgICAgIGFubm90YXRpbmcgdGhlIGJlYW4gYW5kIHRoZSBvcHRpb25hbCBzZXJ2aWNlIGVuZHBvaW50DQotICAgICAgaW50ZXJmYWNlLCBhc3NlbWJsaW5nIGFsbCBhcnRpZmFjdHMgcmVxdWlyZWQgZm9yIHRoZSBXZWINCi0gICAgICBzZXJ2aWNlLCBhbmQgZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbiBpbnRvIEF4aXMyLiBZb3UgYXJlDQotICAgICAgbm90IHJlcXVpcmVkIHRvIGRldmVsb3AgYSBXU0RMIGZpbGUgYmVjYXVzZSB0aGUgdXNlIG9mDQotICAgICAgYW5ub3RhdGlvbnMgY2FuIHByb3ZpZGUgYWxsIG9mIHRoZSBXU0RMIGluZm9ybWF0aW9uIG5lY2Vzc2FyeQ0KLSAgICAgIHRvIGNvbmZpZ3VyZSB0aGUgc2VydmljZSBlbmRwb2ludCBvciB0aGUgY2xpZW50LiBJdCBpcywNCi0gICAgICBob3dldmVyLCBhIGJlc3QgcHJhY3RpY2UgdG8gZGV2ZWxvcCBhIFdTREwgZmlsZS48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0NCi0gICAgICA8b2w+DQotICAgICAgICA8bGk+RGV2ZWxvcCBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLjwvbGk+DQotDQotICAgICAgICA8bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmUiPg0KLSAgICAgICAgICA8YnIgLz4NCi0gICAgICAgICAgSmF2YSBBUEkgZm9yIFhNTC1CYXNlZCBXZWIgU2VydmljZXMgKEpBWC1XUykgc3VwcG9ydHMgdHdvDQotICAgICAgICAgIGRpZmZlcmVudCBzZXJ2aWNlIGVuZHBvaW50IGltcGxlbWVudGF0aW9ucyB0eXBlcywgdGhlDQotICAgICAgICAgIHN0YW5kYXJkIEphdmFCZWFucyBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBhbmQgYSBuZXcNCi0gICAgICAgICAgPGNvZGU+UHJvdmlkZXI8L2NvZGU+IGludGVyZmFjZSB0byBlbmFibGUgc2VydmljZXMgdG8NCi0gICAgICAgICAgd29yayBhdCB0aGUgWE1MIG1lc3NhZ2UgbGV2ZWwuIEJ5IHVzaW5nIGFubm90YXRpb25zIG9uDQotICAgICAgICAgIHRoZSBzZXJ2aWNlIGVuZHBvaW50IG9yIGNsaWVudCwgeW91IGNhbiBkZWZpbmUgdGhlDQotICAgICAgICAgIHNlcnZpY2UgZW5kcG9pbnQgYXMgYSBXZWIgc2VydmljZS48YnIgLz4NCi0gICAgICAgICAgPGJyIC8+DQotICAgICAgICAgIEphdmFCZWFucyBlbmRwb2ludHMgaW4gSkFYLVdTIGFyZSBzaW1pbGFyIHRvIHRoZSBlbmRwb2ludA0KLSAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIEphdmEgQVBJIGZvciBYTUwtYmFzZWQgUlBDDQotICAgICAgICAgIChKQVgtUlBDKSBzcGVjaWZpY2F0aW9uLiBVbmxpa2UgSkFYLVJQQywgdGhlIHJlcXVpcmVtZW50DQotICAgICAgICAgIGZvciBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIChTRUkpIGlzIG9wdGlvbmFsIGZvcg0KLSAgICAgICAgICBKYXZhQmVhbnMtYmFzZWQgc2VydmljZXMuIEpBWC1XUyBzZXJ2aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBoYXZlIGFuIGFzc29jaWF0ZWQgU0VJIGFyZSByZWdhcmRlZCBhcyBoYXZpbmcgYW4gaW1wbGljaXQNCi0gICAgICAgICAgU0VJLCB3aGVyZWFzIHNlcnZpY2VzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIFNFSSBhcmUNCi0gICAgICAgICAgcmVnYXJkZWQgYXMgaGF2aW5nIGFuIGV4cGxpY2l0IFNFSS4gVGhlIHNlcnZpY2UgZW5kcG9pbnQNCi0gICAgICAgICAgaW50ZXJmYWNlcyByZXF1aXJlZCBieSBKQVgtV1MgYXJlIGFsc28gbW9yZSBnZW5lcmljIHRoYW4NCi0gICAgICAgICAgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcyByZXF1aXJlZCBieSBKQVgtUlBDLiBXaXRoDQotICAgICAgICAgIEpBWC1XUywgdGhlIFNFSSBpcyBub3QgcmVxdWlyZWQgdG8gZXh0ZW5kIHRoZQ0KLSAgICAgICAgICBqYXZhLnJtaS5SZW1vdGUgaW50ZXJmYWNlIGFzIHJlcXVpcmVkIGJ5IHRoZSBKQVgtUlBDDQotICAgICAgICAgIHNwZWNpZmljYXRpb24uPGJyIC8+DQotICAgICAgICAgIDxiciAvPg0KLSAgICAgICAgICBUaGUgSkFYLVdTIHByb2dyYW1taW5nIG1vZGVsIGFsc28gbGV2ZXJhZ2VzIHN1cHBvcnQgZm9yDQotICAgICAgICAgIGFubm90YXRpbmcgSmF2YSBjbGFzc2VzIHdpdGggbWV0YWRhdGEgdG8gZGVmaW5lIGEgc2VydmljZQ0KLSAgICAgICAgICBlbmRwb2ludCBhcHBsaWNhdGlvbiBhcyBhIFdlYiBzZXJ2aWNlIGFuZCBkZWZpbmUgaG93IGENCi0gICAgICAgICAgY2xpZW50IGNhbiBhY2Nlc3MgdGhlIFdlYiBzZXJ2aWNlLiBKQVgtV1Mgc3VwcG9ydHMNCi0gICAgICAgICAgYW5ub3RhdGlvbnMgYmFzZWQgb24gdGhlIE1ldGFkYXRhIEZhY2lsaXR5IGZvciB0aGUgSmF2YQ0KLSAgICAgICAgICBQcm9ncmFtbWluZyBMYW5ndWFnZSAoSlNSIDE3NSkgc3BlY2lmaWNhdGlvbiwgdGhlIFdlYg0KLSAgICAgICAgICBTZXJ2aWNlcyBNZXRhZGF0YSBmb3IgdGhlIEphdmEgUGxhdGZvcm0gKEpTUiAxODEpDQotICAgICAgICAgIHNwZWNpZmljYXRpb24gYW5kIGFubm90YXRpb25zIGRlZmluZWQgYnkgdGhlIEpBWC1XUyAyLjANCi0gICAgICAgICAgKEpTUiAyMjQpIHNwZWNpZmljYXRpb24sIHdoaWNoIGluY2x1ZGVzIEphdmEgQXJjaGl0ZWN0dXJlDQotICAgICAgICAgIGZvciBYTUwgQmluZGluZyAoSkFYQikgYW5ub3RhdGlvbnMuIFVzaW5nIGFubm90YXRpb25zLA0KLSAgICAgICAgICB0aGUgc2VydmljZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBjYW4gaW5kZXBlbmRlbnRseQ0KLSAgICAgICAgICBkZXNjcmliZSB0aGUgV2ViIHNlcnZpY2Ugd2l0aG91dCByZXF1aXJpbmcgYSBXU0RMIGZpbGUuDQotICAgICAgICAgIEFubm90YXRpb25zIGNhbiBwcm92aWRlIGFsbCBvZiB0aGUgV1NETCBpbmZvcm1hdGlvbg0KLSAgICAgICAgICBuZWNlc3NhcnkgdG8gY29uZmlndXJlIHlvdXIgc2VydmljZSBlbmRwb2ludA0KLSAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvciBXZWIgc2VydmljZXMgY2xpZW50LiBZb3UgY2FuIHNwZWNpZnkNCi0gICAgICAgICAgYW5ub3RhdGlvbnMgb24gdGhlIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIHVzZWQgYnkgdGhlDQotICAgICAgICAgIGNsaWVudCBhbmQgdGhlIHNlcnZlciwgb3Igb24gdGhlIHNlcnZlci1zaWRlIHNlcnZpY2UNCi0gICAgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3MuPGJyIC8+DQotICAgICAgICAgIDxiciAvPg0KLSAgICAgICAgICBUbyBkZXZlbG9wIGEgSkFYLVdTIFdlYiBzZXJ2aWNlLCB5b3UgbXVzdCBhbm5vdGF0ZSB5b3VyDQotICAgICAgICAgIEphdmEgY2xhc3Mgd2l0aCB0aGUgPGNvZGU+amF2YXguandzLldlYlNlcnZpY2U8L2NvZGU+DQotICAgICAgICAgIGFubm90YXRpb24gZm9yIEphdmFCZWFucyBlbmRwb2ludHMgb3IgdGhlDQotICAgICAgICAgIDxjb2RlPmphdmF4Lmp3cy5XZWJTZXJ2aWNlUHJvdmlkZXI8L2NvZGU+IGFubm90YXRpb24gZm9yDQotICAgICAgICAgIGEgUHJvdmlkZXIgZW5kcG9pbnQuIFRoZXNlIGFubm90YXRpb25zIGRlZmluZSB0aGUgSmF2YQ0KLSAgICAgICAgICBjbGFzcyBhcyBhIFdlYiBzZXJ2aWNlIGVuZHBvaW50LiBGb3IgYSBKYXZhQmVhbnMNCi0gICAgICAgICAgZW5kcG9pbnQsIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBvciBzZXJ2aWNlDQotICAgICAgICAgIGVuZHBvaW50IGltcGxlbWVudGF0aW9uIGlzIGEgSmF2YSBpbnRlcmZhY2Ugb3IgY2xhc3MsDQotICAgICAgICAgIHJlc3BlY3RpdmVseSwgdGhhdCBkZWNsYXJlcyB0aGUgYnVzaW5lc3MgbWV0aG9kcyBwcm92aWRlZA0KLSAgICAgICAgICBieSBhIHBhcnRpY3VsYXIgV2ViIHNlcnZpY2UuIFRoZSBvbmx5IG1ldGhvZHMgb24gYQ0KLSAgICAgICAgICBKYXZhQmVhbnMgZW5kcG9pbnQgdGhhdCBjYW4gYmUgaW52b2tlZCBieSBhIFdlYiBzZXJ2aWNlcw0KLSAgICAgICAgICBjbGllbnQgYXJlIHRoZSBidXNpbmVzcyBtZXRob2RzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlDQotICAgICAgICAgIGV4cGxpY2l0IG9yIGltcGxpY2l0IHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLjxiciAvPg0KLSAgICAgICAgICA8YnIgLz4NCi0gICAgICAgICAgQWxsIEphdmFCZWFucyBlbmRwb2ludHMgYXJlIHJlcXVpcmVkIHRvIGhhdmUgdGhlDQotICAgICAgICAgIDxjb2RlPkBXZWJTZXJ2aWNlIChqYXZheC5qd3MuV2ViU2VydmljZSk8L2NvZGU+DQotICAgICAgICAgIGFubm90YXRpb24gaW5jbHVkZWQgb24gdGhlIGJlYW4gY2xhc3MuIElmIHRoZSBzZXJ2aWNlDQotICAgICAgICAgIGltcGxlbWVudGF0aW9uIGJlYW4gYWxzbyB1c2VzIGFuIFNFSSwgdGhlbiB0aGF0IGVuZHBvaW50DQotICAgICAgICAgIGludGVyZmFjZSBtdXN0IGJlIHJlZmVyZW5jZWQgYnkgdGhlIGVuZHBvaW50SW50ZXJmYWNlDQotICAgICAgICAgIGF0dHJpYnV0ZSBvbiB0aGF0IGFubm90YXRpb24uIElmIHRoZSBzZXJ2aWNlDQotICAgICAgICAgIGltcGxlbWVudGF0aW9uIGJlYW4gZG9lcyBub3QgdXNlIGFuIFNFSSwgdGhlbiB0aGUgc2VydmljZQ0KLSAgICAgICAgICBpcyBkZXNjcmliZWQgYnkgdGhlIGltcGxpY2l0IFNFSSBkZWZpbmVkIGluIHRoZQ0KLSAgICAgICAgICBiZWFuLjxiciAvPg0KLSAgICAgICAgICA8YnIgLz4NCi0gICAgICAgICAgVGhlIEpBWC1XUyBwcm9ncmFtbWluZyBtb2RlbCBpbnRyb2R1Y2VzIHRoZSBuZXcgUHJvdmlkZXINCi0gICAgICAgICAgQVBJLCA8Y29kZT5qYXZheC54bWwud3MuUHJvdmlkZXI8L2NvZGU+LCBhcyBhbg0KLSAgICAgICAgICBhbHRlcm5hdGl2ZSB0byBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMuIFRoZQ0KLSAgICAgICAgICA8Y29kZT5Qcm92aWRlcjwvY29kZT4gaW50ZXJmYWNlIHN1cHBvcnRzIGEgbW9yZSBtZXNzYWdpbmcNCi0gICAgICAgICAgb3JpZW50ZWQgYXBwcm9hY2ggdG8gV2ViIHNlcnZpY2VzLiBXaXRoIHRoZQ0KLSAgICAgICAgICA8Y29kZT5Qcm92aWRlcjwvY29kZT4gaW50ZXJmYWNlLCB5b3UgY2FuIGNyZWF0ZSBhIEphdmENCi0gICAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc2ltcGxlIGludGVyZmFjZSB0byBwcm9kdWNlIGENCi0gICAgICAgICAgZ2VuZXJpYyBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLiBUaGUNCi0gICAgICAgICAgPGNvZGU+UHJvdmlkZXI8L2NvZGU+IGludGVyZmFjZSBoYXMgb25lIG1ldGhvZCwgdGhlDQotICAgICAgICAgIGludm9rZSBtZXRob2QsIHdoaWNoIHVzZXMgZ2VuZXJpY3MgdG8gY29udHJvbCBib3RoIHRoZQ0KLSAgICAgICAgICBpbnB1dCBhbmQgb3V0cHV0IHR5cGVzIHdoZW4gd29ya2luZyB3aXRoIHZhcmlvdXMgbWVzc2FnZXMNCi0gICAgICAgICAgb3IgbWVzc2FnZSBwYXlsb2Fkcy4gQWxsIFByb3ZpZGVyIGVuZHBvaW50cyBtdXN0IGJlDQotICAgICAgICAgIGFubm90YXRlZCB3aXRoIHRoZSA8Y29kZT5AV2ViU2VydmljZVByb3ZpZGVyDQotICAgICAgICAgIChqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyKTwvY29kZT4gYW5ub3RhdGlvbi4gQQ0KLSAgICAgICAgICBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNhbm5vdCBzcGVjaWZ5IHRoZQ0KLSAgICAgICAgICA8Y29kZT5AV2ViU2VydmljZTwvY29kZT4gYW5ub3RhdGlvbiBpZiBpdCBpbXBsZW1lbnRzIHRoZQ0KLSAgICAgICAgICA8Y29kZT5qYXZheC54bWwud3MuUHJvdmlkZXI8L2NvZGU+IGludGVyZmFjZS48YnIgLz4NCi0gICAgICAgICAgPGJyIC8+DQotICAgICAgICAgIFNvIHRoZSBzdGVwcyBpbnZvbHZlZCBhcmU6DQotDQotICAgICAgICAgIDxvbD4NCi0gICAgICAgICAgICA8bGk+SWRlbnRpZnkgeW91ciBzZXJ2aWNlIGVuZHBvaW50IHJlcXVpcmVtZW50cyBmb3INCi0gICAgICAgICAgICB5b3VyIFdlYiBzZXJ2aWNlcyBhcHBsaWNhdGlvbi48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaSBzdHlsZT0ibGlzdC1zdHlsZTogbm9uZSI+DQotICAgICAgICAgICAgICA8YnIgLz4NCi0gICAgICAgICAgICAgIEZpcnN0IGRldGVybWluZSBpZiB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpcyBhDQotICAgICAgICAgICAgICBKYXZhQmVhbnMgZW5kcG9pbnQgb3IgYSBQcm92aWRlciBlbmRwb2ludC4gSWYgeW91DQotICAgICAgICAgICAgICBjaG9vc2UgdG8gdXNlIGEgSmF2YUJlYW5zIGVuZHBvaW50LCB0aGVuIGRldGVybWluZSBpZg0KLSAgICAgICAgICAgICAgeW91IHdhbnQgdG8gdXNlIGFuIGV4cGxpY2l0IFNFSSBvciBpZiB0aGUgYmVhbiBpdHNlbGYNCi0gICAgICAgICAgICAgIHdpbGwgaGF2ZSBhbiBpbXBsaWNpdCBTRUkuPGJyIC8+DQotICAgICAgICAgICAgICBBIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgV2ViIHNlcnZpY2UgbXVzdA0KLSAgICAgICAgICAgICAgc3BlY2lmeSBlaXRoZXIgdGhlIDxjb2RlPmphdmF4Lmp3cy5XZWJTZXJ2aWNlPC9jb2RlPg0KLSAgICAgICAgICAgICAgb3IgPGNvZGU+amF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjwvY29kZT4NCi0gICAgICAgICAgICAgIGFubm90YXRpb24uIEJvdGggYW5ub3RhdGlvbnMgbXVzdCBub3QgYmUgcHJlc2VudCBvbiBhDQotICAgICAgICAgICAgICBKYXZhIGNsYXNzLiBUaGUNCi0gICAgICAgICAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI8L2NvZGU+DQotICAgICAgICAgICAgICBhbm5vdGF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIG9uIGNsYXNzZXMgdGhhdA0KLSAgICAgICAgICAgICAgaW1wbGVtZW50IHRoZSA8Y29kZT5qYXZheC54bWwud3MuUHJvdmlkZXI8L2NvZGU+DQotICAgICAgICAgICAgICBpbnRlcmZhY2UuDQotDQotICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgIDxsaT5JZiB5b3UgaGF2ZSBhbiBleHBsaWNpdCBzZXJ2aWNlIGVuZHBvaW50DQotICAgICAgICAgICAgICAgIGludGVyZmFjZSB3aXRoIHRoZSBKYXZhIGNsYXNzLCB0aGVuIHVzZSB0aGUNCi0gICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2UgcGFyYW1ldGVyIHRvIHNwZWNpZnkgdGhlIHNlcnZpY2UNCi0gICAgICAgICAgICAgICAgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzIG5hbWUgdG8gdGhlDQotICAgICAgICAgICAgICAgIDxjb2RlPmphdmF4Lmp3cy5XZWJTZXJ2aWNlPC9jb2RlPiBhbm5vdGF0aW9uLiBZb3UNCi0gICAgICAgICAgICAgICAgY2FuIGFkZCB0aGUgPGNvZGU+QFdlYk1ldGhvZDwvY29kZT4gYW5ub3RhdGlvbiB0bw0KLSAgICAgICAgICAgICAgICBtZXRob2RzIG9mIGEgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdG8NCi0gICAgICAgICAgICAgICAgY3VzdG9taXplIHRoZSBKYXZhLXRvLVdTREwgbWFwcGluZ3MuIEFsbCBwdWJsaWMNCi0gICAgICAgICAgICAgICAgbWV0aG9kcyBhcmUgY29uc2lkZXJlZCBhcyBleHBvc2VkIG1ldGhvZHMNCi0gICAgICAgICAgICAgICAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSA8Y29kZT5AV2ViTWV0aG9kPC9jb2RlPg0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uIGlzIHNwZWNpZmllZCBvciBub3QuIEl0IGlzIGluY29ycmVjdCB0bw0KLSAgICAgICAgICAgICAgICBoYXZlIGFuIDxjb2RlPkBXZWJNZXRob2Q8L2NvZGU+IGFubm90YXRpb24gb24gYW4NCi0gICAgICAgICAgICAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgdGhhdCBjb250YWlucyB0aGUNCi0gICAgICAgICAgICAgICAgPGNvZGU+ZXhjbHVkZTwvY29kZT4gYXR0cmlidXRlLjwvbGk+DQotDQotICAgICAgICAgICAgICAgIDxsaT5JZiB5b3UgaGF2ZSBhbiBpbXBsaWNpdCBzZXJ2aWNlIGVuZHBvaW50DQotICAgICAgICAgICAgICAgIGludGVyZmFjZSB3aXRoIHRoZSBKYXZhIGNsYXNzLCB0aGVuIHRoZQ0KLSAgICAgICAgICAgICAgICA8Y29kZT5qYXZheC5qd3MuV2ViU2VydmljZTwvY29kZT4gYW5ub3RhdGlvbiB3aWxsDQotICAgICAgICAgICAgICAgIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZQ0KLSAgICAgICAgICAgICAgICA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4sIDxjb2RlPnBvcnROYW1lPC9jb2RlPiwNCi0gICAgICAgICAgICAgICAgYW5kIDxjb2RlPnRhcmdldE5hbWVzcGFjZTwvY29kZT4gcGFyYW1ldGVycy4gVG8NCi0gICAgICAgICAgICAgICAgb3ZlcnJpZGUgdGhlc2UgZGVmYXVsdCB2YWx1ZXMsIHNwZWNpZnkgdmFsdWVzIGZvcg0KLSAgICAgICAgICAgICAgICB0aGVzZSBwYXJhbWV0ZXJzIGluIHRoZSA8Y29kZT5AV2ViU2VydmljZTwvY29kZT4NCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbi4gSWYgdGhlIDxjb2RlPkBXZWJNZXRob2Q8L2NvZGU+DQotICAgICAgICAgICAgICAgIGFubm90YXRpb24gaXMgbm90IHNwZWNpZmllZCwgYWxsIHB1YmxpYyBtZXRob2RzIGFyZQ0KLSAgICAgICAgICAgICAgICBleHBvc2VkIGluY2x1ZGluZyB0aGUgaW5oZXJpdGVkIG1ldGhvZHMgd2l0aCB0aGUNCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9uIG9mIG1ldGhvZHMgaW5oZXJpdGVkIGZyb20NCi0gICAgICAgICAgICAgICAgPGNvZGU+amF2YS5sYW5nLk9iamVjdDwvY29kZT4uIFRoZQ0KLSAgICAgICAgICAgICAgICA8Y29kZT5leGNsdWRlPC9jb2RlPiBwYXJhbWV0ZXIgb2YgdGhlDQotICAgICAgICAgICAgICAgIDxjb2RlPkBXZWJNZXRob2Q8L2NvZGU+IGFubm90YXRpb24gY2FuIGJlIHVzZWQgdG8NCi0gICAgICAgICAgICAgICAgY29udHJvbCB3aGljaCBtZXRob2RzIGFyZSBleHBvc2VkLjwvbGk+DQotDQotICAgICAgICAgICAgICAgIDxsaT5JZiB5b3UgYXJlIHVzaW5nIHRoZSA8Y29kZT5Qcm92aWRlcjwvY29kZT4NCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlLCB1c2UgdGhlDQotICAgICAgICAgICAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI8L2NvZGU+DQotICAgICAgICAgICAgICAgIGFubm90YXRpb24gb24gdGhlIFByb3ZpZGVyIGVuZHBvaW50LjwvbGk+DQotICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgIDwvbGk+DQotDQotICAgICAgICAgICAgPGxpPkFubm90YXRlIHRoZSBzZXJ2aWNlIGVuZHBvaW50cy48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaT5JbXBsZW1lbnQgeW91ciBzZXJ2aWNlLjwvbGk+DQotICAgICAgICAgIDwvb2w+PGJyIC8+DQotICAgICAgICAgIDxiciAvPg0KLSAgICAgICAgICBXaGVuIHVzaW5nIGEgYm90dG9tLXVwIGFwcHJvYWNoIHRvIGRldmVsb3AgSkFYLVdTIFdlYg0KLSAgICAgICAgICBzZXJ2aWNlcywgdXNlIHRoZSB3c2dlbiBjb21tYW5kLWxpbmUgdG9vbCB3aGVuIHN0YXJ0aW5nDQotICAgICAgICAgIGZyb20gYSBzZXJ2aWNlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uLiBUaGUgd3NnZW4gdG9vbA0KLSAgICAgICAgICBwcm9jZXNzZXMgYSBjb21waWxlZCBzZXJ2aWNlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uDQotICAgICAgICAgIGNsYXNzIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBwb3J0YWJsZQ0KLSAgICAgICAgICBhcnRpZmFjdHM6DQotDQotICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICA8bGk+YW55IGFkZGl0aW9uYWwgSmF2YSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nDQotICAgICAgICAgICAgKEpBWEIpIGNsYXNzZXMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gbWFyc2hhbCBhbmQNCi0gICAgICAgICAgICB1bm1hcnNoYWwgdGhlIG1lc3NhZ2UgY29udGVudHMuIFRoZSBhZGRpdGlvbmFsIGNsYXNzZXMNCi0gICAgICAgICAgICBpbmNsdWRlIGNsYXNzZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlDQotICAgICAgICAgICAgQFJlcXVlc3RXcmFwcGVyIGFubm90YXRpb24gYW5kIHRoZQ0KLSAgICAgICAgICAgIDxjb2RlPkBSZXNwb25zZVdyYXBwZXI8L2NvZGU+IGFubm90YXRpb24gZm9yIGEgd3JhcHBlZA0KLSAgICAgICAgICAgIG1ldGhvZC48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaT5hIFdTREwgZmlsZSBpZiB0aGUgb3B0aW9uYWwgPGNvZGU+LXdzZGw8L2NvZGU+DQotICAgICAgICAgICAgYXJndW1lbnQgaXMgc3BlY2lmaWVkLiBUaGUgd3NnZW4gY29tbWFuZCBkb2VzIG5vdA0KLSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIFdTREwgZmlsZS4gVGhlIFdTREwgZmlsZSBpcw0KLSAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHdoZW4geW91IGRlcGxveSB0aGUgc2VydmljZQ0KLSAgICAgICAgICAgIGVuZHBvaW50LjwvbGk+DQotICAgICAgICAgIDwvdWw+PGJyIC8+DQotICAgICAgICAgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGRldmVsb3AgYSBXU0RMIGZpbGUgd2hlbg0KLSAgICAgICAgICBkZXZlbG9waW5nIEpBWC1XUyBXZWIgc2VydmljZXMgdXNpbmcgdGhlIGJvdHRvbS11cA0KLSAgICAgICAgICBhcHByb2FjaCBvZiBzdGFydGluZyB3aXRoIEphdmFCZWFucy4gVGhlIHVzZSBvZg0KLSAgICAgICAgICBhbm5vdGF0aW9ucyBwcm92aWRlcyBhbGwgb2YgdGhlIFdTREwgaW5mb3JtYXRpb24NCi0gICAgICAgICAgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSB0aGUgc2VydmljZSBlbmRwb2ludCBvciB0aGUNCi0gICAgICAgICAgY2xpZW50LiBBeGlzMiBzdXBwb3J0cyBXU0RMIDEuMSBkb2N1bWVudHMgdGhhdCBjb21wbHkNCi0gICAgICAgICAgd2l0aCBXZWIgU2VydmljZXMtSW50ZXJvcGVyYWJpbGl0eSAoV1MtSSkgQmFzaWMgUHJvZmlsZQ0KLSAgICAgICAgICAxLjEgc3BlY2lmaWNhdGlvbnMgYW5kIGFyZSBlaXRoZXIgRG9jdW1lbnQvTGl0ZXJhbCBzdHlsZQ0KLSAgICAgICAgICBkb2N1bWVudHMgb3IgUlBDL0xpdGVyYWwgc3R5bGUgZG9jdW1lbnRzLiBBZGRpdGlvbmFsbHksDQotICAgICAgICAgIFdTREwgZG9jdW1lbnRzIHdpdGggYmluZGluZ3MgdGhhdCBkZWNsYXJlIGEgVVNFIGF0dHJpYnV0ZQ0KLSAgICAgICAgICBvZiB2YWx1ZSA8Y29kZT5MSVRFUkFMPC9jb2RlPiBhcmUgc3VwcG9ydGVkIHdoaWxlIHRoZQ0KLSAgICAgICAgICB2YWx1ZSwgPGNvZGU+RU5DT0RFRDwvY29kZT4sIGlzIG5vdCBzdXBwb3J0ZWQuIEZvciBXU0RMDQotICAgICAgICAgIGRvY3VtZW50cyB0aGF0IGltcGxlbWVudCBhIERvY3VtZW50L0xpdGVyYWwgd3JhcHBlZA0KLSAgICAgICAgICBwYXR0ZXJuLCBhIHJvb3QgZWxlbWVudCBpcyBkZWNsYXJlZCBpbiB0aGUgWE1MIHNjaGVtYSBhbmQNCi0gICAgICAgICAgaXMgdXNlZCBhcyBhbiBvcGVyYXRpb24gd3JhcHBlciBmb3IgYSBtZXNzYWdlIGZsb3cuDQotICAgICAgICAgIFNlcGFyYXRlIHdyYXBwZXIgZWxlbWVudCBkZWZpbml0aW9ucyBleGlzdCBmb3IgYm90aCB0aGUNCi0gICAgICAgICAgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlLjxiciAvPg0KLSAgICAgICAgICA8YnIgLz4NCi0gICAgICAgICAgVG8gZW5zdXJlIHRoZSB3c2dlbiBjb21tYW5kIGRvZXMgbm90IG1pc3MgaW5oZXJpdGVkDQotICAgICAgICAgIG1ldGhvZHMgb24gYSBzZXJ2aWNlIGVuZHBvaW50IGltcGxlbWVudGF0aW9uIGJlYW4sIHlvdQ0KLSAgICAgICAgICBtdXN0IGVpdGhlciBhZGQgdGhlIDxjb2RlPkBXZWJTZXJ2aWNlPC9jb2RlPiBhbm5vdGF0aW9uDQotICAgICAgICAgIHRvIHRoZSBkZXNpcmVkIHN1cGVyY2xhc3Mgb3IgeW91IGNhbiBvdmVycmlkZSB0aGUNCi0gICAgICAgICAgaW5oZXJpdGVkIG1ldGhvZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3Mgd2l0aCBhIGNhbGwNCi0gICAgICAgICAgdG8gdGhlIHN1cGVyY2xhc3MgbWV0aG9kLiBJbXBsZW1lbnRhdGlvbiBjbGFzc2VzIG9ubHkNCi0gICAgICAgICAgZXhwb3NlIG1ldGhvZHMgZnJvbSBzdXBlcmNsYXNzZXMgdGhhdCBhcmUgYW5ub3RhdGVkIHdpdGgNCi0gICAgICAgICAgdGhlIDxjb2RlPkBXZWJTZXJ2aWNlPC9jb2RlPiBhbm5vdGF0aW9uLjxiciAvPg0KLSAgICAgICAgICA8YnIgLz4NCi0gICAgICAgICAgTm90ZTogVGhlIDxiPndzZ2VuPC9iPiBjb21tYW5kIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgdGhlDQotICAgICAgICAgIFhNTCBuYW1lc3BhY2UgYmV0d2VlbiBtdWx0aXBsZSA8Y29kZT5YTUxUeXBlPC9jb2RlPg0KLSAgICAgICAgICBhbm5vdGF0aW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgPGNvZGU+QFhNTFR5cGU8L2NvZGU+IG5hbWUNCi0gICAgICAgICAgZGVmaW5lZCB3aXRoaW4gZGlmZmVyZW50IEphdmEgcGFja2FnZXMuIFdoZW4gdGhpcw0KLSAgICAgICAgICBzY2VuYXJpbyBvY2N1cnMsIHRoZSBmb2xsb3dpbmcgZXJyb3IgaXMgcHJvZHVjZWQ6DQotICAgICAgICAgIDxwcmU+DQotICAgRXJyb3I6IFR3byBjbGFzc2VzIGhhdmUgdGhlIHNhbWUgWE1MIHR5cGUgbmFtZSAuLi4uDQotICAgVXNlIEBYbWxUeXBlLm5hbWUgYW5kIEBYbWxUeXBlLm5hbWVzcGFjZSB0byBhc3NpZ24gZGlmZmVyZW50IG5hbWVzIHRvIHRoZW0uLi4NCi08L3ByZT5UaGlzIGVycm9yIGluZGljYXRlcyB5b3UgaGF2ZSBjbGFzcyBuYW1lcyBvcg0KLTxjb2RlPkBYTUxUeXBlLm5hbWU8L2NvZGU+IHZhbHVlcyB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSwgYnV0DQotZXhpc3Qgd2l0aGluIGRpZmZlcmVudCBKYXZhIHBhY2thZ2VzLiBUbyBwcmV2ZW50IHRoaXMgZXJyb3IsIGFkZA0KLXRoZSA8Y29kZT5AWE1MLlR5cGUubmFtZXNwYWNlPC9jb2RlPiBjbGFzcyB0byB0aGUgZXhpc3RpbmcgPGNvZGU+DQotICAgICAgICAgIEBYTUxUeXBlPC9jb2RlPiBhbm5vdGF0aW9uIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUNCi0gICAgICAgICAgWE1MIHR5cGVzLg0KLSAgICAgICAgPC9saT4NCi0NCi0gICAgICAgIDxsaT5EZXZlbG9wIHRoZSBKYXZhIGFydGlmYWN0cy48L2xpPg0KLQ0KLSAgICAgICAgPGxpPlBhY2thZ2UgYW5kIGRlcGxveSB5b3VyIHNlcnZpY2UuPC9saT4NCi0gICAgICA8L29sPg0KLQ0KLSAgICAgIDxoMz48YSBuYW1lPSJUb3BEb3duU2VydmljZSIgaWQ9IlRvcERvd25TZXJ2aWNlIj5EZXZlbG9waW5nIGENCi0gICAgICBKQVgtV1MgV2ViIHNlcnZpY2UgZnJvbSBhIFdTREwgZG9jdW1lbnQgKHRvcC1kb3duDQotICAgICAgZGV2ZWxvcG1lbnQpPC9hPjwvaDM+WW91IGNhbiB1c2UgYSB0b3AtZG93biBkZXZlbG9wbWVudA0KLSAgICAgIGFwcHJvYWNoIHRvIGNyZWF0ZSBhIEpBWC1XUyBXZWIgc2VydmljZSB3aXRoIGFuIGV4aXN0aW5nIFdTREwNCi0gICAgICBmaWxlIHVzaW5nIEphdmFCZWFucy48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBZb3UgY2FuIHVzZSB0aGUgSkFYLVdTIHRvb2wsIDxiPndzaW1wb3J0PC9iPiwgdG8gcHJvY2VzcyBhDQotICAgICAgV1NETCBmaWxlIGFuZCBnZW5lcmF0ZSBwb3J0YWJsZSBKYXZhIGFydGlmYWN0cyB0aGF0IGFyZSB1c2VkDQotICAgICAgdG8gY3JlYXRlIGEgV2ViIHNlcnZpY2UuIFRoZSBwb3J0YWJsZSBKYXZhIGFydGlmYWN0cyBjcmVhdGVkDQotICAgICAgdXNpbmcgdGhlIDxiPndzaW1wb3J0PC9iPiB0b29sIGFyZToNCi0NCi0gICAgICA8dWw+DQotICAgICAgICA8bGk+U2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgKFNFSSk8L2xpPg0KLQ0KLSAgICAgICAgPGxpPlNlcnZpY2UgY2xhc3M8L2xpPg0KLQ0KLSAgICAgICAgPGxpPkV4Y2VwdGlvbiBjbGFzcyB0aGF0IGlzIG1hcHBlZCBmcm9tIHRoZQ0KLSAgICAgICAgPGNvZGU+d3NkbDpmYXVsdDwvY29kZT4gY2xhc3MgKGlmIGFueSk8L2xpPg0KLQ0KLSAgICAgICAgPGxpPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQikgZ2VuZXJhdGVkIHR5cGUNCi0gICAgICAgIHZhbHVlcyB3aGljaCBhcmUgSmF2YSBjbGFzc2VzIG1hcHBlZCBmcm9tIFhNTCBzY2hlbWENCi0gICAgICAgIHR5cGVzPC9saT4NCi0gICAgICA8L3VsPjxiciAvPg0KLSAgICAgIFJ1biB0aGUNCi0gICAgICA8cHJlPg0KLXdzaW1wb3J0IC1rZWVwIC12ZXJib3NlIDxpPndzZGxfVVJMPC9pPg0KLTwvcHJlPmNvbW1hbmQgdG8gZ2VuZXJhdGUgdGhlIHBvcnRhYmxlIGFydGlmYWN0cy4gVGhlDQotPGNvZGU+LWtlZXA8L2NvZGU+IG9wdGlvbiB0ZWxscyB0aGUgdG9vbCBub3QgdG8gZGVsZXRlIHRoZQ0KLWdlbmVyYXRlZCBmaWxlcywgYW5kIHRoZSA8Y29kZT4tdmVyYm9zZTwvY29kZT4gb3B0aW9uIHRlbGxzIGl0IHRvDQotbGlzdCB0aGUgZmlsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQuIFRoZSBPYmplY3RGYWN0b3J5LmphdmEgZmlsZSB0aGF0DQotaXMgY3JlYXRlZCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggSmF2YSBjb250ZW50IGludGVyZmFjZQ0KLWFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlIGdlbmVyYXRlZCBpbiB0aGUgYXNzb2NpYXRlZCBwYWNrYWdlLiBUaGUNCi1wYWNrYWdlLWluZm8uamF2YSBmaWxlIHRha2VzIHRoZSA8Y29kZT50YXJnZXROYW1lc3BhY2U8L2NvZGU+IHZhbHVlDQotYW5kIGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgWW91IG11c3Qgbm93IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBTRUkgY3JlYXRlZCBieQ0KLSAgICAgIHRoZSB0b29sLg0KLQ0KLSAgICAgIDxoMj48YSBuYW1lPSJEZXBsb3lTZXJ2aWNlIiBpZD0iRGVwbG95U2VydmljZSI+UGFja2FnaW5nIGFuZA0KLSAgICAgIGRlcGxveWluZyBhIEpBWC1XUyBzZXJ2aWNlPC9hPjwvaDI+QXhpczIgcHJvdmlkZXMgdHdvDQotICAgICAgbWVjaGFuaXNtcyBmb3IgZGVwbG95aW5nIEpBWC1XUyBzZXJ2aWNlczoNCi0NCi0gICAgICA8b2w+DQotICAgICAgICA8bGk+VGhlIHNlcnZpY2UgbWF5IGJlIHBhY2thZ2VkIGFuZCBkZXBsb3llZCBhcyBhbiBBQVIsDQotICAgICAgICBqdXN0IGxpa2UgYW55IG90aGVyIHNlcnZpY2Ugd2l0aGluIEF4aXMyLiBMaWtlIHdpdGggYWxsDQotICAgICAgICBBQVJzLCBhIHNlcnZpY2VzLnhtbCBmaWxlIGNvbnRhaW5pbmcgdGhlIHJlbGV2YW50IG1ldGFkYXRhDQotICAgICAgICBpcyByZXF1aXJlZCBmb3IgdGhlIHNlcnZpY2UgdG8gZGVwbG95IGNvcnJlY3RseS48L2xpPg0KLQ0KLSAgICAgICAgPGxpPlRoZSBzZXJ2aWNlIG1heSBiZSBwYWNrYWdlZCBpbiBhIGphciBmaWxlIGFuZCBwbGFjZWQNCi0gICAgICAgIGludG8gdGhlIDxjb2RlPnNlcnZpY2VqYXJzPC9jb2RlPiBkaXJlY3RvcnkuIFRoZQ0KLSAgICAgICAgPGNvZGU+SkFYV1NEZXBsb3llcjwvY29kZT4gd2lsbCBleGFtaW5lIGFsbCBqYXJzIHdpdGhpbg0KLSAgICAgICAgdGhhdCBkaXJlY3RvcnkgYW5kIGRlcGxveSB0aG9zZSBjbGFzc2VzIHRoYXQgaGF2ZSBKQVgtV1MNCi0gICAgICAgIGFubm90YXRpb25zIHdoaWNoIGlkZW50aWZ5IHRoZW0gYXMgV2ViIHNlcnZpY2VzLjwvbGk+DQotICAgICAgPC9vbD4NCi0NCi0gICAgICA8aDI+PGEgbmFtZT0iRGV2ZWxvcENsaWVudCIgaWQ9IkRldmVsb3BDbGllbnQiPkRldmVsb3BpbmcNCi0gICAgICBKQVgtV1MgY2xpZW50czwvYT48L2gyPlRoZSBKYXZhIEFQSSBmb3IgWE1MLUJhc2VkIFdlYg0KLSAgICAgIFNlcnZpY2VzIChKQVgtV1MpIFdlYiBzZXJ2aWNlIGNsaWVudCBwcm9ncmFtbWluZyBtb2RlbA0KLSAgICAgIHN1cHBvcnRzIGJvdGggdGhlIERpc3BhdGNoIGNsaWVudCBBUEkgYW5kIHRoZSBEeW5hbWljIFByb3h5DQotICAgICAgY2xpZW50IEFQSS4gVGhlIERpc3BhdGNoIGNsaWVudCBBUEkgaXMgYSBkeW5hbWljIGNsaWVudA0KLSAgICAgIHByb2dyYW1taW5nIG1vZGVsLCB3aGVyZWFzIHRoZSBzdGF0aWMgY2xpZW50IHByb2dyYW1taW5nDQotICAgICAgbW9kZWwgZm9yIEpBWC1XUyBpcyB0aGUgRHluYW1pYyBQcm94eSBjbGllbnQuIFRoZSBEaXNwYXRjaA0KLSAgICAgIGFuZCBEeW5hbWljIFByb3h5IGNsaWVudHMgZW5hYmxlIGJvdGggc3luY2hyb25vdXMgYW5kDQotICAgICAgYXN5bmNocm9ub3VzIGludm9jYXRpb24gb2YgSkFYLVdTIFdlYiBzZXJ2aWNlcy48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0NCi0gICAgICA8dWw+DQotICAgICAgICA8bGk+RGlzcGF0Y2ggY2xpZW50OiBVc2UgdGhpcyBjbGllbnQgd2hlbiB5b3Ugd2FudCB0byB3b3JrDQotICAgICAgICBhdCB0aGUgWE1MIG1lc3NhZ2UgbGV2ZWwgb3Igd2hlbiB5b3Ugd2FudCB0byB3b3JrIHdpdGhvdXQNCi0gICAgICAgIGFueSBnZW5lcmF0ZWQgYXJ0aWZhY3RzIGF0IHRoZSBKQVgtV1MgbGV2ZWwuPC9saT4NCi0NCi0gICAgICAgIDxsaT5EeW5hbWljIFByb3h5IGNsaWVudDogVXNlIHRoaXMgY2xpZW50IHdoZW4geW91IHdhbnQgdG8NCi0gICAgICAgIGludm9rZSBhIFdlYiBzZXJ2aWNlIGJhc2VkIG9uIGEgc2VydmljZSBlbmRwb2ludA0KLSAgICAgICAgaW50ZXJmYWNlLjwvbGk+DQotICAgICAgPC91bD4NCi0NCi0gICAgICA8aDQ+RGlzcGF0Y2ggY2xpZW50PC9oND5YTUwtYmFzZWQgV2ViIHNlcnZpY2VzIHVzZSBYTUwNCi0gICAgICBtZXNzYWdlcyBmb3IgY29tbXVuaWNhdGlvbnMgYmV0d2VlbiBXZWIgc2VydmljZXMgYW5kIFdlYg0KLSAgICAgIHNlcnZpY2VzIGNsaWVudHMuIFRoZSBKQVgtV1MgQVBJcyBwcm92aWRlIGhpZ2gtbGV2ZWwgbWV0aG9kcw0KLSAgICAgIHRvIHNpbXBsaWZ5IGFuZCBoaWRlIHRoZSBkZXRhaWxzIG9mIGNvbnZlcnRpbmcgYmV0d2VlbiBKYXZhDQotICAgICAgbWV0aG9kIGludm9jYXRpb25zIGFuZCB0aGVpciBhc3NvY2lhdGVkIFhNTCBtZXNzYWdlcy4NCi0gICAgICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB5b3UgbWlnaHQgZGVzaXJlIHRvIHdvcmsgYXQgdGhlIFhNTA0KLSAgICAgIG1lc3NhZ2UgbGV2ZWwuIFN1cHBvcnQgZm9yIGludm9raW5nIHNlcnZpY2VzIGF0IHRoZSBYTUwNCi0gICAgICBtZXNzYWdlIGxldmVsIGlzIHByb3ZpZGVkIGJ5IHRoZSBEaXNwYXRjaCBjbGllbnQgQVBJLiBUaGUNCi0gICAgICBEaXNwYXRjaCBjbGllbnQgQVBJLCA8Y29kZT5qYXZheC54bWwud3MuRGlzcGF0Y2g8L2NvZGU+LCBpcyBhDQotICAgICAgZHluYW1pYyBKQVgtV1MgY2xpZW50IHByb2dyYW1taW5nIGludGVyZmFjZS4gVG8gd3JpdGUgYQ0KLSAgICAgIERpc3BhdGNoIGNsaWVudCwgeW91IG11c3QgaGF2ZSBleHBlcnRpc2Ugd2l0aCB0aGUgRGlzcGF0Y2gNCi0gICAgICBjbGllbnQgQVBJcywgdGhlIHN1cHBvcnRlZCBvYmplY3QgdHlwZXMsIGFuZCBrbm93bGVkZ2Ugb2YgdGhlDQotICAgICAgbWVzc2FnZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhc3NvY2lhdGVkIFdTREwgZmlsZS4gVGhlDQotICAgICAgRGlzcGF0Y2ggY2xpZW50IGNhbiBzZW5kIGRhdGEgaW4gZWl0aGVyIDxjb2RlPk1FU1NBR0U8L2NvZGU+DQotICAgICAgb3IgPGNvZGU+UEFZTE9BRDwvY29kZT4gbW9kZS4gV2hlbiB1c2luZyB0aGUNCi0gICAgICA8Y29kZT5qYXZheC54bWwud3MuU2VydmljZS5Nb2RlLk1FU1NBR0U8L2NvZGU+IG1vZGUsIHRoZQ0KLSAgICAgIERpc3BhdGNoIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIHRoZSBlbnRpcmUgU09BUA0KLSAgICAgIGVudmVsb3BlIGluY2x1ZGluZyB0aGUgPGNvZGU+Jmx0O3NvYXA6RW52ZWxvcGUmZ3Q7PC9jb2RlPiwNCi0gICAgICA8Y29kZT4mbHQ7c29hcDpIZWFkZXImZ3Q7PC9jb2RlPiwgYW5kDQotICAgICAgPGNvZGU+Jmx0O3NvYXA6Qm9keSZndDs8L2NvZGU+IGVsZW1lbnRzLiBXaGVuIHVzaW5nIHRoZQ0KLSAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGUuUEFZTE9BRDwvY29kZT4gbW9kZSwgdGhlDQotICAgICAgRGlzcGF0Y2ggY2xpZW50IGlzIG9ubHkgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUNCi0gICAgICBjb250ZW50cyBvZiB0aGUgPGNvZGU+Jmx0O3NvYXA6Qm9keSZndDs8L2NvZGU+IGFuZCBKQVgtV1MNCi0gICAgICBpbmNsdWRlcyB0aGUgcGF5bG9hZCBpbiBhIDxjb2RlPiZsdDtzb2FwOkVudmVsb3BlJmd0OzwvY29kZT4NCi0gICAgICBlbGVtZW50LjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRoZSBEaXNwYXRjaCBjbGllbnQgQVBJIHJlcXVpcmVzIGFwcGxpY2F0aW9uIGNsaWVudHMgdG8NCi0gICAgICBjb25zdHJ1Y3QgbWVzc2FnZXMgb3IgcGF5bG9hZHMgYXMgWE1MIHdoaWNoIHJlcXVpcmVzIGENCi0gICAgICBkZXRhaWxlZCBrbm93bGVkZ2Ugb2YgdGhlIG1lc3NhZ2Ugb3IgbWVzc2FnZSBwYXlsb2FkLiBUaGUNCi0gICAgICBEaXNwYXRjaCBjbGllbnQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBvYmplY3RzOg0KLQ0KLSAgICAgIDx1bD4NCi0gICAgICAgIDxsaT48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT46IFVzZQ0KLSAgICAgICAgPGNvZGU+U291cmNlPC9jb2RlPiBvYmplY3RzIHRvIGVuYWJsZSBjbGllbnRzIHRvIHVzZSBYTUwNCi0gICAgICAgIEFQSXMgZGlyZWN0bHkuIFlvdSBjYW4gdXNlIDxjb2RlPlNvdXJjZTwvY29kZT4gb2JqZWN0cyB3aXRoDQotICAgICAgICBTT0FQIG9yIEhUVFAgYmluZGluZ3MuPC9saT4NCi0NCi0gICAgICAgIDxsaT5KQVhCIG9iamVjdHM6IFVzZSBKQVhCIG9iamVjdHMgc28gdGhhdCBjbGllbnRzIGNhbiB1c2UNCi0gICAgICAgIEpBWEIgb2JqZWN0cyB0aGF0IGFyZSBnZW5lcmF0ZWQgZnJvbSBhbiBYTUwgc2NoZW1hIHRvDQotICAgICAgICBjcmVhdGUgYW5kIG1hbmlwdWxhdGUgWE1MIHdpdGggSkFYLVdTIGFwcGxpY2F0aW9ucy4gSkFYQg0KLSAgICAgICAgb2JqZWN0cyBjYW4gb25seSBiZSB1c2VkIHdpdGggU09BUCBvciBIVFRQIGJpbmRpbmdzLjwvbGk+DQotDQotICAgICAgICA8bGk+PGNvZGU+amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U8L2NvZGU+OiBVc2UNCi0gICAgICAgIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiBvYmplY3RzIHNvIHRoYXQgY2xpZW50cyBjYW4gd29yaw0KLSAgICAgICAgd2l0aCBTT0FQIG1lc3NhZ2VzLiBZb3UgY2FuIG9ubHkgdXNlDQotICAgICAgICA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4gb2JqZWN0cyB3aXRoIFNPQVAgYmluZGluZ3MuPC9saT4NCi0NCi0gICAgICAgIDxsaT48Y29kZT5qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U8L2NvZGU+OiBVc2UNCi0gICAgICAgIDxjb2RlPkRhdGFTb3VyY2U8L2NvZGU+IG9iamVjdHMgc28gdGhhdCBjbGllbnRzIGNhbiB3b3JrDQotICAgICAgICB3aXRoIE11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsIEV4dGVuc2lvbiAoTUlNRSkgbWVzc2FnZXMuDQotICAgICAgICBVc2UgPGNvZGU+RGF0YVNvdXJjZTwvY29kZT4gb25seSB3aXRoIEhUVFAgYmluZGluZ3MuPC9saT4NCi0gICAgICA8L3VsPjxiciAvPg0KLSAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgaW5wdXQgcGFyYW1ldGVyIHR5cGUgaXMNCi0gICAgICBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgdGhlIGNhbGwgdG8gdGhlIERpc3BhdGNoIGNsaWVudA0KLSAgICAgIEFQSSBpcyBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgY29kZSBleGFtcGxlOg0KLSAgICAgIDxwcmU+RGlzcGF0Y2g8c3Ryb25nPiZsdDtTb3VyY2UmZ3Q7PC9zdHJvbmc+IGRpc3BhdGNoID0g4oCmIGNyZWF0ZSBhIERpc3BhdGNoPHN0cm9uZz4mbHQ7U291cmNlJmd0Ozwvc3Ryb25nPg0KLVNvdXJjZSByZXF1ZXN0ID0g4oCmIGNyZWF0ZSBhIFNvdXJjZSBvYmplY3QNCi1Tb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7PC9wcmU+VGhlIERpc3BhdGNoIHBhcmFtZXRlciB2YWx1ZSBkZXRlcm1pbmVzIHRoZSByZXR1cm4gdHlwZSBvZg0KLXRoZSA8Y29kZT5pbnZva2UoKTwvY29kZT4gbWV0aG9kLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRoZSBEaXNwYXRjaCBjbGllbnQgaXMgaW52b2tlZCBpbiBvbmUgb2YgdGhyZWUgd2F5czo8YnIgLz4NCi0NCi0gICAgICA8dWw+DQotICAgICAgICA8bGk+U3luY2hyb25vdXMgaW52b2NhdGlvbiBmb3IgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyB1c2luZw0KLSAgICAgICAgdGhlIDxjb2RlPmludm9rZTwvY29kZT4gbWV0aG9kPC9saT4NCi0NCi0gICAgICAgIDxsaT5Bc3luY2hyb25vdXMgaW52b2NhdGlvbiBmb3IgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcw0KLSAgICAgICAgdXNpbmcgdGhlIDxjb2RlPmludm9rZUFzeW5jPC9jb2RlPiBtZXRob2Qgd2l0aCBhIGNhbGxiYWNrDQotICAgICAgICBvciBwb2xsaW5nIG9iamVjdDwvbGk+DQotDQotICAgICAgICA8bGk+T25lLXdheSBpbnZvY2F0aW9uIHVzaW5nIHRoZSA8Y29kZT5pbnZva2VPbmVXYXk8L2NvZGU+DQotICAgICAgICBtZXRob2RzPC9saT4NCi0gICAgICA8L3VsPjxiciAvPg0KLSAgICAgIFJlZmVyIHRvIENoYXB0ZXIgNCwgc2VjdGlvbiAzIG9mIHRoZSBKQVgtV1MgMi4wIHNwZWNpZmljYXRpb24NCi0gICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBhIERpc3BhdGNoIGNsaWVudC4NCi0NCi0gICAgICA8aDQ+RHluYW1pYyBQcm94eSBjbGllbnQ8L2g0PlRoZSBzdGF0aWMgY2xpZW50IHByb2dyYW1taW5nDQotICAgICAgbW9kZWwgZm9yIEpBWC1XUyBpcyB0aGUgY2FsbGVkIHRoZSBEeW5hbWljIFByb3h5IGNsaWVudC4gVGhlDQotICAgICAgRHluYW1pYyBQcm94eSBjbGllbnQgaW52b2tlcyBhIFdlYiBzZXJ2aWNlIGJhc2VkIG9uIGEgU2VydmljZQ0KLSAgICAgIEVuZHBvaW50IEludGVyZmFjZSAoU0VJKSB3aGljaCBtdXN0IGJlIHByb3ZpZGVkLiBUaGUgRHluYW1pYw0KLSAgICAgIFByb3h5IGNsaWVudCBpcyBzaW1pbGFyIHRvIHRoZSBzdHViIGNsaWVudCBpbiB0aGUgSmF2YSBBUEkNCi0gICAgICBmb3IgWE1MLWJhc2VkIFJQQyAoSkFYLVJQQykgcHJvZ3JhbW1pbmcgbW9kZWwuIEFsdGhvdWdoIHRoZQ0KLSAgICAgIEpBWC1XUyBEeW5hbWljIFByb3h5IGNsaWVudCBhbmQgdGhlIEpBWC1SUEMgc3R1YiBjbGllbnQgYXJlDQotICAgICAgYm90aCBiYXNlZCBvbiB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkgdGhhdCBpcw0KLSAgICAgIGdlbmVyYXRlZCBmcm9tIGEgV1NETCBmaWxlICwgdGhlcmUgaXMgYSBtYWpvciBkaWZmZXJlbmNlLiBUaGUNCi0gICAgICBEeW5hbWljIFByb3h5IGNsaWVudCBpcyBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYXQgcnVuIHRpbWUNCi0gICAgICB1c2luZyB0aGUgSmF2YSA1IER5bmFtaWMgUHJveHkgZnVuY3Rpb25hbGl0eSwgd2hpbGUgdGhlDQotICAgICAgSkFYLVJQQy1iYXNlZCBzdHViIGNsaWVudCBpcyBhIG5vbi1wb3J0YWJsZSBKYXZhIGZpbGUgdGhhdCBpcw0KLSAgICAgIGdlbmVyYXRlZCBieSB0b29saW5nLiBVbmxpa2UgdGhlIEpBWC1SUEMgc3R1YiBjbGllbnRzLCB0aGUNCi0gICAgICBEeW5hbWljIFByb3h5IGNsaWVudCBkb2VzIG5vdCByZXF1aXJlIHlvdSB0byByZWdlbmVyYXRlIGENCi0gICAgICBzdHViIHByaW9yIHRvIHJ1bm5pbmcgdGhlIGNsaWVudCBvbiBhbiBhcHBsaWNhdGlvbiBzZXJ2ZXIgZm9yDQotICAgICAgYSBkaWZmZXJlbnQgdmVuZG9yIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgZG9lcyBub3QNCi0gICAgICByZXF1aXJlIHRoZSBzcGVjaWZpYyB2ZW5kb3IgaW5mb3JtYXRpb24uPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIER5bmFtaWMgUHJveHkgaW5zdGFuY2VzIGV4dGVuZCB0aGUNCi0gICAgICA8Y29kZT5qYXZhLmxhbmcucmVmbGVjdC5Qcm94eTwvY29kZT4gY2xhc3MgYW5kIGxldmVyYWdlIHRoZQ0KLSAgICAgIER5bmFtaWMgUHJveHkgZnVuY3Rpb24gaW4gdGhlIGJhc2UgSmF2YSBSdW50aW1lIEVudmlyb25tZW50DQotICAgICAgVmVyc2lvbiA1LiBUaGUgY2xpZW50IGFwcGxpY2F0aW9uIGNhbiB0aGVuIHByb3ZpZGUgYW4NCi0gICAgICBpbnRlcmZhY2UgdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJveHkgaW5zdGFuY2Ugd2hpbGUgdGhlDQotICAgICAgcnVudGltZSBpcyByZXNwb25zaWJsZSBmb3IgZHluYW1pY2FsbHkgY3JlYXRpbmcgYSBKYXZhIG9iamVjdA0KLSAgICAgIHRoYXQgcmVwcmVzZW50cyB0aGUgU0VJLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRoZSBEeW5hbWljIFByb3h5IGNsaWVudCBpcyBpbnZva2VkIGluIG9uZSBvZiB0aHJlZQ0KLSAgICAgIHdheXM6PGJyIC8+DQotDQotICAgICAgPHVsPg0KLSAgICAgICAgPGxpPlN5bmNocm9ub3VzIGludm9jYXRpb24gZm9yIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgdXNpbmcNCi0gICAgICAgIHRoZSA8Y29kZT5pbnZva2U8L2NvZGU+IG1ldGhvZDwvbGk+DQotDQotICAgICAgICA8bGk+QXN5bmNocm9ub3VzIGludm9jYXRpb24gZm9yIHJlcXVlc3RzIGFuZCByZXNwb25zZXMNCi0gICAgICAgIHVzaW5nIHRoZSA8Y29kZT5pbnZva2VBc3luYzwvY29kZT4gbWV0aG9kIHdpdGggYSBjYWxsYmFjaw0KLSAgICAgICAgb3IgcG9sbGluZyBvYmplY3Q8L2xpPg0KLQ0KLSAgICAgICAgPGxpPk9uZS13YXkgaW52b2NhdGlvbiB1c2luZyB0aGUgPGNvZGU+aW52b2tlT25lV2F5PC9jb2RlPg0KLSAgICAgICAgbWV0aG9kczwvbGk+DQotICAgICAgPC91bD48YnIgLz4NCi0gICAgICBSZWZlciB0byBDaGFwdGVyIDQgb2YgdGhlIEpBWC1XUyAyLjAgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZQ0KLSAgICAgIGluZm9ybWF0aW9uIG9uIHVzaW5nIER5bmFtaWMgUHJveHkgY2xpZW50cy4NCi0NCi0gICAgICA8aDM+PGEgbmFtZT0iUHJveHlDbGllbnQiIGlkPSJQcm94eUNsaWVudCI+RGV2ZWxvcGluZyBhDQotICAgICAgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudDwvYT48L2gzPkphdmEgQVBJIGZvcg0KLSAgICAgIFhNTC1CYXNlZCBXZWIgU2VydmljZXMgKEpBWC1XUykgdG9vbGluZyBzdXBwb3J0cyBnZW5lcmF0aW5nDQotICAgICAgSmF2YSBhcnRpZmFjdHMgeW91IG5lZWQgdG8gZGV2ZWxvcCBzdGF0aWMgSkFYLVdTIFdlYiBzZXJ2aWNlcw0KLSAgICAgIGNsaWVudHMgd2hlbiBzdGFydGluZyB3aXRoIGEgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uDQotICAgICAgTGFuZ3VhZ2UgKFdTREwpIGZpbGUuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIHN0YXRpYyBjbGllbnQgcHJvZ3JhbW1pbmcgbW9kZWwgZm9yIEpBWC1XUyBpcyB0aGUgY2FsbGVkDQotICAgICAgdGhlIGR5bmFtaWMgcHJveHkgY2xpZW50LiBUaGUgZHluYW1pYyBwcm94eSBjbGllbnQgaW52b2tlcyBhDQotICAgICAgV2ViIHNlcnZpY2UgYmFzZWQgb24gYSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSB0aGF0IGlzDQotICAgICAgcHJvdmlkZWQuIEFmdGVyIHlvdSBjcmVhdGUgdGhlIHByb3h5LCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uDQotICAgICAgY2FuIGludm9rZSBtZXRob2RzIG9uIHRoZSBwcm94eSBqdXN0IGxpa2UgYSBzdGFuZGFyZA0KLSAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRob3NlIGludGVyZmFjZXMuIEZvciBKQVgtV1MgV2ViIHNlcnZpY2UNCi0gICAgICBjbGllbnRzIHVzaW5nIHRoZSBkeW5hbWljIHByb3h5IHByb2dyYW1taW5nIG1vZGVsLCB1c2UgdGhlDQotICAgICAgSkFYLVdTIHRvb2wsIDxiPndzaW1wb3J0PC9iPiwgdG8gcHJvY2VzcyBhIFdTREwgZmlsZSBhbmQNCi0gICAgICBnZW5lcmF0ZSBwb3J0YWJsZSBKYXZhIGFydGlmYWN0cyB0aGF0IGFyZSB1c2VkIHRvIGNyZWF0ZSBhDQotICAgICAgV2ViIHNlcnZpY2UgY2xpZW50LjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIENyZWF0ZSB0aGUgZm9sbG93aW5nIHBvcnRhYmxlIEphdmEgYXJ0aWZhY3RzIHVzaW5nIHRoZQ0KLSAgICAgIHdzaW1wb3J0IHRvb2w6DQotDQotICAgICAgPHVsPg0KLSAgICAgICAgPGxpPlNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIChTRUkpPC9saT4NCi0NCi0gICAgICAgIDxsaT5TZXJ2aWNlIGNsYXNzPC9saT4NCi0NCi0gICAgICAgIDxsaT5FeGNlcHRpb24gY2xhc3MgdGhhdCBpcyBtYXBwZWQgZnJvbSB0aGUgd3NkbDpmYXVsdA0KLSAgICAgICAgY2xhc3MgKGlmIGFueSk8L2xpPg0KLQ0KLSAgICAgICAgPGxpPkphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQikgZ2VuZXJhdGVkIHR5cGUNCi0gICAgICAgIHZhbHVlcyB3aGljaCBhcmUgSmF2YSBjbGFzc2VzIG1hcHBlZCBmcm9tIFhNTCBzY2hlbWENCi0gICAgICAgIHR5cGVzPC9saT4NCi0gICAgICA8L3VsPjxiciAvPg0KLSAgICAgIFRoZSBzdGVwcyB0byBjcmVhdGluZyBhIGR5bmFtaWMgcHJveHkgY2xpZW50IGFyZToNCi0NCi0gICAgICA8b2w+DQotICAgICAgICA8bGk+KE9wdGlvbmFsKSBJZiB5b3UgYXJlIHVzaW5nIFdTREwgb3Igc2NoZW1hDQotICAgICAgICBjdXN0b21pemF0aW9ucywgdXNlIHRoZSA8Yj4tYjwvYj4gb3B0aW9uIHdpdGggdGhlDQotICAgICAgICA8Yj53c2ltcG9ydDwvYj4gY29tbWFuZCB0byBzcGVjaWZ5IGFuIGV4dGVybmFsIGJpbmRpbmcNCi0gICAgICAgIGZpbGVzIHRoYXQgY29udGFpbiB5b3VyIGN1c3RvbWl6YXRpb25zLjxiciAvPg0KLSAgICAgICAgPGJyIC8+DQotICAgICAgICBGb3IgZXhhbXBsZTogPGI+d3NpbXBvcnQgLWIgPGk+YmluZGluZy54bWwNCi0gICAgICAgIHdzZGxmaWxlLndzZGw8L2k+PC9iPi48YnIgLz4NCi0gICAgICAgIDxiciAvPg0KLSAgICAgICAgWW91IGNhbiBjdXN0b21pemUgdGhlIGJpbmRpbmdzIGluIHlvdXIgV1NETCBmaWxlIHRvIGVuYWJsZQ0KLSAgICAgICAgYXN5bmNocm9ub3VzIG1hcHBpbmdzIG9yIGF0dGFjaG1lbnRzLiBUbyBnZW5lcmF0ZQ0KLSAgICAgICAgYXN5bmNocm9ub3VzIGludGVyZmFjZXMsIGFkZCB0aGUgY2xpZW50LXNpZGUgb25seQ0KLSAgICAgICAgY3VzdG9taXphdGlvbiA8Y29kZT5lbmFibGVBc3luY01hcHBpbmc8L2NvZGU+IGJpbmRpbmcNCi0gICAgICAgIGRlY2xhcmF0aW9uIHRvIHRoZSA8Y29kZT53c2RsOmRlZmluaXRpb25zPC9jb2RlPiBlbGVtZW50IG9yDQotICAgICAgICBpbiBhbiBleHRlcm5hbCBiaW5kaW5nIGZpbGUgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBXU0RMDQotICAgICAgICBmaWxlLiBVc2UgdGhlIDxjb2RlPmVuYWJsZU1JTUVDb250ZW50PC9jb2RlPiBiaW5kaW5nDQotICAgICAgICBkZWNsYXJhdGlvbiBpbiB5b3VyIGN1c3RvbSBjbGllbnQgb3Igc2VydmVyIGJpbmRpbmcgZmlsZSB0bw0KLSAgICAgICAgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGRlZmF1bHQgPGNvZGU+bWltZTpjb250ZW50PC9jb2RlPg0KLSAgICAgICAgbWFwcGluZyBydWxlcy4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gY3VzdG9tIGJpbmRpbmcNCi0gICAgICAgIGRlY2xhcmF0aW9ucywgc2VlIGNoYXB0ZXIgOCB0aGUgSkFYLVdTIHNwZWNpZmljYXRpb24uPC9saT4NCi0NCi0gICAgICAgIDxsaSBzdHlsZT0ibGlzdC1zdHlsZTogbm9uZSI+PGJyIC8+PC9saT4NCi0NCi0gICAgICAgIDxsaT5SdW4gdGhlIDxiPndzaW1wb3J0IC1rZWVwIDxpPndzZGxfVVI8L2k+TDwvYj4gY29tbWFuZA0KLSAgICAgICAgdG8gZ2VuZXJhdGUgdGhlIHBvcnRhYmxlIGNsaWVudCBhcnRpZmFjdHMuIFVzZSB0aGUNCi0gICAgICAgIDxiPi12ZXJib3NlPC9iPiBvcHRpb24gdG8gc2VlIGEgbGlzdCBvZiBnZW5lcmF0ZWQgZmlsZXMNCi0gICAgICAgIHdoZW4geW91IHJ1biB0aGUgY29tbWFuZC48YnIgLz4NCi0gICAgICAgIDxiciAvPg0KLSAgICAgICAgQmVzdCBwcmFjdGljZTogV2hlbiB5b3UgcnVuIHRoZSA8Yj53c2ltcG9ydDwvYj4gdG9vbCwgdGhlDQotICAgICAgICBsb2NhdGlvbiBvZiB5b3VyIFdTREwgZmlsZSBtdXN0IGVpdGhlciBiZSBvbWl0dGVkIG9yIHBvaW50DQotICAgICAgICB0byBhIHZhbGlkIFdTREwgZG9jdW1lbnQuIEEgYmVzdCBwcmFjdGljZSBmb3IgZW5zdXJpbmcgdGhhdA0KLSAgICAgICAgeW91IHByb2R1Y2UgYSBKQVgtV1MgV2ViIHNlcnZpY2VzIGNsaWVudCB0aGF0IGlzIHBvcnRhYmxlDQotICAgICAgICB0byBvdGhlciBzeXN0ZW1zIGlzIHRvIHBhY2thZ2UgdGhlIFdTREwgZG9jdW1lbnQgd2l0aGluIHRoZQ0KLSAgICAgICAgYXBwbGljYXRpb24gbW9kdWxlIHN1Y2ggYXMgYSBXZWIgc2VydmljZXMgY2xpZW50IEphdmENCi0gICAgICAgIGFyY2hpdmUgKEpBUikgZmlsZSBvciBhIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUuIFlvdSBjYW4NCi0gICAgICAgIHNwZWNpZnkgYSByZWxhdGl2ZSBVUkkgZm9yIHRoZSBsb2NhdGlvbiBvZiB5b3VyIFdTREwgZmlsZQ0KLSAgICAgICAgYnkgdXNpbmcgdGhlPGNvZGU+LXdzZGxsb2NhdGlvbjwvY29kZT4gYW5ub3RhdGlvbg0KLSAgICAgICAgYXR0cmlidXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBNeVNlcnZpY2Uud3NkbCBmaWxlIGlzDQotICAgICAgICBsb2NhdGVkIGluIHRoZSBNRVRBLUlORi93c2RsLyBkaXJlY3RvcnksIHRoZW4gcnVuIHRoZQ0KLSAgICAgICAgd3NpbXBvcnQgdG9vbCBhbmQgdXNlIHRoZSA8Y29kZT4td3NkbGxvY2F0aW9uPC9jb2RlPiBvcHRpb24NCi0gICAgICAgIHRvIHNwZWNpZnkgdGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUNCi0gICAgICAgIFdTREwgZmlsZS48YnIgLz4NCi0gICAgICAgIDxiciAvPg0KLSAgICAgICAgPGNvZGU+d3NpbXBvcnQgLWtlZXANCi0gICAgICAgIC13c2RsbG9jYXRpb249TUVUQS1JTkYvd3NkbC9NeVNlcnZpY2Uud3NkbDwvY29kZT48L2xpPg0KLSAgICAgIDwvb2w+DQotDQotICAgICAgPGgzPjxhIG5hbWU9IkRpc3BhdGNoQ2xpZW50IiBpZD0iRGlzcGF0Y2hDbGllbnQiPkRldmVsb3BpbmcgYQ0KLSAgICAgIGR5bmFtaWMgY2xpZW50IHVzaW5nIEpBWC1XUyBBUElzPC9hPjwvaDM+SkFYLVdTIHByb3ZpZGVzIGENCi0gICAgICBuZXcgZHluYW1pYyBEaXNwYXRjaCBjbGllbnQgQVBJIHRoYXQgaXMgbW9yZSBnZW5lcmljIGFuZA0KLSAgICAgIG9mZmVycyBtb3JlIGZsZXhpYmlsaXR5IHRoYW4gdGhlIGV4aXN0aW5nIEphdmEgQVBJIGZvcg0KLSAgICAgIFhNTC1iYXNlZCBSUEMgKEpBWC1SUEMpLWJhc2VkIER5bmFtaWMgSW52b2NhdGlvbiBJbnRlcmZhY2UNCi0gICAgICAoRElJKS4gVGhlIERpc3BhdGNoIGNsaWVudCBpbnRlcmZhY2UsDQotICAgICAgPGNvZGU+amF2YXgueG1sLndzLkRpc3BhdGNoPC9jb2RlPiwgaXMgYW4gWE1MIG1lc3NhZ2luZw0KLSAgICAgIG9yaWVudGVkIGNsaWVudCB0aGF0IGlzIGludGVuZGVkIGZvciBhZHZhbmNlZCBYTUwgZGV2ZWxvcGVycw0KLSAgICAgIHdobyBwcmVmZXIgdG8gd29yayBhdCB0aGUgWE1MIGxldmVsIHVzaW5nIFhNTCBjb25zdHJ1Y3RzLiBUbw0KLSAgICAgIHdyaXRlIGEgRGlzcGF0Y2ggY2xpZW50LCB5b3UgbXVzdCBoYXZlIGV4cGVydGlzZSB3aXRoIHRoZQ0KLSAgICAgIERpc3BhdGNoIGNsaWVudCBBUElzLCB0aGUgc3VwcG9ydGVkIG9iamVjdCB0eXBlcywgYW5kDQotICAgICAga25vd2xlZGdlIG9mIHRoZSBtZXNzYWdlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFzc29jaWF0ZWQNCi0gICAgICBXU0RMIGZpbGUuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIERpc3BhdGNoIEFQSSBjYW4gc2VuZCBkYXRhIGluIGVpdGhlciA8Y29kZT5QQVlMT0FEPC9jb2RlPg0KLSAgICAgIG9yIDxjb2RlPk1FU1NBR0U8L2NvZGU+IG1vZGUuIFdoZW4gdXNpbmcgdGhlDQotICAgICAgPGNvZGU+UEFZTE9BRDwvY29kZT4gbW9kZSwgdGhlIERpc3BhdGNoIGNsaWVudCBpcyBvbmx5DQotICAgICAgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgY29udGVudHMgb2YgdGhlDQotICAgICAgPGNvZGU+Jmx0O3NvYXA6Qm9keSZndDs8L2NvZGU+IGFuZCBKQVgtV1MgaW5jbHVkZXMgdGhlIGlucHV0DQotICAgICAgcGF5bG9hZCBpbiBhIDxjb2RlPiZsdDtzb2FwOkVudmVsb3BlJmd0OzwvY29kZT4gZWxlbWVudC4gV2hlbg0KLSAgICAgIHVzaW5nIHRoZSA8Y29kZT5NRVNTQUdFPC9jb2RlPiBtb2RlLCB0aGUgRGlzcGF0Y2ggY2xpZW50IGlzDQotICAgICAgcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyB0aGUgZW50aXJlIFNPQVAgZW52ZWxvcGUuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIERpc3BhdGNoIGNsaWVudCBBUEkgcmVxdWlyZXMgYXBwbGljYXRpb24gY2xpZW50cyB0bw0KLSAgICAgIGNvbnN0cnVjdCBtZXNzYWdlcyBvciBwYXlsb2FkcyBhcyBYTUwgYW5kIHJlcXVpcmVzIGEgZGV0YWlsZWQNCi0gICAgICBrbm93bGVkZ2Ugb2YgdGhlIG1lc3NhZ2Ugb3IgbWVzc2FnZSBwYXlsb2FkLiBUaGUgRGlzcGF0Y2gNCi0gICAgICBjbGllbnQgY2FuIHVzZSBIVFRQIGJpbmRpbmdzIHdoZW4gdXNpbmcgPGNvZGU+U291cmNlPC9jb2RlPg0KLSAgICAgIG9iamVjdHMsIEphdmEgQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyAoSkFYQikgb2JqZWN0cywgb3INCi0gICAgICBkYXRhIHNvdXJjZSBvYmplY3RzLiBUaGUgRGlzcGF0Y2ggY2xpZW50IHN1cHBvcnRzIHRoZQ0KLSAgICAgIGZvbGxvd2luZyB0eXBlcyBvZiBvYmplY3RzOjxiciAvPg0KLSAgICAgIDxiciAvPg0KLQ0KLSAgICAgIDx1bD4NCi0gICAgICAgIDxsaT48Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvY29kZT46IFVzZQ0KLSAgICAgICAgPGNvZGU+U291cmNlPC9jb2RlPiBvYmplY3RzIHRvIGVuYWJsZSBjbGllbnRzIHRvIHVzZSBYTUwNCi0gICAgICAgIEFQSXMgZGlyZWN0bHkuIFlvdSBjYW4gdXNlIDxjb2RlPlNvdXJjZTwvY29kZT4gb2JqZWN0cyB3aXRoDQotICAgICAgICBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzLjwvbGk+DQotDQotICAgICAgICA8bGk+SkFYQiBvYmplY3RzOiBVc2UgSkFYQiBvYmplY3RzIHNvIHRoYXQgY2xpZW50cyBjYW4gdXNlDQotICAgICAgICBKQVhCIG9iamVjdHMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZyb20gYW4gWE1MIHNjaGVtYSB0bw0KLSAgICAgICAgY3JlYXRlIGFuZCBtYW5pcHVsYXRlIFhNTCB3aXRoIEpBWC1XUyBhcHBsaWNhdGlvbnMuIEpBWEINCi0gICAgICAgIG9iamVjdHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFNPQVAgYW5kIEhUVFAgYmluZGluZ3MuPC9saT4NCi0NCi0gICAgICAgIDxsaT48Y29kZT5qYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTwvY29kZT46IFVzZQ0KLSAgICAgICAgPGNvZGU+U09BUE1lc3NhZ2U8L2NvZGU+IG9iamVjdHMgc28gdGhhdCBjbGllbnRzIGNhbiB3b3JrDQotICAgICAgICB3aXRoIFNPQVAgbWVzc2FnZXMuIFlvdSBjYW4gb25seSB1c2UNCi0gICAgICAgIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiBvYmplY3RzIHdpdGggU09BUCB2ZXJzaW9uIDEuMSBvcg0KLSAgICAgICAgU09BUCB2ZXJzaW9uIDEuMiBiaW5kaW5ncy48L2xpPg0KLQ0KLSAgICAgICAgPGxpPjxjb2RlPmphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTwvY29kZT46IFVzZQ0KLSAgICAgICAgPGNvZGU+RGF0YVNvdXJjZTwvY29kZT4gb2JqZWN0cyBzbyB0aGF0IGNsaWVudHMgY2FuIHdvcmsNCi0gICAgICAgIHdpdGggTXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9uIChNSU1FKSBtZXNzYWdlcy4NCi0gICAgICAgIFVzZSA8Y29kZT5EYXRhU291cmNlPC9jb2RlPiBvbmx5IHdpdGggSFRUUCBiaW5kaW5ncy48L2xpPg0KLSAgICAgIDwvdWw+PGJyIC8+DQotICAgICAgVGhlIERpc3BhdGNoIEFQSSB1c2VzIHRoZSBjb25jZXB0IG9mIGdlbmVyaWNzIHRoYXQgYXJlDQotICAgICAgaW50cm9kdWNlZCBpbiBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgVmVyc2lvbiA1LiBGb3IgZWFjaCBvZg0KLSAgICAgIHRoZSBpbnZva2UoKSBtZXRob2RzIG9uIHRoZSBEaXNwYXRjaCBpbnRlcmZhY2UsIGdlbmVyaWNzIGFyZQ0KLSAgICAgIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSByZXR1cm4gdHlwZS48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBUaGUgc3RlcHMgdG8gY3JlYXRpbmcgYSBkeW5hbWljIGNsaWVudCBhcmU6DQotDQotICAgICAgPG9sPg0KLSAgICAgICAgPGxpPkRldGVybWluZSBpZiB5b3Ugd2FudCB5b3VyIGR5bmFtaWMgY2xpZW50IHRvIHNlbmQgZGF0YQ0KLSAgICAgICAgaW4gPGNvZGU+UEFZTE9BRDwvY29kZT4gb3IgPGNvZGU+TUVTU0FHRTwvY29kZT4gbW9kZS48L2xpPg0KLQ0KLSAgICAgICAgPGxpPkNyZWF0ZSBhIHNlcnZpY2UgaW5zdGFuY2UgYW5kIGFkZCBhdCBsZWFzdCBvbmUgcG9ydCB0bw0KLSAgICAgICAgaXQuIFRoZSBwb3J0IGNhcnJpZXMgdGhlIHByb3RvY29sIGJpbmRpbmcgYW5kIHNlcnZpY2UNCi0gICAgICAgIGVuZHBvaW50IGFkZHJlc3MgaW5mb3JtYXRpb24uPC9saT4NCi0NCi0gICAgICAgIDxsaT5DcmVhdGUgYSA8Y29kZT5EaXNwYXRjaCZsdDtUJmd0OzwvY29kZT4gb2JqZWN0IHVzaW5nDQotICAgICAgICBlaXRoZXIgdGhlIDxjb2RlPlNlcnZpY2UuTW9kZS5QQVlMT0FEPC9jb2RlPiBtZXRob2Qgb3IgdGhlDQotICAgICAgICA8Y29kZT5TZXJ2aWNlLk1vZGUuTUVTU0FHRTwvY29kZT4gbWV0aG9kLjwvbGk+DQotDQotICAgICAgICA8bGk+Q29uZmlndXJlIHRoZSByZXF1ZXN0IGNvbnRleHQgcHJvcGVydGllcyBvbiB0aGUNCi0gICAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+IGludGVyZmFjZS4gVXNlDQotICAgICAgICB0aGUgcmVxdWVzdCBjb250ZXh0IHRvIHNwZWNpZnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHN1Y2gNCi0gICAgICAgIGFzIGVuYWJsaW5nIEhUVFAgYXV0aGVudGljYXRpb24gb3Igc3BlY2lmeWluZyB0aGUgZW5kcG9pbnQNCi0gICAgICAgIGFkZHJlc3MuPC9saT4NCi0NCi0gICAgICAgIDxsaT5Db21wb3NlIHRoZSBjbGllbnQgcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUgZHluYW1pYw0KLSAgICAgICAgY2xpZW50LjwvbGk+DQotDQotICAgICAgICA8bGk+SW52b2tlIHRoZSBzZXJ2aWNlIGVuZHBvaW50IHdpdGggdGhlIERpc3BhdGNoIGNsaWVudA0KLSAgICAgICAgZWl0aGVyIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuPC9saT4NCi0NCi0gICAgICAgIDxsaT5Qcm9jZXNzIHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZpY2UuPC9saT4NCi0gICAgICA8L29sPjxiciAvPg0KLSAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgc3RlcHMgdG8gY3JlYXRlIGENCi0gICAgICBEaXNwYXRjaCBjbGllbnQgYW5kIGludm9rZSBhIHNhbXBsZSBFY2hvU2VydmljZSBzZXJ2aWNlDQotICAgICAgZW5kcG9pbnQuDQotICAgICAgPHByZT4NCi0gICBTdHJpbmcgZW5kcG9pbnRVcmwgPSAuLi47DQotICAgICAgICAgICAgICAgIA0KLSAgIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS93cy9heGlzMi9zYW1wbGUvZWNoby8iLA0KLSAgICAiRWNob1NlcnZpY2UiKTsNCi0gICBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvd3MvYXhpczIvc2FtcGxlL2VjaG8vIiwNCi0gICAgIkVjaG9TZXJ2aWNlUG9ydCIpOw0KLSAgICAgICAgICAgICAgICANCi0gICAvKiogQ3JlYXRlIGEgc2VydmljZSBhbmQgYWRkIGF0IGxlYXN0IG9uZSBwb3J0IHRvIGl0LiAqKi8gDQotICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgIHNlcnZpY2UuYWRkUG9ydChwb3J0TmFtZSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBlbmRwb2ludFVybCk7DQotICAgICAgICAgICAgICAgIA0KLSAgIC8qKiBDcmVhdGUgYSBEaXNwYXRjaCBpbnN0YW5jZSBmcm9tIGEgc2VydmljZS4qKi8gDQotICAgRGlzcGF0Y2gmbHQ7U09BUE1lc3NhZ2UmZ3Q7IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgDQotICAgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgIC8qKiBDcmVhdGUgU09BUE1lc3NhZ2UgcmVxdWVzdC4gKiovDQotICAgLy8gY29tcG9zZSBhIHJlcXVlc3QgbWVzc2FnZQ0KLSAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7DQotDQotICAgLy8gQ3JlYXRlIGEgbWVzc2FnZS4gIFRoaXMgZXhhbXBsZSB3b3JrcyB3aXRoIHRoZSBTT0FQUEFSVC4NCi0gICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gbWYuY3JlYXRlTWVzc2FnZSgpOw0KLSAgIFNPQVBQYXJ0IHBhcnQgPSByZXF1ZXN0LmdldFNPQVBQYXJ0KCk7DQotDQotICAgLy8gT2J0YWluIHRoZSBTT0FQRW52ZWxvcGUgYW5kIGhlYWRlciBhbmQgYm9keSBlbGVtZW50cy4NCi0gICBTT0FQRW52ZWxvcGUgZW52ID0gcGFydC5nZXRFbnZlbG9wZSgpOw0KLSAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52LmdldEhlYWRlcigpOw0KLSAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLQ0KLSAgIC8vIENvbnN0cnVjdCB0aGUgbWVzc2FnZSBwYXlsb2FkLg0KLSAgIFNPQVBFbGVtZW50IG9wZXJhdGlvbiA9IGJvZHkuYWRkQ2hpbGRFbGVtZW50KCJpbnZva2UiLCAibnMxIiwNCi0gICAgImh0dHA6Ly9vcmcvYXBhY2hlL3dzL2F4aXMyL3NhbXBsZS9lY2hvLyIpOw0KLSAgIFNPQVBFbGVtZW50IHZhbHVlID0gb3BlcmF0aW9uLmFkZENoaWxkRWxlbWVudCgiYXJnMCIpOw0KLSAgIHZhbHVlLmFkZFRleHROb2RlKCJwaW5nIik7DQotICAgcmVxdWVzdC5zYXZlQ2hhbmdlcygpOw0KLQ0KLSAgIC8qKiBJbnZva2UgdGhlIHNlcnZpY2UgZW5kcG9pbnQuICoqLw0KLSAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgIC8qKiBQcm9jZXNzIHRoZSByZXNwb25zZS4gKiovDQotPC9wcmU+DQotDQotICAgICAgPGgyPjxhIG5hbWU9IlJ1bkNsaWVudCIgaWQ9IlJ1bkNsaWVudCI+UnVubmluZyBhIEpBWC1XUw0KLSAgICAgIGNsaWVudDwvYT48L2gyPkEgSkFYLVdTIGNsaWVudCBtYXkgYmUgc3RhcnRlZCBmcm9tIHRoZQ0KLSAgICAgIGNvbW1hbmQgbGluZSBsaWtlIGFueSBvdGhlciBBeGlzMi1iYXNlZCBjbGllbnQsIGluY2x1ZGluZw0KLSAgICAgIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgPGNvZGU+YXhpczI8L2NvZGU+IHNoZWxsIHNjcmlwdHMgaW4NCi0gICAgICB0aGUgPGNvZGU+YmluPC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIGluc3RhbGxlZCBydW50aW1lLg0KLQ0KLSAgICAgIDxoMj48YSBuYW1lPSJBc3luYyIgaWQ9IkFzeW5jIj5JbnZva2luZyBKQVgtV1MgV2ViIHNlcnZpY2VzDQotICAgICAgYXN5bmNocm9ub3VzbHk8L2E+PC9oMj5KYXZhIEFQSSBmb3IgWE1MLUJhc2VkIFdlYiBTZXJ2aWNlcw0KLSAgICAgIChKQVgtV1MpIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGludm9raW5nIFdlYiBzZXJ2aWNlcyB1c2luZyBhbg0KLSAgICAgIGFzeW5jaHJvbm91cyBjbGllbnQgaW52b2NhdGlvbi4gSkFYLVdTIHByb3ZpZGVzIHN1cHBvcnQgZm9yDQotICAgICAgYm90aCBhIGNhbGxiYWNrIGFuZCBwb2xsaW5nIG1vZGVsIHdoZW4gY2FsbGluZyBXZWIgc2VydmljZXMNCi0gICAgICBhc3luY2hyb25vdXNseS4gQm90aCB0aGUgY2FsbGJhY2sgbW9kZWwgYW5kIHRoZSBwb2xsaW5nIG1vZGVsDQotICAgICAgYXJlIGF2YWlsYWJsZSBvbiB0aGUgRGlzcGF0Y2ggY2xpZW50IGFuZCB0aGUgRHluYW1pYyBQcm94eQ0KLSAgICAgIGNsaWVudC48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBBbiBhc3luY2hyb25vdXMgaW52b2NhdGlvbiBvZiBhIFdlYiBzZXJ2aWNlIHNlbmRzIGEgcmVxdWVzdA0KLSAgICAgIHRvIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGFuZCB0aGVuIGltbWVkaWF0ZWx5IHJldHVybnMgY29udHJvbA0KLSAgICAgIHRvIHRoZSBjbGllbnQgcHJvZ3JhbSB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZSB0bw0KLSAgICAgIHJldHVybiBmcm9tIHRoZSBzZXJ2aWNlLiBKQVgtV1MgYXN5bmNocm9ub3VzIFdlYiBzZXJ2aWNlDQotICAgICAgY2xpZW50cyBjb25zdW1lIFdlYiBzZXJ2aWNlcyB1c2luZyBlaXRoZXIgdGhlIGNhbGxiYWNrDQotICAgICAgYXBwcm9hY2ggb3IgdGhlIHBvbGxpbmcgYXBwcm9hY2guIFVzaW5nIGEgcG9sbGluZyBtb2RlbCwgYQ0KLSAgICAgIGNsaWVudCBjYW4gaXNzdWUgYSByZXF1ZXN0IGFuZCByZWNlaXZlIGEgcmVzcG9uc2Ugb2JqZWN0IHRoYXQNCi0gICAgICBpcyBwb2xsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzZXJ2ZXIgaGFzIHJlc3BvbmRlZC4gV2hlbiB0aGUNCi0gICAgICBzZXJ2ZXIgcmVzcG9uZHMsIHRoZSBhY3R1YWwgcmVzcG9uc2UgaXMgcmV0cmlldmVkLiBVc2luZyB0aGUNCi0gICAgICBjYWxsYmFjayBtb2RlbCwgdGhlIGNsaWVudCBwcm92aWRlcyBhIGNhbGxiYWNrIGhhbmRsZXIgdG8NCi0gICAgICBhY2NlcHQgYW5kIHByb2Nlc3MgdGhlIGluYm91bmQgcmVzcG9uc2Ugb2JqZWN0LiBUaGUNCi0gICAgICA8Y29kZT5oYW5kbGVSZXNwb25zZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGhhbmRsZXIgaXMgY2FsbGVkDQotICAgICAgd2hlbiB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZS4gQm90aCB0aGUgcG9sbGluZyBhbmQgY2FsbGJhY2sNCi0gICAgICBtb2RlbHMgZW5hYmxlIHRoZSBjbGllbnQgdG8gZm9jdXMgb24gY29udGludWluZyB0byBwcm9jZXNzDQotICAgICAgd29yayB3aXRob3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgdG8gcmV0dXJuLCB3aGlsZQ0KLSAgICAgIHByb3ZpZGluZyBmb3IgYSBtb3JlIGR5bmFtaWMgYW5kIGVmZmljaWVudCBtb2RlbCB0byBpbnZva2UNCi0gICAgICBXZWIgc2VydmljZXMuDQotDQotICAgICAgPGgzPlVzaW5nIHRoZSBjYWxsYmFjayBhc3luY2hyb25vdXMgaW52b2NhdGlvbiBtb2RlbDwvaDM+VG8NCi0gICAgICBpbXBsZW1lbnQgYW4gYXN5bmNocm9ub3VzIGludm9jYXRpb24gdGhhdCB1c2VzIHRoZSBjYWxsYmFjaw0KLSAgICAgIG1vZGVsLCB0aGUgY2xpZW50IHByb3ZpZGVzIGFuIDxjb2RlPkFzeW5jaEhhbmRsZXI8L2NvZGU+DQotICAgICAgY2FsbGJhY2sgaGFuZGxlciB0byBhY2NlcHQgYW5kIHByb2Nlc3MgdGhlIGluYm91bmQgcmVzcG9uc2UNCi0gICAgICBvYmplY3QuIFRoZSBjbGllbnQgY2FsbGJhY2sgaGFuZGxlciBpbXBsZW1lbnRzIHRoZQ0KLSAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5Bc3luY2hIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UsIHdoaWNoDQotICAgICAgY29udGFpbnMgdGhlIGFwcGxpY2F0aW9uIGNvZGUgdGhhdCBpcyBleGVjdXRlZCB3aGVuIGFuDQotICAgICAgYXN5bmNocm9ub3VzIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4gVGhlDQotICAgICAgPGNvZGU+amF2YXgueG1sLndzLkFzeW5jaEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSBjb250YWlucw0KLSAgICAgIHRoZSA8Y29kZT5oYW5kbGVSZXNwb25zZShqYXZhLnhtbC53cy5SZXNwb25zZSk8L2NvZGU+IG1ldGhvZA0KLSAgICAgIHRoYXQgaXMgY2FsbGVkIGFmdGVyIHRoZSBydW4gdGltZSBoYXMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZA0KLSAgICAgIHRoZSBhc3luY2hyb25vdXMgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBUaGUgcmVzcG9uc2UgaXMNCi0gICAgICBkZWxpdmVyZWQgdG8gdGhlIGNhbGxiYWNrIGhhbmRsZXIgaW4gdGhlIGZvcm0gb2YgYQ0KLSAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5SZXNwb25zZTwvY29kZT4gb2JqZWN0LiBUaGUgcmVzcG9uc2UNCi0gICAgICBvYmplY3QgcmV0dXJucyB0aGUgcmVzcG9uc2UgY29udGVudCB3aGVuIHRoZQ0KLSAgICAgIDxjb2RlPmdldCgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLiBBZGRpdGlvbmFsbHksIGlmIGFuDQotICAgICAgZXJyb3Igd2FzIHJlY2VpdmVkLCB0aGVuIGFuIGV4Y2VwdGlvbiBpcyByZXR1cm5lZCB0byB0aGUNCi0gICAgICBjbGllbnQgZHVyaW5nIHRoYXQgY2FsbC4gVGhlIHJlc3BvbnNlIG1ldGhvZCBpcyB0aGVuIGludm9rZWQNCi0gICAgICBhY2NvcmRpbmcgdG8gdGhlIHRocmVhZGluZyBtb2RlbCB1c2VkIGJ5IHRoZSBleGVjdXRvciBtZXRob2QsDQotICAgICAgPGNvZGU+amF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I8L2NvZGU+IG9uIHRoZSBjbGllbnQncw0KLSAgICAgIDxjb2RlPmphdmEueG1sLndzLlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgdG8NCi0gICAgICBjcmVhdGUgdGhlIER5bmFtaWMgUHJveHkgb3IgRGlzcGF0Y2ggY2xpZW50IGluc3RhbmNlLiBUaGUNCi0gICAgICBleGVjdXRvciBpcyB1c2VkIHRvIGludm9rZSBhbnkgYXN5bmNocm9ub3VzIGNhbGxiYWNrcw0KLSAgICAgIHJlZ2lzdGVyZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBVc2UgdGhlDQotICAgICAgPGNvZGU+c2V0RXhlY3V0b3I8L2NvZGU+IGFuZCA8Y29kZT5nZXRFeGVjdXRvcjwvY29kZT4gbWV0aG9kcw0KLSAgICAgIHRvIG1vZGlmeSBhbmQgcmV0cmlldmUgdGhlIGV4ZWN1dG9yIGNvbmZpZ3VyZWQgZm9yIHlvdXINCi0gICAgICBzZXJ2aWNlLg0KLQ0KLSAgICAgIDxoMz5Vc2luZyB0aGUgcG9sbGluZyBhc3luY2hyb25vdXMgaW52b2NhdGlvbiBtb2RlbDwvaDM+VXNpbmcNCi0gICAgICB0aGUgcG9sbGluZyBtb2RlbCwgYSBjbGllbnQgY2FuIGlzc3VlIGEgcmVxdWVzdCBhbmQgcmVjZWl2ZSBhDQotICAgICAgcmVzcG9uc2Ugb2JqZWN0IHRoYXQgY2FuIHN1YnNlcXVlbnRseSBiZSBwb2xsZWQgdG8gZGV0ZXJtaW5lDQotICAgICAgaWYgdGhlIHNlcnZlciBoYXMgcmVzcG9uZGVkLiBXaGVuIHRoZSBzZXJ2ZXIgcmVzcG9uZHMsIHRoZQ0KLSAgICAgIGFjdHVhbCByZXNwb25zZSBjYW4gdGhlbiBiZSByZXRyaWV2ZWQuIFRoZSByZXNwb25zZSBvYmplY3QNCi0gICAgICByZXR1cm5zIHRoZSByZXNwb25zZSBjb250ZW50IHdoZW4gdGhlIDxjb2RlPmdldCgpPC9jb2RlPg0KLSAgICAgIG1ldGhvZCBpcyBjYWxsZWQuIFRoZSBjbGllbnQgcmVjZWl2ZXMgYW4gb2JqZWN0IG9mIHR5cGUNCi0gICAgICA8Y29kZT5qYXZheC54bWwud3MuUmVzcG9uc2U8L2NvZGU+IGZyb20gdGhlDQotICAgICAgPGNvZGU+aW52b2tlQXN5bmM8L2NvZGU+IG1ldGhvZC4gVGhhdCA8Y29kZT5SZXNwb25zZTwvY29kZT4NCi0gICAgICBvYmplY3QgaXMgdXNlZCB0byBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3QgdG8gdGhlDQotICAgICAgc2VydmVyLCBkZXRlcm1pbmUgd2hlbiB0aGUgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQsIGFuZCB0bw0KLSAgICAgIHJldHJpZXZlIHRoZSByZXNwb25zZSByZXN1bHRzLg0KLQ0KLSAgICAgIDxoMz5Vc2luZyBhbiBhc3luY2hyb25vdXMgbWVzc2FnZSBleGNoYW5nZTwvaDM+QnkgZGVmYXVsdCwNCi0gICAgICBhc3luY2hyb25vdXMgY2xpZW50IGludm9jYXRpb25zIGRvIG5vdCBoYXZlIGFzeW5jaHJvbm91cw0KLSAgICAgIGJlaGF2aW9yIG9mIHRoZSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gb24gdGhlIHdpcmUuIFRoZQ0KLSAgICAgIHByb2dyYW1taW5nIG1vZGVsIGlzIGFzeW5jaHJvbm91czsgaG93ZXZlciwgdGhlIGV4Y2hhbmdlIG9mDQotICAgICAgcmVxdWVzdCBvciByZXNwb25zZSBtZXNzYWdlcyB3aXRoIHRoZSBzZXJ2ZXIgaXMgbm90DQotICAgICAgYXN5bmNocm9ub3VzLiBUbyB1c2UgYW4gYXN5bmNocm9ub3VzIG1lc3NhZ2UgZXhjaGFuZ2UsIHRoZQ0KLSAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXNlLmFzeW5jLm1lcCBwcm9wZXJ0eSBtdXN0IGJlIHNldCBvbg0KLSAgICAgIHRoZSBjbGllbnQgcmVxdWVzdCBjb250ZXh0IHdpdGggYSBib29sZWFuIHZhbHVlIG9mIHRydWUuIFdoZW4NCi0gICAgICB0aGlzIHByb3BlcnR5IGlzIGVuYWJsZWQsIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYmV0d2VlbiB0aGUNCi0gICAgICBjbGllbnQgYW5kIHNlcnZlciBhcmUgZGlmZmVyZW50IGZyb20gbWVzc2FnZXMgZXhjaGFuZ2VkDQotICAgICAgc3luY2hyb25vdXNseS4gV2l0aCBhbiBhc3luY2hyb25vdXMgZXhjaGFuZ2UsIHRoZSByZXF1ZXN0IGFuZA0KLSAgICAgIHJlc3BvbnNlIG1lc3NhZ2VzIGhhdmUgV1MtQWRkcmVzc2luZyBoZWFkZXJzIGFkZGVkIHRoYXQNCi0gICAgICBwcm92aWRlIGFkZGl0aW9uYWwgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG1lc3NhZ2VzLg0KLSAgICAgIEFub3RoZXIgbWFqb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIGFzeW5jaHJvbm91cyBhbmQgc3luY2hyb25vdXMNCi0gICAgICBtZXNzYWdlIGV4Y2hhbmdlIGlzIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGRlbGl2ZXJlZCB0byBhbg0KLSAgICAgIGFzeW5jaHJvbm91cyBsaXN0ZW5lciB0aGF0IHRoZW4gZGVsaXZlcnMgdGhhdCByZXNwb25zZSBiYWNrDQotICAgICAgdG8gdGhlIGNsaWVudC4gRm9yIGFzeW5jaHJvbm91cyBleGNoYW5nZXMsIHRoZXJlIGlzIG5vDQotICAgICAgdGltZW91dCB0aGF0IGlzIHNlbnQgdG8gbm90aWZ5IHRoZSBjbGllbnQgdG8gc3RvcCBsaXN0ZW5pbmcNCi0gICAgICBmb3IgYSByZXNwb25zZS4gVG8gZm9yY2UgdGhlIGNsaWVudCB0byBzdG9wIHdhaXRpbmcgZm9yIGENCi0gICAgICByZXNwb25zZSwgaXNzdWUgYSA8Y29kZT5SZXNwb25zZS5jYW5jZWwoKTwvY29kZT4gbWV0aG9kIG9uDQotICAgICAgdGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIGEgcG9sbGluZyBpbnZvY2F0aW9uIG9yIGENCi0gICAgICA8Y29kZT5GdXR1cmUuY2FuY2VsKCk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgb2JqZWN0IHJldHVybmVkDQotICAgICAgZnJvbSBhIGNhbGxiYWNrIGludm9jYXRpb24uIFRoZSBjYW5jZWwgcmVzcG9uc2UgZG9lcyBub3QNCi0gICAgICBhZmZlY3QgdGhlIHNlcnZlciB3aGVuIHByb2Nlc3NpbmcgYSByZXF1ZXN0LjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gaW52b2tlIGEgV2ViIHNlcnZpY2UgYXN5bmNocm9ub3VzbHkNCi0gICAgICBhcmU6DQotDQotICAgICAgPG9sPg0KLSAgICAgICAgPGxpPkRldGVybWluZSBpZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrIG1ldGhvZA0KLSAgICAgICAgb3IgdGhlIHBvbGxpbmcgbWV0aG9kIGZvciB0aGUgY2xpZW50IHRvIGFzeW5jaHJvbm91c2x5DQotICAgICAgICBpbnZva2UgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+DQotDQotICAgICAgICA8bGk+KE9wdGlvbmFsKSBDb25maWd1cmUgdGhlIGNsaWVudCByZXF1ZXN0IGNvbnRleHQuIEFkZA0KLSAgICAgICAgdGhlPGJyIC8+DQotICAgICAgICAgIDxiciAvPg0KLSAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXA8L2NvZGU+PGJyIC8+DQotICAgICAgICAgIDxiciAvPg0KLSAgICAgICAgICBwcm9wZXJ0eSB0byB0aGUgcmVxdWVzdCBjb250ZXh0IHRvIGVuYWJsZSBhc3luY2hyb25vdXMNCi0gICAgICAgICAgbWVzc2FnaW5nIGZvciB0aGUgV2ViIHNlcnZpY2VzIGNsaWVudC4gVXNpbmcgdGhpcw0KLSAgICAgICAgICBwcm9wZXJ0eSByZXF1aXJlcyB0aGF0IHRoZSBzZXJ2aWNlIGVuZHBvaW50IHN1cHBvcnRzDQotICAgICAgICAgIFdTLUFkZHJlc3Npbmcgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQgZm9yIHRoZQ0KLSAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXIuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMNCi0gICAgICAgICAgaG93IHRvIHNldCB0aGlzIHByb3BlcnR5Og0KLSAgICAgICAgICA8cHJlPg0KLSAgICAgICAgICAgTWFwJmx0O1N0cmluZywgT2JqZWN0Jmd0OyByYyA9ICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0KS5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgICAgcmMucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXAiLCBCb29sZWFuLlRSVUUpOw0KLTwvcHJlPg0KLSAgICAgICAgPC9saT4NCi0NCi0gICAgICAgIDxsaT5UbyBpbXBsZW1lbnQgdGhlIGFzeW5jaHJvbm91cyBjYWxsYmFjayBtZXRob2QsIHBlcmZvcm0NCi0gICAgICAgIHRoZSBmb2xsb3dpbmcgc3RlcHMuDQotDQotICAgICAgICAgIDxvbD4NCi0gICAgICAgICAgICA8bGk+RmluZCB0aGUgYXN5bmNocm9ub3VzIGNhbGxiYWNrIG1ldGhvZCBvbiB0aGUgU0VJIG9yDQotICAgICAgICAgICAgPGNvZGU+amF2YXgueG1sLndzLkRpc3BhdGNoPC9jb2RlPiBpbnRlcmZhY2UuIEZvciBhbg0KLSAgICAgICAgICAgIFNFSSwgdGhlIG1ldGhvZCBuYW1lIGVuZHMgaW4gPGNvZGU+QXN5bmM8L2NvZGU+IGFuZCBoYXMNCi0gICAgICAgICAgICBvbmUgbW9yZSBwYXJhbWV0ZXIgdGhhbiB0aGUgc3luY2hyb25vdXMgbWV0aG9kIG9mIHR5cGUNCi0gICAgICAgICAgICA8Y29kZT5qYXZheC54bWwud3MuQXN5bmNIYW5kbGVyPC9jb2RlPi4gVGhlDQotICAgICAgICAgICAgPGNvZGU+aW52b2tlQXN5bmMoT2JqZWN0LCBBc3luY0hhbmRsZXIpPC9jb2RlPiBtZXRob2QNCi0gICAgICAgICAgICBpcyB0aGUgb25lIHRoYXQgaXMgdXNlZCBvbiB0aGUgRGlzcGF0Y2ggaW50ZXJmYWNlLjwvbGk+DQotDQotICAgICAgICAgICAgPGxpPihPcHRpb25hbCkgQWRkIHRoZSA8Y29kZT5zZXJ2aWNlLnNldEV4ZWN1dG9yPC9jb2RlPg0KLSAgICAgICAgICAgIG1ldGhvZHMgdG8gdGhlIGNsaWVudCBhcHBsaWNhdGlvbi4gQWRkaW5nIHRoZSBleGVjdXRvcg0KLSAgICAgICAgICAgIG1ldGhvZHMgZ2l2ZXMgdGhlIGNsaWVudCBjb250cm9sIG9mIHRoZSBzY2hlZHVsaW5nDQotICAgICAgICAgICAgbWV0aG9kcyBmb3IgcHJvY2Vzc2luZyB0aGUgcmVzcG9uc2UuIFlvdSBjYW4gYWxzbw0KLSAgICAgICAgICAgIGNob29zZSB0byB1c2UgdGhlIDxjb2RlPmphdmEuY3VycmVudC5FeGVjdXRvcnM8L2NvZGU+DQotICAgICAgICAgICAgY2xhc3MgZmFjdG9yeSB0byBvYnRhaW4gcGFja2FnZWQgZXhlY3V0b3JzIG9yIGltcGxlbWVudA0KLSAgICAgICAgICAgIHlvdXIgb3duIGV4ZWN1dG9yIGNsYXNzLiBTZWUgdGhlIEpBWC1XUyBzcGVjaWZpY2F0aW9uDQotICAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgZXhlY3V0b3IgY2xhc3MgbWV0aG9kcw0KLSAgICAgICAgICAgIHdpdGggeW91ciBjbGllbnQuPC9saT4NCi0NCi0gICAgICAgICAgICA8bGk+SW1wbGVtZW50IHRoZQ0KLSAgICAgICAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5Bc3luY2hIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UuIFRoZQ0KLSAgICAgICAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5Bc3luY2hIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2Ugb25seQ0KLSAgICAgICAgICAgIGhhcyB0aGUNCi0gICAgICAgICAgICA8Y29kZT5oYW5kbGVSZXNwb25zZShqYXZheC54bWwud3MuUmVzcG9uc2UpPC9jb2RlPg0KLSAgICAgICAgICAgIG1ldGhvZC4gVGhlIG1ldGhvZCBtdXN0IGNvbnRhaW4gdGhlIGxvZ2ljIGZvcg0KLSAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIHJlc3BvbnNlIG9yIHBvc3NpYmx5IGFuIGV4Y2VwdGlvbi4gVGhlDQotICAgICAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgY2xpZW50IHJ1biB0aW1lIGhhcyByZWNlaXZlZA0KLSAgICAgICAgICAgIGFuZCBwcm9jZXNzZWQgdGhlIGFzeW5jaHJvbm91cyByZXNwb25zZSBmcm9tIHRoZQ0KLSAgICAgICAgICAgIHNlcnZlci48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaT5JbnZva2UgdGhlIGFzeW5jaHJvbm91cyBjYWxsYmFjayBtZXRob2Qgd2l0aCB0aGUNCi0gICAgICAgICAgICBwYXJhbWV0ZXIgZGF0YSBhbmQgdGhlIGNhbGxiYWNrIGhhbmRsZXIuPC9saT4NCi0NCi0gICAgICAgICAgICA8bGk+VGhlIDxjb2RlPmhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlKTwvY29kZT4gbWV0aG9kIGlzDQotICAgICAgICAgICAgaW52b2tlZCBvbiB0aGUgY2FsbGJhY2sgb2JqZWN0IHdoZW4gdGhlIHJlc3BvbnNlIGlzDQotICAgICAgICAgICAgYXZhaWxhYmxlLiBUaGUgPGNvZGU+UmVzcG9uc2UuZ2V0KCk8L2NvZGU+IG1ldGhvZCBpcw0KLSAgICAgICAgICAgIGNhbGxlZCB3aXRoaW4gdGhpcyBtZXRob2QgdG8gZGVsaXZlciB0aGUgcmVzcG9uc2UuPC9saT4NCi0gICAgICAgICAgPC9vbD4NCi0gICAgICAgIDwvbGk+DQotDQotICAgICAgICA8bGk+VG8gaW1wbGVtZW50IHRoZSBwb2xsaW5nIG1ldGhvZCwNCi0NCi0gICAgICAgICAgPG9sPg0KLSAgICAgICAgICAgIDxsaT5GaW5kIHRoZSBhc3luY2hyb25vdXMgcG9sbGluZyBtZXRob2Qgb24gdGhlIFNFSSBvcg0KLSAgICAgICAgICAgIDxjb2RlPmphdmF4LnhtbC53cy5EaXNwYXRjaDwvY29kZT4gaW50ZXJmYWNlLiBGb3IgYW4NCi0gICAgICAgICAgICBTRUksIHRoZSBtZXRob2QgbmFtZSBlbmRzIGluIDxjb2RlPkFzeW5jPC9jb2RlPiBhbmQgaGFzDQotICAgICAgICAgICAgYSByZXR1cm4gdHlwZSBvZiA8Y29kZT5qYXZheC54bWwud3MuUmVzcG9uc2U8L2NvZGU+Lg0KLSAgICAgICAgICAgIFRoZSA8Y29kZT5pbnZva2VBc3luYyhPYmplY3QpPC9jb2RlPiBtZXRob2QgaXMgdXNlZCBvbg0KLSAgICAgICAgICAgIHRoZSBEaXNwYXRjaCBpbnRlcmZhY2UuPC9saT4NCi0NCi0gICAgICAgICAgICA8bGk+SW52b2tlIHRoZSBhc3luY2hyb25vdXMgcG9sbGluZyBtZXRob2Qgd2l0aCB0aGUNCi0gICAgICAgICAgICBwYXJhbWV0ZXIgZGF0YS48L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaT5UaGUgY2xpZW50IHJlY2VpdmVzIHRoZSBvYmplY3QgdHlwZSwNCi0gICAgICAgICAgICA8Y29kZT5qYXZheC54bWwud3MuUmVzcG9uc2U8L2NvZGU+LCB0aGF0IGlzIHVzZWQgdG8NCi0gICAgICAgICAgICBtb25pdG9yIHRoZSBzdGF0dXMgb2YgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4gVGhlDQotICAgICAgICAgICAgPGNvZGU+aXNEb25lKCk8L2NvZGU+IG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciB0aGUNCi0gICAgICAgICAgICBpbnZvY2F0aW9uIGhhcyBjb21wbGV0ZWQuIFdoZW4gdGhlDQotICAgICAgICAgICAgPGNvZGU+aXNEb25lKCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgb2YgdHJ1ZSwNCi0gICAgICAgICAgICBjYWxsIHRoZSA8Y29kZT5nZXQoKTwvY29kZT4gbWV0aG9kIHRvIHJldHJpZXZlIHRoZQ0KLSAgICAgICAgICAgIHJlc3BvbnNlIG9iamVjdC48L2xpPg0KLSAgICAgICAgICA8L29sPg0KLSAgICAgICAgPC9saT4NCi0NCi0gICAgICAgIDxsaT5Vc2UgdGhlIDxjb2RlPmNhbmNlbCgpPC9jb2RlPiBtZXRob2QgZm9yIHRoZSBjYWxsYmFjaw0KLSAgICAgICAgb3IgcG9sbGluZyBtZXRob2QgaWYgdGhlIGNsaWVudCBuZWVkcyB0byBzdG9wIHdhaXRpbmcgZm9yIGENCi0gICAgICAgIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UuIElmIHRoZSA8Y29kZT5jYW5jZWwoKTwvY29kZT4NCi0gICAgICAgIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBjbGllbnQsIHRoZSBlbmRwb2ludCBjb250aW51ZXMgdG8NCi0gICAgICAgIHByb2Nlc3MgdGhlIHJlcXVlc3QuIEhvd2V2ZXIsIHRoZSB3YWl0IGFuZCByZXNwb25zZQ0KLSAgICAgICAgcHJvY2Vzc2luZyBmb3IgdGhlIGNsaWVudCBpcyBzdG9wcGVkLjwvbGk+DQotICAgICAgPC9vbD48YnIgLz4NCi0gICAgICBXaGVuIGRldmVsb3BpbmcgRHluYW1pYyBQcm94eSBjbGllbnRzLCBhZnRlciB5b3UgZ2VuZXJhdGUgdGhlDQotICAgICAgcG9ydGFibGUgY2xpZW50IGFydGlmYWN0cyBmcm9tIGEgV1NETCBmaWxlIHVzaW5nIHRoZQ0KLSAgICAgIDxiPndzaW1wb3J0PC9iPiBjb21tYW5kLCB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgZW5kcG9pbnQNCi0gICAgICBpbnRlcmZhY2UgKFNFSSkgZG9lcyBub3QgaGF2ZSBhc3luY2hyb25vdXMgbWV0aG9kcyBpbmNsdWRlZA0KLSAgICAgIGluIHRoZSBpbnRlcmZhY2UuIFVzZSBKQVgtV1MgYmluZGluZ3MgdG8gYWRkIHRoZSBhc3luY2hyb25vdXMNCi0gICAgICBjYWxsYmFjayBvciBwb2xsaW5nIG1ldGhvZHMgb24gdGhlIGludGVyZmFjZSBmb3IgdGhlIER5bmFtaWMNCi0gICAgICBQcm94eSBjbGllbnQuIFRvIGVuYWJsZSBhc3luY2hyb25vdXMgbWFwcGluZ3MsIHlvdSBjYW4gYWRkDQotICAgICAgdGhlIDxjb2RlPmpheHdzOmVuYWJsZUFzeW5jTWFwcGluZzwvY29kZT4gYmluZGluZyBkZWNsYXJhdGlvbg0KLSAgICAgIHRvIHRoZSBXU0RMIGZpbGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGFkZGluZyBiaW5kaW5nDQotICAgICAgY3VzdG9taXphdGlvbnMgdG8gZ2VuZXJhdGUgYW4gYXN5bmNocm9ub3VzIGludGVyZmFjZSwgc2VlDQotICAgICAgY2hhcHRlciA4IG9mIHRoZSBKQVgtV1Mgc3BlY2lmaWNhdGlvbi48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBOb3RlOiBXaGVuIHlvdSBydW4gdGhlIDxiPndzaW1wb3J0PC9iPiB0b29sIGFuZCBlbmFibGUNCi0gICAgICBhc3luY2hyb25vdXMgaW52b2NhdGlvbiB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIEpBWC1XUw0KLSAgICAgIDxjb2RlPmVuYWJsZUFzeW5jTWFwcGluZzwvY29kZT4gYmluZGluZyBkZWNsYXJhdGlvbiwgZW5zdXJlDQotICAgICAgdGhhdCB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZSBtZXNzYWdlIHlvdXIgV1NETCBmaWxlIGRvZXMNCi0gICAgICBub3QgY29udGFpbiBwYXJ0cy4gV2hlbiBhIHJlc3BvbnNlIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbg0KLSAgICAgIHBhcnRzLCB0aGUgcmVxdWVzdCBhY3RzIGFzIGEgdHdvLXdheSByZXF1ZXN0LCBidXQgdGhlIGFjdHVhbA0KLSAgICAgIHJlc3BvbnNlIHRoYXQgaXMgc2VudCBiYWNrIGlzIGVtcHR5LiBUaGUgPGI+d3NpbXBvcnQ8L2I+IHRvb2wNCi0gICAgICBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGEgdm9pZCByZXNwb25zZS4gVG8gYXZvaWQgdGhpcw0KLSAgICAgIHNjZW5hcmlvLCB5b3UgY2FuIHJlbW92ZSB0aGUgb3V0cHV0IG1lc3NhZ2UgZnJvbSB0aGUNCi0gICAgICBvcGVyYXRpb24gd2hpY2ggbWFrZXMgeW91ciBvcGVyYXRpb24gYSBvbmUtd2F5IG9wZXJhdGlvbiBvcg0KLSAgICAgIHlvdSBjYW4gYWRkIGEgJmx0O3dzZGw6cGFydCZndDsgdG8geW91ciBtZXNzYWdlLiBGb3IgbW9yZQ0KLSAgICAgIGluZm9ybWF0aW9uIG9uIHRoZSB1c2FnZSwgc3ludGF4IGFuZCBwYXJhbWV0ZXJzIGZvciB0aGUNCi0gICAgICA8Yj53c2ltcG9ydDwvYj4gdG9vbCwgc2VlIHRoZSA8Yj53c2ltcG9ydDwvYj4gY29tbWFuZCBmb3INCi0gICAgICBKQVgtV1MgYXBwbGljYXRpb25zIGRvY3VtZW50YXRpb24uPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgV2ViIHNlcnZpY2UgaW50ZXJmYWNlDQotICAgICAgd2l0aCBtZXRob2RzIGZvciBhc3luY2hyb25vdXMgcmVxdWVzdHMgZnJvbSB0aGUgY2xpZW50Lg0KLSAgICAgIDxwcmU+DQotICAgQFdlYlNlcnZpY2UNCi0NCi0gICBwdWJsaWMgaW50ZXJmYWNlIENyZWRpdFJhdGluZ1NlcnZpY2Ugew0KLSAgICAgICAgICAvLyBTeW5jaHJvbm91cyBvcGVyYXRpb24uDQotICAgICAgICAgIFNjb3JlIGdldENyZWRpdFNjb3JlKEN1c3RvbWVyICAgICBjdXN0b21lcik7DQotICAgICAgICAgIC8vIEFzeW5jaHJvbm91cyBvcGVyYXRpb24gd2l0aCBwb2xsaW5nLg0KLSAgICAgICAgICA8Yj5SZXNwb25zZSZsdDtTY29yZSZndDs8L2I+IGdldENyZWRpdFNjb3JlQXN5bmMoQ3VzdG9tZXIgY3VzdG9tZXIpOw0KLSAgICAgICAgICAvLyBBc3luY2hyb25vdXMgb3BlcmF0aW9uIHdpdGggY2FsbGJhY2suDQotICAgICAgICAgIDxiPkZ1dHVyZSZsdDs/Jmd0OzwvYj4gZ2V0UXVvdGVBc3luYyhDdXN0b21lciBjdXN0b21lciwgDQotICAgICAgICAgICAgICAgICA8Yj5Bc3luY0hhbmRsZXImbHQ7U2NvcmUmZ3Q7PC9iPiBoYW5kbGVyKTsNCi0gICB9DQotPC9wcmU+VXNpbmcgdGhlIGNhbGxiYWNrIG1ldGhvZCBUaGUgY2FsbGJhY2sgbWV0aG9kIHJlcXVpcmVzIGENCi1jYWxsYmFjayBoYW5kbGVyIHRoYXQgaXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLiBXaGVuIHVzaW5nDQotdGhlIGNhbGxiYWNrIHByb2NlZHVyZSwgYWZ0ZXIgYSByZXF1ZXN0IGlzIG1hZGUsIHRoZSBjYWxsYmFjaw0KLWhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSByZXNwb25zZS4gVGhlIHJlc3BvbnNlDQotdmFsdWUgaXMgYSByZXNwb25zZSBvciBwb3NzaWJseSBhbiBleGNlcHRpb24uIFRoZQ0KLTxjb2RlPkZ1dHVyZSZsdDs/Jmd0OzwvY29kZT4gbWV0aG9kIHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhbg0KLWFzeW5jaHJvbm91cyBjb21wdXRhdGlvbiBhbmQgaXMgY2hlY2tlZCB0byBzZWUgaWYgdGhlIGNvbXB1dGF0aW9uDQotaXMgY29tcGxldGUuIFdoZW4geW91IHdhbnQgdGhlIGFwcGxpY2F0aW9uIHRvIGZpbmQgb3V0IGlmIHRoZQ0KLXJlcXVlc3QgaXMgY29tcGxldGVkLCBpbnZva2UgdGhlIDxjb2RlPkZ1dHVyZS5pc0RvbmUoKTwvY29kZT4NCi1tZXRob2QuIE5vdGUgdGhhdCB0aGUgPGNvZGU+RnV0dXJlLmdldCgpPC9jb2RlPiBtZXRob2QgZG9lcyBub3QNCi1wcm92aWRlIGEgbWVhbmluZ2Z1bCByZXNwb25zZSBhbmQgaXMgbm90IHNpbWlsYXIgdG8gdGhlIDxjb2RlPg0KLSAgICAgIFJlc3BvbnNlLmdldCgpPC9jb2RlPiBtZXRob2QuDQotICAgICAgPHByZT4NCi0gICBDcmVkaXRSYXRpbmdTZXJ2aWNlIHN2YyA9IC4uLjsNCi0gDQotICAgPGI+RnV0dXJlJmx0Oz8mZ3Q7PC9iPiBpbnZvY2F0aW9uID0gc3ZjLmdldENyZWRpdFNjb3JlQXN5bmMoY3VzdG9tZXJUb20sDQotICAgICAgICAgIDxiPm5ldyBBc3luY0hhbmRsZXImbHQ7U2NvcmUmZ3Q7KCkgew0KLSAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UgKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlJmx0O1Njb3JlJmd0OyByZXNwb25zZSkNCi0gICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgPSByZXNwb25zZS5nZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHRoZSByZXF1ZXN0Li4uDQotICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICB9PC9iPg0KLSAgKTsNCi08L3ByZT5Vc2luZyB0aGUgcG9sbGluZyBtZXRob2QgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGFuDQotYXN5bmNocm9ub3VzIHBvbGxpbmcgY2xpZW50Og0KLSAgICAgIDxwcmU+DQotICAgQ3JlZGl0UmF0aW5nU2VydmljZSBzdmMgPSAuLi47DQotICAgPGI+UmVzcG9uc2UmbHQ7U2NvcmUmZ3Q7IHJlc3BvbnNlPC9iPiA9IHN2Yy5nZXRDcmVkaXRTY29yZUFzeW5jKGN1c3RvbWVyVG9tKTsNCi0gDQotICAgd2hpbGUgKDxiPiFyZXNwb25zZS5pc0RvbmUoKTwvYj4pIHsNCi0gICAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdoaWxlIHdlIHdhaXQuDQotICAgfQ0KLSANCi0NCi0gICBzY29yZSA9IDxiPnJlc3BvbnNlLmdldCgpPC9iPjsNCi08L3ByZT4NCi0NCi0gICAgICA8aDI+PGEgbmFtZT0iSGFuZGxlcnMiIGlkPSJIYW5kbGVycyI+VXNpbmcgaGFuZGxlcnMgaW4gSkFYLVdTDQotICAgICAgV2ViIHNlcnZpY2VzPC9hPjwvaDI+QXMgaW4gdGhlIEphdmEgQVBJIGZvciBYTUwtYmFzZWQgUlBDDQotICAgICAgKEpBWC1SUEMpIHByb2dyYW1taW5nIG1vZGVsLCB0aGUgSkFYLVdTIHByb2dyYW1taW5nIG1vZGVsDQotICAgICAgcHJvdmlkZXMgYW4gYXBwbGljYXRpb24gaGFuZGxlciBmYWNpbGl0eSB0aGF0IGVuYWJsZXMgeW91IHRvDQotICAgICAgbWFuaXB1bGF0ZSBhIG1lc3NhZ2Ugb24gZWl0aGVyIGFuIGluYm91bmQgb3IgYW4gb3V0Ym91bmQNCi0gICAgICBmbG93LiBZb3UgY2FuIGFkZCBoYW5kbGVycyBpbnRvIHRoZSBKQVgtV1MgcnVudGltZQ0KLSAgICAgIGVudmlyb25tZW50IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG9mIHJlcXVlc3QgYW5kDQotICAgICAgcmVzcG9uc2UgbWVzc2FnZXMuIFlvdSBjYW4gdXNlIGhhbmRsZXJzIGZvciBhIHZhcmlldHkgb2YNCi0gICAgICBwdXJwb3NlcyBzdWNoIGFzIGNhcHR1cmluZyBhbmQgbG9nZ2luZyBpbmZvcm1hdGlvbiBhbmQgYWRkaW5nDQotICAgICAgc2VjdXJpdHkgb3Igb3RoZXIgaW5mb3JtYXRpb24gdG8gYSBtZXNzYWdlLiBCZWNhdXNlIG9mIHRoZQ0KLSAgICAgIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgcHJvdG9jb2xzIGJleW9uZCBTT0FQLCBKQVgtV1MgcHJvdmlkZXMNCi0gICAgICB0d28gZGlmZmVyZW50IGNsYXNzaWZpY2F0aW9ucyBmb3IgaGFuZGxlcnMuIE9uZSB0eXBlIG9mDQotICAgICAgaGFuZGxlciBpcyBhIGxvZ2ljYWwgaGFuZGxlciB0aGF0IGlzIHByb3RvY29sIGluZGVwZW5kZW50IGFuZA0KLSAgICAgIGNhbiBvYnRhaW4gdGhlIG1lc3NhZ2UgaW4gdGhlIGZsb3cgYXMgYW4gZXh0ZW5zaWJsZSBtYXJrdXANCi0gICAgICBsYW5ndWFnZSAoWE1MKSBtZXNzYWdlLiBUaGUgbG9naWNhbCBoYW5kbGVycyBvcGVyYXRlIG9uDQotICAgICAgbWVzc2FnZSBjb250ZXh0IHByb3BlcnRpZXMgYW5kIG1lc3NhZ2UgcGF5bG9hZC4gVGhlc2UNCi0gICAgICBoYW5kbGVycyBtdXN0IGltcGxlbWVudCB0aGUNCi0gICAgICA8Y29kZT5qYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLiBBDQotICAgICAgbG9naWNhbCBoYW5kbGVyIHJlY2VpdmVzIGEgPGNvZGU+TG9naWNhbE1lc3NhZ2VDb250ZXh0PC9jb2RlPg0KLSAgICAgIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBoYW5kbGVyIGNhbiBnZXQgdGhlIG1lc3NhZ2UNCi0gICAgICBpbmZvcm1hdGlvbi4gTG9naWNhbCBoYW5kbGVycyBjYW4gZXhpc3Qgb24gYm90aCBTT0FQIGFuZA0KLSAgICAgIFhNTC9IVFRQLWJhc2VkIGNvbmZpZ3VyYXRpb25zLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRoZSBzZWNvbmQgdHlwZSBvZiBoYW5kbGVyIGlzIGEgcHJvdG9jb2wgaGFuZGxlci4gVGhlDQotICAgICAgcHJvdG9jb2wgaGFuZGxlcnMgb3BlcmF0ZSBvbiBtZXNzYWdlIGNvbnRleHQgcHJvcGVydGllcyBhbmQNCi0gICAgICBwcm90b2NvbC1zcGVjaWZpYyBtZXNzYWdlcy4gUHJvdG9jb2wgaGFuZGxlcnMgYXJlIGxpbWl0ZWQgdG8NCi0gICAgICBTT0FQLWJhc2VkIGNvbmZpZ3VyYXRpb25zIGFuZCBtdXN0IGltcGxlbWVudCB0aGUNCi0gICAgICA8Y29kZT5qYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UuDQotICAgICAgUHJvdG9jb2wgaGFuZGxlcnMgcmVjZWl2ZSB0aGUgbWVzc2FnZSBhcyBhDQotICAgICAgPGNvZGU+amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U8L2NvZGU+IHRvIHJlYWQgdGhlIG1lc3NhZ2UNCi0gICAgICBkYXRhLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRoZSBKQVgtV1MgcnVudGltZSBtYWtlcyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHNlcnZlci1zaWRlDQotICAgICAgYW5kIGNsaWVudC1zaWRlIGhhbmRsZXIgY2xhc3Nlcy4gVGhlIHJ1bnRpbWUgZG9lcyBub3QNCi0gICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIGluYm91bmQgb3Igb3V0Ym91bmQgZmxvdyB3aGVuIGENCi0gICAgICA8Y29kZT5oYW5kbGVNZXNzYWdlKE1lc3NhZ2VDb250ZXh0KTwvY29kZT4gbWV0aG9kIG9yDQotICAgICAgPGNvZGU+aGFuZGxlRmF1bHQoTWVzc2FnZUNvbnRleHQpPC9jb2RlPiBtZXRob2QgZm9yIGENCi0gICAgICBzcGVjaWZpYyBoYW5kbGVyIGlzIGludm9rZWQuIFlvdSBtdXN0IGNvbmZpZ3VyZSB0aGUgaGFuZGxlcnMNCi0gICAgICBmb3IgdGhlIHNlcnZlciBvciBjbGllbnQsIGFuZCBpbXBsZW1lbnQgc3VmZmljaWVudCBsb2dpYw0KLSAgICAgIHdpdGhpbiB0aGVzZSBtZXRob2RzIHRvIGRldGVjdCB0aGUgaW5ib3VuZCBvciBvdXRib3VuZA0KLSAgICAgIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudCBtZXNzYWdlLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRvIHVzZSBoYW5kbGVycyB3aXRoIFdlYiBzZXJ2aWNlcyBjbGllbnQgYXBwbGljYXRpb25zLCB5b3UNCi0gICAgICBtdXN0IGFkZCB0aGUgPGNvZGU+QEhhbmRsZXJDaGFpbjwvY29kZT4gYW5ub3RhdGlvbiB0byB0aGUNCi0gICAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBvciB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xhc3MgYW5kDQotICAgICAgcHJvdmlkZSB0aGUgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGZpbGUuIFRoZQ0KLSAgICAgIDxjb2RlPkBIYW5kbGVyQ2hhaW48L2NvZGU+IGFubm90YXRpb24gY29udGFpbnMgYSBmaWxlDQotICAgICAgYXR0cmlidXRlIHRoYXQgcG9pbnRzIHRvIGEgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGZpbGUNCi0gICAgICB0aGF0IHlvdSBjcmVhdGUuIEZvciBXZWIgc2VydmljZXMgY2xpZW50IGFwcGxpY2F0aW9ucywgeW91DQotICAgICAgY2FuIGFsc28gY29uZmlndXJlIHRoZSBoYW5kbGVyIGNoYWluIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcNCi0gICAgICB0aGUgQmluZGluZyBBUEkuIFRvIG1vZGlmeSB0aGUgPGNvZGU+aGFuZGxlcmNoYWluPC9jb2RlPg0KLSAgICAgIGNsYXNzIHByb2dyYW1tYXRpY2FsbHksIHVzZSBlaXRoZXIgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24NCi0gICAgICBvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUNCi0gICAgICA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+IG1ldGhvZC48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBUbyB1c2UgaGFuZGxlcnMgd2l0aCB5b3VyIHNlcnZlciBhcHBsaWNhdGlvbiwgeW91IG11c3Qgc2V0DQotICAgICAgdGhlIDxjb2RlPkBIYW5kbGVyQ2hhaW48L2NvZGU+IGFubm90YXRpb24gb24gZWl0aGVyIHRoZQ0KLSAgICAgIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIG9yIHRoZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbg0KLSAgICAgIGNsYXNzLCBhbmQgcHJvdmlkZSB0aGUgYXNzb2NpYXRlZCBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24NCi0gICAgICBmaWxlLiBIYW5kbGVycyBmb3IgdGhlIHNlcnZlciBhcmUgb25seSBjb25maWd1cmVkIGJ5IHNldHRpbmcNCi0gICAgICB0aGUgPGNvZGU+QEhhbmRsZXJDaGFpbjwvY29kZT4gYW5ub3RhdGlvbiBvbiB0aGUgc2VydmljZQ0KLSAgICAgIGVuZHBvaW50IGltcGxlbWVudGF0aW9uIG9yIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gVGhlDQotICAgICAgaGFuZGxlciBjbGFzc2VzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGRlcGxveWVkDQotICAgICAgYXJ0aWZhY3QuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgRm9yIGJvdGggc2VydmVyIGFuZCBjbGllbnQgaW1wbGVtZW50YXRpb25zIG9mIGhhbmRsZXJzIHVzaW5nDQotICAgICAgdGhlIDxjb2RlPkBIYW5kbGVyQ2hhaW48L2NvZGU+IGFubm90YXRpb24sIHlvdSBtdXN0IHNwZWNpZnkNCi0gICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbiBhcyBlaXRoZXIgYQ0KLSAgICAgIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgYW5ub3RhdGVkIGZpbGUgb3IgYXMgYW4gYWJzb2x1dGUgVVJMLg0KLSAgICAgIEZvciBleGFtcGxlOjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIDxwcmU+DQotICAgQEhhbmRsZXJDaGFpbihmaWxlPSIuLi8uLi9jb21tb24vaGFuZGxlcnMvbXloYW5kbGVycy54bWwiKQ0KLTwvcHJlPm9yDQotICAgICAgPHByZT4NCi0gICBASGFuZGxlckNoYWluKGZpbGU9Imh0dHA6Ly9mb28uY29tL215aGFuZGxlcnMueG1sIikNCi08L3ByZT5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc2NoZW1hIG9mIHRoZSBoYW5kbGVyDQotY29uZmlndXJhdGlvbiBmaWxlLCBzZWUgdGhlIEpTUiAxODEgc3BlY2lmaWNhdGlvbi48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgSkFYLVdTIGhhbmRsZXJzLCBzZWUgY2hhcHRlciA5DQotICAgICAgb2YgdGhlIEpBWC1XUyBzcGVjaWZpY2F0aW9uLjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRvIGNyZWF0ZSBhIEpBWC1XUyBoYW5kbGVyOg0KLQ0KLSAgICAgIDxvbD4NCi0gICAgICAgIDxsaT5EZXRlcm1pbmUgaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IEpBWC1XUyBoYW5kbGVycyBvbg0KLSAgICAgICAgdGhlIHNlcnZpY2Ugb3IgdGhlIGNsaWVudC4NCi0NCi0gICAgICAgICAgPG9sPg0KLSAgICAgICAgICAgIDxsaT5Vc2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYSBoYW5kbGVyDQotICAgICAgICAgICAgcmVzb2x2ZXIuIFRoZSBydW50aW1lIG5vdyB1c2VzIHRoZQ0KLSAgICAgICAgICAgIDxjb2RlPkBIYW5kbGVyQ2hhaW48L2NvZGU+IGFubm90YXRpb24gYW5kIHRoZSBkZWZhdWx0DQotICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SGFuZGxlclJlc29sdmVyPC9jb2RlPiBjbGFzcyB0bw0KLSAgICAgICAgICAgIGJ1aWxkIHRoZSBoYW5kbGVyIGNoYWluLiBZb3UgY2FuIG9idGFpbiB0aGUgZXhpc3RpbmcNCi0gICAgICAgICAgICBoYW5kbGVyIGNoYWluIGZyb20gdGhlIDxjb2RlPkJpbmRpbmc8L2NvZGU+LCBhZGQgb3INCi0gICAgICAgICAgICByZW1vdmUgaGFuZGxlcnMsIGFuZCB0aGVuIHJldHVybiB0aGUgbW9kaWZpZWQgaGFuZGxlcg0KLSAgICAgICAgICAgIGNoYWluIHRvIHRoZSA8Y29kZT5CaW5kaW5nPC9jb2RlPiBvYmplY3QuPC9saT4NCi0NCi0gICAgICAgICAgICA8bGk+VG8gdXNlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIGEgaGFuZGxlcg0KLSAgICAgICAgICAgIHJlc29sdmVyLCBzZXQgdGhlIGN1c3RvbSA8Y29kZT5IYW5kbGVyUmVzb2x2ZXI8L2NvZGU+DQotICAgICAgICAgICAgY2xhc3Mgb24gdGhlIDxjb2RlPlNlcnZpY2U8L2NvZGU+IGluc3RhbmNlLiBUaGUgcnVudGltZQ0KLSAgICAgICAgICAgIHVzZXMgeW91ciBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlDQotICAgICAgICAgICAgPGNvZGU+SGFuZGxlclJlc29sdmVyPC9jb2RlPiBjbGFzcyB0byBidWlsZCB0aGUgaGFuZGxlcg0KLSAgICAgICAgICAgIGNoYWluLCBhbmQgdGhlIGRlZmF1bHQgcnVudGltZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QNCi0gICAgICAgICAgICB1c2VkLiBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgPGNvZGU+QEhhbmRsZXJDaGFpbjwvY29kZT4NCi0gICAgICAgICAgICBhbm5vdGF0aW9uIGlzIG5vdCByZWFkIHdoZW4gcmV0cmlldmluZyB0aGUgaGFuZGxlcg0KLSAgICAgICAgICAgIGNoYWluIGZyb20gdGhlIGJpbmRpbmcgYWZ0ZXIgdGhlIGN1c3RvbQ0KLSAgICAgICAgICAgIDxjb2RlPkhhbmRsZXJSZXNvbHZlcjwvY29kZT4gaW5zdGFuY2UgaXMgcmVnaXN0ZXJlZCBvbg0KLSAgICAgICAgICAgIHRoZSA8Y29kZT5TZXJ2aWNlPC9jb2RlPiBpbnN0YW5jZS4gWW91IGNhbiBvYnRhaW4gdGhlDQotICAgICAgICAgICAgZXhpc3RpbmcgaGFuZGxlciBjaGFpbiBmcm9tIHRoZSA8Y29kZT5CaW5kaW5nPC9jb2RlPiwNCi0gICAgICAgICAgICBhZGQgb3IgcmVtb3ZlIGhhbmRsZXJzLCBhbmQgdGhlbiByZXR1cm4gdGhlIG1vZGlmaWVkDQotICAgICAgICAgICAgaGFuZGxlciBjaGFpbiB0byB0aGUgPGNvZGU+QmluZGluZzwvY29kZT4gb2JqZWN0LjwvbGk+DQotICAgICAgICAgIDwvb2w+DQotICAgICAgICA8L2xpPg0KLQ0KLSAgICAgICAgPGxpPkNvbmZpZ3VyZSB0aGUgY2xpZW50IGhhbmRsZXJzIGJ5IHNldHRpbmcgdGhlDQotICAgICAgICA8Y29kZT5ASGFuZGxlckNoYWluPC9jb2RlPiBhbm5vdGF0aW9uIG9uIHRoZSBzZXJ2aWNlDQotICAgICAgICBpbnN0YW5jZSBvciBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSwgb3IgeW91IGNhbiBtb2RpZnkNCi0gICAgICAgIHRoZSBoYW5kbGVyIGNoYWluIHByb2dyYW1tYXRpY2FsbHkgdG8gY29udHJvbCBob3cgdGhlDQotICAgICAgICBoYW5kbGVyIGNoYWluIGlzIGJ1aWx0IGluIHRoZSBydW50aW1lLiBJZiB5b3UgY2hvb3NlIHRvDQotICAgICAgICBtb2RpZnkgdGhlIGhhbmRsZXIgY2hhaW4gcHJvZ3JhbW1hdGljYWxseSwgdGhlbiB5b3UgbXVzdA0KLSAgICAgICAgZGV0ZXJtaW5lIGlmIHlvdSB3aWxsIHVzZSB0aGUgZGVmYXVsdCBoYW5kbGVyIHJlc29sdmVyIG9yDQotICAgICAgICB1c2UgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgYSBoYW5kbGVyIHJlc29sdmVyIHRoYXQgaXMNCi0gICAgICAgIHJlZ2lzdGVyZWQgb24gdGhlIHNlcnZpY2UgaW5zdGFuY2UuIEEgc2VydmljZSBpbnN0YW5jZSB1c2VzDQotICAgICAgICBhIGhhbmRsZXIgcmVzb2x2ZXIgd2hlbiBjcmVhdGluZyBiaW5kaW5nIHByb3ZpZGVycy4gV2hlbg0KLSAgICAgICAgdGhlIGJpbmRpbmcgcHJvdmlkZXJzIGFyZSBjcmVhdGVkLCB0aGUgaGFuZGxlciByZXNvbHZlcg0KLSAgICAgICAgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggYSBzZXJ2aWNlIGlzIHVzZWQgdG8gY3JlYXRlIGENCi0gICAgICAgIGhhbmRsZXIgY2hhaW4gYW5kIHRoZSBoYW5kbGVyIGNoYWluIGlzIHN1YnNlcXVlbnRseSB1c2VkIHRvDQotICAgICAgICBjb25maWd1cmUgdGhlIGJpbmRpbmcgcHJvdmlkZXIuPC9saT4NCi0NCi0gICAgICAgIDxsaT5Db25maWd1cmUgdGhlIHNlcnZlciBoYW5kbGVycyBieSBzZXR0aW5nIHRoZQ0KLSAgICAgICAgPGNvZGU+QEhhbmRsZXJDaGFpbjwvY29kZT4gYW5ub3RhdGlvbiBvbiB0aGUgc2VydmljZQ0KLSAgICAgICAgZW5kcG9pbnQgaW50ZXJmYWNlIG9yIGltcGxlbWVudGF0aW9uIGNsYXNzLiBXaGVuIHRoZQ0KLSAgICAgICAgPGNvZGU+QEhhbmRsZXJDaGFpbjwvY29kZT4gYW5ub3RhdGlvbiBpcyBjb25maWd1cmVkIG9uIGJvdGgNCi0gICAgICAgIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uDQotICAgICAgICBjbGFzcywgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHRha2VzIHByaW9yaXR5LjwvbGk+DQotDQotICAgICAgICA8bGk+Q3JlYXRlIHRoZSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUuIFlvdQ0KLSAgICAgICAgbXVzdCBjcmVhdGUgYSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgZm9yIHRoZQ0KLSAgICAgICAgPGNvZGU+QEhhbmRsZXJDaGFpbjwvY29kZT4gdG8gcmVmZXJlbmNlLjwvbGk+DQotDQotICAgICAgICA8bGk+QWRkIHRoZSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gWE1MIGZpbGUgaW4gdGhlDQotICAgICAgICBjbGFzcyBwYXRoIGZvciB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2Ugd2hlbg0KLSAgICAgICAgY29uZmlndXJpbmcgdGhlIHNlcnZlciBvciBjbGllbnQgaGFuZGxlcnMgdXNpbmcgdGhlDQotICAgICAgICA8Y29kZT5ASGFuZGxlckNoYWluPC9jb2RlPiBhbm5vdGF0aW9uLiBZb3UgbXVzdCBhbHNvDQotICAgICAgICBpbmNsdWRlIHRoZSBoYW5kbGVyIGNsYXNzZXMgY29udGFpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uDQotICAgICAgICBYTUwgZmlsZSBpbiB5b3VyIGNsYXNzIHBhdGguPC9saT4NCi0NCi0gICAgICAgIDxsaT5Xcml0ZSB5b3VyIGhhbmRsZXIgaW1wbGVtZW50YXRpb24uPC9saT4NCi0gICAgICA8L29sPjxiciAvPg0KLSAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvDQotICAgICAgY29uZmlndXJlIEpBWC1XUyBoYW5kbGVycyBvbiBhIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlDQotICAgICAgdXNpbmcgdGhlIDxjb2RlPkBIYW5kbGVyQ2hhaW48L2NvZGU+IGFubm90YXRpb24uPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIDxjb2RlPkBIYW5kbGVyQ2hhaW48L2NvZGU+IGFubm90YXRpb24gaGFzIGEgZmlsZQ0KLSAgICAgIGF0dHJpYnV0ZSB0aGF0IHBvaW50cyB0byBhIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBYTUwNCi0gICAgICBmaWxlIHRoYXQgeW91IGNyZWF0ZS4gVGhlIGZvbGxvd2luZyBmaWxlIGlsbHVzdHJhdGVzIGENCi0gICAgICB0eXBpY2FsIGhhbmRsZXIgY29uZmlndXJhdGlvbiBmaWxlLiBUaGUNCi0gICAgICA8Y29kZT5wcm90b2NvbC1iaW5kaW5nczwvY29kZT4sDQotICAgICAgPGNvZGU+cG9ydC1uYW1lLXBhdHRlcm48L2NvZGU+LCBhbmQNCi0gICAgICA8Y29kZT5zZXJ2aWNlLW5hbWUtcGF0dGVybjwvY29kZT4gZWxlbWVudHMgYXJlIGFsbCBmaWx0ZXJzDQotICAgICAgdGhhdCBhcmUgdXNlZCB0byByZXN0cmljdCB3aGljaCBzZXJ2aWNlcyBjYW4gYXBwbHkgdGhlDQotICAgICAgaGFuZGxlcnMuDQotICAgICAgPHByZT4NCi0gICAmbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0Ow0KLQ0KLSAgICZsdDtqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiJmd0Ow0KLSAgICZsdDshLS0gTm90ZTogIFRoZSAnKiIgZGVub3RlcyBhIHdpbGRjYXJkLiAtLSZndDsNCi0NCi0gICAgICAgICZsdDtqd3M6aGFuZGxlci1jaGFpbiBuYW1lPSJNeUhhbmRsZXJDaGFpbiImZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtqd3M6cHJvdG9jb2wtYmluZGluZ3MmZ3Q7IyNTT0FQMTFfSFRUUCAjI0FOT1RIRVJfQklORElORyZsdDsvandzOnByb3RvY29sLWJpbmRpbmdzJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7andzOnBvcnQtbmFtZS1wYXR0ZXJuIA0KLSAgICAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vaGFuZGxlcnNhbXBsZS5zYW1wbGVzLmFwYWNoZS5vcmcvIiZndDtuczE6TXlTYW1wbCombHQ7L2p3czpwb3J0LW5hbWUtcGF0dGVybiZndDsNCi0gICAgICAgICAgICZsdDtqd3M6c2VydmljZS1uYW1lLXBhdHRlcm4gDQotICAgICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9oYW5kbGVyc2FtcGxlLnNhbXBsZXMuYXBhY2hlLm9yZy8iJmd0O25zMToqJmx0Oy9qd3M6c2VydmljZS1uYW1lLXBhdHRlcm4mZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtqd3M6aGFuZGxlciZndDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7andzOmhhbmRsZXItY2xhc3MmZ3Q7b3JnLmFwYWNoZS5zYW1wbGVzLmhhbmRsZXJzYW1wbGUuU2FtcGxlTG9naWNhbEhhbmRsZXImbHQ7L2p3czpoYW5kbGVyLWNsYXNzJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7L2p3czpoYW5kbGVyJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7andzOmhhbmRsZXImZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2p3czpoYW5kbGVyLWNsYXNzJmd0O29yZy5hcGFjaGUuc2FtcGxlcy5oYW5kbGVyc2FtcGxlLlNhbXBsZVByb3RvY29sSGFuZGxlcjImbHQ7L2p3czpoYW5kbGVyLWNsYXNzJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7L2p3czpoYW5kbGVyJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7andzOmhhbmRsZXImZ3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2p3czpoYW5kbGVyLWNsYXNzJmd0O29yZy5hcGFjaGUuc2FtcGxlcy5oYW5kbGVyc2FtcGxlLlNhbXBsZUxvZ2ljYWxIYW5kbGVyJmx0Oy9qd3M6aGFuZGxlci1jbGFzcyZndDsNCi0gICAgICAgICAgICAgICAgJmx0Oy9qd3M6aGFuZGxlciZndDsNCi0gICAgICAgICAgICAgICAgJmx0O2p3czpoYW5kbGVyJmd0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtqd3M6aGFuZGxlci1jbGFzcyZndDtvcmcuYXBhY2hlLnNhbXBsZXMuaGFuZGxlcnNhbXBsZS5TYW1wbGVQcm90b2NvbEhhbmRsZXIyJmx0Oy9qd3M6aGFuZGxlci1jbGFzcyZndDsNCi0gICAgICAgICAgICAgICAgJmx0Oy9qd3M6aGFuZGxlciZndDsNCi0gICAgICAgICZsdDsvandzOmhhbmRsZXItY2hhaW4mZ3Q7DQotICAgICAgICANCi0gICAmbHQ7L2p3czpoYW5kbGVyLWNoYWlucyZndDsNCi08L3ByZT5NYWtlIHN1cmUgdGhhdCB5b3UgYWRkIHRoZSBoYW5kbGVyLnhtbCBmaWxlIGFuZCB0aGUgaGFuZGxlcg0KLWNsYXNzZXMgY29udGFpbmVkIGluIHRoZSBoYW5kbGVyLnhtbCBmaWxlIGluIHlvdXIgY2xhc3MgcGF0aC48YnIgLz4NCi0NCi0gICAgICA8YnIgLz4NCi0gICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGEgaGFuZGxlciBpbXBsZW1lbnRhdGlvbjoNCi0gICAgICA8cHJlPg0KLSAgIHBhY2thZ2Ugb3JnLmFwYWNoZS5zYW1wbGVzLmhhbmRsZXJzYW1wbGU7DQotDQotICAgaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotICAgaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotICAgaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLSAgIGltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi0NCi0gICBwdWJsaWMgY2xhc3MgU2FtcGxlUHJvdG9jb2xIYW5kbGVyIGltcGxlbWVudHMNCi0gICAgICAgICAgIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXImbHQ7U09BUE1lc3NhZ2VDb250ZXh0Jmd0OyB7DQotDQotICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgIH0NCi0NCi0gICAgICAgcHVibGljIFNldCZsdDtRTmFtZSZndDsgZ2V0SGVhZGVycygpIHsNCi0gICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICB9DQotDQotICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgIH0NCi0NCi0gICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgICAgaWYgKG91dGJvdW5kKSB7DQotICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB5b3VyIHN0ZXBzIGZvciB0aGUgb3V0Ym91bmQgZmxvdy4NCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICB9DQotDQotICAgfQ0KLTwvcHJlPg0KLQ0KLSAgICAgIDxoMj48YSBuYW1lPSJIVFRQU2Vzc2lvbiIgaWQ9IkhUVFBTZXNzaW9uIj5FbmFibGluZyBIVFRQDQotICAgICAgc2Vzc2lvbiBtYW5hZ2VtZW50IHN1cHBvcnQgZm9yIEpBWC1XUw0KLSAgICAgIGFwcGxpY2F0aW9uczwvYT48L2gyPllvdSBjYW4gdXNlIEhUVFAgc2Vzc2lvbiBtYW5hZ2VtZW50IHRvDQotICAgICAgbWFpbnRhaW4gdXNlciBzdGF0ZSBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyLCB3aGlsZSBwYXNzaW5nDQotICAgICAgbWluaW1hbCBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSB1c2VyIHRvIHRyYWNrIHRoZSBzZXNzaW9uLg0KLSAgICAgIFlvdSBjYW4gaW1wbGVtZW50IEhUVFAgc2Vzc2lvbiBtYW5hZ2VtZW50IG9uIHRoZSBhcHBsaWNhdGlvbg0KLSAgICAgIHNlcnZlciB1c2luZyBlaXRoZXIgc2Vzc2lvbiBjb29raWVzIG9yIFVSTCByZXdyaXRpbmcuPGJyIC8+DQotICAgICAgPGJyIC8+DQotICAgICAgVGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGJyb3dzZXIsIGFwcGxpY2F0aW9uIHNlcnZlciwgYW5kDQotICAgICAgYXBwbGljYXRpb24gaXMgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIgYW5kIHRoZSBhcHBsaWNhdGlvbg0KLSAgICAgIHByb2dyYW0uIFRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIHVzZXIgYXJlIHR5cGljYWxseSBub3QgYXdhcmUNCi0gICAgICBvZiB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIuDQotDQotICAgICAgPGgzPlNlc3Npb24gY29va2llczwvaDM+VGhlIEhUVFAgbWFpbnRhaW4gc2Vzc2lvbiBmZWF0dXJlDQotICAgICAgdXNlcyBhIHNpbmdsZSBjb29raWUsIDxjb2RlPkpTRVNTSU9OSUQ8L2NvZGU+LCBhbmQgdGhpcw0KLSAgICAgIGNvb2tpZSBjb250YWlucyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyLiBUaGlzIGNvb2tpZSBpcyB1c2VkDQotICAgICAgdG8gYXNzb2NpYXRlIHRoZSByZXF1ZXN0IHdpdGggaW5mb3JtYXRpb24gc3RvcmVkIG9uIHRoZQ0KLSAgICAgIHNlcnZlciBmb3IgdGhhdCBzZXNzaW9uLiBPbiBzdWJzZXF1ZW50IHJlcXVlc3RzIGZyb20gdGhlDQotICAgICAgSkFYLVdTIGFwcGxpY2F0aW9uLCB0aGUgc2Vzc2lvbiBJRCBpcyB0cmFuc21pdHRlZCBhcyBwYXJ0IG9mDQotICAgICAgdGhlIHJlcXVlc3QgaGVhZGVyLCB3aGljaCBlbmFibGVzIHRoZSBhcHBsaWNhdGlvbiB0bw0KLSAgICAgIGFzc29jaWF0ZSBlYWNoIHJlcXVlc3QgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBJRCB3aXRoIHByaW9yDQotICAgICAgcmVxdWVzdHMgZnJvbSB0aGF0IHVzZXIuIFRoZSBKQVgtV1MgY2xpZW50IGFwcGxpY2F0aW9ucw0KLSAgICAgIHJldHJpZXZlIHRoZSBzZXNzaW9uIElEIGZyb20gdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBhbmQNCi0gICAgICB0aGVuIHVzZSB0aG9zZSBJRHMgaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBieSBzZXR0aW5nIHRoZQ0KLSAgICAgIHNlc3Npb24gSUQgaW4gdGhlIEhUVFAgcmVxdWVzdCBoZWFkZXJzLg0KLQ0KLSAgICAgIDxoMz5VUkwgcmV3cml0aW5nPC9oMz5VUkwgcmV3cml0aW5nIHdvcmtzIGxpa2UgYSByZWRpcmVjdGVkDQotICAgICAgVVJMIGFzIGl0IHN0b3JlcyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVyIGluIHRoZSBVUkwuIFRoZQ0KLSAgICAgIHNlc3Npb24gaWRlbnRpZmllciBpcyBlbmNvZGVkIGFzIGEgcGFyYW1ldGVyIG9uIGFueSBsaW5rIG9yDQotICAgICAgZm9ybSB0aGF0IGlzIHN1Ym1pdHRlZCBmcm9tIGEgV2ViIHBhZ2UuIFRoaXMgZW5jb2RlZCBVUkwgaXMNCi0gICAgICB1c2VkIGZvciBzdWJzZXF1ZW50IHJlcXVlc3RzIHRvIHRoZSBzYW1lIHNlcnZlci48YnIgLz4NCi0gICAgICA8YnIgLz4NCi0gICAgICBUbyBlbmFibGUgSFRUUCBzZXNzaW9uIG1hbmFnZW1lbnQ6DQotDQotICAgICAgPG9sPg0KLSAgICAgICAgPGxpPkNvbmZpZ3VyZSB0aGUgc2VydmVyIHRvIGVuYWJsZSBzZXNzaW9uIHRyYWNraW5nLjwvbGk+DQotDQotICAgICAgICA8bGk+RW5hYmxlIHNlc3Npb24gbWFuYWdlbWVudCBvbiB0aGUgY2xpZW50IGJ5IHNldHRpbmcgdGhlDQotICAgICAgICBKQVgtV1MgcHJvcGVydHksDQotICAgICAgICA8Y29kZT5qYXZheC54bWwud3Muc2Vzc2lvbi5tYWludGFpbjwvY29kZT4sIHRvIHRydWUgb24gdGhlDQotICAgICAgICA8Y29kZT5CaW5kaW5nUHJvdmlkZXI8L2NvZGU+Lg0KLSAgICAgICAgICA8cHJlPg0KLSAgICAgIE1hcCZsdDtTdHJpbmcsIE9iamVjdCZndDsgcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAuLi4NCi0gICAgICAuLi4NCi0gICAgICByYy5wdXQoQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgLi4uDQotICAgICAgLi4uDQotICAgDQotPC9wcmU+DQotICAgICAgICA8L2xpPg0KLSAgICAgIDwvb2w+DQotDQotICAgICAgPGgyPjxhIG5hbWU9Ik1UT00iIGlkPSJNVE9NIj5FbmFibGluZyBNVE9NPC9hPjwvaDI+SkFYLVdTDQotICAgICAgc3VwcG9ydHMgdGhlIHVzZSBvZiBTT0FQIE1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXplZA0KLSAgICAgIE1lY2hhbmlzbSAoTVRPTSkgZm9yIHNlbmRpbmcgYmluYXJ5IGF0dGFjaG1lbnQgZGF0YS4gQnkNCi0gICAgICBlbmFibGluZyBNVE9NLCB5b3UgY2FuIHNlbmQgYW5kIHJlY2VpdmUgYmluYXJ5IGRhdGEgb3B0aW1hbGx5DQotICAgICAgd2l0aG91dCBpbmN1cnJpbmcgdGhlIGNvc3Qgb2YgZGF0YSBlbmNvZGluZyB0byBlbnN1cmUgdGhlDQotICAgICAgZGF0YSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGRvY3VtZW50LjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIEpBWC1XUyBhcHBsaWNhdGlvbnMgY2FuIHNlbmQgYmluYXJ5IGRhdGEgYXMgYmFzZTY0IG9yDQotICAgICAgaGV4QmluYXJ5IGVuY29kZWQgZGF0YSBjb250YWluZWQgd2l0aGluIHRoZSBYTUwgZG9jdW1lbnQuDQotICAgICAgSG93ZXZlciwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG9wdGltaXphdGlvbnMgcHJvdmlkZWQgYnkNCi0gICAgICBNVE9NLCBlbmFibGUgTVRPTSB0byBzZW5kIGJpbmFyeSBiYXNlNjQgZGF0YSBhcyBhdHRhY2htZW50cw0KLSAgICAgIGNvbnRhaW5lZCBvdXRzaWRlIHRoZSBYTUwgZG9jdW1lbnQuIE1UT00gb3B0aW1pemF0aW9uIGlzIG9ubHkNCi0gICAgICBhdmFpbGFibGUgZm9yIHRoZSB4czpiYXNlNjRCaW5hcnkgZGF0YSB0eXBlLiBUaGUgTVRPTSBvcHRpb24NCi0gICAgICBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LiBKQVgtV1MgYXBwbGljYXRpb25zIHJlcXVpcmUNCi0gICAgICBzZXBhcmF0ZSBjb25maWd1cmF0aW9uIG9mIGJvdGggdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlcg0KLSAgICAgIGFydGlmYWN0cyB0byBlbmFibGUgTVRPTSBzdXBwb3J0LiBGb3IgdGhlIHNlcnZlciwgTVRPTSBjYW4gYmUNCi0gICAgICBlbmFibGVkIG9uIGEgSkFYLVdTIEphdmFCZWFucyBlbmRwb2ludCBvbmx5IGFuZCBub3Qgb24gYQ0KLSAgICAgIHByb3ZpZGVyLWJhc2VkIGVuZHBvaW50LjxiciAvPg0KLSAgICAgIDxiciAvPg0KLSAgICAgIFRvIGVuYWJsZSBNVE9NIG9uIGFuIGVuZHBvaW50LCB1c2UgdGhlIEBCaW5kaW5nVHlwZQ0KLSAgICAgIChqYXZheC54bWwud3MuQmluZGluZ1R5cGUpIGFubm90YXRpb24gb24gYSBzZXJ2ZXIgZW5kcG9pbnQNCi0gICAgICBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0byBzcGVjaWZ5IHRoYXQgdGhlIGVuZHBvaW50IHN1cHBvcnRzDQotICAgICAgb25lIG9mIHRoZSBNVE9NIGJpbmRpbmcgdHlwZXMgc28gdGhhdCB0aGUgcmVzcG9uc2UgbWVzc2FnZXMNCi0gICAgICBhcmUgTVRPTS1lbmFibGVkLiBUaGUgamF2YXgueG1sLndzLlNPQVBCaW5kaW5nIGNsYXNzIGRlZmluZXMNCi0gICAgICB0d28gZGlmZmVyZW50IGNvbnN0YW50cywgU09BUDExSFRUUF9NVE9NX0JJTkRJTkcgYW5kDQotICAgICAgU09BUDEySFRUUF9NVE9NX0JJTkRJTkcgdGhhdCB5b3UgY2FuIHVzZSBmb3IgdGhlIHZhbHVlIG9mIHRoZQ0KLSAgICAgIEBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uLiBGb3IgZXhhbXBsZToNCi0gICAgICA8cHJlPg0KLSAgIC8vIGZvciBTT0FQIHZlcnNpb24gMS4xDQotICAgQEJpbmRpbmdUeXBlKHZhbHVlID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotICAgLy8gZm9yIFNPQVAgdmVyc2lvbiAxLjINCi0gICBAQmluZGluZ1R5cGUodmFsdWUgPSBTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykNCi08L3ByZT48YnIgLz4NCi0gICAgICBFbmFibGUgTVRPTSBvbiB0aGUgY2xpZW50IGJ5IHVzaW5nIHRoZQ0KLSAgICAgIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nIGNsaWVudC1zaWRlIEFQSS4gRW5hYmxpbmcgTVRPTQ0KLSAgICAgIG9uIHRoZSBjbGllbnQgb3B0aW1pemVzIHRoZSBiaW5hcnkgbWVzc2FnZXMgdGhhdCBhcmUgc2VudCB0bw0KLSAgICAgIHRoZSBzZXJ2ZXIuDQotDQotICAgICAgPHVsPg0KLSAgICAgICAgPGxpPkVuYWJsZSBNVE9NIG9uIGEgRGlzcGF0Y2ggY2xpZW50LjwvbGk+DQotDQotICAgICAgICA8bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmUiPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzDQotICAgICAgICBTT0FQIHZlcnNpb24gMS4xOg0KLQ0KLSAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgPGxpPkZpcnN0IG1ldGhvZDogVXNpbmcNCi0gICAgICAgICAgICBTT0FQQmluZGluZy5zZXRNVE9NRW5hYmxlZCgpPC9saT4NCi0NCi0gICAgICAgICAgICA8bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmU7IGRpc3BsYXk6IGlubGluZSI+DQotICAgICAgICAgICAgICA8cHJlPg0KLSAgICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKWRpc3BhdGNoLmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgICANCi08L3ByZT4NCi0gICAgICAgICAgICA8L2xpPg0KLQ0KLSAgICAgICAgICAgIDxsaT5TZWNvbmQgbWV0aG9kOiBVc2luZyBTZXJ2aWNlLmFkZFBvcnQoKTwvbGk+DQotDQotICAgICAgICAgICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lOyBkaXNwbGF5OiBpbmxpbmUiPg0KLSAgICAgICAgICAgICAgPHByZT4NCi0gDQotICAgICAgICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSxTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORyxlbmRwb2ludFVybCk7DQotICAgICAgICAgDQotPC9wcmU+DQotICAgICAgICAgICAgPC9saT4NCi0gICAgICAgICAgPC91bD4NCi0gICAgICAgIDwvbGk+DQotDQotICAgICAgICA8bGk+RW5hYmxlIE1UT00gb24gYSBEeW5hbWljIFByb3h5IGNsaWVudC48L2xpPg0KLQ0KLSAgICAgICAgPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lOyBkaXNwbGF5OiBpbmxpbmUiPg0KLSAgICAgICAgICA8cHJlPg0KLSAgICAgICAgICAvLyBDcmVhdGUgYSBCaW5kaW5nUHJvdmlkZXIgYnAgZnJvbSBhIHByb3h5IHBvcnQuDQotICAgICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICBNdG9tU2FtcGxlIHByb3h5ID0gc3ZjLmdldFBvcnQocG9ydE5hbWUsIE10b21TYW1wbGUuY2xhc3MpOw0KLSAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0NCi0gICAgICAgICAgLy9FbmFibGUgTVRPTQ0KLSAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBicC5nZXRCaW5kaW5nKCk7DQotICAgICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgDQotPC9wcmU+DQotICAgICAgICA8L2xpPg0KLSAgICAgIDwvdWw+DQotICAgIDwvbGk+DQotICA8L3VsPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ppYngvamlieC1jb2RlZ2VuLWludGVncmF0aW9uLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtY29kZWdlbi1pbnRlZ3JhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjkyNzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL2ppYngvamlieC1jb2RlZ2VuLWludGVncmF0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5KaUJYIEludGVncmF0aW9uIHdpdGggQXhpczI8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+SmlCWCBJbnRlZ3JhdGlvbiBXaXRoIEF4aXMyPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB1c2luZyBKaUJYIGRhdGEgYmluZGluZyB3aXRoIEF4aXMyLiBKaUJYDQotZGlmZmVycyBmcm9tIHRoZSBvdGhlciBkYXRhIGJpbmRpbmcgdGVjaG5pcXVlcyBzdXBwb3J0ZWQgYnkgQXhpczINCi1pbiB0aGF0IGl0IGFsbG93cyB5b3UgdG8gdXNlIHlvdXIgb3duIEphdmEgZGF0YSBvYmplY3RzIChhcyBvcHBvc2VkDQotdG8gSmF2YSBkYXRhIG9iamVjdHMgZ2VuZXJhdGVkIGZyb20gYSBzY2hlbWEgZGVmaW5pdGlvbikuIEppQlggYWxzbw0KLXByb3ZpZGVzIGEgbmljZXIgZm9ybSBvZiB1bndyYXBwZWQgV2ViIHNlcnZpY2VzIGludGVyZmFjZSB0aGFuIGlzDQotc3VwcG9ydGVkIGJ5IHRoZSBvdGhlciBkYXRhIGJpbmRpbmcgdGVjaG5pcXVlcy4gT24gdGhlIGRvd25zaWRlLA0KLUppQlggcmVxdWlyZXMgbW9yZSBzZXR1cCB0aGFuIHRoZSBvdGhlciBkYXRhIGJpbmRpbmcgdGVjaG5pcXVlcyAtDQotaW4gcGFydGljdWxhciwgeW91IG5lZWQgdG8gY29tZSB1cCB3aXRoIGEgc2V0IG9mIGRhdGEgY2xhc3NlcyBhbmQgYQ0KLWJpbmRpbmcgZGVmaW5pdGlvbiBpbiBvcmRlciB0byB3b3JrIHdpdGggSmlCWCBpbiBBeGlzMi48L3A+DQotPHA+SmlCWCBzdXBwb3J0IGZvciBBeGlzMiBhbmQgV2ViIHNlcnZpY2VzIGluIGdlbmVyYWwgaXMgY29udGludWluZw0KLXRvIGV2b2x2ZS4gVGhpcyBwYWdlIGNvdmVycyB0aGUgYmFzaWNzIG9mIHVzaW5nIEppQlggd2l0aCBBeGlzMiBhcw0KLW9mIHRoZSBjdXJyZW50IHJlbGVhc2UuIENoZWNrIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnNvc25vc2tpLmNvbS9qaWJ4LXdpa2kvc3BhY2UvYXhpczItamlieCI+SmlCWCBBeGlzMg0KLVdpa2kgcGFnZTwvYT4gZm9yIHVwZGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgSmlCWCB3aXRoDQotQXhpczIuPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiN3cmFwcGVkIj5XcmFwcGVkIHZzLiB1bndyYXBwZWQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2phdmEiPlN0YXJ0aW5nIGZyb20gSmF2YTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjd3NkbCI+U3RhcnRpbmcgZnJvbSBXU0RMPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNjb2RlZ2VuIj5BeGlzMiBKaUJYIENvZGUgR2VuZXJhdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY29taW5nIj5Db21pbmcgQXR0cmFjdGlvbnM8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImludHJvIiBpZD0iaW50cm8iPjwvYT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD48YSBocmVmPSJodHRwOi8vd3d3LmppYngub3JnIj5KaUJYIGRhdGEgYmluZGluZzwvYT4gc3VwcG9ydHMNCi1mYXN0IGFuZCBmbGV4aWJsZSBjb252ZXJzaW9ucyBiZXR3ZWVuIHBsYWluIG9sZCBKYXZhIG9iamVjdHMNCi0oUE9KT3MpIGFuZCBYTUwuIEppQlggdXNlcyBhIG1hcHBlZCBiaW5kaW5nIGFwcHJvYWNoIHRoYXQncyBiYXNlZA0KLW9uIGJpbmRpbmcgZGVmaW5pdGlvbiBkb2N1bWVudHMgeW91IHByb3ZpZGUuIFRoaXMgYXBwcm9hY2ggbGV0J3MNCi15b3UgY3VzdG9taXplIHRoZSB3YXkgeW91ciBKYXZhIG9iamVjdHMgYXJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbQ0KLVhNTC4gWW91IGNhbiBldmVuIGRlZmluZSBtdWx0aXBsZSBiaW5kaW5ncyB0byB1c2UgdGhlIHNhbWUgSmF2YQ0KLW9iamVjdHMgd2l0aCBkaWZmZXJlbnQgWE1MIHJlcHJlc2VudGF0aW9ucy4gVGhlc2UgZmVhdHVyZXMgbWFrZQ0KLUppQlggZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91J3JlIGRldmVsb3BpbmcgYSBXZWIgc2VydmljZSBiYXNlZCBvbg0KLWV4aXN0aW5nIEphdmEgY29kZSwgb3Igd2hlbiB5b3UgbmVlZCB0byBzdXBwb3J0IG11bHRpcGxlIFhNTA0KLXJlcHJlc2VudGF0aW9ucyBmb3IgYSBXZWIgc2VydmljZSAoYXMgd2hlbiB5b3UncmUgdXNpbmcgdmVyc2lvbmVkDQotc2NoZW1hIGRlZmluaXRpb25zKS48L3A+DQotPHA+QXhpczIgc3VwcG9ydHMgdXNpbmcgSmlCWCB3aXRoIHlvdXIgV2ViIHNlcnZpY2VzLCBpbmNsdWRpbmcNCi1nZW5lcmF0aW5nIHRoZSBuZWNlc3NhcnkgbGlua2FnZSBjb2RlIGZvciBib3RoIGNsaWVudCBhbmQgc2VydmVyDQotc2lkZXMuIEhvd2V2ZXIsIHRoZSBBeGlzMiBzdXBwb3J0IGZvciBKaUJYIGRvZXMgbm90IGN1cnJlbnRseQ0KLWluY2x1ZGUgY29kZSBnZW5lcmF0aW9uIGZyb20gdGhlIHNjaGVtYSBmb3IgYSBXZWIgc2VydmljZSAtIHlvdQ0KLW5lZWQgdG8gcHJvdmlkZSB5b3VyIG93biBkYXRhIGNsYXNzZXMgYW5kIEppQlggYmluZGluZyBkZWZpbml0aW9uLA0KLWFuZCB5b3UgYWxzbyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBiaW5kaW5nIGRlZmluaXRpb24gbWF0Y2hlcw0KLXRoZSBYTUwgc3RydWN0dXJlcyBkZWZpbmVkIGZvciB5b3VyIFdlYiBzZXJ2aWNlLiBUaGUgSmlCWCBwcm9qZWN0DQotcHJvdmlkZXMgc29tZSBiYXNpYyB0b29scyB0byBoZWxwIHdpdGggY29kZSBnZW5lcmF0aW9uIGZyb20gc2NoZW1hLA0KLWJpbmRpbmcgZ2VuZXJhdGlvbiBmcm9tIEphdmEgY2xhc3NlcywgYW5kIHNjaGVtYSBnZW5lcmF0aW9uIGZyb20NCi10aGUgY29tYmluYXRpb24gb2YgSmF2YSBjbGFzc2VzIGFuZCBhIGJpbmRpbmcgZGVmaW5pdGlvbi4gSW4gdGhlDQotZnV0dXJlLCBpbXByb3ZlZCB2ZXJzaW9ucyBvZiB0aGVzZSB0b29scyB3aWxsIGJlIGludGVncmF0ZWQNCi1kaXJlY3RseSBpbnRvIHRoZSBBeGlzMiBmcmFtZXdvcmsgc3VwcG9ydCwgYnV0IGZvciBub3cgeW91J3JlIG9uDQoteW91ciBvd24gd2l0aCB0aGlzIHBhcnQgb2YgdGhlIHNldHVwLjwvcD4NCi08cD5Zb3UgY2FuIHVzZSBKaUJYIGRhdGEgYmluZGluZyBib3RoIHRvIGV4cG9zZSBleGlzdGluZyBKYXZhIGNvZGUNCi1hcyBhIHNlcnZpY2UsIGFuZCB0byBidWlsZCBhIGNsaWVudCBmb3IgYW4gZXhpc3Rpbmcgc2VydmljZS4gVGhpcw0KLWRvY3VtZW50IHJ1bnMgdGhyb3VnaCB0aGUgc2VxdWVuY2Ugb2Ygc3RlcHMgaW52b2x2ZWQgZm9yIGVhY2ggb2YNCi10aGVzZSBjYXNlcywganVzdCB0byBoZWxwIHVzZXJzIHVuZGVyc3RhbmQgdGhlIGJhc2ljIGFwcHJvYWNoIHRvDQotd29ya2luZyB3aXRoIEppQlggaW4gQXhpczIuIFlvdSBjYW4gZmluZCBmdWxsIGluc3RydWN0aW9ucyBvbiB0aGUNCi1zdGFuZGFyZCBKaUJYIHBhcnRzIG9mIHRoaXMgc2VxdWVuY2Ugb24gdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuamlieC5vcmciPkppQlggV2ViIHNpdGU8L2E+LjwvcD4NCi08YSBuYW1lPSJ3cmFwcGVkIiBpZD0id3JhcHBlZCI+PC9hPg0KLTxoMj5XcmFwcGVkIHZzLiB1bndyYXBwZWQ8L2gyPg0KLTxwPkF4aXMyIHN1cHBvcnQgZm9yIEppQlggY3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCB0aGUNCi1kb2N1bWVudC1saXRlcmFsIChkb2MvbGl0KSBmb3JtIG9mIFdlYiBzZXJ2aWNlcyBkZWZpbml0aW9ucy4NCi1Eb2MvbGl0IFdlYiBzZXJ2aWNlcyBnZW5lcmFsbHkgdXNlIHBhcnRpY3VsYXIgc2NoZW1hIGVsZW1lbnRzIGFzDQotaW5wdXQgYW5kIG91dHB1dCBmcm9tIGVhY2ggb3BlcmF0aW9uLCBhbmQgdGhlIEF4aXMyIHN1cHBvcnQgZm9yDQotSmlCWCBhc3N1bWVzIHRoaXMgc3RydWN0dXJlICh3aGljaCBpcyBhbHNvIHRoZSBzdHJ1Y3R1cmUgcmVxdWlyZWQNCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LndzLWkub3JnL1Byb2ZpbGVzL0Jhc2ljUHJvZmlsZS0xLjEuaHRtbCI+V1MtSSBCYXNpYw0KLVByb2ZpbGU8L2E+KS48L3A+DQotPHA+QSBwb3B1bGFyIHN1YnNldCBvZiBkb2MvbGl0IFdlYiBzZXJ2aWNlcyB1c2UgYSBmb3JtIGNhbGxlZA0KLSJ3cmFwcGVkIi4gV3JhcHBlZCBkb2MvbGl0IFdlYiBzZXJ2aWNlcyBkZWZpbmUgc2VydmljZSBvcGVyYXRpb25zDQotdGhhdCBjb3JyZXNwb25kIHRvIG1ldGhvZCBjYWxscywgdXNpbmcgaW5wdXQgYW5kIG91dHB1dCBlbGVtZW50DQotbmFtZXMgYmFzZWQgb24gdGhlIG1ldGhvZCBuYW1lIGFuZCBlbWJlZGRpbmcgdGhlIGFjdHVhbCBwYXJhbWV0ZXINCi12YWx1ZXMgZm9yIHRoZSBtZXRob2QgY2FsbCB3aXRoaW4gdGhlIGlucHV0IGVsZW1lbnQuPC9wPg0KLTxwPldoZW4gdXNlZCB3aXRoIEF4aXMyLCBKaUJYIHN1cHBvcnRzIGJvdGggZ2VuZXJhbCBkb2MvbGl0IGFuZA0KLXdyYXBwZWQgc2VydmljZSBkZWZpbml0aW9ucy4gV3JhcHBlZCBzZXJ2aWNlIGRlZmluaXRpb25zIGNhbiBiZQ0KLSJ1bndyYXBwZWQiIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gdG8gcHJvdmlkZSBhIGdyZWF0bHkgc2ltcGxpZmllZA0KLWludGVyZmFjZS4gSmlCWCB1bndyYXBwaW5nIG9mIHNlcnZpY2UgZGVmaW5pdGlvbnMgaXMgbm90IGNvbXBhdGlibGUNCi13aXRoIHRoZSB1bndyYXBwaW5nIHN1cHBvcnQgZm9yIG90aGVyIGRhdGEgYmluZGluZyBmcmFtZXdvcmtzIHVzZWQNCi13aXRoIEF4aXMyLCBidXQgbW9zdCB1c2VycyB3aWxsIGZpbmQgdGhlIEppQlggYXBwcm9hY2ggZWFzeSBhbmQNCi1jb252ZW5pZW50LiBTZWUgdGhlIDxhIGhyZWY9Ii4vamlieC11bndyYXBwZWQtZXhhbXBsZS5odG1sIj5KaUJYDQotVW53cmFwcGVkIEV4YW1wbGU8L2E+IGFuZCB0aGUgPGEgaHJlZj0NCi0iLi9qaWJ4LWRvY2xpdC1leGFtcGxlLmh0bWwiPkppQlggRG9jdW1lbnQvTGl0ZXJhbCBFeGFtcGxlPC9hPg0KLXBhZ2VzIGZvciBhIGRldGFpbGVkIGNvbXBhcmlzb24gb2YgdGhlIHR3byBmb3JtcyBvZiBzZXJ2aWNlDQotaW50ZXJmYWNlLjwvcD4NCi08YSBuYW1lPSJqYXZhIiBpZD0iamF2YSI+PC9hPg0KLTxoMj5TdGFydGluZyBmcm9tIEphdmE8L2gyPg0KLTxwPkhlcmUncyB0aGUgc2VxdWVuY2Ugb2Ygc3RlcHMgZm9yIHVzaW5nIEppQlggd2l0aCBBeGlzMiB0byBleHBvc2UNCi1leGlzdGluZyBKYXZhIGNvZGUgYXMgYSBXZWIgc2VydmljZTo8L3A+DQotPG9sPg0KLTxsaT5DcmVhdGUgYSBKaUJYIGJpbmRpbmcgZGVmaW5pdGlvbiBmb3IgdGhlIGRhdGEgYmVpbmcgdHJhbnNmZXJyZWQNCi1ieSB0aGUgV2ViIHNlcnZpY2UgKHlvdSBtYXkgYmUgYWJsZSB0byB1c2UgdGhlIEppQlggYmluZGluZw0KLWdlbmVyYXRvciB0byBoZWxwIHdpdGggdGhpcyBzdGVwKS48L2xpPg0KLTxsaT5DcmVhdGUgYSBzY2hlbWEgdGhhdCBtYXRjaGVzIHRoZSBYTUwgZGVmaW5lZCBieSB5b3VyIGJpbmRpbmcNCi0oeW91IG1heSBiZSBhYmxlIHRvIHVzZSB0aGUgSmlCWCBzY2hlbWEgZ2VuZXJhdG9yIHRvIGhlbHAgd2l0aA0KLXRoaXMpLiBJZiB5b3UncmUgdXNpbmcgYSB3cmFwcGVkIGZvcm0gb2YgaW50ZXJmYWNlIHRvIHlvdXIgc2VydmljZQ0KLXlvdSdsbCBhbHNvIG5lZWQgdG8gY3JlYXRlIHNjaGVtYSBkZWZpbml0aW9ucyBmb3IgdGhlIHdyYXBwZXIgaW5wdXQNCi1hbmQgb3V0cHV0IGVsZW1lbnRzIHVzZWQgYnkgZWFjaCBvcGVyYXRpb24uPC9saT4NCi08bGk+Q3JlYXRlIGEgV1NETCBkb2N1bWVudCBmb3IgeW91ciBzZXJ2aWNlLCB3aXRoIHRoZSBzY2hlbWENCi1lbWJlZGRlZCBvciBpbXBvcnRlZC48L2xpPg0KLTxsaT5HZW5lcmF0ZSBBeGlzMiBzZXJ2ZXItc2lkZSBsaW5rYWdlIGNvZGUgdXNpbmcgV1NETDJKYXZhIHdpdGgNCi10aGUgV1NETCBhbmQgeW91ciBiaW5kaW5nIGRlZmluaXRpb24uPC9saT4NCi08bGk+UnVuIHRoZSBKaUJYIGJpbmRpbmcgY29tcGlsZXIgb24geW91ciBKYXZhIGNsYXNzZXMgdG8gYWRkIHRoZQ0KLWFjdHVhbCBiaW5kaW5nIGNvZGUuPC9saT4NCi08bGk+SW5jbHVkZSB0aGUgPGk+YXhpczItamlieC5qYXI8L2k+IGluIHlvdXIgcnVudGltZSBjbGFzc3BhdGgsDQotYWxvbmcgd2l0aCB0aGUgPGk+amlieC1ydW50aW1lLmphcjwvaT4uPC9saT4NCi08L29sPg0KLTxwPklmIHlvdSB1c2UgYSB3cmFwcGVkIGludGVyZmFjZSBmb3IgeW91ciBXZWIgc2VydmljZSB5b3UgY2FuDQotZXhwb3NlIG1ldGhvZCBjYWxscyBpbiB5b3VyIGV4aXN0aW5nIGNvZGUgZGlyZWN0bHkgYXMgb3BlcmF0aW9ucyBpbg0KLXRoZSBzZXJ2aWNlLiBJbiB0aGlzIGNhc2UgeW91IG5vcm1hbGx5IGp1c3QgdXNlIHlvdXIgZXhpc3RpbmcgZGF0YQ0KLW9iamVjdHMgd2l0aCBKaUJYIGRhdGEgYmluZGluZywgYW5kIGFkZCBzY2hlbWEgZGVmaW5pdGlvbnMgZm9yIHRoZQ0KLXdyYXBwZXIgZWxlbWVudHMuIFNlZSB0aGUgPGEgaHJlZj0NCi0iLi9qaWJ4LXVud3JhcHBlZC1leGFtcGxlLmh0bWwiPkppQlggVW53cmFwcGVkIEV4YW1wbGU8L2E+IHBhZ2UgZm9yDQotbW9yZSBkZXRhaWxzIG9uIGhvdyB0aGlzIHdvcmtzLjwvcD4NCi08cD5JZiB5b3UgdXNlIGEgbm9uLXdyYXBwZWQgaW50ZXJmYWNlIGZvciB5b3VyIFdlYiBzZXJ2aWNlIHlvdSBuZWVkDQotdG8gZGVmaW5lIGNsYXNzZXMgdG8gaG9sZCB0aGUgZGF0YSBpbnB1dCBhbmQgb3V0cHV0IGZyb20gZWFjaA0KLW9wZXJhdGlvbi4gSW4gdGhpcyBjYXNlIHRoZXNlIGhvbGRlciBjbGFzc2VzIG5lZWQgdG8gYmUgaW5jbHVkZWQgaW4NCi10aGUgSmlCWCBiaW5kaW5nIGRlZmluaXRpb24uIFNlZSB0aGUgPGEgaHJlZj0NCi0iLi9qaWJ4LWRvY2xpdC1leGFtcGxlLmh0bWwiPkppQlggRG9jdW1lbnQvTGl0ZXJhbCBFeGFtcGxlPC9hPiBwYWdlDQotZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIGNhc2UuPC9wPg0KLTxhIG5hbWU9IndzZGwiIGlkPSJ3c2RsIj48L2E+DQotPGgyPlN0YXJ0aW5nIGZyb20gV1NETDwvaDI+DQotPHA+SGVyZSdzIHRoZSBzZXF1ZW5jZSBvZiBzdGVwcyBmb3IgdXNpbmcgSmlCWCB3aXRoIEF4aXMyIHRvDQotaW1wbGVtZW50IGEgY2xpZW50IGZvciBhbiBleGlzdGluZyBXZWIgc2VydmljZSAob3IgdGhlIGFjdHVhbA0KLXNlcnZpY2UsIHdoZW4geW91J3ZlIGJlZW4gc3VwcGxpZWQgd2l0aCB0aGUgV1NETCB5b3VyIHNlcnZpY2UgaXMgdG8NCi1pbXBsZW1lbnQpOjwvcD4NCi08b2w+DQotPGxpPkNyZWF0ZSBKYXZhIGNsYXNzZXMgZm9yIHRoZSBkYXRhIGJlaW5nIHRyYW5zZmVycmVkIGJ5IHRoZSBXZWINCi1zZXJ2aWNlLCBhbmQgYSBKaUJYIGJpbmRpbmcgZGVmaW5pdGlvbiB0aGF0IG1hcHMgdGhlc2UgY2xhc3NlcyB0bw0KLXRoZSBzY2hlbWEgZGVmaW5lZCBieSB0aGUgV2ViIHNlcnZpY2UgKHlvdSBtYXkgYmUgYWJsZSB0byB1c2UgdGhlDQotSmlCWCB4c2QyamlieCB0b29sIHRvIGhlbHAgd2l0aCB0aGlzKS48L2xpPg0KLTxsaT5HZW5lcmF0ZSBBeGlzMiBjbGllbnQgbGlua2FnZSBjb2RlIHVzaW5nIFdTREwySmF2YSB3aXRoIHRoZQ0KLVdTREwgYW5kIHlvdXIgYmluZGluZyBkZWZpbml0aW9uLjwvbGk+DQotPGxpPlJ1biB0aGUgSmlCWCBiaW5kaW5nIGNvbXBpbGVyIG9uIHlvdXIgSmF2YSBjbGFzc2VzIHRvIGFkZCB0aGUNCi1hY3R1YWwgYmluZGluZyBjb2RlLjwvbGk+DQotPGxpPkluY2x1ZGUgdGhlIDxpPmF4aXMyLWppYnguamFyPC9pPiBpbiB5b3VyIHJ1bnRpbWUgY2xhc3NwYXRoLA0KLWFsb25nIHdpdGggdGhlIDxpPmppYngtcnVudGltZS5qYXI8L2k+PC9saT4NCi08L29sPg0KLTxwPkFzIHdpdGggdGhlIHN0YXJ0aW5nIGZyb20gSmF2YSBjYXNlLCB0aGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlcw0KLWluIHRoZSBoYW5kbGluZyBkZXBlbmRpbmcgb24gd2hldGhlciB5b3VyIHNlcnZpY2UgZGVmaW5pdGlvbiBmaXRzDQotdGhlIHdyYXBwZWQgZm9ybS4gU2VlIHRoZSA8YSBocmVmPQ0KLSIuL2ppYngtdW53cmFwcGVkLWV4YW1wbGUuaHRtbCI+SmlCWCBVbndyYXBwZWQgRXhhbXBsZTwvYT4gYW5kDQotPGEgaHJlZj0iLi9qaWJ4LWRvY2xpdC1leGFtcGxlLmh0bWwiPkppQlggRG9jdW1lbnQvTGl0ZXJhbA0KLUV4YW1wbGU8L2E+IHBhZ2VzIGZvciBtb3JlIGRldGFpbHMuPC9wPg0KLTxhIG5hbWU9ImNvZGVnZW4iIGlkPSJjb2RlZ2VuIj48L2E+DQotPGgyPldTREwySmF2YSB1c2FnZTwvaDI+DQotPHA+VG8gcnVuIHRoZSBXU0RMMkphdmEgdG9vbCBmb3IgSmlCWCBkYXRhIGJpbmRpbmcgeW91IG5lZWQ6PC9wPg0KLTxvbD4NCi08bGk+VG8gc3BlY2lmeSA8aT4tZCBqaWJ4PC9pPiB0byBzZWxlY3QgSmlCWCBiaW5kaW5nLjwvbGk+DQotPGxpPllvdSBhbHNvIGdlbmVyYWxseSBuZWVkIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyLA0KLTxpPi1FYmluZGluZ2ZpbGUge2ZpbGV9PC9pPiAod2hlcmUgPGk+e2ZpbGV9PC9pPiBpcyB0aGUgZmlsZSBwYXRoDQotdG8geW91ciBKaUJYIGJpbmRpbmcgZGVmaW5pdGlvbikuPC9saT4NCi08bGk+RmluYWxseSwgeW91IG5lZWQgdG8gaGF2ZSB0aGUgPGk+YXhpczItamlieC1YWFhYLmphcjwvaT4sIHRoZQ0KLTxpPmppYngtYmluZC1YWFhYLmphcjwvaT4sIGFuZCB0aGUgPGk+amlieC1ydW4tWFhYWC5qYXI8L2k+IGZpbGVzDQotZnJvbSB5b3VyIEF4aXMyIGRpc3RyaWJ1dGlvbiBpbmNsdWRlZCBpbiB0aGUgV1NETDJKYXZhDQotY2xhc3NwYXRoLjwvbGk+DQotPC9vbD4NCi08cD5JZiB5b3Ugd2FudCB0byB1c2UgdGhlIHVud3JhcHBlZCBmb3JtIG9mIGludGVyZmFjZSB5b3UgYWxzbyBuZWVkDQotdG8gc3BlY2lmeSB0aGUgPGk+LXV3PC9pPiBvcHRpb24gdG8gV1NETDJKYXZhLiBJbiB0aGlzIGNhc2UgeW91cg0KLUppQlggYmluZGluZyBkZWZpbml0aW9uIG11c3QgaW5jbHVkZSBhYnN0YWN0IG1hcHBpbmdzIGZvciBhbGwgdGhlDQotY29tcGxleCBvYmplY3RzIHdoaWNoIGNvcnJlc3BvbmQgdG8gbWV0aG9kIHBhcmFtZXRlcnMsIGFuZCBlYWNoDQotYWJzdHJhY3QgbWFwcGluZyBtdXN0IHNwZWNpZnkgYSA8aT50eXBlLW5hbWU8L2k+IGF0dHJpYnV0ZSB0aGF0DQotbWF0Y2hlcyB0aGUgc2NoZW1hIDxpPmNvbXBsZXhUeXBlPC9pPiB1c2VkIGluIHRoZSBXU0RMLiBZb3UgY2FuDQotYWxzbyB1c2UgZm9ybWF0cyBpbiB0aGUgYmluZGluZyBkZWZpbml0aW9uIHRvIGRlZmluZSB0aGUgaGFuZGxpbmcNCi1vZiBzY2hlbWEgPGk+c2ltcGxlVHlwZTwvaT5zLiBTY2hlbWEgdHlwZXMgY29ycmVzcG9uZGluZyB0byBKYXZhDQotcHJpbWl0aXZlcyBhbmQgc2ltcGxlIG9iamVjdHMgd2l0aCBidWlsdC1pbiBKaUJYIGNvbnZlcnNpb25zIGFyZQ0KLWhhbmRsZWQgYXV0b21hdGljYWxseSwgYW5kIGlmIGFsbCB0aGUgcGFyYW1ldGVyIGFuZCByZXR1cm4gdmFsdWVzDQotaW4geW91ciB3cmFwcGVkIFdTREwgYXJlIG9mIHRoZXNlIHR5cGVzIHlvdSBkb24ndCBldmVuIG5lZWQgYSBKaUJYDQotYmluZGluZyBkZWZpbml0aW9uLiBUaGlzIGlzIHRoZSBvbmUgY2FzZSB3aGVyZSB0aGUgPGk+LUViaW5kaW5nZmlsZQ0KLXtmaWxlfTwvaT4gcGFyYW1ldGVyIGlzIG5vdCBuZWVkZWQuPC9wPg0KLTxwPklmIHlvdSdyZSBub3QgdW53cmFwcGluZyB0aGUgaW50ZXJmYWNlLCB5b3UgbXVzdCB1c2UgYSBKaUJYDQotYmluZGluZyBkZWZpbml0aW9uIGFuZCBpdCBtdXN0IGluY2x1ZGUgYSBjb25jcmV0ZSBtYXBwaW5nIGZvciBlYWNoDQotZWxlbWVudCB1c2VkIGFzIGlucHV0IG9yIG91dHB1dCBieSBhbnkgb3BlcmF0aW9uLjwvcD4NCi08YSBuYW1lPSJjb21pbmciIGlkPSJjb21pbmciPjwvYT4NCi08aDI+Q29taW5nIEF0dHJhY3Rpb25zPC9oMj4NCi08cD5Xb3JrIGlzIGluLXByb2dyZXNzIG9uIGJldHRlciB0b29scyB0byBzdXBwb3J0IGdlbmVyYXRpbmcgSmF2YQ0KLWNsYXNzZXMgYW5kIGNvcnJlc3BvbmRpbmcgSmlCWCBiaW5kaW5nIGRlZmluaXRpb25zIGZyb20gYW4gaW5wdXQNCi1zY2hlbWEsIGFuZCBhbHNvIGZvciBnZW5lcmF0aW5nIGJpbmRpbmcrc2NoZW1hIGdlbmVyYXRpb24gZnJvbQ0KLWV4aXN0aW5nIGNvZGUuIFRoZXNlIGZlYXR1cmVzIHdpbGwgYmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBBeGlzMg0KLUppQlggc3VwcG9ydCB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS4gQ2hlY2sgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuamlieC5vcmciPkppQlggcHJvamVjdCBzaXRlPC9hPiBmb3IgdXBkYXRlcyBvbiBKaUJYLA0KLWFuZCB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5zb3Nub3NraS5jb20vamlieC13aWtpL3NwYWNlL2F4aXMyLWppYngiPkppQlggQXhpczINCi1XaWtpIHBhZ2U8L2E+IGZvciB1cGRhdGVkIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIEppQlggd2l0aA0KLUF4aXMyLjwvcD4NCi08aDI+UmVmZXJlbmNlczwvaDI+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2ppYnguc291cmNlZm9yZ2UubmV0L3R1dG9yaWFsL2JpbmRpbmctdHV0b3JpYWwuaHRtbCI+SmlCWDoNCi1CaW5kaW5ncyBUdXRvcmlhbDwvYT48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvamlieC9qaWJ4LWRvY2xpdC1leGFtcGxlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtZG9jbGl0LWV4YW1wbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDBlNDRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtZG9jbGl0LWV4YW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkppQlggZ2VuZXJhbCBkb2N1bWVudC9saXRlcmFsPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPkppQlggZ2VuZXJhbCBkb2N1bWVudC9saXRlcmFsPC9oMT4NCi08cD5Db2RlIGdlbmVyYXRpb24gZm9yIEppQlggZGF0YSBiaW5kaW5nIGNvbnZlcnRzIG9wZXJhdGlvbnMNCi1kZWZpbmVkIGJ5IGEgV2ViIHNlcnZpY2UgdG8gbWV0aG9kIGNhbGxzLiBXaXRoIGdlbmVyYWwNCi1kb2N1bWVudC9saXRlcmFsIChkb2MvbGl0KSBXZWIgc2VydmljZXMgdGhlIGdlbmVyYXRlZCBtZXRob2RzIGVhY2gNCi10YWtlIGEgc2luZ2xlIHBhcmFtZXRlciBvYmplY3QgYW5kIHJldHVybiBhIHNpbmdsZSByZXN1bHQgb2JqZWN0Lg0KLUhlcmUncyBhIHNhbXBsZSBkb2MvbGl0IFdTREwgKHBhcnRpYWwpIGJ5IHdheSBvZiBhbiBleGFtcGxlOjwvcD4NCi08cHJlPg0KLSZsdDt3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3dzZGwiDQotICAgIHhtbG5zOnRucz0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIg0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iJmd0Ow0KLSAgICANCi0gICZsdDt3c2RsOnR5cGVzJmd0Ow0KLSAgDQotICAgICZsdDtzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyINCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICAgICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJnZXRCb29rIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImlzYm4iIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImJvb2siIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOkJvb2tJbmZvcm1hdGlvbiIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iYWRkQm9vayImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpc2JuIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJhdXRob3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9ImFkZEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdWNjZXNzIiB0eXBlPSJib29sZWFuIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQm9va0luZm9ybWF0aW9uIiZndDsNCi0gICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iYXV0aG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGl0bGUiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ic3RyaW5nIi8mZ3Q7DQotICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlzYm4iIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgDQotICAgICZsdDsvc2NoZW1hJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnR5cGVzJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVxdWVzdCImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmdldEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IGVsZW1lbnQ9InduczpnZXRCb29rUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJhZGRCb29rUmVxdWVzdCImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmFkZEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9ImFkZEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmFkZEJvb2tSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDpwb3J0VHlwZSBuYW1lPSJMaWJyYXJ5IiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9ImdldEJvb2siJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG1lc3NhZ2U9InduczpnZXRCb29rUmVxdWVzdCIgbmFtZT0iZ2V0Qm9va1JlcXVlc3QiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmdldEJvb2tSZXNwb25zZSIgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRCb29rIiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBtZXNzYWdlPSJ3bnM6YWRkQm9va1JlcXVlc3QiIG5hbWU9ImFkZEJvb2tSZXF1ZXN0Ii8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG1lc3NhZ2U9InduczphZGRCb29rUmVzcG9uc2UiIG5hbWU9ImFkZEJvb2tSZXNwb25zZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnBvcnRUeXBlJmd0Ow0KLSAgLi4uDQotJmx0Oy93c2RsOmRlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPlRoaXMgV1NETCBkZWZpbmVzIGEgc2VydmljZSB3aXRoIGp1c3QgdHdvIG9wZXJhdGlvbnM6DQotPGI+Z2V0Qm9vazwvYj4gYW5kIDxiPmFkZEJvb2s8L2I+LiBUaGUgPGI+Z2V0Qm9vazwvYj4gb3BlcmF0aW9uDQotdGFrZXMgYSA8aT5nZXRCb29rPC9pPiBlbGVtZW50IGFzIGlucHV0LCBhbmQgcmV0dXJucyBhDQotPGk+Z2V0Qm9va1Jlc3BvbnNlPC9pPiBlbGVtZW50IGFzIG91dHB1dCwgd2hpbGUgPGI+YWRkQm9vazwvYj4NCi10YWtlcyBhbiA8aT5hZGRCb29rPC9pPiBlbGVtZW50IGFzIGlucHV0IGFuZCByZXR1cm5zIGFuDQotPGk+YWRkQm9va1Jlc3BvbnNlPC9pPiBhcyBvdXRwdXQuIEhlcmUncyB0aGUgYm9keSBvZiB0aGUgY2xpZW50DQotaW50ZXJmYWNlIGdlbmVyYXRlZCBieSB0aGUgc3RhbmRhcmQgSmlCWCBjb2RlIGdlbmVyYXRpb246PC9wPg0KLTxwcmU+DQotICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeUppYnhVbndyYXBwZWQgew0KLSAgICAgICAgICANCi0gICAgICAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmVzDQotICAgICAgICAgKiBAcGFyYW0gYWRkQm9vaw0KLSAgICAgICAgICovDQotICAgICAgICAgcHVibGljIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYngud3JhcHBlcnMuQWRkQm9va1Jlc3BvbnNlIGFkZEJvb2soDQotICAgICAgICAgY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC53cmFwcGVycy5BZGRCb29rUmVxdWVzdCBhZGRCb29rKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uDQotICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgIDsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlcw0KLSAgICAgICAgICogQHBhcmFtIGdldEJvb2sNCi0gICAgICAgICAqLw0KLSAgICAgICAgIHB1YmxpYyBjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXNwb25zZSBnZXRCb29rKA0KLSAgICAgICAgIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYngud3JhcHBlcnMuR2V0Qm9va1JlcXVlc3QgZ2V0Qm9vaykgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbg0KLSAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICA7DQotICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgDQotICAgICAgIC8vDQotICAgICAgIH0NCi08L3ByZT4NCi08cD5Zb3UgY2FuIHNlZSB0aGF0IHRoZSBKaUJYIGNvZGUgZ2VuZXJhdGlvbiBjb252ZXJ0ZWQgdGhlDQotb3BlcmF0aW9ucyBpbnRvIHNpbXBsZSBtZXRob2QgY2FsbCBpbnRlcmZhY2VzIHVzaW5nIG9iamVjdHMNCi1jb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGVsZW1lbnRzIG9mIHRoZSBvcGVyYXRpb24NCi0oc2VlIDxhIGhyZWY9Ii4vamlieC11bndyYXBwZWQtZXhhbXBsZS5odG1sIj5KaUJYIFVud3JhcHBlZA0KLUV4YW1wbGU8L2E+IGZvciB0aGUgaW50ZXJmYWNlIGdlbmVyYXRlZCB3aGVuIHVud3JhcHBpbmcgaXMgaW5zdGVhZA0KLXVzZWQpLiBUaGUgc2VydmVyLXNpZGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lLjwvcD4NCi08cD5Zb3UgbmVlZCB0byBzdXBwbHkgYW4gYXBwcm9wcmlhdGUgSmlCWCBiaW5kaW5nIGRlZmluaXRpb24gZm9yDQotdXNlIGluIGNvZGUgZ2VuZXJhdGlvbiAodXNpbmcgdGhlIDxpPi1FYmluZGluZ2ZpbGUge2ZpbGV9PC9pPg0KLXBhcmFtZXRlciBmb3IgV1NETDJKYXZhIC0gc2VlIDxhIGhyZWY9DQotIi4vamlieC1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwjY29kZWdlbiI+SmlCWCBDb2RlZ2VuIEludGVncmF0aW9uDQotLSBXU0RMMkphdmEgdXNhZ2U8L2E+IGZvciBtb3JlIGRldGFpbHMpLiBUaGlzIG11c3QgZGVmaW5lIGNvbmNyZXRlDQotPGk+bWFwcGluZ3M8L2k+IGZvciBlYWNoIGVsZW1lbnQgdXNlZCBhcyB0aGUgaW5wdXQgb3Igb3V0cHV0IG9mIGFuDQotb3BlcmF0aW9uLiBUaGUgSmlCWCBjb2RlIGdlbmVyYXRpb24gZXh0ZW5zaW9uIG1hdGNoZXMgdGhlIGVsZW1lbnQNCi1uYW1lcyB0byB0aGUgYmluZGluZyBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MNCi10byB1c2UgaW4gZ2VuZXJhdGVkIGNvZGUuPC9wPg0KLTxwPkZvciBleGFtcGxlLCBoZXJlJ3MgYSBiaW5kaW5nIGRlZmluaXRpb24gdGhhdCBtYXRjaGVzIHRoZSBhYm92ZQ0KLVdTREw6PC9wPg0KLTxwcmU+DQotJmx0O2JpbmRpbmcgYWRkLWNvbnN0cnVjdG9ycz0idHJ1ZSImZ3Q7DQotDQotICAmbHQ7bmFtZXNwYWNlIHVyaT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIiBkZWZhdWx0PSJlbGVtZW50cyIvJmd0Ow0KLSAgDQotICAmbHQ7bWFwcGluZyBuYW1lPSJnZXRCb29rIg0KLSAgICAgIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXF1ZXN0IiZndDsNCi0gICAgJmx0O3ZhbHVlIG5hbWU9ImlzYm4iIGZpZWxkPSJtX2lzYm4iLyZndDsNCi0gICZsdDsvbWFwcGluZyZndDsNCi0gIA0KLSAgJmx0O21hcHBpbmcgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIg0KLSAgICAgIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICZsdDtzdHJ1Y3R1cmUgbmFtZT0iYm9vayIgZmllbGQ9Im1fYm9vayIvJmd0Ow0KLSAgJmx0Oy9tYXBwaW5nJmd0Ow0KLSAgDQotICAmbHQ7bWFwcGluZyBuYW1lPSJhZGRCb29rIg0KLSAgICAgIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LndyYXBwZXJzLkFkZEJvb2tSZXF1ZXN0IiZndDsNCi0gICAgJmx0O3N0cnVjdHVyZSBmaWVsZD0ibV9ib29rIiZndDsNCi0gICAgICAmbHQ7dmFsdWUgbmFtZT0idHlwZSIgZmllbGQ9Im1fdHlwZSIvJmd0Ow0KLSAgICAgICZsdDt2YWx1ZSBuYW1lPSJpc2JuIiBmaWVsZD0ibV9pc2JuIi8mZ3Q7DQotICAgICAgJmx0O2NvbGxlY3Rpb24gZmllbGQ9Im1fYXV0aG9ycyImZ3Q7DQotICAgICAgICAmbHQ7dmFsdWUgbmFtZT0iYXV0aG9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7DQotICAgICAgJmx0Oy9jb2xsZWN0aW9uJmd0Ow0KLSAgICAgICZsdDt2YWx1ZSBuYW1lPSJ0aXRsZSIgZmllbGQ9Im1fdGl0bGUiLyZndDsNCi0gICAgJmx0Oy9zdHJ1Y3R1cmUmZ3Q7DQotICAmbHQ7L21hcHBpbmcmZ3Q7DQotICANCi0gICZsdDttYXBwaW5nIG5hbWU9ImFkZEJvb2tSZXNwb25zZSINCi0gICAgICBjbGFzcz0iY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC53cmFwcGVycy5BZGRCb29rUmVzcG9uc2UiLyZndDsNCi0gIA0KLSAgJmx0O21hcHBpbmcgYWJzdHJhY3Q9InRydWUiIGNsYXNzPSJjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LmJlYW5zLkJvb2siJmd0Ow0KLSAgICAmbHQ7dmFsdWUgbmFtZT0idHlwZSIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1fdHlwZSIvJmd0Ow0KLSAgICAmbHQ7dmFsdWUgbmFtZT0iaXNibiIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1faXNibiIvJmd0Ow0KLSAgICAmbHQ7Y29sbGVjdGlvbiBmaWVsZD0ibV9hdXRob3JzIiZndDsNCi0gICAgICAmbHQ7dmFsdWUgbmFtZT0iYXV0aG9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7DQotICAgICZsdDsvY29sbGVjdGlvbiZndDsNCi0gICAgJmx0O3ZhbHVlIG5hbWU9InRpdGxlIiBmaWVsZD0ibV90aXRsZSIvJmd0Ow0KLSAgJmx0Oy9tYXBwaW5nJmd0Ow0KLQ0KLSZsdDsvYmluZGluZyZndDsNCi08L3ByZT4NCi08cD5BbmQgaGVyZSBhcmUgdGhlIGFjdHVhbCBkYXRhIG9iamVjdCBjbGFzc2VzOjwvcD4NCi08cHJlPg0KLXBhY2thZ2UgY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC53cmFwcGVyczsNCi0NCi1pbXBvcnQgY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC5iZWFucy5Cb29rOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRCb29rUmVxdWVzdA0KLXsNCi0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsNCi0gICAgDQotICAgIHB1YmxpYyBBZGRCb29rUmVxdWVzdChCb29rIGJvb2spIHsNCi0gICAgICAgIG1fYm9vayA9IGJvb2s7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBCb29rIGdldEJvb2soKSB7DQotICAgICAgICByZXR1cm4gbV9ib29rOw0KLSAgICB9DQotfQ0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRCb29rUmVzcG9uc2UNCi17DQotfQ0KLQ0KLXB1YmxpYyBjbGFzcyBHZXRCb29rUmVxdWVzdA0KLXsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOw0KLSAgICANCi0gICAgcHVibGljIEdldEJvb2tSZXF1ZXN0KFN0cmluZyBpc2JuKSB7DQotICAgICAgICBtX2lzYm4gPSBpc2JuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNibigpIHsNCi0gICAgICAgIHJldHVybiBtX2lzYm47DQotICAgIH0NCi19DQotDQotcHVibGljIGNsYXNzIEdldEJvb2tSZXNwb25zZQ0KLXsNCi0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsNCi0gICAgDQotICAgIHB1YmxpYyBHZXRCb29rUmVzcG9uc2UoQm9vayBib29rKSB7DQotICAgICAgICBtX2Jvb2sgPSBib29rOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQm9vayBnZXRCb29rKCkgew0KLSAgICAgICAgcmV0dXJuIG1fYm9vazsNCi0gICAgfQ0KLX0NCi0NCi1wYWNrYWdlIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYnguYmVhbnM7DQotDQotcHVibGljIGNsYXNzIEJvb2sNCi17DQotICAgIHByaXZhdGUgU3RyaW5nIG1fdHlwZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOw0KLSAgICBwcml2YXRlIFN0cmluZyBtX3RpdGxlOw0KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1fYXV0aG9yczsNCi0gICAgDQotICAgIHB1YmxpYyBCb29rKCkge30NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG1fdHlwZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRJc2JuKCkgew0KLSAgICAgICAgcmV0dXJuIG1faXNibjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsNCi0gICAgICAgIHJldHVybiBtX3RpdGxlOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXV0aG9ycygpIHsNCi0gICAgICAgIHJldHVybiBtX2F1dGhvcnM7DQotICAgIH0NCi19DQotPC9wcmU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvamlieC9qaWJ4LXVud3JhcHBlZC1leGFtcGxlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtdW53cmFwcGVkLWV4YW1wbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRhMGQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qaWJ4L2ppYngtdW53cmFwcGVkLWV4YW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkppQlggdW53cmFwcGVkIGRvY3VtZW50L2xpdGVyYWw8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+SmlCWCBVbndyYXBwZWQgZG9jdW1lbnQvbGl0ZXJhbDwvaDE+DQotPHA+Q29kZSBnZW5lcmF0aW9uIGZvciBKaUJYIGRhdGEgYmluZGluZyBjb252ZXJ0cyBvcGVyYXRpb25zDQotZGVmaW5lZCBieSBhIFdlYiBzZXJ2aWNlIHRvIG1ldGhvZCBjYWxscy4gSW4gdGhlIG1vc3QgZ2VuZXJhbCBjYXNlDQotb2YgZG9jdW1lbnQvbGl0ZXJhbCAoZG9jL2xpdCkgV2ViIHNlcnZpY2VzIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcw0KLWVhY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgb2JqZWN0IGFuZCByZXR1cm4gYSBzaW5nbGUgcmVzdWx0DQotb2JqZWN0LiBUaGlzIHR5cGUgb2YgaW50ZXJmYWNlIGNhbiBiZSBwYWluZnVsIGZvciBkZXZlbG9wZXJzDQotYmVjYXVzZSBpdCBhZGRzIGJvdGggYSBsYXllciBvZiBpbmRpcmVjdGlvbiBhbmQgcG90ZW50aWFsbHkgYSBsYXJnZQ0KLW51bWJlciBvZiBleHRyYSBjbGFzc2VzIChvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgY2xhc3MgZm9yIGVhY2gNCi1nZW5lcmF0ZWQgbWV0aG9kKS48L3A+DQotPHA+Rm9ydHVuYXRlbHksIHRoZXJlJ3MgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGdlbmVyYXRpbmcgbWV0aG9kcw0KLXRoYXQgZ2l2ZXMgYSBtdWNoIG1vcmUgdXNhYmxlIEFQSSBmb3IgbWFueSBXZWIgc2VydmljZXMuIFRoaXMNCi1hbHRlcm5hdGl2ZSBpcyBjYWxsZWQgPGk+dW53cmFwcGluZzwvaT4sIGFuZCB0aGUgc2VydmljZQ0KLWRlZmluaXRpb25zIHRoYXQgaXQgYXBwbGllcyB0byBhcmUgY2FsbGVkIDxpPndyYXBwZWQ8L2k+DQotZGVmaW5pdGlvbnMuIFRoZSBrZXkgZGlmZmVyZW5jZSB0aGF0IHF1YWxpZmllcyBhIHNlcnZpY2UgZGVmaW5pdGlvbg0KLWFzIHdyYXBwZWQgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBlbGVtZW50cyB1c2VkDQotZm9yIG9wZXJhdGlvbnMuPC9wPg0KLTxwPkhlcmUncyBhIHNhbXBsZSB3cmFwcGVkIFdTREwgKHBhcnRpYWwpIGJ5IHdheSBvZiBhbiBleGFtcGxlOjwvcD4NCi08cHJlPg0KLSZsdDt3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3dzZGwiDQotICAgIHhtbG5zOnRucz0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIg0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iJmd0Ow0KLSAgICANCi0gICZsdDt3c2RsOnR5cGVzJmd0Ow0KLSAgDQotICAgICZsdDtzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyINCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICAgICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJnZXRCb29rIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImlzYm4iIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImJvb2siIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOkJvb2tJbmZvcm1hdGlvbiIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iYWRkQm9vayImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpc2JuIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJhdXRob3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9ImFkZEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdWNjZXNzIiB0eXBlPSJib29sZWFuIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQm9va0luZm9ybWF0aW9uIiZndDsNCi0gICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iYXV0aG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGl0bGUiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ic3RyaW5nIi8mZ3Q7DQotICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlzYm4iIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvJmd0Ow0KLSAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgDQotICAgICZsdDsvc2NoZW1hJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnR5cGVzJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVxdWVzdCImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmdldEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IGVsZW1lbnQ9InduczpnZXRCb29rUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJhZGRCb29rUmVxdWVzdCImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmFkZEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9ImFkZEJvb2tSZXNwb25zZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgZWxlbWVudD0id25zOmFkZEJvb2tSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDpwb3J0VHlwZSBuYW1lPSJMaWJyYXJ5IiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9ImdldEJvb2siJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG1lc3NhZ2U9InduczpnZXRCb29rUmVxdWVzdCIgbmFtZT0iZ2V0Qm9va1JlcXVlc3QiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmdldEJvb2tSZXNwb25zZSIgbmFtZT0iZ2V0Qm9va1Jlc3BvbnNlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRCb29rIiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBtZXNzYWdlPSJ3bnM6YWRkQm9va1JlcXVlc3QiIG5hbWU9ImFkZEJvb2tSZXF1ZXN0Ii8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG1lc3NhZ2U9InduczphZGRCb29rUmVzcG9uc2UiIG5hbWU9ImFkZEJvb2tSZXNwb25zZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnBvcnRUeXBlJmd0Ow0KLSAgLi4uDQotJmx0Oy93c2RsOmRlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPlRoaXMgV1NETCBkZWZpbmVzIGEgc2VydmljZSB3aXRoIGp1c3QgdHdvIG9wZXJhdGlvbnM6DQotPGI+Z2V0Qm9vazwvYj4gYW5kIDxiPmFkZEJvb2s8L2I+LiBUaGUgPGI+Z2V0Qm9vazwvYj4gb3BlcmF0aW9uDQotdGFrZXMgYSA8aT5nZXRCb29rPC9pPiBlbGVtZW50IGFzIGlucHV0LCBhbmQgcmV0dXJucyBhDQotPGk+Z2V0Qm9va1Jlc3BvbnNlPC9pPiBlbGVtZW50IGFzIG91dHB1dCwgd2hpbGUgPGI+YWRkQm9vazwvYj4NCi10YWtlcyBhbiA8aT5hZGRCb29rPC9pPiBlbGVtZW50IGFzIGlucHV0IGFuZCByZXR1cm5zIGFuDQotPGk+YWRkQm9va1Jlc3BvbnNlPC9pPiBhcyBvdXRwdXQuIEVhY2ggb2YgdGhlc2UgaW5wdXQgYW5kIG91dHB1dA0KLWVsZW1lbnRzIGluIHR1cm4gY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBjaGlsZCBlbGVtZW50cywgd2l0aA0KLXNvbWUgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIGRlZmluZWQgZGlyZWN0bHkgdXNpbmcgc3RhbmRhcmQgc2NoZW1hDQotdHlwZXMgYW5kIG90aGVycyByZWZlcmVuY2luZyB1c2VyLWRlZmluZWQgc2NoZW1hIHR5cGVzLjwvcD4NCi08cD5BcyBJIHNhaWQgdXAgZnJvbnQsIHRoaXMgV1NETCBxdWFsaWZpZXMgZm9yIHVud3JhcHBlZCBoYW5kbGluZw0KLXVzaW5nIEppQlguIEhlcmUncyB0aGUgYm9keSBvZiB0aGUgY2xpZW50IGludGVyZmFjZSBnZW5lcmF0ZWQgd2hlbg0KLXVzaW5nIHVud3JhcHBpbmcgKHRoZSA8aT4tdXc8L2k+IG9wdGlvbiBmb3IgV1NETDJKYXZhKTo8L3A+DQotPHByZT4NCi0gICAgcHVibGljIGludGVyZmFjZSBMaWJyYXJ5SmlieFVud3JhcHBlZCB7DQotICAgICAgICAgIA0KLSAgICAgICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZXMNCi0gICAgICAgICAqIEBwYXJhbSB0eXBlKiBAcGFyYW0gaXNibiogQHBhcmFtIGF1dGhvciogQHBhcmFtIHRpdGxlDQotICAgICAgICAgKi8NCi0gICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRCb29rKA0KLSAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZSxqYXZhLmxhbmcuU3RyaW5nIGlzYm4samF2YS5sYW5nLlN0cmluZ1tdIGF1dGhvcixqYXZhLmxhbmcuU3RyaW5nIHRpdGxlKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uDQotICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgIDsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlcw0KLSAgICAgICAgICogQHBhcmFtIGlzYm4NCi0gICAgICAgICAqLw0KLSAgICAgICAgIHB1YmxpYyBjb20uc29zbm9za2kud3MubGlicmFyeS5qaWJ4LmJlYW5zLkJvb2sgZ2V0Qm9vaygNCi0gICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIGlzYm4pIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24NCi0gICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgOw0KLSAgICAgICAgICAgICANCi0NCi0gICAgICAgIA0KLSAgICAgICAvLw0KLSAgICAgICB9DQotPC9wcmU+DQotPHA+WW91IGNhbiBzZWUgdGhhdCB0aGUgSmlCWCBjb2RlIGdlbmVyYXRpb24gY29udmVydGVkIHRoZQ0KLW9wZXJhdGlvbnMgaW50byBzaW1wbGUgbWV0aG9kIGNhbGwgaW50ZXJmYWNlcyB3aXRob3V0IGludHJvZHVjaW5nDQotYW55IGV4dHJhbmVvdXMgb2JqZWN0cyAoc2VlIDxhIGhyZWY9DQotIi4vamlieC1kb2NsaXQtZXhhbXBsZS5odG1sIj5KaUJYIERvY3VtZW50L0xpdGVyYWwgRXhhbXBsZTwvYT4gZm9yDQotdGhlIGludGVyZmFjZSBnZW5lcmF0ZWQgd2hlbiB1bndyYXBwaW5nIGlzIG5vdCB1c2VkKS4gVGhlDQotc2VydmVyLXNpZGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lLjwvcD4NCi08cD5UaGUga2V5IHBvaW50cyB0aGF0IGFsbG93IHVud3JhcHBlZCBoYW5kbGluZyB3aXRoIEppQlggYXJlOjwvcD4NCi08b2w+DQotPGxpPkVhY2ggb3BlcmF0aW9uIGVpdGhlciBhY2NlcHRzIG5vIGlucHV0LCBvciB0aGUgaW5wdXQgY29uc2lzdHMNCi1vZiBhIHNpbmdsZSBlbGVtZW50LjwvbGk+DQotPGxpPkVhY2ggaW5wdXQgZWxlbWVudCBpcyBkZWZpbmVkIGFzIGEgc2NoZW1hIDxpPmNvbXBsZXhUeXBlPC9pPg0KLWNvbnNpc3Rpbmcgb2YgYSA8aT5zZXF1ZW5jZTwvaT4gb2YgYW55IG51bWJlciBvZiBjaGlsZA0KLWVsZW1lbnRzLjwvbGk+DQotPGxpPkVhY2ggb3BlcmF0aW9uIGVpdGhlciBnZW5lcmF0ZXMgbm8gb3V0cHV0LCBvciB0aGUgb3V0cHV0DQotY29uc2lzdHMgb2YgYSBzaW5nbGUgZWxlbWVudC48L2xpPg0KLTxsaT5FYWNoIG91dHB1dCBlbGVtZW50IGlzIGRlZmluZWQgYXMgYSBzY2hlbWEgPGk+Y29tcGxleFR5cGU8L2k+DQotY29uc2lzdGluZyBvZiBhIDxpPnNlcXVlbmNlPC9pPiB0aGF0J3MgZWl0aGVyIGVtcHR5IG9yIGNvbnRhaW5zIGENCi1zaW5nbGUgY2hpbGQgZWxlbWVudC48L2xpPg0KLTxsaT5UaGUgY2hpbGQgZWxlbWVudHMgb2YgYm90aCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIGRlZmluZWQgdXNpbmcNCi08aT50eXBlPC9pPiByZWZlcmVuY2VzLCByYXRoZXIgdGhhbiBhbiBlbWJlZGRlZCB0eXBlDQotZGVmaW5pdGlvbnMuPC9saT4NCi08L29sPg0KLTxwPllvdSBhbHNvIG5lZWQgdG8gc3VwcGx5IGFuIGFwcHJvcHJpYXRlIEppQlggYmluZGluZyBkZWZpbml0aW9uDQotKHVzaW5nIHRoZSA8aT4tRWJpbmRpbmdmaWxlIHtmaWxlfTwvaT4gcGFyYW1ldGVyIGZvciBXU0RMMkphdmEgLQ0KLXNlZSA8YSBocmVmPSIuL2ppYngtY29kZWdlbi1pbnRlZ3JhdGlvbi5odG1sI2NvZGVnZW4iPkppQlggQ29kZWdlbg0KLUludGVncmF0aW9uIC0gV1NETDJKYXZhIHVzYWdlPC9hPiBmb3IgbW9yZSBkZXRhaWxzKS4gVGhpcyBtdXN0DQotZGVmaW5lIGFic3RyYWN0IDxpPm1hcHBpbmc8L2k+cyBmb3IgdGhlIDxpPmNvbXBsZXhUeXBlPC9pPnMNCi1yZWZlcmVuY2VkIGJ5IGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBpbnB1dHMgYW5kIG91dHB1dHMsIHdpdGggYQ0KLTxpPnR5cGUtbmFtZTwvaT4gYXR0cmlidXRlIG1hdGNoaW5nIHRoZSBzY2hlbWEgPGk+Y29tcGxleFR5cGU8L2k+DQotbmFtZS4gSWYgdGhlIGNoaWxkIGVsZW1lbnRzIHJlZmVyZW5jZSBzY2hlbWEgPGk+c2ltcGxlVHlwZTwvaT4NCi1kZWZpbml0aW9ucyB0aGUgYmluZGluZyBtdXN0IGFsc28gZGVmaW5lIGEgPGk+Zm9ybWF0PC9pPnMgZm9yIGVhY2gNCi08aT5zaW1wbGVUeXBlPC9pPiwgd2l0aCBhIDxpPmxhYmVsPC9pPiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlDQotc2NoZW1hIDxpPnNpbXBsZVR5cGU8L2k+IG5hbWUuIFRoZSBiaW5kaW5nIGRlZmluaXRpb24gbXVzdCBhbHNvDQotc3BlY2lmeSB0aGUgPGk+Zm9yY2UtY2xhc3Nlcz0ndHJ1ZSc8L2k+IGF0dHJpYnV0ZSBvbiB0aGUNCi08aT5iaW5kaW5nPC9pPiBlbGVtZW50LjwvcD4NCi08cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGEgYmluZGluZyBkZWZpbml0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYWJvdmUNCi1XU0RMOjwvcD4NCi08cHJlPg0KLSZsdDtiaW5kaW5nIGZvcmNlLWNsYXNzZXM9InRydWUiIHhtbG5zOnRucz0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3R5cGVzIiZndDsNCi0NCi0gICZsdDtuYW1lc3BhY2UgdXJpPSJodHRwOi8vd3Muc29zbm9za2kuY29tL2xpYnJhcnkvdHlwZXMiIGRlZmF1bHQ9ImVsZW1lbnRzIi8mZ3Q7DQotICANCi0gICZsdDttYXBwaW5nIGFic3RyYWN0PSJ0cnVlIiBjbGFzcz0iY29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC5iZWFucy5Cb29rIg0KLSAgICAgIHR5cGUtbmFtZT0idG5zOkJvb2tJbmZvcm1hdGlvbiImZ3Q7DQotICAgICZsdDt2YWx1ZSBuYW1lPSJ0eXBlIiBzdHlsZT0iYXR0cmlidXRlIiBmaWVsZD0ibV90eXBlIi8mZ3Q7DQotICAgICZsdDt2YWx1ZSBuYW1lPSJpc2JuIiBzdHlsZT0iYXR0cmlidXRlIiBmaWVsZD0ibV9pc2JuIi8mZ3Q7DQotICAgICZsdDtjb2xsZWN0aW9uIGZpZWxkPSJtX2F1dGhvcnMiJmd0Ow0KLSAgICAgICZsdDt2YWx1ZSBuYW1lPSJhdXRob3IiLyZndDsNCi0gICAgJmx0Oy9jb2xsZWN0aW9uJmd0Ow0KLSAgICAmbHQ7dmFsdWUgbmFtZT0idGl0bGUiIGZpZWxkPSJtX3RpdGxlIi8mZ3Q7DQotICAmbHQ7L21hcHBpbmcmZ3Q7DQotICANCi0mbHQ7L2JpbmRpbmcmZ3Q7DQotPC9wcmU+DQotPHA+QW5kIGhlcmUncyB0aGUgYWN0dWFsDQotPGNvZGU+Y29tLnNvc25vc2tpLndzLmxpYnJhcnkuamlieC5iZWFucy5Cb29rPC9jb2RlPiBjbGFzczo8L3A+DQotPHByZT4NCi1wYWNrYWdlIGNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYnguYmVhbnM7DQotDQotcHVibGljIGNsYXNzIEJvb2sNCi17DQotICAgIHByaXZhdGUgU3RyaW5nIG1fdHlwZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOw0KLSAgICBwcml2YXRlIFN0cmluZyBtX3RpdGxlOw0KLSAgICBwcml2YXRlIFN0cmluZ1tdIG1fYXV0aG9yczsNCi0gICAgDQotICAgIHB1YmxpYyBCb29rKCkge30NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG1fdHlwZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRJc2JuKCkgew0KLSAgICAgICAgcmV0dXJuIG1faXNibjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsNCi0gICAgICAgIHJldHVybiBtX3RpdGxlOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXV0aG9ycygpIHsNCi0gICAgICAgIHJldHVybiBtX2F1dGhvcnM7DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+VGhlIEppQlggY29kZSBnZW5lcmF0aW9uIGZvciBBeGlzMiBjdXJyZW50bHkgcmVxdWlyZXMgdGhhdA0KLWNsYXNzZXMgY29yZXNwb25kaW5nIHRvIHVud3JhcHBlZCBjaGlsZCBlbGVtZW50cyAoc3VjaCBhcw0KLTxjb2RlPmNvbS5zb3Nub3NraS53cy5saWJyYXJ5LmppYnguYmVhbnMuQm9vazwvY29kZT4sIGluIHRoaXMgY2FzZSkNCi1wcm92aWRlIHB1YmxpYyBkZWZhdWx0IChuby1hcmd1bWVudCkgY29uc3RydWN0b3JzLjwvcD4NCi08cD5KaUJYIGhhbmRsaW5nIGFsbG93cyB0aGUgY2hpbGQgZWxlbWVudHMgb2YgYm90aCBpbnB1dHMgYW5kDQotb3V0cHV0cyB0byBiZSBvcHRpb25hbCAod2l0aCA8aT5uaWxsYWJsZT0ndHJ1ZSc8L2k+LA0KLTxpPm1pbk9jY3Vycz0nMCc8L2k+LCBvciBib3RoKSwgcHJvdmlkaW5nIHRoZSBiaW5kaW5nIGNvbnZlcnRzDQotdGhlc2UgY2hpbGQgZWxlbWVudHMgdG8gb2JqZWN0IHR5cGVzIHJhdGhlciB0aGFuIHByaW1pdGl2ZSB0eXBlcy4NCi1JdCBhbHNvIGFsbG93cyByZXBlYXRlZCBjaGlsZCBlbGVtZW50cyAod2l0aA0KLTxpPm1pbk9jY3Vycz0ndW5ib3VuZGVkJzwvaT4sIG9yIGFueSB2YWx1ZSBvZiA8aT5taW5PY2N1cnM8L2k+DQotZ3JlYXRlciB0aGFuIG9uZSksIHJlcHJlc2VudGluZyB0aGUgcmVwZWF0ZWQgZWxlbWVudHMgYXMgYXJyYXlzIG9mDQotdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0IG9yIHByaW1pdGl2ZSB0eXBlcy48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvanNvbl9zdXBwb3J0LnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qc29uX3N1cHBvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTYxNTU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9qc29uX3N1cHBvcnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPjwvdGl0bGU+DQotPG1ldGEgbmFtZT0iQVVUSE9SIiBjb250ZW50PSJJc3VydSBTdXJpYXJhY2hjaGkiIC8+DQotPG1ldGEgbmFtZT0iQ1JFQVRFRCIgY29udGVudD0iMjAwNzAyMDM7MzMxNjAwIiAvPg0KLTxtZXRhIG5hbWU9IkNIQU5HRURCWSIgY29udGVudD0iSXN1cnUgU3VyaWFyYWNoY2hpIiAvPg0KLTxtZXRhIG5hbWU9IkNIQU5HRUQiIGNvbnRlbnQ9IjIwMDcwMjA4OzEyMDMxNDAwIiAvPg0KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotLyo8IVtDREFUQVsqLw0KLSAgICAgICAgPCEtLQ0KLUBwYWdlIHsgc2l6ZTogOC41aW4gMTFpbjsgbWFyZ2luOiAwLjc5aW4gfQ0KLVAgeyBtYXJnaW4tYm90dG9tOiAwLjA4aW4gfQ0KLS0tPg0KLQ0KLS8qXV0+Ki8NCi08L3N0eWxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDEgY2xhc3M9InRpdGxlIj5KU09OIFN1cHBvcnQgaW4gQXhpczI8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlIEpTT04gc3VwcG9ydCBpbXBsZW1lbnRhdGlvbiBpbiBBeGlzMi4NCi1JdCBpbmNsdWRlcyBhbiBpbnRyb2R1Y3Rpb24gdG8gSlNPTiwgYW4gb3V0bGluZSBhcyB0byB3aHkgSlNPTg0KLXN1cHBvcnQgaXMgdXNlZnVsIHRvIEF4aXMyIGFuZCBob3cgaXQgc2hvdWxkIGJlIHVzZWQuIFRoaXMgZG9jdW1lbnQNCi1hbHNvIHByb3ZpZGVzIGRldGFpbHMgb24gdGVzdCBjYXNlcyBhbmQgc2FtcGxlcy48L3A+DQotPGgzPldoYXQgaXMgSlNPTj88L2gzPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuanNvbi5vcmcvIj5KU09OPC9hPiAoSmF2YSBTY3JpcHQgT2JqZWN0DQotTm90YXRpb24pIGlzIGFub3RoZXIgZGF0YSBleGNoYW5nZWFibGUgZm9ybWF0IGxpa2UgWE1MLCBidXQgbW9yZQ0KLWxpZ2h0d2VpZ2h0IGFuZCBlYXNpbHkgcmVhZGFibGUuIEl0IGlzIGJhc2VkIG9uIGEgc3Vic2V0IG9mIHRoZQ0KLUphdmFTY3JpcHQgbGFuZ3VhZ2UuIFRoZXJlZm9yZSwgSmF2YVNjcmlwdCBjYW4gdW5kZXJzdGFuZCBKU09OLCBhbmQNCi1pdCBjYW4gbWFrZSBKYXZhU2NyaXB0IG9iamVjdHMgYnkgdXNpbmcgSlNPTiBzdHJpbmdzLiBKU09OIGlzIGJhc2VkDQotb24ga2V5LXZhbHVlIHBhaXJzIGFuZCBpdCB1c2VzIGNvbG9ucyB0byBzZXBhcmF0ZSBrZXlzIGFuZCB2YWx1ZXMuDQotSlNPTiBkb2Vzbid0IHVzZSBlbmQgdGFncywgYW5kIGl0IHVzZXMgYnJhY2VzIChjdXJseSBicmFja2V0cykgdG8NCi1lbmNsb3NlIEpTT04gT2JqZWN0cy48L3A+DQotPHA+PGZvbnQgc2l6ZT0iMyI+ZS5nLiA8Zm9udCBzaXplPSIyIj4mbHQ7cm9vdCZndDsmbHQ7dGVzdCZndDtqc29uDQotb2JqZWN0Jmx0Oy90ZXN0Jmd0OyZsdDsvcm9vdCZndDsgPT0NCi17e2pzb24gb2JqZWN0fX08L2ZvbnQ+PC9mb250PjwvcD4NCi08cD5XaGVuIGl0IGNvbWVzIHRvIGNvbnZlcnRpbmcgWE1MIHRvIEpTT04gYW5kIHZpY2UgdmVyc2EsIHRoZXJlDQotYXJlIHR3byBtYWpvciBjb252ZW50aW9ucywgb25lIG5hbWVkICI8YSBocmVmPQ0KLSJodHRwOi8vYmFkZ2VyZmlzaC5uaW5nLmNvbS8iPkJhZGdlcmZpc2g8L2E+IiBhbmQgdGhlIG90aGVyLA0KLU1hcHBlZC4gVGhlIG1haW4gZGlmZmVyZW5jZQ0KLWJldHdlZW4gdGhlc2UgdHdvIGNvbnZlbnRpb25zIGV4aXN0cyBpbiB0aGUgd2F5IHRoZXkgbWFwIFhNTA0KLW5hbWVzcGFjZXMgaW50byBKU09OLjwvcD4NCi08cD48Zm9udCBzaXplPSIzIj5lLmcuIDxmb250IHNpemU9IjIiPiZsdDt4c2w6cm9vdA0KLXhtbG5zOnhzbD0iaHR0cDovL2Zvby5jb20iJmd0OyZsdDtkYXRhJmd0O215IGpzb24NCi1zdHJpbmcmbHQ7L2RhdGEmZ3Q7Jmx0Oy94c2w6cm9vdCZndDs8L2ZvbnQ+PC9mb250PjwvcD4NCi08cD5UaGlzIFhNTCBzdHJpbmcgY2FuIGJlIGNvbnZlcnRlZCBpbnRvIEpTT04gYXMgZm9sbG93cy48L3A+DQotPHA+PGI+VXNpbmcgQmFkZ2VyZmlzaDwvYj48L3A+DQotPHA+PGZvbnQgc2l6ZT0NCi0iMiI+eyJ4c2w6cm9vdCI6eyJAeG1sbnMiOnsieHNsIjoiaHR0cDovL2Zvby5jb20ifSwiZGF0YSI6eyIkIjoibXkNCi1qc29uIHN0cmluZyJ9fX08L2ZvbnQ+PC9wPg0KLTxwPjxiPlVzaW5nIE1hcHBlZDwvYj48L3A+DQotPHA+SWYgd2UgdXNlIHRoZSBuYW1lc3BhY2UgbWFwcGluZyBhcyBodHRwOi8vZm9vLmNvbSAtJmd0OyBmb288L3A+DQotPHA+PGZvbnQgc2l6ZT0iMiI+eyJmb28ucm9vdCI6eyJkYXRhIjoibXkganNvbiBzdHJpbmcifX08L2ZvbnQ+PC9wPg0KLTxwPkpTT04gc3VwcG9ydCBpcyBhIG5ldyBmZWF0dXJlIGluIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyI+QXBhY2hlIEF4aXMyL0phdmE8L2E+LiBJdCB3aWxsIGJlY29tZQ0KLWEgY3J1Y2lhbCBpbXByb3ZlbWVudCBpbiB0aGUgZnV0dXJlIHdpdGggYXBwbGljYXRpb25zIGxpa2UNCi1KYXZhU2NyaXB0IFdlYiBzZXJ2aWNlcy48L3A+DQotPGgyPldoeSBKU09OIFN1cHBvcnQgZm9yIEF4aXMyPzwvaDI+DQotPHA+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvIj5BcGFjaGUgQXhpczI8L2E+IGlzIGEgV2ViDQotc2VydmljZXMgc3RhY2sgdGhhdCBkZWxpdmVycyBpbmNvbWluZyBtZXNzYWdlcyBpbnRvIHRhcmdldA0KLWFwcGxpY2F0aW9ucy4gSW4gbW9zdCBjYXNlcywgdGhlc2UgbWVzc2FnZXMgYXJlIFNPQVAgbWVzc2FnZXMuIEluDQotYWRkaXRpb24sIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc2VuZCBSRVNUIG1lc3NhZ2VzIHRocm91Z2ggQXhpczIuDQotQm90aCB0eXBlcyBvZiBtZXNzYWdlcyB1c2UgWE1MIGFzIHRoZWlyIGRhdGEgZXhjaGFuZ2VhYmxlIGZvcm1hdC4NCi1TbyBpZiB3ZSBjYW4gdXNlIFhNTCBhcyBhIGZvcm1hdCwgd2h5IHVzZSBKU09OIGFzIGFub3RoZXINCi1mb3JtYXQ/PC9wPg0KLTxwPlRoZXJlIGFyZSBtYW55IGFkdmFudGFnZXMgb2YgaW1wbGVtZW50aW5nIEpTT04gc3VwcG9ydCBpbiBBeGlzMi4NCi1NYWlubHksIGl0IGhlbHBzIHRoZSBKYXZhU2NyaXB0IHVzZXJzIChzZXJ2aWNlcyBhbmQgY2xpZW50cyB3cml0dGVuDQotaW4gSmF2YVNjcmlwdCkgdG8gZGVhbCB3aXRoIEF4aXMyLiBXaGVuIHRoZSBzZXJ2aWNlIG9yIHRoZSBjbGllbnQNCi1pcyBpbiBKYXZhU2NyaXB0LCBpdCBjYW4gdXNlIHRoZSBKU09OIHN0cmluZyBhbmQgZGlyZWN0bHkgYnVpbGQNCi1KYXZhU2NyaXB0IG9iamVjdHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24sIHdpdGhvdXQgaGF2aW5nIHRvIGJ1aWxkDQotdGhlIG9iamVjdCBtb2RlbCAoT01FbGVtZW50IGluIEF4aXMyKS4gQWxzbywgSmF2YVNjcmlwdCBzZXJ2aWNlcw0KLWNhbiByZXR1cm4gdGhlIHJlc3BvbnNlIHRocm91Z2ggQXhpczIsIGp1c3QgYXMgYSBKU09OIHN0cmluZyBjYW4gYmUNCi1zaGlwcGVkIGluIGEgSlNPTkRhdGFTb3VyY2UuPC9wPg0KLTxwPk90aGVyIHRoYW4gZm9yIHRoYXQsIHRoZXJlIGFyZSBzb21lIGV4dHJhIGFkdmFudGFnZXMgb2YgdXNpbmcNCi1KU09OIGluIGNvbXBhcmlzb24gdG8gWE1MLiBBbHRob3VnaCB0aGUgY29udmVyc2F0aW9uDQotWE1MIG9yIEpTT04/IGlzIHN0aWxsIGEgaG90IHRvcGljLA0KLW1hbnkgcGVvcGxlIGFjY2VwdCB0aGUgZmFjdCB0aGF0IEpTT04gY2FuIGJlIHBhc3NlZCBhbmQgYnVpbHQgbW9yZQ0KLWVhc2lseSBieSBtYWNoaW5lcyB0aGFuIFhNTC48L3A+DQotPHA+Rm9yIG1vcmUgZGV0YWlscyBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGFyY2hpdGVjdHVyZSwgcmVmZXIgdG8NCi10aGUgYXJ0aWNsZSA8YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS83NjgiPiJKU09OIFN1cHBvcnQgZm9yDQotQXBhY2hlIEF4aXMyIjwvYT48L3A+DQotPGgyPkhvdyB0byB1c2UgSlNPTiBpbiBBeGlzMjwvaDI+DQotPHA+QXQgdGhlIG1vbWVudCBKU09OIGRvZXNuJ3QgaGF2ZSBhIHN0YW5kYXJkIGFuZCB1bmlxdWUgY29udGVudA0KLXR5cGUuIGFwcGxpY2F0aW9uL2pzb24gKHRoaXMgaXMNCi10aGUgY29udGVudCB0eXBlIHdoaWNoIGlzIGFwcHJvdmVkIGluIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0NjI3LnR4dD9udW1iZXI9NDYyNyI+SlNPTiBSRkM8L2E+ICksDQotdGV4dC9qYXZhc2NyaXB0IGFuZA0KLXRleHQvanNvbiBhcmUgc29tZSBvZiB0aGUgY29tbW9ubHkNCi11c2VkIGNvbnRlbnQgdHlwZXMgb2YgSlNPTi4gRHVlIHRvIHRoaXMgcHJvYmxlbSwgaW4gQXhpczIsIHRoZSB1c2VyDQotaGFzIGJlZW4gZ2l2ZW4gdGhlIGZyZWVkb20gb2Ygc2VsZWN0aW5nIHRoZSBjb250ZW50IHR5cGUuPC9wPg0KLTxoMz5TdGVwIDE8L2gzPg0KLTxwPk1hcCB0aGUgYXBwcm9wcmlhdGUgTWVzc2FnZUZvcm1hdHRlciBhbmQgT01CdWlsZGVyIHdpdGggdGhlDQotY29udGVudCB0eXBlIHlvdSBhcmUgdXNpbmcgaW4gdGhlIGF4aXMyLnhtbCBmaWxlLjwvcD4NCi08cD5lLmcuMTogSWYgeW91IGFyZSB1c2luZyB0aGUNCi1NYXBwZWQgY29udmVudGlvbiB3aXRoIHRoZSBjb250ZW50DQotdHlwZSBhcHBsaWNhdGlvbi9qc29uPC9wPg0KLTxwcmU+DQotICAgICAgICAmbHQ7bWVzc2FnZUZvcm1hdHRlcnMmZ3Q7ICAgICAgICANCi0gICAgICAgICAgICAgICAgJmx0O21lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OTWVzc2FnZUZvcm1hdHRlciIvJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7IS0tIG1vcmUgbWVzc2FnZSBmb3JtYXR0ZXJzIC0tJmd0Ow0KLSAgICAgICAgJmx0Oy9tZXNzYWdlRm9ybWF0dGVycyZndDsgICANCi0gICAgDQotICAgICAgICAmbHQ7bWVzc2FnZUJ1aWxkZXJzJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OT01CdWlsZGVyIi8mZ3Q7DQotICAgICAgICAgICAgICAgICZsdDshLS0gbW9yZSBtZXNzYWdlIGJ1aWxkZXJzIC0tJmd0Ow0KLSAgICAgICAgJmx0Oy9tZXNzYWdlQnVpbGRlcnMmZ3Q7DQotPC9wcmU+DQotPHA+ZS5nLjI6IElmIHlvdSBhcmUgdXNpbmcgdGhlDQotQmFkZ2VyZmlzaCBjb252ZW50aW9uIHdpdGggdGhlDQotY29udGVudCB0eXBlIHRleHQvamF2YXNjcmlwdDwvcD4NCi08cHJlPg0KLSAgICAgICAgJmx0O21lc3NhZ2VGb3JtYXR0ZXJzJmd0OyAgICAgICAgDQotICAgICAgICAgICAgICAgICZsdDttZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L2phdmFzY3JpcHQiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OQmFkZ2VyZmlzaE1lc3NhZ2VGb3JtYXR0ZXIiLyZndDsNCi0gICAgICAgICAgICAgICAgJmx0OyEtLSBtb3JlIG1lc3NhZ2UgZm9ybWF0dGVycyAtLSZndDsNCi0gICAgICAgICZsdDsvbWVzc2FnZUZvcm1hdHRlcnMmZ3Q7IA0KLQ0KLSAgICAgICAgJmx0O21lc3NhZ2VCdWlsZGVycyZndDsNCi0gICAgICAgICAgICAgICAgJmx0O21lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L2phdmFzY3JpcHQiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OQmFkZ2VyZmlzaE9NQnVpbGRlciIvJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7IS0tIG1vcmUgbWVzc2FnZSBidWlsZGVycyAtLSZndDsNCi0gICAgICAgICZsdDsvbWVzc2FnZUJ1aWxkZXJzJmd0Ow0KLTwvcHJlPg0KLTxoMz5TdGVwIDI8L2gzPg0KLTxwPk9uIHRoZSBjbGllbnQgc2lkZSwgbWFrZSB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQgYnkgcmVhZGluZyB0aGUNCi1heGlzMi54bWwgaW4gd2hpY2ggdGhlIGNvcnJlY3QgbWFwcGluZ3MgYXJlIGdpdmVuLjwvcD4NCi08cD5lLmcuPC9wPg0KLTxwcmU+DQotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZSgidGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIik7DQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIGNvbmZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgLi4uLi4uLi4uLiAgICAgICAgDQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBudWxsKTsNCi08L3ByZT4NCi08aDM+U3RlcCAzPC9oMz4NCi08cD5TZXQgdGhlIDxpPk1FU1NBR0VfVFlQRTwvaT4gb3B0aW9uIHdpdGggZXhhY3RseSB0aGUgc2FtZSBjb250ZW50DQotdHlwZSB5b3UgdXNlZCBpbiB0aGUgYXhpczIueG1sLjwvcD4NCi08cD5lLmcuIElmIHlvdSB1c2UgdGhlIGNvbnRlbnQgdHlwZQ0KLWFwcGxpY2F0aW9uL2pzb24sPC9wPg0KLTxwcmU+DQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOyAgICAgICAgDQotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSwgYXBwbGljYXRpb24vanNvbik7DQotICAgICAgICAvL21vcmUgb3B0aW9ucw0KLSAgICAgICAgLy8uLi4uLi4uLi4uLi4uLi4uLi4uICAgICAgICANCi0NCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlndXJhdGlvbkNvbnRleHQsIG51bGwpOyAgICAgICAgDQotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsNCi08L3ByZT4NCi08cD5JZiB5b3UgYXJlIHNlbmRpbmcgYSByZXF1ZXN0IHRvIGEgcmVtb3RlIHNlcnZpY2UsIHlvdSBoYXZlIHRvDQota25vdyB0aGUgZXhhY3QgSlNPTiBjb250ZW50IHR5cGUgdGhhdCBpcyB1c2VkIGJ5IHRoYXQgc2VydmljZSwgYW5kDQoteW91IGhhdmUgdG8gdXNlIHRoYXQgY29udGVudCB0eXBlIGluIHlvdXIgY2xpZW50IGFzIHdlbGwuPC9wPg0KLTxwPkhUVFAgUE9TVCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IG1ldGhvZCB0byBzZW5kIEpTT04gbWVzc2FnZXMNCi10aHJvdWdoIEF4aXMyLCBpZiB0aGUgSFRUUCBtZXRob2QgaXMgbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZQ0KLXVzZXIuIEJ1dCBpZiB5b3Ugd2FudCB0byBzZW5kIEpTT04gaW4gSFRUUCBHRVQgbWV0aG9kIGFzIGENCi1wYXJhbWV0ZXIsIHlvdSBjYW4gZG8gdGhhdCBieSBqdXN0IHNldHRpbmcgYW4gb3B0aW9uIG9uIHRoZSBjbGllbnQNCi1zaWRlLjwvcD4NCi08cD5lLmcuDQotPGNvZGU+b3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCwNCi1Db25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9HRVQpOzwvY29kZT48L3A+DQotPHA+SGVyZSwgdGhlIEF4aXMyIHJlY2VpdmluZyBzaWRlIChKU09OT01CdWlsZGVyKSBidWlsZHMgdGhlDQotT01FbGVtZW50IGJ5IHJlYWRpbmcgdGhlIEpTT04gc3RyaW5nIHdoaWNoIGlzIHNlbnQgYXMgYSBwYXJhbWV0ZXIuDQotVGhlIHJlcXVlc3QgY2FuIGJlIG1hZGUgZXZlbiB0aHJvdWdoIHRoZSBicm93c2VyLjwvcD4NCi08cD5lLmcuIFNhbXBsZSBKU09OIHJlcXVlc3QgdGhyb3VnaCBIVFRQIEdFVC4gVGhlIEpTT04gbWVzc2FnZSBpcw0KLWVuY29kZWQgYW5kIHNlbnQuPC9wPg0KLTxwPjxjb2RlPkdFVA0KLS9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZS9lY2hvT00/cXVlcnk9JTdCJTIyZWNob09NJTIyOiU3QiUyMmRhdGElMjI6JTVCJTIybXklMjBqc29uJTIwc3RyaW5nJTIyLCUyMm15JTIwc2Vjb25kJTIwanNvbiUyMHN0cmluZyUyMiU1RCU3RCU3RA0KLUhUVFAvMS4xPC9jb2RlPjwvcD4NCi08aDI+VGVzdHMgYW5kIFNhbXBsZXM8L2gyPg0KLTxoMz5JbnRlZ3JhdGlvbiBUZXN0PC9oMz4NCi08cD5UaGUgSlNPTiBpbnRlZ3JhdGlvbiB0ZXN0IGlzIGF2YWlsYWJsZSB1bmRlcg0KLXRlc3QgaW4gdGhlDQotanNvbiBtb2R1bGUgb2YgQXhpczIuIEl0IHVzZXMgdGhlDQotU2ltcGxlSFRUUFNlcnZlciB0byBkZXBsb3kgdGhlIHNlcnZpY2UuIEEgc2ltcGxlIGVjaG8gc2VydmljZSBpcw0KLXVzZWQgdG8gcmV0dXJuIHRoZSBpbmNvbWluZyBPTVNvdXJjZWRFbGVtZW50SW1wbCBvYmplY3QsIHdoaWNoDQotY29udGFpbnMgdGhlIEpTT05EYXRhU291cmNlLiBUaGVyZSBhcmUgdHdvIHRlc3QgY2FzZXMgZm9yIHR3bw0KLWRpZmZlcmVudCBjb252ZW50aW9ucyBhbmQgYW5vdGhlciBvbmUgdGVzdCBjYXNlIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi1pbiBHRVQuPC9wPg0KLTxoMz5ZYWhvby1KU09OIFNhbXBsZTwvaDM+DQotPHA+VGhpcyBzYW1wbGUgaXMgYXZhaWxhYmxlIGluIHRoZQ0KLXNhbXBsZXMgbW9kdWxlIG9mIEF4aXMyLiBJdCBpcyBhDQotY2xpZW50IHdoaWNoIGNhbGxzIHRoZSBZYWhvbyBzZWFyY2ggQVBJIHVzaW5nIHRoZSBHRVQgbWV0aG9kLCB3aXRoDQotdGhlIHBhcmFtZXRlciBvdXRwdXQ9anNvbi4gVGhlDQotWWFob28gc2VhcmNoIHNlcnZpY2Ugc2VuZHMgdGhlIHJlc3BvbnNlIGFzIGENCi1mb3JtYXR0ZWQgSlNPTiBzdHJpbmcgd2l0aA0KLXRoZSBjb250ZW50IHR5cGUgdGV4dC9qYXZhc2NyaXB0Lg0KLVRoaXMgY29udGVudCB0eXBlIGlzIG1hcHBlZCB3aXRoIHRoZSBKU09OT01CdWlsZGVyIGluIHRoZQ0KLWF4aXMyLnhtbC4gQWxsIHRoZSByZXN1bHRzIGFyZSBzaG93biBpbiBhIEdVSS4gVG8gcnVuIHRoZSBzYW1wbGUsDQotZXhlY3V0ZSB0aGUgYW50IHNjcmlwdC48L3A+DQotPHA+VGhlc2UgdHdvIGFwcGxpY2F0aW9ucyBwcm92aWRlIGdvb2QgZXhhbXBsZXMgb2YgdXNpbmcgSlNPTg0KLXdpdGhpbiBBeGlzMi4gQnkgcmV2aWV3aW5nIHRoZXNlIHNhbXBsZXMsIHlvdSB3aWxsIGJlIGFibGUgdG8NCi1iZXR0ZXIgdW5kZXJzdGFuZCBBeGlzMidzIEpTT04gc3VwcG9ydCBpbXBsZW1lbnRhdGlvbi48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbWlncmF0aW9uLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9taWdyYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdkODE4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9taWdyYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzE3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPk1pZ3JhdGluZyBmcm9tIEF4aXMgMS54PC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDE+TWlncmF0aW5nIGZyb20gQXBhY2hlIEF4aXMgMS54IHRvIEF4aXMyPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGlzIGludGVuZGVkIGZvciBoZWxwaW5nIEF4aXMgMS54IHVzZXJzIG1pZ3JhdGUgdG8NCi10aGUgQXhpczIgc2VyaWVzLiBXZSdsbCBiZWdpbiBieSBsaXN0aW5nIHRoZSBpbXByb3ZlbWVudHMgaW4gQXhpczINCi1pbiBjb21wYXJpc29uIHdpdGggQXhpczEuIFRoaXMgd2lsbCBiZSBmb2xsb3dlZCBieSBndWlkZWxpbmVzIGZvcg0KLW1pZ3JhdGlvbiB0byB0aGUgbmV3IHZlcnNpb24uPC9wPg0KLTxwPjxpPlNlbmQgeW91ciBmZWVkYmFjayBvciBxdWVzdGlvbnMgdG86IDxhIGhyZWY9DQotIm1haWx0bzpheGlzLXVzZXJAd3MuYXBhY2hlLm9yZz9zdWJqZWN0PVtBeGlzMl0iPmF4aXMtdXNlckB3cy5hcGFjaGUub3JnPC9hPjwvaT4uDQotKFN1YnNjcmlwdGlvbiBkZXRhaWxzIGFyZSBhdmFpbGFibGUgb24gdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCI+QXhpczIgc2l0ZTwvYT4uKQ0KLUtpbmRseSBwcmVmaXggc3ViamVjdCB3aXRoIFtBeGlzMl0uPC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNjb21wIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNzdGFydCI+R2V0dGluZyBTdGFydGVkPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNjdXN0b21fZGVwbG95bWVudCI+Q3VzdG9tIERlcGxveW1lbnQgb2YgU2VydmljZXMsDQotSGFuZGxlcnMgYW5kIE1vZHVsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3RyYW5zcG9ydHMiPlRyYW5zcG9ydHMgZm9yIEhUVFAgQ29ubmVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjZGF0YV9iaW5kaW5nIj5EYXRhIEJpbmRpbmcgU3VwcG9ydDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjYmVzdCI+QmVzdCBVc2FnZTwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iY29tcCIgaWQ9ImNvbXAiPjwvYT4NCi08aDI+Q29tcGF0aWJpbGl0eTwvaDI+DQotPHA+QXhpczEueCBhbmQgQXhpczIgaGF2ZSBldm9sdmVkIGZyb20gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuPC9wPg0KLTxwPjxzdHJvbmc+U3BlZWQ8L3N0cm9uZz4gLSBBeGlzMiBpcyBiYXNlZCBvbiB0aGUgU3RBWCBBUEksIHdoaWNoDQotZ2l2ZXMgZ3JlYXRlciBzcGVlZCB0aGFuIHRoZSBTQVggZXZlbnQgYmFzZWQgcGFyc2luZyB1c2VkIGluDQotQXhpczEueC48L3A+DQotPHA+PHN0cm9uZz5TdGFiaWxpdHk8L3N0cm9uZz4gLSBBeGlzMiBoYXMgZml4ZWQgcGhhc2VzIGFzIHdlbGwgYXMNCi11c2VyLWRlZmluZWQgcGhhc2VzIGZvciBleHRlbnNpb25zLiBUaGlzIGFsbG93cyBmYXIgbW9yZSBzdGFiaWxpdHkNCi1hcyB3ZWxsIGFzIGZsZXhpYmlsaXR5IHRoYW4gQXhpczEueC48L3A+DQotPHA+PHN0cm9uZz5UcmFuc3BvcnQgZnJhbWV3b3JrPC9zdHJvbmc+IC0gVHJhbnNwb3J0cyAoaS5lLiwgc2VuZGVycw0KLWFuZCBsaXN0ZW5lcnMgZm9yIFNPQVAgb3ZlciB2YXJpb3VzIHByb3RvY29scyBzdWNoIGFzIEhUVFAsIFNNVFAsDQotZXRjLiksIGhhdmUgYmVlbiBhYnN0cmFjdGVkIGF3YXkgZnJvbSB0aGUgQXhpczIgZW5naW5lLiBIYXZpbmcgYQ0KLXRyYW5zcG9ydC1pbmRlcGVuZGVudCBBeGlzIGVuZ2luZSBhbGxvd3MgZmFyIG1vcmUgZmxleGliaWxpdHkgaW4NCi10cmFuc3BvcnQgb3B0aW9ucy48L3A+DQotPHA+PHN0cm9uZz5XU0RMIDIuMCBzdXBwb3J0PC9zdHJvbmc+IC0gQXhpczIgc3VwcG9ydHMgYm90aCBXU0RMDQotdmVyc2lvbnMgMS4xIGFuZCAyLjAsIHdoaWNoIGFyZSB1c2VkIGJ5IEF4aXMyJ3MgY29kZSBnZW5lcmF0aW9uDQotdG9vbHMgdG8gY3JlYXRlIHdlYiBzZXJ2aWNlIHNrZWxldG9ucyBhbmQgY2xpZW50IHN0dWJzLjwvcD4NCi08cD48c3Ryb25nPkNvbXBvbmVudC1vcmllbnRlZCBhcmNoaXRlY3R1cmU8L3N0cm9uZz4gLSBBeGlzMg0KLWNvbXBvbmVudHMgY29uc2lzdCBvZiBoYW5kbGVycyBhbmQgbW9kdWxlcyBpbiAubWFyIGFuZCAuYWFyDQotYXJjaGl2ZXMuIFRoZXNlIGVhc2lseSByZXVzYWJsZSBjb21wb25lbnRzIGFsbG93IGV4dGVuZGVkDQotZnVuY3Rpb25hbGl0eSBzdWNoIGFzIHBhdHRlcm4gcHJvY2Vzc2luZyBmb3IgeW91ciBhcHBsaWNhdGlvbnMgb3INCi1kaXN0cmlidXRpb24gdG8gcGFydG5lcnMuIEF4aXMyIGVtcGhhc2l6ZXMgdGhlICJNb2R1bGUiIGNvbmNlcHQNCi1vdmVyIHRoZSAiSGFuZGxlciIgY29uY2VwdCBvZiBBeGlzIDEueC4gTW9kdWxlcyBjb250YWluIGhhbmRsZXJzDQotdGhhdCBhcmUgb3JkZXJlZCBieSBwaGFzZSBydWxlcy4gVGhlc2UgYXJlIGF0dGFjaGVkIHRvIHNwZWNpZmljDQotc2VydmljZShzKS48L3A+DQotPGEgbmFtZT0ic3RhcnQiIGlkPSJzdGFydCI+PC9hPg0KLTxoMj5HZXR0aW5nIFN0YXJ0ZWQ8L2gyPg0KLTxwPkxldCdzIGxvb2sgYXQgYSBzaW1wbGUgZXhhbXBsZSBvZiBlY2hvaW5nIGF0IGNsaWVudCBBUEkuPC9wPg0KLTxwPjxiPkF4aXMgMS54PC9iPjwvcD4NCi08cHJlPg0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMuY2xpZW50LkNhbGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5jbGllbnQuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0gICANCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudCB7DQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgW10gYXJncykgew0KLSAgICB0cnkgew0KLSAgICAgIFN0cmluZyBlbmRwb2ludCA9Imh0dHA6Ly93cy5hcGFjaGUub3JnOjUwNDkvYXhpcy9zZXJ2aWNlcy9lY2hvIjsNCi0gICAgICBTZXJ2aWNlICBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoKTsNCi0gICAgICBDYWxsICAgICBjYWxsICAgID0gKENhbGwpIHNlcnZpY2UuY3JlYXRlQ2FsbCgpOw0KLSAgICAgIGNhbGwuc2V0VGFyZ2V0RW5kcG9pbnRBZGRyZXNzKCBuZXcgamF2YS5uZXQuVVJMKGVuZHBvaW50KSApOw0KLSAgICAgIGNhbGwuc2V0T3BlcmF0aW9uTmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiwgImVjaG9TdHJpbmciKSk7DQotICAgICAgU3RyaW5nIHJldCA9IChTdHJpbmcpIGNhbGwuaW52b2tlKCBuZXcgT2JqZWN0W10geyAiSGVsbG8hIiB9ICk7DQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZW50ICdIZWxsbyEnLCBnb3QgJyIgKyByZXQgKyAiJyIpOw0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS50b1N0cmluZygpKTsNCi0gICAgfQ0KLSAgfQ0KLX0NCi08L3ByZT4NCi08cD48Yj5BeGlzIDI8L2I+PC9wPg0KLTxwcmU+DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgRWNob0Jsb2NraW5nQ2xpZW50IHsNCi0gICAgICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSIpOw0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLCAibnMxIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvU3RyaW5nIiwgbnMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuc2V0VGV4dCgiSGVsbG8hIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOyANCi0gICAgICAgICAgICAgICAgICAgICAgICAvL0Jsb2NraW5nIGludm9jYXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gY2xpZW50LnNlbmRSZWNlaXZlKHBheWxvYWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VudCBIZWxsbywgZ290IDogIiArIHJlc3VsdC50b1N0cmluZygpKTsNCi0NCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfQ0KLX0NCi08L3ByZT4NCi08cD5UaGUgYWJvdmUgY29kZSBkZW1vbnN0cmF0ZXMgdGhhdCBBeGlzMiBzZXJ2aWNlIGludm9jYXRpb25zIGRlYWwNCi13aXRoIHRoZSBTT0FQIGJvZHkgZWxlbWVudCBpdHNlbGYuIFRoZSBzaW1wbGUgc2hvd3MgYSBzeW5jaHJvbm91cw0KLWludm9jYXRpb24sIGJ1dCBBeGlzMiBjYW4gaGFuZGxlIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucyBhcyB3ZWxsLg0KLVRoZSAicGF5bG9hZCIgdmFyaWFibGUgYWJvdmUgY29udGFpbnMgdGhlIFNPQVAgYm9keSBlbGVtZW50IHdoaWNoDQotd2lsbCBnbyBpbiB0aGUgU09BUCBlbnZlbG9wZS48L3A+DQotPHA+T25jZSB0aGUgc2VydmljZSBpcyBjYWxsZWQgYnkgdGhlIGNsaWVudCBzdHViIGluIEF4aXMyLCB0aGUNCi0icGF5bG9hZCIgd2lsbCBiZSBib3VuZCBhY2NvcmRpbmcgdG8gdGhlIGRhdGEgYmluZGluZyBmcmFtZXdvcmsgaW4NCi11c2UuIFNvIHRoZSBleHRyYSB3b3JrIG9mIHBhcnNpbmcgdGhlICJwYXlsb2FkIiB3aWxsIHZhbmlzaC48L3A+DQotPHA+QXhpczIgc3VwcG9ydHMgYXN5bmNocm9ub3VzIGludm9jYXRpb24gdGhyb3VnaA0KLXNlbmRSZWNlaXZlTm9uYmxvY2tpbmcoKS4gU3luY2hyb25vdXMvQXN5bmNocm9ub3VzIGludm9jYXRpb25zIGNhbg0KLWhhbmRsZSBib3RoIHNpbmdsZSBhbmQgZG91YmxlIEhUVFAgY29ubmVjdGlvbnMuPC9wPg0KLTxwPldpdGggdGhpcyBhZHZhbmNlZCBhcmNoaXRlY3R1cmUsIEF4aXMyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcNCi1tZWdhYnl0ZXMgb2YgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcywgd2VsbCBhYm92ZSB0aGUgY2FwYWJpbGl0aWVzIG9mDQotQXhpczEueC48L3A+DQotPGEgbmFtZT0iY3VzdG9tX2RlcGxveW1lbnQiIGlkPSJjdXN0b21fZGVwbG95bWVudCI+PC9hPg0KLTxoMj5DdXN0b20gRGVwbG95bWVudCBvZiBTZXJ2aWNlcywgSGFuZGxlcnMsIGFuZCBNb2R1bGVzPC9oMj4NCi08cD5JbiBBeGlzIDEueCwgdGhlIGRlcGxveW1lbnQgb2Ygc2VydmljZXMgd2FzIHZpYSB0aGUgcmF0aGVyDQotY3VtYmVyc29tZSBXU0RELiBTZXJ2aWNlIGRlcGxveW1lbnQgaW4gQXhpczIgaXMgc3RyYWlnaHRmb3J3YXJkIGFuZA0KLWR5bmFtaWMgdXNpbmcgdGhlIHdlYi1iYXNlZCBBeGlzMiBBZG1pbiBhcHBsaWNhdGlvbi4gRGVwbG95bWVudCBpcw0KLWp1c3QgYSBtYXR0ZXIgb2YgY3JlYXRpbmcgdGhlIHNlcnZpY2UgYXJjaGl2ZSAoLmFhcikgZmlsZSBhbmQNCi1kZXBsb3lpbmcgaXQuIE1vcmUgZGV0YWlscyByZWdhcmRpbmcgdGhpcyBpcyBnaXZlbiBpbiB0aGUgQXhpczINCi11c2VyIGd1aWRlLjwvcD4NCi08cD5BeGlzMiBoYXMgbW92ZWQgYXdheSBmcm9tIHRoZSAiSGFuZGxlciBjb25jZXB0IiBhbmQgaXMgbW9yZSBpbnRvDQotdGhlICJNb2R1bGUgY29uY2VwdCIuIEFic3RyYWN0bHkgc3BlYWtpbmcsIHRoZSBtb2R1bGUgY29uY2VwdCBpcyBhDQotY29sbGVjdGlvbiBvZiBoYW5kbGVycyB3aXRoIHJ1bGVzIHRoYXQgZ292ZXJuIHdoaWNoIG1vZHVsZXMgYXJlDQotY3JlYXRlZCBhcyAubWFyIGZpbGVzLiBJdCB1c2VzIGEgbW9kdWxlLnhtbCBmaWxlIHRvIHNwZWNpZnkgaGFuZGxlcg0KLWNvbmZpZ3VyYXRpb24gYW5kIGFjdGl2YXRpb24uPC9wPg0KLTxwPldoZW4gYSBzZXJ2aWNlIGlzIGNhbGxlZCB0aHJvdWdoIGEgaGFuZGxlciwgaXQgaXMganVzdCBhIG1hdHRlcg0KLW9mIGdpdmluZyBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIHRoYXQgaW5jbHVkZXMgdGhlIGhhbmRsZXIgaW4NCi10aGUgc2VydmljZXMueG1sICh1c2luZyAmbHQ7bW9kdWxlIHJlZj0iZm9vLyZndDsiKS48L3A+DQotPHA+U2VydmljZXMgYXJlIGhvdCBkZXBsb3lhYmxlIGluIEF4aXMyLCBidXQgbW9kdWxlcyBhcmUgbm90LiBUaGlzDQotaXMgb25lIGZlYXR1cmUgd2hpY2ggaXMgdW5pcXVlIHRvIEF4aXMyLjwvcD4NCi08cD5MZXQncyB0YWtlIGEgZGV0YWlsZWQgbG9vayBhdCB3aGF0IGl0IHRha2VzIHRvIG1pZ3JhdGUgdGhlIEF4aXMNCi0xLnggaGFuZGxlcnMgdG8gdGhlIEF4aXMgMiBtb2R1bGVzIHZpYSB0aGUgIlNPQVAgTW9uaXRvciIuIFRoZSBTT0FQDQotbW9uaXRvciBpcyByZWFsbHkgYSBjb21iaW5hdGlvbiBvZiB0aHJlZSBjb21wb25lbnRzOiBBbiBhcHBsZXQNCi13aGljaCBkaXNwbGF5cyByZXNwb25zZXMvcmVxdWVzdHMsIGEgc2VydmxldCB3aGljaCBiaW5kcyB0byBhDQotZGVmYXVsdCBwb3J0IG9mIDUwMDEgYW5kIGNvbm5lY3RzIHRvIHRoZSBhcHBsZXQsIGFuZCBhIGhhbmRsZXINCi1jaGFpbiB1c2VkIHRvIGludGVyY2VwdCB0aGUgU09BUCBtZXNzYWdlcy4gSGVyZSB3ZSdsbCBmb2N1cyBvbiB0aGUNCi1oYW5kbGVyLjwvcD4NCi08cD48Yj5BeGlzIDEueCByZXF1aXJlZCB0d28gV1NERCdzIHRvIHVzZSB0aGUgU09BUCBNb25pdG9yLiBGaXJzdCwNCi10aGUgU09BUCBNb25pdG9yIEhhbmRsZXIgaXRzZWxmOjwvYj48L3A+DQotPHByZT4NCi0mbHQ7ZGVwbG95bWVudCB4bWxucz0iaHR0cDovL3htbC5hcGFjaGUub3JnL2F4aXMvd3NkZC8iDQotICAgIHhtbG5zOmphdmE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9heGlzL3dzZGQvcHJvdmlkZXJzL2phdmEiJmd0Ow0KLSAgICANCi0gICZsdDtoYW5kbGVyIG5hbWU9InNvYXBtb25pdG9yIiANCi0gICAgICB0eXBlPSJqYXZhOm9yZy5hcGFjaGUuYXhpcy5oYW5kbGVycy5TT0FQTW9uaXRvckhhbmRsZXIiJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IndzZGxVUkwiIA0KLSAgICAgIHZhbHVlPSIvd3pzL1NPQVBNb25pdG9yU2VydmljZS1pbXBsLndzZGwiLyZndDsNCi0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJuYW1lc3BhY2UiIA0KLSAgICAgIHZhbHVlPSJodHRwOi8vdGVtcHVyaS5vcmcvd3NkbC8yMDAxLzEyL1NPQVBNb25pdG9yU2VydmljZS1pbXBsLndzZGwiLyZndDsNCi0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJzZXJ2aWNlTmFtZSIgdmFsdWU9IlNPQVBNb25pdG9yU2VydmljZSIvJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9InBvcnROYW1lIiB2YWx1ZT0iRGVtbyIvJmd0Ow0KLSAgJmx0Oy9oYW5kbGVyJmd0Ow0KLQ0KLSAgJmx0O3NlcnZpY2UgbmFtZT0iU09BUE1vbml0b3JTZXJ2aWNlIiBwcm92aWRlcj0iamF2YTpSUEMiJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImFsbG93ZWRNZXRob2RzIiB2YWx1ZT0icHVibGlzaE1lc3NhZ2UiLyZndDsNCi0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJjbGFzc05hbWUiIA0KLSAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLmF4aXMubW9uaXRvci5TT0FQTW9uaXRvclNlcnZpY2UiLyZndDsNCi0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJzY29wZSIgdmFsdWU9IkFwcGxpY2F0aW9uIi8mZ3Q7DQotICAmbHQ7L3NlcnZpY2UmZ3Q7DQotJmx0Oy9kZXBsb3ltZW50Jmd0Ow0KLTwvcHJlPg0KLTxwPjxiPkF4aXMgMS54IHJlcXVpcmVzIGEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGluIHRoZSB1c2VyJ3MNCi1XU0REIHRoYXQgZGVmaW5lcyB0aGVpciBXZWIgU2VydmljZTo8L2I+PC9wPg0KLTxwcmU+DQotJmx0O2RlcGxveW1lbnQgbmFtZT0iZXhhbXBsZSIgeG1sbnM9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9heGlzL3dzZGQvIiANCi0gICAgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL2F4aXMvd3NkZC9wcm92aWRlcnMvamF2YSImZ3Q7DQotICANCi0gICZsdDtzZXJ2aWNlIG5hbWU9InVybjpteVNlcnZpY2UiIHByb3ZpZGVyPSJqYXZhOlJQQyImZ3Q7DQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iY2xhc3NOYW1lIiB2YWx1ZT0ib3JnLk15U2VydmljZSIvJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImFsbG93ZWRNZXRob2RzIiB2YWx1ZT0iKiIvJmd0Ow0KLQ0KLSAgICAmbHQ7cmVxdWVzdEZsb3cmZ3Q7DQotICAgICAgJmx0O2hhbmRsZXIgdHlwZT0ic29hcG1vbml0b3IiLyZndDsNCi0gICAgJmx0Oy9yZXF1ZXN0RmxvdyZndDsNCi0gICAgJmx0O3Jlc3BvbnNlRmxvdyZndDsNCi0gICAgICAmbHQ7aGFuZGxlciB0eXBlPSJzb2FwbW9uaXRvciIvJmd0Ow0KLSAgICAmbHQ7L3Jlc3BvbnNlRmxvdyZndDsNCi0NCi0gICZsdDsvc2VydmljZSZndDsNCi0mbHQ7L2RlcGxveW1lbnQmZ3Q7DQotPC9wcmU+DQotPHA+PGI+QXhpcyAyIHJlcXVpcmVzIGEgbW9kdWxlLnhtbCwgcGxhY2VkIGluc2lkZSBhIGphciB3aXRoIGEgLm1hcg0KLWV4dGVuc2lvbiB1bmRlciBXRUItSU5GL21vZHVsZXMsIHRvIGRlZmluZSBhIEhhbmRsZXI6PC9iPjwvcD4NCi08cHJlPg0KLSZsdDttb2R1bGUgbmFtZT0ic29hcG1vbml0b3IiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnNvYXBtb25pdG9yLlNPQVBNb25pdG9yTW9kdWxlIiZndDsNCi0gICAgJmx0O2luZmxvdyZndDsNCi0gICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IkluRmxvd1NPQVBNb25pdG9ySGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3IuU09BUE1vbml0b3JIYW5kbGVyIiZndDsNCi0gICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9InNvYXBtb25pdG9yUGhhc2UiLyZndDsNCi0gICAgICAgICZsdDsvaGFuZGxlciZndDsNCi0gICAgJmx0Oy9pbmZsb3cmZ3Q7DQotDQotICAgICZsdDtvdXRmbG93Jmd0Ow0KLSAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iT3V0Rmxvd1NPQVBNb25pdG9ySGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3IuU09BUE1vbml0b3JIYW5kbGVyIiZndDsNCi0gICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9InNvYXBtb25pdG9yUGhhc2UiLyZndDsNCi0gICAgICAgICZsdDsvaGFuZGxlciZndDsNCi0gICAgJmx0Oy9vdXRmbG93Jmd0Ow0KLQ0KLSAgICAmbHQ7T3V0ZmF1bHRmbG93Jmd0Ow0KLSAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iRmF1bHRPdXRGbG93U09BUE1vbml0b3JIYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5zb2FwbW9uaXRvci5TT0FQTW9uaXRvckhhbmRsZXIiJmd0Ow0KLSAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0ic29hcG1vbml0b3JQaGFzZSIvJmd0Ow0KLSAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLSAgICAmbHQ7L091dGZhdWx0ZmxvdyZndDsNCi0NCi0gICAgJmx0O0lOZmF1bHRmbG93Jmd0Ow0KLSAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iRmF1bHRJbkZsb3dTT0FQTW9uaXRvckhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnNvYXBtb25pdG9yLlNPQVBNb25pdG9ySGFuZGxlciImZ3Q7DQotICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7DQotICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7DQotICAgICZsdDsvSU5mYXVsdGZsb3cmZ3Q7DQotJmx0Oy9tb2R1bGUmZ3Q7DQotPC9wcmU+DQotPHA+VGhlIFNPQVBNb25pdG9yTW9kdWxlIHJlZmVyZW5jZWQgYWJvdmUgc2ltcGx5IGltcGxlbWVudHMgdGhlDQotb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZSwgYW5kIGlzIHVzZWQgZm9yIGFueSBhZGRpdGlvbmFsDQotdGFza3MgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSBhbmQgc2h1dGRvd24gdGhlIG1vZHVsZS4gSW4NCi10aGlzIHNpdHVhdGlvbiwgbm90aGluZyBpcyBuZWVkZWQgYW5kIHRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2UNCi1tZXRob2RzIGhhdmUgYmxhbmsgYm9kaWVzLiBGdXJ0aGVybW9yZSwgdGhlICdzb2FwbW9uaXRvclBoYXNlJyB3aWxsDQotYmUgdXNlZCBsYXRlciAoYmVsb3cpIGluIHRoZSBheGlzMi54bWwgLjwvcD4NCi08cD48Yj5BeGlzIDEueCB0aGUgU09BUE1vbml0b3JIYW5kbGVyIGhhcyB0aGUgY2xhc3Mgc2lnbmF0dXJlDQotYXM6PC9iPjwvcD4NCi08cHJlPg0KLXB1YmxpYyBjbGFzcyBTT0FQTW9uaXRvckhhbmRsZXIgZXh0ZW5kcyBCYXNpY0hhbmRsZXINCi08L3ByZT4NCi08cD48Yj5BeGlzIDIgdGhlIFNPQVBNb25pdG9ySGFuZGxlciBoYXMgdGhlIGNsYXNzIHNpZ25hdHVyZQ0KLWFzOjwvYj48L3A+DQotPHByZT4NCi1wdWJsaWMgY2xhc3MgU09BUE1vbml0b3JIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIA0KLTwvcHJlPg0KLTxwPjxiPkluIEF4aXMyLCB5b3UgbmVlZCB0byByZWZlcmVuY2UgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZQ0KLWhhbmRsZXIgY2hhaW4gdGhhdCB5b3Ugd2FudCB0byB1c2UgaW5zaWRlIHlvdXINCi1zZXJ2aWNlcy54bWw6PC9iPjwvcD4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlIG5hbWU9IkV4YW1wbGVTZXJ2aWNlIiZndDsNCi0gICAgJmx0O21vZHVsZSByZWY9InNvYXBtb25pdG9yIi8mZ3Q7DQotICAgICZsdDtkZXNjcmlwdGlvbiZndDsNCi0gICAgICAgVGhpcyBzZXJ2aWNlIGhhcyB0aGUgU09BUCBNb25pdG9yIHdpcmVkIGluIA0KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyImZ3Q7b3JnLkV4YW1wbGVTZXJ2aWNlJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0ibXlFeGVjdXRlIiZndDsNCi0gICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSZsdDsvc2VydmljZSZndDsNCi08L3ByZT4NCi08cD48Yj5GaW5hbGx5LCBBeGlzMiByZXF1aXJlcyB5b3UgdG8gbWFrZSBzb21lIGNoYW5nZXMgdG8NCi1heGlzMi54bWwuIFN0YXJ0IGJ5IGFkZGluZyBhIGdsb2JhbCBtb2R1bGU6PC9iPjwvcD4NCi08cHJlPg0KLSAgICAmbHQ7bW9kdWxlIHJlZj0ic29hcG1vbml0b3IiLyZndDsNCi08L3ByZT4NCi08cD48Yj5UaGVuIGRlZmluZSB5b3VyIHBoYXNlIG9yZGVycyBmb3IgdGhlICdzb2FwbW9uaXRvclBoYXNlJw0KLXJlZmVyZW5jZWQgaW4gdGhlIG1vZHVsZS54bWwgOjwvYj48L3A+DQotPHByZT4NCi0gICAgJmx0O3BoYXNlT3JkZXIgdHlwZT0iaW5mbG93IiZndDsNCi0gICAgICAgICZsdDshLS0gIEdsb2JhbCBQaGFzZXMgICAgICAgLS0mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLyZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSImZ3Q7DQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIiZndDsNCi0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0Ow0KLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsNCi0NCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7DQotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLQ0KLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciImZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsNCi0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7DQotDQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciImZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsNCi0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7DQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iSW5zdGFuY2VEaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5JbnN0YW5jZURpc3BhdGNoZXIiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7DQotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLSAgICAgICAgJmx0Oy9waGFzZSZndDsNCi0gICAgICAgICZsdDshLS0gICAgR2xvYmFsIFBoYXNlcyAgICAgLS0mZ3Q7DQotICAgICAgICAmbHQ7IS0tICAgQWZ0ZXIgRGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50cyAgICAgIC0tJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9InVzZXJwaGFzZTEiLyZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7DQotICAgICZsdDsvcGhhc2VPcmRlciZndDsNCi0gICAgJmx0O3BoYXNlT3JkZXIgdHlwZT0ib3V0ZmxvdyImZ3Q7DQotICAgICAgICAmbHQ7IS0tICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0mZ3Q7DQotICAgICAgICAmbHQ7IS0tICAgR2xvYmFsIHBoYXNlcyAgIC0tJmd0Ow0KLSAgICAgICAgJmx0OyEtLSAgIHRoZXNlIHBoYXNlcyB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UgICAtLSZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLyZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8mZ3Q7DQotICAgICAgICAmbHQ7IS0tICAgR2xvYmFsIHBoYXNlcyAgIC0tJmd0Ow0KLSAgICAmbHQ7L3BoYXNlT3JkZXImZ3Q7DQotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9IklOZmF1bHRmbG93IiZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvJmd0Ow0KLSAgICAgICAgJmx0OyEtLSAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tJmd0Ow0KLSAgICAmbHQ7L3BoYXNlT3JkZXImZ3Q7DQotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Ik91dGZhdWx0ZmxvdyImZ3Q7DQotICAgICAgICAmbHQ7IS0tICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0mZ3Q7DQotICAgICAgICAmbHQ7IS0tICAgR2xvYmFsIHBoYXNlcyAgIC0tJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLyZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLyZndDsNCi0gICAgICAgICZsdDshLS0gICBHbG9iYWwgcGhhc2VzICAgLS0mZ3Q7DQotICAgICZsdDsvcGhhc2VPcmRlciZndDsNCi08L3ByZT4NCi08cD5TZWUgdGhlIHVzZXIgZ3VpZGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQXhpczIgbW9kdWxlcy48L3A+DQotPGEgbmFtZT0idHJhbnNwb3J0cyIgaWQ9InRyYW5zcG9ydHMiPjwvYT4NCi08aDI+VHJhbnNwb3J0cyBmb3IgSFRUUCBDb25uZWN0aW9uPC9oMj4NCi08cD5BeGlzMiBjb21lcyB3aXRoIHRoZSBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciB3aGljaCBpcyBiYXNlZA0KLW9uIGNvbW1vbnMtaHR0cGNsaWVudC48L3A+DQotPHA+SXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYXhpczIueG1sIHNob3VsZCBiZSBjb25maWd1cmVkIHRvIGNhbGwNCi10aGUgY29tbW9ucyB0cmFuc3BvcnRzIGluIHRoaXMgbWFubmVyOjwvcD4NCi08cHJlPg0KLS4uLg0KLSZsdDt0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiJmd0OyANCi0gICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIiZndDtIVFRQLzEuMSZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciJmd0O2NodW5rZWQmbHQ7L3BhcmFtZXRlciZndDsNCi0mbHQ7L3RyYW5zcG9ydFNlbmRlciZndDsNCi0uLi4NCi08L3ByZT4NCi08YSBuYW1lPSJkYXRhX2JpbmRpbmciIGlkPSJkYXRhX2JpbmRpbmciPjwvYT4NCi08aDI+RGF0YSBCaW5kaW5nIFN1cHBvcnQ8L2gyPg0KLTxwPkFEQiBpcyB1c2VkIHRvIHByb3ZpZGUgZGF0YSBiaW5kaW5nIHN1cHBvcnQuIEluIEF4aXMyLCBYTUwgaXMNCi1tYW5pcHVsYXRlZCB2aWEgQVhJT00sIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBTdEFYIEFQSS4gQVhJT00NCi1wcm92aWRlcyBmdWxsIFhNTCBzY2hlbWEgc3VwcG9ydC4gVGh1cywgc2VyaWFsaXphdGlvbiBhbmQNCi1kZS1zZXJpYWxpemF0aW9uIG9mIFhNTCBpcyBoYW5kbGVkIGluIEF4aXMyIHZpYSB0aGUgeG1sLWRhdGENCi1iaW5kaW5nIGZyYW1ld29yay48L3A+DQotPHA+QmVsb3cgaXMgYW4gZXhhbXBsZSBvZiBtaWdyYXRpbmcgYSBXU0RMIGJhc2VkIEF4aXMgMS54IFdlYg0KLVNlcnZpY2UgdG8gQXhpczIuPC9wPg0KLTxwPkZpcnN0LCBsZXQncyB0YWtlIGEgbG9vayBhdCBhIHNpbXBsZSBkb2N1bWVudC9saXRlcmFsIHN0eWxlIFdTREwNCi11c2VkIGluIGFuIEF4aXMgMS54IFdlYiBTZXJ2aWNlLiBUaGlzIGV4YW1wbGUgYXNzdW1lcyB0aGUgbmFtZQ0KLXNpbXBsZS53c2RsIGZvciB0aGUgV1NETCBiZWxvdzo8L3A+DQotPHByZT4NCi0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0Ow0KLQ0KLSZsdDtkZWZpbml0aW9ucyBuYW1lPSJTaW1wbGVTZXJ2aWNlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zaW1wbGVOUyIgeG1sbnM6dG5zPSJodHRwOi8vc2ltcGxlTlMiIA0KLXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQoteG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6bnMyPSJodHRwOi8vc2ltcGxlTlMvdHlwZXMiJmd0Ow0KLSAgJmx0O3R5cGVzJmd0Ow0KLSAgICAmbHQ7c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NpbXBsZU5TL3R5cGVzIiB4bWxuczp0bnM9Imh0dHA6Ly9zaW1wbGVOUy90eXBlcyIgDQoteG1sbnM6c29hcDExLWVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIA0KLXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0Ow0KLSAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvJmd0Ow0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9InNpbXBsZUxvZ2luIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InVzZXJfbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InVzZXJfcGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9InNpbXBsZUxvZ2luUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic29hcF9zZXNzaW9uX2lkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0id2ViX3VzZXJfbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotJmx0Oy9zY2hlbWEmZ3Q7Jmx0Oy90eXBlcyZndDsNCi0gICZsdDttZXNzYWdlIG5hbWU9IlNpbXBsZUVuZHBvaW50X3NpbXBsZUxvZ2luIiZndDsNCi0gICAgICZsdDtwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zMjpzaW1wbGVMb2dpbiIvJmd0Ow0KLSAgJmx0Oy9tZXNzYWdlJmd0Ow0KLSAgJmx0O21lc3NhZ2UgbmFtZT0iU2ltcGxlRW5kcG9pbnRfc2ltcGxlTG9naW5SZXNwb25zZSImZ3Q7DQotICAgICZsdDtwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0ibnMyOnNpbXBsZUxvZ2luUmVzcG9uc2UiLyZndDsNCi0gICZsdDsvbWVzc2FnZSZndDsNCi0gICZsdDtwb3J0VHlwZSBuYW1lPSJTaW1wbGVFbmRwb2ludCImZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0ic2ltcGxlTG9naW4iJmd0Ow0KLSAgICAgICZsdDtpbnB1dCBtZXNzYWdlPSJ0bnM6U2ltcGxlRW5kcG9pbnRfc2ltcGxlTG9naW4iIG5hbWU9IlNpbXBsZUVuZHBvaW50X3NpbXBsZUxvZ2luIi8mZ3Q7DQotICAgICAgJmx0O291dHB1dCBtZXNzYWdlPSJ0bnM6U2ltcGxlRW5kcG9pbnRfc2ltcGxlTG9naW5SZXNwb25zZSIgbmFtZT0iU2ltcGxlRW5kcG9pbnRfc2ltcGxlTG9naW5SZXNwb25zZSIvJmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICZsdDsvcG9ydFR5cGUmZ3Q7DQotICAmbHQ7YmluZGluZyBuYW1lPSJTaW1wbGVFbmRwb2ludEJpbmRpbmciIHR5cGU9InRuczpTaW1wbGVFbmRwb2ludCImZ3Q7DQotICAgICZsdDtzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvJmd0Ow0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9InNpbXBsZUxvZ2luIiZndDsNCi0gICAgICAmbHQ7c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic2ltcGxlTG9naW4iLyZndDsNCi0gICAgICAmbHQ7aW5wdXQgbmFtZT0iU2ltcGxlRW5kcG9pbnRfc2ltcGxlTG9naW4iJmd0Ow0KLSAgICAgICAgJmx0O3NvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L2lucHV0Jmd0Ow0KLSAgICAgICZsdDtvdXRwdXQgbmFtZT0iU2ltcGxlRW5kcG9pbnRfc2ltcGxlTG9naW5SZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvb3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICZsdDsvYmluZGluZyZndDsNCi0gICZsdDtzZXJ2aWNlIG5hbWU9IlNpbXBsZVNlcnZpY2UiJmd0Ow0KLSAgICAmbHQ7cG9ydCBuYW1lPSJTaW1wbGVFbmRwb2ludFBvcnQiIGJpbmRpbmc9InRuczpTaW1wbGVFbmRwb2ludEJpbmRpbmciJmd0Ow0KLSAgICAgICZsdDtzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzL3NlcnZpY2VzL1NpbXBsZUVuZHBvaW50UG9ydCIvJmd0OyZsdDsvcG9ydCZndDsmbHQ7L3NlcnZpY2UmZ3Q7Jmx0Oy9kZWZpbml0aW9ucyZndDsNCi08L3ByZT4NCi08cD5UaGUgbmV4dCBzdGVwIGlzIHRvIHJ1biBXU0RMMkphdmEgb24gdGhlIHdzZGwuIEZvciBheGlzIDEueCwNCi10aGlzIGV4YW1wbGUgdXNlcyB0aGUgZm9sbG93aW5nIEFudCB0YXNrOjwvcD4NCi08cHJlPg0KLSZsdDt0YXJnZXQgbmFtZT0id3NkbDJqYXZhIiBkZXNjcmlwdGlvbj0iYXhpcyAxLngiJmd0Ow0KLSAgICAgICAmbHQ7ZGVsZXRlIGRpcj0ib3V0cHV0IiAvJmd0Ow0KLSAgICAgICAmbHQ7bWtkaXIgZGlyPSJvdXRwdXQiIC8mZ3Q7DQotICAgICAgICZsdDtheGlzLXdzZGwyamF2YQ0KLSAgICAgICAgIG91dHB1dD0ib3V0cHV0Ig0KLSAgICAgICAgIHZlcmJvc2U9InRydWUiDQotICAgICAgICAgdXJsPSJ3c2RsL3NpbXBsZS53c2RsIg0KLSAgICAgICAgIHNlcnZlcnNpZGU9InRydWUiDQotICAgICAgICAgc2tlbGV0b25kZXBsb3k9InRydWUiDQotICAgICAgICAgbm93cmFwcGVkPSJ0cnVlIiZndDsNCi0gICAgICAgJmx0Oy9heGlzLXdzZGwyamF2YSZndDsNCi0gICAmbHQ7L3RhcmdldCZndDsNCi08L3ByZT4NCi08cD5UaGUgQXhpcyAxLnggQW50IHRhc2sgYWJvdmUgdGFrZXMgdGhlIHNpbXBsZS53c2RsIHVuZGVyIHRoZQ0KLWRpcmVjdG9yeSAnd3NkbCcgLCBhbmQgZnJvbSB0aGF0IGNyZWF0ZXMgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yeQ0KLSdvdXRwdXQnLiBUaGUgZmlsZXMgY3JlYXRlZCBhcmUgc2hvd24gYmVsb3c6PC9wPg0KLTxwcmU+DQotb3V0cHV0Lw0KLW91dHB1dC9zaW1wbGVOUw0KLW91dHB1dC9zaW1wbGVOUy90eXBlcw0KLW91dHB1dC9zaW1wbGVOUy90eXBlcy9TaW1wbGVMb2dpblJlc3BvbnNlLmphdmENCi1vdXRwdXQvc2ltcGxlTlMvdHlwZXMvU2ltcGxlTG9naW4uamF2YQ0KLW91dHB1dC9zaW1wbGVOUy9TaW1wbGVFbmRwb2ludC5qYXZhDQotb3V0cHV0L3NpbXBsZU5TL1NpbXBsZUVuZHBvaW50QmluZGluZ1N0dWIuamF2YQ0KLW91dHB1dC9zaW1wbGVOUy9TaW1wbGVFbmRwb2ludEJpbmRpbmdTa2VsZXRvbi5qYXZhDQotb3V0cHV0L3NpbXBsZU5TL1NpbXBsZUVuZHBvaW50QmluZGluZ0ltcGwuamF2YQ0KLW91dHB1dC9zaW1wbGVOUy9TaW1wbGVTZXJ2aWNlLmphdmENCi1vdXRwdXQvc2ltcGxlTlMvU2ltcGxlU2VydmljZUxvY2F0b3IuamF2YQ0KLW91dHB1dC9zaW1wbGVOUy9kZXBsb3kud3NkZA0KLW91dHB1dC9zaW1wbGVOUy91bmRlcGxveS53c2RkDQotPC9wcmU+DQotPHA+Tm93IGxldCdzIHJ1biBXU0RMMkphdmEgd2l0aCBBeGlzMi4gSW4gdGhpcyBleGFtcGxlLCB0aGUgb25seQ0KLWNoYW5nZSB0byBzaW1wbGUud3NkbCByZXF1aXJlZCBmb3IgQXhpczIgaXMgdGhhdCAnc29hcDphZGRyZXNzDQotbG9jYXRpb24nIGJlIGNoYW5nZWQgdG86PC9wPg0KLTxwcmU+DQotJmx0O3NvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NpbXBsZUVuZHBvaW50Ii8mZ3Q7Jmx0Oy9wb3J0Jmd0OyZsdDsvc2VydmljZSZndDsmbHQ7L2RlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPkluIEF4aXMyLCB0aGUgZGVmYXVsdCBkYXRhYmluZGluZyB1c2VzIEFEQi4gSG93ZXZlciwgWE1MQmVhbnMsDQotSmlCWCBhbmQgSkFYQi1SSSBhcmUgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgZXhhbXBsZSB1c2VzIFhNTEJlYW5zLiBGb3INCi1BeGlzMiwgb3VyIGV4YW1wbGUgdXNlcyB0aGUgZm9sbG93aW5nIEFudCB0YXNrOjwvcD4NCi08cHJlPg0KLSZsdDt0YXJnZXQgbmFtZT0id3NkbDJqYXZhIiZndDsNCi0gICAgICAmbHQ7ZGVsZXRlIGRpcj0ib3V0cHV0IiAvJmd0Ow0KLSAgICAgICZsdDtqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSImZ3Q7DQotICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9ImF4aXMuY2xhc3NwYXRoIi8mZ3Q7IA0KLSAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSItZCIvJmd0Ow0KLSAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSJ4bWxiZWFucyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSItdXJpIi8mZ3Q7DQotICAgICAgICAgICZsdDthcmcgZmlsZT0id3NkbC9zaW1wbGUud3NkbCIvJmd0Ow0KLSAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSItc3MiLyZndDsNCi0gICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLWciLyZndDsNCi0gICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLXNkIi8mZ3Q7DQotICAgICAgICAgICZsdDthcmcgdmFsdWU9Ii1vIi8mZ3Q7DQotICAgICAgICAgICZsdDthcmcgZmlsZT0ib3V0cHV0Ii8mZ3Q7DQotICAgICAgICAgICZsdDthcmcgdmFsdWU9Ii1wIi8mZ3Q7DQotICAgICAgICAgICZsdDthcmcgdmFsdWU9Im9yZy5zaW1wbGUuZW5kcG9pbnQiLyZndDsNCi0gICAgICAmbHQ7L2phdmEmZ3Q7DQotDQotICAgICAgJmx0OyEtLSBNb3ZlIHRoZSBzY2hlbWEgZm9sZGVyIHRvIGNsYXNzcGF0aC0tJmd0Ow0KLSAgICAgICZsdDttb3ZlIHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9IiZndDsNCi0gICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJvdXRwdXQvcmVzb3VyY2VzIiZndDsNCi0gICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IipzY2hlbWEqLyoqLyouY2xhc3MiLyZndDsNCi0gICAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IipzY2hlbWEqLyoqLyoueHNiIi8mZ3Q7DQotICAgICAgICAgICZsdDsvZmlsZXNldCZndDsNCi0gICAgICAmbHQ7L21vdmUmZ3Q7DQotDQotICAmbHQ7L3RhcmdldCZndDsNCi08L3ByZT4NCi08cD5Gb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIEF4aXMyIFdTREwySmF2YSBBbnQgdGFzayBhbmQgaXRzDQotb3B0aW9ucywgc2VlIHRoZSA8YSBocmVmPQ0KLSIuLi90b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiPkNvZGVnZW5Ub29sUmVmZXJlbmNlDQotR3VpZGUuPC9hPjwvcD4NCi08cD5BIGZlYXR1cmUgb2YgWE1MQmVhbnMgaXMgdGhhdCB0aGVyZSBpcyBvbmUgY2xhc3MgZmlsZSBjcmVhdGVkDQotd2l0aCBXU0RMMmphdmEsIGFuZCBhIHNlcmllcyBvZiAueHNiIGZpbGVzLiBUaGV5IG11c3QgYmUgcmVmZXJlbmNlZA0KLXdoZW4gY29tcGlsaW5nLCBhbmQgYXMgdGhlIGV4YW1wbGUgc2hvd3MsIHRoZXNlIGZpbGVzIGFyZSBtb3ZlZCB0bw0KLWEgYnVpbGQgZGlyZWN0b3J5LjwvcD4NCi08cD5UaGUgQXhpczIgV1NETDJKYXZhIGV4YW1wbGUgYWxzbyB0YWtlcyB0aGUgc2ltcGxlLndzZGwsIHdoaWNoIGlzDQotdW5kZXIgdGhlIGRpcmVjdG9yeSAnd3NkbCcsIGFuZCBjcmVhdGVzIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkNCi0nb3V0cHV0Jy4gVGhlIHJlbGV2YW50IG5vbi14bWxiZWFuIGZpbGVzIGNyZWF0ZWQgYXJlIHNob3duDQotYmVsb3c6PC9wPg0KLTxwcmU+DQotb3V0cHV0L3Jlc291cmNlcy9zZXJ2aWNlcy54bWwNCi1vdXRwdXQvc3JjL29yZy9zaW1wbGUNCi1vdXRwdXQvc3JjL29yZy9zaW1wbGUvZW5kcG9pbnQNCi1vdXRwdXQvc3JjL29yZy9zaW1wbGUvZW5kcG9pbnQvU2ltcGxlRW5kcG9pbnRTa2VsZXRvbi5qYXZhDQotb3V0cHV0L3NyYy9vcmcvc2ltcGxlL2VuZHBvaW50L1NpbXBsZUVuZHBvaW50TWVzc2FnZVJlY2VpdmVySW5PdXQuamF2YQ0KLW91dHB1dC9zcmMvb3JnL3NpbXBsZS9lbmRwb2ludC9TaW1wbGVFbmRwb2ludENhbGxiYWNrSGFuZGxlci5qYXZhDQotb3V0cHV0L3NyYy9vcmcvc2ltcGxlL2VuZHBvaW50L1NpbXBsZUVuZHBvaW50U3R1Yi5qYXZhDQotb3V0cHV0L3NyYy9zaW1wbGVucw0KLW91dHB1dC9zcmMvc2ltcGxlbnMvdHlwZXMNCi1vdXRwdXQvc3JjL3NpbXBsZW5zL3R5cGVzL1NpbXBsZUxvZ2luRG9jdW1lbnQuamF2YQ0KLW91dHB1dC9zcmMvc2ltcGxlbnMvdHlwZXMvaW1wbA0KLW91dHB1dC9zcmMvc2ltcGxlbnMvdHlwZXMvaW1wbC9TaW1wbGVMb2dpbkRvY3VtZW50SW1wbC5qYXZhDQotb3V0cHV0L3NyYy9zaW1wbGVucy90eXBlcy9pbXBsL1NpbXBsZUxvZ2luUmVzcG9uc2VEb2N1bWVudEltcGwuamF2YQ0KLW91dHB1dC9zcmMvc2ltcGxlbnMvdHlwZXMvU2ltcGxlTG9naW5SZXNwb25zZURvY3VtZW50LmphdmENCi08L3ByZT4NCi08cD5UaGUgZmlyc3QgaW1wb3J0YW50IGRpc3RpbmN0aW9uIGlzIHRoYXQgd2hpbGUgdGhlIEF4aXMgMS54DQotZXhhbXBsZSBnZW5lcmF0ZWQgZGVwbG95LndzZGQgYW5kIHVuZGVwbG95LndzZGQsIHRoZSBBeGlzMiBleGFtcGxlDQotY3JlYXRlZCBhIHNlcnZpY2VzLnhtbC4gVGhlIGZpbGVzIGRlcGxveS53c2RkIGFuZCBzZXJ2aWNlcy54bWwgYXJlDQotYSBicmVlZCBhcGFydCwgY29taW5nIGZyb20gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuIFRoZXJlIGlzIG5vDQotZGlyZWN0IHBhcmFsbGVsIGJldHdlZW4gdGhlbS4gU2VlIHRoZSBBeGlzMiB1c2VyIGd1aWRlIGZvciBhbg0KLWV4cGxhbmF0aW9uIGFib3V0IHNlcnZpY2VzLnhtbDwvcD4NCi08cD5Ob3cgd2UncmUgcmVhZHkgdG8gY29kZS4gV2UnbGwgc3RhcnQgd2l0aCBBeGlzIDEueCBvbiB0aGUNCi1zZXJ2aWNlIHNpZGUuIFRvIGltcGxlbWVudCB0aGUgYnVzaW5lc3MgbG9naWMsIHdlJ2xsIGNoYW5nZQ0KLXNpbXBsZU5TL1NpbXBsZUVuZHBvaW50QmluZGluZ0ltcGwuamF2YSBmcm9tOjwvcD4NCi08cHJlIGNsYXNzPSJjb2RlIj4NCi1wYWNrYWdlIHNpbXBsZU5TOw0KLQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVFbmRwb2ludEJpbmRpbmdJbXBsIGltcGxlbWVudHMgc2ltcGxlTlMuU2ltcGxlRW5kcG9pbnR7DQotICAgIHB1YmxpYyBzaW1wbGVOUy50eXBlcy5TaW1wbGVMb2dpblJlc3BvbnNlIHNpbXBsZUxvZ2luKHNpbXBsZU5TLnR5cGVzLlNpbXBsZUxvZ2luIHBhcmFtZXRlcnMpIA0KLSAgICAgICAgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLX0NCi08L3ByZT4NCi08cD5Ubzo8L3A+DQotPHByZSBjbGFzcz0iY29kZSI+DQotcGFja2FnZSBzaW1wbGVOUzsNCi0NCi1wdWJsaWMgY2xhc3MgU2ltcGxlRW5kcG9pbnRCaW5kaW5nSW1wbCBpbXBsZW1lbnRzIHNpbXBsZU5TLlNpbXBsZUVuZHBvaW50ew0KLSAgICBwdWJsaWMgc2ltcGxlTlMudHlwZXMuU2ltcGxlTG9naW5SZXNwb25zZSBzaW1wbGVMb2dpbihzaW1wbGVOUy50eXBlcy5TaW1wbGVMb2dpbiBwYXJhbWV0ZXJzKSANCi0gICAgICAgIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gcGFyYW1ldGVycy5nZXRVc2VyX25hbWUoKTsNCi0gICAgICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcmFtZXRlcnMuZ2V0VXNlcl9wYXNzd29yZCgpOw0KLSAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhvc2UgdmFycy4uLg0KLSAgICAgICAgcmV0dXJuIG5ldyBzaW1wbGVOUy50eXBlcy5TaW1wbGVMb2dpblJlc3BvbnNlKCJteVNlc3Npb25JRCIsICJ1c2VybmFtZSIpOw0KLSAgICB9DQotDQotfQ0KLTwvcHJlPg0KLTxwPkluIEF4aXMgMS54LCB0aGUgbmV4dCBzdGVwIGlzIHRvIGNvbXBpbGUgdGhlIGNsYXNzZXMgYW5kIHB1dA0KLXRoZW0gaW4gdGhlIEF4aXMud2FyLCBhbmQgdGhlbiBydW4gdGhlIGFkbWluIGNsaWVudCB3aXRoIHRoZQ0KLWdlbmVyYXRlZCBkZXBsb3kud3NkZC4gWW91IHRoZW4gbG9vayBhdCB0aGUgaGFwcHkgYXhpcyBwYWdlIHRvDQotdmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgaGFzIGJlZW4gaW5zdGFsbGVkIGNvcnJlY3RseS48L3A+DQotPHA+Tm93IGxldCdzIGNvZGUgQXhpczIuIEluIEF4aXMgMS54LCB3aGlsZSB0aGUgQW50IHRhc2sgc2hvd24gaW4NCi10aGUgZXhhbXBsZSBjcmVhdGVkIGEgc2tlbGV0b24sIGEgcGVlayBpbnNpZGUgc2hvd3MgdGhhdCB0aGUNCi1za2VsZXRvbiBjYWxscyB0aGUgYmluZGluZyBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gSW4gQXhpczIsIHdlIHdvcmsNCi13aXRoIHRoZSBza2VsZXRvbiBkaXJlY3RseS4gVG8gaW1wbGVtZW50IHRoZSBidXNpbmVzcyBsb2dpYyBpbiB0aGUNCi1nZW5lcmF0ZWQgQXhpczIgY2xhc3Nlcywgd2UnbGwgY2hhbmdlDQotb3JnL3NpbXBsZS9lbmRwb2ludC9TaW1wbGVFbmRwb2ludFNrZWxldG9uLmphdmEgZnJvbTo8L3A+DQotPHByZSBjbGFzcz0iY29kZSI+DQotcGFja2FnZSBvcmcuc2ltcGxlLmVuZHBvaW50Ow0KLSAgICAvKioNCi0gICAgICogIFNpbXBsZUVuZHBvaW50U2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgY2xhc3MgU2ltcGxlRW5kcG9pbnRTa2VsZXRvbiB7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0gICAgICAgICAgKiBAcGFyYW0gcGFyYW0wDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyAgc2ltcGxlbnMudHlwZXMuU2ltcGxlTG9naW5SZXNwb25zZURvY3VtZW50IHNpbXBsZUxvZ2luDQotICAgICAgICAgICAgICAgICAgKHNpbXBsZW5zLnR5cGVzLlNpbXBsZUxvZ2luRG9jdW1lbnQgcGFyYW0wICkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIC8vVG9kbyBmaWxsIHRoaXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGJ1c2luZXNzIGxvZ2ljDQotICAgICAgICAgICAgICAgIHRocm93IG5ldyAgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotfQ0KLTwvcHJlPg0KLTxwPlRvOjwvcD4NCi08cHJlIGNsYXNzPSJjb2RlIj4NCi1wYWNrYWdlIG9yZy5zaW1wbGUuZW5kcG9pbnQ7DQotICAgIA0KLSAgICBpbXBvcnQgc2ltcGxlbnMudHlwZXMuKjsNCi0gICAgaW1wb3J0IHNpbXBsZW5zLnR5cGVzLlNpbXBsZUxvZ2luUmVzcG9uc2VEb2N1bWVudC4qOw0KLSAgICBpbXBvcnQgc2ltcGxlbnMudHlwZXMuU2ltcGxlTG9naW5Eb2N1bWVudC4qOw0KLSAgICAvKioNCi0gICAgICogIFNpbXBsZUVuZHBvaW50U2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgY2xhc3MgU2ltcGxlRW5kcG9pbnRTa2VsZXRvbiB7DQotICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogTW9kaWZpZWQgDQotICAgICAgICAgICogQHBhcmFtIHNpbXBsZUxvZ2luRG9jdW1lbnQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIFNpbXBsZUxvZ2luUmVzcG9uc2VEb2N1bWVudCBzaW1wbGVMb2dpbg0KLSAgICAgICAgICAgICAgICAgIChzaW1wbGVucy50eXBlcy5TaW1wbGVMb2dpbkRvY3VtZW50IHNpbXBsZUxvZ2luRG9jdW1lbnQpew0KLSAgDQotICAgICAgICAgICAgICAgIFNpbXBsZUxvZ2luUmVzcG9uc2VEb2N1bWVudCByZXREb2MgPQ0KLSAgICAgICAgICAgICAgICAgICAgU2ltcGxlTG9naW5SZXNwb25zZURvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBTaW1wbGVMb2dpblJlc3BvbnNlIHJldEVsZW1lbnQgPQ0KLSAgICAgICAgICAgICAgICAgICAgU2ltcGxlTG9naW5SZXNwb25zZS5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICANCi0gICAgICAgICAgICAgICAgLy8gR2V0IHBhcmFtZXRlcnMgcGFzc2VkIGluIA0KLSAgICAgICAgICAgICAgICBTaW1wbGVMb2dpbiBzaW1wbGVMb2dpbiA9IHNpbXBsZUxvZ2luRG9jdW1lbnQuZ2V0U2ltcGxlTG9naW4oKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gc2ltcGxlTG9naW4uZ2V0VXNlck5hbWUoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gc2ltcGxlTG9naW4uZ2V0VXNlclBhc3N3b3JkKCk7DQotDQotICAgICAgICAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRob3NlIHZhcmlhYmxlcy4uLg0KLQ0KLSAgICAgICAgICAgICAgICByZXRFbGVtZW50LnNldFdlYlVzZXJOYW1lKHVzZXJOYW1lKTsNCi0gICAgICAgICAgICAgICAgcmV0RWxlbWVudC5zZXRTb2FwU2Vzc2lvbklkKCJteSByYW5kb20gc3RyaW5nIik7DQotICAgICAgICAgICAgICAgIHJldERvYy5zZXRTaW1wbGVMb2dpblJlc3BvbnNlKHJldEVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0RG9jOyANCi0gICAgICAgIH0NCi19DQotPC9wcmU+DQotPHA+SW4gQXhpczIsIHRoZSBuZXh0IHN0ZXAgaXMgdG8gY29tcGlsZSB0aGUgY2xhc3NlcywgcHV0IHRoZW0NCi1hbG9uZyB3aXRoIHRoZSBnZW5lcmF0ZWQgc2VydmljZXMueG1sIGluIGFuIEFBUiwgYW5kIHRoZW4gaG90DQotZGVwbG95IHRoZSBBQVIgYnkgcGxhY2luZyBpdCBpbiB0aGUgQXhpczIud2FyIHVuZGVyDQotV0VCLUlORi9zZXJ2aWNlcy4gUG9pbnQgYSBicm93c2VyIHRvDQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL2xpc3RTZXJ2aWNlcywgYW5kIHlvdSBzaG91bGQgc2VlIHRoZQ0KLXNlcnZpY2UgJ1NpbXBsZVNlcnZpY2UnIHJlYWR5IGZvciBhY3Rpb24uIFNlZSB0aGUgQXhpczIgdXNlciBndWlkZQ0KLWZvciBtb3JlIGluZm8uPC9wPg0KLTxwPlRoZSBsYXN0IHN0ZXAgaXMgY29uc3RydWN0aW5nIHRoZSBjbGllbnQuIE91ciBBeGlzIDEueCBjbGllbnQNCi1mb3IgdGhpcyBleGFtcGxlIGlzOjwvcD4NCi08cHJlPg0KLXBhY2thZ2Ugb3JnOw0KLQ0KLWltcG9ydCBzaW1wbGVOUy4qOw0KLWltcG9ydCBzaW1wbGVOUy50eXBlcy4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0ZXIgew0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAvLyBNYWtlIGEgc2VydmljZQ0KLSAgICBTaW1wbGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2ltcGxlU2VydmljZUxvY2F0b3IoKTsNCi0NCi0gICAgLy8gTm93IHVzZSB0aGUgc2VydmljZSB0byBnZXQgYSBzdHViIHdoaWNoIGltcGxlbWVudHMgdGhlIFNESS4NCi0gICAgU2ltcGxlRW5kcG9pbnQgcG9ydCA9ICBzZXJ2aWNlLmdldFNpbXBsZUVuZHBvaW50UG9ydCgpOw0KLQ0KLSAgICAvLyBzZXQgdGhlIHBhcmFtcw0KLSAgICBTaW1wbGVMb2dpbiBwYXJhbWV0ZXJzID0gbmV3IFNpbXBsZUxvZ2luKCJ1c2VybmFtZSIsInBhc3N3b3JkIik7DQotICAgIC8vIE1ha2UgdGhlIGFjdHVhbCBjYWxsDQotICAgIFNpbXBsZUxvZ2luUmVzcG9uc2Ugc2ltcGxlTG9naW5SZXNwb25zZSA9IHBvcnQuc2ltcGxlTG9naW4ocGFyYW1ldGVycyk7DQotICAgIFN0cmluZyBzZXNzaW9uID0gc2ltcGxlTG9naW5SZXNwb25zZS5nZXRTb2FwX3Nlc3Npb25faWQoKTsNCi0gICAgU3RyaW5nIHVzZXIgPSBzaW1wbGVMb2dpblJlc3BvbnNlLmdldFdlYl91c2VyX25hbWUoKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJzaW1wbGVMb2dpblJlc3BvbnNlLCBzZXNzaW9uOiAiICsgc2Vzc2lvbiArICIsIHVzZXI6ICIgKyB1c2VyKTsNCi0gIH0NCi19DQotPC9wcmU+DQotPHA+RmluYWxseSwgb3VyIEF4aXMyIGNsaWVudCBmb3IgdGhpcyBleGFtcGxlIGlzOjwvcD4NCi08cHJlPg0KLXBhY2thZ2Ugb3JnOw0KLWltcG9ydCBzaW1wbGVucy50eXBlcy4qOw0KLWltcG9ydCBzaW1wbGVucy50eXBlcy5TaW1wbGVMb2dpbkRvY3VtZW50Lio7DQotaW1wb3J0IHNpbXBsZW5zLnR5cGVzLlNpbXBsZUxvZ2luUmVzcG9uc2VEb2N1bWVudC4qOw0KLWltcG9ydCBzaW1wbGVucy50eXBlcy5pbXBsLio7DQotaW1wb3J0IG9yZy5zaW1wbGUuZW5kcG9pbnQuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdGVyIHsNCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgLy8geW91IG1heSBub3QgbmVlZCB0byBwYXNzIGluIHRoZSB1cmwgdG8gdGhlIGNvbnN0cnVjdG9yIC0gdHJ5IHRoZSBkZWZhdWx0IG5vIGFyZyBvbmUNCi0gICAgU2ltcGxlRW5kcG9pbnRTdHViIHN0dWIgPQ0KLSAgICAgICAgIG5ldyBTaW1wbGVFbmRwb2ludFN0dWIobnVsbCwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TaW1wbGVTZXJ2aWNlIik7DQotDQotICAgIFNpbXBsZUxvZ2luIHNpbXBsZUxvZ2luID0gU2ltcGxlTG9naW4uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICBzaW1wbGVMb2dpbi5zZXRVc2VyTmFtZSgidXNlck5hbWUiKTsNCi0gICAgc2ltcGxlTG9naW4uc2V0VXNlclBhc3N3b3JkKCJwYXNzd29yZCIpOw0KLQ0KLSAgICBTaW1wbGVMb2dpbkRvY3VtZW50IHNpbXBsZUxvZ2luRG9jdW1lbnQgPQ0KLSAgICAgICAgU2ltcGxlTG9naW5Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotDQotICAgIHNpbXBsZUxvZ2luRG9jdW1lbnQuc2V0U2ltcGxlTG9naW4oc2ltcGxlTG9naW4pOw0KLQ0KLSAgICBTaW1wbGVMb2dpblJlc3BvbnNlRG9jdW1lbnQgc2ltcGxlTG9naW5SZXNwb25zZURvY3VtZW50DQotICAgICAgICA9IHN0dWIuc2ltcGxlTG9naW4oc2ltcGxlTG9naW5Eb2N1bWVudCk7DQotDQotICAgIFNpbXBsZUxvZ2luUmVzcG9uc2Ugc2ltcGxlTG9naW5SZXNwb25zZSA9DQotICAgICAgICBzaW1wbGVMb2dpblJlc3BvbnNlRG9jdW1lbnQuZ2V0U2ltcGxlTG9naW5SZXNwb25zZSgpOw0KLQ0KLSAgICBTdHJpbmcgc2Vzc2lvbiA9IHNpbXBsZUxvZ2luUmVzcG9uc2UuZ2V0U29hcFNlc3Npb25JZCgpOw0KLSAgICBTdHJpbmcgdXNlciA9IHNpbXBsZUxvZ2luUmVzcG9uc2UuZ2V0V2ViVXNlck5hbWUoKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJzaW1wbGVMb2dpblJlc3BvbnNlLCBzZXNzaW9uOiAiICsgc2Vzc2lvbiArICIsIHVzZXI6ICIgKyB1c2VyKTsNCi0NCi0gIH0NCi19DQotPC9wcmU+DQotPHA+QXhpczIgY2xpZW50cyBhbHNvIGhhdmUgYXN5bmNocm9ub3VzIG9wdGlvbnMgdmlhIGEgQ2FsbGJhY2sgYW5kDQotYWx0ZXJuYXRpdmVseSBhICdGaXJlIGFuZCBmb3JnZXQnLiBTZWUgdGhlIHVzZXIgZ3VpZGUgZm9yIG1vcmUNCi1kZXRhaWxzLjwvcD4NCi08YSBuYW1lPSJiZXN0IiBpZD0iYmVzdCI+PC9hPg0KLTxoMj5CZXN0IFVzYWdlPC9oMj4NCi08cD5BeGlzMS54IGFuZCBBeGlzMiBoYXZlIGRpZmZlcmVudCB3YXlzIG9mIHNlZWluZyB0aGUgU09BUCBzdGFjay4NCi1TbyB0aGUgYmVzdCB3YXkgdG8gbWlncmF0ZSBpcyB0byBmb2xsb3cgdGhlIDxhIGhyZWY9DQotInVzZXJndWlkZS5odG1sIj5Vc2VyJ3MgR3VpZGU8L2E+IGFuZCB0aGUgPGEgaHJlZj0NCi0iQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sIj5BcmNoaXRlY3R1cmUgR3VpZGU8L2E+IG9mIEF4aXMyDQotcHJvcGVybHkuIFdlIGFyZSBjb25maWRlbnQgeW91IHdpbGwgZmluZCBBeGlzMiB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZA0KLWFuZCBtb3JlIGZyaWVuZGx5IHRvIHVzZSB0aGFuIGl0cyBwcmVkZWNlc3Nvci48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbW9kdWxlcy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbW9kdWxlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2JmMmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL21vZHVsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPldyaXRpbmcgeW91ciBPd24gQXhpczIgTW9kdWxlPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBkaXI9Imx0ciIgbGFuZz0iZW4tVVMiIHhtbDpsYW5nPSJlbi1VUyI+DQotPGEgbmFtZT0iTW9kdWxlcyIgaWQ9Ik1vZHVsZXMiPjwvYT4NCi08aDE+V3JpdGluZyBZb3VyIE93biBBeGlzMiBNb2R1bGU8L2gxPg0KLTxwPkF4aXMyIHByb3ZpZGVzIGV4dGVuZGVkIHN1cHBvcnQgZm9yIG1vZHVsZXMgKFNlZSB0aGUgPGEgaHJlZj0NCi0iQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+QXJjaGl0ZWN0dXJlDQotR3VpZGU8L2E+IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgbW9kdWxlcyBpbiBBeGlzMikuIExldCdzIGNyZWF0ZSBhDQotY3VzdG9tIG1vZHVsZSBhbmQgZGVwbG95IGl0IHRvIE15U2VydmljZSwgd2hpY2ggd2UgY3JlYXRlZA0KLWVhcmxpZXIuPC9wPg0KLTxwPlNlbmQgeW91ciBmZWVkYmFjayBvciBxdWVzdGlvbnMgdG86IDxhIGhyZWY9DQotIm1haWx0bzpheGlzLWRldkB3cy5hcGFjaGUub3JnP3N1YmplY3Q9W0F4aXMyXSI+YXhpcy1kZXZAd3MuYXBhY2hlLm9yZzwvYT4uDQotKCBTdWJzY3JpcHRpb24gZGV0YWlscyBhcmUgYXZhaWxhYmxlIG9uIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tYWlsLWxpc3RzLmh0bWwiPkF4aXMyIHNpdGU8L2E+LikNCi1LaW5kbHkgcHJlZml4IHN1YmplY3Qgd2l0aCBbQXhpczJdLjwvcD4NCi08aDI+Q29udGVudCBMaXN0PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNNeVNlcnZpY2Vfd2l0aF9hX0xvZ2dpbmdfTW9kdWxlIj5NeVNlcnZpY2Ugd2l0aCBhDQotTG9nZ2luZyBNb2R1bGU8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjU3RlcDFfOl9Mb2dnaW5nTW9kdWxlX0NsYXNzIj5TdGVwMSA6IExvZ2dpbmdNb2R1bGUNCi1DbGFzczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjU3RlcDJfOl9Mb2dIYW5kbGVyIj5TdGVwMiA6IExvZ0hhbmRsZXI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI1N0ZXAzXzpfbW9kdWxlX3htbCI+U3RlcDMgOiBtb2R1bGUueG1sPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNTdGVwXzQ6X01vZGlmeV90aGVfJnF1b3Q7YXhpczJfeG1sJnF1b3Q7Ij5TdGVwNDoNCi1Nb2RpZnkgdGhlICJheGlzMi54bWwiPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNTdGVwNV86X01vZGlmeV90aGVfJnF1b3Q7c2VydmljZXNfeG1sJnF1b3Q7Ij5TdGVwNSA6DQotTW9kaWZ5IHRoZSAic2VydmljZXMueG1sPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNTdGVwNl86X1BhY2thZ2luZyI+U3RlcDYgOiBQYWNrYWdpbmc8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI1N0ZXA3XzpfRGVwbG95X3RoZV9Nb2R1bGVfaW5fQXhpczIiPlN0ZXA3IDogRGVwbG95DQotdGhlIE1vZHVsZSBpbiBBeGlzMjwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08L3VsPg0KLTxwPlRoZSBmb2xsb3dpbmcgc3RlcHMgc2hvdyB0aGUgYWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkDQotdG8gZGVwbG95IGEgY3VzdG9tIG1vZHVsZSBmb3IgYSBnaXZlbiBXZWIgc2VydmljZTo8L3A+DQotPG9sPg0KLTxsaT4NCi08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj5DcmVhdGUgdGhlIE1vZHVsZSBJbXBsZW1lbnRhdGlvbjwvcD4NCi08L2xpPg0KLTxsaT4NCi08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj5DcmVhdGUgdGhlIEhhbmRsZXJzPC9wPg0KLTwvbGk+DQotPGxpPg0KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPkNyZWF0ZSB0aGUgbW9kdWxlLnhtbDwvcD4NCi08L2xpPg0KLTxsaT4NCi08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj5Nb2RpZnkgdGhlICJheGlzMi54bWwiIChpZiB5b3UgbmVlZA0KLWN1c3RvbSBwaGFzZXMpPC9wPg0KLTwvbGk+DQotPGxpPg0KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPk1vZGlmeSB0aGUgInNlcnZpY2VzLnhtbCIgdG8gZW5nYWdlDQotbW9kdWxlcyBhdCB0aGUgZGVwbG95bWVudCB0aW1lLjwvcD4NCi08L2xpPg0KLTxsaT4NCi08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj5QYWNrYWdlIGluIGEgIi5tYXIiIChNb2R1bGUNCi1BcmNoaXZlKTwvcD4NCi08L2xpPg0KLTxsaT4NCi08cD5EZXBsb3kgdGhlIG1vZHVsZSBpbiBBeGlzMjwvcD4NCi08L2xpPg0KLTwvb2w+DQotPGEgbmFtZT0iTXlTZXJ2aWNlX3dpdGhfYV9Mb2dnaW5nX01vZHVsZSIgaWQ9DQotIk15U2VydmljZV93aXRoX2FfTG9nZ2luZ19Nb2R1bGUiPjwvYT4NCi08aDM+TXlTZXJ2aWNlIHdpdGggYSBMb2dnaW5nIE1vZHVsZTwvaDM+DQotPHA+TGV0J3Mgd3JpdGUgYSBzaW1wbGUgbG9nZ2luZyBtb2R1bGUgZm9yIG91ciBzYW1wbGUgbG9jYXRlZCBhdA0KLXRoZSA8Yj4ic2FtcGxlc1x1c2VyZ3VpZGVcc3JjIjwvYj4gZGlyZWN0b3J5IG9mIHRoZSBiaW5hcnkNCi1kaXN0cmlidXRpb24uIFRoaXMgbW9kdWxlIGNvbnRhaW5zIG9uZSBoYW5kbGVyIHRoYXQganVzdCBsb2dzIHRoZQ0KLW1lc3NhZ2UgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCBpdC4gQXhpczIgdXNlcyAiLm1hciIgKE1vZHVsZQ0KLUFyY2hpdmUpIHRvIGRlcGxveSBtb2R1bGVzIGluIEF4aXMyLiBUaGUgZm9sbG93aW5nIGRpYWdyYW0gc2hvd3MNCi10aGUgZmlsZSBzdHJ1Y3R1cmUgaW5zaWRlIHdoaWNoIG5lZWRzIHRvIGJlIHRoZXJlIGluIHRoZSAiLm1hciINCi1hcmNoaXZlLiBMZXQncyBjcmVhdGUgYWxsIHRoZXNlIGFuZCBzZWUgaG93IGl0IHdvcmtzLjwvcD4NCi08cD48aW1nIHNyYz0iaW1hZ2VzL3VzZXJndWlkZS9Nb2R1bGVWaWV3LmpwZyIgbmFtZT0iR3JhcGhpYzUiDQotYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBpZD0iR3JhcGhpYzUiIC8+PC9wPg0KLTxhIG5hbWU9IlN0ZXAxXzpfTG9nZ2luZ01vZHVsZV9DbGFzcyIgaWQ9DQotIlN0ZXAxXzpfTG9nZ2luZ01vZHVsZV9DbGFzcyI+PC9hPg0KLTxoND5TdGVwMSA6IExvZ2dpbmdNb2R1bGUgQ2xhc3M8L2g0Pg0KLTxwPkxvZ2dpbmdNb2R1bGUgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHRoZSBBeGlzMiBtb2R1bGUuDQotQXhpczIgbW9kdWxlcyBzaG91bGQgaW1wbGVtZW50IHRoZSAiPGEgaHJlZj0NCi0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvbW9kdWxlcy9jb3JlL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21vZHVsZXMvTW9kdWxlLmphdmE/cmV2PTM5Njc4NSZhbXA7dmlldz1sb2ciPm9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU8L2E+Ig0KLWludGVyZmFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0aG9kcy48L3A+DQotPHByZT4NCi1wdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0Oy8vSW5pdGlhbGl6ZSB0aGUgbW9kdWxlDQotcHVibGljIHZvaWQgc2h1dGRvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ly9FbmQgb2YgbW9kdWxlIHByb2Nlc3NpbmcNCi1wdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdDsNCi1wdWJsaWMgdm9pZCBhcHBseVBvbGljeShQb2xpY3kgcG9saWN5LCBBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IDsNCi1wdWJsaWMgYm9vbGVhbiBjYW5TdXBwb3J0QXNzZXJ0aW9uKEFzc2VydGlvbiBhc3NlcnRpb24pIDsNCi08L3ByZT4NCi08cD5UaGUgZmlyc3QgdGhyZWUgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBtb2R1bGUNCi1pbml0aWFsaXphdGlvbiBhbmQgdGhlIHRlcm1pbmF0aW9uLCBhbmQgdGhlIG5leHQgdGhyZWUgbWV0aG9kcyBhcmUNCi11c2VkIHRvIHBlcmZvcm0gcG9saWN5IHJlbGF0ZWQgb3BlcmF0aW9ucy4gV2l0aCB0aGUgaW5wdXQgcGFyYW1ldGVyDQotQXhpc0NvbmZpZ3VyYXRpb24sIHRoZSB1c2VyIGlzIHByb3ZpZGVkIHdpdGggdGhlIGNvbXBsZXRlDQotY29uZmlndXJhdGlvbiBoaWVyYXJjaHkuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBtb2R1bGUNCi1iZWhhdmlvciBieSB0aGUgbW9kdWxlIHdyaXRlcnMuIEZvciBhIHNpbXBsZSBsb2dnaW5nIHNlcnZpY2UsIHdlDQotY2FuIGtlZXAgdGhlc2UgbWV0aG9kcyBibGFuayBpbiBvdXIgaW1wbGVtZW50YXRpb24gY2xhc3MuPC9wPg0KLTxhIG5hbWU9IlN0ZXAyXzpfTG9nSGFuZGxlciIgaWQ9IlN0ZXAyXzpfTG9nSGFuZGxlciI+PC9hPg0KLTxoND5TdGVwMiA6IExvZ0hhbmRsZXI8L2g0Pg0KLTxwPkEgbW9kdWxlIGluIEF4aXMyIGNhbiBjb250YWluLCBvbmUgb3IgbW9yZSBoYW5kbGVycyB0aGF0IHBlcmZvcm0NCi12YXJpb3VzIFNPQVAgaGVhZGVyIHByb2Nlc3NpbmcgYXQgZGlmZmVyZW50IHBoYXNlcy4gKFNlZSB0aGUNCi08YSBocmVmPSJBeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWwjaW5jb21pbmdzb2FwIiB0YXJnZXQ9DQotIl9ibGFuayI+QXJjaGl0ZWN0dXJlIEd1aWRlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwaGFzZXMpLiBUbw0KLXdyaXRlIGEgaGFuZGxlciBvbmUgc2hvdWxkIGltcGxlbWVudCA8YSBocmVmPQ0KLSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YS9tb2R1bGVzL2NvcmUvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXIuamF2YT9yZXY9MzU3MTg3JmFtcDt2aWV3PWxvZyI+DQotb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjwvYT4uIEJ1dCBmb3IgY29udmVuaWVuY2UsIDxhIGhyZWY9DQotImh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvY29yZS9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9BYnN0cmFjdEhhbmRsZXIuamF2YT9yZXY9Mzk2Nzg4JmFtcDt2aWV3PWxvZyI+DQotb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI8L2E+IHByb3ZpZGVzIGFuIGFic3RyYWN0DQotaW1wbGVtZW50YXRpb24gb2YgdGhlIEhhbmRsZXIgaW50ZXJmYWNlLjwvcD4NCi08cD5Gb3IgdGhlIGxvZ2dpbmcgbW9kdWxlLCB3ZSB3aWxsIHdyaXRlIGEgaGFuZGxlciB3aXRoIHRoZQ0KLWZvbGxvd2luZyBtZXRob2RzLiAicHVibGljIHZvaWQgaW52b2tlKE1lc3NhZ2VDb250ZXh0IGN0eCk7IiBpcyB0aGUNCi1tZXRob2QgdGhhdCBpcyBjYWxsZWQgYnkgdGhlIEF4aXMyIGVuZ2luZSB3aGVuIHRoZSBjb250cm9sIGlzDQotcGFzc2VkIHRvIHRoZSBoYW5kbGVyLiAicHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IGN0eCk7IiBpcw0KLWNhbGxlZCB3aGVuIHRoZSBoYW5kbGVycyBhcmUgcmV2b2tlZCBieSB0aGUgQXhpczIgZW5naW5lLjwvcD4NCi08cHJlPg0KLXB1YmxpYyBjbGFzcyBMb2dIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2dIYW5kbGVyLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBsb2cuaW5mbyhtc2dDb250ZXh0LmdldEVudmVsb3BlKCkudG9TdHJpbmcoKSk7DQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOyAgICAgICAgDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsNCi0gICAgICAgIGxvZy5pbmZvKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS50b1N0cmluZygpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTxhIG5hbWU9IlN0ZXAzXzpfbW9kdWxlX3htbCIgaWQ9IlN0ZXAzXzpfbW9kdWxlX3htbCI+PC9hPg0KLTxoND5TdGVwMyA6IG1vZHVsZS54bWw8L2g0Pg0KLTxwPiJtb2R1bGUueG1sIiBjb250YWlucyB0aGUgZGVwbG95bWVudCBjb25maWd1cmF0aW9ucyBmb3IgYQ0KLXBhcnRpY3VsYXIgbW9kdWxlLiBJdCBjb250YWlucyBkZXRhaWxzIHN1Y2ggYXMgdGhlIEltcGxlbWVudGF0aW9uDQotY2xhc3Mgb2YgdGhlIG1vZHVsZSAoaW4gdGhpcyBleGFtcGxlIGl0IGlzIHRoZSAiTG9nZ2luZ01vZHVsZSINCi1jbGFzcyBhbmQgdmFyaW91cyBoYW5kbGVycyB0aGF0IHdpbGwgcnVuIGluIGRpZmZlcmVudCBwaGFzZXMpLiBUaGUNCi0ibW9kdWxlLnhtbCIgZm9yIHRoZSBsb2dnaW5nIG1vZHVsZSB3aWxsIGJlIGFzIGZvbGxvd3M6PC9wPg0KLTxwcmU+DQotJmx0O21vZHVsZSBuYW1lPSJsb2dnaW5nIiBjbGFzcz0idXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGUuTG9nZ2luZ01vZHVsZSImZ3Q7DQotICAgJmx0O0luRmxvdyZndDsNCi0gICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IkluRmxvd0xvZ0hhbmRsZXIiIGNsYXNzPSJ1c2VyZ3VpZGUubG9nZ2luZ21vZHVsZS5Mb2dIYW5kbGVyIiZndDsNCi0gICAgICAgICZsdDtvcmRlciBwaGFzZT0ibG9nZ2luZ1BoYXNlIiAvJmd0Ow0KLSAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLSAgICZsdDsvSW5GbG93Jmd0Ow0KLQ0KLSAgICZsdDtPdXRGbG93Jmd0Ow0KLSAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iT3V0Rmxvd0xvZ0hhbmRsZXIiIGNsYXNzPSJ1c2VyZ3VpZGUubG9nZ2luZ21vZHVsZS5Mb2dIYW5kbGVyIiZndDsNCi0gICAgICAgICZsdDtvcmRlciBwaGFzZT0ibG9nZ2luZ1BoYXNlIi8mZ3Q7DQotICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7DQotICAgJmx0Oy9PdXRGbG93Jmd0Ow0KLQ0KLSAgICZsdDtPdXRGYXVsdEZsb3cmZ3Q7DQotICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJGYXVsdE91dEZsb3dMb2dIYW5kbGVyIiBjbGFzcz0idXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGUuTG9nSGFuZGxlciImZ3Q7DQotICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9ImxvZ2dpbmdQaGFzZSIvJmd0Ow0KLSAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLSAgICZsdDsvT3V0RmF1bHRGbG93Jmd0Ow0KLQ0KLSAgICZsdDtJbkZhdWx0RmxvdyZndDsNCi0gICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IkZhdWx0SW5GbG93TG9nSGFuZGxlciIgY2xhc3M9InVzZXJndWlkZS5sb2dnaW5nbW9kdWxlLkxvZ0hhbmRsZXIiJmd0Ow0KLSAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJsb2dnaW5nUGhhc2UiLyZndDsNCi0gICAgICAgICZsdDsvaGFuZGxlciZndDsNCi0gICAmbHQ7L0luRmF1bHRGbG93Jmd0Ow0KLSZsdDsvbW9kdWxlJmd0Ow0KLTwvcHJlPg0KLTxwPkFzIHlvdSBjYW4gc2VlLCB0aGVyZSBhcmUgZm91ciBmbG93cyBkZWZpbmVkIGluIHRoZQ0KLSJtb2R1bGUueG1sIjwvcD4NCi08b2w+DQotPGxpPkluRmxvdyBSZXByZXNlbnRzIHRoZSBoYW5kbGVyIGNoYWluIHRoYXQgd2lsbCBydW4gd2hlbiBhDQotbWVzc2FnZSBpcyBjb21pbmcgaW4uPC9saT4NCi08bGk+DQotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+T3V0RmxvdyBSZXByZXNlbnRzIHRoZSBoYW5kbGVyIGNoYWluDQotdGhhdCB3aWxsIHJ1biB3aGVuIHRoZSBtZXNzYWdlIGlzIGdvaW5nIG91dC48L3A+DQotPC9saT4NCi08bGk+DQotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+T3V0RmF1bHRGbG93IC0gUmVwcmVzZW50cyB0aGUgaGFuZGxlcg0KLWNoYWluIHRoYXQgd2lsbCBydW4gd2hlbiB0aGVyZSBpcyBhIGZhdWx0LCBhbmQgdGhlIGZhdWx0IGlzIGdvaW5nDQotb3V0LjwvcD4NCi08L2xpPg0KLTxsaT4NCi08cD5JbkZhdWx0RmxvdyAtIFJlcHJlc2VudHMgdGhlIGhhbmRsZXIgY2hhaW4gdGhhdCB3aWxsIHJ1biB3aGVuDQotdGhlcmUgaXMgYSBmYXVsdCwgYW5kIHRoZSBmYXVsdCBpcyBjb21pbmcgaW4uPC9wPg0KLTwvbGk+DQotPC9vbD4NCi08cD5UaGUgZm9sbG93aW5nIHNldCBvZiB0YWdzIGRlc2NyaWJlIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLA0KLWhhbmRsZXIgY2xhc3MsIGFuZCB0aGUgcGhhc2UgaW4gd2hpY2ggdGhpcyBoYW5kbGVyIGlzIGdvaW5nIHRvIHJ1bi4NCi0iSW5GbG93TG9nSGFuZGxlciIgaXMgdGhlIG5hbWUgZ2l2ZW4gZm9yIHRoZSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mDQotdGhpcyBoYW5kbGVyIGNsYXNzLiBUaGUgdmFsdWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZSBpcyB0aGUgYWN0dWFsDQotaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoaXMgaGFuZGxlci4gU2luY2Ugd2UgYXJlIHdyaXRpbmcgYQ0KLWxvZ2dpbmcgaGFuZGxlciwgd2UgY2FuIHJldXNlIHRoZSBzYW1lIGhhbmRsZXIgaW4gYWxsIHRoZXNlIHBoYXNlcy4NCi1Ib3dldmVyLCB0aGlzIG1heSBub3QgYmUgdGhlIHNhbWUgZm9yIGFsbCB0aGUgbW9kdWxlcy4gIiZsdDtvcmRlcg0KLXBoYXNlPSJsb2dnaW5nUGhhc2UiIC8mZ3Q7IiBkZXNjcmliZXMgdGhlIHBoYXNlIGluIHdoaWNoIHRoaXMNCi1oYW5kbGVyIHJ1bnMuPC9wPg0KLTxwcmU+DQotJmx0O2hhbmRsZXIgbmFtZT0iSW5GbG93TG9nSGFuZGxlciIgY2xhc3M9InVzZXJndWlkZS5sb2dnaW5nbW9kdWxlLkxvZ0hhbmRsZXIiJmd0Ow0KLSZsdDtvcmRlciBwaGFzZT0ibG9nZ2luZ1BoYXNlIiAvJmd0Ow0KLSZsdDsvaGFuZGxlciZndDsNCi08L3ByZT4NCi08cD5UbyBsZWFybiBtb3JlIGFib3V0IFBoYXNlIHJ1bGVzLCBjaGVjayBvdXQgdGhlIGFydGljbGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5kZXZlbG9wZXIuY29tL2phdmEvd2ViL2FydGljbGUucGhwLzM1MjkzMjEiIHRhcmdldD0NCi0iX2JsYW5rIj5BeGlzMiBFeGVjdXRpb24gRnJhbWV3b3JrPC9hPjwvcD4NCi08YSBuYW1lPSJTdGVwXzQ6X01vZGlmeV90aGVfJnF1b3Q7YXhpczJfeG1sJnF1b3Q7Ij48L2E+DQotPGg0PlN0ZXAgNDogTW9kaWZ5IHRoZSAiYXhpczIueG1sIjwvaDQ+DQotPHA+SW4gdGhpcyBoYW5kbGVyLCB0aGUgImxvZ2dpbmdQaGFzZSIsIGlzIGRlZmluZWQgYnkgdGhlIG1vZHVsZQ0KLXdyaXRlci4gSXQgaXMgbm90IGEgcHJlLWRlZmluZWQgaGFuZGxlciBwaGFzZSwgaGVuY2UgdGhlIG1vZHVsZQ0KLXdyaXRlciBzaG91bGQgaW50cm9kdWNlIGl0IHRvIHRoZSAiYXhpczIueG1sIiAoTk9UIHRoZQ0KLXNlcnZpY2VzLnhtbCkgc28gdGhhdCB0aGUgQXhpczIgZW5naW5lIGtub3dzIHdoZXJlIHRvIHBsYWNlIHRoZQ0KLWhhbmRsZXIgaW4gZGlmZmVyZW50ICJmbG93cyIgKGluRmxvdywgb3V0RmxvdywgZXRjLikuIFRoZSBmb2xsb3dpbmcNCi1YTUwgbGluZXMgc2hvdyB0aGUgcmVzcGVjdGl2ZSBjaGFuZ2VzIG1hZGUgdG8gdGhlICJheGlzMi54bWwiIGluDQotb3JkZXIgdG8gZGVwbG95IHRoZSBsb2dnaW5nIG1vZHVsZSBpbiB0aGUgQXhpczIgZW5naW5lLiBUaGlzIGlzIGFuDQotZXh0cmFjdCBvZiB0aGUgcGhhc2Ugc2VjdGlvbiBvZiAiYXhpczIueG1sIi48L3A+DQotPHByZT4NCi0mbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0mZ3Q7DQotJmx0OyEtLSBQaGFzZXMgLS0mZ3Q7DQotJmx0OyEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tJmd0Ow0KLQ0KLSZsdDtwaGFzZU9yZGVyIHR5cGU9ImluZmxvdyImZ3Q7DQotICAgICAgICAmbHQ7IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLyZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiJmd0Ow0KLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciImZ3Q7DQotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsNCi0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7DQotDQotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIiZndDsNCi0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0Ow0KLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsNCi0NCi0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7DQotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLQ0KLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiJmd0Ow0KLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7DQotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0Ow0KLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9Ikluc3RhbmNlRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSW5zdGFuY2VEaXNwYXRjaGVyIiZndDsNCi0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJQb3N0RGlzcGF0Y2giLyZndDsNCi0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7DQotICAgICAgICAmbHQ7L3BoYXNlJmd0Ow0KLSAgICAgICAgJmx0OyEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLSZndDsNCi0gICAgICAgICZsdDshLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50cyAgICAgIC0tJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLyZndDsNCi0gICAgICAgICAgICAgICAgJmx0O3BoYXNlIG5hbWU9IjxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogcmdiKDM2LCAxOTMsIDE5KTsiPmxvZ2dpbmdQaGFzZTwvc3Bhbj4iLyZndDsNCi0gICAgJmx0Oy9waGFzZU9yZGVyJmd0Ow0KLSAgICAmbHQ7cGhhc2VPcmRlciB0eXBlPSJvdXRmbG93IiZndDsNCi0gICAgICAgICZsdDshLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLSZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IjxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogcmdiKDM2LCAxOTMsIDE5KTsiPmxvZ2dpbmdQaGFzZTwvc3Bhbj4iLyZndDsNCi0gICAgICAgICZsdDshLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMtLSZndDsNCi0gICAgICAgICZsdDshLS10aGVzZSBwaGFzZXMgd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLyZndDsNCi0gICAgJmx0Oy9waGFzZU9yZGVyLyZndDsNCi0gICAgJmx0O3BoYXNlT3JkZXIgdHlwZT0iSU5mYXVsdGZsb3ciJmd0Ow0KLSAgICAgICAgJmx0OyEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IjxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogcmdiKDM2LCAxOTMsIDE5KTsiPmxvZ2dpbmdQaGFzZTwvc3Bhbj4iLyZndDsNCi0gICAgJmx0Oy9waGFzZU9yZGVyJmd0Ow0KLSAgICAmbHQ7cGhhc2VPcmRlciB0eXBlPSJPdXRmYXVsdGZsb3ciJmd0Ow0KLSAgICAgICAgJmx0OyEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLyZndDsNCi0gICAgICAgICZsdDtwaGFzZSBuYW1lPSI8c3BhbiBzdHlsZT0NCi0iY29sb3I6IHJnYigzNiwgMTkzLCAxOSk7Ij5sb2dnaW5nUGhhc2U8L3NwYW4+Ii8mZ3Q7DQotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvJmd0Ow0KLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLyZndDsNCi0gICAgJmx0Oy9waGFzZU9yZGVyJmd0Ow0KLSAgICANCi08L3ByZT4NCi08cD5UaGUgdGV4dCBpbiBncmVlbiwgdGhlIGN1c3RvbSBwaGFzZSAibG9nZ2luZ1BoYXNlIiBpcyBwbGFjZWQgaW4NCi1hbGwgdGhlIGZsb3dzLCBoZW5jZSB0aGF0IHBoYXNlIHdpbGwgYmUgY2FsbGVkIGluIGFsbCB0aGUgbWVzc2FnZQ0KLWZsb3dzIGluIHRoZSBlbmdpbmUuIFNpbmNlIG91ciBtb2R1bGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMNCi1waGFzZSwgdGhlIExvZ0hhbmRsZXIgaW5zaWRlIHRoZSBtb2R1bGUgd2lsbCBub3cgYmUgZXhlY3V0ZWQgaW4NCi10aGlzIHBoYXNlLjwvcD4NCi08YSBuYW1lPSJTdGVwNV86X01vZGlmeV90aGVfJnF1b3Q7c2VydmljZXNfeG1sJnF1b3Q7Ij48L2E+DQotPGg0PlN0ZXA1IDogTW9kaWZ5IHRoZSAic2VydmljZXMueG1sIjwvaDQ+DQotPHA+VXAgdG8gdGhpcyBwb2ludCwgd2UgaGF2ZSBjcmVhdGVkIHRoZSByZXF1aXJlZCBjbGFzc2VzIGFuZA0KLWNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb25zIGZvciB0aGUgbG9nZ2luZyBtb2R1bGUsIGFuZCBieSBjaGFuZ2luZw0KLXRoZSAiYXhpczIueG1sIiB3ZSBjcmVhdGVkIHRoZSByZXF1aXJlZCBwaGFzZXMgZm9yIHRoZSBsb2dnaW5nDQotbW9kdWxlLjwvcD4NCi08cD5OZXh0IHN0ZXAgaXMgdG8gIjxiPmVuZ2FnZTwvYj4iICh1c2UpIHRoaXMgbW9kdWxlIGluIG9uZSBvZiBvdXINCi1zZXJ2aWNlcy4gRm9yIHRoaXMsIGxldCdzIHVzZSB0aGUgc2FtZSBXZWIgc2VydmljZSB0aGF0IHdlIGhhdmUNCi11c2VkIHRocm91Z2hvdXQgdGhlIHVzZXIncyBndWlkZS0gTXlTZXJ2aWNlLiBIb3dldmVyLCBzaW5jZSB3ZSBuZWVkDQotdG8gbW9kaWZ5IHRoZSAic2VydmljZXMueG1sIiBvZiBNeVNlcnZpY2UgaW4gb3JkZXIgdG8gZW5nYWdlIHRoaXMNCi1tb2R1bGUsIHdlIHVzZSBhIHNlcGFyYXRlIFdlYiBzZXJ2aWNlLCBidXQgd2l0aCBzaW1pbGFyDQotb3BlcmF0aW9ucy48L3A+DQotPHA+VGhlIGNvZGUgZm9yIHRoaXMgc2VydmljZSBjYW4gYmUgZm91bmQgaW4gdGhlDQotIjxzdHJvbmc+QXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUyPC9zdHJvbmc+Ig0KLWRpcmVjdG9yeS4gVGhlIHNpbXBsZSBjaGFuZ2VzIHRoYXQgd2UgaGF2ZSBkb25lIHRvICJzZXJ2aWNlcy54bWwnDQotYXJlIHNob3duIGluIGdyZWVuIGluIHRoZSBmb2xsb3dpbmcgbGluZXMgb2YgeG1sLjwvcD4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlIG5hbWU9IjxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogcmdiKDM2LCAxOTMsIDE5KTsiPk15U2VydmljZVdpdGhNb2R1bGU8L3NwYW4+IiZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICBUaGlzIGlzIGEgc2FtcGxlIFdlYiBzZXJ2aWNlIHdpdGggYSBsb2dnaW5nIG1vZHVsZSBlbmdhZ2VkLg0KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICA8c3BhbiBzdHlsZT0NCi0iY29sb3I6IHJnYigzNiwgMTkzLCAxOSk7Ij4mbHQ7bW9kdWxlIHJlZj0ibG9nZ2luZyIvJmd0Ozwvc3Bhbj4NCi0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiIGxvY2tlZD0ieHNkOmZhbHNlIiZndDt1c2VyZ3VpZGUuZXhhbXBsZTIuTXlTZXJ2aWNlJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0iZWNobyImZ3Q7DQotICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9InBpbmciJmd0Ow0KLSAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0mbHQ7L3NlcnZpY2UmZ3Q7DQotPC9wcmU+DQotPHA+SW4gdGhpcyBleGFtcGxlLCB3ZSBoYXZlIGNoYW5nZWQgdGhlIHNlcnZpY2UgbmFtZSAodGhlDQotaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgdmVyeSBzaW1pbGFyIHRvIHdoYXQgd2UgaGF2ZSB1c2VkIGVhcmxpZXIsDQotYWx0aG91Z2ggaXQgaXMgaW4gYSBkaWZmZXJlbnQgcGFja2FnZSkuIEluIGFkZGl0aW9uIHdlIGhhdmUgYWRkZWQNCi10aGUgbGluZSA8Yj4iJmx0O21vZHVsZSByZWY9ImxvZ2dpbmciLyZndDsiPC9iPiB0byAic2VydmljZXMueG1sIi4NCi1UaGlzIGluZm9ybXMgdGhlIEF4aXMyIGVuZ2luZSB0aGF0IHRoZSBtb2R1bGUgImxvZ2dpbmciIHNob3VsZCBiZQ0KLWVuZ2FnZWQgZm9yIHRoaXMgc2VydmljZS4gVGhlIGhhbmRsZXIgaW5zaWRlIHRoZSBtb2R1bGUgd2lsbCBiZQ0KLWV4ZWN1dGVkIGluIHRoZWlyIHJlc3BlY3RpdmUgcGhhc2VzIGFzIGRlc2NyaWJlZCBieSB0aGUNCi0ibW9kdWxlLnhtbCIuPC9wPg0KLTxhIG5hbWU9IlN0ZXA2XzpfUGFja2FnaW5nIiBpZD0iU3RlcDZfOl9QYWNrYWdpbmciPjwvYT4NCi08aDQ+U3RlcDYgOiBQYWNrYWdpbmc8L2g0Pg0KLTxwPkJlZm9yZSBkZXBsb3lpbmcgdGhlIG1vZHVsZSwgd2UgbmVlZCB0byBjcmVhdGUgdGhlICIubWFyIiBmaWxlDQotZm9yIHRoaXMgbW9kdWxlLiBUaGlzIGNhbiBiZSBkb25lLCB1c2luZyB0aGUgImphciIgY29tbWFuZCBhbmQgdGhlbg0KLXJlbmFtaW5nIHRoZSBjcmVhdGVkIC5qYXIgZmlsZS4gRWxzZSwgeW91IGNhbiBmaW5kIHRoZQ0KLSJsb2dnaW5nLm1hciIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgaW4gdGhlDQotIjxzdHJvbmc+QXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZTwvc3Ryb25nPiIgZGlyZWN0b3J5LjwvcD4NCi08YSBuYW1lPSJTdGVwN186X0RlcGxveV90aGVfTW9kdWxlX2luX0F4aXMyIiBpZD0NCi0iU3RlcDdfOl9EZXBsb3lfdGhlX01vZHVsZV9pbl9BeGlzMiI+PC9hPg0KLTxoND5TdGVwNyA6IERlcGxveSB0aGUgTW9kdWxlIGluIEF4aXMyPC9oND4NCi08cD5EZXBsb3lpbmcgYSBtb2R1bGUgaW4gQXhpczIgcmVxdWlyZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGENCi1kaXJlY3Rvcnkgd2l0aCB0aGUgbmFtZSAibW9kdWxlcyIgaW4gdGhlICJ3ZWJhcHBzL2F4aXMyL1dFQi1JTkYiDQotZGlyZWN0b3J5IG9mIHRoZWlyIHNlcnZsZXQgY29udGFpbmVyLCBhbmQgdGhlbiBjb3B5aW5nIHRoZSAiLm1hciINCi1maWxlIHRvIHRoYXQgZGlyZWN0b3J5LiBTbyBsZXQncyBmaXJzdCBjcmVhdGUgdGhlICJtb2R1bGVzIg0KLWRpcmVjdG9yeSBhbmQgZHJvcCB0aGUgImxvZ2dpbmcubWFyIiBpbnRvIHRoaXMgZGlyZWN0b3J5LjwvcD4NCi08cD5BbHRob3VnaCB0aGUgcmVxdWlyZWQgY2hhbmdlcyB0byB0aGUgInNlcnZpY2VzLnhtbCIgaXMgdmVyeQ0KLWxpdHRsZSwgd2UgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgc2VydmljZSBhcmNoaXZlDQotKE15U2VydmljZVdpdGhNb2R1bGUuYWFyKSBmb3IgdXNlcnMgdG8gZGVwbG95IHRoZSBzZXJ2aWNlLi48L3A+DQotPHA+RGVwbG95IHRoaXMgc2VydmljZSB1c2luZyB0aGUgc2FtZSBzdGVwcyB1c2VkIGluIHRoZSA8YSBocmVmPQ0KLSJhZHYtdXNlcmd1aWRlLmh0bWwjU3RlcDVfRGVwbG95X3dlYl9zZXJ2aWNlIj4nU3RlcCA0OiBEZXBsb3kgV2ViDQotU2VydmljZSc8L2E+IHN1YiBzZWN0aW9uIGluICc8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUuaHRtbCN3c19jb2RlZ2VuIj5Xcml0aW5nIGEgTmV3IFNlcnZpY2UgdXNpbmcNCi1Db2RlZ2VuZXJhdGlvbjwvYT4nLCBhbmQgY29weSB0aGUgImxvZ2dpbmcubWFyIiBmaWxlIHRvIHRoZQ0KLSJtb2R1bGVzIiBkaXJlY3RvcnkuPC9wPg0KLTxwPlRoZW4gcnVuICdhbnQgcnVuLmNsaWVudC5zZXJ2aWNld2l0aG1vZHVsZScgZnJvbQ0KLTxzdHJvbmc+YXhpczJob21lL3NhbXBsZXMvdXNlcmd1aWRlIGRpcmVjdG9yeTwvc3Ryb25nPjwvcD4NCi08cD5Ob3RlOiBUbyBzZWUgdGhlIGxvZ3MsIHRoZSB1c2VyIG5lZWRzIHRvIG1vZGlmeSB0aGUNCi0ibG9nNGoucHJvcGVydGllcyIgdG8gbG9nIElORk8uIFRoZSBwcm9wZXJ0eSBmaWxlIGlzIGxvY2F0ZWQgaW4NCi0iPHN0cm9uZz53ZWJhcHBzL2F4aXMyL1dFQi1JTkYvY2xhc3Nlczwvc3Ryb25nPiIgb2YgeW91ciBzZXJ2bGV0DQotY29udGFpbmVyLiBDaGFuZ2UgdGhlIGxpbmUgImxvZzRqLnJvb3RDYXRlZ29yeT0gRVJST1IsIExPR0ZJTEUiIHRvDQotImxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBFUlJPUiwgTE9HRklMRSIuPC9wPg0KLTxwPjxmb250IHNpemU9IjIiPjxiPk5vdGUgKG9uIHNhbXBsZXMpOjwvYj48L2ZvbnQ+IEFsbCB0aGUgc2FtcGxlcw0KLW1lbnRpb25lZCBpbiB0aGUgdXNlcidzIGd1aWRlIGFyZSBsb2NhdGVkIGF0IHRoZQ0KLTxiPiJzYW1wbGVzXHVzZXJndWlkZVxzcmMiPC9iPiBkaXJlY3Rvcnkgb2YgdGhlIGJpbmFyeQ0KLWRpc3RyaWJ1dGlvbi48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbXRvbS1ndWlkZS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvbXRvbS1ndWlkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGU5YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL210b20tZ3VpZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPHRpdGxlPkhhbmRsaW5nIEJpbmFyeSBkYXRhIHdpdGggQXhpczIgKE1UT00vU3dBKTwvdGl0bGU+Ci0gIDxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotICBtZWRpYT0iYWxsIi8+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPkhhbmRsaW5nIEJpbmFyeSBEYXRhIHdpdGggQXhpczIgKE1UT00vU3dBKTwvaDE+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIEF4aXMyIGZ1bmN0aW9uYWxpdHkgdG8gc2VuZC9yZWNlaXZlCi1iaW5hcnkgZGF0YSB3aXRoIFNPQVAuPC9wPgotCi08aDI+Q29udGVudDwvaDI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSIjMSI+SW50cm9kdWN0aW9uPC9hPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSIjMTEiPldoZXJlIERvZXMgTVRPTSBDb21lIEluPzwvYT48L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0gIDxsaT48YSBocmVmPSIjMiI+TVRPTSB3aXRoIEF4aXMyIDwvYT4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzIxIj5Qcm9ncmFtbWluZyBNb2RlbDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiMyMiI+RW5hYmxpbmcgTVRPTSBPcHRpbWl6YXRpb24gYXQgQ2xpZW50IFNpZGU8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjMjMiPkVuYWJsaW5nIE1UT00gT3B0aW1pemF0aW9uIGF0IFNlcnZlciBTaWRlPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzI0Ij5BY2Nlc3NpbmcgUmVjZWl2ZWQgQmluYXJ5IERhdGEgKFNhbXBsZSBDb2RlKSA8L2E+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iIzI0MSI+U2VydmljZTwvYT48L2xpPgotICAgICAgICAgIDxsaT48YSBocmVmPSIjMjQyIj5DbGllbnQ8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzI1Ij5NVE9NIERhdGFiaW5kaW5nPC9hPgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9IiMyNTEiPlVzaW5nIEFEQjwvYT48L2xpPgotICAgICAgICAgIDwhLS1saT48YSBocmVmPSIjMjUyIj5Vc2luZyBYTUxCZWFuczwvYT48L2xpLS0+Ci0gICAgICAgIDwvdWw+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci0gIDxsaT48YSBocmVmPSIjMyI+U09BUCB3aXRoIEF0dGFjaG1lbnRzIHdpdGggQXhpczI8L2E+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiMzMSI+U2VuZGluZyBTd0EgVHlwZSBBdHRhY2htZW50czwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiMzMiI+UmVjZWl2aW5nIFN3QSBUeXBlIEF0dGFjaG1lbnRzPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzMzIj5NVE9NIEJhY2t3YXJkIENvbXBhdGliaWxpdHkgd2l0aCBTd0E8L2E+PC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotICA8bGk+PGEgaHJlZj0iIzQiPkFkdmFuY2VkIFRvcGljcyA8L2E+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiM0MSI+RmlsZSBDYWNoaW5nIGZvciBBdHRhY2htZW50czwvYT48L2xpPgotICAgIDwvdWw+Ci0gIDwvbGk+Ci08L3VsPgotPGEgbmFtZT0iMSI+PC9hPgotCi08aDI+SW50cm9kdWN0aW9uPC9oMj4KLQotPHA+RGVzcGl0ZSB0aGUgZmxleGliaWxpdHksIGludGVyb3BlcmFiaWxpdHksIGFuZCBnbG9iYWwgYWNjZXB0YW5jZSBvZiBYTUwsCi10aGVyZSBhcmUgdGltZXMgd2hlbiBzZXJpYWxpemluZyBkYXRhIGludG8gWE1MIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIFdlYgotc2VydmljZXMgdXNlcnMgbWF5IHdhbnQgdG8gdHJhbnNtaXQgYmluYXJ5IGF0dGFjaG1lbnRzIG9mIHZhcmlvdXMgc29ydHMgbGlrZQotaW1hZ2VzLCBkcmF3aW5ncywgWE1MIGRvY3MsIGV0Yy4sIHRvZ2V0aGVyIHdpdGggYSBTT0FQIG1lc3NhZ2UuIFN1Y2ggZGF0YSBpcwotb2Z0ZW4gaW4gYSBwYXJ0aWN1bGFyIGJpbmFyeSBmb3JtYXQuPGJyLz4KLTwvcD4KLQotPHA+VHJhZGl0aW9uYWxseSwgdHdvIHRlY2huaXF1ZXMgaGF2ZSBiZWVuIHVzZWQgaW4gZGVhbGluZyB3aXRoIG9wYXF1ZSBkYXRhCi1pbiBYTUw7PC9wPgotPG9sPgotICA8bGk+PHN0cm9uZz4iQnkgdmFsdWUiPC9zdHJvbmc+PC9saT4KLQotICA8YmxvY2txdW90ZT4KLSAgICA8cD5TZW5kaW5nIGJpbmFyeSBkYXRhIGJ5IHZhbHVlIGlzIGFjaGlldmVkIGJ5IGVtYmVkZGluZyBvcGFxdWUgZGF0YSAob2YKLSAgICBjb3Vyc2UgYWZ0ZXIgc29tZSBmb3JtIG9mIGVuY29kaW5nKSBhcyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBjb250ZW50IG9mCi0gICAgdGhlIFhNTCBjb21wb25lbnQgb2YgZGF0YS4gVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgdGVjaG5pcXVlIGlzIHRoYXQKLSAgICBpdCBnaXZlcyBhcHBsaWNhdGlvbnMgdGhlIGFiaWxpdHkgdG8gcHJvY2VzcyBhbmQgZGVzY3JpYmUgZGF0YSwgYmFzZWQKLSAgICBvbmx5IG9uIHRoZSBYTUwgY29tcG9uZW50IG9mIHRoZSBkYXRhLjwvcD4KLQotICAgIDxwPlhNTCBzdXBwb3J0cyBvcGFxdWUgZGF0YSBhcyBjb250ZW50IHRocm91Z2ggdGhlIHVzZSBvZiBlaXRoZXIgYmFzZTY0Ci0gICAgb3IgaGV4YWRlY2ltYWwgdGV4dCBlbmNvZGluZy4gQm90aCB0ZWNobmlxdWVzIGJsb2F0IHRoZSBzaXplIG9mIHRoZSBkYXRhLgotICAgIEZvciBVVEYtOCB1bmRlcmx5aW5nIHRleHQgZW5jb2RpbmcsIGJhc2U2NCBlbmNvZGluZyBpbmNyZWFzZXMgdGhlIHNpemUgb2YKLSAgICB0aGUgYmluYXJ5IGRhdGEgYnkgYSBmYWN0b3Igb2YgMS4zM3ggb2YgdGhlIG9yaWdpbmFsIHNpemUsIHdoaWxlCi0gICAgaGV4YWRlY2ltYWwgZW5jb2RpbmcgZXhwYW5kcyBkYXRhIGJ5IGEgZmFjdG9yIG9mIDJ4LiBUaGUgYWJvdmUgZmFjdG9ycwotICAgIHdpbGwgYmUgZG91YmxlZCBpZiBVVEYtMTYgdGV4dCBlbmNvZGluZyBpcyB1c2VkLiBBbHNvIG9mIGNvbmNlcm4gaXMgdGhlCi0gICAgb3ZlcmhlYWQgaW4gcHJvY2Vzc2luZyBjb3N0cyAoYm90aCByZWFsIGFuZCBwZXJjZWl2ZWQpIGZvciB0aGVzZSBmb3JtYXRzLAotICAgIGVzcGVjaWFsbHkgd2hlbiBkZWNvZGluZyBiYWNrIGludG8gcmF3IGJpbmFyeS48L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPjxzdHJvbmc+IkJ5IHJlZmVyZW5jZSI8L3N0cm9uZz4KLQotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+U2VuZGluZyBiaW5hcnkgZGF0YSBieSByZWZlcmVuY2UgaXMgYWNoaWV2ZWQgYnkgYXR0YWNoaW5nIHB1cmUKLSAgICAgIGJpbmFyeSBkYXRhIGFzIGV4dGVybmFsIHVucGFyc2VkIGdlbmVyYWwgZW50aXRpZXMgb3V0c2lkZSB0aGUgWE1MCi0gICAgICBkb2N1bWVudCBhbmQgdGhlbiBlbWJlZGRpbmcgcmVmZXJlbmNlIFVSSXMgdG8gdGhvc2UgZW50aXRpZXMgYXMKLSAgICAgIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZSB2YWx1ZXMuIFRoaXMgcHJldmVudHMgdGhlIHVubmVjZXNzYXJ5IGJsb2F0aW5nIG9mCi0gICAgICBkYXRhIGFuZCB3YXN0aW5nIG9mIHByb2Nlc3NpbmcgcG93ZXIuIFRoZSBwcmltYXJ5IG9ic3RhY2xlIGZvciB1c2luZwotICAgICAgdGhlc2UgdW5wYXJzZWQgZW50aXRpZXMgaXMgdGhlaXIgaGVhdnkgcmVsaWFuY2Ugb24gRFREcywgd2hpY2ggaW1wZWRlcwotICAgICAgbW9kdWxhcml0eSBhcyB3ZWxsIGFzIHRoZSB1c2Ugb2YgWE1MIG5hbWVzcGFjZXMuPC9wPgotICAgICAgPHA+VGhlcmUgd2VyZSBzZXZlcmFsIHNwZWNpZmljYXRpb25zIGludHJvZHVjZWQgaW4gdGhlIFdlYiBzZXJ2aWNlcwotICAgICAgd29ybGQgdG8gZGVhbCB3aXRoIHRoaXMgYmluYXJ5IGF0dGFjaG1lbnQgcHJvYmxlbSB1c2luZyB0aGUgImJ5Ci0gICAgICByZWZlcmVuY2UiIHRlY2huaXF1ZS4gPGEKLSAgICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAtYXR0YWNobWVudHMiPlNPQVAgd2l0aCBBdHRhY2htZW50czwvYT4KLSAgICAgIGlzIG9uZSBzdWNoIGV4YW1wbGUuIFNpbmNlIFNPQVAgcHJvaGliaXRzIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb25zCi0gICAgICAoRFREKSBpbiBtZXNzYWdlcywgdGhpcyBsZWFkcyB0byB0aGUgcHJvYmxlbSBvZiBub3QgcmVwcmVzZW50aW5nIGRhdGEKLSAgICAgIGFzIHBhcnQgb2YgdGhlIG1lc3NhZ2UgaW5mb3NldCwgdGhlcmVmb3JlIGNyZWF0aW5nIHR3byBkYXRhIG1vZGVscy4KLSAgICAgIFRoaXMgc2NlbmFyaW8gaXMgbGlrZSBzZW5kaW5nIGF0dGFjaG1lbnRzIHdpdGggYW4gZS1tYWlsIG1lc3NhZ2UuIEV2ZW4KLSAgICAgIHRob3VnaCB0aG9zZSBhdHRhY2htZW50cyBhcmUgcmVsYXRlZCB0byB0aGUgbWVzc2FnZSBjb250ZW50IHRoZXkgYXJlCi0gICAgICBub3QgaW5zaWRlIHRoZSBtZXNzYWdlLiBUaGlzIGNhdXNlcyB0aGUgdGVjaG5vbG9naWVzIHRoYXQgcHJvY2VzcyBhbmQKLSAgICAgIGRlc2NyaWJlIHRoZSBkYXRhIGJhc2VkIG9uIHRoZSBYTUwgY29tcG9uZW50IG9mIHRoZSBkYXRhIHRvCi0gICAgICBtYWxmdW5jdGlvbi4gT25lIGV4YW1wbGUgaXMgV1MtU2VjdXJpdHkuPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLTwvb2w+Ci08YSBuYW1lPSIxMSI+PC9hPgotCi08aDM+V2hlcmUgRG9lcyBNVE9NIENvbWUgSW4/PC9oMz4KLQotPHA+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9QUi1zb2FwMTItbXRvbS0yMDA0MTExNi8iPk1UT00gKFNPQVAKLU1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc20pPC9hPiBpcyBhbm90aGVyIHNwZWNpZmljYXRpb24KLXRoYXQgZm9jdXNlcyBvbiBzb2x2aW5nIHRoZSAiQXR0YWNobWVudHMiIHByb2JsZW0uIE1UT00gdHJpZXMgdG8gbGV2ZXJhZ2UgdGhlCi1hZHZhbnRhZ2VzIG9mIHRoZSBhYm92ZSB0d28gdGVjaG5pcXVlcyBieSB0cnlpbmcgdG8gbWVyZ2UgdGhlIHR3byB0ZWNobmlxdWVzLgotTVRPTSBpcyBhY3R1YWxseSBhICJieSByZWZlcmVuY2UiIG1ldGhvZC4gVGhlIHdpcmUgZm9ybWF0IG9mIGEgTVRPTSBvcHRpbWl6ZWQKLW1lc3NhZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIFNPQVAgd2l0aCBBdHRhY2htZW50cyBtZXNzYWdlLCB3aGljaCBhbHNvIG1ha2VzIGl0Ci1iYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggU3dBIGVuZHBvaW50cy4gVGhlIG1vc3Qgbm90YWJsZSBmZWF0dXJlIG9mIE1UT00gaXMKLXRoZSB1c2Ugb2YgdGhlIFhPUDpJbmNsdWRlIGVsZW1lbnQsIHdoaWNoIGlzIGRlZmluZWQgaW4gdGhlIDxhCi1ocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1BSLXhvcDEwLTIwMDQxMTE2LyI+WE1MIEJpbmFyeSBPcHRpbWl6ZWQKLVBhY2thZ2luZyAoWE9QKTwvYT4gc3BlY2lmaWNhdGlvbiB0byByZWZlcmVuY2UgdGhlIGJpbmFyeSBhdHRhY2htZW50cwotKGV4dGVybmFsIHVucGFyc2VkIGdlbmVyYWwgZW50aXRpZXMpIG9mIHRoZSBtZXNzYWdlLiBXaXRoIHRoZSB1c2Ugb2YgdGhpcwotZXhjbHVzaXZlIGVsZW1lbnQsIHRoZSBhdHRhY2hlZCBiaW5hcnkgY29udGVudCBsb2dpY2FsbHkgYmVjb21lcyBpbmxpbmUgKGJ5Ci12YWx1ZSkgd2l0aCB0aGUgU09BUCBkb2N1bWVudCBldmVuIHRob3VnaCBpdCBpcyBhY3R1YWxseSBhdHRhY2hlZCBzZXBhcmF0ZWx5LgotVGhpcyBtZXJnZXMgdGhlIHR3byByZWFsbXMgYnkgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHdvcmsgb25seSB3aXRoIG9uZSBkYXRhCi1tb2RlbC4gVGhpcyBhbGxvd3MgdGhlIGFwcGxpY2F0aW9ucyB0byBwcm9jZXNzIGFuZCBkZXNjcmliZSBieSBvbmx5IGxvb2tpbmcKLWF0IHRoZSBYTUwgcGFydCwgbWFraW5nIHRoZSByZWxpYW5jZSBvbiBEVERzIG9ic29sZXRlLiBPbiBhIGxpZ2h0ZXIgbm90ZSwKLU1UT00gaGFzIHN0YW5kYXJkaXplZCB0aGUgcmVmZXJlbmNpbmcgbWVjaGFuaXNtIG9mIFN3QS4gVGhlIGZvbGxvd2luZyBpcyBhbgotZXh0cmFjdCBmcm9tIHRoZSA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9QUi14b3AxMC0yMDA0MTExNi8iPlhPUDwvYT4gc3BlY2lmaWNhdGlvbi48L3A+Ci0KLTxwPjxlbT5BdCB0aGUgY29uY2VwdHVhbCBsZXZlbCwgdGhpcyBiaW5hcnkgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBiZWluZwotYmFzZTY0LWVuY29kZWQgaW4gdGhlIFhNTCBEb2N1bWVudC4gQXMgdGhpcyBjb25jZXB0dWFsIGZvcm0gbWlnaHQgYmUgbmVlZGVkCi1kdXJpbmcgc29tZSBwcm9jZXNzaW5nIG9mIHRoZSBYTUwgZG9jdW1lbnQgKGUuZy4sIGZvciBzaWduaW5nIHRoZSBYTUwKLWRvY3VtZW50KSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGhhdmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gWE1MCi1JbmZvc2V0cyBhbmQgWE9QIFBhY2thZ2VzLiBUaGVyZWZvcmUsIHRoZSBjb25jZXB0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHN1Y2gKLWJpbmFyeSBkYXRhIGlzIGFzIGlmIGl0IHdlcmUgYmFzZTY0LWVuY29kZWQsIHVzaW5nIHRoZSBjYW5vbmljYWwgbGV4aWNhbCBmb3JtCi1vZiB0aGUgWE1MIFNjaGVtYSBiYXNlNjRCaW5hcnkgZGF0YXR5cGUgKHNlZSA8YSBocmVmPSIjWE1MU2NoZW1hUDIiPltYTUwKLVNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBTZWNvbmQgRWRpdGlvbl0gPC9hPiA8YQotaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNC9SRUMteG1sc2NoZW1hLTItMjAwNDEwMjgvI2Jhc2U2NEJpbmFyeSI+My4yLjE2Ci1iYXNlNjRCaW5hcnk8L2E+KS4gSW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uLCBYT1AgaXMgY2FwYWJsZSBvZiBvcHRpbWl6aW5nCi1vbmx5IGJhc2U2NC1lbmNvZGVkIEluZm9zZXQgZGF0YSB0aGF0IGlzIGluIHRoZSBjYW5vbmljYWwgbGV4aWNhbAotZm9ybS48L2VtPjwvcD4KLQotPHA+QXBhY2hlIEF4aXMyIHN1cHBvcnRzIDxzdHJvbmc+QmFzZTY0IGVuY29kaW5nPC9zdHJvbmc+LCA8c3Ryb25nPlNPQVAgd2l0aAotQXR0YWNobWVudHM8L3N0cm9uZz4gYW5kIDxzdHJvbmc+TVRPTSAoU09BUCBNZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24KLU1lY2hhbmlzbSkuPC9zdHJvbmc+PC9wPgotPGEgbmFtZT0iMiI+PC9hPgotCi08aDI+TVRPTSB3aXRoIEF4aXMyPC9oMj4KLTxhIG5hbWU9IjIxIj48L2E+Ci0KLTxoMz5Qcm9ncmFtbWluZyBNb2RlbDwvaDM+Ci0KLTxwPkFYSU9NIGlzIChhbmQgbWF5IGJlIHRoZSBmaXJzdCkgT2JqZWN0IE1vZGVsIHRoYXQgaGFzIHRoZSBhYmlsaXR5IHRvIGhvbGQKLWJpbmFyeSBkYXRhLiBJdCBoYXMgdGhpcyBhYmlsaXR5IGFzIE9NVGV4dCBjYW4gaG9sZCByYXcgYmluYXJ5IGNvbnRlbnQgaW4gdGhlCi1mb3JtIG9mIGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIuIE9NVGV4dCBoYXMgYmVlbiBjaG9zZW4gZm9yIHRoaXMgcHVycG9zZQotd2l0aCB0d28gcmVhc29ucy4gT25lIGlzIHRoYXQgWE9QIChNVE9NKSBpcyBjYXBhYmxlIG9mIG9wdGltaXppbmcgb25seQotYmFzZTY0LWVuY29kZWQgSW5mb3NldCBkYXRhIHRoYXQgaXMgaW4gdGhlIGNhbm9uaWNhbCBsZXhpY2FsIGZvcm0gb2YgWE1MCi1TY2hlbWEgYmFzZTY0QmluYXJ5IGRhdGF0eXBlLiBPdGhlciBvbmUgaXMgdG8gcHJlc2VydmUgdGhlIGluZm9zZXQgaW4gYm90aAotdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuIChUbyBzdG9yZSB0aGUgYmluYXJ5IGNvbnRlbnQgaW4gdGhlIHNhbWUga2luZCBvZgotb2JqZWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBvcHRpbWl6ZWQgb3Igbm90KS48L3A+Ci0KLTxwPk1UT00gYWxsb3dzIHRvIHNlbGVjdGl2ZWx5IGVuY29kZSBwb3J0aW9ucyBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggYWxsb3dzIHVzCi10byBzZW5kIGJhc2U2NGVuY29kZWQgZGF0YSBhcyB3ZWxsIGFzIGV4dGVybmFsbHkgYXR0YWNoZWQgcmF3IGJpbmFyeSBkYXRhCi1yZWZlcmVuY2VkIGJ5IHRoZSAiWE9QIiBlbGVtZW50IChvcHRpbWl6ZWQgY29udGVudCkgdG8gYmUgc2VudCBpbiBhIFNPQVAKLW1lc3NhZ2UuIFlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIGFuIE9NVGV4dCBub2RlIHRoYXQgY29udGFpbnMgcmF3IGJpbmFyeSBkYXRhCi1vciBiYXNlNjRlbmNvZGVkIGJpbmFyeSBkYXRhIGlzIHF1YWxpZmllZCB0byBiZSBvcHRpbWl6ZWQgYXQgdGhlIHRpbWUgb2YKLWNvbnN0cnVjdGlvbiBvZiB0aGF0IG5vZGUgb3IgbGF0ZXIuIEZvciBvcHRpbXVtIGVmZmljaWVuY3kgb2YgTVRPTSwgYSB1c2VyIGlzCi1hZHZpc2VkIHRvIHNlbmQgc21hbGxlciBiaW5hcnkgYXR0YWNobWVudHMgdXNpbmcgYmFzZTY0ZW5jb2RpbmcKLShub24tb3B0aW1pemVkKSBhbmQgbGFyZ2VyIGF0dGFjaG1lbnRzIGFzIG9wdGltaXplZCBjb250ZW50LjwvcD4KLQotPHA+PC9wPgotPHByZT4gICAgICAgIE9NRWxlbWVudCBpbWFnZUVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJpbWFnZSIsIG9tTnMpOwotCi0gICAgICAgIC8vIENyZWF0aW5nIHRoZSBEYXRhIEhhbmRsZXIgZm9yIHRoZSBmaWxlLiAgQW55IGltcGxlbWVudGF0aW9uIG9mCi0gICAgICAgIC8vIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBpbnRlcmZhY2UgY2FuIGZpdCBoZXJlLgotICAgICAgICBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIobmV3IEZpbGVEYXRhU291cmNlKCJTb21lRmlsZSIpKTsKLSAgICAgIAotICAgICAgICAvL2NyZWF0ZSBhbiBPTVRleHQgbm9kZSB3aXRoIHRoZSBhYm92ZSBEYXRhSGFuZGxlciBhbmQgc2V0IG9wdGltaXplZCB0byB0cnVlCi0gICAgICAgIE9NVGV4dCB0ZXh0RGF0YSA9IDxzdHJvbmc+ZmFjLmNyZWF0ZU9NVGV4dChkYXRhSGFuZGxlciwgdHJ1ZSk7PC9zdHJvbmc+Ci0KLSAgICAgICAgaW1hZ2VFbGVtZW50LmFkZENoaWxkKHRleHREYXRhKTsKLQotICAgICAgICAvL1VzZXIgY2FuIHNldCBvcHRpbWl6ZWQgdG8gZmFsc2UgYnkgdXNpbmcgdGhlIGZvbGxvd2luZwotICAgICAgICAvL3RleHREYXRhLmRvT3B0aW1pemUoZmFsc2UpOzwvcHJlPgotCi08cD5BbHNvLCBhIHVzZXIgY2FuIGNyZWF0ZSBhbiBvcHRpbWl6YWJsZSBiaW5hcnkgY29udGVudCBub2RlIHVzaW5nIGEgYmFzZTY0Ci1lbmNvZGVkIHN0cmluZywgd2hpY2ggY29udGFpbnMgZW5jb2RlZCBiaW5hcnkgY29udGVudCwgZ2l2ZW4gd2l0aCB0aGUgTUlNRQotdHlwZSBvZiB0aGUgYWN0dWFsIGJpbmFyeSByZXByZXNlbnRhdGlvbi48L3A+Ci0KLTxwPjwvcD4KLTxwcmU+ICAgICAgICBTdHJpbmcgYmFzZTY0U3RyaW5nID0gInNvbWVfYmFzZTY0X2VuY29kZWRfc3RyaW5nIjsKLSAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPTxzdHJvbmc+ZmFjLmNyZWF0ZU9NVGV4dChiYXNlNjRTdHJpbmcsImltYWdlL2pwZyIsdHJ1ZSk7PC9zdHJvbmc+PC9wcmU+Ci0KLTxwPkF4aXMyIHVzZXMgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciB0byBoYW5kbGUgdGhlIGJpbmFyeSBkYXRhLiBBbGwgdGhlCi1vcHRpbWl6ZWQgYmluYXJ5IGNvbnRlbnQgbm9kZXMgd2lsbCBiZSBzZXJpYWxpemVkIGFzIEJhc2U2NCBTdHJpbmdzIGlmICJNVE9NCi1pcyBub3QgZW5hYmxlZCIuIFlvdSBjYW4gYWxzbyBjcmVhdGUgYmluYXJ5IGNvbnRlbnQgbm9kZXMsIHdoaWNoIHdpbGwgbm90IGJlCi1vcHRpbWl6ZWQgYXQgYW55IGNhc2UuIFRoZXkgd2lsbCBiZSBzZXJpYWxpemVkIGFuZCBzZW50IGFzIEJhc2U2NCBTdHJpbmdzLjwvcD4KLQotPHA+PC9wPgotPHByZT4gICAgICAgIC8vY3JlYXRlIGFuIE9NVGV4dCBub2RlIHdpdGggdGhlIGFib3ZlIERhdGFIYW5kbGVyIGFuZCBzZXQgIm9wdGltaXplZCIgdG8gZmFsc2UKLSAgICAgICAgLy9UaGlzIGRhdGEgd2lsbCBiZSBzZW5kIGFzIEJhc2U2NCBlbmNvZGVkIHN0cmluZyByZWdhcmRsZXNzIG9mIE1UT00gaXMgZW5hYmxlZCBvciBub3QKLSAgICAgICAgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyKG5ldyBGaWxlRGF0YVNvdXJjZSgiU29tZUZpbGUiKSk7Ci0gICAgICAgIE9NVGV4dCB0ZXh0RGF0YSA9IGZhYy5jcmVhdGVPTVRleHQoZGF0YUhhbmRsZXIsIDxzdHJvbmc+ZmFsc2U8L3N0cm9uZz4pOyAKLSAgICAgICAgaW1hZ2UuYWRkQ2hpbGQodGV4dERhdGEpOzwvcHJlPgotPGEgbmFtZT0iMjIiPjwvYT4KLQotPGgzPkVuYWJsaW5nIE1UT00gT3B0aW1pemF0aW9uIG9uIHRoZSBDbGllbnQgU2lkZTwvaDM+Ci0KLTxwPkluIE9wdGlvbnMsIHNldCB0aGUgImVuYWJsZU1UT00iIHByb3BlcnR5IHRvIFRydWUgd2hlbiBzZW5kaW5nCi1tZXNzYWdlcy48L3A+Ci0KLTxwPjwvcD4KLTxwcmU+ICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCAoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICA8c3Ryb25nPm9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTs8L3N0cm9uZz4KLSAgICAgICAgc2VydmljZUNsaWVudCAuc2V0T3B0aW9ucyhvcHRpb25zKTs8L3ByZT4KLQotPHA+V2hlbiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBUcnVlLCBhbnkgU09BUCBlbnZlbG9wZSwgcmVnYXJkbGVzcyBvZgotd2hldGhlciBpdCBjb250YWlucyBvcHRpbWl6YWJsZSBjb250ZW50IG9yIG5vdCwgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGFuIE1UT00KLW9wdGltaXplZCBNSU1FIG1lc3NhZ2UuPC9wPgotCi08cD5BeGlzMiBzZXJpYWxpemVzIGFsbCBiaW5hcnkgY29udGVudCBub2RlcyBhcyBCYXNlNjQgZW5jb2RlZCBzdHJpbmdzCi1yZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgcXVhbGlmaWVkIHRvIGJlIG9wdGltaXplZCBvciBub3Q8L3A+Ci08dWw+Ci0gIDxsaT5pZiB0aGUgImVuYWJsZU1UT00iIHByb3BlcnR5IGlzIHNldCB0byBGYWxzZS48L2xpPgotICA8bGk+aWYgdGhlIGVudmVsb3BlIGNvbnRhaW5zIGFueSBlbGVtZW50IGluZm9ybWF0aW9uIGl0ZW1zIG9mIHRoZSBuYW1lCi0gICAgeG9wOkluY2x1ZGUgKHNlZSA8YSBocmVmPSIjWE9QIj5bWE1MLWJpbmFyeSBPcHRpbWl6ZWQgUGFja2FnaW5nXSA8L2E+PGEKLSAgICBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA1L1JFQy14b3AxMC0yMDA1MDEyNS8jeG9wX2luZm9zZXRzIj4zLiBYT1AKLSAgICBJbmZvc2V0cyBDb25zdHJ1Y3RzIDwvYT4pLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdXNlciBkb2VzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGhhdmUgdG8gc3BlY2lmeSBhbnl0aGluZyBpbiBvcmRlciBmb3IKLUF4aXMyIHRvIHJlY2VpdmUgTVRPTSBvcHRpbWlzZWQgbWVzc2FnZXMuIEF4aXMyIHdpbGwgYXV0b21hdGljYWxseSBpZGVudGlmeQotYW5kIGRlLXNlcmlhbGl6ZSBhY2NvcmRpbmdseSwgYXMgYW5kIHdoZW4gYW4gTVRPTSBtZXNzYWdlIGFycml2ZXMuPC9wPgotPGEgbmFtZT0iMjMiPjwvYT4KLQotPGgzPkVuYWJsaW5nIE1UT00gT3B0aW1pemF0aW9uIG9uIHRoZSBTZXJ2ZXIgU2lkZTwvaDM+Ci0KLTxwPlRoZSBBeGlzIDIgc2VydmVyIGF1dG9tYXRpY2FsbHkgaWRlbnRpZmllcyBpbmNvbWluZyBNVE9NIG9wdGltaXplZAotbWVzc2FnZXMgYmFzZWQgb24gdGhlIGNvbnRlbnQtdHlwZSBhbmQgZGUtc2VyaWFsaXplcyB0aGVtIGFjY29yZGluZ2x5LiBUaGUKLXVzZXIgY2FuIGVuYWJsZU1UT00gb24gdGhlIHNlcnZlciBzaWRlIGZvciBvdXRnb2luZyBtZXNzYWdlcyw8L3A+Ci0KLTxibG9ja3F1b3RlPgotICA8cD5UbyBlbmFibGVNVE9NIGdsb2JhbGx5IGZvciBhbGwgc2VydmljZXMsIHVzZXJzIGNhbiBzZXQgdGhlICJlbmFibGVNVE9NIgotICBwYXJhbWV0ZXIgdG8gVHJ1ZSBpbiB0aGUgQXhpczIueG1sLiBXaGVuIGl0IGlzIHNldCwgYWxsIG91dGdvaW5nIG1lc3NhZ2VzCi0gIHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgc2VudCBhcyBNVE9NIG9wdGltaXplZCBNSU1FIG1lc3NhZ2VzLiBJZiBpdCBpcyBub3QKLSAgc2V0LCBhbGwgdGhlIGJpbmFyeSBkYXRhIGluIHRoZSBiaW5hcnkgY29udGVudCBub2RlcyB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMKLSAgQmFzZTY0IGVuY29kZWQgc3RyaW5ncy4gVGhpcyBjb25maWd1cmF0aW9uIGNhbiBiZSBvdmVycmlkZW4gaW4gc2VydmljZXMueG1sCi0gIG9uIHRoZSBiYXNpcyBvZiBwZXIgc2VydmljZSBhbmQgcGVyIG9wZXJhdGlvbi48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08cHJlPiZsdDtwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSImZ3Q7dHJ1ZSZsdDsvcGFyYW1ldGVyJmd0OzwvcHJlPgotCi08cD5Zb3UgbXVzdCByZXN0YXJ0IHRoZSBzZXJ2ZXIgYWZ0ZXIgc2V0dGluZyB0aGlzIHBhcmFtZXRlci48L3A+Ci08YSBuYW1lPSIyNCI+PC9hPgotCi08aDM+QWNjZXNzaW5nIFJlY2VpdmVkIEJpbmFyeSBEYXRhIChTYW1wbGUgQ29kZSk8L2gzPgotPGEgbmFtZT0iMjQxIj48L2E+Ci08dWw+Ci0gIDxsaT48c3Ryb25nPlNlcnZpY2U8L3N0cm9uZz48L2xpPgotPC91bD4KLQotPHA+PC9wPgotPHByZT5wdWJsaWMgY2xhc3MgTVRPTVNlcnZpY2UgewotICAgIHB1YmxpYyB2b2lkIHVwbG9hZEZpbGVVc2luZ01UT00oT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgPHN0cm9uZz5PTVRleHQgYmluYXJ5Tm9kZSA9IChPTVRleHQpIChlbGVtZW50LmdldEZpcnN0RWxlbWVudCgpKS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICBEYXRhSGFuZGxlciBhY3R1YWxESDsKLSAgICAgICBhY3R1YWxESCA9IChEYXRhSGFuZGxlcikgYmluYXJ5Tm9kZS5nZXREYXRhSGFuZGxlcigpOzwvc3Ryb25nPgotICAgICAgICAgICAgCi0gICAgICAgLi4uIDxlbT5EbyB3aGF0ZXZlciB5b3UgbmVlZCB3aXRoIHRoZSBEYXRhSGFuZGxlcjwvZW0+IC4uLgotICAgIH0KLSAgfTwvcHJlPgotPGEgbmFtZT0iMjQyIj48L2E+Ci08dWw+Ci0gIDxsaT48c3Ryb25nPkNsaWVudDwvc3Ryb25nPjwvbGk+Ci08L3VsPgotCi08cD48L3A+Ci08cHJlPiAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOyAgICAgICAgCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsgCi0gICAgICAgIC8vIGVuYWJsaW5nIE1UT00KLSAgICAgICAgPHN0cm9uZz5vcHRpb25zLnNldChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOzwvc3Ryb25nPgotICAgICAgICAuLi4uLi4uLi4uLi4KLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotICAgICAgICBPTUVsZW1lbnQgZWxlID0gcmVzdWx0LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBPTVRleHQgYmluYXJ5Tm9kZSA9IChPTVRleHQpIGVsZS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJldHJpZXZpbmcgdGhlIERhdGFIYW5kbGVyICZhbXA7IHRoZW4gZG8gd2hhdGV2ZXIgdGhlIHByb2Nlc3NpbmcgdG8gdGhlIGRhdGEKLSAgICAgICAgRGF0YUhhbmRsZXIgYWN0dWFsREg7Ci0gICAgICAgIGFjdHVhbERIID0gYmluYXJ5Tm9kZS5nZXREYXRhSGFuZGxlcigpOwotICAgICAgICAuLi4uLi4uLi4uLi4uPC9wcmU+Ci08YSBuYW1lPSIyNSI+PC9hPgotCi08aDM+TVRPTSBEYXRhYmluZGluZzwvaDM+Ci0KLTxwPllvdSBjYW4gZGVmaW5lIGEgYmluYXJ5IGVsZW1lbnQgaW4gdGhlIHNjaGVtYSB1c2luZyB0aGUgc2NoZW1hCi10eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5Ii4gSGF2aW5nIGFuIGVsZW1lbnQgd2l0aCB0aGUgdHlwZSAieHNkOmJhc2U2NEJpbmFyeSIKLWlzIGVub3VnaCBmb3IgdGhlIEF4aXMyIGNvZGUgZ2VuZXJhdG9ycyB0byBpZGVudGlmeSBwb3NzaWJsZSBNVE9NCi1hdHRhY2htZW50cywgYW5kIHRvIGdlbmVyYXRlIGNvZGUgYWNjb3JkaW5nbHkuPC9wPgotCi08cD5Hb2luZyBhIGxpdHRsZSBmdXJ0aGVyLCB5b3UgY2FuIHVzZSB0aGUgeG1pbWUgc2NoZW1hCi0oaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lKSB0byBkZXNjcmliZSB0aGUgYmluYXJ5IGNvbnRlbnQgbW9yZQotcHJlY2lzZWx5LiBXaXRoIHRoZSB4bWltZSBzY2hlbWEsIHlvdSBjYW4gaW5kaWNhdGUgdGhlIHR5cGUgb2YgY29udGVudCBpbiB0aGUKLWVsZW1lbnQgYXQgcnVudGltZSB1c2luZyBhbiBNVE9NIGF0dHJpYnV0ZSBleHRlbnNpb24geG1pbWU6Y29udGVudFR5cGUuCi1GdXJ0aGVybW9yZSwgeW91IGNhbiBpZGVudGlmeSB3aGF0IHR5cGUgb2YgZGF0YSBtaWdodCBiZSBleHBlY3RlZCBpbiB0aGUKLWVsZW1lbnQgdXNpbmcgdGhlIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGUuIFB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyLCBvdXIKLWV4YW1wbGUgZWxlbWVudCBiZWNvbWVzOjwvcD4KLTxzb3VyY2U+PHByZT4gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJNeUJpbmFyeURhdGEiIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSdpbWFnZS9qcGVnJyAmZ3Q7Ci0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsKLSAgICAgICAgICAmbHQ7c2ltcGxlQ29udGVudCZndDsKLSAgICAgICAgICAgICZsdDtleHRlbnNpb24gYmFzZT0iYmFzZTY0QmluYXJ5IiAmZ3Q7Ci0KLSAgICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZSByZWY9InhtaW1lOmNvbnRlbnRUeXBlIiB1c2U9InJlcXVpcmVkIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2V4dGVuc2lvbiZndDsKLSAgICAgICAgICAmbHQ7L3NpbXBsZUNvbnRlbnQmZ3Q7Ci0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPllvdSBjYW4gYWxzbyB1c2UgdGhlIHhtaW1lOmJhc2U2NEJpbmFyeSB0eXBlIHRvIGV4cHJlc3MgdGhlIGFib3ZlCi1tZW50aW9uZWQgZGF0YSBtdWNoIGNsZWFybHkuPC9wPgotPHNvdXJjZT48cHJlPiAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik15QmluYXJ5RGF0YSIgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9J2ltYWdlL2pwZWcnIHR5cGU9InhtaW1lOmJhc2U2NEJpbmFyeSIvJmd0OzwvcHJlPgotPC9zb3VyY2U+PGEgbmFtZT0iMjUxIj48L2E+Ci0KLTxoMz5NVE9NIERhdGFiaW5kaW5nIFVzaW5nIEFEQjwvaDM+Ci0KLTxwPkxldCdzIGRlZmluZSBhIGZ1bGwsIHZhbGlkYXRlZCBkb2MvbGl0IHN0eWxlIFdTREwgdGhhdCB1c2VzIHRoZSB4bWltZQotc2NoZW1hLCBoYXMgYSBzZXJ2aWNlIHRoYXQgcmVjZWl2ZXMgYSBmaWxlLCBhbmQgc2F2ZXMgaXQgaW4gdGhlIHNlcnZlciB1c2luZwotdGhlIGdpdmVuIHBhdGguPC9wPgotPHNvdXJjZT48cHJlPiZsdDt3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbXRvbXNhbXBsZS8iCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotICAgICAgICB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotICAgICAgICB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tdG9tc2FtcGxlLyImZ3Q7Ci0KLSAgICAgICAgJmx0O3dzZGw6dHlwZXMmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3hzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL210b21zYW1wbGUvIiZndDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3hzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnRUeXBlIiZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3hzZDpzZXF1ZW5jZSZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWxlTmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3hzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmluYXJ5RGF0YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhtaW1lOmJhc2U2NEJpbmFyeSIgLyZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50UmVxdWVzdCIgdHlwZT0idG5zOkF0dGFjaG1lbnRUeXBlIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRSZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L3hzZDpzY2hlbWEmZ3Q7Ci0gICAgICAgICZsdDsvd3NkbDp0eXBlcyZndDsKLSAgICAgICAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJBdHRhY2htZW50UmVxdWVzdCImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3dzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0idG5zOkF0dGFjaG1lbnRSZXF1ZXN0IiAvJmd0OwotICAgICAgICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsKLSAgICAgICAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJBdHRhY2htZW50UmVzcG9uc2UiJmd0OwotICAgICAgICAgICAgICAgICZsdDt3c2RsOnBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9InRuczpBdHRhY2htZW50UmVzcG9uc2UiIC8mZ3Q7Ci0gICAgICAgICZsdDsvd3NkbDptZXNzYWdlJmd0OwotICAgICAgICAmbHQ7d3NkbDpwb3J0VHlwZSBuYW1lPSJNVE9NU2VydmljZVBvcnRUeXBlIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iYXR0YWNobWVudCImZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6QXR0YWNobWVudFJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJhdHRhY2htZW50IiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3dzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpBdHRhY2htZW50UmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL01UT01TZXJ2aWNlUG9ydFR5cGUvQXR0YWNobWVudFJlc3BvbnNlIiAvJmd0OwotICAgICAgICAgICAgICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7Ci0gICAgICAgICZsdDsvd3NkbDpwb3J0VHlwZSZndDsKLSAgICAgICAgJmx0O3dzZGw6YmluZGluZyBuYW1lPSJNVE9NU2VydmljZVNPQVAxMUJpbmRpbmciCi0gICAgICAgICAgICAgICAgdHlwZT0idG5zOk1UT01TZXJ2aWNlUG9ydFR5cGUiJmd0OwotICAgICAgICAgICAgICAgICZsdDtzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iZG9jdW1lbnQiIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9ImF0dGFjaG1lbnQiJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3NvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImF0dGFjaG1lbnQiIHN0eWxlPSJkb2N1bWVudCIgLyZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDt3c2RsOmlucHV0Jmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLyZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvd3NkbDppbnB1dCZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDt3c2RsOm91dHB1dCZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3NvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0OwotICAgICAgICAgICAgICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7Ci0gICAgICAgICZsdDsvd3NkbDpiaW5kaW5nJmd0OwotICAgICAgICAmbHQ7d3NkbDpiaW5kaW5nIG5hbWU9Ik1UT01TZXJ2aWNlU09BUDEyQmluZGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ0bnM6TVRPTVNlcnZpY2VQb3J0VHlwZSImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3NvYXAxMjpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIgotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImRvY3VtZW50IiAvJmd0OwotICAgICAgICAgICAgICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJhdHRhY2htZW50IiZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImF0dGFjaG1lbnQiIHN0eWxlPSJkb2N1bWVudCIgLyZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDt3c2RsOmlucHV0Jmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3dzZGw6b3V0cHV0Jmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy93c2RsOm91dHB1dCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0OwotICAgICAgICAmbHQ7L3dzZGw6YmluZGluZyZndDsKLSAgICAgICAgJmx0O3dzZGw6c2VydmljZSBuYW1lPSJNVE9NU2FtcGxlIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7d3NkbDpwb3J0IG5hbWU9Ik1UT01TYW1wbGVTT0FQMTFwb3J0X2h0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nPSJ0bnM6TVRPTVNlcnZpY2VTT0FQMTFCaW5kaW5nIiZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NVE9NU2FtcGxlIiAvJmd0OwotICAgICAgICAgICAgICAgICZsdDsvd3NkbDpwb3J0Jmd0OwotICAgICAgICAgICAgICAgICZsdDt3c2RsOnBvcnQgbmFtZT0iTVRPTVNhbXBsZVNPQVAxMnBvcnRfaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmc9InRuczpNVE9NU2VydmljZVNPQVAxMkJpbmRpbmciJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3NvYXAxMjphZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvTVRPTVNhbXBsZSIgLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L3dzZGw6cG9ydCZndDsKLSAgICAgICAgJmx0Oy93c2RsOnNlcnZpY2UmZ3Q7Ci0mbHQ7L3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSBpbXBvcnRhbnQgcG9pbnQgaGVyZSBpcyB3ZSBpbXBvcnQgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lCi1hbmQgZGVmaW5lIHRoZSBlbGVtZW50ICdiaW5hcnlEYXRhJyB0aGF0IHV0aWxpemVzIE1UT00uPC9wPgotCi08cD5UaGUgbmV4dCBzdGVwIGlzIHVzaW5nIHRoZSBBeGlzMiB0b29sICdXU0RMMkphdmEnIHRvIGdlbmVyYXRlIEphdmEgc291cmNlCi1maWxlcyBmcm9tIHRoaXMgV1NETC4gU2VlIHRoZSAnQ29kZSBHZW5lcmF0b3IgVG9vbCcgZ3VpZGUgZm9yIG1vcmUKLWluZm9ybWF0aW9uLiBIZXJlLCB3ZSBkZWZpbmUgYW4gQW50IHRhc2sgdGhhdCBjaG9vc2VzIEFEQiAoQXhpczIgRGF0YQotQmluZGluZykgYXMgdGhlIGRhdGFiaW5kaW5nIGltcGxlbWVudGF0aW9uLiBUaGUgbmFtZSB3ZSBsaXN0IGZvciB0aGUgV1NETAotYWJvdmUgaXMgTVRPTVNhbXBsZS53c2RsLCBhbmQgd2UgZGVmaW5lIG91ciBwYWNrYWdlIG5hbWUgZm9yIG91ciBnZW5lcmF0ZWQKLXNvdXJjZSBmaWxlcyB0byAnc2FtcGxlLm10b20uc2VydmljZScgLiBPdXIgQW50IHRhc2sgZm9yIHRoaXMgZXhhbXBsZSBpczo8L3A+Ci08c291cmNlPjxwcmU+ICAgICAgICAKLSZsdDt0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSImZ3Q7Ci0gICAgICAgICAgICAgICAgICZsdDtqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSImZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSItdXJpIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iJHtiYXNlZGlyfS9yZXNvdXJjZXMvTVRPTVNhbXBsZS53c2RsIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLXNzIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLXNkIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSItZyIvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLXAiIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSJzYW1wbGUubXRvbS5zZXJ2aWNlIiAvJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLW8iIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7YXJnIHZhbHVlPSIke3NlcnZpY2UuZGlyfSIgLyZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9ImNsYXNzLnBhdGgiIC8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0Oy9qYXZhJmd0OwotICAgICAgICAgICZsdDsvdGFyZ2V0Jmd0OzwvcHJlPgotPC9zb3VyY2U+Ci08cD5Ob3cgd2UgYXJlIHJlYWR5IHRvIGNvZGUuIExldCdzIGVkaXQKLW91dHB1dC9zcmMvc2FtcGxlL210b20vc2VydmljZS9NVE9NU2FtcGxlU2tlbGV0b24uamF2YSBhbmQgZmlsbCBpbiB0aGUKLWJ1c2luZXNzIGxvZ2ljLiBIZXJlIGlzIGFuIGV4YW1wbGU6PC9wPgotPHNvdXJjZT48cHJlPiAgICAgICAgcHVibGljIG9yZy5hcGFjaGUud3MuYXhpczIubXRvbXNhbXBsZS5BdHRhY2htZW50UmVzcG9uc2UgYXR0YWNobWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3MuYXhpczIubXRvbXNhbXBsZS5BdHRhY2htZW50UmVxdWVzdCBwYXJhbTApIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlIGF0dGFjaG1lbnRSZXF1ZXN0ID0gcGFyYW0wLmdldEF0dGFjaG1lbnRSZXF1ZXN0KCk7Ci0gICAgICAgICAgICAgICAgQmFzZTY0QmluYXJ5IGJpbmFyeURhdGEgPSBhdHRhY2htZW50UmVxdWVzdC5nZXRCaW5hcnlEYXRhKCk7Ci0gICAgICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBiaW5hcnlEYXRhLmdldEJhc2U2NEJpbmFyeSgpOwotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50UmVxdWVzdC5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICBkYXRhSGFuZGxlci53cml0ZVRvKGZpbGVPdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIGZpbGVPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICBmaWxlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQXR0YWNobWVudFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IEF0dGFjaG1lbnRSZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEF0dGFjaG1lbnRSZXNwb25zZSgiRmlsZSBzYXZlZCBzdWNjZXNmdWxseS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH08L3ByZT4KLTwvc291cmNlPgotPHA+VGhlIGNvZGUgYWJvdmUgcmVjZWl2ZXMgYSBmaWxlIGFuZCB3cml0ZXMgaXQgdG8gdGhlIGRpc2sgdXNpbmcgdGhlIGdpdmVuCi1maWxlIG5hbWUuIEl0IHJldHVybnMgYSBtZXNzYWdlIG9uY2UgaXQgaXMgc3VjY2Vzc2Z1bC4gTm93IGxldCdzIGRlZmluZSB0aGUKLWNsaWVudDo8L3A+Ci08c291cmNlPjxwcmU+ICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJGaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGRlc3RpbmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgTVRPTVNhbXBsZVN0dWIgc2VydmljZVN0dWIgPSBuZXcgTVRPTVNhbXBsZVN0dWIoKTsKLQotICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBNVE9NIGluIHRoZSBjbGllbnQgc2lkZQotICAgICAgICAgICAgICAgIHNlcnZpY2VTdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICAgICAgICAgIC8vSW5jcmVhc2UgdGhlIHRpbWUgb3V0IHdoZW4gc2VuZGluZyBsYXJnZSBhdHRhY2htZW50cwotICAgICAgICAgICAgICAgIHNlcnZpY2VTdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFRpbWVPdXRJbk1pbGxpU2Vjb25kcygxMDAwMCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBQb3B1bGF0aW5nIHRoZSBjb2RlIGdlbmVyYXRlZCBiZWFucwotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRSZXF1ZXN0IGF0dGFjaG1lbnRSZXF1ZXN0ID0gbmV3IEF0dGFjaG1lbnRSZXF1ZXN0KCk7Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFR5cGUgPSBuZXcgQXR0YWNobWVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBCYXNlNjRCaW5hcnkgYmFzZTY0QmluYXJ5ID0gbmV3IEJhc2U2NEJpbmFyeSgpOwotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRpbmcgYSBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlIGZyb20gdGhlIGlucHV0IGZpbGUuCi0gICAgICAgICAgICAgICAgRmlsZURhdGFTb3VyY2UgZmlsZURhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBkYXRhSGFuZGxlciB1c2luZyB0aGUgZmlsZURhdGFTb3VyY2UuIEFueSBpbXBsZW1lbnRhdGlvbiBvZgotICAgICAgICAgICAgICAgIC8vIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBpbnRlcmZhY2UgY2FuIGZpdCBoZXJlLgotICAgICAgICAgICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLSAgICAgICAgICAgICAgICBiYXNlNjRCaW5hcnkuc2V0QmFzZTY0QmluYXJ5KGRhdGFIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBiYXNlNjRCaW5hcnkuc2V0Q29udGVudFR5cGUoZGF0YUhhbmRsZXIuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudFR5cGUuc2V0QmluYXJ5RGF0YShiYXNlNjRCaW5hcnkpOwotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRUeXBlLnNldEZpbGVOYW1lKGRlc3RpbmF0aW9uKTsKLSAgICAgICAgICAgICAgICBhdHRhY2htZW50UmVxdWVzdC5zZXRBdHRhY2htZW50UmVxdWVzdChhdHRhY2htZW50VHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBBdHRhY2htZW50UmVzcG9uc2UgcmVzcG9uc2UgPSBzZXJ2aWNlU3R1Yi5hdHRhY2htZW50KGF0dGFjaG1lbnRSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0QXR0YWNobWVudFJlc3BvbnNlKCkpOwotICAgICAgICB9PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSBsYXN0IHN0ZXAgaXMgdG8gY3JlYXRlIGFuIEFBUiB3aXRoIG91ciBTa2VsZXRvbiBhbmQgdGhlIHNlcnZpY2VzLnhtbAotYW5kIHRoZW4gZGVwbG95IHRoZSBzZXJ2aWNlLiBZb3UgY2FuIGZpbmQgdGhlIGNvbXBsZXRlZCBzYW1wbGUgaW4gdGhlIEF4aXMyCi1zdGFuZGFyZCBiaW5hcnkgZGlzdHJpYnV0aW9uIHVuZGVyIHRoZSBzYW1wbGVzL210b20gZGlyZWN0b3J5PC9wPgotPGEgbmFtZT0iMjUyIj48L2E+IDxhIG5hbWU9IjMiPjwvYT4KLQotPGgyPlNPQVAgd2l0aCBBdHRhY2htZW50cyAoU3dBKSB3aXRoIEF4aXMyPC9oMj4KLTxhIG5hbWU9IjMxIj48L2E+Ci0KLTxoMz5SZWNlaXZpbmcgU3dBIFR5cGUgQXR0YWNobWVudHM8L2gzPgotCi08cD5BeGlzMiBhdXRvbWF0aWNhbGx5IGlkZW50aWZpZXMgU3dBIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuCi1BeGlzMiBzdG9yZXMgdGhlIHJlZmVyZW5jZXMgb24gdGhlIHJlY2VpdmVkIGF0dGFjaG1lbnQgcGFydHMgKE1JTUUgcGFydHMpIGluCi10aGUgTWVzc2FnZSBDb250ZXh0LiBBeGlzMiBwcmVzZXJ2ZXMgdGhlIG9yZGVyIG9mIHRoZSByZWNlaXZlZCBhdHRhY2htZW50cwotd2hlbiBzdG9yaW5nIHRoZW0gaW4gdGhlIE1lc3NhZ2VDb250ZXh0LiBVc2VycyBjYW4gYWNjZXNzIGJpbmFyeSBhdHRhY2htZW50cwotdXNpbmcgdGhlIGF0dGFjaGVtZW50IEFQSSBnaXZlbiBpbiB0aGUgTWVzc2FnZSBDb250ZXh0IHVzaW5nIHRoZSBjb250ZW50LWlkCi1vZiB0aGUgbWltZSBwYXJ0IGFzIHRoZSBrZXkuIENhcmUgbmVlZHMgYmUgdGFrZW4gdG8gcmlwIG9mZiB0aGUgImNpZCIgcHJlZml4Ci13aGVuIGNvbnRlbnQtaWQgaXMgdGFrZW4gZnJvbSB0aGUgIkhyZWYiIGF0dHJpYnV0ZXMuIFVzZXJzIGNhbiBhY2Nlc3MgdGhlCi1tZXNzYWdlIGNvbnRleHQgZnJvbSB3aGl0aGluIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB1c2luZyB0aGUKLSJzZXRPcGVyYXRpb25Db250ZXh0KCkiIG1ldGhvZCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuPC9wPgotCi08cD5Ob3RlOiBBeGlzMiBzdXBwb3J0cyBjb250ZW50LWlkIGJhc2VkIHJlZmVyZW5jaW5nIG9ubHkuIEF4aXMyIGRvZXMgbm90Ci1zdXBwb3J0IENvbnRlbnQgTG9jYXRpb24gYmFzZWQgcmVmZXJlbmNpbmcgb2YgTUlNRSBwYXJ0cy48L3A+Ci08dWw+Ci0gIDxsaT48c3Ryb25nPlNhbXBsZSBzZXJ2aWNlIHdoaWNoIGFjY2Vzc2VzIGEgcmVjZWl2ZWQgU3dBIHR5cGUKLSAgICBhdHRhY2htZW50PC9zdHJvbmc+PC9saT4KLTwvdWw+Ci08c291cmNlPjxwcmU+cHVibGljIGNsYXNzIFN3QSB7Ci0gICAgcHVibGljIFN3QSgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdXBsb2FkQXR0YWNobWVudChPTUVsZW1lbnQgb21FbGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSAoT01FbGVtZW50KSBvbUVsZS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0ciA9IGNoaWxkLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoImhyZWYiKSk7Ci0gICAgICAgIAotICAgICAgICAvL0NvbnRlbnQgSUQgcHJvY2Vzc2luZwotICAgICAgICBTdHJpbmcgY29udGVudElEID0gYXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICBjb250ZW50SUQgPSBjb250ZW50SUQudHJpbSgpOwotICAgICAgICBpZiAoY29udGVudElELnN1YnN0cmluZygwLCAzKS5lcXVhbHNJZ25vcmVDYXNlKCJjaWQiKSkgewotICAgICAgICAgICAgY29udGVudElEID0gY29udGVudElELnN1YnN0cmluZyg0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnQgPSBtc2dDdHguZ2V0QXR0YWNobWVudE1hcCgpOwotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoY29udGVudElEKTsKLSAgICAgICAgLi4uLi4uLi4uLi4KLSAgICB9Ci19PC9wcmU+Ci08L3NvdXJjZT48YSBuYW1lPSIzMiI+PC9hPgotCi08aDM+U2VuZGluZyBTd0EgVHlwZSBBdHRhY2htZW50czwvaDM+Ci0KLTxwPlRoZSB1c2VyIG5lZWRzIHRvIHNldCB0aGUgImVuYWJsZVN3QSIgcHJvcGVydHkgdG8gVHJ1ZSBpbiBvcmRlciB0byBiZSBhYmxlCi10byBzZW5kIFN3QSBtZXNzYWdlcy4gVGhlIEF4aXMyIHVzZXIgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZXhwZWN0ZWQgdG8KLWVuYWJsZSBNVE9NIGFuZCBTd0EgdG9nZXRoZXIuIEluIHN1Y2ggYSBzaXR1YXRpb24sIE1UT00gd2lsbCBnZXQgcHJpb3JpdHkKLW92ZXIgU3dBLjwvcD4KLQotPHA+VGhpcyBjYW4gYmUgc2V0IHVzaW5nIHRoZSBheGlzMi54bWwgYXMgZm9sbG93cy48L3A+Ci08c291cmNlPjxwcmU+ICAKLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiJmd0O3RydWUmbHQ7L3BhcmFtZXRlciZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+ImVuYWJsZVN3QSIgY2FuIGFsc28gYmUgc2V0IHVzaW5nIHRoZSBjbGllbnQgc2lkZSBPcHRpb25zIGFzIGZvbGxvd3M8L3A+Ci08c291cmNlPjxwcmU+ICAKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfU3dBLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlVzZXJzIGFyZSBleHBlY3RlZCB0byB1c2UgdGhlIGF0dGFjaG1lbnQgQVBJIHByb3ZpZGVkIGluIHRoZQotTWVzc2FnZUNvbnRleHQgdG8gc3BlY2lmeSB0aGUgYmluYXJ5IGF0dGFjaG1lbnRzIG5lZWRlZCB0byBiZSBhdHRhY2hlZCB0byB0aGUKLW91dGdvaW5nIG1lc3NhZ2UgYXMgU3dBIHR5cGUgYXR0YWNobWVudHMuIENsaWVudCBzaWRlIFN3QSBjYXBhYmlsaXR5IGNhbiBiZQotdXNlZCBvbmx5IHdpdGggdGhlIE9wZXJhdGlvbkNsaWVudCBhcGksIHNpbmNlIHRoZSB1c2VyIG5lZWRzIHRoZSBhYmlsaXR5IHRvCi1hY2Nlc3MgdGhlIE1lc3NhZ2VDb250ZXh0LjwvcD4KLTx1bD4KLSAgPGxpPjxzdHJvbmc+U2FtcGxlIGNsaWVudCB3aGljaCBzZW5kcyBhIG1lc3NhZ2Ugd2l0aCBTd0EgdHlwZQotICAgIGF0dGFjaG1lbnRzPC9zdHJvbmc+PC9saT4KLTwvdWw+Ci08c291cmNlPjxwcmU+ICAgcHVibGljIHZvaWQgdXBsb2FkRmlsZVVzaW5nU3dBKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9TV0EsIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQobnVsbCxudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBtZXBDbGllbnQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsgICAKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUoY3JlYXRlRW52ZWxvcGUoKSk7Ci0gICAgICAgIEZpbGVEYXRhU291cmNlIGZpbGVEYXRhU291cmNlID0gbmV3IEZpbGVEYXRhU291cmNlKCJ0ZXN0LXJlc291cmNlcy9tdG9tL3Rlc3QuanBnIik7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLSAgICAgICAgbWMuYWRkQXR0YWNobWVudCgiRmlyc3RBdHRhY2htZW50IixkYXRhSGFuZGxlcik7Ci0gICAgICAgCi0gICAgICAgIG1lcENsaWVudC5hZGRNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIG1lcENsaWVudC5leGVjdXRlKHRydWUpOwotICAgIH08L3ByZT4KLTwvc291cmNlPjxhIG5hbWU9IjMzIj48L2E+Ci0KLTxoMz5NVE9NIEJhY2t3YXJkIENvbXBhdGliaWxpdHkgd2l0aCBTd0E8L2gzPgotCi08cD5NVE9NIHNwZWNpZmljYXRpb24gaXMgZGVzaWduZWQgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIHRoZSBTT0FQCi13aXRoIEF0dGFjaG1lbnRzIHNwZWNpZmljYXRpb24uIEV2ZW4gdGhvdWdoIHRoZSByZXByZXNlbnRhdGlvbiBpcyBkaWZmZXJlbnQsCi1ib3RoIHRlY2hub2xvZ2llcyBoYXZlIHRoZSBzYW1lIHdpcmUgZm9ybWF0LiBXZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IGFueQotU09BUCB3aXRoIEF0dGFjaG1lbnRzIGVuZHBvaW50IGNhbiBhY2NlcHQgTVRPTSBvcHRpbWl6ZWQgbWVzc2FnZXMgYW5kIHRyZWF0Ci10aGVtIGFzIFNPQVAgd2l0aCBBdHRhY2htZW50IG1lc3NhZ2VzIC0gYW55IE1UT00gb3B0aW1pemVkIG1lc3NhZ2UgaXMgYSB2YWxpZAotU3dBIG1lc3NhZ2UuPC9wPgotCi08cD5Ob3RlIDogQWJvdmUgYmFja3dvcmQgY29tcGF0aWJpbGl0eSB3YXMgc3VjY2VzZnVsbHkgdGVzdGVkIGFnYWluc3QgQXhpcwotMS54PC9wPgotPHVsPgotICA8bGk+PHN0cm9uZz5BIHNhbXBsZSBTd0EgbWVzc2FnZSBmcm9tIEF4aXMgMS54PC9zdHJvbmc+PC9saT4KLTwvdWw+Ci08c291cmNlPjxwcmU+Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgdHlwZT0idGV4dC94bWwiOyAKLSAgICAgICAgICBzdGFydD0iJmx0OzlENjQ1QzhFQkI4MzdDRTU0QUJEMDI3QTM2NTk1MzVEJmd0OyI7Ci0gICAgICAgICAgICAgICAgYm91bmRhcnk9Ii0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgiCi0KLS0tLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOAotQ29udGVudC1UeXBlOiB0ZXh0L3htbDsgY2hhcnNldD1VVEYtOAotQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5Ci1Db250ZW50LUlkOiAmbHQ7OUQ2NDVDOEVCQjgzN0NFNTRBQkQwMjdBMzY1OTUzNUQmZ3Q7Ci0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7Ci0mbHQ7c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSIuLi4uIi4uLi4mZ3Q7Ci0gICAgLi4uLi4uLi4KLSAgICAgICAgICAgICAgICAmbHQ7c291cmNlIGhyZWY9ImNpZDozOTM2QUUxOUZCRUQ1NUFFNDYyMEI4MUM3M0JERDc2RSIgeG1sbnM9Ii8mZ3Q7Ci0KLSAgICAuLi4uLi4uLgotJmx0Oy9zb2FwZW52OkVudmVsb3BlJmd0OwotLS0tLS0tPV9QYXJ0XzBfMTk3NzUxMS4xMTIzMTYzNTcxMTM4Ci1Db250ZW50LVR5cGU6IHRleHQvcGxhaW4KLUNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeQotQ29udGVudC1JZDogJmx0OzM5MzZBRTE5RkJFRDU1QUU0NjIwQjgxQzczQkRENzZFJmd0OwotCi08ZW0+QmluYXJ5IERhdGEuLi4uLjwvZW0+Ci0tLS0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgtLTwvcHJlPgotPC9zb3VyY2U+PHVsPgotICA8bGk+PHN0cm9uZz5Db3JyZXNwb25kaW5nIE1UT00gbWVzc2FnZSBmcm9tIEF4aXMyPC9zdHJvbmc+PC9saT4KLTwvdWw+Ci08c291cmNlPjxwcmU+Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9TUlNRUJvdW5kYXJ5NEE3QUU1NTk4NEU3NDM4MDM0OwotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImFwcGxpY2F0aW9uL3hvcCt4bWwiOyBzdGFydD0iJmx0OzAuMDlCQzdGNEJFMkU0RDNFRjFCQGFwYWNoZS5vcmcmZ3Q7IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC1pbmZvPSJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCIKLQotLS1NSU1FQm91bmRhcnk0QTdBRTU1OTg0RTc0MzgwMzQKLWNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtODsgdHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWw7IgotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmluYXJ5Ci1jb250ZW50LWlkOiAmbHQ7MC4wOUJDN0Y0QkUyRTREM0VGMUJAYXBhY2hlLm9yZyZndDsKLQotJmx0Oz94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPyZndDsKLSZsdDtzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Ii4uLi4iLi4uLiZndDsKLSAgLi4uLi4uLi4KLSAgICAgICAgICZsdDt4b3A6SW5jbHVkZSBocmVmPSJjaWQ6MS5BOTFENkQyRTNEN0FDNEQ1ODBAYXBhY2hlLm9yZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICB4bWxuczp4b3A9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiJmd0OwotICAgICAgICAgJmx0Oy94b3A6SW5jbHVkZSZndDsKLSAgLi4uLi4uLi4KLQotJmx0Oy9zb2FwZW52OkVudmVsb3BlJmd0OwotLS1NSU1FQm91bmRhcnk0QTdBRTU1OTg0RTc0MzgwMzQKLWNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCi1jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBiaW5hcnkKLWNvbnRlbnQtaWQ6ICZsdDsxLkE5MUQ2RDJFM0Q3QUM0RDU4MEBhcGFjaGUub3JnJmd0OwotCi08ZW0+QmluYXJ5IERhdGEuLi4uLjwvZW0+Ci0tLU1JTUVCb3VuZGFyeTRBN0FFNTU5ODRFNzQzODAzNC0tPC9wcmU+Ci08L3NvdXJjZT48YSBuYW1lPSI0Ij48L2E+Ci0KLTxoMj5BZHZhbmNlZCBUb3BpY3M8L2gyPgotPGEgbmFtZT0iNDEiPjwvYT4KLQotPGgzPkZpbGUgQ2FjaGluZyBmb3IgQXR0YWNobWVudHM8L2gzPgotCi08cD5BeGlzMiBjb21lcyBoYW5keSB3aXRoIGEgZmlsZSBjYWNoaW5nIG1lY2hhbmlzbSBmb3IgaW5jb21pbmcgYXR0YWNobWVudHMsCi13aGljaCBnaXZlcyBBeGlzMiB0aGUgYWJpbGl0eSB0byBoYW5kbGUgdmVyeSBsYXJnZSBhdHRhY2htZW50cyB3aXRob3V0Ci1idWZmZXJpbmcgdGhlbSBpbiB0aGUgbWVtb3J5IGF0IGFueSB0aW1lLiBBeGlzMiBmaWxlIGNhY2hpbmcgc3RyZWFtcyB0aGUKLWluY29taW5nIE1JTUUgcGFydHMgZGlyZWN0bHkgaW50byB0aGUgZmlsZXMsIGFmdGVyIHJlYWRpbmcgdGhlIE1JTUUgcGFydAotaGVhZGVycy48L3A+Ci0KLTxwPkFsc28sIGEgdXNlciBjYW4gc3BlY2lmeSBhIHNpemUgdGhyZXNob2xkIGZvciB0aGUgRmlsZSBjYWNoaW5nIChpbiBieXRlcykuCi1XaGVuIHRoaXMgdGhyZXNob2xkIHZhbHVlIGlzIHNwZWNpZmllZCwgb25seSB0aGUgYXR0YWNobWVudHMgd2hvc2Ugc2l6ZSBpcwotYmlnZ2VyIHRoYW4gdGhlIHRocmVzaG9sZCB2YWx1ZSB3aWxsIGdldCBjYWNoZWQgaW4gdGhlIGZpbGVzLiBTbWFsbGVyCi1hdHRhY2htZW50cyB3aWxsIHJlbWFpbiBpbiB0aGUgbWVtb3J5LjwvcD4KLQotPHA+Tm90ZSA6IEl0IGlzIGEgbXVzdCB0byBzcGVjaWZ5IGEgZGlyZWN0b3J5IHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZQotYXR0YWNobWVudHMuIEFsc28gY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gPHN0cm9uZz5jbGVhbiB0aGF0Ci1kaXJlY3Rvcnk8L3N0cm9uZz4gZnJvbSB0aW1lIHRvIHRpbWUuPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBzZXQgaW4gQXhpczIueG1sIGluIG9yZGVyIHRvIGVuYWJsZQotZmlsZSBjYWNoaW5nLjwvcD4KLTxzb3VyY2U+PHByZT4mbHQ7YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCImZ3Q7Ci0KLSAgICAmbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0mZ3Q7Ci0gICAgJmx0OyEtLSBQYXJhbWV0ZXJzIC0tJmd0OwotICAgICZsdDshLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLSZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiJmd0O3RydWUmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiJmd0OzxlbT50ZW1wIGRpcmVjdG9yeTwvZW0+Jmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiJmd0OzxlbT40MDAwPC9lbT4mbHQ7L3BhcmFtZXRlciZndDsKLSAgICAuLi4uLi4uLi4KLSAgICAuLi4uLi4uLi4KLSZsdDsvYXhpc2NvbmZpZyZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+RW5hYmxpbmcgZmlsZSBjYWNoaW5nIGZvciBjbGllbnQgc2lkZSByZWNlaXZpbmcgY2FuIGJlIGRvbmUgZm9yIHRoZSBieQotc2V0dGluZyB0aGUgT3B0aW9ucyBhcyBmb2xsb3dzLjwvcD4KLTxzb3VyY2U+PHByZT5vcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNBQ0hFX0FUVEFDSE1FTlRTLENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLW9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVRUQUNITUVOVF9URU1QX0RJUiw8ZW0+VGVtcERpcjwvZW0+KTsKLW9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRklMRV9TSVpFX1RIUkVTSE9MRCwgPGVtPiI0MDAwIjwvZW0+KTs8L3ByZT4KLTwvc291cmNlPjwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9wb2pvZ3VpZGUueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Bvam9ndWlkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmEzNWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Bvam9ndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIGxhbmc9ImVuIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+UE9KTyBXZWIgU2VydmljZXMgdXNpbmcgQXhpczI8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5QT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczI8L2gxPg0KLTxwPldhbnQgYSBxdWljayB3YXkgdG8gZ2V0IGEgV2ViIHNlcnZpY2UgdXAgYW5kIHJ1bm5pbmcgaW4gbm8gdGltZT8NCi1UaGVuIHlvdSBzaG91bGQgY29uc2lkZXIgY3JlYXRpbmcgYSBQbGFpbiBPbGQgSmF2YSBPYmplY3QgKFBPSk8pDQotdGhhdCB5b3UgY2FuIGRlcGxveSB1c2luZyBBcGFjaGUgQXhpczIgb24gQXBhY2hlIFRvbWNhdC4gUE9KT3MgYXJlDQotZmFzdCB0byBidWlsZCBhbmQgZWFzeSB0byBtYWludGFpbiwgd2hpY2ggbWVhbnMgeW91J2xsIHNhdmUgYSBsb3QNCi1vZiB0aW1lIGJ1aWxkaW5nIGFuZCBkZWJ1Z2dpbmcgeW91ciBjb2RlLiBUaGlzIGRvY3VtZW50IHNob3dzIHlvdQ0KLWhvdyB0byB0YWtlIGEgc2ltcGxlIFBPSk8sIGFuZCBkZXBsb3kgaXQgb24gQXBhY2hlIFRvbWNhdCBhcyBhIFdlYg0KLXNlcnZpY2UgaW4gdGhlIGV4cGxvZGVkIGRpcmVjdG9yeSBmb3JtYXQuIFlvdSdsbCBhbHNvIGxlYXJuIGhvdyB0bw0KLXRha2UgYSBQT0pPIGJhc2VkIG9uIHRoZSBTcHJpbmcgRnJhbWV3b3JrLCBhbmQgZGVwbG95IHRoYXQgYXMgYW4NCi1BQVIgcGFja2FnZWQgV2ViIHNlcnZpY2Ugb24gVG9tY2F0LjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3Bvam8iPlRoZSBQT0pPPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNwb2pvd3MiPlBPSk8gV2ViIHNlcnZpY2UgdXNpbmcgQXBhY2hlIEF4aXMyIGFuZA0KLVRvbWNhdDwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNkZWZpbmluZ3NlcnZpY2UiPkRlZmluaW5nIHRoZSBTZXJ2aWNlOg0KLXNlcnZpY2VzLnhtbDwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2J1aWxkcG9qb3dzIj5CdWlsZGluZyB0aGUgUE9KTyBXZWIgU2VydmljZSBVc2luZw0KLUFudDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjdGVzdGluZ3Bvam93cyI+VGVzdGluZyB0aGUgUE9KTyBXZWIgU2VydmljZSBVc2luZw0KLVJQQ1NlcnZpY2VDbGllbnQ8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjbGltaXRhdGlvbnNwb2pvIj5MaW1pdGF0aW9ucyBhbmQgU3RyZW5ndGhzIG9mDQotUE9KTzwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI3NwcmluZ3Bvam93cyI+U3ByaW5nLWJhc2VkIFBPSk8gV2ViIFNlcnZpY2U8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjcXVpY2tpbnRybyI+UXVpY2sgSW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNzZXJ2aWNlZGVmIj5UaGUgU2VydmljZSBEZWZpbml0aW9uOg0KLXNlcnZpY2VzLnhtbDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjaW5pdGlhbGl6aW5nc3ByaW5nIj5Jbml0aWFsaXppbmcgdGhlIFNwcmluZw0KLWFwcGxpY2F0aW9uIGNvbnRleHQ6IFNwcmluZ0luaXQ8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3Rlc3RpbmdycGMiPlRlc3RpbmcgVXNpbmcgYW4NCi1SUENTZXJ2aWNlQ2xpZW50PC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjanNyMTgxcG9qb3dzIj5KU1IgMTgxIEFubm90YXRpb24gc3VwcG9ydCB3aXRoIFBPSk8gV2ViIHNlcnZpY2VzPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2pzcjE4MWRlZmluaW5nc2VydmljZSI+U2FtcGxlIEpTUiAxODEgUE9KTyBXZWIgU2VydmljZTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI3N1bW1hcnkiPlN1bW1hcnk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2Z1cnRoZXJzdHVkeSI+Rm9yIEZ1cnRoZXIgU3R1ZHk8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImludHJvZHVjdGlvbiIgaWQ9ImludHJvZHVjdGlvbiI+PC9hPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPlRoZSB0YXNrIG9mIGJ1aWxkaW5nIGEgV2ViIHNlcnZpY2UgY2FuIHNvbWV0aW1lcyBiZQ0KLW92ZXJ3aGVsbWluZywgYnV0IG5vdCB3aXRoIFBPSk9zISBUaGUgb2xkLXNjaG9vbCBQbGFpbiBPbGQgSmF2YQ0KLU9iamVjdCBpcyBhIHNpbXBsZSBhbmQgcXVpY2sgd2F5IHRvIGdldCBtb3N0LCBpZiBub3QgYWxsLCBvZiB5b3VyDQotY3VycmVudGx5IGV4aXN0aW5nIEphdmEgY2xhc3NlcyB1cCBvbiB0aGUgV2ViIGFzIHJlYWRpbHkgYWNjZXNzaWJsZQ0KLVdlYiBzZXJ2aWNlcy4gVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIGJ1aWxkIGEgUE9KTy1zdHlsZSBXZWINCi1zZXJ2aWNlIHdpdGggQXBhY2hlIEF4aXMyIGFuZCBUb21jYXQuIEl0IGlzIG9yZ2FuaXplZCBhcw0KLWZvbGxvd3M6PC9wPg0KLTx1bD4NCi08bGk+VGhlIFBPSk86IFRoaXMgaXMgdGhlIEphdmEgY2xhc3MgdGhhdCB5b3UnbGwgdXNlIHRocm91Z2hvdXQNCi10aGlzIGRvY3VtZW50PC9saT4NCi08bGk+UE9KTyBkZXBsb3ltZW50PC9saT4NCi08bGk+VGVzdCB0aGUgUE9KTyBXZWIgc2VydmljZSB1c2luZyBhbiBSUEMgYmFzZWQgY2xpZW50PC9saT4NCi08bGk+TGltaXRhdGlvbnMgb2Ygc3RyYWlnaHQgUE9KTzwvbGk+DQotPGxpPlNwcmluZy1iYXNlZCBQT0pPIFdlYiBzZXJ2aWNlIGFuZCBkZXBsb3ltZW50PC9saT4NCi08L3VsPg0KLTxwPlRoZSBjb2RlIGZvciB0aGUgZG9jdW1lbnQgY2FuIGJlIGZvdW5kIGF0DQotQXhpczJfSE9NRS9zYW1wbGVzL3Bvam9ndWlkZSBhbmQgQXhpczJfSE9NRS9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZw0KLW9uY2UgeW91IGV4dHJhY3QgdGhlIDxhIGhyZWY9DQotIi4uLy4uL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuaHRtbCNzdGQtYmluIj5BeGlzMg0KLVN0YW5kYXJkIERpc3RyaWJ1dGlvbjwvYT4uIChJdCBpcyBiZXR0ZXIgdG8gZ2V0IGl0IG5vdyBhcyBpdCB3aWxsDQotaGVscCB5b3UgdG8gZm9sbG93IGFsb25nLikgTGV0J3MgZ2V0IHN0YXJ0ZWQuPC9wPg0KLTxhIG5hbWU9InBvam8iIGlkPSJwb2pvIj48L2E+DQotPGgyPlRoZSBQT0pPPC9oMj4NCi08cD5UaGUgUE9KTyB5b3UnbGwgYmUgdXNpbmcgdGhyb3VnaG91dCB0aGlzIGRvY3VtZW50IGlzIGEgV2VhdGhlcg0KLXNlcnZpY2UgUE9KTyB0aGF0IGNvbnNpc3RzIG9mIHR3byBjbGFzc2VzOiBXZWF0aGVyU2VydmljZSBhbmQNCi1XZWF0aGVyLiBXZWF0aGVyIGNvbnRhaW5zIHRoZSBXZWF0aGVyIGRhdGE6IFRlbXBlcmF0dXJlLCBmb3JlY2FzdCwNCi1yYWluICh3aWxsIGl0IHJhaW4/KSwgYW5kIGhvd011Y2hSYWluIChTZWUgQ29kZSBMaXN0aW5nIDEpLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMTogVGhlIFdlYXRoZXIgUE9KTzwvYj48L3A+DQotPHByZT4NCi1wYWNrYWdlIHNhbXBsZS5wb2pvLmRhdGE7DQotDQotcHVibGljIGNsYXNzIFdlYXRoZXJ7DQotICAgIGZsb2F0IHRlbXBlcmF0dXJlOw0KLSAgICBTdHJpbmcgZm9yZWNhc3Q7DQotICAgIGJvb2xlYW4gcmFpbjsNCi0gICAgZmxvYXQgaG93TXVjaFJhaW47DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZW1wZXJhdHVyZShmbG9hdCB0ZW1wKXsNCi0gICAgICAgIHRlbXBlcmF0dXJlID0gdGVtcDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0VGVtcGVyYXR1cmUoKXsNCi0gICAgICAgIHJldHVybiB0ZW1wZXJhdHVyZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yZWNhc3QoU3RyaW5nIGZvcmUpew0KLSAgICAgICAgZm9yZWNhc3QgPSBmb3JlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9yZWNhc3QoKXsNCi0gICAgICAgIHJldHVybiBmb3JlY2FzdDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0UmFpbihib29sZWFuIHIpew0KLSAgICAgICAgcmFpbiA9IHI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmFpbigpew0KLSAgICAgICAgcmV0dXJuIHJhaW47DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEhvd011Y2hSYWluKGZsb2F0IGhvd011Y2gpew0KLSAgICAgICAgaG93TXVjaFJhaW4gPSBob3dNdWNoOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmbG9hdCBnZXRIb3dNdWNoUmFpbigpew0KLSAgICAgICAgcmV0dXJuIGhvd011Y2hSYWluOw0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTxwPkFuZCBoZXJlJ3MgdGhlIFdlYXRoZXJTZXJ2aWNlIGNsYXNzLCBzaG93biBpbiBDb2RlIExpc3RpbmcNCi0yLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMjogVGhlIFdlYXRoZXJTZXJ2aWNlIGNsYXNzPC9iPjwvcD4NCi08cHJlPg0KLXBhY2thZ2Ugc2FtcGxlLnBvam8uc2VydmljZTsNCi0NCi1pbXBvcnQgc2FtcGxlLnBvam8uZGF0YS5XZWF0aGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWF0aGVyU2VydmljZXsNCi0gICAgV2VhdGhlciB3ZWF0aGVyOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0V2VhdGhlcihXZWF0aGVyIHdlYXRoZXIpew0KLSAgICAgICAgdGhpcy53ZWF0aGVyID0gd2VhdGhlcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgV2VhdGhlciBnZXRXZWF0aGVyKCl7DQotICAgICAgICByZXR1cm4gdGhpcy53ZWF0aGVyOw0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTxwPk5vdGUgdGhhdCBpdCdzIGFsbCBqdXN0IHN0cmFpZ2h0IFBPSk9zIHdpdGggZmllbGQgaXRlbXMgYW5kDQotPGNvZGU+Z2V0dGVyPC9jb2RlPiBhbmQgPGNvZGU+c2V0dGVyPC9jb2RlPiBtZXRob2RzIGZvciBlYWNoIGZpZWxkLg0KLU5leHQsIHlvdSdsbCB0YWtlIGEgbG9vayBhdCB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIG1ha2UgaXQgcmVhZHkNCi1mb3IgZGVwbG95bWVudCBvbiBBcGFjaGUgQXhpczIgYW5kIFRvbWNhdC48L3A+DQotPGEgbmFtZT0icG9qb3dzIiBpZD0icG9qb3dzIj48L2E+DQotPGgyPlBPSk8gV2ViIFNlcnZpY2UgVXNpbmcgQXBhY2hlIEF4aXMyIGFuZCBUb21jYXQ8L2gyPg0KLTxwPkdvdCB0aGUgUE9KT3M/IEdyZWF0LiBUaGlzIHNlY3Rpb24gd2lsbCBzaG93IHlvdSBob3cgdG8gcGFja2FnZQ0KLXRoZW0gaW4gdGhlIGV4cGxvZGVkIGRpcmVjdG9yeSBmb3JtYXQgZm9yIGVhc3kgZGVwbG95bWVudC4gRmlyc3QNCi15b3UnbGwgbG9vayBhdCB0aGUgc2VydmljZXMueG1sIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBXZWIgc2VydmljZSwNCi1hbmQgdGhlbiB5b3UnbGwgYnVpbGQgdGhlIGZpbGVzIHVzaW5nIDxhIGhyZWY9DQotImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFwYWNoZSBBbnQ8L2E+LCBhbmQgZGVwbG95IHRoZSBXZWIgc2VydmljZQ0KLW9uIFRvbWNhdC48L3A+DQotPGEgbmFtZT0iZGVmaW5pbmdzZXJ2aWNlIiBpZD0iZGVmaW5pbmdzZXJ2aWNlIj48L2E+DQotPGgzPkRlZmluaW5nIHRoZSBTZXJ2aWNlOiBzZXJ2aWNlcy54bWw8L2gzPg0KLTxwPkJlZm9yZSBBeGlzMiBjYW4gdW5kZXJzdGFuZCB3aGF0IGlzIGdvaW5nIG9uLCB5b3UgaGF2ZSB0byB0ZWxsDQotaXQgdG8gdXNlIHRoZSBzZXJ2aWNlcy54bWwgZmlsZS4gTGV0J3MgZ2V0IHJpZ2h0IGludG8gaXQgKHNlZSBDb2RlDQotTGlzdGluZyAzKS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDM6IFRoZSBzZXJ2aWNlIGRlZmluaXRpb24gZmlsZToNCi1zZXJ2aWNlcy54bWw8L2I+PC9wPg0KLTxwcmU+DQotJmx0O3NlcnZpY2UgbmFtZT0iV2VhdGhlclNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiImZ3Q7DQotICAgICZsdDtkZXNjcmlwdGlvbiZndDsNCi0gICAgICAgIFdlYXRoZXIgUE9KTyBTZXJ2aWNlDQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7DQotICAgICZsdDttZXNzYWdlUmVjZWl2ZXJzJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciANCi0gICAgICAgICAgICBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ig0KLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlcg0KLSAgICAgICAgICAgIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgJmx0Oy9tZXNzYWdlUmVjZWl2ZXJzJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyImZ3Q7DQotICAgICAgICBzYW1wbGUucG9qby5zZXJ2aWNlLldlYXRoZXJTZXJ2aWNlDQotICAgICZsdDsvcGFyYW1ldGVyJmd0Ow0KLSZsdDsvc2VydmljZSZndDsNCi08L3ByZT4NCi08cD5UaGUgbmFtZSBvZiB0aGUgc2VydmljZSBpcyBzcGVjaWZpZWQgYXMgV2VhdGhlclNlcnZpY2UgYW5kIHRoZQ0KLXNjb3BlIG9mIHRoZSBzZXJ2aWNlIGlzIGFwcGxpY2F0aW9uLiBBcyB5b3UgY2FuIHNlZSBpbiB0aGUNCi1XZWF0aGVyU2VydmljZSBQT0pPLCB0aGVyZSBhcmUgdHdvIG1ldGhvZHM6IElOLU9OTFkgbWV0aG9kIGFuZA0KLUlOLU9VVCBtZXRob2QuIEhlbmNlIHRoZSBtZXNzYWdlUmVjZWl2ZXIgZWxlbWVudHMgYXJlIG9yZGVyZWQNCi13aXRoaW4gdGhlIG1lc3NhZ2VSZWNlaXZlcnMgdGFnLiBMYXN0bHksIHRoZSBTZXJ2aWNlQ2xhc3MgcGFyYW1ldGVyDQotc3BlY2lmaWVzIHRoZSBjbGFzcyBvZiB0aGUgV2ViIHNlcnZpY2UsIHdoaWNoIGlzDQotc2FtcGxlLnBvam8uc2VydmljZS5XZWF0aGVyU2VydmljZS4gV2hlbiBvcGVyYXRpb25zIG9mIHlvdXIgV2ViDQotc2VydmljZSBnZXQgY2FsbGVkLCB0aGUgbWV0aG9kcyBvZiB0aGUgV2VhdGhlclNlcnZpY2UgY2xhc3Mgd2lsbCBiZQ0KLWNhbGxlZC4gTmV4dCBsZXQgdXNsIHRha2UgYSBsb29rIGF0IGFuIGVhc3kgbWV0aG9kIG9mIGJ1aWxkaW5nIHlvdXINCi1hcHBsaWNhdGlvbiB1c2luZyBBbnQuPC9wPg0KLTxhIG5hbWU9ImJ1aWxkcG9qb3dzIiBpZD0iYnVpbGRwb2pvd3MiPjwvYT4NCi08aDI+QnVpbGRpbmcgdGhlIFBPSk8gV2ViIFNlcnZpY2UgVXNpbmcgQXBhY2hlIEFudDwvaDI+DQotPHA+PGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiBpcyBhIHNsaWNrIGJ1aWxkIHRvb2wuDQotSXQgaGVscHMgcmVkdWNlIHRoZSB0aW1lIHRvIGJ1aWxkIHRoZSBhcHBsaWNhdGlvbnMsIGFuZCBzZXZlcmFsIG9mDQotdGhlIEF4aXMyIGNvbW1hbmQtbGluZSB0b29scyBjcmVhdGUgdGhlIGJ1aWxkLnhtbCBmaWxlcyBmb3IgeW91Lg0KLShXZSB3aWxsIG5vdCBiZSBnb2luZyBpbnRvIHRvbyBtdWNoIGRldGFpbCBvbiB0aGUgYnVpbGQueG1sIGZpbGUNCi10aGF0IHlvdSdsbCBiZSB1c2luZy4pPC9wPg0KLTxwPkhlcmUgYXJlIHRoZSBtYWluIEFudCB0YXNrcyB5b3UnbGwgYmUgdXNpbmc6PC9wPg0KLTx1bD4NCi08bGk+Z2VuZXJhdGUuc2VydmljZSAtLSBUaGlzIEFudCB0YXNrIGJ1aWxkcyB0aGUgc2VydmljZSByZWxldmFudA0KLXNvdXJjZSwgYW5kIGNvcGllcyB0aGUgZmlsZXMgdG8gYnVpbGQvV2VhdGhlclNlcnZpY2U8L2xpPg0KLTxsaT5ycGMuY2xpZW50IC0tIFRoaXMgdGFzayBidWlsZHMgdGhlIGNsaWVudCByZWxldmFudCBmaWxlcywNCi1idWlsZHMgYSBKQVIgYXQgPGVtPmJ1aWxkL2xpYi9ycGMtY2xpZW50LmphcjwvZW0+LCBhbmQgdGhlbiBydW5zDQotdGhlIGNsaWVudDwvbGk+DQotPC91bD4NCi08cD5CZWZvcmUgeW91IGNhbiBidWlsZCB0aGUgc291cmNlLCB5b3UnbGwgbmVlZCB0byBkb3dubG9hZCB0aGUNCi1BeGlzMiBAYXhpczJfdmVyc2lvbkAtYmluIGFuZCBAYXhpczJfdmVyc2lvbkAtd2FyIGRpc3RyaWJ1dGlvbnMNCi1mcm9tIDxhIGhyZWY9DQotIi4uLy4uL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuaHRtbCI+aGVyZTwvYT4uIFRoZW4NCi1tb2RpZnkgdGhlIGZvbGxvd2luZyBsaW5lIGluc2lkZSB0aGUgYnVpbGQueG1sIGZpbGUgKGluIHRoZQ0KLUF4aXMyX0hPTUUvc2FtcGxlcy9wb2pvZ3VpZGUgZGlyZWN0b3J5IGluIHRoZSBleHRyYWN0ZWQgQXhpczINCi1AYXhpczJfdmVyc2lvbkAgU3RhbmRhcmQgQmluYXJ5IChiaW4pIERpc3RyaWJ1dGlvbikgOjwvcD4NCi08cHJlPg0KLSZsdDtwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iYzpcYXBwc1xheGlzMiIgLyZndDsNCi08L3ByZT4NCi08cD5UaGlzIG1vZGlmaWNhdGlvbiBjb250YWlucyB0aGUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgdW56aXBwZWQNCi1BeGlzMiBAYXhpczJfdmVyc2lvbkAtYmluIDxhIGhyZWY9DQotIi4uLy4uL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuaHRtbCNzdGQtYmluIj5kb3dubG9hZDwvYT4uDQotV2l0aCB0aGF0IGV4cGxhbmF0aW9uLCB5b3UnbGwgbm93IGJ1aWxkIHRoZSBzb3VyY2UgYnkgdHlwaW5nIHRoZQ0KLWZvbGxvd2luZzogYW50PC9wPg0KLTxwPlRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IGZvcm1hdCBzaG91bGQgbm93IGV4aXN0IGF0DQotYnVpbGQvV2VhdGhlclNlcnZpY2U6PC9wPg0KLTxwcmU+DQotIC0gV2VhdGhlclNlcnZpY2UNCi0gICAtIE1FVEEtSU5GDQotICAgICAtIHNlcnZpY2VzLnhtbA0KLSAgIC0gc2FtcGxlDQotICAgICAtIHBvam8NCi0gICAgICAgLSBkYXRhDQotICAgICAgICAgLSBXZWF0aGVyLmNsYXNzDQotICAgICAgIC0gc2VydmljZQ0KLSAgICAgICAgIC0gV2VhdGhlclNlcnZpY2UuY2xhc3MNCi08L3ByZT4NCi08cD5TaW1wbGUgaXNuJ3QgaXQ/IEFuIGV4Y2VsbGVudCB3YXkgdG8gZGl2ZSBpbnRvIFdlYiBzZXJ2aWNlcw0KLWRldmVsb3BtZW50LjwvcD4NCi08cD5Ob3cgZ2V0IGEgPGEgaHJlZj0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLyI+VG9tY2F0PC9hPg0KLWRpc3RyaWJ1dGlvbiAoSSB1c2VkIHY1LjUpLCBhbmQgc3RhcnQgaXQgdXAgYnkgcnVubmluZw0KLTxlbT5iaW4vc3RhcnR1cC5iYXQ8L2VtPiBvciA8ZW0+YmluL3N0YXJ0dXAuc2g8L2VtPi4gT25jZSBpdCdzDQotcnVubmluZywgZGVwbG95IHRoZSBBeGlzMiBAYXhpczJfdmVyc2lvbkAtd2FyIGJ5IGNvcHlpbmcgdGhlDQotYXhpczIud2FyIGZpbGUgdG8gVG9tY2F0J3Mgd2ViYXBwcyBkaXJlY3RvcnkuIFRvbWNhdCB3aWxsIHByb2NlZWQNCi1ieSBkZXBsb3lpbmcgYXhpczIgYW5kIHVuLWFyY2hpdmluZyBpdCBpbnRvIHRoZSB3ZWJhcHBzIGRpcmVjdG9yeS4NCi1Ob3cgY29weSB0aGUgV2VhdGhlclNlcnZpY2UgZGlyZWN0b3J5IHRoYXQgd2FzIGNyZWF0ZWQgYXQgdGhlIHRpbWUNCi1vZiBidWlsZGluZyBvdXIgcHJvamVjdCB0bzoNCi08ZW0+Jmx0O3RvbWNhdC1ob21lJmd0Oy93ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXM8L2VtPi48L3A+DQotPHA+VGhlIHNlcnZpY2Ugc2hvdWxkIGRlcGxveSBxdWlja2x5LiBZb3Ugd2lsbGwgdGVzdCB0aGUgV2ViDQotc2VydmljZSB1c2luZyB0aGUgUlBDU2VydmljZUNsaWVudCBpbiB0aGUgbmV4dCBzZWN0aW9uLjwvcD4NCi08YSBuYW1lPSJ0ZXN0aW5ncG9qb3dzIiBpZD0idGVzdGluZ3Bvam93cyI+PC9hPg0KLTxoMj5UZXN0aW5nIHRoZSBQT0pPIFdlYiBTZXJ2aWNlIFVzaW5nIFJQQ1NlcnZpY2VDbGllbnQ8L2gyPg0KLTxwPk9LLCBzbyB0aGUgV2ViIHNlcnZpY2Ugc2hvdWxkIGJlIHJ1bm5pbmcgb24gVG9tY2F0LiBOb3cgeW91J2xsDQotYnVpbGQgYSBzaW1wbGUgUlBDU2VydmljZUNsaWVudCBhbmQgdGVzdCB0aGUgUE9KTyBXZWIgc2VydmljZS4NCi1Zb3UnbGwgZmlyc3Qgc3RhcnQgb3V0IHdpdGggdGhlIGNsYXNzIGNvbnN0cnVjdHMsIGNyZWF0aW5nIHRoZQ0KLVJQQ1NlcnZpY2VDbGllbnQgYW5kIGluaXRpYWxpemluZyB0aGUgdmFsdWVzIG9mIHRoZSBXZWF0aGVyIGNsYXNzDQotd2l0aGluIHRoZSBXZWIgc2VydmljZSAoU2VlIENvZGUgTGlzdGluZyA0KS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDQ6IFNldHRpbmcgdGhlIHdlYXRoZXI8L2I+PC9wPg0KLTxwcmU+DQotcGFja2FnZSBzYW1wbGUucG9qby5ycGNjbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50Ow0KLQ0KLWltcG9ydCBzYW1wbGUucG9qby5kYXRhLldlYXRoZXI7DQotDQotDQotcHVibGljIGNsYXNzIFdlYXRoZXJSUENDbGllbnQgew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzMSkgdGhyb3dzIEF4aXNGYXVsdCB7DQotDQotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudCgpOw0KLQ0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCk7DQotDQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoDQotICAgICAgICAgICAgICAgIDxiPiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvV2VhdGhlclNlcnZpY2UiKTs8L2I+DQotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7DQotDQotICAgICAgICAvLyBTZXR0aW5nIHRoZSB3ZWF0aGVyDQotICAgICAgICBRTmFtZSBvcFNldFdlYXRoZXIgPQ0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3NlcnZpY2UucG9qby5zYW1wbGUveHNkIiwgIjxiPnNldFdlYXRoZXIiKTsNCi0NCi0gICAgICAgIFdlYXRoZXIgdyA9IG5ldyBXZWF0aGVyKCk7DQotDQotICAgICAgICB3LnNldFRlbXBlcmF0dXJlKChmbG9hdCkzOS4zKTsNCi0gICAgICAgIHcuc2V0Rm9yZWNhc3QoIkNsb3VkeSB3aXRoIHNob3dlcnMiKTsNCi0gICAgICAgIHcuc2V0UmFpbih0cnVlKTsNCi0gICAgICAgIHcuc2V0SG93TXVjaFJhaW4oKGZsb2F0KTQuNSk7DQotDQotICAgICAgICBPYmplY3RbXSBvcFNldFdlYXRoZXJBcmdzID0gbmV3IE9iamVjdFtdIHsgdyB9Ow0KLQ0KLSAgICAgICAgc2VydmljZUNsaWVudC5pbnZva2VSb2J1c3Qob3BTZXRXZWF0aGVyLCBvcFNldFdlYXRoZXJBcmdzKTs8L2I+DQotLi4uDQotPC9wcmU+DQotPHA+VGhlIG1vc3QgaW50ZXJlc3RpbmcgY29kZSB0byBub3RlIGlzIGluIGJvbGQgZm9udC4gTm90aWNlIHRoZQ0KLXRhcmdldEVQUiB2YXJpYWJsZSB5b3UgY3JlYXRlLCBzZXR0aW5nIHRoZSBlbmRwb2ludCByZWZlcmVuY2UgdG8NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvV2VhdGhlclNlcnZpY2UuIFRoaXMgaXMgd2hlcmUNCi15b3UgZGVwbG95ZWQgaXQgb24gQXhpczIuIFlvdSBjYW4gYWxzbyB2ZXJpZnkgdGhpcyBieSBhc2tpbmcgQXhpczINCi10byBsaXN0IGl0cyBzZXJ2aWNlcyBieSBnb2luZyB0byB0aGUgZm9sbG93aW5nIFVSTDoNCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvbGlzdFNlcnZpY2VzLjwvcD4NCi08cD5OZXh0IHRoZSBvcFNldFdlYXRoZXIgdmFyaWFibGUgZ2V0cyBzZXR1cCwgcG9pbnRpbmcgdG8gdGhlDQotc2V0V2VhdGhlciBvcGVyYXRpb24uIFRoZW4gdGhlIFdlYXRoZXIgZGF0YSBpcyBjcmVhdGVkIGFuZA0KLWluaXRpYWxpemVkLiBMYXN0bHksIHlvdSBpbnZva2UgdGhlIFdlYiBzZXJ2aWNlLCB3aGljaCBpbml0aWFsaXplcw0KLXRoZSB3ZWF0aGVyIGRhdGEgKHlvdSdsbCB2ZXJpZnkgdGhpcyBzb29uKS4gTmV4dCB5b3UgZ2V0IGJhY2sgdGhlDQotd2VhdGhlciBkYXRhIChzZWUgQ29kZSBMaXN0aW5nIDUpLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgNTogR2V0dGluZyB0aGUgd2VhdGhlciBkYXRhPC9iPjwvcD4NCi08cHJlPg0KLS4uLg0KLSAgICAgICAgc2VydmljZUNsaWVudC5pbnZva2VSb2J1c3Qob3BTZXRXZWF0aGVyLCBvcFNldFdlYXRoZXJBcmdzKTsNCi0NCi0gICAgICAgIC8vIEdldHRpbmcgdGhlIHdlYXRoZXINCi0gICAgICAgIFFOYW1lIG9wR2V0V2VhdGhlciA9DQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5wb2pvLnNhbXBsZS94c2QiLCAiPGI+Z2V0V2VhdGhlciIpOw0KLQ0KLSAgICAgICAgT2JqZWN0W10gb3BHZXRXZWF0aGVyQXJncyA9IG5ldyBPYmplY3RbXSB7IH07DQotICAgICAgICBDbGFzc1tdIHJldHVyblR5cGVzID0gbmV3IENsYXNzW10geyBXZWF0aGVyLmNsYXNzIH07DQotICAgICAgICANCi0gICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEdldFdlYXRoZXIsDQotICAgICAgICAgICAgICAgIG9wR2V0V2VhdGhlckFyZ3MsIHJldHVyblR5cGVzKTsNCi0gICAgICAgIA0KLSAgICAgICAgV2VhdGhlciByZXN1bHQgPSAoV2VhdGhlcikgcmVzcG9uc2VbMF07DQotICAgICAgICANCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2VhdGhlciBkaWRuJ3QgaW5pdGlhbGl6ZSEiKTsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9PC9iPg0KLS4uLg0KLTwvcHJlPg0KLTxwPkZpcnN0IHlvdSBzZXQgdGhlIG9wZXJhdGlvbiBpbiBvcEdldFdlYXRoZXIgdG8gZ2V0V2VhdGhlci4gVGhlbg0KLXlvdSBjcmVhdGUgYW4gZW1wdHkgYXJndW1lbnQgbGlzdC4gTm90ZSB0aGF0IHRoaXMgdGltZSB5b3UgZXhwZWN0DQotc29tZXRoaW5nIGJhY2sgZnJvbSB0aGUgV2ViIHNlcnZpY2UsIGFuZCBzbyB5b3UgY3JlYXRlIGEgbGlzdCBvZg0KLXJldHVybiB0eXBlcy4gVGhlbiB5b3UgaW52b2tlIHRoZSBXZWIgc2VydmljZSB1c2luZyBhIGJsb2NraW5nIGNhbGwNCi1hbmQgd2FpdCBmb3IgdGhlIHdlYXRoZXIgZGF0YSB0byBiZSByZXR1cm5lZCB0byB5b3UsIGFuZCB5b3UgcGxhY2UNCi1pdCBpbiB0aGUgcmVzdWx0IHZhcmlhYmxlLiBMYXN0bHksIHlvdSBtYWtlIHN1cmUgaXQgaXNuJ3QgbnVsbCBhbmQNCi10aGF0IGl0IHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYnkgdGhlIHByZXZpb3VzIGNhbGwgdG8NCi1zZXRXZWF0aGVyLiBOb3cgZGlzcGxheSB0aGUgZGF0YSB0byB2ZXJpZnkgaXQuIChzZWUgQ29kZSBMaXN0aW5nDQotNikuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA2OiBEaXNwbGF5aW5nIHRoZSBkYXRhPC9iPjwvcD4NCi08cHJlPg0KLS4uLg0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIERpc3BsYXlpbmcgdGhlIHJlc3VsdA0KLSAgICAgICAgPGI+U3lzdGVtLm91dC5wcmludGxuKCJUZW1wZXJhdHVyZSAgICAgICAgICAgICAgIDogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlbXBlcmF0dXJlKCkpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3JlY2FzdCAgICAgICAgICAgICAgICAgIDogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldEZvcmVjYXN0KCkpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSYWluICAgICAgICAgICAgICAgICAgICAgIDogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJhaW4oKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhvdyBtdWNoIHJhaW4gKGluIGluY2hlcykgOiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0SG93TXVjaFJhaW4oKSk7DQotICAgICAgICANCi0gICAgfTwvYj4NCi19DQotPC9wcmU+DQotPHA+WW91IHNob3VsZCByZWNlaXZlIHRoZSBkYXRhIHNob3duIGluIENvZGUgTGlzdGluZyA3LjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgNzogT3V0cHV0IGZyb20gcnVubmluZyB0aGUgY2xpZW50PC9iPjwvcD4NCi08cHJlPg0KLXJwYy5jbGllbnQucnVuOg0KLSAgICAgW2phdmFdIFRlbXBlcmF0dXJlICAgICAgICAgICAgICAgOiAzOS4zDQotICAgICBbamF2YV0gRm9yZWNhc3QgICAgICAgICAgICAgICAgICA6IENsb3VkeSB3aXRoIHNob3dlcnMNCi0gICAgIFtqYXZhXSBSYWluICAgICAgICAgICAgICAgICAgICAgIDogdHJ1ZQ0KLSAgICAgW2phdmFdIEhvdyBtdWNoIHJhaW4gKGluIGluY2hlcykgOiA0LjUNCi08L3ByZT4NCi08cD5FeGNlbGxlbnQhIFlvdSBoYXZlIGEgd29ya2luZyBQT0pPIFdlYiBzZXJ2aWNlISBOZXh0IHlvdSdsbA0KLXF1aWNrbHkgbW9ycGggdGhpcyBvbmUgaW50byBhIFNwcmluZyBiYXNlZCBQT0pPLjwvcD4NCi08YSBuYW1lPSJsaW1pdGF0aW9uc3Bvam8iIGlkPSJsaW1pdGF0aW9uc3Bvam8iPjwvYT4NCi08aDM+TGltaXRhdGlvbnMgYW5kIFN0cmVuZ3RocyBvZiBQT0pPPC9oMz4NCi08cD5XZSd2ZSBjb3ZlcmVkIHRoZSBzdHJlbmd0aHMgb2YgdXNpbmcgUE9KTyBiYXNlZCBXZWIgc2VydmljZXMsDQotYnV0IHdoYXQgYWJvdXQgYW55IGxpbWl0YXRpb25zPyBPbmUgbWFpbiBsaW1pdGF0aW9uIG9mIFBPSk8gYmFzZWQNCi1XZWIgc2VydmljZXMgaXMgdGhlIGxhY2sgb2YgaW5pdGlhbGl6YXRpb24gc3VwcG9ydCAobWVhbmluZyB0aGF0DQoteW91IGhhdmUgdG8gZ28gaW50byB5b3VyIFdlYiBzZXJ2aWNlIGFuZCBpbml0aWFsaXplIHRoZSB2YWx1ZXMNCi1iZWZvcmUgdGhlIFdlYiBzZXJ2aWNlIGlzIGNvbXBsZXRlbHkgdXNlZnVsKS4gSG93ZXZlciwgeW91J2xsIHNvb24NCi1zZWUgaG93IHRvIG92ZXJjb21lIHRoYXQgbGltaXRhdGlvbiB3aXRoIGEgU3ByaW5nIGJhc2VkIFBPSk8sIHdoaWNoDQotaXMgY292ZXJlZCBuZXh0LjwvcD4NCi08YSBuYW1lPSJzcHJpbmdwb2pvd3MiIGlkPSJzcHJpbmdwb2pvd3MiPjwvYT4NCi08aDI+U3ByaW5nLWJhc2VkIFBPSk8gV2ViIFNlcnZpY2U8L2gyPg0KLTxwPlNwcmluZyBpcyBhIGhvdCBmcmFtZXdvcmsgZm9yIEoyRUUgYW5kIG1ha2VzIGJlYW4gdXNhZ2UgYQ0KLWJyZWV6ZS4gWW91J2xsIHVzZSBpdCBpbiB0aGlzIHNlY3Rpb24gdG8gY3JlYXRlIGEgU3ByaW5nIGJhc2VkIFBPSk8NCi1XZWIgc2VydmljZS4gRm9yIHRoaXMgc2VjdGlvbiwgeW91J2xsIG5lZWQgdGhlIHNwcmluZy5qYXIgZnJvbSB0aGUNCi1sYXRlc3QgMS54IFNwcmluZyBkb3dubG9hZC48L3A+DQotPGEgbmFtZT0icXVpY2tpbnRybyIgaWQ9InF1aWNraW50cm8iPjwvYT4NCi08aDM+UXVpY2sgSW50cm9kdWN0aW9uPC9oMz4NCi08cD5JZiB5b3UgdGFrZSBhIGxvb2sgYXQgdGhlIHNvdXJjZSBjb2RlIG9mIHRoaXMgZG9jdW1lbnQgaW4NCi1BeGlzMl9IT01FL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nICh0byBzZWUgaG93IHRoZSBTcHJpbmcgYmFzZWQNCi1QT0pPIFdlYiBzZXJ2aWNlIGlzIGNvZGVkKSwgeW91IGNhbiBzZWUgdGhhdCB0aGUgV2VhdGhlciBjbGFzcw0KLWRpZG4ndCBjaGFuZ2UgYXQgYWxsIGFuZCB0aGUgV2VhdGhlclNlcnZpY2UgY2xhc3Mgb25seSBnb3QgaXRzIG5hbWUNCi1jaGFuZ2VkIHRvIFdlYXRoZXJTcHJpbmdTZXJ2aWNlLjwvcD4NCi08cD5Zb3UnbGwgYWxzbyBub3RpY2UgYW4gYXBwbGljYXRpb25Db250ZXh0LnhtbCBmaWxlLCB3aGljaCB3ZSdsbA0KLWNvdmVyIGxhdGVyLiBJdCBpcyB1c2VkIHRvIHNldHVwIHRoZSBiZWFucyB1c2VkIGluIG91ciBXZWINCi1zZXJ2aWNlLjwvcD4NCi08cD5Ob3cgeW91IG1pZ2h0IHdvbmRlciB3aGF0IHRoZSBTcHJpbmdJbml0LmphdmEgY2xhc3MgaXMgZm9yLiBUaGlzDQotc2VydmljZSBpcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgU3ByaW5nIEZyYW1ld29yaydzDQotYXBwbGljYXRpb24gY29udGV4dC48L3A+DQotPHA+VGhlIGNsaWVudCBpcyBwcmV0dHkgbXVjaCB0aGUgc2FtZSwgZXhjZXB0IHlvdSB3b24ndCB1c2UgaXQgdG8NCi1pbml0aWFsaXplIHRoZSBXZWF0aGVyIGRhdGEgaW4gdGhlIFdlYiBzZXJ2aWNlLCBzaW5jZSBTcHJpbmcgZG9lcw0KLXRoYXQgZm9yIHlvdSB1c2luZyBJbnZlcnNpb24gb2YgQ29udHJvbCAoSW9DKSwgd2hpY2ggaXMgY292ZXJlZA0KLW5leHQuPC9wPg0KLTxhIG5hbWU9InNlcnZpY2VkZWYiIGlkPSJzZXJ2aWNlZGVmIj48L2E+DQotPGgzPlRoZSBTZXJ2aWNlIERlZmluaXRpb246IHNlcnZpY2VzLnhtbDwvaDM+DQotPHA+U2luY2UgdGhlIGNvcmUgUE9KT3MgZGlkbid0IGNoYW5nZSwgeW91IG1vdmUgc3RyYWlnaHQgdG8gdGhlDQotc2VydmljZXMueG1sIGZpbGUuIEl0J3MgYSBiaXQgbG9uZ2VyIHRoaXMgdGltZSBiZWNhdXNlIGl0DQotaW5zdGFudGlhdGVzIHR3byBzZXJ2aWNlcyBpbiBvbmUgZmlsZSAoc2VlIENvZGUgTGlzdGluZyA3KS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDc6IERlZmluaW5nIHRoZSBzZXJ2aWNlczogc2VydmljZXMueG1sPC9iPjwvcD4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlR3JvdXAmZ3Q7DQotICAmbHQ7c2VydmljZSA8Yj5uYW1lPSJTcHJpbmdJbml0IiANCi1jbGFzcz0ic2FtcGxlLnNwcmluZy5zZXJ2aWNlLlNwcmluZ0luaXQ8L2I+IiZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAgIFRoaXMgd2ViIHNlcnZpY2UgaW5pdGlhbGl6ZXMgU3ByaW5nLg0KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICA8Yj4mbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyImZ3Q7DQotICAgICAgICBzYW1wbGUuc3ByaW5nLnNlcnZpY2UuU3ByaW5nSW5pdA0KLSAgICAmbHQ7L3BhcmFtZXRlciZndDsNCi0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlVENDTCImZ3Q7Y29tcG9zaXRlJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0ibG9hZC1vbi1zdGFydHVwIiZndDt0cnVlJmx0Oy9wYXJhbWV0ZXImZ3Q7PC9iPg0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9InNwcmluZ0luaXQiJmd0Ow0KLSAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAgJmx0Oy9zZXJ2aWNlJmd0Ow0KLSAgJmx0O3NlcnZpY2UgPGI+bmFtZT0iV2VhdGhlclNwcmluZ1NlcnZpY2U8L2I+IiZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAgIFdlYXRoZXIgU3ByaW5nIFBPSk8gQXhpczIgQUFSIGRlcGxveW1lbnQNCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsNCi0gICAgPGI+Jmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiJmd0Ow0KLSAgICAgICAgc2FtcGxlLnNwcmluZy5zZXJ2aWNlLldlYXRoZXJTcHJpbmdTZXJ2aWNlDQotICAgICZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VPYmplY3RTdXBwbGllciImZ3Q7DQotb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXINCi0gICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU3ByaW5nQmVhbk5hbWUiJmd0Ow0KLSAgICAgICAgd2VhdGhlclNwcmluZ1NlcnZpY2UNCi0gICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7PC9iPg0KLSAgICAmbHQ7bWVzc2FnZVJlY2VpdmVycyZndDsNCi0gICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAmbHQ7L21lc3NhZ2VSZWNlaXZlcnMmZ3Q7DQotICAmbHQ7L3NlcnZpY2UmZ3Q7DQotJmx0Oy9zZXJ2aWNlR3JvdXAmZ3Q7DQotPC9wcmU+DQotPHA+WW91J2xsIHNlZSBhIGZldyBmYW1pbGlhciBpdGVtcyBpbiB0aGUgYWJvdmUgbGlzdGluZywgYW5kDQotc2V2ZXJhbCBjaGFuZ2VzLiBPbmNlIGFnYWluLCB0aGUgaXRlbXMgaW4gYm9sZCBhcmUgbW9zdCBpbXBvcnRhbnQuDQotVGhlIFNlcnZpY2VUQ0NMIHByb3BlcnR5IHVuZGVyIHRoZSBTcHJpbmdJbml0IHNlcnZpY2UgbWFrZXMgc3VyZQ0KLXRoYXQgdGhlIFNwcmluZyBjbGFzcyBsb2FkZXIgaXMgdXNlZCBmb3IgdGhlIFdlYiBzZXJ2aWNlLCBhbGxvd2luZw0KLWl0IHRvIHByb3Blcmx5IGluc3RhbnRpYXRlIHRoZSBTcHJpbmcgYXBwbGljYXRpb24gY29udGV4dC4gVGhlDQotbG9hZC1vbi1zdGFydHVwIHZhcmlhYmxlIGlzIGEgbXVzdC1oYXZlIHNvIHRoYXQgdGhlIHNlcnZpY2UgbG9hZHMNCi11cCBpbW1lZGlhdGVseSBvbiBzdGFydHVwLCBjcmVhdGluZyB0aGUgU3ByaW5nIGFwcGxpY2F0aW9uIGNvbnRleHQuDQotVGhlIFdlYXRoZXJTcHJpbmdTZXJ2aWNlIHN0YXlzIHNpbWlsYXIgdG8gdGhlIFdlYXRoZXJTZXJ2aWNlDQotcHJldmlvdXNseSB3aXRoIGEgY291cGxlIG9mIGFkZGl0aW9uczogVGhlIFNlcnZpY2VPYmplY3RTdXBwbGllcg0KLXByb3ZpZGVzIHRoZSBzZXJ2aWNlIHdpdGggdGhlIFNwcmluZyBhcHBsaWNhdGlvbiBjb250ZXh0LCBtYWtpbmcgaXQNCi0iU3ByaW5nIEF3YXJlLiI8L3A+DQotPHA+TGFzdGx5LCB0aGUgU3ByaW5nQmVhbk5hbWUgcG9pbnRzIHRvIHRoZSBuYW1lIG9mIHRoZSBiZWFuDQotYXNzb2NpYXRlZCB3aXRoIHRoaXMgV2ViIHNlcnZpY2UsIHdoaWNoIGlzIGRlZmluZWQgaW4gdGhlDQotYXBwbGljYXRpb25Db250ZXh0LnhtbCBmaWxlIChlc3NlbnRpYWxseSB0aGUgV2VhdGhlclNwcmluZ1NlcnZpY2UpLg0KLVdlJ2xsIGNvdmVyIHRoZSBhcHBsaWNhdGlvbkNvbnRleHQueG1sIGZpbGUgbmV4dC4gVGhlIGFwcGxpY2F0aW9uDQotY29udGV4dCwgYXBwbGljYXRpb25Db250ZXh0LnhtbCBmaWxlIHRlbGxzIHRoZSBTcHJpbmcgRnJhbWV3b3JrDQotd2hhdCBiZWFucyBhcmUgZGVmaW5lZC4gRm9yIHRoaXMgZXhhbXBsZSwgeW91J2xsIGRlZmluZSB0aHJlZSBvZg0KLXRoZW0gKHNlZSBDb2RlIExpc3RpbmcgOCkuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA4OiBEZWZpbmluZyB0aGUgYXBwbGljYXRpb24gY29udGV4dDoNCi1hcHBsaWNhdGlvbkNvbnRleHQueG1sPC9iPjwvcD4NCi08cHJlPg0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7DQotJmx0OyFET0NUWVBFIGJlYW5zIFBVQkxJQyAiLS8vU1BSSU5HLy9EVEQgQkVBTi8vRU4iIA0KLSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvZHRkL3NwcmluZy1iZWFucy5kdGQiJmd0Ow0KLQ0KLSZsdDtiZWFucyZndDsNCi0gICZsdDtiZWFuIGlkPSI8Yj5hcHBsaWNhdGlvbkNvbnRleHQ8L2I+IiBjbGFzcz0NCi0ib3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuQXBwbGljYXRpb25Db250ZXh0SG9sZGVyIiAvJmd0Ow0KLQ0KLSAgPGI+Jmx0O2JlYW4gaWQ9IndlYXRoZXJTcHJpbmdTZXJ2aWNlIiANCi0gICAgICAgIGNsYXNzPSJzYW1wbGUuc3ByaW5nLnNlcnZpY2UuV2VhdGhlclNwcmluZ1NlcnZpY2UiJmd0Ow0KLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0id2VhdGhlciIgcmVmPSJ3ZWF0aGVyQmVhbiIvJmd0Ow0KLSAgJmx0Oy9iZWFuJmd0Ow0KLQ0KLSAgJmx0O2JlYW4gaWQ9IndlYXRoZXJCZWFuIiBjbGFzcz0ic2FtcGxlLnNwcmluZy5iZWFuLldlYXRoZXIiJmd0Ow0KLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0idGVtcGVyYXR1cmUiIHZhbHVlPSI4OS45Ii8mZ3Q7DQotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJmb3JlY2FzdCIgdmFsdWU9IlN1bm55Ii8mZ3Q7DQotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJyYWluIiB2YWx1ZT0iZmFsc2UiLyZndDsNCi0gICAgJmx0O3Byb3BlcnR5IG5hbWU9Imhvd011Y2hSYWluIiB2YWx1ZT0iMC4yIi8mZ3Q7DQotICAmbHQ7L2JlYW4mZ3Q7PC9iPg0KLSZsdDsvYmVhbnMmZ3Q7DQotPC9wcmU+DQotPHA+VGhlIGZpcnN0IG9uZSBpcyBBeGlzMidzIGhvb2sgaW50byBTcHJpbmcncyBhcHBsaWNhdGlvbiBjb250ZXh0DQotKG5lZWRlZCBzaW5jZSBBQVIgZGVwbG95bWVudCBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSByZWd1bGFyIFdBUg0KLWRlcGxveW1lbnQpLiBOZXh0LCB5b3UgZGVmaW5lIHRoZSBiZWFuIHRvIHdoaWNoIHRoZSBzZXJ2aWNlcy54bWwNCi1maWxlIHBvaW50cywgd2hpY2ggaXMgdGhlIHdlYXRoZXJTcHJpbmdTZXJ2aWNlIGJlYW4gdGhhdCBwb2ludHMgdG8NCi10aGUgV2VhdGhlclNwcmluZ1NlcnZpY2UgY2xhc3MuIEl0IGhhcyBvbmUgZmllbGQgcHJvcGVydHkgdGhhdCBnZXRzDQotaW5pdGlhbGl6ZWQgYnkgdGhlIFNwcmluZyBGcmFtZXdvcmsgLSB3ZWF0aGVyLiBUaGlzIHdpbGwgYmUgc2V0IHRvDQotdGhlIHdlYXRoZXJCZWFuLiBUaGUgd2VhdGhlckJlYW4gaXMgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgV2VhdGhlcg0KLWNsYXNzIHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gb24gdGhlIHdlYXRoZXIuIFNwcmluZyB3aWxsIGluaXRpYWxpemUNCi1pdCB0byB0aGUgdmFsdWVzIHNob3duIGFib3ZlLCBhbmQgc2V0IHRoZSBXZWF0aGVyIG9iamVjdCBpbiB0aGUNCi1XZWF0aGVyU3ByaW5nU2VydmljZSBjbGFzcyB0byB0aGUgd2VhdGhlckJlYW4gaW5zdGFudGlhdGlvbi4gVGh1cywNCi13aGVuIHlvdSBkZXBsb3kgdGhlIFdlYiBzZXJ2aWNlLCB5b3Ugd29uJ3QgaGF2ZSB0byBpbnN0YW50aWF0ZSB0aGUNCi12YWx1ZXMgYmVjYXVzZSB0aGV5J2xsIGFscmVhZHkgYmUgc2V0LjwvcD4NCi08cD5OZXh0IHVwIGlzIHRoZSBTcHJpbmdJbml0IGNsYXNzLjwvcD4NCi08YSBuYW1lPSJpbml0aWFsaXppbmdzcHJpbmciIGlkPSJpbml0aWFsaXppbmdzcHJpbmciPjwvYT4NCi08aDM+SW5pdGlhbGl6aW5nIHRoZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDogU3ByaW5nSW5pdDwvaDM+DQotPHA+V2l0aG91dCB0aGUgU3ByaW5nIGFwcGxpY2F0aW9uIGNvbnRleHQgYmVpbmcgaW5pdGlhbGl6ZWQNCi1xdWlja2x5LCB5b3UnbGwgcnVuIGludG8gcHJvYmxlbXMuIFRoZSBTcHJpbmdJbml0IGNsYXNzIGluaXRpYWxpemVzDQotdGhlIFNwcmluZyBhcHBsaWNhdGlvbiBjb250ZXh0IG9uIHN0YXJ0dXAgYmVjYXVzZSBpdCBpcyBhDQotU2VydmljZUxpZmVDeWNsZSBjbGFzcyB3aG9zZSBzdGFydFVwIG1ldGhvZCBnZXRzIGNhbGxlZCB1cG9uDQotbG9hZGluZyB0aGUgY2xhc3MgKGFuZCBiZWNhdXNlIGl0cyBsb2FkLW9uLXN0YXJ0dXAgcHJvcGVydHkgaXMgc2V0DQotaW4gdGhlIHNlcnZpY2VzLnhtbCBmaWxlKS4gVGhlIG9ubHkgY29kZSB3b3J0aCBtZW50aW9uaW5nIGluIHRoaXMNCi1jbGFzcyBpcyBzaG93biBpbiBDb2RlIExpc3RpbmcgOS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDk6IFNwcmluZ0luaXQncyBzdGFydFVwIG1ldGhvZDwvYj48L3A+DQotPHByZT4NCi0gICAgcHVibGljIHZvaWQgc3RhcnRVcChDb25maWd1cmF0aW9uQ29udGV4dCBpZ25vcmUsDQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgew0KLSAgICAgICAgPGI+Q2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBzZXJ2aWNlLmdldENsYXNzTG9hZGVyKCk7DQotICAgICAgICBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ3R4ID0gbmV3DQotICAgICAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0PC9iPihuZXcgU3RyaW5nW10NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyI8Yj5hcHBsaWNhdGlvbkNvbnRleHQueG1sPC9iPiJ9LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOw0KLSAgICAgICAgPGI+YXBwQ3R4LnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsNCi0gICAgICAgIGFwcEN0eC5yZWZyZXNoKCk7PC9iPg0KLSAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJcblxuc3RhcnRVcCgpIHNldCBzcHJpbmcgY2xhc3Nsb2FkZXIgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWEgYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSAuLi4gIik7DQotICAgICAgICB9DQotICAgIH0NCi08L3ByZT4NCi08cD5Ob3RlIHRoYXQgdGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBTcHJpbmcgY2xhc3MgbG9hZGVyLCBhbmQNCi1jcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbkNvbnRleHQueG1sIGFzIHRoZQ0KLXBhcmFtZXRlcnMuIFRoaXMgbmV3IGFwcGxpY2F0aW9uIGNvbnRleHQgdGhlbiBnZXRzIHRoZSBTcHJpbmcgY2xhc3MNCi1sb2FkZXIgYXMgaXRzIGNsYXNzIGxvYWRlci4gVGhlIFNwcmluZyBGcmFtZXdvcmsgaXMgbm93IHVwIGFuZA0KLXJlYWR5IGZvciBvdXIgV2VhdGhlclNwcmluZ1NlcnZpY2UuPC9wPg0KLTxoMz5CdWlsZCBhbmQgRGVwbG95IFVzaW5nIEFwYWNoZSBBeGlzMiBhbmQgVG9tY2F0PC9oMz4NCi08cD5Zb3VyIFBPSk8gaXMgbm93IHJlYWR5IGZvciBwcmltZXRpbWUgd2l0aGluIHRoZSBTcHJpbmcNCi1GcmFtZXdvcmsuIEJlZm9yZSB5b3UgYnVpbGQsIHlvdSdsbCBmaXJzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUNCi1heGlzMi1zcHJpbmctQGF4aXMyX3ZlcnNpb25ALmphciBhbmQgc3ByaW5nLmphciBmaWxlcyBhcmUgaW4gdGhlDQotcHJvamVjdCdzIDxlbT5BeGlzMl9IT01FL2xpYjwvZW0+IGRpcmVjdG9yeS48L3A+DQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgc2VydmljZSB3aWxsIG5vdCBkZXBsb3kgaWYgeW91IGFkZA0KLXRoZSBhYm92ZSAuamFyIGZpbGVzIHRvIHRoZSBzZXJ2aWNlIGFyY2hpdmUgZHVlIHRvIGNsYXNzIGxvZGluZw0KLWlzc3Vlcy48L3A+DQotPHA+Tm93IGJ1aWxkIHRoZSBzb3VyY2UgYW5kIGNyZWF0ZSBhbiBBQVIgZmlsZSBieSB0eXBpbmc6IGFudDwvcD4NCi08cD5JdCdsbCBiZSBjcmVhdGVkIGF0IDxlbT50YXJnZXQvV2VhdGhlclNwcmluZ1NlcnZpY2UuYWFyPC9lbT4uDQotQ29weSBpdCB0bw0KLTxlbT4mbHQ7dG9tY2F0LWhvbWUmZ3Q7L3dlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlczwvZW0+LCBhbmQNCi1BeGlzMiBzaG91bGQgZGVwbG95IGl0IHF1aWNrbHkuPC9wPg0KLTxwPk5leHQsIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHRvIHNlZSB3aGV0aGVyIFNwcmluZyB3aWxsIHJlYWxseQ0KLWluaXRpYWxpemUgdGhlIHdlYXRoZXIgZGF0YSBmb3IgeW91LjwvcD4NCi08YSBuYW1lPSJ0ZXN0aW5ncnBjIiBpZD0idGVzdGluZ3JwYyI+PC9hPg0KLTxoMz5UZXN0aW5nIFVzaW5nIGFuIFJQQ1NlcnZpY2VDbGllbnQ8L2gzPg0KLTxwPkl0J3MgYXMgc2ltcGxlIGFzIGl0IHdhcyBmb3IgdGhlIG90aGVyIFdlYiBzZXJ2aWNlLCBleGNlcHQgdGhpcw0KLXRpbWUgdHlwZTogYW50IHJwYy5jbGllbnQ8L3A+DQotPHA+RmVlbCBmcmVlIHRvIGJyb3dzZSB0aGUgY29kZSBmb3IgdGhpcyBjbGllbnQgaW4NCi1zcmMvY2xpZW50L1dlYXRoZXJTcHJpbmdSUENDbGllbnQuamF2YS4gRXNzZW50aWFsbHksIHRoaXMgY2xpZW50DQotZG9lcyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgY2xpZW50IHRlc3RpbmcgdGhlIFdlYXRoZXJTZXJ2aWNlLg0KLUV4Y2VwdCB0aGF0IHRoaXMgb25lIHNraXBzIHRoZSAiU2V0dGluZyB0aGUgd2VhdGhlciIgdGFzayBzaW5jZSB0aGUNCi13ZWF0aGVyIGRhdGEgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHNldCBieSB0aGUgU3ByaW5nIGZyYW1ld29yaw0KLWF0IHN0YXJ0dXAuPC9wPg0KLTxwPlRodXMsIHlvdSBzaG91bGQgZ2V0IHRoZSBmb2xsb3dpbmcgYXMgb3V0cHV0IGZyb20gdGhlDQotY2xpZW50OjwvcD4NCi08cHJlPg0KLXJ1bi5jbGllbnQ6DQotICAgIFtqYXZhY10gQ29tcGlsaW5nIDEgc291cmNlIGZpbGUgdG8gQzpcYXhpczItQGF4aXMyX3ZlcnNpb25AXHNhbXBsZXNccG9qb2d1aWRlc3ByaW5nXGJ1aWxkXGNsDQotYXNzZXMNCi0gICAgIDxiPltqYXZhXSBUZW1wZXJhdHVyZSAgICAgICAgICAgICAgIDogODkuOQ0KLSAgICAgW2phdmFdIEZvcmVjYXN0ICAgICAgICAgICAgICAgICAgOiBTdW5ueQ0KLSAgICAgW2phdmFdIFJhaW4gICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZQ0KLSAgICAgW2phdmFdIEhvdyBtdWNoIHJhaW4gKGluIGluY2hlcykgOiAwLjI8L2I+DQotPC9wcmU+DQotPHA+V2hpY2ggYXJlIGV4YWN0bHkgdGhlIHZhbHVlcyB5b3Ugc2V0IGluIHRoZQ0KLWFwcGxpY2F0aW9uQ29udGV4dC54bWwgZmlsZSE8L3A+DQotDQotPGEgbmFtZT0ianNyMTgxcG9qb3dzIiBpZD0ianNyMTgxcG9qb3dzIj48L2E+DQotPGgyPlNSIDE4MSBBbm5vdGF0aW9uIHN1cHBvcnQgd2l0aCBQT0pPIFdlYiBzZXJ2aWNlczwvaDI+DQotPHA+R290IHRoZSBKU1IgMTgxIGFubm90YXRlZCBQT0pPcz8gR3JlYXQuIFRoaXMgc2VjdGlvbiB3aWxsIHNob3cgeW91IGhvdyB0byBwYWNrYWdlDQotdGhlbSBpbiB0byBhIGphciBmb3JtYXQgZm9yIGVhc3kgcG9qbyBkZXBsb3ltZW50IHdpdGggdGhlIGhlbHAgb2YgQXhpczIgUE9KTyBkZXBsb3llci4NCi1GaXJzdCBjcmVhdGUgdGhlIEpTUiAxODEgQW5ub3RhdGVkIGNsYXNzLjwvcD4NCi08YSBuYW1lPSJqc3IxODFkZWZpbmluZ3NlcnZpY2UiIGlkPSJqc3IxODFkZWZpbmluZ3NlcnZpY2UiPjwvYT4NCi08aDM+U2FtcGxlIEpTUiAxODEgUE9KTyBXZWIgU2VydmljZTwvaDM+DQotPHA+Rm9yIGV4YW1wbGUgbGV0cyBhc3N1bWUgdGhhdCBvdXIgSlNSIDE4MSBBbm5vdGF0ZWQgY2xhc3MgaXMuDQotPC9wPg0KLTxwcmU+DQotQFdlYlNlcnZpY2UobmFtZT0iSlNSMTgxVGVzdFNlcnZpY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy50ZXN0Lm9yZy9qc3IxODEvRXhhbXBsZSIpDQotQFNPQVBCaW5kaW5nKHN0eWxlPVNPQVBCaW5kaW5nLlN0eWxlLlJQQykNCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2Ugew0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNob01ldGhvZCIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhAV2ViUGFyYW0obmFtZT0ic3RyaW5nSW4iKVN0cmluZyBzKXsNCi0gICAgICAgIHJldHVybiBzOw0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLSAgICA8cD5Db21waWxlIHRoaXMgd2l0aCB0aGUgaGVscCBvZiB0aGUgQXhpczIgbGlicyBpbiB0byBhIGphciBmaWxlLg0KLSAgICAgICAgQWRkIG9uZSBhZGRpdGlvbmFsIGxpa2UgdG8gdGhlIGF4aXMyLnhtbCB0byBkZXBsb3kgamFyIGZpbGVzIG9uIHRoZSBwb2pvIGRpcmVjdG9yeQ0KLSAgICA8L3A+DQotICAgIDxwcmU+DQotICAgICAgICBFeDogJmx0O2RlcGxveWVyIGV4dGVuc2lvbj0iLmphciIgZGlyZWN0b3J5PSJwb2pvIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlBPSk9EZXBsb3llciIvJmd0Ow0KLSAgICA8L3ByZT4NCi08cD5DcmVhdGUgYSBwb2pvIGRpcmVjdG9yeSBpZiBpdHMgbm90IGFscmVhZHkgdGhlcmUgdW5kZXIgdGhlIEF4aXMyIHJlcG9zaXRvcnkgYW5kIHB1dCB0aGUgSlNSIDE4MSBBbm5vdGF0ZWQNCi1qYXIgaW5zaWRlIHRoYXQgYW5kIHN0YXJ0IEF4aXMyLiBZb3Ugd2lsbCBzZWUgdGhlIHNlcnZpY2UgdXAgYW5kIHJ1bm5pbmcgISE8L3A+DQotDQotPGEgbmFtZT0ic3VtbWFyeSIgaWQ9InN1bW1hcnkiPjwvYT4NCi08aDI+U3VtbWFyeTwvaDI+DQotPHA+QXBhY2hlIEF4aXMyIGlzIGFuIGV4Y2VsbGVudCB3YXkgdG8gZXhwb3NlIHlvdXIgUE9KT3MgYXMgV2ViDQotc2VydmljZXMuIFNwcmluZyBhZGRzIGdyZWF0ZXIgZmxleGliaWxpdHkgdG8geW91ciBQT0pPcyBieSBhZGRpbmcNCi1iZWFucyBzdXBwb3J0IGFuZCBpbml0aWFsaXphdGlvbiBhYmlsaXRpZXMsIGFsb25nIHdpdGggYWxsIHRoZQ0KLW90aGVyIGdvb2RpZXMgcHJvdmlkZWQgYnkgdGhlIFNwcmluZyBmcmFtZXdvcmsuPC9wPg0KLTxhIG5hbWU9ImZ1cnRoZXJzdHVkeSIgaWQ9ImZ1cnRoZXJzdHVkeSI+PC9hPg0KLTxoMj5Gb3IgRnVydGhlciBTdHVkeTwvaDI+DQotPHA+QXBhY2hlIEF4aXMyLTxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvPC9hPjwvcD4NCi08cD5BeGlzMiBBcmNoaXRlY3R1cmUtPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8wL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8wL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbDwvYT48L3A+DQotPHA+SW50cm9kdWN0aW9uIHRvIEFwYWNoZSBBeGlzMi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LnJlZGhhdC5jb20vbWFnYXppbmUvMDIxanVsMDYvZmVhdHVyZXMvYXBhY2hlX2F4aXMyLyI+aHR0cDovL3d3dy5yZWRoYXQuY29tL21hZ2F6aW5lLzAyMWp1bDA2L2ZlYXR1cmVzL2FwYWNoZV9heGlzMi88L2E+PC9wPg0KLTxwPldvcmtpbmcgV2l0aCBBcGFjaGUgQXhpczItPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53c28yLm5ldC9hcnRpY2xlcy9heGlzMi9qYXZhLzIwMDYvMDkvMTMvd29ya2luZy13aXRoLWF4aXMyIj5odHRwOi8vd3d3LndzbzIubmV0L2FydGljbGVzL2F4aXMyL2phdmEvMjAwNi8wOS8xMy93b3JraW5nLXdpdGgtYXhpczI8L2E+PC9wPg0KLTxwPkFwYWNoZSBUb21jYXQtPGEgaHJlZj0NCi0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLyI+aHR0cDovL3RvbWNhdC5hcGFjaGUub3JnPC9hPjwvcD4NCi08cD5TcHJpbmcgRnJhbWV3b3JrLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy8iPmh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy88L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3F1aWNrc3RhcnRndWlkZS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcXVpY2tzdGFydGd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyMjhkZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcXVpY2tzdGFydGd1aWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0iYXBwbGljYXRpb24veGh0bWwreG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPg0KLTx0aXRsZT5BeGlzMiBRdWljayBTdGFydCBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGgxPkF4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlPC9oMT4NCi08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGd1aWRlIGlzIHRvIGdldCB5b3Ugc3RhcnRlZCBvbiBjcmVhdGluZw0KLXNlcnZpY2VzIGFuZCBjbGllbnRzIHVzaW5nIEF4aXMyIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIFdlJ2xsIHRha2UNCi1hIHNpbXBsZSBTdG9ja1F1b3RlIFNlcnZpY2UgYW5kIHNob3cgeW91IHNvbWUgb2YgdGhlIGRpZmZlcmVudCB3YXlzDQotaW4gd2hpY2ggeW91IGNhbiBjcmVhdGUgYW5kIGRlcGxveSBpdCwgYXMgd2VsbCBhcyB0YWtlIGEgcXVpY2sgbG9vaw0KLWF0IG9uZSBvciB0d28gdXRpbGl0aWVzIHRoYXQgY29tZSB3aXRoIEF4aXMyLiBXZSdsbCB0aGVuIGxvb2sgYXQNCi1jcmVhdGluZyBjbGllbnRzIHRvIGFjY2VzcyB0aG9zZSBzZXJ2aWNlcy48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNyZWFkeSI+R2V0dGluZyBSZWFkeTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc2VydmljZXMiPkF4aXMyIHNlcnZpY2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNjcmVhdGUiPkNyZWF0aW5nIHNlcnZpY2VzPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2RlcGxveSI+RGVwbG95aW5nIFBPSk9zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNheGlvbSI+QnVpbGRpbmcgdGhlIHNlcnZpY2UgdXNpbmcgQVhJT008L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2FkYiI+R2VuZXJhdGluZyB0aGUgc2VydmljZSB1c2luZyBBREI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3htbGJlYW5zIj5HZW5lcmF0aW5nIHRoZSBzZXJ2aWNlIHVzaW5nDQotWE1MQmVhbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2ppYngiPkdlbmVyYXRpbmcgdGhlIHNlcnZpY2UgdXNpbmcgSmlCWDwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2NsaWVudHMiPkdlbmVyYXRpbmcgQ2xpZW50czwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNjbGllbnRheGlvbSI+Q3JlYXRpbmcgYSBjbGllbnQgdXNpbmcgQVhJT008L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2NsaWVudGFkYiI+R2VuZXJhdGluZyBhIGNsaWVudCB1c2luZyBBREI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2NsaWVudHhtbGJlYW5zIj5HZW5lcmF0aW5nIGEgY2xpZW50IHVzaW5nIFhNTA0KLUJlYW5zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNjbGllbnRqaWJ4Ij5HZW5lcmF0aW5nIGEgY2xpZW50IHVzaW5nIEppQlg8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9IiNzdW1tYXJ5Ij5TdW1tYXJ5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNmdXJ0aGVyc3R1ZHkiPkZvciBGdXJ0aGVyIFN0dWR5PC9hPjwvbGk+DQotPC91bD4NCi08aDM+QSBRdWljayBTZXR1cCBOb3RlOjwvaDM+DQotPHA+VGhlIGNvZGUgZm9yIHRoZSBkb2N1bWVudCBjYW4gYmUgZm91bmQgaW4gdGhlIGV4dHJhY3RlZCA8YSBocmVmPQ0KLSIuLi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmh0bWwjc3RkLWJpbiI+U3RhbmRhcmQNCi1CaW5hcnkgRGlzdHJpYnV0aW9uPC9hPiwgbW9yZSBzcGVjaWZpY2FsbHkgYXQgQXhpczJfSE9NRS9zYW1wbGVzLw0KLWluc2lkZSB0aGUgZGlyZWN0b3JpZXMtIHF1aWNrc3RhcnQsIHF1aWNrc3RhcnRhZGIsIHF1aWNrc3RhcnRheGlvbSwNCi1xdWlja3N0YXJ0amlieCBhbmQgcXVpY2tzdGFydHhtbGJlYW5zLiAoQ29uc2lkZXIgZ2V0dGluZyBpdCBub3cgYXMNCi1pdCB3aWxsIGhlbHAgeW91IHRvIGZvbGxvdyBhbG9uZy4pIEl0IGluY2x1ZGVzIEFudCBidWlsZGZpbGVzDQotKGJ1aWxkLnhtbCkgdGhhdCB3ZSdsbCByZWZlciB0byB0aHJvdWdob3V0IHRoZSBleGFtcGxlcyB0byBtYWtlDQotY29tcGlsYXRpb24gZWFzaWVyLjwvcD4NCi08YSBuYW1lPSJpbnRyb2R1Y3Rpb24iIGlkPSJpbnRyb2R1Y3Rpb24iPjwvYT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5MZXQncyBzdGFydCB3aXRoIHRoZSBzZXJ2aWNlIGl0c2VsZi4gV2UnbGwgbWFrZSBpdCBzaW1wbGUgc28geW91DQotY2FuIHNlZSB3aGF0IGlzIGdvaW5nIG9uIHdoZW4gd2UgYnVpbGQgYW5kIGRlcGxveSB0aGUgc2VydmljZXMuIEENCi1TdG9ja1F1b3RlU2VydmljZSBleGFtcGxlIHNlZW1zIHRvIGJlIG1hbmRhdG9yeSBpbiBpbnN0YW5jZXMgbGlrZQ0KLXRoaXMgb25lLCBzbyBsZXQncyB1c2UgdGhlIGZvbGxvd2luZyAoc2VlIENvZGUgTGlzdGluZyAxKS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDE6IFRoZSBTdG9ja1F1b3RlU2VydmljZSBjbGFzczwvYj48L3A+DQotPHByZT4NCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnBvam87DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZSB7DQotICAgIHByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOw0KLQ0KLSAgICBwdWJsaWMgZG91YmxlIGdldFByaWNlKFN0cmluZyBzeW1ib2wpIHsNCi0gICAgICAgIERvdWJsZSBwcmljZSA9IChEb3VibGUpIG1hcC5nZXQoc3ltYm9sKTsNCi0gICAgICAgIGlmKHByaWNlICE9IG51bGwpew0KLSAgICAgICAgICAgIHJldHVybiBwcmljZS5kb3VibGVWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIDQyLjAwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgc3ltYm9sLCBkb3VibGUgcHJpY2UpIHsNCi0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBuZXcgRG91YmxlKHByaWNlKSk7DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+SXQgd2lsbCBiZSBhIHNpbXBsZSBzZXJ2aWNlIHdpdGggdHdvIHBvc3NpYmxlIGNhbGxzLiBPbmUgb2YNCi13aGljaCBpcyBhbiBpbi9vdXQgbWVzc2FnZSwgYW5kIHRoZSBvdGhlciBpcyBhbiBpbi1vbmx5IHNlcnZpY2UuDQotVWx0aW1hdGVseSwgd2UnbGwgcGFja2FnZSB0aGUgc2VydmljZSBhbmQgZGVwbG95IGl0IGluIGZvdXINCi1kaWZmZXJlbnQgd2F5cy48L3A+DQotPHA+Rmlyc3QsIGxldCdzIGxvb2sgYXQgaG93IHRoaXMgc2ltcGxlIEphdmEgY2xhc3MgY29ycmVzcG9uZHMgdG8gYQ0KLXNlcnZpY2UuPC9wPg0KLTxhIG5hbWU9InJlYWR5IiBpZD0icmVhZHkiPjwvYT4NCi08aDI+R2V0dGluZyBSZWFkeTwvaDI+DQotPHA+QmVmb3JlIHdlIGJ1aWxkIGFueXRoaW5nIHVzaW5nIEF4aXMyLCB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBhDQotbGl0dGxlIGhvdXNla2VlcGluZy4gRmlyc3Qgb2ZmLCB5b3UnbGwgbmVlZCB0byBnZXQgeW91ciBlbnZpcm9ubWVudA0KLXJlYWR5IGZvciB3b3JraW5nIHdpdGggQXhpczIuIEZvcnR1bmF0ZWx5LCBpdCBpbnZvbHZlcyBqdXN0IGEgZmV3DQotc2ltcGxlIHN0ZXBzOjwvcD4NCi08b2w+DQotPGxpPkRvd25sb2FkIGFuZCBpbnN0YWxsIEphdmEgKE1pbmltdW0gdmVyc2lvbiBpcyBKREsxLjQpLiBTZXQgdGhlDQotSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5DQotaW50byB3aGljaCB5b3UgaW5zdGFsbGVkIHRoZSBKREsgcmVsZWFzZS48L2xpPg0KLTxsaT5Eb3dubG9hZCBBeGlzMiBhbmQgZXh0cmFjdCBpdCB0byBhIHRhcmdldCBkaXJlY3RvcnkuPC9saT4NCi08bGk+Q29weSB0aGUgYXhpczIud2FyIGZpbGUgdG8gdGhlIHdlYmFwcHMgZGlyZWN0b3J5IG9mIHlvdXINCi1zZXJ2bGV0IGVuZ2luZS48L2xpPg0KLTxsaT5TZXQgdGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIHRhcmdldA0KLWRpcmVjdG9yeSBpbiBzdGVwLiBOb3RlIHRoYXQgYWxsIG9mIHRoZSBzY3JpcHRzIGFuZCBidWlsZCBmaWxlcw0KLUF4aXMyIGdlbmVyYXRlcyBkZXBlbmQgb24gdGhpcyB2YWx1ZSwgc28gZG9uJ3Qgc2tpcCB0aGlzIHN0ZXAhDQotTGludXggdXNlcnMgY2FuIGFsdGVybmF0aXZlbHkgcnVuIHRoZSBzZXRlbnYuc2ggZmlsZSBpbiB0aGUNCi1BWElTMl9IT01FL2JpbiBkaXJlY3RvcnkgdG8gc2V0IHRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlDQotdG8gdGhlIHBhdGhuYW1lIG9mIHRoZSBleHRyYWN0ZWQgZGlyZWN0b3J5IG9mIEF4aXMyLjwvbGk+DQotPC9vbD4NCi08cD5JbiBtb3N0IGNhc2VzLCB3ZSdyZSBhbHNvIGdvaW5nIHRvIG5lZWQgYSBXU0RMIGZpbGUgZm9yIG91cg0KLXNlcnZpY2UuIEF4aXMyJ3MgSmF2YTJXU0RMIGNhbiBiZSB1c2VkIHRvIGJvb3RzdHJhcCBhIFdTREwuIFRvDQotZ2VuZXJhdGUgYSBXU0RMIGZpbGUgZnJvbSBhIEphdmEgY2xhc3MsIHBlcmZvcm0gdGhlIGZvbGxvd2luZw0KLXN0ZXBzOjwvcD4NCi08b2w+DQotPGxpPkNyZWF0ZSBhbmQgY29tcGlsZSB0aGUgSmF2YSBjbGFzcy4NCi08cHJlPg0KLShXaW5kb3dzKQ0KLSVBWElTMl9IT01FJVxiaW5camF2YTJ3c2RsIC1jcCAuIC1jbiBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5wb2pvLlN0b2NrUXVvdGVTZXJ2aWNlIC1vZiBTdG9ja1F1b3RlU2VydmljZS53c2RsDQotDQotKExpbnV4KQ0KLSRBWElTMl9IT01FL2Jpbi9qYXZhMndzZGwgLWNwIC4gLWNuIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnBvam8uU3RvY2tRdW90ZVNlcnZpY2UgLW9mIFN0b2NrUXVvdGVTZXJ2aWNlLndzZGwNCi08L3ByZT48L2xpPg0KLTxsaT5HZW5lcmF0ZSB0aGUgV1NETCB1c2luZyB0aGUgY29tbWFuZDo8L2xpPg0KLTwvb2w+DQotPHA+T25jZSB5b3UndmUgZ2VuZXJhdGVkIHRoZSBXU0RMIGZpbGUsIHlvdSBjYW4gbWFrZSB0aGUgY2hhbmdlcw0KLXlvdSBuZWVkLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGFkZCBjdXN0b20gZmF1bHRzIG9yIGNoYW5nZSB0aGUNCi1uYW1lIG9mIHRoZSBnZW5lcmF0ZWQgZWxlbWVudHMuIEZvciBleGFtcGxlLCB0aGlzDQotU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCBpcyBpbg0KLUFYSVMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORiBmb2xkZXIsIHdoaWNoDQotd2UnbGwgYmUgdXNpbmcgdGhyb3VnaG91dCB0aGUgcmVzdCBvZiB0aGlzIGd1aWRlLCByZXBsYWNlcyB0aGUNCi1nZW5lcmljIHBhcmFtZXRlcnMgY3JlYXRlZCBieSB0aGUgZ2VuZXJhdGlvbiBwcm9jZXNzLjwvcD4NCi08YSBuYW1lPSJzZXJ2aWNlcyIgaWQ9InNlcnZpY2VzIj48L2E+DQotPGgyPkF4aXMyIFNlcnZpY2VzPC9oMj4NCi08cD5CZWZvcmUgd2UgYnVpbGQgYW55dGhpbmcsIGl0J3MgaGVscGZ1bCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlDQotZmluaXNoZWQgcHJvZHVjdCBsb29rcyBsaWtlLjwvcD4NCi08cD5UaGUgc2VydmVyIHNpZGUgb2YgQXhpczIgY2FuIGJlIGRlcGxveWVkIG9uIGFueSBTZXJ2bGV0IGVuZ2luZSwNCi1hbmQgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLiBTaG93biBpbiBDb2RlIExpc3RpbmcgMi48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDI6IFRoZSBEaXJlY3RvcnkgU3RydWN0dXJlIG9mIGF4aXMyLndhcjwvYj48L3A+DQotPHByZT4NCi1heGlzMi13ZWIgDQotTUVUQS1JTkYNCi1XRUItSU5GDQotICAgIGNsYXNzZXMgDQotICAgIGNvbmYNCi0gICAgICAgIGF4aXMyLnhtbCANCi0gICAgbGliDQotICAgICAgICBhY3RpdmF0aW9uLmphcg0KLSAgICAgICAgLi4uDQotICAgICAgICB4bWxTY2hlbWEuamFyDQotICAgIG1vZHVsZXMNCi0gICAgICAgIG1vZHVsZXMubGlzdCANCi0gICAgICAgIGFkZHJlc3NpbmcubWFyDQotICAgICAgICAuLi4NCi0gICAgICAgIHNvYXBtb25pdG9yLm1hcg0KLSAgICBzZXJ2aWNlcw0KLSAgICAgICAgc2VydmljZXMubGlzdA0KLSAgICAgICAgYXNlcnZpY2UuYWFyDQotICAgICAgICAuLi4NCi0gICAgICAgIHZlcnNpb24uYWFyDQotICAgIHdlYi54bWwNCi08L3ByZT4NCi08cD5TdGFydGluZyBhdCB0aGUgdG9wLCBheGlzMi13ZWIgaXMgYSBjb2xsZWN0aW9uIG9mIEpTUHMgdGhhdCBtYWtlDQotdXAgdGhlIEF4aXMyIGFkbWluaXN0cmF0aW9uIGFwcGxpY2F0aW9uLCB0aHJvdWdoIHdoaWNoIHlvdSBjYW4NCi1wZXJmb3JtIGFueSBhY3Rpb24gc3VjaCBhcyBhZGRpbmcgc2VydmljZXMgYW5kIGVuZ2FnaW5nIGFuZA0KLWRpcy1lbmdhZ2luZyBtb2R1bGVzLiBUaGUgV0VCLUlORiBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGFjdHVhbA0KLWphdmEgY2xhc3NlcyBhbmQgb3RoZXIgc3VwcG9ydCBmaWxlcyB0byBydW4gYW55IHNlcnZpY2VzIGRlcGxveWVkDQotdG8gdGhlIHNlcnZpY2VzIGRpcmVjdG9yeS48L3A+DQotPHA+VGhlIG1haW4gZmlsZSBpbiBhbGwgdGhpcyBpcyBheGlzMi54bWwsIHdoaWNoIGNvbnRyb2xzIGhvdyB0aGUNCi1hcHBsaWNhdGlvbiBkZWFscyB3aXRoIHRoZSByZWNlaXZlZCBtZXNzYWdlcywgZGV0ZXJtaW5pbmcgd2hldGhlcg0KLUF4aXMyIG5lZWRzIHRvIGFwcGx5IGFueSBvZiB0aGUgbW9kdWxlcyBkZWZpbmVkIGluIHRoZSBtb2R1bGVzDQotZGlyZWN0b3J5LjwvcD4NCi08cD5TZXJ2aWNlcyBjYW4gYmUgZGVwbG95ZWQgYXMgKi5hYXIgZmlsZXMsIGFzIHlvdSBjYW4gc2VlIGhlcmUsDQotYnV0IHRoZWlyIGNvbnRlbnRzIG11c3QgYmUgYXJyYW5nZWQgaW4gYSBzcGVjaWZpYyB3YXkuIEZvciBleGFtcGxlLA0KLXRoZSBzdHJ1Y3R1cmUgb2YgdGhpcyBzZXJ2aWNlIHdpbGwgYmUgYXMgZm9sbG93czo8L3A+DQotPGEgbmFtZT0iYWFyc3RydWN0dXJlIiBpZD0iYWFyc3RydWN0dXJlIj48L2E+DQotPHByZT4NCi0tIFN0b2NrUXVvdGVTZXJ2aWNlDQotICAgLSBNRVRBLUlORg0KLSAgICAgLSBzZXJ2aWNlcy54bWwNCi0gICAtIGxpYg0KLSAgIC0gc2FtcGxlcw0KLSAgICAgLSBxdWlja3N0YXJ0DQotICAgICAgIC0gc2VydmljZQ0KLSAgICAgICAgIC0gcG9qbw0KLSAgICAgICAgICAgLSBTdG9ja1F1b3RlU2VydmljZS5jbGFzcw0KLTwvcHJlPg0KLTxwPkhlcmUsIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGlzIFN0b2NrUXVvdGVTZXJ2aWNlLCB3aGljaCBpcw0KLXNwZWNpZmllZCBpbiB0aGUgc2VydmljZXMueG1sIGZpbGUgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZSB0b3AtbGV2ZWwNCi1mb2xkZXIgb2YgdGhpcyBzZXJ2aWNlLiBDb21waWxlZCBKYXZhIGNsYXNzZXMgYXJlIHBsYWNlZCB1bmRlcm5lYXRoDQotdGhpcyBpbiB0aGVpciBwcm9wZXIgcGxhY2UgYmFzZWQgb24gdGhlIHBhY2thZ2UgbmFtZS4gVGhlIGxpYg0KLWRpcmVjdG9yeSBob2xkcyBhbnkgc2VydmljZS1zcGVjaWZpYyBKQVIgZmlsZXMgbmVlZGVkIGZvciB0aGUNCi1zZXJ2aWNlIHRvIHJ1biAobm9uZSBpbiB0aGlzIGNhc2UpIGJlc2lkZXMgdGhvc2UgYWxyZWFkeSBzdG9yZWQNCi13aXRoIHRoZSBBeGlzMiBXQVIgZmlsZSBhbmQgdGhlIHNlcnZsZXQgY29udGFpbmVyJ3MgY29tbW9uIEpBUg0KLWRpcmVjdG9yaWVzLiBGaW5hbGx5LCB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5IGNvbnRhaW5zIGFueQ0KLWFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlcnZpY2UgdGhhdCBBeGlzMiBuZWVkcyB0bw0KLWV4ZWN1dGUgaXQgcHJvcGVybHkuIFRoZSBzZXJ2aWNlcy54bWwgZmlsZSBkZWZpbmVzIHRoZSBzZXJ2aWNlDQotaXRzZWxmIGFuZCBsaW5rcyB0aGUgSmF2YSBjbGFzcyB0byBpdCAoU2VlIENvZGUgTGlzdGluZyAzKS48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDM6IFRoZSBTZXJ2aWNlIERlZmluaXRpb24gRmlsZTwvYj48L3A+DQotPHByZT4NCi0mbHQ7c2VydmljZSBuYW1lPSJTdG9ja1F1b3RlU2VydmljZSIgc2NvcGU9ImFwcGxpY2F0aW9uIiZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAgICAgU3RvY2sgUXVvdGUgU2FtcGxlIFNlcnZpY2UNCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsNCi0gICAgJmx0O21lc3NhZ2VSZWNlaXZlcnMmZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIA0KLSAgICAgICAgICAgIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyDQotICAgICAgICAgICAgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ig0KLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAmbHQ7L21lc3NhZ2VSZWNlaXZlcnMmZ3Q7DQotICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiZndDsNCi0gICAgICAgIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnBvam8uU3RvY2tRdW90ZVNlcnZpY2UNCi0gICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotJmx0Oy9zZXJ2aWNlJmd0Ow0KLTwvcHJlPg0KLTxwPkhlcmUgdGhlIHNlcnZpY2UgaXMgZGVmaW5lZCwgYWxvbmcgd2l0aCB0aGUgcmVsZXZhbnQNCi1tZXNzYWdlUmVjZWl2ZXIgdHlwZXMgZm9yIHRoZSBkaWZmZXJlbnQgbWVzc2FnZSBleGNoYW5nZQ0KLXBhdHRlcm5zLjwvcD4NCi08cD5UaGUgTUVUQS1JTkYgZGlyZWN0b3J5IGlzIGFsc28gdGhlIGxvY2F0aW9uIGZvciBhbnkgY3VzdG9tIFdTREwNCi1maWxlcyB5b3UgaW50ZW5kIHRvIGluY2x1ZGUgZm9yIHRoaXMgYXBwbGljYXRpb24uPC9wPg0KLTxwPllvdSBjYW4gZGVwbG95IGEgc2VydmljZSBieSBzaW1wbHkgdGFraW5nIHRoaXMgaGllcmFyY2h5IG9mDQotZmlsZXMgYW5kIGNvcHlpbmcgaXQgdG8gdGhlIHdlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcw0KLWRpcmVjdG9yeSBvZiB5b3VyIHNlcnZsZXQgZW5naW5lLiAoTm90ZSB0aGUgQXhpczIgV0FSIGZpbGUgbXVzdCBiZQ0KLWluc3RhbGxlZCBmaXJzdCBpbiB0aGUgc2VydmxldCBlbmdpbmUuKSBUaGlzIGlzIGtub3duIGFzIHRoZQ0KLSJleHBsb2RlZCIgZm9ybWF0LiBZb3UgY2FuIGFsc28gY29tcHJlc3MgeW91ciBkb2N1bWVudHMgaW50byBhbg0KLSouYWFyIGZpbGUsIHNpbWlsYXIgdG8gYSAqLmphciBmaWxlLCBhbmQgcGxhY2UgdGhlICouYWFyIGZpbGUNCi1kaXJlY3RseSBpbiB0aGUgc2VydmxldCBlbmdpbmUncyB3ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXMNCi1kaXJlY3RvcnkuPC9wPg0KLTxwPk5vdyB0aGF0IHlvdSB1bmRlcnN0YW5kIHdoYXQgd2UncmUgdHJ5aW5nIHRvIGFjY29tcGxpc2gsIHdlJ3JlDQotYWxtb3N0IHJlYWR5IHRvIHN0YXJ0IGJ1aWxkaW5nLjwvcD4NCi08cD5GaXJzdCwgPGEgaHJlZj0NCi0iLi4vZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5odG1sI3N0ZC1iaW4iPmRvd25sb2FkPC9hPg0KLWFuZCB1bnppcCB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBvZiBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb24uIE1ha2Ugc3VyZSB0aGF0IHlvdSBzZXQgdGhlIHZhbHVlIG9mIHRoZSBBWElTMl9IT01FDQotdmFyaWFibGUgdG8gbWF0Y2ggdGhlIGxvY2F0aW9uIGludG8gd2hpY2ggeW91IGV4dHJhY3RlZCB0aGUNCi1jb250ZW50cyBvZiB0aGlzIHJlbGVhc2UuPC9wPg0KLTxwPkxldCdzIGxvb2sgYXQgc29tZSBkaWZmZXJlbnQgd2F5cyB0byBjcmVhdGUgY2xpZW50cyBhbmQNCi1zZXJ2aWNlcy48L3A+DQotPGEgbmFtZT0iY3JlYXRlIiBpZD0iY3JlYXRlIj48L2E+DQotPGgyPkNyZWF0aW5nIFNlcnZpY2VzPC9oMj4NCi08cD5JbiB0aGlzIHNlY3Rpb24sIHdlJ2xsIGxvb2sgYXQgZml2ZSB3YXlzIHRvIGNyZWF0ZSBhIHNlcnZpY2UNCi1iYXNlZCBvbiB0aGUgU3RvY2tRdW90ZVNlcnZpY2UgY2xhc3M6IGRlcGxveWluZyBQbGFpbiBPbGQgSmF2YQ0KLU9iamVjdHMgKFBPSk8pLCBidWlsZGluZyB0aGUgc2VydmljZSB1c2luZyBBWElPTSdzIE9NRWxlbWVudCwNCi1nZW5lcmF0aW5nIHRoZSBzZXJ2aWNlIHVzaW5nIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKSwNCi1nZW5lcmF0aW5nIHRoZSBzZXJ2aWNlIHVzaW5nIFhNTEJlYW5zLCBhbmQgZ2VuZXJhdGluZyB0aGUgc2VydmljZQ0KLXVzaW5nIEppQlguPC9wPg0KLTxhIG5hbWU9ImRlcGxveSIgaWQ9ImRlcGxveSI+PC9hPg0KLTxoMz5EZXBsb3lpbmcgUE9KT3M8L2gzPg0KLTxwPlRvIGRlcGxveSB0aGUgc2VydmljZSB1c2luZyBQT0pPcyAoUGxhaW4gT2xkIEphdmEgT2JqZWN0cyksDQotZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzLjwvcD4NCi08cD5Ob3RlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbnRhaW5lZCBhdA0KLUFYSVMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0ICh0aGUgc2VydmljZXMueG1sIGZpbGUgaXMNCi1mcm9tIHRoZSBmaXJzdCBzZWN0aW9uIG9mIHRoaXMgZ3VpZGUpOjwvcD4NCi08cHJlPg0KLS0gcXVpY2tzdGFydA0KLSAgIC0gUkVBRE1FLnR4dA0KLSAgIC0gYnVpbGQueG1sDQotICAgLSByZXNvdXJjZXMNCi0gICAgIC0gTUVUQS1JTkYNCi0gICAgICAgLSBzZXJ2aWNlcy54bWwNCi0gICAtIHNyYw0KLSAgICAgLSBzYW1wbGVzDQotICAgICAgIC0gcXVpY2tzdGFydA0KLSAgICAgICAgIC0gc2VydmljZQ0KLSAgICAgICAgICAgLSBwb2pvDQotICAgICAgICAgICAgIC0gU3RvY2tRdW90ZVNlcnZpY2UuamF2YQ0KLTwvcHJlPg0KLTxwPk5vdGUgdGhhdCB5b3UgY2FuIGdlbmVyYXRlIGEgV1NETCBmcm9tIHRoZSBxdWlja3N0YXJ0IGRpcmVjdG9yeQ0KLWJ5IHR5cGluZzo8L3A+DQotPHByZT4NCi1hbnQgZ2VuZXJhdGUud3NkbA0KLTwvcHJlPg0KLUhvd2V2ZXIsIGNyZWF0aW5nIFN0b2NrUXVvdGVTZXJ2aWNlLndzZGwgaXMgb3B0aW9uYWwuIEl0IGNhbiBiZSB0aGUNCi12ZXJzaW9uIGdlbmVyYXRlZCBkaXJlY3RseSBmcm9tIHRoZSBKYXZhIGNsYXNzLCBvciBhIGN1c3RvbWl6ZWQNCi12ZXJzaW9uIG9mIHRoYXQgZmlsZSwgYW5kIHRoYXQgc2VydmljZXMueG1sIGlzIHRoZSBzYW1lIGZpbGUNCi1yZWZlcmVuY2VkIGVhcmxpZXIgaW4gdGhpcyBkb2N1bWVudC4NCi08cD5Ob3cgYnVpbGQgdGhlIHByb2plY3QgYnkgdHlwaW5nIGFudCBnZW5lcmF0ZS5zZXJ2aWNlIGluIHRoZQ0KLXF1aWNrc3RhcnQgZGlyZWN0b3J5LCB3aGljaCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5DQotc3RydWN0dXJlOjwvcD4NCi08cHJlPg0KLS0gcXVpY2tzdGFydC9idWlsZC9jbGFzc2VzDQotICAgLSBNRVRBLUlORg0KLSAgICAgLSBzZXJ2aWNlcy54bWwNCi0gICAtIHNhbXBsZXMNCi0gICAgIC0gcXVpY2tzdGFydA0KLSAgICAgICAtIHNlcnZpY2UNCi0gICAgICAgICAtIHBvam8NCi0gICAgICAgICAgIC0gU3RvY2tRdW90ZVNlcnZpY2UuY2xhc3MNCi08L3ByZT4NCi08cD5JZiB5b3Ugd2FudCB0byBkZXBsb3kgdGhlIHNlcnZpY2UgaW4gYW4gZXhwbG9kZWQgZGlyZWN0b3J5DQotZm9ybWF0LCByZW5hbWUgdGhlIGNsYXNzZXMgZGlyZWN0b3J5IHRvIFN0b2NrUXVvdGVTZXJ2aWNlLCBhbmQgY29weQ0KLWl0IHRvIHRoZSB3ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXMgZGlyZWN0b3J5IGluIHlvdXIgc2VydmxldA0KLWVuZ2luZS4gT3RoZXJ3aXNlLCBjb3B5IHRoZSBidWlsZC9TdG9ja1F1b3RlU2VydmljZS5hYXIgZmlsZSB0byB0aGUNCi13ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXMgZGlyZWN0b3J5IGluIHlvdXIgc2VydmxldCBlbmdpbmUuDQotVGhlbiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmljZSBoYXMgYmVlbiBwcm9wZXJseSBkZXBsb3llZA0KLWJ5IHZpZXdpbmcgdGhlIGxpc3Qgb2Ygc2VydmljZXMgYXQ6PC9wPg0KLTxwcmU+DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlcw0KLTwvcHJlPg0KLTxwPllvdSBjYW4gYWxzbyBjaGVja291dCB0aGUgV1NETCBhdDo8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2U/d3NkbA0KLTwvcHJlPg0KLTxwPkFuZCB0aGUgc2NoZW1hIGF0OjwvcD4NCi08cHJlPg0KLWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZT94c2QNCi08L3ByZT4NCi08cD5PbmNlIHRoZSBVUkxzIGFyZSB3b3JraW5nLCBxdWlja2x5IHRlc3QgdGhlIHNlcnZpY2UuIFRyeQ0KLXBvaW50aW5nIHlvdXIgYnJvd3NlciB0byB0aGUgZm9sbG93aW5nIFVSTDo8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UvZ2V0UHJpY2U/c3ltYm9sPUlCTQ0KLTwvcHJlPg0KLTxwPllvdSB3aWxsIGdldCB0aGUgZm9sbG93aW5nIHJlc3BvbnNlOjwvcD4NCi08cHJlPg0KLSZsdDtuczpnZXRQcmljZVJlc3BvbnNlIHhtbG5zOm5zPSJodHRwOi8vcG9qby5zZXJ2aWNlLnF1aWNrc3RhcnQuc2FtcGxlcy94c2QiJmd0OyZsdDtuczpyZXR1cm4mZ3Q7NDImbHQ7L25zOnJldHVybiZndDsmbHQ7L25zOmdldFByaWNlUmVzcG9uc2UmZ3Q7DQotPC9wcmU+DQotPHA+SWYgeW91IGludm9rZSB0aGUgdXBkYXRlIG1ldGhvZCBhcyw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UvdXBkYXRlP3N5bWJvbD1JQk0mYW1wO3ByaWNlPTEwMA0KLTwvcHJlPg0KLWFuZCB0aGVuIGV4ZWN1dGUgdGhlIGZpcnN0IGdldFByaWNlIFVSTCwgeW91IHdpbGwgc2VlIHRoYXQgdGhlDQotcHJpY2UgaGFzIGdvdCB1cGRhdGVkLiA8YSBuYW1lPSJheGlvbSIgaWQ9ImF4aW9tIj48L2E+DQotPGgzPkJ1aWxkaW5nIHRoZSBTZXJ2aWNlIHVzaW5nIEFYSU9NPC9oMz4NCi08cD5UbyBidWlsZCBhIHNlcnZpY2UgImZyb20gc2NyYXRjaCIgdXNpbmcgQVhJT00sIGV4ZWN1dGUgdGhlDQotZm9sbG93aW5nIHN0ZXBzLjwvcD4NCi08cD5Ob3RlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGNvbnRhaW5lZCBhdA0KLS9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbTo8L3A+DQotPHByZT4NCi0tIHF1aWNrc3RhcnRheGlvbQ0KLSAgIC0gUkVBRE1FLnR4dA0KLSAgIC0gYnVpbGQueG1sDQotICAgLSByZXNvdXJjZXMNCi0gICAgIC0gTUVUQS1JTkYNCi0gICAgICAgLSBzZXJ2aWNlcy54bWwNCi0gICAgICAgLSBTdG9ja1F1b3RlU2VydmljZS53c2RsDQotICAgLSBzcmMNCi0gICAgIC0gc2FtcGxlcw0KLSAgICAgICAtIHF1aWNrc3RhcnQNCi0gICAgICAgICAtIHNlcnZpY2UNCi0gICAgICAgICAgIC0gYXhpb20NCi0gICAgICAgICAgICAgLSBTdG9ja1F1b3RlU2VydmljZS5qYXZhDQotICAgICAgICAgLSBjbGllbnRzDQotICAgICAgICAgICAtIEFYSU9NQ2xpZW50LmphdmENCi08L3ByZT4NCi08cD5TaW5jZSBBWElPTSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQsIHlvdSdyZSBnb2luZyB0byBuZWVkIGENCi1kaWZmZXJlbnQgc2VydmljZXMueG1sIGZpbGUgZnJvbSB0aGUgb25lIHVzZWQgZm9yIFBPSk8uIERlZmluZSBpdCwNCi1hcyBzaG93biBpbiBDb2RlIExpc3RpbmcgNC48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDQ6IFRoZSBTZXJ2aWNlIERlZmluaXRpb24gRmlsZS48L2I+PC9wPg0KLTxwcmU+DQotJmx0O3NlcnZpY2UgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiImZ3Q7DQotICAgICZsdDtkZXNjcmlwdGlvbiZndDsNCi0gICAgICAgIFN0b2NrIFF1b3RlIFNlcnZpY2UNCi0gICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsNCi0gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSImZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyImZ3Q7c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYXhpb20uU3RvY2tRdW90ZVNlcnZpY2UmbHQ7L3BhcmFtZXRlciZndDsNCi0mbHQ7L3NlcnZpY2UmZ3Q7DQotPC9wcmU+DQotPHA+Tm90ZSB0aGF0IGl0J3MgYWxtb3N0IHRoZSBzYW1lLCBleGNlcHQgdGhhdCB0aGUgb3BlcmF0aW9ucyBhcmUNCi1leHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIHNlcnZpY2UueG1sIGZpbGUsIGFuZCB0aGUNCi1NZXNzYWdlUmVjZWl2ZXJzIGFyZSBub3cgUmF3WE1MLjwvcD4NCi08cD5Ob3csIHRoZSBhYm92ZSByZWZlcmVuY2VkIFN0b2NrUXVvdGVTZXJ2aWNlLmphdmEgY2xhc3MsIGEgcGxhaW4NCi1KYXZhIGNsYXNzIHRoYXQgdXNlcyBjbGFzc2VzIGZyb20gdGhlIEF4aXMyIGxpYnJhcmllcywgaXMgZGVmaW5lZA0KLWFzIHNob3duIGluIENvZGUgTGlzdGluZyA1LjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgNTogVGhlIFN0b2NrUXVvdGVTZXJ2aWNlIENsYXNzIHVzaW5nDQotQVhJT008L2I+PC9wPg0KLTxwcmU+DQotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5heGlvbTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotcHVibGljIGNsYXNzIFN0b2NrUXVvdGVTZXJ2aWNlIHsNCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7DQotDQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0UHJpY2UoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgZWxlbWVudC5idWlsZCgpOw0KLSAgICAgICAgZWxlbWVudC5kZXRhY2goKTsNCi0NCi0gICAgICAgIE9NRWxlbWVudCBzeW1ib2xFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBzeW1ib2wgPSBzeW1ib2xFbGVtZW50LmdldFRleHQoKTsNCi0NCi0gICAgICAgIFN0cmluZyByZXR1cm5UZXh0ID0gIjQyIjsNCi0gICAgICAgIERvdWJsZSBwcmljZSA9IChEb3VibGUpIG1hcC5nZXQoc3ltYm9sKTsNCi0gICAgICAgIGlmKHByaWNlICE9IG51bGwpew0KLSAgICAgICAgICAgIHJldHVyblRleHQgID0gIiIgKyBwcmljZS5kb3VibGVWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9DQotICAgICAgICAgICAgZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vYXhpb20uc2VydmljZS5xdWlja3N0YXJ0LnNhbXBsZXMveHNkIiwgInRucyIpOw0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImdldFByaWNlUmVzcG9uc2UiLCBvbU5zKTsNCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInByaWNlIiwgb21Ocyk7DQotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCByZXR1cm5UZXh0KSk7DQotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgZWxlbWVudC5idWlsZCgpOw0KLSAgICAgICAgZWxlbWVudC5kZXRhY2goKTsNCi0NCi0gICAgICAgIE9NRWxlbWVudCBzeW1ib2xFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIFN0cmluZyBzeW1ib2wgPSBzeW1ib2xFbGVtZW50LmdldFRleHQoKTsNCi0NCi0gICAgICAgIE9NRWxlbWVudCBwcmljZUVsZW1lbnQgPSAoT01FbGVtZW50KXN5bWJvbEVsZW1lbnQuZ2V0TmV4dE9NU2libGluZygpOw0KLSAgICAgICAgU3RyaW5nIHByaWNlID0gcHJpY2VFbGVtZW50LmdldFRleHQoKTsNCi0NCi0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBuZXcgRG91YmxlKHByaWNlKSk7DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+QXhpczIgdXNlcyBBWElPTSwgb3IgdGhlIEFYSXMgT2JqZWN0IE1vZGVsLCBhIDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL0RPTS8iPkRPTTwvYT4gKERvY3VtZW50IE9iamVjdCBNb2RlbCktbGlrZQ0KLXN0cnVjdHVyZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBTdEFYIEFQSSAoU3RyZWFtaW5nIEFQSSBmb3IgWE1MKS4NCi1NZXRob2RzIHRoYXQgYWN0IGFzIHNlcnZpY2VzIG11c3QgdGFrZSBhcyB0aGVpciBhcmd1bWVudCBhbg0KLU9NRWxlbWVudCwgd2hpY2ggcmVwcmVzZW50cyBhbiBYTUwgZWxlbWVudCB0aGF0IGhhcHBlbnMsIGluIHRoaXMNCi1jYXNlLCB0byBiZSB0aGUgcGF5bG9hZCBvZiB0aGUgaW5jb21pbmcgU09BUCBtZXNzYWdlLiBNZXRob2QNCi1nZXRQcmljZShPTUVsZW1lbnQpLCBmb3IgZXhhbXBsZSwgZXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZQ0KLWZpcnN0IGNoaWxkIG9mIHRoZSBwYXlsb2FkIGVsZW1lbnQsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzdG9jaw0KLXN5bWJvbCwgYW5kIHVzZXMgdGhpcyB0byBsb29rIHVwIHRoZSBjdXJyZW50IHByaWNlIG9mIHRoZSBzdG9jay4NCi1Vbmxlc3MgdGhpcyBpcyBhbiAiaW4gb25seSIgc2VydmljZSwgdGhlc2UgbWV0aG9kcyBtdXN0IHJldHVybiBhbg0KLU9NRWxlbWVudCwgYmVjYXVzZSB0aGF0IGJlY29tZXMgdGhlIHBheWxvYWQgb2YgdGhlIHJldHVybiBTT0FQDQotbWVzc2FnZS48L3A+DQotPHA+Tm93IGJ1aWxkIHRoZSBwcm9qZWN0IGJ5IHR5cGluZyBhbnQgZ2VuZXJhdGUuc2VydmljZSBpbiB0aGUNCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tIGRpcmVjdG9yeS48L3A+DQotPHA+UGxhY2UgdGhlIFN0b2NrUXVvdGVTZXJ2aWNlLmFhciBmaWxlIGluIHRoZQ0KLXdlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyBkaXJlY3Rvcnkgb2YgdGhlIHNlcnZsZXQgZW5naW5lLCBhbmQNCi1jaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmljZSBoYXMgYmVlbiBwcm9wZXJseSBkZXBsb3llZCBieQ0KLXZpZXdpbmcgdGhlIGxpc3Qgb2Ygc2VydmljZXMgYXQsPC9wPg0KLTxwcmU+DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlcw0KLTwvcHJlPg0KLTxwPllvdSBjYW4gYWxzbyBjaGVjayB0aGUgY3VzdG9tIFdTREwgYXQsPC9wPg0KLTxwcmU+DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlP3dzZGwNCi08L3ByZT4NCi08cD5hbmQgdGhlIHNjaGVtYSBhdCw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2U/eHNkDQotPC9wcmU+DQotPGEgbmFtZT0iYWRiIiBpZD0iYWRiIj48L2E+DQotPGgzPkdlbmVyYXRpbmcgdGhlIFNlcnZpY2UgdXNpbmcgQURCPC9oMz4NCi08cD5UbyBnZW5lcmF0ZSBhbmQgZGVwbG95IHRoZSBzZXJ2aWNlIHVzaW5nIHRoZSBBeGlzMiBEYXRhYmluZGluZw0KLUZyYW1ld29yayAoQURCKSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzLjwvcD4NCi08cD5HZW5lcmF0ZSB0aGUgc2tlbGV0b24gdXNpbmcgdGhlIFdTREwySmF2YSB1dGlsaXR5IGJ5IHR5cGluZyB0aGUNCi1mb2xsb3dpbmcgaW4gdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YWRiIGRpcmVjdG9yeTo8L3A+DQotPHByZT4NCi0oV2luZG93cykNCi0lQVhJUzJfSE9NRSVcYmluXFdTREwySmF2YSAtdXJpIHJlc291cmNlc1xNRVRBLUlORlxTdG9ja1F1b3RlU2VydmljZS53c2RsIC1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYiAtZCBhZGIgLXMgLXNzIC1zZCAtc3NpIC1vIGJ1aWxkXHNlcnZpY2UNCi0NCi0oTGludXgpDQotJEFYSVMyX0hPTUUvYmluL1dTREwySmF2YSAtdXJpIHJlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsIC1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYiAtZCBhZGIgLXMgLXNzIC1zZCAtc3NpIC1vIGJ1aWxkL3NlcnZpY2UNCi0NCi08L3ByZT4NCi08cD5FbHNlLCBzaW1wbHkgdHlwZSBhbnQgZ2VuZXJhdGUuc2VydmljZSBpbiB0aGUNCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYiBkaXJlY3RvcnkuPC9wPg0KLTxwPlRoZSBvcHRpb24gLWQgYWRiIHNwZWNpZmllcyBBeGlzIERhdGEgQmluZGluZyAoQURCKS4gVGhlIC1zDQotc3dpdGNoIHNwZWNpZmllcyBzeW5jaHJvbm91cyBvciBibG9ja2luZyBjYWxscyBvbmx5LiBUaGUgLXNzIHN3aXRjaA0KLWNyZWF0ZXMgdGhlIHNlcnZlciBzaWRlIGNvZGUgKHNrZWxldG9uIGFuZCByZWxhdGVkIGZpbGVzKS4gVGhlIC1zZA0KLXN3aXRjaCBjcmVhdGVzIGEgc2VydmljZSBkZXNjcmlwdG9yIChzZXJ2aWNlcy54bWwgZmlsZSkuIFRoZSAtc3NpDQotc3dpdGNoIGNyZWF0ZXMgYW4gaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZSBza2VsZXRvbi4gVGhlIHNlcnZpY2UNCi1maWxlcyBzaG91bGQgbm93IGJlIGxvY2F0ZWQgYXQgYnVpbGQvc2VydmljZS48L3A+DQotPHA+SWYgeW91IGdlbmVyYXRlZCB0aGUgY29kZSBieSB1c2luZyBXU0RMMkphdmEgZGlyZWN0bHksIG5leHQgeW91DQotaGF2ZSB0byBtb2RpZnkgdGhlIGdlbmVyYXRlZCBza2VsZXRvbiB0byBpbXBsZW1lbnQgdGhlIHNlcnZpY2UgKGlmDQoteW91IHVzZWQgImFudCBnZW5lcmF0ZS5zZXJ2aWNlIiwgYSBjb21wbGV0ZWQgc2tlbGV0b24gd2lsbCBiZQ0KLWNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgb25lIGF1dG9tYXRpY2FsbHkpLjwvcD4NCi08cD5PcGVuIHRoZQ0KLWJ1aWxkL3NlcnZpY2Uvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9hZGIvc2VydmljZS9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmENCi1maWxlIGFuZCBtb2RpZnkgaXQgdG8gYWRkIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHlvdXIgc2VydmljZSB0byB0aGUNCi1nZW5lcmF0ZWQgbWV0aG9kczsgc2hvd24gaW4gQ29kZSBMaXN0aW5nIDYuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA2OiBEZWZpbmluZyB0aGUgU2VydmljZSBTa2VsZXRvbiBGaWxlPC9iPjwvcD4NCi08cHJlPg0KLXBhY2thZ2Ugc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiOw0KLQ0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIueHNkLkdldFByaWNlUmVzcG9uc2U7DQotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi54c2QuVXBkYXRlOw0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIueHNkLkdldFByaWNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbiB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgbWFwOw0KLQ0KLSAgICBzdGF0aWN7IG1hcCA9IG5ldyBIYXNoTWFwKCk7IH0NCi0NCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKFVwZGF0ZSBwYXJhbTApIHsNCi0gICAgICAgIG1hcC5wdXQocGFyYW0wLmdldFN5bWJvbCgpLCBuZXcgRG91YmxlKHBhcmFtMC5nZXRQcmljZSgpKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdldFByaWNlUmVzcG9uc2UgZ2V0UHJpY2UoR2V0UHJpY2UgcGFyYW0xKSB7DQotICAgICAgICBEb3VibGUgcHJpY2UgPSAoRG91YmxlKSBtYXAuZ2V0KHBhcmFtMS5nZXRTeW1ib2woKSk7DQotICAgICAgICBkb3VibGUgcmV0ID0gNDI7DQotICAgICAgICBpZihwcmljZSAhPSBudWxsKXsNCi0gICAgICAgICAgICByZXQgPSBwcmljZS5kb3VibGVWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgR2V0UHJpY2VSZXNwb25zZSByZXMgPQ0KLSAgICAgICAgICAgICAgICBuZXcgR2V0UHJpY2VSZXNwb25zZSgpOw0KLSAgICAgICAgcmVzLnNldF9yZXR1cm4ocmV0KTsNCi0gICAgICAgIHJldHVybiByZXM7DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+Tm93IHlvdSBjYW4gYnVpbGQgdGhlIHByb2plY3QgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbg0KLXRoZSBidWlsZC9zZXJ2aWNlIGRpcmVjdG9yeTo8L3A+DQotPHByZT4NCi1hbnQgamFyLnNlcnZlcg0KLTwvcHJlPg0KLTxwPklmIGFsbCBnb2VzIHdlbGwsIHlvdSBzaG91bGQgc2VlIHRoZSBCVUlMRCBTVUNDRVNTRlVMIG1lc3NhZ2UgaW4NCi15b3VyIHdpbmRvdywgYW5kIHRoZSBTdG9ja1F1b3RlU2VydmljZS5hYXIgZmlsZSBpbiB0aGUNCi1idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYiBkaXJlY3RvcnkuIENvcHkgdGhpcyBmaWxlIHRvIHRoZQ0KLXdlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyBkaXJlY3Rvcnkgb2YgdGhlIHNlcnZsZXQgZW5naW5lLjwvcD4NCi08cD5Zb3UgY2FuIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2aWNlIGhhcyBiZWVuIHByb3Blcmx5DQotZGVwbG95ZWQgYnkgdmlld2luZyB0aGUgbGlzdCBvZiBzZXJ2aWNlcyBhdCw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvbGlzdFNlcnZpY2VzDQotPC9wcmU+DQotPHA+WW91IGNhbiBhbHNvIGNoZWNrIHRoZSBjdXN0b20gV1NETCBhdCw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2U/d3NkbA0KLTwvcHJlPg0KLTxwPmFuZCB0aGUgc2NoZW1hIGF0LDwvcD4NCi08cHJlPg0KLWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZT94c2QNCi08L3ByZT4NCi08YSBuYW1lPSJ4bWxiZWFucyIgaWQ9InhtbGJlYW5zIj48L2E+DQotPGgzPkdlbmVyYXRpbmcgdGhlIFNlcnZpY2UgdXNpbmcgWE1MQmVhbnM8L2gzPg0KLTxwPlRvIGdlbmVyYXRlIGEgc2VydmljZSB1c2luZyBYTUxCZWFucywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHMuPC9wPg0KLTxwPkdlbmVyYXRlIHRoZSBza2VsZXRvbiB1c2luZyB0aGUgV1NETDJKYXZhIHV0aWxpdHkgYnkgdHlwaW5nIHRoZQ0KLWZvbGxvd2luZyBpbiB0aGUgQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucw0KLWRpcmVjdG9yeS48L3A+DQotPHByZT4NCi0lQVhJUzJfSE9NRSVcYmluXFdTREwySmF2YSAtdXJpIHJlc291cmNlc1xNRVRBLUlORlxTdG9ja1F1b3RlU2VydmljZS53c2RsIC1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zIC1kIHhtbGJlYW5zIC1zIC1zcyAtc2QgLXNzaSAtbyBidWlsZFxzZXJ2aWNlDQotPC9wcmU+DQotPHA+RWxzZSBzaW1wbHkgdHlwZSBhbnQgZ2VuZXJhdGUuc2VydmljZSBpbiB0aGUNCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zIGRpcmVjdG9yeS48L3A+DQotPHA+VGhlIG9wdGlvbiAtZCB4bWxiZWFucyBzcGVjaWZpZXMgWE1MIEJlYW5zIGRhdGEgYmluZGluZy4gVGhlIC1zDQotc3dpdGNoIHNwZWNpZmllcyBzeW5jaHJvbm91cyBvciBibG9ja2luZyBjYWxscyBvbmx5LiBUaGUgLXNzIHN3aXRjaA0KLWNyZWF0ZXMgdGhlIHNlcnZlciBzaWRlIGNvZGUgKHNrZWxldG9uIGFuZCByZWxhdGVkIGZpbGVzKS4gVGhlIC1zZA0KLXN3aXRjaCBjcmVhdGVzIGEgc2VydmljZSBkZXNjcmlwdG9yIChzZXJ2aWNlcy54bWwgZmlsZSkuIFRoZSAtc3NpDQotc3dpdGNoIGNyZWF0ZXMgYW4gaW50ZXJmYWNlIGZvciB0aGUgc2VydmljZSBza2VsZXRvbi4gVGhlIHNlcnZpY2UNCi1maWxlcyBzaG91bGQgbm93IGJlIGxvY2F0ZWQgYXQgYnVpbGQvc2VydmljZS48L3A+DQotPHA+SWYgeW91IGdlbmVyYXRlZCB0aGUgY29kZSBieSB1c2luZyBXU0RMMkphdmEgZGlyZWN0bHksIG5leHQgeW91DQotaGF2ZSB0byBtb2RpZnkgdGhlIGdlbmVyYXRlZCBza2VsZXRvbiB0byBpbXBsZW1lbnQgdGhlIHNlcnZpY2UgKGlmDQoteW91IHVzZWQgImFudCBnZW5lcmF0ZS5zZXJ2aWNlIiwgYSBjb21wbGV0ZWQgc2tlbGV0b24gd2lsbCBiZQ0KLWNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgb25lIGF1dG9tYXRpY2FsbHkpLjwvcD4NCi08cD5OZXh0IG9wZW4gdGhlDQotYnVpbGQvc2VydmljZS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UveG1sYmVhbnMvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhDQotZmlsZSBhbmQgbW9kaWZ5IGl0IHRvIGFkZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIHNlcnZpY2UgdG8gdGhlDQotZ2VuZXJhdGVkIG1ldGhvZHMgKHNlZSBDb2RlIExpc3RpbmcgNykuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA3OiBEZWZpbmluZyB0aGUgU2VydmljZSBTa2VsZXRvbjwvYj48L3A+DQotPHByZT4NCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zOw0KLQ0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuR2V0UHJpY2VEb2N1bWVudDsNCi1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkLkdldFByaWNlUmVzcG9uc2VEb2N1bWVudDsNCi1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkLlVwZGF0ZURvY3VtZW50Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbiBpbXBsZW1lbnRzIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b25JbnRlcmZhY2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIG1hcDsNCi0NCi0gICAgc3RhdGljeyBtYXAgPSBuZXcgSGFzaE1hcCgpOyB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShVcGRhdGVEb2N1bWVudCBwYXJhbTApIHsNCi0gICAgICAgIDxiPm1hcC5wdXQocGFyYW0wLmdldFVwZGF0ZSgpLmdldFN5bWJvbCgpLCBuZXcgRG91YmxlKHBhcmFtMC5nZXRVcGRhdGUoKS5nZXRQcmljZSgpKSk7PC9iPg0KLSAgICB9DQotDQotICAgIHB1YmxpYyBHZXRQcmljZVJlc3BvbnNlRG9jdW1lbnQgZ2V0UHJpY2UoR2V0UHJpY2VEb2N1bWVudCBwYXJhbTEpIHsNCi0gICAgICAgIDxiPkRvdWJsZSBwcmljZSA9IChEb3VibGUpIG1hcC5nZXQocGFyYW0xLmdldEdldFByaWNlKCkuZ2V0U3ltYm9sKCkpOw0KLSAgICAgICAgZG91YmxlIHJldCA9IDQyOw0KLSAgICAgICAgaWYocHJpY2UgIT0gbnVsbCl7DQotICAgICAgICAgICAgcmV0ID0gcHJpY2UuZG91YmxlVmFsdWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOw0KLSAgICAgICAgR2V0UHJpY2VSZXNwb25zZURvY3VtZW50IHJlc0RvYyA9DQotICAgICAgICAgICAgICAgIEdldFByaWNlUmVzcG9uc2VEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBHZXRQcmljZVJlc3BvbnNlRG9jdW1lbnQuR2V0UHJpY2VSZXNwb25zZSByZXMgPQ0KLSAgICAgICAgICAgICAgICByZXNEb2MuYWRkTmV3R2V0UHJpY2VSZXNwb25zZSgpOw0KLSAgICAgICAgcmVzLnNldFJldHVybihyZXQpOw0KLSAgICAgICAgcmV0dXJuIHJlc0RvYzs8L2I+DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+QnVpbGQgdGhlIHByb2plY3QgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbiB0aGUNCi1idWlsZC9zZXJ2aWNlIGRpcmVjdG9yeSwgd2hpY2ggY29udGFpbnMgdGhlIGJ1aWxkLnhtbCBmaWxlOjwvcD4NCi08cHJlPg0KLWFudCBqYXIuc2VydmVyDQotPC9wcmU+DQotPHA+SWYgYWxsIGdvZXMgd2VsbCwgeW91IHNob3VsZCBzZWUgdGhlIEJVSUxEIFNVQ0NFU1NGVUwgbWVzc2FnZSBpbg0KLXlvdXIgd2luZG93LCBhbmQgdGhlIFN0b2NrUXVvdGVTZXJ2aWNlLmFhciBmaWxlIGluIHRoZSBuZXdseQ0KLWNyZWF0ZWQgYnVpbGQvc2VydmljZS9idWlsZC9saWIgZGlyZWN0b3J5LiBDb3B5IHRoaXMgZmlsZSB0byB0aGUNCi13ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXMgZGlyZWN0b3J5IG9mIHRoZSBzZXJ2bGV0IGVuZ2luZS48L3A+DQotPHA+WW91IGNhbiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmljZSBoYXMgYmVlbiBwcm9wZXJseQ0KLWRlcGxveWVkIGJ5IHZpZXdpbmcgdGhlIGxpc3Qgb2Ygc2VydmljZXMgYXQsPC9wPg0KLTxwcmU+DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlcw0KLTwvcHJlPg0KLTxwPllvdSBjYW4gYWxzbyBjaGVjayB0aGUgY3VzdG9tIFdTREwgYXQsPC9wPg0KLTxwcmU+DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlP3dzZGwNCi08L3ByZT4NCi08cD5hbmQgdGhlIHNjaGVtYSBhdCw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2U/eHNkDQotPC9wcmU+DQotPGEgbmFtZT0iamlieCIgaWQ9ImppYngiPjwvYT4NCi08aDM+R2VuZXJhdGluZyB0aGUgU2VydmljZSB1c2luZyBKaUJYPC9oMz4NCi08cD5UbyBnZW5lcmF0ZSBhbmQgZGVwbG95IHRoZSBzZXJ2aWNlIHVzaW5nIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuamlieC5vcmciPkppQlggZGF0YSBiaW5kaW5nPC9hPiwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nDQotc3RlcHMuPC9wPg0KLTxwPkdlbmVyYXRlIHRoZSBza2VsZXRvbiB1c2luZyB0aGUgV1NETDJKYXZhIHV0aWxpdHkgYnkgdHlwaW5nIHRoZQ0KLWZvbGxvd2luZyBhdCBhIGNvbnNvbGUgaW4gdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0amlieA0KLWRpcmVjdG9yeTo8L3A+DQotPHByZT4NCi0lQVhJUzJfSE9NRSVcYmluXHdzZGwyamF2YSAtdXJpIHJlc291cmNlc1xNRVRBLUlORlxTdG9ja1F1b3RlU2VydmljZS53c2RsIC1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmppYnggLWQgamlieCAtcyAtc3MgLXNkIC1zc2kgLXV3IC1vIGJ1aWxkXHNlcnZpY2UNCi08L3ByZT4NCi08cD5FbHNlLCBzaW1wbHkgdHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIGluIHRoZQ0KLUF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0amlieCBkaXJlY3RvcnkuPC9wPg0KLTxwPlRoZSBvcHRpb24gLWQgamlieCBzcGVjaWZpZXMgSmlCWCBkYXRhIGJpbmRpbmcuIFRoZSAtcyBzd2l0Y2gNCi1zcGVjaWZpZXMgc3luY2hyb25vdXMgb3IgYmxvY2tpbmcgY2FsbHMgb25seS4gVGhlIC1zcyBzd2l0Y2gNCi1jcmVhdGVzIHRoZSBzZXJ2ZXIgc2lkZSBjb2RlIChza2VsZXRvbiBhbmQgcmVsYXRlZCBmaWxlcykuIFRoZSAtc2QNCi1zd2l0Y2ggY3JlYXRlcyBhIHNlcnZpY2UgZGVzY3JpcHRvciAoc2VydmljZXMueG1sIGZpbGUpLiBUaGUgLXNzaQ0KLXN3aXRjaCBjcmVhdGVzIGFuIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2Ugc2tlbGV0b24uIFRoZSAtdXcNCi1zd2l0Y2ggdW53cmFwcyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gYW5kIGZyb20gdGhlIHNlcnZpY2UNCi1vcGVyYXRpb25zIGluIG9yZGVyIHRvIGNyZWF0ZSBhIG1vcmUgbmF0dXJhbCBwcm9ncmFtbWluZw0KLWludGVyZmFjZS48L3A+DQotPHA+QWZ0ZXIgcnVubmluZyBXU0RMMkphdmEsIHRoZSBzZXJ2aWNlIGZpbGVzIHNob3VsZCBiZSBsb2NhdGVkIGF0DQotYnVpbGQvc2VydmljZS4gSWYgeW91IGdlbmVyYXRlZCB0aGUgY29kZSBieSB1c2luZyBXU0RMMkphdmENCi1kaXJlY3RseSwgeW91IG5lZWQgdG8gbW9kaWZ5IHRoZSBnZW5lcmF0ZWQgc2tlbGV0b24gdG8gaW1wbGVtZW50DQotdGhlIHNlcnZpY2UgKGlmIHlvdSB1c2VkICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgYSBjb21wbGV0ZWQNCi1za2VsZXRvbiB3aWxsIGJlIGNvcGllZCBvdmVyIHRoZSBnZW5lcmF0ZWQgb25lIGF1dG9tYXRpY2FsbHkpLiBPcGVuDQotdGhlDQotYnVpbGQvc2VydmljZS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvamlieC9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmENCi1maWxlIGFuZCBtb2RpZnkgaXQgdG8gYWRkIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHlvdXIgc2VydmljZSB0byB0aGUNCi1nZW5lcmF0ZWQgbWV0aG9kcywgYXMgc2hvd24gaW4gQ29kZSBMaXN0aW5nIDguPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA4OiBEZWZpbmluZyB0aGUgU2VydmljZSBTa2VsZXRvbiBGaWxlPC9iPjwvcD4NCi08cHJlPg0KLXBhY2thZ2Ugc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotcHVibGljIGNsYXNzIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24gaW1wbGVtZW50cyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uSW50ZXJmYWNlIHsNCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgc3ltYm9sLCBEb3VibGUgcHJpY2UpIHsNCi0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBwcmljZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERvdWJsZSBnZXRQcmljZShTdHJpbmcgc3ltYm9sKSB7DQotICAgICAgICBEb3VibGUgcmV0ID0gKERvdWJsZSkgbWFwLmdldChzeW1ib2wpOw0KLSAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0ID0gbmV3IERvdWJsZSg0Mi4wKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXQ7DQotICAgIH0NCi19DQotPC9wcmU+DQotPHA+Tm93IHlvdSBjYW4gYnVpbGQgdGhlIHByb2plY3QgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbg0KLXRoZSBidWlsZC9zZXJ2aWNlIGRpcmVjdG9yeTo8L3A+DQotPHByZT4NCi1hbnQgamFyLnNlcnZlcg0KLTwvcHJlPg0KLTxwPklmIGFsbCBnb2VzIHdlbGwsIHlvdSBzaG91bGQgc2VlIHRoZSBCVUlMRCBTVUNDRVNTRlVMIG1lc3NhZ2UgaW4NCi15b3VyIHdpbmRvdywgYW5kIHRoZSBTdG9ja1F1b3RlU2VydmljZS5hYXIgZmlsZSBpbiB0aGUNCi1idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYiBkaXJlY3RvcnkuIENvcHkgdGhpcyBmaWxlIHRvIHRoZQ0KLXdlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyBkaXJlY3Rvcnkgb2YgdGhlIHNlcnZsZXQgZW5naW5lLjwvcD4NCi08cD5Zb3UgY2FuIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZXJ2aWNlIGhhcyBiZWVuIHByb3Blcmx5DQotZGVwbG95ZWQgYnkgdmlld2luZyB0aGUgbGlzdCBvZiBzZXJ2aWNlcyBhdCw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvbGlzdFNlcnZpY2VzDQotPC9wcmU+DQotPHA+WW91IGNhbiBhbHNvIGNoZWNrIHRoZSBjdXN0b20gV1NETCBhdCw8L3A+DQotPHByZT4NCi1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2U/d3NkbA0KLTwvcHJlPg0KLTxwPmFuZCB0aGUgc2NoZW1hIGF0LDwvcD4NCi08cHJlPg0KLWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZT94c2QNCi08L3ByZT4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBKaUJYIHdpdGggQXhpczIsIHNlZSB0aGUgPGEgaHJlZj0NCi0iamlieC9qaWJ4LWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCI+SmlCWCBjb2RlIGdlbmVyYXRpb24NCi1pbnRlZ3JhdGlvbjwvYT4gZGV0YWlscy4gWW91IGNhbiBhbHNvIGNoZWNrIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnNvc25vc2tpLmNvbS9qaWJ4LXdpa2kvc3BhY2UvYXhpczItamlieCI+SmlCWCBBeGlzMg0KLVdpa2kgcGFnZTwvYT4gZm9yIHVwZGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgSmlCWCB3aXRoDQotQXhpczIuPC9wPg0KLTxhIG5hbWU9ImNsaWVudHMiIGlkPSJjbGllbnRzIj48L2E+DQotPGgyPkNyZWF0aW5nIENsaWVudHM8L2gyPg0KLTxwPkluIHRoaXMgc2VjdGlvbiwgd2UnbGwgbG9vayBhdCBmb3VyIHdheXMgdG8gY3JlYXRlIGNsaWVudHMgYmFzZWQNCi1vbiB0aGUgU3RvY2tRdW90ZVNlcnZpY2UgY2xhc3M6IGJ1aWxkaW5nIGFuIEFYSU9NIGJhc2VkIGNsaWVudCwNCi1nZW5lcmF0aW5nIGEgY2xpZW50IHVzaW5nIEF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKSwNCi1nZW5lcmF0aW5nIGEgY2xpZW50IHVzaW5nIFhNTEJlYW5zLCBhbmQgZ2VuZXJhdGluZyBhIGNsaWVudCB1c2luZw0KLUppQlguPC9wPg0KLTxhIG5hbWU9ImNsaWVudGF4aW9tIiBpZD0iY2xpZW50YXhpb20iPjwvYT4NCi08aDM+Q3JlYXRpbmcgYSBDbGllbnQgd2l0aCBBWElPTTwvaDM+DQotPHA+VG8gYnVpbGQgYSBjbGllbnQgdXNpbmcgQVhJT00sIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBzdGVwcy48L3A+DQotPHA+QWxzbywgbm90ZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBzaG93biBpbiB0aGUgQ3JlYXRpbmcgYQ0KLXNlcnZpY2Ugd2l0aCBBWElPTSBzZWN0aW9uLCBkdXBsaWNhdGVkIGJlbG93IGZvciBjb21wbGV0ZW5lc3MuPC9wPg0KLTxwcmU+DQotLSBxdWlja3N0YXJ0YXhpb20NCi0gICAtIFJFQURNRS50eHQNCi0gICAtIGJ1aWxkLnhtbA0KLSAgIC0gcmVzb3VyY2VzDQotICAgICAtIE1FVEEtSU5GDQotICAgICAgIC0gc2VydmljZXMueG1sDQotICAgICAgIC0gU3RvY2tRdW90ZVNlcnZpY2Uud3NkbA0KLSAgIC0gc3JjDQotICAgICAtIHNhbXBsZXMNCi0gICAgICAgLSBxdWlja3N0YXJ0DQotICAgICAgICAgLSBzZXJ2aWNlDQotICAgICAgICAgICAtIGF4aW9tDQotICAgICAgICAgICAgIC0gU3RvY2tRdW90ZVNlcnZpY2UuamF2YQ0KLSAgICAgICAgIC0gY2xpZW50cw0KLSAgICAgICAgICAgLSBBWElPTUNsaWVudC5qYXZhDQotPC9wcmU+DQotPHA+VGhlIGFib3ZlIHJlZmVyZW5jZWQgQVhJT01DbGllbnQuamF2YSBjbGFzcyBpcyBkZWZpbmVkIGFzDQotZm9sbG93cywgc2hvd24gaW4gQ29kZSBMaXN0aW5nIDkuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA5OiBUaGUgQVhJT01DbGllbnQgY2xhc3MgdXNpbmcgQVhJT008L2I+PC9wPg0KLTxwcmU+DQotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50Ow0KLQ0KLXB1YmxpYyBjbGFzcyBBWElPTUNsaWVudCB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IA0KLSAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UHJpY2VQYXlsb2FkKFN0cmluZyBzeW1ib2wpIHsNCi0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsNCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9heGlvbS5zZXJ2aWNlLnF1aWNrc3RhcnQuc2FtcGxlcy94c2QiLCAidG5zIik7DQotDQotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZ2V0UHJpY2UiLCBvbU5zKTsNCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInN5bWJvbCIsIG9tTnMpOw0KLSAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgc3ltYm9sKSk7DQotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCB1cGRhdGVQYXlsb2FkKFN0cmluZyBzeW1ib2wsIGRvdWJsZSBwcmljZSkgew0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2F4aW9tLnNlcnZpY2UucXVpY2tzdGFydC5zYW1wbGVzL3hzZCIsICJ0bnMiKTsNCi0NCi0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJ1cGRhdGUiLCBvbU5zKTsNCi0NCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzeW1ib2wiLCBvbU5zKTsNCi0gICAgICAgIHZhbHVlMS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlMSwgc3ltYm9sKSk7DQotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUxKTsNCi0NCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJwcmljZSIsIG9tTnMpOw0KLSAgICAgICAgdmFsdWUyLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUyLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnRvU3RyaW5nKHByaWNlKSkpOw0KLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7DQotICAgICAgICByZXR1cm4gbWV0aG9kOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgT01FbGVtZW50IGdldFByaWNlUGF5bG9hZCA9IGdldFByaWNlUGF5bG9hZCgiV1NPIik7DQotICAgICAgICAgICAgT01FbGVtZW50IHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkKCJXU08iLCAxMjMuNDIpOw0KLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7DQotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOw0KLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOw0KLQ0KLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsNCi0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsNCi0NCi0gICAgICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldCh1cGRhdGVQYXlsb2FkKTsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInByaWNlIHVwZGF0ZWQiKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldFByaWNlUGF5bG9hZCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcmVzdWx0LmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKTsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkN1cnJlbnQgcHJpY2Ugb2YgV1NPOiAiICsgcmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLX0NCi08L3ByZT4NCi08cD5BeGlzMiB1c2VzIEFYSU9NLCBvciB0aGUgQVhJcyBPYmplY3QgTW9kZWwsIGEgRE9NIChEb2N1bWVudA0KLU9iamVjdCBNb2RlbCktbGlrZSBzdHJ1Y3R1cmUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgU3RBWCBBUEkNCi0oU3RyZWFtaW5nIEFQSSBmb3IgWE1MKS4gSGVyZSB5b3Ugc2V0dXAgdGhlIHBheWxvYWQgZm9yIHRoZSB1cGRhdGUNCi1hbmQgZ2V0UHJpY2UgbWV0aG9kcyBvZiB0aGUgc2VydmljZS4gVGhlIHBheWxvYWRzIGFyZSBjcmVhdGVkDQotc2ltaWxhciB0byBob3cgeW91IGNyZWF0ZWQgdGhlIGdldFByaWNlUmVzcG9uc2UgcGF5bG9hZCBmb3IgdGhlDQotQVhJT00gc2VydmljZS4gVGhlbiB5b3Ugc2V0dXAgdGhlIE9wdGlvbnMgY2xhc3MsIGFuZCBjcmVhdGUgYQ0KLVNlcnZpY2VDbGllbnQgdGhhdCB5b3UnbGwgdXNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZpY2UuDQotRmlyc3QgeW91IGNhbGwgdGhlIHVwZGF0ZSBtZXRob2QsIHdoaWNoIGlzIGEgZmlyZUFuZEZvcmdldCBtZXRob2QNCi10aGF0IHJldHVybnMgbm90aGluZy4gTGFzdGx5LCB5b3UgY2FsbCB0aGUgZ2V0UHJpY2UgbWV0aG9kLCBhbmQNCi1yZXRyaWV2ZSB0aGUgY3VycmVudCBwcmljZSBmcm9tIHRoZSBzZXJ2aWNlIGFuZCBkaXNwbGF5IGl0LjwvcD4NCi08cD5Ob3cgeW91IGNhbiBidWlsZCBhbmQgcnVuIHRoZSBBWElPTSBjbGllbnQgYnkgdHlwaW5nIGFudA0KLXJ1bi5jbGllbnQgaW4gdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20gZGlyZWN0b3J5LjwvcD4NCi08cD5Zb3Ugc2hvdWxkIGdldCB0aGUgZm9sbG93aW5nIGFzIG91dHB1dDo8L3A+DQotPHByZT4NCi1kb25lDQotQ3VycmVudCBwcmljZSBvZiBXU086IDEyMy40Mg0KLTwvcHJlPg0KLTxhIG5hbWU9ImNsaWVudGFkYiIgaWQ9ImNsaWVudGFkYiI+PC9hPg0KLTxoMz5HZW5lcmF0aW5nIGEgQ2xpZW50IHVzaW5nIEFEQjwvaDM+DQotPHA+VG8gYnVpbGQgYSBjbGllbnQgdXNpbmcgQXhpcyBEYXRhIEJpbmRpbmcgKEFEQiksIGV4ZWN1dGUgdGhlDQotZm9sbG93aW5nIHN0ZXBzLjwvcD4NCi08cD5HZW5lcmF0ZSB0aGUgY2xpZW50IGRhdGFiaW5ncyBieSB0eXBpbmcgdGhlIGZvbGxvd2luZyBpbiB0aGUNCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYiBkaXJlY3Rvcnk6PC9wPg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblxXU0RMMkphdmEgLXVyaSByZXNvdXJjZXNcTUVUQS1JTkZcU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCAtcCBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50cyAtZCBhZGIgLXMgLW8gYnVpbGRcY2xpZW50DQotPC9wcmU+DQotPHA+RWxzZSwgc2ltcGx5IHR5cGUgYW50IGdlbmVyYXRlLmNsaWVudCBpbiB0aGUNCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYiBkaXJlY3RvcnkuPC9wPg0KLTxwPk5leHQgdGFrZSBhIGxvb2sgYXQNCi1xdWlja3N0YXJ0YWRiL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9BREJDbGllbnQuamF2YSwgYW5kDQotc2VlIGhvdyBpdCdzIGRlZmluZWQgaW4gQ29kZSBMaXN0aW5nIDEwLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMTA6IFRoZSBBREJDbGllbnQgQ2xhc3M8L2I+PC9wPg0KLTxwcmU+DQotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsNCi0NCi1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiLlN0b2NrUXVvdGVTZXJ2aWNlU3R1YjsNCi0NCi1wdWJsaWMgY2xhc3MgQURCQ2xpZW50ew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nIGFyZ3NbXSl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViDQotICAgICAgICAgICAgICAgICgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlIik7DQotDQotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7DQotICAgICAgICAgICAgdXBkYXRlKHN0dWIpOw0KLSAgICAgICAgICAgIGdldFByaWNlKHN0dWIpOw0KLQ0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIGZpcmUgYW5kIGZvcmdldCAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIuVXBkYXRlIHJlcSA9IG5ldyBTdG9ja1F1b3RlU2VydmljZVN0dWIuVXBkYXRlKCk7DQotICAgICAgICAgICAgcmVxLnNldFN5bWJvbCAoIkFCQyIpOw0KLSAgICAgICAgICAgIHJlcS5zZXRQcmljZSAoNDIuMzUpOw0KLQ0KLSAgICAgICAgICAgIHN0dWIudXBkYXRlKHJlcSk7DQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJwcmljZSB1cGRhdGVkIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogdHdvIHdheSBjYWxsL3JlY2VpdmUgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFByaWNlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIuR2V0UHJpY2UgcmVxID0gbmV3IFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yi5HZXRQcmljZSgpOw0KLQ0KLSAgICAgICAgICAgIHJlcS5zZXRTeW1ib2woIkFCQyIpOw0KLQ0KLSAgICAgICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yi5HZXRQcmljZVJlc3BvbnNlIHJlcyA9DQotICAgICAgICAgICAgICAgIHN0dWIuZ2V0UHJpY2UocmVxKTsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocmVzLmdldF9yZXR1cm4oKSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQotPC9wcmU+DQotPHA+VGhpcyBjbGFzcyBjcmVhdGVzIGEgY2xpZW50IHN0dWIgdXNpbmcgdGhlIEF4aXMgRGF0YSBCaW5kaW5ncw0KLXlvdSBjcmVhdGVkLiBUaGVuIGl0IGNhbGxzIHRoZSBnZXRQcmljZSBhbmQgdXBkYXRlIG9wZXJhdGlvbnMgb24NCi10aGUgV2ViIHNlcnZpY2UuIFRoZSBnZXRQcmljZSBtZXRob2Qgb3BlcmF0aW9uIGNyZWF0ZXMgdGhlIEdldFByaWNlDQotcGF5bG9hZCBhbmQgc2V0cyB0aGUgc3ltYm9sIHRvIEFCQy4gSXQgdGhlbiBzZW5kcyB0aGUgcmVxdWVzdCBhbmQNCi1kaXNwbGF5cyB0aGUgY3VycmVudCBwcmljZS4gVGhlIHVwZGF0ZSBtZXRob2QgY3JlYXRlcyBhbiBVcGRhdGUNCi1wYXlsb2FkLCBzZXR0aW5nIHRoZSBzeW1ib2wgdG8gQUJDIGFuZCB0aGUgcHJpY2UgdG8gNDIuMzUuPC9wPg0KLTxwPk5vdyBidWlsZCBhbmQgcnVuIHRoZSBjbGllbnQgYnkgdHlwaW5nIGFudCBydW4uY2xpZW50IGluIHRoZQ0KLUF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YWRiIGRpcmVjdG9yeS48L3A+DQotPHA+WW91IHNob3VsZCBnZXQgdGhlIGZvbGxvd2luZyBhcyBvdXRwdXQ6PC9wPg0KLTxwcmU+DQotNDINCi1wcmljZSB1cGRhdGVkDQotNDIuMzUNCi08L3ByZT4NCi08YSBuYW1lPSJjbGllbnR4bWxiZWFucyIgaWQ9ImNsaWVudHhtbGJlYW5zIj48L2E+DQotPGgzPkdlbmVyYXRpbmcgYSBDbGllbnQgdXNpbmcgWE1MQmVhbnM8L2gzPg0KLTxwPlRvIGJ1aWxkIGEgY2xpZW50IHVzaW5nIHRoZSBYTUwgQmVhbnMgZGF0YSBiaW5kaW5ncywgZXhlY3V0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHMuPC9wPg0KLTxwPkdlbmVyYXRlIHRoZSBkYXRhYmluZ3MgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgaW4gdGhlDQoteG1sYmVhbnNDbGllbnQgZGlyZWN0b3J5LjwvcD4NCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cV1NETDJKYXZhIC11cmkgcmVzb3VyY2VzXE1FVEEtSU5GXFN0b2NrUXVvdGVTZXJ2aWNlLndzZGwgLXAgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMgLWQgeG1sYmVhbnMgLXMgLW8gYnVpbGRcY2xpZW50DQotPC9wcmU+DQotPHA+RWxzZSwgc2ltcGx5IHR5cGUgYW50IGdlbmVyYXRlLmNsaWVudCBpbiB0aGUNCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zIGRpcmVjdG9yeS48L3A+DQotPHA+Tm90ZSB0aGF0IHRoaXMgY3JlYXRlcyBhIGNsaWVudCBzdHViIGNvZGUgYW5kIG5vIHNlcnZlciBzaWRlDQotY29kZS48L3A+DQotPHA+TmV4dCB0YWtlIGEgbG9vayBhdA0KLXF1aWNrc3RhcnR4bWxiZWFucy9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvWE1MQkVBTlNDbGllbnQuamF2YSwNCi1hbmQgc2VlIGhvdyBpdCdzIGRlZmluZWQgaW4gQ29kZSBMaXN0aW5nIDExLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMTE6IFRoZSBYTUxCRUFOU0NsaWVudCBjbGFzczwvYj48L3A+DQotPHByZT4NCi1wYWNrYWdlIHNhbXBsZXMucXVpY2tzdGFydC5jbGllbnRzOw0KLQ0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy5TdG9ja1F1b3RlU2VydmljZVN0dWI7DQotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLnhzZC5HZXRQcmljZURvY3VtZW50Ow0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuR2V0UHJpY2VSZXNwb25zZURvY3VtZW50Ow0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuVXBkYXRlRG9jdW1lbnQ7DQotDQotcHVibGljIGNsYXNzIFhNTEJFQU5TQ2xpZW50ew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nIGFyZ3NbXSl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViDQotICAgICAgICAgICAgICAgICgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlIik7DQotDQotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7DQotICAgICAgICAgICAgdXBkYXRlKHN0dWIpOw0KLSAgICAgICAgICAgIGdldFByaWNlKHN0dWIpOw0KLQ0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIGZpcmUgYW5kIGZvcmdldCAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBVcGRhdGVEb2N1bWVudCByZXFEb2MgPSBVcGRhdGVEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgVXBkYXRlRG9jdW1lbnQuVXBkYXRlIHJlcSA9IHJlcURvYy5hZGROZXdVcGRhdGUoKTsNCi0gICAgICAgICAgICByZXEuc2V0U3ltYm9sICgiQkNEIik7DQotICAgICAgICAgICAgcmVxLnNldFByaWNlICg0Mi4zMik7DQotDQotICAgICAgICAgICAgc3R1Yi51cGRhdGUocmVxRG9jKTsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInByaWNlIHVwZGF0ZWQiKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiB0d28gd2F5IGNhbGwvcmVjZWl2ZSAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJpY2UoU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIEdldFByaWNlRG9jdW1lbnQgcmVxRG9jID0gR2V0UHJpY2VEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgR2V0UHJpY2VEb2N1bWVudC5HZXRQcmljZSByZXEgPSByZXFEb2MuYWRkTmV3R2V0UHJpY2UoKTsNCi0gICAgICAgICAgICByZXEuc2V0U3ltYm9sKCJCQ0QiKTsNCi0NCi0gICAgICAgICAgICBHZXRQcmljZVJlc3BvbnNlRG9jdW1lbnQgcmVzID0NCi0gICAgICAgICAgICAgICAgc3R1Yi5nZXRQcmljZShyZXFEb2MpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihyZXMuZ2V0R2V0UHJpY2VSZXNwb25zZSgpLmdldFJldHVybigpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi08L3ByZT4NCi08cD5UaGlzIGNsYXNzIGNyZWF0ZXMgYSBjbGllbnQgc3R1YiB1c2luZyB0aGUgWE1MIEJlYW5zIGRhdGENCi1iaW5kaW5ncyB5b3UgY3JlYXRlZC4gVGhlbiBpdCBjYWxscyB0aGUgZ2V0UHJpY2UgYW5kIHRoZSB1cGRhdGUNCi1vcGVyYXRpb25zIG9uIHRoZSBXZWIgc2VydmljZS4gVGhlIGdldFByaWNlIG1ldGhvZCBvcGVyYXRpb24NCi1jcmVhdGVzIHRoZSBHZXRQcmljZURvY3VtZW50LCBpdHMgaW5uZXIgR2V0UHJpY2UgY2xhc3NlcyBhbmQgc2V0cw0KLXRoZSBzeW1ib2wgdG8gQUJDLiBJdCB0aGVuIHNlbmRzIHRoZSByZXF1ZXN0IGFuZCByZXRyaWV2ZXMgYQ0KLUdldFByaWNlUmVzcG9uc2VEb2N1bWVudCBhbmQgZGlzcGxheXMgdGhlIGN1cnJlbnQgcHJpY2UuIFRoZSB1cGRhdGUNCi1tZXRob2QgY3JlYXRlcyBhbiBVcGRhdGVEb2N1bWVudCwgdXBkYXRlcyBhbmQgc2V0cyB0aGUgc3ltYm9sIHRvDQotQUJDIGFuZCBwcmljZSB0byA0Mi4zMiwgZGlzcGxheWluZyAnZG9uZScgd2hlbiBjb21wbGV0ZS48L3A+DQotPHA+Tm93IGJ1aWxkIGFuZCBydW4gdGhlIHRoZSBwcm9qZWN0IGJ5IHR5cGluZyBhbnQgcnVuLmNsaWVudCBpbg0KLXRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zIGRpcmVjdG9yeS48L3A+DQotPHA+WW91IHNob3VsZCBnZXQgdGhlIGZvbGxvd2luZyBhcyBvdXRwdXQ6PC9wPg0KLTxwcmU+DQotNDINCi1wcmljZSB1cGRhdGVkDQotNDIuMzINCi08L3ByZT4NCi08YSBuYW1lPSJjbGllbnRqaWJ4IiBpZD0iY2xpZW50amlieCI+PC9hPg0KLTxoMz5HZW5lcmF0aW5nIGEgQ2xpZW50IHVzaW5nIEppQlg8L2gzPg0KLTxwPlRvIGJ1aWxkIGEgY2xpZW50IHVzaW5nIEppQlgsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBzdGVwcy48L3A+DQotPHA+R2VuZXJhdGUgdGhlIGNsaWVudCBzdHViIGJ5IHR5cGluZyB0aGUgZm9sbG93aW5nIGF0IGEgY29uc29sZSBpbg0KLXRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGppYnggZGlyZWN0b3J5LjwvcD4NCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cd3NkbDJqYXZhIC11cmkgcmVzb3VyY2VzXE1FVEEtSU5GXFN0b2NrUXVvdGVTZXJ2aWNlLndzZGwgLXAgc2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHMgLWQgamlieCAtcyAtdXcgLW8gYnVpbGRcY2xpZW50DQotPC9wcmU+DQotPHA+RWxzZSwgc2ltcGx5IHR5cGUgImFudCBnZW5lcmF0ZS5jbGllbnQiLjwvcD4NCi08cD5OZXh0IHRha2UgYSBsb29rIGF0DQotcXVpY2tzdGFydGppYngvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0ppQlhDbGllbnQuamF2YSwNCi1zaG93biBiZWxvdyBpbiBDb2RlIExpc3RpbmcgMTIuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAxMjogVGhlIEppQlhDbGllbnQgY2xhc3M8L2I+PC9wPg0KLTxwcmU+DQotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsNCi0NCi1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieC5TdG9ja1F1b3RlU2VydmljZVN0dWI7DQotDQotcHVibGljIGNsYXNzIEppQlhDbGllbnR7DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmcgYXJnc1tdKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1YiA9DQotICAgICAgICAgICAgICAgIG5ldyBTdG9ja1F1b3RlU2VydmljZVN0dWINCi0gICAgICAgICAgICAgICAgKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiKTsNCi0NCi0gICAgICAgICAgICBnZXRQcmljZShzdHViKTsNCi0gICAgICAgICAgICB1cGRhdGUoc3R1Yik7DQotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7DQotDQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogZmlyZSBhbmQgZm9yZ2V0ICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGUoU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIHN0dWIudXBkYXRlKCJDREUiLCBuZXcgRG91YmxlKDQyLjM1KSk7DQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJwcmljZSB1cGRhdGVkIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogdHdvIHdheSBjYWxsL3JlY2VpdmUgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFByaWNlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc3R1Yi5nZXRQcmljZSgiQ0RFIikpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KLTwvcHJlPg0KLTxwPlRoaXMgY2xhc3MgdXNlcyB0aGUgY3JlYXRlZCBKaUJYIGNsaWVudCBzdHViIHRvIGFjY2VzcyB0aGUNCi1nZXRQcmljZSBhbmQgdGhlIHVwZGF0ZSBvcGVyYXRpb25zIG9uIHRoZSBXZWIgc2VydmljZS4gVGhlIGdldFByaWNlDQotbWV0aG9kIHNlbmRzIGEgcmVxdWVzdCBmb3IgdGhlIHN0b2NrICJBQkMiIGFuZCBkaXNwbGF5cyB0aGUgY3VycmVudA0KLXByaWNlLiBUaGUgdXBkYXRlIG1ldGhvZCBzZXRzbmV4IHRoZSBwcmljZSBmb3Igc3RvY2sgIkFCQyIgdG8NCi00Mi4zNS48L3A+DQotPHA+Tm93IGJ1aWxkIGFuZCBydW4gdGhlIGNsaWVudCBieSB0eXBpbmcgImFudCBydW4uY2xpZW50IiBhdCBhDQotY29uc29sZSBpbiB0aGUgQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4IGRpcmVjdG9yeS48L3A+DQotPHA+WW91IHNob3VsZCBnZXQgdGhlIGZvbGxvd2luZyBhcyBvdXRwdXQ6PC9wPg0KLTxwcmU+DQotNDINCi1wcmljZSB1cGRhdGVkDQotNDIuMzUNCi08L3ByZT4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBKaUJYIHdpdGggQXhpczIsIHNlZSB0aGUgPGEgaHJlZj0NCi0iamlieC9qaWJ4LWNvZGVnZW4taW50ZWdyYXRpb24uaHRtbCI+SmlCWCBjb2RlIGdlbmVyYXRpb24NCi1pbnRlZ3JhdGlvbjwvYT4gZGV0YWlscy48L3A+DQotPGEgbmFtZT0ic3VtbWFyeSIgaWQ9InN1bW1hcnkiPjwvYT4NCi08aDI+U3VtbWFyeTwvaDI+DQotPHA+QXhpczIgcHJvdmlkZXMgYSBzbGljayBhbmQgcm9idXN0IHdheSB0byBnZXQgd2ViIHNlcnZpY2VzIHVwIGFuZA0KLXJ1bm5pbmcgaW4gbm8gdGltZS4gVGhpcyBndWlkZSBwcmVzZW50ZWQgZml2ZSBtZXRob2RzIG9mIGNyZWF0aW5nIGENCi1zZXJ2aWNlIGRlcGxveWFibGUgb24gQXhpczIsIGFuZCBmb3VyIG1ldGhvZHMgb2YgY3JlYXRpbmcgYSBjbGllbnQNCi10byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2aWNlcy4gWW91IG5vdyBoYXZlIHRoZSBmbGV4aWJpbGl0eSB0bw0KLWNyZWF0ZSBXZWIgc2VydmljZXMgdXNpbmcgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMuPC9wPg0KLTxhIG5hbWU9ImZ1cnRoZXJzdHVkeSIgaWQ9ImZ1cnRoZXJzdHVkeSI+PC9hPg0KLTxoMj5Gb3IgRnVydGhlciBTdHVkeTwvaDI+DQotPHA+QXBhY2hlIEF4aXMyLTxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvPC9hPjwvcD4NCi08cD5BeGlzMiBBcmNoaXRlY3R1cmUtPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8wL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8wL0F4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbDwvYT48L3A+DQotPHA+SW50cm9kdWN0aW9uIHRvIEFwYWNoZSBBeGlzMi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LnJlZGhhdC5jb20vbWFnYXppbmUvMDIxanVsMDYvZmVhdHVyZXMvYXBhY2hlX2F4aXMyLyI+aHR0cDovL3d3dy5yZWRoYXQuY29tL21hZ2F6aW5lLzAyMWp1bDA2L2ZlYXR1cmVzL2FwYWNoZV9heGlzMi88L2E+PC9wPg0KLTxwPldvcmtpbmcgV2l0aCBBcGFjaGUgQXhpczItPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53c28yLm5ldC9hcnRpY2xlcy9heGlzMi9qYXZhLzIwMDYvMDkvMTMvd29ya2luZy13aXRoLWF4aXMyIj5odHRwOi8vd3d3LndzbzIubmV0L2FydGljbGVzL2F4aXMyL2phdmEvMjAwNi8wOS8xMy93b3JraW5nLXdpdGgtYXhpczI8L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3JlZmVyZW5jZS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlZTNhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiBSZWZlcmVuY2UgR3VpZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuLVVTIiBkaXI9Imx0ciIgeG1sOmxhbmc9ImVuLVVTIj4NCi08YSBuYW1lPSJfVG9jOTY2OTc4NDkiIGlkPSJfVG9jOTY2OTc4NDkiPjwvYT4NCi08aDEgYWxpZ249ImNlbnRlciI+QXhpczIgUmVmZXJlbmNlIEd1aWRlPC9oMT4NCi08YSBuYW1lPSJ3c2RsMmNvZGUiIGlkPSJ3c2RsMmNvZGUiPjwvYT4NCi08aDI+V1NETDJKYXZhIFJlZmVyZW5jZTwvaDI+DQotPHByZT4NCi1OQU1FDQotICAgICAgIHdzZGwyamF2YS5zaCBvciB3c2RsMmphdmEuYmF0IC0gR2VuZXJhdGVzIGphdmEgY29kZSBhY2NvcmRpbmcgdG8gYSBnaXZlbiBXU0RMIGZpbGUgdG8gaGFuZGxlIFdlYiBzZXJ2aWNlIGludm9jYXRpb24uDQotICAgICAgIFRoZXNlIHNjcmlwdHMgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSBBeGlzMiBkaXN0cmlidXRpb24uDQotDQotU1lOT1BTSVMNCi0gICAgICAgd3NkbDJqYXZhLnNoIFtPUFRJT05dLi4uIC11cmkgJmx0O0xvY2F0aW9uIG9mIFdTREwmZ3Q7DQotDQotREVTQ1JJUFRJT04NCi0gICAgICAgR2l2ZW4gYSBXU0RMIGZpbGUsIHRoaXMgZ2VuZXJhdGVzIGphdmEgY29kZSB0byBoYW5kbGUgV2ViIHNlcnZpY2UgaW52b2NhdGlvbnMuDQotDQotICAgICAgLW8gJmx0O3BhdGgmZ3Q7ICAgICAgICAgIFNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLg0KLSAgICAgIC1hICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhc3luYyBzdHlsZSBjb2RlIG9ubHkgKERlZmF1bHQ6IG9mZikuDQotICAgICAgLXMgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHN5bmMgc3R5bGUgY29kZSBvbmx5IChEZWZhdWx0OiBvZmYpLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgLWEuDQotICAgICAgLXAgJmx0O3BrZzEmZ3Q7ICAgICAgICAgIFNwZWNpZnkgYSBjdXN0b20gcGFja2FnZSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuDQotICAgICAgLWwgJmx0O2xhbmd1YWdlJmd0OyAgICAgIFZhbGlkIGxhbmd1YWdlcyBhcmUgamF2YSBhbmQgYyAoRGVmYXVsdDogamF2YSkuDQotICAgICAgLXQgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgdGVzdCBjYXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuDQotICAgICAgLXNzICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIHNlcnZlciBzaWRlIGNvZGUgKGkuZS4gc2tlbGV0b25zKSAoRGVmYXVsdDogb2ZmKS4NCi0gICAgICAtc2QgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgc2VydmljZSBkZXNjcmlwdG9yIChpLmUuIHNlcnZpY2VzLnhtbCkuIChEZWZhdWx0OiBvZmYpLiBWYWxpZCB3aXRoIC1zcy4NCi0gICAgICAtZCAmbHQ7ZGF0YWJpbmRpbmcmZ3Q7ICAgVmFsaWQgZGF0YWJpbmRpbmcocykgYXJlIGFkYiwgeG1sYmVhbnMsIGppYnggYW5kIGpheGJyaSAoRGVmYXVsdDogYWRiKS4NCi0gICAgICAtZyAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIGFsbCB0aGUgY2xhc3Nlcy4gVmFsaWQgb25seSB3aXRoIC1zcy4NCi0gICAgICAtcG4gJmx0O3BvcnRfbmFtZSZndDsgICAgQ2hvb3NlIGEgc3BlY2lmaWMgcG9ydCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3J0cyBpbiB0aGUgd3NkbC4NCi0gICAgICAtc24gJmx0O3NlcnZpY2VfbmFtZSZndDsgQ2hvb3NlIGEgc3BlY2lmaWMgc2VydmljZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcyBpbiB0aGUgd3NkbC4NCi0gICAgICAtdSAgICAgICAgICAgICAgICAgICAgICAgVW5wYWNrcyB0aGUgZGF0YWJpbmRpbmcgY2xhc3Nlcw0KLSAgICAgIC1yICZsdDtwYXRoJmd0OyAgICAgICAgICBTcGVjaWZ5IGEgcmVwb3NpdG9yeSBhZ2FpbnN0IHdoaWNoIGNvZGUgaXMgZ2VuZXJhdGVkLg0KLSAgICAgIC1uczJwIG5zMT1wa2cxLG5zMj1wa2cyICBTcGVjaWZ5IGEgY3VzdG9tIHBhY2thZ2UgbmFtZSBmb3IgZWFjaCBuYW1lc3BhY2Ugc3BlY2lmaWVkIGluIHRoZSB3c2RscyBzY2hlbWEuDQotICAgICAgLXNzaSAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gKERlZmF1bHQ6IG9mZikuDQotICAgICAgLXd2ICZsdDt2ZXJzaW9uJmd0OyAgICAgIFdTREwgVmVyc2lvbi4gVmFsaWQgT3B0aW9ucyA6IDIsIDIuMCwgMS4xDQotICAgICAgLVMgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHNvdXJjZQ0KLSAgICAgIC1SICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCByZXNvdXJjZXMNCi0gICAgICAtZW0gICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBhbiBleHRlcm5hbCBtYXBwaW5nIGZpbGUNCi0gICAgICAtZiAgICAgICAgICAgICAgICAgICAgICAgRmxhdHRlbnMgdGhlIGdlbmVyYXRlZCBmaWxlcw0KLSAgICAgIC11dyAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggb24gdW4td3JhcHBpbmcuDQotICAgICAgLXhzZGNvbmZpZyAmbHQ7ZmlsZSBwYXRoJmd0OyAgIFVzZSBYTUxCZWFucyAueHNkY29uZmlnIGZpbGUuIFZhbGlkIG9ubHkgd2l0aCAtZCB4bWxiZWFucy4NCi0gICAgICAtYXAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgYWxsIHBvcnRzDQotICAgICAgLW9yICAgICAgICAgICAgICAgICAgICAgIE92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2xhc3Nlcw0KLSAgICAgIC1iICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBBeGlzIDEueCBiYWNrd29yZCBjb21wYXRpYmxlIGNvZGUuDQotICAgICAgLXNwICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzIG5hbWVzcGFjZSBwcmVmaXhlcyAoT3B0aW16YXRpb24gdGhhdCByZWR1Y2VzIHNpemUgb2Ygc29hcCByZXF1ZXN0L3Jlc3BvbnNlKQ0KLSAgICAgIC1FJmx0O2tleSZndDsgJmx0O3ZhbHVlJmd0OyAgICAgICAgICBFeHRyYSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWMgdG8gY2VydGFpbiBkYXRhYmluZGluZ3MuIEV4YW1wbGVzOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRWJpbmRpbmdmaWxlICZsdDtwYXRoJmd0OyAgICAgICAgICAgICAgICAgICAoZm9yIGppYngpIC0gc3BlY2lmeSB0aGUgZmlsZSBwYXRoIGZvciB0aGUgYmluZGluZyBmaWxlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1FdHlwZXN5c3RlbW5hbWUgJmx0O215X3R5cGVfc3lzdGVtX25hbWUmZ3Q7IChmb3IgeG1sYmVhbnMpIC0gb3ZlcnJpZGUgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCB0eXBlIHN5c3RlbSBuYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1FamF2YXZlcnNpb24gMS41ICAgICAgICAgICAgICAgICAgICAgIChmb3IgeG1sYmVhbnMpIC0gZ2VuZXJhdGVzIEphdmEgMS41IGNvZGUgKHR5cGVkIGxpc3RzIGluc3RlYWQgb2YgYXJyYXlzKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRW1wICZsdDtwYWNrYWdlIG5hbWUmZ3Q7IChmb3IgQURCKSAtIGV4dGVuc2lvbiBtYXBwZXIgcGFja2FnZSBuYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1Fb3N2IChmb3IgQURCKSAtIHR1cm4gb2ZmIHN0cmljdCB2YWxpZGF0aW9uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRXdkYyAoZm9yIHhtbGJlYW5zKSAtIEdlbmVyYXRlIGNvZGUgd2l0aCBhIGR1bW15IHNjaGVtYS4gaWYgc29tZW9uZSB1c2UgdGhpcyBvcHRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhleSBoYXZlIHRvIGdlbmVyYXRlIHRoZSB4bWxiZWFucyBjb2RlIHNlcGVyYXRlbHkgd2l0aCB0aGUgc2NvbXAgY29tbWFuZCBjb21lcyB3aXRoIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxiZWFucyBkaXN0cmlidXRpb24gYW5kIHJlcGxhY2UgdGhlIEF4aXMyIGdlbmVyYXRlZCBjbGFzc2VzIHdpdGggY29ycmVjdCBjbGFzc2VzDQotICAgICAgLS1ub0J1aWxkWE1MICAgICAgICAgICAgIERvbnQgZ2VuZXJhdGUgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeQ0KLSAgICAgIC0tbm9XU0RMICAgICAgICAgICAgICAgICBEb250IGdlbmVyYXRlIFdTRExzIGluIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5DQotICAgICAgLS1ub01lc3NhZ2VSZWNlaXZlciAgICAgIERvbnQgZ2VuZXJhdGUgYSBNZXNzYWdlUmVjZWl2ZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2VzDQotICAgICAgLS1odHRwLXByb3h5LWhvc3QgICAgICAgIFByb3h5IGhvc3QgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsDQotICAgICAgLS1odHRwLXByb3h5LXBvcnQgICAgICAgIFByb3h5IHByb3QgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsDQotICAgICAgLWVwICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGUgcGFja2FnZXMgLSB0aGVzZSBwYWNrYWdlcyBhcmUgZGVsZXRlZCBhZnRlciBjb2RlZ2VuZXJhdGlvbg0KLSAgICANCi1FWEFNUExFUw0KLSAgICAgICB3c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbA0KLSAgICAgICB3c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCAtc3MgLXNkIA0KLSAgICAgICB3c2RsMmphdmEuc2ggLXVyaSAuLi9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCAtc3MgLXNkIC1kIHhtbGJlYW5zIC1vIC4uL3NhbXBsZXMgLXAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUNCi08L3ByZT4NCi08YSBuYW1lPSJ3c2RsMmphdmEiIGlkPSJ3c2RsMmphdmEiPjwvYT4NCi08aDI+SmF2YTJXU0RMIFJlZmVyZW5jZTwvaDI+DQotPHByZT4NCi1OQU1FDQotICAgICAgIEphdmEyV1NETC5zaCBvciBKYXZhMldTREwuYmF0IC0gR2VuZXJhdGVzIHRoZSBhcHByb3ByaWF0ZSBXU0RMIGZpbGUgZm9yIGEgZ2l2ZW4gamF2YSBjbGFzcy4NCi0gICAgICAgVGhlc2Ugc2NyaXB0cyBjYW4gYmUgZm91bmQgdW5kZXIgdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbi4NCi0NCi1TWU5PUFNJUw0KLSAgICAgICBKYXZhMldTREwuc2ggW09QVElPTl0uLi4gLWNuICZsdDtmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSZndDsNCi0NCi1ERVNDUklQVElPTg0KLSAgICAgICBHaXZlbiBhIGphdmEgY2xhc3MgZ2VuZXJhdGVzIGEgV1NETCBmaWxlIGZvciB0aGUgZ2l2ZW4gamF2YSBjbGFzcy4gDQotDQotICAgICAgLW8gJmx0O291dHB1dCBsb2NhdGlvbiZndDsgICAgICAgICAgICAgICAgICAgIG91dHB1dCBkaXJlY3RvcnkNCi0gICAgICAtb2YgJmx0O291dHB1dCBmaWxlIG5hbWUmZ3Q7ICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUgbmFtZSBmb3IgdGhlIFdTREwNCi0gICAgICAtc24gJmx0O3NlcnZpY2UgbmFtZSZndDsgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSBuYW1lDQotICAgICAgLWwgJmx0O3NvYXAgYWRkcmVzcyZndDsgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIHBvcnQgZm9yIHRoZSBXU0RMDQotICAgICAgLWNwICZsdDtjbGFzcyBwYXRoIHVyaSZndDsgICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMgLSAodXJscykNCi0gICAgICAtdG4gJmx0O3RhcmdldCBuYW1lc3BhY2UmZ3Q7ICAgICAgICAgICAgICAgICAgdGFyZ2V0IG5hbWVzcGFjZSBmb3Igc2VydmljZQ0KLSAgICAgIC10cCAmbHQ7dGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXgmZ3Q7ICAgICAgICAgICB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeCBmb3Igc2VydmljZQ0KLSAgICAgIC1zdG4gJmx0O3NjaGVtYSB0YXJnZXQgbmFtZXNwYWNlJmd0OyAgICAgICAgICB0YXJnZXQgbmFtZXNwYWNlIGZvciBzY2hlbWENCi0gICAgICAtc3RwICZsdDtzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXgmZ3Q7ICAgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXggZm9yIHNjaGVtYQ0KLSAgICAgIC1zdCAmbHQ7YmluZGluZyBzdHlsZSZndDsgICAgICAgICAgICAgICAgICAgICBzdHlsZSBmb3IgdGhlIFdTREwNCi0gICAgICAtdSAmbHQ7YmluZGluZyB1c2UmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGZvciB0aGUgV1NETA0KLSAgICAgIC1uc2cgJmx0O2NsYXNzIG5hbWUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBOYW1lc3BhY2VHZW5lcmF0b3INCi0gICAgICAtc2cgJmx0O2NsYXNzIG5hbWUmZ3Q7ICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdG9yDQotICAgICAgLXAybiBbJmx0O2phdmEgcGFja2FnZSZndDssJmx0O25hbWVzcGFjZV0gWyZsdDtqYXZhIHBhY2thZ2UmZ3Q7LCZsdDtuYW1lc3BhY2VdLi4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZyBmb3IgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcw0KLSAgICAgIC1wMm4gW2FsbCwgJmx0O25hbWVzcGFjZSZndDtdICAgICAgICAgICAgICAgICB0byBhc3NpZ24gYWxsIHR5cGVzIHRvIGEgc2luZ2xlIG5hbWVzcGFjZQ0KLSAgICAgIC1lZmQgJmx0O3F1YWxpZmllZC91bnF1YWxpZmllZCZndDsgICAgICAgICAgICBzZXR0aW5nIGZvciBlbGVtZW50Rm9ybURlZmF1bHQgKGRlZmF1bHRzIHRvIHF1YWxpZmllZCkNCi0gICAgICAtYWZkICZsdDtxdWFsaWZpZWQvdW5xdWFsaWZpZWQmZ3Q7ICAgICAgICAgICAgc2V0dGluZyBmb3IgYXR0cmlidXRlRm9ybURlZmF1bHQgKGRlZmF1bHRzIHRvIHF1YWxpZmllZCkNCi0gICAgICAteGMgY2xhc3MxIC14YyBjbGFzczIuLi4gICAgICAgICAgICAgICAgZXh0cmEgY2xhc3MoZXMpIGZvciB3aGljaCBzY2hlbWF0eXBlIG11c3QgYmUgZ2VuZXJhdGVkLg0KLSAgICAgIC13diAmbHQ7MS4xLzIuMCZndDsgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsIHZlcnNpb24gLSBkZWZhdWx0cyB0byAxLjEgaWYgbm90IHNwZWNpZmllZA0KLSAgICAgIC1kbGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBzY2hlbWFzIGNvbmZvcm1pbmcgdG8gZG9jL2xpdC9iYXJlIHN0eWxlDQotICAgIA0KLUVYQU1QTEVTDQotICAgICAgIEphdmEyV1NETC5zaCAtY24gLi4vc2FtcGxlcy90ZXN0L3NlYXJjaFRvb2wuU2VhcmNoDQotICAgICAgIEphdmEyV1NETC5zaCAtY24gLi4vc2FtcGxlcy90ZXN0L3NlYXJjaFRvb2wuU2VhcmNoIC1zbiBzZWFyY2gNCi0gICAgICAgSmF2YTJXU0RMLnNoIC1jbiAuLi9zYW1wbGVzL3Rlc3Qvc2VhcmNoVG9vbC5TZWFyY2ggLXUgLXNuIHNlYXJjaA0KLSAgICAgICBKYXZhMldTREwuc2ggLWNuIC4uL3NhbXBsZXMvdGVzdC9zZWFyY2hUb29sLlNlYXJjaCAtc24gc2VhcmNoIC1vIC4uL3NhbXBsZXMvdGVzdC93c2RsICANCi08L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXNvdXJjZXMvc2NoZW1hcy9tb2R1bGUueHNkIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL21vZHVsZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzg3ZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL21vZHVsZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBDcmVhdGVkIGJ5IEVyYW4gQ2hpbnRoYWthIC0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4czplbGVtZW50IG5hbWU9Im1vZHVsZSI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaW5mbG93IiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGFuZGxlciIgIHR5cGU9ImhhbmRsZXJUeXBlIiAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3V0ZmxvdyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJCTx4czplbGVtZW50IG5hbWU9ImhhbmRsZXIiICB0eXBlPSJoYW5kbGVyVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8eHM6ZWxlbWVudCByZWY9Im9wZXJhdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iT3V0ZmF1bHRmbG93IiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzOmVsZW1lbnQgIG5hbWU9ImhhbmRsZXIiICB0eXBlPSJoYW5kbGVyVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iSU5mYXVsdGZsb3ciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCQk8eHM6ZWxlbWVudCAgbmFtZT0iaGFuZGxlciIgIHR5cGU9ImhhbmRsZXJUeXBlIiAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8L3hzOnNlcXVlbmNlPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJvcmRlciI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icGhhc2UiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJhZnRlciIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9ImJlZm9yZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9InBoYXNlRmlyc3QiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJwaGFzZUxhc3QiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQotCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iaGFuZGxlclR5cGUiPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IHJlZj0ib3JkZXIiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0KLQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NrZWQiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiIGRlZmF1bHQ9ImZhbHNlIi8+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotCTx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiI+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJCTx4czpzZXF1ZW5jZT4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlUmVjZWl2ZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiLz4KLQkJCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCQk8L3hzOmVsZW1lbnQ+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXAiIHR5cGU9InhzOmFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL3NlcnZpY2VzLnhzZCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXNvdXJjZXMvc2NoZW1hcy9zZXJ2aWNlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWVjODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3Jlc291cmNlcy9zY2hlbWFzL3NlcnZpY2VzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0ib3BlcmF0aW9uVHlwZSI+Ci0JCTx4czpzZXF1ZW5jZT4KLQkJCTx4czplbGVtZW50IG5hbWU9ImFjdGlvbk1hcHBpbmciIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3V0cHV0QWN0aW9uTWFwcGluZyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHRBY3Rpb25NYXBwaW5nIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYXVsdE5hbWUiIHVzZT0icmVxdWlyZWQiLz4KLQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJPC94czplbGVtZW50PgotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVyIiBtaW5PY2N1cnM9IjAiPgotCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9InBhcmFtZXRlclR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCTx4czplbGVtZW50IG5hbWU9Im1vZHVsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJCQk8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIvPgotCQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0ibWVwIiB0eXBlPSJ4czphbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotCTx4czpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbWV0ZXJUeXBlIj4KLQkJPHhzOmFubm90YXRpb24+Ci0JCQk8eHM6ZG9jdW1lbnRhdGlvbj5UeXBlIGRlc2NyaWJpbmcgYSBwYXJhbWV0ZXIuIFRoaXMgZWxlbWVudCBjb250YWlucyB0d28gYXR0cmlidXRlcwotICAgICAgICAgYW5kIG1heSBjb250YWluIGFueSBlbGVtZW50IG9yIHNpbXBseSBhIHN0cmluZzwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFueVR5cGUiPgotCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NrZWQiIHR5cGU9InhzOmJvb2xlYW4iIHVzZT0ib3B0aW9uYWwiLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOmNvbXBsZXhDb250ZW50PgotCTwveHM6Y29tcGxleFR5cGU+Ci0JPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZSI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Ci0JCQlTZXJ2aWNlIGVsZW1lbnQgZGVzY3JpcHRpb24uIFRoaXMgaGFzIGEgbnVtYmVyIG9mCi0gICAgICAgICAgICAgcGFyYW1ldGVyIGFuZCBvcGVyYXRpb24gZWxlbWVudHMgbmVzdGVkCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJwYXJhbWV0ZXJUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIiB0eXBlPSJvcGVyYXRpb25UeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJtb2R1bGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCSAgICA8eHM6Y29tcGxleFR5cGU+Ci0JCQkJCTx4czphdHRyaWJ1dGUgbmFtZT0icmVmIiB1c2U9InJlcXVpcmVkIi8+Ci0JCQkJICAgIDwveHM6Y29tcGxleFR5cGU+Ci0JCQkgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0JCQkJICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIxIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLQkJCSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlcnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLQkJCQkgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlciIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLQkJCQkJICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdHlwZT0ieHM6c3RyaW5nIiAgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiAgdXNlPSJyZXF1aXJlZCIvPgotCQkJCSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0JCQkgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLQkJCSAgICAgIDwveHM6ZWxlbWVudD4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCQkJICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhY3RpdmF0ZSIgdHlwZT0ieHM6Ym9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgotICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+Ci0JCQk8eHM6YXR0cmlidXRlIG5hbWU9IndzYWRkcmVzc2luZyIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCTwveHM6ZWxlbWVudD4KLQk8eHM6ZWxlbWVudCBuYW1lPSJzZXJ2aWNlR3JvdXAiPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPgotCQkJIGhvbGRlciBmb3IgbXVsdGlwbGUgc2VydmljZSBlbGVtZW50cy4gCi0gICAgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgcmVmPSJzZXJ2aWNlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXN0LXdzLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXN0LXdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0ZjQ5Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvcmVzdC13cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPgotICA8dGl0bGU+UkVTVGZ1bCBXZWIgU2VydmljZXMgU3VwcG9ydDwvdGl0bGU+Ci0gIDxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotICBtZWRpYT0iYWxsIi8+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9ImVuIj4KLTxoMT5SRVNUZnVsIFdlYiBTZXJ2aWNlcyBTdXBwb3J0PC9oMT4KLQotPHA+VGhpcyBkb2N1bWVudCBwcmVzZW50cyBhbiBpbnRyb2R1Y3Rpb24gb24gUkVTVCBhbmQgUkVTVCB3aXRoIEhUVFAgUE9TVCBhbmQKLUdFVC48L3A+Ci0KLTxoMj5Db250ZW50PC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcmVzdF93aXRoX3Bvc3QiPkRvaW5nIFJFU1QgV2ViIFNlcnZpY2VzIHdpdGggSFRUUCBQT1NUPC9hPgotICAgIDx1bD4KLSAgICAgIDxsaT48YSBocmVmPSIjc2FtcGxlIj5TYW1wbGUgUkVTVCAtIEhUVFAgUE9TVCBDbGllbnQ8L2E+PC9saT4KLSAgICA8L3VsPgotICA8L2xpPgotICA8bGk+PGEgaHJlZj0iI3Jlc3Rfd2l0aF9nZXQiPkFjY2VzcyBhIFJFU1QgV2ViIFNlcnZpY2UgdmlhIEhUVFAgR0VUPC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0iaW50cm8iPjwvYT4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPldTREwgMi4wIEhUVFAgQmluZGluZyBkZWZpbmVzIGEgd2F5IHRvIGltcGxlbWVudCBSRVNUIChSZXByZXNlbnRhdGlvbmFsCi1TdGF0ZSBUcmFuc2Zlcikgd2l0aCBXZWIgc2VydmljZXMuIEF4aXMyIGltcGxlbWVudHMgdGhlIG1vc3QgZGVmaW5lZCBIVFRQCi1iaW5kaW5nIHNwZWNpZmljYXRpb24uIFJFU1QgV2ViIHNlcnZpY2VzIGFyZSBhIHJlZHVjZWQgc3Vic2V0IG9mIHRoZSB1c3VhbAotV2ViIHNlcnZpY2Ugc3RhY2suPC9wPgotCi08cD5UaGUgQXhpczIgUkVTVCBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8L3A+Ci08b2w+Ci0gIDxsaT5SRVNUIFdlYiBzZXJ2aWNlcyBhcmUgU3luY2hyb25vdXMgYW5kIFJlcXVlc3QgUmVzcG9uc2UgaW4gbmF0dXJlLjwvbGk+Ci0gIDxsaT5XaGVuIFJFU1QgV2ViIHNlcnZpY2VzIGFyZSBhY2Nlc3NlZCB2aWEgR0VULCB0aGUgc2VydmljZSBhbmQgdGhlCi0gICAgb3BlcmF0aW9ucyBhcmUgaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgVVJMLiBUaGUgcGFyYW1ldGVycyBhcmUgYXNzdW1lZCBhcwotICAgIHBhcmFtZXRlcnMgb2YgdGhlIFdlYiBzZXJ2aWNlLiBJbiB0aGlzIGNhc2UsIHRoZSBHRVQgYmFzZWQgUkVTVCBXZWIKLSAgICBzZXJ2aWNlcyBzdXBwb3J0IG9ubHkgc2ltcGxlIHR5cGVzIGFzIGFyZ3VtZW50cyBhbmQgaXQgc2hvdWxkIGFkaGVyZSB0bwotICAgIHRoZSA8YQotICAgIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvQ1Itd3NkbDIwLWFkanVuY3RzLTIwMDYwMzI3LyNfb3BlcmF0aW9uX2lyaV9zdHlsZSI+SVJJCi0gICAgc3R5bGU8L2E+LjwvbGk+Ci0gIDxsaT5QT1NUIGJhc2VkIFdlYiBzZXJ2aWNlcyBkbyBub3QgbmVlZCBhIFNPQVAgRW52ZWxvcGUgb3IgYSBTT0FQIEJvZHkuCi0gICAgUkVTVCBXZWIgU2VydmljZXMgZG8gbm90IGhhdmUgSGVhZGVycyBhbmQgdGhlIHBheWxvYWQgaXMgc2VudAotICBkaXJlY3RseS48L2xpPgotPC9vbD4KLQotPHA+QXhpczIgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgYSBSRVNUIENvbnRhaW5lciBhbmQgY2FuIGJlIHVzZWQgdG8gc2VuZCBhbmQKLXJlY2VpdmUgUkVTVGZ1bCBXZWIgc2VydmljZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLiBSRVNUIFdlYiBzZXJ2aWNlcyBjYW4gYmUKLWFjY2Vzc2VkIHVzaW5nIEhUVFAgR0VUIGFuZCBQT1NULjwvcD4KLTxhIG5hbWU9InJlc3Rfd2l0aF9wb3N0Ij48L2E+Ci0KLTxoMj5SRVNUIFdlYiBTZXJ2aWNlcyB3aXRoIEhUVFAgUE9TVDwvaDI+Ci0KLTxwPklmIFJFU1QgaXMgZW5hYmxlZCwgdGhlIEF4aXMyIHNlcnZlciB3aWxsIGFjdCBhcyBib3RoIGEgUkVTVCBlbmRwb2ludCBhbmQKLWEgU09BUCBlbmRwb2ludC4gV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQsIGlmIHRoZSBjb250ZW50IHR5cGUgaXMgdGV4dC94bWwKLWFuZCBpZiB0aGUgU09BUEFjdGlvbiBIZWFkZXIgaXMgbWlzc2luZywgdGhlbiB0aGUgbWVzc2FnZSBpcyB0cmVhdGVkIGFzIGEKLVJFU1RmdWwgTWVzc2FnZSwgaWYgbm90IGl0IGlzIHRyZWF0ZWQgYXMgYSB1c3VhbCBTT0FQIE1lc3NhZ2UuPC9wPgotCi08cD5PbiBzZW5kaW5nIGEgbWVzc2FnZSwgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBSRVNUZnVsIG9yIG5vdCwgY2FuIGJlCi1kZWNpZGVkIGZyb20gdGhlIGNsaWVudCBBUEkuPGJyLz4KLVNldCBhIHByb3BlcnR5IGluIHRoZSBjbGllbnQgQVBJLjxici8+Ci08L3A+Ci08cHJlPi4uLgotT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLW9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX1JFU1QsIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLS4uLjwvcHJlPgotPGEgbmFtZT0ic2FtcGxlIj48L2E+Ci0KLTxoMz5TYW1wbGUgUkVTVCAtIEhUVFAgUE9TVCBDbGllbnQ8L2gzPgotCi08cD5UaGVyZSBpcyBhbiBleGFtcGxlIG5hbWVkLCB1c2VyZ3VpZGUuY2xpZW50cy5SRVNUQ2xpZW50LmphdmEgZm91bmQgaW4KLUFYSVMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzIHdoaWNoIGRlbW9uc3RyYXRlcyB0aGUKLXVzYWdlIG9mIHRoZSBhYm92ZS4gSXQgdXNlcyB0aGUgImVjaG8iIG9wZXJhdGlvbiBvZiB0aGUKLTxjb2RlPnVzZXJndWlkZS5leGFtcGxlMS5NeVNlcnZpY2UgPC9jb2RlPm9mIHRoZQotQVhJUzJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUxLjwvcD4KLQotPHA+VGhlIGNsYXNzIHNvdXJjZSB3aWxsIGJlIGFzIGZvbGxvd3M6PC9wPjxzb3VyY2U+Ci08cHJlPnB1YmxpYyBjbGFzcyBSRVNUQ2xpZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0VwciA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvTXlTZXJ2aWNlIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSh0b0VwcikpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfUkVTVCwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZShuZXcgUU5hbWUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldFBheWxvYWQoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBnZXRQYXlsb2FkKCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG8iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiQXhpczIgRWNobyBTdHJpbmcgIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotfTwvcHJlPgotPC9zb3VyY2U+PGEgbmFtZT0icmVzdF93aXRoX2dldCI+PC9hPgotCi08aDI+QWNjZXNzIGEgUkVTVCBXZWIgU2VydmljZSB2aWEgSFRUUCBHRVQ8L2gyPgotCi08cD5BeGlzMiBhbGxvd3MgdXNlcnMgdG8gYWNjZXNzIFdlYiBzZXJ2aWNlcyB0aGF0IGhhdmUgc2ltcGxlIHR5cGUgcGFyYW1ldGVycwotdmlhIEhUVFAgR0VULiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBVUkwgcmVxdWVzdHMgdGhlIFZlcnNpb24gU2VydmljZSB2aWEKLUhUVFAgR0VULiBIb3dldmVyLCB0aGUgV2ViIHNlcnZpY2UgYXJyaXZpbmcgdmlhIEdFVCBhc3N1bWVzIFJFU1QuIE90aGVyCi1wYXJhbWV0ZXJzIGFyZSBjb252ZXJ0ZWQgaW50byBYTUwgYW5kIHB1dCBpbnRvIHRoZSBTT0FQIGJvZHkuPC9wPgotPHNvdXJjZT48cHJlPmh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9WZXJzaW9uL2dldFZlcnNpb248L3ByZT4KLTwvc291cmNlPgotPHA+VGhlIHJlc3VsdCBjYW4gYmUgc2hvd24gaW4gdGhlIGJyb3dzZXIgYXMgZm9sbG93czo8L3A+Ci08aW1nIHNyYz0iL2ltYWdlcy91c2VyZ3VpZGUvaHR0cC1nZXQtd3MuanBnIi8+Ci0KLTxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHJlcXVlc3QsPC9wPgotPHNvdXJjZT48cHJlPmh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9WZXJzaW9uL2dldFZlcnNpb248L3ByZT4KLTwvc291cmNlPndpbGwgYmUgY29udmVydGVkIGludG8gdGhlIGZvbGxvd2luZyBTT0FQIG1lc3NhZ2UgZm9yIHByb2Nlc3NpbmcgYnkKLUF4aXMyLjxzb3VyY2U+Ci08cHJlPiAKLSAgICZsdDtzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiZndDsKLSAgICAgICZsdDtzb2FwZW52OkJvZHkmZ3Q7ICAgCi0gICAgICAgICAgJmx0O2F4aXMyOmdldFZlcnNpb24geG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2dvR2V0V2l0aFJFU1QiIC8mZ3Q7Ci0gICAgICAmbHQ7L3NvYXBlbnY6Qm9keSZndDsKLSAgICZsdDsvc29hcGVudjpFbnZlbG9wZSZndDsKLSAgICA8L3ByZT4KLTwvc291cmNlPgotPGgyPlJlc291cmNlczwvaDI+Ci0KLTxwPkhvdyBJIEV4cGxhaW5lZCBSRVNUIHRvIE15IFdpZmUsIEJ5IFJ5YW4gVG9tYXlrby0gPGEKLWhyZWY9Imh0dHA6Ly9uYWVibGlzLmN4L2FydGljbGVzLzIwMDQvMTIvMTIvcmVzdC10by1teS13aWZlIj5odHRwOi8vbmFlYmxpcy5jeC9hcnRpY2xlcy8yMDA0LzEyLzEyL3Jlc3QtdG8tbXktd2lmZTwvYT48L3A+Ci0KLTxwPkJ1aWxkaW5nIFdlYiBTZXJ2aWNlcyB0aGUgUkVTVCBXYXksIEJ5IFJvZ2VyIEwuIENvc3RlbGxvLSA8YQotaHJlZj0iaHR0cDovL3d3dy54ZnJvbnQuY29tL1JFU1QtV2ViLVNlcnZpY2VzLmh0bWwiPgotaHR0cDovL3d3dy54ZnJvbnQuY29tL1JFU1QtV2ViLVNlcnZpY2VzLmh0bWw8L2E+PC9wPgotCi08cD5SZXNvdXJjZS1vcmllbnRlZCB2cy4gYWN0aXZpdHktb3JpZW50ZWQgV2ViIHNlcnZpY2VzLCBCeSBKYW1lcyBTbmVsbC0gPGEKLWhyZWY9Imh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvd2Vic2VydmljZXMvbGlicmFyeS93cy1yZXN0dnNvYXAvIj5odHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL3dlYnNlcnZpY2VzL2xpYnJhcnkvd3MtcmVzdHZzb2FwLzwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvc29hcG1vbml0b3ItbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zb2FwbW9uaXRvci1tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDg1ZGI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zb2FwbW9uaXRvci1tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPHRpdGxlPlRoZSBTT0FQIE1vbml0b3IgTW9kdWxlPC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0gIG1lZGlhPSJhbGwiLz4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+VXNpbmcgdGhlIFNPQVAgTW9uaXRvcjwvaDE+Ci0KLTxwPldlYiBzZXJ2aWNlIGRldmVsb3BlcnMgb2Z0ZW4gd2FudCB0byBzZWUgdGhlIFNPQVAgbWVzc2FnZXMgdGhhdCBhcmUgYmVpbmcKLXVzZWQgdG8gaW52b2tlIHRoZSBXZWIgc2VydmljZXMsIGFsb25nIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhvc2UgbWVzc2FnZXMuCi1UaGUgZ29hbCBvZiB0aGUgU09BUCBNb25pdG9yIHV0aWxpdHkgaXMgdG8gcHJvdmlkZSBhIHdheSBmb3IgdGhlIGRldmVsb3BlcnMKLXRvIG1vbml0b3IgdGhlc2UgU09BUCBtZXNzYWdlcyB3aXRob3V0IHJlcXVpcmluZyBhbnkgc3BlY2lhbCBjb25maWd1cmF0aW9uIG9yCi1yZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIuPC9wPgotCi08cD5JbiB0aGlzIHV0aWxpdHksIGEgaGFuZGxlciBoYXMgYmVlbiB3cml0dGVuIGFuZCBhZGRlZCB0byB0aGUgZ2xvYmFsCi1oYW5kbGVyIGNoYWluLiBBcyBTT0FQIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXJlIHJlY2VpdmVkLCB0aGUgU09BUCBtZXNzYWdlCi1pbmZvcm1hdGlvbiBpcyBmb3J3YXJkZWQgdG8gYSBTT0FQIG1vbml0b3Igc2VydmljZSB3aGVyZSBpdCBjYW4gYmUgZGlzcGxheWVkCi11c2luZyBhIFdlYiBicm93c2VyIGludGVyZmFjZS4gVGhlIFNPQVAgbWVzc2FnZSBpbmZvcm1hdGlvbiBpcyBhY2Nlc3NlZCBieSBhCi1XZWIgYnJvd3NlciBieSBnb2luZyB0byBodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvU09BUE1vbml0b3IgKHdoZXJlIDgwODAKLWlzIHRoZSBwb3J0IG51bWJlciB3aGVyZSB0aGUgYXBwbGljYXRpb24gc2VydmVyIGlzIHJ1bm5pbmcpLiBUaGUgU09BUCBtZXNzYWdlCi1pbmZvcm1hdGlvbiBpcyBkaXNwbGF5ZWQgdGhyb3VnaCBhIFdlYiBicm93c2VyIGJ5IHVzaW5nIGFuIGFwcGxldCB0aGF0IG9wZW5zCi1hIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBTT0FQIG1vbml0b3Igc2VydmljZS4gVGhpcyBhcHBsZXQgcmVxdWlyZXMgYSBKYXZhCi1wbHVnLWluIDEuMyBvciBoaWdoZXIgdG8gYmUgaW5zdGFsbGVkIGluIHlvdXIgYnJvd3Nlci4gSWYgeW91IGRvIG5vdCBoYXZlIGEKLWNvcnJlY3QgcGx1Zy1pbiwgdGhlIGJyb3dzZXIgd2lsbCBwcm9tcHQgeW91IHRvIGluc3RhbGwgb25lLiBUaGUgcG9ydCB1c2VkIGJ5Ci10aGUgU09BUCBtb25pdG9yIHNlcnZpY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBhcHBsZXRzIGlzIGNvbmZpZ3VyYWJsZS4gRWRpdAotdGhlIHdlYi54bWwgZmlsZSB0byBjaGFuZ2UgdGhlIHBvcnQgdXNlZCBieSB0aGUgQXhpczIgV2ViIGFwcGxpY2F0aW9uLjwvcD4KLQotPHA+VGhlIFNPQVAgTW9uaXRvciBtb2R1bGUgKHNvYXBtb25pdG9yLm1hcikgaXMgYXZhaWxhYmxlIGluIHRoZSBheGlzMi53YXIKLWJ1dCBpdCBpcyBub3QgZW5nYWdlZCBieSBkZWZhdWx0LiBUaGUgU09BUCBNb25pdG9yIGlzIE5PVCBlbmFibGVkIGJ5IGRlZmF1bHQKLWZvciBzZWN1cml0eSByZWFzb25zLjwvcD4KLQotPHA+VGhlIFNPQVAgTW9uaXRvciBjYW4gYmUgZW5nYWdlZCBieSBpbnNlcnRpbmcgdGhlIGZvbGxvd2luZyBpbiB0aGUKLWF4aXMyLnhtbCBmaWxlLjwvcD4KLTxzb3VyY2U+PHByZT4gICAmbHQ7bW9kdWxlIHJlZj0ic29hcG1vbml0b3IiLyZndDs8L3ByZT4KLTwvc291cmNlPgotPHA+SW4gdGhlIGF4aXMyLnhtbCBmaWxlLCBkZWZpbmUgeW91ciBwaGFzZSBvcmRlcnMgZm9yIHRoZSAnc29hcG1vbml0b3JQaGFzZScKLXJlZmVyZW5jZWQgaW4gdGhlIG1vZHVsZS54bWwgb2Ygc29hcG1vbml0b3IubWFycy4gQmVsb3cgaXMgYW4gZXhhbXBsZSB3aGljaAotc2hvdWxkIE5PVCBiZSBjb3BpZWQgZXhhY3RseSwgc2luY2UgdGhlIGRlZmF1bHQgcGhhc2VzIGNoYW5nZSBvY2Nhc2lvbmFsbHkuCi1UaGUgaW1wb3J0YW50IHBvaW50IGhlcmUgaXMgdGhhdCAnc29hcG1vbml0b3JQaGFzZScgc2hvdWxkIGJlIHBsYWNlZCB1bmRlcgotdGhlICd1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhJyBjb21tZW50IGluIHRoZSAnaW5mbG93JywKLSdvdXRmbG93JywgJ0lOZmF1bHRmbG93JywgYW5kICdPdXRmYXVsdGZsb3cnIHNlY3Rpb25zLjwvcD4KLTxwcmU+ICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9ImluZmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS1TeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLyZndDsKLSAgICAgICAgJmx0O3BoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O29yZGVyIHBoYXNlPSJEaXNwYXRjaCIvJmd0OwotICAgICAgICAgICAgJmx0Oy9oYW5kbGVyJmd0OwotICAgICAgICAgICAgJmx0O2hhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iRGlzcGF0Y2giLyZndDsKLSAgICAgICAgICAgICZsdDsvaGFuZGxlciZndDsKLSAgICAgICAgICAgICZsdDtoYW5kbGVyIG5hbWU9Ikluc3RhbmNlRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5JbnN0YW5jZURpc3BhdGNoZXIiJmd0OwotICAgICAgICAgICAgICAgICZsdDtvcmRlciBwaGFzZT0iUG9zdERpc3BhdGNoIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2hhbmRsZXImZ3Q7Ci0gICAgICAgICZsdDsvcGhhc2UmZ3Q7Ci0gICAgICAgICZsdDshLS1TeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzLS0mZ3Q7Ci0gICAgICAgICZsdDshLS1BZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50LS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Im91dGZsb3ciJmd0OwotICAgICAgICAmbHQ7IS0tdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYS0tJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvJmd0OwotICAgICAgICAmbHQ7IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLSZndDsKLSAgICAgICAgJmx0OyEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvJmd0OwotICAgICAgICAmbHQ7cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvJmd0OwotICAgICZsdDsvcGhhc2VPcmRlciZndDsKLSAgICAmbHQ7cGhhc2VPcmRlciB0eXBlPSJJTmZhdWx0ZmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS11c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OwotICAgICZsdDtwaGFzZU9yZGVyIHR5cGU9Ik91dGZhdWx0ZmxvdyImZ3Q7Ci0gICAgICAgICZsdDshLS11c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhLS0mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8mZ3Q7Ci0gICAgICAgICZsdDtwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8mZ3Q7Ci0gICAgJmx0Oy9waGFzZU9yZGVyJmd0OzwvcHJlPgotCi08cD5UbyBjb25maWd1cmUgdGhlIHNlcnZsZXQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYXBwbGV0LCBhZGQgdGhlIGZvbGxvd2luZwotY29kZSB0byB0aGUgd2ViLnhtbCAoVGhlIFNPQVBNb25pdG9yUG9ydCBpcyBjb25maWd1cmFibGUuKTo8L3A+Ci08cHJlPiAgICAmbHQ7c2VydmxldCZndDsKLSAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O1NPQVBNb25pdG9yU2VydmljZSZsdDsvc2VydmxldC1uYW1lJmd0OwotICAgICAgICZsdDtkaXNwbGF5LW5hbWUmZ3Q7U09BUE1vbml0b3JTZXJ2aWNlJmx0Oy9kaXNwbGF5LW5hbWUmZ3Q7Ci0gICAgICAgJmx0O3NlcnZsZXQtY2xhc3MmZ3Q7Ci0gICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLnNlcnZsZXQuU09BUE1vbml0b3JTZXJ2aWNlCi0gICAgICAgJmx0Oy9zZXJ2bGV0LWNsYXNzJmd0OwotICAgICAgICZsdDtpbml0LXBhcmFtJmd0OwotICAgICAgICAgICZsdDtwYXJhbS1uYW1lJmd0O1NPQVBNb25pdG9yUG9ydCZsdDsvcGFyYW0tbmFtZSZndDsKLSAgICAgICAgICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7NTAwMSZsdDsvcGFyYW0tdmFsdWUmZ3Q7Ci0gICAgICAgJmx0Oy9pbml0LXBhcmFtJmd0OwotICAgICAgICZsdDtsb2FkLW9uLXN0YXJ0dXAmZ3Q7MSZsdDsvbG9hZC1vbi1zdGFydHVwJmd0OwotICAgICZsdDsvc2VydmxldCZndDsKLQotICAgICZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7Ci0gICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7U09BUE1vbml0b3JTZXJ2aWNlJmx0Oy9zZXJ2bGV0LW5hbWUmZ3Q7Ci0gICAgICAgICZsdDt1cmwtcGF0dGVybiZndDsvU09BUE1vbml0b3ImbHQ7L3VybC1wYXR0ZXJuJmd0OwotICAgICZsdDsvc2VydmxldC1tYXBwaW5nJmd0OzwvcHJlPgotCi08cD5GaW5hbGx5LCB0aGUgYXBwbGV0IGNsYXNzZXMgbXVzdCBiZSBwbGFjZWQgaW50byB0aGUgV2ViIGFwcGxpY2F0aW9uIHNvIHRoYXQKLXRoZXkgY2FuIGJlIGxvYWRlZCBieSB0aGUgV2ViIGJyb3dzZXIuIFlvdSBjYW4gZ2V0IHRoZSBjb21waWxlZCBhcHBsZXQKLWNsYXNzZXMgZnJvbSB0aGUgV0VCLUlORi9saWIvc29hcG1vbml0b3Itc2VydmxldC1AYXhpczJfdmVyc2lvbkAuamFyIHdoaWNoIGlzIGluc2lkZQotdGhlIGV4dHJhY3RlZCBheGlzMi53YXIuIFRvIGV4dHJhY3QgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUsIHNpbXBseQotZXhlY3V0ZSB0aGUgY29tbWFuZCwgPGNvZGU+amFyIC14ZiBzb2FwbW9uaXRvci1zZXJ2bGV0LUBheGlzMl92ZXJzaW9uQC5qYXI8L2NvZGU+LgotVGhlIGFwcGxldCBjb2RlIGlzIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLmFwcGxldCBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgCi10aGUgJ29yZycgZGlyZWN0b3J5IGNyZWF0ZWQgYnkgdGhlIHVucGFja2luZyBvZiBKQVIgZmlsZSBzaG91bGQgYmUgcGxhY2VkCi1pbiAmbHQ7Q0FUQUxJTkFfSE9NRSZndDsvd2ViYXBwcy9heGlzMi8uPC9wPgotCi08cD5Vc2luZyBhIFdlYiBicm93c2VyLCBnbyB0byBodHRwW3NdOi8vaG9zdFs6cG9ydF1bL3dlYmFwcF0vU09BUE1vbml0b3IKLShlLmcuaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL1NPQVBNb25pdG9yKSBzdWJzdGl0dXRpbmcgdGhlIGNvcnJlY3QgdmFsdWVzCi1mb3IgeW91ciBXZWIgYXBwbGljYXRpb24uIFRoaXMgd2lsbCBzaG93IHRoZSBTT0FQIE1vbml0b3IgYXBwbGV0IHVzZWQgdG8gdmlldwotdGhlIHNlcnZpY2UgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4gQW55IHJlcXVlc3RzIHRvIHNlcnZpY2VzIHRoYXQgaGF2ZSBiZWVuCi1jb25maWd1cmVkIGFuZCBkZXBsb3llZCBjb3JyZWN0bHkgc2hvdWxkIHNob3cgdXAgaW4gdGhlIGFwcGxldC48L3A+Ci0KLTxwPlRoZSBTT0FQTW9uaXRvciB3aXRoIGF0dGFjaG1lbnRzIGN1cnJlbnRseSBzZXJpYWxpemVzIHRoZW1zZWx2ZXMgYXMgYmFzZTY0Ci1jaGFyYWN0ZXJzLiBJdCBpcyB0aGVyZWZvcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBUQ1BNb24gdG9vbCB0byBjb3JyZWN0bHkKLWNhcHR1cmUgTVRPTSBhbmQgU1dBIG1lc3NhZ2VzIGFzIGFuIG11bHRpcGFydCBtaW1lIHdoZXJlIHRoZSBiaW5hcnkgZGF0YSBpcwotYW4gYXR0YWNobWVudC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvc3ByaW5nLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zcHJpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY2Y2YxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zcHJpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4KLSAgPHRpdGxlPkF4aXMyIGludGVncmF0aW9uIHdpdGggdGhlIFNwcmluZyBGcmFtZXdvcms8L3RpdGxlPgotICA8bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLSAgbWVkaWE9ImFsbCIvPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJlbiI+Ci08aDE+QXhpczIgSW50ZWdyYXRpb24gd2l0aCB0aGUgU3ByaW5nIEZyYW1ld29yazwvaDE+Ci0KLTxwPlRoaXMgZG9jdW1lbnQgaXMgYSBndWlkZSBvbiBob3cgdG8gdXNlIEF4aXMyIHdpdGggdGhlIFNwcmluZyBGcmFtZXdvcms8L3A+Ci0KLTxoMj5Db250ZW50PC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiMxIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiMyIj5Db25maWd1cmluZyBBeGlzMiB0byBiZSBTcHJpbmcgQXdhcmU8L2E+Ci0gICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiMyMSI+UHJvZ3JhbW1pbmcgTW9kZWw8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjMjIiPlNpbXBsZSBTcHJpbmcgQ29uZmlnIEV4YW1wbGU8L2E+PC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjMjMiPldpdGggYSBTZXJ2bGV0Q29udGV4dDwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiMyNCI+V2l0aG91dCBhIFNlcnZsZXRDb250ZXh0PC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iIzI1Ij5QdXR0aW5nIGl0IEFsbCBUb2dldGhlcjwvYT48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiMyNiI+U3ByaW5nIEluc2lkZSBhbiBBQVIgPC9hPgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxhIGhyZWY9IiMyNjEiPlRoZSBTcHJpbmcgSW5zaWRlIGFuIEFBUiBMYXlvdXQ8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iIzI2MiI+VGhlIFNwcmluZyBJbnNpZGUgYW4gQUFSIGluaXQgQ2xhc3M8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iIzI2MyI+S25vd24gSXNzdWVzIFJ1bm5pbmcgU3ByaW5nIEluc2lkZSB0aGUKLSAgICAgICAgICBBQVI8L2E+PC9saT4KLSAgICAgICAgPC91bD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLSAgPC9saT4KLTwvdWw+Ci08YSBuYW1lPSIxIj48L2E+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5BeGlzMiBhbmQgU3ByaW5nIGludGVncmF0aW9uIHRha2VzIHBsYWNlIHdoZW4gU3ByaW5nIHN1cHBsaWVzIG9uZSBvZiBpdHMKLXByZS1sb2FkZWQgYmVhbnMgdG8gdGhlIEF4aXMyIE1lc3NhZ2UgUmVjZWl2ZXIgZGVmaW5lZCBpbiB0aGUgQUFSCi1zZXJ2aWNlcy54bWwuIEF4aXMyIHR5cGljYWxseSB1c2VzIHJlZmxlY3Rpb24gdG8gaW5zdGFudGlhdGUgdGhlIFNlcnZpY2VDbGFzcwotZGVmaW5lZCBpbiB0aGUgc2VydmljZXMueG1sIHVzZWQgYnkgdGhlIE1lc3NhZ2UgUmVjZWl2ZXIuIEFsdGVybmF0aXZlbHksIHlvdQotY2FuIGRlZmluZSBhIFNlcnZpY2VPYmplY3RTdXBwbGllciB0aGF0IHdpbGwgc3VwcGx5IHRoZSBPYmplY3QuPC9wPgotCi08cD5UaGlzIGd1aWRlIGRlc2NyaWJlcyBob3cgdG8gdXNlIHR3byBzZXBhcmF0ZSBTZXJ2aWNlT2JqZWN0U3VwcGxpZXIgY2xhc3NlcwotdGhhdCBhcmUgYSBwYXJ0IG9mIHRoZSBBeGlzMiBzdGFuZGFyZCBkaXN0cmlidXRpb24gLSBvbmUgZm9yIHVzZSB3aXRoIGEKLVNlcnZsZXRDb250ZXh0LCBhbmQgb25lIHdpdGhvdXQuIENvbmZpZ3VyaW5nIEF4aXMyIHdpdGggYSBTZXJ2bGV0Q29udGV4dCBpcyAKLXNpbXBsZXIgdGhhbiB3aXRob3V0LCBhbmQgaXMgcmVjb21tZW5kZWQgZm9yIG1vc3QgdXNlIGNhc2VzLiBXaXRob3V0IGEgCi1TZXJ2bGV0Q29udGV4dCwgaWUsIFNwcmluZyBpbnNpZGUgdGhlIEFBUiwgcmVxdWlyZXMgYW4gZXh0cmEgU3ByaW5nIGJlYW4gCi1hbmQgaXMgY29uc2lkZXJlZCBhbiBhZHZhbmNlZCB1c2UgY2FzZS4gT25jZSBjb25maWd1cmVkLCB0aGUgV2ViIHNlcnZpY2UgaXRzZWxmIAotYWN0cyBsaWtlIGFueSBvdGhlciBTcHJpbmcgd2lyZWQgYmVhbi4gVGhlc2UgU3ByaW5nIGJlYW5zIGNhbiBiZSBsb2FkZWQgYW55IHdheQotZGVzaXJlZCBhcyBBeGlzMiBoYXMgbm8gY29uZmlndXJhdGlvbiBmaWxlIGRlcGVuZGVuY2llcyBmcm9tIFNwcmluZy4gU3ByaW5nCi12ZXJzaW9ucyAxLjIuNiwgMS4yLjggYW5kIDIuMCBoYXZlIGJlZW4gdGVzdGVkLCBidXQgcHJvYmFibHkgYW55IHZlcnNpb24KLXdvdWxkIHdvcmsgYXMgb25seSB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGlzIHJlcXVpcmVkLjwvcD4KLQotPHA+VGhpcyBndWlkZSBhc3N1bWVzIHNvbWUgYmFzaWMga25vd2xlZGdlIG9mIEF4aXMyLiBTZWUgdGhlIDxhCi1ocmVmPSJ1c2VyZ3VpZGUuaHRtbCI+VXNlcidzIEd1aWRlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBuYW1lPSIyIj48L2E+Ci0KLTxoMz5Qcm9ncmFtbWluZyBNb2RlbDwvaDM+Ci0KLTxwPkZyb20gYW4gQXhpczIgc3RhbmRwb2ludCwgdHdvIGhvb2tzIGFyZSBuZWVkZWQgdG8gYmUgcGxhY2VkIGludG8gdGhlIEFBUgotc2VydmljZXMueG1sIC0gdGhlIFNlcnZpY2VPYmplY3RTdXBwbGllciB0aGF0IGhvb2tzIEF4aXMyIGFuZCBTcHJpbmcKLXRvZ2V0aGVyLCBhbmQgdGhlIG5hbWUgb2YgdGhlIFNwcmluZyBiZWFuIHRoYXQgQXhpczIgd2lsbCB1c2UgYXMgdGhlIHNlcnZpY2UuCi1BbGwgTWVzc2FnZSBSZWNlaXZlcnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsIGFzIHdvdWxkIGJlIGFueSBNZXNzYWdlCi1SZWNlaXZlciB0aGF0IGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgLjwvcD4KLTxhIG5hbWU9IjIyIj48L2E+Ci0KLTxoMz5TaW1wbGUgU3ByaW5nIENvbmZpZyBFeGFtcGxlPC9oMz4KLQotPHA+Rm9yIHRoZSBwdXJwb3NlIG9mIHRoaXMgZXhhbXBsZSwgd2UnbGwgY29uZmlndXJlIFNwcmluZyB2aWEgYSBXQVIgZmlsZSdzCi13ZWIueG1sLiBMZXQncyBhZGQgYSBjb250ZXh0LXBhcmFtIGFuZCBhIGxpc3RlbmVyOjwvcD4KLTxwcmU+Jmx0O2xpc3RlbmVyJmd0OwotICAgICAgICAmbHQ7bGlzdGVuZXItY2xhc3MmZ3Q7b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXImbHQ7L2xpc3RlbmVyLWNsYXNzJmd0OwotJmx0Oy9saXN0ZW5lciZndDsKLSZsdDtjb250ZXh0LXBhcmFtJmd0OwotICAgICAgJmx0O3BhcmFtLW5hbWUmZ3Q7Y29udGV4dENvbmZpZ0xvY2F0aW9uJmx0Oy9wYXJhbS1uYW1lJmd0OwotICAgICAgJmx0O3BhcmFtLXZhbHVlJmd0Oy9XRUItSU5GL2FwcGxpY2F0aW9uQ29udGV4dC54bWwmbHQ7L3BhcmFtLXZhbHVlJmd0OwotJmx0Oy9jb250ZXh0LXBhcmFtJmd0OzwvcHJlPgotCi08cD5OZXh0IHdlIHdpbGwgc2hvdyB0d28gZXhhbXBsZXMgb2YgU3ByaW5nJ3MgL1dFQi1JTkYvYXBwbGljYXRpb25Db250ZXh0LnhtbAotcmVmZXJlbmNlZCBpbiB0aGUgd2ViLnhtbCBsaXN0ZW5lciAtICBvbmUgdXNpbmcgYSBTZXJ2bGV0Q29udGV4dCwgYW5kIG9uZQotd2l0aG91dC48L3A+Ci08YSBuYW1lPSIyMyI+PC9hPgotCi08aDM+V2l0aCBhIFNlcnZsZXRDb250ZXh0PC9oMz4KLQotPHA+VGhpcyBleGFtcGxlICh3aXRoIGEgU2VydmxldENvbnRleHQpIGFwcGxpY2F0aW9uQ29udGV4dC54bWwgc2hvdWxkIGJlCi1mYW1pbGlhciB0byBhbnkgU3ByaW5nIHVzZXI6PC9wPgotPHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0OyFET0NUWVBFIGJlYW5zIFBVQkxJQyAiLS8vU1BSSU5HLy9EVEQgQkVBTi8vRU4iICJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvZHRkL3NwcmluZy1iZWFucy5kdGQiJmd0OwotCi0mbHQ7YmVhbnMmZ3Q7Ci0gICZsdDshLS0gQXhpczIgV2ViIFNlcnZpY2UsIGJ1dCB0byBTcHJpbmcsIGl0cyBqdXN0IGFub3RoZXIgYmVhbiB0aGF0IGhhcyBkZXBlbmRlbmNpZXMgLS0mZ3Q7Ci0gICZsdDtiZWFuIGlkPSJzcHJpbmdBd2FyZVNlcnZpY2UiIGNsYXNzPSJzcHJpbmcuU3ByaW5nQXdhcmVTZXJ2aWNlIiZndDsKLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0ibXlCZWFuIiByZWY9Im15QmVhbiIvJmd0OwotICAmbHQ7L2JlYW4mZ3Q7Ci0KLSAgJmx0OyEtLSBqdXN0IGFub3RoZXIgYmVhbiAvIGludGVyZmFjZSB3aXRoIGEgd2lyZWQgaW1wbGVtZW50YXRpb24sIHRoYXQncyBpbmplY3RlZCBieSBTcHJpbmcKLSAgICAgICAgICBpbnRvIHRoZSBXZWIgU2VydmljZSAtLSZndDsKLSAgICZsdDtiZWFuIGlkPSJteUJlYW4iIGNsYXNzPSJzcHJpbmcuTXlCZWFuSW1wbCImZ3Q7Ci0gICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJ2YWwiIHZhbHVlPSJTcHJpbmcsIGVtZXJnZSB0aHlzZWxmIiAvJmd0OwotICAmbHQ7L2JlYW4mZ3Q7Ci0mbHQ7L2JlYW5zJmd0OzwvcHJlPgotCi08cD5JZiB0aGUgc2VydmljZSBpcyBydW5uaW5nIGluIGEgU2VydmxldCBDb250YWluZXIsIGkuZS4sIEF4aXMyIHdpbGwgYmUgYWJsZQotdG8gZ2V0IGEgaG9sZCBvZiB0aGUgU2VydmxldENvbnRleHQsIHRoZSBzZXJ2aWNlcy54bWwgZm9yIHRoZSBleGFtcGxlIHdvdWxkCi1iZSB1c2luZyBTcHJpbmdTZXJ2bGV0Q29udGV4dE9iamVjdFN1cHBsaWVyIHN1Y2ggYXM6PC9wPgotPHByZT4gJmx0O3NlcnZpY2UgbmFtZT0iU3ByaW5nQXdhcmVTZXJ2aWNlIiZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgIHNpbXBsZSBzcHJpbmcgZXhhbXBsZQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlT2JqZWN0U3VwcGxpZXIiJmd0O29yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLlNwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXImbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNwcmluZ0JlYW5OYW1lIiZndDtzcHJpbmdBd2FyZVNlcnZpY2UmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImdldFZhbHVlIiZndDsKLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsKLSAgICAmbHQ7L29wZXJhdGlvbiZndDsKLSZsdDsvc2VydmljZSZndDsgPC9wcmU+Ci0KLTxwPldoaWxlIHRoZSBhYm92ZSBleGFtcGxlIHVzZXMgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIgYXMgaXRzCi1tZXNzYWdlUmVjZWl2ZXIgY2xhc3MsIGFsbCBNZXNzYWdlIFJlY2VpdmVycyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCwgYXMKLXdvdWxkIGJlIGFueSBNZXNzYWdlIFJlY2VpdmVyIHRoYXQgZXh0ZW5kcwotb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgLjwvcD4KLTxhIG5hbWU9IjI0Ij48L2E+Ci0KLTxoMz5XaXRob3V0IGEgU2VydmxldENvbnRleHQ8L2gzPgotCi08cD5JbiBjYXNlIEF4aXMyIGNhbid0IGdldCBhIFNlcnZsZXRDb250ZXh0LCAoaS5lLiwgdXNlcyBhIGRpZmZlcmVudAotdHJhbnNwb3J0IG9yIGlzIHJ1bm5pbmcgQXhpczIgaW5zaWRlIHRoZSBBQVIgZXRjLCkgeW91IGhhdmUgdGhlIG9wdGlvbiBvZgotZGVmaW5pbmcgYSBiZWFuIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIFNwcmluZydzIGludGVybmFsIGFiaWxpdGllcwotKEFwcGxpY2F0aW9uQ29udGV4dEF3YXJlIGludGVyZmFjZSwgc3BlY2lmaWNhbGx5KSB0byBwcm92aWRlIGFuIEFwcGxpY2F0aW9uCi1Db250ZXh0IHRvIEF4aXMyLCB3aXRoIGEgYmVhbiByZWYgJ2FwcGxpY2F0aW9uQ29udGV4dCcgOjwvcD4KLTxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDshRE9DVFlQRSBiZWFucyBQVUJMSUMgIi0vL1NQUklORy8vRFREIEJFQU4vL0VOIiAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL2R0ZC9zcHJpbmctYmVhbnMuZHRkIiZndDsKLQotJmx0O2JlYW5zJmd0OwotICAmbHQ7IS0tIENvbmZpZ3VyZSBzcHJpbmcgdG8gZ2l2ZSBhIGhvb2sgdG8gYXhpczIgd2l0aG91dCBhIFNlcnZsZXRDb250ZXh0IC0tJmd0OwotICAmbHQ7YmVhbiBpZD0iYXBwbGljYXRpb25Db250ZXh0IiAKLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuQXBwbGljYXRpb25Db250ZXh0SG9sZGVyIiAvJmd0OwotCi0gICZsdDshLS0gQXhpczIgV2ViIFNlcnZpY2UsIGJ1dCB0byBTcHJpbmcsIGl0cyBqdXN0IGFub3RoZXIgYmVhbiB0aGF0IGhhcyBkZXBlbmRlbmNpZXMgLS0mZ3Q7Ci0gICZsdDtiZWFuIGlkPSJzcHJpbmdBd2FyZVNlcnZpY2UiCi0gICAgICAgIGNsYXNzPSJzcHJpbmcuU3ByaW5nQXdhcmVTZXJ2aWNlIiZndDsKLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0ibXlCZWFuIiByZWY9Im15QmVhbiIgLyZndDsKLSAgJmx0Oy9iZWFuJmd0OwotCi0gICZsdDshLS0ganVzdCBhbm90aGVyIGJlYW4gd2l0aCBhIHdpcmVkIGltcGxlbWVudGF0aW9uLCB0aGF0J3MgaW5qZWN0ZWQgYnkgU3ByaW5nIAotICAgICAgICAgIGludG8gdGhlIFdlYiBTZXJ2aWNlIC0tJmd0OwotICAgJmx0O2JlYW4gaWQ9Im15QmVhbiIKLSAgICAgICAgY2xhc3M9InNwcmluZy5NeUJlYW5JbXBsIiZndDsKLSAgICAgJmx0O3Byb3BlcnR5IG5hbWU9InZhbCIgdmFsdWU9IlNwcmluZywgZW1lcmdlIHRoeXNlbGYiIC8mZ3Q7Ci0gICZsdDsvYmVhbiZndDsKLSZsdDsvYmVhbnMmZ3Q7PC9wcmU+Ci0KLTxwPklmIHRoZSBzZXJ2aWNlIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHJ1bm5pbmcgaW4gYSBTZXJ2bGV0IENvbnRhaW5lciwKLWkuZS4sIEF4aXMyIHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IGEgaG9sZCBvZiBTZXJ2bGV0Q29udGV4dCBvciB5b3UgcHJlZmVyCi1ub3QgdG8sIHRoZSBzZXJ2aWNlcy54bWwgZm9yIHRoZSBleGFtcGxlIHdpbGwgYmUgdXNpbmcKLVNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyIHN1Y2ggYXM6PC9wPgotPHByZT4gJmx0O3NlcnZpY2UgbmFtZT0iU3ByaW5nQXdhcmVTZXJ2aWNlIiZndDsKLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gICAgICAgIHNpbXBsZSBzcHJpbmcgZXhhbXBsZQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7Ci0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTZXJ2aWNlT2JqZWN0U3VwcGxpZXIiJmd0O29yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLlNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICAgJmx0O3BhcmFtZXRlciBuYW1lPSJTcHJpbmdCZWFuTmFtZSImZ3Q7c3ByaW5nQXdhcmVTZXJ2aWNlJmx0Oy9wYXJhbWV0ZXImZ3Q7Ci0gICAgJmx0O29wZXJhdGlvbiBuYW1lPSJnZXRWYWx1ZSImZ3Q7Ci0gICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7Ci0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7Ci0mbHQ7L3NlcnZpY2UmZ3Q7IDwvcHJlPgotCi08cD5XaGlsZSB0aGUgYWJvdmUgZXhhbXBsZSB1c2VzIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIGFzIGl0cwotbWVzc2FnZVJlY2VpdmVyIGNsYXNzLCBhbGwgTWVzc2FnZSBSZWNlaXZlcnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQsIGFzCi13b3VsZCBiZSBhbnkgTWVzc2FnZSBSZWNlaXZlciB0aGF0IGV4dGVuZHMKLW9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0TWVzc2FnZVJlY2VpdmVyIC48L3A+Ci0KLTxwPkluIGFuIGVudmlyb25tZW50IDxzdHJvbmc+d2l0aG91dCBhIFNlcnZsZXRDb250ZXh0PC9zdHJvbmc+LCBvbmUgd2F5IHlvdQotY291bGQgbG9hZCB0aGUgYXBwbGljYXRpb25Db250ZXh0LnhtbCBmaWxlIGlzIGluIGEgcGxhY2UgdGhhdCB3aWxsIGJlIHJ1bgotb25jZS4gVXBvbiBzdGFydC11cCwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nOjwvcD4KLTxwcmU+aW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkNsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dDsKLQotIHB1YmxpYyB2b2lkIGNyZWF0ZVNwcmluZ0FwcEN0eChDbGFzc0xvYWRlciBjbCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGN0eCA9IG5ldwotICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0KG5ldyBTdHJpbmdbXSB7Q29uc3RhbnRzLk1ZX1BBVEggKwotICAgICAgInNwcmluZy9hcHBsaWNhdGlvbkNvbnRleHQueG1sIn0sIGZhbHNlKTsKLSAgICAgICAgICAgY3R4LnNldENsYXNzTG9hZGVyKGNsKTsKLSAgICAgICAgICAgY3R4LnJlZnJlc2goKTs8L3ByZT4KLX0gPGEgbmFtZT0iMjUiPjwvYT4KLQotPGgzPlB1dHRpbmcgSXQgQWxsIFRvZ2V0aGVyPC9oMz4KLQotPHA+RnJvbSBoZXJlLCBpdCdzIGp1c3Qgc3RhbmRhcmQgQXhpczIgY29kaW5nLiBPbmx5IG5vdyB0aGUgc2VydmljZSBoYXMKLVNwcmluZyB3aXJpbmcgY2FwYWJpbGl0aWVzLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgdGhlIHNhbWUgd2hldGhlciB1c2luZwotZWl0aGVyIFNwcmluZ1NlcnZsZXRDb250ZXh0T2JqZWN0U3VwcGxpZXIgb3IKLVNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyLiBUaGUgc2VydmljZSBpcyBhcyBmb2xsb3dzOjwvcD4KLTxwcmU+cGFja2FnZSBzcHJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdBd2FyZVNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBNeUJlYW4gbXlCZWFuID0gbnVsbDsKLQotICAgIC8vc3ByaW5nICdpbmplY3RzJyB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgcHVibGljIHZvaWQgc2V0TXlCZWFuKE15QmVhbiBteUJlYW4pIHsKLSAgICAgICAgICAgIHRoaXMubXlCZWFuID0gbXlCZWFuOwotICAgIH0KLQotICAgIC8vIFRoZSB3ZWIgc2VydmljZQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0VmFsdWUoT01FbGVtZW50IGlnbm9yZSkgewotICAgICAgICAgICAgT01GYWN0b3J5IGZhY3Rvcnk9Ci0gICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBwYXlsb2FkTnM9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zcHJpbmdFeGFtcGxlLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOwotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJzdHJpbmciLCBwYXlsb2FkTnMpOwotICAgICAgICAgICAgT01UZXh0IHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVPTVRleHQodGhpcy5teUJlYW4uZW1lcmdlKCkpOwotICAgICAgICAgICAgcGF5bG9hZC5hZGRDaGlsZChyZXNwb25zZSk7Ci0gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDsKLSAgICB9Ci19IDwvcHJlPgotCi08cD5Gb3IgdGhvc2Ugd2hvIGFyZSBuZXcgdG8gU3ByaW5nLCBvbmUgb2YgdGhlIGlkZWFzIGlzIHRoYXQgeW91IHByb2dyYW0gYW4KLUludGVyZmFjZSwgYXMgdGhlIGltcGxlbWVudGF0aW9uIGlzIHBsdWdnYWJsZS4gVGhpcyBpZGVhIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi1TcHJpbmcgY29uZmlnIGZpbGUgYWJvdmUuIEJlbG93IGlzIHRoZSBpbnRlcmZhY2U6PC9wPgotPHByZT5wYWNrYWdlIHNwcmluZzsKLQotLyoqIEludGVyZmFjZSBmb3IgU3ByaW5nIGF3YXJlIEJlYW4gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXlCZWFuIHsKLSAgICAgICAgIFN0cmluZyBlbWVyZ2UoKTsKLX08L3ByZT4KLQotPHA+SGVyZSdzIHRoZSBpbXBsZW1lbnRhdGlvbjo8L3A+Ci08cHJlPi8qKiBTcHJpbmcgd2lyZWQgaW1wbGVtZW50YXRpb24gKi8KLXB1YmxpYyBjbGFzcyBNeUJlYW5JbXBsIGltcGxlbWVudHMgTXlCZWFuIHsKLQotICAgIFN0cmluZyBzdHIgPSBudWxsOwotICAgIC8vIHNwcmluZyAnaW5qZWN0cycgdGhpcyB2YWx1ZQotICAgIHB1YmxpYyB2b2lkIHNldFZhbChTdHJpbmcgcykgewotICAgICAgICBzdHIgPSBzOwotICAgIH0KLSAgICAvLyB3ZWIgc2VydmljZSBnZXRzIHRoaXMgdmFsdWUKLSAgICBwdWJsaWMgU3RyaW5nIGVtZXJnZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19PC9wcmU+Ci0KLTxwPkxhc3RseSBoZXJlJ3MgdGhlIGNsaWVudCAtIG5vdCByZWFsbHkgbmVjZXNzYXJ5IGZvciB0aGUgZXhhbXBsZSwgb3RoZXIKLXRoYW4gZm9yIGNvbXBsZXRlbmVzczo8L3A+Ci08cHJlPnBhY2thZ2UgY2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotcHVibGljIGNsYXNzIFRlc3RDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9Ci0gICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3ByaW5nQXdhcmVTZXJ2aWNlIik7Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgYXhpczIgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MgTWFpbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vc3ByaW5nRXhhbXBsZS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJnZXRWYWx1ZSIsIG9tTnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIlRleHQiLCBvbU5zKTsKLSAgICAgICAgICAgIHZhbHVlLmFkZENoaWxkKGZhY3RvcnkuY3JlYXRlT01UZXh0KHZhbHVlLCAiU29tZSBTdHJpbmcgIikpOwotICAgICAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLQotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIHNlcnZpY2VDbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICAgICAgLy9CbG9ja2luZyBpbnZvY2F0aW9uCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShtZXRob2QpOwotCi0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZShYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpKTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3BvbnNlOiAiICsgd3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfSA8L3ByZT4KLQotPHA+VGhlIGV4YW1wbGVzIGFib3ZlIGFzc3VtZSB0aGF0IGJvdGggdGhlIHNwcmluZyBmcmFtZXdvcmsgLmphciBhbmQgdGhlCi1heGlzMi1zcHJpbmctKi5qYXIgYXJlIHVuZGVyIFdFQi1JTkYvbGliLiBJbiBzdWNoIGEgY2FzZSwgdGhlIGNsYXNzZXMgc2hvd24KLWluIHRoaXMgdHV0b3JpYWwgbmVlZCB0byBiZSBwbGFjZWQgaW4gYSBKQVIgdW5kZXIgV0VCLUlORi9saWIuIEluIHRoaXMKLWV4YW1wbGUgdGhlIEpBUiBsYXlvdXQgaXM6PC9wPgotPHNvdXJjZT48cHJlPi4vbXlTcHJpbmcuamFyCi0uL01FVEEtSU5GCi0uL01FVEEtSU5GL01BTklGRVNULk1GCi0uL3NwcmluZwotLi9zcHJpbmcvTXlCZWFuLmNsYXNzCi0uL3NwcmluZy9NeUJlYW5JbXBsLmNsYXNzCi0uL3NwcmluZy9TcHJpbmdBd2FyZVNlcnZpY2UuY2xhc3M8L3ByZT4KLTwvc291cmNlPgotPHA+U2luY2UgYWxsIHRoZSB1c2VyIGNsYXNzZXMgYXJlIGluIG15U3ByaW5nLmphciBpbiB0aGlzIGV4YW1wbGUsIHRoZSBBQVIKLW1lcmVseSBjb250YWlucyB0aGUgc2VydmljZXMueG1sIGZpbGU6PC9wPgotPHNvdXJjZT48cHJlPi4vc3ByaW5nRXhhbXBsZS5hYXIKLS4vTUVUQS1JTkYKLS4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKLS4vTUVUQS1JTkYvc2VydmljZXMueG1sPC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRvIHJ1biB0aGlzIGV4YW1wbGUsIG1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGUgYXhpczItc3ByaW5nKi5qYXIgdGhhdCBjb21lcwotZnJvbSB0aGUgYXhpczItc3RkLSotYmluIGRpc3RybyBpbiB0aGUgc2VydmVyIHNpZGUgV0VCLUlORi9saWIsIGFzIHdlbGwgYXMKLXRoZSBhcHByb3ByaWF0ZSBTcHJpbmcgamFyIC0gbW9zdCB3aWxsIHVzZSB0aGUgZnVsbCBzcHJpbmcuamFyLCBidXQgdGhlCi1taW5pbXVtIHJlcXVpcmVtZW50cyBhcmUgc3ByaW5nLWNvcmUsIHNwcmluZy1iZWFucywgc3ByaW5nLWNvbnRleHQsIGFuZAotc3ByaW5nLXdlYi4gV2hlbiBydW5uaW5nIHRoZSBjbGllbnQsIHlvdSBzaG91bGQgc2VlIHRoaXMgb3V0cHV0OjwvcD4KLTxwcmU+UmVzcG9uc2U6ICZsdDtleGFtcGxlMTpzdHJpbmcgeG1sbnM6ZXhhbXBsZTE9Imh0dHA6Ly9zcHJpbmdFeGFtcGxlLm9yZy9leGFtcGxlMSIgCi0gIHhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiJmd0O1NwcmluZywgZW1lcmdlIHRoeXNlbGYmbHQ7L2V4YW1wbGUxOnN0cmluZyZndDs8L3ByZT4KLTxhIG5hbWU9IjI2Ij48L2E+Ci0KLTxoMz5TcHJpbmcgSW5zaWRlIGFuIEFBUjwvaDM+Ci0KLTxwPkF4aXMyIHVzZXJzIGZyZXF1ZW50bHkgd2FudCB0byBydW4gU3ByaW5nIGluc2lkZSB0aGUgQUFSLiBIZXJlIHdlIHNob3cgeW91Ci1ob3cgaXQgaXMgZG9uZS4gVGhlcmUgYXJlIGZvdXIgcG9pbnRzIHRvIGJlIGF3YXJlIG9mOjwvcD4KLQotPHA+KEEpIFlvdSBuZWVkIHRvIGNvbmZpZ3VyZSBTcHJpbmcgdG8gdXNlIHRoZSBBeGlzMiBTZXJ2aWNlIENsYXNzbG9hZGVyLiBTZWUKLXRoZSA8YSBocmVmPSIjMjYzIj5Lbm93biBpc3N1ZXMgcnVubmluZyBTcHJpbmcgaW5zaWRlIHRoZSBBQVI8L2E+IGFyZWEuPC9wPgotCi08cD4oQikgSXQncyB1cCB0byB5b3UgdG8gbG9hZCBTcHJpbmcsIHRob3VnaCB3ZSBnaXZlIGFuIGV4YW1wbGUgYmVsb3cuPC9wPgotCi08cD4oQykgRm9yIHJlYXNvbnMgc3VjaCBhcyBjbGFzc2xvYWRlciBpc29sYXRpb24sIHRoZQotU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIgaXMgdGhlIGJlc3QgY2hvaWNlLjwvcD4KLQotPHA+KEQpIFRoZSBzcHJpbmdmcmFtZXdvcmsgLmphciBhbmQgYXhpczItc3ByaW5nLSouamFyIHdpbGwgYmUgcGxhY2VkIGluc2lkZQotdGhlIEFBUiB1bmRlciB0aGUgbGliIGRpcmVjdG9yeS4gUGxlYXNlIDxzdHJvbmc+bW92ZTwvc3Ryb25nPiB0aGUKLWF4aXMyLXNwcmluZy0qLmphciBmcm9tIFdFQi1JTkYvbGliIHRvIGluc2lkZSB0aGUgQUFSLCBhcyBzaG93biBiZWxvdyAtIGl0Ci13aWxsIDxzdHJvbmc+bm90PC9zdHJvbmc+IHdvcmsgb3RoZXJ3aXNlLjwvcD4KLTx1bD4KLSAgPGxpPjxzdHJvbmc+PGEgbmFtZT0iMjYxIj48L2E+VGhlIFNwcmluZyBpbnNpZGUgYW4gQUFSIGxheW91dDwvc3Ryb25nPjwvbGk+Ci08L3VsPgotPHNvdXJjZT48cHJlPi4vc3ByaW5nRXhhbXBsZS5hYXIKLS4vTUVUQS1JTkYKLS4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKLS4vTUVUQS1JTkYvc2VydmljZXMueG1sCi0uL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKLS4vbGliCi0uL2xpYi9heGlzMi1zcHJpbmctMS40LmphcgotLi9saWIvc3ByaW5nLmphcgotLi9zcHJpbmcKLS4vc3ByaW5nL015QmVhbi5jbGFzcwotLi9zcHJpbmcvTXlCZWFuSW1wbC5jbGFzcwotLi9zcHJpbmcvU3ByaW5nQXdhcmVTZXJ2aWNlLmNsYXNzCi0uL3NwcmluZy9TcHJpbmdJbml0LmNsYXNzIDwvcHJlPgotPC9zb3VyY2U+Ci08cD5BcyBleHBsYWluZWQgaW4gdGhlIDxhIGhyZWY9IiMyNCI+V2l0aG91dCBhIFNlcnZsZXRDb250ZXh0PC9hPiBzZWN0aW9uLAotdGhlICdTcHJpbmcgaW5zaWRlIGFuIEFBUicgY29uZmlnIG5lZWRzIHRvIGhvb2sgQXhpczIgYW5kIFNwcmluZyB0b2dldGhlciB2aWEKLWEgU3ByaW5nIGJlYW4uIFBsYWNlIHRoZSBmb2xsb3dpbmcgaW4geW91ciBTcHJpbmcgY29uZmlnIGZpbGU6PC9wPgotPHByZT4gICZsdDshLS0gQ29uZmlndXJlIHNwcmluZyB0byBnaXZlIGEgaG9vayB0byBheGlzMiB3aXRob3V0IGEgU2VydmxldENvbnRleHQgLS0mZ3Q7Ci0gICZsdDtiZWFuIGlkPSJhcHBsaWNhdGlvbkNvbnRleHQiIAotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVycy5BcHBsaWNhdGlvbkNvbnRleHRIb2xkZXIiIC8mZ3Q7PC9wcmU+Ci08dWw+Ci0gIDxsaT48c3Ryb25nPjxhIG5hbWU9IjI2MiI+PC9hPlRoZSBTcHJpbmcgaW5zaWRlIGFuIEFBUiBpbml0Ci0gIGNsYXNzPC9zdHJvbmc+PC9saT4KLTwvdWw+Ci0KLTxwPk9uZSB3YXkgdG8gaW5pdGlhbGl6ZSBTcHJpbmcgaW5zaWRlIHRoZSBBQVIgaXMgdG8gdXNlIHRoZQotb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuU2VydmljZUxpZmVDeWNsZSBpbnRlcmZhY2UuIEhlcmUgd2UgZ2l2ZSBhbgotZXhhbXBsZTo8L3A+Ci08c291cmNlPjxwcmU+cGFja2FnZSBzcHJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5TZXJ2aWNlTGlmZUN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5zdXBwb3J0LkNsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFNwcmluZ0luaXQgaW1wbGVtZW50cyBTZXJ2aWNlTGlmZUN5Y2xlIHsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGRlcGxveWVtZW50IHRpbWUgb2YgdGhlIHNlcnZpY2UuIAotICAgICAqIGlycmVzcGVjdGl2ZQotICAgICAqIG9mIHRoZSBzZXJ2aWNlIHNjb3BlIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRVcChDb25maWd1cmF0aW9uQ29udGV4dCBpZ25vcmUsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgc3ByaW5nIGluaXQiKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGFwcEN0eCA9IG5ldwotICAgICAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0KG5ldyBTdHJpbmdbXSB7ImFwcGxpY2F0aW9uQ29udGV4dC54bWwifSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGFwcEN0eC5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgYXBwQ3R4LnJlZnJlc2goKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic3ByaW5nIGxvYWRlZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIHN5c3RlbSBzaHV0IGRvd24gdGltZS4gCi0gICAgICogaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0RG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjdHhJZ25vcmUsIEF4aXNTZXJ2aWNlIGlnbm9yZSkgewotICAgIH0KLX08L3ByZT4KLTwvc291cmNlPgotPHA+SGVyZSdzIHRoZSBzZXJ2aWNlcy54bWwgdGhhdCBub3cgaW5jbHVkZXMgU3ByaW5nSW5pdCBhbmQgdGhlCi1TcHJpbmdBd2FyZVNlcnZpY2Ugc2hvd24gYWJvdmUuIFRoZXJlIGlzIGFsc28gdGhlIGNvbXBvc2l0ZSBwYXJhbWV0ZXIgd2hpY2gKLWlzIG5lZWRlZCB3aGVuIGxvYWRpbmcgU3ByaW5nIGluIHRoZSBBQVIgLSBzZWUgdGhlIDxhIGhyZWY9IiMyNjMiPktub3duCi1pc3N1ZXMgcnVubmluZyBTcHJpbmcgaW5zaWRlIHRoZSBBQVI8L2E+IGFyZWEuPC9wPgotPHNvdXJjZT48cHJlPiZsdDtzZXJ2aWNlR3JvdXAmZ3Q7Ci0gICZsdDshLS0gSW52b2tlIFNwcmluZ0luaXQgb24gc2VydmVyIHN0YXJ0dXAgYW5kIHNodXRkb3duIC0tJmd0OwotICAmbHQ7c2VydmljZSBuYW1lPSJTcHJpbmdBd2FyZVNlcnZpY2UiIGNsYXNzPSJzcHJpbmcuU3ByaW5nSW5pdCImZ3Q7Ci0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICAgc2ltcGxlIHNwcmluZyBleGFtcGxlIC0gaW5zaWRlIHRoZSBBQVIKLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAgICZsdDshLS0gbmVlZCB0aGUgVENDTCBwYXJhbSB3aGVuIHVzaW5nIHNwcmluZyBpbnNpZGUgdGhlIEFBUiAtLSZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VUQ0NMIiZndDtjb21wb3NpdGUmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VPYmplY3RTdXBwbGllciImZ3Q7b3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXImbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNwcmluZ0JlYW5OYW1lIiZndDtzcHJpbmdBd2FyZVNlcnZpY2UmbHQ7L3BhcmFtZXRlciZndDsKLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImdldFZhbHVlIiZndDsKLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsKLSAgICAmbHQ7L29wZXJhdGlvbiZndDsKLSAgJmx0Oy9zZXJ2aWNlJmd0OwotJmx0Oy9zZXJ2aWNlR3JvdXAmZ3Q7PC9wcmU+Ci08L3NvdXJjZT48dWw+Ci0gIDxsaT48c3Ryb25nPjxhIG5hbWU9IjI2MyI+PC9hPktub3duIGlzc3VlcyBydW5uaW5nIFNwcmluZyBpbnNpZGUgdGhlCi0gICAgQUFSPC9zdHJvbmc+PC9saT4KLTwvdWw+Ci0KLTxwPkJ5IGRlZmF1bHQsIHRoZSBBeGlzMiBjbGFzc2xvYWRlciBzdHJhdGVneSBkb2VzIG5vdCBwZXJtaXQgU3ByaW5nIHRvIHJ1bgotaW5zaWRlIHRoZSBBQVIuIFRvIGFsbG93IFNwcmluZyB0byBydW4gaW5zaWRlIHRoZSBBQVIsIHRoZSAnY29tcG9zaXRlJwotcGFyYW1ldGVyIGlzIHVzZWQgaW4gdGhlIHNlcnZpY2VzLnhtbCBhcyBzaG93biBpbiB0aGUgZXhhbXBsZSBhYm92ZS4gVGhlcmUKLXdhcyBkZWZhdWx0IGJlaGF2aW9yIG9mICdjb21wb3NpdGUnIGluIHRoZSBkZXZlbG9wbWVudCBjeWNsZSBpbiBiZXR3ZWVuIDEuMAotYW5kIDEuMSwgYnV0IGl0IHJlc3VsdGVkIGluIHRoZSBKSVJBIGlzc3VlIEFYSVMyLTEyMTQgLXByb2JsZW1zIHdpdGggZ2V0dGluZwotYW4gaW5pdENvbnRleHQubG9va3VwKCkgaGFuZGxlIGluc2lkZSB0aGUgQUFSLiBTcHJpbmcgdXNlcnMgdHlwaWNhbGx5IGhhdmUKLWxpdHRsZSBkZXNpcmUgdG8gdXNlIGluaXRDb250ZXh0Lmxvb2t1cCgpLCBhcyB0aGV5IGdldCB0aGVpciBEYXRhc291cmNlcyB2aWEKLW9yZy5zcHJpbmdmcmFtZXdvcmsuamRiYy5kYXRhc291cmNlLkRyaXZlck1hbmFnZXJEYXRhU291cmNlIGluIGFuIFhNTCBmaWxlIG9yCi13aXRoIGFubm90YXRpb25zLiBGb3IgRUpCIGhvbWUgcmVmZXJlbmNlcyBhbmQgdGhlIGxpa2UsIFNwcmluZyBwcm92aWRlcwotSm5kaU9iamVjdEZhY3RvcnlCZWFuLiA8L3A+Ci0KLTxwPkEgY29tbW9uIHJlcXVpcmVtZW50IGlzIHRvIHJ1biBIaWJlcm5hdGUgYWxvbmcgd2l0aCBTcHJpbmcgd2l0aCBBeGlzMiB3ZWIgc2VydmljZXMuCi1JdCBpcyBlYXNpZXIgdG8gcnVuIEhpYmVybmF0ZSBhcyB3ZWxsIGFzIFNwcmluZyBvdXRzaWRlIHRoZSBBQVIgYXMgc2hvd24gaW4gdGhlIAotU2VydmxldENvbnRleHQgZXhhbXBsZSwgaWUsIHBsYWNlIHRoZSBTcHJpbmcgYW5kIEhpYmVybmF0ZSBqYXJzIGluIFdFQi1JTkYvbGliIGFuZCAKLXRoZSBoaWJlcm5hdGUgY29uZmlnIGZpbGVzIHVuZGVyIFdFQi1JTkYvY2xhc3Nlcy4gV2l0aCB0aGF0IGFkdmlzZW1lbnQsIFNwcmluZyBwcm92aWRlcwotYW4gQVBJIHRoYXQgYWxsb3dzIFNwcmluZyB0byBsb2FkIEhpYmVybmF0ZSB1bmRlciB0aGUgY29udHJhaW50cyBvZiBhbiBBQVIuIDwvcD4KLQotPHA+SGliZXJuYXRlIGJ5IGRlZmF1bHQgbG9va3MgZm9yIGl0cyBjb25maWcgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aC4gQnkgcnVubmluZyBIaWJlcm5hdGUKLWluc2lkZSB0aGUgQUFSLCBIaWJlcm5hdGUgd29uJ3QgYmUgYWJsZSB0byBmaW5kIGl0cyBjb25maWcgZmlsZXMuIFRoZSB3YXkgdG8gZ2V0IAotYXJvdW5kIHRoaXMgbGltaXRhdGlvbiBpcyBlaXRoZXIgdG8gZXhwYW5kIHRoZSBBQVIgb3IgcGxhY2UgdGhlIGhpYmVybmF0ZSBjb25maWcKLWZpbGVzIGluIGEgc3BlY2lmaWMgZGlyZWN0b3J5IHVuZGVyIFdFQi1JTkYvY2xhc3NlcyAtIGFuZCB0aGVuIHVzZSAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kb2NzL2FwaS9vcmcvc3ByaW5nZnJhbWV3b3JrL29ybS9oaWJlcm5hdGUvTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW4uaHRtbCNzZXRNYXBwaW5nRGlyZWN0b3J5TG9jYXRpb25zKG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5pby5SZXNvdXJjZVtdKSI+U3ByaW5nJ3Mgc2V0TWFwcGluZ0RpcmVjdG9yeUxvY2F0aW9uczwvYT4gZm9yIHNldmVyYWwgb3B0aW9ucy4gIDwvcD4KLQotPHA+QnkgcGxhY2luZyBTcHJpbmcgaW50byBERUJVRyBtb2RlIHlvdSBjYW4gbG9vayBhdCB0aGUgbG9ncyB0byBzZWUgd2hlcmUgU3ByaW5nIHdpbGwgbG9vawotZm9yIHlvdXIgamFyIC8gY2xhc3MgbG9jYXRpb25zLiBVc2UgdGhlIHdpbGRjYXJkcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgdG8gbGlzdCB5b3VyIG1hcHBpbmcgCi1sb2NhdGlvbnMgYXMgc2hvd246ICA8L3A+Ci0KLTxzb3VyY2U+PHByZT4mbHQ7YmVhbiBpZD0ibXlTZXNzaW9uRmFjdG9yeSIgY2xhc3M9Im9yZy5zcHJpbmdmcmFtZXdvcmsub3JtLmhpYmVybmF0ZTMuTG9jYWxTZXNzaW9uRmFjdG9yeUJlYW4iJmd0OwotICAgICAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJtYXBwaW5nTG9jYXRpb25zIiZndDsKLSAgICAgICAgICAgICAgICAgICAmbHQ7dmFsdWUmZ3Q7Y2xhc3NwYXRoKjoqKi9NeUVudGl0eS5oYm0ueG1sJmx0Oy92YWx1ZSZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L3Byb3BlcnR5Jmd0OwotICAgICAgICAgICAgICAgIC4uLgotJmx0Oy9iZWFuJmd0OyA8L3ByZT4KLTwvc291cmNlPjwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zcmMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlQ29kZS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvc3JjL0F4aXMyU2FtcGxlRG9jTGl0U2VydmljZUNvZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQyMDM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC9zcmMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlQ29kZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIvPg0KLSAgPHRpdGxlPjwvdGl0bGU+DQotICA8bGluayBocmVmPSIuLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotDQotPGJvZHkgbGFuZz0iZW4iPg0KLTxoMT5Db2RlIExpc3RpbmcgRm9yIEF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSBTZXJ2aWNlPC9oMT4NCi0NCi08aDI+U2VydmVyOjwvaDI+DQotDQotPGgzPmVjaG9TdHJpbmc8L2gzPg0KLQ0KLTxwPkxvY2F0ZSB0aGUgZm9sbG93aW5nIGNvZGUgc2VnbWVudCBpbiAiQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU2tlbGV0b24uamF2YSIuPGJyLz4NCi08L3A+DQotPHNvdXJjZT48cHJlPnB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IA0KLSAgICAgICAgZWNob1N0cmluZyhvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQgcGFyYW00ICl7DQotICAgICAgICAvL1RvZG86IGZpbGwgdGhpcyB3aXRoIHRoZSBuZWNlc3NhcnkgYnVzaW5lc3MgbG9naWMNCi0gICAgICAgIHRocm93IG5ldyAgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgfQ0KLTwvcHJlPjwvc291cmNlPg0KLQ0KLTxwPlRoZW4gY29tcGxldGUgdGhlIGNvZGUgYnkgYWRkaW5nIHRoZSBidXNpbmVzcyBsb2dpYyBhcyBzaG93biBiZWxvdzo8L3A+DQotPHNvdXJjZT4NCi08cHJlPnB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IA0KLSAgICAgICBlY2hvU3RyaW5nKG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUGFyYW1Eb2N1bWVudCBwYXJhbTQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAvL1VzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIG91dHB1dCBkb2N1bWVudA0KLSAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1JldHVybkRvY3VtZW50IHJldERvYyA9IA0KLSAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdSZXR1cm5Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgLy9zZW5kIHRoZSBzdHJpbmcgYmFjay4NCi0gICAgICByZXREb2Muc2V0RWNob1N0cmluZ1JldHVybihwYXJhbTQuZ2V0RWNob1N0cmluZ1BhcmFtKCkpOw0KLSAgICAgIHJldHVybiByZXREb2M7DQotICB9PC9wcmU+DQotPC9zb3VyY2U+DQotDQotPGgzPmVjaG9TdHJpbmdBcnJheTwvaDM+DQotDQotPHA+VGhlIGNvZGUgc2VnbWVudCBmb3IgZWNob1N0cmluZ0FycmF5IGlzIHNob3duIGJlbG93OjwvcD4NCi08c291cmNlPg0KLTxwcmU+cHVibGljIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nQXJyYXlSZXR1cm5Eb2N1bWVudCANCi0gICAgICBlY2hvU3RyaW5nQXJyYXkob3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdBcnJheVBhcmFtRG9jdW1lbnQgcGFyYW0wKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAvL1VzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIG91dHB1dCBkb2N1bWVudC4NCi0gICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nQXJyYXlSZXR1cm5Eb2N1bWVudCByZXREb2MgPSANCi0gICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nQXJyYXlSZXR1cm5Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAvL0dldCB0aGUgU3RyaW5nIGFycmF5IGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMuDQotICAgICBTdHJpbmdbXSBpblBhcmFtcyA9IHBhcmFtMC5nZXRFY2hvU3RyaW5nQXJyYXlQYXJhbSgpLmdldFN0cmluZ0FycmF5KCk7DQotICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuQXJyYXlPZnN0cmluZ0xpdGVyYWwgcmV0UGFyYW1zID0NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuQXJyYXlPZnN0cmluZ0xpdGVyYWwuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgLy9TZXQgdGhlIGlucHV0IHBhcmFtZXRlcnMgdG8gdGhlIG91dHB1dCBwYXJhbWV0ZXJzIGZvciBlY2hvaW5nLg0KLSAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBpblBhcmFtcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgIHJldFBhcmFtcy5hZGRTdHJpbmcoaW5QYXJhbXNbaV0pOzxici8+ICAgICB9DQotICAgICAvL3JldHVybiB0aGUgb3V0cHV0IGRvY3VtZW50Lg0KLSAgICByZXREb2Muc2V0RWNob1N0cmluZ0FycmF5UmV0dXJuKHJldFBhcmFtcyk7DQotICAgIHJldHVybiByZXREb2M7DQotICAgfTwvcHJlPg0KLTwvc291cmNlPg0KLQ0KLTxoMz5lY2hvU3RydWN0PC9oMz4NCi0NCi08cD5UaGUgY29kZSBzZWdtZW50IGZvciBlY2hvU3RydWN0IGlzIHNob3duIGJlbG93OjwvcD4NCi08c291cmNlPjxwcmU+DQotICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJ1Y3RSZXR1cm5Eb2N1bWVudCANCi0gICAgICAgIGVjaG9TdHJ1Y3Qob3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJ1Y3RQYXJhbURvY3VtZW50IHBhcmFtMikgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvL1VzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIG91dHB1dCBkb2N1bWVudC4NCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RydWN0UmV0dXJuRG9jdW1lbnQgcmV0RG9jID0NCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RydWN0UmV0dXJuRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgLy9HZXQgdGhlIFNPQVBTdHJjdXQgZnJvbSB0aGUgaW5jb21pbmcgcGFyYW1ldGVycw0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLlNPQVBTdHJ1Y3QgaW5TdHJ1Y3QgPSBwYXJhbTIuZ2V0RWNob1N0cnVjdFBhcmFtKCk7DQotICAgICAgICAvL1N0cnVjdCBmb3IgdGhlIHNlbmRpbmcgYmFjaw0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLlNPQVBTdHJ1Y3Qgb3V0U3RydWN0ID0NCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLlNPQVBTdHJ1Y3QuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgLy9GaWxsIHRoZSBvdXRnb2luZyBzdHJ1Y3QNCi0gICAgICAgIG91dFN0cnVjdC5zZXRWYXJGbG9hdChpblN0cnVjdC5nZXRWYXJGbG9hdCgpKTsNCi0gICAgICAgIG91dFN0cnVjdC5zZXRWYXJJbnQoaW5TdHJ1Y3QuZ2V0VmFySW50KCkpOw0KLSAgICAgICAgb3V0U3RydWN0LnNldFZhclN0cmluZyhpblN0cnVjdC5nZXRWYXJTdHJpbmcoKSk7DQotICAgICAgICAvL1NldCB0aGUgb3V0Z29pbmcgZG9jdW1lbnQuDQotICAgICAgICByZXREb2Muc2V0RWNob1N0cnVjdFJldHVybihvdXRTdHJ1Y3QpOw0KLSAgICAgICAgcmV0dXJuIHJldERvYzsNCi0gICAgfQ0KLTwvcHJlPjwvc291cmNlPg0KLQ0KLTxoMj5DbGllbnQ6PC9oMj4NCi0NCi08aDM+Q2xpZW50IGZvciBlY2hvU3RyaW5nIE9wZXJhdGlvbjwvaDM+DQotDQotPHA+VGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50IHNob3dzIHRoZSBuZWNlc3NhcnkgY29kZSBmb3IgdXRpbGl6aW5nIHRoZQ0KLWVjaG9TdHJpbmcgb3BlcmF0aW9uIG9mIHRoZSBBeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UgdGhhdCB3ZSBoYXZlIGFscmVhZHkNCi1kZXBsb3llZC4gVGhlIGNvZGUgaXMgdmVyeSBzaW1wbGUgdG8gdW5kZXJzdGFuZCBhbmQgdGhlIGV4cGxhbmF0aW9ucyBhcmUgaW4NCi10aGUgZm9ybSBvZiBjb21tZW50cy48L3A+DQotPHNvdXJjZT48cHJlPiAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU3R1YiBzdHViIA0KLSAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZVN0dWIobnVsbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyU2FtcGxlRG9jTGl0U2VydmljZSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgcmVxdWVzdCBkb2N1bWVudCB0byBiZSBzZW50Lg0KLSAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ1BhcmFtRG9jdW1lbnQgcmVxRG9jID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5FY2hvU3RyaW5nUGFyYW1Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgIHJlcURvYy5zZXRFY2hvU3RyaW5nUGFyYW0oIkF4aXMyIEVjaG8iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgLy9pbnZva2VzIHRoZSBXZWIgc2VydmljZS4NCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdSZXR1cm5Eb2N1bWVudCByZXNEb2MgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1Yi5lY2hvU3RyaW5nKHJlcURvYyk7DQotICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNEb2MuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgIH0NCi08L3ByZT48L3NvdXJjZT4NCi0NCi08cD5TaW1pbGFybHkgdGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50cyBzaG93IGNsaWVudCBzaWRlIGNvZGUgZm9yDQotZWNob1N0cmluZ0FycmF5IG9wZXJhdGlvbiBhbmQgZWNob1N0cnVjdCBvcGVyYXRpb24gcmVzcGVjdGl2ZWx5LjwvcD4NCi0NCi08aDM+Q2xpZW50IGZvciBlY2hvU3RyaW5nQXJyYXkgT3BlcmF0aW9uPC9oMz4NCi08c291cmNlPjxwcmU+ICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBzdHViIGJ5IHBhc3NpbmcgdGhlIEFYSVNfSE9NRSBhbmQgdGFyZ2V0IEVQUi4NCi0gICAgICAgICAgICAgICAgICAgICAgIC8vV2UgcGFzcyBudWxsIHRvIHRoZSBBWElTX0hPTUUgYW5kIGhlbmNlIHRoZSBzdHViIHdpbGwgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyB0aGUgQVhJU19IT01FDQotICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViIHN0dWIgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUuQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlU3R1YihudWxsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJTYW1wbGVEb2NMaXRTZXJ2aWNlIik7DQotICAgICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgcmVxdWVzdCBkb2N1bWVudCB0byBiZSBzZW50Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdBcnJheVBhcmFtRG9jdW1lbnQgcmVxRG9jID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cmluZ0FycmF5UGFyYW1Eb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5BcnJheU9mc3RyaW5nTGl0ZXJhbCBwYXJhbUFycmF5ID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkFycmF5T2ZzdHJpbmdMaXRlcmFsLkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgcGFyYW1BcnJheS5hZGRTdHJpbmcoIkF4aXMyIik7DQotICAgICAgICAgICAgICAgICAgICAgIHBhcmFtQXJyYXkuYWRkU3RyaW5nKCJFY2hvIik7DQotICAgICAgICAgICAgICAgICAgICAgIHJlcURvYy5zZXRFY2hvU3RyaW5nQXJyYXlQYXJhbShwYXJhbUFycmF5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJpbmdBcnJheVJldHVybkRvY3VtZW50IHJlc0RvYyA9IA0KLSAgICAgICAgICAgICAgICAgICAgICBzdHViLmVjaG9TdHJpbmdBcnJheShyZXFEb2MpOyANCi0gICAgICAgICAgICAgICAgICAgICAgLy9HZXQgdGhlIHJlc3BvbnNlIHBhcmFtcw0KLSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSByZXNQYXJhbXMgPSByZXNEb2MuZ2V0RWNob1N0cmluZ0FycmF5UmV0dXJuKCkuZ2V0U3RyaW5nQXJyYXkoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyByZXNQYXJhbXMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNQYXJhbXNbaV0pOw0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgPC9wcmU+DQotICAgIDwvc291cmNlPg0KLQ0KLTxoMz5DbGllbnQgZm9yIGVjaG9TdHJ1Y3QgT3BlcmF0aW9uPC9oMz4NCi08c291cmNlPjxwcmU+dHJ5IHsNCi0gICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHN0dWIgYnkgcGFzc2luZyB0aGUgQVhJU19IT01FIGFuZCB0YXJnZXQgRVBSLg0KLSAgICAgICAgICAgICAgICAvL1dlIHBhc3MgbnVsbCB0byB0aGUgQVhJU19IT01FIGFuZCBoZW5jZSB0aGUgc3R1YiB3aWxsIHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgdGhlIEFYSVNfSE9NRQ0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViIHN0dWIgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS5BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2VTdHViKG51bGwsDQotICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlNhbXBsZURvY0xpdFNlcnZpY2UiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSByZXF1ZXN0IERvY3VtZW50DQotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLkVjaG9TdHJ1Y3RQYXJhbURvY3VtZW50IHJlcURvYyA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cnVjdFBhcmFtRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgY29tcGxleCB0eXBlDQotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51c2VyZ3VpZGUueHNkLlNPQVBTdHJ1Y3QgcmVxU3RydWN0ID0NCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuU09BUFN0cnVjdC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxU3RydWN0LnNldFZhckZsb2F0KDEwMC41MEYpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcVN0cnVjdC5zZXRWYXJJbnQoMTApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcVN0cnVjdC5zZXRWYXJTdHJpbmcoIkhpZ2giKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXFEb2Muc2V0RWNob1N0cnVjdFBhcmFtKHJlcVN0cnVjdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXJ2aWNlIGludm9jYXRpb24NCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnVzZXJndWlkZS54c2QuRWNob1N0cnVjdFJldHVybkRvY3VtZW50IHJlc0RvYyA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHViLmVjaG9TdHJ1Y3QocmVxRG9jKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXNlcmd1aWRlLnhzZC5TT0FQU3RydWN0IHJlc1N0cnVjdCA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzRG9jLmdldEVjaG9TdHJ1Y3RSZXR1cm4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmxvb3QgVmFsdWUgOiIgKyByZXNTdHJ1Y3QuZ2V0VmFyRmxvYXQoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImludCBWYWx1ZSA6IiArIHJlc1N0cnVjdC5nZXRWYXJJbnQoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0cmluZyBWYWx1ZSA6IiArIHJlc1N0cnVjdC5nZXRWYXJTdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLTwvcHJlPjwvc291cmNlPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RjcC10cmFuc3BvcnQueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3RjcC10cmFuc3BvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDczZTBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90Y3AtdHJhbnNwb3J0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIi8+Ci0gIDx0aXRsZT5UQ1AgdHJhbnNwb3J0PC90aXRsZT4KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi0gIG1lZGlhPSJhbGwiLz4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iZW4iPgotPGgxPlRDUCBUcmFuc3BvcnQ8L2gxPgotVGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gc2VuZCBhbmQgcmVjZWl2ZSBTT0FQIG1lc3NhZ2VzIHZpYSBUQ1AgaW4gQXhpczIuCi0KLTxwPjxpPlNlbmQgeW91ciBmZWVkYmFjayBvciBxdWVzdGlvbnMgdG86IDxhCi1ocmVmPSJtYWlsdG86YXhpcy1kZXZAd3MuYXBhY2hlLm9yZz9zdWJqZWN0PVtBeGlzMl0iPmF4aXMtZGV2QHdzLmFwYWNoZS5vcmc8L2E+PC9pPi4KLVByZWZpeCBzdWJqZWN0IHdpdGggW0F4aXMyXS4gU3Vic2NyaXB0aW9uIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCI+QXhpczIgc2l0ZTwvYT4uCi08L3A+Ci0KLTxoMj5Db250ZW50PC9oMj4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjc3RhcnQiPkhvdyB0byBTdGFydCB0aGUgVENQU2VydmVyPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjc2VuZCI+SG93IHRvIFNlbmQgU09BUCBNZXNzYWdlcyBVc2luZyBUQ1AgVHJhbnNwb3J0PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjc2FtcGxlcyI+U2FtcGxlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2NvbXBvbmVudHMiPlRyYW5zcG9ydCBDb21wb25lbnRzPC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0iaW50cm8iPjwvYT4KLQotPGgyPkludHJvZHVjdGlvbjwvaDI+Ci0KLTxwPkF4aXMyIHN1cHBvcnRzIFRDUCBhcyBhIHRyYW5zcG9ydC4gSXQgc3VwcG9ydHMgYm90aCBzZW5kaW5nIGFuZCByZWNlaXZpbmcgU09BUAotbWVzc2FnZXMgdmlhIFRDUC4gQSBUQ1AgdHJhbnNwb3J0IGRvZXMgbm90IGhhdmUgYW55IGFwcGxpY2F0aW9uIGxldmVsIGhlYWRlcnMKLWFuZCB0aGUgU09BUCBtZXNzYWdlIHRoYXQgaXMgc2VudCBzaG91bGQgYmUgc2VsZi1jb250YWluZWQuIFRoaXMgbWFrZXMgdGhlCi1pbnRlcmFjdGlvbiBmYXN0IGFuZCBzaW1wbGUuIEhvd2V2ZXIsIHNpbmNlIHRoZXJlIGFyZSBubyBhcHBsaWNhdGlvbiBoZWFkZXJzLAotaXQgZG9lcyBub3QgaGF2ZSB0aGUgcHJpdmlsZWdlIG9mIGhhdmluZyBhIHJlcXVlc3QgVVJJLCBhbmQgU2VydmljZQotZGlzcGF0Y2hpbmcgc2hvdWxkIGJlIGRvbmUgYnkgYW4gYWx0ZXJuYXRpdmUgbWV0aG9kLiBUaHVzLAotUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBjYW5ub3QgYmUgdXNlZC4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHR3byBtYWluCi1hbHRlcm5hdGl2ZXMgYXZhaWxhYmxlIGZvciBkaXNwYXRjaGluZyBpbiB0aGUgQXhpczIgZW52aXJvbm1lbnQ6PC9wPgotPG9sPgotICA8bGk+VXNlIHRoZSBuYW1lIHNwYWNlIFVSSSBvZiB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBvZiBTT0FQQm9keS4KLSAgICAoU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKS48L2xpPgotICA8bGk+RW5hYmxlIFdTLUFkZHJlc3NpbmcuIEluIHRoZSBjYXNlIG9mIHZlcnNpb24gMS4xIGFuZCAxLjEuMSByZWxlYXNlcwotICAgIEFkZHJlc3NpbmcgaXMgZGVmYXVsdCAoU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcikuPC9saT4KLTwvb2w+Ci0KLTxwPldoZW4gdGhlIFRDUCByZXF1ZXN0IGlzIHNlbnQsIGl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gdXNlCi1laXRoZXIgQWRkcmVzc2luZyBvciB0aGUgU09BUCBib2R5IGJhc2UgbWVjaGFuaXNtLjwvcD4KLTxhIG5hbWU9InN0YXJ0Ij48L2E+Ci0KLTxoMj5Ib3cgdG8gU3RhcnQgdGhlIFRDUFNlcnZlcjwvaDI+Ci0KLTxwPlRoZSBUQ1Agc2VydmVyIGNhbiBiZSBzdGFydGVkIGJ5IHJ1bm5pbmcgdGhlIGNsYXNzCi1vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIHdpdGggdHdvIHBhcmFtZXRlcnMgLSA8YQotaHJlZj0iLi4vZmFxLmh0bWwjYzUiPnJlcG9zaXRvcnk8L2E+IGFuZCBwb3J0IG51bWJlciwgYXMgYXJndW1lbnRzLiBUaGlzCi1jbGFzcyBuZWVkcyBhbGwgdGhlIEF4aXMgZGVwZW5kZW5jeSBKQVJzIGluIHRoZSBjbGFzc3BhdGguIE5ldyBzZXJ2aWNlcyBjYW4KLWJlIGFkZGVkIGluIHRoZSB1c3VhbCB3YXkgYnkgZHJvcHBpbmcgdGhlIGFyY2hpdmVzIHRvIHRoZSByZXBvc2l0b3J5IChTZWUgPGEKLWhyZWY9ImFkdi11c2VyZ3VpZGUuaHRtbCI+QWR2YW5jZWQgVXNlcidzIEd1aWRlPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbik8L3A+Ci08IS0tPHA+QWx0ZXJuYXRpdmVseSB0aGUgVENQIFNlcnZlciBjYW4gcnVuIHdpdGggdGNwLXNlcnZlci5iYXQvIHRjcC1zZXJ2ZXIuc2gKLWZpbGUgaW4gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgdGhlIEJpbmFyeSBkaXN0cmlidXRpb24gb2YgVENQIFNlcnZlci48L3A+LS0+Ci08YSBuYW1lPSJzZW5kIj48L2E+Ci0KLTxoMj5Ib3cgdG8gU2VuZCBTT0FQIE1lc3NhZ2VzIFVzaW5nIFRDUCBUcmFuc3BvcnQ8L2gyPgotCi08cD5UQ1AgdHJhbnNwb3J0IGNhbiBiZSBlbmFibGVkIGVhc2lseSBmcm9tIHRoZSBjYWxsIEFQSS4gVGhlIGZvbGxvd2luZyBjb2RlCi1zZWdtZW50IGRlbW9uc3RyYXRlcyBob3cgdGhpcyBjYW4gYmUgZG9uZS48L3A+Ci08c291cmNlPjxwcmU+T01FbGVtZW50IHBheWxvYWQgPSAuLi4KLVNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci1PcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotPCEtLW9wdGlvbnMudXNlU2VwZXJhdGVMaXN0ZW5lcihmYWxzZSk7LS0+Ci0KLTwhLS1jb21tZW50ZWQgb2ZmIGFzIHRoZXJlIGlzIGFuIGVycm9yOiAiVGhlIG1ldGhvZCB1c2VTZXBlcmF0ZUxpc3RlbmVyKGJvb2xlYW4paXMgdW5kZWZpbmVkIGZvciB0aGUgdHlwZSBPcHRpb25zIi0tPgotCi1zZXJ2aWNlQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLU9NRWxlbWVudCByZXNwb25zZSA9IHNlcnZpY2VDbGllbnQuc2VuZFJlY2VpdmUocGF5bG9hZCk7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgaW52b2tlZCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0YXJnZXRFUFIKLSh0Y3A6Ly8uLi4pLiBJbiB0aGlzIGNhc2UgaXQgaXMgVENQIGFuZCB0aGUgbGlzdGVuZXIgaXMgYWxzbyBUQ1AuIFRoZSBTT0FQCi1tZXNzYWdlIGhhcyB0byBiZSBzZWxmIGNvbnRhaW5lZCBpbiBvcmRlciB0byB1c2UgQWRkcmVzc2luZy4gVGhlIG90aGVyIG9wdGlvbgotaXMgdG8gdXNlIHRoZSBVUkkgb2YgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBTT0FQIEJvZHkgdG8gZGlzcGF0Y2ggdGhlCi1zZXJ2aWNlLiBUaGUgcGFyYW1ldGVyIGlzIG9mIHRoZSB0eXBlIDxhIGhyZWY9Ii4uL2ZhcS5odG1sI2EyIj5PTUVsZW1lbnQ8L2E+LAotdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiBBeGlzMi48L3A+Ci08YSBuYW1lPSJzYW1wbGVzIj48L2E+Ci0KLTxoMj5TYW1wbGVzPC9oMj4KLQotPHA+QSBzYW1wbGUgZm9yIGEgVENQIENsaWVudCBjYW4gYmUgZm91bmQgZnJvbSB0aGUKLXNhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9UQ1BDbGllbnQuamF2YSBpbiB0aGUgYmluYXJ5Ci1kaXN0cmlidXRpb24uIFRoaXMgYWNjZXNzZXMgdGhlIHNhbWUgV2ViIHNlcnZpY2UgZXhwbGFpbmVkIGluIHRoZSA8YQotaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sIj5BeGlzMiBBZHZhbmNlZCBVc2VyJ3MgR3VpZGU8L2E+LiBUaGUgY2xpZW50IGZpcnN0Ci1zdGFydHMgdGhlIFRDUFNlcnZlciB3aXRoIHRoZSBzYW1lIHJlcG9zaXRvcnkgdXNlZCBmb3IgdGhlIDxhCi1ocmVmPSJhZHYtdXNlcmd1aWRlLmh0bWwiPkF4aXMyIEFkdmFuY2VkIFVzZXIncyBHdWlkZTwvYT4gc2FtcGxlcy4gU2luY2UgdGhlCi1zYW1wbGUgaXMgYWxyZWFkeSBkZXBsb3llZCBpbiB0aGUgcmVwb3NpdG9yeSwgYXMgcGVyIHRoZSB1c2VyZ3VpZGUsIGl0IHdpbGwKLWJlIGF1dG9tYXRpY2FsbHkgYXZhaWxhYmxlLjwvcD4KLQotPHA+SW4gb3JkZXIgdG8gcnVuIHRoZSBUQ1BDbGllbnQuamF2YSwgYWRkcmVzc2luZyBzaG91bGQgYmUgZW5nYWdlZCBib3RoIGluCi10aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMuIE9uIHRoZSBjbGllbnQgc2lkZSwgeW91IGNhbiBlbmdhZ2UgYWRkcmVzc2luZyBieQotY29weWluZyB0aGUgYWRkcmVzc2luZy1AYXhpczJfdmVyc2lvbkAubWFyIChBWElTMl9IT01FL3JlcG9zaXRvcnkvbW9kdWxlKSB0bwotQVhJUzJfSE9NRS9saWIgZGlyZWN0b3J5LjwvcD4KLTxhIG5hbWU9ImNvbXBvbmVudHMiPjwvYT4KLQotPGgyPlRyYW5zcG9ydCBDb21wb25lbnRzPC9oMj4KLQotPHA+VGhlIEF4aXMyIFRDUCB0cmFuc3BvcnQgaGFzIHR3byBjb21wb25lbnRzLCBhIHRyYW5zcG9ydCBMaXN0ZW5lciBmb3IKLXJlY2VpdmluZyB0aGUgbWVzc2FnZXMgYW5kIGEgdHJhbnNwb3J0IFNlbmRlciB0byBzZW5kIHRoZSBTT0FQIE1lc3NhZ2VzLiBUaGUKLUF4aXMyIGluc3RhbGxhdGlvbiBoYXMgYm90aCB0aGUgY29tcG9uZW50cyBidWlsdCBpbnRvIGl0c2VsZiBieSBkZWZhdWx0LiBJbgotdGhlIGF4aXMyLnhtbCBjb25maWd1cmF0aW9uIGZpbGUsIHRoZSB0d28gVENQIHRyYW5zcG9ydCBjb21wb25lbnRzIGNhbiBiZSAKLWNvbmZpZ3VyZWQgYXMgc2hvd24gYmVsb3cuPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIFhNTCBsaW5lcyBpbml0aWFsaXplIHRoZSBUQ1BUcmFuc3BvcnQgUmVjZWl2ZXI6PC9wPgotPHNvdXJjZT48cHJlPiZsdDt0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIiZndDsKLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9InBvcnQiJmd0OzYwNjAmbHQ7L3BhcmFtZXRlciZndDsKLSZsdDsvdHJhbnNwb3J0UmVjZWl2ZXImZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSBmb2xsb3dpbmcgWE1MIGxpbmVzIGFkZCB0aGUgVENQVHJhbnNwb3J0IFNlbmRlcjo8L3A+Ci08c291cmNlPjxwcmU+Jmx0O3RyYW5zcG9ydFNlbmRlciBuYW1lPSJ0Y3AiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQVHJhbnNwb3J0U2VuZGVyIi8mZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLQotPHA+Tm90ZTogSWYgdGhlIFRDUCBzZXJ2ZXIgaXMgc3RhcnRlZCBtYW51YWxseSwgdGhpcyBjb25maWd1cmF0aW9uIGRvZXMgbm90IHRha2UKLWVmZmVjdC4gSW4gcmV0dXJuLCB0aGlzIGFmZmVjdHMgdGhlIHRyYW5zcG9ydCBMaXN0ZW5lcidzIHN0YXJ0IGJ5IEF4aXMyLgotKGUuZy4gTGlzdGVuZXIgc3RhcnRlZCBieSB0aGUgQ29tcGxldGUgQXN5bmMgaW50ZXJhY3Rpb24pPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdG9jLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjI5ZmEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4KLTx0aXRsZT48L3RpdGxlPgotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi1tZWRpYT0iYWxsIiAvPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIj4KLS8qPCFbQ0RBVEFbKi8KLTwhLS0KLXVsIHsgbGlzdC1zdHlsZS10eXBlOiBub25lOyBtYXJnaW46IDAgMCAwIDVweDsgcGFkZGluZzogMDsgYm9yZGVyLXdpZHRoOiAwOyBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOyB9Ci0tLT4KLQotCi0KLQotCi0KLS8qXV0+Ki8KLTwvc3R5bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJlbi1VUyIgZGlyPSJsdHIiIHhtbDpsYW5nPSJlbi1VUyI+Ci08aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPgotPG9sPgotPGxpPjxhIGhyZWY9ImNvbnRlbnRzLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkludHJvZHVjdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imluc3RhbGxhdGlvbmd1aWRlLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkluc3RhbGxhdGlvbiBHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL21vZHVsZXMvaW5kZXguaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkFkZC1vbgotTW9kdWxlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImFwcF9zZXJ2ZXIuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkFwcGxpY2F0aW9uIFNlcnZlcgotU3BlY2lmaWMgQ29uZmlndXJhdGlvbiBHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9InF1aWNrc3RhcnRndWlkZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+UXVpY2sgU3RhcnQKLUd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5Vc2VyJ3MKLUd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iYWR2LXVzZXJndWlkZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+QWR2YW5jZWQgVXNlcidzCi1HdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImF4aXMyY29uZmlnLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5Db25maWd1cmF0aW9uCi1HdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IndlYmFkbWluZ3VpZGUuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPldlYgotQWRtaW5pc3RyYXRvcidzIEd1aWRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sIiB0YXJnZXQ9Ci0ibWFpbkZyYW1lIj5BcmNoaXRlY3R1cmUgR3VpZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJqYXh3cy1ndWlkZS5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+SkFYV1MgR3VpZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwb2pvZ3VpZGUuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPlBPSk8gR3VpZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzcHJpbmcuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPlNwcmluZyBHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Im1vZHVsZXMuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPk1vZHVsZXNHdWlkZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImNsdXN0ZXJpbmctZ3VpZGUuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkNsdXN0ZXJpbmcgR3VpZGU8L2E+PC9saT4KLTxsaT5BREIgRGF0YSBCaW5kaW5nCi08dWw+Ci08bGk+MTQuMSA8YSBocmVmPSJhZGIvYWRiLWhvd3RvLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkFyY2hpdGVjdHVyZTwvYT48L2xpPgotPGxpPjE0LjIgPGEgaHJlZj0iYWRiL2FkYi1hZHZhbmNlZC5odG1sIiB0YXJnZXQ9Ci0ibWFpbkZyYW1lIj5BZHZhbmNlZCBGZWF0dXJlczwvYT48L2xpPgotPGxpPjE0LjMgPGEgaHJlZj0iYWRiL2FkYi1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkNvZGUgR2VuZXJhdGlvbiBJbnRlZ3JhdGlvbjwvYT48L2xpPgotPGxpPjE0LjQgPGEgaHJlZj0iYWRiL2FkYi10d2Vha2luZy5odG1sIiB0YXJnZXQ9Ci0ibWFpbkZyYW1lIj5Ud2Vha2luZzwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+SmlCWCBEYXRhIEJpbmRpbmcKLTx1bD4KLTxsaT4xNS4xIDxhIGhyZWY9ImppYngvamlieC1jb2RlZ2VuLWludGVncmF0aW9uLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPkNvZGUgR2VuZXJhdGlvbiBJbnRlZ3JhdGlvbjwvYT48L2xpPgotPGxpPjE1LjIgPGEgaHJlZj0iamlieC9qaWJ4LWRvY2xpdC1leGFtcGxlLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPmRvYy9saXQgRXhhbXBsZTwvYT48L2xpPgotPGxpPjE1LjMgPGEgaHJlZj0iamlieC9qaWJ4LXVud3JhcHBlZC1leGFtcGxlLmh0bWwiIHRhcmdldD0KLSJtYWluRnJhbWUiPnVud3JhcHBlZCBFeGFtcGxlPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5BZHZhbmNlZAotPHVsPgotPGxpPjE2LjEgPGEgaHJlZj0ieG1sYmFzZWQtc2VydmVyLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5BWElPTQotQmFzZWQgU2VydmljZTwvYT48L2xpPgotPGxpPjE2LjIgPGEgaHJlZj0iZGlpLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5BWElPTSBCYXNlZAotQ2xpZW50PC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJtdG9tLWd1aWRlLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5BdHRhY2htZW50cy9NVE9NCi1HdWlkZTwvYT48L2xpPgotPGxpPlRyYW5zcG9ydHMKLTx1bD4KLTxsaT4xOC4xIDxhIGhyZWY9Imh0dHAtdHJhbnNwb3J0Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5IVFRQCi1UcmFuc3BvcnQ8L2E+PC9saT4KLTxsaT4xOC4zIDxhIGhyZWY9InRjcC10cmFuc3BvcnQuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPlRDUAotVHJhbnNwb3J0PC9hPjwvbGk+Ci08bGk+MTguNSA8YSBocmVmPSJ0cmFuc3BvcnRfaG93dG8uaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkN1c3RvbQotVHJhbnNwb3J0PC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJXU19wb2xpY3kuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPldTLVBvbGljeQotU3VwcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InJlc3Qtd3MuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPlJFU1QgU3VwcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Impzb25fc3VwcG9ydC5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+SlNPTgotU3VwcG9ydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImNvcmJhLWRlcGxveWVyLmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5FeHBvc2luZyBDT1JCQSBTZXJ2aWNlcyBhcyBXZWIgU2VydmljZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJlamItcHJvdmlkZXIuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkd1aWRlIHRvIHVzaW5nCi1FSkIgUHJvdmlkZXIgaW4gQXhpczI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzb2FwbW9uaXRvci1tb2R1bGUuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPlNPQVAKLU1vbml0b3I8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyZWZlcmVuY2UuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPkNvbW1hbmQgTGluZQotVG9vbHM8L2E+PC9saT4KLTxsaT48YSBocmVmPSIuLi90b29scy9pbmRleC5odG1sIiB0YXJnZXQ9Ci0ibWFpbkZyYW1lIj5Ub29scy9QbHVnLWluczwvYT4KLTx1bD4KLTxsaT4yNS4xIDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9Db2RlZ2VuVG9vbFJlZmVyZW5jZS5odG1sIiB0YXJnZXQ9Ci0ibWFpbkZyYW1lIj5Db2RlIEdlbmVyYXRvciBUb29sIC0gQ29tbWFuZCBMaW5lIGFuZCBBbnQKLVRhc2s8L2E+PC9saT4KLTxsaT4yNS4yIDxhIGhyZWY9Ci0iLi4vdG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCIKLXRhcmdldD0ibWFpbkZyYW1lIj5BeGlzMiBQbHVnLWluIGZvciBJbnRlbGxpSiBJREVBPC9hPjwvbGk+Ci08bGk+MjUuMyA8YSBocmVmPQotIi4uL3Rvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvZWNsaXBzZS9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLmh0bWwiCi10YXJnZXQ9Im1haW5GcmFtZSI+U2VydmljZSBBcmNoaXZlIEdlbmVyYXRvciBXaXphcmQgLSBFY2xpcHNlCi1QbHVnLWluPC9hPjwvbGk+Ci08bGk+MjUuNCA8YSBocmVmPQotIi4uL3Rvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLmh0bWwiCi10YXJnZXQ9Im1haW5GcmFtZSI+Q29kZSBHZW5lcmF0b3IgV2l6YXJkIC0gRWNsaXBzZSBQbHVnLWluPC9hPjwvbGk+Ci08bGk+MjUuNSA8YSBocmVmPQotIi4uL3Rvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLmh0bWwiCi10YXJnZXQ9Im1haW5GcmFtZSI+QUFSIE1hdmVuMiBQbHVnLWluPC9hPjwvbGk+Ci08bGk+MjUuNiA8YSBocmVmPQotIi4uL3Rvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvbWF2ZW4tcGx1Z2lucy9tYXZlbi1qYXZhMndzZGwtcGx1Z2luLmh0bWwiCi10YXJnZXQ9Im1haW5GcmFtZSI+SmF2YTJXU0RMIE1hdmVuMiBQbHVnLWluPC9hPjwvbGk+Ci08bGk+MjUuNyA8YSBocmVmPQotIi4uL3Rvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvbWF2ZW4tcGx1Z2lucy9tYXZlbi13c2RsMmNvZGUtcGx1Z2luLmh0bWwiCi10YXJnZXQ9Im1haW5GcmFtZSI+V1NETDJDb2RlIE1hdmVuMiBQbHVnLWluPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJtaWdyYXRpb24uaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPk1pZ3JhdGlvbiBHdWlkZQotKGZyb20gQXhpczEpPC9hPjwvbGk+Ci08bGk+RGVzaWduIE5vdGVzCi08dWw+Ci08bGk+MjcuMSA8YSBocmVmPSJBeGlzMi1ycGMtc3VwcG9ydC5odG1sIiB0YXJnZXQ9Im1haW5GcmFtZSI+UlBDCi1TdXBwb3J0PC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdHJhbnNwb3J0X2hvd3RvLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90cmFuc3BvcnRfaG93dG8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU3YzM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC90cmFuc3BvcnRfaG93dG8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxodG1sPg0KLTxoZWFkPg0KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiLz4NCi0gIDx0aXRsZT48L3RpdGxlPg0KLSAgPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotICBtZWRpYT0iYWxsIi8+DQotPC9oZWFkPg0KLQ0KLTxib2R5Pg0KLTxoMT5Ib3cgdG8gV3JpdGUgWW91ciBPd24gQXhpczIgVHJhbnNwb3J0PC9oMT4NCi0NCi08aDI+UHJvbG9ndWU8L2gyPg0KLQ0KLTxwPlRvIHN0b3AgeW91IGZyb20gcmUtaW52ZW50aW5nIHRoZSB3aGVlbCwgYmVmb3JlIHdlIGdldCBzdGFydGVkLCBJIHdpbGwNCi1xdWlja2x5IGxpc3QgdGhlIHRyYW5zcG9ydHMgdGhhdCBhcmUgYWxyZWFkeSBzdXBwb3J0ZWQgaW4gQXhpczIgd2l0aCBhIHNtYWxsDQotZGVzY3JpcHRpb24uPC9wPg0KLQ0KLTxwPjwvcD4NCi08dWw+DQotICA8bGk+PGI+SFRUUDwvYj4gLSBJbiB0aGUgSFRUUCB0cmFuc3BvcnQsIHRoZSB0cmFuc3BvcnQgTGlzdGVuZXIgaXMgZWl0aGVyIGENCi0gICAgU2VydmxldCBvciBhIFNpbXBsZSBIVFRQIHNlcnZlciBwcm92aWRlZCBieSBBeGlzMi4gVGhlIHRyYW5zcG9ydCBTZW5kZXINCi0gICAgdXNlcyBzb2NrZXRzIHRvIGNvbm5lY3QgYW5kIHNlbmQgdGhlIFNPQVAgbWVzc2FnZS4gQ3VycmVudGx5IHdlIGhhdmUgdGhlDQotICAgIGNvbW1vbnMtaHR0cGNsaWVudCBiYXNlZCBIVFRQIFRyYW5zcG9ydCBzZW5kZXIgYXMgdGhlIGRlZmF1bHQNCi0gIHRyYW5zcG9ydC48L2xpPg0KLSAgPGxpPjxiPlRDUDwvYj4gLSBUaGlzIGlzIHRoZSBtb3N0IHNpbXBsZSB0cmFuc3BvcnQsIGJ1dCBuZWVkcyBBZGRyZXNzaW5nDQotICAgIHN1cHBvcnQgdG8gYmUgZnVuY3Rpb25hbC48L2xpPg0KLTwvdWw+DQotDQotPHA+VG8gdW5kZXJzdGFuZCB0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50IHlvdSB3aWxsIG5lZWQgc29tZSB1bmRlcnN0YW5kaW5nDQotb2YgdGhlIGFyY2hpdGVjdHVyZSBvZiBBeGlzMi4gSWYgeW91IGFyZSBub3QgZmFtaWxpYXIgd2l0aCB0aGUgQXhpczINCi1hcmNoaXRlY3R1cmUsIHBsZWFzZSBnbyB0aHJvdWdoIHRoZSA8YQ0KLWhyZWY9IkF4aXMyQXJjaGl0ZWN0dXJlR3VpZGUuaHRtbCI+QXhpczIgQXJjaGl0ZWN0dXJlIEd1aWRlPC9hPiBiZWZvcmUgeW91DQotcmVhZCBhbnkgZnVydGhlci48L3A+DQotDQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotDQotPHA+QnJvYWRseSBzcGVha2luZywgYSB0cmFuc3BvcnQgaW5zaWRlIEF4aXMyIGNhbiBiZSBjbGFzc2lmaWVkIGFzIGEgd2F5IG9mDQotZ2V0dGluZyBtZXNzYWdlcyB0aGF0IGFycml2ZSB0aG91Z2ggc29tZSBjaGFubmVsIGludG8gdGhlIEF4aXMyIGVuZ2luZS4gVGhlDQotY29yZSBvZiBBeGlzMiBpcyB0cmFuc3BvcnQgaW5kZXBlbmRlbnQuIEFsbCBkYXRhIHRoYXQgaXMgdHJhbnNwb3J0IHNwZWNpZmljDQotaXMgc3RyaXBwZWQgb3V0IG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBNZXNzYWdlQ29udGV4dC4NCi1JbiB0aGUgb3V0Z29pbmcgbWVzc2FnZSwgYWxsIHRyYW5zcG9ydCBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgbGlrZSBoZWFkZXJzLA0KLWFyZSBhZGRlZCBhbmQgc2VudC48L3A+DQotDQotPHA+VG8gd3JpdGUgeW91ciBvd24gdHJhbnNwb3J0LCB5b3Ugd2lsbCBwcmltYXJpbHkgbmVlZCB0byB3cml0ZSB0d28gY2xhc3NlczoNCi1vbmUgaXMgdGhlIFRyYW5zcG9ydFNlbmRlciBhbmQgdGhlIG90aGVyIGlzIHRoZSBUcmFuc3BvcnRSZWNlaXZlci4gVG8NCi1yZWdpc3RlciBhIHRyYW5zcG9ydCB3aXRoIEF4aXMyIHlvdSB3aWxsIG5lZWQgdG8gcHV0IGVudHJpZXMgY29ycmVzcG9uZGluZw0KLXRvIHRoZXNlIHR3byBjbGFzc2VzIGluIHRoZSBheGlzMi54bWwgZmlsZS4gSSB3aWxsIHRha2UgeW91IHRocm91Z2ggdGhlIA0KLXByb2Nlc3Mgb2YgYWRkaW5nIHRoZSBlbnRyaWVzIGluIHRoZSByZWxldmFudCBzZWN0aW9ucy48L3A+DQotDQotPGgyPlRyYW5zcG9ydCBSZWNlaXZlcjwvaDI+DQotDQotPHA+QW55IG1lc3NhZ2UgdGhhdCBpcyBjb21pbmcgaW50byBBeGlzMiBuZWVkcyB0byBnbyB0aHJvdWdoIGEgdHJhbnNwb3J0DQotcmVjZWl2ZXIuIEFsbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYXQgdGhlIEF4aXMyDQotc2VydmVyIGZyb20gdGhlIHdpcmUgKG9yIHZpYSBhbiBlLW1haWwpIGlzIGlzb2xhdGVkIGluc2lkZSB0aGUgdHJhbnNwb3J0DQotcmVjZWl2ZXIuIEl0IGV4dHJhY3RzIHRoZSBkYXRhIHRoYXQgaXMgY29taW5nIG9uIHRoZSB3aXJlIGFuZCB0cmFuc2Zvcm1zIGl0DQotaW50byBhIHN0YXRlIHRoYXQgdGhlIEF4aXMyIHNlcnZlciB1bmRlcnN0YW5kcy48L3A+DQotDQotPHA+U28gbm93IHRoYXQgd2UgaGF2ZSBzb21lIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRyYW5zcG9ydHMgd29yaw0KLWluc2lkZSBBeGlzMiwgd2l0aG91dCBmdXJ0aGVyIGRlbGF5LCBsZXRzIGRpdmUgaW50byBzb21lIGNvZGluZyBhbmQgc3RhcnQNCi1idWlsZGluZyBvdXIgb3duIHRyYW5zcG9ydC48L3A+DQotDQotPHA+PC9wPg0KLQ0KLTxwPlRvIGdldCB0aGluZ3Mgc3RhcmVkLCB5b3Ugd2lsbCBmaXJzdCBuZWVkIHRvIGV4dGVuZCBmcm9tIHRoZQ0KLW9yZy5hcGFjaGUuQXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyIGNsYXNzIGFuZCB3cml0ZSB5b3VyIG93bg0KLXRyYW5zcG9ydCBsaXN0ZW5lci4gVG8gY3JlYXRlIGFuIGVuZ2luZSB0byBwcm9jZXNzIHRoZSBNZXNzYWdlQ29udGV4dCwgd2UNCi1uZWVkIGEgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGUgZm9sbG93aW5nIGNvZGUgZnJhZ21lbnQgd2lsbCBkbyB0aGlzLiBUaGlzDQotc2hvdWxkIGlkZWFsbHkgYmUgb25seSBkb25lIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgVHJhbnNwb3J0DQotcmVjZWl2ZXIuPC9wPg0KLQ0KLTxwPjwvcD48c291cmNlPg0KLTxwcmU+dHJ5IHsNCi0gICAgICAgIC8vQ3JlYXRlIGEgZmFjdG9yeSANCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeSgpOw0KLSAgICAgICAgLy9Vc2UgdGhlIGZhY3RvcnkgYW5kIGFuIEF4aXMyIHJlcG9zaXRvcnkgdG8gY3JlYXRlIGEgbmV3IENvbmZpZ3VyYXRpb24gQ29udGV4dA0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShyZXBvc2l0b3J5X2RpcmVjdG9yeSwgDQotYXhpczJ4bWxsb2NhdGlvbik7DQotfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsNCi19PC9wcmU+DQotPC9zb3VyY2U+DQotPHA+Tm93IHdlIG5lZWQgc29tZSBraW5kIG9mIGEgTGlzdGVuZXIgdG8gbGlzdGVuIHRvIHRoZSByZXF1ZXN0cyB0aGF0IGNvbWUNCi1pbi4gWW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgYWNjb3JkaW5nIHRvIHRoZSB0cmFuc3BvcnQgdGhhdCB5b3UgYXJlIHRyeWluZw0KLXRvIGJ1aWxkLiBBZnRlciBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYXQgdGhlIFJlY2VpdmVyLCB5b3UgY2FuIHVzZSB0aGUNCi1mb2xsb3dpbmcgY29kZSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGFuZCB0aGVuIGZvcndhcmQgdGhlIG1lc3NhZ2UgY29udGV4dCB0bw0KLXRoZSBlbmdpbmUgdXNpbmcgdGhlIGVuZ2luZS5yZWNlaXZlKG1zZ0NvbnRleHQpIG1ldGhvZC4gKFRoZSBmb2xsb3dpbmcgY29kZQ0KLWlzIGV4dHJhY3RlZCBmcm9tIHRoZSBNYWlsTGlzdGVuZXIgYXMgYW4gZXhhbXBsZSk8L3A+DQotPHNvdXJjZT48cHJlPkF4aXNFbmdpbmUgZW5naW5lID0gbmV3IEF4aXNFbmdpbmUoY29uZmlndXJhdGlvbkNvbnRleHQpOw0KLU1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBudWxsOw0KLQ0KLS8vIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG1lc3NhZ2UgY29udGV4dA0KLXRyeSB7DQotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0NCi0gICAgICAgICAgICAgICAgcmVnLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0SW4obmV3IFFOYW1lKENvbnN0YW50cy5UUkFOU1BPUlRfTkFNRSkpOw0KLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0NCi0gICAgICAgICAgICAgICAgcmVnLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0T3V0KG5ldyBRTmFtZShDb25zdGFudHMuVFJBTlNQT1JUX05BTUUpKTsNCi0gICAgICAgIGlmICh0cmFuc3BvcnRJbiAhPSBudWxsICZhbXA7JmFtcDsgdHJhbnNwb3J0T3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy9jcmVhdGUgTWVzc2FnZSBDb250ZXh0DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0LCB0cmFuc3BvcnRJbiwgdHJhbnNwb3J0T3V0KTsNCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2ZXJTaWRlKHRydWUpOw0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1haWxTcnZDb25zdGFudHMuQ09OVEVOVF9UWVBFLCBtZXNzYWdlLmdldENvbnRlbnRUeXBlKCkpOw0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIG1lc3NhZ2UuZ2V0RW5jb2RpbmcoKSk7DQotDQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gbWVzc2FnZS5nZXRTT0FQQWN0aW9uSGVhZGVyKCk7DQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0V1NBQWN0aW9uKHNvYXBBY3Rpb24pOw0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFNvYXBBY3Rpb24oc29hcEFjdGlvbik7DQotDQotICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgYXJlIHRyeWluZyB0byBzZXQgdGhlIHJlcGx5IHRvIGlmIGl0IGlzIHByZXNlbnQgaW4gdGhlIHRyYW5zcG9ydCBpbmZvcm1hdGlvbi4NCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShtZXNzYWdlLmdldFJlcGx5VG8oKSk7DQotDQotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBTT0FQIE1lc3NhZ2UgLS0gVGhpcyBjb2RlIGluIGZyb20gdGhlIG1haWwgdHJhbnNwb3J0IGFuZCB3aWxsIGNoYW5nZSBkZXBlbmRpbmcNCi0gICAgICAgICAgICAgICAgLy9vbiBob3cgdGhlIGRhdGEgaXMgaGFuZGxlZCBpbiBlYWNoIHRyYW5zcG9ydC4NCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtZXNzYWdlLmdldENvbnRlbnQoKS50b1N0cmluZygpLmdldEJ5dGVzKCkpOw0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGJhaXMpOw0KLQ0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcE5hbWVzcGFjZVVSSSA9ICIiOw0KLSAgICAgICAgICAgICAgICBpZihtZXNzYWdlLmdldENvbnRlbnRUeXBlKCkuaW5kZXhPZihTT0FQMTJDb25zdGFudHMuU09BUF8xMl9DT05URU5UX1RZUEUpICZndDsgLTEpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBOYW1lc3BhY2VVUkkgPSBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOw0KLSAgICAgICAgICAgICAgICB9ZWxzZSBpZihtZXNzYWdlLmdldENvbnRlbnRUeXBlKCkuaW5kZXhPZihTT0FQMTFDb25zdGFudHMuU09BUF8xMV9DT05URU5UX1RZUEUpICZndDsgLTEpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBOYW1lc3BhY2VVUkkgPSBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIocmVhZGVyLCBzb2FwTmFtZXNwYWNlVVJJKTsNCi0NCi0gICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7DQotICAgICAgICAgICAgICAgIGVuZ2luZS5yZWNlaXZlKG1zZ0NvbnRleHQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmtub3duVHJhbnNwb3J0IixDb25zdGFudHMuVFJBTlNQT1JUX05BTUUpKTsNCi0gICAgICAgIH0NCi0NCi19IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q29udGV4dCA9IGVuZ2luZS5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KG1zZ0NvbnRleHQsIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZS5zZW5kRmF1bHQoZmF1bHRDb250ZXh0KTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlMSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7DQotICAgICAgICB9DQotfTwvcHJlPg0KLTwvc291cmNlPg0KLTxwPk5vdyB0aGF0IHdlIGhhdmUgdGhlIGNvZGluZyBpbiBwbGFjZSwgd2UgbmVlZCB0byBsZXQgQXhpczIga25vdyBhYm91dCBvdXINCi1uZXcgdHJhbnNwb3J0IHJlY2VpdmVyLiBXZSBkbyB0aGlzIGJ5IGFkZGluZyBhbiBlbnRyeSBpbnRvIHRoZSBheGlzMi54bWwNCi1maWxlLiBJZiB5b3UgbmVlZCB0byBwYXNzIGFueSBwcm9wZXJ0aWVzIGZvciB0aGUgdHJhbnNwb3J0IHRvIG9wZXJhdGUsIGl0IGNhbg0KLWFsc28gYmUgZG9uZSB0aHJvdWdoIHRoZSBheGlzMi54bWwgZmlsZS48L3A+DQotPHNvdXJjZT48cHJlPiAgICZsdDt0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJUUkFOU1BPUlRfTkFNRSIgY2xhc3M9Im9yZy5hcGFjaGUuQXhpczIudHJhbnNwb3J0LlRSQU5TUE9SVF9OQU1FLlRSQU5TUE9SVF9MSVNUTkVSX0NMQVNTIiZndDsNCi0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iUFJPUEVSVFlfTkFNRSImZ3Q7UFJPUEVSVFlfVkFMVUUmbHQ7L3BhcmFtZXRlciZndDsNCi0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iUFJPUEVSVFlfTkFNRV8yIiZndDtQUk9QRVJUWV9WQUxVRV8yJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAmbHQ7L3RyYW5zcG9ydFJlY2VpdmVyJmd0Ow0KLSAgPC9wcmU+DQotPC9zb3VyY2U+DQotPHA+QnkgdXNpbmcgYSBjb2RlIGZyYWdtZW50IGxpa2UNCi08Y29kZT5VdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh0cmFuc3BvcnRPdXQuZ2V0UGFyYW1ldGVyKE1haWxTcnZDb25zdGFudHMuU01UUF9VU0VSKSk8L2NvZGU+DQotd2UgY2FuIGV4dHJhY3QgdGhlIHBhcmFtZXRlcnMgdGhhdCB3ZSBpbnNlcnRlZCBpbnRvIHRoZSBheGlzMi54bWwgZmlsZS48L3A+DQotDQotPHA+QXMgeW91IGNhbiBzZWUsIGdldHRpbmcgYSBuZXcgdHJhbnNwb3J0IHJlY2VpdmVyIHVwIGFuZCBydW5uaW5nIGlzIGEgdGFzaw0KLXRoYXQgcmVxdWlyZXMgdmVyeSBsaXR0bGUgZWZmb3J0LjwvcD4NCi0NCi08aDI+VHJhbnNwb3J0IFNlbmRlcjwvaDI+DQotDQotPHA+QW55IG1lc3NhZ2UgdGhhdCBpcyB0byBiZSBzZW50IG91dCBvZiBBeGlzMiwgaXMgc2VudCB0aHJvdWdoIHRoZSBUcmFuc3BvcnQNCi1TZW5kZXIuIFRoZSBUcmFuc3BvcnQgU2VuZGVyIG5lZWRzIHRvIGJlIGV4dGVuZGVkIGZyb20gdGhlDQotb3JnLmFwYWNoZS5BeGlzMi50cmFuc3BvcnQuQWJzdHJhY3RUcmFuc3BvcnRTZW5kZXIgY2xhc3MuPC9wPg0KLQ0KLTxwPlRoZSBmb2xsb3dpbmcgYml0IG9mIGNvZGUgZnJvbSB0aGUgYWJzdHJhY3QgdHJhbnNwb3J0IHNlbmRlciB3aWxsIGNhbGwgdGhlDQotVHJhbnNwb3J0IFNlbmRlciB0aGF0IHlvdSB3cm90ZS48L3A+DQotPHNvdXJjZT48cHJlPi8vIElmIGFuIEVQUiBpcyBwcmVzZW50IHRoZW4gdGhlIG1lc3NhZ2UgaXMgZ29pbmcgb24gYSBkaWZmZXJlbnQgY2hhbm5lbC4NCi1pZiAoZXByICE9IG51bGwpIHsNCi0gICAgICAgIG91dCA9IG9wZW5UaGVDb25uZWN0aW9uKGVwciwgbXNnQ29udGV4dCk7DQotICAgICAgICBPdXRwdXRTdHJlYW0gbmV3T3V0ID0gc3RhcnRTZW5kV2l0aFRvQWRkcmVzcyhtc2dDb250ZXh0LCBvdXQpOw0KLSAgICAgICAgaWYgKG5ld091dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG91dCA9IG5ld091dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHdyaXRlTWVzc2FnZShtc2dDb250ZXh0LCBvdXQpOw0KLSAgICAgICAgZmluYWxpemVTZW5kV2l0aFRvQWRkcmVzcyhtc2dDb250ZXh0LCBvdXQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgIG91dCA9IChPdXRwdXRTdHJlYW0pIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCk7DQotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgc3RhcnRTZW5kV2l0aE91dHB1dFN0cmVhbUZyb21JbmNvbWluZ0Nvbm5lY3Rpb24obXNnQ29udGV4dCwgb3V0KTsNCi0gICAgICAgICAgICAgICAgd3JpdGVNZXNzYWdlKG1zZ0NvbnRleHQsIG91dCk7DQotICAgICAgICAgICAgICAgIGZpbmFsaXplU2VuZFdpdGhPdXRwdXRTdHJlYW1Gcm9tSW5jb21pbmdDb25uZWN0aW9uKG1zZ0NvbnRleHQsIG91dCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJCb3RoIHRoZSBUTyBhbmQgUHJvcGVydHkgTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX1dSSVRFUiBpcyBOdWxsLCBObyB3YXkgdG8gc2VuZCByZXNwb25zZS4iKTsNCi0gICAgICAgIH0NCi19PC9wcmU+DQotPC9zb3VyY2U+DQotPHA+VGhlcmVmb3JlLCBkZXBlbmRpbmcgb24gd2hldGhlciB5b3VyIHRyYW5zcG9ydCBpcyB1c2luZyB0aGUgc2FtZSBjaGFubmVsDQotdG8gc2VuZCB0aGUgcmVzcG9uc2Ugb3IgdXNpbmcgYSBkaWZmZXJlbnQgY2hhbm5lbCwgeW91IHdpbGwgbmVlZCB0byBpbXBsZW1lbnQNCi1hIHN1Yi1zZXQgb2YgdGhlIG1ldGhvZHMgZnJvbSB0aGUgYWJzdHJhY3QgY2xhc3MuPC9wPg0KLQ0KLTxwPkFmdGVyIGltcGxlbWVudGluZyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMsIHlvdSBjYW4gbGV0IEF4aXMyIGtub3cgYWJvdXQNCi15b3VyIG5ldyB0cmFuc3BvcnQgc2VuZGVyIGJ5IGFkZGluZyBhbiBlbnRyeSB0byB0aGUgYXhpczIueG1sIGZpbGUsIGxpa2UgeW91DQotZGlkIGZvciB0aGUgVHJhbnNwb3J0UmVjZWl2ZXIuPC9wPg0KLTxzb3VyY2U+PHByZT4gICZsdDt0cmFuc3BvcnRTZW5kZXIgbmFtZT0iVFJBTlNQT1JUX05BTUUiIGNsYXNzPSJvcmcuYXBhY2hlLkF4aXMyLnRyYW5zcG9ydC5UUkFOU1BPUlRfTkFNRS5UUkFOU1BPUlRfU0VOREVSX0NMQVNTIiZndDsNCi0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iUFJPUEVSVFlfTkFNRSImZ3Q7UFJPUEVSVFlfVkFMVUUmbHQ7L3BhcmFtZXRlciZndDsNCi0gICAgICAgICZsdDtwYXJhbWV0ZXIgbmFtZT0iUFJPUEVSVFlfTkFNRV8yIiZndDtQUk9QRVJUWV9WQUxVRV8yJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotICAmbHQ7L3RyYW5zcG9ydFNlbmRlciZndDsNCi0gIDwvcHJlPg0KLTwvc291cmNlPg0KLTxwPkhhdmUgYSBsb29rIGF0DQotb3JnLmFwYWNoZS5BeGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciB3aGljaCBpcyB1c2VkIHRvDQotc2VuZCBIVFRQIHJlc3BvbnNlcy48L3A+DQotDQotPHA+T25jZSB3ZSBoYXZlIHdyaXR0ZW4gb3VyIHRyYW5zcG9ydCByZWNlaXZlciBhbmQgb3VyIHRyYW5zcG9ydCBzZW5kZXIsIGFuZA0KLWluc2VydGVkIHRoZSByZXF1aXJlZCBlbnRyaWVzIGludG8gdGhlIGF4aXMyLnhtbCBmaWxlLCB3ZSBhcmUgZG9uZS4gSXQgaXMgYXMNCi1zaW1wbGUgYXMgdGhhdCE8L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiMGM1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+SW50cm9kdWNpbmcgQXhpczI8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxhIG5hbWU9ImJ1aWxkc2VydmljZXMiIGlkPSJidWlsZHNlcnZpY2VzIj48L2E+DQotPGgxPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUgLUJ1aWxkaW5nIFNlcnZpY2VzPC9oMT4NCi08cD5Ob3cgdGhhdCB5b3Uga25vdyBob3cgdG8gdXNlIEF4aXMyIHRvIGdlbmVyYXRlIGNsaWVudHMgZnJvbQ0KLVdTREwsIHRoaXMgc2VjdGlvbiBkaWdzIGEgbGl0dGxlIGRlZXBlciBzaG93aW5nIHlvdSBob3cgdG8gY3JlYXRlDQotc2VydmljZXMsIGFuZCBhbHNvIGhvdyB0byBjcmVhdGUgc2VydmljZXMgYW5kIGNsaWVudHMgImZyb20NCi1zY3JhdGNoIiwgc28gdG8gc3BlYWsuPC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaW50cm8iPkludHJvZHVjaW5nIEF4aXMyPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjd2hhdGlzIj5XaGF0IGlzIEF4aXMyPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN1bmRlcmhvb2QiPldoYXQncyBVbmRlciB0aGUNCi1Ib29kPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoYW5kbGVzc29hcCI+SG93IEF4aXMyIEhhbmRsZXMgU09BUA0KLU1lc3NhZ2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2Rpc3RyaWJ1dGlvbnMiPkF4aXMyDQotRGlzdHJpYnV0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNzYmQiPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij5BeGlzMi53YXIgRGlyZWN0b3J5DQotSGllcmFyY2h5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2RvY3MiPkF4aXMyIERvY3VtZW50cw0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNjbGllbnRzIj5BeGlzMiBhbmQgQ2xpZW50czwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWluc3RhbGxpbmd0ZXN0aW5nLmh0bWwjaW5zdGFsbGluZ3Rlc3RpbmciPkluc3RhbGxpbmcgYW5kDQotVGVzdGluZyBDbGllbnQgQ29kZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjaW50cm9zZXJ2aWNlcyI+SW50cm9kdWN0aW9uIHRvDQotU2VydmljZXM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjbWVzc2FnZWV4Y2hhbmdlIj5NZXNzYWdlIEV4Y2hhbmdlDQotUGF0dGVybnM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjcmVhdGVjbGllbnRzIj5DcmVhdGluZw0KLUNsaWVudHM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY2hvb3NpbmdjbGllbnQiPkNob29zaW5nIGEgQ2xpZW50DQotR2VuZXJhdGlvbiBNZXRob2Q8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2dlbmVyYXRpbmciPkdlbmVyYXRpbmcNCi1DbGllbnRzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNhZGIiPkF4aXMgRGF0YSBCaW5kaW5nDQotKEFEQik8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjYnVpbGRzZXJ2aWNlcyI+PHN0cm9uZz5CdWlsZGluZw0KLVNlcnZpY2VzPC9zdHJvbmc+PC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+PHN0cm9uZz5HZXR0aW5nDQotQ29tZm9ydGFibGUgd2l0aCBBdmFpbGFibGUgT3B0aW9uczwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2NyZWF0ZXNjcmF0Y2giPjxzdHJvbmc+Q3JlYXRpbmcgYQ0KLVNlcnZpY2UgZnJvbSBTY3JhdGNoPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cG9qbyI+PHN0cm9uZz5EZXBsb3lpbmcNCi1QbGFpbiBPbGQgSmF2YSBPYmplY3RzPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cnVuIj48c3Ryb25nPkRlcGxveWluZyBhbmQNCi1SdW5uaW5nIGFuIEF4aXMyIFNlcnZpY2UgQ3JlYXRlZCBmcm9tIFdTREw8L3N0cm9uZz48L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS5odG1sIj5Gb3IgRnVydGhlcg0KLVN0dWR5PC9hPjwvbGk+DQotPC91bD4NCi08cD48YSBuYW1lPSJnZXRjb21mb3J0YWJsZSIgaWQ9ImdldGNvbWZvcnRhYmxlIj48L2E+PC9wPg0KLTxoMj5HZXR0aW5nIENvbWZvcnRhYmxlIHdpdGggdGhlIEF2YWlsYWJsZSBPcHRpb25zPC9oMj4NCi08cD5BeGlzMiBwcm92aWRlcyBhIG51bWJlciBvZiB3YXlzIHRvIGNyZWF0ZSBhIHNlcnZpY2UsIHN1Y2gNCi1hczo8L3A+DQotPHVsPg0KLTxsaT5DcmVhdGUgYSBzZXJ2aWNlIGFuZCBidWlsZCBpdCBmcm9tIHNjcmF0Y2guIEluIHRoaXMgY2FzZSwgeW91DQotYnVpbGQgeW91ciBzZXJ2aWNlIGNsYXNzIHRvIHNwZWNpZmljYWxseSBhY2Nlc3MgQVhJT00gT01FbGVtZW50DQotb2JqZWN0cywgdGhlbiBjcmVhdGUgdGhlIHNlcnZpY2VzLnhtbCBmaWxlIGFuZCBwYWNrYWdlIGl0IGZvcg0KLWRlcGxveW1lbnQuPC9saT4NCi08bGk+RGVwbG95IFBsYWluIE9sZCBKYXZhIE9iamVjdHMgKFBPSk9zKSBhcyBhIHNlcnZpY2UuPC9saT4NCi08bGk+R2VuZXJhdGUgdGhlIHNlcnZpY2UgZnJvbSBXU0RMLiBKdXN0IGFzIHlvdSBjYW4gZ2VuZXJhdGUNCi1jbGllbnRzIHdpdGggV1NETCwgeW91IGNhbiBhbHNvIGdlbmVyYXRlIHRoZSBza2VsZXRvbiBvZiBhDQotc2VydmljZS48L2xpPg0KLTwvdWw+DQotPHA+TGV0J3MgbG9vayBhdCB0aGVzZSB0aHJlZSBvcHRpb25zLjwvcD4NCi08YSBuYW1lPSJjcmVhdGVzY3JhdGNoIiBpZD0iY3JlYXRlc2NyYXRjaCI+PC9hPg0KLTxoMj5DcmVhdGluZyBhIFNlcnZpY2UgZnJvbSBTY3JhdGNoPC9oMj4NCi08cD5DcmVhdGluZyBhIHNlcnZpY2UgZnJvbSBzY3JhdGNoIGlzIG5vdCB0aGUgbW9zdCBjb252ZW5pZW50IHdheQ0KLXRvIGRvIGl0LCBidXQgaXQgZG9lcyBnaXZlIHlvdSB0aGUgbW9zdCBjb250cm9sLiBUaGUgcHJvY2Vzcw0KLWludm9sdmVzIHNldmVyYWwgc3RlcHMuPC9wPg0KLTxwPjxiPlRoZSBzaG9ydCBzdG9yeTo8L2I+PC9wPg0KLTxvbD4NCi08bGk+Q3JlYXRlIHRoZSBzZXJ2aWNlIGNsYXNzIHdpdGggZWFjaCBvcGVyYXRpb24gdGhhdCBpcw0KLXJlcHJlc2VudGVkIGJ5IGEgbWV0aG9kIHRoYXQgdGFrZXMgYW4gb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQNCi1vYmplY3QgYXMgaXRzIGFyZ3VtZW50LiAoQW4gT01FbGVtZW50IGlzIGhvdyB0aGUgQVhJczIgT2JqZWN0IE1vZGVsDQotKEFYSU9NKSByZXByZXNlbnRzIGFuIFhNTCBlbGVtZW50Lik8L2xpPg0KLTxsaT5DcmVhdGUgdGhlIHNlcnZpY2UgZGVzY3JpcHRvciwgc2VydmljZXMueG1sLCB3aGljaCBkZWZpbmVzIHRoZQ0KLWNsYXNzIHRvIGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYW5kIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlDQotcmVjZWl2ZXJzLjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgLmFhciBmaWxlLCB3aXRoIHRoZSBjbGFzc2VzIGluIHRoZWlyIHByb3Blcg0KLWxvY2F0aW9ucyBiYXNlZCBvbiB0aGUgcGFja2FnZSBhbmQgdGhlIHNlcnZpY2VzLnhtbCBmaWxlIGluIHRoZQ0KLU1FVEEtSU5GIGRpcmVjdG9yeS48L2xpPg0KLTxsaT5EZXBsb3kgdGhlIC5hYXIgZmlsZSBieSB1c2luZyB0aGUgPGEgaHJlZj0NCi0id2ViYWRtaW5ndWlkZS5odG1sIj5XZWIgQWRtaW5pc3RyYXRpb24gYXBwbGljYXRpb248L2E+IG9yIGJ5DQotY29weWluZyBpdCB0byB0aGUgQXhpczIgc2VydmljZXMgZGlyZWN0b3J5LjwvbGk+DQotPC9vbD4NCi08cD48Yj5UaGUgbG9uZyBzdG9yeTo8L2I+PC9wPg0KLTxwPlN0YXJ0IGJ5IGNyZWF0aW5nIHRoZSBzZXJ2aWNlIGNsYXNzLCBhIHBsYWluIEphdmEgY2xhc3MgdGhhdA0KLXVzZXMgY2xhc3NlcyBmcm9tIHRoZSBBeGlzMiBsaWJyYXJpZXMgKHNlZSBDb2RlIExpc3RpbmcgOCkuPC9wPg0KLTxoMz5Db2RlIExpc3RpbmcgOC1DcmVhdGluZyB0aGUgU2VydmljZSBDbGFzczwvaDM+DQotPHByZT4NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotDQotcHVibGljIGNsYXNzIFNhbXBsZVNlcnZpY2Ugew0KLQ0KLSAgICBwdWJsaWMgT01FbGVtZW50IHNheUhlbGxvKE9NRWxlbWVudCBlbGVtZW50KSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIGVsZW1lbnQuYnVpbGQoKTsNCi0gICAgICAgICAgICBlbGVtZW50LmRldGFjaCgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyByb290TmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWFkaW5nICIrcm9vdE5hbWUrIiBlbGVtZW50Iik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgT01FbGVtZW50IGNoaWxkRWxlbWVudCA9IGVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIHBlcnNvblRvR3JlZXQgPSBjaGlsZEVsZW1lbnQuZ2V0VGV4dCgpOw0KLQ0KLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsNCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic2F5SGVsbG9SZXNwb25zZSIsIA0KLW9tTnMpOw0KLSAgICAgICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImdyZWV0aW5nIiwgb21Ocyk7DQotICAgICAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgIkhlbGxvLCANCi0iK3BlcnNvblRvR3JlZXQpKTsNCi0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBtZXRob2Q7DQotICAgICAgICB9DQotDQotICAgICBwcml2YXRlIHZvaWQgcGluZygpew0KLSAgICAgfQ0KLSAgICANCi19DQotPC9wcmU+DQotPHA+TWFrZSBzdXJlIHRvIGluY2x1ZGUgQXhpczIgbGlicmFyaWVzIGluIHlvdXIgY2xhc3MgcGF0aCB3aGVuDQotY29tcGlsaW5nIHRoZSBzb3VyY2UuPC9wPg0KLTxwPkF4aXMyIHVzZXMgQVhJT00sIG9yIHRoZSBBWElzIE9iamVjdCBNb2RlbCwgYSBET00gKERvY3VtZW50DQotT2JqZWN0IE1vZGVsKSAtbGlrZSBzdHJ1Y3R1cmUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgU3RBWCBBUEkgKA0KLVN0cmVhbWluZyBBUEkgZm9yIFhNTCkuIE1ldGhvZHMgdGhhdCBhY3QgYXMgc2VydmljZXMgbXVzdCB0YWtlIGFuDQotT01FbGVtZW50IGFzIHRoZWlyIGFyZ3VtZW50LCB3aGljaCByZXByZXNlbnRzIHRoZSBwYXlsb2FkIG9mIHRoZQ0KLWluY29taW5nIFNPQVAgbWVzc2FnZS4gKEFuIE9NRWxlbWVudCBpcyBqdXN0IEFYSU9NJ3Mgd2F5IG9mDQotcmVwcmVzZW50aW5nIGFuIFhNTCBlbGVtZW50LCBsaWtlIGEgRE9NIEVsZW1lbnQgb2JqZWN0LikgSW4gdGhpcw0KLWNhc2UsIHlvdSdyZSBleHRyYWN0aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlDQotcGF5bG9hZCBlbGVtZW50LCBhZGRpbmcgdGV4dCB0byBpdCwgYW5kIHVzaW5nIGl0IGFzIGNvbnRlbnQgZm9yIHRoZQ0KLXJldHVybiBPTUVsZW1lbnQuIFVubGVzcyB0aGlzIGlzIGFuICJpbiBvbmx5IiBzZXJ2aWNlLCB0aGVzZQ0KLW1ldGhvZHMgbXVzdCByZXR1cm4gYW4gT01FbGVtZW50LCBiZWNhdXNlIHRoYXQgYmVjb21lcyB0aGUgcGF5bG9hZA0KLW9mIHRoZSByZXR1cm4gU09BUCBtZXNzYWdlLjwvcD4NCi08cD5UbyB0dXJuIHRoaXMgY2xhc3MgaW50byBhIHNlcnZpY2UsIGNyZWF0ZSB0aGUgc2VydmljZQ0KLWRlc2NyaXB0aW9uIGZpbGUsIHNlcnZpY2VzLnhtbCwgYXMgaW4gQ29kZSBMaXN0aW5nIDkuPC9wPg0KLTxoMz5Db2RlIExpc3RpbmcgOSAtIENyZWF0ZSB0aGUgU2VydmljZSBEZXNjcmlwdGlvbjwvaDM+DQotPHByZT4NCi0mbHQ7c2VydmljZSBuYW1lPSJVc2VyR3VpZGVTYW1wbGVTZXJ2aWNlIiZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAgICAgVGhpcyBpcyBhIHNhbXBsZSBzZXJ2aWNlIGNyZWF0ZWQgaW4gdGhlIEF4aXMyIFVzZXIncyBHdWlkZQ0KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgDQotJmd0O29yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuU2FtcGxlU2VydmljZQ0KLSZsdDsvcGFyYW1ldGVyJmd0Ow0KLQ0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9InNheUhlbGxvIiZndDsNCi0gICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgDQotY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9InBpbmciJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciANCi1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLSZsdDsvc2VydmljZSZndDsNCi08L3ByZT4NCi08cD5UaGlzIGRvY3VtZW50IGRlZmluZXMgdGhlIHNlcnZpY2UsIGNhbGxlZCBieSB0aGUgPGEgaHJlZj0NCi0id2ViYWRtaW5ndWlkZS5odG1sIj5XZWIgQWRtaW5pc3RyYXRpb24gQXBwbGljYXRpb248L2E+LCBhbmQgdGhlDQotY2xhc3MgdXNlZCB0byBzZXJ2ZSByZXF1ZXN0cy4gRm9yIGVhY2ggb3BlcmF0aW9uLCBpdCBkZWZpbmVzIHRoZQ0KLWFwcHJvcHJpYXRlIG1lc3NhZ2UgcmVjZWl2ZXIgY2xhc3MuPC9wPg0KLTxwPkNyZWF0ZSBhIG5ldyBkaXJlY3RvcnksIE1FVEEtSU5GLCBpbiB0aGUgbWFpbiBkaXJlY3RvcnkgZm9yIHRoZQ0KLWNsYXNzLiAoSW4gdGhpcyBjYXNlLCB0aGF0J3MgdGhlIHNhbWUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlDQotb3JnIGRpcmVjdG9yeSkgYW5kIHBsYWNlIHRoZSBzZXJ2aWNlcy54bWwgZmlsZSBpbiBpdC48L3A+DQotPHA+Q3JlYXRlIHRoZSAuYWFyIGZpbGUgYnkgdHlwaW5nOiBqYXIgY3ZmIFNhbXBsZVNlcnZpY2UuYWFyDQotLi8qPC9wPg0KLTxwPkRlcGxveSB0aGUgU2FtcGxlU2VydmljZS5hYXIgZmlsZSBieSB1c2luZyB0aGUgPGEgaHJlZj0NCi0id2ViYWRtaW5ndWlkZS5odG1sIj5XZWIgQWRtaW5pc3RyYXRpb24gYXBwbGljYXRpb248L2E+IG9yIGJ5DQotY29weWluZyBpdCB0byB0aGUgQXhpczIgc2VydmljZXMgZGlyZWN0b3J5LjwvcD4NCi08cD5Ob3cgeW91IGNhbiBjcmVhdGUgYSBjbGllbnQgY2xhc3MgdGhhdCBhY2Nlc3NlcyB0aGUgc2VydmljZQ0KLWRpcmVjdGx5IChzZWUgQ29kZSBMaXN0aW5nIDEwKS48L3A+DQotPGgzPkNvZGUgTGlzdGluZyAxMCAtIENyZWF0ZSBhIENsaWVudCBDbGFzcyB0aGF0IEFjY2Vzc2VzIHRoZQ0KLVNlcnZpY2UgRGlyZWN0bHk8L2gzPg0KLTxwcmU+DQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50Ow0KLQ0KLXB1YmxpYyBjbGFzcyBTYW1wbGVDbGllbnQgew0KLQ0KLSAgICAgICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSANCi0gICAgICAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKA0KLSAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvVXNlckd1aWRlU2FtcGxlU2VydmljZSIpOw0KLQ0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ3JlZXRVc2VyUGF5bG9hZChTdHJpbmcgcGVyc29uVG9HcmVldCkgew0KLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsNCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKA0KLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic2F5SGVsbG8iLCBvbU5zKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJwZXJzb25Ub0dyZWV0IiwgDQotb21Ocyk7DQotICAgICAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgcGVyc29uVG9HcmVldCkpOw0KLSAgICAgICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7DQotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IA0KLVNhbXBsZUNsaWVudC5ncmVldFVzZXJQYXlsb2FkKCJKb2huIik7DQotICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7DQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsNCi0gICAgICAgICAgICAgICAgDQotb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7DQotDQotICAgICAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsNCi0gICAgICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7DQotDQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHJlc3VsdC5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCk7DQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZSk7DQotDQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8oWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICANCi19DQotPC9wcmU+DQotPHA+VGhpcyBjbGFzcyB1c2VzIHRoZSBzYW1lIHRlY2huaXF1ZSBvZiBzZW5kaW5nIGFuZCByZWNlaXZpbmcNCi1PTUVsZW1lbnRzLCBidXQgaXQncyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoZSB1c2Ugb2YgdGhlIE9wdGlvbnMNCi1jbGFzcy4gVGhpcyBjbGFzcyBlbmFibGVzIHlvdSB0byBkZXRlcm1pbmUgcHJvcGVydGllcyBzdWNoIGFzIHRoZQ0KLXRyYW5zcG9ydCB1c2VkIGZvciB0aGUgcmV0dXJuIG1lc3NhZ2UgKHRoZSB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlDQotb3V0Z29pbmcgbWVzc2FnZSBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgVVJMIG9mIHRoZSBkZXN0aW5hdGlvbikNCi1hbmQgdGhlIFNPQVAgdmVyc2lvbiB0byB1c2UuIEluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBzZXR0ZXIgYW5kDQotZ2V0dGVyIG1ldGhvZHMgb2Ygc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGFmZmVjdCBob3cgdGhlIGNsaWVudA0KLWludGVyYWN0cyB3aXRoIHRoZSBzZXJ2aWNlLCB0aGUgT3B0aW9ucyBjbGFzcyBlbmFibGVzIHlvdSB0byBjcmVhdGUNCi1pbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gT3B0aW9ucyBvYmplY3RzLiBTbyBpZiBhIHByb3BlcnR5DQotaXMgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IE9wdGlvbnMgb2JqZWN0IHVzZWQsIHRoZSBjbGllbnQgY2FuDQotY2hlY2sgdGhlIHBhcmVudCBPcHRpb25zIG9iamVjdCBvZiB0aGUgY3VycmVudCBPcHRpb25zIG9iamVjdC48L3A+DQotPHA+Q29tcGlsZSBhbmQgcnVuIHRoZSBhYm92ZSBTYW1wbGVDbGllbnQuamF2YS4gTWFrZSBzdXJlIHRvIGhhdmUNCi1hbGwgYXhpczIgbGlicmFyaWVzIGluIHlvdXIgY2xhc3MgcGF0aC4gSWYgYWxsIGhhcyBnb25lIHdlbGwsDQotJ0hlbGxvLCBKb2huJyB3aWxsIGJlIHNob3duIGFzIHRoZSBvdXRwdXQgaW4gdGhlIGNvbnNvbGUuPC9wPg0KLTxhIG5hbWU9ImRlcGxveXBvam8iIGlkPSJkZXBsb3lwb2pvIj48L2E+DQotPGgyPkRlcGxveWluZyBQbGFpbiBPbGQgSmF2YSBPYmplY3RzIChQT0pPcyk8L2gyPg0KLTxwPk9uZSB2ZXJ5IGVhc3kgd2F5IHRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGlzIHNpbXBseSB0byBkZXBsb3kNCi10aGUgSmF2YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBzZXJ2aWNlLiBTdGFydCB3aXRoIHRoZSBjbGFzcywNCi1zaG93biBpbiBDb2RlIExpc3RpbmcgMTEuPC9wPg0KLTxoMz48Yj5Db2RlIExpc3RpbmcgMTEgLSBDcmVhdGluZyB0aGUgQ2xhc3MgU2FtcGxlU2VydmljZTwvYj48L2gzPg0KLTxwcmU+DQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBTYW1wbGVTZXJ2aWNlIHsNCi0NCi0gICAgcHVibGljIHZvaWQgZG9Jbk9ubHkoKXsNCi0gICAgIHJldHVybjsgDQotICAgIH0gDQotICAgICANCi0gICAgcHVibGljIFN0cmluZyBub1BhcmFtZXRlcnMoKXsNCi0gICAgICByZXR1cm4gIkhlbGxvIjsNCi0gICAgfSANCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5T25lUGFyYW1ldGVyRWNobyhTdHJpbmcgdG9FY2hvKXsNCi0gICAgICByZXR1cm4gdG9FY2hvOw0KLSAgICB9IA0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gbXVsdGlwbGVQYXJhbWV0ZXJzQWRkKGZsb2F0IHByaWNlLCBpbnQgaXRlbUlkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGl0ZW1OYW1lKXsNCi0gICAgICAvL0NvZGUgdG8gaGFuZGxlIHRoZSBsb2dpYw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfSANCi0gDQotfQ0KLTwvcHJlPg0KLTxwPk5leHQsIHlvdSdsbCBuZWVkIHRvIHRlbGwgQXhpczIgd2hhdCBjbGFzcyBjb3JyZXNwb25kcyB3aXRoIHdoYXQNCi1XZWIgc2VydmljZSBjYWxscy4gRG8gdGhpcyBieSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIHNlcnZpY2VzLnhtbA0KLWFuZCBhZGRpbmcgdGhlIGZvbGxvd2luZyBzaG93biBpbiBDb2RlIExpc3RpbmcgMTIuPC9wPg0KLTxoMz48Yj5Db2RlIExpc3RpbmcgMTIgLSBDcmVhdGluZyBzZXJ2aWNlcy54bWw8L2I+PC9oMz4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlIG5hbWU9IlNhbXBsZVNlcnZpY2UiIHNjb3BlPSJhcHBsaWNhdGlvbiImZ3Q7DQotICAgICZsdDtkZXNjcmlwdGlvbiZndDsNCi0gICAgICAgIFNhbXBsZSBTZXJ2aWNlDQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7DQotICAgICZsdDttZXNzYWdlUmVjZWl2ZXJzJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciANCi0gICAgICAgICAgICBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ig0KLSAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIvJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlcg0KLSAgICAgICAgICAgIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgJmx0Oy9tZXNzYWdlUmVjZWl2ZXJzJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyImZ3Q7DQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLlNhbXBsZVNlcnZpY2UNCi0gICAgJmx0Oy9wYXJhbWV0ZXImZ3Q7DQotJmx0Oy9zZXJ2aWNlJmd0Ow0KLTwvcHJlPg0KLTxwPlRoaXMgZmlsZSBtYWtlcyB0aGUgSW5Pbmx5IGFuZCBJbk91dCBNRVBzIGF2YWlsYWJsZSB0byB0aGUNCi1zZXJ2aWNlIGFuZCB0ZWxscyBBeGlzMiB3aGljaCBjbGFzcyB0byBjYWxsOyBvcGVyYXRpb25zIG11c3QgbWF0Y2gNCi1tZXRob2QgbmFtZXMuIEluIG90aGVyIHdvcmRzLCBBeGlzMiBhdXRvbWF0aWNhbGx5IHNlbmRzIGEgY2FsbCB0bw0KLXRoZSBtdWx0aXBsZVBhcmFtZXRlcnNBZGQgb3BlcmF0aW9uIHRvIHRoZQ0KLW9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuU2FtcGxlU2VydmljZS5tdWx0aXBsZVBhcmFtZXRlcnNBZGQoKQ0KLW1ldGhvZC48L3A+DQotPHA+Tm93IGl0J3MgdGltZSB0byBjcmVhdGUgdGhlIGRpc3RyaWJ1dGlvbi4gQXJyYW5nZSB5b3VyIGZpbGVzIGluDQotdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIChzZWUgQ29kZSBMaXN0aW5nIDEzKS48L3A+DQotPGgzPjxiPkNvZGUgTGlzdGluZyAxMy0gQ3JlYXRlIHRoZSBEaXJlY3RvcnkgU3RydWN0dXJlIGZvciB0aGUNCi1EaXN0cmlidXRpb248L2I+PC9oMz4NCi08cHJlPg0KLSAtIFNhbXBsZVNlcnZpY2UNCi0gICAtIE1FVEEtSU5GDQotICAgICAtIHNlcnZpY2VzLnhtbA0KLSAgIC0gb3JnDQotICAgICAtIGFwYWNoZQ0KLSAgICAgICAtIGF4aXMyDQotICAgICAgICAgLSBheGlzMnVzZXJndWlkZQ0KLSAgICAgICAgICAgLSBTYW1wbGVTZXJ2aWNlLmNsYXNzDQotPC9wcmU+DQotPHA+RmluYWxseSwgZGVwbG95IHRoZSBzZXJ2aWNlIGJ5IGNvcHlpbmcgdGhlIFNhbXBsZVNlcnZpY2UNCi1kaXJlY3RvcnkgdG8gdGhlIHdlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyBkaXJlY3Rvcnkgb24gdGhlDQotc2VydmxldCBlbmdpbmUuIFlvdSBjYW4gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgaXQncyBiZWVuIHByb3Blcmx5DQotZGVwbG95ZWQgYnkgY2hlY2tpbmcgPGEgaHJlZj0NCi0iaHR0cDovLyUzQ2hvc3QlM0U6JTNDcG9ydCUzRS9heGlzMi9zZXJ2aWNlcy9saXN0U2VydmljZXMiPmh0dHA6Ly8mbHQ7aG9zdCZndDs6Jmx0O3BvcnQmZ3Q7L2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlczwvYT4uPC9wPg0KLTxhIG5hbWU9ImRlcGxveXJ1biIgaWQ9ImRlcGxveXJ1biI+PC9hPg0KLTxoMj5EZXBsb3lpbmcgYW5kIFJ1bm5pbmcgYW4gQXhpczIgU2VydmljZSBDcmVhdGVkIGZyb20gV1NETDwvaDI+DQotPHA+SWYgeW91IGhhdmUgYSBXU0RMIGZpbGUsIHlvdSBjYW4gZWFzaWx5IGNyZWF0ZSBhbmQgZGVwbG95IGENCi1zZXJ2aWNlIGJhc2VkIG9uIHRoYXQgZGVzY3JpcHRpb24uIEZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBzZXJ2aWNlDQotYmFzZWQgb24gdGhlIHNhbWUgV1NETCBmaWxlIHVzZWQgaW4gdGhlIDxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCI+Y2xpZW50cyBzZWN0aW9uPC9hPiBvZiB0aGlzDQotZG9jdW1lbnQsIHlvdSB3aWxsIGZvbGxvdyB0aGUgc3RlcHMgYmVsb3cuPC9wPg0KLTxwPjxiPlRoZSBzaG9ydCBzdG9yeTo8L2I+PC9wPg0KLTxvbD4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5jZ2kjc3RkLWJpbiI+DQotRG93bmxvYWQ8L2E+IHRoZSBBeGlzMiBzdGFuZGFyZCBkaXN0cmlidXRpb24sIGlmIHlvdSBoYXZlIG5vdCBkb25lDQotc28gYWxyZWFkeS48L2xpPg0KLTxsaT5HZW5lcmF0ZSB0aGUgc2tlbGV0b24gdXNpbmcgdGhlIFdTREwySmF2YSB1dGlsaXR5LCBhcyBpbjo8YnIgLz4NCi08cHJlPg0KLWphdmEgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSAtdXJpIGZpbGU6Ly8vQzovYXBwcy9heGlzMi9zYW1wbGVzL3pTYW1wbGUvQXhpczJVc2VyR3VpZGUud3NkbCAtcCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1kIGFkYiAtcyAtd3YgMS4xIC1zcyAtc2QgLXNzaQ0KLTwvcHJlPjwvbGk+DQotPGxpPk9wZW4gdGhlICpTa2VsZXRvbi5qYXZhIGZpbGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB5b3VyDQotc2VydmljZSB0byB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuPC9saT4NCi08bGk+QnVpbGQgYSBzZXJ2aWNlIHVzaW5nIEFudCBieSB0eXBpbmcgYW50IGphci5zZXJ2ZXI8L2xpPg0KLTxsaT5EZXBsb3kgdGhlIHNlcnZpY2UgYnkgY29weWluZyB0aGUgYnVpbGQvbGliLyouYWFyIGZpbGUgdG8NCi0mbHQ7SjJFRV9IT01FJmd0Oy93ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXM8L2xpPg0KLTxsaT5DaGVjaw0KLWh0dHA6Ly8mbHQ7c2VydmVyJmd0OzombHQ7cG9ydCZndDsvYXhpczIvc2VydmljZXMvbGlzdFNlcnZpY2VzIHRvDQotbWFrZSBzdXJlIHRoZSBzZXJ2aWNlIGhhcyBiZWVuIHByb3Blcmx5IGRlcGxveWVkLjwvbGk+DQotPC9vbD4NCi08cD48Yj5UaGUgbG9uZyBzdG9yeTo8L2I+PC9wPg0KLTxwPkFzIHdpdGggZ2VuZXJhdGluZyBjbGllbnRzLCB5b3Ugd2lsbCBuZWVkIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSNzdGQtYmluIj4NCi1BeGlzMiBTdGFuZGFyZCBEaXN0cmlidXRpb248L2E+LCBiZWNhdXNlIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSN3YXIiPg0KLUF4aXMyIFdBUiBEaXN0cmlidXRpb248L2E+IGRvZXMgbm90IGluY2x1ZGUgdGhlIFdTREwySmF2YSB1dGlsaXR5Lg0KLU9uY2UgeW91J3ZlIGdvdCBpdCBkb3dubG9hZGVkIGFuZCB1bnBhY2tlZCwgbWFrZSBzdXJlIHRoYXQgeW91IHNldA0KLXRoZSBBWElTMl9IT01FIHZhcmlhYmxlIHRvIHBvaW50IHRvIHRoZSBsb2NhdGlvbiBpbiB3aGljaCB5b3UndmUNCi11bnBhY2tlZCBpdC48L3A+DQotPHA+Tm93IHlvdSBhcmUgcmVhZHkgdG8gZ2VuZXJhdGUgdGhlIGFjdHVhbCBzZXJ2aWNlLiBUbyBrZWVwIHRoaW5ncw0KLW5lYXQsIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnkgYW5kIGNoYW5nZSB0byBpdC4gVGhlIFdTREwgZmlsZSBpcyB0aGUNCi1zYW1lIG9uZSByZWZlcmVuY2VkIGluIDxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMjZ2VuZXJhdGluZy54aHRtbCI+R2VuZXJhdGluZyBDbGllbnRzPC9hPg0KLWFuZCBpbmNsdWRlcyBmb3VyIG9wZXJhdGlvbnM6IE5vUGFyYW1ldGVycywgVHdvV2F5T25lUGFyYW1ldGVyRWNobywNCi1NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtLCBhbmQgRG9Jbk9ubHkuIFRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlLA0KLXVzZSB0aGUgV1NETDJKYXZhIHV0aWxpdHksIGFzIGluIENvZGUgTGlzdGluZyAxNC48L3A+DQotPGgzPkNvZGUgTGlzdGluZyAxNCAtIFVzaW5nIHRoZSBXU0RMMkphdmEgVXRpbGl0eSB0byBHZW5lcmF0ZSB0aGUNCi1TZXJ2aWNlPC9oMz4NCi08cD48c3Ryb25nPkNvZGUgTGlzdGluZyAxNC4xOjwvc3Ryb25nPjwvcD4NCi08cHJlPg0KLWphdmEgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSAtdXJpIA0KLWZpbGU6Ly8vQzovYXBwcy9heGlzMi9zYW1wbGVzL3pTYW1wbGUvQXhpczJVc2VyR3VpZGUud3NkbCAtcCANCi1vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1kIGFkYiAtcyAtd3YgQGF4aXMyX3ZlcnNpb25AIC1zcyAtc2QNCi08L3ByZT4NCi08cD5Ob3RlOiBNYWtlIHN1cmUgYWxsIHRoZSAuamFyIGZpbGVzIGluIHRoZSBBeGlzMiBsaWIgZGlyZWN0b3J5IGlzDQotc2V0IHRvIHRoZSBDTEFTU1BBVEggYmVmb3JlIHlvdSBydW4gdGhlIGFib3ZlIGNvZGUuPC9wPg0KLTxwPlRoaXMgc3RhdGVtZW50IHRlbGxzIHRoZSB1dGlsaXR5IHlvdSB3YW50IHRvIGNyZWF0ZSBhIHNlcnZpY2UNCi1vdXQgb2YgdGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZpbGUgPGEgaHJlZj0NCi0idXNlcmd1aWRlLWNvZGVsaXN0aW5nNS5odG1sIj5BeGlzMlVzZXJHdWlkZS53c2RsPC9hPiwgYW5kIHRoYXQgdGhlDQotSmF2YSBjbGFzc2VzIGdlbmVyYXRlZCBzaG91bGQgYmUgaW4gdGhlDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZSBwYWNrYWdlICgtcCkuIChZb3UgY2FuIHZpZXcgdGhlDQotYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgY3JlYXRlZC4pIEl0IGFsc28gaW5kaWNhdGVzIHRoYXQgeW91IHdhbnQNCi10byB1c2UgdGhlIEF4aXMyIERhdGFCaW5kaW5nIEZyYW1ld29yaywgb3IgQURCICgtZCksIHRvIGdlbmVyYXRlDQotb25seSBzeW5jaHJvbm91cyBvciBibG9ja2luZyBjb2RlICgtcyksIGFuZCB0byBnZW5lcmF0ZSBzZXJ2ZXItc2lkZQ0KLWNvZGUgKC1zcykgYXMgb3Bwb3NlZCB0byBhIGNsaWVudCwgaW5jbHVkaW5nIHRoZSBzZXJ2aWNlcy54bWwNCi1zZXJ2aWNlIGRlc2NyaXB0b3IgZmlsZSAoLXNkKS4gSXQgYWxzbyBzcGVjaWZpZXMgdmVyc2lvbg0KLUBheGlzMl92ZXJzaW9uQCBmb3IgdGhlIFdTREwgZmlsZSAoLXd2KTxzdHJvbmc+Ljwvc3Ryb25nPjwvcD4NCi08cD48c3Ryb25nPkNvZGUgTGlzdGluZyAxNC4yOjwvc3Ryb25nPjwvcD4NCi08cD5Zb3UgY2FuIGFsc28gdXNlIHRoZSBmb2xsb3dpbmcgc2NyaXB0IGZpbGVzIHRvIGFjaGlldmUgdGhlIHNhbWUuDQotSW4gdGhpcyBjYXNlIHlvdSBkbyBub3QgaGF2ZSB0aGUgc2V0IHRoZSBDTEFTU1BBVEggbWFudWFsbHkuPC9wPg0KLTxwPkZvciBMaW51eDo8L3A+DQotPHByZT4NCi0kQVhJUzJfSE9NRS9iaW4vd3NkbDJqYXZhLnNoIC11cmkgZmlsZTovLy9DOi9hcHBzL2F4aXMyL3NhbXBsZXMvelNhbXBsZS9BeGlzMlVzZXJHdWlkZS53c2RsDQotLXAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZSAtbyB0YXJnZXRfZGlyZWN0b3J5X25hbWUgLWQgYWRiIC1zIC13diBAYXhpczJfdmVyc2lvbkAgLXNzIC1zZA0KLTwvcHJlPg0KLTxwPkZvciBNUyBXaW5kb3dzOjwvcD4NCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cd3NkbDJqYXZhLmJhdCAtdXJpIGZpbGU6XFxcQzpcYXBwc1xheGlzMlxzYW1wbGVzXHpTYW1wbGVcQXhpczJVc2VyR3VpZGUud3NkbA0KLS1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLW8gdGFyZ2V0X2RpcmVjdG9yeV9uYW1lIC1kIGFkYiAtcyAtd3YgQGF4aXMyX3ZlcnNpb25AIC1zcyAtc2QNCi08L3ByZT4NCi08cD5JbiBib3RoIGluc3RhbmNlcywgYXQgdGhpcyBwb2ludCwgeW91IHNob3VsZCBzZWUgZm91ciBuZXcgaXRlbXMNCi1pbiB5b3VyIGNob3NlbiBkaXJlY3Rvcnk6IHRoZSBidWlsZC54bWwgZmlsZSwgd2hpY2ggaW5jbHVkZXMNCi1pbnN0cnVjdGlvbnMgZm9yIEFudCwgdGhlIHNyYyBkaXJlY3RvcnksIHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUNCi1nZW5lcmF0ZWQgY2xhc3NlcyBhbmQgc3R1YnMsIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5LCB3aGljaA0KLWluY2x1ZGVzIGEgcmVnZW5lcmF0ZWQgdmVyc2lvbiBvZiB0aGUgV1NETCwgYW5kIHRoZSBzZXJ2aWNlcy54bWwNCi1maWxlLCB3aGljaCB1bHRpbWF0ZWx5IGNvbnRyb2xzIHRoZSBzZXJ2aWNlJ3MgYmVoYXZpb3IuPC9wPg0KLTxwPllvdSBjYW4gY29tcGlsZSB0aGUgc2VydmljZSBhdCB0aGlzIHBvaW50LCBidXQgaXQgZG9lc24ndA0KLWFjdHVhbGx5IGRvIGFueXRoaW5nIHlldC4gWW91IGNhbiBzb2x2ZSB0aGF0IHByb2JsZW0gYnkgb3BlbmluZyB0aGUNCi1zcmNcb3JnXGFwYWNoZVxheGlzMlxheGlzMnVzZXJndWlkZVxBeGlzMlVzZXJHdWlkZVNlcnZpY2VTa2VsZXRvbi5qYXZhDQotZmlsZSBhbmQgZWl0aGVyIGVkaXRpbmcgdGhlIGNvZGUgaW4gYm9sZCAtLSBtYWtlIHN1cmUgeW91IG1hbmFnZQ0KLXBhcmFtZXRlciBudW1iZXJzIC0tIG9yIHJlcGxhY2luZyBhbGwgdGhlIGNvZGUgd2l0aCB0aGUgZm9sbG93aW5nDQotaW4gQ29kZSBMaXN0aW5nIDE1LjwvcD4NCi08aDM+Q29kZSBMaXN0aW5nIDE1IC0gQ29tcGlsaW5nIHRoZSBTZXJ2aWNlPC9oMz4NCi08cHJlPg0KLS8qKg0KLSAqIEF4aXMyVXNlckd1aWRlU2VydmljZVNrZWxldG9uLmphdmENCi0gKg0KLSAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCBPY3QgMTUsIDIwMDYgKDExOjIzOjE4IA0KLUdNVCswMDowMCkNCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotLyoqDQotICogIEF4aXMyVXNlckd1aWRlU2VydmljZVNrZWxldG9uIGphdmEgc2tlbGV0b24gZm9yIHRoZSBheGlzU2VydmljZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBeGlzMlVzZXJHdWlkZVNlcnZpY2VTa2VsZXRvbiB7DQotICAgICANCi0gICAgICAgICANCi0gICAgLyoqDQotICAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0gICAgICAgICANCi0gICAgICogQHBhcmFtIHBhcmFtNw0KLSAgICAgICAgIA0KLSAgICAqLw0KLSAgICBwdWJsaWMgIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuTm9QYXJhbWV0ZXJzUmVzcG9uc2UgDQotTm9QYXJhbWV0ZXJzDQotICAgICAgICAob3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5Ob1BhcmFtZXRlcnNSZXF1ZXN0IHBhcmFtNykNCi0gICAgICAgICANCi0gICAgew0KLSAgICAgICAgPGI+U3lzdGVtLm91dC5wcmludGxuKHBhcmFtNyk7DQotDQotICAgICAgICBOb1BhcmFtZXRlcnNSZXNwb25zZSByZXMgPQ0KLSAgICAgICAgICAgIG5ldyBOb1BhcmFtZXRlcnNSZXNwb25zZSgpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlczs8L2I+DQotICAgIH0NCi0gICAgIA0KLSAgICAgICAgIA0KLSAgICAvKioNCi0gICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLSAgICAgICAgIA0KLSAgICAgKiBAcGFyYW0gcGFyYW05DQotICAgICAgICAgDQotICAgICovDQotICAgIHB1YmxpYyAgDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UgDQotVHdvV2F5T25lUGFyYW1ldGVyRWNobw0KLSAgICAgICAgKA0KLSAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QgDQotcGFyYW05DQotICAgICAgICAgKQ0KLSAgICAgICAgIA0KLSAgICB7DQotICAgICAgICA8Yj5TeXN0ZW0ub3V0LnByaW50bG4ocGFyYW05LmdldEVjaG9TdHJpbmcoKSk7DQotDQotICAgICAgICBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UgcmVzID0NCi0gICAgICAgICAgICBuZXcgVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlKCk7DQotICAgICAgICANCi0gICAgICAgIHJlcy5zZXRFY2hvU3RyaW5nKHBhcmFtOS5nZXRFY2hvU3RyaW5nKCkpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlczs8L2I+DQotICAgIH0NCi0gICAgIA0KLSAgICAgICAgIA0KLSAgICAvKioNCi0gICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLSAgICAgICAgIA0KLSAgICAgKiBAcGFyYW0gcGFyYW0xMQ0KLSAgICAgICAgIA0KLSAgICAqLw0KLSAgICBwdWJsaWMgIHZvaWQgRG9Jbk9ubHkNCi0gICAgICAgICgNCi0gICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkRvSW5Pbmx5UmVxdWVzdCBwYXJhbTExDQotICAgICAgICAgKQ0KLSAgICAgICAgIA0KLSAgICB7DQotICAgICAgICA8Yj5TeXN0ZW0ub3V0LnByaW50bG4ocGFyYW0xMS5nZXRNZXNzYWdlU3RyaW5nKCkpOzwvYj4NCi0gICAgfQ0KLSAgICAgDQotICAgICAgICAgDQotICAgIC8qKg0KLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlDQotICAgICAgICAgDQotICAgICAqIEBwYXJhbSBwYXJhbTEyDQotICAgICAgICAgDQotICAgICovDQotICAgIHB1YmxpYyAgDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UgDQotTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbQ0KLSAgICAgICAgKA0KLSAgICAgICAgIA0KLW9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QgDQotcGFyYW0xMg0KLSAgICAgICAgICkNCi0gICAgICAgICANCi0gICAgew0KLSAgICAgICAgPGI+U3lzdGVtLm91dC5wcmludGxuKHBhcmFtMTIuZ2V0UHJpY2UoKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGFyYW0xMi5nZXRJdGVtSWQoKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocGFyYW0xMi5nZXREZXNjcmlwdGlvbigpKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXJhbTEyLmdldEl0ZW1OYW1lKCkpOw0KLQ0KLSAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlIHJlcyA9DQotICAgICAgICAgICAgbmV3IE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSgpOw0KLSAgICAgICAgDQotICAgICAgICByZXMuc2V0U3VjY2Vzc2Z1bEFkZCh0cnVlKTsNCi0gICAgICAgIHJlcy5zZXRJdGVtSWQocGFyYW0xMi5nZXRJdGVtSWQoKSk7DQotDQotICAgICAgICByZXR1cm4gcmVzOzwvYj4NCi0gICAgfQ0KLSAgICAgDQotfQ0KLTwvcHJlPg0KLTxwPkFzIHdpdGggZ2VuZXJhdGluZyBjbGllbnRzLCBhbGwgdGhlc2UgY2xhc3Nlcywgc3VjaCBhcw0KLU11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IGFuZA0KLVR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSwgYXJlIGdlbmVyYXRlZCBieSB0aGUgdXRpbGl0eSwgYW5kDQotY2FuIGJlIGZvdW5kIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgc2tlbGV0b24gZmlsZS4gVGhleQ0KLWluY2x1ZGUgbWV0aG9kcyBzdWNoIGFzIHNldFN1Y2Nlc3NmdWxBZGQoKSwgd2hpY2ggc2V0cyB0aGUgdmFsdWUgb2YNCi10aGUgY29udGVudCBvZiBhbiBlbGVtZW50IGluIHRoZSByZXNwb25zZSwgYW5kIGdldEl0ZW1OYW1lKCksIHdoaWNoDQotcmV0cmlldmVzIHRoZSBjb250ZW50IG9mIGVsZW1lbnRzIGluIHRoZSByZXF1ZXN0LjwvcD4NCi08cD5TYXZlIHRoZSBmaWxlIGFuZCBjb21waWxlIGl0IGJ5IHR5cGluZzogYW50IGphci5zZXJ2ZXI8L3A+DQotPHA+SWYgYWxsIGdvZXMgd2VsbCwgeW91IHNob3VsZCBzZWUgdGhlIEJVSUxEIFNVQ0NFU1NGVUwgbWVzc2FnZSBpbg0KLXlvdXIgd2luZG93LCBhbmQgdGhlIEF4aXMyVXNlckd1aWRlU2VydmljZS5hYXIgZmlsZSBpbiB0aGUgbmV3bHkNCi1jcmVhdGVkIGJ1aWxkL2xpYiBkaXJlY3RvcnkuPC9wPg0KLTxwPjxpbWcgYWx0PSJUaGUgQlVJTEQgU1VDQ0VTU0ZVTCBtZXNzYWdlIGluIHlvdXIgd2luZG93IiBzcmM9DQotImltYWdlcy9maWcwNS5qcGciIC8+PC9wPg0KLTxwPk5vdyB5b3UgbmVlZCB0byBkZXBsb3kgdGhlIHNlcnZpY2UgdG8gdGhlIHNlcnZlci4gVG8gZG8gdGhhdCwNCi1jb3B5IHRoZSBBeGlzMlVzZXJHdWlkZVNlcnZpY2UuYWFyIGZpbGUgdG8gdGhlIFdFQi1JTkYvc2VydmljZXMNCi1kaXJlY3Rvcnkgb2YgdGhlIGFwcGxpY2F0aW9uIHNlcnZlci4gKFlvdSBhbHNvIGhhdmUgdGhlIG9wdGlvbiB0bw0KLXVzZSB0aGUgYWRtaW5pc3RyYXRpb24gdG9vbHMuIFNlZSB0aGUgPGEgaHJlZj0NCi0id2ViYWRtaW5ndWlkZS5odG1sIj5XZWIgQWRtaW5pc3RyYXRvcidzIEd1aWRlPC9hPiBmb3IgbW9yZQ0KLWluZm9ybWF0aW9uLik8L3A+DQotPHA+VG8gdmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgaGFzIGJlZW4gcHJvcGVybHkgZGVwbG95ZWQsIGNoZWNrIHRoZQ0KLWxpc3Qgb2Ygc2VydmljZXMgYXQgPGEgaHJlZj0NCi0iaHR0cDovLyUzQ2hvc3QlM0U6JTNDcG9ydCUzRS9heGlzMi9zZXJ2aWNlcy9saXN0U2VydmljZXMiPmh0dHA6Ly8mbHQ7aG9zdCZndDs6Jmx0O3BvcnQmZ3Q7L2F4aXMyL3NlcnZpY2VzL2xpc3RTZXJ2aWNlczwvYT4uPC9wPg0KLTxwPjxpbWcgYWx0PSJDaGVja2luZyB0aGUgbGlzdCBvZiBzZXJ2aWNlcyIgc3JjPQ0KLSJpbWFnZXMvZmlnMDYuanBnIiAvPjwvcD4NCi08cD5Ob3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgc2VydmljZSB1c2luZyBhbnkgb2YgdGhlDQotY2xpZW50cyBidWlsdCBpbiB0aGUgPGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2dlbmVyYXRpbmciPkdlbmVyYXRpbmcgQ2xpZW50czwvYT4NCi1kb2N1bWVudC48L3A+DQotPHA+PHN0cm9uZz5TZWUgTmV4dCBTZWN0aW9uPC9zdHJvbmc+LSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY29kZWxpc3Rpbmc1LnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY29kZWxpc3Rpbmc1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1NjJjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNvZGVsaXN0aW5nNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5Db2RlIExpc3RpbmcgNDogR2VuZXJhdGluZyBjbGllbnRzIGZyb20gdGhlIFdTREwNCi1maWxlPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+Q29kZSBMaXN0aW5nIDUgLSBHZW5lcmF0aW5nIENsaWVudHMgZnJvbSB0aGUgV1NETCBGaWxlPC9oMT4NCi08cHJlPg0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7DQotJmx0O3dzZGw6ZGVmaW5pdGlvbnMNCi0gICB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiDQotICAgeG1sbnM6aW1wbD0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgeG1sbnM6aW50Zj0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIiZndDsNCi0NCi0gICZsdDt3c2RsOnR5cGVzJmd0Ow0KLSAgICAmbHQ7c2NoZW1hDQotICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIg0KLSAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIg0KLSAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDshLS0gRUxFTUVOVFMgLS0mZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2VTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJOb1BhcmFtZXRlcnNSZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZS8mZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik5vUGFyYW1ldGVyc1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZS8mZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Iml0ZW1JZCIgdHlwZT0ieHNkOmludCIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Iml0ZW1OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzZDpmbG9hdCIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0NCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Iml0ZW1JZCIgdHlwZT0ieHNkOmludCIvJmd0Ow0KLSAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdWNjZXNzZnVsQWRkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotDQotICAgICZsdDsvc2NoZW1hJmd0Ow0KLSAgJmx0Oy93c2RsOnR5cGVzJmd0Ow0KLQ0KLSAgDQotICAmbHQ7IS0tIE1FU1NBR0VTIC0tJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJEb0luT25seVJlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJpbnB1dCIgZWxlbWVudD0iaW1wbDpEb0luT25seVJlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlTWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0ib3V0cHV0IiBlbGVtZW50PSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJpbnB1dCIgZWxlbWVudD0iaW1wbDpOb1BhcmFtZXRlcnNSZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6Tm9QYXJhbWV0ZXJzUmVzcG9uc2UiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0ib3V0cHV0IiBlbGVtZW50PSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotDQotICAmbHQ7IS0tIFBvcnQgdHlwZSAob3BlcmF0aW9ucykgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDpwb3J0VHlwZSBuYW1lPSJBeGlzMlVzZXJHdWlkZVBvcnRUeXBlIiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IkRvSW5Pbmx5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9IkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpEb0luT25seVJlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTm9QYXJhbWV0ZXJzIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6Tm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk5vUGFyYW1ldGVyc1Jlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0IiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZU1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICZsdDsvd3NkbDpwb3J0VHlwZSZndDsNCi0NCi0NCi0gICZsdDshLS0gQklORElORyAoYmluZCBvcGVyYXRpb25zKSAtLSZndDsNCi0gICZsdDt3c2RsOmJpbmRpbmcNCi0gICAgIG5hbWU9IkF4aXMyVXNlckd1aWRlU29hcEJpbmRpbmciDQotICAgICB0eXBlPSJpbXBsOkF4aXMyVXNlckd1aWRlUG9ydFR5cGUiJmd0Ow0KLSAgICAmbHQ7d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJEb0luT25seSImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJEb0luT25seSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNobyImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOm91dHB1dCZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9Ik5vUGFyYW1ldGVycyImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJOb1BhcmFtZXRlcnMiLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbSImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOm91dHB1dCZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0gICZsdDsvd3NkbDpiaW5kaW5nJmd0Ow0KLQ0KLQ0KLSAgJmx0OyEtLSBTRVJWSUNFIC0tJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6c2VydmljZSBuYW1lPSJBeGlzMlVzZXJHdWlkZVNlcnZpY2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6QXhpczJVc2VyR3VpZGVTb2FwQmluZGluZyINCi0gICAgICAgICAgICAgICBuYW1lPSJBeGlzMlVzZXJHdWlkZSImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlVzZXJHdWlkZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6cG9ydCZndDsNCi0gICZsdDsvd3NkbDpzZXJ2aWNlJmd0Ow0KLSZsdDsvd3NkbDpkZWZpbml0aW9ucyZndDsNCi08L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY29kZWxpc3Rpbmc3LnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY29kZWxpc3Rpbmc3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwZjg0Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNvZGVsaXN0aW5nNy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5Db2RlIExpc3RpbmcgNjogQ2xpZW50LmphdmE8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5Db2RlIExpc3RpbmcgNy0gQ2xpZW50LmphdmE8L2gxPg0KLTxwcmU+DQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIuRG9Jbk9ubHlSZXF1ZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIuVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yi5Ob1BhcmFtZXRlcnNSZXF1ZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIuTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3Q7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yi5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yi5Ob1BhcmFtZXRlcnNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5BeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViLk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ2xpZW50ew0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nIGFyZ3NbXSl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViID0NCi0gICAgICAgICAgICAgICAgbmV3IEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWINCi0gICAgICAgICAgICAgICAgKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQXhpczJVc2VyR3VpZGVTZXJ2aWNlIik7DQotDQotICAgICAgICAgICAgZG9Jbk9ubHkoc3R1Yik7DQotICAgICAgICAgICAgdHdvV2F5T25lUGFyYW1ldGVyRWNobyhzdHViKTsNCi0gICAgICAgICAgICBub1BhcmFtZXRlcnMoc3R1Yik7DQotICAgICAgICAgICAgbXVsdGlwbGVQYXJhbWV0ZXJzKHN0dWIpOw0KLQ0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIGRvIGluIG9ubHkgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvSW5Pbmx5KEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgRG9Jbk9ubHlSZXF1ZXN0IHJlcSA9IG5ldyBEb0luT25seVJlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICByZXEuc2V0TWVzc2FnZVN0cmluZygiQW4gaW4gb25seSByZXF1ZXN0Iik7DQotDQotICAgICAgICAgICAgc3R1Yi5Eb0luT25seShyZXEpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZG9uZSIpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIHR3byB3YXkgY2FsbC9yZWNlaXZlICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0d29XYXlPbmVQYXJhbWV0ZXJFY2hvKEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QgcmVxID0gbmV3IFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgcmVxLnNldEVjaG9TdHJpbmcoImVjaG8hIC4uLiBlY2hvISIpOw0KLQ0KLSAgICAgICAgICAgIFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSByZXMgPQ0KLSAgICAgICAgICAgICAgICBzdHViLlR3b1dheU9uZVBhcmFtZXRlckVjaG8ocmVxKTsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzLmdldEVjaG9TdHJpbmcoKSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogTm8gcGFyYW1ldGVycyAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbm9QYXJhbWV0ZXJzKEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgTm9QYXJhbWV0ZXJzUmVxdWVzdCByZXEgPSBuZXcgTm9QYXJhbWV0ZXJzUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHViLk5vUGFyYW1ldGVycyhyZXEpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBtdWx0aXBsZSBwYXJhbWV0ZXJzICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtdWx0aXBsZVBhcmFtZXRlcnMoQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCByZXEgPQ0KLSAgICAgICAgICAgICAgICBuZXcgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICByZXEuc2V0UHJpY2UoKGZsb2F0KTEuOTkpOw0KLSAgICAgICAgICAgIHJlcS5zZXRJdGVtSWQoKGludCkyMzg3Mjk4Myk7DQotICAgICAgICAgICAgcmVxLnNldERlc2NyaXB0aW9uKCJNdXN0IGhhdmUgZm9yIGNvb2tpbmciKTsNCi0gICAgICAgICAgICByZXEuc2V0SXRlbU5hbWUoImZsb3VyIik7DQotDQotICAgICAgICAgICAgTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlIHJlcyA9DQotICAgICAgICAgICAgICAgIHN0dWIuTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbShyZXEpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXMuZ2V0U3VjY2Vzc2Z1bEFkZCgpKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzLmdldEl0ZW1JZCgpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi08L3ByZT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLWppYngueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMtamlieC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjk3MDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMtamlieC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5HZW5lcmF0aW5nIGEgV2ViIFNlcnZpY2UgQ2xpZW50IHVzaW5nIEF4aXMyIGFuZCBKaUJYPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDEgY2xhc3M9InRpdGxlIj5HZW5lcmF0aW5nIGEgV2ViIFNlcnZpY2UgQ2xpZW50IHVzaW5nIEF4aXMyIGFuZA0KLUppQlg8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIGdlbmVyYXRlIGEgV2ViIHNlcnZpY2UgY2xpZW50DQotdXNpbmcgQXhpczIgYW5kIEppQlggZGF0YSBiaW5kaW5nLiBUaGUgc2VydmljZSBoYXMgdGhlIGZvbGxvd2luZw0KLVdTREw6PC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAxOiBUaGUgV1NETCBmaWxlPC9iPjwvcD4NCi08cHJlPg0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7DQotJmx0O3dzZGw6ZGVmaW5pdGlvbnMNCi0gICB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiDQotICAgeG1sbnM6aW1wbD0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgeG1sbnM6aW50Zj0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIiZndDsNCi0NCi0gICZsdDt3c2RsOnR5cGVzJmd0Ow0KLSAgICAmbHQ7c2NoZW1hDQotICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIg0KLSAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL0F4aXMyVXNlckd1aWRlIg0KLSAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiJmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDshLS0gRUxFTUVOVFMgLS0mZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2VTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJOb1BhcmFtZXRlcnNSZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZS8mZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik5vUGFyYW1ldGVyc1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZS8mZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Iml0ZW1JZCIgdHlwZT0ieHNkOmludCIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Iml0ZW1OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzZDpmbG9hdCIvJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0NCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Iml0ZW1JZCIgdHlwZT0ieHNkOmludCIvJmd0Ow0KLSAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdWNjZXNzZnVsQWRkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotDQotICAgICZsdDsvc2NoZW1hJmd0Ow0KLSAgJmx0Oy93c2RsOnR5cGVzJmd0Ow0KLQ0KLSAgDQotICAmbHQ7IS0tIE1FU1NBR0VTIC0tJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJEb0luT25seVJlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJpbnB1dCIgZWxlbWVudD0iaW1wbDpEb0luT25seVJlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlTWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0ib3V0cHV0IiBlbGVtZW50PSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3RNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJpbnB1dCIgZWxlbWVudD0iaW1wbDpOb1BhcmFtZXRlcnNSZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6Tm9QYXJhbWV0ZXJzUmVzcG9uc2UiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0Ii8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0ib3V0cHV0IiBlbGVtZW50PSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotDQotICAmbHQ7IS0tIFBvcnQgdHlwZSAob3BlcmF0aW9ucykgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDpwb3J0VHlwZSBuYW1lPSJBeGlzMlVzZXJHdWlkZVBvcnRUeXBlIiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IkRvSW5Pbmx5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9IkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpEb0luT25seVJlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTm9QYXJhbWV0ZXJzIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6Tm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk5vUGFyYW1ldGVyc1Jlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0IiZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZU1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICZsdDsvd3NkbDpwb3J0VHlwZSZndDsNCi0NCi0NCi0gICZsdDshLS0gQklORElORyAoYmluZCBvcGVyYXRpb25zKSAtLSZndDsNCi0gICZsdDt3c2RsOmJpbmRpbmcNCi0gICAgIG5hbWU9IkF4aXMyVXNlckd1aWRlU29hcEJpbmRpbmciDQotICAgICB0eXBlPSJpbXBsOkF4aXMyVXNlckd1aWRlUG9ydFR5cGUiJmd0Ow0KLSAgICAmbHQ7d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJEb0luT25seSImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJEb0luT25seSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNobyImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOm91dHB1dCZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9Ik5vUGFyYW1ldGVycyImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJOb1BhcmFtZXRlcnMiLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbSImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOm91dHB1dCZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0gICZsdDsvd3NkbDpiaW5kaW5nJmd0Ow0KLQ0KLQ0KLSAgJmx0OyEtLSBTRVJWSUNFIC0tJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6c2VydmljZSBuYW1lPSJBeGlzMlVzZXJHdWlkZVNlcnZpY2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6QXhpczJVc2VyR3VpZGVTb2FwQmluZGluZyINCi0gICAgICAgICAgICAgICBuYW1lPSJBeGlzMlVzZXJHdWlkZSImZ3Q7DQotICAgICAgJmx0O3dzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlVzZXJHdWlkZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6cG9ydCZndDsNCi0gICZsdDsvd3NkbDpzZXJ2aWNlJmd0Ow0KLSZsdDsvd3NkbDpkZWZpbml0aW9ucyZndDsNCi08L3ByZT4NCi08cD5Ob3RlIHRoYXQgdGhlIGRvY3VtZW50IGRlZmluZXMgZm91ciBvcGVyYXRpb25zLCBEb0luT25seSwNCi1Ob1BhcmFtZXRlcnMsIFR3b1dheU9uZVBhcmFtZXRlckVjaG8sIGFuZA0KLU11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0uIEVhY2ggY2xpZW50IHdpbGwgaW5jbHVkZSBtZXRob2RzIGZvcg0KLWNhbGxpbmcgZWFjaCBvZiB0aGVzZSBvcGVyYXRpb25zLjwvcD4NCi08cD4oWW91IGNhbiBnZXQgbW9yZSBpbmZvcm1hdGlvbiBvbiBXU0RMIGF0IDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvZGVzYy8iPmh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvZGVzYy88L2E+DQotLik8L3A+DQotPGEgbmFtZT0iamlieCIgaWQ9ImppYngiPjwvYT4NCi08aDI+SmlCWDwvaDI+DQotPHA+SmlCWCBpcyBub3QgcGFydCBvZiB0aGUgQXBhY2hlIHByb2plY3QsIHNvIGluIG9yZGVyIHRvIHVzZSBpdCB0bw0KLWdlbmVyYXRlIHlvdXIgY2xpZW50cywgeW91IHdpbGwgbmVlZCB0byBkbyBzb21lIHNldHRpbmcgdXAgdG8gc3RhcnQNCi13aXRoLiBUbyBnZW5lcmF0ZSB5b3VyIGNsaWVudCwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4NCi08cD48Yj5UaGUgc2hvcnQgc3Rvcnk8L2I+OjwvcD4NCi08b2w+DQotPGxpPkRvd25sb2FkIHRoZSBsYXRlc3QgSmlCWCBwYWNrYWdlICh0ZXN0ZWQgd2l0aCBKaUJYIHYxLjEpIGZyb20NCi08YSBocmVmPQ0KLSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2ppYngvIj5odHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2ppYngvPC9hPg0KLS4gRXh0cmFjdCB0aGUgemlwIGZpbGUsIGFuZCBjb3B5IHRoZSBKQVJzIGluIHRoZSBsaWIgZGlyZWN0b3J5IHRvDQotdGhlIEFYSVMyX0hPTUUvbGliIGRpcmVjdG9yeS4gKERlbGV0ZSB0aGUgc3RheC1hcGkuamFyIGZpbGU7IGl0J3MNCi1zdXBlcnNlZGVkIGJ5IHRoZSB2ZXJzaW9uIHRoYXQgY29tZXMgd2l0aCBBeGlzMi4pPC9saT4NCi08bGk+RG93bmxvYWQgPGEgaHJlZj0NCi0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjkzNTgmYW1wO3BhY2thZ2VfaWQ9MTIyODk3Ij4NCi14c2QyamlieCB2ZXJzaW9uIGJldGEyYTwvYT4gZnJvbSBTb3VyY2VGb3JnZS4gQ3JlYXRlIGEgZGlyZWN0b3J5DQotY2FsbGVkIHhzZDJqaWJ4IGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgYW5kIGV4dHJhY3QgdGhlIGZpbGVzDQotaW50byBpdC4gVGhpcyB1dGlsaXR5IGRvZXMgbm90IHdvcmsgd2l0aCB0aGUgbGF0ZXN0IHJlbGVhc2UgKHYxLjEpDQotb2YgSmlCWCwgc28gZG93bmxvYWQgPGEgaHJlZj0NCi0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjkzNTgmYW1wO3BhY2thZ2VfaWQ9NjgyOTAiPg0KLWppYngtMS4wUkMxPC9hPiBmcm9tIFNvdXJjZUZvcmdlLiBFeHRyYWN0IHRoZSBmaWxlcyBmcm9tIHRoaXMNCi1hcmNoaXZlIGFuZCBjb3B5IHRoZSAqLmphciBmaWxlcyBpbiB0aGUgbGliIGRpcmVjdG9yeSBpbnRvIHRoZQ0KLXhzZDJqaWJ4L2xpYiBkaXJlY3RvcnkuPC9saT4NCi08bGk+Q3JlYXRlIGEgc2NoZW1hIGJhc2VkIG9uIHRoZSBkYXRhIHN0cnVjdHVyZXMgb2YgeW91ciBXU0RMIGZpbGUNCi1hbmQgc2F2ZSBpdCBpbiB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5LjwvbGk+DQotPGxpPk1ha2Ugc3VyZSB0aGF0IG9ubHkgdGhlIHhzZDJqaWJ4IGphciBmaWxlcyBhcmUgaW4gdGhlIGNsYXNzcGF0aA0KLWFuZCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBjcmVhdGUgdGhlIGJhc2ljIGJpbmRpbmcgZmlsZToNCi1qYXZhIC1qYXIgeHNkMmppYnhcbGliXHhzZDJqaWJ4LmphciBBeGlzMlVzZXJHdWlkZS54c2Q8L2xpPg0KLTxsaT5Db3B5IHRoZSBvcmcgZGlyZWN0b3J5IHRvIHRoZSBzcmMgZGlyZWN0b3J5IHRvIHBsYWNlIHRoZQ0KLWdlbmVyYXRlZCBjbGFzc2VzIGludG8gdGhlIHByb2plY3Qgc28gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBzZWUNCi10aGVtLjwvbGk+DQotPGxpPlJlbW92ZSB0aGUgeHNkMmppYngtcmVsYXRlZCAqLmphciBmaWxlcyBmcm9tIHlvdXIgQ0xBU1NQQVRIIGFuZA0KLWFkZCB0aGUgQXhpczIgLmphciBmaWxlcyBiYWNrIGludG8gaXQuIEV4ZWN1dGUgdGhlIGZvbGxvd2luZw0KLWNvbW1hbmQgdG8gZ2VuZXJhdGUgdGhlIHN0dWJzOg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblxXU0RMMkphdmEgLXVyaSBBeGlzMlVzZXJHdWlkZS53c2RsIC1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgamlieCAtRWJpbmRpbmdmaWxlIG9yZ1xhcGFjaGVcYXhpczJcYXhpczJ1c2VyZ3VpZGVcYmluZGluZy54bWwgLXMNCi08L3ByZT48L2xpPg0KLTxsaT5DcmVhdGUgdGhlIGNsaWVudCBmaWxlIGluIHRoZSBvcmcvYXBhY2hlL2F4aXMyL2F4aXMydXNlcmd1aWRlDQotZGlyZWN0b3J5LjwvbGk+DQotPGxpPkNvcHkgdGhlIG9yZyBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMgdG8gdGhlIHNyYw0KLWRpcmVjdG9yeS48L2xpPg0KLTxsaT5Db21waWxlIHRoZSBmaXJzdCBzZXQgb2YgY2xhc3NlcyBieSB0eXBpbmc6PGNvZGU+YW50DQotamFyLmNsaWVudDwvY29kZT48L2xpPg0KLTxsaT5HbyB0byB0aGUgYnVpbGQvY2xhc3NlcyBkaXJlY3RvcnkgYW5kIHJ1biB0aGUgSmlCWCBjb21waWxlcjoNCi08cHJlPg0KLWphdmEgLWphciBDOlxhcHBzXGF4aXMyXGxpYlxqaWJ4LWJpbmQuamFyIA0KLS4uXC4uXG9yZ1xhcGFjaGVcYXhpczJcYXhpczJ1c2VyZ3VpZGVcYmluZGluZy54bWwNCi08L3ByZT48L2xpPg0KLTxsaT5SdW4gQW50IGFnYWluIHRvIHBhY2thZ2UgdGhlIG5ldyBhdXRvLWdlbmVyYXRlZCBKaUJYIGNsYXNzZXMNCi1pbnRvIHRoZSBjbGllbnQgamFyIGJ5IHR5cGluZzogPGNvZGU+YW50IGphci5jbGllbnQ8L2NvZGU+PC9saT4NCi08bGk+QWRkIHRoZSBidWlsZC9saWIvQXhpczJVc2VyR3VpZGVTZXJ2aWNlLXRlc3QtY2xpZW50LmphciBmaWxlIHRvDQotdGhlIENMQVNTUEFUSCBhbmQgcnVuIHRoZSBjbGllbnQgYnkgdHlwaW5nOg0KLTxwcmU+DQotamF2YSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkNsaWVudA0KLTwvcHJlPjwvbGk+DQotPC9vbD4NCi08cD48Yj5UaGUgbG9uZyBzdG9yeTo8L2I+PC9wPg0KLTxwPlRvIHVzZSBKaUJYIHRvIGdlbmVyYXRlIHlvdXIgY2xpZW50LCB5b3UgZmlyc3QgbmVlZCB0byB1c2UgaXQgaW4NCi10d28gZGlmZmVyZW50IGZ1bmN0aW9ucy4gWW91IGhhdmUgdG8gZ2VuZXJhdGUgYSBiaW5kaW5nIGZpbGUgdGhhdA0KLW1hcHMgb2JqZWN0cyB0byB0aGUgWE1MIGVsZW1lbnRzLCBhbmQgdGhlbiB1c2UgSmlCWCB0byBnZW5lcmF0ZSB0aGUNCi1zdHVicyB0aGF0IHlvdXIgY2xpZW50IHdpbGwgdXNlLiBUbyBnZW5lcmF0ZSBhIGJpbmRpbmcgZmlsZSwgeW91J2xsDQotbmVlZCB0aGUgeHNkMmppYnggdXRpbGl0eSwgd2hpY2ggY3JlYXRlcyBhIGJpbmRpbmcgZmlsZSBmcm9tIGFuIFhNTA0KLVNjaGVtYSBkb2N1bWVudC4gT25jZSB5b3UgaGF2ZSB0aGUgYmluZGluZyBmaWxlLCB5b3UgY2FuIHJ1biBKaUJYDQotdG8gY3JlYXRlIHRoZSBhY3R1YWwgb2JqZWN0LiBJbiBvcmRlciB0byBkbyBhbGwgdGhhdCB5b3UnbGwgbmVlZCB0bw0KLWhhdmUgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb25zIG9mIHRoZSBKaUJYIHNvZnR3YXJlLjwvcD4NCi08cD5Eb3dubG9hZCB0aGUgbGF0ZXN0IEppQlggcGFja2FnZSAodGVzdGVkIHdpdGggSmlCWCB2MS4xKSBmcm9tDQotPGEgaHJlZj0NCi0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9qaWJ4LyI+aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9qaWJ4LzwvYT4uDQotRXh0cmFjdCB0aGUgemlwIGZpbGUsIGFuZCBjb3B5IHRoZSBKQVJzIGluIHRoZSBsaWIgZGlyZWN0b3J5IHRvIHRoZQ0KLUFYSVMyX0hPTUUvbGliIGRpcmVjdG9yeS4gKERlbGV0ZSB0aGUgc3RheC1hcGkuamFyIGZpbGU7IGl0J3MNCi1zdXBlcnNlZGVkIGJ5IHRoZSB2ZXJzaW9uIHRoYXQgY29tZXMgd2l0aCBBeGlzMi4pIFRoZXNlIGZpbGVzDQotcGVydGFpbiB0byB0aGUgbWFpbiBKaUJYIGFwcGxpY2F0aW9uLjwvcD4NCi08cD5Eb3dubG9hZCA8YSBocmVmPQ0KLSJodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD02OTM1OCZhbXA7cGFja2FnZV9pZD0xMjI4OTciPg0KLXhzZDJqaWJ4IHZlcnNpb24gYmV0YTJhPC9hPiBmcm9tIFNvdXJjZWZvcmdlLiBDcmVhdGUgYSBkaXJlY3RvcnkNCi1jYWxsZWQgeHNkMmppYnggaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZXh0cmFjdCB0aGUgZmlsZXMNCi1pbnRvIGl0LiBVbmZvcnR1bmF0ZWx5LCB0aGlzIHV0aWxpdHkgZG9lcyBub3Qgd29yayB3aXRoIHRoZSBsYXRlc3QNCi1yZWxlYXNlIG9mIEppQlgsIHNvIHlvdSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgPGEgaHJlZj0NCi0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3Nob3dmaWxlcy5waHA/Z3JvdXBfaWQ9NjkzNTgmYW1wO3BhY2thZ2VfaWQ9NjgyOTAiPg0KLWppYngtMS4wUkMxPC9hPiBmcm9tIFNvdXJjZWZvcmdlLiBFeHRyYWN0IHRoZSBmaWxlcyBmcm9tIHRoaXMNCi1hcmNoaXZlIGFuZCBwbGFjZSB0aGUgKi5qYXIgZmlsZXMgaW4gdGhlIGxpYiBkaXJlY3RvcnkgaW50byB0aGUNCi14c2QyamlieC9saWIgZGlyZWN0b3J5LiBUaGlzIHdheSwgeW91IGNhbiB1c2UgdGhlbSBleGNsdXNpdmVseSB3aXRoDQotdGhlIHhzZDJqaWJ4IHV0aWxpdHkuPC9wPg0KLTxwPllvdSdsbCBuZWVkIGFuIFhNTCBzY2hlbWEgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgYmluZGluZw0KLWZpbGUsIHdoaWNoIGxpbmtzIFhNTCBlbGVtZW50cyB0byB0aGUgSmF2YSBjbGFzc2VzLiBBcyBkZWZpbmVkIGluDQotdGhlIHNhbXBsZSBXU0RMIGZpbGUsIGl0cyBjb250ZW50IHNob3VsZCBiZSBhcyBzaG93biBpbiBDb2RlDQotTGlzdGluZyAyLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMjogWE1MIFNjaGVtYTwvYj48L3A+DQotPHByZT4NCi0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0Ow0KLSZsdDt4c2Q6c2NoZW1hDQotICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICANCi0gICZsdDshLS0gRUxFTUVOVFMgLS0mZ3Q7DQotICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0IiZndDsNCi0gICAgJmx0O3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2VTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsNCi0gICAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7DQotICAmbHQ7L3hzZDplbGVtZW50Jmd0Ow0KLSAgDQotICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiJmd0Ow0KLSAgICAmbHQ7eHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICZsdDsveHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAmbHQ7L3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICZsdDsveHNkOmVsZW1lbnQmZ3Q7DQotICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIiZndDsNCi0gICAgJmx0O3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsNCi0gICAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7DQotICAmbHQ7L3hzZDplbGVtZW50Jmd0Ow0KLSAgDQotICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdCImZ3Q7DQotICAgICZsdDt4c2Q6Y29tcGxleFR5cGUvJmd0Ow0KLSAgJmx0Oy94c2Q6ZWxlbWVudCZndDsNCi0gICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZSImZ3Q7DQotICAgICZsdDt4c2Q6Y29tcGxleFR5cGUvJmd0Ow0KLSAgJmx0Oy94c2Q6ZWxlbWVudCZndDsNCi0gIA0KLSAgJmx0O3hzZDplbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IiZndDsNCi0gICAgJmx0O3hzZDpjb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7eHNkOnNlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Iml0ZW1JZCIgdHlwZT0ieHNkOmludCIvJmd0Ow0KLSAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9Iml0ZW1OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzZDpmbG9hdCIvJmd0Ow0KLSAgICAgICAgJmx0O3hzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICAgJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgJmx0Oy94c2Q6ZWxlbWVudCZndDsNCi0NCi0gICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7eHNkOmNvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDt4c2Q6c2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ic3VjY2Vzc2Z1bEFkZCIgdHlwZT0ieHNkOmJvb2xlYW4iLyZndDsNCi0gICAgICAmbHQ7L3hzZDpzZXF1ZW5jZSZndDsNCi0gICAgJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7DQotICAmbHQ7L3hzZDplbGVtZW50Jmd0Ow0KLQ0KLSZsdDsveHNkOnNjaGVtYSZndDsNCi08L3ByZT4NCi08cD5TYXZlIHRoZSBhYm92ZSBYTUwgc2NoZW1hIGZpbGUgYXMgQXhpczJVc2VyR3VpZGUueHNkLjwvcD4NCi08cD5JbiBvcmRlciB0byBtYXAgdGhpcyBzY2hlbWEgaW50byBhIEppQlggYmluZGluZyBmaWxlLCB5b3UnbGwNCi1uZWVkIHRvIHVzZSB0aGUgeHNkMmppYnggdXRpbGl0eS4gQ2xlYXIgeW91ciBDTEFTU1BBVEggYW5kIGFkZCBvbmx5DQotdGhlIC5qYXIgZmlsZXMgaW4gdGhlIHhzZDJqaWJ4L2xpYiBkaXJlY3RvcnkuIEV4ZWN1dGUgdGhlIGZvbGxvd2luZw0KLWNvbW1hbmQgdG8gY3JlYXRlIHRoZSBiYXNpYyBiaW5kaW5nIGZpbGU6PC9wPg0KLTxwcmU+DQotamF2YSAtamFyIHhzZDJqaWJ4XGxpYlx4c2QyamlieC5qYXIgQXhpczJVc2VyR3VpZGUueHNkDQotPC9wcmU+DQotPHA+VGhpcyBvcGVyYXRpb24gY3JlYXRlcyB0aGUgYmFzaWMgY2xhc3MgZmlsZXMsIGFzIHdlbGwgYXMgdGhlDQotbWFwcGluZyBmaWxlLCBjYWxsZWQgYmluZGluZy54bWwuIFlvdSdsbCB1c2UgdGhpcyBmaWxlIHRvIGRvIHRoZQ0KLWFjdHVhbCBXU0RMLXRvLUphdmEgY29udmVyc2lvbi48L3A+DQotPHA+UmVtb3ZlIHRoZSB4c2QyamlieCAuamFyIGZpbGVzIGZyb20geW91ciBDTEFTU1BBVEggYW5kIGFkZCB0aGUNCi1BeGlzMiAuamFyIGZpbGVzIGJhY2sgaW50byBpdC4gRXhlY3V0ZSB0aGUgY29tbWFuZCBpbiBDb2RlIExpc3RpbmcNCi0zIHRvIGdlbmVyYXRlIHRoZSBzdHVicy48L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDM6IEdlbmVyYXRpbmcgdGhlIHN0dWJzPC9iPjwvcD4NCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cV1NETDJKYXZhIC11cmkgQXhpczJVc2VyR3VpZGUud3NkbCAtcCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1kIGppYnggLUViaW5kaW5nZmlsZSBvcmdcYXBhY2hlXGF4aXMyXGF4aXMydXNlcmd1aWRlXGJpbmRpbmcueG1sIC1zDQotPC9wcmU+DQotPHA+Q3JlYXRlIHRoZSBjbGllbnQgZmlsZSwgQ2xpZW50LmphdmEsIGluIHRoZQ0KLW9yZy9hcGFjaGUvYXhpczIvYXhpczJ1c2VyZ3VpZGUgZGlyZWN0b3J5LiBBZGQgdGhlIGZvbGxvd2luZyBjb2RlDQotaW4gQ29kZSBMaXN0aW5nIDQuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyA0OiBDcmVhdGluZyBDbGllbnQuamF2YTwvYj48L3A+DQotPHByZT4NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGU7DQotDQotcHVibGljIGNsYXNzIENsaWVudHsNCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZyBhcmdzW10pew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1YiA9DQotICAgICAgICAgICAgICAgIG5ldyBBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViDQotICAgICAgICAgICAgICAoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlVzZXJHdWlkZVNlcnZpY2UiKTsNCi0NCi0gICAgICAgICAgICBkb0luT25seShzdHViKTsNCi0gICAgICAgICAgICB0d29XYXlPbmVQYXJhbWV0ZXJFY2hvKHN0dWIpOw0KLSAgICAgICAgICAgIG5vUGFyYW1ldGVycyhzdHViKTsNCi0gICAgICAgICAgICBtdWx0aXBsZVBhcmFtZXRlcnMoc3R1Yik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRvSW5Pbmx5KEF4aXMyVXNlckd1aWRlU2VydmljZVN0dWIgc3R1Yil7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgRG9Jbk9ubHlSZXF1ZXN0IHJlcSA9IA0KLSAgICAgICAgICAgICAgICBuZXcgRG9Jbk9ubHlSZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgcmVxLnNldE1lc3NhZ2VTdHJpbmcoImZpcmUgYW5kIGZvcmdldCBpdCEiKTsNCi0NCi0gICAgICAgICAgICBzdHViLkRvSW5Pbmx5KHJlcSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHR3b1dheU9uZVBhcmFtZXRlckVjaG8oQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCByZXEgPSANCi0gICAgICAgICAgICAgICAgbmV3IFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0KCk7DQotDQotICAgICAgICAgICAgcmVxLnNldEVjaG9TdHJpbmcoImVjaG8hIC4uLiBlY2hvISIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHN0dWIuVHdvV2F5T25lUGFyYW1ldGVyRWNobyhyZXEpLmdldEVjaG9TdHJpbmcoKSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG5vUGFyYW1ldGVycyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIE5vUGFyYW1ldGVyc1JlcXVlc3QgcmVxID0NCi0gICAgICAgICAgICAgICAgbmV3IE5vUGFyYW1ldGVyc1JlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3R1Yi5Ob1BhcmFtZXRlcnMocmVxKSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG11bHRpcGxlUGFyYW1ldGVycyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IHJlcSA9DQotICAgICAgICAgICAgICAgIG5ldyBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIHJlcS5zZXRQcmljZSgoZmxvYXQpMS45OSk7DQotICAgICAgICAgICAgcmVxLnNldEl0ZW1JZCgoaW50KTIzODcyOTgzKTsNCi0gICAgICAgICAgICByZXEuc2V0RGVzY3JpcHRpb24oIk11c3QgaGF2ZSBmb3IgY29va2luZyIpOw0KLSAgICAgICAgICAgIHJlcS5zZXRJdGVtTmFtZSgiZmxvdXIiKTsNCi0NCi0gICAgICAgICAgICBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UgcmVzID0NCi0gICAgICAgICAgICAgICAgc3R1Yi5NdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtKHJlcSk7DQotDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlcy5nZXRJdGVtSWQoKSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlcy5nZXRTdWNjZXNzZnVsQWRkKCkpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTxwPk5vdyBpdCdzIHRpbWUgdG8gY29tcGlsZSB0aGUgY2xpZW50LiBGb3IgdGhlIGdlbmVyYXRlZCBmaWxlcyB0bw0KLWJlIGZvdW5kLCB0aGV5IG5lZWQgdG8gYmUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIHNvIGNvcHkgdGhlIG9yZw0KLWZpbGUgdG8gdGhlIHNyYyBkaXJlY3RvcnkuPC9wPg0KLTxwPkNvbXBpbGUgdGhlIGZpcnN0IHNldCBvZiBjbGFzc2VzIGJ5IHR5cGluZzogPGNvZGU+YW50DQotamFyLmNsaWVudDwvY29kZT48L3A+DQotPHA+VGhpcyBhY3Rpb24gY29tcGlsZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGNsYXNzZXMsIGJ1dCBub3QNCi1ldmVyeXRoaW5nLiBGb3J0dW5hdGVseSwgaXQgZG9lcyBjb21waWxlIHRoZSBjbGFzc2VzIG5lZWRlZCBieSB0aGUNCi1KaUJYIGNvbXBpbGVyLCBzbyB5b3UgY2FuIG5vdyBnZW5lcmF0ZSB0aGUgYWN0dWFsIEppQlggcmVzb3VyY2VzLg0KLUNoYW5nZSB0byB0aGUgYnVpbGQvY2xhc3NlcyBkaXJlY3RvcnkgYW5kIHJ1biB0aGUgSmlCWA0KLWNvbXBpbGVyOjwvcD4NCi08cHJlPg0KLWphdmEgLWphciBDOlxhcHBzXGF4aXMyXGxpYlxqaWJ4LWJpbmQuamFyIC4uXC4uXG9yZ1xhcGFjaGVcYXhpczJcYXhpczJ1c2VyZ3VpZGVcYmluZGluZy54bWwNCi08L3ByZT4NCi08cD5Ob3cgdGhhdCB5b3UgaGF2ZSB0aGUgbmV3IGZpbGVzIGluIHBsYWNlLCByZS1ydW4gdGhlIEFudCB0YXNrIHRvDQotZ2VuZXJhdGUgdGhlIGNsaWVudDogPGNvZGU+YW50IGphci5jbGllbnQ8L2NvZGU+PC9wPg0KLTxwPlRoaXMgYWN0aW9uIGFkZHMgYWxsIHRoZSBhcHByb3ByaWF0ZSBmaWxlcyB0byB0aGUNCi1idWlsZC9saWIvQXhpczJVc2VyR3VpZGVTZXJ2aWNlLXRlc3QtY2xpZW50LmphciBmaWxlLCBzbyBhZGQgdGhhdA0KLS5qYXIgZmlsZSB0byB5b3VyIENMQVNTUEFUSCBhbmQgcnVuIHRoZSBjbGllbnQgYnkgdHlwaW5nOiBqYXZhDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5DbGllbnQ8L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy14bWxiZWFucy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy14bWxiZWFucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDNjNDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMteG1sYmVhbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+R2VuZXJhdGluZyBhIFdlYiBTZXJ2aWNlIENsaWVudCB1c2luZyBBeGlzMiBhbmQNCi1YbWxCZWFuczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxIGNsYXNzPSJ0aXRsZSI+R2VuZXJhdGluZyBhIFdlYiBTZXJ2aWNlIENsaWVudCB1c2luZyBBcGFjaGUNCi1BeGlzMiBhbmQgWE1MQmVhbnM8L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIGdlbmVyYXRlIGEgV2ViIHNlcnZpY2UgY2xpZW50DQotdXNpbmcgQXBhY2hlIEF4aXMyIGFuZCBYTUxCZWFucyBkYXRhIGJpbmRpbmcuIFRoZSBzZXJ2aWNlIGhhcyB0aGUNCi1mb2xsb3dpbmcgV1NETDo8L3A+DQotPHA+PGI+Q29kZSBMaXN0aW5nIDE6IFRoZSBXU0RMIGZpbGU8L2I+PC9wPg0KLTxwcmU+DQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsNCi0mbHQ7d3NkbDpkZWZpbml0aW9ucw0KLSAgIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCINCi0gICB4bWxuczppbXBsPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxuczppbnRmPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9BeGlzMlVzZXJHdWlkZSINCi0gICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0gICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiJmd0Ow0KLQ0KLSAgJmx0O3dzZGw6dHlwZXMmZ3Q7DQotICAgICZsdDtzY2hlbWENCi0gICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvQXhpczJVc2VyR3VpZGUiDQotICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7DQotICAgICAgDQotICAgICAgJmx0OyEtLSBFTEVNRU5UUyAtLSZndDsNCi0gICAgICANCi0gICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJEb0luT25seVJlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibWVzc2FnZVN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvJmd0Ow0KLSAgICAgICAgICAmbHQ7L3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIiZndDsNCi0gICAgICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgICAgICAgJmx0O3NlcXVlbmNlJmd0Ow0KLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAgIA0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik5vUGFyYW1ldGVyc1JlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlLyZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVzcG9uc2UiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlLyZndDsNCi0gICAgICAmbHQ7L2VsZW1lbnQmZ3Q7DQotICAgICAgDQotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiJmd0Ow0KLSAgICAgICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbU5hbWUiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8mZ3Q7DQotICAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgICAgICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLQ0KLSAgICAgICZsdDtlbGVtZW50IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZSImZ3Q7DQotICAgICAgICAmbHQ7Y29tcGxleFR5cGUmZ3Q7DQotICAgICAgICAgICZsdDtzZXF1ZW5jZSZndDsNCi0gICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaXRlbUlkIiB0eXBlPSJ4c2Q6aW50Ii8mZ3Q7DQotICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN1Y2Nlc3NmdWxBZGQiIHR5cGU9InhzZDpib29sZWFuIi8mZ3Q7DQotICAgICAgICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICAgICAmbHQ7L2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAgICZsdDsvZWxlbWVudCZndDsNCi0NCi0gICAgJmx0Oy9zY2hlbWEmZ3Q7DQotICAmbHQ7L3dzZGw6dHlwZXMmZ3Q7DQotDQotICANCi0gICZsdDshLS0gTUVTU0FHRVMgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOkRvSW5Pbmx5UmVxdWVzdCIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0gICZsdDt3c2RsOm1lc3NhZ2UgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOk5vUGFyYW1ldGVyc1JlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiJmd0Ow0KLSAgICAmbHQ7d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpOb1BhcmFtZXRlcnNSZXNwb25zZSIvJmd0Ow0KLSAgJmx0Oy93c2RsOm1lc3NhZ2UmZ3Q7DQotDQotICAmbHQ7d3NkbDptZXNzYWdlIG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSImZ3Q7DQotICAgICZsdDt3c2RsOnBhcnQgbmFtZT0iaW5wdXQiIGVsZW1lbnQ9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QiLyZndDsNCi0gICZsdDsvd3NkbDptZXNzYWdlJmd0Ow0KLSAgJmx0O3dzZGw6bWVzc2FnZSBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIiZndDsNCi0gICAgJmx0O3dzZGw6cGFydCBuYW1lPSJvdXRwdXQiIGVsZW1lbnQ9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlIi8mZ3Q7DQotICAmbHQ7L3dzZGw6bWVzc2FnZSZndDsNCi0NCi0NCi0gICZsdDshLS0gUG9ydCB0eXBlIChvcGVyYXRpb25zKSAtLSZndDsNCi0NCi0gICZsdDt3c2RsOnBvcnRUeXBlIG5hbWU9IkF4aXMyVXNlckd1aWRlUG9ydFR5cGUiJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iRG9Jbk9ubHkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iRG9Jbk9ubHlSZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOkRvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UiLyZndDsNCi0gICAgJmx0Oy93c2RsOm9wZXJhdGlvbiZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6VHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3RNZXNzYWdlIi8mZ3Q7DQotICAgICAgJmx0O3dzZGw6b3V0cHV0IG5hbWU9IlR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJOb1BhcmFtZXRlcnMiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCImZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQgbmFtZT0iTm9QYXJhbWV0ZXJzUmVxdWVzdE1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iaW1wbDpOb1BhcmFtZXRlcnNSZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJOb1BhcmFtZXRlcnNSZXNwb25zZU1lc3NhZ2UiDQotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6Tm9QYXJhbWV0ZXJzUmVzcG9uc2VNZXNzYWdlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQiJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0IG5hbWU9Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSINCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlPSJpbXBsOk11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0TWVzc2FnZSIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2VNZXNzYWdlIg0KLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImltcGw6TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlc3BvbnNlTWVzc2FnZSIvJmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgJmx0Oy93c2RsOnBvcnRUeXBlJmd0Ow0KLQ0KLQ0KLSAgJmx0OyEtLSBCSU5ESU5HIChiaW5kIG9wZXJhdGlvbnMpIC0tJmd0Ow0KLSAgJmx0O3dzZGw6YmluZGluZw0KLSAgICAgbmFtZT0iQXhpczJVc2VyR3VpZGVTb2FwQmluZGluZyINCi0gICAgIHR5cGU9ImltcGw6QXhpczJVc2VyR3VpZGVQb3J0VHlwZSImZ3Q7DQotICAgICZsdDt3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLyZndDsNCi0NCi0gICAgJmx0O3dzZGw6b3BlcmF0aW9uIG5hbWU9IkRvSW5Pbmx5IiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IkRvSW5Pbmx5Ii8mZ3Q7DQotICAgICAgJmx0O3dzZGw6aW5wdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6aW5wdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJUd29XYXlPbmVQYXJhbWV0ZXJFY2hvIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IlR3b1dheU9uZVBhcmFtZXRlckVjaG8iLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLQ0KLSAgICAmbHQ7d3NkbDpvcGVyYXRpb24gbmFtZT0iTm9QYXJhbWV0ZXJzIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Ik5vUGFyYW1ldGVycyIvJmd0Ow0KLSAgICAgICZsdDt3c2RsOmlucHV0Jmd0Ow0KLSAgICAgICAgJmx0O3dzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8mZ3Q7DQotICAgICAgJmx0Oy93c2RsOmlucHV0Jmd0Ow0KLSAgICAgICZsdDt3c2RsOm91dHB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDpvdXRwdXQmZ3Q7DQotICAgICZsdDsvd3NkbDpvcGVyYXRpb24mZ3Q7DQotDQotICAgICZsdDt3c2RsOm9wZXJhdGlvbiBuYW1lPSJNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Ik11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW0iLyZndDsNCi0gICAgICAmbHQ7d3NkbDppbnB1dCZndDsNCi0gICAgICAgICZsdDt3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAgICZsdDsvd3NkbDppbnB1dCZndDsNCi0gICAgICAmbHQ7d3NkbDpvdXRwdXQmZ3Q7DQotICAgICAgICAmbHQ7d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0gICAgICAmbHQ7L3dzZGw6b3V0cHV0Jmd0Ow0KLSAgICAmbHQ7L3dzZGw6b3BlcmF0aW9uJmd0Ow0KLSAgJmx0Oy93c2RsOmJpbmRpbmcmZ3Q7DQotDQotDQotICAmbHQ7IS0tIFNFUlZJQ0UgLS0mZ3Q7DQotDQotICAmbHQ7d3NkbDpzZXJ2aWNlIG5hbWU9IkF4aXMyVXNlckd1aWRlU2VydmljZSImZ3Q7DQotICAgICZsdDt3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpBeGlzMlVzZXJHdWlkZVNvYXBCaW5kaW5nIg0KLSAgICAgICAgICAgICAgIG5hbWU9IkF4aXMyVXNlckd1aWRlIiZndDsNCi0gICAgICAmbHQ7d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0F4aXMyVXNlckd1aWRlIi8mZ3Q7DQotICAgICZsdDsvd3NkbDpwb3J0Jmd0Ow0KLSAgJmx0Oy93c2RsOnNlcnZpY2UmZ3Q7DQotJmx0Oy93c2RsOmRlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPk5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZGVmaW5lcyBmb3VyIG9wZXJhdGlvbnMsIERvSW5Pbmx5LA0KLU5vUGFyYW1ldGVycywgVHdvV2F5T25lUGFyYW1ldGVyRWNobywgYW5kDQotTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbS4gRWFjaCBjbGllbnQgd2lsbCBpbmNsdWRlIG1ldGhvZHMgZm9yDQotY2FsbGluZyBlYWNoIG9mIHRoZXNlIG9wZXJhdGlvbnMuPC9wPg0KLTxwPihGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBXU0RMLCByZWZlciB0bzogPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53My5vcmcvMjAwMi93cy9kZXNjLyI+aHR0cDovL3d3dy53My5vcmcvMjAwMi93cy9kZXNjLzwvYT4NCi0uKTwvcD4NCi08cD48Yj5UaGUgc2hvcnQgc3Rvcnk6PC9iPjwvcD4NCi08b2w+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLzFfMS9kb3dubG9hZC5jZ2kjc3RkLWJpbiI+RG93bmxvYWQ8L2E+DQotYW5kIHVucGFjayB0aGUgQXBhY2hlIEF4aXMyIFN0YW5kYXJkIERpc3RyaWJ1dGlvbiwgaWYgeW91IGhhdmUgbm90DQotZG9uZSBzbyBhbHJlYWR5LjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgY2xpZW50IGNsYXNzZXMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6PGJyIC8+DQotPHByZT4NCi0lQVhJUzJfSE9NRSVcYmluXFdTREwySmF2YSAtdXJpIEF4aXMyVXNlckd1aWRlLndzZGwgLXAgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZSAtZCB4bWxiZWFucyAtcw0KLTwvcHJlPjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgY2xpZW50IChmb3IgZXhhbXBsZSwgQ2xpZW50LmphdmEpIGFuZCBzYXZlIGl0IGluIHRoZQ0KLW9yZy9hcGFjaGUvYXhpczIvYXhpczJ1c2VyZ3VpZGUgZGlyZWN0b3J5LjwvbGk+DQotPGxpPkJ1aWxkIHRoZSBjbGllbnQgYnkgdHlwaW5nOiA8Y29kZT5hbnQgamFyLmNsaWVudC48L2NvZGU+PC9saT4NCi08bGk+TWFrZSBzdXJlIGFsbCB0aGUgLmphciBmaWxlcyBpbiB0aGUgQXhpczIgbGliIGRpcmVjdG9yeSBhcmUgaW4NCi10aGUgQ0xBU1NQQVRILjwvbGk+DQotPGxpPkFzc3VtaW5nIHlvdSBoYXZlIGEgY29ycmVzcG9uZGluZyBzZXJ2aWNlLCBydW4gdGhlIGNsaWVudCBieQ0KLWFkZGluZyB0aGUgZ2VuZXJhdGVkIEF4aXMyVXNlckd1aWRlU2VydmljZS10ZXN0LWNsaWVudC5qYXIgZmlsZSBpbg0KLWJ1aWxkL2xpYiB0byB0aGUgQ0xBU1NQQVRIIGFuZCB0eXBlOiA8Y29kZT5qYXZhDQotb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5DbGllbnQ8L2NvZGU+PC9saT4NCi08L29sPg0KLTxwPjxiPlRoZSBsb25nIHN0b3J5OjwvYj48L3A+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaSNzdGQtYmluIj5Eb3dubG9hZDwvYT4NCi1hbmQgdW5wYWNrIHRoZSBBcGFjaGUgQXhpczIgU3RhbmRhcmQgRGlzdHJpYnV0aW9uLCBpZiB5b3UgaGF2ZSBub3QNCi1kb25lIHNvIGFscmVhZHkuIFRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC8xXzEvZG93bmxvYWQuY2dpI3dhciI+V0FSDQotZGlzdHJpYnV0aW9uPC9hPiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBuZWNlc3NhcnkgdXRpbGl0aWVzIGZvcg0KLWdlbmVyYXRpbmcgY29kZSwgc3VjaCBhcyBXU0RMMkphdmEuPC9wPg0KLTxwPlRoZSBYTUxCZWFucyBtZXRob2Qgb2YgZ2VuZXJhdGluZyBjbGllbnRzLCB1bmxpa2UgQURCLCBjcmVhdGVzDQotaW5kaXZpZHVhbCBjbGFzc2VzIGZvciBlYWNoIG9iamVjdCBpdCBtdXN0IG1vZGVsLiBGb3IgZXhhbXBsZSwNCi1nZW5lcmF0aW5nIGEgY2xpZW50IGZvciB0aGlzIFdTREwgZmlsZSBjcmVhdGVkIDY0MiBmaWxlcyBhbmQNCi1mb2xkZXJzLiBBIHNtYWxsIG51bWJlciBvZiB0aGVzZSBmaWxlcyBhcmUgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUNCi1hY3R1YWwgY2xpZW50IHlvdSdyZSBjcmVhdGluZy4gVGhlIHJlc3QgYXJlIHJlbGF0ZWQgdG8gdGhlDQotcHJvY2Vzc2luZyBvZiBYTUwsIGFuZCBpbmNsdWRlIGRhdGEgYm91bmQgb2JqZWN0cyBmb3Igc2NoZW1hcywNCi1lbmNvZGluZ3MsIGFuZCBvdGhlciBvYmplY3RzIG5lZWRlZCB0byBwcm9jZXNzIG1lc3NhZ2VzLjwvcD4NCi08cD5UbyBnZW5lcmF0ZSB0aGUgY2xpZW50LCBpc3N1ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gTGlzdGluZw0KLTIuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAyLiBHZW5lcmF0aW5nIHRoZSBjbGllbnQ8L2I+PC9wPg0KLTxwcmU+DQotJUFYSVMyX0hPTUUlXGJpblxXU0RMMkphdmEgLXVyaSBBeGlzMlVzZXJHdWlkZS53c2RsIC1wIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUgLWQgeG1sYmVhbnMgLXMNCi08L3ByZT4NCi08cD5UaGlzIGNvbW1hbmQgYW5hbHl6ZXMgdGhlIFdTREwgZmlsZSBhbmQgY3JlYXRlcyB0aGUgc3R1YnMgaW4gdGhlDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLiBUaGUgb3B0aW9ucyBzcGVjaWZ5IHRoYXQNCi15b3Ugd2FudCB0aGUgWE1MQmVhbnMgZGF0YSBiaW5kaW5nIG1ldGhvZCAoLWQpLCBhbmQgc3luY2hyb25vdXMgb3INCi1ibG9ja2luZyBtZXRob2RzICgtcykuIEluIG90aGVyIHdvcmRzLCB3aGVuIHRoZSBjbGllbnQgbWFrZXMgYW4NCi1Jbi1PdXQgY2FsbCB0byB0aGUgc2VydmljZSwgaXQgd2lsbCB3YWl0IGZvciBhIHJlc3BvbnNlIGJlZm9yZQ0KLWNvbnRpbnVpbmcuPC9wPg0KLTxwPk9uY2UgeW91IHJ1biB0aGlzIGNvbW1hbmQsIHlvdSB3aWxsIHNlZSBzZXZlcmFsIG5ldyBpdGVtcyBpbiB0aGUNCi1kaXJlY3RvcnkuIFRoZSBmaXJzdCBpcyB0aGUgYnVpbGQueG1sIGZpbGUsIHdoaWNoIGNvbnRhaW5zIHRoZQ0KLWluc3RydWN0aW9ucyBmb3IgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPiB0bw0KLWNvbXBpbGUgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLiBUaGUgc2Vjb25kIGlzIHRoZSBzcmMgZGlyZWN0b3J5LA0KLXdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuIFRoZSB0aGlyZCBpcyB0aGUNCi1yZXNvdXJjZXMgZGlyZWN0b3J5LCB3aGljaCBpbmNsdWRlcyBmaWxlcyByZWxhdGVkIHRvIHRoZSBhY3R1YWwNCi1kYXRhIGJpbmRpbmcgcHJvY2Vzcy48L3A+DQotPHA+Tm93IHlvdSBuZWVkIGEgY2xpZW50LiBUbyBjcmVhdGUgYSBjbGllbnQsIGNyZWF0ZSBhIG5ldyBjbGFzcw0KLWFuZCBzYXZlIGl0IGFzIENsaWVudC5qYXZhIGluIHRoZSBvcmcvYXBhY2hlL2F4aXMyL2F4aXMydXNlcmd1aWRlDQotZGlyZWN0b3J5LiBJdCBzaG91bGQgY29udGFpbiB0aGUgZm9sbG93aW5nIGNvZGUgaW4gTGlzdGluZyAzLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMzogQ2xpZW50LmphdmE8L2I+PC9wPg0KLTxwcmU+DQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDbGllbnR7DQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmcgYXJnc1tdKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIgPQ0KLSAgICAgICAgICAgICAgICBuZXcgQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1Yg0KLSAgICAgICAgICAgICAgICAoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BeGlzMlVzZXJHdWlkZVNlcnZpY2UiKTsNCi0NCi0gICAgICAgICAgICBkb0luT25seShzdHViKTsNCi0gICAgICAgICAgICB0d29XYXlPbmVQYXJhbWV0ZXJFY2hvKHN0dWIpOw0KLSAgICAgICAgICAgIG5vUGFyYW1ldGVycyhzdHViKTsNCi0gICAgICAgICAgICBtdWx0aXBsZVBhcmFtZXRlcnMoc3R1Yik7DQotDQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogZmlyZSBhbmQgZm9yZ2V0ICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb0luT25seShBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIERvSW5Pbmx5UmVxdWVzdERvY3VtZW50IHJlcSA9DQotICAgICAgICAgICAgICAgIERvSW5Pbmx5UmVxdWVzdERvY3VtZW50LkZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBEb0luT25seVJlcXVlc3REb2N1bWVudC5Eb0luT25seVJlcXVlc3QgZGF0YSA9DQotICAgICAgICAgICAgICAgIHJlcS5hZGROZXdEb0luT25seVJlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICBkYXRhLnNldE1lc3NhZ2VTdHJpbmcoImZpcmUgYW5kIGZvcmdldCBpdCEiKTsNCi0NCi0gICAgICAgICAgICBzdHViLkRvSW5Pbmx5KHJlcSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb25lIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5cblxuIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyogdHdvIHdheSBjYWxsL3JlY2VpdmUgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHR3b1dheU9uZVBhcmFtZXRlckVjaG8oQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdERvY3VtZW50IHJlcSA9DQotICAgICAgICAgICAgICAgIFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFR3b1dheU9uZVBhcmFtZXRlckVjaG9SZXF1ZXN0RG9jdW1lbnQuVHdvV2F5T25lUGFyYW1ldGVyRWNob1JlcXVlc3QgZGF0YSA9DQotICAgICAgICAgICAgICAgIHJlcS5hZGROZXdUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIGRhdGEuc2V0RWNob1N0cmluZygiZWNobyEgLi4uIGVjaG8hIik7DQotDQotICAgICAgICAgICAgVHdvV2F5T25lUGFyYW1ldGVyRWNob1Jlc3BvbnNlRG9jdW1lbnQgcmVzID0NCi0gICAgICAgICAgICAgICAgc3R1Yi5Ud29XYXlPbmVQYXJhbWV0ZXJFY2hvKHJlcSk7DQotDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlcy5nZXRUd29XYXlPbmVQYXJhbWV0ZXJFY2hvUmVzcG9uc2UoKS5nZXRFY2hvU3RyaW5nKCkpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5cbiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qIE5vIHBhcmFtZXRlcnMgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG5vUGFyYW1ldGVycyhBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViIHN0dWIpew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIE5vUGFyYW1ldGVyc1JlcXVlc3REb2N1bWVudCByZXEgPQ0KLSAgICAgICAgICAgICAgICBOb1BhcmFtZXRlcnNSZXF1ZXN0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIE5vUGFyYW1ldGVyc1JlcXVlc3REb2N1bWVudC5Ob1BhcmFtZXRlcnNSZXF1ZXN0IGRhdGEgPQ0KLSAgICAgICAgICAgICAgICByZXEuYWRkTmV3Tm9QYXJhbWV0ZXJzUmVxdWVzdCgpOw0KLQ0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzdHViLk5vUGFyYW1ldGVycyhyZXEpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKiBtdWx0aXBsZSBwYXJhbWV0ZXJzICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtdWx0aXBsZVBhcmFtZXRlcnMoQXhpczJVc2VyR3VpZGVTZXJ2aWNlU3R1YiBzdHViKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVxdWVzdERvY3VtZW50IHJlcSA9DQotICAgICAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0RG9jdW1lbnQuDQotICAgICAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXF1ZXN0IGRhdGEgPQ0KLSAgICAgICAgICAgICAgICByZXEuYWRkTmV3TXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbVJlcXVlc3QoKTsNCi0NCi0gICAgICAgICAgICBkYXRhLnNldFByaWNlKChmbG9hdCkxLjk5KTsNCi0gICAgICAgICAgICBkYXRhLnNldEl0ZW1JZCgoaW50KTIzODcyOTgzKTsNCi0gICAgICAgICAgICBkYXRhLnNldERlc2NyaXB0aW9uKCJNdXN0IGhhdmUgZm9yIGNvb2tpbmciKTsNCi0gICAgICAgICAgICBkYXRhLnNldEl0ZW1OYW1lKCJmbG91ciIpOw0KLQ0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZURvY3VtZW50IHJlcyA9DQotICAgICAgICAgICAgICAgIHN0dWIuTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbShyZXEpOw0KLSAgICAgICAgICAgIE11bHRpcGxlUGFyYW1ldGVyc0FkZEl0ZW1SZXNwb25zZURvY3VtZW50Lg0KLSAgICAgICAgICAgICAgICBNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UgZGF0YVJlcyA9DQotICAgICAgICAgICAgICAgIHJlcy5nZXRNdWx0aXBsZVBhcmFtZXRlcnNBZGRJdGVtUmVzcG9uc2UoKTsNCi0NCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZGF0YVJlcy5nZXRTdWNjZXNzZnVsQWRkKCkpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkYXRhUmVzLmdldEl0ZW1JZCgpKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuXG4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi08L3ByZT4NCi08cD5YTUxCZWFucyB1c2VzIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZSBmcm9tIEFEQi4gSW4gWE1MQmVhbnMsDQotcHJvY2Vzc2luZyBjZW50ZXJzIGFyb3VuZCBkb2N1bWVudHMsIHdoaWNoIGFyZSBjcmVhdGVkIHRocm91Z2ggdGhlDQotdXNlIG9mIGZhY3RvcmllcywgYW5kIHdoaWNoIGluY2x1ZGUgaW5uZXIgY2xhc3NlcyBmb3IgdGhlIG9iamVjdHMNCi10aGV5IGNvbnRhaW4uIFRoZSBwcm9jZXNzIGlzIHN0aWxsIHRoZSBzYW1lIC0tIHlvdSBjcmVhdGUgYQ0KLXJlcXVlc3QsIGFuZCBzZW5kIGl0IHVzaW5nIHRoZSBzdHViIC0tIHRoZSBjb2RlIGlzIGp1c3QgYSBiaXQgbW9yZQ0KLWNvbXBsZXguPC9wPg0KLTxwPlRvIGJ1aWxkIHRoZSBjbGllbnQsIHR5cGU6IDxjb2RlPmFudCBqYXIuY2xpZW50PC9jb2RlPjwvcD4NCi08cD5UaGlzIGFjdGlvbiBjcmVhdGVzIHR3byBuZXcgZGlyZWN0b3JpZXMsIGJ1aWxkIGFuZCB0ZXN0LiBUaGUNCi10ZXN0IGRpcmVjdG9yeSB3aWxsIGJlIGVtcHR5LCBidXQgdGhlIGJ1aWxkIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4NCi10d28gdmVyc2lvbnMgb2YgdGhlIGNsaWVudC4gVGhlIGZpcnN0IHZlcnNpb24gaW4gdGhlIGxpYiBkaXJlY3RvcnkNCi1jb25zaXN0cyBvZiB0d28gLmphciBmaWxlcywgb25lIGNvbnRhaW5pbmcgdGhlIENsaWVudCBjbGFzcyBhbmQgdGhlDQotc3R1YiBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUgb3RoZXIgY29udGFpbmluZyB0aGUgWE1MQmVhbnMtcmVsYXRlZA0KLWNsYXNzZXMuIFRoZSBzZWNvbmQgdmVyc2lvbiBpbiB0aGUgY2xhc3NlcyBkaXJlY3RvcnkgY29uc2lzdHMgb2YNCi1qdXN0IHRoZSByYXcgY2xhc3Nlcy48L3A+DQotPHA+TWFrZSBzdXJlIGFsbCB0aGUgLmphciBmaWxlcyBpbiB0aGUgQXhpczIgbGliIGRpcmVjdG9yeSBhcmUgb24NCi10aGUgY2xhc3NwYXRoLjwvcD4NCi08cD5JZiB5b3UgaGF2ZSBhIHNlcnZpY2UgY29ycmVzcG9uZGluZyB0byB0aGlzIGNsaWVudCAoaWYgeW91DQotZG9uJ3QsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCI+QnVpbGRpbmcgU2VydmljZXM8L2E+IGRvY3VtZW50KQ0KLXlvdSBjYW4gcnVuIHRoZSBjbGllbnQgYnkgYWRkaW5nIHRoZSB0d28gLmphciBmaWxlcyB0byB5b3VyDQotY2xhc3NwYXRoIGFuZCB0eXBpbmc6DQotPGNvZGU+amF2YS5vcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlLkNsaWVudDwvY29kZT48L3A+DQotPHA+WW91IHNob3VsZCBzZWUgdGhlIHJlc3BvbnNlIGluIGEgY29uc29sZSB3aW5kb3cgb2YgeW91ciBzZXJ2bGV0DQotY29udGFpbmVyLiBJdCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4NCi08cD48aW1nIGFsdD0NCi0iUmVzcG9uc2UgaW4gYSBjb25zb2xlIHdpbmRvdyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIiBzcmM9DQotImltYWdlcy9maWcwNC5qcGciIC8+PGJyIGNsZWFyPSJhbGwiIC8+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWM3NjcwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgbGFuZz0iZW4iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlLSBDcmVhdGluZyBDbGllbnRzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08YSBuYW1lPSJjcmVhdGVjbGllbnRzIiBpZD0iY3JlYXRlY2xpZW50cyI+PC9hPg0KLTxoMT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlIC0gQ3JlYXRpbmcgQ2xpZW50czwvaDE+DQotPHA+V2hlbiBpdCBjb21lcyB0byBjcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGNsaWVudCwgeW91IGNhbiBkbyBpdA0KLW1hbnVhbGx5IChzZWUgPGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCI+QnVpbGRpbmcNCi1TZXJ2aWNlczwvYT4pLCBidXQgaW4gbW9zdCBjYXNlcyB5b3UgaGF2ZSBhIFdlYiBTZXJ2aWNlIERlc2NyaXB0aW9uDQotTGFuZ3VhZ2UgKFdTREwpIGRlZmluaXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIG1lc3NhZ2VzIGNsaWVudHMNCi1zaG91bGQgc2VuZCBhbmQgZXhwZWN0IHRvIHJlY2VpdmUuIEF4aXMyIHByb3ZpZGVzIHNldmVyYWwgd2F5cyB0bw0KLXVzZSB0aGlzIGRlZmluaXRpb24gdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIGNsaWVudC48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaW50cm8iPkludHJvZHVjaW5nIEF4aXMyPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjd2hhdGlzIj5XaGF0IGlzIEF4aXMyPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN1bmRlcmhvb2QiPldoYXQncyBVbmRlciB0aGUNCi1ob29kPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoYW5kbGVzc29hcCI+SG93IEF4aXMyIEhhbmRsZXMgU09BUA0KLU1lc3NhZ2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2Rpc3RyaWJ1dGlvbnMiPkF4aXMyDQotRGlzdHJpYnV0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNzYmQiPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij5BeGlzMi53YXIgRGlyZWN0b3J5DQotaGllcmFyY2h5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2RvY3MiPkF4aXMyIERvY3VtZW50cw0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNjbGllbnRzIj5BeGlzMiBhbmQgQ2xpZW50czwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWluc3RhbGxpbmd0ZXN0aW5nLmh0bWwjaW5zdGFsbGluZ3Rlc3RpbmciPkluc3RhbGxpbmcgYW5kDQotVGVzdGluZyBDbGllbnQgQ29kZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjaW50cm9zZXJ2aWNlcyI+SW50cm9kdWN0aW9uIHRvDQotU2VydmljZXM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjbWVzc2FnZWV4Y2hhbmdlIj5NZXNzYWdlIEV4Y2hhbmdlDQotUGF0dGVybnM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjcmVhdGVjbGllbnRzIj48c3Ryb25nPkNyZWF0aW5nDQotQ2xpZW50czwvc3Ryb25nPjwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+PHN0cm9uZz5DaG9vc2luZyBhDQotQ2xpZW50IEdlbmVyYXRpb24gTWV0aG9kPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNnZW5lcmF0aW5nIj48c3Ryb25nPkdlbmVyYXRpbmcNCi1DbGllbnRzPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNhZGIiPjxzdHJvbmc+QXhpcyBEYXRhDQotQmluZGluZyAoQURCKTwvc3Ryb25nPjwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+R2V0dGluZw0KLUNvbWZvcnRhYmxlIHdpdGggQXZhaWxhYmxlIE9wdGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNjcmVhdGVzY3JhdGNoIj5DcmVhdGluZyBhIHNlcnZpY2UNCi1mcm9tIFNjcmF0Y2g8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lwb2pvIj5EZXBsb3lpbmcNCi1QbGFpbiBPbGQgSmF2YSBPYmplY3RzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cnVuIj5EZXBsb3lpbmcNCi1hbmQgUnVubmluZyBhbiBBeGlzMiBTZXJ2aWNlIENyZWF0ZWQgZnJvbSBXU0RMPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+Rm9yIEZ1cnRoZXINCi1TdHVkeTwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iY2hvb3NpbmdjbGllbnQiIGlkPSJjaG9vc2luZ2NsaWVudCI+PC9hPg0KLTxoMj5DaG9vc2luZyBhIENsaWVudCBHZW5lcmF0aW9uIE1ldGhvZDwvaDI+DQotPHA+QXhpczIgZ2l2ZXMgeW91IHNldmVyYWwgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIG1hcHBpbmcgV1NETCB0bw0KLW9iamVjdHMgd2hlbiBnZW5lcmF0aW5nIGNsaWVudHMuIFRocmVlIG9mIHRoZXNlIG9wdGlvbnMgYXJlIEF4aXMyDQotRGF0YUJpbmRpbmcgRnJhbWV3b3JrLCBYTUxCZWFucywgYW5kIEppQlggZGF0YWJpbmRpbmcuIEFsbCBvZiB0aGVzZQ0KLW1ldGhvZHMgaW52b2x2ZSB1c2luZyBkYXRhYmluZGluZyB0byBjcmVhdGUgSmF2YSBvYmplY3RzIG91dCBvZiB0aGUNCi1YTUwgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBzZXJ2aWNlLCBhbmQgZWFjaCBoYXMgaXRzIHByb3MgYW5kIGNvbnMuDQotWW91IGNhbiBhbHNvIGdlbmVyYXRlIFhNTCBpbi1vdXQgc3R1YnMgdGhhdCBhcmUgbm90IGJhc2VkIG9uDQotZGF0YWJpbmRpbmcuPC9wPg0KLTxwPkF4aXMyIERhdGFiaW5kaW5nIEZyYW1ld29yayAoQURCKTogQURCIGlzIHByb2JhYmx5IHRoZSBzaW1wbGVzdA0KLW1ldGhvZCBvZiBnZW5lcmF0aW5nIGFuIEF4aXMyIGNsaWVudC4gSW4gbW9zdCBjYXNlcywgYWxsIG9mIHRoZQ0KLXBlcnRpbmVudCBjbGFzc2VzIGFyZSBjcmVhdGVkIGFzIGlubmVyIGNsYXNzZXMgb2YgYSBtYWluIHN0dWINCi1jbGFzcy4gQURCIGlzIHZlcnkgZWFzeSB0byB1c2UsIGJ1dCBpdCBkb2VzIGhhdmUgbGltaXRhdGlvbnMuIEl0IGlzDQotbm90IG1lYW50IHRvIGJlIGEgZnVsbCBzY2hlbWEgYmluZGluZyBhcHBsaWNhdGlvbiwgYW5kIGhhcw0KLWRpZmZpY3VsdHkgd2l0aCBzdHJ1Y3R1cmVzIHN1Y2ggYXMgWE1MIFNjaGVtYSBlbGVtZW50IGV4dGVuc2lvbnMNCi1hbmQgcmVzdHJpY3Rpb25zLjwvcD4NCi08cD5YTUxCZWFuczogVW5saWtlIEFEQiwgWE1MQmVhbnMgaXMgYSBmdWxseSBmdW5jdGlvbmFsIHNjaGVtYQ0KLWNvbXBpbGVyLCBzbyBpdCBkb2Vzbid0IGNhcnJ5IHRoZSBzYW1lIGxpbWl0YXRpb25zIGFzIEFEQi4gSXQgaXMsDQotaG93ZXZlciwgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0byB1c2UgdGhhbiBBREIuIEl0IGdlbmVyYXRlcyBhDQotaHVnZSBudW1iZXIgb2YgZmlsZXMsIGFuZCB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwsIHdoaWxlIGJlaW5nDQotY2VydGFpbmx5IHVzYWJsZSwgaXMgbm90IGFzIHN0cmFpZ2h0Zm9yd2FyZCBhcyBBREIuPC9wPg0KLTxwPkppQlg6IEppQlggaXMgYSBjb21wbGV0ZSBkYXRhYmluZGluZyBmcmFtZXdvcmsgdGhhdCBhY3R1YWxseQ0KLXByb3ZpZGVzIG5vdCBvbmx5IFdTREwtdG8tSmF2YSBjb252ZXJzaW9uLCBhcyBjb3ZlcmVkIGluIHRoaXMNCi1kb2N1bWVudCwgYnV0IGFsc28gSmF2YS10by1YTUwgY29udmVyc2lvbi4gSW4gc29tZSB3YXlzLCBKaUJYDQotcHJvdmlkZXMgdGhlIGJlc3Qgb2YgYm90aCB3b3JsZHMuIEppQlggaXMgZXh0cmVtZWx5IGZsZXhpYmxlLA0KLWVuYWJsaW5nIHlvdSB0byBjaG9vc2UgdGhlIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgeW91ciBlbnRpdGllcywNCi1idXQgaXQgY2FuIGJlIGNvbXBsaWNhdGVkIHRvIHNldCB1cC4gT24gdGhlIG90aGVyIGhhbmQsIG9uY2UgaXQgaXMNCi1zZXQgdXAsIGFjdHVhbGx5IHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBpcyBhcyBlYXN5IGFzIHVzaW5nDQotQURCLjwvcD4NCi08cD5JbiB0aGUgZW5kLCBmb3Igc2ltcGxlIHN0cnVjdHVyZXMsIEFEQiB3aWxsIGxpa2VseSBiZSBlbm91Z2ggZm9yDQoteW91LiBJZiwgb24gdGhlIG90aGVyIGhhbmQgeW91IG5lZWQgbW9yZSBwb3dlciBvciBmbGV4aWJpbGl0eSwNCi13aGV0aGVyIHlvdSBjaG9vc2UgWE1MQmVhbnMgb3IgSmlCWCBkZXBlbmRzIG9uIGhvdyBtdWNoIHBvd2VyIG9yDQotZmxleGliaWxpdHkgeW91IG5lZWQgYW5kIHlvdXIgdG9sZXJhbmNlIGZvciBjb21wbGV4aXR5LjwvcD4NCi08YSBuYW1lPSJnZW5lcmF0aW5nIiBpZD0iZ2VuZXJhdGluZyI+PC9hPg0KLTxoMj5HZW5lcmF0aW5nIENsaWVudHM8L2gyPg0KLTxwPlRoZSBwcm9jZXNzIGZvciBnZW5lcmF0aW5nIGFuZCB1c2luZyBhIGNsaWVudCB2YXJpZXMgc2xpZ2h0bHkNCi1kZXBlbmRpbmcgb24gdGhlIG1ldGhvZCBvZiBnZW5lcmF0aW9uIHlvdSBjaG9vc2UuIEluIGFsbCB0aHJlZQ0KLWNhc2VzIGluIHRoaXMgZG9jdW1lbnQsIGNsaWVudHMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBzYW1lIFdTREwNCi1maWxlIChzZWUgPGEgaHJlZj0idXNlcmd1aWRlLWNvZGVsaXN0aW5nNS5odG1sIj5Db2RlIExpc3RpbmcNCi01PC9hPikuPC9wPg0KLTxwPk5vdGUgdGhhdCB0aGUgZG9jdW1lbnQgZGVmaW5lcyBmb3VyIG9wZXJhdGlvbnMsIERvSW5Pbmx5LA0KLU5vUGFyYW1ldGVycywgVHdvV2F5T25lUGFyYW1ldGVyRWNobywgYW5kDQotTXVsdGlwbGVQYXJhbWV0ZXJzQWRkSXRlbS4gRWFjaCBvZiB0aGUgY2xpZW50cyB3aWxsIGluY2x1ZGUgbWV0aG9kcw0KLWZvciBjYWxsaW5nIGVhY2ggb2YgdGhlc2Ugb3BlcmF0aW9ucy48L3A+DQotPHA+KFlvdSBjYW4gZ2V0IG1vcmUgaW5mb3JtYXRpb24gb24gV1NETCBhdCA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2Rlc2MvIj5odHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2Rlc2MvPC9hPg0KLS4pPC9wPg0KLTxhIG5hbWU9ImFkYiIgaWQ9ImFkYiI+PC9hPg0KLTxoMj5BeGlzIERhdGEgQmluZGluZyAoQURCKTwvaDI+DQotPHA+VG8gY3JlYXRlIGEgY2xpZW50IHVzaW5nIEFEQiwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4NCi08cD48Yj5UaGUgc2hvcnQgc3Rvcnk6PC9iPjwvcD4NCi08b2w+DQotPGxpPg0KLTxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkL0BheGlzMl92ZXJzaW9uX2RpckAvZG93bmxvYWQuY2dpI3N0ZC1iaW4iPkRvd25sb2FkPC9hPiBhbmQgdW5wYWNrIHRoZSBBcGFjaGUgQXhpczIgU3RhbmRhcmQNCi1EaXN0cmlidXRpb24sIGlmIHlvdSBoYXZlIG5vdCBkb25lIGl0IGFscmVhZHkuPC9saT4NCi08bGk+Q3JlYXRlIHRoZSBjbGllbnQgc3R1YiB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoNCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cV1NETDJKYXZhIC11cmkgQXhpczJVc2VyR3VpZGUud3NkbCAtcCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1kIGFkYiAtcw0KLTwvcHJlPjwvbGk+DQotPGxpPkNyZWF0ZSB0aGUgY2xpZW50IChmb3IgZXhhbXBsZSwgQ2xpZW50LmphdmEpLCBhIEphdmENCi1hcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGdlbmVyYXRlZCBzdHViLCBhbmQgc2F2ZSBpdCBpbiB0aGUNCi1vcmcvYXBhY2hlL2F4aXMyL2F4aXMydXNlcmd1aWRlIGRpcmVjdG9yeS48L2xpPg0KLTxsaT5CdWlsZCB0aGUgY2xpZW50IGJ5IHR5cGluZzogYW50IGphci5jbGllbnQuPC9saT4NCi08bGk+QXNzdW1pbmcgeW91IGhhdmUgYSBjb3JyZXNwb25kaW5nIHNlcnZpY2UsIHJ1biB0aGUgY2xpZW50IGJ5DQotYWRkaW5nIHRoZSBnZW5lcmF0ZWQgQXhpczJVc2VyR3VpZGVTZXJ2aWNlLXRlc3QtY2xpZW50LmphciBmaWxlDQotbG9jYXRlZCBpbiBidWlsZC9saWIgdG8gdGhlIGNsYXNzcGF0aCBhbmQgdHlwZTogamF2YQ0KLW9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQ2xpZW50PC9saT4NCi08L29sPg0KLTxwPjxiPlRoZSBsb25nIHN0b3J5OjwvYj48L3A+DQotPHA+SWYgeW91IGhhdmUgbm90IGRvbmUgaXQgYWxyZWFkeSwgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5jZ2kjc3RkLWJpbiI+DQotZG93bmxvYWQ8L2E+IGFuZCB1bnBhY2sgdGhlIEFwYWNoZSBBeGlzMiBTdGFuZGFyZCBEaXN0cmlidXRpb24uIFRoZQ0KLUF4aXMyIFdBUiBEaXN0cmlidXRpb24gZG9lcyBub3QgaW5jbHVkZSB0aGUgbmVjZXNzYXJ5IHV0aWxpdGllcyBmb3INCi1nZW5lcmF0aW5nIGNvZGUsIHN1Y2ggYXMgV1NETDJKYXZhLjwvcD4NCi08cD5JbiB0aGUgQURCIG1ldGhvZCBvZiBnZW5lcmF0aW5nIGNsaWVudHMsIGFsbCB0aGUgZnVuY3Rpb25hbGl0aWVzDQotb2YgdGhlIHNlcnZpY2VzIGFyZSBjb250YWluZWQgaW4gYSBzaW5nbGUgY2xhc3MgY2FsbGVkIGEgc3R1Yi4gVGhlDQotc3R1YiBjb250YWlucyBpbm5lciBjbGFzc2VzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHRoZSBuZWNlc3NhcnkNCi1vYmplY3RzIGRlZmluZWQgaW4gdGhlIFdTREwgZmlsZSwgc3VjaCBhcywgaW4gdGhlIGNhc2Ugb2YgdGhpcw0KLVdTREwsIERvSW5Pbmx5UmVxdWVzdE1lc3NhZ2UuIE9uY2UgeW91IGhhdmUgdGhlIHN0dWIsIHlvdSB3aWxsIGJlDQotYWJsZSB0byBjcmVhdGUgYSBjbGllbnQgYnkgc2ltcGx5IHJlZmVycmluZyB0byB0aGVzZSBjbGFzc2VzIGFuZA0KLXRoZWlyIG1ldGhvZHMuIFRvIGdlbmVyYXRlIHRoZSBjbGllbnQsIGlzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZA0KLWluIENvZGUgTGlzdGluZyA2LjwvcD4NCi08aDM+PGI+Q29kZSBMaXN0aW5nIDYgLSBHZW5lcmF0aW5nIHRoZSBDbGllbnQ8L2I+PC9oMz4NCi08cHJlPg0KLSVBWElTMl9IT01FJVxiaW5cV1NETDJKYXZhIC11cmkgQXhpczJVc2VyR3VpZGUud3NkbCAtcCBvcmcuYXBhY2hlLmF4aXMyLmF4aXMydXNlcmd1aWRlIC1kIGFkYiAtcw0KLTwvcHJlPg0KLTxwPlRoaXMgY29tbWFuZCBhbmFseXplcyB0aGUgV1NETCBmaWxlIGFuZCBjcmVhdGVzIHRoZSBzdHViIGluIHRoZQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS4gVGhlIG9wdGlvbnMgc3BlY2lmeSB0aGF0DQoteW91IHdhbnQgdGhlIEFEQiBkYXRhIGJpbmRpbmcgbWV0aG9kICgtZCksIGFuZCBzeW5jaHJvbm91cyBvcg0KLWJsb2NraW5nLCBtZXRob2RzICgtcykuIEluIG90aGVyIHdvcmRzLCB3aGVuIHRoZSBjbGllbnQgbWFrZXMgYW4NCi1Jbi1PdXQgY2FsbCB0byB0aGUgc2VydmljZSwgaXQgd2lsbCB3YWl0IGZvciBhIHJlc3BvbnNlIGJlZm9yZQ0KLWNvbnRpbnVpbmcuPC9wPg0KLTxwPk9uY2UgeW91IHJ1biB0aGlzIGNvbW1hbmQsIHlvdSB3aWxsIHNlZSB0d28gbmV3IGl0ZW1zIGluIHRoZQ0KLWRpcmVjdG9yeS4gVGhlIGZpcnN0IGlzIHRoZSBidWlsZC54bWwgZmlsZSwgd2hpY2ggY29udGFpbnMgdGhlDQotaW5zdHJ1Y3Rpb25zIGZvciA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+IHRvDQotY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMuIFRoZSBzZWNvbmQgaXMgdGhlIHNyYyBkaXJlY3RvcnksDQotd2hpY2ggY29udGFpbnMgdGhlIGFjdHVhbCBBeGlzMlVzZXJHdWlkZVNlcnZpY2VTdHViLmphdmEgZmlsZS4gSWYNCi15b3Ugb3BlbiB0aGlzIGZpbGUsIHlvdSB3aWxsIHNlZSBhIGNvbGxlY3Rpb24gb2YgaW5uZXIgY2xhc3NlcyBmb3INCi1lYWNoIG9mIHRoZSBpdGVtcyBpbiB0aGUgV1NETCBmaWxlLiBZb3UnbGwgYWxzbyBzZWUgYSBudW1iZXIgb2YNCi1jYWxscyB0byB0aGUgQXhpczIgY2xpZW50IEFQSSwgaW5jbHVkaW5nIHRob3NlIHRoYXQgdXNlIEFYSU9NIHRvDQotYnVpbGQgYW5kIGFuYWx5emUgdGhlIGluY29taW5nIGFuZCBvdXRnb2luZyBtZXNzYWdlcy48L3A+DQotPHA+Tm93IHlvdSBuZWVkIGEgY2xpZW50IHRvIG1ha2UgdXNlIG9mIHRoaXMgY29kZS4gVG8gY3JlYXRlIGENCi1jbGllbnQsIGNyZWF0ZSBhIG5ldyBjbGFzcyBhbmQgc2F2ZSBpdCBhcyBDbGllbnQuamF2YSBpbiB0aGUNCi1vcmcvYXBhY2hlL2F4aXMyL2F4aXMydXNlcmd1aWRlIGRpcmVjdG9yeS4gSXQgc2hvdWxkIGNvbnRhaW4gdGhlDQotZm9sbG93aW5nIGNvZGUgaW4gPGEgaHJlZj0idXNlcmd1aWRlLWNvZGVsaXN0aW5nNy5odG1sIj5Db2RlDQotTGlzdGluZyA3PC9hPi48L3A+DQotPHA+Tm90ZSB0aGF0IHVzaW5nIHRoZSBzZXJ2aWNlIGlzIHNpbXBseSBhIG1hdHRlciBvZiBjcmVhdGluZyBhbmQNCi1wb3B1bGF0aW5nIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIHJlcXVlc3QgdXNpbmcgdGhlIG5hbWVzIGRlZmluZWQNCi1pbiB0aGUgV1NETCBmaWxlLCBhbmQgdGhlbiB1c2luZyB0aGUgc3R1YiB0byBhY3R1YWxseSBzZW5kIHRoZQ0KLXJlcXVlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIG1ldGhvZC4gRm9yIGV4YW1wbGUsIHRvIGNhbGwgdGhlDQotRG9Jbk9ubHkgb3BlcmF0aW9uLCB5b3UgY3JlYXRlIGEgRG9Jbk9ubHlSZXF1ZXN0LCB1c2UgaXRzDQotc2V0TWVzc2FnZVN0cmluZygpIG1ldGhvZCB0byBzZXQgdGhlIGNvbnRlbnRzIG9mIGl0cyBtZXNzYWdlU3RyaW5nDQotZWxlbWVudCwgYW5kIHBhc3MgaXQgYXMgYW4gYXJndW1lbnQgdG8gc3R1Yi5Eb0luT25seSgpLjwvcD4NCi08cD5UbyBidWlsZCB0aGUgY2xpZW50LCB0eXBlOiBhbnQgamFyLmNsaWVudDwvcD4NCi08cD5UaGlzIGFjdGlvbiBjcmVhdGVzIHR3byBuZXcgZGlyZWN0b3JpZXMsIGJ1aWxkIGFuZCB0ZXN0LiBUaGUNCi10ZXN0IGRpcmVjdG9yeSB3aWxsIGJlIGVtcHR5LCBidXQgdGhlIGJ1aWxkIGRpcmVjdG9yeSBjb250YWlucyB0d28NCi12ZXJzaW9ucyBvZiB0aGUgY2xpZW50LiBUaGUgZmlyc3QgdmVyc2lvbiwgaW4gdGhlIGxpYiBkaXJlY3RvcnksIGlzDQotYSAuamFyIGZpbGUgdGhhdCBjb250YWlucyB0aGUgY2xpZW50IGNsYXNzIGFuZCB0aGUgc3R1Yi4gVGhlDQotc2Vjb25kLCBpbiB0aGUgY2xhc3NlcyBkaXJlY3RvcnksIGlzIGp1c3QgcmF3IGNsYXNzZXMuPC9wPg0KLTxwPk1ha2Ugc3VyZSBhbGwgdGhlIGphciBmaWxlcyBpbiB0aGUgQXhpczIgbGliIGRpcmVjdG9yeSBhcmUgaW4NCi10aGUgY2xhc3NwYXRoLjwvcD4NCi08cD5JZiB5b3UgaGF2ZSBhIHNlcnZpY2UgY29ycmVzcG9uZGluZyB0byB0aGlzIGNsaWVudCB5b3UgY2FuIHJ1bg0KLXRoZSBjbGllbnQgYnkgYWRkaW5nIHRoZSBqYXIgZmlsZSB0byB5b3VyIGNsYXNzcGF0aCBhbmQgdHlwaW5nOg0KLWphdmEgb3JnLmFwYWNoZS5heGlzMi5heGlzMnVzZXJndWlkZS5DbGllbnQ8L3A+DQotPHA+KElmIHlvdSBkb24ndCBoYXZlIHN1Y2ggYSBzZXJ2aWNlLCwgcmVmZXIgdG8gdGhlIDxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwiPkJ1aWxkaW5nIHNlcnZpY2VzPC9hPg0KLWRvY3VtZW50Lik8L3A+DQotPHA+WW91IHNob3VsZCBzZWUgdGhlIHJlc3BvbnNlIGluIHRoZSBjb25zb2xlIHdpbmRvdyBvZiB5b3VyDQotc2VydmxldCBjb250YWluZXIuIEl0IHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPg0KLTxwPjxpbWcgYWx0PQ0KLSJSZXNwb25zZSBpbiBhIGNvbnNvbGUgd2luZG93IG9mIHlvdXIgc2VydmxldCBjb250YWluZXIiIHNyYz0NCi0iaW1hZ2VzL2ZpZzAzLmpwZyIgLz48YnIgY2xlYXI9ImFsbCIgLz48L3A+DQotPHA+QURCIGlzIG5vdCB5b3VyIG9ubHkgb3B0aW9uIGZvciBnZW5lcmF0aW5nIFdlYiBzZXJ2aWNlIGNsaWVudHMuDQotT3RoZXIgb3B0aW9ucyBpbmNsdWRlIDxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMteG1sYmVhbnMuaHRtbCI+WG1sQmVhbnM8L2E+LCA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLWppYnguaHRtbCI+SmlCWDwvYT4gYW5kDQotSkFYQlJJLjwvcD4NCi08cD48c3Ryb25nPlNlZSB0aGUgTmV4dCBTZWN0aW9uPC9zdHJvbmc+IC08YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2J1aWxkc2VydmljZXMiPkJ1aWxkaW5nDQotU2VydmljZXM8L2E+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVhY2I1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtZm9yZnVydGhlcnN0dWR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgbGFuZz0iZW4iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlLUZvciBGdXJ0aGVyIFN0dWR5PC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08YSBuYW1lPSIjZm9yZnVydGhlcnN0dWR5IiBpZD0iI2ZvcmZ1cnRoZXJzdHVkeSI+PC9hPg0KLTxoMT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlIC0gRm9yIEZ1cnRoZXIgU3R1ZHk8L2gxPg0KLTwhLS08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+SW50cm9kdWNpbmcgQXhpczI8L2E+PGJyIC8+DQotDQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPldoYXQgaXMgQXhpczI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjdW5kZXJob29kIj5XaGF0J3MgdW5kZXIgdGhlDQotaG9vZD88L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGFuZGxlc3NvYXAiPkhvdyBBeGlzMiBoYW5kbGVzIFNPQVANCi1tZXNzYWdlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNkaXN0cmlidXRpb25zIj5BeGlzMg0KLWRpc3RyaWJ1dGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjc2JkIj5UaGUgQXhpczIgU3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hpZXJhcmNoeSI+QXhpczIud2FyIGRvY3VtZW50DQotaGllcmFyY2h5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2NsaWVudHMiPkF4aXMyIGFuZCBjbGllbnRzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZw0KLWFuZCB0ZXN0aW5nIGNsaWVudCBjb2RlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48YnIgLz4NCi0NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNtZXNzYWdlZXhjaGFuZ2UiPk1lc3NhZ2UNCi1FeGNoYW5nZSBQYXR0ZXJuczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48YnIgLz4NCi0NCi08dWw+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+Q2hvb3NpbmcgYQ0KLUNsaWVudCBHZW5lcmF0aW9uIE1ldGhvZDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZw0KLUNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+QXhpcyBEYXRhIEJpbmRpbmcNCi0oQURCKTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLQ0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+R2V0dGluZw0KLUNvbWZvcnRhYmxlIHdpdGggQXZhaWxhYmxlIE9wdGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNjcmVhdGVzY3JhdGNoIj5DcmVhdGluZyBhDQotc2VydmljZSBmcm9tIHNjcmF0Y2g8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lwb2pvIj5EZXBsb3lpbmcNCi1QbGFpbiBPbGQgSmF2YSBPYmplY3RzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cnVuIj5EZXBsb3lpbmcgYW5kDQotcnVubmluZyBhbiBBeGlzMiBzZXJ2aWNlIGNyZWF0ZWQgZnJvbSBXU0RMPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCNjbGllbnRzIj5DbGllbnRzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwjc2VydmljZXMiPlNlcnZpY2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwjd3NkbCI+U2FtcGxlIFdTREwgZmlsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCNvdGhlcnMiPk90aGVyIFNhbXBsZXM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+PHN0cm9uZz5Gb3IgRnVydGhlcg0KLVN0dWR5PC9zdHJvbmc+PC9hPjwvbGk+DQotPC91bD4tLT4NCi08aDI+UmVzb3VyY2VzPC9oMj4NCi08cD5BeGlzMiBBcmNoaXRlY3R1cmUtPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9BeGlzMkFyY2hpdGVjdHVyZUd1aWRlLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvQXhpczJBcmNoaXRlY3R1cmVHdWlkZS5odG1sPC9hPjwvcD4NCi08cD5YTUwgcHJvY2Vzc2luZyB3aXRoIEFYSU9NLTxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2NvbW1vbnMvYXhpb20vT01UdXRvcmlhbC5odG1sIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL2F4aW9tL09NVHV0b3JpYWwuaHRtbDwvYT48L3A+DQotPHA+UkVTVGZ1bCBXZWIgU2VydmljZXMtPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9yZXN0LXdzLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvcmVzdC13cy5odG1sPC9hPjwvcD4NCi08cD5UQ1AgVHJhbnNwb3J0LTxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvdGNwLXRyYW5zcG9ydC5odG1sIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9AYXhpczJfdmVyc2lvbl9kaXJAL3RjcC10cmFuc3BvcnQuaHRtbDwvYT48L3A+DQotPHA+SFRUUCBUcmFuc3BvcnRzLTxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvaHR0cC10cmFuc3BvcnQuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9odHRwLXRyYW5zcG9ydC5odG1sPC9hPjwvcD4NCi08cD5NVE9NIHdpdGggQXhpczItPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9tdG9tLWd1aWRlLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvbXRvbS1ndWlkZS5odG1sPC9hPjwvcD4NCi08cD5TZWN1cmluZyBTT0FQIE1lc3NhZ2VzIHdpdGggQXBhY2hlIFJhbXBhcnQtIDxhIGhyZWY9DQotIi4uL21vZHVsZXMvcmFtcGFydC9AYXhpczJfdmVyc2lvbl9kaXJAL3NlY3VyaXR5LW1vZHVsZS5odG1sIj5odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL3JhbXBhcnQvQGF4aXMyX3ZlcnNpb25fZGlyQC9zZWN1cml0eS1tb2R1bGUuaHRtbDwvYT48L3A+DQotPHA+U09BUE1vbml0b3ItPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9zb2FwbW9uaXRvci1tb2R1bGUuaHRtbCI+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvQGF4aXMyX3ZlcnNpb25fZGlyQC9zb2FwbW9uaXRvci1tb2R1bGUuaHRtbDwvYT48L3A+DQotPHA+QXBhY2hlIEF4aXMyIEFkdmFuY2UgVXNlcidzIEd1aWRlLSA8YSBocmVmPQ0KLSJhZHYtdXNlcmd1aWRlLmh0bWwiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL0BheGlzMl92ZXJzaW9uX2RpckAvYWR2LXVzZXJndWlkZS5odG1sPC9hPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTk3ZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1pbnN0YWxsaW5ndGVzdGluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIGxhbmc9ImVuIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZS1JbnN0YWxsaW5nIGFuZCBUZXN0aW5nIENsaWVudA0KLUNvZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxhIG5hbWU9Imluc3RhbGxpbmd0ZXN0aW5nIiBpZD0iaW5zdGFsbGluZ3Rlc3RpbmciPjwvYT4NCi08aDE+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZSAtIEluc3RhbGxpbmcgYW5kIFRlc3RpbmcgQ2xpZW50DQotQ29kZTwvaDE+DQotPHA+VGhlIGJlc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGF0IHlvdXIgc3lzdGVtIGlzIHJ1bm5pbmcgQXBhY2hlDQotQXhpczIgaXMgdG8gaW5zdGFsbCBhbmQgdGVzdCBib3RoIGEgc2VydmljZSBhbmQgYSBjbGllbnQuIFRoZQ0KLXByb2Nlc3MgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaW50cm8iPkludHJvZHVjaW5nIEF4aXMyPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjd2hhdGlzIj5XaGF0IGlzIEF4aXMyPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN1bmRlcmhvb2QiPldoYXQncyB1bmRlciB0aGUNCi1ob29kPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoYW5kbGVzc29hcCI+SG93IEF4aXMyIGhhbmRsZXMgU09BUA0KLW1lc3NhZ2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2Rpc3RyaWJ1dGlvbnMiPkF4aXMyDQotZGlzdHJpYnV0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNzYmQiPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij5BeGlzMi53YXIgRGlyZWN0b3J5DQotSGllcmFyY2h5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2RvY3MiPkF4aXMyIERvY3VtZW50cw0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNjbGllbnRzIj5BeGlzMiBhbmQgY2xpZW50czwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWluc3RhbGxpbmd0ZXN0aW5nLmh0bWwjaW5zdGFsbGluZ3Rlc3RpbmciPjxzdHJvbmc+SW5zdGFsbGluZw0KLWFuZCB0ZXN0aW5nIGNsaWVudCBjb2RlPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNtZXNzYWdlZXhjaGFuZ2UiPk1lc3NhZ2UgRXhjaGFuZ2UNCi1QYXR0ZXJuczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+Q2hvb3NpbmcgYSBDbGllbnQNCi1HZW5lcmF0aW9uIE1ldGhvZDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZw0KLUNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+QXhpcyBEYXRhIEJpbmRpbmcNCi0oQURCKTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+R2V0dGluZw0KLUNvbWZvcnRhYmxlIHdpdGggdGhlIEF2YWlsYWJsZSBPcHRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjY3JlYXRlc2NyYXRjaCI+Q3JlYXRpbmcgYSBzZXJ2aWNlDQotZnJvbSBzY3JhdGNoPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cG9qbyI+RGVwbG95aW5nDQotUGxhaW4gT2xkIEphdmEgT2JqZWN0czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXJ1biI+RGVwbG95aW5nDQotYW5kIHJ1bm5pbmcgYW4gQXhpczIgc2VydmljZSBjcmVhdGVkIGZyb20gV1NETDwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCI+U2FtcGxlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtZm9yZnVydGhlcnN0dWR5Lmh0bWwiPkZvciBGdXJ0aGVyDQotU3R1ZHk8L2E+PC9saT4NCi08L3VsPg0KLTxwPjxiPlRoZSBTaG9ydCBTdG9yeTo8L2I+PC9wPg0KLTxvbD4NCi08bGk+SW5zdGFsbCBBcGFjaGUgQXhpczIgaW4gYSBzdWl0YWJsZSBjb250YWluZXIsIHN1Y2ggYXMgQXBhY2hlDQotVG9tY2F0LCBieSBjb3B5aW5nIHRoZSBheGlzMi53YXIgZmlsZSB0byB0aGUgd2ViYXBwcw0KLWRpcmVjdG9yeS48L2xpPg0KLTxsaT5JbnN0YWxsIHRoZSBzZXJ2aWNlIGludG8gdGhlIEF4aXMyIGFwcGxpY2F0aW9uIGJ5IGNvcHlpbmcgdGhlDQotKi5hYXIgZmlsZSBpbnRvIHRoZSBBeGlzMiBzZXJ2aWNlcyBkaXJlY3RvcnkuPC9saT4NCi08bGk+SW5zdGFsbCB0aGUgY2xpZW50IG9uIHRoZSBzeXN0ZW0gb24gd2hpY2ggeW91IHdhbnQgdG8gcnVuIGl0LA0KLWFuZCBtYWtlIHN1cmUgYWxsIHRoZSBBeGlzMiBsaWJyYXJpZXMgYXJlIG9uIHRoZSBDTEFTU1BBVEguPC9saT4NCi08bGk+UnVuIHRoZSBjbGllbnQuPC9saT4NCi08L29sPg0KLTwhLS1zdG9wcGVkIGhlcmUtLT4NCi08cD48Yj5UaGUgTG9uZyBTdG9yeTo8L2I+PC9wPg0KLTxwPlN0YXJ0IGJ5IGluc3RhbGxpbmcgYSBzdWl0YWJsZSBjb250YWluZXIsIHN1Y2ggYXMgPGEgaHJlZj0NCi0iaHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLyI+QXBhY2hlIFRvbWNhdDwvYT4uIEFueSBKMkVFIHNlcnZlciB3aWxsDQotZG8uIFRvIGluc3RhbGwgQXBhY2hlIEF4aXMyIG9uIHRoZSBzZXJ2ZXIsIGRvd25sb2FkIHRoZSBBeGlzMiBXQVINCi1kaXN0cmlidXRpb24gZnJvbSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiPmh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaTwvYT4NCi1hbmQgcGxhY2UgdGhlIGF4aXMyLndhciBmaWxlIGluIHRoZSBzZXJ2ZXIncyB3ZWJhcHBzIGRpcmVjdG9yeS4gVGhlDQotc2VydmVyIHdpbGwgdGhlbiBleHBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBpbnRvIGl0cyBwcm9wZXIgc3RydWN0dXJlLA0KLWFzIHNlZW4gaW4gdGhlIDxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hpZXJhcmNoeSI+ZWFybGllcg0KLXNlY3Rpb248L2E+LjwvcD4NCi08cD5BcGFjaGUgQXhpczIgc2VydmljZXMgY29tZSBidW5kbGVkIGFzICouYWFyIGZpbGVzLCB3aGljaCBjb250YWluDQotYWxsIHRoZSBwaWVjZXMgbmVjZXNzYXJ5IHRvIGRlZmluZSB0aGUgc2VydmljZSwgc3VjaCBhcyB0aGUNCi1uZWNlc3NhcnkgY2xhc3NlcyBhbmQgbGlicmFyaWVzIGFuZCB0aGUgc2VydmljZXMueG1sIGZpbGUgdGhhdA0KLWRlZmluZXMgdGhlIHNlcnZpY2UncyBiZWhhdmlvci4gWW91IGNhbiBpbnN0YWxsIHRoZSBzZXJ2aWNlIHVzaW5nDQotdGhlIDxhIGhyZWY9IndlYmFkbWluZ3VpZGUuaHRtbCI+V2ViIGFkbWluaXN0cmF0aW9uDQotYXBwbGljYXRpb248L2E+LCBidXQgdG8gbWFrZSB0aGluZ3Mgc2ltcGxlIGZvciBub3csIGNvcHkgdGhlICouYWFyDQotZmlsZSBpbnRvIHRoZSBBeGlzMiBzZXJ2aWNlcyBkaXJlY3RvcnkuIEZvciBleGFtcGxlLCB0byBpbnN0YWxsIHRoZQ0KLU15U2VydmljZSBzZXJ2aWNlIGRpc3RyaWJ1dGVkIGFzIG9uZSBvZiB0aGUgQXhpczIgc2FtcGxlcywgY29weSB0aGUNCi1maWxlICZsdDtBWElTMl9IT01FJmd0Oy9zYW1wbGVzL3VzZXJndWlkZS9idWlsZC9NeVNlcnZpY2UuYWFyIGZpbGUsDQotd2hpY2ggaXMgYnVpbHQgdXNpbmcgdGhlIDxjb2RlPmFudDwvY29kZT4gY29tbWFuZCwgZnJvbQ0KLSZsdDtBWElTMl9IT01FJmd0Oy9zYW1wbGVzL3VzZXJndWlkZSwgdG8gdGhlIGRpcmVjdG9yeQ0KLSZsdDtKMkVFX0hPTUUmZ3Q7L3dlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcy48L3A+DQotPHA+WW91ciBjbGllbnQgY2FuIGNvbWUgaW4gYW55IG51bWJlciBvZiBmb3JtcywgZnJvbSBhIGNvbGxlY3Rpb24NCi1vZiBmaWxlcyB0byBhIHNpbmdsZSAqLmphciBmaWxlLiBUaGUgaW1wb3J0YW50IHRoaW5nIGlzIHRvIGVuc3VyZQ0KLXRoYXQgYWxsIHRoZSBhcHByb3ByaWF0ZSBjbGFzc2VzIGFyZSBvbiB0aGUgY2xhc3NwYXRoLiBJbiBhZGRpdGlvbg0KLXRvIHRoZSBjbGFzc2VzIHRoYXQgcGVydGFpbiB0byB0aGUgYWN0dWFsIGNsaWVudCwgeW91IG11c3QgYWxzbyBhZGQNCi10aGUgQXhpczIgLmphciBmaWxlcyBpbnRvIHRoZSBDTEFTU1BBVEguIE5vcm1hbGx5IHlvdSB3aWxsIGRvIHRoaXMNCi1ieSBkb3dubG9hZGluZyBhbmQgdW5wYWNraW5nIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSNzdGQtYmluIj4NCi1BeGlzMiBTdGFuZGFyZCBEaXN0cmlidXRpb248L2E+IGFuZCBhZGRpbmcgdGhlICouamFyIGZpbGVzIGluIHRoZQ0KLWxpYiBkaXJlY3RvcnkgdG8geW91ciBDTEFTU1BBVEgsIG9yIHlvdSBhbHNvIGhhdmUgdGhlIG9wdGlvbiBvZg0KLXJ1bm5pbmcgeW91ciBjbGllbnQgdXNpbmcgdGhlIGF4aXMyLmJhdCAob3IgYXhpczIuc2gpIHNjcmlwdCwgd2hpY2gNCi10YWtlcyBjYXJlIG9mIGl0IGZvciB5b3UuIEZvciBleGFtcGxlLCB5b3UgY2FuIHJ1biBhIGNsaWVudCB3aXRoDQotdGhlIGNvbW1hbmQ6PC9wPg0KLTxwPmF4aXMyIG9yZy5hcGFjaGUuYXhpczIuYXhpczJ1c2VyZ3VpZGUuQ2xpZW50LjwvcD4NCi08cD48c3Ryb25nPlNlZSBOZXh0IFNlY3Rpb248L3N0cm9uZz4tIDxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOGI4YmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCBsYW5nPSJlbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUtIEludHJvZHVjdGlvbiB0byBTZXJ2aWNlczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGEgbmFtZT0iaW50cm9zZXJ2aWNlcyIgaWQ9ImludHJvc2VydmljZXMiPjwvYT4NCi08aDE+QXBhY2hlIEF4aXMyIFVzZXIncyBHdWlkZSAtIEludHJvZHVjdGlvbiB0byBTZXJ2aWNlczwvaDE+DQotPHA+VGhlIHRlcm0gIldlYiBzZXJ2aWNlcyIgY2FuIGFwcGx5IHRvIGEgbnVtYmVyIG9mIGRpZmZlcmVudCB3YXlzDQotb2Ygc2VuZGluZyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aC4gSG93ZXZlciwgdGhpcyBndWlkZSBmb2N1c2VzDQotb24gdGhlIHNlbmRpbmcgYW5kIHJlY2VpdmluZyBvZiBTT0FQIG1lc3NhZ2VzLiBTT0FQIG1lc3NhZ2VzIGFyZQ0KLVhNTCBkb2N1bWVudHMgdGhhdCBjb25zaXN0IG9mIGFuICJlbnZlbG9wZSIgY29udGFpbmluZyBhICJwYXlsb2FkIg0KLShzZWUgQ29kZSBMaXN0aW5nIDQpLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+SW50cm9kdWNpbmcgQXhpczI8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN3aGF0aXMiPldoYXQgaXMgQXhpczI/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3VuZGVyaG9vZCI+V2hhdCdzIHVuZGVyIHRoZQ0KLWhvb2Q/PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2hhbmRsZXNzb2FwIj5Ib3cgQXhpczIgaGFuZGxlcyBTT0FQDQotbWVzc2FnZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZGlzdHJpYnV0aW9ucyI+QXhpczINCi1kaXN0cmlidXRpb25zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI3NiZCI+VGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoaWVyYXJjaHkiPkF4aXMyLndhciBEaXJlY3RvcnkNCi1IaWVyYXJjaHk8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZG9jcyI+QXhpczIgRG9jdW1lbnRzDQotRGlzdHJpYnV0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2NsaWVudHMiPkF4aXMyIGFuZCBjbGllbnRzPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZyBhbmQNCi10ZXN0aW5nIGNsaWVudCBjb2RlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj48c3Ryb25nPkludHJvZHVjdGlvbg0KLXRvIFNlcnZpY2VzPC9zdHJvbmc+PC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sI21lc3NhZ2VleGNoYW5nZSI+PHN0cm9uZz5NZXNzYWdlDQotRXhjaGFuZ2UgUGF0dGVybnM8L3N0cm9uZz48L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjcmVhdGVjbGllbnRzIj5DcmVhdGluZw0KLUNsaWVudHM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY2hvb3NpbmdjbGllbnQiPkNob29zaW5nIGEgQ2xpZW50DQotR2VuZXJhdGlvbiBNZXRob2Q8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2dlbmVyYXRpbmciPkdlbmVyYXRpbmcNCi1DbGllbnRzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNhZGIiPkF4aXMgRGF0YSBCaW5kaW5nDQotKEFEQik8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjYnVpbGRzZXJ2aWNlcyI+QnVpbGRpbmcNCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZ2V0Y29tZm9ydGFibGUiPkdldHRpbmcNCi1Db21mb3J0YWJsZSB3aXRoIHRoZSBBdmFpbGFibGUgT3B0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2NyZWF0ZXNjcmF0Y2giPkNyZWF0aW5nIGEgc2VydmljZQ0KLWZyb20gc2NyYXRjaDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXBvam8iPkRlcGxveWluZw0KLVBsYWluIE9sZCBKYXZhIE9iamVjdHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lydW4iPkRlcGxveWluZw0KLWFuZCBydW5uaW5nIGFuIEF4aXMyIHNlcnZpY2UgY3JlYXRlZCBmcm9tIFdTREw8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPlNhbXBsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWZvcmZ1cnRoZXJzdHVkeS5odG1sIj5Gb3IgRnVydGhlcg0KLVN0dWR5PC9hPjwvbGk+DQotPC91bD4NCi08aDM+Q29kZSBMaXN0aW5nIDQ6IEV4YW1wbGUgU09BUCBNZXNzYWdlPC9oMz4NCi08cHJlPg0KLSZsdDs/eG1sIHZlcnNpb249JzEuMCcgPyZndDsNCi0mbHQ7ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIg0KLXhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wMy9hZGRyZXNzaW5nIiZndDsgDQotICZsdDtlbnY6SGVhZGVyJmd0Ow0KLQ0KLSAgICAmbHQ7d3NhOk1lc3NhZ2VJRCZndDsNCi0gICAgICBodHRwOi8vd3MuYXBhY2hlLm9yZy85QzIxREUzMi1EQjQyLTEyMjgtQzQyRS02NkNCMTAxNDIxQUQNCi0gICAgJmx0Oy93c2E6TWVzc2FnZUlEJmd0Ow0KLSAgICAmbHQ7d3NhOlJlcGx5VG8mZ3Q7DQotICAgICAgJmx0O3dzYTpBZGRyZXNzJmd0O2h0dHA6Ly9leGFtcGxlLmNvbS9wcm9qZWN0cy9jbGllbnRBcHAmbHQ7L3dzYTpBZGRyZXNzJmd0Ow0KLSAgICAmbHQ7L3dzYTpSZXBseVRvJmd0Ow0KLSAgICANCi0mbHQ7d3NhOlRvJmd0O2h0dHA6Ly9leGFtcGxlLmNvbS9heGlzMi9wdWJsaXNoaW5nU2VydmljZSZsdDsvd3NhOlRvJmd0Ow0KLSAgICANCi0mbHQ7d3NhOkFjdGlvbiZndDtodHRwOi8vZXhhbXBsZS5jb20vYXhpczIvYWRkRG9jdW1lbnQmbHQ7L3dzYTpBY3Rpb24mZ3Q7DQotIA0KLSZsdDsvZW52OkhlYWRlciZndDsNCi0gJmx0O2VudjpCb2R5Jmd0Ow0KLQ0KLSAgJmx0O2FkZERvY3VtZW50Jmd0Ow0KLSAgICZsdDtkb2NUaXRsZSZndDtXaGF0IEkgRGlkIE9uIE15IFN1bW1lciBWYWNhdGlvbiZsdDsvZG9jdGl0bGUmZ3Q7DQotICAgJmx0O2RvY1N1YnRpdGxlJmd0O0NoaWxkcmVuJ3MgRXNzYXlzIGZyb20gQWNjcm9zcyB0aGUgV29ybGQmbHQ7L2RvY1N1YnRpdGxlJmd0Ow0KLSAgICZsdDtkb2NMb2NhdGlvbiZndDtjb250ZW50UmVwb3Mvc3VtbWVyVmFjLmRvYyZsdDsvZG9jTG9jYXRpb24mZ3Q7DQotICAmbHQ7L2FkZERvY3VtZW50Jmd0Ow0KLQ0KLSAmbHQ7L2VudjpCb2R5Jmd0Ow0KLSZsdDsvZW52OkVudmVsb3BlJmd0Ow0KLTwvcHJlPg0KLTxwPlRoaXMgWE1MIGRvY3VtZW50IGNvbnNpc3RzIG9mIHRoZSBvdXRlciBlbGVtZW50IG9yIHRoZSBTT0FQDQotRW52ZWxvcGUsIGFuZCBpdHMgY29udGVudHMuIFRoZSBTT0FQIEVudmVsb3BlIGlzIGluIHRoZSBTT0FQDQotbmFtZXNwYWNlLCBodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUsIHByZWZpeGVkIGFzDQotZW52OiBhbmQgY29udGFpbnMgdXAgdG8gdHdvIGNoaWxkcmVuLiBUaGlzIGVudmVsb3BlIGlzIGEgc3RhbmRhcmQNCi1mb3JtYXQgdGhhdCBwZXJ0YWlucyB0byBldmVyeSBzaW5nbGUgU09BUCBtZXNzYWdlIHNlbnQgYW5kIHJlY2VpdmVkDQotYnkgYW55IFNPQVAgV2ViIHNlcnZpY2UuPC9wPg0KLTxwPlRoZSBjb250ZW50cyBvZiB0aGUgRW52ZWxvcGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzOyB0aGUgZmlyc3QNCi1iZWluZyB0aGUgU09BUCBoZWFkZXJzLXRoZSBjb250ZW50cyBvZiB0aGUgZW52OkhlYWRlciBlbGVtZW50Lg0KLVRoZXNlIGhlYWRlcnMsIHN1Y2ggYXMgdGhlIFdTLUFkZHJlc3NpbmcgZWxlbWVudHMgc2hvd24gaGVyZSwNCi1wcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UgYW5kIGhvdyBpdCBzaG91bGQNCi1iZSBoYW5kbGVkLiBBIFNPQVAgbWVzc2FnZSBtYXkgY2FycnkgaGVhZGVycyByZWxhdGluZyB0byBzZXZlcmFsDQotYXNwZWN0cyBvZiB0aGUgbWVzc2FnZSwgb3IgaXQgbWF5IGNhcnJ5IG5vIGhlYWRlcnMgYXQgYWxsLiBUaGVzZQ0KLWhlYWRlcnMgYXJlIHR5cGljYWxseSBwcm9jZXNzZWQgYnkgdGhlIG1lc3NhZ2UgaGFuZGxlcnMuPC9wPg0KLTxwPlRoZSBzZWNvbmQgYW5kIGFyZ3VhYmx5IHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBtZXNzYWdlDQotaXMgdGhlIHBheWxvYWQsIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZW52OkJvZHkNCi1lbGVtZW50LiBUaGlzIGlzIHRoZSBhY3R1YWwgbWVzc2FnZSBpbnRlbmRlZCBmb3IgdGhlIHJlY2VpdmVyLCBhbmQNCi1pdCBpcyB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGUgbWFpbiBhcHBsaWNhdGlvbiB3aWxsIHVsdGltYXRlbHkNCi1wcm9jZXNzLjwvcD4NCi08YSBuYW1lPSJtZXNzYWdlZXhjaGFuZ2UiIGlkPSJtZXNzYWdlZXhjaGFuZ2UiPjwvYT4NCi08aDI+TWVzc2FnZSBFeGNoYW5nZSBQYXR0ZXJuczwvaDI+DQotPHA+QWx0aG91Z2ggYWxsIFNPQVAgbWVzc2FnZXMgY2FycnkgdGhlIHNhbWUgc3RydWN0dXJlLCB0aGUgd2F5cyBpbg0KLXdoaWNoIHRoZXkgYXJlIHVzZWQgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBudW1iZXIgb2YgZGlmZmVyZW50DQotIm1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybnMiLCBvciBNRVBzLiBUaGUgdHdvIG1ham9yIG1lc3NhZ2UNCi1leGNoYW5nZSBwYXR0ZXJucyBhcmU6PC9wPg0KLTx1bD4NCi08bGk+SW4tT3V0OiBpbiB0aGlzIE1FUCwgdGhlIGNsaWVudCBzZW5kcyBhIFNPQVAgbWVzc2FnZSB0byB0aGUNCi1zZXJ2ZXIsIHdoaWNoIHByb2Nlc3NlcyB0aGUgbWVzc2FnZSBhbmQgc2VuZHMgYSByZXNwb25zZSBiYWNrLiBUaGlzDQotaXMgcHJvYmFibHkgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBNRVAsIGFuZCBpcyB1c2VmdWwgZm9yIHRhc2tzDQotc3VjaCBhcyBzZWFyY2hpbmcgZm9yIGluZm9ybWF0aW9uIG9yIHN1Ym1pdHRpbmcgaW5mb3JtYXRpb24gaW4NCi1zaXR1YXRpb25zIGluIHdoZXJlIGFja25vd2xlZGdtZW50IGlzIGltcG9ydGFudC48L2xpPg0KLTxsaT5Jbi1Pbmx5OiBJbiB0aGlzIE1FUCwgdGhlIGNsaWVudCBzZW5kcyBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlcg0KLXdpdGhvdXQgZXhwZWN0aW5nIGEgcmVzcG9uc2UuIFlvdSBtYXkgdXNlIHRoaXMgTUVQIGZvciBhY3Rpdml0aWVzDQotc3VjaCBhcyBwaW5naW5nIGEgc2VydmVyIHRvIHdha2UgaXQgdXAsIHJlcG9ydGluZyBsb2dnaW5nDQotaW5mb3JtYXRpb24gZm9yIHdoaWNoIHlvdSBkbyBub3QgbmVlZCBhbiBhY2tub3dsZWRnbWVudCBhbmQgc28NCi1vbi48L2xpPg0KLTwvdWw+DQotPHA+V2l0aGluIHRoZXNlIHR3byBNRVBzLCB5b3UgYWxzbyBoYXZlIHNldmVyYWwgdmFyaWFibGVzIHRvDQotY29uc2lkZXI6PC9wPg0KLTx1bD4NCi08bGk+QmxvY2tpbmcgdmVyc3VzIG5vbi1ibG9ja2luZzogV2hlbiB0aGUgY2xpZW50IHNlbmRzIGEgbWVzc2FnZSwNCi10aGUgYXBwbGljYXRpb24gbWF5IHdhaXQgdG8gcmVjZWl2ZSBhIHJlc3BvbnNlIGJlZm9yZSBtb3Zpbmcgb24sIG9yDQotaXQgbWF5IHNpbXBseSBzZW5kIGEgbWVzc2FnZSBhbmQgbW92ZSBvbiBieSBzcGVjaWZ5aW5nIGEgY2FsbGJhY2sNCi1hY3Rpb24gdG8gYmUgY29tcGxldGVkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLjwvbGk+DQotPGxpPk51bWJlciBvZiBwYXJhbWV0ZXJzOiBVbHRpbWF0ZWx5LCBhIG1lc3NhZ2Ugc2VudCBmcm9tIGEgY2xpZW50DQotdG8gc2VydmVyIGlzIGludGVuZGVkIHRvIGV4ZWN1dGUgYSBwYXJ0aWN1bGFyIGFjdGlvbi4gVGhhdCBhY3Rpb24NCi1tYXkgbm90IHJlcXVpcmUgYW55IHBhcmFtZXRlcnMsIG9yIGl0IG1heSByZXF1aXJlIG9uZSBvciBtb3JlDQotcGFyYW1ldGVycy4gVGhlc2UgcGFyYW1ldGVycyBtdXN0IGJlIGVuY29kZWQgYXMgcGFydCBvZiB0aGUgcGF5bG9hZA0KLW9mIHRoZSBtZXNzYWdlLjwvbGk+DQotPC91bD4NCi08cD5UYWtpbmcgYWxsIHRoZXNlIG9wdGlvbnMgaW50byBjb25zaWRlcmF0aW9uLCB5b3UgY2FuIGNyZWF0ZQ0KLXZpcnR1YWxseSBhbnkgTUVQLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgYW4gT3V0LU9ubHkgc3lzdGVtDQotYnkgcmV2ZXJzaW5nIHJvbGVzIGZvciB0aGUgSW4tT25seSBNRVAuIEFwYWNoZSBBeGlzMiBhbHNvIGluY2x1ZGVzDQotc3VwcG9ydCBmb3IgbGVzcyBwcm9taW5lbnQgTUVQcywgc3VjaCBhcyBSb2J1c3QtSW4tT25seS48L3A+DQotPHA+PHN0cm9uZz5TZWUgTmV4dCBTZWN0aW9uPC9zdHJvbmc+IC0gPGEgaHJlZj0NCi0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48L3A+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLXNhbXBsZXMueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS1zYW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3NzFkYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvdXNlcmd1aWRlLXNhbXBsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCBsYW5nPSJlbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGUtIFRoZSBTYW1wbGVzPC90aXRsZT4NCi08bGluayBocmVmPSIuLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08YSBuYW1lPSJzYW1wbGVzIiBpZD0ic2FtcGxlcyI+PC9hPg0KLTxoMT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlIC0gVGhlIFNhbXBsZXM8L2gxPg0KLTxwPlRoZSBBcGFjaGUgQXhpczIgU3RhbmRhcmQgRGlzdHJpYnV0aW9uIHByb3ZpZGVzIGEgbnVtYmVyIG9mDQotc2FtcGxlcyB5b3UgY2FuIHVzZSBhcyBhIGd1aWRlIGZvciBpbXBsZW1lbnRpbmcgc3BlY2lmaWMgZmVhdHVyZXMNCi1hbmQgY2FwYWJpbGl0aWVzLiBUaGVzZSBzZXJ2aWNlcyBhcmUgbGlzdGVkIGluIHRoaXMgc2VjdGlvbi48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaW50cm8iPkludHJvZHVjaW5nIEF4aXMyPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjd2hhdGlzIj5XaGF0IGlzIEF4aXMyPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCN1bmRlcmhvb2QiPldoYXQncyB1bmRlciB0aGUNCi1ob29kPzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoYW5kbGVzc29hcCI+SG93IEF4aXMyIGhhbmRsZXMgU09BUA0KLW1lc3NhZ2VzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2Rpc3RyaWJ1dGlvbnMiPkF4aXMyDQotZGlzdHJpYnV0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNzYmQiPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij5BeGlzMi53YXIgRGlyZWN0b3J5DQotSGllcmFyY2h5PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS5odG1sI2RvY3MiPkF4aXMyIERvY3VtZW50cw0KLURpc3RyaWJ1dGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNjbGllbnRzIj5BeGlzMiBhbmQgY2xpZW50czwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWluc3RhbGxpbmd0ZXN0aW5nLmh0bWwjaW5zdGFsbGluZ3Rlc3RpbmciPkluc3RhbGxpbmcgYW5kDQotdGVzdGluZyBjbGllbnQgY29kZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjaW50cm9zZXJ2aWNlcyI+SW50cm9kdWN0aW9uIHRvDQotU2VydmljZXM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW50cm90b3NlcnZpY2VzLmh0bWwjbWVzc2FnZWV4Y2hhbmdlIj5NZXNzYWdlIEV4Y2hhbmdlDQotUGF0dGVybnM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjcmVhdGVjbGllbnRzIj5DcmVhdGluZw0KLUNsaWVudHM8L2E+PGJyIC8+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjY2hvb3NpbmdjbGllbnQiPkNob29zaW5nIGEgQ2xpZW50DQotR2VuZXJhdGlvbiBNZXRob2Q8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2dlbmVyYXRpbmciPkdlbmVyYXRpbmcNCi1DbGllbnRzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNhZGIiPkF4aXMgRGF0YSBCaW5kaW5nDQotKEFEQik8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjYnVpbGRzZXJ2aWNlcyI+QnVpbGRpbmcNCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZ2V0Y29tZm9ydGFibGUiPkdldHRpbmcNCi1Db21mb3J0YWJsZSB3aXRoIHRoZSBBdmFpbGFibGUgT3B0aW9uczwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2NyZWF0ZXNjcmF0Y2giPkNyZWF0aW5nIGEgc2VydmljZQ0KLWZyb20gc2NyYXRjaDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtYnVpbGRpbmdzZXJ2aWNlcy5odG1sI2RlcGxveXBvam8iPkRlcGxveWluZw0KLVBsYWluIE9sZCBKYXZhIE9iamVjdHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lydW4iPkRlcGxveWluZw0KLWFuZCBydW5uaW5nIGFuIEF4aXMyIHNlcnZpY2UgY3JlYXRlZCBmcm9tIFdTREw8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1zYW1wbGVzLmh0bWwiPjxzdHJvbmc+U2FtcGxlczwvc3Ryb25nPjwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1zYW1wbGVzLmh0bWwjY2xpZW50cyI+PHN0cm9uZz5DbGllbnRzPC9zdHJvbmc+PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1zYW1wbGVzLmh0bWwjc2VydmljZXMiPjxzdHJvbmc+U2VydmljZXM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCN3c2RsIj48c3Ryb25nPlNhbXBsZSBXU0RMDQotZmlsZXM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCNvdGhlcnMiPjxzdHJvbmc+T3RoZXINCi1TYW1wbGVzPC9zdHJvbmc+PC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtZm9yZnVydGhlcnN0dWR5Lmh0bWwiPkZvciBGdXJ0aGVyDQotU3R1ZHk8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImNsaWVudHMiIGlkPSJjbGllbnRzIj48L2E+DQotPGgyPkNsaWVudHMgKGluIEFYSVMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL2NsaWVudHMpOjwvaDI+DQotPHA+PHN0cm9uZz5FY2hvQmxvY2tpbmdDbGllbnQuamF2YTwvc3Ryb25nPjogQSBiYXNpYyBleGFtcGxlIG9mIHRoZQ0KLXNlbmQvcmVjZWl2ZSBNRVAuPC9wPg0KLTxwPjxzdHJvbmc+RWNob0Jsb2NraW5nRHVhbENsaWVudC5qYXZhPC9zdHJvbmc+OiBTcGVjaWZpZXMgdGhhdCB0aGUNCi1yZXR1cm4gbWVzc2FnZSBzaG91bGQgYmUgc2VudCBvdmVyIGEgZGlmZmVyZW50IGNoYW5uZWwgdGhhbiB0aGUNCi1yZXF1ZXN0IG1lc3NhZ2UuPC9wPg0KLTxwPjxzdHJvbmc+RWNob0Jsb2NraW5nV3NhQmFzZWRDbGllbnQuamF2YTwvc3Ryb25nPjogUHJvdmlkZXMgYW4NCi1leGFtcGxlIG9mIHVzaW5nIHRoZSBjYXBhYmlsaXRpZXMgb2YgV1MtQWRkcmVzc2luZyBhY3Rpb24NCi1tYXBwaW5nLjwvcD4NCi08cD48c3Ryb25nPkVjaG9Ob25CbG9ja2luZ0NsaWVudC5qYXZhPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgYW4NCi1hc3luY2hyb25vdXMgcmVxdWVzdCB1c2luZyBDYWxsYmFja3MuPC9wPg0KLTxwPjxzdHJvbmc+RWNob05vbkJsb2NraW5nRHVhbENsaWVudC5qYXZhPC9zdHJvbmc+OiBTaW1pbGFyIHRvIHRoZQ0KLWFib3ZlLCBidXQgdXNlcyBhIHNlcGFyYXRlIGxpc3RlbmVyIGZvciB0aGUgcmVzcG9uc2UuPC9wPg0KLTxwPjxzdHJvbmc+Q2xpZW50Rm9yV2ViU2VydmljZVdpdGhNb2R1bGUuamF2YTwvc3Ryb25nPjogU2ltcGx5DQotbWFrZXMgYSBjYWxsIHRvIGEgc2VydmljZSB3aXRoIGVuZ2FnZWQgbW9kdWxlcy48L3A+DQotPHA+PHN0cm9uZz5DbGllbnRTaWRlTW9kdWxlRW5nYWdlbWVudC5qYXZhPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMNCi10aGUgdXNlIG9mIG1vZHVsZXMgb24gdGhlIGNsaWVudCBzaWRlLCBpbiBhZGRpdGlvbiB0byB0aGUgc2VydmVyDQotc2lkZS48L3A+DQotPHA+PHN0cm9uZz5NYWlsQ2xpZW50LmphdmE8L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZQ0KLVJvYnVzdCBJbi1Pbmx5IE1FUC48L3A+DQotPHA+PHN0cm9uZz5QaW5nQ2xpZW50LmphdmE8L3N0cm9uZz46IEEgc2ltcGxlICJmaXJlIGFuZCBmb3JnZXQiDQotY2xpZW50LjwvcD4NCi08cD48c3Ryb25nPlJFU1RDbGllbnQuamF2YTwvc3Ryb25nPjogRGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5IHRvDQotcmVxdWVzdCBhIFJFU1QgcmVzcG9uc2UgcmF0aGVyIHRoYW4gYSBTT0FQIHJlc3BvbnNlLiBBbHNvDQotZGVtb25zdHJhdGVzIHNldHRpbmcgYXJiaXRyYXJ5IHByb3BlcnRpZXMgb24gdGhlIE9wdGlvbnMNCi1vYmplY3QuPC9wPg0KLTxwPjxzdHJvbmc+VENQQ2xpZW50LmphdmE8L3N0cm9uZz46IFByb3ZpZGVzIGFuIGV4YW1wbGUgb2YgdXNpbmcNCi10aGUgVENQIHRyYW5zcG9ydCByYXRoZXIgdGhhbiBIVFRQLjwvcD4NCi08YSBuYW1lPSJzZXJ2aWNlcyIgaWQ9InNlcnZpY2VzIj48L2E+DQotPGgyPlNlcnZpY2VzIChpbiBBWElTMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlKTo8L2gyPg0KLTxwPjxzdHJvbmc+Z3Jvb3Z5U2VydmljZS5hYXI8L3N0cm9uZz46IERlbW9uc3RyYXRlcyBob3cgdG8gdXNlDQotR3Jvb3Z5IGNsYXNzZXMgaW4gdGhlIHByb2Nlc3Npbmcgb2YgU09BUCBtZXNzYWdlcy48L3A+DQotPHA+PHN0cm9uZz5NeVNlcnZpY2UuYWFyPC9zdHJvbmc+OiBQcm92aWRlcyBzaW1wbGUgImVjaG8iIGFuZA0KLSJwaW5nIiBvcGVyYXRpb25zLjwvcD4NCi08cD48c3Ryb25nPk15U2VydmljZVdpdGhNb2R1bGUuYWFyPC9zdHJvbmc+OiBTYW1lIGFzIGFib3ZlLCBidXQNCi1kZW1vbnN0cmF0ZXMgaG93IHRvIGVuZ2FnZSBhIG1vZHVsZS48L3A+DQotPHA+PHN0cm9uZz5Xc2FNYXBwaW5nU2VydmljZS5hYXI8L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgbWFwcGluZw0KLW9mIFdTLUFkZHJlc3NpbmcgYWN0aW9ucy48L3A+DQotPGEgbmFtZT0id3NkbCIgaWQ9IndzZGwiPjwvYT4NCi08aDI+U2FtcGxlIFdTREwgZmlsZXMgKGluIEFYSVMyX0hPTUUvc2FtcGxlcyk6PC9oMj4NCi08cD48c3Ryb25nPkF4aXMyU2FtcGxlRG9jTGl0LndzZGw8L3N0cm9uZz46IERlbW9uc3RyYXRlcyB0aGUgdXNlIG9mDQotdGhlIERvY3VtZW50L0xpdGVyYWwgV1NETCBwYXR0ZXJuLCByYXRoZXIgdGhhbiBSUEMuPC9wPg0KLTxwPjxzdHJvbmc+cGVyZi53c2RsPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhcnJheSB2YWx1ZXMNCi1hcyBpbnB1dCB2YWx1ZXMuPC9wPg0KLTxhIG5hbWU9Im90aGVycyIgaWQ9Im90aGVycyI+PC9hPg0KLTxoMj5PdGhlciBzYW1wbGVzPC9oMj4NCi08aDM+SW4gQVhJUzJfSE9NRS9zYW1wbGVzIERpcmVjdG9yeTo8L2gzPg0KLTwhLS08cD48c3Ryb25nPmFtYXpvbnFzPC9zdHJvbmc+OiBVc2VzIHRoZSBBbWF6b24gUXVldWUgU2VydmljZSB0byBzdG9yZSBhbmQNCi1yZXRyaWV2ZSBTdHJpbmcgb2JqZWN0cy48L3A+LS0+DQotPHA+PHN0cm9uZz5mYXVsdGhhbmRsaW5nPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBTT0FQDQotZmF1bHRzIGFuZCB0aGVpciBkZWZpbml0aW9ucyBpbiBXU0RMIGVuYWJsaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nDQotaW4gdGhlIGNsaWVudC48L3A+DQotPCEtLTxwPjxzdHJvbmc+Z29vZ2xlc2VhcmNoPC9zdHJvbmc+OiBDcmVhdGVzIGEgR1VJLWJhc2VkIGFwcGxpY2F0aW9uIG1ha2luZyB1c2UNCi1vZiBHb29nbGUgV2ViIFNlcnZpY2VzIGFzeW5jaHJvbm91c2x5LjwvcD4tLT4NCi08cD48c3Ryb25nPmdvb2dsZVNwZWxsY2hlY2s8L3N0cm9uZz46IERlbW9uc3RyYXRlcyBib3RoIHN5bmNocm9ub3VzDQotYW5kIG5vbi1zeW5jaHJvbm91cyB1c2Ugb2YgdGhlIEdvb2dsZSBXZWIgU2VydmljZSBpbiBhIEdVSS48L3A+DQotPHA+PHN0cm9uZz5tdG9tPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBNVE9NIGFuZCBTT0FQDQotd2l0aCBBdHRhY2htZW50cyB0byBzZW5kIGJpbmFyeSBmaWxlcyB0byBhIHNlcnZpY2UuPC9wPg0KLTxwPjxzdHJvbmc+c2FvcHdpdGhhdHRhY2htZW50czwvc3Ryb25nPjogRGVtb25zdHJhdGVzIHRoZQ0KLWNhcGFiaWxpdGllcyBhbmQgcG93ZXIgb2YgU09BUCB3aXRoIEF0dGFjaG1lbnQgc3VwcG9ydCBhbmQgdGhlDQotQXR0YWNobWVudCBBUEkgb2YgQXhpczIuPC9wPg0KLTxwPjxzdHJvbmc+cG9qbzwvc3Ryb25nPjogRXhhbXBsZSBvZiBhIFBPSk8gKFBsYWluIE9sZCBKYXZhIE9iamVjdCkNCi1XZWIgc2VydmljZS4gSXQgc2hvd3MgaG93IHRvIGV4cG9zZSB0aGUgbWV0aG9kcyBvZiBhIEphdmEgY2xhc3MgYXMNCi1hIFdlYiBzZXJ2aWNlIHVzaW5nIEFwYWNoZSBBaXhzMi48L3A+DQotPHA+PHN0cm9uZz5zZXJ2aWNlbGlmZWN5Y2xlPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgdGhlIHVzYWdlIG9mIGENCi1zZXJ2aWNlIGxpZmUgY3ljbGUgYW5kIGEgYml0IG9mIHNlc3Npb24gbWFuYWdlbWVudC4gVGhlIG1haW4gaWRlYQ0KLWlzIHRvIHNob3cgd2hlcmUgYW5kIGhvdyB0byB1c2UgdGhlIHNlcnZpY2UgbGlmZSBjeWNsZSBpbnRlcmZhY2UNCi1hbmQgc2Vzc2lvbiByZWxhdGVkIG1ldGhvZHMuPC9wPg0KLTwhLS08cD48c3Ryb25nPnNnY2NhbGN1bGF0b3I8L3N0cm9uZz46IEEgc2ltcGxlIGNhbGN1bGF0b3IgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlDQotdXNlIG9mIFNlcnZpY2UgR3JvdXBzLjwvcD4tLT4NCi08cD48c3Ryb25nPmRhdGFiaW5kaW5nPC9zdHJvbmc+OiBEZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBXU0RMMkphdmENCi1nZW5lcmF0ZWQgY29kZSB3aXRoIENhc3Rvci48L3A+DQotPHA+PHN0cm9uZz52ZXJzaW9uPC9zdHJvbmc+OiBBIHZlcnkgc2ltcGxlIHNlcnZpY2UgdGhhdCBzaW1wbHkNCi1vdXRwdXRzIHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbi48L3A+DQotPHA+PHN0cm9uZz55YWhvb3Jlc3RlYXJjaDwvc3Ryb25nPjogQSBjb21wbGV0ZSBleGFtcGxlIG9mIHRoZSB1c2UNCi1vZiBhIFJFU1Qgc2VydmljZSByYXRoZXIgdGhhbiBhIFNPQVAgc2VydmljZS48L3A+DQotPGgzPkV4dGVybmFsOjwvaDM+DQotPHA+PHN0cm9uZz5GbGlja3JDbGllbnQ8L3N0cm9uZz4gOiBEZW1vbnN0cmF0ZXMgY29kZSBnZW5lcmF0aW9uDQotY2FwYWJpbGl0aWVzIGZvciBXU0RMIDIuMC4gVGhlIEZsaWNrclNlcnZpY2Uud3NkbCBkZXNjcmliZXMNCi1zZXJ2aWNlcyBvZmZlcmVkIGJ5IGZsaWNrciBpbiB0ZXJtcyBvZiBXU0RMIDIuMC4gSXQgYWxzbw0KLWRlbW9uc3RyYXRlcyBob3cgYSByZXN0ZnVsIHNlcnZpY2UgY2FuIGJlIGRlc2NyaWJlZCB1c2luZyB0aGUNCi1IVFRQQmluZGluZyBvZiB3c2RsIDIuMC48L3A+DQotPHA+RXh0cmFjdCB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL2Rpc3Qud3NvMi5vcmcvcHJvZHVjdHMvd3Nhcy9qYXZhL25pZ2h0bHktYnVpbGQvIj5XU08yIFdTQVMNCi1mb3IgSmF2YSBuaWdodGx5IGJ1aWxkIGRpc3RyaWJ1dGlvbjwvYT4gYW5kIHlvdSB3aWxsIGZpbmQgdGhlDQotc2FtcGxlIGF0IFdTQVNfSE9NRS9zYW1wbGVzL0ZsaWNrckNsaWVudCBvciBjaGVja291dCBzYW1wbGUgZnJvbQ0KLVNWTjoNCi1odHRwOi8vd3NvMi5vcmcvcmVwb3Mvd3NvMi90cnVuay93c2FzL2phdmEvbW9kdWxlcy9zYW1wbGVzL0ZsaWNrckNsaWVudDwvcD4NCi08cD48c3Ryb25nPlNlZSBOZXh0IFNlY3Rpb248L3N0cm9uZz4gLSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtZm9yZnVydGhlcnN0dWR5Lmh0bWwiPkZvciBGdXJ0aGVyIFN0dWR5PC9hPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC91c2VyZ3VpZGUueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjJkZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3VzZXJndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BcGFjaGUgQXhpczIgVXNlcidzIEd1aWRlLSBJbnRyb2R1Y2luZyBBeGlzMjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+DQotPGgxPkFwYWNoZSBBeGlzMiBVc2VyJ3MgR3VpZGU8L2gxPg0KLTxwPlRoaXMgZ3VpZGUgcHJvdmlkZXMgYSBzdGFydGluZyBwbGFjZSBmb3IgdXNlcnMgd2hvIGFyZSBuZXcgdG8NCi1BcGFjaGUgQXhpczIuIEl0IGFsc28gY292ZXJzIHNvbWUgYWR2YW5jZWQgdG9waWNzLCBzdWNoIGFzIGhvdyB0bw0KLXVzZSBBeGlzMiB0byBjcmVhdGUgYW5kIGRlcGxveSBXZWIgc2VydmljZXMgYXMgd2VsbCBhcyBob3cgdG8gdXNlDQotV1NETCB0byBnZW5lcmF0ZSBib3RoIGNsaWVudHMgYW5kIHNlcnZpY2VzLjwvcD4NCi1Gb3IgZXhwZXJpZW5jZWQgdXNlcnMgb2YgQXBhY2hlIEF4aXMyLCB3ZSByZWNvbW1lbmQgdGhlIDxhIGhyZWY9DQotImFkdi11c2VyZ3VpZGUuaHRtbCI+QWR2YW5jZWQgVXNlcidzIEd1aWRlLjwvYT4gPGEgbmFtZT0iaW50cm8iIGlkPQ0KLSJpbnRybyI+PC9hPg0KLTxoMT5JbnRyb2R1Y2luZyBBeGlzMjwvaDE+DQotPHA+VGhpcyBzZWN0aW9uIGludHJvZHVjZXMgQXhpczIgYW5kIGl0cyBzdHJ1Y3R1cmUsIGluY2x1ZGluZyBhbg0KLWV4cGxhbmF0aW9uIG9mIHZhcmlvdXMgZGlyZWN0b3JpZXMvZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGxhdGVzdA0KLUF4aXMyIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+ZG93bmxvYWQ8L2E+LjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNpbnRybyI+PHN0cm9uZz5JbnRyb2R1Y2luZw0KLUF4aXMyPC9zdHJvbmc+PC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjd2hhdGlzIj48c3Ryb25nPldoYXQgaXMNCi1BeGlzMj88L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjdW5kZXJob29kIj48c3Ryb25nPldoYXQncyB1bmRlciB0aGUNCi1ob29kPzwvc3Ryb25nPjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUuaHRtbCNoYW5kbGVzc29hcCI+PHN0cm9uZz5Ib3cgQXhpczIgaGFuZGxlcw0KLVNPQVAgbWVzc2FnZXM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZGlzdHJpYnV0aW9ucyI+PHN0cm9uZz5BeGlzMg0KLURpc3RyaWJ1dGlvbnM8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjc2JkIj48c3Ryb25nPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjaGllcmFyY2h5Ij48c3Ryb25nPkF4aXMyLndhciBEaXJlY3RvcnkNCi1IaWVyYXJjaHk8L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjZG9jcyI+PHN0cm9uZz5BeGlzMiBEb2N1bWVudHMNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLmh0bWwjY2xpZW50cyI+PHN0cm9uZz5BeGlzMiBhbmQNCi1DbGllbnRzPC9zdHJvbmc+PC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZyBhbmQNCi1UZXN0aW5nIENsaWVudCBDb2RlPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNpbnRyb3NlcnZpY2VzIj5JbnRyb2R1Y3Rpb24gdG8NCi1TZXJ2aWNlczwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1pbnRyb3Rvc2VydmljZXMuaHRtbCNtZXNzYWdlZXhjaGFuZ2UiPk1lc3NhZ2UgRXhjaGFuZ2UNCi1QYXR0ZXJuczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2NyZWF0ZWNsaWVudHMiPkNyZWF0aW5nDQotQ2xpZW50czwvYT48YnIgLz4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotInVzZXJndWlkZS1jcmVhdGluZ2NsaWVudHMuaHRtbCNjaG9vc2luZ2NsaWVudCI+Q2hvb3NpbmcgYSBDbGllbnQNCi1HZW5lcmF0aW9uIE1ldGhvZDwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtY3JlYXRpbmdjbGllbnRzLmh0bWwjZ2VuZXJhdGluZyI+R2VuZXJhdGluZw0KLUNsaWVudHM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWNyZWF0aW5nY2xpZW50cy5odG1sI2FkYiI+QXhpcyBEYXRhIEJpbmRpbmcNCi0oQURCKTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNidWlsZHNlcnZpY2VzIj5CdWlsZGluZw0KLVNlcnZpY2VzPC9hPjxiciAvPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNnZXRjb21mb3J0YWJsZSI+R2V0dGluZw0KLUNvbWZvcnRhYmxlIHdpdGggQXZhaWxhYmxlIE9wdGlvbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNjcmVhdGVzY3JhdGNoIj5DcmVhdGluZyBhIFNlcnZpY2UNCi1mcm9tIFNjcmF0Y2g8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0idXNlcmd1aWRlLWJ1aWxkaW5nc2VydmljZXMuaHRtbCNkZXBsb3lwb2pvIj5EZXBsb3lpbmcNCi1QbGFpbiBPbGQgSmF2YSBPYmplY3RzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1idWlsZGluZ3NlcnZpY2VzLmh0bWwjZGVwbG95cnVuIj5EZXBsb3lpbmcNCi1hbmQgUnVubmluZyBhbiBBeGlzMiBTZXJ2aWNlIENyZWF0ZWQgZnJvbSBXU0RMPC9hPjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSJ1c2VyZ3VpZGUtc2FtcGxlcy5odG1sIj5TYW1wbGVzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9InVzZXJndWlkZS1mb3JmdXJ0aGVyc3R1ZHkuaHRtbCI+Rm9yIEZ1cnRoZXINCi1TdHVkeTwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0id2hhdGlzIiBpZD0id2hhdGlzIj48L2E+DQotPGgyPldoYXQgaXMgQXhpczI/PC9oMj4NCi08cD5UaGUgQXBhY2hlIEF4aXMyIHByb2plY3QgaXMgYSBKYXZhLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIGJvdGgNCi10aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMgb2YgdGhlIFdlYiBzZXJ2aWNlcyBlcXVhdGlvbi4gRGVzaWduZWQNCi10byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbGVzc29ucyBsZWFybmVkIGZyb20gQXBhY2hlIEF4aXMgMS4wLA0KLUFwYWNoZSBBeGlzMiBwcm92aWRlcyBhIGNvbXBsZXRlIG9iamVjdCBtb2RlbCBhbmQgYSBtb2R1bGFyDQotYXJjaGl0ZWN0dXJlIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBhZGQgZnVuY3Rpb25hbGl0eSBhbmQgc3VwcG9ydA0KLWZvciBuZXcgV2ViIHNlcnZpY2VzLXJlbGF0ZWQgc3BlY2lmaWNhdGlvbnMgYW5kDQotcmVjb21tZW5kYXRpb25zLjwvcD4NCi08cD5BeGlzMiBlbmFibGVzIHlvdSB0byBlYXNpbHkgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvcD4NCi08dWw+DQotPGxpPlNlbmQgU09BUCBtZXNzYWdlczwvbGk+DQotPGxpPlJlY2VpdmUgYW5kIHByb2Nlc3MgU09BUCBtZXNzYWdlczwvbGk+DQotPGxpPkNyZWF0ZSBhIFdlYiBzZXJ2aWNlIG91dCBvZiBhIHBsYWluIEphdmEgY2xhc3M8L2xpPg0KLTxsaT5DcmVhdGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgYm90aCB0aGUgc2VydmVyIGFuZCBjbGllbnQNCi11c2luZyBXU0RMPC9saT4NCi08bGk+RWFzaWx5IHJldHJpZXZlIHRoZSBXU0RMIGZvciBhIHNlcnZpY2U8L2xpPg0KLTxsaT5TZW5kIGFuZCByZWNlaXZlIFNPQVAgbWVzc2FnZXMgd2l0aCBhdHRhY2htZW50czwvbGk+DQotPGxpPkNyZWF0ZSBvciB1dGlsaXplIGEgUkVTVC1iYXNlZCBXZWIgc2VydmljZTwvbGk+DQotPGxpPkNyZWF0ZSBvciB1dGlsaXplIHNlcnZpY2VzIHRoYXQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTY3OTAvd3NzLXYxLjEtc3BlYy1vcy1TT0FQTWVzc2FnZVNlY3VyaXR5LnBkZiI+DQotV1MtU2VjdXJpdHk8L2E+LCA8YSBocmVmPQ0KLSJodHRwOi8veG1sLmNvdmVycGFnZXMub3JnL3dzLXJlbGlhYmxlbWVzc2FnaW5nMjAwMzAzMTMucGRmIj5XUy1SZWxpYWJsZU1lc3NhZ2luZzwvYT4sDQotPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMi93cy9hZGRyLyI+V1MtQWRkcmVzc2luZzwvYT4sDQotPGEgaHJlZj0NCi0iaHR0cDovL2RldjJkZXYuYmVhLmNvbS9wdWIvYS8yMDA0LzAzL3dzLWNvb3JkaW5hdGlvbi5odG1sIj5XUy1Db29yZGluYXRpb248L2E+LA0KLWFuZCA8YSBocmVmPQ0KLSJmdHA6Ly93d3c2LnNvZnR3YXJlLmlibS5jb20vc29mdHdhcmUvZGV2ZWxvcGVyL2xpYnJhcnkvV1MtQXRvbWljVHJhbnNhY3Rpb24ucGRmIj4NCi1XUy1BdG9taWMgVHJhbnNhY3Rpb248L2E+IHJlY29tbWVuZGF0aW9uczwvbGk+DQotPGxpPlVzZSBBeGlzMidzIG1vZHVsYXIgc3RydWN0dXJlIHRvIGVhc2lseSBhZGQgc3VwcG9ydCBmb3IgbmV3DQotcmVjb21tZW5kYXRpb25zIGFzIHRoZXkgZW1lcmdlPC9saT4NCi08L3VsPg0KLTxwPk1hbnkgbW9yZSBmZWF0dXJlcyBleGlzdCBhcyB3ZWxsLCBidXQgdGhpcyB1c2VyIGd1aWRlDQotY29uY2VudHJhdGVzIG9uIHNob3dpbmcgeW91IGhvdyB0byBhY2NvbXBsaXNoIHRoZSBmaXJzdCBmaXZlIHRhc2tzDQotb24gdGhpcyBsaXN0LjwvcD4NCi08YSBuYW1lPSJ1bmRlcmhvb2QiIGlkPSJ1bmRlcmhvb2QiPjwvYT4NCi08aDI+V2hhdCdzIFVuZGVyIHRoZSBIb29kPzwvaDI+DQotPHA+VG8gdW5kZXJzdGFuZCBBeGlzMiBhbmQgd2hhdCBpdCBkb2VzLCB5b3UgbXVzdCBoYXZlIGEgZ29vZCBpZGVhDQotb2YgdGhlIGxpZmUgY3ljbGUgb2YgYSBXZWIgc2VydmljZXMgbWVzc2FnZS4gVHlwaWNhbGx5LCBpdCBsb29rcw0KLXNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPg0KLTxwPjxpbWcgYWx0PSJMaWZlY3ljbGUgb2YgYSBXZWIgc2VydmljZXMgbWVzc2FnZSIgc3JjPQ0KLSJpbWFnZXMvZmlnMDEuanBnIiAvPjxiciBjbGVhcj0iYWxsIiAvPjwvcD4NCi08cD5UaGUgc2VuZGluZyBhcHBsaWNhdGlvbiBjcmVhdGVzIHRoZSBvcmlnaW5hbCBTT0FQIG1lc3NhZ2UsIGFuDQotWE1MIG1lc3NhZ2UgdGhhdCBjb25zaXN0cyBvZiBoZWFkZXJzIGFuZCBhIGJvZHkuIChGb3IgbW9yZQ0KLWluZm9ybWF0aW9uIG9uIFNPQVAsIHNlZSAiPGEgaHJlZj0NCi0idXNlcmd1aWRlLWludHJvdG9zZXJ2aWNlcy5odG1sLyI+SW50cm9kdWN0aW9uIHRvIFNlcnZpY2VzPC9hPiIuKQ0KLUlmIHRoZSBzeXN0ZW0gcmVxdWlyZXMgdGhlIHVzZSBvZiBXUyogcmVjb21tZW5kYXRpb25zIHN1Y2ggYXMNCi1XUy1BZGRyZXNzaW5nIG9yIFdTLVNlY3VyaXR5LCB0aGUgbWVzc2FnZSBtYXkgdW5kZXJnbyBhZGRpdGlvbmFsDQotcHJvY2Vzc2luZyBiZWZvcmUgaXQgbGVhdmVzIHRoZSBzZW5kZXIuIE9uY2UgdGhlIG1lc3NhZ2UgaXMgcmVhZHksDQotaXQgaXMgc2VudCB2aWEgYSBwYXJ0aWN1bGFyIHRyYW5zcG9ydCBzdWNoIGFzIEhUVFAsIEpNUywgYW5kIHNvDQotb24uPC9wPg0KLTxwPlRoZSBtZXNzYWdlIHdvcmtzIGl0cyB3YXkgb3ZlciB0byB0aGUgcmVjZWl2ZXIsIHdoaWNoIHRha2VzIGluDQotdGhlIG1lc3NhZ2UgdmlhIHRoZSB0cmFuc3BvcnQgbGlzdGVuZXIuIChJbiBvdGhlciB3b3JkcywgaWYgdGhlDQotYXBwbGljYXRpb24gZG9lc24ndCBoYXZlIGFuIEhUVFAgbGlzdGVuZXIgcnVubmluZywgaXQncyBub3QgZ29pbmcNCi10byByZWNlaXZlIGFueSBIVFRQIG1lc3NhZ2VzLikgQWdhaW4sIGlmIHRoZSBtZXNzYWdlIGlzIHBhcnQgb2YgYQ0KLXN5c3RlbSB0aGF0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgV1MtU2VjdXJpdHkgb3Igb3RoZXINCi1yZWNvbW1lbmRhdGlvbnMsIGl0IG1heSBuZWVkIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyBmb3IgdGhlIHB1cnBvc2UNCi1vZiBjaGVja2luZyBjcmVkZW50aWFscyBvciBkZWNyeXB0aW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4NCi1GaW5hbGx5LCBhIGRpc3BhdGNoZXIgZGV0ZXJtaW5lcyB0aGUgc3BlY2lmaWMgYXBwbGljYXRpb24gKG9yIG90aGVyDQotY29tcG9uZW50LCBzdWNoIGFzIGEgSmF2YSBtZXRob2QpIGZvciB3aGljaCB0aGUgbWVzc2FnZSB3YXMNCi1pbnRlbmRlZCwgYW5kIHNlbmRzIGl0IHRvIHRoYXQgY29tcG9uZW50LiBUaGF0IGNvbXBvbmVudCBpcyBwYXJ0IG9mDQotYW4gb3ZlcmFsbCBhcHBsaWNhdGlvbiBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIGRhdGEgYmVpbmcgc2VudA0KLWJhY2sgYW5kIGZvcnRoLjwvcD4NCi08YSBuYW1lPSJoYW5kbGVzc29hcCIgaWQ9ImhhbmRsZXNzb2FwIj48L2E+DQotPGgyPkhvdyBBeGlzMiBIYW5kbGVzIFNPQVAgTWVzc2FnZXM8L2gyPg0KLTxwPkF4aXMyIGNhbiBoYW5kbGUgcHJvY2Vzc2luZyBmb3IgYm90aCB0aGUgc2VuZGVyIGFuZCB0aGUgcmVjZWl2ZXINCi1pbiBhIHRyYW5zYWN0aW9uLiBGcm9tIHRoZSBBeGlzMiBwZXJzcGVjdGl2ZSwgdGhlIHN0cnVjdHVyZSBsb29rcw0KLWxpa2UgdGhpczo8L3A+DQotPHA+PGltZyBhbHQ9IkF4aXMyIGhhbmRsZXMgU09BUCBtZXNzYWdlcyIgc3JjPQ0KLSJpbWFnZXMvZmlnMDIuanBnIiAvPjxiciBjbGVhcj0iYWxsIiAvPjwvcD4NCi08cD5PbiBlYWNoIGVuZCwgeW91IGhhdmUgYW4gYXBwbGljYXRpb24gZGVzaWduZWQgdG8gZGVhbCB3aXRoIHRoZQ0KLShzZW50IG9yIHJlY2VpdmVkKSBtZXNzYWdlcy4gSW4gdGhlIG1pZGRsZSwgeW91IGhhdmUgQXhpczIsIG9yDQotcmF0aGVyLCB5b3UgPGVtPmNhbjwvZW0+IGhhdmUgQXhpczIuIFRoZSB2YWx1ZSBvZiBXZWIgc2VydmljZXMgaXMNCi10aGF0IHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyIChlYWNoIG9mIHdoaWNoIGNhbiBiZSBlaXRoZXIgdGhlDQotc2VydmVyIG9yIHRoZSBjbGllbnQpIGRvbid0IGV2ZW4gaGF2ZSB0byBiZSBvbiB0aGUgc2FtZSBwbGF0Zm9ybSwNCi1tdWNoIGxlc3MgcnVubmluZyB0aGUgc2FtZSBhcHBsaWNhdGlvbi4gQXNzdW1pbmcgdGhhdCBBeGlzMiBpcw0KLXJ1bm5pbmcgb24gYm90aCBzaWRlcywgdGhlIHByb2Nlc3MgbG9va3MgbGlrZSB0aGlzOjwvcD4NCi08dWw+DQotPGxpPlRoZSBzZW5kZXIgY3JlYXRlcyB0aGUgU09BUCBtZXNzYWdlLjwvbGk+DQotPGxpPkF4aXMgImhhbmRsZXJzIiBwZXJmb3JtIGFueSBuZWNlc3NhcnkgYWN0aW9ucyBvbiB0aGF0IG1lc3NhZ2UNCi1zdWNoIGFzIGVuY3J5cHRpb24gb2YgV1MtU2VjdXJpdHkgcmVsYXRlZCBtZXNzYWdlcy48L2xpPg0KLTxsaT5UaGUgdHJhbnNwb3J0IHNlbmRlciBzZW5kcyB0aGUgbWVzc2FnZS48L2xpPg0KLTxsaT5PbiB0aGUgcmVjZWl2aW5nIGVuZCwgdGhlIHRyYW5zcG9ydCBsaXN0ZW5lciBkZXRlY3RzIHRoZQ0KLW1lc3NhZ2UuPC9saT4NCi08bGk+VGhlIHRyYW5zcG9ydCBsaXN0ZW5lciBwYXNzZXMgdGhlIG1lc3NhZ2Ugb24gdG8gYW55IGhhbmRsZXJzIG9uDQotdGhlIHJlY2VpdmluZyBzaWRlLjwvbGk+DQotPGxpPk9uY2UgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkIGluIHRoZSAicHJlLWRpc3BhdGNoIg0KLXBoYXNlLCBpdCBpcyBoYW5kZWQgb2ZmIHRvIHRoZSBkaXNwYXRjaGVycywgd2hpY2ggcGFzcyBpdCBvbiB0byB0aGUNCi1hcHByb3ByaWF0ZSBhcHBsaWNhdGlvbi48L2xpPg0KLTwvdWw+DQotPHA+SW4gQXhpczIsIHRoZXNlIGFjdGlvbnMgYXJlIGJyb2tlbiBkb3duIGludG8gInBoYXNlcyIsIHdpdGgNCi1zZXZlcmFsIHByZS1kZWZpbmVkIHBoYXNlcywgc3VjaCBhcyB0aGUgInByZS1kaXNwYXRjaCIsICJkaXNwYXRjaCwiDQotYW5kICJtZXNzYWdlIHByb2Nlc3NpbmciLCBiZWluZyBidWlsdCBpbnRvIEF4aXMyLiBFYWNoIHBoYXNlIGlzIGENCi1jb2xsZWN0aW9uIG9mICJoYW5kbGVycyIuIEF4aXMyIGVuYWJsZXMgeW91IHRvIGNvbnRyb2wgd2hhdA0KLWhhbmRsZXJzIGdvIGludG8gd2hpY2ggcGhhc2VzLCBhbmQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBoYW5kbGVycw0KLWFyZSBleGVjdXRlZCB3aXRoaW4gdGhlIHBoYXNlcy4gWW91IGNhbiBhbHNvIGFkZCB5b3VyIG93biBwaGFzZXMNCi1hbmQgaGFuZGxlcnMuPC9wPg0KLTxwPkhhbmRsZXJzIGNvbWUgZnJvbSAibW9kdWxlcyIgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIGEgcnVubmluZw0KLUF4aXMyIHN5c3RlbS4gVGhlc2UgbW9kdWxlcywgc3VjaCBhcyBSYW1wYXJ0LCB3aGljaCBwcm92aWRlcyBhbg0KLWltcGxlbWVudGF0aW9uIG9mIFdTLVNlY3VyaXR5LCBhbmQgU2FuZGVzaGEsIHdoaWNoIHByb3ZpZGVzIGFuDQotaW1wbGVtZW50YXRpb24gb2YgV1MtUmVsaWFibGVNZXNzYWdpbmcsIGFyZSB0aGUgbWFpbiBleHRlbnNpYmlsaXR5DQotbWVjaGFuaXNtcyBpbiBBeGlzMi48L3A+DQotPGEgbmFtZT0iZGlzdHJpYnV0aW9ucyIgaWQ9ImRpc3RyaWJ1dGlvbnMiPjwvYT4NCi08aDI+QXhpczIgRGlzdHJpYnV0aW9uczwvaDI+DQotPHA+QXhpczIgaXMgcmVsZWFzZWQgaW4gc2V2ZXJhbCA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSI+DQotZGlzdHJpYnV0aW9uczwvYT4uIFdoaWNoIG9uZSB5b3UgbmVlZCBkZXBlbmRzIG9uIHdoYXQgeW91J2xsIGJlDQotZG9pbmcgd2l0aCBpdC48L3A+DQotPGEgbmFtZT0ic2JkIiBpZD0ic2JkIj48L2E+DQotPGgzPlRoZSBBeGlzMiBTdGFuZGFyZCBCaW5hcnkgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD5JZiB5b3UncmUgZGV2ZWxvcGluZyBzZXJ2aWNlcyBhbmQgYXBwbGljYXRpb25zLCB5b3UnbGwgbmVlZCB0aGUNCi1BeGlzMiA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSNzdGQtYmluIj4NCi1TdGFuZGFyZCBCaW5hcnkgRGlzdHJpYnV0aW9uPC9hPi4gVGhlIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBhbGwgdGhlDQotbmVjZXNzYXJ5ICouamFyIGZpbGVzLCBhcyB3ZWxsIGFzIGEgdmFyaWV0eSBvZiBzY3JpcHRzIHRoYXQgZWFzZQ0KLWRldmVsb3BtZW50LiBJdCBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuPC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAxOiBBeGlzMiBTdGFuZGFyZCBCaW5hcnkgRGlzdHJpYnV0aW9uPC9iPjwvcD4NCi08cHJlPg0KLWJpbg0KLSAgICAgIGF4aXMyLmJhdA0KLSAgICAgIGF4aXMyLnNoDQotICAgICAgYXhpczJzZXJ2ZXIuYmF0DQotICAgICAgYXhpczJzZXJ2ZXIuc2gNCi0gICAgICBqYXZhMndzZGwuYmF0DQotICAgICAgamF2YTJ3c2RsLnNoDQotICAgICAgd3NkbDJqYXZhLmJhdA0KLSAgICAgIHdzZGwyamF2YS5zaA0KLSAgICAgIHNldGVudi5zaA0KLWxpYg0KLSAgICAgIGFjdGl2YXRpb24tMS4xLmphcg0KLSAgICAgIC4uLg0KLSAgICAgIFhtbFNjaGVtYS5qYXINCi1yZXBvc2l0b3J5DQotICAgICAgICAgICAgIG1vZHVsZXMNCi0gICAgICAgICBtb2R1bGVzLmxpc3QgDQotICAgICAgICAgICAgICAgIGFkZHJlc3NpbmctMS4xLm1hcg0KLSAgICAgICAgICAgICAgIC4uDQotICAgICAgICAgICAgIHNlcnZpY2VzDQotICAgICAgICAgc2VydmljZXMubGlzdA0KLSAgICAgICAgICAgICAgICB2ZXJzaW9uLmFhcg0KLSAgICAgICAgIC4uDQotc2FtcGxlcw0KLSAgICAgIC4uLg0KLXdlYmFwcA0KLSAgICAgIC4uLg0KLWNvbmYNCi0gICAgYXhpczIueG1sDQotDQotTElDRU5TRS50eHQNCi1SRUFETUUudHh0DQotTk9USUNFLnR4dA0KLUlOU1RBTEwudHh0DQotcmVsZWFzZS1ub3Rlcy5odG1sDQotPC9wcmU+DQotPHA+VGhlIGJpbiBkaXJlY3RvcnkgaW5jbHVkZXMgYSBudW1iZXIgb2YgdXNlZnVsIHNjcmlwdHMuIFRoZXkNCi1pbmNsdWRlIGF4aXMyLmJhdCAob3IgYXhpczIuc2gpLCB3aGljaCBlbmFibGVzIHlvdSB0byBlYXNpbHkNCi1leGVjdXRlIGEgSmF2YSBjb21tYW5kIHdpdGhvdXQgaGF2aW5nIHRvIG1hbnVhbGx5IGFkZCBhbGwgdGhlIEF4aXMyDQotamFyIGZpbGVzIHRvIHRoZSBjbGFzc3BhdGgsIGphdmEyd3NkbC5iYXQgKGFuZCAuc2gpIGFuZA0KLXdzZGwyamF2YS5iYXQgKGFuZCAuc2gpLCB3aGljaCBlbmFibGUgeW91IHRvIGVhc2lseSBnZW5lcmF0ZSBKYXZhDQotY29kZSBmcm9tIGEgV1NETCBmaWxlIGFuZCB2aWNlIHZlcnNhLCBhbmQgYXhpczJzZXJ2ZXIuYmF0IChhbmQgc2gpLA0KLWEgc2ltcGxlIFdlYiBzZXJ2ZXIgdGhhdCBlbmFibGVzIHlvdSB0byBidWlsZCBBeGlzMidzIGNhcGFiaWxpdHkgdG8NCi1zZW5kIGFuZCByZWNlaXZlIG1lc3NhZ2VzIGludG8geW91ciBvd24gYXBwbGljYXRpb24uPC9wPg0KLTxwPkFzIGV4cGVjdGVkLCB0aGUgbGliIGRpcmVjdG9yeSBpbmNsdWRlcyBhbGwgdGhlIG5lY2Vzc2FyeSAuamFyDQotZmlsZXMuIFNlcnZpY2VzIGFuZCBtb2R1bGVzIGFyZSBhZGRlZCB0byB0aGUgcmVwb3NpdG9yeSBkaXJlY3RvcnkuDQotQXhpczIgY29tZXMgd2l0aCBhIHN0YW5kYXJkIG1vZHVsZSBpbXBsZW1lbnRpbmcgV1MtQWRkcmVzc2luZywgYW5kDQoteW91IGNhbiBhZGQgYW55IG90aGVyIG5lY2Vzc2FyeSBtb2R1bGUgc3VjaCBhcyBSYW1wYXJ0IHRvIHRoZQ0KLXJlcG9zaXRvcnkvbW9kdWxlcyBkaXJlY3RvcnkuPC9wPg0KLTxwPmNvbmYgZGlyZWN0b3J5IGluY2x1ZGVzIHRoZSBheGlzMi54bWwgd2hpY2ggaXMgdGhlIGdsb2JhbA0KLWRlcGxveW1lbnQgZGVzY3JpcHRvci48L3A+DQotPHA+RmluYWxseSwgdGhlIHNhbXBsZXMgZGlyZWN0b3J5IGluY2x1ZGVzIGFsbCB0aGUgc2FtcGxlIGNvZGUNCi1kaXN0cmlidXRlZCB3aXRoIEF4aXMyLiBTZWUgdGhlIGxpc3Qgb2YgPGEgaHJlZj0NCi0idXNlcmd1aWRlLXNhbXBsZXMuaHRtbCI+c2FtcGxlcyBhbmQgdGhlaXIgZGVzY3JpcHRpb25zPC9hPi48L3A+DQotPGEgbmFtZT0iaGllcmFyY2h5IiBpZD0iaGllcmFyY2h5Ij48L2E+DQotPGgyPmF4aXMyLndhciBEaXN0cmlidXRpb24gRGlyZWN0b3J5IEhpZXJhcmNoeTwvaDI+DQotPHA+YXhpczIud2FyIGlzIGF2YWlsYWJsZSBpbiA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC9AYXhpczJfdmVyc2lvbl9kaXJAL2Rvd25sb2FkLmNnaSN3YXIiPg0KLVdBUiAoV2ViIEFyY2hpdmUpIERpc3RyaWJ1dGlvbjwvYT4uIFRoZSBzZXJ2ZXIgc2lkZSBvZiBBeGlzMiBzaGlwcw0KLWFzIGEgSjJFRSBhcHBsaWNhdGlvbiwgYW5kIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBzaG93biBpbg0KLUNvZGUgTGlzdGluZyAyLjwvcD4NCi08cD48Yj5Db2RlIExpc3RpbmcgMjogU2VydmVyIFNpZGUgb2YgQXhpczI8L2I+PC9wPg0KLTxwcmU+DQotYXhpczItd2ViIA0KLU1FVEEtSU5GDQotV0VCLUlORg0KLSAgICBjbGFzc2VzIA0KLSAgICBjb25mDQotICAgICAgICBheGlzMi54bWwgDQotICAgIGxpYg0KLSAgICAgICAgYWN0aXZhdGlvbi5qYXINCi0gICAgICAgIC4uLg0KLSAgICAgICAgeG1sU2NoZW1hLmphcg0KLSAgICBtb2R1bGVzDQotICAgICAgICBtb2R1bGVzLmxpc3QgDQotICAgICAgICBhZGRyZXNzaW5nLm1hcg0KLSAgICAgICAgLi4uDQotICAgICAgICBzb2FwbW9uaXRvci5tYXINCi0gICAgc2VydmljZXMNCi0gICAgICAgIHNlcnZpY2VzLmxpc3QNCi0gICAgICAgIGFzZXJ2aWNlLmFhcg0KLSAgICAgICAgLi4uDQotICAgICAgICB2ZXJzaW9uLmFhcg0KLSAgICB3ZWIueG1sDQotPC9wcmU+DQotPHA+U3RhcnRpbmcgYXQgdGhlIHRvcCwgYXhpczItd2ViIGlzIGEgY29sbGVjdGlvbiBvZiBKU1BzIHRoYXQgbWFrZQ0KLXVwIHRoZSA8YSBocmVmPSJ3ZWJhZG1pbmd1aWRlLmh0bWwiPkF4aXMyIGFkbWluaXN0cmF0aW9uDQotYXBwbGljYXRpb248L2E+LCB0aHJvdWdoIHdoaWNoIHlvdSBjYW4gcGVyZm9ybSBhbnkgbmVlZGVkIGFjdGlvbnMNCi1zdWNoIGFzIGFkZGluZyBzZXJ2aWNlcyBhbmQgZW5nYWdpbmcgYW5kIGRpcy1lbmdhZ2luZyBtb2R1bGVzLiBUaGUNCi1XRUItSU5GIGRpcmVjdG9yeSByZXByZXNlbnRzIHRoZSBhY3R1YWwgQXhpczIgYXBwbGljYXRpb24sDQotaW5jbHVkaW5nIGFsbCB0aGUgKi5qYXIgZmlsZXMsIGFueSBpbmNsdWRlZCBtb2R1bGVzLCBhbmQgZXZlbiB0aGUNCi1kZXBsb3llZCBzZXJ2aWNlcyB0aGVtc2VsdmVzLjwvcD4NCi08cD5UaGUgY2xhc3NlcyBkaXJlY3RvcnkgaG9sZHMgYW55IGNsYXNzIG9yIHByb3BlcnR5IGZpbGVzIHRoYXQgYXJlDQotbmVlZGVkIGJ5IEF4aXMyIGl0c2VsZiwgc3VjaCBhcyBsb2c0ai5wcm9wZXJ0aWVzLiBBbnkgYWN0dWFsDQotc2VydmljZXMgdG8gYmUgaGFuZGxlZCBieSB0aGUgc3lzdGVtIHJlc2lkZSBpbiB0aGUgc2VydmljZXMNCi1kaXJlY3RvcnkgaW4gdGhlIGZvcm0gb2YgYW4gYXhpcyBhcmNoaXZlLCBvciAqLmFhciBmaWxlLiBUaGlzIGZpbGUNCi1jb250YWlucyBhbnkgY2xhc3NlcyByZWxhdGVkIHRvIHRoZSBzZXJ2aWNlLCBhcyB3ZWxsIGFzIHRoZQ0KLXNlcnZpY2VzLnhtbCBmaWxlLCB3aGljaCBjb250cm9scyBhbnkgYWRkaXRpb25hbCByZXF1aXJlbWVudHMsIHN1Y2gNCi1hcyB0aGUgZGVmaW5pdGlvbiBvZiBtZXNzYWdlIHNlbmRlcnMgYW5kIG1lc3NhZ2UgcmVjZWl2ZXJzLjwvcD4NCi08cD5UaGUgbWFpbiBmaWxlIGluIGFsbCB0aGlzIGlzIGF4aXMyLnhtbCwgd2hpY2ggY29udHJvbHMgaG93IHRoZQ0KLWFwcGxpY2F0aW9uIGRlYWxzIHdpdGggcmVjZWl2ZWQgbWVzc2FnZXMuIEl0IGRlZmluZXMgbWVzc2FnZQ0KLXJlY2VpdmVycyBhbmQgdHJhbnNwb3J0IHJlY2VpdmVycywgYXMgd2VsbCBhcyBkZWZpbmluZyB0cmFuc3BvcnQNCi1zZW5kZXJzIGFuZCBkZXRlcm1pbmluZyB3aGljaCBtb2R1bGVzIGFyZSBhY3RpdmUuIEl0IGFsc28gZGVmaW5lcw0KLXRoZSBvcmRlciBvZiBwaGFzZXMsIGFuZCB0aGUgaGFuZGxlcnMgdG8gYmUgZXhlY3V0ZWQgd2l0aGluIGVhY2gNCi1waGFzZS48L3A+DQotPHA+WW91IGNhbiBjb250cm9sIGFsbCBvZiB0aGlzIGluZm9ybWF0aW9uIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUNCi1XZWIgYXBwbGljYXRpb24sIGJ1dCBpZiB5b3UgcmVzdGFydCB0aGUgQXhpczIgYXBwbGljYXRpb24sIHRoZXNlDQotY2hhbmdlcyBhcmUgbG9zdCBhbmQgdGhlIHNlcnZlciBnb2VzIGJhY2sgdG8gdGhlIGRlZmluaXRpb25zIGluIHRoZQ0KLWF4aXMyLnhtbCBmaWxlLjwvcD4NCi08cD5BeGlzMiBhbHNvIHByb3ZpZGVzIGEgdGhpcmQgZGlzdHJpYnV0aW9uLCB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvQGF4aXMyX3ZlcnNpb25fZGlyQC9kb3dubG9hZC5jZ2kjc3JjIj4NCi1zb3VyY2UgZGlzdHJpYnV0aW9uPC9hPiwgd2hpY2ggZW5hYmxlcyB5b3UgdG8gZ2VuZXJhdGUgdGhpcyAud2FyDQotZmlsZSB5b3Vyc2VsZi48L3A+DQotPGEgaWQ9ImRvY3MiIG5hbWU9ImRvY3MiPjwvYT4NCi08aDI+QXhpczIgRG9jdW1lbnRhdGlvbiBEaXN0cmlidXRpb24gRGlyZWN0b3J5IEhpZXJhcmNoeTwvaDI+DQotPHA+VGhlIERvY3VtZW50cyBkaXN0cmlidXRpb24gaW5jbHVkZXMgYWxsIEF4aXMyIGRvY3VtZW50YXRpb24NCi1pbmNsdWRpbmcgdGhlIHhkY29zIGFuZCBqYXZhZG9jcy4gSXQgaGFzIHRoZSBmb2xsb3dpbmcNCi1zdHJ1Y3R1cmU6PC9wPg0KLTxwPjxiPkNvZGUgTGlzdGluZyAzOiBBeGlzMiBEb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9iPjwvcD4NCi08cHJlPg0KLWRvY3MNCi0gICAgICBqYXZhZG9jcw0KLSAgICAgIHhkb2NzDQotDQotTElDRU5TRS50eHQNCi1SRUFETUUudHh0DQotcmVsZWFzZS1ub3Rlcy5odG1sDQotPC9wcmU+DQotPHA+VGhlIGphdmFkb2NzIGRpcmVjdG9yeSBpbmNsdWRlcyBhbGwgdGhlIHN0YW5kYXJkIDxhIGhyZWY9DQotIi4uLy4uL2phdmFkb2NzL2luZGV4Lmh0bWwiPkFQSSBkb2N1bWVudGF0aW9uPC9hPiBmb3IgdGhlIEF4aXMyDQotQVBJLCB3aXRoIG90aGVyIGRvY3VtZW50YXRpb24gKGxpa2UgdGhpcyBkb2N1bWVudCkgaW4gdGhlIHhkb2NzDQotZGlyZWN0b3J5LjwvcD4NCi08YSBuYW1lPSJjbGllbnRzIiBpZD0iY2xpZW50cyI+PC9hPg0KLTxoMj5BeGlzMiBhbmQgQ2xpZW50czwvaDI+DQotPHA+Tm93IHRoYXQgZXhwbGFpbnMgaG93IEF4aXMyIGJlaGF2ZXMgYXMgcGFydCBvZiBhIFdlYg0KLWFwcGxpY2F0aW9uLiBXaGF0IGFib3V0IGEgc3RhbmRhbG9uZSBjbGllbnQgdGhhdCBpcyBub3QgcGFydCBvZiBhDQotSjJFRSBhcHBsaWNhdGlvbj8gSW4gdGhhdCBjYXNlLCBhIHNlbmRlciBjYW4gdXNlIHRoZSBBeGlzMiBkZWZhdWx0DQotcHJvcGVydGllcywgaW4gb3RoZXIgd29yZHMsIG5vIHNwZWNpYWwgaGFuZGxlcnMsIGFuZCBzbyBvbi4gQnV0IHlvdQ0KLWFsc28gaGF2ZSB0aGUgb3B0aW9uIHRvIHRlbGwgdGhlIGNsaWVudCB0byBsb2FkIGl0cyBvd24gY29weSBvZiB0aGUNCi1heGlzMi54bWwgZmlsZSBhbmQgYmVoYXZlIGFjY29yZGluZ2x5LjwvcD4NCi08cD48c3Ryb25nPlNlZSBOZXh0IFNlY3Rpb248L3N0cm9uZz4gLSA8YSBocmVmPQ0KLSJ1c2VyZ3VpZGUtaW5zdGFsbGluZ3Rlc3RpbmcuaHRtbCNpbnN0YWxsaW5ndGVzdGluZyI+SW5zdGFsbGluZyBhbmQNCi1UZXN0aW5nIENsaWVudCBDb2RlPC9hPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC93ZWJhZG1pbmd1aWRlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC93ZWJhZG1pbmd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4NzdlNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL0BheGlzMl92ZXJzaW9uX2RpckAvd2ViYWRtaW5ndWlkZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXBhY2hlIEF4aXMyIFdlYiBBZG1pbmlzdHJhdG9yJ3MgR3VpZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMSBhbGlnbj0iY2VudGVyIj5BcGFjaGUgQXhpczIgV2ViIEFkbWluaXN0cmF0b3IncyBHdWlkZTwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBnaXZlcyB5b3UgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlDQotYWRtaW5pc3RyYXRpb24gY29uc29sZSBvZiB0aGUgQXBhY2hlIEF4aXMyIFdlYiBhcHBsaWNhdGlvbi4gQXBhY2hlDQotQXhpczIgQWRtaW5pc3RyYXRpb24gaXMgYWxsIGFib3V0IGNvbmZpZ3VyaW5nIEFwYWNoZSBBeGlzMiBhdCBydW4NCi10aW1lLCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBpcyB0cmFuc2llbnQuPC9wPg0KLTxwPjxpPlNlbmQgeW91ciBmZWVkYmFjayB0bzogPGEgaHJlZj0NCi0ibWFpbHRvOmF4aXMtZGV2QHdzLmFwYWNoZS5vcmc/c3ViamVjdD1bQXhpczJdIj5heGlzLWRldkB3cy5hcGFjaGUub3JnPC9hPjwvaT4uDQotKFN1YnNjcmlwdGlvbiBkZXRhaWxzIGFyZSBhdmFpbGFibGUgb24gdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCI+QXhpczIgc2l0ZTwvYT4uKQ0KLUtpbmRseSBwcmVmaXggZXZlcnkgZW1haWwgc3ViamVjdCB3aXRoIFtBeGlzMl0uPC9wPg0KLTxoMj5Db250ZW50czwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjSW50cm8iPkludHJvZHVjdGlvbjwvYT4NCi08dWw+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNsb2dpbiI+TG9naW4gaW50byBBZG1pbmlzdHJhdGlvbiBTaXRlPC9hPjwvcD4NCi08L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2FkbWlub3B0aW9ucyI+QWRtaW5pc3RyYXRpb24gT3B0aW9uczwvYT4NCi08dWw+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiN0b29scyI+VG9vbHM8L2E+PC9wPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI3Vwc2VydmljZSI+VXBsb2FkIFNlcnZpY2U8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNzeXNjb21wb25lbnRzIj5TeXN0ZW0gY29tcG9uZW50czwvYT48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaGVhZGluZzEiPkF2YWlsYWJsZSBzZXJ2aWNlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjc2Vydmdyb3VwcyI+QXZhaWxhYmxlIHNlcnZpY2UgZ3JvdXBzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNhdm1vZHVsZXMiPkF2YWlsYWJsZSBtb2R1bGVzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNnbG9iYWxtb2R1bGVzIj5HbG9iYWxseSBlbmdhZ2VkIG1vZHVsZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3BoYXNlcyI+QXZhaWxhYmxlIHBoYXNlczwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+DQotPHA+PGEgaHJlZj0iI2V4ZWN1dGlvbmNoYWlucyI+RXhlY3V0aW9uIGNoYWluczwvYT48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjZ2xvYmFsY2hhaW5zIj5HbG9iYWwgY2hhaW5zPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNvcGVyYXRpb25jaGFpbnMiPk9wZXJhdGlvbiBzcGVjaWZpYyBjaGFpbnM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNlbmdhZ2lubW9kdWxlIj5FbmdhZ2UgbW9kdWxlPC9hPjwvcD4NCi08L2xpPg0KLTxsaT48YSBocmVmPSIjc2VydmljZXMiPlNlcnZpY2VzPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI3R1cm5vZmZzZXJ2aWNlIj5EZWFjdGl2YXRlIFNlcnZpY2U8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3R1cm5vbnNlcnZpY2UiPkFjdGl2YXRlIFNlcnZpY2U8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2VkaXRzZXJ2aWNlcGFyYSI+RWRpdCBzZXJ2aWNlIHBhcmFtZXRlcnM8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPGxpPg0KLTxwPjxhIGhyZWY9IiNjb250ZXh0Ij5Db250ZXh0czwvYT48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjdmlld2hpZXJhcmNoeSI+VmlldyBIaWVyYXJjaHk8L2E+PC9saT4NCi08L3VsPg0KLTwvbGk+DQotPC91bD4NCi08L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iSW50cm8iIGlkPSJJbnRybyI+PC9hPg0KLTxoMz5JbnRyb2R1Y3Rpb248L2gzPg0KLTxwPlRoZSBBcGFjaGUgQXhpczIgV2ViIGFwcGxpY2F0aW9uIGhhcyB0aHJlZSBtYWluIHNlY3Rpb25zOg0KLSdTZXJ2aWNlcycgbGlzdHMgYWxsIHRoZSBhdmFpbGFibGUgc2VydmljZXMgZGVwbG95ZWQgaW4gdGhpcw0KLXNlcnZlciwgJ1ZhbGlkYXRlJyBjaGVja3MgdGhlIHN5c3RlbSB0byBzZWUgd2hldGhlciBhbGwgdGhlDQotcmVxdWlyZWQgbGlicmFyaWVzIGFyZSBpbiBwbGFjZSBhbmQgdmlld3MgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiwNCi1hbmQgJ0FkbWluaXN0cmF0aW9uJyBpcyB0aGUgQXhpczIgV2ViIEFkbWluaXN0cmF0aW9uIG1vZHVsZSB3aGljaA0KLWlzIHRoZSBjb25zb2xlIGZvciBhZG1pbmlzdGVyaW5nIHRoZSBBcGFjaGUgQXhpczIgaW5zdGFsbGF0aW9uLjwvcD4NCi08cD5UaGUgQXhpczIgV2ViIEFkbWluaXN0cmF0aW9uIG1vZHVsZSBwcm92aWRlcyBhIHdheSB0byBjb25maWd1cmUNCi1BeGlzMiBkeW5hbWljYWxseS4gSXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgZHluYW1pYw0KLWNvbmZpZ3VyYXRpb24gd2lsbCBOT1QgYmUgcGVyc2lzdGVudCwgaS5lLiwgaWYgdGhlIHNlcnZsZXQNCi1jb250YWluZXIgaXMgcmVzdGFydGVkLCB0aGVuIGFsbCB0aGUgZHluYW1pYyBjb25maWd1cmF0aW9uIGNoYW5nZXMNCi13aWxsIGJlIGxvc3QuPC9wPg0KLTxhIG5hbWU9ImxvZ2luIiBpZD0ibG9naW4iPjwvYT4NCi08aDQ+TG9nIG9uIHRvIHRoZSBBZG1pbmlzdHJhdGlvbiBTaXRlPC9oND4NCi08cD5PbmNlIEFwYWNoZSBBeGlzMiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLCB0aGUgV2ViIGFwcGxpY2F0aW9uDQotY2FuIGJlIGFjY2Vzc2VkIChzZWUgPGEgaHJlZj0iaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCI+SW5zdGFsbGF0aW9uDQotR3VpZGU8L2E+IGZvciBpbnN0cnVjdGlvbnMpLiBGcm9tIHRoZSA8YSBocmVmPSIjaG9tZXBhZ2UiPkF4aXMyIFdlYg0KLUFwcGxpY2F0aW9uIEhvbWUgcGFnZTwvYT4geW91IGNhbiBnbyB0byB0aGUgQWRtaW5pc3RyYXRpb24gcGFnZSBieQ0KLWNsaWNraW5nIHRoZSAnQWRtaW5pc3RyYXRpb24nIGxpbmsuIFRoZSBMb2dpbiBwYWdlIHNob3duIGJlbG93IHdpbGwNCi1hcHBlYXIgcmVxdWVzdGluZyB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZC4gVGhlIGRlZmF1bHQgdXNlciBuYW1lDQotaXMgJ2FkbWluJyAod2l0aG91dCBxdW90ZXMpIGFuZCBkZWZhdWx0IHBhc3N3b3JkIGlzICdheGlzMicNCi0od2l0aG91dCBxdW90ZXMpLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9hZG1pbmxvZ2luLmpwZyIgLz48L3A+DQotPHA+WW91IGNhbiBjaGFuZ2UgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdmFsdWVzIGJ5IGNoYW5naW5nIHRoZQ0KLWZvbGxvd2luZyB0d28gcGFyYW1ldGVycyBpbiB0aGUgYXhpczIueG1sIGFzIHJlcXVpcmVkLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9wYXJhbWV0ZXJzLmpwZyIgLz48L3A+DQotPHA+SWYgdGhlIGxvZyBvbiBpcyBzdWNjZXNzZnVsLCB5b3Ugd2lsbCBzZWUgdGhlIHNjcmVlbiBiZWxvdy4gVGhpcw0KLWlzIHdoZXJlIHlvdSBjYW4gdmlldyB0aGUgY29uZmlndXJhdGlvbiBhbmQgdGhlIHN0YXR1cyBvZiB0aGUNCi1ydW5uaW5nIHN5c3RlbSBhbmQgZHluYW1pY2FsbHkgY29uZmlndXJlIGl0LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9hZG1pbi5qcGciIC8+PC9wPg0KLTxhIG5hbWU9ImFkbWlub3B0aW9ucyIgaWQ9ImFkbWlub3B0aW9ucyI+PC9hPg0KLTxoMz5BZG1pbmlzdHJhdGlvbiBPcHRpb25zPC9oMz4NCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj48YSBuYW1lPSJ0b29scyIgaWQ9DQotInRvb2xzIj48Yj5Ub29sczwvYj48L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjdXBzZXJ2aWNlIj5VcGxvYWQgU2VydmljZTwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0ic3lzY29tcG9uZW50cyIgaWQ9InN5c2NvbXBvbmVudHMiPjxiPlN5c3RlbQ0KLWNvbXBvbmVudHM8L2I+PC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2hlYWRpbmcxIj5BdmFpbGFibGUgc2VydmljZXM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3NlcnZncm91cHMiPkF2YWlsYWJsZSBzZXJ2aWNlIGdyb3VwczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjYXZtb2R1bGVzIj5BdmFpbGFibGUgbW9kdWxlczwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjZ2xvYmFsbW9kdWxlcyI+R2xvYmFsbHkgZW5nYWdlZCBtb2R1bGVzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNwaGFzZXMiPkF2YWlsYWJsZSBwaGFzZXM8L2E+PC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImV4ZWN1dGlvbmNoYWlucyIgaWQ9ImV4ZWN1dGlvbmNoYWlucyI+PGI+RXhlY3V0aW9uDQotY2hhaW5zPC9iPjwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNnbG9iYWxjaGFpbnMiPkdsb2JhbCBjaGFpbnM8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI29wZXJhdGlvbmNoYWlucyI+T3BlcmF0aW9uIHNwZWNpZmljIGNoYWluczwvYT48L2xpPg0KLTwvdWw+DQotPGI+PGEgaHJlZj0iI2VuZ2FnaW5tb2R1bGUiPkVuZ2FnZSBtb2R1bGU8L2E+PC9iPjxiciAvPg0KLTx1bD4NCi08bGk+Rm9yIGFsbCBTZXJ2aWNlczwvbGk+DQotPGxpPkZvciBhIFNlcnZpY2UgR3JvdXA8L2xpPg0KLTxsaT5Gb3IgYSBTZXJ2aWNlPC9saT4NCi08bGk+Rm9yIGFuIE9wZXJhdGlvbjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJzZXJ2aWNlcyIgaWQ9InNlcnZpY2VzIj48Yj5TZXJ2aWNlczwvYj48L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjdHVybm9mZnNlcnZpY2UiPkRlYWN0aXZhdGUgc2VydmljZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjdHVybm9uc2VydmljZSI+QWN0aXZhdGUgc2VydmljZTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjZWRpdHNlcnZpY2VwYXJhIj5FZGl0IHNlcnZpY2UgcGFyYW1ldGVyczwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iY29udGV4dCIgaWQ9ImNvbnRleHQiPjxiPkNvbnRleHRzPC9iPjwvYT4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiN2aWV3aGllcmFyY2h5Ij5WaWV3IEhpZXJhcmNoeTwvYT48L2xpPg0KLTwvdWw+DQotPC9kaXY+DQotPGEgbmFtZT0iaG9tZXBhZ2UiIGlkPSJob21lcGFnZSI+PC9hPg0KLTxoMz5BcGFjaGUgQXhpczIgV2ViIEFwcGxpY2F0aW9uIEhvbWUgUGFnZTwvaDM+DQotPHAgYWxpZ249ImNlbnRlciI+PHN0cm9uZz48aW1nIGFsdD0iIiBzcmM9DQotImltYWdlcy9jbGlwX2ltYWdlMDA2LmpwZyIgLz48L3N0cm9uZz48L3A+DQotPGEgbmFtZT0idXBzZXJ2aWNlIiBpZD0idXBzZXJ2aWNlIj48L2E+DQotPGgzPlVwbG9hZCBTZXJ2aWNlczwvaDM+DQotPHA+WW91IGNhbiB1cGxvYWQgcGFja2FnZWQgQXBhY2hlIEF4aXMyIHNlcnZpY2UgYXJjaGl2ZSBmaWxlcyB1c2luZw0KLXRoaXMgcGFnZS4gVGhpcyBjYW4gYmUgZG9uZSBpbiB0d28gc2ltcGxlIHN0ZXBzOjwvcD4NCi08dWw+DQotPGxpPkJyb3dzZSB0byB0aGUgbG9jYXRpb24gYW5kIHNlbGVjdCB0aGUgYXhpc1NlcnZpY2UgYXJjaGl2ZSBmaWxlDQoteW91IHdpc2ggdG8gdXBsb2FkPC9saT4NCi08bGk+VGhlbiBjbGljayBVcGxvYWQ8L2xpPg0KLTwvdWw+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvY2xpcF9pbWFnZTAxMC5qcGciIC8+PC9wPg0KLTxhIG5hbWU9ImhlYWRpbmcxIiBpZD0iaGVhZGluZzEiPjwvYT4NCi08aDM+QXZhaWxhYmxlIFNlcnZpY2VzPC9oMz4NCi08cD5UaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgJ0F2YWlsYWJsZSBTZXJ2aWNlcycgb3B0aW9uIGlzIGFsbW9zdA0KLXRoZSBzYW1lIGFzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSAnU2VydmljZXMnIG9wdGlvbiBvbiB0aGUgQXhpczINCi1XZWIgQXBwbGljYXRpb24gSG9tZSBwYWdlLCB3aGVyZSBpdCBkaXNwbGF5cyBhIGxpc3Qgb2YgZGVwbG95ZWQNCi1zZXJ2aWNlcyBhbmQgdGhlaXIgb3BlcmF0aW9ucy4gQXMgYW4gYWRkaXRpb25hbCBmZWF0dXJlLCB0aGUNCi0nQXZhaWxhYmxlIFNlcnZpY2VzJyBwYWdlIGxpc3RzIGRldGFpbHMgb2YgbW9kdWxlcyB0aGF0IGFyZSBlbmdhZ2VkDQotdG8gdGhlIGRlcGxveWVkIHNlcnZpY2VzIGFuZCB0aGVpciBvcGVyYXRpb25zIG9uIGEgZ2xvYmFsLCBzZXJ2aWNlDQotb3Igb24gYW4gb3BlcmF0aW9uIGxldmVsLjwvcD4NCi08cD5Vc2luZyB0aGUgJ0Rpc2VuZ2FnZScgbGluaywgeW91IGNhbiBkaXNlbmdhZ2UgdGhlIGNvcnJlc3BvbmRpbmcNCi1tb2R1bGUgYXMgbG9uZyBhcyB0aGUgbW9kdWxlIGlzIG5vdCBnbG9iYWxseSBlbmdhZ2VkIChpLmUuLCBlbmdhZ2VkDQotdG8gYWxsIHRoZSBzZXJ2aWNlcyBhbmQgb3BlcmF0aW9ucykuPC9wPg0KLTxwPkNsaWNrIG9uIGEgc3BlY2lmaWMgc2VydmljZSBhbmQgaXQgd2lsbCBnaXZlIHlvdSB0aGUgV1NETCBmaWxlDQotb2YgdGhhdCBwYXJ0aWN1bGFyIHNlcnZpY2UuPC9wPg0KLTxwPjxzdHJvbmc+RmF1bHR5IHNlcnZpY2VzPC9zdHJvbmc+IG9mIHRoaXMgc3lzdGVtIHdpbGwgYWxzbyBiZQ0KLWxpc3RlZCBvbiB0aGlzIHBhZ2UuIENsaWNrIG9uIGEgZmF1bHR5IHNlcnZpY2UgdG8gdmlldyBhIHBhZ2UgdGhhdA0KLWxpc3RzIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugb2YgdGhlIGV4Y2VwdGlvbiwgd2hpY2ggY2F1c2VkIHRoZQ0KLXNlcnZpY2UgdG8gYmUgZmF1bHR5LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9hZG1pbm1haW4uanBnIiAvPjwvcD4NCi08YSBuYW1lPSJzZXJ2Z3JvdXBzIiBpZD0ic2Vydmdyb3VwcyI+PC9hPg0KLTxoMz5BdmFpbGFibGUgU2VydmljZSBHcm91cHM8L2gzPg0KLTxwPlNlcnZpY2UgZ3JvdXAgaXMgYSBsb2dpY2FsIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBzZXJ2aWNlcywgYW5kDQotdGhlICdBdmFpbGFibGUgU2VydmljZSBHcm91cHMnIGxpbmsgd2lsbCBsaXN0IGFsbCB0aGUgYXZhaWxhYmxlDQotc2VydmljZSBncm91cHMgaW4gdGhlIHN5c3RlbS48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvc2VydmljZWdyb3Vwcy5qcGciIC8+PC9wPg0KLTxhIG5hbWU9ImF2bW9kdWxlcyIgaWQ9ImF2bW9kdWxlcyI+PC9hPg0KLTxoMz5BdmFpbGFibGUgTW9kdWxlczwvaDM+DQotPHA+VG8gdmlldyB0aGUgYXZhaWxhYmxlIG1vZHVsZXMgaW4gdGhlICdtb2R1bGVzJyBkaXJlY3Rvcnkgb2YgdGhlDQotcmVwb3NpdG9yeSwgY2xpY2sgJ0F2YWlsYWJsZSBNb2R1bGVzJy4gVGhpcyB3aWxsIHNob3cgeW91IGFsbCB0aGUNCi1hdmFpbGFibGUgbW9kdWxlcyBpbiB0aGUgc3lzdGVtLiBUaG9zZSBtb2R1bGVzIGNhbiBiZSBlbmdhZ2VkDQotZHluYW1pY2FsbHkuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL21vZHVsZXMuanBnIiAvPjwvcD4NCi08YnIgLz4NCi08YSBuYW1lPSJnbG9iYWxtb2R1bGVzIiBpZD0iZ2xvYmFsbW9kdWxlcyI+PC9hPg0KLTxoMz5HbG9iYWxseSBFbmdhZ2VkIE1vZHVsZXM8L2gzPg0KLTxwPkNsaWNrIHRoZSAnR2xvYmFsbHkgRW5nYWdlZCBNb2R1bGVzJyB0byB2aWV3IHRoZSBnbG9iYWxseQ0KLWVuZ2FnZWQgbW9kdWxlcywgaWYgYW55LiBJZiBhIG1vZHVsZSBpcyBlbmdhZ2VkIGdsb2JhbGx5LCB0aGVuIHRoZQ0KLWhhbmRsZXJzIHRoYXQgYmVsb25nIHRvIHRoYXQgbW9kdWxlIHdpbGwgYmUgZXhlY3V0ZWQgaXJyZXNwZWN0aXZlDQotb2YgdGhlIHNlcnZpY2UuPC9wPg0KLTxhIG5hbWU9InBoYXNlcyIgaWQ9InBoYXNlcyI+PC9hPg0KLTxoMz5BdmFpbGFibGUgUGhhc2VzPC9oMz4NCi08cD5UaGUgJ0F2YWlsYWJsZSBQaGFzZXMnIGxpbmsgd2lsbCBkaXNwbGF5IGFsbCB0aGUgYXZhaWxhYmxlDQotcGhhc2VzLiBJbiBBeGlzMiwgdGhlcmUgYXJlIHR3byBsZXZlbHMgb2YgcGhhc2VzOjwvcD4NCi08dWw+DQotPGxpPlN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAobm90IGFsbG93ZWQgdG8gYmUgY2hhbmdlZCk8L2xpPg0KLTxsaT5Vc2VyIGRlZmluZWQgcGhhc2VzPC9saT4NCi08L3VsPg0KLTxwPlRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSB0d28gbGV2ZWxzIGlzIHRoYXQgc3lzdGVtDQotcHJlZGVmaW5lZCBwaGFzZXMgd2lsbCBiZSBpbnZva2VkIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZXMsDQotd2hpbGUgdGhlIHVzZXIgZGVmaW5lZCBwaGFzZXMgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIGRpc3BhdGNoZXINCi1maW5kcyB0aGUgb3BlcmF0aW9uLiBOb3RlIHRoYXQgaXQgaXMgZXNzZW50aWFsIGZvciBtb2R1bGUNCi1kZXZlbG9wZXJzIGFuZCBzZXJ2aWNlIHdyaXRlcnMgdG8gaGF2ZSBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZg0KLXBoYXNlcyBhbmQgcGhhc2Ugb3JkZXJpbmcuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0iaW1hZ2VzL3ZpZXdwaGFzZXMuanBnIiAvPjwvcD4NCi08YnIgLz4NCi08YSBuYW1lPSJnbG9iYWxjaGFpbnMiIGlkPSJnbG9iYWxjaGFpbnMiPjwvYT4NCi08aDM+R2xvYmFsIENoYWluczwvaDM+DQotPHA+VGhlICdHbG9iYWwgQ2hhaW5zJyBsaW5rIHdpbGwgZGlzcGxheSBhbGwgdGhlIEdsb2JhbCBFeGVjdXRpb24NCi1DaGFpbnMuIFRoZSBtb3N0IGludGVyZXN0aW5nIGZlYXR1cmUgb2YgdGhlIEF4aXMyIFdlYg0KLUFkbWluaXN0cmF0aW9uIE1vZHVsZSBpcyB0aGF0IGl0IHByb3ZpZGVzIGEgdmVyeSBiYXNpYyBtZXRob2Qgb2YNCi12aWV3aW5nIHRoZSBnbG9iYWwgcGhhc2UgbGlzdCBhbmQgaGFuZGxlcnMgaW5zaWRlIHRoZSBwaGFzZXMNCi1kZXBlbmRpbmcgb24gYm90aCB0aGUgcGhhc2UgYW5kIGhhbmRsZXIgb3JkZXJzLiBUaGlzIGtpbmQgb2YNCi1pbmZvcm1hdGlvbiBpcyBleHRyZW1lbHkgdXNlZnVsIGluIGRlYnVnZ2luZyB0aGUgc3lzdGVtLCBhcyB0aGVyZQ0KLWlzIG5vIG90aGVyIHdheSB0byBsaXN0IG91dCBoYW5kbGVycyBpbiB0aGUgZ2xvYmFsIGNoYWlucy4gSWYgeW91DQotZW5nYWdlIGEgbmV3IG1vZHVsZSwgdGhlIG5ldyBoYW5kbGVycyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBnbG9iYWwNCi1jaGFpbnMgYW5kIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRoaXMgcGFnZS48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvZ2xvYmFsY2hhaW4uanBnIiAvPjwvcD4NCi08YnIgLz4NCi08YSBuYW1lPSJvcGVyYXRpb25jaGFpbnMiIGlkPSJvcGVyYXRpb25jaGFpbnMiPjwvYT4NCi08aDM+T3BlcmF0aW9uIFNwZWNpZmljIENoYWluczwvaDM+DQotPHA+VGhlICdPcGVyYXRpb24gU3BlY2lmaWMgQ2hhaW5zJyBsaW5rIGNhbiBiZSB1c2VkIHRvIHZpZXcgdGhlDQotaGFuZGxlcnMgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHNlcnZpY2UgaW4gdGhlIHNhbWUgb3JkZXIgYXMgaXQNCi1pcyBpbiB0aGUgcmVhbCBleGVjdXRpb24gY2hhaW4uPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0NCi0iaW1hZ2VzL3NlbGVjdF9zZXJ2aWNlX2Zvcl9oYW5kbGVyLmpwZyIgLz48L3A+DQotPGJyIC8+DQotPHA+U2VsZWN0IHRoZSBzZXJ2aWNlIG9mIHdob3NlIHNlcnZpY2UgaGFuZGxlcnMgeW91IHdpc2ggdG8gdmlldw0KLWZyb20gdGhlIGxpc3QsIGFuZCBjbGljayAnVmlldycgdG8gdmlldyB0aGUgaGFuZGxlcnMuIFRoZSBwYWdlDQotYmVsb3cgc2hvd3MgdGhlIHNlcnZpY2UgaGFuZGxlcnMgb2YgdGhlIHNlcnZpY2UNCi08ZW0+dmVyc2lvbjwvZW0+PC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYWx0PSIiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VIYW5kbGVycy5qcGciIC8+PC9wPg0KLTxiciAvPg0KLTxhIG5hbWU9ImVuZ2FnaW5tb2R1bGUiIGlkPSJlbmdhZ2lubW9kdWxlIj48L2E+DQotPGgzPkVuZ2FnaW5nIE1vZHVsZXM8L2gzPg0KLTxwPlRoZSAnRW5nYWdpbmcgTW9kdWxlcycgbGluayBhbGxvd3MgeW91IHRvIGVuZ2FnZSBtb2R1bGVzIGVpdGhlcg0KLWdsb2JhbGx5ICh0byBhbGwgc2VydmljZXMpLCB0byBhIHNlcnZpY2UgZ3JvdXAsIHRvIGEgc2VydmljZSwgb3IgdG8NCi1hbiBvcGVyYXRpb24gZGVwZW5kaW5nIG9uIHRoZSBtb2R1bGUgaW1wbGVtZW50YXRpb24uIElmIHRoZSBtb2R1bGUNCi13YXMgZGVzaWduZWQgdG8gZW5nYWdlIHRoZSBoYW5kbGVycyBnbG9iYWxseSwgdGhlbiB0aGUgaGFuZGxlcnMgaW4NCi10aGUgbW9kdWxlIGNhbiBiZSBpbmNsdWRlZCBpbiBhbnkgcGhhc2UgaW4gdGhlIHN5c3RlbS4gSXQgY2FuIGJlDQotZWl0aGVyIGEgc3lzdGVtIHByZWRlZmluZWQgcGhhc2Ugb3IgYSB1c2VyIGRlZmluZWQgcGhhc2UuPC9wPg0KLTxwPk9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgbW9kdWxlIHdhcyBpbXBsZW1lbnRlZCBpbiBzdWNoIGEgd2F5DQotdGhhdCBpdCBpcyBnb2luZyB0byBiZSBkZXBsb3llZCB0byBhIHNlcnZpY2Ugb3IgdG8gYW4gb3BlcmF0aW9uLA0KLXRoZW4gdGhlIG1vZHVsZSBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSA8YSBocmVmPQ0KLSIjcGhhc2VzIj5TeXN0ZW0gUHJlZGVmaW5lZCBQaGFzZXM8L2E+LiBUaHVzIGl0IGNhbiBvbmx5IGJlDQotaW5jbHVkZWQgaW4gPGEgaHJlZj0iI3BoYXNlcyI+VXNlciBEZWZpbmVkIFBoYXNlczwvYT4uPC9wPg0KLTxwPkltbWVkaWF0ZWx5IGFmdGVyIGVuZ2FnaW5nIHRoZSBtb2R1bGUsIHlvdSBjYW4gc2VlIHRoZSBzdGF0dXMgb2YNCi10aGUgZW5nYWdlbWVudCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgaXMgZW5nYWdlZCBwcm9wZXJseSBvcg0KLW5vdC48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvbW9kdWxlZW5nYWdlLmpwZyIgLz48L3A+DQotPGEgbmFtZT0idHVybm9mZnNlcnZpY2UiIGlkPSJ0dXJub2Zmc2VydmljZSI+PC9hPg0KLTxoMz5EZWFjdGl2YXRlIFNlcnZpY2U8L2gzPg0KLTxwPlRoZSAnRGVhY3RpdmF0ZSBTZXJ2aWNlJyBsaW5rIHVuZGVyIHRoZSAnU2VydmljZXMnIGxpc3Qgd2lsbA0KLWxlYWQgdG8gdGhlIHBhZ2UgYmVsb3cuIFRoZSBEZWFjdGl2YXRlIHNlcnZpY2UgZnVuY3Rpb25hbGl0eQ0KLXByb3ZpZGVzIGEgd2F5IHRvIHJlbW92ZSB1bm5lY2Vzc2FyeSBzZXJ2aWNlcyBmcm9tIHRoZSBydW5uaW5nDQotc3lzdGVtLCBidXQgdGhlIHJlbW92YWwgaXMgdHJhbnNpZW50LS13aGljaCBtZWFucyB0aGF0IGlmIHlvdQ0KLXJlc3RhcnQgdGhlIHN5c3RlbSwgdGhlIHNlcnZpY2Ugd2lsbCBiZSBhY3RpdmUuPC9wPg0KLTxwPlRvIGRlYWN0aXZhdGUgYSBzZXJ2aWNlLCBzZWxlY3QgYSBzZXJ2aWNlIGZyb20gdGhlIGxpc3QsIHNlbGVjdA0KLXRoZSAnRGVhY3RpdmF0ZSBzZXJ2aWNlJyBjaGVjayBib3gsIGFuZCB0aGVuIGNsaWNrICdEZWFjdGl2YXRlJy4uDQotVGhlICdDbGVhcicgYnV0dG9uIHdpbGwgY2xlYXIgdGhlICdEZWFjdGl2YXRlIHNlcnZpY2UnIGNoZWNrDQotYm94LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9ImltYWdlcy9pbmFjdGl2YXRlLmpwZyIgLz48L3A+DQotPGJyIC8+DQotPGEgbmFtZT0idHVybm9uc2VydmljZSIgaWQ9InR1cm5vbnNlcnZpY2UiPjwvYT4NCi08aDM+QWN0aXZhdGUgU2VydmljZTwvaDM+DQotPHA+VGhlICdBY3RpdmF0ZSBTZXJ2aWNlJyBsaW5rIHVuZGVyIHRoZSAnU2VydmljZXMnIGxpc3Qgd2lsbCBsZWFkDQotdG8gdGhlIHBhZ2UgYmVsb3cuIFRoZSBBY3RpdmF0ZSBzZXJ2aWNlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZXMgYQ0KLXdheSB0byBhY3RpdmF0ZSBzZXJ2aWNlcyB3aGlsZSB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcsIGJ1dCB0aGUNCi1hY3RpdmF0aW9uIGlzIHRyYW5zaWVudC0tIHdoaWNoIG1lYW5zIHRoYXQgaWYgeW91IHJlc3RhcnQgdGhlDQotc3lzdGVtLCB0aGUgc2VydmljZSB3aWxsIGJlIGluYWN0aXZlLjwvcD4NCi08cD5UbyBhY3RpdmF0ZSBhIHNlcnZpY2UsIHNlbGVjdCBhIHNlcnZpY2UgZnJvbSB0aGUgbGlzdCwgc2VsZWN0DQotdGhlICdBY3RpdmF0ZSBTZXJ2aWNlJyBjaGVjayBib3gsIHRoZW4gY2xpY2sgJ0FjdGl2YXRlJy4gVGhlDQotJ0NsZWFyJyBidXR0b24gd2lsbCBjbGVhciB0aGUgJ0FjdGl2YXRlIHNlcnZpY2UnIGNoZWNrIGJveC48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBhbHQ9IiIgc3JjPSJpbWFnZXMvYWN0aXZhdGUuanBnIiAvPjwvcD4NCi08YnIgLz4NCi08YSBuYW1lPSJlZGl0c2VydmljZXBhcmEiIGlkPSJlZGl0c2VydmljZXBhcmEiPjwvYT4NCi08aDM+RWRpdCBTZXJ2aWNlIFBhcmFtZXRlcnM8L2gzPg0KLTxwPlRoaXMgZnVuY3Rpb25hbGl0eSBwcm92aWRlcyBhIHdheSB0byBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgaW4gYQ0KLXNlcnZpY2Ugb3IgaXRzIG9wZXJhdGlvbnMuIFRoZXNlIGNoYW5nZXMgd2lsbCBiZSB0cmFuc2llbnQgdG9vLA0KLXdoaWNoIG1lYW5zIGlmIHlvdSByZXN0YXJ0IHRoZSBzeXN0ZW0sIHRoZSBjaGFuZ2VzIHdpbGwgbm90IGJlDQotcmVmbGVjdGVkLjwvcD4NCi08cD5UaGUgJ0VkaXQgUGFyYW1ldGVycycgbGluayB1bmRlciB0aGUgJ1NlcnZpY2VzJyBsaXN0IChvbiB0aGUNCi1uYXZpZ2F0aW9uIGJhcikgd2lsbCBsaW5rIHRvIHRoZSBwYWdlIHdoZXJlIHlvdSBjYW4gc2VsZWN0IHRoZQ0KLXNlcnZpY2VzIG9mIHdoaWNoIHlvdSB3YW50IHRvIGVkaXQgdGhlIHBhcmFtZXRlcnMuIE9uY2UgdGhlIHNlcnZpY2UNCi1pcyBzZWxlY3RlZCwgY2xpY2sgJ0VkaXQgUGFyYW1ldGVycycuLiBUaGlzIHdpbGwgb3BlbiB0aGUgcGFnZQ0KLXNob3duIGJlbG93LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGFsdD0iIiBzcmM9DQotImltYWdlcy9lZGl0c2VydmllY3BhcmEuanBnIiAvPjwvcD4NCi08YnIgLz4NCi08YSBuYW1lPSJ2aWV3aGllcmFyY2h5IiBpZD0idmlld2hpZXJhcmNoeSI+PC9hPg0KLTxoMz5WaWV3IEhpZXJhcmNoeTwvaDM+DQotPHA+QnkgbGlzdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGhpZXJhcmNoeSwgdGhlICdWaWV3IEhpZXJhcmNoeScNCi1saW5rIHByb3ZpZGVzIGEgbWVhbnMgdG8gbG9vayBhdCB0aGUgc3lzdGVtIHN0YXRlIGF0IHJ1biB0aW1lLiBUaGlzDQotd2lsbCBsaXN0IG91dCBhbGwgdGhlIGF2YWlsYWJsZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHRzLCBzZXJ2aWNlDQotY29udGV4dHMsIG9wZXJhdGlvbiBjb250ZXh0cywgZXRjLjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvQGF4aXMyX3ZlcnNpb25fZGlyQC94bWxiYXNlZC1zZXJ2ZXIueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3htbGJhc2VkLXNlcnZlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjkwM2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9AYXhpczJfdmVyc2lvbl9kaXJAL3htbGJhc2VkLXNlcnZlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+V3JpdGluZyBXZWIgU2VydmljZXMgVXNpbmcgQXhpczIncyBQcmltYXJ5IEFQSXM8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxhIG5hbWU9IldyaXRpbmdfV2ViX1NlcnZpY2VzX1VzaW5nIEF4aXMyJ3NfUHJpbWFyeV9BUElzIj48L2E+DQotPGgxPldyaXRpbmcgV2ViIFNlcnZpY2VzIFVzaW5nIEFwYWNoZSBBeGlzMidzIFByaW1hcnkgQVBJczwvaDE+DQotPHA+QXBhY2hlIEF4aXMyIGRpc3BhdGNoZXMgYSBjb21wb25lbnQgY2FsbGVkDQotPHN0cm9uZz5NZXNzYWdlUmVjZWl2ZXI8L3N0cm9uZz4gd2hlbiBSZWNlaXZpbmcgYSBNZXNzYWdlIHRvIHRoZQ0KLXNlcnZlci4gQXBhY2hlIEF4aXMyIHByb3ZpZGVzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcw0KLWNsYXNzIGFuZCBpdCBjYW4gYmUgY29uZmlndXJlZCBieSBhZGRpbmcgYSBtZXNzYWdlUmVjZWl2ZXIgdGFnIHRvDQotc2VydmljZXMueG1sLiBBcGFjaGUgQXhpczIgcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gZm9yIGEgY2xhc3MNCi1vZiBNZXNzYWdlIHJlY2VpdmVycyBjYWxsZWQgUmF3WG1sIE1lc3NhZ2UgcmVjZWl2ZXJzLiBUaGV5IHdvcmsgYXQNCi10aGUgWE1MIGxldmVsIGFuZCBjYW4gb25seSBoYW5kbGUgT01FbGVtZW50cyBhcyBwYXJhbWV0ZXJzLiBUaGlzDQotc2VjdGlvbiBleHBsYWlucyBob3cgdG8gd3JpdGUgYSBzZXJ2aWNlIHVzaW5nIHRoZW0uPC9wPg0KLTxwPkluIG91ciBleGFtcGxlLCB0aGUgV2ViIHNlcnZpY2Ugd2lsbCBoYXZlIHR3byBvcGVyYXRpb25zLjwvcD4NCi08cHJlPg0KLXB1YmxpYyB2b2lkIHBpbmcoT01FbGVtZW50IGVsZW1lbnQpe30gLy9JTi1PTkxZIG9wZXJhdGlvbiwganVzdCBhY2NlcHRzIHRoZSBPTUVsZW1lbnQgYW5kIGRvZXMgc29tZSBwcm9jZXNzaW5nLg0KLXB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCl7fS8vSU4tT1VUIG9wZXJhdGlvbiwgYWNjZXB0cyBhbiBPTUVsZW1lbnQgYW5kICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kcyBiYWNrIHRoZSBzYW1lIGFnYWluIA0KLTwvcHJlPg0KLTxhIG5hbWU9Ikhvd190b193cml0ZV90aGVfV2ViX1NlcnZpY2VfIiBpZD0NCi0iSG93X3RvX3dyaXRlX3RoZV9XZWJfU2VydmljZV8iPjwvYT4NCi08aDQ+SG93IHRvIFdyaXRlIGEgV2ViIFNlcnZpY2U/PC9oND4NCi1Xcml0aW5nIGEgbmV3IFdlYiBzZXJ2aWNlIHdpdGggQXBhY2hlIEF4aXMyIGludm9sdmVzIGZvdXIgc3RlcHM6DQotPG9sPg0KLTxsaT5Xcml0ZSB0aGUgSW1wbGVtZW50YXRpb24gQ2xhc3MuPC9saT4NCi08bGk+V3JpdGUgYSBzZXJ2aWNlcy54bWwgZmlsZSB0byBleHBsYWluIHRoZSBXZWIgc2VydmljZS48L2xpPg0KLTxsaT5DcmVhdGUgYSAqLmFhciBhcmNoaXZlIChBeGlzIEFyY2hpdmUpIGZvciB0aGUgV2ViIHNlcnZpY2UuPC9saT4NCi08bGk+RGVwbG95IHRoZSBXZWIgc2VydmljZS48L2xpPg0KLTwvb2w+DQotPGEgbmFtZT0iU3RlcDFfOldyaXRlX3RoZV9JbXBsZW1lbnRhdGlvbl9DbGFzcyIgaWQ9DQotIlN0ZXAxXzpXcml0ZV90aGVfSW1wbGVtZW50YXRpb25fQ2xhc3MiPjwvYT4NCi08aDQ+U3RlcDE6IFdyaXRlIHRoZSBJbXBsZW1lbnRhdGlvbiBDbGFzczwvaDQ+DQotPHA+QW4gaW1wbGVtZW50YXRpb24gY2xhc3MgaGFzIHRoZSBidXNpbmVzcyBsb2dpYyBmb3IgdGhlIFdlYg0KLXNlcnZpY2UgYW5kIGltcGxlbWVudHMgdGhlIG9wZXJhdGlvbnMgcHJvdmlkZWQgYnkgdGhlIFdlYiBzZXJ2aWNlLg0KLVVubGVzcyB5b3UgaGF2ZSBkYXRhIGJpbmRpbmcsIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZHMgY2FuIGhhdmUNCi1vbmx5IG9uZSBwYXJhbWV0ZXIgb2YgdGhlIHR5cGUgT01FbGVtZW50LiA8aT5PTSBzdGFuZHMgZm9yIE9iamVjdA0KLU1vZGVsIChhbHNvIGtub3duIGFzIEFYSU9NIC0gQVhpcyBPYmplY3QgTW9kZWwpIGFuZCByZWZlcnMgdG8gdGhlDQotWE1MIGluZm9zZXQgbW9kZWwgdGhhdCBpcyBpbml0aWFsbHkgZGV2ZWxvcGVkIGZvciBBcGFjaGUgQXhpczIuIERPTQ0KLWFuZCBKRE9NIGFyZSB0d28gc3VjaCBYTUwgbW9kZWxzIGNvbmNlcHR1YWxseSBzaW1pbGFyIHRvIE9NIGFzIGFuDQotWE1MIG1vZGVsIGJ5IGl0cyBleHRlcm5hbCBiZWhhdmlvciwgYnV0IGNvbnNpZGVyaW5nIHRoZSBkZWVwIGRvd24NCi1pbXBsZW1lbnRhdGlvbiBPTSBpcyB2ZXJ5IG11Y2ggZGlmZmVyZW50IHRvIG90aGVycy4gT01FbGVtZW50IGlzDQotdGhlIGJhc2ljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBYTUwgaW5mb3NldCBlbGVtZW50IGluIE9NLkZvciBtb3JlDQotZGV0YWlscyBvbiBPTUVsZW1lbnQgc2VlIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL2F4aW9tL09NVHV0b3JpYWwuaHRtbCI+T00NCi1UdXRvcmlhbDwvYT4uPC9pPjwvcD4NCi08cHJlPg0KLXB1YmxpYyBjbGFzcyBNeVNlcnZpY2V7DQotICAgIHB1YmxpYyB2b2lkIHBpbmcoT01FbGVtZW50IGVsZW1lbnQpew0KLSAgICAgICAgLy8gQnVzaW5lc3MgTG9naWMgICAgIA0KLSAgICAgICAgLi4uLi4uDQotICAgIH0NCi0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvKE9NRWxlbWVudCBlbGVtZW50KXsNCi0gICAgIC4uLi4uLg0KLSAgICB9DQotfQ0KLTwvcHJlPg0KLTxhIG5hbWU9IlN0ZXAyXzpXcml0ZV90aGVfc2VydmljZXNfeG1sX2ZpbGUiIGlkPQ0KLSJTdGVwMl86V3JpdGVfdGhlX3NlcnZpY2VzX3htbF9maWxlIj48L2E+DQotPGg0PlN0ZXAyOiBXcml0ZSB0aGUgc2VydmljZXMueG1sIGZpbGU8L2g0Pg0KLTxwPiJzZXJ2aWNlcy54bWwiIGhhcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBXZWIgc2VydmljZS4gRWFjaCBXZWINCi1zZXJ2aWNlLCBkZXBsb3llZCBpbiBBcGFjaGUgQXhpczIgLCBtdXN0IGhhdmUgaXRzIGNvbmZpZ3VyYXRpb24gaW4NCi0ic2VydmljZXMueG1sIi4gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIE15U2VydmljZSBpcyBhcyBmb2xsb3dzOjwvcD4NCi08cHJlPg0KLSZsdDtzZXJ2aWNlICZndDsNCi0gICAgJmx0O2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAgICAgVGhpcyBpcyBhIHNhbXBsZSBXZWIgc2VydmljZSB3aXRoIHR3byBvcGVyYXRpb25zLCBlY2hvIGFuZCBwaW5nLg0KLSAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0Ow0KLSAgICAmbHQ7cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyImZ3Q7dXNlcmd1aWRlLmV4YW1wbGUxLk15U2VydmljZSZsdDsvcGFyYW1ldGVyJmd0Ow0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImVjaG8iJmd0Ow0KLSAgICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgICAgICZsdDthY3Rpb25NYXBwaW5nJmd0O3VybjplY2hvJmx0Oy9hY3Rpb25NYXBwaW5nJmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gICAgICZsdDtvcGVyYXRpb24gbmFtZT0icGluZyImZ3Q7DQotICAgICAgICAmbHQ7bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLyZndDsNCi0gICAgICAgICZsdDthY3Rpb25NYXBwaW5nJmd0O3VybjpwaW5nJmx0Oy9hY3Rpb25NYXBwaW5nJmd0Ow0KLSAgICAmbHQ7L29wZXJhdGlvbiZndDsNCi0gJmx0Oy9zZXJ2aWNlJmd0Ow0KLTwvcHJlPg0KLTxwPlRoZSBhYm92ZSBYTUwgdGFncyBjYW4gYmUgZXhwbGFpbmVkIGFzIGZvbGxvd3M6PC9wPg0KLTxwPjEuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VydmljZSBjbGFzcyBpcyBwcm92aWRlZCBpbiB0aGUNCi1kZXNjcmlwdGlvbiB0YWcuPC9wPg0KLTxwcmU+DQotJmx0O3NlcnZpY2UgJmd0Ow0KLSAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7DQotICAgICAgICBUaGlzIGlzIGEgc2FtcGxlIFdlYiBzZXJ2aWNlIHdpdGggdHdvIG9wZXJhdGlvbnMsIGVjaG8gYW5kIHBpbmcuDQotICAgICZsdDsvZGVzY3JpcHRpb24mZ3Q7DQotPC9wcmU+DQotPHA+Mi4gVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY2xhc3MgaXMgcHJvdmlkZWQgYXMgYSBwYXJhbWV0ZXIuPC9wPg0KLTxwcmU+DQotJmx0O3BhcmFtZXRlciBuYW1lPSJzZXJ2aWNlQ2xhc3MiJmd0O3VzZXJndWlkZS5leGFtcGxlMS5NeVNlcnZpY2UmbHQ7L3BhcmFtZXRlciZndDsNCi08L3ByZT4NCi08cD4zLiBUaGUgIm9wZXJhdGlvbiIgWE1MIHRhZyBkZXNjcmliZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCBhcmUNCi1hdmFpbGFibGUgaW4gdGhpcyBzZXJ2aWNlIHdpdGggcmVzcGVjdGl2ZSBtZXNzYWdlIHJlY2VpdmVycy48L3A+DQotPHByZT4NCi0gICAmbHQ7b3BlcmF0aW9uIG5hbWU9ImVjaG8iJmd0Ow0KLSAgICAgICAgICAgICZsdDttZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICAgICAgICAgJmx0O2FjdGlvbk1hcHBpbmcmZ3Q7dXJuOmVjaG8mbHQ7L2FjdGlvbk1hcHBpbmcmZ3Q7DQotICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotICAgJmx0O29wZXJhdGlvbiBuYW1lPSJwaW5nIiZndDsNCi0gICAgICAgJmx0O21lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8mZ3Q7DQotICAgICAgICZsdDthY3Rpb25NYXBwaW5nJmd0O3VybjpwaW5nJmx0Oy9hY3Rpb25NYXBwaW5nJmd0Ow0KLSAgICZsdDsvb3BlcmF0aW9uJmd0Ow0KLTwvcHJlPg0KLTxwPjQuIEV2ZXJ5IG9wZXJhdGlvbiBtdXN0IG1hcCB0byBhIGNvcnJlc3BvbmRpbmcgTWVzc2FnZVJlY2VpdmVyDQotY2xhc3MuIEFmdGVyIGEgbWVzc2FnZSBpcyBwcm9jZXNzZWQgYnkgdGhlIGhhbmRsZXJzLCB0aGUgQXhpczINCi1lbmdpbmUgaGFuZHMgaXQgb3ZlciB0byBhIE1lc3NhZ2VSZWNlaXZlci48L3A+DQotPHA+NS4gRm9yIHRoZSAiZWNobyIgb3BlcmF0aW9uLCB3ZSBoYXZlIHVzZWQgYQ0KLTxzdHJvbmc+UmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI8L3N0cm9uZz4gc2luY2UgaXQgaXMgYW4gSU4tT1VUDQotb3BlcmF0aW9uLiBGb3IgdGhlIElOLU9OTFkgb3BlcmF0aW9uICJwaW5nIiwgd2UgaGF2ZSB1c2VkDQotPHN0cm9uZz5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI8L3N0cm9uZz4gYXMgdGhlIG1lc3NhZ2UNCi1yZWNlaXZlci48L3A+DQotPHA+Ni4gVGhlIGFjdGlvbk1hcHBpbmcgaXMgcmVxdWlyZWQgb25seSBpZiB5b3Ugd2FudCB0byBlbmFibGUNCi1XUy1BZGRyZXNzaW5nLiBUaGlzIHdpbGwgYmUgdXNlZCBsYXRlciBpbiB0aGlzIHVzZXIgZ3VpZGUuPC9wPg0KLTxwPjcuIFlvdSBjYW4gd3JpdGUgYSBzZXJ2aWNlcy54bWwgZmlsZSB0byBpbmNsdWRlIGEgZ3JvdXAgb2YNCi1zZXJ2aWNlcyBpbnN0ZWFkIG9mIGEgc2luZ2xlIHNlcnZpY2UuIFRoaXMgbWFrZXMgdGhlIG1hbmFnZW1lbnQgYW5kDQotZGVwbG95bWVudCBvZiBhIHNldCBvZiByZWxhdGVkIHNlcnZpY2VzIHZlcnkgZWFzeS4gQXQgcnVudGltZSwgeW91DQotY2FuIHNoYXJlIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlc2Ugc2VydmljZXMgd2l0aGluIGEgc2luZ2xlDQotaW50ZXJhY3Rpb24gdXNpbmcgdGhlIFNlcnZpY2VHcm91cENvbnRleHQuIElmIHlvdSBob3BlIHRvIHVzZSB0aGlzDQotZnVuY3Rpb25hbGl0eSwgdGhlIHNlcnZpY2VzLnhtbCBmaWxlIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcNCi1mb3JtYXQuPC9wPg0KLTxwcmU+DQotJmx0O1NlcnZpY2VHcm91cCZndDsNCi0gICZsdDtzZXJ2aWNlIG5hbWU9IlNlcnZpY2UxIiZndDsNCi0gICAgJmx0OyEtLSBkZXRhaWxzIGZvciBTZXJ2aWNlMSAtLSZndDsNCi0gICZsdDsvc2VydmljZSZndDsNCi0gICZsdDtzZXJ2aWNlIG5hbWU9IlNlcnZpY2UyIiZndDsNCi0gICAgJmx0OyEtLSBkZXRhaWxzIGZvciBTZXJ2aWNlMiAtLSZndDsNCi0gICZsdDsvc2VydmljZSZndDsNCi0gICZsdDttb2R1bGUgcmVmPSJNb2R1bGVOYW1lIiAvJmd0Ow0KLSAgJmx0O3BhcmFtZXRlciBuYW1lPSJzZXJ2aWNlR3JvdXBQYXJhbTEiJmd0O3ZhbHVlIDEmbHQ7L3BhcmFtZXRlciZndDsNCi0mbHQ7L3NlcnZpY2VHcm91cCZndDsNCi08L3ByZT4NCi08cD5Ob3RlIDogVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaXMgYSBjb21wdWxzb3J5IGF0dHJpYnV0ZS48L3A+DQotPGEgbmFtZT0iU3RlcDNfOkNyZWF0ZV90aGVfV2ViX1NlcnZpY2VfQXJjaGl2ZSIgaWQ9DQotIlN0ZXAzXzpDcmVhdGVfdGhlX1dlYl9TZXJ2aWNlX0FyY2hpdmUiPjwvYT4NCi08aDQ+U3RlcDM6IENyZWF0ZSB0aGUgV2ViIFNlcnZpY2UgQXJjaGl2ZTwvaDQ+DQotPHA+QXBhY2hlIEF4aXMyIHVzZXMgdGhlICIuYWFyIiAoQXhpcyBBcmNoaXZlKSBmaWxlIGFzIHRoZQ0KLWRlcGxveW1lbnQgcGFja2FnZSBmb3IgV2ViIHNlcnZpY2VzLiBUaGVyZWZvcmUsIGZvciBNeVNlcnZpY2Ugd2UNCi13aWxsIHVzZSAiTXlTZXJ2aWNlLmFhciIgd2l0aCB0aGUgInNlcnZpY2VzLnhtbCIgcGFja2FnZWQgaW4gdGhlDQotTUVUQS1JTkYgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgc2hvd24gYmVsb3cuIFBsZWFzZSBub3RlIHRoYXQNCi10aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSBmaWxlIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUNCi1zZXJ2aWNlIG9ubHkgaWYgdGhlIHNlcnZpY2VzLnhtbCBjb250YWlucyBvbmx5IG9uZSBzZXJ2aWNlDQotZWxlbWVudC48L3A+DQotPHA+PGltZyBzcmM9ImltYWdlcy91c2VyZ3VpZGUvU2VydmljZUl0ZW1zLmpwZyIgbmFtZT0iR3JhcGhpYzEiDQotYWxpZ249ImJvdHRvbSIgd2lkdGg9IjE3NiIgaGVpZ2h0PSI5MSIgYm9yZGVyPSIwIiBpZD0NCi0iR3JhcGhpYzEiIC8+PC9wPg0KLTxwPlRvIGNyZWF0ZSB0aGUgYXJjaGl2ZSBmaWxlLCB5b3UgY2FuIGNyZWF0ZSBhIC5qYXIgZmlsZQ0KLWNvbnRhaW5pbmcgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgYW5kIHRoZW4gcmVuYW1lIGl0IHRvIGEgLmFhcg0KLWZpbGUuIFRoaXMgYXJjaGl2ZSBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUNCi0iQXhpczJfSE9NRS9zYW1wbGVzL3VzZXJndWlkZSIgZGlyZWN0b3J5LiBUaGlzIGZpbGUgaGFzIHRvIGJlDQotZGVwbG95ZWQgbm93LjwvcD4NCi08YSBuYW1lPSJTdGVwNF86RGVwbG95X3RoZV9XZWJfU2VydmljZSIgaWQ9DQotIlN0ZXA0XzpEZXBsb3lfdGhlX1dlYl9TZXJ2aWNlIj48L2E+DQotPGg0PlN0ZXA0OiBEZXBsb3kgdGhlIFdlYiBTZXJ2aWNlPC9oND4NCi08cD5UaGUgc2VydmljZSBjYW4gYmUgZGVwbG95ZWQgYnkgZHJvcHBpbmcgdGhlICIuYWFyIiBmaWxlIGludG8gdGhlDQotInNlcnZpY2VzIiBkaXJlY3RvcnkgaW4gIi93ZWJhcHBzL2F4aXMyL1dFQi1JTkYiIG9mIHlvdXIgc2VydmxldA0KLWNvbnRhaW5lci4gU3RhcnQgdGhlIHNlcnZsZXQgY29udGFpbmVyIChpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQ0KLXN0YXJ0ZWQpLCBjbGljayB0aGUgbGluayAiU2VydmljZXMiIG9uIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvIiB0YXJnZXQ9Il9ibGFuayI+SG9tZSBQYWdlIG9mIEF4aXMyDQotV2ViIEFwcGxpY2F0aW9uPC9hPiAoaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyKSBhbmQgc2VlIHdoZXRoZXINCi1NeVNlcnZpY2UgaXMgZGVwbG95ZWQgcHJvcGVybHkuIElmIHlvdSBjYW4gc2VlIHRoZSBmb2xsb3dpbmcNCi1vdXRwdXQsIHRoZW4geW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGRlcGxveWVkIE15U2VydmljZSBvbiBBcGFjaGUNCi1BeGlzMi4gQ29uZ3JhdHVsYXRpb25zICEhPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSJpbWFnZXMvdXNlcmd1aWRlL015U2VydmljZURlcGxveWVkLmpwZyINCi1uYW1lPSJHcmFwaGljMiIgYWxpZ249ImJvdHRvbSIgYm9yZGVyPSIwIiBpZD0iR3JhcGhpYzIiIC8+PC9wPg0KLTxwPk5vdGU6IEFwYWNoZSBBeGlzMiBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBkZXBsb3kgV2ViIHNlcnZpY2VzDQotdXNpbmcgdGhlICJVcGxvYWQgU2VydmljZSIgdG9vbCBvbiB0aGUgQXhpczIgV2ViIEFwcGxpY2F0aW9uJ3MNCi1BZG1pbmlzdHJhdGlvbiBtb2R1bGUuIFBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0NCi0id2ViYWRtaW5ndWlkZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+V2ViIEFkbWluaXN0cmF0aW9uIEd1aWRlPC9hPg0KLWZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvYXJjaGl2ZWRfbmV3cy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2FyY2hpdmVkX25ld3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2YzOGFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvYXJjaGl2ZWRfbmV3cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPkFwYWNoZSBBeGlzMiBBcmNoaXZlZCBOZXdzPC90aXRsZT4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotImFtYXlhIDkuMi4xLCBzZWUgaHR0cDovL3d3dy53My5vcmcvQW1heWEvIiAvPg0KLTxsaW5rIGhyZWY9ImNzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPg0KLTxoMT5BcGFjaGUgQXhpczIgQXJjaGl2ZWQgTmV3czwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBjb250YWlucyBkZXRhaWxzIG9mIGVhY2ggQXhpczIgdmVyc2lvbiB0aGF0IHdhcw0KLXJlbGVhc2VkLCB1cCB0byB0aGUgY3VycmVudCB2ZXJzaW9uLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPGgzPkFwYWNoZSBBeGlzMiBSZWxlYXNlczo8L2gzPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iIzEuMyI+MTNyZCBBdWd1c3QgMjAwNyAgLSBWZXJzaW9uIDEuMzwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjMS4yIj4yN3RoIEFwcmlsIDIwMDcgLSBWZXJzaW9uIDEuMjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjMV8xXzEiPjA5dGggSmFudWFyeSAyMDA3LSBWZXJzaW9uIDEuMS4xPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMxXzEiPjEzdGggTm92ZW1iZXIgMjAwNi0gVmVyc2lvbiAxLjE8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzFfMCI+MDQgTWF5IDIwMDYtIFZlcnNpb24gMS4wPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMwXzk1Ij4yMyBNYXJjaCAyMDA2LSBWZXJzaW9uIDAuOTU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzBfOTQiPjExIEphbnVhcnkgMjAwNi0gVmVyc2lvbiAwLjk0PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMwXzkzIj4wMiBEZWNlbWJlciAyMDA1IC0gVmVyc2lvbiAwLjkzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiMwXzkyIj4yNiBTZXB0ZW1iZXIgMjAwNSAtIFZlcnNpb24gMC45MjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjMF85MSI+MTIgQXVndXN0IDIwMDUgLSBWZXJzaW9uIDAuOTE8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iIzBfOTAiPjAyIEp1bHkgMjAwNSAtIFZlcnNpb24gMC45PC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNNMiI+MDcgSnVuZSAyMDA1IC0gTWlsZXN0b25lIDI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI00xIj4yNCBGZWJydWFyeSAyMDA1IC0gTWlsZXN0b25lIDE8L2E+PC9saT4NCi08L3VsPg0KLQ0KLQ0KLTxhIGlkPSIxLjIiIG5hbWU9IjEuMiI+PC9hPg0KLTxoMj4xM3JkIEF1Z3VzdCAyMDA3IC0gQXBhY2hlIEF4aXMyL0phdmEgVmVyc2lvbiAxLjMgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvMV8zL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0xLjM8L2E+XTwvcD4NCi08cD5BcGFjaGUgQXhpczIgVmVyc2lvbiAxLjMgY29tZXMgd2l0aCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgYW5kDQotYSBudW1iZXIgYnVnIGZpeGVzIG92ZXIgdGhlIDEuMiByZWxlYXNlLiBDaGVjayBvdXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YNCi1mZWF0dXJlcyBiZWxvdy48L3A+DQotPGgzPlByb2dyYW1taW5nIE1vZGVsPC9oMz4NCi08dWw+DQotPGxpPkltcHJvdmVkLCBYTUwtY2VudHJpYyBjbGllbnQgQVBJIGluY2x1ZGluZyBmdWxsIFdTREwgYW5kIHBvbGljeQ0KLXN1cHBvcnQ8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBQT0pPIGFuZCBTcHJpbmcgc2VydmljZXMgYW5kIGNsaWVudHM8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBhbnkgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuPC9saT4NCi08bGk+U3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBjYWxsczwvbGk+DQotPGxpPkFyY2hpdmVkIHNlcnZpY2UgZGVwbG95bWVudCBtb2RlbCBzdXBwb3J0aW5nIGZ1bGwgc2VydmljZQ0KLWVuY2Fwc3VsYXRpb24gd2l0aCB2ZXJzaW9uaW5nIHN1cHBvcnQ8L2xpPg0KLTxsaT5BcmNoaXZlZCBtb2R1bGUgZGVwbG95bWVudCBtb2RlbCBzdXBwb3J0aW5nIGNvbnRyb2xsZWQNCi1leHRlbnNpYmlsaXR5IHdpdGggdmVyc2lvbmluZyBzdXBwb3J0PC9saT4NCi08bGk+PGEgaHJlZj0iI0hvdF9EZXBsb3ltZW50Ij5Ib3QgZGVwbG95bWVudDwvYT48L2xpPg0KLTxsaT5XUy1Qb2xpY3kgZHJpdmVuIGNvZGUgZ2VuZXJhdGlvbiBleHRlbnNpb25zPC9saT4NCi08bGk+RmxleGlibGUgc2VydmljZSBsaWZlIGN5Y2xlIG1vZGVsPC9saT4NCi08bGk+QXV0b21hdGljIHN1cHBvcnQgZm9yIFBPWCAoUkVTVCkgc3R5bGUgaW52b2NhdGlvbiBvZg0KLXNlcnZpY2VzPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgcXVlcnlpbmcgYSBzZXJ2aWNlJ3MgV1NETCAodXNpbmcgP3dzZGwpLCBzY2hlbWENCi0odXNpbmcgP3hzZCkgYW5kIHBvbGljaWVzICh1c2luZyA/cG9saWN5KTwvbGk+DQotPGxpPldTREwgMi4wPC9saT4NCi08bGk+UE9KTyBhbm5vdGF0aW9uICg8YSBocmVmPQ0KLSJodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTE4MSI+SlNSIDE4MTwvYT4pPC9saT4NCi08bGk+SkFYLVdTIGludHJlZ3JhdGlvbjwvbGk+DQotPGxpPkN1c3RvbSBEZXBsb3llcnM8L2xpPg0KLTxsaT5CaW5hcnkgc2VyaWFsaXphdGlvbiAoRmFzdCBJbmZvc2V0KTwvbGk+DQotPGxpPkpTT04gc3VwcG9ydDwvbGk+DQotPGxpPkVKQiBQcm92aWRlciBzdXBwb3J0PC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgU3BlY2lmaWNhdGlvbnM8L2gzPg0KLTx1bD4NCi08bGk+U09BUCAxLjEgYW5kIDEuMjwvbGk+DQotPGxpPk1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc20gKE1UT00pLCBYTUwNCi1PcHRpbWl6ZWQgUGFja2FnaW5nIChYT1ApIGFuZCBTT0FQIHdpdGggQXR0YWNobWVudHM8L2xpPg0KLTxsaT5XU0RMIDEuMSwgaW5jbHVkaW5nIGJvdGggU09BUCBhbmQgSFRUUCBiaW5kaW5nczwvbGk+DQotPGxpPldTLUFkZHJlc3NpbmcgKHN1Ym1pc3Npb24gYW5kIGZpbmFsKTwvbGk+DQotPGxpPldTLVBvbGljeTwvbGk+DQotPGxpPlNBQUogMS4xPC9saT4NCi08L3VsPg0KLTxoMz5UcmFuc3BvcnRzPC9oMz4NCi08dWw+DQotPGxpPkhUVFA8L2xpPg0KLTxsaT5TTVRQPC9saT4NCi08bGk+Sk1TPC9saT4NCi08bGk+VENQPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgRGF0YSBCaW5kaW5nczwvaDM+DQotPHVsPg0KLTxsaT5BeGlzIERhdGEgQmluZGluZyAoQURCKTwvbGk+DQotPGxpPlhNTEJlYW5zPC9saT4NCi08bGk+SmliWDwvbGk+DQotPGxpPkpheEJSSSAoRXhwZXJpbWVudGFsKTwvbGk+DQotPC91bD4NCi08aDI+PGEgbmFtZT0iVG9vbHNfaW5jbHVkZWRfaW4gdGhpc19SZWxlYXNlIj5Ub29scyBJbmNsdWRlZCBpbiBUaGlzDQotUmVsZWFzZTwvYT48L2gyPg0KLTxwPls8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+RG93bmxvYWQgVG9vbCBQbHVnLWluczwvYT5dPC9wPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+QXhpczIgV2ViIEFwcGxpY2F0aW9uIChXZWIgQXBwKTwvbGk+DQotPGxpPldTREwyV1MtIDxhIGhyZWY9InRvb2xzLzFfMi9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCINCi10YXJnZXQ9Il9ibGFuayI+ZWNsaXBzZSBwbHVnLWluPC9hPjxhPi88L2E+IDxhIGhyZWY9DQotInRvb2xzLzFfMi9Db2RlZ2VuVG9vbFJlZmVyZW5jZS5odG1sIiB0YXJnZXQ9Il9ibGFuayI+Q29tbWFuZCBsaW5lDQotdmVyc2lvbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzLzFfMi9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNXU0RMMkphdmFfQ29kZV9HZW5lcmF0aW9uIg0KLXRhcmdldD0iX2JsYW5rIj5JbnRlbGxpSiBJREVBIHBsdWctaW48L2E+PGE+LzwvYT48YSBocmVmPQ0KLSJ0b29scy8xXzIvbWF2ZW4tcGx1Z2lucy9tYXZlbi13c2RsMmNvZGUtcGx1Z2luLmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5NYXZlbjIgV1NETDJDb2RlIFBsdWctaW48L2E+PC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZC0gPGEgaHJlZj0NCi0idG9vbHMvMV8yL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+ZWNsaXBzZSBwbHVnLWluPC9hPi8gPGEgaHJlZj0NCi0idG9vbHMvMV8yL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI0NyZWF0ZV9TZXJ2aWNlX0FyY2hpdmUiDQotdGFyZ2V0PSJfYmxhbmsiPkludGVsbGlKIElERUEgcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPk1hdmVuMiBBQVIgUGx1Zy1pbjwvYT48L2xpPg0KLTxsaT5KYXZhMldTREwtIDxhIGhyZWY9DQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4uaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPk1hdmVuMiBKYXZhMldTREwgUGx1Zy1pbjwvYT48L2xpPg0KLTwvb2w+DQotPGgyPkV4dGVuc2lvbiBNb2R1bGVzPC9oMj4NCi08dWw+DQotPGxpPkFwYWNoZSBSYW1wYXJ0OiBTdXBwb3J0aW5nIFdTLVNlY3VyaXR5IChhbmQgc29vbg0KLVdTLVBvbGljeSk8L2xpPg0KLTxsaT5BcGFjaGUgU2FuZGVzaGEyOiBTdXBwb3J0aW5nIFdTLVJlbGlhYmxlIE1lc3NhZ2luZzwvbGk+DQotPC91bD4NCi0oQXBhY2hlIEF4aXMyIGNvbWVzIGJ1aWx0IGluIHdpdGggYSBtb2R1bGUgdGhhdCBzdXBwb3J0cw0KLVdTLUFkZHJlc3NpbmcuKQ0KLTxoMj5Lbm93biBJc3N1ZXMgYW5kIExpbWl0YXRpb25zPC9oMj4NCi0NCi08YSBpZD0iMS4yIiBuYW1lPSIxLjIiPjwvYT4NCi08aDI+Mjd0aCBBcHJpbCAyMDA3IC0gQXBhY2hlIEF4aXMyL0phdmEgVmVyc2lvbiAxLjIgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvMV8yL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0xLjI8L2E+XTwvcD4NCi08aDM+UHJvZ3JhbW1pbmcgTW9kZWw8L2gzPg0KLTx1bD4NCi08bGk+SW1wcm92ZWQsIFhNTC1jZW50cmljIGNsaWVudCBBUEkgaW5jbHVkaW5nIGZ1bGwgV1NETCBhbmQgcG9saWN5DQotc3VwcG9ydDwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIFBPSk8gYW5kIFNwcmluZyBzZXJ2aWNlcyBhbmQgY2xpZW50czwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIGFueSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm48L2xpPg0KLTxsaT5TeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGNhbGxzPC9saT4NCi08bGk+QXJjaGl2ZWQgc2VydmljZSBkZXBsb3ltZW50IG1vZGVsIHN1cHBvcnRpbmcgZnVsbCBzZXJ2aWNlDQotZW5jYXBzdWxhdGlvbiB3aXRoIHZlcnNpb25pbmcgc3VwcG9ydDwvbGk+DQotPGxpPkFyY2hpdmVkIG1vZHVsZSBkZXBsb3ltZW50IG1vZGVsIHN1cHBvcnRpbmcgY29udHJvbGxlZA0KLWV4dGVuc2liaWxpdHkgd2l0aCB2ZXJzaW9uaW5nIHN1cHBvcnQ8L2xpPg0KLTxsaT48YSBocmVmPSIjSG90X0RlcGxveW1lbnQiPkhvdCBkZXBsb3ltZW50PC9hPjwvbGk+DQotPGxpPldTLVBvbGljeSBkcml2ZW4gY29kZSBnZW5lcmF0aW9uIGV4dGVuc2lvbnM8L2xpPg0KLTxsaT5GbGV4aWJsZSBzZXJ2aWNlIGxpZmUgY3ljbGUgbW9kZWw8L2xpPg0KLTxsaT5BdXRvbWF0aWMgc3VwcG9ydCBmb3IgUE9YIChSRVNUKSBzdHlsZSBpbnZvY2F0aW9uIG9mDQotc2VydmljZXM8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBxdWVyeWluZyBhIHNlcnZpY2UncyBXU0RMICh1c2luZyA/d3NkbCksIHNjaGVtYQ0KLSh1c2luZyA/eHNkKSBhbmQgcG9saWNpZXMgKHVzaW5nID9wb2xpY3kpPC9saT4NCi08bGk+V1NETCAyLjA8L2xpPg0KLTxsaT5QT0pPIGFubm90YXRpb24gKDxhIGhyZWY9DQotImh0dHA6Ly9qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MTgxIj5KU1IgMTgxPC9hPik8L2xpPg0KLTxsaT5KQVgtV1MgaW50cmVncmF0aW9uPC9saT4NCi08bGk+Q3VzdG9tIERlcGxveWVyczwvbGk+DQotPGxpPkJpbmFyeSBzZXJpYWxpemF0aW9uIChGYXN0IEluZm9zZXQpPC9saT4NCi08bGk+SlNPTiBzdXBwb3J0PC9saT4NCi08bGk+RUpCIFByb3ZpZGVyIHN1cHBvcnQ8L2xpPg0KLTwvdWw+DQotPGgzPlN1cHBvcnRlZCBTcGVjaWZpY2F0aW9uczwvaDM+DQotPHVsPg0KLTxsaT5TT0FQIDEuMSBhbmQgMS4yPC9saT4NCi08bGk+TWVzc2FnZSBUcmFuc21pc3Npb24gT3B0aW1pemF0aW9uIE1lY2hhbmlzbSAoTVRPTSksIFhNTA0KLU9wdGltaXplZCBQYWNrYWdpbmcgKFhPUCkgYW5kIFNPQVAgd2l0aCBBdHRhY2htZW50czwvbGk+DQotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzPC9saT4NCi08bGk+V1MtQWRkcmVzc2luZyAoc3VibWlzc2lvbiBhbmQgZmluYWwpPC9saT4NCi08bGk+V1MtUG9saWN5PC9saT4NCi08bGk+U0FBSiAxLjE8L2xpPg0KLTwvdWw+DQotPGgzPlRyYW5zcG9ydHM8L2gzPg0KLTx1bD4NCi08bGk+SFRUUDwvbGk+DQotPGxpPlNNVFA8L2xpPg0KLTxsaT5KTVM8L2xpPg0KLTxsaT5UQ1A8L2xpPg0KLTwvdWw+DQotPGgzPlN1cHBvcnRlZCBEYXRhIEJpbmRpbmdzPC9oMz4NCi08dWw+DQotPGxpPkF4aXMgRGF0YSBCaW5kaW5nIChBREIpPC9saT4NCi08bGk+WE1MQmVhbnM8L2xpPg0KLTxsaT5KaWJYPC9saT4NCi08bGk+SmF4TWUgKEV4cGVyaW1lbnRhbCk8L2xpPg0KLTxsaT5KYXhCUkkgKEV4cGVyaW1lbnRhbCk8L2xpPg0KLTwvdWw+DQotPGgyPlRvb2xzIEluY2x1ZGVkIGluIHRoaXMgUmVsZWFzZTwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiPkRvd25sb2FkDQotVG9vbCBQbHVnLWluczwvYT5dPC9wPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+QXhpczIgV2ViIEFwcGxpY2F0aW9uIChXZWIgQXBwKTwvbGk+DQotPGxpPldTREwyV1MtIDxhIGhyZWY9DQotInRvb2xzLzFfMi9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCI+ZWNsaXBzZQ0KLXBsdWctaW48L2E+PGE+LzwvYT4gPGEgaHJlZj0NCi0idG9vbHMvMV8yL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiPkNvbW1hbmQgbGluZQ0KLXZlcnNpb248L2E+PGE+LzwvYT48YSBocmVmPQ0KLSJ0b29scy8xXzIvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiI+SW50ZWxsaUoNCi1JREVBIHBsdWctaW48L2E+PGE+LzwvYT48YSBocmVmPQ0KLSJ0b29scy8xXzIvbWF2ZW4tcGx1Z2lucy9tYXZlbi13c2RsMmNvZGUtcGx1Z2luLmh0bWwiPk1hdmVuMg0KLVdTREwyQ29kZSBQbHVnLWluPC9hPjwvbGk+DQotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQtIDxhIGhyZWY9DQotInRvb2xzLzFfMi9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4uaHRtbCI+ZWNsaXBzZQ0KLXBsdWctaW48L2E+LyA8YSBocmVmPQ0KLSJ0b29scy8xXzIvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSI+DQotSW50ZWxsaUogSURFQSBwbHVnLWluPC9hPi8gPGEgaHJlZj0NCi0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4tYWFyLXBsdWdpbi5odG1sIj5NYXZlbjIgQUFSDQotUGx1Zy1pbjwvYT48L2xpPg0KLTxsaT5KYXZhMldTREwtIDxhIGhyZWY9DQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotSmF2YTJXU0RMIFBsdWctaW48L2E+PC9saT4NCi08L29sPg0KLTxoMj5FeHRlbnNpb24gTW9kdWxlczwvaDI+DQotPHVsPg0KLTxsaT5BcGFjaGUgUmFtcGFydDogU3VwcG9ydGluZyBXUy1TZWN1cml0eSAoYW5kIHNvb24NCi1XUy1Qb2xpY3kpPC9saT4NCi08bGk+QXBhY2hlIFNhbmRlc2hhMjogU3VwcG9ydGluZyBXUy1SZWxpYWJsZSBNZXNzYWdpbmc8L2xpPg0KLTwvdWw+DQotKEFwYWNoZSBBeGlzMiBjb21lcyBidWlsdC1pbiB3aXRoIGEgbW9kdWxlIHRoYXQgc3VwcG9ydHMNCi1XUy1BZGRyZXNzaW5nLikNCi08aDI+S25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9uczwvaDI+DQotPHVsPg0KLTxsaT5YbWwtYmVhbnMgZGF0YWJpbmRpbmcgZG9lcyBub3Qgc3VwcG9ydCByZXNwb25zZSB1bndyYXBwaW5nPC9saT4NCi08bGk+QURCIGRhdGFiaW5kaW5nIGRvZXMgbm90IHN1cHBvcnQgbWluT2NjdXJzIGFuZCBtYXhPY2N1cnMNCi1hdHRyaWJ1dGVzIGluIHNlcXVlbmNlIGFuZCBjaG9pY2UgZWxlbWVudHMgKGkuZS4sDQotPGNvZGU+Jmx0O3NlcXVlbmNlIG1pbk9jY3Vycz0iMCINCi1tYXhPY2N1cnM9InVuYm91bmRlZCImZ3Q7Jmx0Oy9zZXF1ZW5jZSZndDs8L2NvZGU+KTwvbGk+DQotPGxpPlVuYWJsZSB0byBwcm9kdWNlIG9yaWdpbmFsIFdTREwgaW4gdGhlIGNhc2Ugb2YgV1NETCAyLjAsDQotdGhlcmVmb3JlIHRoZSBBeGlzU2VydmljZSBpcyBzZXJpYWxpemVkIHRvIHByb2R1Y2UgP3dzZGwyLjwvbGk+DQotPC91bD4NCi08YSBpZD0iMV8xXzEiIG5hbWU9IjFfMV8xIj48L2E+DQotPGgyPjA5dGggSmFudWFyeSAyMDA3LSBBcGFjaGUgQXhpczIvSmF2YSBWZXJzaW9uIDEuMS4xDQotUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQvMV8xXzEvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTEuMS4xPC9hPl08L3A+DQotPHA+QXBhY2hlIEF4aXMyIFZlcnNpb24gMS4xLjEgY29tZXMgd2l0aCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMNCi1hbmQgYnVnIGZpeGVzIG92ZXIgdGhlIDEuMSByZWxlYXNlLiBDaGVjayBvdXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YNCi1mZWF0dXJlcyBiZWxvdy48L3A+DQotPGgzPlByb2dyYW1taW5nIE1vZGVsPC9oMz4NCi08dWw+DQotPGxpPkltcHJvdmVkLCBYTUwtY2VudHJpYyBjbGllbnQgQVBJIGluY2x1ZGluZyBmdWxsIFdTREwgYW5kIHBvbGljeQ0KLXN1cHBvcnQ8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBhbnkgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuPC9saT4NCi08bGk+U3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBjYWxsczwvbGk+DQotPGxpPkFyY2hpdmVkIHNlcnZpY2UgZGVwbG95bWVudCBtb2RlbDwvbGk+DQotPGxpPkFyY2hpdmVkIG1vZHVsZSBkZXBsb3ltZW50IG1vZGVsIHN1cHBvcnRpbmcgY29udHJvbGxlZA0KLWV4dGVuc2liaWxpdHkgd2l0aCB2ZXJzaW9uaW5nIHN1cHBvcnQ8L2xpPg0KLTxsaT48YSBocmVmPSIjSG90X0RlcGxveW1lbnQiPkhvdCBkZXBsb3ltZW50PC9hPjwvbGk+DQotPGxpPldTLVBvbGljeSBkcml2ZW4gY29kZSBnZW5lcmF0aW9uIGV4dGVuc2lvbnM8L2xpPg0KLTxsaT5GbGV4aWJsZSBzZXJ2aWNlIGxpZmUgY3ljbGUgbW9kZWw8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBxdWVyeWluZyBhIHNlcnZpY2UncyBXU0RMICh1c2luZyA/d3NkbCksIHNjaGVtYQ0KLSh1c2luZyA/eHNkKSBhbmQgcG9saWNpZXMgKHVzaW5nID9wb2xpY3kpPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgU3BlY2lmaWNhdGlvbnM8L2gzPg0KLTx1bD4NCi08bGk+U09BUCAxLjEgYW5kIDEuMjwvbGk+DQotPGxpPk1lc3NhZ2UgVHJhbnNtaXNzaW9uIE9wdGltaXphdGlvbiBNZWNoYW5pc20gKE1UT00pLCBYTUwNCi1PcHRpbWl6ZWQgUGFja2FnaW5nIChYT1ApIGFuZCBTT0FQIHdpdGggQXR0YWNobWVudHM8L2xpPg0KLTxsaT5XU0RMIDEuMSwgaW5jbHVkaW5nIGJvdGggU09BUCBhbmQgSFRUUCBiaW5kaW5nczwvbGk+DQotPGxpPldTLUFkZHJlc3NpbmcgKHN1Ym1pc3Npb24gYW5kIGZpbmFsKTwvbGk+DQotPGxpPldTLVBvbGljeTwvbGk+DQotPGxpPlNBQUogMS4xPC9saT4NCi08L3VsPg0KLTxoMz5UcmFuc3BvcnRzPC9oMz4NCi08dWw+DQotPGxpPkhUVFA8L2xpPg0KLTxsaT5TTVRQPC9saT4NCi08bGk+Sk1TPC9saT4NCi08bGk+VENQPC9saT4NCi08L3VsPg0KLTxoMz5TdXBwb3J0ZWQgRGF0YSBCaW5kaW5nczwvaDM+DQotPHVsPg0KLTxsaT5BeGlzIERhdGEgQmluZGluZyAoQURCKTwvbGk+DQotPGxpPlhNTEJlYW5zPC9saT4NCi08bGk+SmliWDwvbGk+DQotPGxpPkpheE1lPC9saT4NCi08L3VsPg0KLTxoMj5Ub29scyBJbmNsdWRlZCBpbiBUaGlzIFJlbGVhc2U8L2gyPg0KLTxwPls8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5Eb3dubG9hZA0KLVRvb2wgUGx1Zy1pbnM8L2E+XTwvcD4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoV2ViIEFwcCk8L2xpPg0KLTxsaT5XU0RMMldTLSA8YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT48YT4vPC9hPiA8YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiPkNvbW1hbmQgbGluZQ0KLXZlcnNpb248L2E+PGE+LzwvYT48YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI1dTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iPkludGVsbGlKDQotSURFQSBwbHVnLWluPC9hPjxhPi88L2E+PGEgaHJlZj0NCi0idG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotV1NETDJDb2RlIFBsdWctaW48L2E+PC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZC0gPGEgaHJlZj0NCi0idG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4uaHRtbCI+ZWNsaXBzZQ0KLXBsdWctaW48L2E+LyA8YSBocmVmPQ0KLSJ0b29scy9AYXhpczJfdmVyc2lvbl9kaXJAL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI0NyZWF0ZV9TZXJ2aWNlX0FyY2hpdmUiPg0KLUludGVsbGlKIElERUEgcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotInRvb2xzL0BheGlzMl92ZXJzaW9uX2RpckAvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLmh0bWwiPk1hdmVuMg0KLUFBUiBQbHVnLWluPC9hPjwvbGk+DQotPGxpPkphdmEyV1NETC0gPGEgaHJlZj0NCi0idG9vbHMvQGF4aXMyX3ZlcnNpb25fZGlyQC9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4uaHRtbCI+DQotTWF2ZW4yIEphdmEyV1NETCBQbHVnLWluPC9hPjwvbGk+DQotPC9vbD4NCi08aDI+RXh0ZW5zaW9uIE1vZHVsZXM8L2gyPg0KLTx1bD4NCi08bGk+QXBhY2hlIFJhbXBhcnQ6IFN1cHBvcnRpbmcgV1MtU2VjdXJpdHkgKGFuZCBzb29uDQotV1MtUG9saWN5KTwvbGk+DQotPGxpPkFwYWNoZSBTYW5kZXNoYTI6IFN1cHBvcnRpbmcgV1MtUmVsaWFibGUgTWVzc2FnaW5nPC9saT4NCi08L3VsPg0KLShBcGFjaGUgQXhpczIgY29tZXMgYnVpbHQgaW4gd2l0aCBhIG1vZHVsZSB0aGF0IHN1cHBvcnRzDQotV1MtQWRkcmVzc2luZy4pDQotPGgyPktub3duIElzc3VlcyBhbmQgTGltaXRhdGlvbnM8L2gyPg0KLTx1bD4NCi08bGk+QURCIGRvZXMgbm90IHN1cHBvcnQgdW53cmFwcGluZyBvZiByZXNwb25zZSBtZXNzYWdlcyhjb21pbmcgaW4NCi0xLjIpPC9saT4NCi08bGk+SlNSIDE4MS8xODMgQW5ub3RhdGlvbiBzdXBwb3J0IChjb21pbmcgaW4gMS4yKTwvbGk+DQotPGxpPkpheE1lIGFuZCBKQVhCUkkgZGF0YSBiaW5kaW5nIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsPC9saT4NCi08bGk+U2ltcGxlIEF4aXMgU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgUE9YL1JFU1Q8L2xpPg0KLTxsaT5SUEMgTWVzc2FnZSBSZWNlaXZlciBkb2VzIG5vdCB2YWxpZGF0ZSBhIHJlcXVlc3QgYWdhaW5zdCB0aGUNCi1zY2hlbWEgKEFYSVMyLTE5NDMpPC9saT4NCi08bGk+QXhpczIgSWRlYSBwbHVnaW4gc2hvd3MgcmFuZG9tIGJlaGF2aW9yIHdoZW4gWE1MQmVhbnMgaXMNCi11c2VkPC9saT4NCi08L3VsPg0KLTxhIGlkPSIxXzEiIG5hbWU9IjFfMSI+PC9hPg0KLTxoMj4xM3RoIE5vdmVtYmVyIDIwMDYgLSBBcGFjaGUgQXhpczIvSmF2YSBWZXJzaW9uIDEuMQ0KLVJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLzFfMS9kb3dubG9hZC5jZ2kiPkRvd25sb2FkDQotMS4xPC9hPl08L3A+DQotPHA+QXBhY2hlIEF4aXMyIFZlcnNpb24gMS4xIGNvbWVzIHdpdGggYmV0dGVyIEF4aXMyIERhdGFiaW5kaW5nDQotRnJhbWV3b3JrIChBREIpIHN1cHBvcnQsIDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzMub3JnL1RSL1NPQVAtYXR0YWNobWVudHMiPmF0dGFjaG1lbnRzIEFQSTwvYT4sDQotU3ByaW5nLCBhbmQgY29tcGxldGUgc3VwcG9ydCBmb3IgU09BUCB3aXRoIEF0dGFjaG1lbnRzIChTd0EpLiBDaGVjaw0KLW91dCB0aGUgY29tcGxldGUgbGlzdCBvZiBmZWF0dXJlcyBiZWxvdy48L3A+DQotPGgzPlByb2dyYW1taW5nIE1vZGVsPC9oMz4NCi08dWw+DQotPGxpPkltcHJvdmVkLCBYTUwtY2VudHJpYyBjbGllbnQgQVBJIGluY2x1ZGluZyBmdWxsIFdTREwgYW5kIHBvbGljeQ0KLXN1cHBvcnQ8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBhbnkgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuPC9saT4NCi08bGk+U3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBjYWxsczwvbGk+DQotPGxpPkFyY2hpdmVkIHNlcnZpY2UgZGVwbG95bWVudCBtb2RlbDwvbGk+DQotPGxpPkFyY2hpdmVkIG1vZHVsZSBkZXBsb3ltZW50IG1vZGVsLCBzdXBwb3J0aW5nIGNvbnRyb2xsZWQNCi1leHRlbnNpYmlsaXR5IHdpdGggdmVyc2lvbmluZyBzdXBwb3J0PC9saT4NCi08bGk+PGEgaHJlZj0iI0hvdF9EZXBsb3ltZW50Ij5Ib3QgZGVwbG95bWVudDwvYT48L2xpPg0KLTxsaT5XUy1Qb2xpY3kgZHJpdmVuIGNvZGUgZ2VuZXJhdGlvbiBleHRlbnNpb25zPC9saT4NCi08bGk+RmxleGlibGUgc2VydmljZSBsaWZlIGN5Y2xlIG1vZGVsPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgdGhlIHF1ZXJ5aW5nIHNlcnZpY2UncyBXU0RMICh1c2luZyA/d3NkbCksIHNjaGVtYQ0KLSh1c2luZyA/eHNkKSwgYW5kIHBvbGljaWVzICh1c2luZyA/cG9saWN5KTwvbGk+DQotPC91bD4NCi08aDM+U3VwcG9ydGVkIFNwZWNpZmljYXRpb25zPC9oMz4NCi08dWw+DQotPGxpPlNPQVAgMS4xIGFuZCAxLjI8L2xpPg0KLTxsaT5NZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtIChNVE9NKSwgWE1MDQotT3B0aW1pemVkIFBhY2thZ2luZyAoWE9QKSBhbmQgU09BUCB3aXRoIEF0dGFjaG1lbnRzPC9saT4NCi08bGk+V1NETCAxLjEsIGluY2x1ZGluZyBib3RoIFNPQVAgYW5kIEhUVFAgYmluZGluZ3M8L2xpPg0KLTxsaT5XUy1BZGRyZXNzaW5nIChzdWJtaXNzaW9uIGFuZCBmaW5hbCk8L2xpPg0KLTxsaT5XUy1Qb2xpY3k8L2xpPg0KLTxsaT5TQUFKIDEuMTwvbGk+DQotPC91bD4NCi08aDM+VHJhbnNwb3J0czwvaDM+DQotPHVsPg0KLTxsaT5IVFRQPC9saT4NCi08bGk+U01UUDwvbGk+DQotPGxpPkpNUzwvbGk+DQotPGxpPlRDUDwvbGk+DQotPC91bD4NCi08aDM+U3VwcG9ydGVkIERhdGEgQmluZGluZ3M8L2gzPg0KLTx1bD4NCi08bGk+QXhpcyBEYXRhIEJpbmRpbmcgKEFEQik8L2xpPg0KLTxsaT5YTUxCZWFuczwvbGk+DQotPGxpPkppYlg8L2xpPg0KLTxsaT5KYXhNZTwvbGk+DQotPC91bD4NCi08aDI+VG9vbHMgSW5jbHVkZWQgaW4gVGhpcyBSZWxlYXNlPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCI+RG93bmxvYWQNCi1Ub29sIFBsdWctaW5zPC9hPl08L3A+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5BeGlzMiBXZWIgQXBwbGljYXRpb24gKFdlYiBBcHApPC9saT4NCi08bGk+V1NETDJXUy0gPGEgaHJlZj0NCi0idG9vbHMvMV8xL2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT48YT4vPC9hPiA8YSBocmVmPQ0KLSJ0b29scy8xXzEvQ29kZWdlblRvb2xSZWZlcmVuY2UuaHRtbCI+Q29tbWFuZCBsaW5lDQotdmVyc2lvbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzLzFfMS9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNXU0RMMkphdmFfQ29kZV9HZW5lcmF0aW9uIj5JbnRlbGxpSg0KLUlERUEgcGx1Zy1pbjwvYT48YT4vPC9hPjxhIGhyZWY9DQotInRvb2xzLzFfMS9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotV1NETDJDb2RlIFBsdWctaW48L2E+PC9saT4NCi08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZC0gPGEgaHJlZj0NCi0idG9vbHMvMV8xL2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj5lY2xpcHNlDQotcGx1Zy1pbjwvYT4vIDxhIGhyZWY9DQotInRvb2xzLzFfMS9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNDcmVhdGVfU2VydmljZV9BcmNoaXZlIj4NCi1JbnRlbGxpSiBJREVBIHBsdWctaW48L2E+LyA8YSBocmVmPQ0KLSJ0b29scy8xXzEvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLmh0bWwiPk1hdmVuMiBBQVINCi1QbHVnLWluPC9hPjwvbGk+DQotPGxpPkphdmEyV1NETC0gPGEgaHJlZj0NCi0idG9vbHMvMV8xL21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi5odG1sIj5NYXZlbjINCi1KYXZhMldTREwgUGx1Zy1pbjwvYT48L2xpPg0KLTwvb2w+DQotPGgyPkV4dGVuc2lvbiBNb2R1bGVzPC9oMj4NCi08dWw+DQotPGxpPkFwYWNoZSBSYW1wYXJ0OiBTdXBwb3J0aW5nIFdTLVNlY3VyaXR5IChhbmQgc29vbg0KLVdTLVBvbGljeSk8L2xpPg0KLTxsaT5BcGFjaGUgU2FuZGVzaGEyOiBTdXBwb3J0aW5nIFdTLVJlbGlhYmxlIE1lc3NhZ2luZzwvbGk+DQotPC91bD4NCi0oQXBhY2hlIEF4aXMyIGNvbWVzIGJ1aWx0IGluIHdpdGggYSBtb2R1bGUgdGhhdCBzdXBwb3J0cw0KLVdTLUFkZHJlc3NpbmcuKQ0KLTxoMj5Lbm93biBJc3N1ZXMgYW5kIExpbWl0YXRpb25zPC9oMj4NCi08dWw+DQotPGxpPkpheE1lIGFuZCBKQVhCUkkgZGF0YSBiaW5kaW5nIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsPC9saT4NCi08bGk+QVhJUzItNTk1OiBIb3QgcmUtZGVwbG95bWVudCBpbiBBcGFjaGUgVG9tY2F0IGhhcyBwcm9ibGVtczwvbGk+DQotPGxpPkF4aXMgRGF0YSBCaW5kaW5nIChBREIpIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZvbGxvd2luZw0KLWNvbnN0cnVjdHM6DQotPG9sPg0KLTxsaT5BWElTMi05ODM6IFN1cHBvcnQgZm9yIFNpbXBsZSBUeXBlIFVuaW9uIGFuZCBTaW1wbGUgVHlwZQ0KLUxpc3Q8L2xpPg0KLTxsaT5BWElTMi0xMDkyOiBTdXBwb3J0IGZvciB4czpsaXN0IGluc2lkZSBhbiB4czpzaW1wbGVUeXBlPC9saT4NCi08bGk+QVhJUzItMTA5MzogU3VwcG9ydCBmb3IgeHM6dW5pb24gaW5zaWRlIHhzOnNpbXBsZVR5cGU8L2xpPg0KLTwvb2w+DQotPC9saT4NCi08bGk+Tm8gc3VwcG9ydCB5ZXQgZm9yIHVud3JhcHBpbmcgb2YgZG9jL2xpdCBXU0RMIGZpbGVzIChpbiBzdHViDQotZ2VuZXJhdGlvbik8L2xpPg0KLTxsaT5ObyBzdXBwb3J0IHlldCBmb3IgcnBjL2VuY29kZWQgc3R5bGUgV1NETCBkb2N1bWVudHMgKGluIHN0dWINCi1nZW5lcmF0aW9uKTwvbGk+DQotPGxpPklkZWEgcGx1Z2luIHNob3dzIHJhbmRvbSBiZWhhdmlvciB3aGVuIFhNTEJlYW5zIGlzIHVzZWQ8L2xpPg0KLTwvdWw+DQotPGEgaWQ9IjFfMCIgbmFtZT0iMV8wIj48L2E+DQotPGgyPjA0IE1heSAyMDA2IC0gQXBhY2hlIEF4aXMyIFZlcnNpb24gMS4wIFJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0xLjA8L2E+XTwvcD4NCi08cD5BcGFjaGUgQXhpczIgaXMgYSBjb21wbGV0ZSByZS1kZXNpZ24gYW5kIHJlLXdyaXRlIG9mIHRoZSB3aWRlbHkNCi11c2VkIEFwYWNoZSBBeGlzIFNPQVAgc3RhY2ssIGJ1aWx0IG9uIHRoZSBsZXNzb25zIGxlYXJudCBmcm9tDQotQXBhY2hlIEF4aXMuPC9wPg0KLTxwPkFwYWNoZSBBeGlzMiBub3Qgb25seSBzdXBwb3J0cyBTT0FQIDEuMSBhbmQgU09BUCAxLjIsIGJ1dCBpdA0KLWFsc28gaGFzIGludGVncmF0ZWQgc3VwcG9ydCBmb3IgdGhlIHdpZGVseSBwb3B1bGFyIFJFU1Qgc3R5bGUgb2YNCi1XZWIgc2VydmljZXMuIFRoZSBzYW1lIGJ1c2luZXNzIGxvZ2ljIGltcGxlbWVudGF0aW9uIGNhbiBvZmZlciBib3RoDQotYSBXUy0qIHN0eWxlIGludGVyZmFjZSBhcyB3ZWxsIGFzIGEgUkVTVCBzdHlsZSBpbnRlcmZhY2UNCi1zaW11bHRhbmVvdXNseS48L3A+DQotPHA+QXBhY2hlIEF4aXMyIGlzIG1vcmUgZWZmaWNpZW50LCBtb3JlIG1vZHVsYXIgYW5kIG1vcmUNCi1YTUwtb3JpZW50ZWQgdGhhbiB0aGUgb2xkZXIgdmVyc2lvbi4gSXQgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCB0aGUNCi1lYXN5IGFkZGl0aW9uIG9mIHBsdWctaW4gIm1vZHVsZXMiIHRoYXQgZXh0ZW5kIHRoZWlyIGZ1bmN0aW9uYWxpdHkNCi1mb3IgZmVhdHVyZXMgc3VjaCBhcyBzZWN1cml0eSBhbmQgcmVsaWFiaWxpdHkuIFRoZSBtb2R1bGVzDQotY3VycmVudGx5IGF2YWlsYWJsZSBvciB1bmRlciBkZXZlbG9wbWVudCBpbmNsdWRlOjwvcD4NCi08dWw+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy90Y19ob21lLnBocD93Z19hYmJyZXY9d3NybSI+V1MtUmVsaWFibGVNZXNzYWdpbmc8L2E+DQotLSBTdXBwb3J0ZWQgYnkgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2FuZGVzaGEvc2FuZGVzaGEyLyI+QXBhY2hlDQotU2FuZGVzaGEyPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9zcGVjaWZpY2F0aW9uL3dzLXR4LyNjb29yIj4NCi1XUy1Db29yZGluYXRpb248L2E+IGFuZCA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvc3BlY2lmaWNhdGlvbi93cy10eC8jYXRvbSI+DQotV1MtQXRvbWljVHJhbnNhY3Rpb248L2E+IC0gU3VwcG9ydGVkIGJ5IDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2thbmR1bGEvIj5BcGFjaGUgS2FuZHVsYTI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3RjX2hvbWUucGhwP3dnX2FiYnJldj13c3MiPldTLVNlY3VyaXR5PC9hPg0KLS0gU3VwcG9ydGVkIGJ5IDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvaW5kZXguaHRtbCI+QXBhY2hlDQotUmFtcGFydDwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9TdWJtaXNzaW9uL3dzLWFkZHJlc3NpbmcvIj5XUy1BZGRyZXNzaW5nPC9hPiAtDQotPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9pbmRleC5odG1sIj5Nb2R1bGU8L2E+DQotaW5jbHVkZWQgYXMgcGFydCBvZiBBeGlzMiBjb3JlPC9saT4NCi08L3VsPg0KLTxwPkFwYWNoZSBBeGlzMiBpcyBidWlsdCBvbiA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL2F4aW9tL2luZGV4Lmh0bWwiPkFwYWNoZSBBeGlvbTwvYT4sIGENCi1uZXcgaGlnaCBwZXJmb3JtYW50LCBwdWxsLWJhc2VkIFhNTCBvYmplY3QgbW9kZWwgdGhhdCB3YXMgcmVsZWFzZWQNCi1vbiAwMiBNYXkgMjAwNi48L3A+DQotPGgyPkZlYXR1cmVzPC9oMj4NCi08aDM+UHJvZ3JhbW1pbmcgTW9kZWw8L2gzPg0KLTx1bD4NCi08bGk+SW1wcm92ZWQsIFhNTC1jZW50cmljIGNsaWVudCBBUEkgaW5jbHVkaW5nIGZ1bGwgV1NETCBhbmQgcG9saWN5DQotc3VwcG9ydDwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIGFueSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm48L2xpPg0KLTxsaT5TeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGNhbGxzPC9saT4NCi08bGk+QXJjaGl2ZWQgc2VydmljZSBkZXBsb3ltZW50IG1vZGVsPC9saT4NCi08bGk+QXJjaGl2ZWQgbW9kdWxlIGRlcGxveW1lbnQgbW9kZWwgc3VwcG9ydGluZyBjb250cm9sbGVkDQotZXh0ZW5zaWJpbGl0eSB3aXRoIHZlcnNpb25pbmcgc3VwcG9ydDwvbGk+DQotPGxpPjxhIGhyZWY9IjFfMS9pbnN0YWxsYXRpb25ndWlkZS5odG1sI2hvdF9kZXBsb3ltZW50Ij5Ib3QNCi1kZXBsb3ltZW50PC9hPjwvbGk+DQotPGxpPldTLVBvbGljeSBkcml2ZW4gY29kZSBnZW5lcmF0aW9uIGV4dGVuc2lvbnM8L2xpPg0KLTxsaT5GbGV4aWJsZSBzZXJ2aWNlIGxpZmVjeWxlIG1vZGVsPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgcXVlcnlpbmcgYSBzZXJ2aWNlJ3MgV1NETCAodXNpbmcgP3dzZGwpLCBzY2hlbWENCi0odXNpbmcgP3hzZCkgYW5kIHBvbGljaWVzICh1c2luZyA/cG9saWN5KTwvbGk+DQotPC91bD4NCi08aDM+U3VwcG9ydGVkIFNwZWNpZmljYXRpb25zPC9oMz4NCi08dWw+DQotPGxpPlNPQVAgMS4xIGFuZCAxLjI8L2xpPg0KLTxsaT5NZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtIChNVE9NKSwgWE1MDQotT3B0aW1pemVkIFBhY2thZ2luZyAoWE9QKSBhbmQgU09BUCB3aXRoIEF0dGFjaG1lbnRzPC9saT4NCi08bGk+V1NETCAxLjEsIGluY2x1ZGluZyBib3RoIFNPQVAgYW5kIEhUVFAgYmluZGluZ3M8L2xpPg0KLTxsaT5XUy1BZGRyZXNzaW5nIChzdWJtaXNzaW9uIGFuZCBmaW5hbCk8L2xpPg0KLTxsaT5XUy1Qb2xpY3k8L2xpPg0KLTxsaT5TQUFKIDEuMTwvbGk+DQotPC91bD4NCi08aDM+VHJhbnNwb3J0czwvaDM+DQotPHVsPg0KLTxsaT5IVFRQPC9saT4NCi08bGk+U01UUDwvbGk+DQotPGxpPkpNUzwvbGk+DQotPGxpPlRDUDwvbGk+DQotPC91bD4NCi08aDM+U3VwcG9ydGVkIERhdGEgQmluZGluZ3M8L2gzPg0KLTx1bD4NCi08bGk+QXhpcyBEYXRhIEJpbmRpbmcgKEFEQik8L2xpPg0KLTxsaT5YTUxCZWFuczwvbGk+DQotPGxpPkppYlg8L2xpPg0KLTxsaT5KYXhNZTwvbGk+DQotPC91bD4NCi08aDI+PGE+VG9vbHMgSW5jbHVkZWQgaW4gVGhpcyBSZWxlYXNlPC9hPjwvaDI+DQotPHA+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCI+W0Rvd25sb2FkDQotcGx1Zy1pbnNdPC9hPjwvcD4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoV2ViIEFwcCk8L2xpPg0KLTxsaT5XU0RMMldTLSA8YSBocmVmPQ0KLSIuLi90b29scy8xXzAvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLmh0bWwiPmVjbGlwc2UNCi1wbHVnLWluPC9hPjxhPi88L2E+IDxhIGhyZWY9DQotIi4uL3Rvb2xzLzFfMC9Db2RlZ2VuVG9vbFJlZmVyZW5jZS5odG1sIj5Db21tYW5kIGxpbmUNCi12ZXJzaW9uPC9hPjxhPi88L2E+PGEgaHJlZj0NCi0iLi4vdG9vbHMvMV8wL2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sI1dTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iPkludGVsbGlKDQotSURFQSBwbHVnLWluPC9hPjwvbGk+DQotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQtIDxhIGhyZWY9DQotIi4uL3Rvb2xzLzFfMC9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4uaHRtbCI+ZWNsaXBzZQ0KLXBsdWctaW48L2E+LyA8YSBocmVmPQ0KLSIuLi90b29scy8xXzAvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSI+DQotSW50ZWxsaUogSURFQSBwbHVnLWluPC9hPjwvbGk+DQotPC9vbD4NCi08aDI+RXh0ZW5zaW9uIE1vZHVsZXM8L2gyPg0KLTx1bD4NCi08bGk+QXBhY2hlIFJhbXBhcnQ6IFN1cHBvcnRpbmcgV1MtU2VjdXJpdHkgKGFuZCBzb29uDQotV1MtUG9saWN5KTwvbGk+DQotPGxpPkFwYWNoZSBTYW5kZXNoYTI6IFN1cHBvcnRpbmcgV1MtUmVsaWFibGUgTWVzc2FnaW5nPC9saT4NCi08L3VsPg0KLShBcGFjaGUgQXhpczIgY29tZXMgd2l0aCBhIGJ1aWx0IGluIG1vZHVsZSB0aGF0IHN1cHBvcnRzDQotV1MtQWRkcmVzc2luZy4pDQotPGgyPktub3duIElzc3VlcyBhbmQgTGltaXRhdGlvbnM8L2gyPg0KLTx1bD4NCi08bGk+UmVjdXJzaXZlIHNjaGVtYXMgKEEgaW5jbHVkZXMgQiB3aGljaCBpbmNsdWRlcyBBKSBtYXkgY2F1c2UNCi1wcm9ibGVtczwvbGk+DQotPGxpPkpheE1lIGRhdGEgYmluZGluZyBzdXBwb3J0IGlzIGV4cGVyaW1lbnRhbDwvbGk+DQotPGxpPkF4aXMyLTU5NTogSG90IHJlLWRlcGxveW1lbnQgaW4gQXBhY2hlIFRvbWNhdCBoYXMgcHJvYmxlbXM8L2xpPg0KLTxsaT5BeGlzMi02NjY6IEFkZHJlc3NpbmdTdWJtaXNzaW9uSW5IYW5kbGVyIGRvZXMgbm90IGRlc2VyaWFsaXplDQotRVBSIGV4dGVuc2liaWxpdHkgYXR0cmlidXRlcyBhbmQgZWxlbWVudHM8L2xpPg0KLTxsaT5BWElTMi02Njc6IE9wZXJhdGlvbiBkaXNwYXRjaCBiYXNlZCBvbiBtZXNzYWdlIGJvZHkgaGFzIGEga25vd24NCi1pc3N1ZTwvbGk+DQotPGxpPkF4aXMgRGF0YSBCaW5kaW5nIChBREIpIGRvZXMgbm90IGNvdmVyIGFsbCBvZiB0aGUgWE1MIFNjaGVtYTsNCi1pdHMgYW4gODAtMjAgZGVzaWduIHBvaW50LiBVbnN1cHBvcnRlZCBYTUwgU2NoZW1hIGZlYXR1cmVzIGluY2x1ZGU6DQotPG9sPg0KLTxsaT5TaW1wbGUgY29udGVudCBleHRlbnNpb24gYW5kIHJlc3RyaWN0aW9uPC9saT4NCi08bGk+Q29tcGxleCBjb250ZW50IHJlc3RyaWN0aW9uPC9saT4NCi08L29sPg0KLTwvbGk+DQotPGxpPkFEQiBkb2VzIG5vdCBzdXBwb3J0IHhzaTp0eXBlIGJhc2VkIGRlc2VyaWFsaXphdGlvbiBhdA0KLXJ1bnRpbWU8L2xpPg0KLTxsaT5ObyBzdXBwb3J0IHlldCBmb3IgdW53cmFwcGluZyBvZiBkb2MvbGl0IFdTREwgZmlsZXMgKGluIHN0dWINCi1nZW5lcmF0aW9uKTwvbGk+DQotPGxpPk5vIHN1cHBvcnQgeWV0IGZvciBycGMvZW5jb2RlZCBzdHlsZSBXU0RMIGRvY3VtZW50cyAoaW4gc3R1Yg0KLWdlbmVyYXRpb24pPC9saT4NCi08L3VsPg0KLTxhIGlkPSIwXzk1IiBuYW1lPSIwXzk1Ij48L2E+DQotPGgyPjIzIE1hcmNoIDIwMDYgLSBBcGFjaGUgQXhpczIgVmVyc2lvbiAwLjk1IFJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0wLjk1PC9hPl08L3A+DQotPHA+VGhpcyByZWxlYXNlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PC9wPg0KLTxoMyBpZD0iaGVhZC0yMTVmMzk0NWE0MDU1OGY5YWQwNTVlZDViNjYwMWU4ZjkzNzA2NTU4Ij5BeGlzMg0KLUNvbXBsZXRlIExpc3Qgb2YgRmVhdHVyZXM8L2gzPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+QVhJT00sIGFuIFhNTCBvYmplY3QgbW9kZWwgd29ya2luZyBvbiBTdEFYIChTdHJlYW1pbmcgQVBJIGZvcg0KLVhNTCkgcGFyc2luZyBvcHRpbWl6ZWQgZm9yIFNPQVAgMS4xLzEuMiBtZXNzYWdlcy4gVGhpcyBoYXMgY29tcGxldGUNCi1YTUwgaW5mb3NldCBzdXBwb3J0LjwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIE9uZS1XYXkgTWVzc2FnaW5nIChJbi1Pbmx5KSBhbmQgUmVxdWVzdCBSZXNwb25zZQ0KLU1lc3NhZ2luZyAoSW4tT3V0KTwvbGk+DQotPGxpPk1vZHVsZSBBcmNoaXRlY3R1cmUsIGEgbWVjaGFuaXNtIHRvIGV4dGVuZCB0aGUgU09BUCBQcm9jZXNzaW5nDQotTW9kZWw8L2xpPg0KLTxsaT5Nb2R1bGUgdmVyc2lvbiBzdXBwb3J0OyB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlDQotc2FtZSBtb2R1bGUgYW5kIHVzZSB0aGVtIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnQuPC9saT4NCi08bGk+Q29udGV4dCBoaWVyYXJjaHk8L2xpPg0KLTxsaT5BcmNoaXZlIGJhc2VkIGRlcGxveW1lbnQgbW9kZWwgYW5kIERpcmVjdG9yeSBiYXNlZCBkZXBsb3ltZW50DQotbW9kZWw8L2xpPg0KLTxsaT5KV1MtbGlrZSBkZXBsb3ltZW50IChtYWtpbmcgYSBKYXZhIGNsYXNzIGludG8gYSBXZWINCi1zZXJ2aWNlKTwvbGk+DQotPGxpPldTREwgQ29kZSBHZW5lcmF0aW9uIFRvb2wgZm9yIFN0dWIgYW5kIHNrZWxldG9uczwvbGk+DQotPGxpPldTLUFkZHJlc3NpbmcsIGJvdGggaW4gdGhlIHN1Ym1pc3Npb24gKDIwMDQvMDgpIGFuZCBmaW5hbA0KLSgyMDA1LzA4KSB2ZXJzaW9uczwvbGk+DQotPGxpPldTUzRKIG1vZHVsZSBmb3Igc2VjdXJpdHk8L2xpPg0KLTxsaT5JbXByb3ZlZCBhbmQgdXNlciBmcmllbmRseSBDbGllbnQgQVBJPC9saT4NCi08bGk+V1NETDJKYXZhIGFuZCBKYXZhMldTREw8L2xpPg0KLTxsaT5SRVNUIChSRXByZXNlbnRhdGlvbmFsIFN0YXRlIFRyYW5zZmVyKSBTdXBwb3J0PC9saT4NCi08bGk+VHJhbnNwb3J0cyBzdXBwb3J0czogSFRUUCwgU01UUCwgVENQLCBKTVM8L2xpPg0KLTxsaT5SYXcgWE1MIHByb3ZpZGVyczwvbGk+DQotPGxpPlN1cHBvcnQgZm9yIE1UT00vIE1JTUUvIFN3QTwvbGk+DQotPGxpPlNBQUogaW1wbGVtZW50YXRpb248L2xpPg0KLTxsaT5ET09NPC9saT4NCi08bGk+UGFjay9VbnBhY2sgY2FwYWJpbGl0eSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlPC9saT4NCi08bGk+QXhpcyBEYXRhIEJpbmRpbmcgLSBBREIgKEZyYW1ld29yayBhbmQgU2NoZW1hIENvbXBpbGVyKTwvbGk+DQotPGxpPk51bWVyb3VzIGJ1ZyBmaXhlcyBzaW5jZSBsYXN0IHJlbGVhc2U8L2xpPg0KLTxsaT5UcmFuc3BvcnQgZnJhbWV3b3JrIGltcHJvdmVtZW50cyAoTGlzdGVuZXJNYW5hZ2VyKS08c3BhbiBzdHlsZT0NCi0iY29sb3I6ICNGRjAwMDAiPk5ldzwvc3Bhbj48L2xpPg0KLTxsaT5BeGlzU2VydmxldCBhdXRvIHN0YXJ0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIHNlcnZlciBzdGFydHMNCi11cC08c3BhbiBzdHlsZT0iY29sb3I6ICNGRjAwMDAiPk5ldzwvc3Bhbj48L2xpPg0KLTxsaT5Nb2R1bGUgZGlzZW5nYWdlbWVudCBzdXBwb3J0LTxzcGFuIHN0eWxlPQ0KLSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPGxpPkxvYWRpbmcgbW9kdWxlICgubWFyKSBmcm9tIGNsYXNzcGF0aC08c3BhbiBzdHlsZT0NCi0iY29sb3I6ICNGRjAwMDAiPk5ldzwvc3Bhbj48L2xpPg0KLTxsaT5TZXNzaW9ucyBzY29waW5nIGZvciBBcHBsaWNhdGlvbiwgU09BUCwgVHJhbnNwb3J0IGFuZCBSZXF1ZXN0DQotbGV2ZWxzLTxzcGFuIHN0eWxlPSJjb2xvcjogI0ZGMDAwMCI+TmV3PC9zcGFuPjwvbGk+DQotPC9vbD4NCi08cCBpZD0iaGVhZC01YmI1YWEwOTk3MTdkMWQ0OTY0MmY3YWUyZDYzY2U1Y2Y5NDQ4N2FkIj4NCi08c3Ryb25nPjxlbT5BeGlzMiBMaXN0IG9mIEV4cGVyaW1lbnRhbCBGZWF0dXJlczwvZW0+PC9zdHJvbmc+PC9wPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+U2VydmVyIHNpZGUgYW5kIGNsaWVudCBzaWRlIFdlYiBTZXJ2aWNlIFBvbGljeSBzdXBwb3J0PC9saT4NCi08bGk+P3dzZGwgYW5kID94c2Qgc3VwcG9ydDwvbGk+DQotPGxpPkdlbmVyYXRlIFNlcnZpY2VDbGllbnQgZm9yIGEgZ2l2ZW4gV1NETCBhbmQgaW52b2tlIHRoZQ0KLWNvcnJlc3BvbmRpbmcgc2VydmljZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNsaWVudC48L2xpPg0KLTwvb2w+DQotPGgzIGlkPSJoZWFkLTdkZDhlNzgzYmI5ZTIyZmIwMGY4ODc0ODg1NWJiNmU1MDAxMTFlMTIiPk1ham9yDQotQ2hhbmdlcyBTaW5jZSBMYXN0IFJlbGVhc2U8L2gzPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+VHJhbnNwb3J0IGZyYW1ld29yayBpbXByb3ZlbWVudHMgKExpc3RlbmVyTWFuYWdlcikNCi08cHJlPg0KLSAgICZsdDthY3Rpb25NYXBwaW5nJmd0O015TWFwcGluZyZsdDsvYWN0aW9uTWFwcGluZyZndDsNCi0gICANCi08L3ByZT48L2xpPg0KLTxsaT5DaGFuZ2VkIHRoZSB3YXkgeW91IGFkZCBhY3Rpb24gdG8gbWFwcGluZyAod3NhbWFwcGluZykgZnJvbSBhDQotcGFyYW1ldGVyIHRvIGEgY2hpbGQgZWxlbWVudC4gVGhlcmVmb3JlLCBmcm9tIHRoaXMgdmVyc2lvbiBvbndhcmQsDQotYWRkaW5nIG1hcHBpbmcgaXMgYXMgZm9sbG93czo8L2xpPg0KLTxsaT5SZWZhY3RvcmVkIHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgaW4gQXhpb20uDQotPHVsPg0KLTxsaT5vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5idWlsZGVyIHRvDQotb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXI8L2xpPg0KLTxsaT5vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5tdG9tIHRvDQotb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLm10b208L2xpPg0KLTxsaT5vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5zZXJpYWxpemUgdG8NCi1vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuc2VyaWFsaXplPC9saT4NCi08bGk+b3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20udHJhdmVyc2UgdG8NCi1vcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwudHJhdmVyc2U8L2xpPg0KLTwvdWw+DQotPC9saT4NCi08L29sPg0KLTxoMyBpZD0iaGVhZC04MzM3MWNjM2Q2OTYxMjk1YmUwNDJmNTg0YzdiNzRkODFjY2EyM2M0Ij5Ub29scw0KLUluY2x1ZGVkIGluIFRoaXMgUmVsZWFzZTwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5BeGlzMiBXZWIgQXBwbGljYXRpb24gKFdlYiBBcHApPC9saT4NCi08bGk+V1NETDJXUy0gQ29tbWFuZCBsaW5lIHZlcnNpb248L2xpPg0KLTwhLS08bGk+U2VydmljZSBBcmNoaXZlIFdpemFyZC0gZWNsaXBzZSBQbHVnaW48L2xpPi0tPjwvb2w+DQotPGgzIGlkPSJoZWFkLTU5OWM1YTUwNTUyZjAyZWJkZWI1ZjU4ZWY4ZGEyODkyMzQ4MTJjYTQiPldoYXQgU3RpbGwNCi1OZWVkcyB0byBiZSBEb25lPC9oMz4NCi08cD5UaGUgbGlzdCBvZiB3aGF0IHdlIHRoaW5rIG5lZWRzIHRvIGJlIGRvbmUuIEV2ZW4geW91IGNhbg0KLWNvbnNpZGVyIGhlbHBpbmcgb3V0IGlmIHlvdSBhcmUgaW50ZXJlc3RlZC48L3A+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5KQVgtUlBDIDEuMSBhbmQvb3IgSkFYLVdTIGNvbXBsaWFuY2U8L2xpPg0KLTxsaT5TT0FQIEVuY29kaW5nPC9saT4NCi08bGk+QmluYXJ5IHNlcmlhbGl6YXRpb24gYW5kIGRlLXNlcmlhbGl6YXRpb24gc3VwcG9ydDwvbGk+DQotPGxpPk1hbmFnZW1lbnQgSW50ZXJmYWNlIGZvciBBeGlzMjwvbGk+DQotPGxpPkltcGxlbWVudGF0aW9uIG9mIG90aGVyIFRyYW5zcG9ydHMuPC9saT4NCi08bGk+UmVzb3VyY2UgZnJhbWV3b3JrIGltcGxlbWVudGF0aW9uIChXUy1SRikgYW5kIEVudGVycHJpc2Ugd2ViDQotc2VydmljZXMgc3VjaCBhcyBKU1IgMTA5IHN1cHBvcnQ8L2xpPg0KLTxsaT5Db21wbGV0aW9uIG9mIEludGVyb3AgdGVzdHM8L2xpPg0KLTwvb2w+DQotPGEgaWQ9IjBfOTQiIG5hbWU9IjBfOTQiPjwvYT4NCi08aDI+MTEgSmFudWFyeSAyMDA2IC0gQXBhY2hlIEF4aXMyIFZlcnNpb24gMC45NCBSZWxlYXNlZCE8L2gyPg0KLTxwPls8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiPkRvd25sb2FkDQotMC45NDwvYT5dPC9wPg0KLTxwPlRoaXMgcmVsZWFzZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOjwvcD4NCi08aDMgaWQ9ImhlYWQtMjE1ZjM5NDVhNDA1NThmOWFkMDU1ZWQ1YjY2MDFlOGY5MzcwNjU1OCI+VGhlIENvbXBsZXRlDQotTGlzdCBvZiBGZWF0dXJlczwvaDM+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5BWElPTSwgYW4gWE1MIG9iamVjdCBtb2RlbCB3b3JraW5nIG9uIFN0QVggKFN0cmVhbWluZyBBUEkgZm9yDQotWE1MKSBwYXJzaW5nIG9wdGltaXplZCBmb3IgU09BUCAxLjEvMS4yIE1lc3NhZ2VzLiBUaGlzIGhhcyBjb21wbGV0ZQ0KLVhNTCBpbmZvc2V0IHN1cHBvcnQuPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgT25lLVdheSBNZXNzYWdpbmcgKEluLU9ubHkpIGFuZCBSZXF1ZXN0IFJlc3BvbnNlDQotTWVzc2FnaW5nIChJbi1PdXQpPC9saT4NCi08bGk+TW9kdWxlIEFyY2hpdGVjdHVyZSwgbWVjaGFuaXNtIHRvIGV4dGVuZCB0aGUgU09BUCBQcm9jZXNzaW5nDQotTW9kZWw8L2xpPg0KLTxsaT5Nb2R1bGUgdmVyc2lvbiBzdXBwb3J0OyB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlDQotc2FtZSBtb2R1bGUgYW5kIHVzZSB0aGVtIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnQuPC9saT4NCi08bGk+Q29udGV4dCBoaWVyYXJjaHk8L2xpPg0KLTxsaT5BcmNoaXZlIGJhc2VkIGRlcGxveW1lbnQgTW9kZWwsIGFuZCBEaXJlY3RvcnkgYmFzZWQgZGVwbG95bWVudA0KLW1vZGVsPC9saT4NCi08bGk+SldTLWxpa2UgZGVwbG95bWVudCAobWFraW5nIGEgSmF2YSBjbGFzcyBpbnRvIGEgV2ViDQotc2VydmljZSk8L2xpPg0KLTxsaT5XU0RMIENvZGUgR2VuZXJhdGlvbiBUb29sIGZvciBTdHViIGFuZCBza2VsZXRvbnM8L2xpPg0KLTxsaT5XUy1BZGRyZXNzaW5nLCBib3RoIHRoZSBzdWJtaXNzaW9uICgyMDA0LzA4KSBhbmQgZmluYWwNCi0oMjAwNS8wOCkgdmVyc2lvbnM8L2xpPg0KLTxsaT5XU1M0SiBtb2R1bGUgZm9yIHNlY3VyaXR5PC9saT4NCi08bGk+SW1wcm92ZWQgYW5kIHVzZXIgZnJpZW5kbHkgQ2xpZW50IEFQSTwvbGk+DQotPGxpPldTREwySmF2YTwvbGk+DQotPGxpPlJFU1QgKFJFcHJlc2VudGF0aW9uYWwgU3RhdGUgVHJhbnNmZXIpIFN1cHBvcnQ8L2xpPg0KLTxsaT5UcmFuc3BvcnRzIHN1cHBvcnRzOiBIVFRQLCBTTVRQLCBUQ1AsIEpNUzwvbGk+DQotPGxpPlJhdyBYTUwgcHJvdmlkZXJzPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgTVRPTS8gTUlNRS8gU3dBPC9saT4NCi08bGk+U0FBSiBpbXBsZW1lbnRhdGlvbjwvbGk+DQotPGxpPkRPT00gLSA8c3BhbiBzdHlsZT0iY29sb3I6ICNGRjAwMDAiPk5ldzwvc3Bhbj48L2xpPg0KLTxsaT5QYWNrL1VucGFjayBjYXBhYmlsaXR5IGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUgLSA8c3BhbiBzdHlsZT0NCi0iY29sb3I6ICNGRjAwMDAiPk5ldzwvc3Bhbj48L2xpPg0KLTxsaT5BeGlzIERhdGEgQmluZGluZyAtIEFEQiAoRnJhbWV3b3JrIGFuZCBTY2hlbWEgQ29tcGlsZXIpPC9saT4NCi08bGk+TnVtZXJvdXMgYnVnIGZpeGVzIHNpbmNlIGxhc3QgcmVsZWFzZTwvbGk+DQotPC9vbD4NCi08aDQgaWQ9ImhlYWQtNWJiNWFhMDk5NzE3ZDFkNDk2NDJmN2FlMmQ2M2NlNWNmOTQ0ODdhZCI+QXhpczIgTGlzdA0KLW9mIEV4cGVyaW1lbnRhbCBGZWF0dXJlczwvaDQ+DQotPG9sIHR5cGU9IjEiPg0KLTxsaT5TZXNzaW9ucyBzY29waW5nIGZvciBBcHBsaWNhdGlvbiwgU09BUCwgVHJhbnNwb3J0IGFuZCBSZXF1ZXN0DQotbGV2ZWxzPC9saT4NCi08bGk+U2VydmVyIHNpZGUgV2ViIFNlcnZpY2UgUG9saWN5IHN1cHBvcnQ8L2xpPg0KLTxsaT4/d3NkbCBhbmQgP3hzZCBzdXBwb3J0PC9saT4NCi08bGk+SmF2YTJXU0RMPC9saT4NCi08bGk+R2VuZXJhdGUgU2VydmljZUNsaWVudCBmb3IgYSBnaXZlbiBXU0RMIGFuZCBpbnZva2UgdGhlDQotY29ycmVzcG9uZGluZyBzZXJ2aWNlIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY2xpZW50LjwvbGk+DQotPC9vbD4NCi08aDMgaWQ9ImhlYWQtN2RkOGU3ODNiYjllMjJmYjAwZjg4NzQ4ODU1YmI2ZTUwMDExMWUxMiI+TWFqb3INCi1DaGFuZ2VzIFNpbmNlIHRoZSBMYXN0IFJlbGVhc2U8L2gzPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+Rml4aW5nIG9mIG1lbW9yeSBsZWFrcy48L2xpPg0KLTxsaT5DbGllbnQgQVBJIGNoYW5nZXMuIEludHJvZHVjaW5nIFNlcnZpY2VDbGllbnQgaW5zdGVhZCBvZg0KLU1FUENsaWVudCwgSW5Pbmx5TUVQQ2xpZW50LCBJbk91dE1FUENsaWVudCwgQ2FsbC4gKFBsZWFzZSBub3RlIHRoYXQNCi10aGUgYWJvdmUgY2xhc3NlcyB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhpcyByZWxlYXNlLik8L2xpPg0KLTxsaT5Nb2R1bGUgdmVyc2lvbmluZyBzdXBwb3J0LiBZb3UgY2FuIGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YNCi10aGUgc2FtZSBtb2R1bGUgYW5kIHVzZSB0aGVtIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnQuPC9saT4NCi08bGk+Q29kZSBnZW5lcmF0b3IgaW1wcm92ZWQgdG8gcHJvY2VzcyBtdWx0aS1wb3J0IFdTRExzPC9saT4NCi08bGk+UGFja2luZyBhbmQgdW5wYWNraW5nIG9wdGlvbnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRlZA0KLWNsYXNzZXM8L2xpPg0KLTwvb2w+DQotPGgzIGlkPSJoZWFkLTgzMzcxY2MzZDY5NjEyOTViZTA0MmY1ODRjN2I3NGQ4MWNjYTIzYzQiPlRvb2xzDQotSW5jbHVkZWQgaW4gdGhpcyBSZWxlYXNlPC9oMz4NCi08b2wgdHlwZT0iMSI+DQotPGxpPkF4aXMyIFdlYiBBcHBsaWNhdGlvbiAoV2ViIEFwcCk8L2xpPg0KLTxsaT5XU0RMMldTLSBFY2xpcHNlIHBsdWdpbi8gQ29tbWFuZCBsaW5lIHZlcnNpb24vIEludGVsbGlKIElERUENCi1wbHVnaW48L2xpPg0KLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSBFY2xpcHNlIHBsdWdpbi8gSW50ZWxsaUogSURFQQ0KLXBsdWdpbjwvbGk+DQotPC9vbD4NCi08aDMgaWQ9ImhlYWQtNTk5YzVhNTA1NTJmMDJlYmRlYjVmNThlZjhkYTI4OTIzNDgxMmNhNCI+V2hhdCBTdGlsbA0KLU5lZWRzIHRvIGJlIERvbmU8L2gzPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+SkFYLVJQQyAxLjEgYW5kL29yIEpBWC1XUyBjb21wbGlhbmNlPC9saT4NCi08bGk+U09BUCBFbmNvZGluZzwvbGk+DQotPGxpPkJpbmFyeSBzZXJpYWxpemF0aW9uIGFuZCBkZS1zZXJpYWxpemF0aW9uIHN1cHBvcnQ8L2xpPg0KLTxsaT5NYW5hZ2VtZW50IGludGVyZmFjZSBmb3IgQXhpczI8L2xpPg0KLTxsaT5JbXBsZW1lbnRhdGlvbiBvZiBvdGhlciBUcmFuc3BvcnRzLjwvbGk+DQotPGxpPlJlc291cmNlIGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiAoV1MtUkYpIGFuZCBFbnRlcnByaXNlIHdlYg0KLXNlcnZpY2VzIHN1Y2ggYXMgSlNSIDEwOSBzdXBwb3J0PC9saT4NCi08bGk+Q29tcGxldGlvbiBvZiBpbnRlcm9wIHRlc3RzPC9saT4NCi08L29sPg0KLTxhIGlkPSIwXzkzIiBuYW1lPSIwXzkzIj48L2E+DQotPGgyPjAyIERlY2VtYmVyIDIwMDUgLSBBcGFjaGUgQXhpczIgVmVyc2lvbiAwLjkzIFJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0wLjkzPC9hPl08L3A+DQotPHA+QXhpczIgaXMgYmVjb21pbmcgbW9yZSBhbmQgbW9yZSBzdGFibGUuIFRoaXMgMC45MyByZWxlYXNlDQotY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIGZlYXR1cmVzOjwvcD4NCi08dWw+DQotPGxpPkpESyAxLjUgY29tcGF0aWJpbGl0eTwvbGk+DQotPGxpPkNvbmZpZ3VyYWJsZSBoYW5kbGVyIGNoYWlucyB1c2luZyBheGlzMi54bWw8L2xpPg0KLTxsaT5JbXByb3ZlZCBjbGFzcyBsb2FkZXIgaGllcmFyY2h5PC9saT4NCi08bGk+SW1wcm92ZWQgc2VjdXJpdHkgbW9kdWxlIHdpdGggZHluYW1pYyBjb25maWd1cmFiaWxpdHk8L2xpPg0KLTxsaT5BREIgKEF4aXMgRGF0YSBCaW5kaW5nKSB3aXRoIGNvbXBsZXRlIHNpbXBsZSB0eXBlIHN1cHBvcnQgYW5kDQotbGltaXRlZCBjb21wbGV4IHR5cGUgc3VwcG9ydDwvbGk+DQotPGxpPkphbG9weSBiYXNlZCBjb2RlIGZvcm1hdHRpbmcgb2YgZ2VuZXJhdGVkIGNvZGU8L2xpPg0KLTxsaT5Qcm94eSBzdXBwb3J0IGFuZCBOVExNIGF1dGhlbnRpY2F0aW9uPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgcnBjL2xpdGVyYWw8L2xpPg0KLTxsaT5BbmQgbnVtZXJvdXMgYnVnIGZpeGVzIGFmdGVyIDAuOTIgcmVsZWFzZTwvbGk+DQotPC91bD4NCi08aDM+TGlzdCBvZiBFeHBlcmltZW50YWwgRmVhdHVyZXM8L2gzPg0KLTxvbCB0eXBlPSIxIj4NCi08bGk+RE9PTSAtIERPTSBpbXBsZW1lbnRhdGlvbiBvdmVyIE9NPC9saT4NCi08bGk+SmF2YTJXU0RMPC9saT4NCi08bGk+UlBDIFN1cHBvcnQ8L2xpPg0KLTwvb2w+DQotPGgzPk1ham9yIENoYW5nZXMgU2luY2UgdGhlIExhc3QgUmVsZWFzZTwvaDM+DQotPG9sPg0KLTxsaT5SZWZhY3RvcmVkIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50YXBpIHRvDQotb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ8L2xpPg0KLTxsaT5JbnRyb2R1Y3Rpb24gb2YgT3B0aW9ucyB0byBjb25maWd1cmUgY2xpZW50czwvbGk+DQotPGxpPlJlbmFtaW5nIG9mIGRlc2NyaXB0b3JzLiBPcGVyYXRpb25EZXNjcmlwdGlvbiAtJmd0Ow0KLUF4aXNPcGVyYXRpb24sIFNlcnZpY2VEZXNjcmlwdGlvbiAtJmd0OyBBeGlzU2VydmljZSwNCi1TZXJ2aWNlR3JvdXBEZXNjcmlwdGlvbiAtJmd0OyBBeGlzU2VydmljZUdyb3VwPC9saT4NCi08L29sPg0KLVdlIGFyZSBnZXR0aW5nIGNsb3NlciB0byBhIDEuMCByZWxlYXNlLCBhbmQgdGhlIHJlbWFpbmluZyB0YXNrcyB0bw0KLWJlIGNvbXBsZXRlZCBiZWZvcmUgdGhlIDEuMCByZWxlYXNlIGluY2x1ZGU6IFNPQVAgMS4xIGFuZCAxLjINCi12YWxpZGF0aW9uLCBvdXIgb3duIGRhdGEgYmluZGluZyBpbXBsZW1lbnRhdGlvbiwgYW5kIFdTREwNCi1nZW5lcmF0aW9uLiA8YSBpZD0iMF85MiIgbmFtZT0iMF85MiI+PC9hPg0KLTxoMj4yNiBTZXB0ZW1iZXIgMjAwNSAtIEFwYWNoZSBBeGlzMiBWZXJzaW9uIDAuOTIgUmVsZWFzZWQhPC9oMj4NCi08cD5bPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj5Eb3dubG9hZA0KLTAuOTI8L2E+XTwvcD4NCi08cD5UaGlzIDAuOTIgcmVsZWFzZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwNCi1mZWF0dXJlczo8L3A+DQotPHVsPg0KLTxsaT5XUy1TZWN1cml0eSBzdXBwb3J0IHVzaW5nIFdTUzRKPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgY29udGV4dCBoaWVyYXJjaHkgc2VyaWFsaXphdGlvbjwvbGk+DQotPGxpPlNlcnZpY2UgR3JvdXBzPC9saT4NCi08bGk+TnVtZXJvdXMgYnVnIGZpeGVzIGFmdGVyIDAuOTEgcmVsZWFzZTwvbGk+DQotPC91bD4NCi08aDM+VGhlIFJlbGVhc2UgSW5jbHVkZXMgdGhlIEZvbGxvd2luZyBUb29sczwvaDM+DQotPHVsPg0KLTxsaT5BZG1pbiBXZWIgQXBwPC9saT4NCi08bGk+V1NETDJKYXZhLCBlY2xpcHNlIFBsdWdpbi9Db21tYW5kIGxpbmUgdmVyc2lvbjwvbGk+DQotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQsIGVjbGlwc2UgUGx1Z2luPC9saT4NCi08bGk+TW9kdWxlIEFyY2hpdmUgV2l6YXJkLCBlY2xpcHNlIFBsdWdpbjwvbGk+DQotPGxpPlNlcnZpY2UgQXJjaGl2ZSBXaXphcmQsIEludGVsbGlKIElERUEgUGx1Z2luPC9saT4NCi08L3VsPg0KLTxwPldlIGFyZSBnZXR0aW5nIGNsb3NlciB0byBhIDEuMCByZWxlYXNlLCBhbmQgdGhlIHJlbWFpbmluZyB0YXNrcw0KLXRvIGJlIGNvbXBsZXRlZCBiZWZvcmUgYSAxLjAgcmVsZWFzZSBpbmNsdWRlOiBTT0FQIDEuMSBhbmQgMS4yDQotdmFsaWRhdGlvbiwgb3VyIG93biBkYXRhIGJpbmRpbmcgaW1wbGVtZW50YXRpb24sIGFuZCBXU0RMDQotZ2VuZXJhdGlvbi48L3A+DQotPGEgaWQ9IjBfOTEiIG5hbWU9IjBfOTEiPjwvYT4NCi08aDI+MTIgQXVndXN0IDIwMDUgLSBBcGFjaGUgQXhpczIgVmVyc2lvbiAwLjkxIFJlbGVhc2VkITwvaDI+DQotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQNCi0wLjkxPC9hPl08L3A+DQotPHA+VGhpcyAwLjkxIHJlbGVhc2UgaXMgYSBnbGltcHNlIG9mIHRoZSAxLjAgdGhhdCBzaG91bGQgYmUgY29taW5nDQotc29vbi4gVGhpcyAwLjkxIHJlbGVhc2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsDQotZmVhdHVyZXM6PC9wPg0KLTx1bD4NCi08bGk+RmlsZSBDYWNoaW5nIGZvciBNVE9NPC9saT4NCi08bGk+U09BUCBmYXVsdHMgYmFzZWQgb24gdGhlIFNPQVAgdmVyc2lvbiBhbmQgYmV0dGVyIGZhdWx0DQotaGFuZGxpbmc8L2xpPg0KLTxsaT5EaWZmZXJlbnQgY2hhcmFjdGVyIGVuY29kaW5nIHN1cHBvcnQ8L2xpPg0KLTxsaT5JbXByb3ZlZCBpbmZvc2V0IHN1cHBvcnQgaW4gQVhJT008L2xpPg0KLTxsaT5JbXByb3ZlZCBjb2RlIGdlbmVyYXRpb24gdGVtcGxhdGVzPC9saT4NCi08bGk+TnVtZXJvdXMgYnVnIGZpeGVzPC9saT4NCi08L3VsPg0KLTxhIGlkPSIwXzkwIiBuYW1lPSIwXzkwIj48L2E+DQotPGgyPjAyIEp1bHkgMjAwNSAtIEFwYWNoZSBBeGlzMiBWZXJzaW9uIDAuOSBSZWxlYXNlZCE8L2gyPg0KLTxwPls8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiPkRvd25sb2FkDQotMC45PC9hPl08L3A+DQotPHA+QXhpczIgaXMgdGFraW5nIHNoYXBlLiBUaGlzIDAuOSByZWxlYXNlIGlzIGEgZ2xpbXBzZSBvZiB0aGUgMS4wDQotdGhhdCBzaG91bGQgYmUgY29taW5nIHNvb24uIFRoaXMgMC45IHJlbGVhc2UgY29udGFpbnMgdGhlIGZvbGxvd2luZw0KLWFkZGl0aW9uYWwgZmVhdHVyZXM6PC9wPg0KLTx1bD4NCi08bGk+WE1MIEJlYW5zIGJhc2VkIGRhdGEgYmluZGluZyBzdXBwb3J0PC9saT4NCi08bGk+U3VwcG9ydCBmb3IgV1MtQWRkcmVzc2luZywgYm90aCB0aGUgc3VibWlzc2lvbiBhbmQgZmluYWwNCi12ZXJzaW9uczwvbGk+DQotPGxpPlJFU1QgV2ViIFNlcnZpY2UgU3VwcG9ydDwvbGk+DQotPGxpPk1UT00vU1dBIGF0dGFjaG1lbnRzIHN1cHBvcnQ8L2xpPg0KLTxsaT5TQUFKIGltcGxlbWVudGF0aW9uPC9saT4NCi08L3VsPg0KLTxhIGlkPSJNMiIgbmFtZT0iTTIiPjwvYT4NCi08aDI+MDcgSnVuZSAyMDA1IC0gQXBhY2hlIEF4aXMyIE1pbGVzdG9uZSAyIChNMikgUmVsZWFzZWQ8L2gyPg0KLTxwPkFwYWNoZSBBeGlzMiBpcyBzdGFydGluZyB0byB0YWtlIHNoYXBlLiBGZWF0dXJlcyBpbXBsZW1lbnRlZCBpbg0KLXRoaXMgc2Vjb25kIG1pbGVzdG9uZSByZWxlYXNlIGFyZTo8L3A+DQotPHVsPg0KLTxsaT5Nb2R1bGVzIC0gYSBtZWNoYW5pc20gdG8gZXh0ZW5kIHRoZSBTT0FQIFByb2Nlc3NpbmcgTW9kZWw8L2xpPg0KLTxsaT5TdXBwb3J0IGZvciBXUy1BZGRyZXNzaW5nPC9saT4NCi08bGk+QXhpczIgQ2xpZW50IEFQSSAtIEJsb2NraW5nIGFuZCBOb24tQmxvY2tpbmcgQVBJPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgT25lLVdheSBNZXNzYWdpbmcgYW5kIFJlcXVlc3QgUmVzcG9uc2UNCi1NZXNzYWdpbmc8L2xpPg0KLTxsaT5XU0RMIENvZGUgR2VuZXJhdGlvbiBUb29sLjwvbGk+DQotPGxpPkhUVFAsIFNNVFAsIGFuZCBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQ8L2xpPg0KLTwvdWw+DQotPGI+VGhpcyByZWxlYXNlIGFsc28gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB0b29sczo8L2I+DQotPHVsPg0KLTxsaT5BZG1pbmlzdHJhdGlvbiB3ZWIgYXBwbGljYXRpb24sPC9saT4NCi08bGk+V1NETDJXUy1FY2xpcHNlIHBsdWctaW48L2xpPg0KLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSBFY2xpcHNlIHBsdWctaW48L2xpPg0KLTxsaT5Nb2R1bGUgQXJjaGl2ZSBXaXphcmQtRWNsaXBzZSBwbHVnLWluPC9saT4NCi08L3VsPg0KLTxhIGlkPSJNMSIgbmFtZT0iTTEiPjwvYT4NCi08aDI+MjQgRmVicnVhcnkgMjAwNSAtIEFwYWNoZSBBeGlzMiBNaWxlc3RvbmUgMSAoTTEpIFJlbGVhc2VkPC9oMj4NCi08cD5UaGlzIGZpcnN0IG1pbGVzdG9uZSByZWxlYXNlIG9mIEF4aXMyIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcNCi1mZWF0dXJlczo8L3A+DQotPHVsPg0KLTxsaT5BWElPTSwgYSBTT0FQIHNwZWNpZmljIHN0cmVhbWluZyBYTUwgaW5mb3NldCBtb2RlbCBmb3IgU09BUA0KLTEuMS8xLjIgTWVzc2FnZXM8L2xpPg0KLTxsaT5XU0RMIE9iamVjdCBNb2RlbCBidWlsdCBiYXNlZCBvbiB0aGUgcHJvcG9zZWQgV1NETCAyLjANCi1Db21wb25lbnQgTW9kZWwuPC9saT4NCi08bGk+SGFuZGxlciBmcmFtZXdvcmsgd2l0aCB0aGUgc3VwcG9ydCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZg0KLXRoZSBIYW5kbGVyIGluIGEgc3BlY2lmaWMgUGhhc2U8L2xpPg0KLTxsaT5TdXBwb3J0IHRvIGJ1bmRsZSBhbmQgZW5hYmxlIHRoZSBIYW5kbGVycyBhcyBNb2R1bGVzPC9saT4NCi08bGk+U3VwcG9ydCBmb3IgdGhlIFN5bmNocm9ub3VzIGFuZCBBc3luY2hyb25vdXMgSU4tT1VUIG1lc3NhZ2luZw0KLW92ZXIgSFRUUCB0cmFuc3BvcnQ8L2xpPg0KLTxsaT5Ib3QgZGVwbG95bWVudCBvZiBXZWIgU2VydmljZXM8L2xpPg0KLTwvdWw+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2FydGljbGVzLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvYXJ0aWNsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY1Yzk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvYXJ0aWNsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIg0KLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPHRpdGxlPkF4aXMyIEtub3dsZWRnZSBCYXNlPC90aXRsZT4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotImFtYXlhIDkuMi4xLCBzZWUgaHR0cDovL3d3dy53My5vcmcvQW1heWEvIiAvPg0KLTxsaW5rIGhyZWY9ImNzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5BcGFjaGUgQXhpczIgUmVmZXJlbmNlczwvaDE+DQotPHA+VGhpcyBwYWdlIGNvbnRhaW5zIGFydGljbGVzLCB0dXRvcmlhbHMsIHByZXNlbnRhdGlvbnMgYW5kDQotcXVlc3Rpb24gYW5kIGFuc3dlcnMgcHVibGlzaGVkIG9uIHZhcmlvdXMgV2ViIHNpdGVzIG9uIHRoZSBBcGFjaGUNCi1BeGlzMiBlbmdpbmUuIFRoZXNlIHJlZmVyZW5jZXMgd2lsbCBwcm92ZSB0byBiZSBhIGdyZWF0IGhlbHAgaW4NCi1ib29zdGluZyB5b3VyIGtub3dsZWRnZSBvbiBBeGlzMi48L3A+DQotPGgyPkJvb2tzOjwvaDI+PHVsPjxsaT48YSBjbGFzcz0iZXh0ZXJuYWxMaW5rIiBocmVmPSJodHRwOi8vd3d3LnBhY2t0cHViLmNvbS9hcnRpY2xlL2NyZWF0ZS1xdWFsaXR5LXdlYi1zZXJ2aWNlcy13aXRoLXF1aWNrdHN0YXJ0LWFwYWNoZS1heGlzMiI+DQotUXVpY2t0c3RhcnQgQXBhY2hlIEF4aXMyPC9hPg0KLS0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxpbWcgYWx0PSJRdWlja3RzdGFydCBBcGFjaGUgQXhpczIiIHNyYz0iaHR0cDovL2ltYWdlcy5wYWNrdHB1Yi5jb20vaW1hZ2VzLzEwMHgxMjMvMTg0NzE5Mjg2Ni5wbmciPjwvaW1nPg0KLQ0KLTwvdWw+DQotPGgyPkFydGljbGVzOjwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmpheG1hZy5jb20vaXRyL29ubGluZV9hcnRpa2VsL3BzZWNvbSxpZCw3NDcsbm9kZWlkLDE0Ny5odG1sIj4NCi1BeGlzMiAtIFRoZSBGdXR1cmUgb2YgV2ViIFNlcnZpY2VzPC9hPi0gQnkgU3JpbmF0aCBQZXJlcmEsIEFqaXRoDQotUmFuYWJhaHU8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmRldmVsb3Blci5jb20vc2VydmljZXMvYXJ0aWNsZS5waHAvMzUyNTQ4MSI+SW50cm9kdWNpbmcNCi1BeGlzMiwgdGhlIE5leHQgR2VuZXJhdGlvbiBvZiB0aGUgQXBhY2hlIFdlYiBTZXJ2aWNlIFN0YWNrPC9hPi0gQnkNCi1TcmluYXRoIFBlcmVyYTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cub25qYXZhLmNvbS9wdWIvYS9vbmphdmEvMjAwNS8wNy8yNy9heGlzMi5odG1sIj5XZWINCi1TZXJ2aWNlcyBNZXNzYWdpbmcgd2l0aCBBcGFjaGUgQXhpczI6IENvbmNlcHRzIGFuZCBUZWNobmlxdWVzPC9hPi0NCi1CeSBTcmluYXRoIFBlcmVyYSwgQWppdGggUmFuYWJhaHUgKDI3IEp1bHkgMjAwNSk8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vZGV2ZWxvcGVyLmNvbS9qYXZhL3dlYi9hcnRpY2xlLnBocC8zNTI5MzIxIj5BeGlzMiBFeGVjdXRpb24NCi1GcmFtZXdvcms8L2E+LSBCeSBEZWVwYWwgSmF5YXNpbmdoZTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly9qYXhtYWcuY29tL2l0ci9vbmxpbmVfYXJ0aWtlbC9wc2Vjb20saWQsNzU3LG5vZGVpZCwxNDcuaHRtbCI+DQotQXhpczIgRGVwbG95bWVudCBNb2RlbDwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5kZXZlbG9wZXIuY29tL29wZW4vYXJ0aWNsZS5waHAvMzU1Nzc0MSI+VW5kZXJzdGFuZGluZw0KLUF4aXMyIERlcGxveW1lbnQgQXJjaGl0ZWN0dXJlPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LndzbzIubmV0L2FydGljbGVzL2F4aXMyL2phdmEvMjAwNi8wMi8wNi9pbnNpZGUtY29kZWdlbiI+DQotSW5zaWRlIHRoZSBBeGlzMiBDb2RlIEdlbmVyYXRvcjwvYT4tIEJ5IEFqaXRoIFJhbmFiYWh1ICgwNiBGZWINCi0yMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuZGV2ZWxvcGVyLmNvbS9qYXZhL290aGVyL2FydGljbGUucGhwLzM1NzAwMzEiPlV0aWxpemluZw0KLWEgTm9uLUphdmEgV2ViIFNlcnZpY2Ugd2l0aCBBeGlzMjwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5kZXZlbG9wZXIuY29tL29wZW4vYXJ0aWNsZS5waHAvMzU4OTEyNiI+QXZvaWRpbmcNCi1NaXN0YWtlcyBNYWRlIFVzaW5nIEF4aXMyPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGU8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LTEyOC5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9vcy1hZy1heGlzMm1pZy9pbmRleC5odG1sIj4NCi1NaWdyYXRpbmcgQXBhY2hlIEF4aXMgYXBwcyB0byBBeGlzMiB1c2luZyBBcGFjaGUgR2Vyb25pbW88L2E+LSBCeQ0KLVR5bGVyIEFuZGVyc29uICgwNyBNYXIgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmRldmVsb3Blci5jb20vamF2YS9lbnQvYXJ0aWNsZS5waHAvMzYwNjQ2NiI+VGhlIEF4aXMyDQotVHJhbnNwb3J0IEZyYW1ld29yazwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy53c28yLm5ldC9hcnRpY2xlcy9heGlzMi9qYXZhLzIwMDYvMDgvMDEvY2xpZW50LWFwaS1wYXJhbWV0ZXJzIj4NCi1SZWZlcmVuY2UgR3VpZGUgdG8gQXBhY2hlIEF4aXMyIENsaWVudCBBUEkgUGFyYW1ldGVyczwvYT4tIEJ5IEVyYW4NCi1DaGludGhha2EgKDAxIEF1ZyAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cud3NvMi5uZXQvYXJ0aWNsZXMvYXhpczIvamF2YS8yMDA2LzA1LzE3L2F4aXMyLXBlcmZvcm1hbmNlLXRlc3Rpbmctcm91bmQtMSI+DQotQXhpczIgLSBQZXJmb3JtYW5jZSBUZXN0aW5nIFJvdW5kICMxPC9hPi0gQnkNCi1EZXZhbnVtIFNpcmluaXZhcyAoMTcgTWF5IDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy53c28yLm5ldC9hcnRpY2xlcy9heGlzMi9qYXZhLzIwMDYvMDkvMTMvd29ya2luZy13aXRoLWF4aXMyIj4NCi1Xb3JraW5nIFdpdGggQXBhY2hlIEF4aXMyPC9hPi0gRGVlcGFsIEpheWFzaW5naGUgKDEzIFNlcCAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuZGV2ZWxvcGVyLmNvbS9qYXZhL2VudC9hcnRpY2xlLnBocC8zNjEzODk2Ij5Xcml0aW5nIGFuDQotQXBhY2hlIEF4aXMyIFNlcnZpY2UgZnJvbSBTY3JhdGNoPC9hPi0gQnkgRGVlcGFsIEpheWFzaW5naGUgKDIwDQotSnVuZSAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3cuZGV2ZWxvcGVyLmNvbS9qYXZhL3dlYi9hcnRpY2xlLnBocC8zNjIwNjYxIj5BcGFjaGUNCi1BeGlzMiBTZXNzaW9uIE1hbmFnZW1lbnQ8L2E+LSBCeSBEZWVwYWwgSmF5YXNpbmdoZTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZGV2eC5jb20vSmF2YS9BcnRpY2xlLzMzODM5Ij5BcGFjaGUgQXhpczINCi13aXRoIFBPSk8ncyBhbmQgU3ByaW5nPC9hPi0gQnkgUmFtYW51amFtIEEuIFJhbzwvbGk+DQotDQotPGxpPjxhIGhyZWY9DQotImh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvd2Vic2VydmljZXMvbGlicmFyeS93cy1heGlzMnNvYXAvIj4NCi1TaXggd2F5cyB0aGUgQXhpczIgZGVwbG95bWVudCBtb2RlbCBpcyBtb3JlIHVzZXIgZnJpZW5kbHk8L2E+LSBCeSBEZWVwYWwgSmF5YXNpbmdoZTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly90b2RheS5qYXZhLm5ldC9wdWIvYS90b2RheS8yMDA2LzEyLzEzL2ludm9raW5nLXdlYi1zZXJ2aWNlcy11c2luZy1hcGFjaGUtYXhpczIuaHRtbCI+DQotSW52b2tpbmcgV2ViIFNlcnZpY2VzIHVzaW5nIEFwYWNoZSBBeGlzMg0KLTwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMjA2MCI+DQotV3JpdGluZyBZb3VyIE93biBzZXJ2aWNlcy54bWwgZm9yIEF4aXMyIFdlYiBTZXJ2aWNlczwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMjA2OCI+DQotQURCIEdlbmVyYXRlZCBDb2RlIGluIEFwYWNoZSBBeGlzMjwvYT4tIEJ5IEFtaWxhIFN1cmlhcmFjaGNoaTwvbGk+DQotDQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzZXJ2aWNlcy9saWJyYXJ5L3dzLWphdmEyLyI+SmF2YQ0KLVdlYiBzZXJ2aWNlcywgUGFydCAyOiBEaWdnaW5nIGludG8gQXhpczI6IEFYSU9NPC9hPiAtIEJ5IERlbm5pcyBTb3Nub3NraSAoMzAgTm92DQotMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvd2Vic2VydmljZXMvbGlicmFyeS93cy1qYXZhMy8iPkphdmENCi1XZWIgc2VydmljZXMsIFBhcnQgMzogQXhpczIgRGF0YSBCaW5kaW5nPC9hPiAtIEJ5IERlbm5pcyBTb3Nub3NraSAoMjYgSnVsDQotMjAwNyk8L2xpPg0KLQ0KLQ0KLTwvdWw+DQotPGgyPlR1dG9yaWFsczwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8xNDAiPkludHJvZHVjaW5nIEF4aXMyPC9hPi0gQnkNCi1FcmFuIENoaW50aGFrYSwgQ2hhdGh1cmEgSGVyYXRoICgwNSBKdW5lIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMTQxIj5BY2NlbGVyYXRpbmcgV2ViIFNlcnZpY2VzDQotRGV2ZWxvcG1lbnQgd2l0aCBBeGlzMjwvYT4tIEJ5IERlZXBhbCBKYXlhc2luZ2hlLCBBaml0aCBSYW5hYmFodQ0KLSgwNSBKdW5lIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvOTUiPkhlbGxvIFdvcmxkIHdpdGggQXBhY2hlDQotQXhpczI8L2E+LSBCeSBSdWNoaXRoIEZlcm5hbmRvICgyOSBNYXkgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8xNzYiPkhvdyBBcGFjaGUgQXhpczIgRmluZHMNCi10aGUgT3BlcmF0aW9uIGFuZCBTZXJ2aWNlIGEgTWVzc2FnZSBpcyBEZXN0aW5lZCBUbzwvYT4tIEJ5IEVyYW4NCi1DaGludGhha2EoMTggSnVuZSAyMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzIyNSI+SG93IHRvIERlYnVnIGEgV2ViDQotU2VydmljZT88L2E+LSBCeSBBaml0aCBSYW5hYmFodSAoMjggSnVseSAyMDA2KTwvbGk+DQotPC91bD4NCi08aDI+UHJlc2VudGF0aW9uczwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8xMzYiPldoeSBBeGlzMjogVGhlIEZ1dHVyZSBvZg0KLVdlYiBTZXJ2aWNlczwvYT4tIEJ5IEVyYW4gQ2hpbnRoYWthICgwNSBKdW5lIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMjQ3Ij5CdWlsZGluZyBFbnRlcnByaXNlDQotQXBwbGljYXRpb25zIHdpdGggQXhpczItVHV0b3JpYWwgZnJvbSBBcGFjaGVDb24gQXNpYSAyMDA2PC9hPi0gQnkNCi1EZWVwYWwgSmF5YXNpbmdoZSwgUnVjaGl0aCBGZXJuYW5kbyAoMzAgQXVnIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMTM3Ij5JbnRyb2R1Y2luZyBBeGlzMjwvYT4tIEJ5DQotQWppdGggUmFuYWJhaHUgKDA1IEp1bmUgMjAwNik8L2xpPg0KLTwvdWw+DQotPGgyPlF1ZXN0aW9ucyBhbmQgQW5zd2VyczwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS82NyI+U2V0dGluZyB1cCBBcGFjaGUgQXhpczIgaW4NCi1lY2xpcHNlIElERTwvYT4tIEJ5IFJ1Y2hpdGggRmVybmFuZG8gKDA0IEFwcmlsIDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvODMiPkhvdyBkbyBJIEVtYmVkDQotU2ltcGxlSFRUUFNlcnZlciBpbiBNeSBBcHBsaWNhdGlvbiBhbmQgRGVwbG95IGEgUE9KTz88L2E+LSBCeQ0KLURhdmFudW0gU2lyaW5pdmFzICgwOSBNYXkgMjAwNik8L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3NvMi5vcmcvbGlicmFyeS8yMDkiPkhvdyB0byBDb25maWd1cmUgQXhpczIncw0KLUhUVFAgVHJhbnNwb3J0IFNlbmRlciBhdCBDbGllbnQgU2lkZT88L2E+LSBCeSBTYW1pbmRhIEFiZXlzaW5naGUNCi0oMTFKdWx5IDIwMDYpPC9saT4NCi08bGk+PGEgaHJlZj0iaHR0cDovL3dzbzIub3JnL2xpYnJhcnkvMTc1Ij5Ib3cgdG8gZG8gUkVTVCBpbnZvY2F0aW9uDQotd2l0aCBBeGlzMi9KYXZhIFNlcnZpY2VDbGllbnQ/PC9hPi0gQnkgRXJhbiBDaGludGhha2EgKDE3IEp1bmUNCi0yMDA2KTwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly93c28yLm9yZy9saWJyYXJ5LzkwIj5Ib3cgdG8gRW1iZWQgYW4gQXhpczINCi1iYXNlZCBXZWIgU2VydmljZSBpbiB5b3VyIFdlYmFwcD88L2E+LSBCeSBEYXZhbnVtIFNpcmluaXZhcygxNyBNYXkNCi0yMDA2KTwvbGk+DQotPC91bD4NCi08aDI+T3RoZXI8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0NCi0iaHR0cDovL3B6Zi5mcmVtYW50bGUub3JnLzIwMDcvMDUvZ2V0dGluZy1zdGFydGVkLXdpdGgtd3NybS1hbmQtYXhpczIuaHRtbCI+DQotR2V0dGluZyBzdGFydGVkIHdpdGggQXhpczIgYW5kIFNhbmRlc2hhMiB0byBkbw0KLVdTLVJlbGlhYmxlTWVzc2FnaW5nPC9hPjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvY3NzL2F4aXMtZG9jcy5jc3MgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Nzcy9heGlzLWRvY3MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTc3MTdiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvY3NzL2F4aXMtZG9jcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS5pbWctdGl0bGUgew0KLSAgICB0ZXh0LWFsaWduOiBjZW50ZXINCi19DQotDQotLmltZyB7DQotICAgIHRleHQtYWxpZ246IGNlbnRlcg0KLX0NCi0NCi0uc3BlY2lhbC10ZCB7DQotICAgIGZvbnQtZmFtaWx5OiBBcmlhbDsNCi0gICAgZm9udC1zaXplOiAxMHB0Ow0KLSAgICBmb250LXdlaWdodDogYm9sZA0KLX0NCi0NCi0uc3BlY2lhbCB7DQotICAgIGZvbnQtZmFtaWx5OiBBcmlhbDsNCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQotICAgIGJvcmRlci1zdHlsZTogc29saWQ7DQotICAgIGJvcmRlci13aWR0aDogMTsNCi0gICAgcGFkZGluZy1sZWZ0OiA0Ow0KLSAgICBwYWRkaW5nLXJpZ2h0OiA0Ow0KLSAgICBwYWRkaW5nLXRvcDogMTsNCi0gICAgcGFkZGluZy1ib3R0b206IDE7DQotICAgIGJhY2tncm91bmQtY29sb3I6ICNDMEMwQzA7DQotICAgIGZvbnQtc2l6ZTogMTBwdA0KLX0NCi0NCi0ueG1sIHsNCi0gICAgZm9udC1mYW1pbHk6IEFyaWFsOw0KLSAgICBmb250LXNpemU6IDEwcHQ7DQotICAgIGNvbG9yOiAjMDAwMEZGOw0KLSAgICBmb250LXN0eWxlOiBpdGFsaWMNCi19DQotDQotLmNvZGUgew0KLSAgICBmb250LWZhbWlseTogQ291cmllciBOZXc7DQotICAgIGZvbnQtc2l6ZTogMTBwdDsNCi0gICAgY29sb3I6ICM4MDAwMDANCi19DQotDQotLyoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLUdlbmVyaWMgZWxlbWVudCBzdHlsZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLWJvZHkgew0KLSAgICBjb2xvcjogIzExMTsNCi0gICAgZm9udDogMTFweCAvIDEuNSB2ZXJkYW5hLCBhcmlhbDsNCi0gICAgbWFyZ2luOiAxMDsNCi0gICAgcGFkZGluZzogNTsNCi0gICAgYm9yZGVyLXdpZHRoOiAwOw0KLSAgICBvdXRsaW5lLXdpZHRoOiAwOw0KLSAgICBsaXN0LXN0eWxlLXBvc2l0aW9uOiBvdXRzaWRlOw0KLSAgICBkaXNwbGF5OiBibG9jazsNCi19DQotDQotcCB7DQotfQ0KLQ0KLWEsIGE6bGluayB7DQotICAgIGNvbG9yOiAjMDM5Ow0KLSAgICBmb250LXNpemU6IDExcHg7DQotfQ0KLQ0KLWE6aG92ZXIgew0KLSAgICBjb2xvcjogIzAzYzsNCi0gICAgZm9udC1zaXplOiAxMXB4Ow0KLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotfQ0KLQ0KLWE6dmlzaXRlZCB7DQotICAgIGZvbnQtc2l6ZTogMTFweDsgLyogY29sb3I6ICM5Njk7ICovDQotLyogTm8gbmVlZCB0byBkaXNjb2xvdXIgdmlzaXRlZCBsaW5rcyBhcyB0aGlzIGlzIGEgc3lzdGVtICovDQotfQ0KLQ0KLXVsLCBvbCB7DQotICAgIGZvbnQtc2l6ZTogMTFweDsNCi0gICAgdGV4dC1hbGlnbjogbGVmdDsNCi0gICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTsNCi0gICAgZGlzcGxheTogYmxvY2s7DQotICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7DQotfQ0KLQ0KLXRhYmxlIHRkIHsNCi0gICAgZm9udC1zaXplOiAxMXB4Ow0KLSAgICBwYWRkaW5nOiAwcHg7DQotICAgIHNwYWNpbmc6IDBweDsNCi0gICAgdGV4dC1hbGlnbjogbGVmdDsNCi0gICAgdmVydGljYWwtYWxpZ246IHRvcDsNCi19DQotDQotaDEgew0KLSAgICBjb2xvcjogIzAwMDsNCi0gICAgZm9udC1zaXplOiAxNnB4Ow0KLSAgICBmb250LXdlaWdodDogYm9sZDsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2RjZGNkYzsNCi0gICAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLX0NCi0NCi1oMiB7DQotICAgIGZvbnQtc2l6ZTogMTVweDsNCi0gICAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2E5YTlhOTsNCi0gICAgYm9yZGVyLWxlZnQtY29sb3I6IGJsYWNrOw0KLX0NCi0NCi1oMyB7DQotICAgIGZvbnQtc2l6ZTogMTRweDsNCi0gICAgcGFkZGluZy1sZWZ0OiAxMHB4Ow0KLSAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2QzZDNkMzsNCi19DQotDQotaDQgew0KLSAgICBmb250LXNpemU6IDEzcHg7DQotfQ0KLQ0KLXRoIHsNCi0gICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsNCi0gICAgaGVpZ2h0OiAyMDsNCi0gICAgcGFkZG9uZzogMHB4Ow0KLSAgICBzcGFjaW5nOiAwcHg7DQotfQ0KLQ0KLXRhYmxlIHsNCi0gICAgbWFyZ2luOiAwOw0KLSAgICBwYWRkaW5nOiAwOw0KLSAgICBib3JkZXI6IHNvbGlkIDAgI2RjZGNkYzsNCi19DQotDQotLmhlYWRlciB7DQotICAgIGhlaWdodDogODBweDsNCi0gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCAuLi9pbWFnZXMvZG9jX2hlYWRlci5qcGcgKTsNCi0gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCi0gICAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBzY3JvbGw7DQotICAgIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgdG9wOw0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2RvYXBfQXhpczIucmRmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb2FwX0F4aXMyLnJkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwYjg5Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2RvYXBfQXhpczIucmRmCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCI/PgotPHJkZjpSREYgeG1sOmxhbmc9ImVuIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly91c2VmdWxpbmMuY29tL25zL2RvYXAjIiAKLSAgICAgICAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgCi0gICAgICAgICB4bWxuczphc2ZleHQ9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL25zL2FzZmV4dCMiCi0gICAgICAgICB4bWxuczpmb2FmPSJodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLyI+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gIDxQcm9qZWN0IHJkZjphYm91dD0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiPgotICAgIDxjcmVhdGVkPjIwMDctMDYtMDg8L2NyZWF0ZWQ+Ci0gICAgPGxpY2Vuc2UgcmRmOnJlc291cmNlPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9kb2FwL2xpY2Vuc2VzL2FzbDIwIiAvPgotICAgIDxuYW1lPkFwYWNoZSBTeW5hcHNlPC9uYW1lPgotICAgIDxob21lcGFnZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3N5bmFwc2UiIC8+Ci0gICAgPGFzZmV4dDpwbWMgcmRmOnJlc291cmNlPSJodHRwOi8vd2Vic2VydmljZXMuYXBhY2hlLm9yZyIgLz4KLSAgICA8c2hvcnRkZXNjPkFwYWNoZSBBeGlzMiBpcyBhIHNlcnZpY2UgaG9zdGluZyBhbmQgY29uc3VtcHRpb24gZnJhbWV3b3JrIHRoYXQgbWFrZXMgaXQgZWFzeSB0byB1c2UgU09BUCBhbmQgV2ViIFNlcnZpY2VzPC9zaG9ydGRlc2M+Ci0gICAgPGRlc2NyaXB0aW9uPkFwYWNoZSBBeGlzMiBpcyBhIHRvb2xraXQgZm9yIGNyZWF0aW5nIGFuZCB1c2luZyBXZWIgU2VydmljZXMsIGluY2x1ZGluZyBTT0FQLCBNVE9NLCBYTUwvSFRUUCBhbmQgYWR2YW5jZWQgV1MtKiBzdGFuZGFyZHMgc3VjaCBhcyBXU1JNIGFuZCBXU1NlY3VyaXR5LgotICAgIEF4aXMyIGluY2x1ZGVzIGEgdmVyeSBmYXN0IHJ1bnRpbWUgZW5naW5lLCB0b2dldGhlciB3aXRoIHRvb2xpbmcgc3VwcG9ydCBmb3IgV1NETCBhbmQgV1MtUG9saWN5LCBhbmQgcGx1Z2luIHN1cHBvcnQgZm9yIFdTLUFkZHJlc3NpbmcsIFdTLVJlbGlhYmxlTWVzc2FnaW5nLCBXUy1TZWN1cml0eSwgCi0gICAgV1MtRXZlbnRpbmcsIFdTLVRyYW5zYWN0aW9ucywgV1MtVHJ1c3QgYW5kIFdTLVNlY3VyZUNvbnZlcnNhdGlvbi4KLSAgICBBeGlzMiBydW5zIGVpdGhlciBzdGFuZGFsb25lIG9yIGhvc3RlZCBpbiBUb21jYXQgb3Igb3RoZXIgc2VydmxldCBjb250YWluZXJzLiAKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxidWctZGF0YWJhc2UgcmRmOnJlc291cmNlPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyIiAvPgotICAgIDxtYWlsaW5nLWxpc3QgcmRmOnJlc291cmNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tYWlsLWxpc3RzLmh0bWwiIC8+Ci0gICAgPGRvd25sb2FkLXBhZ2UgcmRmOnJlc291cmNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiIC8+Ci0gICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmE8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgotICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KLSAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS94bWwiIC8+Ci0gICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2NhdGVnb3J5L2h0dHAiLz4KLSAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvY2F0ZWdvcnkvbmV0d29yay1zZXJ2ZXIiLz4KLSAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvY2F0ZWdvcnkvbmV0d29yay1jbGllbnQiLz4KLSAgICAKLSAgICA8cmVsZWFzZT4KLSAgICAgIDxWZXJzaW9uPgotICAgICAgICA8bmFtZT5BcGFjaGUgQXhpczIgMS4wPC9uYW1lPgotICAgICAgICA8Y3JlYXRlZD4yMDA2LTA1LTA0PC9jcmVhdGVkPgotICAgICAgICA8cmV2aXNpb24+MS4wPC9yZXZpc2lvbj4KLSAgICAgIDwvVmVyc2lvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgPHJlbGVhc2U+Ci0gICAgICA8VmVyc2lvbj4KLSAgICAgICAgPG5hbWU+QXBhY2hlIEF4aXMyIDEuMTwvbmFtZT4KLSAgICAgICAgPGNyZWF0ZWQ+MjAwNi0xMS0xMzwvY3JlYXRlZD4KLSAgICAgICAgPHJldmlzaW9uPjEuMTwvcmV2aXNpb24+Ci0gICAgICA8L1ZlcnNpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIDxyZWxlYXNlPgotICAgICAgPFZlcnNpb24+Ci0gICAgICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAxLjEuMTwvbmFtZT4KLSAgICAgICAgPGNyZWF0ZWQ+MjAwNy0wMS0wOTwvY3JlYXRlZD4KLSAgICAgICAgPHJldmlzaW9uPjEuMS4xPC9yZXZpc2lvbj4KLSAgICAgIDwvVmVyc2lvbj4KLSAgICA8L3JlbGVhc2U+Ci0gICAgCi0gICAgPHJlbGVhc2U+Ci0gICAgICA8VmVyc2lvbj4KLSAgICAgICAgPG5hbWU+QXBhY2hlIEF4aXMyIDEuMjwvbmFtZT4KLSAgICAgICAgPGNyZWF0ZWQ+MjAwNy0wNC0yNzwvY3JlYXRlZD4KLSAgICAgICAgPHJldmlzaW9uPjEuMjwvcmV2aXNpb24+Ci0gICAgICA8L1ZlcnNpb24+Ci0gICAgPC9yZWxlYXNlPgotICAgIAotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPFNWTlJlcG9zaXRvcnk+Ci0gICAgICAgIDxsb2NhdGlvbiByZGY6cmVzb3VyY2U9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YSIvPgotICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhLyIvPgotICAgICAgPC9TVk5SZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8bWFpbnRhaW5lcj4KLSAgICAgIDxmb2FmOlBlcnNvbj4KLSAgICAgICAgPGZvYWY6bmFtZT5QYXVsIEZyZW1hbnRsZTwvZm9hZjpuYW1lPgotICAgICAgICAgIDxmb2FmOm1ib3ggcmRmOnJlc291cmNlPSJtYWlsdG86cHpmQGFwYWNoZS5vcmciLz4KLSAgICAgIDwvZm9hZjpQZXJzb24+Ci0gICAgPC9tYWludGFpbmVyPgotICAgIDxhc2ZleHQ6aW1wbGVtZW50cz48YXNmZXh0OlN0YW5kYXJkPgotICAgICAgPGFzZmV4dDp0aXRsZT5TT0FQMS4xPC9hc2ZleHQ6dGl0bGU+Ci0gICAgICA8YXNmZXh0OmJvZHk+VzNDPC9hc2ZleHQ6Ym9keT4KLSAgICAgIDxhc2ZleHQ6aWQ+U09BUDEuMTwvYXNmZXh0OmlkPgotICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy9UUi9zb2FwLyIvPgotICAgIDwvYXNmZXh0OlN0YW5kYXJkPjwvYXNmZXh0OmltcGxlbWVudHM+Ci0gICAgPGFzZmV4dDppbXBsZW1lbnRzPjxhc2ZleHQ6U3RhbmRhcmQ+Ci0gICAgICA8YXNmZXh0OnRpdGxlPlNPQVAxLjI8L2FzZmV4dDp0aXRsZT4KLSAgICAgIDxhc2ZleHQ6Ym9keT5XM0M8L2FzZmV4dDpib2R5PgotICAgICAgPGFzZmV4dDppZD5TT0FQMS4yPC9hc2ZleHQ6aWQ+Ci0gICAgICA8YXNmZXh0OnVybCByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3NvYXAxMi1wYXJ0MS8iLz4KLSAgICA8L2FzZmV4dDpTdGFuZGFyZD48L2FzZmV4dDppbXBsZW1lbnRzPgotICAgIDxhc2ZleHQ6aW1wbGVtZW50cz48YXNmZXh0OlN0YW5kYXJkPgotICAgICAgPGFzZmV4dDp0aXRsZT5NVE9NPC9hc2ZleHQ6dGl0bGU+Ci0gICAgICA8YXNmZXh0OmJvZHk+VzNDPC9hc2ZleHQ6Ym9keT4KLSAgICAgIDxhc2ZleHQ6aWQ+U09BUC1NVE9NPC9hc2ZleHQ6aWQ+Ci0gICAgICA8YXNmZXh0OnVybCByZGY6cmVzb3VyY2U9Imh0dHA6Ly93d3cudzMub3JnL1RSL3NvYXAxMi1tdG9tLyIvPgotICAgIDwvYXNmZXh0OlN0YW5kYXJkPjwvYXNmZXh0OmltcGxlbWVudHM+Ci0gICAgPGFzZmV4dDppbXBsZW1lbnRzPjxhc2ZleHQ6U3RhbmRhcmQ+Ci0gICAgICA8YXNmZXh0OnRpdGxlPkhUVFA8L2FzZmV4dDp0aXRsZT4KLSAgICAgIDxhc2ZleHQ6Ym9keT5JRVRGPC9hc2ZleHQ6Ym9keT4KLSAgICAgIDxhc2ZleHQ6aWQ+SFRUUCAxLjE8L2FzZmV4dDppZD4KLSAgICAgIDxhc2ZleHQ6dXJsIHJkZjpyZXNvdXJjZT0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi5odG1sIi8+Ci0gICAgPC9hc2ZleHQ6U3RhbmRhcmQ+PC9hc2ZleHQ6aW1wbGVtZW50cz4KLSAgICA8YXNmZXh0OmltcGxlbWVudHM+PGFzZmV4dDpTdGFuZGFyZD4KLSAgICAgIDxhc2ZleHQ6dGl0bGU+V1MtQWRkcmVzc2luZzwvYXNmZXh0OnRpdGxlPgotICAgICAgPGFzZmV4dDpib2R5PlczQzwvYXNmZXh0OmJvZHk+Ci0gICAgICA8YXNmZXh0OmlkPldTQTwvYXNmZXh0OmlkPgotICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAyL3dzL2FkZHIvIi8+Ci0gICAgPC9hc2ZleHQ6U3RhbmRhcmQ+PC9hc2ZleHQ6aW1wbGVtZW50cz4KLSAgICA8YXNmZXh0OmltcGxlbWVudHM+PGFzZmV4dDpTdGFuZGFyZD4KLSAgICAgIDxhc2ZleHQ6dGl0bGU+V1MtUmVsaWFibGVNZXNzYWdpbmc8L2FzZmV4dDp0aXRsZT4KLSAgICAgIDxhc2ZleHQ6Ym9keT5PQVNJUzwvYXNmZXh0OmJvZHk+Ci0gICAgICA8YXNmZXh0OmlkPldTUk08L2FzZmV4dDppZD4KLSAgICAgIDxhc2ZleHQ6dXJsIHJkZjpyZXNvdXJjZT0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3RjX2hvbWUucGhwP3dnX2FiYnJldj13cy1yeCIvPgotICAgIDwvYXNmZXh0OlN0YW5kYXJkPjwvYXNmZXh0OmltcGxlbWVudHM+Ci0gICAgPGFzZmV4dDppbXBsZW1lbnRzPjxhc2ZleHQ6U3RhbmRhcmQ+Ci0gICAgICA8YXNmZXh0OnRpdGxlPldTLVNlY3VyaXR5PC9hc2ZleHQ6dGl0bGU+Ci0gICAgICA8YXNmZXh0OmJvZHk+T0FTSVM8L2FzZmV4dDpib2R5PgotICAgICAgPGFzZmV4dDppZD5XU1NFQzwvYXNmZXh0OmlkPgotICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZG93bmxvYWQucGhwLzE2NzkwL3dzcy12MS4xLXNwZWMtb3MtU09BUE1lc3NhZ2VTZWN1cml0eS5wZGYiLz4KLSAgICA8L2FzZmV4dDpTdGFuZGFyZD48L2FzZmV4dDppbXBsZW1lbnRzPgotICA8L1Byb2plY3Q+Ci08L3JkZjpSREY+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZDFmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5SZWxlYXNlczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkFwYWNoZSBBeGlzMiBSZWxlYXNlczwvaDI+DQotPGRpdiBhbGlnbj0ibGVmdCI+DQotPHA+VGhpcyBwYWdlIHByb3ZpZGVzIGxpbmtzIHRvIHRoZSByZWxlYXNlIHZlcnNpb25zIG9mIEF4aXMyIEphdmEuDQotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLmh0bWwiPkFwYWNoZSBSZWxlYXNlDQotRkFRPC9hPi48L3A+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0iY2VudGVyIj4NCi08dGFibGUgYm9yZGVyPSIxIiBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSIgd2lkdGg9IjkzJSIgaWQ9DQotInRhYmxlMSI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGg+VmVyc2lvbjwvdGg+DQotPHRoPkRhdGU8L3RoPg0KLTx0aD5EZXNjcmlwdGlvbjwvdGg+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzFfNV8xL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjUuMTwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4yMyAtIE9jdCAtIDIwMDk8L3RkPg0KLTx0ZD4xLjUuMSBSZWxlYXNlIChNaXJyb3JlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8xXzUvZG93bmxvYWQuY2dpIj48c3Ryb25nPjEuNTwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4wOSAtIEp1biAtIDIwMDk8L3RkPg0KLTx0ZD4xLjUgUmVsZWFzZSAoTWlycm9yZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMV80XzEvZG93bmxvYWQuY2dpIj48c3Ryb25nPjEuNC4xPC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjI0IC0gQXVnIC0gMjAwODwvdGQ+DQotPHRkPjEuNC4xIFJlbGVhc2UgKE1pcnJvcmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzFfNC9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MS40PC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjA1IC0gRmViIC0gMjAwODwvdGQ+DQotPHRkPjEuNCBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8xXzMvZG93bmxvYWQuY2dpIj48c3Ryb25nPjEuMzwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4wNiAtIEp1bCAtIDIwMDc8L3RkPg0KLTx0ZD4xLjMgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMV8yL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjI8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MjcgLSBBcHIgLSAyMDA3PC90ZD4NCi08dGQ+MS4yIFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzFfMV8xL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjEuMTwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4wOSAtIEphbiAtIDIwMDc8L3RkPg0KLTx0ZD4xLjEuMSBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8xXzEvZG93bmxvYWQuY2dpIj48c3Ryb25nPjEuMTwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4xMyAtIE5vdiAtIDIwMDY8L3RkPg0KLTx0ZD4xLjEgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMV8wL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4xLjA8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MDQgLSBNYXkgLSAyMDA2PC90ZD4NCi08dGQ+MS4wIFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzBfOTUvZG93bmxvYWQuY2dpIj48c3Ryb25nPjAuOTU8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MjMgLSBNYXIgLSAyMDA2PC90ZD4NCi08dGQ+MC45NSBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8wXzk0L2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4wLjk0PC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjExIC0gSmFuIC0gMjAwNjwvdGQ+DQotPHRkPjAuOTQgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMF85My9kb3dubG9hZC5jZ2kiPjxzdHJvbmc+MC45Mzwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4xMiAtIEZlYiAtIDIwMDU8L3RkPg0KLTx0ZD4wLjkzIFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9DQotImRvd25sb2FkLzBfOTIvZG93bmxvYWQuY2dpIj48c3Ryb25nPjAuOTI8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MjYgLSBBdWcgLSAyMDA1PC90ZD4NCi08dGQ+MC45MiBSZWxlYXNlIChBcmNoaXZlZCk8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJkb3dubG9hZC8wXzkxL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4wLjkxPC9zdHJvbmc+PC9hPjwvdGQ+DQotPHRkPjE2IC0gQXVnIC0gMjAwNTwvdGQ+DQotPHRkPjAuOTEgUmVsZWFzZSAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0NCi0iZG93bmxvYWQvMF85L2Rvd25sb2FkLmNnaSI+PHN0cm9uZz4wLjk8L3N0cm9uZz48L2E+PC90ZD4NCi08dGQ+MDUgLSBKdWwgLSAyMDA1PC90ZD4NCi08dGQ+MC45IFJlbGVhc2UgKEFyY2hpdmVkKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9ImRvd25sb2FkL00yL2Rvd25sb2FkLmNnaSI+PHN0cm9uZz5NMjwvc3Ryb25nPjwvYT48L3RkPg0KLTx0ZD4wOCAtIEp1biAtIDIwMDU8L3RkPg0KLTx0ZD5NaWxlc3RvbmUgUmVsZWFzZSAjMiAoQXJjaGl2ZWQpPC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08L2Rpdj4NCi08cD48c3Ryb25nPkF4aXMyIERpc3RyaWJ1dGlvbnMgOiA8YSBocmVmPQ0KLSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvZGlzdC9heGlzMi9uaWdodGx5Ij5OaWdodGx5DQotYnVpbGRzPC9hPjwvc3Ryb25nPjwvcD4NCi08cD48c3Ryb25nPkF4aXMyIE1hdmVuIFJlcG9zaXRvcnk6IDxhIGhyZWY9DQotImh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20xLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeS9vcmcuYXBhY2hlLmF4aXMyLyI+DQotUmVsZWFzZWQgQXhpczIgamFyczwvYT4gfCA8YSBocmVmPQ0KLSJodHRwOi8vY3ZzLmFwYWNoZS5vcmcvcmVwb3NpdG9yeS9vcmcuYXBhY2hlLmF4aXMyL2phcnMvIj5OaWdodGx5DQotU05BUFNIT1Q8L2E+PGEgaHJlZj0NCi0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3JlcG9zaXRvcnkvb3JnLmFwYWNoZS5heGlzMi9qYXJzLyI+PC9hPjwvc3Ryb25nPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85L2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85L2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOS9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOS9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOS9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzExYTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMC45IFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgMC45IFJlbGVhc2U8L2gyPg0KLTxkaXYgYWxpZ249ImxlZnQiPg0KLTxoMz5Tb3VyY2UgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85L2F4aXMyLTAuOS1zcmMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85L2F4aXMyLTAuOS1zcmMuemlwIj56aXA8L2E+PGJyIC8+DQotPC9wPg0KLTxoMz5CaW5hcnkgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85L2F4aXMyLTAuOS1iaW4uemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85L2F4aXMyLTAuOS1iaW4uemlwIj56aXA8L2E+PC9wPg0KLTwvZGl2Pg0KLTwhLS08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08YnIvPg0KLQ0KLQ0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIj48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYNCi15b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYNCi1hbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUNCi1taXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+DQotDQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+DQotICBPdGhlciBtaXJyb3JzOiANCi0gIDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj5baWYtYW55IGh0dHBdW2ZvciBodHRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbaHR0cF0iDQotICAgIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgZnRwXVtmb3IgZnRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBiYWNrdXBdW2ZvciBiYWNrdXBdDQotICAgIDxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdW2VuZF0NCi0gIDwvc2VsZWN0Pg0KLSAgIA0KLSAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSI+PC9mb3JtPg0KLQ0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlDQotbGlzdCBvZiBtaXJyb3JzPC9hPi48L3A+DQotDQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlIGNoZWNrIHRoZSA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQgdmVyaWZ5DQotdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlIGRvd25sb2FkZWQgYnkNCi1mb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucyB0aGUNCi1wdWJsaWMga2V5cyB1c2VkIGZvciBzaWduaW5nIHJlbGVhc2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpDQotYSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pi0tPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkxL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85MS9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkxL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85MS9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTEvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTE4Mjk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85MS9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5BeGlzMiAwLjkxIFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgMC45MSBSZWxlYXNlPC9oMj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08aDM+U291cmNlIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1zcmMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLXNyYy56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkxL2F4aXMyLTAuOTEtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkxL2F4aXMyLTAuOTEtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPGgzPkJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLWJpbi56aXAiIHRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1iaW4uemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTEvYXhpczItMC45MS1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLWJpbi56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85MS9heGlzMi0wLjkxLWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTwvZGl2Pg0KLTwhLS08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08YnIvPg0KLQ0KLQ0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIj48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYNCi15b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYNCi1hbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUNCi1taXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+DQotDQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+DQotICBPdGhlciBtaXJyb3JzOiANCi0gIDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj5baWYtYW55IGh0dHBdW2ZvciBodHRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbaHR0cF0iDQotICAgIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgZnRwXVtmb3IgZnRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBiYWNrdXBdW2ZvciBiYWNrdXBdDQotICAgIDxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdW2VuZF0NCi0gIDwvc2VsZWN0Pg0KLSAgIA0KLSAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSI+PC9mb3JtPg0KLQ0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlDQotbGlzdCBvZiBtaXJyb3JzPC9hPi48L3A+DQotDQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlIGNoZWNrIHRoZSA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQgdmVyaWZ5DQotdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlIGRvd25sb2FkZWQgYnkNCi1mb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucyB0aGUNCi1wdWJsaWMga2V5cyB1c2VkIGZvciBzaWduaW5nIHJlbGVhc2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpDQotYSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pi0tPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkyL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85Mi9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkyL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85Mi9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTIvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTkyZWY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85Mi9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMC45MiBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIDAuOTIgUmVsZWFzZTwvaDI+DQotPGRpdj4NCi08aDM+U291cmNlIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1zcmMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLXNyYy56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPGgzPkJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL2F4aXMyLTAuOTItYmluLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1iaW4uemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvYXhpczItMC45Mi1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLWJpbi56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9heGlzMi0wLjkyLWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5QbHVnaW5zIERpc3RyaWJ1dGlvbjwvaDM+DQotQXhpczIgQ29kZSBHZW5lcmF0b3IgZWNsaXBzZSBwbHVnaW4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvQXhpczJfQ29kZV9HZW5lcmF0b3IuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9BeGlzMl9Db2RlX0dlbmVyYXRvci56aXAiPg0KLXppcDwvYT48YnIgLz4NCi1BeGlzMiBTZXJ2aWNlIEFyY2hpdmVyIGVjbGlwc2UgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL0F4aXMyX1NlcnZpY2VfYXJjaGl2ZXIuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85Mi9BeGlzMl9TZXJ2aWNlX2FyY2hpdmVyLnppcCI+DQotemlwPC9hPjxiciAvPg0KLUF4aXMyIFdpemFyZCBCdW5kbGUgZWNsaXBzZSBwbHVnaW4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvQXhpczJfV2l6YXJkX0J1bmRsZS56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkyL0F4aXMyX1dpemFyZF9CdW5kbGUuemlwIj4NCi16aXA8L2E+PGJyIC8+DQotSURFQSBwbHVnaW4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvQXhpczJJZGVhcGx1Z2luLmphciINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTIvQXhpczJJZGVhcGx1Z2luLmphciI+amFyPC9hPjwvZGl2Pg0KLTwhLS08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08YnIvPg0KLQ0KLQ0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIj48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYNCi15b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYNCi1hbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUNCi1taXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+DQotDQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+DQotICBPdGhlciBtaXJyb3JzOiANCi0gIDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj5baWYtYW55IGh0dHBdW2ZvciBodHRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbaHR0cF0iDQotICAgIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgZnRwXVtmb3IgZnRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBiYWNrdXBdW2ZvciBiYWNrdXBdDQotICAgIDxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdW2VuZF0NCi0gIDwvc2VsZWN0Pg0KLSAgIA0KLSAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSI+PC9mb3JtPg0KLQ0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlDQotbGlzdCBvZiBtaXJyb3JzPC9hPi48L3A+DQotDQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlIGNoZWNrIHRoZSA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQgdmVyaWZ5DQotdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlIGRvd25sb2FkZWQgYnkNCi1mb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucyB0aGUNCi1wdWJsaWMga2V5cyB1c2VkIGZvciBzaWduaW5nIHJlbGVhc2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpDQotYSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pi0tPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkzL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85My9kb3dubG9hZC5jZ2kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhOWY4ZDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzkzL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85My9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTMvZG93bmxvYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGRmODcwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85My9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMC45MyBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIDAuOTMgUmVsZWFzZTwvaDI+DQotPGRpdj4NCi08aDM+U291cmNlIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1zcmMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLXNyYy56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPGgzPkJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzkzL2F4aXMyLTAuOTMtYmluLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1iaW4uemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLWJpbi56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi0wLjkzLWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+PC9wPg0KLTxoMz5XYXIgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi53YXIiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi53YXIubWQ1IiB0aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85My9heGlzMi53YXIuYXNjIiB0aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTMvYXhpczItMC45My1zcmMuemlwLmFzYyI+DQotUEdQPC9hPjwvcD4NCi08L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85NC9kb3dubG9hZC5jZ2kgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTQvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85NC9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTQvZG93bmxvYWQueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk0L2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2NGM5Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTQvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDAuOTQgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5BeGlzMiAwLjk0IFJlbGVhc2U8L2gyPg0KLTxkaXYgYWxpZ249ImxlZnQiPg0KLTxwPlNlZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8wXzk0L2luc3RhbGxhdGlvbmd1aWRlLmh0bWwiPkluc3RhbGxhdGlvbg0KLUd1aWRlPC9hPiB0byBzZWUgZGVzY3JpcHRpb24gb24gZGlmZmVyZW50IGRvd25sb2FkYWJsZXMgb2YgdGhpcw0KLXJlbGVhc2UuPC9wPg0KLTwvZGl2Pg0KLTxkaXY+DQotPGgzPlN0YW5kYXJkIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+QmluYXJ5IERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1iaW4uemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1iaW4uemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LWJpbi56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtYmluLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi1Tb3VyY2UgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LXNyYy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LXNyYy56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItc3RkLTAuOTQtc3JjLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LXNyYy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLXN0ZC0wLjk0LXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1zdGQtMC45NC1zcmMuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPjwvcD4NCi08aDM+TWluaW1hbCBEaXN0cmlidXRpb248L2gzPg0KLTxwPkJpbmFyeSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtYmluLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtYmluLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtYmluLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtYmluLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotU291cmNlIERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1zcmMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1zcmMuemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLW1pbi0wLjk0LXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi1taW4tMC45NC1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItbWluLTAuOTQtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPGgzPldhciBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLndhciINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczIud2FyIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczIud2FyLm1kNSIgdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLndhci5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi53YXIuYXNjIiB0aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczIud2FyLmFzYyI+UEdQPC9hPjwvcD4NCi08aDM+RG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvaDM+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItMC45NC1kb2NzLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItMC45NC1kb2NzLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L2F4aXMyLTAuOTQtZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi0wLjk0LWRvY3MuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9heGlzMi0wLjk0LWRvY3MuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvYXhpczItMC45NC1kb2NzLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz48L3A+DQotPGgzPlBsdWdpbnMgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD5BeGlzMiBTZXJ2aWNlIEFyY2hpdmVyIGVjbGlwc2UgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX1NlcnZpY2VfQXJjaGl2ZXIuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX1NlcnZpY2VfQXJjaGl2ZXIuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NC9BeGlzMl9TZXJ2aWNlX0FyY2hpdmVyLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX1NlcnZpY2VfQXJjaGl2ZXIuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLUF4aXMyIENvZGUgR2VuZXJhdG9yIGVjbGlwc2UgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJfQ29kZV9HZW5lcmF0b3IuemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMyX0NvZGVfR2VuZXJhdG9yLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJfQ29kZV9HZW5lcmF0b3IuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJfQ29kZV9HZW5lcmF0b3IuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLUlERUEgcGx1Z2luIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMySWRlYV9wbHVnX2luLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJJZGVhX3BsdWdfaW4uemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMySWRlYV9wbHVnX2luLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk0L0F4aXMySWRlYV9wbHVnX2luLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJJZGVhX3BsdWdfaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTQvQXhpczJJZGVhX3BsdWdfaW4uemlwLmFzYyI+DQotUEdQPC9hPjwvcD4NCi08L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85NS9kb3dubG9hZC5jZ2kgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTUvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMF85NS9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTUvZG93bmxvYWQueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8wXzk1L2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNDJhZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzBfOTUvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDAuOTUgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5BeGlzMiAwLjk1IFJlbGVhc2U8L2gyPg0KLTxwPlNlZSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8wXzk1L2luc3RhbGxhdGlvbmd1aWRlLmh0bWwiPkluc3RhbGxhdGlvbg0KLUd1aWRlPC9hPiB0byBzZWVkZXNjcmlwdGlvbiBvbiBkaWZmZXJlbnQgZG93bmxvYWRhYmxlcyBvZiB0aGlzDQotcmVsZWFzZS48L3A+DQotPGRpdj4NCi08aDM+U3RhbmRhcmQgRGlzdHJpYnV0aW9uPC9oMz4NCi1CaW5hcnkgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LWJpbi56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LWJpbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LWJpbi56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLVNvdXJjZSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtc3JjLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1zdGQtMC45NS1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItc3RkLTAuOTUtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLXN0ZC0wLjk1LXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotPGgzPk1pbmltYWwgRGlzdHJpYnV0aW9uPC9oMz4NCi1CaW5hcnkgRGlzdHJpYnV0aW9uIDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LWJpbi56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LWJpbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LWJpbi56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPg0KLVNvdXJjZSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtc3JjLnppcCI+DQotemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi1taW4tMC45NS1zcmMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItbWluLTAuOTUtc3JjLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLW1pbi0wLjk1LXNyYy56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotPGgzPldhciBEaXN0cmlidXRpb248L2gzPg0KLTxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLndhciINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczIud2FyIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczIud2FyLm1kNSIgdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLndhci5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi53YXIuYXNjIiB0aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczIud2FyLmFzYyI+UEdQPC9hPjxiciAvPg0KLQ0KLTxoMz5Eb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9oMz4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi0wLjk1LWRvY3MuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzBfOTUvYXhpczItMC45NS1kb2NzLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLTAuOTUtZG9jcy56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8wXzk1L2F4aXMyLTAuOTUtZG9jcy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMF85NS9heGlzMi0wLjk1LWRvY3MuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPjwvcD4NCi08L2Rpdj4NCi08IS0tPGRpdiBhbGlnbj0ibGVmdCI+DQotPGJyLz4NCi0NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCI+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzIDxiPltwcmVmZXJyZWRdPC9iPi4gIElmDQoteW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwgcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gIElmDQotYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZSA8aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlDQotbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZCBiZSBhdmFpbGFibGUuPC9wPg0KLQ0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiPg0KLSAgT3RoZXIgbWlycm9yczogDQotICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+W2lmLWFueSBodHRwXVtmb3IgaHR0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIg0KLSAgICBzZWxlY3RlZD0ic2VsZWN0ZWQiPltodHRwXTwvb3B0aW9uPltlbmRdW2VuZF1baWYtYW55IGZ0cF1bZm9yIGZ0cF0NCi0gICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgYmFja3VwXVtmb3IgYmFja3VwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXVtlbmRdDQotICA8L3NlbGVjdD4NCi0gICANCi0gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiPjwvZm9ybT4NCi0NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZQ0KLWxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLQ0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZSBjaGVjayB0aGUgPGENCi1ocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kIHZlcmlmeQ0KLXRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZSBkb3dubG9hZGVkIGJ5DQotZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMgdGhlDQotcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKQ0KLWEgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4tLT4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8wL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8wL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMC9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMC9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMC9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzEzZmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzAvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDEuMCBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPkF4aXMyIDEuMCBSZWxlYXNlPC9oMj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08cD5TZWUgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8wL2luc3RhbGxhdGlvbmd1aWRlLmh0bWwjRG93bmxvYWRfQXhpczIiPg0KLUluc3RhbGxhdGlvbiBHdWlkZTwvYT4gdG8gc2VlIGRlc2NyaXB0aW9uIG9uIGRpZmZlcmVudA0KLWRvd25sb2FkYWJsZXMgb2YgdGhpcyByZWxlYXNlLjwvcD4NCi08L2Rpdj4NCi08ZGl2Pg0KLTxoMz5TdGFuZGFyZCBEaXN0cmlidXRpb248L2gzPg0KLUJpbmFyeSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1iaW4uemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLWJpbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItc3RkLTEuMC1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotU291cmNlIERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLXN0ZC0xLjAtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLXNyYy56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLXN0ZC0xLjAtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1zdGQtMS4wLXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLXN0ZC0xLjAtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi08aDM+TWluaW1hbCBEaXN0cmlidXRpb248L2gzPg0KLUJpbmFyeSBEaXN0cmlidXRpb24gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1iaW4uemlwIj4NCi16aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1iaW4uemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLWJpbi56aXAubWQ1Ij4NCi1NRDU8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItbWluLTEuMC1iaW4uemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLWJpbi56aXAuYXNjIj4NCi1QR1A8L2E+PGJyIC8+DQotU291cmNlIERpc3RyaWJ1dGlvbiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLW1pbi0xLjAtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLXNyYy56aXAiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLW1pbi0xLjAtc3JjLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi1taW4tMS4wLXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLW1pbi0xLjAtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48YnIgLz4NCi08aDM+V2FyIERpc3RyaWJ1dGlvbjwvaDM+DQotPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi53YXIiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczIud2FyIj56aXA8L2E+DQotPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi53YXIubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLndhci5tZDUiPk1ENTwvYT4NCi08YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLndhci5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczIud2FyLmFzYyI+UEdQPC9hPjxiciAvPg0KLQ0KLTxoMz5Eb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9oMz4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLTEuMC1kb2NzLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMC9heGlzMi0xLjAtZG9jcy56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLTEuMC1kb2NzLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItMS4wLWRvY3MuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8wL2F4aXMyLTEuMC1kb2NzLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzAvYXhpczItMS4wLWRvY3MuemlwLmFzYyI+DQotUEdQPC9hPjxiciAvPjwvZGl2Pg0KLTwhLS08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08YnIvPg0KLQ0KLQ0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIj48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYNCi15b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYNCi1hbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUNCi1taXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+DQotDQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+DQotICBPdGhlciBtaXJyb3JzOiANCi0gIDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj5baWYtYW55IGh0dHBdW2ZvciBodHRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbaHR0cF0iDQotICAgIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgZnRwXVtmb3IgZnRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBiYWNrdXBdW2ZvciBiYWNrdXBdDQotICAgIDxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdW2VuZF0NCi0gIDwvc2VsZWN0Pg0KLSAgIA0KLSAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSI+PC9mb3JtPg0KLQ0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlDQotbGlzdCBvZiBtaXJyb3JzPC9hPi48L3A+DQotDQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlIGNoZWNrIHRoZSA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQgdmVyaWZ5DQotdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlIGRvd25sb2FkZWQgYnkNCi1mb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucyB0aGUNCi1wdWJsaWMga2V5cyB1c2VkIGZvciBzaWduaW5nIHJlbGVhc2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpDQotYSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pi0tPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzEvZG93bmxvYWQuY2dpIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzEvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xL2Rvd25sb2FkLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4MjE1ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMS9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMS4xIFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgMS4xIFJlbGVhc2U8L2gyPg0KLTxkaXY+DQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRoIHNjb3BlPSJjb2wiPkRpc3RyaWJ1dGlvbiBOYW1lPC90aD4NCi08dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPg0KLTwhLS08dGggc2NvcGU9ImNvbCI+SXRlbXM8L3RoPi0tPg0KLTx0aCBzY29wZT0iY29sIj5Eb3dubG9hZDwvdGg+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InN0ZC1iaW4iIGlkPSJzdGQtYmluIj48L2E+PHN0cm9uZz5TdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIGlzIHRoZSBjb21wbGV0ZSB2ZXJzaW9uIG9mIEF4aXMyIGFuZCB3aWxsIGNvbnRhaW4gdXNlZnVsDQotc2FtcGxlcyBhcyB3ZWxsLiBVc2VmdWwgZm9yIHNvbWUgb25lIHRvIGdldCBmYW1pbGlhciB3aXRoIEF4aXMyLg0KLShTaW5jZSBXUy1BZGRyZXNzaW5nIGltcGxlbWVudGF0aW9uIG1vZHVsZSBpcyBlbmdhZ2VkIGluIHRvIEF4aXMyLA0KLWJ5IGRlZmF1bHQsIHRoaXMgZGlzdHJpYnV0aW9uIHdpbGwgY29udGFpbiBhZGRyZXNzaW5nLm1hci4gQnV0IHRoZQ0KLW90aGVyIG1vZHVsZXMgdGhhdCBhcmUgYmVpbmcgZGV2ZWxvcGVkIHdpdGhpbiBBeGlzMiB3aWxsIG5vdCBiZQ0KLWluY2x1ZGVkIGhlcmUgYW5kIGFyZSBhdmFpbGFibGUgdG8gYmUgZG93bmxvYWRlZCBzZXBhcmF0ZWx5IGZyb20NCi08YSBocmVmPSIuLi8uLi9tb2R1bGVzL2luZGV4Lmh0bWwiPmhlcmU8L2E+Lik8L3RkPg0KLTx0ZD48YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS56aXAiIHRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InNyYyIgaWQ9InNyYyI+PC9hPiA8c3Ryb25nPlNvdXJjZQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIHRoZSBzb3VyY2VzIG9mIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4NCi1PbmUgY2FuIGdlbmVyYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmcm9tIHRoaXMgYnkgdHlwaW5nDQotPHNwYW4gY2xhc3M9InN0eWxlMSI+JG1hdmVuIGRpc3Qtc3RhbmRhcmQtYmluLjwvc3Bhbj4gKDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMS9pbnN0YWxsYXRpb25ndWlkZS5odG1sI2Vudi1zcmMiPlNldA0KLXVwIEF4aXMyIGVudmlyb25tZW50PC9hPiBiZWZvcmUgcnVubmluZyB0aGlzIGNvbW1hbmQpPC90ZD4NCi08dGQ+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtc3JjLnppcCINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtc3JjLnppcCI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJ3YXIiIGlkPSJ3YXIiPjwvYT48c3Ryb25nPldBUiAoV2ViIEFyY2hpdmUpDQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGJlIHRoZSB3ZWIgYXBwbGljYXRpb24gb2YgQXhpczIgd2hpY2ggY2FuIGJlIGRlcGxveWVkDQotaW4gbW9zdCBvZiB0aGUgc2VydmxldCBjb250YWluZXJzLjwvdGQ+DQotPHRkPjxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczIud2FyIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLndhciI+emlwPC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczIud2FyLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi53YXIubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi53YXIuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLndhci5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkRvY3VtZW50cyBEaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgY29udGFpbiBhbGwgdGhlIGRvY3VtZW50YXRpb24gaW4gb25lIHBhY2thZ2UuPC90ZD4NCi08dGQ+PGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtZG9jcy56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzEvYXhpczItMS4xLWRvY3MuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS1kb2NzLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMS9heGlzMi0xLjEtZG9jcy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xL2F4aXMyLTEuMS1kb2NzLnppcC5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTwvZGl2Pg0KLTwhLS08ZGl2IGFsaWduPSJsZWZ0Ij4NCi08YnIvPg0KLQ0KLQ0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIj48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMgPGI+W3ByZWZlcnJlZF08L2I+LiAgSWYNCi15b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLCBwbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiAgSWYNCi1hbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlIDxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUNCi1taXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZS48L3A+DQotDQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+DQotICBPdGhlciBtaXJyb3JzOiANCi0gIDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj5baWYtYW55IGh0dHBdW2ZvciBodHRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbaHR0cF0iDQotICAgIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+W2VuZF1bZW5kXVtpZi1hbnkgZnRwXVtmb3IgZnRwXQ0KLSAgICA8b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXVtlbmRdW2lmLWFueSBiYWNrdXBdW2ZvciBiYWNrdXBdDQotICAgIDxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdW2VuZF0NCi0gIDwvc2VsZWN0Pg0KLSAgIA0KLSAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSI+PC9mb3JtPg0KLQ0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlDQotbGlzdCBvZiBtaXJyb3JzPC9hPi48L3A+DQotDQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlIGNoZWNrIHRoZSA8YQ0KLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQgdmVyaWZ5DQotdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlIGRvd25sb2FkZWQgYnkNCi1mb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhDQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucyB0aGUgDQotcHVibGljIGtleXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmVyaWZ5aW5nIHNpZ25hdHVyZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgDQotKHdoZW4gcG9zc2libGUpYSANCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pi0tPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzFfMS9kb3dubG9hZC5jZ2kgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMV8xL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMV8xL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8xXzEvZG93bmxvYWQueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzFfMS9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNzBiODAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzFfMS9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMS4xLjEgUmVsZWFzZTwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMj5BeGlzMiAxLjEuMSBSZWxlYXNlPC9oMj4NCi08ZGl2Pg0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0aCBzY29wZT0iY29sIj5EaXN0cmlidXRpb24gTmFtZTwvdGg+DQotPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4NCi08IS0tPHRoIHNjb3BlPSJjb2wiPkl0ZW1zPC90aD4tLT4NCi08dGggc2NvcGU9ImNvbCI+RG93bmxvYWQ8L3RoPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJzdGQtYmluIiBpZD0ic3RkLWJpbiI+PC9hPjxzdHJvbmc+U3RhbmRhcmQgQmluYXJ5DQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyBpcyB0aGUgY29tcGxldGUgdmVyc2lvbiBvZiBBeGlzMiBhbmQgd2lsbCBjb250YWluIHVzZWZ1bA0KLXNhbXBsZXMgYXMgd2VsbC4gVXNlZnVsIGZvciBzb21lIG9uZSB0byBnZXQgZmFtaWxpYXIgd2l0aCBBeGlzMi4NCi0oU2luY2UgV1MtQWRkcmVzc2luZyBpbXBsZW1lbnRhdGlvbiBtb2R1bGUgaXMgZW5nYWdlZCBpbiB0byBBeGlzMiwNCi1ieSBkZWZhdWx0LCB0aGlzIGRpc3RyaWJ1dGlvbiB3aWxsIGNvbnRhaW4gYWRkcmVzc2luZy5tYXIuIEJ1dCB0aGUNCi1vdGhlciBtb2R1bGVzIHRoYXQgYXJlIGJlaW5nIGRldmVsb3BlZCB3aXRoaW4gQXhpczIgd2lsbCBub3QgYmUNCi1pbmNsdWRlZCBoZXJlIGFuZCBhcmUgYXZhaWxhYmxlIHRvIGJlIGRvd25sb2FkZWQgc2VwYXJhdGVseSBmcm9tDQotPGEgaHJlZj0iLi4vLi4vbW9kdWxlcy9pbmRleC5odG1sIj5oZXJlPC9hPi4pPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEuemlwIj56aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0ic3JjIiBpZD0ic3JjIj48L2E+IDxzdHJvbmc+U291cmNlDQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gdGhlIHNvdXJjZXMgb2YgQXhpczIgc3RhbmRhcmQgZGlzdHJpYnV0aW9uLg0KLU9uZSBjYW4gZ2VuZXJhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGZyb20gdGhpcyBieSB0eXBpbmcNCi08c3BhbiBjbGFzcz0ic3R5bGUxIj4kbWF2ZW4gZGlzdC1iaW4uPC9zcGFuPiAoPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8xXzEvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCNlbnYtc3JjIj5TZXQNCi11cCBBeGlzMiBlbnZpcm9ubWVudDwvYT4gYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kKTwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLXNyYy56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1zcmMuemlwIj56aXA8L2E+IDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1zcmMuemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtc3JjLnppcC5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBuYW1lPSJ3YXIiIGlkPSJ3YXIiPjwvYT48c3Ryb25nPldBUiAoV2ViIEFyY2hpdmUpDQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGJlIHRoZSB3ZWIgYXBwbGljYXRpb24gb2YgQXhpczIgd2hpY2ggY2FuIGJlIGRlcGxveWVkDQotaW4gbW9zdCBvZiB0aGUgc2VydmxldCBjb250YWluZXJzLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLndhciIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLndhciI+emlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi53YXIubWQ1IiB0aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczIud2FyLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLndhci5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMV8xL2F4aXMyLndhci5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkRvY3VtZW50cyBEaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgY29udGFpbiBhbGwgdGhlIGRvY3VtZW50YXRpb24gaW4gb25lIHBhY2thZ2UuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtZG9jcy56aXAiDQotdGl0bGU9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMV8xL2F4aXMyLTEuMS4xLWRvY3MuemlwIj56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1kb2NzLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8xXzEvYXhpczItMS4xLjEtZG9jcy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzFfMS9heGlzMi0xLjEuMS1kb2NzLnppcC5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTwvZGl2Pg0KLTxkaXYgYWxpZ249ImxlZnQiPjxiciAvPg0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIiAvPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcw0KLTxiPltwcmVmZXJyZWRdPC9iPi4gSWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwNCi1wbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiBJZiBhbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlDQotPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZSBtaXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkDQotYmUgYXZhaWxhYmxlLjwvcD4NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIiBuYW1lPQ0KLSJTZWxlY3RNaXJyb3IiPk90aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4NCi08b3B0aW9uIHZhbHVlPSJbaHR0cF0iIHNlbGVjdGVkPSJzZWxlY3RlZCI+W2h0dHBdPC9vcHRpb24+DQotPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+DQotPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+DQotPC9zZWxlY3Q+IDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiIC8+PC9mb3JtPg0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlIGxpc3Qgb2YgbWlycm9yczwvYT4uPC9wPg0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZQ0KLWNoZWNrIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kDQotdmVyaWZ5IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZQ0KLWRvd25sb2FkZWQgYnkgZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zDQotdGhlIHB1YmxpYyBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZlcmlmeWluZyBzaWduYXR1cmVzLiBJdCBpcw0KLXJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpYSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzIvZG93bmxvYWQuY2dpIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzIvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8yL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8yL2Rvd25sb2FkLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8yL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhYzI1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMi9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMS4yIFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08IS0tR29vZ2xlIEFuYXlpdGNzIHRyYWNraW5nIGNvZGUtLT4NCi08c2NyaXB0IHNyYz0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiIHR5cGU9DQotInRleHQvamF2YXNjcmlwdCI+DQotPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLS8vPCFbQ0RBVEFbDQotX3VhY2N0ID0gIlVBLTE5NTQzNzgtMyI7DQotdXJjaGluVHJhY2tlcigpOw0KLS8vXV0+DQotPC9zY3JpcHQ+PCEtLUVuZCBvZiBHb29nbGUgQW5heWl0Y3MgdHJhY2tpbmcgY29kZS0tPg0KLTxoMj5BeGlzMiAxLjIgUmVsZWFzZTwvaDI+DQotPGRpdj4NCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMSI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGggc2NvcGU9ImNvbCI+RGlzdHJpYnV0aW9uIE5hbWU8L3RoPg0KLTx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+DQotPCEtLTx0aCBzY29wZT0iY29sIj5JdGVtczwvdGg+LS0+DQotPHRoIHNjb3BlPSJjb2wiPkRvd25sb2FkPC90aD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0ic3RkLWJpbiIgaWQ9InN0ZC1iaW4iPjwvYT48c3Ryb25nPlN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgaXMgdGhlIGNvbXBsZXRlIHZlcnNpb24gb2YgQXhpczIgYW5kIHdpbGwgY29udGFpbiBzYW1wbGVzDQotYXMgd2VsbC4gU2luY2UgV1MtQWRkcmVzc2luZyBpbXBsZW1lbnRhdGlvbiBhbmQgU09BUCBNb25pdG9yDQotdXRpbGl0eSBtb2R1bGVzIGFyZSBlbmdhZ2VkIGluIHRvIEF4aXMyLCBieSBkZWZhdWx0LCB0aGlzDQotZGlzdHJpYnV0aW9uIHdpbGwgY29udGFpbiBhZGRyZXNzaW5nLm1hciBhbmQgc29hcG1vbml0b3IubWFyLiBCdXQNCi10aGUgb3RoZXIgbW9kdWxlcyB0aGF0IGFyZSBiZWluZyBkZXZlbG9wZWQgd2l0aGluIEF4aXMyIHdpbGwgbm90IGJlDQotaW5jbHVkZWQgaGVyZSwgYW5kIG5lZWQgdG8gYmUgPGEgaHJlZj0NCi0iLi4vLi4vbW9kdWxlcy9pbmRleC5odG1sIj5kb3dubG9hZGVkPC9hPiBzZXBhcmF0ZWx5LjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMi9heGlzMi0xLjIuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8yL2F4aXMyLTEuMi56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS4yLWJpbi56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLnppcC5tZDUiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjIuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjIuemlwLmFzYyINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLTEuMi56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0ic3JjIiBpZD0ic3JjIj48L2E+IDxzdHJvbmc+U291cmNlDQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gdGhlIHNvdXJjZXMgb2YgQXhpczIgc3RhbmRhcmQgZGlzdHJpYnV0aW9uLg0KLU9uZSBjYW4gZ2VuZXJhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGZyb20gdGhpcyBieSB0eXBpbmcNCi08c3BhbiBjbGFzcz0ic3R5bGUxIj4kbWF2ZW4gZGlzdC1iaW48L3NwYW4+ICg8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzIvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCNlbnYtc3JjIj5TZXQNCi11cCBBeGlzMiBlbnZpcm9ubWVudDwvYT4gYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kKS4gVXNlZnVsIGZvcg0KLWFkdmFuY2VkIHVzZXJzLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMi9heGlzMi0xLjItc3JjLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMi9heGlzMi0xLjItc3JjLnppcCIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjItc3JjLnppcCcpOyI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjItc3JjLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjItc3JjLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLXNyYy56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0id2FyIiBpZD0id2FyIj48L2E+PHN0cm9uZz5XQVIgKFdlYiBBcmNoaXZlKQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBiZSB0aGUgd2ViIGFwcGxpY2F0aW9uIG9mIEF4aXMyIHdoaWNoIGNhbiBiZSBkZXBsb3llZA0KLWluIG1vc3Qgb2YgdGhlIHNlcnZsZXQgY29udGFpbmVycy48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzIvYXhpczIud2FyIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8yL2F4aXMyLndhciIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjIud2FyJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLndhci5tZDUiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi53YXIubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8yL2F4aXMyLndhci5hc2MiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi53YXIuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5Eb2N1bWVudHMgRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBkb2N1bWVudGF0aW9uIGluIG9uZSBwYWNrYWdlLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMi9heGlzMi0xLjItZG9jcy56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzIvYXhpczItMS4yLWRvY3MuemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuMi1kb2NzLnppcCcpOyI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjItZG9jcy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLWRvY3MuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMi9heGlzMi0xLjItZG9jcy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzIvYXhpczItMS4yLWRvY3MuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0ibGVmdCI+PGJyIC8+DQotPHA+W2lmLWFueSBsb2dvXSA8YSBocmVmPSJbbGlua10iPjxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSINCi1ib3JkZXI9IjAiIC8+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzDQotPGI+W3ByZWZlcnJlZF08L2I+LiBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLA0KLXBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuIElmIGFsbCBtaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUNCi08aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlIG1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQNCi1iZSBhdmFpbGFibGUuPC9wPg0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiIG5hbWU9IlNlbGVjdE1pcnJvciI+DQotT3RoZXIgbWlycm9yczogPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPg0KLVtpZi1hbnkgaHR0cF0NCi0gIFtmb3IgaHR0cF08b3B0aW9uIHZhbHVlPSJbaHR0cF0iPltodHRwXTwvb3B0aW9uPltlbmRdDQotW2VuZF0gIA0KLVtpZi1hbnkgZnRwXQ0KLSAgW2ZvciBmdHBdPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+W2VuZF0NCi1bZW5kXQ0KLVtpZi1hbnkgYmFja3VwXQ0KLSAgW2ZvciBiYWNrdXBdPG9wdGlvbiB2YWx1ZT0iW2JhY2t1cF0iPltiYWNrdXBdIChiYWNrdXApPC9vcHRpb24+W2VuZF0NCi1bZW5kXQ0KLTwvc2VsZWN0PjxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiLz48L2Zvcm0+DQotPHA+WW91IG1heSBhbHNvIGNvbnN1bHQgdGhlIDxhIGNsYXNzPSJleHRlcm5hbExpbmsiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUgbGlzdCBvZiBtaXJyb3JzPC9hPjwvcD4NCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHdoZW4gZG93bmxvYWRpbmcgZnJvbSBhIG1pcnJvciBwbGVhc2UNCi1jaGVjayB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjbWQ1Ij5tZDVzdW08L2E+IGFuZA0KLXZlcmlmeSB0aGUgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjb3BlbnBncCI+T3BlblBHUDwvYT4NCi1jb21wYXRpYmxlIHNpZ25hdHVyZSBmcm9tIHRoZSBtYWluIEFwYWNoZSBzaXRlLiBUaGVzZSBjYW4gYmUNCi1kb3dubG9hZGVkIGJ5IGZvbGxvd2luZyB0aGUgbGlua3MgYWJvdmUuIFRoaXMgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvS0VZUyI+S0VZUzwvYT4gZmlsZSBjb250YWlucw0KLXRoZSBwdWJsaWMga2V5cyB0aGF0IGNhbiBiZSB1c2VkIGZvciB2ZXJpZnlpbmcgc2lnbmF0dXJlcy4gSXQgaXMNCi1yZWNvbW1lbmRlZCB0aGF0ICh3aGVuIHBvc3NpYmxlKWEgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij5XZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8zL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV8zL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMy9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMy9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfMy9kb3dubG9hZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NzU4ODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzMvZG93bmxvYWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIDEuMyBSZWxlYXNlPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPCEtLUdvb2dsZSBBbmF5aXRjcyB0cmFja2luZyBjb2RlLS0+DQotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0NCi0iaHR0cDovL3d3dy5nb29nbGUtYW5hbHl0aWNzLmNvbS91cmNoaW4uanMiPg0KLTwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi0vLzwhW0NEQVRBWw0KLV91YWNjdCA9ICJVQS0xOTU0Mzc4LTMiOw0KLXVyY2hpblRyYWNrZXIoKTsNCi0vL11dPg0KLTwvc2NyaXB0PjwhLS1FbmQgb2YgR29vZ2xlIEFuYXlpdGNzIHRyYWNraW5nIGNvZGUtLT4NCi08aDI+QXhpczIgMS4zIFJlbGVhc2U8L2gyPg0KLTxkaXY+DQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjEiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRoIHNjb3BlPSJjb2wiPkRpc3RyaWJ1dGlvbiBOYW1lPC90aD4NCi08dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPg0KLTwhLS08dGggc2NvcGU9ImNvbCI+SXRlbXM8L3RoPi0tPg0KLTx0aCBzY29wZT0iY29sIj5Eb3dubG9hZDwvdGg+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InN0ZC1iaW4iIGlkPSJzdGQtYmluIj48L2E+PHN0cm9uZz5TdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIGlzIHRoZSBjb21wbGV0ZSB2ZXJzaW9uIG9mIEF4aXMyIGFuZCB3aWxsIGNvbnRhaW4gc2FtcGxlcw0KLWFzIHdlbGwuIFNpbmNlIFdTLUFkZHJlc3NpbmcgaW1wbGVtZW50YXRpb24gYW5kIFNPQVAgTW9uaXRvcg0KLXV0aWxpdHkgbW9kdWxlcyBhcmUgZW5nYWdlZCBpbiB0byBBeGlzMiwgYnkgZGVmYXVsdCwgdGhpcw0KLWRpc3RyaWJ1dGlvbiB3aWxsIGNvbnRhaW4gYWRkcmVzc2luZy5tYXIgYW5kIHNvYXBtb25pdG9yLm1hci4gQnV0DQotdGhlIG90aGVyIG1vZHVsZXMgdGhhdCBhcmUgYmVpbmcgZGV2ZWxvcGVkIHdpdGhpbiBBeGlzMiB3aWxsIG5vdCBiZQ0KLWluY2x1ZGVkIGhlcmUsIGFuZCBuZWVkIHRvIGJlIDxhIGhyZWY9DQotIi4uLy4uL21vZHVsZXMvaW5kZXguaHRtbCI+ZG93bmxvYWRlZDwvYT4gc2VwYXJhdGVseS48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzMvYXhpczItMS4zLWJpbi56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzMvYXhpczItMS4zLWJpbi56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS4zLWJpbi56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLWJpbi56aXAubWQ1Ig0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLWJpbi56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1iaW4uemlwLmFzYyINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1iaW4uemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9InNyYyIgaWQ9InNyYyI+PC9hPiA8c3Ryb25nPlNvdXJjZQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIHRoZSBzb3VyY2VzIG9mIEF4aXMyIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbi4NCi1PbmUgY2FuIGdlbmVyYXRlIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBmcm9tIHRoaXMgYnkgdHlwaW5nDQotPHNwYW4gY2xhc3M9InN0eWxlMSI+JG1hdmVuIGRpc3QtYmluPC9zcGFuPiAoPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8zL2luc3RhbGxhdGlvbmd1aWRlLmh0bWwjZW52LXNyYyI+U2V0DQotdXAgQXhpczIgZW52aXJvbm1lbnQ8L2E+IGJlZm9yZSBydW5uaW5nIHRoaXMgY29tbWFuZCkuIFVzZWZ1bCBmb3INCi1hZHZhbmNlZCB1c2Vycy48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzMvYXhpczItMS4zLXNyYy56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzMvYXhpczItMS4zLXNyYy56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS4zLXNyYy56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLXNyYy56aXAubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzMvYXhpczItMS4zLXNyYy56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1zcmMuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1zcmMuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIG5hbWU9IndhciIgaWQ9IndhciI+PC9hPjxzdHJvbmc+V0FSIChXZWIgQXJjaGl2ZSkNCi1EaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgYmUgdGhlIHdlYiBhcHBsaWNhdGlvbiBvZiBBeGlzMiB3aGljaCBjYW4gYmUgZGVwbG95ZWQNCi1pbiBtb3N0IG9mIHRoZSBzZXJ2bGV0IGNvbnRhaW5lcnMuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy13YXIuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy13YXIuemlwIiBvbkNsaWNrPQ0KLSJqYXZhc2NyaXB0OnVyY2hpblRyYWNrZXIgKCcvZG93bmxvYWRzL2F4aXMyLTEuMy13YXIuemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy13YXIuemlwLm1kNSINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy13YXIuemlwLm1kNSI+TUQ1PC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtd2FyLnppcC5hc2MiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtd2FyLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48c3Ryb25nPkRvY3VtZW50cyBEaXN0cmlidXRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD5UaGlzIHdpbGwgY29udGFpbiBhbGwgdGhlIGRvY3VtZW50YXRpb24gaW4gb25lIHBhY2thZ2UuPC90ZD4NCi08dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1kb2NzLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtZG9jcy56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS4zLWRvY3MuemlwJyk7Ij56aXA8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1kb2NzLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtZG9jcy56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV8zL2F4aXMyLTEuMy1kb2NzLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfMy9heGlzMi0xLjMtZG9jcy56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08L2Rpdj4NCi08ZGl2IGFsaWduPSJsZWZ0Ij48YnIgLz4NCi08cD5baWYtYW55IGxvZ29dIDxhIGhyZWY9IltsaW5rXSI+PGltZyBhbGlnbj0icmlnaHQiIHNyYz0iW2xvZ29dIg0KLWJvcmRlcj0iMCIgLz48L2E+W2VuZF0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtaXJyb3IgaXMNCi08Yj5bcHJlZmVycmVkXTwvYj4uIElmIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdpdGggdGhpcyBtaXJyb3IsDQotcGxlYXNlIHNlbGVjdCBhbm90aGVyIG1pcnJvci4gSWYgYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZQ0KLTxpPmJhY2t1cDwvaT4gbWlycm9ycyAoYXQgdGhlIGVuZCBvZiB0aGUgbWlycm9ycyBsaXN0KSB0aGF0IHNob3VsZA0KLWJlIGF2YWlsYWJsZS48L3A+DQotPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciIgbmFtZT0iU2VsZWN0TWlycm9yIj4NCi1PdGhlciBtaXJyb3JzOiA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+DQotW2lmLWFueSBodHRwXQ0KLSAgW2ZvciBodHRwXTxvcHRpb24gdmFsdWU9IltodHRwXSI+W2h0dHBdPC9vcHRpb24+W2VuZF0NCi1bZW5kXSAgDQotW2lmLWFueSBmdHBdDQotICBbZm9yIGZ0cF08b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj5bZW5kXQ0KLVtlbmRdDQotW2lmLWFueSBiYWNrdXBdDQotICBbZm9yIGJhY2t1cF08b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj5bZW5kXQ0KLVtlbmRdDQotPC9zZWxlY3Q+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSIvPjwvZm9ybT4NCi08cD5Zb3UgbWF5IGFsc28gY29uc3VsdCB0aGUgPGEgY2xhc3M9ImV4dGVybmFsTGluayIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL21pcnJvcnMvIj5jb21wbGV0ZSBsaXN0IG9mIG1pcnJvcnM8L2E+PC9wPg0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gd2hlbiBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHBsZWFzZQ0KLWNoZWNrIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNtZDUiPm1kNXN1bTwvYT4gYW5kDQotdmVyaWZ5IHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyNvcGVucGdwIj5PcGVuUEdQPC9hPg0KLWNvbXBhdGlibGUgc2lnbmF0dXJlIGZyb20gdGhlIG1haW4gQXBhY2hlIHNpdGUuIFRoZXNlIGNhbiBiZQ0KLWRvd25sb2FkZWQgYnkgZm9sbG93aW5nIHRoZSBsaW5rcyBhYm92ZS4gVGhpcyA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi9LRVlTIj5LRVlTPC9hPiBmaWxlIGNvbnRhaW5zDQotdGhlIHB1YmxpYyBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZlcmlmeWluZyBzaWduYXR1cmVzLiBJdCBpcw0KLXJlY29tbWVuZGVkIHRoYXQgKHdoZW4gcG9zc2libGUpYSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN3ZWItb2YtdHJ1c3QiPldlYiBvZg0KLXRydXN0PC9hPiBpcyB1c2VkIHRvIGNvbmZpcm0gdGhlIGlkZW50aXR5IG9mIHRoZXNlIGtleXMuPC9wPg0KLTwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzQvZG93bmxvYWQuY2dpIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC8xXzQvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV80L2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV80L2Rvd25sb2FkLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvMV80L2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlNjFmMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkLzFfNC9kb3dubG9hZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+QXhpczIgMS41IFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08IS0tR29vZ2xlIEFuYXlpdGNzIHRyYWNraW5nIGNvZGUtLT4NCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPQ0KLSJodHRwOi8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL3VyY2hpbi5qcyI+DQotPC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLS8vPCFbQ0RBVEFbDQotX3VhY2N0ID0gIlVBLTE5NTQzNzgtMyI7DQotdXJjaGluVHJhY2tlcigpOw0KLS8vXV0+DQotPC9zY3JpcHQ+PCEtLUVuZCBvZiBHb29nbGUgQW5heWl0Y3MgdHJhY2tpbmcgY29kZS0tPg0KLTxoMj5BeGlzMiAxLjUgUmVsZWFzZTwvaDI+DQotPGRpdj4NCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMSI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGggc2NvcGU9ImNvbCI+RGlzdHJpYnV0aW9uIE5hbWU8L3RoPg0KLTx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+DQotPCEtLTx0aCBzY29wZT0iY29sIj5JdGVtczwvdGg+LS0+DQotPHRoIHNjb3BlPSJjb2wiPkRvd25sb2FkPC90aD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0ic3RkLWJpbiIgaWQ9InN0ZC1iaW4iPjwvYT48c3Ryb25nPlN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgaXMgdGhlIGNvbXBsZXRlIHZlcnNpb24gb2YgQXhpczIgYW5kIHdpbGwgY29udGFpbiBzYW1wbGVzDQotYXMgd2VsbC4gU2luY2UgV1MtQWRkcmVzc2luZyBpbXBsZW1lbnRhdGlvbiBhbmQgU09BUCBNb25pdG9yDQotdXRpbGl0eSBtb2R1bGVzIGFyZSBlbmdhZ2VkIGluIHRvIEF4aXMyLCBieSBkZWZhdWx0LCB0aGlzDQotZGlzdHJpYnV0aW9uIHdpbGwgY29udGFpbiBhZGRyZXNzaW5nLm1hciBhbmQgc29hcG1vbml0b3IubWFyLiBCdXQNCi10aGUgb3RoZXIgbW9kdWxlcyB0aGF0IGFyZSBiZWluZyBkZXZlbG9wZWQgd2l0aGluIEF4aXMyIHdpbGwgbm90IGJlDQotaW5jbHVkZWQgaGVyZSwgYW5kIG5lZWQgdG8gYmUgPGEgaHJlZj0NCi0iLi4vLi4vbW9kdWxlcy9pbmRleC5odG1sIj5kb3dubG9hZGVkPC9hPiBzZXBhcmF0ZWx5LjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtYmluLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtYmluLnppcCIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjUtYmluLnppcCcpOyI+emlwPC9hPg0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtYmluLnppcC5tZDUiDQotdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtYmluLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LWJpbi56aXAuYXNjIg0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LWJpbi56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0ic3JjIiBpZD0ic3JjIj48L2E+IDxzdHJvbmc+U291cmNlDQotRGlzdHJpYnV0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+VGhpcyB3aWxsIGNvbnRhaW4gdGhlIHNvdXJjZXMgb2YgQXhpczIgc3RhbmRhcmQgZGlzdHJpYnV0aW9uLg0KLU9uZSBjYW4gZ2VuZXJhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGZyb20gdGhpcyBieSB0eXBpbmcNCi08c3BhbiBjbGFzcz0ic3R5bGUxIj4kbWF2ZW4gZGlzdC1iaW48L3NwYW4+ICg8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzUvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCNlbnYtc3JjIj5TZXQNCi11cCBBeGlzMiBlbnZpcm9ubWVudDwvYT4gYmVmb3JlIHJ1bm5pbmcgdGhpcyBjb21tYW5kKS4gVXNlZnVsIGZvcg0KLWFkdmFuY2VkIHVzZXJzLjwvdGQ+DQotPHRkPjxhIGhyZWY9IltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtc3JjLnppcCIgdGl0bGU9DQotIltwcmVmZXJyZWRdL3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtc3JjLnppcCIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjUtc3JjLnppcCcpOyI+emlwPC9hPg0KLTxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtc3JjLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyLzFfNS9heGlzMi0xLjUtc3JjLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LXNyYy56aXAuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LXNyYy56aXAuYXNjIj5QR1A8L2E+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgbmFtZT0id2FyIiBpZD0id2FyIj48L2E+PHN0cm9uZz5XQVIgKFdlYiBBcmNoaXZlKQ0KLURpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBiZSB0aGUgd2ViIGFwcGxpY2F0aW9uIG9mIEF4aXMyIHdoaWNoIGNhbiBiZSBkZXBsb3llZA0KLWluIG1vc3Qgb2YgdGhlIHNlcnZsZXQgY29udGFpbmVycy48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LXdhci56aXAiIHRpdGxlPQ0KLSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LXdhci56aXAiIG9uQ2xpY2s9DQotImphdmFzY3JpcHQ6dXJjaGluVHJhY2tlciAoJy9kb3dubG9hZHMvYXhpczItMS41LXdhci56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LXdhci56aXAubWQ1Ig0KLXRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LXdhci56aXAubWQ1Ij5NRDU8L2E+DQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS13YXIuemlwLmFzYyINCi10aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS13YXIuemlwLmFzYyI+UEdQPC9hPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxzdHJvbmc+RG9jdW1lbnRzIERpc3RyaWJ1dGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkPlRoaXMgd2lsbCBjb250YWluIGFsbCB0aGUgZG9jdW1lbnRhdGlvbiBpbiBvbmUgcGFja2FnZS48L3RkPg0KLTx0ZD48YSBocmVmPSJbcHJlZmVycmVkXS93cy9heGlzMi8xXzUvYXhpczItMS41LWRvY3MuemlwIiB0aXRsZT0NCi0iW3ByZWZlcnJlZF0vd3MvYXhpczIvMV81L2F4aXMyLTEuNS1kb2NzLnppcCIgb25DbGljaz0NCi0iamF2YXNjcmlwdDp1cmNoaW5UcmFja2VyICgnL2Rvd25sb2Fkcy9heGlzMi0xLjUtZG9jcy56aXAnKTsiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LWRvY3MuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1kb2NzLnppcC5tZDUiPk1ENTwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9heGlzMi8xXzUvYXhpczItMS41LWRvY3MuemlwLmFzYyINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3Qvd3MvYXhpczIvMV81L2F4aXMyLTEuNS1kb2NzLnppcC5hc2MiPlBHUDwvYT48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTwvZGl2Pg0KLTxkaXYgYWxpZ249ImxlZnQiPjxiciAvPg0KLTxwPltpZi1hbnkgbG9nb10gPGEgaHJlZj0iW2xpbmtdIj48aW1nIGFsaWduPSJyaWdodCIgc3JjPSJbbG9nb10iDQotYm9yZGVyPSIwIiAvPjwvYT5bZW5kXSBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcw0KLTxiPltwcmVmZXJyZWRdPC9iPi4gSWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIG1pcnJvciwNCi1wbGVhc2Ugc2VsZWN0IGFub3RoZXIgbWlycm9yLiBJZiBhbGwgbWlycm9ycyBhcmUgZmFpbGluZywgdGhlcmUgYXJlDQotPGk+YmFja3VwPC9pPiBtaXJyb3JzIChhdCB0aGUgZW5kIG9mIHRoZSBtaXJyb3JzIGxpc3QpIHRoYXQgc2hvdWxkDQotYmUgYXZhaWxhYmxlLjwvcD4NCi08Zm9ybSBhY3Rpb249Iltsb2NhdGlvbl0iIG1ldGhvZD0iZ2V0IiBpZD0iU2VsZWN0TWlycm9yIiBuYW1lPSJTZWxlY3RNaXJyb3IiPg0KLU90aGVyIG1pcnJvcnM6IDxzZWxlY3QgbmFtZT0iUHJlZmVycmVkIj4NCi1baWYtYW55IGh0dHBdDQotICBbZm9yIGh0dHBdPG9wdGlvbiB2YWx1ZT0iW2h0dHBdIj5baHR0cF08L29wdGlvbj5bZW5kXQ0KLVtlbmRdICANCi1baWYtYW55IGZ0cF0NCi0gIFtmb3IgZnRwXTxvcHRpb24gdmFsdWU9IltmdHBdIj5bZnRwXTwvb3B0aW9uPltlbmRdDQotW2VuZF0NCi1baWYtYW55IGJhY2t1cF0NCi0gIFtmb3IgYmFja3VwXTxvcHRpb24gdmFsdWU9IltiYWNrdXBdIj5bYmFja3VwXSAoYmFja3VwKTwvb3B0aW9uPltlbmRdDQotW2VuZF0NCi08L3NlbGVjdD48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ2hhbmdlIi8+PC9mb3JtPg0KLTxwPllvdSBtYXkgYWxzbyBjb25zdWx0IHRoZSA8YSBjbGFzcz0iZXh0ZXJuYWxMaW5rIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8iPmNvbXBsZXRlIGxpc3Qgb2YgbWlycm9yczwvYT48L3A+DQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlDQotY2hlY2sgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQNCi12ZXJpZnkgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlDQotZG93bmxvYWRlZCBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMNCi10aGUgcHVibGljIGtleXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmVyaWZ5aW5nIHNpZ25hdHVyZXMuIEl0IGlzDQotcmVjb21tZW5kZWQgdGhhdCAod2hlbiBwb3NzaWJsZSlhIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI3dlYi1vZi10cnVzdCI+V2ViIG9mDQotdHJ1c3Q8L2E+IGlzIHVzZWQgdG8gY29uZmlybSB0aGUgaWRlbnRpdHkgb2YgdGhlc2Uga2V5cy48L3A+DQotPC9kaXY+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkL00yL2Rvd25sb2FkLmNnaSBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvTTIvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZG93bmxvYWQvTTIvZG93bmxvYWQuY2dpCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFdyYXBwZXIgc2NyaXB0IGFyb3VuZCBtaXJyb3JzLmNnaSBzY3JpcHQKLSMgKHdlIG11c3QgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5IGluIG9yZGVyIGZvciBweXRob24gdG8gcGljayB1cCB0aGUKLSMgIHB5dGhvbiBpbmNsdWRlcyBjb3JyZWN0bHkpCi1jZCAvd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzCi0vd3d3L3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpICQqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9kb3dubG9hZC9NMi9kb3dubG9hZC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkL00yL2Rvd25sb2FkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1Yjg5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2Rvd25sb2FkL00yL2Rvd25sb2FkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIE0yIFJlbGVhc2U8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+QXhpczIgTWlsZXN0b25lIDIgUmVsZWFzZTwvaDI+DQotPGRpdiBhbGlnbj0ibGVmdCI+DQotPGgzPlNvdXJjZSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9jdnMuYXBhY2hlLm9yZy9kaXN0L2F4aXMvdjIuMC1NMi9heGlzMi1NMi1zcmMuemlwIiB0aXRsZT0NCi0iaHR0cDovL2N2cy5hcGFjaGUub3JnL2Rpc3QvYXhpcy92Mi4wLU0yL2F4aXMyLU0yLXNyYy56aXAiPnppcDwvYT48YnIgLz4NCi08L3A+DQotPGgzPkJpbmFyeSBEaXN0cmlidXRpb248L2gzPg0KLTxwPjxhIGhyZWY9DQotImh0dHA6Ly9jdnMuYXBhY2hlLm9yZy9kaXN0L2F4aXMvdjIuMC1NMi9heGlzMi1NMi1iaW4uemlwIiB0aXRsZT0NCi0iaHR0cDovL2N2cy5hcGFjaGUub3JnL2Rpc3QvYXhpcy92Mi4wLU0yL2F4aXMyLU0yLWJpbi56aXAiPnppcDwvYT48L3A+DQotPC9kaXY+DQotPGRpdiBhbGlnbj0ibGVmdCI+PGJyIC8+DQotPHA+W2lmLWFueSBsb2dvXSA8YSBocmVmPSJbbGlua10iPjxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSINCi1ib3JkZXI9IjAiIC8+PC9hPltlbmRdIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWlycm9yIGlzDQotPGI+W3ByZWZlcnJlZF08L2I+LiBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLA0KLXBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuIElmIGFsbCBtaXJyb3JzIGFyZSBmYWlsaW5nLCB0aGVyZSBhcmUNCi08aT5iYWNrdXA8L2k+IG1pcnJvcnMgKGF0IHRoZSBlbmQgb2YgdGhlIG1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQNCi1iZSBhdmFpbGFibGUuPC9wPg0KLTxmb3JtIGFjdGlvbj0iW2xvY2F0aW9uXSIgbWV0aG9kPSJnZXQiIGlkPSJTZWxlY3RNaXJyb3IiIG5hbWU9DQotIlNlbGVjdE1pcnJvciI+T3RoZXIgbWlycm9yczogPHNlbGVjdCBuYW1lPSJQcmVmZXJyZWQiPg0KLTxvcHRpb24gdmFsdWU9IltodHRwXSIgc2VsZWN0ZWQ9InNlbGVjdGVkIj5baHR0cF08L29wdGlvbj4NCi08b3B0aW9uIHZhbHVlPSJbZnRwXSI+W2Z0cF08L29wdGlvbj4NCi08b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj4NCi08L3NlbGVjdD4gPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNoYW5nZSIgLz48L2Zvcm0+DQotPHA+WW91IG1heSBhbHNvIGNvbnN1bHQgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUgbGlzdCBvZiBtaXJyb3JzPC9hPi48L3A+DQotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB3aGVuIGRvd25sb2FkaW5nIGZyb20gYSBtaXJyb3IgcGxlYXNlDQotY2hlY2sgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI21kNSI+bWQ1c3VtPC9hPiBhbmQNCi12ZXJpZnkgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvcmVsZWFzZS1zaWduaW5nI29wZW5wZ3AiPk9wZW5QR1A8L2E+DQotY29tcGF0aWJsZSBzaWduYXR1cmUgZnJvbSB0aGUgbWFpbiBBcGFjaGUgc2l0ZS4gVGhlc2UgY2FuIGJlDQotZG93bmxvYWRlZCBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGFib3ZlLiBUaGlzIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL2F4aXMyL0tFWVMiPktFWVM8L2E+IGZpbGUgY29udGFpbnMNCi10aGUgcHVibGljIGtleXMgdXNlZCBmb3Igc2lnbmluZyByZWxlYXNlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0DQotKHdoZW4gcG9zc2libGUpIGEgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi9yZWxlYXNlLXNpZ25pbmcjd2ViLW9mLXRydXN0Ij53ZWIgb2YNCi10cnVzdDwvYT4gaXMgdXNlZCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiB0aGVzZSBrZXlzLjwvcD4NCi08L2Rpdj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZHluYW1pYy1sYWJlbHMucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZHluYW1pYy1sYWJlbHMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2MjQ5Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2R5bmFtaWMtbGFiZWxzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWF4aXMyX3ZlcnNpb249MS41LjEKLWF4aXMyX3ZlcnNpb25fZGlyPTFfNV8xCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZmFxLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZmFxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkZTdmMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ZhcS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPgotPHRpdGxlPkF4aXMyIEZBUTwvdGl0bGU+Ci08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLW1lZGlhPSJhbGwiIC8+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLTxoMT5GcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyBvbiBBcGFjaGUgQXhpczI8L2gxPgotPHA+R290IGEgcXVlc3Rpb24gdG8gYmUgYW5zd2VyZWQgb24gQXhpczI/IFRoZW4gdGhpcyBkb2N1bWVudCBpcwotanVzdCB3aGF0IHRoZSBkb2N0b3Igb3JkZXJlZC48L3A+Ci08aDI+QXNrIHlvdXIgUXVlc3Rpb25zIEhlcmU8L2gyPgotPHA+SWYgeW91IGhhdmUgYW55IG90aGVyIGRvdWJ0cy9pc3N1ZXMsIGUtbWFpbCB5b3VyIHF1ZXN0aW9ucwotdG86PC9wPgotPHVsPgotPGxpPkRldmVsb3BlcnMgOiA8YSBocmVmPQotIm1haWx0bzpheGlzLWRldkB3cy5hcGFjaGUub3JnIj5heGlzLWRldkB3cy5hcGFjaGUub3JnPC9hPjwvbGk+Ci08bGk+VXNlcnMgOiA8YSBocmVmPQotIm1haWx0bzpheGlzLXVzZXJAd3MuYXBhY2hlLm9yZyI+YXhpcy11c2VyQHdzLmFwYWNoZS5vcmc8L2E+PC9saT4KLTwvdWw+Ci08cD5QcmVmaXggc3ViamVjdCB3aXRoIFtBeGlzMl0uIDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbWFpbC1saXN0cy5odG1sIj5TdWJzY3JpYmU8L2E+IHRvIG91cgotbWFpbGluZyBsaXN0cy48YSBocmVmPQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21haWwtbGlzdHMuaHRtbCI+PC9hPjwvcD4KLTxoMj5Db250ZW50IG9mIFF1ZXN0aW9ucyBhbmQgQW5zd2VyczwvaDI+Ci08dWw+Ci08bGk+R2VuZXJhbAotPHVsPgotPGxpPjxhIGhyZWY9IiNhMSI+SSdtIGhhdmluZyBhIHByb2JsZW0gdXNpbmcgQXhpczIuIFdoYXQgc2hvdWxkIEkKLWRvPzwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Q2xhc3MgTG9hZGluZyBJc3N1ZXMKLTx1bD4KLTxsaT48YSBocmVmPSIjYjEiPkhvdyBkbyBJIGFjY2VzcyByZXNvdXJjZXMgaW4gbXkgc2VydmljZSAvbW9kdWxlCi1hcmNoaXZlIGZpbGU/PC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5DbGllbnQgQVBJCi08dWw+Ci08bGk+PGEgaHJlZj0iI2MxIj5JIHdhbnQgdG8gZG8gUmVxdWVzdCBSZXNwb25zZSBNZXNzYWdpbmcsIFdoZXJlCi1zaG91bGQgSSBsb29rPzxiciAvPjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNjMiI+SSB3YW50IHRvIGRvIE9uZSBXYXkgTWVzc2FnaW5nLCBXaGVyZSBzaG91bGQgSQotbG9vaz88L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYzMiPkVycm9yOiAndG8gZG8gdHdvIFRyYW5zcG9ydCBDaGFubmVscyB0aGUKLUFkZHJlc3NpbmcgTW9kdWxlcyBtdXN0IGJlIGVuZ2FnZWQnPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI2M0Ij5JIGhhdmUgZW5nYWdlZCBhZGRyZXNzaW5nLCBhbmQgd2hlbiBJIHRyeSB0bwotaW52b2tlIGEgc2VydmljZSBJIGdldCBhbiBleGNlcHRpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSIjYzUiPldoYXQgaXMgQXhpcyBSZXBvc2l0b3J5PzwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+U2VydmljZXMKLTx1bD4KLTxsaT48YSBocmVmPSIjZTEiPkhvdyBkbyBJIGhhdmUgbXVsdGlwbGUgc2VydmljZXMgaW4gb25lIHNlcnZpY2UKLWFyY2hpdmU/PC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5XZWIgQXJjaGl2ZS8gU2VydmVyIFNpZGUKLTx1bD4KLTxsaT48YSBocmVmPSIjZjEiPkkgc2VlIGFuIGludGVybmFsIHNlcnZlciBlcnJvciBwYWdlIHdoZW4gSSB0cnkgdG8KLXZpZXcgdGhlIFdTREwgZmlsZS48YnIgLz48L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxoMj5HZW5lcmFsPC9oMj4KLTxvbD4KLTxsaT48YSBuYW1lPSJhMSIgaWQ9ImExIj48L2E+PHN0cm9uZz5JJ20gaGF2aW5nIGEgcHJvYmxlbSB1c2luZwotQXhpczIuIFdoYXQgc2hvdWxkIEkgZG8/PC9zdHJvbmc+PGJyIC8+Ci08cD5GaXJzdCBtYWtlIHN1cmUgeW91IGdvIHRocm91Z2ggdGhlIHVzZXIgZ3VpZGUgYW5kIHRoaXMgRkFRLiBJZgoteW91IGFyZSB1c2luZyBhIHJlbGVhc2VkIHZlcnNpb24gb2YgQXhpczIsIHRoZW4gdGhlcmUgaXMgYQotcG9zc2liaWxpdHkgdGhhdCB5b3VyIHByb2JsZW0gaGFzIGFscmVhZHkgYmVpbmcgZml4ZWQgaW4gdGhlIGxhdGVzdAotY29kZS4gPGEgaHJlZj0KLSJodHRwOi8vd3Muem9uZXMuYXBhY2hlLm9yZy9kaXN0L2F4aXMyL25pZ2h0bHkvIj5Eb3dubG9hZCBBeGlzMgotbmlnaHRseSBidWlsZHM8L2E+IGFuZCB0ZXN0IGFnYWluLjwvcD4KLTxwPklmIHRoZSBwcm9ibGVtIHN0aWxsIHBlcnNpc3RzLCB0aGVuIHRyeSB0byBzZWFyY2ggZm9yIHlvdXIKLXF1ZXN0aW9uIGluIG91ciA8YSBocmVmPQotImh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YXhpcy1kZXYmYW1wO3I9MSZhbXA7dz0yIj5kZXZlbG9wZXI8L2E+Ci1vciA8YSBocmVmPQotImh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YXhpcy11c2VyJmFtcDtyPTEmYW1wO3c9MiI+dXNlcjwvYT4KLW1haWxpbmcgYXJjaGl2ZXMgYXMgaXQgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlaW5nIGFuc3dlcmVkLjwvcD4KLTxwPklmIHlvdXIgcHJvYmxlbSBpcyBub3QgYW5zd2VyZWQgaW4gdGhlIG1haWxpbmcgbGlzdCwgbm93IGlzIHRoZQotYmVzdCB0aW1lIHRvIHBvc3QgeW91ciBxdWVzdGlvbiB0byB0aGUgYXhpcy11c2VyIG1haWxpbmcgbGlzdC4gSWYKLXlvdSB0aGluayBpdCBpcyBhIGJ1ZywgcGxlYXNlIGZpbGwgYSBidWcgcmVwb3J0IGluIDxhIGhyZWY9Ci0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyIj5KSVJBPC9hPi4gUGxlYXNlCi1hdHRhY2ggYWxsIHRoZSBzdXBwb3J0aXZlIGluZm9ybWF0aW9uLCBsaWtlIHlvdXIgd3NkbCwgc2NoZW1hLAotY2xpZW50cywgc2VydmljZXMsIHN0YWNrdHJhY2VzLCBldGMuLCB0byB0aGUgSklSQSBpc3N1ZSB5b3UKLWNyZWF0ZWQsIGFzIGl0IHdpbGwgaGVscCBvbmUgb2Ygb3VyIGNvbnRyaWJ1dG9ycyB0byByZS1jcmVhdGUgdGhlCi1wcm9ibGVtLiA8Yj5QTEVBU0UgRE8gTk9UIEFTSyBRVUVTVElPTlMgVVNJTkcgSklSQTsgVVNFIElUIE9OTFkgQVMKLUFOIElTU1VFIFRSQUNLRVIuPC9iPjwvcD4KLTxwPklmIHlvdSBhcmUgYXNraW5nIGZvciBhbiBleHBsYW5hdGlvbiBvZiBhIGZlYXR1cmUgaW4gQXhpczIsCi10aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlcmUgaXMgYW4gYXJ0aWNsZSBvciBGQVEgd3JpdHRlbiBvbgotaXQuIFBsZWFzZSBzZWFyY2ggdGhlIHdlYiBhcyB0aGVyZSBhcmUgbG90cyBvZiBhcnRpY2xlcyB3cml0dGVuIGFuZAotaG9zdGVkIGJ5IHZhcmlvdXMgc291cmNlcyBvbiB0aGUgd2ViLjwvcD4KLTxwPjxiPk5vdGU8L2I+IDogV2hlbiB5b3UgYXNrIHF1ZXN0aW9ucyBpbiB0aGUgbWFpbGluZyBsaXN0LCBwbGVhc2UKLXJlbWVtYmVyIHRoYXQgZXZlcnlvbmUgd29ya2luZyBpbiBvdXIgcHJvamVjdCBhcmUgdm9sdW50ZWVycy4KLU5vLW9uZSBjYW4gYmUgZm9yY2VkIHRvIGZpeCB5b3VyIGJ1Z3MgKFNlZSA8YSBocmVmPQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2ZhcS5odG1sI3doYXQtaXMtYXBhY2hlLU5PVC1hYm91dCI+Ci1XaGF0IGlzIEFwYWNoZSBub3QgYWJvdXQ/PC9hPiApLjwvcD4KLTxwPk1ha2Ugc3VyZSB5b3UgYWRkIGVub3VnaCBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHByb2JsZW0gd2l0aAotc3RhY2t0cmFjZXMgYW5kIGFueSBvdGhlciBzdXBwb3J0aXZlIGluZm9ybWF0aW9uLiBJdCB3aWxsIGltcHJvdmUKLXRoZSBjaGFuY2VzIG9mIHlvdXIgcXVlc3Rpb24gYmVpbmcgYW5zd2VyZWQuIFByZWZpeGluZyB5b3VyIG1haWwKLXN1YmplY3Qgd2l0aCBwcmVmaXhlcyBsaWtlICJVUkdFTlQiIHdpbGwgbm90IGhlbHAgeW91IGluIGFueSBtZWFucy4KLVllcyB3ZSBhbHNvIGFjY2VwdCBhbGwgdGhlIGJsYW1lcyBhYm91dCBBeGlzMiBpbiB0aGVzZSBtYWlsaW5nCi1saXN0cywgYXMgdGhvc2Ugd2lsbCBkZWZpbml0ZWx5IGhlbHAgdXMgdG8gaW1wcm92ZSBBeGlzMiA6KSAuPC9wPgotPC9saT4KLTwvb2w+Ci08aDI+Q2xhc3MgTG9hZGluZyBJc3N1ZXM8L2gyPgotPG9sPgotPGxpPjxhIG5hbWU9ImIxIiBpZD0iYjEiPjwvYT48c3Ryb25nPkhvdyBkbyBJIGFjY2VzcyByZXNvdXJjZXMgdGhhdAotSSBwdXQgaW50byBteSBzZXJ2aWNlIC9tb2R1bGUgYXJjaGl2ZSBmaWxlPzwvc3Ryb25nPjwvbGk+Ci08bGkgc3R5bGU9Imxpc3Qtc3R5bGU6IG5vbmU7IGRpc3BsYXk6IGlubGluZSI+Ci08cD5BeGlzMiBoYXMgdGhlIG5vdGlvbiBvZiBzZXJ2aWNlIGlzb2xhdGlvbiB3aGVyZSBlYWNoIHNlcnZpY2Ugb3IKLW1vZHVsZSBnZXRzIGl0cyBvd24gY2xhc3MgbG9hZGVyLiBVc2luZyB0aGlzIGNsYXNzIGxvYWRlciB5b3UgY2FuCi1hY2Nlc3MgYW55IHJlc291cmNlIHRoYXQgeW91IHB1dCBpbnRvIHlvdXIgc2VydmljZSBhcmNoaXZlIGZpbGUuCi1Zb3UgbWF5IHdhbnQgdG8gYWNjZXNzIHlvdXIgcmVzb3VyY2VzIGZyb20gZGlmZmVyZW50IGxvY2F0aW9ucy4gRm9yCi1leGFtcGxlLDwvcD4KLTxwPjEuIEEgdGhpcmQgcGFydHkgbW9kdWxlIHdhbnRzIHRvIGFjY2VzcyB5b3VyIHJlc291cmNlcy4gVGhlbiB0aGUKLXNjZW5hcmlvIGlzIGFzIGZvbGxvd3M6PC9wPgotPHByZT4KLSAgIEF4aXNTZXJ2aWNlIG15U2VydmljZSA9Ci0gICBtZXNzYWdlQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEF4aXNTZXJ2aWNlKCJzZXJ2aWNlTmFtZSIpOyAKLTwvcHJlPgotPHA+b3I8L3A+Ci08cHJlPgotICAgQXhpc1NlcnZpY2UgbXlTZXJ2aWNlID0gbXNnQ3R4LmdldEF4aXNTZXJ2aWNlKCk7Ci08L3ByZT4KLTxwPlRoZW4geW91IGNhbiB1c2UgdGhlIHNlcnZpY2UgY2xhc3MgbG9hZGVyIHRocm91Z2ggd2hpY2ggeW91IGNhbgotYWNjZXNzIGl0cyByZXNvdXJjZXM8L3A+Ci08cHJlPgotICAgQ2xhc3NMb2FkZXIgY2xzTG9hZGVyID0gbXlTZXJ2aWNlLmdldFNlcnZpY2VDbGFzc0xvYWRlcigpOwotICAgY2xzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oIm15UmVzb3VyY2UiKTsKLTwvcHJlPgotPHA+Mi4gVG8gaW5pdGlhbGl6ZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhdCB0aGUKLU1lc3NhZ2VSZWNlaXZlciBsZXZlbCwgdGhlIGZvbGxvd2luZyBzdGVwcyBuZWVkIHRvIGJlIHRha2VuPC9wPgotPHByZT4KLSAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDdHguZ2V0QXhpc1NlcnZpY2UoKTsKLSAgIENsYXNzTG9hZGVyIGNsc0xvYWRlciA9IHNlcnZpY2UuZ2V0U2VydmljZUNsYXNzTG9hZGVyKCk7Ci0gICBDbGFzcy5mb3JOYW1lKCJzZXJ2aWNlTmFtZSIsY2xzTG9hZGVyLHRydWUpOwotPC9wcmU+Ci08cD5OT1RFIDogQXhpczIgZGVmYXVsdCBNZXNzYWdlUmVjaXZlciB1c2VzIHRoZSBzYW1lIHRlY2huaXF1ZSB0bwotaW5pdGlhbGl6ZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uczwvcD4KLTxwPjMuIElmIHlvdSB3YW50IHRvIGxvYWQgeW91ciByZXNvdXJjZXMgYXQgdGhlIHNlcnZpY2UKLWltcGxlbWVudGF0aW9uIGNsYXNzLCB0aGVuIHRoZSBzY2VuYXJpbyBpcyBhcyBmb2xsb3dzPC9wPgotPHByZT4KLSAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJteVJlc291cmNlIik7Ci08L3ByZT48L2xpPgotPC9vbD4KLTxoMj5DbGllbnQgQVBJPC9oMj4KLTxvbD4KLTxsaT48YSBuYW1lPSJjMSIgaWQ9ImMxIj48L2E+PHN0cm9uZz5JIHdhbnQgdG8gZG8gUmVxdWVzdC1SZXNwb25zZQotTWVzc2FnaW5nLCBXaGVyZSBzaG91bGQgSSBsb29rPzwvc3Ryb25nPjxiciAvPgotPHA+TG9vayBhdCB0aGUgPGEgaHJlZj0KLSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvY29yZS9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU2VydmljZUNsaWVudC5qYXZhIgotdGFyZ2V0PSJfYmxhbmsiPlNlcnZpY2VDbGllbnQ8L2E+IGNsYXNzLCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotcGxlYXNlIHJlYWQgdGhlIDxhIGhyZWY9IkBheGlzMl92ZXJzaW9uX2RpckAvYWR2LXVzZXJndWlkZS5odG1sIgotdGFyZ2V0PSJfYmxhbmsiPlVzZXIncyBHdWlkZTwvYT48L3A+Ci08L2xpPgotPGxpPjxhIG5hbWU9ImMyIiBpZD0iYzIiPjwvYT48c3Ryb25nPkkgd2FudCB0byBkbyBPbmUgV2F5Ci1NZXNzYWdpbmcsIFdoZXJlIHNob3VsZCBJIGxvb2s/PC9zdHJvbmc+PGJyIC8+Ci08cD5Gcm9tIEF4aXMyIDAuOTQgb253YXJkcywgYm90aCByZXF1ZXN0LXJlc3BvbnNlIGFuZCBvbmUgd2F5Ci1tZXNzYWdpbmcgd2lsbCBiZSBoYW5kbGVkIGJ5IDxhIGhyZWY9Ci0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YS9tb2R1bGVzL2NvcmUvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1NlcnZpY2VDbGllbnQuamF2YSIKLXRhcmdldD0iX2JsYW5rIj5TZXJ2aWNlQ2xpZW50PC9hPi48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+V2hlbiBJIHRyeSB0byBkbyBhIG5vbiBibG9ja2luZyBjYWxsIHdpdGg8L3N0cm9uZz4KLXVzZVNlcGFyYXRlTGlzdGVuZXI9dHJ1ZQotPHA+SSBnZXQgdGhlIGVycm9yIDxpPnRvIGRvIHR3byBUcmFuc3BvcnQgQ2hhbm5lbHMgdGhlIEFkZHJlc3NpbmcKLU1vZHVsZXMgbXVzdCBiZSBlbmdhZ2VkPC9pPiwgV2h5IGlzIHRoaXM/PGJyIC8+PC9wPgotPHA+VG8gZG8gdGhlIHR3byB0cmFuc3BvcnQgY2hhbm5lbCBpbnZvY2F0aW9uLCB5b3UgbmVlZCB0byBlbmdhZ2UKLXRoZSBhZGRyZXNzaW5nIG1vZHVsZS4gWW91IGNhbiBlbmFibGUgaXQgYnkgdW4tY29tbWVudGluZyB0aGUgZW50cnkKLWluIHRoZSBheGlzMi54bWwgZmlsZSBvciBDYWxsLmVuZ2FnZU1vZHVsZShRTmFtZSkuIEhvd2V2ZXIsCi1hZGRyZXNzaW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC48L3A+Ci08L2xpPgotPGxpPjxhIG5hbWU9ImM0IiBpZD0iYzQiPjwvYT48c3Ryb25nPkkgaGF2ZSBlbmdhZ2VkIGFkZHJlc3NpbmcsIGFuZAotd2hlbiBJIHRyeSB0byBpbnZva2UgYSBzZXJ2aWNlIEkgZ2V0IGFuIGV4Y2VwdGlvbjwvc3Ryb25nPjxiciAvPgotPHA+SWYgeW91IGhhdmUgZW5nYWdlZCBhZGRyZXNzaW5nLCB0aGVuIHlvdSBtdXN0IGhhdmUgd3NhOmFjdGlvbiwKLXRoZSByZXF1aXJlZCBXUy1BZGRyZXNzaW5nIGhlYWRlci4gWW91IGhhdmUgdG8gY2FsbDxiciAvPgotPGNvZGU+b3B0aW9uLnNldEFjdGlvbigidXJuOm15YWN0aW9uIik7PC9jb2RlPi4gTm90ZSB0aGF0IHRoZQotYWN0aW9uIHNob3VsZCBiZSBhIFVSSS48L3A+Ci08L2xpPgotPGxpPjxhIG5hbWU9ImM1IiBpZD0iYzUiPjwvYT48c3Ryb25nPldoYXQgaXMgQXhpczIKLVJlcG9zaXRvcnk/PC9zdHJvbmc+PGJyIC8+Ci08cD5UaGUgUmVwb3NpdG9yeSBzdG9yZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgQXhpczIuIFRoZSB1c2Vycwotc2hvdWxkIHNwZWNpZnkgdGhlIHJlcG9zaXRvcnkgZm9sZGVyIG9mIHRoZSBBeGlzIFNlcnZlciAoSFRUUCBvcgotVENQKS4gSW4gdGhlIGNhc2Ugb2YgVG9tY2F0LCBpdCBpcyB0aGUgd2ViYXBwcy9heGlzMi9XRUItSU5GCi1mb2xkZXIuIFRoZSBmb2xsb3dpbmcgcGljdHVyZSBzaG93cyBhIHNhbXBsZSByZXBvc2l0b3J5LjwvcD4KLTxpbWcgc3JjPSJpbWFnZXMvZmFxLzEuanBnIiAvPgotPHA+TW9kdWxlcyBhbmQgc2VydmljZXMgaGF2ZSBhbiBhcmNoaXZlIGZvcm1hdCBkZWZpbmVkIGFuZCB0aGV5IGFyZQotYXV0b21hdGljYWxseSBwaWNrZWQgdXAgYnkgQXhpczIgd2hlbiB0aGV5IGFyZSBjb3BpZWQgdG8KLWNvcnJlc3BvbmRpbmcgZm9sZGVycy48L3A+Ci08L2xpPgotPC9vbD4KLTxoMj5TZXJ2aWNlczwvaDI+Ci08b2w+Ci08bGk+PGEgbmFtZT0iZTEiIGlkPSJlMSI+PC9hPjxzdHJvbmc+SG93IGRvIEkgaGF2ZSBtdWx0aXBsZQotc2VydmljZXMgaW4gb25lIHNlcnZpY2UgYXJjaGl2ZT88L3N0cm9uZz48L2xpPgotPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lOyBkaXNwbGF5OiBpbmxpbmUiPgotPHA+SXQncyBqdXN0IGEgbWF0dGVyIG9mIHdyaXRpbmcgYSBzZXJ2aWNlcy54bWwgZmlsZSB0byBjb25maWd1cmUKLXRoZSBzZXJ2aWNlIG9yIHNlcnZpY2VzIGluIGFuIGFyY2hpdmUgZmlsZS4gVGhlIGNvcnJlc3BvbmRpbmcKLXNlcnZpY2VzLnhtbCA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gbG9vayBhcyBmb2xsb3dzLDwvcD4KLTxwcmU+Ci0gICAmbHQ7c2VydmljZUdyb3VwJmd0OwotICAgJmx0O3NlcnZpY2UgPHN0cm9uZz5uYW1lPSJteVNlcnZpY2UxIjwvc3Ryb25nPiZndDsKLSAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgotICAgJmx0Oy9zZXJ2aWNlJmd0OwotCi0gICAmbHQ7c2VydmljZSA8c3Ryb25nPm5hbWU9Im15U2VydmljZTIiPC9zdHJvbmc+Jmd0OwotICAgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0gICAmbHQ7L3NlcnZpY2UmZ3Q7Ci0gICAmbHQ7c2VydmljZUdyb3VwJmd0OwotPC9wcmU+Ci08cD5OT1RFIDogVGhlIG5hbWUgYXR0cmlidXRlIGlzIGEgY29tcHVsc29yeSBhdHRyaWJ1dGUgdGhhdCB3aWxsCi1iZWNvbWUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2VzLiBJZiB5b3Ugd2FudCB0byBoYXZlIG9uZSBzZXJ2aWNlIGluCi10aGUgYXJjaGl2ZSBmaWxlLCB0aGVuIHRoZXJlIGFyZSB0d28gb3B0aW9ucy4gWW91IGNhbiBlaXRoZXIgaGF2ZQotb25lIHNlcnZpY2UgaW5zaWRlIHRoZSBzZXJ2aWNlR3JvdXAgdGFnIG9yIGhhdmUgb25seSBvbmUgc2VydmljZQotdGFnLCBhcyBzaG93biBiZWxvdywgaW4geW91ciBzZXJ2aWNlcy54bWwsIGluIHdoaWNoIGNhc2UsIHRoZSBuYW1lCi1vZiB0aGUgc2VydmljZSB3aWxsIGJlIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIGZpbGUsIHdoaWNoIHlvdQotY2Fubm90IG92ZXJyaWRlLjwvcD4KLTxwcmU+Ci0gICAmbHQ7c2VydmljZSZndDsKLSAgIC4uLi4uLi4uLi4uLi4uLgotICAgJmx0O3NlcnZpY2UmZ3Q7Ci08L3ByZT48L2xpPgotPC9vbD4KLTxoMj5XZWIgQXJjaGl2ZSAvIFNlcnZlciBzaWRlPC9oMj4KLTxvbD4KLTxsaT48YSBuYW1lPSJmMSIgaWQ9ImYxIj48L2E+PHN0cm9uZz5JIHNlZSBhbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IKLXBhZ2Ugd2hlbiBJIHRyeSB0byB2aWV3IHRoZSBXU0RMIGZpbGUuPC9zdHJvbmc+PGJyIC8+Ci08cD5UaGlzIGhhcHBlbnMgc3BlY2lmaWNhbGx5IHdpdGggVG9tY2F0IDQueCBhbmQgNS4wIGluIGEgSkRLIDEuNQotZW52aXJvbm1lbnQuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgc3lzdGVtIHBpY2tzIHVwIGEgd3JvbmcKLXRyYW5zZm9ybWVyIGZhY3RvcnkgY2xhc3MuIFRoaXMgY2FuIGJlIHNvbHZlZCBzaW1wbHkgYnkgcHV0dGluZyB0aGUKLTxhIGhyZWY9Ci0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvamF2YS1yZXBvc2l0b3J5L3hhbGFuL2phcnMvIj54YWxhbi0yLjcuMC5qYXI8L2E+Ci1pbnRvIHRoZSBheGlzMi9XRUItSU5GL2xpYiBkaXJlY3Rvcnk8L3A+Ci08L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZ3VpZGVsaW5lcy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2d1aWRlbGluZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVjNDYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvZ3VpZGVsaW5lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5HdWlkZWxpbmVzPC90aXRsZT4NCi08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+UmVsZWFzZSBQcm9jZXNzPC9oMj4NCi08cD5DbGljayB0byByZWFkIG91ciA8YSBocmVmPSJyZWxlYXNlLXByb2Nlc3MuaHRtbCI+UmVsZWFzZSBQcm9jZXNzDQotR3VpZGVsaW5lczwvYT4uPC9wPg0KLTxoMj5NYWlsIEd1aWRlbGluZXM8L2gyPg0KLTxwPkV2ZXJ5IHZvbHVudGVlciBwcm9qZWN0IG9idGFpbnMgaXRzIHN0cmVuZ3RoIGZyb20gdGhlIHBlb3BsZQ0KLWludm9sdmVkIGluIGl0LiBNYWlsaW5nIGxpc3RzIHByb3ZpZGUgYSBzaW1wbGUgYW5kIGVmZmVjdGl2ZQ0KLWNvbW11bmljYXRpb24gbWVjaGFuaXNtLjwvcD4NCi08cD5Zb3UgYXJlIHdlbGNvbWUgdG8gam9pbiBhbnkgb2Ygb3VyIG1haWxpbmcgbGlzdHMgKG9yIGFsbCBvZiB0aGVtDQotaWYgeW91IHdpc2gpLiBZb3UgY2FuIGNob29zZSB0byBsdXJrLCBvciBhY3RpdmVseSBwYXJ0aWNpcGF0ZS4gSXQncw0KLXVwIHRvIHlvdS48L3A+DQotPHA+PGI+QmVmb3JlIHlvdSBqb2luIHRoZXNlIGxpc3RzLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHlvdQ0KLXJlYWQgYW5kIGZvbGxvdyB0aGUgaW5mb3JtYXRpb24gYmVsb3cuPC9iPjwvcD4NCi08cD5XZSBhc2sgdGhhdCB5b3UgZG8geW91ciBiZXN0IHRvIHJlc3BlY3QgdGhlIGNoYXJ0ZXIgb2YgdGhlDQotYXBwcm9wcmlhdGUgbWFpbGluZyBsaXN0LiBUaGVyZSBhcmUgZ2VuZXJhbGx5IHR3byB0eXBlcyBvZiBsaXN0cw0KLXRoYXQgeW91IGNhbiBqb2luLjwvcD4NCi08dWw+DQotPGxpPlRoZSAiVXNlciIgbGlzdCBpcyB3aGVyZSB5b3Ugc2hvdWxkIHNlbmQgcXVlc3Rpb25zIGFuZCBjb21tZW50cw0KLWFib3V0IGNvbmZpZ3VyYXRpb24sIHNldHVwLCB1c2FnZSBhbmQgb3RoZXIgInVzZXIiIHR5cGUgb2YNCi1xdWVzdGlvbnMuPC9saT4NCi08bGk+VGhlICJEZXZlbG9wZXIiIGxpc3QgaXMgd2hlcmUgeW91IHNob3VsZCBzZW5kIHF1ZXN0aW9ucyBhbmQNCi1jb21tZW50cyBhYm91dCB0aGUgYWN0dWFsIHNvZnR3YXJlIHNvdXJjZSBjb2RlIGFuZCBnZW5lcmFsDQotImRldmVsb3BtZW50IiB0eXBlIG9mIHF1ZXN0aW9ucy48L2xpPg0KLTwvdWw+DQotPHA+PGI+U3VtbWFyeSA6IFByZWZpeCBlYWNoIG1lc3NhZ2Ugc3ViamVjdCB3aXRoDQotIltBeGlzMl0iPC9iPjxiciAvPg0KLVlvdSBtYXkgYWxyZWFkeSBrbm93IHRoYXQgQXhpcyAxLnggaXMgc3RpbGwgZ29pbmcgcGFyYWxsZWwgd2l0aA0KLUF4aXMgMi4wLiBTbyBmb3IgZXZlcnlvbmUncyBjb252ZW5pZW5jZSwgcHJlZml4IHRoZSBzdWJqZWN0IG9mDQotPGI+ZXZlcnkgbWFpbDwvYj4gYWJvdXQgQXhpcyAyLjAgd2l0aCBbQXhpczJdLjwvcD4NCi08cD48Yj5TdW1tYXJ5OiBKb2luIHRoZSBsaXN0cyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgeW91cg0KLWRpc2N1c3Npb24uPC9iPjxiciAvPg0KLVBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIGpvaW5pbmcgdGhlIGxpc3QgdGhhdCBpcyBhcHByb3ByaWF0ZQ0KLWZvciB0aGUgdG9waWMgb3IgcHJvZHVjdCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGRpc2N1c3MuPC9wPg0KLTxwPjxiPlN1bW1hcnk6IERvIG5vdCBhYnVzZSByZXNvdXJjZXMgaW4gb3JkZXIgdG8gZ2V0DQotaGVscC48L2I+PGJyIC8+DQotQXNraW5nIHlvdXIgY29uZmlndXJhdGlvbiBvciB1c2VyIHR5cGUgb2YgcXVlc3Rpb24gb24gdGhlDQotZGV2ZWxvcGVycyBsaXN0IGJlY2F1c2UgeW91IHRoaW5rIHRoYXQgeW91IHdpbGwgZ2V0IGhlbHAgbW9yZQ0KLXF1aWNrbHkgYnkgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIGRldmVsb3BlcnMgaW5zdGVhZCBvZiB0byB0aGUgdXNlcg0KLWJhc2UgaXMgbm90IHZlcnkgbmljZS4gQ2hhbmNlcyBhcmUgdGhhdCBkb2luZyB0aGlzIHdpbGwgYWN0dWFsbHkNCi1wcmV2ZW50IHBlb3BsZSBmcm9tIGFuc3dlcmluZyB5b3VyIHF1ZXN0aW9uIGJlY2F1c2UgaXQgaXMgY2xlYXINCi10aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGFidXNlIHJlc291cmNlcy48L3A+DQotPHA+PGI+U3VtbWFyeTogRG8geW91ciBiZXN0IHRvIGVuc3VyZSB0aGF0IHlvdSBhcmUgbm90IHNlbmRpbmcgSFRNTA0KLW9yICJTdHlsZWxpemVkIiBlbWFpbCB0byB0aGUgbGlzdC48L2I+PGJyIC8+DQotSWYgeW91IGFyZSB1c2luZyBPdXRsb29rIG9yIE91dGxvb2sgRXhwcmVzcyBvciBFdWRvcmEsIGNoYW5jZXMgYXJlDQotdGhhdCB5b3UgYXJlIHNlbmRpbmcgSFRNTCBlbWFpbCBieSBkZWZhdWx0LiBUaGVyZSBpcyB1c3VhbGx5IGENCi1zZXR0aW5nIHRoYXQgd2lsbCBhbGxvdyB5b3UgdG8gc2VuZCAiUGxhaW4gVGV4dCIgZW1haWwuIElmIHlvdSBhcmUNCi11c2luZyBNaWNyb3NvZnQgcHJvZHVjdHMgdG8gc2VuZCBlbWFpbCwgdGhlcmUgYXJlIHNldmVyYWwgYnVncyBpbg0KLXRoZSBzb2Z0d2FyZSB0aGF0IHByZXZlbnQgeW91IGZyb20gdHVybmluZyBvZmYgdGhlIHNlbmRpbmcgb2YgSFRNTA0KLWVtYWlsLiBQbGVhc2UgcmVhZCB0aGlzIHBhZ2UgYXMgd2VsbC48L3A+DQotPHA+PGI+U3VtbWFyeTogV2F0Y2ggd2hlcmUgeW91IGFyZSBzZW5kaW5nIGVtYWlsLjwvYj48YnIgLz4NCi1UaGUgbWFqb3JpdHkgb2Ygb3VyIG1haWxpbmcgbGlzdHMgaGF2ZSBzZXQgdGhlIFJlcGx5LVRvIHRvIGdvIGJhY2sNCi10byB0aGUgbGlzdC4gVGhhdCBtZWFucyB0aGF0IHdoZW4geW91IFJlcGx5IHRvIGEgbWVzc2FnZSwgaXQgd2lsbA0KLWdvIHRvIHRoZSBsaXN0IGFuZCBub3QgdG8gdGhlIG9yaWdpbmFsIGF1dGhvciBkaXJlY3RseS4gVGhlIHJlYXNvbg0KLWlzIGJlY2F1c2UgaXQgaGVscHMgZmFjaWxpdGF0ZSBkaXNjdXNzaW9uIG9uIHRoZSBsaXN0IGZvciBldmVyeW9uZQ0KLXRvIGJlbmVmaXQgZnJvbS4gQmUgY2FyZWZ1bCBvZiB0aGlzIGFzIHNvbWV0aW1lcyB5b3UgbWF5IGludGVuZCB0bw0KLXJlcGx5IHRvIGEgbWVzc2FnZSBkaXJlY3RseSB0byBzb21lb25lIGluc3RlYWQgb2YgdGhlIGVudGlyZQ0KLWxpc3QuPC9wPg0KLTxwPjxiPlN1bW1hcnk6IERvIG5vdCBjcm9zc3Bvc3QgbWVzc2FnZXMuPC9iPjxiciAvPg0KLUluIG90aGVyIHdvcmRzLCBwaWNrIGEgbWFpbGluZyBsaXN0IGFuZCBzZW5kIHlvdXIgbWVzc2FnZXMgdG8gdGhhdA0KLW1haWxpbmcgbGlzdCBvbmx5LiBEbyBub3Qgc2VuZCB5b3VyIG1lc3NhZ2VzIHRvIG11bHRpcGxlIG1haWxpbmcNCi1saXN0cy4gVGhlIHJlYXNvbiBpcyB0aGF0IHBlb3BsZSBtYXkgYmUgc3Vic2NyaWJlZCB0byBvbmUgbGlzdCBhbmQNCi1ub3QgdG8gdGhlIG90aGVyLiBUaGVyZWZvcmUsIHNvbWUgcGVvcGxlIG1heSBvbmx5IHNlZSBoYWxmIG9mIHRoZQ0KLWNvbnZlcnNhdGlvbi48L3A+DQotPHA+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvYnJlYWRjcnVtYnMtYmcuZ2lmIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvYnJlYWRjcnVtYnMtYmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEwMzA0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW1hZ2VzL2JyZWFkY3J1bWJzLWJnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW1hZ2VzL2ZhcS8xLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW1hZ2VzL2ZhcS8xLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlN2VjNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9mYXEvMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9oMi1iZy5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9oMi1iZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZGIzMmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvaDItYmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbWFnZXMvbGVmdGNvbHVtbi1iZy5naWYgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9sZWZ0Y29sdW1uLWJnLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYWEyMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL2ltYWdlcy9sZWZ0Y29sdW1uLWJnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvaW5kZXgueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTE0YmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPgotPHRpdGxlPkFwYWNoZSBBeGlzMi9KYXZhIC0gTmV4dCBHZW5lcmF0aW9uIFdlYiBTZXJ2aWNlczwvdGl0bGU+Ci08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLW1lZGlhPSJhbGwiIC8+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLTxoMT5XZWxjb21lIHRvIEFwYWNoZSBBeGlzMi9KYXZhPC9oMT4KLTxwPkF4aXMyIGlzIGEgV2ViIFNlcnZpY2VzIC8gU09BUCAvIFdTREwgZW5naW5lLCB0aGUgc3VjY2Vzc29yIHRvIHRoZQotd2lkZWx5IHVzZWQgPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzLyI+QXBhY2hlIEF4aXM8L2E+IFNPQVAgc3RhY2suCi1UaGVyZSBhcmUgdHdvIGltcGxlbWVudGF0aW9ucwotb2YgdGhlIEFwYWNoZSBBeGlzMiBXZWIgc2VydmljZXMgZW5naW5lIC0gQXBhY2hlIEF4aXMyL0phdmEgYW5kCi1BcGFjaGUgQXhpczIvQzwvcD4KLTxwPldoaWxlIHlvdSB3aWxsIGZpbmQgYWxsIHRoZSBpbmZvcm1hdGlvbiBvbiBBcGFjaGUgQXhpczIvSmF2YQotaGVyZSwgeW91IGNhbiB2aXNpdCB0aGUgPGEgaHJlZj0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9jLyI+PHN0cm9uZz5BcGFjaGUgQXhpczIvQzwvc3Ryb25nPjwvYT4KLVdlYiBzaXRlIGZvciBBeGlzMi9DIGltcGxlbWVudGF0aW9uIGluZm9ybWF0aW9uLjwvcD4KLTxoMz5PY3RvYmVyIDIzLCAyMDA5IC0gQXBhY2hlIEF4aXMyL0phdmEgVmVyc2lvbiAxLjUuMSBSZWxlYXNlZCE8L2gzPgotPHA+VGhlIDEuNS4xIHZlcnNpb24gZml4ZXMgc29tZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQVhJUzIiPmJ1Z3M8L2E+LCBpbmNsdWRpbmcgbW9zdCBub3RhYmx5IGEgY29ubmVjdGlvbiBzdGFydmF0aW9uIGlzc3VlIHRoYXQgd291bGQgY2F1c2UgYSBsYXJnZSBudW1iZXIgb2Ygc29ja2V0cyBzdHVjayBpbiBDTE9TRV9XQUlUIG9yIFRJTUVfV0FJVC48L3A+Ci08cD48Yj5QTEVBU0UgTk9URTo8L2I+IEFzIG9mIEF4aXMyIDEuNSwgd2Ugbm93IDxpPnJlcXVpcmU8L2k+IEpESyAxLjUgb3IgYWJvdmUuICBKREtzIDEuNCBvciBwcmV2aW91cyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC48L3A+Ci08cD5bIDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvZG93bmxvYWQuY2dpIj48c3Ryb25nPkRvd25sb2FkPC9zdHJvbmc+PC9hPgotXSB8IFsgPGEgaHJlZj0iMV81XzEvY29udGVudHMuaHRtbCI+PHN0cm9uZz5Eb2N1bWVudHMgSG9tZTwvc3Ryb25nPjwvYT4KLV08L3A+Ci08cD5QbGVhc2Ugc2VlIHRoZSA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzL3JlZi5odG1sIj5BeGlzCi1SZWZlcmVuY2UgTGlicmFyeTwvYT4gZm9yIGEgbGlzdCBvZiB0ZWNobmljYWwgcmVzb3VyY2VzIHRoYXQgc2hvdWxkCi1wcm92ZSB1c2VmdWwgb24gdGhpcyBwcm9qZWN0LjwvcD4KLTxoMz48ZW0+V2h5IEFwYWNoZSBBeGlzMjo8L2VtPjwvaDM+Ci08cD5BIG5ldyBhcmNoaXRlY3R1cmUgZm9yIEF4aXMyIHdhcyBpbnRyb2R1Y2VkIGR1cmluZyB0aGUgQXVndXN0Ci0yMDA0IFN1bW1pdCBpbiBDb2xvbWJvLCBTcmkgTGFua2EuIFRoZSBuZXcgYXJjaGl0ZWN0dXJlIG9uIHdoaWNoCi1BeGlzMiBpcyBiYXNlZCBvbiBpcyBtb3JlIGZsZXhpYmxlLCBlZmZpY2llbnQgYW5kIGNvbmZpZ3VyYWJsZSBpbgotY29tcGFyaXNvbiB0byA8YSBocmVmPQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMvamF2YS9hcmNoaXRlY3R1cmUtZ3VpZGUuaHRtbCI+QXhpczEueAotYXJjaGl0ZWN0dXJlPC9hPi4gU29tZSB3ZWxsIGVzdGFibGlzaGVkIGNvbmNlcHRzIGZyb20gQXhpcyAxLngsCi1saWtlIGhhbmRsZXJzIGV0Yy4sIGhhdmUgYmVlbiBwcmVzZXJ2ZWQgaW4gdGhlIG5ldwotYXJjaGl0ZWN0dXJlLjwvcD4KLTxwPkFwYWNoZSBBeGlzMiBub3Qgb25seSBzdXBwb3J0cyBTT0FQIDEuMSBhbmQgU09BUCAxLjIsIGJ1dCBpdAotYWxzbyBoYXMgaW50ZWdyYXRlZCBzdXBwb3J0IGZvciB0aGUgd2lkZWx5IHBvcHVsYXIgPGEgaHJlZj0KLSJodHRwOi8vd3d3Lnhmcm9udC5jb20vUkVTVC1XZWItU2VydmljZXMuaHRtbCI+UkVTVCBzdHlsZSBvZiBXZWIKLXNlcnZpY2VzPC9hPi4gVGhlIHNhbWUgYnVzaW5lc3MgbG9naWMgaW1wbGVtZW50YXRpb24gY2FuIG9mZmVyIGJvdGgKLWEgV1MtKiBzdHlsZSBpbnRlcmZhY2UgYXMgd2VsbCBhcyBhIFJFU1QvUE9YIHN0eWxlIGludGVyZmFjZQotc2ltdWx0YW5lb3VzbHkuPC9wPgotPHA+QXBhY2hlIEF4aXMyIGlzIG1vcmUgZWZmaWNpZW50LCBtb3JlIG1vZHVsYXIgYW5kIG1vcmUKLVhNTC1vcmllbnRlZCB0aGFuIHRoZSBvbGRlciB2ZXJzaW9uLiBJdCBpcyBjYXJlZnVsbHkgZGVzaWduZWQgdG8KLXN1cHBvcnQgdGhlIGVhc3kgYWRkaXRpb24gb2YgcGx1Zy1pbiAibW9kdWxlcyIgdGhhdCBleHRlbmQgdGhlaXIKLWZ1bmN0aW9uYWxpdHkgZm9yIGZlYXR1cmVzIHN1Y2ggYXMgc2VjdXJpdHkgYW5kIHJlbGlhYmlsaXR5LiBUaGUKLTxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL21vZHVsZXMvaW5kZXguaHRtbCI+TW9kdWxlczwvYT4KLWN1cnJlbnRseSBhdmFpbGFibGUgb3IgdW5kZXIgZGV2ZWxvcG1lbnQgaW5jbHVkZTo8L3A+Ci08dWw+Ci08bGk+PGEgaHJlZj0KLSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvdGNfaG9tZS5waHA/d2dfYWJicmV2PXdzcm0iCi10YXJnZXQ9Il9ibGFuayI+V1MtUmVsaWFibGVNZXNzYWdpbmc8L2E+IC0gU3VwcG9ydGVkIGJ5IDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2FuZGVzaGEvc2FuZGVzaGEyLyI+QXBhY2hlCi1TYW5kZXNoYTI8L2E+PC9saT4KLTxsaT48YSBocmVmPQotImh0dHA6Ly93d3ctMTI4LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS9zcGVjaWZpY2F0aW9uL3dzLXR4LyNjb29yIgotdGFyZ2V0PSJfYmxhbmsiPldTLUNvb3JkaW5hdGlvbjwvYT4gYW5kIDxhIGhyZWY9Ci0iaHR0cDovL3d3dy0xMjguaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L3NwZWNpZmljYXRpb24vd3MtdHgvI2F0b20iCi10YXJnZXQ9Il9ibGFuayI+V1MtQXRvbWljVHJhbnNhY3Rpb248L2E+IC0gU3VwcG9ydGVkIGJ5IDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcva2FuZHVsYS8iPkFwYWNoZSBLYW5kdWxhMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ci0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3RjX2hvbWUucGhwP3dnX2FiYnJldj13c3MiCi10YXJnZXQ9Il9ibGFuayI+V1MtU2VjdXJpdHk8L2E+IC0gU3VwcG9ydGVkIGJ5IDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9yYW1wYXJ0LzFfMi9zZWN1cml0eS1tb2R1bGUuaHRtbCI+Ci1BcGFjaGUgUmFtcGFydDwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N1Ym1pc3Npb24vd3MtYWRkcmVzc2luZy8iIHRhcmdldD0KLSJfYmxhbmsiPldTLUFkZHJlc3Npbmc8L2E+IC1Nb2R1bGUgaW5jbHVkZWQgYXMgcGFydCBvZiBBeGlzMgotY29yZTwvbGk+Ci08L3VsPgotPHA+QXBhY2hlIEF4aXMyIGlzIGJ1aWx0IG9uIDxhIGhyZWY9Ci0iaHR0cDovL3dzLmFwYWNoZS5vcmcvY29tbW9ucy9heGlvbS9pbmRleC5odG1sIj5BcGFjaGUgQVhJT008L2E+LCBhCi1uZXcgaGlnaCBwZXJmb3JtYW50LCBwdWxsLWJhc2VkIFhNTCBvYmplY3QgbW9kZWwuPC9wPgotPHA+QXhpczIgY29tZXMgd2l0aCBtYW55IG5ldyBmZWF0dXJlcywgZW5oYW5jZW1lbnRzIGFuZCBpbmR1c3RyeQotc3BlY2lmaWNhdGlvbiBpbXBsZW1lbnRhdGlvbnMuIFRoZSBrZXkgZmVhdHVyZXMgb2ZmZXJlZCBhcmUgYXMKLWZvbGxvd3M6PC9wPgotPHVsPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5TcGVlZDwvc3Ryb25nPiAtIEF4aXMyIHVzZXMKLWl0cyBvd24gb2JqZWN0IG1vZGVsIGFuZCBTdEFYIChTdHJlYW1pbmcgQVBJIGZvciBYTUwpIHBhcnNpbmcgdG8KLWFjaGlldmUgc2lnbmlmaWNhbnRseSBncmVhdGVyIHNwZWVkIHRoYW4gZWFybGllciB2ZXJzaW9ucyBvZiBBcGFjaGUKLUF4aXMuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+TG93IG1lbW9yeSBmb290Ci1wcmludDwvc3Ryb25nPi0gQXhpczIgd2FzIGRlc2lnbmVkIGdyb3VuZC11cCBrZWVwaW5nIGxvdyBtZW1vcnkKLWZvb3QgcHJpbnQgaW4gbWluZC48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5BWElPTTwvc3Ryb25nPiAtIEF4aXMyIGNvbWVzCi13aXRoIGl0cyBvd24gbGlnaHQtd2VpZ2h0IG9iamVjdCBtb2RlbCwgQVhJT00sIGZvciBtZXNzYWdlCi1wcm9jZXNzaW5nIHdoaWNoIGlzIGV4dGVuc2libGUsIGhpZ2hseSBwZXJmb3JtYW50IGFuZCBpcyBkZXZlbG9wZXIKLWNvbnZlbmllbnQuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+PGEgbmFtZT0iSG90X0RlcGxveW1lbnQiIGlkPQotIkhvdF9EZXBsb3ltZW50Ij48L2E+SG90IERlcGxveW1lbnQ8L3N0cm9uZz4gLSBBeGlzMiBpcyBlcXVpcHBlZAotd2l0aCB0aGUgY2FwYWJpbGl0eSBvZiBkZXBsb3lpbmcgV2ViIHNlcnZpY2VzIGFuZCBoYW5kbGVycyB3aGlsZQotdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gSW4gb3RoZXIgd29yZHMsIG5ldyBzZXJ2aWNlcyBjYW4gYmUKLWFkZGVkIHRvIHRoZSBzeXN0ZW0gd2l0aG91dCBoYXZpbmcgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIuIFNpbXBseQotZHJvcCB0aGUgcmVxdWlyZWQgV2ViIHNlcnZpY2UgYXJjaGl2ZSBpbnRvIHRoZSBzZXJ2aWNlcyBkaXJlY3RvcnkKLWluIHRoZSByZXBvc2l0b3J5LCBhbmQgdGhlIGRlcGxveW1lbnQgbW9kZWwgd2lsbCBhdXRvbWF0aWNhbGx5Ci1kZXBsb3kgdGhlIHNlcnZpY2UgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB1c2UuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+QXN5bmNocm9ub3VzIFdlYgotc2VydmljZXM8L3N0cm9uZz4gLSBBeGlzMiBub3cgc3VwcG9ydHMgYXN5bmNocm9ub3VzIFdlYiBzZXJ2aWNlcwotYW5kIGFzeW5jaHJvbm91cyBXZWIgc2VydmljZXMgaW52b2NhdGlvbiB1c2luZyBub24tYmxvY2tpbmcgY2xpZW50cwotYW5kIHRyYW5zcG9ydHMuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+TUVQIFN1cHBvcnQ8L3N0cm9uZz4gLSBBeGlzMgotbm93IGNvbWVzIGhhbmR5IHdpdGggdGhlIGZsZXhpYmlsaXR5IHRvIHN1cHBvcnQgTWVzc2FnZSBFeGNoYW5nZQotUGF0dGVybnMgKE1FUHMpIHdpdGggaW4tYnVpbHQgc3VwcG9ydCBmb3IgYmFzaWMgTUVQcyBkZWZpbmVkIGluCi1XU0RMIDIuMC48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5GbGV4aWJpbGl0eTwvc3Ryb25nPiAtIFRoZQotQXhpczIgYXJjaGl0ZWN0dXJlIGdpdmVzIHRoZSBkZXZlbG9wZXIgY29tcGxldGUgZnJlZWRvbSB0byBpbnNlcnQKLWV4dGVuc2lvbnMgaW50byB0aGUgZW5naW5lIGZvciBjdXN0b20gaGVhZGVyIHByb2Nlc3NpbmcsIHN5c3RlbQotbWFuYWdlbWVudCwgYW5kIDxlbT5hbnl0aGluZyBlbHNlIHlvdSBjYW4gaW1hZ2luZTwvZW0+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPlN0YWJpbGl0eTwvc3Ryb25nPiAtIEF4aXMyCi1kZWZpbmVzIGEgc2V0IG9mIHB1Ymxpc2hlZCBpbnRlcmZhY2VzIHdoaWNoIGNoYW5nZSByZWxhdGl2ZWx5Ci1zbG93bHkgY29tcGFyZWQgdG8gdGhlIHJlc3Qgb2YgQXhpcy48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5Db21wb25lbnQtb3JpZW50ZWQKLURlcGxveW1lbnQ8L3N0cm9uZz4gLSBZb3UgY2FuIGVhc2lseSBkZWZpbmUgcmV1c2FibGUgbmV0d29ya3Mgb2YKLUhhbmRsZXJzIHRvIGltcGxlbWVudCBjb21tb24gcGF0dGVybnMgb2YgcHJvY2Vzc2luZyBmb3IgeW91cgotYXBwbGljYXRpb25zLCBvciB0byBkaXN0cmlidXRlIHRvIHBhcnRuZXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cCBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMGluIj48c3Ryb25nPlRyYW5zcG9ydCBGcmFtZXdvcms8L3N0cm9uZz4KLS0gV2UgaGF2ZSBhIGNsZWFuIGFuZCBzaW1wbGUgYWJzdHJhY3Rpb24gZm9yIGludGVncmF0aW5nIGFuZCB1c2luZwotVHJhbnNwb3J0cyAoaS5lLiwgc2VuZGVycyBhbmQgbGlzdGVuZXJzIGZvciBTT0FQIG92ZXIgdmFyaW91cwotcHJvdG9jb2xzIHN1Y2ggYXMgU01UUCwgRlRQLCBtZXNzYWdlLW9yaWVudGVkIG1pZGRsZXdhcmUsIGV0YyksIGFuZAotdGhlIGNvcmUgb2YgdGhlIGVuZ2luZSBpcyBjb21wbGV0ZWx5IHRyYW5zcG9ydC1pbmRlcGVuZGVudC48L3A+Ci08L2xpPgotPGxpPgotPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDBpbiI+PHN0cm9uZz5XU0RMIHN1cHBvcnQ8L3N0cm9uZz4gLSBBeGlzMgotc3VwcG9ydHMgdGhlIFdlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIExhbmd1YWdlLCB2ZXJzaW9uIDxhIGhyZWY9Ci0iaHR0cDovL3d3dy53My5vcmcvVFIvd3NkbCI+MS4xPC9hPiBhbmQgPGEgaHJlZj0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi93c2RsMjAvIj4yLjA8L2E+LCB3aGljaCBhbGxvd3MgeW91IHRvIGVhc2lseQotYnVpbGQgc3R1YnMgdG8gYWNjZXNzIHJlbW90ZSBzZXJ2aWNlcywgYW5kIGFsc28gdG8gYXV0b21hdGljYWxseQotZXhwb3J0IG1hY2hpbmUtcmVhZGFibGUgZGVzY3JpcHRpb25zIG9mIHlvdXIgZGVwbG95ZWQgc2VydmljZXMgZnJvbQotQXhpczIuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+QWRkLW9uczwvc3Ryb25nPiAtIFNldmVyYWwKLVdlYiBzZXJ2aWNlcyBzcGVjaWZpY2F0aW9ucyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkIGluY2x1ZGluZwotPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvd3NzNGovIiB0YXJnZXQ9Il9ibGFuayI+V1NTNEo8L2E+IGZvcgotc2VjdXJpdHkgKEFwYWNoZSBSYW1wYXJ0KSwgPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvc2FuZGVzaGEvIgotdGFyZ2V0PSJfYmxhbmsiPlNhbmRlc2hhPC9hPiBmb3IgcmVsaWFibGUgbWVzc2FnaW5nLCA8YSBocmVmPQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2thbmR1bGEvIiB0YXJnZXQ9Il9ibGFuayI+S2FuZHVsYTwvYT4gd2hpY2gKLWlzIGFuIGVuY2Fwc3VsYXRpb24gb2YgV1MtQ29vcmRpbmF0aW9uLCBXUy1BdG9taWNUcmFuc2FjdGlvbiBhbmQKLVdTLUJ1c2luZXNzQWN0aXZpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAwaW4iPjxzdHJvbmc+Q29tcG9zaXRpb24gYW5kCi1FeHRlbnNpYmlsaXR5PC9zdHJvbmc+IC0gTW9kdWxlcyBhbmQgcGhhc2VzIGltcHJvdmUgc3VwcG9ydCBmb3IKLWNvbXBvc2FiaWxpdHkgYW5kIGV4dGVuc2liaWxpdHkuIE1vZHVsZXMgc3VwcG9ydCBjb21wb3NhYmlsaXR5IGFuZAotY2FuIGFsc28gc3VwcG9ydCBuZXcgV1MtKiBzcGVjaWZpY2F0aW9ucyBpbiBhIHNpbXBsZSBhbmQgY2xlYW4KLW1hbm5lci4gVGhleSBhcmUgaG93ZXZlciBub3QgPGEgaHJlZj0iI0hvdF9EZXBsb3ltZW50Ij5ob3QKLWRlcGxveWFibGU8L2E+IGFzIHRoZXkgY2hhbmdlIHRoZSBvdmVyYWxsIGJlaGF2aW9yIG9mIHRoZQotc3lzdGVtLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+V2UgaG9wZSB5b3UgZW5qb3kgdXNpbmcgQXhpczIuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBhbgotb3Blbi1zb3VyY2UgZWZmb3J0LiBJZiB5b3UgZmVlbCB0aGUgY29kZSBjb3VsZCB1c2UgbmV3IGZlYXR1cmVzIG9yCi1maXhlcywgb3IgdGhlIGRvY3VtZW50YXRpb24gY2FuIGJlIGltcHJvdmVkLCBwbGVhc2UgZ2V0IGludm9sdmVkCi1hbmQgbGVuZCB1cyBhIGhhbmQhIFRoZSBBeGlzIGRldmVsb3BlciBjb21tdW5pdHkgd2VsY29tZXMgeW91cgotcGFydGljaXBhdGlvbi48L3A+Ci08cD5MZXQgdXMga25vdyB3aGF0IHlvdSB0aGluayEgU2VuZCB5b3VyIGZlZWRiYWNrIG9uIEF4aXMyIHRvCi0iPGEgaHJlZj0KLSJtYWlsdG86YXhpcy11c2VyQHdzLmFwYWNoZS5vcmciPmF4aXMtdXNlckB3cy5hcGFjaGUub3JnPC9hPiIuIE1ha2UKLXN1cmUgdG8gcHJlZml4IHRoZSBzdWJqZWN0IG9mIHRoZSBtYWlsIHdpdGggW0F4aXMyXS48L3A+Ci08aDI+RmVhdHVyZXMgb2YgQXhpczIgTGF0ZXN0IFZlcnNpb248L2gyPgotPHA+QXBhY2hlIEF4aXMyIFZlcnNpb24gMS40IGNvbWVzIHdpdGggcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGFuZAotYSBudW1iZXIgYnVnIGZpeGVzIG92ZXIgdGhlIDEuMyByZWxlYXNlLiBDaGVjayBvdXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YKLWZlYXR1cmVzIGJlbG93LjwvcD4KLTxoMz5Qcm9ncmFtbWluZyBNb2RlbDwvaDM+Ci08dWw+Ci08bGk+SW1wcm92ZWQsIFhNTC1jZW50cmljIGNsaWVudCBBUEkgaW5jbHVkaW5nIGZ1bGwgV1NETCBhbmQgcG9saWN5Ci1zdXBwb3J0PC9saT4KLTxsaT48YSBocmVmPSJAYXhpczJfdmVyc2lvbl9kaXJAL2pheHdzLWd1aWRlLmh0bWwiPlN1cHBvcnQgZm9yIEpBWFdTLXN0eWxlIHNlcnZpY2VzIGFuZCBjbGllbnRzPC9hPjwvbGk+Ci08bGk+U3VwcG9ydCBmb3IgUE9KTyBhbmQgU3ByaW5nIHNlcnZpY2VzIGFuZCBjbGllbnRzPC9saT4KLTxsaT5TdXBwb3J0IGZvciBhbnkgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuPC9saT4KLTxsaT5TeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIGNhbGxzPC9saT4KLTxsaT5BcmNoaXZlZCBzZXJ2aWNlIGRlcGxveW1lbnQgbW9kZWwgc3VwcG9ydGluZyBmdWxsIHNlcnZpY2UKLWVuY2Fwc3VsYXRpb24gd2l0aCB2ZXJzaW9uaW5nIHN1cHBvcnQ8L2xpPgotPGxpPkFyY2hpdmVkIG1vZHVsZSBkZXBsb3ltZW50IG1vZGVsIHN1cHBvcnRpbmcgY29udHJvbGxlZAotZXh0ZW5zaWJpbGl0eSB3aXRoIHZlcnNpb25pbmcgc3VwcG9ydDwvbGk+Ci08bGk+PGEgaHJlZj0iI0hvdF9EZXBsb3ltZW50Ij5Ib3QgZGVwbG95bWVudDwvYT48L2xpPgotPGxpPldTLVBvbGljeSBkcml2ZW4gY29kZSBnZW5lcmF0aW9uIGV4dGVuc2lvbnM8L2xpPgotPGxpPkZsZXhpYmxlIHNlcnZpY2UgbGlmZSBjeWNsZSBtb2RlbDwvbGk+Ci08bGk+QXV0b21hdGljIHN1cHBvcnQgZm9yIFBPWCAoUkVTVCkgc3R5bGUgaW52b2NhdGlvbiBvZgotc2VydmljZXM8L2xpPgotPGxpPlN1cHBvcnQgZm9yIHF1ZXJ5aW5nIGEgc2VydmljZSdzIFdTREwgKHVzaW5nID93c2RsKSwgc2NoZW1hCi0odXNpbmcgP3hzZCkgYW5kIHBvbGljaWVzICh1c2luZyA/cG9saWN5KTwvbGk+Ci08bGk+V1NETCAyLjA8L2xpPgotPGxpPkN1c3RvbSBEZXBsb3llcnM8L2xpPgotPGxpPkJpbmFyeSBzZXJpYWxpemF0aW9uIChGYXN0IEluZm9zZXQpPC9saT4KLTxsaT5KU09OIHN1cHBvcnQ8L2xpPgotPGxpPkVKQiBQcm92aWRlciBzdXBwb3J0PC9saT4KLTwvdWw+Ci08aDM+U3VwcG9ydGVkIFNwZWNpZmljYXRpb25zPC9oMz4KLTx1bD4KLTxsaT5TT0FQIDEuMSBhbmQgMS4yPC9saT4KLTxsaT5NZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtIChNVE9NKSwgWE1MCi1PcHRpbWl6ZWQgUGFja2FnaW5nIChYT1ApIGFuZCBTT0FQIHdpdGggQXR0YWNobWVudHM8L2xpPgotPGxpPldTREwgMS4xLCBpbmNsdWRpbmcgYm90aCBTT0FQIGFuZCBIVFRQIGJpbmRpbmdzPC9saT4KLTxsaT5XUy1BZGRyZXNzaW5nIChzdWJtaXNzaW9uIGFuZCBmaW5hbCk8L2xpPgotPGxpPldTLVBvbGljeTwvbGk+Ci08bGk+U0FBSiAxLjE8L2xpPgotPC91bD4KLTxoMz5UcmFuc3BvcnRzPC9oMz4KLTx1bD4KLTxsaT5IVFRQPC9saT4KLTxsaT5TTVRQPC9saT4KLTxsaT5KTVM8L2xpPgotPGxpPlRDUDwvbGk+Ci08L3VsPgotPGgzPlN1cHBvcnRlZCBEYXRhIEJpbmRpbmdzPC9oMz4KLTx1bD4KLTxsaT5BeGlzIERhdGEgQmluZGluZyAoQURCKTwvbGk+Ci08bGk+WE1MQmVhbnM8L2xpPgotPGxpPkppYlg8L2xpPgotPGxpPkpheEJSSSAoRXhwZXJpbWVudGFsKTwvbGk+Ci08L3VsPgotPGgyPjxhIG5hbWU9IlRvb2xzX2luY2x1ZGVkX2luIHRoaXNfUmVsZWFzZSI+VG9vbHMgSW5jbHVkZWQgaW4gVGhpcwotUmVsZWFzZTwvYT48L2gyPgotPHA+WzxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0KLSJfYmxhbmsiPkRvd25sb2FkIFRvb2wgUGx1Zy1pbnM8L2E+XTwvcD4KLTxvbCB0eXBlPSIxIj4KLTxsaT5BeGlzMiBXZWIgQXBwbGljYXRpb24gKFdlYiBBcHApPC9saT4KLTxsaT5XU0RMMldTLSA8YSBocmVmPSJ0b29scy8xXzIvZWNsaXBzZS93c2RsMmphdmEtcGx1Z2luLmh0bWwiCi10YXJnZXQ9Il9ibGFuayI+ZWNsaXBzZSBwbHVnLWluPC9hPjxhPi88L2E+IDxhIGhyZWY9Ci0idG9vbHMvMV8yL0NvZGVnZW5Ub29sUmVmZXJlbmNlLmh0bWwiIHRhcmdldD0iX2JsYW5rIj5Db21tYW5kIGxpbmUKLXZlcnNpb248L2E+PGE+LzwvYT48YSBocmVmPQotInRvb2xzLzFfMi9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUuaHRtbCNXU0RMMkphdmFfQ29kZV9HZW5lcmF0aW9uIgotdGFyZ2V0PSJfYmxhbmsiPkludGVsbGlKIElERUEgcGx1Zy1pbjwvYT48YT4vPC9hPjxhIGhyZWY9Ci0idG9vbHMvMV8yL21hdmVuLXBsdWdpbnMvbWF2ZW4td3NkbDJjb2RlLXBsdWdpbi5odG1sIiB0YXJnZXQ9Ci0iX2JsYW5rIj5NYXZlbjIgV1NETDJDb2RlIFBsdWctaW48L2E+PC9saT4KLTxsaT5TZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLSA8YSBocmVmPQotInRvb2xzLzFfMi9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4uaHRtbCIgdGFyZ2V0PQotIl9ibGFuayI+ZWNsaXBzZSBwbHVnLWluPC9hPi8gPGEgaHJlZj0KLSJ0b29scy8xXzIvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLmh0bWwjQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSIKLXRhcmdldD0iX2JsYW5rIj5JbnRlbGxpSiBJREVBIHBsdWctaW48L2E+LyA8YSBocmVmPQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLWFhci1wbHVnaW4uaHRtbCIgdGFyZ2V0PQotIl9ibGFuayI+TWF2ZW4yIEFBUiBQbHVnLWluPC9hPjwvbGk+Ci08bGk+SmF2YTJXU0RMLSA8YSBocmVmPQotInRvb2xzLzFfMi9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4uaHRtbCIgdGFyZ2V0PQotIl9ibGFuayI+TWF2ZW4yIEphdmEyV1NETCBQbHVnLWluPC9hPjwvbGk+Ci08L29sPgotPGgyPkV4dGVuc2lvbiBNb2R1bGVzPC9oMj4KLTx1bD4KLTxsaT5BcGFjaGUgUmFtcGFydDogU3VwcG9ydGluZyBXUy1TZWN1cml0eSAoYW5kIHNvb24KLVdTLVBvbGljeSk8L2xpPgotPGxpPkFwYWNoZSBTYW5kZXNoYTI6IFN1cHBvcnRpbmcgV1MtUmVsaWFibGUgTWVzc2FnaW5nPC9saT4KLTwvdWw+Ci0oQXBhY2hlIEF4aXMyIGNvbWVzIGJ1aWx0IGluIHdpdGggYSBtb2R1bGUgdGhhdCBzdXBwb3J0cwotV1MtQWRkcmVzc2luZy4pCi08aDI+S25vd24gSXNzdWVzIGFuZCBMaW1pdGF0aW9uczwvaDI+Ci08aDI+QXJjaGl2ZWQgTmV3czwvaDI+Ci08cD5Gb3IgaW5mb3JtYXRpb24gb24gcHJldmlvdXMgQXhpczIgcmVsZWFzZXMgcnVubmluZyB1cCB0byB0aGUKLWN1cnJlbnQgcmVsZWFzZSBzZWUgdGhlIDxhIGhyZWY9ImFyY2hpdmVkX25ld3MuaHRtbCIgdGFyZ2V0PQotIl9ibGFuayI+J0F4aXMyIEFyY2hpdmVkIE5ld3MnPC9hPiBwYWdlLjwvcD4KLUZvciBvdGhlciBuZXdzIGl0ZW1zIGZyb20gQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gc2VlOgotPHVsPgotPGxpPjxhIGhyZWY9Ci0iaHR0cDovL3d3dy5hcGFjaGVuZXdzLm9yZy9hcmNoaXZlcy9jYXRfYXBhY2hlX3dlYnNlcnZpY2VzX2luZGV4Lmh0bWwiPgotV2ViIHNlcnZpY2VzIHJlbGF0ZWQgbmV3cyBvbiB0aGUgQXBhY2hlIE5ld3MgQmxvZyBPbmxpbmU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZW5ld3Mub3JnLyI+VGhlIEFwYWNoZSBOZXdzIEJsb2cKLU9ubGluZTwvYT48L2xpPgotPC91bD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbWF2ZW4taGVscC54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21hdmVuLWhlbHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRiNDk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbWF2ZW4taGVscC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotICAgIDxoZWFkPg0KLSAgICAgICAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSAgICAgICAgICAgICAgICAiSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIi8+DQotICAgICAgICA8dGl0bGU+UXVpY2sgR3VpZGUgdG8gTWF2ZW4gZm9yIEF4aXMgMi4wPC90aXRsZT4NCi0gICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0NCi0gICAgICAgICAgICAgICAgInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIvPg0KLSAgICAgICAgPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotICAgICAgICAgICAgICBtZWRpYT0iYWxsIi8+DQotICAgIDwvaGVhZD4NCi0gICAgPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotICAgICAgICA8aDEgYWxpZ249ImNlbnRlciI+UXVpY2sgR3VpZGUgdG8gTWF2ZW4gZm9yIEF4aXMgMi4wPC9oMT4NCi0gICAgICAgIDxoMiBhbGlnbj0ibGVmdCI+SW50cm9kdWN0aW9uPC9oMj4NCi0gICAgICAgIDxwIGFsaWduPSJsZWZ0Ij4NCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZyI+TWF2ZW4gMjwvYT4NCi0gICAgICAgICAgICBpcyB1c2VkDQotICAgICAgICAgICAgYXMgdGhlIGJ1aWxkIGVudmlyb25tZW50IGZvciBBeGlzMi4gVGhpcyBkb2N1bWVudCB3aWxsIHByb3ZpZGUgYSBxdWljaw0KLSAgICAgICAgICAgIGd1aWRlIG9uIGhvdyB0byB1c2UgTWF2ZW4gd2l0aCBvdXIgcHJvamVjdC4NCi0gICAgICAgIDwvcD4NCi0gICAgICAgIDxoMiBhbGlnbj0ibGVmdCI+Q29tbWFuZHM8L2gyPg0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgYWxpZ249ImNlbnRlciI+DQotICAgICAgICAgICAgPHRib2R5Pg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9ImNvbCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+Q29tbWFuZDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90aD4NCi0gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT0iY29sIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90aD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPm12biBjbGVhbjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+Q2xlYW5zIGFsbCB0aGUgY29udGVudCBidWlsdCBzbyBmYXIgaW4gdGhlIHRhcmdldC8gZm9sZGVyLiBUaGlzDQotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBub3QgZGVsZXRlIGphcnMgZnJvbSB5b3VyIGxvY2FsIHJlcG9zaXRvcnkuDQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+bXZuIGluc3RhbGw8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+UnVuIGEgZnVsbCBidWlsZC48L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gdGVzdDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5SdW5zIG91ciBiYXNpYyB0ZXN0IHN1aXRlLjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPm12biBjbGVhbiB0ZXN0PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPkNsZWFucyB1cCwgcmVidWlsZHMgZXZlcnl0aGluZyBmcm9tIHNjcmF0Y2gsIGFuZCB0aGVuIHJ1bnMgdGhlIGJhc2ljIHRlc3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGUuDQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+bXZuIC1EdGVzdD1NeVRlc3QgaW5zdGFsbDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5ydW4gYSBzaW5nbGUgdGVzdCAoY2QgdG8gdGhlIHNwZWNpZmljIG1vZHVsZSBzYXkga2VybmVsIGJlZm9yZSBydW5uaW5nIHRoaXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRvbid0IHVzZSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcywganVzdCB0aGUgY2xhc3MgbmFtZSkuDQotICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+bXZuIGRlcGVuZGVuY3k6cmVzb2x2ZTwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5wcmludCBkZXBlbmRlbmNpZXMgdW5kZXIgYW55IG1vZHVsZTwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPm12biBzaXRlPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPkdlbmVyYXRlcyB0aGUgd2Vic2l0ZSBpbiB0YXJnZXQvc2l0ZS88L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gaWRlYTppZGVhPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPkdlbmVyYXRlcyBJREVBIC5pcHIsIC5pbWwgYW5kIC5pd3MgcHJvamVjdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gLUR0ZXN0PWZhbHNlPC9kaXY+DQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgYWxpZ249ImxlZnQiPjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkcyBBeGlzMiBhbmQgc2tpcHMgYWxsIHRoZSB0ZXN0cy4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5tdm4gLVUgLURyZWxlYXNlIGNsZWFuIGluc3RhbGw8L2Rpdj4NCi0gICAgICAgICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+PC9kaXY+DQotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGUgcmVsZWFzZSBhcnRpZmFjdHMuDQotICAgICAgICAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgIDwvdGJvZHk+DQotICAgICAgICA8L3RhYmxlPg0KLSAgICAgICAgPGg0Pk5vdGVzOjwvaDQ+DQotICAgICAgICA8dWw+DQotICAgICAgICAgICAgPGxpPlRoZSAiLVUiIGVuc3VyZXMgdGhhdCB5b3UgZmV0Y2ggdGhlIGxhdGVzdCBzbmFwc2hvdHM8L2xpPg0KLSAgICAgICAgICAgIDxsaT5UaGUgIi1EcmVsZWFzZSIgcnVucyB0aGUgcG9tLnhtbCB1bmRlciBtb2R1bGVzL2Rpc3RyaWJ1dGlvbi4gVGhlIHppcCdzIGFyZSBjcmVhdGVkIHVuZGVyDQotICAgICAgICAgICAgICAgIG1vZHVsZXMvZGlzdHJpYnV0aW9uL3RhcmdldA0KLSAgICAgICAgICAgIDwvbGk+DQotICAgICAgICAgICAgPGxpPlRvIHNraXAgdGVzdHMgdXNlICItRHRlc3Q9ZmFsc2UiPC9saT4NCi0gICAgICAgICAgICA8bGk+SWYgeW91IHJ1biBpbnRvIGFuIGV4Y2VwdGlvbiwgc3dpdGNoIG9uIHByaW50aW5nIG9mIGZ1bGwgZXhjZXB0aW9uIHVzaW5nICItZSI8L2xpPg0KLSAgICAgICAgICAgIDxsaT5JZiB5b3Ugd2FudCB0byBzZWUgdGhlIHZlcnNib3NlIG91dHB1dCwgdXNlICItWCI8L2xpPg0KLSAgICAgICAgPC91bD4NCi0gICAgICAgIDxoMz5BbnQgaGVscGVyIGZvciB0aGUgbTIgYnVpbGQ8L2gzPg0KLSAgICAgICAgPHA+SWYgeW91IHByZWZlciB0byB1c2UgQW50LCB3ZSBoYXZlIGEgYnVpbGQueG1sLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGFyZSAyIG1hdmVuMiBwbHVnaW5zIHRoYXQgbmVlZCB0byBiZQ0KLSAgICAgICAgICAgIGJ1aWx0IGZpcnN0IHdoZW4geW91IHVwZGF0ZSB2ZXJzaW9uICMgZm9yIEF4aXMyLiB0aGUgYW50IGJ1aWxkLnhtbCB0YWtlcyBjYXJlIG9mIHRoYXQgYXV0b21hdGljYWxseS4gSXQNCi0gICAgICAgICAgICBidWlsZHMNCi0gICAgICAgICAgICBheGlzMi1hYXItbWF2ZW4tcGx1Z2luIGFuZCBheGlzMi1tYXItbWF2ZW4tcGx1Z2luIGJlZm9yZSBpdCBydW5zIHRoZSBtYWluIGJ1aWxkLg0KLSAgICAgICAgPC9wPg0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgYWxpZ249ImNlbnRlciI+DQotICAgICAgICAgICAgPHRib2R5Pg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9ImNvbCI+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBhbGlnbj0ibGVmdCI+Q29tbWFuZDwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90aD4NCi0gICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT0iY29sIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvZGl2Pg0KLSAgICAgICAgICAgICAgICAgICAgPC90aD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmFudCBjbGVhbiI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmNsZWFucyB1cDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgaW5zdGFsbCI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPnJ1bnMgdGhlIGJ1aWxkPC90ZD4NCi0gICAgICAgICAgICAgICAgPC90cj4NCi0gICAgICAgICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmFudCBkZXBsb3kiPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5kZXBsb3lzIGFydGlmYWN0cyBpbiBhcGFjaGUgbTIgc25hcHNob3RzIHJlcG88L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IC1Eb2ZmbGluZT10cnVlIGNsZWFuIjwvdGQ+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+b2ZmbGluZSBjbGVhbiB1cDwvdGQ+DQotICAgICAgICAgICAgICAgIDwvdHI+DQotICAgICAgICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5hbnQgLURvZmZsaW5lPXRydWUgaW5zdGFsbCI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPm9mZmxpbmUgYnVpbGQ8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IC1Ec2tpcD10cnVlIGluc3RhbGwiPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5ydW4gdGhlIGJ1aWxkLCBidXQgc2tpcCB0aGUgdGVzdHM8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IC1Ec2tpcD10cnVlIGluc3RhbGwiPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5ydW4gdGhlIGJ1aWxkLCBidXQgc2tpcCB0aGUgdGVzdHM8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IC1Ec2tpcD10cnVlIGRlcGxveSI8L3RkPg0KLSAgICAgICAgICAgICAgICAgICAgPHRkPmRlcGxveXMgYXJ0aWZhY3RzLCBidXQgc2tpcCB0aGUgdGVzdHM8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgICAgICA8dHI+DQotICAgICAgICAgICAgICAgICAgICA8dGQ+YW50IC1Eb2ZmbGluZT10cnVlIC1Ec2tpcD10cnVlIGluc3RhbGwiPC90ZD4NCi0gICAgICAgICAgICAgICAgICAgIDx0ZD5ydW4gdGhlIGJ1aWxkIGluIHRoZSBvZmZsaW5lIGFuZCBza2lwcyB0aGUgdGVzdHM8L3RkPg0KLSAgICAgICAgICAgICAgICA8L3RyPg0KLSAgICAgICAgICAgIDwvdGJvZHk+DQotICAgICAgICA8L3RhYmxlPg0KLSAgICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9hZGRyZXNzaW5nL2luZGV4LnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9hZGRyZXNzaW5nL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkMWZkOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvYWRkcmVzc2luZy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT46OiBBeGlzMiAtIFdTLUFkZHJlc3NpbmcgSW1wbGVtZW50YXRpb24gOjo8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+QXhpczIgLSBXUy1BZGRyZXNzaW5nIEltcGxlbWVudGF0aW9uPC9oMT4NCi08cD5UaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFdTLUFkZHJlc3Npbmcgc3VibWlzc2lvbiB2ZXJzaW9uDQotKDIwMDQtMDgpIGFuZCBXUy1BZGRyZXNzaW5nIDIwMDUtMDggdmVyc2lvbnMuIENvbXBsZXRlDQotV1MtQWRkcmVzc2luZyBGaW5hbCB2ZXJzaW9uIHdpbGwgYmUgYXZhaWxhYmxlLCBvbmNlIHRoZQ0KLXNwZWNpZmljYXRpb24gaXRzZWxmIGdldHMgZmluYWxpemVkLjwvcD4NCi08cD5BeGlzMiBlbmdpbmUgY29udGFpbnMgYWRkcmVzc2luZyBzdXBwb3J0IGJ5IGRlZmF1bHQuIFNvIHlvdSBtYXkNCi1uZWVkIG5vdCBwdXQgdGhpcyBtb2R1bGUsIHVubGVzcyB5b3Ugc3BlY2lmaWNhbGx5IHdhbnQgdG8gdXNlIGENCi1wYXJ0aWN1bGFyIHJlbGVhc2Ugb2YgdGhpcyBtb2R1bGUuPC9wPg0KLTxwPjwvcD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9kb3dubG9hZC5jZ2kgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvZG93bmxvYWQuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTlmOGQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgV3JhcHBlciBzY3JpcHQgYXJvdW5kIG1pcnJvcnMuY2dpIHNjcmlwdAotIyAod2UgbXVzdCBjaGFuZ2UgdG8gdGhhdCBkaXJlY3RvcnkgaW4gb3JkZXIgZm9yIHB5dGhvbiB0byBwaWNrIHVwIHRoZQotIyAgcHl0aG9uIGluY2x1ZGVzIGNvcnJlY3RseSkKLWNkIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMKLS93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvaW5kZXgueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjODIxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPjo6IEF4aXMyIE1vZHVsZXMgOjo8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5BcGFjaGUgQXhpczIgTW9kdWxlczwvaDE+DQotPHA+QXhpczIgYXJjaGl0ZWN0dXJlIGlzIGZsZXhpYmxlIGVub3VnaCB0byBleHRlbmQgaXRzDQotZnVuY3Rpb25hbGl0aWVzIHVzaW5nIG1vZHVsZXMuIFRoaXMgcGFnZSBpcyBtYWludGFpbmVkIHRvIGtlZXANCi10cmFjayBvZiB0aGUgcmVsZXZhbnQgbW9kdWxlcyB0aGF0IGFyZSBkZXZlbG9wZWQgb24gdG9wIG9mDQotQXhpczIuPC9wPg0KLTx0YWJsZSB3aWR0aD0iNjc1IiBib3JkZXI9IjEiIGFsaWduPSJjZW50ZXIiIGNlbGxwYWRkaW5nPSIxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0aCB3aWR0aD0iNjgiIHNjb3BlPSJjb2wiPk5hbWU8L3RoPg0KLTx0aCB3aWR0aD0iMTQ3IiBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+DQotPHRoIHdpZHRoPSI1MiIgc2NvcGU9ImNvbCI+VmVyc2lvbjwvdGg+DQotPHRoIHdpZHRoPSI4MCIgc2NvcGU9ImNvbCI+Q29tcGF0aWJsZSBBeGlzMiB2ZXJzaW9uPC90aD4NCi08dGggd2lkdGg9Ijk3IiBzY29wZT0iY29sIj5Eb3dubG9hZHM8L3RoPg0KLTx0aCB3aWR0aD0iMTkxIiBzY29wZT0iY29sIj5Db21tZW50czwvdGg+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9ImFkZHJlc3NpbmcvaW5kZXguaHRtbCI+QWRkcmVzc2luZzwvYT48L3RkPg0KLTx0ZD5UaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFdTLUFkZHJlc3Npbmcgc3VibWlzc2lvbiB2ZXJzaW9uDQotKDIwMDQtMDgpIGFuZCBXUy1BZGRyZXNzaW5nIDIwMDUtMDggdmVyc2lvbnMuPC90ZD4NCi08dGQ+MS40PC90ZD4NCi08dGQ+MS40PC90ZD4NCi08dGQ+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL21vZHVsZXMvYWRkcmVzc2luZy8xXzQvYWRkcmVzc2luZy0xLjQubWFyIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9hZGRyZXNzaW5nLzFfNC9hZGRyZXNzaW5nLTEuNC5tYXIiPg0KLW1hcjwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL21vZHVsZXMvYWRkcmVzc2luZy8xXzQvYWRkcmVzc2luZy0xLjQubWFyLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL21vZHVsZXMvYWRkcmVzc2luZy8xXzQvYWRkcmVzc2luZy0xLjQubWFyLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9hZGRyZXNzaW5nLzFfNC9hZGRyZXNzaW5nLTEuNC5tYXIuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9hZGRyZXNzaW5nLzFfNC9hZGRyZXNzaW5nLTEuNC5tYXIuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+PGEgaHJlZj0iLi4vMV8zL3NvYXBtb25pdG9yLW1vZHVsZS5odG1sIj5TT0FQIE1vbml0b3I8L2E+PC90ZD4NCi08dGQ+U09BUCBNb25pdG9yIHV0aWxpdHkgcHJvdmlkZXMgYSB3YXkgZm9yIFdlYiBzZXJ2aWNlcyBkZXZlbG9wZXJzDQotdG8gbW9uaXRvciB0aGUgU09BUCBtZXNzYWdlcyBiZWluZyBzZW50L3JlY2VpdmVkIHdpdGhvdXQgcmVxdWlyaW5nDQotYW55IHNwZWNpYWwgY29uZmlndXJhdGlvbiBvciByZXN0YXJ0aW5nIG9mIHRoZSBzZXJ2ZXI8L3RkPg0KLTx0ZD4xLjQ8L3RkPg0KLTx0ZD4xLjQ8L3RkPg0KLTx0ZD48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9zb2FwbW9uaXRvci8xXzQvc29hcG1vbml0b3ItMS40Lm1hciINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL21vZHVsZXMvc29hcG1vbml0b3IvMV80L3NvYXBtb25pdG9yLTEuNC5tYXIiPg0KLXppcDwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL21vZHVsZXMvc29hcG1vbml0b3IvMV80L3NvYXBtb25pdG9yLTEuNC5tYXIubWQ1Ig0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9zb2FwbW9uaXRvci8xXzQvc29hcG1vbml0b3ItMS40Lm1hci5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL21vZHVsZXMvc29hcG1vbml0b3IvMV80L3NvYXBtb25pdG9yLTEuNC5tYXIuYXNjIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvbW9kdWxlcy9zb2FwbW9uaXRvci8xXzQvc29hcG1vbml0b3ItMS40Lm1hci5hc2MiPg0KLVBHUDwvYT48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD48YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9zYW5kZXNoYS9zYW5kZXNoYTIvaW5kZXguaHRtbCI+U2FuZGVzaGEyPC9hPjwvdGQ+DQotPHRkPkFuIGltcGxlbWVudGF0aW9uIG9mIFdTLVJNIHNwZWNpZmljYXRpb24gRmVicnVhcnkgMjAwNTwvdGQ+DQotPHRkPjEuMzwvdGQ+DQotPHRkPjEuMzwvdGQ+DQotPHRkPjxhIGhyZWY9DQotImh0dHA6Ly9hcGFjaGUuaG94dC5jb20vd3Mvc2FuZGVzaGEyLzFfMy9zYW5kZXNoYTItMS4zLWJpbi56aXAiDQotdGl0bGU9DQotImh0dHA6Ly9hcGFjaGUuaG94dC5jb20vd3Mvc2FuZGVzaGEyLzFfMy9zYW5kZXNoYTItMS4zLWJpbi56aXAiPnppcDwvYT4NCi08YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9zYW5kZXNoYTIvMV8zL3NhbmRlc2hhMi0xLjMtYmluLnppcC5tZDUiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL3NhbmRlc2hhMi8xXzMvc2FuZGVzaGEyLTEuMy1iaW4uemlwLm1kNSI+DQotTUQ1PC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC93cy9zYW5kZXNoYTIvMV8zL3NhbmRlc2hhMi0xLjMtYmluLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L3dzL3NhbmRlc2hhMi8xXzMvc2FuZGVzaGEyLTEuMy1iaW4uemlwLmFzYyI+DQotUEdQPC9hPjwvdGQ+DQotPHRkPkNsaWNrIDxhIGhyZWY9DQotImh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20xLXNuYXBzaG90LXJlcG9zaXRvcnkvb3JnLmFwYWNoZS5zYW5kZXNoYTIvIj4NCi1oZXJlPC9hPiB0byBnZXQgdGhlIFNhbmRlc2hhMiBuaWdodGx5IGJ1aWxkcyBjb21wYXRpYmxlIHdpdGggdGhlDQotbGF0ZXN0IEF4aXMyIFNOQVBTSE9ULjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPjxhIGhyZWY9InJhbXBhcnQvMV8zL3NlY3VyaXR5LW1vZHVsZS5odG1sIj5SYW1wYXJ0PC9hPjwvdGQ+DQotPHRkPlRoZSBXUy1TZWN1cml0eSBhbmQgV1MtU2VjdXJlQ29udmVyc2F0aW9uIGltcGxlbWVudGF0aW9uIGZvcg0KLWF4aXMyLiBOb3cgd2l0aCBhIG5ldyBjb25maWd1cmF0aW9uIG1vZGVsIGJhc2VkIG9uDQotV1MtU2VjdXJpdHlQb2xpY3k8L3RkPg0KLTx0ZD4xLjM8L3RkPg0KLTx0ZD4xLjM8L3RkPg0KLTx0ZD48YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvcmFtcGFydC8xXzMvcmFtcGFydC0xLjMuemlwIg0KLXRpdGxlPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvcmFtcGFydC8xXzMvcmFtcGFydC0xLjEuemlwIj4NCi1EaXN0cm8gemlwPC9hPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvcmFtcGFydC8xXzMvcmFtcGFydC0xLjMuemlwLm1kNSINCi10aXRsZT0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL3JhbXBhcnQvMV8zL3JhbXBhcnQtMS4zLnppcC5tZDUiPg0KLU1ENTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL3JhbXBhcnQvMV8zL3JhbXBhcnQtMS4zLnppcC5hc2MiDQotdGl0bGU9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9yYW1wYXJ0LzFfMy9yYW1wYXJ0LTEuMy56aXAuYXNjIj4NCi1QR1A8L2E+PC90ZD4NCi08dGQ+UGxlYXNlIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBSRUFETUUudHh0IGF2YWlsYWJsZSBpbg0KLXRoZSByYW1wYXJ0LTEuMy56aXAgZmlsZSB0byBjb3B5IHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgdG8gdGhlIG1haW4NCi0ibGliIiBkaXIgb2YgQXhpczIuDQotPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJbiBBeGlzMiB2MS4zIHRvIHJ1biBSYW1wYXJ0IHYxLjMNCi1zYW1wbGVzLCBjaGFuZ2UgdGhlIGFkZHJlc3NpbmcgbWFyIHZhbHVlIHRvIGFkcmVzc2luZy0xLjMubWFyIGFzDQotZ2l2ZW4gYmVsb3c7IDxjb2RlPiZsdDtwcm9wZXJ0eSBuYW1lPSJhZGRyZXNzaW5nLm1hciINCi12YWx1ZT0iYWRkcmVzc2luZy0xLjMubWFyIi8mZ3Q7PC9jb2RlPiBpbg0KLS4uXHJhbXBhcnQtMS4zXHNhbXBsZXNcYmFzaWNcYnVpbGQueG1sPC9wPg0KLTwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPGJyIC8+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvaW4tc2FtcGxlLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9pbi1zYW1wbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg5MzQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9pbi1zYW1wbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL2luLmFjdGlvbi54c2QgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvaW4uYWN0aW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlZDk4Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvaW4uYWN0aW9uLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCTx4czplbGVtZW50IG5hbWU9ImFjdGlvbiI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+SW5mbG93IHNlY3VyaXR5ICdhY3Rpb24nIGNvbmZpZ3VyYXRpb248L3hzOmRvY3VtZW50YXRpb24+Ci0JCTwveHM6YW5ub3RhdGlvbj4KLQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJPHhzOnNlcXVlbmNlPgotCQkJCTx4czplbGVtZW50IG5hbWU9Iml0ZW1zIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwYXNzd29yZENhbGxiYWNrQ2xhc3MiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2lnbmF0dXJlUHJvcEZpbGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZGVjcnlwdGlvblByb3BGaWxlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9vdXQtYWN0aW9uLnhzZCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9vdXQtYWN0aW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhNGE0ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvb3V0LWFjdGlvbi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8eHM6ZWxlbWVudCBuYW1lPSJhY3Rpb24iPgotCQk8eHM6YW5ub3RhdGlvbj4KLQkJCTx4czpkb2N1bWVudGF0aW9uPk91dGZsb3cgc2VjdXJpdHkgJ2FjdGlvbicgY29uZmlndXJhdGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iaXRlbXMiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InVzZXIiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InBhc3N3b3JkQ2FsbGJhY2tDbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzaWduYXR1cmVQcm9wRmlsZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uUHJvcEZpbGUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvblByb3BGaWxlIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9InNpZ25hdHVyZUtleUlkZW50aWZpZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbktleUlkZW50aWZpZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvblVzZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0ic2lnbmF0dXJlUGFydHMiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvblBhcnRzIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTx4czplbGVtZW50IG5hbWU9Im9wdGltaXplUGFydHMiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvblN5bUFsZ29yaXRobSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWJlZGRlZEtleUNhbGxiYWNrQ2xhc3MiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbktleVRyYW5zcG9ydEFsZ29yaXRobSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJFbWJlZGRlZEtleU5hbWUiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idGltZVRvTGl2ZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCTwveHM6c2VxdWVuY2U+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JPC94czplbGVtZW50PgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvb3V0LXNhbXBsZS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvb3V0LXNhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTM4ZTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL291dC1zYW1wbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL291dC1zYW1wbGUyLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9vdXQtc2FtcGxlMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDFmMjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL291dC1zYW1wbGUyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9yYW1wYXJ0LWNvbmZpZy54c2QgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvcmFtcGFydC1jb25maWcueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDE3YTVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWMtY29uZi9yYW1wYXJ0LWNvbmZpZy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpyYW1wPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9yYW1wYXJ0L3BvbGljeSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9yYW1wYXJ0L3BvbGljeSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JPHhzOmVsZW1lbnQgbmFtZT0iUmFtcGFydENvbmZpZyI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+UmFtcGFydCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFzc2VydGlvbjwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJPC94czphbm5vdGF0aW9uPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6c2VxdWVuY2U+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0idXNlciIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvblVzZXIiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPHhzOmVsZW1lbnQgbmFtZT0icGFzc3dvcmRDYWxsYmFja0NsYXNzIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uQ3lwdG8iIHR5cGU9InJhbXA6Y3J5cHRvIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzaWduYXR1cmVDeXB0byIgdHlwZT0icmFtcDpjcnlwdG8iIG1pbk9jY3Vycz0iMCIvPgotCQkJPC94czpzZXF1ZW5jZT4KLQkJPC94czpjb21wbGV4VHlwZT4KLQk8L3hzOmVsZW1lbnQ+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImNyeXB0byI+Ci0JCTx4czphbm5vdGF0aW9uPgotCQkJPHhzOmRvY3VtZW50YXRpb24+Q3J5cHRvIGNvbmZpZ3VyYXRpb24gYXNzZXJ0aW9uPC94czpkb2N1bWVudGF0aW9uPgotCQk8L3hzOmFubm90YXRpb24+Ci0JCTx4czpzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTwveHM6c2VxdWVuY2U+Ci0JCTx4czphdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXIiLz4KLQk8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvc2FtcGxlLXBvbGljeS54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvc2FtcGxlLXBvbGljeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDgyYzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL3NhbXBsZS1wb2xpY3kueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NwOlBvbGljeSB3c3U6SWQ9IlNpZ0VuY3JUcmlwbGVEZXNSU0ExNURLIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiPgotPHdzcDpFeGFjdGx5T25lPgotCTx3c3A6QWxsPgotCQk8c3A6QXN5bW1ldHJpY0JpbmRpbmcgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJPHdzcDpQb2xpY3k+Ci0JCQkJPHNwOkluaXRpYXRvclRva2VuPgotCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCTxzcDpYNTA5VG9rZW4gc3A6SW5jbHVkZVRva2VuPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5L0luY2x1ZGVUb2tlbi9BbHdheXNUb1JlY2lwaWVudCI+Ci0JCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJCTxzcDpSZXF1aXJlRGVyaXZlZEtleXMvPgotCQkJCQkJCQk8c3A6V3NzWDUwOVYzVG9rZW4xMC8+Ci0JCQkJCQkJPC93c3A6UG9saWN5PgotCQkJCQkJPC9zcDpYNTA5VG9rZW4+Ci0JCQkJCTwvd3NwOlBvbGljeT4KLQkJCQk8L3NwOkluaXRpYXRvclRva2VuPgotCQkJCTxzcDpSZWNpcGllbnRUb2tlbj4KLQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQk8c3A6WDUwOVRva2VuIHNwOkluY2x1ZGVUb2tlbj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeS9JbmNsdWRlVG9rZW4vTmV2ZXIiPgotCQkJCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJCQk8c3A6UmVxdWlyZURlcml2ZWRLZXlzLz4KLQkJCQkJCQkJPHNwOldzc1g1MDlWM1Rva2VuMTAvPgotCQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJCTwvc3A6WDUwOVRva2VuPgotCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJPC9zcDpSZWNpcGllbnRUb2tlbj4KLQkJCQk8c3A6QWxnb3JpdGhtU3VpdGU+Ci0JCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJPHNwOlRyaXBsZURlc1JzYTE1Lz4KLQkJCQkJPC93c3A6UG9saWN5PgotCQkJCTwvc3A6QWxnb3JpdGhtU3VpdGU+Ci0JCQkJPHNwOkxheW91dD4KLQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQk8c3A6U3RyaWN0Lz4KLQkJCQkJPC93c3A6UG9saWN5PgotCQkJCTwvc3A6TGF5b3V0PgotCQkJCTxzcDpJbmNsdWRlVGltZXN0YW1wLz4KLQkJCQk8c3A6T25seVNpZ25FbnRpcmVIZWFkZXJzQW5kQm9keS8+Ci0JCQk8L3dzcDpQb2xpY3k+Ci0JCTwvc3A6QXN5bW1ldHJpY0JpbmRpbmc+Ci0JCTxzcDpXc3MxMCB4bWxuczpzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI+Ci0JCQk8d3NwOlBvbGljeT4KLQkJCQk8c3A6TXVzdFN1cHBvcnRSZWZLZXlJZGVudGlmaWVyLz4KLQkJCQk8c3A6TXVzdFN1cHBvcnRSZWZJc3N1ZXJTZXJpYWwvPgotCQkJPC93c3A6UG9saWN5PgotCQk8L3NwOldzczEwPgotCQk8c3A6U2lnbmVkUGFydHMgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJPHNwOkJvZHkvPgotCQk8L3NwOlNpZ25lZFBhcnRzPgotCQk8c3A6RW5jcnlwdGVkUGFydHMgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJPHNwOkJvZHkvPgotCQk8L3NwOkVuY3J5cHRlZFBhcnRzPgotCQk8cmFtcDpSYW1wYXJ0Q29uZmlnIHhtbG5zOnJhbXA9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3JhbXBhcnQvcG9saWN5Ij4gCi0JCQk8cmFtcDp1c2VyPmFsaWNlPC9yYW1wOnVzZXI+Ci0JCQk8cmFtcDplbmNyeXB0aW9uVXNlcj5ib2I8L3JhbXA6ZW5jcnlwdGlvblVzZXI+Ci0JCQk8cmFtcDpwYXNzd29yZENhbGxiYWNrQ2xhc3M+b3JnLmFwYWNoZS5yYW1wYXJ0LlBXQ2FsbGJhY2s8L3JhbXA6cGFzc3dvcmRDYWxsYmFja0NsYXNzPgotCQkJCi0JCQk8cmFtcDpzaWduYXR1cmVDcnlwdG8+Ci0JCQkJPHJhbXA6Y3J5cHRvIHByb3ZpZGVyPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNvbXBvbmVudHMuY3J5cHRvLk1lcmxpbiI+Ci0JCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS50eXBlIj5KS1M8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5maWxlIj50ZXN0LXJlc291cmNlcy9yYW1wYXJ0L3N0b3JlLmprczwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLnBhc3N3b3JkIj5wYXNzd29yZDwvcmFtcDpwcm9wZXJ0eT4KLQkJCQk8L3JhbXA6Y3J5cHRvPgotCQkJPC9yYW1wOnNpZ25hdHVyZUNyeXB0bz4KLQkJCTxyYW1wOmVuY3J5cHRpb25DeXB0bz4KLQkJCQk8cmFtcDpjcnlwdG8gcHJvdmlkZXI9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluIj4KLQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLnR5cGUiPkpLUzwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmZpbGUiPnRlc3QtcmVzb3VyY2VzL3JhbXBhcnQvc3RvcmUuamtzPC9yYW1wOnByb3BlcnR5PgotCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUucGFzc3dvcmQiPnBhc3N3b3JkPC9yYW1wOnByb3BlcnR5PgotCQkJCTwvcmFtcDpjcnlwdG8+Ci0JCQk8L3JhbXA6ZW5jcnlwdGlvbkN5cHRvPgotCQk8L3JhbXA6UmFtcGFydENvbmZpZz4KLQk8L3dzcDpBbGw+Ci08L3dzcDpFeGFjdGx5T25lPgotPC93c3A6UG9saWN5PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9tb2R1bGVzL3JhbXBhcnQvMV8zL3NlYy1jb25mL3NhbXBsZS1zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvc2FtcGxlLXNlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4MDkwYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjLWNvbmYvc2FtcGxlLXNlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNlY3VyZVNlcnZpY2U3Ij4KLQotCTxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0JPG1vZHVsZSByZWY9InJhbXBhcnQiLz4KLQotCTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcuYXBhY2hlLnJhbXBhcnQuU2VydmljZTwvcGFyYW1ldGVyPgotCi0JPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLQkJPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQkJPGFjdGlvbk1hcHBpbmc+dXJuOmVjaG88L2FjdGlvbk1hcHBpbmc+Ci0JPC9vcGVyYXRpb24+Ci0JCi0JPHdzcDpQb2xpY3kgd3N1OklkPSJTaWdFbmNyVHJpcGxlRGVzUlNBMTVESyIgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxuczp3c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5Ij4KLQk8d3NwOkV4YWN0bHlPbmU+Ci0JCTx3c3A6QWxsPgotCQkJPHNwOkFzeW1tZXRyaWNCaW5kaW5nIHhtbG5zOnNwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5Ij4KLQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJPHNwOkluaXRpYXRvclRva2VuPgotCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJPHNwOlg1MDlUb2tlbiBzcDpJbmNsdWRlVG9rZW49Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kvSW5jbHVkZVRva2VuL0Fsd2F5c1RvUmVjaXBpZW50Ij4KLQkJCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJCQk8c3A6UmVxdWlyZURlcml2ZWRLZXlzLz4KLQkJCQkJCQkJCTxzcDpXc3NYNTA5VjNUb2tlbjEwLz4KLQkJCQkJCQkJPC93c3A6UG9saWN5PgotCQkJCQkJCTwvc3A6WDUwOVRva2VuPgotCQkJCQkJPC93c3A6UG9saWN5PgotCQkJCQk8L3NwOkluaXRpYXRvclRva2VuPgotCQkJCQk8c3A6UmVjaXBpZW50VG9rZW4+Ci0JCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCQk8c3A6WDUwOVRva2VuIHNwOkluY2x1ZGVUb2tlbj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeS9JbmNsdWRlVG9rZW4vTmV2ZXIiPgotCQkJCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCQkJCTxzcDpSZXF1aXJlRGVyaXZlZEtleXMvPgotCQkJCQkJCQkJPHNwOldzc1g1MDlWM1Rva2VuMTAvPgotCQkJCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJCQkJPC9zcDpYNTA5VG9rZW4+Ci0JCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJCTwvc3A6UmVjaXBpZW50VG9rZW4+Ci0JCQkJCTxzcDpBbGdvcml0aG1TdWl0ZT4KLQkJCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJCTxzcDpUcmlwbGVEZXNSc2ExNS8+Ci0JCQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQkJCTwvc3A6QWxnb3JpdGhtU3VpdGU+Ci0JCQkJCTxzcDpMYXlvdXQ+Ci0JCQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJCQk8c3A6U3RyaWN0Lz4KLQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJPC9zcDpMYXlvdXQ+Ci0JCQkJCTxzcDpJbmNsdWRlVGltZXN0YW1wLz4KLQkJCQkJPHNwOk9ubHlTaWduRW50aXJlSGVhZGVyc0FuZEJvZHkvPgotCQkJCTwvd3NwOlBvbGljeT4KLQkJCTwvc3A6QXN5bW1ldHJpY0JpbmRpbmc+Ci0JCQk8c3A6V3NzMTAgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJCTx3c3A6UG9saWN5PgotCQkJCQk8c3A6TXVzdFN1cHBvcnRSZWZLZXlJZGVudGlmaWVyLz4KLQkJCQkJPHNwOk11c3RTdXBwb3J0UmVmSXNzdWVyU2VyaWFsLz4KLQkJCQk8L3dzcDpQb2xpY3k+Ci0JCQk8L3NwOldzczEwPgotCQkJPHNwOlNpZ25lZFBhcnRzIHhtbG5zOnNwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5Ij4KLQkJCQk8c3A6Qm9keS8+Ci0JCQk8L3NwOlNpZ25lZFBhcnRzPgotCQkJPHNwOkVuY3J5cHRlZFBhcnRzIHhtbG5zOnNwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5Ij4KLQkJCQk8c3A6Qm9keS8+Ci0JCQk8L3NwOkVuY3J5cHRlZFBhcnRzPgotCi0JCQk8cmFtcDpSYW1wYXJ0Q29uZmlnIHhtbG5zOnJhbXA9Imh0dHA6Ly93cy5hcGFjaGUub3JnL3JhbXBhcnQvcG9saWN5Ij4gCi0JCQkJPHJhbXA6dXNlcj5hbGljZTwvcmFtcDp1c2VyPgotCQkJCTxyYW1wOmVuY3J5cHRpb25Vc2VyPmJvYjwvcmFtcDplbmNyeXB0aW9uVXNlcj4KLQkJCQk8cmFtcDpwYXNzd29yZENhbGxiYWNrQ2xhc3M+b3JnLmFwYWNoZS5yYW1wYXJ0LlBXQ2FsbGJhY2s8L3JhbXA6cGFzc3dvcmRDYWxsYmFja0NsYXNzPgotCQkJCQotCQkJCTxyYW1wOnNpZ25hdHVyZUNyeXB0bz4KLQkJCQkJPHJhbXA6Y3J5cHRvIHByb3ZpZGVyPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNvbXBvbmVudHMuY3J5cHRvLk1lcmxpbiI+Ci0JCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUudHlwZSI+SktTPC9yYW1wOnByb3BlcnR5PgotCQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmZpbGUiPnN0b3JlLmprczwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS5wYXNzd29yZCI+cGFzc3dvcmQ8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCTwvcmFtcDpjcnlwdG8+Ci0JCQkJPC9yYW1wOnNpZ25hdHVyZUNyeXB0bz4KLQkJCQk8cmFtcDplbmNyeXB0aW9uQ3lwdG8+Ci0JCQkJCTxyYW1wOmNyeXB0byBwcm92aWRlcj0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jb21wb25lbnRzLmNyeXB0by5NZXJsaW4iPgotCQkJCQkJPHJhbXA6cHJvcGVydHkgbmFtZT0ib3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLnR5cGUiPkpLUzwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5maWxlIj5zdG9yZS5qa3M8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUucGFzc3dvcmQiPnBhc3N3b3JkPC9yYW1wOnByb3BlcnR5PgotCQkJCQk8L3JhbXA6Y3J5cHRvPgotCQkJCTwvcmFtcDplbmNyeXB0aW9uQ3lwdG8+Ci0JCQk8L3JhbXA6UmFtcGFydENvbmZpZz4KLQotCQk8L3dzcDpBbGw+Ci0JPC93c3A6RXhhY3RseU9uZT4KLQk8L3dzcDpQb2xpY3k+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL21vZHVsZXMvcmFtcGFydC8xXzMvc2VjdXJpdHktbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWN1cml0eS1tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjY1N2I0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvbW9kdWxlcy9yYW1wYXJ0LzFfMy9zZWN1cml0eS1tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIi8+Ci0gIDxsaW5rIGhyZWY9Ii4uLy4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPgotICA8dGl0bGU+UmFtcGFydCA6IFdTLVNlY3VyaXR5IG1vZHVsZSBmb3IgQXhpczI8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5TZWN1cmluZyBTT0FQIE1lc3NhZ2VzIHdpdGggUmFtcGFydDwvaDE+Ci0KLTxwPkF4aXMyIGNvbWVzIHdpdGggYSBtb2R1bGUgYmFzZWQgb24gQXBhY2hlIFdTUzRKIFsxXSB0byBwcm92aWRlIFdTLVNlY3VyaXR5Ci1mZWF0dXJlcywgY2FsbGVkICJSYW1wYXJ0Ii4gVGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdG8gZW5nYWdlIGFuZAotY29uZmlndXJlIFJhbXBhcnQgbW9kdWxlLjwvcD4KLQotPGgyPkNvbnRlbnQ8L2gyPgotPHVsPgotICA8bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iIzFfMV9jb25maWciPlJhbXBhcnQtMS4xIENvbmZpZ3VyYXRpb248L2E+Ci0JPHVsPgotCTxsaT48YSBocmVmPSIjMV8xX2Fzc2V0aW9ucyI+UmFtcGFydCBTcGVjaWZpYyBBc3NlcnRpb25zPC9hPjwvbGk+Ci0JPGxpPjxhIGhyZWY9IiMxXzFfc2VydmljZV9jb25maWciPlNlcnZpY2UgQ29uZmlncmF0aW9uPC9hPjwvbGk+Ci0JPGxpPjxhIGhyZWY9IiMxXzFfY2xpZW50X2NvbmZpZyI+Q2xpZW50IENvbmZpdXJhdGlvbjwvYT48L2xpPgotCTwvdWw+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiMxXzBfY29uZmlnIj5SYW1wYXJ0LTEuMCBDb25maWd1cmF0aW9uPC9hPgotICA8dWw+Ci0gIDxsaT48YSBocmVmPSIjb3V0Zmxvd3NlY3VyaXR5Ij5PdXRmbG93U2VjdXJpdHkgUGFyYW1ldGVyPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjaW5mbG93c2VjdXJpdHkiPkluZmxvd1NlY3VyaXR5IFBhcmFtZXRlcjwvYT48L2xpPgotICA8L3VsPjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjcmVmZXJlbmNlcyI+UmVmZXJlbmNlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI2V4YW1wbGVzIj5FeGFtcGxlczwvYT48L2xpPgotPC91bD4KLTxhIG5hbWU9ImludHJvIj48L2E+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5TaW5jZSByYW1wYXJ0IG1vZHVsZSBpbnNlcnRzIGhhbmRsZXJzIGluIHRoZSBzeXN0ZW0gc3BlY2lmaWMgc2VjdXJpdHkKLXBoYXNlLCBpdCBtdXN0IGJlIGVuZ2FnZWQgZ2xvYmFsbHkuIFRoZXNlIGhhbmRsZXJzIGNhbiBiZSBjb25maWd1cmVkIAotdXNpbmcgV1MtU2VjdXJpdHlQb2xpY3lbMl0gYW5kIFJhbXBhcnQgc3BlY2lmaWMgcG9saWN5IGFzc2VydGlvbnMuIAotUmFtcGFydC0xLjAgdXNlZCB0d28gYXhpczIgcGFyYW1ldGVycyBmb3IgY29uZmlndXJhdGlvbiBhbmQgdGhlc2UgYXJlCi1zdGlsbCBzdXBwb3J0ZWQgaW4gdGhlIDEuMSByZWxlYXNlIGFzIHdlbGwuPC9wPgotCi08cD5UaGUgcmFtcGFydC0xLjEgcmVsZWFzZSBpcyBhdmFpbGFibGUgCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kvd3MvcmFtcGFydC8xXzEiPmhlcmU8L2E+LjwvcD4KLQotPHA+Rmlyc3QgaXQgc2hvdWxkIGJlIGVuZ2FnZWQgYnkgaW5zZXJ0aW5nIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGF4aXMyLnhtbAotZmlsZS48L3A+Ci08c291cmNlPjxwcmU+ICAgICZsdDttb2R1bGUgcmVmPSJyYW1wYXJ0Ii8mZ3Q7PC9wcmU+Ci08L3NvdXJjZT4KLTxwPlRoZSB3ZWIgYWRtaW4gaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHdoZW4gQXhpczIgaXMgZGVwbG95ZWQgaW4gYSBzZXJ2bGV0Ci1jb250YWluZXIgc3VjaCBhcyBBcGFjaGUgVG9tY2F0LjwvcD4KLQotPHA+QXQgdGhlIHNlcnZlciBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIHNlY3VyaXR5IG9uIGEgcGVyIHNlcnZpY2UgYmFzaXMuCi1UaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNob3VsZCBiZSBzZXQgaW4gdGhlIHNlcnZpY2UueG1sIGZpbGUgb2YgdGhlCi1zZXJ2aWNlLiBUaGUgY2xpZW50IHNpZGUgY29uZmlnIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHNldCBpbiB0aGUgYXhpczIueG1sIG9mCi10aGUgY2xpZW50J3MgQXhpczIgcmVwb3NpdG9yeS48L3A+Ci08YSBpZD0iMV8xX2NvbmZpZyI+PC9hPgotPGgyPlJhbXBhcnQtMS4xIENvbmZpZ3VyYXRpb248L2gyPgotPGEgaWQ9IjFfMV9hc3NldGlvbnMiPjwvYT4KLTxoMz5SYW1wYXJ0IFNwZWNpZmljIEFzc2VydGlvbnM8L2gzPgotCi08cD5SYW1wYXJ0IHVzZXMgdGhlIHN0YW5kYXJkIFdTLVNlY3VyaXR5UG9saWN5WzJdIGFzc2VydGlvbnMgYW5kIGFsc28gZGVmaW5lcyBpdHMgb3duIAotYXNzZXJ0aW9ucyB0byBiZSBhYmxlIGNhcHR1cmUgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdGhhdCBpcyBub3QgcHJvdmlkZWQgCi1pbiBXUy1TZWN1cml0eVBvbGljeS48L3A+Ci08cD5UaGUgUmFtcGFydCBzcGVjaWZpYyBhc3NlcnRpb24ncyB4c2QgY2FuIGJlIGZvdW5kIDxhIGhyZWY9InNlYy1jb25mL3JhbXBhcnQtY29uZmlnLnhzZCI+aGVyZQotPC9hPi48L3A+Ci0KLTxwPlRoZSA8c3Ryb25nPnJhbXA6UmFtcGFydENvbmZpZzwvc3Ryb25nPiBhc3NlcnRpb24gbXVzdCBiZSBhdmFpbGFibGUgYXMgYSBvbmUgb2YgdGhlIHRvcCAKLWxldmVsIGFzc2VydGlvbnMgb2YgdGhlIHBvbGljeSBhcyBzaG93biA8YSBocmVmPSJzZWMtY29uZi9zYW1wbGUtcG9saWN5LnhtbCI+aGVyZTwvYT4uPC9wPgotPGEgaWQ9IjFfMV9zZXJ2aWNlX2NvbmZpZyI+PC9hPgotPGgzPlNlcnZpY2UgQ29uZmlncmF0aW9uPC9oMz4KLQotVG8gY29uZmlndXJlIHRoZSBzZXJ2aWNlIG9uZSB3aWxsIHNpbXBseSBoYXZlIHRvIGFkZCB0aGUgcG9saWN5IGVsZW1lbnQgaW50byB0aGUgCi1zZXZpY2VzLnhtbCBmaWxlLiBBIHNhbXBsZSBzZXJ2aWNlLnhtbCBmaWxlIGlzIGF2YWlsYWJsZSAKLTxhIGhyZWY9InNlYy1jb25mL3NhbXBsZS1zZXJ2aWNlcy54bWwiPmhlcmU8L2E+LgotPGEgaWQ9IjFfMV9jbGllbnRfY29uZmlnIj48L2E+Ci08aDM+Q2xpZW50IENvbmZpdXJhdGlvbjwvaDM+Ci08cD5PbiB0aGUgY2xpZW50IHNpZGUsIGEgcG9saWN5IG9iamVjdCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgbG9hZGVkIGludG8gb3B0aW9ucy4gQ3JlYXRpbmcgdGhlIHBvbGljeSBvYmplY3QgY2FuIGJlIGRvbmUgdXNpbmcgYSAicG9saWN5LnhtbCIgZmlsZSBhcyBmb2xsb3dzLjwvcD4KLQkKLTxwcmU+Ci0JLy9DcmVhdGluZyB0aGUgb2JqZWN0Ci0gIAlTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihwYXRoVG9Qb2xpY3lmaWxlKTsKLSAgICAgICAgUG9saWN5IGNsaWVudFBvbGljeSA9IFBvbGljeUVuZ2luZS5nZXRQb2xpY3koYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JLy9zZXR0aW5nIHRoZSBvYmplY3QKLQlPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KFJhbXBhcnRNZXNzYWdlRGF0YS5LRVlfUkFNUEFSVF9QT0xJQ1ksIGNsaWVudFBvbGljeSk7Ci08L3ByZT4KLTxhIGlkPSIxXzBfY29uZmlnIj48L2E+Ci08aDI+UmFtcGFydC0xLjAgQ29uZmlndXJhdGlvbjwvaDI+Ci0KLTxwPlJhbXBhcnQgbW9kdWxlIHVzZXMgdHdvIHBhcmFtZXRlcnM6PC9wPgotPHVsPgotICA8bGk+PGEgaHJlZj0ib3V0Zmxvd3NlY3VyaXR5Ij5PdXRmbG93U2VjdXJpdHk8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9ImluZmxvd3NlY3VyaXR5Ij5JbmZsb3dTZWN1cml0eTwvYT48L2xpPgotPC91bD4KLVRoZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGdvIGluIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVycyBhcmUgZGVzY3JpYmVkCi1iZWxvdzogPGEgbmFtZT0ib3V0Zmxvd3NlY3VyaXR5Ij48L2E+Ci0KLTxoMz5PdXRmbG93U2VjdXJpdHkgUGFyYW1ldGVyPC9oMz4KLVRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRmbG93IHNlY3VyaXR5IGhhbmRsZXIuIFRoZSBvdXRmbG93Ci1oYW5kbGVyIGNhbiBiZSBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBvdXRmbG93IG9uZSBjYW4gcHJvdmlkZQotY29uZmlndXJhdGlvbiBmb3IgZWFjaCBvZiB0aGVzZSBpbnZvY2F0aW9ucy4gVGhlICdhY3Rpb24nIGVsZW1lbnQgZGVzY3JpYmVzCi1vbmUgb2YgdGhlc2UgY29uZmlndXJhdGlvbnMuIFRoZXJlZm9yZSB0aGUgJ091dGZsb3dTZWN1cml0eScgcGFyYW1ldGVyIGNhbgotY29udGFpbiBtb3JlIHRoYW4gb25lICdhY3Rpb24nIGVsZW1lbnRzLiBUaGUgc2NoZW1hIG9mIHRoaXMgJ2FjdGlvbicgZWxlbWVudAotaXMgYXZhaWxhYmxlIDxhIGhyZWY9InNlYy1jb25mL291dC1hY3Rpb24ueHNkIj5oZXJlPC9hPi4KLQotPHA+QW4gb3V0ZmxvdyBjb25maWd1cmF0aW9uIHRvIGFkZCBhIHRpbWVzdGFtcCwgc2lnbiBhbmQgZW5jcnlwdCB0aGUgbWVzc2FnZQotb25jZSwgaXMgc2hvd24gaW48YSBocmVmPSIjZXgxIj4gRXhhbXBsZSAxPC9hPiBhbmQgPGEgaHJlZj0iI2V4MSI+IEV4YW1wbGUKLTI8L2E+IHNob3dzIGhvdyB0byBzaWduIHRoZSBtZXNzYWdlIHR3aWNlIGJ5IGNoYWluaW5nIHRoZSBvdXRmbG93IGhhbmRsZXIKLSh1c2luZyB0d28gJ2FjdGlvbicgZWxlbWVudHMpPC9wPgotCi08cD5Gb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudHMgdGhhdCBjYW4gZ28gaW4gYW4gJ2FjdGlvbicKLWVsZW1lbnQgb2YgdGhlIE91dGZsb3dTZWN1cml0eSBwYXJhbWV0ZXI8L3A+Ci08YnIvPgotCi0KLTx0YWJsZSBib3JkZXI9IjEiPgotICA8dGJvZHk+Ci0gICAgPHRyPgotICAgICAgPHRkPjxiPlBhcmFtZXRlcjwvYj48L3RkPgotICAgICAgPHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQ+PGI+RXhhbXBsZTwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPml0ZW1zPC90ZD4KLSAgICAgIDx0ZD5TZWN1cml0eSBhY3Rpb25zIGZvciB0aGUgaW5mbG93PC90ZD4KLSAgICAgIDx0ZD5BZGQgYSBUaW1lc3RhbXAsIFNpZ24gdGhlIFNPQVAgYm9keSBhbmQgRW5jcnlwdCB0aGUgU09BUCBib2R5IDxici8+Ci0gICAgICAgICZsdDtpdGVtcyZndDsgVGltZXN0YW1wIFNpZ25hdHVyZSBFbmNyeXB0Jmx0Oy9pdGVtcyZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPnVzZXI8L3RkPgotICAgICAgPHRkPlRoZSB1c2VyJ3MgbmFtZTwvdGQ+Ci0gICAgICA8dGQ+U2V0IGFsaWFzIG9mIHRoZSBrZXkgdG8gYmUgdXNlZCB0byBzaWduPGJyLz4KLSAgICAgICAgJmx0O3VzZXImZ3Q7IGJvYiZsdDsvdXNlciZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPnBhc3N3b3JkQ2FsbGJhY2tDbGFzczwvdGQ+Ci0gICAgICA8dGQ+Q2FsbGJhY2sgY2xhc3MgdXNlZCB0byBwcm92aWRlIHRoZSBwYXNzd29yZCByZXF1aXJlZCB0byBjcmVhdGUgdGhlCi0gICAgICAgIFVzZXJuYW1lVG9rZW4gb3IgdG8gc2lnbiB0aGUgbWVzc2FnZTwvdGQ+Ci0gICAgICA8dGQ+Jmx0O3Bhc3N3b3JkQ2FsbGJhY2tDbGFzcyZndDsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5zZWN1cml0eS5QV0NhbGxiYWNrJmx0Oy9wYXNzd29yZENhbGxiYWNrQ2xhc3MmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5zaWduYXR1cmVQcm9wRmlsZTwvdGQ+Ci0gICAgICA8dGQ+cHJvcGVydHkgZmlsZSB1c2VkIHRvIGdldCB0aGUgc2lnbmF0dXJlIHBhcmFtZXRlcnMgc3VjaCBhcyBjcnlwdG8KLSAgICAgICAgcHJvdmlkZXIsIGtleXN0b3JlIGFuZCBpdHMgcGFzc3dvcmQ8L3RkPgotICAgICAgPHRkPlNldCBleGFtcGxlLnByb3BlcnRpZXMgZmlsZSBhcyB0aGUgc2lnbmF0dXJlIHByb3BlcnR5IGZpbGU8YnIvPgotICAgICAgICAmbHQ7c2lnbmF0dXJlUHJvcEZpbGUmZ3Q7Ci0gICAgICBleGFtcGxlLnByb3BlcnRpZXMmbHQ7L3NpZ25hdHVyZVByb3BGaWxlJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+c2lnbmF0dXJlS2V5SWRlbnRpZmllcjwvdGQ+Ci0gICAgICA8dGQ+S2V5IGlkZW50aWZpZXIgdG8gYmUgdXNlZCBpbiByZWZlcnJpbmcgdGhlIGtleSBpbiB0aGUgc2lnbmF0dXJlPC90ZD4KLSAgICAgIDx0ZD5Vc2UgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIGNlcnRpZmljYXRlPGJyLz4KLSAgICAgICAgJmx0O3NpZ25hdHVyZUtleUlkZW50aWZpZXImZ3Q7Ci0gICAgICAgIElzc3VlclNlcmlhbCZsdDsvc2lnbmF0dXJlS2V5SWRlbnRpZmllciZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPmVuY3J5cHRpb25LZXlJZGVudGlmaWVyPC90ZD4KLSAgICAgIDx0ZD5LZXkgaWRlbnRpZmllciB0byBiZSB1c2VkIGluIHJlZmVycmluZyB0aGUga2V5IGluIGVuY3J5cHRpb248L3RkPgotICAgICAgPHRkPlVzZSB0aGUgc2VyaWFsIG51bWJlciBvZiB0aGUgY2VydGlmaWNhdGUgPGJyLz4KLSAgICAgICAgJmx0O2VuY3J5cHRpb25LZXlJZGVudGlmaWVyJmd0O0lzc3VlclNlcmlhbCZsdDsvZW5jcnlwdGlvbktleUlkZW50aWZpZXImZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5lbmNyeXB0aW9uVXNlcjwvdGQ+Ci0gICAgICA8dGQ+VGhlIHVzZXIncyBuYW1lIGZvciBlbmNyeXB0aW9uLjwvdGQ+Ci0gICAgICA8dGQ+PGJyLz4KLSAgICAgICAgJmx0O2VuY3J5cHRpb25Vc2VyJmd0O2FsaWNlJmx0Oy9lbmNyeXB0aW9uVXNlciZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPmVuY3J5cHRpb25TeW1BbGdvcml0aG08L3RkPgotICAgICAgPHRkPlN5bW1ldHJpYyBhbGdvcml0aG0gdG8gYmUgdXNlZCBmb3IgZW5jcnlwdGlvbjwvdGQ+Ci0gICAgICA8dGQ+VXNlIEFFUy0xMjg8YnIvPgotICAgICAgICAmbHQ7ZW5jcnlwdGlvblN5bUFsZ29yaXRobSZndDsKLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjYWVzMTI4LWNiYyZsdDsvZW5jcnlwdGlvblN5bUFsZ29yaXRobSZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPmVuY3J5cHRpb25LZXlUcmFuc3BvcnRBbGdvcml0aG08L3RkPgotICAgICAgPHRkPktleSBlbmNyeXB0aW9uIGFsZ29yaXRobTwvdGQ+Ci0gICAgICA8dGQ+VXNlIFJTQS1PQUVQPGJyLz4KLSAgICAgICAgJmx0O3BhcmFtZXRlciBuYW1lPSJlbmNyeXB0aW9uU3ltQWxnb3JpdGhtIiZndDsKLSAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjcnNhLW9hZXAtbWdmMXAmbHQ7L3BhcmFtZXRlciZndDs8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPnNpZ25hdHVyZVBhcnRzPC90ZD4KLSAgICAgIDx0ZD5TaWduIG11bHRpcGxlIHBhcnRzIGluIHRoZSBTT0FQIG1lc3NhZ2U8L3RkPgotICAgICAgPHRkPlNpZ24gRm9vIGFuZCBCYXIgZWxlbWVudHMgcXVhbGlmaWVkIGJ5ICJodHRwOi8vYXBwLm5zL25zIjxici8+Ci0gICAgICAgICZsdDtzaWduYXR1cmVQYXJ0cyZndDsKLSAgICAgICAge0VsZW1lbnR9e2h0dHA6Ly9hcHAubnMvbnN9Rm9vO3tFbGVtZW50fXtodHRwOi8vYXBwLm5zL25zfUJhcgotICAgICAgICAmbHQ7L3NpZ25hdHVyZVBhcnRzJmd0OzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+b3B0aW1pemVQYXJ0czwvdGQ+Ci0gICAgICA8dGQ+TVRPTSBPcHRpbWl6ZSB0aGUgZWxlbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBYUGF0aCBxdWVyeTwvdGQ+Ci0gICAgICA8dGQ+T3B0aW1pemUgdGhlIENpcGhlclZhbHVlPGJyLz4KLSAgICAgICAgJmx0O29wdGltaXplUGFydHMmZ3Q7Ci0gICAgICAgIC8veGVuYzpFbmNyeXB0ZWREYXRhL3hlbmM6Q2lwaGVyRGF0YS94ZW5jOkNpcGhlclZhbHVlCi0gICAgICAgICZsdDsvb3B0aW1pemVQYXJ0cyZndDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGJvZHk+Ci08L3RhYmxlPgotPGEgbmFtZT0iaW5mbG93c2VjdXJpdHkiPjwvYT4KLQotPGgzPkluZmxvd1NlY3VyaXR5IFBhcmFtZXRlcjwvaDM+Ci0KLTxwPlRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBpbmZsb3cgc2VjdXJpdHkgaGFuZGxlci4gVGhlCi0nYWN0aW9uJyBlbGVtZW50IGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMgaGVyZSBhcwotd2VsbC4gVGhlIHNjaGVtYSBvZiB0aGUgJ2FjdGlvbicgZWxlbWVudCBpcyBhdmFpbGFibGUgaGVyZS4gPGEKLWhyZWY9IiNleDMiPkV4YW1wbGUgMzwvYT4gc2hvd3MgdGhlIGNvbmZpZ3VyYXRpb24gdG8gZGVjcnlwdCwgdmVyaWZ5Ci1zaWduYXR1cmUgYW5kIHZhbGlkYXRlIHRpbWVzdGFtcC48L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiPgotICA8dGJvZHk+Ci0gICAgPHRyPgotICAgICAgPHRkPjxiPlBhcmFtZXRlcjwvYj48L3RkPgotICAgICAgPHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQ+PGI+RXhhbXBsZTwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPml0ZW1zPC90ZD4KLSAgICAgIDx0ZD5TZWN1cml0eSBhY3Rpb25zIGZvciB0aGUgaW5mbG93PC90ZD4KLSAgICAgIDx0ZD5maXJzdCB0aGUgaW5jb21pbmcgbWVzc2FnZSBzaG91bGQgYmUgZGVjcnlwdGVkIGFuZCB0aGVuIHRoZQotICAgICAgICBzaWduYXR1cmVzIHNob3VsZCBiZSB2ZXJpZmllZCBhbmQgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHRoZQotICAgICAgICBhdmFpbGFiaWxpdHkgb2YgdGhlIFRpbWVzdGFtcCA8YnIvPgotICAgICAgICAmbHQ7aXRlbXMmZ3Q7IFRpbWVzdGFtcCBTaWduYXR1cmUgRW5jcnlwdCZsdDsvaXRlbXMmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5wYXNzd29yZENhbGxiYWNrQ2xhc3M8L3RkPgotICAgICAgPHRkPkNhbGxiYWNrIGNsYXNzIHVzZWQgdG8gb2J0YWluIHBhc3N3b3JkIGZvciBkZWNyeXB0aW9uIGFuZAotICAgICAgICBVc2VybmFtZVRva2VuIHZlcmlmaWNhdGlvbjwvdGQ+Ci0gICAgICA8dGQ+PGJyLz4KLSAgICAgICAgJmx0O3Bhc3N3b3JkQ2FsbGJhY2tDbGFzcyZndDsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5zZWN1cml0eS5QV0NhbGxiYWNrJmx0Oy9wYXNzd29yZENhbGxiYWNrQ2xhc3MmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5zaWduYXR1cmVQcm9wRmlsZTwvdGQ+Ci0gICAgICA8dGQ+UHJvcGVydHkgZmlsZSB1c2VkIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uPC90ZD4KLSAgICAgIDx0ZD48YnIvPgotICAgICAgICAmbHQ7c2lnbmF0dXJlUHJvcEZpbGUmZ3Q7Ci0gICAgICBzaWcucHJvcGVydGllcyZsdDsvc2lnbmF0dXJlUHJvcEZpbGUmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD5kZWNyeXB0aW9uUHJvcEZpbGU8L3RkPgotICAgICAgPHRkPlByb3BlcnR5IGZpbGUgdXNlZCBmb3IgZGVjcnlwdGlvbjwvdGQ+Ci0gICAgICA8dGQ+PGJyLz4KLSAgICAgICAgJmx0O2RlY3J5cHRpb25Qcm9wRmlsZSZndDsKLSAgICAgIGRlYy5wcm9wZXJ0aWVzJmx0Oy9kZWNyeXB0aW9uUHJvcEZpbGUmZ3Q7PC90ZD4KLSAgICA8L3RyPgotICA8L3Rib2R5PgotPC90YWJsZT4KLTxici8+Ci0KLQotPHA+UGxlYXNlIG5vdGUgdGhhdCB0aGUgJy5wcm9wZXJ0aWVzJyBmaWxlcyB1c2VkIGluIHByb3BlcnRpZXMgc3VjaCBhcwotT3V0U2lnbmF0dXJlUHJvcEZpbGUgYXJlIHRoZSBzYW1lIHByb3BlcnR5IGZpbGVzIHRoYXQgYXJlIHVzaW5nIGluIHRoZSBXU1M0SgotcHJvamVjdC4gRm9sbG93aW5nIHNob3dzIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gYSBzYW1wbGUgcHJvcGVydHkgZmlsZTwvcD4KLTxzb3VyY2U+PHByZT4gICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLnByb3ZpZGVyPW9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluCi0gICAgICAgIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS50eXBlPXBrY3MxMgotICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4ua2V5c3RvcmUucGFzc3dvcmQ9c2VjdXJpdHkKLSAgICAgICAgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmtleXN0b3JlLmFsaWFzPTE2YzczYWI2LWI4OTItNDU4Zi1hYmY1LTJmODc1Zjc0ODgyZQotICAgICAgICBvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4uYWxpYXMucGFzc3dvcmQ9c2VjdXJpdHkKLSAgICAgICAgb3JnLmFwYWNoZS53cy5zZWN1cml0eS5jcnlwdG8ubWVybGluLmZpbGU9a2V5cy94NTA5LlBGWC5NU0ZUCi0gICAgPC9wcmU+Ci08L3NvdXJjZT5vcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5wcm92aWRlciBkZWZpbmVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgotdGhlIG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uQ3J5cHRvIGludGVyZmFjZSB0byBwcm92aWRlIHRoZQotY3J5cHRvIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IFdTUzRKLiBUaGUgb3RoZXIgcHJvcGVydGllcyBkZWZpbmVkIGFyZSB0aGUKLWNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotKG9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluKS4gPGEgbmFtZT0icmVmIj48L2E+IDxhCi1uYW1lPSJyZWZlcmVuY2VzIj48L2E+Ci0KLTxoMj5SZWZlcmVuY2VzPC9oMj4KLQotPHA+MS4gPGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvd3NzNGoiPkFwYWNoZSBXU1M0SiAtSG9tZTwvYT48L3A+Ci08YSBuYW1lPSJleGFtcGxlcyI+PC9hPgotPHA+Mi4gPGEgaHJlZj0iaHR0cDovL3NwZWNzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kvd3Mtc2VjdXJpdHlwb2xpY3kucGRmIj53cy1zZWN1cml0eXBvbGljeS5wZGY8L2E+PC9wPgotPGEgbmFtZT0iZXhhbXBsZXMiPjwvYT4KLQotCi08aDI+RXhhbXBsZXM8L2gyPgotCi08cCBpZD0iZXgxIj5FeGFtcGxlIDE6IEFuIG91dGZsb3cgY29uZmlndXJhdGlvbiB0byBhZGQgYSB0aW1lc3RhbXAsIHNpZ24gYW5kCi1lbmNyeXB0IHRoZSBtZXNzYWdlIG9uY2U8L3A+Ci0KLTxwPjxpbWcgYWx0PSIiIHNyYz0ic2VjLWNvbmYvb3V0LXNhbXBsZS5wbmciLz48L3A+Ci0KLTxwIGlkPSJleDIiPkV4YW1wbGUgMjogQW4gb3V0ZmxvdyBjb25maWd1cmF0aW9uIHRvIHNpZ24gdGhlIG1lc3NhZ2UgdHdpY2UgYW5kCi1hZGQgYSB0aW1lc3RhbXA8L3A+Ci0KLTxwPjxpbWcgYWx0PSIiIHNyYz0ic2VjLWNvbmYvb3V0LXNhbXBsZTIucG5nIi8+PC9wPgotCi08cCBpZD0iZXgzIj5FeGFtcGxlIDM6IEFuIGluZmxvdyBjb25maWd1cmF0aW9uIHRvIGRlY3J5cHQsIHZlcmlmeSBzaWduYXR1cmUKLWFuZCB2YWxpZGF0ZSB0aW1lc3RhbXA8L3A+Ci0KLTxwPjxpbWcgYWx0PSIiIHNyYz0ic2VjLWNvbmYvaW4tc2FtcGxlLnBuZyIvPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvb3ZlcnZpZXcueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDZmYTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9vdmVydmlldy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTx0aXRsZT5PdmVydmlldzwvdGl0bGU+DQotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgyPk92ZXJ2aWV3PC9oMj4NCi08cD5FdmVyeSB2b2x1bnRlZXIgcHJvamVjdCBvYnRhaW5zIGl0cyBzdHJlbmd0aCBmcm9tIHRoZSBwZW9wbGUNCi1pbnZvbHZlZCBpbiBpdC4gV2UgaW52aXRlIHlvdSB0byBwYXJ0aWNpcGF0ZSBhcyBtdWNoIG9yIGFzIGxpdHRsZQ0KLWFzIHlvdSBjaG9vc2UuIFRoZSByb2xlcyBhbmQgcmVzcG9uc2liaWxpdGllcyB0aGF0IHBlb3BsZSBjYW4NCi1hc3N1bWUgaW4gdGhlIHByb2plY3QgYXJlIGJhc2VkIG9uIG1lcml0LiBFdmVyeWJvZHkncyBpbnB1dA0KLW1hdHRlcnMhPC9wPg0KLTxwPlRoZXJlIGFyZSBhIHZhcmlldHkgb2Ygd2F5cyB0byBwYXJ0aWNpcGF0ZS4gUmVnYXJkbGVzcyBvZiBob3cNCi15b3UgY2hvb3NlIHRvIHBhcnRpY2lwYXRlLCB3ZSBzdWdnZXN0IHlvdSBqb2luIHNvbWUgb3IgYWxsIG9mIG91cg0KLTxhIGhyZWY9Im1haWwtbGlzdHMuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4uPC9wPg0KLTxoMj48Yj5Vc2UgdGhlIFByb2R1Y3RzIGFuZCBHaXZlIFVzIEZlZWRiYWNrPC9iPjwvaDI+DQotPHA+VXNpbmcgdGhlIHByb2R1Y3RzLCByZXBvcnRpbmcgYnVncywgbWFraW5nIGZlYXR1cmUgcmVxdWVzdHMsDQotZXRjLiBpcyBieSBmYXIgdGhlIG1vc3QgaW1wb3J0YW50IHJvbGUuIEl0J3MgeW91ciBmZWVkYmFjayB0aGF0DQotYWxsb3dzIHRoZSB0ZWNobm9sb2d5IHRvIGV2b2x2ZS48L3A+DQotPHVsPg0KLTxsaT48YSBocmVmPSJtYWlsLWxpc3RzLmh0bWwiPkpvaW4gTWFpbGluZyBMaXN0czwvYT48L2xpPg0KLTxsaT48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiIHRhcmdldD0NCi0iX2JsYW5rIj5Eb3dubG9hZCBCaW5hcnkgQnVpbGRzPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9BWElTMiI+UmVwb3J0DQotYnVncy9SZXF1ZXN0IGFkZGl0aW9uYWwgZmVhdHVyZXM8L2E+PC9saT4NCi08L3VsPg0KLTxoMj48Yj5Db250cmlidXRlIENvZGUgb3IgRG9jdW1lbnRhdGlvbiBQYXRjaGVzPC9iPjwvaDI+DQotPHA+SW4gdGhpcyByb2xlLCB5b3UgcGFydGljaXBhdGUgaW4gdGhlIGFjdHVhbCBkZXZlbG9wbWVudCBvZiB0aGUNCi1jb2RlLiBJZiB0aGlzIGlzIHRoZSB0eXBlIG9mIHJvbGUgeW91J2QgbGlrZSB0byBwbGF5LCBoZXJlIGFyZSBzb21lDQotc3RlcHMgKGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIGFib3ZlKSB0byBnZXQgeW91IHN0YXJ0ZWQ6PC9wPg0KLTx1bD4NCi08bGk+UmVhZCBvdXIgPGEgaHJlZj0iZ3VpZGVsaW5lcy5odG1sIj5kZXZlbG9wZXIgZ3VpZGVsaW5lczwvYT4gYW5kIDxhDQotaHJlZj0icmVsZWFzZS1wcm9jZXNzLmh0bWwiPnJlbGVhc2UgcHJvY2VzczwvYT48L2xpPg0KLTxsaT5SZXZpZXcgdGhlIDxhIGhyZWY9InJlZkxpYi5odG1sIj5yZWZlcmVuY2UgbGlicmFyeTwvYT48L2xpPg0KLTxsaT48YSBocmVmPQ0KLSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL3dlYnNlcnZpY2VzL2F4aXMyLyI+DQotVmlldyB0aGUgU291cmNlIENvZGU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0ic3ZuLmh0bWwiPkFjY2VzcyBTVk4gUmVwb3NpdG9yeTwvYT48L2xpPg0KLTwvdWw+DQotPGRpdiBpZD0icGRmIiBhbGlnbj0icmlnaHQiPjwvZGl2Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9yZWZMaWIueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9yZWZMaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Y0YjhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvcmVmTGliLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPlJlZmVyZW5jZSBMaWJyYXJ5PC90aXRsZT4NCi08bGluayBocmVmPSJjc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyINCi1tZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDI+UmVmZXJlbmNlIExpYnJhcnk8L2gyPg0KLTxwPlRoZSBBeGlzIFByb2plY3QgbGl2ZXMgb3IgZmFpbHMgYmFzZWQgb24gaXRzIGh1bWFuIHJlc291cmNlcy4NCi1Vc2VycyBhbmQgY29udHJpYnV0b3JzIGFsaWtlIGhlbHAgdGhlIHByb2plY3Qgd2l0aCBpZGVhcyBhbmQNCi1icmFpbnBvd2VyLiBBIGNvbW1vbiBmb3VuZGF0aW9uIG9mIGtub3dsZWRnZSBpcyByZXF1aXJlZCB0bw0KLWVmZmVjdGl2ZWx5IHBhcnRpY2lwYXRlIGluIHRoaXMgdmlydHVhbCBjb21tdW5pdHkuIFRoZSBmb2xsb3dpbmcgaXMNCi1hIGxpc3Qgb2YgZG9jdW1lbnRzIHRoYXQgd2UgaGF2ZSBmb3VuZCBoZWxwZnVsIHRvIHVzIGFuZCB0aGV5IG1heWJlDQotaGVscGZ1bCB0byB5b3U6PC9wPg0KLTxwPlRoZXNlIHJlc291cmNlcyBhcmUgcmVxdWlyZWQgcmVhZGluZyBmb3IgYW55Ym9keSBjb250cmlidXRpbmcNCi1zb3VyY2UgY29kZSB0byB0aGUgcHJvamVjdC48L3A+DQotPHA+PGI+PGZvbnQ+U09BUCBTcGVjaWZpYyBSZXNvdXJjZXM8L2ZvbnQ+PC9iPjwvcD4NCi08cD48Yj5TT0FQIFczQyBTcGVjaWZpY2F0aW9uPC9iPiA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL05PVEUtU09BUC0yMDAwMDUwOC8iPjEuMTwvYT4gYW5kDQotPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvc29hcC8iPjEuMjwvYT48YnIgLz4NCi1SZXF1aXJlZCByZWFkaW5nLjwvcD4NCi08cD48Yj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TT0FQLWF0dGFjaG1lbnRzIj5TT0FQDQotTWVzc2FnaW5nIHdpdGggQXR0YWNobWVudHMgVzNDIFNwZWNpZmljYXRpb248L2E+PC9iPjxiciAvPg0KLVNPQVAgY29tYmluZWQgd2l0aCBNSU1FLjwvcD4NCi08cD48Yj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9TT0FQLWRzaWcvIj5TT0FQIFNlY3VyaXR5DQotRXh0ZW5zaW9uczogRGlnaXRhbCBTaWduYXR1cmUgU3BlY2lmaWNhdGlvbjwvYT48L2I+PGJyIC8+DQotQWRkaW5nIHNlY3VyaXR5IHRvIFNPQVAuPC9wPg0KLTxwPjxiPk90aGVyIFNwZWNpZmljYXRpb25zPC9iPjwvcD4NCi08cD5XZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpIDxhIGhyZWY9DQotImh0dHA6Ly93d3cudzNjLm9yZy9UUi93c2RsLmh0bWwiPjEuMTwvYT4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53My5vcmcvVFIvd3NkbDIwLyI+Mi4wPC9hPjwvcD4NCi08cD5XUyAtIEFkZHJlc3NpbmcgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy53My5vcmcvU3VibWlzc2lvbi93cy1hZGRyZXNzaW5nLyI+c3VibWlzc2lvbjwvYT4NCi08YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA1L1dELXdzLWFkZHItY29yZS0yMDA1MDMzMS8iPjEuMA0KLSgzMXN0IE1hcmNoLDIwMDUpPC9hPjwvcD4NCi08cD48YSBocmVmPQ0KLSJmdHA6Ly93d3c2LnNvZnR3YXJlLmlibS5jb20vc29mdHdhcmUvZGV2ZWxvcGVyL2xpYnJhcnkvd3MtcG9saWN5LnBkZiI+DQotV2ViIFNlcnZpY2VzIFBvbGljeSBGcmFtZXdvcmsgKFdTUG9saWN5KTwvYT48L3A+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL3d3dy53cy1pLm9yZy9Qcm9maWxlcy9CYXNpY1Byb2ZpbGUtMS4wLmh0bWwiPldTLUkgQmFzaWMNCi1Qcm9maWxlIFZlcnNpb24gMS4wPC9hPjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vamNwLm9yZy9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9maXJzdC9qc3IxMDEvaW5kZXguaHRtbCI+DQotSmF2YSBBUEkgZm9yIFhNTC1iYXNlZCBSUEMgKEpBWC1SUEMpPC9hPjwvcD4NCi08cD48YSBocmVmPQ0KLSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA1L1JFQy1zb2FwMTItbXRvbS0yMDA1MDEyNS8iPlNPQVAgTWVzc2FnZQ0KLVRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtPC9hPjwvcD4NCi08cD48Yj5PdGhlciBSZXNvdXJjZXM8L2I+PC9wPg0KLTxwPjxiPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvaW5kZXguaHRtbCI+VGhlDQotSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uPC9hPjwvYj48YnIgLz4NCi1Xcml0dGVuIGJ5IHRoZSBjcmVhdG9ycyBvZiB0aGUgSmF2YSBQcm9ncmFtbWluZyBMYW5ndWFnZSwgdGhpcw0KLW9ubGluZSBib29rIGlzIGNvbnNpZGVyZWQgYnkgbWFueSB0byBiZSB0aGUgYmlibGUgZm9yIHByb2dyYW1taW5nDQotaW4gSmF2YS4gQSBtdXN0IHJlYWQuPC9wPg0KLTxwPjxiPjxhIGhyZWY9DQotImh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrL2phdmFkb2MvaW5kZXguaHRtbCI+SmF2YWRvYzwvYT48L2I+PGJyIC8+DQotDQotSmF2YWRvYyBpcyB0aGUgYXV0b21hdGljIHNvZnR3YXJlIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yIHVzZWQgYnkNCi1KYXZhLCBzaW5jZSBpdCB3YXMgZmlyc3QgcmVsZWFzZWQuIEFsbCBjb2RlIHdyaXR0ZW4gZm9yIHRoaXMNCi1wcm9qZWN0IG11c3QgYmUgZG9jdW1lbnRlZCB1c2luZyBKYXZhZG9jIGNvbnZlbnRpb25zLjwvcD4NCi08cD48Yj48YSBocmVmPQ0KLSJodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvY29kZWNvbnYvaHRtbC9Db2RlQ29udlRPQy5kb2MuaHRtbCI+VGhlDQotSmF2YSBDb2RlIENvbnZlbnRpb25zPC9hPjwvYj48YnIgLz4NCi1UaGlzIFN1biBkb2N1bWVudCBzcGVjaWZpZXMgdGhlIGRlLWZhY3RvIHN0YW5kYXJkIHdheSBvZiBmb3JtYXR0aW5nDQotSmF2YSBjb2RlLiBBbGwgY29kZSB3cml0dGVuIGZvciB0aGlzIHByb2plY3QgbXVzdCBmb2xsb3cgdGhlc2UNCi1jb252ZW50aW9ucy48L3A+DQotPHA+PGEgaHJlZj0NCi0iaHR0cDovL3N2bmJvb2sucmVkLWJlYW4uY29tL2VuLzEuMS9zdm4tYm9vay5odG1sIj48c3Ryb25nPlZlcnNpb24NCi1Db250cm9sIHdpdGggU3ViVmVyc2lvbjwvc3Ryb25nPjwvYT48YnIgLz4NCi1Xcml0dGVuIGJ5IEJlbiBDb2xsaW5zLVN1c3NtYW4sIEJyaWFuIFcuIEZpdHpwYXRyaWNrLCBDLiBNaWNoYWVsDQotUGlsYXRvLiBJdCBwcm92aWRlcyBkZXRhaWxzIG9uIFNWTiBmZWF0dXJlcy48L3A+DQotPHA+PC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9yZWxlYXNlLXByb2Nlc3MueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy9yZWxlYXNlLXByb2Nlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGRkNDJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvcmVsZWFzZS1wcm9jZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPkF4aXMyIFJlbGVhc2UgUHJvY2VzczwvdGl0bGU+DQotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiDQotbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHk+DQotPGgxPlJlbGVhc2UgUHJvY2VzczwvaDE+DQotPGgzPkN1dHRpbmcgYSBicmFuY2g8L2gzPg0KLTx1bD4NCi08bGk+V2hlbiBhIHJlbGVhc2UgaXMgcmVhZHkgdG8gZ28sIHJlbGVhc2UgbWFuYWdlciAoUk0pIHB1dHMNCi1mb3J3YXJkIGEgcmVsZWFzZSBwbGFuIGFzIHBlciBzdGFuZGFyZCBBcGFjaGUgcHJvY2VzcywgaW5jbHVkaW5nDQotZGF0ZXMuIFRoaXMgZ2V0cyBWT1RFZCBvbiBieSB0aGUgY29tbWl0dGVycy4gRHVyaW5nIHRoaXMgcGVyaW9kIHRoZQ0KLXRydW5rIGlzIHN0aWxsIHRoZSBvbmx5IHJlbGV2YW50IHNvdXJjZSBiYXNlLjwvbGk+DQotPGxpPkFzIHNvb24gYXMgYSByZWxlYXNlIGlzIGFwcHJvdmVkIChvciBldmVuIGJlZm9yZSksIFJNIHNob3VsZA0KLWFkZCB0aGUgbmV3IHZlcnNpb24gaW50byBKSVJBIGFzIGEgdGFyZ2V0LjwvbGk+DQotPGxpPkF0IHRoZSBwb2ludCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBkbyB0aGUgImNvZGUgZnJlZXplIiBmb3IgYQ0KLXJlbGVhc2UsIHRoZSBSTSBjdXRzIGEgYnJhbmNoIG5hbWVkIGZvciB0aGUgcmVsZWFzZS4gVGhpcyBicmFuY2ggaXMNCi13aGVyZSB0aGUgcmVsZWFzZSBjYW5kaWRhdGVzIGFuZCByZWxlYXNlcyB3aWxsIGhhcHBlbi48L2xpPg0KLTxsaT5JZGVhbGx5IGEgcmVsZWFzZSBicmFuY2ggaXMgb25seSBhcm91bmQgZm9yIGEgd2VlayBvciBtYXliZSB0d28NCi1iZWZvcmUgdGhlIHJlbGVhc2UgaGFwcGVucy48L2xpPg0KLTxsaT5UaGUgb25seSB0aGluZ3MgdGhhdCBzaG91bGQgRVZFUiBnZXQgY2hlY2tlZCBpbnRvIHRoZSByZWxlYXNlDQotYnJhbmNoIGFyZSAtIDEpIGJ1ZyBmaXhlcyB0YXJnZXRlZCBhdCB0aGUgcmVsZWFzZSwgMikNCi1yZWxlYXNlLXNwZWNpZmljIHVwZGF0ZXMgKGRvY3VtZW50YXRpb24sIFNOQVBTSE9UIHJlbW92YWwsIGV0YykuIEluDQotcGFydGljdWxhciBuZXcgZnVuY3Rpb25hbGl0eSBkb2VzIG5vdCBnbyBoZXJlIHVubGVzcyBpdCBpcyBhDQotc29sdXRpb24gdG8gYSBKSVJBIHJlcG9ydCB0YXJnZXRlZCBhdCB0aGUgcmVsZWFzZS48L2xpPg0KLTxsaT5Ob3JtYWwgZGV2ZWxvcG1lbnQgY29udGludWVzIG9uIHRoZSB0cnVuay48L2xpPg0KLTwvdWw+DQotPGgzPkRlcGVuZGVuY2llcyBhbmQgYnJhbmNoZXM8L2gzPg0KLTx1bD4NCi08bGk+VGhlIHRydW5rIHNob3VsZCBhbHdheXMgYmUgImN1dHRpbmcgZWRnZSIgYW5kIGFzIHN1Y2ggc2hvdWxkDQotdXN1YWxseSBiZSBwb2ludGluZyBhdCBTTkFQU0hPVCB2ZXJzaW9ucyBvZiBhbGwgZGVwZW5kZW5jaWVzLiBUaGlzDQotYWxsb3dzIGZvciBjb250aW51b3VzIGludGVncmF0aW9uIHdpdGggb3VyIHBhcnRuZXIgcHJvamVjdHMuPC9saT4NCi08bGk+U29vbiBhZnRlciBhIHJlbGVhc2UgYnJhbmNoIGlzIGN1dCwgdGhlIFJNIGlzIHJlc3BvbnNpYmxlIGZvcg0KLXJlbW92aW5nIEFMTCBkZXBlbmRlbmNpZXMgb24gU05BUFNIT1QgdmVyc2lvbnMgYW5kIHJlcGxhY2luZyB0aGVtDQotd2l0aCBvZmZpY2lhbGx5IHJlbGVhc2VkIHZlcnNpb25zLiBUaGlzIGNoYW5nZSBoYXBwZW5zIG9ubHkgb24gdGhlDQotcmVsZWFzZSBicmFuY2guPC9saT4NCi08L3VsPg0KLTxoMz5NYW5hZ2luZyBjaGFuZ2UgYW5kIGlzc3VlIHJlc29sdXRpb24gd2l0aCBhIHJlbGVhc2UgYnJhbmNoPC9oMz4NCi08dWw+DQotPGxpPlRoZSBSTSBnb2VzIHRocm91Z2ggSklSQSBpc3N1ZXMgYW5kIHNldHMgImZpeCBmb3IiIHRvIHBvaW50IHRvDQotYm90aCAiTklHSFRMWSIgYW5kIHRoZSBuZXcgYnJhbmNoZWQgcmVsZWFzZSBudW1iZXIgZm9yIHRoZSBmaXhlcw0KLXRoYXQgYXJlIHRhcmdldGVkIGZvciB0aGUgcmVsZWFzZSBhZnRlciB0aGUgYnJhbmNoIGlzIGN1dC48L2xpPg0KLTxsaT5JbiBnZW5lcmFsLCB0aGUgYXNzaWduZWUvY29kZXIgZml4ZXMgSklSQSBpc3N1ZXMgb3IgbWFrZXMgb3RoZXINCi1jaGFuZ2VzICpvbiB0aGUgdHJ1bmsqLiBJZiB0aGUgSklSQSBpc3N1ZSBpcyB0YXJnZXRlZCBhdCB0aGUNCi1yZWxlYXNlLCBvciB1cG9uIGNvZGVyJ3MgZGlzY3JldGlvbiwgdGhleSB0aGVuIG1lcmdlIHRoZSBmaXggb3Zlcg0KLXRvIHRoZSByZWxlYXNlIGJyYW5jaC48L2xpPg0KLTxsaT5UaGlzIHdheSB0aGUgdHJ1bmsgaXMgQUxXQVlTIHVwLXRvLWRhdGUsIGFuZCB3ZSBkb24ndCBoYXZlIHRvDQotd29ycnkgYWJvdXQgbG9zaW5nIGZpeGVzIHRoYXQgaGF2ZSBvbmx5IGJlZW4gbWFkZSBvbiB0aGUgcmVsZWFzZQ0KLWJyYW5jaC48L2xpPg0KLTxsaT5XaGVuIHRoZSBhc3NpZ25lZSByZXNvbHZlcyBhbiBpc3N1ZSwgdGhleSBjb25maXJtIGl0J3MgYmVlbg0KLWZpeGVkIGluIGJvdGggYnJhbmNoZXMsIGlmIGFwcHJvcHJpYXRlLjwvbGk+DQotPC91bD4NCi08aDM+Q2hlY2tpbmcgY2hhbmdlcyBpbnRvIHRoZSBicmFuY2g8L2gzPg0KLTx1bD4NCi08bGk+SWYgYnVnIGZpeGVzIGFyZSBuZWVkZWQgbGF0ZXIgZm9yIGEgcmVsZWFzZSB3aGljaCBoYXMgbG9uZw0KLXNpbmNlIGhhcHBlbmVkICh0byBmaXggdXNlciBpc3N1ZXMsIGV0YyksIHRob3NlIGZpeGVzIGdlbmVyYWxseQ0KLXNob3VsZCBhbHNvIGhhcHBlbiBvbiB0aGUgdHJ1bmsgZmlyc3QgYXNzdW1pbmcgdGhlIHByb2JsZW0gc3RpbGwNCi1leGlzdHMgb24gdGhlIHRydW5rLjwvbGk+DQotPGxpPlRoZXJlIGFyZSBvbmx5IHR3byBjYXNlcyB3aGVyZSB3ZSB3b3VsZCBldmVyIGNoZWNrIGFueXRoaW5nDQotaW50byB0aGUgYnJhbmNoIHdpdGhvdXQgZmlyc3QgY2hlY2tpbmcgaXQgaW50byB0aGUgdHJ1bmsuIDEpDQotUmVsZWFzZSBzcGVjaWZpYyBpdGVtcyAocmVsZWFzZSBudW1iZXIgcmVmZXJlbmNlcywgcmVsZWFzZSBub3RlcywNCi1yZW1vdmFsIG9mIFNOQVBTSE9UcyksIGFuZCAyKSBpZiB0aGUgdHJ1bmsgaGFzIG1vdmVkIG9uIGluIHNvbWUNCi1pbmNvbXBhdGlibGUgd2F5LjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc2l0ZUhvd1RvLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc2l0ZUhvd1RvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4NDdhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3NpdGVIb3dUby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ci0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+Ci08dGl0bGU+SG93IFRvIEJ1aWxkIEF4aXMgUHJvamVjdCdzIFdlYnNpdGU8L3RpdGxlPgotPGxpbmsgaHJlZj0iY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiCi1tZWRpYT0iYWxsIiAvPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SG93IHRvIEJ1aWxkIHRoZSBBeGlzMiBQcm9qZWN0J3MgV2Vic2l0ZTwvaDE+Ci08aDI+SW5zdGFsbGluZyBNYXZlbjI8L2gyPgotPHA+VGhlIEF4aXMgMi4wIHdlYnNpdGUgYnVpbGQgc3lzdGVtIHNvbGVseSBkZXBlbmRzIG9uIDxhIGhyZWY9Ci0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvIj5NYXZlbjI8L2E+LiBUaGUgYnVpbGQgaGFzIGJlZW4KLXNwZWNpZmljYWxseSB0ZXN0ZWQgdG8gd29yayB3aXRoIE1hdmVuIHZlcnNpb24gMi4wLjcuIFRvIGluc3RhbGwKLU1hdmVuLCBkb3dubG9hZCB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4KLXRoZSBkb2N1bWVudGF0aW9uLiBNYWtlIHN1cmUgeW91IGRvbid0IGZvcmdldCB0byBhZGQgTUFWRU5fSE9NRS9iaW4KLWRpcmVjdG9yeSBpbiB0aGUgcGF0aC48L3A+Ci08aDI+Q2hlY2tpbmcgb3V0IEF4aXMgMi4wPC9oMj4KLTxwPkNoZWNrb3V0IHRoZSA8YSBocmVmPQotImh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YSI+bGF0ZXN0Ci1zb3VyY2U8L2E+IHVzaW5nIHlvdXIgZmF2b3JpdGUgU1ZOIGNsaWVudC4gSWYgeW91IGFyZSBhIGNvbW1pdHRlciwKLWdldCBhIDxhIGhyZWY9Ci0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YSI+Y29tbWl0ZXIKLWNoZWNrIG91dC48L2E+PC9wPgotPGgyPkJ1aWxkaW5nIHRoZSBTaXRlPC9oMj4KLTxwPmNkIHRvIG1vZHVsZXMvZG9jdW1lbnRhdGlvbiBhbmQgdHlwZSA8aT5tdm4gaW5zdGFsbDwvaT4gVGhlIGJ1aWx0Ci1zaXRlIHdpbGwgYmUgYXZhaWxhYmxlIHVuZGVyIHRhcmdldC9zaXRlLjwvcD4KLTxoMj5GQVE8L2gyPgotPG9sPgotPGxpPkhvdyBjYW4gSSB1cGRhdGUgYSBkb2N1bWVudCBpbiB0aGUgc2l0ZSA/PGJyIC8+Ci1HZXQgYSBjb21taXRlciBjaGVjayBvdXQuIEFsbCB0aGUgZG9jdW1lbnRzIGFyZSBpbiBYSFRNTCBmb3JtYXQKLXVuZGVyIHRoZSBtb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MgZm9sZGVyLCBhbmQgeW91IGNhbiBjaGFuZ2Ugb25seSB0aGUgZG9jdW1lbnRzIGZvdW5kCi11bmRlciB0aGlzIGZvbGRlci4gQ2hhbmdlIHRoZSByZWxldmFudCBmaWxlIGFuZCBydW4gPGk+bXZuCi1pbnN0YWxsPC9pPi4gTmV3IGRvY3VtZW50YXRpb24gd2lsbCBiZSBhdmFpbGFibGUgdW5kZXIKLXRoZSB0YXJnZXQgZm9sZGVyLjwvbGk+Ci08bGk+SG93IGNhbiBJIGFkZCBhIG5ldyBkb2N1bWVudD88YnIgLz4KLUFkZCB0aGUgbmV3IGRvY3VtZW50IGluIHRoZSB4ZG9jcyBmb2xkZXIuIENoYW5nZSB0aGUgbmF2aWdhdGlvbi54bWwKLWZvdW5kIHVuZGVyIHRoZSB4ZG9jcyBmb2xkZXIgYnkgYWRkaW5nIGEgbGluayB0byB0aGUgbmV3bHkgYWRkZWQKLWRvY3VtZW50LiBSZS1nZW5lcmF0ZSB0aGUgc2l0ZS48YnIgLz4KLVBsZWFzZSBtYWtlIHN1cmUgeW91IGhhdmUgbm90IGluY2x1ZGVkIGFueSBvZiB0aGUgaWxsZWdhbAotY2hhcmFjdGVycyBhbmQgeW91ciBkb2N1bWVudCBzaG91bGQgYmUgd2VsbCBmb3JtZWQuPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3N0eWxlL21hdmVuLXRoZW1lLmNzcyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc3R5bGUvbWF2ZW4tdGhlbWUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVlZmZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc3R5bGUvbWF2ZW4tdGhlbWUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1ib2R5LCB0ZCwgc2VsZWN0LCBpbnB1dCwgbGl7Ci0gIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDEzcHg7Ci19Ci1hIHsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYTpsaW5rIHsKLSAgY29sb3I6IzM2YTsKLX0KLWE6dmlzaXRlZCAgewotICBjb2xvcjojNDdhOwotfQotYTphY3RpdmUsIGE6aG92ZXIgewotICBjb2xvcjojNjljOwotfQotYS5leHRlcm5hbExpbmssIGEuZXh0ZXJuYWxMaW5rOmxpbmssIGEuZXh0ZXJuYWxMaW5rOnZpc2l0ZWQsIGEuZXh0ZXJuYWxMaW5rOmFjdGl2ZSwgYS5leHRlcm5hbExpbms6aG92ZXIgewotICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1hZ2VzL2V4dGVybmFsLnBuZykgcmlnaHQgY2VudGVyIG5vLXJlcGVhdDsKLSAgcGFkZGluZy1yaWdodDogMTVweDsKLX0KLWEubmV3V2luZG93LCBhLm5ld1dpbmRvdzpsaW5rLCBhLm5ld1dpbmRvdzp2aXNpdGVkLCBhLm5ld1dpbmRvdzphY3RpdmUsIGEubmV3V2luZG93OmhvdmVyIHsKLSAgYmFja2dyb3VuZDogdXJsKC4uL2ltYWdlcy9uZXd3aW5kb3cucG5nKSByaWdodCBjZW50ZXIgbm8tcmVwZWF0OwotICBwYWRkaW5nLXJpZ2h0OiAxOHB4OwotfQotaDIgewotYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9oMi1iZy5naWYpOyAKLQliYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7IAotCWJhY2tncm91bmQtYXR0YWNobWVudDogc2Nyb2xsOyAKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IHRvcDsgCi0JaGVpZ2h0OiAyMHB4OwotICBwYWRkaW5nOiA0cHggNHB4IDRweCA2cHg7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjY2NjOwotICBjb2xvcjogIzMzMzMzMzsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSAgZm9udC13ZWlnaHQ6OTAwOwotICBmb250LXNpemU6IGxhcmdlOwotfQotaDMgewotcGFkZGluZzogNHB4IDRweCAycHggNnB4OwotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjY2NjYzsKLSAgYm9yZGVyLXRvcDogMHB4IHNvbGlkICNjY2NjY2M7Ci0gIGJvcmRlci1sZWZ0OiAwcHggc29saWQgI2NjY2NjYzsKLSAgYm9yZGVyLXJpZ2h0OiAwcHggc29saWQgI2NjY2NjYzsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtd2VpZ2h0OiBzZW1pLWJvbGQ7Ci0gIGZvbnQtc2l6ZTogbm9ybWFsOwotfQotcCB7Ci0gIGxpbmUtaGVpZ2h0OiAxLjNlbTsKLSAgZm9udC1zaXplOiBzbWFsbDsKLX0KLSNiYW5uZXIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyAKLQlib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ZmZjsgCi19Ci0jYnJlYWRjcnVtYnMgewotICBib3JkZXItdG9wOiAxcHggc29saWQgI2FhYTsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9icmVhZGNydW1icy1iZy5naWYpOyAKLQliYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7IAotCWJhY2tncm91bmQtYXR0YWNobWVudDogc2Nyb2xsOyAKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IHRvcDsgCi0JaGVpZ2h0OiAyOHB4OwotfQotI2xlZnRDb2x1bW4gewotICBtYXJnaW46IDVweCAwIDAgMTBweDsKLSAgYm9yZGVyOiAxcHggc29saWQgI2I1YjViNTsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltYWdlcy9sZWZ0Y29sdW1uLWJnLmdpZik7IAotCWJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsgCi0JYmFja2dyb3VuZC1hdHRhY2htZW50OiBzY3JvbGw7IAotCWJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgdG9wOwotfQotI25hdmNvbHVtbiBoNSB7Ci0gIGZvbnQtc2l6ZTogc21hbGxlcjsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhYWFhYWE7Ci0gIHBhZGRpbmctdG9wOiA0cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA0cHg7Ci19Ci0KLXRhYmxlLmJvZHlUYWJsZSB0aCB7Ci0gIGNvbG9yOiB3aGl0ZTsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2JiYjsKLSAgdGV4dC1hbGlnbjogbGVmdDsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXRhYmxlLmJvZHlUYWJsZSB0aCwgdGFibGUuYm9keVRhYmxlIHRkIHsKLSAgZm9udC1zaXplOiAxZW07Ci19Ci0KLXRhYmxlLmJvZHlUYWJsZSB0ci5hIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKLX0KLQotdGFibGUuYm9keVRhYmxlIHRyLmIgewotICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwotfQotCi0uc291cmNlIHsKLSAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc3ZuLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3Mvc3ZuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhNTVkNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3N2bi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+RGV2ZWxvcGluZyBBcGFjaGUgQXhpczI8L3RpdGxlPg0KLTxsaW5rIGhyZWY9ImNzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIg0KLW1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5EZXZlbG9waW5nIEFwYWNoZSBBeGlzMjwvaDE+DQotPHA+VGhpcyBkb2N1bWVudCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIFNWTiB0byBnZXQgYW4NCi1TVk4gY2hlY2tvdXQvdXBkYXRlLCBtYWtlIGNvbW1pdHMgdG8gdGhlIHJlcG9zaXRvcnksIGV0Yy4sIGluIHRoZQ0KLXByb2Nlc3Mgb2YgY29udHJpYnV0aW5nIHRvIEFwYWNoZSBwcm9qZWN0cyAoc3BlY2lmaWNhbGx5IEF4aXMyKS4NCi1JbnN0cnVjdGlvbnMgb24gY29uZmlndXJpbmcgSURFcyBmb3IgZGV2ZWxvcG1lbnQgYW5kIHVzaW5nIE1hdmVuIHRvDQotYnVpbGQgdGhlIHByb2plY3QgaXMgYWxzbyBpbmNsdWRlZCBoZXJlLjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjc3ZuIj5Xb3JraW5nIHdpdGggU3VidmVyc2lvbiAoU1ZOKTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjY2hlY2tvdXQiPkNoZWNrb3V0IEF4aXMyIGZyb20gU3VidmVyc2lvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjbWF2ZW4iPkluc3RhbGxpbmcgTWF2ZW4gMjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjaWRlIj5Db25maWd1cmluZyB5b3VyIElERTwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0ic3ZuIiBpZD0ic3ZuIj48L2E+DQotPGgyPldvcmtpbmcgd2l0aCBTdWJ2ZXJzaW9uIChTVk4pPC9oMj4NCi08cD5UaGUgQXhpczIgZGV2ZWxvcG1lbnQgdGVhbSB1c2VzIFN1YnZlcnNpb24gKFNWTikgZm9yIHNvdXJjZQ0KLWNvbnRyb2wuIFN1YnZlcnNpb24gaXMgYSBjb21wZWxsaW5nIHJlcGxhY2VtZW50IGZvciBDVlMsIGRldmVsb3BlZA0KLXVuZGVyIHRoZSBhdXNwaWNlcyBvZiB0aGUgVGlncmlzIGNvbW11bml0eSBhbmQgbGljZW5zZWQgdW5kZXIgYW4NCi1BcGFjaGUgY29tcGF0aWJsZSBsaWNlbnNlLiBUbyBsZWFybiBtb3JlIGFib3V0IFN1YnZlcnNpb24gb3IgdG8NCi1kb3dubG9hZCB0aGUgbGF0ZXN0IGRpc3RyaWJ1dGlvbiwgdmlzaXQgdGhlIDxhIGhyZWY9DQotImh0dHA6Ly8vc3VidmVyc2lvbi50aWdyaXMub3JnIiB0YXJnZXQ9Il9ibGFuayI+U3VidmVyc2lvbiBwcm9qZWN0DQotc2l0ZTwvYT4uIElmIHlvdSBhcmUgbG9va2luZyBmb3IgZ3VpZGFuY2Ugb24gc2V0dGluZyB1cCBhbmQNCi1pbnN0YWxsaW5nIFN1YnZlcnNpb24sIHBsZWFzZSByZWFkIHRoZSBBU0YgPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rldi92ZXJzaW9uLWNvbnRyb2wuaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPlNvdXJjZSBDb2RlIFJlcG9zaXRvcmllcyBwYWdlPC9hPi48L3A+DQotPGEgbmFtZT0iY2hlY2tvdXQiIGlkPSJjaGVja291dCI+PC9hPg0KLTxoMj5DaGVja291dCBBeGlzMiBmcm9tIFN1YnZlcnNpb248L2gyPg0KLTxwPlRvIGNoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgQXhpczIgZnJvbSB0aGUgRm91bmRhdGlvbidzDQotU3VidmVyc2lvbiByZXBvc2l0b3J5LCB5b3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgVVJMcw0KLWRlcGVuZGluZyBvbiB5b3VyIGxldmVsIG9mIGFjY2VzcyB0byB0aGUgQXhpczIgc291cmNlIGNvZGU6PC9wPg0KLTx1bD4NCi08bGk+PGI+SWYgeW91IGFyZSBub3QgYSBjb21taXR0ZXI6PC9iPiA8YSBocmVmPQ0KLSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEiDQotdGFyZ2V0PQ0KLSJfYmxhbmsiPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YTwvYT48L2xpPg0KLTxsaT48Yj5JZiB5b3UgYXJlIGEgY29tbWl0dGVyOjwvYj4gPGEgaHJlZj0NCi0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YSINCi10YXJnZXQ9DQotIl9ibGFuayI+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YTwvYT48L2xpPg0KLTwvdWw+DQotSWYgeW91IGFyZSBhIGNvbW1pdHRlciwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgc2VsZWN0ZWQgYW4NCi1zdm5wYXNzd2QuIFRvIGRvIHRoaXMsIHlvdSBtdXN0IGxvZyBpbnRvIHN2bi5hcGFjaGUub3JnLiBGb3IgbW9yZQ0KLWluZm9ybWF0aW9uLCBwbGVhc2UgcmVhZCB0aGUgQVNGIDxhIGhyZWY9DQotImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvdmVyc2lvbi1jb250cm9sLmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5Tb3VyY2UgQ29kZSBSZXBvc2l0b3JpZXMgcGFnZTwvYT4uDQotPHA+T25jZSB5b3UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIFN1YnZlcnNpb24sIHlvdSBjYW4gY2hlY2sNCi1vdXQgQXhpczIgdHJ1bmsgYnkgZm9sbG93aW5nIHRoZXNlIHN0ZXBzOjwvcD4NCi08b2wgdHlwZT0iMSI+DQotPGxpPlJ1biA8c3Ryb25nPnN2biBjbyAmbHQ7cmVwb3NpdG9yeSBVUkwmZ3Q7IGF4aXMyPC9zdHJvbmc+IHdoZXJlDQotdGhlIHJlcG9zaXRvcnkgVVJMIGlzIG9uZSBvZiB0aGUgVVJMcyBmcm9tIHRoZSBwcmV2aW91cyBsaXN0LjwvbGk+DQotPGxpPlRoaXMgc3RlcCB3aWxsIGNoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIEF4aXMyIEphdmENCi1jb2RlYmFzZSB0byBhIGRpcmVjdG9yeSBuYW1lZCAiYXhpczIiLiBUaGUgc2Vjb25kIHBhcmFtZXRlciB0byB0aGUNCi08c3Ryb25nPnN2biBjbzwvc3Ryb25nPiBzZWxlY3RzIGEgZGlyZWN0b3J5IHRvIGNyZWF0ZSBvbiB5b3VyIGxvY2FsDQotbWFjaGluZS4gSWYgeW91IHdhbnQgdG8gY2hlY2tvdXQgQXhpczIgdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LA0KLWZlZWwgZnJlZSB0byBjaGFuZ2UgYXhpczIgdG8gYW55IG90aGVyIGRpcmVjdG9yeSBuYW1lLjwvbGk+DQotPGxpPlRvIHVwZGF0ZSB5b3VyIHdvcmtpbmcgY29weSB0byB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSB0aGUNCi1yZXBvc2l0b3J5LCBleGVjdXRlIHRoZSA8c3Ryb25nPnN2biB1cGRhdGU8L3N0cm9uZz4gY29tbWFuZC48L2xpPg0KLTxsaT5JZiB5b3Ugd291bGQgbGlrZSB0byBzdWJtaXQgYSBwYXRjaCwgeW91IGNhbiBleGVjdXRlDQotPHN0cm9uZz5zdm4gZGlmZjwvc3Ryb25nPiB0byBjcmVhdGUgYSB1bmlmaWVkIGRpZmYgZm9yIHN1Ym1pc3Npb24NCi10byB0aGUgQXhpczIgSklSQSBpc3N1ZSB0cmFja2VyLjwvbGk+DQotPC9vbD4NCi08YSBuYW1lPSJtYXZlbiIgaWQ9Im1hdmVuIj48L2E+DQotPGgyPkluc3RhbGxpbmcgTWF2ZW4gMjwvaDI+DQotPHA+QXhpczIncyBidWlsZCBpcyBiYXNlZCBvbiBNYXZlbiAyLiBNYXZlbiBpcyBhIGJ1aWxkIHN5c3RlbSB0aGF0DQotYWxsb3dzIGZvciB0aGUgcmV1c2Ugb2YgY29tbW9uIGJ1aWxkIHByb2plY3RzIGFjcm9zcyBtdWx0aXBsZQ0KLXByb2plY3RzLiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgb2J0YWluaW5nLCBpbnN0YWxsaW5nLCBhbmQNCi1jb25maWd1cmluZyBNYXZlbiAyLCBwbGVhc2Ugc2VlIHRoZSA8YSBocmVmPQ0KLSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk1hdmVuIHByb2plY3QgcGFnZTwvYT4uDQotVG8gdXNlIE1hdmVuIHRvIGJ1aWxkIHRoZSBBeGlzMiBwcm9qZWN0LCBQbGVhc2UgaW5zdGFsbCA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+TWF2ZW4yPC9hPiBhbmQgZm9sbG93IGluc3RydWN0aW9ucyBoZXJlIC0gIDxhIGhyZWY9Im1hdmVuLWhlbHAuaHRtbCI+UXVpY2sgR3VpZGUgdG8gTWF2ZW4gZm9yIEF4aXMgMi4wPC9hPjwvcD4uDQotPGEgbmFtZT0iaWRlIiBpZD0iaWRlIj48L2E+DQotPGgyPkNvbmZpZ3VyaW5nIHlvdXIgSURFPC9oMj4NCi08cD5UaGUgQXhpczIgZGV2ZWxvcG1lbnQgdGVhbSB1c2VzIGEgdmFyaWV0eSBvZiBkZXZlbG9wbWVudCB0b29scw0KLWZyb20gdmkgdG8gZW1hY3MgdG8gZWNsaXBzZSB0byBJbnRlbGxpai9JREVBLiBUaGUgZm9sbG93aW5nIHNlY3Rpb24NCi1pcyBub3QgYW4gZW5kb3JzZW1lbnQgb2YgYSBzcGVjaWZpYyBzZXQgb2YgdG9vbHMsIGl0IGlzIHNpbXBseQ0KLW1lYW50IGFzIGEgcG9pbnRlciB0byBlYXNlIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgc3RhcnRlZCB3aXRoDQotQXhpczIgZGV2ZWxvcG1lbnQuPC9wPg0KLTx1bD4NCi08bGk+PHN0cm9uZz5JbnRlbGxpaiBJREVBPC9zdHJvbmc+IC0gdHlwZSA8c3Ryb25nPm12bg0KLWlkZWE6aWRlYTwvc3Ryb25nPi4gR2VuZXJhdGVzIHRoZSBuZWNlc3NhcnkgSURFQSAuaXByLCAuaW1sDQotYW5kIC5pd3MgcHJvamVjdCBmaWxlczwvbGk+DQotPGxpPjxzdHJvbmc+RWNsaXBzZTwvc3Ryb25nPi0gdHlwZSA8c3Ryb25nPm12biBlY2xpcHNlOmVjbGlwc2U8L3N0cm9uZz4uIFRoZW4gaW4gRWNsaXBzZSwgc2V0dXAgYSBDbGFzc3BhdGggVmFyaWFibGUNCi1mb3IgTUFWRU5fUkVQTywgYW5kIHNlbGVjdCBGaWxlICZndDsgSW1wb3J0ICZndDsgRXhpc3RpbmcgUHJvamVjdHMNCi1pbnRvIFdvcmtzcGFjZSAmZ3Q7IFNlbGVjdCByb290IGRpcmVjdG9yeS4gU2VsZWN0aW5nIHRoZSByb290IG9mDQotdGhlIEF4aXMgc291cmNlIGRpc2NvdmVycyBhbGwgdGhlIG1vZHVsZXMgYW5kIGFsbG93cyB0aGVtIHRvIGJlDQotaW1wb3J0ZWQgYXMgaW5kaXZpZHVhbCBwcm9qZWN0cyBhdCBvbmNlLjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdGhhbmtzLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdGhhbmtzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzZmYwNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3RoYW5rcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkb2N1bWVudD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPGF1dGhvciBlbWFpbD0iZGltc0BhcGFjaGUub3JnIj5EYXZhbnVtIFNyaW5pdmFzPC9hdXRob3I+Ci0gICAgPHRpdGxlPlNwZWNpYWwgVGhhbmtzITwvdGl0bGU+Ci0gIDwvcHJvcGVydGllcz4gCi0gIAotICA8Ym9keT4KLQotICAgIDxzZWN0aW9uIG5hbWU9IlNwZWNpYWwgVGhhbmtzIHRvIC4uLiI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+Q29tcGFueTwvdGg+Ci0gICAgICAgICAgICA8dGg+RG9uYXRpb24gVHlwZTwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+PEEgaHJlZj0iaHR0cDovL3d3dy5qZXRicmFpbnMuY29tLyI+PGltZyBoZWlnaHQ9IjUxIiB3aWR0aD0iMjAwIiBzcmM9Imh0dHA6Ly93d3cuamV0YnJhaW5zLmNvbS9pbWcvbG9nb3MvbG9nb19pbnRlbGxpal9pZGVhLmdpZiIvPjwvQT48L3RkPgotICAgICAgICAgICAgPHRkPkxpY2Vuc2VzIGZvciBJREVBPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD48QSBocmVmPSJodHRwOi8vd3d3LnlvdXJraXQuY29tLyI+PGltZyBoZWlnaHQ9IjUxIiB3aWR0aD0iMjAwIiBzcmM9Imh0dHA6Ly9kYi5hcGFjaGUub3JnL29qYi9pbWFnZXMveWpwLmdpZiIvPjwvQT48L3RkPgotICAgICAgICAgICAgPHRkPkxpY2Vuc2VzIGZvciBZb3VyS2l0PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD48QSBocmVmPSJodHRwOi8vd3d3LmVqLXRlY2hub2xvZ2llcy5jb20vcHJvZHVjdHMvanByb2ZpbGVyL292ZXJ2aWV3Lmh0bWwiPjxpbWcgaGVpZ2h0PSI1MSIgd2lkdGg9IjIwMCIgc3JjPSJodHRwOi8vd3d3LmVqLXRlY2hub2xvZ2llcy5jb20vaW1hZ2VzL3Byb2R1Y3RzL2xvZ29fanByb2ZpbGVyMDEuZ2lmIi8+PC9BPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+TGljZW5zZXMgZm9yIEpQcm9maWxlcjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLTx0cj4KLSAgICAgICAgICAgIDx0ZD48QSBocmVmPSJodHRwOi8vd3d3LmFsdG92YS5jb20vIj48aW1nIGhlaWdodD0iNTEiIHdpZHRoPSIyMDAiIHNyYz0iaHR0cDovL3d3dy5hbHRvdmEuY29tL2ltYWdlcy9sb2dvcy9BbHRvdmFfTG9nb19DTVlLLmdpZiIvPjwvQT48L3RkPgotICAgICAgICAgICAgPHRkPkxpY2Vuc2VzIGZvciBBbHRvdmEgWE1MU3B5PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgIDwvc2VjdGlvbj4KLSAgPC9ib2R5PgotPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L0NvZGVnZW5Ub29sUmVmZXJlbmNlLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L0NvZGVnZW5Ub29sUmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3MWM4MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9Db2RlZ2VuVG9vbFJlZmVyZW5jZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NzEgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+Q29kZSBHZW5lcmF0b3IgVG9vbCBHdWlkZSBmb3IgQ29tbWFuZCBMaW5lIGFuZCBBbnQNCi1UYXNrPC90aXRsZT4NCi08bGluayBocmVmPSIuLi8uLi9jc3MvYXhpcy1kb2NzLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPQ0KLSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgLz4NCi08L2hlYWQ+DQotPGJvZHkgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQotPGgxPkNvZGUgR2VuZXJhdG9yIFRvb2wgR3VpZGUgZm9yIENvbW1hbmQgTGluZSBhbmQgQW50IFRhc2s8L2gxPg0KLTxwPlRoZSBDb2RlIEdlbmVyYXRvciB0b29sIGNvbnNpc3RzIG9mIGEgY29tbWFuZCBsaW5lIHZlcnNpb24gYW5kDQotYW4gQW50IFRhc2suIFRoaXMgZG9jdW1lbnQgd2lsbCBsaXN0IHRoZSBjb21tYW5kIGxpbmUgcmVmZXJlbmNlcw0KLWFuZCBBbnQgdGFzayByZWZlcmVuY2VzLiBBbHNvIGluIGRldGFpbCwgdGhpcyBkb2N1bWVudCBzaG93cyBob3cgdG8NCi1idWlsZCBmaWxlIHVzaW5nIGN1c3RvbSBBbnQgdGFzayBhbmQgaW52b2tpbmcgdGhlIENvZGUgR2VuZXJhdG9yDQotZnJvbSBBbnQuPC9wPg0KLTxwPlRoaXMgdG9vbCBpcyBidW5kbGVkIHdpdGggdGhlIDxhIGhyZWY9DQotImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2Rvd25sb2FkLmNnaSI+QXhpczIgQmluYXJ5DQotRGlzdHJpYnV0aW9uPC9hPi48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2NtZGxpbmUiPkNvbW1hbmQgTGluZSBWZXJzaW9uPC9hPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2NtZHJlZiI+T3B0aW9uIFJlZmVyZW5jZTwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2FudCI+QW50IFRhc2s8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjYW50cmVmIj5BbnQgVGFzayBSZWZlcmVuY2U8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2V4YW1wbGUiPkV4YW1wbGUgQnVpbGQgRmlsZSBVc2luZyB0aGUgQ3VzdG9tIEFudA0KLVRhc2s8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2ludm9raW5nIj5JbnZva2luZyB0aGUgQ29kZSBHZW5lcmF0b3IgRnJvbQ0KLUFudDwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08bGk+PGEgaHJlZj0iI2FwcGVuZGl4Ij5BcHBlbmRpeDwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iaW50cm8iIGlkPSJpbnRybyI+PC9hPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPlRoaXMgYmFzaWMgdG9vbCBpcyBpbXBsZW1lbnRlZCBieSB0aGUgV1NETDJDb2RlIGNsYXNzIGFuZCBqdXN0DQotZm9yIHRoZSBjb252ZW5pZW5jZSBpbiB0aGUgY2FzZSBvZiBKYXZhICh3aGljaCB3b3VsZCBiZSB0aGUNCi1tYWpvcml0eSkgdGhlcmUgaXMgYW5vdGhlciBXU0RMMkphdmEgY2xhc3MuIE9uZSBjYW4gY2hvb3NlIHRvIHJ1bg0KLXRoZSBtYWluIGNsYXNzZXMgZGlyZWN0bHkgb3IgdXNlIG9uZSBvZiB0aGUgc2NyaXB0cyB0byBydW4gdGhlDQotV1NETDJDb2RlIGFuZCBXU0RMMkphdmEgYXBwcm9wcmlhdGVseS4gKHRoZSBzY3JpcHRzIGFyZSBmb3VuZCBpbg0KLXRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSA8YSBocmVmPQ0KLSIuLi8uLi9kb3dubG9hZC8xXzEvZG93bmxvYWQuaHRtbCNzdGQtYmluIj5TdGFuZGFyZCBCaW5hcnkNCi1EaXN0cmlidXRpb248L2E+KTwvcD4NCi08YSBuYW1lPSJjbWRsaW5lIiBpZD0iY21kbGluZSI+PC9hPg0KLTxoMj5Db21tYW5kIExpbmUgVmVyc2lvbjwvaDI+DQotPHA+Rm9yIHRob3NlIHVzZXJzIHdobyB3aXNoIHRvIHVzZSB0aGUgY29tbWFuZCBsaW5lIHZlcnNpb24gb2YgdGhlDQotdG9vbCwgdGhpcyBzZWN0aW9uIHdpbGwgYmUgb2YgdmFsdWUuPC9wPg0KLTxhIG5hbWU9ImNtZHJlZiIgaWQ9ImNtZHJlZiI+PC9hPg0KLTxoMz5PcHRpb24gUmVmZXJlbmNlPC9oMz4NCi08cD5Vc2FnZSBXU0RMMkNvZGUgJmx0O29wdGlvbl9yZWZlcmVuY2UmZ3Q7PC9wPg0KLTxwPjxiPkUuZy4gOi0gV1NETDJDb2RlIC11cmkgJmx0O0xvY2F0aW9uIG9mIFdTREwmZ3Q7PC9iPjwvcD4NCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHN0eWxlPQ0KLSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlIiB3aWR0aD0iMTAwJSIgaWQ9IkF1dG9OdW1iZXIxIj4NCi08dGJvZHk+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj48c3Ryb25nPlNob3J0IE9wdGlvbjwvc3Ryb25nPjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPjxzdHJvbmc+TG9uZyBPcHRpb248L3N0cm9uZz48L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXVyaSAmbHQ7TG9jYXRpb24gb2YgV1NETCZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj5Ob25lPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+V1NETCBmaWxlIGxvY2F0aW9uLiBUaGlzIHNob3VsZCBwb2ludCB0byBhIFdTREwNCi1maWxlIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tbyAmbHQ7b3V0cHV0IExvY2F0aW9uJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tb3V0cHV0ICZsdDtvdXRwdXQgTG9jYXRpb24mZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+T3V0cHV0IGZpbGUgbG9jYXRpb24uIFRoaXMgaXMgd2hlcmUgdGhlIGZpbGVzIHdvdWxkDQotYmUgY29waWVkIG9uY2UgdGhlIGNvZGUgZ2VuZXJhdGlvbiBpcyBkb25lLiBJZiB0aGlzIG9wdGlvbiBpcw0KLW9taXR0ZWQgdGhlIGdlbmVyYXRlZCBmaWxlcyB3b3VsZCBiZSBjb3BpZWQgdG8gdGhlIHdvcmtpbmcNCi1kaXJlY3RvcnkuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWwgJmx0O2xhbmd1YWdlJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tbGFuZ3VhZ2UgJmx0O2xhbmd1YWdlJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPk91dHB1dCBsYW5ndWFnZS4gQ3VycmVudGx5IHRoZSBjb2RlIGdlbmVyYXRvciBjYW4NCi1nZW5lcmF0ZSBjb2RlIGluIEphdmEgYnV0IGl0IGhhcyB0aGUgYWJpbGl0eSB0byBiZSBleHRlbmRlZCB0bw0KLXN1cHBvcnQgb3RoZXIgbGFuZ3VhZ2VzLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1wICZsdDtwYWNrYWdlIG5hbWUmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1wYWNrYWdlICZsdDtwYWNrYWdlIG5hbWUmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+VGhlIHRhcmdldCBwYWNrYWdlIG5hbWUuIElmIG9taXR0ZWQsIGEgZGVmYXVsdA0KLXBhY2thZ2UgKGZvcm1lZCB1c2luZyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgV1NETCkgd2lsbCBiZQ0KLXVzZWQuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWE8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLWFzeW5jPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGUgY29kZSBvbmx5IGZvciBhc3luYyBzdHlsZS4gV2hlbiB0aGlzDQotb3B0aW9uIGlzIHVzZWQgdGhlIGdlbmVyYXRlZCBzdHVicyB3aWxsIGhhdmUgb25seSB0aGUgYXN5bmNocm9ub3VzDQotaW52b2NhdGlvbiBtZXRob2RzLiBTd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdC48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tczwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tc3luYzwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlIGNvZGUgb25seSBmb3Igc3luYyBzdHlsZSAuIFdoZW4gdGhpcw0KLW9wdGlvbiBpcyB1c2VkIHRoZSBnZW5lcmF0ZWQgc3R1YnMgd2lsbCBoYXZlIG9ubHkgdGhlIHN5bmNocm9ub3VzDQotaW52b2NhdGlvbiBtZXRob2RzLiBTd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdC4gV2hlbiB1c2VkIHdpdGggdGhlIC1hDQotb3B0aW9uLCB0aGlzIHRha2VzIHByZWNlZGVuY2UuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXQ8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXRlc3QtY2FzZTwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlcyBhIHRlc3QgY2FzZS4gSW4gdGhlIGNhc2Ugb2YgSmF2YSBpdCB3b3VsZA0KLWJlIGEgSlVuaXQgdGVzdCBjYXNlLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1zczwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tc2VydmVyLXNpZGU8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5HZW5lcmF0ZXMgc2VydmVyIHNpZGUgY29kZSAoaS5lLiBza2VsZXRvbnMpLg0KLURlZmF1bHQgaXMgb2ZmLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1zZDwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tc2VydmljZS1kZXNjcmlwdGlvbjwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlcyB0aGUgc2VydmljZSBkZXNjcmlwdG9yIChpLmUuIHNlcnZlci54bWwpLg0KLURlZmF1bHQgaXMgb2ZmLiBPbmx5IHZhbGlkIHdpdGggLXNzLCB0aGUgc2VydmVyIHNpZGUgY29kZQ0KLWdlbmVyYXRpb24gb3B0aW9uLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1kICZsdDtkYXRhYmluZGluZyZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLWRhdGFiaW5kaW5nLW1ldGhvZCAmbHQ7ZGF0YWJpbmRpbmcmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+U3BlY2lmaWVzIHRoZSBEYXRhYmluZGluZyBmcmFtZXdvcmsuIFZhbGlkIHZhbHVlcw0KLWFyZSB4bWxiZWFucywgYWRiLCBqaWJ4LCBhbmQgbm9uZS4gRGVmYXVsdCBpcyBhZGIuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWc8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLWdlbmVyYXRlLWFsbDwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlcyBhbGwgdGhlIGNsYXNzZXMuIFRoaXMgb3B0aW9uIGlzIHZhbGlkDQotb25seSB3aXRoIHRoZSAtc3MgKHNlcnZlciBzaWRlIGNvZGUgZ2VuZXJhdGlvbikgb3B0aW9uLiBXaGVuIG9uLA0KLXRoZSBjbGllbnQgY29kZSAoc3R1YnMpIHdpbGwgYWxzbyBiZSBnZW5lcmF0ZWQgYWxvbmcgd2l0aCB0aGUNCi1za2VsZXRvbi48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tdTwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tdW5wYWNrLWNsYXNzZXM8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5VbnBhY2sgY2xhc3Nlcy4gVGhpcyBvcHRpb24gc3BlY2lmaWVzIHdoZXRoZXIgdG8NCi11bnBhY2sgdGhlIGNsYXNzZXMgYW5kIGdlbmVyYXRlIHNlcGFyYXRlIGNsYXNzZXMgZm9yIHRoZQ0KLWRhdGFiaW5kZXJzLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1zbiAmbHQ7c2VydmljZSBuYW1lJmd0OzwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tc2VydmljZS1uYW1lICZsdDtzZXJ2aWNlIG5hbWUmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+U3BlY2lmaWVzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gYmUgY29kZSBnZW5lcmF0ZWQuIElmDQotdGhlIHNlcnZpY2UgbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBmaXJzdCBzZXJ2aWNlIHdpbGwgYmUNCi1waWNrZWQuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXBuICZsdDtwb3J0IG5hbWUmZ3Q7PC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1wb3J0LW5hbWUgJmx0O3BvcnQgbmFtZSZndDs8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5TcGVjaWZpZXMgdGhlIHBvcnQgbmFtZSB0byBiZSBjb2RlIGdlbmVyYXRlZC4gSWYNCi10aGUgcG9ydCBuYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGZpcnN0IHBvcnQgKG9mIHRoZQ0KLXNlbGVjdGVkIHNlcnZpY2UpIHdpbGwgYmUgcGlja2VkLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1uczJwPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1uYW1lc3BhY2UycGFja2FnZTwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPlNwZWNpZmllcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzcGFjZXMgYW5kDQotcGFja2FnZXMgd2hlcmUgdGhlIGdpdmVuIHBhY2thZ2Ugd2lsbCBiZSB1c2VkIGluIHRoZSBwbGFjZSBvZiB0aGUNCi1hdXRvIGdlbmVyYXRlZCBwYWNrYWdlIGZvciB0aGUgcmVsZXZhbnQgbmFtZXNwYWNlLiBUaGUgbGlzdCB3aWxsIGJlDQotdGhlIGZvcm1hdCBvZiBuczE9cGtnMSxuczI9cGtnMi48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tc3NpPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1zZXJ2ZXJzaWRlLWludGVyZmFjZTwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UNCi1za2VsZXRvbi48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4td3Y8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXdzZGwtdmVyc2lvbjwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPldTREwgVmVyc2lvbi4gVmFsaWQgT3B0aW9ucyA6IDIsIDIuMCwgMS4xPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LVM8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXNvdXJjZS1mb2xkZXI8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5TcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCBzb3VyY2U8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tUjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tcmVzb3VyY2UtZm9sZGVyPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+U3BlY2lmeSBhIGRpcmVjdG9yeSBwYXRoIGZvciBnZW5lcmF0ZWQgcmVzb3VyY2VzPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWVtPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1leHRlcm5hbC1tYXBwaW5nPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+U3BlY2lmeSBhbiBleHRlcm5hbCBtYXBwaW5nIGZpbGU8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tZjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tZmxhdHRlbi1maWxlczwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkZsYXR0ZW5zIHRoZSBnZW5lcmF0ZWQgZmlsZXM8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tdXc8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLXVud3JhcC1wYXJhbXM8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5Td2l0Y2ggb24gdW4td3JhcHBpbmc8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4teHNkY29uZmlnPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+PC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+VXNlIFhNTEJlYW5zIC54c2Rjb25maWcgZmlsZS4gVmFsaWQgb25seSB3aXRoIC1kIHhtbGJlYW5zPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LWFwPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1hbGwtcG9ydHM8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5HZW5lcmF0ZSBjb2RlIGZvciBhbGwgcG9ydHM8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj4tb3I8L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLW92ZXItcmlkZTwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPk92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY2xhc3NlczwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPi1iPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1iYWNrd29yZC1jb21wYXRpYmxlPC90ZD4NCi08dGQgd2lkdGg9IjYwJSI+R2VuZXJhdGUgQXhpcyAxLnggYmFja3dvcmQgY29tcGF0aWJsZSBjb2RlPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQgd2lkdGg9IjIwJSI+LXNwPC90ZD4NCi08dGQgd2lkdGg9IjIwJSI+LS1zdXBwcmVzcy1wcmVmaXhlczwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPlN1cHByZXNzIG5hbWVzcGFjZSBwcmVmaXhlcyAoT3B0aW16YXRpb24gdGhhdCByZWR1Y2VzIHNpemUgb2Ygc29hcCByZXF1ZXN0L3Jlc3BvbnNlKTwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tbm9CdWlsZFhNTDwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkRvbid0IGdlbmVyYXRlIHRoZSBidWlsZC54bWwgaW4gdGhlIG91dHB1dCBkaXJlY3Rvcnk8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZCB3aWR0aD0iMjAlIj48L3RkPg0KLTx0ZCB3aWR0aD0iMjAlIj4tLW5vV1NETDwvdGQ+DQotPHRkIHdpZHRoPSI2MCUiPkRvbid0IGdlbmVyYXRlIFdTREwncyBpbiB0aGUgcmVzb3VyY2VzIGRpcmVjdG9yeTwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkIHdpZHRoPSIyMCUiPjwvdGQ+DQotPHRkIHdpZHRoPSIyMCUiPi0tbm9NZXNzYWdlUmVjZWl2ZXI8L3RkPg0KLTx0ZCB3aWR0aD0iNjAlIj5Eb24ndCBnZW5lcmF0ZSBhIE1lc3NhZ2VSZWNlaXZlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXM8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxwPkFwYXJ0IGZyb20gdGhlc2UgbWVudGlvbmVkIG9wdGlvbnMgb25lIGNhbiBwYXNzIGV4dHJhIG9wdGlvbnMgYnkNCi1wcmVmaXhpbmcgdGhlbSB3aXRoIC1FICh1cHBlcmNhc2UpLiBUaGVzZSBleHRyYSBvcHRpb25zIHdpbGwgYmUNCi1wcm9jZXNzZWQgYnkgdGhlIGV4dGVuc2lvbnMuIFRoZSBleHRyYSBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZA0KLWFyZSBkb2N1bWVudGVkIHNlcGFyYXRlbHkgd2l0aCB0aGUgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uIChGb3INCi1leGFtcGxlIHdpdGggQURCKS48L3A+DQotPGEgbmFtZT0iYW50IiBpZD0iYW50Ij48L2E+DQotPGgyPkFudCBUYXNrPC9oMj4NCi08cD5UaGUgY29kZSBnZW5lcmF0b3IgYWxzbyBjb21lcyBidW5kbGVkIHdpdGggYW4gQW50IHRhc2suIFRoZSBhbnQNCi10YXNrIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50LkFudENvZGVnZW5UYXNrDQotY2xhc3MuIEZvbGxvd2luZyBhcmUgdGhlIGFudCB0YXNrIGF0dHJpYnV0ZXMuPC9wPg0KLTxhIG5hbWU9ImFudHJlZiIgaWQ9ImFudHJlZiI+PC9hPg0KLTxoMz5BbnQgVGFzayBSZWZlcmVuY2U8L2gzPg0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgc3R5bGU9DQotImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UiIHdpZHRoPSIxMDAlIiBpZD0iQXV0b051bWJlcjIiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPndzZGxmaWxlbmFtZTwvdGQ+DQotPHRkPldTREwgZmlsZSBsb2NhdGlvbi4gTWFwcyB0byB0aGUgLXVyaSBvcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZQ0KLXRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+b3V0cHV0PC90ZD4NCi08dGQ+T3V0cHV0IGZpbGUgbG9jYXRpb24uIFRoaXMgaXMgd2hlcmUgdGhlIGZpbGVzIHdvdWxkIGJlIGNvcGllZA0KLW9uY2UgdGhlIGNvZGUgZ2VuZXJhdGlvbiBpcyBkb25lLiBJZiB0aGlzIG9wdGlvbiBpcyBvbWl0dGVkIHRoZQ0KLWdlbmVyYXRlZCBmaWxlcyB3b3VsZCBiZSBjb3BpZWQgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBNYXBzIHRvDQotdGhlIC1vIG9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+bGFuZ3VhZ2U8L3RkPg0KLTx0ZD5PdXRwdXQgbGFuZ3VhZ2UuIEN1cnJlbnRseSB0aGUgY29kZSBnZW5lcmF0b3IgY2FuIGdlbmVyYXRlIGNvZGUNCi1pbiBKYXZhLiBNYXBzIHRvIHRoZSAtbCBvcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnBhY2thZ2VOYW1lPC90ZD4NCi08dGQ+VGhlIHRhcmdldCBwYWNrYWdlIG5hbWUuIElmIG9taXR0ZWQsIGEgZGVmYXVsdCBwYWNrYWdlIChmb3JtZWQNCi11c2luZyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgV1NETCkgd2lsbCBiZSB1c2VkLiBNYXBzIHRvIHRoZQ0KLS1wIG9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+ZGF0YWJpbmRpbmdOYW1lPC90ZD4NCi08dGQ+RGF0YSBiaW5kaW5nIGZyYW1ld29yayBuYW1lLiBNYXBzIHRvIHRoZSAtZCBvcHRpb24gb2YgdGhlDQotY29tbWFuZCBsaW5lIHRvb2wuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlICJhZGIiLCAieG1sYmVhbnMiLA0KLSJqaWJ4Ii48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5zZXJ2aWNlTmFtZTwvdGQ+DQotPHRkPlRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluIHRoZSBjYXNlIG9mIG11bHRpcGxlIHNlcnZpY2VzLiBNYXBzDQotdG8gLXNuIG9wdGlvbnMgb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnBvcnROYW1lPC90ZD4NCi08dGQ+VGhlIG5hbWUgb2YgdGhlIHBvcnQgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIHBvcnRzLiBNYXBzIHRvDQotLXBuIG9wdGlvbnMgb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmFzeW5jT25seTwvdGQ+DQotPHRkPkdlbmVyYXRlIGNvZGUgb25seSBmb3IgYXN5bmMgc3R5bGUuIFdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZA0KLXRoZSBnZW5lcmF0ZWQgc3R1YnMgd2lsbCBoYXZlIG9ubHkgdGhlIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uDQotbWV0aG9kcy4gRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC4gT25seSB0cnVlIGFuZCBmYWxzZSBhcmUNCi1hcHBsaWNhYmxlIGFzIHZhbHVlcy4gTWFwcyB0byB0aGUgLWEgb3B0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUNCi10b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnN5bmNPbmx5PC90ZD4NCi08dGQ+R2VuZXJhdGUgY29kZSBvbmx5IGZvciBzeW5jIHN0eWxlLiBXaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQgdGhlDQotZ2VuZXJhdGVkIHN0dWJzIHdpbGwgaGF2ZSBvbmx5IHRoZSBzeW5jaHJvbm91cyBpbnZvY2F0aW9uIG1ldGhvZHMuDQotRGVmYXVsdHMgdG8gZmFsc2UgaWYgb21pdHRlZC4gT25seSB0cnVlIGFuZCBmYWxzZSBhcmUgYXBwbGljYWJsZSBhcw0KLXZhbHVlcy4gTWFwcyB0byB0aGUgLXMgb3B0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5zZXJ2ZXJTaWRlPC90ZD4NCi08dGQ+R2VuZXJhdGVzIHNlcnZlciBzaWRlIGNvZGUgKGkuZS4gc2tlbGV0b25zKS4gT25seSB0cnVlIGFuZA0KLWZhbHNlIGFyZSBhcHBsaWNhYmxlIGFzIHZhbHVlcy4gRGVmYXVsdCBpcyBmYWxzZS4gTWFwcyB0byB0aGUgLXNzDQotb3B0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD50ZXN0Y2FzZTwvdGQ+DQotPHRkPkdlbmVyYXRlcyBhIHRlc3QgY2FzZS4gUG9zc2libGUgdmFsdWVzIGFyZSB0cnVlIGFuZCBmYWxzZS4gTWFwcw0KLXRvIHRoZSAtdCBvcHRpb25zIG9mIHRoZSBjb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5nZW5lcmF0ZVNlcnZpY2VYbWw8L3RkPg0KLTx0ZD5HZW5lcmF0ZXMgc2VydmVyIHNpZGUgY29kZSAoaS5lLiBza2VsZXRvbnMpLiBPbmx5IHRydWUgYW5kDQotZmFsc2UgYXJlIGFwcGxpY2FibGUgYXMgdmFsdWVzLiBEZWZhdWx0IGlzIGZhbHNlLiBNYXBzIHRvIHRoZSAtc2QNCi1vcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnVucGFja0NsYXNzZXM8L3RkPg0KLTx0ZD5VbnBhY2tzIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4gVGhpcyBmb3JjZXMgdGhlIGRhdGFiaW5kaW5nDQotY2xhc3NlcyB0byBiZSBnZW5lcmF0ZWQgc2VwYXJhdGVseSwgd2hpY2ggb3RoZXJ3aXNlIHdvdWxkIGhhdmUgYmVlbg0KLWdlbmVyYXRlZCBhcyBpbm5lciBjbGFzc2VzLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmdlbmVyYXRlQWxsQ2xhc3NlczwvdGQ+DQotPHRkPkdlbmVyYXRlcyBhbGwgdGhlIGNsYXNzZXMgaW5jbHVkaW5nIGNsaWVudCBhbmQgc2VydmVyIHNpZGUNCi1jb2RlLiBNYXBzIHRvIHRoZSAtZyBvcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPm5hbWVzcGFjZVRvUGFja2FnZXM8L3RkPg0KLTx0ZD5BIGxpc3Qgb2YgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZ3MuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c2VydmVyU2lkZUludGVyZmFjZTwvdGQ+DQotPHRkPkZsYWcgc3RhdGluZyB3aGV0aGVyIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgdGhlIHNlcnZlcg0KLXNpZGUgc2tlbGV0b24uPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+cmVwb3NpdG9yeVBhdGg8L3RkPg0KLTx0ZD5TZXRzIHRoZSByZXBvc2l0b3J5IHBhdGggdG8gYmUgdXNlZC4gTWFwcyB0byB0aGUgLXIgb3B0aW9uIG9mDQotdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPndzZGxWZXJzaW9uPC90ZD4NCi08dGQ+U2V0cyB0aGUgdmVyc2lvbiBvZiB0aGUgd3NkbCB0aGF0IGlzIGJlaW5nIHVzZWQgZHVyaW5nDQotY29kZWdlbmVyYXRpb24uIFRoaXMgZGVhZnVsdHMgdG8gMS4xIGFuZCBvbmUgY2FuIHNldCB0aGlzIHRvIDIsDQotd2hlbiB0cnlpbmcgdG8gd29yayB3aXRoIGEgV1NETCAyLjAgZG9jdW1lbnQuIE1hcHMgdG8gdGhlIC13dg0KLW9wdGlvbiBvZiB0aGUgY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+ZXh0ZXJuYWxNYXBwaW5nPC90ZD4NCi08dGQ+TG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIG1hcHBpbmcgZmlsZSB0byBiZSB1c2VkLiBNYXBzIHRvIHRoZQ0KLS1lbSBvcHRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uPC90ZD4NCi08dGQ+UmF0aGVyIHRoYW4gZHVtcGluZyBhbGwgdGhlIGNvZGUgaW4gdGhlIHNhbWUgbG9jYXRpb24sIG9uZSBoYXMNCi10aGUgb3B0aW9uIHRvIG1ha2UgdGhlIHNvdXJjZXMgdG8gYmUgZ2VuZXJhdGVkIGluIGEgZGlmZmVyZW50DQotbG9jYXRpb24sIGdpdmVuIHVzaW5nIHRoaXMgb3B0aW9uLiBNYXBzIHRvIHRoZSAtUyBvcHRpb24gb2YgdGhlDQotY29tbWFuZCBsaW5lIHRvb2wuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb248L3RkPg0KLTx0ZD5SYXRoZXIgdGhhbiBkdW1waW5nIGFsbCB0aGUgY29kZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiwgb25lIGhhcw0KLXRoZSBvcHRpb24gdG8gbWFrZSB0aGUgcmVzb3VyY2VzIHRvIGJlIGdlbmVyYXRlZCBpbiBhIGRpZmZlcmVudA0KLWxvY2F0aW9uLCBnaXZlbiB1c2luZyB0aGlzIG9wdGlvbi4gTWFwcyB0byB0aGUgLVIgb3B0aW9uIG9mIHRoZQ0KLWNvbW1hbmQgbGluZSB0b29sLjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnVud3JhcDwvdGQ+DQotPHRkPlRoaXMgd2lsbCBzZWxlY3QgYmV0d2VlbiB3cmFwcGVkIGFuZCB1bndyYXBwZWQgZHVyaW5nIGNvZGUNCi1nZW5lcmF0aW9uLiBEZWZhdWx0IGlzIHNldCB0byBmYWxzZS4gTWFwcyB0byB0aGUgLXV3IG9wdGlvbiBvZiB0aGUNCi1jb21tYW5kIGxpbmUgdG9vbC48L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTxhIG5hbWU9ImV4YW1wbGUiIGlkPSJleGFtcGxlIj48L2E+DQotPGgzPkV4YW1wbGUgQnVpbGQgRmlsZSBVc2luZyB0aGUgQ3VzdG9tIEFudCBUYXNrPC9oMz4NCi08cD5Gb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBhbnQgYnVpbGQgZmlsZSB0aGF0IHVzZXMgdGhlIGN1c3RvbSBBbnQNCi10YXNrLiBZb3UgY2FuIHVzZSBhbnkgd3NkbCBmaWxlIHRvIHRlc3QgdGhlIGV4YW1wbGUuIFJlcGxhY2UgdGhlDQotIkNvbWJpbmVkU2VydmljZS53c2RsIiB3aXRoIHRoZSBuYW1lIG9mIHlvdXIgd3NkbCBmaWxlIGluIHRoZQ0KLWZvbGxvd2luZyBzY3JpcHQuPC9wPg0KLTxwcmU+DQotMSAmbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsNCi0gICAgMiAmbHQ7cHJvamVjdCBuYW1lPSJDb2RlZ2VuRXhhbXBsZSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiImZ3Q7DQotICAgIDMNCi0gICAgNCAmbHQ7cGF0aCBpZD0iZXhhbXBsZS5jbGFzc3BhdGgiJmd0Ow0KLSAgICA1ICZsdDtmaWxlc2V0IGRpcj0iY2xhc3NlcyImZ3Q7DQotICAgIDYgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8mZ3Q7DQotICAgIDcgJmx0Oy9maWxlc2V0Jmd0Ow0KLSAgICA4ICZsdDsvcGF0aCZndDsNCi0gICAgOQ0KLSAgICAxMCAmbHQ7dGFyZ2V0IG5hbWU9ImRlY2xhcmUiICZndDsNCi0gICAgMTEgJmx0O3Rhc2tkZWYgbmFtZT0iY29kZWdlbiINCi0gICAgMTIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50LkFudENvZGVnZW5UYXNrIg0KLSAgICAxMyBjbGFzc3BhdGhyZWY9ImV4YW1wbGUuY2xhc3NwYXRoIi8mZ3Q7DQotICAgIDE1ICZsdDsvdGFyZ2V0Jmd0Ow0KLSAgICAxNg0KLSAgICAxNyAmbHQ7dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImRlY2xhcmUiJmd0Ow0KLSAgICAxOCAmbHQ7Y29kZWdlbg0KLSAgICAxOSB3c2RsZmlsZW5hbWU9IkM6XHRlc3Rcd3NkbFxDb21iaW5lZFNlcnZpY2Uud3NkbCINCi0gICAgMjAgb3V0cHV0PSJDOlxvdXRwdXQiDQotICAgIDIxIHNlcnZlcnNpZGU9InRydWUiDQotICAgIDIyIGdlbmVyYXRlc2VydmljZXhtbD0idHJ1ZSIvJmd0Ow0KLSAgICAyMyAmbHQ7L3RhcmdldCZndDsNCi0gICAgMjQNCi0gICAgMjUgJmx0Oy9wcm9qZWN0Jmd0Ow0KLTwvcHJlPg0KLTxwPkluIHRoZSBhYm92ZSBidWlsZCBzY3JpcHQsIGZyb20gbGluZSA0IHRvIDggaXQgc2V0cyB0aGUNCi1jbGFzc3BhdGggYW5kIGluY2x1ZGVzIGFsbCB0aGUgLmphciBmaWxlcyAod2hpY2ggYXJlIGxpc3RlZCBiZWxvdykNCi1pbnRvIHRoZSBjbGFzc3BhdGguIEZyb20gbGluZSAxMCB0byAxNSBpdCBjcmVhdGVzIGEgdGFyZ2V0IHRvDQotZGVjbGFyZSBhIHRhc2sgY2FsbGVkICJjb2RlZ2VuIiBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgY2xhc3MNCi0ob3JnLmFwYWNoZS5heGlzMi50b29sLmFudC5BbnRDb2RlZ2VuVGFzaykgd2l0aGluIHRoZSBjbGFzc3BhdGggaW4NCi1saW5lIDEyLiBGcm9tIGxpbmUgMTcgdG8gMjMgaXQgY3JlYXRlcyB0aGUgIm1haW4iIHRhcmdldCB0bw0KLWdlbmVyYXRlIHRoZSBjb2RlIGZyb20gdGhlIGdpdmVuIHdzZGwuIFRoZXJlIGFyZSBzb21lIGFyZ3VtZW50cyBzZXQNCi1mb3JtIGxpbmUgMTkgdG8gMjIuIEhlcmUgaW4gbGluZSAxOSBpdCBzZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUNCi13c2RsLiBJbiBsaW5lIDIwIGl0IHNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvZGUgaXMNCi1nZW5lcmF0ZWQuIExpbmUgMjEgaW5kaWNhdGVzIHRoYXQgdGhpcyBidWlsZCBnZW5lcmF0ZXMgdGhlIHNlcnZlcg0KLXNpZGUgY29kZShza2VsZXRvbikgYW5kIGxpbmUgMjIgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZpY2VzLnhtbCBpcw0KLWFsc28gZ2VuZXJhdGVkLjwvcD4NCi08cD5Ob3RpY2UgdGhlIG1haW4gdGFyZ2V0IHRoYXQgdXNlcyB0aGUgImNvZGVnZW4iIHRhc2sgd2hpY2ggd2lsbA0KLXVzZSB0aGUgb3JnLmFwYWNoZS5heGlzMi50b29sLmFudC5BbnRDb2RlZ2VuVGFzayBjbGFzcyBhbmQgcnVuIHRoZQ0KLWNvZGUgZ2VuZXJhdGlvbiB0b29sIGludGVybmFsbHkgd2hpbGUgcGFzc2luZyB0aGUgcmVsZXZhbnQNCi1hcmd1bWVudHMgYW5kIGRvIHRoZSBwcm9wZXIgZ2VuZXJhdGlvbi4gSWYgYSB1c2VyIHR5cGVzPC9wPg0KLTxwPjxjb2RlPiZndDthbnQ8L2NvZGU+IG9yIDxjb2RlPiZndDthbnQgbWFpbjwvY29kZT48L3A+DQotPHA+aXQgd2lsbCBnZW5lcmF0ZSB0aGUgc2VydmVyIHNpZGUgY29kZSBhbmQgc2VydmljZXMueG1sIGZvciB0aGUNCi1naXZlbiBXU0RMIGZpbGUgKEM6XHRlc3Rcd3NkbFxDb21iaW5lZFNlcnZpY2Uud3NkbCAtaW4gdGhlIGFib3ZlDQotaW5zdGFuY2UpIGFuZCB0aGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQNCi1vdXRwdXQgcGF0aCAoQzpcb3V0cHV0IC0gaW4gdGhlIGFib3ZlIGluc3RhbmNlKS48L3A+DQotPHA+Rm9yIHRoaXMgQW50IHRhc2sgdG8gd29yayB0aGUgZm9sbG93aW5nIGphcnMgbmVlZCB0byBiZSBpbiB0aGUNCi1jbGFzcyBwYXRoLjwvcD4NCi08dWw+DQotPGxpPmF4aXMyLSouamFyIChmcm9tIHRoZSBBeGlzMiBkaXN0cmlidXRpb24pPC9saT4NCi08bGk+d3NkbDRqLTEuNi4yLmphciBvciBoaWdoZXIgKFRoZSBXU0RMNEogaW1wbGVtZW50YXRpb24gamFyLg0KLUJ1bmRsZWQgd2l0aCB0aGUgQXhpczIgZGlzdHJpYnV0aW9uKTwvbGk+DQotPGxpPnN0YXgtYXBpLTEuMC4xLmphciAoVGhlIFN0QVggQVBJJ3MgdGhhdCBjb250YWluIHRoZQ0KLWphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgY2xhc3MuIFRoaXMgamFyIG1heSBiZSByZXBsYWNlZCBieSBhbnkNCi1vdGhlciBqYXIgdGhhdCBjb250YWlucyB0aGUgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQ0KLWltcGxlbWVudGF0aW9uLiBIb3dldmVyIEF4aXMyIHVzZXMgdGhpcyBjbGFzcyBmcm9tIHRoZQ0KLXN0YXgtYXBpLTEuMC4xLmphciB3aGljaCBjb21lcyBidW5kbGVkIHdpdGggdGhlIEF4aXMyDQotZGlzdHJpYnV0aW9uKTwvbGk+DQotPGxpPmNvbW1vbnMtbG9nZ2luZy0xLjEuamFyLCBuZWV0aGktMi4wLmphciBhbmQgWG1sU2NoZW1hLTEuMi5qYXINCi0oZnJvbSB0aGUgQXhpczIgZGlzdHJpYnV0aW9uKTwvbGk+DQotPGxpPmF4aW9tLWFwaS0xLjIuMS5qYXIgYW5kIGF4aW9tLWltcGwtMS4yLjEuamFyIChmcm9tIHRoZSBBeGlzMg0KLWRpc3RyaWJ1dGlvbik8L2xpPg0KLTxsaT5hY3RpdmF0aW9uLTEuMS5qYXIgKGZyb20gdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbik8L2xpPg0KLTxsaT53c3R4LWFzbC0zLjEuMC5qYXIgKGZyb20gdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbik8L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iaW52b2tpbmciIGlkPSJpbnZva2luZyI+PC9hPg0KLTxoMz5JbnZva2luZyB0aGUgQ29kZSBHZW5lcmF0b3IgRnJvbSBBbnQ8L2gzPg0KLTxwPlNpbmNlIHRoZSB1c2VycyBtYXkgZmluZCBhbHRlcmluZyB0aGVpciBhbnQgY2xhc3MgcGF0aCBhIGJpdA0KLWRhdW50aW5nIHRoZXkgY2FuIGFsc28gZm9sbG93IGFuIGVhc2llciB0ZWNobmlxdWUuIFRoZSBjb2RlDQotZ2VuZXJhdG9yIG1haW4gY2xhc3MgY2FuIGJlIGludm9rZWQgZGlyZWN0bHkgdGhyb3VnaCB0aGUgYnVpbGQNCi1maWxlLjwvcD4NCi08cD5CZWxvdyBpcyBhbiBleGFtcGxlIG9mIGEgZnVsbCBidWlsZC54bWwgbmVlZGVkIHRvIHJ1biBXU0RMMkphdmENCi1hbmQgZ2VuZXJhdGUgdGhlIEphdmEgc291cmNlIGZpbGVzLCBjb21waWxlIHRoZSBzb3VyY2VzLCBhbmQgYnVpbGQNCi1hbiBBQVIgZmlsZSByZWFkeSBmb3IgZGVwbG95bWVudCAoVGhlc2UgYXJlIGRvbmUgb25lIGJ5IG9uZSwgYnkNCi1jYWxsaW5nIHRoZSB0YXJnZXRzIGluIHRoZSBidWlsZCBmaWxlIHNlcGFyYXRlbHkpOjwvcD4NCi08cHJlIGNsYXNzPSJjb2RlIj4NCi0mbHQ7IURPQ1RZUEUgcHJvamVjdCZndDsNCi0NCi0mbHQ7cHJvamVjdCBuYW1lPSJ3c2RsMmphdmEtZXhhbXBsZSIgZGVmYXVsdD0idXNhZ2UiIGJhc2VkaXI9Ii4iJmd0Ow0KLQ0KLSZsdDtwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LW5hbWUiIHZhbHVlPSJ3c2RsMmphdmEtZXhhbXBsZSIvJmd0Ow0KLSZsdDtwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8mZ3Q7DQotDQotJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkIiB2YWx1ZT0iYnVpbGQiLyZndDsNCi0mbHQ7cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0ic3JjIi8mZ3Q7DQotJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIHZhbHVlPSJidWlsZC9jbGFzc2VzIiAvJmd0Ow0KLQ0KLSZsdDtwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCImZ3Q7DQotJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzIiAvJmd0Ow0KLSZsdDtmaWxlc2V0IGRpcj0iJHtheGlzLmhvbWV9L2xpYiImZ3Q7DQotJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8mZ3Q7DQotJmx0Oy9maWxlc2V0Jmd0Ow0KLSZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIgLyZndDsNCi0mbHQ7L3BhdGgmZ3Q7DQotDQotJmx0O3BhdGggaWQ9ImF4aXNfY2xpZW50LmNsYXNzcGF0aCImZ3Q7DQotJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9jbGFzc2VzIiAvJmd0Ow0KLSZsdDtmaWxlc2V0IGRpcj0iJHtheGlzLmhvbWV9IiZndDsNCi0mbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLyZndDsNCi0mbHQ7L2ZpbGVzZXQmZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSJsaWIiJmd0Ow0KLSZsdDtpbmNsdWRlIG5hbWU9IiouamFyIiAvJmd0Ow0KLSZsdDsvZmlsZXNldCZndDsNCi0mbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlc30iIC8mZ3Q7DQotJmx0Oy9wYXRoJmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0idXNhZ2UiIGRlc2NyaXB0aW9uPSJCdWlsZCBmaWxlIHVzYWdlIGluZm8gKGRlZmF1bHQgdGFzaykiJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iJHtwcm9qZWN0LW5hbWV9ICIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iQXZhaWxhYmxlIFRhcmdldHM6IiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIENvbXBpbGluZzoiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIGNvbXBpbGUgLSBDb21waWxlcyB0aGUgV1NETDJKYXZhIHNvdXJjZSBjb2RlIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiAiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iIENvbXBpbGluZyBjbGllbnQ6IiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBjb21waWxlX2NsaWVudCAtIENvbXBpbGVzIHRoZSBjbGllbnQgc291cmNlIGNvZGUiIC8mZ3Q7DQotJmx0O2VjaG8gbWVzc2FnZT0iICIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgQ2xlYW5pbmcgdXA6IiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBjbGVhbiAtIERlbGV0ZSBjbGFzcyBmaWxlcyIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBXU0RMOiIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgd3NkbDJqYXZhIC0gR2VuZXJhdGUgc291cmNlIGZyb20gV1NETCIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBBQVI6IiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBhYXIgLSBHZW5lcmF0ZSBhbiAuYWFyIGZvciBkZXBsb3ltZW50IGludG8gV0VCLUlORi9zZXJ2aWNlcyIgLyZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSIgIiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBFeGVjdXRpbmc6IiAvJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IiBydW5Mb2dpbiAtIEV4ZWN1dGUgdGhlIHJ1bkxvZ2luIGNsaWVudCIgLyZndDsNCi0mbHQ7L3RhcmdldCZndDsNCi0NCi0mbHQ7dGFyZ2V0IG5hbWU9InByZXBhcmUiICZndDsNCi0mbHQ7bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9IiAvJmd0Ow0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0iY2xlYW4iICZndDsNCi0mbHQ7ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8mZ3Q7DQotJmx0O2RlbGV0ZSBkaXI9IiR7ZGlzdH0iIC8mZ3Q7DQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0O3RhcmdldCBuYW1lPSJjb21waWxlIiZndDsNCi0mbHQ7ZWNobyBtZXNzYWdlPSJDb21waWxpbmcgd3NkbDIgZmlsZXMiLyZndDsNCi0NCi0mbHQ7amF2YWMNCi1zcmNkaXI9Im91dHB1dCINCi1kZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9Ig0KLWRlcHJlY2F0aW9uPSJ0cnVlIg0KLWZhaWxvbmVycm9yPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSImZ3Q7DQotDQotJmx0O2NsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiLyZndDsNCi0mbHQ7L2phdmFjJmd0Ow0KLQ0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0id3NkbDJqYXZhIiBkZXBlbmRzPSJjbGVhbixwcmVwYXJlIiZndDsNCi0mbHQ7ZGVsZXRlIGRpcj0ib3V0cHV0IiAvJmd0Ow0KLSZsdDtqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSImZ3Q7DQotJmx0O2NsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiLyZndDsNCi0mbHQ7YXJnIHZhbHVlPSItZCIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9InhtbGJlYW5zIi8mZ3Q7DQotJmx0O2FyZyB2YWx1ZT0iLXVyaSIvJmd0Ow0KLSZsdDthcmcgZmlsZT0id3NkbC9Mb2dpbkVuZHBvaW50LndzZGwiLyZndDsNCi0mbHQ7YXJnIHZhbHVlPSItc3MiLyZndDsNCi0mbHQ7YXJnIHZhbHVlPSItZyIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Ii1zZCIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Ii1vIi8mZ3Q7DQotJmx0O2FyZyBmaWxlPSJvdXRwdXQiLyZndDsNCi0mbHQ7YXJnIHZhbHVlPSItcCIvJmd0Ow0KLSZsdDthcmcgdmFsdWU9Im9yZy5leGFtcGxlLnR5cGVzIi8mZ3Q7DQotJmx0Oy9qYXZhJmd0Ow0KLQ0KLSZsdDshLS0gTW92ZSB0aGUgc2NoZW1hIGZvbGRlciB0byBjbGFzc3BhdGgtLSZndDsNCi0mbHQ7bW92ZSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfSImZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSJvdXRwdXQvcmVzb3VyY2VzIiZndDsNCi0mbHQ7aW5jbHVkZSBuYW1lPSIqKi8qc2NoZW1hKi8qKi8qLmNsYXNzIi8mZ3Q7DQotJmx0O2luY2x1ZGUgbmFtZT0iKiovKnNjaGVtYSovKiovKi54c2IiLyZndDsNCi0mbHQ7L2ZpbGVzZXQmZ3Q7DQotJmx0Oy9tb3ZlJmd0Ow0KLQ0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0iamFyX3dzZGwiIGRlcGVuZHM9ImNvbXBpbGUiJmd0Ow0KLSZsdDtqYXIgamFyZmlsZT0ibGliL2F4aXMyX2V4YW1wbGVfd3NkbC5qYXIiICZndDsNCi0mbHQ7ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIC8mZ3Q7DQotJmx0Oy9qYXImZ3Q7DQotJmx0Oy90YXJnZXQmZ3Q7DQotDQotJmx0OyEtLSBidWlsZCBhbiAuYWFyIGZpbGUgZm9yIGF4aXMyIHdlYiBzZXJ2aWNlcyAtLSZndDsNCi0mbHQ7dGFyZ2V0IG5hbWU9ImFhciIgZGVwZW5kcz0iY29tcGlsZSImZ3Q7DQotJmx0O2RlbGV0ZSBkaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiIC8mZ3Q7DQotJmx0O21rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiIgLyZndDsNCi0mbHQ7Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiIgJmd0Ow0KLSZsdDtmaWxlc2V0IGRpcj0ib3V0cHV0L3Jlc291cmNlcyIgJmd0Ow0KLSZsdDshLS0gYXhpczIgd2ViIHNlcnZpY2VzIGRlZmluaXRpb25zIGZpbGUgLS0mZ3Q7DQotJmx0O2luY2x1ZGUgbmFtZT0ic2VydmljZXMueG1sIi8mZ3Q7DQotJmx0Oy9maWxlc2V0Jmd0Ow0KLSZsdDtmaWxlc2V0IGRpcj0id3NkbCIgJmd0Ow0KLSZsdDtpbmNsdWRlIG5hbWU9IkxvZ2luRW5kcG9pbnQud3NkbCIvJmd0Ow0KLSZsdDsvZmlsZXNldCZndDsNCi0mbHQ7L2NvcHkmZ3Q7DQotJmx0O2phciBqYXJmaWxlPSJkaXN0L0xvZ2luRW5kcG9pbnQuYWFyIiAmZ3Q7DQotJmx0O2ZpbGVzZXQgZGlyPSIke2J1aWxkLmNsYXNzZXN9IiAvJmd0Ow0KLSZsdDsvamFyJmd0Ow0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZV9jbGllbnQiJmd0Ow0KLSZsdDtlY2hvIG1lc3NhZ2U9IkNvbXBpbGluZyBjbGllbnQgZmlsZXMiLyZndDsNCi0NCi0mbHQ7amF2YWMNCi1zcmNkaXI9InNyYyINCi1kZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9Ig0KLWRlcHJlY2F0aW9uPSJ0cnVlIg0KLWZhaWxvbmVycm9yPSJ0cnVlIiBkZWJ1Zz0idHJ1ZSImZ3Q7DQotDQotJmx0O2NsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiLyZndDsNCi0mbHQ7L2phdmFjJmd0Ow0KLQ0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDt0YXJnZXQgbmFtZT0icnVuTG9naW4iIGRlcGVuZHM9InByZXBhcmUsY29tcGlsZV9jbGllbnQiIGRlc2NyaXB0aW9uPSJydW4gc2ltcGxlIExvZ2luIGNsaWVudCImZ3Q7DQotJmx0O2phdmEgY2xhc3NuYW1lPSJvcmcuY2xpZW50LkxvZ2luQ2xpZW50IiAmZ3Q7DQotJmx0O2NsYXNzcGF0aCByZWZpZD0iYXhpc19jbGllbnQuY2xhc3NwYXRoIi8mZ3Q7DQotJmx0Oy9qYXZhJmd0Ow0KLSZsdDsvdGFyZ2V0Jmd0Ow0KLQ0KLSZsdDsvcHJvamVjdCZndDsNCi08L3ByZT4NCi08cD5QbGFjZSB0aGUgYWJvdmUgYnVpbGQueG1sIGZpbGUgaW4gdGhlICdiaW4nIGRpcmVjdG9yeSBvZiB0aGUNCi1heGlzMiBiaW5hcnkgZGlzdHJpYnV0aW9uLiBUaGVuIGNyZWF0ZSBhIGJ1aWxkLnByb3BlcnRpZXMgZmlsZSBpbg0KLXRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgc3BlY2lmeSB0aGUgYXhpcy5ob21lIHBhdGggcG9pbnRpbmcgdG8gdGhlDQotYXhpczIgYmluYXJ5IGRpc3RyaWJ1dGlvbjwvcD4NCi08cD5FLmcuIDotIGF4aXMuaG9tZT1DOi8vQXhpczIvL2F4aXMyLTEuMS1iaW48L3A+DQotPHA+VGhlIGFib3ZlIGJ1aWxkLnhtbCBleGFtcGxlIGFsc28gYXNzdW1lcyB0aHJlZSBlbXB0eSBkaXJlY3Rvcmllcw0KLWV4aXN0LCAnZGlzdCcsICdsaWInLCBhbmQgJ3NyYycuPC9wPg0KLTxwPkJlbG93IGlzIGEgdmFsaWRhdGVkIFdTREwgRG9jdW1lbnQgZm9sbG93aW5nIHRoZQ0KLURvY3VtZW50L0xpdGVyYWwgU3R5bGUuIFRoZSBuYW1lIG9mIHRoaXMgZmlsZSBtYXRjaGVzIHRoZSBuYW1lIHVzZWQNCi1pbiB0aGUgV1NETDJKYXZhIGFudCB0YXNrIGFib3ZlLCBMb2dpbkVuZHBvaW50LndzZGwuPC9wPg0KLTxwcmUgY2xhc3M9ImNvZGUiPg0KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7DQotDQotICAgICZsdDtkZWZpbml0aW9ucyBuYW1lPSJMb2dpblNlcnZpY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2xvZ2luIiB4bWxuczp0bnM9Imh0dHA6Ly9sb2dpbiINCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczpuczI9Imh0dHA6Ly9sb2dpbi90eXBlcyImZ3Q7DQotDQotICAgICZsdDt0eXBlcyZndDsNCi0gICAgJmx0O3NjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9sb2dpbi90eXBlcyIgeG1sbnM6dG5zPSJodHRwOi8vbG9naW4vdHlwZXMiDQotICAgIHhtbG5zOnNvYXAxMS1lbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIg0KLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiZndDsNCi0gICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8mZ3Q7DQotICAgICZsdDtlbGVtZW50IG5hbWU9InJldHVybldlYkxvZ2luRWxlbWVudCImZ3Q7DQotICAgICZsdDtjb21wbGV4VHlwZSZndDsNCi0gICAgJmx0O3NlcXVlbmNlJmd0Ow0KLQ0KLSAgICAmbHQ7ZWxlbWVudCByZWY9InRuczpzb2FwX3Nlc3Npb25faWRFbGVtZW50Ii8mZ3Q7DQotICAgICZsdDtlbGVtZW50IHJlZj0idG5zOndlYl91c2VyX25hbWVFbGVtZW50Ii8mZ3Q7DQotICAgICZsdDsvc2VxdWVuY2UmZ3Q7DQotICAgICZsdDsvY29tcGxleFR5cGUmZ3Q7DQotICAgICZsdDsvZWxlbWVudCZndDsNCi0gICAgJmx0O2VsZW1lbnQgbmFtZT0id2ViTG9naW5FbGVtZW50IiZndDsNCi0NCi0gICAgJmx0O2NvbXBsZXhUeXBlJmd0Ow0KLSAgICAmbHQ7c2VxdWVuY2UmZ3Q7DQotICAgICZsdDtlbGVtZW50IHJlZj0idG5zOnVzZXJfbmFtZUVsZW1lbnQiLyZndDsNCi0gICAgJmx0O2VsZW1lbnQgcmVmPSJ0bnM6dXNlcl9wYXNzd29yZEVsZW1lbnQiLyZndDsNCi0gICAgJmx0Oy9zZXF1ZW5jZSZndDsNCi0gICAgJmx0Oy9jb21wbGV4VHlwZSZndDsNCi0NCi0gICAgJmx0Oy9lbGVtZW50Jmd0Ow0KLSAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ1c2VyX25hbWVFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICZsdDtlbGVtZW50IG5hbWU9InVzZXJfcGFzc3dvcmRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8mZ3Q7DQotICAgICZsdDtlbGVtZW50IG5hbWU9InNvYXBfc2Vzc2lvbl9pZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgJmx0O2VsZW1lbnQgbmFtZT0id2ViX3VzZXJfbmFtZUVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLyZndDsNCi0gICAgJmx0Oy9zY2hlbWEmZ3Q7Jmx0Oy90eXBlcyZndDsNCi0NCi0gICAgJmx0O21lc3NhZ2UgbmFtZT0iTG9naW5FbmRwb2ludF93ZWJMb2dpbiImZ3Q7DQotICAgICZsdDtwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zMjp3ZWJMb2dpbkVsZW1lbnQiLyZndDsNCi0gICAgJmx0Oy9tZXNzYWdlJmd0Ow0KLSAgICAmbHQ7bWVzc2FnZSBuYW1lPSJMb2dpbkVuZHBvaW50X3dlYkxvZ2luUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9Im5zMjpyZXR1cm5XZWJMb2dpbkVsZW1lbnQiLyZndDsNCi0gICAgJmx0Oy9tZXNzYWdlJmd0Ow0KLQ0KLSAgICAmbHQ7cG9ydFR5cGUgbmFtZT0iTG9naW5FbmRwb2ludCImZ3Q7DQotICAgICZsdDtvcGVyYXRpb24gbmFtZT0id2ViTG9naW4iJmd0Ow0KLSAgICAmbHQ7aW5wdXQgbWVzc2FnZT0idG5zOkxvZ2luRW5kcG9pbnRfd2ViTG9naW4iIG5hbWU9IkxvZ2luRW5kcG9pbnRfd2ViTG9naW4iLyZndDsNCi0gICAgJmx0O291dHB1dCBtZXNzYWdlPSJ0bnM6TG9naW5FbmRwb2ludF93ZWJMb2dpblJlc3BvbnNlIiBuYW1lPSJMb2dpbkVuZHBvaW50X3dlYkxvZ2luUmVzcG9uc2UiLyZndDsNCi0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotICAgICZsdDsvcG9ydFR5cGUmZ3Q7DQotDQotICAgICZsdDtiaW5kaW5nIG5hbWU9IkxvZ2luRW5kcG9pbnRCaW5kaW5nIiB0eXBlPSJ0bnM6TG9naW5FbmRwb2ludCImZ3Q7DQotICAgICZsdDtzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvJmd0Ow0KLSAgICAmbHQ7b3BlcmF0aW9uIG5hbWU9IndlYkxvZ2luIiZndDsNCi0gICAgJmx0O3NvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IndlYkxvZ2luIi8mZ3Q7DQotICAgICZsdDtpbnB1dCBuYW1lPSJMb2dpbkVuZHBvaW50X3dlYkxvZ2luIiZndDsNCi0gICAgJmx0O3NvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLyZndDsNCi0NCi0gICAgJmx0Oy9pbnB1dCZndDsNCi0gICAgJmx0O291dHB1dCBuYW1lPSJMb2dpbkVuZHBvaW50X3dlYkxvZ2luUmVzcG9uc2UiJmd0Ow0KLSAgICAmbHQ7c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvJmd0Ow0KLSAgICAmbHQ7L291dHB1dCZndDsNCi0gICAgJmx0Oy9vcGVyYXRpb24mZ3Q7DQotICAgICZsdDsvYmluZGluZyZndDsNCi0NCi0gICAgJmx0O3NlcnZpY2UgbmFtZT0iTG9naW5TZXJ2aWNlIiZndDsNCi0gICAgJmx0O3BvcnQgbmFtZT0iTG9naW5FbmRwb2ludFBvcnQiIGJpbmRpbmc9InRuczpMb2dpbkVuZHBvaW50QmluZGluZyImZ3Q7DQotICAgICZsdDtzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9Mb2dpblNlcnZpY2UiLyZndDsmbHQ7L3BvcnQmZ3Q7DQotICAgICZsdDsvc2VydmljZSZndDsmbHQ7L2RlZmluaXRpb25zJmd0Ow0KLTwvcHJlPg0KLTxwPlBsYWNlIHRoZSBhYm92ZSBmaWxlLCBuYW1lZCBMb2dpbkVuZHBvaW50LndzZGwsIGluIHRoZSBkaXJlY3RvcnkNCi0nd3NkbCcgd2hpY2ggaXMgYWxzbyBpbnNpZGUgdGhlICdiaW4nIGRpcmVjdG9yeS4gUnVuIHRoZSB3c2RsMmphdmENCi1jb21tYW5kIHZpYSB0aGUgYW50IHRhc2sgZGVmaW5lZCBhYm92ZSAoJmd0O2FudCB3c2RsMmphdmEpLCBhbmQNCi10aGVyZSB3aWxsIGJlIGEgZGlyZWN0b3J5IGNhbGxlZCAnb3V0cHV0JyBjcmVhdGVkLiBUaGlzIGRpcmVjdG9yeQ0KLWNvbnRhaW5zIHRoZSBXU0RMMkphdmEgZ2VuZXJhdGVkIHNvdXJjZS48L3A+DQotPHA+QW4gaW1wb3J0YW50IGRldGFpbCBpcyB0aGF0IGFuIFhNTEJlYW4gY2xhc3MgZmlsZSBpcyBhbHNvDQotZ2VuZXJhdGVkIGJ5IFdTREwySmF2YSwgVHlwZVN5c3RlbUhvbGRlci5jbGFzcy4gVGhhdCBmaWxlIGlzIHBsYWNlZA0KLWludG8gYnVpbGQvY2xhc3NlcyBieSB0aGUgYWJvdmUgYW50IHRhc2sgYW5kIHdpbGwgYmUgbmVlZGVkIHRvDQotY29tcGlsZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMuIEEgZnJlcXVlbnQgcHJvYmxlbSBpcyB1c2VycyBnZXQgYW4NCi1lcnJvciBzdWNoIGFzOjwvcD4NCi08cD48ZW0+PGI+Q2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiA6IENhbm5vdCBsb2FkIFNjaGVtYVR5cGVTeXN0ZW0uDQotVW5hYmxlIHRvIGxvYWQgY2xhc3Mgd2l0aCBuYW1lDQotc2NoZW1hb3JnX2FwYWNoZV94bWxiZWFucy5zeXN0ZW0uczY4QzQxREI4MTJGNTJDOTc1NDM5QkExMEZFNEZFRTU0LlR5cGVTeXN0ZW1Ib2xkZXIuDQotTWFrZSBzdXJlIHRoZSBnZW5lcmF0ZWQgYmluYXJ5IGZpbGVzIGFyZSBvbiB0aGUNCi1jbGFzc3BhdGguPC9iPjwvZW0+PC9wPg0KLTxwPlRoZSBUeXBlU3lzdGVtSG9sZGVyLmNsYXNzIGdlbmVyYXRlZCBieSBXU0RMMkphdmEgbXVzdCBiZSBwbGFjZWQNCi1pbiB5b3VyIGNsYXNzcGF0aCBpbiBvcmRlciB0byBhdm9pZCB0aGlzIGVycm9yLjwvcD4NCi08cD5UaGUgbmV4dCBzdGVwIGlzIHRvIG1vZGlmeSB0aGUgZ2VuZXJhdGVkIFNrZWxldG9uIEphdmEgU291cmNlDQotZmlsZSAtIHRoZSBXZWIgc2VydmljZS4gVGhpcyBmaWxlIGFzIGdlbmVyYXRlZCByZXR1cm5zIG51bGwgYW5kDQotbmVlZHMgdG8gYmUgdXBkYXRlZCB0byBjb250YWluIHRoZSBidXNpbmVzcyBsb2dpYy48L3A+DQotPHA+QWZ0ZXIgdGhlIFdTREwySmF2YSBjb21tYW5kIHJ1bnMgdGhlIGZpbGUgTG9naW5FbmRwb2ludC53c2RsLA0KLWVkaXQgdGhlIGZvbGxvd2luZyBmaWxlOjwvcD4NCi08cD5vdXRwdXQvc3JjL29yZy9leGFtcGxlL3R5cGVzL0xvZ2luU2VydmljZVNrZWxldG9uLmphdmEuIFlvdQ0KLXNob3VsZCBzZWUgdGhlIGZvbGxvd2luZyBjb2RlOjwvcD4NCi08cHJlIGNsYXNzPSJjb2RlIj4NCi0vKioNCi0gICAgKiBMb2dpblNlcnZpY2VTa2VsZXRvbi5qYXZhDQotICAgICoNCi0gICAgKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAgICAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogMS4wLVJDNCBBcHIgMjgsIDIwMDYgKDA1OjIzOjIzIElTVCkNCi0gICAgKi8NCi0gICAgcGFja2FnZSBvcmcuZXhhbXBsZS50eXBlczsNCi0gICAgLyoqDQotICAgICogTG9naW5TZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlDQotICAgICovDQotICAgIHB1YmxpYyBjbGFzcyBMb2dpblNlcnZpY2VTa2VsZXRvbiB7DQotDQotDQotICAgIC8qKg0KLSAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0NCi0gICAgKiBAcGFyYW0gcGFyYW0wDQotDQotICAgICovDQotICAgIHB1YmxpYyBsb2dpbi50eXBlcy5SZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudCB3ZWJMb2dpbg0KLSAgICAobG9naW4udHlwZXMuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQgcGFyYW0wICkNCi0NCi0gICAgew0KLSAgICAvL1RvZG8gZmlsbCB0aGlzIHdpdGggdGhlIG5lY2Vzc2FyeSBidXNpbmVzcyBsb2dpYw0KLSAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgfQ0KLTwvcHJlPg0KLTxwPlJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcsIHdoaWNoIHVzZXMNCi10aGUgY29tcGxleCB0eXBlcyBnZW5lcmF0ZWQgYnkgV1NETDJKYXZhIGFuZCB0aGUgZXhhbXBsZSB3c2RsDQotZmlsZTo8L3A+DQotPHByZSBjbGFzcz0iY29kZSI+DQotLyoqDQotICAgICogTG9naW5TZXJ2aWNlU2tlbGV0b24uamF2YQ0KLSAgICAqDQotICAgICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwNCi0gICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IDEuMC1SQzQgQXByIDI4LCAyMDA2ICgwNToyMzoyMyBJU1QpDQotICAgICovDQotICAgIHBhY2thZ2Ugb3JnLmV4YW1wbGUudHlwZXM7DQotICAgIGltcG9ydCBsb2dpbi50eXBlcy5SZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudDsNCi0gICAgaW1wb3J0IGxvZ2luLnR5cGVzLlJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50Lio7DQotICAgIGltcG9ydCBsb2dpbi50eXBlcy5XZWJMb2dpbkVsZW1lbnREb2N1bWVudDsNCi0gICAgaW1wb3J0IGxvZ2luLnR5cGVzLldlYkxvZ2luRWxlbWVudERvY3VtZW50Lio7DQotDQotICAgIC8qKg0KLSAgICAqIEF1dG8gZ2VuZXJhdGVkIGphdmEgc2tlbGV0b24gZm9yIHRoZSBzZXJ2aWNlIGJ5IHRoZSBBeGlzIGNvZGUgZ2VuZXJhdG9yDQotICAgICovDQotICAgIHB1YmxpYyBjbGFzcyBMb2dpblNlcnZpY2VTa2VsZXRvbiB7DQotDQotICAgIC8qKg0KLSAgICAqIEF1dG8gZ2VuZXJhdGVkIG1ldGhvZCBzaWduYXR1cmUNCi0NCi0gICAgKiBAcGFyYW0gd2ViTG9naW5FbGVtZW50RG9jdW1lbnQgY2hhbmdlZCBmcm9tIHBhcmFtMA0KLQ0KLSAgICAqLw0KLSAgICBwdWJsaWMgUmV0dXJuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQgd2ViTG9naW4NCi0gICAgKFdlYkxvZ2luRWxlbWVudERvY3VtZW50IHdlYkxvZ2luRWxlbWVudERvY3VtZW50ICl7DQotDQotICAgIC8vVG9kbyBmaWxsIHRoaXMgd2l0aCB0aGUgbmVjZXNzYXJ5IGJ1c2luZXNzIGxvZ2ljDQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9naW5TZXJ2aWNlU2tlbGV0b24ud2ViTG9naW4gcmVhY2hlZCBzdWNjZXNzZnVsbHkhIik7DQotDQotICAgIC8vIEdldCBwYXJhbWV0ZXJzIHBhc3NlZCBpbg0KLSAgICBXZWJMb2dpbkVsZW1lbnQgd2ViTG9naW5FbGVtZW50ID0gd2ViTG9naW5FbGVtZW50RG9jdW1lbnQuZ2V0V2ViTG9naW5FbGVtZW50KCk7DQotICAgIFN0cmluZyB1c2VyTmFtZSA9IHdlYkxvZ2luRWxlbWVudC5nZXRVc2VyTmFtZUVsZW1lbnQoKTsNCi0gICAgU3RyaW5nIHBhc3N3b3JkID0gd2ViTG9naW5FbGVtZW50LmdldFVzZXJQYXNzd29yZEVsZW1lbnQoKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dpblNlcnZpY2VTa2VsZXRvbi53ZWJMb2dpbiB1c2VyTmFtZTogIiArIHVzZXJOYW1lKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dpblNlcnZpY2VTa2VsZXRvbi53ZWJMb2dpbiBwYXNzd29yZDogIiArIHBhc3N3b3JkKTsNCi0NCi0gICAgLy8gaW5wdXQgcGFyYW1hdGVycyB3b3VsZCBiZSB1c2VkIGhlcmUNCi0NCi0gICAgLy8gcHJlcGFyZSBvdXRwdXQNCi0gICAgUmV0dXJuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQgcmV0RG9jID0NCi0gICAgUmV0dXJuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICBSZXR1cm5XZWJMb2dpbkVsZW1lbnQgcmV0RWxlbWVudCA9IFJldHVybldlYkxvZ2luRWxlbWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotDQotICAgIHJldEVsZW1lbnQuc2V0V2ViVXNlck5hbWVFbGVtZW50KCJqb2Ugc2l4cGFjayIpOw0KLSAgICByZXRFbGVtZW50LnNldFNvYXBTZXNzaW9uSWRFbGVtZW50KCJzb21lX3JhbmRvbV9zdHJpbmciKTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0ZSByZXRFbGVtZW50OiAiICsgcmV0RWxlbWVudC52YWxpZGF0ZSgpKTsNCi0NCi0gICAgcmV0RG9jLnNldFJldHVybldlYkxvZ2luRWxlbWVudChyZXRFbGVtZW50KTsNCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0ZSByZXREb2M6ICIgKyByZXREb2MudmFsaWRhdGUoKSk7DQotDQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9naW5TZXJ2aWNlU2tlbGV0b24ud2ViTG9naW4gcmV0dXJuaW5nLi4uIik7DQotDQotICAgIHJldHVybiByZXREb2M7DQotDQotICAgIH0NCi0gICAgfQ0KLTwvcHJlPg0KLTxwPlRoZSBuZXh0IHN0ZXBzIGFzc3VtZSB0aGUgYXhpczIud2FyIGhhcyBiZWVuIGRlcGxveWVkIGFuZCBoYXMNCi1leHBhbmRlZCBpbiBhIHNlcnZsZXQgY29udGFpbmVyLjwvcD4NCi08cD5SdW4gdGhlICdqYXJfd3NkbCcgYW50IHRhc2sgZnJvbSB0aGUgZXhhbXBsZSBidWlsZC54bWwgKCZndDthbnQNCi1qYXJfd3NkbCksIHdoaWNoIGdlbmVyYXRlcyBhIGphciBmaWxlIGF4aXMyX2V4YW1wbGVfd3NkbC5qYXIgaW4gdGhlDQotJ2Jpbi9saWInIGRpcmVjdG9yeS4gVGhpcyBqYXIgd2lsbCBiZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGNsaWVudCwNCi1hbmQgYWxzbyB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgc2VydmxldCBjb250YWluZXIuPC9wPg0KLTxwPk5leHQsIHJ1biB0aGUgJ2FhcicgYW50IHRhc2sgZnJvbSB0aGUgZXhhbXBsZSBidWlsZC54bWwgKCZndDthbnQNCi1hYXIpLCB3aGljaCBnZW5lcmF0ZXMgdGhlIGRlcGxveWFibGUgYXhpczIgV2ViIHNlcnZpY2UuIFBsYWNlDQotZGlzdC9Mb2dpbkVuZHBvaW50LmFhciBpbnRvIGF4aXMyL1dFQi1JTkYvc2VydmljZXMgLiBQbGFjZQ0KLWxpYi9heGlzMl9leGFtcGxlX3dzZGwuamFyIGludG8gYXhpczIvV0VCLUlORi9saWIgLiBWZXJpZnkgdGhlDQotaGFwcHkgYXhpcyBwYWdlIGxvYWRlZCB0aGUgc2VydmljZXMgY29ycmVjdGx5IC0gdGhlcmUgc2hvdWxkIGJlIHRoZQ0KLXNlcnZpY2UgJ0xvZ2luRW5kcG9pbnQnIHdpdGggdGhlIGF2YWlsYWJsZSBvcGVyYXRpb24gJ3dlYkxvZ2luJw0KLWRpc3BsYXllZC48L3A+DQotPHA+VGhlIGxhc3Qgc3RlcCBpcyB0byBjcmVhdGUgYW5kIHJ1biB0aGUgY2xpZW50LiBJbiB0aGUgc3JjDQotZGlyZWN0b3J5IGNyZWF0ZSB0aGUgZmlsZSBvcmcuY2xpZW50LkxvZ2luQ2xpZW50LmphdmEsIHdpdGggdGhlDQotY29udGVudHMgYmVsb3c6PC9wPg0KLTxwcmUgY2xhc3M9ImNvZGUiPg0KLXBhY2thZ2Ugb3JnLmNsaWVudDsNCi0NCi0gICAgaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLQ0KLSAgICBpbXBvcnQgbG9naW4udHlwZXMuUmV0dXJuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQ7DQotICAgIGltcG9ydCBsb2dpbi50eXBlcy5SZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudC4qOw0KLSAgICBpbXBvcnQgbG9naW4udHlwZXMuV2ViTG9naW5FbGVtZW50RG9jdW1lbnQ7DQotICAgIGltcG9ydCBsb2dpbi50eXBlcy5XZWJMb2dpbkVsZW1lbnREb2N1bWVudC4qOw0KLSAgICBpbXBvcnQgb3JnLmV4YW1wbGUudHlwZXMuTG9naW5TZXJ2aWNlU3R1YjsNCi0NCi0gICAgLyoqDQotICAgICogTG9naW4uDQotICAgICoNCi0gICAgKi8NCi0gICAgcHVibGljIGNsYXNzIExvZ2luQ2xpZW50IHsNCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLSAgICB0cnkgew0KLQ0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndlYkxvZ2luLCBmaXJpbmcuLi4iKTsNCi0gICAgTG9naW5TZXJ2aWNlU3R1YiBzdHViID0gbmV3IExvZ2luU2VydmljZVN0dWIoKTsNCi0NCi0gICAgV2ViTG9naW5FbGVtZW50RG9jdW1lbnQgd2ViTG9naW5FbGVtZW50RG9jdW1lbnQNCi0gICAgPSBXZWJMb2dpbkVsZW1lbnREb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgIFdlYkxvZ2luRWxlbWVudCB3ZWJMb2dpbkVsZW1lbnQgPQ0KLSAgICBXZWJMb2dpbkVsZW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICB3ZWJMb2dpbkVsZW1lbnQuc2V0VXNlck5hbWVFbGVtZW50KCJqb2UiKTsNCi0gICAgd2ViTG9naW5FbGVtZW50LnNldFVzZXJQYXNzd29yZEVsZW1lbnQoInNpeHBhY2siKTsNCi0NCi0gICAgd2ViTG9naW5FbGVtZW50RG9jdW1lbnQuc2V0V2ViTG9naW5FbGVtZW50KHdlYkxvZ2luRWxlbWVudCk7DQotDQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigidmFsaWRhdGU6ICIgKyB3ZWJMb2dpbkVsZW1lbnQudmFsaWRhdGUoKSk7DQotICAgIHN0dWIud2ViTG9naW4od2ViTG9naW5FbGVtZW50RG9jdW1lbnQpOw0KLQ0KLSAgICBSZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudCByZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudCA9DQotICAgIHN0dWIud2ViTG9naW4od2ViTG9naW5FbGVtZW50RG9jdW1lbnQpOw0KLQ0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudCByZXR1cm5lZCIpOw0KLQ0KLSAgICBSZXR1cm5XZWJMb2dpbkVsZW1lbnREb2N1bWVudC5SZXR1cm5XZWJMb2dpbkVsZW1lbnQNCi0gICAgcmV0RWxlbWVudCA9IHJldHVybldlYkxvZ2luRWxlbWVudERvY3VtZW50LmdldFJldHVybldlYkxvZ2luRWxlbWVudCgpOw0KLQ0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYlVzZXJOYW1lOiAiICsgcmV0RWxlbWVudC5nZXRXZWJVc2VyTmFtZUVsZW1lbnQoKSk7DQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU09BUFNlc3Npb25JZDogIiArIHJldEVsZW1lbnQuZ2V0U29hcFNlc3Npb25JZEVsZW1lbnQoKSk7DQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigid2ViTG9naW4sIGNvbXBsZXRlZCEhISIpOw0KLQ0KLSAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7DQotICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICB9DQotICAgIH0NCi0gICAgfQ0KLTwvcHJlPg0KLTxwPk5vdyBydW4gdGhlIGFudCB0YXNrICdydW5Mb2dpbicgKCZndDthbnQgcnVuTG9naW4pLiBUaGUNCi1mb2xsb3dpbmcgb3V0cHV0IHNob3VsZCBhcHBlYXI6PC9wPg0KLTxwcmUgY2xhc3M9ImNvZGUiPg0KLXJ1bkxvZ2luOg0KLSAgICBbZWNob10gcnVubmluZyB0aGUgd2ViTG9naW4gY2xpZW50DQotICAgIFtqYXZhXSB3ZWJMb2dpbiwgZmlyaW5nLi4uDQotICAgIFtqYXZhXSB2YWxpZGF0ZTogdHJ1ZQ0KLSAgICBbamF2YV0gQ2xpZW50IHJldHVybmVkDQotICAgIFtqYXZhXSBXZWJVc2VyTmFtZTogam9lIHNpeHBhY2sNCi0gICAgW2phdmFdIFNPQVBTZXNzaW9uSWQ6IHNvbWVfcmFuZG9tX3N0cmluZw0KLSAgICBbamF2YV0gd2ViTG9naW4sIGNvbXBsZXRlZCEhIQ0KLTwvcHJlPg0KLTxhIG5hbWU9ImFwcGVuZGl4IiBpZD0iYXBwZW5kaXgiPjwvYT4NCi08aDI+QXBwZW5kaXg8L2gyPg0KLTx1bD4NCi08bGk+RWNsaXBzZSByZWZlcmVuY2UgLSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2E+PC9saT4NCi08bGk+Q3VzdG9tIEFudCBUYXNrcyAtIDxhIGhyZWY9DQotImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbDwvYT48L2xpPg0KLTwvdWw+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9TZXJ2aWNlUGFnZTEuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvU2VydmljZVBhZ2UxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NThmZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9TZXJ2aWNlUGFnZTEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvU2VydmljZVdpemFyZFNlbGVjdGlvbi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9TZXJ2aWNlV2l6YXJkU2VsZWN0aW9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0ODNiNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9TZXJ2aWNlV2l6YXJkU2VsZWN0aW9uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2hlbHAuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvaGVscC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YWM5NmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvaGVscC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTBkYjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjAucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNmZjFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4wLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4xLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4xLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmMmVmYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDQ5NzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQyOTRlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4yLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4yLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyMDAzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYmJmMDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk3ODViLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4zMS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuMzEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjVkMjBmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4zMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuNC5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9qYXZhMndzZGwtc2NyZWVuNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTdmZjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlMi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2UyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkM2FmYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2UyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzhlZTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2UzX2hsLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTNfaGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzZiZTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTNfaGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9sb2FkLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTRfbG9hZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDVlNmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9sb2FkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTRfcGxhaW4uanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9wbGFpbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjQ5N2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9wbGFpbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3NlYXJjaF9kZWNsYXJlZC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3NlYXJjaF9kZWNsYXJlZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzA5MDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF9zZWFyY2hfZGVjbGFyZWQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNF90YWJsZS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3RhYmxlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmMDQ5NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U0X3RhYmxlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTUuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjIyNmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X2FkZGVkLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfYWRkZWQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNlMzc2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfYWRkZWQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9icm93c2VkLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfYnJvd3NlZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODM4MTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9icm93c2VkLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3NlcnZpY2VfcGFnZTVfaGwuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9obC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDIxNDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9obC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X3JlbW92ZS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U1X3JlbW92ZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjdmNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNV9yZW1vdmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvc2VydmljZV9wYWdlNi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlMTdjNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zZXJ2aWNlX3BhZ2U2LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3N1Y2Nlc3NfbXNnLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3N1Y2Nlc3NfbXNnLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1YzZjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy9zdWNjZXNzX21zZy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMThlZjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjAucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGJjMDQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4wLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4xLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4xLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4MTEzZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTUwMzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ3NTI5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4yLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4yLnBuZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4yLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MmE4My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2NhNjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZjZGU4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zMS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuMzEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjVkMjBmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4zMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuNC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZWY2ZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQucG5nIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9pbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNhZDdjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW40LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW40MS5wbmcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL2ltYWdlcy93c2RsMmphdmEtc2NyZWVuNDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkxZDQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2UvaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW40MS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4ueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvZWNsaXBzZS9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4MmMwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL3NlcnZpY2VhcmNoaXZlci1wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPlNlcnZpY2UgQXJjaGl2ZSBHZW5lcmF0b3IgV2l6YXJkIEd1aWRlIGZvciBFY2xpcHNlDQotUGx1Zy1pbjwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5TZXJ2aWNlIEFyY2hpdmUgR2VuZXJhdG9yIFdpemFyZCBHdWlkZSBmb3IgRWNsaXBzZSBQbHVnLWluPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluc3RhbGxhdGlvbiBhbmQgdXNhZ2UNCi1vZiB0aGUgYXJjaGl2ZSBnZW5lcmF0b3IgRWNsaXBzZSBwbHVnLWluLjwvcD4NCi08cD48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+W0Rvd25sb2FkIFBsdWdpbiBUb29sXTwvYT48L3A+DQotPGgyPkNvbnRlbnQ8L2gyPg0KLTx1bD4NCi08bGk+PGEgaHJlZj0iI2ludHJvIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI2luc3RhbGxhdGlvbiI+SW5zdGFsbGF0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNvcGVyYXRpb24iPk9wZXJhdGlvbjwvYT48L2xpPg0KLTwvdWw+DQotPGEgbmFtZT0iaW50cm8iIGlkPSJpbnRybyI+PC9hPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPkFzIHBhcnQgb2YgdGhlIEF4aXMyIHRvb2wgc2V0LCB0aGUgc2VydmljZSBhcmNoaXZlIGdlbmVyYXRvciBpcw0KLWFuIGltcG9ydGFudCB0b29sIHRoYXQgYWxsb3dzIHRoZSBnZW5lcmF0aW9uIG9mIHNlcnZpY2UgYXJjaGl2ZXMNCi0oImFhciIgZmlsZSBvciBhICJqYXIiIGZpbGVzKSB0aGF0IGNhbiBiZSBkZXBsb3llZCBhcyBhIHdlYg0KLXNlcnZpY2VzIHRvIHRoZSBBeGlzMi48L3A+DQotPGEgbmFtZT0iaW5zdGFsbGF0aW9uIiBpZD0iaW5zdGFsbGF0aW9uIj48L2E+DQotPGgyPkluc3RhbGxhdGlvbjwvaDI+DQotPHA+T25lIGNhbiBlYXNpbHkgPGEgaHJlZj0NCi0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCI+ZG93bmxvYWQ8L2E+IHRoZQ0KLXBsdWdpbjwvcD4NCi08cD5JZiBvbmUgbmVlZHMgdG8gYnVpbGQgdGhlIHBsdWctaW4gZnJvbSBzb3VyY2UsIE1hdmVuMiBhbmQgQW50DQotYnVpbGRzIGFyZXZhaWxhYmUuIFBsZWFzZSByZWZlciB0aGUgcmVhZG1lLnR4dCBsb2NhdGVkIGF0DQotbW9kdWxlL3Rvb2xzIG9uIEF4aXMyIHNvdXJjZS48L3A+DQotPHA+T25jZSB5b3UndmUgb2J0YWluZWQgdGhlIHBsdWctaW4ganVzdCB1bnppcCB0aGUgY29udGVudCBvZiB0aGUNCi1wbHVnLWluIGFyY2hpdmUgdG8gdGhlIEVjbGlwc2UgcGx1Zy1pbiBkaXJlY3RvcnkgKGlmIGl0IGlzIHRoZQ0KLXppcHBlZC1iaW5hcnkgdmVyc2lvbikgb3IgY29weSB0aGUgbmVjZXNzYXJ5IGZvbGRlcnMgdG8gdGhlIEVjbGlwc2UNCi1wbHVnLWluIGRpcmVjdG9yeSBhbmQgcmVzdGFydCBFY2xpcHNlLjwvcD4NCi08cD48c3Ryb25nPk5PVEU8L3N0cm9uZz4gOiBUaGlzIHBsdWctaW4gd29ya3Mgb24gRWNsaXBzZSB2ZXJzaW9uDQotMy4xIGFuZCB1cHdhcmRzLCBhbHNvIHRoZSBqYXZhIHZlcnNpb24gc2hvdWxkIGJlIDEuNCBvciBoaWdoZXIuIFRoZQ0KLXByb3ZpZGVkIHNjcmVlbiBzaG90cyBtYXkgc2xpZ2h0bHkgZGlmZmVyIHdpdGggd2hhdCB0aGUgdXNlciB3b3VsZA0KLWFjdHVhbGx5IHNlZSBidXQgdGhlIGZ1bmN0aW9uYWxpdHkgaGFzIG5vdCBiZWVuIGNoYW5nZWQuPC9wPg0KLTxhIG5hbWU9Im9wZXJhdGlvbiIgaWQ9Im9wZXJhdGlvbiI+PC9hPg0KLTxoMj5PcGVyYXRpb248L2gyPg0KLTxwPklmIHRoZSBwbHVnLWluIGlzIHByb3Blcmx5IGluc3RhbGxlZCB5b3Ugc2hvdWxkIHNlZSBhIG5ldyB3aXphcmQNCi11bmRlciB0aGUgIk5ldyIgc2VjdGlvbi4gKFVzZSB0aGUgRmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIgb3INCi1DdHJsICsgTiApPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9TZXJ2aWNlV2l6YXJkU2VsZWN0aW9uLmpwZyIgLz48L3A+DQotPHA+U2VsZWN0aW5nIHRoZSB3aXphcmQgYW5kIHByZXNzaW5nIHRoZSAiTmV4dCIgYnV0dG9uIHdpbGwgc3RhcnQNCi10aGUgc2VydmljZSBnZW5lcmF0b3Igd2l6YXJkLiBGb2xsb3dpbmcgaXMgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlDQotd2l6YXJkLjwvcD4NCi08cD48c3Ryb25nPlBhZ2UgMTo8L3N0cm9uZz48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL1NlcnZpY2VQYWdlMS5qcGciIC8+PC9wPg0KLTxwPk9uY2UgdGhlIGNsYXNzIGZpbGUgZm9sZGVyKHdoaWNoIHNob3VsZCBiZSBhIGZvbGRlciBpbiB0aGUNCi1maWxlIHN5c3RlbSkgaXMgYnJvd3NlZCBhbmQgc2VsZWN0ZWQsIHRoZSAiTmV4dCIgYnV0dG9uIHdpbGwgYmUNCi1lbmFibGVkIGFuZCB5b3UgY2FuIG1vdmUgdG8gdGhlIG5leHQgcGFnZS4gTm90ZSB0aGF0IHlvdSBoYXZlIHRoZQ0KLW9wdGlvbiBvZiBlaXRoZXIgaW5jbHVkaW5nIGFsbCB0aGUgZmlsZXMgb3IgdGhlIGNsYXNzIGZpbGVzIG9ubHkgb2YNCi10aGUgZm9sZGVyIG9uIHBhZ2UgMS48L3A+DQotPHA+PHN0cm9uZz5QYWdlIDI6PC9zdHJvbmc+PC9wPg0KLTxwPlBhZ2UgMiBvZiB0aGUgd2l6YXJkIGFzIHNlZW4gYmVsb3cgcmVxdWlyZXMgeW91IHRvIGxvY2F0ZS9icm93c2UNCi10aGUgV1NETCBmaWxlLiBJZiB5b3UgZG8gbm90IHdpc2ggdG8gYWRkIGEgV1NETCBmaWxlIHRvIHRoZSBzZXJ2aWNlDQotYXJjaGl2ZSwgc2VsZWN0IHNraXAgV1NETCwgZWxzZSB5b3UgY2FuIHNlbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlDQotV1NETCBmaWxlIGJ5IHNlbGVjdGluZyB0aGUgc2VsZWN0IFdTREwgb3B0aW9uLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlMi5qcGciIC8+PC9wPg0KLTxwPjxzdHJvbmc+UGFnZSAzOjwvc3Ryb25nPjwvcD4NCi08cD5TZWxlY3QgdGhlIHNlcnZpY2VzLnhtbCBmaWxlIG9uIHRoaXMgd2l6YXJkIHBhZ2UgYnkgYnJvd3Npbmcgb3INCi1zZWxlY3QgdGhlIG9wdGlvbiBvZiBnZW5lcmF0aW5nIHNlcnZpY2UgeG1sIGF1dG9tYXRpY2FsbHksIGFmdGVyDQotd2hpY2ggeW91IGNhbiBjbGljayAiTmV4dCIgYnV0dG9uIHRvIGdvIHRvIHRoZSBuZXh0IHBhZ2UuIE5vdGljZQ0KLWhvdyB0aGUgYnJvd3Npbmcgb3B0aW9uIGRpc2FibGVzIHdoZW4gdGhlICJHZW5lcmF0ZSBzZXJ2aWNlIHhtbA0KLWF1dG9tYXRpY2FsbHkiIGNoZWNrIGJveCBpcyB0aWNrZWQuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2UzLmpwZyIgLz48L3A+DQotPCEtLQ0KLTxwPk5vdGUgdGhhdCBUaGUgc2VydmljZSBYTUwgZmlsZSBjYW4gYmUgZ2VuZXJhdGVkIGlmIG5lZWRlZC4gVG8gcHJvY2VlZA0KLXRvIHRoZSBzZXJ2aWNlIGdlbmVyYXRpb24gcGFnZSwgY2hlY2sgdGhlICJnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IiBjaGVja2JveC4gPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9InNlcnZpY2VfcGFnZTNfaGwuanBnIj48L3A+DQotDQotPHA+SWYgdGhlIGF1dG9tYXRpYyBtb2RlIGlzIG5vdCBzZWxlY3RlZCB0aGVuIHRoZSB3aXphcmQNCi13aWxsIGRpcmVjdGx5IGp1bXAgdG8gdGhlIGxpYnJhcnkgc2VsZWN0aW9uIHBhZ2UuIEhvd2V2ZXIgaWYgdGhlIGF1dG9tYXRpYyBtb2RlIGlzIHNlbGVjdGVkIHRoZSB3aXphcmQgd2lsbCBzaG93IHRoZQ0KLWZvbGxvd2luZyBwYWdlPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9InNlcnZpY2VfcGFnZTRfcGxhaW4uSlBHIiB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCI+PC9wPg0KLTxwPlRoaXMgaXMgYSBzb21ld2hhdCBjb21wbGljYXRlZCBwYWdlLiBUaGUgc2VydmljZSBuYW1lIHRleHRib3ggc2hvdWxkIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhhdCB5b3UNCi13aXNoIHRvIGdpdmUgdGhpcyBzZXJ2aWNlLiANCi1Gb3IgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHR5cGUgaW4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGFuZCBoaXQgdGhlIGxvYWQgYnV0dG9uIHRvIHZpZXcgdGhlIG9wZXJhdGlvbnM8L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0ic2VydmljZV9wYWdlNF9sb2FkLkpQRyIgPjwvcD4NCi08cD4gVGhlIGxvYWRlZCBvcGVyYXRpb25zIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSB0YWJsZS4gT25jZSB0aGlzIGlzIGRpc3BsYXllZCB5b3UgY2FuIGZpbHRlciB0aGUgbWV0aG9kcyBieSBzZWxlY3RpbmcvZGVzZWxlY3RpbmcgdGhlIG1ldGhvZHMgdXNpbmcgdGhlIGNoZWNrYm94IGF0IGVhY2ggcm93LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPSJzZXJ2aWNlX3BhZ2U0X3RhYmxlLkpQRyIgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiPjwvcD4NCi08cD5GdXJ0aGVyIGZpbHRlcmluZyBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlICJzZWFyY2ggZGVjbGFyZWQgbWV0aG9kcyIgb25seSBjaGVja2JveDwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPSJzZXJ2aWNlX3BhZ2U0X3NlYXJjaF9kZWNsYXJlZC5KUEciID48L3A+DQotPHA+T25jZSB0aGUgbWV0aG9kIHNlbGVjdGlvbiBpcyBjb21wbGV0ZSB0aGUgd2l6YXJkIGhhcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYSBiYXNpYyBzZXJ2aWNlcy54bWwgZmlsZS4gSWYgZnVydGhlciBjdXN0b21pemF0aW9uIGlzIHJlcXVpcmVkLCB0aGVyZSdzIG5vIGNob2ljZSBidXQgdG8gbWFudWFsbHkgZWRpdCBpdCE8L3A+DQotDQotLS0+DQotPHA+PHN0cm9uZz5QYWdlIDQ6PC9zdHJvbmc+PC9wPg0KLTwhLS1TVEFSVC0tPg0KLTxwPlRoZSBuZXh0IHN0ZXAgaXMgdG8gYWRkIHRoZSBsaWJyYXJpZXMuIFRoZSBsaWJyYXJ5IGFkZGl0aW9uIHBhZ2UNCi1sb29rcyBsaWtlIHRoaXMgOjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlNS5qcGciIC8+PC9wPg0KLTxwPlRoZSBsaWJyYXJ5IG5hbWUgKHdpdGggZnVsbCBwYXRoKSBjYW4gYmUgZWl0aGVyIHR5cGVkIG9uIHRoZQ0KLXRleHQgYm94IG9yIGJyb3dzZWQgZm9yIHVzaW5nIHRoZSAiQnJvd3NlIiBidXR0b24uPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U1X2Jyb3dzZWQuanBnIiAvPjwvcD4NCi08cD5PbmNlIHRoZXJlIGlzIGEgbGlicmFyeSBuYW1lIHdpdGggZnVsbCBwYXRoIG9uIHRoZSB0ZXh0IGJveCwgaGl0DQotdGhlICJBZGQiIGJ1dHRvbiB0byBhZGQgdGhlIGxpYnJhcnkgdG8gdGhlIGxpc3QuIEFkZGVkIGxpYnJhcmllcw0KLXNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlICJBZGRlZCBsaWJyYXJpZXMiIGxpc3QgYm94LiBUaGlzIHdheSB5b3UNCi1jYW4gYWRkIGFzIG1hbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGFzIHlvdSB3aXNoLiBTZWUgdGhlIHNjcmVlbg0KLXNob3RzIGJlbG93LjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlNV9obC5qcGciIC8+PC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U1X2FkZGVkLmpwZyIgLz48L3A+DQotPHA+SWYgYW55IGFkZGVkIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVtb3ZlZCwgaGlnaGxpZ2h0IGl0IG9yIGluDQotb3RoZXIgd29yZHMsIHNlbGVjdCBpdCBmcm9tIHRoZSAiQWRkZWQgbGlicmFyaWVzIiBsaXN0IGFuZCBoaXQgb24NCi10aGUgIlJlbW92ZSIgYnV0dG9uIGFzIHNob3duIGJlbG93LiBDbGljayBvbiB0aGUgIk5leHQiIGJ1dHRvbiB0bw0KLXByb2NlZWQgdG8gdGhlIGxhc3QgcGFnZSBvZiB0aGUgd2l6YXJkIGlmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0DQotdG8gYXV0byBnZW5lcmF0ZSB0aGUgc2VydmljZXMueG1sIGZpbGUuIElmIHVzZXIgc2VsZWN0IHRvIGF1dG8NCi1nZW5lcmF0ZSB0aGUgc2VydmljZXMueG1sIGZpbGUgdGhlbiB0aGUgc2VydmljZXMueG1sIG9wdGlvbiBwYWdlDQotd2lsbCBiZSBkaXNwbGF5ZWQuPC9wPg0KLTxwIGFsaWduPSJjZW50ZXIiPjxpbWcgYm9yZGVyPSIwIiBzcmM9DQotImltYWdlcy9zZXJ2aWNlX3BhZ2U1X3JlbW92ZS5qcGciIC8+PC9wPg0KLTxwPjxzdHJvbmc+UGFnZSA1Ojwvc3Ryb25nPjwvcD4NCi08cD5UaGlzIHBhZ2Ugb25seSBhcHBlYXJzIGlmIHRoZSB1c2VyIHNlbGVjdCB0byBnZW5lcmF0ZSB0aGUNCi1zZXJ2aWNlcy54bWwgYXQgcGFnZSAzIG9mIHRoZSB3aXphcmQuIElmIHRoZSB1c2VyIGhhdmUgc2VsZWN0ZWQgYQ0KLXNlcnZpY2VzLnhtbCB0aGVuIHRoZSB1c2VyIHdpbGwgYmUgZGlyZWN0ZWQgdG8gdGhlIGxhc3QgcGFnZSBvZiB0aGUNCi13aXphcmQuPC9wPg0KLTxwPkFmdGVyIGVudGVyaW5nIHRoZSBjb3JyZWN0IHNlcnZpY2UgbmFtZSBhbmQgdmFsaWQgZnVsbHkNCi1xdWFsaWZpZWQgY2xhc3MgbmFtZSwgdHJ5IHRvIGxvYWQgdGhlIGV4aXN0aW5nIG1ldGhvZHMgb2YgdGhhdA0KLWNsYXNzIGJ5IGNsaWNraW5nIHRoZSBsb2FkIGJ1dHRvbi48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VfcGFnZTRfbG9hZC5qcGciIC8+PC9wPg0KLTxwPklmIHN1Y2Nlc3NmdWxseSBsb2FkZWQgdGhlIHVzZXIgd2lsbCBiZSBwcmVzZW50ZWQgd2l0aCBhIHRhYmxlDQotYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSB3aXRoIHRoZSBkZXRhaWxzIG9mIHRoZSBsb2FkZWQgY2xhc3MuIEJ5DQotY2hlY2tpbmcgYW5kIHVuY2hlY2tpbmcgdGhlIHVzZXIgY2FuIHNlbGVjdCB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMNCi10byBpbmNsdWRlIGluIHRoZSBzZXJ2aWNlcy54bWw8L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3NlcnZpY2VfcGFnZTRfdGFibGUuanBnIiAvPjwvcD4NCi08cD5CeSBjbGlja2luZyBvbiB0aGUgc2VhcmNoIGRlY2xhcmVkIG1ldGhvZCBvbmx5IGNoZWNrIGJveCwgdGhlDQotdXNlciBjYW4gcmVtb3ZlIHRoZSBpbmhlcml0ZWQgbWV0aG9kcyBmcm9tIHRoZSBjbGFzcy4gQ2xpY2sgb24gdGhlDQotIk5leHQiIGJ1dHRvbiB0byBwcm9jZWVkIHRvIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHdpemFyZDwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlNF9zZWFyY2hfZGVjbGFyZWQuanBnIiAvPjwvcD4NCi08cD48c3Ryb25nPlBhZ2UgNjo8L3N0cm9uZz48L3A+DQotPHA+VGhlIGxhc3QgcGFnZSBvZiB0aGUgd2l6YXJkIGFza3MgZm9yIHRoZSBvdXRwdXQgZmlsZSBsb2NhdGlvbg0KLWFuZCB0aGUgb3V0cHV0IGFyY2hpdmUgZmlsZSBuYW1lLiBUbyBiZSBhYmxlIHRvIGZpbmlzaCB0aGUgd2l6YXJkLA0KLXVzZXIgbXVzdCBlbnRlciB2YWxpZCBvdXRwdXQgZmlsZSBsb2NhdGlvbiBhbmQgb3V0cHV0IGZpbGUNCi1uYW1lLjwvcD4NCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIGJvcmRlcj0iMCIgc3JjPQ0KLSJpbWFnZXMvc2VydmljZV9wYWdlNi5qcGciIC8+PC9wPg0KLTxwPk9uY2UgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBmaWxsZWQsIGhpdCB0aGUgIkZpbmlzaCIgYnV0dG9uIHRvDQotY29tcGxldGUgdGhlIHdpemFyZCBhbmQgZ2VuZXJhdGUgdGhlIHNlcnZpY2UgYXJjaGl2ZS48L3A+DQotPHAgYWxpZ249ImNlbnRlciI+PGltZyBib3JkZXI9IjAiIHNyYz0NCi0iaW1hZ2VzL3N1Y2Nlc3NfbXNnLmpwZyIgLz48L3A+DQotPHA+SWYgeW91IHNlZSB0aGUgYWJvdmUgbWVzc2FnZSwgdGhlbiB5b3UndmUgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZA0KLXRoZSBzZXJ2aWNlIGFyY2hpdmUhIFRoaXMgc2VydmljZSBhcmNoaXZlIGNhbiBiZSBob3QgZGVwbG95ZWQNCi0oZGVwbG95ZWQgYXQgcnVuIHRpbWUpIHRvIHRoZSBheGlzMjwvcD4NCi08aDE+QXBwZW5kaXg8L2gxPg0KLTx1bD4NCi08bGk+RWNsaXBzZSByZWZlcmVuY2UgLSA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIgdGFyZ2V0PQ0KLSJfYmxhbmsiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9hPjwvbGk+DQotPGxpPkN1c3RvbSBBbnQgVGFza3MgLSA8YSBocmVmPQ0KLSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sPC9hPjwvbGk+DQotPC91bD4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi54bWwgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzYzYmRlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2VjbGlwc2Uvd3NkbDJqYXZhLXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiINCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4NCi08aGVhZD4NCi08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9DQotIkhUTUwgVGlkeSBmb3IgV2luZG93cyAodmVycyAxNCBKdW5lIDIwMDcpLCBzZWUgd3d3LnczLm9yZyIgLz4NCi08bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9IiIgLz4NCi08dGl0bGU+Q29kZSBHZW5lcmF0b3IgV2l6YXJkIEd1aWRlIGZvciBFY2xpcHNlIFBsdWctaW48L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4NCi08aDE+Q29kZSBHZW5lcmF0b3IgV2l6YXJkIEd1aWRlIGZvciBFY2xpcHNlIFBsdWctaW48L2gxPg0KLTxwPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlIHVzYWdlIG9mIHRoaXMgY29kZSBnZW5lcmF0b3IgcGx1Zy1pbg0KLWZvciBFY2xpcHNlLiBJbiBvdGhlciB3b3JkcywgdGhpcyBkb2N1bWVudCB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoDQotdGhlIG9wZXJhdGlvbnMgb2YgZ2VuZXJhdGluZyBhIFdTREwgZmlsZSBmcm9tIGEgSmF2YSBjbGFzcyBhbmQvb3INCi1nZW5lcmF0aW5nIGEgSmF2YSBjbGFzcyBmaWxlIGZyb20gYSBXU0RMIGZpbGUuPC9wPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5bRG93bmxvYWQgUGx1Z2luIFRvb2xdPC9hPjwvcD4NCi08aDI+Q29udGVudDwvaDI+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjaW5zdGFsbGF0aW9uIj5JbnN0YWxsYXRpb248L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI29wZXJhdGlvbjEiPk9wZXJhdGlvbiAtIFdTREwySmF2YTwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjb3BlcmF0aW9uMiI+T3BlcmF0aW9uIC0gSmF2YTJXU0RMPC9hPjwvbGk+DQotPC91bD4NCi08YSBuYW1lPSJpbnRybyIgaWQ9ImludHJvIj48L2E+DQotPGgyPkludHJvZHVjdGlvbjwvaDI+DQotPHA+VGhlIEF4aXMyIGNvZGUgZ2VuZXJhdG9yIGNvbWVzIGJ1aWx0LWluIHdpdGggYW4gPGEgaHJlZj0NCi0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+RWNsaXBzZTwvYT4gcGx1Zy1pbi4gVGhpcyBwbHVnLWluIGNhbiBiZQ0KLXVzZWQgdG8gZ2VuZXJhdGUgYSBXU0RMIGZpbGUgZnJvbSBhIGphdmEgY2xhc3MgKEphdmEyV1NETCkgYW5kL29yIGENCi1qYXZhIGNsYXNzIGZpbGUgZnJvbSBhIFdTREwgKFdTREwySmF2YSkuIEZpcnN0IHlvdSBuZWVkIHRvIGluc3RhbGwNCi10aGUgcGx1Zy1pbi4gVGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzIGFyZQ0KLWdpdmVuIGJlbG93LjwvcD4NCi08YSBuYW1lPSJpbnN0YWxsYXRpb24iIGlkPSJpbnN0YWxsYXRpb24iPjwvYT4NCi08aDI+SW5zdGFsbGF0aW9uPC9oMj4NCi08cD5PbmUgY2FuIGVhc2lseSA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5kb3dubG9hZDwvYT4gdGhlDQotcGx1Z2luPC9wPg0KLTxwPklmIG9uZSBuZWVkcyB0byBidWlsZCB0aGUgcGx1Zy1pbiBmcm9tIHNvdXJjZSwgTWF2ZW4yIGFuZCBBbnQNCi1idWlsZHMgYXJldmFpbGFiZS4gUGxlYXNlIHJlZmVyIHRoZSByZWFkbWUudHh0IGxvY2F0ZWQgYXQNCi1tb2R1bGUvdG9vbHMgb24gQXhpczIgc291cmNlLjwvcD4NCi08cD5PbmNlIHlvdSd2ZSBvYnRhaW5lZCB0aGUgcGx1Zy1pbiBqdXN0IHVuemlwIHRoZSBjb250ZW50IG9mIHRoZQ0KLXBsdWctaW4gYXJjaGl2ZSB0byB0aGUgRWNsaXBzZSBwbHVnLWluIGRpcmVjdG9yeSAoaWYgaXQgaXMgdGhlDQotemlwcGVkLWJpbmFyeSB2ZXJzaW9uKSBvciBjb3B5IHRoZSBuZWNlc3NhcnkgZm9sZGVycyB0byB0aGUgRWNsaXBzZQ0KLXBsdWctaW4gZGlyZWN0b3J5IGFuZCByZXN0YXJ0IEVjbGlwc2UuPC9wPg0KLTxwPjxzdHJvbmc+Tk9URTwvc3Ryb25nPiA6IFRoaXMgcGx1Zy1pbiB3b3JrcyBvbiBFY2xpcHNlIHZlcnNpb24NCi0zLjEgYW5kIHVwd2FyZHMsIGFsc28gdGhlIGphdmEgdmVyc2lvbiBzaG91bGQgYmUgMS40IG9yIGhpZ2hlci4gVGhlDQotcHJvdmlkZWQgc2NyZWVuIHNob3RzIG1heSBzbGlnaHRseSBkaWZmZXIgd2l0aCB3aGF0IHRoZSB1c2VyIHdvdWxkDQotYWN0dWFsbHkgc2VlIGJ1dCB0aGUgZnVuY3Rpb25hbGl0eSBoYXMgbm90IGJlZW4gY2hhbmdlZC48L3A+DQotPGEgbmFtZT0ib3BlcmF0aW9uMSIgaWQ9Im9wZXJhdGlvbjEiPjwvYT4NCi08aDI+T3BlcmF0aW9uIC0gV1NETDJKYXZhPC9oMj4NCi08cD5JZiB0aGUgcGx1Zy1pbiBpcyBwcm9wZXJseSBpbnN0YWxsZWQgeW91IHNob3VsZCBzZWUgYSBuZXcgd2l6YXJkDQotdW5kZXIgdGhlICJOZXciIHNlY3Rpb24uKHVzZSB0aGUgRmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIgb3IgQ3RybA0KLSsgTiApPC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy93c2RsMmphdmEtc2NyZWVuMC5wbmciIC8+PC9wPg0KLTxwPlNlbGVjdGluZyB0aGUgd2l6YXJkIGFuZCBwcmVzc2luZyB0aGUgIk5leHQiIGJ1dHRvbiB3aWxsIHN0YXJ0DQotdGhlIGNvZGUgZ2VuZXJhdG9yIHdpemFyZC4gRm9sbG93aW5nIGlzIHRoZSBmaXJzdCB3aXphcmQgcGFnZS48L3A+DQotPHA+PHN0cm9uZz5QYWdlIDE6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgc3JjPSJpbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjEucG5nIiAvPjwvcD4NCi08cD5TZWxlY3RpbmcgdGhlICJHZW5lcmF0ZSBKYXZhIHNvdXJjZSBjb2RlIGZyb20gV1NETCBmaWxlIiBvcHRpb24NCi1hbmQgY2xpY2tpbmcgIk5leHQiIGxlYWRzIHRvIHRoZSBmb2xsb3dpbmcgcGFnZS48L3A+DQotPHA+PHN0cm9uZz5XU0RMMkphdmEgUGFnZSAyIDo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL3dzZGwyamF2YS1zY3JlZW4yLnBuZyIgLz48L3A+DQotPHA+VG8gbW92ZSBvbiB0byB0aGUgbmV4dCBwYWdlIHRoZSBXU0RMIGZpbGUgbG9jYXRpb24gbXVzdCBiZQ0KLWdpdmVuLiBUaGUgIkJyb3dzZSIgYnV0dG9uIGNhbiBiZSB1c2VkIHRvIGVhc2lseSBicm93c2UgZm9yIGEgZmlsZQ0KLXJhdGhlciB0aGFuIHR5cGluZyB0aGUgd2hvbGUgcGF0aC48L3A+DQotPHA+PHN0cm9uZz5XU0RMMkphdmEgUGFnZSAzIDo8L3N0cm9uZz48L3A+DQotPHA+T25jZSB0aGUgV1NETCBmaWxlIGlzIHNlbGVjdGVkLCB0aGUgbmV4dCBwYWdlIHdpbGwgdGFrZSB5b3UgdG8NCi10aGUgcGFnZSBmcm9tIHdoZXJlIDxzdHJvbmc+Y29kZWdlbiBvcHRpb25zPC9zdHJvbmc+IGFyZSB0byBiZQ0KLXNlbGVjdGVkLiBCeSBmYXIgdGhpcyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFnZSBpbiB0aGlzIHdpemFyZC4NCi1UaGlzIHBhZ2UgZGV0ZXJtaW5lcyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBjb2RlIGJlaW5nDQotZ2VuZXJhdGVkLjwvcD4NCi08cD5Ob3ZpY2VzIG5lZWQgbm90IHdvcnJ5IGFib3V0IHRoZXNlIG9wdGlvbnMgc2luY2UgdGhlIG1vc3QgY29tbW9uDQotb3B0aW9ucyBhcmUgZGVmYXVsdGVkLCBidXQgYWR2YW5jZWQgdXNlcnMgd2lsbCBmaW5kIGl0IHZlcnkgZWFzeSB0bw0KLXR1cm4gdGhlIGtub2JzIHVzaW5nIHRoZXNlIG9wdGlvbnMuPC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy93c2RsMmphdmEtc2NyZWVuMy5wbmciIC8+PC9wPg0KLTxwPldoYXQgYWR2YW5jZWQgdXNlcnMgY2FuIGRvIGlzIHNlbGVjdCBjdXN0b20gZnJvbSB0aGUgc2VsZWN0DQotY29kZWdlbiBvcHRpb25zIGRyb3AgZG93biBsaXN0IGFuZCB0aGVuIGNoYW5nZS9lZGl0IHRoZSBmaWVsZHMgdGhhdA0KLXlvdSBuZWVkLjwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjMxLnBuZyIgLz48L3A+DQotPHA+T25jZSB0aGUgb3B0aW9ucyBhcmUgc2VsZWN0ZWQsIG9ubHkgdGhlIGZpbmFsIHN0ZXAgb2YgdGhlIGNvZGUNCi1nZW5lcmF0aW9uIGlzIGxlZnQgd2hpY2ggaXMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgb3V0cHV0IGZpbGUNCi1sb2NhdGlvbi48L3A+DQotPHA+PHN0cm9uZz5XU0RMMkphdmEgUGFnZSA0IDo8L3N0cm9uZz48L3A+DQotPHA+SGVyZSB5b3UgY2FuIHNlbGVjdCB0aGUgb3V0cHV0IGZpbGUgcGF0aCBieSB0eXBpbmcgb3IgYnJvd3NpbmcNCi11c2luZyB0aGUgIkJyb3dzZSIgYnV0dG9uLiBZb3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGJyb3dzaW5nIG9ubHkNCi1lY2xpcHNlIHdvcmtzcGFjZSBwcm9qZWN0cyBieSBzZWxlY3RpbmcgdGhlICJBZGQgdGhlIHNvdXJjZSB0byBhDQotcHJvamVjdCBvbiBjdXJyZW50IGVjbGlwc2Ugd29ya3NwYWNlIiByYWRpbyBidXR0b24uIE9yIGVsc2UgeW91DQotaGF2ZSB0aGUgb3B0aW9uIHRvIHNhdmUgdGhlIGNvZGVnZW4gcmVzdXRscyB0byBmaWxlIHN5c3RlbTwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQucG5nIiAvPjwvcD4NCi08cD5IZXJlIGFsc28geW91IGhhdmUgdGhlIG9wdGlvbiB0byBhZGQgc29tZSB2YWx1ZSB0byB0aGUgY29kZWdlbg0KLXJlc3VsdHMuIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhlIGNoZWNrIGJveCAiQWRkIEF4aXMyIGxpYnJhcmllcyB0bw0KLXRoZSBjb2RlZ2VuIHJlc3VsdCBwcm9qZWN0IiB0aGVuIGFsbCBvdGhlciBjb250cm9scyBiZWxvdyB3aWxsIGdldA0KLWVuYWJsZWQuIFdoYXQgeW91IGNhbiBkbyBpcyBwb2ludCB0aGUgZG93bmxvYWRlZCBBeGlzMl9IT01FDQotbG9jYXRpb24gdmlhIHRoZSAiQnJvd3NlIiBidXR0b24uIFRoZW4geW91IGNhbiB2ZXJpZnkgdGhlDQotYXZhaWxhYmlsaXR5IG9mIHRoZSBBeGlzMiBsaWJzIGJ5IGNsaWNraW5nIG9uIHRoZSAiQ2hlY2sgTGlicyINCi1idXR0b24uIElmIGFsbCBnb2VzIHdlbGwgdGhlbiB5b3UgY2FuIGFkZCB0aGUgYXhpcyAyIGxpYnMgdG8gdGhlDQotY29kZWdlbiByZXN1bHRzIGxvY2F0aW9uLiBBbm90aGVyIG9wdGlvbiBpcyBhdmFpbGFibGUgdG8gZ2VuZXJhdGUgYQ0KLWphciBmaWxlIGlmIHRoZSB1c2VyIG5lZWRzIHRvIGFkZCB0aGUgY29kZWdlbiByZXN1bHRzIHRvIGEgcHJvamVjdA0KLWFzIGEgY29tcGlsZWQgamFyIGZpbGUgdG8gdGhlIHNlbGVjdGVkIGxvY2F0aW9ucyBsaWIgZGlyZWN0b3J5LjwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvd3NkbDJqYXZhLXNjcmVlbjQxLnBuZyIgLz48L3A+DQotPHA+V2hlbiB0aGUgb3V0cHV0IGZpbGUgbG9jYXRpb24gaXMgc2VsZWN0ZWQsIHRoZSAiRmluaXNoIiBidXR0b24NCi13aWxsIGJlIGVuYWJsZWQuIENsaWNraW5nIHRoZSAiRmluaXNoIiBidXR0b24gd2lsbCBnZW5lcmF0ZSB0aGUNCi1jb2RlIGFuZCBhIG1lc3NhZ2UgYm94IHdpbGwgcG9wIHVwIGFja25vd2xlZGdpbmcgdGhlIHN1Y2Nlc3MuIFdlbGwNCi1Eb25lISBZb3UndmUgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBBeGlzMiBjb2RlIGdlbmVyYXRpb24uPC9wPg0KLTxhIG5hbWU9Im9wZXJhdGlvbjIiIGlkPSJvcGVyYXRpb24yIj48L2E+DQotPGgyPk9wZXJhdGlvbiAtIEphdmEyV1NETDwvaDI+DQotPHA+PHN0cm9uZz5QYWdlIDE6PC9zdHJvbmc+PC9wPg0KLTxwPkZvciB0aGlzIG9wZXJhdGlvbiB5b3UgbmVlZCB0byBzZWxlY3QgdGhlIG9wdGlvbiB3aGljaCBzYXlzDQotIkdlbmVyYXRlIGEgV1NETCBmcm9tIGEgSmF2YSBzb3VyY2UgZmlsZSI8L3A+DQotPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4wLnBuZyIgLz48L3A+DQotPHA+VGhlbiBjbGljayB0aGUgIk5leHQiIGJ1dHRvbiB3aGljaCB3aWxsIGxlYWQgdG8gdGhlIG5leHQgcGFnZQ0KLWJlbG93LjwvcD4NCi08cD48c3Ryb25nPkphdmEyV1NETCBQYWdlIDI6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgYm9yZGVyPSIwIiBzcmM9ImltYWdlcy9qYXZhMndzZGwtc2NyZWVuMS5wbmciIC8+PC9wPg0KLTxwPkluIHRoaXMgcGFnZSBvbmUgbmVlZHMgdG8gc2VsZWN0IHRoZSBjbGFzcyB0byBiZSBleHBvc2VkIGFuZCB0aGUNCi1yZWxldmFudCBqYXIgZmlsZXMgL2NsYXNzZXMgdG8gYmUgbG9hZGVkIGFzIHRoZSBjbGFzc3BhdGguIEFmdGVyDQotdGhlIGxpYnJhcmllcyBoYXZlIGJlZW4gc2V0LCB0aGUgIlRlc3QgQ2xhc3MgTG9hZGluZyIgYnV0dG9uIG11c3QNCi1iZSBjbGlja2VkIGluIG9yZGVyIHRvIHRlc3Qgd2hldGhlciB0aGUgY2xhc3MgaXMgbG9hZGFibGUuIFVubGVzcw0KLXRoZSBjbGFzcyBsb2FkaW5nIGlzIHN1Y2Nlc3NmdWwgcHJvY2VlZGluZyB0byB0aGUgIk5leHQiIGJ1dHRvbg0KLXdpbGwgbm90IGJlIGVuYWJsZWQuPC9wPg0KLTxwPk9uY2UgdGhlIGNsYXNzbG9hZGluZyBpcyBzdWNjZXNzZnVsIGFuZCAiTmV4dCIgYnV0dG9uIGlzIGNsaWNrZWQNCi10aGUgcGFnZSBiZWxvdyB3aWxsIGFwcGVhci48L3A+DQotPHA+PHN0cm9uZz5KYXZhMldTREwgUGFnZSAzOjwvc3Ryb25nPjwvcD4NCi08cD5UaGlzIHBhZ2UgYWxsb3dzIHRoZSBwYXJhbWV0ZXJzIHRvIGJlIG1vZGlmaWVkIGJ5IHNldHRpbmcgdGhlDQotb3B0aW9ucyBmb3IgdGhlIGdlbmVyYXRvci48L3A+DQotPHA+PGltZyBib3JkZXI9IjAiIHNyYz0iaW1hZ2VzL2phdmEyd3NkbC1zY3JlZW4yLnBuZyIgLz48L3A+DQotPHA+PHN0cm9uZz5KYXZhMldTREwgUGFnZSA0Ojwvc3Ryb25nPjwvcD4NCi08cD5IZXJlIHlvdSBjYW4gc2VsZWN0IHRoZSBvdXRwdXQgZmlsZSBwYXRoIGJ5IHR5cGluZyBvciBicm93c2luZw0KLXVzaW5nIHRoZSAiQnJvd3NlIiBidXR0b24uIFlvdSBoYXZlIHRoZSBvcHRpb24gb2YgYnJvd3Npbmcgb25seQ0KLUVjbGlwc2Ugd29ya3NwYWNlIHByb2plY3RzIGJ5IHNlbGVjdGluZyB0aGUgIkFkZCB0aGUgc291cmNlIHRvIGENCi1wcm9qZWN0IG9uIGN1cnJlbnQgZWNsaXBzZSB3b3Jrc3BhY2UiIHJhZGlvIGJ1dHRvbiAuIE9yIGVsc2UgeW91DQotaGF2ZSB0aGUgb3B0aW9uIHRvIHNhdmUgdGhlIGNvZGVnZW4gcmVzdXRscyB0byBmaWxlIHN5c3RlbS4gT25jZQ0KLXRoZSBvdXRwdXQgZmlsZSBsb2NhdGlvbiBhbmQgdGhlIG91dHB1dCBXU0RMIGZpbGUgbmFtZSBpcyBhZGRlZCB5b3UNCi1jYW4gY2xpY2sgdGhlICJGaW5pc2giIGJ1dHRvbiB0byBjb21wbGV0ZSBnZW5lcmF0aW9uLjwvcD4NCi08cD48aW1nIGJvcmRlcj0iMCIgc3JjPSJpbWFnZXMvamF2YTJ3c2RsLXNjcmVlbjMucG5nIiAvPjwvcD4NCi08cD5JZiBhIG1lc3NhZ2UgYm94IHBvcHMgdXAgYWNrbm93bGVkZ2luZyB0aGUgc3VjY2VzcywgdGhlbiB5b3UndmUNCi1zdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSBKYXZhMldTREwgY29kZSBnZW5lcmF0aW9uLjwvcD4NCi08aDE+QXBwZW5kaXg8L2gxPg0KLTx1bD4NCi08bGk+RWNsaXBzZSByZWZlcmVuY2UgLSA8YSBocmVmPQ0KLSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L2E+PC9saT4NCi08bGk+Q3VzdG9tIEFudCBUYXNrcyAtIDxhIGhyZWY9DQotImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbDwvYT48L2xpPg0KLTwvdWw+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9JZGVhX3BsdWctaW5fdXNlcmd1aWRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEzZDUwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL0lkZWFfcGx1Zy1pbl91c2VyZ3VpZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PQ0KLSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+DQotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+DQotPHRpdGxlPkF4aXMyIFBsdWctaW4gR3VpZGUgZm9yIEludGVsbGlKIElERUE8L3RpdGxlPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iQmx1ZWZpc2ggMS4wLjYiIC8+DQotPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPg0KLTxoMT5BeGlzMiBQbHVnLWluIEd1aWRlIGZvciBJbnRlbGxpSiBJREVBPC9oMT4NCi08cD5UaGlzIGRvY3VtZW50IGV4cGxhaW5zIHRoZSBpbnN0YWxsYXRpb24gYW5kIHVzYWdlIG9mIEF4aXMyDQotcGx1Zy1pbiBmb3IgSW50ZWxsaUogSURFQS48L3A+DQotPHA+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCI+W0Rvd25sb2FkDQotUGx1Zy1pbl08L2E+PC9wPg0KLTxoMj5Db250ZW50PC9oMj4NCi08dWw+DQotPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNpbnN0YWxsYXRpb24iPkluc3RhbGxhdGlvbjwvYT48L2xpPg0KLTxsaT48YSBocmVmPSIjV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiI+V1NETDJKYXZhIENvZGUNCi1HZW5lcmF0aW9uPC9hPjwvbGk+DQotPGxpPjxhIGhyZWY9IiNDcmVhdGVfU2VydmljZV9BcmNoaXZlIj5DcmVhdGUgYSBTZXJ2aWNlIEFyY2hpdmU8L2E+DQotPHVsPg0KLTxsaT48YSBocmVmPSIjc3ViMTIiPlN1YiBXaXphcmQgMSAmYW1wOyBTdWIgV2l6YXJkIDI8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI3N1YjMiPlN1YiBXaXphcmQgMzwvYT48L2xpPg0KLTwvdWw+DQotPC9saT4NCi08L3VsPg0KLTxhIG5hbWU9ImludHJvIiBpZD0iaW50cm8iPjwvYT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5UaGUgQXhpczIgcGx1Zy1pbiBmb3IgSW50ZWxsaUogSURFQSBoZWxwcyB1c2VycyB0byBjcmVhdGUNCi1zZXJ2aWNlIGFyY2hpdmVzIHdoaWNoIGNhbiBiZSBkZXBsb3llZCBpbiBBeGlzMiwgYW5kIGdlbmVyYXRlIGphdmENCi1jbGFzc2VzIGZpbGVzIGZyb20gV1NETCBmaWxlcy4gVGhlIGZvbGxvd2luZyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUNCi1pbnN0YWxsYXRpb24gcHJvY2VkdXJlIGZvbGxvd2VkIGJ5IHRoZSB1c2FnZSBvZiB0aGUgcGx1Zy1pbi48L3A+DQotPHA+PGI+Tm90ZTo8L2I+IFRoaXMgcGx1Zy1pbiBpcyBtYWRlIHVwIHdpdGggPGEgaHJlZj0NCi0iaHR0cDovL2FwaWRvYy5vcmcvZG9jc2V0LzE2Ij5JREVBIE9wZW4gQVBJPC9hPiB3aGljaCB3aWxsIGJlDQotY29tcGF0aWJsZSB3aXRoIGlkZWEgdmVyc2lvbiBzaW5jZSBidWlsZCA0MTIxLiBUaGUgcGx1Z2luIGFsc28gYmUNCi1jb21wYXRpYmxlIHdpdGggYWxsIHRoZSBidWlsZHMgYWZ0ZXIgYnVpbGQgbnVtYmVyIDQxMjEgYW5kIGFsc28gdGhlDQotamF2YSB2ZXJzaW9uIHNob3VsZCBiZSAxLjQgb3IgaGlnaGVyLiBUaGUgcHJvdmlkZWQgc2NyZWVuIHNob3RzIG1heQ0KLXNsaWdodGx5IGRpZmZlciB3aXRoIHdoYXQgdGhlIHVzZXIgd291bGQgYWN0dWFsbHkgc2VlIGJ1dCB0aGUNCi1mdW5jdGlvbmFsaXR5IGhhcyBub3QgYmVlbiBjaGFuZ2VkLjwvcD4NCi08YSBuYW1lPSJpbnN0YWxsYXRpb24iIGlkPSJpbnN0YWxsYXRpb24iPjwvYT4NCi08aDI+SW5zdGFsbGF0aW9uPC9oMj4NCi08cD5GaXJzdCA8YSBocmVmPQ0KLSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIj5kb3dubG9hZDwvYT4gdGhlDQotcGx1Zy1pbiB3aGljaCBpcyBhIHppcHBlZCBmaWxlLCBhbmQgZXh0cmFjdCBpdCBpbnRvIHBsdWdpbnMNCi1kaXJlY3Rvcnkgd2hpY2ggaXMgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIElERUEgaXMNCi1pbnN0YWxsZWQuIElmIGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgcGx1Zy1pbiByZXNpZGVzIGluIHRoaXMNCi1kaXJlY3RvcnkgeW91IHdpbGwgaGF2ZSB0byBkZWxldGUgaXQgcHJpb3IgdG8gZXh0cmFjdGluZyB0aGUgbmV3DQotemlwIGZpbGUuIElmIHlvdSBoYXZlIGV4dHJhY3RlZCB0aGUgZmlsZSBjb3JyZWN0bHkgeW91IHdvdWxkIHNlZSBhDQotZGlyZWN0b3J5IGNhbGxlZCBheGlzMi1pZGVhLXBsdWdpbi48L3A+DQotPHA+TmV4dCBzdGVwIGlzIHRvIHJlc3RhcnQgSURFQSBzbyB0aGF0IHRoZSBjaGFuZ2VzIGNhbiB0YWtlIHBsYWNlLg0KLUlmIHRoZSBwbHVnLWluIGhhcyBiZWVuIGluc3RhbGxlZCBjb3JyZWN0bHksIHlvdSB3aWxsIHNlZSBmb2xsb3dpbmcNCi1pY29ucyBpbiBJREVBIHdoZW4gaXQgaXMgcmVzdGFydGVkLjwvcD4NCi08cD48aW1nIGFsdD0iRmlndXJlIDEiIHNyYz0iaW1hZ2VzL2lkZWEtaWNvbnMuanBnIiAvPjwvcD4NCi08cD5BbHNvIGlmIHlvdSByaWdodC1jbGljayBvbiB0aGUgSURFQSBlZGl0b3IgeW91IHdvdWxkIHNlZSBhIGxpbmsNCi10byB0aGUgc2FtZSBwbHVnLWluLjwvcD4NCi08cD48aW1nIGFsdD0iRmlndXJlMiIgc3JjPSJpbWFnZXMvaWRlYS1wb3B1cC5qcGciIC8+PC9wPg0KLTxwPldoZW4geW91IGNsaWNrIG9uIGVpdGhlciBvbmUgb2YgdGhlbSwgYSB3aW5kb3cgKFBhZ2UgMSkgd2lsbA0KLWFwcGVhciBhc2tpbmcgeW91IHRvIHNlbGVjdCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gb3B0aW9ucy48L3A+DQotPG9sPg0KLTxsaT48YSBocmVmPSIjQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSI+Q3JlYXRlIGEgc2VydmljZQ0KLWFyY2hpdmU8L2E+PC9saT4NCi08bGk+PGEgaHJlZj0iI1dTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iPldTREwySmF2YSBjb2RlDQotZ2VuZXJhdGlvbjwvYT48L2xpPg0KLTwvb2w+DQotPHA+PHN0cm9uZz5QYWdlIDE6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgYWx0PSJGaWd1cmUzIiBzcmM9ImltYWdlcy9maWcxLmpwZyIgLz48L3A+DQotPHA+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgc2VydmljZSBhcmNoaXZlIG9idmlvdXNseSB5b3UgbXVzdA0KLXNlbGVjdCAiQ3JlYXRlIGEgc2VydmljZSBhcmNoaXZlIiBvcHRpb24uIExpa2Ugd2lzZSwgaWYgdSB3YW50IHRvDQotZ2VuZXJhdGUgamF2YSBjbGFzcyBmaWxlIGZyb20gYSBXU0RMIGZpbGUgeW91IG11c3Qgc2VsZWN0IHRoZSByYWRpbw0KLWJ1dHRvbiBvcHRpb24gIldTREwySmF2YSBjb2RlIGdlbmVyYXRpb24iLjwvcD4NCi08aDI+PGEgbmFtZT0iV1NETDJKYXZhX0NvZGVfR2VuZXJhdGlvbiIgaWQ9DQotIldTREwySmF2YV9Db2RlX0dlbmVyYXRpb24iPldTREwySmF2YSBDb2RlIEdlbmVyYXRpb248L2E+PC9oMj4NCi08cD5TZWxlY3QgIldTREwySmF2YSBjb2RlIGdlbmVyYXRpb24iIGFuZCBjbGljayBvbiB0aGUgYnV0dG9uICJPSyINCi10byBnZW5lcmF0ZSBjb2RlIGZyb20gYSBXU0RMIGZpbGUuIFRoZW4gdGhlIGZvbGxvd2luZyB3aW5kb3cgd2lsbA0KLWFwcGVhci48L3A+DQotPHA+PHN0cm9uZz5XU0RMMkphdmEgUGFnZSAyOjwvc3Ryb25nPjwvcD4NCi08cD48aW1nIGFsdD0iRmlndXJlNCIgc3JjPSJpbWFnZXMvZmlnMi5qcGciIC8+PC9wPg0KLTxwPk9uY2UgdGhlIFdTREwgZmlsZSBpcyBzZWxlY3RlZCB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1vdmUgb250byB0aGUNCi1uZXh0IHBhZ2UuIFRoZSAiQnJvd3NlIiBidXR0b24gY2FuIGJlIHVzZWQgdG8gZWFzaWx5IGJyb3dzZSBmb3IgYQ0KLWZpbGUgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHR5cGUgdGhlIHdob2xlIHBhdGguPC9wPg0KLTxwPk9uY2UgdGhlIFdTREwgZmlsZSBpcyBzZWxlY3RlZCwgY2xpY2sgb24gdGhlICJOZXh0IiBidXR0b24gd2hpY2gNCi13aWxsIHRha2UgeW91IHRvIHRoZSBwYWdlIGJlbG93LjwvcD4NCi08cD48c3Ryb25nPldTREwySmF2YSBQYWdlIDM6PC9zdHJvbmc+PC9wPg0KLTxwPlRoaXMgcGFnZSBnaXZlcyB0aGUgdXNlciB0aGUgb3B0aW9uIG9mIHNlbGVjdGluZyBkZWZhdWx0IG9yDQotY3VzdG9tIGNvZGUgZ2VuZXJhdGlvbiBvcHRpb25zLiBUaGVyZSBhcmUgdGhyZWUgZGVmYXVsdCBjb2RlDQotZ2VuZXJhdGlvbiBvcHRpb25zIGluIGFsbC4gVGhlIGZpcnN0IGVuYWJsZXMgdGhlIHVzZXIgdG8gZ2VuZXJhdGUNCi1ib3RoIGNsaWVudCBhbmQgc2VydmVyIGNvZGUgdW5kZXIgZGVmYXVsdCBjb25maWd1cmF0aW9ucyB3aGlsZSB0aGUNCi1zZWNvbmQgZ2VuZXJhdGVzIGp1c3QgdGhlIGNsaWVudCBzaWRlIHVuZGVyIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuDQotVGhlIHRoaXJkIG9wdGlvbiBnZW5lcmF0ZXMgc2VydmVyIHNpZGUgY29kZSB1bmRlciBkZWZhdWx0DQotY29uZmlndXJhdGlvbnMuPC9wPg0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz48L3A+DQotPHVsPg0KLTxsaT5XaGVuIGNsaWVudCBzaWRlIGNvZGUgaXMgZ2VuZXJhdGVkIHVuZGVyIGRlZmF1bHQgY29uZmlndXJhdGlvbnMNCi1pdCBnZW5lcmF0ZXMgdGhlIHN0dWIsIGNvbXBpbGVzIGl0LCBwYWNrYWdlcyBpdCBhcyBhIGphciAodGhlIG5hbWUNCi1vZiB0aGUgamFyIHdpbGwgYmUgJmx0O3NlcnZpY2UgbmFtZSAmZ3Q7LWphcikgcGxhY2VzIGl0IGluIGEgbGliDQotZm9sZGVyIChJZiB0aGVyZSBpcyBubyBsaWIgZm9sZGVyLCBpdCBpcyBjcmVhdGVkKSB1bmRlciB0aGUgSURFQQ0KLXByb2plY3QgdGhhdCBpcyBvcGVuZWQuIFRoaXMgamFyIHRoYXQncyBnZW5lcmF0ZWQgd2lsbCBhbHNvIGJlDQotYWRkZWQgYXMgYSBwcm9qZWN0IGxpYnJhcnkgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIElERUEgcHJvamVjdC48L2xpPg0KLTxsaT5XaGVuIHNlcnZlciBjb2RlIGlzIGdlbmVyYXRlZCB1bmRlciBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIGl0DQotZ2VuZXJhdGVzIHRoZSBzZXJ2ZXIgc2lkZSBjb2RlIGFuZCBhbHNvIGdlbmVyYXRlcyBhIGRlZmF1bHQNCi1zZXJ2aWNlLnhtbC4gVGhlIHVzZXIgd2lsbCB0aGVuIGJlIHRha2VuIHRvIHBhZ2UgNS48L2xpPg0KLTxsaT5XaGVuIGJvdGggc2VydmVyIGFuZCBjbGllbnQgc2lkZSBpcyBnZW5lcmF0ZWQgdW5kZXIgZGVmYXVsdA0KLWNvbmZpZ3VyYXRpb25zIHRoZSBjbGllbnQgc3R1YiBpcyBhZGRlZCBhcmUgYSBqYXIgdG8gdGhlIGN1cnJlbnQNCi1JREVBIHByb2plY3QgYW5kIHRoZSB1c2VyIGlzIHRha2VuIHRvIHBhZ2UgNS48L2xpPg0KLTwvdWw+DQotPHA+PGltZyBhbHQ9IkZpZ3VyZTUiIHNyYz0iaW1hZ2VzL2ZpZzE5LmpwZyIgLz48L3A+DQotPHA+PHN0cm9uZz5XU0RMMkphdmEgUGFnZSA0Ojwvc3Ryb25nPjwvcD4NCi08cD48c3Ryb25nPkNvZGVnZW4gb3B0aW9uczwvc3Ryb25nPiBhcmUgdG8gYmUgc2VsZWN0ZWQgaGVyZS4gQnkgZmFyDQotdGhpcyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFnZSBpbiB0aGlzIHdpemFyZCwgd2hpY2ggZGV0ZXJtaW5lcw0KLXRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNvZGUgYmVpbmcgZ2VuZXJhdGVkLjwvcD4NCi08cD48aW1nIGFsdD0iRmlndXJlNSIgc3JjPSJpbWFnZXMvZmlnMTguanBnIiAvPjwvcD4NCi08cD48c3Ryb25nPkhlcmUncyBzb21lIGluZm9ybWF0aW9uIG9uIHRoZSBvcHRpb25zIGZvcg0KLXNlbGVjdGlvbjo8L3N0cm9uZz48L3A+DQotPHVsPg0KLTxsaT5PdXRwdXQgbGFuZ3VhZ2UgY2FuIGJlIEphdmEsIEMjLiBCdXQgd2UgaGF2ZSBub3QgZnVsbHkgdGVzdGVkDQotQyMgY29kZWdlbmVyYXRpb24sIHRoZXJlZm9yZSwgaXQgaXMgYmV0dGVyIHRvIHNlbGVjdCBKYXZhIGFzIG91dHB1dA0KLWxhbmd1YWdlLjwvbGk+DQotPGxpPklmIHRoZSBXU0RMIGNvbXByaXNlcyBvZiBzZXZlcmFsIHNlcnZpY2VzLCB0aGUgdXNlciBjYW4gc2VsZWN0DQotdGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRoZSBjb2RlIHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yLjwvbGk+DQotPGxpPklmIHRoZSBXU0RMIGNvbXByaXNlcyBvZiBzZXZlcmFsIHBvcnRzIGZvciBhIHBhcnRpY3VsbGFyDQotc2VydmljZSwgdGhlIHVzZXIgY2FuIHNlbGVjdCB0aGUgcG9ydCB3aGljaCB0aGUgY29kZSBzaG91bGQgYmUNCi1nZW5lcmF0ZWQgZm9yLjwvbGk+DQotPGxpPlRoZSBkZWZhdWx0IGRhdGEgYmluZGluZyB0eXBlIGlzIGFkYiAoQXhpczIgRGF0YSBCaW5kaW5nKS4NCi1BbHRob3VnaCB0aGUgdG9vbCBpcyBjYXBhYmxlIG9mIHByb3ZpZGluZyBYTUwgYmVhbnMsIGR1ZSB0byBjbGFzcw0KLWxvYWRpbmcgaXNzdWVzIGluIFhNTCBiZWFucywgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGdlbmVyYXRlDQotY29kZSB3aXRoIE9NIGFuZCBBREIuPC9saT4NCi08bGk+QXMgZm9yIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLCB5b3UgY2FuIHNldCB0aGUNCi1uYW1lIGFzIHlvdSB3aXNoLjwvbGk+DQotPGxpPlVzZXJzIGNhbiBzZWxlY3QgdGhlIG9uZSBvdXQgb2YgdGhlIHRocmVlIG9wdGlvbnMtICJHZW5lcmF0ZQ0KLUNsaWVudCBTaWRlIiwgIkdlbmVyYXRlIFNlcnZlciBTaWRlIiBhbmQgIkdlbmVyYXRlIEFsbCIuIFRoZSB1c2VyDQotd2lsbCBiZSBhYmxlIHRvIHNlbGVjdCBmdXJ0aGVyIG9wdGlvbnMgYmFzZWQgb24gaGlzIG9wdGlvbnMNCi1zZWxlY3RlZCBoZXJlLiBUaGVzZSBzdWIgb3B0aW9ucyBhcmUgZXhwbGFpbmVkIGJlbG93LjwvbGk+DQotPGxpIHN0eWxlPSJsaXN0LXN0eWxlOiBub25lOyBkaXNwbGF5OiBpbmxpbmUiPg0KLTx1bD4NCi08bGk+SWYgdXNlciBzZWxlY3RzICJHZW5lcmF0ZSBDbGllbnQgU2lkZSIsIGhlIGNhbiBmdXJ0aGVyIHNlbGVjdA0KLXRoZSBzZXJ2aWNlIGludm9jYXRpb24gc3R5bGUuIFNpbmNlIEF4aXMyIHN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMNCi1hbmQgYXN5bmNocm9ub3VzIGNsaWVudCBwcm9ncmFtbWluZyBtb2RlbCwgdGhlIHRvb2wgaGFzIHByb3ZpZGVkIGENCi13YXkgdG8gc2VsZWN0aW5nIHRoZSBpbnZvY2F0aW9uIHN0eWxlLjwvbGk+DQotPGxpPklmIHVzZXIgc2VsZWN0cyAiR2VuZXJhdGUgU2VydmVyIFNpZGUiLCBoZSBjYW4gYWxzbyBnZW5lcmF0ZSBhDQotZGVmYXVsdCBzZXJ2aWNlIFhNTCBmaWxlLiBJZiB0aGUgdXNlciBzZWxlY3RzICJHZW5lcmF0ZSBhbg0KLWludGVyZmFjZSBmb3Igc2tlbGV0b24iIG9wdGlvbiB0aGVuIGl0IG9ubHkgZ2VuZXJhdGVzIGFuIGludGVyZmFjZQ0KLWZvciB0aGUgc2VydmVyIHNpZGUuIElmIHNvIHRoZSB1c2VyIGhhcyB0byBpbXBsZW1lbnQgdGhpcw0KLWludGVyZmFjZS4gSWYgdGhpcyBvcHRpb24gaXMgbm90IHNlbGVjdGVkLCB0aGUgc2tlbGV0b24gY2xhc3MgaXMNCi1nZW5lcmF0ZWQsIHdoaWNoIHRoZSB1c2VyIGNhbiBmaWxsIGluIGxhdGVyIG9uLjwvbGk+DQotPGxpPklmIHVzZXIgc2VsZWN0cyAiR2VuZXJhdGUgQWxsIiBvcHRpb24sIHRoZW4gYWxsIHRoZSBjbGFzc2VzDQotd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHJlZmVyZW5jZWQgc2NoZW1hcyBieSB0aGUgV1NETA0KLWlycmVzcGVjdGl2ZSBvZiBlbGVtZW50cyByZWZlcnJlZCBieSB0aGUgV1NETCwgYWxvbmcgd2l0aCB0aGUNCi1jbGllbnQgc2lkZSBjb2RlLjwvbGk+DQotPC91bD4NCi08L2xpPg0KLTxsaT5UaGUgZGFmYXVsdCBiZWhhdmlvdXIgb2YgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIHRvIG1hcA0KLW5hbWVzcGFjZXMgdG8gcGFja2FnZSBuYW1lcyBsb2dpY2FsbHksIGJ1dCBpZiB0aGUgdXNlciB3aXNoZXMgdG8NCi1jaGFuZ2UgdGhlIHBhY2thZ2UgbmFtZXMgb2YgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLCBoZSBjYW4gZG8gc28gYnkNCi1jaGFuZ2luZyB0aGUgdmFsdWVzIGluIHRoZSBOYW1lc3BhY2UgdG8gUGFja2FnZW5hbWUgbWFwcGluZw0KLXRhYmxlLjwvbGk+DQotPC91bD4NCi08cD5XaXRoIHRoZXNlIGVuaGFuY2VkIG9wdGlvbnMgbm92aWNlcyBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGUNCi1vcHRpb25zIHRoYXQgY2FuIGJlIHNldCBhcyB0aGUgZGVmYXVsdCBvcHRpb25zIGNvdmVyIHRoZSBtb3N0DQotY29tbW9uIGNhc2VzLiBBZHZhbmNlZCB1c2VycyB3aWxsIGZpbmQgaXQgdmVyeSBlYXN5IHRvIHR1cm4gdGhlDQota25vYnMgdXNpbmcgdGhlIGN1c3RvbSBnZW5lcmF0aW9uIG9wdGlvbi48L3A+DQotPHA+PHN0cm9uZz5XU0RMMkphdmEgUGFnZSA1Ojwvc3Ryb25nPjwvcD4NCi08cD48aW1nIGFsdD0iRmlndXJlNiIgc3JjPSJpbWFnZXMvZmlnMy5qcGciIC8+PC9wPg0KLTxwPkhlcmUgdXNlcyBoYXZlIHRoZSBvcHRpb24gb2YgYWRkaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBkaXJlY3RseQ0KLXRvIHRoZWlyIHdvcmtpbmcgSURFQSBwcm9qZWN0IG9yIGNob29zZSBhIGN1c3RvbSBsb2NhdGlvbi4gSWYgdGhlDQotdXNlciBkZWNpZGVzIHRvIGFkZCBpdCB0byB0aGUgY3VycmVudCBJREVBIHByb2plY3QgaGUvc2hlIHdpbGwgaGF2ZQ0KLXRvIGNob29zZSB0aGUgbW9kdWxlIGFuZCB0aGUgc291cmNlIGRpcmVjdG9yeSB0aGF0IHRoZSBjb2RlIHNob3VsZA0KLWJlIGdlbmVyYXRlZCB0by48L3A+DQotPHA+QWx0ZXJuYXRpdmVseSB0aGUgdXNlciBjYW4gYnJvd3NlIGFuZCBzZWxlY3QgdGhlIG91dHB1dA0KLWxvY2F0aW9uL3BhdGggKHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUgY29kZSBpcyB0byBiZSBnZW5lcmF0ZWQpDQotdXNpbmcgdGhlICJCcm93c2UiIGJ1dHRvbi4gQmVjYXVzZSBvZiB0aGUgIkJyb3dzZSIgYnV0dG9uIHlvdSBkbw0KLW5vdCBuZWVkIHRvIHR5cGUgaW4gdGhlIG91dHB1dCBmaWxlIHBhdGguPC9wPg0KLTxwPjxpbWcgYWx0PSJGaWc0IiBzcmM9ImltYWdlcy9maWc0LmpwZyIgLz48L3A+DQotPHA+T25jZSBhbiBvdXRwdXQgbG9jYXRpb24gaXMgc2VsZWN0ZWQgeW91IGNhbiBjbGljayBvbiAiRmluaXNoIg0KLWJ1dHRvbiB3aGljaCB3aWxsIGdlbmVyYXRlIHRoZSBqYXZhIGNsYXNzIGZpbGUuIElmIGNvZGUgZ2VuZXJhdGlvbg0KLWlzIHN1Y2Nlc3NmdWwgdGhlbiBhIG1lc3NhZ2UgYm94IHdpbGwgYXBwZWFyIGFja25vd2xlZGdpbmcgdGhpcw0KLWZhY3QgYSBzaG93biBhYm92ZS48L3A+DQotPHA+PGEgbmFtZT0iQ3JlYXRlX1NlcnZpY2VfQXJjaGl2ZSIgaWQ9DQotIkNyZWF0ZV9TZXJ2aWNlX0FyY2hpdmUiPjwvYT48L3A+DQotPGgyPkNyZWF0ZSBhIFNlcnZpY2UgQXJjaGl2ZTwvaDI+DQotPHA+U2VsZWN0IHRoZSAiQ3JlYXRlIGEgc2VydmljZSBhcmNoaXZlIiByYWRpbyBidXR0b24gb24gUGFnZSAxIG9mDQotQXhpczIgSURFQSBwbHVnLWluIHdpemFyZC48L3A+DQotPHA+PHN0cm9uZz5QYWdlIDE6PC9zdHJvbmc+PC9wPg0KLTxwPjxpbWcgYWx0PSJGaWc1IiBzcmM9ImltYWdlcy9maWcxLmpwZyIgLz48L3A+DQotPHA+PHN0cm9uZz5TZXJ2aWNlIEFyY2hpdmUgUGFnZSAyOjwvc3Ryb25nPjwvcD4NCi08cD5UaGUgcGFnZSBiZWxvdyB3aWxsIGFwcGVhciBhc2tpbmcgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBhcmNoaXZlDQotdHlwZTwvcD4NCi08cD48aW1nIGFsdD0iZmlnNiIgc3JjPSJpbWFnZXMvZmlnNi5qcGciIC8+PC9wPg0KLTxwPkluIEF4aXMyLCB0aGUgdXNlciBjYW4gZGVwbG95IGEgc2luZ2xlIHNlcnZpY2Ugb3IgYSBzZXJ2aWNlDQotZ3JvdXAuIFRoZXJlZm9yZSwgeW91IGNhbiBzZWxlY3QgZWl0aGVyICJTaW5nbGUgc2VydmljZSBhcmNoaXZlIiBvcg0KLSJTZXJ2aWNlIGdyb3VwIGFyY2hpdmUiIGZvciB0aGUgYXJjaGl2ZSB0eXBlIHlvdSB3YW50IHRvDQotY3JlYXRlLjwvcD4NCi08cD5JZiB5b3UgYWxyZWFkeSBoYXZlIGEgc2VydmljZXMueG1sIHlvdSBjYW4gc2tpcCBzb21lIG9mIHRoZQ0KLXN0ZXBzIGluIHRoZSB3aXphcmQgYnkgc2VsZWN0aW5nIHRoZSByYWRpbyBidXR0b24gb3B0aW9uICJJIGFscmVhZHkNCi1oYXZlIHNlcnZpY2VzLnhtbCIgYW5kIGNsaWNraW5nIG9uICJOZXh0IiBidXR0b24uIElmIHlvdSBkbyBub3QNCi1oYXZlIHRoZSBzZXJ2aWNlcy54bWwsIHNlbGVjdCB0aGUgcmFkaW8gYnV0dG9uIG9wdGlvbiAiR2VuZXJhdGUNCi1zZXJ2aWNlcy54bWwiIGFuZCBjbGljayBvbiB0aGUgIk5leHQiIGJ1dHRvbiwgaW4gd2hpY2ggY2FzZSB0aGUNCi10b29sIHdpbGwgY3JlYXRlIHRoZSBzZXJ2aWNlcy54bWwgZm9yIHlvdS48L3A+DQotPHA+RGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zIHlvdSBzZWxlY3RlZCBvbiB0aGlzIHBhZ2UgdGhlcmUgY2FuIGJlDQotdGhyZWUgc3ViIHdpemFyZHM6PC9wPg0KLTxvbD4NCi08bGk+PGEgaHJlZj0iI3N1YjEyIj5TdWIgd2l6YXJkIDE8L2E+IChHZW5lcmF0ZSBzaW5nbGUgc2VydmljZSBhbmQNCi1pdHMgc2VydmljZXMueG1sKTwvbGk+DQotPGxpPjxhIGhyZWY9IiNzdWIxMiI+U3ViIHdpemFyZCAyPC9hPiAoR2VuZXJhdGUgc2VydmljZSBncm91cCBhbmQNCi1pdHMgc2VydmljZXMueG1sKTwvbGk+DQotPGxpPjxhIGhyZWY9IiNzdWIzIj5TdWIgd2l6YXJkIDM8L2E+IChHZW5lcmF0ZSBzZXJ2aWNlL3NlcnZpY2UNCi1ncm91cCB1c2luZyBhbHJlYWR5IGV4aXN0aW5nIHNlcnZpY2VzLnhtbCk8L2xpPg0KLTwvb2w+DQotPHA+MSAmYW1wOyAyIGZvbGxvdyB0aGUgc2FtZSBzZXQgb2Ygc3RlcHMgZXhjZXB0IGZvciBzb21lIGxvb3BpbmcNCi1tZWNoYW5pc20gaW4gdGhlIG1pZGRsZSBvZiB0aGUgd2l6YXJkLjwvcD4NCi08YSBuYW1lPSJzdWIxMiIgaWQ9InN1YjEyIj48L2E+DQotPGgzPlN1YiBXaXphcmQgMSBhbmQgU3ViIFdpemFyZCAyPC9oMz4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSAoc3ViIHdpemFyZHMgMSAmYW1wOyAyKSBQYWdlDQotMzo8L3N0cm9uZz48L3A+DQotPHA+RnJvbSB0aGlzIHBhZ2UgeW91IGhhdmUgdG8gc2VsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgc2VydmljZQ0KLWNsYXNzZXMgZGlyZWN0b3J5ICh0aGUgbG9jYXRpb24gb2YgdGhlIGNvbXBpbGVkIGNsYXNzZXMpLiBZb3UgZG8NCi1ub3QgbmVlZCB0byB0eXBlIHBhdGgsIHNpbXBseSBicm93c2UgYW5kIHNlbGVjdC48L3A+DQotPHA+PGltZyBhbHQ9ImZpZzciIHNyYz0iaW1hZ2VzL2ZpZzcuanBnIiAvPjwvcD4NCi08cD5XaGVuIHlvdSBjbGljayBvbiAiTmV4dCIgYnV0dG9uLCB3aXphcmQgd2lsbCBtb3ZlIHRvIHRoZSBwYWdlDQotYmVsb3c8L3A+DQotPHA+PHN0cm9uZz5TZXJ2aWNlIEFyY2hpdmUgKHN1YiB3aXphcmRzIDEgJmFtcDsgMikgUGFnZQ0KLTQ6PC9zdHJvbmc+PC9wPg0KLTxwPkhlcmUgeW91IHNlbGVjdCBzZXJ2aWNlIHNwZWNpZmljIGV4dGVybmFsIGxpYnJhcmllcyAodGhpcmQgcGFydHkNCi1saWJyYXJpZXMpIGFuZCBzZXJ2aWNlIFdTREwgZmlsZXMuIElmIHlvdSB3YW50IHRvIGFkZCBtdWx0aXBsZSBXU0RMDQotZmlsZXMgdG8gYSBzaW5nbGUgc2VydmljZSB0eXBlIHlvdSBjYW4gZG8gdGhhdCBhcyB3ZWxsLjwvcD4NCi08cD48aW1nIGFsdD0iZmlnOCIgc3JjPSJpbWFnZXMvZmlnOC5qcGciIC8+PC9wPg0KLTxwPlRvIGFkZCBsaWJyYXJpZXMgZmlyc3QgY2xpY2sgb24gdGhlIGJyb3dzZSBidXR0b24gdG8gYnJvd3NlIGZvcg0KLWxpYnJhcnkgZmlsZXMgYW5kIHRoZW4gY2xpY2sgb24gdGhlICJBZGQiIGJ1dHRvbi4gT25jZSBhZGRlZCB0aGUNCi1zZWxlY3RlZCBmaWxlIHdpbGwgYXBwZWFyIGluIHRoZSBsaXN0IGJveC48L3A+DQotPHA+VG8gYWRkIFdTRExzLCBmaXJzdCBjbGljayBvbiB0aGUgYnJvd3NlIGJ1dHRvbiB0byBicm93c2UgZm9yDQotV1NETCBmaWxlIGFuZCB0aGVuIGNsaWNrIHRoZSAiQWRkIiBidXR0b24gdG8gYWRkIHRoZSBmaWxlIHRvIHRoZQ0KLWxpc3QuPC9wPg0KLTxwPkFmdGVyIGFkZGluZyBleHRlcm5hbCBsaWJyYXJpZXMgYW5kIHNlcnZpY2UgV1NETCBmaWxlcyBjbGljayBvbg0KLXRoZSAiTmV4dCIgYnV0dG9uIHRvIG1vdmUgdG8gbmV4dCBwYWdlLjwvcD4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSAoc3ViIHdpemFyZHMgMSAmYW1wOyAyKSBQYWdlDQotNTo8L3N0cm9uZz48L3A+DQotPHA+VGhpcyBwYWdlIGFsbG93cyB5b3UgdG8gc2VsZWN0IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuIEluDQotdGhlIGNhc2Ugb2Ygc2VydmljZSBncm91cCwgc2FtZSBwYWdlIHdpbGwgYmUgbG9vcGVkIHRvIHNlbGVjdA0KLW11bHRpcGxlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4gVGhpcyBwcm9jZXNzIGlzIGV4cGxhaW5lZA0KLWluIGRldGFpbCBiZWxvdy48L3A+DQotPHA+U2VsZWN0IGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBieSBicm93c2luZyBhbmQgY2xpY2tpbmcNCi1vbiB0aGUgIkxvYWQiIGJ1dHRvbiB0byBsb2FkIGFsbCB0aGUgcHVibGljIG1ldGhvZHMgaW4gdGhhdCBjbGFzcywNCi1hZnRlciB3aGljaCB5b3UgY2FuIHNlbGVjdCB0aGUgbWV0aG9kcyB0aGF0IHlvdSB3YW50IHRvIHB1Ymxpc2gNCi11c2luZyB0aGUgY2hlY2sgYm94ZXMuPC9wPg0KLTxwPjxzdHJvbmc+Tm90ZSA6PC9zdHJvbmc+IElmIHlvdSBkbyBub3Qgc2VsZWN0IHRoZSBjb3JyZWN0IGNsYXNzDQotcGF0aCBmcm9tIHRoZSAiQ2xhc3MgbG9jYXRpb24gc2VsZWN0aW9uIiB3aW5kb3csIHRoZSBwdWJsaWMgbWV0aG9kcw0KLXdoaWNoIGFyZSBhdmFpbGFibGUgaW4gdGhlIHNlbGVjdGVkIGNsYXNzIGZpbGUgd2lsbCBub3QgYmUNCi1sb2FkZWQuPC9wPg0KLTxwPjxpbWcgYWx0PSJmaWcxMCIgc3JjPSJpbWFnZXMvZmlnMTAuanBnIiAvPjwvcD4NCi08cD5JbiAiU2VydmljZSBOYW1lIiB0ZXh0IGJveCB5b3UgY2FuIHR5cGUgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UNCi15b3Ugd2FudCwgYnV0IHJlbWVtYmVyIHRoYXQgdGhlIHNlcnZpY2UgbmFtZSBzaG91bGQgYmUgdW5pcXVlDQotdGhyb3VnaG91dCB0aGUgc3lzdGVtLjwvcD4NCi08cD5XaGVuIHlvdSBoYXZlIGNvbXBsZXRlZCB0aGlzIHBhcnRpY3VsYXIgc2VydmljZSBjbGljayBvbiB0aGUNCi1idXR0b24gIk5leHQiLiBJbiB0aGUgY2FzZSBvZiBhIHNlcnZpY2UgZ3JvdXAgd2hlbiB5b3UgY2xpY2sgb24gdGhlDQotIk5leHQiIGJ1dHRvbiBmb3IgdGhhdCBwYXJ0aWN1bGFyIHNlcnZpY2UgdGhlIGZvbGxvd2luZyBkaWFsb2cgYm94DQotd2lsbCBhcHBlYXIgd2l0aCBvcHRpb24gdG8gYWRkIG1vcmUgc2VydmljZShzKSB0byBhIHNlcnZpY2UNCi1ncm91cC48L3A+DQotPHA+PGltZyBhbHQ9ImZpZzExIiBzcmM9ImltYWdlcy9maWcxMS5qcGciIC8+PC9wPg0KLTxwPklmIHlvdSBjbGljayBvbiAiWWVzIiwgeW91IGhhdmUgdG8gZm9sbG93IHRoZSBzYW1lIHByb2NlZHVyZSB0bw0KLWFkZCBzb21lIG90aGVyIHNlcnZpY2UocykgdG8gc2VydmljZSBncm91cC48L3A+DQotPHA+SWYgeW91IGNsaWNrIG9uICJObyIsIHRoZSBidXR0b24gIk5leHQiIHdpbGwgYmUgZW5hYmxlZCBhbmQgeW91DQotY2FuIGdvIHRvIG5leHQgcGFnZS48L3A+DQotPHA+PGEgbmFtZT0iTm90ZSIgaWQ9Ik5vdGUiPjxzdHJvbmc+PGVtPk5vdGU6IEZyb20gdGhpcyBwb2ludA0KLW9ud2FyZHMgdGhlIHN0ZXBzIGFyZSBzaW1pbGFyIHRvIGFsbCB0aGUgc3ViDQotd2l6YXJkcy48L2VtPjwvc3Ryb25nPjwvYT48L3A+DQotPHA+PHN0cm9uZz5TZXJ2aWNlIEFyY2hpdmUgKHN1YiB3aXphcmRzIDEgJmFtcDsgMikgUGFnZQ0KLTY6PC9zdHJvbmc+PC9wPg0KLTxwPlRoaXMgcGFnZSBkaXNwbGF5cyB0aGUgc2VydmljZXMueG1sIGZpbGUsIGVpdGhlciB0aGUgb25lIGdpdmVuDQotYnkgeW91IChpbiB0aGUgY2FzZSBvZiBJIGFscmVhZHkgaGF2ZSBzZXJ2aWNlcy54bWwpDQotb3IgdGhlIG9uZSBnZW5lcmF0ZWQgYnkgdGhlIHN5c3RlbSAoaW4gdGhlIGNhc2Ugb2YgImdlbmVyYXRlDQotc2VydmljZXMueG1sIik8L3A+DQotPHA+PGltZyBhbHQ9ImZpZzEyIiBzcmM9ImltYWdlcy9maWcxMi5qcGciIC8+PC9wPg0KLTxwPlRoaXMgcGFnZSBpcyBlZGl0YWJsZSBhbmQgcHJvdmlkZSBhIHdheSB0byBhZGQgcGFyYW1ldGVycyBhbmQNCi1tb2R1bGUgcmVmZXJlbmNlcyB0byBhbnkgbGV2ZWwuPC9wPg0KLTxwPjxzdHJvbmc+Tm90ZSA6PC9zdHJvbmc+IFdoZW4geW91IGNsaWNrIG9uIGVpdGhlciB0aGUNCi0iK1BhcmFtZXRlciIgb3IgdGhlICIrTW9kdWxlUmVmIiBidXR0b25zIHJlbWVtYmVyIHRoYXQNCi1jb3JyZXNwb25kaW5nIHRleHQgd2lsbCBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbi4NCi1UaGVyZWZvcmUsIGNsaWNrIG9uIHRoZSBsb2NhdGlvbiB5b3Ugd2FudCB0byBhZGQgdGhlIHBhcmFtZXRlciBvcg0KLW1vZHVsZSByZWZlcmVuY2VzIGFuZCB0aGVuIGNsaWNrIHJlbGV2YW50IGJ1dHRvbiAoK1BhcmFtZXRlciBvcg0KLStNb2R1bGVSZWYpLjwvcD4NCi08cD48c3Ryb25nPitQYXJhbWV0ZXIgYnV0dG9uOjwvc3Ryb25nPjwvcD4NCi08cD5JZiB5b3UgY2xpY2sgb24gdGhlICIrUGFyYW1ldGVyIiBidXR0b24gYSB3aW5kb3cgd2lsbCBhcHBlYXINCi1hc2tpbmcgdG8gZ2l2ZSBwYXJhbWV0ZXIgbmFtZSBhbmQgcGFyYW1ldGVyIHZhbHVlLjwvcD4NCi08cD48aW1nIGFsdD0iZmlnMTMiIHNyYz0iaW1hZ2VzL2ZpZzEzLmpwZyIgLz48L3A+DQotPHA+Tm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBtYW51YWxseSBhZGQgcGFyYW1ldGVycyAod2l0aG91dCBjbGlja2luZw0KLW9uIHRoZSAiK1BhcmFtZXRlciIgYnV0dG9uICkgdG8gYW55IHdoZXJlIGluIHRoZSBkb2N1bWVudCBhcyB5b3UNCi13aXNoLjwvcD4NCi08cD48c3Ryb25nPitNb2R1bGVSZWYgYnV0dG9uOjwvc3Ryb25nPjwvcD4NCi08cD5MaWtld2lzZSwgYWRkaW5nIG1vZHVsZSByZWZlcmVuY2VzIGNhbiBiZSBkb25lIGJ5IGNsaWNraW5nIG9uDQotdGhlICIrTW9kdWxlUmVmIiBidXR0b24gaW4gdGhlIHBhZ2UuIFlvdSBoYXZlIHRvIHR5cGUgdGhlIG5hbWUgb2YNCi10aGUgbW9kdWxlIHRvIGJlIGVuZ2FnZWQgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBmaWd1cmUuPC9wPg0KLTxwPjxpbWcgYWx0PSJmaWcxNCIgc3JjPSJpbWFnZXMvZmlnMTQuanBnIiAvPjwvcD4NCi08cD5XaGVuIHlvdSBjb21wbGV0ZSB0aGlzIHBhZ2UgcHJlc3MgdGhlICJOZXh0IiBidXR0b24gdG8gZ28gdG8NCi1maW5hbCBwYWdlLjwvcD4NCi08cD48c3Ryb25nPlNlcnZpY2UgQXJjaGl2ZSAoc3ViIHdpemFyZHMgMSAmYW1wOyAyKSBQYWdlDQotNzo8L3N0cm9uZz48L3A+DQotPHA+PGltZyBhbHQ9ImZpZzE1IiBzcmM9ImltYWdlcy9maWcxNS5qcGciIC8+PC9wPg0KLTxwPk5leHQgc3RlcCBpcyB0byBzZWxlY3Qgb3V0cHV0IGZpbGUgbG9jYXRpb24sIHRoZSBsb2NhdGlvbiBpbg0KLXdoaWNoIGFyY2hpdmUgZmlsZSBzaG91bGQgYmUgY3JlYXRlZC48L3A+DQotPHA+SW4gdGhlICJBcmNoaXZlIE5hbWUiIHRleHQgYm94LCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlDQotZmlsZSB5b3Ugd2FudCB0byBwbGFjZS4gVGhpcyBuYW1lIHdpbGwgZmluYWxseSBiZWNvbWUgdGhlIHNlcnZpY2UNCi1ncm91cCBuYW1lLjwvcD4NCi08cD48c3Ryb25nPk5vdGUgOjwvc3Ryb25nPiBEbyBub3QgaW5jbHVkZSBmaWxlIGV4dGVuc2lvbiB3aGVuIHlvdQ0KLXR5cGUgYXJjaGl2ZSBuYW1lLiBTeXN0ZW0gd2lsbCBnZW5lcmF0ZSB0aGF0IGZvciB5b3UuPC9wPg0KLTxwPldoZW4geW91IGFyZSBkb25lLCBjbGljayB0aGUgIkZpbmlzaCIgYnV0dG9uLiBJZiBldmVyeXRoaW5nIGhhcw0KLWJlZW4gZG9uZSBzdWNjZXNzZnVsbHkgeW91IHdpbGwgc2VlIGZvbGxvd2luZyBtZXNzYWdlLjwvcD4NCi08cD48aW1nIGFsdD0iZmlnMTYiIHNyYz0iaW1hZ2VzL2ZpZzE2LmpwZyIgLz48L3A+DQotPHA+PHN0cm9uZz48ZW0+Tm90ZTogUGFnZXMgNiAmYW1wOyA3IG9mIHN1YiB3aXphcmRzIDEgJmFtcDsgMiBhcmUNCi1jb21tb24gdG8gc3ViIHdpemFyZCAzIGZyb20gaXRzIHBhZ2UgMyBvbndhcmRzLjwvZW0+PC9zdHJvbmc+PC9wPg0KLTxhIG5hbWU9InN1YjMiIGlkPSJzdWIzIj48L2E+DQotPGgzPlN1YiBXaXphcmQgMzwvaDM+DQotPHA+SW4gdGhlIGNhc2Ugd2hlcmUgc2VydmljZXMueG1sIGlzIGFscmVhZHkgYXZhaWxhYmxlLCB0aGUgc3RlcHMNCi1hcmUgYXMgZm9sbG93czo8L3A+DQotPHA+PHN0cm9uZz5TZXJ2aWNlIEFyY2hpdmUgKHN1YiB3aXphcmQgMykgUGFnZSAzOjwvc3Ryb25nPjwvcD4NCi08cD48aW1nIGFsdD0iZmlnMTciIHNyYz0iaW1hZ2VzL2ZpZzE3LmpwZyIgLz48L3A+DQotPHA+VGhpcyBwYWdlIGFsbG93cyB5b3UgdG8gc2VsZWN0IGJvdGggbG9jYXRpb24gb2Ygc2VydmljZXMueG1sIGFuZA0KLXRoZSBsb2NhdGlvbiBvZiBzZXJ2aWNlIGNsYXNzZXMgZGlyZWN0b3J5LiBDbGljayBvbiB0aGUgIlNlbGVjdCINCi1idXR0b25zIGFuZCBicm93c2UgdGhlIGZpbGUgc3lzdGVtIHRvIGZpbmQgcmVxdWlyZWQgZG9jdW1lbnQgYW5kDQotbG9jYXRpb24uPC9wPg0KLTxwPkNsaWNrIG9uIHRoZSAiTmV4dCIgYnV0dG9uIHdoaWNoIHdpbGwgdGFrZSB5b3UgdG8gYSBwYWdlIHdoaWNoDQotYWxsb3dzIHlvdSB0byBhZGQgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBXU0RMJ3MgaW4gdGhlIHNhbWUNCi1tYW5uZXIgYXMgIlN1YiBXaXphcmQgMSAmYW1wOyBTdWIgV2l6YXJkIDIiIHNlY3Rpb24ncyA8YSBocmVmPQ0KLSIjTm90ZSI+UGFnZSA2IC0gRWRpdCBzZXJ2aWNlIGRlc2NyaXB0b3JzPC9hPi4gTm90ZSB0aGF0IFN1YiBXaXphcmQNCi0zIGZyb20gdGhpcyBwb2ludCB0YWtlcyB0aGUgc2FtZSBwYWdlcyBhcyA2IHRvIDcgb2YgU3ViIFdpemFyZHMgMQ0KLSZhbXA7IDIuPC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiODkxYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEwLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyODFkYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzEwNzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTEuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTIuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjQyNDMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEzLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzEzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhNTAwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDkzMTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTUuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA0OTUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE2LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjZmNjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNy5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcxNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlM2M1MTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTguanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JlNDRiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE5LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzE5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNmRiOTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMTkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMi5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YzdiNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWcyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Y2VmZDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnMy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc0LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjc1NzE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNS5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc1LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiNTU4NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc1LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzYuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZDRiNTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc3LmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTgxOTBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2ZpZzcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvZmlnOC5qcGcgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc4LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzMGU5YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9maWc4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2lkZWEtaWNvbnMuanBnIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvaWRlYS1pY29ucy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjFiNmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvaWRlYS9pbWFnZXMvaWRlYS1pY29ucy5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9pZGVhL2ltYWdlcy9pZGVhLXBvcHVwLmpwZyBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2lkZWEtcG9wdXAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE3ZTMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L2lkZWEvaW1hZ2VzL2lkZWEtcG9wdXAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L21hdmVuLXBsdWdpbnMvbWF2ZW4tYWFyLXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZmJjODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5NYXZlbjIgQUFSIFBsdWctaW4gR3VpZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+TWF2ZW4yIEFBUiBQbHVnLWluIEd1aWRlPC9oMT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5UaGlzIHBsdWdpbiBnZW5lcmF0ZXMgYW4gQXhpcyAyIHNlcnZpY2UgZmlsZSAoQUFSIGZpbGUpLjwvcD4NCi08cD48YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90b29scy9pbmRleC5odG1sIiB0YXJnZXQ9DQotIl9ibGFuayI+W0Rvd25sb2FkIFBsdWdpbiBUb29sXTwvYT48L3A+DQotPGgyPkdvYWxzPC9oMj4NCi08cD5UaGUgQUFSIHBsdWdpbiBhbGxvd3MgdGhlIHBhY2thZ2luZyBvZiBhbiBBeGlzIDIgc2VydmljZSBhYXIgaW4NCi0zIGRpZmZlcmVudCBtb2Rlczo8L3A+DQotPG9sPg0KLTxsaT48Yj5heGlzMi1hYXI6YWFyPC9iPjogZ2VuZXJhdGVzIHRoZSBhYXIgYXJ0aWZhY3Q8L2xpPg0KLTxsaT48Yj5heGlzMi1hYXI6aW5wbGFjZTwvYj4gOiBwYWNrYWdlIHRoZSBhYXIgaW4gdGhlIHNvdXJjZSB0cmVlPC9saT4NCi08bGk+PGI+YXhpczItYWFyOmV4cGxvZGVkPC9iPiA6IHBhY2thZ2UgYW4gZXhwbG9kZWQgYWFyIGFwcGxpY2F0aW9uPC9saT4NCi08L29sPg0KLTxwPkVhY2ggbW9kZSBpcyBtYXRlcmlhbGl6ZWQgYnkgYSBnb2FsLiBGb3IgaW5zdGFuY2UsIHRvIGdlbmVyYXRlDQotYW4gZXhwbG9kZWQgYWFyIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdCwgb25lIHdvdWxkIHR5cGU8L3A+DQotPHByZT4NCi1tdm4gYXhpczItYWFyOmV4cGxvZGVkDQotPC9wcmU+DQotPGgyPkNvbmZpZ3VyYXRpb248L2gyPg0KLTxwPkFsbCBBQVIgcGx1Z2luIGdvYWxzIHRha2VzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbg0KLXBhcmFtZXRlcnMgYXMgaW5wdXQ6PC9wPg0KLTx0YWJsZSBib3JkZXI9IjIiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPjxzdHJvbmc+UGFyYW1ldGVyIE5hbWU8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlZmF1bHQgVmFsdWU8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+YWFyRGlyZWN0b3J5PC90ZD4NCi08dGQ+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYWFyPC90ZD4NCi08dGQ+RGlyZWN0b3J5IHdoZXJlIHRoZSBhYXIgZmlsZSBpcyBidWlsdDwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmNsYXNzZXNEaXJlY3Rvcnk8L3RkPg0KLTx0ZD4ke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fTwvdGQ+DQotPHRkPkRpcmVjdG9yeSB3aXRoIGNvbXBpbGVkIGNsYXNzZXMgYW5kIHJlc291cmNlczwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPmZpbGVTZXRzPC90ZD4NCi08dGQ+PC90ZD4NCi08dGQ+QWRkaXRpb25hbCBmaWxlIHNldHMsIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgYXJjaGl2ZS4gU2VlDQotIjxhIGhyZWY9IiNmaWxlX3NldHMiPkZpbGUgU2V0czwvYT4iIGJlbG93IGZvciBhbiBleGFtcGxlPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c2VydmljZXNYbWxGaWxlPC90ZD4NCi08dGQ+PC90ZD4NCi08dGQ+TG9jYXRpb24gb2YgdGhlIHNlcnZpY2VzLnhtbCBmaWxlLiBCeSBkZWZhdWx0LCBpdCBpcyBhc3N1bWVkDQotdGhhdCB0aGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gY2xhc3Nlc0RpcmVjdG9yeS9NRVRBLUlORiBhbmQNCi1ubyBzcGVjaWFsIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQ8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD53c2RsRmlsZTwvdGQ+DQotPHRkPjwvdGQ+DQotPHRkPkxvY2F0aW9uIG9mIHRoZSBXU0RMIGZpbGUuIEJ5IGRlZmF1bHQsIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUNCi1maWxlIGlzIGFscmVhZHkgcHJlc2VudCBpbiBjbGFzc2VzRGlyZWN0b3J5L01FVEEtSU5GIGFuZCBubyBzcGVjaWFsDQotcHJvY2Vzc2luZyBpcyByZXF1aXJlZDwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPndzZGxGaWxlTmFtZTwvdGQ+DQotPHRkPnNlcnZpY2Uud3NkbDwvdGQ+DQotPHRkPk5hbWUsIHRvIHdoaWNoIHRoZSBXU0RMIGZpbGUgc2hvdWxkIGJlIG1hcHBlZDwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPGgzPlRoZSBhYXIgR29hbDwvaDM+DQotPHA+VGhlIGFhciBnb2FsIGFsbG93cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFyYW1ldGVyczo8L3A+DQotPHRhYmxlIGJvcmRlcj0iMiI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5QYXJhbWV0ZXIgTmFtZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVmYXVsdCBWYWx1ZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5vdXRwdXREaXJlY3Rvcnk8L3RkPg0KLTx0ZD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fTwvdGQ+DQotPHRkPkRpcmVjdG9yeSB3aGVyZSB0byBnZW5lcmF0ZSB0aGUgQUFSIGZpbGU8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5hYXJOYW1lPC90ZD4NCi08dGQ+JHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX08L3RkPg0KLTx0ZD5UaGUgZ2VuZXJhdGVkIEFBUiBmaWxlcyBuYW1lPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+YXJjaGl2ZTwvdGQ+DQotPHRkPjwvdGQ+DQotPHRkPkEgTWF2ZW4gYXJjaGl2ZSBjb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIHRvDQotY29uZmlndXJlIHRoZSBNQU5JRkVTVC5NRiBmaWxlPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+Y2xhc3NpZmllcjwvdGQ+DQotPHRkPjwvdGQ+DQotPHRkPkEgY2xhc3NpZmllciwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgQUFSIGZpbGVzDQotbmFtZS4gU2V0dGluZyB0aGlzIHBhcmFtZXRlciBoYXMgdGhlIHNpZGUgZWZmZWN0LCB0aGF0IHRoZSBhcnRpZmFjdA0KLWlzIHRyZWF0ZWQgYXMgYW4gYXR0YWNobWVudCBhbmQgbm90IGFzIHRoZSBwcm9qZWN0cyBwcmltYXJ5DQotYXJ0aWZhY3Q8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5wcmltYXJ5QXJ0aWZhY3Q8L3RkPg0KLTx0ZD50cnVlPC90ZD4NCi08dGQ+U2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIGRpc2FibGVzIGluc3RhbGxhdGlvbiBvcg0KLWRlcGxveW1lbnQgb2YgdGhlIGFydGlmYWN0IGFzIHRoZSBwcm9qZWN0cyBwcmltYXJ5IGFydGlmYWN0PC90ZD4NCi08L3RyPg0KLTwvdGJvZHk+DQotPC90YWJsZT4NCi08YSBuYW1lPSJmaWxlX3NldHMiIGlkPSJmaWxlX3NldHMiPjwvYT4NCi08aDM+RmlsZSBTZXRzPC9oMz4NCi08cD5BZGRpdGlvbmFsIGZpbGUgc2V0cyBtYXkgYmUgY29uZmlndXJlZCBmb3IgaW5jbHVzaW9uIGludG8gdGhlDQotQUFSIGZpbGUuIEEgZmlsZSBzZXQgbG9va3MgYXMgZm9sbG93czo8L3A+DQotPHByZT4NCi0gIA0KLSAgJmx0O2ZpbGVTZXRzJmd0Ow0KLSAgICAmbHQ7ZmlsZVNldCZndDsNCi0gICAgICAmbHQ7ZGlyZWN0b3J5Jmd0O3NyYy9hYXIvZmlsZXMmbHQ7L2RpcmVjdG9yeSZndDsNCi0gICAgICAmbHQ7b3V0cHV0RGlyZWN0b3J5Jmd0O01FVEEtSU5GL2RvY3MmbHQ7L291dHB1dERpcmVjdG9yeSZndDsNCi0gICAgICAmbHQ7aW5jbHVkZXMmZ3Q7DQotICAgICAgICAmbHQ7aW5jbHVkZSZndDsqKi8qLmh0bWwmbHQ7L2luY2x1ZGUmZ3Q7DQotDQotICAgICAgJmx0Oy9pbmNsdWRlcyZndDsNCi0gICAgJmx0Oy9maWxlU2V0Jmd0Ow0KLSAgICAmbHQ7ZmlsZVNldCZndDsNCi0gICAgICAmbHQ7ZGlyZWN0b3J5Jmd0O3NyYy9hYXIvZmlsZXMmbHQ7L2RpcmVjdG9yeSZndDsNCi0gICAgICAmbHQ7b3V0cHV0RGlyZWN0b3J5Jmd0O01FVEEtSU5GL2V0YyZsdDsvb3V0cHV0RGlyZWN0b3J5Jmd0Ow0KLQ0KLSAgICAgICZsdDtleGNsdWRlcyZndDsNCi0gICAgICAgICZsdDtleGNsdWRlJmd0OyoqLyouaHRtbCZsdDsvZXhjbHVkZSZndDsNCi0gICAgICAmbHQ7L2V4Y2x1ZGVzJmd0Ow0KLSAgICAmbHQ7L2ZpbGVTZXQmZ3Q7DQotICAmbHQ7L2ZpbGVTZXRzJmd0Ow0KLSAgDQotPC9wcmU+DQotPHA+VGhlIGV4YW1wbGUgc3BlY2lmaWVzLCB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5DQotc3JjL2Fhci9maWxlcyBzaGFsbCBiZSBhZGRlZCB0byB0aGUgQUFSIGZpbGUuIEhUTUwgZmlsZXMgd2lsbCBnbw0KLWludG8gTUVUQS1JTkYvZG9jcywgYWxsIG90aGVyIGZpbGVzIHRvIE1FVEEtSU5GL2V0Yy48L3A+DQotPHA+QSBmaWxlIHNldCBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uDQotcGFyYW1ldGVyczo8L3A+DQotPHRhYmxlIGJvcmRlcj0iMiI+DQotPHRib2R5Pg0KLTx0cj4NCi08dGQ+PHN0cm9uZz5QYXJhbWV0ZXIgTmFtZTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5kaXJlY3Rvcnk8L3RkPg0KLTx0ZD5UaGUgZGlyZWN0b3J5LCBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIGZpbGUgc2V0LiBUaGlzIHBhcmFtZXRlcg0KLWlzIHJlcXVpcmVkPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+b3V0cHV0RGlyZWN0b3J5PC90ZD4NCi08dGQ+VGhlIHRhcmdldCBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBQVIgZmlsZS4gRGVmYXVsdHMgdG8gdGhlIEFBUg0KLWZpbGVzIHJvb3QgZGlyZWN0b3J5PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+aW5jbHVkZXM8L3RkPg0KLTx0ZD5Db25maWd1cmVzIHRoZSBzZXQgb2YgZmlsZXMsIHdoaWNoIHNoYWxsIGJlIGluY2x1ZGVkIGludG8gdGhlDQotQUFSIGZpbGUuIERlZmF1bHRzIHRvICoqLyo8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5leGNsdWRlczwvdGQ+DQotPHRkPkNvbmZpZ3VyZXMgYSBzZXQgb2YgZmlsZXMsIHdoaWNoIHNoYWxsIGJlIGV4Y2x1ZGVkIGZyb20gdGhlDQotZmlsZSBzZXQuIERlZmF1bHRzIHRvIHRoZSBNYXZlbiBkZWZhdWx0IGV4Y2x1ZGVzICgqKi8qfiwNCi0qKi9jdnMvKiovKiwgKiovLnN2bi8qKi8qLCBldGMuKTwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnNraXBEZWZhdWx0RXhjbHVkZXM8L3RkPg0KLTx0ZD5JZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBubyBkZWZhdWx0IGV4Y2x1ZGVzIGFyZQ0KLWJlaW5nIHVzZWQ8L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1qYXZhMndzZGwtcGx1Z2luLnhtbCBiLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvMV80L21hdmVuLXBsdWdpbnMvbWF2ZW4tamF2YTJ3c2RsLXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjY0ZGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1qYXZhMndzZGwtcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0NCi0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIiAvPg0KLTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0iIiAvPg0KLTx0aXRsZT5NYXZlbjIgSmF2YTJXU0RMIFBsdWctaW4gR3VpZGU8L3RpdGxlPg0KLTxsaW5rIGhyZWY9Ii4uLy4uLy4uL2Nzcy9heGlzLWRvY3MuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9DQotInRleHQvY3NzIiBtZWRpYT0iYWxsIiAvPg0KLTwvaGVhZD4NCi08Ym9keT4NCi08aDE+TWF2ZW4yIEphdmEyV1NETCBQbHVnLWluIEd1aWRlPC9oMT4NCi08aDI+SW50cm9kdWN0aW9uPC9oMj4NCi08cD5UaGlzIHBsdWdpbiB0YWtlcyBhcyBpbnB1dCBhIEphdmEgY2xhc3MgYW5kIGdlbmVyYXRlcyBhIFdTREwsDQotd2hpY2ggZGVzY3JpYmVzIGEgV2ViIHNlcnZpY2UgZm9yIGludm9raW5nIHRoZSBjbGFzc2VzIG1ldGhvZHMuPC9wPg0KLTxwPjxhIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzL2luZGV4Lmh0bWwiIHRhcmdldD0NCi0iX2JsYW5rIj5bRG93bmxvYWQgUGx1Z2luIFRvb2xdPC9hPjwvcD4NCi08aDI+R29hbHM8L2gyPg0KLTxwPlRoZSBKYXZhMldTREwgcGx1Z2luIG9mZmVycyBhIHNpbmdsZSBnb2FsOjwvcD4NCi08dWw+DQotPGxpPmphdmEyd3NkbCAoZGVmYXVsdCk6IFJlYWRzIGEgamF2YSBjbGFzcyBhbmQgZ2VuZXJhdGVzIGEgV1NETA0KLWZvciBpbnZva2luZyB0aGUgY2xhc3NlcyBtZXRob2RzIGFzIGEgV2ViIHNlcnZpY2UuPC9saT4NCi08L3VsPg0KLTxwPlRvIHJ1biB0aGUgcGx1Z2luLCBhZGQgdGhlIGZvbGxvd2luZyBzZWN0aW9uIHRvIHlvdXIgPGEgaHJlZj0NCi0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL2ludHJvZHVjdGlvbi9pbnRyb2R1Y3Rpb24tdG8tdGhlLXBvbS5odG1sIj4NCi1QT008L2E+IChQcm9qZWN0IE9iamVjdCBNb2RlbCk6PC9wPg0KLTxwcmU+DQotICAmbHQ7YnVpbGQmZ3Q7DQotICAgICZsdDtwbHVnaW5zJmd0Ow0KLSAgICAgICZsdDtwbHVnaW4mZ3Q7DQotICAgICAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMiZsdDsvZ3JvdXBJZCZndDsNCi0gICAgICAgICZsdDthcnRpZmFjdElkJmd0O2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4mbHQ7L2FydGlmYWN0SWQmZ3Q7DQotICAgICAgICAmbHQ7Y29uZmlndXJhdGlvbiZndDsNCi0gICAgICAgICAgJmx0O2NsYXNzTmFtZSZndDtjb20uZm9vLm15c2VydmljZS5NeUhhbmRsZXImbHQ7L2NsYXNzTmFtZSZndDsNCi0gICAgICAgICZsdDsvY29uZmlndXJhdGlvbiZndDsNCi0gICAgICAgICZsdDtleGVjdXRpb25zJmd0Ow0KLSAgICAgICAgICAmbHQ7ZXhlY3V0aW9uJmd0Ow0KLSAgICAgICAgICAgICZsdDtnb2FscyZndDsNCi0gICAgICAgICAgICAgICZsdDtnb2FsJmd0O2phdmEyd3NkbCZsdDsvZ29hbCZndDsNCi0gICAgICAgICAgICAmbHQ7L2dvYWxzJmd0Ow0KLSAgICAgICAgICAmbHQ7L2V4ZWN1dGlvbiZndDsNCi0gICAgICAgICAmbHQ7L2V4ZWN1dGlvbnMmZ3Q7DQotICAgICAgJmx0Oy9wbHVnaW4mZ3Q7DQotICAgICZsdDsvcGx1Z2lucyZndDsNCi0gICZsdDsvYnVpbGQmZ3Q7DQotICANCi08L3ByZT4NCi08cD5UaGUgcGx1Z2luIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5IGluIHRoZQ0KLWdlbmVyYXRlLXJlc291cmNlcyBwaGFzZS4gWW91IGNhbiBhbHNvIGludm9rZSBpdCBkaXJlY3RseSBmcm9tIHRoZQ0KLWNvbW1hbmQgbGluZSBieSBydW5uaW5nIHRoZSBjb21tYW5kOjwvcD4NCi08cHJlPg0KLW12biBheGlzMi1qYXZhMndzZGw6amF2YTJ3c2RsDQotPC9wcmU+DQotPGgzPlRoZSBKYXZhMldTREwgR29hbDwvaDM+DQotPHA+QnkgZGVmYXVsdCwgdGhlIHBsdWdpbiByZWFkcyB0aGUgZ2l2ZW4gSmF2YSBjbGFzcyBhbmQgY3JlYXRlcyBhDQotZmlsZQ0KLTxzdHJvbmc+dGFyZ2V0L2dlbmVyYXRlZC1yZXNvdXJjZXMvamF2YTJ3c2RsL3NlcnZpY2Uud3NkbA0KLTwvc3Ryb25nPi4NCi1UaGUgSmF2YSBjbGFzcyBpcyBnaXZlbiBieSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50DQotPHN0cm9uZz5jbGFzc05hbWU8L3N0cm9uZz4gYWJvdmUuPC9wPg0KLTxoMj5Db25maWd1cmF0aW9uPC9oMj4NCi08cD5UaGUgSmF2YTJXU0RMIGdvYWwgdGFrZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFzIGlucHV0LiBBbGwNCi1wYXJhbWV0ZXJzIGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5IHVzaW5nIHByb3BlcnRpZXMuDQotRm9yIGV4YW1wbGUsIHRoZSBwYXJhbWV0ZXIgImNsYXNzTmFtZSIgbWF5IGJlIHNldCB1c2luZyB0aGUNCi1wcm9wZXJ0eSAiYXhpczIuamF2YTJ3c2RsLmNsYXNzTmFtZSIuIElmIHRoZSBwYXJhbWV0ZXIgaXNuJ3Qgc2V0DQotdmlhIHByb3BlcnR5IG9yIGluIHRoZSBQT00sIHRoZW4gYSBkZWZhdWx0IHZhbHVlIGFwcGxpZXMuPC9wPg0KLTx0YWJsZSBib3JkZXI9IjIiPg0KLTx0Ym9keT4NCi08dHI+DQotPHRkPjxzdHJvbmc+UGFyYW1ldGVyIG5hbWU8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkNvbW1hbmQgbGluZSBwcm9wZXJ0eTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlZmF1bHQgdmFsdWU8L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5jbGFzc05hbWU8L3RkPg0KLTx0ZD4ke2F4aXMyLmphdmEyd3NkbC5jbGFzc05hbWV9PC90ZD4NCi08dGQ+RnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzLCB3aGljaCBpcyBiZWluZyByZWFkIGFuZA0KLXRyYW5zZm9ybWVkIGludG8gYSBXU0RMPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+b3V0cHV0RmlsZU5hbWU8L3RkPg0KLTx0ZD4ke2F4aXMyLmphdmEyd3NkbC5vdXRwdXRGaWxlTmFtZX08L3RkPg0KLTx0ZD5QYXRoIG9mIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBmaWxlLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnNjaGVtYVRhcmdldE5hbWVzcGFjZTwvdGQ+DQotPHRkPiR7YXhpczIuamF2YTJ3c2RsLnNjaGVtYVRhcmdldE5hbWVzcGFjZX08L3RkPg0KLTx0ZD5UYXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBnZW5lcmF0ZWQgc2NoZW1hLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeDwvdGQ+DQotPHRkPiR7YXhpczIuamF2YTJ3c2RsLnNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeH08L3RkPg0KLTx0ZD5QcmVmaXgsIHdoaWNoIGlzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NoZW1hcyB0YXJnZXQNCi1uYW1lc3BhY2UuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+c2VydmljZU5hbWU8L3RkPg0KLTx0ZD4ke2F4aXMyLmphdmEyd3NkbC5zZXJ2aWNlTmFtZX08L3RkPg0KLTx0ZD5OYW1lIG9mIHRoZSBnZW5lcmF0ZWQgV2ViIHNlcnZpY2UuPC90ZD4NCi08dGQ+VW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW5wdXQgY2xhc3MuPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+dGFyZ2V0TmFtZXNwYWNlPC90ZD4NCi08dGQ+JHtheGlzMi5qYXZhMndzZGwudGFyZ2V0TmFtZXNwYWNlfTwvdGQ+DQotPHRkPlRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGdlbmVyYXRlZCBXU0RMPC90ZD4NCi08dGQ+RGVmYXVsdCBuYW1lc3BhY2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD50YXJnZXROYW1lc3BhY2VQcmVmaXg8L3RkPg0KLTx0ZD4ke2F4aXMyLmphdmEyd3NkbC50YXJnZXROYW1lc3BhY2VQcmVmaXh9PC90ZD4NCi08dGQ+UHJlZml4LCB3aGljaCBpcyBiZWluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldA0KLW5hbWVzcGFjZTwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08L3Rib2R5Pg0KLTwvdGFibGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4ueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi13c2RsMmNvZGUtcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2YmE4Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PQ0KLSJIVE1MIFRpZHkgZm9yIFdpbmRvd3MgKHZlcnMgMTQgSnVuZSAyMDA3KSwgc2VlIHd3dy53My5vcmciIC8+DQotPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiIC8+DQotPHRpdGxlPk1hdmVuMiBXU0RMMkNvZGUgUGx1Zy1pbiBHdWlkZTwvdGl0bGU+DQotPGxpbmsgaHJlZj0iLi4vLi4vLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0NCi0idGV4dC9jc3MiIG1lZGlhPSJhbGwiIC8+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxoMT5NYXZlbjIgV1NETDJDb2RlIFBsdWctaW4gR3VpZGU8L2gxPg0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPg0KLTxwPlRoaXMgcGx1Z2luIHRha2VzIGFzIGlucHV0IGEgV1NETCBhbmQgZ2VuZXJhdGVzIGNsaWVudCBhbmQNCi1zZXJ2ZXIgc3R1YnMgZm9yIGNhbGxpbmcgb3IgaW1wbGVtZW50aW5nIGEgV2ViIHNlcnZpY2UgbWF0Y2hpbmcgdGhlDQotV1NETC48L3A+DQotPHA+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvaW5kZXguaHRtbCIgdGFyZ2V0PQ0KLSJfYmxhbmsiPltEb3dubG9hZCBQbHVnaW4gVG9vbF08L2E+PC9wPg0KLTxoMj5Hb2FsczwvaDI+DQotPHA+VGhlIFdTRGwyQ29kZSBvZmZlcnMgYSBzaW5nbGUgZ29hbDo8L3A+DQotPHVsPg0KLTxsaT53c2RsMmNvZGUgKGRlZmF1bHQpOiBSZWFkcyB0aGUgV1NETCBhbmQgZ2VuZXJhdGVzIGNvZGUuPC9saT4NCi08L3VsPg0KLTxwPlRvIHJ1biB0aGUgcGx1Z2luLCBhZGQgdGhlIGZvbGxvd2luZyBzZWN0aW9uIHRvIHlvdXIgPGEgaHJlZj0NCi0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL2ludHJvZHVjdGlvbi9pbnRyb2R1Y3Rpb24tdG8tdGhlLXBvbS5odG1sIj4NCi1QT008L2E+IChQcm9qZWN0IE9iamVjdCBNb2RlbCk6PC9wPg0KLTxwcmU+DQotICAgICZsdDtidWlsZCZndDsNCi0gICAgCSZsdDtwbHVnaW5zJmd0Ow0KLSAgICAJCSZsdDtwbHVnaW4mZ3Q7DQotICAgIAkJCSZsdDtncm91cElkJmd0O29yZy5hcGFjaGUuYXhpczImbHQ7L2dyb3VwSWQmZ3Q7DQotICAgIAkJCSZsdDthcnRpZmFjdElkJmd0O2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4mbHQ7L2FydGlmYWN0SWQmZ3Q7DQotCQkJCSZsdDt2ZXJzaW9uJmd0OzEuNCZsdDsvdmVyc2lvbiZndDsNCi0gICAgCQkJJmx0O2V4ZWN1dGlvbnMmZ3Q7DQotICAgIAkJCQkmbHQ7ZXhlY3V0aW9uJmd0Ow0KLSAgICAJCQkJCSZsdDtnb2FscyZndDsNCi0gICAgCQkJCQkJJmx0O2dvYWwmZ3Q7d3NkbDJjb2RlJmx0Oy9nb2FsJmd0Ow0KLSAgICAJCQkJCSZsdDsvZ29hbHMmZ3Q7DQotICAgIAkJCQkmbHQ7Y29uZmlndXJhdGlvbiZndDsNCi0JCQkJCSZsdDtwYWNrYWdlTmFtZSZndDtjb20uZm9vLm15c2VydmljZSZsdDsvcGFja2FnZU5hbWUmZ3Q7DQotCQkJCQkmbHQ7d3NkbEZpbGUmZ3Q7c3JjL21haW4vd3NkbC9teXNlcnZpY2Uud3NkbCZsdDsvd3NkbEZpbGUmZ3Q7DQotCQkJCQkmbHQ7ZGF0YWJpbmRpbmdOYW1lJmd0O3htbGJlYW5zJmx0Oy9kYXRhYmluZGluZ05hbWUmZ3Q7DQotCQkJCSZsdDsvY29uZmlndXJhdGlvbiZndDsNCi0JCQkJJmx0Oy9leGVjdXRpb24mZ3Q7DQotCQkJJmx0Oy9leGVjdXRpb25zJmd0Ow0KLSAgICAJCSZsdDsvcGx1Z2luJmd0Ow0KLSAgICAJJmx0Oy9wbHVnaW5zJmd0Ow0KLSAgICAmbHQ7L2J1aWxkJmd0Ow0KLTwvcHJlPg0KLUFsc28gcGxlYXNlIGFkZCBheGlzMiBqYXJzIGFzIGEgZGVwZW5kZW5jeSANCi08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KLSAgICAmbHQ7ZGVwZW5kZW5jeSZndDsNCi0gICAgICAgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmFwYWNoZS5heGlzMiZsdDsvZ3JvdXBJZCZndDsNCi0gICAgICAgICAgJmx0O2FydGlmYWN0SWQmZ3Q7YXhpczImbHQ7L2FydGlmYWN0SWQmZ3Q7DQotICAgICAgICAgICZsdDt2ZXJzaW9uJmd0OzEuNCZsdDsvdmVyc2lvbiZndDsNCi0gICAgJmx0Oy9kZXBlbmRlbmN5Jmd0Ow0KLTwvcHJlPg0KLSAgICANCi08cD5UaGUgcGx1Z2luIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBnZW5lcmF0ZS1zb3VyY2VzDQotcGhhc2UuIFlvdSBjYW4gYWxzbyBpbnZva2UgaXQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5DQotcnVubmluZyB0aGUgY29tbWFuZDwvcD4NCi08cHJlPg0KLW12biBheGlzMi13c2RsMmNvZGU6d3NkbDJjb2RlDQotPC9wcmU+DQotPGgzPlRoZSBXU0RMMkNvZGUgR29hbDwvaDM+DQotPHA+QnkgZGVmYXVsdCwgdGhlIHBsdWdpbiByZWFkcyB0aGUgZmlsZQ0KLTxzdHJvbmc+c3JjL21haW4vYXhpczIvc2VydmljZS53c2RsPC9zdHJvbmc+LiBTb3VyY2VzIGZvciB0aGUgSmF2YQ0KLXByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCB0aGUgQURCIGRhdGEgYmluZGluZyBhcmUgZ2VuZXJhdGVkIGludG8NCi08c3Ryb25nPnRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9heGlzMi93c2RsMmNvZGU8L3N0cm9uZz4uIE5vdGUgdGhlDQotY29uZmlndXJhdGlvbiBlbGVtZW50IDxzdHJvbmc+cGFja2FnZU5hbWU8L3N0cm9uZz4gYWJvdmUsIHdoaWNoDQotc2V0cyB0aGUgcGFja2FnZSBuYW1lLCB0aHVzIGEgc3ViZGlyZWN0b3J5LjwvcD4NCi08aDI+Q29uZmlndXJhdGlvbjwvaDI+DQotPHA+VGhlIFdTREwyQ29kZSBnb2FsIHRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcyBpbnB1dC4gQWxsDQotcGFyYW1ldGVycyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBieSB1c2luZyBwcm9wZXJ0aWVzLg0KLUZvciBleGFtcGxlLCB0aGUgcGFyYW1ldGVyICJnZW5lcmF0ZVNlcnZlclNpZGUiIG1heSBiZSBzZXQgdXNpbmcNCi10aGUgcHJvcGVydHkgImF4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGUiLiBJZiB0aGUgcGFyYW1ldGVyDQotaXNuJ3Qgc2V0IHZpYSBwcm9wZXJ0eSBvciBpbiB0aGUgUE9NLCB0aGVuIGEgZGVmYXVsdCB2YWx1ZQ0KLWFwcGxpZXMuPC9wPg0KLTx0YWJsZSBib3JkZXI9IjIiPg0KLTx0Ym9keT4NCi08dHIgYWxpZ249ImNlbnRlciI+DQotPHRkPjxzdHJvbmc+UGFyYW1ldGVyIE5hbWU8L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkNvbW1hbmQgTGluZSBQcm9wZXJ0eTwvc3Ryb25nPjwvdGQ+DQotPHRkPjxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L3RkPg0KLTx0ZD48c3Ryb25nPkRlZmF1bHQgVmFsdWU8L3N0cm9uZz48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5kYXRhYmluZGluZ05hbWU8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS5kYXRhYmluZGluZ05hbWV9PC90ZD4NCi08dGQ+RGF0YSBiaW5kaW5nIGZyYW1ld29yaywgd2hpY2ggaXMgYmVpbmcgdXNlZCBieSB0aGUgZ2VuZXJhdGVkDQotc291cmNlcy48L3RkPg0KLTx0ZD5hZGI8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5nZW5lcmF0ZUFsbENsYXNzZXM8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZUFsbENsYXNzZXN9PC90ZD4NCi08dGQ+V2hldGhlciB0byBnZW5lcmF0ZSBzaW1wbHkgYWxsIGNsYXNzZXMuIFRoaXMgaXMgb25seSB2YWxpZCBpbg0KLWNvbmp1bmN0aW9uIHdpdGggImdlbmVyYXRlU2VydmVyU2lkZSIuPC90ZD4NCi08dGQ+ZmFsc2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5nZW5lcmF0ZVNlcnZlclNpZGU8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGV9PC90ZD4NCi08dGQ+V2hldGhlciBzZXJ2ZXIgc2lkZSBzb3VyY2VzIGFyZSBiZWluZyBnZW5lcmF0ZWQuPC90ZD4NCi08dGQ+ZmFsc2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2U8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2V9PC90ZD4NCi08dGQ+V2hldGhlciB0byBnZW5lcmF0ZSB0aGUgc2VydmVyIHNpZGUgaW50ZXJmYWNlLjwvdGQ+DQotPHRkPmZhbHNlPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+Z2VuZXJhdGVTZXJ2aWNlc1htbDwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmljZXNYbWx9PC90ZD4NCi08dGQ+V2hldGhlciBhICJzZXJ2aWNlcy54bWwiIGZpbGUgaXMgYmVpbmcgZ2VuZXJhdGVkLjwvdGQ+DQotPHRkPmZhbHNlPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+Z2VuZXJhdGVUZXN0Y2FzZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlVGVzdENhc2V9PC90ZD4NCi08dGQ+V2hldGhlciBhIHRlc3QgY2FzZSBpcyBiZWluZyBnZW5lcmF0ZWQuPC90ZD4NCi08dGQ+ZmFsc2U8L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5sYW5ndWFnZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLmxhbmd1YWdlfTwvdGQ+DQotPHRkPlByb2dyYW1taW5nIGxhbmd1YWdlIG9mIHRoZSBnZW5lcmF0ZWQgc291cmNlcy48L3RkPg0KLTx0ZD5qYXZhPC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+bmFtZXNwYWNlVG9QYWNrYWdlczwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLm5hbWVzcGFjZVRvUGFja2FnZXN9PC90ZD4NCi08dGQ+TWFwIG9mIG5hbWVzcGFjZSBVUkkgdG8gcGFja2FnZXMgaW4gdGhlIGZvcm1hdA0KLXVyaTE9cGFja2FnZTEsdXJpMj1wYWNrYWdlMiwuLi4gVXNpbmcgdGhpcyBwYXJhbWV0ZXIgaXMNCi1kaXNjb3VyYWdlZC4gSW4gZ2VuZXJhbCwgeW91IHNob3VsZCB1c2UgdGhlIG5hbWVzcGFjZVVyaXMNCi1wYXJhbWV0ZXIuIEhvd2V2ZXIsIHRoZSBsYXR0ZXIgY2Fubm90IGJlIHNldCBvbiB0aGUgY29tbWFuZA0KLWxpbmUuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+bmFtZXNwYWNlVVJJczwvdGQ+DQotPHRkPjwvdGQ+DQotPHRkPk1hcCBvZiBuYW1lc3BhY2UgVVJJIHRvIHBhY2thZ2VzLiBFeGFtcGxlOg0KLSZsdDtuYW1lc3BhY2VVUklzJmd0OyAmbHQ7bmFtZXNwYWNlVVJJJmd0Ow0KLSZsdDt1cmkmZ3Q7dXJpMSZsdDsvdXJpJmd0OyAmbHQ7cGFja2FnZU5hbWUmZ3Q7cGFja2FnZTEmbHQ7L3BhY2thZ2VOYW1lJmd0Ow0KLSZsdDsvbmFtZXNwYWNlVVJJJmd0OyAuLi4uLi4uLiAmbHQ7L25hbWVzcGFjZVVSSSZndDs8L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5vdXRwdXREaXJlY3Rvcnk8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS50YXJnZXR9PC90ZD4NCi08dGQ+VGFyZ2V0IGRpcmVjdG9yeSwgd2hlcmUgc291cmNlcyBhcmUgYmVpbmcNCi10YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvYXhpczIvd3NkbDJjb2RlIGdlbmVyYXRlZC48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5wYWNrYWdlTmFtZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLnBhY2thZ2V9PC90ZD4NCi08dGQ+UGFja2FnZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgc291cmNlcy48L3RkPg0KLTx0ZD48L3RkPg0KLTwvdHI+DQotPHRyPg0KLTx0ZD5wb3J0TmFtZTwvdGQ+DQotPHRkPiR7YXhpczIud3NkbDJjb2RlLnBvcnROYW1lfTwvdGQ+DQotPHRkPlBvcnQgbmFtZSwgZm9yIHdoaWNoIHNvdXJjZXMgYXJlIGJlaW5nIGdlbmVyYXRlZC4gQnkgZGVmYXVsdCwNCi1zb3VyY2VzIGFyZSBnZW5lcmF0ZWQgZm9yIGEgcmFuZG9tbHkgcGlja2VkIHBvcnQuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLSAgICA8dHI+DQotICAgIDx0ZD5hbGxQb3J0czwvdGQ+DQotICAgIDx0ZD4ke2F4aXMyLndzZGwyY29kZS5hbGxQb3J0c308L3RkPg0KLSAgICA8dGQ+U2V0IHRoaXMgdG8gdHJ1ZSB0byBnZW5lcmF0ZSBjb2RlIGZvciBhbGwgcG9ydHMuPC90ZD4NCi0gICAgPHRkPmZhbHNlPC90ZD4NCi0gICAgPC90cj4NCi08dHI+DQotPHRkPnNlcnZpY2VOYW1lPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUuc2VydmljZU5hbWV9PC90ZD4NCi08dGQ+U2VydmljZSBuYW1lLCBmb3Igd2hpY2ggc291cmNlcyBhcmUgYmVpbmcgZ2VuZXJhdGVkLiBCeQ0KLWRlZmF1bHQsIHNvdXJjZXMgYXJlIGdlbmVyYXRlZCBmb3IgYWxsIHNlcnZpY2VzLjwvdGQ+DQotPHRkPjwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnN5bmNNb2RlPC90ZD4NCi08dGQ+JHtheGlzMi53c2RsMmNvZGUuc3luY01vZGV9PC90ZD4NCi08dGQ+U3luYyBtb2RlLCBmb3Igd2hpY2ggc291cmNlcyBhcmUgYmVpbmcgZ2VuZXJhdGVkOyBlaXRoZXIgb2YNCi0ic3luYyIsICJhc3luYyIsIG9yICJib3RoIiAoZGVmYXVsdCkuPC90ZD4NCi08dGQ+Ym90aDwvdGQ+DQotPC90cj4NCi08dHI+DQotPHRkPnVucGFja0NsYXNzZXM8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS51bnBhY2tDbGFzc2VzfTwvdGQ+DQotPHRkPldoZXRoZXIgdG8gdW5wYWNrIGNsYXNzZXMuPC90ZD4NCi08dGQ+PC90ZD4NCi08L3RyPg0KLTx0cj4NCi08dGQ+d3NkbEZpbGU8L3RkPg0KLTx0ZD4ke2F4aXMyLndzZGwyY29kZS53c2RsfTwvdGQ+DQotPHRkPkxvY2F0aW9uIG9mIHRoZSBXU0RMIGZpbGUsIHdoaWNoIGlzIHJlYWQgYXMgaW5wdXQ8L3RkPg0KLTx0ZD5zcmMvbWFpbi9heGlzMi9zZXJ2aWNlLndzZGw8L3RkPg0KLTwvdHI+DQotPC90Ym9keT4NCi08L3RhYmxlPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy9kb3dubG9hZC5jZ2kgYi8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5ZjhkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9kb2N1bWVudGF0aW9uL3hkb2NzL3Rvb2xzL2Rvd25sb2FkLmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBXcmFwcGVyIHNjcmlwdCBhcm91bmQgbWlycm9ycy5jZ2kgc2NyaXB0Ci0jICh3ZSBtdXN0IGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeSBpbiBvcmRlciBmb3IgcHl0aG9uIHRvIHBpY2sgdXAgdGhlCi0jICBweXRob24gaW5jbHVkZXMgY29ycmVjdGx5KQotY2QgL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycwotL3d3dy93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaSAkKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2RvY3VtZW50YXRpb24veGRvY3MvdG9vbHMvaW5kZXgueG1sIGIvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzVlMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZG9jdW1lbnRhdGlvbi94ZG9jcy90b29scy9pbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiINCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDExL0RURC94aHRtbDExLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLQk8aGVhZD4NCi0JCTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5IGZvciBXaW5kb3dzICh2ZXJzIDE0IEp1bmUgMjAwNyksIHNlZSB3d3cudzMub3JnIi8+DQotCQk8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIvPg0KLQkJPHRpdGxlPkF4aXMyIFRvb2xzIERvd25sb2FkIFBhZ2U8L3RpdGxlPg0KLQkJPGxpbmsgaHJlZj0iLi4vY3NzL2F4aXMtZG9jcy5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJhbGwiLz4NCi0JPC9oZWFkPg0KLQk8Ym9keSB4bWw6bGFuZz0iZW4iPg0KLQkJPGgxPkFwYWNoZSBBeGlzMiBUb29sczwvaDE+DQotCQk8cD5BeGlzMiBpcyBidW5kbGVkIHdpdGggYSBzZXQgb2YgdG9vbHMgaW4gb3JkZXIgdG8gbWFrZSB1c2VycycNCi1saWZlIGVhc2llci4gVGhpcyBwYWdlIGlzIG1haW50YWluZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgdG9vbHMNCi1zdXBwb3J0ZWQgYnkgQXhpczIuPC9wPg0KLQkJPHRhYmxlIGJvcmRlcj0iMiI+DQotCQkJPHRib2R5Pg0KLQkJCQk8dHI+DQotCQkJCQk8dGggc2NvcGU9ImNvbCI+TmFtZTwvdGg+DQotCQkJCQk8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPg0KLQkJCQkJPHRoIHNjb3BlPSJjb2wiPlZlcnNpb248L3RoPg0KLQkJCQkJPHRoIHNjb3BlPSJjb2wiPkNvbXBhdGlibGUgQXhpczIgdmVyc2lvbjwvdGg+DQotCQkJCQk8dGggc2NvcGU9ImNvbCI+RG93bmxvYWRzPC90aD4NCi0JCQkJCTx0aCBzY29wZT0iY29sIj5Db21tZW50czwvdGg+DQotCQkJCTwvdHI+DQotCQkJCTx0cj4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSIuLi90b29scy8xXzQvQ29kZWdlblRvb2xSZWZlcmVuY2UuaHRtbCI+Q29kZSBHZW5lcmF0b3INCi1Ub29sLSBDb21tYW5kIExpbmUgJmFtcDsgQW50IFRhc2s8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPlRvb2wgY29uc2lzdHMgb2YgYSBjb21tYW5kIGxpbmUgdmVyc2lvbiBhbmQgYW4gQW50IFRhc2suIEl0IGlzDQotaW1wbGVtZW50ZWQgYnkgdGhlIFdTREwyQ29kZSBjbGFzcyBhbmQgV1NETDJKYXZhIGNsYXNzLiBPbmUgY2FuDQotY2hvb3NlIHRvIHJ1biB0aGUgbWFpbiBjbGFzc2VzIGRpcmVjdGx5IG9yIHVzZSBvbmUgb2YgdGhlIHNjcmlwdHMNCi10byBydW4gdGhlIFdTREwyQ29kZSBhbmQgV1NETDJKYXZhIGFwcHJvcHJpYXRlbHkuPC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQkJPHRkPlRoaXMgdG9vbCBpcyBidW5kbGVkIHdpdGggdGhlIEF4aXMyIFN0YW5kYXJkIEJpbmFyeQ0KLURpc3RyaWJ1dGlvbiBmb3VuZCA8YSBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9kb3dubG9hZC5jZ2kiPmhlcmU8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQk8L3RyPg0KLQkJCQk8dHI+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iLi4vdG9vbHMvMV80L2VjbGlwc2Uvc2VydmljZWFyY2hpdmVyLXBsdWdpbi5odG1sIj5TZXJ2aWNlIEFyY2hpdmUNCi1XaXphcmQgLSBFY2xpcHNlIFBsdWctaW48L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPkFzIHBhcnQgb2YgdGhlIEF4aXMyIHRvb2wgc2V0LCB0aGUgc2VydmljZSBhcmNoaXZlIGdlbmVyYXRvciBpcw0KLWFuIGltcG9ydGFudCB0b29sIHRoYXQgYWxsb3dzIHRoZSBnZW5lcmF0aW9uIG9mIHNlcnZpY2UgYXJjaGl2ZXMNCi0oImFhciIgZmlsZSBvciBhICJqYXIiIGZpbGVzKSB0aGF0IGNhbiBiZSBkZXBsb3llZCBhcyBhIFdlYg0KLXNlcnZpY2VzIHRvIHRoZSBBeGlzMi48L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2Utc2VydmljZS1hcmNoaXZlci13aXphcmQtMS40LnppcCIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1zZXJ2aWNlLWFyY2hpdmVyLXdpemFyZC0xLjQuemlwIj4NCi16aXA8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtYXJjaGl2ZXItd2l6YXJkLTEuNC56aXAubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtYXJjaGl2ZXItd2l6YXJkLTEuNC56aXAubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtYXJjaGl2ZXItd2l6YXJkLTEuNC56aXAuYXNjIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtYXJjaGl2ZXItd2l6YXJkLTEuNC56aXAuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Ii4uL3Rvb2xzLzFfNC9lY2xpcHNlL3dzZGwyamF2YS1wbHVnaW4uaHRtbCI+Q29kZQ0KLUdlbmVyYXRvciBXaXphcmQgLSBFY2xpcHNlIFBsdWctaW48L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPkF4aXMyIGNvZGUgZ2VuZXJhdG9yIGNvbWVzIGJ1aWx0LWluIHdpdGggYW4gPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmVjbGlwc2U8L2E+IHBsdWctaW4uIFRoaXMgY2FuIGJlIHVzZWQgdG8NCi1nZW5lcmF0ZSBhIFdTREwgZmlsZSBmcm9tIGEgamF2YSBjbGFzcyAoSmF2YTJXU0RMKSBhbmQvb3IgYSBqYXZhDQotY2xhc3MgZmlsZSBmcm9tIGEgV1NETCAoV1NETDJKYXZhKTwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXdpemFyZC0xLjQuemlwIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1lY2xpcHNlLWNvZGVnZW4td2l6YXJkLTEuNC56aXAiPg0KLXppcDwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2UtY29kZWdlbi13aXphcmQtMS40LnppcC5tZDUiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2UtY29kZWdlbi13aXphcmQtMS40LnppcC5tZDUiPg0KLU1ENTwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2UtY29kZWdlbi13aXphcmQtMS40LnppcC5hc2MiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWVjbGlwc2UtY29kZWdlbi13aXphcmQtMS40LnppcC5hc2MiPg0KLVBHUDwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQvPg0KLQkJCQk8L3RyPg0KLQkJCQk8dHI+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iLi4vdG9vbHMvMV80L2lkZWEvSWRlYV9wbHVnLWluX3VzZXJndWlkZS5odG1sIj5Db2RlDQotR2VuZXJhdG9yIFdpemFyZCAtIEludGVsbGlKIElERUEgUGx1Zy1pbjwvYT4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+VXNpbmcgdGhpcyB0b29sIG9uZSBjYW4gY3JlYXRlIHNlcnZpY2UgYXJjaGl2ZXMgdGhhdCBjYW4gYmUNCi1kZXBsb3llZCBhcyBhIFdlYiBzZXJ2aWNlcyB0byB0aGUgQXhpczIsIGFuZCBhbHNvIGdlbmVyYXRlIGEgamF2YQ0KLWNsYXNzIGZpbGUgZnJvbSBhIFdTREwgZmlsZSAoV1NETDJKYXZhKS48L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWlkZWEtcGx1Z2luLTEuNC56aXAiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWlkZWEtcGx1Z2luLTEuNC56aXAiPg0KLXppcDwvYT4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWlkZWEtcGx1Z2luLTEuNC56aXAubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1pZGVhLXBsdWdpbi0xLjQuemlwLm1kNSI+DQotTUQ1PC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItaWRlYS1wbHVnaW4tMS40LnppcC5hc2MiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWlkZWEtcGx1Z2luLTEuNC56aXAuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCU1hdmVuMiBBbnQgUGx1Zy1pbg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZD5BbnQgVGFzayBmb3IgV1NETDJKYXZhPC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hbnQtcGx1Z2luLTEuNC5qYXIiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWFudC1wbHVnaW4tMS40LmphciI+DQotamFyPC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYW50LXBsdWdpbi0xLjQuamFyLm1kNSIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYW50LXBsdWdpbi0xLjQuamFyLm1kNSI+DQotTUQ1PC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYW50LXBsdWdpbi0xLjQuamFyLmFzYyIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYW50LXBsdWdpbi0xLjQuamFyLmFzYyI+DQotUEdQPC9hPg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZC8+DQotCQkJCTwvdHI+DQotCQkJCTx0cj4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSIuLi90b29scy8xXzQvbWF2ZW4tcGx1Z2lucy9tYXZlbi1hYXItcGx1Z2luLmh0bWwiPk1hdmVuMiBBQVINCi1QbHVnLWluPC9hPg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZD5UaGlzIHBsdWdpbiBnZW5lcmF0ZXMgYW4gQXhpczIgc2VydmljZSBmaWxlIChBQVIgZmlsZSkuPC90ZD4NCi0JCQkJCTx0ZD4xLjQ8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIiIHRpdGxlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWFhci1tYXZlbi1wbHVnaW4tMS40LmphciI+DQotamFyPC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyLm1kNSIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyLm1kNSI+DQotTUQ1PC9hPg0KLQkJCQkJCTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyLmFzYyIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItYWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyLmFzYyI+DQotUEdQPC9hPg0KLQkJCQkJPC90ZD4NCi0JCQkJCTx0ZC8+DQotCQkJCTwvdHI+DQotCQkJCTx0cj4NCi0JCQkJCTx0ZD4NCi0JCQkJCQlNYXZlbjIgTUFSIFBsdWctaW4NCi0JCQkJCTwvdGQ+DQotCQkJCQk8dGQ+VGhpcyBwbHVnaW4gZ2VuZXJhdGVzIGFuIEF4aXMyIG1vZHVsZSBhcmNoaXZlIGZpbGUgKE1BUiBmaWxlKS48L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLW1hci1tYXZlbi1wbHVnaW4tMS40LmphciIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItbWFyLW1hdmVuLXBsdWdpbi0xLjQuamFyIj4NCi1qYXI8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Ii4uL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLWphdmEyd3NkbC1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotSmF2YTJXU0RMIFBsdWctaW48L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxwPlRoaXMgcGx1Z2luIHRha2VzIGFzIGlucHV0IGEgSmF2YSBjbGFzcyBhbmQgZ2VuZXJhdGVzIGEgV1NETCwNCi13aGljaCBkZXNjcmliZXMgYSBXZWIgc2VydmljZSBmb3IgaW52b2tpbmcgdGhlIGNsYXNzZXMgbWV0aG9kcy48L3A+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4tMS40LmphciIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi0xLjQuamFyIj4NCi1qYXI8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQkJPHRyPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxhIGhyZWY9Ii4uL3Rvb2xzLzFfNC9tYXZlbi1wbHVnaW5zL21hdmVuLXdzZGwyY29kZS1wbHVnaW4uaHRtbCI+TWF2ZW4yDQotV1NETDJDb2RlIFBsdWctaW48L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPg0KLQkJCQkJCTxwPlRoaXMgcGx1Z2luIHRha2VzIGFzIGlucHV0IGEgV1NETCBhbmQgZ2VuZXJhdGVzIGNsaWVudCBhbmQNCi1zZXJ2ZXIgc3R1YnMgZm9yIGNhbGxpbmcgb3IgaW1wbGVtZW50aW5nIGEgV2ViIHNlcnZpY2UgbWF0Y2hpbmcgdGhlDQotV1NETC48L3A+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkPjEuNDwvdGQ+DQotCQkJCQk8dGQ+MS40PC90ZD4NCi0JCQkJCTx0ZD4NCi0JCQkJCQk8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kvd3MvYXhpczIvdG9vbHMvMV80L2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4tMS40LmphciIgdGl0bGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9keW4vbWlycm9ycy9taXJyb3JzLmNnaS93cy9heGlzMi90b29scy8xXzQvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi0xLjQuamFyIj4NCi1qYXI8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1IiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLTEuNC5qYXIubWQ1Ij4NCi1NRDU8L2E+DQotCQkJCQkJPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIiB0aXRsZT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2R5bi9taXJyb3JzL21pcnJvcnMuY2dpL3dzL2F4aXMyL3Rvb2xzLzFfNC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLTEuNC5qYXIuYXNjIj4NCi1QR1A8L2E+DQotCQkJCQk8L3RkPg0KLQkJCQkJPHRkLz4NCi0JCQkJPC90cj4NCi0JCQk8L3Rib2R5Pg0KLQkJPC90YWJsZT4NCi0JPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5NjkzNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1UaGlzIG1vZHVsZSBoYW5kbGVzIEZhc3QgSW5mb3NldCAoRkkpIGJpbmFyeSBzZXJpYWxpemF0aW9uIGZvciBBeGlzMi4KLQotVGhlIGZhc3QgaW5mb3NldCBwYXJzZXIgdXNlZCBoZXJlIGlzIGZyb20gRmFzdCBJbmZvc2V0IFByb2plY3QgQCBodHRwczovL2ZpLmRldi5qYXZhLm5ldC8KLQotRkkgMS4xLnggaXMgdGFyZ2V0ZWQgdG8gSkRLMS40IGFuZCBpcyB1c2VkIGluIEpBWC1XUyAyLjAsIEpBWEIgMi4wLgotRkkgMS4yLnggaXMgdGFyZ2V0ZWQgdG8gSkRLMS41IGFuZCBpcyB1c2VkIGluIEpBWC1XUyAyLjEsIEpBWEIgMi4xLgotCi1UaGUgbWF2ZW4gc2NyaXB0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyB0aGUgSkRLIHZlcnNpb24gYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgRkkgamFyIGZpbGUuCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9wb20ueG1sIGIvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmN2QyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1mYXN0aW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBGYXN0IEluZm9zZXQ8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIEZhc3QgSW5mb3NldCBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuZmFzdGluZm9zZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1maWxldXBsb2FkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1maWxldXBsb2FkPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXZhMndzZGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5uZWV0aGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZWV0aGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWRkcmVzc2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvZmFzdGluZm9zZXQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvZmFzdGluZm9zZXQ8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi53c2RsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3JlcG88L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcmVwby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y3JlYXRlLXRlc3QtcmVwb3NpdG9yeTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3JlcG88L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2V0IGEgcHJvcGVydHkgdGhhdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gdGhlIGFudCBidWlsZC54bWwncyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLnRlc3QucGF0aCIgcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uY29tcGlsZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb21waWxpbmcgc29tZSBjdXN0b20gd3NkbCBmaWxlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9IndzZGwuc291cmNlLmRpciIgdmFsdWU9InRlc3QtcmVzb3VyY2VzL3dzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3c2RsLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC93c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5Db21waWxpbmcgU2VydmljZSBjbGFzczwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmFjIGZvcms9InRydWUiIGRlc3RkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKlNpbXBsZUFkZFNlcnZpY2UuamF2YSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcmMgcGF0aD0idGVzdC8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YWM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgdGhlIFdTREw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItbyB0YXJnZXQvdGVzdC1jbGFzc2VzIC1vZiBTaW1wbGVBZGRTZXJ2aWNlLndzZGwgLWVmZCB1bnF1YWxpZmllZCAtY24gb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5TaW1wbGVBZGRTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+Q29tcGlsaW5nIFNpbXBsZUFkZFNlcnZpY2Uud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHt3c2RsLm91dHB1dC5iYXNlLmRpcn0vc2ltcGxlQWRkU2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLXVyaSB0YXJnZXQvdGVzdC1jbGFzc2VzL1NpbXBsZUFkZFNlcnZpY2Uud3NkbCAtbyB0YXJnZXQvd3NkbC9zaW1wbGVBZGRTZXJ2aWNlIC1TIC4gLW9yIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSJ0YXJnZXQvY2xhc3NlcyIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3JjIHBhdGg9InRhcmdldC93c2RsL3NpbXBsZUFkZFNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIHBlcnRlc3QgZm9ya01vZGUgaXMgbm90IGlkZWFsIGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB0ZXN0IHNlcnZlciBkb2Vzbid0IHNodXQgZG93biBwcm9wZXJseSA6LSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaG91bGQgYmUgcmVtb3ZlZCBpZiBwb3NzaWJsZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGZvcmtNb2RlPnBlcnRlc3Q8L2ZvcmtNb2RlPgotICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG1zMjU2bSAtWG14NTEybTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBFbmFibGUgdGhlIG5leHQgMiBsaW5lcyBpZiB5b3Ugd2FudCB0byBhdHRhY2ggYSBkZWJ1Z2dlcgotICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1YZGVidWcgLVhub2FnZW50IC1EamF2YS5jb21waWxlcj1OT05FIC1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPTUwMDY8L2FyZ0xpbmU+LS0+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmJ1aWxkLnJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPi4vdGFyZ2V0L3Rlc3QtY2xhc3NlczwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1ZTdjNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50UGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEZhc3RJbmZvc2V0QnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhGYXN0SW5mb3NldEJ1aWxkZXIuY2xhc3MpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBPTUVsZW1lbnQgaGFuZGxlciB0byB0aGUgZG9jdW1lbnQgZWxlbWVudCBvZiB0aGUgRmFzdCBJbmZvc2V0IG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtIElucHV0U3RyZWFtIHRvIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgdHlwZSBvZiB0aGUgbWVzc2FnZQotCSAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCBNZXNzYWdlQ29udGV4dCB0byBiZSB1c2VkCi0JICogCi0JICogQHJldHVybiBPTUVsZW1lbnQgaGFuZGxlciB0byB0aGUgZG9jdW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXIjcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtLCBTdHJpbmcsIE1lc3NhZ2VDb250ZXh0KQotCSAqLwotCXB1YmxpYyBPTUVsZW1lbnQgcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgY29udGVudFR5cGUsIAotCQkJTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCQlpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCWxvZ2dlci5kZWJ1ZygiUHJvY2Vzc2luZyBhIERvY3VtZW50IHdpdGggdGhlIGNvbnRlbnQgdHlwZTogIiArIGNvbnRlbnRUeXBlKTsKLQkJfQotCQkvL0NyZWF0ZSBhIGluc3RhbmNlIG9mIHRoZSBTdEFYIFBhcnNlciB3aGljaCBjYW4gaGFuZGxlIHRoZSBmYXN0IGluZm9zZXQgc3RyZWFtIAotCQlYTUxTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0gbmV3IFN0QVhEb2N1bWVudFBhcnNlcihpbnB1dFN0cmVhbSk7Ci0JCVN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLQotCQlyZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0TWVzc2FnZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZkMDk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0TWVzc2FnZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBGYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIgaW1wbGVtZW50cyBNZXNzYWdlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhGYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIuY2xhc3MpOwotCQotCS8qKgotCSAqIEZhc3QgSW5mb3NldCBtZXNzYWdlIGZvcm1hdHRlciBkb2Vzbid0IG5lZWQgdG8gaGFuZGxlIFNPQVAuIEhlbmNlIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI2Zvcm1hdFNPQVBBY3Rpb24ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLQkJCU9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJhdyBieXRlcyBmcm9tIHRoZSBTT0FQIGVudmVsb3AuCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI2dldEJ5dGVzKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJT01FbGVtZW50IGVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkKLQkJdHJ5IHsKLQkJCS8vQ3JlYXRlcyBTdEFYIGRvY3VtZW50IHNlcmlhbGl6ZXIgd2hpY2ggYWN0dWFsbHkgaW1wbGVtZW50cyB0aGUgWE1MU3RyZWFtV3JpdGVyCi0JCQlYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtV3JpdGVyID0gbmV3IFN0QVhEb2N1bWVudFNlcmlhbGl6ZXIob3V0U3RyZWFtKTsKLQkJCWVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShzdHJlYW1Xcml0ZXIpOwotCQkJLy9UT0RPIExvb2tzIGxpa2UgdGhlIFNPQVAgZW52ZWxvcCBkb2Vzbid0IGhhdmUgYW4gZW5kIGRvY3VtZW50IHRhZy4gRmluZCBvdXQgd2h5PwotCQkJc3RyZWFtV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLQkJCQotCQkJcmV0dXJuIG91dFN0cmVhbS50b0J5dGVBcnJheSgpOwotCQkJCi0JCX0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4bWxzZSkgewotCQkJbG9nZ2VyLmVycm9yKHhtbHNlLmdldE1lc3NhZ2UoKSk7Ci0JCQl0aHJvdyBuZXcgQXhpc0ZhdWx0KHhtbHNlLmdldE1lc3NhZ2UoKSwgeG1sc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI2dldENvbnRlbnRUeXBlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotCQkJT01PdXRwdXRGb3JtYXQgZm9ybWF0LCBTdHJpbmcgc29hcEFjdGlvbikgewotCQlTdHJpbmcgY29udGVudFR5cGUgPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUpOwotCQlTdHJpbmcgZW5jb2RpbmcgPSBmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCk7Ci0JCQotCQkvL0lmIHRoZSBDb250ZW50IFR5cGUgaXMgbm90IGF2YWlsYWJsZSB3aXRoIHRoZSBwcm9wZXJ0eSAiQ29udGVudCBUeXBlIiByZXRyaWV2ZSBpdCBmcm9tIHRoZSBwcm9wZXJ0eSAiTWVzc2FnZSBUeXBlIgotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUpOwotCQl9Ci0KLQkJaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlICs9ICI7IGNoYXJzZXQ9IiArIGVuY29kaW5nOwotCQl9Ci0JICAgICAgICAKLQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldCBhZGRyZXNzIHRvIHNlbmQgdGhlIHJlc3BvbnNlCi0JICogRklYTUUgVGhpcyBpcyB2ZXJ5IEhUVFAgc3BlY2lmaWMuIFdoYXQgYWJvdXQgb3RoZXIgdHJhbnNwb3J0PwotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNnZXRUYXJnZXRBZGRyZXNzKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCwgamF2YS5uZXQuVVJMKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VGFyZ2V0QWRkcmVzcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLQkJCU9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgVVJMIHRhcmdldFVSTCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0KLSAgICAgICAgICAgIChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EKTsKLQotICAgICAgICBVUkwgdGFyZ2V0QWRkcmVzcyA9IHRhcmdldFVSTDsgLy9MZXQncyBpbml0aWFsaXplIHRvIHRoaXMKLQkgICAgLy9pZiB0aGUgaHR0cCBtZXRob2QgaXMgR0VULCBwYXJhbWV0ZXJzIGFyZSBhdHRhY2hlZCB0byB0aGUgdGFyZ2V0IFVSTAotCSAgICBpZiAoKGh0dHBNZXRob2QgIT0gbnVsbCkKLQkgICAgICAgICAgICAmJiBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9HRVQuZXF1YWxzSWdub3JlQ2FzZShodHRwTWV0aG9kKSkgewotCSAgICAgICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW0obWVzc2FnZUNvbnRleHQpOwotCQotCSAgICAgICAgaWYgKHBhcmFtLmxlbmd0aCgpID4gMCkgewotCSAgICAgICAgICAgIFN0cmluZyByZXR1cm5VUkxGaWxlID0gdGFyZ2V0VVJMLmdldEZpbGUoKSArICI/IiArIHBhcmFtOwotCSAgICAgICAgICAgIHRyeSB7Ci0JICAgICAgICAgICAgICAgIHRhcmdldEFkZHJlc3MgPSAKLQkgICAgICAgICAgICAgICAgCW5ldyBVUkwodGFyZ2V0VVJMLmdldFByb3RvY29sKCksIHRhcmdldFVSTC5nZXRIb3N0KCksIHRhcmdldFVSTC5nZXRQb3J0KCksIHJldHVyblVSTEZpbGUpOwotCSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotCSAgICAgICAgICAgIAlsb2dnZXIuZXJyb3IobXVybGUuZ2V0TWVzc2FnZSgpKTsKLQkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtdXJsZS5nZXRNZXNzYWdlKCksIG11cmxlKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiB0YXJnZXRBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBTT0FQIGVudmVsb3AgdG8gdGhlIGdpdmVuIE91dHB1dFN0cmVhbS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXIjd3JpdGVUbyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQsIGphdmEuaW8uT3V0cHV0U3RyZWFtLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLQkJCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0JCQotCQl0cnkgewotCQkJLy9DcmVhdGUgdGhlIFN0QVggZG9jdW1lbnQgc2VyaWFsaXplcgotCQkJWE1MU3RyZWFtV3JpdGVyIHN0cmVhbVdyaXRlciA9IG5ldyBTdEFYRG9jdW1lbnRTZXJpYWxpemVyKG91dHB1dFN0cmVhbSk7Ci0JCQlpZiAocHJlc2VydmUpIHsKLQkJCQllbGVtZW50LnNlcmlhbGl6ZShzdHJlYW1Xcml0ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoc3RyZWFtV3JpdGVyKTsKLQkJCX0KLS8vCQkJVE9ETyBMb29rcyBsaWtlIHRoZSBTT0FQIGVudmVsb3AgZG9lc24ndCBoYXZlIGEgZW5kIGRvY3VtZW50IHRhZy4gRmluZCBvdXQgd2h5PwotCQkJc3RyZWFtV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIHhtbHNlKSB7Ci0JCQlsb2dnZXIuZXJyb3IoeG1sc2UuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBBeGlzRmF1bHQoeG1sc2UuZ2V0TWVzc2FnZSgpLCB4bWxzZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IFVSTCBwYXJhbWV0ZXJzIGxpa2UsICJwYXJhbTE9dmFsdWUxJnBhcmFtMj12YWx1ZTIiCi0JICogRklYTUUgVGhpcyBpcyB2ZXJ5IEhUVFAgc3BlY2lmaWMuIFdoYXQgYWJvdXQgb3RoZXIgdHJhbnNwb3J0cwotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotCSAqIEByZXR1cm4gRm9ybWF0dGVkIFVSTCBwYXJhbWV0ZXJzCi0JICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW0oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgCi0gICAgCU9NRWxlbWVudCBkYXRhT3V0ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZGF0YU91dC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKSArICI9IiArIGVsZW1lbnQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgcGFyYW1CdWZmZXIuYXBwZW5kKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICBwYXJhbUJ1ZmZlci5hcHBlbmQoIiYiKTsKLSAgICAgICAgfQotICAgICAgICAvL1dlIGRvbid0IG5lZWQgYSAnJicgYXQgdGhlIGVuZAotICAgICAgICBwYXJhbUJ1ZmZlci5kZWxldGVDaGFyQXQocGFyYW1CdWZmZXIubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYXJhbUJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvc3JjL29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvRmFzdEluZm9zZXRQT1hCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBPWEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYTljNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBPWEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50UGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEZhc3RJbmZvc2V0UE9YQnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEZhc3RJbmZvc2V0QnVpbGRlci5jbGFzcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIE9NRWxlbWVudCBoYW5kbGVyIHRvIHRoZSBkb2N1bWVudCBlbGVtZW50IG9mIHRoZSBGYXN0IEluZm9zZXQgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0gSW5wdXRTdHJlYW0gdG8gdGhlIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY29udGVudFR5cGUgQ29udGVudCB0eXBlIG9mIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IE1lc3NhZ2VDb250ZXh0IHRvIGJlIHVzZWQKLQkgKiAKLQkgKiBAcmV0dXJuIE9NRWxlbWVudCBoYW5kbGVyIHRvIHRoZSBkb2N1bWVudCBlbGVtZW50Ci0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlciNwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0sIFN0cmluZywgTWVzc2FnZUNvbnRleHQpCi0JICovCi0JcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwgCi0JCQlNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCWlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJbG9nZ2VyLmRlYnVnKCJQcm9jZXNzaW5nIGEgRG9jdW1lbnQgd2l0aCB0aGUgY29udGVudCB0eXBlOiAiICsgY29udGVudFR5cGUpOwotCQl9Ci0JCS8vQ3JlYXRlIGEgaW5zdGFuY2Ugb2YgdGhlIFN0QVggUGFyc2VyIHdoaWNoIGNhbiBoYW5kbGUgdGhlIGZhc3QgaW5mb3NldCBzdHJlYW0KLQkJWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBTdEFYRG9jdW1lbnRQYXJzZXIoaW5wdXRTdHJlYW0pOwotCQlTdEFYQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLQotCQlyZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC9zcmMvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFBPWE1lc3NhZ2VGb3JtYXR0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0UE9YTWVzc2FnZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZjOGUyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0UE9YTWVzc2FnZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotaW1wb3J0IGNvbS5zdW4ueG1sLmZhc3RpbmZvc2V0LnN0YXguU3RBWERvY3VtZW50U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBGYXN0SW5mb3NldFBPWE1lc3NhZ2VGb3JtYXR0ZXIgaW1wbGVtZW50cyBNZXNzYWdlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZyhGYXN0SW5mb3NldE1lc3NhZ2VGb3JtYXR0ZXIuY2xhc3MpOwotCQotCS8qKgotCSAqIFBsYWluIEZhc3QgSW5mb3NldCBtZXNzYWdlIGZvcm1hdHRlciBkb2Vzbid0IG5lZWQgdG8gaGFuZGxlIFNPQVAuIEhlbmNlIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI2Zvcm1hdFNPQVBBY3Rpb24ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLQkJCU9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJhdyBieXRlcyBmcm9tIHRoZSBTT0FQIGVudmVsb3AuCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI2dldEJ5dGVzKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCkKLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJLy9Gb3IgUE9YIGRyb3AgdGhlIFNPQVAgZW52ZWxvcGUgYW5kIHVzZSB0aGUgbWVzc2FnZSBib2R5Ci0JCU9NRWxlbWVudCBlbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQotCQl0cnkgewotCQkJLy9DcmVhdGVzIFN0QVggZG9jdW1lbnQgc2VyaWFsaXplciB3aGljaCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBYTUxTdHJlYW1Xcml0ZXIKLQkJCVhNTFN0cmVhbVdyaXRlciBzdHJlYW1Xcml0ZXIgPSBuZXcgU3RBWERvY3VtZW50U2VyaWFsaXplcihvdXRTdHJlYW0pOwotCQkJLy9TaW5jZSB3ZSBkcm9wIHRoZSBTT0FQIGVudmVsb3Agd2UgaGF2ZSB0byBtYW51YWxseSB3cml0ZSB0aGUgc3RhcnQgZG9jdW1lbnQgYW5kIHRoZSBlbmQgZG9jdW1lbnQgZXZlbnRzCi0JCQlzdHJlYW1Xcml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7Ci0JCQllbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoc3RyZWFtV3JpdGVyKTsKLQkJCXN0cmVhbVdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0JCQkKLQkJCXJldHVybiBvdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCQotCQl9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geG1sc2UpIHsKLQkJCWxvZ2dlci5lcnJvcih4bWxzZS5nZXRNZXNzYWdlKCkpOwotCQkJdGhyb3cgbmV3IEF4aXNGYXVsdCh4bWxzZS5nZXRNZXNzYWdlKCksIHhtbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlciNnZXRDb250ZW50VHlwZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLQkJCU9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFKTsKLQkJU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotCQkKLQkJLy9JZiB0aGUgQ29udGVudCBUeXBlIGlzIG5vdCBhdmFpbGFibGUgd2l0aCB0aGUgcHJvcGVydHkgIkNvbnRlbnQgVHlwZSIgcmV0cmlldmUgaXQgZnJvbSB0aGUgcHJvcGVydHkgIk1lc3NhZ2UgVHlwZSIKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLQkJfQotCi0JCWlmIChlbmNvZGluZyAhPSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSArPSAiOyBjaGFyc2V0PSIgKyBlbmNvZGluZzsKLQkJfQotCSAgICAgICAgCi0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXQgYWRkcmVzcyB0byBzZW5kIHRoZSByZXNwb25zZQotCSAqIEZJWE1FIFRoaXMgaXMgdmVyeSBIVFRQIHNwZWNpZmljLiBXaGF0IGFib3V0IG90aGVyIHRyYW5zcG9ydD8KLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXIjZ2V0VGFyZ2V0QWRkcmVzcyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQsIGphdmEubmV0LlVSTCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFRhcmdldEFkZHJlc3MoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0JCQlPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFVSTCB0YXJnZXRVUkwpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgaHR0cE1ldGhvZCA9Ci0gICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCk7Ci0KLSAgICAgICAgVVJMIHRhcmdldEFkZHJlc3MgPSB0YXJnZXRVUkw7IC8vTGV0J3MgaW5pdGlhbGl6ZSB0byB0aGlzCi0JICAgIC8vaWYgdGhlIGh0dHAgbWV0aG9kIGlzIEdFVCwgcGFyYW1ldGVycyBhcmUgYXR0YWNoZWQgdG8gdGhlIHRhcmdldCBVUkwKLQkgICAgaWYgKChodHRwTWV0aG9kICE9IG51bGwpCi0JICAgICAgICAgICAgJiYgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VULmVxdWFsc0lnbm9yZUNhc2UoaHR0cE1ldGhvZCkpIHsKLQkgICAgICAgIFN0cmluZyBwYXJhbSA9IGdldFBhcmFtKG1lc3NhZ2VDb250ZXh0KTsKLQkKLQkgICAgICAgIGlmIChwYXJhbS5sZW5ndGgoKSA+IDApIHsKLQkgICAgICAgICAgICBTdHJpbmcgcmV0dXJuVVJMRmlsZSA9IHRhcmdldFVSTC5nZXRGaWxlKCkgKyAiPyIgKyBwYXJhbTsKLQkgICAgICAgICAgICB0cnkgewotCSAgICAgICAgICAgICAgICB0YXJnZXRBZGRyZXNzID0gCi0JICAgICAgICAgICAgICAgIAluZXcgVVJMKHRhcmdldFVSTC5nZXRQcm90b2NvbCgpLCB0YXJnZXRVUkwuZ2V0SG9zdCgpLCB0YXJnZXRVUkwuZ2V0UG9ydCgpLCByZXR1cm5VUkxGaWxlKTsKLQkgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkgICAgICAgICAgICAJbG9nZ2VyLmVycm9yKG11cmxlLmdldE1lc3NhZ2UoKSk7Ci0JICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXVybGUuZ2V0TWVzc2FnZSgpLCBtdXJsZSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIAotCSAgICByZXR1cm4gdGFyZ2V0QWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgU09BUCBlbnZlbG9wIHRvIHRoZSBnaXZlbiBPdXRwdXRTdHJlYW0uCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyI3dyaXRlVG8ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0LCBqYXZhLmlvLk91dHB1dFN0cmVhbSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVRvKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0JCQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBib29sZWFuIHByZXNlcnZlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJLy9Gb3IgUE9YIGRyb3AgdGhlIFNPQVAgZW52ZWxvcGUgYW5kIHVzZSB0aGUgbWVzc2FnZSBib2R5Ci0JCU9NRWxlbWVudCBlbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQl0cnkgewotCQkJLy9DcmVhdGUgdGhlIFN0QVggZG9jdW1lbnQgc2VyaWFsaXplcgotCQkJWE1MU3RyZWFtV3JpdGVyIHN0cmVhbVdyaXRlciA9IG5ldyBTdEFYRG9jdW1lbnRTZXJpYWxpemVyKG91dHB1dFN0cmVhbSk7Ci0JCQkvL1NpbmNlIHdlIGRyb3AgdGhlIFNPQVAgZW52ZWxvcCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHdyaXRlIHRoZSBzdGFydCBkb2N1bWVudCBhbmQgdGhlIGVuZCBkb2N1bWVudCBldmVudHMJCQkKLQkJCXN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLQkJCWlmIChwcmVzZXJ2ZSkgewotCQkJCWVsZW1lbnQuc2VyaWFsaXplKHN0cmVhbVdyaXRlcik7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShzdHJlYW1Xcml0ZXIpOwotCQkJfQotCQkJc3RyZWFtV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLQkJfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIHhtbHNlKSB7Ci0JCQlsb2dnZXIuZXJyb3IoeG1sc2UuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBBeGlzRmF1bHQoeG1sc2UuZ2V0TWVzc2FnZSgpLCB4bWxzZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IFVSTCBwYXJhbWV0ZXJzIGxpa2UsICJwYXJhbTE9dmFsdWUxJnBhcmFtMj12YWx1ZTIiCi0JICogRklYTUUgVGhpcyBpcyB2ZXJ5IEhUVFAgc3BlY2lmaWMuIFdoYXQgYWJvdXQgb3RoZXIgdHJhbnNwb3J0cwotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotCSAqIEByZXR1cm4gRm9ybWF0dGVkIFVSTCBwYXJhbWV0ZXJzCi0JICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW0oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgCi0gICAgCU9NRWxlbWVudCBkYXRhT3V0ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZGF0YU91dC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXJhbUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKSArICI9IiArIGVsZW1lbnQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgcGFyYW1CdWZmZXIuYXBwZW5kKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICBwYXJhbUJ1ZmZlci5hcHBlbmQoIiYiKTsKLSAgICAgICAgfQotICAgICAgICAvL1dlIGRvbid0IG5lZWQgYSAnJicgYXQgdGhlIGVuZAotICAgICAgICBwYXJhbUJ1ZmZlci5kZWxldGVDaGFyQXQocGFyYW1CdWZmZXIubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwYXJhbUJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjYmMwZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0LXJlc291cmNlcy9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmlsZSBjYWNoaW5nIGZvciBhdHRhY2htZW50cyAtLT4KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2l6ZVRocmVzaG9sZCI+NDAwMDwvcGFyYW1ldGVyLS0+Ci0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIG1pbGxpc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzAwMDA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPgotCi0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5naXVzaCB0aG9zZSBlbmRwb2ludHMtLT4KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+Ci0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gQXhpczItLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXQgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+Ci0JPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0UE9YTWVzc2FnZUZvcm1hdHRlciIvPgotCTxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0TWVzc2FnZUZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlQnVpbGRlcnM+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlciIvPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4KLQk8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LkZhc3RJbmZvc2V0UE9YQnVpbGRlciIvPgotCTxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vc29hcCtmYXN0aW5mb3NldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5GYXN0SW5mb3NldEJ1aWxkZXIiLz4KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij44MDgwPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6Ci0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkKLSAgICAgICAgICAgIGhvc3RuYW1lOiAgaWYgbm9uLW51bGwsIHVybCBwcmVmaXggdXNlZCBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgbnVsbCkKLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikKLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApCi0gICAgICAgICAgICByZXF1ZXN0VGNwTm9EZWxheTogIHRydWUgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgYW5kIG1pbmltaXplIGxhdGVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMKLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpCi0gICAgICAgICAgICByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBpZiBxdWV1ZSBmaWxscyB1cyAgICAgICAgIChkZWZhdWx0IDE1MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5Ci0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgbm8gc3VjaCB0aHJlYWRzIGNhbiBleGlzdCB3aXRoIGRlZmF1bHQgdW5ib3VuZGVkIHJlcXVlc3QgcXVldWUKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+aHR0cDovL3d3dy5teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4gLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiPjEwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRjcE5vRGVsYXkiPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiPjEwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZSI+MjQwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCI+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tIElmIGZvbGxvd2luZyBpcyBzZXQgdG8gJ3RydWUnLCBvcHRpb25hbCBhY3Rpb24gcGFydCBvZiB0aGUgQ29udGVudC1UeXBlIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBTT0FQIDEuMiBtZXNzYWdlcyAtLT4KLSAgICAgICAgPCEtLSAgPHBhcmFtZXRlciBuYW1lPSJPbWl0U09BUDEyQWN0aW9uIj50cnVlPC9wYXJhbWV0ZXI+ICAtLT4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDwhLS08bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPi0tPgotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ2x1c3RlcmluZyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29uZmlndXJlIGFuZCB1bmNvbW1lbnQgZm9sbG93aW5nIGZvciBwcmVwYXJpbmcgQXhpczIgdG8gYSBjbHVzdGVyZWQgZW52aXJvbm1lbnQgLS0+Ci0gICAgPCEtLQotICAgIDxjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbTEiPnZhbHVlMTwvcGFyYW1ldGVyPgotICAgIAk8Y29uZmlndXJhdGlvbk1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci50cmliZXMuY29uZmlndXJhdGlvbi5UcmliZXNDb25maWd1cmF0aW9uTWFuYWdlciI+Ci0gICAgCSAgICA8bGlzdGVuZXJzPgotICAgIAkgICAgPC9saXN0ZW5lcnM+Ci0gICAgCTwvY29uZmlndXJhdGlvbk1hbmFnZXI+Ci0gICAgCTxjb250ZXh0TWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLnRyaWJlcy5jb250ZXh0LlRyaWJlc0NvbnRleHRNYW5hZ2VyIj4KLSAgICAJICAgIDxsaXN0ZW5lcnM+Ci0gICAgCSAgICA8L2xpc3RlbmVycz4KLSAgICAJPC9jb250ZXh0TWFuYWdlcj4KLSAgICA8L2NsdXN0ZXI+Ci0gICAgLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldElucHV0T3V0cHV0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0SW5wdXRPdXRwdXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjI4ZjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0SW5wdXRPdXRwdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFBhcnNlcjsKLWltcG9ydCBjb20uc3VuLnhtbC5mYXN0aW5mb3NldC5zdGF4LlN0QVhEb2N1bWVudFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXN0SW5mb3NldElucHV0T3V0cHV0VGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdG8gdGVzdCBob3cgZmFzdCBpbmZvc2V0IGludGVyb3BlcmF0ZSB3aXRoIEF4aW9tLgotICAgICAqIFRoaXMgaXMgaG93IHRoaXMgdGVzdCBpcyBvcmdhbml6ZWQuCi0gICAgICogPHByZT4KLSAgICAgKiAgICAgIGRlLXNlcih3c3R4KSAgICAgICAgc2VyKGZhc3QtaW5mbykgICAgICAgICAgICAgZGUtc2VyKGZhc3QtaW5mbykgICAgICAgc2VyKHdzdHgpCi0gICAgICogWE1MICAtLS0tLS0tLT4gICAgIEF4aW9tICAgICAtLS0tLS0+ICAgIGJpbmFyeSBmaWxlIC0tLS0tLS0tLS0tLS0tPiAgIEF4aW9tIC0tLS0tLS0tLT4gWE1MCi0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIFRoZW4gdGhlIGluaXRpYWwgWE1MIGZpbGUgYW5kIHRoZSBsYXN0IFhNTCB3aWxsIGJlIGNvbXBhcmVkIHRvIHNlZSB3aGV0aGVyIHRoZXkgYXJlIHRoZSBzYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dE91dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW5wdXRGaWxlID0gInBvbS54bWwiOwotICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZSgidGFyZ2V0L291dHB1dC54bWwiKTsKLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC5iaW4iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgbGV0J3MgcmVhZCB0aGUgeG1sIGRvY3VtZW50IGluIHRvIEF4aW9tCi0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0RmlsZSkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIG91dHB1dCBpdCB1c2luZyBiaW5hcnkgeG1sIG91dHB1dHRlcgotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbVdyaXRlciA9IG5ldyBTdEFYRG9jdW1lbnRTZXJpYWxpemVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSk7Ci0gICAgICAgICAgICBzdHJlYW1Xcml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7Ci0gICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoc3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHN0cmVhbVdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyBsZXQncyByZWFkIHRoZSBiaW5hcnkgZmlsZSBpbiB0byBBeGlvbQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBTdEFYRG9jdW1lbnRQYXJzZXIobmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wRmlsZSkpOwotICAgICAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHN0cmVhbVJlYWRlcik7Ci0gICAgICAgICAgICBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpLnNlcmlhbGl6ZShuZXcgRmlsZVdyaXRlcihvdXRwdXRGaWxlKSk7Ci0KLSAgICAgICAgICAgIC8vIGxldCdzIHNlZSB0aGlzIGlzIHRoZSBzYW1lIHRoYXQgd2UgZmVkIGluIHRvIHRoaXMgdGVzdCBpbml0aWFsbHkKLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ldyBGaWxlUmVhZGVyKGlucHV0RmlsZSksIG5ldyBGaWxlUmVhZGVyKG91dHB1dEZpbGUpKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIG91dHB1dEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICBpZiAodGVtcEZpbGUuZXhpc3RzKCkpIHRlbXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L0Zhc3RJbmZvc2V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJmOGVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9GYXN0SW5mb3NldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZhc3RJbmZvc2V0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIFNpbXBsZUhUVFBTZXJ2ZXIgc2VydmVyOwotCXByaXZhdGUgc3RhdGljIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0JcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0OwotCXByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLQkJU2ltcGxlQWRkU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQWRkU2VydmljZUNsaWVudCh0YXJnZXQpOyAvL0NvbW1lbnQgdG8gdGVzdCB3aXRoIHRjcG1vbi4KLS8vCQlTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KCk7IC8vVW5jb21tZW50IHRvIHRlc3Qgd2l0aCB0Y3Btb24uCi0JCQotCQlTdHJpbmcgcmVzdWx0ID0gY2xpZW50LmFkZFN0cmluZ3MoIkhlbGxvICIsICJXb3JsZCEiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIgKyByZXN1bHQpOwotCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIHJlc3VsdCk7Ci0JCQotCQlpbnQgcmVzdWx0MSA9IGNsaWVudC5hZGRJbnRzKDE3LCAzMyk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0cHV0OiAiICsgcmVzdWx0MSk7Ci0JCVRlc3RDYXNlLmFzc2VydEVxdWFscyg1MCwgcmVzdWx0MSk7Ci0JCQotCQlmbG9hdCByZXN1bHQyID0gY2xpZW50LmFkZEZsb2F0cygxNy42NGYsIDMyLjM2Zik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiT3V0cHV0OiAiICsgcmVzdWx0Mik7Ci0JCVRlc3RDYXNlLmFzc2VydEVxdWFscyg1MC4wZiwgcmVzdWx0MiwgMC4wMDA1Zik7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkMigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50KHRhcmdldCwgdHJ1ZSk7IC8vQ29tbWVudCB0byB0ZXN0IHdpdGggdGNwbW9uLgotLy8vLwkJU2ltcGxlQWRkU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQWRkU2VydmljZUNsaWVudCgpOyAvL1VuY29tbWVudCB0byB0ZXN0IHdpdGggdGNwbW9uLgotLy8vLwotCQlTdHJpbmcgcmVzdWx0ID0gY2xpZW50LmFkZFN0cmluZ3MoIkhlbGxvICIsICJXb3JsZCEiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIgKyByZXN1bHQpOwotCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIHJlc3VsdCk7Ci0KLQkJaW50IHJlc3VsdDEgPSBjbGllbnQuYWRkSW50cygxNywgMzMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dDogIiArIHJlc3VsdDEpOwotCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoNTAsIHJlc3VsdDEpOwotCi0JCWZsb2F0IHJlc3VsdDIgPSBjbGllbnQuYWRkRmxvYXRzKDE3LjY0ZiwgMzIuMzZmKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPdXRwdXQ6ICIgKyByZXN1bHQyKTsKLQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDUwLjBmLCByZXN1bHQyLCAwLjAwMDVmKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEF2YWlsYWJsZVBvcnQoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vQ3JlYXRlIGEgc2VydmVyIHNvY2tldCBvbiBhbnkgZnJlZSBzb2NrZXQgdG8gZmluZCBhIGZyZWUgc29ja2V0LgotCQlTZXJ2ZXJTb2NrZXQgc3MgPSBuZXcgU2VydmVyU29ja2V0KDApOwotCQlpbnQgcG9ydCA9IHNzLmdldExvY2FsUG9ydCgpOwotCQlzcy5jbG9zZSgpOwotICAgCQotICAgIAlyZXR1cm4gcG9ydDsKLSAgICB9Ci0JCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEZhc3RJbmZvc2V0VGVzdC5jbGFzcykpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgdXAgdGhlIFNpbXBsZSBIVFRQIFNlcnZlciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBwb3J0ID0gZmluZEF2YWlsYWJsZVBvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDU1NTU7IC8vVW5jb21tZW50IHRvIHRlc3Qgd2l0aCB0Y3Btb24KLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOiIgKyAocG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvU2ltcGxlQWRkU2VydmljZSIpOwotCi0gICAgICAgICAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSArICIvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKCJ0YXJnZXQvdGVzdC1jbGFzc2VzIiwgY29uZmlnRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoY29uZmlndXJhdGlvbkNvbnRleHQsIHBvcnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOwotCi0gICAgICAgICAgICAgICAgc2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoIm9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuU2ltcGxlQWRkU2VydmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIHNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOwotCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaW1wbGUgSFRUUCBTZXJ2ZXIgaXMgc3RhcnRlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3BwZWQgdGhlIFNpbXBsZSBIVFRQIFNlcnZlciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9TaW1wbGVBZGRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvU2ltcGxlQWRkU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTVmZDkyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2Zhc3RpbmZvc2V0L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXN0aW5mb3NldC9TaW1wbGVBZGRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQ7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBZGRTZXJ2aWNlIHsKLQkKLQlwdWJsaWMgaW50IGFkZEludHMoaW50IHZhbDEsIGludCB2YWwyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgIiArIHZhbDEgKyAiICYgIiArIHZhbDIpOwotCQlyZXR1cm4gdmFsMSArIHZhbDI7Ci0JfQotCi0JcHVibGljIGZsb2F0IGFkZEZsb2F0cyhmbG9hdCB2YWwxLCBmbG9hdCB2YWwyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgIiArIHZhbDEgKyAiICYgIiArIHZhbDIpOwotCQlyZXR1cm4gdmFsMSArIHZhbDI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgYWRkU3RyaW5ncyhTdHJpbmcgdmFsMSwgU3RyaW5nIHZhbDIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCAiICsgdmFsMSArICIgJiAiICsgdmFsMik7Ci0JCXJldHVybiB2YWwxICsgdmFsMjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvU2ltcGxlQWRkU2VydmljZUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvZmFzdGluZm9zZXQvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Zhc3RpbmZvc2V0L1NpbXBsZUFkZFNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4MDExZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9mYXN0aW5mb3NldC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZmFzdGluZm9zZXQvU2ltcGxlQWRkU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5TaW1wbGVBZGRTZXJ2aWNlU3R1YjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LlNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZEZsb2F0czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LlNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZEZsb2F0c1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZmFzdGluZm9zZXQuU2ltcGxlQWRkU2VydmljZVN0dWIuQWRkSW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LlNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZEludHNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmZhc3RpbmZvc2V0LlNpbXBsZUFkZFNlcnZpY2VTdHViLkFkZFN0cmluZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5mYXN0aW5mb3NldC5TaW1wbGVBZGRTZXJ2aWNlU3R1Yi5BZGRTdHJpbmdzUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBZGRTZXJ2aWNlQ2xpZW50IHsKLQkKLQlwcml2YXRlIFNpbXBsZUFkZFNlcnZpY2VTdHViIHNlcnZpY2VTdHViOwotCQotCS8qKgotCSAqIEBwYXJhbSBhcmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQl0cnkgewotCQkJU2ltcGxlQWRkU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQWRkU2VydmljZUNsaWVudCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNwb25zZSAxIGlzICIgKyBjbGllbnQuYWRkU3RyaW5ncygiSGVsbG8gIiwgIldvcmxkISIpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2UgMiBpcyAiICsgY2xpZW50LmFkZEludHMoMjMsIDI3KSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3BvbnNlIDMgaXMgIiArIGNsaWVudC5hZGRGbG9hdHMoMjIuODRmLCAyNy4xNmYpKTsKLQkJfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0JCQlhZi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0JCQlyZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb250cnVjdG9yIHdoaWNoIHVzZXMgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzMi9zZXJ2aWNlcy9TaW1wbGVBZGRTZXJ2aWNlIiBhcyB0aGUgdGFyZ2V0LgotCSAqIFdoZW4gdGhlIHNlcnJ2ZXIgcnVucyBhdCBwb3J0IDgwODAsIHRoaXMgY2FuIGJlIHVzZSB3aXRoIHRjcG1vbiBmb3IgZGVidWdnaW5nLgotCSAqIAotCSAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0JICovCi0JcHVibGljIFNpbXBsZUFkZFNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJdGhpcyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzMi9zZXJ2aWNlcy9TaW1wbGVBZGRTZXJ2aWNlIikpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSBkZWZhdWx0IEpVbml0IHRlc3QgY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQlwdWJsaWMgU2ltcGxlQWRkU2VydmljZUNsaWVudChFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXQpIHRocm93cyBBeGlzRmF1bHQgewotCQlDb25maWd1cmF0aW9uQ29udGV4dCBjb250ZXh0ID0gCi0JCQlDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgidGFyZ2V0L3Rlc3QtY2xhc3NlcyIsICJ0ZXN0LXJlc291cmNlcy9heGlzMi54bWwiKTsKLQkJc2VydmljZVN0dWIgPSBuZXcgU2ltcGxlQWRkU2VydmljZVN0dWIoY29udGV4dCwgdGFyZ2V0LmdldEFkZHJlc3MoKSk7Ci0JCS8vc2VydmljZVN0dWIgPSBuZXcgU2ltcGxlQWRkU2VydmljZVN0dWIoKTsKLQkJU2VydmljZUNsaWVudCBjbGllbnQ9ICBzZXJ2aWNlU3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpOwotCQlPcHRpb25zIG9wdGlvbnMgPSBjbGllbnQuZ2V0T3B0aW9ucygpOwotCQlvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSwgImFwcGxpY2F0aW9uL3NvYXArZmFzdGluZm9zZXQiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB1c2VkIGJ5IHRoZSBkZWZhdWx0IEpVbml0IHRlc3QgY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQlwdWJsaWMgU2ltcGxlQWRkU2VydmljZUNsaWVudChFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXQsIGJvb2xlYW4gcG94KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJQ29uZmlndXJhdGlvbkNvbnRleHQgY29udGV4dCA9IAotCQkJQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oInRhcmdldC90ZXN0LWNsYXNzZXMiLCAidGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIik7Ci0JCXNlcnZpY2VTdHViID0gbmV3IFNpbXBsZUFkZFNlcnZpY2VTdHViKGNvbnRleHQsIHRhcmdldC5nZXRBZGRyZXNzKCkpOwotCQkvL3NlcnZpY2VTdHViID0gbmV3IFNpbXBsZUFkZFNlcnZpY2VTdHViKCk7Ci0JCVNlcnZpY2VDbGllbnQgY2xpZW50PSAgc2VydmljZVN0dWIuX2dldFNlcnZpY2VDbGllbnQoKTsKLQkJT3B0aW9ucyBvcHRpb25zID0gY2xpZW50LmdldE9wdGlvbnMoKTsKLQkJaWYgKHBveCkgewotCQkJb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpOwotCQl9IGVsc2UgewotCQkJb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsICJhcHBsaWNhdGlvbi9zb2FwK2Zhc3RpbmZvc2V0Iik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBhZGRTdHJpbmdzKFN0cmluZyBwYXJhbTAsIFN0cmluZyBwYXJhbTEpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotCQlBZGRTdHJpbmdzIGFkZFN0cmluZ3MgPSBuZXcgU2ltcGxlQWRkU2VydmljZVN0dWIuQWRkU3RyaW5ncygpOwotCQlhZGRTdHJpbmdzLnNldFZhbDEocGFyYW0wKTsKLQkJYWRkU3RyaW5ncy5zZXRWYWwyKHBhcmFtMSk7Ci0JCUFkZFN0cmluZ3NSZXNwb25zZSByZXNwb25zZTEgPSBzZXJ2aWNlU3R1Yi5hZGRTdHJpbmdzKGFkZFN0cmluZ3MpOwotCQlyZXR1cm4gcmVzcG9uc2UxLmdldF9yZXR1cm4oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFkZEludHMoaW50IHBhcmFtMCwgaW50IHBhcmFtMSkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0JCUFkZEludHMgYWRkSW50cyA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlU3R1Yi5BZGRJbnRzKCk7Ci0JCWFkZEludHMuc2V0VmFsMShwYXJhbTApOwotCQlhZGRJbnRzLnNldFZhbDIocGFyYW0xKTsKLQkJQWRkSW50c1Jlc3BvbnNlIHJlc3BvbnNlMiA9IHNlcnZpY2VTdHViLmFkZEludHMoYWRkSW50cyk7Ci0JCXJldHVybiByZXNwb25zZTIuZ2V0X3JldHVybigpOwotCX0KLQkKLQlwdWJsaWMgZmxvYXQgYWRkRmxvYXRzKGZsb2F0IHBhcmFtMCwgZmxvYXQgcGFyYW0xKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLQkJQWRkRmxvYXRzIGFkZEZsb2F0cyA9IG5ldyBTaW1wbGVBZGRTZXJ2aWNlU3R1Yi5BZGRGbG9hdHMoKTsKLQkJYWRkRmxvYXRzLnNldFZhbDEocGFyYW0wKTsKLQkJYWRkRmxvYXRzLnNldFZhbDIocGFyYW0xKTsKLQkJQWRkRmxvYXRzUmVzcG9uc2UgcmVzcG9uc2UzID0gc2VydmljZVN0dWIuYWRkRmxvYXRzKGFkZEZsb2F0cyk7Ci0JCXJldHVybiByZXNwb25zZTMuZ2V0X3JldHVybigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL2NvbmYvYXhpczIueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vY29uZi9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZkNDNhODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vY29uZi9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmlsZSBjYWNoaW5nIGZvciBhdHRhY2htZW50cyAtLT4KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2l6ZVRocmVzaG9sZCI+NDAwMDwvcGFyYW1ldGVyLS0+Ci0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIHNlY29uZHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+Ci0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3RpbmdpdXNoIHRob3NlIGVuZHBvaW50cy0tPgotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS1TZXQgdGhlIGZsYWcgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdHJhbnNwb3J0IGxldmVsIHNlc3Npb24gbWFuZ21lbnQtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1hbmFnZVRyYW5zcG9ydFNlc3Npb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHR3byBwYXJhbWV0ZXJzIHdpbGwgYmUgdXNlZCB0byBoYW5kbGUgUkVTVCBpbiBBeGlzMi4gVGhlIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBtYWtlIEF4aXMyIHRvIGhhdmUgdHdvLS0+Ci0gICAgPCEtLWRpZmZlcmVudCBlbmRwb2ludHMsIG9uZSBmb3IgUkVTVCAoQXhpc1JFU1RTZXJ2bGV0KSBvbmUgZm9yIFNPQVAgbWVzc2FnZSBoYW5kbGluZyAoQXhpc1NlcnZsZXQpLiBCdXQgZm9sbG93aW5nLS0+Ci0gICAgPCEtLXBhcmFtZXRlcnMgaGVscCB0byB0d2VhayB0aGUgbWVzc2FnZSBoYW5kbGluZyBvZiB0d28gbWFpbiBzZXJ2bGV0cy4gLS0+Ci0KLSAgICA8IS0tIElmIHRoZSBlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IGlzIHRydWUsIHRoZW4gQXhpczJNYWluU2VydmxldCB3aWxsIGhhbmRsZSBib3RoIFNPQVAgYW5kIFJFU1QgbWVzc2FnZXMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVSRVNUSW5BeGlzMk1haW5TZXJ2bGV0IiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBib3RoIHRoZSBzZXJ2bGV0cy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gVGhpcyB3aWxsIGRpc2FibGUgdGhlIHNlcGFyYXRlIHNlcnZsZXQgd2UgaGF2ZSBmb3IgUkVTVCBoYW5kbGluZy4gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU2VwYXJhdGVFbmRwb2ludEZvclJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udGVuZCBob3N0IHdoaWNoIGV4cG9zZXMgdGhpcyB3ZWJzZXJ2aWNlIHVzaW5nIGEgZGlmZmVyZW50IHB1YmxpYyBVUkwgIC0tPgotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPgotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6Ci0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkKLSAgICAgICAgICAgIGhvc3RuYW1lOiAgaWYgbm9uLW51bGwsIHVybCBwcmVmaXggdXNlZCBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgbnVsbCkKLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikKLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApCi0gICAgICAgICAgICByZXF1ZXN0VGNwTm9EZWxheTogIHRydWUgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgYW5kIG1pbmltaXplIGxhdGVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMKLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpCi0gICAgICAgICAgICByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBpZiBxdWV1ZSBmaWxscyB1cyAgICAgICAgIChkZWZhdWx0IDE1MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5Ci0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgbm8gc3VjaCB0aHJlYWRzIGNhbiBleGlzdCB3aXRoIGRlZmF1bHQgdW5ib3VuZGVkIHJlcXVlc3QgcXVldWUKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgICAgICAgICAgICAgICAgID5odHRwOi8vd3d3Lm15QXBwLmNvbS93czwvcGFyYW1ldGVyPiAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpblNlcnZlciIgICAgICAgICAgICAgPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiICAgICAgICAgICA+MTAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGNwTm9EZWxheSIgICAgICAgID5mYWxzZTwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUiPjUwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIiA+MTAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lIiAgICAgID4yNDAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWVVbml0IiAgPk1JTExJU0VDT05EUzwvcGFyYW1ldGVyPiAgICAgICAgICAgIC0tPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPgotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImluY2x1ZGVPcHRpb25hbEhlYWRlcnMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8L21vZHVsZUNvbmZpZz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPiAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL2l0ZXN0LWJ1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL2l0ZXN0LWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkMjhkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi9pdGVzdC1idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iaXRlc3QiIGRlZmF1bHQ9ImJ1aWxkLXJlcG9zIiBiYXNlZGlyPSIuIj4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtdGVzdC1zb3VyY2VzIiB1bmxlc3M9InRlc3Quc2tpcCI+Ci0JCTwhLS0gU2V0IGEgcHJvcGVydHkgdGhhdCBjYW4gYmUgcGlja2VkIHVwIGZyb20gdGhlIGFudCBidWlsZC54bWwncyAtLT4KLQotCQk8ZWNobz4ke21hdmVuLnRlc3QucGF0aH08L2VjaG8+Ci0JCTwhLS0gY29weSB0aGUgbWFycyBzbyB0aGF0IHRoZXkgYXJlIGF2YWlsYWJsZSBvbiB0aGUgdGVzdCBjbGFzc3BhdGggLS0+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIgdG9maWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIiAvPgotCi0JCTxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5qdW5pdC5qdm1hcmdzIiB2YWx1ZT0iIiAvPgotCQk8cGF0aCBpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPgotCQkJPHBhdGggcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIiAvPgotCQk8L3BhdGg+Ci0JCTwhLS0gY29tcGlsaW5nIHNvbWUgY3VzdG9tIHdzZGwgZmlsZXMgLS0+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnNvdXJjZS5kaXIiIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy93c2RsIiAvPgotCQk8cHJvcGVydHkgbmFtZT0id3NkbC5vdXRwdXQuYmFzZS5kaXIiIHZhbHVlPSJ0YXJnZXQvd3NkbCIgLz4KLQkJPCEtLSBtYWtlIHRoZSBkaXJzIC0tPgotCQk8bWtkaXIgZGlyPSIke3dzZGwub3V0cHV0LmJhc2UuZGlyfSIgLz4KLQotCQk8ZWNobz5Db21waWxpbmcgQ29tcGxleERhdGFUeXBlcy53c2RsPC9lY2hvPgotCQk8bWtkaXIgZGlyPSIke3dzZGwub3V0cHV0LmJhc2UuZGlyfS9jb21wbGV4ZGF0YXR5cGUiIC8+Ci0KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbyB0YXJnZXQvd3NkbC9jb21wbGV4ZGF0YXR5cGUgLXMgLXUgLXV3IC11cmkgdGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlcy9Db21wbGV4RGF0YVR5cGVzLndzZGwiIC8+Ci0JCTwvamF2YT4KLQkJPGphdmFjIGZvcms9InRydWUiIGRlc3RkaXI9InRhcmdldC9jbGFzc2VzIiBkZWJ1Zz0ib24iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLQkJCTxzcmMgcGF0aD0idGFyZ2V0L3dzZGwvY29tcGxleGRhdGF0eXBlIiAvPgotCQk8L2phdmFjPgotCi0JCTxlY2hvPkNvbXBpbGluZyBEb2N1bWVudFVud3JhcHBpbmdUZXN0LndzZGw8L2VjaG8+Ci0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L2RvY3VtZW50dW53cmFwcGluZyIgLz4KLQotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLQkJCTxhcmcgbGluZT0iLWFwIC1vIHRhcmdldC93c2RsL2RvY3VtZW50dW53cmFwcGluZyAtc3MgLXNkIC1zc2kgLXUgIC1nIC11dyAtdXJpIHRlc3QtcmVzb3VyY2VzL3dzZGwvRG9jdW1lbnRVbndyYXBwaW5nVGVzdC53c2RsIiAvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvd3NkbC9kb2N1bWVudHVud3JhcHBpbmciIC8+Ci0KLQkJPGVjaG8+Q29tcGlsaW5nIFJQQ1Vud3JhcHBpbmdUZXN0LndzZGw8L2VjaG8+Ci0JCTxta2RpciBkaXI9IiR7d3NkbC5vdXRwdXQuYmFzZS5kaXJ9L3JwY3Vud3JhcHBpbmciIC8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotCQkJPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbyB0YXJnZXQvd3NkbC9ycGN1bndyYXBwaW5nIC1zcyAtc2QgLXNzaSAtdSAgLWcgLXV3IC11cmkgdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENVbndyYXBwaW5nVGVzdC53c2RsIiAvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvd3NkbC9ycGN1bndyYXBwaW5nIiAvPgotCi0JCTxlY2hvPkNvbXBpbGluZyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS53c2RsPC9lY2hvPgotCQk8bWtkaXIgZGlyPSIke3dzZGwub3V0cHV0LmJhc2UuZGlyfS9jb21wbGV4ZGF0YXR5cGViYXJlIiAvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0JCQk8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLQkJCTxhcmcgbGluZT0iLW8gdGFyZ2V0L3dzZGwvY29tcGxleGRhdGF0eXBlYmFyZSAtcyAtdXJpIHRlc3QtcmVzb3VyY2VzL0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlLndzZGwiIC8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC93c2RsL2NvbXBsZXhkYXRhdHlwZWJhcmUiIC8+Ci0JCTxjb3B5IHRvRGlyPSJ0YXJnZXQvY2xhc3NlcyIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLQkJCTxmaWxlc2V0IGRpcj0idGFyZ2V0L3dzZGwvY29tcGxleGRhdGF0eXBlYmFyZS9idWlsZC9jbGFzc2VzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmNsYXNzIiAvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0KLQkJPCEtLSBjb21waWxlIHRoZSBzY2hlbWEgZm9yIFhNTGJlYW5zIC0tPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUueG1sYmVhbnMuaW1wbC50b29sLlNjaGVtYUNvbXBpbGVyIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotCQkJPGFyZyBsaW5lPSItc3JjIHRhcmdldC94bWxiZWFucy1zcmMgLWQgdGFyZ2V0L2NsYXNzZXMgdGVzdC1yZXNvdXJjZXMveHNkL3R5cGUtdGVzdC54c2QiIC8+Ci0JCTwvamF2YT4KLQotCQk8YW50IGFudGZpbGU9Iml0ZXN0LWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0iLiIgdGFyZ2V0PSJycGMtd3NkbC1jb2RlZ2VuIiAvPgotCQk8YW50IGFudGZpbGU9Iml0ZXN0LWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0iLiIgdGFyZ2V0PSJ3c2RsMjAtY29kZWdlbiIgLz4KLQotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQiIgLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMiIC8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQiIgLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDIiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJycGMtd3NkbC1jb2RlZ2VuIj4KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIFJQQyBXU0RMcyAtIHRha2UgMTwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIiAvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L3JwYy10ZXN0MSAtdXJpIHRlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgLXV3IiAvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvcnBjLXRlc3QxIiB0YXJnZXQ9Imphci5jbGllbnQiIC8+Ci0KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIFJQQyBXU0RMcyAtIHRha2UgMjwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIiAvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L3JwYy10ZXN0MiAtdXJpIHRlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0zLndzZGwgLXV3IiAvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvcnBjLXRlc3QyIiB0YXJnZXQ9Imphci5jbGllbnQiIC8+Ci0KLQotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gUlBDIFdTRExzIC0gdGFrZSAzPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiIC8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbyB0YXJnZXQvcnBjLXRlc3QzIC11cmkgdGVzdC1yZXNvdXJjZXMvcnBjL3Rlc3QtcnBjLTIud3NkbCAtdXciIC8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC9ycGMtdGVzdDMiIHRhcmdldD0iamFyLmNsaWVudCIgLz4KLQotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gUlBDIFdTRExzIC0gdGFrZSA0PC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiIC8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbyB0YXJnZXQvcnBjLXRlc3Q0IC11cmkgdGVzdC1yZXNvdXJjZXMvcnBjL3Rlc3QtcnBjLTIud3NkbCAtdXcgLXNzIC1zZCIgLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L3JwYy10ZXN0NCIKLQkJCQkJCQkgdGFyZ2V0PSJqYXIuc2VydmVyIi8+Ci0KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIFJQQyBXU0RMcyB3aXRoIGhlbHBlciBtb2RlIC0gIHRha2UgMTwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbyB0YXJnZXQvaGVscGVyLXRlc3QxIC11cmkgdGVzdC1yZXNvdXJjZXMvcnBjL3Rlc3QtcnBjLTIud3NkbCAtdSAtRWgiLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L2hlbHBlci10ZXN0MSIKLQkJCQkJIHRhcmdldD0iamFyLmNsaWVudCIvPgotCi0JCTxlY2hvPlJ1bm5pbmcgY29kZWdlbiBSUEMgV1NETHMgd2l0aCBoZWxwZXIgbW9kZSAtICB0YWtlIDI8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L2hlbHBlci10ZXN0MiAtdXJpIHRlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgLXUgLUVoIi8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC9oZWxwZXItdGVzdDIiCi0JCQkJCSB0YXJnZXQ9Imphci5jbGllbnQiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0id3NkbDIwLWNvZGVnZW4iPgotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gZm9yIFdTREwgMi4wPC9lY2hvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiLz4KLQkJCTxhcmcgbGluZT0iLXd2IDIuMCAtYXAgLW8gdGFyZ2V0L3dzZGwyMC10ZXN0IC1zIC11cmkgdGVzdC1yZXNvdXJjZXMvd3NkbDIwL0hvdGVsUmVzZXJ2YXRpb25TZXJ2aWNlLndzZGwiLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L3dzZGwyMC10ZXN0IgotCQkJCQkJCQkJIHRhcmdldD0iamFyLmNsaWVudCIvPgotICAgIDwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJlbnRlcnByaXNlLXdzZGwtY29kZWdlbiI+Ci0JCTwhLS0gY29kZWdlbiBmb3IgdGhlIGVudGVycHJpc2Ugd3NkbCAtLT4KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIGZvciBFbnRlcnByaXNlIFdTREwgLSB0YWtlIDE8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGFyZyBsaW5lPSItYXAgLWQgeG1sYmVhbnMgLW8gdGFyZ2V0L2VudGVycHJpc2UtdGVzdDEgLXMgLXVyaSB0ZXN0LXJlc291cmNlcy9lbnRlcnByaXNlLndzZGwiLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L2VudGVycHJpc2UtdGVzdDEiCi0JCQkJCQkJCQkgdGFyZ2V0PSJqYXIuY2xpZW50Ii8+Ci0KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIGZvciBFbnRlcnByaXNlIFdTREwgLSB0YWtlIDI8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGFyZyBsaW5lPSItYXAgLW8gdGFyZ2V0L2VudGVycHJpc2UtdGVzdDIgLXMgLXVyaSB0ZXN0LXJlc291cmNlcy9lbnRlcnByaXNlLndzZGwiLz4KLQkJPC9qYXZhPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGFyZ2V0L2VudGVycHJpc2UtdGVzdDIiCi0JCQkJCQkJCQkgdGFyZ2V0PSJqYXIuY2xpZW50Ii8+Ci0KLQkJPGVjaG8+UnVubmluZyBjb2RlZ2VuIGZvciBFbnRlcnByaXNlIFdTREwgLSB0YWtlIDM8L2VjaG8+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCIvPgotCQkJPGFyZyBsaW5lPSItYXAgLWQgeG1sYmVhbnMgLXNzIC1zZCAtZyAtbyB0YXJnZXQvZW50ZXJwcmlzZS10ZXN0MyAtcyAtdXJpIHRlc3QtcmVzb3VyY2VzL2VudGVycHJpc2Uud3NkbCIvPgotCQk8L2phdmE+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0YXJnZXQvZW50ZXJwcmlzZS10ZXN0MyIKLQkJCQkJCQkJCSB0YXJnZXQ9Imphci5zZXJ2ZXIiLz4KLQotCQk8ZWNobz5SdW5uaW5nIGNvZGVnZW4gZm9yIEVudGVycHJpc2UgV1NETCAtIHRha2UgNDwvZWNobz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIi8+Ci0JCQk8YXJnIGxpbmU9Ii1hcCAtbnMycCB1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbT1jb20uc2FsZXNmb3JjZSAtZCB4bWxiZWFucyAtc3MgLXNkIC1nIC1vIHRhcmdldC9lbnRlcnByaXNlLXRlc3Q0IC1zIC11cmkgdGVzdC1yZXNvdXJjZXMvZW50ZXJwcmlzZS53c2RsIi8+Ci0JCTwvamF2YT4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRhcmdldC9lbnRlcnByaXNlLXRlc3Q0IgotCQkJCQkJCQkJIHRhcmdldD0iamFyLnNlcnZlciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJidWlsZC1yZXBvcyIgdW5sZXNzPSJ0ZXN0LnNraXAiPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvc2FtcGxlcy9tb2R1bGVzIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9zYW1wbGVzL2NvbmYiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3JlcG9zaXRvcnktY2xpZW50L21vZHVsZXMiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3JlcG9zaXRvcnktY2xpZW50L2NvbmYiLz4KLQkJPGNvcHkgZmlsZT0iLi4vYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9zYW1wbGVzL21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0JCTxjb3B5IGZpbGU9ImNvbmYvYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9zYW1wbGVzL2NvbmYvYXhpczIueG1sIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvcmVwb3NpdG9yeS1jbGllbnQvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQkJPGNvcHkgZmlsZT0iY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3JlcG9zaXRvcnktY2xpZW50L2NvbmYvYXhpczIueG1sIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90b1dhci9zZXJ2aWNlcy8iLz4KLQotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvbG9jYWwiLz4KLQkJPGNvcHkgZmlsZT0iLi4vYWRkcmVzc2luZy90YXJnZXQvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIgotCQkgICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2xvY2FsL2FkZHJlc3NpbmcubWFyIi8+Ci0KLQkJPCEtLSBDcmVhdGUgQ2h1bmtlZCBlbmFibGVkIFJlcG9zaXRvcnkgLS0+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9jaHVua2luZy1lbmFibGVkUmVwb3NpdG9yeSIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvY2h1bmtpbmctZW5hYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8Y29weSBmaWxlPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NodW5raW5nLWVuYWJsZWQtYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9jaHVua2luZy1lbmFibGVkUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCi0JCTwhLS0gQ3JlYXRlIENodW5rZWQgZGlzYWJsZWQgUmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2NodW5raW5nLWRpc2FibGVkUmVwb3NpdG9yeSIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvY2h1bmtpbmctZGlzYWJsZWRSZXBvc2l0b3J5L2NvbmYiLz4KLQkJPGNvcHkgZmlsZT0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jaHVua2luZy1kaXNhYmxlZC1heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2NodW5raW5nLWRpc2FibGVkUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCi0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9NZXNzYWdlQ29udGV4dEluamVjdGlvblJlcG8iLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwby9tb2R1bGVzIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8vY29uZiIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwby9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCQk8Y29weSBmaWxlPSJjb25mL2F4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvL2NvbmYvYXhpczIueG1sIi8+Ci0KLQotCQk8IS0tIENvbW1vbnMgdHJhbnNwb3J0IGVuYWJsZWQgZW5hYmxlZCBSZXBvc2l0b3J5IC0tPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1odHRwLWVuYWJsZWRSZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9jb21tb25zLWh0dHAtZW5hYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8Y29weSBmaWxlPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NvbW1vbnMtaHR0cC1lbmFibGVkLWF4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1odHRwLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYvYXhpczIueG1sIi8+Ci0KLQkJPCEtLSBNVE9NIGVuYWJsZWQgUmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01UT00tZW5hYmxlZFJlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01UT00tZW5hYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1lbmFibGVkUmVwb3NpdG9yeS9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9InRlc3QtcmVzb3VyY2VzL210b20vTVRPTS1lbmFibGVkLWF4aXMyLnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1lbmFibGVkUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgCSAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01UT00tZW5hYmxlZFJlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQotCQk8IS0tIE1UT00gZmlsZSBjYWNoZSBlbmFibGVkIFJlcG9zaXRvcnkgLS0+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9NVE9NLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeSIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvTVRPTS1maWxlQ2FjaGUtZW5hYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8Y29weSBmaWxlPSJ0ZXN0LXJlc291cmNlcy9tdG9tL01UT00tZmlsZUNhY2hlLWVuYWJsZWQtYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9NVE9NLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgCSAgICAgICAgCSAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL01UT00tZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5L21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0KLQkJPCEtLSBTd0EgZW5hYmxlZCBSZXBvc2l0b3J5IC0tPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvU3dBLWVuYWJsZWRSZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZW5hYmxlZFJlcG9zaXRvcnkvY29uZiIvPgotCQk8Y29weSBmaWxlPSJ0ZXN0LXJlc291cmNlcy9zd2EvU3dBLWVuYWJsZWQtYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL1N3QS1lbmFibGVkUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgICAJICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvU3dBLWVuYWJsZWRSZXBvc2l0b3J5L21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0KLQkJPCEtLSBTd0EgZmlsZSBjYWNoZSBlbmFibGVkIFJlcG9zaXRvcnkgLS0+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC90ZXN0LXJlc291cmNlcy9Td0EtZmlsZUNhY2hlLWVuYWJsZWRSZXBvc2l0b3J5L2NvbmYiLz4KLQkJPGNvcHkgZmlsZT0idGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvU3dBLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgICAJICAgICAgICAJICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvU3dBLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeS9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCi0JCTwhLS0gU3ByaW5nIHJlc291cmNlcyAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3NwcmluZyIvPgotCQk8Y29weSBmaWxlPSIuLi9zcHJpbmcvdGVzdC1yZXNvdXJjZXMvYXBwbGljYXRpb25Db250ZXh0LnhtbCIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NwcmluZy9hcHBsaWNhdGlvbkNvbnRleHQueG1sIi8+Ci0KLQkJPCEtLSBUZXN0IHdpdGggdGFyZ2V0IHJlc29sdmVyICAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnRfcmVwbyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudCIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudF9yZXBvL2NvbmYiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnRfcmVwby9zZXJ2aWNlcyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudF9yZXBvL21vZHVsZXMiLz4KLQotCQk8Y29weSBmaWxlPSJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZlci10cmFuc3BvcnQueG1sIgotICAgIAkgICAgICAgICAgICAJICB0b2ZpbGU9InRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZlci10cmFuc3BvcnQueG1sIi8+Ci08Y29weSBmaWxlPSJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2RlcGxveW1lbnQuYm90aC5heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgIAkgIHRvZmlsZT0idGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnRfcmVwby9jb25mL2F4aXMyLnhtbCIvPgotCi0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgCSAgdG9maWxlPSJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudF9yZXBvL21vZHVsZXMvYWRkcmVzc2luZy0ke2FkZHJlc3NpbmdfdmVyc2lvbn0ubWFyIi8+Ci0KLQotCQk8IS0tIFN0YW5kYXJkIHJlcG9zaXRvcnkgLS0+Ci0JCTxta2RpciBkaXI9InRhcmdldC9SZXBvc2l0b3J5Ii8+Ci0JCTxta2RpciBkaXI9InRhcmdldC9SZXBvc2l0b3J5L2NvbmYiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L1JlcG9zaXRvcnkvc2VydmljZXMiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L1JlcG9zaXRvcnkvbW9kdWxlcyIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L1JlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4KLQkJPGNvcHkgZmlsZT0iY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L1JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4KLQotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcGVyZjIvYnVpbGQvcmVwby9jb25mIi8+Ci0JCTxta2RpciBkaXI9InRhcmdldC9wZXJmL2J1aWxkL3JlcG8vY29uZiIvPgotCi0JCTxjb3B5IGZpbGU9ImNvbmYvYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC9wZXJmMi9idWlsZC9yZXBvL2NvbmYvYXhpczIueG1sIi8+Ci0JCTxjb3B5IGZpbGU9ImNvbmYvYXhpczIueG1sIgotICAgIAkgICAgICAgICAgICAgICAgICB0b2ZpbGU9InRhcmdldC9wZXJmL2J1aWxkL3JlcG8vY29uZi9heGlzMi54bWwiLz4KLQotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcGVyZjIvYnVpbGQvcmVwby9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvcGVyZjIvYnVpbGQvcmVwby9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCi0JCTxta2RpciBkaXI9InRhcmdldC9wZXJmL2J1aWxkL3JlcG8vbW9kdWxlcyIvPgotCQk8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3BlcmYvYnVpbGQvcmVwby9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYnVpbGQtc29hcDEyLXNlcnZpY2VzIj4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPSJ0ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj0idGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQyIvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9InRlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIKLQkJICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj0idGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUyNTg1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWludGVncmF0aW9uPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEludGVncmF0aW9uPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BeGlzMiBJbnRlZ3JhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY2x1c3RlcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY3JpcHRpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWpheGJyaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3cy1pbnRlZ3JhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qaWJ4PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWpzb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1ldGFkYXRhPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW10b21wb2xpY3k8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItc2FhajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zcHJpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5heGlzMi5vc2dpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXhtbGJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+amF2YTE1PC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxqZGs+MS41PC9qZGs+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIHBlcnRlc3QgZm9ya01vZGUgaXMgbm90IGlkZWFsIGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdGVzdCBzZXJ2ZXIgZG9lc24ndCBzaHV0IGRvd24gcHJvcGVybHkgOi0oCi0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSByZW1vdmVkIGlmIHBvc3NpYmxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG1zMjU2bSAtWG14NTEybTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuYWJsZSB0aGUgbmV4dCAyIGxpbmVzIGlmIHlvdSB3YW50IHRvIGF0dGFjaCBhIGRlYnVnZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlV0aWwqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJbnRlcm9wU3R1YlRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlNlcnZpY2VHcm91cENvbnRleHRUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypFY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKm9yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9zb2FwMTJ0ZXN0c3VpdGUvKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TY2VuYXJpb1NUMVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc2FtcGxlcy93c2RsL3BlcmYyLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWlsZC5yZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPi4vdGFyZ2V0L3Rlc3QtY2xhc3NlczwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHJldmVudCBNYWMgT1MgWCBmcm9tIHNob3dpbmcgYW4gaWNvbiBpbiB0aGUgZG9jayBkdXJpbmcgdGhlIHRlc3QgcnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZhLmF3dC5oZWFkbGVzczwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+amF2YTE2PC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxqZGs+MS42PC9qZGs+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIHBlcnRlc3QgZm9ya01vZGUgaXMgbm90IGlkZWFsIGJ1dCBzZWVtcyB0byBiZSBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgdGVzdCBzZXJ2ZXIgZG9lc24ndCBzaHV0IGRvd24gcHJvcGVybHkgOi0oCi0gICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSByZW1vdmVkIGlmIHBvc3NpYmxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG1zMjU2bSAtWG14NTEybTwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuYWJsZSB0aGUgbmV4dCAyIGxpbmVzIGlmIHlvdSB3YW50IHRvIGF0dGFjaCBhIGRlYnVnZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlV0aWwqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJbnRlcm9wU3R1YlRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKlNlcnZpY2VHcm91cENvbnRleHRUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypFY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKm9yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9zb2FwMTJ0ZXN0c3VpdGUvKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TY2VuYXJpb1NUMVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc2FtcGxlcy93c2RsL3BlcmYyLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0NvbXBsZXhEYXRhVHlwZXNUZXN0LmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVpbGQucmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4uL3RhcmdldC90ZXN0LWNsYXNzZXM8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFByZXZlbnQgTWFjIE9TIFggZnJvbSBzaG93aW5nIGFuIGljb24gaW4gdGhlIGRvY2sgZHVyaW5nIHRoZSB0ZXN0IHJ1biAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YS5hd3QuaGVhZGxlc3M8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmVudGVycHJpc2U8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW4tZW50ZXJwcmlzZS10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXQgYSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBwaWNrZWQgdXAgZnJvbSB0aGUgYW50IGJ1aWxkLnhtbCdzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIiByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+QnVpbGRpbmcgZW50ZXJwcmlzZSBXU0RMcy4uLjwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vdGFyZ2V0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5qdW5pdC5qdm1hcmdzIiB2YWx1ZT0iIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5jb21waWxlLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBhbnRmaWxlPSJpdGVzdC1idWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9Ii4iIHRhcmdldD0iZW50ZXJwcmlzZS13c2RsLWNvZGVnZW4iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvaW50ZWdyYXRpb248L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvaW50ZWdyYXRpb248L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi53c2RsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9InRydWUiIGFyZzI9IiR7bWF2ZW4udGVzdC5za2lwfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPiR7dGVzdC5za2lwfTwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFkZHJlc3NpbmdfdmVyc2lvbiIgdmFsdWU9IiR7cHJvamVjdC52ZXJzaW9ufSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmNsYXNzLnBhdGgiIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLnRlc3QucGF0aCIgcmVmaWQ9Im1hdmVuLmNvbXBpbGUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9Iml0ZXN0LWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0iLiIgdGFyZ2V0PSJnZW5lcmF0ZS10ZXN0LXNvdXJjZXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZC1yZXBvPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzIHVubGVzcz0ibWF2ZW4udGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0idHJ1ZSIgYXJnMj0iJHttYXZlbi50ZXN0LnNraXB9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+JHt0ZXN0LnNraXB9PC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWRkcmVzc2luZ192ZXJzaW9uIiB2YWx1ZT0iJHtwcm9qZWN0LnZlcnNpb259IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZ3Jvb3Z5LmFsbC52ZXJzaW9uIiB2YWx1ZT0iJHtncm9vdnkuYWxsLnZlcnNpb259IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4ucmVwby5sb2NhbCIgdmFsdWU9IiR7c2V0dGluZ3MubG9jYWxSZXBvc2l0b3J5fSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5jb21waWxlLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9Iml0ZXN0LWJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0iLiIgdGFyZ2V0PSJidWlsZC1yZXBvcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0Jhc2VEYXRhVHlwZXMud3NkbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0Jhc2VEYXRhVHlwZXMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzMzA4NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9CYXNlRGF0YVR5cGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczpuczE9Imh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyL3hzZCIgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIHhtbG5zOm5zPSJodHRwOi8vdGVtcHVyaS5vcmciIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmciPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHM6c2NoZW1hIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZyI+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5Cb29sIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEJvb2xSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluU0J5dGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpieXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFNCeXRlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpieXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluQnl0ZUFycmF5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEJ5dGVBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERvdWJsZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluRG91YmxlIiB0eXBlPSJ4czpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RG91YmxlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluRmxvYXQiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEZsb2F0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFNpbmdsZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluU2luZ2xlIiB0eXBlPSJ4czpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTaW5nbGVSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluQ2hhciIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldENoYXJSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEludCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluSW50IiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0SW50UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblVTaG9ydCIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVTaG9ydFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0T2JqZWN0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5PYmplY3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldE9iamVjdFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRHdWlkIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5HdWlkIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEd1aWRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblVyaSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVcmlSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5EZWNpbWFsIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREZWNpbWFsUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVMb25nIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5VTG9uZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludGVnZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0VUxvbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludGVnZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkRhdGVUaW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RGF0ZVRpbWVSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFRpbWVTcGFuIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5UaW1lU3BhbiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0VGltZVNwYW5SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0UU5hbWUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblFOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRRTmFtZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRMb25nIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5Mb25nIiB0eXBlPSJ4czpsb25nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldExvbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6bG9uZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5VSW50IiB0eXBlPSJ4czpsb25nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVJbnRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6bG9uZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRCeXRlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5CeXRlIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRCeXRlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5TaG9ydCIgdHlwZT0ieHM6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U2hvcnRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVU2hvcnRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRVU2hvcnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVTaG9ydFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRVU2hvcnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U0J5dGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTQnl0ZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U0J5dGVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U0J5dGVSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RyaW5nUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U3RyaW5nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U3RyaW5nUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldENoYXJSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRDaGFyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRDaGFyUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldENoYXJSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VGltZVNwYW5SZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRUaW1lU3BhbiIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VGltZVNwYW5SZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0VGltZVNwYW5SZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VXJpUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0VXJpIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVcmlSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0VXJpUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEd1aWRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRHdWlkIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRHdWlkUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEd1aWRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0T2JqZWN0UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0T2JqZWN0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRPYmplY3RSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0T2JqZWN0UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEludFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEludCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0SW50UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEludFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRGbG9hdFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEZsb2F0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRGbG9hdFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRGbG9hdFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCb29sUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0Qm9vbCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qm9vbFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRCb29sUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFNob3J0UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U2hvcnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFNob3J0UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFNob3J0UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVMb25nUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0VUxvbmciLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVMb25nUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVMb25nUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEJ5dGVBcnJheVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEJ5dGVBcnJheSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qnl0ZUFycmF5UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEJ5dGVBcnJheVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCeXRlUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0Qnl0ZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qnl0ZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRCeXRlUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFFOYW1lUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0UU5hbWUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFFOYW1lUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFFOYW1lUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVJbnRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRVSW50Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVSW50UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVJbnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RG91YmxlUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RG91YmxlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXREb3VibGVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RG91YmxlUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERlY2ltYWxSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXREZWNpbWFsIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXREZWNpbWFsUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldERlY2ltYWxSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RGF0ZVRpbWVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXREYXRlVGltZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RGF0ZVRpbWVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RGF0ZVRpbWVSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0TG9uZ1JlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldExvbmciLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldExvbmdSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0TG9uZ1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaW5nbGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTaW5nbGUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFNpbmdsZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTaW5nbGVSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkJhc2VEYXRhVHlwZXNQb3J0VHlwZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VVNob3J0UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRVU2hvcnQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRVU2hvcnRSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRVU2hvcnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U0J5dGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0U0J5dGVSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFNCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0U0J5dGVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRTQnl0ZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJpbmciPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0U3RyaW5nUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJpbmciLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRTdHJpbmdSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRDaGFyUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRDaGFyIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0Q2hhclJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldENoYXJSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VGltZVNwYW4iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VGltZVNwYW5SZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFRpbWVTcGFuIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0VGltZVNwYW5SZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRUaW1lU3BhblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VXJpUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRVcmkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRVcmlSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRVcmlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0R3VpZCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRHdWlkUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRHdWlkIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0R3VpZFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEd1aWRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0T2JqZWN0Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldE9iamVjdFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0T2JqZWN0UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0T2JqZWN0UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEludCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRJbnRSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldEludCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldEludFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRGbG9hdFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RmxvYXQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRGbG9hdFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEZsb2F0UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJvb2wiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0Qm9vbFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0Qm9vbCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldEJvb2xSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRCb29sUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldFNob3J0UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRTaG9ydCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldFNob3J0UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U2hvcnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUxvbmciPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VUxvbmdSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFVMb25nIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0VUxvbmdSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRVTG9uZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlQXJyYXkiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0Qnl0ZUFycmF5UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRCeXRlQXJyYXlSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRCeXRlUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0Qnl0ZVJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEJ5dGVSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0UU5hbWUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0UU5hbWVSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFFOYW1lIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0UU5hbWVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRRTmFtZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldFVJbnRSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFVJbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRVSW50UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0VUludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREb3VibGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0RG91YmxlUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXREb3VibGUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXREb3VibGVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXREb3VibGVSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVjaW1hbCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXREZWNpbWFsUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXREZWNpbWFsIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0RGVjaW1hbFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldERlY2ltYWxSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0RGF0ZVRpbWVSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0RGF0ZVRpbWVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXREYXRlVGltZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRMb25nIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldExvbmdSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldExvbmciLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRMb25nUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0TG9uZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaW5nbGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0U2luZ2xlUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRTaW5nbGUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRTaW5nbGVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRTaW5nbGVSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkJhc2VEYXRhVHlwZXNTb2FwMTFCaW5kaW5nIiB0eXBlPSJuczpCYXNlRGF0YVR5cGVzUG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNCeXRlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U0J5dGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVTaG9ydCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFVTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRDaGFyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0Q2hhciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VGltZVNwYW4iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRUaW1lU3BhbiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VXJpIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VXJpIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRJbnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldE9iamVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldE9iamVjdCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0R3VpZCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEd1aWQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEZsb2F0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RmxvYXQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJvb2wiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCb29sIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaG9ydCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNob3J0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlQXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCeXRlQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVMb25nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUxvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFFOYW1lIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0UU5hbWUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCeXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RG91YmxlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RG91YmxlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZWNpbWFsIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RGVjaW1hbCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREYXRlVGltZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0TG9uZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldExvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNpbmdsZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNpbmdsZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iQmFzZURhdGFUeXBlc1NvYXAxMkJpbmRpbmciIHR5cGU9Im5zOkJhc2VEYXRhVHlwZXNQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwMTI6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U0J5dGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFVTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0Q2hhciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFRpbWVTcGFuIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRUaW1lU3BhbiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVyaSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VXJpIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRJbnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRPYmplY3QiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldE9iamVjdCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEd1aWQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEd1aWQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RmxvYXQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCb29sIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U2hvcnQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNob3J0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZUFycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCeXRlQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVTG9uZyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUxvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRRTmFtZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0UU5hbWUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCeXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUludCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERvdWJsZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RG91YmxlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVjaW1hbCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RGVjaW1hbCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERhdGVUaW1lIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREYXRlVGltZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldExvbmciPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldExvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaW5nbGUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNpbmdsZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkJhc2VEYXRhVHlwZXNIdHRwQmluZGluZyIgdHlwZT0ibnM6QmFzZURhdGFUeXBlc1BvcnRUeXBlIj4KLSAgICAgICAgPGh0dHA6YmluZGluZyB2ZXJiPSJQT1NUIi8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0U0J5dGUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFNCeXRlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U0J5dGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldFVTaG9ydCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VVNob3J0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VVNob3J0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RyaW5nIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQmFzZURhdGFUeXBlcy9yZXRTdHJpbmciLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cmluZyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cmluZyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldENoYXIiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldENoYXIiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldENoYXIiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRDaGFyIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VGltZVNwYW4iPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldFRpbWVTcGFuIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRUaW1lU3BhbiIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFRpbWVTcGFuIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VXJpIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQmFzZURhdGFUeXBlcy9yZXRVcmkiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVyaSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVyaSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEludCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0SW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRPYmplY3QiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldE9iamVjdCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0R3VpZCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0R3VpZCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0R3VpZCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEd1aWQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0RmxvYXQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RmxvYXQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQmFzZURhdGFUeXBlcy9yZXRCb29sIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCb29sIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0Qm9vbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQmFzZURhdGFUeXBlcy9yZXRTaG9ydCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2hvcnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTaG9ydCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0Qnl0ZUFycmF5Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVTG9uZyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0VUxvbmciLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVMb25nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VUxvbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRRTmFtZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0UU5hbWUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFFOYW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0UU5hbWUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQmFzZURhdGFUeXBlcy9yZXRCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0Qnl0ZSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVJbnQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldFVJbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRVSW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RG91YmxlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQmFzZURhdGFUeXBlcy9yZXREb3VibGUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERvdWJsZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERvdWJsZSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlY2ltYWwiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldERlY2ltYWwiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERlY2ltYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREZWNpbWFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREYXRlVGltZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0TG9uZyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkJhc2VEYXRhVHlwZXMvcmV0TG9uZyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0TG9uZyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldExvbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaW5nbGUiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJCYXNlRGF0YVR5cGVzL3JldFNpbmdsZSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2luZ2xlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2luZ2xlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iQmFzZURhdGFUeXBlcyI+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iQmFzZURhdGFUeXBlc0h0dHBTb2FwMTFFbmRwb2ludCIgYmluZGluZz0ibnM6QmFzZURhdGFUeXBlc1NvYXAxMUJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0Jhc2VEYXRhVHlwZXMiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iQmFzZURhdGFUeXBlc0h0dHBTb2FwMTJFbmRwb2ludCIgYmluZGluZz0ibnM6QmFzZURhdGFUeXBlc1NvYXAxMkJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXAxMjphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQmFzZURhdGFUeXBlcyIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLSAgICAgICAgPHdzZGw6cG9ydCBuYW1lPSJCYXNlRGF0YVR5cGVzSHR0cEVuZHBvaW50IiBiaW5kaW5nPSJuczpCYXNlRGF0YVR5cGVzSHR0cEJpbmRpbmciPgotICAgICAgICAgICAgPGh0dHA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0Jhc2VEYXRhVHlwZXMiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL0NvbXBsZXhEYXRhVHlwZXMud3NkbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0NvbXBsZXhEYXRhVHlwZXMvQ29tcGxleERhdGFUeXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFhNTE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0NvbXBsZXhEYXRhVHlwZXMvQ29tcGxleERhdGFUeXBlcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjA4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgeG1sbnM6bnMxPSJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi94c2QiIHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiB4bWxuczpheDIxPSJodHRwOi8vZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCIgeG1sbnM6bnM9Imh0dHA6Ly9jb21wbGV4LnRlbXB1cmkub3JnIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmF4MjI9Imh0dHA6Ly9hcnJheXMuZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vY29tcGxleC50ZW1wdXJpLm9yZyI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6YXgyMz0iaHR0cDovL2RhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcnJheXMuZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCI+Ci0gICAgICAgICAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2RhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiLz4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mUGVyc29uIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9InBlcnNvbiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjE6UGVyc29uIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZnNob3J0Ij4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Il9zaG9ydCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZkFycmF5T2ZzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJyYXlPZnN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjI6QXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZmludCI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJfaW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlY2ltYWwiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRlVGltZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZmFueVR5cGUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iYW55VHlwZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6YXgyNT0iaHR0cDovL2RhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiIHhtbG5zOmF4MjY9Imh0dHA6Ly9hcnJheXMuZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NvbXBsZXgudGVtcHVyaS5vcmciPgotICAgICAgICAgICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIi8+Ci0gICAgICAgICAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2FycmF5cy5kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblVyaSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVcmlSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblVTaG9ydCIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVTaG9ydFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0VUxvbmciPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblVMb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50ZWdlciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVTG9uZ1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50ZWdlciIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5VSW50IiB0eXBlPSJ4czpsb25nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVJbnRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6bG9uZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJ1Y3RTTlNBUyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluU3RydWN0U05TQVMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDIxOkdyb3VwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFN0cnVjdFNOU0FTUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDIxOkdyb3VwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFN0cnVjdFNOU0EiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblN0cnVjdFNOU0EiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDIxOkVtcGxveWVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFN0cnVjdFNOU0FSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjE6RW1wbG95ZWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U3RydWN0U04iPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblN0cnVjdFNOIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMTpQZXJzb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U3RydWN0U05SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjE6UGVyc29uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFN0cnVjdFMxIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5TdHJ1Y3RTMSIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjE6TmFtZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJ1Y3RTMVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMTpOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFN0cmluZ3MiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5TdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U3RyaW5nc1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTaW5nbGUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblNpbmdsZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U2luZ2xlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5TaG9ydCIgdHlwZT0ieHM6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U2hvcnRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U0J5dGUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpblNCeXRlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ynl0ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTQnl0ZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ynl0ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRRTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluUU5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFFOYW1lUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldE9iamVjdCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluT2JqZWN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRPYmplY3RSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0TG9uZyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluTG9uZyIgdHlwZT0ieHM6bG9uZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRMb25nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmxvbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0SW50cyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkludCIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEludHNSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRJbnQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkludCIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEludFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0R3VpZCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluR3VpZCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRHdWlkUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RmxvYXQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkZsb2F0IiB0eXBlPSJ4czpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRGbG9hdFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRFbnVtU3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5FbnVtU3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMTpCaXRNYXNrIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEVudW1TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjE6Qml0TWFzayIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRFbnVtSW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5FbnVtSW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEVudW1JbnRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREb3VibGUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkRvdWJsZSIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERvdWJsZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RGVyaXZlZENsYXNzMiI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluRGVyaXZlZENsYXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMTpUYWJsZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREZXJpdmVkQ2xhc3MyUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDIxOlRhYmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERlcml2ZWRDbGFzcyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluRGVyaXZlZENsYXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMTpGdXJuaXR1cmUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RGVyaXZlZENsYXNzUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDIxOkZ1cm5pdHVyZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5EZWNpbWFsIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREZWNpbWFsUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERhdGVUaW1lIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5EYXRlVGltZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERhdGVUaW1lUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRDaGFyIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5DaGFyIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Q2hhclJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Qnl0ZUFycmF5Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5CeXRlQXJyYXkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Qnl0ZUFycmF5UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Qnl0ZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluQnl0ZSIgdHlwZT0ieHM6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Qnl0ZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5Cb29sIiB0eXBlPSJ4czpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEJvb2xSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRBcnJheVN0cmluZzJEIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5BcnJheVN0cmluZzJEIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyNjpBcnJheU9mQXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRBcnJheVN0cmluZzJEUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDI2OkFycmF5T2ZBcnJheU9mc3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5U3RyaW5nMUQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkFycmF5U3RyaW5nMUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDI2OkFycmF5T2ZzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXlTdHJpbmcxRFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyNjpBcnJheU9mc3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5SW50MUQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkFycmF5SW50MUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDI2OkFycmF5T2ZpbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXlJbnQxRFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyNjpBcnJheU9maW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5RGVjaW1hbDFEIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5BcnJheURlY2ltYWwxRCIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjY6QXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5RGVjaW1hbDFEUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDI2OkFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRBcnJheURhdGVUaW1lMUQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbkFycmF5RGF0ZVRpbWUxRCIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjY6QXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRBcnJheURhdGVUaW1lMURSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjY6QXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRBcnJheUFueVR5cGUxRCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluQXJyYXlBbnlUeXBlMUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDI2OkFycmF5T2ZhbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5QW55VHlwZTFEUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJheDI2OkFycmF5T2ZhbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5MURTTiI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluQXJyYXkxRFNOIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyNjpBcnJheU9mUGVyc29uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5MURTTlJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyNjpBcnJheU9mUGVyc29uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6YXgyND0iaHR0cDovL2FycmF5cy5kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCI+Ci0gICAgICAgICAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2FycmF5cy5kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIi8+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iR3JvdXAiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZW1iZXJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyNDpBcnJheU9mUGVyc29uIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBlcnNvbiI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFnZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlkIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYWxlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbXBsb3llZSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJhc2VEZXRhaWxzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMTpQZXJzb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXJlRGF0ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iam9iSUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpsb25nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVtYmVycyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjQ6QXJyYXlPZnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJCaXRNYXNrIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2UvPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJGdXJuaXR1cmUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xvciIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUYWJsZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImF4MjE6RnVybml0dXJlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlYXRpbmdDYXBhY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEludFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEludCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0SW50UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEludFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRHdWlkUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0R3VpZCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0R3VpZFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRHdWlkUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVyaVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVyaSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VXJpUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVyaVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVTG9uZ1JlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVMb25nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVTG9uZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRVTG9uZ1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXREZXJpdmVkQ2xhc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXREZXJpdmVkQ2xhc3MiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERlcml2ZWRDbGFzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXREZXJpdmVkQ2xhc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0SW50c1JlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEludHMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEludHNSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0SW50c1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaW5nbGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTaW5nbGUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFNpbmdsZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTaW5nbGVSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0QXJyYXlJbnQxRFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5SW50MUQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5SW50MURSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0QXJyYXlJbnQxRFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRPYmplY3RSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRPYmplY3QiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldE9iamVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRPYmplY3RSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RG91YmxlUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RG91YmxlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXREb3VibGVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RG91YmxlUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERhdGVUaW1lUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RGF0ZVRpbWUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERhdGVUaW1lUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldERhdGVUaW1lUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5MURTTlJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5MURTTiIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0QXJyYXkxRFNOUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5MURTTlJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlNBUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U3RydWN0U05TQSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RydWN0U05TQVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTdHJ1Y3RTTlNBUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5U3RyaW5nMkRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRBcnJheVN0cmluZzJEIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheVN0cmluZzJEUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5U3RyaW5nMkRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0QXJyYXlTdHJpbmcxRFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5U3RyaW5nMUQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5U3RyaW5nMURSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0QXJyYXlTdHJpbmcxRFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRFbnVtU3RyaW5nUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RW51bVN0cmluZyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RW51bVN0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRFbnVtU3RyaW5nUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldExvbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRMb25nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRMb25nUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldExvbmdSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RGVjaW1hbFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldERlY2ltYWwiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERlY2ltYWxSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RGVjaW1hbFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRFbnVtSW50UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RW51bUludCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RW51bUludFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRFbnVtSW50UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFN0cnVjdFMxUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U3RydWN0UzEiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFN0cnVjdFMxUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFN0cnVjdFMxUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVTaG9ydFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVTaG9ydCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VVNob3J0UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVTaG9ydFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFN0cnVjdFNOIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTdHJ1Y3RTTlJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheURlY2ltYWwxRFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5RGVjaW1hbDFEIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheURlY2ltYWwxRFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRBcnJheURlY2ltYWwxRFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlNBU1JlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFN0cnVjdFNOU0FTIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlNBU1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTdHJ1Y3RTTlNBU1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheUFueVR5cGUxRFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEFycmF5QW55VHlwZTFEIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheUFueVR5cGUxRFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRBcnJheUFueVR5cGUxRFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheURhdGVUaW1lMURSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRBcnJheURhdGVUaW1lMUQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5RGF0ZVRpbWUxRFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRBcnJheURhdGVUaW1lMURSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0UU5hbWVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRRTmFtZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0UU5hbWVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0UU5hbWVSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qnl0ZUFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0Qnl0ZUFycmF5Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCeXRlQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0Qnl0ZUFycmF5UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldENoYXJSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRDaGFyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRDaGFyUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldENoYXJSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qnl0ZVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEJ5dGUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEJ5dGVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0Qnl0ZVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTQnl0ZVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFNCeXRlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTQnl0ZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTQnl0ZVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCb29sUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0Qm9vbCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qm9vbFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRCb29sUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVJbnRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRVSW50Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVSW50UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFVJbnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RGVyaXZlZENsYXNzMlJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldERlcml2ZWRDbGFzczIiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERlcml2ZWRDbGFzczJSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0RGVyaXZlZENsYXNzMlJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRGbG9hdFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldEZsb2F0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRGbG9hdFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRGbG9hdFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJpbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTdHJpbmciLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFN0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTdHJpbmdSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RyaW5nc1JlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFN0cmluZ3MiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFN0cmluZ3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM6cmV0U3RyaW5nc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaG9ydFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zOnJldFNob3J0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaG9ydFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczpyZXRTaG9ydFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29tcGxleERhdGFUeXBlc1BvcnRUeXBlIj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEludCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRJbnRSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldEludCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldEludFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRHdWlkIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldEd1aWRSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldEd1aWQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRHdWlkUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0R3VpZFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VXJpUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRVcmkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRVcmlSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRVcmlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUxvbmciPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VUxvbmdSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFVMb25nIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0VUxvbmdSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRVTG9uZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZXJpdmVkQ2xhc3MiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0RGVyaXZlZENsYXNzUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXREZXJpdmVkQ2xhc3MiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXREZXJpdmVkQ2xhc3NSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXREZXJpdmVkQ2xhc3NSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50cyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRJbnRzUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRJbnRzIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0SW50c1Jlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEludHNSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U2luZ2xlIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldFNpbmdsZVJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U2luZ2xlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0U2luZ2xlUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U2luZ2xlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5SW50MUQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXlJbnQxRFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlJbnQxRCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldEFycmF5SW50MURSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheUludDFEUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldE9iamVjdCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRPYmplY3RSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldE9iamVjdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldE9iamVjdFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldE9iamVjdFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREb3VibGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0RG91YmxlUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXREb3VibGUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXREb3VibGVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXREb3VibGVSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0RGF0ZVRpbWVSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0RGF0ZVRpbWVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXREYXRlVGltZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheTFEU04iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXkxRFNOUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheTFEU04iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRBcnJheTFEU05SZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheTFEU05SZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0U05TQSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRTdHJ1Y3RTTlNBUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJ1Y3RTTlNBIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0U3RydWN0U05TQVJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFNOU0FSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcyRCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRBcnJheVN0cmluZzJEUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheVN0cmluZzJEIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXlTdHJpbmcyRFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5U3RyaW5nMkRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcxRCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRBcnJheVN0cmluZzFEUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheVN0cmluZzFEIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXlTdHJpbmcxRFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5U3RyaW5nMURSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bVN0cmluZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRFbnVtU3RyaW5nUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRFbnVtU3RyaW5nIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0RW51bVN0cmluZ1Jlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEVudW1TdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0TG9uZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRMb25nUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRMb25nIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0TG9uZ1Jlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldExvbmdSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVjaW1hbCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXREZWNpbWFsUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXREZWNpbWFsIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0RGVjaW1hbFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldERlY2ltYWxSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bUludCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRFbnVtSW50UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRFbnVtSW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0RW51bUludFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEVudW1JbnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0UzEiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0U3RydWN0UzFSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFMxIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0U3RydWN0UzFSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJ1Y3RTMVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0VVNob3J0UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRVU2hvcnQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRVU2hvcnRSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRVU2hvcnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0U04iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0U3RydWN0U05SZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFNOIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0U3RydWN0U05SZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJ1Y3RTTlJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheURlY2ltYWwxRCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRBcnJheURlY2ltYWwxRFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlEZWNpbWFsMUQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRBcnJheURlY2ltYWwxRFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5RGVjaW1hbDFEUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0FTIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldFN0cnVjdFNOU0FTUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJ1Y3RTTlNBUyIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldFN0cnVjdFNOU0FTUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U3RydWN0U05TQVNSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlBbnlUeXBlMUQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXlBbnlUeXBlMURSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5QW55VHlwZTFEIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXlBbnlUeXBlMURSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheUFueVR5cGUxRFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheURhdGVUaW1lMUQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0QXJyYXlEYXRlVGltZTFEUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheURhdGVUaW1lMUQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRBcnJheURhdGVUaW1lMURSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheURhdGVUaW1lMURSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0UU5hbWUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0UU5hbWVSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFFOYW1lIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0UU5hbWVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRRTmFtZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlQXJyYXkiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0Qnl0ZUFycmF5UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRCeXRlQXJyYXlSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRDaGFyUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRDaGFyIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0Q2hhclJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldENoYXJSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRCeXRlUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0Qnl0ZVJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEJ5dGVSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U0J5dGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnM6cmV0U0J5dGVSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFNCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibnM6cmV0U0J5dGVSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpyZXRTQnl0ZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldEJvb2xSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldEJvb2wiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRCb29sUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0Qm9vbFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldFVJbnRSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFVJbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRVSW50UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0VUludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZXJpdmVkQ2xhc3MyIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldERlcml2ZWRDbGFzczJSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldERlcml2ZWRDbGFzczIiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXREZXJpdmVkQ2xhc3MyUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RGVyaXZlZENsYXNzMlJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRGbG9hdFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RmxvYXQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRGbG9hdFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldEZsb2F0UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRTdHJpbmdSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cmluZyIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im5zOnJldFN0cmluZ1Jlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJpbmdzIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im5zOnJldFN0cmluZ3NSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cmluZ3MiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRTdHJpbmdzUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U3RyaW5nc1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaG9ydCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJuczpyZXRTaG9ydFJlcXVlc3QiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U2hvcnQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczpyZXRTaG9ydFJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOnJldFNob3J0UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJDb21wbGV4RGF0YVR5cGVzU29hcDExQmluZGluZyIgdHlwZT0ibnM6Q29tcGxleERhdGFUeXBlc1BvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVcmkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEd1aWQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRHdWlkIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRJbnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVMb25nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUxvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlcml2ZWRDbGFzcyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlcml2ZWRDbGFzcyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U2luZ2xlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U2luZ2xlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnRzIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0SW50cyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlJbnQxRCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5SW50MUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERvdWJsZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERvdWJsZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREYXRlVGltZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0T2JqZWN0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0T2JqZWN0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheTFEU04iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheTFEU04iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0EiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTdHJ1Y3RTTlNBIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheVN0cmluZzJEIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcyRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0TG9uZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldExvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEVudW1TdHJpbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRFbnVtU3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheVN0cmluZzFEIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVjaW1hbCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlY2ltYWwiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEVudW1JbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRFbnVtSW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVU2hvcnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVU2hvcnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFMxIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0UzEiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U04iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGVjaW1hbDFEIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlEZWNpbWFsMUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0FTIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U05TQVMiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGF0ZVRpbWUxRCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5RGF0ZVRpbWUxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlBbnlUeXBlMUQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheUFueVR5cGUxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0UU5hbWUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRRTmFtZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldENoYXIiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEJ5dGVBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U0J5dGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTQnl0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEJ5dGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJvb2wiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCb29sIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVyaXZlZENsYXNzMiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlcml2ZWRDbGFzczIiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cmluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RmxvYXQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRGbG9hdCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U2hvcnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RyaW5ncyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cmluZ3MiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNTb2FwMTJCaW5kaW5nIiB0eXBlPSJuczpDb21wbGV4RGF0YVR5cGVzUG9ydFR5cGUiPgotICAgICAgICA8c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VXJpIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVcmkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRHdWlkIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRHdWlkIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRJbnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVTG9uZyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUxvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZXJpdmVkQ2xhc3MiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlcml2ZWRDbGFzcyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNpbmdsZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U2luZ2xlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50cyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0SW50cyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5SW50MUQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5SW50MUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREb3VibGUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERvdWJsZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERhdGVUaW1lIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREYXRlVGltZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldE9iamVjdCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0T2JqZWN0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXkxRFNOIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheTFEU04iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTlNBIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTdHJ1Y3RTTlNBIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcyRCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcyRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldExvbmciPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldExvbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRFbnVtU3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRFbnVtU3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcxRCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlY2ltYWwiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlY2ltYWwiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRFbnVtSW50Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRFbnVtSW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VVNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVU2hvcnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTMSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0UzEiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTiI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U04iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheURlY2ltYWwxRCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlEZWNpbWFsMUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTlNBUyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U05TQVMiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheURhdGVUaW1lMUQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5RGF0ZVRpbWUxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5QW55VHlwZTFEIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheUFueVR5cGUxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFFOYW1lIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRRTmFtZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldENoYXIiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldENoYXIiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlQXJyYXkiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEJ5dGVBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNCeXRlIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTQnl0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEJ5dGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCb29sIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUludCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlcml2ZWRDbGFzczIiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlcml2ZWRDbGFzczIiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJpbmciPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cmluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEZsb2F0Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRGbG9hdCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZ3MiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cmluZ3MiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJDb21wbGV4RGF0YVR5cGVzSHR0cEJpbmRpbmciIHR5cGU9Im5zOkNvbXBsZXhEYXRhVHlwZXNQb3J0VHlwZSI+Ci0gICAgICAgIDxodHRwOmJpbmRpbmcgdmVyYj0iUE9TVCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VXJpIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRVcmkiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVyaSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVyaSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEd1aWQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldEd1aWQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEd1aWQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRHdWlkIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRJbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEludCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEludCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVMb25nIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRVTG9uZyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VUxvbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRVTG9uZyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlcml2ZWRDbGFzcyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0RGVyaXZlZENsYXNzIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREZXJpdmVkQ2xhc3MiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREZXJpdmVkQ2xhc3MiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaW5nbGUiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldFNpbmdsZSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2luZ2xlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2luZ2xlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50cyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0SW50cyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0SW50cyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEludHMiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheUludDFEIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRBcnJheUludDFEIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheUludDFEIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlJbnQxRCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERvdWJsZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0RG91YmxlIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREb3VibGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREb3VibGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREYXRlVGltZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRPYmplY3QiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldE9iamVjdCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXkxRFNOIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRBcnJheTFEU04iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5MURTTiIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5MURTTiIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0EiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldFN0cnVjdFNOU0EiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cnVjdFNOU0EiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJ1Y3RTTlNBIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcyRCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0QXJyYXlTdHJpbmcyRCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlTdHJpbmcyRCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5U3RyaW5nMkQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRMb25nIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRMb25nIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRMb25nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0TG9uZyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEVudW1TdHJpbmciPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldEVudW1TdHJpbmciLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEVudW1TdHJpbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRFbnVtU3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcxRCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0QXJyYXlTdHJpbmcxRCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlTdHJpbmcxRCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5U3RyaW5nMUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZWNpbWFsIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXREZWNpbWFsIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREZWNpbWFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RGVjaW1hbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEVudW1JbnQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldEVudW1JbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEVudW1JbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRFbnVtSW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VVNob3J0Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRVU2hvcnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVTaG9ydCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVTaG9ydCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFMxIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRTdHJ1Y3RTMSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0UzEiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJ1Y3RTMSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRTdHJ1Y3RTTiIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0U04iLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJ1Y3RTTiIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGVjaW1hbDFEIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRBcnJheURlY2ltYWwxRCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlEZWNpbWFsMUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheURlY2ltYWwxRCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0FTIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRTdHJ1Y3RTTlNBUyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0U05TQVMiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJ1Y3RTTlNBUyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGF0ZVRpbWUxRCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0QXJyYXlEYXRlVGltZTFEIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheURhdGVUaW1lMUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheURhdGVUaW1lMUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheUFueVR5cGUxRCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0QXJyYXlBbnlUeXBlMUQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5QW55VHlwZTFEIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlBbnlUeXBlMUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRRTmFtZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0UU5hbWUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFFOYW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0UU5hbWUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRDaGFyIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRDaGFyIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRDaGFyIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0Q2hhciIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0Qnl0ZUFycmF5Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0U0J5dGUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFNCeXRlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U0J5dGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0Qnl0ZSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJvb2wiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzL3JldEJvb2wiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEJvb2wiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCb29sIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUludCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0VUludCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VUludCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZXJpdmVkQ2xhc3MyIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXREZXJpdmVkQ2xhc3MyIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREZXJpdmVkQ2xhc3MyIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RGVyaXZlZENsYXNzMiIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0U3RyaW5nIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJpbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJpbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0RmxvYXQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RmxvYXQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaG9ydCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXMvcmV0U2hvcnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFNob3J0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2hvcnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJpbmdzIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlcy9yZXRTdHJpbmdzIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJpbmdzIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RyaW5ncyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkNvbXBsZXhEYXRhVHlwZXMiPgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNIdHRwU29hcDExRW5kcG9pbnQiIGJpbmRpbmc9Im5zOkNvbXBsZXhEYXRhVHlwZXNTb2FwMTFCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9Db21wbGV4RGF0YVR5cGVzIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNIdHRwU29hcDEyRW5kcG9pbnQiIGJpbmRpbmc9Im5zOkNvbXBsZXhEYXRhVHlwZXNTb2FwMTJCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0NvbXBsZXhEYXRhVHlwZXMiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iQ29tcGxleERhdGFUeXBlc0h0dHBFbmRwb2ludCIgYmluZGluZz0ibnM6Q29tcGxleERhdGFUeXBlc0h0dHBCaW5kaW5nIj4KLSAgICAgICAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9Db21wbGV4RGF0YVR5cGVzIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiYzFiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iQ29tcGxleERhdGFUeXBlcyI+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5vcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXM8L3BhcmFtZXRlcj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS53c2RsIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmZDdhNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTc5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczpuczA9Imh0dHA6Ly9hcnJheXMuZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCIgeG1sbnM6c29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iIHhtbG5zOm5zMT0iaHR0cDovL2NvbXBsZXgudGVtcHVyaS5vcmciIHhtbG5zOm5zMj0iaHR0cDovL2RhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vY29tcGxleC50ZW1wdXJpLm9yZyI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6YXgyMj0iaHR0cDovL2FycmF5cy5kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIiB4bWxuczpheDI0PSJodHRwOi8vZGF0YS5jb21wbGV4LnRlbXB1cmkub3JnL3hzZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXJyYXlzLmRhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiPgotICAgICAgICAgICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIi8+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZnNob3J0Ij4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Il9zaG9ydCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mUGVyc29uIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9InBlcnNvbiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjQ6UGVyc29uIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZkFycmF5T2ZzdHJpbmciPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJyYXlPZnN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjI6QXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGVUaW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4KLQotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWNpbWFsIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGVjaW1hbCIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZhbnlUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iYW55VHlwZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9maW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Il9pbnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczpucz0iaHR0cDovL2NvbXBsZXgudGVtcHVyaS5vcmciIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NvbXBsZXgudGVtcHVyaS5vcmciPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5Cb29sIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Qm9vbFJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluU0J5dGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpieXRlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTQnl0ZVJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmJ5dGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluQnl0ZUFycmF5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0Qnl0ZUFycmF5UmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5Eb3VibGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERvdWJsZVJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5GbG9hdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRGbG9hdFJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblNpbmdsZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTaW5nbGVSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpmbG9hdCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5DaGFyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRDaGFyUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluSW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRJbnRSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluVVNob3J0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVU2hvcnRSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEludHMiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5JbnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLQotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRJbnRzUmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluT2JqZWN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0T2JqZWN0UmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5FbnVtSW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRFbnVtSW50UmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkd1aWQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEd1aWRSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluU3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJpbmdSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluVXJpIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVyaVJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U3RyaW5ncyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJpblN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJpbmdzUmVzdWx0Ij4KLQotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluRGVjaW1hbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldERlY2ltYWxSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkZWNpbWFsIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblVMb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50ZWdlciIvPgotCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRVTG9uZ1Jlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludGVnZXIiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluRGF0ZVRpbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0RGF0ZVRpbWVSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5RTmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFFOYW1lUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5Mb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6bG9uZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0TG9uZ1Jlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmxvbmciLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluVUludCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmxvbmciLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFVJbnRSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpsb25nIi8+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluRW51bVN0cmluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpCaXRNYXNrIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRFbnVtU3RyaW5nUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMyOkJpdE1hc2siLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluU3RydWN0U05TQSIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpFbXBsb3llZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U3RydWN0U05TQVJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpFbXBsb3llZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5EZXJpdmVkQ2xhc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczI6RnVybml0dXJlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXREZXJpdmVkQ2xhc3NSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczI6RnVybml0dXJlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblN0cnVjdFNOU0FTIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMyOkdyb3VwIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJ1Y3RTTlNBU1Jlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpHcm91cCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5TdHJ1Y3RTMSIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpOYW1lIi8+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldFN0cnVjdFMxUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMyOk5hbWUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluU3RydWN0U04iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczI6UGVyc29uIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRTdHJ1Y3RTTlJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpQZXJzb24iLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluQXJyYXlTdHJpbmcyRCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMDpBcnJheU9mQXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXlTdHJpbmcyRFJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMDpBcnJheU9mQXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5BcnJheURhdGVUaW1lMUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczA6QXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXlEYXRlVGltZTFEUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMwOkFycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluQXJyYXlEZWNpbWFsMUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczA6QXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRBcnJheURlY2ltYWwxRFJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMDpBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwiLz4KLQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5BcnJheTFEU04iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczA6QXJyYXlPZlBlcnNvbiIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXkxRFNOUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMwOkFycmF5T2ZQZXJzb24iLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluQXJyYXlBbnlUeXBlMUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczA6QXJyYXlPZmFueVR5cGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldEFycmF5QW55VHlwZTFEUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMwOkFycmF5T2ZhbnlUeXBlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkFycmF5SW50MUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczA6QXJyYXlPZmludCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXlJbnQxRFJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMDpBcnJheU9maW50Ii8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkFycmF5U3RyaW5nMUQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczA6QXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0QXJyYXlTdHJpbmcxRFJlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMDpBcnJheU9mc3RyaW5nIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkJ5dGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPgotCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXRCeXRlUmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c2hvcnQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImluU2hvcnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0U2hvcnRSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczpheDIzPSJodHRwOi8vYXJyYXlzLmRhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiIHhtbG5zOmF4MjE9Imh0dHA6Ly9kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kYXRhLmNvbXBsZXgudGVtcHVyaS5vcmcveHNkIj4KLSAgICAgICAgICAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vYXJyYXlzLmRhdGEuY29tcGxleC50ZW1wdXJpLm9yZy94c2QiLz4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJCaXRNYXNrIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQklUX0ZJVkUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczI6Qml0TWFzayIvPgotCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQklUX0ZPVVIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczI6Qml0TWFzayIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJJVF9PTkUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczI6Qml0TWFzayIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJJVF9USFJFRSIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpCaXRNYXNrIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQklUX1RXTyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpCaXRNYXNrIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRW1wbG95ZWUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiYXNlRGV0YWlscyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMjpQZXJzb24iLz4KLQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImhpcmVEYXRlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqb2JJRCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmxvbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudW1iZXJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iYXgyMzpBcnJheU9mc2hvcnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJQZXJzb24iPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhZ2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpZCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmZsb2F0Ii8+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYWxlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJGdXJuaXR1cmUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xvciIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotCi0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikdyb3VwIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWVtYmVycyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImF4MjM6QXJyYXlPZlBlcnNvbiIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJOYW1lIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFN0cnVjdFNOU0FTUmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluU3RydWN0U05TQVMiIGVsZW1lbnQ9Im5zMTppblN0cnVjdFNOU0FTIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlNBU1Jlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTdHJ1Y3RTTlNBU1Jlc3VsdCIgZWxlbWVudD0ibnMxOnJldFN0cnVjdFNOU0FTUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaW5nbGVSZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5TaW5nbGUiIGVsZW1lbnQ9Im5zMTppblNpbmdsZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U2luZ2xlUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTaW5nbGVSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRTaW5nbGVSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5U3RyaW5nMkRSZXF1ZXN0TWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkFycmF5U3RyaW5nMkQiIGVsZW1lbnQ9Im5zMTppbkFycmF5U3RyaW5nMkQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5U3RyaW5nMkRSZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldEFycmF5U3RyaW5nMkRSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRBcnJheVN0cmluZzJEUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheUFueVR5cGUxRFJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkFycmF5QW55VHlwZTFEIiBlbGVtZW50PSJuczE6aW5BcnJheUFueVR5cGUxRCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0QXJyYXlBbnlUeXBlMURSZXNwb25zZU1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0QXJyYXlBbnlUeXBlMURSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRBcnJheUFueVR5cGUxRFJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0SW50c1JlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRJbnRzIiBlbGVtZW50PSJuczE6cmV0SW50cyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0SW50c1Jlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0SW50c1Jlc3VsdCIgZWxlbWVudD0ibnMxOnJldEludHNSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERhdGVUaW1lUmVxdWVzdE1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5EYXRlVGltZSIgZWxlbWVudD0ibnMxOmluRGF0ZVRpbWUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERhdGVUaW1lUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXREYXRlVGltZVJlc3VsdCIgZWxlbWVudD0ibnMxOnJldERhdGVUaW1lUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTTlNBUmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluU3RydWN0U05TQSIgZWxlbWVudD0ibnMxOmluU3RydWN0U05TQSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RydWN0U05TQVJlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTdHJ1Y3RTTlNBUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0U3RydWN0U05TQVJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0R3VpZFJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkd1aWQiIGVsZW1lbnQ9Im5zMTppbkd1aWQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEd1aWRSZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldEd1aWRSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRHdWlkUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCeXRlQXJyYXlSZXF1ZXN0TWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRCeXRlQXJyYXkiIGVsZW1lbnQ9Im5zMTpyZXRCeXRlQXJyYXkiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEJ5dGVBcnJheVJlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0Qnl0ZUFycmF5UmVzdWx0IiBlbGVtZW50PSJuczE6cmV0Qnl0ZUFycmF5UmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVcmlSZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5VcmkiIGVsZW1lbnQ9Im5zMTppblVyaSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VXJpUmVzcG9uc2VNZXNzYWdlIj4KLQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldFVyaVJlc3VsdCIgZWxlbWVudD0ibnMxOnJldFVyaVJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0UU5hbWVSZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5RTmFtZSIgZWxlbWVudD0ibnMxOmluUU5hbWUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFFOYW1lUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRRTmFtZVJlc3VsdCIgZWxlbWVudD0ibnMxOnJldFFOYW1lUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheTFEU05SZXF1ZXN0TWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkFycmF5MURTTiIgZWxlbWVudD0ibnMxOmluQXJyYXkxRFNOIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheTFEU05SZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldEFycmF5MURTTlJlc3VsdCIgZWxlbWVudD0ibnMxOnJldEFycmF5MURTTlJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RyaW5nc1JlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTdHJpbmdzIiBlbGVtZW50PSJuczE6cmV0U3RyaW5ncyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RyaW5nc1Jlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTdHJpbmdzUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0U3RyaW5nc1Jlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RW51bUludFJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkVudW1JbnQiIGVsZW1lbnQ9Im5zMTppbkVudW1JbnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEVudW1JbnRSZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldEVudW1JbnRSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRFbnVtSW50UmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRMb25nUmVxdWVzdE1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5Mb25nIiBlbGVtZW50PSJuczE6aW5Mb25nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRMb25nUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRMb25nUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0TG9uZ1Jlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VVNob3J0UmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluVVNob3J0IiBlbGVtZW50PSJuczE6aW5VU2hvcnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVTaG9ydFJlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRVU2hvcnRSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRVU2hvcnRSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5U3RyaW5nMURSZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5BcnJheVN0cmluZzFEIiBlbGVtZW50PSJuczE6aW5BcnJheVN0cmluZzFEIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheVN0cmluZzFEUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRBcnJheVN0cmluZzFEUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0QXJyYXlTdHJpbmcxRFJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0QXJyYXlJbnQxRFJlcXVlc3RNZXNzYWdlIj4KLQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluQXJyYXlJbnQxRCIgZWxlbWVudD0ibnMxOmluQXJyYXlJbnQxRCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0QXJyYXlJbnQxRFJlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0QXJyYXlJbnQxRFJlc3VsdCIgZWxlbWVudD0ibnMxOnJldEFycmF5SW50MURSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5RGF0ZVRpbWUxRFJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkFycmF5RGF0ZVRpbWUxRCIgZWxlbWVudD0ibnMxOmluQXJyYXlEYXRlVGltZTFEIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRBcnJheURhdGVUaW1lMURSZXNwb25zZU1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0QXJyYXlEYXRlVGltZTFEUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0QXJyYXlEYXRlVGltZTFEUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVSW50UmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluVUludCIgZWxlbWVudD0ibnMxOmluVUludCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0VUludFJlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0VUludFJlc3VsdCIgZWxlbWVudD0ibnMxOnJldFVJbnRSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5RGVjaW1hbDFEUmVxdWVzdE1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5BcnJheURlY2ltYWwxRCIgZWxlbWVudD0ibnMxOmluQXJyYXlEZWNpbWFsMUQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEFycmF5RGVjaW1hbDFEUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRBcnJheURlY2ltYWwxRFJlc3VsdCIgZWxlbWVudD0ibnMxOnJldEFycmF5RGVjaW1hbDFEUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCeXRlUmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluQnl0ZSIgZWxlbWVudD0ibnMxOmluQnl0ZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qnl0ZVJlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRCeXRlUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0Qnl0ZVJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U0J5dGVSZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5TQnl0ZSIgZWxlbWVudD0ibnMxOmluU0J5dGUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFNCeXRlUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTQnl0ZVJlc3VsdCIgZWxlbWVudD0ibnMxOnJldFNCeXRlUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaG9ydFJlcXVlc3RNZXNzYWdlIj4KLQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluU2hvcnQiIGVsZW1lbnQ9Im5zMTppblNob3J0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTaG9ydFJlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0U2hvcnRSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRTaG9ydFJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RydWN0U05SZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5TdHJ1Y3RTTiIgZWxlbWVudD0ibnMxOmluU3RydWN0U04iLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFN0cnVjdFNOUmVzcG9uc2VNZXNzYWdlIj4KLQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldFN0cnVjdFNOUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0U3RydWN0U05SZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldE9iamVjdFJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbk9iamVjdCIgZWxlbWVudD0ibnMxOmluT2JqZWN0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRPYmplY3RSZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldE9iamVjdFJlc3VsdCIgZWxlbWVudD0ibnMxOnJldE9iamVjdFJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RmxvYXRSZXF1ZXN0TWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkZsb2F0IiBlbGVtZW50PSJuczE6aW5GbG9hdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RmxvYXRSZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldEZsb2F0UmVzdWx0IiBlbGVtZW50PSJuczE6cmV0RmxvYXRSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERvdWJsZVJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkRvdWJsZSIgZWxlbWVudD0ibnMxOmluRG91YmxlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXREb3VibGVSZXNwb25zZU1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0RG91YmxlUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0RG91YmxlUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRCb29sUmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluQm9vbCIgZWxlbWVudD0ibnMxOmluQm9vbCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0Qm9vbFJlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0Qm9vbFJlc3VsdCIgZWxlbWVudD0ibnMxOnJldEJvb2xSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERlcml2ZWRDbGFzc1JlcXVlc3RNZXNzYWdlIj4KLQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluRGVyaXZlZENsYXNzIiBlbGVtZW50PSJuczE6aW5EZXJpdmVkQ2xhc3MiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldERlcml2ZWRDbGFzc1Jlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0RGVyaXZlZENsYXNzUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0RGVyaXZlZENsYXNzUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXREZWNpbWFsUmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluRGVjaW1hbCIgZWxlbWVudD0ibnMxOmluRGVjaW1hbCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RGVjaW1hbFJlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXREZWNpbWFsUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0RGVjaW1hbFJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0RW51bVN0cmluZ1JlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkVudW1TdHJpbmciIGVsZW1lbnQ9Im5zMTppbkVudW1TdHJpbmciLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEVudW1TdHJpbmdSZXNwb25zZU1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InJldEVudW1TdHJpbmdSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRFbnVtU3RyaW5nUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTMVJlcXVlc3RNZXNzYWdlIj4KLQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluU3RydWN0UzEiIGVsZW1lbnQ9Im5zMTppblN0cnVjdFMxIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRTdHJ1Y3RTMVJlc3BvbnNlTWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmV0U3RydWN0UzFSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRTdHJ1Y3RTMVJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0SW50UmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluSW50IiBlbGVtZW50PSJuczE6aW5JbnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldEludFJlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRJbnRSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRJbnRSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldENoYXJSZXF1ZXN0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5DaGFyIiBlbGVtZW50PSJuczE6aW5DaGFyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRDaGFyUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRDaGFyUmVzdWx0IiBlbGVtZW50PSJuczE6cmV0Q2hhclJlc3VsdCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RyaW5nUmVxdWVzdE1lc3NhZ2UiPgotCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5TdHJpbmciIGVsZW1lbnQ9Im5zMTppblN0cmluZyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icmV0U3RyaW5nUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRTdHJpbmdSZXN1bHQiIGVsZW1lbnQ9Im5zMTpyZXRTdHJpbmdSZXN1bHQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InJldFVMb25nUmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluVUxvbmciIGVsZW1lbnQ9Im5zMTppblVMb25nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJyZXRVTG9uZ1Jlc3BvbnNlTWVzc2FnZSI+Ci0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXRVTG9uZ1Jlc3VsdCIgZWxlbWVudD0ibnMxOnJldFVMb25nUmVzdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVQb3J0VHlwZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTlNBUyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cnVjdFNOU0FTUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U3RydWN0U05TQVMiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cnVjdFNOU0FTUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFNOU0FTUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNpbmdsZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFNpbmdsZVJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFNpbmdsZSIvPgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRTaW5nbGVSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U2luZ2xlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5U3RyaW5nMkQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRBcnJheVN0cmluZzJEUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcyRCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlTdHJpbmcyRFJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheVN0cmluZzJEUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5QW55VHlwZTFEIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlBbnlUeXBlMURSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheUFueVR5cGUxRCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlBbnlUeXBlMURSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlBbnlUeXBlMURSZXNwb25zZSIvPgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnRzIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0SW50c1JlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEludHMiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEludHNSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0SW50c1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREYXRlVGltZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldERhdGVUaW1lUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldERhdGVUaW1lUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldERhdGVUaW1lUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0U05TQSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cnVjdFNOU0FSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJ1Y3RTTlNBIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRTdHJ1Y3RTTlNBUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFNOU0FSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0R3VpZCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEd1aWRSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRHdWlkIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRHdWlkUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEd1aWRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZUFycmF5Ij4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRCeXRlQXJyYXlSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEJ5dGVBcnJheVJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VXJpIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0VXJpUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0VXJpIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRVcmlSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0VXJpUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFFOYW1lIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0UU5hbWVSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRRTmFtZSIvPgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRRTmFtZVJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRRTmFtZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheTFEU04iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRBcnJheTFEU05SZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheTFEU04iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEFycmF5MURTTlJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheTFEU05SZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RyaW5ncyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cmluZ3NSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJpbmdzIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRTdHJpbmdzUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cmluZ3NSZXNwb25zZSIvPgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRFbnVtSW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0RW51bUludFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEVudW1JbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEVudW1JbnRSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RW51bUludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRMb25nIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0TG9uZ1JlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldExvbmciLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldExvbmdSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0TG9uZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVTaG9ydCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFVTaG9ydFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFVTaG9ydCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0VVNob3J0UmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFVTaG9ydFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheVN0cmluZzFEIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlTdHJpbmcxRFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5U3RyaW5nMUQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEFycmF5U3RyaW5nMURSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcxRFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheUludDFEIj4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRBcnJheUludDFEUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlJbnQxRCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlJbnQxRFJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheUludDFEUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGF0ZVRpbWUxRCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEFycmF5RGF0ZVRpbWUxRFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5RGF0ZVRpbWUxRCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlEYXRlVGltZTFEUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEFycmF5RGF0ZVRpbWUxRFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0VUludFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFVJbnQiLz4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0VUludFJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRVSW50UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGVjaW1hbDFEIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlEZWNpbWFsMURSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRBcnJheURlY2ltYWwxRCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0QXJyYXlEZWNpbWFsMURSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0QXJyYXlEZWNpbWFsMURSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEJ5dGVSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRCeXRlUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEJ5dGVSZXNwb25zZSIvPgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFNCeXRlUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U0J5dGUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFNCeXRlUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFNCeXRlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0U2hvcnRSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRTaG9ydCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0U2hvcnRSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U2hvcnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTiI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cnVjdFNOUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0U3RydWN0U04iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cnVjdFNOUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFNOUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldE9iamVjdCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldE9iamVjdFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldE9iamVjdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0T2JqZWN0UmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldE9iamVjdFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0RmxvYXRSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRGbG9hdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0RmxvYXRSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RmxvYXRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RG91YmxlIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0RG91YmxlUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RG91YmxlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXREb3VibGVSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RG91YmxlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJvb2wiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRCb29sUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0Qm9vbCIvPgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRCb29sUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEJvb2xSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVyaXZlZENsYXNzIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0RGVyaXZlZENsYXNzUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RGVyaXZlZENsYXNzIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXREZXJpdmVkQ2xhc3NSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RGVyaXZlZENsYXNzUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlY2ltYWwiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXREZWNpbWFsUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0RGVjaW1hbCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0RGVjaW1hbFJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXREZWNpbWFsUmVzcG9uc2UiLz4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bVN0cmluZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEVudW1TdHJpbmdSZXF1ZXN0TWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRFbnVtU3RyaW5nIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRFbnVtU3RyaW5nUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEVudW1TdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0UzEiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRTdHJ1Y3RTMVJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cnVjdFMxIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9Im5zMTpyZXRTdHJ1Y3RTMVJlc3BvbnNlTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpyZXRTdHJ1Y3RTMVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEludCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldEludFJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEludCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0SW50UmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldEludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRDaGFyIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0Q2hhclJlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldENoYXIiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldENoYXJSZXNwb25zZU1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0Q2hhclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJpbmciPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFN0cmluZ1JlcXVlc3RNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cmluZyIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJuczE6cmV0U3RyaW5nUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFN0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVTG9uZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFVMb25nUmVxdWVzdE1lc3NhZ2UiIHdzYXc6QWN0aW9uPSJ1cm46cmV0VUxvbmciLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0ibnMxOnJldFVMb25nUmVzcG9uc2VNZXNzYWdlIiB3c2F3OkFjdGlvbj0idXJuOnJldFVMb25nUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVNPQVAxMUJpbmRpbmciIHR5cGU9Im5zMTpDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVBvcnRUeXBlIj4KLQotICAgICAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0FTIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U05TQVMiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U2luZ2xlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U2luZ2xlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5U3RyaW5nMkQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheVN0cmluZzJEIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5QW55VHlwZTFEIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlBbnlUeXBlMUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50cyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEludHMiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREYXRlVGltZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTlNBIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U05TQSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRHdWlkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0R3VpZCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlQXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCeXRlQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VXJpIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0VXJpIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFFOYW1lIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0UU5hbWUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXkxRFNOIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXkxRFNOIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZ3MiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTdHJpbmdzIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEVudW1JbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRFbnVtSW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldExvbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRMb25nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVTaG9ydCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFVTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheVN0cmluZzFEIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheUludDFEIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlJbnQxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheURhdGVUaW1lMUQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheURhdGVUaW1lMUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUludCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFVJbnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlEZWNpbWFsMUQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRBcnJheURlY2ltYWwxRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCeXRlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0Qnl0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNCeXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U2hvcnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0U04iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTdHJ1Y3RTTiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRPYmplY3QiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRPYmplY3QiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RmxvYXQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRGbG9hdCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREb3VibGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREb3VibGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qm9vbCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEJvb2wiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVyaXZlZENsYXNzIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RGVyaXZlZENsYXNzIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlY2ltYWwiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXREZWNpbWFsIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEVudW1TdHJpbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRFbnVtU3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFMxIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0UzEiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0SW50Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0SW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldENoYXIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRDaGFyIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cmluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVTG9uZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFVMb25nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU09BUDEyQmluZGluZyIgdHlwZT0ibnMxOkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlUG9ydFR5cGUiPgotICAgICAgICA8c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0U05TQVMiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cnVjdFNOU0FTIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaW5nbGUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNpbmdsZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlTdHJpbmcyRCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlTdHJpbmcyRCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlBbnlUeXBlMUQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5QW55VHlwZTFEIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnRzIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRJbnRzIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREYXRlVGltZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RGF0ZVRpbWUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0EiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cnVjdFNOU0EiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEd1aWQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEd1aWQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0Qnl0ZUFycmF5IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFVyaSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0UU5hbWUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFFOYW1lIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheTFEU04iPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5MURTTiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RyaW5ncyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RyaW5ncyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bUludCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RW51bUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0TG9uZyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0TG9uZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VVNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVU2hvcnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5U3RyaW5nMUQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5U3RyaW5nMUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5SW50MUQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEFycmF5SW50MUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5RGF0ZVRpbWUxRCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlEYXRlVGltZTFEIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVSW50Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVSW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheURlY2ltYWwxRCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0QXJyYXlEZWNpbWFsMUQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEJ5dGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNCeXRlIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTQnl0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U2hvcnQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFNob3J0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTiI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0U3RydWN0U04iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldE9iamVjdCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0T2JqZWN0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRGbG9hdCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RmxvYXQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERvdWJsZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RG91YmxlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRCb29sIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRCb29sIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXREZXJpdmVkQ2xhc3MiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldERlcml2ZWRDbGFzcyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVjaW1hbCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RGVjaW1hbCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bVN0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0RW51bVN0cmluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0UzEiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldFN0cnVjdFMxIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnJldEludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cmV0Q2hhciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRTdHJpbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVMb25nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpyZXRVTG9uZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVIdHRwQmluZGluZyIgdHlwZT0ibnMxOkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlUG9ydFR5cGUiPgotICAgICAgICA8aHR0cDpiaW5kaW5nIHZlcmI9IlBPU1QiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cnVjdFNOU0FTIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0U3RydWN0U05TQVMiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0U05TQVMiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJ1Y3RTTlNBUyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFNpbmdsZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFNpbmdsZSIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTaW5nbGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTaW5nbGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheVN0cmluZzJEIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0QXJyYXlTdHJpbmcyRCIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheVN0cmluZzJEIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlTdHJpbmcyRCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5QW55VHlwZTFEIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0QXJyYXlBbnlUeXBlMUQiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlBbnlUeXBlMUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheUFueVR5cGUxRCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEludHMiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRJbnRzIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEludHMiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRJbnRzIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGF0ZVRpbWUiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXREYXRlVGltZSIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREYXRlVGltZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0U3RydWN0U05TQSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFN0cnVjdFNOU0EiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0U05TQSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cnVjdFNOU0EiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRHdWlkIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0R3VpZCIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRHdWlkIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0R3VpZCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJ5dGVBcnJheSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldEJ5dGVBcnJheSIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCeXRlQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRVcmkiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRVcmkiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VXJpIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0VXJpIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0UU5hbWUiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRRTmFtZSIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRRTmFtZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFFOYW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXkxRFNOIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0QXJyYXkxRFNOIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5MURTTiIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5MURTTiIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFN0cmluZ3MiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRTdHJpbmdzIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cmluZ3MiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRTdHJpbmdzIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bUludCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldEVudW1JbnQiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RW51bUludCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEVudW1JbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRMb25nIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0TG9uZyIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRMb25nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0TG9uZyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVTaG9ydCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFVTaG9ydCIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRVU2hvcnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRVU2hvcnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRBcnJheVN0cmluZzFEIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0QXJyYXlTdHJpbmcxRCIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheVN0cmluZzFEIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0QXJyYXlTdHJpbmcxRCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEFycmF5SW50MUQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRBcnJheUludDFEIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5SW50MUQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheUludDFEIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlEYXRlVGltZTFEIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0QXJyYXlEYXRlVGltZTFEIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5RGF0ZVRpbWUxRCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5RGF0ZVRpbWUxRCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldFVJbnQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRVSW50Ii8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRVSW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0QXJyYXlEZWNpbWFsMUQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRBcnJheURlY2ltYWwxRCIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRBcnJheURlY2ltYWwxRCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEFycmF5RGVjaW1hbDFEIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Qnl0ZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldEJ5dGUiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0Qnl0ZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEJ5dGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTQnl0ZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFNCeXRlIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFNCeXRlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U0J5dGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTaG9ydCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFNob3J0Ii8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFNob3J0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U2hvcnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTTiI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFN0cnVjdFNOIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cnVjdFNOIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0U04iLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRPYmplY3QiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRPYmplY3QiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0T2JqZWN0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RmxvYXQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRGbG9hdCIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRGbG9hdCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RG91YmxlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0RG91YmxlIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERvdWJsZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERvdWJsZSIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldEJvb2wiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRCb29sIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEJvb2wiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRCb29sIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RGVyaXZlZENsYXNzIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUvcmV0RGVyaXZlZENsYXNzIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERlcml2ZWRDbGFzcyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERlcml2ZWRDbGFzcyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJldERlY2ltYWwiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXREZWNpbWFsIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldERlY2ltYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXREZWNpbWFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0RW51bVN0cmluZyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldEVudW1TdHJpbmciLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0RW51bVN0cmluZyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldEVudW1TdHJpbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJ1Y3RTMSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldFN0cnVjdFMxIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFN0cnVjdFMxIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RydWN0UzEiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRJbnQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRJbnQiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0SW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0SW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0Q2hhciI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlL3JldENoYXIiLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0Q2hhciIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldENoYXIiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJyZXRTdHJpbmciPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRTdHJpbmciLz4KLQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0icmV0U3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icmV0VUxvbmciPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZS9yZXRVTG9uZyIvPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJyZXRVTG9uZyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InJldFVMb25nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUiPgotCi0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTT0FQMTFwb3J0X2h0dHAiIGJpbmRpbmc9Im5zMTpDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVNPQVAxMUJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEwLjEwMC4xLjEzMjo4MDgwL2F4aXMyL3NlcnZpY2VzL0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU09BUDEycG9ydF9odHRwIiBiaW5kaW5nPSJuczE6Q29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTT0FQMTJCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEwLjEwMC4xLjEzMjo4MDgwL2F4aXMyL3NlcnZpY2VzL0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlSHR0cHBvcnQiIGJpbmRpbmc9Im5zMTpDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZUh0dHBCaW5kaW5nIj4KLSAgICAgICAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly8xMC4xMDAuMS4xMzI6ODA4MC9heGlzMi9zZXJ2aWNlcy9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZSIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLQotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0ludmFsaWQud3NkbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL0ludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5OTU5NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9JbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczptaD0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZSIKLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZSIKLSAgICAgICAgICAgICBuYW1lPSJCb29rUXVvdGUiPgotICAgIDxtZXNzYWdlIG5hbWU9IkJvb2tRdW90ZV9nZXRCb29rUHJpY2UiPgotICAgICAgICA8cGFydCBuYW1lPSJpc2JuIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICA8cGFydCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iQm9va1F1b3RlX2dldEJvb2tQcmljZVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJJbnZhbGlkSXNibkZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IkJvb2tRdW90ZSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkludmFsaWRJc2JuRmF1bHQiIG1lc3NhZ2U9Im1oOkludmFsaWRJc2JuRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlTm9uUm9idXN0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IkJvb2tRdW90ZUJpbmRpbmciIHR5cGU9Im1oOkJvb2tRdW90ZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIKLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ibXlBY3Rpb24iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRCb29rUHJpY2VOb25Sb2J1c3QiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Im15QWN0aW9uMiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IkJvb2tRdW90ZVNlcnZpY2UiPgotICAgICAgICA8cG9ydCBuYW1lPSJCb29rUXVvdGVQb3J0IiBiaW5kaW5nPSJtaDpCb29rUXVvdGVCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGVTZXJ2aWNlIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlcVQyNC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVxVDI0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMDdmNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVxVDI0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3dyb25nLXZlcnNpb24vIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWI3YTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIGZvbwotICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSA8L2VudjpIZWFkZXI+Ci0gPGVudjpCb2R5PgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTAueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjgxNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gICAgPGVudjpCb2R5PgotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTEueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjgxNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gICAgPGVudjpCb2R5PgotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTIueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDUzMTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDxlbnY6Tm90VW5kZXJzdG9vZCBxbmFtZT0idGVzdDpVbmtub3duIgotICAgICAgIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgLz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gICAgPGVudjpGYXVsdD4KLSAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6TXVzdFVuZGVyc3RhbmQ8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+IEhlYWRlciBub3QgdW5kZXJzdG9vZCA8L2VudjpUZXh0PgotICAgICAgPC9lbnY6UmVhc29uPgotICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDEzLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEwZjhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8ZW52Ok5vdFVuZGVyc3Rvb2QgcW5hbWU9InRlc3Q6VW5rbm93biIKLSAgICAgICB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIC8+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIDxlbnY6VmFsdWU+ZW52Ok11c3RVbmRlcnN0YW5kPC9lbnY6VmFsdWU+Ci0gICAgICA8L2VudjpDb2RlPgotICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPgotICAgICAgICAgIEhlYWRlciBub3QgdW5kZXJzdG9vZAotICAgICAgICA8L2VudjpUZXh0PgotICAgICAgPC9lbnY6UmVhc29uPgotICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGIwMzZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gICAgPGVudjpGYXVsdD4KLSAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgPC9lbnY6Q29kZT4KLSAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+Ci0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kIHZhbHVlIGlzIG5vdCBib29sZWFuCi0gICAgICAgIDwvZW52OlRleHQ+Ci0gICAgICAgPC9lbnY6UmVhc29uPgotICAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxNS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyODE3NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgICA8ZW52OkJvZHk+Ci0gICAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxNi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFkNTMxMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPGVudjpOb3RVbmRlcnN0b29kIHFuYW1lPSJ0ZXN0OlVua25vd24iCi0gICAgICAgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAvPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvZW52OlZhbHVlPgotICAgICAgPC9lbnY6Q29kZT4KLSAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4gSGVhZGVyIG5vdCB1bmRlcnN0b29kIDwvZW52OlRleHQ+Ci0gICAgICA8L2VudjpSZWFzb24+Ci0gICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTdfQi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE3X0IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjgxM2FlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTdfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDxlbnY6Tm90VW5kZXJzdG9vZCBxbmFtZT0idGVzdDpVbmtub3duIgotICAgICAgIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIvPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvZW52OlZhbHVlPgotICAgICAgPC9lbnY6Q29kZT4KLSAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4gSGVhZGVyIG5vdCB1bmRlcnN0b29kIDwvZW52OlRleHQ+Ci0gICAgICA8L2VudjpSZWFzb24+Ci0gICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE4X0MueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QxOF9DLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxZWViYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE4X0MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICAgIDxlbnY6SGVhZGVyPgotICAgIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDE5LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMTkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmViN2EyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gPGVudjpIZWFkZXI+Ci0gIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICBmb28KLSAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gPC9lbnY6SGVhZGVyPgotIDxlbnY6Qm9keT4KLSA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIxX0IueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMV9CLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzMjQyYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIxX0IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8ZW52Ok5vdFVuZGVyc3Rvb2QgcW5hbWU9InRlc3Q6VW5rbm93biIgCi0gICAgICAgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAvPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvZW52OlZhbHVlPgotICAgICAgPC9lbnY6Q29kZT4KLSAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4gSGVhZGVyIG5vdCB1bmRlcnN0b29kIDwvZW52OlRleHQ+Ci0gICAgICA8L2VudjpSZWFzb24+Ci0gICAgICA8ZW52Ok5vZGU+aHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0I8L2VudjpOb2RlPgotICAgICAgPGVudjpSb2xlPmh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CPC9lbnY6Um9sZT4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMjIueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTBhYWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDpyZXNwb25zZU9rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyMy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiMDM2Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDIzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIDxlbnY6VmFsdWU+ZW52OlNlbmRlcjwvZW52OlZhbHVlPgotICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZCB2YWx1ZSBpcyBub3QgYm9vbGVhbgotICAgICAgICA8L2VudjpUZXh0PgotICAgICAgIDwvZW52OlJlYXNvbj4KLSAgICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMjQueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDQ1ZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpWZXJzaW9uTWlzbWF0Y2g8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+IFdyb25nIFZlcnNpb24gPC9lbnY6VGV4dD4KLSAgICAgIDwvZW52OlJlYXNvbj4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhMzFjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgICA8ZW52OkZhdWx0PgotICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgPC9lbnY6Q29kZT4KLSAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+Ci0gICAgICAgICAgRFREIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFNPQVAgMS4yCi0gICAgICAgIDwvZW52OlRleHQ+Ci0gICAgICAgPC9lbnY6UmVhc29uPgotICAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyNi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQzOTJiZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDI2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMjkueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzQzMGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QyOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmU4ZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMwLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMyNTY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPGVudjpVcGdyYWRlPgotICAgICAgPGVudjpTdXBwb3J0ZWRFbnZlbG9wZSBxbmFtZT0ibnMyOkVudmVsb3BlIgotICAgICAgICAgICAgICAgIHhtbG5zOm5zMj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIi8+Ci0gICAgIDwvZW52OlVwZ3JhZGU+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZmF1bHRjb2RlPmVudjpWZXJzaW9uTWlzbWF0Y2g8L2ZhdWx0Y29kZT4KLSAgICAgIDxmYXVsdHN0cmluZz5Xcm9uZyBWZXJzaW9uPC9mYXVsdHN0cmluZz4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzMS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmZDkzNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OnJldHVyblZvaWRSZXNwb25zZSB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIDwvdGVzdDpyZXR1cm5Wb2lkUmVzcG9uc2U+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0MjFiYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9IZWFkZXJSZXNwb25zZSB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9IZWFkZXJSZXNwb25zZT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzMy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzMDhjZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDMzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICAgICA8ZW52OkZhdWx0PgotICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgIDxlbnY6VmFsdWU+ZW52OlNlbmRlcjwvZW52OlZhbHVlPgotICAgICAgICAgPGVudjpTdWJjb2RlPgotICAgICAgICAgICA8ZW52OlZhbHVlPnJwYzpQcm9jZWR1cmVOb3RQcmVzZW50PC9lbnY6VmFsdWU+Ci0gICAgICAgICA8L2VudjpTdWJjb2RlPgotICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPiBQcm9jZWR1cmUgTm90IFByZXNlbnQgPC9lbnY6VGV4dD4KLSAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzUueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDUzMTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDxlbnY6Tm90VW5kZXJzdG9vZCBxbmFtZT0idGVzdDpVbmtub3duIgotICAgICAgIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgLz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gICAgPGVudjpGYXVsdD4KLSAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgPGVudjpWYWx1ZT5lbnY6TXVzdFVuZGVyc3RhbmQ8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+IEhlYWRlciBub3QgdW5kZXJzdG9vZCA8L2VudjpUZXh0PgotICAgICAgPC9lbnY6UmVhc29uPgotICAgIDwvZW52OkZhdWx0PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM2LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWQ1MzExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8ZW52Ok5vdFVuZGVyc3Rvb2QgcW5hbWU9InRlc3Q6VW5rbm93biIKLSAgICAgICB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIC8+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDxlbnY6RmF1bHQ+Ci0gICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIDxlbnY6VmFsdWU+ZW52Ok11c3RVbmRlcnN0YW5kPC9lbnY6VmFsdWU+Ci0gICAgICA8L2VudjpDb2RlPgotICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPiBIZWFkZXIgbm90IHVuZGVyc3Rvb2QgPC9lbnY6VGV4dD4KLSAgICAgIDwvZW52OlJlYXNvbj4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzNy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzNDMwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM4XzEueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzOF8xLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyZThlNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM4XzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpyZXNwb25zZU9rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzhfMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDM4XzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTExNGY1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzhfMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGJhcgotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUMzkueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjQwMmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1QzOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8ZW52OkZhdWx0PgotICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAgIDwvZW52OkNvZGU+Ci0gICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbi1VUyI+Ci0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kIGlzIGEgeHNkOmJvb2xlYW4KLSAgICAgICAgPC9lbnY6VGV4dD4KLSAgICAgIDwvZW52OlJlYXNvbj4KLSAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmU4ZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDQwLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNDAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNDAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0MzBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ml9DLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjJfQy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWJjMjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ml9DLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgU3RyaW5nQVN0cmluZ0IKLSAgICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjMueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjViOTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnZhbGlkYXRlQ291bnRyeUNvZGVGYXVsdCB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgQ291bnRyeSBjb2RlIG11c3QgYmUgMiBsZXR0ZXJzLgotICAgIDwvdGVzdDp2YWxpZGF0ZUNvdW50cnlDb2RlRmF1bHQ+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgICA8ZW52OkZhdWx0PgotICAgICAgIDxlbnY6Q29kZT5lbnY6U2VuZGVyPC9lbnY6Q29kZT4KLSAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4tVVMiPgotICAgICAgICAgICBOb3QgYSB2YWxpZCBjb3VudHJ5IGNvZGUKLSAgICAgICAgIDwvZW52OlRleHQ+Ci0gICAgICAgPC9lbnY6UmVhc29uPgotICAgICA8L2VudjpGYXVsdD4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ni54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNzg2MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY2LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2Ny54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwNzg2MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q2OC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyZThlNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OnJlc3BvbnNlT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDY5LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYxMTY2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNjkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gICAgIDxlbnY6RmF1bHQ+Ci0gICAgICAgPGVudjpDb2RlPgotICAgICAgICA8ZW52OlZhbHVlPmVudjpTZW5kZXI8L2VudjpWYWx1ZT4KLSAgICAgICA8L2VudjpDb2RlPgotICAgICAgIDxlbnY6UmVhc29uPgotICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj4KLSAgICAgICAgICBlbnY6Qm9keSBtdXN0IGJlIHByZXNlbnQgaW4gYSBTT0FQIDEuMiBlbnZlbG9wZQotICAgICAgICA8L2VudjpUZXh0PgotICAgICAgIDwvZW52OlJlYXNvbj4KLSAgICAgPC9lbnY6RmF1bHQ+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy9TT0FQMTJSZXNUNzQueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q3NC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMmU4ZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q3NC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OnJlc3BvbnNlT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpyZXNwb25zZU9rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXBseU1lc3NhZ2VzL1NPQVAxMlJlc1Q3OC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDc4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlYjdhMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvU09BUDEyUmVzVDc4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6cmVzcG9uc2VPayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIGZvbwotICA8L3Rlc3Q6cmVzcG9uc2VPaz4KLSA8L2VudjpIZWFkZXI+Ci0gPGVudjpCb2R5PgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy90ZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVwbHlNZXNzYWdlcy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMjBkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcGx5TWVzc2FnZXMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPjwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPHNvYXBlbnY6RmF1bHQ+Ci0gICAgICAgICAgICA8c29hcGVudjpOb2RlPjwvc29hcGVudjpOb2RlPgotICAgICAgICAgICAgPHNvYXBlbnY6Um9sZT48L3NvYXBlbnY6Um9sZT4KLSAgICAgICAgICAgIDxzb2FwZW52OkRldGFpbD4KLSAgICAgICAgICAgICAgICA8c29hcGVudjpFeGNlcHRpb24+b3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ6IEludGVudGlvbmFsIEZhaWx1cmUgZnJvbSBTT0FQIDEuMiB0ZXN0aW5nIC4uLjsgbmVzdGVkIGV4Y2VwdGlvbiBpczpvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDogSW50ZW50aW9uYWwgRmFpbHVyZSBmcm9tIFNPQVAgMS4yIHRlc3RpbmcgLi4uYXQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZS5oYW5kbGVGYXVsdChBeGlzRW5naW5lLmphdmE6MTg2KWF0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmUucmVjZWl2ZShBeGlzRW5naW5lLmphdmE6MTI3KWF0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUFRyYW5zcG9ydFV0aWxzLnByb2Nlc3NIVFRQUG9zdFJlcXVlc3QoSFRUUFRyYW5zcG9ydFV0aWxzLmphdmE6MTAyKWF0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUFdvcmtlci5kb1dvcmsoSFRUUFdvcmtlci5qYXZhOjExMClhdCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbC5UaHJlYWRXb3JrZXIucnVuKFRocmVhZFdvcmtlci5qYXZhOjM0KUNhdXNlZCBieTogb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ6IEludGVudGlvbmFsIEZhaWx1cmUgZnJvbSBTT0FQIDEuMiB0ZXN0aW5nIC4uLmF0IG9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVycy5TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEMuaW52b2tlKFNPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0Qy5qYXZhOjEyMClhdCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZS5pbnZva2UoUGhhc2UuamF2YToxNjEpYXQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZS5pbnZva2VQaGFzZXMoQXhpc0VuZ2luZS5qYXZhOjI1MilhdCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lLnJlY2VpdmUoQXhpc0VuZ2luZS5qYXZhOjExOCkuLi4gMyBtb3JlPC9zb2FwZW52OkV4Y2VwdGlvbj4KLSAgICAgICAgICAgIDwvc29hcGVudjpEZXRhaWw+Ci0gICAgICAgICAgICA8c29hcGVudjpDb2RlPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlZhbHVlPmVudjpNdXN0VW5kZXJzdGFuZDwvc29hcGVudjpWYWx1ZT4KLSAgICAgICAgICAgIDwvc29hcGVudjpDb2RlPgotICAgICAgICAgICAgPHNvYXBlbnY6UmVhc29uPgotICAgICAgICAgICAgICAgIDxzb2FwZW52OlRleHQgeG1sOmxhbmc9ImVuLVVTIj5IZWFkZXIgbm90IHVuZGVyc3Rvb2Q8L3NvYXBlbnY6VGV4dD4KLSAgICAgICAgICAgIDwvc29hcGVudjpSZWFzb24+Ci0gICAgICAgIDwvc29hcGVudjpGYXVsdD4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYWRkZWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0Ij4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEwLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTYwMDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMzNWNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iZmFsc2UiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEyLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTJiNmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTMueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDEzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyN2FiOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9InRydWUiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOWE2YTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9Indyb25nIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE1LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTViNzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTYueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZGNiNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0MiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxN19BLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxN19BLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5ZWI2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTdfQS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMThfQS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMThfQS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTI2ZjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE4X0EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9ub25lIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE4X0IueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDE4X0IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmEyNmY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxOF9CLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbm9uZSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxOS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMTkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjZkODVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQxOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25vbmUiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSJ0cnVlIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTAwY2E4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0MiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjAueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0NDg2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQiI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6VW5rbm93bj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIxX0EueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDIxX0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ0ODY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMV9BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDg2MWRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZCA9ICIxIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM4YTI2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIiAKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSJ3cm9uZyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyNC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmQ2ZGMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93cm9uZy12ZXJzaW9uLyI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjUueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNjc4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBlbnY6RW52ZWxvcGUgU1lTVEVNICJlbnYuZHRkIltdPgotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+IAotICA8ZW52OkJvZHk+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjYueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiZDAzZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMjYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotPD94bWwtc3R5bGVzaGVldCBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvc3ViLnhzbCIgdHlwZSA9ICJ0ZXh0L3hzbCI/PgotICA8ZW52OkJvZHk+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI5LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQyOS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2FhNmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDI5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0N6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enoiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMDE1YzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMwLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGUwMGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzEueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4NTNjYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gICAgPHRlc3Q6cmV0dXJuVm9pZCB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgIDwvdGVzdDpyZXR1cm5Wb2lkPgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMyLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTcyNGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6cmVxdWlyZWRIZWFkZXIgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0idHJ1ZSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6cmVxdWlyZWRIZWFkZXI+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICAgIDx0ZXN0OmVjaG9IZWFkZXIgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICA8L3Rlc3Q6ZWNob0hlYWRlcj4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMy54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA5NTY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6Qm9keT4KLSAgICA8dGVzdDpEb2VzTm90RXhpc3QgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgPC90ZXN0OkRvZXNOb3RFeGlzdD4KLSA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOGIxOTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiIAotICAgICAgICAgIHhtbG5zOmVudjE9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICAgIGVudjE6bXVzdFVuZGVyc3RhbmQ9InRydWUiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM1LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTAwZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQxMDY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSIgCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM3LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MWJlOGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzEueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q5YzQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzOF8xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6VW5rbm93biB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSJmYWxzZSIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzIueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM4XzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTYzZjgzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQzOF8yLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9InRydWUiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGJhcgotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzkueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDM5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5YzIxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUMzkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDpVbmtub3duIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjkiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDQueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdlZDY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ0MC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNDAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJiMjA2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ0MC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL1tGRURDOkJBOTg6NzY1NDozMjEwOkZFREM6QkE5ODo3NjU0OjMyMTBdL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS91bHRpbWF0ZVJlY2VpdmVyIiAKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9ImZhbHNlIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDpVbmtub3duPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ1LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3MmRlZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDYyX0EueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDYyX0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGNiNDA0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2Ml9BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6Y29uY2F0QW5kRm9yd2FyZEVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSIvPgotICAgIDx0ZXN0OmNvbmNhdEFuZEZvcndhcmRFY2hvT2tBcmcxIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIFN0cmluZ0EKLSAgICA8L3Rlc3Q6Y29uY2F0QW5kRm9yd2FyZEVjaG9Pa0FyZzE+Ci0gICAgPHRlc3Q6Y29uY2F0QW5kRm9yd2FyZEVjaG9Pa0FyZzIgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQiIKLSAgICAgICAgICBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPgotICAgICAgU3RyaW5nQgotICAgIDwvdGVzdDpjb25jYXRBbmRGb3J3YXJkRWNob09rQXJnMj4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2Ml9CLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2Ml9CLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3YTNhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjJfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIgotICAgICAgICAgIGVudjptdXN0VW5kZXJzdGFuZD0iMSI+Ci0gICAgICBTdHJpbmdBU3RyaW5nQgotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjMueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDYzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzMzUxZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDp2YWxpZGF0ZUNvdW50cnlDb2RlIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0MiCi0gICAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICAgIEFCQ0QKLSAgICA8L3Rlc3Q6dmFsaWRhdGVDb3VudHJ5Q29kZT4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KLQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjYueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDY2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlMGMyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGOCc/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0Ij4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjcueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDY3LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZjM1ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBzdGFuZGFsb25lPSd5ZXMnPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiPgotICAgIGZvbwotICA8L3Rlc3Q6ZWNob09rPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2OC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY2ZmZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2OC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotCi0KLSA8ZW52OkhlYWRlciAgICAgICAgICAgPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgIGVudjpyb2xlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IiAgPgotICAgIGZvbwotICA8L3Rlc3Q6ZWNob09rPgotCi0KLSA8L2VudjpIZWFkZXI+Ci0gPGVudjpCb2R5PgotCi0KLSA8L2VudjpCb2R5PgotCi0KLQotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjkueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDY5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0YWY3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNjkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotIDxlbnY6SGVhZGVyPgotCTx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPmZvbzwvdGVzdDplY2hvT2s+Ci0gPC9lbnY6SGVhZGVyPgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNl9BLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2X0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTAwY2E4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2X0EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICAgIGVudjpyb2xlPSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMvQyI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ2X0IueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDZfQi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDBjYTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDZfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9DIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3NC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NTYzNWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICAgIDx0ZXN0OlVua25vd24geG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIDx0ZXN0OnJhaXNlRmF1bHQgZW52Om11c3RVbmRlcnN0YW5kPSIxIgotICAgICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25leHQiPgotICAgICAgPC90ZXN0OnJhaXNlRmF1bHQ+Ci0gICAgPC90ZXN0OlVua25vd24+Ci0gIDwvZW52OkhlYWRlcj4KLSAgPGVudjpCb2R5PgotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNzUueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQzMjM4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUNzUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotIDxlbnY6SGVhZGVyPgotICA8dGVzdDplY2hvUmVzb2x2ZWRSZWYgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIgotICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbmV4dCIKLSAgICAgICAgZW52Om11c3RVbmRlcnN0YW5kPSIxIj4KLSAgICA8dGVzdDpSZWxhdGl2ZVJlZmVyZW5jZSB4bWw6YmFzZT0iaHR0cDovL2V4YW1wbGUub3JnL3RvZGF5LyIKLSAgICAgICAgICB4bGluazpocmVmPSJuZXcueG1sIgotICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiAvPgotICA8L3Rlc3Q6ZWNob1Jlc29sdmVkUmVmPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc4LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3OC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmY2M2ZWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDc4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSA8ZW52OkhlYWRlcj4KLSAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgIGZvbwotICA8L3Rlc3Q6ZWNob09rPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDdfQS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUN19BLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZjZlYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUN19BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6SWdub3JlIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzL0IiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUN19CLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3X0IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJkYzgxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ3X0IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUOF9BLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ4X0EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg0ODkzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ4X0EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPgotICA8ZW52OkhlYWRlcj4KLSAgICA8dGVzdDplY2hvT2sgeG1sbnM6dGVzdD0iaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gICAgPHRlc3Q6SWdub3JlIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIgCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cy9CIj4KLSAgICAgIGZvbwotICAgIDwvdGVzdDplY2hvT2s+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvbm9uZSI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ4X0IueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDhfQi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjI4NjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDhfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4gIAotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL25vbmUiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+IAotICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDlfQS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUOV9BLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA3ZWQ2NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1JlcXVlc3RNZXNzYWdlcy9TT0FQMTJSZXFUOV9BLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLSAgPGVudjpIZWFkZXI+Ci0gICAgPHRlc3Q6ZWNob09rIHhtbG5zOnRlc3Q9Imh0dHA6Ly9leGFtcGxlLm9yZy90cy10ZXN0cyIKLSAgICAgICAgICBlbnY6cm9sZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUvdWx0aW1hdGVSZWNlaXZlciI+Ci0gICAgICBmb28KLSAgICA8L3Rlc3Q6ZWNob09rPgotICA8L2VudjpIZWFkZXI+Ci0gIDxlbnY6Qm9keT4KLSAgPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvUmVxdWVzdE1lc3NhZ2VzL1NPQVAxMlJlcVQ5X0IueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDlfQi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2VkNjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9SZXF1ZXN0TWVzc2FnZXMvU09BUDEyUmVxVDlfQi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+Ci0gIDxlbnY6SGVhZGVyPgotICAgIDx0ZXN0OmVjaG9PayB4bWxuczp0ZXN0PSJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiCi0gICAgICAgICAgZW52OnJvbGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiPgotICAgICAgZm9vCi0gICAgPC90ZXN0OmVjaG9Paz4KLSAgPC9lbnY6SGVhZGVyPgotICA8ZW52OkJvZHk+Ci0gIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL01FVEEtSU5GL21vZHVsZS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjFjZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9IlNPQVAxMlRlc3RNb2R1bGVCIj4KLSAgICA8SW5GbG93PgotCTxoYW5kbGVyIG5hbWU9IlNPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0QiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVycy5TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEIiPgotCSAgICA8b3JkZXIgcGhhc2U9InVzZXJwaGFzZTEiIC8+Ci0JPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVycy5TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJ1c2VycGhhc2UxIiAvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODRiZWM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iamFyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkfS9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgbG9jYXRpb249IiR7YnVpbGR9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiIGxvY2F0aW9uPSJsaWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdCIgbG9jYXRpb249Ii4uLy4uLy4uLyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiBsb2NhdGlvbj0iJHtyb290fS90YXJnZXQvUmVwb3NpdG9yeS9tb2R1bGVzLyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke21hdmVuLmNsYXNzLnBhdGh9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdE1vZHVsZUIuamFyIiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqIi8+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iamFycy51cHRvZGF0ZSIgdGFyZ2V0ZmlsZT0iJHtqYXIuZGlyfS9TT0FQMTJUZXN0TW9kdWxlQi5qYXIiPgotICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YnVpbGR9LyoqIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0aGUgZmlsZXMgYXJlIHVwIHRvIGRhdGUgPSAke2phcnMudXB0b2RhdGV9Ij48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL0hlYWRlckNvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvSGVhZGVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2RiMDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvSGVhZGVyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVyczsKLQotcHVibGljIGludGVyZmFjZSBIZWFkZXJDb25zdGFudHMgewotCi0gICAgU3RyaW5nIFJFUVVFU1RfSEVBREVSQkxPQ0tfTkFNRSA9ICJlY2hvT2siOwotICAgIFN0cmluZyBSRVNQT05TRV9IRUFERVJCTE9DS19OQU1FID0gInJlc3BvbnNlT2siOwotICAgIFN0cmluZyBTQU1QTEVfUk9MRSA9ICJodHRwOi8vZXhhbXBsZS5vcmcvdHMtdGVzdHMiOwotICAgIFN0cmluZyBTT0FQMTJfUk9MRSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZSI7Ci0gICAgU3RyaW5nIFVMVElNQVRFUkVDRUlWRVJfUk9MRSA9ICJ1bHRpbWF0ZVJlY2VpdmVyIjsKLSAgICBTdHJpbmcgTkVYVF9ST0xFID0gIm5leHQiOwotICAgIFN0cmluZyBOT05FX1JPTEUgPSAibm9uZSI7Ci0gICAgU3RyaW5nIFJPTEVfQllfQiA9ICJCIjsKLSAgICBTdHJpbmcgUk9MRV9CWV9DID0gIkMiOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRCLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MGIyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc29hcDEydGVzdGluZy5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHROb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSZWFzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRCIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGVhZGVyQ29uc3RhbnRzIHsKLSAgICBwcml2YXRlIE9NTmFtZXNwYWNlIGF0dHJpYnV0ZU5TOwotICAgIHByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVQcmVzZW50ID0gZmFsc2U7Ci0gICAgSW50ZWdlciBoZWFkZXJCbG9ja1ByZXNlbnQgPSBuZXcgSW50ZWdlcigwKTsKLQotICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jazsKLQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gZmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKGVudmVsb3BlKTsKLSAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gaGVhZGVyQmxvY2suZ2V0QWxsQXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGZpcnN0QXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTlMgPSBmaXJzdEF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVWYWx1ZSA9IGhlYWRlckJsb2NrLmdldFJvbGUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG11c3RVbmRlcnN0YW5kID0gaGVhZGVyQmxvY2suZ2V0TXVzdFVuZGVyc3RhbmQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBoZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBoZWFkZXJCbG9ja05hbWVzcGFjZSA9IGhlYWRlckJsb2NrLmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVRVNUX0hFQURFUkJMT0NLX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlVmFsdWUgPT0gbnVsbCB8fCByb2xlVmFsdWUuZXF1YWxzKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9CKSB8fCByb2xlVmFsdWUuZXF1YWxzKFNPQVAxMl9ST0xFICsgIi8iICsgVUxUSU1BVEVSRUNFSVZFUl9ST0xFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVWYWx1ZS5lcXVhbHMoU09BUDEyX1JPTEUgKyAiLyIgKyBORVhUX1JPTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRMb2NhbE5hbWUoUkVTUE9OU0VfSEVBREVSQkxPQ0tfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlc2VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5yZW1vdmVBdHRyaWJ1dGUoKE9NQXR0cmlidXRlKSBoZWFkZXJCbG9jay5nZXRBbGxBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoIkhFQURFUl9CTE9DS19QUkVTRU5UIiwgaGVhZGVyQmxvY2tQcmVzZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFkZC5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIiwgaGVhZGVyQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWYWx1ZSA9PSBudWxsIHx8IHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0IpIHx8IHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIFVMVElNQVRFUkVDRUlWRVJfUk9MRSkgfHwgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIE5FWFRfUk9MRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXN0VW5kZXJzdGFuZCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCkuZ2V0Qm9keSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVQcmVzZW50ICYmIGF0dHJpYnV0ZU5TLmdldE5hbWUoKSA9PSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdChib2R5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdENvZGUgY29kZSA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZShmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSB2YWx1ZSA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VmFsdWUoY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zZXRUZXh0KCJlbnY6TXVzdFVuZGVyc3RhbmQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiByZWFzb24gPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJlYXNvbihmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFRleHQocmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0TGFuZygiZW4tVVMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dCgiSGVhZGVyIG5vdCB1bmRlcnN0b29kIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24uYWRkU09BUFRleHQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZhdWx0LnNldFJlYXNvbihyZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWYWx1ZSAhPSBudWxsICYmIHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Tm9kZSBub2RlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHROb2RlKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnNldE5vZGVWYWx1ZShTQU1QTEVfUk9MRSArICIvIiArIFJPTEVfQllfQik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Um9sZSByb2xlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRSb2xlKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlLnNldFJvbGVWYWx1ZShTQU1QTEVfUk9MRSArICIvIiArIFJPTEVfQllfQik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9OT0RFX0xPQ0FMX05BTUUsIG5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfUk9MRV9MT0NBTF9OQU1FLCByb2xlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9DT0RFX0xPQ0FMX05BTUUsIGNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9SRUFTT05fTE9DQUxfTkFNRSwgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5kaXNjYXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBuZXdIZWFkZXJCbG9jayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJCbG9jayA9IGVudmVsb3BlLmdldEhlYWRlcigpLmFkZEhlYWRlckJsb2NrKCJOb3RVbmRlcnN0b29kIiwgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVyQmxvY2suZGVjbGFyZU5hbWVzcGFjZShoZWFkZXJCbG9ja05hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWFkZXJCbG9jay5hZGRBdHRyaWJ1dGUoInFuYW1lIiwgaGVhZGVyQmxvY2tOYW1lc3BhY2UuZ2V0TmFtZSgpICsgIjoiICsgZWxlbWVudE5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIsIGhlYWRlckJsb2NrUHJlc2VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFkZC5hZGRDaGlsZChuZXdIZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siLCBoZWFkZXJBZGQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkludGVudGlvbmFsIEZhaWx1cmUgZnJvbSBTT0FQIDEuMiB0ZXN0aW5nIC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoZWFkZXJCbG9ja1ByZXNlbnQuZXF1YWxzKG5ldyBJbnRlZ2VyKDApKSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLnNldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIsIGhlYWRlckJsb2NrUHJlc2VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZWFkZXJCbG9ja1ByZXNlbnQgPSBuZXcgSW50ZWdlcigwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDApOwotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoIkhFQURFUl9CTE9DS19QUkVTRU5UIiwgaGVhZGVyQmxvY2tQcmVzZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZhdWx0Rmxvd0hhbmRsZXJEZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2Y2NmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQi9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJPdXRGYXVsdEZsb3dIYW5kbGVyRGVmYXVsdCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIpOwotICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigxKSkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gKFNPQVBIZWFkZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siKTsKLSAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyQWRkLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaz0oU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuZGlzY2FyZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVlN2EyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVAxMk91dEZsb3dIYW5kbGVyRGVmYXVsdCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIpOwotICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigxKSkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gKFNPQVBIZWFkZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siKTsKLSAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyQWRkLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaz0oU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuZGlzY2FyZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9NRVRBLUlORi9tb2R1bGUueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc2MGM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJTT0FQMTJUZXN0TW9kdWxlQyI+Ci0gICAgPEluRmxvdz4KLQk8aGFuZGxlciBuYW1lPSJTT0FQMTJJbkZsb3dIYW5kbGVyRGVmYXVsdEMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnMuU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRDIj4KLQkgICAgPG9yZGVyIHBoYXNlPSJ1c2VycGhhc2UxIiAvPgotCTwvaGFuZGxlcj4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnMuU09BUDEyT3V0Rmxvd0hhbmRsZXJEZWZhdWx0Ij4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0idXNlcnBoYXNlMSIgLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1YWUyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L1JlcG9zaXRvcnkvbW9kdWxlcy8iLz4KLQotICAgIDxwYXRoIGlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHttYXZlbi5jbGFzcy5wYXRofSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZm9yaz0idHJ1ZSIgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L1NPQVAxMlRlc3RNb2R1bGVDLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdE1vZHVsZUMuamFyIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2J1aWxkfS8qKiIvPgotICAgICAgICAgICAgPC9zcmNmaWxlcz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0idGhlIGZpbGVzIGFyZSB1cCB0byBkYXRlID0gJHtqYXJzLnVwdG9kYXRlfSI+PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9IZWFkZXJDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL0hlYWRlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNkYjA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL0hlYWRlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSGVhZGVyQ29uc3RhbnRzIHsKLQotICAgIFN0cmluZyBSRVFVRVNUX0hFQURFUkJMT0NLX05BTUUgPSAiZWNob09rIjsKLSAgICBTdHJpbmcgUkVTUE9OU0VfSEVBREVSQkxPQ0tfTkFNRSA9ICJyZXNwb25zZU9rIjsKLSAgICBTdHJpbmcgU0FNUExFX1JPTEUgPSAiaHR0cDovL2V4YW1wbGUub3JnL3RzLXRlc3RzIjsKLSAgICBTdHJpbmcgU09BUDEyX1JPTEUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL3JvbGUiOwotICAgIFN0cmluZyBVTFRJTUFURVJFQ0VJVkVSX1JPTEUgPSAidWx0aW1hdGVSZWNlaXZlciI7Ci0gICAgU3RyaW5nIE5FWFRfUk9MRSA9ICJuZXh0IjsKLSAgICBTdHJpbmcgTk9ORV9ST0xFID0gIm5vbmUiOwotICAgIFN0cmluZyBST0xFX0JZX0IgPSAiQiI7Ci0gICAgU3RyaW5nIFJPTEVfQllfQyA9ICJDIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0Qy5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRDLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTZhMDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEySW5GbG93SGFuZGxlckRlZmF1bHRDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAxMnRlc3RpbmcuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRUZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRWYWx1ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVAxMkluRmxvd0hhbmRsZXJEZWZhdWx0QyBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhlYWRlckNvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBPTU5hbWVzcGFjZSBhdHRyaWJ1dGVOUzsKLSAgICBwcml2YXRlIGJvb2xlYW4gYXR0cmlidXRlUHJlc2VudCA9IGZhbHNlOwotICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrOwotCi0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotCi0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKGVudmVsb3BlLmdldEhlYWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlckFkZCA9IGZhY3RvcnkuY3JlYXRlU09BUEhlYWRlcihlbnZlbG9wZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gaGVhZGVyQmxvY2suZ2V0QWxsQXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGZpcnN0QXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTlMgPSBmaXJzdEF0dHJpYnV0ZS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJvbGVWYWx1ZSA9IGhlYWRlckJsb2NrLmdldFJvbGUoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIG11c3RVbmRlcnN0YW5kID0gaGVhZGVyQmxvY2suZ2V0TXVzdFVuZGVyc3RhbmQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBoZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBoZWFkZXJCbG9ja05hbWVzcGFjZSA9IGhlYWRlckJsb2NrLmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVRVNUX0hFQURFUkJMT0NLX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlVmFsdWUgPT0gbnVsbCB8fCByb2xlVmFsdWUuZXF1YWxzKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9DKSB8fCByb2xlVmFsdWUuZXF1YWxzKFNPQVAxMl9ST0xFICsgIi8iICsgVUxUSU1BVEVSRUNFSVZFUl9ST0xFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVWYWx1ZS5lcXVhbHMoU09BUDEyX1JPTEUgKyAiLyIgKyBORVhUX1JPTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRMb2NhbE5hbWUoUkVTUE9OU0VfSEVBREVSQkxPQ0tfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlUHJlc2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnJlbW92ZUF0dHJpYnV0ZSgoT01BdHRyaWJ1dGUpIGhlYWRlckJsb2NrLmdldEFsbEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZXNlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoIkhFQURFUl9CTE9DS19QUkVTRU5UIiwgaGVhZGVyQmxvY2tQcmVzZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckFkZC5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIiwgaGVhZGVyQWRkKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVWYWx1ZSA9PSBudWxsIHx8IHJvbGVWYWx1ZS5lcXVhbHMoU0FNUExFX1JPTEUgKyAiLyIgKyBST0xFX0JZX0MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIFVMVElNQVRFUkVDRUlWRVJfUk9MRSkgfHwgcm9sZVZhbHVlLmVxdWFscyhTT0FQMTJfUk9MRSArICIvIiArIE5FWFRfUk9MRSkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11c3RVbmRlcnN0YW5kKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVByZXNlbnQgJiYgYXR0cmlidXRlTlMuZ2V0TmFtZSgpID09ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0KGJvZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Q29kZSBjb2RlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRDb2RlKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHZhbHVlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRWYWx1ZShjb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldFRleHQoImVudjpNdXN0VW5kZXJzdGFuZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHJlYXNvbiA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0UmVhc29uKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VGV4dChyZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRMYW5nKCJlbi1VUyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KCJIZWFkZXIgbm90IHVuZGVyc3Rvb2QiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbi5hZGRTT0FQVGV4dCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZmF1bHQuc2V0UmVhc29uKHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVZhbHVlICE9IG51bGwgJiYgcm9sZVZhbHVlLmVxdWFscyhTQU1QTEVfUk9MRSArICIvIiArIFJPTEVfQllfQikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHROb2RlIG5vZGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdE5vZGUoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0Tm9kZVZhbHVlKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9CKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRSb2xlIHJvbGUgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJvbGUoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUuc2V0Um9sZVZhbHVlKFNBTVBMRV9ST0xFICsgIi8iICsgUk9MRV9CWV9CKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX05PREVfTE9DQUxfTkFNRSwgbm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9ST0xFX0xPQ0FMX05BTUUsIHJvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSwgY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX1JFQVNPTl9MT0NBTF9OQU1FLCByZWFzb24pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZGlzY2FyZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgbmV3SGVhZGVyQmxvY2sgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVyQmxvY2sgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRIZWFkZXJCbG9jaygiTm90VW5kZXJzdG9vZCIsIGVudmVsb3BlLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlckJsb2NrLmRlY2xhcmVOYW1lc3BhY2UoaGVhZGVyQmxvY2tOYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVyQmxvY2suYWRkQXR0cmlidXRlKCJxbmFtZSIsIGhlYWRlckJsb2NrTmFtZXNwYWNlLmdldE5hbWUoKSArICI6IiArIGVsZW1lbnROYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU09BUFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrUHJlc2VudCA9IG5ldyBJbnRlZ2VyKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiLCBoZWFkZXJCbG9ja1ByZXNlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJBZGQuYWRkQ2hpbGQobmV3SGVhZGVyQmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIiwgaGVhZGVyQWRkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW50ZW50aW9uYWwgRmFpbHVyZSBmcm9tIFNPQVAgMS4yIHRlc3RpbmcgLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigwKSkpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiLCBoZWFkZXJCbG9ja1ByZXNlbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoZWFkZXJCbG9ja1ByZXNlbnQgPSBuZXcgSW50ZWdlcigwKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVhZGVyQmxvY2tQcmVzZW50ID0gbmV3IEludGVnZXIoMCk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiLCBoZWFkZXJCbG9ja1ByZXNlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdE1vZHVsZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL2hhbmRsZXJzL1NPQVAxMk91dEZhdWx0Rmxvd0hhbmRsZXJEZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODMwMmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0RmF1bHRGbG93SGFuZGxlckRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJPdXRGYXVsdEZsb3dIYW5kbGVyRGVmYXVsdCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIEludGVnZXIgaGVhZGVyQmxvY2tQcmVzZW50ID0gKEludGVnZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0tfUFJFU0VOVCIpOwotICAgICAgICBpZiAoaGVhZGVyQmxvY2tQcmVzZW50LmVxdWFscyhuZXcgSW50ZWdlcigxKSkpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyQWRkID0gKFNPQVBIZWFkZXIpIG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KCJIRUFERVJfQkxPQ0siKTsKLSAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyQWRkLmV4YW1pbmVBbGxIZWFkZXJCbG9ja3MoKTsKLSAgICAgICAgICAgIHdoaWxlKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jaz0oU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXJCbG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuZGlzY2FyZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0TW9kdWxlQy9vcmcvYXBhY2hlL2F4aXMyL3NvYXAxMnRlc3RpbmcvaGFuZGxlcnMvU09BUDEyT3V0Rmxvd0hhbmRsZXJEZWZhdWx0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZTdhMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RNb2R1bGVDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy9oYW5kbGVycy9TT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJPdXRGbG93SGFuZGxlckRlZmF1bHQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotCi0gICAgfQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBJbnRlZ2VyIGhlYWRlckJsb2NrUHJlc2VudCA9IChJbnRlZ2VyKSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLX1BSRVNFTlQiKTsKLSAgICAgICAgaWYgKGhlYWRlckJsb2NrUHJlc2VudC5lcXVhbHMobmV3IEludGVnZXIoMSkpKSB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlckFkZCA9IChTT0FQSGVhZGVyKSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRQcm9wZXJ0eSgiSEVBREVSX0JMT0NLIik7Ci0gICAgICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGhlYWRlckFkZC5leGFtaW5lQWxsSGVhZGVyQmxvY2tzKCk7Ci0gICAgICAgICAgICB3aGlsZShoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2s9KFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCkuYWRkQ2hpbGQoaGVhZGVyQmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEhlYWRlcigpLmRpc2NhcmQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlYWFkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNPQVAxMlRlc3RTZXJ2aWNlQiI+Ci0gICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2UgZm9yIFNPQVAgMS4yIFRlc3Rpbmc8L2Rlc2NyaXB0aW9uPgotICAgIDxtb2R1bGUgcmVmPSJTT0FQMTJUZXN0TW9kdWxlQiIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+b3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzLlNPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzRiMTMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L1JlcG9zaXRvcnkvc2VydmljZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VCLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VCLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUIvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiNWRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VCL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy93ZWJzZXJ2aWNlcy9TT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQgewotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImVjaG9PayIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJlc3BvbnNlT2siKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygicmV0dXJuVm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJldHVyblZvaWRSZXNwb25zZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyZGUyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9TT0FQMTJUZXN0aW5nL1NPQVAxMlRlc3RTZXJ2aWNlQy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNPQVAxMlRlc3RTZXJ2aWNlQyI+Ci0gICAgPGRlc2NyaXB0aW9uPlRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2UgZm9yIFNPQVAgMS4yIFRlc3Rpbmc8L2Rlc2NyaXB0aW9uPgotICAgIDxtb2R1bGUgcmVmPSJTT0FQMTJUZXN0TW9kdWxlQyIvPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+b3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzLlNPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjAxMWZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L1JlcG9zaXRvcnkvc2VydmljZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7bWF2ZW4uY2xhc3MucGF0aH0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC90ZXN0LWNsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBmb3JrPSJ0cnVlIiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VDLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vU09BUDEyVGVzdFNlcnZpY2VDLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvU09BUDEyVGVzdGluZy9TT0FQMTJUZXN0U2VydmljZUMvb3JnL2FwYWNoZS9heGlzMi9zb2FwMTJ0ZXN0aW5nL3dlYnNlcnZpY2VzL1NPQVAxMlRlc3RXZWJTZXJ2aWNlRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiNWRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1NPQVAxMlRlc3RpbmcvU09BUDEyVGVzdFNlcnZpY2VDL29yZy9hcGFjaGUvYXhpczIvc29hcDEydGVzdGluZy93ZWJzZXJ2aWNlcy9TT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwMTJ0ZXN0aW5nLndlYnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQMTJUZXN0V2ViU2VydmljZURlZmF1bHQgewotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImVjaG9PayIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJlc3BvbnNlT2siKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygicmV0dXJuVm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRMb2NhbE5hbWUoInJldHVyblZvaWRSZXNwb25zZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1lbmFibGVkLWF4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1lbmFibGVkLWF4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWExMmRmMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Td0EtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgUkVTVCBzdXBwb3J0IC0tPgotICAgIDwhLS0gICAgPHBhcmFtZXRlciBuYW1lPSJlYW5ibGVSRVNUIj50cnVlPC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBBZGRyZXNzaW5nLS0+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4gCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJpbmZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Im91dGZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IklOZmF1bHRmbG93Ij4KLSAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dGZhdWx0ZmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9Td0EtZmlsZUNhY2hlLWVuYWJsZWQtYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMzgyNTQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPnRhcmdldC90ZXN0LXJlc291cmNlcy88L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlcj4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBSRVNUIHN1cHBvcnQgLS0+Ci0gICAgPCEtLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVhbmJsZVJFU1QiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmctLT4KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPHBoYXNlT3JkZXIgdHlwZT0iaW5mbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJvdXRmbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJTmZhdWx0ZmxvdyI+Ci0gICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRmYXVsdGZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2RlcGxveW1lbnQuYm90aC5heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2RlcGxveW1lbnQuYm90aC5heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODEyY2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9kZXBsb3ltZW50LmJvdGguYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSBFbmdhZ2UgdGhlIGFkZHJlc3NpbmcgbW9kdWxlIC0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0KLSAgICA8IS0tIFRhcmdldCBSZXNvbHZlciBmb3IgVGFyZ2V0UmVzb2x2ZXJUZXN0IC0tPgotICAgIDx0YXJnZXRSZXNvbHZlcnM+Ci0gICAgCTx0YXJnZXRSZXNvbHZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlRlc3RUYXJnZXRSZXNvbHZlciIgLz4KLSAgICA8L3RhcmdldFJlc29sdmVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+ICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLQotPC9heGlzY29uZmlnPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2ZXItdHJhbnNwb3J0LnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyLXRyYW5zcG9ydC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjU1NTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2ZXItdHJhbnNwb3J0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJjdXN0b20iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAKLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZW50ZXJwcmlzZS53c2RsIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvZW50ZXJwcmlzZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJiYjk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2VudGVycHJpc2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM4MzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLVNhbGVzZm9yY2UuY29tIEVudGVycHJpc2UgV2ViIFNlcnZpY2VzIEFQSSBWZXJzaW9uIDcuMCAKLUdlbmVyYXRlZCBvbiAyMDA2LTA0LTE5IDAwOjI4OjA2ICswMDAwLgotCi1Db3B5cmlnaHQgMTk5OS0yMDA2IHNhbGVzZm9yY2UuY29tLCBpbmMuCi1BbGwgUmlnaHRzIFJlc2VydmVkCi0tLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0idXJuOmVudGVycHJpc2Uuc29hcC5zZm9yY2UuY29tIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJ1cm46ZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iCi0gICAgICAgICAgICAgeG1sbnM6Zm5zPSJ1cm46ZmF1bHQuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iCi0gICAgICAgICAgICAgeG1sbnM6ZW5zPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSI+Ci0gICAgPHR5cGVzPgotCi0gICAgICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46c29iamVjdC5lbnRlcnByaXNlLnNvYXAuc2ZvcmNlLmNvbSI+Ci0KLSAgICAgICAgICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJ1cm46ZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iLz4KLQotCi0gICAgICAgICAgICA8IS0tIEJhc2Ugc09iamVjdCAoYWJzdHJhY3QpIC0tPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9InNPYmplY3QiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmllbGRzVG9OdWxsIiAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJZCIgICAgICAgICAgICAgICAgIHR5cGU9InRuczpJRCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBTmV3RmllbGRfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnROdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjdGl2ZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW5udWFsUmV2ZW51ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQmlsbGluZ0NpdHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJpbGxpbmdDb3VudHJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nUG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQmlsbGluZ1N0YXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nU3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1c3RvbWVyUHJpb3JpdHlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGYXgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZvb19fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkluZHVzdHJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTnVtYmVyT2ZFbXBsb3llZXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik51bWJlcm9mTG9jYXRpb25zX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik93bmVyc2hpcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGFyZW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGhvbmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJhdGluZyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU0xBRXhwaXJhdGlvbkRhdGVfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTTEFTZXJpYWxOdW1iZXJfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNMQV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2hpcHBpbmdDaXR5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTaGlwcGluZ0NvdW50cnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNoaXBwaW5nUG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2hpcHBpbmdTdGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2hpcHBpbmdTdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNpYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2l0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVGlja2VyU3ltYm9sIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVcHNlbGxPcHBvcnR1bml0eV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iV2Vic2l0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ3VpZF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50IiB0eXBlPSJlbnM6QWNjb3VudCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQWNjb3VudENvbnRhY3RSb2xlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRhY3RJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1ByaW1hcnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUm9sZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50Q29udGFjdFJvbGUiIHR5cGU9ImVuczpBY2NvdW50Q29udGFjdFJvbGUiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRQYXJ0bmVyIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudEZyb21JZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50VG9JZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1ByaW1hcnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSb2xlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnRQYXJ0bmVyIiB0eXBlPSJlbnM6QWNjb3VudFBhcnRuZXIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFjY291bnRTaGFyZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnRBY2Nlc3NMZXZlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNhc2VBY2Nlc3NMZXZlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5QWNjZXNzTGV2ZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJvd0NhdXNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVc2VyT3JHcm91cElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudFNoYXJlIiB0eXBlPSJlbnM6QWNjb3VudFNoYXJlIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBY2NvdW50VGVhbU1lbWJlciI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVGVhbU1lbWJlclJvbGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnRUZWFtTWVtYmVyIiB0eXBlPSJlbnM6QWNjb3VudFRlYW1NZW1iZXIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFwcHJvdmFsIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXBwcm92ZUNvbW1lbnQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBhcmVudElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlcXVlc3RDb21tZW50IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdGF0dXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXBwcm92YWwiIHR5cGU9ImVuczpBcHByb3ZhbCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXNzZXQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udGFjdElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikluc3RhbGxEYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDb21wZXRpdG9yUHJvZHVjdCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmljZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUHJvZHVjdDJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQdXJjaGFzZURhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWFudGl0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2VyaWFsTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdGF0dXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzYWdlRW5kRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXNzZXQiIHR5cGU9ImVuczpBc3NldCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXNzaWdubWVudFJ1bGUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY3RpdmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUnVsZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXNzaWdubWVudFJ1bGUiIHR5cGU9ImVuczpBc3NpZ25tZW50UnVsZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXR0YWNobWVudCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJvZHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJvZHlMZW5ndGgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRlbnRUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1ByaXZhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJlbnRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9ImVuczpBdHRhY2htZW50Ii8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc0hvdXJzIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRnJpZGF5RW5kIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGcmlkYXlTdGFydCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1vbmRheUVuZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTW9uZGF5U3RhcnQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNhdHVyZGF5RW5kIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTYXR1cmRheVN0YXJ0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdW5kYXlFbmQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN1bmRheVN0YXJ0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUaHVyc2RheUVuZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVGh1cnNkYXlTdGFydCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVHVlc2RheUVuZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVHVlc2RheVN0YXJ0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJXZWRuZXNkYXlFbmQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IldlZG5lc2RheVN0YXJ0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJ1c2luZXNzSG91cnMiIHR5cGU9ImVuczpCdXNpbmVzc0hvdXJzIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJCdXNpbmVzc1Byb2Nlc3MiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNBY3RpdmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVGFibGVFbnVtT3JJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCdXNpbmVzc1Byb2Nlc3MiIHR5cGU9ImVuczpCdXNpbmVzc1Byb2Nlc3MiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNhbXBhaWduIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWN0dWFsQ29zdCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW1vdW50QWxsT3Bwb3J0dW5pdGllcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW1vdW50V29uT3Bwb3J0dW5pdGllcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQnVkZ2V0ZWRDb3N0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDTVBfU1lTVE1fMDAxX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDUE1fX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0aXZlX0RpcmVjdG9yX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFbmREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRXhwZWN0ZWRSZXNwb25zZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRXhwZWN0ZWRSZXZlbnVlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJHZW9ncmFwaHlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQWN0aXZlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxpc3RfVmVuZG9yX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZkNvbnRhY3RzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZkNvbnZlcnRlZExlYWRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZkxlYWRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZk9wcG9ydHVuaXRpZXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik51bWJlck9mUmVzcG9uc2VzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZldvbk9wcG9ydHVuaXRpZXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik51bWJlclNlbnQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik93bmVySWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUHVibGljYXRpb25fTmFtZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhcnREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdHVzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNhbXBhaWduIiB0eXBlPSJlbnM6Q2FtcGFpZ24iLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNhbXBhaWduTWVtYmVyIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FtcGFpZ25JZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb250YWN0SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmlyc3RSZXNwb25kZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSGFzUmVzcG9uZGVkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkxlYWRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdGF0dXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FtcGFpZ25NZW1iZXIiIHR5cGU9ImVuczpDYW1wYWlnbk1lbWJlciIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQ2FuX19jIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNhbl9fYyIgdHlwZT0iZW5zOkNhbl9fYyIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQ2FzZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFzc2V0SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FzZU51bWJlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2xvc2VkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDbG9zZWRPbkNyZWF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRhY3RJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFbmdpbmVlcmluZ1JlcU51bWJlcl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDbG9zZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0VzY2FsYXRlZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzVmlzaWJsZUluQ3NzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9yaWdpbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQb3RlbnRpYWxMaWFiaWxpdHlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByaW9yaXR5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm9kdWN0X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWFzb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY29yZFR5cGVJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTTEFWaW9sYXRpb25fX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXR1cyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3ViamVjdCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3VwcGxpZWRDb21wYW55IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdXBwbGllZEVtYWlsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdXBwbGllZE5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN1cHBsaWVkUGhvbmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVuZ19yZXZfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJleHRJZDFfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImV4dElkMl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYXNlIiB0eXBlPSJlbnM6Q2FzZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQ2FzZUNvbW1lbnQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb21tZW50Qm9keSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNQdWJsaXNoZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJlbnRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNhc2VDb21tZW50IiB0eXBlPSJlbnM6Q2FzZUNvbW1lbnQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNhc2VIaXN0b3J5Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FzZUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZpZWxkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOZXdWYWx1ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9sZFZhbHVlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYXNlSGlzdG9yeSIgdHlwZT0iZW5zOkNhc2VIaXN0b3J5Ii8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJDYXNlU2hhcmUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYXNlQWNjZXNzTGV2ZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNhc2VJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUm93Q2F1c2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzZXJPckdyb3VwSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYXNlU2hhcmUiIHR5cGU9ImVuczpDYXNlU2hhcmUiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNhc2VTb2x1dGlvbiI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNhc2VJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTb2x1dGlvbklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FzZVNvbHV0aW9uIiB0eXBlPSJlbnM6Q2FzZVNvbHV0aW9uIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJDYXNlU3RhdHVzIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDbG9zZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0RlZmF1bHQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTWFzdGVyTGFiZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvcnRPcmRlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYXNlU3RhdHVzIiB0eXBlPSJlbnM6Q2FzZVN0YXR1cyIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQ29sbGF0ZXJhbF9SZXF1ZXN0X09iamVjdF9fYyI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGF0ZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlbGl2ZXJ5X01ldGhvZF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRG9jdW1lbnRfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZLX0NvbnRhY3QyX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGS19Db250YWN0X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJzb25hbF9NZXNzYWdlX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdGF0dXNfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN1YmplY3RfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29sbGF0ZXJhbF9SZXF1ZXN0X09iamVjdF9fYyIgdHlwZT0iZW5zOkNvbGxhdGVyYWxfUmVxdWVzdF9PYmplY3RfX2MiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnRhY3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXNzaXN0YW50TmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXNzaXN0YW50UGhvbmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJpcnRoZGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVwYXJ0bWVudCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRvTm90Q2FsbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVtYWlsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGYXgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZpcnN0TmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iR29sZl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSGFzT3B0ZWRPdXRPZkVtYWlsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSG9tZVBob25lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYW5ndWFnZXNfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RDVVJlcXVlc3REYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RDVVVwZGF0ZURhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3ROYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMZWFkU291cmNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMZXZlbF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTVNQX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNYWlsaW5nQ2l0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTWFpbGluZ0NvdW50cnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1haWxpbmdQb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNYWlsaW5nU3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1haWxpbmdTdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1vYmlsZVBob25lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPdGhlckNpdHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik90aGVyQ291bnRyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3RoZXJQaG9uZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3RoZXJQb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPdGhlclN0YXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPdGhlclN0cmVldCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQaG9uZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVwb3J0c1RvSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2FsdXRhdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVGl0bGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udGFjdCIgdHlwZT0iZW5zOkNvbnRhY3QiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjdGl2YXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWN0aXZhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nQ2l0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQmlsbGluZ0NvdW50cnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJpbGxpbmdQb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCaWxsaW5nU3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJpbGxpbmdTdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbXBhbnlTaWduZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29tcGFueVNpZ25lZElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRyYWN0TnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb250cmFjdFRlcm0iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3VzdG9tZXJTaWduZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3VzdG9tZXJTaWduZWRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXN0b21lclNpZ25lZFRpdGxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW5kRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RBcHByb3ZlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik93bmVyRXhwaXJhdGlvbk5vdGljZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTcGVjaWFsVGVybXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXJ0RGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXR1cyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdHVzQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb250cmFjdCIgdHlwZT0iZW5zOkNvbnRyYWN0Ii8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJDb250cmFjdENvbnRhY3RSb2xlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udGFjdElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRyYWN0SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNQcmltYXJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJvbGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udHJhY3RDb250YWN0Um9sZSIgdHlwZT0iZW5zOkNvbnRyYWN0Q29udGFjdFJvbGUiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnRyYWN0U3RhdHVzIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNEZWZhdWx0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1hc3RlckxhYmVsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTb3J0T3JkZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXR1c0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udHJhY3RTdGF0dXMiIHR5cGU9ImVuczpDb250cmFjdFN0YXR1cyIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQ3VycmVuY3lUeXBlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udmVyc2lvblJhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlY2ltYWxQbGFjZXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQWN0aXZlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDb3Jwb3JhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc29Db2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeVR5cGUiIHR5cGU9ImVuczpDdXJyZW5jeVR5cGUiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRpc3RyaWJ1dGlvbl9Mb3RfX2MiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBdmFpbF9DYXBhY2l0eV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FwYWNpdHlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNpdHlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvdW50cnlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW1haWxfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZhY2lsaXR5X01hbmFnZXJfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmF4X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQaG9uZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUHJpbWFyeV9Db250YWN0X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlZ2lvbl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2Vjb25kYXJ5X0NvbnRhY3RfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdGVfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0cmVldF9BZGRyZXNzXzFfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0cmVldF9BZGRyZXNzXzJfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlppcF9Db2RlX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRpc3RyaWJ1dGlvbl9Mb3RfX2MiIHR5cGU9ImVuczpEaXN0cmlidXRpb25fTG90X19jIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJEb2N1bWVudCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkF1dGhvcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJvZHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJvZHlMZW5ndGgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRlbnRUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRm9sZGVySWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNJbnRlcm5hbFVzZU9ubHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1B1YmxpYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IktleXdvcmRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXJsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRvY3VtZW50IiB0eXBlPSJlbnM6RG9jdW1lbnQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVudGl0eUhpc3RvcnkiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGaWVsZE5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5ld1ZhbHVlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT2xkVmFsdWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJlbnRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJlbnRTb2JqZWN0VHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFbnRpdHlIaXN0b3J5IiB0eXBlPSJlbnM6RW50aXR5SGlzdG9yeSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRXZlbnQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWN0aXZpdHlEYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWN0aXZpdHlEYXRlVGltZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDaGFuZGxlcklkX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEdXJhdGlvbkluTWludXRlcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNBbGxEYXlFdmVudCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQ2hpbGQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0dyb3VwRXZlbnQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1ByaXZhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1JlY3VycmVuY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTG9jYXRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik93bmVySWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVjdXJyZW5jZUFjdGl2aXR5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVjdXJyZW5jZURheU9mTW9udGgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY3VycmVuY2VEYXlPZldlZWtNYXNrIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWN1cnJlbmNlRW5kRGF0ZU9ubHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWN1cnJlbmNlSW5zdGFuY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY3VycmVuY2VJbnRlcnZhbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVjdXJyZW5jZU1vbnRoT2ZZZWFyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWN1cnJlbmNlU3RhcnREYXRlVGltZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWN1cnJlbmNlVGltZVpvbmVTaWRLZXkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY3VycmVuY2VUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTaG93QXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN1YmplY3QiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IldoYXRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJXaG9JZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkV2ZW50IiB0eXBlPSJlbnM6RXZlbnQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkV2ZW50QXR0ZW5kZWUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBdHRlbmRlZUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkV2ZW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlc3BvbmRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVzcG9uc2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXR1cyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFdmVudEF0dGVuZGVlIiB0eXBlPSJlbnM6RXZlbnRBdHRlbmRlZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRXh0ZW5kZWRQcm9kdWN0c19fYyI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFyZWFfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRktfUHJvZHVjdENvZGVfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZ1ZWxfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikluc3RhbGxfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2ROYW1lX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWdpb25fX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNMQV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNhZ2VfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRXh0ZW5kZWRQcm9kdWN0c19fYyIgdHlwZT0iZW5zOkV4dGVuZGVkUHJvZHVjdHNfX2MiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkZpc2NhbFllYXJTZXR0aW5ncyI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzU3RhbmRhcmRZZWFyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVyaW9kSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVyaW9kTGFiZWxTY2hlbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcmlvZFByZWZpeCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUXVhcnRlckxhYmVsU2NoZW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWFydGVyUHJlZml4IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJXZWVrTGFiZWxTY2hlbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlllYXJUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZpc2NhbFllYXJTZXR0aW5ncyIgdHlwZT0iZW5zOkZpc2NhbFllYXJTZXR0aW5ncyIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRm9sZGVyIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjZXNzVHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNSZWFkb25seSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZvbGRlciIgdHlwZT0iZW5zOkZvbGRlciIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRm9vX19jIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3VycmVuY3lJc29Db2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZvb19fYyIgdHlwZT0iZW5zOkZvb19fYyIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iR3JvdXAiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFbWFpbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik93bmVySWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVsYXRlZElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iR3JvdXAiIHR5cGU9ImVuczpHcm91cCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iR3JvdXBNZW1iZXIiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJHcm91cElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzZXJPckdyb3VwSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJHcm91cE1lbWJlciIgdHlwZT0iZW5zOkdyb3VwTWVtYmVyIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJJbnZlbnRvcnlfX2MiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRpc3RyaWJ1dGlvbl9Mb3RfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF0eV9BdmFpbGFibGVfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF0eV9Db21taXR0ZWRfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSW52ZW50b3J5X19jIiB0eXBlPSJlbnM6SW52ZW50b3J5X19jIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJMZWFkIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW5udWFsUmV2ZW51ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2l0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29tcGFueSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udGFjdE1TUF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udmVydGVkQWNjb3VudElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnZlcnRlZENvbnRhY3RJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb252ZXJ0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udmVydGVkT3Bwb3J0dW5pdHlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbnRHZW5lcmF0b3JzX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRG9Ob3RDYWxsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW1haWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZheCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmlyc3ROYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJIYXNPcHRlZE91dE9mRW1haWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJbmR1c3RyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDb252ZXJ0ZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1VucmVhZEJ5T3duZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkxlYWRTb3VyY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1vYmlsZVBob25lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZkVtcGxveWVlcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTnVtYmVyb2ZMb2NhdGlvbnNfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcHR5TVNQX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBob25lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmltYXJ5X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm9kdWN0SW50ZXJlc3RfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJhdGluZyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU0lDQ29kZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2FsdXRhdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXR1cyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUaXRsZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iV2Vic2l0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMZWFkIiB0eXBlPSJlbnM6TGVhZCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iTGVhZFNoYXJlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkxlYWRBY2Nlc3NMZXZlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGVhZElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJvd0NhdXNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVc2VyT3JHcm91cElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGVhZFNoYXJlIiB0eXBlPSJlbnM6TGVhZFNoYXJlIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJMZWFkU3RhdHVzIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDb252ZXJ0ZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0RlZmF1bHQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTWFzdGVyTGFiZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvcnRPcmRlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMZWFkU3RhdHVzIiB0eXBlPSJlbnM6TGVhZFN0YXR1cyIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iTWFpbG1lcmdlVGVtcGxhdGUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCb2R5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCb2R5TGVuZ3RoIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmlsZW5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0VXNlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNYWlsbWVyZ2VUZW1wbGF0ZSIgdHlwZT0iZW5zOk1haWxtZXJnZVRlbXBsYXRlIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJNZXRyaWNzX19jIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW1vdW50X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBc19vZl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVwYXJ0bWVudF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFiZWxfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOb3RlX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlZhbHVlX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1ldHJpY3NfX2MiIHR5cGU9ImVuczpNZXRyaWNzX19jIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJNeV9UYWJfX2MiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50X19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iR3JlYXRfQ3VzdG9tZXJfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTXlfVGFiX0VtYWlsX0FkZHJlc3NfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik15X1RhYl9QaG9uZV9OdW1iZXJfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik15X1RhYl9XZWJfQWRkcmVzc19fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNeV9UYWJfX2MiIHR5cGU9ImVuczpNeV9UYWJfX2MiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJCb2R5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1ByaXZhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJlbnRJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUaXRsZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOb3RlIiB0eXBlPSJlbnM6Tm90ZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iT3Bwb3J0dW5pdHkiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQW1vdW50IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYW1wYWlnbklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNsb3NlRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVsaXZlcnlJbnN0YWxsYXRpb25TdGF0dXNfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFeHBlY3RlZFJldmVudWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZvcmVjYXN0Q2F0ZWdvcnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikhhc09wcG9ydHVuaXR5TGluZUl0ZW0iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0Nsb3NlZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzUHJpdmF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzV29uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkxlYWRTb3VyY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1TUF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmV4dFN0ZXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9yZGVyTnVtYmVyX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByaWNlYm9vazJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmljZWJvb2tJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm9iYWJpbGl0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVjb3JkVHlwZUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YWdlTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVG90YWxPcHBvcnR1bml0eVF1YW50aXR5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUcmFja2luZ051bWJlcl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW1nX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5IiB0eXBlPSJlbnM6T3Bwb3J0dW5pdHkiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik9wcG9ydHVuaXR5Q29tcGV0aXRvciI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbXBldGl0b3JOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdHJlbmd0aHMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IldlYWtuZXNzZXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlDb21wZXRpdG9yIiB0eXBlPSJlbnM6T3Bwb3J0dW5pdHlDb21wZXRpdG9yIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJPcHBvcnR1bml0eUNvbnRhY3RSb2xlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udGFjdElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzUHJpbWFyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcHBvcnR1bml0eUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJvbGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlDb250YWN0Um9sZSIgdHlwZT0iZW5zOk9wcG9ydHVuaXR5Q29udGFjdFJvbGUiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik9wcG9ydHVuaXR5SGlzdG9yeSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFtb3VudCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2xvc2VEYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3VycmVuY3lJc29Db2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFeHBlY3RlZFJldmVudWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZvcmVjYXN0Q2F0ZWdvcnkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUHJvYmFiaWxpdHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YWdlTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcHBvcnR1bml0eUhpc3RvcnkiIHR5cGU9ImVuczpPcHBvcnR1bml0eUhpc3RvcnkiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik9wcG9ydHVuaXR5TGluZUl0ZW0iPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJIYXNRdWFudGl0eVNjaGVkdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSGFzUmV2ZW51ZVNjaGVkdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxpc3RQcmljZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmljZWJvb2tFbnRyeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2R1Y3RJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWFudGl0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2VydmljZURhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTb3J0T3JkZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlRvdGFsUHJpY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVuaXRQcmljZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRvdWJsZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcHBvcnR1bml0eUxpbmVJdGVtIiB0eXBlPSJlbnM6T3Bwb3J0dW5pdHlMaW5lSXRlbSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iT3Bwb3J0dW5pdHlMaW5lSXRlbVNjaGVkdWxlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlMaW5lSXRlbUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlF1YW50aXR5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXZlbnVlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTY2hlZHVsZURhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5TGluZUl0ZW1TY2hlZHVsZSIgdHlwZT0iZW5zOk9wcG9ydHVuaXR5TGluZUl0ZW1TY2hlZHVsZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iT3Bwb3J0dW5pdHlQYXJ0bmVyIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudFRvSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNQcmltYXJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUm9sZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcHBvcnR1bml0eVBhcnRuZXIiIHR5cGU9ImVuczpPcHBvcnR1bml0eVBhcnRuZXIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik9wcG9ydHVuaXR5U2hhcmUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlBY2Nlc3NMZXZlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSb3dDYXVzZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlck9yR3JvdXBJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5U2hhcmUiIHR5cGU9ImVuczpPcHBvcnR1bml0eVNoYXJlIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJPcHBvcnR1bml0eVN0YWdlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVmYXVsdFByb2JhYmlsaXR5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRm9yZWNhc3RDYXRlZ29yeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNBY3RpdmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0Nsb3NlZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzV29uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1hc3RlckxhYmVsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTb3J0T3JkZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlTdGFnZSIgdHlwZT0iZW5zOk9wcG9ydHVuaXR5U3RhZ2UiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik9wcG9ydHVuaXR5VGVhbU1lbWJlciI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcHBvcnR1bml0eUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlRlYW1NZW1iZXJSb2xlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVc2VySWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcHBvcnR1bml0eVRlYW1NZW1iZXIiIHR5cGU9ImVuczpPcHBvcnR1bml0eVRlYW1NZW1iZXIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik9yZ2FuaXphdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNpdHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbXBsaWFuY2VCY2NFbWFpbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ291bnRyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVmYXVsdEFjY291bnRBbmRDb250YWN0QWNjZXNzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZWZhdWx0Q2FsZW5kYXJBY2Nlc3MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlZmF1bHRDYXNlQWNjZXNzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZWZhdWx0TGVhZEFjY2VzcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVmYXVsdExvY2FsZVNpZEtleSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVmYXVsdE9wcG9ydHVuaXR5QWNjZXNzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZWZhdWx0UHJpY2Vib29rQWNjZXNzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZWxlZ2F0ZWRBdXRoZW50aWNhdGlvblNlcnZpY2VVcmwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRpdmlzaW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGYXgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZpc2NhbFllYXJTdGFydE1vbnRoIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYW5ndWFnZUxvY2FsZUtleSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1heEFjdGlvbnNQZXJSdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNYXhSdWxlc1BlckVudGl0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGhvbmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByaW1hcnlDb250YWN0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWNlaXZlc0FkbWluSW5mb0VtYWlscyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY2VpdmVzSW5mb0VtYWlscyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVpU2tpbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlc1N0YXJ0RGF0ZUFzRmlzY2FsWWVhck5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJXZWJUb0Nhc2VEZWZhdWx0T3JpZ2luIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9yZ2FuaXphdGlvbiIgdHlwZT0iZW5zOk9yZ2FuaXphdGlvbiIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUGFydG5lciI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFjY291bnRGcm9tSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWNjb3VudFRvSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNQcmltYXJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUm9sZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJ0bmVyIiB0eXBlPSJlbnM6UGFydG5lciIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUGFydG5lclJvbGUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTWFzdGVyTGFiZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJldmVyc2VSb2xlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTb3J0T3JkZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGFydG5lclJvbGUiIHR5cGU9ImVuczpQYXJ0bmVyUm9sZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUGVyaW9kIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW5kRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzRm9yZWNhc3RQZXJpb2QiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcmlvZExhYmVsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWFydGVyTGFiZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0YXJ0RGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVyaW9kIiB0eXBlPSJlbnM6UGVyaW9kIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJQcmljZWJvb2siPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQWN0aXZlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByaWNlYm9vayIgdHlwZT0iZW5zOlByaWNlYm9vayIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUHJpY2Vib29rMiI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0FjdGl2ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzU3RhbmRhcmQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmljZWJvb2syIiB0eXBlPSJlbnM6UHJpY2Vib29rMiIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUHJpY2Vib29rRW50cnkiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQWN0aXZlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByaWNlYm9vazJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm9kdWN0MklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2R1Y3RDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVbml0UHJpY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzZVN0YW5kYXJkUHJpY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByaWNlYm9va0VudHJ5IiB0eXBlPSJlbnM6UHJpY2Vib29rRW50cnkiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb2R1Y3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYW5Vc2VRdWFudGl0eVNjaGVkdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FuVXNlUmV2ZW51ZVNjaGVkdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVmYXVsdFByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNBY3RpdmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTnVtYmVyT2ZRdWFudGl0eUluc3RhbGxtZW50cyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTnVtYmVyT2ZSZXZlbnVlSW5zdGFsbG1lbnRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmljZWJvb2tJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm9kdWN0Q29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUXVhbnRpdHlJbnN0YWxsbWVudFBlcmlvZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUXVhbnRpdHlTY2hlZHVsZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJldmVudWVJbnN0YWxsbWVudFBlcmlvZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmV2ZW51ZVNjaGVkdWxlVHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcm9kdWN0IiB0eXBlPSJlbnM6UHJvZHVjdCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUHJvZHVjdDIiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDYW5Vc2VRdWFudGl0eVNjaGVkdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FuVXNlUmV2ZW51ZVNjaGVkdWxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FwYWNpdHlfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbnRhaW5lcl9QdXJwb3NlX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb250YWluZXJfVHlwZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3VycmVuY3lJc29Db2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGltZW5zaW9uX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFeHRlbmRlZF9EZXNjcmlwdGlvbl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmFtaWx5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0FjdGl2ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZlF1YW50aXR5SW5zdGFsbG1lbnRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOdW1iZXJPZlJldmVudWVJbnN0YWxsbWVudHMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2R1Y3RDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWFudGl0eUluc3RhbGxtZW50UGVyaW9kIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWFudGl0eVNjaGVkdWxlVHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmV2ZW51ZUluc3RhbGxtZW50UGVyaW9kIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZXZlbnVlU2NoZWR1bGVUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2R1Y3QyIiB0eXBlPSJlbnM6UHJvZHVjdDIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlByb2ZpbGUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNTc29FbmFibGVkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zQXBpVXNlck9ubHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc0NvbnZlcnRMZWFkcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zQ3JlYXRlTXVsdGlmb3JjZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zQ3VzdG9taXplQXBwbGljYXRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc0Rpc2FibGVOb3RpZmljYXRpb25zIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNFZGl0QWN0aXZhdGVkT3JkZXJzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNFZGl0RXZlbnQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc0VkaXRGb3JlY2FzdCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zRWRpdE9wcExpbmVJdGVtVW5pdFByaWNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNFZGl0UHVibGljRG9jdW1lbnRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNFZGl0UmVhZG9ubHlGaWVsZHMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc0VkaXRUYXNrIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNJbXBvcnRMZWFkcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zSW5zdGFsbE11bHRpZm9yY2UiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc01hbmFnZUNhc2VzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNNYW5hZ2VDYXRlZ29yaWVzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNNYW5hZ2VDc3NVc2VycyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zTWFuYWdlRGFzaGJvYXJkcyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zTWFuYWdlTGVhZHMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc01hbmFnZVNlbGZTZXJ2aWNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNNYW5hZ2VTb2x1dGlvbnMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc01hbmFnZVRlcnJpdG9yaWVzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNNYW5hZ2VVc2VycyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zTW9kaWZ5QWxsRGF0YSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBlcm1pc3Npb25zUGFzc3dvcmROZXZlckV4cGlyZXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc1B1Ymxpc2hNdWx0aWZvcmNlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNSdW5SZXBvcnRzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNTZW5kU2l0UmVxdWVzdHMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc1RyYW5zZmVyQW55RW50aXR5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNUcmFuc2ZlckFueUxlYWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc1VzZVRlYW1SZWFzc2lnbldpemFyZHMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc1ZpZXdBZ2VudENvbnNvbGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQZXJtaXNzaW9uc1ZpZXdBbGxEYXRhIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGVybWlzc2lvbnNWaWV3U2V0dXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2ZpbGUiIHR5cGU9ImVuczpQcm9maWxlIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWNvcmRUeXBlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQnVzaW5lc3NQcm9jZXNzSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQWN0aXZlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvYmplY3RUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY29yZFR5cGUiIHR5cGU9ImVuczpSZWNvcmRUeXBlIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTY29udHJvbCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkJpbmFyeSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQm9keUxlbmd0aCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZpbGVuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJIdG1sV3JhcHBlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU2NvbnRyb2wiIHR5cGU9ImVuczpTY29udHJvbCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU2VsZlNlcnZpY2VVc2VyIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ29udGFjdElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVtYWlsIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJGaXJzdE5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzQWN0aXZlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFuZ3VhZ2VMb2NhbGVLZXkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RMb2dpbkRhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3ROYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMb2NhbGVTaWRLZXkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN1cGVyVXNlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlRpbWVab25lU2lkS2V5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVc2VybmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTZWxmU2VydmljZVVzZXIiIHR5cGU9ImVuczpTZWxmU2VydmljZVVzZXIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNvbHV0aW9uIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXBwbGljYWJsZV9SZWdpb25fX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkN1cnJlbmN5SXNvQ29kZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNQdWJsaXNoZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1B1Ymxpc2hlZEluUHVibGljS2IiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc1Jldmlld2VkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik93bmVySWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUHJpbWFyeV9BdWRpZW5jZV9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUmVjb3JkVHlwZUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvbHV0aW9uTmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU29sdXRpb25Ob3RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTb2x1dGlvbk51bWJlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU29sdXRpb25fRXhwaXJhdGlvbl9EYXRlX19jIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdHVzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvbHV0aW9uIiB0eXBlPSJlbnM6U29sdXRpb24iLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNvbHV0aW9uU3RhdHVzIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNEZWZhdWx0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNSZXZpZXdlZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNYXN0ZXJMYWJlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU29ydE9yZGVyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvbHV0aW9uU3RhdHVzIiB0eXBlPSJlbnM6U29sdXRpb25TdGF0dXMiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBY2NvdW50SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWN0aXZpdHlEYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2hhbmRsZXJJZF9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3VycmVuY3lJc29Db2RlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNDbG9zZWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQcmlvcml0eSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdHVzIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdWJqZWN0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJXaGF0SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iV2hvSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJlbnM6VGFzayIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iVGFza1ByaW9yaXR5Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ3JlYXRlZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNEZWZhdWx0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSXNIaWdoUHJpb3JpdHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTWFzdGVyTGFiZWwiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNvcnRPcmRlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUYXNrUHJpb3JpdHkiIHR5cGU9ImVuczpUYXNrUHJpb3JpdHkiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlRhc2tTdGF0dXMiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0Nsb3NlZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzRGVmYXVsdCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNYXN0ZXJMYWJlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU29ydE9yZGVyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlRhc2tTdGF0dXMiIHR5cGU9ImVuczpUYXNrU3RhdHVzIi8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJVc2VyIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQWxpYXMiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNpdHkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNvbXBhbnlOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb21wYW55X09mZmljZXJfX2MiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDb3VudHJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlZmF1bHRDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRlcGFydG1lbnQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkRpdmlzaW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFbWFpbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW1haWxFbmNvZGluZ0tleSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW1wbG95ZWVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkZheCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmlyc3ROYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJc0FjdGl2ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhbmd1YWdlTG9jYWxlS2V5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TG9naW5EYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TmFtZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTG9jYWxlU2lkS2V5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJNb2JpbGVQaG9uZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT2ZmbGluZVBkYVRyaWFsRXhwaXJhdGlvbkRhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT2ZmbGluZVRyaWFsRXhwaXJhdGlvbkRhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGhvbmUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlByb2ZpbGVJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJSZWNlaXZlc0FkbWluSW5mb0VtYWlscyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlY2VpdmVzSW5mb0VtYWlscyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlJlZ2lvbl9fYyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN0cmVldCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3lzdGVtTW9kc3RhbXAiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVGltZVpvbmVTaWRLZXkiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlRpdGxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVc2VyUGVybWlzc2lvbnNBdmFudGdvVXNlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzZXJQZXJtaXNzaW9uc01hcmtldGluZ1VzZXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJVc2VyUGVybWlzc2lvbnNPZmZsaW5lVXNlciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVzZXJSb2xlSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlcm5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlciIgdHlwZT0iZW5zOlVzZXIiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlVzZXJSb2xlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZW5zOnNPYmplY3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQ2FzZUFjY2Vzc0ZvckFjY291bnRPd25lciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik5hbWUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik9wcG9ydHVuaXR5QWNjZXNzRm9yQWNjb3VudE93bmVyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJQYXJlbnRSb2xlSWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUm9sbHVwRGVzY3JpcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlclJvbGUiIHR5cGU9ImVuczpVc2VyUm9sZSIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iVXNlclRlYW1NZW1iZXIiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZERhdGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3Bwb3J0dW5pdHlBY2Nlc3NMZXZlbCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3duZXJJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTeXN0ZW1Nb2RzdGFtcCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJUZWFtTWVtYmVyUm9sZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iVXNlclRlYW1NZW1iZXIiIHR5cGU9ImVuczpVc2VyVGVhbU1lbWJlciIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iV2ViTGluayI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImVuczpzT2JqZWN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWRCeUlkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkNyZWF0ZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVuY29kaW5nS2V5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJIYXNNZW51YmFyIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSGFzU2Nyb2xsYmFycyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikhhc1Rvb2xiYXIiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJIZWlnaHQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IklzUmVzaXphYmxlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWREYXRlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkxpbmtUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPcGVuVHlwZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iUGFnZU9yU29iamVjdFR5cGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlBvc2l0aW9uIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTY29udHJvbElkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNob3dzTG9jYXRpb24iIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTaG93c1N0YXR1cyIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVybCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iV2lkdGgiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iV2ViTGluayIgdHlwZT0iZW5zOldlYkxpbmsiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImFwaVRlc3RfX2MiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJlbnM6c09iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkQnlJZCIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDcmVhdGVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJDdXJyZW5jeUlzb0NvZGUiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ikxhc3RNb2RpZmllZEJ5SWQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTGFzdE1vZGlmaWVkRGF0ZSIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJPd25lcklkIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlN5c3RlbU1vZHN0YW1wIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYXBpVGVzdF9fYyIgdHlwZT0iZW5zOmFwaVRlc3RfX2MiLz4KLQotCi0gICAgICAgIDwvc2NoZW1hPgotCi0gICAgICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46ZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iPgotCi0gICAgICAgICAgICA8aW1wb3J0IG5hbWVzcGFjZT0idXJuOnNvYmplY3QuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iLz4KLQotICAgICAgICAgICAgPCEtLSBPdXIgc2ltcGxlIElEIFR5cGUgLS0+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZSBuYW1lPSJJRCI+Ci0gICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8bGVuZ3RoIHZhbHVlPSIxOCIvPgotICAgICAgICAgICAgICAgICAgICA8cGF0dGVybiB2YWx1ZT0nW2EtekEtWjAtOV17MTh9Jy8+Ci0gICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLQotICAgICAgICAgICAgPHNpbXBsZVR5cGUgbmFtZT0iUXVlcnlMb2NhdG9yIj4KLSAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotCi0gICAgICAgICAgICA8IS0tIFNoYXJlZCBSZXN1bHQgVHlwZXMgLS0+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUXVlcnlSZXN1bHQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZG9uZSIgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJxdWVyeUxvY2F0b3IiIHR5cGU9InRuczpRdWVyeUxvY2F0b3IiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlY29yZHMiICAgICAgdHlwZT0iZW5zOnNPYmplY3QiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNpemUiICAgICAgICAgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0KLQotICAgICAgICAgICAgPCEtLSBTZWFyY2ggUmVzdWx0IC0tPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNlYXJjaFJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZWFyY2hSZWNvcmRzIiAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOlNlYXJjaFJlY29yZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZm9yY2VSZXNlcnZlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNlYXJjaFJlY29yZCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZWNvcmQiIHR5cGU9ImVuczpzT2JqZWN0Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDwhLS0gR2V0VXBkYXRlZCBSZXN1bHQgLS0+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iR2V0VXBkYXRlZFJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZm9yY2VSZXNlcnZlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPCEtLSBHZXREZWxldGVkIFJlc3VsdCAtLT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJHZXREZWxldGVkUmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlbGV0ZWRSZWNvcmRzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0bnM6RGVsZXRlZFJlY29yZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZm9yY2VSZXNlcnZlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlbGV0ZWRSZWNvcmQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVsZXRlZERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpZCIgICAgICAgICAgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkdldFNlcnZlclRpbWVzdGFtcFJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0aW1lc3RhbXAiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU2V0UGFzc3dvcmRSZXN1bHQiPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlJlc2V0UGFzc3dvcmRSZXN1bHQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkdldFVzZXJJbmZvUmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFjY2Vzc2liaWxpdHlNb2RlIiAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjdXJyZW5jeVN5bWJvbCIgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ib3JnYW5pemF0aW9uSWQiICAgICAgICAgICAgIHR5cGU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJvcmdhbml6YXRpb25NdWx0aUN1cnJlbmN5IiAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ib3JnYW5pemF0aW9uTmFtZSIgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlckRlZmF1bHRDdXJyZW5jeUlzb0NvZGUiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZXJFbWFpbCIgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZXJGdWxsTmFtZSIgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZXJJZCIgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlckxhbmd1YWdlIiAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlckxvY2FsZSIgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlclRpbWVab25lIiAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlclVpU2tpbiIgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkxvZ2luUmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhc3N3b3JkRXhwaXJlZCIgIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZXJ2ZXJVcmwiICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZXNzaW9uSWQiICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotCi0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZXJJZCIgICAgICAgICAgIHR5cGU9InRuczpJRCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlckluZm8iICAgICAgICAgdHlwZT0idG5zOkdldFVzZXJJbmZvUmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlIG5hbWU9IlN0YXR1c0NvZGUiPgotICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJBU1NJR05FRV9UWVBFX1JFUVVJUkVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQkFEX0NVU1RPTV9FTlRJVFlfUEFSRU5UX0RPTUFJTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNBTk5PVF9DQVNDQURFX1BST0RVQ1RfQUNUSVZFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOTk9UX0RFQUNUSVZBVEVfRElWSVNJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDQU5OT1RfRElTQUJMRV9MQVNUX0FETUlOIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOTk9UX0lOU0VSVF9VUERBVEVfQUNUSVZBVEVfRU5USVRZIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOTk9UX1JFUEFSRU5UX1JFQ09SRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNBTk5PVF9SRVNPTFZFX05BTUUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDQU5OT1RfVVBEQVRFX0NPTlZFUlRFRF9MRUFEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ0FOVF9ESVNBQkxFX0NPUlBfQ1VSUkVOQ1kiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDQU5UX1VOU0VUX0NPUlBfQ1VSUkVOQ1kiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDSElMRF9TSEFSRV9GQUlMU19QQVJFTlQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDSVJDVUxBUl9ERVBFTkRFTkNZIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ1VTVE9NX0VOVElUWV9PUl9GSUVMRF9MSU1JVCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNVU1RPTV9GSUVMRF9JTkRFWF9MSU1JVF9FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNVU1RPTV9JTkRFWF9FWElTVFMiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDVVNUT01fTElOS19MSU1JVF9FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkNVU1RPTV9UQUJfTElNSVRfRVhDRUVERUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEVfRkFJTEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iREVMRVRFX1JFUVVJUkVEX09OX0NBU0NBREUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJERVBFTkRFTkNZX0VYSVNUUyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkRVUExJQ0FURV9DQVNFX1NPTFVUSU9OIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRFVQTElDQVRFX0NVU1RPTV9UQUJfTU9USUYiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJEVVBMSUNBVEVfREVWRUxPUEVSX05BTUUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJEVVBMSUNBVEVfRVhURVJOQUxfSUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJEVVBMSUNBVEVfTUFTVEVSX0xBQkVMIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRFVQTElDQVRFX1VTRVJOQU1FIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRFVQTElDQVRFX1ZBTFVFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRU5USVRZX0ZBSUxFRF9JRkxBU1RNT0RJRklFRF9PTl9VUERBVEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFTlRJVFlfSVNfQVJDSElWRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFTlRJVFlfSVNfREVMRVRFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkVOVElUWV9JU19MT0NLRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJGQUlMRURfQUNUSVZBVElPTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEX0lOVEVHUklUWV9FWENFUFRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTkFDVElWRV9PV05FUl9PUl9VU0VSIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5TVUZGSUNJRU5UX0FDQ0VTU19PTl9DUk9TU19SRUZFUkVOQ0VfRU5USVRZIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5TVUZGSUNJRU5UX0FDQ0VTU19PUl9SRUFET05MWSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfQUNDRVNTX0xFVkVMIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9BUkdVTUVOVF9UWVBFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9BU1NJR05FRV9UWVBFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9BU1NJR05NRU5UX1JVTEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0JBVENIX09QRVJBVElPTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfQ1JFRElUX0NBUkRfSU5GTyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfQ1JPU1NfUkVGRVJFTkNFX0tFWSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfQ1JPU1NfUkVGRVJFTkNFX1RZUEVfRk9SX0ZJRUxEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9DVVJSRU5DWV9DT05WX1JBVEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0NVUlJFTkNZX0lTTyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfRU1BSUxfQUREUkVTUyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfRU1QVFlfS0VZX09XTkVSIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9GSUVMRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfRklFTERfRk9SX0lOU0VSVF9VUERBVEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0ZJTFRFUl9BQ1RJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0lEX0ZJRUxEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9JTkVUX0FERFJFU1MiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0xJTkVJVEVNX0NMT05FX1NUQVRFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9PUEVSQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX09QRVJBVE9SIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9PUl9OVUxMX0ZPUl9SRVNUUklDVEVEX1BJQ0tMSVNUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9TVEFUVVMiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX1RZUEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX1RZUEVfRk9SX09QRVJBVElPTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfVFlQRV9PTl9GSUVMRF9JTl9SRUNPUkQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJMQVNUX01PRElGSUVEX1NJTkNFX1RPT19PTEQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJMSUNFTlNFX0xJTUlUX0VYQ0VFREVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTElNSVRfRVhDRUVERUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNQUxGT1JNRURfSUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNQVhJTVVNX0NDRU1BSUxTX0VYQ0VFREVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFYSU1VTV9EQVNIQk9BUkRfQ09NUE9ORU5UU19FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1BWElNVU1fU0laRV9PRl9BVFRBQ0hNRU5UIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFYSU1VTV9TSVpFX09GX0RPQ1VNRU5UIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFYX0FDVElPTlNfUEVSX1JVTEVfRVhDRUVERUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJNQVhfQUNUSVZFX1JVTEVTX0VYQ0VFREVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFYX1JVTEVTX0VYQ0VFREVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFYX1JVTEVfRU5UUklFU19FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1BWF9UQVNLX0RFU0NSSVBUSU9OX0VYQ0VFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1BWF9UTV9SVUxFU19FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1JU1NJTkdfQVJHVU1FTlQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJOT05VTklRVUVfU0hJUFBJTkdfQUREUkVTUyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik5VTUJFUl9PVVRTSURFX1ZBTElEX1JBTkdFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTlVNX0hJU1RPUllfRklFTERTX0JZX1NPQkpFQ1RfRVhDRUVERUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQUklWQVRFX0NPTlRBQ1RfT05fQVNTRVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJSRVFVSVJFRF9GSUVMRF9NSVNTSU5HIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU0hBUkVfTkVFREVEX0ZPUl9DSElMRF9PV05FUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNUQU5EQVJEX1BSSUNFX05PVF9ERUZJTkVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iU1RPUkFHRV9MSU1JVF9FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlRBQlNFVF9MSU1JVF9FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlRFWFRfREFUQV9PVVRTSURFX1NVUFBPUlRFRF9DSEFSU0VUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVE9PX01BTllfRU5VTV9WQUxVRSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlRSQU5TRkVSX1JFUVVJUkVTX1JFQUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJVTktOT1dOX0VYQ0VQVElPTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlVOU1BFQ0lGSUVEX0VNQUlMX0FERFJFU1MiLz4KLSAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotCi0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJFcnJvciI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZHMiICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0YXR1c0NvZGUiIHR5cGU9InRuczpTdGF0dXNDb2RlIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTYXZlUmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVycm9ycyIgICAgdHlwZT0idG5zOkVycm9yIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImlkIiAgICAgICAgdHlwZT0idG5zOklEIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdWNjZXNzIiAgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJVcHNlcnRSZXN1bHQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY3JlYXRlZCIgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVycm9ycyIgICAgdHlwZT0idG5zOkVycm9yIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImlkIiAgICAgICB0eXBlPSJ0bnM6SUQiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN1Y2Nlc3MiICAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlbGV0ZVJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlcnJvcnMiICAgIHR5cGU9InRuczpFcnJvciIgbmlsbGFibGU9InRydWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgIAotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpZCIgICAgICAgIHR5cGU9InRuczpJRCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3VjY2VzcyIgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iTGVhZENvbnZlcnQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYWNjb3VudElkIiAgICAgICAgICAgICAgdHlwZT0idG5zOklEIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb250YWN0SWQiICAgICAgICAgICAgICB0eXBlPSJ0bnM6SUQiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnZlcnRlZFN0YXR1cyIgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZG9Ob3RDcmVhdGVPcHBvcnR1bml0eSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGVhZElkIiAgICAgICAgICAgICAgICAgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im9wcG9ydHVuaXR5TmFtZSIgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im92ZXJ3cml0ZUxlYWRTb3VyY2UiICAgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im93bmVySWQiICAgICAgICAgICAgICAgIHR5cGU9InRuczpJRCIgICAgIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNlbmROb3RpZmljYXRpb25FbWFpbCIgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJMZWFkQ29udmVydFJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhY2NvdW50SWQiICAgICB0eXBlPSJ0bnM6SUQiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnRhY3RJZCIgICAgIHR5cGU9InRuczpJRCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZXJyb3JzIiAgICAgICAgdHlwZT0idG5zOkVycm9yIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgCi0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxlYWRJZCIgICAgICAgIHR5cGU9InRuczpJRCIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ib3Bwb3J0dW5pdHlJZCIgdHlwZT0idG5zOklEIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdWNjZXNzIiAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmVTT2JqZWN0UmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFjdGl2YXRlYWJsZSIgICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNoaWxkUmVsYXRpb25zaGlwcyIgCXR5cGU9InRuczpDaGlsZFJlbGF0aW9uc2hpcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjcmVhdGVhYmxlIiAgICAgCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjdXN0b20iICAgICAgICAgCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkZWxldGFibGUiICAgICAgCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZHMiICAgICAgICAgCQl0eXBlPSJ0bnM6RmllbGQiIG5pbGxhYmxlPSJ0cnVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImtleVByZWZpeCIgICAgICAJCXR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxhYmVsIiAgICAgICAgICAJCXR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGFiZWxQbHVyYWwiICAgIAkJdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXlvdXRhYmxlIiAgICAgCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiAgICAgICAgICAgCQl0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InF1ZXJ5YWJsZSIgICAgICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcGxpY2F0ZWFibGUiICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJldHJpZXZlYWJsZSIgICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNlYXJjaGFibGUiICAgICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVuZGVsZXRhYmxlIiAgICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVwZGF0ZWFibGUiICAgICAJCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVybERldGFpbCIgICAgICAJCXR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVybEVkaXQiICAgICAgICAJCXR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVybE5ldyIgICAgICAgICAJCXR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLQkJCTxjb21wbGV4VHlwZSBuYW1lPSJDaGlsZFJlbGF0aW9uc2hpcCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJjYXNjYWRlRGVsZXRlIiAJIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9ImNoaWxkU09iamVjdCIgIAkgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJmaWVsZCIJCSAgCSB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9InJlbGF0aW9uc2hpcE5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCQkJCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmVHbG9iYWxSZXN1bHQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZW5jb2RpbmciICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im1heEJhdGNoU2l6ZSIgICB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InR5cGVzIiAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8c2ltcGxlVHlwZSBuYW1lPSJmaWVsZFR5cGUiPgotICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJwaWNrbGlzdCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im11bHRpcGlja2xpc3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJjb21ib2JveCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJlZmVyZW5jZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJhc2U2NCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJjdXJyZW5jeSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InRleHRhcmVhIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0icGVyY2VudCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InBob25lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZGF0ZXRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ1cmwiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJlbWFpbCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImFueVR5cGUiLz4gPCEtLSBjYW4gYmUgc3RyaW5nLCBwaWNrbGlzdCwgcmVmZXJlbmNlLCBib29sZWFuLCBpbnQsIGRvdWJsZSwgcGVyY2VudCwgaWQsIGRhdGUsIGRhdGV0aW1lLCB1cmwsIGVtYWlsIC0tPgotICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlIG5hbWU9InNvYXBUeXBlIj4gCi0gICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InRuczpJRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InhzZDpkYXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ieHNkOmFueVR5cGUiLz4gPCEtLSBjYW4gYmUgaWQsIGJvb29sZWFuLCBkb3VibGUsIGludCwgc3RyaW5nLCBkYXRlLCBkYXRlVGltZSAtLT4KLSAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRmllbGQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYXV0b051bWJlciIgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJieXRlTGVuZ3RoIiAgICAgICAgIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY2FsY3VsYXRlZCIJCSAgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbnRyb2xsZXJOYW1lIiAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNyZWF0ZWFibGUiICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY3VzdG9tIiAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJkZWZhdWx0ZWRPbkNyZWF0ZSIgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlcGVuZGVudFBpY2tsaXN0IiAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkaWdpdHMiICAgICAgICAgICAgIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZXh0ZXJuYWxJZCIJCSAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyYWJsZSIgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJodG1sRm9ybWF0dGVkIgkgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxhYmVsIiAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsZW5ndGgiICAgICAgICAgICAgIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWVGaWVsZCIgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmlsbGFibGUiICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwaWNrbGlzdFZhbHVlcyIgICAgIHR5cGU9InRuczpQaWNrbGlzdEVudHJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iICAgICAgICAgIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVmZXJlbmNlVG8iICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJyZWxhdGlvbnNoaXBOYW1lIiAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN0cmljdGVkUGlja2xpc3QiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNjYWxlIiAgICAgICAgICAgICAgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzb2FwVHlwZSIgICAgICAgICAgIHR5cGU9InRuczpzb2FwVHlwZSIvPiAKLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idHlwZSIgICAgICAgICAgICAgICB0eXBlPSJ0bnM6ZmllbGRUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVwZGF0ZWFibGUiICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUGlja2xpc3RFbnRyeSI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhY3RpdmUiICAgICAgIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGFiZWwiICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWxpZEZvciIgICAgIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJlTGF5b3V0UmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxheW91dHMiICAgICAgICAgICAgdHlwZT0idG5zOkRlc2NyaWJlTGF5b3V0IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZWNvcmRUeXBlTWFwcGluZ3MiIHR5cGU9InRuczpSZWNvcmRUeXBlTWFwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmVMYXlvdXQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGV0YWlsTGF5b3V0U2VjdGlvbnMiIHR5cGU9InRuczpEZXNjcmliZUxheW91dFNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWRpdExheW91dFNlY3Rpb25zIiAgIHR5cGU9InRuczpEZXNjcmliZUxheW91dFNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaWQiICAgICAgICAgICAgICAgICAgIHR5cGU9InRuczpJRCIvPgotCi0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliZUxheW91dFNlY3Rpb24iPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY29sdW1ucyIgICAgICAgICAgCQl0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImhlYWRpbmciICAgICAgICAgIAkJdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXlvdXRSb3dzIiAgICAgICAJCXR5cGU9InRuczpEZXNjcmliZUxheW91dFJvdyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icm93cyIgICAgICAgICAgICAgCQl0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZUNvbGxhcHNpYmxlU2VjdGlvbiIgCXR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZUhlYWRpbmciICAgICAgIAkJdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJlTGF5b3V0Um93Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxheW91dEl0ZW1zIiAgICAgIHR5cGU9InRuczpEZXNjcmliZUxheW91dEl0ZW0iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im51bUl0ZW1zIiAgICAgICAgIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJlTGF5b3V0SXRlbSI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlZGl0YWJsZSIgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYWJlbCIgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXlvdXRDb21wb25lbnRzIiB0eXBlPSJ0bnM6RGVzY3JpYmVMYXlvdXRDb21wb25lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGxhY2Vob2xkZXIiICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWlyZWQiICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJlTGF5b3V0Q29tcG9uZW50Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRhYk9yZGVyIiAgICAgICAgICB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InR5cGUiICAgICAgICAgICAgICB0eXBlPSJ0bnM6bGF5b3V0Q29tcG9uZW50VHlwZSIvPiAKLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPHNpbXBsZVR5cGUgbmFtZT0ibGF5b3V0Q29tcG9uZW50VHlwZSI+IAotICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJGaWVsZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNlcGFyYXRvciIvPgotICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWNvcmRUeXBlTWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhdmFpbGFibGUiICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkZWZhdWx0UmVjb3JkVHlwZU1hcHBpbmciICB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXlvdXRJZCIgICAgICAgICAgICAgICAgICB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwaWNrbGlzdHNGb3JSZWNvcmRUeXBlIiAgICB0eXBlPSJ0bnM6UGlja2xpc3RGb3JSZWNvcmRUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZWNvcmRUeXBlSWQiICAgICAgICAgICAgICB0eXBlPSJ0bnM6SUQiIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaWNrbGlzdEZvclJlY29yZFR5cGUiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGlja2xpc3ROYW1lIiAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGlja2xpc3RWYWx1ZXMiICAgIHR5cGU9InRuczpQaWNrbGlzdEVudHJ5IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJlVGFiU2V0UmVzdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxhYmVsIiAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibG9nb1VybCIJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZWxlY3RlZCIJCXR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0YWJzIgkJCXR5cGU9InRuczpEZXNjcmliZVRhYiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmVUYWIiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY3VzdG9tIiAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxhYmVsIiAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNvYmplY3ROYW1lIiAgICAgIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1cmwiICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPCEtLSBMb2dpbiBNZXNzYWdlIFR5cGVzIC0tPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlcm5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImxvZ2luUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6TG9naW5SZXN1bHQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8IS0tIERlc2NyaWJlIE1lc3NhZ2UgVHlwZXMgLS0+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJkZXNjcmliZVNPYmplY3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic09iamVjdFR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpYmVTT2JqZWN0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6RGVzY3JpYmVTT2JqZWN0UmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPCEtLSBEZXNjaWJlU09iamVjdHMgTWVzc2FnZSBUeXBlcyAtLT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaWJlU09iamVjdHMiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic09iamVjdFR5cGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPScxMDAnIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaWJlU09iamVjdHNSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InRuczpEZXNjcmliZVNPYmplY3RSZXN1bHQiIG1pbk9jY3Vycz0nMCcgbWF4T2NjdXJzPScxMDAnLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgCi0gICAgICAgICAgICA8IS0tIERlc2NyaWJlIEdsb2JhbCBNZXNzYWdlIFR5cGVzIC0tPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpYmVHbG9iYWwiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4gCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZS8+IAotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+IAotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpYmVHbG9iYWxSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InRuczpEZXNjcmliZUdsb2JhbFJlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaWJlTGF5b3V0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNPYmplY3RUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaWJlTGF5b3V0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6RGVzY3JpYmVMYXlvdXRSZXN1bHQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PiAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpYmVUYWJzIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZS8+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlc2NyaWJlVGFic1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0idG5zOkRlc2NyaWJlVGFiU2V0UmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPCEtLSBDcmVhdGUgTWVzc2FnZSBUeXBlcyAtLT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNyZWF0ZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzT2JqZWN0cyIgdHlwZT0iZW5zOnNPYmplY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY3JlYXRlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6U2F2ZVJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLQotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIDwhLS0gVXBkYXRlIE1lc3NhZ2UgVHlwZXMgLS0+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1cGRhdGUiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic09iamVjdHMiIHR5cGU9ImVuczpzT2JqZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVwZGF0ZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0idG5zOlNhdmVSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8IS0tIFVwc2VydCBNZXNzYWdlIFR5cGVzIC0tPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXBzZXJ0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgCTxlbGVtZW50IG5hbWU9ImV4dGVybmFsSURGaWVsZE5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNPYmplY3RzIiB0eXBlPSJlbnM6c09iamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1cHNlcnRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InRuczpVcHNlcnRSZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8IS0tIERlbGV0ZSBNZXNzYWdlIFR5cGVzIC0tPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGVsZXRlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImlkcyIgdHlwZT0idG5zOklEIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlbGV0ZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0idG5zOkRlbGV0ZVJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDwhLS0gUmV0cmlldmUgKElEIExpc3QpIE1lc3NhZ2UgVHlwZXMgLS0+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXRyaWV2ZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZExpc3QiICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic09iamVjdFR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImlkcyIgICAgICAgICB0eXBlPSJ0bnM6SUQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmV0cmlldmVSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9ImVuczpzT2JqZWN0IiBuaWxsYWJsZT0idHJ1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDwhLS0gQ29udmVydCBMZWFkIE1lc3NhZ2UgVHlwZXMgLS0+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb252ZXJ0TGVhZCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsZWFkQ29udmVydHMiIHR5cGU9InRuczpMZWFkQ29udmVydCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb252ZXJ0TGVhZFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0idG5zOkxlYWRDb252ZXJ0UmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPCEtLSBHZXQgVXBkYXRlZCBNZXNzYWdlIFR5cGVzIC0tPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0VXBkYXRlZCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzT2JqZWN0VHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVuZERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRVcGRhdGVkUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6R2V0VXBkYXRlZFJlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDwhLS0gR2V0IERlbGV0ZWQgTWVzc2FnZSBUeXBlcyAtLT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdldERlbGV0ZWQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic09iamVjdFR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlbmREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0RGVsZXRlZFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0idG5zOkdldERlbGV0ZWRSZXN1bHQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8IS0tIENyZWF0ZSBRdWVyeSAtLT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InF1ZXJ5Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InF1ZXJ5U3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InF1ZXJ5UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6UXVlcnlSZXN1bHQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8IS0tIE5leHQgQmF0Y2ggb2Ygc09iamVjdHMgZnJvbSBhIHF1ZXJ5IC0tPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icXVlcnlNb3JlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InF1ZXJ5TG9jYXRvciIgdHlwZT0idG5zOlF1ZXJ5TG9jYXRvciIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJxdWVyeU1vcmVSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InRuczpRdWVyeVJlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLQotCi0gICAgICAgICAgICA8IS0tIENyZWF0ZSBTZWFyY2ggLS0+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZWFyY2giPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2VhcmNoU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNlYXJjaFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdCIgdHlwZT0idG5zOlNlYXJjaFJlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLQotICAgICAgICAgICAgCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRTZXJ2ZXJUaW1lc3RhbXAiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4gCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZS8+IAotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+IAotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0U2VydmVyVGltZXN0YW1wUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6R2V0U2VydmVyVGltZXN0YW1wUmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2V0UGFzc3dvcmQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idXNlcklkIiB0eXBlPSJ0bnM6SUQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InNldFBhc3N3b3JkUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ0bnM6U2V0UGFzc3dvcmRSZXN1bHQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNldFBhc3N3b3JkIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZXJJZCIgdHlwZT0idG5zOklEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc2V0UGFzc3dvcmRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InRuczpSZXNldFBhc3N3b3JkUmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0VXNlckluZm8iPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4gCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZS8+IAotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+IAotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0VXNlckluZm9SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InRuczpHZXRVc2VySW5mb1Jlc3VsdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLQotCi0gICAgICAgICAgICA8IS0tIEhlYWRlciBFbGVtZW50cyAtLT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlNlc3Npb25IZWFkZXIiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2Vzc2lvbklkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+IAotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLQotICAgICAgICAgICAgCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJRdWVyeU9wdGlvbnMiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYmF0Y2hTaXplIiAgICAgICB0eXBlPSJ4c2Q6aW50IiBtaW5PY2N1cnM9IjAiLz4KLQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0KLQotICAgICAgICAKLSAgICAgICAgCTwhLS0gaWRlYWxseSB0aGlzIGNvdWxkIG9mIGp1c3QgYmVlbiBlbGVtIG5hbWU9Ii4uLiIgdHlwZT0ieHNkOmJvb2xlYW4iIAotCSAgICAgICAgCWhvd2V2ZXIgZm9yIHNvbWUgcmVhc29uIC5ORVQgMS4xIGNhbid0IGhhbmRsZSB0aGF0LCBzbyB3ZSBlbmQgdXAgaGF2aW5nCi0JICAgICAgICAJdG8gY3JlYXRlIGEgbmVzdGVkIGNvbXBsZXhUeXBlIHRvIGtlZXAgLk5FVCBoYXBweSwgYWxsIHRob3NlIHdhc3RlZCBieXRlcyAtLT4KLSAgICAgICAgCTxlbGVtZW50IG5hbWU9Ik1ydUhlYWRlciI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1cGRhdGVNcnUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIAkgICAgCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50UnVsZUhlYWRlciI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhc3NpZ25tZW50UnVsZUlkIiAgICB0eXBlPSJ0bnM6SUQiICBuaWxsYWJsZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InVzZURlZmF1bHRSdWxlIiAgICAgIHR5cGU9InhzZDpib29sZWFuIiBuaWxsYWJsZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgCi0gICAgICAgIDwvc2NoZW1hPgotCi0gICAgICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46ZmF1bHQuZW50ZXJwcmlzZS5zb2FwLnNmb3JjZS5jb20iIHhtbG5zOmZucz0idXJuOmZhdWx0LmVudGVycHJpc2Uuc29hcC5zZm9yY2UuY29tIj4KLQotICAgICAgICAgICAgPHNpbXBsZVR5cGUgbmFtZT0iRXhjZXB0aW9uQ29kZSI+Ci0gICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkFQSV9DVVJSRU5UTFlfRElTQUJMRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJBUElfRElTQUJMRURfRk9SX09SRyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkVNQUlMX1RPX0NBU0VfTElNSVRfRVhDRUVERUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFTUFJTF9UT19DQVNFX05PVF9FTkFCTEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRUVERURfSURfTElNSVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFWENFRURFRF9MRUFEX0NPTlZFUlRfTElNSVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFWENFRURFRF9NQVhfU0laRV9SRVFVRVNUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRUVERURfTUFYX1RZUEVTX0xJTUlUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRUVERURfUVVPVEEiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJFWENFRURFRF9SQVRFX0xJTUlUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iRlVOQ1RJT05BTElUWV9OT1RfRU5BQkxFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklNQUdFX1RPT19MQVJHRSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOQUNUSVZFX09XTkVSX09SX1VTRVIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlNVRkZJQ0lFTlRfQUNDRVNTIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9BU1NJR05NRU5UX1JVTEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0JBVENIX1NJWkUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0NMSUVOVCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfQ1JPU1NfUkVGRVJFTkNFX0tFWSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfRklFTEQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX0lEX0ZJRUxEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9MT0dJTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfTkVXX1BBU1NXT1JEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9PUEVSQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX09QRVJBVElPTl9XSVRIX0VYUElSRURfUEFTU1dPUkQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX1FVRVJZX0ZJTFRFUl9PUEVSQVRPUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfUVVFUllfTE9DQVRPUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfUVVFUllfU0NPUEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX1JFUExJQ0FUSU9OX0RBVEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEX1NFQVJDSCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfU0VBUkNIX1NDT1BFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9TRVNTSU9OX0lEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9TT0FQX0hFQURFUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURfU1NPX0dBVEVXQVlfVVJMIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9UWVBFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJRF9UWVBFX0ZPUl9PUEVSQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJMT0dJTl9EVVJJTkdfUkVTVFJJQ1RFRF9ET01BSU4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJMT0dJTl9EVVJJTkdfUkVTVFJJQ1RFRF9USU1FIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFMRk9STUVEX0lEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFMRk9STUVEX1FVRVJZIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTUFMRk9STUVEX1NFQVJDSCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1JU1NJTkdfQVJHVU1FTlQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJOT1RfTU9ESUZJRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJPUEVSQVRJT05fVE9PX0xBUkdFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iT1JHX0xPQ0tFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBBU1NXT1JEX0xPQ0tPVVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJRVUVSWV9USU1FT1VUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUVVFUllfVE9PX0NPTVBMSUNBVEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iUkVRVUVTVF9MSU1JVF9FWENFRURFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlJFUVVFU1RfUlVOTklOR19UT09fTE9ORyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNFUlZFUl9VTkFWQUlMQUJMRSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlNTT19TRVJWSUNFX0RPV04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJUUklBTF9FWFBJUkVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iVU5LTk9XTl9FWENFUFRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJVTlNVUFBPUlRFRF9BUElfVkVSU0lPTiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlVOU1VQUE9SVEVEX0NMSUVOVCIvPgotICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8IS0tIEZvciBjb252ZW5pZW5jZSB0aGVzZSBRTmFtZXMgYXJlIHJldHVybmVkIGluIHRoZSBzdGFuZGFyZCBzb2FwIGZhdWx0Y29kZSBlbGVtZW50IC0tPgotICAgICAgICAgICAgPHNpbXBsZVR5cGUgbmFtZT0iRmF1bHRDb2RlIj4KLSAgICAgICAgICAgICAgICA8cmVzdHJpY3Rpb24gYmFzZT0ieHNkOlFOYW1lIj4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6QVBJX0NVUlJFTlRMWV9ESVNBQkxFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpBUElfRElTQUJMRURfRk9SX09SRyIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpFTUFJTF9UT19DQVNFX0xJTUlUX0VYQ0VFREVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOkVNQUlMX1RPX0NBU0VfTk9UX0VOQUJMRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6RVhDRUVERURfSURfTElNSVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6RVhDRUVERURfTEVBRF9DT05WRVJUX0xJTUlUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOkVYQ0VFREVEX01BWF9TSVpFX1JFUVVFU1QiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6RVhDRUVERURfTUFYX1RZUEVTX0xJTUlUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOkVYQ0VFREVEX1FVT1RBIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOkVYQ0VFREVEX1JBVEVfTElNSVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6RlVOQ1RJT05BTElUWV9OT1RfRU5BQkxFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTUFHRV9UT09fTEFSR0UiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5BQ1RJVkVfT1dORVJfT1JfVVNFUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlNVRkZJQ0lFTlRfQUNDRVNTIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOklOVkFMSURfQVNTSUdOTUVOVF9SVUxFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOklOVkFMSURfQkFUQ0hfU0laRSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX0NMSUVOVCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX0NST1NTX1JFRkVSRU5DRV9LRVkiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5WQUxJRF9GSUVMRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX0lEX0ZJRUxEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOklOVkFMSURfTE9HSU4iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5WQUxJRF9ORVdfUEFTU1dPUkQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5WQUxJRF9PUEVSQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5WQUxJRF9PUEVSQVRJT05fV0lUSF9FWFBJUkVEX1BBU1NXT1JEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOklOVkFMSURfUVVFUllfRklMVEVSX09QRVJBVE9SIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOklOVkFMSURfUVVFUllfTE9DQVRPUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX1FVRVJZX1NDT1BFIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOklOVkFMSURfUkVQTElDQVRJT05fREFURSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX1NFQVJDSCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX1NFQVJDSF9TQ09QRSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX1NFU1NJT05fSUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5WQUxJRF9TT0FQX0hFQURFUiIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX1NTT19HQVRFV0FZX1VSTCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpJTlZBTElEX1RZUEUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6SU5WQUxJRF9UWVBFX0ZPUl9PUEVSQVRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6TE9HSU5fRFVSSU5HX1JFU1RSSUNURURfRE9NQUlOIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOkxPR0lOX0RVUklOR19SRVNUUklDVEVEX1RJTUUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6TUFMRk9STUVEX0lEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOk1BTEZPUk1FRF9RVUVSWSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpNQUxGT1JNRURfU0VBUkNIIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOk1JU1NJTkdfQVJHVU1FTlQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6Tk9UX01PRElGSUVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOk9QRVJBVElPTl9UT09fTEFSR0UiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6T1JHX0xPQ0tFRCIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpQQVNTV09SRF9MT0NLT1VUIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOlFVRVJZX1RJTUVPVVQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6UVVFUllfVE9PX0NPTVBMSUNBVEVEIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOlJFUVVFU1RfTElNSVRfRVhDRUVERUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6UkVRVUVTVF9SVU5OSU5HX1RPT19MT05HIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOlNFUlZFUl9VTkFWQUlMQUJMRSIvPgotICAgICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImZuczpTU09fU0VSVklDRV9ET1dOIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZm5zOlRSSUFMX0VYUElSRUQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6VU5LTk9XTl9FWENFUFRJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6VU5TVVBQT1JURURfQVBJX1ZFUlNJT04iLz4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJmbnM6VU5TVVBQT1JURURfQ0xJRU5UIi8+Ci0gICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLQotCi0gICAgICAgICAgICA8IS0tIEZhdWx0IC0tPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFwaUZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2VwdGlvbkNvZGUiICAgIHR5cGU9ImZuczpFeGNlcHRpb25Db2RlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2VwdGlvbk1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXBpUXVlcnlGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImZuczpBcGlGYXVsdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyb3ciIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJMb2dpbkZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZm5zOkFwaUZhdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJMb2dpbkZhdWx0IiB0eXBlPSJmbnM6TG9naW5GYXVsdCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iSW52YWxpZFF1ZXJ5TG9jYXRvckZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZm5zOkFwaUZhdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJbnZhbGlkUXVlcnlMb2NhdG9yRmF1bHQiIHR5cGU9ImZuczpJbnZhbGlkUXVlcnlMb2NhdG9yRmF1bHQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkludmFsaWROZXdQYXNzd29yZEZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZm5zOkFwaUZhdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJbnZhbGlkTmV3UGFzc3dvcmRGYXVsdCIgdHlwZT0iZm5zOkludmFsaWROZXdQYXNzd29yZEZhdWx0Ii8+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJJbnZhbGlkSWRGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9ImZuczpBcGlGYXVsdCIvPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSW52YWxpZElkRmF1bHQiIHR5cGU9ImZuczpJbnZhbGlkSWRGYXVsdCIvPgotCi0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJmbnM6QXBpRmF1bHQiLz4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB0eXBlPSJmbnM6VW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkludmFsaWRGaWVsZEZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZm5zOkFwaVF1ZXJ5RmF1bHQiLz4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkludmFsaWRGaWVsZEZhdWx0IiB0eXBlPSJmbnM6SW52YWxpZEZpZWxkRmF1bHQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJmbnM6QXBpUXVlcnlGYXVsdCIvPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdHlwZT0iZm5zOkludmFsaWRTT2JqZWN0RmF1bHQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik1hbGZvcm1lZFF1ZXJ5RmF1bHQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJmbnM6QXBpUXVlcnlGYXVsdCIvPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iTWFsZm9ybWVkUXVlcnlGYXVsdCIgdHlwZT0iZm5zOk1hbGZvcm1lZFF1ZXJ5RmF1bHQiLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9Ik1hbGZvcm1lZFNlYXJjaEZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0iZm5zOkFwaVF1ZXJ5RmF1bHQiLz4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik1hbGZvcm1lZFNlYXJjaEZhdWx0IiB0eXBlPSJmbnM6TWFsZm9ybWVkU2VhcmNoRmF1bHQiLz4KLQotCi0gICAgICAgIDwvc2NoZW1hPgotCi0gICAgPC90eXBlcz4KLSAgICAKLSAgICA8IS0tIEhlYWRlciBNZXNzYWdlIC0tPgotICAgIDxtZXNzYWdlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpTZXNzaW9uSGVhZGVyIiAgICAJCQluYW1lPSJTZXNzaW9uSGVhZGVyIi8+Ci0KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOlF1ZXJ5T3B0aW9ucyIgICAgIAkJCW5hbWU9IlF1ZXJ5T3B0aW9ucyIvPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6QXNzaWdubWVudFJ1bGVIZWFkZXIiICAgCQluYW1lPSJBc3NpZ25tZW50UnVsZUhlYWRlciIvPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6TXJ1SGVhZGVyIiAgIAkJCQkJbmFtZT0iTXJ1SGVhZGVyIi8+Ci0KLSAgICA8L21lc3NhZ2U+Ci0gICAgCi0gICAgPCEtLSBGYXVsdCBNZXNzYWdlcyAtLT4KLSAgICAKLSAgICA8bWVzc2FnZSBuYW1lPSJBcGlGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiB0eXBlPSJmbnM6QXBpRmF1bHQiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJMb2dpbkZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9ImZuczpMb2dpbkZhdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkludmFsaWRRdWVyeUxvY2F0b3JGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJmbnM6SW52YWxpZFF1ZXJ5TG9jYXRvckZhdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkludmFsaWROZXdQYXNzd29yZEZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9ImZuczpJbnZhbGlkTmV3UGFzc3dvcmRGYXVsdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJJbnZhbGlkSWRGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJmbnM6SW52YWxpZElkRmF1bHQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJmYXVsdCIgZWxlbWVudD0iZm5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkludmFsaWRGaWVsZEZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9ImZuczpJbnZhbGlkRmllbGRGYXVsdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9ImZuczpJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9Ik1hbGZvcm1lZFF1ZXJ5RmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJmYXVsdCIgZWxlbWVudD0iZm5zOk1hbGZvcm1lZFF1ZXJ5RmF1bHQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iTWFsZm9ybWVkU2VhcmNoRmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJmYXVsdCIgZWxlbWVudD0iZm5zOk1hbGZvcm1lZFNlYXJjaEZhdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgCi0gICAgPCEtLSBNZXRob2QgTWVzc2FnZXMgLS0+Ci0gICAgCi0gICAgPG1lc3NhZ2UgbmFtZT0ibG9naW5SZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmxvZ2luIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImxvZ2luUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6bG9naW5SZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImRlc2NyaWJlU09iamVjdFJlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6ZGVzY3JpYmVTT2JqZWN0IiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImRlc2NyaWJlU09iamVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmRlc2NyaWJlU09iamVjdFJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZGVzY3JpYmVTT2JqZWN0c1JlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6ZGVzY3JpYmVTT2JqZWN0cyIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJkZXNjcmliZVNPYmplY3RzUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6ZGVzY3JpYmVTT2JqZWN0c1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIAotICAgIDxtZXNzYWdlIG5hbWU9ImRlc2NyaWJlR2xvYmFsUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpkZXNjcmliZUdsb2JhbCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJkZXNjcmliZUdsb2JhbFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmRlc2NyaWJlR2xvYmFsUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJkZXNjcmliZUxheW91dFJlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6ZGVzY3JpYmVMYXlvdXQiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZGVzY3JpYmVMYXlvdXRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpkZXNjcmliZUxheW91dFJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZGVzY3JpYmVUYWJzUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpkZXNjcmliZVRhYnMiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZGVzY3JpYmVUYWJzUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6ZGVzY3JpYmVUYWJzUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLQotCi0gICAgPG1lc3NhZ2UgbmFtZT0iY3JlYXRlUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpjcmVhdGUiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iY3JlYXRlUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6Y3JlYXRlUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJ1cGRhdGVSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOnVwZGF0ZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJ1cGRhdGVSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczp1cGRhdGVSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9InVwc2VydFJlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6dXBzZXJ0IiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9InVwc2VydFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOnVwc2VydFJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZGVsZXRlUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpkZWxldGUiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZGVsZXRlUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6ZGVsZXRlUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJyZXRyaWV2ZVJlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6cmV0cmlldmUiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0icmV0cmlldmVSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpyZXRyaWV2ZVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iY29udmVydExlYWRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmNvbnZlcnRMZWFkIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImNvbnZlcnRMZWFkUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6Y29udmVydExlYWRSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImdldERlbGV0ZWRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmdldERlbGV0ZWQiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZ2V0RGVsZXRlZFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmdldERlbGV0ZWRSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImdldFVwZGF0ZWRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmdldFVwZGF0ZWQiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZ2V0VXBkYXRlZFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmdldFVwZGF0ZWRSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9InF1ZXJ5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpxdWVyeSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJxdWVyeVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOnF1ZXJ5UmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJxdWVyeU1vcmVSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOnF1ZXJ5TW9yZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJxdWVyeU1vcmVSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpxdWVyeU1vcmVSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotCi0KLSAgICA8bWVzc2FnZSBuYW1lPSJzZWFyY2hSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOnNlYXJjaCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJzZWFyY2hSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpzZWFyY2hSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotCi0gICAgCi0gICAgPG1lc3NhZ2UgbmFtZT0iZ2V0U2VydmVyVGltZXN0YW1wUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpnZXRTZXJ2ZXJUaW1lc3RhbXAiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZ2V0U2VydmVyVGltZXN0YW1wUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6Z2V0U2VydmVyVGltZXN0YW1wUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJzZXRQYXNzd29yZFJlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6c2V0UGFzc3dvcmQiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0ic2V0UGFzc3dvcmRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InRuczpzZXRQYXNzd29yZFJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0icmVzZXRQYXNzd29yZFJlcXVlc3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6cmVzZXRQYXNzd29yZCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJyZXNldFBhc3N3b3JkUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6cmVzZXRQYXNzd29yZFJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZ2V0VXNlckluZm9SZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idG5zOmdldFVzZXJJbmZvIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImdldFVzZXJJbmZvUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0bnM6Z2V0VXNlckluZm9SZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLQotCi0KLSAgICA8IS0tIFNvYXAgUG9ydFR5cGUgLS0+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlNvYXAiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkxvZ2luIHRvIHRoZSBTYWxlc2ZvcmNlLmNvbSBTT0FQIEFwaS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczpsb2dpblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmxvZ2luUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkxvZ2luRmF1bHQiIG5hbWU9IkxvZ2luRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzY3JpYmVTT2JqZWN0Ij4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkRlc2NyaWJlIGFuIHNPYmplY3Q8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmRlc2NyaWJlU09iamVjdFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmRlc2NyaWJlU09iamVjdFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXNjcmliZVNPYmplY3RzIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkRlc2NyaWJlIGEgbnVtYmVyIHNPYmplY3RzPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpkZXNjcmliZVNPYmplY3RzUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZGVzY3JpYmVTT2JqZWN0c1Jlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXNjcmliZUdsb2JhbCI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5EZXNjcmliZSB0aGUgR2xvYmFsIHN0YXRlPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpkZXNjcmliZUdsb2JhbFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmRlc2NyaWJlR2xvYmFsUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImRlc2NyaWJlTGF5b3V0Ij4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkRlc2NyaWJlIHRoZSBsYXlvdXQgb2YgYW4gc09iamVjdDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZGVzY3JpYmVMYXlvdXRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpkZXNjcmliZUxheW91dFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXNjcmliZVRhYnMiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+RGVzY3JpYmUgdGhlIHRhYnMgdGhhdCBhcHBlYXIgb24gYSB1c2VycyBwYWdlPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpkZXNjcmliZVRhYnNSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpkZXNjcmliZVRhYnNSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6VW5leHBlY3RlZEVycm9yRmF1bHQiIG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGUiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Q3JlYXRlIGEgc2V0IG9mIG5ldyBzT2JqZWN0czwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOmNyZWF0ZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmNyZWF0ZVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkludmFsaWRJZEZhdWx0IiBuYW1lPSJJbnZhbGlkSWRGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InVwZGF0ZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5VcGRhdGUgYSBzZXQgb2Ygc09iamVjdHM8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczp1cGRhdGVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczp1cGRhdGVSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6SW52YWxpZFNPYmplY3RGYXVsdCIgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6VW5leHBlY3RlZEVycm9yRmF1bHQiIG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkSWRGYXVsdCIgbmFtZT0iSW52YWxpZElkRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIAotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InVwc2VydCI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5VcGRhdGUgb3IgaW5zZXJ0IGEgc2V0IG9mIHNPYmplY3RzIGJhc2VkIG9uIG9iamVjdCBpZDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOnVwc2VydFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOnVwc2VydFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkludmFsaWRJZEZhdWx0IiBuYW1lPSJJbnZhbGlkSWRGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZGVsZXRlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkRlbGV0ZSBhIHNldCBvZiBzT2JqZWN0czwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOmRlbGV0ZVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmRlbGV0ZVJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIAotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InJldHJpZXZlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkdldCBhIHNldCBvZiBzT2JqZWN0czwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOnJldHJpZXZlUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6cmV0cmlldmVSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6SW52YWxpZFNPYmplY3RGYXVsdCIgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6SW52YWxpZEZpZWxkRmF1bHQiIG5hbWU9IkludmFsaWRGaWVsZEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb252ZXJ0TGVhZCI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5jb252ZXJ0IGEgc2V0IG9mIGxlYWRzPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6Y29udmVydExlYWRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpjb252ZXJ0TGVhZFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXREZWxldGVkIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkdldCB0aGUgSURzIGZvciBkZWxldGVkIHNPYmplY3RzPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6Z2V0RGVsZXRlZFJlcXVlc3QiIC8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXREZWxldGVkUmVzcG9uc2UiIC8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRVcGRhdGVkIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPkdldCB0aGUgSURzIGZvciB1cGRhdGVkIHNPYmplY3RzPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6Z2V0VXBkYXRlZFJlcXVlc3QiIC8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRVcGRhdGVkUmVzcG9uc2UiIC8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkU09iamVjdEZhdWx0IiBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpVbmV4cGVjdGVkRXJyb3JGYXVsdCIgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJxdWVyeSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5DcmVhdGUgYSBRdWVyeSBDdXJzb3I8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczpxdWVyeVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOnF1ZXJ5UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkludmFsaWRTT2JqZWN0RmF1bHQiIG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkludmFsaWRGaWVsZEZhdWx0IiBuYW1lPSJJbnZhbGlkRmllbGRGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6TWFsZm9ybWVkUXVlcnlGYXVsdCIgbmFtZT0iTWFsZm9ybWVkUXVlcnlGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6VW5leHBlY3RlZEVycm9yRmF1bHQiIG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAKLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJxdWVyeU1vcmUiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+R2V0cyB0aGUgbmV4dCBiYXRjaCBvZiBzT2JqZWN0cyBmcm9tIGEgcXVlcnk8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczpxdWVyeU1vcmVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpxdWVyeU1vcmVSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6SW52YWxpZFF1ZXJ5TG9jYXRvckZhdWx0IiBuYW1lPSJJbnZhbGlkUXVlcnlMb2NhdG9yRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotCi0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJzZWFyY2giPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+U2VhcmNoIGZvciBzT2JqZWN0czwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOnNlYXJjaFJlcXVlc3QiIC8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpzZWFyY2hSZXNwb25zZSIgLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkludmFsaWRTT2JqZWN0RmF1bHQiIG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOkludmFsaWRGaWVsZEZhdWx0IiBuYW1lPSJJbnZhbGlkRmllbGRGYXVsdCIgLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOk1hbGZvcm1lZFNlYXJjaEZhdWx0IiBuYW1lPSJNYWxmb3JtZWRTZWFyY2hGYXVsdCIgLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotCi0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRTZXJ2ZXJUaW1lc3RhbXAiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+R2V0cyBzZXJ2ZXIgdGltZXN0YW1wPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6Z2V0U2VydmVyVGltZXN0YW1wUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0U2VydmVyVGltZXN0YW1wUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InNldFBhc3N3b3JkIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlNldCBhIHVzZXIncyBwYXNzd29yZDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOnNldFBhc3N3b3JkUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6c2V0UGFzc3dvcmRSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6SW52YWxpZElkRmF1bHQiIG5hbWU9IkludmFsaWRJZEZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkTmV3UGFzc3dvcmRGYXVsdCIgbmFtZT0iSW52YWxpZE5ld1Bhc3N3b3JkRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InJlc2V0UGFzc3dvcmQiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+UmVzZXQgYSB1c2VyJ3MgcGFzc3dvcmQ8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczpyZXNldFBhc3N3b3JkUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6cmVzZXRQYXNzd29yZFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgIG1lc3NhZ2U9InRuczpJbnZhbGlkSWRGYXVsdCIgbmFtZT0iSW52YWxpZElkRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCAgbWVzc2FnZT0idG5zOlVuZXhwZWN0ZWRFcnJvckZhdWx0IiBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFVzZXJJbmZvIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlJldHVybnMgc3RhbmRhcmQgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgdXNlcjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOmdldFVzZXJJbmZvUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0VXNlckluZm9SZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0ICBtZXNzYWdlPSJ0bnM6VW5leHBlY3RlZEVycm9yRmF1bHQiIG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0KLSAgICAgICAgCi0KLQk8L3BvcnRUeXBlPiAKLSAgICA8IS0tIFNvYXAgQmluZGluZyAtLT4KLSAgICA8YmluZGluZyBuYW1lPSJTb2FwQmluZGluZyIgdHlwZT0idG5zOlNvYXAiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibG9naW4iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4gCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkxvZ2luRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iTG9naW5GYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIAotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImRlc2NyaWJlU09iamVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZGVzY3JpYmVTT2JqZWN0cyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAKLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXNjcmliZUdsb2JhbCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImRlc2NyaWJlTGF5b3V0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZXNzaW9uSGVhZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJkZXNjcmliZVRhYnMiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjcmVhdGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IkFzc2lnbm1lbnRSdWxlSGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iTXJ1SGVhZGVyIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElkRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRJZEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0idXBkYXRlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZXNzaW9uSGVhZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJBc3NpZ25tZW50UnVsZUhlYWRlciIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9Ik1ydUhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElkRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRJZEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0idXBzZXJ0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZXNzaW9uSGVhZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJBc3NpZ25tZW50UnVsZUhlYWRlciIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9Ik1ydUhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElkRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRJZEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZGVsZXRlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZXNzaW9uSGVhZGVyIi8+Ci0KLQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InJldHJpZXZlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZXNzaW9uSGVhZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJRdWVyeU9wdGlvbnMiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZEZpZWxkRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZEZpZWxkRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29udmVydExlYWQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldERlbGV0ZWQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRVcGRhdGVkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6SGVhZGVyIiBwYXJ0PSJTZXNzaW9uSGVhZGVyIi8+Ci0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0icXVlcnkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlF1ZXJ5T3B0aW9ucyIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkludmFsaWRTT2JqZWN0RmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJJbnZhbGlkRmllbGRGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJJbnZhbGlkRmllbGRGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJNYWxmb3JtZWRRdWVyeUZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9Ik1hbGZvcm1lZFF1ZXJ5RmF1bHQiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJxdWVyeU1vcmUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlF1ZXJ5T3B0aW9ucyIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkludmFsaWRRdWVyeUxvY2F0b3JGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJJbnZhbGlkUXVlcnlMb2NhdG9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9InNlYXJjaCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFNPYmplY3RGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJJbnZhbGlkU09iamVjdEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZEZpZWxkRmF1bHQiPgotICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZEZpZWxkRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJNYWxmb3JtZWRTZWFyY2hGYXVsdCI+Ci0gICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJNYWxmb3JtZWRTZWFyY2hGYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotCi0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRTZXJ2ZXJUaW1lc3RhbXAiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpIZWFkZXIiIHBhcnQ9IlNlc3Npb25IZWFkZXIiLz4KLQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJzZXRQYXNzd29yZCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElkRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRJZEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkludmFsaWROZXdQYXNzd29yZEZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJJbnZhbGlkTmV3UGFzc3dvcmRGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4gICAgICAgICAgICAKLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPiAKLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0icmVzZXRQYXNzd29yZCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZElkRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRJZEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJVbmV4cGVjdGVkRXJyb3JGYXVsdCIgdXNlPSJsaXRlcmFsIi8+IAotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRVc2VySW5mbyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOkhlYWRlciIgcGFydD0iU2Vzc2lvbkhlYWRlciIvPgotCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iVW5leHBlY3RlZEVycm9yRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlVuZXhwZWN0ZWRFcnJvckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4gCi0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotCi0KLSAKLQotICAgIDwvYmluZGluZz4KLSAgICAKLSAgICA8IS0tIFNvYXAgU2VydmljZSBFbmRwb2ludCAtLT4KLSAgICA8c2VydmljZSBuYW1lPSJTZm9yY2VTZXJ2aWNlIj4KLSAgICAgICAgPGRvY3VtZW50YXRpb24+U2ZvcmNlIFNPQVAgQVBJPC9kb2N1bWVudGF0aW9uPgotICAgICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6U29hcEJpbmRpbmciIG5hbWU9IlNvYXAiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cHM6Ly93d3cuc2FsZXNmb3JjZS5jb20vc2VydmljZXMvU29hcC9jLzcuMCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgotICAgIAotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9taW1lX21lc3NhZ2UudHh0IGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbWltZV9tZXNzYWdlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3NDFlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9taW1lX21lc3NhZ2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLS0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RAotY29udGVudC10eXBlOnRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTsgZm9ybWF0PWZsb3dlZAotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzpiaW5hcnkKLWNvbnRlbnQtaWQ6PDAuMTVCNTBFRjQ5MzE3NTE4QjAxQGFwYWNoZS5vcmc+Ci0KLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj48c29hcGVudjpIZWFkZXI+PHdzYTpUbyB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+aHR0cDovL2xvY2FsaG9zdDo4MDcwL2F4aXMyL3NlcnZpY2VzL01UT01TZXJ2aWNlL210b21TYW1wbGU8L3dzYTpUbz48L3NvYXBlbnY6SGVhZGVyPjxzb2FwZW52OkJvZHk+PHg6RWNob1Rlc3QgeG1sbnM6eD0iaHR0cDovL2V4YW1wbGUub3JnL210b20vZGF0YSI+PHg6RGF0YT48eG9wOkluY2x1ZGUgaHJlZj0iY2lkOjEuQkJGQzhENDhBMjEyNThFQkJEQGFwYWNoZS5vcmciIHhtbG5zOnhvcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZSI+PC94b3A6SW5jbHVkZT48L3g6RGF0YT48eDpEYXRhPjx4b3A6SW5jbHVkZSBocmVmPSJjaWQ6Mi5DQjM2NUUzNkUyMUJENjQ5MUFAYXBhY2hlLm9yZyIgeG1sbnM6eG9wPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIj48L3hvcDpJbmNsdWRlPjwveDpEYXRhPjwveDpFY2hvVGVzdD48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+Ci0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZECi1jb250ZW50LWlkOjwxMS5CQkZDOEQ0OEEyMTI1OEVCQkRAYXBhY2hlLm9yZz4KLWNvbnRlbnQtdHlwZTp0ZXh0L2NzdjtuYW1lPSJ0ZXN0LmNzdiIKLWNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6YmluYXJ5Ci0KLXNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSAKLQotLS0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RAotY29udGVudC1pZDo8Mi5DQjM2NUUzNkUyMUJENjQ5MUFAYXBhY2hlLm9yZz4KLWNvbnRlbnQtdHlwZTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLWNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6YmluYXJ5Ci0KLXNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSAKLQotLS0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RC0tCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9tdG9tL01UT00tZW5hYmxlZC1heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9tdG9tL01UT00tZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjZhNTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWVuYWJsZWQtYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBSRVNUIHN1cHBvcnQgLS0+Ci0gICAgPCEtLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVhbmJsZVJFU1QiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIFJlcXVlc3QgUmVzcG9uc2Ugc3R5bGUgT3BlcmF0aW9ucyAtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgQWRkcmVzc2luZy0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+IAotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWZpbGVDYWNoZS1lbmFibGVkLWF4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL210b20vTVRPTS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjQxZjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS9NVE9NLWZpbGVDYWNoZS1lbmFibGVkLWF4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPnRhcmdldC90ZXN0LXJlc291cmNlcy88L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlcj4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBSRVNUIHN1cHBvcnQgLS0+Ci0gICAgPCEtLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVhbmJsZVJFU1QiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIFJlcXVlc3QgUmVzcG9uc2Ugc3R5bGUgT3BlcmF0aW9ucyAtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgQWRkcmVzc2luZy0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+IAotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS90ZXN0LmpwZyBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL210b20vdGVzdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YzEwY2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS90ZXN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL210b20vd210b20uYmluIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS93bXRvbS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjljOGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbXRvbS93bXRvbS5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZECi1jb250ZW50LXR5cGU6YXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD11dGYtODsgdHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiCi1jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOmJpbmFyeQotY29udGVudC1pZDo8MC4xNUI1MEVGNDkzMTc1MThCMDFAYXBhY2hlLm9yZz4KLQotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiPjxzb2FwZW52OkhlYWRlcj48d3NhOlRvIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj5odHRwOi8vbG9jYWxob3N0OjgwNzAvYXhpczIvc2VydmljZXMvTVRPTVNlcnZpY2UvbXRvbVNhbXBsZTwvd3NhOlRvPjwvc29hcGVudjpIZWFkZXI+PHNvYXBlbnY6Qm9keT48eDpFY2hvVGVzdCB4bWxuczp4PSJodHRwOi8vZXhhbXBsZS5vcmcvbXRvbS9kYXRhIj48eDpEYXRhPjx4b3A6SW5jbHVkZSBocmVmPSJjaWQ6MS5CQkZDOEQ0OEEyMTI1OEVCQkRAYXBhY2hlLm9yZyIgeG1sbnM6eG9wPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3hvcC9pbmNsdWRlIj48L3hvcDpJbmNsdWRlPjwveDpEYXRhPjx4OkRhdGE+PHhvcDpJbmNsdWRlIGhyZWY9ImNpZDoyLkNCMzY1RTM2RTIxQkQ2NDkxQUBhcGFjaGUub3JnIiB4bWxuczp4b3A9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiPjwveG9wOkluY2x1ZGU+PC94OkRhdGE+PC94OkVjaG9UZXN0Pjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4KLS0tLS1NSU1FQm91bmRhcnkyNThERTJEMTA1Mjk4Qjc1NkQKLWNvbnRlbnQtaWQ6PDExLkJCRkM4RDQ4QTIxMjU4RUJCREBhcGFjaGUub3JnPgotY29udGVudC10eXBlOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzpiaW5hcnkKLQotc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIAotCi0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZECi1jb250ZW50LWlkOjwyLkNCMzY1RTM2RTIxQkQ2NDkxQUBhcGFjaGUub3JnPgotY29udGVudC10eXBlOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzpiaW5hcnkKLQotc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIHNhbWluZGEgc2FtaW5kYSBzYW1pbmRhIAotCi0tLS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZELS0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk1ZmRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOnR5cGVzPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3R5cGVzIgotICAgICAgICAgICAgIHhtbG5zOnk9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0gICAgPHR5cGVzPjwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0icmVxdWVzdE1lc3NhZ2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcnQyIiB0eXBlPSJ4czppbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0icmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDEiIHR5cGU9InhzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iZWNob1BvcnRUeXBlIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ5OnJlcXVlc3RNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9Ink6cmVzcG9uc2VNZXNzYWdlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPGJpbmRpbmcgbmFtZT0iZWNob0JpbmRpbmciIHR5cGU9Ink6ZWNob1BvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0ic2VydmljZU5hbWUiPgotICAgICAgICA8cG9ydCBiaW5kaW5nPSJ5OmVjaG9CaW5kaW5nIiBuYW1lPSJodHRwUG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvZWNobyIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0zLndzZGwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9ycGMvdGVzdC1ycGMtMy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGMwYzE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3JwYy90ZXN0LXJwYy0zLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOnR5cGVzPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3R5cGVzIiB4bWxuczp5PSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iPgotCTx0eXBlcy8+Ci0JPHR5cGVzPgotCQk8eHM6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90eXBlcyI+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0ibXlDb21wbGV4VHlwZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJteUVsdCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCTwveHM6c2NoZW1hPgotCTwvdHlwZXM+Ci0JPG1lc3NhZ2UgbmFtZT0icmVxdWVzdE1lc3NhZ2UiPgotCQk8cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCTxwYXJ0IG5hbWU9InBhcnQyIiB0eXBlPSJ4czppbnQiLz4KLQkJPHBhcnQgbmFtZT0icGFydDMiIHR5cGU9InR5cGVzOm15Q29tcGxleFR5cGUiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0icmVzcG9uc2VNZXNzYWdlIj4KLQkJPHBhcnQgbmFtZT0icGFydDEiIHR5cGU9InhzOnN0cmluZyIvPgotCTwvbWVzc2FnZT4KLQk8cG9ydFR5cGUgbmFtZT0iZWNob1BvcnRUeXBlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ5OnJlcXVlc3RNZXNzYWdlIi8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9Ink6cmVzcG9uc2VNZXNzYWdlIi8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPGJpbmRpbmcgbmFtZT0iZWNob0JpbmRpbmciIHR5cGU9Ink6ZWNob1BvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG8iLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPHNlcnZpY2UgbmFtZT0ic2VydmljZU5hbWUiPgotCQk8cG9ydCBuYW1lPSJodHRwUG9ydCIgYmluZGluZz0ieTplY2hvQmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvZWNobyIvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjNDczZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZpY2VzLmF4aXMuYXBhY2hlLm9yZyIgeG1sbnM6aW1wbD0iaHR0cDovL3NlcnZpY2VzLmF4aXMuYXBhY2hlLm9yZy1pbXBsIiB4bWxuczppbnRmPSJodHRwOi8vc2VydmljZXMuYXhpcy5hcGFjaGUub3JnIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPCEtLVdTREwgY3JlYXRlZCBieSBBcGFjaGUgQXhpcyB2ZXJzaW9uOiAxLjIuMQotICAgIEJ1aWx0IG9uIEp1biAxNCwgMjAwNSAoMDk6MTU6NTcgRURUKS0tPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJydW5SZXF1ZXN0Ij4KLQotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJydW5SZXNwb25zZSI+Ci0KLSAgICA8L3dzZGw6bWVzc2FnZT4KLQotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9Ik91dFNlcnZpY2UiPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJydW4iPgotCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJydW5SZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnJ1blJlcXVlc3QiLz4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InJ1blJlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnJ1blJlc3BvbnNlIi8+Ci0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDwvd3NkbDpwb3J0VHlwZT4KLQotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0ibG9jYWxob3N0OjgwODBTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpPdXRTZXJ2aWNlIj4KLQotICAgICAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InJ1biI+Ci0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InJ1blJlcXVlc3QiPgotCi0gICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InJ1blJlc3BvbnNlIj4KLQotICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8L3dzZGw6YmluZGluZz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvZW10eUJvZHltZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvZW10eUJvZHltZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViMTBjZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL2VtdHlCb2R5bWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L0FkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvbWluaW1hbE1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9taW5pbWFsTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZDQ5YWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9taW5pbWFsTWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8ZW52OkJvZHkvPgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9yZWFsbHlSZWFsbHlCaWdNZXNzYWdlLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvcmVhbGx5UmVhbGx5QmlnTWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGY2NTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9yZWFsbHlSZWFsbHlCaWdNZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1NDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgPGVudjpIZWFkZXI+Ci0KLSAgICAgICAgPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZWNoby5zZXJ2aWNlcyIKLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9lY2hvLnNlcnZpY2VzLWltcGwiCi0gICAgICAgICAgICB4bWxuczppbnRmPSJodHRwOi8vZWNoby5zZXJ2aWNlcyIKLSAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgeG1sbnM6dG5zMT0iaHR0cDovL3R5cGVzLmVjaG8uc2VydmljZXMiCi0gICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICAgICAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgICAgICAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3R5cGVzLmVjaG8uc2VydmljZXMiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iTXlDb21wbGV4VHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic2ltcGxlSXRlbSIgbmlsbGFibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik15RWxlbWVudCIgbmlsbGFibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0bnMxOk15Q29tcGxleFR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3NjaGVtYT4KLSAgICAgICAgICAgIDwvd3NkbDp0eXBlcz4KLSAgICAgICAgICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1JlcXVlc3QiPgotICAgICAgICAgICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zMTpNeUVsZW1lbnQiIG5hbWU9Ik15RWxlbWVudCIvPgotICAgICAgICAgICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgICAgICAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnMxOk15RWxlbWVudCIgbmFtZT0iTXlFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICAgICAgICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkVjaG8xIj4KLSAgICAgICAgICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyIgcGFyYW1ldGVyT3JkZXI9Ik15RWxlbWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImludGY6ZWNob1JlcXVlc3QiIG5hbWU9ImVjaG9SZXF1ZXN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbnRmOmVjaG9SZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImVjaG9SZXNwb25zZSIvPgotICAgICAgICAgICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgICAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgICAgICAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkNvbXBsZXhFY2hvU2VydmljZVNvYXBCaW5kaW5nIgotICAgICAgICAgICAgICAgIHR5cGU9ImludGY6RWNobzEiPgotICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9SZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3R5cGVzLmVjaG8uc2VydmljZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImVjaG9SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly90eXBlcy5lY2hvLnNlcnZpY2VzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgICAgICA8L3dzZGw6YmluZGluZz4KLSAgICAgICAgICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iQ29tcGxleEVjaG9TZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImludGY6Q29tcGxleEVjaG9TZXJ2aWNlU29hcEJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgIG5hbWU9IkNvbXBsZXhFY2hvU2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2Rsc29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvc2VydmljZXMvQ29tcGxleEVjaG9TZXJ2aWNlIi8+Ci0gICAgICAgICAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgICAgICAgICA8L3dzZGw6c2VydmljZT4KLSAgICAgICAgPC93c2RsOmRlZmluaXRpb25zPgotCi0KLSAgICA8L2VudjpIZWFkZXI+Ci0gICAgPGVudjpCb2R5PgotICAgICAgICA8ZGVmaW5pdGlvbnMKLSAgICAgICAgICAgIG5hbWU9ImNvbXByZWhlbnNpdmUgdHlwZXMgdGVzdCIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOmNvbXByZWhlbnNpdmUtc2VydmljZS50eXBlcy53c2RsLnRlc3QiCi0gICAgICAgICAgICB4bWxuczp0bnM9InVybjpjb21wcmVoZW5zaXZlLXNlcnZpY2UudHlwZXMud3NkbC50ZXN0IgotICAgICAgICAgICAgeG1sbnM6dHlwZW5zPSJ1cm46Y29tcHJlaGVuc2l2ZS10eXBlcy50eXBlcy53c2RsLnRlc3QiCi0gICAgICAgICAgICB4bWxuczp0eXBlbnMyPSJ1cm46Y29tcHJlaGVuc2l2ZS10eXBlczIudHlwZXMud3NkbC50ZXN0IgotICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLQotCi0gICAgICAgICAgICA8dHlwZXM+Ci0gICAgICAgICAgICAgICAgPHhzZDpzY2hlbWEKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Y29tcHJlaGVuc2l2ZS10eXBlcy50eXBlcy53c2RsLnRlc3QiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZDI9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2ltcGxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzaW1wbGVEYXRlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ic2ltcGxlRGF0ZVRpbWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2QyOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0iPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0d28iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ0aHJlZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ic29hcGVuYzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ic29hcGVuYzphcnJheVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsOmFycmF5VHlwZT0ieHNkOnN0cmluZ1tdIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheV9vZl9iYXNlNjQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InNvYXBlbmM6QXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InNvYXBlbmM6YXJyYXlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDphcnJheVR5cGU9InhzZDpiYXNlNjRCaW5hcnlbXSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleEFsbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXJlYUNvZGUiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjaGFuZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleFNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFyZWFDb2RlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2hhbmdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29tcGxleENob2ljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hvaWNlQSIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaG9pY2VCIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNob2ljZUMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik9iamVjdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDbGFzcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1WYWx1ZSIgdHlwZT0idHlwZW5zOmVudW0iLz4KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJEU1QiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4V0NvbXBsZXgiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RvY2tfcXVvdGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3ltYm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZW5zOnRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0eXBlbnM6c2ltcGxlRndkIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBjdGNoYW5nZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNrIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNob2ljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZW5zOmNvbXBsZXhDaG9pY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGFzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dHNpZGUiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5RmF1bHQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYXVsdEVsZW1lbnQiIHR5cGU9InR5cGVuczpmYXVsdFR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmYXVsdFR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlckRhdGEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5Q29tcGxleFR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJzaW1wbGVGd2QiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ0eXBlbnM6c2ltcGxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5TSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ic29hcGVuYzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIHJlZj0ic29hcGVuYzphcnJheVR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsOmFycmF5VHlwZT0idHlwZW5zOmFycmF5TTJbXSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5TTIiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InNvYXBlbmM6QXJyYXkiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSByZWY9InNvYXBlbmM6YXJyYXlUeXBlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDphcnJheVR5cGU9InR5cGVuczphcnJheU0zW10iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheU0zIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJzb2FwZW5jOkFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJzb2FwZW5jOmFycmF5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6YXJyYXlUeXBlPSJ4c2Q6aW50W10iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQW5pbWFsIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOYW1lIiBuaWxsYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkFuaW1hbCIgbmlsbGFibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0eXBlbnM6QW5pbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHlwZW5zOkFuaW1hbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlB1cnIiIG5pbGxhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNhdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InR5cGVuczpDYXQiLz4KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBlcnNpb25DYXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0eXBlbnM6Q2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29sb3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlRveSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iWWFybiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQ29sb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bVN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhvIEhvIEhvIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSGUgSGUgSGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIYSBIYSBIYSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtSW50Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1Mb25nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmxvbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ii05MjIzMzcyMDM2ODU0Nzc1ODA4Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iOTIyMzM3MjAzNjg1NDc3NTgwNyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtU2hvcnQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c2hvcnQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtRmxvYXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZmxvYXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEuMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuMiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjMuMyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtRG91YmxlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRvdWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMS4xIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi4yIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMy4zIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1CeXRlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmJ5dGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1JbnRlZ2VyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZsb3dEaXJlY3Rpb25UeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbk91dCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im91dCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1OTVRPS0VOIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5NVE9LRU4iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5hbWVUb2tlbjEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOYW1lVG9rZW4yIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTmFtZVRva2VuMyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkFJRFR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6aGV4QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1heExlbmd0aCB2YWx1ZT0iMTYiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iNSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InBhc3NNb2RlVHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InBhc3NCeVZhbHVlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icGFzc0J5UmVmZXJlbmNlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLQotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJpbmdQYXJhbWV0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0eXBlbnM6U3RyaW5nUGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3RyaW5nUGFyYW1ldGVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVtQnl0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzb2FwZW5jOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdG9yYWdlRW5jb2RpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVuczpmbG93RGlyZWN0aW9uVHlwZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXNzTW9kZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVuczpwYXNzTW9kZVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgICAgICA8L3hzZDpzY2hlbWE+Ci0KLQotICAgICAgICAgICAgICAgIDx4c2Q6c2NoZW1hCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOmNvbXByZWhlbnNpdmUtdHlwZXMyLnR5cGVzLndzZGwudGVzdCIKLSAgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZndkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJzb2FwZW5jOkFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgcmVmPSJzb2FwZW5jOmFycmF5VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6YXJyYXlUeXBlPSJ4c2Q6UU5hbWVbXSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRocmVlIiB0eXBlPSJ0eXBlbnM6ZW51bSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0KLQotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYSIgdHlwZT0ieHNkOnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkIiB0eXBlPSJ0eXBlbnMyOmEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2ltcGxlQW55VVJJVHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOmFueVVSSSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgICAgICA8L3hzZDpzY2hlbWE+Ci0KLSAgICAgICAgICAgIDwvdHlwZXM+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImVtcHR5Ii8+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImFsbFByaW1pdGl2ZXMiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImludGVnZXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ibG9uZyIgdHlwZT0ieHNkOmxvbmciLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzaG9ydCIgdHlwZT0ieHNkOnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZGVjaW1hbCIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJmbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZG91YmxlIiB0eXBlPSJ4c2Q6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYm9vbGVhbiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJieXRlIiB0eXBlPSJ4c2Q6Ynl0ZSIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9IlFOYW1lIiB0eXBlPSJ4c2Q6UU5hbWUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJkYXRlVGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYmFzZTY0QmluYXJ5IiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaGV4QmluYXJ5IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcFN0cmluZyIgdHlwZT0ic29hcGVuYzpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwQm9vbGVhbiIgdHlwZT0ic29hcGVuYzpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcEZsb2F0IiB0eXBlPSJzb2FwZW5jOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcERvdWJsZSIgdHlwZT0ic29hcGVuYzpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwRGVjaW1hbCIgdHlwZT0ic29hcGVuYzpkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcEludCIgdHlwZT0ic29hcGVuYzppbnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwU2hvcnQiIHR5cGU9InNvYXBlbmM6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwQmFzZTY0IiB0eXBlPSJzb2FwZW5jOmJhc2U2NCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InRpbWUiIHR5cGU9InhzZDp0aW1lIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRMb25nIiB0eXBlPSJ4c2Q6dW5zaWduZWRMb25nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRJbnQiIHR5cGU9InhzZDp1bnNpZ25lZEludCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InhzZDp1bnNpZ25lZFNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRCeXRlIiB0eXBlPSJ4c2Q6dW5zaWduZWRCeXRlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ibm9uTmVnYXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0icG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ibm9uUG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ibmVnYXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYW55VVJJIiB0eXBlPSJ4c2Q6YW55VVJJIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZ1llYXIiIHR5cGU9InhzZDpnWWVhciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImdNb250aCIgdHlwZT0ieHNkOmdNb250aCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImdEYXkiIHR5cGU9InhzZDpnRGF5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZ1llYXJNb250aCIgdHlwZT0ieHNkOmdZZWFyTW9udGgiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJnTW9udGhEYXkiIHR5cGU9InhzZDpnTW9udGhEYXkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0Qm9vbGVhbiI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5Cb29sZWFuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImJvb2xlYW4iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dEJvb2xlYW4iPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dEJvb2xlYW4iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYm9vbGVhbiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRCeXRlIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbkJ5dGUiIHR5cGU9InhzZDpieXRlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYnl0ZSIgdHlwZT0ieHNkOmJ5dGUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0Qnl0ZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0Qnl0ZSIgdHlwZT0ieHNkOmJ5dGUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJieXRlIiB0eXBlPSJ4c2Q6Ynl0ZSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFNob3J0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblNob3J0IiB0eXBlPSJ4c2Q6c2hvcnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzaG9ydCIgdHlwZT0ieHNkOnNob3J0Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFNob3J0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRTaG9ydCIgdHlwZT0ieHNkOnNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic2hvcnQiIHR5cGU9InhzZDpzaG9ydCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dEludCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5JbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0SW50Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRMb25nIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbkxvbmciIHR5cGU9InhzZDpsb25nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ibG9uZyIgdHlwZT0ieHNkOmxvbmciLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0TG9uZyI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0TG9uZyIgdHlwZT0ieHNkOmxvbmciLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJsb25nIiB0eXBlPSJ4c2Q6bG9uZyIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dEZsb2F0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbkZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJmbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dEZsb2F0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dERvdWJsZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5Eb3VibGUiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJkb3VibGUiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0RG91YmxlIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXREb3VibGUiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJkb3VibGUiIHR5cGU9InhzZDpkb3VibGUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRTdHJpbmciPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0U3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0SW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5JbnRlZ2VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImludGVnZXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dEludGVnZXIiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dEludGVnZXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW50ZWdlciIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXREZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbkRlY2ltYWwiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZGVjaW1hbCIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0RGVjaW1hbCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0RGVjaW1hbCIgdHlwZT0ieHNkOmRlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJkZWNpbWFsIiB0eXBlPSJ4c2Q6ZGVjaW1hbCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dERhdGVUaW1lIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbkRhdGVUaW1lIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJkYXRlVGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dERhdGVUaW1lIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXREYXRlVGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZGF0ZVRpbWUiIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dEJhc2U2NEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5CYXNlNjRCaW5hcnkiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJiYXNlNjRCaW5hcnkiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0QmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRCYXNlNjRCaW5hcnkiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJiYXNlNjRCaW5hcnkiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRRTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5RTmFtZSIgdHlwZT0ieHNkOlFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0icU5hbWUiIHR5cGU9InhzZDpRTmFtZSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXRRTmFtZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0UU5hbWUiIHR5cGU9InhzZDpRTmFtZSIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InFOYW1lIiB0eXBlPSJ4c2Q6UU5hbWUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRIZXhCaW5hcnkiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluSGV4QmluYXJ5IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaGV4QmluYXJ5IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dEhleEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0SGV4QmluYXJ5IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaGV4QmluYXJ5IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0VGltZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5UaW1lIiB0eXBlPSJ4c2Q6dGltZSIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InRpbWUiIHR5cGU9InhzZDp0aW1lIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFRpbWUiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dFRpbWUiIHR5cGU9InhzZDp0aW1lIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idGltZSIgdHlwZT0ieHNkOnRpbWUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRVbnNpZ25lZExvbmciPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluVW5zaWduZWRMb25nIiB0eXBlPSJ4c2Q6dW5zaWduZWRMb25nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRMb25nIiB0eXBlPSJ4c2Q6dW5zaWduZWRMb25nIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFVuc2lnbmVkTG9uZyI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0VW5zaWduZWRMb25nIiB0eXBlPSJ4c2Q6dW5zaWduZWRMb25nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRMb25nIiB0eXBlPSJ4c2Q6dW5zaWduZWRMb25nIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0VW5zaWduZWRJbnQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluVW5zaWduZWRJbnQiIHR5cGU9InhzZDp1bnNpZ25lZEludCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InVuc2lnbmVkSW50IiB0eXBlPSJ4c2Q6dW5zaWduZWRJbnQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0VW5zaWduZWRJbnQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dFVuc2lnbmVkSW50IiB0eXBlPSJ4c2Q6dW5zaWduZWRJbnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJ1bnNpZ25lZEludCIgdHlwZT0ieHNkOnVuc2lnbmVkSW50Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0VW5zaWduZWRTaG9ydCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5VbnNpZ25lZFNob3J0IiB0eXBlPSJ4c2Q6dW5zaWduZWRTaG9ydCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InVuc2lnbmVkU2hvcnQiIHR5cGU9InhzZDp1bnNpZ25lZFNob3J0Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFVuc2lnbmVkU2hvcnQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dFVuc2lnbmVkU2hvcnQiIHR5cGU9InhzZDp1bnNpZ25lZFNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRTaG9ydCIgdHlwZT0ieHNkOnVuc2lnbmVkU2hvcnQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRVbnNpZ25lZEJ5dGUiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluVW5zaWduZWRCeXRlIiB0eXBlPSJ4c2Q6dW5zaWduZWRCeXRlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRCeXRlIiB0eXBlPSJ4c2Q6dW5zaWduZWRCeXRlIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFVuc2lnbmVkQnl0ZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0VW5zaWduZWRCeXRlIiB0eXBlPSJ4c2Q6dW5zaWduZWRCeXRlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0idW5zaWduZWRCeXRlIiB0eXBlPSJ4c2Q6dW5zaWduZWRCeXRlIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0Tm9uTmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbk5vbk5lZ2F0aXZlSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Ik5vbk5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXROb25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dE5vbk5lZ2F0aXZlSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Ik5vbk5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5Qb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJQb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0UG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRQb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJQb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXROb25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluTm9uUG9zaXRpdmVJbnRlZ2VyIgotICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iTm9uUG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dE5vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0Tm9uUG9zaXRpdmVJbnRlZ2VyIgotICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iTm9uUG9zaXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bm9uUG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0TmVnYXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbk5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Ik5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXROZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dE5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Ik5lZ2F0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dEFueVVSSSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5BbnlVUkkiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJhbnlVUkkiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0QW55VVJJIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRBbnlVUkkiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJhbnlVUkkiIHR5cGU9InhzZDphbnlVUkkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRTaW1wbGVBbnlVUkkiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluQW55VVJJIiB0eXBlPSJ0eXBlbnMyOlNpbXBsZUFueVVSSVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJhbnlVUkkiIHR5cGU9InR5cGVuczI6U2ltcGxlQW55VVJJVHlwZSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXRTaW1wbGVBbnlVUkkiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dEFueVVSSSIgdHlwZT0idHlwZW5zMjpTaW1wbGVBbnlVUklUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYW55VVJJIiB0eXBlPSJ0eXBlbnMyOlNpbXBsZUFueVVSSVR5cGUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRZZWFyIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblllYXIiIHR5cGU9InhzZDpnWWVhciIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9IlllYXIiIHR5cGU9InhzZDpnWWVhciIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXRZZWFyIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRZZWFyIiB0eXBlPSJ4c2Q6Z1llYXIiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJZZWFyIiB0eXBlPSJ4c2Q6Z1llYXIiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRNb250aCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5Nb250aCIgdHlwZT0ieHNkOmdNb250aCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Ik1vbnRoIiB0eXBlPSJ4c2Q6Z01vbnRoIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dE1vbnRoIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRNb250aCIgdHlwZT0ieHNkOmdNb250aCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Ik1vbnRoIiB0eXBlPSJ4c2Q6Z01vbnRoIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0RGF5Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbkRheSIgdHlwZT0ieHNkOmdEYXkiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJEYXkiIHR5cGU9InhzZDpnRGF5Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dERheSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0RGF5IiB0eXBlPSJ4c2Q6Z0RheSIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9IkRheSIgdHlwZT0ieHNkOmdEYXkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRZZWFyTW9udGgiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluWWVhck1vbnRoIiB0eXBlPSJ4c2Q6Z1llYXJNb250aCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9IlllYXJNb250aCIgdHlwZT0ieHNkOmdZZWFyTW9udGgiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0WWVhck1vbnRoIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRZZWFyTW9udGgiIHR5cGU9InhzZDpnWWVhck1vbnRoIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iWWVhck1vbnRoIiB0eXBlPSJ4c2Q6Z1llYXJNb250aCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dE1vbnRoRGF5Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpbk1vbnRoRGF5IiB0eXBlPSJ4c2Q6Z01vbnRoRGF5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iTW9udGhEYXkiIHR5cGU9InhzZDpnTW9udGhEYXkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0TW9udGhEYXkiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dE1vbnRoRGF5IiB0eXBlPSJ4c2Q6Z01vbnRoRGF5Ii8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iTW9udGhEYXkiIHR5cGU9InhzZDpnTW9udGhEYXkiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRTb2FwU3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblNvYXBTdHJpbmciIHR5cGU9InNvYXBlbmM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcGVuY1N0cmluZyIgdHlwZT0ic29hcGVuYzpzdHJpbmciLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0U29hcFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0U29hcFN0cmluZyIgdHlwZT0ic29hcGVuYzpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jU3RyaW5nIiB0eXBlPSJzb2FwZW5jOnN0cmluZyIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFNvYXBCb29sZWFuIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblNvYXBCb29sZWFuIiB0eXBlPSJzb2FwZW5jOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jQm9vbGVhbiIgdHlwZT0ic29hcGVuYzpib29sZWFuIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFNvYXBCb29sZWFuIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRTb2FwQm9vbGVhbiIgdHlwZT0ic29hcGVuYzpib29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcGVuY0Jvb2xlYW4iIHR5cGU9InNvYXBlbmM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFNvYXBGbG9hdCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iaW5Tb2FwRmxvYXQiIHR5cGU9InNvYXBlbmM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jRmxvYXQiIHR5cGU9InNvYXBlbmM6ZmxvYXQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0U29hcEZsb2F0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRTb2FwRmxvYXQiIHR5cGU9InNvYXBlbmM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jRmxvYXQiIHR5cGU9InNvYXBlbmM6ZmxvYXQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iaW5wdXRTb2FwRG91YmxlIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblNvYXBEb3VibGUiIHR5cGU9InNvYXBlbmM6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcGVuY0RvdWJsZSIgdHlwZT0ic29hcGVuYzpkb3VibGUiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0ib3V0cHV0U29hcERvdWJsZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ib3V0U29hcERvdWJsZSIgdHlwZT0ic29hcGVuYzpkb3VibGUiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jRG91YmxlIiB0eXBlPSJzb2FwZW5jOmRvdWJsZSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFNvYXBEZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblNvYXBEZWNpbWFsIiB0eXBlPSJzb2FwZW5jOmRlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jRGVjaW1hbCIgdHlwZT0ic29hcGVuYzpkZWNpbWFsIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9Im91dHB1dFNvYXBEZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRTb2FwRGVjaW1hbCIgdHlwZT0ic29hcGVuYzpkZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0ic29hcGVuY0RlY2ltYWwiIHR5cGU9InNvYXBlbmM6ZGVjaW1hbCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFNvYXBJbnQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluU29hcEludCIgdHlwZT0ic29hcGVuYzppbnQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jSW50IiB0eXBlPSJzb2FwZW5jOmludCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXRTb2FwSW50Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRTb2FwSW50IiB0eXBlPSJzb2FwZW5jOmludCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InNvYXBlbmNJbnQiIHR5cGU9InNvYXBlbmM6aW50Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImlucHV0U29hcFNob3J0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJpblNvYXBTaG9ydCIgdHlwZT0ic29hcGVuYzpzaG9ydCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InNvYXBlbmNTaG9ydCIgdHlwZT0ic29hcGVuYzpzaG9ydCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXRTb2FwU2hvcnQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9Im91dFNvYXBTaG9ydCIgdHlwZT0ic29hcGVuYzpzaG9ydCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InNvYXBlbmNTaG9ydCIgdHlwZT0ic29hcGVuYzpzaG9ydCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJpbnB1dFNvYXBCYXNlNjQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImluU29hcEJhc2U2NCIgdHlwZT0ic29hcGVuYzpiYXNlNjQiLz4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJzb2FwZW5jQmFzZTY0IiB0eXBlPSJzb2FwZW5jOmJhc2U2NCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJvdXRwdXRTb2FwQmFzZTY0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJvdXRTb2FwQmFzZTY0IiB0eXBlPSJzb2FwZW5jOmJhc2U2NCIvPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9InNvYXBlbmNCYXNlNjQiIHR5cGU9InNvYXBlbmM6YmFzZTY0Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImVudW0iPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImVudW0iIHR5cGU9InR5cGVuczplbnVtIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImVudW1JbnQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImVudW1JbnQiIHR5cGU9InR5cGVuczplbnVtSW50Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImFycmF5Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJhcnJheSIgdHlwZT0idHlwZW5zOmFycmF5Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImFycmF5TSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYXJyYXlNIiB0eXBlPSJ0eXBlbnM6YXJyYXlNIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImNvbXBsZXhBbGwiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImNvbXBsZXhBbGwiIHR5cGU9InR5cGVuczpjb21wbGV4QWxsIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImNvbXBsZXhTZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iY29tcGxleFNlcXVlbmNlIiB0eXBlPSJ0eXBlbnM6Y29tcGxleFNlcXVlbmNlIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImNvbXBsZXhXQ29tcGxleCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iY29tcGxleFdDb21wbGV4IiB0eXBlPSJ0eXBlbnM6Y29tcGxleFdDb21wbGV4Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImFueSI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iYW55IiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJhbmltYWwiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImFuaW1hbCIgdHlwZT0idHlwZW5zOkFuaW1hbCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJjYXQiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImNhdCIgdHlwZT0idHlwZW5zOkNhdCIvPgotICAgICAgICAgICAgPC9tZXNzYWdlPgotCi0gICAgICAgICAgICA8bWVzc2FnZSBuYW1lPSJlbXB0eUZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8cGFydCBuYW1lPSJ0aGVGYXVsdCIgdHlwZT0idHlwZW5zOmVtcHR5RmF1bHQiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZT4KLQotICAgICAgICAgICAgPG1lc3NhZ2UgbmFtZT0iZmF1bHRXaXRoRWxlbWVudCI+Ci0gICAgICAgICAgICAgICAgPHBhcnQgbmFtZT0iZmF1bHQyIiBlbGVtZW50PSJ0eXBlbnM6ZmF1bHRFbGVtZW50Ii8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLSAgICAgICAgICAgIDxtZXNzYWdlIG5hbWU9ImVtcHR5Q29tcGxleFR5cGUiPgotICAgICAgICAgICAgICAgIDxwYXJ0IG5hbWU9ImVtcHR5Q29tcGxleFR5cGUiIHR5cGU9InR5cGVuczplbXB0eUNvbXBsZXhUeXBlIi8+Ci0gICAgICAgICAgICA8L21lc3NhZ2U+Ci0KLQotICAgICAgICAgICAgPHBvcnRUeXBlIG5hbWU9IlR5cGVUZXN0Ij4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFsbFByaW1pdGl2ZXNJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YWxsUHJpbWl0aXZlcyIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYWxsUHJpbWl0aXZlc0lub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczphbGxQcmltaXRpdmVzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFsbFByaW1pdGl2ZXMiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFsbFByaW1pdGl2ZXNPdXQiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFsbFByaW1pdGl2ZXMiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVudW1JbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW51bSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZW51bUlub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbnVtIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVudW0iLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVudW1PdXQiIHBhcmFtZXRlck9yZGVyPSJlbnVtIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplbnVtIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtUmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplbnVtIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtSW50SW4iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVudW1JbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVudW1JbnRJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW51bUludCIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplbnVtSW50Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtSW50T3V0IiBwYXJhbWV0ZXJPcmRlcj0iZW51bUludCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW51bUludCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZW51bUludFJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW51bUludCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYXJyYXlJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YXJyYXkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFycmF5SW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFycmF5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFycmF5Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhcnJheU91dCIgcGFyYW1ldGVyT3JkZXI9ImFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphcnJheSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYXJyYXlSZXR1cm4iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFycmF5Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFycmF5TUluIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczphcnJheU0iLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFycmF5TUlub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczphcnJheU0iLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YXJyYXlNIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhcnJheU1PdXQiIHBhcmFtZXRlck9yZGVyPSJhcnJheU0iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFycmF5TSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYXJyYXlNUmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphcnJheU0iLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleEFsbEluIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpjb21wbGV4QWxsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4QWxsSW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmNvbXBsZXhBbGwiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Y29tcGxleEFsbCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleEFsbE91dCIgcGFyYW1ldGVyT3JkZXI9ImNvbXBsZXhBbGwiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmNvbXBsZXhBbGwiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhBbGxSZXR1cm4iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmNvbXBsZXhBbGwiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhTZXF1ZW5jZUluIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpjb21wbGV4U2VxdWVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhTZXF1ZW5jZUlub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpjb21wbGV4U2VxdWVuY2UiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Y29tcGxleFNlcXVlbmNlIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4U2VxdWVuY2VPdXQiCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck9yZGVyPSJjb21wbGV4U2VxdWVuY2UiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmNvbXBsZXhTZXF1ZW5jZSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleFNlcXVlbmNlUmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpjb21wbGV4U2VxdWVuY2UiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhXQ29tcGxleEluIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpjb21wbGV4V0NvbXBsZXgiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhXQ29tcGxleElub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpjb21wbGV4V0NvbXBsZXgiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Y29tcGxleFdDb21wbGV4Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4V0NvbXBsZXhPdXQiCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck9yZGVyPSJjb21wbGV4V0NvbXBsZXgiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmNvbXBsZXhXQ29tcGxleCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleFdDb21wbGV4UmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpjb21wbGV4V0NvbXBsZXgiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVtcHR5Q29tcGxleFR5cGVJbiIKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyT3JkZXI9ImVtcHR5Q29tcGxleFR5cGUiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Q29tcGxleFR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPGZhdWx0IG5hbWU9ImVtcHR5RmF1bHQiIG1lc3NhZ2U9InRuczplbXB0eUZhdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbXB0eUNvbXBsZXhUeXBlSW5vdXQiCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck9yZGVyPSJlbXB0eUNvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eUNvbXBsZXhUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVtcHR5Q29tcGxleFR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGZhdWx0IG5hbWU9ImVtcHR5RmF1bHQiIG1lc3NhZ2U9InRuczplbXB0eUZhdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbXB0eUNvbXBsZXhUeXBlT3V0IgotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJPcmRlcj0iZW1wdHlDb21wbGV4VHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHlDb21wbGV4VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8ZmF1bHQgbmFtZT0iZW1wdHlGYXVsdCIgbWVzc2FnZT0idG5zOmVtcHR5RmF1bHQiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVtcHR5Q29tcGxleFR5cGVSZXR1cm4iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVtcHR5Q29tcGxleFR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGZhdWx0IG5hbWU9ImVtcHR5RmF1bHQiIG1lc3NhZ2U9InRuczplbXB0eUZhdWx0Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbnlJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YW55Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbnlJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YW55Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFueSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYW55T3V0IiBwYXJhbWV0ZXJPcmRlcj0iYW55Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphbnkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFueVJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YW55Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbmltYWxJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YW5pbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbmltYWxJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6YW5pbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFuaW1hbCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYW5pbWFsT3V0IiBwYXJhbWV0ZXJPcmRlcj0iYW5pbWFsIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphbmltYWwiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFuaW1hbFJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6YW5pbWFsIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjYXRJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Y2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVtcHR5Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjYXRJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Y2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmNhdCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY2F0T3V0IiBwYXJhbWV0ZXJPcmRlcj0iY2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplbXB0eSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpjYXQiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNhdFJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZW1wdHkiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Y2F0Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RCb29sZWFuIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dEJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0Qm9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kQnl0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRCeXRlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dEJ5dGUiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNob3J0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFNob3J0Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RJbnQiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0SW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dEludCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kTG9uZyI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRMb25nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dExvbmciLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZEZsb2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dEZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dEZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2REb3VibGUiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0RG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dERvdWJsZSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRTdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZEludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0SW50ZWdlciIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2REZWNpbWFsIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dERlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0RGVjaW1hbCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kRGF0ZVRpbWUiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0RGF0ZVRpbWUiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFFOYW1lIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFFOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RUaW1lIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFRpbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0VGltZSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kVW5zaWduZWRMb25nIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFVuc2lnbmVkTG9uZyIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRVbnNpZ25lZExvbmciLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFVuc2lnbmVkSW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFVuc2lnbmVkSW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFVuc2lnbmVkSW50Ii8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RVbnNpZ25lZFNob3J0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFVuc2lnbmVkU2hvcnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0VW5zaWduZWRTaG9ydCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kVW5zaWduZWRCeXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFVuc2lnbmVkQnl0ZSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRVbnNpZ25lZEJ5dGUiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZE5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXROb25OZWdhdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0Tm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RQb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0UG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFBvc2l0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kTm9uUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dE5vblBvc2l0aXZlSW50ZWdlciIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXROb25Qb3NpdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZE5lZ2F0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXROZWdhdGl2ZUludGVnZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0TmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RBbnlVUkkiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0QW55VVJJIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dEFueVVSSSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU2ltcGxlQW55VVJJIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFNpbXBsZUFueVVSSSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRTaW1wbGVBbnlVUkkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFllYXIiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0WWVhciIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRZZWFyIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RNb250aCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRNb250aCIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRNb250aCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kRGF5Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dERheSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXREYXkiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFllYXJNb250aCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRZZWFyTW9udGgiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0WWVhck1vbnRoIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RNb250aERheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRNb250aERheSIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRNb250aERheSIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRTb2FwU3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFNvYXBTdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNvYXBCb29sZWFuIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFNvYXBCb29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFNvYXBCb29sZWFuIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RTb2FwRmxvYXQiPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlucHV0U29hcEZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFNvYXBGbG9hdCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcERvdWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5wdXRTb2FwRG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFNvYXBEb3VibGUiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNvYXBEZWNpbWFsIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFNvYXBEZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dHB1dFNvYXBEZWNpbWFsIi8+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RTb2FwSW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFNvYXBJbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0cHV0U29hcEludCIvPgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcFNob3J0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbnB1dFNvYXBTaG9ydCIvPgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRwdXRTb2FwU2hvcnQiLz4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgIDwvcG9ydFR5cGU+Ci0KLQotICAgICAgICAgICAgPGJpbmRpbmcgbmFtZT0iVHlwZVRlc3RCaW5kaW5nIiB0eXBlPSJ0bnM6VHlwZVRlc3QiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9InJwYyIKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFsbFByaW1pdGl2ZXNJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFsbFByaW1pdGl2ZXNJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFsbFByaW1pdGl2ZXNPdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtSW4iPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtSW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtT3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZW51bVJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVudW1JbnRJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVudW1JbnRJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVudW1JbnRPdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbnVtSW50UmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYXJyYXlJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFycmF5SW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhcnJheU91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFycmF5UmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhcnJheU1JbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFycmF5TUlub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYXJyYXlNT3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYXJyYXlNUmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4QWxsSW4iPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4QWxsSW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4QWxsT3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleEFsbFJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhTZXF1ZW5jZUluIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleFNlcXVlbmNlSW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4U2VxdWVuY2VPdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4U2VxdWVuY2VSZXR1cm4iPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjb21wbGV4V0NvbXBsZXhJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNvbXBsZXhXQ29tcGxleElub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleFdDb21wbGV4T3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY29tcGxleFdDb21wbGV4UmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZW1wdHlDb21wbGV4VHlwZUluIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgICAgICA8ZmF1bHQgbmFtZT0iZW1wdHlGYXVsdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJlbXB0eUZhdWx0IiB1c2U9ImVuY29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVtcHR5Q29tcGxleFR5cGVJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgPGZhdWx0IG5hbWU9ImVtcHR5RmF1bHQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iZW1wdHlGYXVsdCIgdXNlPSJlbmNvZGVkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlbXB0eUNvbXBsZXhUeXBlT3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgICAgICA8ZmF1bHQgbmFtZT0iZW1wdHlGYXVsdCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJlbXB0eUZhdWx0IiB1c2U9ImVuY29kZWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVtcHR5Q29tcGxleFR5cGVSZXR1cm4iPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJlbXB0eUZhdWx0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImVtcHR5RmF1bHQiIHVzZT0iZW5jb2RlZCIvPgotICAgICAgICAgICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYW55SW4iPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbnlJbm91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFueU91dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFueVJldHVybiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImFuaW1hbEluIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYW5pbWFsSW5vdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbmltYWxPdXQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhbmltYWxSZXR1cm4iPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJjYXRJbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImNhdElub3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY2F0T3V0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0iY2F0UmV0dXJuIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kQm9vbGVhbiI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZEJ5dGUiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RTaG9ydCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZEludCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZExvbmciPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RGbG9hdCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZERvdWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZEludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2REZWNpbWFsIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kRGF0ZVRpbWUiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RRTmFtZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFRpbWUiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RVbnNpZ25lZExvbmciPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RVbnNpZ25lZEludCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFVuc2lnbmVkU2hvcnQiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RVbnNpZ25lZEJ5dGUiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2ROb25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RQb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2ROb25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2ROZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZEFueVVSSSI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNpbXBsZUFueVVSSSI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFllYXIiPgotICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2U9ImVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJtZXRob2RNb250aCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZERheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFllYXJNb250aCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZE1vbnRoRGF5Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNvYXBCb29sZWFuIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcEZsb2F0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcERvdWJsZSI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNvYXBEZWNpbWFsIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZT0iIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAgICAgIDxvcGVyYXRpb24gbmFtZT0ibWV0aG9kU29hcEludCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9Im1ldGhvZFNvYXBTaG9ydCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0iZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9IiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgICAgIDwvYmluZGluZz4KLQotCi0gICAgICAgICAgICA8c2VydmljZSBuYW1lPSJUeXBlVGVzdFNlcnZpY2UiPgotICAgICAgICAgICAgICAgIDxwb3J0IG5hbWU9IlR5cGVUZXN0IiBiaW5kaW5nPSJ0bnM6VHlwZVRlc3RCaW5kaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMvc2VydmljZXMvVHlwZVRlc3QiLz4KLSAgICAgICAgICAgICAgICA8L3BvcnQ+Ci0gICAgICAgICAgICA8L3NlcnZpY2U+Ci0KLSAgICAgICAgPC9kZWZpbml0aW9ucz4KLQotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NhbXBsZTEudHh0IGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9zYW1wbGUxLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmNzU2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NhbXBsZTEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotUE9TVCAvYXhpcy9zZXJ2aWNlcy9FY2hvU2VydmljZSBIVFRQLzEuMQotSG9zdDogMTI3LjAuMC4xCi1Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PSJ1dGYtOCIKLQotPD94bWwgdmVyc2lvbj0nMS4wJyA/PgotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI+IAotIDxlbnY6SGVhZGVyPgotIDwvZW52OkhlYWRlcj4KLSA8ZW52OkJvZHk+Ci0JPGF4aXMyOmVjaG9Wb2lkIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIgPjwvYXhpczI6ZWNob1ZvaWQ+Ci0gPC9lbnY6Qm9keT4KLTwvZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc2FtcGxlMS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NhbXBsZTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI2YTc5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc2FtcGxlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnID8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4KLSAgICA8ZW52OkhlYWRlcj4KLSAgICA8L2VudjpIZWFkZXI+Ci0gICAgPGVudjpCb2R5PgotICAgICAgICA8YXhpczI6ZWNob1ZvaWQgeG1sbnM6YXhpczI9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIj4KLSAgICAgICAgPC9heGlzMjplY2hvVm9pZD4KLSAgICA8L2VudjpCb2R5PgotPC9lbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9zZWN1cml0eTItc29hcC54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NlY3VyaXR5Mi1zb2FwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczNTc3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NlY3VyaXR5Mi1zb2FwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPFM6RW52ZWxvcGUgeG1sbnM6Uz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiCi0gICAgeG1sbnM6d3NzZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9zZWNleHQiCi0gICAgeG1sbnM6eGVuYz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjIj4KLSAgICA8UzpIZWFkZXI+Ci0gICAgICAgIDxtOnBhdGggeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvcnAiPgotICAgICAgICAgICAgPG06YWN0aW9uPmh0dHA6Ly9mYWJyaWthbTEyMy5jb20vZ2V0UXVvdGU8L206YWN0aW9uPgotICAgICAgICAgICAgPG06dG8+aHR0cDovL2ZhYnJpa2FtMTIzLmNvbS9zdG9ja3M8L206dG8+Ci0gICAgICAgICAgICA8bTpmcm9tPm1haWx0bzpqb2huc21pdGhAZmFicmlrYW0xMjMuY29tPC9tOmZyb20+Ci0gICAgICAgICAgICA8bTppZD51dWlkOjg0YjlmNWQwLTMzZmItNGE4MS1iMDJiLTViNzYwNjQxYzFkNjwvbTppZD4KLSAgICAgICAgPC9tOnBhdGg+Ci0gICAgICAgIDx3c3NlOlNlY3VyaXR5PgotICAgICAgICAgICAgPHdzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbgotICAgICAgICAgICAgICAgIFZhbHVlVHlwZT0id3NzZTpYNTA5djMiCi0gICAgICAgICAgICAgICAgRW5jb2RpbmdUeXBlPSJ3c3NlOkJhc2U2NEJpbmFyeSIKLSAgICAgICAgICAgICAgICBJZD0iWDUwOVRva2VuIj4KLSAgICAgICAgICAgICAgICBNSUlFWnpDQ0E5Q2dBd0lCQWdJUUVtdEpaYzBycXJLaDVpLi4uCi0gICAgICAgICAgICA8L3dzc2U6QmluYXJ5U2VjdXJpdHlUb2tlbj4KLSAgICAgICAgICAgIDxkczpTaWduYXR1cmU+Ci0gICAgICAgICAgICAgICAgPGRzOlNpZ25lZEluZm8+Ci0gICAgICAgICAgICAgICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPgotICAgICAgICAgICAgICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxkczpSZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vLi4uI1JvdXRpbmdUcmFuc2Zvcm0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHM6VHJhbnNmb3JtIEFsZ29yaXRobT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZHM6VHJhbnNmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkczpEaWdlc3RWYWx1ZT5FVUxkZHl0U28xLi4uPC9kczpEaWdlc3RWYWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgPC9kczpSZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9kczpTaWduZWRJbmZvPgotICAgICAgICAgICAgICAgIDxkczpTaWduYXR1cmVWYWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgQkw4amRmVG9FYjFsL3ZYY01aTk5qUE9WLi4uCi0gICAgICAgICAgICAgICAgPC9kczpTaWduYXR1cmVWYWx1ZT4KLSAgICAgICAgICAgICAgICA8ZHM6S2V5SW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPHdzc2U6U2VjdXJpdHlUb2tlblJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx3c3NlOlJlZmVyZW5jZSBVUkk9IiNYNTA5VG9rZW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPC93c3NlOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2U+Ci0gICAgICAgICAgICAgICAgPC9kczpLZXlJbmZvPgotICAgICAgICAgICAgPC9kczpTaWduYXR1cmU+Ci0gICAgICAgIDwvd3NzZTpTZWN1cml0eT4KLSAgICA8L1M6SGVhZGVyPgotICAgIDxTOkJvZHk+Ci0gICAgICAgIDx0cnU6U3RvY2tTeW1ib2wgeG1sbnM6dHJ1PSJodHRwOi8vZmFicmlrYW0xMjMuY29tL3BheWxvYWRzIj4KLSAgICAgICAgICAgIFFRUQotICAgICAgICA8L3RydTpTdG9ja1N5bWJvbD4KLSAgICA8L1M6Qm9keT4KLTwvUzpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnR4dCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGU2MTM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotUE9TVCAvYXhpcy9zZXJ2aWNlcy9FY2hvU2VydmljZSBIVFRQLzEuMQ0KLUhvc3Q6IDEyNy4wLjAuMQ0KLUNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9InV0Zi04Ig0KLUNvbm5lY3Rpb246IGNsb3NlDQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyPg0KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+dXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+DQotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+DQotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC9BZGRyZXNzPg0KLSAgICAgICAgPC93c2E6RnJvbT4NCi0gICAgPC9zb2FwZW52OkhlYWRlcj4NCi0gICAgPHNvYXBlbnY6Qm9keT4NCi0gICAgICAgIDxheGlzMjplY2hvVm9pZCB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiID48L2F4aXMyOmVjaG9Wb2lkPg0KLSAgICA8L3NvYXBlbnY6Qm9keT4NCi08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC9zb2FwbWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4NGFkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICBodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8QWRkcmVzcyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nIj4KLSAgICAgICAgICAgICAgICBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMKLSAgICAgICAgICAgIDwvQWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+Ci0gICAgICAgIDxheGlzMjplY2hvVm9pZCB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiPgotICAgICAgICA8L2F4aXMyOmVjaG9Wb2lkPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UxLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvc29hcG1lc3NhZ2UxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxOTkyNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwL3NvYXBtZXNzYWdlMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIHV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L0FkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPG5zMTphY2NvdW50Tm8gaHJlZj0iI2lkMCIvPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgICAgICA8bXVsdGlSZWYgeG1sbnM9InRlbXBVcmkiIGlkPSJpZDAiIHNvYXBlbmM6cm9vdD0iMCIKLSAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICB4c2k6dHlwZT0ieHNkOmludCIKLSAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIj4xMDAxCi0gICAgICAgIDwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC93aGl0ZXNwYWNlZE1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcC93aGl0ZXNwYWNlZE1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgxMTEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3NvYXAvd2hpdGVzcGFjZWRNZXNzYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZW52OkVudmVsb3BlIHhtbG5zOmVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3NpbmciPgotCi0gICAgPGVudjpIZWFkZXI+Ci0KLQotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgICAgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzCi0gICAgICAgICAgICA8L0FkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0KLSAgICA8L2VudjpIZWFkZXI+Ci0gICAgPGVudjpCb2R5PgotCi0KLSAgICAgICAgPGF4aXMyOmVjaG9Wb2lkIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiI+Ci0gICAgICAgIDwvYXhpczI6ZWNob1ZvaWQ+Ci0KLQotICAgIDwvZW52OkJvZHk+Ci08L2VudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NzZiMzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc29hcG1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3NpbmciPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+dXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDx3c2E6VG8gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4KLSAgICAgICAgPHdzYTpGcm9tIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPgotICAgICAgICAgICAgPEFkZHJlc3MgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDMvYWRkcmVzc2luZyI+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC9BZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+MTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1lbmFibGVkLWF4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3N3YS9Td0EtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhYmMwMjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1lbmFibGVkLWF4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBSRVNUIHN1cHBvcnQgLS0+Ci0gICAgPCEtLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVhbmJsZVJFU1QiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmctLT4KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3N3YS9Td0EtZmlsZUNhY2hlLWVuYWJsZWQtYXhpczIueG1sIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3ZDdiMDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL1N3QS1maWxlQ2FjaGUtZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPnRhcmdldC90ZXN0LXJlc291cmNlcy88L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlcj4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBSRVNUIHN1cHBvcnQgLS0+Ci0gICAgPCEtLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVhbmJsZVJFU1QiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmctLT4KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL3N3YWlucHV0LmJpbiBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3N3YS9zd2FpbnB1dC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgzNTc3OTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL3N3YWlucHV0LmJpbgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLVBPU1QgL2F4aXMyL3NlcnZpY2VzL0VjaG9Td0FTZXJ2aWNlL2VjaG9BdHRhY2htZW50IEhUVFAvMS4wDQotQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgdHlwZT0idGV4dC94bWwiOyBzdGFydD0iPDlENjQ1QzhFQkI4MzdDRTU0QUJEMDI3QTM2NTk1MzVEPiI7IAlib3VuZGFyeT0iLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOCINCi1BY2NlcHQ6IGFwcGxpY2F0aW9uL3NvYXAreG1sLCBhcHBsaWNhdGlvbi9kaW1lLCBtdWx0aXBhcnQvcmVsYXRlZCwgdGV4dC8qDQotVXNlci1BZ2VudDogQXhpcy8xLjIuMQ0KLUhvc3Q6IDEyNy4wLjAuMTo4MDgxDQotQ2FjaGUtQ29udHJvbDogbm8tY2FjaGUNCi1QcmFnbWE6IG5vLWNhY2hlDQotQ29ubmVjdGlvbjogY2xvc2UNCi1TT0FQQWN0aW9uOiAiIg0KLQ0KLQ0KLS0tLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOA0KLUNvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgNCi1Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCi1Db250ZW50LUlkOiA8OUQ2NDVDOEVCQjgzN0NFNTRBQkQwMjdBMzY1OTUzNUQ+DQotDQotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PHNvYXBlbnY6Qm9keT48ZWNob0F0dGFjaG1lbnQgeG1sbnM9IiI+PHNvdXJjZSBocmVmPSJjaWQ6MzkzNkFFMTlGQkVENTVBRTQ2MjBCODFDNzNCREQ3NkUiIHhtbG5zPSIiLz48L2VjaG9BdHRhY2htZW50Pjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4NCi0tLS0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgNCi1Db250ZW50LVR5cGU6IHRleHQvcGxhaW4NCi1Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCi1Db250ZW50LUlkOiA8MzkzNkFFMTlGQkVENTVBRTQ2MjBCODFDNzNCREQ3NkU+DQotDQotQXBhY2hlIEF4aXMyIC0gVGhlIE5FeHQgR2VuZXJhdGlvbiBXZWIgU2VydmljZXMgRW5naW5lDQotDQotLS0tLS0tPV9QYXJ0XzBfMTk3NzUxMS4xMTIzMTYzNTcxMTM4LS0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zd2EvdGVzdC5qcGcgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9zd2EvdGVzdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5YzEwY2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvc3dhL3Rlc3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2N1bWVudFVud3JhcHBpbmdUZXN0LndzZGwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0RvY3VtZW50VW53cmFwcGluZ1Rlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5YmVhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0RvY3VtZW50VW53cmFwcGluZ1Rlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIG5hbWU9IndzZGxhZG1pbnRlc3QiCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvIgotICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgICB4bWxuczpwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0MSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNlMSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWVzdDIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zZTIiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3QzIiB0eXBlPSJ0bnM6U2luZ2xlRWxlbWVudENvbXBsZXhUeXBlIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2UzIiB0eXBlPSJ0bnM6U2luZ2xlRWxlbWVudENvbXBsZXhUeXBlIi8+Ci0KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2luZ2xlRWxlbWVudENvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IlJlcXVlc3Q0IiB0eXBlPSJ0bnM6TXVsdGlwbGVFbGVtZW50Q29tcGxleFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zZTQiIHR5cGU9InRuczpNdWx0aXBsZUVsZW1lbnRDb21wbGV4VHlwZSIvPgotCi0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik11bHRpcGxlRWxlbWVudENvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0NSIgPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6QWJzdHJhY3RDb21wbGV4VHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJtMyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbnk+PC94c2Q6YW55PgotICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2U1IiA+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpBYnN0cmFjdENvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcm0zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFueT48L3hzZDphbnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0NiIgdHlwZT0idG5zOkNoaWxkQ29tcGxleFR5cGUiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zZTYiIHR5cGU9InRuczpDaGlsZENvbXBsZXhUeXBlIi8+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0NyIgPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYjEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2U3IiA+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWIxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVxdWVzdDgiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWIxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2U4Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmliMSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBYnN0cmFjdENvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0yIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGlsZENvbXBsZXhUeXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkFic3RyYWN0Q29tcGxleFR5cGUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcm0zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFueT48L3hzZDphbnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHNkOnNjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTEiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0MSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlMSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlMSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTIiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0MiIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlMiI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlMiIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTMiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0MyIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlMyI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlMyIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTQiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0NCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlNCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTUiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0NSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlNSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTYiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0NiIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNiI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlNiIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTciPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0NyIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNyI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlNyIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTgiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0OCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlOCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOlJlc3BvbnNlOCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJGYXVsdE1lc3NhZ2UiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpSZXF1ZXN0MSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jdW1lbnRVbndyYXBwaW5nUG9ydFR5cGUiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uMSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVxdWVzdE1lc3NhZ2UxIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlc3BvbnNlTWVzc2FnZTEiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjIiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlcXVlc3RNZXNzYWdlMiIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXNwb25zZU1lc3NhZ2UyIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24zIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTMiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlMyIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uNCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVxdWVzdE1lc3NhZ2U0Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlc3BvbnNlTWVzc2FnZTQiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlcXVlc3RNZXNzYWdlNSIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXNwb25zZU1lc3NhZ2U1Ii8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb242Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTYiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNiIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb245Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTciLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNyIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24xMCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVxdWVzdE1lc3NhZ2U4Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlc3BvbnNlTWVzc2FnZTgiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uNyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVxdWVzdE1lc3NhZ2UxIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjgiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlcXVlc3RNZXNzYWdlMSIvPgotICAgICAgICAgICAgPHdzZGw6ZmF1bHQgbWVzc2FnZT0idG5zOkZhdWx0TWVzc2FnZSIgbmFtZT0iVGVzdEZhdWx0Ii8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jdW1lbnRVbndyYXBwaW5nVGVzdEJpbmRpbmciIHR5cGU9InRuczpEb2N1bWVudFVud3JhcHBpbmdQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uMSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb24xIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uMiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb24yIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uMyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb24zIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uNCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb240Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uNSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb241Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uNiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb242Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uNyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb243Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uOCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb244Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iVGVzdEZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZT0iVGVzdEZhdWx0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb245Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3dzZGx0ZXN0L09wZXJhdGlvbjkiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24xMCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb24xMCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkRvY3VtZW50VW53cmFwcGluZ1Rlc3RTZXJ2aWNlIj4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jdW1lbnRVbndyYXBwaW5nVGVzdEJpbmRpbmciIG5hbWU9InBvcnQxIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ1Vud3JhcHBpbmdUZXN0LndzZGwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ1Vud3JhcHBpbmdUZXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWMzMGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENVbndyYXBwaW5nVGVzdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgbmFtZT0id3NkbGFkbWludGVzdCIKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3dzZGx0ZXN0LyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC8iCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgICAgIHhtbG5zOnA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXF1ZXN0VHlwZTEiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXNwb25zZVR5cGUxIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWJzdHJhY3RUeXBlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVxdWVzdFR5cGUyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6QWJzdHJhY3RUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXNwb25zZVR5cGUyIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6QWJzdHJhY3RUeXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTEiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXNwb25zZU1lc3NhZ2UxIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTIiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFydDIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvblJlc3BvbnNlTWVzc2FnZTIiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFydDIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvblJlcXVlc3RNZXNzYWdlMyI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFydDEiIHR5cGU9InRuczpSZXF1ZXN0VHlwZTEiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvblJlc3BvbnNlTWVzc2FnZTMiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiB0eXBlPSJ0bnM6UmVzcG9uc2VUeXBlMSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTQiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiB0eXBlPSJ0bnM6UmVxdWVzdFR5cGUyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb25SZXNwb25zZU1lc3NhZ2U0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgdHlwZT0idG5zOlJlc3BvbnNlVHlwZTIiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLQotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlJQQ1Vud3JhcHBpbmdQb3J0VHlwZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24xIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTEiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlMSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uMiI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVxdWVzdE1lc3NhZ2UyIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlc3BvbnNlTWVzc2FnZTIiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjMiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlcXVlc3RNZXNzYWdlMyIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXNwb25zZU1lc3NhZ2UzIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb240Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpPcGVyYXRpb25SZXF1ZXN0TWVzc2FnZTQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlNCIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJQQ1Vud3JhcHBpbmdCaW5kaW5nIiB0eXBlPSJ0bnM6UlBDVW53cmFwcGluZ1BvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uMSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9PcGVyYXRpb24xIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vYXhpczIub3JnL3Rlc3QxIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL2F4aXMyLm9yZy90ZXN0MiIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvT3BlcmF0aW9uMiIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL2F4aXMyLm9yZy90ZXN0MSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9heGlzMi5vcmcvdGVzdDIiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24zIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3dzZGx0ZXN0L09wZXJhdGlvbjIiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb240Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3dzZGx0ZXN0L09wZXJhdGlvbjIiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJSUENVbndyYXBwaW5nU2VydmljZVRlc3QiPgotICAgICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpSUENVbndyYXBwaW5nQmluZGluZyIgbmFtZT0icG9ydDEiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy8iLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUm9idXN0SW5Pbmx5U2VydmljZVRlc3Qud3NkbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUm9idXN0SW5Pbmx5U2VydmljZVRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiMzVhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JvYnVzdEluT25seVNlcnZpY2VUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIG5hbWU9IndzZGxhZG1pbnRlc3QiCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvd3NkbHRlc3QvIgotICAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgICB4bWxuczpwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvblJlcXVlc3RNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6UmVxdWVzdCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uUmVzcG9uc2VNZXNzYWdlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6UmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkZhdWx0TWVzc2FnZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOkZhdWx0IiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJ3c2RsdGVzdCI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJPcGVyYXRpb24iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvblJlcXVlc3RNZXNzYWdlIi8+Ci0gICAgICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJDb25uZWN0aW9uRmFpbHVyZSIgbWVzc2FnZT0idG5zOkZhdWx0TWVzc2FnZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IndzZGx0ZXN0U09BUCIgdHlwZT0idG5zOndzZGx0ZXN0Ij4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiAgc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy93c2RsdGVzdC9OZXdPcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iQ29ubmVjdGlvbkZhaWx1cmUiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iQ29ubmVjdGlvbkZhaWx1cmUiLz4KLSAgICAgICAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IndzZGx0ZXN0Ij4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6d3NkbHRlc3RTT0FQIiBuYW1lPSJ3c2RsdGVzdFNPQVAiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy8iLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVmVyc2lvbi53c2RsIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9WZXJzaW9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjE4ZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9WZXJzaW9uLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6bnMwPSJodHRwOi8vYXhpc3ZlcnNpb24uc2FtcGxlL3hzZCIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL29yZy5hcGFjaGUuYXhpczIveHNkIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9heGlzdmVyc2lvbi5zYW1wbGUveHNkIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczpucz0iaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXhpc3ZlcnNpb24uc2FtcGxlL3hzZCI+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFeGNlcHRpb25GYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkV4Y2VwdGlvbiIgbmlsbGFibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDwveHM6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25SZXF1ZXN0Ii8+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRWZXJzaW9uUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zMDpnZXRWZXJzaW9uUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25GYXVsdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnMwOkV4Y2VwdGlvbkZhdWx0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iVmVyc2lvblBvcnRUeXBlIj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibnMwOmdldFZlcnNpb25SZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOmdldFZlcnNpb24iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJuczA6Z2V0VmVyc2lvblJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOmdldFZlcnNpb25SZXNwb25zZSIvPgotICAgICAgICAgICAgPHdzZGw6ZmF1bHQgbWVzc2FnZT0ibnMwOmdldFZlcnNpb25GYXVsdCIgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpnZXRWZXJzaW9uRmF1bHQiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJWZXJzaW9uU09BUDExQmluZGluZyIgdHlwZT0ibnMwOlZlcnNpb25Qb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0VmVyc2lvbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFZlcnNpb24iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImdldFZlcnNpb25GYXVsdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJnZXRWZXJzaW9uRmF1bHQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IlZlcnNpb25TT0FQMTJCaW5kaW5nIiB0eXBlPSJuczA6VmVyc2lvblBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXAxMjpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFZlcnNpb24iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJnZXRWZXJzaW9uRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwMTI6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJnZXRWZXJzaW9uRmF1bHQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IlZlcnNpb25IdHRwQmluZGluZyIgdHlwZT0ibnMwOlZlcnNpb25Qb3J0VHlwZSI+Ci0gICAgICAgIDxodHRwOmJpbmRpbmcgdmVyYj0iUE9TVCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0VmVyc2lvbiI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IlZlcnNpb24vZ2V0VmVyc2lvbiIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iZ2V0VmVyc2lvbiIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImdldFZlcnNpb24iLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJWZXJzaW9uIj4KLSAgICAgICAgPHdzZGw6cG9ydCBuYW1lPSJWZXJzaW9uU09BUDExcG9ydF9odHRwIiBiaW5kaW5nPSJuczA6VmVyc2lvblNPQVAxMUJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEyNy4wLjAuMTo4MDAwL2F4aXMyL3NlcnZpY2VzL1ZlcnNpb24iLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iVmVyc2lvblNPQVAxMnBvcnRfaHR0cCIgYmluZGluZz0ibnMwOlZlcnNpb25TT0FQMTJCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEyNy4wLjAuMTo4MDAwL2F4aXMyL3NlcnZpY2VzL1ZlcnNpb24iLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iVmVyc2lvbkh0dHBwb3J0IiBiaW5kaW5nPSJuczA6VmVyc2lvbkh0dHBCaW5kaW5nIj4KLSAgICAgICAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC9heGlzMi9zZXJ2aWNlcy9WZXJzaW9uIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwyMC9Ib3RlbFJlc2VydmF0aW9uU2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbDIwL0hvdGVsUmVzZXJ2YXRpb25TZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjllY2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbDIwL0hvdGVsUmVzZXJ2YXRpb25TZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVzY3JpcHRpb24KLSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbCIKLSAgICB0YXJnZXROYW1lc3BhY2U9ICJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvd3NkbC9yZXNTdmMiCi0gICAgeG1sbnM6dG5zPSAiaHR0cDovL2dyZWF0aC5leGFtcGxlLmNvbS8yMDA0L3dzZGwvcmVzU3ZjIgotICAgIHhtbG5zOmdobnMgPSAiaHR0cDovL2dyZWF0aC5leGFtcGxlLmNvbS8yMDA0L3NjaGVtYXMvcmVzU3ZjIgotICAgIHhtbG5zOndzb2FwPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL3NvYXAiCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIj4KLQotICA8ZG9jdW1lbnRhdGlvbj4KLSAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgR3JlYXRIIFdlYiBzZXJ2aWNlLiAgQWRkaXRpb25hbAotICAgIGFwcGxpY2F0aW9uLWxldmVsIHJlcXVpcmVtZW50cyBmb3IgdXNlIG9mIHRoaXMgc2VydmljZSAtLQotICAgIGJleW9uZCB3aGF0IFdTREwgMi4wIGlzIGFibGUgdG8gZGVzY3JpYmUgLS0gYXJlIGF2YWlsYWJsZQotICAgIGF0IGh0dHA6Ly9ncmVhdGguZXhhbXBsZS5jb20vMjAwNC9yZXNlcnZhdGlvbi1kb2N1bWVudGF0aW9uLmh0bWwKLSAgPC9kb2N1bWVudGF0aW9uPgotCi0gIDx0eXBlcz4KLSAgICA8eHM6c2NoZW1hCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvc2NoZW1hcy9yZXNTdmMiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvc2NoZW1hcy9yZXNTdmMiPgotCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjaGVja0F2YWlsYWJpbGl0eSIgdHlwZT0idENoZWNrQXZhaWxhYmlsaXR5Ii8+Ci0gICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0idENoZWNrQXZhaWxhYmlsaXR5Ij4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgIDx4czplbGVtZW50ICBuYW1lPSJjaGVja0luRGF0ZSIgdHlwZT0ieHM6ZGF0ZSIvPgotICAgICAgICAgIDx4czplbGVtZW50ICBuYW1lPSJjaGVja091dERhdGUiIHR5cGU9InhzOmRhdGUiLz4KLSAgICAgICAgICA8eHM6ZWxlbWVudCAgbmFtZT0icm9vbVR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hlY2tBdmFpbGFiaWxpdHlSZXNwb25zZSIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImludmFsaWREYXRhRXJyb3IiIHR5cGU9InhzOnN0cmluZyIvPgotCi0gICAgPC94czpzY2hlbWE+Ci0gIDwvdHlwZXM+Ci0KLSAgPGludGVyZmFjZSAgbmFtZSA9ICJyZXNlcnZhdGlvbkludGVyZmFjZSIgPgotCi0gICAgPGZhdWx0IG5hbWUgPSAiaW52YWxpZERhdGFGYXVsdCIKLSAgICAgICAgICAgIGVsZW1lbnQgPSAiZ2huczppbnZhbGlkRGF0YUVycm9yIi8+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Im9wQ2hlY2tBdmFpbGFiaWxpdHkiCi0gICAgICAgICAgICBwYXR0ZXJuPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0IiA+Ci0gICAgICAgIDxpbnB1dCBtZXNzYWdlTGFiZWw9IkluIgotICAgICAgICAgICAgICBlbGVtZW50PSJnaG5zOmNoZWNrQXZhaWxhYmlsaXR5IiAvPgotICAgICAgICA8b3V0cHV0IG1lc3NhZ2VMYWJlbD0iT3V0IgotICAgICAgICAgICAgICBlbGVtZW50PSJnaG5zOmNoZWNrQXZhaWxhYmlsaXR5UmVzcG9uc2UiIC8+Ci0gICAgICAgIDxvdXRmYXVsdCByZWY9InRuczppbnZhbGlkRGF0YUZhdWx0IiBtZXNzYWdlTGFiZWw9Ik91dCIvPgotICAgIDwvb3BlcmF0aW9uPgotCi0gIDwvaW50ZXJmYWNlPgotCi0gIDxiaW5kaW5nIG5hbWU9InJlc2VydmF0aW9uU09BUEJpbmRpbmciCi0JICBpbnRlcmZhY2U9InRuczpyZXNlcnZhdGlvbkludGVyZmFjZSIKLQkgIHR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9zb2FwMTIiCi0JICB3c29hcDpwcm90b2NvbD0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAiPgotCi0gICAgPG9wZXJhdGlvbiByZWY9InRuczpvcENoZWNrQXZhaWxhYmlsaXR5IgotICAgICAgd3NvYXA6bWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0Ii8+Ci0KLSAgICA8ZmF1bHQgcmVmPSJ0bnM6aW52YWxpZERhdGFGYXVsdCIKLSAgICAgIHdzb2FwOmNvZGU9InNvYXA6U2VuZGVyIi8+Ci0KLSAgPC9iaW5kaW5nPgotCi0gIDxzZXJ2aWNlIG5hbWU9InJlc2VydmF0aW9uU2VydmljZSIKLSAgICAgICBpbnRlcmZhY2U9InRuczpyZXNlcnZhdGlvbkludGVyZmFjZSI+Ci0KLSAgICAgPGVuZHBvaW50IG5hbWU9InJlc2VydmF0aW9uRW5kcG9pbnQiCi0gICAgICAgICAgICAgICBiaW5kaW5nPSJ0bnM6cmVzZXJ2YXRpb25TT0FQQmluZGluZyIKLSAgICAgICAgICAgICAgIGFkZHJlc3MgPSJodHRwOi8vZ3JlYXRoLmV4YW1wbGUuY29tLzIwMDQvcmVzZXJ2YXRpb24iLz4KLQotICA8L3NlcnZpY2U+Ci0KLTwvZGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3R5cGUtdGVzdC54c2QgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvdHlwZS10ZXN0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjODVhYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvdHlwZS10ZXN0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE2MzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tCi0xc3QgRHJhZnQgcmVsZWFzZSAoMjcvMTAvMjAwNSkKLTEuIFJlbW92ZWQgYWxsIE1ldGVyIGFuZCBSZXZlbnVlIHNwZWNpZmljIG9iamVjdHMuCi0yLiBSZW5hbWVkIGFsbCAiRUQiIHRvICJNZXRlciIuCi0zLiBNb3ZlZCA8RGF5TGFzdFB1cmNoYXNlPiBlbGVtZW50IGZyb20gPEN1c3REZXRhaWw+IGNvbXBsZXggdHlwZSB0byBhIG5ldyBjb21wbGV4IHR5cGUgPEN1c3RWZW5kRGV0YWlsPi4gPEN1c3RWZW5kRGV0YWlsPiBleHRlbmRzIDxDdXN0RGV0YWlsPi4JCi00LiBBZGRlZCBnZW5lcmljIFNUUyBidXNpbmVzcyBydWxlIGV4Y2VwdGlvbnMuCi01LiBSZW1vdmVkIDxoZWFkZXI+IGVudW1lcmF0aW9uLgotNi4gQ3JlYXRlZCBhYnN0cmFjdCA8RGV2aWNlSUQ+IGFuZCA8RUFORGV2aWNlSUQ+IGFzIGEgZXh0ZW5zaW9uLgotNy4gUmVwbGFjZWQgPFRva2VuPiB3aXRoIDxDcmVkaXRUb2tlblR4PiBmb3IgPFZlcmlmeVJlc3A+LgotOC4gPENsaWVudFN0YXR1cz4gbm93IGFzc29jaWF0ZWQgd2l0aCA8QmFzZVZlbmRSZXNwPi4KLTkuPEN1c3RWZW5kRGV0YWlsPiBub3cgYXNzb2NpYXRlZCB3aXRoIDxCYXNlVmVuZFJlc3A+Ci0xMC4gUmVtb3ZlZCA8Q3JlZGl0VXBkYXRlPiBmcm9tIDxDbGllbnRTdGF0dXM+LgotMTEuIExvZ2luIGFuZCBMb2dvdXQgbWVzc2FnZSBwYWlycyByZW1vdmVkLgotMjgvMTAvMjAwNQkKLTEyLiA8Q3JlZGl0U3RhdHVzPiByZW1vdmVkLCA8YXZhaWxDcmVkaXQ+IGVsZW1lbnQgYWRkZWQgdG8gPENsaWVudFN0YXR1cz4uCi0xMy4gPGVhbj4gY2hhbmdlZCB0byBhbiBhdHRyaWJ1dGUuCi0xNC4gPHRlcm1pbmFsSUQ+IDxpZD4gY2hhbmdlZCB0byBhdHRyaWJ1dGUuCi0xNS4gPG1zZ0lEPiBjaGFuZ2VkIHRvIGF0dHJpYnV0ZS4KLTE2LiA8TXNnSURVbmlxdWVOdW1iZXI+IGRhdGF0eXBlIGNoYW5nZSJwb3N0aXZlSW50ZWdlciIKLTcvMTEvMjAwNQotMTcuIDxoZWFkZXI+IHJlbmFtZWQgdG8gPGRpc3BIZWFkZXI+IGFuZCBtYWRlIG9wdGlvbmFsLicKLTE4LiBjb3JyZWN0ZWQgbmFtaW5nIGNvbnZlbnRpb24gZm9yIDxDdXJyZW5jeT4uCi0xMC8xMS8yMDA1Ci0xOS4gQWRkZWQgPHJlc3BEYXRlVGltZT4gdG8gPEJhc2VSZXNwPi4JCi0yMC4gUmVuYW1lZCA8Q3VzdG9tZXJJZGVudGlmaWVyPiB0byA8Q3VzdElkZW50aWZpZXI+LgkKLTIxLiBSZW5hbWUgPGN1c3RvbWVyTXNnPiB0byA8Y3VzdE1zZz4KLTIyLiA8VEFYPiwgPGFtdD4gbWFkZSBtYW5kYXRvcnkuCi0yMy4gPFhNTFZlbmRGYXVsdD4gcmVuYW1lZCB0byA8WE1MVmVuZEZhdWx0RXg+LgotMjQuIDxMYXN0ZXN0S1JORXg+IGNvcnJlY3RlZCB0byA8TGF0ZXN0S1JORXg+Ci0xNi8xMS8yMDA1Ci0yNS4gQWRkZWQgPGRlc2M+IHRvIDxNZXRlclNwZWNpZmljVG9rZW5Jc3N1ZT4gY29tcGxleCB0eXBlLgotMjYuIEFkZGVkIHRoZSBmb2xsb3dpbmcgPENyZWRpdFZlbmRUb2tlbklzc3VlPiBzcGVjaWFsaXNhdGlvbnMsIDxTYWxlVG9rZW5Jc3N1ZT4sIDxGQkVUb2tlbklzc3VlPiwgPE1DVFRva2VuSXNzdWU+IGFuZCA8RnJlZVRvS2VuSXNzdWU+LiBUaGlzIGVuYWJsZXMgbW9yZSB0aGFuIG9uZSB0eXBlIG9mIHRva2VuIHRvIGJlIHJldHVybmVkLgotMjcuIFVwZGF0ZWQgPEtDVG9rZW5Jc3N1ZT4gdG8gYmUgYSBzcGVjaWFsaXNhdGlvbiBvZiA8TWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWU+IGFuZCBub3QgPE1ldGVyU3BlY2lmaWNUb2tlbklzc3VlPi4KLTI4LiA8Q3VycmVuY3k+LCA8dmFsdWU+IGNoYW5nZWQgdG8gYW4gYXR0cmlidXRlLgotMjkuIDxVdGlsaXR5RGV0YWlsPiwgYWxsIHN1YiBlbGVtZW50cyBtYWRlIGF0dHJpYnV0ZXMuCi0zMC4gPFZlbmRvckRldGFpbD4sIGFsbCBzdWIgZWxlbWVudHMgbWFkZSBhdHRyaWJ1dGVzLgotMzEuIENyZWF0ZWQgPFVuaXRzPiBjb21wbGV4IHR5cGUsIHVwZGF0ZSA8Q3JlZGl0VG9rZW5Jc3N1ZT4gd2l0aCBpdC4KLTMyLiA8Q3VzdERldGFpbD4sIGFsbCBzdWIgZWxlbWVudHMgbWFkZSBhdHRyaWJ1dGVzLgotMzMuIDxDdXN0VmVuZERldGFpbD4gc3ViIGVsZW1lbnRzIG1hZGUgYXR0cmlidXRlcy4KLTM0LiA8TWV0ZXJEZXRhaWw+LCA8RXh0TWV0ZXJEZXRhaWw+LCA8TWV0ZXJUeXBlPiwgc3ViIGVsZW1lbnQgbWFkZSBhdHRyaWJ1dGVzLgkKLTM1LiA8dHJhY2syRGF0YT4gbWFkZSAicmVxdWlyZWQiIGluIDxFeHRNZXRlckRldGFpbD4gY29tcGxleCB0eXBlLgotMzYuIDxLQ1REYXRhPiwgc3ViIGVsZW1lbnRzIG1hZGUgYXR0cmlidXRlcy4KLTIyLzExLzIwMDUJCi0zNy4gPE1TTk8+IHJlZ3VsYXIgZXhwcmVzc2lvbiB1cGRhdGVkIHRvIChcUyl7MywxM30gCQotLS0+Ci08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cubnJzLmVza29tLmNvLnphL3htbHZlbmQvYmFzZS8yLjAvc2NoZW1hIgotCXhtbG5zOmkwPSJodHRwOi8vd3d3Lm5ycy5lc2tvbS5jby56YS94bWx2ZW5kL2Jhc2UvMi4wL3NjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIj4KLQk8YW5ub3RhdGlvbj4KLQkJPGRvY3VtZW50YXRpb24+IEhhbmQgY29kZWQgWE1MIFNjaGVtYSBmb3IgTlJTIFByZXBhaWQgVXRpbGl0eSBWZW5kaW5nIFNlcnZpY2UgZGVmaW5pbmcgYmFzZQotCQkJKGNvbW1vbikgbGlicmFyeSBmb3IgdGhlIFZlbmRpbmcgTWFya3VwIExhbmd1YWdlIChYTUxWZW5kKSBmb3IgU09BUCByZXF1ZXN0IGFuZCByZXNwb25zZQotCQkJbWVzc2FnZXMgWyoqKiBXUy1JIENvbXBsaWFudCAqKiogc2VlIGh0dHA6Ly93d3cud3MtaS5vcmddIFZlcnNpb24gTnVtYmVyIERhdGUgTmFtZXNwYWNlCi0JCQkyLjAgT2N0b2JlciAyMDA1Ci0JCWh0dHA6Ly93d3cubnJzLmVza29tLmNvLnphL3htbHZlbmQvYmFzZS8yLjAvc2NoZW1hLzIwMDUvMTA8L2RvY3VtZW50YXRpb24+Ci0JPC9hbm5vdGF0aW9uPgotCTxlbGVtZW50IG5hbWU9ImFkdmljZVJlcSIgdHlwZT0iaTA6QWR2aWNlUmVxIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU3lzdGVtIGdlbmVyYXRlZCBjbGllbnQgcmVxdWVzdCBtZXNzYWdlIHRvIGFkdmlzZSB0aGUgc2VydmVyIG9mIHRoZQotCQkJCW91dGNvbWUgb2YgYSB1c2UgY2FzZSBvbiB0aGUgY2xpZW50LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2VsZW1lbnQ+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkFkdmljZVJlcSIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXF1ZXN0IG11c3QgYmUgZXh0ZW5kZWQgdG8gYWR2aXNlIHRoZSBzZXJ2ZXIgdG8gdGFrZSBhbiBhcHByb3ByaWF0ZQotCQkJCWFjdGlvbiBiYXNlZCBvbiB0aGUgb3V0Y29tZSBvZiBwcmV2aW91cyB1c2UgY2FzZSBvbiB0aGUgY2xpZW50LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCYXNlUmVxIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJhZHZpY2VSZXFNc2dJRCIgdHlwZT0iaTA6TXNnSUQiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBvcmlnaW5hbCByZXF1ZXN0IE1zZ0lEIHRoYXQgaXMgYmVpbmcgYWR2aXNlZC4KLQkJCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8ZWxlbWVudCBuYW1lPSJhZHZpY2VSZXNwIiB0eXBlPSJpMDpBZHZpY2VSZXNwIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU2VydmVyIHJlc3BvbnNlIG1lc3NhZ2UgdG8gYSBhZHZpY2UgcmVxdWVzdCBtZXNzYWdlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2VsZW1lbnQ+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkFkdmljZVJlc3AiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUmVzcG9uc2UgdG8gYWR2aWNlIHJlcXVlc3QuIENvbmZpcm1pbmcgdGhhdCB0aGUgYWR2aWNlIGhhcyBiZWVuCi0JCQkJcHJvY2Vzc2VkIGJ5IHRoZSBzZXJ2ZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJhc2VSZXNwIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJhZHZpY2VSZXFNc2dJRCIgdHlwZT0iaTA6TXNnSUQiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBvcmlnaW5hbCByZXF1ZXN0IE1zZ0lEIHRoYXQgaGFzIGJlZW4gYWR2aXNlZC4KLQkJCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8ZWxlbWVudCBuYW1lPSJ4bWx2ZW5kRmF1bHRSZXNwIiB0eXBlPSJpMDpYTUxWZW5kRmF1bHRSZXNwIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUmVzcG9uc2UgdG8gYSBYTUxWZW5kIGV4Y2VwdGlvbiwgYnVzaW5lc3MgcnVsZSBleGNlcHRpb24gb3IgYSBzeXN0ZW0KLQkJCQlleGNlcHRpb24gdGhhdCBvY2N1cnMgb24gdGhlIHNlcnZlciB3aGVuIHByb2Nlc3NpbmcgYW55IG90aGVyIHJlcXVlc3QuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2VsZW1lbnQ+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlhNTFZlbmRGYXVsdFJlc3AiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXNwb25zZSB0byBhIFhNTFZlbmQgZXhjZXB0aW9uIG9yIGJ1c2luZXNzIHJ1bGUgZXhjZXB0aW9uIHRoYXQgb2NjdXJzCi0JCQkJb24gdGhlIHNlcnZlciB3aGVuIHByb2Nlc3NpbmcgYW55IG90aGVyIHJlcXVlc3QuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJhc2VSZXNwIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJmYXVsdCIgdHlwZT0iaTA6RmF1bHQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tIE1lc3NhZ2UgRGVmaW5pdGlvbnMgIEVuZHMtLT4KLQk8IS0tIENvbXBsZXggRWxlbWVudCBEZWZpbml0aW9ucyBTdGFydHMgLS0+Ci0JPCEtLUFkdmljZSBSZXEgU3BlY2lhbGlzYXRpb25zIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDb25maXJtYXRpb25BZHZpY2VSZXEiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBZHZpY2Ugc3BlY2lhbGlzYXRpb24sIHVzZWQgdG8gYnkgdGhlIGNsaWVudCB0byBjb25maXJtIHRoYXQgYSBwcmV2aW91cwotCQkJCXVzZWQgY2FzZSBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpBZHZpY2VSZXEiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InBheVR5cGUiIHR5cGU9ImkwOlBheVR5cGUiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFVzZWQgdG8gYWR2aXNlIHRoZSBzZXJ2ZXIgb2YgdGhlIHBheSB0eXBlIHRoYXQgd2FzIHVzZWQKLQkJCQkJCQkJaW4gdGhlIHRyYW5zYWN0aW9uLiBUaGF0IGlzLCB0aGUgcGF5IHR5cGUgbWF5IG5vdCBoYXZlIGJlZW4KLQkJCQkJCQkJYXZhaWxhYmxlIGluIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iUmV2ZXJzYWxBZHZpY2VSZXEiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBZHZpc2Ugc3BlY2lhbGlzYXRpb24sIHVzZWQgdG8gYWR2aXNlIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJCQl0cmFuc2FjdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb24gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBzaG91bGQKLQkJCQlyZXZlcnNlIHRoZSB0cmFuc2FjdGlvbi4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QWR2aWNlUmVxIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTGFzdFJlc3BBZHZpY2VSZXEiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBBZHZpc2Ugc3BlY2lhbGlzYXRpb24sIHVzZWQgdG8gYWR2aXNlIHRoZSBzZXJ2ZXIgdGhlIHNlcnZlciB0byByZXNlbmQKLQkJCQl0aGUgbGFzdCByZXNwb25zZSB0byB0aGUgbGFzdCBjbGllbnQgcmVxdWVzdCwgYXMgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QKLQkJCQlzdWNjZXNzZnVsbHkgY29tcGxldGVkIG9uIHRoZSBjbGllbnQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkFkdmljZVJlcSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLUFkdmljZSBSZXEgU3BlY2lhbGlzYXRpb25zIEVuZHMtLT4KLQk8IS0tQWR2aWNlIFJlc3BvbnNlIFNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ29uZmlybWF0aW9uQWR2aWNlUmVzcCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFJlc3BvbnNlIHRvIGNvbmZpcm1hdGlvbiBhZHZpY2UuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkFkdmljZVJlc3AiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idHhDb25maXJtZWQiIHR5cGU9ImJvb2xlYW4iPgotCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCTxkb2N1bWVudGF0aW9uPiB0cnVlIC0gdHJhbnNhY3Rpb24gY29uZmlybWVkLCBmYWxzZSAtIHRyYW5zYWN0aW9uIGNvdWxkIG5vdAotCQkJCQkJCWJlIGNvbmZpcm1lZC4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJPC9hdHRyaWJ1dGU+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJSZXZlcnNhbEFkdmljZVJlc3AiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkFkdmljZVJlc3AiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idHhSZXZlcnNlZCIgdHlwZT0iYm9vbGVhbiI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+IHRydWUgLSB0cmFuc2FjdGlvbiByZXZlcnNlIG9uIHNlcnZlciwgZmFsc2UgLSB0cmFuc2FjdGlvbgotCQkJCQkJCWNvdWxkIG5vdCBiZSByZXZlcnNlZCBvbiBzZXJ2ZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCTwvYXR0cmlidXRlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTGFzdFJlc3BBZHZpY2VSZXNwIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUmVzcG9uc2UgdG8gbGFzdFJlc3BvbnNlIGFkdmljZSByZXF1ZXN0LCBjb250YWlucyB0aGUgY29tcGxldGUgbGFzdAotCQkJCXJlc3BvbnNlIG1lc3NhZ2Ugc2VudCBieSB0aGUgc2VydmVyIHRvIHRoaXMgY2xpZW50LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpBZHZpY2VSZXNwIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJsYXN0UmVzcG9uc2UiIHR5cGU9ImkwOkJhc2VSZXNwIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY29tcGxldGUgbGFzdCByZXNwb25zZSBtZXNzYWdlIHRoYXQgd2FzIHJlcXVlc3RlZC4KLQkJCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tQWR2aWNlIFJlc3BvbnNlIFNwZWNpYWxpc2F0aW9ucyBFbmRzLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkF1dGhDcmVkIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUHJvdmlkZXMgb3BlcmF0b3IgYXV0aGVudGljYXRpb24gZGF0YSB0byB0aGUgc2VydmVyIGZyb20gdGhlIGNsaWVudC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ib3BOYW1lIiB0eXBlPSJpMDpPcE5hbWUiLz4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0iaTA6UGFzc3dvcmQiLz4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJuZXdQYXNzd29yZCIgdHlwZT0iaTA6UGFzc3dvcmQiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQSBuZXcgcGFzcyBwaHJhc2UgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlCi0JCQkJCQkicGFzc3dvcmQiIGZpZWxkLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkJhc2VSZXNwIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUmV0dXJuZWQgaW4gZXZlcnkgcmVzcG9uc2UgYW5kIGRlZmluZXMgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgY29udGV4dC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2xpZW50SUQiIHR5cGU9ImkwOkRldmljZUlEIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSB2ZW5kaW5nIGNsaWVudAotCQkJCQkJdGhhdCBpbml0aWF0ZWQgYSB1c2UgY2FzZS4gSWYgY2xpZW50IHNpZGUgWDUwOSBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQsIHRoZW4KLQkJCQkJCXRoZSBpZGVudGlmaWVyIG11c3QgbWF0Y2ggdGhlIHN1YmplY3QgZmllbGQgc3BlY2lmaWVkIGluIHRoZSBjZXJ0aWZpY2F0ZS4KLQkJCQkJCVRoaXMgaWRlbnRpZmllciBpcyB1c3VhbGx5IG1hcHBlZCB0byBhIHNwZWNpZmljIHZlbmRvciBhY2NvdW50IHJlZ2lzdGVyZWQgb24KLQkJCQkJCXRoZSB2ZW5kaW5nIHNlcnZlci4gVGhlIGNsaWVudElEIG1heSBhbHNvIGJlIG1hcHBlZCB0byBDRFUgSUQgZm9yIGxlZ2FjeQotCQkJCQkJcHVycG9zZXMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ic2VydmVySUQiIHR5cGU9ImkwOkRldmljZUlEIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoaXMgaWRlbnRpZmllciBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSB2ZW5kaW5nIHNlcnZlci4KLQkJCQkJCUlmIHNlcnZlciBzaWRlIFg1MDkgY2VydGlmaWNhdGVzIGFyZSB1c2VkLCB0aGVuIHRoZSBpZGVudGlmaWVyIG11c3QgbWF0Y2gKLQkJCQkJCXRoZSBzdWJqZWN0IGZpZWxkIHNwZWNpZmllZCBpbiB0aGUgY2VydGlmaWNhdGUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGVybWluYWxJRCIgdHlwZT0iaTA6RGV2aWNlSUQiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhpcyBpZGVudGlmaWVyIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHZlbmRpbmcgdGVybWluYWwgdGhhdAotCQkJCQkJaW5pdGlhdGVkIHRoZSB1c2UgY2FzZS4gSWYgdGhlIHZlbmRpbmcgY2xpZW50IGFsc28gaXMgYSB0ZXJtaW5hbCB0aGVuIHRoZQotCQkJCQkJdGVybWluYWxJRCBtdXN0IGRlZmF1bHQgdG8gIjEiLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlcU1zZ0lEIiB0eXBlPSJpMDpNc2dJRCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSAibXNnSUQiIHRoYXQgd2FzIGNyZWF0ZWQgaW4gdGhlCi0JCQkJCQljb3JyZXNwb25kaW5nIHJlcXVlc3QgbWVzc2FnZS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXNwRGF0ZVRpbWUiIHR5cGU9ImRhdGVUaW1lIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBkYXRlIHRpbWUgc3RhbXAgb2Ygd2hlbiB0aGUgcmVzcG9uc2Ugd2FzCi0JCQkJCWNyZWF0ZWQuPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkaXNwSGVhZGVyIiB0eXBlPSJpMDpNc2ciPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQSBtZXNzYWdlIHRhcmdldGVkIGF0IHRoZSBvcGVyYXRvciBlLmcuICJWZW5kb3IgY3JlZGl0IGxpbWl0IGlzCi0JCQkJCQlhYm91dCB0byBiZSByZWFjaGVkIi4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJvcGVyYXRvck1zZyIgdHlwZT0iaTA6TXNnIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IEEgbWVzc2FnZSB0YXJnZXRlZCBhdCB0aGUgb3BlcmF0b3IgZS5nLiAiVmVuZG9yIGNyZWRpdCBsaW1pdCBpcwotCQkJCQkJYWJvdXQgdG8gYmUgcmVhY2hlZCIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY3VzdE1zZyIgdHlwZT0iaTA6TXNnIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IEEgbWVzc2FnZSB0YXJnZXRlZCBhdCB0aGUgY3VzdG9tZXIgZS5nLiAiWW91ciBGQkUgdG9rZW4gZm9yCi0JCQkJCQl0aGUgY3VycmVudCBtb250aCBoYXMgbm90IGJlZW4gY2xhaW1lZC4iIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQmFzZVJlcSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFByZXNlbnQgaW4gYWxsIHJlcXVlc3RzLCBkZWZpbmVzIHRoZSByZXF1ZXN0IG1lc3NhZ2UgY29udGV4dC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2xpZW50SUQiIHR5cGU9ImkwOkRldmljZUlEIi8+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGVybWluYWxJRCIgdHlwZT0iaTA6RGV2aWNlSUQiLz4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJtc2dJRCIgdHlwZT0iaTA6TXNnSUQiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhpcyBpcyBhIGlkZW50aWZ5IGZvciB0aGUgcmVxdWVzdCBtZXNzYWdlLiBJdCBpcyBzaG91bGQgYmUKLQkJCQkJCXVuaXF1ZSBhY3Jvc3MgdGhlIHN5c3RlbSwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBjbGllbnRJRC4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJhdXRoQ3JlZCIgdHlwZT0iaTA6QXV0aENyZWQiLz4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJCYXNlVmVuZFJlcSI+Ci0JCTxjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCYXNlUmVxIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0iaTA6UmVzb3VyY2UiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlkTWV0aG9kIiB0eXBlPSJpMDpWZW5kSURNZXRob2QiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQmFzZVZlbmRSZXNwIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCYXNlUmVzcCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2xpZW50U3RhdHVzIiB0eXBlPSJpMDpDbGllbnRTdGF0dXMiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InV0aWxpdHkiIHR5cGU9ImkwOlV0aWxpdHlEZXRhaWwiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InZlbmRvciIgdHlwZT0iaTA6VmVuZG9yRGV0YWlsIi8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjdXN0VmVuZERldGFpbCIKLQkJCQkJCXR5cGU9ImkwOkN1c3RWZW5kRGV0YWlsIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBEZXRhaWxzIGFib3V0IHRoZSBjdXN0b21lciB0aGF0ICJvd25zIiB0aGUgbWV0ZXIuCi0JCQkJCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLUJhdGNoIFNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8IS0tQmF0Y2ggU3BlY2lhbGlzYXRpb25zIEVuZHMtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQmF0Y2hTdGF0dXMiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZXBvcnRzIHRoZSBzdGF0dXMgKG9wZW4gLyBjbG9zZWQpIG9mIHRoZSBhbGwgdGhlIGJhdGNoZXMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJiYW5raW5nIiB0eXBlPSJpMDpCYXRjaFN0YXR1c1R5cGUiLz4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJzYWxlcyIgdHlwZT0iaTA6QmF0Y2hTdGF0dXNUeXBlIi8+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0ic2hpZnQiIHR5cGU9ImkwOkJhdGNoU3RhdHVzVHlwZSIvPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNsaWVudFN0YXR1cyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBzZXJ2ZXIgc3RhdGUgaW4gdGVybXMgb2YgdGhlIGNsaWVudCdzIGNyZWRpdCBhbmQgYmF0Y2ggc3RhdHVzZXMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImF2YWlsQ3JlZGl0IiB0eXBlPSJpMDpDdXJyZW5jeSI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY3VycmVudCB2ZW5kb3IgY3JlZGl0IHRoYXQgaXMgYXZhaWxhYmxlIGZvciBmdXJ0aGVyCi0JCQkJCQl0cmFuc2FjdGlvbnMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iYmF0Y2hTdGF0dXMiIHR5cGU9ImkwOkJhdGNoU3RhdHVzIi8+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tQ3VzdElkZW50aWZpZXIgU3BlY2lhbGlzYXRpb24gLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1c3RJZGVudGlmaWVyIiBhYnN0cmFjdD0idHJ1ZSIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXN0TmFtZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBjdXN0b21lciAtIHVzZWQgYXMgYSBzZWFyY2ggc3RyaW5nLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6Q3VzdElkZW50aWZpZXIiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWUiIHR5cGU9ImkwOlBlcnNvbk5hbWUiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3VzdEFkZHJlc3MiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgY3VzdG9tZXIgLSB1c2VkIGFzIGEgc2VhcmNoIHN0cmluZy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkN1c3RJZGVudGlmaWVyIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJhZGRyZXNzIiB0eXBlPSJpMDpBZGRyZXNzIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1c3RBY2NvdW50Tm8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyB0aGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGN1c3RvbWVyIHdpdGggYSBzcGVjaWZpYwotCQkJCW9yZ2FuaXNhdGlvbiwgdXN1YWxseSB0aGUgVXRpbGl0eSAtIHVzZWQgYXMgYSBzZWFyY2ggc3RyaW5nLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpDdXN0SWRlbnRpZmllciI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ib3JnYW5pc2F0aW9uIgotCQkJCQkJdHlwZT0iaTA6T3JnYW5pc2F0aW9uTmFtZSIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJhY2NObyIgdHlwZT0iaTA6QWNjb3VudE5vIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXN0SUROdW1iZXIiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyB0aGUgZ292ZXJubWVudCBpc3N1ZWQgaWRlbnRpdHkgbnVtYmVyIG9mIHRoZSBjdXN0b21lciAtIHVzZWQgYXMKLQkJCQlhIHNlYXJjaCBzdHJpbmcuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkN1c3RJZGVudGlmaWVyIj4KLQkJCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImlkTm8iIHR5cGU9ImkwOklETm8iLz4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLUN1c3RJZGVudGlmaWVyIFNwZWNpYWxpc2F0aW9uIEVuZHMtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3VzdERldGFpbCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIHRoZSBkZXRhaWxzIG9mIGN1c3RvbWVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgIG5hbWU9Im5hbWUiIHR5cGU9ImkwOlBlcnNvbk5hbWUiLz4KLQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iYWRkcmVzcyIgdHlwZT0iaTA6QWRkcmVzcyIvPgotCQkJPGF0dHJpYnV0ZSB1c2U9Im9wdGlvbmFsIiBuYW1lPSJjb250YWN0Tm8iIHR5cGU9ImkwOkNvbnRhY3RObyIvPgotCQkJPGF0dHJpYnV0ZSB1c2U9Im9wdGlvbmFsIiBuYW1lPSJhY2NObyIgdHlwZT0iaTA6QWNjb3VudE5vIi8+Ci0JCQk8YXR0cmlidXRlIHVzZT0ib3B0aW9uYWwiIG5hbWU9ImxvY1JlZiIgdHlwZT0iaTA6TG9jUmVmIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIGFuIGFsdGVybmF0aXZlIHJlZmVyZW5jZSB0byB0aGUgY3VzdG9tZXIgbG9jYXRpb24sIHN1Y2gKLQkJCQkJCWFzIGEgRXJmIG51bWJlci4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvYXR0cmlidXRlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkN1c3RWZW5kRGV0YWlsIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpDdXN0RGV0YWlsIj4KLQkJCQk8YXR0cmlidXRlIHVzZT0ib3B0aW9uYWwiIG5hbWU9ImRheXNMYXN0UHVyY2hhc2UiIHR5cGU9ImludGVnZXIiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgY3VzdG9tZXIgbGFzdCBwdXJjaGFzZWQgYQotCQkJCQkJCQl0b2tlbi4gVHlwaWNhbGx5IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzZXJ2aWNlIGNoYXJnZSBhcHBsaWNhYmxlLgotCQkJCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkgPC9hdHRyaWJ1dGU+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXJyZW5jeSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5zIHRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IHN5bWJvbC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idmFsdWUiIHR5cGU9ImRlY2ltYWwiLz4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJzeW1ib2wiIHR5cGU9ImkwOkN1cnJlbmN5U3ltYm9sIj4KLQkJCTxhbm5vdGF0aW9uPgotCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgc3ltYm9sIG9mIHRoZSBjdXJyZW5jeSB1c2VkLCBhcyBwZXIgSVNPIDQyMTcuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iRGV2aWNlSUQiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQWJzdHJhY3QgaWRlbnRpZmllciBmb3IgdGhlIGNsaWVudCwgc2VydmVyIG9yIHRlcm1pbmFsLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJFQU5EZXZpY2VJRCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBFQU4gaXMgc2ltcGx5IGEgMTMtZGlnaXQgbnVtYmVyIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlCi0JCQkJY2xpZW50LCBzZXJ2ZXIgb3IgdGVybWluYWwuIEl0cyBiYXNpYyBjb21wb25lbnRzIGFyZTogQW4gRUFOLlVDQyBDb21wYW55IFByZWZpeCwgYQotCQkJCUxvY2F0aW9uIFJlZmVyZW5jZSBhbmQgYSBDaGVjayBEaWdpdC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6RGV2aWNlSUQiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iZWFuIiB0eXBlPSJpMDpFQU4iLz4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkdlbmVyaWNEZXZpY2VJRCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoaXMgaXMgYSBnZW5lcmljIGlkZW50aWZpZXIsIHRoYXQgbWF5IGJlIHVzZWQgdG8gaWRlbnRpZmllciBhIGNsaWVudCwKLQkJCQlzZXJ2ZXIgb3IgdGVybWluYWwuIEl0IGlzIGhvd2V2ZXIgcmVjb21tZW5kZWQgdGhhdCBpdCBiZSB1c2VkIGZvciB0ZXJtaW5hbHMgb25seSBhbmQKLQkJCQlFQU4ncyB1c2VkIGZvciBjbGllbnRzIGFuZCBzZXJ2ZXJzLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpEZXZpY2VJRCI+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJpZCIgdHlwZT0iaTA6TXNnIi8+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1NZXRlclNwZWNpZmljVG9rZW5Jc3N1ZSBTcGVjaWFsaWF0aW9ucy0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRlclNwZWNpZmljVG9rZW5Jc3N1ZSIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPlRva2VuIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIG1ldGVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHNlcXVlbmNlPgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlc2MiIHR5cGU9ImkwOk1zZyI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPgotCQkJCQkJRGVzY3JpcHRpb24gb2YgdGhlIG1ldGVyIHNwZWNpZmljIHRva2VuIGlzc3VlLCBlZy4gUHJlcGF5bWVudCBTYWxlLCBLZXkgQ2hhbmdlIAotCQkJCQk8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im1ldGVyRGV0YWlsIiB0eXBlPSJpMDpNZXRlckRldGFpbCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBEZXRhaWxzIGFib3V0IHRoZSBtZXRlciB3aGVyZSB0aGUgdG9rZW4gd2lsbCBiZSBlbnRlcmVkLiBJbiB0aGUKLQkJCQkJCWNhc2Ugb2YgS0NUb2tlbklzc3VlLCBpdCB3aWxsIGJlIGNvbnRhaW4gdGhlIHVwZGF0ZWQgKFRvKSBtZXRlciBrZXkgZGF0YS4KLQkJCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0b2tlbiIgdHlwZT0iaTA6VG9rZW4iPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGNpcGhlciB0aGF0IHdpbGwgYmUgZW50ZXJlZCBpbnRvIHRoZSBtZXRlciBhcyBwZXIgdGhlIEFUIG9mCi0JCQkJCQl0aGUgbWV0ZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3JlZGl0VG9rZW5Jc3N1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEluZm9ybWF0aW9uIHRoYXQgaXMgcmV0dXJuZWQgd2l0aCBhbGwgY3JlZGl0IHRva2VucyB0aGF0IGFyZSB2ZW5kZWQgYnkKLQkJCQl0aGUgc2VydmVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljVG9rZW5Jc3N1ZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idW5pdHMiIHR5cGU9ImkwOlVuaXRzIi8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0iaTA6UmVzb3VyY2UiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSB0eXBlIG9mIHJlc291cmNlIGJlaW5nIHZlbmRlZCwgZS5nLiBFbGVjdHJpY2l0eSwKLQkJCQkJCQkJd2F0ZXIuLi4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLSBDcmVkaXQgVG9rZW4gSXNzdWUgU3BlY2lhbGlzYXRpb25zIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJTYWxlQ3JlZFRva2VuSXNzdWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPgotCQkJCUNyZWRpdCBUb2tlbiBpc3N1ZSByZXR1cm5lZCBmb3IgYSBub3JtYWwgcHJlcGF5bWVudCBzYWxlIHRva2VuLiBNYXBzIHRvIHRyYW5zYWN0aW9uIHR5cGUsIDAwMCAtIFByZXBheW1lbnQgU2FsZSwgTlJTMDA5LTMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpDcmVkaXRUb2tlbklzc3VlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iRkJFQ3JlZFRva2VuSXNzdWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPgotCQkJCUNyZWRpdCBUb2tlbiBpc3N1ZSByZXR1cm5lZCBmb3IgYSBmcmVlIGJhc2ljIGVsZWN0cmljaXR5IHRva2VuLiBNYXBzIHRvIHRyYW5zYWN0aW9uIHR5cGUsIDAxMCAtIEZCRSB0b2tlbiwgTlJTMDA5LTMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpDcmVkaXRUb2tlbklzc3VlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iRnJlZUNyZWRUb2tlbklzc3VlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4KLQkJCQlDcmVkaXQgVG9rZW4gaXNzdWUgcmV0dXJuZWQgZm9yIGEgZnJlZSB0b2tlbi4gTWFwcyB0byB0cmFuc2FjdGlvbiB0eXBlLCAwMDUgLSBGcmVlIElzc3VlLCBOUlMwMDktMy4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkNyZWRpdFRva2VuSXNzdWUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNQ1RDcmVkVG9rZW5Jc3N1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+Ci0JCQkJQ3JlZGl0IFRva2VuIGlzc3VlIHJldHVybmVkIGZvciBhIG1ldGVyIGNyZWRpdCB0cmFuc2ZlciB0b2tlbi4gTWFwcyB0byB0cmFuc2FjdGlvbiB0eXBlLCAwMDMgLSBSZXBsYWNlbWVudCwgTlJTMDA5LTMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpDcmVkaXRUb2tlbklzc3VlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQkKLQk8Y29tcGxleFR5cGUgbmFtZT0iTWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWUiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gR2VuZXJpYyBNZXRlciBzcGVjaWZpYyBlbmdpbmVlcmluZyB0b2tlbiBpc3N1ZS4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJTcGVjaWZpY1Rva2VuSXNzdWUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1NZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSBTcGVjaWFsaWF0aW9ucy0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJLQ1Rva2VuSXNzdWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBJbmZvcm1hdGlvbiByZXR1cm5lZCB3aXRoIGFsbCBLZXkgQ2hhbmdlIFRva2VuIGlzc3Vlcy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWUiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImtjdERhdGEiIHR5cGU9ImkwOktDVERhdGEiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBGUk9NIGFuZCBUTyBtZXRlciBrZXkgZGF0YS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJwd3JMbXRUb2tlbiIKLQkJCQkJCXR5cGU9ImkwOlB3ckxtdFRva2VuSXNzdWUiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IEEgcG93ZXIgbGltaXQgdG9rZW4gdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpYyB0YXJpZmYKLQkJCQkJCQkJaW5kZXggdGhhdCBpcyBiZWluZyB1cGRhdGVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iUHdyTG10VG9rZW5Jc3N1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IERldGFpbHMgb2YgdGhlIHBvd2VyIGxpbWl0IHRva2VuIGJlaW5nIGlzc3VlZC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWUiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InB3ckxtdCIgdHlwZT0iaTA6UHdyTG10Ij4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgcG93ZXIgbGltaXQgdmFsdWUgdGhhdCB0aGUgbWV0ZXIgd2lsbCBiZSBzZXQgdG8uCi0JCQkJCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlBoVW5iYWxUb2tlbklzc3VlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0icHdyTG10IiB0eXBlPSJpMDpQd3JMbXQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ2xlYXJDcmVkaXRUb2tlbklzc3VlIj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlclNwZWNpZmljRW5nVG9rZW5Jc3N1ZSIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNsZWFyVGFtcGVyVG9rZW5Jc3N1ZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWUiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJXYXRlckZhY3RvclRva2VuSXNzdWUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVyU3BlY2lmaWNFbmdUb2tlbklzc3VlIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ3YXRlckZhY3RvciIgdHlwZT0iaTA6V2F0ZXJGYWN0b3IiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tTWV0ZXJTcGVjaWZpY0VuZ1Rva2VuSXNzdWUgU3BlY2lhbGlzYXRpb25zIEVuZHMtLT4KLQk8IS0tSURNZXRob2QgU3BlY2lhbGlzYXRpb24gLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IklETWV0aG9kIiBhYnN0cmFjdD0idHJ1ZSIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDdXN0SURNZXRob2QiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBJZGVudGlmaWVyIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGN1c3RvbWVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOklETWV0aG9kIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjdXN0SWRlbnRpZmllciIKLQkJCQkJCXR5cGU9ImkwOkN1c3RJZGVudGlmaWVyIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlZlbmRJRE1ldGhvZCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoaXMgaWRlbnRpZmllciBpcyB0eXBpY2FsbHkgdXNlZCB0byBpZGVudGZpeSB0aGUgbWV0ZXIgd2hlcmUgdGhlCi0JCQkJcmVxdWVzdGVkIHRva2VuIHdpbGwgYmUgZW50ZXJlZC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpJRE1ldGhvZCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ibWV0ZXJJZGVudGlmaWVyIgotCQkJCQkJdHlwZT0iaTA6TWV0ZXJJZGVudGlmaWVyIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBJZGVudGlmaWVyIHRoYXQgaWRlbnRpZnkgdGhlIHNwZWNpZmljIG1ldGVyIHdoZXJlIHRoZQotCQkJCQkJCQl0b2tlbiB3aWxsIGJlIGVudGVyZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1JRE1ldGhvZCBTcGVjaWFsaXNhdGlvbiBFbmRzIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJLQ1REYXRhIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIEZST00gYW5kIFRPIG1ldGVyIGtleSBkYXRhLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJmcm9tU0dDIiB0eXBlPSJpMDpTVFNTdXBwbHlHcm91cENvZGUiPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGN1cnJlbnQgbWV0ZXIgc3VwcGx5IGdyb3VwIGNvZGUoU0dDKS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iZnJvbUtSTiIgdHlwZT0iaTA6U1RTS2V5UmV2Tm8iPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGN1cnJlbnQgbWV0ZXIga2V5IHJldmlzaW9uIG51bWJlciAoS1JOKSBmb3IgdGhlIFNHQy4KLQkJCQkJPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0iZnJvbVRJIiB0eXBlPSJpMDpTVFNUYXJpZmZJbmRleCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgY3VycmVudCBtZXRlciB0YXJpZmYgaW5kZXggKFRJKS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idG9TR0MiIHR5cGU9ImkwOlNUU1N1cHBseUdyb3VwQ29kZSI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgbmV3IFNHQy4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idG9LUk4iIHR5cGU9ImkwOlNUU0tleVJldk5vIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBuZXcgS1JOLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0b1RJIiB0eXBlPSJpMDpTVFNUYXJpZmZJbmRleCI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgbmV3IFRJLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRlclR5cGUiPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImF0IiB0eXBlPSJpMDpTVFNBVCIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InR0IiB0eXBlPSJpMDpTVFNUVCIvPgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLU1ldGVySWRlbnRpZmllciBTcGVjaWFsaXNhdGlvbiAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTWV0ZXJJZGVudGlmaWVyIiBhYnN0cmFjdD0idHJ1ZSIvPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRlck51bWJlciI+Ci0JCTxjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpNZXRlcklkZW50aWZpZXIiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0ibXNubyIgdHlwZT0iaTA6TVNOTyIvPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTWV0ZXJDb25maWciIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgYWxsIGluZm9ybWF0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBtZXRlci4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVySWRlbnRpZmllciIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGVyQ2FyZCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBtZXRlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFzIG9idGFpbmVkIGZyb20gdGhlIG1ldGVyIGNhcmQsIGFzCi0JCQkJcGVyIE5SUzAwOS00LTEuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVyQ29uZmlnIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0cmFjazJEYXRhIiB0eXBlPSJpMDpOUlNUcmFjazJEYXRhIi8+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGVyRGV0YWlsIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIG1ldGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgb2J0YWluZWQgZnJvbSBhIG1ldGVyIGNhcmQgb3Igb2xkCi0JCQkJdG9rZW4gb3Igc29tZSBvdGhlciBzb3VyY2Ugd2hlcmUgYWxsIHRoZSBtZXRlciBjb25maWd1cmF0aW9uIGRhdGEgaXMgYXZhaWxhYmxlLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6TWV0ZXJDb25maWciPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im1ldGVyVHlwZSIgdHlwZT0iaTA6TWV0ZXJUeXBlIi8+Ci0JCQkJCQotCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJtc25vIiB0eXBlPSJpMDpNU05PIi8+Ci0JCQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJzZ2MiIHR5cGU9ImkwOlNUU1N1cHBseUdyb3VwQ29kZSIvPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0ia3JuIiB0eXBlPSJpMDpTVFNLZXlSZXZObyIvPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idGkiIHR5cGU9ImkwOlNUU1RhcmlmZkluZGV4Ii8+Ci0JCQkJCi0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJFeHRNZXRlckRldGFpbCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEV4dGVuc2lvbiBvZiB0aGUgbWV0ZXIgZGV0YWlsLCB0byBpbmNsdWRlIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JCQkJbWV0ZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOk1ldGVyRGV0YWlsIj4KLQkJCQk8YXR0cmlidXRlIHVzZT0ib3B0aW9uYWwiIG5hbWU9InVzZVNUVCIgdHlwZT0iYm9vbGVhbiI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gVG9rZW4gZ2VuZXJhdGVkIHdpdGggYSBTdGFuZGFyZCBUb2tlbiBUcmFuc2xhdG9yIChTVFQpLgotCQkJCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2F0dHJpYnV0ZT4KLQkJCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InRyYWNrMkRhdGEiIHR5cGU9ImkwOk5SU1RyYWNrMkRhdGEiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IENvbnRhaW5pbmcgdGhlIG1ldGVyIGNhcmRzIHRyYWNrIDIgZGF0YSwgYXMgcGVyCi0JCQkJCQkJCU5SUzAwOS00LTEuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2F0dHJpYnV0ZT4JCQkKLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLU1ldGVySWRlbnRpZmllciBTcGVjaWFsaXNhdGlvbiBFbmRzIC0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNc2dJRCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFNlcXVlbnRpYWwgaWRlbnRpZmllciB0aGF0IGFsbG93cyBlYWNoIGNsaWVudCByZXF1ZXN0IG1lc3NhZ2UgdG8gYmUKLQkJCQl1bmlxdWVseSBpZGVudGlmaWVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJkYXRlVGltZSIgdHlwZT0iaTA6TXNnSUREYXRlVGltZSIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9InVuaXF1ZU51bWJlciIgdHlwZT0iaTA6TXNnSURVbmlxdWVOdW1iZXIiLz4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1QYXkgVHlwZSBTcGVjaWFsaXNhdGlvbnMgLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlBheVR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gSW5kaWNhdGVzIHRoZSBtZWNoYW5pc20gdXNlZCB0byBwYXkuIEl0IGlzIGV4dGVuZGVkIHRvIGFsbG93IGZvcgotCQkJCWRpZmZlcmVudCB0eXBlcyBvZiBwYXltZW50IG1lY2hhbmlzbXMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNhc2giPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlBheVR5cGUiPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRlbmRlckFtdCIgdHlwZT0iaTA6Q3VycmVuY3kiPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBjYXNoIGFtb3VudCB0ZW5kZXJlZC4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNoZXF1ZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UGF5VHlwZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2hlcUFtdCIgdHlwZT0iaTA6Q3VycmVuY3kiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFjY0hvbGRlck5hbWUiIHR5cGU9ImkwOlBlcnNvbk5hbWUiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkFjY0hvbGRlcklETm8iIHR5cGU9ImkwOklETm8iLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFjY05vIiB0eXBlPSJpMDpBY2NvdW50Tm8iLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImJhbmtOYW1lIiB0eXBlPSJpMDpPcmdhbmlzYXRpb25OYW1lIi8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJicmFuY2hDb2RlIiB0eXBlPSJpMDpCcmFuY2hDb2RlIi8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGVxTm8iIHR5cGU9ImkwOkNoZXF1ZU5vIi8+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGVxVHlwZSIgdHlwZT0iaTA6Q2hlcXVlVHlwZSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ibWljciIgdHlwZT0iaTA6TUlDUiIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJDYXJkIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UGF5VHlwZSI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2FyZEFtdCIgdHlwZT0iaTA6Q3VycmVuY3kiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImFjY0hvbGRlck5hbWUiIHR5cGU9ImkwOlBlcnNvbk5hbWUiLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InBhbiIgdHlwZT0iaTA6QWNjb3VudE5vIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgcHJpbWFyeSBhY2NvdW50IG51bWJlci4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJleHBEYXRlIiB0eXBlPSJpMDpCYW5rQ2FyZEV4cGlyeSIvPgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iY3ZOdW0iIHR5cGU9ImkwOkJhbmtDYXJkQ1ZOdW0iLz4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNsZWFyaW5nSG91c2UiCi0JCQkJCQl0eXBlPSJpMDpPcmdhbmlzYXRpb25OYW1lIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgbmFtZSBvZiB0aGUgY2FyZCBhc3NvY2lhdGlvbiwgZS5nLiBWSVNBLCBNYXN0ZXJDYXJkLAotCQkJCQkJCQlldGMgPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkNyZWRpdENhcmQiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkNhcmQiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJEZWJpdENhcmQiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkNhcmQiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJVbmtub3duIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUmVmZXJzIHRvIGEgcGF5bWVudCB0eXBlIHRoYXQgbWF5IG5vdCBiZSBrbm93biBhdCB0aGUgdGltZSBvZiB0aGUKLQkJCQlyZXF1ZXN0LiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpQYXlUeXBlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tUmVzb3VyY2UgU3BlY2lhbGlzYXRpb25zLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlJlc291cmNlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSB0eXBlIG9mIHByZXBhaWQgcmVzb3VyY2UgYmVpbmcgcmVxdWVzdGVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJFbGVjdHJpY2l0eSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UmVzb3VyY2UiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJXYXRlciI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UmVzb3VyY2UiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJHYXMiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlJlc291cmNlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ29ubmVjdGlvblRpbWUiPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlJlc291cmNlIi8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ3VycmVuY3lSZXNvdXJjZSI+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6UmVzb3VyY2UiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1SZXNvdXJjZSBTcGVjaWFsaXNhdGlvbnMgRW5kcy0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJUYXJpZmYiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFyaWZmIHRoYXQgd2FzIHVzZWQgdG8gcHJvY2VzcyB0aGUKLQkJCQl0cmFuc2FjdGlvbi4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJuYW1lIiB0eXBlPSJpMDpNc2ciPgotCQkJCTxhbm5vdGF0aW9uPgotCQkJCQk8ZG9jdW1lbnRhdGlvbj4gTmFtZSBvZiB0aGUgdGFyaWZmLiBlLmcuIEhvbWUgTGlnaHQgMSA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlc2MiIHR5cGU9ImkwOk1zZyI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSB0YXJpZmYuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tVGF4IHNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVGF4IiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRBWCB0aGF0IGlzIGFwcGxpY2FibGUgdG8gYSB0cmFuc2FjdGlvbi4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJhbXQiIHR5cGU9ImkwOkN1cnJlbmN5Ij4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBUQVggYW1vdW50IG9mIGEgdHJhbnNhY3Rpb24uIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQk8L2Fubm90YXRpb24+Ci0JCQk8L2VsZW1lbnQ+Ci0JCTwvc2VxdWVuY2U+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVkFUIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSBpbnN0YW5jZSBvZiBUQVgsIHJlZmVycmVkIHRvIFZhbHVlIEFkZGVkIFRheCBhbmQgZXhwcmVzc2VkIGFzIGEKLQkJCQlwZXJjZW50YWdlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpUYXgiPgotCQkJCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0icmF0ZSIgdHlwZT0iaTA6UGVyY2VudGFnZSI+Ci0JCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJPGRvY3VtZW50YXRpb24+IFRoZSBwZXJjZW50YWdlIHJhdGUgb2YgVkFULCBhcyBhcHBsaWVkIHRvIHRoZSB0cmFuc2FjdGlvbgotCQkJCQkJCXZhbHVlLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQk8L2F0dHJpYnV0ZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPCEtLVRheCBzcGVjaWFsaXNhdGlvbnMgLS0+Ci0JPCEtLVRva2VuIFNwZWNpYWxpc2F0aW9ucy0tPgotCTxjb21wbGV4VHlwZSBuYW1lPSJUb2tlbiIgYWJzdHJhY3Q9InRydWUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBHZW5lcmljIHByZXBhaWQgdG9rZW4gdGhhdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZlci4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iS0NUb2tlbiI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEEga2V5IGNoYW5nZSB0b2tlbiwgdGhhdCBjb25zaXN0cyBvZiB0d28gU1RTIHRva2Vucy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6VG9rZW4iPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InNldDFzdE1ldGVyS2V5IiB0eXBlPSJpMDpTVFMxVG9rZW4iPgotCQkJCQkJPGFubm90YXRpb24+Ci0JCQkJCQkJPGRvY3VtZW50YXRpb24+IEZpcnN0IDIwIGRpZ2l0IFNUUyB0b2tlbi4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJzZXQybmRNZXRlcktleSIgdHlwZT0iaTA6U1RTMVRva2VuIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBTZWNvbmQgMjAgZGlnaXQgU1RTIHRva2VuLiA8L2RvY3VtZW50YXRpb24+Ci0JCQkJCQk8L2Fubm90YXRpb24+Ci0JCQkJCTwvZWxlbWVudD4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9leHRlbnNpb24+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iU1RTMVRva2VuIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIDIwIGRpZ2l0IFNUUyAxIHRva2VuIGFzIGRlZmluZWQgaW4gdGhlIFNUUyAxIHNwZWNpZmljYXRpb25zLiBGb3IgdGhlCi0JCQkJVHJpYWxDcmVkaXQgVmVuZCByZXF1ZXN0IHRoZSBTVFMxVG9rZW4gdmFsdWUgd2lsbCBkZmF1bHQgdG8gIjAwMDAwMDAwMDAwMDAwMDAiLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6VG9rZW4iPgotCQkJCTxzZXF1ZW5jZT4KLQkJCQkJPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InN0c0NpcGhlciIgdHlwZT0iaTA6U1RTQ2lwaGVyVGV4dCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2V4dGVuc2lvbj4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTwhLS1Ub2tlbiBTcGVjaWFsaXNhdGlvbnMgRW5kcy0tPgotCTwhLS1Ub2tlbiBJbmZvIFNwZWNpYWxpc2F0aW9ucyAtLT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iVG9rZW5JbmZvIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmVwYWlkIHRva2VuIGdlbmVyYXRlZC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iU1RTMVRva2VuSW5mbyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRva2VuIGluZm9ybWF0aW9uIGZvciBTVFMxIHRva2Vucy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6VG9rZW5JbmZvIj4KLQkJCQk8c2VxdWVuY2U+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0b2tlbklEIiB0eXBlPSJkZWNpbWFsIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBBcyBkZWZpbmVkIGJ5IFNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJCTxlbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0cmFuc2ZlckFtdCIgdHlwZT0iZGVjaW1hbCI+Ci0JCQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJCQk8ZG9jdW1lbnRhdGlvbj4gQXMgZGVmaW5lZCBieSBTVFMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwvYW5ub3RhdGlvbj4KLQkJCQkJPC9lbGVtZW50PgotCQkJCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idG9rZW5DbGFzcyIKLQkJCQkJCXR5cGU9ImkwOlRva2VuU3ViQ2xhc3NUeXBlIj4KLQkJCQkJCTxhbm5vdGF0aW9uPgotCQkJCQkJCTxkb2N1bWVudGF0aW9uPiBBcyBkZWZpbmVkIGJ5IFNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQkJCQkJPC9hbm5vdGF0aW9uPgotCQkJCQk8L2VsZW1lbnQ+Ci0JCQkJPC9zZXF1ZW5jZT4KLQkJCTwvZXh0ZW5zaW9uPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlRva2VuU3ViQ2xhc3NUeXBlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUG90ZW50aWFsIHRva2VuIHN1YiBjbGFzcyB0eXBlcywgYXMgcGVyIFNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxzZXF1ZW5jZT4KLQkJCTxjaG9pY2UgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjEiPgotCQkJCTxlbGVtZW50IG5hbWU9ImNyZWRpdCIgdHlwZT0iaTA6Q3JlZGl0VG9rZW5TdWJDbGFzc1R5cGUiLz4KLQkJCQk8ZWxlbWVudCBuYW1lPSJub25NZXRlck1hbmFnZW1lbnQiIHR5cGU9ImkwOk5vbk1ldGVyU3BlY2lmaWNFbmciLz4KLQkJCQk8ZWxlbWVudCBuYW1lPSJtZXRlck1hbmFnZW1lbnQiIHR5cGU9ImkwOk1ldGVyU3BlY2lmaWNFbmciLz4KLQkJCTwvY2hvaWNlPgotCQk8L3NlcXVlbmNlPgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlZlbmRvckRldGFpbCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IE9yZ2FuaXNhdGlvbiB3aG8gaXMgY29udHJhY3RlZCB3aXRoIHRoZSB1dGlsaXR5IHRvIHByb3ZpZGUgcHJlcGFpZAotCQkJCXRva2VuJ3MgdG8gaXQgY3VzdG9tZXJzLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJuYW1lIiB0eXBlPSJpMDpPcmdhbmlzYXRpb25OYW1lIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IE5hbWUgb2YgdGhlIHZlbmRvciwgZS5nLiBGb28gQmFuayA8L2RvY3VtZW50YXRpb24+Ci0JCQkJPC9hbm5vdGF0aW9uPgotCQk8L2F0dHJpYnV0ZT4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJhZGRyZXNzIiB0eXBlPSJpMDpBZGRyZXNzIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IEFkZHJlc3Mgb2YgdGhlIHZlbmRvci4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+CQotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlV0aWxpdHlEZXRhaWwiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBEZXRhaWxzIG9mIHRoZSB1dGlsaXR5IHRoYXQgaXMgc3VwcGx5IGF1dGhvcml0eSBmb3IgdGhlIHByZXBhaWQKLQkJCQlyZXNvdXJjZS4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0ibmFtZSIgdHlwZT0iaTA6T3JnYW5pc2F0aW9uTmFtZSIvPgotCQk8YXR0cmlidXRlIHVzZT0icmVxdWlyZWQiIG5hbWU9ImFkZHJlc3MiIHR5cGU9ImkwOkFkZHJlc3MiLz4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJ0YXhSZWYiIHR5cGU9ImkwOlRheFJlZiI+Ci0JCQkJPGFubm90YXRpb24+Ci0JCQkJCTxkb2N1bWVudGF0aW9uPiBUYXggcmVmZXJlbmNlIG51bWJlciBvZiB0aGUgdXRpbGl0eS4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tIElzc3VlIEZhdWx0ICBhbmQgWE1MdmVuZCBGYXVsdCBTcGVjaWFsaXNhdGlvbnMgLS0+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkZhdWx0IiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEEgZ2VuZXJpYyBmYXVsdCByZXR1cm5lZCBieSB0aGUgc2VydmVyIHRvIGFuIGV4Y2VwdGlvbiBzY2VuYXJpby4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8c2VxdWVuY2U+Ci0JCQk8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVzYyIgdHlwZT0iaTA6TXNnIj4KLQkJCQk8YW5ub3RhdGlvbj4KLQkJCQkJPGRvY3VtZW50YXRpb24+IERlc2NyaXB0aW9uIG9mIHRoZSBmYXVsdCBzY2VuYXJpby4gPC9kb2N1bWVudGF0aW9uPgotCQkJCTwvYW5ub3RhdGlvbj4KLQkJCTwvZWxlbWVudD4KLQkJPC9zZXF1ZW5jZT4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJTeXN0ZW1FeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEEgc3lzdGVtIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IGFuZCB0aGVyZWZvcmUKLQkJCQl0aGUgbm9ybWFsIHJlc3BvbnNlIG1lc3NhZ2UgY2Fubm90IGJlIHJldHVybmVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpGYXVsdCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkJ1c2luZXNzUnVsZUV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSBidXNpbmVzcyBydWxlIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdAotCQkJCW1lc3NhZ2UsIHRoZSBzZXJ2ZXIgaXMgdGhlcmVmb3JlIHVuYWJsZSB0byBjb250aW51ZSB3aXRoIHRoZSBoYXBweSBwYXRoLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6RmF1bHQiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJSZXF1ZXN0QXV0aG9yaXNhdGlvbkV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIHZlbmRvciBpcyBub3QgYXV0aG9yaXNlZCB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QnVzaW5lc3NSdWxlRXgiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJNU05PQ2hlY2tEaWdpdEV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGNoZWNrIGRpZ2l0IG9mIHRoZSBzdXBwbGllZCBNU05PIGNhbiBub3QgYmUgdmVyaWZpZWQuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCdXNpbmVzc1J1bGVFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNHQ0F1dGhvcmlzYXRpb25FeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSB2ZW5kb3IgaXMgbm90IGF1dGhvcmlzZWQgdG8gcHJvZHVjZSB0b2tlbnMgZm9yIG1ldGVycyBvbiB0aGUKLQkJCQlzdXBwbGllZCBTR0MuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJ1c2luZXNzUnVsZUV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iTGF0ZXN0S1JORXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgc3VwcGxpZWQgS1JOIGZvciB0aGUgc3VwcGxpZWQgU0dDIGhhcyBleHBpcmVkLiBBbiB1cGRhdGUgbWV0ZXIga2V5Ci0JCQkJb3BlcmF0aW9uIGlzIHJlcXVpcmVkLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCdXNpbmVzc1J1bGVFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IkZCRUV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGN1c3RvbWVyIGlzIG5vdCByZWdpc3RlcmVkIGZvciBGQkUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOkJ1c2luZXNzUnVsZUV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQmxvY2tlZE1ldGVyRXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgbWV0ZXIgaGFzIGJlZW4gYmxvY2tlZCwgbm8gdHJhbnNhY3Rpb25zIGFyZSBwb3NzaWJsZSwgdGhlIHJlYXNvbiBmb3IKLQkJCQlibG9ja2luZyB3aWxsIHZhcnkuLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCdXNpbmVzc1J1bGVFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlNUU0RhdGFFeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFRoZSBzdXBwbGllZCBkYXRhIGZvciBNU05PLCBTR0MsIEtSTiwgVEksIEFULCBUVCBhcmUgbm90IHZhbGlkLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6QnVzaW5lc3NSdWxlRXgiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJWZW5kb3JDcmVkaXRFeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEluc3VmZmljaWVudCB2ZW5kb3IgY3JlZGl0IHRvIGNvbXBldGUgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpCdXNpbmVzc1J1bGVFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlhNTFZlbmRGYXVsdEV4IiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEEgWE1MVmVuZCBwcm90b2NvbCByZWxhdGVkIGZhdWx0IGhhcyBvY2N1cnJlZC4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxjb21wbGV4Q29udGVudD4KLQkJCTxleHRlbnNpb24gYmFzZT0iaTA6RmF1bHQiLz4KLQkJPC9jb21wbGV4Q29udGVudD4KLQk8L2NvbXBsZXhUeXBlPgotCTxjb21wbGV4VHlwZSBuYW1lPSJVc2VDYXNlU3VwcG9ydEV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU3BlY2lhbGlzYXRpb24gb2YgWE1MVmVuZCBwcm90b2NvbCBleGNlcHRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUKLQkJCQlyZXF1ZXN0ZWQgdXNlIGNhc2UgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIFhNTFZlbmQgaW1wbGVtZW50YXRpb24uIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8Y29tcGxleENvbnRlbnQ+Ci0JCQk8ZXh0ZW5zaW9uIGJhc2U9ImkwOlhNTFZlbmRGYXVsdEV4Ii8+Ci0JCTwvY29tcGxleENvbnRlbnQ+Ci0JPC9jb21wbGV4VHlwZT4KLQk8Y29tcGxleFR5cGUgbmFtZT0iQ2xpZW50SURTU0xFeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFNwZWNpYWxpc2F0aW9uIG9mIFhNTFZlbmQgcHJvdG9jb2wgZXhjZXB0aW9uLCBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JCQkJY2xpZW50SUQgc3VwcGxpZWQgaW4gdGhlIHJlcXVlc3QgZG9lcyBub3QgbWF0Y2ggdGhlIFg1MDkgY2VydGlmaWNhdGUgY2xpZW50SUQuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpYTUxWZW5kRmF1bHRFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9IlhNTFZlbmRTY2hlbWFFeCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFNwZWNpYWxpc2F0aW9uIG9mIFhNTFZlbmQgcHJvdG9jb2wgZXhjZXB0aW9uLCBpbmRpY2F0aW5nIHRoYXQgdGhlCi0JCQkJcmVxdWVzdCBtZXNzYWdlIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIFhNTFZlbmQgc2NoZW1hLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpYTUxWZW5kRmF1bHRFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JPGNvbXBsZXhUeXBlIG5hbWU9Ikxhc3RSZXNwb25zZUV4Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gU3BlY2lhbGlzYXRpb24gb2YgWE1MVmVuZCBwcm90b2NvbCBleGNlcHRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUKLQkJCQlyZXF1ZXN0ZWQgcmVzcG9uc2UgbWVzc2FnZSBjYW4gbm90IGJlIHJldHVybmVkIGFzIHRoZXJlIGlzIG5vdCB0cmFuc2FjdGlvbgotCQkJCWFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIE1zZ0lELiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPGNvbXBsZXhDb250ZW50PgotCQkJPGV4dGVuc2lvbiBiYXNlPSJpMDpYTUxWZW5kRmF1bHRFeCIvPgotCQk8L2NvbXBsZXhDb250ZW50PgotCTwvY29tcGxleFR5cGU+Ci0JCi0JPGNvbXBsZXhUeXBlIG5hbWU9IlVuaXRzIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4KLQkJCQlBbW91bnQgb2YgYSBzcGVjZmljIHJlc291cmNlLCBpbiB0ZXJtcyBvZiBpdHMgc2lVbml0LgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxhdHRyaWJ1dGUgdXNlPSJyZXF1aXJlZCIgbmFtZT0idmFsdWUiIHR5cGU9ImRlY2ltYWwiLz4KLQkJPGF0dHJpYnV0ZSB1c2U9InJlcXVpcmVkIiBuYW1lPSJzaVVuaXQiIHR5cGU9ImkwOlJlc291cmNlU0lVbml0Ij4KLQkJCTxhbm5vdGF0aW9uPgotCQkJCTxkb2N1bWVudGF0aW9uPgotCQkJCQlUaGUgU0kgVW5pdCBvZiBtZWFzdXJlbWVudCBvZiB0aGUgcmVzb3VyY2UgYmUgdmVuZGVkLAotCQkJCQllZy4gImtXaCIgZm9yIGVsZWN0cmljaXR5LgotCQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJCTwvYW5ub3RhdGlvbj4KLQkJPC9hdHRyaWJ1dGU+Ci0JPC9jb21wbGV4VHlwZT4KLQk8IS0tIENvbXBsZXggRWxlbWVudCBEZWZpbmF0aW9ucyBFbmRzLS0+Ci0JPCEtLSBFbGVtZW50IENvbnN0cmFpbnRzIFN0YXJ0IC0tPgotCTwhLS0gRGVmaW5lIFNpbXBsZSAvIEJhc2UgUmVzdHJpY3RpdmUgJiBFbnVtZXJhdGVkIFRZUEVTOiAtLT4KLQk8IS0tIENvbnN1bWVyIEFjY291bnQgTnVtYmVyIFR5cGUgWzIwXSBkaWdpdHMsIGNoYXJzLCBubyB3aGl0ZSBzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJBY2NvdW50Tm8iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBHZW5lcmljIGFjY291bnQgbnVtYmVyLCB1c2VkIGluIHNldmVyYWwgY29udGV4dHMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezAsMjB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gU3RyaW5nIHdpdGggd2hpdGVzcGFjZSBbMC4uODBdIGFueSBjaGFycyAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJBZGRyZXNzIj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8bWF4TGVuZ3RoIHZhbHVlPSI4MCIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJCcmFuY2hDb2RlIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgdGhlIGJyYW5jaCBjb2RlIG9mIHRoZSBiYW5rLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsxLDEwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJCYW5rQ2FyZEV4cGlyeSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEV4cGlyeSBkYXRlIG9mIHRoZSBiYW5rIGNhcmQsIGluIHRoZSBmb3JtYXQgWVlZWU1NLiBbNl0gb25seSBkaWdpdHMgbm8KLQkJCQl3aGl0ZXNwYWNlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXs2fSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJCYW5rQ2FyZENWTnVtIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQ29udGFpbnMgdGhlIENhcmQgdmVyaWZpY2F0aW9uIG51bWJlciAodHlwaWNhbGx5IHByaW50ZWQgb24gdGhlIGJhY2sgb2YKLQkJCQl0aGUgY2FyZCwgYnV0IG5vdCBlbWJvc3NlZCBvbiB0aGUgZnJvbnQpLiBbMS4uMTBdIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MSwxMH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMS4uMjBdIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkNoZXF1ZU5vIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQWNjb3VudCBIb2xkZXLigJlzIG5leHQgdW51c2VkIGNoZXF1ZSBudW1iZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezEsMjB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEuLjIwXSBhbHBoYW51bW5lcmljLCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlJlZk5vIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gR2VuZXJpYyByZWZlcmVuY2UgbnVtYmVyLCB1c2VkIGluIHNldmVyYWwgY29udGV4dHMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezEsMjB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzcuLjEyXSBjaGFycyBhbmQgZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iQ29udGFjdE5vIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQSB0ZWxlcGhvbmUgbnVtYmVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxTKXs3LDEyfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi4xNV0gY2hhcnMgYW5kIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkN1cnJlbmN5U3ltYm9sIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVGhlIGN1cnJlbmN5IHN5bWJvbCBvZiB0aGUgY3VycmVuY3kgYmVpbmcgdXNlZCBpbiBhIHRyYW5zYWN0aW9uLCBhcyBwZXIKLQkJCQlJU08gNDIxNy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MSwzfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi4yMF0gY2hhcnMgYW5kIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkN1c3RSZWYiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezEsMjB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEzXSBkaWdpdHMgb25seSwgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJFQU4iPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBHZW5lcmljIGxvZ2ljYWwgaWRlbnRpZmllciwgdXNlZCBmb3IgYSBjbGllbnQsIHNlcnZlciBvciB0ZXJtaW5hbC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezEzfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJJRE5vIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gR292ZXJubWVudCBpc3N1ZWQgbnVtYmVyIGZvciBhIGNpdGl6ZW4uIEdvdmVybm1lbnQgSWRlbnRpdHkgTnVtYmVyIFR5cGUKLQkJCQlbMjBdIGRpZ2l0cywgY2hhcnMsIG5vIHdoaXRlIHNwYWNlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxTKXswLDIwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIENvbnN1bWVyIExvY2F0aW9uIFJlZmVyZW5jZSBzdWNoIGFzIEdpUyBkYXRhWzIwXSBkaWdpdHMsIGNoYXJzLCBubyB3aGl0ZSBzcGFjZS0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IkxvY1JlZiI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcUyl7MCwyMH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMS4uNDBdIGRpZ2l0cyBvbmx5LCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik1JQ1IiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUaGUgTWFnbmV0aWMgSW5rIENoZXF1ZSBSZWFkZXIgKE1JQ1IpIGlzIHRoZSBlbnRpcmUgbGluZSBvZiBudW1iZXJzIGF0Ci0JCQkJdGhlIGJvdHRvbSBvZiB0aGUgY2hlcXVlLiBJbmNsdWRlcyB0aGUgdHJhbnNpdCBudW1iZXIsIGFjY291bnQgbnVtYmVyLCBhbmQgY2hlcXVlCi0JCQkJbnVtYmVyLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsxLDQwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi42XSBkaWdpdHMgb25seSwgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJNc2dJRFVuaXF1ZU51bWJlciI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IDYgZGlnaXQgc2VxdWVudGlhbCBudW1iZXIgZm9ybXMgcGFydCBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGlkZW50aWZpZXIuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InBvc2l0aXZlSW50ZWdlciI+Ci0JCQk8dG90YWxEaWdpdHMgdmFsdWU9IjYiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMTRdIG9ubHkgZGlnaXRzIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTXNnSUREYXRlVGltZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IERhdGUgVGltZSBzdGFtcCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCwgeXl5eW1tZGRISE1NU1MuIEZvcm1zIHBhcnQgb2YKLQkJCQl0aGUgcmVxdWVzdCBtZXNzYWdlIGlkZW50aWZpZXIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezE0fSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFN0cmluZyB3aXRoIHdoaXRlc3BhY2UgWzAuLjE2MF0gYW55IGNoYXJzIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik1zZyI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPG1heExlbmd0aCB2YWx1ZT0iMTYwIi8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzMuLjEzXSBjaGFycyAmIGRpZ2l0cywgbm8gd2hpdGVzcGFjZSwgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJNU05PIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gTWV0ZXIgc2VyaWFsIG51bWJlciBvZiB0aGUgbWV0ZXIgd2hlcmUgdGhlIHRva2VuIHdpbGwgYmUgZW50ZXJlZC4KLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezMsMTN9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik5SU1RyYWNrMkRhdGEiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBNYWduZXRpYyBNZXRlciBJRCBDYXJkIFRyYWNrIDIgVHlwZSAoc2VlIE5SUyAwMDktNDoxOTkzKSAKLQkJCTwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuCi0JCQkJdmFsdWU9IjYwMDcyNyhcZCl7MTJ9PSg9fCgoWzAtNl1bMC05XXw3WzAtOV0pKDBbMC05XXwxWzAtMl0pKSk9KFswLTldWzEtOV0pKFswLTldWzEtOV0pKFxkKXs2fShbMC05XVsxLTldKShbMC05XSkiCi0JCQkvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFN0cmluZyB3aXRoIHdoaXRlc3BhY2UgWzAuLjgwXSBhbnkgY2hhcnMgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iT3JnYW5pc2F0aW9uTmFtZSI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPG1heExlbmd0aCB2YWx1ZT0iODAiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMS4uMTBdIGNoYXJzICYgZGlnaXRzLCBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik9wTmFtZSI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IE5hbWUgb2YgdGhlIG9wZXJhdG9yIGluaXRpYXRpbmcgdGhlIHVzZSBjYXNlLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxTKXsxLDEwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFs2Li4xNV0gY2hhcnMgJiBkaWdpdHMsIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iUGFzc3dvcmQiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezYsMTV9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzEuLjQwXSBBbnl0aGluZyBleGNlcHQgZGlnaXRzIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlBlcnNvbk5hbWUiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXEQpezEsNDB9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9IlBlcmNlbnRhZ2UiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0iZGVjaW1hbCI+Ci0JCQk8bWluSW5jbHVzaXZlIHZhbHVlPSIwIi8+Ci0JCQk8bWF4SW5jbHVzaXZlIHZhbHVlPSIxMDAiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLT4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+LS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iUHdyTG10Ij4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gUG93ZXIgbGltaXQgdmFsdWUuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezEsM31cLihcZCl7MX0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBTdHJpbmcgd2l0aCB3aGl0ZXNwYWNlIFsxLi40XSBhbnkgY2hhcnMgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iUmVzb3VyY2VTSVVuaXQiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTSSB1bml0IG9mIHRoZSByZXNvdXJjZSBiZWluZyB2ZW5kZWQuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXFMpezEsNH0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbMV0gZGlnaXQgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJTVFNLZXlSZXZObyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEtleSBSZXZpc2lvbiBudW1iZXIgb2YgYSBzdXBwbHkgZ3JvdXAsIGFzIHNwZWNpZmllZCBieSBTVFMuCi0JCQk8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsxfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsyXSBvbmx5IGRpZ2l0cyBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlNUU1RUIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gVG9rZW4gdGVjaG5vbG9neSBzZWUgTlJTMDA5LTQtMToxOTk0LCBmb3IgU1RTLCBNYWdDYXJkKDAxKSBvcgotCQkJCU51bWVyaWMoMDIpLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsyfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsyXSBvbmx5IGRpZ2l0cyBubyB3aGl0ZXNwYWNlIC0tPgotCTxzaW1wbGVUeXBlIG5hbWU9IlNUU0FUIj4KLQkJPGFubm90YXRpb24+Ci0JCQk8ZG9jdW1lbnRhdGlvbj4gQWxnb3JpdGhtIFRlY2hub2xvZ3kgc2VlIE5SUzAwOS00LTE6MTk5NCwgZm9yIFNUUyAxLCAoMDcpLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7Mn0iLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPCEtLSBbNl0gb25seSBkaWdpdHMgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJTVFNTdXBwbHlHcm91cENvZGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTdXBwbHkgR3JvdXAgQ29kZSAoU0dDKSBhcyBkZWZpbmVkIGJ5IFNUUywgZ2VuZXJhbGx5IHJlZmVycyB0byB3aGljaAotCQkJCXV0aWxpdHkgd2lsbCByZWNlaXZlIHRoZSByZXZlbnVlLiBHcm91cCBjb2RlZCBTR0MgbXVzdCBiZSBhdm9pZGVkIGluIE9ubGluZSBWZW5kaW5nCi0JCQkJc3lzdGVtcyBhcyB0aGVzZSBjYW4gYmUgYWJ1c2VkIGZvciBmcmF1ZHVsZW50IHB1cnBvc2VzLjwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezZ9Ii8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTwhLS0gWzJdIG9ubHkgZGlnaXRzIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iU1RTVGFyaWZmSW5kZXgiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBSZWZlcnMgdG8gdGhlIHRhcmlmZiBpbmRleCAoVEkpIGFzIGRlZmluZWQgYnkgU1RTLiA8L2RvY3VtZW50YXRpb24+Ci0JCTwvYW5ub3RhdGlvbj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8cGF0dGVybiB2YWx1ZT0iKFxkKXsyfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFsxLi4yMF0gZGlnaXRzIG9ubHksIG5vIHdoaXRlc3BhY2UgLS0+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iU1RTQ2lwaGVyVGV4dCI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IEVuY3J5cHRlZCB0ZXh0IGFzIHNwZWNpZmllZCBieSBTVFMuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezIwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIFRheCByZWYgWzEwXSBkaWdpdHMgbm8gd2hpdGVzcGFjZSAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJUYXhSZWYiPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxwYXR0ZXJuIHZhbHVlPSIoXGQpezEwfSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJXYXRlckZhY3RvciI+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPHBhdHRlcm4gdmFsdWU9IihcZCl7MSw2fSIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8IS0tIEVsZW1lbnQgQ29uc3RyYWludHMgRW5kcy0tPgotCTwhLS0gTm9uLVZvbGl0aWxlIEVudW1lcmF0ZWQgIFR5cGVzIHN0YXJ0cyAtLT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJDaGVxdWVUeXBlIj4KLQkJPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IlBlcnNvbmFsIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkNvbXBhbnkiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iR292ZXJubWVudCIvPgotCQk8L3Jlc3RyaWN0aW9uPgotCTwvc2ltcGxlVHlwZT4KLQk8c2ltcGxlVHlwZSBuYW1lPSJCYXRjaFN0YXR1c1R5cGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBFbnVtZXJhdGlvbiB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBzdGF0dXMgb2YgYSBiYXRjaCwgIm9wZW4iIG9yCi0JCQkJImNsb3NlZCIuIDwvZG9jdW1lbnRhdGlvbj4KLQkJPC9hbm5vdGF0aW9uPgotCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0ib3BlbiIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJjbG9zZWQiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iQ3JlZGl0VG9rZW5TdWJDbGFzc1R5cGUiPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBUb2tlbiBzdWItY2xhc3MgdHlwZXMgYXMgc3BlY2lmaWVkIGJ5IFNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJFbGVjdHJpY2l0eSBUb2tlbiIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJXYXRlciBUb2tlbiIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJHYXMgVG9rZW4iLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ29ubmVjdGlvbiB0aW1lIFRva2VuIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkN1cnJlbmN5IFRva2VuIi8+Ci0JCTwvcmVzdHJpY3Rpb24+Ci0JPC9zaW1wbGVUeXBlPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik5vbk1ldGVyU3BlY2lmaWNFbmciPgotCQk8YW5ub3RhdGlvbj4KLQkJCTxkb2N1bWVudGF0aW9uPiBTaG9ydGVuZWQgbmFtZXMgZm9yIG5vbi1NZXRlciBzcGVjaWZpYyBlbmdpbmVlcmluZyB0b2tlbnMgYXMgZGVmaW5lZCBieQotCQkJCVNUUy4gPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJUZXN0QWxsIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRlc3RCcmVha2VyIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IlRlc3REaXNwIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BQd3JMbXQiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcFRJIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BLUk4iLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRGlzcFRhbXBlciIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEaXNwSW5zdFB3ciIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEaXNwQ29uc1RvdCIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEaXNwVW5iYWxhbmNlIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkRpc3BWZXIiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci0JPHNpbXBsZVR5cGUgbmFtZT0iTWV0ZXJTcGVjaWZpY0VuZyI+Ci0JCTxhbm5vdGF0aW9uPgotCQkJPGRvY3VtZW50YXRpb24+IFNob3J0ZW5lZCBuYW1lcyBmb3IgTWV0ZXIgc3BlY2lmaWMgZW5naW5lZXJpbmcgdG9rZW5zIGFzIGRlZmluZWQgYnkgU1RTLgotCQkJPC9kb2N1bWVudGF0aW9uPgotCQk8L2Fubm90YXRpb24+Ci0JCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTZXRQd3JMbXQiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iU2V0UGhVbmJhbGFuY2UiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQWRkRGVmYXVsdENyZWQiLz4KLQkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ2xlYXJDcmVkIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkNsZWFyVGFtcGVyIi8+Ci0JCQk8ZW51bWVyYXRpb24gdmFsdWU9IkVuZ0tDVCIvPgotCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTZXRXYXRlckZhY3QiLz4KLQkJPC9yZXN0cmljdGlvbj4KLQk8L3NpbXBsZVR5cGU+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9BYnN0cmFjdFRlc3RDYXNlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU0ODFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9BYnN0cmFjdFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi0vKioNCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzLg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3RDYXNlDQotICAgICAgICBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXN0RGlyID0gInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7DQotICAgIHByb3RlY3RlZCBTdHJpbmcgc2FtcGxlRGlyID0gInNhbXBsZXMiICsgRmlsZS5zZXBhcmF0b3I7DQotICAgIHByb3RlY3RlZCBTdHJpbmcgb3V0RGlyID0gInRhcmdldCIgKyBGaWxlLnNlcGFyYXRvciArICJnZW5lcmF0ZWQiICsNCi0gICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArDQotICAgICAgICAgICAgInNhbXBsZXMiICsNCi0gICAgICAgICAgICBGaWxlLnNlcGFyYXRvcjsNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZW1wRGlyID0gInRhcmdldCIgKyBGaWxlLnNlcGFyYXRvciArICJnZW5lcmF0ZWQiICsNCi0gICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArDQotICAgICAgICAgICAgInRlbXAiOw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9ICJ0ZXN0LXJlc291cmNlcyI7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBCYXNlZGlyIGZvciBhbGwgZmlsZSBJL08uIEltcG9ydGFudCB3aGVuIHJ1bm5pbmcgdGVzdHMgZnJvbQ0KLSAgICAgKiB0aGUgcmVhY3Rvci4gIE5vdGUgdGhhdCBhbnlvbmUgY2FuIHVzZSB0aGlzIHN0YXRpY2FsbHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlZGlyOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpOw0KLSAgICAgICAgaWYgKGJhc2VkaXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJhc2VkaXIgPSBuZXcgRmlsZSgiLiIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBBYnN0cmFjdFRlc3RDYXNlKFN0cmluZyB0ZXN0TmFtZSkgew0KLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOw0KLSAgICAgICAgdGVzdERpciA9IG5ldyBGaWxlKGJhc2VkaXIsIHRlc3REaXIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgc2FtcGxlRGlyID0gbmV3IEZpbGUoYmFzZWRpciwgc2FtcGxlRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIG91dERpciA9IG5ldyBGaWxlKGJhc2VkaXIsIG91dERpcikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICB0ZW1wRGlyID0gbmV3IEZpbGUoYmFzZWRpciwgdGVtcERpcikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEZpbGUodGVzdFJlc291cmNlRGlyLCByZWxhdGl2ZVBhdGgpOw0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGaW5hbFNlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nRmluYWxTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTUzYWQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGaW5hbFNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0T25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nRmluYWxTZXJ2aWNlVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgdHJhbnNwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bGxUcmFuc3BvcnQiKTsKLSAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKSArCi0gICAgICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NRWxlbWVudCIpOwotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbyA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpICsKLSAgICAgICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9SZWRpcmVjdFJlY2VpdmVyU2VydmljZS9lY2hvT01FbGVtZW50UmVzcG9uc2UiKTsKLQotICAgIEVuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG8gPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKSArCi0gICAgICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UvZmF1bHQiKTsKLQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7Ci0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0OwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBlY2hvU2VydmljZTsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgcnJTZXJ2aWNlOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoQWRkcmVzc2luZ0ZpbmFsU2VydmljZVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlY2hvU2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIGVjaG9TZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25OYW1lKS5zZXRPdXRwdXRBY3Rpb24oImVjaG9PTUVsZW1lbnRSZXNwb25zZSIpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2UoZWNob1NlcnZpY2UpOwotCi0gICAgICAgIHJyU2VydmljZSA9IGNyZWF0ZVJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlKCk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShyclNlcnZpY2UpOwotICAgIH0KLQotICAgIEF4aXNTZXJ2aWNlIGNyZWF0ZVJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIlJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlIik7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywgUmVkaXJlY3RSZWNlaXZlci5jbGFzcy5nZXROYW1lKCkpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgiZWNob09NRWxlbWVudFJlc3BvbnNlIikpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJlY2hvT01FbGVtZW50UmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AyID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJmYXVsdCIpKTsKLQotICAgICAgICBheGlzT3AyLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3AyLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wMik7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyAiZmF1bHQiLCBheGlzT3AyKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgY3JlYXRlU2VydmljZUNsaWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBjcmVhdGVTaW1wbGVPbmVXYXlTZXJ2aWNlZm9yQ2xpZW50KHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjb250ZXh0ID0gVXRpbFNlcnZlci5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBvcHRpb25zLnNldFJlcGx5VG8ocmVwbHlUbyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0RmF1bHRUbyhmYXVsdFRvKTsKLQotICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLQotICAgICAgICByZXR1cm4gc2VuZGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UobmV3IFFOYW1lKCJSZWRpcmVjdFJlY2VpdmVyU2VydmljZSIpKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZVNpbXBsZU9uZVdheVNlcnZpY2Vmb3JDbGllbnQoUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBjbGFzc05hbWUpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVFY2hvT01FbGVtZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm15VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBjcmVhdGVOb0FkZHJlc3NpbmdTZXJ2aWNlQ2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVBfQUNUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICByZXR1cm4gc2VuZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBjcmVhdGVTeW5jUmVzcG9uc2VTZXJ2aWNlQ2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7Ci0KLSAgICAgICAgcmV0dXJuIHNlbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBUZXN0cwotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9Ub1JlcGx5VG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGNyZWF0ZUVjaG9PTUVsZW1lbnQoInRoaXMgbWVzc2FnZSBzaG91bGQgbm90IGNhdXNlIGEgZmF1bHQuIik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZGVyID0gY3JlYXRlU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLmZpcmVBbmRGb3JnZXQob3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2VudCB0aGUgcmVxdWVzdCIpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICghUmVkaXJlY3RSZWNlaXZlci5oYXNSZWNlaXZlZFJlc3BvbnNlKCkpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiA0NSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0cyB3YXMgZmFpbGVkIGFzIHJlZGlyZWN0ZWQgcmVzcG9uc2Ugbm90IHJlY2VpdmVkIGluIHRpbWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdFRvRmF1bHRUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWNob09NRWxlbWVudCgiZmF1bHQiKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldChvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZW50IHRoZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFSZWRpcmVjdFJlY2VpdmVyLmhhc1JlY2VpdmVkRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDQ1KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RzIHdhcyBmYWlsZWQgYXMgcmVkaXJlY3RlZCBmYXVsdCBub3QgcmVjZWl2ZWQgaW4gdGltZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVzaW5nQWRkcmVzc2luZ1JlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFkZHJlc3NpbmdIZWxwZXIuc2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoZWNob1NlcnZpY2UsICJyZXF1aXJlZCIpOwotCi0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBjcmVhdGVFY2hvT01FbGVtZW50KCJ0aGlzIG1lc3NhZ2Ugc2hvdWxkIGNhdXNlIGEgZmF1bHQuIik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZGVyID0gY3JlYXRlTm9BZGRyZXNzaW5nU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmUob3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIHNwZWNpZmljIGZhdWx0Iik7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHdzYTpBY3Rpb24gaGVhZGVyIGlzIHJlcXVpcmVkIHdoZW4gV1MtQWRkcmVzc2luZyBpcyBpbiB1c2UgYnV0IHdhcyBub3Qgc2VudC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNSZXNwb25zZUFkZHJlc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAiaGVsbG8uIjsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGNyZWF0ZUVjaG9PTUVsZW1lbnQodGVzdCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZGVyID0gY3JlYXRlU3luY1Jlc3BvbnNlU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlY2hvT01FbGVtZW50UmVzcG9uc2U6ICIgKyByZXN1bHQpOwotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteVZhbHVlIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXN1bHQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5hbWUpLmdldFRleHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1N1Ym1pc3Npb25TZXJ2aWNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ1N1Ym1pc3Npb25TZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjAxMmZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdTdWJtaXNzaW9uU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRPbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdTdWJtaXNzaW9uU2VydmljZVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZQotICAgICAgICBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0gICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkgKwotICAgICAgICAgICAgICAgICAgICAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLQotICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8gPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKSArCi0gICAgICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UvZWNob09NRWxlbWVudFJlc3BvbnNlIik7Ci0KLSAgICBFbmRwb2ludFJlZmVyZW5jZSBmYXVsdFRvID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkgKwotICAgICAgICAgICAgICAgICAgICAiL2F4aXMyL3NlcnZpY2VzL1JlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlL2ZhdWx0Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgZWNob1NlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHJyU2VydmljZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFkZHJlc3NpbmdTdWJtaXNzaW9uU2VydmljZVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlY2hvU2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIGVjaG9TZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25OYW1lKS5zZXRPdXRwdXRBY3Rpb24oImVjaG9PTUVsZW1lbnRSZXNwb25zZSIpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2UoZWNob1NlcnZpY2UpOwotCi0gICAgICAgIHJyU2VydmljZSA9IGNyZWF0ZVJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlKCk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShyclNlcnZpY2UpOwotICAgIH0KLQotICAgIEF4aXNTZXJ2aWNlIGNyZWF0ZVJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIlJlZGlyZWN0UmVjZWl2ZXJTZXJ2aWNlIik7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywgUmVkaXJlY3RSZWNlaXZlci5jbGFzcy5nZXROYW1lKCkpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgiZWNob09NRWxlbWVudFJlc3BvbnNlIikpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJlY2hvT01FbGVtZW50UmVzcG9uc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AyID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJmYXVsdCIpKTsKLQotICAgICAgICBheGlzT3AyLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3AyLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wMik7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyAiZmF1bHQiLCBheGlzT3AyKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKG5ldyBRTmFtZSgiUmVkaXJlY3RSZWNlaXZlclNlcnZpY2UiKSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBjcmVhdGVTaW1wbGVPbmVXYXlTZXJ2aWNlZm9yQ2xpZW50KFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywgY2xhc3NOYW1lKSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24ob3BOYW1lKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX1JQQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9Ub1JlcGx5VG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGNyZWF0ZUVjaG9PTUVsZW1lbnQoInRoaXMgbWVzc2FnZSBzaG91bGQgbm90IGNhdXNlIGEgZmF1bHQuIik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZGVyID0gY3JlYXRlU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLmZpcmVBbmRGb3JnZXQob3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2VuZCB0aGUgcmVxZXN0Iik7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFSZWRpcmVjdFJlY2VpdmVyLmhhc1JlY2VpdmVkUmVzcG9uc2UoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gNDUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdHMgd2FzIGZhaWxlZCBhcyByZWRpcmVjdGVkIHJlc3BvbnNlIG5vdCByZWNlaXZlZCBpbiB0aW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRUb0ZhdWx0VG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGNyZWF0ZUVjaG9PTUVsZW1lbnQoImZhdWx0Iik7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZGVyID0gY3JlYXRlU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLmZpcmVBbmRGb3JnZXQob3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2VuZCB0aGUgcmVxZXN0Iik7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFSZWRpcmVjdFJlY2VpdmVyLmhhc1JlY2VpdmVkRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gNDUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdHMgd2FzIGZhaWxlZCBhcyByZWRpcmVjdGVkIGZhdWx0IG5vdCByZWNlaXZlZCBpbiB0aW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVFY2hvT01FbGVtZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm15VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuc2V0VGV4dCh0ZXh0KTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBjcmVhdGVTZXJ2aWNlQ2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIGNyZWF0ZVNpbXBsZU9uZVdheVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXI7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UmVwbHlUbyhyZXBseVRvKTsKLSAgICAgICAgb3B0aW9ucy5zZXRGYXVsdFRvKGZhdWx0VG8pOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLQotICAgICAgICByZXR1cm4gc2VuZGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBjcmVhdGVTeW5jUmVzcG9uc2VTZXJ2aWNlQ2xpZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOwotCi0gICAgICAgIHJldHVybiBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNSZXNwb25zZUFkZHJlc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAiaGVsbG8uIjsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGNyZWF0ZUVjaG9PTUVsZW1lbnQodGVzdCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VuZGVyID0gY3JlYXRlU3luY1Jlc3BvbnNlU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShvcGVyYXRpb25OYW1lLCBtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlY2hvT01FbGVtZW50UmVzcG9uc2U6ICIgKyByZXN1bHQpOwotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteVZhbHVlIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXN1bHQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5hbWUpLmdldFRleHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QsIHZhbHVlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5ODM3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLQotcHVibGljIGNsYXNzIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMSB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9SZWRpcmVjdChPTUVsZW1lbnQgb21lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3VyckluTWMgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3Vyck91dE1jID0gY3VyckluTWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0KCJPdXQiKTsKLSAgICAgICAgY3Vyck91dE1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMToiICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKSArCi0gICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTIvZWNob1JlZGlyZWN0IikpOwotICAgICAgICBjdXJyT3V0TWMuc2V0UmVwbHlUbyhjdXJySW5NYy5nZXRSZXBseVRvKCkpOwotICAgICAgICByZXR1cm4gb21lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL011bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMi5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YzczMzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMiB7Ci0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvUmVkaXJlY3QoT01FbGVtZW50IG9tZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyIik7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGN1cnJJbk1jID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGN1cnJPdXRNYyA9IGN1cnJJbk1jLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dCgiT3V0Iik7Ci0gICAgICAgIGN1cnJPdXRNYy5zZXRUbyhjdXJySW5NYy5nZXRSZXBseVRvKCkpOwotICAgICAgICBjdXJyT3V0TWMuZ2V0UmVsYXRlc1RvKCkuc2V0VmFsdWUoY3VyckluTWMuZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIHJldHVybiBvbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxMTMwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgdGVzdHMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIG1vcmUgYWR2YW5jZWQgZnVuY3Rpb24gYWxsb3dlZCBieSB0aGUgV1MtQWRkcmVzc2luZwotICogc3BlY2lmaWNhdGlvbiB0byByZWRpcmVjdCByZXNwb25zZXMuIFRoaXMgdGVzdCBzZXRzIHVwIDIgc2VydmljZXMsIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMSBhbmQKLSAqIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMi4gTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxIGVjaG9zIHRoZSBYTUwgaXQgcmVjZWl2ZXMgdG8KLSAqIE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMiwgYWRkaW5nIHRoZSBvcmlnaW5hbCBSZXBseVRvLiBNdWx0aUhvcFJlZGlyZWN0U2VydmljZTIgdGhlbiBlY2hvcyB0aGUKLSAqIFhNTCB0byB0aGUgb3JpZ25hbCBSZXBseVRvLCBzZXR0aW5nIHRoZSBSZWxhdGVzVG8gdG8gdGhlIG1lc3NhZ2VJRCBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdAotICogbWVzc2FnZSB0byBhbGxvdyB0aGUgY2xpZW50IHRvIGNvcnJlbGF0ZSB0aGUgbWVzc2FnZS4KLSAqIDxwLz4KLSAqIFRoZSBjbGVhcmx5IG9ubHkgd29ya3MgaWYgdGhlIGNsaWVudCBpcyB1c2luZyBhIHNlcGFyYXRlIGxpc3RlbmVyICh3aGljaCB0aGUgY2xpZW50IGluIHRoZSB0ZXN0Ci0gKiBkb2VzKQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2VUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpICsKLSAgICAgICAgICAgICAgICAgICAgIi9heGlzMi9zZXJ2aWNlcy9NdWx0aUhvcFJlZGlyZWN0U2VydmljZTEvZWNob1JlZGlyZWN0Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgbWhzMTsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgbWhzMjsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKE11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1oczEgPSBjcmVhdGVNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEoKTsKLSAgICAgICAgbWhzMiA9IGNyZWF0ZU11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMigpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2UobWhzMSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShtaHMyKTsKLSAgICB9Ci0KLSAgICBBeGlzU2VydmljZSBjcmVhdGVNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxIik7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywgTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxLmNsYXNzLmdldE5hbWUoKSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoImVjaG9SZWRpcmVjdCIpKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgc2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArICJlY2hvUmVkaXJlY3QiLCBheGlzT3ApOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIEF4aXNTZXJ2aWNlIGNyZWF0ZU11bHRpSG9wUmVkaXJlY3RTZXJ2aWNlMigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJNdWx0aUhvcFJlZGlyZWN0U2VydmljZTIiKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBNdWx0aUhvcFJlZGlyZWN0U2VydmljZTIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgiZWNob1JlZGlyZWN0IikpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgImVjaG9SZWRpcmVjdCIsIGF4aXNPcCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UobmV3IFFOYW1lKCJNdWx0aUhvcFJlZGlyZWN0U2VydmljZTEiKSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKG5ldyBRTmFtZSgiTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UyIikpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUhvcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gY3JlYXRlRWxlbWVudCgidGhpcyBtZXNzYWdlIHNob3VsZCBub3QgY2F1c2UgYSBmYXVsdC4iKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZW5kZXIgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuc2VuZFJlY2VpdmUobmV3IFFOYW1lKCJlY2hvUmVkaXJlY3QiKSwgbWV0aG9kKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidGhpcyBtZXNzYWdlIHNob3VsZCBub3QgY2F1c2UgYSBmYXVsdC4iLCByZXNwb25zZS5nZXRUZXh0KCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi9hZGRyZXNzaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXhpczJhZGRyZXNzaW5nIik7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuc2V0VGV4dCh0ZXh0KTsKLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IGNyZWF0ZVNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxIik7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywgTXVsdGlIb3BSZWRpcmVjdFNlcnZpY2UxLmNsYXNzLmdldE5hbWUoKSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IE91dEluQXhpc09wZXJhdGlvbihuZXcgUU5hbWUoImVjaG9SZWRpcmVjdCIpKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgYXhpc09wLnNldFNvYXBBY3Rpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyAiZWNob1JlZGlyZWN0Iik7Ci0gICAgICAgIGF4aXNPcC5zZXRPdXRwdXRBY3Rpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyAiZWNob1JlZGlyZWN0Iik7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyAiZWNob1JlZGlyZWN0IiwgYXhpc09wKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjb250ZXh0ID0gVXRpbFNlcnZlci5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDUwMDApOwotICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLSAgICAgICAgcmV0dXJuIHNlbmRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9SZWRpcmVjdFJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9SZWRpcmVjdFJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGJiZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvUmVkaXJlY3RSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFJlZGlyZWN0UmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZXNwb25zZVJlY2lldmVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVjZWl2ZWRSZXNwb25zZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlUmVjaWV2ZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmYXVsdFJlY2lldmVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUmVjZWl2ZWRGYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0UmVjaWV2ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZWNob09NRWxlbWVudFJlc3BvbnNlKE9NRWxlbWVudCBvbUVsZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVjaG9PTUVsZW1lbnRSZXNwb25zZTogIiArIG9tRWxlKTsKLSAgICAgICAgcmVzcG9uc2VSZWNpZXZlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmF1bHQoT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmF1bHQ6ICIgKyBvbUVsZSk7Ci0gICAgICAgIGZhdWx0UmVjaWV2ZWQgPSB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDhkOTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFzeW5jOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBBc3luY01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBuZXdtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBXZWJTZXJ2aWNlIG1ldGhvZAotICAgICAgICAgICAgQ2xhc3MgSW1wbENsYXNzID0gb2JqLmdldENsYXNzKCk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BEZXNjID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGZpbmRPcGVyYXRpb24ob3BEZXNjLCBJbXBsQ2xhc3MpOwotCi0gICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc1tdICBwYXJhbWV0ZXJzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gYXJnczsKLQotICAgICAgICAgICAgICAgIGlmICgocGFyYW1ldGVycyA9PSBudWxsKSB8fCAocGFyYW1ldGVycy5sZW5ndGggPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbMF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBhcmdzID0gbmV3IE9iamVjdFtdIHsgb21FbGVtZW50IH07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJyYXdYbWxQcm9pdmRlSXNMaW1pdGVkIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSAoT01FbGVtZW50KW1ldGhvZC5pbnZva2Uob2JqLCBhcmdzKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmRlY2xhcmVOYW1lc3BhY2Uoc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUNvbnRlbnQ7Ci0KLSAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBnZXRTT0FQRmFjdG9yeShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBib2R5Q29udGVudCA9IHJlc3VsdDsKLQotICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChib2R5Q29udGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Q29udGVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbmV3bXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWV0aG9kTm90SW1wbGVtZW50ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2MuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kIGZpbmRPcGVyYXRpb24oQXhpc09wZXJhdGlvbiBvcCwgQ2xhc3MgSW1wbENsYXNzKSB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IEltcGxDbGFzcy5nZXRNZXRob2RzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kc1tpXTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNTZXJ2aWNlMlRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2UyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE1MGVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2UyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hc3luYzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXhpc0NhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbC5UaHJlYWRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEFzeW5jU2VydmljZTJUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBc3luY1NlcnZpY2UyVGVzdC5jbGFzcyk7Ci0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0gICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIDU1NTYKLSsgIi9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZS9lY2hvT01FbGVtZW50Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLSAgICBFeGNlcHRpb24gZXJyb3I7Ci0gICAgLy8gQSAoc3luY2hyb25pemVkKSBwbGFjZSB0byBob2xkIHRoZSByZXNwb25zZXMKLSAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3BvbnNlcyA9Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQUkVGSVhfVEVYVCA9ICJSZXF1ZXN0IG51bWJlciAiOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoQXN5bmNTZXJ2aWNlMlRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzeW5jTWVzc2FnZVJlY2VpdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlMTElTRUNPTkRTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFRJTUVPVVQgPSAyMDAgKiBNSUxMSVNFQ09ORFM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRVFVRVNUUyA9IDk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTENvbXBsZXRlQVN5bmNXaXRoTGltaXRlZE51bWJlck9mQ29ubmVjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY29udGV4dCA9IFV0aWxTZXJ2ZXIuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICAvLyBVc2UgbWF4IG9mIDMgdGhyZWFkcyBmb3IgdGhlIGFzeW5jIHRocmVhZCBwb29sCi0gICAgICAgIGNvbmZpZ2NvbnRleHQuc2V0VGhyZWFkUG9vbChuZXcgVGhyZWFkUG9vbCgxLCAzKSk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoMjAwICogTUlMTElTRUNPTkRTKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DSFVOS0VELCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLlNPX1RJTUVPVVQsIFRJTUVPVVQpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPTk5FQ1RJT05fVElNRU9VVCwgVElNRU9VVCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuUkVVU0VfSFRUUF9DTElFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQVVUT19SRUxFQVNFX0NPTk5FQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0vLyAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoU2VydmljZUNsaWVudC5BVVRPX09QRVJBVElPTl9DTEVBTlVQLCB0cnVlKTsKLQotICAgICAgICAgICAgQXhpc0NhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEF4aXNDYWxsYmFjaygpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRWxlbWVudCByZXNwb25zZUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2VFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHRWYWx1ZSA9IHJlc3BvbnNlRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUodGV4dFZhbHVlLnN0YXJ0c1dpdGgoUFJFRklYX1RFWFQpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdoaWNoT25lID0gdGV4dFZhbHVlLnN1YnN0cmluZyhQUkVGSVhfVEVYVC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwocmVzcG9uc2VzLmdldCh3aGljaE9uZSkpOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMucHV0KHdoaWNoT25lLCB0ZXh0VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3BvbnNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5zaXplKCkgPT0gTUFYX1JFUVVFU1RTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGRvbmUhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzLm5vdGlmeUFsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdob29wcy4KLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChyZXNwb25zZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSByZXR1cm47IC8vIE9ubHkgdGFrZSBmaXJzdCBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZhdWx0KCkuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMubm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3BvbnNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHJldHVybjsgLy8gT25seSB0YWtlIGZpcnN0IGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZXMubm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUkVRVUVTVFM7IGkrKykgewotICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm15VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgICAgICAgICB2YWx1ZS5zZXRUZXh0KFBSRUZJWF9URVhUICsgaSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhvcGVyYXRpb25OYW1lLCBtZXRob2QsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoInNlbnQgdGhlIHJlcXVlc3QgIyA6ICIgKyBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy50cmFjZSgid2FpdGluZyAobWF4IDFtaW4pIik7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3BvbnNlcykgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlcy53YWl0KDYwICogMTAwMCk7Ci0gICAgICAgICAgICAgICAgLy8gU29tZW9uZSBraWNrZWQgdXMsIHNvIGVpdGhlciB3ZSBoYXZlIGEgcHJvYmxlbQotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZXMuc2l6ZSgpIDwgTUFYX1JFUVVFU1RTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRpbWVvdXQsIGRpZCBub3QgcmVjZWl2ZSBhbGwgcmVzcG9uc2VzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNTZXJ2aWNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FzeW5jL0FzeW5jU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAxMzM0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hc3luYzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXhpc0NhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEFzeW5jU2VydmljZVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzeW5jU2VydmljZVRlc3QuY2xhc3MpOwotICAgIHByb3RlY3RlZCBRTmFtZSB0cmFuc3BvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbG9jYWxob3N0L215IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVsbFRyYW5zcG9ydCIpOwotICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0vLyAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyA1NTU2Ci0gICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZS9lY2hvT01FbGVtZW50Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBc3luY1NlcnZpY2VUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY01lc3NhZ2VSZWNlaXZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxDb21wbGV0ZUFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KCJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgQXhpc0NhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEF4aXNDYWxsYmFjaygpIHsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgKHJlc3BvbnNlKSBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVzdWx0ID0gIiArIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBnZXRzIGNhbGxlZCB3aGVuIGEgZmF1bHQgbWVzc2FnZSBpcyByZWNlaXZlZC4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCBjb250YWluaW5nIHRoZSBmYXVsdC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhdWx0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiRmF1bHQgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgT05MWSB3aGVuIGFuIGludGVybmFsIHByb2Nlc3NpbmcgZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIEBwYXJhbSBlIHRoZSBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBNRVAgbm8gbWF0dGVyIHdoYXQgaGFwcGVucywgcXVpdGUgbGlrZSBhIGZpbmFsbHkgYmxvY2suICovCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY29udGV4dCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcob3BlcmF0aW9uTmFtZSwgbWV0aG9kLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBsb2cuaW5mbygic2VuZCB0aGUgcmVxdWVzdCIpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIGlmICghZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLndhaXQoNDUwMDApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmlzaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2VXaXRoVHJhbnNwb3J0RmFpbHVyZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hc3luYy9Bc3luY1NlcnZpY2VXaXRoVHJhbnNwb3J0RmFpbHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczOWVkZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYXN5bmMvQXN5bmNTZXJ2aWNlV2l0aFRyYW5zcG9ydEZhaWx1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFzeW5jOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFzeW5jU2VydmljZVdpdGhUcmFuc3BvcnRGYWlsdXJlVGVzdCBleHRlbmRzCi0gICAgICAgIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzeW5jU2VydmljZVdpdGhUcmFuc3BvcnRGYWlsdXJlVGVzdC5jbGFzcyk7Ci0gICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOjAiCi0gICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NRWxlbWVudCIpOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5OwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtYzsKLSAgICBwcm90ZWN0ZWQgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB3YXNFcnJvciA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoCi0gICAgICAgICAgICAgICAgQXN5bmNTZXJ2aWNlV2l0aFRyYW5zcG9ydEZhaWx1cmVUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY01lc3NhZ2VSZWNlaXZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxDb21wbGV0ZUFTeW5jV2l0aFRyYW5zcG9ydEZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0RWNob1hNTENvbXBsZXRlQVN5bmNXaXRoVHJhbnNwb3J0RmFpbHVyZSIpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudCgKLSAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjb250ZXh0ID0gVXRpbFNlcnZlci5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT01FbGVtZW50Iiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm15VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuc2V0VGV4dCgiSXNhYWMgQXNpbW92LCBUaGUgRm91bmRhdGlvbiBUcmlsb2d5Iik7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3VsdCA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd2FzRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2NvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKG9wZXJhdGlvbk5hbWUsIG1ldGhvZCwgY2FsbGJhY2spOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZW5kIHRoZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICBsb2cuaW5mbygic2VuZCB0aGUgcmVxdWVzdCIpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gNDUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHdhcyBzaHV0ZG93biwgYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRvb2sgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmlzaCAmJiAhd2FzRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSB0cmFuc21pc3Npb24gb2YgdGhlIGFzeW5jIHJlcXVlc3QgYnV0IHRoZSBjYWxsYmFjayB3YXMgbm90IG5vdGlmaWVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHNlbmRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9Vbmtub3duQ29udGVudEJ1aWxkZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9Vbmtub3duQ29udGVudEJ1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTMzYmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvVW5rbm93bkNvbnRlbnRCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NU291cmNlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLnVua25vd25jb250ZW50LlVua25vd25Db250ZW50T01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVW5rbm93bkNvbnRlbnRCdWlsZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2V7Ci0gICAgcHVibGljIFVua25vd25Db250ZW50QnVpbGRlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXN1cGVyKHRlc3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgRmlsZSBmaWxlID0gZ2V0VGVzdFJlc291cmNlRmlsZSgibWltZV9tZXNzYWdlLnR4dCIpOwotLy8gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotLy8gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0vLyAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLS8vICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotLy8gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0NvbnRleHQpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoIm11bHRpcGFydC9yZWxhdGVkIiwgbmV3IE1JTUVCdWlsZGVyKCkpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoIm11bHRpcGFydC9taXhlZCIsIG5ldyBNSU1FQnVpbGRlcigpKTsKLS8vICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi9zb2FwK3htbCIsIG5ldyBTT0FQQnVpbGRlcigpKTsKLS8vICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJ0ZXh0L3htbCIsIG5ldyBTT0FQQnVpbGRlcigpKTsKLS8vICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94b3AreG1sIiwgbmV3IE1UT01CdWlsZGVyKCkpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3htbCIsIG5ldyBBcHBsaWNhdGlvblhNTEJ1aWxkZXIoKSk7Ci0vLyAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRm9ybVVSTEVuY29kZWRCdWlsZGVyKCkpOwotLy8gICAgICAgIGF4aXNDb25maWcuYWRkUGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlVTRV9ERUZBVUxUX0ZBTExCQUNLX0JVSUxERVIsICJ0cnVlIik7Ci0vLyAgICAgICAgT01FbGVtZW50IGVudmVsb3BlID0gVHJhbnNwb3J0VXRpbHMuY3JlYXRlU09BUE1lc3NhZ2UobWMsZmlzLCJtdWx0aXBhcnQvbWl4ZWQ7Ym91bmRhcnk9LS1NSU1FQm91bmRhcnkyNThERTJEMTA1Mjk4Qjc1NkQiKTsKLS8vICAgICAgICAKLS8vICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlICE9IG51bGwpOwotLy8gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOwotLy8gICAgICAgIGVudmVsb3BlLmJ1aWxkV2l0aEF0dGFjaG1lbnRzKCk7Ci0vLyAgICAgICAgbWMuYXR0YWNobWVudHMuZ2V0QWxsQ29udGVudElEcygpOwotLy8gICAgICAgIGludCBtaW1lUGFydENvdW50ID0gbWMuZ2V0QXR0YWNobWVudE1hcCgpLmdldE1hcCgpLnNpemUoKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWltZVBhcnRDb3VudCk7Ci0gICAgfQotCQotCS8qKgotCSAqIEEgYnVpbGRlciBpcyBub3QgYWRkZWQgZm9yIHRoZSBtdWx0aXBhcnQvbWl4ZWQgYXMgaW4gdGhlIGFib3ZlIHRlc3QuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9CdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGdldFRlc3RSZXNvdXJjZUZpbGUoIm1pbWVfbWVzc2FnZS50eHQiKTsKLSAgICAgICAgTUlNRUJ1aWxkZXIgbWltZUJ1aWxkZXIgPSBuZXcgTUlNRUJ1aWxkZXIoKTsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJtdWx0aXBhcnQvcmVsYXRlZCIsIG5ldyBNSU1FQnVpbGRlcigpKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigiYXBwbGljYXRpb24vc29hcCt4bWwiLCBuZXcgU09BUEJ1aWxkZXIoKSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoInRleHQveG1sIiwgbmV3IFNPQVBCdWlsZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94b3AreG1sIiwgbmV3IE1UT01CdWlsZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94bWwiLCBuZXcgQXBwbGljYXRpb25YTUxCdWlsZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRm9ybVVSTEVuY29kZWRCdWlsZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfREVGQVVMVF9GQUxMQkFDS19CVUlMREVSLCAidHJ1ZSIpOwotICAgICAgICBPTUVsZW1lbnQgZW52ZWxvcGUgPSBUcmFuc3BvcnRVdGlscy5jcmVhdGVTT0FQTWVzc2FnZShtYyxmaXMsIm11bHRpcGFydC9taXhlZDtib3VuZGFyeT0tLU1JTUVCb3VuZGFyeTI1OERFMkQxMDUyOThCNzU2RCIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnZlbG9wZSBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSk7Ci0gICAgICAgIE9NRWxlbWVudCBmaXJzdEVsZW1lbnQgPSAoKFNPQVBFbnZlbG9wZSllbnZlbG9wZSkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotCQlhc3NlcnRUcnVlKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpOwotCQlhc3NlcnRUcnVlKCgoT01Tb3VyY2VkRWxlbWVudClmaXJzdEVsZW1lbnQpLmdldERhdGFTb3VyY2UoKSBpbnN0YW5jZW9mIFVua25vd25Db250ZW50T01EYXRhU291cmNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29kZWdlbi9JbnZhbGlkRmF1bHRXc2RsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvZGVnZW4vSW52YWxpZEZhdWx0V3NkbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFmOWQ1Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29kZWdlbi9JbnZhbGlkRmF1bHRXc2RsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvZGVnZW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwyQ29kZTsKLQotcHVibGljIGNsYXNzIEludmFsaWRGYXVsdFdzZGxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhaWRXc2RsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHdzZGx1cmkgPSAidGVzdC1yZXNvdXJjZXMvSW52YWxpZC53c2RsIjsKLSAgICAgICAgICAgIFN0cmluZyBhcmdzW10gPSBuZXcgU3RyaW5nW10geyAiLXVyaSIsIHdzZGx1cmksICItbyIsICJ0YXJnZXQvaW52YWxpZHdzZGxvdXRsb2NhdGlvbiIgfTsKLSAgICAgICAgICAgIG5ldyBXU0RMMkNvZGUoKS5tYWluKGFyZ3MpOwotICAgICAgICAgICAgZmFpbCgiVGhpcyBtdXN0IGZhaWwgd2l0aCB0aGUgZXhjZXRpb24gOiIgKwotICAgICAgICAgICAgICAgICAgICAiTm8gZWxlbWVudCByZWZlcmVuY2UgZm91bmQgZm9yIHRoZSBwYXJ0IGluIGZhdWx0IG1lc3NhZ2UgIiArCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkSXNibkZhdWx0LiBGYXVsdCBtZXNzYWdlIHBhcnQgc2hvdWxkIGFsd2F5cyBiZSByZWZlciAiICsKLSAgICAgICAgICAgICAgICAgICAgInRvIGFuIGVsZW1lbnQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgKLSAgICAgICAgICAgICAgICAgICAgIlBhcnQgJ21lc3NhZ2UnIG9mIGZhdWx0IG1lc3NhZ2UgJ3todHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlfUludmFsaWRJc2JuRmF1bHQnIikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTGlmZWN5Y2xlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTGlmZWN5Y2xlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ5NmEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0xpZmVjeWNsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNlcnZpY2UuTGlmZWN5Y2xlOwotCi1wdWJsaWMgY2xhc3MgTGlmZWN5Y2xlVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgU2VydmljZSBpbXBsZW1lbnRzIExpZmVjeWNsZSB7Ci0gICAgICAgIHN0YXRpYyBib29sZWFuIGluaXRDYWxsZWQsIGRlc3Ryb3lDYWxsZWQ7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW5pdChTZXJ2aWNlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIGluaXRDYWxsZWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveShTZXJ2aWNlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBkZXN0cm95Q2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlT2JqZWN0TGlmZWN5Y2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlcGxveUNsYXNzQXNTZXJ2aWNlKCJsaWZlY3ljbGUiLCBTZXJ2aWNlLmNsYXNzLCBDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04pOwotICAgICAgICBhc3NlcnRUcnVlKCJpbml0KCkgbm90IGNhbGxlZCEiLCBTZXJ2aWNlLmluaXRDYWxsZWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1RhcmdldFJlc29sdmVyU2VydmljZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1RhcmdldFJlc29sdmVyU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5OGEyNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UYXJnZXRSZXNvbHZlclNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLQotcHVibGljIGNsYXNzIFRhcmdldFJlc29sdmVyU2VydmljZVRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXN1cGVyLnNldFVwKCk7Ci0gICAgCXNlcnZlckNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQsIG5ldyBNZXNzYWdlUmVjZWl2ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCQkJLy8gU2V0IHRoZSByZXBseSB0byBvbiB0aGUgc2VydmVyIHNpZGUgdG8gdGVzdCBzZXJ2ZXIgc2lkZQotCQkJCS8vIHRhcmdldCByZXNvbHZlcnMKLQkJCQltc2dDb250ZXh0LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKAotCSAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9uZXcvYW5vbnltb3VzL2FkZHJlc3MiKSk7Ci0JCQkgICAgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkucmVjZWl2ZShtc2dDb250ZXh0KTsKLQkJCX0KLSAgICAJfSk7Ci0gICAgCWRlcGxveUNsYXNzQXNTZXJ2aWNlKEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLmNsYXNzKTsKLSAgICAJY2xpZW50Q3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkVGFyZ2V0UmVzb2x2ZXIobmV3IFRlc3RUYXJnZXRSZXNvbHZlcigpKTsKLSAgICAJc2VydmVyQ29uZmlnLmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkVGFyZ2V0UmVzb2x2ZXIobmV3IFRlc3RUYXJnZXRSZXNvbHZlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFRhcmdldFJzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgIAlTdHJpbmcgb2xkQWRkcmVzcyA9IHNlbmRlci5nZXRPcHRpb25zKCkuZ2V0VG8oKS5nZXRBZGRyZXNzKCk7Ci0gICAgCVN0cmluZyBuZXdBZGRyZXNzID0gInRydGVzdCIrb2xkQWRkcmVzcy5zdWJzdHJpbmcoNSk7Ci0gICAgCXNlbmRlci5nZXRPcHRpb25zKCkuZ2V0VG8oKS5zZXRBZGRyZXNzKG5ld0FkZHJlc3MpOwotICAgIAlPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuc2VuZFJlY2VpdmUoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotICAgIAlUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3BvbnNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1Rlc3RUYXJnZXRSZXNvbHZlci5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVGVzdFRhcmdldFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Njg4NDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVGVzdFRhcmdldFJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGFyZ2V0UmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VGFyZ2V0UmVzb2x2ZXIgaW1wbGVtZW50cyBUYXJnZXRSZXNvbHZlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGFyZ2V0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZVRhcmdldDoiICsgbWVzc2FnZUNvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uZXcvYW5vbnltb3VzL2FkZHJlc3MiKSkgewotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0VG8oKS5zZXRBZGRyZXNzKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FOT05ZTU9VU19VUkwpOwotICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpLnN0YXJ0c1dpdGgoInRydGVzdDovLyIpKSB7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRUbygpLnNldEFkZHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICJsb2NhbCIgKyBtZXNzYWdlQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKS5zdWJzdHJpbmcoNikpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzb2x2ZVRhcmdldDoiICsgbWVzc2FnZUNvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVHJhbnNwb3J0RGVwbG95bWVudFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1RyYW5zcG9ydERlcGxveW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGFjMjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVHJhbnNwb3J0RGVwbG95bWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0RGVwbG95bWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0RGVwbG95bWVudFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0cygpIHRocm93cyBBeGlzRmF1bHQsCi0gICAgICAgICAgICBQaGFzZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIERlcGxveW1lbnRFeGNlcHRpb24sCi0gICAgICAgICAgICBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50IjsKLSAgICAgICAgRmlsZSByZXBvID0gbmV3IEZpbGUocmVwb3NpdG9yeU5hbWUpOwotICAgICAgICBTdHJpbmcgeG1sRmlsZSA9IHJlcG9zaXRvcnlOYW1lICsgIi9zZXJ2ZXItdHJhbnNwb3J0LnhtbCI7Ci0gICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoeG1sRmlsZSk7Ci0gICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZnNjID0KLSAgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihyZXBvLmdldEFic29sdXRlUGF0aCgpLCB4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBlciA9IGZzYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnQxID0gZXIuZ2V0VHJhbnNwb3J0T3V0KCJjdXN0b20iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0cmFuc3BvcnQxKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhkNzMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMvd3NkbC9WZXJzaW9uLndzZGwiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb24oKSB7Ci0gICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKLSAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VGaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciBidWlsZGVyID0gbmV3IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0UmVzb3VyY2VGaWxlKSk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnByaW50V1NETChiYW9zKTsKLSAgICAgICAgICAgIGFzc2VydFhNTEVxdWFsKG5ldyBGaWxlUmVhZGVyKHRlc3RSZXNvdXJjZUZpbGUpLCBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBYTUxVbml0LnNldElnbm9yZVdoaXRlc3BhY2UoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ2FsbFVucmVnaXN0ZXJlZFNlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0NhbGxVbnJlZ2lzdGVyZWRTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDdmMWE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ2FsbFVucmVnaXN0ZXJlZFNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBDYWxsVW5yZWdpc3RlcmVkU2VydmljZVRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWRlcGxveUNsYXNzQXNTZXJ2aWNlKEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FICsgIi1mYWlsIiwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0JCQlzZW5kZXIuc2VuZFJlY2VpdmUoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotCQkJZmFpbCgiVGhlIHRlc3QgbXVzdCBmYWlsIGR1ZSB0byB3cm9uZyBzZXJ2aWNlIE5hbWUiKTsKLQkJfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLQkJCWFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiVGhlIHNlcnZpY2UgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUiKSA+PSAwKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ2hhcmFjdGVyc2V0RW5jb2RpbmdUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0NoYXJhY3RlcnNldEVuY29kaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNkMjk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ2hhcmFjdGVyc2V0RW5jb2RpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKiBUZXN0aW5nIGNoYXJhY3RlciBlbmNvZGluZyBzdXBwb3J0ICovCi1wdWJsaWMgY2xhc3MgQ2hhcmFjdGVyc2V0RW5jb2RpbmdUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDaGFyYWN0ZXJzZXRFbmNvZGluZ1Rlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIENoYXJhY3RlcnNldEVuY29kaW5nVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoQ2hhcmFjdGVyc2V0RW5jb2RpbmdUZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJjaHVua2luZy1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHRleHQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJUZXh0Iiwgb21Ocyk7Ci0gICAgICAgICAgICB0ZXh0LmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodGV4dCwgdmFsdWUpKTsKLSAgICAgICAgICAgIHBheWxvYWQuYWRkQ2hpbGQodGV4dCk7Ci0KLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsICJ1dGYtMTYiKTsKLQotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgImNodW5raW5nLWVuYWJsZWRSZXBvc2l0b3J5IiksIG51bGwpOwotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0RWxlbSA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXN1bHQgaXMgbnVsbCIsIHJlc3VsdEVsZW0pOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICgoT01FbGVtZW50KXJlc3VsdEVsZW0uZ2V0Rmlyc3RPTUNoaWxkKCkpLmdldFRleHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzdWx0IHZhbHVlIGlzIG51bGwiLCByZXN1bHQpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHJlc3VsdCBub3QgcmVjZWl2ZWQuIiwgZXhwZWN0ZWQsIHJlc3VsdCk7Ci0gICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUsIGUpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkZhaWx1cmUgaW4gcHJvY2Vzc2luZyIsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgcnVudGVzdChTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5UZXN0KHZhbHVlLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW50ZXN0KCJhIHNpbXBsZSBzdHJpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV2l0aEFwb3N0cm9waGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bnRlc3QoInRoaXMgaXNuJ3QgYSBzaW1wbGUgc3RyaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1dpdGhFbnRpdGllcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW5UZXN0KCImYW1wOyZsdDsmZ3Q7JmFwb3M7JnF1b3Q7IiwgIiZhbXA7Jmx0OyZndDsmYXBvczsmcXVvdDsiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV2l0aFJhd0VudGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1blRlc3QoIiY8PidcIiIsICImPD4nXCIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV2l0aExlYWRpbmdBbmRUcmFpbGluZ1NwYWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBydW50ZXN0KCIgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdoaXRlc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVudGVzdCgiIFxuIFx0ICIpOyAvLyBub3RlOiBcciBmYWlscwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGcmVuY2hBY2NlbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bnRlc3QoIlx1MDBlMFx1MDBlMlx1MDBlNFx1MDBlN1x1MDBlOFx1MDBlOVx1MDBlYVx1MDBlYlx1MDBlZVx1MDBlZlx1MDBmNFx1MDBmNlx1MDBmOVx1MDBmYlx1MDBmYyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXJtYW5VbWxhdXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJ1bnRlc3QoIiBTb21lIHRleHQgXHUwMGRmIHdpdGggXHUwMGZjIHNwZWNpYWwgXHUwMGY2IGNoYXJzIFx1MDBlNC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2VsY29tZVVuaWNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2VsY29tZSBpbiBzZXZlcmFsIGxhbmd1YWdlcwotICAgICAgICBydW50ZXN0KAotICAgICAgICAgICAgICAgICJDaGluZXNlICh0cmFkLikgOiBcdTZiNjFcdThmY2UgICIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWxjb21lVW5pY29kZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gd2VsY29tZSBpbiBzZXZlcmFsIGxhbmd1YWdlcwotICAgICAgICBydW50ZXN0KAotICAgICAgICAgICAgICAgICJHcmVlayA6IFx1MDNiYVx1MDNiMVx1MDNiYlx1MDNjZVx1MDNjMiBcdTAzYmZcdTAzYzFcdTAzYWZcdTAzYzNcdTAzYjFcdTAzYzRcdTAzYjUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2VsY29tZVVuaWNvZGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHdlbGNvbWUgaW4gc2V2ZXJhbCBsYW5ndWFnZXMKLSAgICAgICAgcnVudGVzdCgKLSAgICAgICAgICAgICAgICAiSmFwYW5lc2UgOiBcdTMwODhcdTMwNDZcdTMwNTNcdTMwNWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQ29tbW9uc0hUVFBFY2hvUmF3WE1MVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Db21tb25zSFRUUEVjaG9SYXdYTUxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDgyMzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Db21tb25zSFRUUEVjaG9SYXdYTUxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLy90b2RvCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25zSFRUUEVjaG9SYXdYTUxUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb21tb25zSFRUUEVjaG9SYXdYTUxUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIENvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKENvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uc0hUVFBFY2hvUmF3WE1MVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKENvbW1vbnNIVFRQRWNob1Jhd1hNTFRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTEFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgImNvbW1vbnMtaHR0cC1lbmFibGVkUmVwb3NpdG9yeSIpLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcocGF5bG9hZCwgY2FsbGJhY2spOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gMTApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotLy8gICAgICAgIGNhbGwuY2xvc2UoKTsKLS8vCi0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXFlc3QiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgImNvbW1vbnMtaHR0cC1lbmFibGVkUmVwb3NpdG9yeSIpLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0vLyAgICAgICAgY2FsbC5jbG9zZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjZGFjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjaG8gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVjaG8uY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJFY2hvWE1MU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNIT19PTV9FTEVNRU5UX09QX05BTUUgPSAiZWNob09NRWxlbWVudCI7Ci0gICAgCi0gICAgcHVibGljIEVjaG8oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZWNob1ZvaWQoKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJlY2hvIFNlcnZpY2UgQ2FsbGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZWNob09NRWxlbWVudE5vUmVzcG9uc2UoT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIGxvZy5pbmZvKCJlY2hvT01FbGVtZW50Tm9SZXNwb25zZSBzZXJ2aWNlIGNhbGxlZC4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9PTUVsZW1lbnQoT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIG9tRWxlLmJ1aWxkV2l0aEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIG9tRWxlLnNldExvY2FsTmFtZShvbUVsZS5nZXRMb2NhbE5hbWUoKSArICJSZXNwb25zZSIpOwotICAgICAgICBpZiAob21FbGUuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLnRyaW0oKS5zdGFydHNXaXRoKCJmYXVsdCIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZmF1bHQgc3RyaW5nIGZvdW5kIGluIGVjaG9PTUVsZW1lbnQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21FbGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvT00oT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGluKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGVjaG9JbnQoaW50IGluKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9NVE9NdG9CYXNlNjQoT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIE9NVGV4dCBvbVRleHQgPSAoT01UZXh0KShvbUVsZS5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIG9tVGV4dC5zZXRPcHRpbWl6ZShmYWxzZSk7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3UnVudGltZVByb3h5VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3UnVudGltZVByb3h5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTllOGI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1J1bnRpbWVQcm94eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSHR0cFRyYW5zcG9ydFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdSdW50aW1lUHJveHlUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NTU1NSIKLSAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9YTUxTZXJ2aWNlIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImVjaG9PTUVsZW1lbnQiKTsKLQotCi0gICAgcHVibGljIEVjaG9SYXdSdW50aW1lUHJveHlUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3UnVudGltZVByb3h5VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3UnVudGltZVByb3h5VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdSdW50aW1lUHJveHlUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByb3h5IHNldHRpbmcgaW4gcnVudGltZQotICAgICAgICAgKi8KLSAgICAgICAgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuUHJveHlQcm9wZXJ0aWVzIHByb3h5cHJvcGVydGllcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLlByb3h5UHJvcGVydGllcygpOwotICAgICAgICBwcm94eXByb3BlcnRpZXMuc2V0UHJveHlOYW1lKCJsb2NhbGhvc3QiKTsKLSAgICAgICAgcHJveHlwcm9wZXJ0aWVzLnNldFByb3h5UG9ydCg1NTU1KTsKLSAgICAgICAgcHJveHlwcm9wZXJ0aWVzLnNldERvbWFpbigiYW5vbnltb3VzIik7Ci0gICAgICAgIHByb3h5cHJvcGVydGllcy5zZXRQYXNzV29yZCgiYW5vbnltb3VzIik7Ci0gICAgICAgIHByb3h5cHJvcGVydGllcy5zZXRVc2VyTmFtZSgiYW5vbnltb3VzIik7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLlBST1hZLCBwcm94eXByb3BlcnRpZXMpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxDaHVua2VkVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MQ2h1bmtlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiZDIxMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxDaHVua2VkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLy90b2RvCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3WE1MQ2h1bmtlZFRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9IT01FID0gVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJjaHVua2luZy1lbmFibGVkUmVwb3NpdG9yeSIpOwotCi0gICAgcHVibGljIEVjaG9SYXdYTUxDaHVua2VkVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1hNTENodW5rZWRUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdYTUxDaHVua2VkVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3WE1MQ2h1bmtlZFRlc3QuY2xhc3MpLCBDTElFTlRfSE9NRSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLQotICAgICAgICBPcHRpb25zIGNsaWVudE9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBjbGllbnRPcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKENMSUVOVF9IT01FLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMoY2xpZW50T3B0aW9ucyk7Ci0gICAgICAgIGNsaWVudE9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE11bHRpcGxlQVN5bmNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxNdWx0aXBsZUFTeW5jVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc3MmVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE11bHRpcGxlQVN5bmNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd1hNTE11bHRpcGxlQVN5bmNUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFY2hvUmF3WE1MTXVsdGlwbGVBU3luY1Rlc3QuY2xhc3MpOwotICAgIHByb3RlY3RlZCBRTmFtZSB0cmFuc3BvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbG9jYWxob3N0L215IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVsbFRyYW5zcG9ydCIpOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5OwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtYzsKLSAgICBwcm90ZWN0ZWQgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MTXVsdGlwbGVBU3luY1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdYTUxUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdYTUxNdWx0aXBsZUFTeW5jVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEVjaG9SYXdYTUxNdWx0aXBsZUFTeW5jVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxNdWx0aXBsZUFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwby9jb25mL2F4aXMyLnhtbCIpKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNob09NRWxlbWVudCIpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhwYXlsb2FkLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUgKCFmaW5pc2gpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAxMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgd2FzIHNodXRkb3duIGFzIHRoZSBhc3luYyByZXNwb25zZSB0YWtlIHRvbyBsb25nIHRvIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXF1ZXN0Iik7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTE11bHRpcGxlRHVlbEFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwby9jb25mL2F4aXMyLnhtbCIpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNob09NRWxlbWVudCIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArIG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0KLSAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0KLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMTApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIGlzIHNodXRkb3duIGFzIHRoZSBBc3luYyByZXNwb25zZSB0YWtlIHRvbyBsb25ncyB0aW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgICAgIGxvZy5pbmZvKCJzZW5kIHRoZSByZXF1ZXN0Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM2MWExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE11bHRpcGxlU3luY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNob1Jhd1hNTE11bHRpcGxlU3luY1Rlc3QuY2xhc3MpOwotICAgIHByb3RlY3RlZCBRTmFtZSB0cmFuc3BvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbG9jYWxob3N0L215IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVsbFRyYW5zcG9ydCIpOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5OwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtYzsKLSAgICBwcm90ZWN0ZWQgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1hNTFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1hNTE11bHRpcGxlU3luY1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShFY2hvUmF3WE1MTXVsdGlwbGVTeW5jVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MTXVsdGlwbGVTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRDYWxsVHJhbnNwb3J0Q2xlYW51cCh0cnVlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDUwMDAwKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MTXVsdGlwbGVEdWVsU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoNTAwMDApOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvL2NvbmYvYXhpczIueG1sIikpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArIG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigidXJuOmVjaG9PTUVsZW1lbnQiKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VuZGVyLmNsZWFudXAoKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC50ZXJtaW5hdGUoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MT25Ud29DaGFubmVsc1N5bmNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzNDgzMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3WE1MT25Ud29DaGFubmVsc1N5bmNUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UKLSAgICAgICAgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MT25Ud29DaGFubmVsc1N5bmNUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3WE1MT25Ud29DaGFubmVsc1N5bmNUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzU3luY1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShFY2hvUmF3WE1MT25Ud29DaGFubmVsc1N5bmNUZXN0LmNsYXNzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MQ29tcGxldGVTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbmV0eHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KCJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbmV0eHQsIHNlcnZpY2UpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKG9wZXJhdGlvbk5hbWUsIG1ldGhvZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxDb21wbGV0ZVN5bmN3aXRoVHdvVHJhbnNwb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbmV0eHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KCJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9MT0NBTCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcihmYWxzZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29uZXR4dCwgc2VydmljZSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUob3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRWNob1Jhd1hNTE9uVHdvQ2hhbm5lbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjdmNjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdC5jbGFzcyk7Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdYTUxPblR3b0NoYW5uZWxzVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShFY2hvUmF3WE1MT25Ud29DaGFubmVsc1Rlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxDb21wbGV0ZUFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5zZXRUZXh0KCJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpLmdldEJvZHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdjb250ZXh0LCBzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhvcGVyYXRpb25OYW1lLCBtZXRob2QsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoIWZpbmlzaCkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDEwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuaW5mbygic2VuZCB0aGUgcmVxZXN0Iik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VjaG9SYXdYTUxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3M2IxYzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FY2hvUmF3WE1MVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8vdG9kbwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3WE1MVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNob1Jhd1hNTFRlc3QuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5OwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBtYzsKLSAgICBwcm90ZWN0ZWQgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFY2hvUmF3WE1MVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1hNTFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1hNTFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShFY2hvUmF3WE1MVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxBU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IENhbGxiYWNrKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgZmluaXNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhwYXlsb2FkLCBjYWxsYmFjayk7Ci0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gMTApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2cuaW5mbygic2VuZCB0aGUgcmVxdWVzdCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0U09BUEVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmNIdHRwVmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX1BST1RPQ09MX1ZFUlNJT04sIEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzEwKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRW5naW5lUGF1c2luZ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRW5naW5lUGF1c2luZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5YTk4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VuZ2luZVBhdXNpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFbmdpbmVQYXVzaW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0lEWCA9ICJGYXVsdEluZGV4IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9SRUFTT04gPSAiSSBmYXVsdGVkIGJlY2F1c2UgSSB3YXMgdG9sZCB0byEiOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiTnVsbFNlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIkR1bW15T3AiKTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW47Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYzsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBleGVjdXRlZEhhbmRsZXJzOwotCi0gICAgcHVibGljIEVuZ2luZVBhdXNpbmdUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgICAgICBleGVjdXRlZEhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeSA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBjb25maWdDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGVuZ2luZVJlZ2lzdHJ5KTsKLSAgICAgICAgY29uZmlnQ29udGV4dC5zZXRTZXJ2aWNlUGF0aChDb25zdGFudHMuREVGQVVMVF9TRVJWSUNFU19QQVRIKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC5zZXRDb250ZXh0Um9vdCgiYXhpczIiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydE91dC5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiLCBuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotCi0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgYWJkID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLQotICAgICAgICBhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIHJ1ZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgcnVkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBzYWJkID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLQotICAgICAgICBzYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIHNtYmQgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgc21iZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIocnVkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNhYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc21iZCk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0KLSAgICAgICAgQXhpc0VuZHBvaW50IGVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICBlbmRwb2ludC5zZXROYW1lKCJOdWxsU2VydmljZSIpOwotCi0gICAgICAgIEF4aXNCaW5kaW5nIGJpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgYmluZGluZ09wLnNldE5hbWUoYXhpc09wLmdldE5hbWUoKSk7Ci0gICAgICAgIGJpbmRpbmdPcC5zZXRBeGlzT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIGJpbmRpbmcuYWRkQ2hpbGQoYmluZGluZ09wKTsKLSAgICAgICAgZW5kcG9pbnQuc2V0QmluZGluZyhiaW5kaW5nKTsKLSAgICAgICAgc2VydmljZS5hZGRFbmRwb2ludChlbmRwb2ludC5nZXROYW1lKCksIGVuZHBvaW50KTsKLSAgICAgICAgc2VydmljZS5zZXRFbmRwb2ludE5hbWUoZW5kcG9pbnQuZ2V0TmFtZSgpKTsKLQotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcCk7Ci0KLSAgICAgICAgbWMgPSBjb25maWdDb250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0vLyAgICAgICAgbWMuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwgU3lzdGVtLm91dCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IG9tRmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShvbUZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgUGhhc2UgcGhhc2UxID0gbmV3IFBoYXNlKCIxIik7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcig0KSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcig1KSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcig2KSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcig3KSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcig4KSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcig5KSk7Ci0KLSAgICAgICAgUGhhc2UgcGhhc2UyID0gbmV3IFBoYXNlKCIyIik7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxMCkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTEpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEyKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxMykpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTQpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE1LCB0cnVlKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxNikpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTcpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE4KSk7Ci0KLSAgICAgICAgUGhhc2UgcGhhc2UzID0gbmV3IFBoYXNlKCIzIik7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxOSkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjApKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIxKSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyMikpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjMpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI0KSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyNSkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjYpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI3KSk7Ci0KLSAgICAgICAgLy9UT0RPCi0gICAgICAgIGF4aXNPcC5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLSAgICAgICAgYXhpc09wLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTIpOwotICAgICAgICBheGlzT3AuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMyk7Ci0KLSAgICAgICAgbWMuc2V0V1NBQWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBtYy5zZXRTb2FwQWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiL2F4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDE0LCBleGVjdXRlZEhhbmRsZXJzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTQ7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcikgZXhlY3V0ZWRIYW5kbGVycy5nZXQoaSkpLmludFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKG1jKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoMjcsIGV4ZWN1dGVkSGFuZGxlcnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE1OyBpIDwgMjc7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcikgZXhlY3V0ZWRIYW5kbGVycy5nZXQoaSkpLmludFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZsb3dDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoIi9heGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgLy8gRmF1bHQgb24gSGFuZGxlciAjNQotICAgICAgICBtYy5zZXRQcm9wZXJ0eShGQVVMVF9JRFgsIG5ldyBJbnRlZ2VyKDUpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgdGhpcyBmYXVsdC4KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBleGVjdXRlZEhhbmRsZXJzLnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZmF1bHQgZGlkIG5vdCBvY2N1ciIpOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgSW50ZWdlciBpbmRleDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBhdXNlID0gZmFsc2U7Ci0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKGludCBpbmRleCwgYm9vbGVhbiBwYXVzZSkgewotICAgICAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIHRoaXMucGF1c2UgPSBwYXVzZTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiaGFuZGxlciIgKyBpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKGludCBpbmRleCkgewotICAgICAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiaGFuZGxlciIgKyBpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBpZiAocGF1c2UpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgcGF1c2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEludGVnZXIgZmF1bHRJbmRleCA9IChJbnRlZ2VyKW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoRkFVTFRfSURYKTsKLSAgICAgICAgICAgIGlmIChmYXVsdEluZGV4ICE9IG51bGwgJiYgZmF1bHRJbmRleC5lcXVhbHMoaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChGQVVMVF9SRUFTT04pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBmbG93Q29tcGxldGUoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoRkFVTFRfSURYKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaGVyZSBvbiBhbiBpbnZvY2F0aW9uIHdoZXJlIHNvbWVvbmUgd2FzIHN1cHBvc2VkIHRvIGZhdWx0Li4uCi0gICAgICAgICAgICAgICAgQXhpc0ZhdWx0IGZhdWx0ID0gKEF4aXNGYXVsdCltc2dDb250ZXh0LmdldEZhaWx1cmVSZWFzb24oKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBmYXVsdCEiLCBmYXVsdCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyB0aGUgcmlnaHQgZmF1bHQuCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZBVUxUX1JFQVNPTiwgZmF1bHQuZ2V0UmVhc29uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9FbmdpbmVXaXRob3V0UGhhc2VSZXNvbHZpbmdUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VuZ2luZVdpdGhvdXRQaGFzZVJlc29sdmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxMDkyZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0VuZ2luZVdpdGhvdXRQaGFzZVJlc29sdmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRW5naW5lV2l0aG91dFBoYXNlUmVzb2x2aW5nVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJOdWxsT3BlcmF0aW9uIik7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotCi0gICAgcHVibGljIEVuZ2luZVdpdGhvdXRQaGFzZVJlc29sdmluZ1Rlc3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZ2luZVdpdGhvdXRQaGFzZVJlc29sdmluZ1Rlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBlbmdpbmVSZWdpc3RyeSA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBjb25maWdDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGVuZ2luZVJlZ2lzdHJ5KTsKLQotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0KLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVuZ2luZVJlZ2lzdHJ5LmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0KLSAgICAgICAgbWMgPSBjb25maWdDb250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydCk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBjb25maWdDb250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoCi0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCkpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzYyA9IHNnYy5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlKTsKLQotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCA9IHNjLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoYXhpc09wKTsKLQotICAgICAgICBtYy5zZXRPcGVyYXRpb25Db250ZXh0KG9wQ29udGV4dCk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnQpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgbWMuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgU09BUEZhY3Rvcnkgb21GYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKG9tRmFjLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLQotCi0gICAgICAgIG1jLnNldFdTQUFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgbWMuc2V0U29hcEFjdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJSZWNlaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1jLnNldFRvKAotICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0gICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE51bGxNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlciB7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9GYXVsdEhhbmRsaW5nVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9GYXVsdEhhbmRsaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2I5NTliLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRmF1bHRIYW5kbGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLkZhdWx0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGYXVsdEhhbmRsaW5nVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9ICJ0ZXN0LXJlc291cmNlcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShGYXVsdEhhbmRsaW5nVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gVXRpbFNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBMaXN0IGluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaCA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgUGhhc2UgcGhhc2VPbmUgPSAoUGhhc2UpaW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoLmdldCgwKTsKLSAgICAgICAgcGhhc2VPbmUuYWRkSGFuZGxlcihuZXcgRmF1bHRIYW5kbGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdEhhbmRsaW5nV2l0aFBhcmFtc1NldFRvTXNnQ3R4dCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGdldE9NRWxlbWVudChGYXVsdEhhbmRsZXIuRVJSX0hBTkRMSU5HX1dJVEhfTVNHX0NUWFQpOwotICAgICAgICB0ZXN0RmF1bHRIYW5kbGluZyhwYXlsb2FkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRIYW5kbGluZ1dpdGhQYXJhbXNTZXRUb0F4aXNGYXVsdCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGdldE9NRWxlbWVudChGYXVsdEhhbmRsZXIuRVJSX0hBTkRMSU5HX1dJVEhfQVhJU19GQVVMVCk7Ci0gICAgICAgIHRlc3RGYXVsdEhhbmRsaW5nKHBheWxvYWQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RmF1bHRIYW5kbGluZyhPTUVsZW1lbnQgcGF5bG9hZCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLQotICAgICAgICAvLyB0ZXN0IHdpdGggU09BUCAxLjIKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoZmFsc2UpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZihGYXVsdEhhbmRsZXIuTV9GQVVMVF9FWENFUFRJT04pID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKEZhdWx0SGFuZGxlci5ERVRBSUxfTU9SRV9JTkZPKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZihGYXVsdEhhbmRsZXIuRkFVTFRfUkVBU09OKSA+IC0xKTsKLQotICAgICAgICAvLyB0ZXN0IHdpdGggU09BUCAxLjEKLSAgICAgICAgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KGZhbHNlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZihGYXVsdEhhbmRsZXIuTV9GQVVMVF9FWENFUFRJT04pID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKEZhdWx0SGFuZGxlci5ERVRBSUxfTU9SRV9JTkZPKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZihGYXVsdEhhbmRsZXIuRkFVTFRfUkVBU09OKSA+IC0xKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoU3RyaW5nIGVsZW1lbnRMb2NhbE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudChlbGVtZW50TG9jYWxOYW1lLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZQYXJhbXNXaXRoRmF1bHRUbygpIHRocm93cyBBeGlzRmF1bHQsIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBnZXRTT0FQRW52ZWxvcGVXaXRoUmVmUGFyYW1zSW5GYXVsdFRvKCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSByZXNwb3NlRW52ZWxvcGUgPSBnZXRSZXNwb25zZShzb2FwRW52ZWxvcGUpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzcG9zZUVudmVsb3BlID0gIiArIHJlc3Bvc2VFbnZlbG9wZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZ2V0U09BUEVudmVsb3BlV2l0aFJlZlBhcmFtc0luRmF1bHRUbygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc29hcCA9Ci0gICAgICAgICAgICAgICAgIjxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PVwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlXCIgeG1sbnM6d3NhPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nXCI+ICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDxlbnY6SGVhZGVyPiAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIDx3c2E6QWN0aW9uPmh0dHA6Ly9leGFtcGxlLm9yZy9hY3Rpb24vZWNob0luPC93c2E6QWN0aW9uPiAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIDx3c2E6VG8+aHR0cDovL3d3dy1say53c28yLmNvbTo5NzYyL2F4aXMyL3NlcnZpY2VzL3dzYVRlc3RTZXJ2aWNlLzwvd3NhOlRvPiAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIDx3c2E6TWVzc2FnZUlEPnVybjp1dWlkOkJBQjc5Qjc3LUU5QUUtNEI5Ri1BOEI0LTYyNEJCOUU3RTkxOTwvd3NhOk1lc3NhZ2VJRD4gICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICA8d3NhOlJlcGx5VG8+ICAgICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2Fub255bW91czwvd3NhOkFkZHJlc3M+ICAgICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8d3NhOlJlZmVyZW5jZVBhcmFtZXRlcnMgeG1sbnM6Y3VzdG9tZXI9XCJodHRwOi8vZXhhbXBsZS5vcmcvY3VzdG9tZXJcIj4gICAgICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgPGN1c3RvbWVyOkN1c3RvbWVyS2V5PktleSMxMjM0NTY3ODk8L2N1c3RvbWVyOkN1c3RvbWVyS2V5PiAgICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4gICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICA8L3dzYTpSZXBseVRvPiAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgIDx3c2E6RmF1bHRUbz4gICAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4gICAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycyB4bWxuczpjdXN0b21lcj1cImh0dHA6Ly9leGFtcGxlLm9yZy9jdXN0b21lclwiPiAgICAgICAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICA8Y3VzdG9tZXI6Q3VzdG9tZXJLZXk+RmF1bHQjMTIzNDU2Nzg5PC9jdXN0b21lcjpDdXN0b21lcktleT4gICAgICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+ICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgPC93c2E6RmF1bHRUbz4gIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgPC9lbnY6SGVhZGVyPiAgXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICA8ZW52OkJvZHk+ICAgIFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgPG06ZWNob0luIHhtbG5zOm09XCJodHRwOi8vZXhhbXBsZS5vcmcvZWNob1wiIC8+ICBcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIDwvZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICA8L2VudjpFbnZlbG9wZT4iOwotICAgICAgICByZXR1cm4gKFNPQVBFbnZlbG9wZSluZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc29hcC5nZXRCeXRlcygpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAgICAgIC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBnZXRSZXNwb25zZShTT0FQRW52ZWxvcGUgaW5FbnZlbG9wZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZjdHggPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmN0eCwgbnVsbCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdChmYWxzZSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtc2djdHguc2V0RW52ZWxvcGUoaW5FbnZlbG9wZSk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCA9IGNsaWVudC5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIG9wQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1zZ2N0eCk7Ci0gICAgICAgIG9wQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0gICAgICAgIHJldHVybiBvcENsaWVudC5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpLmdldEVudmVsb3BlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSh0ZXN0UmVzb3VyY2VEaXIpLCByZWxhdGl2ZVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkluZm9ybWF0aW9uRXh0cmFjdGlvbkZyb21BeGlzRmF1bHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGdldE9NRWxlbWVudChGYXVsdEhhbmRsZXIuRVJSX0hBTkRMSU5HX1dJVEhfQVhJU19GQVVMVCk7Ci0KLSAgICAgICAgICAgIC8vIHRlc3Qgd2l0aCBTT0FQIDEuMgotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQodHJ1ZSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKS50b1N0cmluZygpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGF4aXNGYXVsdC5nZXRGYXVsdENvZGVFbGVtZW50KCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihGYXVsdEhhbmRsZXIuTV9GQVVMVF9FWENFUFRJT04pID4gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShheGlzRmF1bHQuZ2V0RmF1bHREZXRhaWxFbGVtZW50KCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZihGYXVsdEhhbmRsZXIuREVUQUlMX01PUkVfSU5GTykgPiAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGF4aXNGYXVsdC5nZXRGYXVsdFJlYXNvbkVsZW1lbnQoKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKEZhdWx0SGFuZGxlci5GQVVMVF9SRUFTT04pID4gLTEpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXJFeGVjdXRpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXJFeGVjdXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMDc1NmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9IYW5kbGVyRXhlY3V0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuRmF1bHRUaHJvd2luZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyRXhlY3V0aW9uVGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdCB0ZXN0UmVzdWx0czsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHRlc3RTZXJ2aWNlOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgdGVzdEZhaWxpbmdTZXJ2aWNlOwotICAgIHByaXZhdGUgUU5hbWUgZmFpbGluZ1NlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJGYXVsdFRocm93aW5nU2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgZmFpbGluZ09wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImVjaG9XaXRoRmF1bHQiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBUZXN0SGFuZGxlciBtaWRkbGVHbG9iYWxJbkhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBUZXN0SGFuZGxlciBmaXJzdE9wZXJhdGlvbkluSGFuZGxlcjsKLSAgICBwcml2YXRlIFRlc3RIYW5kbGVyIG1pZGRsZU9wZXJhdGlvbkluSGFuZGxlcjsKLSAgICBwcml2YXRlIFRlc3RIYW5kbGVyIG1pZGRsZU9wZXJhdGlvbk91dEhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJPcGVyYXRpb25MZXZlbEhhbmRsZXJzKEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3cob3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMpOwotICAgICAgICBBcnJheUxpc3QgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2Ugb3BlcmF0aW9uU3BlY2lmaWNQaGFzZSA9IChQaGFzZSlwaGFzZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04KLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihmaXJzdE9wZXJhdGlvbkluSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG1pZGRsZU9wZXJhdGlvbkluSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiSW42IikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UGhhc2VzT3V0RmxvdyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyk7Ci0gICAgICAgIHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRQaGFzZXNPdXRGbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiT3V0MSIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiT3V0MyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgdGVzdFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIExpc3QgZ2xvYmFsSW5QaGFzZXMgPQotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJDb25maWcuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2xvYmFsSW5QaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQaGFzZSBnbG9iYWxJblBoYXNlID0gKFBoYXNlKWdsb2JhbEluUGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QUkVfRElTUEFUQ0guZXF1YWxzKGdsb2JhbEluUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkluMSIpKTsKLSAgICAgICAgICAgICAgICAgICAgbWlkZGxlR2xvYmFsSW5IYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJJbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsSW5QaGFzZS5hZGRIYW5kbGVyKG1pZGRsZUdsb2JhbEluSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkluMyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJJbjQiKTsKLSAgICAgICAgbWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJJbjUiKTsKLSAgICAgICAgbWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigiT3V0MiIpOwotCi0gICAgICAgIHRlc3RTZXJ2aWNlID0gZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotICAgICAgICByZWdpc3Rlck9wZXJhdGlvbkxldmVsSGFuZGxlcnModGVzdFNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKSkpOwotCi0gICAgICAgIHRlc3RGYWlsaW5nU2VydmljZSA9IGRlcGxveUNsYXNzQXNTZXJ2aWNlKGZhaWxpbmdTZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSwgRmF1bHRUaHJvd2luZ1NlcnZpY2UuY2xhc3MpOwotICAgICAgICByZWdpc3Rlck9wZXJhdGlvbkxldmVsSGFuZGxlcnModGVzdEZhaWxpbmdTZXJ2aWNlLmdldE9wZXJhdGlvbihmYWlsaW5nT3BlcmF0aW9uTmFtZSkpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ2xpZW50IGNyZWF0ZUNsaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlyZXR1cm4gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNsaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gY3JlYXRlQ2xpZW50KCkuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdWNjZXNzZnVsSW52b2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RTdWNjZXNzZnVsSW52b2NhdGlvbiIpOwotCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gY3JlYXRlQ2xpZW50KCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBeGlzU2VydmljZSgpLmdldE9wZXJhdGlvbihTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ0luMSIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDSW4yIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNJbjMiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MSIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MiIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotCi0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkNPdXQxIiwgIkNPdXQyIiwgIkNPdXQzIiwgIkluMSIsCi0gICAgICAgICAgICAgICAgIkluMiIsICJJbjMiLCAiSW40IiwgIkluNSIsICJJbjYiLCAiT3V0MSIsICJPdXQyIiwgIk91dDMiLCAiRkNPdXQzIiwgIkZDT3V0MiIsCi0gICAgICAgICAgICAgICAgIkZDT3V0MSIsICJGQ0luNiIsICJGQ0luNSIsICJGQ0luNCIsICJGQ0luMyIsICJGQ0luMiIsICJGQ0luMSIsICJGQ0NPdXQzIiwKLSAgICAgICAgICAgICAgICAiRkNDT3V0MiIsICJGQ0NPdXQxIiwgIkNJbjEiLCAiQ0luMiIsICJDSW4zIiwgIkZDQ0luMyIsICJGQ0NJbjIiLCAiRkNDSW4xIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmVyc2lkZUZhaWx1cmVJblNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0U2VydmVyc2lkZUZhaWx1cmVJblNlcnZpY2UiKTsKLQotICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiRWNob09NRWxlbWVudCIsIG51bGwpOwotICAgICAgICBwYXlsb2FkLnNldFRleHQoRmF1bHRUaHJvd2luZ1NlcnZpY2UuVEhST1dfRkFVTFRfQVNfQVhJU19GQVVMVCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRDbGllbnQoZmFpbGluZ1NlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpLCBmYWlsaW5nT3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlbmRlci5nZXRPcHRpb25zKCkuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KHRydWUpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIHNlbmRlci5nZXRBeGlzU2VydmljZSgpLmdldE9wZXJhdGlvbihTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ0luMSIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDSW4yIikpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNJbjMiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MSIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MiIpKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cnl7Ci0gICAgICAgIAlzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIAlmYWlsKCJFeHBlY3RpbmcgZXhjZXB0aW9uIHRvIGJlIHRocm93bi4iKTsKLSAgICAgICAgfWNhdGNoKEF4aXNGYXVsdCBhZil7Ci0gICAgICAgIAlhc3NlcnRFcXVhbHMoIlRlc3RGYXVsdCIsIGFmLmdldEZhdWx0Q29kZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgCWFzc2VydFRydWUoYWYuZ2V0UmVhc29uKCkuaW5kZXhPZigiRmF1bHRSZWFzb24iKSA+IC0xKTsKLSAgICAgICAgfQotICAgICAgICAvL1RoaXMgb2RkIHBhdHRlcm4gb2YgQ0luIEZDQ0luIENJbiBGQ0NJbiBpcyBjYXVzZWQgYnkgdGhlIEluT3V0QXhpc09wZXJhdGlvbiBhbHdheXMgZXhlY3V0aW5nIHRoZSBpbmZsb3cgcGhhc2VzLCBldmVuIGlmIHRoZXJlIHdhcyBhIGZhdWx0IChhbmQgdGhlbiBleGVjdXRpbmcgdGhlIGluZmF1bGZsb3cpCi0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkNPdXQxIiwgIkNPdXQyIiwgIkNPdXQzIiwgIkluMSIsCi0gICAgICAgICAgICAgICAgIkluMiIsICJJbjMiLCAiSW40IiwgIkluNSIsICJJbjYiLCAiRkNJbjYiLCAiRkNJbjUiLCAiRkNJbjQiLCAiRkNJbjMiLCAiRkNJbjIiLAotICAgICAgICAgICAgICAgICJGQ0luMSIsICJGQ0NPdXQzIiwgIkZDQ091dDIiLCAiRkNDT3V0MSIsICJDSW4xIiwgIkNJbjIiLCAiQ0luMyIsICJGQ0NJbjMiLAotICAgICAgICAgICAgICAgICJGQ0NJbjIiLCAiRkNDSW4xIiwgIkNJbjEiLCAiQ0luMiIsICJDSW4zIiwgIkZDQ0luMyIsICJGQ0NJbjIiLCAiRkNDSW4xIiB9KTsKLSAgICAgICAgLy9UT0RPIDogTmVlZCB0byBmaXggdGhlIHRoaXMgdGVzdCBjYXNlCi0vLyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbkluYm91bmRPcGVyYXRpb25TcGVjaWZpY1BoYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGVzdFNlcnZlcnNpZGVIYW5kbGVyRmFpbHVyZUluSW5ib3VuZE9wZXJhdGlvblNwZWNpZmljUGhhc2UiKTsKLQotICAgICAgICBtaWRkbGVPcGVyYXRpb25JbkhhbmRsZXIuc2hvdWxkRmFpbCh0cnVlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGVDbGllbnQoKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4cGVjdGVkIGhhbmRsZXIgZmFpbHVyZSBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBleHBlY3RlZEV4ZWN1dGlvblN0YXRlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiSW4xIiwgIkluMiIsICJJbjMiLCAiSW40IiwKLSAgICAgICAgICAgICAgICAia2Fib29tIiwgIkZDSW40IiwgIkZDSW4zIiwgIkZDSW4yIiwgIkZDSW4xIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLSAgICAgICAgbWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyLnNob3VsZEZhaWwoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbkluYm91bmRPcGVyYXRpb25TcGVjaWZpY1BoYXNlV2l0aEZpcnN0SGFuZGxlcigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0U2VydmVyc2lkZUhhbmRsZXJGYWlsdXJlSW5PdXRib3VuZFBoYXNlV2l0aEZpcnN0SGFuZGxlciIpOwotICAgICAgICBmaXJzdE9wZXJhdGlvbkluSGFuZGxlci5zaG91bGRGYWlsKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZUNsaWVudCgpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhwZWN0ZWQgaGFuZGxlciBmYWlsdXJlIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJJbjEiLCAiSW4yIiwgIkluMyIsICJrYWJvb20iLCAiRkNJbjMiLCAiRkNJbjIiLCAiRkNJbjEiIH0pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotICAgICAgICBmaXJzdE9wZXJhdGlvbkluSGFuZGxlci5zaG91bGRGYWlsKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmVyc2lkZUhhbmRsZXJGYWlsdXJlSW5JbmJvdW5kR2xvYmFsUGhhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0U2VydmVyc2lkZUhhbmRsZXJGYWlsdXJlSW5HbG9iYWxQaGFzZSIpOwotCi0gICAgICAgIG1pZGRsZUdsb2JhbEluSGFuZGxlci5zaG91bGRGYWlsKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZUNsaWVudCgpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhwZWN0ZWQgaGFuZGxlciBmYWlsdXJlIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IkluMSIsICJrYWJvb20iLCJGQ0luMSJ9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLSAgICAgICAgbWlkZGxlR2xvYmFsSW5IYW5kbGVyLnNob3VsZEZhaWwoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJzaWRlSGFuZGxlckZhaWx1cmVJbk91dGJvdW5kUGhhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0U2VydmVyc2lkZUhhbmRsZXJGYWlsdXJlSW5PdXRib3VuZFBoYXNlIik7Ci0KLSAgICAgICAgbWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlci5zaG91bGRGYWlsKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZUNsaWVudCgpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhwZWN0ZWQgaGFuZGxlciBmYWlsdXJlIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJJbjEiLCAiSW4yIiwgIkluMyIsICJJbjQiLAotICAgICAgICAgICAgICAgICJJbjUiLCAiSW42IiwgIk91dDEiLCAia2Fib29tIiwgIkZDT3V0MSIsICJGQ0luNiIsICJGQ0luNSIsICJGQ0luNCIsICJGQ0luMyIsCi0gICAgICAgICAgICAgICAgIkZDSW4yIiwgIkZDSW4xIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLSAgICAgICAgbWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlci5zaG91bGRGYWlsKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50c2lkZUhhbmRsZXJGYWlsdXJlSW5PdXRib3VuZFBoYXNlV2l0aEZpcnN0SGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RDbGllbnRzaWRlSGFuZGxlckZhaWx1cmVJbk91dGJvdW5kUGhhc2VXaXRoRmlyc3RIYW5kbGVyIik7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBjcmVhdGVDbGllbnQoKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICBBcnJheUxpc3Qgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UGhhc2VzT3V0RmxvdyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2Ugb3BlcmF0aW9uU3BlY2lmaWNQaGFzZSA9IChQaGFzZSlwaGFzZUxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04KLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIC8vcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDT3V0MSIpKTsKLSAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciBjbGllbnRPdXRib3VuZEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkNPdXQxIik7Ci0gICAgICAgICAgICAgICAgY2xpZW50T3V0Ym91bmRIYW5kbGVyLnNob3VsZEZhaWwodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKGNsaWVudE91dGJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgLy9waGFzZTEuYWRkSGFuZGxlcihjbGllbnRPdXRib3VuZEhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleHBlY3RlZCBoYW5kbGVyIGZhaWx1cmUgZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICB9Ci0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImthYm9vbSIgfSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEV4ZWN1dGlvblN0YXRlLCB0ZXN0UmVzdWx0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsaWVudHNpZGVIYW5kbGVyRmFpbHVyZUluT3V0Ym91bmRQaGFzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRlc3RDbGllbnRzaWRlSGFuZGxlckZhaWx1cmVJbk91dGJvdW5kUGhhc2UiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGNyZWF0ZUNsaWVudCgpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICBzZW5kZXIuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRQaGFzZXNPdXRGbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiQ091dDEiKSk7Ci0gICAgICAgICAgICAgICAgVGVzdEhhbmRsZXIgY2xpZW50T3V0Ym91bmRIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJDT3V0MiIpOwotICAgICAgICAgICAgICAgIGNsaWVudE91dGJvdW5kSGFuZGxlci5zaG91bGRGYWlsKHRydWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihjbGllbnRPdXRib3VuZEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNPdXQzIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleHBlY3RlZCBoYW5kbGVyIGZhaWx1cmUgZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICB9Ci0gICAgICAgIExpc3QgZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkNPdXQxIiwgImthYm9vbSIsICJGQ0NPdXQxIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRzaWRlSGFuZGxlckZhaWx1cmVJbkluYm91bmRPcGVyYXRpb25TcGVjaWZpY1BoYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGVzdENsaWVudHNpZGVIYW5kbGVyRmFpbHVyZUluSW5ib3VuZE9wZXJhdGlvblNwZWNpZmljIik7Ci0KLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBjcmVhdGVDbGllbnQoKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmdldEF4aXNTZXJ2aWNlKCkuZ2V0T3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICBBcnJheUxpc3Qgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlTGlzdCA9IG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJDSW4xIikpOwotICAgICAgICAgICAgICAgIFRlc3RIYW5kbGVyIGNsaWVudE91dGJvdW5kSGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigiQ0luMiIpOwotICAgICAgICAgICAgICAgIGNsaWVudE91dGJvdW5kSGFuZGxlci5zaG91bGRGYWlsKHRydWUpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihjbGllbnRPdXRib3VuZEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoIkNJbjMiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4cGVjdGVkIGhhbmRsZXIgZmFpbHVyZSBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJJbjEiLCAiSW4yIiwgIkluMyIsICJJbjQiLAotICAgICAgICAgICAgICAgICJJbjUiLCAiSW42IiwgIk91dDEiLCAiT3V0MiIsICJPdXQzIiwgIkZDT3V0MyIsICJGQ091dDIiLCAiRkNPdXQxIiwgIkZDSW42IiwKLSAgICAgICAgICAgICAgICAiRkNJbjUiLCAiRkNJbjQiLCAiRkNJbjMiLCAiRkNJbjIiLCAiRkNJbjEiLCAiQ0luMSIsICJrYWJvb20iLCAiRkNDSW4xIiB9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUsIHRlc3RSZXN1bHRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFRlc3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlck5hbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRGYWlsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUGF1c2U7Ci0KLSAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyKFN0cmluZyBoYW5kbGVyTmFtZSkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvdWxkRmFpbChib29sZWFuIGZhaWwpIHsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkRmFpbCA9IGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzaG91bGRQYXVzZShib29sZWFuIHBhdXNlKSB7Ci0gICAgICAgICAgICB0aGlzLnNob3VsZFBhdXNlID0gcGF1c2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEhhbmRsZXIgIiArIGhhbmRsZXJOYW1lICsgIiBpbnZva2VkIik7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkRmFpbCkgewotICAgICAgICAgICAgICAgIHRlc3RSZXN1bHRzLmFkZCgia2Fib29tIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIYW5kbGVyIHdlbnQga2Fib29tIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSGFuZGxlciBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlc3RSZXN1bHRzLmFkZChoYW5kbGVyTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZmxvd0NvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEhhbmRsZXIgIiArIGhhbmRsZXJOYW1lICsgIiBjYWxsZWQgZm9yIGZsb3dDb21wbGV0ZSgpIik7Ci0gICAgICAgICAgICB0ZXN0UmVzdWx0cy5hZGQoIkZDIiArIGhhbmRsZXJOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSGFuZGxlckZhaWx1cmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXJGYWlsdXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWI2ZjFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSGFuZGxlckZhaWx1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyRmFpbHVyZVRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSGFuZGxlckZhaWx1cmVUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgSGFuZGxlciBjdWxwcml0ID0gbmV3IEFic3RyYWN0SGFuZGxlcigpIHsKLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KFV0aWxTZXJ2ZXIuRkFJTFVSRV9NRVNTQUdFKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlzdXBlci5zZXRVcCgpOwotICAgIAlBeGlzU2VydmljZSBhcyA9IGRlcGxveUNsYXNzQXNTZXJ2aWNlKEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLmNsYXNzKTsKLSAgICAJQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBhcy5nZXRPcGVyYXRpb24obmV3IFFOYW1lKEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpKTsKLSAgICAJCi0gICAgCUFycmF5TGlzdCBwaGFzZWMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBoYXNlYy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhwaGFzZWMpOwotICAgICAgICBBcnJheUxpc3QgcGhhc2UgPSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2Uuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlMSA9IChQaGFzZSlwaGFzZS5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTi5lcXVhbHMocGhhc2UxLmdldFBoYXNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKGN1bHByaXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVBdFNlcnZlclJlcXVlc3RGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotICAgICAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZUFuZENvbnN1bWUoU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0gICAgICAgICAgICBmYWlsKCJ0aGUgdGVzdCBtdXN0IGZhaWwgZHVlIHRvIHRoZSBpbnRlbnRpb25hbCBmYWlsdXJlIG9mIHRoZSBcImN1bHByaXRcIiBoYW5kbGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgobWVzc2FnZS5pbmRleE9mKFV0aWxTZXJ2ZXIuRkFJTFVSRV9NRVNTQUdFKSkgPj0gMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0Q2hhbmdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjE1YjMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VDb250ZXh0Q2hhbmdlVGVzdC5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0aW9uW10ga25vd25MaXN0ID0gewotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZyIsICJsb2ciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgImxvZ0NvcnJlbGF0aW9uSUQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgImxvZ0NvcnJlbGF0aW9uSURTdHJpbmciKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIm15Q2xhc3NOYW1lIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigibG9uZyIsICJzZXJpYWxWZXJzaW9uVUlEIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgIlJFVklTSU9OXzIiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAicmV2aXNpb25JRCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5UaHJlYWRMb2NhbCIsICJjdXJyZW50TWVzc2FnZUNvbnRleHQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zIiwgIm9wdGlvbnMiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAiSU5fRkxPVyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJJTl9GQVVMVF9GTE9XIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgIk9VVF9GTE9XIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgIk9VVF9GQVVMVF9GTE9XIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJSRU1PVEVfQUREUiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiVFJBTlNQT1JUX0FERFIiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgIlRSQU5TUE9SVF9IRUFERVJTIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50cyIsICJhdHRhY2htZW50cyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiVFJBTlNQT1JUX09VVCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiVFJBTlNQT1JUX0lOIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJDSEFSQUNURVJfU0VUX0VOQ09ESU5HIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJVVEZfOCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiVVRGXzE2IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJUUkFOU1BPUlRfU1VDQ0VFRCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJGTE9XIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJUUkFOU1BPUlRfTk9OX0JMT0NLSU5HIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLlN0cmluZyIsICJESVNBQkxFX0FTWU5DX0NBTExCQUNLX09OX1RSQU5TUE9SVF9FUlJPUiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAicHJvY2Vzc2luZ0ZhdWx0IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJwYXVzZWQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgIm91dHB1dFdyaXR0ZW4iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgIm5ld1RocmVhZFJlcXVpcmVkIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJpc1NPQVAxMSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEudXRpbC5BcnJheUxpc3QiLCAiZXhlY3V0aW9uQ2hhaW4iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLnV0aWwuTGlua2VkTGlzdCIsICJleGVjdXRlZFBoYXNlcyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAiZG9pbmdSRVNUIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJkb2luZ01UT00iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgImRvaW5nU3dBIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZSIsICJheGlzTWVzc2FnZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIsICJheGlzT3BlcmF0aW9uIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIsICJheGlzU2VydmljZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXhpc1NlcnZpY2VHcm91cCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbkNvbnRleHQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAiY3VycmVudEhhbmRsZXJJbmRleCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImludCIsICJjdXJyZW50UGhhc2VJbmRleCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUiLCAiZW52ZWxvcGUiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dCIsICJvcGVyYXRpb25Db250ZXh0IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJyZXNwb25zZVdyaXR0ZW4iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgInNlcnZlclNpZGUiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQiLCAic2VydmljZUNvbnRleHQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgInNlcnZpY2VDb250ZXh0SUQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZUdyb3VwQ29udGV4dCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAic2VydmljZUdyb3VwQ29udGV4dElkIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlc3Npb25Db250ZXh0IiwgInNlc3Npb25Db250ZXh0IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0T3V0IiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnRJbiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5TdHJpbmciLCAiaW5jb21pbmdUcmFuc3BvcnROYW1lIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS51dGlsLkxpbmtlZEhhc2hNYXAiLCAic2VsZk1hbmFnZWREYXRhTWFwIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiYm9vbGVhbiIsICJuZWVkc1RvQmVSZWNvbmNpbGVkIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgInNlbGZNYW5hZ2VkRGF0YUhhbmRsZXJDb3VudCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEudXRpbC5BcnJheUxpc3QiLCAic2VsZk1hbmFnZWREYXRhTGlzdEhvbGRlciIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEudXRpbC5BcnJheUxpc3QiLCAibWV0YUV4ZWN1dGlvbkNoYWluIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS51dGlsLkxpbmtlZExpc3QiLCAibWV0YUV4ZWN1dGVkIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiaW50IiwgIm1ldGFIYW5kbGVySW5kZXgiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJpbnQiLCAibWV0YVBoYXNlSW5kZXgiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeSIsICJtZXRhQXhpc09wZXJhdGlvbiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5IiwgIm1ldGFBeGlzU2VydmljZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5IiwgIm1ldGFBeGlzU2VydmljZUdyb3VwIiksCi0gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigib3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnkiLCAibWV0YVRyYW5zcG9ydE91dCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5IiwgIm1ldGFUcmFuc3BvcnRJbiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oIm9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5IiwgIm1ldGFBeGlzTWVzc2FnZSIpLAotICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImJvb2xlYW4iLCAicmVjb25jaWxlQXhpc01lc3NhZ2UiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJib29sZWFuIiwgImV4ZWN1dGVkUGhhc2VzUmVzZXQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuU3RyaW5nIiwgInNlbGZNYW5hZ2VkRGF0YURlbGltaXRlciIpLAotLy8gICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdGlvbigiamF2YS5sYW5nLkNsYXNzIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiY2xhc3Mkb3JnJGFwYWNoZSRheGlzMiRjb250ZXh0JE1lc3NhZ2VDb250ZXh0IiwiY2xhc3MkMCJ9KSwKLS8vICAgICAgICAgICAgbmV3IEZpZWxkRGVzY3JpcHRpb24oImphdmEubGFuZy5DbGFzcyIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImNsYXNzJG9yZyRhcGFjaGUkYXhpczIkY29udGV4dCRTZWxmTWFuYWdlZERhdGFNYW5hZ2VyIiwiY2xhc3MkMSJ9KSwKLSAgICAgICAgICAgIG5ldyBGaWVsZERlc2NyaXB0aW9uKCJqYXZhLmxhbmcuRXhjZXB0aW9uIiwgImZhaWx1cmVSZWFzb24iKSwKLSAgICB9OwotCi0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRDaGFuZ2VUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIG5vQ2hhbmdlID0gdHJ1ZTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIENsYXNzIG1jQ2xhc3MgPSBtYy5nZXRDbGFzcygpOwotCi0gICAgICAgIEZpZWxkIFtdIGZpZWxkcyA9IG1jQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLSAgICAgICAgaW50IG51bWJlckZpZWxkcyA9IGZpZWxkcy5sZW5ndGg7Ci0KLSAgICAgICAgaW50IG51bWJlcktub3duRmllbGRzID0ga25vd25MaXN0Lmxlbmd0aDsKLQotICAgICAgICBpZiAobnVtYmVyS25vd25GaWVsZHMgIT0gbnVtYmVyRmllbGRzKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SOiBudW1iZXIgb2YgYWN0dWFsIGZpZWxkcyBbIiArIG51bWJlckZpZWxkcyArCi0gICAgICAgICAgICAgICAgICAgICJdIGluIE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBudW1iZXIgWyIgKyBudW1iZXJLbm93bkZpZWxkcyArCi0gICAgICAgICAgICAgICAgICAgICJdIik7Ci0gICAgICAgICAgICBub0NoYW5nZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgdGhlIGV4cGVjdGVkIGZpZWxkcyB3aXRoIHRoZSBhY3R1YWwgZmllbGRzCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJLbm93bkZpZWxkczsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBzZWUgaWYgdGhpcyBlbnRyeSBpcyBpbiB0aGUgYWN0dWFsIGxpc3QKLSAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0ga25vd25MaXN0W2ldLmdldE5hbWVzKCk7Ci0gICAgICAgICAgICBGaWVsZCBhY3R1YWxGaWVsZCA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgYWN0dWFsRmllbGQgPT0gbnVsbCAmJiBqIDwgbmFtZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzW2pdOwotICAgICAgICAgICAgICAgIGFjdHVhbEZpZWxkID0gZmluZEZpZWxkKGZpZWxkcywgbmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhY3R1YWxGaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJFUlJPUjogIE1lc3NhZ2VDb250ZXh0IGlzIG1pc3NpbmcgZmllbGQgWyIgKyBBcnJheXMuYXNMaXN0KG5hbWVzKSArICJdIik7Ci0gICAgICAgICAgICAgICAgbm9DaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtub3duVHlwZSA9IGtub3duTGlzdFtpXS5nZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFjdHVhbFR5cGUgPSBhY3R1YWxGaWVsZC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFrbm93blR5cGUuZXF1YWxzKGFjdHVhbFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRVJST1I6ICBNZXNzYWdlQ29udGV4dCBmaWVsZCBbIiArIEFycmF5cy5hc0xpc3QobmFtZXMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSBleHBlY3RlZCB0eXBlIFsiICsga25vd25UeXBlICsgIl0gZG9lcyBub3QgbWF0Y2ggYWN0dWFsIHR5cGUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFR5cGUgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBub0NoYW5nZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5leHQsIGNoZWNrIHRoZSBhY3R1YWwgZmllbGRzIHdpdGggdGhlIHByZWRlZmluZWQsIGtub3duIGZpZWxkcwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtYmVyRmllbGRzOyBqKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGZpZWxkc1tqXS50b1N0cmluZygpOwotCi0gICAgICAgICAgICAvLyBzZWUgaWYgdGhpcyBlbnRyeSBpcyBpbiB0aGUgcHJlZGVmaW5lZCBsaXN0Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpZWxkc1tqXS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRpb24gZmQgPSBmaW5kRmllbGREZXNjcmlwdGlvbihuYW1lKTsKLQotICAgICAgICAgICAgaWYgKGZkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVSUk9SOiAgTWVzc2FnZUNvbnRleHQgaGFzIG5ldyBmaWVsZCBbIiArIGRlc2NyaXB0aW9uICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdIHRoYXQgbmVlZHMgdG8gYmUgYXNzZXNzZWQgZm9yIG1lc3NhZ2UgY29udGV4dCBzYXZlL3Jlc3RvcmUgZnVuY3Rpb25zIik7Ci0gICAgICAgICAgICAgICAgbm9DaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtub3duVHlwZSA9IGZkLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsVHlwZSA9IGZpZWxkc1tqXS5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFrbm93blR5cGUuZXF1YWxzKGFjdHVhbFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRVJST1I6ICBNZXNzYWdlQ29udGV4dCBmaWVsZCBbIiArIG5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIGV4cGVjdGVkIHR5cGUgWyIgKyBrbm93blR5cGUgKyAiXSBkb2VzIG5vdCBtYXRjaCBhY3R1YWwgdHlwZSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVHlwZSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgIG5vQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKG5vQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkIGZpbmRGaWVsZChGaWVsZFtdIGZpZWxkcywgU3RyaW5nIG5hbWUpIHsKLQotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZmluZEZpZWxkOiAgbG9va2luZyBmb3IgWyIrbmFtZSsiXSIpOwotCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZmllbGRzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gZmllbGRzW2tdLmdldE5hbWUoKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJmaWVsZE5hbWVbIitrKyJdID0gIFsiK2ZpZWxkTmFtZSsiXSIpOwotCi0gICAgICAgICAgICBpZiAoZmllbGROYW1lLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHNba107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0aW9uIGZpbmRGaWVsZERlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwga25vd25MaXN0Lmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWVsZE5hbWUgPSBrbm93bkxpc3Rba10uZ2V0TmFtZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGROYW1lLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkTmFtZVtpXS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtub3duTGlzdFtrXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIEZpZWxkRGVzY3JpcHRpb24gewotICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1tdIG5hbWUgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0aW9uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3IKLSAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRpb24oU3RyaW5nIHQsIFN0cmluZyBuKSB7Ci0gICAgICAgICAgICB0eXBlID0gdDsKLSAgICAgICAgICAgIG5hbWUgPSBuZXcgU3RyaW5nW117bn07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvcgotICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdGlvbihTdHJpbmcgdCwgU3RyaW5nW10gbikgewotICAgICAgICAgICAgdHlwZSA9IHQ7Ci0gICAgICAgICAgICBuYW1lID0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0KSB7Ci0gICAgICAgICAgICB0eXBlID0gdDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNhdmVBVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNhdmVBVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2IwYzU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTYXZlQVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dFNhdmVBVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlQ29udGV4dFNhdmVBVGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJUZXN0U2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiT3BlcmF0aW9uXzEiKTsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTEgPSBudWxsOwotICAgIHByaXZhdGUgUGhhc2UgcGhhc2UyID0gbnVsbDsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlMyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTQgPSBudWxsOwotICAgIHByaXZhdGUgUGhhc2UgcGhhc2U1ID0gbnVsbDsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlNiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTcgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYzIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXhlY3V0ZWRIYW5kbGVycyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRTYXZlQVRlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByZXBhcmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6Y29uc3RydWN0b3I6ICBlcnJvciBpbiBzZXR0aW5nIHVwIG9iamVjdCBncmFwaCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8KLSAgICAvLyBwcmVwYXJlIHRoZSBvYmplY3QgaGllcmFyY2h5IGZvciB0ZXN0aW5nCi0gICAgLy8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwgbmV3IFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgYWJkID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBydWQgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIHNtYmQgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNtYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHJ1ZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNtYmQpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBheGlzU2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBheGlzU2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoIlNlcnZpY2VHcm91cFRlc3QiKTsKLQotCi0gICAgICAgIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotCi0gICAgICAgIGF4aXNPcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpLCBheGlzT3BlcmF0aW9uKTsKLQotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dC4KLSAgICAgICAgICAgICAgICBjcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoIlNlcnZpY2VHcm91cENvbnRleHRUZXN0Iik7Ci0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDIgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImhhcHB5Iik7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDMgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImdvbHVja3kiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydE91dDIuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0My5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Myk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQyKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4yID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oImFsd2F5cyIpOwotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMyA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJ0aGViZXN0Iik7Ci0gICAgICAgIHRyYW5zcG9ydEluLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbjIuc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMy5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4yKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBtYyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgbWMuc2V0U2VydmVyU2lkZSh0cnVlKTsKLS8vICAgICAgICBtYy5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBTeXN0ZW0ub3V0KTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBvbUZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUob21GYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotCi0gICAgICAgIHBoYXNlMSA9IG5ldyBQaGFzZSgiYmVnaW5QaGFzZTEiKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDQpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDUpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDYpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDcpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDgpKTsKLSAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDkpKTsKLQotICAgICAgICBwaGFzZTIgPSBuZXcgUGhhc2UoIm1pZGRsZVBoYXNlMiIpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTApKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDExKSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxMikpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTMpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE0KSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxNSwgdHJ1ZSkpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTYpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDE3KSk7Ci0gICAgICAgIHBoYXNlMi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxOCkpOwotCi0gICAgICAgIHBoYXNlMyA9IG5ldyBQaGFzZSgibGFzdFBoYXNlMyIpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMTkpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIwKSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyMSkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjIpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDIzKSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyNCkpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMjUpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI2KSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyNykpOwotCi0gICAgICAgIHBoYXNlNCA9IG5ldyBQaGFzZSgiZXh0cmFQaGFzZTEiKTsKLSAgICAgICAgcGhhc2U0LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDI4KSk7Ci0gICAgICAgIHBoYXNlNC5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyOSkpOwotCi0gICAgICAgIHBoYXNlNSA9IG5ldyBQaGFzZSgiZXh0cmFQaGFzZTIiKTsKLSAgICAgICAgcGhhc2U1LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMwKSk7Ci0KLSAgICAgICAgcGhhc2U2ID0gbmV3IFBoYXNlKCJleHRyYVBoYXNlMyIpOwotICAgICAgICBwaGFzZTYuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMzEsIHRydWUpKTsKLSAgICAgICAgcGhhc2U2LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMyKSk7Ci0KLSAgICAgICAgcGhhc2U3ID0gbmV3IFBoYXNlKCJleHRyYVBoYXNlNCIpOwotICAgICAgICBwaGFzZTcuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMzMpKTsKLSAgICAgICAgcGhhc2U3LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDM0KSk7Ci0gICAgICAgIHBoYXNlNy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzNSkpOwotCi0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMSk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMik7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMyk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlNCk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlNSk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlNik7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlNyk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzLmFkZChwaGFzZTEpOwotICAgICAgICBwaGFzZXMuYWRkKHBoYXNlMik7Ci0gICAgICAgIHBoYXNlcy5hZGQocGhhc2UzKTsKLSAgICAgICAgcGhhc2VzLmFkZChwaGFzZTQpOwotICAgICAgICBwaGFzZXMuYWRkKHBoYXNlNSk7Ci0gICAgICAgIHBoYXNlcy5hZGQocGhhc2U2KTsKLSAgICAgICAgcGhhc2VzLmFkZChwaGFzZTcpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2gocGhhc2VzKTsKLQotICAgICAgICBtYy5zZXRXU0FBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG1jLnNldFNvYXBBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotCi0gICAgICAgIG1jLnNldE1lc3NhZ2VJRChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0KLSAgICAgICAgLy9vcGVyYXRpb25Db250ZXh0LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsgIGdldHMgZG9uZSB2aWEgdGhlIHJlZ2lzdGVyCi0gICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1jLCBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgbWMuc2V0T3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgbWMuc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotCi0gICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgIGF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIG1jLnNldEF4aXNNZXNzYWdlKGF4aXNNZXNzYWdlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgZXhlY3V0ZWRIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDp0ZXN0UmVjZWl2ZSgpOiBzdGFydCAtIC0gZW5naW5lLnJlY2VpdmUobWMpIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLQotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RSZWNlaXZlKCk6IHJlc3VtZSAtIC0gZW5naW5lLnJlc3VtZShtYykgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBBeGlzRW5naW5lLnJlc3VtZShtYyk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBleGVjdXRlZEhhbmRsZXJzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxNTsgaSA8IDMwOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKEludGVnZXIpIGV4ZWN1dGVkSGFuZGxlcnMuZ2V0KGkpKS5pbnRWYWx1ZSgpLCBpICsgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIHBoYXNlIGxpc3RzIGFuZCBzZWUgaWYgdGhleSBtYXRjaCB1cAotICAgICAgICBBcnJheUxpc3QgcmVzdG9yZWRQaGFzZXMgPSBtYzIuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgaW50IGl0X2NvdW50ID0gMDsKLQotICAgICAgICBJdGVyYXRvciBpdCA9IHJlc3RvcmVkUGhhc2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIHdlIGtub3cgZXZlcnl0aGluZyBhdCB0aGlzIGxldmVsIGlzIGEgUGhhc2UuICAKLSAgICAgICAgICAgIC8vIGlmIHlvdSBjaGFuZ2UgaXQsIHlvdSBtaWdodCBnZXQgYSBDbGFzc0Nhc3RFeGNlcHRpb24gCi0gICAgICAgICAgICBQaGFzZSByZXN0b3JlZF9waGFzZSA9IChQaGFzZSkgaXQubmV4dCgpOwotCi0gICAgICAgICAgICBQaGFzZSBvcmlnaW5hbF9waGFzZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIGl0X2NvdW50Kys7Ci0KLSAgICAgICAgICAgIGlmIChpdF9jb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDIpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gMykgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2UzOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSA0KSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDUpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gNikgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U2OwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBpc09rID0gY29tcGFyZVBoYXNlcyhyZXN0b3JlZF9waGFzZSwgb3JpZ2luYWxfcGhhc2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09rKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2Vjb25kIHJlc3VtZSB0byBzdGFydCB0aGUgc2Vjb25kIHBhdXNlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDp0ZXN0UmVjZWl2ZSgpOiByZXN1bWUgLSAtIGVuZ2luZS5yZXN1bWUobWMpIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUobWMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygzNSwgZXhlY3V0ZWRIYW5kbGVycy5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMzE7IGkgPCAzNTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoKChJbnRlZ2VyKSBleGVjdXRlZEhhbmRsZXJzLmdldChpKSkuaW50VmFsdWUoKSwgaSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBwaGFzZSBsaXN0cyBhbmQgc2VlIGlmIHRoZXkgbWF0Y2ggdXAKLSAgICAgICAgcmVzdG9yZWRQaGFzZXMgPSBtYzIuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgaXRfY291bnQgPSAwOwotCi0gICAgICAgIGl0ID0gcmVzdG9yZWRQaGFzZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgLy8gd2Uga25vdyBldmVyeXRoaW5nIGF0IHRoaXMgbGV2ZWwgaXMgYSBQaGFzZS4gIAotICAgICAgICAgICAgLy8gaWYgeW91IGNoYW5nZSBpdCwgeW91IG1pZ2h0IGdldCBhIENsYXNzQ2FzdEV4Y2VwdGlvbiAKLSAgICAgICAgICAgIFBoYXNlIHJlc3RvcmVkX3BoYXNlID0gKFBoYXNlKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFBoYXNlIG9yaWdpbmFsX3BoYXNlID0gbnVsbDsKLQotICAgICAgICAgICAgaXRfY291bnQrKzsKLQotICAgICAgICAgICAgaWYgKGl0X2NvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gMikgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2UyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDQpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRfY291bnQgPT0gNSkgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U1OwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTY7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDcpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdW5leHBlY3RlZAotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIGlzT2sgPSBjb21wYXJlUGhhc2VzKHJlc3RvcmVkX3BoYXNlLCBvcmlnaW5hbF9waGFzZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2spOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG8gVGhlIGhhbmRsZXIgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGVyLAotICAgICAqICAgICAgICAgLTEgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0SGFuZGxlcklEKE9iamVjdCBvKSB7Ci0gICAgICAgIGludCBpZCA9IC0xOwotCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGVtcEhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlkID0gKChUZW1wSGFuZGxlcikgbykuZ2V0SGFuZGxlcklEKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgaGFuZGxlciBvYmplY3RzIHRvIHNlZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG8xIFRoZSBmaXJzdCBoYW5kbGVyCi0gICAgICogQHBhcmFtIG8yIFRoZSBzZWNvbmQgaGFuZGxlcgotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgaGFuZGxlciBvYmplY3RzIGFyZSBlcXVpdmFsZW50LAotICAgICAqICAgICAgICAgRkFMU0Ugb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVIYW5kbGVycyhPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICBpZiAoKG8xID09IG51bGwpICYmIChvMiA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKG8xICE9IG51bGwpICYmIChvMiAhPSBudWxsKSkgewotICAgICAgICAgICAgU3RyaW5nIGMxID0gbzEuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYzIgPSBvMi5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaWYgKGMxLmVxdWFscyhjMikpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBjbGFzcyBbIiArIGMxICsgIl0gbWF0Y2ggIik7Ci0KLSAgICAgICAgICAgICAgICBpbnQgaWQxID0gZ2V0SGFuZGxlcklEKG8xKTsKLSAgICAgICAgICAgICAgICBpbnQgaWQyID0gZ2V0SGFuZGxlcklEKG8yKTsKLQotICAgICAgICAgICAgICAgIGlmIChpZDEgPT0gaWQyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6OmNvbXBhcmVIYW5kbGVyczogIGlkIFsiICsgaWQxICsgIl0gbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDo6Y29tcGFyZUhhbmRsZXJzOiAgaWQxIFsiICsgaWQxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAhPSBpZDIgWyIgKyBpZDIgKyAiXSAiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDo6Y29tcGFyZUhhbmRsZXJzOiAgY2xhc3MxIFsiICsgYzEgKwotICAgICAgICAgICAgICAgICAgICAgICAgIl0gIT0gY2xhc3MyIFsiICsgYzIgKyAiXSAgICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdHdvIHBoYXNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvMSBUaGUgZmlyc3QgcGhhc2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIG8yIFRoZSBzZWNvbmQgcGhhc2Ugb2JqZWN0Ci0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBwaGFzZXMgYXJlIGVxdWl2YWxlbnQsCi0gICAgICogICAgICAgICBGQUxTRSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZVBoYXNlcyhPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICBpZiAoKG8xID09IG51bGwpICYmIChvMiA9PSBudWxsKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6IGNvbXBhcmVQaGFzZXM6ICBQaGFzZTFbXSA9PSBQaGFzZTJbXSAtIGJvdGggbnVsbCBvYmplY3RzIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoKG8xICE9IG51bGwpICYmIChvMiAhPSBudWxsKSkKLSAgICAgICAgICAgICAgICAmJiAoKG8xIGluc3RhbmNlb2YgUGhhc2UpICYmIChvMiBpbnN0YW5jZW9mIFBoYXNlKSkKLSAgICAgICAgICAgICAgICApIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBQaGFzZSBwMSA9IChQaGFzZSkgbzE7Ci0gICAgICAgICAgICAgICAgUGhhc2UgcDIgPSAoUGhhc2UpIG8yOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUxID0gcDEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lMiA9IHAyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIExpc3QgbGlzdDEgPSBwMS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgIExpc3QgbGlzdDIgPSBwMi5nZXRIYW5kbGVycygpOwotCi0gICAgICAgICAgICAgICAgaWYgKChsaXN0MSA9PSBudWxsKSAmJiAobGlzdDIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogY29tcGFyZVBoYXNlczogIFBoYXNlMVsiICsgbmFtZTEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdID09IFBoYXNlMlsiICsgbmFtZTIgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGxpc3QxICE9IG51bGwpICYmIChsaXN0MiAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZTEgPSBsaXN0MS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplMiA9IGxpc3QyLnNpemUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZTEgIT0gc2l6ZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6IGNvbXBhcmVQaGFzZXM6ICBQaGFzZTFbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUxICsgIl0gIT0gUGhhc2UyWyIgKyBuYW1lMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIC0gbWlzbWF0Y2hlZCBzaXplIG9mIGhhbmRsZXIgbGlzdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTE7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajEgPSBsaXN0MS5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqMiA9IGxpc3QyLmdldChqKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmoxID09IG51bGwpICYmIChvYmoyID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9iajEgIT0gbnVsbCkgJiYgKG9iajIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iajEgaW5zdGFuY2VvZiBQaGFzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGNvbXBhcmVQaGFzZXMob2JqMSwgb2JqMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgPSBjb21wYXJlSGFuZGxlcnMob2JqMSwgb2JqMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OiBjb21wYXJlUGhhc2VzOiAgUGhhc2UxWyIgKyBuYW1lMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAhPSBQaGFzZTJbIiArIG5hbWUyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIC0gbWlzbWF0Y2hlZCBoYW5kbGVyIGxpc3RzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogY29tcGFyZVBoYXNlczogIFBoYXNlMVsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUxICsgIl0gIT0gUGhhc2UyWyIgKyBuYW1lMiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAtIG1pc21hdGNoZWQgaGFuZGxlciBsaXN0cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB0aGUgY29tcGFyaXNvbiBjb21wbGV0ZWQgb2sKLSAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBhIG1hdGNoCi0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogY29tcGFyZVBoYXNlczogIFBoYXNlMVsiICsgbmFtZTEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdID09IFBoYXNlMlsiICsgbmFtZTIgKyAiXSAtIG1hdGNoZWQgaGFuZGxlciBsaXN0cyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHNvbWUgZXJyb3IKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogY29tcGFyZVBoYXNlczogIFBoYXNlMVtdICE9IFBoYXNlMltdIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd01jTWFwKEhhc2hNYXAgbWFwKSB7Ci0gICAgICAgIGlmICgobWFwICE9IG51bGwpICYmICghbWFwLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0TGlzdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRMaXN0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdExpc3QubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWUgPSAoTWVzc2FnZUNvbnRleHQpIG1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVJRCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZUlEID0gdmFsdWUuZ2V0TWVzc2FnZUlEKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDogc2hvd01jTWFwOiAgTWVzc2FnZSBjb250ZXh0ICAgSURbIiArIHZhbHVlSUQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gICBLZXkgTGFiZWwgWyIgKyBrZXkgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6IHNob3dNY01hcDogIE5vIGVudHJpZXMgdG8gZGlzcGxheSBmb3IgbWVzc2FnZSBjb250ZXh0cyB0YWJsZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gdGhpcyBjaGVja3MgdGhlIHNhdmUvcmVzdG9yZSBvZiBhIG1lc3NhZ2UgY29udGV4dCB0aGF0IGhhc24ndCBiZWVuCi0gICAgLy8gdGhyb3VnaCB0aGUgZW5naW5lIHRvIHNpbXVsYXRlIHdoYXQgc29tZSBXUy1STSBpbXBsZW1lbnRhdGlvbnMgCi0gICAgLy8gbmVlZCB0byBkbyAtIG1ha2UgYSBzaW1wbGUgbWVzc2FnZSBjb250ZXh0IGZvciBhIFJNIGFjayBvciBvdGhlcgotICAgIC8vIHNpbXBsZSBtZXNzYWdlCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZU1DKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDp0ZXN0U2ltcGxlTUMoKTogIjsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInN0YXJ0IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBzaW1wbGVNc2cgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRTaW1wbGVNc2cgPSBudWxsOwotCi0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgYm9vbGVhbiBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNvbXBhcmVzT2sgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIlNpbXBsZSIsIG51bGwpOwotICAgICAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChzaW1wbGVNc2cpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKyBmaWxlc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzYXZlZE1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgYSBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkU2ltcGxlTXNnID0gKE1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRTaW1wbGVNc2cuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5yZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29tcGFyZSB0byBvcmlnaW5hbCBleGVjdXRpb24gY2hhaW4KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgcmVzdG9yZWRfZXhlY0NoYWluID0gcmVzdG9yZWRTaW1wbGVNc2cuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Qgb3JpZ19leGVjQ2hhaW4gPSBzaW1wbGVNc2cuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLQotICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZhdGVVdGlscy5pc0VxdWl2YWxlbnQocmVzdG9yZWRfZXhlY0NoYWluLCBvcmlnX2V4ZWNDaGFpbiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRpb24gY2hhaW4gZXF1aXZhbGVuY3kgWyIgKyBjb21wYXJlc09rICsgIl0iKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVzT2spOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZXhlY3V0ZWQgbGlzdAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHJlc3RvcmVkX2V4ZWN1dGVkX2l0ID0gcmVzdG9yZWRTaW1wbGVNc2cuZ2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBvcmlnX2V4ZWN1dGVkX2l0ID0gc2ltcGxlTXNnLmdldEV4ZWN1dGVkUGhhc2VzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXN0b3JlZF9leGVjdXRlZF9pdCAhPSBudWxsKSAmJiAob3JpZ19leGVjdXRlZF9pdCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzdG9yZWRfZXhlY3V0ZWRfaXQuaGFzTmV4dCgpICYmIG9yaWdfZXhlY3V0ZWRfaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcDEgPSByZXN0b3JlZF9leGVjdXRlZF9pdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcDIgPSBvcmlnX2V4ZWN1dGVkX2l0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IGNvbXBhcmVQaGFzZXMocDEsIHAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRlZCBwaGFzZSBsaXN0OiAgY29tcGFyZSBwaGFzZXMgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBwcm9ibGVtIHdpdGggdGhlIGV4ZWN1dGVkIGxpc3RzCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3Igd2l0aCBzYXZpbmcgbWVzc2FnZSBjb250ZXh0ID0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRNZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG1lc3NhZ2UgY29udGV4dCBzdWNjZWVkZWQsCi0gICAgICAgICAgICAvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZAotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWRNZXNzYWdlQ29udGV4dCAmJiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ICYmIGNvbXBhcmVzT2s7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlbmQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgIH0KLQotCi0gICAgLy8gdGhpcyBjaGVja3MgdGhlIHNhdmUvcmVzdG9yZSBvZiBhIG1lc3NhZ2UgY29udGV4dCB0aGF0IGhhcwotICAgIC8vIHNvbWUgcHJvcGVydGllcyBzZXQKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWNQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDp0ZXN0TWNQcm9wZXJ0aWVzKCk6ICI7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzdGFydCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgc2ltcGxlTXNnID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3RvcmVkU2ltcGxlTXNnID0gbnVsbDsKLQotICAgICAgICBzaW1wbGVNc2cuc2V0UHJvcGVydHkoImtleTEiLCAidmFsdWUxIik7Ci0gICAgICAgIHNpbXBsZU1zZy5zZXRQcm9wZXJ0eSgia2V5MiIsIG51bGwpOwotICAgICAgICBzaW1wbGVNc2cuc2V0UHJvcGVydHkoImtleTMiLCBuZXcgSW50ZWdlcigzKSk7Ci0gICAgICAgIHNpbXBsZU1zZy5zZXRQcm9wZXJ0eSgia2V5NCIsIG5ldyBMb25nKDRMKSk7Ci0KLQotICAgICAgICBGaWxlIHRoZUZpbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCi0gICAgICAgIGJvb2xlYW4gcGF1c2UgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNvbXBhcmVzT2sgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIk1jUHJvcHMiLCBudWxsKTsKLSAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3Qoc2ltcGxlTXNnKTsKLQotICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5zYXZlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIl0gICB0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3Igd2l0aCBzYXZpbmcgbWVzc2FnZSBjb250ZXh0ID0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoc2F2ZWRNZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXN0b3JlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAicmVzdG9yaW5nIGEgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLSAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICByZXN0b3JlZFNpbXBsZU1zZyA9IChNZXNzYWdlQ29udGV4dCkgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkU2ltcGxlTXNnLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdG8gb3JpZ2luYWwgZXhlY3V0aW9uIGNoYWluCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHJlc3RvcmVkX2V4ZWNDaGFpbiA9IHJlc3RvcmVkU2ltcGxlTXNnLmdldEV4ZWN1dGlvbkNoYWluKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IG9yaWdfZXhlY0NoYWluID0gc2ltcGxlTXNnLmdldEV4ZWN1dGlvbkNoYWluKCk7Ci0KLSAgICAgICAgICAgICAgICBjb21wYXJlc09rID0KLSAgICAgICAgICAgICAgICAgICAgQWN0aXZhdGVVdGlscy5pc0VxdWl2YWxlbnQocmVzdG9yZWRfZXhlY0NoYWluLCBvcmlnX2V4ZWNDaGFpbiwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRpb24gY2hhaW4gZXF1aXZhbGVuY3kgWyIgKyBjb21wYXJlc09rICsgIl0iKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVzT2spOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZXhlY3V0ZWQgbGlzdAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHJlc3RvcmVkX2V4ZWN1dGVkX2l0ID0gcmVzdG9yZWRTaW1wbGVNc2cuZ2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBvcmlnX2V4ZWN1dGVkX2l0ID0gc2ltcGxlTXNnLmdldEV4ZWN1dGVkUGhhc2VzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXN0b3JlZF9leGVjdXRlZF9pdCAhPSBudWxsKSAmJiAob3JpZ19leGVjdXRlZF9pdCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVzdG9yZWRfZXhlY3V0ZWRfaXQuaGFzTmV4dCgpICYmIG9yaWdfZXhlY3V0ZWRfaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcDEgPSByZXN0b3JlZF9leGVjdXRlZF9pdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcDIgPSBvcmlnX2V4ZWN1dGVkX2l0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IGNvbXBhcmVQaGFzZXMocDEsIHAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRlZCBwaGFzZSBsaXN0OiAgY29tcGFyZSBwaGFzZXMgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBwcm9ibGVtIHdpdGggdGhlIGV4ZWN1dGVkIGxpc3RzCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlMSA9IChTdHJpbmcpIHJlc3RvcmVkU2ltcGxlTXNnLmdldFByb3BlcnR5KCJrZXkxIik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlMiA9IHJlc3RvcmVkU2ltcGxlTXNnLmdldFByb3BlcnR5KCJrZXkyIik7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciB2YWx1ZTMgPSAoSW50ZWdlcikgcmVzdG9yZWRTaW1wbGVNc2cuZ2V0UHJvcGVydHkoImtleTMiKTsKLSAgICAgICAgICAgICAgICBMb25nIHZhbHVlNCA9IChMb25nKSByZXN0b3JlZFNpbXBsZU1zZy5nZXRQcm9wZXJ0eSgia2V5NCIpOwotCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCB2YWx1ZTEpOwotICAgICAgICAgICAgICAgIGFzc2VydE51bGwodmFsdWUyKTsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICgodmFsdWUzICE9IG51bGwpICYmIHZhbHVlMy5lcXVhbHMobmV3IEludGVnZXIoMykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2spOwotCi0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZTQgIT0gbnVsbCkgJiYgdmFsdWU0LmVxdWFscyhuZXcgTG9uZyg0TCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGlzT2spOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHJlc3RvcmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZE1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IHN1Y2NlZWRlZCwKLSAgICAgICAgICAgIC8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0gICAgICAgICAgICBib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZE1lc3NhZ2VDb250ZXh0ICYmIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgJiYgY29tcGFyZXNPazsKLSAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVuZCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNhdmVBVGVzdDp0ZXN0TWFwcGluZygpOiAiOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic3RhcnQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3RvcmVkTUMgPSBudWxsOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gY29udGV4dCBtZXNzYWdlQ29udGV4dHMgdGFibGUgCi0gICAgICAgIC8vIGhhcyBhbiBlbnRyeSBmb3IgdGhlIG1lc3NhZ2UgY29udGV4dCB0aGF0IHdlIHdvcmtpbmcgd2l0aAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBsb29rIGF0IHRoZSBPcGVyYXRpb25Db250ZXh0IG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICBIYXNoTWFwIG1jTWFwMSA9IG1jLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dHMoKTsKLQotICAgICAgICBpZiAoKG1jTWFwMSA9PSBudWxsKSB8fCAobWNNYXAxLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIG1jLmdldEF4aXNPcGVyYXRpb24oKS5hZGRNZXNzYWdlQ29udGV4dChtYywgbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyB1cGRhdGUgdGhlIHRhYmxlCi0gICAgICAgIG1jTWFwMSA9IG1jLmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRNZXNzYWdlQ29udGV4dHMoKTsKLQotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLSAtIC0gLSAtIG9yaWdpbmFsIG1lc3NhZ2UgY29udGV4dHMgdGFibGUtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgc2hvd01jTWFwKG1jTWFwMSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2F2ZSBhbmQgcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgRmlsZSB0aGVGaWxlOwotICAgICAgICBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCi0gICAgICAgIGJvb2xlYW4gcGF1c2UgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGNvbXBhcmVzT2sgPSBmYWxzZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIk1jTWFwcGluZ3MiLCBudWxsKTsKLSAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIHRoZUZpbGUgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUgCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QobWMpOwotCi0gICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIgKyBmaWxlc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIGV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzYXZlZE1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgYSBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkTUMgPSAoTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICByZXN0b3JlZE1DLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgdGFibGUgYWZ0ZXIgdGhlIHJlc3RvcmUKLSAgICAgICAgICAgICAgICBIYXNoTWFwIG1jTWFwMiA9IHJlc3RvcmVkTUMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0cygpOwotCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2F2ZUFUZXN0OnRlc3RNYXBwaW5nKCk6IC0gLSAtIC0gLSByZXN0b3JlZCBtZXNzYWdlIGNvbnRleHRzIHRhYmxlLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgICAgICAgICAgICAgc2hvd01jTWFwKG1jTWFwMik7Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIG9rTWFwID0gY29tcGFyZU1DTWFwcyhtY01hcDEsIG1jTWFwMik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShva01hcCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggcmVzdG9yaW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBtZXNzYWdlIGNvbnRleHQgc3VjY2VlZGVkLAotICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkTWVzc2FnZUNvbnRleHQgJiYgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCAmJiBjb21wYXJlc09rOwotICAgICAgICAgICAgaWYgKHJlbW92ZVRtcEZpbGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZW5kIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVNQ01hcHMoSGFzaE1hcCBtMSwgSGFzaE1hcCBtMikgewotICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTYXZlQVRlc3Q6Y29tcGFyZU1DTWFwcygpOiAiOwotCi0gICAgICAgIGlmICgobTEgIT0gbnVsbCkgJiYgKG0yICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZTEgPSBtMS5zaXplKCk7Ci0gICAgICAgICAgICBpbnQgc2l6ZTIgPSBtMi5zaXplKCk7Ci0KLSAgICAgICAgICAgIGlmIChzaXplMSAhPSBzaXplMikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJNSVNNQVRDSDogIG1hcDEgc2l6ZSBbIiArIHNpemUxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdICAhPSAgIG1hcDIgc2l6ZSBbIiArIHNpemUyICsgIl0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBpZDEgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGlkMiA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBrZXlzLCBvcmRlcmluZyBpcyBub3QgaW1wb3J0YW50IGJldHdlZW4gdGhlIHR3byBtYXBzCi0gICAgICAgICAgICBJdGVyYXRvciBpdDEgPSBtMS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkxID0gKFN0cmluZykgaXQxLm5leHQoKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCB2YWx1ZTEgPSAoTWVzc2FnZUNvbnRleHQpIG0xLmdldChrZXkxKTsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZTEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZDEgPSB2YWx1ZTEuZ2V0TWVzc2FnZUlEKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWUyID0gKE1lc3NhZ2VDb250ZXh0KSBtMi5nZXQoa2V5MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZDIgPSB2YWx1ZTIuZ2V0TWVzc2FnZUlEKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JU01BVENIOiAgbm8gbWVzc2FnZSBjb250ZXh0IGluIG9uZSBvZiB0aGUgdGFibGVzIGZvciBrZXkgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkxICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICgoaWQxICE9IG51bGwpICYmIChpZDIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWQxLmVxdWFscyhpZDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiTUlTTUFUQ0g6ICBtZXNzYWdlSURfMSBbIiArIGlkMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgICE9ICAgIG1lc3NhZ2VJRF8yIFsiICsgaWQyICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBudWxsIHZhbHVlcywgY2FuJ3QgdGVsbAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIk1JU01BVENIOiAgb25lIG9yIG1vcmUgbnVsbCBtZXNzYWdlIElEcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG0xID09IG51bGwpICYmIChtMiA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIk1JU01BVENIOiAgb25lIG9mIHRoZSB0YWJsZXMgaXMgbnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgY2xhc3MgVGVtcEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIEludGVnZXIgaGFuZGxlcklEID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGF1c2UgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVzT2sgPSBmYWxzZTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcigtNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4LCBib29sZWFuIHBhdXNlKSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIHRoaXMucGF1c2UgPSBwYXVzZTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiaGFuZGxlciIgKyBpbmRleCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKGludCBpbmRleCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oImhhbmRsZXIiICsgaW5kZXgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWV0aG9kcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIGludCBnZXRIYW5kbGVySUQoKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlcklEICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcklELmludFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAtNTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiVGVtcEhhbmRsZXJbIiArIGdldEhhbmRsZXJJRCgpICsgIl06aW52b2tlKCk6ICI7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAicGF1c2UgPSBbIiArIHBhdXNlICsgIl0iKTsKLSAgICAgICAgICAgIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHBhdXNlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm1zZ0NvbnRleHQucGF1c2UoKSIpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQucGF1c2UoKTsKLSAgICAgICAgICAgICAgICBwYXVzZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm1jU2F2ZSIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzYXZpbmcgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkTWVzc2FnZUNvbnRleHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHNhdmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXN0b3JlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgYSBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0MiA9IChNZXNzYWdlQ29udGV4dCkgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQyLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdG8gb3JpZ2luYWwgZXhlY3V0aW9uIGNoYWluCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgcmVzdG9yZWRfZXhlY0NoYWluID0gbXNnQ29udGV4dDIuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBvcmlnX2V4ZWNDaGFpbiA9IG1zZ0NvbnRleHQuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IEFjdGl2YXRlVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzRXF1aXZhbGVudChyZXN0b3JlZF9leGVjQ2hhaW4sIG9yaWdfZXhlY0NoYWluLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXhlY3V0aW9uIGNoYWluIGVxdWl2YWxlbmN5IFsiICsgY29tcGFyZXNPayArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVzT2spOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBleGVjdXRlZCBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciByZXN0b3JlZF9leGVjdXRlZF9pdCA9IG1zZ0NvbnRleHQyLmdldEV4ZWN1dGVkUGhhc2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBvcmlnX2V4ZWN1dGVkX2l0ID0gbXNnQ29udGV4dC5nZXRFeGVjdXRlZFBoYXNlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXN0b3JlZF9leGVjdXRlZF9pdCAhPSBudWxsKSAmJiAob3JpZ19leGVjdXRlZF9pdCAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXN0b3JlZF9leGVjdXRlZF9pdC5oYXNOZXh0KCkgJiYgb3JpZ19leGVjdXRlZF9pdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHAxID0gcmVzdG9yZWRfZXhlY3V0ZWRfaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcDIgPSBvcmlnX2V4ZWN1dGVkX2l0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rID0gY29tcGFyZVBoYXNlcyhwMSwgcDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGVjdXRlZCBwaGFzZSBsaXN0OiAgY29tcGFyZSBwaGFzZXMgWyIgKyBjb21wYXJlc09rICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVzT2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmxlbSB3aXRoIHRoZSBleGVjdXRlZCBsaXN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgcHV0IHRoZSByZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQgaW4gdGhlIGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWFibGUgZm9yIHRoZSB0ZXN0IAotICAgICAgICAgICAgICAgICAgICAgICAgbWMyID0gbXNnQ29udGV4dDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG1lc3NhZ2UgY29udGV4dCBzdWNjZWVkZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCAmJiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ICYmIGNvbXBhcmVzT2s7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVUbXBGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJleGVjdXRlZEhhbmRsZXJzLmFkZCgiICsgaGFuZGxlcklEICsgIikiKTsKLSAgICAgICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChoYW5kbGVySUQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZWQzZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFNhdmVCVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5BY3RpdmF0ZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dFNhdmVCVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlQ29udGV4dFNhdmVCVGVzdC5jbGFzcyk7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB0ZXN0IGtleS12YWx1ZSBwYWlycwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgU3RyaW5nIFtdIHNlcnZpY2VLZXlzID0gewotICAgICAgICAgICAgInNlcnZpY2VLZXkxIiwKLSAgICAgICAgICAgICJzZXJ2aWNlS2V5MiIsCi0gICAgICAgICAgICAic2VydmljZUtleTMiCi0gICAgfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIFtdIHNlcnZpY2VWYWx1ZXMgPSB7Ci0gICAgICAgICAgICAic2VydmljZVZhbHVlMSIsCi0gICAgICAgICAgICAic2VydmljZVZhbHVlMiIsCi0gICAgICAgICAgICAic2VydmljZVZhbHVlMyIKLSAgICB9OwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdmFyaWFibGVzIGZvciB0aGUgb2JqZWN0IGdyYXBoIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHVzZWQgb24gYSBzYXZlL3Jlc3RvcmUgb2YgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgIC8vIGhhcyBhIGZ1bGwgb2JqZWN0IGdyYXBoIHdpdGggMyBzZXRzIG9mIHNlcnZpY2UgZ3JvdXBzIAotICAgIC8vIGFuZCBhc3NvY2lhdGVkIG9iamVjdHMKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbnVsbDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gc2VydmljZSBncm91cCBBQkMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWVfQUJDID0gIkFCQ1NlcnZpY2VHcm91cCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9BID0gIlNlcnZpY2VBIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9CID0gIlNlcnZpY2VCIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9DID0gIlNlcnZpY2VDIjsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfQSA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9BKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfQiA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9CKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfQyA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9DKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWVfQTEgPSAiVGVzdE9wZXJhdGlvbkExIjsKLSAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lX0EyID0gIlRlc3RPcGVyYXRpb25BMiI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfQTEgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV9BMSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfQTIgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV9BMik7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VHcm91cENvbnRleHQgc3J2R3JwQ3R4X0FCQyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTcnZHcnBfQUJDID0gbnVsbDsKLQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0EgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0IgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0MgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9BID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0MgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wQ3R4X0ExID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTIgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfQTEgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfQTIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTEgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ3R4X0EyID0gbnVsbDsKLSAgICAvL3ByaXZhdGUgQXhpc01lc3NhZ2UgICAgICAgICAgYXhpc01zZ19BMSAgICA9IG51bGw7Ci0gICAgLy9wcml2YXRlIEF4aXNNZXNzYWdlICAgICAgICAgIGF4aXNNc2dfQTIgICAgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBzZXJ2aWNlIGdyb3VwIDEyMwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUdyb3VwTmFtZV8xMjMgPSAiMTIzU2VydmljZUdyb3VwIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lXzEgPSAiU2VydmljZTEiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lXzIgPSAiU2VydmljZTIiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lXzMgPSAiU2VydmljZTMiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lXzQgPSAiU2VydmljZTQiOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV8xID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lXzEpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV8yID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lXzIpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV8zID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lXzMpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV80ID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lXzQpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZV8xXzEgPSAiVGVzdE9wZXJhdGlvbjFfMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZV8xXzIgPSAiVGVzdE9wZXJhdGlvbjFfMiI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfMV8xID0gbmV3IFFOYW1lKG9wZXJhdGlvbk5hbWVfMV8xKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbl9RTmFtZV8xXzIgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV8xXzIpOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNydkdycEN0eF8xMjMgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2VHcm91cCBheGlzU3J2R3JwXzEyMyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF8xID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF8yID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF8zID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF80ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfMSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2XzIgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl8zID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfNCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfMV8xID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfMV8yID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wXzFfMSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF8xXzIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfMV8xID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF8xXzIgPSBudWxsOwotICAgIC8vcHJpdmF0ZSBBeGlzTWVzc2FnZSAgICAgICAgICBheGlzTXNnXzFfMSAgID0gbnVsbDsKLSAgICAvL3ByaXZhdGUgQXhpc01lc3NhZ2UgICAgICAgICAgYXhpc01zZ18xXzIgICA9IG51bGw7Ci0KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gc2VydmljZSBncm91cCBEQVkKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWVfREFZID0gIkRheVNlcnZpY2VHcm91cCI7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9Nb24gPSAiTW9uZGF5U2VydmljZSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfVHVlID0gIlR1ZXNkYXlTZXJ2aWNlIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZV9XZWQgPSAiV2VkbmVzZGF5U2VydmljZSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfVGh1ID0gIlRodXJzZGF5U2VydmljZSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfRnJpID0gIkZyaWRheVNlcnZpY2UiOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9Nb24gPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfTW9uKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfVHVlID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lX1R1ZSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lX1dlZCA9IG5ldyBRTmFtZShzZXJ2aWNlTmFtZV9XZWQpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZV9RTmFtZV9UaHUgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfVGh1KTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VfUU5hbWVfRnJpID0gbmV3IFFOYW1lKHNlcnZpY2VOYW1lX0ZyaSk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lX01vbl8xID0gIlRlc3RPcGVyYXRpb25fTW9uXzEiOwotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWVfTW9uXzIgPSAiVGVzdE9wZXJhdGlvbl9Nb25fMiI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfTW9uXzEgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV9Nb25fMSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25fUU5hbWVfTW9uXzIgPSBuZXcgUU5hbWUob3BlcmF0aW9uTmFtZV9Nb25fMik7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VHcm91cENvbnRleHQgc3J2R3JwQ3R4X0RBWSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTcnZHcnBfREFZID0gbnVsbDsKLQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X01vbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfVHVlID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9XZWQgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X1RodSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfRnJpID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfTW9uID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfVHVlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfV2VkID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfVGh1ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfRnJpID0gbnVsbDsKLQotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF9Nb25fMSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wQ3R4X01vbl8yID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wX01vbl8xID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wX01vbl8yID0gbnVsbDsKLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ3R4X01vbl8xID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9Nb25fMiA9IG51bGw7Ci0gICAgLy9wcml2YXRlIEF4aXNNZXNzYWdlICAgICAgICAgIGF4aXNNc2dfTW9uXzEgPSBudWxsOwotICAgIC8vcHJpdmF0ZSBBeGlzTWVzc2FnZSAgICAgICAgICBheGlzTXNnX01vbl8yID0gbnVsbDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vICBvYmplY3RzIG5lZWRlZCBmb3IgbWVzc2FnZSBjb250ZXh0Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dDIgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0MyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4yID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4zID0gbnVsbDsKLQotICAgIHByaXZhdGUgUGhhc2UgcGhhc2UxID0gbnVsbDsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGV4ZWN1dGVkSGFuZGxlcnMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcmVwYXJlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0OmNvbnN0cnVjdG9yOiAgZXJyb3IgaW4gc2V0dGluZyB1cCBvYmplY3QgZ3JhcGggWyIgKwotICAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vCi0gICAgLy8gcHJlcGFyZSB0aGUgb2JqZWN0IGhpZXJhcmNoeSBmb3IgdGVzdGluZwotICAgIC8vCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXR1cCB0aGUgdG9wLWxldmVsIG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotCi0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLQotICAgICAgICBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIGFiZCA9IG5ldyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIGFiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgcnVkID0gbmV3IFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgcnVkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBzYWJkID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc2FiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciBzbWJkID0gbmV3IFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzbWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKGFiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihydWQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc2FiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzbWJkKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpLmFkZChkaXNwYXRjaFBoYXNlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdHJhbnNwb3J0LXJlbGF0ZWQgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdHJhbnNwb3J0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydE91dDIgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImhhcHB5Iik7Ci0gICAgICAgIHRyYW5zcG9ydE91dDMgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImdvbHVja3kiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydE91dDIuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0My5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQzKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydEluMiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJhbHdheXMiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oInRoZWJlc3QiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4uc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4zKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGhhc2UtcmVsYXRlZCBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBwaGFzZTEgPSBuZXcgUGhhc2UoIlBoYXNlMSIpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIoMSwgMikpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgSGFuZGxlck1DUygyLCB0cnVlKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzLCAyKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzLmFkZChwaGFzZTEpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGF4aXMgc2lkZSBvZiB0aGUgaGllcmFjaHkKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBQkMgZ3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGF4aXNTcnZHcnBfQUJDID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBheGlzU3J2R3JwX0FCQy5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNlcnZpY2VHcm91cE5hbWVfQUJDKTsKLQotICAgICAgICBheGlzU3J2X0EgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9BLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9CID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfQi5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfQyA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0MuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIGF4aXNTcnZHcnBfQUJDLmFkZFNlcnZpY2UoYXhpc1Nydl9BKTsKLSAgICAgICAgYXhpc1NydkdycF9BQkMuYWRkU2VydmljZShheGlzU3J2X0IpOwotICAgICAgICBheGlzU3J2R3JwX0FCQy5hZGRTZXJ2aWNlKGF4aXNTcnZfQyk7Ci0KLSAgICAgICAgYXhpc09wX0ExID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTEpOwotICAgICAgICBheGlzT3BfQTIgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMik7Ci0KLSAgICAgICAgYXhpc09wX0ExLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNPcF9BMi5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU3J2X0EuYWRkT3BlcmF0aW9uKGF4aXNPcF9BMSk7Ci0gICAgICAgIGF4aXNTcnZfQS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTEuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMSk7Ci0KLSAgICAgICAgYXhpc1Nydl9BLmFkZE9wZXJhdGlvbihheGlzT3BfQTIpOwotICAgICAgICBheGlzU3J2X0EubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0EyLmdldExvY2FsUGFydCgpLCBheGlzT3BfQTIpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9BKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0IpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQyk7Ci0KLQotICAgICAgICBheGlzT3BfQTEuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMSk7Ci0gICAgICAgIGF4aXNPcF9BMi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gMTIzIGdyb3VwCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBheGlzU3J2R3JwXzEyMyA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXhpc1NydkdycF8xMjMuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lXzEyMyk7Ci0KLSAgICAgICAgYXhpc1Nydl8xID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfMS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfMiA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lXzIuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2XzMgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV8zLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl80ID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfNC5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgYXhpc1NydkdycF8xMjMuYWRkU2VydmljZShheGlzU3J2XzEpOwotICAgICAgICBheGlzU3J2R3JwXzEyMy5hZGRTZXJ2aWNlKGF4aXNTcnZfMik7Ci0gICAgICAgIGF4aXNTcnZHcnBfMTIzLmFkZFNlcnZpY2UoYXhpc1Nydl8zKTsKLSAgICAgICAgYXhpc1NydkdycF8xMjMuYWRkU2VydmljZShheGlzU3J2XzQpOwotCi0gICAgICAgIGF4aXNPcF8xXzEgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV8xXzEpOwotICAgICAgICBheGlzT3BfMV8yID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfMV8yKTsKLQotICAgICAgICBheGlzT3BfMV8xLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNPcF8xXzIuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc1Nydl8xLmFkZE9wZXJhdGlvbihheGlzT3BfMV8xKTsKLSAgICAgICAgYXhpc1Nydl8xLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV8xXzEuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF8xXzEpOwotCi0gICAgICAgIGF4aXNTcnZfMS5hZGRPcGVyYXRpb24oYXhpc09wXzFfMik7Ci0gICAgICAgIGF4aXNTcnZfMS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfMV8yLmdldExvY2FsUGFydCgpLCBheGlzT3BfMV8yKTsKLQotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfMSk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl8yKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2XzMpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfNCk7Ci0KLSAgICAgICAgYXhpc09wXzFfMS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLSAgICAgICAgYXhpc09wXzFfMi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gREFZIGdyb3VwCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBheGlzU3J2R3JwX0RBWSA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXhpc1NydkdycF9EQVkuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lX0RBWSk7Ci0KLSAgICAgICAgYXhpc1Nydl9Nb24gPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9Nb24uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X1R1ZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX1R1ZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTcnZfV2VkID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfV2VkLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9UaHUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9UaHUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0ZyaSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0ZyaS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgYXhpc1NydkdycF9EQVkuYWRkU2VydmljZShheGlzU3J2X01vbik7Ci0gICAgICAgIGF4aXNTcnZHcnBfREFZLmFkZFNlcnZpY2UoYXhpc1Nydl9UdWUpOwotICAgICAgICBheGlzU3J2R3JwX0RBWS5hZGRTZXJ2aWNlKGF4aXNTcnZfV2VkKTsKLSAgICAgICAgYXhpc1NydkdycF9EQVkuYWRkU2VydmljZShheGlzU3J2X1RodSk7Ci0gICAgICAgIGF4aXNTcnZHcnBfREFZLmFkZFNlcnZpY2UoYXhpc1Nydl9GcmkpOwotCi0gICAgICAgIGF4aXNPcF9Nb25fMSA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX01vbl8xKTsKLSAgICAgICAgYXhpc09wX01vbl8yID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfTW9uXzIpOwotCi0gICAgICAgIGF4aXNPcF9Nb25fMS5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzT3BfTW9uXzIuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc1Nydl9Nb24uYWRkT3BlcmF0aW9uKGF4aXNPcF9Nb25fMSk7Ci0gICAgICAgIGF4aXNTcnZfTW9uLm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9Nb25fMS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX01vbl8xKTsKLQotICAgICAgICBheGlzU3J2X01vbi5hZGRPcGVyYXRpb24oYXhpc09wX01vbl8yKTsKLSAgICAgICAgYXhpc1Nydl9Nb24ubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX01vbl8yLmdldExvY2FsUGFydCgpLCBheGlzT3BfTW9uXzIpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9Nb24pOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfVHVlKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X1dlZCk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9UaHUpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfRnJpKTsKLQotICAgICAgICBheGlzT3BfTW9uXzEuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlMSk7Ci0gICAgICAgIGF4aXNPcF9Nb25fMi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNldHVwIHRoZSBjb250ZXh0IG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBzcnZHcnBDdHhfQUJDID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU3J2R3JwX0FCQyk7Ci0gICAgICAgIHNydkdycEN0eF9BQkMuc2V0SWQoc2VydmljZUdyb3VwTmFtZV9BQkMpOwotCi0gICAgICAgIHNydkdycEN0eF8xMjMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTcnZHcnBfMTIzKTsKLSAgICAgICAgc3J2R3JwQ3R4XzEyMy5zZXRJZChzZXJ2aWNlR3JvdXBOYW1lX0FCQyk7Ci0KLSAgICAgICAgc3J2R3JwQ3R4X0RBWSA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NydkdycF9EQVkpOwotICAgICAgICBzcnZHcnBDdHhfREFZLnNldElkKHNlcnZpY2VHcm91cE5hbWVfREFZKTsKLQotICAgICAgICBzcnZDdHhfQSA9IHNydkdycEN0eF9BQkMuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9BKTsKLSAgICAgICAgc3J2Q3R4X0IgPSBzcnZHcnBDdHhfQUJDLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfQik7Ci0gICAgICAgIHNydkN0eF9DID0gc3J2R3JwQ3R4X0FCQy5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0MpOwotCi0gICAgICAgIHNydkN0eF8xID0gc3J2R3JwQ3R4XzEyMy5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2XzEpOwotICAgICAgICBzcnZDdHhfMiA9IHNydkdycEN0eF8xMjMuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl8yKTsKLSAgICAgICAgc3J2Q3R4XzMgPSBzcnZHcnBDdHhfMTIzLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfMyk7Ci0gICAgICAgIHNydkN0eF80ID0gc3J2R3JwQ3R4XzEyMy5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2XzQpOwotCi0gICAgICAgIHNydkN0eF9Nb24gPSBzcnZHcnBDdHhfREFZLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfTW9uKTsKLSAgICAgICAgc3J2Q3R4X1R1ZSA9IHNydkdycEN0eF9EQVkuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9UdWUpOwotICAgICAgICBzcnZDdHhfV2VkID0gc3J2R3JwQ3R4X0RBWS5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X1dlZCk7Ci0gICAgICAgIHNydkN0eF9UaHUgPSBzcnZHcnBDdHhfREFZLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfVGh1KTsKLSAgICAgICAgc3J2Q3R4X0ZyaSA9IHNydkdycEN0eF9EQVkuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9GcmkpOwotCi0gICAgICAgIG9wQ3R4X0ExID0gc3J2Q3R4X0EuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25fUU5hbWVfQTEpOwotICAgICAgICBvcEN0eF9BMiA9IHNydkN0eF9BLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lX0EyKTsKLQotICAgICAgICBvcEN0eF8xXzEgPSBzcnZDdHhfMS5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV8xXzEpOwotICAgICAgICBvcEN0eF8xXzIgPSBzcnZDdHhfMS5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV8xXzIpOwotCi0gICAgICAgIG9wQ3R4X01vbl8xID0gc3J2Q3R4X01vbi5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV9Nb25fMSk7Ci0gICAgICAgIG9wQ3R4X01vbl8yID0gc3J2Q3R4X01vbi5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV9Nb25fMik7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1lc3NhZ2UgY29udGV4dCBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBtc2dDdHhfQTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChvcEN0eF9BMSk7Ci0gICAgICAgIG1zZ0N0eF9BMiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X0EyKTsKLQotICAgICAgICBtc2dDdHhfMV8xID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfMV8xKTsKLSAgICAgICAgbXNnQ3R4XzFfMiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4XzFfMik7Ci0KLSAgICAgICAgbXNnQ3R4X01vbl8xID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfTW9uXzEpOwotICAgICAgICBtc2dDdHhfTW9uXzIgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChvcEN0eF9Nb25fMik7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvdGhlciBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgZXhlY3V0ZWRIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoT3BlcmF0aW9uQ29udGV4dCBvYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotLy8gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQsIFN5c3RlbS5vdXQpOwotCi0gICAgICAgIFNPQVBGYWN0b3J5IG9tRmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShvbUZhYy5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gb2MuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBTdHJpbmcgYWN0aW9uID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIG1jLnNldFNvYXBBY3Rpb24oYWN0aW9uKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0KLSAgICAgICAgbWMuc2V0TWVzc2FnZUlEKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLQotICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtYywgb2MpOwotICAgICAgICBtYy5zZXRPcGVyYXRpb25Db250ZXh0KG9jKTsKLQotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzYyA9IG9jLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFNlcnZpY2VDb250ZXh0KHNjKTsKLQotICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLQotICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICBtYy5zZXRBeGlzTWVzc2FnZShheGlzTWVzc2FnZSk7Ci0KLSAgICAgICAgcmV0dXJuIG1jOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2F2ZUJUZXN0OiB0ZXN0U2VydmljZVByb3BlcnRpZXMoKTogIjsKLQotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbXNnQ3R4XzFfMTsKLQotICAgICAgICAvLyBhZGQgc29tZSBzZXJ2aWNlLWxldmVsIHByb3BlcnRpZXMKLSAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICJfYmVmb3JlIjsKLSAgICAgICAgYWRkU2VydmljZVByb3BlcnRpZXMobWMsIHN1ZmZpeCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGxldmVsIHByb3BlcnRpZXMgaW50byBhIHNlcGFyYXRlIHRhYmxlCi0gICAgICAgIE1hcCBwcm9wZXJ0aWVzX29yaWdpbmFsID0gbmV3IEhhc2hNYXAoZ2V0U2VydmljZVByb3BlcnRpZXMobWMpKTsKLSAgICAgICAgc2hvd1Byb3BlcnRpZXMocHJvcGVydGllc19vcmlnaW5hbCwgIm9yaWdpbmFsIHByb3BlcnRpZXMiKTsKLQotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic3RhcnQgLSAtIGVuZ2luZS5yZWNlaXZlKG1jKSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGxldmVsIHByb3BlcnRpZXMgaW50byBhIHNlcGFyYXRlIHRhYmxlCi0gICAgICAgIE1hcCBwcm9wZXJ0aWVzMiA9IG5ldyBIYXNoTWFwKGdldFNlcnZpY2VQcm9wZXJ0aWVzKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQpKTsKLSAgICAgICAgc2hvd1Byb3BlcnRpZXMocHJvcGVydGllczIsICJyZXN0b3JlZCBwcm9wZXJ0aWVzIik7Ci0KLSAgICAgICAgLy8gYWRkIHNvbWUgbW9yZSBwcm9wZXJ0aWVzCi0gICAgICAgIHN1ZmZpeCA9ICJfcG9zdFJlY2VpdmUiOwotICAgICAgICBhZGRTZXJ2aWNlUHJvcGVydGllcyhyZXN0b3JlZE1lc3NhZ2VDb250ZXh0LCBzdWZmaXgpOwotCi0gICAgICAgIC8vIHJlc3VtZSB0aGUgcGF1c2VkIG1lc3NhZ2UgY29udGV4dAotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAicmVzdW1lIC0gLSBlbmdpbmUucmVzdW1lKG1jKSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKHJlc3RvcmVkTWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIC8vIGdldCB0aGUgc2VydmljZSBsZXZlbCBwcm9wZXJ0aWVzIGludG8gYSBzZXBhcmF0ZSB0YWJsZQotICAgICAgICBNYXAgcHJvcGVydGllczMgPSBuZXcgSGFzaE1hcChnZXRTZXJ2aWNlUHJvcGVydGllcyhyZXN0b3JlZE1lc3NhZ2VDb250ZXh0KSk7Ci0gICAgICAgIHNob3dQcm9wZXJ0aWVzKHByb3BlcnRpZXMzLCAicmVzdG9yZWQgc2VydmljZSBwcm9wZXJ0aWVzIHBvc3QtcmVzdW1lIik7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGxldmVsIHByb3BlcnRpZXMgZnJvbSB0aGUgb3RoZXIgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIC8vIGluIHRoZSBzYW1lIHNlcnZpY2UgCi0gICAgICAgIE1hcCBwcm9wZXJ0aWVzNCA9IGdldFNlcnZpY2VQcm9wZXJ0aWVzKG1zZ0N0eF8xXzIpOwotICAgICAgICBzaG93UHJvcGVydGllcyhwcm9wZXJ0aWVzNCwgInNlcnZpY2UgcHJvcGVydGllcyBmcm9tIG90aGVyIGFjdGl2ZSBNc2dDdHgiKTsKLQotICAgICAgICAvLyB0aGUgc2VydmljZSBsZXZlbCBwcm9wZXJ0aWVzIHNob3VsZCBiZSB0aGUgc2FtZQotICAgICAgICBib29sZWFuIGlzT2sgPSBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChwcm9wZXJ0aWVzMywgcHJvcGVydGllczQsIHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGlzT2spOwotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIE1hcCBnZXRTZXJ2aWNlUHJvcGVydGllcyhNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBNYXAgcHJvcGVydGllcyA9IG51bGw7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGNvbnRleHQgZnJvbSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbWMuZ2V0U2VydmljZUNvbnRleHQoKTsKLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGNvbnRleHQgZnJvbSB0aGUgb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9IG1jLmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0ID0gb3BlcmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkU2VydmljZVByb3BlcnRpZXMoTWVzc2FnZUNvbnRleHQgbWMsIFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGNvbnRleHQgZnJvbSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbWMuZ2V0U2VydmljZUNvbnRleHQoKTsKLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBzZXJ2aWNlIGNvbnRleHQgZnJvbSB0aGUgb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9IG1jLmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0ID0gb3BlcmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2VydmljZUtleXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gc2VydmljZUtleXNba107Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2VydmljZVZhbHVlc1trXSArIHN1ZmZpeDsKLQotICAgICAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgc2hvd1Byb3BlcnRpZXMoTWFwIG1hcCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZyhkZXNjcmlwdGlvbiArICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgaWYgKChtYXAgPT0gbnVsbCkgfHwgKG1hcC5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZGVzY3JpcHRpb24gKyAiOiBObyBwcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZGVzY3JpcHRpb24gKyAiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBpdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hcC5nZXQoa2V5KTsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKGRlc2NyaXB0aW9uICsgIjoga2V5LXZhbHVlIHBhaXIgWyIgKyBrZXkgKyAiXVsiICsgdmFsdWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZyhkZXNjcmlwdGlvbiArICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBUaGUgaGFuZGxlciBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIsCi0gICAgICogICAgICAgICAtMSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRIYW5kbGVySUQoT2JqZWN0IG8pIHsKLSAgICAgICAgaW50IGlkID0gLTE7Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUZW1wSGFuZGxlcikgewotICAgICAgICAgICAgaWQgPSAoKFRlbXBIYW5kbGVyKSBvKS5nZXRIYW5kbGVySUQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBIYW5kbGVyIGNsYXNzZXMgCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIHNhdmUgYW5kIHJlc3RvcmUgb24gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBIYW5kbGVyTUNTIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIGhhbmRsZXJJRCA9IG51bGw7Ci0KLSAgICAgICAgcHJpdmF0ZSBGaWxlIHRoZUZpbGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBhdXNlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlZE9rID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiByZXN0b3JlZE9rID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlc09rID0gZmFsc2U7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyTUNTKCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcigtNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSGFuZGxlck1DUyhpbnQgaW5kZXgsIGJvb2xlYW4gcGF1c2UpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgdGhpcy5wYXVzZSA9IHBhdXNlOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKG5ldyBTdHJpbmcoImhhbmRsZXIiICsgaW5kZXgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSGFuZGxlck1DUyhpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoaW5kZXgpOwotICAgICAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKG5ldyBTdHJpbmcoImhhbmRsZXIiICsgaW5kZXgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1ldGhvZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlcklEKCkgewotICAgICAgICAgICAgaWYgKGhhbmRsZXJJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJRC5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLTU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIkhhbmRsZXJNQ1NbIiArIGdldEhhbmRsZXJJRCgpICsgIl06aW52b2tlKCk6ICI7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAicGF1c2UgPSBbIiArIHBhdXNlICsgIl0iKTsKLSAgICAgICAgICAgIHNhdmVkT2sgPSBmYWxzZTsKLSAgICAgICAgICAgIHJlc3RvcmVkT2sgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKHBhdXNlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm1zZ0NvbnRleHQucGF1c2UoKSIpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQucGF1c2UoKTsKLSAgICAgICAgICAgICAgICBwYXVzZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm1jU2F2ZSIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJzYXZpbmcgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkT2sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRPayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHNhdmVkT2spOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZXN0b3JlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgYSBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWRPayA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0MiA9IChNZXNzYWdlQ29udGV4dCkgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQyLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWRPayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBwdXQgdGhlIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJpYWJsZSBmb3IgdGhlIHRlc3QgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gbXNnQ29udGV4dDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciB3aXRoIHJlc3RvcmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRPayk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IHN1Y2NlZWRlZCwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWRPayAmJiByZXN0b3JlZE9rOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORDsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXhlY3V0ZWRIYW5kbGVycy5hZGQoIiArIGhhbmRsZXJJRCArICIpIik7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZWRIYW5kbGVycy5hZGQoaGFuZGxlcklEKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFRlbXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIGhhbmRsZXJJRCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbnVtYmVyUHJvcGVydGllcyA9IDM7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5S2V5ID0gIlByb3BlcnR5IjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9ICJTZXJ2aWNlTGV2ZWxTZXR0aW5nIjsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcigtNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihuZXcgU3RyaW5nKCJoYW5kbGVyIiArIGluZGV4KSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKGludCBpbmRleCwgaW50IG51bWJlcikgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24obmV3IFN0cmluZygiaGFuZGxlciIgKyBpbmRleCkpKTsKLSAgICAgICAgICAgIG51bWJlclByb3BlcnRpZXMgPSBudW1iZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1ldGhvZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlcklEKCkgewotICAgICAgICAgICAgaWYgKGhhbmRsZXJJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJRC5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLTU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIlRlbXBIYW5kbGVyWyIgKyBnZXRIYW5kbGVySUQoKSArICJdOmludm9rZSgpOiAiOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgY29udGV4dCBmcm9tIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2VydmljZSBjb250ZXh0IGZyb20gdGhlIG9wZXJhdGlvbiBjb250ZXh0Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBvcGVyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJQcm9wZXJ0aWVzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcocHJvcGVydHlLZXkgKyAiLklEWyIgKyBnZXRIYW5kbGVySUQoKSArICJdLiIgKyBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5ldyBTdHJpbmcocHJvcGVydHlWYWx1ZSArICJbIiArIGNvdW50ICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXhlY3V0ZWRIYW5kbGVycy5hZGQoIiArIGhhbmRsZXJJRCArICIpIik7Ci0gICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChoYW5kbGVySUQpOwotCi0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyYmU3NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2F2ZUNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotCi0vKioKLSAqIFByb3ZpZGVzIHRlc3RzIHRoYXQgZm9jdXMgb24gdGhlIG1lc3NhZ2UgY29udGV4dCBvYmplY3QgZ3JhcGgKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0U2F2ZUNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VDb250ZXh0U2F2ZUNUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgRmlsZSBwZXJzaXN0ZW50U3RvcmUgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gdmFyaWFibGVzIGZvciB0aGUgb2JqZWN0IGdyYXBoIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHVzZWQgb24gYSBzYXZlIG9mIGEgbWVzc2FnZSBjb250ZXh0LCB1c2VzIHRoZSBzYW1lIHNldHVwIAotICAgIC8vIGFzIHRoZSByZWd1bGFyIHRvcC1sZXZlbCBvYmplY3RzLiB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0Ci0gICAgLy8gdGhlIHBoYXNlIGNvbnRhaW5zIGhhbmRsZXJzIHRoYXQgc3BsaXQgdGhlIGFjdGlvbiBhY3Jvc3MKLSAgICAvLyB0d28gaGFuZGxlcnMKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IHNhdmVDb25maWd1cmF0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBzYXZlQXhpc0NvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0gICAgLy8gdXNlZCBvbiBhIHJlc3RvcmUgb2YgYSBtZXNzYWdlIGNvbnRleHQsIHVzZXMgdGhlIHNhbWUgc2V0dXAgCi0gICAgLy8gYXMgdGhlIHJlZ3VsYXIgdG9wLWxldmVsIG9iamVjdHMgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlCi0gICAgLy8gY29udGV4dCBvYmplY3RzIGRvbid0IGV4aXN0LiBhbHNvLCB0aGUgcGhhc2UgY29udGFpbnMgaGFuZGxlcnMKLSAgICAvLyB0aGF0IHNwbGl0IHRoZSBhY3Rpb24gYWNyb3NzIHR3byBoYW5kbGVycwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgcmVzdG9yZUNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyB1c2VkIG9uIGEgcmVzdG9yZSBvZiBhIG1lc3NhZ2UgY29udGV4dCwgdXNlcyB0aGUgc2FtZSBzZXR1cCAKLSAgICAvLyBhcyB0aGUgcmVndWxhciB0b3AtbGV2ZWwgb2JqZWN0cyB3aXRoIHNlcnZpY2UtbGV2ZWwgY29udGV4dCBvYmplY3RzCi0gICAgLy8gd2l0aCB0aGUgbmFtZSBzZXJ2aWNlIG5hbWUuIGFsc28sIHRoZSBwaGFzZSBjb250YWlucyBoYW5kbGVycwotICAgIC8vIHRoYXQgc3BsaXQgdGhlIGFjdGlvbiBhY3Jvc3MgdHdvIGhhbmRsZXJzCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHNlcnZpY2UgZ3JvdXAgQUJDCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lX0FCQyA9ICJBQkNTZXJ2aWNlR3JvdXAiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfQSA9ICJTZXJ2aWNlQSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfQiA9ICJTZXJ2aWNlQiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWVfQyA9ICJTZXJ2aWNlQyI7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lX0EgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfQSk7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lX0IgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfQik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlX1FOYW1lX0MgPSBuZXcgUU5hbWUoc2VydmljZU5hbWVfQyk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvcGVyYXRpb25OYW1lX0ExID0gIlRlc3RPcGVyYXRpb25BMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZV9BMiA9ICJUZXN0T3BlcmF0aW9uQTIiOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uX1FOYW1lX0ExID0gbmV3IFFOYW1lKG9wZXJhdGlvbk5hbWVfQTEpOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uX1FOYW1lX0EyID0gbmV3IFFOYW1lKG9wZXJhdGlvbk5hbWVfQTIpOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNydkdycEN0eF9BQkNfc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTcnZHcnBfQUJDX3NhdmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZUdyb3VwIGF4aXNTcnZHcnBfQUJDX3Jlc3RvcmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNydkdycEN0eF9BQkNfZXF1aXYgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2VHcm91cCBheGlzU3J2R3JwX0FCQ19lcXVpdiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9BX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0Jfc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQ19zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQV9zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQl9zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQ19zYXZlID0gbnVsbDsKLQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc3J2Q3R4X0FfcmVzdG9yZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQl9yZXN0b3JlID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNydkN0eF9DX3Jlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9BX3Jlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9CX3Jlc3RvcmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9DX3Jlc3RvcmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQV9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQl9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzcnZDdHhfQ19lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU3J2X0FfZXF1aXYgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1Nydl9CX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTcnZfQ19lcXVpdiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTFfc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wQ3R4X0EyX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfQTFfc2F2ZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMl9zYXZlID0gbnVsbDsKLQotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcEN0eF9BMV9yZXN0b3JlID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTJfcmVzdG9yZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcF9BMV9yZXN0b3JlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wX0EyX3Jlc3RvcmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25Db250ZXh0IG9wQ3R4X0ExX2VxdWl2ID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BDdHhfQTJfZXF1aXYgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfQTFfZXF1aXYgPSBudWxsOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BfQTJfZXF1aXYgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTFfMV9zYXZlID0gbnVsbDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eF9BMV8yX3NhdmUgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ3R4X0EyX3NhdmUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTFfMV9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTFfMl9lcXVpdiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHhfQTJfZXF1aXYgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gIG9iamVjdHMgbmVlZGVkIGZvciBtZXNzYWdlIGNvbnRleHQKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0MiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQzID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjIgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZVNhdmUgPSBudWxsOwotICAgIHByaXZhdGUgUGhhc2UgcGhhc2VSZXN0b3JlID0gbnVsbDsKLSAgICBwcml2YXRlIFBoYXNlIHBoYXNlRXF1aXYgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXhlY3V0ZWRIYW5kbGVycyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gbWV0aG9kcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3QoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByZXBhcmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3Q6Y29uc3RydWN0b3I6ICBlcnJvciBpbiBzZXR0aW5nIHVwIG9iamVjdCBncmFwaCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8KLSAgICAvLyBwcmVwYXJlIHRoZSBvYmplY3QgaGllcmFyY2h5IGZvciB0ZXN0aW5nCi0gICAgLy8KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNldHVwIHRoZSB0b3AtbGV2ZWwgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgYWJkID0gbmV3IEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciBydWQgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzYWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIHNtYmQgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIHNtYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHJ1ZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNtYmQpOwotCi0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBzYXZlQ29uZmlndXJhdGlvbkNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoc2F2ZUF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIHNhdmVDb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICByZXN0b3JlQ29uZmlndXJhdGlvbkNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQocmVzdG9yZUF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgcmVzdG9yZUNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIHJlc3RvcmVDb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgcmVzdG9yZUNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZXF1aXZDb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChlcXVpdkF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgZXF1aXZDb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiLCBuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB0cmFuc3BvcnQtcmVsYXRlZCBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB0cmFuc3BvcnRPdXQgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oIm51bGwiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0MiA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiaGFwcHkiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0MyA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigiZ29sdWNreSIpOwotICAgICAgICB0cmFuc3BvcnRPdXQuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0Mi5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRPdXQzLnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0KLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQzKTsKLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQyKTsKLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Myk7Ci0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Mik7Ci0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQzKTsKLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Mik7Ci0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLQotICAgICAgICB0cmFuc3BvcnRJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydEluMiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJhbHdheXMiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oInRoZWJlc3QiKTsKLSAgICAgICAgdHJhbnNwb3J0SW4uc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4zLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotCi0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjIpOwotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4zKTsKLQotICAgICAgICByZXN0b3JlQXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4yKTsKLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMyk7Ci0KLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjIpOwotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluKTsKLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBwaGFzZS1yZWxhdGVkIG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHBlcnNpc3RlbnRTdG9yZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm1jT2JqVGVzdCIsIG51bGwpOwotCi0gICAgICAgIHBoYXNlU2F2ZSA9IG5ldyBQaGFzZSgiUGhhc2VUZXN0Iik7Ci0gICAgICAgIHBoYXNlU2F2ZS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxLCAxKSk7Ci0gICAgICAgIHBoYXNlU2F2ZS5hZGRIYW5kbGVyKG5ldyBTYXZlSGFuZGxlcigyLCBwZXJzaXN0ZW50U3RvcmUsIHRydWUpKTsKLSAgICAgICAgcGhhc2VTYXZlLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMsIDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzX1NhdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBoYXNlc19TYXZlLmFkZChwaGFzZVNhdmUpOwotCi0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbi5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2gocGhhc2VzX1NhdmUpOwotCi0KLSAgICAgICAgcGhhc2VSZXN0b3JlID0gbmV3IFBoYXNlKCJQaGFzZVRlc3QiKTsKLSAgICAgICAgcGhhc2VSZXN0b3JlLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEsIDEpKTsKLSAgICAgICAgcGhhc2VSZXN0b3JlLmFkZEhhbmRsZXIobmV3IFNhdmVIYW5kbGVyKDIsIHBlcnNpc3RlbnRTdG9yZSwgZmFsc2UpKTsKLSAgICAgICAgcGhhc2VSZXN0b3JlLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDMsIDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzX1Jlc3RvcmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBoYXNlc19SZXN0b3JlLmFkZChwaGFzZVJlc3RvcmUpOwotCi0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2gocGhhc2VzX1Jlc3RvcmUpOwotCi0gICAgICAgIHBoYXNlRXF1aXYgPSBuZXcgUGhhc2UoIlBoYXNlVGVzdCIpOwotICAgICAgICBwaGFzZUVxdWl2LmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEsIDEpKTsKLSAgICAgICAgcGhhc2VFcXVpdi5hZGRIYW5kbGVyKG5ldyBTYXZlSGFuZGxlcigyLCBwZXJzaXN0ZW50U3RvcmUsIHRydWUpKTsKLSAgICAgICAgcGhhc2VFcXVpdi5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzLCAxKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlc19FcXVpdiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzX0VxdWl2LmFkZChwaGFzZUVxdWl2KTsKLQotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXNfRXF1aXYpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgdGhlIGF4aXMgc2lkZSBvZiB0aGUgaGllcmFjaHkKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBQkMgZ3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc1NydkdycF9BQkNfc2F2ZSA9IG5ldyBBeGlzU2VydmljZUdyb3VwKHNhdmVBeGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3NhdmUuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lX0FCQyk7Ci0KLSAgICAgICAgYXhpc1Nydl9BX3NhdmUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9BLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9CX3NhdmUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9CLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9DX3NhdmUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9DLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBheGlzU3J2R3JwX0FCQ19zYXZlLmFkZFNlcnZpY2UoYXhpc1Nydl9BX3NhdmUpOwotICAgICAgICBheGlzU3J2R3JwX0FCQ19zYXZlLmFkZFNlcnZpY2UoYXhpc1Nydl9CX3NhdmUpOwotICAgICAgICBheGlzU3J2R3JwX0FCQ19zYXZlLmFkZFNlcnZpY2UoYXhpc1Nydl9DX3NhdmUpOwotCi0gICAgICAgIGF4aXNPcF9BMV9zYXZlID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTEpOwotICAgICAgICBheGlzT3BfQTJfc2F2ZSA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0EyKTsKLQotICAgICAgICBheGlzT3BfQTFfc2F2ZS5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzT3BfQTJfc2F2ZS5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU3J2X0Ffc2F2ZS5hZGRPcGVyYXRpb24oYXhpc09wX0ExX3NhdmUpOwotICAgICAgICBheGlzU3J2X0Ffc2F2ZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTEuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMV9zYXZlKTsKLQotICAgICAgICBheGlzU3J2X0Ffc2F2ZS5hZGRPcGVyYXRpb24oYXhpc09wX0EyX3NhdmUpOwotICAgICAgICBheGlzU3J2X0Ffc2F2ZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMl9zYXZlKTsKLQotICAgICAgICBzYXZlQXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0Ffc2F2ZSk7Ci0gICAgICAgIHNhdmVBeGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQl9zYXZlKTsKLSAgICAgICAgc2F2ZUF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9DX3NhdmUpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc1NydkdycF9BQkNfcmVzdG9yZSA9IG5ldyBBeGlzU2VydmljZUdyb3VwKHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX3Jlc3RvcmUuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lX0FCQyk7Ci0KLSAgICAgICAgYXhpc1Nydl9BX3Jlc3RvcmUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9BLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9CX3Jlc3RvcmUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9CLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9DX3Jlc3RvcmUgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9DLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBheGlzU3J2R3JwX0FCQ19yZXN0b3JlLmFkZFNlcnZpY2UoYXhpc1Nydl9BX3Jlc3RvcmUpOwotICAgICAgICBheGlzU3J2R3JwX0FCQ19yZXN0b3JlLmFkZFNlcnZpY2UoYXhpc1Nydl9CX3Jlc3RvcmUpOwotICAgICAgICBheGlzU3J2R3JwX0FCQ19yZXN0b3JlLmFkZFNlcnZpY2UoYXhpc1Nydl9DX3Jlc3RvcmUpOwotCi0gICAgICAgIGF4aXNPcF9BMV9yZXN0b3JlID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTEpOwotICAgICAgICBheGlzT3BfQTJfcmVzdG9yZSA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0EyKTsKLQotICAgICAgICBheGlzT3BfQTFfcmVzdG9yZS5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzT3BfQTJfcmVzdG9yZS5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBheGlzU3J2X0FfcmVzdG9yZS5hZGRPcGVyYXRpb24oYXhpc09wX0ExX3Jlc3RvcmUpOwotICAgICAgICBheGlzU3J2X0FfcmVzdG9yZQotICAgICAgICAgICAgICAgIC5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTEuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMV9yZXN0b3JlKTsKLQotICAgICAgICBheGlzU3J2X0FfcmVzdG9yZS5hZGRPcGVyYXRpb24oYXhpc09wX0EyX3Jlc3RvcmUpOwotICAgICAgICBheGlzU3J2X0FfcmVzdG9yZQotICAgICAgICAgICAgICAgIC5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMl9yZXN0b3JlKTsKLQotCi0gICAgICAgIHJlc3RvcmVBeGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQV9yZXN0b3JlKTsKLSAgICAgICAgcmVzdG9yZUF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9CX3Jlc3RvcmUpOwotICAgICAgICByZXN0b3JlQXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0NfcmVzdG9yZSk7Ci0KLQotICAgICAgICBheGlzT3BfQTFfc2F2ZS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2VTYXZlKTsKLSAgICAgICAgYXhpc09wX0EyX3NhdmUuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlU2F2ZSk7Ci0KLSAgICAgICAgYXhpc09wX0ExX3Jlc3RvcmUuZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuYWRkKHBoYXNlUmVzdG9yZSk7Ci0gICAgICAgIGF4aXNPcF9BMl9yZXN0b3JlLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZVJlc3RvcmUpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGF4aXNTcnZHcnBfQUJDX2VxdWl2ID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoZXF1aXZBeGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX2VxdWl2LnNldFNlcnZpY2VHcm91cE5hbWUoc2VydmljZUdyb3VwTmFtZV9BQkMpOwotCi0gICAgICAgIGF4aXNTcnZfQV9lcXVpdiA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlX1FOYW1lX0EuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBheGlzU3J2X0JfZXF1aXYgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZV9RTmFtZV9CLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1Nydl9DX2VxdWl2ID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VfUU5hbWVfQy5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgYXhpc1NydkdycF9BQkNfZXF1aXYuYWRkU2VydmljZShheGlzU3J2X0FfZXF1aXYpOwotICAgICAgICBheGlzU3J2R3JwX0FCQ19lcXVpdi5hZGRTZXJ2aWNlKGF4aXNTcnZfQl9lcXVpdik7Ci0gICAgICAgIGF4aXNTcnZHcnBfQUJDX2VxdWl2LmFkZFNlcnZpY2UoYXhpc1Nydl9DX2VxdWl2KTsKLQotICAgICAgICBheGlzT3BfQTFfZXF1aXYgPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMSk7Ci0gICAgICAgIGF4aXNPcF9BMl9lcXVpdiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uX1FOYW1lX0EyKTsKLQotICAgICAgICBheGlzT3BfQTFfZXF1aXYuc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc09wX0EyX2VxdWl2LnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNTcnZfQV9lcXVpdi5hZGRPcGVyYXRpb24oYXhpc09wX0ExX2VxdWl2KTsKLSAgICAgICAgYXhpc1Nydl9BX2VxdWl2Lm1hcEFjdGlvblRvT3BlcmF0aW9uKG9wZXJhdGlvbl9RTmFtZV9BMS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wX0ExX2VxdWl2KTsKLQotICAgICAgICBheGlzU3J2X0FfZXF1aXYuYWRkT3BlcmF0aW9uKGF4aXNPcF9BMl9lcXVpdik7Ci0gICAgICAgIGF4aXNTcnZfQV9lcXVpdi5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25fUU5hbWVfQTIuZ2V0TG9jYWxQYXJ0KCksIGF4aXNPcF9BMl9lcXVpdik7Ci0KLSAgICAgICAgZXF1aXZBeGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKGF4aXNTcnZfQV9lcXVpdik7Ci0gICAgICAgIGVxdWl2QXhpc0NvbmZpZ3VyYXRpb24uYWRkU2VydmljZShheGlzU3J2X0JfZXF1aXYpOwotICAgICAgICBlcXVpdkF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1Nydl9DX2VxdWl2KTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNldHVwIHRoZSBjb250ZXh0IG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBzcnZHcnBDdHhfQUJDX3NhdmUgPSBzYXZlQ29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU3J2R3JwX0FCQ19zYXZlKTsKLSAgICAgICAgc3J2R3JwQ3R4X0FCQ19zYXZlLnNldElkKHNlcnZpY2VHcm91cE5hbWVfQUJDKTsKLQotICAgICAgICBzcnZDdHhfQV9zYXZlID0gc3J2R3JwQ3R4X0FCQ19zYXZlLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfQV9zYXZlKTsKLSAgICAgICAgc3J2Q3R4X0Jfc2F2ZSA9IHNydkdycEN0eF9BQkNfc2F2ZS5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0Jfc2F2ZSk7Ci0gICAgICAgIHNydkN0eF9DX3NhdmUgPSBzcnZHcnBDdHhfQUJDX3NhdmUuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9DX3NhdmUpOwotCi0gICAgICAgIG9wQ3R4X0ExX3NhdmUgPSBzcnZDdHhfQV9zYXZlLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uX1FOYW1lX0ExKTsKLSAgICAgICAgb3BDdHhfQTJfc2F2ZSA9IHNydkN0eF9BX3NhdmUuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25fUU5hbWVfQTIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHNydkdycEN0eF9BQkNfZXF1aXYgPQotICAgICAgICAgICAgICAgIGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU3J2R3JwX0FCQ19lcXVpdik7Ci0gICAgICAgIHNydkdycEN0eF9BQkNfZXF1aXYuc2V0SWQoc2VydmljZUdyb3VwTmFtZV9BQkMpOwotCi0gICAgICAgIHNydkN0eF9BX2VxdWl2ID0gc3J2R3JwQ3R4X0FCQ19lcXVpdi5nZXRTZXJ2aWNlQ29udGV4dChheGlzU3J2X0FfZXF1aXYpOwotICAgICAgICBzcnZDdHhfQl9lcXVpdiA9IHNydkdycEN0eF9BQkNfZXF1aXYuZ2V0U2VydmljZUNvbnRleHQoYXhpc1Nydl9CX2VxdWl2KTsKLSAgICAgICAgc3J2Q3R4X0NfZXF1aXYgPSBzcnZHcnBDdHhfQUJDX2VxdWl2LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTcnZfQ19lcXVpdik7Ci0KLSAgICAgICAgb3BDdHhfQTFfZXF1aXYgPSBzcnZDdHhfQV9lcXVpdi5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbl9RTmFtZV9BMSk7Ci0gICAgICAgIG9wQ3R4X0EyX2VxdWl2ID0gc3J2Q3R4X0FfZXF1aXYuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25fUU5hbWVfQTIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBtZXNzYWdlIGNvbnRleHQgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgbXNnQ3R4X0ExXzFfc2F2ZSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X0ExX3NhdmUsIHNhdmVDb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpOwotICAgICAgICBtc2dDdHhfQTFfMl9zYXZlID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTFfc2F2ZSwgc2F2ZUNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuT1VUX0ZMT1cpOwotICAgICAgICBtc2dDdHhfQTJfc2F2ZSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X0EyX3NhdmUsIHNhdmVDb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5JTl9GTE9XKTsKLQotICAgICAgICBtc2dDdHhfQTFfMV9lcXVpdiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X0ExX2VxdWl2LCBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpOwotICAgICAgICBtc2dDdHhfQTFfMl9lcXVpdiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KG9wQ3R4X0ExX2VxdWl2LCBlcXVpdkNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0Lk9VVF9GTE9XKTsKLSAgICAgICAgbXNnQ3R4X0EyX2VxdWl2ID0gY3JlYXRlTWVzc2FnZUNvbnRleHQob3BDdHhfQTJfZXF1aXYsIGVxdWl2Q29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb3RoZXIgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGV4ZWN1dGVkSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KE9wZXJhdGlvbkNvbnRleHQgb2MsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsb3dUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1jLnNldEZMT1coZmxvd1R5cGUpOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIG1jLnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0vLyAgICAgICAgbWMuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwgU3lzdGVtLm91dCk7Ci0KLSAgICAgICAgU09BUEZhY3Rvcnkgb21GYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKG9tRmFjLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBvYy5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhY3Rpb24gPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgbWMuc2V0U29hcEFjdGlvbihhY3Rpb24pOwotLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgICAgICBtYy5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1jLCBvYyk7Ci0gICAgICAgIG1jLnNldE9wZXJhdGlvbkNvbnRleHQob2MpOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gb2MuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0U2VydmljZUNvbnRleHQoc2MpOwotCi0gICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIG1jLnNldEF4aXNNZXNzYWdlKGF4aXNNZXNzYWdlKTsKLQotICAgICAgICByZXR1cm4gbWM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9vcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlOZXdDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNhdmVDVGVzdDp0ZXN0SGllcmFyY2h5TmV3Q29udGV4dCgpOiAiOwotCi0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBtc2dDdHhfQTFfMl9zYXZlOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jID0gbWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiKioqIE9yaWdpbmFsIE9wZXJhdGlvbkNvbnRleHQgbWVzc2FnZSBjb250ZXh0IHRhYmxlICoqKioiKTsKLSAgICAgICAgc2hvd01DVGFibGUob2MpOwotCi0gICAgICAgIC8vIHJ1biB0aGUgbWVzc2FnZSB0aHJvdWdoIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIG1lc3NhZ2UgY29udGV4dCB0byBnZXQgc2F2ZWQgCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICItIC0gLSBTYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQgZnJvbSB0aGUgZW5naW5lIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLQotICAgICAgICBMaW5rZWRIYXNoTWFwIG9yaWdpbmFsX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtYyk7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIqKiogT3JpZ2luaWFsIG9iamVjdCBncmFwaCAqKioqIik7Ci0gICAgICAgIHNob3dPYmplY3RHcmFwaEluZm8ob3JpZ2luYWxfb2JqZWN0X2dyYXBoKTsKLQotICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICItIC0gLSBSZXN0b3JlIHRoZSBtZXNzYWdlIGNvbnRleHQgb24gYSBzZXBhcmF0ZSBlbmdpbmUgIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMyID0gcmVzdG9yZU1lc3NhZ2VDb250ZXh0KHBlcnNpc3RlbnRTdG9yZSwgcmVzdG9yZUNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICBMaW5rZWRIYXNoTWFwIHJlc3RvcmVkX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtYzIpOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiKioqIFJlc3RvcmVkIG9iamVjdCBncmFwaCAqKioqIik7Ci0gICAgICAgIHNob3dPYmplY3RHcmFwaEluZm8ocmVzdG9yZWRfb2JqZWN0X2dyYXBoKTsKLQotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jMiA9IG1jMi5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIqKiogUmVzdG9yZWQgT3BlcmF0aW9uQ29udGV4dCBtZXNzYWdlIGNvbnRleHQgdGFibGUgKioqKiIpOwotICAgICAgICBzaG93TUNUYWJsZShvYzIpOwotCi0gICAgICAgIGJvb2xlYW4gbWNUYWJsZU1hdGNoID0gY29tcGFyZU1DVGFibGUob2MsIG9jMik7Ci0gICAgICAgIGFzc2VydFRydWUobWNUYWJsZU1hdGNoKTsKLQotICAgICAgICAvLyByZXN1bWUgdGhlIHJlc3RvcmVkIHBhdXNlZCBtZXNzYWdlIGNvbnRleHQgb24gYW4gZW5naW5lIHRoYXQgaGFzIHRoZSAKLSAgICAgICAgLy8gc2FtZSBzZXR1cCBhcyB0aGUgZW5naW5lIHdoZXJlIHRoZSBzYXZlIG9jY3VycmVkCi0gICAgICAgIC8vIGJ1dCBkb2Vzbid0IGhhdmUgdGhlIENvbnRleHQgb2JqZWN0cwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICItIC0gLSBSZXN1bWUgdGhlIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIik7Ci0gICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKG1jMik7Ci0KLSAgICAgICAgTGlua2VkSGFzaE1hcCByZXN1bWVkX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtYzIpOwotICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiKioqIFBvc3QgUmVzdW1lZCBvYmplY3QgZ3JhcGggKioqKiIpOwotICAgICAgICBzaG93T2JqZWN0R3JhcGhJbmZvKHJlc3VtZWRfb2JqZWN0X2dyYXBoKTsKLQotICAgICAgICAvLyBjb21wYXJlIG9iamVjdCBoYXNoY29kZXMgLSBleHBlY3QgZGlmZmVyZW5jZXMKLSAgICAgICAgYm9vbGVhbiBleHBlY3RGYWxzZSA9Ci0gICAgICAgICAgICAgICAgY29tcGFyZU9iamVjdEdyYXBoSW5mbyhvcmlnaW5hbF9vYmplY3RfZ3JhcGgsIHJlc3RvcmVkX29iamVjdF9ncmFwaCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGV4cGVjdEZhbHNlKTsKLQotICAgICAgICBib29sZWFuIGV4cGVjdFNhbWVPYmplY3RJZHMgPQotICAgICAgICAgICAgICAgIGNvbXBhcmVPYmplY3RHcmFwaEluZm8ob3JpZ2luYWxfb2JqZWN0X2dyYXBoLCByZXN0b3JlZF9vYmplY3RfZ3JhcGgsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RTYW1lT2JqZWN0SWRzKTsKLQotICAgICAgICBib29sZWFuIGlzU2FtZSA9IGNvbXBhcmVPYmplY3RHcmFwaEluZm8ocmVzdG9yZWRfb2JqZWN0X2dyYXBoLCByZXN1bWVkX29iamVjdF9ncmFwaCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKGlzU2FtZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2h5UmV1c2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2F2ZUNUZXN0OnRlc3RIaWVyYXJjaHlSZXVzZSgpOiAiOwotCi0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBtc2dDdHhfQTFfMV9zYXZlOwotCi0gICAgICAgIC8vIHJ1biB0aGUgbWVzc2FnZSB0aHJvdWdoIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gdGhpcyBjYXVzZXMgdGhlIG1lc3NhZ2UgY29udGV4dCB0byBnZXQgc2F2ZWQgCi0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICItIC0gLSBTYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQgZnJvbSB0aGUgZW5naW5lIC0gLSAtIC0iKTsKLSAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLQotICAgICAgICBMaW5rZWRIYXNoTWFwIG9yaWdpbmFsX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtYyk7Ci0gICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIqKiogT3JpZ2luaWFsIG9iamVjdCBncmFwaCAqKioqIik7Ci0gICAgICAgIHNob3dPYmplY3RHcmFwaEluZm8ob3JpZ2luYWxfb2JqZWN0X2dyYXBoKTsKLQotICAgICAgICBsb2cuZGVidWcodGl0bGUgKwotICAgICAgICAgICAgICAgICItIC0gLSBSZXN0b3JlIHRoZSBtZXNzYWdlIGNvbnRleHQgb24gYSBzZXBhcmF0ZSBlbmdpbmUgIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMyID0gcmVzdG9yZU1lc3NhZ2VDb250ZXh0KHBlcnNpc3RlbnRTdG9yZSwgZXF1aXZDb25maWd1cmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgTGlua2VkSGFzaE1hcCByZXN0b3JlZF9vYmplY3RfZ3JhcGggPSBnZXRPYmplY3RHcmFwaEluZm8obWMyKTsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIioqKiBSZXN0b3JlZCBvYmplY3QgZ3JhcGggKioqKiIpOwotICAgICAgICBzaG93T2JqZWN0R3JhcGhJbmZvKHJlc3RvcmVkX29iamVjdF9ncmFwaCk7Ci0KLSAgICAgICAgLy8gd2UgZG9uJ3QgdXNlIHN0cmljdCBjaGVja2luZyBoZXJlIHNpbmNlIHRoZSBlbmdpbmUgd2hlcmUgdGhlIAotICAgICAgICAvLyByZXN0b3JhdGlvbiB0YWtlcyBwbGFjZSBpcyBhICJjb3B5IiwgaWUsIHRoZXJlIGFyZSBuZXcgb2JqZWN0cwotICAgICAgICAvLyBmb3IgdGhlIHNhbWUgbmFtZXMvaWRlbnRpZmljYXRpb25zCi0gICAgICAgIGJvb2xlYW4gaGFzRXF1aXZhbGVuY2UgPQotICAgICAgICAgICAgICAgIGNvbXBhcmVPYmplY3RHcmFwaEluZm8ob3JpZ2luYWxfb2JqZWN0X2dyYXBoLCByZXN0b3JlZF9vYmplY3RfZ3JhcGgsIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoYXNFcXVpdmFsZW5jZSk7Ci0KLSAgICAgICAgLy8gZ2V0IGFuIG9iamVjdCBncmFwaCBmcm9tIGFuIGVxdWl2YWxlbnQgbWVzc2FnZSBjb250ZXh0IG9uIHRoZSBzZXBhcmF0ZSBlbmdpbmUKLSAgICAgICAgLy8gd2Ugd291bGQgZXhwZWN0IGEgc3RyaWN0IG1hdGNoIG9mIHRoZSBvYmplY3QgZ3JhcGhzIGJldHdlZW4gdGhlIAotICAgICAgICAvLyByZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQgYW5kIHRoZSBtZXNzYWdlIGNvbnRleHQgb24gdGhlIHNlcGFyYXRlIGVuZ2luZQotICAgICAgICBMaW5rZWRIYXNoTWFwIHNlcGFyYXRlX29iamVjdF9ncmFwaCA9IGdldE9iamVjdEdyYXBoSW5mbyhtc2dDdHhfQTFfMV9lcXVpdik7Ci0KLSAgICAgICAgLy8gY29tcGFyZSB0aGUgcmVzdG9yZWQgb2JqZWN0IGdyYXBoIHdpdGggdGhlIGV4aXN0aW5nIG9iamVjdCBncmFwaAotICAgICAgICBib29sZWFuIGV4cGVjdFN0cmljdCA9Ci0gICAgICAgICAgICAgICAgY29tcGFyZU9iamVjdEdyYXBoSW5mbyhyZXN0b3JlZF9vYmplY3RfZ3JhcGgsIHNlcGFyYXRlX29iamVjdF9ncmFwaCwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZXhwZWN0U3RyaWN0KTsKLQotICAgICAgICAvLyByZXN1bWUgdGhlIHJlc3RvcmVkIHBhdXNlZCBtZXNzYWdlIGNvbnRleHQgb24gYW4gZW5naW5lIHRoYXQgaGFzIHRoZSAKLSAgICAgICAgLy8gc2FtZSBzZXR1cCBhcyB0aGUgZW5naW5lIHdoZXJlIHRoZSBzYXZlIG9jY3VycmVkCi0gICAgICAgIC8vIGFuZCBzYXZlIGhhcyB0aGUgU2VydmljZS1sZXZlbCBDb250ZXh0IG9iamVjdHMKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAiLSAtIC0gUmVzdW1lIHRoZSByZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOwotICAgICAgICBBeGlzRW5naW5lLnJlc3VtZShtYzIpOwotCi0gICAgICAgIExpbmtlZEhhc2hNYXAgcmVzdW1lZF9vYmplY3RfZ3JhcGggPSBnZXRPYmplY3RHcmFwaEluZm8obWMyKTsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIioqKiBQb3N0IFJlc3VtZWQgb2JqZWN0IGdyYXBoICoqKioiKTsKLSAgICAgICAgc2hvd09iamVjdEdyYXBoSW5mbyhyZXN1bWVkX29iamVjdF9ncmFwaCk7Ci0KLSAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZXMgaW4gdGhlIG9iamVjdCBncmFwaCBpbiBvdXIgY2FzZSBhZnRlciB0aGUgcmVzdW1lCi0gICAgICAgIGhhc0VxdWl2YWxlbmNlID0gY29tcGFyZU9iamVjdEdyYXBoSW5mbyhyZXN0b3JlZF9vYmplY3RfZ3JhcGgsIHJlc3VtZWRfb2JqZWN0X2dyYXBoLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoYXNFcXVpdmFsZW5jZSk7Ci0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmVzIGEgcHJldmlvdXNseSBzYXZlZCBtZXNzYWdlIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgcmVzdG9yZU1lc3NhZ2VDb250ZXh0KEZpbGUgcmVzdG9yZUZpbGUsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJyZXN0b3JlTWVzc2FnZUNvbnRleHQoKTogIjsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXN0b3JlZE1DID0gbnVsbDsKLQotICAgICAgICBGaWxlIHRoZUZpbGUgPSByZXN0b3JlRmlsZTsKLSAgICAgICAgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQotICAgICAgICAvLyB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IHRvIHVzZSBmb3IgbWVzc2FnZSBjb250ZXh0IGFjdGl2YXRpb24KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2ZnQ3R4ID0gY2M7Ci0KLSAgICAgICAgYm9vbGVhbiByZXN0b3JlZE9rID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCh0aGVGaWxlICE9IG51bGwpICYmICh0aGVGaWxlLmV4aXN0cygpKSkgewotICAgICAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgYSBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVkT2sgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gKE1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dDIuYWN0aXZhdGUoY2ZnQ3R4KTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vdyBwdXQgdGhlIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCBpbiB0aGUgZ2xvYmFsCi0gICAgICAgICAgICAgICAgLy8gdmFyaWFibGUgZm9yIHRoZSB0ZXN0IAotICAgICAgICAgICAgICAgIHJlc3RvcmVkTUMgPSBtc2dDb250ZXh0MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIHdpdGggcmVzdG9yaW5nIG1lc3NhZ2UgY29udGV4dCA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkT2spOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IHN1Y2NlZWRlZCwKLSAgICAgICAgICAgIC8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0gICAgICAgICAgICBib29sZWFuIHJlbW92ZVRtcEZpbGUgPSByZXN0b3JlZE9rOwotICAgICAgICAgICAgaWYgKHJlbW92ZVRtcEZpbGUpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdG9yZWRNQzsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcCBnZXRPYmplY3RHcmFwaEluZm8oTWVzc2FnZUNvbnRleHQgbXNnQ3R4KSB7Ci0gICAgICAgIGlmIChtc2dDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFNQyA9IG51bGw7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YU9DID0gbnVsbDsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhU0MgPSBudWxsOwotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFTR0MgPSBudWxsOwotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFDQyA9IG51bGw7Ci0gICAgICAgIE1ldGFEYXRhRW50cnkgbWV0YUFPID0gbnVsbDsKLSAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhQVMgPSBudWxsOwotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFBU0cgPSBudWxsOwotICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFBQyA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIGtleU1DID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleU9DID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleVNDID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGtleVNHQyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBrZXlDQyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBrZXlBTyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBrZXlBUyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBrZXlBU0cgPSBudWxsOwotICAgICAgICBTdHJpbmcga2V5QUMgPSBudWxsOwotCi0gICAgICAgIExpbmtlZEhhc2hNYXAgb2JqSW5mbyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBpZGVudGlmaWNhdGlvbiBpbmZvIGFib3V0IHRoZSBwcmltYXJ5IG9iamVjdHMgaW4gdGhlIG9iamVjdCBncmFwaAotICAgICAgICAvLyAgICAgY2xhc3MgbmFtZQotICAgICAgICAvLyAgICAgbmFtZSBzdHJpbmcKLSAgICAgICAgLy8gICAgIGhhc2hjb2RlIHN0cmluZwotCi0gICAgICAgIC8vIG1lc3NhZ2UgY29udGV4dAotICAgICAgICBrZXlNQyA9IG1zZ0N0eC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgbWV0YU1DID0gbmV3IE1ldGFEYXRhRW50cnkoa2V5TUMsIG1zZ0N0eC5nZXRNZXNzYWdlSUQoKSwgIlsiICsgbXNnQ3R4Lmhhc2hDb2RlKCkgKyAiXSIpOwotICAgICAgICBvYmpJbmZvLnB1dChrZXlNQywgbWV0YU1DKTsKLQotICAgICAgICAvLyBvcGVyYXRpb24gY29udGV4dAotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jID0gbXNnQ3R4LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAga2V5T0MgPSBvYy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgbWV0YU9DID0gbmV3IE1ldGFEYXRhRW50cnkoa2V5T0MsIG9jLmdldE9wZXJhdGlvbk5hbWUoKSwgIlsiICsgb2MuaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleU9DLCBtZXRhT0MpOwotCi0gICAgICAgIC8vIHNlcnZpY2UgY29udGV4dAotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzYyA9IG1zZ0N0eC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBrZXlTQyA9IHNjLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhU0MgPSBuZXcgTWV0YURhdGFFbnRyeShrZXlTQywgc2MuZ2V0TmFtZSgpLCAiWyIgKyBzYy5oYXNoQ29kZSgpICsgIl0iKTsKLSAgICAgICAgb2JqSW5mby5wdXQoa2V5U0MsIG1ldGFTQyk7Ci0KLSAgICAgICAgLy8gc2VydmljZSBncm91cCBjb250ZXh0Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gbXNnQ3R4LmdldFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAga2V5U0dDID0gc2djLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhU0dDID0gbmV3IE1ldGFEYXRhRW50cnkoa2V5U0dDLCBzZ2MuZ2V0SWQoKSwgIlsiICsgc2djLmhhc2hDb2RlKCkgKyAiXSIpOwotICAgICAgICBvYmpJbmZvLnB1dChrZXlTR0MsIG1ldGFTR0MpOwotCi0gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IG1zZ0N0eC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBrZXlDQyA9IGNjLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhQ0MgPSBuZXcgTWV0YURhdGFFbnRyeShrZXlDQywgbnVsbCwgIlsiICsgY2MuaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleUNDLCBtZXRhQ0MpOwotCi0gICAgICAgIC8vIGF4aXMgb3BlcmF0aW9uCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYW8gPSBtc2dDdHguZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBrZXlBTyA9IGFvLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBtZXRhQU8gPSBuZXcgTWV0YURhdGFFbnRyeShrZXlBTywgYW8uZ2V0TmFtZSgpLnRvU3RyaW5nKCksICJbIiArIGFvLmhhc2hDb2RlKCkgKyAiXSIpOwotICAgICAgICBvYmpJbmZvLnB1dChrZXlBTywgbWV0YUFPKTsKLQotICAgICAgICAvLyBheGlzIHNlcnZpY2UKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBtc2dDdHguZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAga2V5QVMgPSBhcy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgbWV0YUFTID0gbmV3IE1ldGFEYXRhRW50cnkoa2V5QVMsIGFzLmdldE5hbWUoKSwgIlsiICsgYXMuaGFzaENvZGUoKSArICJdIik7Ci0gICAgICAgIG9iakluZm8ucHV0KGtleUFTLCBtZXRhQVMpOwotCi0gICAgICAgIC8vIGF4aXMgc2VydmljZSBncm91cAotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGFzZyA9IG1zZ0N0eC5nZXRBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgIGtleUFTRyA9IGFzZy5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgbWV0YUFTRyA9IG5ldyBNZXRhRGF0YUVudHJ5KGtleUFTRywgYXNnLmdldFNlcnZpY2VHcm91cE5hbWUoKSwgIlsiICsgYXNnLmhhc2hDb2RlKCkgKyAiXSIpOwotICAgICAgICBvYmpJbmZvLnB1dChrZXlBU0csIG1ldGFBU0cpOwotCi0gICAgICAgIC8vIGF4aXMgY29uZmlndXJhdGlvbgotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGtleUFDID0gYWMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgIG1ldGFBQyA9IG5ldyBNZXRhRGF0YUVudHJ5KGtleUFDLCBudWxsLCAiWyIgKyBhYy5oYXNoQ29kZSgpICsgIl0iKTsKLSAgICAgICAgb2JqSW5mby5wdXQoa2V5QUMsIG1ldGFBQyk7Ci0KLSAgICAgICAgcmV0dXJuIG9iakluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0d28gbWFwcGluZ3MgY29udGFpbmluZyBvYmplY3QgZ3JhcGggaW5mby4KLSAgICAgKiBUaGlzIHVzZXMgdGhlIGNsYXNzIG5hbWUgYW5kIG9iamVjdCBJRC4KLSAgICAgKiA8cC8+Ci0gICAgICogU3RyaWN0IGNvbXBhcmlzb24gaW5jbHVkZXMgdGhlIG9iamVjdCBoYXNoIGNvZGVzLiBJZgotICAgICAqIHlvdSBleHBlY3QgdGhlIHNhbWUgb2JqZWN0IHRvIGJlIHJlcHJlc2VudGVkIGluCi0gICAgICogYm90aCBtYXBzLCB5b3UgbWF5IHdhbnQgdG8gdXNlIFN0cmljdCBjaGVja2luZy4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFwMSAgIFRoZSBmaXJzdCBvYmplY3QgZ3JhcGggaW5mbyBtYXAKLSAgICAgKiBAcGFyYW0gbWFwMiAgIFRoZSBzZWNvbmQgb2JqZWN0IGdyYXBoIGluZm8gbWFwCi0gICAgICogQHBhcmFtIHN0cmljdCBUUlVFIGlmIHN0cmljdCBjb21wYXJpc29uCi0gICAgICogQHJldHVybiBPdXRjb21lIG9mIHRoZSBjb21wYXJpc29uOiBUUlVFIGlmIGVxdWl2YWxlbnQsIEZBTFNFIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlT2JqZWN0R3JhcGhJbmZvKExpbmtlZEhhc2hNYXAgbWFwMSwgTGlua2VkSGFzaE1hcCBtYXAyLCBib29sZWFuIHN0cmljdCkgewotICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTYXZlQ1Rlc3Q6IGNvbXBhcmVPYmplY3RHcmFwaEluZm8oKTogIjsKLQotICAgICAgICBpZiAoKG1hcDEgIT0gbnVsbCkgJiYgKG1hcDIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmIChtYXAxLnNpemUoKSAhPSBtYXAyLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJPYmplY3QgZ3JhcGggaW5mbyBtYXBwaW5ncyBhcmUgZGlmZmVyZW50IHNpemVzLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBtYXAxLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUga2V5IGlzIHRoZSBjbGFzcyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIHNraXAgY2VydGFpbiBvYmplY3RzLCB0aG9zZSB3aWxsIGFsd2F5cyBiZSB1bmlxdWUKLSAgICAgICAgICAgICAgICBpZiAoKGtleS5pbmRleE9mKCJNZXNzYWdlQ29udGV4dCIpID09IC0xKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGtleS5pbmRleE9mKCJPcGVyYXRpb25Db250ZXh0IikgPT0gLTEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoa2V5LmluZGV4T2YoIkNvbmZpZ3VyYXRpb25Db250ZXh0IikgPT0gLTEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoa2V5LmluZGV4T2YoIkF4aXNDb25maWd1cmF0aW9uIikgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNsYXNzIG5hbWVzIGxpc3RlZCBhYm92ZSB3ZXJlIG5vdCBmb3VuZAotICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIG90aGVyIG9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSB2YWx1ZTEgPSAoTWV0YURhdGFFbnRyeSkgbWFwMS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSB2YWx1ZTIgPSAoTWV0YURhdGFFbnRyeSkgbWFwMi5nZXQoa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlMSAhPSBudWxsKSAmJiAodmFsdWUyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgb2JqZWN0IGlkZW50aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTEgPSB2YWx1ZTEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUyID0gdmFsdWUyLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuYW1lMSAhPSBudWxsKSAmJiAobmFtZTIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZTEuZXF1YWxzKG5hbWUyKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAibmFtZTEgWyIgKyBuYW1lMSArICJdICAhPSAgIG5hbWUyIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lMiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChuYW1lMSA9PSBudWxsKSAmJiAobmFtZTIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvawotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJuYW1lMSBbIiArIG5hbWUxICsgIl0gICE9ICAgbmFtZTIgWyIgKyBuYW1lMiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdHJpY3QgdGVzdGluZyBtZWFucyBjaGVja2luZyB0aGUgb2JqZWN0IGhhc2hjb2Rlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGlzIG9wdGlvbiB3aGVuIHlvdSBleHBlY3QgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgaW4gdGhlIG1hcC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29kZTEgPSB2YWx1ZTEuZ2V0RXh0cmFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvZGUyID0gdmFsdWUyLmdldEV4dHJhTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjb2RlMSAhPSBudWxsKSAmJiAoY29kZTIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUxLmVxdWFscyhjb2RlMikgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJuYW1lIFsiICsgbmFtZTEgKyAiXSAgY29kZTEgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMSArICJdICAhPSAgIGNvZGUyIFsiICsgY29kZTIgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY29kZTEgPT0gbnVsbCkgJiYgKGNvZGUyID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm5hbWUgWyIgKyBuYW1lMSArICJdY29kZTEgWyIgKyBjb2RlMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gICE9ICAgY29kZTIgWyIgKyBjb2RlMiArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHZhbHVlMSA9PSBudWxsKSAmJiAodmFsdWUyID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvawotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJ2YWx1ZTEgWyIgKyB2YWx1ZTEgKyAiXSAgIT0gICB2YWx1ZTIgWyIgKyB2YWx1ZTIgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB9IGVsc2UgaWYgKChtYXAxID09IG51bGwpICYmIChtYXAyID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJtaXNtYXRjaDogb25lIG9yIG1vcmUgb2YgdGhlIG1hcHMgYXJlIG51bGwuICAiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgc2hvd09iamVjdEdyYXBoSW5mbyhMaW5rZWRIYXNoTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1ldGFDbGFzc05hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGEgPSAoTWV0YURhdGFFbnRyeSkgbWFwLmdldChtZXRhQ2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgaWYgKG1ldGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBtZXRhLmdldENsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0YS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhc2hjb2RlID0gbWV0YS5nZXRFeHRyYU5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2xhc3NbIiArIGNsYXNzbmFtZSArICJdICBpZFsiICsgbmFtZSArICJdICBoYXNoY29kZSIgKyBoYXNoY29kZSArICIgIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZU1DVGFibGUoT3BlcmF0aW9uQ29udGV4dCBvYzEsIE9wZXJhdGlvbkNvbnRleHQgb2MyKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJjb21wYXJlTUNUYWJsZTogIjsKLQotICAgICAgICBpZiAoKG9jMSAhPSBudWxsKSAmJiAob2MyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBIYXNoTWFwIG1jVGFibGUxID0gb2MxLmdldE1lc3NhZ2VDb250ZXh0cygpOwotICAgICAgICAgICAgSGFzaE1hcCBtY1RhYmxlMiA9IG9jMi5nZXRNZXNzYWdlQ29udGV4dHMoKTsKLQotICAgICAgICAgICAgaWYgKChtY1RhYmxlMSAhPSBudWxsKSAmJiAobWNUYWJsZTIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCFtY1RhYmxlMS5pc0VtcHR5KCkpICYmICghbWNUYWJsZTIuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZTEgPSBtY1RhYmxlMS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplMiA9IG1jVGFibGUyLnNpemUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZTEgIT0gc2l6ZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUmV0dXJuIEZBTFNFOiAgdGFibGUgc2l6ZXMgZG9uJ3QgbWF0Y2ggICBzaXplMVsiICsgc2l6ZTEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAhPSBzaXplMiBbIiArIHNpemUyICsgIl0gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdDEgPSBtY1RhYmxlMS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5MSA9IChTdHJpbmcpIGl0MS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSAoTWVzc2FnZUNvbnRleHQpIG1jVGFibGUxLmdldChrZXkxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMiA9IChNZXNzYWdlQ29udGV4dCkgbWNUYWJsZTIuZ2V0KGtleTEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1jMSAhPSBudWxsKSAmJiAobWMyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIElEcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZDEgPSBtYzEuZ2V0TWVzc2FnZUlEKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkMiA9IG1jMi5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWQxICE9IG51bGwpICYmIChpZDIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZDEuZXF1YWxzKGlkMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUmV0dXJuIEZBTFNFOiAgbWVzc2FnZSBJRHMgZG9uJ3QgbWF0Y2ggICBpZDFbIiArIGlkMSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICE9IGlkMiBbIiArIGlkMiArICJdICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaWQxID09IG51bGwpICYmIChpZDIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgdGVsbCwga2VlcCBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSZXR1cm4gRkFMU0U6ICBtZXNzYWdlIElEcyBkb24ndCBtYXRjaCAgIGlkMVsiICsgaWQxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAhPSBpZDIgWyIgKyBpZDIgKyAiXSAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobWMxID09IG51bGwpICYmIChtYzIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgKyAiIFJldHVybiBGQUxTRTogIG1lc3NhZ2UgY29udGV4dCBvYmplY3RzIGRvbid0IG1hdGNoICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIFRSVUU6ICBtZXNzYWdlIGNvbnRleHQgdGFibGVzIG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtY1RhYmxlMS5pc0VtcHR5KCkgJiYgbWNUYWJsZTIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIFRSVUU6ICBtZXNzYWdlIGNvbnRleHQgdGFibGVzIGFyZSBib3RoIGVtcHR5ICIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiIFJldHVybiBGQUxTRTogIG1lc3NhZ2UgY29udGV4dCB0YWJsZXMgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1jVGFibGUxID09IG51bGwpICYmIChtY1RhYmxlMiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIFRSVUU6ICBtZXNzYWdlIGNvbnRleHQgdGFibGVzIGFyZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIEZBTFNFOiAgbWVzc2FnZSBjb250ZXh0IHRhYmxlcyBkb24ndCBtYXRjaCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgob2MxID09IG51bGwpICYmIChvYzIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICIgUmV0dXJuIFRSVUU6ICBvcGVyYXRpb24gY29udGV4dCBvYmplY3RzIGFyZSBudWxsICIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiIFJldHVybiBGQUxTRTogIG9wZXJhdGlvbiBjb250ZXh0IG9iamVjdHMgZG9uJ3QgbWF0Y2ggIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgc2hvd01DVGFibGUoT3BlcmF0aW9uQ29udGV4dCBvYykgewotICAgICAgICBpZiAob2MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSGFzaE1hcCBtY1RhYmxlID0gb2MuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0KLSAgICAgICAgaWYgKChtY1RhYmxlID09IG51bGwpIHx8IChtY1RhYmxlLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbWNUYWJsZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IChNZXNzYWdlQ29udGV4dCkgbWNUYWJsZS5nZXQoa2V5KTsKLQotICAgICAgICAgICAgaWYgKG1jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBtYy5nZXRNZXNzYWdlSUQoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm1lc3NhZ2UgY29udGV4dCB0YWJsZSBlbnRyeTogICBsYWJlbCBbIiArIGtleSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSAgICBtZXNzYWdlIElEIFsiICsgaWQgKyAiXSAgICAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG8gVGhlIGhhbmRsZXIgb2JqZWN0Ci0gICAgICogQHJldHVybiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGVyLAotICAgICAqICAgICAgICAgLTEgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0SGFuZGxlcklEKE9iamVjdCBvKSB7Ci0gICAgICAgIGludCBpZCA9IC0xOwotCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGVtcEhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlkID0gKChUZW1wSGFuZGxlcikgbykuZ2V0SGFuZGxlcklEKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gSGFuZGxlciBjbGFzc2VzIAotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogUGF1c2VzIGFuZCBzYXZlcyB0aGUgbWVzc2FnZSBjb250ZXh0IHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgU2F2ZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIEludGVnZXIgaGFuZGxlcklEID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybVNhdmUgPSB0cnVlOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlZE9rID0gZmFsc2U7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBjb25zdHJ1Y3RvcnMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBTYXZlSGFuZGxlcigpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlcklEID0gbmV3IEludGVnZXIoLTUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNhdmVIYW5kbGVyKGludCBpbmRleCwgRmlsZSBzYXZlRmlsZSwgYm9vbGVhbiBkb0l0KSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihuZXcgU3RyaW5nKCJoYW5kbGVyIiArIGluZGV4KSkpOwotICAgICAgICAgICAgdGhlRmlsZSA9IHNhdmVGaWxlOwotICAgICAgICAgICAgcGVyZm9ybVNhdmUgPSBkb0l0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBtZXRob2RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEhhbmRsZXJJRCgpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVySUQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVySUQuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIC01OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiU2F2ZUhhbmRsZXJbIiArIGdldEhhbmRsZXJJRCgpICsgIl06aW52b2tlKCk6ICI7Ci0gICAgICAgICAgICBzYXZlZE9rID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmIChwZXJmb3JtU2F2ZSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJDb25maWd1cmVkIGZvciBubyBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIm1zZ0NvbnRleHQucGF1c2UoKSIpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5wYXVzZSgpOwotCi0gICAgICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIlJlc2V0dGluZyB0aGUgZmlsZSB0byB1c2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImVycm9yIGNyZWF0aW5nIG5ldyBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlLmV4aXN0cygpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZE9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkT2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5zYXZlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIiArIGZpbGVzaXplICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gICB0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXJyb3Igd2l0aCBzYXZpbmcgbWVzc2FnZSBjb250ZXh0ID0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzYXZlZE9rKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgImV4ZWN1dGVkSGFuZGxlcnMuYWRkKCIgKyBoYW5kbGVySUQgKyAiKSIpOwotICAgICAgICAgICAgZXhlY3V0ZWRIYW5kbGVycy5hZGQoaGFuZGxlcklEKTsKLQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHVibGljIGNsYXNzIFRlbXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBJbnRlZ2VyIGhhbmRsZXJJRCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbnVtYmVyUHJvcGVydGllcyA9IDM7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5S2V5ID0gIlByb3BlcnR5IjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9ICJTZXJ2aWNlTGV2ZWxTZXR0aW5nIjsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcigtNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIoaW50IGluZGV4KSB7Ci0gICAgICAgICAgICB0aGlzLmhhbmRsZXJJRCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihuZXcgU3RyaW5nKCJoYW5kbGVyIiArIGluZGV4KSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKGludCBpbmRleCwgaW50IG51bWJlcikgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVySUQgPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24obmV3IFN0cmluZygiaGFuZGxlciIgKyBpbmRleCkpKTsKLSAgICAgICAgICAgIG51bWJlclByb3BlcnRpZXMgPSBudW1iZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG1ldGhvZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlcklEKCkgewotICAgICAgICAgICAgaWYgKGhhbmRsZXJJRCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJJRC5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLTU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIlRlbXBIYW5kbGVyWyIgKyBnZXRIYW5kbGVySUQoKSArICJdOmludm9rZSgpOiAiOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHNlcnZpY2UgY29udGV4dCBmcm9tIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc2VydmljZSBjb250ZXh0IGZyb20gdGhlIG9wZXJhdGlvbiBjb250ZXh0Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBvcGVyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1iZXJQcm9wZXJ0aWVzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG5ldyBTdHJpbmcocHJvcGVydHlLZXkgKyAiLklEWyIgKyBnZXRIYW5kbGVySUQoKSArICJdLiIgKyBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5ldyBTdHJpbmcocHJvcGVydHlWYWx1ZSArICJbIiArIGNvdW50ICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiZXhlY3V0ZWRIYW5kbGVycy5hZGQoIiArIGhhbmRsZXJJRCArICIpIik7Ci0gICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChoYW5kbGVySUQpOwotCi0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTg5ZjAzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlbGZNYW5hZ2VkRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0LmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgYm9vbGVhbiBzYXZlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0gICAgYm9vbGVhbiByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gbmV3IFN0cmluZygiTnVsbFNlcnZpY2VHcm91cCIpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIk51bGxTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJEdW1teU9wIik7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0NvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbnVsbDsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0MiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQzID0gbnVsbDsKLSAgICBwcml2YXRlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjIgPSBudWxsOwotICAgIHByaXZhdGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFRlbXBIYW5kbGVyMDEgaGFuZGxlcjAxOwotICAgIHByaXZhdGUgVGVtcEhhbmRsZXIwMiBoYW5kbGVyMDI7Ci0gICAgcHJpdmF0ZSBUZW1wSGFuZGxlcjAyIHN1YmhhbmRsZXI7ICAvLyB0aGlzIGhhbmRsZXIgaXMgaW50ZW5kZWQgdG8gYmUgYSBmZXcgbGV2ZWxzIGRvd24gaW4gZXhlY3V0aW9uQ2hhaW4KLSAgICBwcml2YXRlIFRlbXBIYW5kbGVyMDMgaGFuZGxlcjAzOwotICAgIHByaXZhdGUgVGVtcEhhbmRsZXIwNCBoYW5kbGVyMDQ7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTE7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTI7Ci0gICAgcHJpdmF0ZSBQaGFzZSBwaGFzZTM7Ci0gICAgcHJpdmF0ZSBQaGFzZSBzdWJQaGFzZTsKLQotICAgIC8vIHVzZSB0aGlzIHRvIGNvdW50IGhvdyBtYW55IHRpbWVzIG1ldGhvZHMgZ2V0IGNhbGxlZCBmb3IgYSBwYXJ0aWN1bGFyIHRlc3QKLSAgICBwcml2YXRlIGludCBpbnZva2VjYWxsY291bnQgPSAwOwotCi0gICAgLy8ga2V5LXZhbHVlIHBhaXJzIHRvIGJlIHVzZWQgZm9yIHNlbGYgbWFuYWdlZCBkYXRhCi0KLSAgICBwcml2YXRlIFN0cmluZyBrZXkwMSA9ICJrZXkwMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGVzdERhdGEwMSA9ICJUZW1wSGFuZGxlcjAxXzAxIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTAyID0gImtleTAyIjsKLSAgICBwcml2YXRlIFN0cmluZyB0ZXN0RGF0YTAyID0gIlRlbXBIYW5kbGVyMDFfMDIiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5MDMgPSAia2V5MDMiOwotICAgIHByaXZhdGUgYnl0ZSBbXSB0ZXN0RGF0YTAzID0gezB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsIDB4MDEsCi0gICAgICAgICAgICAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTA0ID0gImtleTA0IjsKLSAgICBwcml2YXRlIGxvbmcgW10gdGVzdERhdGEwNCA9IHswTCwgMUwsIC02NjAxNjY0MjAwNjczMDYzNTMxTCwgLTc3NTM2MzcwODgyNTczOTE4NThMfTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGtleTA1ID0gImtleTA1IjsKLSAgICBwcml2YXRlIGludCB0ZXN0RGF0YTA1ID0gMTIzNDU2OwotCi0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgICAgICBpbml0QWxsKCk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0QWxsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJlcGFyZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OmluaXRBbGw6ICBlcnJvciBpbiBzZXR0aW5nIHVwIG9iamVjdCBncmFwaCBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIwMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyMDEgPSBuZXcgVGVtcEhhbmRsZXIwMSgxMDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIwMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyMDIgPSBuZXcgVGVtcEhhbmRsZXIwMigxMDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIwMyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyMDMgPSBuZXcgVGVtcEhhbmRsZXIwMygxMDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIwNCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyMDQgPSBuZXcgVGVtcEhhbmRsZXIwNCgxMDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN1YmhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgc3ViaGFuZGxlciA9IG5ldyBUZW1wSGFuZGxlcjAyKDEwMDApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8vCi0gICAgLy8gcHJlcGFyZSB0aGUgb2JqZWN0IGhpZXJhcmNoeSBmb3IgdGVzdGluZwotICAgIC8vCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgY2ZnQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlndXJhdGlvbik7Ci0KLSAgICAgICAgY2ZnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcigKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiLCBuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotCi0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLQotICAgICAgICBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIGFiZCA9IG5ldyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIGFiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgcnVkID0gbmV3IFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgcnVkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBzYWJkID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc2FiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciBzbWJkID0gbmV3IFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzbWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKGFiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihydWQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc2FiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzbWJkKTsKLQotICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBheGlzU2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBheGlzU2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoIlNlcnZpY2VHcm91cFRlc3QiKTsKLQotCi0gICAgICAgIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotCi0gICAgICAgIGF4aXNPcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgTWVzc2FnZVJlY2VpdmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpLCBheGlzT3BlcmF0aW9uKTsKLQotCi0gICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgY2ZnQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoIlNlcnZpY2VHcm91cENvbnRleHRUZXN0Iik7Ci0KLSAgICAgICAgc2VydmljZUNvbnRleHQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgdHJhbnNwb3J0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydE91dDIgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImhhcHB5Iik7Ci0gICAgICAgIHRyYW5zcG9ydE91dDMgPSBuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImdvbHVja3kiKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0LnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydE91dDIuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0T3V0My5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Myk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQyKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0KLSAgICAgICAgdHJhbnNwb3J0SW4gPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigibnVsbCIpOwotICAgICAgICB0cmFuc3BvcnRJbjIgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigiYWx3YXlzIik7Ci0gICAgICAgIHRyYW5zcG9ydEluMyA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJ0aGViZXN0Iik7Ci0gICAgICAgIHRyYW5zcG9ydEluLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbjIuc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydEluMy5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4yKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjMpOwotCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAgICogCi0gICAgICogc2V0VXAgZ2V0cyBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCogbWV0aG9kLiAgSW4gdGhpcyBjbGFzcywgYSBuZXcKLSAgICAgKiBNZXNzYWdlQ29udGV4dCBvYmplY3QgaXMgY3JlYXRlZCBmb3IgZWFjaCB0ZXN0KiBtZXRob2QuICBUaGUgdGVzdCoKLSAgICAgKiBtZXRob2RzIGFyZSByZXNwb25zaWJsZSBmb3IgYWRkaW5nIHdoaWNoZXZlciBoYW5kbGVyIHRoZXkgbWF5IG5lZWQKLSAgICAgKiBpbiBvcmRlciB0byBydW4gdGhlIGRlc2lyZWQgdGVzdC4gIFNlZSB0aGUgaGFuZGxlciBjbGFzcyBjb21tZW50cwotICAgICAqIGZvciB0aGVpciByZXNwZWN0aXZlIGZ1bmN0aW9ucy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL29yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0KLSAgICAgICAgaW52b2tlY2FsbGNvdW50ID0gMDsKLQotICAgICAgICBtYyA9IGNmZ0NvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBTeXN0ZW0ub3V0KTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBvbUZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgbWMuc2V0RW52ZWxvcGUob21GYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotCi0gICAgICAgIHBoYXNlMSA9IG5ldyBQaGFzZSgiMSIpOwotICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMigwKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDEpKTsKLQotICAgICAgICBwaGFzZTIgPSBuZXcgUGhhc2UoIjIiKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDIoMikpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihoYW5kbGVyMDIpOwotICAgICAgICBwaGFzZTIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMigzKSk7Ci0KLSAgICAgICAgcGhhc2UzID0gbmV3IFBoYXNlKCIzIik7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDQpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIoc3ViaGFuZGxlcik7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKGhhbmRsZXIwMik7ICAvLyBzYW1lIGluc3RhbmNlLCBzZWNvbmQgaW5zZXJ0aW9uCi0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDUpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiAgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKLSAgICAgICAgICogSWRlYWxseSBpbnNlcnRpbmcgc3ViUGhhc2UgaGVyZSB3b3VsZCBtYWtlIHRoZSBheGlzMiBlbmdpbmUgY2FsbAotICAgICAgICAgKiB0aGUgaW52b2tlIG9mIG5lc3RlZCBzdWJoYW5kbGVyLiAgSXQgZG9lcyBub3QgZG8gdGhpcy4gIFBsZWFzZSBzZWUgdGhlCi0gICAgICAgICAqIHdhcm5pbmcgYXQgYm90dG9tIG9mIHRlc3RQYXVzZTA2IG1ldGhvZC4KLSAgICAgICAgICovCi0gICAgICAgIHN1YlBoYXNlID0gbmV3IFBoYXNlKCJzdWIiKTsKLSAgICAgICAgc3ViUGhhc2UuYWRkSGFuZGxlcihzdWJoYW5kbGVyKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIoc3ViUGhhc2UpOwotICAgICAgICBwaGFzZTMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMig2KSk7Ci0gICAgICAgIHBoYXNlMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDcpKTsKLQotICAgICAgICBheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTEpOwotICAgICAgICBheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTIpOwotICAgICAgICBheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmFkZChwaGFzZTMpOwotCi0KLSAgICAgICAgbWMuc2V0TWVzc2FnZUlEKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLQotICAgICAgICAvL29wZXJhdGlvbkNvbnRleHQuYWRkTWVzc2FnZUNvbnRleHQobWMpOyAgZ2V0cyBkb25lIHZpYSB0aGUgcmVnaXN0ZXIKLSAgICAgICAgYXhpc09wZXJhdGlvbi5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobWMsIG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICBtYy5zZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICBtYy5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlQ29udGV4dCk7Ci0KLSAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLQotICAgICAgICBtYy5zZXRXU0FBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG1jLnNldFNvYXBBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB0ZXN0IGNhc2VzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIC8qKgotICAgICAqIFRlc3QgY2FzZSBmb3Igc2V0dGluZyBhbmQgcmVtb3ZpbmcgZGF0YSBmcm9tIGEgbWVzc2FnZSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGZNYW5hZ2VkRGF0YTAxKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFNlbGZNYW5hZ2VkRGF0YTAxKCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyMDEpOwotICAgICAgICAgICAgY2ZnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChoYW5kbGVycyk7Ci0KLSAgICAgICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLQotICAgICAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEVxdWFscyh0ZXN0RGF0YTAxLCBoYW5kbGVyMDEuZ2V0VGVzdERhdGEwMUZyb21NZXNzYWdlQ29udGV4dChtYykpOwotICAgICAgICBhc3NlcnRFcXVhbHModGVzdERhdGEwMiwgaGFuZGxlcjAxLmdldFRlc3REYXRhMDJGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLQotICAgICAgICBib29sZWFuIGlzT2szID0gaXNFcXVhbHModGVzdERhdGEwMywgaGFuZGxlcjAxLmdldFRlc3REYXRhMDNGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc09rMyk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc09rNCA9IGlzRXF1YWxzKHRlc3REYXRhMDQsIGhhbmRsZXIwMS5nZXRUZXN0RGF0YTA0RnJvbU1lc3NhZ2VDb250ZXh0KG1jKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNPazQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbnZva2VjYWxsY291bnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3Igc2V0dGluZywgc2F2aW5nLCByZXN0b3Jpbmcgc2VsZiBtYW5hZ2VkIGRhdGEgd2l0aCBubyBleGNlcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdXNlMDFfbm9FeGNlcHRpb25zKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDFfbm9FeGNlcHRpb25zKCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMik7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYW55IGV4Y2VwdGlvbnMgZHVyaW5nIHNhdmUvcmVzdG9yZSwgdGhlc2Ugd2lsbCBiZSB0cnVlCi0gICAgICAgIGFzc2VydFRydWUoc2F2ZWRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbnZva2VjYWxsY291bnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgdmVyaWZ5aW5nIHRoZSBzZWxmIG1hbmFnZWQgZGF0YSB1c2VkIGR1cmluZyB0aGUgc2F2ZSBhbmQgcmVzdG9yZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZTAyX3NhdmVSZXN0b3JlU2VsZk1hbmFnZWREYXRhKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDJfc2F2ZVJlc3RvcmVTZWxmTWFuYWdlZERhdGEoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBoYW5kbGVycy5hZGQoaGFuZGxlcjAyKTsKLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2goaGFuZGxlcnMpOwotCi0gICAgICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICAgICAgbWMuc2V0V1NBQWN0aW9uKCJEdW1teU9wIik7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkYXRhIGluIG91ciBoYW5kbGVyIGdvdCByZXN0b3JlZAotICAgICAgICBhc3NlcnRFcXVhbHMoaGFuZGxlcjAyLnRlc3REYXRhLCBoYW5kbGVyMDIuZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3Igc2F2ZSBhbmQgcmVzdG9yZSBvZiBzZWxmIG1hbmFnZWQgZGF0YSBhbmQgdGhlIEF4aXNPcGVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2UwM19zYXZlUmVzdG9yZU9wZXJhdGlvbigpIHsKLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RQYXVzZTAzX3NhdmVSZXN0b3JlT3BlcmF0aW9uKCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMik7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb3BlcmF0aW9uIGdvdCByZXN0b3JlZCBpbiB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25OYW1lLnRvU3RyaW5nKCksIG1jLmdldEF4aXNPcGVyYXRpb24oKS5nZXROYW1lKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbnZva2VjYWxsY291bnQpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBzYXZlIGFuZCByZXN0b3JlIG9mIHNlbGYgbWFuYWdlZCBkYXRhIGFuZCB0aGUgQXhpc1NlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2UwNF9zYXZlUmVzdG9yZUF4aXNTZXJ2aWNlKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDRfc2F2ZVJlc3RvcmVBeGlzU2VydmljZSgpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyMDIpOwotICAgICAgICAgICAgY2ZnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChoYW5kbGVycyk7Ci0KLSAgICAgICAgICAgIG1jLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiYXhpczIvc2VydmljZXMvTnVsbFNlcnZpY2UiKSk7Ci0gICAgICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLQotICAgICAgICAgICAgQXhpc0VuZ2luZS5yZWNlaXZlKG1jKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHNlcnZpY2UgZ290IHJlc3RvcmVkIGluIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VOYW1lLnRvU3RyaW5nKCksIG1jLmdldEF4aXNTZXJ2aWNlKCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW52b2tlY2FsbGNvdW50KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHNhdmUgYW5kIHJlc3RvcmUgb2Ygc2VsZiBtYW5hZ2VkIGRhdGEgYW5kIHRoZSBBeGlzU2VydmljZUdyb3VwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhdXNlMDVfc2F2ZVJlc3RvcmVBeGlzU2VydmljZUdyb3VwKCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFBhdXNlMDVfc2F2ZVJlc3RvcmVBeGlzU2VydmljZUdyb3VwKCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMik7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzZXJ2aWNlR3JvdXAgZ290IHJlc3RvcmVkIGluIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QKLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoc2VydmljZUdyb3VwTmFtZS50b1N0cmluZygpLCBtYy5nZXRBeGlzU2VydmljZUdyb3VwKCkuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBwaGFzZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2UwNl9zYXZlUmVzdG9yZVBoYXNlcygpIHsKLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RQYXVzZTA2X3NhdmVSZXN0b3JlUGhhc2VzKCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICBUZW1wSGFuZGxlcjAyIGhhbmRsZXJBID0gbmV3IFRlbXBIYW5kbGVyMDIoNjY2KTsKLQotICAgICAgICBQaGFzZSBwaGFzZTYwMSA9IG5ldyBQaGFzZSgiMDEiKTsKLSAgICAgICAgcGhhc2U2MDEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMig2MSkpOyAvLyBzbG90IDEKLSAgICAgICAgcGhhc2U2MDEuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMyg2MikpOyAvLyBzbG90IDIKLQotICAgICAgICBQaGFzZSBwaGFzZTYwMiA9IG5ldyBQaGFzZSgiMDIiKTsKLSAgICAgICAgcGhhc2U2MDIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMig2MykpOyAvLyBzbG90IDMKLSAgICAgICAgcGhhc2U2MDIuYWRkSGFuZGxlcihoYW5kbGVyQSk7ICAgICAgICAgICAgICAvLyBzbG90IDQKLSAgICAgICAgcGhhc2U2MDIuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMyg2NCkpOyAvLyBzbG90IDUKLQotICAgICAgICBQaGFzZSBwaGFzZTYwMyA9IG5ldyBQaGFzZSgiMDMiKTsKLSAgICAgICAgcGhhc2U2MDMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMig2NSkpOyAvLyBzbG90IDYKLSAgICAgICAgcGhhc2U2MDMuYWRkSGFuZGxlcihzdWJoYW5kbGVyKTsgICAgICAgICAgICAvLyBzbG90IDcKLSAgICAgICAgcGhhc2U2MDMuYWRkSGFuZGxlcihoYW5kbGVyQSk7ICAgICAgICAgICAgICAvLyBzbG90IDggLSBzYW1lIGluc3RhbmNlLCBzZWNvbmQgaW5zZXJ0aW9uCi0gICAgICAgIHBoYXNlNjAzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyMDMoNjYpKTsgLy8gc2xvdCA5Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCi0gICAgICAgICAqIElkZWFsbHkgaW5zZXJ0aW5nIHN1YlBoYXNlIGhlcmUgd291bGQgbWFrZSB0aGUgYXhpczIgZW5naW5lIGNhbGwKLSAgICAgICAgICogdGhlIGludm9rZSBvZiBuZXN0ZWQgc3ViaGFuZGxlci4gIEl0IGRvZXMgbm90IGRvIHRoaXMuICAKLSAgICAgICAgICogUGxlYXNlIHNlZSB0aGUgd2FybmluZyBsYXRlciBpbiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICovCi0gICAgICAgIFBoYXNlIHN1YlBoYXNlNjAxID0gbmV3IFBoYXNlKCJzdWI2Iik7Ci0gICAgICAgIHN1YlBoYXNlNjAxLmFkZEhhbmRsZXIoc3ViaGFuZGxlcik7Ci0gICAgICAgIHBoYXNlNjAzLmFkZEhhbmRsZXIoc3ViUGhhc2U2MDEpOyAgICAgICAgICAgLy8gc2xvdCAxMAotICAgICAgICBwaGFzZTYwMy5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcjAyKDY3KSk7IC8vIHNsb3QgMTEKLSAgICAgICAgcGhhc2U2MDMuYWRkSGFuZGxlcihuZXcgVGVtcEhhbmRsZXIwMyg2OCkpOyAvLyBzbG90IDEyCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBwaGFzZXMuYWRkKHBoYXNlNjAxKTsKLSAgICAgICAgICAgIHBoYXNlcy5hZGQocGhhc2U2MDIpOwotICAgICAgICAgICAgcGhhc2VzLmFkZChwaGFzZTYwMyk7Ci0KLSAgICAgICAgICAgIGNmZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5zZXRJblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2gocGhhc2VzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgcGhhc2UgbGlzdHMgYW5kIHNlZSBpZiB0aGV5IG1hdGNoIHVwCi0gICAgICAgIEFycmF5TGlzdCByZXN0b3JlZFBoYXNlcyA9IG1jLmdldEV4ZWN1dGlvbkNoYWluKCk7Ci0gICAgICAgIGludCBpdF9jb3VudCA9IDA7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSByZXN0b3JlZFBoYXNlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvLyB3ZSBrbm93IGV2ZXJ5dGhpbmcgYXQgdGhpcyBsZXZlbCBpcyBhIFBoYXNlLiAgCi0gICAgICAgICAgICAvLyBpZiB5b3UgY2hhbmdlIGl0LCB5b3UgbWlnaHQgZ2V0IGEgQ2xhc3NDYXN0RXhjZXB0aW9uIAotICAgICAgICAgICAgUGhhc2UgcmVzdG9yZWRfcGhhc2UgPSAoUGhhc2UpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgUGhhc2Ugb3JpZ2luYWxfcGhhc2UgPSBudWxsOwotCi0gICAgICAgICAgICBpdF9jb3VudCsrOwotCi0gICAgICAgICAgICBpZiAoaXRfY291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIG9yaWdpbmFsX3BoYXNlID0gcGhhc2U2MDE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGl0X2NvdW50ID09IDIpIHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbF9waGFzZSA9IHBoYXNlNjAyOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpdF9jb3VudCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxfcGhhc2UgPSBwaGFzZTYwMzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9jb21wYXJlUGhhc2VzKHJlc3RvcmVkX3BoYXNlLmdldEhhbmRsZXJzKCkuaXRlcmF0b3IoKSwgb3JpZ2luYWxfcGhhc2UuZ2V0SGFuZGxlcnMoKSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNPayA9IGNvbXBhcmVQaGFzZXMocmVzdG9yZWRfcGhhc2UsIG9yaWdpbmFsX3BoYXNlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCi0gICAgICAgIC8vIFRoZSBheGlzMiBlbmdpbmUgaXMgbm90IGNhbGxpbmcgdGhlIGludm9rZSBvbiBuZXN0ZWQgaGFuZGxlcnMhICAKLSAgICAgICAgLy8gVGhlIHdheSB0aGlzIHRlc3RjYXNlIHdvcmtzIGlzIHRoYXQgdGhlIGhhbmRsZXIncyBpbnZva2UoKSBtZXRob2QgaXMgCi0gICAgICAgIC8vIHdoYXQgc2V0cyB0aGUgZGF0YS4gIFNvLCBhbnkgaGFuZGxlcnMgdGhhdCBhcmUgaW4gc3ViUGhhc2Ugd2lsbCAKLSAgICAgICAgLy8gbm90IGdldCBjYWxsZWQsIGFuZCB0aHVzIHdpbGwgbm90IHNldCBvciByZXN0b3JlIGFueSBkYXRhLiAgCi0gICAgICAgIC8vIE5vdGljZSB3ZSBkbyBjdXJyZW50bHkgaGF2ZSBhIHN1YmhhbmRsZXIgaW4gdGhlIHN1YlBoYXNlIG9iamVjdC4KLSAgICAgICAgLy8gV2hlbiBheGlzMiBkZWNpZGVzIHRvIHN1cHBvcnQgbmVzdGVkIGhhbmRsZXJzLCB0aGUKLSAgICAgICAgLy8gZmlyc3QgdGhyZWUgYXNzZXJ0RXF1YWxzIGJlbG93IHdpbGwgZmFpbC4KLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RQYXVzZTA2X3NhdmVSZXN0b3JlUGhhc2VzKCk6OiAgaW52b2tlY2FsbGNvdW50IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZWNhbGxjb3VudCArICJdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMSwgaW52b2tlY2FsbGNvdW50KTsKLQotICAgICAgICAvLyBldmVuIHRob3VnaCB0aGVyZSBhcmUgdHdvIG9jY3VycmFuY2VzIG9mIHRoZSBzYW1lIGluc3RhbmNlIG9mCi0gICAgICAgIC8vIGhhbmRsZXJBIGluIHRoZSBleGVjdXRpb25DaGFpbiwgaXRzIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgCi0gICAgICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciB1bmlxdWUgaW5zdGFuY2UgaW4gdGhlIGxpc3QKLSAgICAgICAgaW50IGNvdW50X3MgPSBoYW5kbGVyQS5nZXRTZXJpYWxpemVjYWxsY291bnQoKTsKLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RQYXVzZTA2X3NhdmVSZXN0b3JlUGhhc2VzKCk6OiAgaGFuZGxlckEgc2VyaWFsaXplIGNhbGwgY291bnQgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcyArICJdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMSwgY291bnRfcyk7Ci0KLSAgICAgICAgLy8gaGVyZSBjb21lcyBzb21lIGZ1biBtYXRoLi4uCi0gICAgICAgIC8vIFNpbmNlIGEgaGFuZGxlciAoVGVtcEhhbmRsZXIwMikgaW4gdGhpcyBjYXNlIAotICAgICAgICAvLyBkb2Vzbid0IGFkZCBhbnkgZGF0YSB1bnRpbCBpdHMgaW52b2tlIG1ldGhvZCBnZXRzIGNhbGxlZCwgCi0gICAgICAgIC8vIGFuZCB0aGUgaW52b2tlIGlzIHdoYXQgY2F1c2VzIHRoZSBzYXZlL3Jlc3RvcmUgKGFuZCB0aHVzIAotICAgICAgICAvLyB0aGUgc2VyaWFsaXplL2Rlc2VyaWFsaXplKSB0aGVyZSBpcyBubyBkYXRhIGZvciBoYW5kbGVyQSAKLSAgICAgICAgLy8gdG8gZGVzZXJpYWxpemUgdW50aWwgdGhlIGZpcnN0IG9jY3VyYW5jZSBvZiBoYW5kbGVyQSAKLSAgICAgICAgLy8gaW52b2tlIGlzIGNhbGxlZCBpbiB0aGUgZXhlY3V0aW9uQ2hhaW4uICBPYnNlcnZpbmcgb3VyIHBoYXNlcywgCi0gICAgICAgIC8vIHdlIHNlZSBpdCBpcyBpbiBzbG90ICMzLiAgMTEgLSAzID0gOAotICAgICAgICBpbnQgY291bnRfZCA9IGhhbmRsZXJBLmdldERlc2VyaWFsaXplY2FsbGNvdW50KCk7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0UGF1c2UwNl9zYXZlUmVzdG9yZVBoYXNlcygpOjogIGhhbmRsZXJBIGRlc2VyaWFsaXplIGNhbGwgY291bnQgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfZCArICJdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4LCBjb3VudF9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1YmhhbmRsZXIudGVzdERhdGEsIHN1YmhhbmRsZXIuZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3Igc2F2ZSBhbmQgcmVzdG9yZSBvZiBiaW5hcnkgc2VsZiBtYW5hZ2VkIGRhdGEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZk1hbmFnZWREYXRhMDcoKSB7Ci0gICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojp0ZXN0U2VsZk1hbmFnZWREYXRhMDcoKT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwMyk7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNPazMgPSBpc0VxdWFscyh0ZXN0RGF0YTAzLCAoYnl0ZSBbXSkgaGFuZGxlcjAzLmdldFRlc3REYXRhRnJvbU1lc3NhZ2VDb250ZXh0KG1jKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXNPazMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbnZva2VjYWxsY291bnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGVzdCBmb3IgaGFuZGxlcjA0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGZNYW5hZ2VkRGF0YTA4KCkgewotICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6dGVzdFNlbGZNYW5hZ2VkRGF0YTA4KCk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwNCk7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc09rNCA9IGlzRXF1YWxzKHRlc3REYXRhMDQsIChsb25nIFtdKSBoYW5kbGVyMDQuZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc09rNCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUZXN0IGZvciBoYW5kbGVyMDMgYW5kIGhhbmRsZXIwNAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxmTWFuYWdlZERhdGEwOSgpIHsKLSAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OnRlc3RTZWxmTWFuYWdlZERhdGEwOSgpPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdCBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyMDMpOwotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIwNCk7Ci0gICAgICAgICAgICBjZmdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc2V0SW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoKGhhbmRsZXJzKTsKLQotICAgICAgICAgICAgbWMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJheGlzMi9zZXJ2aWNlcy9OdWxsU2VydmljZSIpKTsKLSAgICAgICAgICAgIG1jLnNldFdTQUFjdGlvbigiRHVtbXlPcCIpOwotCi0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobWMpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc09rMyA9IGlzRXF1YWxzKHRlc3REYXRhMDMsIChieXRlIFtdKSBoYW5kbGVyMDMuZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc09rMyk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc09rNCA9IGlzRXF1YWxzKHRlc3REYXRhMDQsIChsb25nIFtdKSBoYW5kbGVyMDQuZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQobWMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpc09rNCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGludm9rZWNhbGxjb3VudCk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gaW50ZXJuYWwgaGVscGVyIG1ldGhvZHMKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBjb250ZXh0IHRvIGEgdGVtcG9yYXJ5Ci0gICAgICogZmlsZSwgdGhlbiByZXN0b3JlcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYzEgICAgICBUaGUgbWVzc2FnZSBjb250ZXh0IG9iamVjdCB0byBzYXZlCi0gICAgICogQHBhcmFtIGZucHJlZml4IEEgcHJlZml4IGZvciB0aGUgZmlsZW5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICogQHBhcmFtIGRlc2MgICAgIFRleHQgdGhhdCBkZXNjcmliZXMgdGhlIGNhbGxlcidzIHNpdHVhdGlvbgotICAgICAqIEByZXR1cm4gVGhlIHJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dCBvYmplY3Qgb3IgTlVMTAotICAgICAqLwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgc2F2ZUFuZFJlc3RvcmUoTWVzc2FnZUNvbnRleHQgbWMxLCBTdHJpbmcgZm5wcmVmaXgsIFN0cmluZyBkZXNjKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6c2F2ZUFuZFJlc3RvcmU6OlsiICsgZGVzYyArICJdICAgIjsKLSAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoZm5wcmVmaXgsIG51bGwpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgInRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZS5nZXROYW1lKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAic2F2aW5nIG1lc3NhZ2UgY29udGV4dCAuLi4uIik7Ci0gICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG1jMSk7Ci0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBubyBleGNlcHRpb25zLCBzZXQgc2F2ZWRNZXNzYWdlQ29udGV4dCB0byB0cnVlCi0gICAgICAgICAgICAgICAgc2F2ZWRNZXNzYWdlQ29udGV4dCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dCAuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJyZXN0b3JpbmcgbWVzc2FnZSBjb250ZXh0IC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWRNZXNzYWdlQ29udGV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQyID0gKE1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgaW5PYmpTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQyLmFjdGl2YXRlKG1jMS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIG5vIGV4Y2VwdGlvbnMsIHNldCByZXN0b3JlZE1lc3NhZ2VDb250ZXh0IHRvIHRydWUKLSAgICAgICAgICAgICAgICByZXN0b3JlZE1lc3NhZ2VDb250ZXh0ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8vIFZFUlkgSU1QT1JUQU5UOiByZXBsYWNlIHRlc3RjYXNlJ3MgbWVzc2FnZWNvbnRleHQgb2JqZWN0IHdpdGggdGhlIG5ldyByZXN0b3JlZCBvbmUKLSAgICAgICAgICAgICAgICBtYyA9IG1zZ0NvbnRleHQyOwotCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIi4uLi5yZXN0b3JlZCBtZXNzYWdlIGNvbnRleHQgLi4uLi4iKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2F2ZWRNZXNzYWdlQ29udGV4dCAhPSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJFcnJvciB3aXRoIHNhdmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICJFcnJvciB3aXRoIHJlc3RvcmluZyBtZXNzYWdlIGNvbnRleHQgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IHN1Y2NlZWRlZCwKLSAgICAgICAgICAgIC8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0gICAgICAgICAgICBib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZE1lc3NhZ2VDb250ZXh0ICYmIHJlc3RvcmVkTWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtc2dDb250ZXh0MjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlciBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbyBUaGUgaGFuZGxlciBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIsCi0gICAgICogICAgICAgICAtMSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRIYW5kbGVySUQoT2JqZWN0IG8pIHsKLSAgICAgICAgaW50IGlkID0gLTE7Ci0KLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUZW1wSGFuZGxlcjAxKSB7Ci0gICAgICAgICAgICBpZCA9ICgoVGVtcEhhbmRsZXIwMSkgbykuZ2V0SUQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgVGVtcEhhbmRsZXIwMikgewotICAgICAgICAgICAgaWQgPSAoKFRlbXBIYW5kbGVyMDIpIG8pLmdldElEKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFRlbXBIYW5kbGVyMDMpIHsKLSAgICAgICAgICAgIGlkID0gKChUZW1wSGFuZGxlcjAzKSBvKS5nZXRJRCgpOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBUZW1wSGFuZGxlcjA0KSB7Ci0gICAgICAgICAgICBpZCA9ICgoVGVtcEhhbmRsZXIwNCkgbykuZ2V0SUQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBoYW5kbGVyIG9iamVjdHMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbzEgVGhlIGZpcnN0IGhhbmRsZXIKLSAgICAgKiBAcGFyYW0gbzIgVGhlIHNlY29uZCBoYW5kbGVyCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBoYW5kbGVyIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsCi0gICAgICogICAgICAgICBGQUxTRSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZUhhbmRsZXJzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICAgIGlmICgobzEgPT0gbnVsbCkgJiYgKG8yID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobzEgIT0gbnVsbCkgJiYgKG8yICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYzEgPSBvMS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjMiA9IG8yLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoYzEuZXF1YWxzKGMyKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZWNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBjbGFzcyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjMSArICJdIG1hdGNoICIpOwotCi0gICAgICAgICAgICAgICAgaW50IGlkMSA9IGdldEhhbmRsZXJJRChvMSk7Ci0gICAgICAgICAgICAgICAgaW50IGlkMiA9IGdldEhhbmRsZXJJRChvMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaWQxID09IGlkMikgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2Vjb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6Y29tcGFyZUhhbmRsZXJzOiAgaWQgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMSArICJdIG1hdGNoIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZWNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0Ojpjb21wYXJlSGFuZGxlcnM6ICBpZDEgWyIgKyBpZDEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICE9IGlkMiBbIiArIGlkMiArICJdICIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1lc3NhZ2Vjb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6Y29tcGFyZUhhbmRsZXJzOiAgY2xhc3MxIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMxICsgIl0gIT0gY2xhc3MyIFsiICsgYzIgKyAiXSAgICIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdHdvIHBoYXNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvMSBUaGUgZmlyc3QgcGhhc2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIG8yIFRoZSBzZWNvbmQgcGhhc2Ugb2JqZWN0Ci0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBwaGFzZXMgYXJlIGVxdWl2YWxlbnQsCi0gICAgICogICAgICAgICBGQUxTRSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY29tcGFyZVBoYXNlcyhPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICBpZiAoKG8xID09IG51bGwpICYmIChvMiA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCgobzEgIT0gbnVsbCkgJiYgKG8yICE9IG51bGwpKQotICAgICAgICAgICAgICAgICAgICAmJiAoKG8xIGluc3RhbmNlb2YgUGhhc2UpICYmIChvMiBpbnN0YW5jZW9mIFBoYXNlKSkKLSAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgICAgICAgICAgUGhhc2UgcDEgPSAoUGhhc2UpIG8xOwotICAgICAgICAgICAgICAgIFBoYXNlIHAyID0gKFBoYXNlKSBvMjsKLQotICAgICAgICAgICAgICAgIExpc3QgbGlzdDEgPSBwMS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgICAgIExpc3QgbGlzdDIgPSBwMi5nZXRIYW5kbGVycygpOwotCi0gICAgICAgICAgICAgICAgaWYgKChsaXN0MSA9PSBudWxsKSAmJiAobGlzdDIgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKChsaXN0MSAhPSBudWxsKSAmJiAobGlzdDIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNpemUxID0gbGlzdDEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZTIgPSBsaXN0Mi5zaXplKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUxICE9IHNpemUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemUxOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmoxID0gbGlzdDEuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajIgPSBsaXN0Mi5nZXQoaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob2JqMSA9PSBudWxsKSAmJiAob2JqMiA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChvYmoxICE9IG51bGwpICYmIChvYmoyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVjayA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iajEgaW5zdGFuY2VvZiBQaGFzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGNvbXBhcmVQaGFzZXMob2JqMSwgb2JqMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgPSBjb21wYXJlSGFuZGxlcnMob2JqMSwgb2JqMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZSBjb21wYXJpc29uIGNvbXBsZXRlZCBvawotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgbWF0Y2gKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNvbWUgZXJyb3IKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0vKgotICAgIHByaXZhdGUgdm9pZCBjb21wYXJlUGhhc2VzKEl0ZXJhdG9yIGl0LCBBcnJheUxpc3QgYWwpCi0gICAgewotICAgICAgICBpbnQgaXRfY291bnQgPSAtMTsKLQotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpdF9jb3VudCsrOwotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpaXQubmV4dCgpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBQaGFzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21wYXJlUGhhc2VzKCgoUGhhc2UpaGFuZGxlcikuZ2V0SGFuZGxlcnMoKS5pdGVyYXRvcigpLCAoKFBoYXNlKWFsLmdldChpdF9jb3VudCkpLmdldEhhbmRsZXJzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhoYW5kbGVyLCAoVGVtcEhhbmRsZXIwMilhbC5nZXQoaXRfY291bnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotKi8KLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGludGVybmFsIGhhbmRsZXJzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAgIC8qCi0gICAgICogVGVtcEhhbmRsZXIwMSBzaW1wbHkgc2V0cyBhbmQvb3IgcmVtb3ZlcyBkYXRhIGZyb20gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlcjAxIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgaWQgPSAtMjsKLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwMSgpIHsKLSAgICAgICAgICAgIGlkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwMShpbnQgaWQpIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdERhdGEwMUZyb21NZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBfbWMpIHsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXN0RGF0YTAyRnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIF9tYy5nZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYnl0ZSBbXSBnZXRUZXN0RGF0YTAzRnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgcmV0dXJuIChieXRlIFtdKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgW10gZ2V0VGVzdERhdGEwNEZyb21NZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBfbWMpIHsKLSAgICAgICAgICAgIHJldHVybiAobG9uZyBbXSkgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTA0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHdlJ3JlIGp1c3QgdXNpbmcgdGhlIGludm9rZSB0byBzZXQvY2hhbmdlL3JlbW92ZSBkYXRhCi0gICAgICAgICAqIFRlc3RzOgotICAgICAgICAgKiBmb3Iga2V5MDE6ICBzZXQsIHJlbW92ZSwgc2V0LCBnZXQKLSAgICAgICAgICogZm9yIGtleTAyOiAgc2V0LCBnZXQsIHNldAotICAgICAgICAgKiBmb3Iga2V5MDM6ICBzZXQsIHJlbW92ZSwgc2V0LCBnZXQKLSAgICAgICAgICogZm9yIGtleTA0OiAgc2V0LCBnZXQsIHNldCwgZ2V0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBfbWMpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICJUZW1wSGFuZGxlcjAxW2lkPSIgKyBpZCArICJdLmludm9rZSgpIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRtcCA9ICJ3aGFhYT8iOwotICAgICAgICAgICAgX21jLnNldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAyLCB0bXApOwotICAgICAgICAgICAgU3RyaW5nIGRhdGEyID0gKFN0cmluZykgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0bXAsIGRhdGEyKTsKLQotICAgICAgICAgICAgX21jLnNldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAxLCB0ZXN0RGF0YTAxKTsKLSAgICAgICAgICAgIF9tYy5yZW1vdmVTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMSk7Ci0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDEsIHRlc3REYXRhMDEpOwotICAgICAgICAgICAgU3RyaW5nIGRhdGExID0gKFN0cmluZykgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIGtleTAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhMSwgdGVzdERhdGEwMSk7Ci0KLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMiwgdGVzdERhdGEwMik7Ci0KLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMywgdGVzdERhdGEwMyk7Ci0gICAgICAgICAgICBieXRlIFtdIGRhdGEzID0gKGJ5dGUgW10pIF9tYy5nZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMyk7Ci0gICAgICAgICAgICBib29sZWFuIGlzT2szID0gaXNFcXVhbHMoZGF0YTMsIHRlc3REYXRhMDMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpc09rMyk7Ci0KLSAgICAgICAgICAgIF9tYy5yZW1vdmVTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBrZXkwMyk7Ci0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDMsIHRlc3REYXRhMDMpOwotCi0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDQsIHRlc3REYXRhMDQpOwotICAgICAgICAgICAgbG9uZyBbXSBkYXRhNCA9IChsb25nIFtdKSBfbWMuZ2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwga2V5MDQpOwotICAgICAgICAgICAgYm9vbGVhbiBpc09rNCA9IGlzRXF1YWxzKGRhdGE0LCB0ZXN0RGF0YTA0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPazQpOwotCi0gICAgICAgICAgICBpbnZva2VjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogQ29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVGVtcEhhbmRsZXIwMiBzZXRzIGRhdGEsIHNhdmVzIGl0ICh2aWEgdGhlIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSBtZXRob2QKLSAgICAgKiBjYWxsZWQgYnkgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCB3aGVuIHNhdmVkIGluIHRoaXMgaGFuZGxlcidzIGludm9rZSgpKSwKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgVGVtcEhhbmRsZXIwMiBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIgewotICAgICAgICBwcml2YXRlIGludCBpZCA9IC0yOwotICAgICAgICBwcml2YXRlIGludCBzZXJpYWxpemVjYWxsY291bnQgPSAwOwotICAgICAgICBwcml2YXRlIGludCBkZXNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdERhdGEgPSBuZXcgU3RyaW5nKCJ0aGlzIGlzIHNvbWUgdGVzdCBkYXRhIik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogY29uc3RydWN0b3IKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUZW1wSGFuZGxlcjAyKCkgewotICAgICAgICAgICAgdGhpcy5pZCA9IC0xOwotICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVjYWxsY291bnQgPSAwOwotICAgICAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBjb25zdHJ1Y3RvcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyMDIoaW50IGlkKSB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciNpbnZva2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgKiAKLSAgICAgICAgICogVGhpcyBpbnZva2UoKSBtZXRob2Qgd2lsbCB0ZXN0IHNldmVyYWwgdGhpbmdzOgotICAgICAgICAgKiAxLiAgdmVyaWZ5IHRoYXQgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIGlzIGFjdHVhbGx5IGNhbGxlZCB3aGVuIHNhdmluZyB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAqIDIuICB2ZXJpZnkgdGhhdCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSBpcyBhY3R1YWxseSBjYWxsZWQgd2hlbiByZXN0b3JpbmcgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdAotICAgICAgICAgKiAzLiAgdmVyaWZ5IHRoYXQgYW55IFNlbGZNYW5hZ2VkRGF0YSBzdG9yZWQgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IGlzIHByb3Blcmx5IHNhdmVkL3Jlc3RvcmVkICh2aWEgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhL2Rlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgX21jKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDJbaWQ9IiArIGlkICsgIl0uaW52b2tlKCkiOwotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6IiArIGRlc2M7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0MiA9IG51bGw7ICAvLyB0aGlzIHdpbGwgYmUgdGhlIHJlc3RvcmVkIG9uZQotCi0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3REYXRhICsgSW50ZWdlci50b1N0cmluZyhpZCkpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiAgIFNldHRpbmcgc2VsZiBtYW5hZ2VkIGRhdGEgdXNpbmcga2V5IFsiICsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhpZCkgKyAiXSIpOwotCi0gICAgICAgICAgICBtc2dDb250ZXh0MiA9IHNhdmVBbmRSZXN0b3JlKF9tYywgIlRlbXBIYW5kbGVyMDJfIiwgZGVzYyk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKG1zZ0NvbnRleHQyICE9IG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQpOwotCi0gICAgICAgICAgICBpbnZva2VjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogQ29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShCeXRlQXJyYXlJbnB1dFN0cmVhbSBkYXRhLCBNZXNzYWdlQ29udGV4dCBfbWMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGRlc2VyaWFsaXplY2FsbGNvdW50Kys7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDJbaWQ9IiArIGlkICsgIl0uZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKSAgIGNvdW50IFsiICsKLSAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVjYWxsY291bnQgKyAiXSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShkYXRhKTsKLSAgICAgICAgICAgIHRlc3REYXRhID0gb2lzLnJlYWRVVEYoKS5jb25jYXQoIiB3aXRoIGV4dHJhIHRleHQgIiArIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSwgdGVzdERhdGEpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXN0b3JlVHJhbnNpZW50RGF0YShNZXNzYWdlQ29udGV4dCBfbWMpIHsKLSAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gdGVzdAotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShNZXNzYWdlQ29udGV4dCBfbWMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICJUZW1wSGFuZGxlcjAyW2lkPSIgKyBpZCArICJdLnNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpICAgY291bnQgWyIgKwotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVjYWxsY291bnQgKyAiXSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzdG9yZWRUZXN0RGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIF9tYy5nZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSk7Ci0gICAgICAgICAgICBpZiAoc3RvcmVkVGVzdERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArICI6ICBObyBzZWxmIG1hbmFnZWQgZGF0YSB0byBzZXJpYWxpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKLSAgICAgICAgICAgIG9vcy53cml0ZVVURihzdG9yZWRUZXN0RGF0YSk7Ci0gICAgICAgICAgICBvb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIGludCBiYW9zX3NpemUgPSBiYW9zLnNpemUoKTsKLSAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogc2F2ZWQgc2VsZiBtYW5hZ2VkIGRhdGEgc3RyaW5nIGxlbmd0aCBbIiArCi0gICAgICAgICAgICAgICAgICAgIHN0b3JlZFRlc3REYXRhLmxlbmd0aCgpICsgIl0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgICAgICI6IHNhdmVkIHNlbGYgbWFuYWdlZCBkYXRhIGJ5dGUgYXJyYXkgb3V0cHV0IHN0cmVhbSAoVVRGKSBsZW5ndGggWyIgKwotICAgICAgICAgICAgICAgICAgICBiYW9zX3NpemUgKyAiXSIpOwotICAgICAgICAgICAgcmV0dXJuIGJhb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldERlc2VyaWFsaXplY2FsbGNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplY2FsbGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRTZXJpYWxpemVjYWxsY291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplY2FsbGNvdW50OwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFRlbXBIYW5kbGVyMDMgc2V0cyBiaW5hcnkgZGF0YSwgc2F2ZXMgaXQgKHZpYSB0aGUgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIG1ldGhvZAotICAgICAqIGNhbGxlZCBieSB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0IHdoZW4gc2F2ZWQgaW4gdGhpcyBoYW5kbGVyJ3MgaW52b2tlKCkpLAotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlcjAzIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgU2VsZk1hbmFnZWREYXRhTWFuYWdlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IGlkID0gLTI7Ci0gICAgICAgIHByaXZhdGUgaW50IHNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0gICAgICAgIHByaXZhdGUgaW50IGRlc2VyaWFsaXplY2FsbGNvdW50ID0gMDsKLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwMygpIHsKLSAgICAgICAgICAgIGlkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwMyhpbnQgaWQpIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICByZXR1cm4gX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciNpbnZva2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgKiAKLSAgICAgICAgICogVGhpcyBpbnZva2UoKSBtZXRob2Qgd2lsbCB0ZXN0IHNldmVyYWwgdGhpbmdzOgotICAgICAgICAgKiAxLiAgdmVyaWZ5IHRoYXQgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIGlzIGFjdHVhbGx5IGNhbGxlZCB3aGVuIHNhdmluZyB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAqIDIuICB2ZXJpZnkgdGhhdCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSBpcyBhY3R1YWxseSBjYWxsZWQgd2hlbiByZXN0b3JpbmcgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdAotICAgICAgICAgKiAzLiAgdmVyaWZ5IHRoYXQgYW55IFNlbGZNYW5hZ2VkRGF0YSBzdG9yZWQgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IGlzIHByb3Blcmx5IHNhdmVkL3Jlc3RvcmVkICh2aWEgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhL2Rlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgX21jKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSAiVGVtcEhhbmRsZXIwM1tpZD0iICsgaWQgKyAiXS5pbnZva2UoKSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gbnVsbDsgIC8vIHRoaXMgd2lsbCBiZSB0aGUgcmVzdG9yZWQgb25lCi0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgYnl0ZSBbXSBvZiBkYXRhCi0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCksIHRlc3REYXRhMDMpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiAgIFNldHRpbmcgc2VsZiBtYW5hZ2VkIGRhdGEgdXNpbmcga2V5IFsiICsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhpZCkgKyAiXSIpOwotCi0gICAgICAgICAgICBtc2dDb250ZXh0MiA9IHNhdmVBbmRSZXN0b3JlKF9tYywgIlRlbXBIYW5kbGVyMDNfIiwgZGVzYyk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKG1zZ0NvbnRleHQyICE9IG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQpOwotCi0gICAgICAgICAgICBpbnZva2VjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogQ29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoQnl0ZUFycmF5SW5wdXRTdHJlYW0gZGF0YSwgTWVzc2FnZUNvbnRleHQgX21jKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBib29sZWFuIGlzT0sgPSB0cnVlOwotCi0gICAgICAgICAgICBkZXNlcmlhbGl6ZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICJUZW1wSGFuZGxlcjAzW2lkPSIgKyBpZCArICJdLmRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgICBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplY2FsbGNvdW50ICsgIl0iOwotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6IiArIGRlc2M7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSB0ZXN0RGF0YTAzLmxlbmd0aDsKLQotICAgICAgICAgICAgYnl0ZSBbXSB0bXAgPSBuZXcgYnl0ZSBbZXhwZWN0ZWRdOwotCi0gICAgICAgICAgICBib29sZWFuIGtlZXBHb2luZyA9IHRydWU7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoa2VlcEdvaW5nKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRtcGRhdGEgPSBkYXRhLnJlYWQoKTsKLQotICAgICAgICAgICAgICAgIGlmICh0bXBkYXRhICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBuZXcgSW50ZWdlcih0bXBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgdG1wW2luZGV4XSA9IHZhbHVlLmJ5dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGlzT0spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAga2VlcEdvaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpc09LID0gaXNFcXVhbHModG1wLCB0ZXN0RGF0YTAzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoaXNPSyk7Ci0KLSAgICAgICAgICAgIF9tYy5zZXRTZWxmTWFuYWdlZERhdGEodGhpcy5nZXRDbGFzcygpLCBJbnRlZ2VyLnRvU3RyaW5nKGlkKSwgdG1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVUcmFuc2llbnREYXRhKE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSB0byB0ZXN0Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShNZXNzYWdlQ29udGV4dCBfbWMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgc2VyaWFsaXplY2FsbGNvdW50Kys7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDNbaWQ9IiArIGlkICsgIl0uc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgICBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWNhbGxjb3VudCArICJdIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgYnl0ZSBbXSB0bXAgPSAoYnl0ZSBbXSkgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLQotICAgICAgICAgICAgaWYgKHRtcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogIE5vIHNlbGYgbWFuYWdlZCBkYXRhIHRvIHNlcmlhbGl6ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGJhb3Mud3JpdGUodG1wLCAwLCB0bXAubGVuZ3RoKTsKLSAgICAgICAgICAgIGludCBiYW9zX3NpemUgPSBiYW9zLnNpemUoKTsKLSAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogc2F2ZWQgc2VsZiBtYW5hZ2VkIGRhdGEgYnl0ZSBbXSBsZW5ndGggWyIgKyB0bXAubGVuZ3RoICsgIl0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSArCi0gICAgICAgICAgICAgICAgICAgICI6IHNhdmVkIHNlbGYgbWFuYWdlZCBkYXRhIGJ5dGUgYXJyYXkgb3V0cHV0IHN0cmVhbSBsZW5ndGggWyIgKyBiYW9zX3NpemUgKwotICAgICAgICAgICAgICAgICAgICAiXSIpOwotICAgICAgICAgICAgcmV0dXJuIGJhb3M7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVzZXJpYWxpemVjYWxsY291dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZWNhbGxjb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplY2FsbGNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWNhbGxjb3VudDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBUZW1wSGFuZGxlcjA0IHNldHMgYmluYXJ5IGRhdGEsIHNhdmVzIGl0ICh2aWEgdGhlIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSBtZXRob2QKLSAgICAgKiBjYWxsZWQgYnkgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCB3aGVuIHNhdmVkIGluIHRoaXMgaGFuZGxlcidzIGludm9rZSgpKSwKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgVGVtcEhhbmRsZXIwNCBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIgewotICAgICAgICBwcml2YXRlIGludCBpZCA9IC0yOwotICAgICAgICBwcml2YXRlIGludCBzZXJpYWxpemVjYWxsY291bnQgPSAwOwotICAgICAgICBwcml2YXRlIGludCBkZXNlcmlhbGl6ZWNhbGxjb3VudCA9IDA7Ci0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwNCgpIHsKLSAgICAgICAgICAgIGlkID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVtcEhhbmRsZXIwNChpbnQgaWQpIHsKLSAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SUQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VGVzdERhdGFGcm9tTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgX21jKSB7Ci0gICAgICAgICAgICByZXR1cm4gX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciNpbnZva2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgKiAKLSAgICAgICAgICogVGhpcyBpbnZva2UoKSBtZXRob2Qgd2lsbCB0ZXN0IHNldmVyYWwgdGhpbmdzOgotICAgICAgICAgKiAxLiAgdmVyaWZ5IHRoYXQgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhIGlzIGFjdHVhbGx5IGNhbGxlZCB3aGVuIHNhdmluZyB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAqIDIuICB2ZXJpZnkgdGhhdCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSBpcyBhY3R1YWxseSBjYWxsZWQgd2hlbiByZXN0b3JpbmcgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdAotICAgICAgICAgKiAzLiAgdmVyaWZ5IHRoYXQgYW55IFNlbGZNYW5hZ2VkRGF0YSBzdG9yZWQgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IGlzIHByb3Blcmx5IHNhdmVkL3Jlc3RvcmVkICh2aWEgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhL2Rlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgX21jKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSAiVGVtcEhhbmRsZXIwNFtpZD0iICsgaWQgKyAiXS5pbnZva2UoKSI7Ci0gICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSAiTWVzc2FnZUNvbnRleHRTZWxmTWFuYWdlZERhdGFUZXN0OjoiICsgZGVzYzsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zyh0aXRsZSk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQyID0gbnVsbDsgIC8vIHRoaXMgd2lsbCBiZSB0aGUgcmVzdG9yZWQgb25lCi0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgYnl0ZSBbXSBvZiBkYXRhCi0gICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCksIHRlc3REYXRhMDQpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiAgIFNldHRpbmcgc2VsZiBtYW5hZ2VkIGRhdGEgdXNpbmcga2V5IFsiICsKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhpZCkgKyAiXSIpOwotCi0gICAgICAgICAgICBtc2dDb250ZXh0MiA9IHNhdmVBbmRSZXN0b3JlKF9tYywgIlRlbXBIYW5kbGVyMDRfIiwgZGVzYyk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKG1zZ0NvbnRleHQyICE9IG51bGwpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQpOwotCi0gICAgICAgICAgICBpbnZva2VjYWxsY291bnQrKzsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogQ29tcGxldGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoQnl0ZUFycmF5SW5wdXRTdHJlYW0gZGF0YSwgTWVzc2FnZUNvbnRleHQgX21jKQotICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBib29sZWFuIGlzT0sgPSB0cnVlOwotCi0gICAgICAgICAgICBkZXNlcmlhbGl6ZWNhbGxjb3VudCsrOwotCi0gICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICJUZW1wSGFuZGxlcjA0W2lkPSIgKyBpZCArICJdLmRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgICBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplY2FsbGNvdW50ICsgIl0iOwotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIk1lc3NhZ2VDb250ZXh0U2VsZk1hbmFnZWREYXRhVGVzdDo6IiArIGRlc2M7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUpOwotCi0gICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSB0ZXN0RGF0YTA0Lmxlbmd0aDsKLQotICAgICAgICAgICAgbG9uZyBbXSB0bXAgPSBuZXcgbG9uZyBbZXhwZWN0ZWRdOwotCi0gICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZGF0YSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4ga2VlcEdvaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgICAgICAgIGludCBzaXplV3JpdHRlbiA9IG9pcy5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChzaXplV3JpdHRlbiA+IDApIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoa2VlcEdvaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRtcGRhdGEgPSBvaXMucmVhZExvbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wW2luZGV4XSA9IHRtcGRhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT0sgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGlzT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwR29pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlzT0sgPSBpc0VxdWFscyh0bXAsIHRlc3REYXRhMDQpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaXNPSyk7Ci0KLSAgICAgICAgICAgICAgICBfbWMuc2V0U2VsZk1hbmFnZWREYXRhKHRoaXMuZ2V0Q2xhc3MoKSwgSW50ZWdlci50b1N0cmluZyhpZCksIHRtcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVUcmFuc2llbnREYXRhKE1lc3NhZ2VDb250ZXh0IF9tYykgewotICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSB0byB0ZXN0Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShNZXNzYWdlQ29udGV4dCBfbWMpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgc2VyaWFsaXplY2FsbGNvdW50Kys7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXNjID0gIlRlbXBIYW5kbGVyMDRbaWQ9IiArIGlkICsgIl0uc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgICBjb3VudCBbIiArCi0gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWNhbGxjb3VudCArICJdIjsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJNZXNzYWdlQ29udGV4dFNlbGZNYW5hZ2VkRGF0YVRlc3Q6OiIgKyBkZXNjOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlKTsKLQotICAgICAgICAgICAgbG9uZyBbXSB0bXAgPSAobG9uZyBbXSkgX21jLmdldFNlbGZNYW5hZ2VkRGF0YSh0aGlzLmdldENsYXNzKCksIEludGVnZXIudG9TdHJpbmcoaWQpKTsKLQotICAgICAgICAgICAgaWYgKHRtcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsgIjogIE5vIHNlbGYgbWFuYWdlZCBkYXRhIHRvIHNlcmlhbGl6ZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IHRtcC5sZW5ndGg7Ci0KLSAgICAgICAgICAgIG9vcy53cml0ZUludChzaXplKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvb3Mud3JpdGVMb25nKHRtcFtpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICAgICAgaW50IGJhb3Nfc2l6ZSA9IGJhb3Muc2l6ZSgpOwotICAgICAgICAgICAgYmFvcy5jbG9zZSgpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcodGl0bGUgKyAiOiBzYXZlZCBzZWxmIG1hbmFnZWQgZGF0YSBieXRlIFtdIGxlbmd0aCBbIiArIHRtcC5sZW5ndGggKyAiXSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKHRpdGxlICsKLSAgICAgICAgICAgICAgICAgICAgIjogc2F2ZWQgc2VsZiBtYW5hZ2VkIGRhdGEgYnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtIGxlbmd0aCBbIiArIGJhb3Nfc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICJdIik7Ci0gICAgICAgICAgICByZXR1cm4gYmFvczsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGludCBnZXREZXNlcmlhbGl6ZWNhbGxjb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZWNhbGxjb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplY2FsbGNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWNhbGxjb3VudDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBjb21wYXJlcyB0aGUgdHdvIGJ5dGUgYXJyYXlzIHRvIHNlZSBpZiB0aGV5IGFyZSBlcXVhbAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VxdWFscyhieXRlIFtdIGIxLCBieXRlIFtdIGIyKSB7Ci0gICAgICAgIGludCBzaXplMSA9IGIxLmxlbmd0aDsKLSAgICAgICAgaW50IHNpemUyID0gYjIubGVuZ3RoOwotCi0gICAgICAgIGlmIChzaXplMSAhPSBzaXplMikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplMTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYjFbaV0gIT0gYjJbaV0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNvbXBhcmVzIHRoZSB0d28gbG9uZyBhcnJheXMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWFsCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRXF1YWxzKGxvbmcgW10gTDEsIGxvbmcgW10gTDIpIHsKLSAgICAgICAgaW50IHNpemUxID0gTDEubGVuZ3RoOwotICAgICAgICBpbnQgc2l6ZTIgPSBMMi5sZW5ndGg7Ci0KLSAgICAgICAgaWYgKHNpemUxICE9IHNpemUyKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUxOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChMMVtpXSAhPSBMMltpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlQ29udGV4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjYzBkOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VDb250ZXh0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7Ci0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0VGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzc2FnZUNvbnRleHQoKSB0aHJvd3MgQXhpc0ZhdWx0LAotICAgICAgICAgICAgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBlciA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlc0Rlc2MgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgc2VydmljZXNEZXNjLnNldE5hbWUoInRlc3RTZXJ2aWNlIik7Ci0gICAgICAgIGVyLmFkZFNlcnZpY2Uoc2VydmljZXNEZXNjKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBlbmdpbmVDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGVyKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2djdHggPSBlbmdpbmVDb250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgU09BUEZhY3Rvcnkgb21GYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0KLSAgICAgICAgbXNnY3R4LnNldEVudmVsb3BlKG9tRmFjLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtc2djdHguZ2V0RW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgbXNnY3R4LnNldEZhdWx0VG8obnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwobXNnY3R4LmdldEZhdWx0VG8oKSk7Ci0KLSAgICAgICAgbXNnY3R4LnNldEZyb20obnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwobXNnY3R4LmdldEZyb20oKSk7Ci0KLSAgICAgICAgbXNnY3R4LnNldFJlcGx5VG8obnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwobXNnY3R4LmdldFJlcGx5VG8oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlU2F2ZUFuZFJlc3RvcmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc1MDZkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFRoaXMgdGVzdHMgdGhlIHNhdmluZyBhbmQgcmVzdG9yaW5nIG9mIHRoZSBBeGlzMiBjb250ZXh0cyBmcm9tIHdpdGhpbiBhIGhhbmRsZXIuICBUaGlzIGlzIGEgbW9yZQotICogdGhvcm91Z2ggdGVzdCBvZiB0aGUgc2VyaWFsaXphdGlvbiBtZWNoYW5pc21zIHRoYW4gdGhlIG90aGVyIHVuaXQgdGVzdHMsIGFzIHRoZSBjb250ZXh0cyBhcmUKLSAqIHBvcHVsYXRlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEF4aXMyIGV4ZWN1dGlvbiBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHVibGljIE1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKE1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKE1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShUZXN0Q29uc3RhbnRzLnNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnN0YW50cy5vcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24oVGVzdENvbnN0YW50cy5vcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3cocGhhc2VzKTsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlID0gb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZTEgPSAoUGhhc2UpcGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04uZXF1YWxzKHBoYXNlMS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihpbmJvdW5kSGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHBoYXNlcy5hZGQobmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFBoYXNlc091dEZsb3cocGhhc2VzKTsKLSAgICAgICAgcGhhc2UgPSBvcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZTEgPSAoUGhhc2UpcGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04uZXF1YWxzKHBoYXNlMS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBwaGFzZTEuYWRkSGFuZGxlcihvdXRib3VuZEhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UoVGVzdENvbnN0YW50cy5zZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVBbmRSZXN0b3JlT2ZNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8oVGVzdENvbnN0YW50cy50YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oVGVzdENvbnN0YW50cy5vcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEhhbmRsZXIgaW5ib3VuZEhhbmRsZXIgPSBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGVQcm9wZXJ0eSA9ICJJbmJvdW5kSGFuZGxlclN0YXRlIjsKLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3Q6SW5ib3VuZCBoYW5kbGVyIGludm9rZWQiKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShzdGF0ZVByb3BlcnR5KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVUZXN0OlN1c3BlbmRpbmcgcHJvY2Vzc2luZyIpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KHN0YXRlUHJvcGVydHksIG5ldyBPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQucGF1c2UoKTsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvYmplY3RPdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0T3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdE91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gc2VyaWFsaXppbmcgdGhlIE1lc3NhZ2VDb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ldyBXb3JrZXIoYnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpKS5zdGFydCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3Q6U2tpcHBpbmcgcHJldmlvdXNseSBpbnZva2VkIEluYm91bmQgaGFuZGxlciIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgSGFuZGxlciBvdXRib3VuZEhhbmRsZXIgPSBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3Q6T3V0Ym91bmQgaGFuZGxlciBpbnZva2VkIik7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgV29ya2VyIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0OwotICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0gICAgICAgIHB1YmxpYyBXb3JrZXIoYnl0ZVtdIHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0ID0gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0OwotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lc3NhZ2VTYXZlQW5kUmVzdG9yZVRlc3Q6V29ya2VyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlVGVzdDpSZXN1bWluZyBwcm9jZXNzaW5nIik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2JqZWN0SW5wdXRTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VDb250ZXh0KW9iamVjdElucHV0U3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICByZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGZhaWwoIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSB3b3JrZXIgdGhyZWFkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VXaXRoU2VydmVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlV2l0aFNlcnZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1NmU1Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01lc3NhZ2VXaXRoU2VydmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8vdG9kbwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRJbkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VXaXRoU2VydmVyVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZVdpdGhTZXJ2ZXJUZXN0LmNsYXNzKTsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCIiLCAiRWNob1NlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJlY2hvVm9pZCIpOwotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbDsKLQotICAgIHB1YmxpYyBNZXNzYWdlV2l0aFNlcnZlclRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICAgICAgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKE1lc3NhZ2VXaXRoU2VydmVyVGVzdC5jbGFzcykpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgY29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0KLSAgICAgICAgLy9zZXJ2aWNlLnNldEZhdWx0SW5GbG93KG5ldyBNb2NrRmxvdygic2VydmljZSBmYXVsdGZsb3ciLCAxKSk7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtMSA9IG5ldyBBeGlzTW9kdWxlKCJBIE1vZHVsZSAxIik7Ci0gICAgICAgIG0xLnNldEluRmxvdyhuZXcgTW9ja0Zsb3coInNlcnZpY2UgbW9kdWxlIGluZmxvdyIsIDQpKTsKLQotICAgICAgICAvL20xLnNldEZhdWx0SW5GbG93KG5ldyBNb2NrRmxvdygic2VydmljZSBtb2R1bGUgZmF1bHRmbG93IiwgMSkpOwotICAgICAgICBjb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0KLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLQotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0KLSAgICAgICAgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciBhYmQgPSBuZXcgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIGFiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgcnVkID0gbmV3IFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIoKTsKLQotICAgICAgICBydWQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNhYmQgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIHNhYmQuaW5pdERpc3BhdGNoZXIoKTsKLQotICAgICAgICBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgc21iZCA9IG5ldyBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIoKTsKLQotICAgICAgICBzbWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgSW5zdGFuY2VEaXNwYXRjaGVyIGlkID0gbmV3IEluc3RhbmNlRGlzcGF0Y2hlcigpOwotCi0gICAgICAgIGlkLmluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiSW5zdGFuY2VEaXNwYXRjaGVyIikpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHJ1ZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzYWJkKTsKLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKHNtYmQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoaWQpOwotICAgICAgICBjb25maWcuZ2V0SW5GbG93UGhhc2VzKCkuYWRkKGRpc3BhdGNoUGhhc2UpOwotICAgICAgICBzZXJ2aWNlLmVuZ2FnZU1vZHVsZShtMSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbmV3IE91dEluQXhpc09wZXJhdGlvbigpOwotICAgICAgICBheGlzT3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9TdHJpbmdTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJzb2FwL3NvYXBtZXNzYWdlLnR4dCIpOwotCi0gICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMvc29hcC9zb2FwbWVzc2FnZS50eHQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KCIxMjcuMC4wLjEiLCBVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgaW50IGluZGV4OwotICAgICAgICB3aGlsZSAoKGluZGV4ID0gaW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIElucHV0U3RyZWFtIHJlc3Bvc2UgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgUmVhZGVyIHJSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzcG9zZSk7Ci0gICAgICAgIGNoYXJbXSBjaGFyQnVmID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICAgIHdoaWxlICgoclJlYWRlci5yZWFkKGNoYXJCdWYpKSA+IDApIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKG5ldyBTdHJpbmcoY2hhckJ1ZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0KLSAgICAgICAgclJlYWRlci5jbG9zZSgpOwotICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vY2tGbG93LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vY2tGbG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjI3ZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2NrRmxvdy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uRmxvdzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrRmxvdyBleHRlbmRzIEZsb3cgewotICAgIHB1YmxpYyBNb2NrRmxvdyhTdHJpbmcgbWVzc2FnZSwgaW50IGxlbmd0aCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTcGVha2luZ0hhbmRsZXIxIGgxID0gbmV3IFNwZWFraW5nSGFuZGxlcjEoCi0gICAgICAgICAgICAgICAgICAgICJFeGVjdXRpbmcgIiArIGkgKyAiIGluc2lkZSAiICsgbWVzc2FnZSwgbmV3IFFOYW1lKCJTcGVha2luZ0hhbmRsZXIiICsgaSkpOwotICAgICAgICAgICAgaDEuc2V0TmFtZSgiU3BlYWtpbmdIYW5kbGVyIiArIGkpOwotICAgICAgICAgICAgdGhpcy5hZGRIYW5kbGVyKGgxLmdldEhhbmRsZXJEZXNjcmlwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2R1bGVFbmFnZW1lbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vZHVsZUVuYWdlbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYjc2Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vZHVsZUVuYWdlbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1vZHVsZUVuYWdlbWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlLnNldE5hbWUoIlRlc3RNb2R1bGUiKTsKLSAgICAgICAgbW9kdWxlLnNldEluRmxvdyhnZXRGbG93V2l0aEhhbmRsZXIoIkgxIiwgIk9wZXJhdGlvbkluUGhhc2UiKSk7Ci0gICAgICAgIG1vZHVsZS5zZXRPdXRGbG93KGdldEZsb3dXaXRoSGFuZGxlcigiSDIiLCAiT3BlcmF0aW9uT3V0UGhhc2UiKSk7Ci0gICAgICAgIG1vZHVsZS5zZXRGYXVsdEluRmxvdyhnZXRGbG93V2l0aEhhbmRsZXIoIkgzIiwgIk9wZXJhdGlvbkluRmF1bHRQaGFzZSIpKTsKLSAgICAgICAgbW9kdWxlLnNldEZhdWx0T3V0RmxvdyhnZXRGbG93V2l0aEhhbmRsZXIoIkg0IiwgIk9wZXJhdGlvbk91dEZhdWx0UGhhc2UiKSk7Ci0gICAgICAgIGF4aXNDb25maWcgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRNb2R1bGUobW9kdWxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZsb3cgZ2V0Rmxvd1dpdGhIYW5kbGVyKFN0cmluZyBoYW5kbGVybmFtZSwgU3RyaW5nIHBoYXNlTmFtZSkgewotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcjEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFRlc3RIYW5kbGVyIG1vZHVsZUhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLSAgICAgICAgbW9kdWxlSGFuZGxlci5zZXROYW1lKGhhbmRsZXJuYW1lKTsKLSAgICAgICAgbW9kdWxlSGFuZGxlci5zZXROYW1lKGhhbmRsZXJuYW1lKTsKLSAgICAgICAgbW9kdWxlSGFuZGxlci5pbml0KGhhbmRsZXIxKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMS5zZXRQaGFzZU5hbWUocGhhc2VOYW1lKTsKLSAgICAgICAgaGFuZGxlcjEuc2V0UnVsZXMocnVsZTEpOwotICAgICAgICBoYW5kbGVyMS5zZXRIYW5kbGVyKG1vZHVsZUhhbmRsZXIpOwotICAgICAgICBGbG93IGZsb3cgPSBuZXcgRmxvdygpOwotICAgICAgICBmbG93LmFkZEhhbmRsZXIoaGFuZGxlcjEpOwotICAgICAgICByZXR1cm4gZmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlRW5nYWdlRm9yQXhpc1NlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoVGVzdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBheGlzQ29uZmlnKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKCJUZXN0TW9kdWxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlKTsKLSAgICAgICAgc2VydmljZS5lbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJ0ZXN0Vm9pZCIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZSgiSW4iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbWVzc2FnZS5nZXRNZXNzYWdlRmxvdygpOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHBoYXNlICE9IG51bGwgJiYgcGhhc2UuZ2V0TmFtZSgpLmVxdWFscygiT3BlcmF0aW9uSW5QaGFzZSIpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBoYW5kbGVyID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXIuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyMSA9IChIYW5kbGVyKSBoYW5kbGVyLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIxLmdldE5hbWUoKS5lcXVhbHMoIkgxIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZm91bmQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU1vZHVsZVRvQXhpc01lc3NhZ2UxKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoVGVzdFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBheGlzQ29uZmlnKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKCJUZXN0TW9kdWxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJ0ZXN0Vm9pZCIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZSgiSW4iKTsKLSAgICAgICAgbWVzc2FnZS5lbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbWVzc2FnZS5nZXRNZXNzYWdlRmxvdygpOwotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHBoYXNlICE9IG51bGwgJiYgcGhhc2UuZ2V0TmFtZSgpLmVxdWFscygiT3BlcmF0aW9uSW5QaGFzZSIpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBoYW5kbGVyID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXIuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyMSA9IChIYW5kbGVyKSBoYW5kbGVyLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIxLmdldE5hbWUoKS5lcXVhbHMoIkgxIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZm91bmQpOwotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGVUb0F4aXNNZXNzYWdlMigpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShUZXN0U2VydmljZS5jbGFzcy5nZXROYW1lKCksIGF4aXNDb25maWcpOwotICAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBheGlzQ29uZmlnLmdldE1vZHVsZSgiVGVzdE1vZHVsZSIpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJ0ZXN0U3RyaW5nIikpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoIkluIik7Ci0gICAgICAgICBtZXNzYWdlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlKTsKLSAgICAgICAgIG1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoIk91dCIpOwotICAgICAgICAgTGlzdCBsaXN0ID0gbWVzc2FnZS5nZXRNZXNzYWdlRmxvdygpOwotICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgIGlmIChwaGFzZSAhPSBudWxsICYmIHBoYXNlLmdldE5hbWUoKS5lcXVhbHMoIk9wZXJhdGlvbk91dFBoYXNlIikpIHsKLSAgICAgICAgICAgICAgICAgTGlzdCBoYW5kbGVyID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVyLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIxID0gKEhhbmRsZXIpIGhhbmRsZXIuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIxLmdldE5hbWUoKS5lcXVhbHMoIkgyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGFzc2VydEZhbHNlKGZvdW5kKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL011bHRpcGxlSW52b2NhdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTXVsdGlwbGVJbnZvY2F0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ExMjAyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTXVsdGlwbGVJbnZvY2F0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZUludm9jYXRpb25UZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsNCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGVuZ2luZVJlZ2lzdHJ5Ow0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWM7DQotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsNCi0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7DQotDQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOw0KLQ0KLSAgICBwdWJsaWMgTXVsdGlwbGVJbnZvY2F0aW9uVGVzdCgpIHsNCi0gICAgICAgIHN1cGVyKE11bHRpcGxlSW52b2NhdGlvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTXVsdGlwbGVJbnZvY2F0aW9uVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTXVsdGlwbGVJbnZvY2F0aW9uVGVzdC5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBzZXJ2aWNlID0NCi0gICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsNCi0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOw0KLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0aXBsZUludm9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCk7DQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOw0KLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvT00iKTsNCi0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsNCi0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7DQotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsNCi0gICAgICAgIG9wdGlvbnMuc2V0Q2FsbFRyYW5zcG9ydENsZWFudXAodHJ1ZSk7DQotDQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0NCi0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oDQotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUkVQT1NJVE9SWSksIG51bGwpOw0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsNCi0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsNCi0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOw0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsNCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsNCi0gICAgICAgIHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsNCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsNCi0gICAgICAgIHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsNCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsNCi0gICAgICAgIHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsNCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL015U2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBmN2IyZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL015U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIE15U2VydmljZSB7Ci0KLSAgICBwdWJsaWMgaW50IGFkZChpbnQgYSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIGEgKyBiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PYmplY3RTYXZlMlRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U2F2ZTJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDgyNDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PYmplY3RTYXZlMlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2F2ZTJUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPYmplY3RTYXZlMlRlc3QuY2xhc3MpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGVzdEFyZyA9IG51bGw7DQotDQotCS8vIHNpbXBsZSBjb25zdHJ1Y3RvciBuZWVkZWQgZm9yIG5lc3RlZCBjbGFzcyBFeHRlcm5hbGl6YWJsZSBpbnRlcmZhY2UNCi0JcHVibGljIE9iamVjdFNhdmUyVGVzdCgpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0U2F2ZTJUZXN0KFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JCXRlc3RBcmcgPSBuZXcgU3RyaW5nKGFyZzApOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkvLyBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3RTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCUZpbGUgdGhlRmlsZSA9IG51bGw7DQotCQlTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOw0KLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkvLyBzZXR1cCBhbiBvYmplY3QgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCU1ldGFEYXRhRW50cnkgb2JqID0gbmV3IE1ldGFEYXRhRW50cnkoIm9iamVjdF8xIiwgIm9iamVjdF8xIik7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCXRyeSB7DQotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9iamVjdFRlc3QiLCBudWxsKTsNCi0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZSArICJdIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQl0aGVGaWxlID0gbnVsbDsNCi0JCX0NCi0NCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbSgNCi0JCQkJCQlvdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwob3V0T2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHNhdmUNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IHNhdmluZyAuLi4uLiIpOw0KLQkJCQlzYXZlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iaik7DQotDQotCQkJCS8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcw0KLQkJCQlvdXRPYmpTdHJlYW0uZmx1c2goKTsNCi0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCW91dFN0cmVhbS5mbHVzaCgpOw0KLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJc2F2ZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoDQotICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIi4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCQlsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlc2l6ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUoc2F2ZWQpOw0KLQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQl0cnkgew0KLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlDQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogcmVzdG9yaW5nIC4uLi4uIik7DQotCQkJCXJlc3RvcmVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IHJlc3RvcmVkX29iaiA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7DQotCQkJCWluT2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCWluU3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXJlc3RvcmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQl9DQotDQotCQkJYXNzZXJ0VHJ1ZShyZXN0b3JlZCk7DQotDQotCQkJLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb2JqZWN0IHN1Y2NlZWRlZCwNCi0JCQkvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZA0KLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOw0KLQkJCWlmIChyZW1vdmVUbXBGaWxlKSB7DQotCQkJCXRyeSB7DQotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOw0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCQkJLy8ganVzdCBhYnNvcmIgaXQNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sNCi0JCQlkb25lID0gdHJ1ZTsNCi0JCX0NCi0NCi0JCS8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCWFzc2VydFRydWUoZG9uZSk7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlGaWxlIHRoZUZpbGUgPSBudWxsOw0KLQkJU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsNCi0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsNCi0JCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsNCi0JCWJvb2xlYW4gZXhwZWN0ZWRfZXhjZXB0aW9uID0gZmFsc2U7DQotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGFuIG9iamVjdCB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJTm90U2VyaWFsaXphYmxlT2JqZWN0IG9iaiA9IG5ldyBOb3RTZXJpYWxpemFibGVPYmplY3QoIm5zb18xIik7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCXRyeSB7DQotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9iamVjdFRlc3QiLCBudWxsKTsNCi0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZSArICJdIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQl0aGVGaWxlID0gbnVsbDsNCi0JCX0NCi0NCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsNCi0JCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQkvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQ0KLQkJCQlvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCW91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG91dE9ialN0cmVhbSk7DQotDQotCQkJCS8vIHRyeSB0byBzYXZlDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiBzYXZpbmcgLi4uLi4iKTsNCi0JCQkJc2F2ZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChvYmopOw0KLQkJCQlzYXZlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7DQotDQotCQkJCWxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotCQkJCS8vIGV4cGVjdCBhbiBlcnJvciBoZXJlDQotCQkJCS8vIE9iamVjdFN0YXRlVXRpbHMgY2F0Y2hlcyB0aGUgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uIGFuZA0KLQkJCQkvLyBsb2dzIGl0DQotCQkJCWlmIChleDIgaW5zdGFuY2VvZiBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24pIHsNCi0JCQkJCWV4cGVjdGVkX2V4Y2VwdGlvbiA9IHRydWU7DQotCQkJCX0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcw0KLQkJCWlmIChvdXRPYmpTdHJlYW0gIT0gbnVsbCkNCi0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJaWYgKG91dFN0cmVhbSAhPSBudWxsKQ0KLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlDQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IHJlc3RvcmluZyAuLi4uLiIpOw0KLQkJCQlyZXN0b3JlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc3RvcmVkX29iaiA9IGluLnJlYWRPYmplY3QoKTsNCi0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0NCi0JCQkJcmVzdG9yZWQgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoDQotICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIi4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCX0NCi0NCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsNCi0NCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLA0KLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kDQotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7DQotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7DQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBqdXN0IGFic29yYiBpdA0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUoZXhwZWN0ZWRfZXhjZXB0aW9uKTsNCi0JCX0NCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCUZpbGUgdGhlRmlsZSA9IG51bGw7DQotCQlTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOw0KLQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOw0KLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7DQotCQlib29sZWFuIGNvbXBhcmVzT0sgPSBmYWxzZTsNCi0NCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIHRoZSBvYmplY3QgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCUFycmF5TGlzdCBvYmogPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDEpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoMikpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcigzKSk7DQotCQlvYmouYWRkKG5ldyBTdHJpbmcoInN0cmluZzEiKSk7DQotCQlvYmouYWRkKG5ldyBTdHJpbmcoInN0cmluZzIiKSk7DQotCQlvYmouYWRkKFN5c3RlbS5vdXQpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcig0KSk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDUpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoNikpOw0KLQ0KLQkJaW50IGluaXRpYWxfc2l6ZSA9IG9iai5zaXplKCk7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCXRyeSB7DQotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFycmF5bGlzdFRlc3QiLCBudWxsKTsNCi0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZSArICJdIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQl0aGVGaWxlID0gbnVsbDsNCi0JCX0NCi0NCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbSgNCi0JCQkJCQlvdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwob3V0T2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHNhdmUNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IHNhdmluZyAuLi4uLiIpOw0KLQkJCQlzYXZlZCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlTGlzdChvYmopOw0KLQ0KLQkJCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMNCi0JCQkJb3V0T2JqU3RyZWFtLmZsdXNoKCk7DQotCQkJCW91dE9ialN0cmVhbS5jbG9zZSgpOw0KLQkJCQlvdXRTdHJlYW0uZmx1c2goKTsNCi0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXNhdmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCQlsb25nIGZpbGVzaXplID0gdGhlRmlsZS5sZW5ndGgoKTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlc2l6ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUoc2F2ZWQpOw0KLQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlBcnJheUxpc3QgcmVzdG9yZWRfb2JqID0gbnVsbDsNCi0NCi0JCQl0cnkgew0KLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlDQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmpTdHJlYW0pOw0KLQ0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogcmVzdG9yaW5nIC4uLi4uIik7DQotCQkJCXJlc3RvcmVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZF9vYmogPSBpbi5yZWFkQXJyYXlMaXN0KCk7DQotCQkJCWluT2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCWluU3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXJlc3RvcmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQl9DQotDQotCQkJLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb2JqZWN0IHN1Y2NlZWRlZCwNCi0JCQkvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZA0KLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOw0KLQkJCWlmIChyZW1vdmVUbXBGaWxlKSB7DQotCQkJCXRyeSB7DQotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOw0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCQkJLy8ganVzdCBhYnNvcmIgaXQNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsNCi0NCi0JCQlpZiAocmVzdG9yZWRfb2JqICE9IG51bGwpIHsNCi0JCQkJaW50IHJlc3RvcmVkX3NpemUgPSByZXN0b3JlZF9vYmouc2l6ZSgpOw0KLQkJCQlpZiAocmVzdG9yZWRfc2l6ZSA9PSAoaW5pdGlhbF9zaXplIC0gMSkpIHsNCi0JCQkJCWNvbXBhcmVzT0sgPSB0cnVlOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIFRPRE86IGNoZWNrIGZvciBleGFjdCBlbnRyaWVzDQotDQotCQkJYXNzZXJ0VHJ1ZShjb21wYXJlc09LKTsNCi0NCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sNCi0JCQlkb25lID0gdHJ1ZTsNCi0JCX0NCi0NCi0JCS8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCWFzc2VydFRydWUoZG9uZSk7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaE1hcCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJRmlsZSB0aGVGaWxlID0gbnVsbDsNCi0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7DQotCQlib29sZWFuIHNhdmVkID0gZmFsc2U7DQotCQlib29sZWFuIHJlc3RvcmVkID0gZmFsc2U7DQotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsNCi0JCWJvb2xlYW4gY29tcGFyZXNPSyA9IGZhbHNlOw0KLQ0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIHRoZSBvYmplY3QgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCUhhc2hNYXAgb2JqID0gbmV3IEhhc2hNYXAoKTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5MSIpLCBuZXcgSW50ZWdlcigxKSk7DQotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTIiKSwgbmV3IEludGVnZXIoMikpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkzIiksIG5ldyBTdHJpbmcoInZhbHVlMSIpKTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5NCIpLCBTeXN0ZW0ub3V0KTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5NSIpLCBuZXcgSW50ZWdlcigzKSk7DQotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTYiKSwgbmV3IEludGVnZXIoNCkpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk3IiksIFN5c3RlbS5lcnIpOw0KLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk4IiksIG5ldyBJbnRlZ2VyKDUpKTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5OSIpLCBuZXcgSW50ZWdlcig2KSk7DQotCQlvYmoucHV0KG5ldyBOb3RTZXJpYWxpemFibGVPYmplY3QoIlRlc3RGb3JIYXNoTWFwS2V5IiksIG5ldyBJbnRlZ2VyKDcpKTsNCi0JCW9iai5wdXQobmV3IFN0cmluZygia2V5MTAiKSwgbmV3IEludGVnZXIoOCkpOw0KLQ0KLQkJaW50IGluaXRpYWxfc2l6ZSA9IG9iai5zaXplKCk7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCXRyeSB7DQotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImhhc2htYXBUZXN0IiwgbnVsbCk7DQotCQkJdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQl0aGVGaWxlID0gbnVsbDsNCi0JCX0NCi0NCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbSgNCi0JCQkJCQlvdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwob3V0T2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHNhdmUNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBzYXZpbmcgLi4uLi4iKTsNCi0JCQkJc2F2ZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZU1hcChvYmopOw0KLQ0KLQkJCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMNCi0JCQkJb3V0T2JqU3RyZWFtLmZsdXNoKCk7DQotCQkJCW91dE9ialN0cmVhbS5jbG9zZSgpOw0KLQkJCQlvdXRTdHJlYW0uZmx1c2goKTsNCi0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXNhdmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAuLi4uc2F2ZSBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsNCi0NCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLQkJCQlleDIucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUoc2F2ZWQpOw0KLQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCS8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlIYXNoTWFwIHJlc3RvcmVkX29iaiA9IG51bGw7DQotDQotCQkJdHJ5IHsNCi0JCQkJLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlDQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQ0KLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotCQkJCU9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiByZXN0b3JpbmcgLi4uLi4iKTsNCi0JCQkJcmVzdG9yZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVkX29iaiA9IGluLnJlYWRIYXNoTWFwKCk7DQotCQkJCWluT2JqU3RyZWFtLmNsb3NlKCk7DQotCQkJCWluU3RyZWFtLmNsb3NlKCk7DQotDQotCQkJCXJlc3RvcmVkID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAuLi4ucmVzdG9yZWQgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7DQotDQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCX0NCi0NCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLA0KLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kDQotCQkJYm9vbGVhbiByZW1vdmVUbXBGaWxlID0gc2F2ZWQgJiYgcmVzdG9yZWQ7DQotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXRoZUZpbGUuZGVsZXRlKCk7DQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyBqdXN0IGFic29yYiBpdA0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOw0KLQ0KLQkJCWlmIChyZXN0b3JlZF9vYmogIT0gbnVsbCkgew0KLQkJCQlpbnQgcmVzdG9yZWRfc2l6ZSA9IHJlc3RvcmVkX29iai5zaXplKCk7DQotCQkJCWlmIChyZXN0b3JlZF9zaXplID09IChpbml0aWFsX3NpemUgLSAzKSkgew0KLQkJCQkJLy8gdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhlIG1hcCB0aGF0IGFyZSBub3Qgc2VyaWFsaXphYmxlDQotCQkJCQljb21wYXJlc09LID0gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBUT0RPOiBjaGVjayBmb3IgZXhhY3QgZW50cmllcw0KLQ0KLQkJCWFzc2VydFRydWUoY29tcGFyZXNPSyk7DQotDQotCQkJLy8gaW5kaWNhdGUgdGhhdCB0aGUgdGVtcCBmaWxlIHdhcyBjcmVhdGVkIG9rDQotCQkJZG9uZSA9IHRydWU7DQotCQl9DQotDQotCQkvLyB0aGlzIGlzIGZhbHNlIHdoZW4gdGhlcmUgYXJlIHByb2JsZW1zIHdpdGggdGhlIHRlbXBvcmFyeSBmaWxlDQotCQlhc3NlcnRUcnVlKGRvbmUpOw0KLQ0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RMaW5rZWRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlGaWxlIHRoZUZpbGUgPSBudWxsOw0KLQkJU3RyaW5nIHRoZUZpbGVuYW1lID0gbnVsbDsNCi0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsNCi0JCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsNCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBjb21wYXJlc09LID0gZmFsc2U7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJLy8gc2V0dXAgdGhlIG9iamVjdCB0byB1c2UNCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJTGlua2VkTGlzdCBvYmogPSBuZXcgTGlua2VkTGlzdCgpOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcigxKSk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDIpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoMykpOw0KLQkJb2JqLmFkZChuZXcgU3RyaW5nKCJzdHJpbmcxIikpOw0KLQkJb2JqLmFkZChuZXcgU3RyaW5nKCJzdHJpbmcyIikpOw0KLQkJb2JqLmFkZChTeXN0ZW0uaW4pOw0KLQkJb2JqLmFkZChuZXcgSW50ZWdlcig0KSk7DQotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDUpKTsNCi0JCW9iai5hZGQobmV3IEludGVnZXIoNikpOw0KLQ0KLQkJaW50IGluaXRpYWxfc2l6ZSA9IG9iai5zaXplKCk7DQotDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlDQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCXRyeSB7DQotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImxpbmtlZGxpc3RUZXN0IiwgbnVsbCk7DQotCQkJdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IHRlbXAgZmlsZSA9IFsiDQotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyINCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQl0aGVGaWxlID0gbnVsbDsNCi0JCX0NCi0NCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsNCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7DQotDQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbSgNCi0JCQkJCQlvdXRTdHJlYW0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwob3V0T2JqU3RyZWFtKTsNCi0NCi0JCQkJLy8gdHJ5IHRvIHNhdmUNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBzYXZpbmcgLi4uLi4iKTsNCi0JCQkJc2F2ZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUxpc3Qob2JqKTsNCi0NCi0JCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zDQotCQkJCW91dE9ialN0cmVhbS5mbHVzaCgpOw0KLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsNCi0JCQkJb3V0U3RyZWFtLmZsdXNoKCk7DQotCQkJCW91dFN0cmVhbS5jbG9zZSgpOw0KLQ0KLQkJCQlzYXZlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogLi4uLnNhdmUgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7DQotDQotCQkJCWxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlc2l6ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IGVycm9yIGR1cmluZyBzYXZlIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsNCi0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCX0NCi0NCi0JCQlhc3NlcnRUcnVlKHNhdmVkKTsNCi0NCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlDQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJTGlua2VkTGlzdCByZXN0b3JlZF9vYmogPSBudWxsOw0KLQ0KLQkJCXRyeSB7DQotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQ0KLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOw0KLQ0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUNCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9ialN0cmVhbSk7DQotDQotCQkJCS8vIHRyeSB0byByZXN0b3JlIHRoZSBvcHRpb25zDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogcmVzdG9yaW5nIC4uLi4uIik7DQotCQkJCXJlc3RvcmVkID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZF9vYmogPSBpbi5yZWFkTGlua2VkTGlzdCgpOw0KLQkJCQlpbk9ialN0cmVhbS5jbG9zZSgpOw0KLQkJCQlpblN0cmVhbS5jbG9zZSgpOw0KLQ0KLQkJCQlyZXN0b3JlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOw0KLQ0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7DQotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQl9DQotDQotCQkJLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb2JqZWN0IHN1Y2NlZWRlZCwNCi0JCQkvLyB0aGVuIGRvbid0IGtlZXAgdGhlIHRlbXBvcmFyeSBmaWxlIGFyb3VuZA0KLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOw0KLQkJCWlmIChyZW1vdmVUbXBGaWxlKSB7DQotCQkJCXRyeSB7DQotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOw0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCQkJLy8ganVzdCBhYnNvcmIgaXQNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsNCi0NCi0JCQlpZiAocmVzdG9yZWRfb2JqICE9IG51bGwpIHsNCi0JCQkJaW50IHJlc3RvcmVkX3NpemUgPSByZXN0b3JlZF9vYmouc2l6ZSgpOw0KLQkJCQlpZiAocmVzdG9yZWRfc2l6ZSA9PSAoaW5pdGlhbF9zaXplIC0gMSkpIHsNCi0JCQkJCWNvbXBhcmVzT0sgPSB0cnVlOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIFRPRE86IGNoZWNrIGZvciBleGFjdCBlbnRyaWVzDQotDQotCQkJYXNzZXJ0VHJ1ZShjb21wYXJlc09LKTsNCi0NCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sNCi0JCQlkb25lID0gdHJ1ZTsNCi0JCX0NCi0NCi0JCS8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUNCi0JCWFzc2VydFRydWUoZG9uZSk7DQotDQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6ICBFTkQgLS0tLS0tLS0tLS0tLS0tIik7DQotCX0NCi0NCi0JcHVibGljIGNsYXNzIE5vdFNlcmlhbGl6YWJsZU9iamVjdCBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlIHsNCi0JCXByaXZhdGUgU3RyaW5nIGxhYmVsID0gIlRlc3RPYmplY3QiOw0KLQ0KLQkJcHJpdmF0ZSBTdHJpbmcgSUQgPSBudWxsOw0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBvYmplY3RzIHRoYXQgZG9uJ3Qgc2VyaWFsaXplDQotCQlwcml2YXRlIFByaW50U3RyZWFtIHBzID0gU3lzdGVtLm91dDsNCi0NCi0JCS8vIGRlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGZvciBFeHRlcm5hbGl6YWJsZSBpbnRlcmZhY2UNCi0JCXB1YmxpYyBOb3RTZXJpYWxpemFibGVPYmplY3QoKSB7DQotCQl9DQotDQotCQlwdWJsaWMgTm90U2VyaWFsaXphYmxlT2JqZWN0KFN0cmluZyBpZGVudGlmaWVyKSB7DQotCQkJSUQgPSBpZGVudGlmaWVyOw0KLQkJCXBzID0gU3lzdGVtLm91dDsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBzKSB7DQotCQkJSUQgPSBzOw0KLQkJfQ0KLQ0KLQkJcHVibGljIFN0cmluZyBnZXRJRCgpIHsNCi0JCQlyZXR1cm4gSUQ7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKGphdmEuaW8uT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCQl0aHJvdyBuZXcgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKA0KLQkJCQkJIlRlc3QgT2JqZWN0IGlzIG5vdCBzZXJpYWxpemFibGUiKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChqYXZhLmlvLk9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sDQotCQkJCUNsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGVzdCBvYmplY3QgaXMgbm90IHNlcmlhbGl6YWJsZSIpOw0KLQkJfQ0KLQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U2F2ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U2F2ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzNjdlMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09iamVjdFNhdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT2JqZWN0U3RhdGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2F2ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coT2JqZWN0U2F2ZVRlc3QuY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RBcmcgPSBudWxsOwotCi0JLy8gc2ltcGxlIGNvbnN0cnVjdG9yIG5lZWRlZCBmb3IgbmVzdGVkIGNsYXNzIEV4dGVybmFsaXphYmxlIGludGVyZmFjZQotCXB1YmxpYyBPYmplY3RTYXZlVGVzdCgpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0U2F2ZVRlc3QoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCXRlc3RBcmcgPSBuZXcgU3RyaW5nKGFyZzApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHRoZUZpbGUgPSBudWxsOwotCQlTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCQlib29sZWFuIHNhdmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gc2V0dXAgYW4gb2JqZWN0IHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJTWV0YURhdGFFbnRyeSBvYmogPSBuZXcgTWV0YURhdGFFbnRyeSgib2JqZWN0XzEiLCAib2JqZWN0XzEiKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCXRyeSB7Ci0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgib2JqZWN0VGVzdCIsIG51bGwpOwotCQkJdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJdGhlRmlsZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLQkJCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbSgKLQkJCQkJCW91dFN0cmVhbSk7Ci0KLQkJCQkvLyB0cnkgdG8gc2F2ZQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBzYXZpbmcgLi4uLi4iKTsKLQkJCQlzYXZlZCA9IGZhbHNlOwotCQkJCU9iamVjdFN0YXRlVXRpbHMud3JpdGVPYmplY3Qob3V0T2JqU3RyZWFtLCBvYmosCi0JCQkJCQkidGVzdE9iamVjdDpTZXJpYWxpemFibGUiKTsKLQotCQkJCS8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotCQkJCW91dE9ialN0cmVhbS5mbHVzaCgpOwotCQkJCW91dE9ialN0cmVhbS5jbG9zZSgpOwotCQkJCW91dFN0cmVhbS5mbHVzaCgpOwotCQkJCW91dFN0cmVhbS5jbG9zZSgpOwotCi0JCQkJc2F2ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICAgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZShzYXZlZCk7Ci0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogcmVzdG9yaW5nIC4uLi4uIik7Ci0JCQkJcmVzdG9yZWQgPSBmYWxzZTsKLQkJCQlNZXRhRGF0YUVudHJ5IHJlc3RvcmVkX29iaiA9IChNZXRhRGF0YUVudHJ5KSBPYmplY3RTdGF0ZVV0aWxzCi0JCQkJCQkucmVhZE9iamVjdChpbk9ialN0cmVhbSwgInRlc3RPYmplY3Q6c2VyaWFsaXphYmxlIik7Ci0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkJcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0U2VyaWFsaXphYmxlKCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdFNlcmlhbGl6YWJsZSgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsKLQotCQkJLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb2JqZWN0IHN1Y2NlZWRlZCwKLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0JCQlib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZCAmJiByZXN0b3JlZDsKLQkJCWlmIChyZW1vdmVUbXBGaWxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhlRmlsZS5kZWxldGUoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBqdXN0IGFic29yYiBpdAotCQkJCX0KLQkJCX0KLQotCQkJLy8gaW5kaWNhdGUgdGhhdCB0aGUgdGVtcCBmaWxlIHdhcyBjcmVhdGVkIG9rCi0JCQlkb25lID0gdHJ1ZTsKLQkJfQotCi0JCS8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUKLQkJYXNzZXJ0VHJ1ZShkb25lKTsKLQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGhlRmlsZSA9IG51bGw7Ci0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQlib29sZWFuIGV4cGVjdGVkX2V4Y2VwdGlvbiA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCBhbiBvYmplY3QgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlOb3RTZXJpYWxpemFibGVPYmplY3Qgb2JqID0gbmV3IE5vdFNlcmlhbGl6YWJsZU9iamVjdCgibnNvXzEiKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCXRyeSB7Ci0JCQl0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgib2JqZWN0VGVzdCIsIG51bGwpOwotCQkJdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJdGhlRmlsZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCS8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsKLQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotCQkJCW91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLQkJCQlvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0KLQkJCQkvLyB0cnkgdG8gc2F2ZQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiBzYXZpbmcgLi4uLi4iKTsKLQkJCQlzYXZlZCA9IGZhbHNlOwotCQkJCU9iamVjdFN0YXRlVXRpbHMud3JpdGVPYmplY3Qob3V0T2JqU3RyZWFtLCBvYmosCi0JCQkJCQkidGVzdE9iamVjdDpOb3RTZXJpYWxpemFibGUiKTsKLQotCQkJCXNhdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAuLi4uc2F2ZSBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotCQkJCWxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiBmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0JCQkJLy8gZXhwZWN0IGFuIGVycm9yIGhlcmUKLQkJCQkvLyBPYmplY3RTdGF0ZVV0aWxzIGNhdGNoZXMgdGhlIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBhbmQKLQkJCQkvLyBsb2dzIGl0Ci0JCQkJaWYgKGV4MiBpbnN0YW5jZW9mIE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbikgewotCQkJCQlleHBlY3RlZF9leGNlcHRpb24gPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdE9iamVjdE5vdFNlcmlhbGl6YWJsZSgpOiAgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0JCQlpZiAob3V0T2JqU3RyZWFtICE9IG51bGwpCi0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0JCQlpZiAob3V0U3RyZWFtICE9IG51bGwpCi0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotCQkJCUZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3RTZXJpYWxpemFibGUoKTogcmVzdG9yaW5nIC4uLi4uIik7Ci0JCQkJcmVzdG9yZWQgPSBmYWxzZTsKLQkJCQlPYmplY3QgcmVzdG9yZWRfb2JqID0gT2JqZWN0U3RhdGVVdGlscy5yZWFkT2JqZWN0KGluT2JqU3RyZWFtLAotCQkJCQkJInRlc3RPYmplY3Q6Tm90U2VyaWFsaXphYmxlIik7Ci0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkJcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0T2JqZWN0Tm90U2VyaWFsaXphYmxlKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCWFzc2VydFRydWUocmVzdG9yZWQpOwotCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLAotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOwotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0Ci0JCQkJfQotCQkJfQotCi0JCQlhc3NlcnRUcnVlKGV4cGVjdGVkX2V4Y2VwdGlvbik7Ci0JCX0KLQotICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RPYmplY3ROb3RTZXJpYWxpemFibGUoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGhlRmlsZSA9IG51bGw7Ci0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb21wYXJlc09LID0gZmFsc2U7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gc2V0dXAgdGhlIG9iamVjdCB0byB1c2UKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUFycmF5TGlzdCBvYmogPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoMSkpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDIpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcigzKSk7Ci0JCW9iai5hZGQobmV3IFN0cmluZygic3RyaW5nMSIpKTsKLQkJb2JqLmFkZChuZXcgU3RyaW5nKCJzdHJpbmcyIikpOwotCQlvYmouYWRkKFN5c3RlbS5vdXQpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDQpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcig1KSk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoNikpOwotCi0JCWludCBpbml0aWFsX3NpemUgPSBvYmouc2l6ZSgpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJdHJ5IHsKLQkJCXRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJhcnJheWxpc3RUZXN0IiwgbnVsbCk7Ci0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQl0aGVGaWxlID0gbnVsbDsKLQkJfQotCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKAotCQkJCQkJb3V0U3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byBzYXZlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IHNhdmluZyAuLi4uLiIpOwotCQkJCXNhdmVkID0gZmFsc2U7Ci0JCQkJT2JqZWN0U3RhdGVVdGlscy53cml0ZUFycmF5TGlzdChvdXRPYmpTdHJlYW0sIG9iaiwKLQkJCQkJCSJ0ZXN0T2JqZWN0OkFycmF5TGlzdCIpOwotCi0JCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0JCQkJb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0JCQkJb3V0U3RyZWFtLmZsdXNoKCk7Ci0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlzYXZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICAgdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZShzYXZlZCk7Ci0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlBcnJheUxpc3QgcmVzdG9yZWRfb2JqID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCU9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byByZXN0b3JlIHRoZSBvcHRpb25zCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0QXJyYXlMaXN0KCk6IHJlc3RvcmluZyAuLi4uLiIpOwotCQkJCXJlc3RvcmVkID0gZmFsc2U7Ci0JCQkJcmVzdG9yZWRfb2JqID0gT2JqZWN0U3RhdGVVdGlscy5yZWFkQXJyYXlMaXN0KGluT2JqU3RyZWFtLAotCQkJCQkJInRlc3RPYmplY3Q6QXJyYXlMaXN0Iik7Ci0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkJcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiAuLi4ucmVzdG9yZWQgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RBcnJheUxpc3QoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb2JqZWN0IHN1Y2NlZWRlZCwKLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0JCQlib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZCAmJiByZXN0b3JlZDsKLQkJCWlmIChyZW1vdmVUbXBGaWxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhlRmlsZS5kZWxldGUoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBqdXN0IGFic29yYiBpdAotCQkJCX0KLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZShyZXN0b3JlZCk7Ci0KLQkJCWlmIChyZXN0b3JlZF9vYmogIT0gbnVsbCkgewotCQkJCWludCByZXN0b3JlZF9zaXplID0gcmVzdG9yZWRfb2JqLnNpemUoKTsKLQkJCQlpZiAocmVzdG9yZWRfc2l6ZSA9PSAoaW5pdGlhbF9zaXplIC0gMSkpIHsKLQkJCQkJY29tcGFyZXNPSyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPOiBjaGVjayBmb3IgZXhhY3QgZW50cmllcwotCi0JCQlhc3NlcnRUcnVlKGNvbXBhcmVzT0spOwotCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sKLQkJCWRvbmUgPSB0cnVlOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQlhc3NlcnRUcnVlKGRvbmUpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEFycmF5TGlzdCgpOiAgRU5EIC0tLS0tLS0tLS0tLS0tLSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGhlRmlsZSA9IG51bGw7Ci0JCVN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0JCWJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb21wYXJlc09LID0gZmFsc2U7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIHNldHVwIHRoZSBvYmplY3QgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlIYXNoTWFwIG9iaiA9IG5ldyBIYXNoTWFwKCk7Ci0JCW9iai5wdXQobmV3IFN0cmluZygia2V5MSIpLCBuZXcgSW50ZWdlcigxKSk7Ci0JCW9iai5wdXQobmV3IFN0cmluZygia2V5MiIpLCBuZXcgSW50ZWdlcigyKSk7Ci0JCW9iai5wdXQobmV3IFN0cmluZygia2V5MyIpLCBuZXcgU3RyaW5nKCJ2YWx1ZTEiKSk7Ci0JCW9iai5wdXQobmV3IFN0cmluZygia2V5NCIpLCBTeXN0ZW0ub3V0KTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk1IiksIG5ldyBJbnRlZ2VyKDMpKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk2IiksIG5ldyBJbnRlZ2VyKDQpKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXk3IiksIFN5c3RlbS5lcnIpOwotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTgiKSwgbmV3IEludGVnZXIoNSkpOwotCQlvYmoucHV0KG5ldyBTdHJpbmcoImtleTkiKSwgbmV3IEludGVnZXIoNikpOwotCQlvYmoucHV0KG5ldyBOb3RTZXJpYWxpemFibGVPYmplY3QoIlRlc3RGb3JIYXNoTWFwS2V5IiksIG5ldyBJbnRlZ2VyKDcpKTsKLQkJb2JqLnB1dChuZXcgU3RyaW5nKCJrZXkxMCIpLCBuZXcgSW50ZWdlcig4KSk7Ci0KLQkJaW50IGluaXRpYWxfc2l6ZSA9IG9iai5zaXplKCk7Ci0KLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQl0cnkgewotCQkJdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImhhc2htYXBUZXN0IiwgbnVsbCk7Ci0JCQl0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IGVycm9yIGNyZWF0aW5nIHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICsgZXguZ2V0TWVzc2FnZSgpICsgIl0iKTsKLQkJCXRoZUZpbGUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyBzYXZlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQl0cnkgewotCQkJCS8vIHNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHdyaXRpbmcgb2JqZWN0cyB0byB0aGUKLQkJCQkvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0JCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oCi0JCQkJCQlvdXRTdHJlYW0pOwotCi0JCQkJLy8gdHJ5IHRvIHNhdmUKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IHNhdmluZyAuLi4uLiIpOwotCQkJCXNhdmVkID0gZmFsc2U7Ci0JCQkJT2JqZWN0U3RhdGVVdGlscy53cml0ZUhhc2hNYXAob3V0T2JqU3RyZWFtLCBvYmosCi0JCQkJCQkidGVzdE9iamVjdDpIYXNoTWFwIik7Ci0KLQkJCQkvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLQkJCQlvdXRPYmpTdHJlYW0uZmx1c2goKTsKLQkJCQlvdXRPYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlvdXRTdHJlYW0uZmx1c2goKTsKLQkJCQlvdXRTdHJlYW0uY2xvc2UoKTsKLQotCQkJCXNhdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RIYXNoTWFwKCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQkJbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoZUZpbGVuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdIik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBlcnJvciBkdXJpbmcgc2F2ZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHNhdmVkKTsKLQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0JCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUhhc2hNYXAgcmVzdG9yZWRfb2JqID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLQkJCQlGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0JCQkJLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCU9iamVjdElucHV0U3RyZWFtIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byByZXN0b3JlIHRoZSBvcHRpb25zCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiByZXN0b3JpbmcgLi4uLi4iKTsKLQkJCQlyZXN0b3JlZCA9IGZhbHNlOwotCQkJCXJlc3RvcmVkX29iaiA9IE9iamVjdFN0YXRlVXRpbHMucmVhZEhhc2hNYXAoaW5PYmpTdHJlYW0sCi0JCQkJCQkidGVzdE9iamVjdDpIYXNoTWFwIik7Ci0JCQkJaW5PYmpTdHJlYW0uY2xvc2UoKTsKLQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCQkJcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogLi4uLnJlc3RvcmVkIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0SGFzaE1hcCgpOiBlcnJvciBkdXJpbmcgcmVzdG9yZSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQkJZXgyLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCi0JCQkvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLAotCQkJLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLQkJCWJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkOwotCQkJaWYgKHJlbW92ZVRtcEZpbGUpIHsKLQkJCQl0cnkgewotCQkJCQl0aGVGaWxlLmRlbGV0ZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGp1c3QgYWJzb3JiIGl0Ci0JCQkJfQotCQkJfQotCi0JCQlhc3NlcnRUcnVlKHJlc3RvcmVkKTsKLQotCQkJaWYgKHJlc3RvcmVkX29iaiAhPSBudWxsKSB7Ci0JCQkJaW50IHJlc3RvcmVkX3NpemUgPSByZXN0b3JlZF9vYmouc2l6ZSgpOwotCQkJCWlmIChyZXN0b3JlZF9zaXplID09IChpbml0aWFsX3NpemUgLSAzKSkgewotCQkJCQkvLyB0aGVyZSBhcmUgZW50cmllcyBpbiB0aGUgbWFwIHRoYXQgYXJlIG5vdCBzZXJpYWxpemFibGUKLQkJCQkJY29tcGFyZXNPSyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPOiBjaGVjayBmb3IgZXhhY3QgZW50cmllcwotCi0JCQlhc3NlcnRUcnVlKGNvbXBhcmVzT0spOwotCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sKLQkJCWRvbmUgPSB0cnVlOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQlhc3NlcnRUcnVlKGRvbmUpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdEhhc2hNYXAoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlua2VkTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIHRoZUZpbGUgPSBudWxsOwotCQlTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotCQlib29sZWFuIHNhdmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29tcGFyZXNPSyA9IGZhbHNlOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogIEJFR0lOIC0tLS0tLS0tLS0tLS0tLSIpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCB0aGUgb2JqZWN0IHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJTGlua2VkTGlzdCBvYmogPSBuZXcgTGlua2VkTGlzdCgpOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDEpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcigyKSk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoMykpOwotCQlvYmouYWRkKG5ldyBTdHJpbmcoInN0cmluZzEiKSk7Ci0JCW9iai5hZGQobmV3IFN0cmluZygic3RyaW5nMiIpKTsKLQkJb2JqLmFkZChTeXN0ZW0uaW4pOwotCQlvYmouYWRkKG5ldyBJbnRlZ2VyKDQpKTsKLQkJb2JqLmFkZChuZXcgSW50ZWdlcig1KSk7Ci0JCW9iai5hZGQobmV3IEludGVnZXIoNikpOwotCi0JCWludCBpbml0aWFsX3NpemUgPSBvYmouc2l6ZSgpOwotCi0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkvLyBzZXR1cCBhIHRlbXBvcmFyeSBmaWxlIHRvIHVzZQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJdHJ5IHsKLQkJCXRoZUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJsaW5rZWRsaXN0VGVzdCIsIG51bGwpOwotCQkJdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogdGVtcCBmaWxlID0gWyIKLSAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZSArICJdIik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0JCQl0aGVGaWxlID0gbnVsbDsKLQkJfQotCi0JCWlmICh0aGVGaWxlICE9IG51bGwpIHsKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotCQkJCUZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLQkJCQkvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlCi0JCQkJLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKAotCQkJCQkJb3V0U3RyZWFtKTsKLQotCQkJCS8vIHRyeSB0byBzYXZlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiBzYXZpbmcgLi4uLi4iKTsKLQkJCQlzYXZlZCA9IGZhbHNlOwotCQkJCU9iamVjdFN0YXRlVXRpbHMud3JpdGVMaW5rZWRMaXN0KG91dE9ialN0cmVhbSwgb2JqLAotCQkJCQkJInRlc3RPYmplY3Q6TGlua2VkTGlzdCIpOwotCi0JCQkJLy8gY2xvc2Ugb3V0IHRoZSBzdHJlYW1zCi0JCQkJb3V0T2JqU3RyZWFtLmZsdXNoKCk7Ci0JCQkJb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0JCQkJb3V0U3RyZWFtLmZsdXNoKCk7Ci0JCQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJCQlzYXZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RTYXZlVGVzdDp0ZXN0TGlua2VkTGlzdCgpOiAuLi4uc2F2ZSBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotCQkJCWxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogZmlsZSBzaXplIGFmdGVyIHNhdmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZXNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGVGaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZShzYXZlZCk7Ci0KLQkJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlMaW5rZWRMaXN0IHJlc3RvcmVkX29iaiA9IG51bGw7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0JCQkJRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotCQkJCS8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZQotCQkJCS8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLQkJCQlPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLQkJCQkvLyB0cnkgdG8gcmVzdG9yZSB0aGUgb3B0aW9ucwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogcmVzdG9yaW5nIC4uLi4uIik7Ci0JCQkJcmVzdG9yZWQgPSBmYWxzZTsKLQkJCQlyZXN0b3JlZF9vYmogPSBPYmplY3RTdGF0ZVV0aWxzLnJlYWRMaW5rZWRMaXN0KGluT2JqU3RyZWFtLAotCQkJCQkJInRlc3RPYmplY3Q6TGlua2VkTGlzdCIpOwotCQkJCWluT2JqU3RyZWFtLmNsb3NlKCk7Ci0JCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQkJCXJlc3RvcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9iamVjdFNhdmVUZXN0OnRlc3RMaW5rZWRMaXN0KCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotCQkJCWV4Mi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb2JqZWN0IHN1Y2NlZWRlZCwKLQkJCS8vIHRoZW4gZG9uJ3Qga2VlcCB0aGUgdGVtcG9yYXJ5IGZpbGUgYXJvdW5kCi0JCQlib29sZWFuIHJlbW92ZVRtcEZpbGUgPSBzYXZlZCAmJiByZXN0b3JlZDsKLQkJCWlmIChyZW1vdmVUbXBGaWxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhlRmlsZS5kZWxldGUoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBqdXN0IGFic29yYiBpdAotCQkJCX0KLQkJCX0KLQotCQkJYXNzZXJ0VHJ1ZShyZXN0b3JlZCk7Ci0KLQkJCWlmIChyZXN0b3JlZF9vYmogIT0gbnVsbCkgewotCQkJCWludCByZXN0b3JlZF9zaXplID0gcmVzdG9yZWRfb2JqLnNpemUoKTsKLQkJCQlpZiAocmVzdG9yZWRfc2l6ZSA9PSAoaW5pdGlhbF9zaXplIC0gMSkpIHsKLQkJCQkJY29tcGFyZXNPSyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPOiBjaGVjayBmb3IgZXhhY3QgZW50cmllcwotCi0JCQlhc3NlcnRUcnVlKGNvbXBhcmVzT0spOwotCi0JCQkvLyBpbmRpY2F0ZSB0aGF0IHRoZSB0ZW1wIGZpbGUgd2FzIGNyZWF0ZWQgb2sKLQkJCWRvbmUgPSB0cnVlOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZW1wb3JhcnkgZmlsZQotCQlhc3NlcnRUcnVlKGRvbmUpOwotCi0gICAgICAgIGxvZy5kZWJ1ZygiT2JqZWN0U2F2ZVRlc3Q6dGVzdExpbmtlZExpc3QoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgTm90U2VyaWFsaXphYmxlT2JqZWN0IGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUgewotCQlwcml2YXRlIFN0cmluZyBsYWJlbCA9ICJUZXN0T2JqZWN0IjsKLQotCQlwcml2YXRlIFN0cmluZyBJRCA9IG51bGw7Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBvYmplY3RzIHRoYXQgZG9uJ3Qgc2VyaWFsaXplCi0JCXByaXZhdGUgUHJpbnRTdHJlYW0gcHMgPSBTeXN0ZW0ub3V0OwotCi0JCS8vIGRlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGZvciBFeHRlcm5hbGl6YWJsZSBpbnRlcmZhY2UKLQkJcHVibGljIE5vdFNlcmlhbGl6YWJsZU9iamVjdCgpIHsKLQkJfQotCi0JCXB1YmxpYyBOb3RTZXJpYWxpemFibGVPYmplY3QoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJCUlEID0gaWRlbnRpZmllcjsKLQkJCXBzID0gU3lzdGVtLm91dDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldElEKFN0cmluZyBzKSB7Ci0JCQlJRCA9IHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElEKCkgewotCQkJcmV0dXJuIElEOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChqYXZhLmlvLk9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0aHJvdyBuZXcgTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKAotCQkJCQkiVGVzdCBPYmplY3QgaXMgbm90IHNlcmlhbGl6YWJsZSIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKGphdmEuaW8uT2JqZWN0SW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCQlDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGVzdCBvYmplY3QgaXMgbm90IHNlcmlhbGl6YWJsZSIpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT25lV2F5UmF3WE1MVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PbmVXYXlSYXdYTUxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzBiZjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PbmVXYXlSYXdYTUxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgT25lV2F5UmF3WE1MVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoT25lV2F5UmF3WE1MVGVzdC5jbGFzcykpOwotICAgIH0KLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gcmVjZWl2ZWQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZUluT25seVNlcnZpY2Uoc2VydmljZU5hbWUsbmV3IE1lc3NhZ2VSZWNlaXZlcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtZXNzYWdlQ3R4LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIHJlY2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJpbnRlZ3JhdGlvblJlcG8vIiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBPcHRpb25zIG9wID0gbmV3IE9wdGlvbnMoKTsKLS8vICAgICAgICBvcC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0vLyAvLyAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0vLyAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMToiICsgNTU1NgotLy8gICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvIitzZXJ2aWNlLmdldE5hbWUoKSsiLyIrb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICBvcC5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcC5zZXRBY3Rpb24oInVybjpTb21lQWN0aW9uIik7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wKTsKLSAgICAgICAgc2VuZGVyLmZpcmVBbmRGb3JnZXQoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAoIXJlY2VpdmVkKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IDIwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiZXJyb3IgT2NjdXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09wZXJhdGlvbkNvbnRleHRTYXZlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9PcGVyYXRpb25Db250ZXh0U2F2ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiNmUxMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09wZXJhdGlvbkNvbnRleHRTYXZlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIlRlc3RTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJPcGVyYXRpb25fMSIpOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0gbnVsbDsKLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXhlY3V0ZWRIYW5kbGVycyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0ZXN0QXJnID0gbnVsbDsKLQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICAgICAgdGVzdEFyZyA9IG5ldyBTdHJpbmcoYXJnMCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByZXBhcmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OmNvbnN0cnVjdG9yOiAgZXJyb3IgaW4gc2V0dGluZyB1cCBvYmplY3QgZ3JhcGggWyIgKwotICAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBlLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vCi0gICAgLy8gcHJlcGFyZSB0aGUgb2JqZWN0IGhpZXJhcmNoeSBmb3IgdGVzdGluZwotICAgIC8vCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsIG5ldyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotCi0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLQotICAgICAgICBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIGFiZCA9IG5ldyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIGFiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgcnVkID0gbmV3IFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgcnVkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciBzYWJkID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc2FiZC5pbml0RGlzcGF0Y2hlcigpOwotCi0gICAgICAgIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciBzbWJkID0gbmV3IFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzbWJkLmluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5hZGRIYW5kbGVyKGFiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihydWQpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLmFkZEhhbmRsZXIoc2FiZCk7Ci0gICAgICAgIGRpc3BhdGNoUGhhc2UuYWRkSGFuZGxlcihzbWJkKTsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpLmFkZChkaXNwYXRjaFBoYXNlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKCJTZXJ2aWNlR3JvdXBUZXN0Iik7Ci0KLQotICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0KLQotICAgICAgICBheGlzT3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IE1lc3NhZ2VSZWNlaXZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYXhpc1NlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSwgYXhpc09wZXJhdGlvbik7Ci0KLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoIlNlcnZpY2VHcm91cENvbnRleHRUZXN0Iik7Ci0KLSAgICAgICAgc2VydmljZUNvbnRleHQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgdHJhbnNwb3J0T3V0ID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJudWxsIik7Ci0gICAgICAgIHRyYW5zcG9ydE91dC5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotCi0gICAgICAgIHRyYW5zcG9ydEluID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24oIm51bGwiKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgbWMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIG1jLnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLQotICAgICAgICBtYy5zZXRTZXJ2ZXJTaWRlKHRydWUpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgU09BUEZhY3Rvcnkgb21GYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIG1jLnNldEVudmVsb3BlKG9tRmFjLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLQotICAgICAgICBQaGFzZSBwaGFzZTEgPSBuZXcgUGhhc2UoImJlZ2luUGhhc2UxIik7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigxKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigyKSk7Ci0gICAgICAgIHBoYXNlMS5hZGRIYW5kbGVyKG5ldyBUZW1wSGFuZGxlcigzKSk7Ci0KLSAgICAgICAgUGhhc2UgcGhhc2UyID0gbmV3IFBoYXNlKCJtaWRkbGVQaGFzZTIiKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDQpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDUpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDYpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDcpKTsKLSAgICAgICAgcGhhc2UyLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDgpKTsKLQotICAgICAgICBQaGFzZSBwaGFzZTMgPSBuZXcgUGhhc2UoImxhc3RQaGFzZTMiKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDkpKTsKLSAgICAgICAgcGhhc2UzLmFkZEhhbmRsZXIobmV3IFRlbXBIYW5kbGVyKDEwKSk7Ci0KLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UxKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UyKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5hZGQocGhhc2UzKTsKLQotICAgICAgICBtYy5zZXRXU0FBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG1jLnNldFNvYXBBY3Rpb24ob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgICAgICBtYy5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgICAgIC8vb3BlcmF0aW9uQ29udGV4dC5hZGRNZXNzYWdlQ29udGV4dChtYyk7ICBnZXRzIGRvbmUgdmlhIHRoZSByZWdpc3RlcgotICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtYywgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG1jLnNldE9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG1jLnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDb250ZXh0KTsKLQotICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImF4aXMyL3NlcnZpY2VzL051bGxTZXJ2aWNlIikpOwotICAgICAgICBtYy5zZXRXU0FBY3Rpb24oIkR1bW15T3AiKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgZXhlY3V0ZWRIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9vcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVBbmRSZXN0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gc2F2ZWQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiByZXN0b3JlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBjb21wYXJlc09rID0gZmFsc2U7Ci0KLSAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6ICBCRUdJTiAtLS0tLS0tLS0tLS0tLS0iKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2V0dXAgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiT3BDdHhTYXZlIiwgbnVsbCk7Ci0gICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IHRlbXAgZmlsZSA9IFsiICsKLSAgICAgICAgICAgICAgICAgICAgdGhlRmlsZW5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiBzYXZpbmcgLi4uLi4iKTsKLSAgICAgICAgICAgICAgICBzYXZlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChvcGVyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgc2F2ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzaXplICsgIl0gICB0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZXJyb3IgZHVyaW5nIHNhdmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoc2F2ZWQpOwotCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiByZXN0b3JpbmcgLi4uLi4iKTsKLSAgICAgICAgICAgICAgICByZXN0b3JlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BjdHhfcmVzdG9yZWQgPSAoT3BlcmF0aW9uQ29udGV4dCkgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIG9wY3R4X3Jlc3RvcmVkLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgIHJlc3RvcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAuLi4ucmVzdG9yZWQgb3BlcmF0aW9uIGNvbXBsZXRlZC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21wYXJlIHRvIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IG9wY3R4X3Jlc3RvcmVkLmlzRXF1aXZhbGVudChvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgT3BlcmF0aW9uQ29udGV4dCBlcXVpdmFsZW5jeSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCByZXN0b3JlZF9zcnZDdHggPSBvcGN0eF9yZXN0b3JlZC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgPSByZXN0b3JlZF9zcnZDdHguaXNFcXVpdmFsZW50KHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgU2VydmljZUNvbnRleHQgZXF1aXZhbGVuY3kgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlc09rICsgIl0iKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVzT2spOwotCi0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCByZXN0b3JlZF9zZ0N0eCA9IHJlc3RvcmVkX3NydkN0eC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgY29tcGFyZXNPayA9IHJlc3RvcmVkX3NnQ3R4LmlzRXF1aXZhbGVudChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dFNhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgU2VydmljZUdyb3VwQ29udGV4dCBlcXVpdmFsZW5jeSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZXNPayk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcGVyYXRpb25Db250ZXh0U2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Mi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgOiAiICsgZXgyLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgZXgyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIHNhdmUvcmVzdG9yZSBvZiB0aGUgb3BlcmF0aW9uIGNvbnRleHQgc3VjY2VlZGVkLAotICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkICYmIGNvbXBhcmVzT2s7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgdGVtcCBmaWxlIHdhcyBjcmVhdGVkIG9rCi0gICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgYXNzZXJ0VHJ1ZShkb25lKTsKLQotICAgICAgICBsb2cuZGVidWcoIk9wZXJhdGlvbkNvbnRleHRTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBjbGFzcyBUZW1wSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgSW50ZWdlciBpbmRleDsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbnN0cnVjdG9ycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcHVibGljIFRlbXBIYW5kbGVyKGludCBpbmRleCkgewotICAgICAgICAgICAgdGhpcy5pbmRleCA9IG5ldyBJbnRlZ2VyKGluZGV4KTsKLSAgICAgICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihuZXcgU3RyaW5nKCJoYW5kbGVyIiArIGluZGV4KSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBtZXRob2RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGVtcEhhbmRsZXI6aW52b2tlKCk6IGluZGV4ID0gWyIgKyBpbmRleCArICJdIik7Ci0gICAgICAgICAgICBleGVjdXRlZEhhbmRsZXJzLmFkZChpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT3B0aW9uc1NhdmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09wdGlvbnNTYXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDJmY2I5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT3B0aW9uc1NhdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uc1NhdmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE9wdGlvbnNTYXZlVGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiTnVsbFNlcnZpY2UiKTsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJEdW1teU9wIik7Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RBcmcgPSBudWxsOwotCi0KLSAgICBwdWJsaWMgT3B0aW9uc1NhdmVUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgICAgICB0ZXN0QXJnID0gbmV3IFN0cmluZyhhcmcwKTsKLQotICAgICAgICBpbml0QWxsKCk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0QWxsKCkgewotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9vcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlQW5kUmVzdG9yZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIHRoZUZpbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOwotICAgICAgICBib29sZWFuIHNhdmVkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29tcGFyZXNPayA9IGZhbHNlOwotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KGF4aXNDb25maWd1cmF0aW9uKTsKLQotCi0gICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiAgQkVHSU4gLS0tLS0tLS0tLS0tLS0tIik7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNldHVwIGFuIG9wdGlvbnMgb2JqZWN0IHRvIHVzZQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLQotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBvcHRpb25zLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCh0cnVlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoNTAwMEwpOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIoZmFsc2UpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigiU29hcEFjdGlvbiIpOwotICAgICAgICBvcHRpb25zLnNldEZhdWx0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9mYXVsdFRvIikpOwotICAgICAgICBvcHRpb25zLnNldEZyb20obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9mcm9tIikpOwotICAgICAgICBvcHRpb25zLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG8iKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigibnVsbCIpOwotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQyID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJoYXBweSIpOwotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQzID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJnb2x1Y2t5Iik7Ci0gICAgICAgIHRyYW5zcG9ydE91dC5zZXRTZW5kZXIobmV3IENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICB0cmFuc3BvcnRPdXQyLnNldFNlbmRlcihuZXcgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIoKSk7Ci0gICAgICAgIHRyYW5zcG9ydE91dDMuc2V0U2VuZGVyKG5ldyBDb21tb25zSFRUUFRyYW5zcG9ydFNlbmRlcigpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkVHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dDMpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0Mik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigibnVsbCIpOwotICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluMiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKCJhbHdheXMiKTsKLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbjMgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigidGhlYmVzdCIpOwotICAgICAgICB0cmFuc3BvcnRJbi5zZXRSZWNlaXZlcihuZXcgU2ltcGxlSFRUUFNlcnZlcigpKTsKLSAgICAgICAgdHJhbnNwb3J0SW4yLnNldFJlY2VpdmVyKG5ldyBTaW1wbGVIVFRQU2VydmVyKCkpOwotICAgICAgICB0cmFuc3BvcnRJbjMuc2V0UmVjZWl2ZXIobmV3IFNpbXBsZUhUVFBTZXJ2ZXIoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbjIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFRyYW5zcG9ydEluKHRyYW5zcG9ydEluMyk7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRNZXNzYWdlSWQoIm1zZ0lkMDEyMzQ1Iik7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MDEiLCAidmFsdWUwMSIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkwMiIsICJ2YWx1ZTAyIik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoImtleTAzIiwgInZhbHVlMDMiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MDQiLCAidmFsdWUwNCIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkwNSIsICJ2YWx1ZTA1Iik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoImtleTA2IiwgInZhbHVlMDYiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MDciLCAidmFsdWUwNyIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KCJrZXkwOCIsICJ2YWx1ZTA4Iik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoImtleTA5IiwgInZhbHVlMDkiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eSgia2V5MTAiLCAidmFsdWUxMCIpOwotCi0gICAgICAgIC8vIFRPRE86IHNldHVwIGEgcGFyZW50Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNldHVwIGEgdGVtcG9yYXJ5IGZpbGUgdG8gdXNlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9wdGlvbnNTYXZlIiwgbnVsbCk7Ci0gICAgICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiBlcnJvciBjcmVhdGluZyB0ZW1wIGZpbGUgPSBbIiArCi0gICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUKLSAgICAgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShvdXRTdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3B0aW9uc1NhdmVUZXN0OnRlc3RTYXZlQW5kUmVzdG9yZSgpOiBzYXZpbmcgLi4uLi4iKTsKLSAgICAgICAgICAgICAgICBzYXZlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS53cml0ZU9iamVjdChvcHRpb25zKTsKLQotICAgICAgICAgICAgICAgIC8vIGNsb3NlIG91dCB0aGUgc3RyZWFtcwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgc2F2ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IC4uLi5zYXZlIG9wZXJhdGlvbiBjb21wbGV0ZWQuLi4uLiIpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IGZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzaXplICsgIl0gICB0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNhdmVkICE9IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IGVycm9yIGR1cmluZyBzYXZlIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IGVycm9yIGR1cmluZyByZXN0b3JlIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNhdmVkKTsKLQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAvLyByZXN0b3JlIGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSAKLSAgICAgICAgICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG9wdGlvbnMKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogcmVzdG9yaW5nIC4uLi4uIik7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnNfcmVzdG9yZWQgPSAoT3B0aW9ucykgaW5PYmpTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIG9wdGlvbnNfcmVzdG9yZWQuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgcmVzdG9yZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25zU2F2ZVRlc3Q6dGVzdFNhdmVBbmRSZXN0b3JlKCk6IC4uLi5yZXN0b3JlZCBvcGVyYXRpb24gY29tcGxldGVkLi4uLi4iKTsKLQotICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgPSBvcHRpb25zX3Jlc3RvcmVkLmlzRXF1aXZhbGVudChvcHRpb25zKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogICBPcHRpb25zIGVxdWl2YWxlbmN5IFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVzT2sgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogZXJyb3IgZHVyaW5nIHJlc3RvcmUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgICAgICBleDIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdG9yZWQpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVzT2spOwotCi0gICAgICAgICAgICAvLyBpZiB0aGUgc2F2ZS9yZXN0b3JlIG9mIHRoZSBvYmplY3Qgc3VjY2VlZGVkLAotICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBrZWVwIHRoZSB0ZW1wb3JhcnkgZmlsZSBhcm91bmQKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZlVG1wRmlsZSA9IHNhdmVkICYmIHJlc3RvcmVkICYmIGNvbXBhcmVzT2s7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlVG1wRmlsZSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgdGVtcCBmaWxlIHdhcyBjcmVhdGVkIG9rCi0gICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgaXMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVtcG9yYXJ5IGZpbGUKLSAgICAgICAgYXNzZXJ0VHJ1ZShkb25lKTsKLQotICAgICAgICBsb2cuZGVidWcoIk9wdGlvbnNTYXZlVGVzdDp0ZXN0U2F2ZUFuZFJlc3RvcmUoKTogIEVORCAtLS0tLS0tLS0tLS0tLS0iKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QYXVzaW5nSGFuZGxlckV4ZWN1dGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGF1c2luZ0hhbmRsZXJFeGVjdXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODBhZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QYXVzaW5nSGFuZGxlckV4ZWN1dGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotcHVibGljIGNsYXNzIFBhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0RG9uZSA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdCB0ZXN0UmVzdWx0czsKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHRlc3RTZXJ2aWNlOwotICAgIHByaXZhdGUgc3RhdGljIFRlc3RIYW5kbGVyIG1pZGRsZUdsb2JhbEluSGFuZGxlcjsKLSAgICBwcml2YXRlIFRlc3RIYW5kbGVyIGZpcnN0T3BlcmF0aW9uSW5IYW5kbGVyOwotICAgIHByaXZhdGUgVGVzdEhhbmRsZXIgbWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyOwotICAgIHByaXZhdGUgVGVzdEhhbmRsZXIgbWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlcjsKLQotICAgIHB1YmxpYyBQYXVzaW5nSGFuZGxlckV4ZWN1dGlvblRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKFBhdXNpbmdIYW5kbGVyRXhlY3V0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXVzaW5nSGFuZGxlckV4ZWN1dGlvblRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShQYXVzaW5nSGFuZGxlckV4ZWN1dGlvblRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL29yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0KLSAgICAgICAgdGVzdFJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgaWYgKCFpbml0RG9uZSkgewotICAgICAgICAgICAgaW5pdERvbmUgPSB0cnVlOwotICAgICAgICAgICAgTGlzdCBnbG9iYWxJblBoYXNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnbG9iYWxJblBoYXNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFBoYXNlIGdsb2JhbEluUGhhc2UgPSAoUGhhc2UpZ2xvYmFsSW5QaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BSRV9ESVNQQVRDSC5lcXVhbHMoZ2xvYmFsSW5QaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgaGFuZGxlcnMgdG8gIGdsb2JhbEluUGhhc2UgICBuYW1lIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxJblBoYXNlLmdldFBoYXNlTmFtZSgpICsgIl0gIC4uLiIpOwotICAgICAgICAgICAgICAgICAgICBnbG9iYWxJblBoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJJbjEiKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1pZGRsZUdsb2JhbEluSGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigiSW4yIik7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbEluUGhhc2UuYWRkSGFuZGxlcihtaWRkbGVHbG9iYWxJbkhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBnbG9iYWxJblBoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJJbjMiKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLi4uZG9uZSBhZGRpbmcgaGFuZGxlcnMgdG8gIGdsb2JhbEluUGhhc2UgICBuYW1lIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxJblBoYXNlLmdldFBoYXNlTmFtZSgpICsgIl0gIC4uLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRlc3RTZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHRlc3RTZXJ2aWNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSB0ZXN0U2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG9wZXJhdGlvblNwZWNpZmljUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcy5hZGQobmV3IFBoYXNlKAotICAgICAgICAgICAgICAgIFBoYXNlTWV0YWRhdGEuUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04pKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZUxpc3QgPSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBvcGVyYXRpb25TcGVjaWZpY1BoYXNlID0gKFBoYXNlKXBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTgotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG9wZXJhdGlvblNwZWNpZmljUGhhc2UuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgZmlyc3RPcGVyYXRpb25JbkhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIkluNCIpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvblNwZWNpZmljUGhhc2UuYWRkSGFuZGxlcihmaXJzdE9wZXJhdGlvbkluSGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgbWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCJJbjUiKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobWlkZGxlT3BlcmF0aW9uSW5IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJJbjYiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZXMuYWRkKG5ldyBQaGFzZSgKLSAgICAgICAgICAgICAgICBQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KG9wZXJhdGlvblNwZWNpZmljUGhhc2VzKTsKLSAgICAgICAgcGhhc2VMaXN0ID0gb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIG9wZXJhdGlvblNwZWNpZmljUGhhc2UgPSAoUGhhc2UpcGhhc2VMaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5nZXRQaGFzZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCJPdXQxIikpOwotICAgICAgICAgICAgICAgIG1pZGRsZU9wZXJhdGlvbk91dEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoIk91dDIiKTsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25TcGVjaWZpY1BoYXNlLmFkZEhhbmRsZXIobWlkZGxlT3BlcmF0aW9uT3V0SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlY2lmaWNQaGFzZS5hZGRIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigiT3V0MyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgY3JlYXRlQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBvcHRpb25zLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDUwMDAwKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gVXRpbFNlcnZlci5jcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7Ci0gICAgICAgIHJldHVybiBzZW5kZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IGNyZWF0ZUNsaWVudCgpLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3VjY2Vzc2Z1bEludm9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0ZXN0U3VjY2Vzc2Z1bEludm9jYXRpb24iKTsKLSAgICAgICAgbWlkZGxlR2xvYmFsSW5IYW5kbGVyLnNob3VsZFBhdXNlKHRydWUpOwotICAgICAgICBleGVjdXRlQ2xpZW50KCk7Ci0KLSAgICAgICAgLypTaW5jZSB0aGUgcmVzcG9uc2UgaXMgZ29pbmcgYmFjayBzZXBhcmF0ZWx5LCB3ZSBuZWVkIHRvIGdpdmUgdGhlIHNlcnZlcgotICp0aW1lIHRvIHVud2luZCB0aGUgcmVzdCBvZiB0aGUgaW52b2NhdGlvbi4qLwotICAgICAgICAvL1RocmVhZC5zbGVlcCg1MDAwKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDcwMDApOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gdGVzdFJlc3VsdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgICAgICBTdHJpbmcgdG1wID0gKFN0cmluZylpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgUmVzdWx0cyBbIiArIGNvdW50ICsgIl0gPSBbIiArIHRtcCArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHVuY29tbWVudC9jb21tZW50IG91dCB0aGUgZGVzaXJlZCByZXN1bHRzIGJhc2VkIG9uIHdoZXRoZXIgcGF1c2luZwotICAgICAgICAvLyB0aGUgbWVzc2FnZSBjb250ZXh0Ci0KLSAgICAgICAgLy8gZXhwZWN0ZWQgcmVzdWx0cyB3aGVuIG5vdCBwYXVzaW5nCi0gICAgICAgIC8vTGlzdCBleHBlY3RlZEV4ZWN1dGlvblN0YXRlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJJbjEiLCAiSW4yIiwgIkluMyIsICJJbjQiLCAiSW41IiwgIkluNiIsICJPdXQxIiwgIk91dDIiLCAiT3V0MyIsICJGQ091dDMiLCAiRkNPdXQyIiwgIkZDT3V0MSIsICJGQ0luNiIsICJGQ0luNSIsICJGQ0luNCIsICJGQ0luMyIsICJGQ0luMiIsICJGQ0luMSJ9KTsKLQotICAgICAgICAvLyBleHBlY3RlZCByZXN1bHRzIHdoZW4gcGF1c2luZwotICAgICAgICBMaXN0IGV4cGVjdGVkRXhlY3V0aW9uU3RhdGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJJbjEiLCAiSW4yIiwgIkluMiIsICJJbjMiLAotICAgICAgICAgICAgICAgICJJbjQiLCAiSW41IiwgIkluNiIsICJPdXQxIiwgIk91dDIiLCAiT3V0MyIsICJGQ091dDMiLCAiRkNPdXQyIiwgIkZDT3V0MSIsICJGQ0luNiIsCi0gICAgICAgICAgICAgICAgIkZDSW41IiwgIkZDSW40IiwgIkZDSW4zIiwgIkZDSW4yIiwgIkZDSW4xIiB9KTsKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRFeGVjdXRpb25TdGF0ZSwgdGVzdFJlc3VsdHMpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBUZXN0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZXJOYW1lOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkRmFpbCA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkUGF1c2UgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFNhdmUgPSB0cnVlOwotCi0gICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlcihTdHJpbmcgaGFuZGxlck5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMuaGFuZGxlck5hbWUgPSBoYW5kbGVyTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3VsZEZhaWwoYm9vbGVhbiBmYWlsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldHRpbmcgc2hvdWxkRmFpbCB0byAiICsgZmFpbCArICIgZm9yICIgKyBoYW5kbGVyTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLnNob3VsZEZhaWwgPSBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2hvdWxkUGF1c2UoYm9vbGVhbiBwYXVzZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIHNob3VsZFBhdXNlIHRvICIgKyBwYXVzZSArICIgZm9yICIgKyBoYW5kbGVyTmFtZSk7Ci0gICAgICAgICAgICB0aGlzLnNob3VsZFBhdXNlID0gcGF1c2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9ICJUZXN0SGFuZGxlclsiICsgaGFuZGxlck5hbWUgKyAiXSAiOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgIiBpbnZva2VkOiIpOwotCi0gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgaGFuZGxlciBzaG91bGQgZmFpbAotICAgICAgICAgICAgaWYgKHNob3VsZEZhaWwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmFpbG1zZyA9IHRpdGxlICsgIiBrYWJvb20iOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICIgYWRkaW5nIFsiICsgZmFpbG1zZyArICJdIHRvIHRlc3RSZXN1bHRzIGxpc3QiKTsKLSAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0cy5hZGQoZmFpbG1zZyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGZhaWxtc2cpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoZmFpbG1zZyArICIgICBIYW5kbGVyIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgdGhpcyBoYW5kbGVyIHRvIHRoZSBsaXN0IG9mIGludm9rZWQgaGFuZGxlcnMKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICIgYWRkaW5nIHRoaXMgaGFuZGxlciB0byB0ZXN0UmVzdWx0cyBsaXN0Iik7Ci0gICAgICAgICAgICB0ZXN0UmVzdWx0cy5hZGQoaGFuZGxlck5hbWUpOwotCi0gICAgICAgICAgICBib29sZWFuIGlzUGF1c2VkID0gbXNnQ29udGV4dC5pc1BhdXNlZCgpOwotICAgICAgICAgICAgaWYgKGlzUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgIiAgIG1lc3NhZ2UgY29udGV4dCBpcyBwYXVzZWQgICAqKioqKiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiICAgbWVzc2FnZSBjb250ZXh0IGlzIG5vdCBwYXVzZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2hlY2tMaXN0cyhtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhhbmRsZXIgc2hvdWxkIHBhdXNlCi0gICAgICAgICAgICBpZiAoc2hvdWxkUGF1c2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF1c2Vtc2cgPSB0aXRsZSArICIgLSBwYXVzaW5nIHRoZSBtZXNzYWdlIGNvbnRleHQiOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXVzZW1zZyk7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5wYXVzZSgpOwotICAgICAgICAgICAgICAgIHNob3VsZFBhdXNlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBGaWxlIHRoZUZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgicEhleGVjIiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoZUZpbGVuYW1lID0gdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgKyAiZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGhlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdG8gdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiLi4uLnNhdmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV29ya2VyKHRoZUZpbGUsIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSkuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gc2VyaWFsaXppbmcgdGhlIE1lc3NhZ2VDb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZG4ndCBnZXQgYSB0ZW1wb3JhcnkgZmlsZQotICAgICAgICAgICAgICAgICAgICBuZXcgV29ya2VyKG1zZ0NvbnRleHQsIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSkuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EOwotICAgICAgICAgICAgfSAvLyBlbmQgaWYgc2hvdWxkIHBhdXNlCi0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBmbG93Q29tcGxldGUoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIlRlc3RIYW5kbGVyWyIgKyBoYW5kbGVyTmFtZSArICJdICI7Ci0gICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSAiRkMiICsgaGFuZGxlck5hbWU7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgIC5wcmludGxuKHRpdGxlICsgIiBmbG93Q29tcGxldGUoKTogYWRkaW5nIFsiICsgbGFiZWwgKyAiXSB0byB0ZXN0UmVzdWx0cyBsaXN0Iik7Ci0gICAgICAgICAgICB0ZXN0UmVzdWx0cy5hZGQoIkZDIiArIGhhbmRsZXJOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0xpc3RzKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgICAgICBpZiAobWMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gIlRlc3RIYW5kbGVyWyIgKyBoYW5kbGVyTmFtZSArICJdICI7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aXRsZSArICJDaGVja2luZyBleGVjdXRpb24gY2hhaW4uLi4uLiIpOwotICAgICAgICAgICAgQXJyYXlMaXN0IGV4ZWNMaXN0ID0gbWMuZ2V0RXhlY3V0aW9uQ2hhaW4oKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGV4ZWNJdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZXhlY0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV4ZWNJdCA9IGV4ZWNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0hhbmRsZXIoZXhlY0l0KTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRpdGxlICsgIkNoZWNraW5nIGluYm91bmQgZXhlY3V0ZWQgcGhhc2VzIGxpc3QuLi4uLiIpOwotICAgICAgICAgICAgSXRlcmF0b3IgaW5ib3VuZEl0ID0gbWMuZ2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICAgICAgICAgIGNoZWNrSGFuZGxlcihpbmJvdW5kSXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSGFuZGxlcihJdGVyYXRvciBpdCkgewotICAgICAgICAgICAgaWYgKGl0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcilpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIYW5kbGVyIG5hbWUgWyIgKyBoYW5kbGVyLmdldE5hbWUoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgUGhhc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpaGFuZGxlcjsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQaGFzZSBuYW1lIFsiICsgcGhhc2UuZ2V0TmFtZSgpICsgIl0iKTsKLQotICAgICAgICAgICAgICAgICAgICBMaXN0IGxpc3QyID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQyID0gbGlzdDIuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tIYW5kbGVyKGl0Mik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyBUaHJlYWQgewotICAgICAgICBwcml2YXRlIGJ5dGVbXSBzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIHRoZUZpbGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIFdvcmtlcihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLm1zZ0NvbnRleHQgPSBtc2dDb250ZXh0OwotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXb3JrZXIoYnl0ZVtdIHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0ID0gc2VyaWFsaXplZE1lc3NhZ2VDb250ZXh0OwotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdvcmtlcihGaWxlIHRoZUZpbGUsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLnRoZUZpbGUgPSB0aGVGaWxlOwotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdvcmtlcihNZXNzYWdlQ29udGV4dCBtYywgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMubXNnQ29udGV4dCA9IG1jOwotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2VyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOwotCi0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvYmplY3RJbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0dXAgYW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgICAgICAgICBvYmplY3RJbnB1dFN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXb3JrZXIgdGhyZWFkIHJlc3RvcmluZyBtZXNzYWdlIGNvbnRleHQgZnJvbSBmaWxlIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dClvYmplY3RJbnB1dFN0cmVhbS5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dC5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGJ5dGUgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0SW5wdXRTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCkpOwotCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2VyIHRocmVhZCByZXN0b3JpbmcgbWVzc2FnZSBjb250ZXh0IGZyb20gYnl0ZSBhcnJheSIpOwotICAgICAgICAgICAgICAgICAgICByZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQgPSAoTWVzc2FnZUNvbnRleHQpb2JqZWN0SW5wdXRTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICByZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV29ya2VyIHRocmVhZCB1c2luZyBtZXNzYWdlIGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0ID0gbXNnQ29udGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvYmplY3RJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdElucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGVGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZWNvbnN0aXR1dGVkTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldvcmtlciB0aHJlYWQgcmVzdW1pbmcgbWVzc2FnZSBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNFbmdpbmUucmVzdW1lKHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHdvcmtlciB0aHJlYWQgLSBubyBtZXNzYWdlIGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHdvcmtlciB0aHJlYWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU09BUHZlcnNpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVB2ZXJzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg3MzhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU09BUHZlcnNpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQdmVyc2lvblRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlzdXBlci5zZXRVcCgpOwotICAgIAlkZXBsb3lDbGFzc0FzU2VydmljZShFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVAxMSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgICAgICBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRTb2FwVmVyc2lvblVSSSgKLSAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgc2VydmljZUNsaWVudC5zZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dCh0cnVlKTsKLSAgICAgICAgc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50LmdldExhc3RPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKS5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU09BUCBWZXJzaW9uIHJlY2VpdmVkIGlzIG5vdCBjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAgICAgc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuc2V0U29hcFZlcnNpb25VUkkoCi0gICAgICAgIAkJU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIHNlcnZpY2VDbGllbnQuc2V0Q2FjaGluZ09wZXJhdGlvbkNvbnRleHQodHJ1ZSk7Ci0gICAgICAgIHNlcnZpY2VDbGllbnQuc2VuZFJlY2VpdmUoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotICAgICAgICBTT0FQRW52ZWxvcGUgcmVzdWx0ID0gc2VydmljZUNsaWVudC5nZXRMYXN0T3BlcmF0aW9uQ29udGV4dCgpLmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiU09BUCBWZXJzaW9uIHJlY2VpdmVkIGlzIG5vdCBjb21wYXRpYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUNyZWF0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUNyZWF0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkNjNkYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VDcmVhdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUNyZWF0ZVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSB7Ci0KLSAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNsaW5ldENvbmZpZ3VyYXRpb25jdHg7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTZXJ2aWNlQ3JlYXRlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGNsaW5ldENvbmZpZ3VyYXRpb25jdHggPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuCi0gICAgICAgICAgICAgICAgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUNyZWF0ZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZS5jcmVhdGVTZXJ2aWNlKCJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NeVNlcnZpY2UiLCBheGlzQ29uZmlnKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk15U2VydmljZSIsIHNlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJhZGQiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIEF4aXNNZXNzYWdlIG1lc3NnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAvLyBtZXNzZ2UuZ2V0U2NoZW1hRWxlbWVudCgpLnRvU3RyaW5nKCkKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXNzZ2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1lc3NnZS5nZXRTY2hlbWFFbGVtZW50KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgicHV0VmFsdWUiKSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNDb25maWcuZ2V0U2VydmljZSgiTXlTZXJ2aWNlIikpOwotCi0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFJQQ1NlcnZpY2VDbGllbnQoY2xpbmV0Q29uZmlndXJhdGlvbmN0eCwgbnVsbCk7Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvTXlTZXJ2aWNlL2FkZCIpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotCi0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoIjEwMCIpOwotICAgICAgICBhcmdzLmFkZCgiMjAwIik7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gY2xpZW50Lmludm9rZUJsb2NraW5nKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL2VuZ2luZS5heGlzMi5hcGFjaGUub3JnIiwgImFkZCIsICJuczEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpLCAzMDApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZURpc3BhdGNoaW5nVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlRGlzcGF0Y2hpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjQ5OTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlRGlzcGF0Y2hpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VEaXNwYXRjaGluZ1Rlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXN1cGVyLnNldFVwKCk7Ci0gICAgCWRlcGxveUNsYXNzQXNTZXJ2aWNlKEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGF0Y2hXaXRoVVJMT25seSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlEaXNwYXRjaFBoYXNlIGRwID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLSAgICAJZHAuYWRkSGFuZGxlcihuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpKTsKLSAgICAJZHAuYWRkSGFuZGxlcihuZXcgUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpKTsKLSAgICAJc2VydmVyQ29uZmlnLmdldEluRmxvd1BoYXNlcygpLnNldCgxLCBkcCk7Ci0gICAgCQotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgICAgIFN0cmluZyBvbGRBZGRyZXNzID0gc2VuZGVyLmdldE9wdGlvbnMoKS5nZXRUbygpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgU3RyaW5nIG5ld0FkZHJlc3MgPSBvbGRBZGRyZXNzKyIvIitFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FOwotICAgICAgICBzZW5kZXIuZ2V0T3B0aW9ucygpLmdldFRvKCkuc2V0QWRkcmVzcyhuZXdBZGRyZXNzKTsKLSAgICAgICAgc2VuZGVyLmdldE9wdGlvbnMoKS5zZXRBY3Rpb24obnVsbCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0KLSAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwYXRjaFdpdGhVUkxBbmRTT0FQQWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgIFRlc3RpbmdVdGlscy5jb21wYXJlV2l0aENyZWF0ZWRPTUVsZW1lbnQocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcGF0Y2hXaXRoU09BUEJvZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJRGlzcGF0Y2hQaGFzZSBkcCA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0gICAgCWRwLmFkZEhhbmRsZXIobmV3IFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlcigpKTsKLSAgICAJc2VydmVyQ29uZmlnLmdldEluRmxvd1BoYXNlcygpLnNldCgxLCBkcCk7Ci0gICAgCQotICAgIAlTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgCU9NRWxlbWVudCBwYXlsb2FkID0gVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KHNlbmRlci5nZXRPcHRpb25zKCkuZ2V0VG8oKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TZXJ2aWNlRmF1bHRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VGYXVsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ1ZGVjZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VGYXVsdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuRmF1bHRUaHJvd2luZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKiBUaGlzIHRlc3Qgd2lsbCBtYWtlIHN1cmUsIGZhdWx0cyB0aHJvd24gYnkgc2VydmljZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkuICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUZhdWx0VGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9ICJ0ZXN0LXJlc291cmNlcyI7Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRmF1bHRUaHJvd2luZ1NlcnZpY2UiKTsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImVjaG9XaXRoRmF1bHQiKTsKLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU2VydmljZUZhdWx0VGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXVsdFRocm93aW5nU2VydmljZS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjU1NTYiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvIiArIHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpICsgIi8iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlIHRocm93cyBhIGZhdWx0IGZyb20gdGhlIHNlcnZpY2UgaW1wbCwgYnkganVzdCBjcmVhdGluZyBhbiBBeGlzRmF1bHQgZnJvbSBhbGwgdGhlCi0gICAgICogZmF1bHQgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0VGhyb3duQnlTZXJ2aWNlVXNpbmdBeGlzRmF1bHRPbmx5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPQotICAgICAgICAgICAgICAgICAgICBnZXRPTUVsZW1lbnRXaXRoVGV4dChGYXVsdFRocm93aW5nU2VydmljZS5USFJPV19GQVVMVF9BU19BWElTX0ZBVUxUKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdChmYWxzZSk7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKS50b1N0cmluZygpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKCJ0ZXN0OlRlc3RGYXVsdCIpID4gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZigiRmF1bHRSZWFzb248L3NvYXBlbnY6VGV4dD4iKSA+IC0xKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoIlRoaXMgaXMgYSB0ZXN0IEV4Y2VwdGlvbiIpID4gLTEpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogU2VydmljZSBzZW5kcyBvdXQgYSBmYXVsdCwgZmlsbGluZyBhbGwgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBtZXNzYWdlIGNvbnRleHQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRUaHJvd25CeVNlcnZpY2VVc2luZ01lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPQotICAgICAgICAgICAgICAgICAgICBnZXRPTUVsZW1lbnRXaXRoVGV4dChGYXVsdFRocm93aW5nU2VydmljZS5USFJPV19GQVVMVF9XSVRIX01TR19DVFhUKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdChmYWxzZSk7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBudWxsKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKS50b1N0cmluZygpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5pbmRleE9mKCJ0ZXN0OlRlc3RGYXVsdCIpID4gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaW5kZXhPZigiRmF1bHRSZWFzb248L3NvYXBlbnY6VGV4dD4iKSA+IC0xKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmluZGV4T2YoIlRoaXMgaXMgYSB0ZXN0IEV4Y2VwdGlvbiIpID4gLTEpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRPTUVsZW1lbnRXaXRoVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJFY2hvT01FbGVtZW50IiwgbnVsbCk7Ci0gICAgICAgIG9tRWxlbWVudC5zZXRUZXh0KHRleHQpOwotICAgICAgICByZXR1cm4gb21FbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUdyb3VwQ29udGV4dFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUdyb3VwQ29udGV4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxZTgxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VHcm91cENvbnRleHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuUmVxdWVzdENvdW50ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyB0ZXN0IHdpbGwgZmlyc3Qgc2VuZHMgYSByZXF1ZXN0IHRvIGEgZHVtbXkgc2VydmljZSBkZXBsb3llZC4gVGhhdCBzZXJ2aWNlIHdpbGwgZ2V0Ci0gKiBtZXNzYWdlIGNvbnRleHRzIGFzIGlucHV0cyBhbmQgd2lsbCBwdXQgYSBwcm9wZXJ0eSBpbiB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IHRvIGNvdW50IHRoZQotICogbnVtYmVyIG9mIHJlcXVlc3RzLiBUaGVuIHRoZSBjbGllbnQsIHVwb24gcmVjZWl2aW5nIHRoZSByZXNwb25zZSwgZXh0cmFjdHMgdGhlIHNnYyBpZCBmcm9tCi0gKiB0aGUgcmVjZWl2ZWQgbWVzc2FnZSAodGhpcyB3aWxsIGNvbWUgYXMgYSByZWZlcmVuY2UgcGFyYW1ldGVyIGluIHRoZSBSZXBseVRvIEVQUikgYW5kIHNldHMKLSAqIHRoYXQgYXMgYSB0b3AgbGV2ZWwgc29hcCBoZWFkZXIgaW4gdGhlIG5leHQgcmVxdWVzdCB0byB0aGUgc2FtZSBzZXJ2aWNlIGdyb3VwLiBTZXJ2ZXIgd2lsbAotICogY29ycmVjdGx5IGlkZW50aWZ5IHRoZSBzZXJ2aWNlIGdyb3VwIGZyb20gdGhlIGluZm9ybWF0aW9uIHNlbnQgYnkgdGhlIGNsaWVudCBhbmQgcmV0cmlldmUgdGhlCi0gKiBzZ2MgZWFybGllciB1c2VkIGFuZCB3aWxsIHVzZSB0aGF0IGZvciB0aGUgY3VycmVudCByZXF1ZXN0IGFzIHdlbGwuIFRoZSBzZXJ2aWNlIHdpbGwgcmV0cmlldmUKLSAqIHRoZSByZXF1ZXN0IGNvdW50IGZyb20gdGhlIHNnYyBhbmQgaW5jcmVhc2UgdGhhdCBieSBvbmUuCi0gKiA8cC8+Ci0gKiBUZXN0IHdpbGwgYXNzZXJ0cyB3aGV0aGVyIHRoZSBjbGllbnQgZ2V0cyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIGFzIDIsIHdoZW4gaGUgaW52b2tlcyB0d28KLSAqIHRpbWVzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUdyb3VwQ29udGV4dFRlc3QgZXh0ZW5kcyBMb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2UgewotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCXN1cGVyLnNldFVwKCk7Ci0gICAgCUF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBkZXBsb3lDbGFzc0FzU2VydmljZSgiUmVxdWVzdENvdW50ZXIiLCBSZXF1ZXN0Q291bnRlci5jbGFzcyk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0U2NvcGUoQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0Q2xpZW50KCJSZXF1ZXN0Q291bnRlciIsICJnZXRSZXF1ZXN0Q291bnQiKTsKLSAgICAgICAgc2VuZGVyLmdldE9wdGlvbnMoKS5zZXRNYW5hZ2VTZXNzaW9uKHRydWUpOwotICAgICAgICAKLSAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlKG51bGwpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQyID0gc2VuZGVyLnNlbmRSZWNlaXZlKG51bGwpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IHJlc3VsdDIuZ2V0VGV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk51bWJlciBvZiByZXF1ZXN0cyBzaG91bGQgYmUgMiIsIDIsIEludGVnZXIucGFyc2VJbnQodGV4dCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU3BlYWtpbmdIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NwZWFraW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdhNWFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU3BlYWtpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU3BlYWtpbmdIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwZWFraW5nSGFuZGxlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFNwZWFraW5nSGFuZGxlcigpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gIkhpIEkgYW10ZXN0aW5nICI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NwZWFraW5nSGFuZGxlcjEuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU3BlYWtpbmdIYW5kbGVyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYxMWZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU3BlYWtpbmdIYW5kbGVyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBoYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTcGVha2luZ0hhbmRsZXIxIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwZWFraW5nSGFuZGxlcjEuY2xhc3MpOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBTcGVha2luZ0hhbmRsZXIxKFN0cmluZyBtZXNzYWdlLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaGFuZGxlckRlc2Muc2V0TmFtZSgiU3BlYWtpbmdIYW5kbGVyMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoUGhhc2VNZXRhZGF0YS5QSEFTRV9ESVNQQVRDSCk7Ci0gICAgICAgIGhhbmRsZXJEZXNjLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBoYW5kbGVyRGVzYy5zZXRIYW5kbGVyKHRoaXMpOwotICAgICAgICBoYW5kbGVyRGVzYy5zZXROYW1lKG5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBpbml0KGhhbmRsZXJEZXNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uIGdldEhhbmRsZXJEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJEZXNjOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9UZXN0SGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9UZXN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJmMjk3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGVzdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRlc3RIYW5kbGVyIC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFRlc3RIYW5kbGVyKCkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiaW5zaWRlIGludmFsaWQgbW9kdWxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1Rlc3RTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1Rlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTZiYjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9UZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpewotCi0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgYSl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgIHRlc3RGYXVsdChTdHJpbmcgZm9vKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1RoaXJkUGFydHlSZXNwb25zZVJhd1hNTFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVGhpcmRQYXJ0eVJlc3BvbnNlUmF3WE1MVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODViNmE3NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1RoaXJkUGFydHlSZXNwb25zZVJhd1hNTFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgVGhpcmRQYXJ0eVJlc3BvbnNlUmF3WE1MVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoVGhpcmRQYXJ0eVJlc3BvbnNlUmF3WE1MVGVzdC5jbGFzcykpOwotICAgIH0KLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gcmVjZWl2ZWQ7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJpdmF0ZSBTaW1wbGVIVFRQU2VydmVyIHJlY2VpdmVyOwotICAgIHByaXZhdGUgU3RyaW5nIGNhbGxiYWNrT3BlcmF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGNhbGxiYWNrU2VydmljZU5hbWUgPSAiQ2FsbGJhY2tTZXJ2aWNlIjsKLSAgICBwcml2YXRlIGludCBjYWxsYmFja3NlcnZlclBvcnQgPSAxNzQ1ODsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgY2FsbGJhY2tPcGVyYXRpb24gPSAiY2FsbGJhY2siOwotICAgIAlBeGlzU2VydmljZSBjYWxsYmFja1NlcnZpY2UgID0gVXRpbHMuY3JlYXRlU2ltcGxlSW5Pbmx5U2VydmljZShuZXcgUU5hbWUoY2FsbGJhY2tTZXJ2aWNlTmFtZSksbmV3IE1lc3NhZ2VSZWNlaXZlcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtZXNzYWdlQ3R4LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIHJlY2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSxuZXcgUU5hbWUoY2FsbGJhY2tPcGVyYXRpb24pKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKGNhbGxiYWNrU2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICByZWNlaXZlciA9IG5ldyBTaW1wbGVIVFRQU2VydmVyKFV0aWxTZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSwgY2FsbGJhY2tzZXJ2ZXJQb3J0KTsKLSAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiaW50ZWdyYXRpb25SZXBvLyIpLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgT3B0aW9ucyBvcCA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIAotICAgICAgICBvcC5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMToiKyhjYWxsYmFja3NlcnZlclBvcnQpKyIvYXhpczIvc2VydmljZXMvIitjYWxsYmFja1NlcnZpY2VOYW1lKyAiLyIrY2FsbGJhY2tPcGVyYXRpb24pKTsKLSAgICAgICAgb3Auc2V0QWN0aW9uKCJ1cm46U29tZUFjdGlvbiIpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcCk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKTsKLSAgICAgICAgc2VuZGVyLmZpcmVBbmRGb3JnZXQoVGVzdGluZ1V0aWxzLmNyZWF0ZUR1bW15T01FbGVtZW50KCkpOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAoIXJlY2VpdmVkKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IDIwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiZXJyb3IgT2NjdXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmVjZWl2ZXIuc3RvcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9UaHJlYWRpbmdUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1RocmVhZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2MGM4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1RocmVhZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5JbnZva2VyVGhyZWFkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLXB1YmxpYyBjbGFzcyBUaHJlYWRpbmdUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFRocmVhZGluZ1Rlc3QuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIFFOYW1lIHRyYW5zcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoVGhyZWFkaW5nVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbnVtYmVyT2ZUaHJlYWRzID0gNTsKLSAgICAgICAgSW52b2tlclRocmVhZFtdIGludm9rZXJUaHJlYWRzID0gbmV3IEludm9rZXJUaHJlYWRbbnVtYmVyT2ZUaHJlYWRzXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mVGhyZWFkczsgaSsrKSB7Ci0gICAgICAgICAgICBJbnZva2VyVGhyZWFkIGludm9rZXJUaHJlYWQgPSBuZXcgSW52b2tlclRocmVhZChpICsgMSk7Ci0gICAgICAgICAgICBpbnZva2VyVGhyZWFkc1tpXSA9IGludm9rZXJUaHJlYWQ7Ci0gICAgICAgICAgICBpbnZva2VyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHRocmVhZHNBcmVSdW5uaW5nOwotICAgICAgICBDYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgaW50IG1pbiA9IGNhbC5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB0aHJlYWRzQXJlUnVubmluZyA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlRocmVhZHM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpbnZva2VyVGhyZWFkc1tpXS5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkc0FyZVJ1bm5pbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGludm9rZXJUaHJlYWRzW2ldLmdldFRocm93bkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFeGNlcHRpb24gdGhyb3duIGluIHRocmVhZCAiICsgaSArICIgLi4uLiIsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3YWl0aW5nIDMgc2Vjb25kcywgaWYgbm90IGZpbmlzaCwgdGltZSBvdXQuCi0gICAgICAgICAgICBpZiAoTWF0aC5hYnMobWluIC0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCkuZ2V0KENhbGVuZGFyLk1JTlVURSkpID4gMSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJJJ20gdGltaW5nIG91dC4gQ2FuJ3Qgd2FpdCBtb3JlIHRoYW4gdGhpcyB0byBmaW5pc2guIik7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVGltaW5nIG91dCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgICAgfSB3aGlsZSAodGhyZWFkc0FyZVJ1bm5pbmcpOwotCi0gICAgICAgIGFzc2VydFRydWUodHJ1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Vc2luZ1RyYW5zcG9ydFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvVXNpbmdUcmFuc3BvcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTIxZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Vc2luZ1RyYW5zcG9ydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLkxvY2FsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBVc2luZ1RyYW5zcG9ydFRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGRlcGxveUNsYXNzQXNTZXJ2aWNlKEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUFZlcnNpb25pbmcoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldENsaWVudChFY2hvLlNFUlZJQ0VfTkFNRSwgRWNoby5FQ0hPX09NX0VMRU1FTlRfT1BfTkFNRSk7Ci0gICAgCXNlbmRlci5nZXRPcHRpb25zKCkuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgCXNlbmRlci5zZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dCh0cnVlKTsKLSAgICAJT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLnNlbmRSZWNlaXZlKFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpKTsKLSAgICAJVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXNwb25zZSk7Ci0gICAgCVNPQVBFbnZlbG9wZSByZXN1bHQgPQotICAgICAgICAgICAgc2VuZGVyLmdldExhc3RPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKS5nZXRFbnZlbG9wZSgpOwotICAgIAkgYXNzZXJ0RXF1YWxzKCJTT0FQIFZlcnNpb24gcmVjZWl2ZWQgaXMgbm90IGNvbXBhdGlibGUiLAotICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBUaGUgdmFsaWQgY2FzZSBpcyBjb3ZlcmVkIGJ5IGxvYWRzIG9mIG90aGVyIHRlc3RzLi4uCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmFuc3BvcnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRDbGllbnQoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uRUNIT19PTV9FTEVNRU5UX09QX05BTUUpOwotICAgIAlTdHJpbmcgb2xkQWRkcmVzcyA9IHNlbmRlci5nZXRPcHRpb25zKCkuZ2V0VG8oKS5nZXRBZGRyZXNzKCk7Ci0gICAgCVN0cmluZyBuZXdBZGRyZXNzID0gImxjbCIrb2xkQWRkcmVzcy5zdWJzdHJpbmcoNSk7Ci0gICAgCXNlbmRlci5nZXRPcHRpb25zKCkuZ2V0VG8oKS5zZXRBZGRyZXNzKG5ld0FkZHJlc3MpOwotICAgIAlzZW5kZXIuZ2V0T3B0aW9ucygpLnNldFRyYW5zcG9ydE91dChudWxsKTsKLSAgICAJdHJ5IHsKLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZShUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RpbmcgYSBmYWlsdXJlIC0gc2hvdWxkbid0IGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSBvdXQgdHJhbnNwb3J0IGZyb20gJ2xjbCciKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RpbmcgYW4gZXhjZXB0aW9uIG9mIHR5cGUgW29yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0XSIsCi0gICAgICAgICAgICAgICAgICAgICAgIChleCBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1dTRExDbGllbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1dTRExDbGllbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YWZlNDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9XU0RMQ2xpZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFdTRExDbGllbnRUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoV1NETENsaWVudFRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbFNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICBzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDoiICsgVXRpbFNlcnZlci5URVNUSU5HX1BPUlQgKwotICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2U/d3NkbCIpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudChudWxsLCB3c2RsVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9lbmdpbmUuYXhpczIuYXBhY2hlLm9yZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG9YTUxTZXJ2aWNlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY2hvSHR0cFNvYXAxMUVuZHBvaW50Iik7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0KLSAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoImh0dHA6Ly9lbmdpbmUuYXhpczIuYXBhY2hlLm9yZyIpOwotICAgICAgICBTdHJpbmcgZXByID0gImh0dHA6Ly8xMjcuMC4wLjE6IiArIFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUICsKLSAgICAgICAgICAgICAgICAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlIjsKLSAgICAgICAgLy9UaGlzIGlzIG5vdCBzbXQgd2UgbmVlZCB0byBkbyBidXQgLCBteSBidWlsZCBpcyBmYWlsIGlmIEkgZG9udCBkbyB0aGF0IDopCi0gICAgICAgIHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShlcHIpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpLmdldFRvKCkuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShuZXcgUU5hbWUoImh0dHA6Ly9lbmdpbmUuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvT00iKSwgcGF5bG9hZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOwotICAgICAgICBTdHJpbmcgdGV4dFZhbHVlID0gcmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHModGV4dFZhbHVlLCAiSXNhYWMgQXNpbW92LCBUaGUgRm91bmRhdGlvbiBUcmlsb2d5Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9jaHVua2luZy1kaXNhYmxlZC1heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NodW5raW5nLWRpc2FibGVkLWF4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0NzlkZmY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY2h1bmtpbmctZGlzYWJsZWQtYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VyYWxpemVMb2NhdGlvbiI+LjwvcGFyYW1ldGVyPgotICAgIDxob3N0Q29uZmlndXJhdGlvbj4KLSAgICAgICAgPGlwPjEyNy4wLjAuMTwvaXA+Ci0gICAgICAgIDxwb3J0PjU1NTU8L3BvcnQ+Ci0gICAgPC9ob3N0Q29uZmlndXJhdGlvbj4KLQotCi0gICAgPCEtLWlmIHlvdSB3YW50IHRvIGV4dHJhY3QgdGhlIHNlcnZpY2UgYXJjaGl2ZSBmaWxlIGFuZCB3b3JrIHdpdGggdGhhdCBwbGVhc2UgdW5jb21tZW50IHRoaXMtLT4KLSAgICA8IS0tZWxzZSAsIGl0IHdvbnQgZXh0cmFjdCBhcmNoaXZlIGZpbGUgb3IgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gaWYgc29tZW9uZSBkcm9wLS0+Ci0gICAgPCEtLWV4cGxvZGVkIGRpcmVjdG9yeSBpbnRvIC9zZXJ2aWNlIGRpcmVjdG9yeS0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImV4dHJhY3RTZXJ2aWNlQXJjaGl2ZSI+dHJ1ZTwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+Ci0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY2h1bmtpbmctZW5hYmxlZC1heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NodW5raW5nLWVuYWJsZWQtYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM0ZTJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY2h1bmtpbmctZW5hYmxlZC1heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmcKLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL2NvbW1vbnMtaHR0cC1lbmFibGVkLWF4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY29tbW9ucy1odHRwLWVuYWJsZWQtYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM0YmM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvY29tbW9ucy1odHRwLWVuYWJsZWQtYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIFJlcXVlc3QgUmVzcG9uc2Ugc3R5bGUgT3BlcmF0aW9ucyAtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGVuYWJsZSBBZGRyZXNzaW5nCi0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4gLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9GYXVsdEhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9GYXVsdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhOTI1MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvRmF1bHRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEZhdWx0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfUkVBU09OID0KLSAgICAgICAgICAgICJUaGlzIGlzIGEgdGVzdCBmYXVsdCBtZXNzYWdlIHdoaWNoIGhhcHBlbmVkIHN1ZGRlbmx5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfTU9SRV9JTkZPID0KLSAgICAgICAgICAgICJUaGlzIGVycm9yIGlzIGEgcmVzdWx0IGR1ZSB0byBhIGZha2UgcHJvYmxlbSBpbiBBeGlzMiBlbmdpbmUuIERvIG5vdCB3b3JyeSA7KSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTV9GQVVMVF9FWENFUFRJT04gPSAibTpGYXVsdEV4Y2VwdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJfSEFORExJTkdfV0lUSF9NU0dfQ1RYVCA9ICJFcnJvckhhbmRsaW5nV2l0aFBhcmFtc1NldFRvTXNnQ3R4dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJSX0hBTkRMSU5HX1dJVEhfQVhJU19GQVVMVCA9Ci0gICAgICAgICAgICAiRXJyb3JIYW5kbGluZ1dpdGhQYXJhbXNTZXRUb0F4aXNGYXVsdCI7Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gdGhpcyBoYW5kbGVyIHdpbGwgYmUgdXNlZCB0byBjaGVjayB0aGUgZmF1bHQgaGFuZGxpbmcgb2YgQXhpczIuCi0gICAgICAgIC8vIHRoaXMgd2lsbCBjcmVhdGUgc29tZSBkdW1teSBmYXVsdHMgYW5kIHNlbmQKLQotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjID0gbXNnQ29udGV4dC5pc1NPQVAxMSgpID8gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpIDoKLSAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0KLSAgICAgICAgLy8gSSBoYXZlIGEgc3VkZGVuIGZha2UgZXJyb3IgOykKLSAgICAgICAgT01FbGVtZW50IGZpcnN0RWxlbWVudCA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgT01FbGVtZW50IGRldGFpbEVudHJ5ID0gc29hcEZhYy5jcmVhdGVPTUVsZW1lbnQoIk1vcmVJbmZvIiwgbnVsbCk7Ci0gICAgICAgIGRldGFpbEVudHJ5LnNldFRleHQoREVUQUlMX01PUkVfSU5GTyk7Ci0KLSAgICAgICAgaWYgKEVSUl9IQU5ETElOR19XSVRIX01TR19DVFhULmVxdWFscyhmaXJzdEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGUgPSBzb2FwRmFjLmNyZWF0ZVNPQVBGYXVsdENvZGUoKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUuZGVjbGFyZU5hbWVzcGFjZSgiaHR0cDovL3NvbWV1cmkub3JnIiwgIm0iKTsKLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHRDb2RlLnNldFRleHQoTV9GQVVMVF9FWENFUFRJT04pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwRmF1bHRWYWx1ZSA9IHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0VmFsdWUoc29hcEZhdWx0Q29kZSk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0VmFsdWUuc2V0VGV4dChNX0ZBVUxUX0VYQ0VQVElPTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb24gPSBzb2FwRmFjLmNyZWF0ZVNPQVBGYXVsdFJlYXNvbigpOwotCi0gICAgICAgICAgICBpZiAobXNnQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0UmVhc29uLnNldFRleHQoRkFVTFRfUkVBU09OKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0VGV4dC5zZXRMYW5nKCJlbiIpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdFRleHQuc2V0VGV4dChGQVVMVF9SRUFTT04pOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdFJlYXNvbi5hZGRTT0FQVGV4dChzb2FwRmF1bHRUZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU09BUEZhdWx0RGV0YWlsIGZhdWx0RGV0YWlsID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHREZXRhaWwoKTsKLSAgICAgICAgICAgIGZhdWx0RGV0YWlsLmFkZERldGFpbEVudHJ5KGRldGFpbEVudHJ5KTsKLQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9DT0RFX0xPQ0FMX05BTUUsIHNvYXBGYXVsdENvZGUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9SRUFTT05fTE9DQUxfTkFNRSwgc29hcEZhdWx0UmVhc29uKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfREVUQUlMX0xPQ0FMX05BTUUsIGZhdWx0RGV0YWlsKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQSBkdW1teSBleGNlcHRpb24gaGFzIG9jY3VycmVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoRVJSX0hBTkRMSU5HX1dJVEhfQVhJU19GQVVMVC5lcXVhbHMoZmlyc3RFbGVtZW50LmdldExvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChuZXcgUU5hbWUoTV9GQVVMVF9FWENFUFRJT04pLCBGQVVMVF9SRUFTT04sIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbEVudHJ5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9GYXVsdFRocm93aW5nU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL0ZhdWx0VGhyb3dpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDYyMjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL0ZhdWx0VGhyb3dpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEZhdWx0VGhyb3dpbmdTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUk9XX0ZBVUxUX0FTX0FYSVNfRkFVTFQgPSAiVGhyb3dGYXVsdEFzQXhpc0ZhdWx0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJPV19GQVVMVF9XSVRIX01TR19DVFhUID0gIlRocm93RmF1bHRXaXRoTXNnQ3R4dCI7Ci0KLSAgICBwcml2YXRlIFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZTsKLSAgICBwcml2YXRlIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb247Ci0gICAgcHJpdmF0ZSBTT0FQRmF1bHREZXRhaWwgc29hcEZhdWx0RGV0YWlsOwotCi0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvV2l0aEZhdWx0KE9NRWxlbWVudCBlY2hvT01FbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBlY2hvT01FbGVtZW50LmdldFRleHQoKTsKLSAgICAgICAgaWYgKFRIUk9XX0ZBVUxUX0FTX0FYSVNfRkFVTFQuZXF1YWxzSWdub3JlQ2FzZSh0ZXh0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0Lm9yZyIsICJUZXN0RmF1bHQiLCAidGVzdCIpLCAiRmF1bHRSZWFzb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCJUaGlzIGlzIGEgdGVzdCBFeGNlcHRpb24iKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoVEhST1dfRkFVTFRfV0lUSF9NU0dfQ1RYVC5lcXVhbHNJZ25vcmVDYXNlKHRleHQpKSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2VDb250ZXh0ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBpbml0RmF1bHRJbmZvcm1hdGlvbihpbk1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9DT0RFX0xPQ0FMX05BTUUsIHNvYXBGYXVsdENvZGUpOwotICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfUkVBU09OX0xPQ0FMX05BTUUsIHNvYXBGYXVsdFJlYXNvbik7Ci0gICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5zZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9ERVRBSUxfTE9DQUxfTkFNRSwgc29hcEZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkZha2UgZXhjZXB0aW9uIG9jY3VycmVkICEhIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZWNob09NRWxlbWVudDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0RmF1bHRJbmZvcm1hdGlvbihNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5OwotICAgICAgICBpZiAoaW5NZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc29hcEZhdWx0Q29kZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdENvZGUoKTsKLSAgICAgICAgU09BUEZhdWx0VmFsdWUgc29hcEZhdWx0VmFsdWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgc29hcEZhdWx0VmFsdWUuc2V0VGV4dChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0Lm9yZyIsICJUZXN0RmF1bHQiLCAidGVzdCIpKTsKLQotICAgICAgICBzb2FwRmF1bHRSZWFzb24gPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRSZWFzb24oKTsKLSAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VGV4dChzb2FwRmF1bHRSZWFzb24pOwotICAgICAgICBzb2FwRmF1bHRUZXh0LnNldFRleHQoIlRoaXMgaXMgc29tZSBGYXVsdFJlYXNvbiIpOwotCi0gICAgICAgIHNvYXBGYXVsdERldGFpbCA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdERldGFpbCgpOwotICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3NvbWV1cmkub3JnIiwgIkZhdWx0RXhjZXB0aW9uIik7Ci0gICAgICAgIE9NRWxlbWVudCBkZXRhaWwgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQocU5hbWUsIHNvYXBGYXVsdERldGFpbCk7Ci0gICAgICAgIHFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vc29tZXVyaS5vcmciLCAiRXhjZXB0aW9uTWVzc2FnZSIpOwotICAgICAgICBUaHJvd2FibGUgZSA9IG5ldyBFeGNlcHRpb24oIlRoaXMgaXMgYSB0ZXN0IEV4Y2VwdGlvbiIpOwotICAgICAgICB3aGlsZSAoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZXhjZXB0aW9uID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KHFOYW1lLCBudWxsKTsKLSAgICAgICAgICAgIGV4Y2VwdGlvbi5zZXRUZXh0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGRldGFpbC5hZGRDaGlsZChleGNlcHRpb24pOwotICAgICAgICAgICAgZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvSW52b2tlclRocmVhZC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL0ludm9rZXJUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlMDdlMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvSW52b2tlclRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgSW52b2tlclRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0KLSAgICBwcml2YXRlIGludCB0aHJlYWROdW1iZXI7Ci0gICAgcHJvdGVjdGVkIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9Ci0gICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6IgotICAgICAgICAgICAgICAgICAgICArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLSAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLSAgICBwcm90ZWN0ZWQgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob09NRWxlbWVudCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhJbnZva2VyVGhyZWFkLmNsYXNzKTsKLSAgICBwcml2YXRlIEV4Y2VwdGlvbiB0aHJvd25FeGNlcHRpb24gPSBudWxsOwotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICBwdWJsaWMgSW52b2tlclRocmVhZChpbnQgdGhyZWFkTnVtYmVyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy50aHJlYWROdW1iZXIgPSB0aHJlYWROdW1iZXI7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9nLmluZm8oIlN0YXJ0aW5nIFRocmVhZCBudW1iZXIgIiArIHRocmVhZE51bWJlciArICIgLi4uLi4uLi4uLi4uLiIpOwotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLQotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICAgICAgVGVzdGluZ1V0aWxzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXN1bHQpOwotICAgICAgICAgICAgbG9nLmluZm8oIkZpbmlzaGluZyBUaHJlYWQgbnVtYmVyICIgKyB0aHJlYWROdW1iZXIgKyAiIC4uLi4uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbiA9IGF4aXNGYXVsdDsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgaGFzIG9jY3VyZWQgaW52b2tpbmcgdGhlIHNlcnZpY2UgIiwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0VGhyb3duRXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhyb3duRXhjZXB0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9SZXF1ZXN0Q291bnRlci5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL1JlcXVlc3RDb3VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NmI3ZGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL1JlcXVlc3RDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdENvdW50ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfQ09VTlQgPSAiUmVxdWVzdF9Db3VudCI7Ci0KLQlwdWJsaWMgT01FbGVtZW50IGdldFJlcXVlc3RDb3VudChPTUVsZW1lbnQgb2UpIHsKLQkJTWVzc2FnZUNvbnRleHQgbXNnID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0JCQotCQlJbnRlZ2VyIHJlcXVlc3RDb3VudCA9IChJbnRlZ2VyKW1zZy5nZXRQcm9wZXJ0eShSRVFVRVNUX0NPVU5UKTsKLQkJaWYgKHJlcXVlc3RDb3VudCA9PSBudWxsKSB7Ci0JCQlyZXF1ZXN0Q291bnQgPSBuZXcgSW50ZWdlcigxKTsKLQkJfSBlbHNlIHsKLQkJCXJlcXVlc3RDb3VudCA9IG5ldyBJbnRlZ2VyKHJlcXVlc3RDb3VudC5pbnRWYWx1ZSgpICsgMSk7Ci0JCX0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2djID0gbXNnLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0JCXNnYy5zZXRQcm9wZXJ0eShSRVFVRVNUX0NPVU5ULCByZXF1ZXN0Q291bnQpOwotCQkKLQkJUU5hbWUgcW4gPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL25hbWVzcGFjZXMvIiwgIlJlcXVlc3RDb3VudCIsImF4aXMyIik7Ci0JCU9NRWxlbWVudCByZXNwb25zZSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudChxbik7Ci0JCXJlc3BvbnNlLnNldFRleHQocmVxdWVzdENvdW50LnRvU3RyaW5nKCkpOwotCQkKLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL1Rlc3RDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9UZXN0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTBlOTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL1Rlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKiogVGhpcyB3aWxsIGNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIHNoYXJlZCBhY3Jvc3MgdGhlIGludGVncmF0aW9uIHRlc3QgY2FzZXMuICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIDU1NTYKLSAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9PTUVsZW1lbnQiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9YTUxTZXJ2aWNlIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImVjaG9PTUVsZW1lbnQiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc3dhU2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9Td0FTZXJ2aWNlIik7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL0NsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL3Byb2ZpbGluZy9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2NDdlYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLnByb2ZpbGluZzsKLQotcHVibGljIGNsYXNzIENsaWVudCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIENvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwgY29udGV4dE1lbW9yeUhhbmRsaW5nVGVzdCA9IG5ldyBDb250ZXh0TWVtb3J5SGFuZGxpbmdVdGlsKCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvbmcgaW5pdGlhbE1lbW9yeSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW5pdGlhbE1lbW9yeSA9ICIgKyBpbml0aWFsTWVtb3J5KTsKLSAgICAgICAgICAgIGludCBudW1iZXJPZlRpbWVzID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLS8vICAgICAgICAgICAgd2hpbGUgKG51bWJlck9mVGltZXMgPCA1MCkgewotCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVyYXRpb25zICMgPSAiICsgKytudW1iZXJPZlRpbWVzKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0TWVtb3J5SGFuZGxpbmdUZXN0LnJ1bk9uY2UoKTsKLSAgICAgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJNZW1vcnkgVXNhZ2UgPSAiICsgKGluaXRpYWxNZW1vcnkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkpKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS91dGlsL3Byb2ZpbGluZy9Db250ZXh0TWVtb3J5SGFuZGxpbmdVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL0NvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYyYTQ2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL0NvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5wcm9maWxpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbCBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLS8vICAgICAgICAgICAgImh0dHA6Ly8xOTIuMTY4LjEuMjE5OiIgKyA4MDgwCi0vLyAgICAgICAgICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL2VjaG8vZWNob09NRWxlbWVudCIpOwotLy8KLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImVjaG8iKTsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob09NRWxlbWVudCIpOwotCi0gICAgcHVibGljIENvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IFRlc3RpbmdVdGlscy5jcmVhdGVEdW1teU9NRWxlbWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBUZXN0aW5nVXRpbHMuY29tcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29udGV4dE1lbW9yeUhhbmRsaW5nVXRpbCBjb250ZXh0TWVtb3J5SGFuZGxpbmdUZXN0ID0gbmV3IENvbnRleHRNZW1vcnlIYW5kbGluZ1V0aWwoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9uZyBpbml0aWFsTWVtb3J5ID0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbml0aWFsTWVtb3J5ID0gIiArIGluaXRpYWxNZW1vcnkpOwotICAgICAgICAgICAgaW50IG51bWJlck9mVGltZXMgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXRlcmF0aW9ucyAjID0gIiArICsrbnVtYmVyT2ZUaW1lcyk7Ci0gICAgICAgICAgICAgICAgY29udGV4dE1lbW9yeUhhbmRsaW5nVGVzdC5ydW5PbmNlKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBVc2FnZSA9ICIgKyAoaW5pdGlhbE1lbW9yeSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KC0xKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvU2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL3V0aWwvcHJvZmlsaW5nL1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE5ZDk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvdXRpbC9wcm9maWxpbmcvU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwucHJvZmlsaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIHNlcnZpY2UgPQotICAgICAgICAgICAgICAgIFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnN0b3AoKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgc2VydmVyLnNodXRkb3duKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXVsdHMvRmF1bHRTZXJpYWxpemF0aW9uVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ZhdWx0cy9GYXVsdFNlcmlhbGl6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjU3NjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ZhdWx0cy9GYXVsdFNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmZhdWx0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEZhdWx0U2VyaWFsaXphdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgUkVBU09OID0gIlJlYXNvblZhbHVlIjsKLQotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgU09BUEZhdWx0Q29kZSBzb2FwRmF1bHRDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZSgpOwotICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwRmF1bHRWYWx1ZSA9IHNvYXBGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZVNPQVBGYXVsdFZhbHVlKHNvYXBGYXVsdENvZGUpOwotICAgICAgICBzb2FwRmF1bHRWYWx1ZS5zZXRUZXh0KG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLCAiU2VuZGVyIikpOwotCi0gICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb24gPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRSZWFzb24oKTsKLSAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0gc29hcEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlU09BUEZhdWx0VGV4dChzb2FwRmF1bHRSZWFzb24pOwotICAgICAgICBzb2FwRmF1bHRUZXh0LnNldFRleHQoUkVBU09OKTsKLQotICAgICAgICBTT0FQRmF1bHREZXRhaWwgc29hcEZhdWx0RGV0YWlsID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0RGV0YWlsKCk7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vbXljb21wYW55LmNvbSIsICJGYXVsdEV4Y2VwdGlvbiIsICJleCIpOwotICAgICAgICBPTUVsZW1lbnQgZXhjZXB0aW9uID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KHFOYW1lLAotICAgICAgICAgICAgICAgIHNvYXBGYXVsdERldGFpbCk7Ci0gICAgICAgIGV4Y2VwdGlvbi5zZXRUZXh0KCJEZXRhaWwgdGV4dCIpOwotICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSBuZXcgQXhpc0ZhdWx0KHNvYXBGYXVsdENvZGUsIHNvYXBGYXVsdFJlYXNvbiwgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLCBzb2FwRmF1bHREZXRhaWwpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdHggPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIGN0eC5zZXRFbnZlbG9wZShmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdEN0eCA9IE1lc3NhZ2VDb250ZXh0QnVpbGRlcgotICAgICAgICAgICAgICAgIC5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KGN0eCwgZmF1bHQpOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFRyYW5zcG9ydFV0aWxzLndyaXRlTWVzc2FnZShmYXVsdEN0eCwgYm9zKTsKLQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgLy8gRm9yIHJpZ2h0IG5vdywganVzdCBtYWtpbmcgc3VyZSB3ZSBoYXZlIGEgdGVzdCBmb3IgQVhJUzItMjc1MgotICAgICAgICAvLyBDb25maXJtIHJlYXNvbiB3YXMgY29ycmVjdGx5IHByb2Nlc3NlZAotICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3Qgb3IgbWlzc2luZyByZWFzb24hIiwgcmVzdWx0LmluZGV4T2YoUkVBU09OKSA+IC0xKTsKLSAgICB9Ci0KLSAgICAvLyB0ZXN0IGZvciBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyLTE3MDMKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRSZWFzb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChuZXcgUU5hbWUoInRlc3ROcyIsCi0gICAgICAgICAgICAgICAgInRlc3QiKSk7Ci0gICAgICAgIFN0cmluZyBmYXVsdFJlYXNvbiA9ICJteUZhdWx0UmVhc29uIjsKLSAgICAgICAgQXhpc0ZhdWx0IGZhdWx0ID0gbmV3IEF4aXNGYXVsdChuZXcgUU5hbWUoIm15UW5hbWUiKSwgZmF1bHRSZWFzb24sCi0gICAgICAgICAgICAgICAgIm15RmF1bHROb2RlIiwgIm15RmF1bHRSb2xlIiwgcmVzcG9uc2UpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBjdHggPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIGN0eC5zZXRFbnZlbG9wZShmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdEN0eCA9IE1lc3NhZ2VDb250ZXh0QnVpbGRlcgotICAgICAgICAgICAgICAgIC5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KGN0eCwgZmF1bHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhmYXVsdFJlYXNvbiwgVXRpbHMuZ2V0SW5ib3VuZEZhdWx0RnJvbU1lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgIGZhdWx0Q3R4KS5nZXRSZWFzb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ZhdWx0cy9TZW5kaW5nUmVzcG9uc2VGYXVsdFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9mYXVsdHMvU2VuZGluZ1Jlc3BvbnNlRmF1bHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyODUwZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ZhdWx0cy9TZW5kaW5nUmVzcG9uc2VGYXVsdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5mYXVsdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNlbmRpbmdSZXNwb25zZUZhdWx0VGVzdCBleHRlbmRzIExvY2FsVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0QmFkUmVzcG9uc2UoT01FbGVtZW50IGUpIHsKLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtID0gZmFjLmNyZWF0ZU9NRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly9ucyIsICJ0ZXh0IikpOwotICAgICAgICAgICAgU3RyaW5nIGJhZFRleHQgPSAidGhpcyBjaGFyIGlzIGJhZCAtICIgKyAnXDEwJzsKLSAgICAgICAgICAgIGVsZW0uc2V0VGV4dChiYWRUZXh0KTsKLSAgICAgICAgICAgIHJldHVybiBlbGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBTRVJWSUNFID0gInNlcnZpY2UiOwotICAgICAgICBkZXBsb3lDbGFzc0FzU2VydmljZShTRVJWSUNFLCBTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoU0VSVklDRSwgImdldEJhZFJlc3BvbnNlIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGllbnQuc2VuZFJlY2VpdmUobnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGlzIE5PVCB0aGUgInJlYWwiIGZhdWx0ICh3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHN3YWxsb3dlZCB3aGlsZQotICAgICAgICAgICAgLy8gd3JpdGluZyB0aGUgcmVzcG9uc2UpCi0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiR290IHVuZXhwZWN0ZWQgZmF1bHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKS5jb250ZW50RXF1YWxzKG5ldyBTdHJpbmdCdWZmZXIoIkludmFsaWQgd2hpdGUgc3BhY2UgY2hhcmFjdGVyIikpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9Mb2NhbFRlc3RDYXNlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vTG9jYWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWM3MDc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9Mb2NhbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jbGllbnQuUlBDU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBMb2NhbFRlc3RDYXNlIGlzIGFuIGV4dGVuZGFibGUgYmFzZSBjbGFzcyB3aGljaCBwcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eQotICogZm9yIGJ1aWxkaW5nIEpVbml0IHRlc3RzIHdoaWNoIGV4ZXJjaXNlIEF4aXMyIHVzaW5nIHRoZSAoZmFzdCwgaW4tcHJvY2VzcykKLSAqICJsb2NhbCIgdHJhbnNwb3J0LgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAvKiogT3VyIHNlcnZlciBBeGlzQ29uZmlndXJhdGlvbiAqLwotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBzZXJ2ZXJDb25maWc7Ci0KLSAgICAvKiogT3VyIGNsaWVudCBDb25maWd1cmF0aW9uQ29udGV4dCAqLwotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjbGllbnRDdHg7Ci0KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgc2VydmVyQ3R4OwotCi0gICAgTG9jYWxUcmFuc3BvcnRTZW5kZXIgc2VuZGVyID0gbmV3IExvY2FsVHJhbnNwb3J0U2VuZGVyKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDb25maWd1cmF0aW9uIC0gc2VydmVyIHNpZGUKLSAgICAgICAgc2VydmVyQ3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCk7Ci0gICAgICAgIHNlcnZlckNvbmZpZyA9IHNlcnZlckN0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyLkNPTkZJR19DT05URVhUID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KHNlcnZlckNvbmZpZyk7Ci0gICAgICAgIExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuQ09ORklHX0NPTlRFWFQuc2V0U2VydmljZVBhdGgoInNlcnZpY2VzIik7Ci0gICAgICAgIExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuQ09ORklHX0NPTlRFWFQuc2V0Q29udGV4dFJvb3QoImxvY2FsOi8iKTsKLSAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdE91dCA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbihDb25zdGFudHMuVFJBTlNQT1JUX0xPQ0FMKTsKLSAgICAgICAgdE91dC5zZXRTZW5kZXIobmV3IExvY2FsVHJhbnNwb3J0U2VuZGVyKCkpOwotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkVHJhbnNwb3J0T3V0KHRPdXQpOwotCi0vLyAgICAgICAgYWRkSW5QaGFzZXMoc2VydmVyQ29uZmlnLmdldEluRmxvd1BoYXNlcygpKTsKLS8vICAgICAgICBEaXNwYXRjaFBoYXNlIGRwID0gKERpc3BhdGNoUGhhc2Upc2VydmVyQ29uZmlnLmdldEluRmxvd1BoYXNlcygpLmdldCgxKTsKLS8vICAgICAgICBkcC5hZGRIYW5kbGVyKG5ldyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyKCkpOwotLy8KLS8vICAgICAgICBhZGRJblBoYXNlcyhzZXJ2ZXJDb25maWcuZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKSk7Ci0vLwotLy8gICAgICAgIGFkZE91dFBoYXNlcyhzZXJ2ZXJDb25maWcuZ2V0T3V0Rmxvd1BoYXNlcygpKTsKLS8vICAgICAgICBhZGRPdXRQaGFzZXMoc2VydmVyQ29uZmlnLmdldE91dEZhdWx0Rmxvd1BoYXNlcygpKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAvLyBTZXQgdXAgcmF3IG1lc3NhZ2UgcmVjZWl2ZXJzIGZvciBPTUVsZW1lbnQgYmFzZWQgdGVzdHMKLQotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgc2VydmVyQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAvLyBBbmQgY2xpZW50IHNpZGUKLSAgICAgICAgY2xpZW50Q3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHdlbGwta25vd24gUGhhc2VzIG9uIHRoZSBpbiBzaWRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvdyB0aGUgRmxvdyBpbiB3aGljaCB0byBhZGQgdGhlc2UgUGhhc2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEluUGhhc2VzKEFycmF5TGlzdCBmbG93KSB7Ci0gICAgICAgIGZsb3cuYWRkKG5ldyBQaGFzZSgiUHJlRGlzcGF0Y2giKSk7Ci0gICAgICAgIFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgZmxvdy5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHdlbGwta25vd24gUGhhc2VzIG9uIHRoZSBvdXQgc2lkZQotICAgICAqCi0gICAgICogQHBhcmFtIGZsb3cgdGhlIEZsb3cgaW4gd2hpY2ggdG8gYWRkIHRoZXNlIFBoYXNlcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRPdXRQaGFzZXMoQXJyYXlMaXN0IGZsb3cpIHsKLSAgICAgICAgZmxvdy5hZGQobmV3IFBoYXNlKCJNZXNzYWdlT3V0IikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlcGxveSBhIGNsYXNzIGFzIGEgc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzZXJ2aWNlIG5hbWUKLSAgICAgKiBAcGFyYW0gbXlDbGFzcyB0aGUgSmF2YSBjbGFzcyB0byBkZXBsb3kgKGFsbCBtZXRob2RzIGV4cG9zZWQgYnkgZGVmYXVsdCkKLSAgICAgKiBAcmV0dXJuIGEgZnVsbHkgY29uZmlndXJlZCBBeGlzU2VydmljZSwgYWxyZWFkeSBkZXBsb3llZCBpbnRvIHRoZSBzZXJ2ZXIKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHByb2JsZW1zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIGRlcGxveUNsYXNzQXNTZXJ2aWNlKFN0cmluZyBuYW1lLCBDbGFzcyBteUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShuYW1lKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgVXRpbHMuZmlsbEF4aXNTZXJ2aWNlKHNlcnZpY2UsIHNlcnZlckNvbmZpZywgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgc2VydmVyQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlcGxveSBhIGNsYXNzIGFzIGEgc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzZXJ2aWNlIG5hbWUKLSAgICAgKiBAcGFyYW0gbXlDbGFzcyB0aGUgSmF2YSBjbGFzcyB0byBkZXBsb3kgKGFsbCBtZXRob2RzIGV4cG9zZWQgYnkgZGVmYXVsdCkKLSAgICAgKiBAcmV0dXJuIGEgZnVsbHkgY29uZmlndXJlZCBBeGlzU2VydmljZSwgYWxyZWFkeSBkZXBsb3llZCBpbnRvIHRoZSBzZXJ2ZXIKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHByb2JsZW1zCi0gICAgICovCi0gICAgLyoqCi0gICAgICogRGVwbG95IGEgY2xhc3MgYXMgYSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIEBwYXJhbSBteUNsYXNzIHRoZSBKYXZhIGNsYXNzIHRvIGRlcGxveSAoYWxsIG1ldGhvZHMgZXhwb3NlZCBieSBkZWZhdWx0KQotICAgICAqIEBwYXJhbSBzY29wZSB0aGUgc2VydmljZSBzY29wZQotICAgICAqIEByZXR1cm4gYSBmdWxseSBjb25maWd1cmVkIEF4aXNTZXJ2aWNlLCBhbHJlYWR5IGRlcGxveWVkIGludG8gdGhlIHNlcnZlcgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgZGVwbG95Q2xhc3NBc1NlcnZpY2UoU3RyaW5nIG5hbWUsIENsYXNzIG15Q2xhc3MsIFN0cmluZyBzY29wZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKG5hbWUpOwotICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCkgc2VydmljZS5zZXRTY29wZShzY29wZSk7Ci0KLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgVXRpbHMuZmlsbEF4aXNTZXJ2aWNlKHNlcnZpY2UsIHNlcnZlckNvbmZpZywgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgc2VydmVyQ3R4LmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBwcmUtaW5pdGlhbGl6ZWQgU2VydmljZUNsaWVudCBzZXQgdXAgdG8gdGFsayB0byBvdXIgbG9jYWwKLSAgICAgKiBzZXJ2ZXIuICBJZiB5b3Ugd2FudCB0byBzZXQgb3B0aW9ucywgY2FsbCB0aGlzIGFuZCB0aGVuIHVzZSBnZXRPcHRpb25zKCkKLSAgICAgKiBvbiB0aGUgcmV0dXJuLgotICAgICAqCi0gICAgICogQHJldHVybiBhIFNlcnZpY2VDbGllbnQsIHByZS1pbml0aWFsaXplZCB0byB0YWxrIHVzaW5nIG91ciBsb2NhbCBzZW5kZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ2xpZW50IGdldENsaWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcHRpb25zIG9wdHMgPSBnZXRPcHRpb25zKCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoY2xpZW50Q3R4LCBudWxsKTsKLSAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0cyk7Ci0gICAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgcHJlLWluaXRpYWxpemVkIFNlcnZpY2VDbGllbnQgc2V0IHVwIHRvIHRhbGsgdG8gb3VyIGxvY2FsCi0gICAgICogc2VydmVyLiAgSWYgeW91IHdhbnQgdG8gc2V0IG9wdGlvbnMsIGNhbGwgdGhpcyBhbmQgdGhlbiB1c2UgZ2V0T3B0aW9ucygpCi0gICAgICogb24gdGhlIHJldHVybi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBTZXJ2aWNlQ2xpZW50LCBwcmUtaW5pdGlhbGl6ZWQgdG8gdGFsayB1c2luZyBvdXIgbG9jYWwgc2VuZGVyCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUlBDU2VydmljZUNsaWVudCBnZXRSUENDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3B0aW9ucyBvcHRzID0gZ2V0T3B0aW9ucygpOwotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBSUENTZXJ2aWNlQ2xpZW50KGNsaWVudEN0eCwgbnVsbCk7Ci0gICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdHMpOwotICAgICAgICByZXR1cm4gY2xpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHByZS1pbml0aWFsaXplZCBTZXJ2aWNlQ2xpZW50IHNldCB1cCB0byB0YWxrIHRvIG91ciBsb2NhbAotICAgICAqIHNlcnZlci4gIElmIHlvdSB3YW50IHRvIHNldCBvcHRpb25zLCBjYWxsIHRoaXMgYW5kIHRoZW4gdXNlIGdldE9wdGlvbnMoKQotICAgICAqIG9uIHRoZSByZXR1cm4uIENsaWVudHMgY3JlYXRlZCB1c2luZyB0aGlzIG1ldGhvZCBoYXZlIHRoZWlyIFRvIEVQUgotICAgICAqIHByZXNldCB0byBpbmNsdWRlIHRoZSBhZGRyZXNzIGZvciB0aGUgc2VydmljZStvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU2VydmljZUNsaWVudCwgcHJlLWluaXRpYWxpemVkIHRvIHRhbGsgdXNpbmcgb3VyIGxvY2FsIHNlbmRlcgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VDbGllbnQgZ2V0Q2xpZW50KFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgdXJsID0gTG9jYWxUcmFuc3BvcnRSZWNlaXZlci5DT05GSUdfQ09OVEVYVC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSsiLyIrc2VydmljZU5hbWU7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRzID0gZ2V0T3B0aW9ucygpOwotICAgICAgICBvcHRzLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSh1cmwpKTsKLSAgICAgICAgb3B0cy5zZXRBY3Rpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgY2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoY2xpZW50Q3R4LCBudWxsKTsKLSAgICAgICAgY2xpZW50LnNldE9wdGlvbnMob3B0cyk7Ci0gICAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIE9wdGlvbnMgb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIHJpZ2h0IHRyYW5zcG9ydCBpbmZvLCBkZWZhdWx0aW5nIHRvIFNPQVAgMS4yCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByZS1pbml0aWFsaXplZCBPcHRpb25zIG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRkID0gbmV3IFRyYW5zcG9ydE91dERlc2NyaXB0aW9uKCJsb2NhbCIpOwotICAgICAgICB0ZC5zZXRTZW5kZXIoc2VuZGVyKTsKLQotICAgICAgICBPcHRpb25zIG9wdHMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRzLnNldFRyYW5zcG9ydE91dCh0ZCk7Ci0gICAgICAgIG9wdHMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIHJldHVybiBvcHRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9Mb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2UuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9Mb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmOTAzNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vTG9jYWxXaXRoQWRkcmVzc2luZ1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb247Ci0KLQotLyoqCi0gKiBMb2NhbFdpdGhBZGRyZXNzaW5nVGVzdENhc2UgaXMgYW4gZXh0ZW5kYWJsZSBiYXNlIGNsYXNzIHdoaWNoIHByb3ZpZGVzIGNvbW1vbiBmdW5jdGlvbmFsaXR5Ci0gKiBmb3IgYnVpbGRpbmcgSlVuaXQgdGVzdHMgd2hpY2ggZXhlcmNpc2UgQXhpczIgdXNpbmcgdGhlIChmYXN0LCBpbi1wcm9jZXNzKQotICogImxvY2FsIiB0cmFuc3BvcnQgKHdpdGggdGhlIGFkZHJlc3NpbmcgbW9kdWxlIGVuZ2FnZWQpLgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxXaXRoQWRkcmVzc2luZ1Rlc3RDYXNlIGV4dGVuZHMgTG9jYWxUZXN0Q2FzZSB7Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgLy8gTk9URSA6IElmIHlvdSB3YW50IGFkZHJlc3NpbmcgKHdoaWNoIHlvdSBwcm9iYWJseSBkbyksIHdlIGNhbiBkbyBzb21ldGhpbmcKLSAgICAgICAgLy8gbGlrZSB0aGlzLCBvciB3ZSBjYW4gcHVsbCBpdCBvZmYgdGhlIGNsYXNzcGF0aCAoYmV0dGVyIHNvbHV0aW9uPykKLSAgICAgICAgCi0gICAgCVN0cmluZyBhZGRyZXNzaW5nTW9kdWxlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvbG9jYWwvYWRkcmVzc2luZy5tYXIiOwotICAgIAkKLSAgICAgICAgc2VydmVyQ29uZmlnLmRlcGxveU1vZHVsZShhZGRyZXNzaW5nTW9kdWxlTG9jYXRpb24pOwotICAgICAgICBzZXJ2ZXJDb25maWcuZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7Ci0gICAgICAgIAotICAgICAgICBjbGllbnRDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5kZXBsb3lNb2R1bGUoYWRkcmVzc2luZ01vZHVsZUxvY2F0aW9uKTsKLSAgICAgICAgY2xpZW50Q3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1JQQ0xvY2FsVGVzdENhc2UuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9SUENMb2NhbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWUzODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1JQQ0xvY2FsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMuY2xpZW50LlJQQ1NlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0UmVjZWl2ZXI7Ci0KLS8qKgotICogTG9jYWxUZXN0Q2FzZSBpcyBhbiBleHRlbmRhYmxlIGJhc2UgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkKLSAqIGZvciBidWlsZGluZyBKVW5pdCB0ZXN0cyB3aGljaCBleGVyY2lzZSBBeGlzMiB1c2luZyB0aGUgKGZhc3QsIGluLXByb2Nlc3MpCi0gKiAibG9jYWwiIHRyYW5zcG9ydC4KLSAqLwotcHVibGljIGNsYXNzIFJQQ0xvY2FsVGVzdENhc2UgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAvLyBTZXQgdXAgcmF3IG1lc3NhZ2UgcmVjZWl2ZXJzIGZvciBSUEMgYmFzZWQgdGVzdHMKLQotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBzZXJ2ZXJDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSUENNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIHNlcnZlckNvbmZpZy5hZGRNZXNzYWdlUmVjZWl2ZXIoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUlBDTWVzc2FnZVJlY2VpdmVyKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYSBwcmUtaW5pdGlhbGl6ZWQgU2VydmljZUNsaWVudCBzZXQgdXAgdG8gdGFsayB0byBvdXIgbG9jYWwKLSAgICAgKiBzZXJ2ZXIuICBJZiB5b3Ugd2FudCB0byBzZXQgb3B0aW9ucywgY2FsbCB0aGlzIGFuZCB0aGVuIHVzZSBnZXRPcHRpb25zKCkKLSAgICAgKiBvbiB0aGUgcmV0dXJuLiBDbGllbnRzIGNyZWF0ZWQgdXNpbmcgdGhpcyBtZXRob2QgaGF2ZSB0aGVpciBUbyBFUFIKLSAgICAgKiBwcmVzZXQgdG8gaW5jbHVkZSB0aGUgYWRkcmVzcyBmb3IgdGhlIHNlcnZpY2Urb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBhIFNlcnZpY2VDbGllbnQsIHByZS1pbml0aWFsaXplZCB0byB0YWxrIHVzaW5nIG91ciBsb2NhbCBzZW5kZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBSUENTZXJ2aWNlQ2xpZW50IGdldFJQQ0NsaWVudChTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBvcGVyYXRpb25OYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHVybCA9IExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuQ09ORklHX0NPTlRFWFQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkrIi8iK3NlcnZpY2VOYW1lOwotCi0gICAgICAgIE9wdGlvbnMgb3B0cyA9IGdldE9wdGlvbnMoKTsKLSAgICAgICAgb3B0cy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UodXJsKSk7Ci0gICAgICAgIG9wdHMuc2V0QWN0aW9uKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBSUENTZXJ2aWNlQ2xpZW50KGNsaWVudEN0eCwgbnVsbCk7Ci0gICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdHMpOwotICAgICAgICByZXR1cm4gY2xpZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9UZXN0aW5nVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9UZXN0aW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyMWQ1ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vVGVzdGluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0aW5nVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGNyZWF0ZUR1bW15T01FbGVtZW50KCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyL3hzZCIsICJuczEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTSIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKAotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTVRleHQodmFsdWUsICJJc2FhYyBBc2ltb3YsIFRoZSBGb3VuZGF0aW9uIFRyaWxvZ3kiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgY3JlYXRlRHVtbXlPTUVsZW1lbnQoU3RyaW5nIG5hbWVTcGFjZSkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UobmFtZVNwYWNlLCAibnMxIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT00iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXlWYWx1ZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiSXNhYWMgQXNpbW92LCBUaGUgRm91bmRhdGlvbiBUcmlsb2d5IikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBPTUVsZW1lbnQgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZmlyc3RDaGlsZCk7Ci0gICAgICAgIFN0cmluZyB0ZXh0VmFsdWUgPSBmaXJzdENoaWxkLmdldFRleHQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHRleHRWYWx1ZSwgIklzYWFjIEFzaW1vdiwgVGhlIEZvdW5kYXRpb24gVHJpbG9neSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZpeEJhc2VEaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgU3RyaW5nIGJhc2VEaXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmFzZURpciArICIvIiArIHBhdGg7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9VdGlsU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTgyZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLQotcHVibGljIGNsYXNzIFV0aWxTZXJ2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTaW1wbGVIVFRQU2VydmVyIHJlY2VpdmVyOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVElOR19QT1JUID0gNTU1NTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfTUVTU0FHRSA9ICJJbnRlbnRpb25hbCBGYWlsdXJlIjsKLQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXBsb3lTZXJ2aWNlKEF4aXNTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2UoCi0gICAgICAgICAgICAgICAgc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bkRlcGxveVNlcnZpY2UoUU5hbWUgc2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAucmVtb3ZlU2VydmljZShzZXJ2aWNlLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHVuRGVwbG95Q2xpZW50U2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAocmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAucmVtb3ZlU2VydmljZSgiQW5vbnltb3VzU2VydmljZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdGFydChUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19SRVBPU0lUT1JZKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KFN0cmluZyByZXBvc2l0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGVyID0gZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQocmVwb3NpdG9yeSk7Ci0KLSAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoZXIsIFRFU1RJTkdfUE9SVCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0gZXIuZ2V0TGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICAgICAgdHJzSW4uc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5hZGRMaXN0ZW5lcih0cnNJbiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiU2VydmVyIHN0YXJ0ZWQgb24gcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIFRFU1RJTkdfUE9SVCArICIuLi4uLiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRocmVhZCBpbnRlcnVwdHRlZCIsIGUxKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KFN0cmluZyByZXBvc2l0b3J5LCBTdHJpbmcgYXhpczJ4bWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgZXIgPSBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dChyZXBvc2l0b3J5LCBheGlzMnhtbCk7Ci0KLSAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoZXIsIFRFU1RJTkdfUE9SVCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgc3RhcnRlZCBvbiBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgVEVTVElOR19QT1JUICsgIi4uLi4uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaHJlYWQgaW50ZXJ1cHR0ZWQiLCBlMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjb3VudCsrOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcG9zaXRvcnkpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInJlcG9zaXRvcnkgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiBkb2VzIG5vdCBleGlzdHMiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldEFic29sdXRlUGF0aCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvY29uZi9heGlzMi54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldE5ld0NvbmZpZ3VyYXRpb25Db250ZXh0KAotICAgICAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnksIFN0cmluZyBheGlzMnhtbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KHJlcG9zaXRvcnkpKTsKLSAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJyZXBvc2l0b3J5IGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgICAgICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZG9lcyBub3QgZXhpc3RzIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpczJ4bWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgICAgcmVjZWl2ZXIuc3RvcCgpOwotICAgICAgICAgICAgd2hpbGUgKHJlY2VpdmVyLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vbm90aGluZyB0byBkbyBoZXJlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnQgPSAwOwotLy8gdHAuZG9TdG9wKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgc3RvcHBlZCAuLi4uLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY291bnQtLTsKLSAgICAgICAgfQotICAgICAgICByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLnRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZUNvbnRleHQgY3JlYXRlQWRyZXNzZWRFbmFibGVkQ2xpZW50U2lkZSgKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBGaWxlIGZpbGUgPSBnZXRBZGRyZXNzaW5nTUFSRmlsZSgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLCBudWxsKTsKLSAgICAgICAgQXhpc01vZHVsZSBheGlzTW9kdWxlID0gRGVwbG95bWVudEVuZ2luZS5idWlsZE1vZHVsZShmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRNb2R1bGUoYXhpc01vZHVsZSk7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0KLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBBZGRyZXNzaW5nRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKCJhZGRyZXNzaW5nIikgJiYgbmFtZS5lbmRzV2l0aCgiLm1hciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRBZGRyZXNzaW5nTUFSRmlsZSgpIHsKLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19SRVBPU0lUT1JZICsgIi9tb2R1bGVzIikpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKG5ldyBBZGRyZXNzaW5nRmlsdGVyKCkpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGZpbGVzLmxlbmd0aCA9PSAxKTsKLSAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbMF07Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRmlsZSBmaWxlID0gZ2V0QWRkcmVzc2luZ01BUkZpbGUoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsiL2ludGVncmF0aW9uUmVwbyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICIvaW50ZWdyYXRpb25SZXBvL2NvbmYvYXhpczIueG1sIikpOwotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSBEZXBsb3ltZW50RW5naW5lLmJ1aWxkTW9kdWxlKGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1vZHVsZShheGlzTW9kdWxlKTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjcmVhdGVDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dChTdHJpbmcgcmVwbykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5IC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgIHJlcG8sCi0gICAgICAgICAgICAgICAgcmVwbyArICIvY29uZi9heGlzMi54bWwiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VDb250ZXh0IGNyZWF0ZUFkcmVzc2VkRW5hYmxlZENsaWVudFNpZGUoCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgY2xpZW50SG9tZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGdldEFkZHJlc3NpbmdNQVJGaWxlKCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGNsaWVudEhvbWUsIG51bGwpOwotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSBEZXBsb3ltZW50RW5naW5lLmJ1aWxkTW9kdWxlKGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLQotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkTW9kdWxlKGF4aXNNb2R1bGUpOwotLy8gc3lzQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmVuZ2FnZU1vZHVsZShtb2R1bGVEZXNjLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvaW50ZWdyYXRpb24vVXRpbFNlcnZlckJhc2VkVGVzdENhc2UuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGI3NzkxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9pbnRlZ3JhdGlvbi9VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UoKSB7Ci0gICAgICAgIHN1cGVyKFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlKGphdmEubGFuZy5TdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHN1cGVyKHN0cmluZyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBUZXN0IGdldFRlc3RTZXR1cChUZXN0IHRlc3QpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2V0dXAodGVzdCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgVXRpbFNlcnZlci5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBUZXN0IGdldFRlc3RTZXR1cDIoVGVzdCB0ZXN0LCBmaW5hbCBTdHJpbmcgcGFyYW0pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2V0dXAodGVzdCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KHBhcmFtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRlc3QgZ2V0VGVzdFNldHVwMyhUZXN0IHRlc3QsIGZpbmFsIFN0cmluZyBwYXJhbTEsIGZpbmFsIFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2V0dXAodGVzdCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KHBhcmFtMSwgcGFyYW0yKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUNvbW1vbnNDaHVua2luZ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NQ29tbW9uc0NodW5raW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiNDE3OTQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NQ29tbW9uc0NodW5raW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3TVRPTUNvbW1vbnNDaHVua2luZ1Rlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZQotICAgICAgICBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZGF0YTsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZSA9IFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0ZXN0LXJlc291cmNlcy9tdG9tL3Rlc3QuanBnIik7Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01Db21tb25zQ2h1bmtpbmdUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3TVRPTUNvbW1vbnNDaHVua2luZ1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01Db21tb25zQ2h1bmtpbmdUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdNVE9NQ29tbW9uc0NodW5raW5nVGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiTVRPTS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGF0YUhhbmRsZXIgZXhwZWN0ZWRESDsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBycGNXcmFwRWxlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBkYXRhID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG9tTnMpOwotICAgICAgICBGaWxlRGF0YVNvdXJjZSBkYXRhU291cmNlID0gbmV3IEZpbGVEYXRhU291cmNlKGZpbGVOYW1lKTsKLSAgICAgICAgZXhwZWN0ZWRESCA9IG5ldyBEYXRhSGFuZGxlcihkYXRhU291cmNlKTsKLSAgICAgICAgT01FbGVtZW50IHN1YkRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzdWJEYXRhIiwgb21Ocyk7Ci0gICAgICAgIE9NVGV4dCB0ZXh0RGF0YSA9IG5ldyBPTVRleHRJbXBsKGV4cGVjdGVkREgsIGZhYyk7Ci0gICAgICAgIHN1YkRhdGEuYWRkQ2hpbGQodGV4dERhdGEpOwotICAgICAgICBkYXRhLmFkZENoaWxkKHN1YkRhdGEpOwotICAgICAgICBycGNXcmFwRWxlLmFkZENoaWxkKGRhdGEpOwotICAgICAgICByZXR1cm4gcnBjV3JhcEVsZTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlRW52ZWxvcGUoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiY29tbW9ucy1odHRwLWVuYWJsZWRSZXBvc2l0b3J5IiksIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIHJldC5idWlsZCgpOwotICAgICAgICB0aGlzLmNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChyZXQpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBhcmVXaXRoQ3JlYXRlZE9NRWxlbWVudChPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBPTUVsZW1lbnQgZmlyc3RDaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZmlyc3RDaGlsZCk7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbFRleHRWYWx1ZSA9IGRhdGEuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgcmV0dXJuZWRUZXh0VmFsdWUgPSBmaXJzdENoaWxkLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHJldHVybmVkVGV4dFZhbHVlLCBvcmlnaW5hbFRleHRWYWx1ZSk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GYXVsdFJlcG9ydFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NRmF1bHRSZXBvcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTIzNzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GYXVsdFJlcG9ydFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRJbkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2RSZXRyeUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5Ob0h0dHBSZXNwb25zZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLklucHV0U3RyZWFtUmVxdWVzdEVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLkh0dHBNZXRob2RQYXJhbXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9TZXJ2aWNlIik7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIm10b21TYW1wbGUiKTsKLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUZhdWx0UmVwb3J0VGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd01UT01GYXVsdFJlcG9ydFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01GYXVsdFJlcG9ydFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd01UT01GYXVsdFJlcG9ydFRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIk1UT00tZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2hvU2VydmljZS5jbGFzcy5nZXROYW1lKCkpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9ET0MpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvRmF1bHRTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKLQotICAgICAgICBQb3N0TWV0aG9kIGh0dHBwb3N0ID0gbmV3IFBvc3RNZXRob2QoImh0dHA6Ly8xMjcuMC4wLjE6IgotICAgICAgICAgICAgICAgICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9FY2hvU2VydmljZS9tdG9tU2FtcGxlIik7Ci0KLSAgICAgICAgSHR0cE1ldGhvZFJldHJ5SGFuZGxlciBteXJldHJ5aGFuZGxlciA9IG5ldyBIdHRwTWV0aG9kUmV0cnlIYW5kbGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0cnlNZXRob2QoZmluYWwgSHR0cE1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJT0V4Y2VwdGlvbiBleGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhlY3V0aW9uQ291bnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uQ291bnQgPj0gMTApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgTm9IdHRwUmVzcG9uc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbWV0aG9kLmlzUmVxdWVzdFNlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGRvIG5vdCByZXRyeQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgaHR0cHBvc3QuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKEh0dHBNZXRob2RQYXJhbXMuUkVUUllfSEFORExFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15cmV0cnloYW5kbGVyKTsKLSAgICAgICAgaHR0cHBvc3Quc2V0UmVxdWVzdEVudGl0eShuZXcgSW5wdXRTdHJlYW1SZXF1ZXN0RW50aXR5KAotICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRlc3QtcmVzb3VyY2VzL210b20vd210b20uYmluIikpKSk7Ci0KLSAgICAgICAgaHR0cHBvc3Quc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGlwYXJ0L3JlbGF0ZWQ7IGJvdW5kYXJ5PS0tTUlNRUJvdW5kYXJ5MjU4REUyRDEwNTI5OEI3NTZEOyB0eXBlPVwiYXBwbGljYXRpb24veG9wK3htbFwiOyBzdGFydD1cIjwwLjE1QjUwRUY0OTMxNzUxOEIwMUBhcGFjaGUub3JnPlwiOyBzdGFydC1pbmZvPVwiYXBwbGljYXRpb24vc29hcCt4bWxcIiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xpZW50LmV4ZWN1dGVNZXRob2QoaHR0cHBvc3QpOwotCi0gICAgICAgICAgICBpZiAoaHR0cHBvc3QuZ2V0U3RhdHVzQ29kZSgpID09Ci0gICAgICAgICAgICAgICAgICAgIEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogVGhlcmUgaXMgYSBtaXNzaW5nIHdzYTpBY3Rpb24gaGVhZGVyIGluIHRoZSBTT0FQIG1lc3NhZ2UuICBGaXggb3IgbG9vayBmb3IgY29ycmVjdCBmYXVsdCB0ZXh0IQotCi0vLyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkhUVFAvMS4xIDUwMCBJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBwb3N0LmdldFN0YXR1c0xpbmUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9IdHRwUmVzcG9uc2VFeGNlcHRpb24gZSkgewotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaHR0cHBvc3QucmVsZWFzZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NRmlsZUNhY2hlTG9hZFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NRmlsZUNhY2hlTG9hZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzMTY4Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTUZpbGVDYWNoZUxvYWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd01UT01GaWxlQ2FjaGVMb2FkVGVzdCBleHRlbmRzIEVjaG9SYXdNVE9NTG9hZFRlc3QgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1hNTFNlcnZpY2UiKTsKLQotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob09NRWxlbWVudCIpOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIEVjaG9SYXdNVE9NRmlsZUNhY2hlTG9hZFRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdNVE9NRmlsZUNhY2hlTG9hZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01GaWxlQ2FjaGVMb2FkVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3TVRPTUZpbGVDYWNoZUxvYWRUZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJNVE9NLWZpbGVDYWNoZS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlc3RFY2hvWE1MU3luYygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NRmlsZUNhY2hlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GaWxlQ2FjaGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjVmOWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01GaWxlQ2FjaGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBFY2hvUmF3TVRPTUZpbGVDYWNoZVRlc3QgZXh0ZW5kcyBFY2hvUmF3TVRPTVRlc3QgewotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01GaWxlQ2FjaGVUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3TVRPTUZpbGVDYWNoZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01GaWxlQ2FjaGVUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdNVE9NRmlsZUNhY2hlVGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiTVRPTS1maWxlQ2FjaGUtZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTEFTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlc3RFY2hvWE1MQVN5bmMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVzdEVjaG9YTUxTeW5jKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jU2VwZXJhdGVMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZXN0RWNob1hNTFN5bmNTZXBlcmF0ZUxpc3RlbmVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Mb2FkVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01Mb2FkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDZmYTY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NTG9hZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRWNobzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdNVE9NTG9hZFRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVjaG9SYXdNVE9NTG9hZFRlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByaXZhdGUgT01UZXh0IHRleHREYXRhOwotCi0KLSAgICBieXRlW10gZXhwZWN0ZWRCeXRlQXJyYXk7Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01Mb2FkVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd01UT01Mb2FkVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTUxvYWRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdNVE9NTG9hZFRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIk1UT00tZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsIEVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgY3JlYXRlRW52ZWxvcGUoKSB7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBycGNXcmFwRWxlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgZGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRhdGEiLCBvbU5zKTsKLSAgICAgICAgZXhwZWN0ZWRCeXRlQXJyYXkgPSBuZXcgYnl0ZVtdIHsgMTMsIDU2LCA2NSwgMzIsIDEyLCAxMiwgNywgLTMsIC0yLCAtMSwKLSAgICAgICAgICAgICAgICA5OCB9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgT01FbGVtZW50IHN1YkRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJzdWJEYXRhIiwgb21Ocyk7Ci0gICAgICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcigiVGhpbGluYSIsICJ0ZXh0L3BsYWluIik7Ci0gICAgICAgICAgICAvL25ldyBCeXRlQXJyYXlEYXRhU291cmNlKGV4cGVjdGVkQnl0ZUFycmF5KSk7Ci0gICAgICAgICAgICB0ZXh0RGF0YSA9IG5ldyBPTVRleHRJbXBsKGRhdGFIYW5kbGVyLCB0cnVlLCBmYWMpOwotICAgICAgICAgICAgc3ViRGF0YS5hZGRDaGlsZCh0ZXh0RGF0YSk7Ci0gICAgICAgICAgICBkYXRhLmFkZENoaWxkKHN1YkRhdGEpOwotCi0gICAgICAgIH0KLQotICAgICAgICBycGNXcmFwRWxlLmFkZENoaWxkKGRhdGEpOwotICAgICAgICByZXR1cm4gcnBjV3JhcEVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpcmVzdWx0LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgT01FbGVtZW50IGVsZTEgPSAoT01FbGVtZW50KWVsZS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gKE9NVGV4dCllbGUxLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgY29tcGFyZVdpdGhBY3R1YWxPTVRleHQoYmluYXJ5Tm9kZSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlMiA9IChPTUVsZW1lbnQpZWxlMS5nZXROZXh0T01TaWJsaW5nKCk7Ci0gICAgICAgICAgICBiaW5hcnlOb2RlID0gKE9NVGV4dCllbGUyLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgY29tcGFyZVdpdGhBY3R1YWxPTVRleHQoYmluYXJ5Tm9kZSk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiIiArIGkpOwotICAgICAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmVXaXRoQWN0dWFsT01UZXh0KE9NVGV4dCBiaW5hcnlOb2RlKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0ZXh0RGF0YS5nZXRUZXh0KCksIGJpbmFyeU5vZGUuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTVN0cmVhbWluZ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NU3RyZWFtaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRmNzEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NU3RyZWFtaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5CeXRlQXJyYXlEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnV0aWwuVGVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdNVE9NU3RyZWFtaW5nVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0vLyAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOiIgKyA1NTU2Ci0gICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9FY2hvU2VydmljZTIvbXRvbVNhbXBsZSIpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1NlcnZpY2UyIik7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoIm10b21TYW1wbGUiKTsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IGRhdGE7Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01TdHJlYW1pbmdUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3TVRPTVN0cmVhbWluZ1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01TdHJlYW1pbmdUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwMihuZXcgVGVzdFN1aXRlKEVjaG9SYXdNVE9NU3RyZWFtaW5nVGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiTVRPTS1lbmFibGVkUmVwb3NpdG9yeSIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwgRWNob1NlcnZpY2UyLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgY3JlYXRlRW52ZWxvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEYXRhSGFuZGxlciBleHBlY3RlZERIOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJtdG9tU2FtcGxlIiwgb21Ocyk7Ci0gICAgICAgIGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7Ci0gICAgICAgIGV4cGVjdGVkREggPSBuZXcgRGF0YUhhbmRsZXIoCi0gICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheURhdGFTb3VyY2UobmV3IGJ5dGVbXSB7IDEzLCA1NiwgNjUsIDMyLCAxMiwgMTIsIDcsIC0zLCAtMiwgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICA5OCB9KSk7Ci0gICAgICAgIE9NRWxlbWVudCBzdWJEYXRhID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic3ViRGF0YSIsIG9tTnMpOwotICAgICAgICBPTVRleHQgdGV4dERhdGEgPSBuZXcgT01UZXh0SW1wbChleHBlY3RlZERILCBmYWMpOwotICAgICAgICBzdWJEYXRhLmFkZENoaWxkKHRleHREYXRhKTsKLSAgICAgICAgZGF0YS5hZGRDaGlsZChzdWJEYXRhKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJwY1dyYXBFbGU7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEVTVElOR19QQVRIICsgImNvbW1vbnMtaHR0cC1lbmFibGVkUmVwb3NpdG9yeSIsIG51bGwpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIHRoaXMuY2FtcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KHJlc3VsdCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICByZXR1cm4gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FtcGFyZVdpdGhDcmVhdGVkT01FbGVtZW50KE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIE9NRWxlbWVudCBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmaXJzdENoaWxkKTsKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsVGV4dFZhbHVlID0gZGF0YS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5lZFRleHRWYWx1ZSA9IGZpcnN0Q2hpbGQuZ2V0VGV4dCgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMocmV0dXJuZWRUZXh0VmFsdWUsIG9yaWdpbmFsVGV4dFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjY5YTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1Jhd01UT01UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUudXRpbC5UZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd01UT01UZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgaW1wbGVtZW50cyBUZXN0Q29uc3RhbnRzIHsKLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVjaG9SYXdNVE9NVGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIE9NVGV4dEltcGwgZXhwZWN0ZWRUZXh0RGF0YTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKEVjaG9SYXdNVE9NVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd01UT01UZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJNVE9NLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBjcmVhdGVFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERhdGFIYW5kbGVyIGV4cGVjdGVkREg7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL2xvY2FsaG9zdC9teSIsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgcnBjV3JhcEVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7Ci0gICAgICAgIEZpbGVEYXRhU291cmNlIGZpbGVEYXRhU291cmNlID0gbmV3IEZpbGVEYXRhU291cmNlKFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0ZXN0LXJlc291cmNlcy9tdG9tL3Rlc3QuanBnIikpOwotICAgICAgICBleHBlY3RlZERIID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLSAgICAgICAgZXhwZWN0ZWRUZXh0RGF0YSA9IG5ldyBPTVRleHRJbXBsKGV4cGVjdGVkREgsIHRydWUsIGZhYyk7Ci0gICAgICAgIGRhdGEuYWRkQ2hpbGQoZXhwZWN0ZWRUZXh0RGF0YSk7Ci0gICAgICAgIHJwY1dyYXBFbGUuYWRkQ2hpbGQoZGF0YSk7Ci0gICAgICAgIHJldHVybiBycGNXcmFwRWxlOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxBU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgTWVzc2FnZUNvbnRleHQuVVRGXzE2KTsKLQotICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKTsKLQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGUgPSAoT01FbGVtZW50KWVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgICAgICAgICBPTVRleHQgYmluYXJ5Tm9kZSA9IChPTVRleHQpZWxlLmdldEZpcnN0T01DaGlsZCgpOwotCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGFzc2VydCBlcXVhbAotICAgICAgICAgICAgICAgIGNvbXBhcmVXaXRoQ3JlYXRlZE9NVGV4dChiaW5hcnlOb2RlKTsKLSAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsKLQotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAoIWZpbmlzaCkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIGlmIChpbmRleCA+IDEwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgd2FzIHNodXRkb3duIGFzIHRoZSBhc3luYyByZXNwb25zZSB0YWtlIHRvbyBsb25nIHRvIGNvbXBsZXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVFbnZlbG9wZSgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRhcmdldC90ZXN0LXJlc291cmNlcy9pbnRlZ3JhdGlvblJlcG8iKSwgbnVsbCk7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBvcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotICAgICAgICBPTUVsZW1lbnQgZWxlID0gKE9NRWxlbWVudClyZXN1bHQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gKE9NVGV4dCllbGUuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0KLSAgICAgICAgLy8gdG8gdGhlIGFzc2VydCBlcXVhbAotICAgICAgICBjb21wYXJlV2l0aENyZWF0ZWRPTVRleHQoYmluYXJ5Tm9kZSk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgaW1hZ2UKLSAgICAgICAgRGF0YUhhbmRsZXIgYWN0dWFsREg7Ci0gICAgICAgIGFjdHVhbERIID0gKERhdGFIYW5kbGVyKWJpbmFyeU5vZGUuZ2V0RGF0YUhhbmRsZXIoKTsKLSAgICAgICAgSW1hZ2VJTy5yZWFkKGFjdHVhbERILmdldERhdGFTb3VyY2UoKQotICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmNTZXBlcmF0ZUxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlRW52ZWxvcGUoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICBvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5lbmdhZ2VNb2R1bGUobmV3IFFOYW1lKCJhZGRyZXNzaW5nIikpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSArICIvIiArIG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpcmVzdWx0LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICBPTVRleHQgYmluYXJ5Tm9kZSA9IChPTVRleHQpZWxlLmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAvLyB0byB0aGUgYXNzZXJ0IGVxdWFsCi0gICAgICAgIGNvbXBhcmVXaXRoQ3JlYXRlZE9NVGV4dChiaW5hcnlOb2RlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcGF0aCkgewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHJldHVybiBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXBhcmVXaXRoQ3JlYXRlZE9NVGV4dChPTVRleHQgYWN0dWFsVGV4dERhdGEpIHsKLSAgICAgICAgU3RyaW5nIG9yaWdpbmFsVGV4dFZhbHVlID0gZXhwZWN0ZWRUZXh0RGF0YS5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5lZFRleHRWYWx1ZSA9IGFjdHVhbFRleHREYXRhLmdldFRleHQoKTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0RXF1YWxzKHJldHVybmVkVGV4dFZhbHVlLCBvcmlnaW5hbFRleHRWYWx1ZSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NVG9CYXNlNjRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvUmF3TVRPTVRvQmFzZTY0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQ5ZmQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9SYXdNVE9NVG9CYXNlNjRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm10b207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdNVE9NVG9CYXNlNjRUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOiIKLSAgICAgICAgICAgICsgKFV0aWxTZXJ2ZXIuVEVTVElOR19QT1JUKQotICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzL0VjaG9YTUxTZXJ2aWNlL2VjaG9NVE9NdG9CYXNlNjQiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhFY2hvUmF3TVRPTVRvQmFzZTY0VGVzdC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvWE1MU2VydmljZSIpOwotCi0gICAgcHJpdmF0ZSBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvTVRPTXRvQmFzZTY0Iik7Ci0KLSAgICBPTVRleHQgZXhwZWN0ZWRUZXh0RGF0YTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmaW5pc2ggPSBmYWxzZTsKLQotICAgIHB1YmxpYyBFY2hvUmF3TVRPTVRvQmFzZTY0VGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd01UT01Ub0Jhc2U2NFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd01UT01Ub0Jhc2U2NFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShFY2hvUmF3TVRPTVRvQmFzZTY0VGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgY3JlYXRlUGF5bG9hZCgpIHsKLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9sb2NhbGhvc3QvbXkiLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvTVRPTXRvQmFzZTY0Iiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCBkYXRhID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG9tTnMpOwotICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbXSB7IDEzLCA1NiwgNjUsIDMyLCAxMiwgMTIsIDcsIDk4IH07Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKGJ5dGVBcnJheSkpOwotICAgICAgICBleHBlY3RlZFRleHREYXRhID0gbmV3IE9NVGV4dEltcGwoZGF0YUhhbmRsZXIsIHRydWUsIGZhYyk7Ci0gICAgICAgIGRhdGEuYWRkQ2hpbGQoZXhwZWN0ZWRUZXh0RGF0YSk7Ci0gICAgICAgIHJwY1dyYXBFbGUuYWRkQ2hpbGQoZGF0YSk7Ci0gICAgICAgIHJldHVybiBycGNXcmFwRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVQYXlsb2FkKCk7Ci0gICAgICAgIE9wdGlvbnMgY2xpZW50T3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIGNsaWVudE9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgY2xpZW50T3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLQotICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gcmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKTsKLQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBkYXRhID0gKE9NRWxlbWVudCllbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICAgICAgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KGRhdGEuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBmaW5pc2ggPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGZpbmlzaCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLCBudWxsKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLSAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMoY2xpZW50T3B0aW9ucyk7Ci0KLSAgICAgICAgc2VuZGVyLnNlbmRSZWNlaXZlTm9uQmxvY2tpbmcocGF5bG9hZCwgY2FsbGJhY2spOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIHdoaWxlICghZmluaXNoKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgaWYgKGluZGV4ID4gMTApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB3YXMgc2h1dGRvd24gYXMgdGhlIGFzeW5jIHJlc3BvbnNlIHRha2UgdG9vIGxvbmcgdG8gY29tcGxldGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MU3luYygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlUGF5bG9hZCgpOwotCi0gICAgICAgICAgICBPcHRpb25zIGNsaWVudE9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgY2xpZW50T3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgY2xpZW50T3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotICAgICAgICAgICAgY2xpZW50T3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICBjbGllbnRPcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMoY2xpZW50T3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBkYXRhID0gKE9NRWxlbWVudClyZXN1bHQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICBjb21wYXJlV2l0aENyZWF0ZWRPTVRleHQoZGF0YS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgbG9nLmluZm8oIiIgKyBpKTsKLSAgICAgICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KFN0cmluZyBhY3R1YWxUZXh0KSB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbFRleHRWYWx1ZSA9IGV4cGVjdGVkVGV4dERhdGEuZ2V0VGV4dCgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoYWN0dWFsVGV4dCwgb3JpZ2luYWxUZXh0VmFsdWUpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9TZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9FY2hvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDE5NzM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZSB7Ci0gICAgcHVibGljIE9NRWxlbWVudCBtdG9tU2FtcGxlKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiRGF0YSIpCi0gICAgICAgICAgICAgICAgJiYgZWxlbWVudC5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5vcmcvbXRvbS9kYXRhIikpIHsKLSAgICAgICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gKE9NVGV4dCllbGVtZW50LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICAgICAgYmluYXJ5Tm9kZS5zZXRPcHRpbWl6ZSghYmluYXJ5Tm9kZS5pc09wdGltaXplZCgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIkVjaG9UZXN0IikgJiYgZWxlbWVudC5nZXROYW1lc3BhY2UoKQotICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwOi8vZXhhbXBsZS5vcmcvbXRvbS9kYXRhIikpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuSXRlcmF0b3IgPSBlbGVtZW50LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRyZW5JdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZGF0YUVsZW1lbnQgPSAoT01FbGVtZW50KWNoaWxkcmVuSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gKE9NVGV4dClkYXRhRWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgICAgICAgICBiaW5hcnlOb2RlLnNldE9wdGltaXplKCFiaW5hcnlOb2RlLmlzT3B0aW1pemVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tdG9tL0VjaG9TZXJ2aWNlMi5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1NlcnZpY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDE3MzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vRWNob1NlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5JbmNvbWluZ0F0dGFjaG1lbnRJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkluY29taW5nQXR0YWNobWVudFN0cmVhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlMiB7Ci0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgbXRvbVNhbXBsZShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPSBudWxsOwotICAgICAgICBhdHRhY2htZW50cyA9IChBdHRhY2htZW50cylNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShNVE9NQ29uc3RhbnRzLkFUVEFDSE1FTlRTKTsKLSAgICAgICAgLy8gR2V0IGltYWdlIGRhdGEKLSAgICAgICAgSW5jb21pbmdBdHRhY2htZW50U3RyZWFtcyBzdHJlYW1zID0gYXR0YWNobWVudHMuZ2V0SW5jb21pbmdBdHRhY2htZW50U3RyZWFtcygpOwotICAgICAgICBJbmNvbWluZ0F0dGFjaG1lbnRJbnB1dFN0cmVhbSBzdHJlYW0gPSBzdHJlYW1zLmdldE5leHRTdHJlYW0oKTsKLQotICAgICAgICBieXRlW10gZGF0YSA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkoc3RyZWFtKTsKLQotICAgICAgICAvL3NldHRpbmcgcmVzcG9uc2UKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgidXJuOi8vZmFrZW5hbWVzcGFjZSIsICJucyIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UsIGVsZW07Ci0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZXNwb25zZSIsIG5zKTsKLQotICAgICAgICBlbGVtID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG5zKTsKLSAgICAgICAgZWxlbS5zZXRUZXh0KEJhc2U2NC5lbmNvZGUoZGF0YSkpOwotICAgICAgICByZXNwb25zZS5hZGRDaGlsZChlbGVtKTsKLQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL210b20vTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9NZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0MTliNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvbXRvbS9NZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubXRvbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlOwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBUaGlzIHRlc3RzIHRoZSBzYXZpbmcgYW5kIHJlc3RvcmluZyBvZiB0aGUgQXhpczIgY29udGV4dHMgZnJvbSB3aXRoaW4gYSBoYW5kbGVyIHdoZW4gTVRPTSBpcwotICogdXNlZC4gIFRoaXMgaXMgYSBtb3JlIHRob3JvdWdoIHRlc3Qgb2YgdGhlIHNlcmlhbGl6YXRpb24gbWVjaGFuaXNtcyB0aGFuIHRoZSBvdGhlciB1bml0IHRlc3RzLCBhcwotICogdGhlIGNvbnRleHRzIGFyZSBwb3B1bGF0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBBeGlzMiBjb2RlcGF0aC4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VTYXZlQW5kUmVzdG9yZVdpdGhNVE9NVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlCi0gICAgICAgIGltcGxlbWVudHMgVGVzdENvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBPTVRleHRJbXBsIGV4cGVjdGVkVGV4dERhdGEgPSBudWxsOwotCi0gICAgcHVibGljIE1lc3NhZ2VTYXZlQW5kUmVzdG9yZVdpdGhNVE9NVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0LmNsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoQ29uc3RhbnRzLlRFU1RJTkdfUEFUSCArICJNVE9NLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2UoVGVzdENvbnN0YW50cy5zZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb25zdGFudHMub3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKFRlc3RDb25zdGFudHMub3BlcmF0aW9uTmFtZSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcGhhc2VzLmFkZChuZXcgUGhhc2UoUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTikpOwotICAgICAgICBvcGVyYXRpb24uc2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KHBoYXNlcyk7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZSA9IG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UxID0gKFBoYXNlKXBoYXNlLmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OLmVxdWFscyhwaGFzZTEuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIoaW5ib3VuZEhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwaGFzZXMuYWRkKG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OKSk7Ci0gICAgICAgIG9wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KHBoYXNlcyk7Ci0gICAgICAgIHBoYXNlID0gb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UxID0gKFBoYXNlKXBoYXNlLmdldChpKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX1BPTElDWV9ERVRFUk1JTkFUSU9OLmVxdWFscyhwaGFzZTEuZ2V0UGhhc2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UxLmFkZEhhbmRsZXIob3V0Ym91bmRIYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKFRlc3RDb25zdGFudHMuc2VydmljZU5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlQW5kUmVzdG9yZU9mTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyhUZXN0Q29uc3RhbnRzLnRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgVGVzdENvbnN0YW50cy5vcGVyYXRpb25OYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFRpbWVPdXRJbk1pbGxpU2Vjb25kcyg1MDAwMCk7Ci0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2ludGVncmF0aW9uUmVwbyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlndXJhdGlvbkNvbnRleHQsIG51bGwpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZyIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KXJlc3VsdC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSAoT01UZXh0KWVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0KLSAgICAgICAgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KGJpbmFyeU5vZGUpOwotCi0gICAgICAgIERhdGFIYW5kbGVyIGFjdHVhbERIID0gKERhdGFIYW5kbGVyKWJpbmFyeU5vZGUuZ2V0RGF0YUhhbmRsZXIoKTsKLSAgICAgICAgQnVmZmVyZWRJbWFnZSBiaSA9IEltYWdlSU8ucmVhZChhY3R1YWxESC5nZXREYXRhU291cmNlKCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBjcmVhdGVFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBycGNXcmFwcGVyRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5hbWVzcGFjZSk7Ci0gICAgICAgIE9NRWxlbWVudCBkYXRhID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiZGF0YSIsIG9tTmFtZXNwYWNlKTsKLQotICAgICAgICBGaWxlRGF0YVNvdXJjZSBmaWxlRGF0YVNvdXJjZSA9IG5ldyBGaWxlRGF0YVNvdXJjZShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGVzdC1yZXNvdXJjZXMvbXRvbS90ZXN0LmpwZyIpKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgZXhwZWN0ZWREYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihmaWxlRGF0YVNvdXJjZSk7Ci0gICAgICAgIGV4cGVjdGVkVGV4dERhdGEgPSBuZXcgT01UZXh0SW1wbChleHBlY3RlZERhdGFIYW5kbGVyLCB0cnVlLCBvbUZhY3RvcnkpOwotICAgICAgICBkYXRhLmFkZENoaWxkKGV4cGVjdGVkVGV4dERhdGEpOwotICAgICAgICBycGNXcmFwcGVyRWxlbWVudC5hZGRDaGlsZChkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJwY1dyYXBwZXJFbGVtZW50OwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYXJlV2l0aENyZWF0ZWRPTVRleHQoT01UZXh0IGFjdHVhbFRleHREYXRhKSB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbFRleHRWYWx1ZSA9IGV4cGVjdGVkVGV4dERhdGEuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgcmV0dXJuZWRUZXh0VmFsdWUgPSBhY3R1YWxUZXh0RGF0YS5nZXRUZXh0KCk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydEVxdWFscyhyZXR1cm5lZFRleHRWYWx1ZSwgb3JpZ2luYWxUZXh0VmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgSGFuZGxlciBpbmJvdW5kSGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgICAgICBwcml2YXRlIFN0cmluZyBzdGF0ZVByb3BlcnR5ID0gIkluYm91bmRIYW5kbGVyU3RhdGUiOwotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0OkluYm91bmQgaGFuZGxlciBpbnZva2VkIik7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoc3RhdGVQcm9wZXJ0eSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0OlN1c3BlbmRpbmcgcHJvY2Vzc2luZyIpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KHN0YXRlUHJvcGVydHksIG5ldyBPYmplY3QoKSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQucGF1c2UoKTsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvYmplY3RPdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0T3V0cHV0U3RyZWFtLndyaXRlT2JqZWN0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0T3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdE91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkFuIGVycm9yIG9jY3VycmVkIHdoZW4gc2VyaWFsaXppbmcgdGhlIE1lc3NhZ2VDb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ldyBXb3JrZXIoYnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpKS5zdGFydCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0OlNraXBwaW5nIHByZXZpb3VzbHkgaW52b2tlZCBJbmJvdW5kIGhhbmRsZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG91dGJvdW5kSGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0Ok91dGJvdW5kIGhhbmRsZXIgaW52b2tlZCIpOwotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGNsYXNzIFdvcmtlciBleHRlbmRzIFRocmVhZCB7Ci0gICAgICAgIHByaXZhdGUgYnl0ZVtdIHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgICAgICBwdWJsaWMgV29ya2VyKGJ5dGVbXSBzZXJpYWxpemVkTWVzc2FnZUNvbnRleHQsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCA9IHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNZXNzYWdlU2F2ZUFuZFJlc3RvcmVXaXRoTVRPTVRlc3Q6V29ya2VyIHRocmVhZCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVzc2FnZVNhdmVBbmRSZXN0b3JlV2l0aE1UT01UZXN0OlJlc3VtaW5nIHByb2Nlc3NpbmciKTsKLSAgICAgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvYmplY3RJbnB1dFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWRNZXNzYWdlQ29udGV4dCkpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUNvbnRleHQpb2JqZWN0SW5wdXRTdHJlYW0ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgIHJlY29uc3RpdHV0ZWRNZXNzYWdlQ29udGV4dC5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgQXhpc0VuZ2luZS5yZXN1bWUocmVjb25zdGl0dXRlZE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHdvcmtlciB0aHJlYWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9vbS9PTUF0dHJpYnV0ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9vbS9PTUF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5N2YzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvb20vT01BdHRyaWJ1dGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub207Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlN0cmVhbVdyYXBwZXI7Ci1pbXBvcnQgemEuY28uZXNrb20ubnJzLnhtbHZlbmQuYmFzZS54MjAuc2NoZW1hLkFkdmljZVJlcURvY3VtZW50OwotaW1wb3J0IHphLmNvLmVza29tLm5ycy54bWx2ZW5kLmJhc2UueDIwLnNjaGVtYS5Db25maXJtYXRpb25BZHZpY2VSZXE7Ci1pbXBvcnQgemEuY28uZXNrb20ubnJzLnhtbHZlbmQuYmFzZS54MjAuc2NoZW1hLk1zZ0lEOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBUbyBydW4gdGhpcyB0ZXN0LG1hdmVuIGJ1aWxkIHNob3VsZCBoYXZlIGJlZW4gcnVuIGFuZCB0aGUgcmVsZXZhbnQgdHlwZSBjbGFzc2VzIG5lZWQgdG8gYmUKLSAqIGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT01BdHRyaWJ1dGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYk5hbWVzcGFjZSgpIHsKLQotICAgICAgICAvL2NyZWF0ZSBhIGRvY3VtZW50VHlwZQotICAgICAgICBBZHZpY2VSZXFEb2N1bWVudCBkb2MgPSBBZHZpY2VSZXFEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIENvbmZpcm1hdGlvbkFkdmljZVJlcSByZXEgPSBDb25maXJtYXRpb25BZHZpY2VSZXEuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBNc2dJRCBtc2dJRCA9IHJlcS5hZGROZXdBZHZpY2VSZXFNc2dJRCgpOwotICAgICAgICBtc2dJRC5zZXRVbmlxdWVOdW1iZXIoMTEpOwotICAgICAgICByZXEuYWRkTmV3Q2xpZW50SUQoKTsKLSAgICAgICAgZG9jLnNldEFkdmljZVJlcShyZXEpOwotCi0gICAgICAgIC8vZ2V0IHRoZSBwdWxsIHBhcnNlciBhbmQgY29uc3RydWN0IHRoZSBPTUVsZW1lbnQKLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmVhbVdyYXBwZXIoZG9jLm5ld1hNTFN0cmVhbVJlYWRlcigpKQotICAgICAgICApOwotICAgICAgICBPTUVsZW1lbnQgZWx0ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAvL3RyYXZlcnNlIHRoZSBlbGVtZW50IGFuZCBsb29rIGF0IHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGF0dHJpYnV0ZQotICAgICAgICBPTUF0dHJpYnV0ZSBhdHQgPQotICAgICAgICAgICAgICAgIGVsdC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ0eXBlIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF0dCk7Ci0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dC5nZXROYW1lc3BhY2UoKS5nZXRQcmVmaXgoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcmVmaXgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJlZml4LCAieHNpIik7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9wcm9jZXNzaW5nTW9kZWwvU29hcFByb2Nlc3NpbmdNb2RlbFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9wcm9jZXNzaW5nTW9kZWwvU29hcFByb2Nlc3NpbmdNb2RlbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmNGY4ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcHJvY2Vzc2luZ01vZGVsL1NvYXBQcm9jZXNzaW5nTW9kZWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucHJvY2Vzc2luZ01vZGVsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIFNvYXBQcm9jZXNzaW5nTW9kZWxUZXN0IGV4dGVuZHMgTG9jYWxUZXN0Q2FzZSB7Ci0JCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAJZGVwbG95Q2xhc3NBc1NlcnZpY2UoRWNoby5TRVJWSUNFX05BTUUsIEVjaG8uY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kaW5nTXVzdFVuZGVyc3RhbmRXaXRoTmV4dFJvbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gZ2V0Q2xpZW50KEVjaG8uU0VSVklDRV9OQU1FLCBFY2hvLkVDSE9fT01fRUxFTUVOVF9PUF9OQU1FKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgaGVhZGVyTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9kdW1teUhlYWRlciIsICJkaCIpOwotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaDEgPSBmYWMuY3JlYXRlU09BUEhlYWRlckJsb2NrKCJEdW1teUhlYWRlciIsIGhlYWRlck5zKTsKLSAgICAgICAgaDEuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0gICAgICAgIGgxLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQoIkR1bW15IFN0cmluZyIpKTsKLSAgICAgICAgaDEuc2V0Um9sZShTT0FQMTJDb25zdGFudHMuU09BUF9ST0xFX05FWFQpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZUNsaWVudC5hZGRIZWFkZXIoaDEpOwotICAgICAgICAKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBUZXN0aW5nVXRpbHMuY3JlYXRlRHVtbXlPTUVsZW1lbnQoKTsKLQotICAgICAgICBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlzZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlKHBheWxvYWQpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGEgTXVzdFVuZGVyc3RhbmQgZmF1bHQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYXVsdC5nZXRGYXVsdENvZGUoKSwgU09BUDEyQ29uc3RhbnRzLlFOQU1FX01VX0ZBVUxUQ09ERSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmFpbCgiTVUgaGVhZGVyIHdhcyBwcm9jZXNzZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0FkZHJlc3NCZWFuLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0FkZHJlc3NCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmE0MWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9BZGRyZXNzQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NCZWFuIHsKLSAgICBwcml2YXRlIFN0cmluZyB0b3duOwotICAgIHByaXZhdGUgaW50IG51bWJlcjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG93bigpIHsKLSAgICAgICAgcmV0dXJuIHRvd247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG93bihTdHJpbmcgdG93bikgewotICAgICAgICB0aGlzLnRvd24gPSB0b3duOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkgewotICAgICAgICByZXR1cm4gbnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihpbnQgbnVtYmVyKSB7Ci0gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoInRvd246ICIgKyB0b3duICsgIiBudW1iZXIgOiIgKyBudW1iZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc0Jvb2tTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0FkZHJlc3NCb29rU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI5OWEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc0Jvb2tTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzQm9va1NlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBlbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBFbnRyeSB0byB0aGUgQWRkcmVzcyBCb29rCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGFkZEVudHJ5KEVudHJ5IGVudHJ5KSB7Ci0gICAgICAgIHRoaXMuZW50cmllcy5wdXQoZW50cnkuZ2V0TmFtZSgpLCBlbnRyeSk7Ci0gICAgICAgIHJldHVybiBlbnRyaWVzLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggYW4gYWRkcmVzcyBvZiBhIHBlcnNvbgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBlcnNvbiB3aG9zZSBhZGRyZXNzIG5lZWRzIHRvIGJlIGZvdW5kCi0gICAgICogQHJldHVybiByZXR1cm4gdGhlIGFkZHJlc3MgZW50cnkgb2YgdGhlIHBlcnNvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW50cnkgZmluZEVudHJ5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoRW50cnkpIHRoaXMuZW50cmllcy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudHJ5W10gZ2V0RW50cmllczEoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW50cnlbXXtjcmVhdGVFbnRyeSgpLCBjcmVhdGVFbnRyeSgpfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50cnlbXSBnZXRFbnRyaWVzMigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW50cnlbXSBnZXRFbnRyaWVzMygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFbnRyeSBjcmVhdGVFbnRyeSgpIHsKLSAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoKTsKLSAgICAgICAgZW50cnkuc2V0TmFtZSgiSm9obiBOb3JtYW5keSIpOwotICAgICAgICBlbnRyeS5zZXRTdHJlZXQoIjU1NSBCcm9hZHdheSIpOwotICAgICAgICBlbnRyeS5zZXRDaXR5KCJDYW1icmlkZ2UiKTsKLSAgICAgICAgZW50cnkuc2V0U3RhdGUoIk1BIik7Ci0gICAgICAgIGVudHJ5LnNldFBvc3RhbENvZGUoIjAxMjM0Iik7Ci0gICAgICAgIHJldHVybiBlbnRyeTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc1NlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0FkZHJlc3NTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE4MjcyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQWRkcmVzc1NlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5Mb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzU2VydmljZVRlc3QgZXh0ZW5kcyBMb2NhbFRlc3RDYXNlCi17Ci0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgc2VydmVyQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJQQ0luT25seU1lc3NhZ2VSZWNlaXZlcigpKTsKLSAgICAgICAgc2VydmVyQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUlBDTWVzc2FnZVJlY2VpdmVyKCkpOwotICAgICAgICBkZXBsb3lDbGFzc0FzU2VydmljZSgiQWRkcmVzc0Jvb2tTZXJ2aWNlIiwgQWRkcmVzc0Jvb2tTZXJ2aWNlLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEFuZEZldGNoRW50cnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgb3BBZGRFbnRyeSA9IG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImFkZEVudHJ5Iik7Ci0KLSAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXROYW1lKCJBYmJ5IENhZGFiYnkiKTsKLSAgICAgICAgZW50cnkuc2V0U3RyZWV0KCJTZXNhbWUgU3RyZWV0Iik7Ci0gICAgICAgIGVudHJ5LnNldENpdHkoIlNlc2FtZSBDaXR5Iik7Ci0gICAgICAgIGVudHJ5LnNldFN0YXRlKCJTZXNhbWUgU3RhdGUiKTsKLSAgICAgICAgZW50cnkuc2V0UG9zdGFsQ29kZSgiMTExMTEiKTsKLQotICAgICAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIGFyZ3VtZW50cyBhcnJheSBmb3IgdGhlIG1ldGhvZCBpbnZvY2F0aW9uCi0gICAgICAgIE9iamVjdFtdIG9wQWRkRW50cnlBcmdzID0gbmV3IE9iamVjdFtdIHsgZW50cnkgfTsKLQotICAgICAgICAvLyBJbnZva2luZyB0aGUgbWV0aG9kCi0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IGdldFJQQ0NsaWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICJsb2NhbDovL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJhZGRFbnRyeSIpOwotCi0gICAgICAgIE9iamVjdFtdIHJldCA9IHNlcnZpY2VDbGllbnQuaW52b2tlQmxvY2tpbmcob3BBZGRFbnRyeSwgb3BBZGRFbnRyeUFyZ3MsIG5ldyBDbGFzc1tde0ludGVnZXIuY2xhc3N9KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFswXSwgbmV3IEludGVnZXIoMSkpOwotCi0gICAgICAgIFFOYW1lIG9wRmluZEVudHJ5ID0gbmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZmluZEVudHJ5Iik7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIkFiYnkgQ2FkYWJieSI7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BGaW5kRW50cnlBcmdzID0gbmV3IE9iamVjdFtdIHsgbmFtZSB9OwotICAgICAgICBDbGFzc1tdIHJldHVyblR5cGVzID0gbmV3IENsYXNzW10geyBFbnRyeS5jbGFzcyB9OwotCi0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudDIgPSBnZXRSUENDbGllbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zMiA9IHNlcnZpY2VDbGllbnQyLmdldE9wdGlvbnMoKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSMiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAibG9jYWw6Ly9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2UiKTsKLSAgICAgICAgb3B0aW9uczIuc2V0VG8odGFyZ2V0RVBSMik7Ci0gICAgICAgIG9wdGlvbnMyLnNldEFjdGlvbigiZmluZEVudHJ5Iik7Ci0gICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gc2VydmljZUNsaWVudDIuaW52b2tlQmxvY2tpbmcob3BGaW5kRW50cnksCi0gICAgICAgICAgICAgICAgb3BGaW5kRW50cnlBcmdzLCByZXR1cm5UeXBlcyk7Ci0KLSAgICAgICAgRW50cnkgcmVzdWx0ID0gKEVudHJ5KSByZXNwb25zZVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmFtZSAgIDoiICsgcmVzdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyZWV0IDoiICsgcmVzdWx0LmdldFN0cmVldCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaXR5ICAgOiIgKyByZXN1bHQuZ2V0Q2l0eSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZSAgOiIgKyByZXN1bHQuZ2V0U3RhdGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGFsIENvZGUgOiIgKyByZXN1bHQuZ2V0UG9zdGFsQ29kZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW50cnkxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIG9wQWRkRW50cnkgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJnZXRFbnRyaWVzMSIpOwotCi0gICAgICAgIE9iamVjdFtdIG9wQWRkRW50cnlBcmdzID0gbmV3IE9iamVjdFtdIHsgfTsKLQotICAgICAgICAvLyBJbnZva2luZyB0aGUgbWV0aG9kCi0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IGdldFJQQ0NsaWVudCgpOwotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICJsb2NhbDovL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJnZXRFbnRyaWVzMSIpOwotCi0gICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IHNlcnZpY2VDbGllbnQuaW52b2tlQmxvY2tpbmcob3BBZGRFbnRyeSwgb3BBZGRFbnRyeUFyZ3MsIG5ldyBDbGFzc1tde0VudHJ5W10uY2xhc3N9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSAoRW50cnlbXSkgcmVzdWx0WzBdOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllcy5sZW5ndGgsIDIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRyeTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgb3BBZGRFbnRyeSA9IG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImdldEVudHJpZXMyIik7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BBZGRFbnRyeUFyZ3MgPSBuZXcgT2JqZWN0W10geyB9OwotCi0gICAgICAgIC8vIEludm9raW5nIHRoZSBtZXRob2QKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gZ2V0UlBDQ2xpZW50KCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImxvY2FsOi8vc2VydmljZXMvQWRkcmVzc0Jvb2tTZXJ2aWNlIik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oImdldEVudHJpZXMyIik7Ci0KLSAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEFkZEVudHJ5LCBvcEFkZEVudHJ5QXJncywgbmV3IENsYXNzW117RW50cnlbXS5jbGFzc30pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIEVudHJ5W10gZW50cmllcyA9IChFbnRyeVtdKSByZXN1bHRbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzLmxlbmd0aCwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVudHJ5MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBRTmFtZSBvcEFkZEVudHJ5ID0gbmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZ2V0RW50cmllczMiKTsKLQotICAgICAgICBPYmplY3RbXSBvcEFkZEVudHJ5QXJncyA9IG5ldyBPYmplY3RbXSB7IH07Ci0KLSAgICAgICAgLy8gSW52b2tpbmcgdGhlIG1ldGhvZAotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBnZXRSUENDbGllbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCk7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAibG9jYWw6Ly9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2UiKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldEFjdGlvbigiZ2V0RW50cmllczMiKTsKLQotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50Lmludm9rZUJsb2NraW5nKG9wQWRkRW50cnksIG9wQWRkRW50cnlBcmdzLCBuZXcgQ2xhc3NbXXtFbnRyeVtdLmNsYXNzfSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgRW50cnlbXSBlbnRyaWVzID0gKEVudHJ5W10pIHJlc3VsdFswXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVudHJpZXMubGVuZ3RoLCAwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0NvbXBhbnkuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQ29tcGFueS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE1NjI2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvQ29tcGFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb21wYW55IHsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0IHBlcnNvbnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0UGVyc29ucygpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc29ucyhBcnJheUxpc3QgcGVyc29ucykgewotICAgICAgICB0aGlzLnBlcnNvbnMgPSBwZXJzb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvRW1wbG95ZWUuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvRW1wbG95ZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiMmVhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0VtcGxveWVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1wdWJsaWMgY2xhc3MgRW1wbG95ZWUgZXh0ZW5kcyBQZXJzb24gewotCi0gICAgcHJvdGVjdGVkIFBlcnNvbiBlbXBseWVyOwotICAgIHByb3RlY3RlZCBBZGRyZXNzQmVhbiBhZGRyZXNzOwotCi0gICAgcHVibGljIFBlcnNvbiBnZXRFbXBseWVyKCkgewotICAgICAgICByZXR1cm4gZW1wbHllcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbXBseWVyKFBlcnNvbiBlbXBseWVyKSB7Ci0gICAgICAgIHRoaXMuZW1wbHllciA9IGVtcGx5ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEFkZHJlc3NCZWFuIGdldEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoQWRkcmVzc0JlYW4gYWRkcmVzcykgewotICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSAiTmFtZToiICsgZ2V0TmFtZSgpICsgIiBBZ2U6ICIgKyBnZXRBZ2UoKTsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0VudHJ5LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYzMyNmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotcHVibGljIGNsYXNzIEVudHJ5IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNpdHkgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9zdGFsQ29kZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENpdHkoKSB7Ci0gICAgICAgIHJldHVybiBjaXR5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENpdHkoU3RyaW5nIGNpdHkpIHsKLSAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvc3RhbENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBwb3N0YWxDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvc3RhbENvZGUoU3RyaW5nIHBvc3RhbENvZGUpIHsKLSAgICAgICAgdGhpcy5wb3N0YWxDb2RlID0gcG9zdGFsQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgewotICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdGUoU3RyaW5nIHN0YXRlKSB7Ci0gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmVldCgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmVldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJlZXQoU3RyaW5nIHN0cmVldCkgewotICAgICAgICB0aGlzLnN0cmVldCA9IHN0cmVldDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvTWFpbC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9NYWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGM0NzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9NYWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1wdWJsaWMgY2xhc3MgTWFpbCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZnJvbSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdG8gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHN1YmplY3QgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGJvZHkgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKLSAgICAgICAgcmV0dXJuIGJvZHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgYm9keSkgewotICAgICAgICB0aGlzLmJvZHkgPSBib2R5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIGZyb207Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgewotICAgICAgICB0aGlzLmZyb20gPSBmcm9tOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHN1YmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgc3ViamVjdCkgewotICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG8oKSB7Ci0gICAgICAgIHJldHVybiB0bzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKLSAgICAgICAgdGhpcy50byA9IHRvOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvTXVsdGlyZWZUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL011bHRpcmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY0YWYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvTXVsdGlyZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVmYXVsdE9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uUlBDTG9jYWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jbGllbnQuUlBDU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXJlZlRlc3QgZXh0ZW5kcyBSUENMb2NhbFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZGVwbG95Q2xhc3NBc1NlcnZpY2UoIkVjaG9YTUxTZXJ2aWNlIiwgUlBDU2VydmljZUNsYXNzLmNsYXNzKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE11bGl0cmVmMSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob1N0cmluZyIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob1N0cmluZyIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcwIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzEiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChtZXRob2QpOwotCi0gICAgICAgIE9NRWxlbWVudCByZWYgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZWZlcmVuY2UiLCBudWxsKTsKLSAgICAgICAgcmVmLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImlkIiwgbnVsbCwgIjEiKSk7Ci0gICAgICAgIHJlZi5zZXRUZXh0KCJoZWxsbyBBeGlzMiIpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVmKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGluZXQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCksICJoZWxsbyBBeGlzMiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RhZGQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImFkZCIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYWRkIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICB2YWx1ZTIuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMiIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7Ci0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlZiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJlZmVyZW5jZSIsIG51bGwpOwotICAgICAgICByZWYuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaWQiLCBudWxsLCAiMSIpKTsKLSAgICAgICAgcmVmLnNldFRleHQoIjEwIik7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZWYpOwotCi0gICAgICAgIE9NRWxlbWVudCByZWYyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmVmZXJlbmNlIiwgbnVsbCk7Ci0gICAgICAgIHJlZjIuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaWQiLCBudWxsLCAiMiIpKTsKLSAgICAgICAgcmVmMi5zZXRUZXh0KCIxMCIpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVmMik7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxTWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCksICIyMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RhZGRTYW1lUmVmKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJhZGQiKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoTkFNRVNQQUNFLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFkZCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcwIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzEiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgT01FbGVtZW50IHZhbHVlMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzEiLCBudWxsKTsKLSAgICAgICAgdmFsdWUyLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzEiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZTIpOwotCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChtZXRob2QpOwotCi0gICAgICAgIE9NRWxlbWVudCByZWYgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZWZlcmVuY2UiLCBudWxsKTsKLSAgICAgICAgcmVmLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImlkIiwgbnVsbCwgIjEiKSk7Ci0gICAgICAgIHJlZi5zZXRUZXh0KCIxMCIpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVmKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGluZXQgPSBzZW5kZXIuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICAKLSAgICAgICAgcmVxTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIG9wQ2xpbmV0LmFkZE1lc3NhZ2VDb250ZXh0KHJlcU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1lc3NhZ2VDb250eCA9Ci0gICAgICAgICAgICAgICAgb3BDbGluZXQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLCAiMjAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0YWRkRXJyb3IoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiYWRkIik7Ci0gICAgICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoTkFNRVNQQUNFLCAibXkiKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhZGQiLCBvbU5zKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgICAgIHZhbHVlLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzEiKSk7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICAgICAgdmFsdWUyLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzIiKSk7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLQotICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQobWV0aG9kKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IHJlZiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJlZmVyZW5jZSIsIG51bGwpOwotICAgICAgICAgICAgcmVmLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImlkIiwgbnVsbCwgIjEiKSk7Ci0gICAgICAgICAgICByZWYuc2V0VGV4dCgiMTAiKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChyZWYpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVmMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJlZmVyZW5jZSIsIG51bGwpOwotICAgICAgICAgICAgcmVmMi5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJpZCIsIG51bGwsICIzIikpOwotICAgICAgICAgICAgcmVmMi5zZXRUZXh0KCIxMCIpOwotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJlZjIpOwotCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXFNZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOzsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaW5ldCA9IHNlbmRlci5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICAgICAgb3BDbGluZXQuYWRkTWVzc2FnZUNvbnRleHQocmVxTWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgb3BDbGluZXQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgZmFpbCB3aXRoIDogIiArICJvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDogSW52YWxpZCByZWZlcmVuY2UgOjIiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGF4aXNGYXVsdC5nZXRGYXVsdERldGFpbEVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ2YWwgPSAiICsgdmFsKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHZhbC5pbmRleE9mKCJvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDogSW52YWxpZCByZWZlcmVuY2UgOjIiKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBmYWlsIHdpdGggOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDogSW52YWxpZCByZWZlcmVuY2UgOjIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bGl0cmVmQmVhbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWRpdEJlYW4iKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoTkFNRVNQQUNFLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVkaXRCZWFuIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzEiLCBudWxsKTsKLSAgICAgICAgdmFsdWUyLnNldFRleHQoIjE1OSIpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLQotCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChtZXRob2QpOwotCi0KLSAgICAgICAgU3RyaW5nIHJlZjEgPQotICAgICAgICAgICAgICAgICI8cmVmZXJlbmNlIGlkPVwiMVwiPjxuYW1lPkRlZXBhbDwvbmFtZT48dmFsdWUgaHJlZj1cIiMyXCIvPjxhZGRyZXNzIGhyZWY9XCIjM1wiLz48L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20xID0gZ2V0T01FbGVtZW50KHJlZjEsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTEpOwotICAgICAgICBTdHJpbmcgcmVmMiA9ICI8cmVmZXJlbmNlIGlkPVwiMlwiPmZhbHNlPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMiA9IGdldE9NRWxlbWVudChyZWYyLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20yKTsKLSAgICAgICAgU3RyaW5nIHJlZjMgPSAiPHJlZmVyZW5jZSBpZD1cIjNcIj48dG93biBocmVmPVwiIzRcIi8+PG51bWJlcj4xMDEwPC9udW1iZXI+PC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMyA9IGdldE9NRWxlbWVudChyZWYzLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20zKTsKLSAgICAgICAgU3RyaW5nIHJlZjQgPSAiPHJlZmVyZW5jZSBpZD1cIjRcIj5Db2xvbWJvMzwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTQgPSBnZXRPTUVsZW1lbnQocmVmNCwgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tNCk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxTWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgTXlCZWFuIHJlc0JlYW4gPSAoTXlCZWFuKUJlYW5VdGlsLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywgcmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc0JlYW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzQmVhbi5nZXRBZ2UoKSwgMTU5KTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RiZWFuT00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImJlYW5PTSIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYmVhbk9NIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzEiLCBudWxsKTsKLSAgICAgICAgdmFsdWUyLnNldFRleHQoIjE1OSIpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUyKTsKLQotCi0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChtZXRob2QpOwotCi0KLSAgICAgICAgU3RyaW5nIHJlZjEgPQotICAgICAgICAgICAgICAgICI8cmVmZXJlbmNlIGlkPVwiMVwiPjxuYW1lPkRlZXBhbDwvbmFtZT48dmFsdWUgaHJlZj1cIiMyXCIvPjxhZGRyZXNzIGhyZWY9XCIjM1wiLz48L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb20xID0gZ2V0T01FbGVtZW50KHJlZjEsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTEpOwotICAgICAgICBTdHJpbmcgcmVmMiA9ICI8cmVmZXJlbmNlIGlkPVwiMlwiPmZhbHNlPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMiA9IGdldE9NRWxlbWVudChyZWYyLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20yKTsKLSAgICAgICAgU3RyaW5nIHJlZjMgPSAiPHJlZmVyZW5jZSBpZD1cIjNcIj48dG93biBocmVmPVwiIzRcIi8+PG51bWJlcj4xMDEwPC9udW1iZXI+PC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMyA9IGdldE9NRWxlbWVudChyZWYzLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20zKTsKLSAgICAgICAgU3RyaW5nIHJlZjQgPSAiPHJlZmVyZW5jZSBpZD1cIjRcIj5Db2xvbWJvMzwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTQgPSBnZXRPTUVsZW1lbnQocmVmNCwgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tNCk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxTWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTs7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaW5ldCA9IHNlbmRlci5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIAotICAgICAgICByZXFNZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0KLSAgICAgICAgb3BDbGluZXQuYWRkTWVzc2FnZUNvbnRleHQocmVxTWVzc2FnZUNvbnRleHQpOwotICAgICAgICBvcENsaW5ldC5leGVjdXRlKHRydWUpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTWVzc2FnZUNvbnR4ID0KLSAgICAgICAgICAgICAgICBvcENsaW5ldC5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSByZXNwb25zZU1lc3NhZ2VDb250eC5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIE15QmVhbiByZXNCZWFuID0gKE15QmVhbilCZWFuVXRpbC5kZXNlcmlhbGl6ZShNeUJlYW4uY2xhc3MsIHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNCZWFuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc0JlYW4uZ2V0QWdlKCksIDE1OSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0b21yZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJvbXJlZnMiKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoTkFNRVNQQUNFLCAibXkiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm9tcmVmcyIsIG9tTnMpOwotCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzAiLCBudWxsKTsKLSAgICAgICAgdmFsdWUuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMSIsIG51bGwpOwotICAgICAgICB2YWx1ZTIuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZSgiaHJlZiIsIG51bGwsICIjMSIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7Ci0KLQotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQobWV0aG9kKTsKLQotCi0gICAgICAgIFN0cmluZyByZWYxID0KLSAgICAgICAgICAgICAgICAiPHJlZmVyZW5jZSBpZD1cIjFcIj48bmFtZT5EZWVwYWw8L25hbWU+PHZhbHVlIGhyZWY9XCIjMlwiLz48YWRkcmVzcyBocmVmPVwiIzNcIi8+PC9yZWZlcmVuY2U+IjsKLSAgICAgICAgT01FbGVtZW50IG9tMSA9IGdldE9NRWxlbWVudChyZWYxLCBmYWMpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQob20xKTsKLSAgICAgICAgU3RyaW5nIHJlZjIgPSAiPHJlZmVyZW5jZSBpZD1cIjJcIj5mYWxzZTwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTIgPSBnZXRPTUVsZW1lbnQocmVmMiwgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tMik7Ci0gICAgICAgIFN0cmluZyByZWYzID0gIjxyZWZlcmVuY2UgaWQ9XCIzXCI+PHRvd24gaHJlZj1cIiM0XCIvPjxudW1iZXI+MTAxMDwvbnVtYmVyPjwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIE9NRWxlbWVudCBvbTMgPSBnZXRPTUVsZW1lbnQocmVmMywgZmFjKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG9tMyk7Ci0gICAgICAgIFN0cmluZyByZWY0ID0gIjxyZWZlcmVuY2UgaWQ9XCI0XCI+Q29sb21ibzM8L3JlZmVyZW5jZT4iOwotICAgICAgICBPTUVsZW1lbnQgb200ID0gZ2V0T01FbGVtZW50KHJlZjQsIGZhYyk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvbTQpOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxTWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTs7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaW5ldCA9IHNlbmRlci5jcmVhdGVDbGllbnQoU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIAotICAgICAgICByZXFNZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0KLSAgICAgICAgb3BDbGluZXQuYWRkTWVzc2FnZUNvbnRleHQocmVxTWVzc2FnZUNvbnRleHQpOwotICAgICAgICBvcENsaW5ldC5leGVjdXRlKHRydWUpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTWVzc2FnZUNvbnR4ID0KLSAgICAgICAgICAgICAgICBvcENsaW5ldC5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSByZXNwb25zZU1lc3NhZ2VDb250eC5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGVudi5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKGJvb2xlYW4uY2xhc3MpOwotCi0gICAgICAgIE9iamVjdCBbXSByZXNCZWFuID0KLSAgICAgICAgICAgICAgICBCZWFuVXRpbC5kZXNlcmlhbGl6ZShyZXNwb25zZSwgYXJncy50b0FycmF5KCksIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzQmVhbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygoKEJvb2xlYW4pcmVzQmVhblswXSkuYm9vbGVhblZhbHVlKCksIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgT01FbGVtZW50IGdldE9NRWxlbWVudChTdHJpbmcgc3RyLCBPTUZhY3RvcnkgZmFjKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdGF4T01CdWlsZGVyOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHIuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBzdGF4T01CdWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmFjLCB4bWxSZWFkZXIpOwotICAgICAgICByZXR1cm4gc3RheE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RlY2hvRW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9FbXBsb3llZSIpOwotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShOQU1FU1BBQ0UsICJteSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob0VtcGxveWVlIiwgb21Ocyk7Ci0KLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiYXJnMCIsIG51bGwpOwotICAgICAgICB2YWx1ZS5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKCJocmVmIiwgbnVsbCwgIiMxIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLQotICAgICAgICBTdHJpbmcgc3RyID0gIjxyZWZlcmVuY2UgaWQ9XCIxXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiIDxuYW1lPkpvaG48L25hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAiIDxhZ2U+NTA8L2FnZT5cbiIgKwotICAgICAgICAgICAgICAgICIgPGVtcGx5ZXIgaHJlZj1cIiMxXCIvPlxuIiArCi0gICAgICAgICAgICAgICAgIiA8YWRkcmVzcyBocmVmPVwiIzJcIi8+XG4iICsKLSAgICAgICAgICAgICAgICAiPC9yZWZlcmVuY2U+IjsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKGdldE9NRWxlbWVudChzdHIsIGZhYykpOwotICAgICAgICBzdHIgPSAiPHJlZmVyZW5jZSBpZD1cIjJcIj5cbiIgKwotICAgICAgICAgICAgICAgICI8dG93bj5Db2xvbWJvMzwvdG93bj48bnVtYmVyPjEwMTA8L251bWJlcj5cbiIgKwotICAgICAgICAgICAgICAgICI8L3JlZmVyZW5jZT4iOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoZ2V0T01FbGVtZW50KHN0ciwgZmFjKSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxTWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgRW1wbG95ZWUgZW1wID0gKEVtcGxveWVlKUJlYW5VdGlsLmRlc2VyaWFsaXplKEVtcGxveWVlLmNsYXNzLCBlbnYuZ2V0Qm9keSgpCi0gICAgICAgICAgICAgICAgLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpLCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVtcCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsaXRyZWZBcnJheSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiaGFuZGxlQXJyYXlMaXN0Iik7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKE5BTUVTUEFDRSwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJoYW5kbGVBcnJheUxpc3QiLCBvbU5zKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcmcwIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlLmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoImhyZWYiLCBudWxsLCAiIzEiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgT01FbGVtZW50IHZhbHVlMiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFyZzEiLCBudWxsKTsKLSAgICAgICAgdmFsdWUyLnNldFRleHQoIjEwIik7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZTIpOwotCi0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKG1ldGhvZCk7Ci0KLQotICAgICAgICBTdHJpbmcgc3RyID0gIjxyZWZlcmVuY2UgaWQ9XCIxXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxpdGVtMD5hYmM8L2l0ZW0wPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8aXRlbTA+ZGVmPC9pdGVtMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGl0ZW0wPmdoaTwvaXRlbTA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxpdGVtMD5rbG08L2l0ZW0wPlxuIiArCi0gICAgICAgICAgICAgICAgIjwvcmVmZXJlbmNlPiI7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RheE9NQnVpbGRlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldwotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHIuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgc3RheE9NQnVpbGRlciA9IG5ldwotICAgICAgICAgICAgICAgICAgICBTdEFYT01CdWlsZGVyKGZhYywgeG1sUmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcikgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChmYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoc3RheE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxTWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpbmV0ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgCi0gICAgICAgIHJlcU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBvcENsaW5ldC5hZGRNZXNzYWdlQ29udGV4dChyZXFNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIG9wQ2xpbmV0LmV4ZWN1dGUodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udHggPQotICAgICAgICAgICAgICAgIG9wQ2xpbmV0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlc3BvbnNlTWVzc2FnZUNvbnR4LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgImFiY2RlZmdoaWtsbTEwIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL015QmVhbi5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9NeUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1YzJiMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL015QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotcHVibGljIGNsYXNzIE15QmVhbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIGludCBhZ2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotICAgIHByaXZhdGUgQWRkcmVzc0JlYW4gYWRkcmVzczsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QWdlKCkgewotICAgICAgICByZXR1cm4gYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFnZShpbnQgYWdlKSB7Ci0gICAgICAgIHRoaXMuYWdlID0gYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzc0JlYW4gZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIGFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhBZGRyZXNzQmVhbiBhZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICgibmFtZToiICsgbmFtZSArICIgQWdlIDogIiArIGFnZSArICIgVmFsdWUgOiAiICsgdmFsdWUgKyAiIEFkZHJlc3MgOiAiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1BlcnNvbi5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9QZXJzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlNTAxZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYzsKLQotcHVibGljIGNsYXNzIFBlcnNvbiB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotICAgIHByb3RlY3RlZCBpbnQgYWdlOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBZ2UoKSB7Ci0gICAgICAgIHJldHVybiBhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWdlKGludCBhZ2UpIHsKLSAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9SUENDYWxsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9SUENDYWxsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE5NWFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvUlBDQ2FsbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZWZhdWx0T2JqZWN0U3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5SUENMb2NhbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotcHVibGljIGNsYXNzIFJQQ0NhbGxUZXN0IGV4dGVuZHMgUlBDTG9jYWxUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgenVsdSA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onIik7Ci0gICAgLy8gIDAxMjM0NTY3ODkgMCAxMjM0NTY3ODkKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZGVwbG95Q2xhc3NBc1NlcnZpY2UoIkVjaG9YTUxTZXJ2aWNlIiwgUlBDU2VydmljZUNsYXNzLmNsYXNzKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWRpdEJlYW4oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVkaXRCZWFuIik7Ci0KLSAgICAgICAgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7Ci0gICAgICAgIGJlYW4uc2V0QWdlKDEwMCk7Ci0gICAgICAgIGJlYW4uc2V0TmFtZSgiRGVlcGFsIik7Ci0gICAgICAgIGJlYW4uc2V0VmFsdWUoZmFsc2UpOwotICAgICAgICBBZGRyZXNzQmVhbiBhYiA9IG5ldyBBZGRyZXNzQmVhbigpOwotICAgICAgICBhYi5zZXROdW1iZXIoMTAxMCk7Ci0gICAgICAgIGFiLnNldFRvd24oIkNvbG9tYm8zIik7Ci0gICAgICAgIGJlYW4uc2V0QWRkcmVzcyhhYik7Ci0KLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoYmVhbik7Ci0gICAgICAgIGFyZ3MuYWRkKCIxNTkiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWRpdEJlYW4iLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgTXlCZWFuIHJlc0JlYW4gPSAoTXlCZWFuKUJlYW5VdGlsLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywgcmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc0JlYW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzQmVhbi5nZXRBZ2UoKSwgMTU5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob0JlYW4oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9CZWFuIik7Ci0KLSAgICAgICAgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7Ci0gICAgICAgIGJlYW4uc2V0QWdlKDEwMCk7Ci0gICAgICAgIGJlYW4uc2V0TmFtZSgiRGVlcGFsIik7Ci0gICAgICAgIGJlYW4uc2V0VmFsdWUoZmFsc2UpOwotICAgICAgICBBZGRyZXNzQmVhbiBhYiA9IG5ldyBBZGRyZXNzQmVhbigpOwotICAgICAgICBhYi5zZXROdW1iZXIoMTAxMCk7Ci0gICAgICAgIGFiLnNldFRvd24oIkNvbG9tYm8zIik7Ci0gICAgICAgIGJlYW4uc2V0QWRkcmVzcyhhYik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKGJlYW4pOwotCi0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9CZWFuIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIE15QmVhbiByZXNCZWFuID0gKE15QmVhbilCZWFuVXRpbC5kZXNlcmlhbGl6ZShNeUJlYW4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0vLyAgICAgICAgTXlCZWFuIHJlc0JlYW4gPShNeUJlYW4pIG5ldyAgQmVhblNlcmlhbGl6ZXIoTXlCZWFuLmNsYXNzLHJlc3BvbnNlKS5kZXNlcmlsemUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNCZWFuKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc0JlYW4uZ2V0QWdlKCksIDEwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdGVjaG9NYWlsKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvTWFpbCIpOwotCi0gICAgICAgIE1haWwgbWFpbCA9IG5ldyBNYWlsKCk7Ci0gICAgICAgIG1haWwuc2V0Qm9keSgiTXkgQm9keSIpOwotICAgICAgICBtYWlsLnNldENvbnRlbnRUeXBlKCJDb250ZW50VHlwZSIpOwotICAgICAgICBtYWlsLnNldEZyb20oIkZyb20iKTsKLSAgICAgICAgbWFpbC5zZXRJZCgiSUQiKTsKLSAgICAgICAgbWFpbC5zZXRTdWJqZWN0KCJTdWJqZWN0Iik7Ci0gICAgICAgIG1haWwuc2V0VG8oIlRvIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKG1haWwpOwotCi0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9NYWlsIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIE1haWwgcmVzQmVhbiA9IChNYWlsKUJlYW5VdGlsLmRlc2VyaWFsaXplKE1haWwuY2xhc3MsIHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotLy8gICAgICAgIE15QmVhbiByZXNCZWFuID0oTXlCZWFuKSBuZXcgIEJlYW5TZXJpYWxpemVyKE15QmVhbi5jbGFzcyxyZXNwb25zZSkuZGVzZXJpbHplKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzQmVhbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXNCZWFuLmdldEJvZHkoKSwgIk15IEJvZHkiKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvU3RyaW5nIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKCJmb28iKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9TdHJpbmciLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgImZvbyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvSW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvSW50Iik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKCIxMDAiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob0ludCIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpLCAxMDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImFkZCIpOwotICAgIAkKLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKCIxMDAiKTsKLSAgICAgICAgYXJncy5hZGQoIjIwMCIpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJhZGQiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpKSwgMzAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUFycmF5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJ0ZXN0Qnl0ZUFycmF5Iik7Ci0gICAgCQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nIGhlbGxvID0gImhlbGxvIjsKLSAgICAgICAgYXJncy5hZGQoaGVsbG8uZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgInRlc3RCeXRlQXJyYXkiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgaGVsbG8pOwotICAgIH0KLQotICAgIC8vCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJkaXZpZGUiKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoIjEwIik7Ci0gICAgICAgIGFyZ3MuYWRkKCIwIik7Ci0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJkaXZpZGUiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSwgIklORiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvQm9vbCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0Jvb2wiKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoInRydWUiKTsKLQotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob0Jvb2wiLCAicmVxIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4udmFsdWVPZihyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCkpLmJvb2xlYW5WYWx1ZSgpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob0J5dGUoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9CeXRlIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKCIxIik7Ci0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvQnl0ZSIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZS5wYXJzZUJ5dGUocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpKSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBhbnkoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9Db21wYW55Iik7Ci0KLSAgICAgICAgQ29tcGFueSBjb20gPSBuZXcgQ29tcGFueSgpOwotICAgICAgICBjb20uc2V0TmFtZSgiTXlDb21wYW55Iik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHBzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFBlcnNvbiBwMSA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDEuc2V0QWdlKDEwKTsKLSAgICAgICAgcDEuc2V0TmFtZSgiUDEiKTsKLSAgICAgICAgcHMuYWRkKHAxKTsKLQotICAgICAgICBQZXJzb24gcDIgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAyLnNldEFnZSgxNSk7Ci0gICAgICAgIHAyLnNldE5hbWUoIlAyIik7Ci0gICAgICAgIHBzLmFkZChwMik7Ci0KLSAgICAgICAgUGVyc29uIHAzID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMy5zZXRBZ2UoMjApOwotICAgICAgICBwMy5zZXROYW1lKCJQMyIpOwotICAgICAgICBwcy5hZGQocDMpOwotCi0gICAgICAgIGNvbS5zZXRQZXJzb25zKHBzKTsKLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKGNvbSk7Ci0gICAgICAgIHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJlY2hvQ29tcGFueSIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdHRlc3RDb21wYW55KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJ0ZXN0Q29tcGFueUFycmF5Iik7Ci0KLSAgICAgICAgQ29tcGFueSBjb20gPSBuZXcgQ29tcGFueSgpOwotICAgICAgICBjb20uc2V0TmFtZSgiTXlDb21wYW55Iik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHBzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFBlcnNvbiBwMSA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDEuc2V0QWdlKDEwKTsKLSAgICAgICAgcDEuc2V0TmFtZSgiUDEiKTsKLSAgICAgICAgcHMuYWRkKHAxKTsKLQotICAgICAgICBQZXJzb24gcDIgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAyLnNldEFnZSgxNSk7Ci0gICAgICAgIHAyLnNldE5hbWUoIlAyIik7Ci0gICAgICAgIHBzLmFkZChwMik7Ci0KLSAgICAgICAgUGVyc29uIHAzID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMy5zZXRBZ2UoMjApOwotICAgICAgICBwMy5zZXROYW1lKCJQMyIpOwotICAgICAgICBwcy5hZGQocDMpOwotCi0gICAgICAgIGNvbS5zZXRQZXJzb25zKHBzKTsKLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFyZ3MuYWRkKGNvbSk7Ci0gICAgICAgIGFyZ3MuYWRkKGNvbSk7Ci0gICAgICAgIGFyZ3MuYWRkKGNvbSk7Ci0gICAgICAgIGFyZ3MuYWRkKGNvbSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHJlcSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcmVxLmFkZChhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJ0ZXN0Q29tcGFueUFycmF5IiwgInJlcSIpLCByZXEudG9BcnJheSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI0IiwgdmFsdWUuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFueUFycmF5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJDb21wYW55QXJyYXkiKTsKLQotICAgICAgICBDb21wYW55IGNvbSA9IG5ldyBDb21wYW55KCk7Ci0gICAgICAgIGNvbS5zZXROYW1lKCJNeUNvbXBhbnkiKTsKLQotICAgICAgICBBcnJheUxpc3QgcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgUGVyc29uIHAxID0gbmV3IFBlcnNvbigpOwotICAgICAgICBwMS5zZXRBZ2UoMTApOwotICAgICAgICBwMS5zZXROYW1lKCJQMSIpOwotICAgICAgICBwcy5hZGQocDEpOwotCi0gICAgICAgIFBlcnNvbiBwMiA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDIuc2V0QWdlKDE1KTsKLSAgICAgICAgcDIuc2V0TmFtZSgiUDIiKTsKLSAgICAgICAgcHMuYWRkKHAyKTsKLQotICAgICAgICBQZXJzb24gcDMgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIHAzLnNldEFnZSgyMCk7Ci0gICAgICAgIHAzLnNldE5hbWUoIlAzIik7Ci0gICAgICAgIHBzLmFkZChwMyk7Ci0KLSAgICAgICAgY29tLnNldFBlcnNvbnMocHMpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLSAgICAgICAgYXJncy5hZGQoY29tKTsKLQotICAgICAgICBBcnJheUxpc3QgcmVxID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXEuYWRkKGFyZ3MudG9BcnJheSgpKTsKLSAgICAgICAgQXJyYXlMaXN0IHJlc29iaiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcmVzb2JqLmFkZChDb21wYW55LmNsYXNzKTsKLSAgICAgICAgcmVzb2JqLmFkZChDb21wYW55LmNsYXNzKTsKLSAgICAgICAgcmVzb2JqLmFkZChDb21wYW55LmNsYXNzKTsKLSAgICAgICAgcmVzb2JqLmFkZChDb21wYW55LmNsYXNzKTsKLSAgICAgICAgT2JqZWN0IFtdIHZhbHVlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgIkNvbXBhbnlBcnJheSIsICJyZXEiKSwgcmVxLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzc1tdKXJlc29iai50b0FycmF5KG5ldyBDbGFzc1tyZXNvYmouc2l6ZSgpXSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgdmFsdWUubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoQ29tcGFueSl2YWx1ZVswXSkuZ2V0TmFtZSgpLCAiTXlDb21wYW55Iik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob09NKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvT00iKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoIjEiKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9PTSIsICJyZXEiKSwgYXJncy50b0FycmF5KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZS5wYXJzZUJ5dGUocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpKSwgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhbGVuZGVyKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHp1bHUuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBnZXRSUENDbGllbnQoIkVjaG9YTUxTZXJ2aWNlIiwgImVjaG9DYWxhbmRlciIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBEYXRlIGRhdGUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKTsKLSAgICAgICAgYXJncy5hZGQoenVsdS5mb3JtYXQoZGF0ZSkpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob0NhbGFuZGVyIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCksIHp1bHUuZm9ybWF0KGRhdGUpKTsKLSAgICB9Ci0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEludm9raW5nIGJ5IFBhc3NpbmcgUmV0dXJuIHR5cGVzIC8vLy8vLy8vLy8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0ZWNob0JlYW4yKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJlY2hvQmVhbiIpOwotCi0gICAgICAgIE15QmVhbiBiZWFuID0gbmV3IE15QmVhbigpOwotICAgICAgICBiZWFuLnNldEFnZSgxMDApOwotICAgICAgICBiZWFuLnNldE5hbWUoIkRlZXBhbCIpOwotICAgICAgICBiZWFuLnNldFZhbHVlKGZhbHNlKTsKLSAgICAgICAgQWRkcmVzc0JlYW4gYWIgPSBuZXcgQWRkcmVzc0JlYW4oKTsKLSAgICAgICAgYWIuc2V0TnVtYmVyKDEwMTApOwotICAgICAgICBhYi5zZXRUb3duKCJDb2xvbWJvMyIpOwotICAgICAgICBiZWFuLnNldEFkZHJlc3MoYWIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZChiZWFuKTsKLQotICAgICAgICBBcnJheUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXQuYWRkKE15QmVhbi5jbGFzcyk7Ci0KLSAgICAgICAgT2JqZWN0IFtdIHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgImVjaG9CZWFuIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzc1tdKXJldC50b0FycmF5KG5ldyBDbGFzc1tyZXQuc2l6ZSgpXSkpOwotICAgICAgICBNeUJlYW4gcmVzQmVhbiA9IChNeUJlYW4pcmVzcG9uc2VbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVzQmVhbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXNCZWFuLmdldEFnZSgpLCAxMDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RlY2hvSW50MigpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAiZWNob0ludCIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCgiMTAwIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcmV0LmFkZChJbnRlZ2VyLmNsYXNzKTsKLQotICAgICAgICBPYmplY3QgW10gcmVzcG9uc2UgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAiZWNob0ludCIsICJyZXEiKSwgYXJncy50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xhc3NbXSlyZXQudG9BcnJheShuZXcgQ2xhc3NbcmV0LnNpemUoKV0pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoSW50ZWdlcilyZXNwb25zZVswXSkuaW50VmFsdWUoKSwgMTAwKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RtdWx0aXJldHVybigpIHRocm93cyBBeGlzRmF1bHQgewotLy8gICAgICAgIGNvbmZpZ3VyZVN5c3RlbSgibXVsdGlyZXR1cm4iKTsKLS8vCi0vLyAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLS8vICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0vLyAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0vLwotLy8gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotLy8gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0vLyAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgUlBDU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLS8vICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLS8vCi0vLyAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLyAgICAgICAgYXJncy5hZGQoIjEiKTsKLS8vCi0vLyAgICAgICAgQXJyYXlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vICAgICAgICByZXQuYWRkKEludGVnZXIuY2xhc3MpOwotLy8gICAgICAgIHJldC5hZGQoU3RyaW5nLmNsYXNzKTsKLS8vCi0vLyAgICAgICAgT2JqZWN0IFtdIHJlc3BvbnNlID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG9wZXJhdGlvbk5hbWUsIGFyZ3MudG9BcnJheSgpLCByZXQudG9BcnJheSgpKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoKChJbnRlZ2VyKSByZXNwb25zZVswXSkuaW50VmFsdWUoKSwgMTApOwotLy8gICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVsxXSwgImZvbyIpOwotLy8gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0FycmF5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJoYW5kbGVTdHJpbmdBcnJheSIpOwotCi0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmcgW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgImFiYyIsICJjZGUiLCAiZWZnIiB9OwotICAgICAgICBhcmdzLmFkZCh2YWx1ZXMpOwotICAgICAgICBBcnJheUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICByZXQuYWRkKEJvb2xlYW4uY2xhc3MpOwotICAgICAgICBPYmplY3QgW10gb2JqcyA9IHNlbmRlci5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZyIsICJoYW5kbGVTdHJpbmdBcnJheSIsICJyZXEiKSwgYXJncy50b0FycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzc1tdKXJldC50b0FycmF5KG5ldyBDbGFzc1tyZXQuc2l6ZSgpXSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9ianMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBCb29sZWFuLnZhbHVlT2Yob2Jqc1swXS50b1N0cmluZygpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdG11bHRpQXJyYXlzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJtdWx0aUFycmF5cyIpOwotICAgIAkKLSAgICAgICAgQXJyYXlMaXN0IGFyZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiYWJjIiwgImNkZSIsICJlZmciIH07Ci0gICAgICAgIGFyZ3MuYWRkKHZhbHVlcyk7Ci0KLSAgICAgICAgU3RyaW5nIFtdIHZhbHVlczIgPSBuZXcgU3RyaW5nW10geyAiYWJjIiwgImNkZSIsICJlZmciIH07Ci0gICAgICAgIGFyZ3MuYWRkKHZhbHVlczIpOwotICAgICAgICBTdHJpbmcgW10gdmFsdWVzMyA9IG5ldyBTdHJpbmdbXSB7ICJhYmMiLCAiY2RlIiwgImVmZyIgfTsKLSAgICAgICAgYXJncy5hZGQodmFsdWVzMyk7Ci0gICAgICAgIGFyZ3MuYWRkKCIxMCIpOwotCi0gICAgICAgIEFycmF5TGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJldC5hZGQoSW50ZWdlci5jbGFzcyk7Ci0gICAgICAgIE9iamVjdCBbXSBvYmpzID0gc2VuZGVyLmludm9rZUJsb2NraW5nKG5ldyBRTmFtZSgiaHR0cDovL3JwYy5heGlzMi5hcGFjaGUub3JnIiwgIm11bHRpQXJyYXlzIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzW10pcmV0LnRvQXJyYXkobmV3IENsYXNzW3JldC5zaXplKCldKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2Jqcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxOSwgSW50ZWdlci5wYXJzZUludChvYmpzWzBdLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0bXVsUmV0dXJuKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJtdWxSZXR1cm4iKTsKLQotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoImZvbyIpOwotCi0KLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBzZW5kZXIuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmciLCAibXVsUmV0dXJuIiwgInJlcSIpLCBhcmdzLnRvQXJyYXkoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbWVudCA9ICIgKyBlbGVtZW50KTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpLCAiZm9vIik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0aGFuZGxlQXJyYXlMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCVJQQ1NlcnZpY2VDbGllbnQgc2VuZGVyID0gZ2V0UlBDQ2xpZW50KCJFY2hvWE1MU2VydmljZSIsICJoYW5kbGVBcnJheUxpc3QiKTsKLQotICAgICAgICBPTUVsZW1lbnQgZWxlbSA9IHNlbmRlci5zZW5kUmVjZWl2ZShnZXRQYXlsb2FkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbS5nZXRGaXJzdEVsZW1lbnQoKS5nZXRUZXh0KCksICJhYmNkZWZnaGlrbG0xMCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RvbUVsZW1lbnRBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IGdldFJQQ0NsaWVudCgiRWNob1hNTFNlcnZpY2UiLCAib21FbGVtZW50QXJyYXkiKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzdHIgPSAiPHJlcTpvbUVsZW1lbnRBcnJheSB4bWxuczpyZXE9XCJodHRwOi8vcnBjLmF4aXMyLmFwYWNoZS5vcmdcIj5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGFyZzA+PGFiYz52YXVlMTwvYWJjPjwvYXJnMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGFyZzA+PGFiYz52YXVlMjwvYWJjPjwvYXJnMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGFyZzA+PGFiYz52YXVlMzwvYWJjPjwvYXJnMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGFyZzA+PGFiYz52YXVlNDwvYWJjPjwvYXJnMD5cbiIgKwotICAgICAgICAgICAgICAgICI8L3JlcTpvbUVsZW1lbnRBcnJheT4iOwotICAgICAgICBTdEFYT01CdWlsZGVyIHN0YXhPTUJ1aWxkZXI7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0ci5nZXRCeXRlcygpKSk7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQotICAgICAgICBzdGF4T01CdWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmFjLCB4bWxSZWFkZXIpOwotCi0gICAgICAgIE9NRWxlbWVudCBlbGVtID0gc2VuZGVyLnNlbmRSZWNlaXZlKHN0YXhPTUJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjQiLCBlbGVtLmdldEZpcnN0RWxlbWVudCgpLmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZ2V0UGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3RyID0gIjxyZXE6aGFuZGxlQXJyYXlMaXN0IHhtbG5zOnJlcT1cImh0dHA6Ly9ycGMuYXhpczIuYXBhY2hlLm9yZ1wiPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgPGFyZzA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxpdGVtMD5hYmM8L2l0ZW0wPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICA8aXRlbTA+ZGVmPC9pdGVtMD5cbiIgKwotICAgICAgICAgICAgICAgICIgICAgPGl0ZW0wPmdoaTwvaXRlbTA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgIDxpdGVtMD5rbG08L2l0ZW0wPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgPC9hcmcwPjxhcmcxPjEwPC9hcmcxPiIgKwotICAgICAgICAgICAgICAgICI8L3JlcTpoYW5kbGVBcnJheUxpc3Q+IjsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdGF4T01CdWlsZGVyOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgIHN0YXhPTUJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihmYWMsIHhtbFJlYWRlcik7Ci0gICAgICAgIHJldHVybiBzdGF4T01CdWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1JQQ1NlcnZpY2VDbGFzcy5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9SUENTZXJ2aWNlQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5OTIwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL1JQQ1NlcnZpY2VDbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ycGM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVmYXVsdE9iamVjdFN1cHBsaWVyOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBjbGFzcyBSUENTZXJ2aWNlQ2xhc3MgewotCi0gICAgcHVibGljIE15QmVhbiBlZGl0QmVhbihNeUJlYW4gYmVhbiwgaW50IGEpIHsKLSAgICAgICAgYmVhbi5zZXRBZ2UoYSk7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotCi0gICAgcHVibGljIE15QmVhbiBlY2hvQmVhbihNeUJlYW4gYmVhbikgewotICAgICAgICByZXR1cm4gYmVhbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGluKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGVjaG9JbnQoaW50IGkpIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBhZGQoaW50IGEsIGludCBiKSB7Ci0gICAgICAgIHJldHVybiBhICsgYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlY2hvQm9vbChib29sZWFuIGIpIHsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGUgZWNob0J5dGUoYnl0ZSBiKSB7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNob09NKE9NRWxlbWVudCBiKSB7Ci0gICAgICAgIGIuYnVpbGQoKTsKLS8vICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0vLyAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0vLyAgICAgICAgICAgICAgICAiaHR0cDovL3NvYXBlbmMvIiwgInJlcyIpOwotLy8gICAgICAgIE9NRWxlbWVudCBib2R5Q29udGVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0vLyAgICAgICAgICAgICAgICAiZWNob09NUmVzcG9uc2UiLCBucyk7Ci0vLyAgICAgICAgT01FbGVtZW50IGNoaWxkID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmV0dXJuIiwgbnVsbCk7Ci0vLyAgICAgICAgY2hpbGQuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dChjaGlsZCwgYi5nZXRUZXh0KCkpKTsKLS8vICAgICAgICBib2R5Q29udGVudC5hZGRDaGlsZChjaGlsZCk7Ci0vLy8vICAgICAgICBib2R5Q29udGVudC5hZGRDaGlsZChiKTsKLSAgICAgICAgcmV0dXJuIChPTUVsZW1lbnQpYi5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGRpdmlkZShkb3VibGUgYSwgZG91YmxlIGIpIHsKLSAgICAgICAgcmV0dXJuIChhIC8gYik7Ci0gICAgfQotCi0gICAgcHVibGljIENhbGVuZGFyIGVjaG9DYWxhbmRlcihDYWxlbmRhciBpbikgewotICAgICAgICByZXR1cm4gaW47Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBtdWx0aXJldHVybihPTUVsZW1lbnQgZWxlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vbG9jYWxob3N0L215IiwgInJlcyIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibXVsdGlyZXR1ZW5SZXNwb25zZSIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUxID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmV0dXJuMCIsIG51bGwpOwotICAgICAgICB2YWx1ZTEuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZTEsICIxMCIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMSk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJyZXR1cm4xIiwgbnVsbCk7Ci0gICAgICAgIHZhbHVlMi5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01UZXh0KHZhbHVlMiwgImZvbyIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIG11dGlwbGUgb2JqZWN0ICwgc28gaXQgY3JlYXQgYW4gT2JqZWN0IGFycmF5IGFuZCByZXR1ZW4gdGhhdCBzbyAsIGlmIGEKLSAgICAgKiBtZXRob2Qgd2FudCB0byByZXR1cm4gbXV0aXBsZSB2YWx1ZSAsIHRoaXMgd2F5IGNhbiBiZSB1c2VkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogQHJldHVybiBPYmplY3QgW10KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gbXVsUmV0dXJuKE9NRWxlbWVudCBvYmopIHsKLSAgICAgICAgQXJyYXlMaXN0IG9ianMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9ianMuYWRkKG5ldyBJbnRlZ2VyKDEwMCkpOwotICAgICAgICBNeUJlYW4gYmVhbiA9IG5ldyBNeUJlYW4oKTsKLSAgICAgICAgYmVhbi5zZXRBZ2UoMTAwKTsKLSAgICAgICAgYmVhbi5zZXROYW1lKCJEZWVwYWwiKTsKLSAgICAgICAgYmVhbi5zZXRWYWx1ZShmYWxzZSk7Ci0gICAgICAgIEFkZHJlc3NCZWFuIGFiID0gbmV3IEFkZHJlc3NCZWFuKCk7Ci0gICAgICAgIGFiLnNldE51bWJlcigxMDEwKTsKLSAgICAgICAgYWIuc2V0VG93bigiQ29sb21ibzMiKTsKLSAgICAgICAgYmVhbi5zZXRBZGRyZXNzKGFiKTsKLSAgICAgICAgb2Jqcy5hZGQoYmVhbik7Ci0gICAgICAgIHJldHVybiBvYmpzLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXlCZWFuIGJlYW5PTShPTUVsZW1lbnQgZWxlbWVudCwgaW50IHZhbCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE15QmVhbiBiZWFuID0gKE15QmVhbilCZWFuVXRpbAotICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShNeUJlYW4uY2xhc3MsIGVsZW1lbnQsIG5ldyBEZWZhdWx0T2JqZWN0U3VwcGxpZXIoKSwgbnVsbCk7Ci0gICAgICAgIGJlYW4uc2V0QWdlKHZhbCk7Ci0gICAgICAgIHJldHVybiBiZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9tcmVmcyhPTUVsZW1lbnQgZWxlbWVudCwgT01FbGVtZW50IGVsZW1lbnQyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTXlCZWFuIGJlYW4gPSAoTXlCZWFuKUJlYW5VdGlsCi0gICAgICAgICAgICAgICAgLmRlc2VyaWFsaXplKE15QmVhbi5jbGFzcywgZWxlbWVudCwgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpLCBudWxsKTsKLSAgICAgICAgTXlCZWFuIGJlYW4yID0gKE15QmVhbilCZWFuVXRpbAotICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShNeUJlYW4uY2xhc3MsIGVsZW1lbnQyLCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksIG51bGwpOwotICAgICAgICByZXR1cm4gYmVhbjIgIT0gbnVsbCAmJiBiZWFuICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBoYW5kbGVBcnJheUxpc3QoQXJyYXlMaXN0IGxpc3QsIGludCBiKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT01FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpb2JqOwotICAgICAgICAgICAgICAgIHN0ciA9IHN0ciArIG9tRWxlbWVudC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0ciArIGI7Ci0gICAgfQotCi0gICAgcHVibGljIEVtcGxveWVlIGVjaG9FbXBsb3llZShFbXBsb3llZSBlbSkgewotICAgICAgICByZXR1cm4gZW07Ci0gICAgfQotCi0gICAgcHVibGljIGludCB0ZXN0Q29tcGFueUFycmF5KENvbXBhbnkgW10gY29tKSB7Ci0gICAgICAgIHJldHVybiBjb20ubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wYW55IFtdIENvbXBhbnlBcnJheShDb21wYW55IFtdIGNvbSkgewotICAgICAgICBBcnJheUxpc3QgcmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ29tcGFueSBjb21wYW55ID0gY29tW2ldOwotICAgICAgICAgICAgcmVzLmFkZChjb21wYW55KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKENvbXBhbnkgW10pcmVzLnRvQXJyYXkobmV3IENvbXBhbnlbcmVzLnNpemUoKV0pOwotICAgIH0KLQotCi0gICAgcHVibGljIENvbXBhbnkgZWNob0NvbXBhbnkoQ29tcGFueSBjb20pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBcnJheUxpc3QgcHNzID0gY29tLmdldFBlcnNvbnMoKTsKLSAgICAgICAgQXJyYXlMaXN0IHRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHNzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudClwc3MuZ2V0KGkpOwotICAgICAgICAgICAgUGVyc29uIHAgPSAoUGVyc29uKUJlYW5VdGlsCi0gICAgICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShQZXJzb24uY2xhc3MsIG9tRWxlbWVudCwgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpLCBudWxsKTsKLSAgICAgICAgICAgIHRlbXMuYWRkKHApOwotICAgICAgICB9Ci0gICAgICAgIGNvbS5zZXRQZXJzb25zKHRlbXMpOwotICAgICAgICByZXR1cm4gY29tOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsQW55VGhpbmcoU3RyaW5nIHZhbHVlMSwgaW50IGFiYywgRGF0ZSBkYXRlKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVTdHJpbmdBcnJheShTdHJpbmcgW10gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBvbUVsZW1lbnRBcnJheShPTUVsZW1lbnQgW10gb21FbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBvbUVsZW1lbnQubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBNYWlsIGVjaG9NYWlsKE1haWwgbWFpbCkgewotICAgICAgICByZXR1cm4gbWFpbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG11bHRpQXJyYXlzKFN0cmluZyBbXSBhLCBTdHJpbmcgYiBbXSwgU3RyaW5nIGQgW10sIGludCBjKSB7Ci0gICAgICAgIHJldHVybiBhLmxlbmd0aCArIGIubGVuZ3RoICsgZC5sZW5ndGggKyBjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdEJ5dGVBcnJheShieXRlIFtdIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvcnBjL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDU3ZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFUZXN0LmphdmEKLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETAotICogYnkgdGhlIEFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBTTkFQU0hPVCBNYXkgMzAsIDIwMDcgKDExOjU2OjAyIEVEVCkKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jb21wbGV4OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLnhzZC5BcnJheU9mQXJyYXlPZnN0cmluZzsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLnhzZC5BcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLnhzZC5BcnJheU9mUGVyc29uOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZhbnlUeXBlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZpbnQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy54c2QuQXJyYXlPZnNob3J0OwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMueHNkLkFycmF5T2ZzdHJpbmc7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLnhzZC4qOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSB7Ci0KLSBwcm90ZWN0ZWQgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSOwotICAgIHByb3RlY3RlZCBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiQ29tcGxleERhdGFUeXBlcyIpOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmluaXNoID0gZmFsc2U7Ci0gICAgb3JnLnRlbXB1cmkuY29tcGxleC5Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc0h0dHBTb2FwMTFFbmRwb2ludFN0dWIgc3R1YjsKLQotICAgIHB1YmxpYyBDb21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKENvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShDb21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAib3JnLnRlbXB1cmkuY29tcGxleC5Db21wbGV4RGF0YVR5cGVzIjsKLSAgICAgICAgVXRpbFNlcnZlci5zdGFydCgpOwotICAgICAgICBBeGlzU2VydmljZSAgIHNlcnZpY2UgPSBBeGlzU2VydmljZS5jcmVhdGVTZXJ2aWNlKAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgVXRpbFNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICBzZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdCh0cnVlKTsKLSAgICAgICAgc2VydmljZS5zZXROYW1lKCJDb21wbGV4RGF0YVR5cGVzIik7Ci0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0KLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgdGFyZ2V0RVBSID0KLSAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAoVXRpbFNlcnZlci5URVNUSU5HX1BPUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvQ29tcGxleERhdGFUeXBlcyIpOwotICAgICAgICBzdHViICA9IG5ldyBvcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzSHR0cFNvYXAxMUVuZHBvaW50U3R1YihudWxsLHRhcmdldEVQUi5nZXRBZGRyZXNzKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlJbnQxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheUludDFEKG51bGwpKTsKLSAgICAgICAgc3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5SW50MUQobmV3IEFycmF5T2ZpbnQoKSkpOwotICAgICAgICBzdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuY2xlYW51cFRyYW5zcG9ydCgpOwotICAgICAgICBBcnJheU9maW50IGlucHV0ID0gbmV3IEFycmF5T2ZpbnQoKTsKLSAgICAgICAgaW5wdXQuc2V0X2ludChuZXcgaW50W117MCwgMSwgMn0pOwotICAgICAgICBBcnJheU9maW50IHJldCA9IHN0dWIucmV0QXJyYXlJbnQxRChpbnB1dCk7Ci0gICAgICAgIHN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5jbGVhbnVwVHJhbnNwb3J0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQuZ2V0X2ludCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldC5nZXRfaW50KCkubGVuZ3RoLCAzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTdHJ1Y3RTTlNBUygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFN0cnVjdFNOU0FTKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0FTKG5ldyBHcm91cCgpKSk7Ci0gICAgICAgIEdyb3VwIGlucHV0ID0gbmV3IEdyb3VwKCk7Ci0gICAgICAgIGlucHV0LnNldE5hbWUoInh5eiIpOwotICAgICAgICBpbnB1dC5zZXRNZW1iZXJzKG5ldyBBcnJheU9mUGVyc29uKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0U05TQVMoaW5wdXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheURhdGVUaW1lMUQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5RGF0ZVRpbWUxRChudWxsKSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGF0ZVRpbWUxRChuZXcgQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSgpKSk7Ci0KLSAgICAgICAgQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSBpbnB1dCA9IG5ldyBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lKCk7Ci0gICAgICAgIGlucHV0LnNldERhdGVUaW1lKG5ldyBDYWxlbmRhcltde0NhbGVuZGFyLmdldEluc3RhbmNlKCksIENhbGVuZGFyLmdldEluc3RhbmNlKCl9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGF0ZVRpbWUxRChpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5U3RyaW5nMkQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEFycmF5U3RyaW5nMkQobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcyRChuZXcgQXJyYXlPZkFycmF5T2ZzdHJpbmcoKSkpOwotCi0gICAgICAgIEFycmF5T2ZBcnJheU9mc3RyaW5nIGlucHV0ID0gbmV3IEFycmF5T2ZBcnJheU9mc3RyaW5nKCk7Ci0gICAgICAgIEFycmF5T2ZzdHJpbmcgYTIgPSBuZXcgQXJyYXlPZnN0cmluZygpOwotICAgICAgICBBcnJheU9mc3RyaW5nIGExID0gbmV3IEFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgYTEuc2V0U3RyaW5nKG5ldyBTdHJpbmdbXXsiZm9vIiwgImJhciJ9KTsKLSAgICAgICAgaW5wdXQuc2V0QXJyYXlPZnN0cmluZyhuZXcgQXJyYXlPZnN0cmluZ1tde2ExLCBhMn0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcyRChpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5RGVjaW1hbDFEKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheURlY2ltYWwxRChudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheURlY2ltYWwxRChuZXcgQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsKCkpKTsKLQotICAgICAgICBBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwgaW5wdXQgPSBuZXcgQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsKCk7Ci0gICAgICAgIGlucHV0LnNldERlY2ltYWwobmV3IEJpZ0RlY2ltYWxbXXtuZXcgQmlnRGVjaW1hbCgxKSwgbmV3IEJpZ0RlY2ltYWwoMil9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5RGVjaW1hbDFEKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RydWN0U05TQSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0U3RydWN0U05TQShudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBKG5ldyBFbXBsb3llZSgpKSk7Ci0gICAgICAgIEVtcGxveWVlIGlucHV0ID0gbmV3IEVtcGxveWVlKCk7Ci0gICAgICAgIGlucHV0LnNldEpvYklEKDM0KTsKLSAgICAgICAgaW5wdXQuc2V0QmFzZURldGFpbHMobmV3IFBlcnNvbigpKTsKLSAgICAgICAgaW5wdXQuc2V0TnVtYmVycyhuZXcgQXJyYXlPZnNob3J0KCkpOwotICAgICAgICBpbnB1dC5zZXRIaXJlRGF0ZShDYWxlbmRhci5nZXRJbnN0YW5jZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0EoaW5wdXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheUFueVR5cGUxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlBbnlUeXBlMUQobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlBbnlUeXBlMUQobmV3IEFycmF5T2ZhbnlUeXBlKCkpKTsKLQotICAgICAgICBBcnJheU9mYW55VHlwZSBpbnB1dCA9IG5ldyBBcnJheU9mYW55VHlwZSgpOwotCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIC8vIGxldHMgY3JlYXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IG9mIHRoZSBBcnRpY2xlIGVsZW1lbnQKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vd3d3LnNlcnZlcnNpZGUuY29tL2FydGljbGVzL2ludHJvZHVjaW5nQXhpb20iLCAiYXJ0aWNsZSIpOwotICAgICAgICAvLyBub3cgY3JlYXRlIHRoZSBBcnRpY2xlIGVsZW1lbnQgd2l0aCB0aGUgYWJvdmUgbmFtZXNwYWNlCi0gICAgICAgIE9NRWxlbWVudCBhcnRpY2xlRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJBcnRpY2xlIiwgbnMpOwotCi0gICAgICAgLy8gY29tbWVudCBvdXQgdGVzdCBjYXNlIHNpbmNlIG5vdyBhZGIgdXNlcyBhbiBvYmplY3QgdG8gcmVwcmVzZW50IGFuIGFueSB0eXBlCi0gICAgICAgLy8gaW5wdXQuc2V0QW55VHlwZShuZXcgT01FbGVtZW50W117YXJ0aWNsZUVsZW1lbnR9KTsKLSAgICAgICAvLyBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlBbnlUeXBlMUQoaW5wdXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXREZXJpdmVkQ2xhc3MyKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MyKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldERlcml2ZWRDbGFzczIobmV3IFRhYmxlKCkpKTsKLQotICAgICAgICBUYWJsZSBpbnB1dCA9IG5ldyBUYWJsZSgpOwotICAgICAgICBpbnB1dC5zZXRTZWF0aW5nQ2FwYWNpdHkoNTApOwotICAgICAgICBpbnB1dC5zZXRDb2xvcigic2Rmc2QiKTsKLSAgICAgICAgaW5wdXQuc2V0UHJpY2UoNDUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzMihpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cnVjdFNOKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTihudWxsKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTihuZXcgUGVyc29uKCkpKTsKLQotICAgICAgICBQZXJzb24gaW5wdXQgPSBuZXcgUGVyc29uKCk7Ci0gICAgICAgIGlucHV0LnNldEFnZSgyMyk7Ci0gICAgICAgIGlucHV0LnNldElkKDM0NSk7Ci0gICAgICAgIGlucHV0LnNldE1hbGUoZmFsc2UpOwotICAgICAgICBpbnB1dC5zZXROYW1lKCJXaHk/Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTihpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEFycmF5MURTTigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXkxRFNOKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5MURTTihuZXcgQXJyYXlPZlBlcnNvbigpKSk7Ci0KLSAgICAgICAgQXJyYXlPZlBlcnNvbiBpbnB1dCA9IG5ldyBBcnJheU9mUGVyc29uKCk7Ci0gICAgICAgIFBlcnNvbiBwMSA9IG5ldyBQZXJzb24oKTsKLSAgICAgICAgcDEuc2V0QWdlKDM0KTsKLSAgICAgICAgcDEuc2V0SWQoMjM0NSk7Ci0gICAgICAgIHAxLnNldE1hbGUodHJ1ZSk7Ci0gICAgICAgIHAxLnNldE5hbWUoIkhKSEpIIik7Ci0gICAgICAgIGlucHV0LnNldFBlcnNvbihuZXcgUGVyc29uW117cDF9KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5MURTTihpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERlcml2ZWRDbGFzcygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXREZXJpdmVkQ2xhc3MobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzKG5ldyBGdXJuaXR1cmUoKSkpOwotCi0gICAgICAgIEZ1cm5pdHVyZSBpbnB1dCA9IG5ldyBGdXJuaXR1cmUoKTsKLSAgICAgICAgaW5wdXQuc2V0Q29sb3IoIndoaXRlIik7Ci0gICAgICAgIGlucHV0LnNldFByaWNlKDY3KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldERlcml2ZWRDbGFzcyhpbnB1dCkpOwotICAgICAgICBhc3NlcnRUcnVlKGlucHV0IGluc3RhbmNlb2YgRnVybml0dXJlKTsKLQotICAgICAgICBpbnB1dCA9IG5ldyBUYWJsZSgpOwotICAgICAgICBpbnB1dC5zZXRDb2xvcigiYmxhY2siKTsKLSAgICAgICAgaW5wdXQuc2V0UHJpY2UoODkpOwotICAgICAgICAoKFRhYmxlKSBpbnB1dCkuc2V0U2VhdGluZ0NhcGFjaXR5KDEwMCk7Ci0gICAgICAgIGFzc2VydFRydWUoaW5wdXQgaW5zdGFuY2VvZiBUYWJsZSk7Ci0gICAgfQotCi0vLyBUT0RPOiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRlYWwgd2l0aCBFTlVNJ3MuIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzZWN0aW9uLiAgICAKLS8vICAgIC8qKgotLy8gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLS8vICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRFbnVtSW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0KLSAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEVudW1JbnQobnVsbCkpOwotICAgICAgICBTdHJpbmcgaW5wdXQgPSAiIjsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEVudW1JbnQobmV3IFN0cmluZygpKSk7Ci0gICAgfQotCi0vLyBUT0RPOiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRlYWwgd2l0aCBFTlVNJ3MuIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBzZWN0aW9uLgotLy8gICAgLyoqCi0vLyAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotLy8gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RW51bVN0cmluZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vCi0vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViIHN0dWIgPQotLy8gICAgICAgICAgICAgICAgbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YigpOwotLy8KLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RW51bVN0cmluZyhudWxsKSk7Ci0vLyAgICAgICAgQml0TWFzayBpbnB1dCA9IG5ldyBCaXRNYXNrKCk7Ci0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEVudW1TdHJpbmcobmV3IEJpdE1hc2soKSkpOwotLy8gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTdHJ1Y3RTMSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0U3RydWN0UzEobnVsbCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0UzEobmV3IE5hbWUoKSkpOwotICAgICAgICBOYW1lIGlucHV0ID0gbmV3IE5hbWUoKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgiZXdydGVydHkiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFMxKGlucHV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlTdHJpbmcxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheVN0cmluZzFEKG51bGwpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5U3RyaW5nMUQobmV3IEFycmF5T2ZzdHJpbmcoKSkpOwotICAgICAgICBBcnJheU9mc3RyaW5nIGlucHV0ID0gbmV3IEFycmF5T2ZzdHJpbmcoKTsKLSAgICAgICAgaW5wdXQuc2V0U3RyaW5nKG5ldyBTdHJpbmdbXXsiZm9vIiwgImJhciJ9KTsKLSAgICAgICAgQXJyYXlPZnN0cmluZyByZXQgPSBzdHViLnJldEFycmF5U3RyaW5nMUQoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0LmdldFN0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldC5nZXRTdHJpbmcoKS5sZW5ndGgsIDIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U2luZ2xlKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBmbG9hdCByZXQgPSBzdHViLnJldFNpbmdsZSg0My4wZik7Ci0gICAgICAgIGFzc2VydFRydWUocmV0PT00My4wZik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHp1bHUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RGF0ZVRpbWUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIHp1bHUuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgQ2FsZW5kYXIgaW5wdXQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBDYWxlbmRhciByZXQgPSBzdHViLnJldERhdGVUaW1lKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoenVsdS5mb3JtYXQoaW5wdXQuZ2V0VGltZSgpKSwgenVsdS5mb3JtYXQocmV0LmdldFRpbWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEd1aWQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGlucHV0ID0gIjEyMzQ1IjsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN0dWIucmV0R3VpZChpbnB1dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXQsIGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRCeXRlQXJyYXkoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBieXRlW10gaW5wdXQgPSBuZXcgYnl0ZVtdeyhieXRlKSAweERFLCAoYnl0ZSkgMHhBRCwgKGJ5dGUpIDB4QkUsIChieXRlKSAweEVGfTsKLSAgICAgICAgRGF0YUhhbmRsZXIgcmV0ID0gc3R1Yi5yZXRCeXRlQXJyYXkobmV3IERhdGFIYW5kbGVyKG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKGlucHV0KSkpOwotICAgICAgICBieXRlW10gYnl0ZXMgPSBJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KHJldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ5dGVzLCBpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVyaSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRVcmkoIjEyNCIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRRTmFtZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIC8vRklYTUU6IFdoeSBpcyBRTmFtZSBiZWluZyBtYXBwZWQgdG8gT01FbGVtZW50PwotICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0UU5hbWUobnVsbCkpOwotICAgIH0KLQotLy8gVE9ETzogRklYTUU6IE5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gZW51bSdzLiBQbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgZm9sbG93aW5nIHNlY3Rpb24KLS8vICAgIC8qKgotLy8gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLS8vICAgICAqLwotLy8gICAgcHVibGljIHZvaWQgdGVzdHJldEVudW1JbnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0vLwotLy8gICAgICAgIG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YiBzdHViID0KLS8vICAgICAgICAgICAgICAgIG5ldyBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC5Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVBvcnRfaHR0cFN0dWIoKTsKLS8vCi0vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1JbnQgcmV0RW51bUludDEyNiA9Ci0vLyAgICAgICAgICAgICAgICAob3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1JbnQpIGdldFRlc3RPYmplY3Qob3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1JbnQuY2xhc3MpOwotLy8gICAgICAgIC8vIHRvZG8gRmlsbCBpbiB0aGUgcmV0RW51bUludDEyNiBoZXJlCi0vLwotLy8gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRFbnVtSW50KAotLy8gICAgICAgICAgICAgICAgZ2V0UGFyYW0wKHJldEVudW1JbnQxMjYpCi0vLyAgICAgICAgKSk7Ci0vLwotLy8KLS8vICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRMb25nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBsb25nIHJldCA9IHN0dWIucmV0TG9uZygzNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRVU2hvcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXQgPSBzdHViLnJldFVTaG9ydCgzNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRVSW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBsb25nIHJldCA9IHN0dWIucmV0VUludCgzNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRCeXRlKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBzaG9ydCByZXQgPSBzdHViLnJldEJ5dGUoKHNob3J0KTM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTQnl0ZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZSByZXQgPSBzdHViLnJldFNCeXRlKChieXRlKTM0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChieXRlKTM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFNob3J0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBzaG9ydCByZXQgPSBzdHViLnJldFNob3J0KChzaG9ydCkzNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygoc2hvcnQpMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0T2JqZWN0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIC8vIGxldHMgY3JlYXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IG9mIHRoZSBBcnRpY2xlIGVsZW1lbnQKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vd3d3LnNlcnZlcnNpZGUuY29tL2FydGljbGVzL2ludHJvZHVjaW5nQXhpb20iLCAiYXJ0aWNsZSIpOwotICAgICAgICAvLyBub3cgY3JlYXRlIHRoZSBBcnRpY2xlIGVsZW1lbnQgd2l0aCB0aGUgYWJvdmUgbmFtZXNwYWNlCi0gICAgICAgIE9NRWxlbWVudCBhcnRpY2xlRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJBcnRpY2xlIiwgbnMpOwotCi0gICAgICAgIC8vIGNvbW1lbnQgb3V0IHRoaXMgdGVzdCBjYXNlIHNpbmNlIGFkYiBub3cgdXNlcyBhbiBvYmplY3QgdG8gcmVwcmVzZW50cyB0aGUgYW55IHR5cGUKLSAgICAgICAgLy8gT01FbGVtZW50IHJldCA9IHN0dWIucmV0T2JqZWN0KGFydGljbGVFbGVtZW50KTsKLSAgICAgICAgLy8gYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICAvLyBhc3NlcnRFcXVhbHMocmV0LnRvU3RyaW5nKCksIGFydGljbGVFbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEZsb2F0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGZsb2F0IHJldCA9IHN0dWIucmV0RmxvYXQoKGZsb2F0KTM0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXQ9PTM0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXREb3VibGUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZG91YmxlIHJldCA9IHN0dWIucmV0RG91YmxlKChkb3VibGUpMzQpOwotICAgICAgICBhc3NlcnRUcnVlKHJldD09MzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEJvb2woKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiByZXQgPSBzdHViLnJldEJvb2wodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXREZWNpbWFsKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIEJpZ0RlY2ltYWwgaW5wdXQgPSBuZXcgQmlnRGVjaW1hbCgxMjMzNCk7Ci0gICAgICAgIEJpZ0RlY2ltYWwgcmV0ID0gc3R1Yi5yZXREZWNpbWFsKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0LCBpbnB1dCk7Ci0gICAgfQotCi0vLyBUT0RPOiBGSVhNRTogTmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkbyBlbnVtJ3MuIFBsZWFzZSBkb24ndCByZW1vdmUgdGhpcyBmb2xsb3dpbmcgc2VjdGlvbgotLy8gICAgLyoqCi0vLyAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotLy8gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RW51bVN0cmluZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vCi0vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QuQ29tcGxleERhdGFUeXBlc0NvbXBsZXhEYXRhVHlwZXNTT0FQMTFQb3J0X2h0dHBTdHViIHN0dWIgPQotLy8gICAgICAgICAgICAgICAgbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YigpOwotLy8KLS8vICAgICAgICBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bVN0cmluZyByZXRFbnVtU3RyaW5nMTk4ID0KLS8vICAgICAgICAgICAgICAgIChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bVN0cmluZykgZ2V0VGVzdE9iamVjdChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bVN0cmluZy5jbGFzcyk7Ci0vLyAgICAgICAgLy8gdG9kbyBGaWxsIGluIHRoZSByZXRFbnVtU3RyaW5nMTk4IGhlcmUKLS8vCi0vLyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEVudW1TdHJpbmcoCi0vLyAgICAgICAgICAgICAgICBnZXRQYXJhbTAocmV0RW51bVN0cmluZzE5OCkKLS8vICAgICAgICApKTsKLS8vCi0vLwotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0SW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBpbnQgcmV0ID0gc3R1Yi5yZXRJbnQoKGludCkzNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygoaW50KTM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEludHMoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW50W10gaW5wdXQgPSBuZXcgaW50W117MzQsIDQ1fTsKLSAgICAgICAgaW50IHJldFtdID0gc3R1Yi5yZXRJbnRzKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGlucHV0LCByZXQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRDaGFyKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGludCByZXQgPSBzdHViLnJldENoYXIoMzQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RyaW5nKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbnB1dCA9ICJBYnJhY2FkYWJyYSI7Ci0gICAgICAgIFN0cmluZyByZXQgPSBzdHViLnJldFN0cmluZyhpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cmluZ3MoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLVN0cmluZ1tdIHJldDsKLSAgICAgICAgU3RyaW5nW10gaW5wdXQgPSBuZXcgU3RyaW5nW117IkFicmFjYWRhYnJhIn07Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXQpOwotICAgICAgICByZXQgPSBzdHViLnJldFN0cmluZ3MoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhpbnB1dCwgcmV0KSk7Ci0gICAgICAgIGlucHV0ID0gbmV3IFN0cmluZ1tdeyJBYnJhY2FkYWJyYSIsIG51bGwsICJhYmMifTsKLSAgICAgICAgcmV0ID0gc3R1Yi5yZXRTdHJpbmdzKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoaW5wdXQsIHJldCkpOwotCi0gICAgICAgIGlucHV0ID0gbmV3IFN0cmluZ1tde307Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhpbnB1dCk7Ci0gICAgICAgIGFzc2VydE51bGwocmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRVTG9uZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBCaWdJbnRlZ2VyIGlucHV0ID0gbmV3IEJpZ0ludGVnZXIoIjM0Iik7Ci0gICAgICAgIEJpZ0ludGVnZXIgcmV0ID0gc3R1Yi5yZXRVTG9uZyhpbnB1dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnB1dCwgcmV0KTsKLSAgICB9Ci19Ci0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JwYy9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzU0ZmFlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ycGMvY29tcGxleC9Db21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucnBjLmNvbXBsZXg7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1YjsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLS8qCi0gKiAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVUZXN0IEp1bml0IHRlc3QgY2FzZQotKi8KLQotcHVibGljIGNsYXNzIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdCBleHRlbmRzCi0gICAgICAgIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUiKTsKLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb247Ci0gICAgcHJvdGVjdGVkIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUjsKLSAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIgc3R1YjsKLQotICAgIHB1YmxpYyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVRlc3QuY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0YXJnZXRFUFIgPQotICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMToiCi0gICAgICAgICAgICAgICAgICAgICAgICArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgKyA4MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUiKTsKLSAgICAgICAgc3R1YiA9IG5ldyBvcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1YihudWxsLCB0YXJnZXRFUFIuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJvcmcudGVtcHVyaS5jb21wbGV4LkNvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlIjsKLSAgICAgICAgVXRpbFNlcnZlci5zdGFydCgpOwotICAgICAgICBQYXJhbWV0ZXIgZ2VuZXJhdGVCYXJlID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBnZW5lcmF0ZUJhcmUuc2V0TmFtZShKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFX1BBUkFNRVRFUik7Ci0gICAgICAgIGdlbmVyYXRlQmFyZS5zZXRWYWx1ZSgidHJ1ZSIpOwotICAgICAgICBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRQYXJhbWV0ZXIoZ2VuZXJhdGVCYXJlKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lLCBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKGdlbmVyYXRlQmFyZSk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0TmFtZSgiQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUiKTsKLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlJbnQxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlJbnQxRChudWxsKSk7Ci0gICAgICAgIHN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5jbGVhbnVwVHJhbnNwb3J0KCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5SW50MUQgcmVxID0gbmV3Ci0gICAgICAgICAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlJbnQxRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlJbnQxRChyZXEpKTsKLSAgICAgICAgc3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZpbnQgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZpbnQoKTsKLSAgICAgICAgaW5wdXQuc2V0X2ludChuZXcgaW50W117MCwgMSwgMn0pOwotICAgICAgICByZXEuc2V0SW5BcnJheUludDFEKGlucHV0KTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlJldEFycmF5SW50MURSZXN1bHQgcmV0ID0gc3R1Yi5yZXRBcnJheUludDFEKHJlcSk7Ci0gICAgICAgIHN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5jbGVhbnVwVHJhbnNwb3J0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQuZ2V0UmV0QXJyYXlJbnQxRFJlc3VsdCgpLmdldF9pbnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXQuZ2V0UmV0QXJyYXlJbnQxRFJlc3VsdCgpLmdldF9pbnQoKS5sZW5ndGgsIDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cnVjdFNOU0FTKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gQ29kZWdlbiBpc3N1ZQotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBUyhudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cnVjdFNOU0FTIHJlcSA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cnVjdFNOU0FTKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBUyhyZXEpKTsKLQotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuR3JvdXAgaW5wdXQgPQotICAgICAgICAgICAgICAgIG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuR3JvdXAoKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgieHl6Iik7Ci0gICAgICAgIGlucHV0LnNldE1lbWJlcnMobmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mUGVyc29uKCkpOwotICAgICAgICByZXEuc2V0SW5TdHJ1Y3RTTlNBUyhpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBUyhyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheURhdGVUaW1lMUQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETyAsIHRoaXMgaXMgYSBjb2RlZ2VuIGJ1ZwotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheURhdGVUaW1lMUQobnVsbCkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5BcnJheURhdGVUaW1lMUQgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5RGF0ZVRpbWUxRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlEYXRlVGltZTFEKHJlcSkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSBpbnB1dCA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSgpOwotICAgICAgICBpbnB1dC5zZXREYXRlVGltZShuZXcgQ2FsZW5kYXJbXXtDYWxlbmRhci5nZXRJbnN0YW5jZSgpLCBDYWxlbmRhci5nZXRJbnN0YW5jZSgpfSk7Ci0gICAgICAgIHJlcS5zZXRJbkFycmF5RGF0ZVRpbWUxRChpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheURhdGVUaW1lMUQocmVxKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlTdHJpbmcyRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPIGNvZGVnZW4gaXNzdWUKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcyRChudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5U3RyaW5nMkQgcmVxID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlTdHJpbmcyRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcyRChyZXEpKTsKLQotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZkFycmF5T2ZzdHJpbmcgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZBcnJheU9mc3RyaW5nKCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nIGEyID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nKCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nIGExID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nKCk7Ci0gICAgICAgIGExLnNldFN0cmluZyhuZXcgU3RyaW5nW117ImZvbyIsICJiYXIifSk7Ci0gICAgICAgIGlucHV0LnNldEFycmF5T2ZzdHJpbmcobmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nW117YTEsIGEyfSk7Ci0gICAgICAgIHJlcS5zZXRJbkFycmF5U3RyaW5nMkQoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcyRChyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRBcnJheURlY2ltYWwxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRBcnJheURlY2ltYWwxRChudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5RGVjaW1hbDFEIHJlcSA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5RGVjaW1hbDFEKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheURlY2ltYWwxRChyZXEpKTsKLQotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsIGlucHV0ID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mTnVsbGFibGVPZmRlY2ltYWwoKTsKLSAgICAgICAgaW5wdXQuc2V0RGVjaW1hbChuZXcgQmlnRGVjaW1hbFtde25ldyBCaWdEZWNpbWFsKDEpLCBuZXcgQmlnRGVjaW1hbCgyKX0pOwotICAgICAgICByZXEuc2V0SW5BcnJheURlY2ltYWwxRChpbnB1dCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRBcnJheURlY2ltYWwxRChyZXEpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRTdHJ1Y3RTTlNBKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFN0cnVjdFNOU0EobnVsbCkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TdHJ1Y3RTTlNBIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TdHJ1Y3RTTlNBKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTlNBKHJlcSkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuRW1wbG95ZWUgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkVtcGxveWVlKCk7Ci0gICAgICAgIGlucHV0LnNldEpvYklEKDM0KTsKLSAgICAgICAgaW5wdXQuc2V0QmFzZURldGFpbHMobmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5QZXJzb24oKSk7Ci0gICAgICAgIGlucHV0LnNldE51bWJlcnMobmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc2hvcnQoKSk7Ci0gICAgICAgIGlucHV0LnNldEhpcmVEYXRlKENhbGVuZGFyLmdldEluc3RhbmNlKCkpOwotICAgICAgICByZXEuc2V0SW5TdHJ1Y3RTTlNBKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldFN0cnVjdFNOU0EocmVxKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlBbnlUeXBlMUQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlBbnlUeXBlMUQobnVsbCkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5BcnJheUFueVR5cGUxRCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQXJyYXlBbnlUeXBlMUQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5QW55VHlwZTFEKHJlcSkpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuQXJyYXlPZmFueVR5cGUgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkFycmF5T2ZhbnlUeXBlKCk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgLy8gbGV0cyBjcmVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3Qgb2YgdGhlIEFydGljbGUgZWxlbWVudAotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L3dzLWF4aXMyc29hcC9pbmRleC5odG1sIiwgImFydGljbGUiKTsKLSAgICAgICAgLy8gbm93IGNyZWF0ZSB0aGUgQXJ0aWNsZSBlbGVtZW50IHdpdGggdGhlIGFib3ZlIG5hbWVzcGFjZQotICAgICAgICBPTUVsZW1lbnQgYXJ0aWNsZUVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiQXJ0aWNsZSIsIG5zKTsKLQotICAgICAgICAvLyBjb21tZW50IG91dCB0aGlzIHRlc3QgY2FzZSBzaW5jZSBub3cgYWRiIHVzZXMgT2JqZWN0IHRvIHJlcHJlc2VudCBhbnkgdHlwZQotICAgICAgICAKLSAgICAgICAgLy8gaW5wdXQuc2V0QW55VHlwZShuZXcgT01FbGVtZW50W117YXJ0aWNsZUVsZW1lbnR9KTsKLSAgICAgICAgLy8gcmVxLnNldEluQXJyYXlBbnlUeXBlMUQoaW5wdXQpOwotICAgICAgICAvLyBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXlBbnlUeXBlMUQocmVxKSk7Ci0gICAgICAgIC8vVE9ET0QgOiBOZWVkIHRvIGZpeCB0aGlzICwgc2VlbXMgbGlrZSB3ZSBhcmUgbm90IGdldHRpbmcgdGhlIGNvcnJjZXQgcmVzcG9uc2UKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cnVjdFNOKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFN0cnVjdFNOKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RydWN0U04gcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cnVjdFNOKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTTihyZXEpKTsKLQotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUGVyc29uIGlucHV0ID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5QZXJzb24oKTsKLSAgICAgICAgaW5wdXQuc2V0QWdlKDIzKTsKLSAgICAgICAgaW5wdXQuc2V0SWQoMzQ1KTsKLSAgICAgICAgaW5wdXQuc2V0TWFsZShmYWxzZSk7Ci0gICAgICAgIGlucHV0LnNldE5hbWUoIldoeT8iKTsKLSAgICAgICAgcmVxLnNldEluU3RydWN0U04oaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0U04ocmVxKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXkxRFNOKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy9UT0RPIENvZGVnZW4gaXNzdWUKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXkxRFNOKG51bGwpKTsKLQotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5BcnJheTFEU04gcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5MURTTigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0QXJyYXkxRFNOKHJlcSkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mUGVyc29uIGlucHV0ID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mUGVyc29uKCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5QZXJzb24gcDEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlBlcnNvbigpOwotICAgICAgICBwMS5zZXRBZ2UoMzQpOwotICAgICAgICBwMS5zZXRJZCgyMzQ1KTsKLSAgICAgICAgcDEuc2V0TWFsZSh0cnVlKTsKLSAgICAgICAgcDEuc2V0TmFtZSgiSEpISkgiKTsKLSAgICAgICAgaW5wdXQuc2V0UGVyc29uKG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUGVyc29uW117cDF9KTsKLSAgICAgICAgcmVxLnNldEluQXJyYXkxRFNOKGlucHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5MURTTihyZXEpKTsKLSAgICAgICAgLy9UT0RPIDogTmVlZCB0byBmaXggdGhpcyAsIHdlIGFyZSBub3QgZ2V0dGluIGNvcnJjZXQgcmVwb25zZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERlcml2ZWRDbGFzcygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRGVyaXZlZENsYXNzIHJlcSA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkRlcml2ZWRDbGFzcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzKHJlcSkpOwotCi0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5GdXJuaXR1cmUgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkZ1cm5pdHVyZSgpOwotICAgICAgICBpbnB1dC5zZXRDb2xvcigid2hpdGUiKTsKLSAgICAgICAgaW5wdXQuc2V0UHJpY2UoNjcpOwotICAgICAgICByZXEuc2V0SW5EZXJpdmVkQ2xhc3MoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0RGVyaXZlZENsYXNzKHJlcSkpOwotICAgICAgICAvL1RPRE8gOiBOZWVkIHRvIGZpeCB0aGlzIHRvbwotICAgIH0KLS8vCi0vLy8vIFRPRE86IFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZGVhbCB3aXRoIEVOVU0ncy4gUGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIHNlY3Rpb24uCi0vLy8vICAgIC8qKgotLy8vLyAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotLy8vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRFbnVtSW50KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotLy8KLS8vCi0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEVudW1JbnQobnVsbCkpOwotLy8gICAgICAgIFN0cmluZyBpbnB1dCA9ICIiOwotLy8gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRFbnVtSW50KG5ldyBTdHJpbmcoKSkpOwotLy8gICAgfQotLy8KLS8vLy8gVE9ETzogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkZWFsIHdpdGggRU5VTSdzLiBQbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgc2VjdGlvbi4KLS8vLy8gICAgLyoqCi0vLy8vICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0vLy8vICAgICAqLwotLy8vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RW51bVN0cmluZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vLy8KLS8vLy8gICAgICAgIG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YiBzdHViID0KLS8vLy8gICAgICAgICAgICAgICAgbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YigpOwotLy8vLwotLy8vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldEVudW1TdHJpbmcobnVsbCkpOwotLy8vLyAgICAgICAgQml0TWFzayBpbnB1dCA9IG5ldyBCaXRNYXNrKCk7Ci0vLy8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0RW51bVN0cmluZyhuZXcgQml0TWFzaygpKSk7Ci0vLy8vICAgIH0KLS8vCi0KLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U3RydWN0UzEoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgYXNzZXJ0TnVsbChzdHViLnJldFN0cnVjdFMxKG51bGwpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RydWN0UzEgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblN0cnVjdFMxKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRTdHJ1Y3RTMShyZXEpKTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLk5hbWUgaW5wdXQgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLk5hbWUoKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgiZXdydGVydHkiKTsKLSAgICAgICAgcmVxLnNldEluU3RydWN0UzEoaW5wdXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0U3RydWN0UzEocmVxKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0QXJyYXlTdHJpbmcxRCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vICAgICAgICBhc3NlcnROdWxsKHN0dWIucmV0QXJyYXlTdHJpbmcxRChudWxsKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5U3RyaW5nMUQgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkFycmF5U3RyaW5nMUQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEFycmF5U3RyaW5nMUQocmVxKSk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nIGlucHV0ID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5BcnJheU9mc3RyaW5nKCk7Ci0gICAgICAgIGlucHV0LnNldFN0cmluZyhuZXcgU3RyaW5nW117ImZvbyIsICJiYXIifSk7Ci0gICAgICAgIHJlcS5zZXRJbkFycmF5U3RyaW5nMUQoaW5wdXQpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUmV0QXJyYXlTdHJpbmcxRFJlc3VsdCByZXQgPSBzdHViLnJldEFycmF5U3RyaW5nMUQocmVxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldC5nZXRSZXRBcnJheVN0cmluZzFEUmVzdWx0KCkuZ2V0U3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0LmdldFJldEFycmF5U3RyaW5nMURSZXN1bHQoKS5nZXRTdHJpbmcoKS5sZW5ndGgsIDIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U2luZ2xlKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TaW5nbGUgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblNpbmdsZSgpOwotICAgICAgICByZXEuc2V0SW5TaW5nbGUoNDMuMGYpOwotICAgICAgICBmbG9hdCByZXQgPSBzdHViLnJldFNpbmdsZShyZXEpLmdldFJldFNpbmdsZVJlc3VsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKHJldCA9PSA0My4wZik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IHp1bHUgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzLlNTUydaJyIpOwotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RGF0ZVRpbWUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIHp1bHUuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKTsKLSAgICAgICAgQ2FsZW5kYXIgaW5wdXQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5EYXRlVGltZSByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRGF0ZVRpbWUoKTsKLSAgICAgICAgcmVxLnNldEluRGF0ZVRpbWUoaW5wdXQpOwotICAgICAgICBDYWxlbmRhciByZXQgPSBzdHViLnJldERhdGVUaW1lKHJlcSkuZ2V0UmV0RGF0ZVRpbWVSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoenVsdS5mb3JtYXQoaW5wdXQuZ2V0VGltZSgpKSwgenVsdS5mb3JtYXQocmV0LmdldFRpbWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEd1aWQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGlucHV0ID0gIjEyMzQ1IjsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluR3VpZCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluR3VpZCgpOwotICAgICAgICByZXEuc2V0SW5HdWlkKGlucHV0KTsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN0dWIucmV0R3VpZChyZXEpLmdldFJldEd1aWRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldCwgaW5wdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEJ5dGVBcnJheSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGJ5dGVbXSBpbnB1dCA9IG5ldyBieXRlW117KGJ5dGUpIDB4REUsIChieXRlKSAweEFELCAoYnl0ZSkgMHhCRSwgKGJ5dGUpIDB4RUZ9OwotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUmV0Qnl0ZUFycmF5IHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUmV0Qnl0ZUFycmF5KCk7Ci0gICAgICAgIHJlcS5zZXRJbkJ5dGVBcnJheShuZXcgRGF0YUhhbmRsZXIobmV3IEJ5dGVBcnJheURhdGFTb3VyY2UoaW5wdXQpKSk7Ci0gICAgICAgIERhdGFIYW5kbGVyIHJldCA9IHN0dWIucmV0Qnl0ZUFycmF5KHJlcSkuZ2V0X3JldHVybigpOwotICAgICAgICBieXRlW10gYnl0ZXMgPSBJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KHJldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ5dGVzLCBpbnB1dCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFVyaSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVXJpIHJlcSA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblVyaSgpOwotICAgICAgICByZXEuc2V0SW5VcmkoIjEyNCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHN0dWIucmV0VXJpKHJlcSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0UU5hbWUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgRklYTUU6IFdoeSBpcyBRTmFtZSBiZWluZyBtYXBwZWQgdG8gT01FbGVtZW50PwotLy8gICAgICAgIGFzc2VydE51bGwoc3R1Yi5yZXRRTmFtZShudWxsKSk7Ci0vLyAgICB9Ci0KLS8vLy8gVE9ETzogRklYTUU6IE5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZG8gZW51bSdzLiBQbGVhc2UgZG9uJ3QgcmVtb3ZlIHRoaXMgZm9sbG93aW5nIHNlY3Rpb24KLS8vLy8gICAgLyoqCi0vLy8vICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0vLy8vICAgICAqLwotLy8vLyAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0RW51bUludCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLS8vLy8KLS8vLy8gICAgICAgIG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YiBzdHViID0KLS8vLy8gICAgICAgICAgICAgICAgbmV3IG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLkNvbXBsZXhEYXRhVHlwZXNDb21wbGV4RGF0YVR5cGVzU09BUDExUG9ydF9odHRwU3R1YigpOwotLy8vLwotLy8vLyAgICAgICAgb3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1JbnQgcmV0RW51bUludDEyNiA9Ci0vLy8vICAgICAgICAgICAgICAgIChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bUludCkgZ2V0VGVzdE9iamVjdChvcmcudGVtcHVyaS5jb21wbGV4LnhzZC54c2QuUmV0RW51bUludC5jbGFzcyk7Ci0vLy8vICAgICAgICAvLyB0b2RvIEZpbGwgaW4gdGhlIHJldEVudW1JbnQxMjYgaGVyZQotLy8vLwotLy8vLyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdHViLnJldEVudW1JbnQoCi0vLy8vICAgICAgICAgICAgICAgIGdldFBhcmFtMChyZXRFbnVtSW50MTI2KQotLy8vLyAgICAgICAgKSk7Ci0vLy8vCi0vLy8vCi0vLy8vICAgIH0KLS8vCi0gICAgcHVibGljIHZvaWQgdGVzdHJldExvbmcoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkxvbmcgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkxvbmcoKTsKLSAgICAgICAgcmVxLnNldEluTG9uZygzNCk7Ci0gICAgICAgIGxvbmcgcmV0ID0gc3R1Yi5yZXRMb25nKHJlcSkuZ2V0UmV0TG9uZ1Jlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLy8KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRVU2hvcnQoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblVTaG9ydCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVVNob3J0KCk7Ci0gICAgICAgIHJlcS5zZXRJblVTaG9ydCgzNCk7Ci0gICAgICAgIGludCByZXQgPSBzdHViLnJldFVTaG9ydChyZXEpLmdldFJldFVTaG9ydFJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0VUludCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVUludCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluVUludCgpOwotICAgICAgICByZXEuc2V0SW5VSW50KDM0KTsKLSAgICAgICAgbG9uZyByZXQgPSBzdHViLnJldFVJbnQocmVxKS5nZXRSZXRVSW50UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRCeXRlKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5CeXRlIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5CeXRlKCk7Ci0gICAgICAgIHJlcS5zZXRJbkJ5dGUoKHNob3J0KSAzNCk7Ci0gICAgICAgIHNob3J0IHJldCA9IHN0dWIucmV0Qnl0ZShyZXEpLmdldFJldEJ5dGVSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkgMzQsIHJldCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0U0J5dGUoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblNCeXRlIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TQnl0ZSgpOwotICAgICAgICByZXEuc2V0SW5TQnl0ZSgoYnl0ZSkgMzQpOwotICAgICAgICBieXRlIHJldCA9IHN0dWIucmV0U0J5dGUocmVxKS5nZXRSZXRTQnl0ZVJlc3VsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFNob3J0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TaG9ydCByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU2hvcnQoKTsKLSAgICAgICAgcmVxLnNldEluU2hvcnQoKHNob3J0KSAzNCk7Ci0gICAgICAgIHNob3J0IHJldCA9IHN0dWIucmV0U2hvcnQocmVxKS5nZXRSZXRTaG9ydFJlc3VsdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygoc2hvcnQpIDM0LCByZXQpOwotICAgIH0KLQotICAgIC8vCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0T2JqZWN0KCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIC8vIGxldHMgY3JlYXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IG9mIHRoZSBBcnRpY2xlIGVsZW1lbnQKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vd3d3LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvbGlicmFyeS93cy1heGlzMnNvYXAvaW5kZXguaHRtbCIsICJhcnRpY2xlIik7Ci0gICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIEFydGljbGUgZWxlbWVudCB3aXRoIHRoZSBhYm92ZSBuYW1lc3BhY2UKLSAgICAgICAgT01FbGVtZW50IGFydGljbGVFbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIkFydGljbGUiLCBucyk7Ci0KLSAgICAgICAgLy8gcmVwcmVzZW50aW5nIHRoZSBhbnkgdHlwZSB3aXRoIGEgT01FbGVtZW50IGlzIHdyb25nLiBpdCBzaG91bGQgYmUgYW4gT2JqZWN0Ci0gICAgICAgIC8vIGFkYiBoYXMgZml4ZWQgdGhpcyBub3cgY29tbWVudCB0aGlzIHRlc3QgdG8gZml4IHRoaXMgZm9yIGphdmEyd3NkbCBhcyB3ZWxsCi0KLSAgICAgICAgLy8gQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluT2JqZWN0IHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5PYmplY3QoKTsKLSAgICAgICAgLy8gcmVxLnNldEluT2JqZWN0KGFydGljbGVFbGVtZW50KTsKLSAgICAgICAgLy8gT01FbGVtZW50IHJldCA9IHN0dWIucmV0T2JqZWN0KHJlcSkuZ2V0UmV0T2JqZWN0UmVzdWx0KCk7Ci0gICAgICAgIC8vIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKHJldC50b1N0cmluZygpLCBhcnRpY2xlRWxlbWVudC50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRGbG9hdCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRmxvYXQgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkZsb2F0KCk7Ci0gICAgICAgIHJlcS5zZXRJbkZsb2F0KChmbG9hdCkgMzQpOwotICAgICAgICBmbG9hdCByZXQgPSBzdHViLnJldEZsb2F0KHJlcSkuZ2V0UmV0RmxvYXRSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXQgPT0gMzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldERvdWJsZSgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluRG91YmxlIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5Eb3VibGUoKTsKLSAgICAgICAgcmVxLnNldEluRG91YmxlKDM0KTsKLSAgICAgICAgZG91YmxlIHJldCA9IHN0dWIucmV0RG91YmxlKHJlcSkuZ2V0UmV0RG91YmxlUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0ID09IDM0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRCb29sKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5Cb29sIHJlcSA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkJvb2woKTsKLSAgICAgICAgcmVxLnNldEluQm9vbCh0cnVlKTsKLSAgICAgICAgYm9vbGVhbiByZXQgPSBzdHViLnJldEJvb2wocmVxKS5nZXRSZXRCb29sUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXREZWNpbWFsKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIEJpZ0RlY2ltYWwgaW5wdXQgPSBuZXcgQmlnRGVjaW1hbCgxMjMzNCk7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkRlY2ltYWwgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JbkRlY2ltYWwoKTsKLSAgICAgICAgcmVxLnNldEluRGVjaW1hbChpbnB1dCk7Ci0gICAgICAgIEJpZ0RlY2ltYWwgcmV0ID0gc3R1Yi5yZXREZWNpbWFsKHJlcSkuZ2V0UmV0RGVjaW1hbFJlc3VsdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXQsIGlucHV0KTsKLSAgICB9Ci0KLS8vIFRPRE86IEZJWE1FOiBOZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvIGVudW0ncy4gUGxlYXNlIGRvbid0IHJlbW92ZSB0aGlzIGZvbGxvd2luZyBzZWN0aW9uCi0vLy8vICAgIC8qKgotLy8vLyAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotLy8vLyAgICAgKi8KLS8vLy8gICAgcHVibGljIHZvaWQgdGVzdHJldEVudW1TdHJpbmcoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0vLy8vCi0vLy8vICAgICAgICBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC5Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVBvcnRfaHR0cFN0dWIgc3R1YiA9Ci0vLy8vICAgICAgICAgICAgICAgIG5ldyBvcmcudGVtcHVyaS5jb21wbGV4LnhzZC5Db21wbGV4RGF0YVR5cGVzQ29tcGxleERhdGFUeXBlc1NPQVAxMVBvcnRfaHR0cFN0dWIoKTsKLS8vLy8KLS8vLy8gICAgICAgIG9yZy50ZW1wdXJpLmNvbXBsZXgueHNkLnhzZC5SZXRFbnVtU3RyaW5nIHJldEVudW1TdHJpbmcxOTggPQotLy8vLyAgICAgICAgICAgICAgICAob3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1TdHJpbmcpIGdldFRlc3RPYmplY3Qob3JnLnRlbXB1cmkuY29tcGxleC54c2QueHNkLlJldEVudW1TdHJpbmcuY2xhc3MpOwotLy8vLyAgICAgICAgLy8gdG9kbyBGaWxsIGluIHRoZSByZXRFbnVtU3RyaW5nMTk4IGhlcmUKLS8vLy8KLS8vLy8gICAgICAgIGFzc2VydE5vdE51bGwoc3R1Yi5yZXRFbnVtU3RyaW5nKAotLy8vLyAgICAgICAgICAgICAgICBnZXRQYXJhbTAocmV0RW51bVN0cmluZzE5OCkKLS8vLy8gICAgICAgICkpOwotLy8vLwotLy8vLwotLy8vLyAgICB9Ci0KLSAgICAvLwotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldEludCgpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluSW50IHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5JbnQoKTsKLSAgICAgICAgcmVxLnNldEluSW50KDM0KTsKLSAgICAgICAgaW50IHJldCA9IHN0dWIucmV0SW50KHJlcSkuZ2V0UmV0SW50UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygoaW50KSAzNCwgcmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRJbnRzKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotCi0gICAgICAgIGludFtdIGlucHV0ID0gbmV3IGludFtdezM0LCA0NX07Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5SZXRJbnRzIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuUmV0SW50cygpOwotICAgICAgICByZXEuc2V0SW5JbnQoaW5wdXQpOwotICAgICAgICBpbnQgcmV0W10gPSBzdHViLnJldEludHMocmVxKS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhpbnB1dCwgcmV0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXV0byBnZW5lcmF0ZWQgdGVzdCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0cmV0Q2hhcigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQ2hhciByZXEgPSBuZXcgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluQ2hhcigpOwotICAgICAgICByZXEuc2V0SW5DaGFyKDM0KTsKLSAgICAgICAgaW50IHJldCA9IHN0dWIucmV0Q2hhcihyZXEpLmdldFJldENoYXJSZXN1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDM0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cmluZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGlucHV0ID0gIkFicmFjYWRhYnJhIjsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLkluU3RyaW5nIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5TdHJpbmcoKTsKLSAgICAgICAgcmVxLnNldEluU3RyaW5nKGlucHV0KTsKLSAgICAgICAgU3RyaW5nIHJldCA9IHN0dWIucmV0U3RyaW5nKHJlcSkuZ2V0UmV0U3RyaW5nUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LCByZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEF1dG8gZ2VuZXJhdGVkIHRlc3QgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdHJldFN0cmluZ3MoKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nW10gcmV0OwotICAgICAgICBTdHJpbmdbXSBpbnB1dCA9IG5ldyBTdHJpbmdbXXsiQWJyYWNhZGFicmEifTsKLSAgICAgICAgQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmVTdHViLlJldFN0cmluZ3MgcmVxID0gbmV3IENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5SZXRTdHJpbmdzKCk7Ci0gICAgICAgIHJlcS5zZXRJblN0cmluZyhpbnB1dCk7Ci0gICAgICAgIHJldCA9IHN0dWIucmV0U3RyaW5ncyhyZXEpLmdldF9yZXR1cm4oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQpOwotICAgICAgICByZXQgPSBzdHViLnJldFN0cmluZ3MocmVxKS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGlucHV0LCByZXQpKTsKLSAgICAgICAgaW5wdXQgPSBuZXcgU3RyaW5nW117IkFicmFjYWRhYnJhIiwgbnVsbCwgImFiYyJ9OwotICAgICAgICByZXEuc2V0SW5TdHJpbmcoaW5wdXQpOwotICAgICAgICByZXQgPSBzdHViLnJldFN0cmluZ3MocmVxKS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGlucHV0LCByZXQpKTsKLQotICAgICAgICBpbnB1dCA9IG5ldyBTdHJpbmdbXXt9OwotICAgICAgICByZXEuc2V0SW5TdHJpbmcoaW5wdXQpOwotICAgICAgICByZXQgPSBzdHViLnJldFN0cmluZ3MocmVxKS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIGFzc2VydE51bGwocmV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCB0ZXN0IG1ldGhvZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RyZXRVTG9uZygpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQotICAgICAgICBCaWdJbnRlZ2VyIGlucHV0ID0gbmV3IEJpZ0ludGVnZXIoIjM0Iik7Ci0gICAgICAgIENvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlU3R1Yi5JblVMb25nIHJlcSA9IG5ldyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZVN0dWIuSW5VTG9uZygpOwotICAgICAgICByZXEuc2V0SW5VTG9uZyhpbnB1dCk7Ci0gICAgICAgIEJpZ0ludGVnZXIgcmV0ID0gc3R1Yi5yZXRVTG9uZyhyZXEpLmdldFJldFVMb25nUmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnB1dCwgcmV0KTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9NeUJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zcHJpbmcvTXlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmVkMWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9NeUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zcHJpbmc7Ci0KLS8qKiBJbnRlcmZhY2UgZm9yIFNwcmluZyBhd2FyZSBCZWFuICovCi1wdWJsaWMgaW50ZXJmYWNlIE15QmVhbiB7Ci0gICAgU3RyaW5nIGVtZXJnZSgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9NeUJlYW5JbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL015QmVhbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJkZjZiYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3ByaW5nL015QmVhbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zcHJpbmc7Ci0KLS8qKiBTcHJpbmcgd2lyZWQgaW1wbGVtZW50YXRpb24gKi8KLXB1YmxpYyBjbGFzcyBNeUJlYW5JbXBsIGltcGxlbWVudHMgTXlCZWFuIHsKLQotICAgIFN0cmluZyBzdHIgPSBudWxsOwotCi0gICAgLy8gc3ByaW5nICdpbmplY3RzJyB0aGlzIHZhbHVlCi0gICAgcHVibGljIHZvaWQgc2V0VmFsKFN0cmluZyBzKSB7Ci0gICAgICAgIHN0ciA9IHM7Ci0gICAgfQotCi0gICAgLy8gd2ViIHNlcnZpY2UgZ2V0cyB0aGlzIHZhbHVlCi0gICAgcHVibGljIFN0cmluZyBlbWVyZ2UoKSB7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9TcHJpbmdBd2FyZVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zcHJpbmcvU3ByaW5nQXdhcmVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTZkOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9TcHJpbmdBd2FyZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zcHJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdBd2FyZVNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBNeUJlYW4gbXlCZWFuID0gbnVsbDsKLQotICAgIC8vc3ByaW5nICdpbmplY3RzJyB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgcHVibGljIHZvaWQgc2V0TXlCZWFuKE15QmVhbiBteUJlYW4pIHsKLSAgICAgICAgdGhpcy5teUJlYW4gPSBteUJlYW47Ci0gICAgfQotCi0gICAgLy8gVGhlIHdlYiBzZXJ2aWNlCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRWYWx1ZShPTUVsZW1lbnQgaWdub3JlKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgcGF5bG9hZE5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NwcmluZ0V4YW1wbGUub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0KLSAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgic3RyaW5nIiwgcGF5bG9hZE5zKTsKLSAgICAgICAgT01UZXh0IHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVPTVRleHQodGhpcy5teUJlYW4uZW1lcmdlKCkpOwotICAgICAgICBwYXlsb2FkLmFkZENoaWxkKHJlc3BvbnNlKTsKLSAgICAgICAgcmV0dXJuIHBheWxvYWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9TcHJpbmdTZXJ2aWNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NwcmluZy9TcHJpbmdTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjcyOGFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zcHJpbmcvU3ByaW5nU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc3ByaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdTZXJ2aWNlVGVzdCBleHRlbmRzIFV0aWxTZXJ2ZXJCYXNlZFRlc3RDYXNlIHsKLQotICAgIHByb3RlY3RlZCBRTmFtZSB0cmFuc3BvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vc3ByaW5nRXhhbXBsZS5vcmcvZXhhbXBsZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdWxsVHJhbnNwb3J0Iik7Ci0gICAgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIChVdGlsU2VydmVyLlRFU1RJTkdfUE9SVCkKLS8vICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArIDU1NTYKLSAgICAgICAgICAgICAgICAgICAgLy8gICsgIi9heGlzMi9zZXJ2aWNlcy9FY2hvWE1MU2VydmljZS9lY2hvT01FbGVtZW50Iik7Ci0gICAgICAgICAgICAgICAgICAgICsgIi9heGlzMi9zZXJ2aWNlcy9TcHJpbmdFeGFtcGxlL2dldFZhbHVlIik7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZW5naW5lUmVnaXN0cnk7Ci0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IG1jOwotICAgIHByb3RlY3RlZCBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2Ugc2VydmljZTsKLSAgICBwcml2YXRlIFFOYW1lIHNwcmluZ1NlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJTcHJpbmdFeGFtcGxlIik7Ci0KLSAgICBwcml2YXRlIFFOYW1lIHNwcmluZ09wZXJhdGlvbk5hbWUgPSBuZXcgUU5hbWUoImdldFZhbHVlIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTcHJpbmdTZXJ2aWNlVGVzdC5jbGFzcykpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgICAgICAgICAgY3JlYXRlU3ByaW5nU2VydmljZShzcHJpbmdTZXJ2aWNlTmFtZSwgbmV3IFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwcmluZ0F3YXJlU2VydmljZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbmdPcGVyYXRpb25OYW1lKTsKLSAgICAgICAgY3JlYXRlU3ByaW5nQXBwQ3R4KHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzcHJpbmdTZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgLy8gQ2FuJ3QgdGVzdCBTcHJpbmdTZXJ2bGV0Q29udGV4dFN1cHBsaWVyIEFGQUlLIGN1eiBub3Qgc3VyZSBob3cgdG8gZ2V0IFNlcnZsZXRDb250ZXh0Ci0gICAgLy8gd2l0aCB0aGlzIHRlc3QgaGFybmVzcy4gVGhlIGlkZWEgaGVyZSB0aGVuIGlzIHRvIHRlc3QgdGhlIGJhc2ljIGlkZWEgd2l0aCB0aGUgCi0gICAgLy8gYWx0ZXJuYXRpdmUgbWV0aG9kLCBTcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllciwgd2hvc2UgcHVycG9zZSBpcyB0bwotICAgIC8vIHJ1biBpbiBhIG5vbi1zZXJ2bGV0IGNvbnRhaW5lciBlbnZpcm9ubWVudAotICAgIHB1YmxpYyB2b2lkIHRlc3RTcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllcigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEF4aXNTZXJ2aWNlIGNsaWVudFNlcnZpY2UgPQotICAgICAgICAgICAgICAgIGNyZWF0ZVNwcmluZ1NlcnZpY2Vmb3JDbGllbnQoc3ByaW5nU2VydmljZU5hbWUsIG5ldyBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLlNwcmluZ0FwcENvbnRleHRBd2FyZU9iamVjdFN1cHBsaWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcHJpbmdBd2FyZVNlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW5nT3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2NvbnRleHQgPSBVdGlsU2VydmVyLmNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnY29udGV4dCwgY2xpZW50U2VydmljZSk7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zcHJpbmdFeGFtcGxlLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOwotCi0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiZ2V0VmFsdWUiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIlRleHQiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjdG9yeS5jcmVhdGVPTVRleHQodmFsdWUsICJUZXN0IFN0cmluZyAiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oc3ByaW5nT3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUoc3ByaW5nT3BlcmF0aW9uTmFtZSwgbWV0aG9kKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICByZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSk7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBTdHJpbmcgdGVzdFN0ciA9IHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAvLyB3cml0ZSB0byByZXBvcnQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RTcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllciByZXN1bHQ6ICIgKyB0ZXN0U3RyKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShuZXcgSW50ZWdlcih0ZXN0U3RyLmluZGV4T2YoImVtZXJnZSB0aHlzZWxmIikpLCBuZXcgSW50ZWdlcigtMSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgY3JlYXRlU3ByaW5nU2VydmljZShRTmFtZSBzcHJpbmdTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciwgU3RyaW5nIHN1cHBsaWVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJlYW5OYW1lLCBRTmFtZSBvcE5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc3ByaW5nU2VydmljZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfT0JKRUNUX1NVUFBMSUVSLCBzdXBwbGllck5hbWUpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9UQ0NMLCBDb25zdGFudHMuVENDTF9DT01QT1NJVEUpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBTcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllci5TRVJWSUNFX1NQUklOR19CRUFOTkFNRSwgYmVhbk5hbWUpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BOYW1lKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX1JQQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgY3JlYXRlU3ByaW5nU2VydmljZWZvckNsaWVudChRTmFtZSBzcHJpbmdTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBwbGllck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJlYW5OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNwcmluZ1NlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX09CSkVDVF9TVVBQTElFUiwgc3VwcGxpZXJOYW1lKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfVENDTCwgQ29uc3RhbnRzLlRDQ0xfQ09NUE9TSVRFKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIuU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUsIGJlYW5OYW1lKSk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKG9wTmFtZSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNwcmluZ0FwcEN0eChDbGFzc0xvYWRlciBjbCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIENsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dCBjdHggPSBuZXcgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICIvc3ByaW5nL2FwcGxpY2F0aW9uQ29udGV4dC54bWwiIH0sIGZhbHNlKTsKLSAgICAgICAgY3R4LnNldENsYXNzTG9hZGVyKGNsKTsKLSAgICAgICAgY3R4LnJlZnJlc2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FGaWxlQ2FjaGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FGaWxlQ2FjaGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRhNzRiYWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9FY2hvUmF3U3dBRmlsZUNhY2hlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnN3YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd1N3QUZpbGVDYWNoZVRlc3QgZXh0ZW5kcyBFY2hvUmF3U3dBVGVzdCB7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLQotICAgIHB1YmxpYyBFY2hvUmF3U3dBRmlsZUNhY2hlVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1N3QUZpbGVDYWNoZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1N3QUZpbGVDYWNoZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd1N3QUZpbGVDYWNoZVRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIlN3QS1maWxlQ2FjaGUtZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2Uoc2VydmljZU5hbWUsIEVjaG9Td0EuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvWE1MQVN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBzdXBlci50ZXN0RWNob1hNTEFTeW5jKCk7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIudGVzdEVjaG9YTUxTeW5jKCk7Ci0gICAgfQotCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmNTZXBlcmF0ZUxpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgc3VwZXIudGVzdEVjaG9YTUxTeW5jU2VwZXJhdGVMaXN0ZW5lcigpOwotLy8gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9FY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9FY2hvUmF3U3dBRmlsZUlucHV0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2JiMTNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2EvRWNob1Jhd1N3QUZpbGVJbnB1dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc3dhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlRlc3RpbmdVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmludGVncmF0aW9uLlV0aWxTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyQmFzZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEVjaG9SYXdTd0FGaWxlSW5wdXRUZXN0IGV4dGVuZHMgVXRpbFNlcnZlckJhc2VkVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiRWNob1N3QVNlcnZpY2UiKTsKLQotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZSA9IG5ldyBRTmFtZSgiZWNob0F0dGFjaG1lbnQiKTsKLQotICAgIHB1YmxpYyBFY2hvUmF3U3dBRmlsZUlucHV0VGVzdCgpIHsKLSAgICAgICAgc3VwZXIoRWNob1Jhd1N3QUZpbGVJbnB1dFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1Jhd1N3QUZpbGVJbnB1dFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAyKG5ldyBUZXN0U3VpdGUoRWNob1Jhd1N3QUZpbGVJbnB1dFRlc3QuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeShDb25zdGFudHMuVEVTVElOR19QQVRIICsgIk1UT00tZW5hYmxlZFJlcG9zaXRvcnkiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsIEVjaG9Td0EuY2xhc3MKLSAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSk7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX0RPQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1hNTFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoIjEyNy4wLjAuMSIsIDU1NTUpOwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gc29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gcmVxdWVzdE1zZ0luU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShUZXN0aW5nVXRpbHMucHJlZml4QmFzZURpcmVjdG9yeSgidGVzdC1yZXNvdXJjZXMvc3dhL3N3YWlucHV0LmJpbiIpKTsKLSAgICAgICAgaW50IGRhdGE7Ci0gICAgICAgIHdoaWxlICgoZGF0YSA9IHJlcXVlc3RNc2dJblN0cmVhbS5yZWFkKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICBvdXRTdHJlYW0ud3JpdGUoZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIHNvY2tldC5zaHV0ZG93bk91dHB1dCgpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNvY2tldAotICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgd2hpbGUgKG51bGwgIT0gcmVzcG9uc2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlc3BvbnNlLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKHNiLnRvU3RyaW5nKCkuaW5kZXhPZigKLSAgICAgICAgICAgICAgICAiQXBhY2hlIEF4aXMyIC0gVGhlIE5FeHQgR2VuZXJhdGlvbiBXZWIgU2VydmljZXMgRW5naW5lIikgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYi50b1N0cmluZygpLmluZGV4T2YoIm11bHRpcGFydC9yZWxhdGVkIikgPiAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9SYXdTd0FUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZTE0M2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9FY2hvUmF3U3dBVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zd2E7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS51dGlsLlRlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5UZXN0aW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pbnRlZ3JhdGlvbi5VdGlsU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVXRpbFNlcnZlckJhc2VkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlOwotCi1wdWJsaWMgY2xhc3MgRWNob1Jhd1N3QVRlc3QgZXh0ZW5kcyBVdGlsU2VydmVyQmFzZWRUZXN0Q2FzZSBpbXBsZW1lbnRzIFRlc3RDb25zdGFudHMgewotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNob1Jhd1N3QVRlc3QuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZpbmlzaCA9IGZhbHNlOwotCi0gICAgcHVibGljIEVjaG9SYXdTd0FUZXN0KCkgewotICAgICAgICBzdXBlcihFY2hvUmF3U3dBVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvUmF3U3dBVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cDIobmV3IFRlc3RTdWl0ZShFY2hvUmF3U3dBVGVzdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KENvbnN0YW50cy5URVNUSU5HX1BBVEggKyAiU3dBLWVuYWJsZWRSZXBvc2l0b3J5IikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBFY2hvU3dBLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIuZGVwbG95U2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lDbGllbnRTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNPQVBFbnZlbG9wZSBjcmVhdGVFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHRwOi8vbG9jYWxob3N0L215IiwgIm15Iik7Ci0gICAgICAgIE9NRWxlbWVudCBycGNXcmFwRWxlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNob09NRWxlbWVudCIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgZGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRhdGEiLCBvbU5zKTsKLSAgICAgICAgT01UZXh0IHRleHREYXRhID0gZmFjLmNyZWF0ZU9NVGV4dCgiQXBhY2hlIEF4aXMyIFJvY2tzICEhISIpOwotICAgICAgICBkYXRhLmFkZENoaWxkKHRleHREYXRhKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhKTsKLQotICAgICAgICBlbnYuZ2V0Qm9keSgpLmFkZENoaWxkKHJwY1dyYXBFbGUpOwotICAgICAgICByZXR1cm4gZW52OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9YTUxTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9TV0EsIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0U29hcFZlcnNpb25VUkkoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDEwMDAwMCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvaW50ZWdyYXRpb25SZXBvIiksIG51bGwpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgbWVwQ2xpZW50ID0gc2VuZGVyLmNyZWF0ZUNsaWVudChTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRFbnZlbG9wZShjcmVhdGVFbnZlbG9wZSgpKTsKLSAgICAgICAgRmlsZURhdGFTb3VyY2UgZmlsZURhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoVGVzdGluZ1V0aWxzLnByZWZpeEJhc2VEaXJlY3RvcnkoInRlc3QtcmVzb3VyY2VzL210b20vdGVzdC5qcGciKSk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLSAgICAgICAgbWMuYWRkQXR0YWNobWVudCgiRmlyc3RBdHRhY2htZW50IiwgZGF0YUhhbmRsZXIpOwotCi0gICAgICAgIG1lcENsaWVudC5hZGRNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIG1lcENsaWVudC5leGVjdXRlKHRydWUpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG1lcENsaWVudC5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlcjIgPSByZXNwb25zZS5nZXRBdHRhY2htZW50KCJGaXJzdEF0dGFjaG1lbnQiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYXRhSGFuZGxlcik7Ci0gICAgICAgIGNvbXBhcmVEYXRhSGFuZGxlcnMoZGF0YUhhbmRsZXIsIGRhdGFIYW5kbGVyMik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZURhdGFIYW5kbGVycyhEYXRhSGFuZGxlciBkYXRhSGFuZGxlciwgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIyKSB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbFRleHRWYWx1ZSA9IG5ldyBPTVRleHRJbXBsKGRhdGFIYW5kbGVyLCB0cnVlLCBudWxsKS5nZXRUZXh0KCk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5lZFRleHRWYWx1ZSA9IG5ldyBPTVRleHRJbXBsKGRhdGFIYW5kbGVyMiwgdHJ1ZSwgbnVsbCkuZ2V0VGV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuZWRUZXh0VmFsdWUsIG9yaWdpbmFsVGV4dFZhbHVlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9FY2hvU3dBLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9Td0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxMDk4MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvc3dhL0VjaG9Td0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zd2E7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKiBAdmVyc2lvbiAkUmV2OiAkICREYXRlOiAkICovCi0KLXB1YmxpYyBjbGFzcyBFY2hvU3dBIHsKLQotICAgIHB1YmxpYyBFY2hvU3dBKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNob0F0dGFjaG1lbnQoT01FbGVtZW50IG9tRWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudClvbUVsZS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0ciA9IGNoaWxkLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoImhyZWYiKSk7Ci0gICAgICAgIFN0cmluZyBjb250ZW50SUQgPSBhdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgIGNvbnRlbnRJRCA9IGNvbnRlbnRJRC50cmltKCk7Ci0gICAgICAgIGlmIChjb250ZW50SUQuc3Vic3RyaW5nKDAsIDMpLmVxdWFsc0lnbm9yZUNhc2UoImNpZCIpKSB7Ci0gICAgICAgICAgICBjb250ZW50SUQgPSBjb250ZW50SUQuc3Vic3RyaW5nKDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnQgPSAobXNnQ3R4KS5nZXRBdHRhY2htZW50TWFwKCk7Ci0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKGNvbnRlbnRJRCk7Ci0gICAgICAgIE9NVGV4dCB0ZXh0Tm9kZSA9IG5ldyBPTVRleHRJbXBsKGRhdGFIYW5kbGVyLCBvbUVsZS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIG9tRWxlLmJ1aWxkKCk7Ci0gICAgICAgIGNoaWxkLmRldGFjaCgpOwotICAgICAgICBvbUVsZS5hZGRDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9PTUVsZW1lbnQoT01FbGVtZW50IG9tRWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudClvbUVsZS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnQgPSAobXNnQ3R4KS5nZXRBdHRhY2htZW50TWFwKCk7Ci0gICAgICAgIG1zZ0N0eC5yZW1vdmVBdHRhY2htZW50KGF0dGFjaG1lbnQuZ2V0U09BUFBhcnRDb250ZW50SUQoKSk7Ci0gICAgICAgIG1zZ0N0eC5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSkuc2V0QXR0YWNobWVudE1hcChhdHRhY2htZW50KTsKLQotICAgICAgICBvbUVsZS5idWlsZCgpOwotICAgICAgICByZXR1cm4gb21FbGU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zd2Evc3dhaW5wdXQuYmluIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9zd2FpbnB1dC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTc3OTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3N3YS9zd2FpbnB1dC5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1QT1NUIC9heGlzMi9zZXJ2aWNlcy9FY2hvU3dBU2VydmljZS9lY2hvQXR0YWNobWVudCBIVFRQLzEuMA0KLUNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3JlbGF0ZWQ7IHR5cGU9InRleHQveG1sIjsgc3RhcnQ9Ijw5RDY0NUM4RUJCODM3Q0U1NEFCRDAyN0EzNjU5NTM1RD4iOyAJYm91bmRhcnk9Ii0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgiDQotQWNjZXB0OiBhcHBsaWNhdGlvbi9zb2FwK3htbCwgYXBwbGljYXRpb24vZGltZSwgbXVsdGlwYXJ0L3JlbGF0ZWQsIHRleHQvKg0KLVVzZXItQWdlbnQ6IEF4aXMvMS4yLjENCi1Ib3N0OiAxMjcuMC4wLjE6ODA4MQ0KLUNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlDQotUHJhZ21hOiBuby1jYWNoZQ0KLUNvbm5lY3Rpb246IGNsb3NlDQotU09BUEFjdGlvbjogIiINCi0NCi0NCi0tLS0tLS09X1BhcnRfMF8xOTc3NTExLjExMjMxNjM1NzExMzgNCi1Db250ZW50LVR5cGU6IHRleHQveG1sOyBjaGFyc2V0PVVURi04DQotQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5DQotQ29udGVudC1JZDogPDlENjQ1QzhFQkI4MzdDRTU0QUJEMDI3QTM2NTk1MzVEPg0KLQ0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPjxzb2FwZW52OkJvZHk+PGVjaG9BdHRhY2htZW50IHhtbG5zPSIiPjxzb3VyY2UgaHJlZj0iY2lkOjM5MzZBRTE5RkJFRDU1QUU0NjIwQjgxQzczQkRENzZFIiB4bWxucz0iIi8+PC9lY2hvQXR0YWNobWVudD48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+DQotLS0tLS0tPV9QYXJ0XzBfMTk3NzUxMS4xMTIzMTYzNTcxMTM4DQotQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQotQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmluYXJ5DQotQ29udGVudC1JZDogPDM5MzZBRTE5RkJFRDU1QUU0NjIwQjgxQzczQkRENzZFPg0KLQ0KLUFwYWNoZSBBeGlzMiAtIFRoZSBORXh0IEdlbmVyYXRpb24gV2ViIFNlcnZpY2VzIEVuZ2luZQ0KLQ0KLS0tLS0tLT1fUGFydF8wXzE5Nzc1MTEuMTEyMzE2MzU3MTEzOC0tDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL05vblByb3h5SG9zdFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Ob25Qcm94eUhvc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWNjNjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL05vblByb3h5SG9zdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgTm9uUHJveHlIb3N0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHZvaWQgdGVzdEZvckF4aXMyXzM0NTMoKSB7DQotICAgICAgICBTdHJpbmcgbm9uUHJveHlIb3N0cyA9ICJzZWFsYm9vay5uY2wuYWMudWt8Ki5zZWFsYm9vay5uY2wuYWMudWt8ZXNrZGFsZS5uY2wuYWMudWt8Ki5lc2tkYWxlLm5jbC5hYy51a3xnaWdhMjUubmNsLmFjLnVrfCouZ2lnYTI1Lm5jbC5hYy51ayI7DQotICAgICAgICBhc3NlcnRUcnVlKFByb3h5Q29uZmlndXJhdGlvbi5pc0hvc3RJbk5vblByb3h5TGlzdCgic2VhbGJvb2submNsLmFjLnVrIiwgbm9uUHJveHlIb3N0cykpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UoUHJveHlDb25maWd1cmF0aW9uLmlzSG9zdEluTm9uUHJveHlMaXN0KCJ4c2VhbGJvb2submNsLmFjLnVrIiwgbm9uUHJveHlIb3N0cykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShQcm94eUNvbmZpZ3VyYXRpb24uaXNIb3N0SW5Ob25Qcm94eUxpc3QoImxvY2FsIiwibG9jYWx8Ki5sb2NhbHwxNjkuMjU0LzE2fCouMTY5LjI1NC8xNiIpKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKFByb3h5Q29uZmlndXJhdGlvbi5pc0hvc3RJbk5vblByb3h5TGlzdCgibG9jYWxob3N0IiwibG9jYWx8Ki5sb2NhbHwxNjkuMjU0LzE2fCouMTY5LjI1NC8xNiIpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVGVzdFNlcnZsZXRSZXF1ZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVGVzdFNlcnZsZXRSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWQyMWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1Rlc3RTZXJ2bGV0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsNCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsNCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsNCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qDQotICogTm90ZSB0aGF0IE9OTFkgdGhlIG1ldGhvZHMgdXNlZCBieSBUcmFuc3BvcnRIZWFkZXJzIGFyZSBpbXBsZW1lbnRlZCENCi0gKi8NCi1jbGFzcyBUZXN0U2VydmxldFJlcXVlc3QgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlcXVlc3Qgew0KLQ0KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBoZWFkZXJzID0gbnVsbDsNCi0NCi0gICAgVGVzdFNlcnZsZXRSZXF1ZXN0KCkgew0KLSAgICAgICAgaGVhZGVycyA9IG5ldyBIYXNodGFibGUoKTsNCi0gICAgICAgIGhlYWRlcnMucHV0KCJoZWFkZXIxIiwgImgxVmFsdWUiKTsNCi0gICAgICAgIGhlYWRlcnMucHV0KCJoZWFkZXIyIiwgImgyVmFsdWUiKTsNCi0gICAgICAgIGhlYWRlcnMucHV0KCJoZWFkZXIzIiwgImgzVmFsdWUiKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsQWRkcigpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb29raWVbXSBnZXRDb29raWVzKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiAoU3RyaW5nKSBoZWFkZXJzLmdldChzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVyTmFtZXMoKSB7DQotICAgICAgICByZXR1cm4gaGVhZGVycy5rZXlzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlcnMoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0SW50SGVhZGVyKFN0cmluZyBzKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEluZm8oKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhUcmFuc2xhdGVkKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oYm9vbGVhbiBmbGFnKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBzKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgew0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TG9jYWxlcygpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBzKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbFBhdGgoU3RyaW5nIHMpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXF1ZXN0RGlzcGF0Y2hlciBnZXRSZXF1ZXN0RGlzcGF0Y2hlcihTdHJpbmcgcykgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIHMpIHsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIHMsIE9iamVjdCBvYmopIHsNCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9UcmFuc3BvcnRIZWFkZXJzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1RyYW5zcG9ydEhlYWRlcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OGVlYTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1RyYW5zcG9ydEhlYWRlcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotDQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0SGVhZGVyc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2bGV0UmVxdWVzdCgpIHsNCi0gICAgICAgIC8vIFRoaXMganVzdCB2YWxpZGF0ZXMgdGhhdCB0aGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHRlc3QgY2xhc3MgYmVsb3cgd29ya3MgYXMgZXhwZWN0ZWQNCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSBuZXcgVGVzdFNlcnZsZXRSZXF1ZXN0KCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImgxVmFsdWUiLCByZXEuZ2V0SGVhZGVyKCJoZWFkZXIxIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoMlZhbHVlIiwgcmVxLmdldEhlYWRlcigiaGVhZGVyMiIpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaDNWYWx1ZSIsIHJlcS5nZXRIZWFkZXIoImhlYWRlcjMiKSk7DQotICAgICAgICBhc3NlcnROdWxsKHJlcS5nZXRIZWFkZXIoIm5ld0hlYWRlcjEiKSk7DQotICAgICAgICBhc3NlcnROdWxsKHJlcS5nZXRIZWFkZXIoIm5ld0hlYWRlcjIiKSk7DQotDQotICAgICAgICBFbnVtZXJhdGlvbiBoZWFkZXJzID0gcmVxLmdldEhlYWRlck5hbWVzKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbE1hcCgpIHsNCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEgPSBuZXcgVGVzdFNlcnZsZXRSZXF1ZXN0KCk7DQotICAgICAgICBUcmFuc3BvcnRIZWFkZXJzIGhlYWRlcnMgPSBuZXcgVHJhbnNwb3J0SGVhZGVycyhyZXEpOw0KLSAgICAgICAgU3RyaW5nIGNoZWNrVmFsdWUgPSBudWxsOw0KLSAgICAgICAgYXNzZXJ0TnVsbChoZWFkZXJzLmhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMubG9jYWxIZWFkZXJNYXApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJzLmxvY2FsSGVhZGVyTWFwLmlzRW1wdHkoKSk7DQotDQotICAgICAgICAvLyBBZGQgYSBoZWFkZXIgdGhhdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBzZXJ2bGV0IHJlcXVlc3QgYW5kIG1ha2Ugc3VyZSBpdCBkb2Vzbid0DQotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgaGVhZGVyTWFwDQotICAgICAgICBoZWFkZXJzLnB1dCgibmV3SGVhZGVyMSIsICJuZXdIZWFkZXIxVmFsdWUiKTsNCi0gICAgICAgIGNoZWNrVmFsdWUgPSAoU3RyaW5nKSBoZWFkZXJzLmdldCgibmV3SGVhZGVyMSIpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChoZWFkZXJzLmhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnRGYWxzZShoZWFkZXJzLmxvY2FsSGVhZGVyTWFwLmlzRW1wdHkoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVycy5sb2NhbEhlYWRlck1hcC5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuZXdIZWFkZXIxVmFsdWUiLCBjaGVja1ZhbHVlKTsNCi0NCi0gICAgICAgIC8vIEFkZCBhIGhlYWRlciB0aGF0IGRvZXMgZXhpc3QgaW4gdGhlIHNlcnZsZXQgcmVxdWVzdCB3aXRoIGEgbmV3IHZhbHVlIHN0aWxsIHNob3VsZG4ndA0KLSAgICAgICAgLy8gcG9wdWxhdGUNCi0gICAgICAgIGhlYWRlcnMucHV0KCJoZWFkZXIzIiwgImgzVmFsdWVOZXciKTsNCi0gICAgICAgIGNoZWNrVmFsdWUgPSAoU3RyaW5nKSBoZWFkZXJzLmdldCgiaGVhZGVyMyIpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChoZWFkZXJzLmhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnRGYWxzZShoZWFkZXJzLmxvY2FsSGVhZGVyTWFwLmlzRW1wdHkoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaGVhZGVycy5sb2NhbEhlYWRlck1hcC5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoM1ZhbHVlTmV3IiwgY2hlY2tWYWx1ZSk7DQotDQotICAgICAgICAvLyBOb3cgY2F1c2UgdGhlIG1hcCB0byBiZSBwb3B1bGF0ZWQgZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0DQotICAgICAgICBpbnQgc2l6ZSA9IGhlYWRlcnMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNpemUpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXJzLmhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnROdWxsKGhlYWRlcnMubG9jYWxIZWFkZXJNYXApOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJoMVZhbHVlIiwgKFN0cmluZykgaGVhZGVycy5nZXQoImhlYWRlcjEiKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImgyVmFsdWUiLCAoU3RyaW5nKSBoZWFkZXJzLmdldCgiaGVhZGVyMiIpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaDNWYWx1ZU5ldyIsIChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJoZWFkZXIzIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuZXdIZWFkZXIxVmFsdWUiLCAoU3RyaW5nKSBoZWFkZXJzLmdldCgibmV3SGVhZGVyMSIpKTsNCi0NCi0gICAgICAgIC8vIE5vdyBkbyBhbm90aGVyIHB1dCBvZiBhIG5ldyB2YWx1ZSBhbmQgbWFrZSBzdXJlIGl0IGlzIHB1dCBpbiB0aGUgbmV3bHkgcG9wdWxhdGVkIGhhc2htYXANCi0gICAgICAgIGhlYWRlcnMucHV0KCJuZXdIZWFkZXIyIiwgIm5ld0hlYWRlcjJWYWx1ZSIpOw0KLSAgICAgICAgY2hlY2tWYWx1ZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJuZXdIZWFkZXIyIik7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMuaGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydE51bGwoaGVhZGVycy5sb2NhbEhlYWRlck1hcCk7DQotICAgICAgICBzaXplID0gaGVhZGVycy5zaXplKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgc2l6ZSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld0hlYWRlcjJWYWx1ZSIsIGNoZWNrVmFsdWUpOw0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BvcHVsYXRlT25HZXQoKSB7DQotICAgICAgICAvLyBEb2luZyBhIGdldCBiZWZvcmUgYSBwdXQgc2hvdWxkbid0IGV4cGFuZCB0aGUgaGVhZGVyTWFwLg0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IG5ldyBUZXN0U2VydmxldFJlcXVlc3QoKTsNCi0gICAgICAgIFRyYW5zcG9ydEhlYWRlcnMgaGVhZGVycyA9IG5ldyBUcmFuc3BvcnRIZWFkZXJzKHJlcSk7DQotICAgICAgICBTdHJpbmcgY2hlY2tWYWx1ZSA9IG51bGw7DQotICAgICAgICBhc3NlcnROdWxsKGhlYWRlcnMuaGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycy5sb2NhbEhlYWRlck1hcCk7DQotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlcnMubG9jYWxIZWFkZXJNYXAuaXNFbXB0eSgpKTsNCi0NCi0gICAgICAgIGNoZWNrVmFsdWUgPSAoU3RyaW5nKSBoZWFkZXJzLmdldCgiaGVhZGVyMSIpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGVja1ZhbHVlKTsNCi0gICAgICAgIGFzc2VydE51bGwoaGVhZGVycy5oZWFkZXJNYXApOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoZWFkZXJzLmxvY2FsSGVhZGVyTWFwKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaDFWYWx1ZSIsIGNoZWNrVmFsdWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvQmFzZURhdGFUeXBlcy5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9CYXNlRGF0YVR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDEyNzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9CYXNlRGF0YVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaTsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEJhc2VEYXRhVHlwZXMgewotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0Qm9vbCgKLSAgICAgICAgICAgIGJvb2xlYW4gaW5Cb29sKSB7Ci0gICAgICAgIHJldHVybiBpbkJvb2w7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHJldEJ5dGUoCi0gICAgICAgICAgICBzaG9ydCBpbkJ5dGUpIHsKLSAgICAgICAgcmV0dXJuIGluQnl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgICAgIGJ5dGUgaW5TQnl0ZSkgewotICAgICAgICByZXR1cm4gaW5TQnl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgICAgIGJ5dGVbXSBpbkJ5dGVBcnJheSkgewotICAgICAgICByZXR1cm4gaW5CeXRlQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRDaGFyKAotICAgICAgICAgICAgaW50IGluQ2hhcikgewotICAgICAgICByZXR1cm4gaW5DaGFyOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGluRGVjaW1hbCkgewotICAgICAgICByZXR1cm4gaW5EZWNpbWFsOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCByZXRGbG9hdCgKLSAgICAgICAgICAgIGZsb2F0IGluRmxvYXQpIHsKLSAgICAgICAgcmV0dXJuIGluRmxvYXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSByZXREb3VibGUoCi0gICAgICAgICAgICBkb3VibGUgaW5Eb3VibGUpIHsKLSAgICAgICAgcmV0dXJuIGluRG91YmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCByZXRTaW5nbGUoCi0gICAgICAgICAgICBmbG9hdCBpblNpbmdsZSkgewotICAgICAgICByZXR1cm4gaW5TaW5nbGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRJbnQoCi0gICAgICAgICAgICBpbnQgaW5JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCByZXRTaG9ydCgKLSAgICAgICAgICAgIHNob3J0IGluU2hvcnQpIHsKLSAgICAgICAgcmV0dXJuIGluU2hvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcmV0TG9uZygKLSAgICAgICAgICAgIGxvbmcgaW5Mb25nKSB7Ci0gICAgICAgIHJldHVybiBpbkxvbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZXRPYmplY3QoCi0gICAgICAgICAgICBPYmplY3QgaW5PYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGluT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHJldFVJbnQoCi0gICAgICAgICAgICBsb25nIGluVUludCkgewotICAgICAgICByZXR1cm4gaW5VSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmV0VVNob3J0KAotICAgICAgICAgICAgaW50IGluVVNob3J0KSB7Ci0gICAgICAgIHJldHVybiBpblVTaG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciByZXRVTG9uZygKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgaW5VTG9uZykgewotICAgICAgICByZXR1cm4gaW5VTG9uZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldFN0cmluZygKLSAgICAgICAgICAgIFN0cmluZyBpblN0cmluZykgewotICAgICAgICByZXR1cm4gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRHdWlkKAotICAgICAgICAgICAgU3RyaW5nIGluR3VpZCkgewotICAgICAgICByZXR1cm4gaW5HdWlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0VXJpKAotICAgICAgICAgICAgU3RyaW5nIGluVXJpKSB7Ci0gICAgICAgIHJldHVybiBpblVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgICAgICBDYWxlbmRhciBpbkRhdGVUaW1lKSB7Ci0gICAgICAgIHJldHVybiBpbkRhdGVUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBEdXJhdGlvbiByZXRUaW1lU3BhbigKLSAgICAgICAgICAgIER1cmF0aW9uIGluVGltZVNwYW4pIHsKLSAgICAgICAgcmV0dXJuIGluVGltZVNwYW47Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIHJldFFOYW1lKAotICAgICAgICAgICAgUU5hbWUgaW5RTmFtZSkgewotICAgICAgICByZXR1cm4gaW5RTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwN2U4ZWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9CYXNlRGF0YVR5cGVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaW50ZWdyYXRpb24uVGVzdGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLkphdmEyV1NETEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmY7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmZlcmVuY2VFbmdpbmU7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFRlc3RDYXNlOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OwotaW1wb3J0IG9yZy50ZW1wdXJpLmVsZW1lbnRRdWFsaWZpZXIuV1NETEVsZW1lbnRRdWFsaWZpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlRGF0YVR5cGVzVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFRlc3RpbmdVdGlscy5wcmVmaXhCYXNlRGlyZWN0b3J5KCJ0ZXN0LXJlc291cmNlcy9CYXNlRGF0YVR5cGVzLndzZGwiKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZSh0cnVlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBKYXZhMldTRExCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmF2YTJXU0RMQnVpbGRlcihvdXQsIEJhc2VEYXRhVHlwZXMuY2xhc3MuZ2V0TmFtZSgpLCBCYXNlRGF0YVR5cGVzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgYnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLSAgICAgICAgICAgIEZpbGVSZWFkZXIgY29udHJvbCA9IG5ldyBGaWxlUmVhZGVyKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBTdHJpbmdSZWFkZXIgdGVzdCA9IG5ldyBTdHJpbmdSZWFkZXIobmV3IFN0cmluZyhvdXQudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgRGlmZiBteURpZmYgPSBuZXcgRGlmZihYTUxVbml0LmJ1aWxkRG9jdW1lbnQoWE1MVW5pdC5nZXRDb250cm9sUGFyc2VyKCksIGNvbnRyb2wpLCAKLQkJICAgICAgICAgICAgICAgWE1MVW5pdC5idWlsZERvY3VtZW50KFhNTFVuaXQuZ2V0Q29udHJvbFBhcnNlcigpLCB0ZXN0KSwgCi0JCSAgICAgICAgICAgICAgIChEaWZmZXJlbmNlRW5naW5lKSBudWxsLCBuZXcgV1NETEVsZW1lbnRRdWFsaWZpZXIoKSk7Ci0gICAgICAgICAgICBpZiAoIW15RGlmZi5zaW1pbGFyKCkpIAotCSAgICAgICAgICAgIGZhaWwobXlEaWZmLnRvU3RyaW5nKCkpOyAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFhNTFVuaXQuc2V0SWdub3JlV2hpdGVzcGFjZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlcy5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMDhlMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleDsKLQotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5CaXRNYXNrOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5FbXBsb3llZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuRnVybml0dXJlOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5Hcm91cDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuTmFtZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuUGVyc29uOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5UYWJsZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZBcnJheU9mc3RyaW5nOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZQZXJzb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mYW55VHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZpbnQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mc3RyaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLQotcHVibGljIGNsYXNzIENvbXBsZXhEYXRhVHlwZXMgewotCi0gICAgcHVibGljIGJvb2xlYW4gcmV0Qm9vbCgKLSAgICAgICAgICAgIGJvb2xlYW4gaW5Cb29sKSB7Ci0gICAgICAgIHJldHVybiBpbkJvb2w7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHJldEJ5dGUoCi0gICAgICAgICAgICBzaG9ydCBpbkJ5dGUpIHsKLSAgICAgICAgcmV0dXJuIGluQnl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgICAgIGJ5dGUgaW5TQnl0ZSkgewotICAgICAgICByZXR1cm4gaW5TQnl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgICAgIGJ5dGVbXSBpbkJ5dGVBcnJheSkgewotICAgICAgICByZXR1cm4gaW5CeXRlQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRDaGFyKAotICAgICAgICAgICAgaW50IGluQ2hhcikgewotICAgICAgICByZXR1cm4gaW5DaGFyOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgICAgICBCaWdEZWNpbWFsIGluRGVjaW1hbCkgewotICAgICAgICByZXR1cm4gaW5EZWNpbWFsOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCByZXRGbG9hdCgKLSAgICAgICAgICAgIGZsb2F0IGluRmxvYXQpIHsKLSAgICAgICAgcmV0dXJuIGluRmxvYXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSByZXREb3VibGUoCi0gICAgICAgICAgICBkb3VibGUgaW5Eb3VibGUpIHsKLSAgICAgICAgcmV0dXJuIGluRG91YmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCByZXRTaW5nbGUoCi0gICAgICAgICAgICBmbG9hdCBpblNpbmdsZSkgewotICAgICAgICByZXR1cm4gaW5TaW5nbGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZXRJbnQoCi0gICAgICAgICAgICBpbnQgaW5JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSByZXRJbnRzKAotICAgICAgICAgICAgaW50W10gaW5JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCByZXRTaG9ydCgKLSAgICAgICAgICAgIHNob3J0IGluU2hvcnQpIHsKLSAgICAgICAgcmV0dXJuIGluU2hvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgcmV0TG9uZygKLSAgICAgICAgICAgIGxvbmcgaW5Mb25nKSB7Ci0gICAgICAgIHJldHVybiBpbkxvbmc7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZXRPYmplY3QoCi0gICAgICAgICAgICBPYmplY3QgaW5PYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIGluT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHJldFVJbnQoCi0gICAgICAgICAgICBsb25nIGluVUludCkgewotICAgICAgICByZXR1cm4gaW5VSW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmV0VVNob3J0KAotICAgICAgICAgICAgaW50IGluVVNob3J0KSB7Ci0gICAgICAgIHJldHVybiBpblVTaG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnSW50ZWdlciByZXRVTG9uZygKLSAgICAgICAgICAgIEJpZ0ludGVnZXIgaW5VTG9uZykgewotICAgICAgICByZXR1cm4gaW5VTG9uZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldFN0cmluZygKLSAgICAgICAgICAgIFN0cmluZyBpblN0cmluZykgewotICAgICAgICByZXR1cm4gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIHJldFN0cmluZ3MoCi0gICAgICAgICAgICBTdHJpbmdbXSBpblN0cmluZykgewotICAgICAgICByZXR1cm4gaW5TdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRHdWlkKAotICAgICAgICAgICAgU3RyaW5nIGluR3VpZCkgewotICAgICAgICByZXR1cm4gaW5HdWlkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0VXJpKAotICAgICAgICAgICAgU3RyaW5nIGluVXJpKSB7Ci0gICAgICAgIHJldHVybiBpblVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgICAgICBDYWxlbmRhciBpbkRhdGVUaW1lKSB7Ci0gICAgICAgIHJldHVybiBpbkRhdGVUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSByZXRRTmFtZSgKLSAgICAgICAgICAgIFFOYW1lIGluUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGluUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZzdHJpbmcgcmV0QXJyYXlTdHJpbmcxRCgKLSAgICAgICAgICAgIEFycmF5T2ZzdHJpbmcgaW5BcnJheVN0cmluZzFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5U3RyaW5nMUQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZpbnQgcmV0QXJyYXlJbnQxRCgKLSAgICAgICAgICAgIEFycmF5T2ZpbnQgaW5BcnJheUludDFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5SW50MUQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCByZXRBcnJheURlY2ltYWwxRCgKLSAgICAgICAgICAgIEFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbCBpbkFycmF5RGVjaW1hbDFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5RGVjaW1hbDFEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIHJldEFycmF5RGF0ZVRpbWUxRCgKLSAgICAgICAgICAgIEFycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWUgaW5BcnJheURhdGVUaW1lMUQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlEYXRlVGltZTFEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mQXJyYXlPZnN0cmluZyByZXRBcnJheVN0cmluZzJEKAotICAgICAgICAgICAgQXJyYXlPZkFycmF5T2ZzdHJpbmcgaW5BcnJheVN0cmluZzJEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5U3RyaW5nMkQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZQZXJzb24gcmV0QXJyYXkxRFNOKAotICAgICAgICAgICAgQXJyYXlPZlBlcnNvbiBpbkFycmF5MURTTikgewotICAgICAgICByZXR1cm4gaW5BcnJheTFEU047Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5T2ZhbnlUeXBlIHJldEFycmF5QW55VHlwZTFEKAotICAgICAgICAgICAgQXJyYXlPZmFueVR5cGUgaW5BcnJheUFueVR5cGUxRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheUFueVR5cGUxRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZSByZXRTdHJ1Y3RTMSgKLSAgICAgICAgICAgIE5hbWUgaW5TdHJ1Y3RTMSkgewotICAgICAgICByZXR1cm4gaW5TdHJ1Y3RTMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGVyc29uIHJldFN0cnVjdFNOKAotICAgICAgICAgICAgUGVyc29uIGluU3RydWN0U04pIHsKLSAgICAgICAgcmV0dXJuIGluU3RydWN0U047Ci0gICAgfQotCi0gICAgcHVibGljIEVtcGxveWVlIHJldFN0cnVjdFNOU0EoCi0gICAgICAgICAgICBFbXBsb3llZSBpblN0cnVjdFNOU0EpIHsKLSAgICAgICAgcmV0dXJuIGluU3RydWN0U05TQTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR3JvdXAgcmV0U3RydWN0U05TQVMoCi0gICAgICAgICAgICBHcm91cCBpblN0cnVjdFNOU0FTKSB7Ci0gICAgICAgIHJldHVybiBpblN0cnVjdFNOU0FTOwotICAgIH0KLQotICAgIHB1YmxpYyBCaXRNYXNrIHJldEVudW1TdHJpbmcoCi0gICAgICAgICAgICBCaXRNYXNrIGluRW51bVN0cmluZykgewotICAgICAgICByZXR1cm4gaW5FbnVtU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0RW51bUludCgKLSAgICAgICAgICAgIFN0cmluZyBpbkVudW1JbnQpIHsKLSAgICAgICAgcmV0dXJuIGluRW51bUludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVybml0dXJlIHJldERlcml2ZWRDbGFzcygKLSAgICAgICAgICAgIEZ1cm5pdHVyZSBpbkRlcml2ZWRDbGFzcykgewotICAgICAgICByZXR1cm4gaW5EZXJpdmVkQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFRhYmxlIHJldERlcml2ZWRDbGFzczIoCi0gICAgICAgICAgICBUYWJsZSBpbkRlcml2ZWRDbGFzcykgewotICAgICAgICByZXR1cm4gaW5EZXJpdmVkQ2xhc3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXNEb2NMaXRCYXJlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2MzIzZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc0RvY0xpdEJhcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXg7Ci0KLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuQml0TWFzazsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuRW1wbG95ZWU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLkZ1cm5pdHVyZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuR3JvdXA7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLk5hbWU7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLlBlcnNvbjsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZBcnJheU9mc3RyaW5nOwotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbDsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZQZXJzb247Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mYW55VHlwZTsKLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZpbnQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5cy5BcnJheU9mc3RyaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RGF0YVR5cGVzRG9jTGl0QmFyZSB7Ci0gICAgIHB1YmxpYyBib29sZWFuIHJldEJvb2woCi0gICAgICAgICAgICBib29sZWFuIGluQm9vbCkgewotICAgICAgICByZXR1cm4gaW5Cb29sOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCByZXRCeXRlKAotICAgICAgICAgICAgc2hvcnQgaW5CeXRlKSB7Ci0gICAgICAgIHJldHVybiBpbkJ5dGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGUgcmV0U0J5dGUoCi0gICAgICAgICAgICBieXRlIGluU0J5dGUpIHsKLSAgICAgICAgcmV0dXJuIGluU0J5dGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSByZXRCeXRlQXJyYXkoCi0gICAgICAgICAgICBieXRlW10gaW5CeXRlQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIGluQnl0ZUFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmV0Q2hhcigKLSAgICAgICAgICAgIGludCBpbkNoYXIpIHsKLSAgICAgICAgcmV0dXJuIGluQ2hhcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmlnRGVjaW1hbCByZXREZWNpbWFsKAotICAgICAgICAgICAgQmlnRGVjaW1hbCBpbkRlY2ltYWwpIHsKLSAgICAgICAgcmV0dXJuIGluRGVjaW1hbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgcmV0RmxvYXQoCi0gICAgICAgICAgICBmbG9hdCBpbkZsb2F0KSB7Ci0gICAgICAgIHJldHVybiBpbkZsb2F0OwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgcmV0RG91YmxlKAotICAgICAgICAgICAgZG91YmxlIGluRG91YmxlKSB7Ci0gICAgICAgIHJldHVybiBpbkRvdWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgcmV0U2luZ2xlKAotICAgICAgICAgICAgZmxvYXQgaW5TaW5nbGUpIHsKLSAgICAgICAgcmV0dXJuIGluU2luZ2xlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgcmV0SW50KAotICAgICAgICAgICAgaW50IGluSW50KSB7Ci0gICAgICAgIHJldHVybiBpbkludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50W10gcmV0SW50cygKLSAgICAgICAgICAgIGludFtdIGluSW50KSB7Ci0gICAgICAgIHJldHVybiBpbkludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgcmV0U2hvcnQoCi0gICAgICAgICAgICBzaG9ydCBpblNob3J0KSB7Ci0gICAgICAgIHJldHVybiBpblNob3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIHJldExvbmcoCi0gICAgICAgICAgICBsb25nIGluTG9uZykgewotICAgICAgICByZXR1cm4gaW5Mb25nOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmV0T2JqZWN0KAotICAgICAgICAgICAgT2JqZWN0IGluT2JqZWN0KSB7Ci0gICAgICAgIHJldHVybiBpbk9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyByZXRVSW50KAotICAgICAgICAgICAgbG9uZyBpblVJbnQpIHsKLSAgICAgICAgcmV0dXJuIGluVUludDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJldFVTaG9ydCgKLSAgICAgICAgICAgIGludCBpblVTaG9ydCkgewotICAgICAgICByZXR1cm4gaW5VU2hvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEJpZ0ludGVnZXIgcmV0VUxvbmcoCi0gICAgICAgICAgICBCaWdJbnRlZ2VyIGluVUxvbmcpIHsKLSAgICAgICAgcmV0dXJuIGluVUxvbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyByZXRTdHJpbmcoCi0gICAgICAgICAgICBTdHJpbmcgaW5TdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIGluU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSByZXRTdHJpbmdzKAotICAgICAgICAgICAgU3RyaW5nW10gaW5TdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIGluU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmV0R3VpZCgKLSAgICAgICAgICAgIFN0cmluZyBpbkd1aWQpIHsKLSAgICAgICAgcmV0dXJuIGluR3VpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldFVyaSgKLSAgICAgICAgICAgIFN0cmluZyBpblVyaSkgewotICAgICAgICByZXR1cm4gaW5Vcmk7Ci0gICAgfQotCi0gICAgcHVibGljIENhbGVuZGFyIHJldERhdGVUaW1lKAotICAgICAgICAgICAgQ2FsZW5kYXIgaW5EYXRlVGltZSkgewotICAgICAgICByZXR1cm4gaW5EYXRlVGltZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgcmV0UU5hbWUoCi0gICAgICAgICAgICBRTmFtZSBpblFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBpblFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mc3RyaW5nIHJldEFycmF5U3RyaW5nMUQoCi0gICAgICAgICAgICBBcnJheU9mc3RyaW5nIGluQXJyYXlTdHJpbmcxRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheVN0cmluZzFEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9maW50IHJldEFycmF5SW50MUQoCi0gICAgICAgICAgICBBcnJheU9maW50IGluQXJyYXlJbnQxRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheUludDFEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwgcmV0QXJyYXlEZWNpbWFsMUQoCi0gICAgICAgICAgICBBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwgaW5BcnJheURlY2ltYWwxRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheURlY2ltYWwxRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSByZXRBcnJheURhdGVUaW1lMUQoCi0gICAgICAgICAgICBBcnJheU9mTnVsbGFibGVPZmRhdGVUaW1lIGluQXJyYXlEYXRlVGltZTFEKSB7Ci0gICAgICAgIHJldHVybiBpbkFycmF5RGF0ZVRpbWUxRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlPZkFycmF5T2ZzdHJpbmcgcmV0QXJyYXlTdHJpbmcyRCgKLSAgICAgICAgICAgIEFycmF5T2ZBcnJheU9mc3RyaW5nIGluQXJyYXlTdHJpbmcyRCkgewotICAgICAgICByZXR1cm4gaW5BcnJheVN0cmluZzJEOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mUGVyc29uIHJldEFycmF5MURTTigKLSAgICAgICAgICAgIEFycmF5T2ZQZXJzb24gaW5BcnJheTFEU04pIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXkxRFNOOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheU9mYW55VHlwZSByZXRBcnJheUFueVR5cGUxRCgKLSAgICAgICAgICAgIEFycmF5T2ZhbnlUeXBlIGluQXJyYXlBbnlUeXBlMUQpIHsKLSAgICAgICAgcmV0dXJuIGluQXJyYXlBbnlUeXBlMUQ7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWUgcmV0U3RydWN0UzEoCi0gICAgICAgICAgICBOYW1lIGluU3RydWN0UzEpIHsKLSAgICAgICAgcmV0dXJuIGluU3RydWN0UzE7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiByZXRTdHJ1Y3RTTigKLSAgICAgICAgICAgIFBlcnNvbiBpblN0cnVjdFNOKSB7Ci0gICAgICAgIHJldHVybiBpblN0cnVjdFNOOwotICAgIH0KLQotICAgIHB1YmxpYyBFbXBsb3llZSByZXRTdHJ1Y3RTTlNBKAotICAgICAgICAgICAgRW1wbG95ZWUgaW5TdHJ1Y3RTTlNBKSB7Ci0gICAgICAgIHJldHVybiBpblN0cnVjdFNOU0E7Ci0gICAgfQotCi0gICAgcHVibGljIEdyb3VwIHJldFN0cnVjdFNOU0FTKAotICAgICAgICAgICAgR3JvdXAgaW5TdHJ1Y3RTTlNBUykgewotICAgICAgICByZXR1cm4gaW5TdHJ1Y3RTTlNBUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQml0TWFzayByZXRFbnVtU3RyaW5nKAotICAgICAgICAgICAgQml0TWFzayBpbkVudW1TdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIGluRW51bVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJldEVudW1JbnQoCi0gICAgICAgICAgICBTdHJpbmcgaW5FbnVtSW50KSB7Ci0gICAgICAgIHJldHVybiBpbkVudW1JbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1cm5pdHVyZSByZXREZXJpdmVkQ2xhc3MoCi0gICAgICAgICAgICBGdXJuaXR1cmUgaW5EZXJpdmVkQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGluRGVyaXZlZENsYXNzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L0NvbXBsZXhEYXRhVHlwZXNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhY2Y5ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvQ29tcGxleERhdGFUeXBlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLkphdmEyV1NETEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmY7Ci1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFRlc3RDYXNlOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OwotaW1wb3J0IG9yZy50ZW1wdXJpLmRpZmZlcmVuY2VFbmdpbmUuV1NETENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuZGlmZmVyZW5jZUVuZ2luZS5XU0RMRGlmZmVyZW5jZUVuZ2luZTsKLWltcG9ydCBvcmcudGVtcHVyaS5lbGVtZW50UXVhbGlmaWVyLldTRExFbGVtZW50UXVhbGlmaWVyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RGF0YVR5cGVzVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMvQ29tcGxleERhdGFUeXBlcy9Db21wbGV4RGF0YVR5cGVzLndzZGwiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIEphdmEyV1NETEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBKYXZhMldTRExCdWlsZGVyKG91dCwgQ29tcGxleERhdGFUeXBlcy5jbGFzcy5nZXROYW1lKCksIENvbXBsZXhEYXRhVHlwZXMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICBidWlsZGVyLmdlbmVyYXRlV1NETCgpOwotICAgICAgICAgICAgRmlsZVJlYWRlciBjb250cm9sID0gbmV3IEZpbGVSZWFkZXIod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgIFN0cmluZ1JlYWRlciB0ZXN0ID0gbmV3IFN0cmluZ1JlYWRlcihuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICBEaWZmIG15RGlmZiA9IG5ldyBEaWZmKFhNTFVuaXQuYnVpbGREb2N1bWVudChYTUxVbml0LmdldENvbnRyb2xQYXJzZXIoKSwgY29udHJvbCksIAotCQkgICAgICAgICAgICAgICBYTUxVbml0LmJ1aWxkRG9jdW1lbnQoWE1MVW5pdC5nZXRDb250cm9sUGFyc2VyKCksIHRlc3QpLCAKLQkJICAgICAgICAgICAgICAgbmV3IFdTRExEaWZmZXJlbmNlRW5naW5lKG5ldyBXU0RMQ29udHJvbGxlcigpKSwgbmV3IFdTRExFbGVtZW50UXVhbGlmaWVyKCkpOwotICAgICAgICAgICAgaWYgKCFteURpZmYuc2ltaWxhcigpKSAKLQkgICAgICAgICAgICBmYWlsKG15RGlmZi50b1N0cmluZygpKTsgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBYTUxVbml0LnNldElnbm9yZVdoaXRlc3BhY2UoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvQml0TWFzay5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvQml0TWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Q5MjYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0JpdE1hc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCaXRNYXNrIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0TWFzayBCSVRfT05FID0gbmV3IEJpdE1hc2soIkJpdE9uZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0TWFzayBCSVRfVFdPID0gbmV3IEJpdE1hc2soIkJpdFR3byIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0TWFzayBCSVRfVEhSRUUgPSBuZXcgQml0TWFzaygiQml0VGhyZWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpdE1hc2sgQklUX0ZPVVIgPSBuZXcgQml0TWFzaygiQml0Rm91ciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQml0TWFzayBCSVRfRklWRSA9IG5ldyBCaXRNYXNrKCJCaXRGaXZlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBCaXRNYXNrKFN0cmluZyB2KSB7Ci0gICAgICAgIHZhbHVlID0gdjsKLSAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB2YWx1ZXMuYWRkKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJpdE1hc2sgZnJvbVZhbHVlKFN0cmluZyB2KSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdmFsdWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEJpdE1hc2sgYyA9IChCaXRNYXNrKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYy52YWx1ZS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHYpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0VtcGxveWVlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9FbXBsb3llZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDU3ZDdjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0VtcGxveWVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGE7Ci0KLWltcG9ydCBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzLkFycmF5T2ZzaG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotCi1wdWJsaWMgY2xhc3MgRW1wbG95ZWUgewotCi0gICAgcHJvdGVjdGVkIFBlcnNvbiBiYXNlRGV0YWlsczsKLSAgICBwcm90ZWN0ZWQgQ2FsZW5kYXIgaGlyZURhdGU7Ci0gICAgcHJvdGVjdGVkIExvbmcgam9iSUQ7Ci0gICAgcHJvdGVjdGVkIEFycmF5T2ZzaG9ydCBudW1iZXJzOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGJhc2VEZXRhaWxzIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBQZXJzb24gZ2V0QmFzZURldGFpbHMoKSB7Ci0gICAgICAgIHJldHVybiBiYXNlRGV0YWlsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYmFzZURldGFpbHMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZURldGFpbHMoUGVyc29uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuYmFzZURldGFpbHMgPSAoKFBlcnNvbikgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoaXJlRGF0ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgQ2FsZW5kYXIgfQotICAgICAqLwotICAgIHB1YmxpYyBDYWxlbmRhciBnZXRIaXJlRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGhpcmVEYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBoaXJlRGF0ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgQ2FsZW5kYXIgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhpcmVEYXRlKENhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaGlyZURhdGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgam9iSUQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIExvbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBMb25nIGdldEpvYklEKCkgewotICAgICAgICByZXR1cm4gam9iSUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGpvYklEIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBMb25nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKb2JJRChMb25nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuam9iSUQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbnVtYmVycyBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlPZnNob3J0IGdldE51bWJlcnMoKSB7Ci0gICAgICAgIHJldHVybiBudW1iZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBudW1iZXJzIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcnMoQXJyYXlPZnNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubnVtYmVycyA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvRnVybml0dXJlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9GdXJuaXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmNTQyNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9GdXJuaXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgRnVybml0dXJlIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29sb3I7Ci0gICAgcHJvdGVjdGVkIEZsb2F0IHByaWNlOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbG9yIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0gICAgICAgIHJldHVybiBjb2xvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29sb3IgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuY29sb3IgPSAoKFN0cmluZykgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwcmljZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgRmxvYXQgfQotICAgICAqLwotICAgIHB1YmxpYyBGbG9hdCBnZXRQcmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHByaWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwcmljZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgRmxvYXQgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByaWNlKEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucHJpY2UgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0dyb3VwLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk0NjI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL0dyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YTsKLQotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXMuQXJyYXlPZlBlcnNvbjsKLQotcHVibGljIGNsYXNzIEdyb3VwIHsKLQotICAgIHByb3RlY3RlZCBBcnJheU9mUGVyc29uIG1lbWJlcnM7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlcnMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIEFycmF5T2ZQZXJzb24gZ2V0TWVtYmVycygpIHsKLSAgICAgICAgcmV0dXJuIG1lbWJlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lbWJlcnMgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVtYmVycyhBcnJheU9mUGVyc29uIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWVtYmVycyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9OYW1lLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDNhNjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9QZXJzb24uamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL1BlcnNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjc5MTc0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL1BlcnNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgUGVyc29uIHsKLQotICAgIHByb3RlY3RlZCBEb3VibGUgYWdlOwotICAgIHByb3RlY3RlZCBGbG9hdCBpZDsKLSAgICBwcm90ZWN0ZWQgQm9vbGVhbiBtYWxlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhZ2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIERvdWJsZSB9Ci0gICAgICovCi0gICAgcHVibGljIERvdWJsZSBnZXRBZ2UoKSB7Ci0gICAgICAgIHJldHVybiBhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFnZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgRG91YmxlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBZ2UoRG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuYWdlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBGbG9hdCB9Ci0gICAgICovCi0gICAgcHVibGljIEZsb2F0IGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBGbG9hdCB9Ci0gICAgICovCi0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKEZsb2F0IGlkKSB7Ci0gICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFsZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgQm9vbGVhbiB9Ci0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0TWFsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hbGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIEJvb2xlYW4gfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hbGUoQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hbGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBuYW1lIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvVGFibGUuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWU3ZmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhOwotCi1wdWJsaWMgY2xhc3MgVGFibGUKLSAgICAgICAgZXh0ZW5kcyBGdXJuaXR1cmUgewotCi0gICAgcHJvdGVjdGVkIEludGVnZXIgc2VhdGluZ0NhcGFjaXR5OwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlYXRpbmdDYXBhY2l0eSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgSW50ZWdlciB9Ci0gICAgICovCi0gICAgcHVibGljIEludGVnZXIgZ2V0U2VhdGluZ0NhcGFjaXR5KCkgewotICAgICAgICByZXR1cm4gc2VhdGluZ0NhcGFjaXR5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzZWF0aW5nQ2FwYWNpdHkgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIEludGVnZXIgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlYXRpbmdDYXBhY2l0eShJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuc2VhdGluZ0NhcGFjaXR5ID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZkFycmF5T2ZzdHJpbmcuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mQXJyYXlPZnN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZhZGM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mQXJyYXlPZnN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgQXJyYXlPZkFycmF5T2ZzdHJpbmcgewotCi0gICAgcHJvdGVjdGVkIEFycmF5T2ZzdHJpbmdbXSBhcnJheU9mc3RyaW5nOwotCi0gICAgcHVibGljIEFycmF5T2ZzdHJpbmdbXSBnZXRBcnJheU9mc3RyaW5nKCkgewotICAgICAgICBpZiAoYXJyYXlPZnN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhcnJheU9mc3RyaW5nID0gbmV3IEFycmF5T2ZzdHJpbmdbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXlPZnN0cmluZzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFycmF5T2ZzdHJpbmcoQXJyYXlPZnN0cmluZ1tdIGFycmF5T2ZzdHJpbmcpIHsKLSAgICAgICAgdGhpcy5hcnJheU9mc3RyaW5nID0gYXJyYXlPZnN0cmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZS5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZOdWxsYWJsZU9mZGF0ZVRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkZDM0Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotCi1wdWJsaWMgY2xhc3MgQXJyYXlPZk51bGxhYmxlT2ZkYXRlVGltZSB7Ci0KLSAgICBwcm90ZWN0ZWQgQ2FsZW5kYXJbXSBkYXRlVGltZTsKLQotICAgIHB1YmxpYyBDYWxlbmRhcltdIGdldERhdGVUaW1lKCkgewotICAgICAgICBpZiAoZGF0ZVRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZGF0ZVRpbWUgPSBuZXcgQ2FsZW5kYXJbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZk51bGxhYmxlT2ZkZWNpbWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzg3NGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZOdWxsYWJsZU9mZGVjaW1hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheU9mTnVsbGFibGVPZmRlY2ltYWwgewotCi0gICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWxbXSBkZWNpbWFsOwotCi0gICAgcHVibGljIEJpZ0RlY2ltYWxbXSBnZXREZWNpbWFsKCkgewotICAgICAgICBpZiAoZGVjaW1hbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWNpbWFsID0gbmV3IEJpZ0RlY2ltYWxbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVjaW1hbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNpbWFsKEJpZ0RlY2ltYWxbXSBkZWNpbWFsKSB7Ci0gICAgICAgIHRoaXMuZGVjaW1hbCA9IGRlY2ltYWw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZQZXJzb24uamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTdjZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZQZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5czsKLQotaW1wb3J0IG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5QZXJzb247Ci0KLXB1YmxpYyBjbGFzcyBBcnJheU9mUGVyc29uIHsKLQotICAgIHByb3RlY3RlZCBQZXJzb25bXSBwZXJzb247Ci0KLSAgICBwdWJsaWMgUGVyc29uW10gZ2V0UGVyc29uKCkgewotICAgICAgICBpZiAocGVyc29uID09IG51bGwpIHsKLSAgICAgICAgICAgIHBlcnNvbiA9IG5ldyBQZXJzb25bMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucGVyc29uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBlcnNvbihQZXJzb25bXSBwZXJzb24pewotICAgICAgICB0aGlzLnBlcnNvbiA9cGVyc29uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZhbnlUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZmFueVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiNzYyZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZmFueVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuY29tcGxleC5kYXRhLmFycmF5czsKLQotcHVibGljIGNsYXNzIEFycmF5T2ZhbnlUeXBlIHsKLQotICAgIHByaXZhdGUgT2JqZWN0W10gYW55VHlwZTsKLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBbnlUeXBlKCkgewotICAgICAgICBpZiAoYW55VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhbnlUeXBlID0gbmV3IE9iamVjdFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5hbnlUeXBlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZmludC5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9jb21wbGV4L2RhdGEvYXJyYXlzL0FycmF5T2ZpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmYWQwZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZmludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcHVyaS5jb21wbGV4LmRhdGEuYXJyYXlzOwotCi0KLXB1YmxpYyBjbGFzcyBBcnJheU9maW50IHsKLQotICAgIHByb3RlY3RlZCBJbnRlZ2VyW10gX2ludDsKLQotICAgIHB1YmxpYyBJbnRlZ2VyW10gZ2V0X2ludCgpIHsKLSAgICAgICAgaWYgKF9pbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgX2ludCA9IG5ldyBJbnRlZ2VyWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLl9pbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0X2ludChJbnRlZ2VyW10gX2ludCkgewotICAgICAgICB0aGlzLl9pbnQgPSBfaW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mc2hvcnQuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mc2hvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2YTY1Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZnNob3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheU9mc2hvcnQgewotCi0gICAgcHJvdGVjdGVkIFNob3J0W10gX3Nob3J0OwotCi0gICAgcHVibGljIFNob3J0W10gZ2V0X3Nob3J0KCkgewotICAgICAgICBpZiAoX3Nob3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgIF9zaG9ydCA9IG5ldyBTaG9ydFswXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5fc2hvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0X3Nob3J0KFNob3J0W10gX3Nob3J0KSB7Ci0gICAgICAgIHRoaXMuX3Nob3J0ID0gX3Nob3J0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mc3RyaW5nLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2NvbXBsZXgvZGF0YS9hcnJheXMvQXJyYXlPZnN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDhlNDYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvY29tcGxleC9kYXRhL2FycmF5cy9BcnJheU9mc3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wdXJpLmNvbXBsZXguZGF0YS5hcnJheXM7Ci0KLXB1YmxpYyBjbGFzcyBBcnJheU9mc3RyaW5nIHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBzdHJpbmc7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyaW5nKCkgewotICAgICAgICBpZiAoc3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHN0cmluZyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZ1tdIHN0cmluZykgewotICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2RpZmZlcmVuY2VFbmdpbmUvV1NETENvbnRyb2xsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvZGlmZmVyZW5jZUVuZ2luZS9XU0RMQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGI0ODcwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvZGlmZmVyZW5jZUVuZ2luZS9XU0RMQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuZGlmZmVyZW5jZUVuZ2luZTsNCi0NCi1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkNvbXBhcmlzb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZmVyZW5jZTsNCi0NCi1wdWJsaWMgY2xhc3MgV1NETENvbnRyb2xsZXIgaW1wbGVtZW50cyBDb21wYXJpc29uQ29udHJvbGxlciB7ICAgDQotICAgIHB1YmxpYyBXU0RMQ29udHJvbGxlciAoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgRGlmZmVyZW5jZSB0aGF0IHRoaXMgbGlzdGVuZXIgaGFzIGJlZW4gbm90aWZpZWQgb2YNCi0gICAgICogIHNob3VsZCBoYWx0IGZ1cnRoZXIgWE1MIGNvbXBhcmlzb24uIFRoaXMgaW1wbGVtZW50YXRpb24gaGFsdHMgDQotICAgICAqICBpZiB0aGUgRGlmZmVyZW5jZSBpcyBub3QgcmVjb3ZlcmFibGUuDQotICAgICAqIEBwYXJhbSBhZnRlckRpZmZlcmVuY2UgdGhlIGxhc3QgRGlmZmVyZW5jZSBwYXNzZWQgdG8gPGNvZGU+ZGlmZmVyZW5jZUZvdW5kPC9jb2RlPg0KLSAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBkaWZmZXJlbmNlIGlzIHJlY292ZXJhYmxlLCBvdGhlcndpc2UgcmV0dXJuIHRydWUNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGhhbHRDb21wYXJpc29uKERpZmZlcmVuY2UgYWZ0ZXJEaWZmZXJlbmNlKSB7DQotICAgICAgICBpZiAoYWZ0ZXJEaWZmZXJlbmNlLmlzUmVjb3ZlcmFibGUoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9kaWZmZXJlbmNlRW5naW5lL1dTRExEaWZmZXJlbmNlRW5naW5lLmphdmEgYi8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2RpZmZlcmVuY2VFbmdpbmUvV1NETERpZmZlcmVuY2VFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2MDdkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9pbnRlZ3JhdGlvbi90ZXN0L29yZy90ZW1wdXJpL2RpZmZlcmVuY2VFbmdpbmUvV1NETERpZmZlcmVuY2VFbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcudGVtcHVyaS5kaWZmZXJlbmNlRW5naW5lOw0KLQ0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuQ29tcGFyaXNvbkNvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5EaWZmZXJlbmNlRW5naW5lOw0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZmVyZW5jZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBEaWZmZXJlbmNlRW5naW5lIGNsYXNzIHRvIG92ZXJ3cml0ZSB0aGUgbWV0aG9kcyB0aGF0DQotICogaW5jb3JyZWN0bHkgZmFpbCBEaWZmLnNpbWlsYXIoKSBmb3IgY2VydGFpbiBlcXVpdmFsZW50IGJ1dCBub3QgaWRlbnRpY2FsDQotICogWE1MIGZpbGUgY29tcGFyaXNvbnMuDQotICovDQotcHVibGljIGNsYXNzIFdTRExEaWZmZXJlbmNlRW5naW5lIGV4dGVuZHMgRGlmZmVyZW5jZUVuZ2luZSB7DQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgY29uc3RydWN0b3INCi0gICAgICogQHBhcmFtIGNvbnRyb2xsZXIgdGhlIGluc3RhbmNlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBEaWZmZXJlbmNlDQotICAgICAqICBkZXRlY3RlZCBieSB0aGlzIGNsYXNzIHNob3VsZCBoYWx0IGZ1cnRoZXIgY29tcGFyaXNvbiBvciBub3QNCi0gICAgICogQHNlZSBDb21wYXJpc29uQ29udHJvbGxlciNoYWx0Q29tcGFyaXNvbihEaWZmZXJlbmNlKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExEaWZmZXJlbmNlRW5naW5lKENvbXBhcmlzb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHsNCi0gICAgCXN1cGVyKGNvbnRyb2xsZXIpOw0KLSAgICB9DQotICAgICAgICANCi0gICAgLyoqDQotICAgICAqIENvbXBhcmUgdHdvIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQNCi0gICAgICogQHBhcmFtIGNvbnRyb2wgYSBrbm93biBhdHRyaWJ1dGUgYWdhaW5zdCB3aGljaCBhIHRlc3QgYXR0cmlidXRlIGlzIGJlaW5nIGNvbXBhcmVkDQotICAgICAqIEBwYXJhbSB0ZXN0IHRoZSBnZW5lcmF0ZWQgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgdGVzdGVkIGFnYWluc3QgYSBrbm93biBhdHRyaWJ1dGUNCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIA0KLSAgICAgKiBAdGhyb3dzIERpZmZlcmVuY2VGb3VuZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgZGV0ZWN0ZWQgYmV0d2Vlbg0KLSAgICAgKiAgdGhlIHR3byBhdHRyaWJ1dGVzDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wYXJlQXR0cmlidXRlKEF0dHIgY29udHJvbCwgQXR0ciB0ZXN0LA0KLSAgICBEaWZmZXJlbmNlTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBEaWZmZXJlbmNlRm91bmRFeGNlcHRpb24geyAgICAJDQotICAgIAkvLyBUaGVyZSBhcmUgbm8gZ2V0dGVyIG1ldGhvZHMgZm9yIHRoZXNlIHByaXZhdGUgZmllbGRzIGluIERpZmZlcmVuY2VFbmdpbmUNCi0gICAgCS8vIGNvbnRyb2xUcmFja2VyLnZpc2l0ZWQoY29udHJvbCk7DQotICAgIAkvLyB0ZXN0VHJhY2tlci52aXNpdGVkKHRlc3QpOw0KLSAgICAJDQotICAgIAljb21wYXJlKGNvbnRyb2wuZ2V0UHJlZml4KCksIHRlc3QuZ2V0UHJlZml4KCksIGNvbnRyb2wsIHRlc3QsIA0KLSAgICAJCWxpc3RlbmVyLCBOQU1FU1BBQ0VfUFJFRklYKTsNCi0NCi0gICAgICAgIGNvbXBhcmUoZ2V0VmFsdWVXaXRob3V0TmFtZXNwYWNlKGNvbnRyb2wpLCBnZXRWYWx1ZVdpdGhvdXROYW1lc3BhY2UodGVzdCksIGNvbnRyb2wsIHRlc3QsDQotICAgICAgICAgICAgbGlzdGVuZXIsIEFUVFJfVkFMVUUpOw0KLSAgICAgICAgDQotICAgICAgICBjb21wYXJlKGdldFZhbHVlTmFtZXNwYWNlVVJJKGNvbnRyb2wpLCBnZXRWYWx1ZU5hbWVzcGFjZVVSSSh0ZXN0KSwgY29udHJvbCwgdGVzdCwNCi0gICAgICAgICAgICAgICAgbGlzdGVuZXIsIEFUVFJfVkFMVUUpOyAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGNvbXBhcmUoY29udHJvbC5nZXRTcGVjaWZpZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsDQotICAgICAgICAgICAgdGVzdC5nZXRTcGVjaWZpZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsDQotICAgICAgICAgICAgY29udHJvbCwgdGVzdCwgbGlzdGVuZXIsIEFUVFJfVkFMVUVfRVhQTElDSVRMWV9TUEVDSUZJRUQpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogT2J0YWluIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aXRoIHRoZSBuYW1lc3BhY2UgcHJlZml4IHJlbW92ZWQgKGlmIHByZXNlbnQpDQotICAgICAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyaWJ1dGUgZm9yIHdoaWNoIHRoZSBub24gbmFtZXNwYWNlZCB2YWx1ZSBpcyBzb3VnaHQNCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgd2l0aG91dCBhIG5hbWVzcGFjZSBwcmVmaXgNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVXaXRob3V0TmFtZXNwYWNlKEF0dHIgYXR0cikgew0KLSAgICAJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOw0KLSAgICAJaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOw0KLSAgICAJaW50IHByb3RvY29sID0gdmFsdWUuaW5kZXhPZigiOi8vIik7DQotICAgIAkNCi0gICAgCWlmICh2YWx1ZSA9PSBudWxsKQ0KLSAgICAJCXJldHVybiBudWxsOw0KLSAgICAJDQotICAgIAlpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggPT0gcHJvdG9jb2wpDQotICAgIAkJcmV0dXJuIHZhbHVlOw0KLSAgICAJDQotICAgIAlyZXR1cm4gdmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBPYnRhaW4gdGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHIgKGlmIGEgbmFtZXNwYWNlIHByZWZpeCBpcyBwcmVzZW50KQ0KLSAgICAgKiBAcGFyYW0gYXR0ciB0aGUgYXR0cmlidXRlIGZvciB3aGljaCB0aGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgdmFsdWUgaXMgc291Z2h0DQotICAgICAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGlmIGEgbmFtZXNwYWNlIHByZWZpeCBpcyANCi0gICAgICogIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gbnVsbA0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZU5hbWVzcGFjZVVSSShBdHRyIGF0dHIpIHsNCi0gICAgCVN0cmluZyB2YWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsNCi0gICAgCWludCBpbmRleCA9IHZhbHVlLmluZGV4T2YoJzonKTsNCi0gICAgCWludCBwcm90b2NvbCA9IHZhbHVlLmluZGV4T2YoIjovLyIpOw0KLSAgICAJDQotICAgIAlpZiAodmFsdWUgPT0gbnVsbCB8fCBpbmRleCA9PSAtMSB8fCBpbmRleCA9PSBwcm90b2NvbCkNCi0gICAgCQlyZXR1cm4gbnVsbDsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgTWV0aG9kIG0gPSBBdHRyLmNsYXNzLmdldE1ldGhvZCgibG9va3VwTmFtZXNwYWNlVVJJIiwgbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG0uaW52b2tlKGF0dHIsIG5ldyBPYmplY3RbXXt2YWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpfSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ludGVncmF0aW9uL3Rlc3Qvb3JnL3RlbXB1cmkvZWxlbWVudFF1YWxpZmllci9XU0RMRWxlbWVudFF1YWxpZmllci5qYXZhIGIvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9lbGVtZW50UXVhbGlmaWVyL1dTRExFbGVtZW50UXVhbGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMzQxYTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvaW50ZWdyYXRpb24vdGVzdC9vcmcvdGVtcHVyaS9lbGVtZW50UXVhbGlmaWVyL1dTRExFbGVtZW50UXVhbGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLnRlbXB1cmkuZWxlbWVudFF1YWxpZmllcjsNCi0NCi1pbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkVsZW1lbnRRdWFsaWZpZXI7DQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7DQotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsNCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgdHdvIGVsZW1lbnRzIHNob3VsZCBiZSBjb21wYXJlZA0KLSAqIHdoZW4gY29tcGFyaW5nIFdTREwgZmlsZXMuICBUaGUgbm9kZXMgYXJlIGludGVuZGVkIGZvciBjb21wYXJpc29uIHdoZW4gdGhleSBhcmUgDQotICogZGVmaW5lZCBieSB0aGUgc2FtZSBuYW1lc3BhY2UgVVJJLCBoYXZlIHRoZSBzYW1lIHRhZyBuYW1lICh3aXRob3V0IG5hbWVzcGFjZSksIA0KLSAqIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWUgYXR0cmlidXRlLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXU0RMRWxlbWVudFF1YWxpZmllciBpbXBsZW1lbnRzIEVsZW1lbnRRdWFsaWZpZXIgew0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERldGVybWluZSB3aGV0aGVyIHR3byBlbGVtZW50cyBhcmUgY29tcGFyYWJsZQ0KLSAgICAgKiBAcGFyYW0gY29udHJvbCBhbiBFbGVtZW50IGZyb20gdGhlIGNvbnRyb2wgWE1MIE5vZGVMaXN0DQotICAgICAqIEBwYXJhbSB0ZXN0IGFuIEVsZW1lbnQgZnJvbSB0aGUgdGVzdCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBhcmUgY29tcGFyYWJsZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFR3byANCi0gICAgICogIGVsZW1lbnRzIHNob3VsZCBiZSBjb21wYXJlZCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZXNwYWNlIFVSSSwgdGhlIHNhbWUNCi0gICAgICogIHRhZyBuYW1lICh3aXRoIG5hbWVzcGFjZSBub3QgcHJlc2VudCkgYW5kIHRoZSBzYW1lIG5hbWUgYXR0cmlidXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gcXVhbGlmeUZvckNvbXBhcmlzb24oRWxlbWVudCBjb250cm9sLCBFbGVtZW50IHRlc3QpIHsNCi0gICAgICAgIHJldHVybiBjb250cm9sICE9IG51bGwgDQotICAgICAgICAgICAgJiYgdGVzdCAhPSBudWxsIA0KLSAgICAgICAgICAgICYmIHNhbWVOYW1lc3BhY2VVUkkoY29udHJvbCwgdGVzdCkNCi0gICAgICAgICAgICAmJiBzYW1lVGFnTmFtZShjb250cm9sLCB0ZXN0KQ0KLSAgICAgICAgICAgICYmIHNhbWVOYW1lQXR0cmlidXRlKGNvbnRyb2wsIHRlc3QpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdHdvIG5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlIFVSSSANCi0gICAgICogQHBhcmFtIGNvbnRyb2wgYW4gRWxlbWVudCBmcm9tIHRoZSBjb250cm9sIFhNTCBOb2RlTGlzdA0KLSAgICAgKiBAcGFyYW0gdGVzdCBhbiBFbGVtZW50IGZyb20gdGhlIHRlc3QgWE1MIE5vZGVMaXN0DQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIG5vZGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlIFVSSSwNCi0gICAgICogIG90aGVyd2lzZSByZXR1cm4gZmFsc2UNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBib29sZWFuIHNhbWVOYW1lc3BhY2VVUkkoTm9kZSBjb250cm9sLCBOb2RlIHRlc3QpIHsNCi0gICAgICAgIFN0cmluZyBjb250cm9sTlMgPSBjb250cm9sLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgU3RyaW5nIHRlc3ROUyA9IHRlc3QuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChjb250cm9sTlMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB0ZXN0TlMgPT0gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xOUy5lcXVhbHModGVzdE5TKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERldGVybWluZSB3aGV0aGVyIHR3byBub2RlcyBoYXZlIHRoZSBzYW1lIHRhZyBuYW1lIG9uY2UgYW55IA0KLSAgICAgKiBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgcmVtb3ZlZA0KLSAgICAgKiBAcGFyYW0gY29udHJvbCBhbiBFbGVtZW50IGZyb20gdGhlIGNvbnRyb2wgWE1MIE5vZGVMaXN0DQotICAgICAqIEBwYXJhbSB0ZXN0IGFuIEVsZW1lbnQgZnJvbSB0aGUgdGVzdCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gbm9kZXMgaGF2ZSB0aGUgc2FtZSB0YWcgbmFtZSBub3QgaW5jbHVkaW5nIA0KLSAgICAgKiAgbmFtZXNwYWNlIGluZm9ybWF0aW9uIChpZiBwcmVzZW50KSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQ0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc2FtZVRhZ05hbWUoTm9kZSBjb250cm9sLCBOb2RlIHRlc3QpIHsNCi0gICAgCXJldHVybiBnZXRUYWdXaXRob3V0TmFtZXNwYWNlKGNvbnRyb2wpLmVxdWFscyhnZXRUYWdXaXRob3V0TmFtZXNwYWNlKHRlc3QpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlbW92ZSBhbnkgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGZyb20gYSB0YWcgbmFtZQ0KLSAgICAgKiBAcGFyYW0gbm9kZSBhbiBFbGVtZW50IGZyb20gYW4gWE1MIE5vZGVMaXN0DQotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsTmFtZSBpZiB0aGUgbm9kZSBpbmNsdWRlcyBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIA0KLSAgICAgKiAgb3RoZXJ3aXNlIHJldHVybiB0aGUgbm9kZU5hbWUNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFnV2l0aG91dE5hbWVzcGFjZShOb2RlIG5vZGUpIHsNCi0gICAgICAgIFN0cmluZyBuYW1lID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9IA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERldGVybWluZSB3aGV0aGVyIHR3byBub2RlcyBoYXZlIHRoZSBzYW1lIG5hbWUgYXR0cmlidXRlIA0KLSAgICAgKiBAcGFyYW0gY29udHJvbCBhbiBFbGVtZW50IGZyb20gdGhlIGNvbnRyb2wgWE1MIE5vZGVMaXN0DQotICAgICAqIEBwYXJhbSB0ZXN0IGFuIEVsZW1lbnQgZnJvbSB0aGUgdGVzdCBYTUwgTm9kZUxpc3QNCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gbm9kZXMgaGF2ZSB0aGUgc2FtZSBuYW1lIGF0dHJpYnV0ZSANCi0gICAgICogICh3aXRoIHRoZSBhYnNlbmNlIG9mIGEgbmFtZSBhdHRyaWJ1dGUgY29uc2lkZXJlZCBhIHNwZWNpZmljDQotICAgICAqICBuYW1lIGF0dHJpYnV0ZSksIG90aGVyd2lzZSByZXR1cm4gZmFsc2UNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBib29sZWFuIHNhbWVOYW1lQXR0cmlidXRlKE5vZGUgY29udHJvbCwgTm9kZSB0ZXN0KSB7DQotICAgIAlyZXR1cm4gZ2V0TmFtZUF0dHJpYnV0ZShjb250cm9sKS5lcXVhbHMoZ2V0TmFtZUF0dHJpYnV0ZSh0ZXN0KSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBPYnRhaW4gdGhlIG5hbWUgYXR0cmlidXRlIGZvciB0aGUgbm9kZQ0KLSAgICAgKiBAcGFyYW0gbm9kZSBhbiBFbGVtZW50IGZvciB3aGljaCB0aGUgTmFtZSBhdHRyaWJ1dGUgaXMgc291Z2h0DQotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgYXR0cmlidXRlIGZvciB0aGUgbm9kZSBpZiB0aGUgIm5hbWUiIGF0dHJpYnV0ZQ0KLSAgICAgKiAgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuICIiDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVBdHRyaWJ1dGUoTm9kZSBub2RlKSB7DQotICAgICAgICBOYW1lZE5vZGVNYXAgbm5NYXAgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG5uTWFwLmdldExlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIE5vZGUgbmFtZUF0dHJOb2RlID0gbm5NYXAuZ2V0TmFtZWRJdGVtKCJuYW1lIik7DQotICAgICAgICBpZiAobmFtZUF0dHJOb2RlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBuYW1lQXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7DQotICAgIH0gDQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9wb20ueG1sIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWRjYzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKYXZhMldTREw8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlRvIGdlbmVyYXRlIFdTREwgZmlsZSBmb3IgYSBnaXZlbiBKYXZhIGNsYXNzPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPCEtLSBleHRlcm5hbCBKQVJzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS1hZGRlZCB0aGlzIHRvIHN1cHBvcnQgdG8ga2VlcCBXU0RMIGluZm9ybWF0aW9uIGluIEF4aXNTZXJ2aWNlLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhhbGFuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGFsYW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9qYXZhMndzZGw8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9qYXZhMndzZGw8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2phdmEyd3NkbDwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypBYnN0cmFjdCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETC5qYXZhIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMzU5Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETE9wdGlvbnNWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTREwgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvblBhcnNlciBjb21tYW5kTGluZU9wdGlvblBhcnNlciA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvblBhcnNlcigKLSAgICAgICAgICAgICAgICBhcmdzKTsKLSAgICAgICAgLy8gIHZhbGlkYXRlIHRoZSBhcmd1bWVudHMKLSAgICAgICAgdmFsaWRhdGVDb21tYW5kTGluZU9wdGlvbnMoY29tbWFuZExpbmVPcHRpb25QYXJzZXIpOwotICAgICAgICBKYXZhMldTRExDb2RlZ2VuRW5naW5lIGVuZ2luZSA9IG5ldyBKYXZhMldTRExDb2RlZ2VuRW5naW5lKGNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyLmdldEFsbE9wdGlvbnMoKSk7Ci0gICAgICAgIGVuZ2luZS5nZW5lcmF0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhMndzZGwgW29wdGlvbnNdIC1jbiA8ZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU+Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG53aGVyZSBbb3B0aW9uc10gaW5jbHVkZToiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1vIDxvdXRwdXQgbG9jYXRpb24+ICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZGlyZWN0b3J5Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtb2YgPG91dHB1dCBmaWxlIG5hbWU+ICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUgbmFtZSBmb3IgdGhlIFdTREwiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1zbiA8c2VydmljZSBuYW1lPiAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIG5hbWUiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1sIDxzb2FwIGFkZHJlc3M+ICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG9mIHRoZSBwb3J0IGZvciB0aGUgV1NETCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWNwIDxjbGFzcyBwYXRoIHVyaT4gICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgY2xhc3NwYXRoIGVudHJpZXMgLSAodXJscykiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC10biA8dGFyZ2V0IG5hbWVzcGFjZT4gICAgICAgICAgICAgICAgICB0YXJnZXQgbmFtZXNwYWNlIGZvciBzZXJ2aWNlIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtdHAgPHRhcmdldCBuYW1lc3BhY2UgcHJlZml4PiAgICAgICAgICAgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXggZm9yIHNlcnZpY2UiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1zdG4gPHNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlPiAgICAgICAgICB0YXJnZXQgbmFtZXNwYWNlIGZvciBzY2hlbWEiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1zdHAgPHNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeD4gICB0YXJnZXQgbmFtZXNwYWNlIHByZWZpeCBmb3Igc2NoZW1hIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtc3QgPGJpbmRpbmcgc3R5bGU+ICAgICAgICAgICAgICAgICAgICAgc3R5bGUgZm9yIHRoZSBXU0RMIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtdSA8YmluZGluZyB1c2U+ICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGZvciB0aGUgV1NETCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLW5zZyA8Y2xhc3MgbmFtZT4gICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIE5hbWVzcGFjZUdlbmVyYXRvciIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXNnIDxjbGFzcyBuYW1lPiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIFNjaGVtYUdlbmVyYXRvciIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXAybiBbPGphdmEgcGFja2FnZT4sPG5hbWVzcGFjZV0gWzxqYXZhIHBhY2thZ2U+LDxuYW1lc3BhY2VdLi4uICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEgcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZyBmb3IgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLXAybiBbYWxsLCA8bmFtZXNwYWNlPl0gICAgICAgICAgICAgICAgIHRvIGFzc2lnbiBhbGwgdHlwZXMgdG8gYSBzaW5nbGUgbmFtZXNwYWNlIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtZWZkIDxxdWFsaWZpZWQvdW5xdWFsaWZpZWQ+ICAgICAgICAgICAgc2V0dGluZyBmb3IgZWxlbWVudEZvcm1EZWZhdWx0IChkZWZhdWx0cyB0byBxdWFsaWZpZWQpIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtYWZkIDxxdWFsaWZpZWQvdW5xdWFsaWZpZWQ+ICAgICAgICAgICAgc2V0dGluZyBmb3IgYXR0cmlidXRlRm9ybURlZmF1bHQgKGRlZmF1bHRzIHRvIHF1YWxpZmllZCkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC14YyBjbGFzczEgLXhjIGNsYXNzMi4uLiAgICAgICAgICAgICAgICBleHRyYSBjbGFzcyhlcykgZm9yIHdoaWNoIHNjaGVtYXR5cGUgbXVzdCBiZSBnZW5lcmF0ZWQuICAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC13diA8MS4xLzIuMD4gICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsIHZlcnNpb24gLSBkZWZhdWx0cyB0byAxLjEgaWYgbm90IHNwZWNpZmllZCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRsYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIHNjaGVtYXMgY29uZm9ybWluZyB0byBkb2MvbGl0L2JhcmUgc3R5bGUiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ29tbWFuZExpbmVPcHRpb25zKAotICAgICAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIgcGFyc2VyKSB7Ci0gICAgICAgIGlmIChwYXJzZXIuZ2V0QWxsT3B0aW9ucygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmdldEludmFsaWRPcHRpb25zKG5ldyBKYXZhMldTRExPcHRpb25zVmFsaWRhdG9yKCkpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTRExCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjc0ZGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTRExCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTJXU0RMMTE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTJXU0RMMjA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkRlZmF1bHRTY2hlbWFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuRG9jTGl0QmFyZVNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuTmFtZXNwYWNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLlNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MUHJldHR5UHJpbnRlcjsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExCdWlsZGVyIGltcGxlbWVudHMgSmF2YTJXU0RMQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9ICJhbGwiOwotCXByaXZhdGUgT3V0cHV0U3RyZWFtIG91dDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQlwcml2YXRlIFN0cmluZyB3c2RsUHJlZml4ID0gIndzZGwiOwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotCi0JLy8gdGhlc2UgYXBwbHkgZm9yIHRoZSBXU0RMCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgYXR0ckZvcm1EZWZhdWx0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzdHlsZSA9IEphdmEyV1NETENvbnN0YW50cy5ET0NVTUVOVDsKLQlwcml2YXRlIFN0cmluZyB1c2UgPSBKYXZhMldTRExDb25zdGFudHMuTElURVJBTDsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVyaTsKLQlwcml2YXRlIEFycmF5TGlzdCBleHRyYUNsYXNzZXM7Ci0KLQlwcml2YXRlIFN0cmluZyBuc0dlbkNsYXNzTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgcGtnMm5zTWFwID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcHJldHR5ID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyB3c2RsVmVyc2lvbiA9IFdTRExfVkVSU0lPTl8xOwotCXByaXZhdGUgU3RyaW5nIHNjaGVtYUdlbkNsYXNzTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlRG9jTGl0QmFyZSA9IGZhbHNlOwotCXByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLSAgICBwcml2YXRlIFN0cmluZyBjdXN0b21TY2hlbWFMb2NhdGlvbjsKLSAgICAvLyBsb2NhdGlvbiBvZiB0aGUgY2xhc3MgbmFtZSB0byBwYWNrYWdlIG1hcHBpbmcgZmlsZQotICAgIC8vIEZpbGUgaXMgc2ltcGxlIGZpbGUgd2l0aCBxdWFsaWZpZWRDbGFzc05hbWU6U2NoZW1hUU5hbWUKLSAgICBwcml2YXRlIFN0cmluZyBtYXBwaW5nRmlsZUxvY2F0aW9uOwotICAgIHByaXZhdGUgSGFzaE1hcCBtZXNzYWdlUmVjZWl2ZXJzID0gbnVsbDsKLQotICAgIHB1YmxpYyBKYXZhMldTRExCdWlsZGVyKCkgewotCQl0cnkgewotCQkJQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0JCQkJCS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQkJCWF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIEphdmEyV1NETEJ1aWxkZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotCQl0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlnOwotCX0KLQotCXB1YmxpYyBKYXZhMldTRExCdWlsZGVyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQl0cnkgewotCQkJQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0JCQkJCS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLQkJCWF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJCXRoaXMub3V0ID0gb3V0OwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQl0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotICAgIHB1YmxpYyBKYXZhMldTRExCdWlsZGVyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIEhhc2hNYXAgbWVzc2FnZVJlY2VpdmVycykgewotICAgICAgICB0aGlzKG91dCwgY2xhc3NOYW1lLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVycyA9IG1lc3NhZ2VSZWNlaXZlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHNjaGVtYVRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0JCQlzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBKYXZhMldTRExVdGlscwotCQkJCQkuc2NoZW1hTmFtZXNwYWNlRnJvbUNsYXNzTmFtZShjbGFzc05hbWUsIGNsYXNzTG9hZGVyLAotCQkJCQkJCXJlc29sdmVOU0dlbigpKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzY2hlbWFUYXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHlsZSgpIHsKLQkJcmV0dXJuIHN0eWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VcmkoKSB7Ci0JCXJldHVybiBsb2NhdGlvblVyaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVyaShTdHJpbmcgbG9jYXRpb25VcmkpIHsKLQkJdGhpcy5sb2NhdGlvblVyaSA9IGxvY2F0aW9uVXJpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0eWxlKFN0cmluZyBzdHlsZSkgewotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKSB7Ci0JCXJldHVybiB1c2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlKFN0cmluZyB1c2UpIHsKLQkJdGhpcy51c2UgPSB1c2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBzY2hlbWFUYXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWFUYXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0JCWlmIChzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXggPT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXggPSBTQ0hFTUFfTkFNRVNQQUNFX1BSRklYOwotCQl9Ci0JCXJldHVybiBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KAotCQkJU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCkgewotCQl0aGlzLnNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCA9IHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpIHsKLQkJaWYgKHRhcmdldE5hbWVzcGFjZVByZWZpeCA9PSBudWxsKSB7Ci0JCQl0aGlzLnRhcmdldE5hbWVzcGFjZVByZWZpeCA9IFRBUkdFVE5BTUVTUEFDRV9QUkVGSVg7Ci0JCX0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZVByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoU3RyaW5nIHRhcmdldE5hbWVzcGFjZVByZWZpeCkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZVByZWZpeCA9IHRhcmdldE5hbWVzcGFjZVByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gc2VydmljZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCXRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxQcmVmaXgoKSB7Ci0JCXJldHVybiB3c2RsUHJlZml4OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdzZGxQcmVmaXgoU3RyaW5nIHdzZGxQcmVmaXgpIHsKLQkJdGhpcy53c2RsUHJlZml4ID0gd3NkbFByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlRG9jTGl0QmFyZSgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlRG9jTGl0QmFyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZURvY0xpdEJhcmUoYm9vbGVhbiBnZW5lcmF0ZURvY0xpdEJhcmUpIHsKLQkJdGhpcy5nZW5lcmF0ZURvY0xpdEJhcmUgPSBnZW5lcmF0ZURvY0xpdEJhcmU7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSByZXNvbHZlU2NoZW1hR2VuKGNsYXNzTG9hZGVyLAotCQkJCWNsYXNzTmFtZSwgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCksCi0JCQkJZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotCi0JCUFycmF5TGlzdCBleGNsdWRlZE9wZXJhdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJVXRpbHMuYWRkRXhjbHVkZU1ldGhvZHMoZXhjbHVkZWRPcGVyYXRpb24pOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0RXhjbHVkZU1ldGhvZHMoZXhjbHVkZWRPcGVyYXRpb24pOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0QXR0ckZvcm1EZWZhdWx0KGdldEF0dHJGb3JtRGVmYXVsdCgpKTsKLQkJc2NoZW1hR2VuZXJhdG9yLnNldEVsZW1lbnRGb3JtRGVmYXVsdChnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCXNjaGVtYUdlbmVyYXRvci5zZXRFeHRyYUNsYXNzZXMoZ2V0RXh0cmFDbGFzc2VzKCkpOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0TnNHZW4ocmVzb2x2ZU5TR2VuKCkpOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0UGtnMm5zbWFwKGdldFBrZzJuc01hcCgpKTsKLSAgICAgICAgc2NoZW1hR2VuZXJhdG9yLnNldE1hcHBpbmdGaWxlTG9jYXRpb24oZ2V0TWFwcGluZ0ZpbGVMb2NhdGlvbigpKTsKLSAgICAgICAgc2NoZW1hR2VuZXJhdG9yLnNldEN1c3RvbVNjaGVtYUxvY2F0aW9uKGdldEN1c3RvbVNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgICBpZiAoZ2V0UGtnMm5zTWFwKCkgIT0gbnVsbAotCQkJCSYmICFnZXRQa2cybnNNYXAoKS5pc0VtcHR5KCkKLQkJCQkmJiAoZ2V0UGtnMm5zTWFwKCkuY29udGFpbnNLZXkoQUxMKSB8fCBnZXRQa2cybnNNYXAoKQotCQkJCQkJLmNvbnRhaW5zS2V5KEFMTC50b1VwcGVyQ2FzZSgpKSkpIHsKLQkJCXNjaGVtYUdlbmVyYXRvci5zZXRVc2VXU0RMVHlwZXNOYW1lc3BhY2UodHJ1ZSk7Ci0JCX0KLQotICAgICAgICBpZihtZXNzYWdlUmVjZWl2ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VSZWNlaXZlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgQ2xhc3MgaW5Pbmx5TWVzc2FnZVJlY2VpdmVyID0gTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgIC5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiKTsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIgPSAoTWVzc2FnZVJlY2VpdmVyKSBpbk9ubHlNZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXJzLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksIG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICBDbGFzcyBpbm91dE1lc3NhZ2VSZWNlaXZlciA9IExvYWRlcgotICAgICAgICAgICAgICAgICAgICAubG9hZENsYXNzKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgaW5PdXRtZXNzYWdlUmVjZWl2ZXIgPSAoTWVzc2FnZVJlY2VpdmVyKSBpbm91dE1lc3NhZ2VSZWNlaXZlcgotICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VSZWNlaXZlcnMucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICAgICBpbk91dG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0QXhpc1NlcnZpY2Uoc2VydmljZSk7Ci0JCUF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShjbGFzc05hbWUsCi0JCQkJc2VydmljZU5hbWUgPT0gbnVsbCA/IEphdmEyV1NETFV0aWxzCi0JCQkJCQkuZ2V0U2ltcGxlQ2xhc3NOYW1lKGNsYXNzTmFtZSkgOiBzZXJ2aWNlTmFtZSwKLQkJCQlheGlzQ29uZmlnLCBtZXNzYWdlUmVjZWl2ZXJzLAotCQkJCXRhcmdldE5hbWVzcGFjZSA9PSBudWxsID8gSmF2YTJXU0RMVXRpbHMKLQkJCQkJCS5uYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIsCi0JCQkJCQkJCXJlc29sdmVOU0dlbigpKS50b1N0cmluZygpIDogdGFyZ2V0TmFtZXNwYWNlLAotCQkJCWNsYXNzTG9hZGVyLCBzY2hlbWFHZW5lcmF0b3IsIHNlcnZpY2UpOwotCQlzY2hlbWFHZW5lcmF0b3Iuc2V0QXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotCQlheGlzU2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoZ2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotCQlheGlzU2VydmljZS5zZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkpOwotCQlheGlzU2VydmljZQotCQkJCS5zZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotCQlTdHJpbmcgdXJpID0gbG9jYXRpb25Vcmk7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJdXJpID0gREVGQVVMVF9MT0NBVElPTl9VUkwKLQkJCQkJKyAoc2VydmljZU5hbWUgPT0gbnVsbCA/IEphdmEyV1NETFV0aWxzCi0JCQkJCQkJLmdldFNpbXBsZUNsYXNzTmFtZShjbGFzc05hbWUpIDogc2VydmljZU5hbWUpOwotCQl9Ci0JCS8vIGF4aXNTZXJ2aWNlLnNldEVQUnMobmV3IFN0cmluZ1tde3VyaX0pOwotCQlzZXRTZXJ2aWNlRVBSKGF4aXNTZXJ2aWNlLCB1cmkpOwotCQlheGlzQ29uZmlnLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0JCWlmIChXU0RMX1ZFUlNJT05fMS5lcXVhbHMod3NkbFZlcnNpb24pKSB7Ci0JCQlBeGlzU2VydmljZTJXU0RMMTEgZyA9IG5ldyBBeGlzU2VydmljZTJXU0RMMTEoYXhpc1NlcnZpY2UpOwotCQkJZy5zZXRTdHlsZSh0aGlzLnN0eWxlKTsKLQkJCWcuc2V0VXNlKHRoaXMudXNlKTsKLQkJCU9NRWxlbWVudCB3c2RsRWxlbWVudCA9IGcuZ2VuZXJhdGVPTSgpOwotCQkJaWYgKCFpc1ByZXR0eSgpKSB7Ci0JCQkJd3NkbEVsZW1lbnQuc2VyaWFsaXplKG91dCk7Ci0JCQl9IGVsc2UgewotCQkJCVhNTFByZXR0eVByaW50ZXIucHJldHRpZnkod3NkbEVsZW1lbnQsIG91dCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlBeGlzU2VydmljZTJXU0RMMjAgZyA9IG5ldyBBeGlzU2VydmljZTJXU0RMMjAoYXhpc1NlcnZpY2UpOwotCQkJT01FbGVtZW50IHdzZGxFbGVtZW50ID0gZy5nZW5lcmF0ZU9NKCk7Ci0JCQlpZiAoIWlzUHJldHR5KCkpIHsKLQkJCQl3c2RsRWxlbWVudC5zZXJpYWxpemUob3V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJWE1MUHJldHR5UHJpbnRlci5wcmV0dGlmeSh3c2RsRWxlbWVudCwgb3V0KTsKLQkJCX0KLQkJfQotCQkKLQkJb3V0LmZsdXNoKCk7Ci0JCW91dC5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gYXR0ckZvcm1EZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJGb3JtRGVmYXVsdChTdHJpbmcgYXR0ckZvcm1EZWZhdWx0KSB7Ci0JCXRoaXMuYXR0ckZvcm1EZWZhdWx0ID0gYXR0ckZvcm1EZWZhdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gZWxlbWVudEZvcm1EZWZhdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRGb3JtRGVmYXVsdChTdHJpbmcgZWxlbWVudEZvcm1EZWZhdWx0KSB7Ci0JCXRoaXMuZWxlbWVudEZvcm1EZWZhdWx0ID0gZWxlbWVudEZvcm1EZWZhdWx0OwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RXh0cmFDbGFzc2VzKCkgewotCQlyZXR1cm4gZXh0cmFDbGFzc2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dHJhQ2xhc3NlcyhBcnJheUxpc3QgZXh0cmFDbGFzc2VzKSB7Ci0JCXRoaXMuZXh0cmFDbGFzc2VzID0gZXh0cmFDbGFzc2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TnNHZW5DbGFzc05hbWUoKSB7Ci0JCXJldHVybiBuc0dlbkNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROc0dlbkNsYXNzTmFtZShTdHJpbmcgbnNHZW5DbGFzc05hbWUpIHsKLQkJdGhpcy5uc0dlbkNsYXNzTmFtZSA9IG5zR2VuQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hR2VuQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gc2NoZW1hR2VuQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbkNsYXNzTmFtZShTdHJpbmcgc2NoZW1hR2VuQ2xhc3NOYW1lKSB7Ci0JCXRoaXMuc2NoZW1hR2VuQ2xhc3NOYW1lID0gc2NoZW1hR2VuQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0UGtnMm5zTWFwKCkgewotCQlyZXR1cm4gcGtnMm5zTWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrZzJuc01hcChNYXAgcGtnMm5zTWFwKSB7Ci0JCXRoaXMucGtnMm5zTWFwID0gcGtnMm5zTWFwOwotCX0KLQotCXByaXZhdGUgTmFtZXNwYWNlR2VuZXJhdG9yIHJlc29sdmVOU0dlbigpIHsKLQkJTmFtZXNwYWNlR2VuZXJhdG9yIG5zR2VuOwotCQlpZiAodGhpcy5uc0dlbkNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQluc0dlbiA9IG5ldyBEZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCW5zR2VuID0gKE5hbWVzcGFjZUdlbmVyYXRvcikgQ2xhc3MuZm9yTmFtZSh0aGlzLm5zR2VuQ2xhc3NOYW1lKQotCQkJCQkJLm5ld0luc3RhbmNlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCW5zR2VuID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnNHZW47Ci0JfQotCi0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0b3IgcmVzb2x2ZVNjaGVtYUdlbihDbGFzc0xvYWRlciBsb2FkZXIsCi0JCQlTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLAotCQkJU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW47Ci0JCWlmICh0aGlzLnNjaGVtYUdlbkNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2VuZXJhdGVEb2NMaXRCYXJlKSB7Ci0JCQkJc2NoZW1hR2VuID0gbmV3IERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3IobG9hZGVyLCBjbGFzc05hbWUsCi0JCQkJCQlzY2hlbWF0YXJnZXROYW1lc3BhY2UsIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCwKLQkJCQkJCW51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlzY2hlbWFHZW4gPSBuZXcgRGVmYXVsdFNjaGVtYUdlbmVyYXRvcihsb2FkZXIsIGNsYXNzTmFtZSwKLQkJCQkJCXNjaGVtYXRhcmdldE5hbWVzcGFjZSwgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4LAotCQkJCQkJbnVsbCk7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHRoaXMuc2NoZW1hR2VuQ2xhc3NOYW1lKTsKLQkJCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsKLQkJCQkJCUNsYXNzTG9hZGVyLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywKLQkJCQkJCVN0cmluZy5jbGFzcyB9KTsKLQkJCQlzY2hlbWFHZW4gPSAoU2NoZW1hR2VuZXJhdG9yKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IGxvYWRlciwgY2xhc3NOYW1lLAotCQkJCQkJCQlzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0JCQkJCQkJCXNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCB9KTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGdlbmVyYXRlRG9jTGl0QmFyZSkgewotCQkJCQlzY2hlbWFHZW4gPSBuZXcgRG9jTGl0QmFyZVNjaGVtYUdlbmVyYXRvcihsb2FkZXIsCi0JCQkJCQkJY2xhc3NOYW1lLCBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0JCQkJCQkJc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4LCBudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzY2hlbWFHZW4gPSBuZXcgRGVmYXVsdFNjaGVtYUdlbmVyYXRvcihsb2FkZXIsIGNsYXNzTmFtZSwKLQkJCQkJCQlzY2hlbWF0YXJnZXROYW1lc3BhY2UsIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCwKLQkJCQkJCQludWxsKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2NoZW1hR2VuOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJldHR5KCkgewotCQlyZXR1cm4gcHJldHR5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXR0eShib29sZWFuIHByZXR0eSkgewotCQl0aGlzLnByZXR0eSA9IHByZXR0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXU0RMVmVyc2lvbihTdHJpbmcgd3NkbFZlcnNpb24pIHsKLQkJdGhpcy53c2RsVmVyc2lvbiA9IHdzZGxWZXJzaW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZXJ2aWNlRVBSKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBTdHJpbmcgdXJsU3RyaW5nKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCVV0aWxzLmFkZFNvYXAxMUVuZHBvaW50KGF4aXNTZXJ2aWNlLCB1cmwpOwotCQlVdGlscy5hZGRTb2FwMTJFbmRwb2ludChheGlzU2VydmljZSwgdXJsKTsKLQkJCi0JCVN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotCQlpZiAoImh0dHAiLmVxdWFscyhwcm90b2NvbCkpIHsKLQkJCVV0aWxzLmFkZEh0dHBFbmRwb2ludChheGlzU2VydmljZSwgdXJsKTsKLQkJfQotCX0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21TY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbVNjaGVtYUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVNjaGVtYUxvY2F0aW9uKFN0cmluZyBjdXN0b21TY2hlbWFMb2NhdGlvbikgewotICAgICAgICB0aGlzLmN1c3RvbVNjaGVtYUxvY2F0aW9uID0gY3VzdG9tU2NoZW1hTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRmlsZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZ0ZpbGVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRmlsZUxvY2F0aW9uKFN0cmluZyBtYXBwaW5nRmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubWFwcGluZ0ZpbGVMb2NhdGlvbiA9IG1hcHBpbmdGaWxlTG9jYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9KYXZhMldTRExDb2RlZ2VuRW5naW5lLmphdmEgYi8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETENvZGVnZW5FbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5M2QxMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETENvZGVnZW5FbmdpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExDb2RlZ2VuRW5naW5lIGltcGxlbWVudHMgSmF2YTJXU0RMQ29uc3RhbnRzIHsKLSAgICBwcml2YXRlIEphdmEyV1NETEJ1aWxkZXIgamF2YTJXc2RsQnVpbGRlcjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVOQU1FX1NVRkZJWCA9ICIud3NkbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCI7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZShNYXAgb3B0aW9uc01hcCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vY3JlYXRlIGEgbmV3ICBKYXZhMldTRExCdWlsZGVyIGFuZCBwb3B1bGF0ZSBpdAotICAgICAgICBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5DTEFTU05BTUVfT1BUSU9OLCBKYXZhMldTRExDb25zdGFudHMuQ0xBU1NOQU1FX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IG9wdGlvbiA9PSBudWxsID8gbnVsbCA6IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiY2xhc3MgbmFtZSBtdXN0IGJlIHByZXNlbnQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL05vdyB3ZSBhcmUgZG9uZSB3aXRoIGxvYWRpbmcgdGhlIGJhc2ljIHZhbHVlcyAtIHRpbWUgdG8gY3JlYXRlIHRoZSBidWlsZGVyCi0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIgPSBuZXcgSmF2YTJXU0RMQnVpbGRlcihyZXNvbHZlT3V0cHV0U3RyZWFtKGNsYXNzTmFtZSwgb3B0aW9uc01hcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3NMb2FkZXIob3B0aW9uc01hcCkpOwotICAgICAgICAKLSAgICAgICAgY29uZmlndXJlSmF2YTJXU0RMQnVpbGRlcihvcHRpb25zTWFwLCBjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIHJlc29sdmVPdXRwdXRTdHJlYW0oU3RyaW5nIGNsYXNzTmFtZSwgTWFwIG9wdGlvbnNNYXApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIFN0cmluZyBvdXRwdXRGb2xkZXJOYW1lID0gb3B0aW9uID09IG51bGwgPyBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLQotICAgICAgICBGaWxlIG91dHB1dEZvbGRlcjsKLSAgICAgICAgb3V0cHV0Rm9sZGVyID0gbmV3IEZpbGUob3V0cHV0Rm9sZGVyTmFtZSk7Ci0gICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXJzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW91dHB1dEZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc3BlY2l2aWVkIGxvY2F0aW9uICIgKyBvdXRwdXRGb2xkZXJOYW1lICsgImlzIG5vdCBhIGZvbGRlciIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfRklMRU5BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfRklMRU5BTUVfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKTsKLSAgICAgICAgLy9kZXJpdmUgYSBmaWxlIG5hbWUgZnJvbSB0aGUgY2xhc3MgbmFtZSBpZiB0aGUgZmlsZW5hbWUgaXMgbm90IHNwZWNpZmllZAotICAgICAgICBpZiAob3V0cHV0RmlsZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0RmlsZU5hbWUgPSBKYXZhMldTRExVdGlscy5nZXRTaW1wbGVDbGFzc05hbWUoY2xhc3NOYW1lKSArIFdTRExfRklMRU5BTUVfU1VGRklYOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8vZmlyc3QgY3JlYXRlIGEgZmlsZSBpbiB0aGUgZ2l2ZW4gbG9jYXRpb24KLSAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0Rm9sZGVyLCBvdXRwdXRGaWxlTmFtZSk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFvdXRwdXRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciByZXNvbHZlQ2xhc3NMb2FkZXIoTWFwIG9wdGlvbnNNYXApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIGlmIHRoZSBjbGFzcyBwYXRoIGlzIHByZXNlbnQsIGNyZWF0ZSBhIFVSTCBjbGFzcyBsb2FkZXIgd2l0aCB0aG9zZQotICAgICAgICAvL2NsYXNzIHBhdGggZW50cmllcyBwcmVzZW50LiBpZiBub3QganVzdCB0YWtlIHRoZSAgVENDTAotICAgICAgICBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5DTEFTU1BBVEhfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DTEFTU1BBVEhfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgQXJyYXlMaXN0IG9wdGlvblZhbHVlcyA9IG9wdGlvbi5nZXRPcHRpb25WYWx1ZXMoKTsKLSAgICAgICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMW29wdGlvblZhbHVlcy5zaXplKCldOwotICAgICAgICAgICAgU3RyaW5nW10gY2xhc3NQYXRoRW50cmllcyA9IChTdHJpbmdbXSkgb3B0aW9uVmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1tvcHRpb25WYWx1ZXMuc2l6ZSgpXSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc1BhdGhFbnRyeSA9IGNsYXNzUGF0aEVudHJpZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmKGNsYXNzUGF0aEVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgYSBmaWxlKG9yIGEgVVJMKQotICAgICAgICAgICAgICAgICAgICBpZiAoSmF2YTJXU0RMVXRpbHMuaXNVUkwoY2xhc3NQYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IFVSTChjbGFzc1BhdGhFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IEZpbGUoY2xhc3NQYXRoRW50cnkpLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlSmF2YTJXU0RMQnVpbGRlcihNYXAgb3B0aW9uc01hcCwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy9zZXQgdGhlIG90aGVyIHBhcmFtZXRlcnMgdG8gdGhlIGJ1aWxkZXIKLSAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKG9wdGlvbiA9PSBudWxsID8gbnVsbCA6IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLQotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeChvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFRhcmdldE5hbWVzcGFjZShvcHRpb24gPT0gbnVsbCA/IG51bGwgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KG9wdGlvbiA9PSBudWxsID8gbnVsbCA6IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLQotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OX0xPTkcsIG9wdGlvbnNNYXApOwotICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFNlcnZpY2VOYW1lKG9wdGlvbiA9PSBudWxsID8gSmF2YTJXU0RMVXRpbHMuZ2V0U2ltcGxlQ2xhc3NOYW1lKGNsYXNzTmFtZSkgOiBvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuU1RZTEVfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TVFlMRV9PUFRJT04sIG9wdGlvbnNNYXApOwotICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0U3R5bGUob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5MT0NBVElPTl9PUFRJT04sIG9wdGlvbnNNYXApOwotICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0TG9jYXRpb25Vcmkob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuVVNFX09QVElPTiwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVVNFX09QVElPTiwgb3B0aW9uc01hcCk7Ci0gICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRVc2Uob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5BVFRSX0ZPUk1fREVGQVVMVF9PUFRJT04sCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFUVFJfRk9STV9ERUZBVUxUX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRBdHRyRm9ybURlZmF1bHQob3B0aW9uID09IG51bGwgPyBudWxsIDogb3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuRUxFTUVOVF9GT1JNX0RFRkFVTFRfT1BUSU9OLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FTEVNRU5UX0ZPUk1fREVGQVVMVF9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0RWxlbWVudEZvcm1EZWZhdWx0KG9wdGlvbiA9PSBudWxsID8gbnVsbCA6IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLkVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0RXh0cmFDbGFzc2VzKG9wdGlvbiA9PSBudWxsID8gbmV3IEFycmF5TGlzdCgpIDogb3B0aW9uLmdldE9wdGlvblZhbHVlcygpKTsKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9HRU5FUkFUT1JfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5OQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTl9MT05HLCBvcHRpb25zTWFwKTsKLSAgICAgICAgaWYgKCBvcHRpb24gIT0gbnVsbCApIHsKLSAgICAgICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0TnNHZW5DbGFzc05hbWUob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfR0VORVJBVE9SX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX0dFTkVSQVRPUl9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGlmICggb3B0aW9uICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFNjaGVtYUdlbkNsYXNzTmFtZShvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5KQVZBX1BLR18yX05TTUFQX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuSkFWQV9QS0dfMl9OU01BUF9PUFRJT05fTE9ORywgb3B0aW9uc01hcCk7Ci0gICAgICAgIGphdmEyV3NkbEJ1aWxkZXIuc2V0UGtnMm5zTWFwKGxvYWRKYXZhUGtnMk5hbWVzcGFjZU1hcChvcHRpb24pKTsKLQotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXApOwotICAgICAgICBpZiAob3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBvcHRpb25WYWx1ZSA9IG9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotICAgICAgICAgICAgaWYgKEphdmEyV1NETENvbnN0YW50cy5XU0RMX1ZFUlNJT05fMi5lcXVhbHMob3B0aW9uVmFsdWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5XU0RMX1ZFUlNJT05fMl9PUFRJT05BTC5lcXVhbHMob3B0aW9uVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy91c2VycyBjYW4gc2F5IGVpdGhlciAyLjAgb3IgMiAtIHdlICBqdXN0IHNldCBpdCB0byB0aGUgY29uc3RhbnQKLSAgICAgICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldFdTRExWZXJzaW9uKEphdmEyV1NETENvbnN0YW50cy5XU0RMX1ZFUlNJT05fMik7Ci0gICAgICAgICAgICB9IC8vaWdub3JlIHRoZSBvdGhlciBjYXNlcyAtIHRoZXknbGwgYmUgdGFrZW4gYXMgMS4xCi0gICAgICAgIH0KLQotICAgICAgICBvcHRpb24gPSBsb2FkT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwKTsKLSAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldEdlbmVyYXRlRG9jTGl0QmFyZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvbiA9IGxvYWRPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLkNVU1RPTV9TQ0hFTUFfTE9DQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ1VTVE9NX1NDSEVNQV9MT0NBVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcCk7Ci0gICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgamF2YTJXc2RsQnVpbGRlci5zZXRDdXN0b21TY2hlbWFMb2NhdGlvbihvcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3B0aW9uID0gbG9hZE9wdGlvbihKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX01BUFBJTkdfRklMRV9MT0NBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfTUFQUElOR19GSUxFX0xPQ0FUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwKTsKLSAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBqYXZhMldzZGxCdWlsZGVyLnNldE1hcHBpbmdGaWxlTG9jYXRpb24ob3B0aW9uLmdldE9wdGlvblZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gbG9hZE9wdGlvbihTdHJpbmcgc2hvcnRPcHRpb24sIFN0cmluZyBsb25nT3B0aW9uLCBNYXAgb3B0aW9ucykgewotICAgICAgICAvL3Nob3J0IG9wdGlvbiBnZXRzIHByZWNlZGVuY2UKLSAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gb3B0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGxvbmdPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uID0gKEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKSBvcHRpb25zLmdldChsb25nT3B0aW9uKTsKLSAgICAgICAgICAgIGlmIChvcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNob3J0T3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbiA9IChKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbikgb3B0aW9ucy5nZXQoc2hvcnRPcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9TY2hlbWFMb2NhdGlvbk1hcChTdHJpbmcgb3B0aW9uVmFsdWUpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBNYXAgbG9hZEphdmFQa2cyTmFtZXNwYWNlTWFwKEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbikgCi0gICAgeyAKLSAgICAgICAgTWFwIHBrZzJuc01hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgaWYgKG9wdGlvbiAhPSBudWxsKSAKLSAgICAgICAgewotICAgICAgICAgICAgQXJyYXlMaXN0IG9wdGlvblZhbHVlcyA9IG9wdGlvbi5nZXRPcHRpb25WYWx1ZXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBhbk9wdGlvblZhbHVlIDsKLSAgICAgICAgICAgIGZvciAoIGludCBjb3VudCA9IDAgOyBjb3VudCA8IG9wdGlvblZhbHVlcy5zaXplKCkgOyArK2NvdW50ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhbk9wdGlvblZhbHVlID0gKChTdHJpbmcpb3B0aW9uVmFsdWVzLmdldChjb3VudCkpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL2FuIG9wdGlvbiB2YWx1ZSB3aWxsIGJlIG9mIHRoZSBmb3JtIFtqYXZhIHBhY2thZ2UsIG5hbWVzcGFjZV0KLSAgICAgICAgICAgICAgICAvL2hlbmNlIHdlIHRha2UgdGhlIHR3byBzdWJzdHJpbmdzIHN0YXJ0aW5nIGFmdGVyICdbJyBhbmQgdXB0byAnLCcgYW5kCi0gICAgICAgICAgICAgICAgLy9zdGFydGluZyBhZnRlciAnLCcgYW5kIHVwdG8gJ10nCi0gICAgICAgICAgICAgICAgcGtnMm5zTWFwLnB1dChhbk9wdGlvblZhbHVlLnN1YnN0cmluZygxLCBhbk9wdGlvblZhbHVlLmluZGV4T2YoQ09NTUEpKS50cmltKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5PcHRpb25WYWx1ZS5zdWJzdHJpbmcoYW5PcHRpb25WYWx1ZS5pbmRleE9mKENPTU1BKSArIDEsIGFuT3B0aW9uVmFsdWUubGVuZ3RoKCkgLSAxKS50cmltKCkpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGtnMm5zTWFwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTWFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL01hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTUyN2FkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgdGhhdCBuYW1lc3BhY2UgbWFwcGVycyBhcmUgZXhwZWN0ZWQgdG8gaW1wbGVtZW50Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBNYXBwZXIgewotICAgIC8qKgotICAgICAqIGV4ZWN1dGUgdGhlIG1hcHBpbmcKLSAgICAgKiBAcGFyYW0gbWFwIG1hcCB0byBtYXAgdG8KLSAgICAgKiBAcGFyYW0gcGFja2FnZUlzS2V5IGlmIHRoZSBwYWNrYWdlIGlzIHRvIGJlIHRoZSBrZXkgZm9yIHRoZSBtYXAKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGluIGNhc2Ugb2YgZW1lcmdlbmN5Ci0gICAgICovCi0gICAgdm9pZCBleGVjdXRlKEhhc2hNYXAgbWFwLCBib29sZWFuIHBhY2thZ2VJc0tleSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTWFwcGluZ1NldC5qYXZhIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9NYXBwaW5nU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNWUwNDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9NYXBwaW5nU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqYSBtYXBwaW5nc2V0IGlzIGEgc2V0IG9mIG1hcHBpbmdzCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwaW5nU2V0IGltcGxlbWVudHMgTWFwcGVyIHsKLQotICAgIExpc3QgbWFwcGluZ3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogYWRkIGEgbmV3IG1hcHBpbmcKLSAgICAgKiBAcGFyYW0gbWFwcGluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoTmFtZXNwYWNlTWFwcGluZyBtYXBwaW5nKSB7Ci0gICAgICAgIG1hcHBpbmdzLmFkZChtYXBwaW5nKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgYSBtYXBwaW5nc2V0IGluc2lkZSB0aGlzIG9uZQotICAgICAqIEBwYXJhbSBtYXBwaW5nc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWFwcGluZ1NldChNYXBwaW5nU2V0IG1hcHBpbmdzZXQpIHsKLSAgICAgICAgbWFwcGluZ3MuYWRkKG1hcHBpbmdzZXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGV4ZWN1dGUgYnkgbWFwcGluZyBldmVyeXRoaW5nIGl0ZXJhdGl2ZWx5IGFuZCByZWN1cnNpdmVseQotICAgICAqIEBwYXJhbSBtYXAgbWFwIHRvIG1hcCBpbnRvCi0gICAgICogQHBhcmFtIHBhY2thZ2VJc0tleSBpZiB0aGUgcGFja2FnZSBpcyB0byBiZSB0aGUga2V5IGZvciB0aGUgbWFwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShIYXNoTWFwIG1hcCwgYm9vbGVhbiBwYWNrYWdlSXNLZXkpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQ9bWFwcGluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwcGVyIG1hcHBlciA9IChNYXBwZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIG1hcHBlci5leGVjdXRlKG1hcCwgcGFja2FnZUlzS2V5KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvTmFtZXNwYWNlTWFwcGluZy5qYXZhIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9OYW1lc3BhY2VNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NzVhNmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC9OYW1lc3BhY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIFVzZWQgZm9yIG5lc3RlZCBwYWNrYWdlIGRlZmluaXRpb25zLgotICogVGhlIGZpbGUgZm9ybWF0IHVzZWQgZm9yIHN0b3JpbmcgbWFwcGluZ3MgaXMgYSBsaXN0IG9mIHBhY2thZ2U9bmFtZXNwYWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VNYXBwaW5nIGltcGxlbWVudHMgTWFwcGVyIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFBLRzJOU19NQVBQSU5HUyA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAicGtnMm5zX21hcHBpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIE1BUFBJTkcgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIm1hcHBpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFID0gInBhY2thZ2UiOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBGaWxlIG1hcHBpbmdGaWxlOwotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gbWFwSW5wdXRTdHJlYW0gPSBudWxsOwotICAgIHByaXZhdGUgWE1MU3RyZWFtUmVhZGVyIG1hcFhtbFJlYWRlciA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBwYXNzIGluIHRoZSBuYW1lc3BhY2UgdG8gbWFwIHRvCi0gICAgICovCi0gICAgcHVibGljIE5hbWVzcGFjZU1hcHBpbmcoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhlIG5hbWVzcGFjZSBpbiB0aGUgV1NETC4gUmVxdWlyZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIG5ldyB1cmkgb2YgdGhlIG1hcHBpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG5hbWVzcGFjZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoZSBKYXZhIHBhY2thZ2UgdG8gYmluZCB0by4gUmVxdWlyZWQuCi0gICAgICogQHBhcmFtIHZhbHVlIGphdmEgcGFja2FnZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcGFja2FnZU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lIG9mIGEgcHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIG1hcHBpbmdzIGluCi0gICAgICogcGFja2FnZT1uYW1lc3BhY2UgZm9ybWF0Ci0gICAgICogQHBhcmFtIGZpbGUgZmlsZSB0byBsb2FkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZShGaWxlIGZpbGUpIHsKLSAgICAgICAgbWFwcGluZ0ZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG1hcCBhIG5hbWVzcGFjZSB0byBhIHBhY2thZ2UKLSAgICAgKiBAcGFyYW0gbWFwIG1hcCB0byBhc3NpZ24gdG8KLSAgICAgKiBAcGFyYW0gcGFja05hbWUgcGFja2FnZSBuYW1lCi0gICAgICogQHBhcmFtIG5zcGFjZSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gcGFja2FnZUlzS2V5IGlmIHRoZSBwYWNrYWdlIGlzIHRvIGJlIHRoZSBrZXkgZm9yIHRoZSBtYXAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXAoSGFzaE1hcCBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYWNrYWdlSXNLZXkpIHsKLSAgICAgICAgaWYocGFja2FnZUlzS2V5KSB7Ci0gICAgICAgICAgICBtYXAucHV0KHBhY2tOYW1lLG5zcGFjZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXAucHV0KG5zcGFjZSwgcGFja05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGUgdGhlIG9wdGlvbiBzZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgICAgIGlmIChtYXBwaW5nRmlsZSAhPSBudWxsIHx8IG1hcElucHV0U3RyZWFtICE9IG51bGwgfHwgbWFwWG1sUmVhZGVyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgfHwgcGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lc3BhY2Ugb3IgUGFja2FnZSBjYW5ub3QgYmUgdXNlZCB3aXRoIGEgRmlsZSBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibmFtZXNwYWNlIG11c3QgYmUgZGVmaW5lZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInBhY2thZ2UgbXVzdCBiZSBkZWZpbmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIGEgbWFwcGluZyB4bWwgcmVhZGVyIGFuZCBzYXZlIGl0IHRvIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gbWFwIHRhcmdldCBtYXAgZmlsZQotICAgICAqIEBwYXJhbSBwYWNrYWdlSXNLZXkgaWYgdGhlIHBhY2thZ2UgaXMgdG8gYmUgdGhlIGtleSBmb3IgdGhlIG1hcAotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gSU9FeGNlcHRpb24gbmVlZGVkIHN3YWxsb3dpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXBYbWxSZWFkZXIoSGFzaE1hcCBtYXAsIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9hZE1hcHBpbmdGcm9tWE1MUmVhZGVyKG1hcCwgcGFja2FnZUlzS2V5KTsgCi0gICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgIAotICAgIAotICAgIC8qKgotICAgICAqIExvYWQgYSBtYXBwaW5nIGlucHV0IHN0cmVhbSAgYW5kIHNhdmUgaXQgdG8gdGhlIG1hcAotICAgICAqIEBwYXJhbSBtYXAgdGFyZ2V0IG1hcCBmaWxlCi0gICAgICogQHBhcmFtIHBhY2thZ2VJc0tleSBpZiB0aGUgcGFja2FnZSBpcyB0byBiZSB0aGUga2V5IGZvciB0aGUgbWFwCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBuZWVkZWQgc3dhbGxvd2luZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1hcFhtbFN0cmVhbShIYXNoTWFwIG1hcCwgYm9vbGVhbiBwYWNrYWdlSXNLZXkpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXBYbWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG1hcElucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIG1hcFhtbFJlYWRlcihtYXAsIHBhY2thZ2VJc0tleSk7Ci0gICAgICAgICAgICAvL2Vuc3VyZSB0aGlzIGNsZWFuIHVwIHNvIHRoYXQgdGhlIG5leHQgaW52b2NhdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzdGFsZSBzdGF0ZQotICAgICAgICAgICAgbWFwWG1sUmVhZGVyID0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvYWQgYSBtYXBwaW5nIGZpbGUgYW5kIHNhdmUgaXQgdG8gdGhlIG1hcAotICAgICAqIEBwYXJhbSBtYXAgdGFyZ2V0IG1hcCBmaWxlCi0gICAgICogQHBhcmFtIHBhY2thZ2VJc0tleSBpZiB0aGUgcGFja2FnZSBpcyB0byBiZSB0aGUga2V5IGZvciB0aGUgbWFwCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBuZWVkZWQgc3dhbGxvd2luZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG1hcEZpbGUoSGFzaE1hcCBtYXAsIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFwSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hcHBpbmdGaWxlKTsKLSAgICAgICAgICAgIG1hcFhtbFN0cmVhbShtYXAsIHBhY2thZ2VJc0tleSk7IAotICAgICAgICAgICAgLy9uZWVkIHRvIGRvIHRoaXMgc2luY2UgdGhlIGZpbGUgd2FzIG9wZW5lZCBoZXJlCi0gICAgICAgICAgICBtYXBJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgLy9lbnN1cmUgdGhpcyBjbGVhbiB1cCBzbyB0aGF0IHRoZSBuZXh0IGludm9jYXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgc3RhbGUgc3RhdGUKLSAgICAgICAgICAgIG1hcElucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGxvYWQgZnJvbSBhbiB4bWwgcmVhZGVyIGNvbnRhaW5pbmcgbWFwcGluZyBpbmZvCi0gICAgICogQHJldHVybiBhIHByb3BlcnRpZXMgZmlsZSB3aXRoIHplcm8gb3IgbW9yZSBtYXBwaW5ncwotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGxvYWQgZmFpbGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRNYXBwaW5nRnJvbVhNTFJlYWRlcihIYXNoTWFwIG1hcCwgYm9vbGVhbiBwYWNrYWdlSXNLZXkpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgLy9pZiB0aGUgcmVhZGVyIGlzIGluIHRoZSBmcmFnbWVudCB0aGF0IGRlYWxzIHdpdGggcGFja2FnZSB0byBuYW1lc3BhY2UgbWFwcGluZ3MKLSAgICAgICAgICAgICAgICB3aGlsZSAobWFwWG1sUmVhZGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgIC8vIG1hcFhtbFJlYWRlci5uZXh0KCk7bWFwWG1sUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAvLyAgaWYgKCBtYXBYbWxSZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhQS0cyTlNfTUFQUElOR1MpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtYXBYbWxSZWFkZXIubmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbWFwWG1sUmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1BUFBJTkcuZXF1YWxzKHFuYW1lKSAmJiBwYXJlbnRFbGVtZW50LmVxdWFscyhQS0cyTlNfTUFQUElOR1MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAobWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBYbWxSZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgUEFDS0FHRSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFhtbFJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBOQU1FU1BBQ0UpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSXNLZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IHFuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBYbWxSZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFhtbFJlYWRlci5nZXROYW1lKCkuZXF1YWxzKFBLRzJOU19NQVBQSU5HUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZW5zdXJlIHRoaXMgY2xlYW4gdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAvLyAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoIEV4Y2VwdGlvbiBlICkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgbG9hZGluZyBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5ncy4uLiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBleGVjdXRlIHRoZSBtYXBwaW5nCi0gICAgICogQHBhcmFtIG1hcCBtYXAgdG8gbWFwIHRvCi0gICAgICogQHBhcmFtIHBhY2thZ2VJc0tleSBpZiB0aGUgcGFja2FnZSBpcyB0byBiZSB0aGUga2V5IGZvciB0aGUgbWFwCi0gICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVtZXJnZW5jeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSGFzaE1hcCBtYXAsIGJvb2xlYW4gcGFja2FnZUlzS2V5KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICBpZiAobWFwcGluZ0ZpbGUgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIG1hcEZpbGUobWFwLHBhY2thZ2VJc0tleSk7Ci0gICAgICAgICAgICAvL2Vuc3VyZSB0aGlzIGNsZWFuIHVwIHNvIHRoYXQgdGhlIG5leHQgaW52b2NhdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzdGFsZSBzdGF0ZQotICAgICAgICAgICAgbWFwcGluZ0ZpbGUgPSBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKCBtYXBJbnB1dFN0cmVhbSAhPSBudWxsICkgewotICAgICAgICAgICAgbWFwWG1sU3RyZWFtKG1hcCwgcGFja2FnZUlzS2V5KTsgICAKLSAgICAgICAgfSBlbHNlIGlmICggbWFwWG1sUmVhZGVyICE9IG51bGwgKSB7Ci0gICAgICAgICAgICBtYXBYbWxSZWFkZXIobWFwLCBwYWNrYWdlSXNLZXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFwKG1hcCwgcGFja2FnZU5hbWUsIG5hbWVzcGFjZSwgcGFja2FnZUlzS2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRNYXBJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcElucHV0U3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hcElucHV0U3RyZWFtKElucHV0U3RyZWFtIG1hcElucHV0U3RyZWFtKSB7Ci0gICAgICAgIHRoaXMubWFwSW5wdXRTdHJlYW0gPSBtYXBJbnB1dFN0cmVhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRNYXBwaW5nRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBpbmdGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBpbmdGaWxlKEZpbGUgbWFwcGluZ0ZpbGUpIHsKLSAgICAgICAgdGhpcy5tYXBwaW5nRmlsZSA9IG1hcHBpbmdGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0WG1sUmVhZGVyKCkgewotICAgICAgICByZXR1cm4gbWFwWG1sUmVhZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhtbFJlYWRlcihYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyKSB7Ci0gICAgICAgIHRoaXMubWFwWG1sUmVhZGVyID0geG1sUmVhZGVyOwotICAgIH0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC91dGlscy9KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3NyYy9vcmcvYXBhY2hlL3dzL2phdmEyd3NkbC91dGlscy9KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDhhNzU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGwudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICAgICBwcml2YXRlIEFycmF5TGlzdCBvcHRpb25WYWx1ZXM7Ci0KLSAgICAgICBwdWJsaWMgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oU3RyaW5nIHR5cGUsIFN0cmluZ1tdIHZhbHVlcykgewotICAgICAgICAgICBzZXRPcHRpb25UeXBlKHR5cGUpOwotICAgICAgICAgICBBcnJheUxpc3QgYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgIGFycmF5TGlzdC5hZGQodmFsdWVzW2ldKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IGFycmF5TGlzdDsKLSAgICAgICB9Ci0KLSAgICAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICAgICAvL2NhdGVyIGZvciB0aGUgbG9uZyBvcHRpb25zIGZpcnN0Ci0gICAgICAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoIi0tIikpIHR5cGUgPSB0eXBlLnJlcGxhY2VGaXJzdCgiLS0iLCAiIik7Ci0gICAgICAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoIi0iKSkgdHlwZSA9IHR5cGUucmVwbGFjZUZpcnN0KCItIiwgIiIpOwotICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgIH0KLQotICAgICAgIC8qKgotICAgICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICAgICovCi0gICAgICAgcHVibGljIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKFN0cmluZyB0eXBlLCBBcnJheUxpc3QgdmFsdWVzKSB7Ci0gICAgICAgICAgIHNldE9wdGlvblR5cGUodHlwZSk7Ci0KLSAgICAgICAgICAgaWYgKG51bGwgIT0gdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IHZhbHVlczsKLSAgICAgICAgICAgfQotICAgICAgIH0KLQotCi0gICAgICAgLyoqCi0gICAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLgotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uVHlwZSgpIHsKLSAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgfQotCi0KLSAgICAgICAvKioKLSAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9wdGlvblZhbHVlcy4KLSAgICAgICAgKi8KLSAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvblZhbHVlKCkgewotICAgICAgICAgICBpZiAob3B0aW9uVmFsdWVzICE9IG51bGwpCi0gICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgb3B0aW9uVmFsdWVzLmdldCgwKTsKLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgfQotCi0KLQotICAgICAgIC8qKgotICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3B0aW9uVmFsdWVzLgotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0T3B0aW9uVmFsdWVzKCkgewotICAgICAgICAgICByZXR1cm4gb3B0aW9uVmFsdWVzOwotICAgICAgIH0KLQotCi0gICB9Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIuamF2YSBiLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyZTVmNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvblBhcnNlciBpbXBsZW1lbnRzIEphdmEyV1NETENvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVJURUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGludCBORVdfT1BUSU9OID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1VCX1BBUkFNX09GX09QVElPTiA9IDI7Ci0KLSAgICBwcml2YXRlIE1hcCBjb21tYW5kTGluZU9wdGlvbnM7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoTWFwIGNvbW1hbmRMaW5lT3B0aW9ucykgewotICAgICAgICB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucyA9IGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoU3RyaW5nW10gYXJncykgewotICAgICAgICB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucyA9IHRoaXMucGFyc2UoYXJncyk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBsaXN0IHdpdGggPGNvZGU+Q29tbWFuZExpbmVPcHRpb248L2NvZGU+IG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogQHJldHVybiBDb21tYW5kTGluZU9wdGlvbiBMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgcGFyc2UoU3RyaW5nW10gYXJncykgewotICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoMCA9PSBhcmdzLmxlbmd0aCkKLSAgICAgICAgICAgIHJldHVybiBjb21tYW5kTGluZU9wdGlvbnM7Ci0KLSAgICAgICAgLy9TdGF0ZSAwIG1lYW5zIHN0YXJ0ZWQKLSAgICAgICAgLy9TdGF0ZSAxIG1lYW5zIGVhcmxpZXIgb25lIHdhcyBhIG5ldyAtb3B0aW9uCi0gICAgICAgIC8vU3RhdGUgMiBtZWFucyBlYXJsaWVyIG9uZSB3YXMgYSBzdWIgcGFyYW0gb2YgYSAtb3B0aW9uCi0KLSAgICAgICAgaW50IHN0YXRlID0gU1RBUlRFRDsKLSAgICAgICAgQXJyYXlMaXN0IG9wdGlvbkJ1bmRsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBvcHRpb25UeXBlID0gbnVsbDsKLSAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gY29tbWFuZExpbmVPcHRpb247Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgIGlmIChTVEFSVEVEID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIG9uZQotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE5FV19PUFRJT047Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvblR5cGUgPSBhcmdzW2ldOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU1VCX1BBUkFNX09GX09QVElPTiA9PSBzdGF0ZSB8fCBORVdfT1BUSU9OID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBvbmUgYnV0IG9sZCBvbmUgc2hvdWxkIGJlIHNhdmVkCi0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uVHlwZSwgb3B0aW9uQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IE5FV19PUFRJT047Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvblR5cGUgPSBhcmdzW2ldOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25CdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNUQVJURUQgPT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTEVfSU5QVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZExpbmVPcHRpb25zOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChORVdfT1BUSU9OID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9sZCA9IChKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiljb21tYW5kTGluZU9wdGlvbnMuZ2V0KGdldE9wdGlvblR5cGUob3B0aW9uVHlwZSkpOwotICAgICAgICAgICAgICAgICAgICBpZihvbGQgIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5nZXRPcHRpb25WYWx1ZXMoKS5hZGQoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25CdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFSVEVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlLmFkZChhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU1VCX1BBUkFNX09GX09QVElPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU1VCX1BBUkFNX09GX09QVElPTiA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICBvcHRpb25CdW5kbGUuYWRkKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHN0YXRlICE9IFNUQVJURUQpIHsgCi0gICAgICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihvcHRpb25UeXBlLCBvcHRpb25CdW5kbGUpOwotICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tbWFuZExpbmVPcHRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgLy9jYXRlciBmb3IgdGhlIGxvbmcgb3B0aW9ucyBmaXJzdAotICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCItLSIpKSB0eXBlID0gdHlwZS5yZXBsYWNlRmlyc3QoIi0tIiwgIiIpOwotICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKCItIikpIHR5cGUgPSB0eXBlLnJlcGxhY2VGaXJzdCgiLSIsICIiKTsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRBbGxPcHRpb25zKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jb21tYW5kTGluZU9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0SW52YWxpZE9wdGlvbnMoSmF2YTJXU0RMT3B0aW9uc1ZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAgICAgICAgTGlzdCBmYXVsdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGhpcy5jb21tYW5kTGluZU9wdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24gY29tbWFuZExpbmVPcHRpb24gPSAoKEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKSAoaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgLm5leHQoKSkpOwotICAgICAgICAgICAgaWYgKHZhbGlkYXRvci5pc0ludmFsaWQoY29tbWFuZExpbmVPcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRMaXN0LmFkZChjb21tYW5kTGluZU9wdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmF1bHRMaXN0OwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXZhMndzZGwvc3JjL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL3V0aWxzL0phdmEyV1NETE9wdGlvbnNWYWxpZGF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMT3B0aW9uc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhiYTBjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC9zcmMvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvdXRpbHMvSmF2YTJXU0RMT3B0aW9uc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlsczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEphdmEyV1NETE9wdGlvbnNWYWxpZGF0b3IgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMgewotICAgIHB1YmxpYyBib29sZWFuIGlzSW52YWxpZChKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIHsKLSAgICAgICAgYm9vbGVhbiBpbnZhbGlkOwotICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG9wdGlvbi5nZXRPcHRpb25UeXBlKCk7Ci0KLSAgICAgICAgaW52YWxpZCA9ICEoCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFUVFJfRk9STV9ERUZBVUxUX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFUVFJfRk9STV9ERUZBVUxUX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQ0xBU1NOQU1FX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTTkFNRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTUEFUSF9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DTEFTU1BBVEhfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkUuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkVfTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVMRU1FTlRfRk9STV9ERUZBVUxUX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVMRU1FTlRfRk9STV9ERUZBVUxUX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRVhUUkFfQ0xBU1NFU19ERUZBVUxUX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkpBVkFfUEtHXzJfTlNNQVBfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuSkFWQV9QS0dfMl9OU01BUF9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTkFNRVNQQUNFX0dFTkVSQVRPUl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5OQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0ZJTEVOQU1FX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLk9VVFBVVF9GSUxFTkFNRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfR0VORVJBVE9SX09QVElPTi5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9HRU5FUkFUT1JfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSl8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TVFlMRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TVFlMRV9PUFRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9PUFRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSB8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5VU0VfT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVVNFX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSl8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSl8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DVVNUT01fU0NIRU1BX0xPQ0FUSU9OLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSl8fAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DVVNUT01fU0NIRU1BX0xPQ0FUSU9OX0xPTkcuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKXx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9NQVBQSU5HX0ZJTEVfTE9DQVRJT04uZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKXx8Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9NQVBQSU5HX0ZJTEVfTE9DQVRJT05fTE9ORy5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpfHwKLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTl9MT05HLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkKLSAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGludmFsaWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9DYWxjdWxhdG9yU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF2YTJ3c2RsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9DYWxjdWxhdG9yU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYyYzUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2FsY3VsYXRvclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotcHVibGljIGNsYXNzIENhbGN1bGF0b3JTZXJ2aWNlIHsNCi0gICAgcHVibGljIHZvaWQgbXVsdGlwbHkoaW50IG51bWJlcil7DQotICAgICAgICBydW5uaW5nVG90YWwgKj0gbnVtYmVyOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgbnVtYmVyKXsNCi0gICAgICAgIHJ1bm5pbmdUb3RhbCArPSBudW1iZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGl2aWRlKGludCBudW1iZXIpdGhyb3dzIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbnsNCi0gICAgICAgIGlmKG51bWJlciA9PSAwKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBEaXZpZGVCeVplcm9FeGNlcHRpb24oIkNhbGN1bGF0b3JTZXJ2aWNlIHRyaWVkIHRvIGRpdmlkZSBieSB6ZXJvIiwgcnVubmluZ1RvdGFsKTsNCi0gICAgICAgIH0gZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJ1bm5pbmdUb3RhbCA9IHJ1bm5pbmdUb3RhbCAvICBudW1iZXI7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHN1YnRyYWN0KGludCBudW1iZXIpew0KLSAgICAgICAgcnVubmluZ1RvdGFsID0gcnVubmluZ1RvdGFsIC0gbnVtYmVyOyANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldFRvdGFsKCl7DQotICAgICAgICByZXR1cm4gcnVubmluZ1RvdGFsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCl7DQotICAgICAgICBydW5uaW5nVG90YWwgPSAwOw0KLSAgICB9DQotICAgIHByaXZhdGUgaW50IHJ1bm5pbmdUb3RhbDsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9EaXZpZGVCeVplcm9FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGl2aWRlQnlaZXJvRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmZmNzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF2YTJ3c2RsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9EaXZpZGVCeVplcm9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotcHVibGljIGNsYXNzIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgcHVibGljIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKQ0KLSAgICB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgaW50IGZhdWx0KQ0KLSAgICB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHQgPSBmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGl2aWRlQnlaZXJvRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBpbnQgZmF1bHQsIFRocm93YWJsZSBjYXVzZSkNCi0gICAgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdCA9IGZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0RmF1bHRJbmZvKCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgaW50IGZhdWx0Ow0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXZhMndzZGwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0phdmEyV1NETFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSmF2YTJXU0RMVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjZlOTU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2phdmEyd3NkbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSmF2YTJXU0RMVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExCdWlsZGVyOw0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOw0KLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi0NCi1wdWJsaWMgY2xhc3MgSmF2YTJXU0RMVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBKYXZhMldTRExCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmF2YTJXU0RMQnVpbGRlcihvdXQsIENhbGN1bGF0b3JTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgQ2FsY3VsYXRvclNlcnZpY2UuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IEhhc2hNYXAoKSk7DQotICAgICAgICBidWlsZGVyLmdlbmVyYXRlV1NETCgpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7DQotICAgICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsNCi0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwobnVsbCwgaW5wdXRTb3VyY2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZWZpbml0aW9uKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXhicmkvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL2pheGJyaS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDhhNjA2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheGJyaS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXhicmk8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSkFYQi1SSSBEYXRhIEJpbmRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkpBWEItUkkgZGF0YSBiaW5kaW5nIHN1cHBvcnQgZm9yIEF4aXMgMi4wPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4YnJpPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4YnJpPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9qYXhicmk8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXM8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS90YXJnZXQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi5jbGFzcy5wYXRoIiByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlcmVzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMveHNkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5vdXRwdXQuYmFzZS5kaXIiIHZhbHVlPSJ0YXJnZXQvc2NoZW1hIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9zcmMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmb3IgRG9jTGl0QmFyZVNlcnZpY2UgdGVzdDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vRG9jTGl0QmFyZVNlcnZpY2Uud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIFNlcnZpY2UgLyBTZXJ2aWNlIENsaWVudCBmb3IgVGVzdDAxIHRlc3Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCBqYXhicmkgLXNzIC1zZCAtdCAtbyB0YXJnZXQvd3NkbC9UZXN0MDEgLXUgLXVyaSAke3dzZGwuc291cmNlLmRpcn0vVGVzdDAxLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBkaXI9InRhcmdldC93c2RsL1Rlc3QwMSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFkZC10ZXN0LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXRlc3Qtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vdGFyZ2V0L3NjaGVtYS9zcmM8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5vbmNlPC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotCi0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXhicmkvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4YnJpL0NvZGVHZW5lcmF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJjMzdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheGJyaTsKLQotaW1wb3J0IGNvbS5zdW4uY29kZW1vZGVsLkpDb2RlTW9kZWw7Ci1pbXBvcnQgY29tLnN1bi5jb2RlbW9kZWwud3JpdGVyLkZpbGVDb2RlV3JpdGVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5FcnJvckxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5NYXBwaW5nOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5Qcm9wZXJ0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLnhqYy5hcGkuUzJKSkFYQk1vZGVsOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLmFwaS5TY2hlbWFDb21waWxlcjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLnhqYy5hcGkuWEpDOwotaW1wb3J0IGNvbS5zdW4udG9vbHMueGpjLkJhZENvbW1hbmRMaW5lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlNjaGVtYVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5EZWZhdWx0VHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuSmF2YVR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLlR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIENvZGVHZW5lcmF0aW9uVXRpbGl0eSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvZGVHZW5lcmF0aW9uVXRpbGl0eS5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0ZJTEVfTkFNRSA9ICJiaW5kaW5nRmlsZU5hbWUiOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFkZGl0aW9uYWxTY2hlbWFzCi0gICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTWFwcGVyIHByb2Nlc3NTY2hlbWFzKGZpbmFsIExpc3Qgc2NoZW1hcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudFtdIGFkZGl0aW9uYWxTY2hlbWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuQ29uZmlndXJhdGlvbiBjZ2NvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy9jaGVjayBmb3IgdGhlIGltcG9ydGVkIHR5cGVzLiBBbnkgaW1wb3J0ZWQgdHlwZXMgYXJlIHN1cHBvc2VkIHRvIGJlIGhlcmUgYWxzbwotICAgICAgICAgICAgaWYgKHNjaGVtYXMgPT0gbnVsbCB8fCBzY2hlbWFzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vdGhlcmUgYXJlIG5vIHR5cGVzIHRvIGJlIGNvZGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgLy9Ib3dldmVyIGlmIHRoZSB0eXBlIG1hcHBlciBpcyBsZWZ0IGVtcHR5IGl0IHdpbGwgYmUgYSBwcm9ibGVtIGZvciB0aGUgb3RoZXIKLSAgICAgICAgICAgICAgICAvL3Byb2Nlc3Nlcy4gSGVuY2UgdGhlIGRlZmF1bHQgdHlwZSBtYXBwZXIgaXMgc2V0IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0VHlwZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBNYXAgc2NoZW1hVG9JbnB1dFNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIC8vY3JlYXRlIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgSmF2YVR5cGVNYXBwZXIgbWFwcGVyID0gbmV3IEphdmFUeXBlTWFwcGVyKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlVVJJID0gY2djb25maWcuZ2V0QmFzZVVSSSgpOwotICAgICAgICAgICAgaWYgKCFiYXNlVVJJLmVuZHNXaXRoKCIvIikpewotICAgICAgICAgICAgICAgYmFzZVVSSSA9IGJhc2VVUkkgKyAiLyI7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpc2NoZW1hcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZ2V0U2NoZW1hQXNTdHJpbmcoc2NoZW1hKSkpOwotICAgICAgICAgICAgICAgIC8vaGVyZSB3ZSBoYXZlIHRvIHNldCBhIHByb3BlciBzeXN0ZW0gSUQuIG90aGVyd2lzZSB3aGVuIHByb2Nlc3NpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gaW5jbHVkZWQgc2NoYWVtYXMgZm9yIHRoaXMgc2NoZW1hIHdlIGhhdmUgYSBwcm9ibGVtCi0gICAgICAgICAgICAgICAgLy8gaXQgY3JlYXRlcyB0aGUgc3lzdGVtIElEIHVzaW5nIHRoaXMgdGFyZ2V0IG5hbWVzcGFjZSB2YWx1ZQotCi0gICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoYmFzZVVSSSArICJ4c2QiICsgaSArICIueHNkIik7Ci0gICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0UHVibGljSWQoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBzY2hlbWFUb0lucHV0U291cmNlTWFwLnB1dChzY2hlbWEsaW5wdXRTb3VyY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIG91dHB1dERpciA9IG5ldyBGaWxlKGNnY29uZmlnLmdldE91dHB1dExvY2F0aW9uKCksICJzcmMiKTsKLSAgICAgICAgICAgIG91dHB1dERpci5ta2RpcigpOwotCi0gICAgICAgICAgICBNYXAgbnNNYXAgPSBjZ2NvbmZpZy5nZXRVcmkyUGFja2FnZU5hbWVNYXAoKTsKLSAgICAgICAgICAgIEVudGl0eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IEVudGl0eVJlc29sdmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIHJldHVybklucHV0U291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIGtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNjaGVtYVRvSW5wdXRTb3VyY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IChYbWxTY2hlbWEpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5zcCA9IGtleS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuc3AgIT0gbnVsbCAmJiBuc3AuZXF1YWxzKHB1YmxpY0lkKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiByZXR1cm5pbmcgdGhlIGlucHV0IHN0cmVhbSB3ZSBoYXZlIHRvIGFsd2F5cyByZXR1cm4gYSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCBzdHJlYW0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luYyBqYXhicmkgaW50ZXJuYWxseSBjb25zdW1lcyB0aGUgaW5wdXQgc3RyZWFtIGl0IGdpdmVzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybklucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoZ2V0U2NoZW1hQXNTdHJpbmcoa2V5KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGV4aXN0aW5nSW5wdXRTb3VyY2UgPSAoSW5wdXRTb3VyY2UpIHNjaGVtYVRvSW5wdXRTb3VyY2VNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoZXhpc3RpbmdJbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5JbnB1dFNvdXJjZS5zZXRQdWJsaWNJZChleGlzdGluZ0lucHV0U291cmNlLmdldFB1YmxpY0lkKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5JbnB1dFNvdXJjZSA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2UgaGF2ZSB0byBmaW5kIHRoaXMgdXNpbmcgdGhlIGZpbGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3lzdGVtSWQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybklucHV0U291cmNlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuSW5wdXRTb3VyY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotCi0gICAgICAgICAgICBNYXAgcHJvcGVydGllcyA9IGNnY29uZmlnLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nRmlsZU5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChCSU5ESU5HX0ZJTEVfTkFNRSk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSBrZXkgPSBudWxsOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzY2hlbWFJdGVyID0gc2NoZW1hVG9JbnB1dFNvdXJjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBzY2hlbWFJdGVyLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIFNjaGVtYUNvbXBpbGVyIHNjID0gWEpDLmNyZWF0ZVNjaGVtYUNvbXBpbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FuRXBpc29kZUZpbGUobmV3IEZpbGUoYmluZGluZ0ZpbGVOYW1lKSwgc2MpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3J1Y2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShiaW5kaW5nRmlsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U29ydWNlLnNldFN5c3RlbUlkKG5ldyBGaWxlKGJpbmRpbmdGaWxlTmFtZSkudG9VUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjLmdldE9wdGlvbnMoKS5hZGRCaW5kRmlsZShpbnB1dFNvcnVjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGtleSA9IChYbWxTY2hlbWEpIHNjaGVtYUl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKG5zTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBuc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gKFN0cmluZyluc01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyTmFtZXNwYWNlKHNjLCBuYW1lc3BhY2UsIHBrZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYy5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0KLSAgICAgICAgICAgICAgICBzYy5zZXRFcnJvckxpc3RlbmVyKG5ldyBFcnJvckxpc3RlbmVyKCl7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNheFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3Ioc2F4UGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzYXhQYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHNheFBhcnNlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc2F4UGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihzYXhQYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKHNheFBhcnNlRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgc2F4UGFyc2VFeGNlcHRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBzYXhQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oc2F4UGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzYXhQYXJzZUV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIHNheFBhcnNlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluZm8oU0FYUGFyc2VFeGNlcHRpb24gc2F4UGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKHNheFBhcnNlRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc2F4UGFyc2VFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBzYXhQYXJzZUV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIHNjLnBhcnNlU2NoZW1hKChJbnB1dFNvdXJjZSkgc2NoZW1hVG9JbnB1dFNvdXJjZU1hcC5nZXQoa2V5KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBCaW5kIHRoZSBYTUwKLSAgICAgICAgICAgICAgICBTMkpKQVhCTW9kZWwgamF4Yk1vZGVsID0gc2MuYmluZCgpOwotCi0gICAgICAgICAgICAgICAgaWYoamF4Yk1vZGVsID09IG51bGwpewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGdlbmVyYXRlIGNvZGUgdXNpbmcgamF4YnJpIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRW1pdCB0aGUgY29kZSBhcnRpZmFjdHMKLSAgICAgICAgICAgICAgICBKQ29kZU1vZGVsIGNvZGVNb2RlbCA9IGpheGJNb2RlbC5nZW5lcmF0ZUNvZGUobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgRmlsZUNvZGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVDb2RlV3JpdGVyKG91dHB1dERpcik7Ci0gICAgICAgICAgICAgICAgY29kZU1vZGVsLmJ1aWxkKHdyaXRlcik7Ci0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIG1hcHBpbmdzID0gamF4Yk1vZGVsLmdldE1hcHBpbmdzKCk7Ci0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwcGluZ3MuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXBwaW5nIG1hcHBpbmcgPSAoTWFwcGluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW4gPSBtYXBwaW5nLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gbWFwcGluZy5nZXRUeXBlKCkuZ2V0VHlwZUNsYXNzKCkuZnVsbE5hbWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHFuLCB0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9wcm9jZXNzIHRoZSB1bndyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICghY2djb25maWcuaXNQYXJhbWV0ZXJzV3JhcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vZmlndXJlIG91dCB0aGUgdW53cmFwcGVkIG9wZXJhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjZ2NvbmZpZy5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBzZXJ2aWNlc0l0ZXIgPSBheGlzU2VydmljZXMuaXRlcmF0b3IoKTsgc2VydmljZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXNlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSAoQXhpc09wZXJhdGlvbilvcGVyYXRpb25zLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChvcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0tFWSkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nIG1hcHBpbmcgPSBqYXhiTW9kZWwuZ2V0KG1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBlbGVtZW50UHJvcGVydGllcyA9IG1hcHBpbmcuZ2V0V3JhcHBlclN0eWxlRHJpbGxkb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgZWxlbWVudFByb3BlcnRpZXMuc2l6ZSgpOyBqKyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5IGVsZW1lbnRQcm9wZXJ0eSA9IChQcm9wZXJ0eSkgZWxlbWVudFByb3BlcnRpZXMuZ2V0KGopOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHR5cGUgaXMgYmFzZWQgb24gYSBwcmltaXRpdmUgdHlwZS0gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWl0aXZlIHR5cGUgbmFtZSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbEphdmVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eS50eXBlKCkuZnVsbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEphdmVOYW1lID0gZnVsbEphdmVOYW1lLmNvbmNhdCgiW10iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGZ1bGxKYXZlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkudHlwZSgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAob3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5VTldSQVBQRURfS0VZKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmcgbWFwcGluZyA9IGpheGJNb2RlbC5nZXQobWVzc2FnZS5nZXRFbGVtZW50UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGVsZW1lbnRQcm9wZXJ0aWVzID0gbWFwcGluZy5nZXRXcmFwcGVyU3R5bGVEcmlsbGRvd24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBlbGVtZW50UHJvcGVydGllcy5zaXplKCk7IGorKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHkgZWxlbWVudFByb3BlcnR5ID0gKFByb3BlcnR5KSBlbGVtZW50UHJvcGVydGllcy5nZXQoaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExVdGlsLmdldFBhcnRRTmFtZShvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuT1VUUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZWxlbWVudE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHR5cGUgaXMgYmFzZWQgb24gYSBwcmltaXRpdmUgdHlwZS0gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWl0aXZlIHR5cGUgbmFtZSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbEphdmVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eS50eXBlKCkuZnVsbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEphdmVOYW1lID0gZnVsbEphdmVOYW1lLmNvbmNhdCgiW10iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGZ1bGxKYXZlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LnR5cGUoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ1N0YXR1cyhwYXJ0UU5hbWUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkudHlwZSgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgcmV0dXJuIG1hcHBlcjsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNjYW5FcGlzb2RlRmlsZShGaWxlIGphciwgU2NoZW1hQ29tcGlsZXIgc2MpCi0gICAgICAgICAgICB0aHJvd3MgQmFkQ29tbWFuZExpbmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBVUkxDbGFzc0xvYWRlciB1Y2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtde2phci50b1VSTCgpfSk7Ci0gICAgICAgIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0gdWNsLmZpbmRSZXNvdXJjZXMoIk1FVEEtSU5GL3N1bi1qYXhiLmVwaXNvZGUiKTsKLSAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgVVJMIHVybCA9IHJlc291cmNlcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgc2MuZ2V0T3B0aW9ucygpLmFkZEJpbmRGaWxlKG5ldyBJbnB1dFNvdXJjZSh1cmwudG9FeHRlcm5hbEZvcm0oKSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJOYW1lc3BhY2UoU2NoZW1hQ29tcGlsZXIgc2MsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwa2dOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzY2hlbWEiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOmpheGIiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoImpheGI6dmVyc2lvbiIsICIyLjAiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCBuYW1lc3BhY2UpOwotICAgICAgICBFbGVtZW50IGFubm9FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFubm90YXRpb24iKTsKLSAgICAgICAgRWxlbWVudCBhcHBJbmZvID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFwcGluZm8iKTsKLSAgICAgICAgRWxlbWVudCBzY2hlbWFCaW5kaW5ncyA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXhiOnNjaGVtYUJpbmRpbmdzIik7Ci0gICAgICAgIEVsZW1lbnQgcGtnRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJqYXhiOnBhY2thZ2UiKTsKLSAgICAgICAgcGtnRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBwa2dOYW1lKTsKLSAgICAgICAgYW5ub0VsZW1lbnQuYXBwZW5kQ2hpbGQoYXBwSW5mbyk7Ci0gICAgICAgIGFwcEluZm8uYXBwZW5kQ2hpbGQoc2NoZW1hQmluZGluZ3MpOwotICAgICAgICBzY2hlbWFCaW5kaW5ncy5hcHBlbmRDaGlsZChwa2dFbGVtZW50KTsKLSAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoYW5ub0VsZW1lbnQpOwotICAgICAgICBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJjdXN0b21pemVkIiwiLnhzZCIpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoc3RyZWFtKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgeGZvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShyb290RWxlbWVudCksIHJlc3VsdCk7Ci0gICAgICAgICAgICBzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBJbnB1dFNvdXJjZSBpbnMgPSBuZXcgSW5wdXRTb3VyY2UoZmlsZS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBzYy5wYXJzZVNjaGVtYShpbnMpOwotICAgICAgICBmaWxlLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0TmFtZXNwYWNlKFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgU3RyaW5nIHBrZzsKLSAgICAgICAgcGtnID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAocGtnID09IG51bGwpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYVtdIHNjaGVtYXMyID0gU2NoZW1hVXRpbC5nZXRBbGxTY2hlbWFzKHNjaGVtYSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgc2NoZW1hczIgIT0gbnVsbCAmJiBqIDwgc2NoZW1hczIubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwa2cgPSBzY2hlbWFzMltqXS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwa2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcGtnID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICAgICAgfQotICAgICAgICBwa2cgPSBVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKHBrZyk7Ci0gICAgICAgIHJldHVybiBwa2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYUFzU3RyaW5nKFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIHNjaGVtYS53cml0ZShiYW9zKTsKLSAgICAgICAgcmV0dXJuIGJhb3MudG9TdHJpbmcoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4YnJpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheGJyaS9Eb2NMaXRCYXJlSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhIGIvMV81L21vZHVsZXMvamF4YnJpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheGJyaS9Eb2NMaXRCYXJlSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQwZjVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvRG9jTGl0QmFyZUpheGJTY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXhicmk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBEb2NMaXRCYXJlSmF4YlNjaGVtYUdlbmVyYXRvciBleHRlbmRzIERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBKYXhiU2NoZW1hR2VuZXJhdG9yIGpheGJTY2hlbWFHZW5lcmF0b3I7Ci0KLSAgICBwdWJsaWMgRG9jTGl0QmFyZUpheGJTY2hlbWFHZW5lcmF0b3IoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihsb2FkZXIsIGNsYXNzTmFtZSwgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsbnVsbCk7Ci0gICAgICAgIGpheGJTY2hlbWFHZW5lcmF0b3IgPSBuZXcgSmF4YlNjaGVtYUdlbmVyYXRvcihsb2FkZXIsY2xhc3NOYW1lLHNjaGVtYXRhcmdldE5hbWVzcGFjZSxzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgIH0KLQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2VuZXJhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICBqYXhiU2NoZW1hR2VuZXJhdG9yLmdlbmVyYXRlU2NoZW1hRm9yUGFyYW1ldGVycygpOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXhicmkvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4YnJpL0pheGJTY2hlbWFHZW5lcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmI2ZDNmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvSmF4YlNjaGVtYUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXhicmk7Ci0KLWltcG9ydCBjb20uc3VuLnhtbC5iaW5kLnYyLnJ1bnRpbWUuSkFYQkNvbnRleHRJbXBsOwotaW1wb3J0IGNvbS5zdW4ueG1sLmJpbmQudjIucnVudGltZS5KYXhCZWFuSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5EZWZhdWx0U2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5TY2hlbWFPdXRwdXRSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiU2NoZW1hR2VuZXJhdG9yIGV4dGVuZHMgRGVmYXVsdFNjaGVtYUdlbmVyYXRvciB7Ci0gICAgcHVibGljIEpheGJTY2hlbWFHZW5lcmF0b3IoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlcihsb2FkZXIsIGNsYXNzTmFtZSwgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2VuZXJhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZW5lcmF0ZVNjaGVtYSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbGxlY3RzIGFsbCB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIHRoZSBleHRyYSBjbGFzc2VzIGZyb20gdGhlIGNvbW1hbmQgbGluZQotICAgICAqIGNyZWF0ZXMgYSBKQVhCQ29udGV4dCBhbmQgZ2VuZXJhdGVzIHNjaGVtYXMgZnJvbSB0aGUgSkFYQkNvbnRleHQKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hRm9yUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKLSAgICAgICAgY2xhc3Nlcy5hZGRBbGwocHJvY2Vzc0pheEJlTWV0aG9kcyhzZXJ2aWNlQ2xhc3MuZ2V0TWV0aG9kcygpKSk7Ci0KLSAgICAgICAgaWYgKGV4dHJhQ2xhc3NlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBleHRyYUNsYXNzIDogZXh0cmFDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgKFN0cmluZykgZXh0cmFDbGFzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGpheGJOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBpZihpc1VzZVdTRExUeXBlc05hbWVzcGFjZSgpKXsKLSAgICAgICAgICAgIGpheGJOYW1lc3BhY2UgPSAoU3RyaW5nKSBwa2cybnNtYXAuZ2V0KCJhbGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZihqYXhiTmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGpheGJOYW1lc3BhY2UgPSB0aGlzLmdldFNjaGVtYVRhcmdldE5hbWVTcGFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSkFYQkNvbnRleHRJbXBsIGNvbnRleHQgPSAoSkFYQkNvbnRleHRJbXBsKSBjcmVhdGVKQVhCQ29udGV4dChjbGFzc2VzLCBqYXhiTmFtZXNwYWNlKTsKLQotICAgICAgICBmb3IgKERPTVJlc3VsdCByIDogZ2VuZXJhdGVKYXhiU2NoZW1hcyhjb250ZXh0KSkgewotICAgICAgICAgICAgRG9jdW1lbnQgZCA9IChEb2N1bWVudCkgci5nZXROb2RlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpOwotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gdGhpcy5nZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKTsKLSAgICAgICAgICAgICAgICBkLmdldERvY3VtZW50RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTm9kZUxpc3Qgbm9kZXMgPSBkLmdldERvY3VtZW50RWxlbWVudCgpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIE5vZGUgbiA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KSBuOwotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImltcG9ydCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkLmdldERvY3VtZW50RWxlbWVudCgpLnJlbW92ZUNoaWxkKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0geG1sU2NoZW1hQ29sbGVjdGlvbi5yZWFkKGQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0gICAgICAgICAgICBmb3IgKENsYXNzIGNsYXp6IDogY2xhc3NlcykgewotICAgICAgICAgICAgICAgIEpheEJlYW5JbmZvPD8+IGJlYW5JbmZvID0gY29udGV4dC5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBnZXRUeXBlTmFtZShiZWFuSW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYocU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShjbGF6ei5nZXROYW1lKCksIHFOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzY2hlbWFNYXAucHV0KHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0VHlwZU5hbWUoSmF4QmVhbkluZm88Pz4gYmVhbkluZm8pIHsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IGl0ciA9IGJlYW5JbmZvLmdldFR5cGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmICghaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXRyLm5leHQoKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBMaXN0PENsYXNzPD8+PiBwcm9jZXNzSmF4QmVNZXRob2RzKE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8+PigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2Qgak1ldGhvZCA9IGRlY2xhcmVkTWV0aG9kc1tpXTsKLQotICAgICAgICAgICAgaWYgKGpNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NbXSBleHR5cGVzID0gak1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0eXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBleHR5cGUgPSBleHR5cGVzW2pdOwotICAgICAgICAgICAgICAgICAgICBpZighZXh0eXBlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhIil8fGV4dHlwZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YXguIikpewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZXh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUobGlzdCwgZXh0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzc1tdIHBhcmFzID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIENsYXNzIHBhcmFUeXBlID0gcGFyYXNbal07Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKGxpc3QsIHBhcmFUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBpdHMgcmV0dXJuIHR5cGUKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBqTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKCEocmV0dXJuVHlwZSA9PSB2b2lkLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShsaXN0LCByZXR1cm5UeXBlKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoTGlzdDxDbGFzczw/Pj4gbGlzdCwgQ2xhc3MgdHlwZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGJvb2xlYW4gaXNBcnJheVR5cGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaXNBcnJheVR5cGUgPSB0eXBlLmlzQXJyYXkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY2xhc3NUeXBlTmFtZTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICAgICAgaXNBcnJheVR5cGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lID0gdHlwZVRhYmxlLmdldFNpbXBsZVNjaGVtYVR5cGVOYW1lKGNsYXNzVHlwZU5hbWUpOwotICAgICAgICBpZiAoc2NoZW1hVHlwZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgbGlzdC5hZGQodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8RE9NUmVzdWx0PiBnZW5lcmF0ZUpheGJTY2hlbWFzKEpBWEJDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIExpc3Q8RE9NUmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxET01SZXN1bHQ+KCk7Ci0KLSAgICAgICAgY29udGV4dC5nZW5lcmF0ZVNjaGVtYShuZXcgU2NoZW1hT3V0cHV0UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBSZXN1bHQgY3JlYXRlT3V0cHV0KFN0cmluZyBucywgU3RyaW5nIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgRE9NUmVzdWx0IHJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEpBWEJDb250ZXh0IGNyZWF0ZUpBWEJDb250ZXh0KFNldDxDbGFzczw/Pj4gY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0TnMpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBjbGFzc2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiIjsKLSAgICAgICAgT2JqZWN0IHJlbW90ZUV4Y2VwdGlvbk9iamVjdDsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgcmVtb3RlRXhjZXB0aW9uT2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgY2xhc3NOYW1lID0gcmVtb3RlRXhjZXB0aW9uT2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoISgiIi5lcXVhbHMoY2xhc3NOYW1lKSkgJiYgY2xhc3NOYW1lLmNvbnRhaW5zKCJSZW1vdGVFeGNlcHRpb24iKSkgewotICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChDbGFzczw/PiBjbHMgOiBjbGFzc2VzKSB7Ci0gICAgICAgICAgICBpZiAoY2xzLmdldE5hbWUoKS5lbmRzV2l0aCgiT2JqZWN0RmFjdG9yeSIpKSB7Ci0gICAgICAgICAgICAgICAgLy9raW5kIG9mIGEgaGFjaywgYnV0IE9iamVjdEZhY3RvcmllcyBtYXkgYmUgY3JlYXRlZCB3aXRoIGVtcHR5IG5hbWVzcGFjZXMKLSAgICAgICAgICAgICAgICBkZWZhdWx0TnMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgaWYgKGRlZmF1bHROcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAucHV0KCJjb20uc3VuLnhtbC5iaW5kLmRlZmF1bHROYW1lc3BhY2VSZW1hcCIsIGRlZmF1bHROcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENsYXNzPD8+IGNscyA6IGNsYXNzZXMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+PiA6IiArIGNscyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKGNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbY2xhc3Nlcy5zaXplKCldKSwgbWFwKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvdGVtcGxhdGUvSmF4YlJJRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wgYi8xXzUvbW9kdWxlcy9qYXhicmkvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4YnJpL3RlbXBsYXRlL0pheGJSSURhdGFiaW5kaW5nVGVtcGxhdGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTZiOTVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheGJyaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXhicmkvdGVtcGxhdGUvSmF4YlJJRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ0ZXh0Ii8+Ci08IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+Ci0gICAgPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgSkFYQi1SSSB0ZW1wbGF0ZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+Ci0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YWJpbmRlcnNbQGRidHlwZT0namF4YnJpJ10iPgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZTY0Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYmFzZTY0RWxlbWVudHMvbmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRiYXNlNjQiPgotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFOYW1lQXJyYXkgPSB7Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iYmFzZTY0RWxlbWVudHMvbmFtZSI+Ci0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpPjEiPiw8L3hzbDppZj5uZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucy11cmwiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxvY2FsTmFtZSIvPiIpCi0gICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KLSAgICAgICAgICAgIH07Ci0gICAgICAgIDwveHNsOmlmPgotCi0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RUeXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyYW1bMV0vQHR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IHdzQ29udGV4dDsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IGpjOwotICAgICAgICAgICAgamMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLQkJCQlqYyA9IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKAotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InBhcmFtW25vdChAdHlwZSA9IHByZWNlZGluZy1zaWJsaW5nOjpwYXJhbS9AdHlwZSldIj4KLSAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4uY2xhc3M8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gbGFzdCgpIj4sCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotCQkJCSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gZXggKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmFibGUgdG8gY3JlYXRlIEpBWEJDb250ZXh0OiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhpdCgtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB3c0NvbnRleHQgPSBqYzsKLQkJCX0KLSAgICAgICAgfQotCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtub3QoQHR5cGUgPSBwcmVjZWRpbmctc2libGluZzo6cGFyYW0vQHR5cGUpXSI+Ci0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkB0eXBlIT0nJyI+Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHRvT00oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkKLSAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQgY29udGV4dCA9IHdzQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eShqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkgPSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXhiUklEYXRhU291cmNlIHNvdXJjZSA9IG5ldyBKYXhiUklEYXRhU291cmNlKCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InFuYW1lL0Buc3VyaSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InFuYW1lL0Bsb2NhbG5hbWUiLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InFuYW1lL0Buc3VyaSIvPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChzb3VyY2UsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0icW5hbWUvQGxvY2FsbmFtZSIvPiIsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gYmV4KXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChiZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnksIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBwYXJhbSwgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpCi0gICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZCh0b09NKHBhcmFtLCBvcHRpbWl6ZUNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJvcGVydHlUeXBlIiBzZWxlY3Q9IkB0eXBlIi8+Ci0gICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdieXRlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGJ5dGUgdG9CeXRlICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IGNvbnRleHQgPSB3c0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5CeXRlIHJldCA9IChqYXZhLmxhbmcuSW50ZWdlcil1bm1hcnNoYWxsZXIudW5tYXJzaGFsKHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCksIGJ5dGUuY2xhc3MpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQuYnl0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBiZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoYmV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdjaGFyJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGNoYXIgdG9DaGFyICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IGNvbnRleHQgPSB3c0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5DaGFyYWN0ZXIgcmV0ID0gKGphdmEubGFuZy5DaGFyYWN0ZXIpdW5tYXJzaGFsbGVyLnVubWFyc2hhbChwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpLCBjaGFyLmNsYXNzKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0LmNoYXJWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gYmV4KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGJleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0nZG91YmxlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGRvdWJsZSB0b0RvdWJsZSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLk1hcCBleHRyYU5hbWVzcGFjZXMpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCBjb250ZXh0ID0gd3NDb250ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuRG91YmxlIHJldCA9IChqYXZhLmxhbmcuRG91YmxlKXVubWFyc2hhbGxlci51bm1hcnNoYWwocGFyYW0uZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwgZG91YmxlLmNsYXNzKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0LmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBiZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoYmV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdmbG9hdCciPgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBmbG9hdCB0b0Zsb2F0ICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IGNvbnRleHQgPSB3c0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5GbG9hdCByZXQgPSAoamF2YS5sYW5nLkZsb2F0KXVubWFyc2hhbGxlci51bm1hcnNoYWwocGFyYW0uZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwgZmxvYXQuY2xhc3MpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQuZmxvYXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gYmV4KXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQubWFrZUZhdWx0KGJleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHByb3BlcnR5VHlwZT0naW50JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGludCB0b0ludCAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLk1hcCBleHRyYU5hbWVzcGFjZXMpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCBjb250ZXh0ID0gd3NDb250ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuSW50ZWdlciByZXQgPSAoamF2YS5sYW5nLkludGVnZXIpdW5tYXJzaGFsbGVyLnVubWFyc2hhbChwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpLCBpbnQuY2xhc3MpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGJleCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChiZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J2xvbmcnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyB0b0xvbmcgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5NYXAgZXh0cmFOYW1lc3BhY2VzKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQgY29udGV4dCA9IHdzQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLkxvbmcgcmV0ID0gKGphdmEubGFuZy5Mb25nKXVubWFyc2hhbGxlci51bm1hcnNoYWwocGFyYW0uZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwgbG9uZy5jbGFzcykuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldC5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGJleCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChiZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRwcm9wZXJ0eVR5cGU9J3Nob3J0JyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHNob3J0IHRvU2hvcnQgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5NYXAgZXh0cmFOYW1lc3BhY2VzKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQgY29udGV4dCA9IHdzQ29udGV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlNob3J0IHJldCA9IChqYXZhLmxhbmcuU2hvcnQpdW5tYXJzaGFsbGVyLnVubWFyc2hhbChwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpLCBzaG9ydC5jbGFzcykuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldC5zaG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBiZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoYmV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcHJvcGVydHlUeXBlPSdib29sZWFuJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gdG9Cb29sZWFuICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IGNvbnRleHQgPSB3c0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5Cb29sZWFuIHJldCA9IChqYXZhLmxhbmcuQm9vbGVhbil1bm1hcnNoYWxsZXIudW5tYXJzaGFsKHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCksIGJvb2xlYW4uY2xhc3MpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBiZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoYmV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICogIGdldCB0aGUgZGVmYXVsdCBlbnZlbG9wZQotICAgICAgICAqLwotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGphdmEubGFuZy5PYmplY3QgZnJvbU9NICgKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLAotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIHR5cGUsCi0gICAgICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCBjb250ZXh0ID0gd3NDb250ZXh0OwotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVubWFyc2hhbGxlci51bm1hcnNoYWwocGFyYW0uZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwgdHlwZSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gYmV4KXsKLSAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoYmV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIEpheGJSSURhdGFTb3VyY2UgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEJvdW5kIG9iamVjdCBmb3Igb3V0cHV0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBvdXRPYmplY3Q7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQm91bmQgY2xhc3MgZm9yIG91dHB1dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBvdXRDbGF6ejsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBNYXJzaGFsbGVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXIgbWFyc2hhbGxlcjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBOYW1lc3BhY2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbnN1cmk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTG9jYWwgbmFtZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENvbnN0cnVjdG9yIGZyb20gb2JqZWN0IGFuZCBtYXJzaGFsbGVyLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBwYXJhbSBvYmoKLSAgICAgICAgICAgICAqIEBwYXJhbSBtYXJzaGFsbGVyCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyBKYXhiUklEYXRhU291cmNlKENsYXNzIGNsYXp6LCBPYmplY3Qgb2JqLCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyIG1hcnNoYWxsZXIsIFN0cmluZyBuc3VyaSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm91dENsYXp6ID0gY2xheno7Ci0gICAgICAgICAgICAgICAgdGhpcy5vdXRPYmplY3QgPSBvYmo7Ci0gICAgICAgICAgICAgICAgdGhpcy5tYXJzaGFsbGVyID0gbWFyc2hhbGxlcjsKLSAgICAgICAgICAgICAgICB0aGlzLm5zdXJpID0gbnN1cmk7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dHB1dCwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKG5ldyBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZShuc3VyaSwgbmFtZSksIG91dE9iamVjdC5nZXRDbGFzcygpLCBvdXRPYmplY3QpLCBvdXRwdXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24oIkVycm9yIGluIEpBWEIgbWFyc2hhbGxpbmciLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShqYXZhLmlvLldyaXRlciB3cml0ZXIsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChuZXcgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUobnN1cmksIG5hbWUpLCBvdXRPYmplY3QuZ2V0Q2xhc3MoKSwgb3V0T2JqZWN0KSwgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uKCJFcnJvciBpbiBKQVhCIG1hcnNoYWxsaW5nIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChuZXcgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUobnN1cmksIG5hbWUpLCBvdXRPYmplY3QuZ2V0Q2xhc3MoKSwgb3V0T2JqZWN0KSwgeG1sV3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uKCJFcnJvciBpbiBKQVhCIG1hcnNoYWxsaW5nIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCBjb250ZXh0ID0gd3NDb250ZXh0OwotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChuZXcgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUobnN1cmksIG5hbWUpLCBvdXRPYmplY3QuZ2V0Q2xhc3MoKSwgb3V0T2JqZWN0KSwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0Um9vdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uKCJFcnJvciBpbiBKQVhCIG1hcnNoYWxsaW5nIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIDwveHNsOnRlbXBsYXRlPgotICAgIDwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXhicmkvdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2NMaXRCYXJlU2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvamF4YnJpL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRG9jTGl0QmFyZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMTc2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXhicmkvdGVzdC1yZXNvdXJjZXMvd3NkbC9Eb2NMaXRCYXJlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTUxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6bnM0PSJodHRwOi8veHNkLmFycmF5cy5wb2pvLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIgotICAgICAgICAgICAgICAgICAgeG1sbnM6bnMwPSJodHRwOi8veHNkLmpheGIuZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIHhtbG5zOm5zNz0iaHR0cDovL3Bvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiCi0gICAgICAgICAgICAgICAgICB4bWxuczpuczU9Imh0dHA6Ly9kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOm5zNj0iaHR0cDovL2pheGIuZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiIHhtbG5zOmF4aXMyPSJodHRwOi8vZG9jbGl0YmFyZS50ZW1wLm9yZyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOm5zMT0iaHR0cDovL3hzZC5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOm5zMz0iaHR0cDovL2FycmF5cy5wb2pvLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIgotICAgICAgICAgICAgICAgICAgeG1sbnM6bnMyPSJodHRwOi8veHNkLnBvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmUudGVtcC5vcmciPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHM6c2NoZW1hIHhtbG5zOm5zMT0iaHR0cDovL3Bvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICAgICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXJyYXlzLnBvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkZsb2F0QXJyYXkiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iZmxvYXRzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJpbmdzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2FyQXJyYXkiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FycyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNzpDYXIiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3RBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3RzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICAgICAgPHhzOnNjaGVtYSBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmUudGVtcC5vcmcveHNkIj4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImNhbGVuZGFyU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWxlbmRhclN0cmluZ0FycmF5IiBuaWxsYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im5zMTpDYWxlbmRhclN0cmluZ0FycmF5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImludEFycmF5T2JqZWN0QXJyYXlSZXN1bHQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW5Cb29sZWFuIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYm9vbEFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYm9vbGVhbkJvb2xlYW5SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmJvb2xlYW4iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYnl0ZUJ5dGUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJieXRlQXJnIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ynl0ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJieXRlQnl0ZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6Ynl0ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJieXRlQXJyYXlJbnRBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnRBcnJheUFyZyIgbmlsbGFibGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYnl0ZUFycmF5SW50QXJyYXlSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmbG9hdEZsb2F0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmxvYXRBcmdDIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmxvYXRGbG9hdFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50RGlhYmxvIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGlhYmxvQXJnQSIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNzpEaWFibG8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50RGlhYmxvUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50RmxvYXQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmbG9hdEFyZ0IiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnRGbG9hdFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImludFN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cmluZ0FyZ0EiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50U3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0RmxvYXQiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmbG9hdEFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im9iamVjdEZsb2F0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InFOYW1lUU5hbWUiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxTmFtZUFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icU5hbWVRTmFtZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmdDYXIiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYXJBcmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczc6Q2FyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0cmluZ0NhclJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0cmluZ1N0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cmluZ0FyZ0IiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RyaW5nU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3RyaW5nVm9pZFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImJpZ0RlY2ltYWxCaWdEZWNpbWFsIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlnRGVjaW1hbEFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYmlnRGVjaW1hbEJpZ0RlY2ltYWxSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2FsZW5kYXJEaWFibG8iPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYWJsb0FyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNzpEaWFibG8iLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2FsZW5kYXJEaWFibG9SZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2FsZW5kYXJTdHJpbmdBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRTdG9ja1F1b3RlSW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50QXJnQyIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRTdG9ja1F1b3RlSW50UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczY6R2V0U3RvY2tRdW90ZSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RGYWN0b3J5Q2FyIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FyQXJnQiIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNzpDYXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0RmFjdG9yeUNhclJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnM2Ok9iamVjdEZhY3RvcnkyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImZsb2F0QXJyYXlGaWdodGVyIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmlnaHRlckFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNzpGaWdodGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImZsb2F0QXJyYXlGaWdodGVyUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczM6RmxvYXRBcnJheSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvYmplY3RBcnJheUNhckFycmF5Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FyQXJyYXlBcmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczM6Q2FyQXJyYXkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib2JqZWN0QXJyYXlDYXJBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMzOk9iamVjdEFycmF5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0cmluZ0FycmF5SW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50QXJnQiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmdBcnJheUludFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMzOlN0cmluZ0FycmF5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN0cmluZ0FycmF5U3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJpbmdBcnJheUFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMzpTdHJpbmdBcnJheSIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmdBcnJheVN0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczM6U3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50QXJyYXlPYmplY3RBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdEFycmF5QXJnIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnMzOk9iamVjdEFycmF5Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImludEFycmF5T2JqZWN0QXJyYXlSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zMTpJbnRBcnJheU9iamVjdEFycmF5UmVzdWx0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNob3J0Q2hhbmdlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImN0QXJnIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnM2OkNoYW5nZVR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hvcnRDaGFuZ2VUeXBlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaG9ydFNob3J0Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvcnRBcmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzaG9ydFNob3J0UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2b2lkSW50Ij4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50QXJnQSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2b2lkTGFzdFRyYWRlVHlwZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imx0dEFyZyIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNjpMYXN0VHJhZGVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6dG5zPSJodHRwOi8vamF4Yi5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXhiLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIj4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkNoYW5nZVR5cGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJuczY6Q2hhbmdlVHlwZSIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iR2V0U3RvY2tRdW90ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNjpHZXRTdG9ja1F1b3RlIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMYXN0VHJhZGVUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnM2Okxhc3RUcmFkZVR5cGUiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9iamVjdEZhY3RvcnkyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnM2Ok9iamVjdEZhY3RvcnkyIi8+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdW90ZSIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNjpRdW90ZSIvPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkdldFN0b2NrUXVvdGUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3RGYWN0b3J5MiIvPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkNoYW5nZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkb2xsYXIiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGVyY2VudCIgdHlwZT0ieHM6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3NpdGl2ZSIgdHlwZT0ieHM6Ym9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxhc3RUcmFkZVR5cGUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRlIiB0eXBlPSJ4czpsb25nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpY2UiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUXVvdGUiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iY2hhbmdlIiB0eXBlPSJuczY6Q2hhbmdlVHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJsYXN0VHJhZGUiIHR5cGU9Im5zNjpMYXN0VHJhZGVUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZvbHVtZSIgdHlwZT0ieHM6aW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczp0bnM9Imh0dHA6Ly9wb2pvLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Bvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQ2FyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnM3OkNhciIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRGlhYmxvIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ibnM3OkRpYWJsbyIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmlnaHRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9Im5zNzpGaWdodGVyIi8+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2FyIj4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImNvbG9yIiB0eXBlPSJ4czpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXhTcGVlZCIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpY2UiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmlnaHRlciI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJtYW51ZmFjdHVyZXIiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJhdGVPZkZpcmUiIHR5cGU9InhzOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0id2luZ0NvdW50IiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEaWFibG8iPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJuczc6Q2FyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFjY2VsZXJhdGlvbiIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWlsZWFnZSIgdHlwZT0ieHM6bG9uZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwveHM6c2NoZW1hPgotICAgICAgICA8eHM6c2NoZW1hIHhtbG5zOmF4Mjc9Imh0dHA6Ly9hcnJheXMucG9qby5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIKLSAgICAgICAgICAgICAgICAgICB4bWxuczpheDI2PSJodHRwOi8veHNkLmFycmF5cy5wb2pvLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94c2QuYXJyYXlzLnBvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiPgotICAgICAgICAgICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9hcnJheXMucG9qby5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIvPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczpheDIzPSJodHRwOi8veHNkLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3hzZC5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCI+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2FsZW5kYXJTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cmluZ0FyZ3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+Ci0gICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW50QXJyYXlPYmplY3RBcnJheVJlc3VsdCI+Ci0gICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVR5cGUiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6YXgyNT0iaHR0cDovL2pheGIuZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiIHhtbG5zOmF4MjQ9Imh0dHA6Ly94c2QuamF4Yi5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIKLSAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94c2QuamF4Yi5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCI+Ci0gICAgICAgICAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2pheGIuZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiLz4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6YXgyMT0iaHR0cDovL3hzZC5wb2pvLmRvY2xpdGJhcmUudGVtcC5vcmcveHNkIiB4bWxuczpheDIyPSJodHRwOi8vcG9qby5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCIKLSAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94c2QucG9qby5kb2NsaXRiYXJlLnRlbXAub3JnL3hzZCI+Ci0gICAgICAgICAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3Bvam8uZG9jbGl0YmFyZS50ZW1wLm9yZy94c2QiLz4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3RyaW5nQ2FyUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OnN0cmluZ0NhciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3RyaW5nQ2FyUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpzdHJpbmdDYXJSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iaW50RmxvYXRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6aW50RmxvYXQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImludEZsb2F0UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTppbnRGbG9hdFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJib29sZWFuQm9vbGVhblJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpib29sZWFuQm9vbGVhbiIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYm9vbGVhbkJvb2xlYW5SZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmJvb2xlYW5Cb29sZWFuUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFN0b2NrUXVvdGVJbnRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6Z2V0U3RvY2tRdW90ZUludCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0U3RvY2tRdW90ZUludFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6Z2V0U3RvY2tRdW90ZUludFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmbG9hdEFycmF5RmlnaHRlclJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpmbG9hdEFycmF5RmlnaHRlciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmxvYXRBcnJheUZpZ2h0ZXJSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmZsb2F0QXJyYXlGaWdodGVyUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImJ5dGVBcnJheUludEFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmJ5dGVBcnJheUludEFycmF5Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJieXRlQXJyYXlJbnRBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6Ynl0ZUFycmF5SW50QXJyYXlSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY2FsZW5kYXJTdHJpbmdBcnJheVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpjYWxlbmRhclN0cmluZ0FycmF5Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjYWxlbmRhclN0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpjYWxlbmRhclN0cmluZ0FycmF5UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InZvaWRJbnRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6dm9pZEludCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ib2JqZWN0RmFjdG9yeUNhclJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpvYmplY3RGYWN0b3J5Q2FyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJvYmplY3RGYWN0b3J5Q2FyUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpvYmplY3RGYWN0b3J5Q2FyUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InN0cmluZ0FycmF5SW50UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OnN0cmluZ0FycmF5SW50Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzdHJpbmdBcnJheUludFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6c3RyaW5nQXJyYXlJbnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYnl0ZUJ5dGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6Ynl0ZUJ5dGUiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImJ5dGVCeXRlUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpieXRlQnl0ZVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzdHJpbmdWb2lkUmVxdWVzdCIvPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3RyaW5nVm9pZFJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6c3RyaW5nVm9pZFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnRTdHJpbmdSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6aW50U3RyaW5nIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnRTdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmludFN0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJvYmplY3RBcnJheUNhckFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1Om9iamVjdEFycmF5Q2FyQXJyYXkiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Im9iamVjdEFycmF5Q2FyQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1Om9iamVjdEFycmF5Q2FyQXJyYXlSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ib2JqZWN0RmxvYXRSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6b2JqZWN0RmxvYXQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Im9iamVjdEZsb2F0UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpvYmplY3RGbG9hdFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ2b2lkTGFzdFRyYWRlVHlwZVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTp2b2lkTGFzdFRyYWRlVHlwZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3RyaW5nU3RyaW5nUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OnN0cmluZ1N0cmluZyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3RyaW5nU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpzdHJpbmdTdHJpbmdSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iaW50QXJyYXlPYmplY3RBcnJheVJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTppbnRBcnJheU9iamVjdEFycmF5Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnRBcnJheU9iamVjdEFycmF5UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTppbnRBcnJheU9iamVjdEFycmF5UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InFOYW1lUU5hbWVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6cU5hbWVRTmFtZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icU5hbWVRTmFtZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6cU5hbWVRTmFtZVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJiaWdEZWNpbWFsQmlnRGVjaW1hbFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpiaWdEZWNpbWFsQmlnRGVjaW1hbCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYmlnRGVjaW1hbEJpZ0RlY2ltYWxSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmJpZ0RlY2ltYWxCaWdEZWNpbWFsUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImNhbGVuZGFyRGlhYmxvUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmNhbGVuZGFyRGlhYmxvIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjYWxlbmRhckRpYWJsb1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6Y2FsZW5kYXJEaWFibG9SZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmxvYXRGbG9hdFJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpmbG9hdEZsb2F0Ii8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmbG9hdEZsb2F0UmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9Im5zNTpmbG9hdEZsb2F0UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InN0cmluZ0FycmF5U3RyaW5nQXJyYXlSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6c3RyaW5nQXJyYXlTdHJpbmdBcnJheSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3RyaW5nQXJyYXlTdHJpbmdBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6c3RyaW5nQXJyYXlTdHJpbmdBcnJheVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnREaWFibG9SZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6aW50RGlhYmxvIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnREaWFibG9SZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OmludERpYWJsb1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzaG9ydENoYW5nZVR5cGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJuczU6c2hvcnRDaGFuZ2VUeXBlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzaG9ydENoYW5nZVR5cGVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OnNob3J0Q2hhbmdlVHlwZVJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzaG9ydFNob3J0UmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OnNob3J0U2hvcnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InNob3J0U2hvcnRSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0ibnM1OnNob3J0U2hvcnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdEJhcmVTZXJ2aWNlUG9ydFR5cGUiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQ2FyIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpzdHJpbmdDYXJSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpzdHJpbmdDYXIiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6c3RyaW5nQ2FyUmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpzdHJpbmdDYXJSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50RmxvYXQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmludEZsb2F0UmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46aW50RmxvYXQiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6aW50RmxvYXRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmludEZsb2F0UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImJvb2xlYW5Cb29sZWFuIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpib29sZWFuQm9vbGVhblJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmJvb2xlYW5Cb29sZWFuIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmJvb2xlYW5Cb29sZWFuUmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpib29sZWFuQm9vbGVhblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRTdG9ja1F1b3RlSW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpnZXRTdG9ja1F1b3RlSW50UmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46Z2V0U3RvY2tRdW90ZUludCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpnZXRTdG9ja1F1b3RlSW50UmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpnZXRTdG9ja1F1b3RlSW50UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZsb2F0QXJyYXlGaWdodGVyIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpmbG9hdEFycmF5RmlnaHRlclJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmZsb2F0QXJyYXlGaWdodGVyIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iYXhpczI6ZmxvYXRBcnJheUZpZ2h0ZXJSZXNwb25zZSIgd3NhdzpBY3Rpb249InVybjpmbG9hdEFycmF5RmlnaHRlclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJieXRlQXJyYXlJbnRBcnJheSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6Ynl0ZUFycmF5SW50QXJyYXlSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpieXRlQXJyYXlJbnRBcnJheSIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOmJ5dGVBcnJheUludEFycmF5UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46Ynl0ZUFycmF5SW50QXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY2FsZW5kYXJTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOmNhbGVuZGFyU3RyaW5nQXJyYXlSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOmNhbGVuZGFyU3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJheGlzMjpjYWxlbmRhclN0cmluZ0FycmF5UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46Y2FsZW5kYXJTdHJpbmdBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ2b2lkSW50Ij4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjp2b2lkSW50UmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46dm9pZEludCIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ib2JqZWN0RmFjdG9yeUNhciI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6b2JqZWN0RmFjdG9yeUNhclJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOm9iamVjdEZhY3RvcnlDYXIiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6b2JqZWN0RmFjdG9yeUNhclJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46b2JqZWN0RmFjdG9yeUNhclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzdHJpbmdBcnJheUludCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6c3RyaW5nQXJyYXlJbnRSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpzdHJpbmdBcnJheUludCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpzdHJpbmdBcnJheUludFJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46c3RyaW5nQXJyYXlJbnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYnl0ZUJ5dGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmJ5dGVCeXRlUmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46Ynl0ZUJ5dGUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6Ynl0ZUJ5dGVSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmJ5dGVCeXRlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ1ZvaWQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnN0cmluZ1ZvaWRSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpzdHJpbmdWb2lkIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnN0cmluZ1ZvaWRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOnN0cmluZ1ZvaWRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50U3RyaW5nIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjppbnRTdHJpbmdSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjppbnRTdHJpbmciLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6aW50U3RyaW5nUmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjppbnRTdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ib2JqZWN0QXJyYXlDYXJBcnJheSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOm9iamVjdEFycmF5Q2FyQXJyYXlSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOm9iamVjdEFycmF5Q2FyQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJheGlzMjpvYmplY3RBcnJheUNhckFycmF5UmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46b2JqZWN0QXJyYXlDYXJBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvYmplY3RGbG9hdCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6b2JqZWN0RmxvYXRSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpvYmplY3RGbG9hdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpvYmplY3RGbG9hdFJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46b2JqZWN0RmxvYXRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idm9pZExhc3RUcmFkZVR5cGUiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnZvaWRMYXN0VHJhZGVUeXBlUmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46dm9pZExhc3RUcmFkZVR5cGUiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ1N0cmluZyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6c3RyaW5nU3RyaW5nUmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46c3RyaW5nU3RyaW5nIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnN0cmluZ1N0cmluZ1Jlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46c3RyaW5nU3RyaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImludEFycmF5T2JqZWN0QXJyYXkiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJheGlzMjppbnRBcnJheU9iamVjdEFycmF5UmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjppbnRBcnJheU9iamVjdEFycmF5Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iYXhpczI6aW50QXJyYXlPYmplY3RBcnJheVJlc3BvbnNlIiB3c2F3OkFjdGlvbj0idXJuOmludEFycmF5T2JqZWN0QXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icU5hbWVRTmFtZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6cU5hbWVRTmFtZVJlcXVlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOnFOYW1lUU5hbWUiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6cU5hbWVRTmFtZVJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46cU5hbWVRTmFtZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJiaWdEZWNpbWFsQmlnRGVjaW1hbCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOmJpZ0RlY2ltYWxCaWdEZWNpbWFsUmVxdWVzdCIgd3NhdzpBY3Rpb249InVybjpiaWdEZWNpbWFsQmlnRGVjaW1hbCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOmJpZ0RlY2ltYWxCaWdEZWNpbWFsUmVzcG9uc2UiIHdzYXc6QWN0aW9uPSJ1cm46YmlnRGVjaW1hbEJpZ0RlY2ltYWxSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY2FsZW5kYXJEaWFibG8iPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmNhbGVuZGFyRGlhYmxvUmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46Y2FsZW5kYXJEaWFibG8iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6Y2FsZW5kYXJEaWFibG9SZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmNhbGVuZGFyRGlhYmxvUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZsb2F0RmxvYXQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmZsb2F0RmxvYXRSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpmbG9hdEZsb2F0Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmZsb2F0RmxvYXRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOmZsb2F0RmxvYXRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQXJyYXlTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9ImF4aXMyOnN0cmluZ0FycmF5U3RyaW5nQXJyYXlSZXF1ZXN0IiB3c2F3OkFjdGlvbj0idXJuOnN0cmluZ0FycmF5U3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJheGlzMjpzdHJpbmdBcnJheVN0cmluZ0FycmF5UmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpzdHJpbmdBcnJheVN0cmluZ0FycmF5UmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImludERpYWJsbyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6aW50RGlhYmxvUmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46aW50RGlhYmxvIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOmludERpYWJsb1Jlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46aW50RGlhYmxvUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNob3J0Q2hhbmdlVHlwZSI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIgbWVzc2FnZT0iYXhpczI6c2hvcnRDaGFuZ2VUeXBlUmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46c2hvcnRDaGFuZ2VUeXBlIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnNob3J0Q2hhbmdlVHlwZVJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJ1cm46c2hvcnRDaGFuZ2VUeXBlUmVzcG9uc2UiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNob3J0U2hvcnQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnNob3J0U2hvcnRSZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249InVybjpzaG9ydFNob3J0Ii8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiIG1lc3NhZ2U9ImF4aXMyOnNob3J0U2hvcnRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0idXJuOnNob3J0U2hvcnRSZXNwb25zZSIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdEJhcmVTZXJ2aWNlU09BUDExQmluZGluZyIgdHlwZT0iYXhpczI6RG9jTGl0QmFyZVNlcnZpY2VQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQ2FyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c3RyaW5nQ2FyIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnRGbG9hdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmludEZsb2F0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJib29sZWFuQm9vbGVhbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmJvb2xlYW5Cb29sZWFuIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRTdG9ja1F1b3RlSW50Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0U3RvY2tRdW90ZUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmxvYXRBcnJheUZpZ2h0ZXIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpmbG9hdEFycmF5RmlnaHRlciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYnl0ZUFycmF5SW50QXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpieXRlQXJyYXlJbnRBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY2FsZW5kYXJTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmNhbGVuZGFyU3RyaW5nQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InZvaWRJbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjp2b2lkSW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvYmplY3RGYWN0b3J5Q2FyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46b2JqZWN0RmFjdG9yeUNhciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQXJyYXlJbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpzdHJpbmdBcnJheUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYnl0ZUJ5dGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpieXRlQnl0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nVm9pZCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnN0cmluZ1ZvaWQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImludFN0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmludFN0cmluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ib2JqZWN0QXJyYXlDYXJBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOm9iamVjdEFycmF5Q2FyQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9iamVjdEZsb2F0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46b2JqZWN0RmxvYXQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InZvaWRMYXN0VHJhZGVUeXBlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dm9pZExhc3RUcmFkZVR5cGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ1N0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnN0cmluZ1N0cmluZyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50QXJyYXlPYmplY3RBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmludEFycmF5T2JqZWN0QXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InFOYW1lUU5hbWUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpxTmFtZVFOYW1lIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJiaWdEZWNpbWFsQmlnRGVjaW1hbCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmJpZ0RlY2ltYWxCaWdEZWNpbWFsIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjYWxlbmRhckRpYWJsbyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmNhbGVuZGFyRGlhYmxvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmbG9hdEZsb2F0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46ZmxvYXRGbG9hdCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQXJyYXlTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnN0cmluZ0FycmF5U3RyaW5nQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImludERpYWJsbyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmludERpYWJsbyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2hvcnRDaGFuZ2VUeXBlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c2hvcnRDaGFuZ2VUeXBlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzaG9ydFNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c2hvcnRTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jTGl0QmFyZVNlcnZpY2VTT0FQMTJCaW5kaW5nIiB0eXBlPSJheGlzMjpEb2NMaXRCYXJlU2VydmljZVBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXAxMjpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ0NhciI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c3RyaW5nQ2FyIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50RmxvYXQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmludEZsb2F0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYm9vbGVhbkJvb2xlYW4iPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmJvb2xlYW5Cb29sZWFuIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0U3RvY2tRdW90ZUludCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0U3RvY2tRdW90ZUludCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZsb2F0QXJyYXlGaWdodGVyIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpmbG9hdEFycmF5RmlnaHRlciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImJ5dGVBcnJheUludEFycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpieXRlQXJyYXlJbnRBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNhbGVuZGFyU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmNhbGVuZGFyU3RyaW5nQXJyYXkiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ2b2lkSW50Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjp2b2lkSW50IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9iamVjdEZhY3RvcnlDYXIiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOm9iamVjdEZhY3RvcnlDYXIiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzdHJpbmdBcnJheUludCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c3RyaW5nQXJyYXlJbnQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJieXRlQnl0ZSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Ynl0ZUJ5dGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzdHJpbmdWb2lkIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpzdHJpbmdWb2lkIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50U3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjppbnRTdHJpbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvYmplY3RBcnJheUNhckFycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpvYmplY3RBcnJheUNhckFycmF5IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ib2JqZWN0RmxvYXQiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOm9iamVjdEZsb2F0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idm9pZExhc3RUcmFkZVR5cGUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnZvaWRMYXN0VHJhZGVUeXBlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ1N0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c3RyaW5nU3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50QXJyYXlPYmplY3RBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46aW50QXJyYXlPYmplY3RBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InFOYW1lUU5hbWUiPgotICAgICAgICAgICAgPHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnFOYW1lUU5hbWUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJiaWdEZWNpbWFsQmlnRGVjaW1hbCI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46YmlnRGVjaW1hbEJpZ0RlY2ltYWwiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjYWxlbmRhckRpYWJsbyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Y2FsZW5kYXJEaWFibG8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmbG9hdEZsb2F0Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpmbG9hdEZsb2F0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQXJyYXlTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c3RyaW5nQXJyYXlTdHJpbmdBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImludERpYWJsbyI+Ci0gICAgICAgICAgICA8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46aW50RGlhYmxvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2hvcnRDaGFuZ2VUeXBlIj4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpzaG9ydENoYW5nZVR5cGUiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzaG9ydFNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpzaG9ydFNob3J0IiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jTGl0QmFyZVNlcnZpY2VIdHRwQmluZGluZyIgdHlwZT0iYXhpczI6RG9jTGl0QmFyZVNlcnZpY2VQb3J0VHlwZSI+Ci0gICAgICAgIDxodHRwOmJpbmRpbmcgdmVyYj0iUE9TVCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nQ2FyIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2Uvc3RyaW5nQ2FyIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJzdHJpbmdDYXIiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJzdHJpbmdDYXIiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnRGbG9hdCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL2ludEZsb2F0Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJpbnRGbG9hdCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImludEZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYm9vbGVhbkJvb2xlYW4iPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJEb2NMaXRCYXJlU2VydmljZS9ib29sZWFuQm9vbGVhbiIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iYm9vbGVhbkJvb2xlYW4iLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJib29sZWFuQm9vbGVhbiIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFN0b2NrUXVvdGVJbnQiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJEb2NMaXRCYXJlU2VydmljZS9nZXRTdG9ja1F1b3RlSW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJnZXRTdG9ja1F1b3RlSW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iZ2V0U3RvY2tRdW90ZUludCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZsb2F0QXJyYXlGaWdodGVyIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2UvZmxvYXRBcnJheUZpZ2h0ZXIiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImZsb2F0QXJyYXlGaWdodGVyIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iZmxvYXRBcnJheUZpZ2h0ZXIiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJieXRlQXJyYXlJbnRBcnJheSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL2J5dGVBcnJheUludEFycmF5Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJieXRlQXJyYXlJbnRBcnJheSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImJ5dGVBcnJheUludEFycmF5Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY2FsZW5kYXJTdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL2NhbGVuZGFyU3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImNhbGVuZGFyU3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJjYWxlbmRhclN0cmluZ0FycmF5Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idm9pZEludCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL3ZvaWRJbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InZvaWRJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9iamVjdEZhY3RvcnlDYXIiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJEb2NMaXRCYXJlU2VydmljZS9vYmplY3RGYWN0b3J5Q2FyIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJvYmplY3RGYWN0b3J5Q2FyIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ib2JqZWN0RmFjdG9yeUNhciIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ0FycmF5SW50Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2Uvc3RyaW5nQXJyYXlJbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InN0cmluZ0FycmF5SW50Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ic3RyaW5nQXJyYXlJbnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJieXRlQnl0ZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL2J5dGVCeXRlIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJieXRlQnl0ZSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImJ5dGVCeXRlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3RyaW5nVm9pZCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL3N0cmluZ1ZvaWQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InN0cmluZ1ZvaWQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJzdHJpbmdWb2lkIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50U3RyaW5nIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2UvaW50U3RyaW5nIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJpbnRTdHJpbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJpbnRTdHJpbmciLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvYmplY3RBcnJheUNhckFycmF5Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2Uvb2JqZWN0QXJyYXlDYXJBcnJheSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ib2JqZWN0QXJyYXlDYXJBcnJheSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9Im9iamVjdEFycmF5Q2FyQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvYmplY3RGbG9hdCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL29iamVjdEZsb2F0Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJvYmplY3RGbG9hdCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9Im9iamVjdEZsb2F0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idm9pZExhc3RUcmFkZVR5cGUiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJEb2NMaXRCYXJlU2VydmljZS92b2lkTGFzdFRyYWRlVHlwZSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0idm9pZExhc3RUcmFkZVR5cGUiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN0cmluZ1N0cmluZyI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL3N0cmluZ1N0cmluZyIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ic3RyaW5nU3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ic3RyaW5nU3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW50QXJyYXlPYmplY3RBcnJheSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL2ludEFycmF5T2JqZWN0QXJyYXkiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImludEFycmF5T2JqZWN0QXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJpbnRBcnJheU9iamVjdEFycmF5Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icU5hbWVRTmFtZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL3FOYW1lUU5hbWUiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InFOYW1lUU5hbWUiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJxTmFtZVFOYW1lIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYmlnRGVjaW1hbEJpZ0RlY2ltYWwiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJEb2NMaXRCYXJlU2VydmljZS9iaWdEZWNpbWFsQmlnRGVjaW1hbCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iYmlnRGVjaW1hbEJpZ0RlY2ltYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJiaWdEZWNpbWFsQmlnRGVjaW1hbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNhbGVuZGFyRGlhYmxvIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2UvY2FsZW5kYXJEaWFibG8iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImNhbGVuZGFyRGlhYmxvIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iY2FsZW5kYXJEaWFibG8iLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmbG9hdEZsb2F0Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2UvZmxvYXRGbG9hdCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0iZmxvYXRGbG9hdCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImZsb2F0RmxvYXQiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzdHJpbmdBcnJheVN0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iRG9jTGl0QmFyZVNlcnZpY2Uvc3RyaW5nQXJyYXlTdHJpbmdBcnJheSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ic3RyaW5nQXJyYXlTdHJpbmdBcnJheSIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InN0cmluZ0FycmF5U3RyaW5nQXJyYXkiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnREaWFibG8iPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJEb2NMaXRCYXJlU2VydmljZS9pbnREaWFibG8iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImludERpYWJsbyIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9ImludERpYWJsbyIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNob3J0Q2hhbmdlVHlwZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL3Nob3J0Q2hhbmdlVHlwZSIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ic2hvcnRDaGFuZ2VUeXBlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgcGFydD0ic2hvcnRDaGFuZ2VUeXBlIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2hvcnRTaG9ydCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249IkRvY0xpdEJhcmVTZXJ2aWNlL3Nob3J0U2hvcnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIHBhcnQ9InNob3J0U2hvcnQiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9InRleHQveG1sIiBwYXJ0PSJzaG9ydFNob3J0Ii8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iRG9jTGl0QmFyZVNlcnZpY2UiPgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkRvY0xpdEJhcmVTZXJ2aWNlU09BUDExcG9ydF9odHRwIiBiaW5kaW5nPSJheGlzMjpEb2NMaXRCYXJlU2VydmljZVNPQVAxMUJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdEJhcmVTZXJ2aWNlIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkRvY0xpdEJhcmVTZXJ2aWNlU09BUDEycG9ydF9odHRwIiBiaW5kaW5nPSJheGlzMjpEb2NMaXRCYXJlU2VydmljZVNPQVAxMkJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXAxMjphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRG9jTGl0QmFyZVNlcnZpY2UiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgICAgIDx3c2RsOnBvcnQgbmFtZT0iRG9jTGl0QmFyZVNlcnZpY2VIdHRwcG9ydCIgYmluZGluZz0iYXhpczI6RG9jTGl0QmFyZVNlcnZpY2VIdHRwQmluZGluZyI+Ci0gICAgICAgICAgICA8aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRG9jTGl0QmFyZVNlcnZpY2UiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheGJyaS90ZXN0LXJlc291cmNlcy93c2RsL1Rlc3QwMS53c2RsIGIvMV81L21vZHVsZXMvamF4YnJpL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVGVzdDAxLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjEyMjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4YnJpL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVGVzdDAxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly93c25zLmZvby5jb20vYXhpczIvdGVzdDAxIiB4bWxuczp0eXA9Imh0dHA6Ly94bWxucy5mb28uY29tL2F4aXMyL3Rlc3QwMSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyBodHRwOi8vd3d3LmZvby5jb20vd3NkbC54c2QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzbnMuZm9vLmNvbS9heGlzMi90ZXN0MDEiIG5hbWU9IlRlc3QwMSI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sbnMuZm9vLmNvbS9heGlzMi90ZXN0MDEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFkZCI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBcmcxIiB0eXBlPSJ4czppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFyZzIiIHR5cGU9InhzOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBZGRSZXR1cm4iIHR5cGU9InhzOmludCIvPgotICAgICAgICA8L3hzOnNjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxtZXNzYWdlIG5hbWU9IkFkZCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtcyIgZWxlbWVudD0idHlwOkFkZCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJBZGRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idHlwOkFkZFJldHVybiIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iVGVzdDAxUG9ydFR5cGUiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkFkZCI+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iQWRkIiBtZXNzYWdlPSJ0bnM6QWRkIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9IkFkZFJlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6QWRkUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJUZXN0MDFQb3J0QmluZGluZyIgdHlwZT0idG5zOlRlc3QwMVBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iQWRkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJBZGQiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93c25zLmZvby5jb20vYXhpczIvdGVzdDAxIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3Nucy5mb28uY29tL2F4aXMyL3Rlc3QwMSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJUZXN0MDEiPgotICAgICAgICA8cG9ydCBuYW1lPSJBeGlzMlNhbXBsZURvY0xpdFBvcnQiIGJpbmRpbmc9InRuczpUZXN0MDFQb3J0QmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vcmVxdWllbS5mb28uY29tOjgwODAvYXhpczIvc2VydmljZXMvVGVzdDAxIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4YnJpL3Rlc3Qvb3JnL3RlbXAvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4YnJpL3Rlc3Qvb3JnL3RlbXAvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzEyOGJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheGJyaS90ZXN0L29yZy90ZW1wL2RvY2xpdGJhcmUvRG9jTGl0QmFyZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy50ZW1wLmRvY2xpdGJhcmU7Ci0KLWltcG9ydCBvcmcudGVtcC5kb2NsaXRiYXJlLmpheGIueHNkLkNoYW5nZVR5cGU7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5qYXhiLnhzZC5HZXRTdG9ja1F1b3RlOwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUuamF4Yi54c2QuTGFzdFRyYWRlVHlwZTsKLWltcG9ydCBvcmcudGVtcC5kb2NsaXRiYXJlLmpheGIueHNkLk9iamVjdEZhY3RvcnkyOwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUucG9qby5hcnJheXMueHNkLkNhckFycmF5OwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUucG9qby5hcnJheXMueHNkLkZsb2F0QXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLmFycmF5cy54c2QuT2JqZWN0QXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLmFycmF5cy54c2QuU3RyaW5nQXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLnhzZC5DYXI7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLnhzZC5EaWFibG87Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS5wb2pvLnhzZC5GaWdodGVyOwotaW1wb3J0IG9yZy50ZW1wLmRvY2xpdGJhcmUueHNkLkNhbGVuZGFyU3RyaW5nQXJyYXk7Ci1pbXBvcnQgb3JnLnRlbXAuZG9jbGl0YmFyZS54c2QuSW50QXJyYXlPYmplY3RBcnJheVJlc3VsdDsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLQotCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZVNlcnZpY2UgewotCi0gICAgcHVibGljIFN0cmluZyBzdHJpbmdDYXIoCi0gICAgICAgICAgICBDYXIgY2FyQXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50RmxvYXQoCi0gICAgICAgICAgICBmbG9hdCBmbG9hdEFyZ0IpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYm9vbGVhbkJvb2xlYW4oCi0gICAgICAgICAgICBib29sZWFuIGJvb2xBcmcpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBHZXRTdG9ja1F1b3RlIGdldFN0b2NrUXVvdGVJbnQoCi0gICAgICAgICAgICBpbnQgaW50QXJnQykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxvYXRBcnJheSBmbG9hdEFycmF5RmlnaHRlcigKLSAgICAgICAgICAgIEZpZ2h0ZXIgZmlnaHRlckFyZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2b2lkSW50KAotICAgICAgICAgICAgaW50IGludEFyZ0EpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gYnl0ZUFycmF5SW50QXJyYXkoCi0gICAgICAgICAgICBpbnRbXSBpbnRBcnJheUFyZykgewotICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGNhbGVuZGFyU3RyaW5nQXJyYXkoCi0gICAgICAgICAgICBDYWxlbmRhclN0cmluZ0FycmF5IGNhbGVuZGFyU3RyaW5nQXJyYXkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkyIG9iamVjdEZhY3RvcnlDYXIoCi0gICAgICAgICAgICBDYXIgY2FyQXJnQikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nQXJyYXkgc3RyaW5nQXJyYXlJbnQoCi0gICAgICAgICAgICBpbnQgaW50QXJnQikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBieXRlQnl0ZSgKLSAgICAgICAgICAgIGJ5dGUgYnl0ZUFyZykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHN0cmluZ1ZvaWQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50U3RyaW5nKAotICAgICAgICAgICAgU3RyaW5nIHN0cmluZ0FyZ0EpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdEFycmF5IG9iamVjdEFycmF5Q2FyQXJyYXkoCi0gICAgICAgICAgICBDYXJBcnJheSBjYXJBcnJheUFyZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG9iamVjdEZsb2F0KAotICAgICAgICAgICAgZmxvYXQgZmxvYXRBcmcpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdm9pZExhc3RUcmFkZVR5cGUoCi0gICAgICAgICAgICBMYXN0VHJhZGVUeXBlIGx0dEFyZykgewotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBzdHJpbmdTdHJpbmcoCi0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nQXJnQikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50QXJyYXlPYmplY3RBcnJheVJlc3VsdCBpbnRBcnJheU9iamVjdEFycmF5KAotICAgICAgICAgICAgT2JqZWN0QXJyYXkgb2JqZWN0QXJyYXlBcmcpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBxTmFtZVFOYW1lKAotICAgICAgICAgICAgT2JqZWN0IHFOYW1lQXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIGJpZ0RlY2ltYWxCaWdEZWNpbWFsKAotICAgICAgICAgICAgQmlnRGVjaW1hbCBiaWdEZWNpbWFsQXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxHcmVnb3JpYW5DYWxlbmRhciBjYWxlbmRhckRpYWJsbygKLSAgICAgICAgICAgIERpYWJsbyBkYWJsb0FyZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZmxvYXRGbG9hdCgKLSAgICAgICAgICAgIGZsb2F0IGZsb2F0QXJnQykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nQXJyYXkgc3RyaW5nQXJyYXlTdHJpbmdBcnJheSgKLSAgICAgICAgICAgIFN0cmluZ0FycmF5IHN0cmluZ0FycmF5QXJnKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW50RGlhYmxvKAotICAgICAgICAgICAgRGlhYmxvIGRpYWJsb0FyZ0EpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0Q2hhbmdlVHlwZSgKLSAgICAgICAgICAgIENoYW5nZVR5cGUgY3RBcmcpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IHNob3J0U2hvcnQoCi0gICAgICAgICAgICBzaG9ydCBzaG9ydEFyZykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXhicmkvdGVzdC9vcmcvdGVtcC9kb2NsaXRiYXJlL0RvY0xpdEJhcmVXU0RMVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4YnJpL3Rlc3Qvb3JnL3RlbXAvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlV1NETFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlYTcwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXhicmkvdGVzdC9vcmcvdGVtcC9kb2NsaXRiYXJlL0RvY0xpdEJhcmVXU0RMVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcudGVtcC5kb2NsaXRiYXJlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXhicmkuSmF4YlNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExCdWlsZGVyOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIERvY0xpdEJhcmVXU0RMVGVzdCBleHRlbmRzIFhNTFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRlc3QtcmVzb3VyY2VzL3dzZGwvRG9jTGl0QmFyZVNlcnZpY2Uud3NkbCI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHsKLSAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKHRydWUpOwotICAgICAgICBGaWxlIHRlc3RSZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBKYXZhMldTRExCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmF2YTJXU0RMQnVpbGRlcihiYW9zLCBEb2NMaXRCYXJlU2VydmljZS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRTY2hlbWFHZW5DbGFzc05hbWUoSmF4YlNjaGVtYUdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAvL2Fzc2VydFhNTEVxdWFsKG5ldyBGaWxlUmVhZGVyKHRlc3RSZXNvdXJjZUZpbGUpLCBuZXcgU3RyaW5nUmVhZGVyKG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgWE1MVW5pdC5zZXRJZ25vcmVXaGl0ZXNwYWNlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vYnVpbGQueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ4OTZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxwcm9qZWN0IG5hbWU9Iml0ZXN0IiBkZWZhdWx0PSJidWlsZC1yZXBvIiBiYXNlZGlyPSIuIj4NCi0NCi0JPHRhcmdldCBuYW1lPSJidWlsZC1yZXBvIiB1bmxlc3M9InRlc3Quc2tpcCI+DQotDQotCQk8IS0tIFN0YW5kYXJkIHJlcG9zaXRvcnkgLS0+DQotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeSIvPg0KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZiIvPg0KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvc2VydmljZXMiLz4NCi0JCTxta2RpciBkaXI9InRhcmdldC9yZXBvc2l0b3J5L21vZHVsZXMiLz4NCi0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciINCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvbW9kdWxlcy9hZGRyZXNzaW5nLSR7YWRkcmVzc2luZ192ZXJzaW9ufS5tYXIiLz4NCi0JCTxjb3B5IGZpbGU9Ii4uL2tlcm5lbC9jb25mL2F4aXMyLnhtbCINCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4NCi0NCi0JPC90YXJnZXQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmRlZWY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3cy1pbnRlZ3JhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKQVhXUyBJbnRlZ3JhdGlvbiBUZXN0czwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgSkFYV1MgSW50ZWdyYXRpb24gVGVzdHM8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFubm90YXRpb25fMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFkZHJlc3Npbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNhYWo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb248L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb248L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi53c2RsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgLVhib290Y2xhc3NwYXRoL3A6JHtiYXNlZGlyfS8uLi9qYXh3cy1hcGkvdGFyZ2V0L2NsYXNzZXMke3BhdGguc2VwYXJhdG9yfSR7YmFzZWRpcn0vLi4vandzLWFwaS90YXJnZXQvY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlclZlcnNpb24+MS41PC9jb21waWxlclZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlcmVzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMveHNkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5vdXRwdXQuYmFzZS5kaXIiIHZhbHVlPSJ0YXJnZXQvc2NoZW1hIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9zcmMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmcm9tIFhTRHM8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHNvYXAgMTE8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgJHtzY2hlbWEuc291cmNlLmRpcn0vc29hcDExLnhzZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBlY2hvLnhzZDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAke3NjaGVtYS5zb3VyY2UuZGlyfS9lY2hvLnhzZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBzdG9jazEueHNkPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3N0b2NrMS54c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gc3RvY2syLnhzZDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAke3NjaGVtYS5zb3VyY2UuZGlyfS9zdG9jazIueHNkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHNhbXBsZW10b20ueHNkPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3NhbXBsZW10b20ueHNkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGdyZWV0ZXJUeXBlcy54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgJHtzY2hlbWEuc291cmNlLmRpcn0vZ3JlZXRlclR5cGVzLnhzZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBQcm94eURvY0xpdFdyYXBwZWQud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtcCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkIC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vUHJveHlEb2NMaXRXcmFwcGVkLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gQWRkTnVtYmVycy53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9BZGROdW1iZXJzLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gUHJveHlEb2NMaXRub25XcmFwcGVkLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L1Byb3h5RG9jTGl0bm9uV3JhcHBlZC53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHNhbXBsZW10b21qcGVnLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L3NhbXBsZW10b21qcGVnLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gUlBDTGl0LndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcCBvcmcudGVzdC5wcm94eS5ycGNsaXQgLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9SUENMaXQud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBSUENMaXRTV0Eud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1wIG9yZy50ZXN0LnByb3h5LnJwY2xpdHN3YSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L1JQQ0xpdFNXQS53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGdvcmlsbGFfZGx3LndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L2dvcmlsbGFfZGx3LndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gU09BUDEyRWNoby53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9TT0FQMTJFY2hvLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gQWRkTnVtYmVyc0hhbmRsZXIud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vQWRkTnVtYmVyc0hhbmRsZXIud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBhc3luY19kb2NsaXR3ci53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9hc3luY19kb2NsaXR3ci53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGFzeW5jX2RvY2xpdHdyMi53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9hc3luY19kb2NsaXR3cjIud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBGYXVsdHlXZWJTZXJ2aWNlLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0ZhdWx0eVdlYlNlcnZpY2Uud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBGYXVsdHNTZXJ2aWNlLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0ZhdWx0c1NlcnZpY2Uud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBqYXhic291cmNlPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC1wIG9yZy50ZXN0LmRpc3BhdGNoLmpheGJzb3VyY2UgJHtzY2hlbWEuc291cmNlLmRpcn0vamF4YnNvdXJjZS54c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZG9jbGl0X25vbndyYXAud3NkbCBmb3IgamF2YWJlYW4gZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9kb2NsaXRfbm9ud3JhcC53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGRvY2xpdHdyYXAud3NkbCBmb3IgamF2YWJlYW4gZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9kb2NsaXR3cmFwLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZG9jbGl0YmFyZS53c2RsIGZvciBqYXZhYmVhbiBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L2RvY2xpdGJhcmUud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gRWNob01lc3NhZ2Uud3NkbCBmb3IgamF2YWJlYW4gZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9FY2hvTWVzc2FnZS53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSByZXNvdXJjZWluamVjdGlvbi53c2RsIGZvciBqYXZhYmVhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQgUmVzb3VyY2UgSW5qZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9yZXNvdXJjZWluamVjdGlvbi53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIEFueVR5cGUud3NkbCBmb3IgamF2YWJlYW4gZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFueVR5cGUgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0FueVR5cGUud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBNZXNzYWdlQ29udGV4dC53c2RsIGZvciBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L01lc3NhZ2VDb250ZXh0LndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gV1NETE11bHRpVGVzdHMud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vV1NETE11bHRpVGVzdHMud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBQb2x5bW9ycGhpYyBzaGFwZXMud3NkbCBmb3IgamF2YWJlYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50IHN1cHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9zaGFwZXMud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBTT0FQQWN0aW9uVGVzdC53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9TT0FQQWN0aW9uVGVzdC53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIHJwY2xpdGVudW0ud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vcnBjbGl0ZW51bS53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIEFkZE51bWJlcnNIYW5kbGVyLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L0FkZE51bWJlcnNIYW5kbGVyLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gcnBjbGl0c3RyaW5nYXJyYXkud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vcnBjbGl0c3RyaW5nYXJyYXkud3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBzd2FtdG9tc2VydmljZS53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9zd2FtdG9tc2VydmljZS53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZC1yZXBvPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzIHVubGVzcz0ibWF2ZW4udGVzdC5za2lwIj4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuYWJsZSBBZGRyZXNzaW5nIG9uIHRoZSBjbGllbnQgc2lkZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvY2xpZW50LXJlcG8vbW9kdWxlcy8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHtwcm9qZWN0LnZlcnNpb259Lm1hciIgdG9maWxlPSIuL3RhcmdldC9jbGllbnQtcmVwby9tb2R1bGVzL2FkZHJlc3NpbmctJHtwcm9qZWN0LnZlcnNpb259Lm1hciIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuYWJsZSBBZGRyZXNzaW5nIG9uIHRoZSBzZXJ2ZXIgc2lkZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iLi90YXJnZXQvdGVzdC1jbGFzc2VzL21vZHVsZXMvIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIuLi9hZGRyZXNzaW5nL3RhcmdldC9hZGRyZXNzaW5nLSR7cHJvamVjdC52ZXJzaW9ufS5tYXIiIHRvZmlsZT0iLi90YXJnZXQvdGVzdC1jbGFzc2VzL21vZHVsZXMvYWRkcmVzc2luZy0ke3Byb2plY3QudmVyc2lvbn0ubWFyIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb24tSkFYV1Mgc2VydmljZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlcy9FY2hvU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJzZXJ2ZXIvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qLmphdmEiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZXMvQm9va1N0b3JlU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9Ii4vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEpBWFdTIHNlcnZpY2VzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm92aWRlciBlbmRwb2ludCBTZXJ2aWNlIFNhbXBsZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvV1NHZW5TZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW50ZXJmYWNlLmNsYXNzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW1wbC5jbGFzcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9qYXh3cy8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9XU0dlblNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1dTR2VuU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvV1NHZW5TZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0Jhc2ljQXV0aFNlY3VyaXR5U2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZWN1cml0eS9zZXJ2ZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFzaWNBdXRoU2VjdXJpdHlTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0Jhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdQcm92aWRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ1Byb3ZpZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdQcm92aWRlclNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZ21zZy8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZ21zZy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2ciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb3VyY2VQcm92aWRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvdXJjZVByb3ZpZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlUHJvdmlkZXJTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb3VyY2VQcm92aWRlclNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2Vtc2ciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2ciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20vKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnY2hlY2ttdG9tL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlclNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvSkFYQlByb3ZpZGVyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2pheGIvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2pheGIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3NjaGVtYS9jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvdGVzdC9tdG9tLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9KQVhCUHJvdmlkZXJTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9KQVhCUHJvdmlkZXJTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9KQVhCUHJvdmlkZXJTZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NlbmRJbWFnZVNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC9zY2hlbWEvY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NlbmRJbWFnZVNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NlbmRJbWFnZVNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NlbmRJbWFnZVNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyU2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TV0FNVE9NU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU1dBTVRPTVNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NXQU1UT01TZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TV0FNVE9NU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFByb3h5IGVuZHBvaW50IFNlcnZpY2UgU2FtcGxlcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qcm94eURvY0xpdFdyYXBwZWQvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Byb3h5RG9jTGl0V3JhcHBlZC5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUHJveHlEb2NMaXRXcmFwcGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qcm94eURvY0xpdFdyYXBwZWQiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUHJveHlEb2NMaXRub25XcmFwcGVkLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qcm94eURvY0xpdG5vbldyYXBwZWQuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Byb3h5RG9jTGl0bm9uV3JhcHBlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUHJveHlEb2NMaXRub25XcmFwcGVkIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdC8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0LmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdCIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXRTV0EvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdFNXQS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0U1dBIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXRTV0EiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkcmVzc2luZ1Byb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2FkZHJlc3NpbmcvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkcmVzc2luZ1Byb3ZpZGVyLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGRyZXNzaW5nUHJvdmlkZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZHJlc3NpbmdQcm92aWRlciIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQMTJFY2hvU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL3NlcnZlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQMTJFY2hvU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUDEyRWNob1NlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NPQVAxMkVjaG9TZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL2dvcmlsbGFfZGx3LyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9nb3JpbGxhX2Rsdy5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvZ29yaWxsYV9kbHciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL2dvcmlsbGFfZGx3IiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBYTUwgSFRUUCBUZXN0cyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy8qLmNsYXNzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc3RyaW5nLyouY2xhc3MiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlU3RyaW5nUHJvdmlkZXIiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTb3VyY2VQcm92aWRlci8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zb3VyY2UvKi5jbGFzcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTb3VyY2VQcm92aWRlci5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTb3VyY2VQcm92aWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWFBheWxvYWRTb3VyY2VQcm92aWRlciIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3NvdXJjZS8qLmNsYXNzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3NvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvKi5jbGFzcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9kYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1hNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEphdmEgQmVhbiBFbmRwb2ludCBTYW1wbGVzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZHJlc3NCb29rU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZHJlc3NCb29rU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkcmVzc0Jvb2tTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGRyZXNzQm9va1NlcnZpY2UiIC8+Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BcHBsZUZpbmRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi8qIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vamF4d3MvKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FwcGxlRmluZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXBwbGVGaW5kZXJTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BcHBsZUZpbmRlclNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvTXRvbVNhbXBsZVNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvTXRvbVNhbXBsZVNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL010b21TYW1wbGVTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9NdG9tU2FtcGxlU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRG9jTGl0Tm9uV3JhcFNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXROb25XcmFwU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRG9jTGl0Tm9uV3JhcFNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0RvY0xpdE5vbldyYXBTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXRXcmFwU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0RvY0xpdFdyYXBTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Eb2NMaXRXcmFwU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRG9jTGl0V3JhcFNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkTnVtYmVyc1NlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGROdW1iZXJzU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvR3JlZXRlclNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0dyZWV0ZXJTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9HcmVldGVyU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvR3JlZXRlclNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FzeW5jU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Bc3luY1NlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQXN5bmNTZXJ2aWNlMi8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Bc3luY1NlcnZpY2UyLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Bc3luY1NlcnZpY2UyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Bc3luY1NlcnZpY2UyIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9GYXVsdHlXZWJTZXJ2aWNlU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRmF1bHR5V2ViU2VydmljZVNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0c1NlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0c1NlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0c1NlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0ZhdWx0c1NlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdFNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0JhcmVEb2NMaXRTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXJlRG9jTGl0U2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdFNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRWNob01lc3NhZ2VTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9FY2hvTWVzc2FnZVNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0VjaG9NZXNzYWdlU2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvRWNob01lc3NhZ2VTZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Ik1FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb3B5PgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZSIgLz4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0FueVR5cGVNZXNzYWdlU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQW55VHlwZU1lc3NhZ2VTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UiIC8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvTWVzc2FnZUNvbnRleHRTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9NZXNzYWdlQ29udGV4dFNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL01lc3NhZ2VDb250ZXh0U2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvTWVzc2FnZUNvbnRleHRTZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1BvbHltb3JwaGljU2hhcGVTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1BvbHltb3JwaGljU2hhcGVTZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdEVudW1TZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXRFbnVtU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0RW51bVNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdEVudW1TZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdFN0cmluZ0FycmF5U2VydmljZS8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL3Rlc3QvcnBjbGl0L3N0cmluZ2FycmF5LyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5LyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1JQQ0xpdFN0cmluZ0FycmF5U2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIiAvPgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdE1pblNlcnZpY2UvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi8qKiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9CYXJlRG9jTGl0TWluU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvQmFyZURvY0xpdE1pblNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0JhcmVEb2NMaXRNaW5TZXJ2aWNlIiAvPgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ0xpc3RTZXJ2aWNlLyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3QvKioiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU3RyaW5nTGlzdFNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1N0cmluZ0xpc3RTZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TdHJpbmdMaXN0U2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCTxjb3B5IHRvRGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NPQVBCaW5kaW5nUHJvdmlkZXJTZXJ2aWNlLyI+Ci0JCQkJCQkJCQk8ZmlsZXNldCBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMiPgotCQkJCQkJCQkJICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9TT0FQQmluZGluZ1Byb3ZpZGVyKioiIC8+Ci0JCQkJCQkJCQkgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0idGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nIj4KLQkJCQkJCQkJCSAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotCQkJCQkJCQkJICAgPGV4Y2x1ZGUgbmFtZT0ic2VydmljZXMueG1sIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQk8L2NvcHk+Ci0JCQkJCQkJCTx6aXAgZGVzdGZpbGU9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUEJpbmRpbmdQcm92aWRlclNlcnZpY2UuamFyIiBiYXNlZGlyPSIke3BvbS5iYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NPQVBCaW5kaW5nUHJvdmlkZXJTZXJ2aWNlIiAvPgotCQkJCQkJICAgICAgICAKLQkJCQkJCSAgICAgICAgPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUEJpbmRpbmdQcm92aWRlclNlcnZpY2UiIC8+Ci0JCQkJCQkgICAgICAgIAotCQkJCQkJCQk8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZS8iPgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzIj4KLQkJCQkJCQkJCSAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc3RyaW5nLyoqIiAvPgotCQkJCQkJCQkJICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zdHJpbmcvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc3RyaW5nIj4KLQkJCQkJCQkJCSAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIiAvPgotCQkJCQkJCQkJICAgIDxleGNsdWRlIG5hbWU9InNlcnZpY2VzLnhtbCIgLz4KLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJPC9jb3B5PgotCQkJCQkJCQkKLQkJCQkJCQkJPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9TT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclNlcnZpY2UiIC8+Ci0JCQkJCQkgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NPQVBCaW5kaW5nU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIiAvPgotCQkJCQkJICAgICAgICAKLQkJCQkJCQkJPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UvIj4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3NvYXBtc2cvKioiIC8+Ci0JCQkJCQkJCQkgICA8ZXhjbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3NvYXBtc2cvTUVUQS1JTkYvc2VydmljZXMueG1sIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc29hcG1zZyI+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIgLz4KLQkJCQkJCQkJCSAgICA8ZXhjbHVkZSBuYW1lPSJzZXJ2aWNlcy54bWwiIC8+Ci0JCQkJCQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJCQkJCTwvY29weT4KLQkJCQkJCQkJPHppcCBkZXN0ZmlsZT0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZS5qYXIiIGJhc2VkaXI9IiR7cG9tLmJhc2VkaXJ9L3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiIC8+Ci0JCQkJCQkgICAgICAgIDxkZWxldGUgZGlyPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIiAvPgotCQkJCQkJICAgICAgICAKLQkJCQkJCQkJPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvSGFuZGxlckhlYWRlclNlcnZpY2UvIj4KLQkJCQkJCQkJCTxmaWxlc2V0IGRpcj0idGFyZ2V0L3Rlc3QtY2xhc3NlcyI+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyLyoqIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIiPgotCQkJCQkJCQkJICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiIC8+Ci0JCQkJCQkJCQkgICA8aW5jbHVkZSBuYW1lPSJoYW5kbGVyLnhtbCIgLz4JCQkJCQkJCQkgICAKLQkJCQkJCQkJCTwvZmlsZXNldD4KLQkJCQkJCQkJCQotCQkJCQkJCQk8L2NvcHk+CQotCQkJCQkJCQk8IS0tIFdlIGhhdmUgdG8gZXhwbGljaXRseSBjb3B5IHRoZSB4bWwgZmlsZSByZWZlcmVkIHRvIGJ5IHRoZSBjbGllbnQgaW50ZXJmYWNlIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIC0tPgotCQkJCQkJCQk8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy8iPgotCQkJCQkJCQkJPGZpbGVzZXQgZGlyPSJ0ZXN0Ij4KLQkJCQkJCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL2hhbmRsZXIueG1sIiAvPgotCQkJCQkJCQkJPC9maWxlc2V0PgotCQkJCQkJCQk8L2NvcHk+Ci0JCQkJCQkJCQotCQkJCQkJCQk8emlwIGRlc3RmaWxlPSJ0YXJnZXQvdGVzdC1jbGFzc2VzL3NlcnZpY2VqYXJzL0hhbmRsZXJIZWFkZXJTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtwb20uYmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9zZXJ2aWNlamFycy9IYW5kbGVySGVhZGVyU2VydmljZSIgLz4KLQkJCQkJCQkJPGRlbGV0ZSBkaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZWphcnMvSGFuZGxlckhlYWRlclNlcnZpY2UiIC8+Ci0JCQkJCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0LXJlc291cmNlcy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9heGlzMi54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFkZC10ZXN0LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXRlc3Qtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vdGFyZ2V0L3NjaGVtYS9zcmM8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5wZXJ0ZXN0PC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhtczI1Nm0gLVhteDUxMm08L2FyZ0xpbmU+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gRW5hYmxlIHRoZSBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGEgZGVidWdnZXIKLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTXVsdGlSZWRpcmVjdGlvbkNhdGFsb2dUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9EaXNwYXRjaFNvYXBBY3Rpb25UZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Qcm94eVNvYXBBY3Rpb25UZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9EaXNwYXRjaE1UT01GZWF0dXJlVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovSW52b2NhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Qcm94eU1UT01GZWF0dXJlVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU09BUDEyRGlzcGF0Y2hUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9PTUVsZW1lbnREaXNwYXRjaFRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0pBWEJDb250ZXh0VGVzdC5qYXZhPC9pbmNsdWRlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TdHJpbmdQcm92aWRlclRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TT0FQRmF1bHRQcm92aWRlclRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TdHJpbmdNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU291cmNlUHJvdmlkZXJUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU291cmNlTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1NvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1Byb3h5VGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1Byb3h5Tm9uV3JhcHBlZFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9SUENQcm94eVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9SUENMaXRTV0FQcm94eVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0dvcmlsbGFETFdQcm94eVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TT0FQMTJQcm94eVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9CYXNpY0F1dGhTZWN1cml0eVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9BZGRyZXNzQm9va1Rlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9NdG9tU2FtcGxlVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0pBWEJQcm92aWRlclRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9CYXJlVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0FkZE51bWJlcnNIYW5kbGVyVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0FkZE51bWJlcnNUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovRExXTWluVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0ZhdWx0c1NlcnZpY2VUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovV3JhcFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1dTR2VuVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL05vbkFub255bW91c0NvbXBsZXhUeXBlVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1Jlc291cmNlSW5qZWN0aW9uVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0FueVR5cGVUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovUG9seW1vcnBoaWNUZXN0cy5qYXZhPC9pbmNsdWRlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9EaXNwYXRjaFhQYXlsb2FkU3RyaW5nVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0Rpc3BhdGNoWE1lc3NhZ2VTdHJpbmdUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovRGlzcGF0Y2hYUGF5bG9hZFNvdXJjZVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9EaXNwYXRjaFhNZXNzYWdlU291cmNlVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0Rpc3BhdGNoWFBheWxvYWRKQVhCVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0Rpc3BhdGNoWE1lc3NhZ2VEYXRhU291cmNlVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1JQQ0xpdEVudW1UZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovUlBDTGl0U3RyaW5nQXJyYXlUZXN0cy5qYXZhPC9pbmNsdWRlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TdHJlYW1Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9ET01Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TQVhTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9TT0FQTWVzc2FnZURpc3BhdGNoVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0pBWEJEaXNwYXRjaFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9KQVhCU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU3RyaW5nRGlzcGF0Y2hUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovUGFyYW1UZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovRG9jTGl0QmFyZU1pblRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9NdG9tU2FtcGxlQnl0ZUFycmF5VGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0hhbmRsZXJUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU3RyaW5nTGlzdFRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Ob25XcmFwVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0ZhdWx0eVdlYlNlcnZpY2VUZXN0cy5qYXZhPC9pbmNsdWRlPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1BhcmFsbGVsQXN5bmNUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU1dBTVRPTVRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9SdW50aW1lRXhjZXB0aW9uc0FzeW5jTWVwVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQWRkcmVzc2luZ1Byb3ZpZGVyVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1R5cGVTdWJzdGl0dXRpb25UZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU09BUEJpbmRpbmdQcm92aWRlclRlc3RzLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1N0cmluZ1Byb3ZpZGVyVGVzdHMuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5PQVNJU0NhdGFsb2dNYW5hZ2VyLmNhdGFsb2cuZGVidWcubGV2ZWw8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPjA8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5idWlsZC5yZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4uL3RhcmdldC90ZXN0LWNsYXNzZXM8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLk1lc3NhZ2VGYWN0b3J5SW1wbDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEZhY3RvcnlJbXBsPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb25GYWN0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUENvbm5lY3Rpb25GYWN0b3J5SW1wbDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmF4LnhtbC5zb2FwLk1ldGFGYWN0b3J5PC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmF4aXMyLnNhYWouU0FBSk1ldGFGYWN0b3J5SW1wbDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOZWVkIHRoaXMgZm9yIHRoZSBjbGllbnQgc2lkZSB0byBwaWNrdXAgYW4gYXhpczIueG1sIHRvIGNvbmZpZ3VyZSBTb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29uZmlnLnBhdGg8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPi4vdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9heGlzMi54bWw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmVlZCB0aGlzIGZvciB0aGUgY2xpZW50IHNpZGUgdG8gcGlja3VwIHRoZSBhZGRyZXNzaW5nIG1hciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlcG8ucGF0aDwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+Li90YXJnZXQvY2xpZW50LXJlcG88L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHJldmVudCBNYWMgT1MgWCBmcm9tIHNob3dpbmcgYW4gaWNvbiBpbiB0aGUgZG9jayBkdXJpbmcgdGhlIHRlc3QgcnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmEuYXd0LmhlYWRsZXNzPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmYyNDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPg0KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+dHJ1ZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24tLT4NCi0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+DQotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4NCi0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRoaXMgaXMgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgb2YgYWRtaW4gY29uc29sZS0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4NCi0gICAgPCEtLVNlcnZpY2VzRGlyZWN0b3J5IG9ubHkgd29ya3Mgb24gdGhlIGZvbGxvd2luZyBjYXNlcy0tPg0KLSAgICA8IS0tLUZpbGUgYmFzZWQgY29uZmlndXJhdG9yIGFuZCBpbiB0aGF0IGNhc2UgdGhlIHZhbHVlIHNob3VsZCBiZSBhIGZpbGUgVVJMIChodHRwOi8vIG5vdCBhbGxvd2VkKS0tPg0KLSAgICA8IS0tLVdoZW4gY3JlYXRpbmcgVVJMIEJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIFVSTCDigJxmaWxlOi8v4oCdICAtLT4NCi0gICAgPCEtLS0gV2FyIGJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIGV4cGFuZGVkIGNhc2UgLCAtLT4NCi0NCi0gICAgPCEtLUFsbCB0aGUgb3RoZXIgc2NlbmFyaW9zIGl0IHdpbGwgYmUgaWdub3JlZC4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPg0KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhvc2UgZW5kcG9pbnRzLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1KQVhXUyBkZXBsb3llciBmb3Igc2VydmljZWphcnMsIHRoaXMgd2lsbCBhbGxvdyB1c2VycyB0byBkcm9wIC5qYXIgZmlsZXMgYW5kIGhhdmUgdGhlbSBkZXBsb3llZCBhcyBhIHNlcnZpY2UgLS0+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249ImphciIgZGlyZWN0b3J5PSJzZXJ2aWNlamFycyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkpBWFdTRGVwbG95ZXIiLz4NCi0gICAgDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIHNldCB0aGUgaG9zdCBuYW1lIGZvciB0aGUgZXByLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiBsb2NrZWQ9InRydWUiPm15aG9zdC5jb208L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWZhdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPg0KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+DQotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPg0KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlQnVpbGRlcnM+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iLioiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuRGF0YVNvdXJjZUJ1aWxkZXIiLz4NCi0gICAgICAgIDwhLS1MZWZ0IGNvbW1lbnRlZCBiZWNhdXNlIGl0IGFkZHMgdGhlIGRlcGFuZGFuY3kgb2Ygc2VydmxldC1hcGkgdG8gb3RoZXIgbW9kdWxlcy4NCi0gICAgICAgIFBsZWFzZSB1bmNvbW1lbnQgdG8gUmVjZWl2ZSBtZXNzYWdlcyBpbiBtdWx0aXBhcnQvZm9ybS1kYXRhIGZvcm1hdC0tPg0KLSAgICAgICAgPCEtLTxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSItLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+LS0+DQotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVGFyZ2V0IFJlc29sdmVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGFuZCBzcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIGZvciB5b3VyIFRhcmdldFJlc29sdmVyIHRvIGFkZCAtLT4NCi0gICAgPCEtLSBhIFRhcmdldFJlc29sdmVyLiBUYXJnZXRSZXNvbHZlcnMgYXJlIHVzZWQgdG8gcHJvY2VzcyB0aGUgVG8gRVBSIGZvciBleGFtcGxlIHRvIC0tPg0KLSAgICA8IS0tIGNob29zZSBhIHNlcnZlciBpbiBhIGNsdXN0ZXIgLS0+DQotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXJzPi0tPg0KLSAgICA8IS0tPHRhcmdldFJlc29sdmVyIGNsYXNzPSIiIC8+LS0+DQotICAgIDwhLS08L3RhcmdldFJlc29sdmVycz4tLT4NCi0NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiDQotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPg0KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPg0KLSAgICAgICAgPCEtLXVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+DQotICAgICAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+aHR0cDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPg0KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+DQotICAgIDwvdHJhbnNwb3J0U2VuZGVyPg0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+DQotICAgIDwvdHJhbnNwb3J0U2VuZGVyPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGhhc2VzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZS1kZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iRGlzcGF0Y2hPcGVyYXRpb25IYW5kbGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaC5EaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbk91dFBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPg0KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLTwvYXhpc2NvbmZpZz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9heGlzMl9hZGRyZXNzaW5nLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyX2FkZHJlc3NpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjRhMTU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyX2FkZHJlc3NpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPg0KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4NCi0gICAgDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gcGx1Z2luIHlvdXIgb3duIGF0dGFjaG1lbnRzIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbiAtLT4NCi0gICAgPCEtLTxhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMubGlmZWN5Y2xlLmltcGwuTGlmZWN5Y2xlTWFuYWdlckltcGwiLz4tLT4NCi0NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIHJlZHVjdGlvbiBvZiB0aGUgaW4tbWVtb3J5IGNhY2hlIG9mIFdTREwgZGVmaW5pdGlvbnMgLS0+DQotICAgIDwhLS1JbiBzb21lIHNlcnZlciBlbnZpcm9ubWVudHMsIHRoZSBhdmFpbGFibGUgbWVtb3J5IGhlYXAgaXMgbGltaXRlZCBhbmQgY2FuIGZpbGwgdXAgdW5kZXIgbG9hZCAtLT4NCi0gICAgPCEtLVNpbmNlIGluLW1lbW9yeSBjb3BpZXMgb2YgV1NETCBkZWZpbml0aW9ucyBjYW4gYmUgbGFyZ2UsIHNvbWUgc3RlcHMgY2FuIGJlIHRha2VuLS0+DQotICAgIDwhLS10byByZWR1Y2UgdGhlIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSBjYWNoZWQgV1NETCBkZWZpbml0aW9ucy4gLS0+DQotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0icmVkdWNlV1NETE1lbW9yeUNhY2hlIj50cnVlPC9wYXJhbWV0ZXItLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gbWlsbGlzZWNvbmRzLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzAwMDA8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFjayB0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPg0KLSAgICA8IS0tdGhhdCBiZWhhdmlvci4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24tLT4NCi0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+DQotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4NCi0gICAgPCEtLWlzIHNldCwgdGhlbiBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+DQotICAgIDwhLS1TZXJ2aWNlc0RpcmVjdG9yeSBvbmx5IHdvcmtzIG9uIHRoZSBmb2xsb3dpbmcgY2FzZXMtLT4NCi0gICAgPCEtLS1GaWxlIGJhc2VkIGNvbmZpZ3VyYXRvciBhbmQgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBmaWxlIFVSTCAoaHR0cDovLyBub3QgYWxsb3dlZCktLT4NCi0gICAgPCEtLS1XaGVuIGNyZWF0aW5nIFVSTCBCYXNlZCBjb25maWd1cmF0b3Igd2l0aCBVUkwgZmlsZTovLyAtLT4NCi0gICAgPCEtLS0gV2FyIGJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIGV4cGFuZGVkIGNhc2UgLCAtLT4NCi0NCi0gICAgPCEtLUFsbCB0aGUgb3RoZXIgc2NlbmFyaW9zIGl0IHdpbGwgYmUgaWdub3JlZC4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+DQotDQotDQotDQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPg0KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3VpdXNoIHRob3NlIGVuZHBvaW50cy0tPg0KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+DQotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIA0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzdXBwcmVzcyBnZW5lcmF0aW9uIG9mIFNPQVAgMS4yIGJpbmRpbmdzIGluIGF1dG8tZ2VuZXJhdGVkIFdTREwgZmlsZXMgLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNPQVAxMiIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tUE9KTyBkZXBsb3llciAsIHRoaXMgd2lsbCBhbG93IHVzZXJzIHRvIGRyb3AgLmNsYXNzIGZpbGUgYW5kIG1ha2UgdGhhdCBpbnRvIGEgc2VydmljZS0tPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuY2xhc3MiIGRpcmVjdG9yeT0icG9qbyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5QT0pPRGVwbG95ZXIiLz4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmphciIgZGlyZWN0b3J5PSJzZXJ2aWNlamFycyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkpBWFdTRGVwbG95ZXIiLz4NCi0NCi0gICAgPCEtLTxkZXBsb3llciBleHRlbnNpb249Ii5qc2EiIGRpcmVjdG9yeT0icm1pc2VydmljZXMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuUk1JU2VydmljZURlcGxveWVyIi8+LS0+DQotICAgIA0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIGhvc3QgbmFtZSBmb3IgdGhlIGVwci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgbG9ja2VkPSJ0cnVlIj5teWhvc3QuY29tPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udCBlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4NCi0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4NCi0NCi0NCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+DQotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+DQotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPg0KLSAgICANCi0gICAgPHRocmVhZENvbnRleHRNaWdyYXRvcnM+DQotICAgICAgICA8dGhyZWFkQ29udGV4dE1pZ3JhdG9yIGxpc3RJZD0iSkFYV1MtVGhyZWFkQ29udGV4dE1pZ3JhdG9yLUxpc3QiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcubWlncmF0b3IuRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IiLz4NCi0gICAgPC90aHJlYWRDb250ZXh0TWlncmF0b3JzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLVRoaXMgaXMgdGhlIGRlYWZ1bHQgTWVzc2FnZVJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4NCi0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPg0KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4NCi0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cnJpZGUgdGhpcyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+DQotICAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4NCi0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlQnVpbGRlcnM+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPg0KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiDQotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+OTA5MDwvcGFyYW1ldGVyPg0KLSAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZSBzZXR0aW5ncyBmdXJ0aGVyIGJlbG93KToNCi0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkNCi0gICAgICAgICAgICBob3N0bmFtZTogIGlmIG5vbi1udWxsLCB1cmwgcHJlZml4IHVzZWQgaW4gcmVwbHktdG8gZW5kcG9pbnQgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IG51bGwpDQotICAgICAgICAgICAgb3JpZ2luU2VydmVyOiAgdmFsdWUgb2YgaHR0cCBTZXJ2ZXIgaGVhZGVyIGluIG91dGdvaW5nIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiU2ltcGxlLVNlcnZlci8xLjEiKQ0KLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApDQotICAgICAgICAgICAgcmVxdWVzdFRjcE5vRGVsYXk6ICB0cnVlIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIGFuZCBtaW5pbWl6ZSBsYXRlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCB0cnVlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdG8gbWluaW1pemUgYmFuZHdpZHRoIGNvbnN1bXB0aW9uIGJ5IGNvbWJpbmluZyBzZWdtZW50cw0KLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpDQotICAgICAgICAgICAgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgaWYgcXVldWUgZmlsbHMgdXAgICAgICAgICAoZGVmYXVsdCAxNTApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IGRlZmF1bHQgcXVldWUgbmV2ZXIgZmlsbHMgdXA6ICBzZWUgSHR0cEZhY3RvcnkNCi0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IG5vIHN1Y2ggdGhyZWFkcyBjYW4gZXhpc3Qgd2l0aCBkZWZhdWx0IHVuYm91bmRlZCByZXF1ZXN0IHF1ZXVlDQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ6ICBUaW1lVW5pdCBvZiB2YWx1ZSBpbiB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBTRUNPTkRTKQ0KLSAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpblNlcnZlciI+TXktU2VydmVyLzEuMTwvcGFyYW1ldGVyPiAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiPjEwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5Ij5mYWxzZTwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplIj41MDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiPjEwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWVVbml0Ij5NSUxMSVNFQ09ORFM8L3BhcmFtZXRlcj4gICAgICAgICAgICAtLT4NCi0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLQ0KLSAgICAgICAgPCEtLSBJZiBmb2xsb3dpbmcgaXMgc2V0IHRvICd0cnVlJywgb3B0aW9uYWwgYWN0aW9uIHBhcnQgb2YgdGhlIENvbnRlbnQtVHlwZSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgU09BUCAxLjIgbWVzc2FnZXMgLS0+DQotICAgICAgICA8IS0tICA8cGFyYW1ldGVyIG5hbWU9Ik9taXRTT0FQMTJBY3Rpb24iPnRydWU8L3BhcmFtZXRlcj4gIC0tPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0gICAgDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPg0KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPg0KLQ0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPg0KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBDbHVzdGVyaW5nICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIENvbmZpZ3VyZSBhbmQgdW5jb21tZW50IGZvbGxvd2luZyBmb3IgcHJlcGFyaW5nIEF4aXMyIHRvIGEgY2x1c3RlcmVkIGVudmlyb25tZW50IC0tPg0KLSAgICA8IS0tDQotICAgIDxjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW0xIj52YWx1ZTE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZG9tYWluIj5hcGFjaGUuYXhpczIuZG9tYWluPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InN5bmNocm9uaXplQWxsIj50cnVlPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1heFJldHJpZXMiPjEwPC9wYXJhbWV0ZXI+DQotICAgIAk8Y29uZmlndXJhdGlvbk1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLlRyaWJlc0NvbmZpZ3VyYXRpb25NYW5hZ2VyIj4NCi0gICAgCSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIi8+DQotICAgIAk8L2NvbmZpZ3VyYXRpb25NYW5hZ2VyPg0KLSAgICAJPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29udGV4dC5UcmliZXNDb250ZXh0TWFuYWdlciI+DQotICAgIAkgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lciIvPg0KLSAgICAJPC9jb250ZXh0TWFuYWdlcj4NCi0gICAgPC9jbHVzdGVyPg0KLSAgICAtLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBoYXNlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kQ2hlY2tlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZENoZWNrZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4NCi0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPg0KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9iYXNpYy1jYXRhbG9nLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvYmFzaWMtY2F0YWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDJhMzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9iYXNpYy1jYXRhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iZG9lc25vdGV4aXN0LnhzZCIKLSAgICAgICB1cmk9ImRpcjIvaW1wb3J0ZWQxLnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiCi0gICAgICAgdXJpPSJkaXIzL2ltcG9ydGVkMi54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9jaGlsZC1jYXRhbG9nLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvY2hpbGQtY2F0YWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDM0ZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9jaGlsZC1jYXRhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iZG9lc25vdGV4aXN0LnhzZCIKLSAgICAgICB1cmk9ImRpcjIvaW1wb3J0ZWQxLnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiCi0gICAgICAgdXJpPSJkaXIzL2ltcG9ydGVkMi54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8bmV4dENhdGFsb2cgY2F0YWxvZz0ibmV4dC54bWwiLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMS9hYnN0cmFjdC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIxL2Fic3RyYWN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGQxNmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIxL2Fic3RyYWN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucwotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9tZXNzYWdlVHlwZXMiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvbWVzc2FnZVR5cGVzIgotICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gIHhtbG5zOm5zMT0idXJuOnR5cGVzMSIKLSAgeG1sbnM6bnMyPSJ1cm46dHlwZXMyIj4KLSAgCi0gIDx3c2RsOnR5cGVzIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgCi0gICAgPHhzOnNjaGVtYSBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L21lc3NhZ2VUeXBlcyIKLSAgICAgIHhtbG5zOm5zPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvbWVzc2FnZVR5cGVzIiAKLSAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRUb3RhbCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2UvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgPC94czplbGVtZW50PiAgICAgCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRUb3RhbFJlc3BvbnNlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJ1cm46dHlwZXMxIiBzY2hlbWFMb2NhdGlvbj0iZG9lc25vdGV4aXN0LnhzZCIvPgotICAgIDwveHM6c2NoZW1hPgotICAgIAotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VG90YWxSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJnZXRUb3RhbCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFRvdGFsUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJnZXRUb3RhbFJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmFkZCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmFkZFJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY2xlYXJSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6Y2xlYXIiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjbGVhclJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmNsZWFyUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJkaXZpZGVSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6ZGl2aWRlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZGl2aWRlUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6ZGl2aWRlUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJkaXZpZGVCeVplcm9FeGNlcHRpb24iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpkaXZpZGVCeVplcm9GYXVsdCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Im11bHRpcGx5UmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOm11bHRpcGx5IiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXVsdGlwbHlSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMjptdWx0aXBseVJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3VidHJhY3RSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczI6c3VidHJhY3QiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzdWJ0cmFjdFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMyOnN1YnRyYWN0UmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjIvaW1wb3J0ZWQxLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMi9pbXBvcnRlZDEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNThmZjMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMi9pbXBvcnRlZDEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46dHlwZXMxIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9InVybjp0eXBlczIiIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZFJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsZWFyIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsZWFyUmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGl2aWRlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGl2aWRlUmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGl2aWRlQnlaZXJvRmF1bHQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aXBseSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICA8L3hzZDpzY2hlbWE+Ci0gIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMy9pbXBvcnRlZDIueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIzL2ltcG9ydGVkMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmI3NDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIzL2ltcG9ydGVkMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9InVybjp0eXBlczIiCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aXBseVJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1YnRyYWN0Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3VidHJhY3RSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgPC94c2Q6c2NoZW1hPgotICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9maXJzdEltcG9ydEZhaWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2NjZDhkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9maXJzdEltcG9ydEZhaWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8IS0tc3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0L2RvZXNub3RleGlzdC53c2RsIgotICAgICAgIHVyaT0iZGlyMS9hYnN0cmFjdC53c2RsIiAvLS0+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9yb290LWNhdGFsb2cueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3Jvb3QtY2F0YWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjdkYTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3Jvb3QtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci0gICA8bmV4dENhdGFsb2cgY2F0YWxvZz0idGhpcmRJbXBvcnRGYWlsLnhtbCIvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3NlY29uZEltcG9ydEZhaWwueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3NlY29uZEltcG9ydEZhaWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTlmYjYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9zZWNvbmRJbXBvcnRGYWlsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLz4KLSAgIDwhLS1zeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iZG9lc25vdGV4aXN0LnhzZCIKLSAgICAgICB1cmk9ImRpcjIvaW1wb3J0ZWQxLnhzZCIgLy0tPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIKLSAgICAgICB1cmk9ImRpcjMvaW1wb3J0ZWQyLnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvdGhpcmRJbXBvcnRGYWlsLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC90aGlyZEltcG9ydEZhaWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjljYmVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC90aGlyZEltcG9ydEZhaWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0L2RvZXNub3RleGlzdC53c2RsIgotICAgICAgIHVyaT0iZGlyMS9hYnN0cmFjdC53c2RsIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJkb2Vzbm90ZXhpc3QueHNkIgotICAgICAgIHVyaT0iZGlyMi9pbXBvcnRlZDEueHNkIiAvPgotICAgPCEtLSBzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiCi0gICAgICAgdXJpPSJkaXIzL2ltcG9ydGVkMi54c2QiIC8tLT4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eC54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMjY0NWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxhbGw+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L2FsbD4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9IlNPQVBXcmFwcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4Mi54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNhYmE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4Mi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgPGFsbD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDwvYWxsPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICAgPGVsZW1lbnQgbmFtZT0iU09BUFdyYXBwZXIyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFkLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFkLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmMmFiMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhZC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zOnhzZDI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiIHNjaGVtYUxvY2F0aW9uPSJpbXBvcnRBdXgyLnhzZCI+PC9pbXBvcnQ+Ci0gICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QyOlNPQVBTdHJ1Y3QiLz4KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYXNlLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFzZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOGQ4NzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYXNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM6eHNkMj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIgc2NoZW1hTG9jYXRpb249ImltcG9ydEF1eC54c2QiPjwvaW1wb3J0PgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RQYXJhbSIgdHlwZT0ieHNkMjpTT0FQU3RydWN0Ii8+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC1jYXRhbG9nLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC1jYXRhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiODhmYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3QtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci0gICA8bmV4dENhdGFsb2cgY2F0YWxvZz0iY2hpbGQtY2F0YWxvZy54bWwiLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMTA5ODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgeG1sbnM6YXhpczJuczE9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICB4bWxuczptc2d0eXBlcz0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L21lc3NhZ2VUeXBlcyIKLSAgeG1sbnM6bnMxPSJ1cm46dHlwZXMxIgotICB4bWxuczpuczI9InVybjp0eXBlczIiCi0gIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9tZXNzYWdlVHlwZXMiIGxvY2F0aW9uPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIvPgotICAKLSAgPCEtLSBJbXBvcnRpbmcgZG9lcyBub3QgYWN0dWFsbHkgYnJpbmcgaW4gdGhlIG1lc3NhZ2VzLCBqdXN0IHRoZSBhYmlsaXR5IHRvIHJlZmVyIHRvIHRoZW0uCi0gICAgICAgV2l0aG91dCB0aGUgZm9sbG93aW5nIChkdXBsaWNhdGVkKSBtZXNzYWdlcyB0aGUgd3NkbCBkZWZpbml0aW9uIHdvdWxkIG5vdCBoYXZlIGFueSBtZXNzYWdlcy4KLSAgICAgICBIb3dldmVyLCBkbyB1c2UgdGhlIGltcG9ydGVkIHZlcnNpb25zIG9mIHRoZXNlIG1lc3NhZ2VzIGluIHRoZSBvcGVyYXRpb24gZGVzY3JpcHRpb25zIGJlbG93LgotICAtLT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRUb3RhbFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im1zZ3R5cGVzOmdldFRvdGFsIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VG90YWxSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im1zZ3R5cGVzOmdldFRvdGFsUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6YWRkIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6YWRkUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjbGVhclJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpjbGVhciIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNsZWFyUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6Y2xlYXJSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImRpdmlkZVJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpkaXZpZGUiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJkaXZpZGVSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpkaXZpZGVSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImRpdmlkZUJ5WmVyb0V4Y2VwdGlvbiIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmRpdmlkZUJ5WmVyb0ZhdWx0IiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXVsdGlwbHlSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6bXVsdGlwbHkiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdWx0aXBseVJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMyOm11bHRpcGx5UmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzdWJ0cmFjdFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMjpzdWJ0cmFjdCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InN1YnRyYWN0UmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczI6c3VidHJhY3RSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJDYWxjdWxhdG9yU2VydmljZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRUb3RhbCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibXNndHlwZXM6Z2V0VG90YWxSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmdldFRvdGFsUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibXNndHlwZXM6YWRkUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJtc2d0eXBlczphZGRSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY2xlYXIiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmNsZWFyUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJtc2d0eXBlczpjbGVhclJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJkaXZpZGUiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmRpdmlkZVJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibXNndHlwZXM6ZGl2aWRlUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6ZmF1bHQgbWVzc2FnZT0ibXNndHlwZXM6ZGl2aWRlQnlaZXJvRXhjZXB0aW9uIgotICAgICAgICBuYW1lPSJkaXZpZGVCeVplcm9FeGNlcHRpb24iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ibXVsdGlwbHkiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOm11bHRpcGx5UmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJtc2d0eXBlczptdWx0aXBseVJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzdWJ0cmFjdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0ibXNndHlwZXM6c3VidHJhY3RSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOnN1YnRyYWN0UmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJDYWxjdWxhdG9yU2VydmljZVNPQVAxMUJpbmRpbmciCi0gICAgdHlwZT0iYXhpczJuczE6Q2FsY3VsYXRvclNlcnZpY2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLSAgICAgIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFRvdGFsIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFRvdGFsIiBzdHlsZT0iZG9jdW1lbnQiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGQiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46YWRkIiBzdHlsZT0iZG9jdW1lbnQiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjbGVhciIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpjbGVhciIgc3R5bGU9ImRvY3VtZW50IiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZGl2aWRlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmRpdmlkZSIgc3R5bGU9ImRvY3VtZW50IiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJkaXZpZGVCeVplcm9FeGNlcHRpb24iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6ZmF1bHQgYm9keT0idXNlIiBuYW1lPSJkaXZpZGVCeVplcm9FeGNlcHRpb24iCi0gICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmZhdWx0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im11bHRpcGx5IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOm11bHRpcGx5IiBzdHlsZT0iZG9jdW1lbnQiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDx3c2RsOmlucHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIgotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzdWJ0cmFjdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpzdWJ0cmFjdCIgc3R5bGU9ImRvY3VtZW50IiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2VXZWJTZXJ2aWNlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJheGlzMm5zMTpDYWxjdWxhdG9yU2VydmljZVNPQVAxMUJpbmRpbmciCi0gICAgICBuYW1lPSJDYWxjdWxhdG9yU2VydmljZVNPQVAxMXBvcnQiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249IiIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvdW5pcXVlLWNhdGFsb2cueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy91bmlxdWUtY2F0YWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmZmMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy91bmlxdWUtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLQotPHB1YmxpYyBwdWJsaWNJZD0iLS8vT0FTSVMvL0RURCBYTUwgRG9jQm9vayBWNC4xLjIvL0VOIgotICAgICAgICB1cmk9ImRvY2Jvb2sveG1sL2RvY2Jvb2t4LmR0ZCIvPgotCi08c3lzdGVtIHN5c3RlbUlkPSJ1cm46eC1vYXNpczpkb2Nib29rLXhtbC12NC4xLjIiCi0gICAgICAgIHVyaT0iZG9jYm9vay94bWwvZG9jYm9va3guZHRkIi8+Ci0KLTxkZWxlZ2F0ZVB1YmxpYyBwdWJsaWNJZFN0YXJ0U3RyaW5nPSItLy9FeGFtcGxlLy8iCi0gICAgICAgICAgY2F0YWxvZz0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYXRhbG9nIi8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I5NWM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotIyBUaGlzIGlzIHRoZSBsb2dnaW5nIHByb3BlcnRpZXMgdGhhdCBnb2VzIHRvIHRoZSB3YXIsIHRoZXJlIGFyZSB0d28gbG9nZ2luZyBjb25mIGtlcHQgYXQgdGhlIA0KLSMgc3ZuLCBvbmUgZm9yIGRldmVsb3BlbWVudCAob25lIGF0IHNyYy90ZXN0LXJlc291cmNlcykgYW5kIG90aGVyIGZvciBwcm9kdWNhdGlvbg0KLSANCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcuDQotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLk5vT3BMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSB0aGUgc2ltcGxlIGxvZyBiYXNlZCBsb2dnaW5nDQotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLlNpbXBsZUxvZw0KLQ0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIGxvZzRqIGJhc2VkIGxvZ2dpbmcNCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxYzhlMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQ0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iTG9nZ2luZ0hhbmRsZXJDaGFpbiI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQk8L2p3czpoYW5kbGVyLWNoYWluPg0KLQkNCi08L2p3czpoYW5kbGVyLWNoYWlucz4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL2hhbmRsZXIueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9oYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExYmNkYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL2hhbmRsZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotICA8andzOmhhbmRsZXItY2hhaW4+DQotICAgIDxqd3M6aGFuZGxlcj4NCi0gICAgICA8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlci5EdW1teVNPQVBIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0gICAgPC9qd3M6aGFuZGxlcj4NCi0gICAgPGp3czpoYW5kbGVyPg0KLSAgICAgIDxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkR1bW15TG9naWNhbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLSAgICA8L2p3czpoYW5kbGVyPg0KLSAgPC9qd3M6aGFuZGxlci1jaGFpbj4NCi08L2p3czpoYW5kbGVyLWNoYWlucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy9pbWFnZS90ZXN0LmpwZyBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL3Rlc3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQyOTVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL3Rlc3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTExMzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4NCi0jbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQ09OU09MRSwgTE9HRklMRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIExPR0ZJTEUNCi1sb2c0ai5yb290Q2F0ZWdvcnk9RVJST1IsIENPTlNPTEUNCi0NCi0jIFNldCBzZWxlY3RlZCBsb2dnaW5nDQotIyAoWW91IG1pZ2h0IHdhbnQgdG8gZG8gdGhpcyB0byBjdXQgZG93biBvbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSkNCi0jIFRoZSBleGFtcGxlIGJlbG93IGFkZHMgZGVidWcgdHJhY2UgZm9yIFN0QVhVdGlscyBvciBqYXh3cyBzZXJ2ZXIgdG8gDQotIyB0aGUgYXhpczIuc21hbGwubG9nLg0KLSMgWW91IGNhbiBhZGQgdGhpcyB3aXRob3V0IGNoYW5naW5nIHRoZSByb290IGNhdGVnb3J5Lg0KLSNsb2c0ai5jYXRlZ29yeS5vcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzPURFQlVHLCBTTUFMTA0KLSNsb2c0ai5jYXRlZ29yeS5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQlV0aWxzPURFQlVHLCBTTUFMTA0KLQ0KLSMgRW5hYmxlIHRoZSBmb2xsb3dpbmcgdG8gZ2V0IEpBWFdTIFRlc3RMb2dnZXIgdHJhY2UuDQotI2xvZzRqLmNhdGVnb3J5LkpBWFdTLVRlc3RzPURFQlVHLCBTTUFMTA0KLQ0KLSMgU2V0IHRoZSBlbnRlcnByaXNlIGxvZ2dlciBwcmlvcml0eSB0byBGQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwNCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTA0KLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmUuaGVhZGVyPUZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMDQotDQotDQotIyBDT05TT0xFIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkICUtNXAgJWMgLSAlbSVuDQotDQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4NCi0NCi0jIFNNQUxMIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuU01BTEwuRmlsZT1heGlzMi5zbWFsbC5sb2cNCi1sb2c0ai5hcHBlbmRlci5TTUFMTC5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5TTUFMTC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICVjICV4IC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3Byb3ZpZGVyL3htbC93ZWIueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvcHJvdmlkZXIveG1sL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTkwY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvcHJvdmlkZXIveG1sL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08dGVzdE9wZXJhdGlvbj4NCi0gIDx0ZXN0UGFyYW0+SGVsbG8gV29ybGQ8L3Rlc3RQYXJhbT4NCi08L3Rlc3RPcGVyYXRpb24+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0FkZE51bWJlcnMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3ZDE4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0FkZE51bWJlcnMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJBZGROdW1iZXJzIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLQ0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiPg0KLQkJCTxlbGVtZW50IG5hbWU9ImFkZE51bWJlcnNSZXNwb25zZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9IkFkZE51bWJlcnNGYXVsdCI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJmYXVsdEluZm8iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9Im9uZVdheUludCI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvdHlwZXM+DQotDQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZE51bWJlcnMiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc1Jlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzRmF1bHQiPg0KLQkJPHBhcnQgbmFtZT0iQWRkTnVtYmVyc0ZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTnVtYmVyc0ZhdWx0IiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9Im9uZVdheUludCI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6b25lV2F5SW50IiAvPg0KLQk8L21lc3NhZ2U+DQotDQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzUG9ydFR5cGUiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnMiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzUmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPg0KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiIG1lc3NhZ2U9InRuczphZGROdW1iZXJzRmF1bHQiIC8+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheUludCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L3BvcnRUeXBlPg0KLQk8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzQmluZGluZyIgdHlwZT0idG5zOkFkZE51bWJlcnNQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIg0KLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyI+DQotCQkJIA0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCSANCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9iaW5kaW5nPg0KLQk8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzU2VydmljZSI+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZSIgLz4NCi0JCTwvcG9ydD4NCi0JPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzSGFuZGxlci53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzSGFuZGxlci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY5ZjhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQWRkTnVtYmVyc0hhbmRsZXIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJBZGROdW1iZXJzSGFuZGxlciIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLQ0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIj4NCi0JCQk8ZWxlbWVudCBuYW1lPSJteUhlYWRlciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkNCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9ImFkZE51bWJlcnNIYW5kbGVyIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9IkFkZE51bWJlcnNIYW5kbGVyRmF1bHQiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZmF1bHRJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3R5cGVzPg0KLQ0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzSGFuZGxlciI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkTnVtYmVyc0hhbmRsZXIiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSI+DQotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczphZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNIYW5kbGVyRmF1bHQiPg0KLQkJPHBhcnQgbmFtZT0iQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIgZWxlbWVudD0idG5zOkFkZE51bWJlcnNIYW5kbGVyRmF1bHQiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0ib25lV2F5SW50Ij4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpvbmVXYXlJbnQiIC8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPHBvcnRUeXBlIG5hbWU9IkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzSGFuZGxlciI+DQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzSGFuZGxlciIgbmFtZT0iYWRkIiAvPg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPg0KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlckZhdWx0IiBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5SW50IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNIYW5kbGVyQmluZGluZyIgdHlwZT0idG5zOkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCINCi0JCQlzdHlsZT0iZG9jdW1lbnQiIC8+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnNIYW5kbGVyIj4NCi0JCQkNCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNIYW5kbGVyRmF1bHQiPg0KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlckZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCQ0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L2JpbmRpbmc+DQotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNIYW5kbGVyU2VydmljZSI+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzSGFuZGxlclBvcnQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzSGFuZGxlckJpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXJIYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVySW1wbFNlcnZpY2UiIC8+DQotCQk8L3BvcnQ+DQotCTwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQW55VHlwZS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BbnlUeXBlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjIzNWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9BbnlUeXBlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL2FueXR5cGUudGVzdC5vcmciDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIg0KLSAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZy94c2QiDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6YW55VHlwZSIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkFueVR5cGVNZXNzYWdlUG9ydFR5cGUiPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkFueVR5cGVNZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkFueVR5cGVNZXNzYWdlUG9ydFR5cGUiPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLQ0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iQW55VHlwZU1lc3NhZ2VTZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6QW55VHlwZU1lc3NhZ2VCaW5kaW5nIiBuYW1lPSJBbnlUeXBlUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL1NlcnZpY2VzL0FueVR5cGVNZXNzYWdlU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0NCi0gICA8L3NlcnZpY2U+DQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0JhZEVuZHBvaW50QWRkcmVzcy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlOThjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0JhZEVuZHBvaW50QWRkcmVzcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9UeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNobyI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJ0aGlzIGlzIGFuIGludmFsaWQgc3RyaW5nIi8+DQotICAgICAgPC9wb3J0Pg0KLSAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGEud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NmFhZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICANCi0gIDx0eXBlcz4gICAgICANCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy94c2QiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgICA8L3hzZDpzY2hlbWE+ICAgIA0KLSAgPC90eXBlcz4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICANCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9wb3J0VHlwZT4gICAgIA0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgDQotICAgICAgPC9pbnB1dD4gICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIA0KLSAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9iaW5kaW5nPiAgICAgDQotDQotICA8c2VydmljZSBuYW1lPSJzdmNMb2NhbFBhcnQiPiAgICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydCI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gIDwvc2VydmljZT4gIA0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU11bHRpUG9ydC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU11bHRpUG9ydC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjJhZWQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFNdWx0aVBvcnQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICANCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLSAgPHR5cGVzPiAgICAgIA0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3hzZCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICAgIDwveHNkOnNjaGVtYT4gICAgDQotICA8L3R5cGVzPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L3BvcnRUeXBlPiAgICAgDQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICANCi0gICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgDQotICAgICAgPC9vdXRwdXQ+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L2JpbmRpbmc+ICAgICANCi0NCi0gIDxzZXJ2aWNlIG5hbWU9InN2Y0xvY2FsUGFydCI+ICAgICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0TXVsdGkxIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UvcG9ydExvY2FsUGFydE11bHRpMSIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRNdWx0aTIiPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZS9wb3J0TG9jYWxQYXJ0TXVsdGkyIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE11bHRpMyI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlL3BvcnRMb2NhbFBhcnRNdWx0aTMiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3RoZXIud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdGhlci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWUyZDE1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdGhlci53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotICA8dHlwZXM+ICAgICAgDQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICAgICAgICAgICAgICB4bWxuczp0cz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcveHNkIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi0gICAgPC94c2Q6c2NoZW1hPiAgICANCi0gIDwvdHlwZXM+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvcG9ydFR5cGU+ICAgICANCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgIA0KLSAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICA8b3V0cHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICANCi0gICAgICA8L291dHB1dD4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvYmluZGluZz4gICAgIA0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0ic3ZjTG9jYWxQYXJ0Ij4gICAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRPdGhlciI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gIDwvc2VydmljZT4gIA0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU92ZXJyaWRlbi53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU92ZXJyaWRlbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlkNTM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdmVycmlkZW4ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICANCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLSAgPHR5cGVzPiAgICAgIA0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3hzZCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICAgIDwveHNkOnNjaGVtYT4gICAgDQotICA8L3R5cGVzPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L3BvcnRUeXBlPiAgICAgDQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICANCi0gICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgDQotICAgICAgPC9vdXRwdXQ+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L2JpbmRpbmc+ICAgICANCi0NCi0gIDxzZXJ2aWNlIG5hbWU9InN2Y0xvY2FsUGFydCI+ICAgICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0T3ZlcnJpZGVuIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0VjaG9NZXNzYWdlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0VjaG9NZXNzYWdlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YmM0ZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyINCi0gICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyINCi0gICAgICAgICB4bWxuczp0cz0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZy94c2QiDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IkVjaG9NZXNzYWdlU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0iRWNob01lc3NhZ2VQb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0NCi0gICA8L3NlcnZpY2U+DQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0ZhdWx0c1NlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRmF1bHRzU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBmOWNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRmF1bHRzU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIG5hbWU9IkZhdWx0c1NlcnZpY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIg0KLSAgICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiDQotICAgICB4bWxuczp0cz0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIg0KLSAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotDQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIj4NCi0gICAgICAgIA0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJTaW1wbGVGYXVsdCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJJbnZhbGlkVGlja2VyRmF1bHQiIHR5cGU9InRzOkludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb25CZWFuIi8+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uQmVhbiI+DQotICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZ2FjeURhdGExIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZ2FjeURhdGEyIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLSAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUZhdWx0IiB0eXBlPSJ0czpCYXNlRmF1bHQiLz4NCi0gICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2VGYXVsdCI+DQotICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYSIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRlcml2ZWRGYXVsdDEiIHR5cGU9InRzOkRlcml2ZWRGYXVsdDEiLz4NCi0gICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcml2ZWRGYXVsdDEiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0gICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHM6QmFzZUZhdWx0Ij4NCi0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImIiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkRlcml2ZWRGYXVsdDIiIHR5cGU9InRzOkRlcml2ZWRGYXVsdDIiLz4NCi0gICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcml2ZWRGYXVsdDIiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0gICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHM6RGVyaXZlZEZhdWx0MSI+DQotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4NCi0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkNvbXBsZXhGYXVsdCIgdHlwZT0idHM6Q29tcGxleEZhdWx0Ii8+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wbGV4RmF1bHQiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0gICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHM6RGVyaXZlZEZhdWx0MiI+DQotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRRdW90ZSI+DQotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZXRRdW90ZVJlc3VsdCI+DQotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXN1bHQiIHR5cGU9InhzZDpmbG9hdCIvPg0KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRocm93RmF1bHQiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1BIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtQiIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbUMiIHR5cGU9InhzZDpmbG9hdCIvPg0KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRocm93RmF1bHRSZXR1cm4iPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuRmF1bHQiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1YIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtWSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbVoiIHR5cGU9InhzZDpmbG9hdCIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYXVsdCIgdHlwZT0idHM6RGVyaXZlZEZhdWx0MSIvPg0KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybkZhdWx0UmVzcG9uc2UiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InRzOkRlcml2ZWRGYXVsdDEiLz4NCi0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLQ0KLSAgICA8L3hzZDpzY2hlbWE+DQotICA8L3R5cGVzPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iU2ltcGxlRmF1bHQiPg0KLSAgICA8cGFydCBuYW1lPSJmYXVsdE1lc3NhZ2UiIGVsZW1lbnQ9InRzOlNpbXBsZUZhdWx0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0idGlja2VyRmF1bHQiIGVsZW1lbnQ9InRzOkludmFsaWRUaWNrZXJGYXVsdCIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iQmFzZUZhdWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0iYmFzZUZhdWx0IiBlbGVtZW50PSJ0czpCYXNlRmF1bHQiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkRlcml2ZWRGYXVsdDEiPg0KLSAgICA8cGFydCBuYW1lPSJ0aGVGYXVsdCIgZWxlbWVudD0idHM6RGVyaXZlZEZhdWx0MSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkRlcml2ZWRGYXVsdDIiPg0KLSAgICA8cGFydCBuYW1lPSJ0aGVGYXVsdCIgZWxlbWVudD0idHM6RGVyaXZlZEZhdWx0MiIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkNvbXBsZXhGYXVsdCI+DQotICAgIDxwYXJ0IG5hbWU9ImNvbXBsZXhGYXVsdCIgZWxlbWVudD0idHM6Q29tcGxleEZhdWx0Ii8+DQotICA8L21lc3NhZ2U+DQotIA0KLSAgPG1lc3NhZ2UgbmFtZT0iRXF1YWxGYXVsdCI+DQotICAgIDxwYXJ0IG5hbWU9InRoZUZhdWx0IiBlbGVtZW50PSJ0czpEZXJpdmVkRmF1bHQxIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iR2V0UXVvdGVSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0idGlja2VyU3ltYm9sIiBlbGVtZW50PSJ0czpnZXRRdW90ZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkdldFF1b3RlUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJHZXRRdW90ZVJlc3VsdCIgZWxlbWVudD0idHM6Z2V0UXVvdGVSZXN1bHQiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJUaHJvd0ZhdWx0UmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRzOnRocm93RmF1bHQiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJUaHJvd0ZhdWx0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idHM6dGhyb3dGYXVsdFJldHVybiIvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iUmV0dXJuRmF1bHRSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0icmVxIiBlbGVtZW50PSJ0czpyZXR1cm5GYXVsdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IlJldHVybkZhdWx0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJyZXR1cm4iIGVsZW1lbnQ9InRzOnJldHVybkZhdWx0UmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJGYXVsdHNTZXJ2aWNlUG9ydFR5cGUiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFF1b3RlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOkdldFF1b3RlUmVxdWVzdCIvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkdldFF1b3RlUmVzcG9uc2UiLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkludmFsaWRUaWNrZXJGYXVsdCIgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0IiAvPg0KLSAgICAgIDxmYXVsdCBtZXNzYWdlPSJ0bnM6U2ltcGxlRmF1bHQiIG5hbWU9IlNpbXBsZUZhdWx0IiAvPg0KLSAgICAgIDxmYXVsdCBtZXNzYWdlPSJ0bnM6RGVyaXZlZEZhdWx0MSIgbmFtZT0iRmF1bHQxIi8+DQotICAgICAgPGZhdWx0IG1lc3NhZ2U9InRuczpEZXJpdmVkRmF1bHQyIiBuYW1lPSJGYXVsdDIiLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkJhc2VGYXVsdCIgbmFtZT0iRmF1bHQzIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9InRocm93RmF1bHQiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6VGhyb3dGYXVsdFJlcXVlc3QiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpUaHJvd0ZhdWx0UmVzcG9uc2UiLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkJhc2VGYXVsdCIgbmFtZT0iYmFzZUZhdWx0IiAvPg0KLSAgICAgIDxmYXVsdCBtZXNzYWdlPSJ0bnM6Q29tcGxleEZhdWx0IiBuYW1lPSJjb21wbGV4RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9InJldHVybkZhdWx0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlJldHVybkZhdWx0UmVxdWVzdCIvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlJldHVybkZhdWx0UmVzcG9uc2UiLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkRlcml2ZWRGYXVsdDEiIG5hbWU9IkRlcml2ZWRGYXVsdDEiIC8+DQotICAgICAgPGZhdWx0IG1lc3NhZ2U9InRuczpFcXVhbEZhdWx0IiBuYW1lPSJFcXVhbEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvcG9ydFR5cGU+DQotDQotICA8YmluZGluZyBuYW1lPSJGYXVsdHNTZXJ2aWNlU29hcEJpbmRpbmciIHR5cGU9InRuczpGYXVsdHNTZXJ2aWNlUG9ydFR5cGUiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJJbnZhbGlkVGlja2VyRmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iRmF1bHQxIj4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkZhdWx0MSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iRmF1bHQyIj4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkZhdWx0MiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iRmF1bHQzIj4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkZhdWx0MyIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9InRocm93RmF1bHQiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYmFzZUZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImJhc2VGYXVsdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iY29tcGxleEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImNvbXBsZXhGYXVsdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0icmV0dXJuRmF1bHQiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iRGVyaXZlZEZhdWx0MSI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJEZXJpdmVkRmF1bHQxIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJFcXVhbEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkVxdWFsRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0iRmF1bHRzU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IkZhdWx0c1BvcnQiIGJpbmRpbmc9InRuczpGYXVsdHNTZXJ2aWNlU29hcEJpbmRpbmciPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9GYXVsdHNTZXJ2aWNlL0ZhdWx0c1NlcnZpY2VTb2FwQmluZGluZ0ltcGwiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9GYXVsdHlXZWJTZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0ZhdWx0eVdlYlNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhYmU5YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0ZhdWx0eVdlYlNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0NCi0JPHR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiPg0KLQkJCTxlbGVtZW50IG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZmF1bHRJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iZmF1bHR5V2ViU2VydmljZSI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZmF1bHR5V2ViU2VydmljZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VGYXVsdCI+DQotCQk8cGFydCBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiIGVsZW1lbnQ9InRuczpGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiIC8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPHBvcnRUeXBlIG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSI+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImZhdWx0eVdlYlNlcnZpY2UiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZmF1bHR5V2ViU2VydmljZSIgbmFtZT0iYWRkIiAvPg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIgbmFtZT0iZmF1bHR5V1NSZXNwb25zZSIgLz4NCi0JCQk8ZmF1bHQgbmFtZT0iZmF1bHR5V2ViU2VydmljZUZhdWx0IiBtZXNzYWdlPSJ0bnM6ZmF1bHR5V2ViU2VydmljZUZhdWx0IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VCaW5kaW5nIiB0eXBlPSJ0bnM6RmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iZmF1bHR5V2ViU2VydmljZUZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iZmF1bHR5V2ViU2VydmljZUZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L2JpbmRpbmc+DQotCTxzZXJ2aWNlIG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlIj4NCi0JCTxwb3J0IG5hbWU9IkZhdWx0eVdlYlNlcnZpY2VQb3J0IiBiaW5kaW5nPSJ0bnM6RmF1bHR5V2ViU2VydmljZUJpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9GYXVsdHlXZWJTZXJ2aWNlL0ZhdWx0eVdlYlNlcnZpY2VJbXBsU2VydmljZSIgLz4NCi0JCTwvcG9ydD4NCi0JPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9KQVhCX0N1c3RvbWl6YXRpb25fU2FtcGxlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0pBWEJfQ3VzdG9taXphdGlvbl9TYW1wbGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNjg3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL0pBWEJfQ3VzdG9taXphdGlvbl9TYW1wbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0JIA0KLQ0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciDQotICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmcveHNkIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPg0KLSAgICAgICAgIA0KLTwhLS0gVXNpbmcgc2NoZW1hIGJpbmRpbmcgdG8gY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgZm9yIGpheGIgYXJ0IGVmZmVjdHMgLS0+CQkNCi0JCTxqYXhiOnNjaGVtYUJpbmRpbmdzPg0KLQkJCTxqYXhiOnBhY2thZ2UgbmFtZSA9ICJvcmcudGVzdC5lY2hvbWVzc2FnZSIgLz4NCi0JCTwvamF4YjpzY2hlbWFCaW5kaW5ncz4NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLQ0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iRWNob01lc3NhZ2VTZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJFY2hvTWVzc2FnZVBvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+DQotICAgICAgPC9wb3J0Pg0KLQ0KLSAgIDwvc2VydmljZT4NCi0NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvTWVzc2FnZUNvbnRleHQud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvTWVzc2FnZUNvbnRleHQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3MDU3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL01lc3NhZ2VDb250ZXh0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vY29udGV4dC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIgbmFtZT0iTWVzc2FnZUNvbnRleHRTZXJ2aWNlIj4NCi0gICAgPHR5cGVzPg0KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczp0bnM9Imh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iIHZlcnNpb249IjEuMCI+DQotICAgICAgICAgICAgPCEtLSByZWFkIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IC0tPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzRm91bmQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC94czplbGVtZW50Pg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXNGb3VuZCIgdHlwZT0ieHM6Ym9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQotICAgICAgICA8L3hzOnNjaGVtYT4NCi0gICAgPC90eXBlcz4NCi0gICAgPG1lc3NhZ2UgbmFtZT0iaXNQcm9wZXJ0eVByZXNlbnQiPg0KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmlzUHJvcGVydHlQcmVzZW50Ii8+DQotICAgIDwvbWVzc2FnZT4NCi0gICAgPG1lc3NhZ2UgbmFtZT0iaXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSI+DQotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6aXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSIvPg0KLSAgICA8L21lc3NhZ2U+DQotICAgIDxwb3J0VHlwZSBuYW1lPSJNZXNzYWdlQ29udGV4dCI+DQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlzUHJvcGVydHlQcmVzZW50Ii8+DQotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6aXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSIvPg0KLSAgICAgICAgPC9vcGVyYXRpb24+DQotICAgIDwvcG9ydFR5cGU+DQotICAgIDxiaW5kaW5nIG5hbWU9Ik1lc3NhZ2VDb250ZXh0UG9ydEJpbmRpbmciIHR5cGU9InRuczpNZXNzYWdlQ29udGV4dCI+DQotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iaXNQcm9wZXJ0eVByZXNlbnQiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbi8+DQotICAgICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvaW5wdXQ+DQotICAgICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L291dHB1dD4NCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8L2JpbmRpbmc+DQotICAgIDxzZXJ2aWNlIG5hbWU9Ik1lc3NhZ2VDb250ZXh0U2VydmljZSI+DQotICAgICAgICA8cG9ydCBuYW1lPSJNZXNzYWdlQ29udGV4dFBvcnQiIGJpbmRpbmc9InRuczpNZXNzYWdlQ29udGV4dFBvcnRCaW5kaW5nIj4NCi0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvTWVzc2FnZUNvbnRleHRTZXJ2aWNlIi8+DQotICAgICAgICA8L3BvcnQ+DQotICAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGYxOWZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWE+DQotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiBzY2hlbWFMb2NhdGlvbj0iUGFydGlhbFdTREwxX3NjaGVtYS54c2QiLz4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnMiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkVHdvTnVtYmVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iYWRkVHdvTnVtYmVyc1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4NCi0gICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczpBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnMiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiBtZXNzYWdlPSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi08IS0tICBQYXJ0aWFsIFdTREwgMTogTm8gYmluZGluZywgc2VydmljZSwgb3IgcG9ydCBpbmZvcm1hdGlvbg0KLSAgICA8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydEJpbmRpbmciIHR5cGU9InRuczpBZGROdW1iZXJzSW1wbFBhcnRpYWwxIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotICA8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vQFJFUExBQ0VfV0lUSF9IT1NUX05BTUVAOkBSRVBMQUNFX1dJVEhfUE9SVF9OVU1AL3dlYmZhdWx0Y2hrZXhjL3dlYmZhdWx0Y2hrZXhjcDEiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLS0tPg0KLSAgDQotPC9kZWZpbml0aW9ucz4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMV9zY2hlbWEueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDFfc2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzMTc0Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMV9zY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4czpzY2hlbWEgdmVyc2lvbj0iMS4wIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZFR3b051bWJlcnMiIHR5cGU9Im5zMTphZGRUd29OdW1iZXJzIiB4bWxuczpuczE9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhZGRUd29OdW1iZXJzIj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOmludCIvPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzEiIHR5cGU9InhzOmludCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSIgdHlwZT0ibnMyOmFkZFR3b051bWJlcnNSZXNwb25zZSIgeG1sbnM6bnMyPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIi8+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkVHdvTnVtYmVyc1Jlc3BvbnNlIj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6aW50Ii8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLTwveHM6c2NoZW1hPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwyLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY4N2ZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWE+DQotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiBzY2hlbWFMb2NhdGlvbj0iUGFydGlhbFdTREwxX3NjaGVtYS54c2QiLz4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0NCi08IS0tICBQYXJ0aWFsIFdTREwgMjogT25seSB0eXBlcyBzcGVjaWZpZWQNCi0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnMiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkVHdvTnVtYmVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iYWRkVHdvTnVtYmVyc1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4NCi0gICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczpBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnMiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiBtZXNzYWdlPSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gICAgPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImFkZFR3b051bWJlcnMiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLSAgPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL0BSRVBMQUNFX1dJVEhfSE9TVF9OQU1FQDpAUkVQTEFDRV9XSVRIX1BPUlRfTlVNQC93ZWJmYXVsdGNoa2V4Yy93ZWJmYXVsdGNoa2V4Y3AxIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi0tLT4NCi0gIA0KLTwvZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWY3MGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm94eSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyI+DQotDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZSAvPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25ld2F5X3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX2ludCINCi0JCQkJCQkJdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvd2F5X3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotDQotCQkJDQotDQotCQkJPCEtLSBmaW4gb3AgZGVmaW5pdGlvbiAtLT4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3AiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3AiDQotCQkJCQkJCXR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSINCi0JCQkJCQkJdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbW91bnQiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaXRoZHJhdyI+DQotCQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVtbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXBvc2l0Ij4NCi0JCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0dXMiDQotCQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVZvaWRSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXlWb2lkIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6aW52b2tlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdFdyYXBwZWRQcm94eSI+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVZvaWRSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczppbnZva2VSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOnBvcnRUeXBlPg0KLQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlByb3h5RG9jTGl0V3JhcHBlZCINCi0JCXR5cGU9InRuczpEb2NMaXRXcmFwcGVkUHJveHkiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiDQotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvZmluT3AiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQk8L3dzZGw6YmluZGluZz4NCi0NCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOlByb3h5RG9jTGl0V3JhcHBlZCINCi0JCQluYW1lPSJQcm94eURvY0xpdFdyYXBwZWRQb3J0Ij4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvYXhpczIvc2VydmljZXMvUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZS9pbnZva2UiIC8+DQotCQk8L3dzZGw6cG9ydD4NCi0JPC93c2RsOnNlcnZpY2U+DQotDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRub25XcmFwcGVkLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0bm9uV3JhcHBlZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGIyOTdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRub25XcmFwcGVkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotCVRoaXMgaXMgYSBjb3B5IG9mIHByb3h5X2RvY2xpdHdyLndzZGwuIFNlcnZpY2UgYW5kIHBvcnQgbmFtZXMNCi0JaGF2ZSBiZWVuIGNobmFnZWQgdG8gYmUgQWxwaGEgY29tcGF0aWJsZSBhbmQgZW5kcG9pbnQgYWRkcmVzcw0KLQloYXMgYmVlbiBjaGFuZ2VkDQotLS0+DQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb3h5Ig0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJDQotCQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZSIgbmlsbGFibGU9InRydWUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlX3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIiBuaWxsYWJsZT0idHJ1ZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczppbnZva2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JDQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRub25XcmFwcGVkUHJveHkiPg0KLQ0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlByb3h5RG9jTGl0bm9uV3JhcHBlZCIgdHlwZT0idG5zOkRvY0xpdG5vbldyYXBwZWRQcm94eSI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+CQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZy9pbnZva2VSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JDQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOlByb3h5RG9jTGl0bm9uV3JhcHBlZCIgbmFtZT0iUHJveHlEb2NMaXRub25XcmFwcGVkUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL0BIT1NUQDpAUE9SVEAvamF4d3MucHJveHkvc2VydmljZXMvUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENMaXQud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUlBDTGl0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzZiNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENMaXQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB4bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotIDx3c2RsOnR5cGVzPg0KLSAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgUU5hbWUgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lTGlzdCI+DQotICAgICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJ4c2Q6UU5hbWUiLz4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IlFOYW1lTGlzdCIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UU5hbWVMaXN0Ii8+DQotDQotICA8IS0tIEV4YW1wbGUgb2YgYSBDYWxlbmRhciBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIGphdmEudXRpbC5DYWxlbmRhcltdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDYWxlbmRhckxpc3QiPiAgIA0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOmRhdGVUaW1lIi8+IA0KLSAgIDwveHNkOnNpbXBsZVR5cGU+ICAgICAgICAgICAgICAgICANCi0gICA8ZWxlbWVudCBuYW1lPSJDYWxlbmRhckxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkNhbGVuZGFyTGlzdCIvPg0KLSAgDQotICA8IS0tIEV4YW1wbGUgb2YgYSBTdHJpbmcgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZhLmxhbmcuU3RyaW5nW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN0cmluZ0xpc3QiPiAgIA0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOnN0cmluZyIvPiANCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IlN0cmluZ0xpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0gIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgeHNkOm5lZ2F0aXZlSW50ZWdlciBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIGphdmEubWF0aC5CaWdJbnRlZ2VyW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkJpZ0ludGVnZXJMaXN0Ij4NCi0gICAgICA8eHNkOnJlc3RyaWN0aW9uPiAgICAgDQotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4gDQotICAgICAgICAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPg0KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPg0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iQmlnSW50ZWdlckxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkJpZ0ludGVnZXJMaXN0Ii8+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIHhzZDp1bnNpZ25lZEludCBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIGxvbmdbXSAtLT4NCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9uZ0xpc3QiPg0KLSAgICAgIDx4c2Q6bGlzdD4NCi0gICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp1bnNpZ25lZEludCIvPg0KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgICAgIDwveHNkOmxpc3Q+DQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJMb25nTGlzdCIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhbiBFbnVtZXJhdGlvbiB0eXBlLiAgVGhpcyBzaG91bGQgbWFwIHRvIEVudW0uamF2YSAtLT4gIA0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFbnVtIj4NCi0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPg0KLSAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbmUiLz4gICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR3byIvPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRocmVlIi8+ICAgICAgICAgICAgICAgICAgICANCi0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkVudW0iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkVudW0iLz4NCi0gDQotICA8IS0tIEV4YW1wbGUgb2YgYSB4c2Q6ZW51bWVyYXRpb24gbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBFbnVtW10gLS0+ICANCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bUxpc3QiPg0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0iaW1wbDpFbnVtIi8+IA0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iRW51bUxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIHhzZDplbnVtZXJhdGlvbiBlbWJlZGRlZCBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIEVudW1MaXN0MltdIC0tPiANCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bUxpc3QyIj4NCi0gICAgICA8eHNkOmxpc3Q+DQotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPg0KLSAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGUiIC8+DQotICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmFuZ2UiIC8+DQotICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwZSIgLz4NCi0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICA8L3hzZDpsaXN0Pg0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iRW51bUxpc3QyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4gDQotDQotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4QWxsIj4NCi0gICAgICA8eHNkOmFsbD4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15SW50IiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteVN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRW51bSIgdHlwZT0iaW1wbDpFbnVtIi8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteVFOYW1lTGlzdCIgdHlwZT0iaW1wbDpRTmFtZUxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15Q2FsZW5kYXJMaXN0IiB0eXBlPSJpbXBsOkNhbGVuZGFyTGlzdCIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlTdHJpbmdMaXN0IiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15QmlnSW50ZWdlckxpc3QiIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15TG9uZ0xpc3QiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15RW51bUxpc3QiIHR5cGU9ImltcGw6RW51bUxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15RW51bUxpc3QyIiB0eXBlPSJpbXBsOkVudW1MaXN0MiIvPg0KLSAgICAgIDwveHNkOmFsbD4NCi0gICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICANCi0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclJldHVybiIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0gICANCi0gICAgPHhzZDplbGVtZW50IG5hbWU9Im15RmF1bHQiIHR5cGU9InhzZDppbnQiIC8+DQotICA8L3NjaGVtYT4NCi0gPC93c2RsOnR5cGVzPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdExpc3RzUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdExpc3RzUmV0dXJuIiB0eXBlPSJpbXBsOlFOYW1lTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdExpc3RzUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfMF8wIiB0eXBlPSJpbXBsOlFOYW1lTGlzdCIvPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzFfMCIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18yXzAiIHR5cGU9ImltcGw6U3RyaW5nTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzNfMCIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzRfMCIgdHlwZT0iaW1wbDpMb25nTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzVfMCIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzdfMCIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ182XzAiIHR5cGU9ImltcGw6Y29tcGxleEFsbCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MVJldHVybiIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfMV8wIiB0eXBlPSJpbXBsOkNhbGVuZGFyTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmV0dXJuIiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzJfMCIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1JldHVybiIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1JlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzNfMCIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdExvbmdMaXN0NFJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RMb25nTGlzdDRSZXR1cm4iIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMb25nTGlzdDRSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ180XzAiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RFbnVtTGlzdDVSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmV0dXJuIiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNV8wIiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdEVudW1MaXN0N1JldHVybiIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RFbnVtTGlzdDdSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ183XzAiIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXR1cm4iIHR5cGU9ImltcGw6Y29tcGxleEFsbCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNl8wIiB0eXBlPSJpbXBsOmNvbXBsZXhBbGwiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTaW1wbGVSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZUluIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZUluT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVPdXQiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZUluT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlMlJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlMkluMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlMkluMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZTJSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGUyT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0SGVhZGVyUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJib2R5UGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclBhcmFtIiBlbGVtZW50PSJpbXBsOmhlYWRlclBhcmFtIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0SGVhZGVyUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyUmV0dXJuIiB0eXBlPSJpbXBsOmhlYWRlclJldHVybiIgLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RGYXVsdFJlcXVlc3QiIC8+DQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RmF1bHRSZXNwb25zZSIgLz4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InJwY0ZhdWx0Ij4NCi0gICAgIDx3c2RsOnBhcnQgbmFtZT0icnBjRmF1bHQiIGVsZW1lbnQ9ImltcGw6bXlGYXVsdCIgLz4NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJSUENMaXQiPg0KLSAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTaW1wbGUiIHBhcmFtZXRlck9yZGVyPSJzaW1wbGVJbiI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlUmVxdWVzdCIgbmFtZT0idGVzdFNpbXBsZVJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlUmVzcG9uc2UiIG5hbWU9InRlc3RTaW1wbGVSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXQiIHBhcmFtZXRlck9yZGVyPSJzaW1wbGVJbk91dCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0IiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZUluT3V0UmVzcG9uc2UiIG5hbWU9InRlc3RTaW1wbGVJbk91dFJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZTIiIHBhcmFtZXRlck9yZGVyPSJzaW1wbGUySW4xIHNpbXBsZTJJbjIiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZTJSZXF1ZXN0IiBuYW1lPSJ0ZXN0U2ltcGxlMlJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlMlJlc3BvbnNlIiBuYW1lPSJ0ZXN0U2ltcGxlMlJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEhlYWRlciIgcGFyYW1ldGVyT3JkZXI9ImJvZHlQYXJhbSBoZWFkZXJQYXJhbSI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVxdWVzdCIgbmFtZT0idGVzdEhlYWRlclJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVzcG9uc2UiIG5hbWU9InRlc3RIZWFkZXJSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RMaXN0cyIgcGFyYW1ldGVyT3JkZXI9ImFyZ18wXzAgYXJnXzFfMCBhcmdfMl8wIGFyZ18zXzAgYXJnXzRfMCBhcmdfNV8wIGFyZ183XzAgYXJnXzZfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0TGlzdHNSZXF1ZXN0IiBuYW1lPSJ0ZXN0TGlzdHNSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdExpc3RzUmVzcG9uc2UiIG5hbWU9InRlc3RMaXN0c1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdENhbGVuZGFyTGlzdDEiIHBhcmFtZXRlck9yZGVyPSJhcmdfMV8wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCIgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSIgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTdHJpbmdMaXN0MiIgcGFyYW1ldGVyT3JkZXI9ImFyZ18yXzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFN0cmluZ0xpc3QyUmVxdWVzdCIgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIiBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDMiIHBhcmFtZXRlck9yZGVyPSJhcmdfM18wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RCaWdJbnRlZ2VyTGlzdDNSZXF1ZXN0IiBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RCaWdJbnRlZ2VyTGlzdDNSZXNwb25zZSIgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdExvbmdMaXN0NCIgcGFyYW1ldGVyT3JkZXI9ImFyZ180XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdExvbmdMaXN0NFJlcXVlc3QiIG5hbWU9InRlc3RMb25nTGlzdDRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdExvbmdMaXN0NFJlc3BvbnNlIiBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RW51bUxpc3Q1IiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzVfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q1UmVxdWVzdCIgbmFtZT0idGVzdEVudW1MaXN0NVJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q1UmVzcG9uc2UiIG5hbWU9InRlc3RFbnVtTGlzdDVSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RFbnVtTGlzdDciIHBhcmFtZXRlck9yZGVyPSJhcmdfN18wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RFbnVtTGlzdDdSZXF1ZXN0IiBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RFbnVtTGlzdDdSZXNwb25zZSIgbmFtZT0idGVzdEVudW1MaXN0N1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdENvbXBsZXhBbGw2IiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzZfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0Q29tcGxleEFsbDZSZXF1ZXN0IiBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdENvbXBsZXhBbGw2UmVzcG9uc2UiIG5hbWU9InRlc3RDb21wbGV4QWxsNlJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEZhdWx0Ij4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RGYXVsdFJlcXVlc3QiIG5hbWU9InRlc3RGYXVsdFJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RmF1bHRSZXNwb25zZSIgbmFtZT0idGVzdEZhdWx0UmVzcG9uc2UiLz4NCi0gICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJycGNGYXVsdCIgbWVzc2FnZT0iaW1wbDpycGNGYXVsdCIgLz4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJQQ0xpdFNvYXBCaW5kaW5nIiB0eXBlPSJpbXBsOlJQQ0xpdCI+DQotDQotICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0NCi0gICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0U2ltcGxlUmVxdWVzdCI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdFNpbXBsZVJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXQiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RTaW1wbGVJbk91dFJlcXVlc3QiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RTaW1wbGVJbk91dFJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlMiI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdFNpbXBsZTJSZXF1ZXN0Ij4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0U2ltcGxlMlJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0SGVhZGVyIj4NCi0JCQkNCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0SGVhZGVyUmVxdWVzdCI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9ImJvZHlQYXJhbSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbXBsOnRlc3RIZWFkZXJSZXF1ZXN0IiBwYXJ0PSJoZWFkZXJQYXJhbSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0SGVhZGVyUmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVzcG9uc2UiIHBhcnQ9ImhlYWRlclJldHVybiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0TGlzdHMiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdExpc3RzUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdExpc3RzUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFN0cmluZ0xpc3QyIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RMb25nTGlzdDQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdExvbmdMaXN0NFJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RMb25nTGlzdDRSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEVudW1MaXN0NSI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEVudW1MaXN0NVJlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RW51bUxpc3Q3Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RFbnVtTGlzdDdSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDb21wbGV4QWxsNiI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4gDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RGYXVsdCI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ0ZXN0RmF1bHQiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0RmF1bHRSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0RmF1bHRSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0icnBjRmF1bHQiPg0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpmYXVsdCBuYW1lPSJycGNGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgICAgIDwvd3NkbDpmYXVsdD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPiAgICAgIA0KLQ0KLSAgIDwvd3NkbDpiaW5kaW5nPg0KLQ0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iUlBDTGl0U2VydmljZSI+DQotDQotICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbXBsOlJQQ0xpdFNvYXBCaW5kaW5nIiBuYW1lPSJSUENMaXQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvYXhpczIvc2VydmljZXMvUlBDTGl0U2VydmljZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpwb3J0Pg0KLQ0KLSAgIDwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ0xpdFNXQS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9SUENMaXRTV0Eud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1NmYwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1JQQ0xpdFNXQS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiIA0KLXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQoteG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiANCi14bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiIA0KLXhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIgDQoteG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLXhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi14bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIg0KLXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1JlcXVlc3QiPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50SU4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJkdW1teUF0dGFjaG1lbnRJTk9VVCIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIgLz4NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50SU5PVVQiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJkdW1teUF0dGFjaG1lbnRPVVQiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0NCi0gICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJSUENMaXRTV0EiPg0KLSAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6ZWNob1JlcXVlc3QiIG5hbWU9ImVjaG9SZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6ZWNob1Jlc3BvbnNlIiBuYW1lPSJlY2hvUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgICAgDQotICAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iUlBDTGl0U1dBU29hcEJpbmRpbmciIHR5cGU9ImltcGw6UlBDTGl0U1dBIj4NCi0NCi0gICAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uLz4NCi0gICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icmVxdWVzdCIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIvPiANCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRJTiIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImR1bW15QXR0YWNobWVudElOT1VUIiB0eXBlPSJpbWFnZS9qcGVnIi8+DQotICAgICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InJlc3BvbnNlIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiAgLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRJTk9VVCIgdHlwZT0iaW1hZ2UvanBlZyIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImR1bW15QXR0YWNobWVudE9VVCIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICA8L3dzZGw6YmluZGluZz4NCi0NCi0gICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJQQ0xpdFNXQVNlcnZpY2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpSUENMaXRTV0FTb2FwQmluZGluZyIgbmFtZT0iUlBDTGl0U1dBIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFNXQVNlcnZpY2UiLz4NCi0NCi0gICAgICA8L3dzZGw6cG9ydD4NCi0NCi0gICA8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLUpBWFdTLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMUJpbmRpbmctSkFYV1Mud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjZDdkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMUJpbmRpbmctSkFYV1Mud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDExIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvYmluZGluZ3Rlc3Qvc29hcDExIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiDQotICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1R5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2VUeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobyIgdHlwZT0idG5zOmVjaG9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob1Jlc3BvbnNlVHlwZSIvPg0KLQ0KLSAgICAgIDwveHNkOnNjaGVtYT4NCi0gICA8L3R5cGVzPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG8iPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8cG9ydFR5cGUgbmFtZT0iRWNobyI+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvcG9ydFR5cGU+DQotDQotICAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLQ0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iU09BUDExRWNob1NlcnZpY2UiPg0KLSAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvQmluZGluZyIgbmFtZT0iRWNob1BvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TT0FQMTFFY2hvU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0gICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMUJpbmRpbmctV1NJLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMUJpbmRpbmctV1NJLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjg0Y2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLVdTSS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2JpbmRpbmd0ZXN0L3NvYXAxMSINCi0gICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2JpbmRpbmd0ZXN0L3NvYXAxMSINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZVR5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob1R5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2VUeXBlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNobyI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG8iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJFY2hvIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG8iPg0KLSAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotDQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJTT0FQMTFFY2hvU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIiBuYW1lPSJFY2hvUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NPQVAxMkVjaG9TZXJ2aWNlIi8+DQotICAgICAgPC9wb3J0Pg0KLSAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDEyQmluZGluZy1KQVhXUy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTJCaW5kaW5nLUpBWFdTLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjE3NGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTJCaW5kaW5nLUpBWFdTLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2JpbmRpbmd0ZXN0L3NvYXAxMiINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2JpbmRpbmd0ZXN0L3NvYXAxMiINCi0gICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTIiDQotICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTIiDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1R5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2VUeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNobyIgdHlwZT0idG5zOmVjaG9UeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob1Jlc3BvbnNlVHlwZSIvPg0KLQ0KLSAgICAgIDwveHNkOnNjaGVtYT4NCi0gICA8L3R5cGVzPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG8iPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8cG9ydFR5cGUgbmFtZT0iRWNobyI+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvcG9ydFR5cGU+DQotDQotICAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLQ0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L2JpbmRpbmc+DQotDQotICAgPHNlcnZpY2UgbmFtZT0iU09BUDEyRWNob1NlcnZpY2UiPg0KLSAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvQmluZGluZyIgbmFtZT0iRWNob1BvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TT0FQMTJFY2hvU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0gICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMkVjaG8ud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDEyRWNoby53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODMxMTJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUDEyRWNoby53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9UeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNobyI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IlNPQVAxMkVjaG9TZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUDEyRWNob1NlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotICAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQQWN0aW9uVGVzdC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQQWN0aW9uVGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzBjNjNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvU09BUEFjdGlvblRlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIg0KLSAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIg0KLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iDQotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iR2V0UHJpY2VUeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iR2V0UHJpY2VSZXNwb25zZVR5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6R2V0UHJpY2VUeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZSIgdHlwZT0idG5zOkdldFByaWNlUmVzcG9uc2VUeXBlIi8+DQotICAgDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VXaXRoQWN0aW9uIiB0eXBlPSJ0bnM6R2V0UHJpY2VUeXBlIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VXaXRoQWN0aW9uUmVzcG9uc2UiIHR5cGU9InRuczpHZXRQcmljZVJlc3BvbnNlVHlwZSIvPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9Iml0ZW0iIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbnZlbnRvcnkiIHR5cGU9InhzZDppbnQiLz4NCi0NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJpdGVtV2l0aEFjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImludmVudG9yeVdpdGhBY3Rpb24iIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRQcmljZVJlcXVlc3QiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpnZXRQcmljZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6Z2V0UHJpY2VSZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0gIA0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldFByaWNlV2l0aEFjdGlvblJlcXVlc3QiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpnZXRQcmljZVdpdGhBY3Rpb24iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VXaXRoQWN0aW9uUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpnZXRQcmljZVdpdGhBY3Rpb25SZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0gDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0SW52ZW50b3J5UmVxdWVzdCI+DQotICAgICAgPHBhcnQgbmFtZT0iaXRlbSIgZWxlbWVudD0idG5zOml0ZW0iLz4NCi0gICA8L21lc3NhZ2U+DQotICAgDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0SW52ZW50b3J5UmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9ImludmVudG9yeSIgZWxlbWVudD0idG5zOmludmVudG9yeSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRJbnZlbnRvcnlXaXRoQWN0aW9uUmVxdWVzdCI+DQotICAgICAgPHBhcnQgbmFtZT0iaXRlbSIgZWxlbWVudD0idG5zOml0ZW1XaXRoQWN0aW9uIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldEludmVudG9yeVdpdGhBY3Rpb25SZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0iaW52ZW50b3J5IiBlbGVtZW50PSJ0bnM6aW52ZW50b3J5V2l0aEFjdGlvbiIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8cG9ydFR5cGUgbmFtZT0iQm9va1N0b3JlIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmdldFByaWNlUmVxdWVzdCIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRQcmljZVJlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2VXaXRoQWN0aW9uIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmdldFByaWNlV2l0aEFjdGlvblJlcXVlc3QiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0UHJpY2VXaXRoQWN0aW9uUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRJbnZlbnRvcnkiPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0SW52ZW50b3J5UmVxdWVzdCIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRJbnZlbnRvcnlSZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldEludmVudG9yeVdpdGhBY3Rpb24iPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0SW52ZW50b3J5V2l0aEFjdGlvblJlcXVlc3QiIC8+DQotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6Z2V0SW52ZW50b3J5V2l0aEFjdGlvblJlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvcG9ydFR5cGU+DQotDQotICAgPGJpbmRpbmcgbmFtZT0iQm9va1N0b3JlQmluZGluZyIgdHlwZT0idG5zOkJvb2tTdG9yZSI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2VXaXRoQWN0aW9uIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24vZ2V0UHJpY2UiLz4NCi0gICAgICAgICA8aW5wdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L2lucHV0Pg0KLSAgICAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L291dHB1dD4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldEludmVudG9yeSI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0SW52ZW50b3J5V2l0aEFjdGlvbiI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uL2dldEludmVudG9yeSIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJCb29rU3RvcmVTZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6Qm9va1N0b3JlQmluZGluZyIgbmFtZT0iQm9va1N0b3JlUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0Jvb2tTdG9yZVNlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotICAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9TdHJpbmdMaXN0LndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1N0cmluZ0xpc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzMDk0MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1N0cmluZ0xpc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotDQotPGRlZmluaXRpb25zIG5hbWU9IlN0cmluZ0xpc3QiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotDQotCTx0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCI+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmluZ0xpc3QiIHR5cGU9InRuczpTdHJpbmdMaXN0VHlwZSIgLz4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyaW5nTGlzdFJlc3BvbnNlIiB0eXBlPSJ0bnM6U3RyaW5nTGlzdFR5cGUiIC8+DQotICAgIA0KLQkJCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJTdHJpbmdMaXN0VHlwZSI+DQotCQkJCTx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOnN0cmluZyIvPg0KLQkJCTwveHNkOnNpbXBsZVR5cGU+DQotCQkJDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvdHlwZXM+DQotDQotCTxtZXNzYWdlIG5hbWU9IlN0cmluZ0xpc3QiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOlN0cmluZ0xpc3QiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iU3RyaW5nTGlzdFJlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOlN0cmluZ0xpc3RSZXNwb25zZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQkNCi0JPHBvcnRUeXBlIG5hbWU9IlN0cmluZ0xpc3RQb3J0VHlwZSI+DQotCQk8b3BlcmF0aW9uIG5hbWU9IlN0cmluZ0xpc3QiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6U3RyaW5nTGlzdCIgbmFtZT0iYWRkIiAvPg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOlN0cmluZ0xpc3RSZXNwb25zZSIgbmFtZT0iYWRkUmVzcG9uc2UiIC8+DQotCQkJDQotCQk8L29wZXJhdGlvbj4NCi0JPC9wb3J0VHlwZT4NCi0JPGJpbmRpbmcgbmFtZT0iU3RyaW5nTGlzdEJpbmRpbmciIHR5cGU9InRuczpTdHJpbmdMaXN0UG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCINCi0JCQlzdHlsZT0iZG9jdW1lbnQiIC8+DQotCQk8b3BlcmF0aW9uIG5hbWU9IlN0cmluZ0xpc3QiPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQkNCi0JCTwvb3BlcmF0aW9uPg0KLQkJDQotCTwvYmluZGluZz4NCi0JPHNlcnZpY2UgbmFtZT0iU3RyaW5nTGlzdFNlcnZpY2UiPg0KLQkJPHBvcnQgbmFtZT0iU3RyaW5nTGlzdFBvcnQiIGJpbmRpbmc9InRuczpTdHJpbmdMaXN0QmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1N0cmluZ0xpc3RTZXJ2aWNlIiAvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTRExNdWx0aVRlc3RzLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTRExNdWx0aVRlc3RzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGZhN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMTXVsdGlUZXN0cy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotDQotPGRlZmluaXRpb25zIG5hbWU9IkFkZE51bWJlcnMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6c29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iDQotCXhtbG5zOm5vdHNvYXA9Imh0dHA6Ly9ub3QuYS5zb2FwLmFkZHJlc3Mvd3NkbC9ub3Rzb2FwLyI+DQotDQotDQotCTx0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyI+DQotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVyc1Jlc3BvbnNlIj4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJCTxlbGVtZW50IG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcxIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0iQWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImZhdWx0SW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0ib25lV2F5SW50Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVycyI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkTnVtYmVycyIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzUmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6YWRkTnVtYmVyc1Jlc3BvbnNlIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+DQotCQk8cGFydCBuYW1lPSJBZGROdW1iZXJzRmF1bHQiIGVsZW1lbnQ9InRuczpBZGROdW1iZXJzRmF1bHQiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0ib25lV2F5SW50Ij4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpvbmVXYXlJbnQiIC8+DQotCTwvbWVzc2FnZT4NCi0NCi0JPHBvcnRUeXBlIG5hbWU9IkFkZE51bWJlcnNQb3J0VHlwZSI+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVycyIgbmFtZT0iYWRkIiAvPg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgbmFtZT0iYWRkUmVzcG9uc2UiIC8+DQotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNGYXVsdCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5SW50IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzUG9ydFR5cGVPdGhlclBUIj4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyI+DQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzIiBuYW1lPSJhZGQiIC8+DQotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc1Jlc3BvbnNlIiBuYW1lPSJhZGRSZXNwb25zZSIgLz4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc0ZhdWx0IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCQk8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCI+DQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlJbnQiIC8+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9wb3J0VHlwZT4NCi0JDQotCTxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc1BvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvYmluZGluZz4NCi0JPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0JpbmRpbmdTYW1lUFQiIHR5cGU9InRuczpBZGROdW1iZXJzUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCINCi0JCQlzdHlsZT0iZG9jdW1lbnQiIC8+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJCTxvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvb3V0cHV0Pg0KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiPg0KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2ZhdWx0Pg0KLQkJPC9vcGVyYXRpb24+DQotCQk8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4NCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9iaW5kaW5nPg0KLQk8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzQmluZGluZ090aGVyUFQiIHR5cGU9InRuczpBZGROdW1iZXJzUG9ydFR5cGVPdGhlclBUIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPg0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvYmluZGluZz4NCi0JDQotCTwhLS0NCi0JCUlNUE9SVEFOVCBOT1RFOiBUaGVzZSBwb3J0cyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNvbm5lY3RlZCB0b28hICBUaGlzIHRlc3QgaXMgc2ltcGx5IGZvcg0KLQkJV1NETCBwcm9jZXNzaW5nIGFuZCBTZXJ2aWNlLmFkZFBvcnQoLi4uKSBhbmQgU2VydmljZS5nZXRQb3J0KC4uLikgdmFsaWRhdGlvbjsgbm8gYXR0ZW1wdCBpcw0KLQkJbWFkZSB0byBhY3R1YWxseSBjb25uZWN0IHRvIHRoZSBlbmRwb2ludHMgZGVmaW5lZCBiZWxvdzsgdGhlcmUgaXMgbm8gaW1wbGVtZW50YXRpb24gYW5kIG5vDQotCQl2YWxpZCBlbmRwb2ludCBhdCB0aG9zZSBhZGRyZXNzZXMuCQ0KLQktLT4NCi0JDQotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNTZXJ2aWNlMSI+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMxUDEiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMVAxIiAvPg0KLQkJPC9wb3J0Pg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTMVAyIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzFQMiIgLz4NCi0JCTwvcG9ydD4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzFQMyIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMxUDMiIC8+DQotCQk8L3BvcnQ+DQotCTwvc2VydmljZT4NCi0JPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc1NlcnZpY2UyIj4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzJQMSIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMyUDEiIC8+DQotCQk8L3BvcnQ+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMyUDIiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMlAyIiAvPg0KLQkJPC9wb3J0Pg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTMlAzIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzJQMyIgLz4NCi0JCTwvcG9ydD4NCi0JCQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTMlA0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzJQNCIgLz4NCi0JCTwvcG9ydD4NCi0JCQ0KLQk8L3NlcnZpY2U+DQotCQk8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzU2VydmljZTMiPg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTM1AxIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmdPdGhlclBUIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMzUDEiIC8+DQotCQk8L3BvcnQ+DQotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMzUDIiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTM1AyIiAvPg0KLQkJPC9wb3J0Pg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTM1AzIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmdTYW1lUFQiPg0KLQkJCTxub3Rzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlUzNQMyIgLz4NCi0JCTwvcG9ydD4NCi0JCQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTM1A0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwMTI6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTM1A0IiAvPg0KLQkJPC9wb3J0Pg0KLQkJDQotCTwvc2VydmljZT4NCi0JDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2YmVhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tIFdTREwgZGVzY3JpcHRpb24gb2YgdGhlIFdTUyBQaW5nIGludGVyb3Agc2NlbmFyaW9zIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJFY2hvIg0KLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIg0KLSAgICB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIA0KLSAgICB4bWxuczp0bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIg0KLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotICAgIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiDQotICAgIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIg0KLSAgICB4bWxuczppbnRmPSJodHRwOi8vd3MtcG9saWN5LnRlc3RzIj4NCi0gICAgCSAgDQotICA8dHlwZXM+DQotICAgIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvIiB0eXBlPSJ0bnM6ZWNobyIvPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgICA8L3NjaGVtYT4NCi0gIDwvdHlwZXM+DQotDQotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9ImVjaG8iIGVsZW1lbnQ9InRuczpFY2hvIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpFY2hvUmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvUG9ydCI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iRWNobyI+DQotICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6RWNob1JlcXVlc3QiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9pbiIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpFY2hvUmVzcG9uc2UiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9vdXQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNob1BvcnQiPg0KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIg0KLXN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cy9lY2hvIi8+DQotICAgICAgPGlucHV0PiANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotICAgDQotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IkVjaG9Qb3J0IiBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9FY2hvU2VydmljZSIvPg0KLSAgICA8L3BvcnQ+DQotICA8L3NlcnZpY2U+DQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTR2VuU2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkZjQ3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTR2VuU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgbmFtZT0iV1NHZW5TZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWE+DQotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHNjaGVtYUxvY2F0aW9uPSJXU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QiLz4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPHBvcnRUeXBlIG5hbWU9IldTR2VuSW50ZXJmYWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLSAgPGJpbmRpbmcgbmFtZT0iV1NHZW5Qb3J0QmluZGluZyIgdHlwZT0idG5zOldTR2VuSW50ZXJmYWNlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpFY2hvU3RyaW5nIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0gIDxzZXJ2aWNlIG5hbWU9IldTR2VuU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IldTR2VuUG9ydCIgYmluZGluZz0idG5zOldTR2VuUG9ydEJpbmRpbmciPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9XU0dlblNlcnZpY2UiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTR2VuU2VydmljZV9zY2hlbWExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5ZjdiZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL1dTR2VuU2VydmljZV9zY2hlbWExLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHM6c2NoZW1hIHZlcnNpb249IjEuMCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIiB0eXBlPSJuczE6ZWNob1N0cmluZyIgeG1sbnM6bnMxPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiB0eXBlPSJuczI6ZWNob1N0cmluZ1Jlc3BvbnNlIiB4bWxuczpuczI9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIvPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLTwveHM6c2NoZW1hPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvYXN5bmNfZG9jbGl0d3Iud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvYXN5bmNfZG9jbGl0d3Iud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzY2M2Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2FzeW5jX2RvY2xpdHdyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYXN5bmMiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiPg0KLQkNCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4JCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2xlZXAiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImlzQXNsZWVwIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImlzQXNsZWVwUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Indha2VVcCI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3YWtlVXBSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmMiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2VBc3luY1Jlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbUFzeW5jIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9tQXN5bmNSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlclJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJwaW5nUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpwaW5nIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJwaW5nUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnBpbmdSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ic2xlZXBSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnNsZWVwIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJzbGVlcFJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpzbGVlcFJlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0id2FrZVVwUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczp3YWtlVXAiIC8+CQ0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ3YWtlVXBSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6d2FrZVVwUmVzcG9uc2UiIC8+CQ0KLQk8L3dzZGw6bWVzc2FnZT4JDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImlzQXNsZWVwUmVxdWVzdCI+DQotCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmlzQXNsZWVwIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpc0FzbGVlcFJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+CQkNCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlQXN5bmNSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmludm9rZUFzeW5jIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VBc3luY1Jlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppbnZva2VBc3luY1Jlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImN1c3RvbUFzeW5jUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpjdXN0b21Bc3luYyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iY3VzdG9tQXN5bmNSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6Y3VzdG9tQXN5bmNSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQkNCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iYW5vdGhlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6YW5vdGhlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iYW5vdGhlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczphbm90aGVyUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkJDQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJBc3luY1BvcnQiPg0KLQkJDQotCQk8IS0tIHNpbXBsZSBwaW5nIG9wZXJhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgRG9jTGl0V3JhcHBlZCBhc3luYyB0ZXN0LS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczpwaW5nUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnBpbmdSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JCQ0KLQkJPCEtLSByZXF1ZXN0IGZvciB0aGUgc2VydmVyIHRvIGdvdG8gc2xlZXAgdW50aWwgcmVsZWFzZSBpcyBjYWxsZWQtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzbGVlcCI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczpzbGVlcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpzbGVlcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPCEtLSBjaGVjayB0byBzZWUgaWYgdGhlIHNsZWVwIG9wZXJhdGlvbiBoYXMgYmVlbiBjYWxsZWQgeWV0IC0tPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmlzQXNsZWVwUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmlzQXNsZWVwUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQ0KLQkJDQotCQk8IS0tIGZvcmNlIHRoZSBzbGVlcCBvcGVyYXRpb24gdG8gc3RvcCBzbGVlcGluZyAtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6d2FrZVVwUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOndha2VVcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJCQ0KLQkJCQ0KLQkJCQ0KLQkJPCEtLSBTZWNvbmQgc3VpdGUgb2YgdGVzdHMgZm9yIEFzeW5jIG9wZXJhdGlvbiBuYW1pbmc6DQotCQkJIHdpbGwgdGVzdCBmb3IgaG93IHRoZSBpbXBsZW1lbnRhdGlvbiByZXNwb25kcyB0bw0KLQkJICAgICBtZXRob2RzIGVuZGluZyBpbiBBc3luYyB3aXRoIGFzeW5jIGJpbmRpbmcgZW5hYmxlZA0KLQkJIC0tPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZUFzeW5jIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmludm9rZUFzeW5jUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZUFzeW5jUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQ0KLQkJCQ0KLQkJPCEtLSB3aWxsIHRlc3QgZm9yIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uZHMgdG8NCi0JCSAgICAgbWV0aG9kcyBlbmRpbmcgaW4gYXN5bmMgd2l0aCBhc3luYyBiaW5kaW5nIGVuYWJsZWQNCi0JCSAtLT4JCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjdXN0b21Bc3luYyI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczpjdXN0b21Bc3luY1JlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpjdXN0b21Bc3luY1Jlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPCEtLSB3ZSB3aWxsIG1hcCB0aGlzIG9wZXJhdGlvbiB0byBhIGphdmEgbWV0aG9kIGVuZGluZyBpbiBBc3luYw0KLQkJIC0tPgkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iYW5vdGhlciI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczphbm90aGVyUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmFub3RoZXJSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkJCQkNCi0JCQkNCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi0JPHdzZGw6YmluZGluZyBuYW1lPSJBc3luYyIgdHlwZT0idG5zOkFzeW5jUG9ydCI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvcGluZyIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2xlZXAiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9zbGVlcCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaXNBc2xlZXAiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9pc0FzbGVlcCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JDQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Indha2VVcCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3dha2VVcCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlQXN5bmMiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9pbnZva2VBc3luYyIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJjdXN0b21Bc3luYyI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2N1c3RvbUFzeW5jIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFub3RoZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9hbm90aGVyIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkNCi0JDQotCTwvd3NkbDpiaW5kaW5nPg0KLQkNCi0JPHdzZGw6c2VydmljZSBuYW1lPSJBc3luY1NlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6QXN5bmMiIG5hbWU9IkFzeW5jUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2pheHdzLmFzeW5jL3NlcnZpY2VzL0FzeW5jRG9jTGl0V3JhcHBlZFNlcnZpY2UiIC8+DQotCQk8L3dzZGw6cG9ydD4NCi0JPC93c2RsOnNlcnZpY2U+DQotCQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2FzeW5jX2RvY2xpdHdyMi53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9hc3luY19kb2NsaXR3cjIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk5MzQ1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2FzeW5jX2RvY2xpdHdyMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhc3luYyIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCI+Ci0JCi0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIKLQkJCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IgotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CQkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmciPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCi0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2xlZXBSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImlzQXNsZWVwIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlIC8+Ci0JCQk8L3hzZDplbGVtZW50PgkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImlzQXNsZWVwUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Indha2VVcCI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZSAvPgotCQkJPC94c2Q6ZWxlbWVudD4JCi0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3YWtlVXBSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmMiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9tQXN5bmMiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9tQXN5bmNSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlciI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9InRocm93RXhjZXB0aW9uIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvblR5cGUiIHR5cGU9InRuczpFeGNlcHRpb25UeXBlRW51bSIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCi0KLQkJCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFeGNlcHRpb25UeXBlRW51bSI+Ci0JCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBFIiAvPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVCeVplcm8iIC8+Ci0JCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTRSIgLz4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29hcEZhdWx0IiAvPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXc2RsRmF1bHQiIC8+Ci0JCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzZDpzaW1wbGVUeXBlPgkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHRCZWFuIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InRocm93RXhjZXB0aW9uUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQk8L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJwaW5nUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnBpbmciIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InBpbmdSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpwaW5nUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InRocm93RXhjZXB0aW9uUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnRocm93RXhjZXB0aW9uIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0aHJvd0V4Y2VwdGlvblJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnRocm93RXhjZXB0aW9uUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6dGhyb3dFeGNlcHRpb25GYXVsdEJlYW4iIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InNsZWVwUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnNsZWVwIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJzbGVlcFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnNsZWVwUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ3YWtlVXBSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOndha2VVcCIgLz4JCi0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Indha2VVcFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOndha2VVcFJlc3BvbnNlIiAvPgkKLQk8L3dzZGw6bWVzc2FnZT4JCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpc0FzbGVlcFJlcXVlc3QiPgotCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppc0FzbGVlcCIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaXNBc2xlZXBSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPgkKLQk8L3dzZGw6bWVzc2FnZT4JCQotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlQXN5bmNSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmMiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZUFzeW5jUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4JCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJjdXN0b21Bc3luY1JlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpjdXN0b21Bc3luYyIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iY3VzdG9tQXN5bmNSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpjdXN0b21Bc3luY1Jlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgkJCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJhbm90aGVyUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmFub3RoZXIiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczphbm90aGVyUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+CQkKLQkKLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJBc3luY1BvcnQiPgotCQkKLQkJPCEtLSBzaW1wbGUgcGluZyBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIERvY0xpdFdyYXBwZWQgYXN5bmMgdGVzdC0tPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnBpbmdSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpwaW5nUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkKLQkJCi0JCTwhLS0gcmVxdWVzdCBmb3IgdGhlIHNlcnZlciB0byBnb3RvIHNsZWVwIHVudGlsIHJlbGVhc2UgaXMgY2FsbGVkLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzbGVlcCI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnNsZWVwUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTwhLS0gY2hlY2sgdG8gc2VlIGlmIHRoZSBzbGVlcCBvcGVyYXRpb24gaGFzIGJlZW4gY2FsbGVkIHlldCAtLT4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6aXNBc2xlZXBSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQotCQkKLQkJPCEtLSBmb3JjZSB0aGUgc2xlZXAgb3BlcmF0aW9uIHRvIHN0b3Agc2xlZXBpbmcgLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczp3YWtlVXBSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp3YWtlVXBSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQkJCi0JCQkKLQkJCQotCQk8IS0tIFNlY29uZCBzdWl0ZSBvZiB0ZXN0cyBmb3IgQXN5bmMgb3BlcmF0aW9uIG5hbWluZzoKLQkJCSB3aWxsIHRlc3QgZm9yIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uZHMgdG8KLQkJICAgICBtZXRob2RzIGVuZGluZyBpbiBBc3luYyB3aXRoIGFzeW5jIGJpbmRpbmcgZW5hYmxlZAotCQkgLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2VBc3luYyI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmludm9rZUFzeW5jUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkKLQkJCQotCQk8IS0tIHdpbGwgdGVzdCBmb3IgaG93IHRoZSBpbXBsZW1lbnRhdGlvbiByZXNwb25kcyB0bwotCQkgICAgIG1ldGhvZHMgZW5kaW5nIGluIGFzeW5jIHdpdGggYXN5bmMgYmluZGluZyBlbmFibGVkCi0JCSAtLT4JCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImN1c3RvbUFzeW5jIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpjdXN0b21Bc3luY1Jlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPCEtLSB3ZSB3aWxsIG1hcCB0aGlzIG9wZXJhdGlvbiB0byBhIGphdmEgbWV0aG9kIGVuZGluZyBpbiBBc3luYwotCQkgLS0+CQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFub3RoZXIiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczphbm90aGVyUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6YW5vdGhlclJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPCEtLSB0ZXN0IGZvciB2YXJpb3MgZXhjZXB0aW9ucywgdG8gdGVzdCBleGNlcHRpb24gaGFuZGxpbmcgd2l0aCBhc3luY01FUAotCQkJIGVuYWJsZWQKLQkJIC0tPgkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0aHJvd0V4Y2VwdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnRocm93RXhjZXB0aW9uUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dGhyb3dFeGNlcHRpb25SZXNwb25zZSIgLz4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiIG1lc3NhZ2U9InRuczp0aHJvd0V4Y2VwdGlvbkZhdWx0IiAvPgkJCQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQotCQkJCi0JPC93c2RsOnBvcnRUeXBlPgotCQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iQXN5bmMiIHR5cGU9InRuczpBc3luY1BvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L3BpbmciIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNsZWVwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvc2xlZXAiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvaXNBc2xlZXAiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCi0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC93YWtlVXAiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZUFzeW5jIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvaW52b2tlQXN5bmMiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9jdXN0b21Bc3luYyIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCi0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhbm90aGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvYW5vdGhlciIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRocm93RXhjZXB0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvdGhyb3dFeGNlcHRpb24iIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0idGhyb3dFeGNlcHRpb25GYXVsdCIgLz4KLQkJCTwvd3NkbDpmYXVsdD4JCQkJCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkJCi0JCi0JPC93c2RsOmJpbmRpbmc+Ci0JCi0JPHdzZGw6c2VydmljZSBuYW1lPSJBc3luY1NlcnZpY2UiPgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpBc3luYyIgbmFtZT0iQXN5bmNQb3J0Ij4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9qYXh3cy5hc3luY2RvY2xpdC9zZXJ2aWNlcy9Bc3luY0RvY0xpdFdyYXBwZWRTZXJ2aWNlIiAvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLQkKLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0X25vbndyYXAud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0X25vbndyYXAud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlYzg5MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdF9ub253cmFwLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb3h5Ig0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyI+DQotCQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZS8+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25ld2F5X3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9pbnQiIHR5cGU9InhzZDppbnQiIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b3dheV9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQ0KLQkJCTwhLS0gZmluIG9wIGRlZmluaXRpb24gLS0+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9wIiB0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW1vdW50IiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2l0aGRyYXciPg0KLQkJCSAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0JCQkgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZW1vIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCSAgICAgIDwveHNkOnNlcXVlbmNlPg0KLQkJCSAgICA8L3hzZDpleHRlbnNpb24+DQotCQkJICA8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQkNCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcG9zaXQiPg0KLQkJCSAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0JCQkgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0dXMiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJICAgICAgPC94c2Q6c2VxdWVuY2U+DQotCQkJICAgICA8L3hzZDpleHRlbnNpb24+DQotCQkJICA8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4JDQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlWb2lkUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5Vm9pZCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JDQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXROb25XcmFwUG9ydFR5cGUiPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlWb2lkUmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5UmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdE5vbldyYXAiIHR5cGU9InRuczpEb2NMaXROb25XcmFwUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvb25lV2F5Vm9pZCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5SG9sZGVyIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXkiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JDQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iRG9jTGl0Tm9uV3JhcFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0Tm9uV3JhcCIgbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdE5vbldyYXBTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXRiYXJlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdGJhcmUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0YmIzMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdGJhcmUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iRG9jbGl0QmFyZSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciPg0KLQkNCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVnZXIiIHR5cGU9InhzZDppbnQiIC8+CQkNCi0NCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wb3NpdGUiPgkJDQotCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJteUVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCTwhLS0gYmFzaWMgZmF1bHQgdGVzdCwgdGhpcyBzaG91bGQgYmUgbWFwcGVkIGludG8gbWVzc2FnZSBwYXJ0DQotCQkgICAgIG9mIHRoZSBnZW5lcmF0ZWQgZmF1bHRCZWFuDQotCQkgIC0tPg0KLQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotDQotCQk8IS0tIHdyYXBwZXIgZXhjZXB0aW9uIGFuZCBwb2x5bW9ycGhpYyBmYXVsdCB0ZXN0DQotCQkgICAgIFRoaXMgYmVhbiBzaG91bGQgaGF2ZSBhbiBhc3NvY2lhdGVkIGV4Y2VwdGlvbg0KLQkJICAtLT4NCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUJhc2VGYXVsdEJlYW4iIHR5cGU9InRuczpCYXNlRmF1bHQiIC8+CQkNCi0NCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQmFzZUZhdWx0Ij4NCi0JCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9ImVycm9yX2NvZGUiIHR5cGU9InhzZDppbnQiIC8+CQkJCQkNCi0JCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeHRlbmRlZEZhdWx0Ij4NCi0JCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCSAgPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkJhc2VGYXVsdCI+DQotCQkJICAgIDx4c2Q6c2VxdWVuY2U+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyX21lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyX2Vycm9yX2NvZGUiIHR5cGU9InhzZDppbnQiIC8+CQkJCQkNCi0JCQkgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+DQotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik5vUGFyYW0iIC8+DQotDQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0luIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1N0cmluZ0luIiBlbGVtZW50PSJ0bnM6U3RyaW5nIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ091dCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9TdHJpbmdPdXQiIGVsZW1lbnQ9InRuczpTdHJpbmciIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJTaW5nbGVQYXJhbSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6U3RyaW5nIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJTaW5nbGVQYXJhbUludCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6SW50ZWdlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlNpbmdsZVBhcmFtT3RoZXIiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOkNvbXBvc2l0ZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlNpbXBsZUZhdWx0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iZGVzY3JpcHRpb24iIGVsZW1lbnQ9InRuczpNeUZhdWx0IiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkZhdWx0QmVhbldpdGhXcmFwcGVyIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iZGVzY3JpcHRpb24iIGVsZW1lbnQ9InRuczpNeUJhc2VGYXVsdEJlYW4iIC8+CQ0KLQk8L3dzZGw6bWVzc2FnZT4JDQotDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdEJhcmVQb3J0VHlwZSI+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlFbXB0eSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5vUGFyYW0iIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6U2luZ2xlUGFyYW0iIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdJbiIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdPdXQiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlTaW1wbGUiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpTaW5nbGVQYXJhbUludCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOlNpbmdsZVBhcmFtIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOlNpbmdsZVBhcmFtT3RoZXIiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpTaW5nbGVQYXJhbU90aGVyIiAvPg0KLQkJCTx3c2RsOmZhdWx0IG1lc3NhZ2U9InRuczpTaW1wbGVGYXVsdCIgbmFtZT0idHdvV2F5RmF1bHQiLz4NCi0JCQk8d3NkbDpmYXVsdCBtZXNzYWdlPSJ0bnM6RmF1bHRCZWFuV2l0aFdyYXBwZXIiIG5hbWU9IndyYXBwZXJGYXVsdCIvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQkNCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi0JPHdzZGw6YmluZGluZyBuYW1lPSJEb2NMaXRCYXJlIiB0eXBlPSJ0bnM6RG9jTGl0QmFyZVBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlFbXB0eSI+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0JCSAgICA8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JDQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlTaW1wbGUiPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkNCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheUhvbGRlciI+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJ0d29XYXlGYXVsdCI+DQotCQkJCTxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0idHdvV2F5RmF1bHQiIC8+DQotCQkJPC93c2RsOmZhdWx0PgkJCQ0KLQkJCTx3c2RsOmZhdWx0IG5hbWU9IndyYXBwZXJGYXVsdCI+DQotCQkJCTxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0id3JhcHBlckZhdWx0IiAvPg0KLQkJCTwvd3NkbDpmYXVsdD4JCQkJDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQmFyZURvY0xpdFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0QmFyZSIgbmFtZT0iQmFyZURvY0xpdFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9CYXJlRG9jTGl0U2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvZG9jbGl0YmFyZW1pbi53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXRiYXJlbWluLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYWNjYTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXRiYXJlbWluLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iRG9jbGl0QmFyZU1pbiINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciPg0KLQkNCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIg0KLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iU2luZ2xlUGFyYW0iPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlN0cmluZyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdEJhcmVNaW5Qb3J0VHlwZSI+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6U2luZ2xlUGFyYW0iIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpTaW5nbGVQYXJhbSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkJDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jTGl0QmFyZU1pbiIgdHlwZT0idG5zOkRvY0xpdEJhcmVNaW5Qb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JDQotCQkNCi0JDQotCTwvd3NkbDpiaW5kaW5nPg0KLQkNCi0JPHdzZGw6c2VydmljZSBuYW1lPSJCYXJlRG9jTGl0TWluU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpEb2NMaXRCYXJlTWluIiBuYW1lPSJCYXJlRG9jTGl0TWluUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0JhcmVEb2NMaXRNaW5TZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9kb2NsaXR3cmFwLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdHdyYXAud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwYTE4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2RvY2xpdHdyYXAud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0id3JhcGphdmFiZWFudGVzdCINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciPg0KLQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2UgLz4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25lV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZXdheV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9pbnQiDQotCQkJCQkJCXR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b3dheV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2Vfc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZVJldHVyblR5cGUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQ0KLQkJCQ0KLQ0KLQkJCTwhLS0gZmluIG9wIGRlZmluaXRpb24gLS0+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9wIg0KLQkJCQkJCQl0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiDQotCQkJCQkJCXR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW1vdW50IiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2l0aGRyYXciPg0KLQkJCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lbW8iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCQk8L3hzZDpleHRlbnNpb24+DQotCQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVwb3NpdCI+DQotCQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdHVzIg0KLQkJCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclBhcnQwIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyUGFydDEiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im91dCIgdHlwZT0ieHNkOmxvbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imlub3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpsb25nIiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbm91dCIgdHlwZT0ieHNkOmludGVnZXIiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1dTR0VOMSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGUgLz4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdXU0dFTjIiPg0KLQkJCSAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlIC8+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVZvaWRSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXlWb2lkIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6aW52b2tlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaGVhZGVyUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InBheWxvYWQiIGVsZW1lbnQ9InRuczpoZWFkZXIiIC8+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlcjAiIGVsZW1lbnQ9InRuczpoZWFkZXJQYXJ0MCIgLz4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyMSIgZWxlbWVudD0idG5zOmhlYWRlclBhcnQxIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJoZWFkZXJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InBheWxvYWQiIGVsZW1lbnQ9InRuczpoZWFkZXJSZXNwb25zZSIgLz4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyMCIgZWxlbWVudD0idG5zOmhlYWRlclBhcnQwIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJib2R5UGFydCIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdXU0dFTjEiIC8+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclBhcnQiIGVsZW1lbnQ9InRuczpoZWFkZXJWYWx1ZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcnQiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImJvZHlQYXJ0IiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1dTR0VOMiIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcnQiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiIC8+DQotCSAgICA8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclBhcnQiIGVsZW1lbnQ9InRuczpoZWFkZXJWYWx1ZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jTGl0V3JhcCI+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVZvaWRSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJoZWFkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpoZWFkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aGVhZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMiI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOnBvcnRUeXBlPg0KLQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdFdyYXAiDQotCQl0eXBlPSJ0bnM6RG9jTGl0V3JhcCI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCINCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheVZvaWQiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5SG9sZGVyIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJoZWFkZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvaGVhZGVyIiAvPg0KLSAgICAgICAgDQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpoZWFkZXJSZXF1ZXN0IiBwYXJ0PSJoZWFkZXIwIi8+CQkJDQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpoZWFkZXJSZXF1ZXN0IiBwYXJ0PSJoZWFkZXIxIi8+CQkJDQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBwYXJ0cz0icGF5bG9hZCIvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpoZWFkZXJSZXNwb25zZSIgcGFydD0iaGVhZGVyMCIvPgkJCQ0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgcGFydHM9InBheWxvYWQiLz4JCQkNCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy9pbnZva2UiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvZmluT3AiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nV1NHRU4xIiAvPg0KLSAgICAgICAgDQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4xUmVxdWVzdCIgcGFydD0iaGVhZGVyUGFydCIvPgkJCQ0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjFSZXF1ZXN0IiBwYXJ0cz0iYm9keVBhcnQiLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmdXU0dFTjIiIC8+DQotDQotCQkJPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCSAgICA8c29hcDpoZWFkZXIgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiBwYXJ0PSJoZWFkZXJQYXJ0Ii8+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiBwYXJ0cz0iYm9keVBhcnQiLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOmJpbmRpbmc+DQotDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iRG9jTGl0V3JhcFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0V3JhcCINCi0JCQluYW1lPSJEb2NMaXRXcmFwUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdFdyYXBTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2dvcmlsbGFfZGx3LndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL2dvcmlsbGFfZGx3LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NmY2NTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9nb3JpbGxhX2Rsdy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iDQotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIA0KLSAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHciIA0KLSAgICB4bWxuczp0bnM9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3IiANCi0gICAgeG1sbnM6ZGF0YT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSINCi0gICAgeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPg0KLSAgPHR5cGVzPg0KLSAgICA8IS0tIFVzZSBlbGVtZW50Rm9ybURlZmF1bHQ9cXVhbGlmaWVkLiAgTWFueSB1c2VycyB1c2UgdGhpcyBzZXR0aW5nIGZvciBpbnRlcm9wIGNvbXBhdGliaWxpdHkgLS0+DQotICAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgDQotICAgICAgICB4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiAgamF4Yjp2ZXJzaW9uPSIyLjAiDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiID4NCi0NCi0gICAgICA8czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhMiIgIC8+DQotDQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImZhdWx0RGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJzdHJpbmdMaXN0Ij4gICANCi0gICAgICAgIDxzOmxpc3QgaXRlbVR5cGU9InM6c3RyaW5nIi8+IA0KLSAgICAgIDwvczpzaW1wbGVUeXBlPg0KLQ0KLSAgICAgIDxzOnNpbXBsZVR5cGUgbmFtZT0iZnJ1aXQiPg0KLSAgICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6c3RyaW5nIj4NCi0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0iYXBwbGUiLz4gICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9Im9yYW5nZSIvPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgPHM6ZW51bWVyYXRpb24gdmFsdWU9InBlYXIiLz4gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgIDwvczpyZXN0cmljdGlvbj4NCi0gICAgICA8L3M6c2ltcGxlVHlwZT4NCi0NCi0gICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3QwIj4NCi0gICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZGF0YTAiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICA8L3M6Y29tcGxleFR5cGU+DQotDQotICAgICAgPCEtLSBFY2hvIGEgU3RyaW5nLiAgVGhpcyBhbHNvIHN1cHBvcnRzIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gc3RyaW5nIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBjb21iaW5lZCBTdHJpbmctLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmcyIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJpbm91dCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmcyUmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Imlub3V0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBpbnQgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvSW50Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJzOmludCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0ludFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6aW50IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGVudW0gLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvRW51bSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpmcnVpdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0VudW1SZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJkYXRhOmZydWl0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGFueVR5cGUuICBUZXN0IHBvbHltb3JwaGlzbSAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9BbnlUeXBlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJzOmFueVR5cGUiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9BbnlUeXBlUmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iczphbnlUeXBlIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIHN0cmluZ0xpc3QuICBUZXN0cyB4c2Q6bGlzdC0tPg0KLSAgICAgIDwhLS0gQm90aCB0aGUgU0VJIGFuZCB0aGUgYmVhbiB1c2UgTGlzdCBTdHJpbmcgdG8gcmVwcmVzZW50IHRoZSBkYXRhLiAgLS0+DQotICAgICAgPCEtLSBCdXQgdGhlcmUgYXJlIHNvbWUgc2VtYW50aWMgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGlzIGFuZCBlY2hvU3RyaW5nQXJyYXkgLS0+DQotICAgICAgPCEtLSBkdWUgdG8geG1sIGRpZmZlcmVuY2VzIGJldHdlZW4geHNkOmxpc3QgYW5kIG1heE9jY3VycyB1bmJvdW5kZWQgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gSnVzdCBsaWtlIHN0cmluZ0xpc3QsIGV4Y2VwdCB0aGUgU0VJIHBhcmFtZXRlciBpcyBtYW51YWxseSBjaGFuZ2VkIHRvIFN0cmluZ1tdIC0tPg0KLSAgICAgIDwhLS0gVGhpcyB3aWxsIHRlc3QgTGlzdCA8LT4gamF2YSBBcnJheSBwcm9jZXNzaW5nIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBbHQiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBbHRSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEp1c3QgbGlrZSBzdHJpbmdMaXN0LCBleGNlcHQgdGhlIFNFSSBwYXJhbWV0ZXIgaXMgbWFudWFsbHkgY2hhbmdlZCB0byBMaW5rZWRMaXN0IFN0cmluZyAtLT4NCi0gICAgICA8IS0tIFRoaXMgd2lsbCB0ZXN0IExpc3QgPC0+IGphdmEgQXJyYXkgcHJvY2Vzc2luZyAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0JICANCi0JICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBbHRBc0xpbmtlZExpc3RSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIFRoZSBTRUkgYW5kIGJlYW4gcHJvcGVydHkgbWFwIHRvIExpc3QgTGlzdCBTdHJpbmcgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGEgU3RyaW5nIGFyYXkuIC0tPg0KLSAgICAgIDwhLS0gUHJvYmFibHkgdGhlIG1vc3QgY29tbW9uIGNhc2UuICBCb3RoIHRoZSBTRUkgYW5kIGJlYW4gYXJlIG1hcHBlZCB0byBMaXN0IFN0cmluZyAtLT4NCi0gICAgICA8IS0tIFRoZSB4bWwgbWF4T2NjdXJzIHNlbWFudGljcyBhcmUgdXNlZCB0byBtYXJzaGFsIGFuZCB1bm1hcnNoYWwgdGhlIHZhbHVlcy4uLiAtLT4NCi0gICAgICA8IS0tIFdoaWNoIG1ha2VzIHRoaXMgYSBsaXR0bGUgZGlmZmVyZW50IHRoYW4gdGhlIGVjaG9TdHJpbmdMaXN0IGNhc2UgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIFNhbWUgYXMgZWNob1N0cmluZ0FycmF5LCBleGNlcHQgdGhlIFNFSSBpcyBtYW51YWxseSBjaGFuZ2VkIHRvIFN0cmluZ1tdIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5QWx0Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBbHRSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBTYW1lIGFzIGVjaG9TdHJpbmdBcnJheSwgZXhjZXB0IHRoZSBTRUkgaXMgbWFudWFsbHkgY2hhbmdlZCB0byBMaW5rZWRMaXN0IFN0cmluZyAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBJbmRleGVkIFN0cmluZyBBcnJheSAtLT4NCi0gICAgICA8IS0tIEluIHRoaXMgY2FzZSB0aGUgcGFyYW1ldGVyIGlzIGEgTGlzdCBTdHJpbmcsIGJ1dCB0aGUgYmVhbiBwcm9wZXJ0eSB1c2VzIHRoZSBpbmRleGVkIC0tPg0KLSAgICAgIDwhLS0gc2V0dGVyL2dldHRlciBzdHlsZSBtZXRob2RzIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0luZGV4ZWRTdHJpbmdBcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgPg0KLSAgICAgICAgICAgICAgPHM6YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHM6YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8amF4Yjpwcm9wZXJ0eSBjb2xsZWN0aW9uVHlwZT0iaW5kZXhlZCIgLz4NCi0gICAgICAgICAgICAgICAgPC9zOmFwcGluZm8+DQotICAgICAgICAgICAgICA8L3M6YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0luZGV4ZWRTdHJpbmdBcnJheVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iczpzdHJpbmciID4NCi0gICAgICAgICAgICAgIDxzOmFubm90YXRpb24+DQotICAgICAgICAgICAgICAgIDxzOmFwcGluZm8+DQotICAgICAgICAgICAgICAgICAgPGpheGI6cHJvcGVydHkgY29sbGVjdGlvblR5cGU9ImluZGV4ZWQiIC8+DQotICAgICAgICAgICAgICAgIDwvczphcHBpbmZvPg0KLSAgICAgICAgICAgICAgPC9zOmFubm90YXRpb24+DQotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gY29tYmluZWQgU3RyaW5nLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nMkFycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW5vdXQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nMkFycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW5vdXQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGludCAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9JbnRBcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOmludCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0ludEFycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOmludCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBlbnVtIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0VudW1BcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOmZydWl0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvRW51bUFycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJkYXRhOmZydWl0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGFueVR5cGUuICBUZXN0IHBvbHltb3JwaGlzbSAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9BbnlUeXBlQXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczphbnlUeXBlIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvQW55VHlwZUFycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOmFueVR5cGUiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0JICANCi0gICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0RhdGUiPiAgICAgCSANCi0gICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLQkJICAgPHM6Y2hvaWNlPg0KLQkJCQk8czplbGVtZW50IG5hbWU9IlJlcXVlc3RlZFRlcm1pbmF0aW9uVGltZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InM6ZGF0ZVRpbWUiIC8+DQotCQkJCTxzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkTGlmZXRpbWVEdXJhdGlvbiIgdHlwZT0iczpkdXJhdGlvbiIgLz4NCi0JCQk8L3M6Y2hvaWNlPg0KLQkJCQ0KLSAgICAgICAgICAgICA8IS0tPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpkYXRlIiAvPg0KLSAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+IC0tPg0KLQkJCSANCi0gICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0JICA8L3M6ZWxlbWVudD4NCi0NCi0JICA8czplbGVtZW50IG5hbWU9ImVjaG9EYXRlUmVzcG9uc2UiPg0KLSAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InM6ZGF0ZSIgLz4NCi0gICAgICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLQkgIDwvczplbGVtZW50Pg0KLQkgIA0KLQkgIDxzOmNvbXBsZXhUeXBlIG5hbWU9ImVjaG9CYXNldHlwZSI+DQotCSAgICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLQkgICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InM6ZGF0ZSIgLz4NCi0JICAgICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLQkgICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotCQkJIA0KLQkgIAkgPHM6ZWxlbWVudCBuYW1lPSJlY2hvUG9seW1vcnBoaWNEYXRlIj4NCi0JCQkgPHM6Y29tcGxleFR5cGU+DQotCQkJCTxzOmNvbXBsZXhDb250ZW50Pg0KLQkJCQkJPHM6ZXh0ZW5zaW9uIGJhc2U9ImRhdGE6ZWNob0Jhc2V0eXBlIi8+DQotCQkJCTwvczpjb21wbGV4Q29udGVudD4NCi0JCQk8L3M6Y29tcGxleFR5cGU+DQotCQkgPC9zOmVsZW1lbnQ+DQotCQkgCSAgDQotICAgIDwvczpzY2hlbWE+DQotDQotICAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEyIiA+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gRm9yIGFueVR5cGUgcHJvY2Vzc2luZywgIE9iamVjdDEgaXMgaW4gYW4gaW1wb3J0ZWQgc2NoZW1hLCB0aHVzIGl0IHNob3VsZCBiZSBhbGxvd2VkIGluIHRoZSBhbnlUeXBlIC0tPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0MSI+DQotICAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJkYXRhMSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgIDwvczpzY2hlbWE+DQotDQotICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YVVucmVmIiA+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gRm9yIGFueVR5cGUgcHJvY2Vzc2luZywgIE9iamVjdDIgaXMgaW4gYW4gdW5yZWZlcmVuY2VkIHNjaGVtYSwgdGh1cyBtYXkgZmFpbCB3aGVuIHVzZWQgd2l0aCBhbnlUeXBlIC0tPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0MiI+DQotICAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJkYXRhMiIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgIDwvczpzY2hlbWE+DQotIA0KLSAgPC90eXBlcz4NCi0NCi0gIDwhLS0gbWVzc2FnZXMgLS0+DQotICA8bWVzc2FnZSBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6YXNzZXJ0RmF1bHQiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nUmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nMiI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZzIiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nMlJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nMlJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0ludCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9JbnRSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0ludFJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0VudW0iPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9FbnVtIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0VudW1SZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0VudW1SZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9BbnlUeXBlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvQW55VHlwZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9BbnlUeXBlUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9BbnlUeXBlUmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3QiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdFJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RBbHQiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0QWx0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RBbHRSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RBbHRSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdEFzTGlua2VkTGlzdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdEFycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdEFycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdEFycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdBcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFsdCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0FycmF5QWx0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5QWx0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdBcnJheUFsdFJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3QiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3RSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotICANCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9JbmRleGVkU3RyaW5nQXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9JbmRleGVkU3RyaW5nQXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvSW5kZXhlZFN0cmluZ0FycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9JbmRleGVkU3RyaW5nQXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmcyQXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmcyQXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nMkFycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmcyQXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9JbnRBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0ludEFycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludEFycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9JbnRBcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0VudW1BcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0VudW1BcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9FbnVtQXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0VudW1BcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0FueVR5cGVBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0FueVR5cGVBcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9BbnlUeXBlQXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0FueVR5cGVBcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICANCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUG9seW1vcnBoaWNEYXRlTWVzc2FnZSI+DQotICAgICAgPHBhcnQgbmFtZT0iZGF0ZVJlcXVlc3QiIGVsZW1lbnQ9ImRhdGE6ZWNob1BvbHltb3JwaGljRGF0ZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0gICANCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvRGF0ZU1lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9ImRhdGVSZXF1ZXN0IiBlbGVtZW50PSJkYXRhOmVjaG9EYXRlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9EYXRlUmVzcG9uc2VNZXNzYWdlIj4NCi0gICAgICA8cGFydCBuYW1lPSJkYXRlUmVzcG9uc2UiIGVsZW1lbnQ9ImRhdGE6ZWNob0RhdGVSZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gIDwhLS0gb3BlcmF0aW9uIC0tPg0KLSAgPHBvcnRUeXBlIG5hbWU9IkdvcmlsbGFJbnRlcmZhY2UiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZyIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmcyIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmcyIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmcyUmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9JbnQiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludFJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VudW0iPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0VudW0iIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0VudW1SZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9BbnlUeXBlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9BbnlUeXBlIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9BbnlUeXBlUmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdCIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdFJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3RBbHQiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RBbHQiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RBbHRSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdEFycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0QXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RBcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5QWx0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheUFsdCIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlBbHRSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3QiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdFJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW5kZXhlZFN0cmluZ0FycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9JbmRleGVkU3RyaW5nQXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0luZGV4ZWRTdHJpbmdBcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nMkFycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmcyQXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZzJBcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludEFycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRBcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvSW50QXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbnVtQXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0VudW1BcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRW51bUFycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQW55VHlwZUFycmF5Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9BbnlUeXBlQXJyYXkiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0FueVR5cGVBcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1BvbHltb3JwaGljRGF0ZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvUG9seW1vcnBoaWNEYXRlTWVzc2FnZSIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotCTxvcGVyYXRpb24gbmFtZT0iZWNob0RhdGUiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0RhdGVNZXNzYWdlIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9EYXRlUmVzcG9uc2VNZXNzYWdlIiAvPg0KLQk8L29wZXJhdGlvbj4NCi0gIDwvcG9ydFR5cGU+DQotDQotICA8IS0tIGJpbmRpbmcgLS0+DQotICA8YmluZGluZyBuYW1lPSJHb3JpbGxhU09BUCIgdHlwZT0idG5zOkdvcmlsbGFJbnRlcmZhY2UiPg0KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nMiI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbnVtIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9BbnlUeXBlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0QWx0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFsdCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3QiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0luZGV4ZWRTdHJpbmdBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nMkFycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnRBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRW51bUFycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9BbnlUeXBlQXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0RhdGUiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+ICANCi0JPG9wZXJhdGlvbiBuYW1lPSJlY2hvUG9seW1vcnBoaWNEYXRlIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gPC9iaW5kaW5nPg0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0iR29yaWxsYVNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJHb3JpbGxhUG9ydCIgYmluZGluZz0idG5zOkdvcmlsbGFTT0FQIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvYXhpczIvc2VydmljZXMvR29yaWxsYVNlcnZpY2UiIC8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvcmVzb3VyY2VpbmplY3Rpb24ud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvcmVzb3VyY2VpbmplY3Rpb24ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhNTEwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3Jlc291cmNlaW5qZWN0aW9uLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciPg0KLSAgPHdzZGw6dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgCTx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgCQk8eHNkOnNlcXVlbmNlPg0KLSAgICAgIAkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0gICAgICAJCTwveHNkOnNlcXVlbmNlPg0KLSAgICAgIAk8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvIj4NCi0gICAgICAJPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAJCTx4c2Q6c2VxdWVuY2U+DQotICAgICAgCQkJPHhzZDplbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0gICAgICAJCTwveHNkOnNlcXVlbmNlPg0KLSAgICAgIAk8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICA8L3hzZDpzY2hlbWE+DQotICA8L3dzZGw6dHlwZXM+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIgbmFtZT0iZWNob1Jlc3BvbnNlIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNobyI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmVjaG8iIG5hbWU9ImVjaG8iLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uQmluZGluZyIgdHlwZT0idG5zOlJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnL05ld09wZXJhdGlvbiIvPg0KLSAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOmJpbmRpbmc+DQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uU2VydmljZSI+DQotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlJlc291cmNlSW5qZWN0aW9uQmluZGluZyIgbmFtZT0iUmVzb3VyY2VJbmplY3Rpb25Qb3J0Ij4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlIi8+DQotICAgIDwvd3NkbDpwb3J0Pg0KLSAgPC93c2RsOnNlcnZpY2U+DQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvcnBjbGl0ZW51bS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9ycGNsaXRlbnVtLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmIzMDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9ycGNsaXRlbnVtLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyINCi0gIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gIHhtbG5zOnRucz0iaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyIgDQotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gIHhtbG5zOmludGY9Imh0dHA6Ly9zY2hlbWEucnBjbGl0LnRlc3Qub3JnIiANCi0gIHhtbG5zOmltcGw9Imh0dHA6Ly9zY2hlbWEucnBjbGl0LnRlc3Qub3JnIiANCi0gIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgDQotICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPg0KLQ0KLSAgPHR5cGVzPg0KLSAgICA8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hLnJwY2xpdC50ZXN0Lm9yZyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICAgICAgPCEtLSA8ZWxlbWVudCBuYW1lPSJlbGVtZW50U3RyaW5nIj4gLS0+DQotICAgICAgICA8c2ltcGxlVHlwZSBuYW1lPSJlbGVtZW50U3RyaW5nIj4NCi0gICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPg0KLSAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQSIvPg0KLSAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQiIvPg0KLSAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQyIvPg0KLSAgICAgICAgICA8L3Jlc3RyaWN0aW9uPg0KLSAgICAgICAgPC9zaW1wbGVUeXBlPg0KLSAgICAgIDwhLS0gPC9lbGVtZW50PiAtLT4NCi0gICAgPC9zY2hlbWE+DQotICA8L3R5cGVzPg0KLQ0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCI+DQotICAgIDx3c2RsOnBhcnQgbmFtZT0icFN0cmluZyIgdHlwZT0iaW50ZjplbGVtZW50U3RyaW5nIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgPHdzZGw6cGFydCBuYW1lPSJwU3RyaW5nIiB0eXBlPSJpbnRmOmVsZW1lbnRTdHJpbmciLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUG9ydFR5cGUiPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiIG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVxdWVzdCIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiIG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiLz4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQmluZGluZyIgdHlwZT0idG5zOlBvcnRUeXBlIj4NCi0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPg0KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkNCi0gICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIg0KLSAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgICAgICA8d3NkbHNvYXA6Ym9keQ0KLSAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9ycGNsaXQudGVzdC5vcmciDQotICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6YmluZGluZz4NCi0NCi0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iU2VydmljZSI+DQotICAgIDx3c2RsOnBvcnQgbmFtZT0iUG9ydCIgYmluZGluZz0idG5zOkJpbmRpbmciPg0KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0RW51bVNlcnZpY2UiLz4NCi0gICAgPC93c2RsOnBvcnQ+DQotICA8L3dzZGw6c2VydmljZT4NCi0NCi0gIA0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3JwY2xpdHN0cmluZ2FycmF5LndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3JwY2xpdHN0cmluZ2FycmF5LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmExZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9ycGNsaXRzdHJpbmdhcnJheS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iRWNob1NlcnZpY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlaS5zdHJpbmdhcnJheS5ycGNsaXQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vc2VpLnN0cmluZ2FycmF5LnJwY2xpdC5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiB4bWxuczpuczE9ICJodHRwOi8vc3RyaW5nYXJyYXkucnBjbGl0LnRlc3Qub3JnIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPg0KLSAgPHR5cGVzPg0KLSAgICA8eHNkOnNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSAiaHR0cDovL3N0cmluZ2FycmF5LnJwY2xpdC50ZXN0Lm9yZyI+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJpbmdBcnJheSIgZmluYWw9IiNhbGwiPg0KLQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXRlbSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiPjwveHNkOmVsZW1lbnQ+DQotCQk8L3hzZDpzZXF1ZW5jZT4NCi0JICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9ImFyZzAiIHR5cGU9Im5zMTpzdHJpbmdBcnJheSI+DQotICAgIDwvcGFydD4NCi0NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJuczE6c3RyaW5nQXJyYXkiPg0KLSAgICA8L3BhcnQ+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciPg0KLSAgICA8L3BhcnQ+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgPHBhcnQgbmFtZT0iYXJnMCIgdHlwZT0ieHNkOnN0cmluZyI+DQotICAgIDwvcGFydD4NCi0gIDwvbWVzc2FnZT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBwYXJhbWV0ZXJPcmRlcj0iYXJnMCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nIj4NCi0gICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiPg0KLQ0KLSAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5IiBwYXJhbWV0ZXJPcmRlcj0iYXJnMCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXkiPg0KLSAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4NCi0gICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9Qb3J0QmluZGluZyIgdHlwZT0idG5zOkVjaG8iPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdhcnJheS5ycGNsaXQudGVzdC5vcmciLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vc3RyaW5nYXJyYXkucnBjbGl0LnRlc3Qub3JnIi8+DQotDQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG9TdHJpbmdBcnJheSIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdhcnJheS5ycGNsaXQudGVzdC5vcmciLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vc3RyaW5nYXJyYXkucnBjbGl0LnRlc3Qub3JnIi8+DQotDQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLSAgPHNlcnZpY2UgbmFtZT0iUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InRuczpFY2hvUG9ydEJpbmRpbmciPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zYW1wbGVtdG9tanBlZy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zYW1wbGVtdG9tanBlZy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjZjYjU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2FtcGxlbXRvbWpwZWcud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhLS0NCi1OYW1lOiBzYW1wbGVtdG9tanBlZy53c2RsDQotLS0+DQotPGRlZmluaXRpb25zIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIA0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iICANCi0gICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgDQotICAgIHhtbG5zOnMwPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gICAgDQotICA8dHlwZXM+DQotICAgPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCi0gICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgeG1sbnM6dG5zPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyI+DQotICAgIA0KLSAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIg0KLSAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSIuLi94c2QveG1sbWltZS54c2QiLz4NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkltYWdlRGVwb3QiPg0KLSAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9ImltYWdlL2pwZWciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0ZXh0RGF0YSIgDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4bWltZTpiYXNlNjRCaW5hcnkiICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICB4bWltZTpjb250ZW50VHlwZT0idGV4dC94bWwiLz4NCi0gICAgICAgICAgDQotICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZva2UiPg0KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+DQotICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ib3V0cHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgIDwveHM6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVtcHR5TWVzc2FnZSIvPg0KLSAgPG1lc3NhZ2UgbmFtZT0ic2VuZEltYWdlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6aW52b2tlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpzZW5kSW1hZ2VSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJzZW5kSW1hZ2VJbnRlcmZhY2UiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOnNlbmRJbWFnZSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOnNlbmRJbWFnZVJlc3BvbnNlIiAvPg0KLSAgICA8L29wZXJhdGlvbj4gIA0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9InNlbmRJbWFnZVNvYXAiIHR5cGU9InMwOnNlbmRJbWFnZUludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzZW5kSW1hZ2UiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotDQotICA8c2VydmljZSBuYW1lPSJTZW5kSW1hZ2VTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iU2VuZEltYWdlUG9ydCIgYmluZGluZz0iczA6c2VuZEltYWdlU29hcCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL01UT01CeXRlQXJyYXkvU2VuZEltYWdlU2VydmljZSIgLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zaGFwZXMud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OGI3NzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zaGFwZXMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLQl4bWxucz0iaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLQkNCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnRucz0iaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLQl4bWxuczp0bnMxPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCXhtbG5zOnRuczI9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciDQotCXhtbG5zOnRuczM9Imh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkNCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotCTx3c2RsOnR5cGVzPg0KLQkgICAgPHhzZDpzY2hlbWE+DQotCQkgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyINCi0JCSAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSIuLi94c2Qvc2hhcGUueHNkIi8+DQotCQkgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciDQotCQkgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iLi4veHNkLzNEU2hhcGUueHNkIi8+DQotCQkgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIg0KLQkJICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Ii4uL3hzZC9zaGFwZV93cmFwcGVycy54c2QiLz4NCi0JICAgIDwveHNkOnNjaGVtYT4NCi0JICAgIA0KLQk8L3dzZGw6dHlwZXM+DQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZHJhdzNEUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczM6ZHJhdzNEIj4NCi0JCTwvd3NkbDpwYXJ0Pg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZHJhd1JlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnMzOmRyYXciPg0KLQkJPC93c2RsOnBhcnQ+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJkcmF3UmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJ0eXBlc1FOYW1lUmVzcG9uc2UiIGVsZW1lbnQ9InRuczM6ZHJhd1Jlc3BvbnNlIj4NCi0JCTwvd3NkbDpwYXJ0Pg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSI+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZHJhdyI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmRyYXdSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZHJhd1Jlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZHJhdzNEIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZHJhdzNEUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmRyYXdSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iUG9seW1vcnBoaWNTaGFwZUJpbmRpbmciIHR5cGU9InRuczpQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiDQotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZHJhdyI+CQkJDQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9zZWkucG9seW1vcnBoaWNzaGFwZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL2RyYXciIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZHJhdzNEIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3NlaS5wb2x5bW9ycGhpY3NoYXBlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvZHJhdzNEIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JPC93c2RsOmJpbmRpbmc+DQotCQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlBvbHltb3JwaGljU2hhcGVTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgbmFtZT0iUG9seW1vcnBoaWNTaGFwZVBvcnQiDQotCQkJYmluZGluZz0idG5zOlBvbHltb3JwaGljU2hhcGVCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UiIC8+DQotCQk8L3dzZGw6cG9ydD4NCi0JPC93c2RsOnNlcnZpY2U+DQotCQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3N3YW10b21zZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy93c2RsL3N3YW10b21zZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MDYxZTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMvd3NkbC9zd2FtdG9tc2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotPHdzZGw6ZGVmaW5pdGlvbnMNCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudGVzdC5vcmciDQotCXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudGVzdC5vcmciDQotCXhtbG5zOnR5cGVucz0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnR5cGVzLnRlc3Qub3JnIg0KLQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQkgPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQkgIHhtbG5zOnRucz0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnR5cGVzLnRlc3Qub3JnIg0KLQkJICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50eXBlcy50ZXN0Lm9yZyI+DQotDQotCQk8ZWxlbWVudCBuYW1lPSJtdG9tQXR0YWNobWVudCIgPg0KLQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJPHNlcXVlbmNlPg0KLQkJCQkJPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIgLz4NCi0JCQkJPC9zZXF1ZW5jZT4NCi0JCQk8L2NvbXBsZXhUeXBlPg0KLQkJPC9lbGVtZW50Pg0KLQ0KLQkJPGVsZW1lbnQgbmFtZT0ibXRvbUF0dGFjaG1lbnRSZXNwb25zZSIgPg0KLQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJPHNlcXVlbmNlPg0KLQkJCQkJPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIgLz4NCi0JCQkJPC9zZXF1ZW5jZT4NCi0JCQk8L2NvbXBsZXhUeXBlPg0KLQkJPC9lbGVtZW50Pg0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3dzZGw6dHlwZXM+DQotDQotDQotICA8IS0tIGF0dGFjaG1lbnQuLi5ub3RlIG5vIGJvZHkgcGFydCAtLT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3dhQXR0YWNobWVudFJlcXVlc3QiPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2VSZXF1ZXN0IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3dhQXR0YWNobWVudFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlUmVzcG9uc2UiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgDQotICA8IS0tIHR3byBhdHRhY2htZW50cy4uLmFuZCBubyBib2R5IHBhcnQgLS0+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InN3YUF0dGFjaG1lbnQyUmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZTFSZXF1ZXN0IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZTJSZXF1ZXN0IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3dhQXR0YWNobWVudDJSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZTFSZXNwb25zZSIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2UyUmVzcG9uc2UiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgDQotDQotICAgPCEtLSBtdG9tIC0tPg0KLQ0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdG9tQXR0YWNobWVudFJlcXVlc3QiPg0KLSAgICA8cGFydCBuYW1lPSJtdG9tX2luIiBlbGVtZW50PSJ0eXBlbnM6bXRvbSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9Im10b21BdHRhY2htZW50UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJtdG9tX291dCIgZWxlbWVudD0idHlwZW5zOm10b21SZXNwb25zZSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iU1dBTVRPTVBvcnRUeXBlIj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3dhQXR0YWNobWVudCI+DQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnN3YUF0dGFjaG1lbnRSZXF1ZXN0IiAvPg0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6c3dhQXR0YWNobWVudFJlc3BvbnNlIiAvPg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN3YUF0dGFjaG1lbnQyIj4NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6c3dhQXR0YWNobWVudDJSZXF1ZXN0IiAvPg0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6c3dhQXR0YWNobWVudDJSZXNwb25zZSIgLz4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJtdG9tQXR0YWNobWVudCI+DQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm10b21BdHRhY2htZW50UmVxdWVzdCIgLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOm10b21BdHRhY2htZW50UmVzcG9uc2UiIC8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICAgPHdzZGw6YmluZGluZyBuYW1lPSJTV0FNVE9NQmluZGluZyIgdHlwZT0idG5zOlNXQU1UT01Qb3J0VHlwZSI+DQotICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzd2FBdHRhY2htZW50Ij4NCi0gICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic3dhQXR0YWNobWVudCIvPg0KLSAgICAgICAgPHdzZGw6aW5wdXQgPg0KLSAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0iIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2VSZXF1ZXN0IiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgPHdzZGw6b3V0cHV0ID4NCi0gICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9IiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlUmVzcG9uc2UiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN3YUF0dGFjaG1lbnQyIj4NCi0gICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic3dhQXR0YWNobWVudDIiLz4NCi0gICAgICAgIDx3c2RsOmlucHV0ID4NCi0gICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9IiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotDQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlMVJlcXVlc3QiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2UyUmVxdWVzdCIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgIDx3c2RsOm91dHB1dCA+DQotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZTFSZXNwb25zZSIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZTJSZXNwb25zZSIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ibXRvbUF0dGFjaG1lbnQiPg0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ibXRvbUF0dGFjaG1lbnQiLz4NCi0gICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgPHdzZGw6b3V0cHV0ID4NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgPC93c2RsOmJpbmRpbmc+DQotDQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJTV0FNVE9NU2VydmljZSI+DQotICAgICA8d3NkbDpwb3J0IG5hbWU9IlNXQU1UT01Qb3J0VHlwZVBvcnQiIGJpbmRpbmc9InRuczpTV0FNVE9NQmluZGluZyI+DQotICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL0BIT1NUQDpAUE9SVEAvamF4d3Muc3dhbXRvbS9zZXJ2aWNlcy9TV0FNVE9NU2VydmljZSIgLz4NCi0gICAgIDwvd3NkbDpwb3J0Pg0KLSAgIDwvd3NkbDpzZXJ2aWNlPg0KLSAgICAgICAgICANCi08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL2FkZG51bWJlcnN0ZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3htbC9hZGRudW1iZXJzdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzVjZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL2FkZG51bWJlcnN0ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4NCi0gICAgICAgIDxzb2FwOkhlYWRlcj4gDQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+R29vZDE8L25zMTpteUhlYWRlcj4NCi0JCQk8bnMxOm15SGVhZGVyIHhtbG5zOm5zMT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiBzb2FwOmFjdG9yPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiPkdvb2QyPC9uczE6bXlIZWFkZXI+DQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIgc29hcDphY3Rvcj0iaHR0cDovL2JhZEFjdG9yIj5CYWQ8L25zMTpteUhlYWRlcj4NCi0JCTwvc29hcDpIZWFkZXI+DQotIAkJPHNvYXA6Qm9keT4gDQotCQkJPG5zMjphZGROdW1iZXJzSGFuZGxlciB4bWxuczpuczI9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+DQotCQkJPG5zMjphcmcwPjEwPC9uczI6YXJnMD4NCi0JCQk8bnMyOmFyZzE+MTA8L25zMjphcmcxPg0KLQkJCTwvbnMyOmFkZE51bWJlcnNIYW5kbGVyPg0KLQkJPC9zb2FwOkJvZHk+DQotCTwvc29hcDpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDdkNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL3JlZmVyZW5jZXBhcmFtZXRlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iDQotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+DQotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4NCi0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjAxMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPg0KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+DQotICAgICAgICA8YXhpczI6UGFyYW1UaHJlZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPmFiY2RlZmc8L2F4aXMyOlBhcmFtVGhyZWU+DQotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4NCi0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pg0KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPg0KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPg0KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4NCi0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiDQotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+DQotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+DQotICAgIDwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94bWwvc29hcG1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveG1sL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5N2RhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94bWwvc29hcG1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0gDQotCTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLSANCi0JPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPg0KLSAJCTxzb2FwOkJvZHk+IA0KLQkJCTxuczI6aW52b2tlIHhtbG5zOm5zMj0iaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlIj48aW52b2tlX3N0cj5zb21lIHJlcXVlc3Q8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlPg0KLQkJPC9zb2FwOkJvZHk+DQotCTwvc29hcDpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvM0RTaGFwZS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvM0RTaGFwZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDRmZDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkLzNEU2hhcGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCXhtbG5zOnRuczE9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyINCi0JCXhtbG5zOnRucz0iaHR0cDovL3RocmVlZC5zaGFwZS50ZXN0Lm9yZyIgDQotCQl4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiAgamF4Yjp2ZXJzaW9uPSIyLjAiDQotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciPg0KLQkJDQotCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyINCi0JCQkgICAgc2NoZW1hTG9jYXRpb249InNoYXBlLnhzZCIgLz4NCi0JCQ0KLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUaHJlZURTcXVhcmUiPg0KLQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnMxOlNxdWFyZSI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYnJlZHRoIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpleHRlbnNpb24+DQotCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJDQotCQkNCi08L3hzZDpzY2hlbWE+CQkNCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvZWNoby54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvZWNoby54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOWFmZDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMNCi0gICAgIHVzZWQgYnkgdGhlIEpBWC1CIERpc3BhdGNoIHRlc3RzIC0tPg0KLTxzOnNjaGVtYSB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIA0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0Ij4NCi0gIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyI+DQotICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iaW5wdXQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgPC9zOmVsZW1lbnQ+DQotICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICA8L3M6Y29tcGxleFR5cGU+DQotICA8L3M6ZWxlbWVudD4NCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9ncmVldGVyVHlwZXMueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2dyZWV0ZXJUeXBlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzE4ODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2dyZWV0ZXJUeXBlcy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi90eXBlcyINCi0gICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLSAgICAgPGNvbXBsZXhUeXBlIG5hbWU9InRlc3RCZWFuIj4NCi0gICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRhdGExIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0YTIiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgIDwvY29tcGxleFR5cGU+DQotICAgICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzRmF1bHQyIj4NCi0gICAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmbGFnIiAgICBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgIDwvZWxlbWVudD4NCi0gICAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NGYXVsdDMiPg0KLSAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImZsYWciICAgIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgIDwvZWxlbWVudD4NCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvamF4YnNvdXJjZS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2QvamF4YnNvdXJjZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzE4ODEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL2pheGJzb3VyY2UueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzZDpzY2hlbWENCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnLnRlc3QuZGlzcGF0Y2guamF4YnNvdXJjZSINCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnLnRlc3QuZGlzcGF0Y2guamF4YnNvdXJjZSINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotCQkJDQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIj4NCi0JCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiDQotCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCTwveHNkOmVsZW1lbnQ+DQotCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2UiPg0KLQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlX3N0ciINCi0JCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJPC94c2Q6c2VxdWVuY2U+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JPC94c2Q6ZWxlbWVudD4NCi08L3hzZDpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NhbXBsZW10b20ueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NhbXBsZW10b20ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDdjYmE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zYW1wbGVtdG9tLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgeG1sbnM6dG5zPSJ1cm46Ly9tdG9tLnRlc3Qub3JnIg0KLSAgICB0YXJnZXROYW1lc3BhY2U9InVybjovL210b20udGVzdC5vcmciPg0KLSAgICA8IS0tIFVzZSBsb2NhbCBmaWxlIGZvciBzcGVlZCAtLT4NCi0gICAgPCEtLSA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIg0KLSAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiLz4tLT4NCi0gICAgPHhzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSINCi0gICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0ieG1sbWltZS54c2QiLz4NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkltYWdlRGVwb3QiPg0KLSAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9Im11bHRpcGFydC8qIi8+DQotICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2UiPg0KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+DQotICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ib3V0cHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kVGV4dCI+DQotICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuaWxsYWJsZT0iZmFsc2UiIG5hbWU9ImlucHV0IiANCi0gICAgICAgICAgICAgICAgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiB4bWltZTpleHBlY3RlZENvbnRlbnRUeXBlPSJ0ZXh0L3htbCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kVGV4dFJlc3BvbnNlIj4NCi0gICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJvdXRwdXQiIHR5cGU9InRuczpJbWFnZURlcG90Ii8+DQotICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0NCi08L3hzOnNjaGVtYT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGUueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NoYXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmYjIyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJeG1sbnM6dG5zPSJodHRwOi8vc2hhcGUudGVzdC5vcmciIA0KLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciPg0KLQkJDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNoYXBlIiBhYnN0cmFjdD0idHJ1ZSI+DQotCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9InhBeGlzIiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ5QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPg0KLQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkNCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3F1YXJlIiA+DQotCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOlNoYXBlIj4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0id2lkdGgiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkNCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2lyY2xlIiA+DQotCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOlNoYXBlIj4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJhZGl1cyIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpleHRlbnNpb24+DQotCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4JDQotCQkNCi08L3hzZDpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NoYXBlX3dyYXBwZXJzLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxY2U4MzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3NoYXBlX3dyYXBwZXJzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCXhtbG5zOnRucz0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciIA0KLQkJeG1sbnM6dG5zMT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyI+DQotCQkNCi0JCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQkJCSAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGUueHNkIiAvPg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhdzNEIj4NCi0JCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InRuczE6U2hhcGUiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJPC94c2Q6ZWxlbWVudD4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9ImRyYXciPg0KLQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0idG5zMTpTaGFwZSIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQk8L3hzZDplbGVtZW50Pg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhd1Jlc3BvbnNlIj4NCi0JCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ0bnMxOlNoYXBlIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCTwveHNkOmVsZW1lbnQ+DQotCQkNCi08L3hzZDpzY2hlbWE+CQkNCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc29hcDExLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zb2FwMTEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE1ZmUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zb2FwMTEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04JyA/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyINCi0gICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iID4NCi0NCi0gICAgIA0KLSAgPCEtLSBFbnZlbG9wZSwgaGVhZGVyIGFuZCBib2R5IC0tPg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRW52ZWxvcGUiIHR5cGU9InRuczpFbnZlbG9wZSIgLz4NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbnZlbG9wZSIgPg0KLSAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6SGVhZGVyIiBtaW5PY2N1cnM9IjAiIC8+DQotICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Qm9keSIgbWluT2NjdXJzPSIxIiAvPg0KLQ0KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4NCi0gICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9IkhlYWRlciIgdHlwZT0idG5zOkhlYWRlciIgLz4NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJIZWFkZXIiID4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4NCi0NCi0gICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiAvPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0gIA0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iQm9keSIgdHlwZT0idG5zOkJvZHkiIC8+DQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQm9keSIgPg0KLSAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9ImxheCIgLz4NCi0gICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjYW55IiBwcm9jZXNzQ29udGVudHM9ImxheCIgPg0KLQ0KLQkgIDx4czphbm5vdGF0aW9uPg0KLQkgICAgPHhzOmRvY3VtZW50YXRpb24+DQotCQkgIFByb3NlIGluIHRoZSBzcGVjIGRvZXMgbm90IHNwZWNpZnkgdGhhdCBhdHRyaWJ1dGVzIGFyZSBhbGxvd2VkIG9uIHRoZSBCb2R5IGVsZW1lbnQNCi0JCTwveHM6ZG9jdW1lbnRhdGlvbj4NCi0JICA8L3hzOmFubm90YXRpb24+DQotCTwveHM6YW55QXR0cmlidXRlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gICAgICAgDQotICA8IS0tIEdsb2JhbCBBdHRyaWJ1dGVzLiAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2FibGUgdmlhIHF1YWxpZmllZCBhdHRyaWJ1dGUgbmFtZXMgb24gYW55IGNvbXBsZXggdHlwZSByZWZlcmVuY2luZyB0aGVtLiAgLS0+DQotICA8eHM6YXR0cmlidXRlIG5hbWU9Im11c3RVbmRlcnN0YW5kIiA+CQ0KLSAgICAgPHhzOnNpbXBsZVR5cGU+DQotDQotICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0neHM6Ym9vbGVhbic+DQotCSAgIDx4czpwYXR0ZXJuIHZhbHVlPScwfDEnIC8+DQotCSA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgIDwveHM6c2ltcGxlVHlwZT4NCi0gIDwveHM6YXR0cmlidXRlPg0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhY3RvciIgdHlwZT0ieHM6YW55VVJJIiAvPg0KLQ0KLSAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgPg0KLSAgICA8eHM6YW5ub3RhdGlvbj4NCi0NCi0JICA8eHM6ZG9jdW1lbnRhdGlvbj4NCi0JICAgICdlbmNvZGluZ1N0eWxlJyBpbmRpY2F0ZXMgYW55IGNhbm9uaWNhbGl6YXRpb24gY29udmVudGlvbnMgZm9sbG93ZWQgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluaW5nIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlICdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLycgaW5kaWNhdGVzIHRoZSBwYXR0ZXJuIGRlc2NyaWJlZCBpbiBTT0FQIHNwZWNpZmljYXRpb24NCi0JICA8L3hzOmRvY3VtZW50YXRpb24+DQotCTwveHM6YW5ub3RhdGlvbj4NCi0gICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIgLz4NCi0gIDwveHM6c2ltcGxlVHlwZT4NCi0NCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmdTdHlsZSIgdHlwZT0idG5zOmVuY29kaW5nU3R5bGUiIC8+DQotICA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0iZW5jb2RpbmdTdHlsZSIgPg0KLSAgICA8eHM6YXR0cmlidXRlIHJlZj0idG5zOmVuY29kaW5nU3R5bGUiIC8+DQotDQotICA8L3hzOmF0dHJpYnV0ZUdyb3VwPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iRmF1bHQiIHR5cGU9InRuczpGYXVsdCIgLz4NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJGYXVsdCIgZmluYWw9ImV4dGVuc2lvbiIgPg0KLSAgICA8eHM6YW5ub3RhdGlvbj4NCi0JICA8eHM6ZG9jdW1lbnRhdGlvbj4NCi0JICAgIEZhdWx0IHJlcG9ydGluZyBzdHJ1Y3R1cmUNCi0JICA8L3hzOmRvY3VtZW50YXRpb24+DQotCTwveHM6YW5ub3RhdGlvbj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLQ0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImZhdWx0Y29kZSIgdHlwZT0ieHM6UU5hbWUiIC8+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHRzdHJpbmciIHR5cGU9InhzOnN0cmluZyIgLz4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJmYXVsdGFjdG9yIiB0eXBlPSJ4czphbnlVUkkiIG1pbk9jY3Vycz0iMCIgLz4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXRhaWwiIHR5cGU9InRuczpkZXRhaWwiIG1pbk9jY3Vycz0iMCIgLz4gICAgICANCi0gICAgPC94czpzZXF1ZW5jZT4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZGV0YWlsIj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI2FueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+DQotDQotICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIC8+IA0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi08L3hzOnNjaGVtYT4NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2sxLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzI3M2IzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMgZm9yIHRoZSBKQVhCV3JhcHBlclRlc3RzIC0tPg0KLTxzOnNjaGVtYSB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9zdG9jazEudGVzdC5vcmciDQotCXhtbG5zOnRucz0idXJuOi8vc3RvY2sxLnRlc3Qub3JnIiA+DQotCTxzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2UiIHR5cGU9InRuczpnZXRQcmljZSIgLz4NCi0JPHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0UHJpY2UiPg0KLSAgICAgIDxzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgICAgPHM6cmVzdHJpY3Rpb24gYmFzZT0iczphbnlUeXBlIj4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJmdW5kIiB0eXBlPSJzOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iaG9sZGluZ3MuIiB0eXBlPSJzOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ibmF2IiB0eXBlPSJzOnN0cmluZyIvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6cmVzdHJpY3Rpb24+DQotICAgICAgPC9zOmNvbXBsZXhDb250ZW50Pg0KLSAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgIA0KLSAgICA8czplbGVtZW50IG5hbWU9ImdldFByaWNlUmVzcG9uc2UiIHR5cGU9InRuczpTdG9ja1ByaWNlIiAvPg0KLQk8czpjb21wbGV4VHlwZSBuYW1lPSJTdG9ja1ByaWNlIj4NCi0gICAgICA8czpjb21wbGV4Q29udGVudD4NCi0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpyZXN0cmljdGlvbj4NCi0gICAgICA8L3M6Y29tcGxleENvbnRlbnQ+DQotICAgIDwvczpjb21wbGV4VHlwZT4NCi08L3M6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazIueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3N0b2NrMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTQ2MzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3N0b2NrMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tIFRoaXMgc2NoZW1hIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEpBWC1CIGFydGlmYWN0cyBmb3IgdGhlIEpBWEJXcmFwcGVyVGVzdHMtLT4NCi08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCXRhcmdldE5hbWVzcGFjZT0idXJuOi8vc3RvY2syLnRlc3Qub3JnIg0KLQl4bWxuczp0bnM9InVybjovL3N0b2NrMi50ZXN0Lm9yZyIgPg0KLQk8czplbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6Z2V0UHJpY2UiIC8+DQotCTxzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFByaWNlIj4NCi0gICAgICA8czpjb21wbGV4Q29udGVudD4NCi0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiB0eXBlPSJzOnN0cmluZyIvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6cmVzdHJpY3Rpb24+DQotICAgICAgPC9zOmNvbXBsZXhDb250ZW50Pg0KLSAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgIA0KLSAgICA8czplbGVtZW50IG5hbWU9ImdldFByaWNlUmVzcG9uc2UiIHR5cGU9InRuczpTdG9ja1ByaWNlIi8+DQotCTxzOmNvbXBsZXhUeXBlIG5hbWU9IlN0b2NrUHJpY2UiPg0KLSAgICAgIDxzOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgICAgPHM6cmVzdHJpY3Rpb24gYmFzZT0iczphbnlUeXBlIj4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0iczpzdHJpbmciLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPg0KLSAgICAgIDwvczpjb21wbGV4Q29udGVudD4NCi0gICAgPC9zOmNvbXBsZXhUeXBlPg0KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3htbG1pbWUueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC1yZXNvdXJjZXMveHNkL3htbG1pbWUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzcyMzhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3QtcmVzb3VyY2VzL3hzZC94bWxtaW1lLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotICAgVzNDIFhNTCBTY2hlbWEgZGVmaW5lZCBpbiB0aGUgRGVzY3JpYmluZyBNZWRpYSBDb250ZW50IG9mIEJpbmFyeSBEYXRhIGluIFhNTA0KLSAgIHNwZWNpZmljYXRpb24NCi0gICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1tZWRpYS10eXBlcw0KLQ0KLSAgIENvcHlyaWdodCAoQykgMjAwNSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLA0KLSAgDQotICAgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEV1cm9wZWFuIFJlc2VhcmNoIENvbnNvcnRpdW0gZm9yDQotICAgSW5mb3JtYXRpY3MgYW5kIE1hdGhlbWF0aWNzLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzDQotICAgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVzNDKFIpIFNvZnR3YXJlIExpY2Vuc2UgWzFdIGluIHRoZSBob3BlIHRoYXQNCi0gICBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQNCi0gICB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuDQotICANCi0gICBbMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQ0KLQ0KLSAgICRJZDogeG1sbWltZS54c2QsdiAxLjEgMjAwNS8wNC8yNSAxNzowODozNSBodWdvIEV4cCAkDQotLS0+DQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIg0KLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiID4NCi0NCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiPg0KLSAgICA8eHM6c2ltcGxlVHlwZT4NCi0gICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIiA+DQotICAgICAgPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMyIgLz4NCi0gICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOnNpbXBsZVR5cGU+DQotICA8L3hzOmF0dHJpYnV0ZT4NCi0NCi0gIDx4czphdHRyaWJ1dGUgbmFtZT0iZXhwZWN0ZWRDb250ZW50VHlwZXMiIHR5cGU9InhzOnN0cmluZyIgLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJiYXNlNjRCaW5hcnkiID4NCi0gICAgPHhzOnNpbXBsZUNvbnRlbnQ+DQotICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmJhc2U2NEJpbmFyeSIgPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4NCi0gICAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KLSAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImhleEJpbmFyeSIgPg0KLSAgICA8eHM6c2ltcGxlQ29udGVudD4NCi0gICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6aGV4QmluYXJ5IiA+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InhtaW1lOmNvbnRlbnRUeXBlIiAvPg0KLSAgICAgICAgPC94czpleHRlbnNpb24+DQotICAgIDwveHM6c2ltcGxlQ29udGVudD4NCi0gIDwveHM6Y29tcGxleFR5cGU+DQotDQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWNhZTYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS42LjUNCi1DcmVhdGVkLUJ5OiAyLjMgKElCTSBDb3Jwb3JhdGlvbikNCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMjliZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNlcnZpY2VHcm91cD4NCi0gPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPg0KLSAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiIGNsYXNzPSJzZXJ2ZXIuRWNob1NlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dCIvPg0KLSAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLSAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNlcnZlci5FY2hvU2VydmljZVNrZWxldG9uPC9wYXJhbWV0ZXI+DQotICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+DQotICAgIDxhY3Rpb25NYXBwaW5nLz4NCi0gIDwvb3BlcmF0aW9uPg0KLSA8L3NlcnZpY2U+DQotPC9zZXJ2aWNlR3JvdXA+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL1Rlc3RMb2dnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9UZXN0TG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTQ3Y2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL1Rlc3RMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3M7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdExvZ2dlciB7DQotICAgIC8vIEp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdGhpcyBzaGFyZWQgbG9nZ2VyIG9iamVjdA0KLSAgICBwdWJsaWMgc3RhdGljIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5LmdldExvZygiSkFYV1MtVGVzdHMiKTsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvQW55VHlwZU1lc3NhZ2VQb3J0VHlwZUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL0FueVR5cGVNZXNzYWdlUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGE0YjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvQW55VHlwZU1lc3NhZ2VQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hbnl0eXBlLnNlaS5BbnlUeXBlTWVzc2FnZVBvcnRUeXBlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iQW55VHlwZU1lc3NhZ2VTZXJ2aWNlIiwNCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FueXR5cGUudGVzdC5vcmciLA0KLQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZS5zZWkuQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSIpDQotcHVibGljIGNsYXNzIEFueVR5cGVNZXNzYWdlUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgQW55VHlwZU1lc3NhZ2VQb3J0VHlwZSB7DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGUuc2VpLkFueVR5cGVNZXNzYWdlUG9ydFR5cGUjZWNob01lc3NhZ2UoamF2YS5sYW5nLk9iamVjdCkNCi0JICovDQotCXB1YmxpYyBPYmplY3QgZWNob01lc3NhZ2UoT2JqZWN0IHJlcXVlc3QpIHsNCi0JCU9iamVjdCByZXNwb25zZSA9IG5ldyBTdHJpbmcoIlJlcXVlc3QgUmVjZWl2ZWQsIFRoaXMgaXMgUmVzcG9uc2UgZnJvbSBTZXJ2ZXIiKTsNCi0JCXJldHVybiByZXNwb25zZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9NRVRBLUlORi9BbnlUeXBlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9NRVRBLUlORi9BbnlUeXBlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTVlZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvTUVUQS1JTkYvQW55VHlwZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIg0KLSAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0gICA8dHlwZXM+DQotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyINCi0gICAgICAgICB4bWxuczp0cz0iaHR0cDovL2FueXR5cGUudGVzdC5vcmcveHNkIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOmFueVR5cGUiLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotDQotICAgICAgPC94c2Q6c2NoZW1hPg0KLSAgIDwvdHlwZXM+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJBbnlUeXBlTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IkFueVR5cGVNZXNzYWdlU2VydmljZSI+DQotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkFueVR5cGVNZXNzYWdlQmluZGluZyIgbmFtZT0iQW55VHlwZVBvcnQiPg0KLSAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9BbnlUeXBlTWVzc2FnZVNlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotDQotICAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvc2VpL0FueVR5cGVNZXNzYWdlUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3NlaS9BbnlUeXBlTWVzc2FnZVBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZTI5MDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvc2VpL0FueVR5cGVNZXNzYWdlUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZS5zZWk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIikNCi1wdWJsaWMgaW50ZXJmYWNlIEFueVR5cGVNZXNzYWdlUG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLk9iamVjdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2FueXR5cGUudGVzdC5vcmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9NZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFueXR5cGUuRWNob01lc3NhZ2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvTWVzc2FnZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFueXR5cGUuRWNob01lc3NhZ2VSZXNwb25zZSIpDQotICAgIHB1YmxpYyBPYmplY3QgZWNob01lc3NhZ2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hbnl0eXBlLnRlc3Qub3JnIikNCi0gICAgICAgIE9iamVjdCByZXF1ZXN0KTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvc2VpL0FueVR5cGVNZXNzYWdlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FueXR5cGUvc2VpL0FueVR5cGVNZXNzYWdlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEyOGIwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3NlaS9BbnlUeXBlTWVzc2FnZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZS5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFueVR5cGVNZXNzYWdlU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJBbnlUeXBlLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBBbnlUeXBlTWVzc2FnZVNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQU5ZVFlQRU1FU1NBR0VTRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS9NRVRBLUlORi9BbnlUeXBlLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCXRyeXsNCi0JICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBBTllUWVBFTUVTU0FHRVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQW55VHlwZU1lc3NhZ2VTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQW55VHlwZU1lc3NhZ2VTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoQU5ZVFlQRU1FU1NBR0VTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL2FueXR5cGUudGVzdC5vcmciLCAiQW55VHlwZU1lc3NhZ2VTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBBbnlUeXBlTWVzc2FnZVBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJBbnlUeXBlUG9ydCIpDQotICAgIHB1YmxpYyBBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIGdldEFueVR5cGVQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChBbnlUeXBlTWVzc2FnZVBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vYW55dHlwZS50ZXN0Lm9yZyIsICJBbnlUeXBlUG9ydCIpLCBBbnlUeXBlTWVzc2FnZVBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYW55dHlwZS90ZXN0cy9BbnlUeXBlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3Rlc3RzL0FueVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzU5NTM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hbnl0eXBlL3Rlc3RzL0FueVR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hbnl0eXBlLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFueXR5cGUuc2VpLkFueVR5cGVNZXNzYWdlUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYW55dHlwZS5zZWkuQW55VHlwZU1lc3NhZ2VTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbnlUeXBlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgDQotCVN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FueVR5cGVNZXNzYWdlU2VydmljZS5BbnlUeXBlTWVzc2FnZVBvcnRUeXBlSW1wbFBvcnQiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFueVR5cGVUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlUeXBlRWxlbWVudGluV3JhcHBlZFdTREwoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJ1biB0ZXN0IGEgZmV3IHRpbWVzIHRvIGVuc3VyZSBjb3JyZWN0IA0KLSAgICAgICAgX3Rlc3RBbnlUeXBlRWxlbWVudGluV3JhcHBlZFdTREwoKTsNCi0gICAgICAgIF90ZXN0QW55VHlwZUVsZW1lbnRpbldyYXBwZWRXU0RMKCk7DQotICAgICAgICBfdGVzdEFueVR5cGVFbGVtZW50aW5XcmFwcGVkV1NETCgpOw0KLSAgICAgICAgDQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgX3Rlc3RBbnlUeXBlRWxlbWVudGluV3JhcHBlZFdTREwoKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBBbnlUeXBlTWVzc2FnZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBBbnlUeXBlTWVzc2FnZVNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBbnlUeXBlTWVzc2FnZVBvcnRUeXBlIHBvcnRUeXBlID0gc2VydmljZS5nZXRBbnlUeXBlUG9ydCgpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydFR5cGU7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgcmVxID0gbmV3IFN0cmluZygiUmVxdWVzdCBhcyBTdHJpbmciKTsNCi0gICAgICAgICAgICBPYmplY3QgcmVzcG9uc2UgPSBwb3J0VHlwZS5lY2hvTWVzc2FnZShyZXEpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgaW5zdGFuY2VvZiBTdHJpbmcpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm94eVNvYXBBY3Rpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3h5U29hcEFjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhMTJkMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3h5U29hcEFjdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5zb2FwYWN0aW9uLkJvb2tTdG9yZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5Cb29rU3RvcmVTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIEEgc3VpdGUgb2YgU09BUEFjdGlvbiByZWxhdGVkIHRlc3RzIGZvciB0aGUgZHluYW1pYyBwcm94eSBjbGllbnQgDQotICovDQotcHVibGljIGNsYXNzIFByb3h5U29hcEFjdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShQcm94eVNvYXBBY3Rpb25UZXN0LmNsYXNzKSk7DQotICAgIH0NCi0gICAgICAgIA0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFJlcXVlc3RXaXRoU29hcEFjdGlvbigpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICBCb29rU3RvcmVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQm9va1N0b3JlU2VydmljZSgpOw0KLSAgICAgICAgQm9va1N0b3JlIGJzID0gc2VydmljZS5nZXRCb29rU3RvcmVQb3J0KCk7DQotICAgICAgICANCi0gICAgICAgIGZsb2F0IHByaWNlID0gYnMuZ2V0UHJpY2VXaXRoQWN0aW9uKCJ0ZXN0IGl0ZW0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJyZXR1cm4gdmFsdWUgWyIgKyBwcmljZSArICJdIik7DQotICAgICAgICAvL2Fzc2VydFRydWUoIlRoZSByZXR1cm4gdmFsdWUgd2FzIGludmFsaWQiLCBwcmljZSA+IDApOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9Cb29rU3RvcmUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9Cb29rU3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NmZhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vQm9va1N0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5zb2FwYWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIkJvb2tTdG9yZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIpDQotcHVibGljIGludGVyZmFjZSBCb29rU3RvcmUgew0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpdGVtDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmxvYXQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInByaWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJnZXRQcmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5zb2FwYWN0aW9uLkdldFByaWNlVHlwZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5HZXRQcmljZVJlc3BvbnNlVHlwZSIpDQotICAgIHB1YmxpYyBmbG9hdCBnZXRQcmljZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIml0ZW0iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iKQ0KLSAgICAgICAgU3RyaW5nIGl0ZW0pOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpdGVtDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmxvYXQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uL2dldFByaWNlIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInByaWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJnZXRQcmljZVdpdGhBY3Rpb24iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5HZXRQcmljZVR5cGUiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJnZXRQcmljZVdpdGhBY3Rpb25SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5zb2FwYWN0aW9uLkdldFByaWNlUmVzcG9uc2VUeXBlIikNCi0gICAgcHVibGljIGZsb2F0IGdldFByaWNlV2l0aEFjdGlvbigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIml0ZW0iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iKQ0KLSAgICAgICAgU3RyaW5nIGl0ZW0pOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpdGVtDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgaW50DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJpbnZlbnRvcnkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBwYXJ0TmFtZSA9ICJpbnZlbnRvcnkiKQ0KLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLSAgICBwdWJsaWMgaW50IGdldEludmVudG9yeSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIml0ZW0iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBwYXJ0TmFtZSA9ICJpdGVtIikNCi0gICAgICAgIFN0cmluZyBpdGVtKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaXRlbQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGludA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24vZ2V0SW52ZW50b3J5IikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImludmVudG9yeVdpdGhBY3Rpb24iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCBwYXJ0TmFtZSA9ICJpbnZlbnRvcnkiKQ0KLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLSAgICBwdWJsaWMgaW50IGdldEludmVudG9yeVdpdGhBY3Rpb24oDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpdGVtV2l0aEFjdGlvbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiIsIHBhcnROYW1lID0gIml0ZW0iKQ0KLSAgICAgICAgU3RyaW5nIGl0ZW0pOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vQm9va1N0b3JlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL0Jvb2tTdG9yZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZWJiNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vQm9va1N0b3JlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJCb29rU3RvcmVTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgd3NkbExvY2F0aW9uID0gIlNPQVBBY3Rpb25UZXN0LndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBCb29rU3RvcmVTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJMIEJPT0tTVE9SRVNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3RhcmdldC90ZXN0LWNsYXNzZXMvc2VydmljZXMvQm9va1N0b3JlU2VydmljZS9NRVRBLUlORi9TT0FQQWN0aW9uVGVzdC53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQk9PS1NUT1JFU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQm9va1N0b3JlU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJvb2tTdG9yZVNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihCT09LU1RPUkVTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCAiQm9va1N0b3JlU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgQm9va1N0b3JlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJCb29rU3RvcmVQb3J0IikNCi0gICAgcHVibGljIEJvb2tTdG9yZSBnZXRCb29rU3RvcmVQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChCb29rU3RvcmUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgIkJvb2tTdG9yZVBvcnQiKSwgQm9va1N0b3JlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL01FVEEtSU5GL1NPQVBBY3Rpb25UZXN0LndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL01FVEEtSU5GL1NPQVBBY3Rpb25UZXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMGM2M2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9zb2FwYWN0aW9uL3NlcnZlci9NRVRBLUlORi9TT0FQQWN0aW9uVGVzdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiINCi0gICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iDQotICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbiINCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJHZXRQcmljZVR5cGUiPg0KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpdGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJHZXRQcmljZVJlc3BvbnNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4NCi0gICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0UHJpY2UiIHR5cGU9InRuczpHZXRQcmljZVR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIiB0eXBlPSJ0bnM6R2V0UHJpY2VSZXNwb25zZVR5cGUiLz4NCi0gICANCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRQcmljZVdpdGhBY3Rpb24iIHR5cGU9InRuczpHZXRQcmljZVR5cGUiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJnZXRQcmljZVdpdGhBY3Rpb25SZXNwb25zZSIgdHlwZT0idG5zOkdldFByaWNlUmVzcG9uc2VUeXBlIi8+DQotDQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImludmVudG9yeSIgdHlwZT0ieHNkOmludCIvPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9Iml0ZW1XaXRoQWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW52ZW50b3J5V2l0aEFjdGlvbiIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgIDwveHNkOnNjaGVtYT4NCi0gICA8L3R5cGVzPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldFByaWNlUmVxdWVzdCI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFByaWNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldFByaWNlUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpnZXRQcmljZVJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLSAgDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VXaXRoQWN0aW9uUmVxdWVzdCI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFByaWNlV2l0aEFjdGlvbiIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRQcmljZVdpdGhBY3Rpb25SZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFByaWNlV2l0aEFjdGlvblJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLSANCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRJbnZlbnRvcnlSZXF1ZXN0Ij4NCi0gICAgICA8cGFydCBuYW1lPSJpdGVtIiBlbGVtZW50PSJ0bnM6aXRlbSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0gICANCi0gICA8bWVzc2FnZSBuYW1lPSJnZXRJbnZlbnRvcnlSZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0iaW52ZW50b3J5IiBlbGVtZW50PSJ0bnM6aW52ZW50b3J5Ii8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImdldEludmVudG9yeVdpdGhBY3Rpb25SZXF1ZXN0Ij4NCi0gICAgICA8cGFydCBuYW1lPSJpdGVtIiBlbGVtZW50PSJ0bnM6aXRlbVdpdGhBY3Rpb24iLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZ2V0SW52ZW50b3J5V2l0aEFjdGlvblJlc3BvbnNlIj4NCi0gICAgICA8cGFydCBuYW1lPSJpbnZlbnRvcnkiIGVsZW1lbnQ9InRuczppbnZlbnRvcnlXaXRoQWN0aW9uIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgIDxwb3J0VHlwZSBuYW1lPSJCb29rU3RvcmUiPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0UHJpY2VSZXF1ZXN0IiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmdldFByaWNlUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZVdpdGhBY3Rpb24iPg0KLSAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0UHJpY2VXaXRoQWN0aW9uUmVxdWVzdCIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRQcmljZVdpdGhBY3Rpb25SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldEludmVudG9yeSI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpnZXRJbnZlbnRvcnlSZXF1ZXN0IiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmdldEludmVudG9yeVJlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0SW52ZW50b3J5V2l0aEFjdGlvbiI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpnZXRJbnZlbnRvcnlXaXRoQWN0aW9uUmVxdWVzdCIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRJbnZlbnRvcnlXaXRoQWN0aW9uUmVzcG9uc2UiIC8+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9wb3J0VHlwZT4NCi0NCi0gICA8YmluZGluZyBuYW1lPSJCb29rU3RvcmVCaW5kaW5nIiB0eXBlPSJ0bnM6Qm9va1N0b3JlIj4NCi0gICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZVdpdGhBY3Rpb24iPg0KLSAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9jbGllbnQvc29hcGFjdGlvbi9nZXRQcmljZSIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0SW52ZW50b3J5Ij4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRJbnZlbnRvcnlXaXRoQWN0aW9uIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24vZ2V0SW52ZW50b3J5Ii8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IkJvb2tTdG9yZVNlcnZpY2UiPg0KLSAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpCb29rU3RvcmVCaW5kaW5nIiBuYW1lPSJCb29rU3RvcmVQb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQm9va1N0b3JlU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0gICA8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2VmOWNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9zZXJ2ZXIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNlcnZpY2VHcm91cD4NCi0gPHNlcnZpY2UgbmFtZT0iQm9va1N0b3JlU2VydmljZSI+DQotICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIgDQotICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5zb2FwYWN0aW9uLnNlcnZlci5TT0FQQWN0aW9uVGVzdHNNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0gPC9zZXJ2aWNlPg0KLTwvc2VydmljZUdyb3VwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9zZXJ2ZXIvU09BUEFjdGlvblRlc3RzTWVzc2FnZVJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3NvYXBhY3Rpb24vc2VydmVyL1NPQVBBY3Rpb25UZXN0c01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGZkZTNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvc29hcGFjdGlvbi9zZXJ2ZXIvU09BUEFjdGlvblRlc3RzTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuc29hcGFjdGlvbi5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWVzc2FnZUNvbnRleHRCdWlsZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogVGhpcyBNZXNzYWdlUmVjZWl2ZXIgaXMgdXNlZCBmb3IgYSBzZXJpZXMgb2YgdGVzdHMgcmVsYXRpbmcgdG8gdGhlDQotICogU09BUCBhY3Rpb24uICBUaGlzIGlzIG1vc3RseSBmb3IgdGVzdGluZyB0aGF0IHRoZSBjb3JyZWN0IG9wZXJhdGlvbg0KLSAqIHdhcyByZXNvbHZlZCBiYXNlZCBvbiB0aGUgU09BUCBhY3Rpb24gdGhhdCB3YXMgc2VudCBieSB0aGUgY2xpZW50LiAgDQotICovDQotcHVibGljIGNsYXNzIFNPQVBBY3Rpb25UZXN0c01lc3NhZ2VSZWNlaXZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWNlaXZlciB7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltzZXJ2ZXJdIFNPQVBBY3Rpb25UZXN0c01lc3NhZ2VSZWNlaXZlcjogbmV3IHJlcXVlc3QgcmVjZWl2ZWQiKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHJlcXVlc3QuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSByZXF1ZXN0IG1lc3NhZ2UgWyIgKyBlbnYgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQNCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IGVudi5nZXRCb2R5KCkuZ2V0Q2hpbGRFbGVtZW50cygpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudCkgaXRyLm5leHQoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgZW52ZWxvcGUgZm9yIHRoZSByZXNwb25zZQ0KLSAgICAgICAgU09BUEZhY3Rvcnkgc2YgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7DQotICAgICAgICBTT0FQRW52ZWxvcGUgcmVzcG9uc2VFbnYgPSBzZi5jcmVhdGVTT0FQRW52ZWxvcGUoKTsNCi0gICAgICAgIHNmLmNyZWF0ZVNPQVBCb2R5KHJlc3BvbnNlRW52KTsNCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZUJvZHlDb250ZW50ID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIHdoaWNoIG9wZXJhdGlvbiB3YXMgaW52b2tlZCBhbmQgdGhlbiB2YWxpZGF0ZSB0aGUgY29udGVudHMgDQotICAgICAgICAvLyBvZiB0aGUgcmVxdWVzdCAocmVzb2x2ZWQgQXhpc09wZXJhdGlvbiBhbmQgdGhlIHNvYXAgYWN0aW9uKSB0byBzZWUgaWYgdGhleSBhcmUgY29ycmVjdC4NCi0gICAgICAgIFN0cmluZyBuYW1lID0gY2hpbGQuZ2V0TG9jYWxOYW1lKCk7DQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoImdldFByaWNlIikpIHsNCi0gICAgICAgICAgICBmbG9hdCBzdGF0dXMgPSAwOw0KLSAgICAgICAgICAgIGlmIChjaGVja09wZXJhdGlvbigiZ2V0UHJpY2UiLCByZXF1ZXN0KSAmJg0KLSAgICAgICAgICAgICAgICBjaGVja1NPQVBBY3Rpb24oIiIsIHJlcXVlc3QpKSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBhbGwgY2hlY2tzIHBhc3NlZCIpOw0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltzZXJ2ZXJdIHNvbWUgY2hlY2tzIGZhaWxlZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXNwb25zZUJvZHlDb250ZW50ID0gc2YuY3JlYXRlT01FbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24iLCAiZ2V0UHJpY2VXaXRoQWN0aW9uUmVzcG9uc2UiKSwgcmVzcG9uc2VFbnYuZ2V0Qm9keSgpKTsNCi0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlbSA9IHNmLmNyZWF0ZU9NRWxlbWVudChuZXcgUU5hbWUoIiIsICJwcmljZSIpLCByZXNwb25zZUJvZHlDb250ZW50KTsNCi0gICAgICAgICAgICBPTVRleHQgdGV4dCA9IHNmLmNyZWF0ZU9NVGV4dChGbG9hdC50b1N0cmluZyhzdGF0dXMpKTsNCi0gICAgICAgICAgICBlbGVtLmFkZENoaWxkKHRleHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAobmFtZS5lcXVhbHMoImdldFByaWNlV2l0aEFjdGlvbiIpKSB7DQotICAgICAgICAgICAgZmxvYXQgc3RhdHVzID0gMDsNCi0gICAgICAgICAgICBpZiAoY2hlY2tPcGVyYXRpb24oImdldFByaWNlV2l0aEFjdGlvbiIsIHJlcXVlc3QpICYmDQotICAgICAgICAgICAgICAgIGNoZWNrU09BUEFjdGlvbigiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvY2xpZW50L3NvYXBhY3Rpb24vZ2V0UHJpY2UiLCByZXF1ZXN0KSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gYWxsIGNoZWNrcyBwYXNzZWQiKTsNCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gMTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBzb21lIGNoZWNrcyBmYWlsZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmVzcG9uc2VCb2R5Q29udGVudCA9IHNmLmNyZWF0ZU9NRWxlbWVudChuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uIiwgImdldFByaWNlV2l0aEFjdGlvblJlc3BvbnNlIiksIHJlc3BvbnNlRW52LmdldEJvZHkoKSk7DQotICAgICAgICAgICAgT01FbGVtZW50IGVsZW0gPSBzZi5jcmVhdGVPTUVsZW1lbnQobmV3IFFOYW1lKCIiLCAicHJpY2UiKSwgcmVzcG9uc2VCb2R5Q29udGVudCk7DQotICAgICAgICAgICAgT01UZXh0IHRleHQgPSBzZi5jcmVhdGVPTVRleHQoRmxvYXQudG9TdHJpbmcoc3RhdHVzKSk7DQotICAgICAgICAgICAgZWxlbS5hZGRDaGlsZCh0ZXh0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoNCi0gICAgICAgIGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJpdGVtIikpIHsNCi0gICAgICAgICAgICBpZiAoY2hlY2tPcGVyYXRpb24oImdldEludmVudG9yeSIsIHJlcXVlc3QpICYmDQotICAgICAgICAgICAgICAgIGNoZWNrU09BUEFjdGlvbigiIiwgcmVxdWVzdCkpIHsNCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gU1RBVFVTX1BBU1M7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAobmFtZS5lcXVhbHMoIml0ZW1XaXRoQWN0aW9uIikpIHsNCi0gICAgICAgICAgICBpZiAoY2hlY2tPcGVyYXRpb24oImdldEludmVudG9yeVdpdGhBY3Rpb24iLCByZXF1ZXN0KSAmJg0KLSAgICAgICAgICAgICAgICBjaGVja1NPQVBBY3Rpb24oImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL2NsaWVudC9zb2FwYWN0aW9uL2dldEludmVudG9yeSIsIHJlcXVlc3QpKSB7DQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFNUQVRVU19QQVNTOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgICovDQotICAgICAgICANCi0gICAgICAgIC8vIEZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBhbmQgc2VuZCBpdCBiYWNrDQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jcmVhdGVPdXRNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlRW52LmdldEJvZHkoKS5hZGRDaGlsZChyZXNwb25zZUJvZHlDb250ZW50KTsNCi0gICAgICAgIHJlc3BvbnNlLnNldEVudmVsb3BlKHJlc3BvbnNlRW52KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSByZXNwb25zZSBtZXNzYWdlIFsiICsgcmVzcG9uc2VFbnYudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlLmdldE9wZXJhdGlvbkNvbnRleHQoKS5hZGRNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7DQotICAgICAgICBBeGlzRW5naW5lLnNlbmQocmVzcG9uc2UpOyAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogVmVyaWZ5IHRoYXQgdGhlIEF4aXNPcGVyYXRpb24gb24gdGhlIE1lc3NhZ2VDb250ZXh0IGlzIHRoZSANCi0gICAgICogb25lIHRoYXQgd2Ugd2VyZSBleHBlY3RpbmcgYmFzZWQgb24gdGhlIHJlcXVlc3QuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPcGVyYXRpb24oU3RyaW5nIGV4cGVjdGVkT3BlcmF0aW9uTmFtZSwgTWVzc2FnZUNvbnRleHQgbWMpIHsNCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBtYy5nZXRBeGlzT3BlcmF0aW9uKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gY2hlY2tpbmcgZXhwZWN0ZWQgb3BlcmF0aW9uIFsiICsgZXhwZWN0ZWRPcGVyYXRpb25OYW1lICsNCi0gICAgICAgICAgICAgICAgIl0gYWdhaW5zdCByZXNvbHZlZCBvcGVyYXRpb24gWyIgKyBvcC5nZXROYW1lKCkgKyAiXSIpOw0KLSAgICAgICAgaWYgKG9wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoZXhwZWN0ZWRPcGVyYXRpb25OYW1lKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBvcGVyYXRpb24gbmFtZSBpcyBjb3JyZWN0Iik7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gb3BlcmF0aW9uIG5hbWUgaXMgaW5jb3JyZWN0Iik7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBWZXJpZnkgdGhhdCB0aGUgU09BUEFjdGlvbiBwcmVzZW50IG9uIHRoZSBNZXNzYWdlQ29udGV4dCBpcw0KLSAgICAgKiB0aGUgb25lIHRoYXQgd2Ugd2VyZSBleHBlY3RpbmcgYmFzZWQgb24gdGhlIHJlcXVlc3QuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTT0FQQWN0aW9uKFN0cmluZyBleHBlY3RlZEFjdGlvbiwgTWVzc2FnZUNvbnRleHQgbWMpIHsNCi0gICAgICAgU3RyaW5nIGFjdGlvbiA9IG1jLmdldFNvYXBBY3Rpb24oKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBjaGVja2luZyBleHBlY3RlZCBhY3Rpb24gWyIgKyBleHBlY3RlZEFjdGlvbiArDQotICAgICAgICAgICAgICAgICJdIGFnYWluc3QgcmVjZWl2ZWQgYWN0aW9uIFsiICsgYWN0aW9uICsgIl0iKTsNCi0gICAgICAgaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5lcXVhbHMoZXhwZWN0ZWRBY3Rpb24pKSB7DQotICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3NlcnZlcl0gc29hcCBhY3Rpb24gaXMgY29ycmVjdCIpOw0KLSAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgIH0gICAgICAgICAgIA0KLSAgICAgICBlbHNlIHsNCi0gICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbc2VydmVyXSBzb2FwIGFjdGlvbiBpcyBpbmNvcnJlY3QiKTsNCi0gICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgfSAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L01FVEEtSU5GL01lc3NhZ2VDb250ZXh0LndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9NRVRBLUlORi9NZXNzYWdlQ29udGV4dC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTcwNTdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L01FVEEtSU5GL01lc3NhZ2VDb250ZXh0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vY29udGV4dC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIgbmFtZT0iTWVzc2FnZUNvbnRleHRTZXJ2aWNlIj4NCi0gICAgPHR5cGVzPg0KLSAgICAgICAgPHhzOnNjaGVtYSB4bWxuczp0bnM9Imh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iIHZlcnNpb249IjEuMCI+DQotICAgICAgICAgICAgPCEtLSByZWFkIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IC0tPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InByb3BlcnR5TmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzRm91bmQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC94czplbGVtZW50Pg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icHJvcGVydHlOYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXNGb3VuZCIgdHlwZT0ieHM6Ym9vbGVhbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+DQotICAgICAgICA8L3hzOnNjaGVtYT4NCi0gICAgPC90eXBlcz4NCi0gICAgPG1lc3NhZ2UgbmFtZT0iaXNQcm9wZXJ0eVByZXNlbnQiPg0KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmlzUHJvcGVydHlQcmVzZW50Ii8+DQotICAgIDwvbWVzc2FnZT4NCi0gICAgPG1lc3NhZ2UgbmFtZT0iaXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSI+DQotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6aXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSIvPg0KLSAgICA8L21lc3NhZ2U+DQotICAgIDxwb3J0VHlwZSBuYW1lPSJNZXNzYWdlQ29udGV4dCI+DQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImlzUHJvcGVydHlQcmVzZW50Ij4NCi0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmlzUHJvcGVydHlQcmVzZW50Ii8+DQotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6aXNQcm9wZXJ0eVByZXNlbnRSZXNwb25zZSIvPg0KLSAgICAgICAgPC9vcGVyYXRpb24+DQotICAgIDwvcG9ydFR5cGU+DQotICAgIDxiaW5kaW5nIG5hbWU9Ik1lc3NhZ2VDb250ZXh0UG9ydEJpbmRpbmciIHR5cGU9InRuczpNZXNzYWdlQ29udGV4dCI+DQotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iaXNQcm9wZXJ0eVByZXNlbnQiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbi8+DQotICAgICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvaW5wdXQ+DQotICAgICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L291dHB1dD4NCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8L2JpbmRpbmc+DQotICAgIDxzZXJ2aWNlIG5hbWU9Ik1lc3NhZ2VDb250ZXh0U2VydmljZSI+DQotICAgICAgICA8cG9ydCBuYW1lPSJNZXNzYWdlQ29udGV4dFBvcnQiIGJpbmRpbmc9InRuczpNZXNzYWdlQ29udGV4dFBvcnRCaW5kaW5nIj4NCi0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvTWVzc2FnZUNvbnRleHRTZXJ2aWNlIi8+DQotICAgICAgICA8L3BvcnQ+DQotICAgIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L01lc3NhZ2VDb250ZXh0SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvTWVzc2FnZUNvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyY2M0MDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvTWVzc2FnZUNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5zZWkuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9Ik1lc3NhZ2VDb250ZXh0U2VydmljZSIsDQotICAgICAgICBwb3J0TmFtZT0iTWVzc2FnZUNvbnRleHRQb3J0IiwNCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY29udGV4dC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsDQotICAgICAgICBlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpLk1lc3NhZ2VDb250ZXh0IikNCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRJbXBsIGltcGxlbWVudHMgTWVzc2FnZUNvbnRleHQgew0KLQ0KLSAgICBAUmVzb3VyY2UNCi0gICAgV2ViU2VydmljZUNvbnRleHQgY3R4dDsNCi0NCi0gICAgcHVibGljIHZvaWQgaXNQcm9wZXJ0eVByZXNlbnQoDQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gcHJvcGVydHlOYW1lLA0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHZhbHVlLA0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHR5cGUsDQotICAgICAgICAgICAgSG9sZGVyPEJvb2xlYW4+IGlzRm91bmQpIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gaXNQcm9wZXJ0eVByZXNlbnQoIiArIHByb3BlcnR5TmFtZS52YWx1ZSArICIpIik7DQotICAgICAgICBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtc2dDdHh0ID0gY3R4dC5nZXRNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgaWYgKG1zZ0N0eHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlzRm91bmQudmFsdWUgPSBtc2dDdHh0LmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZS52YWx1ZSk7DQotICAgICAgICAgICAgT2JqZWN0IHZhbCA9IG1zZ0N0eHQuZ2V0KHByb3BlcnR5TmFtZS52YWx1ZSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtc2dDdHh0LmNvbnRhaW5zS2V5PSIgKyBpc0ZvdW5kLnZhbHVlKTsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1zZ0N0eHQuZ2V0PSIgKyB2YWwpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0eXBlLnZhbHVlID0gdmFsLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IHZhbC50b1N0cmluZygpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPDwgaXNQcm9wZXJ0eVByZXNlbnQoKSIpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3NlaS9NZXNzYWdlQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvc2VpL01lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2RkZWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvc2VpL01lc3NhZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJNZXNzYWdlQ29udGV4dCIsIA0KLSAgICAgICAgcG9ydE5hbWU9Ik1lc3NhZ2VDb250ZXh0UG9ydCIsDQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLCANCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJNRVRBLUlORi9NZXNzYWdlQ29udGV4dC53c2RsIikNCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VDb250ZXh0IHsNCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiBAcGFyYW0gdHlwZQ0KLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lDQotICAgICAqIEBwYXJhbSBpc0ZvdW5kDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaXNQcm9wZXJ0eVByZXNlbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaS5Jc1Byb3BlcnR5UHJlc2VudCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImlzUHJvcGVydHlQcmVzZW50UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnNlaS5Jc1Byb3BlcnR5UHJlc2VudFJlc3BvbnNlIikNCi0gICAgcHVibGljIHZvaWQgaXNQcm9wZXJ0eVByZXNlbnQoDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicHJvcGVydHlOYW1lIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOT1VUKQ0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHByb3BlcnR5TmFtZSwNCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ2YWx1ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgICAgICBIb2xkZXI8U3RyaW5nPiB2YWx1ZSwNCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0eXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOT1VUKQ0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHR5cGUsDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaXNGb3VuZCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gaXNGb3VuZCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3NlaS9NZXNzYWdlQ29udGV4dFNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3NlaS9NZXNzYWdlQ29udGV4dFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzMzY3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9zZWkvTWVzc2FnZUNvbnRleHRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7DQotDQotDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJNZXNzYWdlQ29udGV4dFNlcnZpY2UiLCANCi0gICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLCANCi0gICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSAiTWVzc2FnZUNvbnRleHQud3NkbCIpDQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0U2VydmljZQ0KLSAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIE1FU1NBR0VDT05URVhUU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpLk1lc3NhZ2VDb250ZXh0U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uID0gIi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9NRVRBLUlORi9NZXNzYWdlQ29udGV4dC53c2RsIjsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBNRVNTQUdFQ09OVEVYVFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHRTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoTUVTU0FHRUNPTlRFWFRTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLCAiTWVzc2FnZUNvbnRleHRTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgTWVzc2FnZUNvbnRleHQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIk1lc3NhZ2VDb250ZXh0UG9ydCIpDQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dFBvcnQoKSB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9jb250ZXh0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwgIk1lc3NhZ2VDb250ZXh0UG9ydCIpLCBNZXNzYWdlQ29udGV4dC5jbGFzcyk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmZWF0dXJlcyBBIGxpc3Qgb2Yge0BsaW5rIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZX0gdG8gY29uZmlndXJlIG9uIHRoZSBwcm94eS4gIFN1cHBvcnRlZCBmZWF0dXJlcyBub3QgaW4gdGhlIDxjb2RlPmZlYXR1cmVzPC9jb2RlPiBwYXJhbWV0ZXIgd2lsbCBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLg0KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgTWVzc2FnZUNvbnRleHQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIk1lc3NhZ2VDb250ZXh0UG9ydCIpDQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dFBvcnQoV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsNCi0gICAgICAgIHJldHVybiBzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL2NvbnRleHQuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLCAiTWVzc2FnZUNvbnRleHRQb3J0IiksIE1lc3NhZ2VDb250ZXh0LmNsYXNzLCBmZWF0dXJlcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvdGVzdHMvTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvdGVzdHMvTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVkZTZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3Rlc3RzL01lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuc2VpLk1lc3NhZ2VDb250ZXh0U2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotDQotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VDbGllbnQgd3NjID0gTWVzc2FnZUNvbnRleHRTZXJ2aWNlLmNsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZUNsaWVudC5jbGFzcyk7DQotICAgIA0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9NZXNzYWdlQ29udGV4dFNlcnZpY2UuTWVzc2FnZUNvbnRleHRQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKE1lc3NhZ2VDb250ZXh0VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V1NDdHh0X1dTRExfU0VSVklDRV9yZWFkKCkgew0KLSAgICAgICAgU3RyaW5nIHR5cGVfZXhwZWN0ZWQgPSBRTmFtZS5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICBTdHJpbmcgdmFsdWVfZXhwZWN0ZWQgPSAieyIgKyB3c2MudGFyZ2V0TmFtZXNwYWNlKCkgKyAifSIgKyB3c2MubmFtZSgpOw0KLSAgICAgICAgcnVuVGVzdChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX1NFUlZJQ0UsIHR5cGVfZXhwZWN0ZWQsIHZhbHVlX2V4cGVjdGVkLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdTQ3R4dF9XU0RMX1BPUlRfcmVhZCgpIHsNCi0gICAgICAgIFN0cmluZyB0eXBlX2V4cGVjdGVkID0gUU5hbWUuY2xhc3MuZ2V0TmFtZSgpOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlX2V4cGVjdGVkID0gInsiICsgd3NjLnRhcmdldE5hbWVzcGFjZSgpICsgIn1NZXNzYWdlQ29udGV4dFBvcnQiOw0KLSAgICAgICAgcnVuVGVzdChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX1BPUlQsIHR5cGVfZXhwZWN0ZWQsIHZhbHVlX2V4cGVjdGVkLCBmYWxzZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFdTQ3R4dF9XU0RMX09QRVJBVElPTl9yZWFkKCkgew0KLSAgICAgICAgU3RyaW5nIHR5cGVfZXhwZWN0ZWQgPSBRTmFtZS5jbGFzcy5nZXROYW1lKCk7DQotICAgICAgICBTdHJpbmcgdmFsdWVfZXhwZWN0ZWQgPSAiaXNQcm9wZXJ0eVByZXNlbnQiOw0KLSAgICAgICAgcnVuVGVzdChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX09QRVJBVElPTiwgdHlwZV9leHBlY3RlZCwgdmFsdWVfZXhwZWN0ZWQsIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V1NDdHh0X1dTRExfSU5URVJGQUNFX3JlYWQoKSB7DQotICAgICAgICBTdHJpbmcgdHlwZV9leHBlY3RlZCA9IFFOYW1lLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIFN0cmluZyB2YWx1ZV9leHBlY3RlZCA9ICJ7IiArIHdzYy50YXJnZXROYW1lc3BhY2UoKSArICJ9TWVzc2FnZUNvbnRleHQiOw0KLSAgICAgICAgcnVuVGVzdChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX0lOVEVSRkFDRSwgdHlwZV9leHBlY3RlZCwgdmFsdWVfZXhwZWN0ZWQsIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V1NDdHh0X1dTRExfREVTQ1JJUFRJT05fcmVhZCgpIHsNCi0gICAgICAgIFN0cmluZyB0eXBlX2V4cGVjdGVkID0gamF2YS5uZXQuVVJJLmNsYXNzLmdldE5hbWUoKTsNCi0gICAgICAgIFN0cmluZyB2YWx1ZV9leHBlY3RlZCA9ICJNRVRBLUlORi9NZXNzYWdlQ29udGV4dC53c2RsIjsNCi0gICAgICAgIHJ1blRlc3QoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuV1NETF9ERVNDUklQVElPTiwgdHlwZV9leHBlY3RlZCwgdmFsdWVfZXhwZWN0ZWQsIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcnVuVGVzdChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyBleFR5cGUsIFN0cmluZyBleFZhbHVlLCBib29sZWFuIGlzVmFsdWVGdWxseVNwZWNpZmllZCkgew0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcG9ydCA9IGdldFBvcnQoKTsNCi0NCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHR5cGUgPSBuZXcgSG9sZGVyPFN0cmluZz4oKTsNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHZhbHVlID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7DQotICAgICAgICBIb2xkZXI8Qm9vbGVhbj4gaXNGb3VuZCA9IG5ldyBIb2xkZXI8Qm9vbGVhbj4oKTsNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHByb3BlcnR5TmFtZSA9IG5ldyBIb2xkZXI8U3RyaW5nPihwcm9wTmFtZSk7DQotDQotICAgICAgICBwb3J0LmlzUHJvcGVydHlQcmVzZW50KHByb3BlcnR5TmFtZSwgdmFsdWUsIHR5cGUsIGlzRm91bmQpOw0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9wZXJ0eSA9ICIgKyBwcm9wTmFtZSArICIgZm91bmQ9IiArIGlzRm91bmQudmFsdWUpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZSA9ICIgKyB2YWx1ZS52YWx1ZSArICIvIiArIGV4VmFsdWUpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUeXBlID0gIiArIHR5cGUudmFsdWUgKyAiLyIgKyBleFR5cGUpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV2ViU2VydmljZUNvbnRleHQgZGlkIG5vdCBleHBvc2UgIiArIHByb3BlcnR5TmFtZS52YWx1ZSwgaXNGb3VuZC52YWx1ZSk7DQotDQotICAgICAgICBpZiAoZXhUeXBlICE9IG51bGwpDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVHlwZSBvZiAiICsgcHJvcGVydHlOYW1lLnZhbHVlICsgIiBkb2VzIG5vdCBtYXRjaCBbIiArIHR5cGUudmFsdWUgKyAiLCAiICsgZXhUeXBlICsgIl0iLA0KLSAgICAgICAgICAgICAgICAgICAgdHlwZS52YWx1ZSAhPSBudWxsICYmIHR5cGUudmFsdWUuaW5kZXhPZihleFR5cGUpID4gLTEpOw0KLQ0KLSAgICAgICAgaWYgKGV4VmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChpc1ZhbHVlRnVsbHlTcGVjaWZpZWQpIHsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJWYWx1ZSBvZiAiICsgcHJvcGVydHlOYW1lLnZhbHVlICsgIiBkb2VzIG5vdCBtYXRjaCIsIGV4VmFsdWUsIHZhbHVlLnZhbHVlKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJWYWx1ZSBvZiAiICsgcHJvcGVydHlOYW1lLnZhbHVlICsgIiBkb2VzIG5vdCBjb250YWluICIgKyBleFZhbHVlLCB2YWx1ZS52YWx1ZS5pbmRleE9mKGV4VmFsdWUpICE9IC0xKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldFBvcnQoKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dFNlcnZpY2Ugc2VydmljZSA9IG5ldyBNZXNzYWdlQ29udGV4dFNlcnZpY2UoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHBvcnQgPSBzZXJ2aWNlLmdldE1lc3NhZ2VDb250ZXh0UG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIHJldHVybiBwb3J0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9Bc3luY0NhbGxiYWNrLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvQXN5bmNDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDU0NDVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9Bc3luY0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotDQotcHVibGljIGNsYXNzIEFzeW5jQ2FsbGJhY2s8VD4gaW1wbGVtZW50cyBBc3luY0hhbmRsZXI8VD4gew0KLQ0KLSAgICBwcml2YXRlIFQgdmFsdWU7DQotICAgIHByaXZhdGUgVGhyb3dhYmxlIGV4Y2VwdGlvbjsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlPFQ+IHJlc3BvbnNlKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHZhbHVlID0gcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHQ7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgew0KLSAgICAgICAgcmV0dXJuIChleGNlcHRpb24gIT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3IoKSB7DQotICAgICAgICByZXR1cm4gZXhjZXB0aW9uOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgVCBnZXRWYWx1ZSgpIHsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvQ2FsbGJhY2tIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvQ2FsbGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODJkNDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0NhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0hhbmRsZXI8VD4gaW1wbGVtZW50cyBBc3luY0hhbmRsZXIgPFQ+IHsNCi0NCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UoUmVzcG9uc2UgcmVzcG9uc2UpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBQcm9jZXNzaW5nIGFzeW5jIHJlcG9uc2UiKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUIHJlcyA9IChUKSByZXNwb25zZS5nZXQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZihyZXMgaW5zdGFuY2VvZiBTT0FQTWVzc2FnZSl7DQotICAgICAgICAgICAgCVNPQVBNZXNzYWdlIG1lc3NhZ2UgPSAoU09BUE1lc3NhZ2UpIHJlczsNCi0gICAgICAgICAgICAJbWVzc2FnZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgICAgIAkNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYocmVzIGluc3RhbmNlb2YgU3RyaW5nKXsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlIFsiICsgcmVzICsgIl0iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZihTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZXMuZ2V0Q2xhc3MoKSkpew0KLSAgICAgICAgICAgICAgICBTb3VyY2Ugc291cmNlID0gKFNvdXJjZSkgcmVzOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzb3VyY2UpOw0KLSAgICAgICAgICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0NCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9ET01Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvRE9NU291cmNlRGlzcGF0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmYwNGU4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9ET01Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgSkFYLVdTIERpc3BhdGNoIHdpdGggdmFyaW91cyBmb3JtcyBvZiB0aGUgDQotICogamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBET01Tb3VyY2VEaXNwYXRjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZXsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRE9NU291cmNlRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICANCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NU291cmNlDQotICAgICAgICBET01Tb3VyY2UgcmVxdWVzdCA9IGNyZWF0ZURPTVNvdXJjZUZyb21TdHJpbmcoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotCQlTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotCQlhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIscmVzcG9uc2UpOw0KLQkJDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBET01Tb3VyY2UNCi0gICAgICAgIERPTVNvdXJjZSByZXF1ZXN0ID0gY3JlYXRlRE9NU291cmNlRnJvbVN0cmluZyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIixyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFR1cm4gdGhlIFNvdXJjZSBpbnRvIGEgU3RyaW5nIHNvIHdlIGNhbiBjaGVjayBpdA0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIscmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotDQotICAgICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTb3VyY2U+IGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrSGFuZGxlcik7DQotICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFR1cm4gdGhlIFNvdXJjZSBpbnRvIGEgU3RyaW5nIHNvIHdlIGNhbiBjaGVjayBpdA0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2tIYW5kbGVyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBET01Tb3VyY2UNCi0gICAgICAgIERPTVNvdXJjZSByZXF1ZXN0ID0gY3JlYXRlRE9NU291cmNlRnJvbVN0cmluZyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U291cmNlPiBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0LCBjYWxsYmFja0hhbmRsZXIpOw0KLQkgICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgY2FsbGJhY2tIYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2s8U291cmNlPigpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0LCBjYWxsYmFja0hhbmRsZXIpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IGNyZWF0ZVN0cmluZ0Zyb21Tb3VyY2UocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBSZXNwb25zZTxTb3VyY2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAocG9sbGluZykgRGlzcGF0Y2giKTsNCi0gICAgICAgIGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFR1cm4gdGhlIFNvdXJjZSBpbnRvIGEgU3RyaW5nIHNvIHdlIGNhbiBjaGVjayBpdA0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NU291cmNlDQotICAgICAgICBET01Tb3VyY2UgcmVxdWVzdCA9IGNyZWF0ZURPTVNvdXJjZUZyb21TdHJpbmcoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBSZXNwb25zZTxTb3VyY2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUdXJuIHRoZSBTb3VyY2UgaW50byBhIFN0cmluZyBzbyB3ZSBjYW4gY2hlY2sgaXQNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBjcmVhdGVTdHJpbmdGcm9tU291cmNlKHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFR1cm4gdGhlIFNvdXJjZSBpbnRvIGEgU3RyaW5nIHNvIHdlIGNhbiBjaGVjayBpdA0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gY3JlYXRlU3RyaW5nRnJvbVNvdXJjZShyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXlQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIERPTVNvdXJjZQ0KLSAgICAgICAgRE9NU291cmNlIHJlcXVlc3QgPSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheU1lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NU291cmNlDQotICAgICAgICBET01Tb3VyY2UgcmVxdWVzdCA9IGNyZWF0ZURPTVNvdXJjZUZyb21TdHJpbmcoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBPbmUgV2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLQl9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRE9NU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgRE9NU291cmNlDQotICAgICAgICBET01Tb3VyY2UgcmVxdWVzdCA9IG5ldyBET01Tb3VyY2UoKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIldlYlNlcnZpY2VFeGNlcHRpb24gd2FzIGV4cGVjdGVkIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQSBXZWIgU2VydmljZSBFeGNlcHRpb24gd2FzIGV4cGVjdGVkOiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCwgYnV0IHJlY2VpdmVkICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIldlYlNlcnZpY2VFeGNlcHRpb24gd2FzIGV4cGVjdGVkIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQSBXZWIgU2VydmljZSBFeGNlcHRpb24gd2FzIGV4cGVjdGVkOiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCwgYnV0IHJlY2VpdmVkICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotCS8qKg0KLSAgICAgKiBDcmVhdGUgYSBET01Tb3VyY2Ugd2l0aCB0aGUgcHJvdmlkZWQgU3RyaW5nIGFzIHRoZSBjb250ZW50DQotICAgICAqIEBwYXJhbSBpbnB1dA0KLSAgICAgKiBAcmV0dXJuDQotCSAqLw0KLSAgICBwcml2YXRlIERPTVNvdXJjZSBjcmVhdGVET01Tb3VyY2VGcm9tU3RyaW5nKFN0cmluZyBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBpbnB1dC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIA0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgZG9tRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0gICAgICAgIERvY3VtZW50QnVpbGRlciBkb21CdWlsZGVyID0gZG9tRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCi0gICAgICAgIERvY3VtZW50IGRvbVRyZWUgPSBkb21CdWlsZGVyLnBhcnNlKHN0cmVhbSk7DQotICAgICAgICBOb2RlIG5vZGUgPSBkb21UcmVlLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgICAgICBET01Tb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShub2RlKTsNCi0gICAgICAgIHJldHVybiBkb21Tb3VyY2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBTdHJpbmcgZnJvbSB0aGUgcHJvdmlkZWQgU291cmNlDQotICAgICAqIEBwYXJhbSBpbnB1dA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVTdHJpbmdGcm9tU291cmNlKFNvdXJjZSBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpbnB1dCk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgdGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0Rpc3BhdGNoVGVzdENvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0Rpc3BhdGNoVGVzdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWY2NDFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9EaXNwYXRjaFRlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotcHVibGljIGNsYXNzIERpc3BhdGNoVGVzdENvbnN0YW50cyB7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRWNob1NlcnZpY2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQURVUkwgPSAiaHR0cDovL3RoaXMuaXMubm90LmEudmFsaWQuaG9zdG5hbWUuYXQuYWxsLm5vLndheTo5OTk5L3dhY2t5IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJFY2hvU2VydmljZSIpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIkVjaG9TZXJ2aWNlU09BUDExcG9ydDAiKTsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVNvYXBFbnZlbG9wZUhlYWRlciA9IA0KLSAgICAgICAgIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKyANCi0gICAgICAgICI8c29hcDpCb2R5PiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlU29hcEVudmVsb3BlRm9vdGVyID0NCi0gICAgICAgICI8L3NvYXA6Qm9keT4iICsgDQotICAgICAgICAiPC9zb2FwOkVudmVsb3BlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVCb2R5Q29udGVudCA9IA0KLSAgICAgICAgIjxuczE6ZWNob1N0cmluZyB4bWxuczpuczE9XCJodHRwOi8vdGVzdFwiPiIgKyANCi0gICAgICAgICI8bnMxOmlucHV0IHhtbG5zPVwiaHR0cDovL3Rlc3RcIj5IRUxMTyBUSEVSRSEhITwvbnMxOmlucHV0PiIgKyANCi0gICAgICAgICI8L25zMTplY2hvU3RyaW5nPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVCb2R5Q29udGVudF9iYWQgPSANCi0gICAgICAgICI8bnMxOmVjaG9TdHJpbmcgeG1sbnM6bnMxPVwiaHR0cDovL3Rlc3RcIj4iICsgDQotICAgICAgICAiPG5zMTppbnB1dCB4bWxucz1cImh0dHA6Ly90ZXN0XCI+VEhST1cgRVhDRVBUSU9OPC9uczE6aW5wdXQ+IiArIA0KLSAgICAgICAgIjwvbnMxOmVjaG9TdHJpbmc+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVNvYXBNZXNzYWdlID0gDQotICAgICAgICBzYW1wbGVTb2FwRW52ZWxvcGVIZWFkZXIgKw0KLSAgICAgICAgc2FtcGxlQm9keUNvbnRlbnQgKyANCi0gICAgICAgIHNhbXBsZVNvYXBFbnZlbG9wZUZvb3RlcjsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0pBWEJDYWxsYmFja0hhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9KQVhCQ2FsbGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzAxOTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0pBWEJDYWxsYmFja0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgdGVzdC5FY2hvU3RyaW5nUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi0NCi1wdWJsaWMgY2xhc3MgSkFYQkNhbGxiYWNrSGFuZGxlcjxUPiBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlcjxUPiB7DQotDQotICAgIFQgZGF0YSA9IG51bGw7DQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRhdGEgPSAoVCkgcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIHJlc3BvbnNlIHJlY2VpdmVkOiAiICsgZGF0YSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBUIGdldERhdGEoKSB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9KQVhCRGlzcGF0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2FhZWJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9KQVhCRGlzcGF0Y2hUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy54bWxzb2FwLnNjaGVtYXMuc29hcC5lbnZlbG9wZS5Cb2R5Ow0KLWltcG9ydCBvcmcueG1sc29hcC5zY2hlbWFzLnNvYXAuZW52ZWxvcGUuRW52ZWxvcGU7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsNCi1pbXBvcnQgdGVzdC5FY2hvU3RyaW5nUmVzcG9uc2U7DQotaW1wb3J0IHRlc3QuT2JqZWN0RmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotcHVibGljIGNsYXNzIEpBWEJEaXNwYXRjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaFBheWxvYWQ7DQotICAgIHByaXZhdGUgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaE1lc3NhZ2U7DQotICAgIHByaXZhdGUgSkFYQkNvbnRleHQgamJjOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEpBWEJEaXNwYXRjaFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBTZXJ2aWNlIG9iamVjdA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBKQVgtQiBEaXNwYXRjaCBvYmplY3QgdG8gcmVjb2duaXplIHRoZSB0ZXN0IGFuZCBzb2FwIHBhY2thZ2VzDQotICAgICAgICBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgidGVzdDpvcmcueG1sc29hcC5zY2hlbWFzLnNvYXAuZW52ZWxvcGUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIFBheWxvYWQgYW5kIE1lc3NhZ2UgRGlzcGF0Y2gNCi0gICAgICAgIGRpc3BhdGNoUGF5bG9hZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgZGlzcGF0Y2hNZXNzYWdlID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgamJjLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jUGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbnB1dCBwYXJhbQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyAgICAgICAgIA0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dCgiU1lOQyBKQVhCIFBBWUxPQUQgVEVTVCIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgcmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSBkaXNwYXRjaFBheWxvYWQuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFJlc3BvbnNlIG9iamVjdCB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgcmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFplcm8gbGVuZ3RoIGNvbnRlbnQgaW4gcmVzcG9uc2UiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICByZXNwb25zZSA9IChFY2hvU3RyaW5nUmVzcG9uc2UpIGRpc3BhdGNoUGF5bG9hZC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIGNvbnRlbnQ6ICIgKyByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gUmVzcG9uc2Ugb2JqZWN0IHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIHJlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5sZW5ndGgoKSA+IDApOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXlzbmNQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgcGFyYW0NCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFY2hvU3RyaW5nIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoIkFTWU5DKENBTExCQUNLKSBKQVhCIFBBWUxPQUQgVEVTVCIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEpBWEJDYWxsYmFja0hhbmRsZXI8T2JqZWN0PiBjYWxsYmFjayA9IG5ldyBKQVhCQ2FsbGJhY2tIYW5kbGVyPE9iamVjdD4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IGFzeW5jaHJvbm91c2x5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoUGF5bG9hZC5pbnZva2VBc3luYyhyZXF1ZXN0LCBjYWxsYmFjayk7DQotICAgICAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSByZXNwb25zZSA9IChFY2hvU3RyaW5nUmVzcG9uc2UpIGNhbGxiYWNrLmdldERhdGEoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIGNvbnRlbnQ6ICIgKyByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gUmVzcG9uc2Ugb2JqZWN0IHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIHJlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5sZW5ndGgoKSA+IDApOw0KLQ0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIGNhbGxiYWNrID0gbmV3IEpBWEJDYWxsYmFja0hhbmRsZXI8T2JqZWN0PigpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gYXN5bmNocm9ub3VzbHkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyhjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaFBheWxvYWQuaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2spOw0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IChFY2hvU3RyaW5nUmVzcG9uc2UpIGNhbGxiYWNrLmdldERhdGEoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIGNvbnRlbnQ6ICIgKyByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gUmVzcG9uc2Ugb2JqZWN0IHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCByZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIHJlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5sZW5ndGgoKSA+IDApOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5UGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbnB1dCBwYXJhbQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyAgICAgICAgIA0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dCgiT05FLVdBWSBKQVhCIFBBWUxPQUQgVEVTVCIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gb25lLXdheQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIG9uZS13YXkgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIGRpc3BhdGNoUGF5bG9hZC5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0PiBvbmUtd2F5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBkaXNwYXRjaFBheWxvYWQuaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY01lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgcGFyYW0NCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFY2hvU3RyaW5nIGVjaG9TdHJpbmcgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgIGVjaG9TdHJpbmcuc2V0SW5wdXQoIlNZTkMgSkFYQiBNRVNTQUdFVEVTVCIpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCRWxlbWVudDxFbnZlbG9wZT4gcmVxdWVzdCA9IGNyZWF0ZUpBWEJFbnZlbG9wZSgpOw0KLSAgICAgICAgcmVxdWVzdC5nZXRWYWx1ZSgpLmdldEJvZHkoKS5nZXRBbnkoKS5hZGQoZWNob1N0cmluZyk7DQotICAgICAgICANCi0gICAgICAgIGpiYy5jcmVhdGVNYXJzaGFsbGVyKCkubWFyc2hhbChyZXF1ZXN0LFN5c3RlbS5vdXQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgICBKQVhCRWxlbWVudDxFbnZlbG9wZT4gamF4YlJlc3BvbnNlID0gKEpBWEJFbGVtZW50PEVudmVsb3BlPikgZGlzcGF0Y2hNZXNzYWdlLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChqYXhiUmVzcG9uc2UpOw0KLSAgICAgICAgRW52ZWxvcGUgcmVzcG9uc2UgPSBqYXhiUmVzcG9uc2UuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRCb2R5KCkpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIGVjaG9TdHJpbmdSZXNwb25zZSA9IChFY2hvU3RyaW5nUmVzcG9uc2UpIHJlc3BvbnNlLmdldEJvZHkoKS5nZXRBbnkoKS5nZXQoMCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgY29udGVudDogIiArIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBaZXJvIGxlbmd0aCBjb250ZW50IGluIHJlc3BvbnNlIiwgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5sZW5ndGgoKSA+IDApOw0KLSAgICANCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIGpheGJSZXNwb25zZSA9IChKQVhCRWxlbWVudDxFbnZlbG9wZT4pIGRpc3BhdGNoTWVzc2FnZS5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoamF4YlJlc3BvbnNlKTsNCi0gICAgICAgIHJlc3BvbnNlID0gamF4YlJlc3BvbnNlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0Qm9keSgpKTsNCi0gICAgICAgIGVjaG9TdHJpbmdSZXNwb25zZSA9IChFY2hvU3RyaW5nUmVzcG9uc2UpIHJlc3BvbnNlLmdldEJvZHkoKS5nZXRBbnkoKS5nZXQoMCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgY29udGVudDogIiArIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIE5vIGNvbnRlbnQgaW4gcmVzcG9uc2Ugb2JqZWN0IiwgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBaZXJvIGxlbmd0aCBjb250ZW50IGluIHJlc3BvbnNlIiwgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5sZW5ndGgoKSA+IDApOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXlzbmNNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXQgcGFyYW0NCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBFY2hvU3RyaW5nIGVjaG9TdHJpbmcgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgIGVjaG9TdHJpbmcuc2V0SW5wdXQoIkFTWU5DKENBTExCQUNLKSBKQVhCIE1FU1NBR0UgVEVTVCIpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCRWxlbWVudDxFbnZlbG9wZT4gcmVxdWVzdCA9IGNyZWF0ZUpBWEJFbnZlbG9wZSgpOw0KLSAgICAgICAgcmVxdWVzdC5nZXRWYWx1ZSgpLmdldEJvZHkoKS5nZXRBbnkoKS5hZGQoZWNob1N0cmluZyk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBKQVhCQ2FsbGJhY2tIYW5kbGVyPE9iamVjdD4gY2FsbGJhY2sgPSBuZXcgSkFYQkNhbGxiYWNrSGFuZGxlcjxPYmplY3Q+KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0PiBhc3luY2hyb25vdXNseQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaE1lc3NhZ2UuaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2spOw0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBKQVhCRWxlbWVudDxFbnZlbG9wZT4gamF4YlJlc3BvbnNlID0gKEpBWEJFbGVtZW50PEVudmVsb3BlPikgY2FsbGJhY2suZ2V0RGF0YSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGpheGJSZXNwb25zZSk7DQotICAgICAgICBFbnZlbG9wZSByZXNwb25zZSA9IGpheGJSZXNwb25zZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0Qm9keSgpKTsNCi0gICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvU3RyaW5nUmVzcG9uc2UgPSAoRWNob1N0cmluZ1Jlc3BvbnNlKSByZXNwb25zZS5nZXRCb2R5KCkuZ2V0QW55KCkuZ2V0KDApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIGNvbnRlbnQ6ICIgKyBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIltFUlJPUl0gLSBObyBjb250ZW50IGluIHJlc3BvbnNlIG9iamVjdCIsIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIGVjaG9TdHJpbmdSZXNwb25zZS5nZXRFY2hvU3RyaW5nUmV0dXJuKCkubGVuZ3RoKCkgPiAwKTsNCi0NCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIGNhbGxiYWNrID0gbmV3IEpBWEJDYWxsYmFja0hhbmRsZXI8T2JqZWN0PigpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPE9iamVjdD4gYXN5bmNocm9ub3VzbHkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyhjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaE1lc3NhZ2UuaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2spOw0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBqYXhiUmVzcG9uc2UgPSAoSkFYQkVsZW1lbnQ8RW52ZWxvcGU+KSBjYWxsYmFjay5nZXREYXRhKCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoamF4YlJlc3BvbnNlKTsNCi0gICAgICAgIHJlc3BvbnNlID0gamF4YlJlc3BvbnNlLmdldFZhbHVlKCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRCb2R5KCkpOw0KLSAgICAgICAgZWNob1N0cmluZ1Jlc3BvbnNlID0gKEVjaG9TdHJpbmdSZXNwb25zZSkgcmVzcG9uc2UuZ2V0Qm9keSgpLmdldEFueSgpLmdldCgwKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBjb250ZW50OiAiICsgZWNob1N0cmluZ1Jlc3BvbnNlLmdldEVjaG9TdHJpbmdSZXR1cm4oKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFplcm8gbGVuZ3RoIGNvbnRlbnQgaW4gcmVzcG9uc2UiLCBlY2hvU3RyaW5nUmVzcG9uc2UuZ2V0RWNob1N0cmluZ1JldHVybigpLmxlbmd0aCgpID4gMCk7DQotDQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheU1lc3NnZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbnB1dCBwYXJhbQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgZWNob1N0cmluZyA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyAgICAgICAgIA0KLSAgICAgICAgZWNob1N0cmluZy5zZXRJbnB1dCgiT05FLVdBWSBKQVhCIE1FU1NBR0UgVEVTVCIpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCRWxlbWVudDxFbnZlbG9wZT4gcmVxdWVzdCA9IGNyZWF0ZUpBWEJFbnZlbG9wZSgpOw0KLSAgICAgICAgcmVxdWVzdC5nZXRWYWx1ZSgpLmdldEJvZHkoKS5nZXRBbnkoKS5hZGQoZWNob1N0cmluZyk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0PiBvbmUtd2F5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgb25lLXdheSBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICAgZGlzcGF0Y2hNZXNzYWdlLmludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+IG9uZS13YXkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIG9uZS13YXkgRGlzcGF0Y2ggd2l0aCBKQVgtQiBQYXJhbWV0ZXIiKTsNCi0gICAgICAgIGRpc3BhdGNoTWVzc2FnZS5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgSkFYQkVsZW1lbnQ8RW52ZWxvcGU+IGNyZWF0ZUpBWEJFbnZlbG9wZSgpIHsNCi0gICAgICAgIG9yZy54bWxzb2FwLnNjaGVtYXMuc29hcC5lbnZlbG9wZS5PYmplY3RGYWN0b3J5IGZhY3RvcnkgPSANCi0gICAgICAgICAgICBuZXcgb3JnLnhtbHNvYXAuc2NoZW1hcy5zb2FwLmVudmVsb3BlLk9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVudmVsb3BlIGVudiA9IG5ldyBFbnZlbG9wZSgpOw0KLSAgICAgICAgDQotICAgICAgICBCb2R5IGJvZHkgPSBuZXcgQm9keSgpOw0KLSAgICAgICAgZW52LnNldEJvZHkoYm9keSk7DQotICAgICAgICANCi0gICAgICAgIEpBWEJFbGVtZW50PEVudmVsb3BlPiBqYXhiRW52ID0gZmFjdG9yeS5jcmVhdGVFbnZlbG9wZShlbnYpOw0KLSAgICAgICAgcmV0dXJuIGpheGJFbnY7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL0pBWEJTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvSkFYQlNvdXJjZURpc3BhdGNoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1MDI5NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvSkFYQlNvdXJjZURpc3BhdGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcudGVzdC5kaXNwYXRjaC5qYXhic291cmNlLkludm9rZTsNCi1pbXBvcnQgb3JnLnRlc3QuZGlzcGF0Y2guamF4YnNvdXJjZS5PYmplY3RGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQudXRpbC5KQVhCU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLS8qDQotKiBUaGlzIGlzIGEgdGVzdCBjYXNlIGZvciBJbnZva2luZyBEaXNwYXRjaCB3aXRoIGEgSkFYQlNvdXJjZS4NCi0qIHRlc3QgdXNlcyBKQVhCIE9iamVjdHMgZnJvbSBvcmcudGVzdC5kaXNwYXRjaC5qYXhic291cmNlIHBhY2thZ2UsIGNyZWF0ZSBhIHJlcXVlc3Qgb2YgSkFYQlNvdXJjZSB0eXBlDQotKiBhbmQgaW52b2tlcyB0aGUgc2VydmljZSBlbmRwb2ludCBhbmQgcmVhZHMgdGhlIHJlc3BvbnNlIG9mIHR5cGUgU291cmNlLiBBc3NlcnQgZmFpbHVyZSBpZiByZXNwb25zZSBub3QgcmVjZWl2ZWQuDQotKi8NCi0NCi0NCi1wdWJsaWMgY2xhc3MgSkFYQlNvdXJjZURpc3BhdGNoVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0JLyoqDQotICAgICAqIEludm9rZSBhIHN5bmMgRGlzcGF0Y2g8SkFYQlNvdXJjZT4gaW4gUEFZTE9BRCBtb2RlDQotICAgICAqLw0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb3VyY2VQcm92aWRlclNlcnZpY2UiOw0KLQlwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTb3VyY2VQcm92aWRlclNlcnZpY2UiKTsNCi0JcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9bmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIpOw0KLSAgICANCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEpBWEJTb3VyY2VEaXNwYXRjaFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJTb3VyY2VTeW5jUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCB1cmwpOw0KLSAgICAgICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgICAgIC8vQ3JlYXRlIEpBWEJDb250ZXh0IGFuZCBKQVhCU291cmNlIGhlcmUuDQotICAgICAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgICAgICBJbnZva2UgaW52b2tlT2JqID0gZmFjdG9yeS5jcmVhdGVJbnZva2UoKTsNCi0gICAgICAgICAgICBpbnZva2VPYmouc2V0SW52b2tlU3RyKCJTb21lIFJlcXVlc3QiKTsNCi0gICAgICAgICAgICBKQVhCQ29udGV4dCBjdHggPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QuZGlzcGF0Y2guamF4YnNvdXJjZSIpOw0KLQ0KLSAgICAgICAgICAgIEpBWEJTb3VyY2UgamJTcmMgPSBuZXcgSkFYQlNvdXJjZShjdHguY3JlYXRlTWFyc2hhbGxlcigpLCBpbnZva2VPYmopOw0KLSAgICAgICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIC8vSW52b2tlIFNlcnZlciBlbmRwb2ludCBhbmQgcmVhZCByZXNwb25zZQ0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShqYlNyYyk7DQotDQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICAgICAgLy9QcmludCB0aGUgcmVzcG9uc2UgYXMgc3RyaW5nLg0KLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICAgICAgVHJhbnNmb3JtZXIgdCA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsNCi0gICAgICAgICAgICB0LnRyYW5zZm9ybShyZXNwb25zZSwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgT24gQ2xpZW50OiBcbiIgKyB3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICBqYlNyYyA9IG5ldyBKQVhCU291cmNlKGN0eC5jcmVhdGVNYXJzaGFsbGVyKCksIGludm9rZU9iaik7DQotICAgICAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICAgICAgLy9JbnZva2UgU2VydmVyIGVuZHBvaW50IGFuZCByZWFkIHJlc3BvbnNlDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoamJTcmMpOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIC8vUHJpbnQgdGhlIHJlc3BvbnNlIGFzIHN0cmluZy4NCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICAgICAgdCA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOw0KLSAgICAgICAgICAgIHQudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSBPbiBDbGllbnQ6IFxuIiArIHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL09NRWxlbWVudERpc3BhdGNoVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL09NRWxlbWVudERpc3BhdGNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTVmYjhlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9PTUVsZW1lbnREaXNwYXRjaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHVzZXMgdGhlIEpBWC1XUyBEaXNwYXRjaCBBUEkgdG8gdGVzdCBzZW5kaW5nIGFuZCByZWNlaXZpbmcNCi0gKiBtZXNzYWdlcyB1c2luZyBTT0FQIDEuMi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50RGlzcGF0Y2hUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L09NRUxFTUVOVCIsICJPTUVsZW1lbnRTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoDQotICAgICAgICAgICAgImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIiwgIk9NRWxlbWVudFBvcnQiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvT01FbGVtZW50UHJvdmlkZXJTZXJ2aWNlLk9NRWxlbWVudFByb3ZpZGVyUG9ydCI7ICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVJlcXVlc3QgPSANCi0gICAgICAgICI8dGVzdDplY2hvT01FbGVtZW50IHhtbG5zOnRlc3Q9XCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L09NRUxFTUVOVFwiPiIgKw0KLSAgICAgICAgIjx0ZXN0OmlucHV0PlNBTVBMRSBSRVFVRVNUIE1FU1NBR0U8L3Rlc3Q6aW5wdXQ+IiArDQotICAgICAgICAiPC90ZXN0OmVjaG9PTUVsZW1lbnQ+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlSGVhZCA9IA0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGVcIj4iICsNCi0gICAgICAgICI8c29hcGVudjpIZWFkZXIgLz48c29hcGVudjpCb2R5PiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZVRhaWwgPSANCi0gICAgICAgICI8L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlID0gDQotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQgKyANCi0gICAgICAgIHNhbXBsZVJlcXVlc3QgKyANCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKE9NRWxlbWVudERpc3BhdGNoVGVzdC5jbGFzcykpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBQQVlMT0FEIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb3VyY2VEaXNwYXRjaFBheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgU291cmNlIG9iamVjdCB3aXRoIHRoZSBwYXlsb2FkIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIFBBWUxPQUQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZW52ZWxvcGUuDQotICAgICAgICBieXRlW10gYnl0ZXMgPSBzYW1wbGVSZXF1ZXN0LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VuZCB0aGUgU09BUCAxLjIgcmVxdWVzdA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsLiAgV2UgZXhwZWN0ZWQgY29udGVudCB0byBiZSByZXR1cm5lZC4iLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKSk7ICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VuZCB0aGUgU09BUCAxLjIgcmVxdWVzdA0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmVzcG9uc2Ugd2FzIG51bGwuICBXZSBleHBlY3RlZCBjb250ZW50IHRvIGJlIHJldHVybmVkLiIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBhIG1vcmUgY29uc3VtYWJsZSBmb3JtYXQNCi0gICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIHRyYW5zLnRyYW5zZm9ybShyZXNwb25zZSwgcmVzdWx0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50cyBhcmUgY29ycmVjdC4gIEFnYWluLCBzaW5jZSB3ZSdyZQ0KLSAgICAgICAgLy8gaW4gUEFZTE9BRCBtb2RlLCB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnl0aGluZyByZWxhdGVkIHRvIHRoZSBlbnZlbG9wZQ0KLSAgICAgICAgLy8gaW4gdGhlIHJldHVybiwganVzdCB0aGUgY29udGVudHMgb2YgdGhlIEJvZHkuDQotICAgICAgICByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIikpOyAgICANCi0gICAgfQ0KLSAgICANCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3Qgc2VuZGluZyBhIFNPQVAgMS4yIHJlcXVlc3QgaW4gTUVTU0FHRSBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlRGlzcGF0Y2hNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaCgNCi0gICAgICAgICAgICAgICAgUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLCBNb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIFNvdXJjZSBvYmplY3Qgd2l0aCB0aGUgbWVzc2FnZSBjb250ZW50cy4gIFNpbmNlDQotICAgICAgICAvLyB3ZSdyZSBpbiBNRVNTQUdFIG1vZGUsIHdlJ2xsIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGNyZWF0ZSB0aGlzDQotICAgICAgICAvLyB3aXRoIHRoZSByaWdodCBwcm90b2NvbC4NCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IHNhbXBsZUVudmVsb3BlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBhIG1vcmUgY29uc3VtYWJsZSBmb3JtYXQNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7DQotICAgICAgICANCi0gICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIHRyYW5zLnRyYW5zZm9ybShyZXNwb25zZSwgcmVzdWx0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBhcmUgY29ycmVjdA0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSByZXR1cm5lZCBoYWQgdGhlIHJpZ2h0IHByb3RvY29sIHZlcnNpb24NCi0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBiZSB1c2luZyB0aGUgaGFyZCANCi0gICAgICAgIC8vIGNvZGVkIFVSTHMgaGVyZSwgb3Igd2hldGhlciB3ZSBzaG91bGQgYmUgdXNpbmcgYSBjb25zdGFudCBmb3IgdGhlIA0KLSAgICAgICAgLy8gcHVycG9zZXMgb2YgdGhlIHRlc3QuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXNwb25zZSB0byBhIG1vcmUgY29uc3VtYWJsZSBmb3JtYXQNCi0gICAgICAgIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIHRyYW5zLnRyYW5zZm9ybShyZXNwb25zZSwgcmVzdWx0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBhcmUgY29ycmVjdA0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJTQU1QTEUgUkVTUE9OU0UgTUVTU0FHRSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIHJldHVybmVkIGhhZCB0aGUgcmlnaHQgcHJvdG9jb2wgdmVyc2lvbg0KLSAgICAgICAgLy8gVE9ETzogTmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBoYXJkIA0KLSAgICAgICAgLy8gY29kZWQgVVJMcyBoZXJlLCBvciB3aGV0aGVyIHdlIHNob3VsZCBiZSB1c2luZyBhIGNvbnN0YW50IGZvciB0aGUgDQotICAgICAgICAvLyBwdXJwb3NlcyBvZiB0aGUgdGVzdC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNlbmRpbmcgYSBTT0FQIDEuMiByZXF1ZXN0IGluIFBBWUxPQUQgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE9NRWxlbWVudERpc3BhdGNoUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T01FbGVtZW50PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIE9NRWxlbWVudC5jbGFzcywgTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBPTUVsZW1lbnQgb2JqZWN0IHdpdGggdGhlIHBheWxvYWQgY29udGVudHMuICBTaW5jZQ0KLSAgICAgICAgLy8gd2UncmUgaW4gUEFZTE9BRCBtb2RlLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBlbnZlbG9wZS4NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlUmVxdWVzdCk7DQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5wdXRSZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsNCi0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0UmVhZGVyKTsgIA0KLSAgICAgICAgT01FbGVtZW50IG9tID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VuZCB0aGUgU09BUCAxLjIgcmVxdWVzdA0KLSAgICAgICAgT01FbGVtZW50IHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKG9tKTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlLnRvU3RyaW5nV2l0aENvbnN1bWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKSk7ICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKG9tKTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbC4gIFdlIGV4cGVjdGVkIGNvbnRlbnQgdG8gYmUgcmV0dXJuZWQuIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcmVzcG9uc2UudG9TdHJpbmdXaXRoQ29uc3VtZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJTQU1QTEUgUkVTUE9OU0UgTUVTU0FHRSIpKTsgICAgDQotICAgIH0NCi0gICAgDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNlbmRpbmcgYSBTT0FQIDEuMiByZXF1ZXN0IGluIE1FU1NBR0UgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE9NRWxlbWVudERpc3BhdGNoTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T01FbGVtZW50PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIE9NRWxlbWVudC5jbGFzcywgTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBPTUVsZW1lbnQgb2JqZWN0IHdpdGggdGhlIHBheWxvYWQgY29udGVudHMuICBTaW5jZQ0KLSAgICAgICAgLy8gd2UncmUgaW4gUEFZTE9BRCBtb2RlLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBlbnZlbG9wZS4NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlRW52ZWxvcGUpOw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7DQotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihpbnB1dFJlYWRlcik7ICANCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7DQotICAgICAgICANCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShvbSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgYXJlIGNvcnJlY3QNCi0gICAgICAgIC8vU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByZXNwb25zZS50b1N0cmluZ1dpdGhDb25zdW1lKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIlNBTVBMRSBSRVNQT05TRSBNRVNTQUdFIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgcmV0dXJuZWQgaGFkIHRoZSByaWdodCBwcm90b2NvbCB2ZXJzaW9uDQotICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYmUgdXNpbmcgdGhlIGhhcmQgDQotICAgICAgICAvLyBjb2RlZCBVUkxzIGhlcmUsIG9yIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHVzaW5nIGEgY29uc3RhbnQgZm9yIHRoZSANCi0gICAgICAgIC8vIHB1cnBvc2VzIG9mIHRoZSB0ZXN0Lg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyMiA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlRW52ZWxvcGUpOw0KLSAgICAgICAgaW5wdXRSZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyMik7DQotICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoaW5wdXRSZWFkZXIpOyAgDQotICAgICAgICBvbSA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShvbSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgYXJlIGNvcnJlY3QNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlLnRvU3RyaW5nV2l0aENvbnN1bWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgbWVzc2FnZSByZXR1cm5lZCBoYWQgdGhlIHJpZ2h0IHByb3RvY29sIHZlcnNpb24NCi0gICAgICAgIC8vIFRPRE86IE5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBiZSB1c2luZyB0aGUgaGFyZCANCi0gICAgICAgIC8vIGNvZGVkIFVSTHMgaGVyZSwgb3Igd2hldGhlciB3ZSBzaG91bGQgYmUgdXNpbmcgYSBjb25zdGFudCBmb3IgdGhlIA0KLSAgICAgICAgLy8gcHVycG9zZXMgb2YgdGhlIHRlc3QuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIikpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvUGFyYW1UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1BhcmFtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MGE1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvUGFyYW1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotLyoqDQotICogQSBzdWl0ZSBmb3Igc29tZSB0ZXN0cyBmb3Igc3BlY2lmaWMgYmVoYXZpb3IgaW4gdGhlIERpc3BhdGNoIHdpdGggDQotICogbnVsbCBhbmQgaW52YWxpZCBwYXJhbXMuDQotICovDQotcHVibGljIGNsYXNzIFBhcmFtVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShQYXJhbVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU29hcFBhcmFtV2l0aE1lc3NhZ2VNb2RlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIk15U2VydmljZSIpOw0KLSAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIk15UG9ydCIpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIA0KLSAgICAgICAgICAgICAgICBTb3VyY2UuY2xhc3MsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2UobnVsbCk7ICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7DQotICAgICAgICB9ICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gZm9yIHRoaXMgbnVsbCBwYXJhbSIsIGhhbmRsZWQpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEh0dHBQYXJhbVdpdGhQYXlsb2FkTW9kZSgpIHsNCi0gICAgICAgIC8vIGZpbGwgaW4gdGhpcyB0ZXN0IHdoZW4gd2UgYWRkIFhNTC9IVFRQIEJpbmRpbmcgc3VwcG9ydA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEh0dHBQYXJhbVdpdGhNZXNzYWdlTW9kZSgpIHsNCi0gICAgICAgIC8vIGZpbGwgaW4gdGhpcyB0ZXN0IHdoZW4gd2UgYWRkIFhNTC9IVFRQIEJpbmRpbmcgc3VwcG9ydCAgICAgICAgDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NBWFNvdXJjZURpc3BhdGNoVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TQVhTb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGY3MDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NBWFNvdXJjZURpc3BhdGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOw0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB0ZXN0cyB0aGUgSkFYLVdTIERpc3BhdGNoPFNvdXJjZT4gd2l0aCBjb250ZW50IGluIHZhcmlvdXMgDQotICogZm9ybXMgb2YgYSBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2UuDQotICovDQotcHVibGljIGNsYXNzIFNBWFNvdXJjZURpc3BhdGNoVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxJbnB1dEZhY3RvcnkgaW5wdXRGYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTQVhTb3VyY2VEaXNwYXRjaFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFN5bmNQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBTQVhTb3VyY2Ugb3V0IG9mIHRoZSBzdHJpbmcgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgIH0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFN5bmNNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotCQkNCi0gICAgICAgIC8vIENyZWF0ZSBhIFNBWFNvdXJjZSBvdXQgb2YgdGhlIHN0cmluZyBjb250ZW50DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgU291cmNlIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggTWVzc2FnZSBNb2RlIik7DQotCQlTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTb3VyY2U+IGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIG91dCBvZiB0aGUgc3RyaW5nIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVCb2R5Q29udGVudC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2tIYW5kbGVyKTsNCi0NCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lDQotICAgICAgICBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2tIYW5kbGVyKTsNCi0NCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQkJDQotICAgICAgICAvLyBTZXR1cCB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTb3VyY2U+IGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIG91dCBvZiB0aGUgc3RyaW5nIGNvbnRlbnQNCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICBTb3VyY2UgcmVxdWVzdCA9IG5ldyBTQVhTb3VyY2UoaW5wdXQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCwgY2FsbGJhY2tIYW5kbGVyKTsNCi0NCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGNhbGxiYWNrSGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrPFNvdXJjZT4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QsIGNhbGxiYWNrSGFuZGxlcik7DQotDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nUGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBTQVhTb3VyY2Ugb3V0IG9mIHRoZSBzdHJpbmcgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBSZXNwb25zZTxTb3VyY2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0NCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMocmVxdWVzdCk7DQotDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIFNBWFNvdXJjZSBvdXQgb2YgdGhlIHN0cmluZyBjb250ZW50DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0pOw0KLSAgICAgICAgU291cmNlIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIik7DQotICAgICAgICBSZXNwb25zZTxTb3VyY2U+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0NCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5UGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBTQVhTb3VyY2Ugb3V0IG9mIHRoZSBzdHJpbmcgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5TWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBTQVhTb3VyY2Ugb3V0IG9mIHRoZSBzdHJpbmcgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0ID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLQlkaXNwYXRjaC5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKGlucHV0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBPbmUgV2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkocmVxdWVzdCk7DQotCX0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRTQVhTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgKGludmFsaWQpIFNBWFNvdXJjZQ0KLSAgICAgICAgU291cmNlIHJlcXVlc3QgPSBuZXcgU0FYU291cmNlKCk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIldlYlNlcnZpY2VFeGNlcHRpb24gd2FzIGV4cGVjdGVkIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQSBXZWIgU2VydmljZSBFeGNlcHRpb24gd2FzIGV4cGVjdGVkOiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCwgYnV0IHJlY2VpdmVkOiIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkEgV2ViIFNlcnZpY2UgRXhjZXB0aW9uIHdhcyBleHBlY3RlZDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV2ViU2VydmljZUV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQsIGJ1dCByZWNlaXZlZDoiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIldlYlNlcnZpY2VFeGNlcHRpb24gd2FzIGV4cGVjdGVkIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQSBXZWIgU2VydmljZSBFeGNlcHRpb24gd2FzIGV4cGVjdGVkOiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIHdhcyBleHBlY3RlZCwgYnV0IHJlY2VpdmVkOiIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU09BUDEyRGlzcGF0Y2hUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU09BUDEyRGlzcGF0Y2hUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZmNjMDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NPQVAxMkRpc3BhdGNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHVzZXMgdGhlIEpBWC1XUyBEaXNwYXRjaCBBUEkgdG8gdGVzdCBzZW5kaW5nIGFuZCByZWNlaXZpbmcNCi0gKiBtZXNzYWdlcyB1c2luZyBTT0FQIDEuMi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU09BUDEyRGlzcGF0Y2hUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMiIsICJTT0FQMTJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoDQotICAgICAgICAgICAgImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU09BUDEyIiwgIlNPQVAxMlBvcnQiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUDEyUHJvdmlkZXJTZXJ2aWNlLlNPQVAxMlByb3ZpZGVyUG9ydCI7ICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVJlcXVlc3QgPSANCi0gICAgICAgICI8dGVzdDplY2hvU3RyaW5nIHhtbG5zOnRlc3Q9XCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMlwiPiIgKw0KLSAgICAgICAgIjx0ZXN0OmlucHV0PlNBTVBMRSBSRVFVRVNUIE1FU1NBR0U8L3Rlc3Q6aW5wdXQ+IiArDQotICAgICAgICAiPC90ZXN0OmVjaG9TdHJpbmc+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlSGVhZCA9IA0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGVcIj4iICsNCi0gICAgICAgICI8c29hcGVudjpIZWFkZXIgLz48c29hcGVudjpCb2R5PiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZUhlYWRfTXVzdFVuZGVyc3RhbmQgPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyPiIgKw0KLSAgICAgICAgIjxzb2FwZW52OmNvZGVIZWFkZXJTT0FQMTIgc29hcGVudjptdXN0VW5kZXJzdGFuZD1cInRydWVcIj4iICsNCi0gICAgICAgICI8Y29kZT5kZWZhdWx0PC9jb2RlPiIgKw0KLSAgICAgICAgIjwvc29hcGVudjpjb2RlSGVhZGVyU09BUDEyPiIgKw0KLSAgICAgICAgIjwvc29hcGVudjpIZWFkZXI+IiArDQotICAgICAgICAiPHNvYXBlbnY6Qm9keT4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVUYWlsID0gDQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZSA9IA0KLSAgICAgICAgc2FtcGxlRW52ZWxvcGVIZWFkICsgDQotICAgICAgICBzYW1wbGVSZXF1ZXN0ICsgDQotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVfTXVzdFVuZGVyc3RhbmQgPSANCi0gICAgICAgIHNhbXBsZUVudmVsb3BlSGVhZF9NdXN0VW5kZXJzdGFuZCArIA0KLSAgICAgICAgc2FtcGxlUmVxdWVzdCArIA0KLSAgICAgICAgc2FtcGxlRW52ZWxvcGVUYWlsOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNPQVAxMkRpc3BhdGNoVGVzdC5jbGFzcykpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBQQVlMT0FEIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTJEaXNwYXRjaFBheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgU291cmNlIG9iamVjdCB3aXRoIHRoZSBwYXlsb2FkIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIFBBWUxPQUQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZW52ZWxvcGUuDQotICAgICAgICBieXRlW10gYnl0ZXMgPSBzYW1wbGVSZXF1ZXN0LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VuZCB0aGUgU09BUCAxLjIgcmVxdWVzdA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsLiAgV2UgZXhwZWN0ZWQgY29udGVudCB0byBiZSByZXR1cm5lZC4iLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOyAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsLiAgV2UgZXhwZWN0ZWQgY29udGVudCB0byBiZSByZXR1cm5lZC4iLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7ICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzZW5kaW5nIGEgU09BUCAxLjIgcmVxdWVzdCBpbiBQQVlMT0FEIG1vZGUgdXNpbmcgU09BUC9KTVMNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQMTJKTVNEaXNwYXRjaFBheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLQkJc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKA0KLSAgICAgICAgICAgICAgICBRTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgU291cmNlIG9iamVjdCB3aXRoIHRoZSBwYXlsb2FkIGNvbnRlbnRzLiAgU2luY2UNCi0gICAgICAgIC8vIHdlJ3JlIGluIFBBWUxPQUQgbW9kZSwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZW52ZWxvcGUuDQotICAgICAgICBieXRlW10gYnl0ZXMgPSBzYW1wbGVSZXF1ZXN0LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VuZCB0aGUgU09BUCAxLjIgcmVxdWVzdA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsLiAgV2UgZXhwZWN0ZWQgY29udGVudCB0byBiZSByZXR1cm5lZC4iLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNlbmQgdGhlIFNPQVAgMS4yIHJlcXVlc3QNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsLiAgV2UgZXhwZWN0ZWQgY29udGVudCB0byBiZSByZXR1cm5lZC4iLCByZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0gICAgICAgIA0KLSAgICAgICAgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBBZ2Fpbiwgc2luY2Ugd2UncmUNCi0gICAgICAgIC8vIGluIFBBWUxPQUQgbW9kZSwgd2Ugc2hvdWxkbid0IGhhdmUgYW55dGhpbmcgcmVsYXRlZCB0byB0aGUgZW52ZWxvcGUNCi0gICAgICAgIC8vIGluIHRoZSByZXR1cm4sIGp1c3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBCb2R5Lg0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotDQotICAgIH0NCi0gICAgDQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNlbmRpbmcgYSBTT0FQIDEuMiByZXF1ZXN0IGluIE1FU1NBR0UgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVAxMkRpc3BhdGNoTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywgTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBTb3VyY2Ugb2JqZWN0IHdpdGggdGhlIG1lc3NhZ2UgY29udGVudHMuICBTaW5jZQ0KLSAgICAgICAgLy8gd2UncmUgaW4gTUVTU0FHRSBtb2RlLCB3ZSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjcmVhdGUgdGhpcw0KLSAgICAgICAgLy8gd2l0aCB0aGUgcmlnaHQgcHJvdG9jb2wuDQotICAgICAgICBieXRlW10gYnl0ZXMgPSBzYW1wbGVFbnZlbG9wZS5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzcG9uc2UgdG8gYSBtb3JlIGNvbnN1bWFibGUgZm9ybWF0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLSAgICAgICAgDQotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotICAgICAgICB0cmFucy50cmFuc2Zvcm0ocmVzcG9uc2UsIHJlc3VsdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2UgYXJlIGNvcnJlY3QNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIHJldHVybmVkIGhhZCB0aGUgcmlnaHQgcHJvdG9jb2wgdmVyc2lvbg0KLSAgICAgICAgLy8gVE9ETzogTmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBoYXJkIA0KLSAgICAgICAgLy8gY29kZWQgVVJMcyBoZXJlLCBvciB3aGV0aGVyIHdlIHNob3VsZCBiZSB1c2luZyBhIGNvbnN0YW50IGZvciB0aGUgDQotICAgICAgICAvLyBwdXJwb3NlcyBvZiB0aGUgdGVzdC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3BvbnNlIHRvIGEgbW9yZSBjb25zdW1hYmxlIGZvcm1hdA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7DQotICAgICAgICANCi0gICAgICAgIGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHJlc3BvbnNlLCByZXN1bHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIGFyZSBjb3JyZWN0DQotICAgICAgICByZXNwb25zZVRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBtZXNzYWdlIHJldHVybmVkIGhhZCB0aGUgcmlnaHQgcHJvdG9jb2wgdmVyc2lvbg0KLSAgICAgICAgLy8gVE9ETzogTmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBoYXJkIA0KLSAgICAgICAgLy8gY29kZWQgVVJMcyBoZXJlLCBvciB3aGV0aGVyIHdlIHNob3VsZCBiZSB1c2luZyBhIGNvbnN0YW50IGZvciB0aGUgDQotICAgICAgICAvLyBwdXJwb3NlcyBvZiB0aGUgdGVzdC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNlbmRpbmcgYSBTT0FQIDEuMiByZXF1ZXN0IGluIE1FU1NBR0UgbW9kZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVAxMkRpc3BhdGNoTWVzc2FnZU1vZGVfTXVzdFVuZGVyc3RhbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywgTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBTb3VyY2Ugb2JqZWN0IHdpdGggdGhlIG1lc3NhZ2UgY29udGVudHMuICBTaW5jZQ0KLSAgICAgICAgLy8gd2UncmUgaW4gTUVTU0FHRSBtb2RlLCB3ZSdsbCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjcmVhdGUgdGhpcw0KLSAgICAgICAgLy8gd2l0aCB0aGUgcmlnaHQgcHJvdG9jb2wuDQotICAgICAgICBieXRlW10gYnl0ZXMgPSBzYW1wbGVFbnZlbG9wZV9NdXN0VW5kZXJzdGFuZC5nZXRCeXRlcygpOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgcmVxdWVzdCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgZSA9IGV4Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJXZSBzaG91bGQgaGF2ZSBhbiBleGNlcHRpb24sIGJ1dCBub25lIHdhcyB0aHJvd24uIiwgZSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIkZhdWx0Q29kZSBzaG91bGQgYmUgXCJNdXN0VW5kZXJzdGFuZFwiIiwgIk11c3RVbmRlcnN0YW5kIiwgZS5nZXRGYXVsdCgpLmdldEZhdWx0Q29kZUFzUU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsNCi0gICAgICAgIA0KLSAgICAgICAgZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGUgPSBleDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2Ugc2hvdWxkIGhhdmUgYW4gZXhjZXB0aW9uLCBidXQgbm9uZSB3YXMgdGhyb3duLiIsIGUpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGYXVsdENvZGUgc2hvdWxkIGJlIFwiTXVzdFVuZGVyc3RhbmRcIiIsICJNdXN0VW5kZXJzdGFuZCIsIGUuZ2V0RmF1bHQoKS5nZXRGYXVsdENvZGVBc1FOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU09BUE1lc3NhZ2VEaXNwYXRjaFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU09BUE1lc3NhZ2VEaXNwYXRjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmUwODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1NPQVBNZXNzYWdlRGlzcGF0Y2hUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2g7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlRGlzcGF0Y2hUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQlwcml2YXRlIFN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1Byb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UuRG9jTGl0V3JhcHBlZFByb3h5SW1wbFBvcnQiOw0KLQlwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKA0KLQkJCSJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgIlByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UiKTsNCi0JcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsDQotCSJQcm94eURvY0xpdFdyYXBwZWRQb3J0Iik7DQotCQ0KLQlTdHJpbmcgbWVzc2FnZVJlc291cmNlID0gInRlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICArICJ4bWwiICsgRmlsZS5zZXBhcmF0b3IgKyJzb2FwbWVzc2FnZS54bWwiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNPQVBNZXNzYWdlRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQTWVzc2FnZVN5bmNNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGJhc2VkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VSZXNvdXJjZSA9IG5ldyBGaWxlKGJhc2VkaXIsIHRoaXMubWVzc2FnZVJlc291cmNlKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIC8vSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIHVybCk7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIC8vQ3JlYXRlIFNPQVBNZXNzYWdlIE9iamVjdCBubyBhdHRhY2htZW50cyBoZXJlLg0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtZXNzYWdlUmVzb3VyY2UpOw0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtc2dPYmplY3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICAgICAgLy9JbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgQXN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKG1zZ09iamVjdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIHJlc3BvbnNlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIEFzeW5jIERpc3BhdGNoIik7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShtc2dPYmplY3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQTWVzc2FnZUFzeW5jQ2FsbGJhY2tNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGJhc2VkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VSZXNvdXJjZSA9IG5ldyBGaWxlKGJhc2VkaXIsIHRoaXMubWVzc2FnZVJlc291cmNlKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIC8vSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIHVybCk7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgIC8vQ3JlYXRlIFNPQVBNZXNzYWdlIE9iamVjdCBubyBhdHRhY2htZW50cyBoZXJlLg0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtZXNzYWdlUmVzb3VyY2UpOw0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtc2dPYmplY3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgaW5wdXRTdHJlYW0pOw0KLQ0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTT0FQTWVzc2FnZT4gYWMgPSBuZXcgQXN5bmNDYWxsYmFjazxTT0FQTWVzc2FnZT4oKTsNCi0gICAgICAgIC8vSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMobXNnT2JqZWN0LCBhYyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2VBc3luYyByZXR1cm5lZCBudWxsIEZ1dHVyZTw/PiIsIG1vbml0b3IpOw0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBhYy5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIGFjID0gbmV3IEFzeW5jQ2FsbGJhY2s8U09BUE1lc3NhZ2U+KCk7DQotICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMobXNnT2JqZWN0LCBhYyk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2VBc3luYyByZXR1cm5lZCBudWxsIEZ1dHVyZTw/PiIsIG1vbml0b3IpOw0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmVzcG9uc2UgPSBhYy5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICByZXNwb25zZS53cml0ZVRvKFN5c3RlbS5vdXQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQTWVzc2FnZUFzeW5jUG9sbGluZ01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotICAgICAgICBTdHJpbmcgYmFzZWRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICBTdHJpbmcgbWVzc2FnZVJlc291cmNlID0gbmV3IEZpbGUoYmFzZWRpciwgdGhpcy5tZXNzYWdlUmVzb3VyY2UpLmdldEFic29sdXRlUGF0aCgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgLy9Jbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgdXJsKTsNCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgLy9DcmVhdGUgU09BUE1lc3NhZ2UgT2JqZWN0IG5vIGF0dGFjaG1lbnRzIGhlcmUuDQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1lc3NhZ2VSZXNvdXJjZSk7DQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFNPQVBNZXNzYWdlIG1zZ09iamVjdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBpbnB1dFN0cmVhbSk7DQotDQotICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICBSZXNwb25zZTxTT0FQTWVzc2FnZT4gYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKG1zZ09iamVjdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2VBc3luYyByZXR1cm5lZCBudWxsIFJlc3BvbnNlIiwgYXN5bmNSZXNwb25zZSk7DQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIHJlc3BvbnNlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKG1zZ09iamVjdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2VBc3luYyByZXR1cm5lZCBudWxsIFJlc3BvbnNlIiwgYXN5bmNSZXNwb25zZSk7DQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIHJlc3BvbnNlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1N0cmVhbVNvdXJjZURpc3BhdGNoVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TdHJlYW1Tb3VyY2VEaXNwYXRjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZmExY2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL1N0cmVhbVNvdXJjZURpc3BhdGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIEpBWC1XUyBEaXNwYXRjaDxTb3VyY2U+IGZ1bmN0aW9uYWxpdHkgd2l0aCB2YXJpb3VzDQotICogZm9ybXMgb2YgYSBTdHJlYW1Tb3VyY2Ugb2JqZWN0LiANCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTdHJlYW1Tb3VyY2VEaXNwYXRjaFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgDQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU3RyZWFtU291cmNlRGlzcGF0Y2hUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotCS8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTb3VyY2U+IHN5bmNocm9ub3VzbHkgd2l0aCB0aGUgY29udGVudCBpbiBQQVlMT0FEIG1vZGUuDQotCSAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0JCXN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0JCURpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywgDQotICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0JCQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoPFNvdXJjZT4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggUEFZTE9BRCBtb2RlIik7DQotCQlTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2Uoc3JjU3RyZWFtKTsNCi0JCWFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOyAgICAgDQotDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxTb3VyY2U+DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIFBBWUxPQUQgbW9kZSIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2Uoc3JjU3RyZWFtKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihyZXNwb25zZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2VUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZVRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7ICAgICAgIA0KLQl9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTb3VyY2U+IHN5bmNocm9ub3VzbHkgd2l0aCB0aGUgY29udGVudCBpbiBNRVNTQUdFIG1vZGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY01lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotCQlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0JCXN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0JCURpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywNCi0JCQkJTW9kZS5NRVNTQUdFKTsNCi0JCQ0KLQkJLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggd2l0aCBNRVNTQUdFIE1vZGUiKTsNCi0JCVN0cmVhbVNvdXJjZSByZXNwb25zZSA9IChTdHJlYW1Tb3VyY2UpIGRpc3BhdGNoLmludm9rZShzcmNTdHJlYW0pOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOyAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggd2l0aCBNRVNTQUdFIE1vZGUiKTsNCi0gICAgICAgIHJlc3BvbnNlID0gKFN0cmVhbVNvdXJjZSkgZGlzcGF0Y2guaW52b2tlKHNyY1N0cmVhbSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsgIA0KLQl9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTb3VyY2U+IGFzeW5jaHJvbm91c2x5IHdpdGggdGhlIGNvbnRlbnQgaW4gUEFZTE9BRCBtb2RlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2FsbGJhY2tQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBTb3VyY2UuY2xhc3MsDQotICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gV2UnbGwgbmVlZCBhIGNhbGxiYWNrIGluc3RhbmNlIHRvIGhhbmRsZSB0aGUgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBBc3luY0NhbGxiYWNrPFNvdXJjZT4gY2FsbGJhY2tIYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2s8U291cmNlPigpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBTdHJlYW1Tb3VyY2Ugd2l0aCB0aGUgZGVzaXJlZCBjb250ZW50DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTb3VyY2Ugc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIFBBWUxPQUQgbW9kZSIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhzcmNTdHJlYW0sIGNhbGxiYWNrSGFuZGxlcik7DQotDQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQNCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggUEFZTE9BRCBtb2RlIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoc3JjU3RyZWFtLCBjYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2tIYW5kbGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U291cmNlPiBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBjb250ZW50IGluIE1FU1NBR0UgbW9kZS4NCi0gICAgICovDQotCXB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0JCXN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gV2UnbGwgbmVlZCBhIGNhbGxiYWNrIGluc3RhbmNlIHRvIGhhbmRsZSB0aGUgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBBc3luY0NhbGxiYWNrPFNvdXJjZT4gY2FsbGJhY2tIYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2s8U291cmNlPigpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLQkJU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBNRVNTQUdFIG1vZGUiKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoc3JjU3RyZWFtLCBjYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFzeW5jIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGNhbGxiYWNrSGFuZGxlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gV2UnbGwgbmVlZCBhIGNhbGxiYWNrIGluc3RhbmNlIHRvIGhhbmRsZSB0aGUgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBjYWxsYmFja0hhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjazxTb3VyY2U+KCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBTdHJlYW1Tb3VyY2Ugd2l0aCB0aGUgZGVzaXJlZCBjb250ZW50DQotICAgICAgICBieXRlcyA9IERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZS5nZXRCeXRlcygpOw0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBNRVNTQUdFIG1vZGUiKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhzcmNTdHJlYW0sIGNhbGxiYWNrSGFuZGxlcik7DQotDQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQNCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmVzcG9uc2UgPSBjYWxsYmFja0hhbmRsZXIuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTb3VyY2U+IGFzeW5jaHJvbm91c2x5IHdpdGggdGhlIGNvbnRlbnQgaW4gUEFZTE9BRCBtb2RlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9sbGluZ1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIFNvdXJjZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBQQVlMT0FEIG1vZGUiKTsNCi0gICAgICAgIFJlc3BvbnNlPFNvdXJjZT4gYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHNyY1N0cmVhbSk7DQotDQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQNCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZSBjb250ZW50IGZvciBjaGVja2luZw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggUEFZTE9BRCBtb2RlIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoc3JjU3RyZWFtKTsNCi0NCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhc3luYyByZXNwb25zZSB0byBiZSByZXR1cm5lZA0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVzcG9uc2UpOw0KLSAgICAgICAgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHJlc3BvbnNlVGV4dCA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2VUZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZVRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgRGlzcGF0Y2g8U291cmNlPiBhc3luY2hyb25vdXNseSB3aXRoIHRoZSBjb250ZW50IGluIE1FU1NBR0UgbW9kZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cyANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICBNb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU3RyZWFtU291cmNlIHdpdGggdGhlIGRlc2lyZWQgY29udGVudA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLmdldEJ5dGVzKCk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2ggd2l0aCBNRVNTQUdFIG1vZGUiKTsNCi0gICAgICAgIFJlc3BvbnNlPFNvdXJjZT4gYXN5bmNSZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZUFzeW5jKHNyY1N0cmVhbSk7DQotDQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXN5bmMgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQNCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggTUVTU0FHRSBtb2RlIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoc3JjU3RyZWFtKTsNCi0NCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhc3luYyByZXNwb25zZSB0byBiZSByZXR1cm5lZA0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0NCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHJlc3BvbnNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZVRleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlVGV4dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVRleHQuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIERpc3BhdGNoPFNvdXJjZT4gb25lLXdheSBvcGVyYXRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXlQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgU291cmNlLmNsYXNzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBTdHJlYW1Tb3VyY2Ugd2l0aCB0aGUgZGVzaXJlZCBjb250ZW50DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQuZ2V0Qnl0ZXMoKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBTb3VyY2Ugc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgT25lIFdheSBEaXNwYXRjaCIpOw0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlT25lV2F5KHNyY1N0cmVhbSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIE9uZSBXYXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShzcmNTdHJlYW0pOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TdHJpbmdEaXNwYXRjaFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvU3RyaW5nRGlzcGF0Y2hUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDE1OTYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9TdHJpbmdEaXNwYXRjaFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotcHVibGljIGNsYXNzIFN0cmluZ0Rpc3BhdGNoVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTdHJpbmdEaXNwYXRjaFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0JDQotCS8qKg0KLSAgICAgKiBJbnZva2UgYSBzeW5jIERpc3BhdGNoPFN0cmluZz4gaW4gUEFZTE9BRCBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIik7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLQl9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlIGEgc3luYyBEaXNwYXRjaDxTdHJpbmc+IGluIFBBWUxPQUQgbW9kZQ0KLSAgICAgKiBTZXJ2ZXIgcmVzcG9uc2Ugd2l0aCBleGNlcHRpb24uICBTZWN0aW9uIDQuMy4yDQotICAgICAqIHNheXMgd2Ugc2hvdWxkIGdldCBhIFByb3RvY29sRXhjZXB0aW9uLCBub3QgYQ0KLSAgICAgKiBXZWJTZXJ2aWNlRXhjZXB0aW9uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFN5bmNQYXlsb2FkTW9kZV9leGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBUaGUgX2JhZCBzdHJpbmcgcGFzc2VzICJUSFJPVyBFWENFUFRJT04iLCB3aGljaCBjYXVzZXMgdGhlIGVjaG8gZnVuY3Rpb24gb24gdGhlDQotICAgICAgICAgICAgLy8gc2VydmVyIHRvIHRocm93IGEgUnVudGltZUV4Y2VwdGlvbi4gIFdlIHNob3VsZCBnZXQgYSBQcm90b2NvbEV4Y2VwdGlvbiBoZXJlIG9uIHRoZSBjbGllbnQNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50X2JhZCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJObyBleGNlcHRpb24gcmVjZWl2ZWQiLCBlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIidlJyBzaG91bGQgYmUgb2YgdHlwZSBQcm90b2NvbEV4Y2VwdGlvbiIsIGUgaW5zdGFuY2VvZiBQcm90b2NvbEV4Y2VwdGlvbik7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIFRoZSBfYmFkIHN0cmluZyBwYXNzZXMgIlRIUk9XIEVYQ0VQVElPTiIsIHdoaWNoIGNhdXNlcyB0aGUgZWNobyBmdW5jdGlvbiBvbiB0aGUNCi0gICAgICAgICAgICAvLyBzZXJ2ZXIgdG8gdGhyb3cgYSBSdW50aW1lRXhjZXB0aW9uLiAgV2Ugc2hvdWxkIGdldCBhIFByb3RvY29sRXhjZXB0aW9uIGhlcmUgb24gdGhlIGNsaWVudA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnRfYmFkKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGUgPSBleDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIk5vIGV4Y2VwdGlvbiByZWNlaXZlZCIsIGUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiJ2UnIHNob3VsZCBiZSBvZiB0eXBlIFByb3RvY29sRXhjZXB0aW9uIiwgZSBpbnN0YW5jZW9mIFByb3RvY29sRXhjZXB0aW9uKTsNCi0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIHN5bmMgRGlzcGF0Y2g8U3RyaW5nPiBpbiBNRVNTQUdFIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jV2l0aE1lc3NhZ2VNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotCX0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTdHJpbmc+IHVzaW5nIHRoZSBhc3luYyBjYWxsYmFjayBBUEkgaW4gUEFZTE9BRCBtb2RlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja1BheWxvYWRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgQXN5bmNDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2s8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50LCBjYWxsYmFjayk7DQotCSAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGNhbGxiYWNrLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2s8U3RyaW5nPigpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChjYWxsYmFjaykgRGlzcGF0Y2giKTsNCi0gICAgICAgIG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQsIGNhbGxiYWNrKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gY2FsbGJhY2suZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0JfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIERpc3BhdGNoPFN0cmluZz4gdXNpbmcgdGhlIGFzeW5jIGNhbGxiYWNrIEFQSSBpbiBNRVNTQUdFIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrTWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBBc3luY0NhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2sgPSBuZXcgQXN5bmNDYWxsYmFjazxTdHJpbmc+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UsIGNhbGxiYWNrKTsNCi0gICAgDQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGNhbGxiYWNrLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBmb3IgYXN5bmMgcmVzcG9uc2VzDQotICAgICAgICBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrPFN0cmluZz4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggTWVzc2FnZSBNb2RlIik7DQotICAgICAgICBtb25pdG9yID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlLCBjYWxsYmFjayk7DQotICAgIA0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGNhbGxiYWNrLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotCX0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTdHJpbmc+IHVzaW5nIHRoZSBhc3luYyBwb2xsaW5nIEFQSSBpbiBQQVlMT0FEIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdQYXlsb2FkTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBSZXNwb25zZTxTdHJpbmc+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZWNob1N0cmluZ1Jlc3BvbnNlIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAocG9sbGluZykgRGlzcGF0Y2giKTsNCi0gICAgICAgIGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgd2hpbGUgKCFhc3luY1Jlc3BvbnNlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbnZva2UgYSBEaXNwYXRjaDxTdHJpbmc+IHVzaW5nIHRoZSBhc3luYyBwb2xsaW5nIEFQSSBpbiBNRVNTQUdFIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdNZXNzYWdlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIHdpdGggTWVzc2FnZSBNb2RlIik7DQotICAgICAgICBSZXNwb25zZTxTdHJpbmc+IGFzeW5jUmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2VBc3luYyhEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UpOw0KLSAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIHdpdGggTWVzc2FnZSBNb2RlIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0gICAgDQotICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlID0gYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsNCi0gICAgfQ0KLQkNCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIERpc3BhdGNoPFN0cmluZz4gb25lLXdheSBpbiBQQVlMT0FEIG1vZGUgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5UGF5bG9hZE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIG9uZS13YXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludm9rZSBhIERpc3BhdGNoPFN0cmluZz4gb25lLXdheSBpbiBNRVNTQUdFIG1vZGUgDQotCSAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5TWVzc2FnZU1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5VUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIG9uZS13YXkgRGlzcGF0Y2giKTsNCi0gICAgICAgIGRpc3BhdGNoLmludm9rZU9uZVdheShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlU29hcE1lc3NhZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBvbmUtd2F5IERpc3BhdGNoIik7DQotICAgICAgICBkaXNwYXRjaC5pbnZva2VPbmVXYXkoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZVNvYXBNZXNzYWdlKTsNCi0JfQ0KLSAgICANCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jUGF5bG9hZE1vZGVfYmFkSG9zdE5hbWUoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIEpBWC1XUyBjbGllbnQgYXJ0aWZhY3RzDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCBudWxsLCBEaXNwYXRjaFRlc3RDb25zdGFudHMuQkFEVVJMKTsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgVGhyb3dhYmxlIHR0ZW1wID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0IGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgdHRlbXAgPSB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0dGVtcCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaA0KLSAgICAgICAgdHRlbXAgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShEaXNwYXRjaFRlc3RDb25zdGFudHMuc2FtcGxlQm9keUNvbnRlbnQpOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB0dGVtcCA9IHQ7DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnROb3ROdWxsKHR0ZW1wKTsNCi0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2FsbGJhY2tNZXNzYWdlTW9kZV9iYWRIb3N0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBKQVgtV1MgY2xpZW50IGFydGlmYWN0cw0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzdmMuYWRkUG9ydChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgbnVsbCwgRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLkJBRFVSTCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKERpc3BhdGNoVGVzdENvbnN0YW50cy5RTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIGNhbGxiYWNrIGZvciBhc3luYyByZXNwb25zZXMNCi0gICAgICAgIEFzeW5jQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrPFN0cmluZz4oKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBhc3luYyAoY2FsbGJhY2spIERpc3BhdGNoIHdpdGggTWVzc2FnZSBNb2RlIik7DQotICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSwgY2FsbGJhY2spOw0KLSAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGNhbGxiYWNrLmhhc0Vycm9yKCkpIHsNCi0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGNhbGxiYWNrLmdldEVycm9yKCk7DQotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgRXhlY3V0aW9uRXhjZXB0aW9uIiwgdCBpbnN0YW5jZW9mIEV4ZWN1dGlvbkV4Y2VwdGlvbik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gdC5nZXRDYXVzZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlRoZXJlIG11c3QgYmUgYSBjYXVzZSB1bmRlciB0aGUgRXhlY3V0aW9uRXhjZXB0aW9uIiwgY2F1c2UpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY2F1c2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgV2ViU2VydmljZUV4Y2VwdGlvbiIgLGNhdXNlIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGhyb3dhYmxlIGhvc3RFeGNlcHRpb24gPSB0LmdldENhdXNlKCkuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGVyZSBtdXN0IGJlIGEgY2F1c2UgdW5kZXIgdGhlIFdlYlNlcnZpY2VFeGNlcHRpb24iLCBob3N0RXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGhvc3RFeGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgVW5rbm93bkhvc3RFeGNlcHRpb24iLCBob3N0RXhjZXB0aW9uIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmYWlsKCJObyBmYXVsdCB0aHJvd24uICBTaG91bGQgaGF2ZSByZXRyaWV2ZWQgYW4gVW5rbm93bkhvc3RFeGNlcHRpb24gZnJvbSBjYWxsYmFjayIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgY2FsbGJhY2sgZm9yIGFzeW5jIHJlc3BvbnNlcw0KLSAgICAgICAgY2FsbGJhY2sgPSBuZXcgQXN5bmNDYWxsYmFjazxTdHJpbmc+KCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKGNhbGxiYWNrKSBEaXNwYXRjaCB3aXRoIE1lc3NhZ2UgTW9kZSIpOw0KLSAgICAgICAgbW9uaXRvciA9IGRpc3BhdGNoLmludm9rZUFzeW5jKERpc3BhdGNoVGVzdENvbnN0YW50cy5zYW1wbGVTb2FwTWVzc2FnZSwgY2FsbGJhY2spOw0KLSAgICANCi0gICAgICAgIHdoaWxlICghbW9uaXRvci5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGNhbGxiYWNrLmhhc0Vycm9yKCkpIHsNCi0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IGNhbGxiYWNrLmdldEVycm9yKCk7DQotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgRXhlY3V0aW9uRXhjZXB0aW9uIiwgdCBpbnN0YW5jZW9mIEV4ZWN1dGlvbkV4Y2VwdGlvbik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gdC5nZXRDYXVzZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlRoZXJlIG11c3QgYmUgYSBjYXVzZSB1bmRlciB0aGUgRXhlY3V0aW9uRXhjZXB0aW9uIiwgY2F1c2UpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY2F1c2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgV2ViU2VydmljZUV4Y2VwdGlvbiIgLGNhdXNlIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGhyb3dhYmxlIGhvc3RFeGNlcHRpb24gPSB0LmdldENhdXNlKCkuZ2V0Q2F1c2UoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGVyZSBtdXN0IGJlIGEgY2F1c2UgdW5kZXIgdGhlIFdlYlNlcnZpY2VFeGNlcHRpb24iLCBob3N0RXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGhvc3RFeGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgVW5rbm93bkhvc3RFeGNlcHRpb24iLCBob3N0RXhjZXB0aW9uIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBmYWlsKCJObyBmYXVsdCB0aHJvd24uICBTaG91bGQgaGF2ZSByZXRyaWV2ZWQgYW4gVW5rbm93bkhvc3RFeGNlcHRpb24gZnJvbSBjYWxsYmFjayIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb2xsaW5nUGF5bG9hZE1vZGVfYmFkSG9zdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgSkFYLVdTIGNsaWVudCBhcnRpZmFjdHMNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLlFOQU1FX1BPUlQsIG51bGwsIERpc3BhdGNoVGVzdENvbnN0YW50cy5CQURVUkwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChEaXNwYXRjaFRlc3RDb25zdGFudHMuUU5BTUVfUE9SVCwgDQotICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIGFzeW5jIChwb2xsaW5nKSBEaXNwYXRjaCIpOw0KLSAgICAgICAgUmVzcG9uc2U8U3RyaW5nPiBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgVGhyb3dhYmxlIHR0ZW1wID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5nZXQoKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0IGluc3RhbmNlb2YgRXhlY3V0aW9uRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodC5nZXRDYXVzZSgpLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgdHRlbXAgPSB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0dGVtcCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgYXN5bmMgKHBvbGxpbmcpIERpc3BhdGNoIik7DQotICAgICAgICBhc3luY1Jlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlQXN5bmMoRGlzcGF0Y2hUZXN0Q29uc3RhbnRzLnNhbXBsZUJvZHlDb250ZW50KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOw0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgdHRlbXAgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBhc3luY1Jlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHQgaW5zdGFuY2VvZiBFeGVjdXRpb25FeGNlcHRpb24pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKTsNCi0gICAgICAgICAgICB0dGVtcCA9IHQ7DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnROb3ROdWxsKHR0ZW1wKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9NRVRBLUlORi9PTUVsZW1lbnRQcm92aWRlclNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvTUVUQS1JTkYvT01FbGVtZW50UHJvdmlkZXJTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTNmMjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9NRVRBLUlORi9PTUVsZW1lbnRQcm92aWRlclNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlQiDQotICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIiANCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlQiIA0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgIHhtbG5zOndzZGxzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgDQotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSA8d3NkbDp0eXBlcz4NCi0gIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlQiIA0KLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIiANCi0gICAgICAgIHhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvT01FTEVNRU5UIiANCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9PTUVsZW1lbnQiPg0KLSAgICA8Y29tcGxleFR5cGU+DQotICAgICA8c2VxdWVuY2U+DQotICAgICAgPGVsZW1lbnQgbmFtZT0iaW5wdXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPg0KLSAgICAgPC9zZXF1ZW5jZT4NCi0gICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotICAgPGVsZW1lbnQgbmFtZT0iZWNob09NRWxlbWVudFJlc3BvbnNlIj4NCi0gICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgPHNlcXVlbmNlPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9PTUVsZW1lbnRSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPg0KLSAgICAgPC9zZXF1ZW5jZT4NCi0gICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotICAgICAgICA8L3NjaGVtYT4NCi0gPC93c2RsOnR5cGVzPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob09NRWxlbWVudFJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImltcGw6ZWNob09NRWxlbWVudFJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvT01FbGVtZW50UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmVjaG9PTUVsZW1lbnQiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJFY2hvIj4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob09NRWxlbWVudCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDplY2hvT01FbGVtZW50UmVxdWVzdCIgbmFtZT0iZWNob09NRWxlbWVudFJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDplY2hvT01FbGVtZW50UmVzcG9uc2UiIG5hbWU9ImVjaG9PTUVsZW1lbnRSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iT01FbGVtZW50QmluZGluZyIgdHlwZT0iaW1wbDpFY2hvIj4NCi0NCi0gICAgICA8d3NkbHNvYXAxMjpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0NCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob09NRWxlbWVudCI+DQotDQotICAgICAgICAgPHdzZGxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9PTUVsZW1lbnRSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZWNob09NRWxlbWVudFJlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0gICA8L3dzZGw6YmluZGluZz4NCi0NCi0gICA8d3NkbDpzZXJ2aWNlIG5hbWU9Ik9NRWxlbWVudFByb3ZpZGVyU2VydmljZSI+DQotDQotICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbXBsOk9NRWxlbWVudEJpbmRpbmciIG5hbWU9Ik9NRWxlbWVudFByb3ZpZGVyUG9ydCI+DQotDQotICAgICAgICAgPHdzZGxzb2FwMTI6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL09NRWxlbWVudFByb3ZpZGVyU2VydmljZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpwb3J0Pg0KLQ0KLSAgIDwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL01FVEEtSU5GL1NPQVAxMlByb3ZpZGVyU2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9NRVRBLUlORi9TT0FQMTJQcm92aWRlclNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZTE1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL01FVEEtSU5GL1NPQVAxMlByb3ZpZGVyU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMiINCi0gICAgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiIA0KLSAgICB4bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMiIgDQotICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgeG1sbnM6d3NkbHNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIiANCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotIDx3c2RsOnR5cGVzPg0KLSAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVAxMiIgDQotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICAgICAgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiIA0KLSAgICAgICAgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9TT0FQMTIiIA0KLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyI+DQotICAgIDxjb21wbGV4VHlwZT4NCi0gICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpbnB1dCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgIDwvc2VxdWVuY2U+DQotICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDxjb21wbGV4VHlwZT4NCi0gICAgIDxzZXF1ZW5jZT4NCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgPC9zZXF1ZW5jZT4NCi0gICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotICAgDQotICAgPCEtLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4NCi0gICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgPHNlcXVlbmNlPg0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdJbnB1dCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgIDwvc2VxdWVuY2U+DQotICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLSAgIC0tPg0KLSAgICAgICAgPC9zY2hlbWE+DQotIDwvd3NkbDp0eXBlcz4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmVjaG9TdHJpbmdSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDplY2hvU3RyaW5nIiBuYW1lPSJwYXJhbWV0ZXJzIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iRWNobyI+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6ZWNob1N0cmluZ1JlcXVlc3QiIG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IlNPQVAxMkJpbmRpbmciIHR5cGU9ImltcGw6RWNobyI+DQotDQotICAgICAgPHdzZGxzb2FwMTI6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJlY2hvU3RyaW5nUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgPC93c2RsOmJpbmRpbmc+DQotDQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJTT0FQMTJQcm92aWRlclNlcnZpY2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpTT0FQMTJCaW5kaW5nIiBuYW1lPSJTT0FQMTJQcm92aWRlclBvcnQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDEyOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9TT0FQMTJTZXJ2aWNlIi8+DQotDQotICAgICAgPC93c2RsOnBvcnQ+DQotDQotICAgPC93c2RsOnNlcnZpY2U+DQotDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvT01FbGVtZW50UHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaC9zZXJ2ZXIvT01FbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzOTA3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL09NRWxlbWVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaC5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5sbG9tLnNvYXAxMi5TT0FQMTJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotDQotLyoqDQotICogQSBQcm92aWRlciZsdDtPTUVsZW1lbnQmZ3Q7IGltcGxlbWVudGF0aW9uIHVzZWQgdG8gdGVzdCBzZW5kaW5nIGFuZCANCi0gKiByZWNlaXZpbmcgU09BUCAxLjIgbWVzc2FnZXMuDQotICovDQotQFdlYlNlcnZpY2VQcm92aWRlcigNCi0gICAgICAgIHNlcnZpY2VOYW1lPSJPTUVsZW1lbnRQcm92aWRlclNlcnZpY2UiLCANCi0gICAgICAgIHdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvT01FbGVtZW50UHJvdmlkZXJTZXJ2aWNlLndzZGwiLCANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlQiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBPTUVsZW1lbnRQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPE9NRWxlbWVudD4gew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVJlc3BvbnNlID0gDQotICAgICAgICAiPHRlc3Q6ZWNob09NRWxlbWVudCB4bWxuczp0ZXN0PVwiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdC9PTUVMRU1FTlRcIj4iICsNCi0gICAgICAgICI8dGVzdDppbnB1dD5TQU1QTEUgUkVTUE9OU0UgTUVTU0FHRTwvdGVzdDppbnB1dD4iICsNCi0gICAgICAgICI8L3Rlc3Q6ZWNob09NRWxlbWVudD4iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICANCi0gICAgcHVibGljIE9NRWxlbWVudCBpbnZva2UoT01FbGVtZW50IG9iaikgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1JS0U6ICIgKyBvYmoudG9TdHJpbmdXaXRoQ29uc3VtZSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNSUtFOiBQUk9CTEVNIik7DQotICAgICAgICB9DQotICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZVBheWxvYWQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTT0FQMTJGYWN0b3J5KCk7DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gZmFjdG9yeS5jcmVhdGVTT0FQRW52ZWxvcGUoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBmYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KGVudik7DQotICAgICAgICANCi0gICAgICAgIGJvZHkuYWRkQ2hpbGQocGF5bG9hZCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBlbnY7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZVBheWxvYWQoKSB7DQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7DQotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0L1NPQVBFTlZFTE9QRSIsICJ0ZXN0Iik7DQotICAgICAgICANCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG9PTUVsZW1lbnQiLCBvbU5zKTsNCi0gICAgICAgIA0KLSAgICAgICAgT01FbGVtZW50IG91dHB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm91dHB1dCIsIG9tTnMpOw0KLSAgICAgICAgcmVzcG9uc2UuYWRkQ2hpbGQob3V0cHV0KTsNCi0gICAgICAgIA0KLSAgICAgICAgT01FbGVtZW50IGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7DQotICAgICAgICBvdXRwdXQuYWRkQ2hpbGQoZGF0YSk7DQotICAgICAgICANCi0gICAgICAgIE9NVGV4dCBiaW5hcnlEYXRhID0gZmFjLmNyZWF0ZU9NVGV4dCgiU0FNUExFIFJFU1BPTlNFIE1FU1NBR0UiKTsNCi0gICAgICAgIGRhdGEuYWRkQ2hpbGQoYmluYXJ5RGF0YSk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL1NPQVAxMlByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2gvc2VydmVyL1NPQVAxMlByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYTBkMWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rpc3BhdGNoL3NlcnZlci9TT0FQMTJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaC5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLS8qKg0KLSAqIEEgUHJvdmlkZXImbHQ7U3RyaW5nJmd0OyBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHRlc3Qgc2VuZGluZyBhbmQgDQotICogcmVjZWl2aW5nIFNPQVAgMS4yIG1lc3NhZ2VzLg0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoDQotICAgICAgICBzZXJ2aWNlTmFtZT0iU09BUDEyUHJvdmlkZXJTZXJ2aWNlIiwgDQotICAgICAgICB3c2RsTG9jYXRpb249Ik1FVEEtSU5GL1NPQVAxMlByb3ZpZGVyU2VydmljZS53c2RsIiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU09BUDEyIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBTT0FQMTJQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlUmVzcG9uc2UgPSANCi0gICAgICAgICI8dGVzdDplY2hvU3RyaW5nUmVzcG9uc2UgeG1sbnM6dGVzdD1cImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU09BUDEyXCI+IiArDQotICAgICAgICAiPHRlc3Q6b3V0cHV0PlNBTVBMRSBSRVFVRVNUIE1FU1NBR0U8L3Rlc3Q6b3V0cHV0PiIgKw0KLSAgICAgICAgIjwvdGVzdDplY2hvU3RyaW5nUmVzcG9uc2U+IjsNCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiByZXF1ZXN0IHJlY2VpdmVkIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhvYmopOw0KLSAgICAgICAgcmV0dXJuIHNhbXBsZVJlc3BvbnNlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZyYW1ld29yay9BYnN0cmFjdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2QzOTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZyYW1ld29yay9BYnN0cmFjdFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yazsNCi0NCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCi0NCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHVibGljIEFic3RyYWN0VGVzdENhc2UoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogdXNlcnMgbWF5IHBhc3MgaW4gdGhlaXIgb3duIHJlcG9zaXRvcnlEaXIgcGF0aCBhbmQgcGF0aCB0byBjdXN0b20gY29uZmlndXJhdGlvbiBmaWxlLg0KLSAgICAgKiBQYXNzaW5nICdudWxsJyBmb3IgZWl0aGVyIHBhcmFtIHdpbGwgdXNlIHRoZSBkZWZhdWx0DQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFRlc3QgZ2V0VGVzdFNldHVwKFRlc3QgdGVzdCwgZmluYWwgU3RyaW5nIHJlcG9zaXRvcnlEaXIsIGZpbmFsIFN0cmluZyBheGlzMnhtbCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2V0dXAodGVzdCkgew0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTdGFydGluZyB0aGUgc2VydmVyIGZvcjogIiArdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyID0gbmV3IFN0YXJ0U2VydmVyKCJzZXJ2ZXIxIik7DQotICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyLnRlc3RTdGFydFNlcnZlcihyZXBvc2l0b3J5RGlyLCBheGlzMnhtbCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTdG9wcGluZyB0aGUgc2VydmVyIGZvcjogIiArdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFN0b3BTZXJ2ZXIgc3RvcFNlcnZlciA9IG5ldyBTdG9wU2VydmVyKCJzZXJ2ZXIxIik7DQotICAgICAgICAgICAgICAgIHN0b3BTZXJ2ZXIudGVzdFN0b3BTZXJ2ZXIoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBzdGF0aWMgVGVzdCBnZXRUZXN0U2V0dXAoVGVzdCB0ZXN0KSB7DQotICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cCh0ZXN0KSB7DQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgZm9yOiAiICt0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgU3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXIgPSBuZXcgU3RhcnRTZXJ2ZXIoInNlcnZlcjEiKTsNCi0gICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIudGVzdFN0YXJ0U2VydmVyKCk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTdG9wcGluZyB0aGUgc2VydmVyIGZvcjogIiArdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIFN0b3BTZXJ2ZXIgc3RvcFNlcnZlciA9IG5ldyBTdG9wU2VydmVyKCJzZXJ2ZXIxIik7DQotICAgICAgICAgICAgICAgIHN0b3BTZXJ2ZXIudGVzdFN0b3BTZXJ2ZXIoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvU3RhcnRTZXJ2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvU3RhcnRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2ZDZlNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL1N0YXJ0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yazsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuU2ltcGxlU2VydmVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdGFydFNlcnZlciBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIFN0YXJ0U2VydmVyKFN0cmluZyBuYW1lKSB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogdXNlcnMgbWF5IHBhc3MgaW4gdGhlaXIgb3duIHJlcG9zaXRvcnlEaXIgcGF0aCBhbmQgcGF0aCB0byBjdXN0b20gY29uZmlndXJhdGlvbiBmaWxlLg0KLSAgICAgKiBQYXNzaW5nICdudWxsJyBmb3IgZWl0aGVyIHBhcmFtIHdpbGwgdXNlIHRoZSBkZWZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRTZXJ2ZXIoU3RyaW5nIHJlcG9zaXRvcnlEaXIsIFN0cmluZyBheGlzMnhtbCkgew0KLSAgICAgICAgU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBTaW1wbGVTZXJ2ZXIocmVwb3NpdG9yeURpciwgYXhpczJ4bWwpOw0KLSAgICAgICAgc2VydmVyLnN0YXJ0KCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFNlcnZlcigpIHsNCi0gICAgICAgIFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgU2ltcGxlU2VydmVyKCk7DQotICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL1N0b3BTZXJ2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvU3RvcFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRjYmY1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mcmFtZXdvcmsvU3RvcFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcms7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNpbXBsZVNlcnZlcjsNCi0NCi1wdWJsaWMgY2xhc3MgU3RvcFNlcnZlciBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIFN0b3BTZXJ2ZXIoU3RyaW5nIG5hbWUpIHsNCi0gICAgICAgIHN1cGVyKG5hbWUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcFNlcnZlcigpIHsNCi0gICAgICAgIFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgU2ltcGxlU2VydmVyKCk7DQotICAgICAgICBzZXJ2ZXIuc3RvcCgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9EZW1vSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL0RlbW9IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTI3YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL0RlbW9IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaGVhZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBEZW1vSGFuZGxlciBpbXBsZW1lbnRzIFNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZW1vSGFuZGxlci5nZXRIZWFkZXJzIEludm9rZWQgYnkgSkFYV1MiKTsNCi0gICAgICAgIFNldDxRTmFtZT4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7DQotICAgICAgICByZXN1bHQuYWRkKG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIm15aGVhZGVyIikpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBhcmcwKSB7DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IGFyZzApIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IGFyZzApIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVtb0hhbmRsZXIuaGFuZGxlTWVzc2FnZSIpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL0RlbW9TZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvRGVtb1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YTZmNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvRGVtb1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5oZWFkZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJEZW1vU2VydmljZSIsDQotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6ZGVtby8iLA0KLQkJcG9ydE5hbWUgPSAiRGVtb1NlcnZpY2VQb3J0IikNCi1ASGFuZGxlckNoYWluKGZpbGU9ImhhbmRsZXIueG1sIikNCi1wdWJsaWMgY2xhc3MgRGVtb1NlcnZpY2Ugew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIG1zZykgIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVtb1NlcnZpY2UuZWNobyBjYWxsZWQgd2l0aCBtc2c6ICIgKyBtc2cpOw0KLSAgICAgICAgcmV0dXJuICJIZWxsbywgIiArIG1zZzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvRGVtb1NlcnZpY2VTZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvRGVtb1NlcnZpY2VTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTY2ZDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaGVhZGVyL01FVEEtSU5GL0RlbW9TZXJ2aWNlU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZW1vLyIgbmFtZT0iRGVtb1NlcnZpY2VTZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9kZW1vLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWE+DQotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZGVtby8iIHNjaGVtYUxvY2F0aW9uPSJEZW1vU2VydmljZVNlcnZpY2Vfc2NoZW1hMS54c2QiLz4NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG8iPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPHBvcnRUeXBlIG5hbWU9IkRlbW9TZXJ2aWNlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLSAgPGJpbmRpbmcgbmFtZT0iRGVtb1NlcnZpY2VQb3J0QmluZGluZyIgdHlwZT0idG5zOkRlbW9TZXJ2aWNlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotICA8c2VydmljZSBuYW1lPSJEZW1vU2VydmljZVNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJEZW1vU2VydmljZVBvcnQiIGJpbmRpbmc9InRuczpEZW1vU2VydmljZVBvcnRCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRGVtb1NlcnZpY2VTZXJ2aWNlIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9NRVRBLUlORi9EZW1vU2VydmljZVNlcnZpY2Vfc2NoZW1hMS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvRGVtb1NlcnZpY2VTZXJ2aWNlX3NjaGVtYTEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTJmZDhjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9NRVRBLUlORi9EZW1vU2VydmljZVNlcnZpY2Vfc2NoZW1hMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RlbW8vIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL2RlbW8vIj4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvIi8+DQotDQotICA8eHM6ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9InRuczplY2hvUmVzcG9uc2UiLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0gICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLQ0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+DQotICAgIDwveHM6c2VxdWVuY2U+DQotICA8L3hzOmNvbXBsZXhUeXBlPg0KLTwveHM6c2NoZW1hPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg1MmE4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c2VydmljZUdyb3VwPg0KLSA8c2VydmljZSBuYW1lPSJEZW1vU2VydmljZVNlcnZpY2UiPg0KLSAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5KQVhXU01lc3NhZ2VSZWNlaXZlciIvPg0KLSAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLSAgPHBhcmFtZXRlciBsb2NrZWQ9ImZhbHNlIiBuYW1lPSJTZXJ2aWNlQ2xhc3MiPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5oZWFkZXIuRGVtb1NlcnZpY2U8L3BhcmFtZXRlcj4NCi0gIDxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4NCi0gICAgPGFjdGlvbk1hcHBpbmcvPg0KLSAgPC9vcGVyYXRpb24+DQotICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiPg0KLSAgICA8YWN0aW9uTWFwcGluZy8+DQotICA8L29wZXJhdGlvbj4NCi0gPC9zZXJ2aWNlPg0KLTwvc2VydmljZUdyb3VwPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9oYW5kbGVyLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci9oYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZDljNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvaGFuZGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iZGVtbyI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPg0KLQkJCQlvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaGVhZGVyLkRlbW9IYW5kbGVyDQotCQkJPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCQk8andzOnNvYXAtcm9sZT5odHRwOi8vRGVtb0hhbmRsZXIvUm9sZTwvandzOnNvYXAtcm9sZT4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+CQ0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci90ZXN0cy9IYW5kbGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2hlYWRlci90ZXN0cy9IYW5kbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmNzE4NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9oZWFkZXIvdGVzdHMvSGFuZGxlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmhlYWRlci50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEhhbmRsZXJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyX2dldEhlYWRlcl9pbnZvY2F0aW9uKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIE9iamVjdCByZXM7DQotICAgICAgICAvL0FkZCBteUhlYWRlciB0byBTT0FQTWVzc2FnZSB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgYnkgaGFuZGxlci5nZXRIZWFkZXIoKS4NCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZSA9DQotICAgICAgICAgICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6ZGVtbz1cImh0dHA6Ly9kZW1vL1wiPjxzb2FwOkhlYWRlcj4gPGRlbW86bXloZWFkZXIgc29hcDptdXN0VW5kZXJzdGFuZD1cIjFcIi8+PC9zb2FwOkhlYWRlcj48c29hcDpCb2R5PjxkZW1vOmVjaG8+PGFyZzA+dGVzdDwvYXJnMD48L2RlbW86ZWNobz48L3NvYXA6Qm9keT48L3NvYXA6RW52ZWxvcGU+IjsNCi0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RlbW9TZXJ2aWNlLkRlbW9TZXJ2aWNlUG9ydCI7DQotICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVtby8iLCAiRGVtb1NlcnZpY2UiKTsNCi0gICAgICAgIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVtby8iLCAiRGVtb1NlcnZpY2VQb3J0Iik7DQotICAgICAgICAvL0NyZWF0ZSBTZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHMgPSBTZXJ2aWNlLmNyZWF0ZShuYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocyk7DQotICAgICAgICAvL2FkZCBwb3J0DQotICAgICAgICBzLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIHVybCk7DQotDQotICAgICAgICAvL0NyZWF0ZSBEaXNwYXRjaA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7DQotICAgICAgICByZXMgPSBkaXNwYXRjaC5pbnZva2Uoc29hcE1lc3NhZ2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXMpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X01VX0ZhaWx1cmUoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgLy9BZGQgYmFkIGhlYWRlciB0byBTT0FQTWVzc2FnZSwgd2UgZXhwZWN0IE1VIHRvIGZhaWwNCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZSA9DQotICAgICAgICAgICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6ZGVtbz1cImh0dHA6Ly9kZW1vL1wiPjxzb2FwOkhlYWRlcj4gPGRlbW86YmFkSGVhZGVyIHNvYXA6bXVzdFVuZGVyc3RhbmQ9XCIxXCIvPjwvc29hcDpIZWFkZXI+PHNvYXA6Qm9keT48ZGVtbzplY2hvPjxhcmcwPnRlc3Q8L2FyZzA+PC9kZW1vOmVjaG8+PC9zb2FwOkJvZHk+PC9zb2FwOkVudmVsb3BlPiI7DQotICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9EZW1vU2VydmljZS5EZW1vU2VydmljZVBvcnQiOw0KLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIkRlbW9TZXJ2aWNlIik7DQotICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIkRlbW9TZXJ2aWNlUG9ydCIpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvL0NyZWF0ZSBTZXJ2aWNlDQotICAgICAgICAgICAgU2VydmljZSBzID0gU2VydmljZS5jcmVhdGUobmFtZSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsNCi0gICAgICAgICAgICAvL2FkZCBwb3J0DQotICAgICAgICAgICAgcy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCB1cmwpOw0KLSAgICAgICAgICAgIC8vQ3JlYXRlIERpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9DQotICAgICAgICAgICAgICAgICAgICBzLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2Uoc29hcE1lc3NhZ2UpOw0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGV4cGVjdGVkIFNPQVBGYXVsdEV4Y2VwdGlvbiBmb3Igbm90IHVuZGVyc3Rvb2QgTXVzdFVuZGVyc3RhbmQgaGVhZGVyIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkdvdCBleHBlY3RlZCBTT0FQRmF1bHQiLCBlKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5pbmRleE9mKA0KLSAgICAgICAgICAgICAgICAgICAgIk11c3QgVW5kZXJzdGFuZCBjaGVjayBmYWlsZWQgZm9yIGhlYWRlciBzb2FwIDoge2h0dHA6Ly9kZW1vL31iYWRIZWFkZXIiKSAhPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk11c3RVbmRlcnN0YW5kIGZhaWxlZCBhcyBleHB0ZWN0ZWQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoYXQgYSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgd2l0aCBhIHNwZWNpZmljIFNPQVAgcm9sZSB0aGF0IHRoZSBlbmRwb2ludCBpcyBhY3RpbmcgaW4NCi0gICAgICogZG9lc24ndCBjYXVzZSBhIE5vdFVuZGVyc3Rvb2QgZmF1bHQgaWYgdGhlIGhlYWRlciBRTmFtZSBpcyBvbmUgdGhhdCB0aGUgaGFuZGxlciB1bmRlcnN0YW5kcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwUm9sZUFjdGVkSW4oKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgT2JqZWN0IHJlczsNCi0gICAgICAgIC8vQWRkIG15SGVhZGVyIHRvIFNPQVBNZXNzYWdlIHRoYXQgd2lsbCBiZSBpbmplY3RlZCBieSBoYW5kbGVyLmdldEhlYWRlcigpLg0KLSAgICAgICAgU3RyaW5nIHNvYXBNZXNzYWdlID0NCi0gICAgICAgICAgICAgICAgIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiB4bWxuczpkZW1vPVwiaHR0cDovL2RlbW8vXCI+PHNvYXA6SGVhZGVyPiA8ZGVtbzpteWhlYWRlciBzb2FwOmFjdG9yPVwiaHR0cDovL0RlbW9IYW5kbGVyL1JvbGVcIiBzb2FwOm11c3RVbmRlcnN0YW5kPVwiMVwiLz48L3NvYXA6SGVhZGVyPjxzb2FwOkJvZHk+PGRlbW86ZWNobz48YXJnMD50ZXN0PC9hcmcwPjwvZGVtbzplY2hvPjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4iOw0KLSAgICAgICAgU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRGVtb1NlcnZpY2UuRGVtb1NlcnZpY2VQb3J0IjsNCi0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZSIpOw0KLSAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZVBvcnQiKTsNCi0gICAgICAgIC8vQ3JlYXRlIFNlcnZpY2UNCi0gICAgICAgIFNlcnZpY2UgcyA9IFNlcnZpY2UuY3JlYXRlKG5hbWUpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsNCi0gICAgICAgIC8vYWRkIHBvcnQNCi0gICAgICAgIHMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgdXJsKTsNCi0NCi0gICAgICAgIC8vQ3JlYXRlIERpc3BhdGNoDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gcy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsNCi0gICAgICAgIHJlcyA9IGRpc3BhdGNoLmludm9rZShzb2FwTWVzc2FnZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoYXQgYSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgd2l0aCBhIHNwZWNpZmljIFNPQVAgcm9sZSB0aGF0IHRoZSBlbmRwb2ludCBpcyBhY3RpbmcgaW4NCi0gICAgICogZG9lc24ndCBjYXVzZSBhIE5vdFVuZGVyc3Rvb2QgZmF1bHQgaWYgdGhlIGhlYWRlciBRTmFtZSBpcyBvbmUgdGhhdCB0aGUgaGFuZGxlciB1bmRlcnN0YW5kcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwUm9sZU5vdEFjdGVkSW4oKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgT2JqZWN0IHJlczsNCi0gICAgICAgIC8vQWRkIG15SGVhZGVyIHRvIFNPQVBNZXNzYWdlIHRoYXQgd2lsbCBiZSBpbmplY3RlZCBieSBoYW5kbGVyLmdldEhlYWRlcigpLg0KLSAgICAgICAgU3RyaW5nIHNvYXBNZXNzYWdlID0NCi0gICAgICAgICAgICAgICAgIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiB4bWxuczpkZW1vPVwiaHR0cDovL2RlbW8vXCI+PHNvYXA6SGVhZGVyPiA8ZGVtbzpteWhlYWRlciBzb2FwOmFjdG9yPVwiaHR0cDovL0RlbW9IYW5kbGVyL05vdEFjdGVkSW5cIiBzb2FwOm11c3RVbmRlcnN0YW5kPVwiMVwiLz48L3NvYXA6SGVhZGVyPjxzb2FwOkJvZHk+PGRlbW86ZWNobz48YXJnMD50ZXN0PC9hcmcwPjwvZGVtbzplY2hvPjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4iOw0KLSAgICAgICAgU3RyaW5nIHVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRGVtb1NlcnZpY2UuRGVtb1NlcnZpY2VQb3J0IjsNCi0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZSIpOw0KLSAgICAgICAgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kZW1vLyIsICJEZW1vU2VydmljZVBvcnQiKTsNCi0gICAgICAgIC8vQ3JlYXRlIFNlcnZpY2UNCi0gICAgICAgIFNlcnZpY2UgcyA9IFNlcnZpY2UuY3JlYXRlKG5hbWUpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsNCi0gICAgICAgIC8vYWRkIHBvcnQNCi0gICAgICAgIHMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgdXJsKTsNCi0NCi0gICAgICAgIC8vQ3JlYXRlIERpc3BhdGNoDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gcy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsNCi0gICAgICAgIHJlcyA9IGRpc3BhdGNoLmludm9rZShzb2FwTWVzc2FnZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoYXQgYSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgd2l0aCBhIHNwZWNpZmljIFNPQVAgcm9sZSB0aGF0IHRoZSBlbmRwb2ludCBpcyBhY3RpbmcgaW4NCi0gICAgICogd2hpY2ggaGFzIGEgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHRoYXQgd2lsbCBub3QgYmUgcHJvY2Vzc2VkIGJ5IHRoZSBoYW5kbGVyIGNhdXNlcyBhIGZhdWx0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNvYXBSb2xlQWN0ZWRJbk5vdFVuZGVyc3Rvb2RGYXVsdCgpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAvL0FkZCBteUhlYWRlciB0byBTT0FQTWVzc2FnZSB0aGF0IHdpbGwgYmUgaW5qZWN0ZWQgYnkgaGFuZGxlci5nZXRIZWFkZXIoKS4NCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZSA9DQotICAgICAgICAgICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIgeG1sbnM6ZGVtbz1cImh0dHA6Ly9kZW1vL1wiPjxzb2FwOkhlYWRlcj4gPGRlbW86bXlOT1RVTkRFUlNUT09EaGVhZGVyIHNvYXA6YWN0b3I9XCJodHRwOi8vRGVtb0hhbmRsZXIvUm9sZVwiIHNvYXA6bXVzdFVuZGVyc3RhbmQ9XCIxXCIvPjwvc29hcDpIZWFkZXI+PHNvYXA6Qm9keT48ZGVtbzplY2hvPjxhcmcwPnRlc3Q8L2FyZzA+PC9kZW1vOmVjaG8+PC9zb2FwOkJvZHk+PC9zb2FwOkVudmVsb3BlPiI7DQotICAgICAgICBTdHJpbmcgdXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9EZW1vU2VydmljZS5EZW1vU2VydmljZVBvcnQiOw0KLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIkRlbW9TZXJ2aWNlIik7DQotICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2RlbW8vIiwgIkRlbW9TZXJ2aWNlUG9ydCIpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvL0NyZWF0ZSBTZXJ2aWNlDQotICAgICAgICAgICAgU2VydmljZSBzID0gU2VydmljZS5jcmVhdGUobmFtZSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzKTsNCi0gICAgICAgICAgICAvL2FkZCBwb3J0DQotICAgICAgICAgICAgcy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCB1cmwpOw0KLQ0KLSAgICAgICAgICAgIC8vQ3JlYXRlIERpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9DQotICAgICAgICAgICAgICAgICAgICBzLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2Uoc29hcE1lc3NhZ2UpOw0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgcmVjZWl2ZWQgZXhwZWN0ZWQgbm90VW5kZXJzdG9vZCBmYXVsdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2F1Z2h0IGV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZS50b1N0cmluZygpLmluZGV4T2YoDQotICAgICAgICAgICAgICAgICAgICAiTXVzdCBVbmRlcnN0YW5kIGNoZWNrIGZhaWxlZCBmb3IgaGVhZGVyIHNvYXAgOiB7aHR0cDovL2RlbW8vfW15Tk9UVU5ERVJTVE9PRGhlYWRlciIpICE9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0pBWEJDb250ZXh0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21pc2MvSkFYQkNvbnRleHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTYwYzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21pc2MvSkFYQkNvbnRleHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5taXNjOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIE5hbWVzcGFjZSB0byBQYWNrYWdlIEFsZ29yaXRobQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEpBWEJDb250ZXh0VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoSkFYQkNvbnRleHRUZXN0LmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiBKQVhCVXRpbHMgcG9vbGluZw0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdDAxKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLSAgICAJLy8gR2V0IGEgSkFYQkNvbnRleHQNCi0gICAgCVRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0MSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsNCi0gICAgCWNvbnRleHQxLmFkZCgib3JnLnRlc3QuYWRkbnVtYmVycyIpOw0KLSAgICAJY29udGV4dDEuYWRkKCJvcmcudGVzdC5hbnl0eXBlIik7DQotDQotICAgIAlKQVhCQ29udGV4dCBqYXhiQ29udGV4dDEgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQoY29udGV4dDEpOw0KLQ0KLSAgICAJLy8gQXNzZXJ0IHRoYXQgdGhlIEpBWEJDb250ZXh0IHdhcyBmb3VuZCBhbmQgdGhlIGNvbnRleHQgY29udGFpbnMgdGhlIHR3byB2YWxpZCBwYWNrYWdlcw0KLSAgICAJYXNzZXJ0VHJ1ZShqYXhiQ29udGV4dDEgIT0gbnVsbCk7DQotICAgIAlhc3NlcnRUcnVlKGNvbnRleHQxLmNvbnRhaW5zKCJvcmcudGVzdC5hZGRudW1iZXJzIikpOw0KLSAgICAJYXNzZXJ0VHJ1ZShjb250ZXh0MS5jb250YWlucygib3JnLnRlc3QuYW55dHlwZSIpKTsNCi0NCi0gICAgCS8vIFJlcGVhdCB3aXRoIHRoZSBzYW1lIHBhY2thZ2VzDQotICAgIAlUcmVlU2V0PFN0cmluZz4gY29udGV4dDIgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQotICAgIAljb250ZXh0Mi5hZGQoIm9yZy50ZXN0LmFkZG51bWJlcnMiKTsNCi0gICAgCWNvbnRleHQyLmFkZCgib3JnLnRlc3QuYW55dHlwZSIpOw0KLQ0KLSAgICAJSkFYQkNvbnRleHQgamF4YkNvbnRleHQyID0gSkFYQlV0aWxzLmdldEpBWEJDb250ZXh0KGNvbnRleHQyKTsNCi0NCi0gICAgCS8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIGlzIHByb2JhYmx5IHRydWUsYnV0IEdDIG1heSBoYXZlIHdpcGVkIG91dCB0aGUgd2VhayByZWZlcmVuY2UNCi0gICAgCS8vYXNzZXJ0VHJ1ZShqYXhiQ29udGV4dDIgPT0gamF4YkNvbnRleHQxKTsNCi0gICAgCWFzc2VydFRydWUoamF4YkNvbnRleHQyICE9IG51bGwpOw0KLSAgICAJYXNzZXJ0VHJ1ZShqYXhiQ29udGV4dDIudG9TdHJpbmcoKS5lcXVhbHMoamF4YkNvbnRleHQxLnRvU3RyaW5nKCkpKTsNCi0gICAgCWFzc2VydFRydWUoY29udGV4dDIuY29udGFpbnMoIm9yZy50ZXN0LmFkZG51bWJlcnMiKSk7DQotICAgIAlhc3NlcnRUcnVlKGNvbnRleHQyLmNvbnRhaW5zKCJvcmcudGVzdC5hbnl0eXBlIikpOw0KLQ0KLSAgICAJLy8gUmVwZWF0IHdpdGggdGhlIHNhbWUgcGFja2FnZXMgKyBhbiBpbnZhbGlkIHBhY2thZ2UNCi0gICAgCVRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0MyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsNCi0gICAgCWNvbnRleHQzLmFkZCgib3JnLnRlc3QuYWRkbnVtYmVycyIpOw0KLSAgICAJY29udGV4dDMuYWRkKCJvcmcudGVzdC5hbnl0eXBlIik7DQotICAgIAljb250ZXh0My5hZGQoIm15LmdyYW5kbWEubG92ZXMuamF4d3MiKTsNCi0NCi0gICAgCUpBWEJDb250ZXh0IGpheGJDb250ZXh0MyA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChjb250ZXh0Myk7DQotDQotICAgIAkvLyBUaGUgZm9sbG93aW5nIGFzc2VydGlvbiBpcyBwcm9iYWJseSB0cnVlLGJ1dCBHQyBtYXkgaGF2ZSB3aXBlZCBvdXQgdGhlIHdlYWsgcmVmZXJlbmNlDQotICAgIAkvL2Fzc2VydFRydWUoamF4YkNvbnRleHQzID09IGpheGJDb250ZXh0MSk7DQotICAgIAlhc3NlcnRUcnVlKGpheGJDb250ZXh0MyAhPSBudWxsKTsNCi0gICAgCWFzc2VydFRydWUoamF4YkNvbnRleHQxLnRvU3RyaW5nKCkuZXF1YWxzKGpheGJDb250ZXh0MS50b1N0cmluZygpKSk7DQotICAgIAlhc3NlcnRUcnVlKGNvbnRleHQzLmNvbnRhaW5zKCJvcmcudGVzdC5hZGRudW1iZXJzIikpOw0KLSAgICAJYXNzZXJ0VHJ1ZShjb250ZXh0My5jb250YWlucygib3JnLnRlc3QuYW55dHlwZSIpKTsgDQotICAgIAkvLyBUaGUgaW52YWxpZCBwYWNrYWdlIHNob3VsZCBub3cgYmUgcmV0YWluZWQuLi50aGlzIGlzIGR1ZQ0KLSAgICAJLy8gYSBtaW5vciBzZW1hbnRpYyBjaGFuZ2UgdG8gYXZvaWQgdGhpcyBzaWRlIGVmZmVjdC4NCi0gICAgCWFzc2VydFRydWUoY29udGV4dDMuY29udGFpbnMoIm15LmdyYW5kbWEubG92ZXMuamF4d3MiKSk7ICANCi0NCi0gICAgCS8vIFJlcGVhdCB3aXRoIGEgc3Vic2V0IG9mIHBhY2thZ2VzDQotICAgIAlUcmVlU2V0PFN0cmluZz4gY29udGV4dDQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQotICAgIAljb250ZXh0NC5hZGQoIm9yZy50ZXN0LmFkZG51bWJlcnMiKTsNCi0NCi0NCi0gICAgCUpBWEJDb250ZXh0IGpheGJDb250ZXh0NCA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChjb250ZXh0NCk7DQotDQotICAgIAlhc3NlcnRUcnVlKGpheGJDb250ZXh0NCAhPSBudWxsKTsNCi0gICAgCWFzc2VydFRydWUoamF4YkNvbnRleHQ0ICE9IGpheGJDb250ZXh0Myk7DQotICAgIAlhc3NlcnRUcnVlKGNvbnRleHQ0LmNvbnRhaW5zKCJvcmcudGVzdC5hZGRudW1iZXJzIikpOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvRWNob01lc3NhZ2VJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL0VjaG9NZXNzYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFkYjNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvRWNob01lc3NhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm5vbmFub255bW91cy5jb21wbGV4dHlwZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm5vbmFub255bW91cy5jb21wbGV4dHlwZS5zZWkuRWNob01lc3NhZ2VQb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkVjaG9NZXNzYWdlU2VydmljZSIsDQotCSAJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdEFwcC5qYXh3cyIsDQotICAgICAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGUuc2VpLkVjaG9NZXNzYWdlUG9ydFR5cGUiKQ0KLQ0KLXB1YmxpYyBjbGFzcyBFY2hvTWVzc2FnZUltcGwgaW1wbGVtZW50cyBFY2hvTWVzc2FnZVBvcnRUeXBlIHsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIEVjaG9NZXNzYWdlSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWINCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGUuc2VpLkVjaG9NZXNzYWdlUG9ydFR5cGUjZWNob01lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZWNob01lc3NhZ2UoU3RyaW5nIHJlcXVlc3QpIHsNCi0JCVN0cmluZyByZXNwb25zZSA9IG51bGw7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiZWNob01lc3NhZ2UgcmVjZWl2ZWQ6ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlID0gcmVxdWVzdC5yZXBsYWNlQWxsKCJTZXJ2ZXIiLCAiQ2xpZW50Iik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9NRVRBLUlORi9FY2hvTWVzc2FnZS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9NRVRBLUlORi9FY2hvTWVzc2FnZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjEzODQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvTUVUQS1JTkYvRWNob01lc3NhZ2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyINCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLSAgIDx0eXBlcz4NCi0gICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciDQotICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmcveHNkIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwveHNkOnNjaGVtYT4NCi0gICA8L3R5cGVzPg0KLQ0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+DQotICAgICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4NCi0gICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvcG9ydFR5cGU+DQotDQotICAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgICAgIDxpbnB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvaW5wdXQ+DQotDQotICAgICAgICAgPG91dHB1dD4NCi0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDwvb3BlcmF0aW9uPg0KLSAgIDwvYmluZGluZz4NCi0NCi0gICA8c2VydmljZSBuYW1lPSJFY2hvTWVzc2FnZVNlcnZpY2UiPg0KLSAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkVjaG9NZXNzYWdlUG9ydCI+DQotICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0VjaG9NZXNzYWdlU2VydmljZSIvPg0KLSAgICAgIDwvcG9ydD4NCi0NCi0gICA8L3NlcnZpY2U+DQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL05vbkFub255bW91c0NvbXBsZXhUeXBlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvTm9uQW5vbnltb3VzQ29tcGxleFR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJmYmE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvTm9uQW5vbnltb3VzQ29tcGxleFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ub25hbm9ueW1vdXMuY29tcGxleHR5cGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mubm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnNlaS5FY2hvTWVzc2FnZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm5vbmFub255bW91cy5jb21wbGV4dHlwZS5zZWkuRWNob01lc3NhZ2VTZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgTm9uQW5vbnltb3VzQ29tcGxleFR5cGVUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9FY2hvTWVzc2FnZVNlcnZpY2UuRWNob01lc3NhZ2VJbXBsUG9ydCI7DQotCQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTm9uQW5vbnltb3VzQ29tcGxleFR5cGVUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQcm94eSgpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSGVsbG8gU2VydmVyIjsNCi0gICAgICAgICAgICBFY2hvTWVzc2FnZVBvcnRUeXBlIG15UG9ydCA9IChuZXcgRWNob01lc3NhZ2VTZXJ2aWNlKCkpLmdldEVjaG9NZXNzYWdlUG9ydCgpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgbXlQb3J0Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gbXlQb3J0LmVjaG9NZXNzYWdlKG1zZyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gbXlQb3J0LmVjaG9NZXNzYWdlKG1zZyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd2ViRXgpIHsNCi0gICAgICAgICAgICB3ZWJFeC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0JCSAgICANCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9zZWkvRWNob01lc3NhZ2VQb3J0VHlwZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9zZWkvRWNob01lc3NhZ2VQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRmOGY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvc2VpL0VjaG9NZXNzYWdlUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mubm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnNlaTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9NZXNzYWdlUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIpDQotcHVibGljIGludGVyZmFjZSBFY2hvTWVzc2FnZVBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9NZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuY29tcGxleHR5cGUubm9uYW5vbnltb3VzLkVjaG9NZXNzYWdlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob01lc3NhZ2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmNvbXBsZXh0eXBlLm5vbmFub255bW91cy5FY2hvTWVzc2FnZVJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ub25hbm9ueW1vdXMvY29tcGxleHR5cGUvc2VpL0VjaG9NZXNzYWdlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9zZWkvRWNob01lc3NhZ2VTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDIzMDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL25vbmFub255bW91cy9jb21wbGV4dHlwZS9zZWkvRWNob01lc3NhZ2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm5vbmFub255bW91cy5jb21wbGV4dHlwZS5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkVjaG9NZXNzYWdlU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gIkVjaG9NZXNzYWdlLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBFY2hvTWVzc2FnZVNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgRUNIT01FU1NBR0VTRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvbm9uYW5vbnltb3VzL2NvbXBsZXh0eXBlL01FVEEtSU5GL0VjaG9NZXNzYWdlLndzZGwiOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCXRyeXsNCi0JICAgICAgICAJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBFQ0hPTUVTU0FHRVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRWNob01lc3NhZ2VTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRWNob01lc3NhZ2VTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoRUNIT01FU1NBR0VTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsICJFY2hvTWVzc2FnZVNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEVjaG9NZXNzYWdlUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9NZXNzYWdlUG9ydCIpDQotICAgIHB1YmxpYyBFY2hvTWVzc2FnZVBvcnRUeXBlIGdldEVjaG9NZXNzYWdlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRWNob01lc3NhZ2VQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsICJFY2hvTWVzc2FnZVBvcnQiKSwgRWNob01lc3NhZ2VQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GLzNEU2hhcGUueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GLzNEU2hhcGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTEyNjYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi8zRFNoYXBlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotCQl4bWxuczp0bnMxPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQl4bWxuczp0bnM9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciIA0KLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIj4NCi0JCQ0KLQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQkJICAgIHNjaGVtYUxvY2F0aW9uPSJzaGFwZS54c2QiIC8+DQotCQkNCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGhyZWVEU3F1YXJlIj4NCi0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zMTpTcXVhcmUiPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImJyZWR0aCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi08L3hzZDpzY2hlbWE+CQkNCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGUueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5MzFlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJeG1sbnM6dG5zPSJodHRwOi8vc2hhcGUudGVzdC5vcmciIA0KLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIg0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciPg0KLQkJCQ0KLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTaGFwZSIgYWJzdHJhY3Q9InRydWUiPg0KLQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ4QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ieUF4aXMiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNxdWFyZSIgPg0KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpTaGFwZSI+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IndpZHRoIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNpcmNsZSIgPg0KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpTaGFwZSI+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyYWRpdXMiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+CQ0KLTwveHNkOnNjaGVtYT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGVfd3JhcHBlcnMueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlX3dyYXBwZXJzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjZTgzMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGVfd3JhcHBlcnMueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJeG1sbnM6dG5zPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyIgDQotCQl4bWxuczp0bnMxPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQl4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiAgamF4Yjp2ZXJzaW9uPSIyLjAiDQotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIj4NCi0JCQ0KLQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQkJICAgIHNjaGVtYUxvY2F0aW9uPSJzaGFwZS54c2QiIC8+DQotCQkNCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJkcmF3M0QiPg0KLQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0idG5zMTpTaGFwZSIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQk8L3hzZDplbGVtZW50Pg0KLQkJDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhdyI+DQotCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ0bnMxOlNoYXBlIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCTwveHNkOmVsZW1lbnQ+DQotCQkNCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJkcmF3UmVzcG9uc2UiPg0KLQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InRuczE6U2hhcGUiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJPC94c2Q6ZWxlbWVudD4NCi0JCQ0KLTwveHNkOnNjaGVtYT4JCQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zaGFwZXMud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9NRVRBLUlORi9zaGFwZXMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxYmU1Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucw0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JeG1sbnM9Imh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JDQotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9zZWkuc2hhcGUucG9seW1vcnBoaWMuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JeG1sbnM6dG5zMT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIg0KLQl4bWxuczp0bnMyPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIg0KLQl4bWxuczp0bnMzPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPg0KLQ0KLQk8d3NkbDp0eXBlcz4NCi0JICAgIDx4c2Q6c2NoZW1hPg0KLQkJICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciDQotCQkgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGUueHNkIi8+DQotCQkgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciDQotCQkgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iM0RTaGFwZS54c2QiLz4NCi0JCSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciDQotCQkgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGVfd3JhcHBlcnMueHNkIi8+DQotCSAgICA8L3hzZDpzY2hlbWE+DQotCSAgICANCi0JPC93c2RsOnR5cGVzPg0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImRyYXczRFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnMzOmRyYXczRCI+DQotCQk8L3dzZGw6cGFydD4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImRyYXdSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zMzpkcmF3Ij4NCi0JCTwvd3NkbDpwYXJ0Pg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZHJhd1Jlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0idHlwZXNRTmFtZVJlc3BvbnNlIiBlbGVtZW50PSJ0bnMzOmRyYXdSZXNwb25zZSI+DQotCQk8L3dzZGw6cGFydD4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUiPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXciPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpkcmF3UmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmRyYXdSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXczRCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmRyYXczRFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpkcmF3UmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlBvbHltb3JwaGljU2hhcGVCaW5kaW5nIiB0eXBlPSJ0bnM6UG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50Ig0KLQkJCXRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXciPgkJCQ0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9kcmF3IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXczRCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9zZWkucG9seW1vcnBoaWNzaGFwZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL2RyYXczRCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCTwvd3NkbDpiaW5kaW5nPg0KLQkNCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IG5hbWU9IlBvbHltb3JwaGljU2hhcGVQb3J0Ig0KLQkJCWJpbmRpbmc9InRuczpQb2x5bW9ycGhpY1NoYXBlQmluZGluZyI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1BvbHltb3JwaGljU2hhcGVTZXJ2aWNlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQkNCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL1BvbHltb3JwaGljU2hhcGVQb3J0VHlwZUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYTA1MmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL1BvbHltb3JwaGljU2hhcGVQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wb2x5bW9ycGhpYy5zaGFwZS5zZWkuUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS5DaXJjbGU7DQotaW1wb3J0IG9yZy50ZXN0LnNoYXBlLlNoYXBlOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS5TcXVhcmU7DQotaW1wb3J0IG9yZy50ZXN0LnNoYXBlLnRocmVlZC5UaHJlZURTcXVhcmU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJQb2x5bW9ycGhpY1NoYXBlU2VydmljZSIsDQotICAgICAgICBwb3J0TmFtZT0iUG9seW1vcnBoaWNTaGFwZVBvcnQiLA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLA0KLSAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUuc2VpLlBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSIsIA0KLQkJd3NkbExvY2F0aW9uPSJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvTUVUQS1JTkYvc2hhcGVzLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIHsNCi0NCi0JcHVibGljIFNoYXBlIGRyYXcoU2hhcGUgcmVxdWVzdCkgew0KLQkJaWYocmVxdWVzdCBpbnN0YW5jZW9mIENpcmNsZSl7DQotCQkJQ2lyY2xlIGNpcmNsZSA9KENpcmNsZSkgcmVxdWVzdDsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRHJhd2luZyBDaXJjbGUgb24geCA9IiArIHJlcXVlc3QuZ2V0WEF4aXMoKSArICIgeT0iICsNCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0WUF4aXMoKSArICIgV2l0aCBSYWRpdXMgPSIgKyBjaXJjbGUuZ2V0UmFkaXVzKCkpOw0KLQkJCXJldHVybiByZXF1ZXN0Ow0KLQkJfQ0KLQkJaWYocmVxdWVzdCBpbnN0YW5jZW9mIFNxdWFyZSl7DQotCQkJU3F1YXJlIHNxdWFyZSA9KFNxdWFyZSkgcmVxdWVzdDsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRHJhd2luZyBTcXVhcmUgb24geCA9IiArIHJlcXVlc3QuZ2V0WEF4aXMoKSArICIgeT0iICsNCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0WUF4aXMoKSArICIgV2l0aCBTaWRlcyA9IiArIHNxdWFyZS5nZXRMZW5ndGgoKSk7DQotCQkJcmV0dXJuIHJlcXVlc3Q7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2hhcGUgZHJhdzNEKFNoYXBlIHJlcXVlc3QpIHsNCi0JCWlmKHJlcXVlc3QgaW5zdGFuY2VvZiBUaHJlZURTcXVhcmUpew0KLQkJCVRocmVlRFNxdWFyZSB0aHJlZURzcXVhcmUgPShUaHJlZURTcXVhcmUpIHJlcXVlc3Q7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRyYXdpbmcgM0RTcXVhcmUgb24geCA9IiArIHJlcXVlc3QuZ2V0WEF4aXMoKSArICIgeT0iICsNCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0WUF4aXMoKSArICIgV2l0aCBCcmVkdGggPSIgKyB0aHJlZURzcXVhcmUuZ2V0QnJlZHRoKCkpOw0KLQkJCXJldHVybiByZXF1ZXN0Ow0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3NlaS9Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9zZWkvUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGFhYWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3NlaS9Qb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS5TaGFwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIlBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0LnNoYXBlLlNoYXBlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlc0V4dGVuc2lvbiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImRyYXciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2hhcGUud3JhcHBlci5EcmF3IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZHJhd1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNoYXBlLndyYXBwZXIuRHJhd1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFNoYXBlIGRyYXcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTaGFwZSByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0LnNoYXBlLlNoYXBlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlc0V4dGVuc2lvbiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImRyYXczRCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zaGFwZS53cmFwcGVyLkRyYXczRCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImRyYXdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zaGFwZS53cmFwcGVyLkRyYXdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTaGFwZSBkcmF3M0QoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTaGFwZSByZXF1ZXN0KTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3NlaS9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3NlaS9Qb2x5bW9ycGhpY1NoYXBlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk3MTMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wb2x5bW9ycGhpYy9zaGFwZS9zZWkvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJQb2x5bW9ycGhpY1NoYXBlU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCB3c2RsTG9jYXRpb24gPSAic2hhcGVzLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBQb2x5bW9ycGhpY1NoYXBlU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBQT0xZTU9SUEhJQ1NIQVBFU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL01FVEEtSU5GL3NoYXBlcy53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUE9MWU1PUlBISUNTSEFQRVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb2x5bW9ycGhpY1NoYXBlU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFBPTFlNT1JQSElDU0hBUEVTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlBvbHltb3JwaGljU2hhcGVTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlBvbHltb3JwaGljU2hhcGVQb3J0IikNCi0gICAgcHVibGljIFBvbHltb3JwaGljU2hhcGVQb3J0VHlwZSBnZXRQb2x5bW9ycGhpY1NoYXBlUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiUG9seW1vcnBoaWNTaGFwZVBvcnQiKSwgUG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvdGVzdHMvUG9seW1vcnBoaWNUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3BvbHltb3JwaGljL3NoYXBlL3Rlc3RzL1BvbHltb3JwaGljVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I2NDhmZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcG9seW1vcnBoaWMvc2hhcGUvdGVzdHMvUG9seW1vcnBoaWNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUudGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUuc2VpLlBvbHltb3JwaGljU2hhcGVQb3J0VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wb2x5bW9ycGhpYy5zaGFwZS5zZWkuUG9seW1vcnBoaWNTaGFwZVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETFdyYXBwZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXJFeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5pbXBsLlNjaGVtYVJlYWRlckltcGw7DQotaW1wb3J0IG9yZy50ZXN0LnNoYXBlLlNoYXBlOw0KLWltcG9ydCBvcmcudGVzdC5zaGFwZS5TcXVhcmU7DQotaW1wb3J0IG9yZy50ZXN0LnNoYXBlLnRocmVlZC5UaHJlZURTcXVhcmU7DQotDQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotcHVibGljIGNsYXNzIFBvbHltb3JwaGljVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UuUG9seW1vcnBoaWNTaGFwZVBvcnQiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFBvbHltb3JwaGljVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWFsQW5kQWN0dWFsVHlwZUluRGlmZmVyZW50UGFja2FnZXMoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotCQlQb2x5bW9ycGhpY1NoYXBlU2VydmljZSBzZXJ2aWNlID0gbmV3IFBvbHltb3JwaGljU2hhcGVTZXJ2aWNlKCk7DQotCQlQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUgcG9ydCA9IHNlcnZpY2UuZ2V0UG9seW1vcnBoaWNTaGFwZVBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotCQlTaGFwZSBzaGFwZVR5cGU7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU2VuZGluZyBSZXF1ZXN0IHRvIGRyYXcgU3F1YXJlIik7DQotCQlTcXVhcmUgc2hhcGUgPSBuZXcgU3F1YXJlKCk7DQotCQlzaGFwZS5zZXRYQXhpcygxKTsNCi0JCXNoYXBlLnNldFlBeGlzKDEpOw0KLQkJc2hhcGUuc2V0TGVuZ3RoKDEwKTsNCi0JCXNoYXBlVHlwZSA9IHBvcnQuZHJhdyhzaGFwZSk7DQotCQlhc3NlcnRUcnVlKHNoYXBlVHlwZSBpbnN0YW5jZW9mIFNxdWFyZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3F1YXJlIHdhcyBkcmF3biIpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNlbmRpbmcgUmVxdWVzdCB0byBkcmF3IDNEIFNxdWFyZSIpOw0KLQkJVGhyZWVEU3F1YXJlIHRocmVlRHNoYXBlID0gbmV3IFRocmVlRFNxdWFyZSgpOw0KLQkJdGhyZWVEc2hhcGUuc2V0WEF4aXMoMSk7DQotCQl0aHJlZURzaGFwZS5zZXRZQXhpcygxKTsNCi0JCXRocmVlRHNoYXBlLnNldExlbmd0aCgxMCk7DQotCQl0aHJlZURzaGFwZS5zZXRXaWR0aCgxMCk7DQotCQl0aHJlZURzaGFwZS5zZXRCcmVkdGgoMTApOw0KLQkJc2hhcGVUeXBlID0gcG9ydC5kcmF3M0QodGhyZWVEc2hhcGUpOw0KLQkJYXNzZXJ0VHJ1ZShzaGFwZVR5cGUgaW5zdGFuY2VvZiBUaHJlZURTcXVhcmUpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIjNEIFNxdWFyZSB3YXMgZHJhd24iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJbmxpbmVVc2VPZkpBWEJCaW5kaW5nKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQkJU3RyaW5nIHNjaGVtYUJpbmRpbmdQa2dOYW1lID0gIm9yZy50ZXN0LmVjaG9tZXNzYWdlIjsNCi0JCVN0cmluZyBzdGFuZGFyZFBrZ05hbWU9ICJvcmcudGVzdC5jb21wbGV4dHlwZS5ub25hbm9ueW1vdXMiOw0KLQkJU3RyaW5nIHdzZGxMb2NhdGlvbj0idGVzdC1yZXNvdXJjZXMvd3NkbC9KQVhCX0N1c3RvbWl6YXRpb25fU2FtcGxlLndzZGwiOw0KLQkJVVJMIHVybCA9IG51bGw7DQotCQl0cnl7DQotCQkJdHJ5ew0KLQkJCQlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkJCQl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICtGaWxlLnNlcGFyYXRvcisgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCQlmYWlsKCk7DQotCQkJfQ0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotCQkJdXJsID0gZmlsZS50b1VSTCgpOw0KLQkJCVdTRExXcmFwcGVyIHdzZGxXcmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIodXJsKTsNCi0JCQlvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuU2NoZW1hUmVhZGVyIHNyPSBuZXcgU2NoZW1hUmVhZGVySW1wbCgpOw0KLQkJCVNldDxTdHJpbmc+IHNldD0gc3IucmVhZFBhY2thZ2VzRnJvbVNjaGVtYSh3c2RsV3JhcHBlci5nZXREZWZpbml0aW9uKCkpOw0KLQkJCWFzc2VydE5vdE51bGwoc2V0KTsNCi0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsNCi0JCQl3aGlsZShpdGVyLmhhc05leHQoKSl7DQotCQkJCVN0cmluZyBwa2cgPSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlBhY2thZ2UgPSAiICsgcGtnKTsNCi0JCQl9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgpOw0KLQkJfWNhdGNoKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChDb25uZWN0RXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9Y2F0Y2goV1NETEV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChTY2hlbWFSZWFkZXJFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWFSZWFkZXIoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotCQlTdHJpbmcgd3NkbExvY2F0aW9uPSJ0ZXN0LXJlc291cmNlcy93c2RsL3NoYXBlcy53c2RsIjsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQkJdHJ5ew0KLQkJCXRyeXsNCi0JCQkJU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0JCQkJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArRmlsZS5zZXBhcmF0b3IrIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQkJZmFpbCgpOw0KLQkJCX0NCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLQkJCXVybCA9IGZpbGUudG9VUkwoKTsNCi0JCQlXU0RMV3JhcHBlciB3c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCk7DQotCQkJb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLlNjaGVtYVJlYWRlciBzcj0gbmV3IFNjaGVtYVJlYWRlckltcGwoKTsNCi0JCQlTZXQ8U3RyaW5nPiBzZXQ9IHNyLnJlYWRQYWNrYWdlc0Zyb21TY2hlbWEod3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpKTsNCi0JCQlhc3NlcnROb3ROdWxsKHNldCk7DQotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7DQotCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUGFja2FnZSA9IiArIGl0ZXIubmV4dCgpKTsNCi0JCQl9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgpOw0KLQkJfWNhdGNoKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChDb25uZWN0RXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0gICAgICAgIH1jYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotCQl9Y2F0Y2goV1NETEV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJCWZhaWwoKTsNCi0JCX1jYXRjaChTY2hlbWFSZWFkZXJFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9DQotCQkNCi0JCQ0KLQkJICAgICAgICANCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvQWRkcmVzc2luZ1Byb3ZpZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9BZGRyZXNzaW5nUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU3YWFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9BZGRyZXNzaW5nUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdQcm92aWRlclRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQWRkcmVzc2luZ1Byb3ZpZGVyU2VydmljZS5BZGRyZXNzaW5nUHJvdmlkZXJQb3J0IjsgICAgCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2FkZHJlc3NpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJBZGRyZXNzaW5nUHJvdmlkZXJTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2FkZHJlc3NpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJBZGRyZXNzaW5nUHJvdmlkZXJQb3J0Iik7Ci0gICAgICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfU09BUCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iOwotICAgICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfU09BUCA9ICI8L3NvYXA6Qm9keT48L3NvYXA6RW52ZWxvcGU+IjsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9NRVNTQUdFID0gIjxuczI6aW5NZXNzYWdlIHhtbG5zOm5zMj1cImh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmdcIj5IZWxsbzwvbnMyOmluTWVzc2FnZT4iOwotICAgICAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfTUVTU0FHRV8xID0gU1RBUlRfU09BUCArCi0gICAgICAgICAgICAgICAgICAgICAgIjxzb2FwOkJvZHk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgWE1MX01FU1NBR0UgKwotICAgICAgICAgICAgICAgICAgICAgIEVORF9TT0FQOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9NRVNTQUdFXzIgPSBTVEFSVF9TT0FQICsgIAotICAgICAgICAgICAgICAgICAgICAgICI8c29hcDpIZWFkZXIgeG1sbnM6d3NhPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nXCI+PHdzYTpUbz57MH08L3dzYTpUbz48d3NhOk1lc3NhZ2VJRD57MX08L3dzYTpNZXNzYWdlSUQ+PHdzYTpBY3Rpb24+ezJ9PC93c2E6QWN0aW9uPjwvc29hcDpIZWFkZXI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgIjxzb2FwOkJvZHk+IiArCi0gICAgICAgICAgICAgICAgICAgICAgWE1MX01FU1NBR0UgKwotICAgICAgICAgICAgICAgICAgICAgIEVORF9TT0FQOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OID0gImh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvQWRkcmVzc2luZ1Byb3ZpZGVySW50ZXJmYWNlL0luIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBZGRyZXNzaW5nUHJvdmlkZXJUZXN0cy5jbGFzcyksIG51bGwsCi0gICAgICAgICAgICAgICAgInRlc3QtcmVzb3VyY2VzL2F4aXMyX2FkZHJlc3NpbmcueG1sIik7Ci0gICAgfQotICAgCi0gICAgLyoqCi0gICAgICogSW5qZWN0IGNvcnJlY3Qgd3NhIGhlYWRlciAod3NhOkFjdGlvbiBtdXN0IGJlIHNldCB0aGUgdGhlIGFjdGlvbiBvZiBoZWxsbyBvcGVyYXRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEluamVjdEFkZHJlc3NpbmdIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIFN0cmluZyBtc2cgPSBTT0FQX01FU1NBR0VfMTsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsICJIZWxsbyBSZXNwb25zZSIpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnRvU3RyaW5nKCkpOyAKLSAgICAgICAgCi0gICAgICAgIC8vIFRyeSBBZ2FpbiB0byB2ZXJpZnkKLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgIkhlbGxvIFJlc3BvbnNlIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UudG9TdHJpbmcoKSk7IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIGFscmVhZHkgY29udGFpbnMgd3NhIGhlYWRlcnMuIE1ha2Ugc3VyZSB0aGVyZSBpcyBubyBtaXNtYXRjaCBiZXR3ZWVuIAotICAgICAqIFNPQVBBY3Rpb24gYW5kIHdzYTpBY3Rpb24uIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoQWRkcmVzc2luZ0hlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOwotICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoU09BUF9NRVNTQUdFXzIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJuOiIgKyBVVUlELnJhbmRvbVVVSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCAiSGVsbG8gUmVzcG9uc2UiKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS50b1N0cmluZygpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkKLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgIkhlbGxvIFJlc3BvbnNlIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU09BUEVsZW1lbnQgYXNzZXJ0UmVzcG9uc2VYTUwoU09BUE1lc3NhZ2UgbXNnLCBTdHJpbmcgZXhwZWN0ZWRUZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtc2cgIT0gbnVsbCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtc2cuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShib2R5ICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgTm9kZSBpbnZva2VFbGVtZW50ID0gKE5vZGUpIGJvZHkuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBhc3NlcnRUcnVlKGludm9rZUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3V0TWVzc2FnZSIsIGludm9rZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgdGV4dCA9IGludm9rZUVsZW1lbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQ6ICIgKyB0ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGb3VuZCAoIisgdGV4dCArICIpIGJ1dCBleHBlY3RlZCAoIiArIGV4cGVjdGVkVGV4dCArICIpIiwgZXhwZWN0ZWRUZXh0LCB0ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoU09BUEVsZW1lbnQpIGludm9rZUVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGNyZWF0ZURpc3BhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gZ2V0V3NkbCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxVUkwpOwotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlW10gd3NmID0ge25ldyBBZGRyZXNzaW5nRmVhdHVyZSh0cnVlKX07Ci0gICAgICAgIAotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPQotICAgICAgICAgICAgc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTT0FQTWVzc2FnZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UsIHdzZik7Ci0gICAgICAgIAotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFVSTCBnZXRXc2RsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9hZGRyZXNzaW5nL01FVEEtSU5GL0FkZHJlc3NpbmdQcm92aWRlci53c2RsIjsKLSAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7ICAgIAotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICByZXR1cm4gZmlsZS50b1VSTCgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9BdHRhY2htZW50VXRpbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0F0dGFjaG1lbnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwY2JmZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0F0dGFjaG1lbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JSU9JbWFnZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlcjsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBUaGlzIHdpbGwgc2VydmUgYXMgYSBoZWxwZXIgY2xhc3MgZm9yIGF0dGFjaG1lbnRzIHV0aWxpdHkgbWV0aG9kcy4gQWxsIG1ldGhvZHMNCi0gKiBhcmUgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBzdGF0aWNseS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50VXRpbCB7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9OQU1FU1BBQ0UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVfVEVYVCA9ICJzb2FwIG1lc3NhZ2UgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFUlNUT09EX01VX1RFWFQgPSAidW5kZXJzdG9vZCBoZWFkZXJzIHNvYXAgbWVzc2FnZSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAic29hcCBtZXNzYWdlIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX05PREUgPSAiPCIrVkFMVUUrIj4iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT0RFX1NMQVNIID0gIjwvIitWQUxVRSsiPiI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9IRUFERVIgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVIRUFERVJfQ0xJRU5UID0gIm5zMTptdWNsaWVudCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX1NFUlZFUiA9ICJuczE6bXVzZXJ2ZXIiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUhFQURFUl9DTElFTlRfVU5ERVJTVE9PRCA9ICJuczE6bXVjbGllbnR1bmRlcnN0b29kIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVIRUFERVJfU0VSVkVSX1VOREVSU1RPT0QgPSAibnMxOm11c2VydmVydW5kZXJzdG9vZCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudk1VID0gDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IiArDQotICAgICAgICAgICAgIjxzb2FwZW52OkhlYWRlcj4iICsNCi0gICAgICAgICAgICAgICAgIjwiK01VSEVBREVSX0NMSUVOVCsiIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCIgc29hcGVudjptdXN0VW5kZXJzdGFuZD1cIjFcIj5NVWluZm88LyIrTVVIRUFERVJfQ0xJRU5UKyI+IiArDQotICAgICAgICAgICAgIjwvc29hcGVudjpIZWFkZXI+IiArDQotICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArDQotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERSArDQotICAgICAgICAgICAgICAgICAgICBNVV9URVhUICsNCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREVfU0xBU0ggKw0KLSAgICAgICAgICAgICAgICAiPC9uczE6aW52b2tlPiIgKw0KLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsNCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0VudiA9IA0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKw0KLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgICAgICAgICAiPG5zMTppbnZva2UgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIj4iICsNCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREUgKw0KLSAgICAgICAgICAgICAgICAgICAgTVVfVEVYVCArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFX1NMQVNIICsNCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsNCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArDQotICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtc2dFbnZQbGFpbiA9IA0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKw0KLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgICAgICAgICAiPG5zMTppbnZva2UgeG1sbnM6bnMxPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczJcIj4iICsNCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREUgKw0KLSAgICAgICAgICAgICAgICAgICAgVEVYVCArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFX1NMQVNIICsNCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsNCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArDQotICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudk1VX3VuZGVyc3Rvb2QgPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsNCi0gICAgICAgICAgICAiPHNvYXBlbnY6SGVhZGVyPiIgKw0KLSAgICAgICAgICAgICAgICAiPCIrTVVIRUFERVJfQ0xJRU5UX1VOREVSU1RPT0QrIiB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9XCIxXCI+TVVpbmZvPC8iK01VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09EKyI+IiArDQotICAgICAgICAgICAgIjwvc29hcGVudjpIZWFkZXI+IiArDQotICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArDQotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERSArDQotICAgICAgICAgICAgICAgICAgICBVTkRFUlNUT09EX01VX1RFWFQgKw0KLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArDQotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArDQotICAgICAgICAgICAgIjwvc29hcGVudjpCb2R5PiIgKw0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXNnRW52X3VuZGVyc3Rvb2QgPSANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsNCi0gICAgICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsNCi0gICAgICAgICAgICAgICAgIjxuczE6aW52b2tlIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCI+IiArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsNCi0gICAgICAgICAgICAgICAgICAgIFVOREVSU1RPT0RfTVVfVEVYVCArDQotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFX1NMQVNIICsNCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsNCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArDQotICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU3RvcmUgYSBnaXZlbiBpbWFnZSB0byBhbiBJbWFnZSBvdXRwdXQgc3RyZWFtDQotICAgICAqIEBwYXJhbSBtaW1lVHlwZQ0KLSAgICAgKiBAcGFyYW0gaW1hZ2UNCi0gICAgICogQHBhcmFtIG9zDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RvcmVJbWFnZShTdHJpbmcgbWltZVR5cGUsIEltYWdlIGltYWdlLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgSW1hZ2VXcml0ZXIgaW1hZ2VXcml0ZXIgPSBudWxsOw0KLSAgICAgICAgQnVmZmVyZWRJbWFnZSBidWZmZXJlZEltYWdlID0gKEJ1ZmZlcmVkSW1hZ2UpIGltYWdlOw0KLSAgICAgICAgDQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5nZXRJbWFnZVdyaXRlcnNCeU1JTUVUeXBlKG1pbWVUeXBlKTsNCi0gICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0gICAgICAgIAlpbWFnZVdyaXRlciA9IChJbWFnZVdyaXRlcikgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSW1hZ2VPdXRwdXRTdHJlYW0gaW9zID0gamF2YXguaW1hZ2Vpby5JbWFnZUlPLmNyZWF0ZUltYWdlT3V0cHV0U3RyZWFtKG9zKTsNCi0gICAgICAgIGltYWdlV3JpdGVyLnNldE91dHB1dChpb3MpOw0KLQ0KLSAgICAgICAgaW1hZ2VXcml0ZXIud3JpdGUobmV3IElJT0ltYWdlKGJ1ZmZlcmVkSW1hZ2UsIG51bGwsIG51bGwpKTsNCi0gICAgICAgIGlvcy5mbHVzaCgpOw0KLSAgICAgICAgaW1hZ2VXcml0ZXIuZGlzcG9zZSgpOw0KLSAgICB9DQotICAgIA0KLQkvKioNCi0JICogQWRhcHRlciBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGFueSB0eXBlIG9mIFNvdXJjZSB0byBhIFN0cmluZw0KLQkgKiANCi0JICogQHBhcmFtIGlucHV0DQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFNvdXJjZSBpbnB1dCkgew0KLQ0KLQkJaWYgKGlucHV0ID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLQkJVHJhbnNmb3JtZXIgdHJhc2Zvcm1lcjsNCi0JCXRyeSB7DQotCQkJdHJhc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7DQotCQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsNCi0JCQl0cmFzZm9ybWVyLnRyYW5zZm9ybShpbnB1dCwgcmVzdWx0KTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlyZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkYXB0ZXIgbWV0aG9kIHVzZWQgdG8gY29udmVydCBhbnkgdHlwZSBvZiBTT0FQTWVzc2FnZSB0byBhIFN0cmluZw0KLQkgKiANCi0JICogQHBhcmFtIGlucHV0DQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFNPQVBNZXNzYWdlIGlucHV0KSB7DQotDQotCQlpZiAoaW5wdXQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0NCi0JCVNvdXJjZSByZXN1bHQgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZXN1bHQgPSBpbnB1dC5nZXRTT0FQUGFydCgpLmdldENvbnRlbnQoKTsNCi0JCX0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gdG9TdHJpbmcocmVzdWx0KTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIE1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgU3RyaW5ncyB0byBTT0FQTWVzc2FnZXMNCi0JICogDQotCSAqIEBwYXJhbSBtc2dTdHJpbmcNCi0JICogQHJldHVybg0KLQkgKi8NCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU09BUE1lc3NhZ2UgdG9TT0FQTWVzc2FnZShTdHJpbmcgbXNnU3RyaW5nKSB7DQotDQotICAgICAgICAgaWYgKG1zZ1N0cmluZyA9PSBudWxsKSByZXR1cm4gbnVsbDsNCi0NCi0gICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsNCi0gICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgICAvLyBGb3JjZSB0aGUgdXNhZ2Ugb2Ygc3BlY2lmaWMgTWVzYXNnZUZhY3Rvcmllcw0KLSAgICAgICAgICAgICAgICAgaWYgKG1zZ1N0cmluZy5pbmRleE9mKFNPQVAxMV9OQU1FU1BBQ0UpID49IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzFfUFJPVE9DT0wpOw0KLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRTT0FQUGFydCgpLnNldENvbnRlbnQoKFNvdXJjZSkgbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKG1zZ1N0cmluZykpKTsNCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsNCi0gICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidG9TT0FQTWVzc2FnZSBFeGNlcHRpb24gZW5jb3VudGVyZWQ6ICIgKyBlKTsNCi0gICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgfQ0KLSAgICAgICAgIHJldHVybiBtZXNzYWdlOyAgICAgDQotICAgIH0NCi0gICAgDQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9EYXRhU291cmNlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0RhdGFTb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTBjODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0RhdGFTb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogQW4gaW1wbCBjbGFzcyBmb3IgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIGludGVyZmFjZS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlSW1wbCBpbXBsZW1lbnRzIERhdGFTb3VyY2Ugew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFR5cGU7DQotDQotICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVBcnJheTsNCi0NCi0gICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T1M7DQotICAgIA0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSBfY29udGVudFR5cGUNCi0JICogQHBhcmFtIF9maWxlTmFtZQ0KLQkgKiBAcGFyYW0gaW1hZ2UNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBEYXRhU291cmNlSW1wbChTdHJpbmcgX2NvbnRlbnRUeXBlLCBTdHJpbmcgX2ZpbGVOYW1lLCBJbWFnZSBpbWFnZSkgdGhyb3dzIEV4Y2VwdGlvbnsNCi0JCXN1cGVyKCk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJaWYoKF9jb250ZW50VHlwZSA9PSBudWxsKSB8fCAoX2NvbnRlbnRUeXBlID09ICIiKSl7DQotICAgICAgICAJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVHlwZSBpcyBOVUxMOiBNdXN0IHByb3ZpZGUgY29udGVudCB0eXBlIik7DQotICAgICAgICAJfQ0KLSAgICAgICAgCWlmKChfZmlsZU5hbWUgPT0gbnVsbCkgfHwgKF9jb250ZW50VHlwZSA9PSAiIikpew0KLSAgICAgICAgCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkZpbGUgbmFtZSBpcyBOVUxMOiBNdXN0IHByb3ZpZGUgY29udGVudCBmaWxlIG5hbWUiKTsNCi0gICAgICAgIAl9DQotICAgICAgICAJDQotICAgICAgICAJdGhpcy5maWxlTmFtZSA9IF9maWxlTmFtZTsNCi0gICAgCQl0aGlzLmNvbnRlbnRUeXBlID0gX2NvbnRlbnRUeXBlOw0KLSAgICAgICAgCQ0KLSAgICAgICAgICAgIGlmIChpbWFnZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgCWJ5dGVBcnJheU9TID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBBdHRhY2htZW50VXRpbC5zdG9yZUltYWdlKHRoaXMuY29udGVudFR5cGUsIGltYWdlLCBieXRlQXJyYXlPUyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfQ0KLQ0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UjZ2V0Q29udGVudFR5cGUoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsNCi0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UjZ2V0SW5wdXRTdHJlYW0oKQ0KLQkgKi8NCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmICh0aGlzLmJ5dGVBcnJheU9TLnNpemUoKSAhPSAwKSB7DQotCQkJdGhpcy5ieXRlQXJyYXkgPSB0aGlzLmJ5dGVBcnJheU9TLnRvQnl0ZUFycmF5KCk7DQotICAgICAgICAgICAgdGhpcy5ieXRlQXJyYXlPUy5yZXNldCgpOw0KLSAgICAgICAgfQ0KLQkJDQotCQlpZih0aGlzLmJ5dGVBcnJheSA9PSBudWxsKXsNCi0JCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsNCi0JCQkNCi0JCX0NCi0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGhpcy5ieXRlQXJyYXkpOw0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UjZ2V0TmFtZSgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldE91dHB1dFN0cmVhbSgpDQotCSAqLw0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAodGhpcy5ieXRlQXJyYXlPUy5zaXplKCkgIT0gMCkgew0KLQkJCXRoaXMuYnl0ZUFycmF5ID0gdGhpcy5ieXRlQXJyYXlPUy50b0J5dGVBcnJheSgpOw0KLSAgICAgICAgICAgIHRoaXMuYnl0ZUFycmF5T1MucmVzZXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmJ5dGVBcnJheU9TOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9KQVhCUHJvdmlkZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0pBWEJQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmQ3NDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL0pBWEJQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5TZW5kSW1hZ2U7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uU2VuZEltYWdlUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLS8qKg0KLSAqIFRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoaXMgdGVzdGNhc2UgaXMgdG8gdGVzdCB0aGUgTVRPTSBmdW5jdGlvbnMgaW4gQXhpczIuIA0KLSAqIEl0IGRlbW9zdHJhdGUgYW4gYWx0ZXJuYXRpdmUgd2F5IG9mIHNlbmRpbmcgYW4gYXR0YWNobWVudCB1c2luZyBEYXRhSGFuZGxlci4NCi0gKiANCi0gKiBUaGlzIHRlc3RjYXNlIHVzZXMgYSBKQVhXUyBEaXNwYXRjaCBpbnZvY2F0aW9uIHdpdGggSkFYQiBnZW5lcmF0ZWQgcmVxdWVzdCBvYmplY3QNCi0gKiBhcyBwYXJhbWV0ZXIuIFRoZSBlbmRwb2ludCBmb3IgdGhlc2UgdGVzdGNhc2UgaXMgYSBKQVhXUyBTb3VyY2UgUHJvdmlkZXIuDQotICogDQotICogVGhlc2UgSkFYQiBnZW5lcmF0ZWQgYXJ0aWZhY3RzIGlzIGJhc2VkIG9uIGpheHdzXHRlc3QtcmVzb3VyY2VzXHhzZFxzYW1wbGVtdG9tLnhzZA0KLSAqIHNjaGVtYS4NCi0gKiANCi0gKiBBdmFpbGFibGUgQ29udGVudCB0eXBlcyBhcmU6DQotICogICAgICAgImltYWdlL2dpZiINCi0gKiAgICAgICAiaW1hZ2UvanBlZyINCi0gKiAgICAgICAidGV4dC9wbGFpbiINCi0gKiAgICAgICAibXVsdGlwYXJ0LyoiDQotICogICAgICAgInRleHQveG1sIg0KLSAqICAgICAgICJhcHBsaWNhdGlvbi94bWwiDQotICogVGhpcyBpbml0aWFsIHRlc3RjYXNlIG9ubHkgY292ZXJzIHRoZSAibXVsdGlwYXJ0LyoiIGFuZCAgInRleHQvcGxhaW4iIG1pbWUgdHlwZXMuDQotICogVGhlIHVsdGltYXRlIGdvYWwgaXMgdG8gcHJvdmlkZSB0ZXN0Y2FzZXMgZm9yIHRoZSByZW1haW5pbmcgbWltZSB0eXBlcy4gDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQlByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBQcm92aWRlclRlc3RDYXNlIHsNCi0NCi0gICAgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9KQVhCUHJvdmlkZXJTZXJ2aWNlLkpBWEJQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJKQVhCUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIA0KLSAgICBTdHJpbmcgUFJPVklERVJfRU5EUE9JTlRfVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyU2VydmljZS5Tb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgUFJPVklERVJfU0VSVklDRV9OQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc29hcG1zZ2NoZWNrbXRvbS5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlNvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlIik7DQotDQotICAgIERhdGFTb3VyY2Ugc3RyaW5nRFMsIGltYWdlRFM7DQotICAgIA0KLSAgICBwdWJsaWMgSkFYQlByb3ZpZGVyVGVzdHMoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYSBTdHJpbmcNCi0gICAgICAgIFN0cmluZyBzdHJpbmcgPSAiU2VuZGluZyBhIEpBWEIgZ2VuZXJhdGVkIHN0cmluZyBvYmplY3QgdG8gU291cmNlIFByb3ZpZGVyIGVuZHBvaW50IjsNCi0gICAgICAgIHN0cmluZ0RTID0gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2Uoc3RyaW5nLmdldEJ5dGVzKCksInRleHQvcGxhaW4iKTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpciArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QuanBnIik7DQotICAgICAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgICAgIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShKQVhCUHJvdmlkZXJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiB0ZXN0IFN0cmluZw0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01BdHRhY2htZW50U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihzdHJpbmdEUyk7DQotICAgIAkNCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgCUltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAJaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICANCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIERpc3BhdGNoPE9iamVjdD4gSkFYQlByb3ZpZGVyU2VydmljZSIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIHRlc3QgSW1hZ2UNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudEltYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgCQ0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAJSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgIAlpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIGVuZHBvaW50VXJsKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHN2Yw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBFbmFibGUgYXR0YWNobWVudCBvcHRpbWl6YXRpb24NCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGRpc3BhdGNoLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgcmVxdWVzdCBiZWFuIHdpdGggaW1hZ2VkZXBvdCBiZWFuIGFzIHZhbHVlDQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxPYmplY3Q+IEpBWEJQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3QgZGlzcGF0Y2hlcyB0byB0aGUgU09BUE1lc3NhZ2UgQ2hlY2tNVE9NIGVuZHBvaW50DQotICAgICAqIHdoaWNoIHZlcmlmaWVzIHRoYXQgYW4gYXR0YWNobWVudCB3YXMgc2VudCAodmVyc3VzIGlubGluZSkNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudEltYWdlUHJvdmlkZXJfQVBJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoUFJPVklERVJfU0VSVklDRV9OQU1FKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBQUk9WSURFUl9FTkRQT0lOVF9VUkwpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBqYmMsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uDQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIHJlcXVlc3QgYmVhbiB3aXRoIGltYWdlZGVwb3QgYmVhbiBhcyB2YWx1ZQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBwcm92aWRlciBzZXJ2aWNlIHJldHVybnMgdGhlIHNhbWUgaW1hZ2UgYmFjayBpZiBzdWNjZXNzZnVsDQotICAgICAgICBTZW5kSW1hZ2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3QgZGlzcGF0Y2hlcyB0byB0aGUgU09BUE1lc3NhZ2UgQ2hlY2tNVE9NIGVuZHBvaW50DQotICAgICAqIHdoaWNoIHZlcmlmaWVzIHRoYXQgYW4gYXR0YWNobWVudCB3YXMgc2VudCAodmVyc3VzIGlubGluZSkNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudEltYWdlUHJvdmlkZXJfTVRPTUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShQUk9WSURFUl9TRVJWSUNFX05BTUUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIFBST1ZJREVSX0VORFBPSU5UX1VSTCk7DQotICAgICAgICANCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIE1UT01GZWF0dXJlIG10b20gPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHN2Yw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQsIG10b20pOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIHJlcXVlc3QgYmVhbiB3aXRoIGltYWdlZGVwb3QgYmVhbiBhcyB2YWx1ZQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBwcm92aWRlciBzZXJ2aWNlIHJldHVybnMgdGhlIHNhbWUgaW1hZ2UgYmFjayBpZiBzdWNjZXNzZnVsDQotICAgICAgICBTZW5kSW1hZ2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3QgZGlzcGF0Y2hlcyB0byB0aGUgU09BUE1lc3NhZ2UgQ2hlY2tNVE9NIGVuZHBvaW50DQotICAgICAqIHdoaWNoIHZlcmlmaWVzIHRoYXQgYW4gYXR0YWNobWVudCB3YXMgc2VudCAodmVyc3VzIGlubGluZSkNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudEltYWdlUHJvdmlkZXJfTVRPTUZlYXR1cmVUaHJlc2hob2xkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoUFJPVklERVJfU0VSVklDRV9OQU1FKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBQUk9WSURFUl9FTkRQT0lOVF9VUkwpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgTVRPTUZlYXR1cmUgd2l0aCBhIHNtYWxsIHRocmVzaGhvbGQgKDEpIHdvcmtzIGNvcnJlY3RseQ0KLSAgICAgICAgLy8gYnkgc2VuZGluZyBhbiBvcHRpbWl6ZWQgTVRPTSBtZXNzYWdlLg0KLSAgICAgICAgTVRPTUZlYXR1cmUgbXRvbSA9IG5ldyBNVE9NRmVhdHVyZSgxKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHN2Yw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQsIG10b20pOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIHJlcXVlc3QgYmVhbiB3aXRoIGltYWdlZGVwb3QgYmVhbiBhcyB2YWx1ZQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBwcm92aWRlciBzZXJ2aWNlIHJldHVybnMgdGhlIHNhbWUgaW1hZ2UgYmFjayBpZiBzdWNjZXNzZnVsDQotICAgICAgICBTZW5kSW1hZ2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1Byb3ZpZGVyVGVzdENhc2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Qcm92aWRlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTdhOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1Byb3ZpZGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdmlkZXJUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIik7DQotICAgIHB1YmxpYyBTdHJpbmcgcHJvdmlkZXJSZXNvdXJjZURpciA9ICJ0ZXN0LXJlc291cmNlcyIrRmlsZS5zZXBhcmF0b3IrInByb3ZpZGVyIjsNCi0gICAgcHVibGljIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIitGaWxlLnNlcGFyYXRvcisiaW1hZ2UiOw0KLSAgICBwdWJsaWMgU3RyaW5nIGJhc2VkaXIgPSBudWxsOw0KLSAgICANCi0gICAgcHVibGljIFByb3ZpZGVyVGVzdENhc2UoKSB7DQotICAgICAgICBpZihiYXNlZGlyID09IG51bGwpew0KLSAgICAgICAgICAgIGJhc2VkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJvdmlkZXJSZXNvdXJjZURpciA9IG5ldyBGaWxlKGJhc2VkaXIsIHByb3ZpZGVyUmVzb3VyY2VEaXIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgaW1hZ2VSZXNvdXJjZURpciA9IG5ldyBGaWxlKGJhc2VkaXIsIGltYWdlUmVzb3VyY2VEaXIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICB9DQotICAgIA0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU09BUEZhdWx0UHJvdmlkZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NPQVBGYXVsdFByb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNWQ3Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU09BUEZhdWx0UHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0UHJvdmlkZXJUZXN0cyBleHRlbmRzIFByb3ZpZGVyVGVzdENhc2Ugew0KLSAgICBwdWJsaWMgUU5hbWUgcG9ydE5hbWUgPQ0KLSAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIpOw0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTdHJpbmdQcm92aWRlclNlcnZpY2UiKTsNCi0NCi0gICAgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TdHJpbmdQcm92aWRlclNlcnZpY2UuU3RyaW5nUHJvdmlkZXJQb3J0IjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVNvYXBFbnZlbG9wZUhlYWRlciA9DQotICAgICAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+Ig0KLSAgICAgICAgICAgICAgICArICI8c29hcDpCb2R5PiI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVTb2FwRW52ZWxvcGVGb290ZXIgPSAiPC9zb2FwOkJvZHk+IiArICI8L3NvYXA6RW52ZWxvcGU+IjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNvYXBGYXVsdEJvZHlDb250ZW50ID0gDQotICAgICAgICAiPHNvYXA6RmF1bHQ+Ig0KLSAgICAgICAgKyAiPGZhdWx0Y29kZT5zb2FwOlNPQVBGYXVsdFByb3ZpZGVyVGVzdHM8L2ZhdWx0Y29kZT4iDQotICAgICAgICArICI8ZmF1bHRzdHJpbmc+V1NBLUNQMi1HRU5FUkFURUQtRkFVTFQ6IEZBVUxUMDE8L2ZhdWx0c3RyaW5nPiINCi0gICAgICAgICsgIjwvc29hcDpGYXVsdD4iOw0KLSAgICANCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNPQVBGYXVsdFByb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAgICAgDQotICAgIHB1YmxpYyBTT0FQRmF1bHRQcm92aWRlclRlc3RzKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIERpc3BhdGNoPFN0cmluZz4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIGVuZHBvaW50VXJsKTsNCi0NCi0gICAgICAgIC8vIFVzZSBNZXNzYWdlIG1vZGUgc28gd2UgY2FuIGJ1aWxkIHVwIHRoZSBlbnRpcmUgU09BUCBlbnZlbG9wZSBjb250YWluaW5nIHRoZSBmYXVsdA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9DQotICAgICAgICAgICAgICAgIHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAvLyBGb3JjZSBzb2FwIGFjdGlvbiBiZWNhdXNlIHdlIGFyZSBwYXNzaW5nIGp1bmsgb3ZlciB0aGUgd2lyZQ0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiaHR0cDovL3N0cmluZ3Byb3ZpZGVyLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nIik7DQotDQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0KCkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gc2FtcGxlU29hcEVudmVsb3BlSGVhZGVyICsgc29hcEZhdWx0Qm9keUNvbnRlbnQgKyBzYW1wbGVTb2FwRW52ZWxvcGVGb290ZXI7DQotICAgICAgICAvLyBUZXN0IHRoYXQgYSBQcm92aWRlciByZWNlaXZlcyB0aGUgZnVsbCBmYXVsdC4gIElmIG5vdCwgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4NCi0gICAgICAgIC8vIFRlc3QgdGhhdCBhIFByb3ZpZGVyIHJlY2VpdmVzIHRoZSBmdWxsIGZhdWx0LiAgSWYgbm90LCBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OGIxN2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvYXBNZXNzYWdlTVVQcm92aWRlckNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBQbHVnaW4gdG8gcmVtb3ZlICJ1bmRlcnN0b29kIiBoZWFkZXJzIGZvciB0aGUgU29hcE1lc3NhZ2VNVVByb3ZpZGVyVGVzdHMuICBUaGlzIGNsYXNzIG11c3QNCi0gKiBiZSBjb25maWd1cmVkIGluIHRoZSBheGlzMi54bWwgZmlsZSBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXIgew0KLQ0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBoZWFkZXJzIGZvciB0aGUgcm9sZXMgd2UncmUgYWN0aW5nIGluLCB0aGVuIG1hcmsgYW55IHdlIHVuZGVyc3RhbmQNCi0gICAgICAgIC8vIGFzIHByb2Nlc3NlZC4NCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgaGVhZGVycyB0aGUgdGVzdCBleHBlY3RzIHRvIGJlIHVuZGVyc3Rvb2QNCi0gICAgICAgIFN0cmluZyBuczEgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiOw0KLSAgICAgICAgU3RyaW5nIGNsaWVudExvY2FsTmFtZSA9ICJtdWNsaWVudHVuZGVyc3Rvb2QiOw0KLSAgICAgICAgU3RyaW5nIHNlcnZlckxvY2FsTmFtZSA9ICJtdXNlcnZlcnVuZGVyc3Rvb2QiOw0KLQ0KLSAgICAgICAgUU5hbWUgY2xpZW50UU4gPSBuZXcgUU5hbWUobnMxLCBjbGllbnRMb2NhbE5hbWUpOw0KLSAgICAgICAgUU5hbWUgc2VydmVyUU4gPSBuZXcgUU5hbWUobnMxLCBzZXJ2ZXJMb2NhbE5hbWUpOw0KLQ0KLSAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0SGVhZGVyc1RvUHJvY2VzcyhudWxsKTsNCi0gICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gKFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsNCi0gICAgICAgICAgICBRTmFtZSBoZWFkZXJRTiA9IGhlYWRlckJsb2NrLmdldFFOYW1lKCk7DQotICAgICAgICAgICAgaWYgKGNsaWVudFFOLmVxdWFscyhoZWFkZXJRTikpIHsNCi0vLyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1hcmtpbmcgYXMgcHJvY2Vzc2VkIENMSUVOVCBRTjogIiArIGNsaWVudFFOKTsNCi0gICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJRTi5lcXVhbHMoaGVhZGVyUU4pKSB7DQotLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXJraW5nIGFzIHByb2Nlc3NlZCBTRVJWRVIgUU46ICIgKyBzZXJ2ZXJRTik7DQotICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU29hcE1lc3NhZ2VNVVByb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyODNjMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU29hcE1lc3NhZ2VNVVByb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyOw0KLQ0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBUZXN0cyBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gY2xpZW50IGFuZCBhIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiBzZXJ2aWNlDQotICogd2l0aCBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgaGVhZGVyLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZU1VUHJvdmlkZXJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHNlcnZpY2VOYW1lID0NCi0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBwb3J0TmFtZSA9DQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlbmRwb2ludFVybCA9DQotICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJTZXJ2aWNlLlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmluZGluZ0lEID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlcnZpY2UuTW9kZSBtb2RlID0gU2VydmljZS5Nb2RlLk1FU1NBR0U7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTb2FwTWVzc2FnZU1VUHJvdmlkZXJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNvYXAgbWVzc2FnZSB3aXRoIG5vIE1VIGhlYWRlcnMNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb011c3RVbmRlcnN0YW5kSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Tm9NdXN0VW5kZXJzdGFuZEhlYWRlcnMiKTsNCi0gICAgICAgIC8vIGNyZWF0ZSBhIHNlcnZpY2UNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIGJpbmRpbmdJRCwgZW5kcG9pbnRVcmwpOw0KLQ0KLSAgICAgICAgamF2YXgueG1sLndzLkRpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IG51bGw7DQotICAgICAgICBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIG1vZGUpOw0KLQ0KLSAgICAgICAgKChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKS5nZXRSZXF1ZXN0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIHRydWUpOw0KLSAgICAgICAgKChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKS5nZXRSZXF1ZXN0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotDQotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gQXR0YWNobWVudFV0aWwudG9TT0FQTWVzc2FnZShBdHRhY2htZW50VXRpbC5tc2dFbnZQbGFpbik7DQotDQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0NCi0gICAgICAgIFN0cmluZyBzdHJpbmcgPSBBdHRhY2htZW50VXRpbC50b1N0cmluZyhyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKEF0dGFjaG1lbnRVdGlsLlhNTF9IRUFERVINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBdHRhY2htZW50VXRpbC5tc2dFbnZQbGFpbikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLQ0KLSAgICAgICAgc3RyaW5nID0gQXR0YWNobWVudFV0aWwudG9TdHJpbmcocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShBdHRhY2htZW50VXRpbC5YTUxfSEVBREVSDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXR0YWNobWVudFV0aWwubXNnRW52UGxhaW4pKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgbXVzdFVuZGVyc3RhbmQgc29hcCBoZWFkZXIgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQncw0KLSAgICAgKiBvdXRib3VuZCBzb2FwIG1lc3NhZ2UgZm9yIGhlYWRlcnMgdGhhdCBhcmUgbm90IHVuZGVyc3Rvb2QuICBTaG91bGQgY2F1c2UgYW4gDQotICAgICAqIGV4Y2VwdGlvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRSZXF1ZXN0Tm90VW5kZXJzdG9vZEhlYWRlcnMoKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RDbGllbnRSZXF1ZXN0Tm90VW5kZXJzdG9vZEhlYWRlcnMiKTsNCi0gICAgICAgIC8vIGNyZWF0ZSBhIHNlcnZpY2UNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIGJpbmRpbmdJRCwgZW5kcG9pbnRVcmwpOw0KLQ0KLSAgICAgICAgamF2YXgueG1sLndzLkRpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IG51bGw7DQotICAgICAgICBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIG1vZGUpOw0KLQ0KLSAgICAgICAgLy9mb3JjZSBTT0FQQWN0aW9uIHRvIG1hdGNoIHdpdGggd3NkbCBhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCB0cnVlKTsNCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiZWNob1N0cmluZyIpOw0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IEF0dGFjaG1lbnRVdGlsLnRvU09BUE1lc3NhZ2UoQXR0YWNobWVudFV0aWwubXNnRW52TVUpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgZmF1bHQgZm9yIG5vdCB1bmRlcnN0b29kIGhlYWRlcnMgb24gcmVxdWVzdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBmYXVsdCBmb3Igbm90IHVuZGVyc3Rvb2QgaGVhZGVycyBvbiByZXF1ZXN0Iik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgbXVzdFVuZGVyc3RhbmQgc29hcCBoZWFkZXIgYXR0cmlidXRlIG9uIHRoZSBzZXJ2ZXIncw0KLSAgICAgKiBvdXRib3VuZCBzb2FwIG1lc3NhZ2UgKGkuZS4gdGhlIGluYm91bmQgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCkgZm9yIGhlYWRlcnMgdGhhdA0KLSAgICAgKiBhcmUgbm90IHVuZGVyc3Rvb2QuICBTaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENsaWVudFJlc3BvbnNlTm90VW5kZXJzdG9vZEhlYWRlcnMoKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RDbGllbnRSZXNwb25zZU5vdFVuZGVyc3Rvb2RIZWFkZXJzIik7DQotICAgICAgICAvLyBjcmVhdGUgYSBzZXJ2aWNlDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBiaW5kaW5nSUQsIGVuZHBvaW50VXJsKTsNCi0NCi0gICAgICAgIGphdmF4LnhtbC53cy5EaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBudWxsOw0KLSAgICAgICAgZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNPQVBNZXNzYWdlLmNsYXNzLCBtb2RlKTsNCi0NCi0gICAgICAgIC8vZm9yY2UgU09BUEFjdGlvbiB0byBtYXRjaCB3aXRoIHdzZGwgYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAoKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2gpLmdldFJlcXVlc3RDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgdHJ1ZSk7DQotICAgICAgICAoKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2gpLmdldFJlcXVlc3RDb250ZXh0KCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgImVjaG9TdHJpbmciKTsNCi0NCi0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBBdHRhY2htZW50VXRpbC50b1NPQVBNZXNzYWdlKEF0dGFjaG1lbnRVdGlsLm1zZ0Vudik7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBmYXVsdCBmb3Igbm90IHVuZGVyc3Rvb2QgaGVhZGVycyBvbiByZXNwb25zZSIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShtZXNzYWdlKTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBmYXVsdCBmb3Igbm90IHVuZGVyc3Rvb2QgaGVhZGVycyBvbiByZXNwb25zZSIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlIG11c3RVbmRlcnN0YW5kIHNvYXAgaGVhZGVyIGF0dHJpYnV0ZSBvbiB0aGUgY2xpZW50J3MNCi0gICAgICogb3V0Ym91bmQgc29hcCBtZXNzYWdlIGZvciBoZWFkZXJzIHRoYXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QuICBTaG91bGQgbm90IGNhdXNlIGFuIA0KLSAgICAgKiBleGNlcHRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50UmVxdWVzdFVuZGVyc3Rvb2RIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RDbGllbnRSZXF1ZXN0VW5kZXJzdG9vZEhlYWRlcnMiKTsNCi0gICAgICAgIC8vIGNyZWF0ZSBhIHNlcnZpY2UNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIGJpbmRpbmdJRCwgZW5kcG9pbnRVcmwpOw0KLQ0KLSAgICAgICAgamF2YXgueG1sLndzLkRpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IG51bGw7DQotICAgICAgICBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIG1vZGUpOw0KLQ0KLSAgICAgICAgLy9mb3JjZSBTT0FQQWN0aW9uIHRvIG1hdGNoIHdpdGggd3NkbCBhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCB0cnVlKTsNCi0gICAgICAgICgoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaCkuZ2V0UmVxdWVzdENvbnRleHQoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiZWNob1N0cmluZyIpOw0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IEF0dGFjaG1lbnRVdGlsLnRvU09BUE1lc3NhZ2UoQXR0YWNobWVudFV0aWwubXNnRW52TVVfdW5kZXJzdG9vZCk7DQotDQotICAgICAgICBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoZSBtdXN0VW5kZXJzdGFuZCBzb2FwIGhlYWRlciBhdHRyaWJ1dGUgb24gdGhlIHNlcnZlcidzDQotICAgICAqIG91dGJvdW5kIHNvYXAgbWVzc2FnZSAoaS5lLiB0aGUgaW5ib3VuZCByZXNwb25zZSB0byB0aGUgY2xpZW50KSBmb3IgaGVhZGVycyB0aGF0DQotICAgICAqIGFyZSB1bmRlcnN0b29kLiAgU2hvdWxkIG5vdCBjYXVzZSBhbiBleGNlcHRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50UmVzcG9uc2VVbmRlcnN0b29kSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Q2xpZW50UmVzcG9uc2VVbmRlcnN0b29kSGVhZGVycyIpOw0KLSAgICAgICAgLy8gY3JlYXRlIGEgc2VydmljZQ0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgYmluZGluZ0lELCBlbmRwb2ludFVybCk7DQotDQotICAgICAgICBqYXZheC54bWwud3MuRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gbnVsbDsNCi0gICAgICAgIGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTT0FQTWVzc2FnZS5jbGFzcywgbW9kZSk7DQotDQotICAgICAgICAvL2ZvcmNlIFNPQVBBY3Rpb24gdG8gbWF0Y2ggd2l0aCB3c2RsIGFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgKChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKS5nZXRSZXF1ZXN0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIHRydWUpOw0KLSAgICAgICAgKChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoKS5nZXRSZXF1ZXN0Q29udGV4dCgpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotDQotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gQXR0YWNobWVudFV0aWwudG9TT0FQTWVzc2FnZShBdHRhY2htZW50VXRpbC5tc2dFbnZfdW5kZXJzdG9vZCk7DQotDQotICAgICAgICBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlMmRmMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU29hcE1lc3NhZ2VQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuc29hcG1zZy5Tb2FwTWVzc2FnZVByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBjbGllbnQgYW5kIGEgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHNlcnZpY2UuDQotICogVGhlIGNsaWVudCBhbmQgc2VydmljZSBpbnRlcmFjdGlvbiB0ZXN0cyB2YXJpb3VzIHhtbCBhbmQgYXR0YWNobWVudCBzY2VuYXJpb3MNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBQcm92aWRlclRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlLlNvYXBNZXNzYWdlUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIHJlcU1zZ1N0YXJ0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKw0KLSAgICAiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXA6Qm9keT4iOw0KLSAgICA7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyByZXFNc2dFbmQgPSAiPC9zb2FwOkJvZHk+PC9zb2FwOkVudmVsb3BlPiI7DQotICAgDQotICAgIHByaXZhdGUgU3RyaW5nIFhNTF9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVFVRVNUICsNCi0gICAgICAgICI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgRU1QVFlCT0RZX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0VNUFRZQk9EWV9SRVFVRVNUICsNCi0gICAgICAgICI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgQ0hFQ0tIRUFERVJTX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVFVRVNUICsNCi0gICAgICAgICI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgQVRUQUNITUVOVF9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9BVFRBQ0hNRU5UX1JFUVVFU1QgKw0KLSAgICAgICAgIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBNVE9NX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX01UT01fUkVRVUVTVCArDQotICAgICAgICAiPC9pbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuTVRPTV9SRUYgKw0KLSAgICAgICAgIjwvbnMyOmludm9rZU9wPiI7DQotICAgIHByaXZhdGUgU3RyaW5nIFNXQVJFRl9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9TV0FSRUZfUkVRVUVTVCArDQotICAgICAgICAiPC9pbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuU1dBUkVGX1JFRiArDQotICAgICAgICAiPC9uczI6aW52b2tlT3A+IjsgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgWE1MX0ZBVUxUX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0ZBVUxUX1JFUVVFU1QgKw0KLSAgICAgICAgIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBYTUxfV1NFX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1dTRV9SRVFVRVNUICsNCi0gICAgICAgICI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0gICAgICAgICAgICAgICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgIA0KLSAgICAvKioNCi0gICAgICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyBvbmx5IHhtbCBkYXRhIHRvIHRoZSB3ZWIgc2VydmljZS4gIA0KLSAgICAgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcganVzdCB4bWwgZGF0YS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlWE1MT25seSgpew0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIFhNTF9JTlZPS0UgKyByZXFNc2dFbmQ7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3QgdGhlIHRyYW5zcG9ydCBoZWFkZXJzIGJ5IHNlbmRpbmcgYSBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgcmVxdWVzdC5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVRVUVTVCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHZhbGlkIGNvbnRlbnQgZGVzY3JpcHRpb24NCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVTUE9OU0UsIHJlc3BvbnNlLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciB2YWxpZCBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFU1BPTlNFLCByZXNwb25zZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVNQT05TRSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAJDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgb25seSB4bWwgZGF0YSB0byB0aGUgd2ViIHNlcnZpY2UuICANCi0gICAgICogUmVjZWl2ZXMgYSByZXNwb25zZSBjb250YWluaW5nIGFuIGVtcHR5IGJvZHkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlWE1MRW1wdHlCb2R5KCl7DQotICAgICAgICB0cnl7ICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZGlzcGF0Y2gNCi0gICAgICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBFTVBUWUJPRFlfSU5WT0tFICsgcmVxTXNnRW5kOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHRoZSB0cmFuc3BvcnQgaGVhZGVycyBieSBzZW5kaW5nIGEgY29udGVudCBkZXNjcmlwdGlvbg0KLSAgICAgICAgICAgIHJlcXVlc3Quc2V0Q29udGVudERlc2NyaXB0aW9uKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0VNUFRZQk9EWV9SRVFVRVNUKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPW51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0U09BUEJvZHkoKSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldFNPQVBCb2R5KCkuZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwpOyAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vdGhpbmcgaW4gdGhlIGJvZHkNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9bnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTT0FQQm9keSgpICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0U09BUEJvZHkoKS5nZXRGaXJzdENoaWxkKCkgPT0gbnVsbCk7ICAvLyBUaGVyZSBzaG91bGQgYmUgbm90aGluZyBpbiB0aGUgYm9keQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIG9ubHkgeG1sIGRhdGEgDQotICAgICAqIFByb3ZpZGVyIHdpbGwgdGhyb3cgYSBGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU09BUE1lc3NhZ2VTT0FQRmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIFhNTF9GQVVMVF9JTlZPS0UgKyByZXFNc2dFbmQ7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3QgdGhlIHRyYW5zcG9ydCBoZWFkZXJzIGJ5IHNlbmRpbmcgYSBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgcmVxdWVzdC5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfRkFVTFRfUkVRVUVTVCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAvLyBPa2F5DQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHQoKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdCAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygic2FtcGxlIGZhdWx0IikpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBleHBlY3RlZEZhdWx0Q29kZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSwgIkNsaWVudCIpOyANCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCkuZXF1YWxzKGV4cGVjdGVkRmF1bHRDb2RlKSk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RGV0YWlsKCkgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIERldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KSBmYXVsdC5nZXREZXRhaWwoKS5nZXREZXRhaWxFbnRyaWVzKCkubmV4dCgpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlLmdldExvY2FsTmFtZSgpLmVxdWFscygiZGV0YWlsRW50cnkiKSk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGUuZ2V0VmFsdWUoKS5lcXVhbHMoInNhbXBsZSBkZXRhaWwiKSk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRBY3RvcigpLmVxdWFscygic2FtcGxlIGFjdG9yIikpOw0KLSAgICAgICAgICAgIH0gICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmYWlsdXJlIiwgZmFsc2UpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIE9rYXkNCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJzYW1wbGUgZmF1bHQiKSk7DQotICAgICAgICAgICAgICAgIFFOYW1lIGV4cGVjdGVkRmF1bHRDb2RlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiQ2xpZW50Iik7IA0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKS5lcXVhbHMoZXhwZWN0ZWRGYXVsdENvZGUpKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXREZXRhaWwoKSAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgRGV0YWlsRW50cnkgZGUgPSAoRGV0YWlsRW50cnkpIGZhdWx0LmdldERldGFpbCgpLmdldERldGFpbEVudHJpZXMoKS5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGUgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJkZXRhaWxFbnRyeSIpKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZS5nZXRWYWx1ZSgpLmVxdWFscygic2FtcGxlIGRldGFpbCIpKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJzYW1wbGUgYWN0b3IiKSk7DQotICAgICAgICAgICAgfSAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgb25seSB4bWwgZGF0YSANCi0gICAgICogUHJvdmlkZXIgd2lsbCB0aHJvdyBhIGdlbmVyaWMgV2ViU2VydmljZXNFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlV2ViU2VydmljZUV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgWE1MX1dTRV9JTlZPS0UgKyByZXFNc2dFbmQ7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3QgdGhlIHRyYW5zcG9ydCBoZWFkZXJzIGJ5IHNlbmRpbmcgYSBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgcmVxdWVzdC5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfV1NFX1JFUVVFU1QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGZhaWx1cmUiLCBmYWxzZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gT2theS4uLlNPQVBGYXVsdEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duDQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHQoKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdCAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiQSBXU0Ugd2FzIHRocm93biIpKTsNCi0gICAgICAgICAgICB9ICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmYWlsdXJlIiwgZmFsc2UpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIE9rYXkuLi5TT0FQRmF1bHRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93bg0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIkEgV1NFIHdhcyB0aHJvd24iKSk7DQotICAgICAgICAgICAgfSANCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIHhtbCBkYXRhIGFuZCByYXcgYXR0YWNobWVudHMgdG8gdGhlIHdlYiBzZXJ2aWNlLiAgDQotICAgICAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgdGhlIHNhbWUgcmF3IGF0dGFjaG1lbnRzLg0KLSAgICAgKi8NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlUmF3QXR0YWNobWVudCgpew0KLSAgICAgICAgLy8gUmF3IEF0dGFjaG1lbnRzIGFyZSBhdHRhY2htZW50cyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiB0aGUgeG1sIHdpdGggTVRPTSBvciBTV0FSZWYuDQotICAgICAgICAvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gc3VwcG9ydCBpbiBBeGlzIDIgZm9yIHRoZXNlIGtpbmRzIG9mIGF0dGFjaG1lbnRzLg0KLSAgICAgICAgLy8gVGhlIGJlbGllZiBpcyB0aGF0IG1vc3QgY3VzdG9tZXJzIHdpbGwgdXNlIE1UT00uICBTb21lIGxlZ2FjeSBjdXN0b21lcnMgd2lsbCB1c2UgU1dBUmVmLg0KLSAgICAgICAgLy8gUmF3IEF0dGFjaG1lbnRzIG1heSBiZSBzbyBvbGQgdGhhdCBubyBjdXN0b21lcnMgbmVlZCB0aGlzIGJlaGF2aW9yLg0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgQVRUQUNITUVOVF9JTlZPS0UgKyByZXFNc2dFbmQ7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLSAgICAgICAgICAgIGFwLnNldENvbnRlbnRJZChTb2FwTWVzc2FnZVByb3ZpZGVyLklEKTsNCi0gICAgICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0FUVEFDSE1FTlRfUkVTUE9OU0UpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSBBdHRhY2htZW50DQotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpIHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIHRoZSBhdHRhY2htZW50DQotICAgICAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnQoKTsNCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IFNvYXBNZXNzYWdlUHJvdmlkZXIuZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVNQT05TRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0gICAgICAgICAgICBhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgICAgICBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgY29udGVudCA9IFNvYXBNZXNzYWdlUHJvdmlkZXIuZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgbXRvbSBhdHRhY2htZW50LiAgDQotICAgICAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgdGhlIG10b20gYXR0YWNobWVudC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlTVRPTSgpew0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBNVE9NIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLiAgVGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgaXQNCi0gICAgICAgICAgICAvL0JpbmRpbmcgYmluZGluZyA9IGRpc3BhdGNoLmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICAvL1NPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBiaW5kaW5nOw0KLSAgICAgICAgICAgIC8vc29hcEJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZXFNc2dTdGFydCArIE1UT01fSU5WT0tFICsgcmVxTXNnRW5kOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBBZGQgdGhlIEF0dGFjaG1lbnQNCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0gICAgICAgICAgICBhcC5zZXRDb250ZW50SWQoU29hcE1lc3NhZ2VQcm92aWRlci5JRCk7DQotICAgICAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhcCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICAvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgICAgICAgIGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX01UT01fUkVTUE9OU0UpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSBBdHRhY2htZW50DQotICAgICAgICAgICAgYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpIHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIHRoZSBhdHRhY2htZW50DQotICAgICAgICAgICAgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIGEgc3dhcmVmIGF0dGFjaG1lbnQgdG8gdGhlIHdlYiBzZXJ2aWNlLiAgDQotICAgICAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgdGhlIHN3YXJlZiBhdHRhY2htZW50IGF0dGFjaG1lbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVNXQVJlZigpew0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgU1dBUkVGX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQWRkIHRoZSBBdHRhY2htZW50DQotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICAgICAgYXAuc2V0Q29udGVudElkKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQpOw0KLSAgICAgICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU1dBUkVGX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgICAgIFN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5JRCwgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudElkKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIC8vIERpc3BhdGNoDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU1dBUkVGX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgQXR0YWNobWVudA0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgICAgIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnQoKTsNCi0gICAgICAgICAgICBjb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQsIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnRJZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpcyBhIG5lZ2F0aXZlIHRlc3QgdG8gaW5zdXJlIHRoYXQgd2UgZG9uJ3QgYWxsb3cgY3JlYXRpb24gb2YgYSBkaXNwYXRjaCB3aXRoDQotICAgICAqIHR5cGUgU29hcCB1c2luZyBQYXlsb2FkIG1vZGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHlwZVdpdGhNb2RlKCl7DQotICAgICAgICB0cnl7ICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gDQotICAgICAgICAgICAgCXN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGNhdGNoIGV4Y2VwdGlvbiBmb3IgaW52YWxpZCBEaXNwYXRjaCB3aXRoIFBheWxvYWQgTW9kZSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTdHJpbmcgcGF5bG9hZCBjb250YWluaW5nIG9ubHkgeG1sIGRhdGEgdG8gdGhlIFByb3ZpZGVyPFNPQVBNZXNzYWdlPg0KLSAgICAgKiBUaGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNlbnQgdXNpbmcgYSBqYXh3cy5yZXF1ZXN0LnNvYXAuaGVhZGVyIE1hcCAgDQotICAgICAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyB4bWwgZGF0YQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU09BUE1lc3NhZ2VfUmVxdWVzdEhlYWRlcnMoKXsNCi0gICAgICAgIHRyeXsgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBjcmVhdGVTdHJpbmdEaXNwYXRjaCgpOw0KLSAgICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIFN0cmluZyBQYXlsb2FkDQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBDSEVDS0hFQURFUlNfSU5WT0tFOw0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVxdWVzdCBoZWFkZXJzDQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXF1ZXN0Q29udGV4dCA9IGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCk7DQotICAgICAgICAgICAgTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+IHJlcXVlc3RIZWFkZXJzID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4oKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZSA9IHNmLmNyZWF0ZUVsZW1lbnQoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBlLmFkZFRleHROb2RlKFNvYXBNZXNzYWdlUHJvdmlkZXIuRk9PX0hFQURFUl9DT05URU5UKTsNCi0gICAgICAgICAgICBTdHJpbmcgZm9vSGVhZGVyID0gZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJGb28gSGVhZGVyOiIgKyBmb29IZWFkZXIpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgbGlzdC5hZGQoZm9vSGVhZGVyKTsNCi0gICAgICAgICAgICByZXF1ZXN0SGVhZGVycy5wdXQoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX1FOQU1FLCBsaXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgZSA9IHNmLmNyZWF0ZUVsZW1lbnQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBlLmFkZFRleHROb2RlKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9DT05URU5UMSk7DQotICAgICAgICAgICAgU3RyaW5nIGJhckhlYWRlciA9IGUudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQmFyIEhlYWRlcjoiICsgYmFySGVhZGVyKTsNCi0gICAgICAgICAgICBsaXN0LmFkZChiYXJIZWFkZXIpOw0KLSAgICAgICAgICAgIGUgPSBzZi5jcmVhdGVFbGVtZW50KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgZS5hZGRUZXh0Tm9kZShTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfQ09OVEVOVDIpOw0KLSAgICAgICAgICAgIGJhckhlYWRlciA9IGUudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQmFyIEhlYWRlcjoiICsgYmFySGVhZGVyKTsNCi0gICAgICAgICAgICBsaXN0LmFkZChiYXJIZWFkZXIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzLnB1dChTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfUU5BTUUsIGxpc3QpOw0KLSAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChDb25zdGFudHMuSkFYV1NfT1VUQk9VTkRfU09BUF9IRUFERVJTLCByZXF1ZXN0SGVhZGVycyk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9DSEVDS0hFQURFUlNfUkVTUE9OU0UpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZSArICJdIik7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZW5kcyBhbiBTdHJpbmcgcGF5bG9hZCBjb250YWluaW5nIG9ubHkgeG1sIGRhdGEgdG8gdGhlIFByb3ZpZGVyPFNPQVBNZXNzYWdlPg0KLSAgICAgKiBUaGUgaGVhZGVyIGluZm9ybWF0aW9uIGlzIHNlbnQgdXNpbmcgYSBqYXh3cy5yZXF1ZXN0LnNvYXAuaGVhZGVyIE1hcCAgDQotICAgICAqIFJlY2VpdmVzIGEgcmVzcG9uc2UgY29udGFpbmluZyB4bWwgZGF0YQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU09BUE1lc3NhZ2VfUmVxdWVzdEFuZFJlc3BvbnNlSGVhZGVycygpew0KLSAgICAgICAgdHJ5eyAgICAgICANCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotICAgICAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGNyZWF0ZVN0cmluZ0Rpc3BhdGNoKCk7DQotICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgU3RyaW5nIFBheWxvYWQNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IENIRUNLSEVBREVSU19JTlZPS0U7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IGhlYWRlcnMNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0ID0gZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgICAgICBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4gcmVxdWVzdEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PigpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBlID0gc2YuY3JlYXRlRWxlbWVudChTb2FwTWVzc2FnZVByb3ZpZGVyLkZPT19IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGUuYWRkVGV4dE5vZGUoU29hcE1lc3NhZ2VQcm92aWRlci5GT09fSEVBREVSX0NPTlRFTlQpOw0KLSAgICAgICAgICAgIFN0cmluZyBmb29IZWFkZXIgPSBlLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkZvbyBIZWFkZXI6IiArIGZvb0hlYWRlcik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICBsaXN0LmFkZChmb29IZWFkZXIpOw0KLSAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzLnB1dChTb2FwTWVzc2FnZVByb3ZpZGVyLkZPT19IRUFERVJfUU5BTUUsIGxpc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICBlID0gc2YuY3JlYXRlRWxlbWVudChTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGUuYWRkVGV4dE5vZGUoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX0NPTlRFTlQxKTsNCi0gICAgICAgICAgICBTdHJpbmcgYmFySGVhZGVyID0gZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJCYXIgSGVhZGVyOiIgKyBiYXJIZWFkZXIpOw0KLSAgICAgICAgICAgIGxpc3QuYWRkKGJhckhlYWRlcik7DQotICAgICAgICAgICAgZSA9IHNmLmNyZWF0ZUVsZW1lbnQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBlLmFkZFRleHROb2RlKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9DT05URU5UMik7DQotICAgICAgICAgICAgYmFySGVhZGVyID0gZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJCYXIgSGVhZGVyOiIgKyBiYXJIZWFkZXIpOw0KLSAgICAgICAgICAgIGxpc3QuYWRkKGJhckhlYWRlcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnMucHV0KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9RTkFNRSwgbGlzdCk7DQotICAgICAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KENvbnN0YW50cy5KQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlMsIHJlcXVlc3RIZWFkZXJzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBEaXNwYXRjaA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIG91dGJvdW5kIGhlYWRlcnMNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3BvbnNlQ29udGV4dCA9IGRpc3BhdGNoLmdldFJlc3BvbnNlQ29udGV4dCgpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VDb250ZXh0ICE9IG51bGwpOw0KLSAgICAgICAgICAgIE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PiByZXNwb25zZUhlYWRlcnMgPSAoTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+KSANCi0gICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldChDb25zdGFudHMuSkFYV1NfSU5CT1VORF9TT0FQX0hFQURFUlMpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VIZWFkZXJzICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VIZWFkZXJzLnNpemUoKSA+PSAyKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYmF0SGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycy5nZXQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVRfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhdEhlYWRlcnMgIT0gbnVsbCAmJiBiYXRIZWFkZXJzLnNpemUoKSA9PSAxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhdEhlYWRlcnMuZ2V0KDApLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFUX0hFQURFUl9DT05URU5UKSk7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGJhckhlYWRlcnMgPXJlc3BvbnNlSGVhZGVycy5nZXQoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhckhlYWRlcnMgIT0gbnVsbCAmJiAgYmFySGVhZGVycy5zaXplKCkgPT0gMik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXJIZWFkZXJzLmdldCgwKS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfQ09OVEVOVDEpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGJhckhlYWRlcnMuZ2V0KDEpLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9DT05URU5UMikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBmb28gaGVhZGVyIGluIHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmb29IZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzLmdldChTb2FwTWVzc2FnZVByb3ZpZGVyLkZPT19IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZm9vSGVhZGVycyA9PSBudWxsKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgLy8gRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIG91dGJvdW5kIGhlYWRlcnMNCi0gICAgICAgICAgICByZXNwb25zZUNvbnRleHQgPSBkaXNwYXRjaC5nZXRSZXNwb25zZUNvbnRleHQoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlQ29udGV4dCAhPSBudWxsKTsNCi0gICAgICAgICAgICByZXNwb25zZUhlYWRlcnMgPSAoTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+KSANCi0gICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldChDb25zdGFudHMuSkFYV1NfSU5CT1VORF9TT0FQX0hFQURFUlMpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VIZWFkZXJzICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VIZWFkZXJzLnNpemUoKSA+PSAyKTsNCi0gICAgICAgICAgICBiYXRIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzLmdldChTb2FwTWVzc2FnZVByb3ZpZGVyLkJBVF9IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmF0SGVhZGVycyAhPSBudWxsICYmIGJhdEhlYWRlcnMuc2l6ZSgpID09IDEpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmF0SGVhZGVycy5nZXQoMCkuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5CQVRfSEVBREVSX0NPTlRFTlQpKTsNCi0gICAgICAgICAgICBiYXJIZWFkZXJzID1yZXNwb25zZUhlYWRlcnMuZ2V0KFNvYXBNZXNzYWdlUHJvdmlkZXIuQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXJIZWFkZXJzICE9IG51bGwgJiYgIGJhckhlYWRlcnMuc2l6ZSgpID09IDIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmFySGVhZGVycy5nZXQoMCkuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5CQVJfSEVBREVSX0NPTlRFTlQxKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiYXJIZWFkZXJzLmdldCgxKS5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLkJBUl9IRUFERVJfQ09OVEVOVDIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZm9vIGhlYWRlciBpbiB0aGUgcmVzcG9uc2UNCi0gICAgICAgICAgICBmb29IZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzLmdldChTb2FwTWVzc2FnZVByb3ZpZGVyLkZPT19IRUFERVJfUU5BTUUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZm9vSGVhZGVycyA9PSBudWxsKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBjcmVhdGVEaXNwYXRjaCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAJDQotICAgIAkNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gDQotICAgICAgICAJc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTT0FQTWVzc2FnZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTdHJpbmc+IGNyZWF0ZVN0cmluZ0Rpc3BhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSxudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gDQotICAgICAgICAgICAgICAgIHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb21tb24gYXNzZXJ0aW9uIGNoZWNraW5nIG9mIHRoZSByZXNwb25zZQ0KLSAgICAgKiBAcGFyYW0gbXNnDQotICAgICAqIEBwYXJhbSBleHBlY3RlZFRleHQNCi0gICAgICogQHJldHVybiBTT0FQRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQRWxlbWVudCBhc3NlcnRSZXNwb25zZVhNTChTT0FQTWVzc2FnZSBtc2csIFN0cmluZyBleHBlY3RlZFRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtc2cgIT0gbnVsbCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gbXNnLmdldFNPQVBCb2R5KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJvZHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIE5vZGUgaW52b2tlRWxlbWVudCA9IChOb2RlKSBib2R5LmdldEZpcnN0Q2hpbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoaW52b2tlRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLlJFU1BPTlNFX05BTUUsIGludm9rZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBOb2RlIGRhdGFFbGVtZW50ID0gKE5vZGUpIGludm9rZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkYXRhRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLlJFU1BPTlNFX0RBVEFfTkFNRSwgZGF0YUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUT0RPIEFYSVMyIFNBQUogc2hvdWxkIChidXQgZG9lcyBub3QpIHN1cHBvcnQgdGhlIGdldFRleHRDb250ZW50KCk7DQotICAgICAgICAvLyBTdHJpbmcgdGV4dCA9IGRhdGFFbGVtZW50LmdldFRleHRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgdGV4dCA9IGRhdGFFbGVtZW50LmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIkZvdW5kICgiKyB0ZXh0ICsgIikgYnV0IGV4cGVjdGVkICgiICsgZXhwZWN0ZWRUZXh0ICsgIikiLCBleHBlY3RlZFRleHQsIHRleHQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gKFNPQVBFbGVtZW50KSBkYXRhRWxlbWVudDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvdW50IEF0dGFjaG1lbnRzDQotICAgICAqIEBwYXJhbSBtc2cNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBpbnQgY291bnRBdHRhY2htZW50cyhTT0FQTWVzc2FnZSBtc2cpIHsNCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpdCAhPSBudWxsKTsNCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBpdC5uZXh0KCk7DQotICAgICAgICAgICAgY291bnQrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU291cmNlTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb3VyY2VNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y5NjExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb3VyY2VNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgU291cmNlTWVzc2FnZVByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBQcm92aWRlclRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1NvdXJjZU1lc3NhZ2VQcm92aWRlclNlcnZpY2UuU291cmNlTWVzc2FnZVByb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNvdXJjZU1lc3NhZ2VQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sRGlyID0gInhtbCI7DQotDQotICAgIHB1YmxpYyBTb3VyY2VNZXNzYWdlUHJvdmlkZXJUZXN0cygpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNvdXJjZU1lc3NhZ2VQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU291cmNlKCl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlRGlyID0gbmV3IEZpbGUocHJvdmlkZXJSZXNvdXJjZURpciwgeG1sRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSByZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisid2ViLnhtbCI7DQotDQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgeG1sU3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShpbnB1dFN0cmVhbSk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNvdXJjZS5jbGFzcywgbnVsbCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNvdXJjZU1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotICAgICAgICAgICAgU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmVhbVNvdXJjZSk7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBTb3VyY2VNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICB4bWxTdHJlYW1Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKGlucHV0U3RyZWFtKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJlYW1Tb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvdXJjZVByb3ZpZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9Tb3VyY2VQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmIxZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL1NvdXJjZVByb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBTb3VyY2VQcm92aWRlclRlc3RzIGV4dGVuZHMgUHJvdmlkZXJUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb3VyY2VQcm92aWRlclNlcnZpY2UuU291cmNlUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU291cmNlUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgU3RyaW5nIHhtbERpciA9ICJ4bWwiOw0KLQ0KLSAgICBwdWJsaWMgU291cmNlUHJvdmlkZXJUZXN0cygpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTb3VyY2VQcm92aWRlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgICAgIA0KLSAgICBwcml2YXRlIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRm9yY2Ugc29hcCBhY3Rpb24gYmVjYXVzZSB3ZSBhcmUgcGFzc2luZyBqdW5rIG92ZXIgdGhlIHdpcmUNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwidGVzdCIpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTb3VyY2UgZ2V0U291cmNlKFN0cmluZyB0ZXh0KSB7DQotICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU291cmNlIHNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7DQotICAgICAgICB0LnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPHRlc3Q+aGVsbG8gd29ybGQ8L3Rlc3Q+IjsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucyhyZXF1ZXN0KSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlcXVlc3RTb3VyY2UgPSBnZXRTb3VyY2UocmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucyhyZXF1ZXN0KSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiIjsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2UgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UobnVsbCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKG51bGwpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShuZXcgU3RyZWFtU291cmNlKCkpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShuZXcgU3RyZWFtU291cmNlKCkpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAibWl4ZWRDb250ZW50IjsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgbWl4ZWRDb250ZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHRoZSBtaXhlZENvbnRlbnQgb3ZlciB0aGUgd2lyZSwgc28gdGhlDQotICAgICAgICAvLyBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBlY2hvJ2QgcmVzcG9uc2UgaXMgbnVsbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdENvbW1lbnRTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjwhLS1jb21tZW50LS0+IjsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHNlbmQgdGhlIGNvbW1lbnQgb3ZlciB0aGUgd2lyZSwgc28gdGhlDQotICAgICAgICAvLyBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBlY2hvJ2QgcmVzcG9uc2UgaXMgbnVsbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdFNvdXJjZSk7DQotICAgICAgICByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHRoZSBjb21tZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29FbGVtZW50c1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPGE+aGVsbG88L2E+PGI+d29ybGQ8L2I+IjsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpbiBvbmx5IHNlbmRzIHRoZSBmaXJzdCBlbGVtZW50DQotICAgICAgICAvLyBTbyB0aGUgZWNobydkIHJlc3BvbnNlIGlzIGp1c3QgdGhlIGZpcnN0IG9uZS4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjxhPmhlbGxvPC9hPiIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2VTb3VyY2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdFNvdXJjZSk7DQotICAgICAgICByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW4gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgLy8gU28gdGhlIGVjaG8nZCByZXNwb25zZSBpcyBqdXN0IHRoZSBmaXJzdCBvbmUuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCI8YT5oZWxsbzwvYT4iKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29FbGVtZW50c0FuZE1peGVkQ29udGVudFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAibWl4ZWQxPGE+aGVsbG88L2E+bWl4ZWQyPGI+d29ybGQ8L2I+bWl4ZWQzIjsNCi0gICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZ2V0U3RyaW5nKHJlc3BvbnNlU291cmNlKTsNCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgc2VuZHMgdGhlIGZpcnN0IGVsZW1lbnQuDQotICAgICAgICAvLyBUaGUgbWl4ZWQgY29udGVudCAobWl4ZWQxKSBpbnRlcmZlcmVzIGFuZCB0aHVzIG5vdGhpbmcgaXMgc2VudC4NCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVxdWVzdFNvdXJjZSA9IGdldFNvdXJjZShyZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudC4NCi0gICAgICAgIC8vIFRoZSBtaXhlZCBjb250ZW50IChtaXhlZDEpIGludGVyZmVyZXMgYW5kIHRodXMgbm90aGluZyBpcyBzZW50Lg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPHRlc3Q+dGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uPC90ZXN0PiI7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZi5nZXRGYXVsdFN0cmluZygpLmVxdWFscygicHJvdmlkZXIiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU291cmNlIHJlcXVlc3RTb3VyY2UgPSBnZXRTb3VyY2UocmVxdWVzdCk7DQotICAgICAgICAgICAgU291cmNlIHJlc3BvbnNlU291cmNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3RTb3VyY2UpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGdldFN0cmluZyhyZXNwb25zZVNvdXJjZSk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIik7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGUuZ2V0RmF1bHQoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNmLmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJwcm92aWRlciIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFVzZXJHZW5lcmF0ZWRTT0FQRmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0ZXN0PnRocm93VXNlckdlbmVyYXRlZEZhdWx0PC90ZXN0PiI7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNvdXJjZSByZXF1ZXN0U291cmNlID0gZ2V0U291cmNlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZVNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0U291cmNlKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBnZXRTdHJpbmcocmVzcG9uc2VTb3VyY2UpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBlLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZi5nZXRGYXVsdFN0cmluZygpLmVxdWFscygidXNlckdlbmVyYXRlZEZhdWx0VGVzdCIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyU291cmNlKCl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlRGlyID0gbmV3IEZpbGUocHJvdmlkZXJSZXNvdXJjZURpciwgeG1sRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSByZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisid2ViLnhtbCI7DQotDQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgeG1sU3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShpbnB1dFN0cmVhbSk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNvdXJjZS5jbGFzcywgbnVsbCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNvdXJjZSBQcm92aWRlciBEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIFNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJlYW1Tb3VyY2UpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICAgICAgeG1sU3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShpbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFNvdXJjZSBQcm92aWRlciBEaXNwYXRjaCIpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmVhbVNvdXJjZSk7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU3RyaW5nTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9TdHJpbmdNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDkzYTVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9TdHJpbmdNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi0NCi1wdWJsaWMgY2xhc3MgU3RyaW5nTWVzc2FnZVByb3ZpZGVyVGVzdHMgZXh0ZW5kcyBQcm92aWRlclRlc3RDYXNlIHsNCi0NCi0gICAgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TdHJpbmdNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlLlN0cmluZ01lc3NhZ2VQcm92aWRlclBvcnQiOw0KLSAgICBTdHJpbmcgeG1sU3RyaW5nID0gIjx0ZXN0PnRlc3QgaW5wdXQ8L3Rlc3Q+IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZSIpOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU3RyaW5nTWVzc2FnZVByb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAgICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclN0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzdmMNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IFN0cmluZ01lc3NhZ2VQcm92aWRlclNlcnZpY2UiKTsNCi0gICAgICAgIFN0cmluZyByZXRWYWwgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyaW5nKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJldFZhbCArICJdIik7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIERpc3BhdGNoPFN0cmluZz4gU3RyaW5nTWVzc2FnZVByb3ZpZGVyU2VydmljZSIpOw0KLSAgICAgICAgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9TdHJpbmdQcm92aWRlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvU3RyaW5nUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTA0MmZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9TdHJpbmdQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFN0cmluZ1Byb3ZpZGVyVGVzdHMgZXh0ZW5kcyBQcm92aWRlclRlc3RDYXNlIHsNCi0NCi0gICAgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TdHJpbmdQcm92aWRlclNlcnZpY2UuU3RyaW5nUHJvdmlkZXJQb3J0IjsNCi0gICAgU3RyaW5nIHhtbFN0cmluZyA9ICI8aW52b2tlPnRlc3QgaW5wdXQ8L2ludm9rZT4iOw0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTdHJpbmdQcm92aWRlclNlcnZpY2UiKTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFN0cmluZ1Byb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAgICAgDQotICAgIHByaXZhdGUgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaCgpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIGVuZHBvaW50VXJsKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yw0KLSAgICAgICAgICAgICAgICAuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBGb3JjZSBzb2FwIGFjdGlvbiBiZWNhdXNlIHdlIGFyZSBwYXNzaW5nIGp1bmsgb3ZlciB0aGUgd2lyZQ0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCJodHRwOi8vc3RyaW5ncHJvdmlkZXIuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmciKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPGludm9rZT5oZWxsbyB3b3JsZDwvaW52b2tlPiI7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIiI7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGJlbGllZiBpcyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBhIG51bGwgaW5kaWNhdGluZw0KLSAgICAgICAgLy8gdGhlIG5vdGhpbmcgaXMgZWNobydlZCANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBiZWxpZWYgaXMgdGhhdCB0aGlzIHNob3VsZCByZXR1cm4gYSBudWxsIGluZGljYXRpbmcNCi0gICAgICAgIC8vIHRoZSBub3RoaW5nIGlzIGVjaG8nZWQgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgYmVsaWVmIGlzIHRoYXQgdGhpcyBzaG91bGQgcmV0dXJuIGEgbnVsbCBpbmRpY2F0aW5nDQotICAgICAgICAvLyB0aGUgbm90aGluZyBpcyBlY2hvJ2VkIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGJlbGllZiBpcyB0aGF0IHRoaXMgc2hvdWxkIHJldHVybiBhIG51bGwgaW5kaWNhdGluZw0KLSAgICAgICAgLy8gdGhlIG5vdGhpbmcgaXMgZWNobydlZCANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICJtaXhlZENvbnRlbnQiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHRoZSBtaXhlZENvbnRlbnQgb3ZlciB0aGUgd2lyZSwgc28gdGhlDQotICAgICAgICAvLyBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBlY2hvJ2QgcmVzcG9uc2UgaXMgbnVsbA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmaWZ5DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCB0aGUgbWl4ZWRDb250ZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tZW50U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICI8IS0tY29tbWVudC0tPiI7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHRoZSBjb21tZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZW5kIHRoZSBjb21tZW50IG92ZXIgdGhlIHdpcmUsIHNvIHRoZQ0KLSAgICAgICAgLy8gZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgZWNobydkIHJlc3BvbnNlIGlzIG51bGwNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29FbGVtZW50c1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPGE+aGVsbG88L2E+PGI+d29ybGQ8L2I+IjsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpbiBvbmx5IHNlbmRzIHRoZSBmaXJzdCBlbGVtZW50DQotICAgICAgICAvLyBTbyB0aGUgZWNobydkIHJlc3BvbnNlIGlzIGp1c3QgdGhlIGZpcnN0IG9uZS4NCi0gICAgICAgIGFzc2VydFRydWUoIjxhPmhlbGxvPC9hPiIuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW4gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgLy8gU28gdGhlIGVjaG8nZCByZXNwb25zZSBpcyBqdXN0IHRoZSBmaXJzdCBvbmUuDQotICAgICAgICBhc3NlcnRUcnVlKCI8YT5oZWxsbzwvYT4iLmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRWxlbWVudHNBbmRNaXhlZENvbnRlbnRTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIm1peGVkMTxhPmhlbGxvPC9hPm1peGVkMjxiPndvcmxkPC9iPm1peGVkMyI7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IHNlbmRzIHRoZSBmaXJzdCBlbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIG1peGVkIGNvbnRlbnQgKG1peGVkMSkgaW50ZXJmZXJlcyBhbmQgdGh1cyBub3RoaW5nIGlzIHNlbnQuDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seSBzZW5kcyB0aGUgZmlyc3QgZWxlbWVudC4NCi0gICAgICAgIC8vIFRoZSBtaXhlZCBjb250ZW50IChtaXhlZDEpIGludGVyZmVyZXMgYW5kIHRodXMgbm90aGluZyBpcyBzZW50Lg0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPGludm9rZT50aHJvd1dlYlNlcnZpY2VFeGNlcHRpb248L2ludm9rZT4iOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIik7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGUuZ2V0RmF1bHQoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNmLmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJwcm92aWRlciIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIik7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGUuZ2V0RmF1bHQoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNmLmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJwcm92aWRlciIpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9BZGRyZXNzaW5nUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9hZGRyZXNzaW5nL0FkZHJlc3NpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E5NTZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9hZGRyZXNzaW5nL0FkZHJlc3NpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsKLQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iQWRkcmVzc2luZ1Byb3ZpZGVyU2VydmljZSIsCi0JCSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLAotCQkgICAgd3NkbExvY2F0aW9uPSJNRVRBLUlORi9BZGRyZXNzaW5nUHJvdmlkZXIud3NkbCIsCi0JCSAgICBwb3J0TmFtZT0iQWRkcmVzc2luZ1Byb3ZpZGVyUG9ydCIpCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQotQEFkZHJlc3NpbmcoZW5hYmxlZD10cnVlKQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7Ci0gICAgICAKLSAgICBTdHJpbmcgcmVzcG9uc2VNc2dTdGFydCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj48c29hcGVudjpIZWFkZXIvPjxzb2FwZW52OkJvZHk+IjsKLSAgICBTdHJpbmcgcmVzcG9uc2VNc2dFbmQgPSAiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7ICAgCi0gICAgU3RyaW5nIFhNTF9SRVRVUk4gPSAiPG5zMjpvdXRNZXNzYWdlIHhtbG5zOm5zMj1cImh0dHA6Ly9hZGRyZXNzaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmdcIj5IZWxsbyBSZXNwb25zZTwvbnMyOm91dE1lc3NhZ2U+IjsKLSAgICAgCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGludm9rZShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSkgdGhyb3dzIFNPQVBGYXVsdEV4Y2VwdGlvbiB7Ci0gICAgCXRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBYTUxfUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAJfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9ICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9NRVRBLUlORi9BZGRyZXNzaW5nUHJvdmlkZXIud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9hZGRyZXNzaW5nL01FVEEtSU5GL0FkZHJlc3NpbmdQcm92aWRlci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGEwNzE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9hZGRyZXNzaW5nL01FVEEtSU5GL0FkZHJlc3NpbmdQcm92aWRlci53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLQotLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2FkZHJlc3NpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8dHlwZXM+Ci0gICAgIAk8eHNkOnNjaGVtYQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vYWRkcmVzc2luZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIgotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbk1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0TWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQk8L3hzZDpzY2hlbWE+Ci0gICAgCi0KLSAgPC90eXBlcz4KLSAgIAotICA8bWVzc2FnZSBuYW1lPSJpbk1lc3NhZ2UiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczppbk1lc3NhZ2UiIC8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0ib3V0TWVzc2FnZSI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOm91dE1lc3NhZ2UiIC8+Ci0gIDwvbWVzc2FnZT4KLQotICA8cG9ydFR5cGUgbmFtZT0iQWRkcmVzc2luZ1Byb3ZpZGVySW50ZXJmYWNlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImhlbGxvIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6aW5NZXNzYWdlIiBuYW1lPSJJbiIgLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm91dE1lc3NhZ2UiIG5hbWU9Ik91dCIgLz4KLSAgICA8L29wZXJhdGlvbj4gIAotICA8L3BvcnRUeXBlPgotCi0gIDxiaW5kaW5nIG5hbWU9IkFkZHJlc3NpbmdQcm92aWRlckJpbmRpbmciIHR5cGU9InRuczpBZGRyZXNzaW5nUHJvdmlkZXJJbnRlcmZhY2UiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImhlbGxvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIHN0eWxlPSJkb2N1bWVudCIgLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9iaW5kaW5nPgotCi0gIDxzZXJ2aWNlIG5hbWU9IkFkZHJlc3NpbmdQcm92aWRlclNlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IkFkZHJlc3NpbmdQcm92aWRlclBvcnQiIGJpbmRpbmc9InRuczpBZGRyZXNzaW5nUHJvdmlkZXJCaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzaW5nUHJvdmlkZXJTZXJ2aWNlIiAvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2FkZHJlc3NpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZjFiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvYWRkcmVzc2luZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL0pBWEJQcm92aWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2pheGIvSkFYQlByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Nzc0ZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL2pheGIvSkFYQlByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLmpheGI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5PYmplY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLlNlbmRJbWFnZTsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5TZW5kSW1hZ2VSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogQSBKQVhXUyBTb3VyY2UgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24NCi0gKg0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IkpBWEJQcm92aWRlclNlcnZpY2UiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIEpBWEJQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNvdXJjZT4gew0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlcXVpcmVkIGltcGwgbWV0aG9kIGZyb20gamF2YXgueG1sLndzLlByb3ZpZGVyIGludGVyZmFjZQ0KLSAgICAgKiBAcGFyYW0gb2JqDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBTb3VyY2UgaW52b2tlKFNvdXJjZSBvYmopIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gSkFYQiBQcm92aWRlciBTZXJ2aWNlOiBSZXF1ZXN0IHJlY2VpdmVkLiIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEpBWEIgUHJvdmlkZXIgU2VydmljZTogUmVxdWVzdCByZWNlaXZlZC5cbiIpOw0KLSAgICAgICAgU2VuZEltYWdlIHNpUmVxdWVzdCA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSBzaVJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIFN0cmVhbVNvdXJjZSBzdHJlYW1Tb3VyY2UgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgCS8vQ3JlYXRlIGEgcmVxdWVzdCBvYmplY3QNCi0gICAgICAgICAgICBzaVJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vVW5tYXJzaGFsbCByZWNpZXZlZCBTb3VyY2UgdG8gZ2V0IHJlcXVlc3QgcGFyYW0uDQotICAgICAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgICAgICBVbm1hcnNoYWxsZXIgdW0gPSBqYmMuY3JlYXRlVW5tYXJzaGFsbGVyKCk7DQotICAgICAgICAgICAgc2lSZXF1ZXN0ID0gKFNlbmRJbWFnZSl1bS51bm1hcnNoYWwob2JqKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL0NyZWF0ZSBhIHJlc3BvbnNlIG9iamVjdA0KLSAgICAgICAgICAgIHNpUmVzcG9uc2UgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZVJlc3BvbnNlKCk7DQotICAgICAgICAgICAgc2lSZXNwb25zZS5zZXRPdXRwdXQoc2lSZXF1ZXN0LmdldElucHV0KCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vTWFyc2hhbGwgdGhlIHJlc3BvbnNlIG9iamVjdCBhbmQgY3JlYXRlIGEgU3RyZWFtU291cmNlIGZyb20gdGhlIA0KLSAgICAgICAgICAgIC8vcmVzdWx0aW5nIGJ5dGUgYXJyYXkgaW5wdXQgc3RyZWFtDQotICAgICAgICAgICAgTWFyc2hhbGxlciBtID0gamJjLmNyZWF0ZU1hcnNoYWxsZXIoKTsNCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBtLm1hcnNoYWwoc2lSZXNwb25zZSwgYmFvcyk7DQotICAgICAgICAgICAgYnl0ZSBbXWJpdGUgPSBiYW9zLnRvQnl0ZUFycmF5KCk7DQotICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiaXRlKTsNCi0gICAgICAgICAgICBzdHJlYW1Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHN0cmVhbVNvdXJjZTsNCi0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvamF4Yi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9qYXhiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9TT0FQQmluZGluZ1Byb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvU09BUEJpbmRpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjYxNjgyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9TT0FQQmluZGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZzsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50czsNCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJTT0FQQmluZGluZ1Byb3ZpZGVyU2VydmljZSIsIA0KLQkJCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vU09BUEJpbmRpbmdQcm92aWRlci5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgDQotCQkJCQlwb3J0TmFtZT0iU09BUEJpbmRpbmdQcm92aWRlclBvcnQiKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1AQmluZGluZ1R5cGUoQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKSANCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfTlNfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9OU19VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFX0hFQUQgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMV9OU19VUkkgKyAiXCI+IiArDQotCSI8c29hcGVudjpIZWFkZXIgLz4iICsgDQotCSI8c29hcGVudjpCb2R5PiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9IRUFEID0gDQotCQkiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotCQkiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBTT0FQMTJfTlNfVVJJICsgIlwiPiIgKw0KLQkJIjxzb2FwZW52OkhlYWRlciAvPiIgKyANCi0JCSI8c29hcGVudjpCb2R5PiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZFTE9QRV9UQUlMID0gDQotCQkiPC9zb2FwZW52OkJvZHk+IiArIA0KLQkJIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfRU5WRUxPUEVfVEFJTCA9IA0KLQkJIjwvc29hcGVudjpCb2R5PiIgKyANCi0JCSI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0NCi0NCi0JU3RyaW5nIHNvYXAxMVJlc3BvbnNlU3RyID0gIlNPQVAxMSByZXF1ZXN0IHJlY2VpdmVkIjsNCi0JU3RyaW5nIHNvYXAxMlJlc3BvbnNlU3RyID0gIlNPQVAxMiByZXF1ZXN0IHJlY2VpdmVkIjsNCi0JDQotCXB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UpIHsNCi0JCXRyeXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IEludm9rZShTT0FQTWVzc2FnZSkiKTsNCi0JCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gZ2V0U29hcFZlcnNpb25VUkkoc29hcE1lc3NhZ2UpOw0KLQkJCS8vcmV0dXJuIFNPQVAxMSByZXNwb25zZSBpZiB0aGlzIGlzIGEgU09BUDExIE1lc3NhZ2UNCi0JCQlpZihuYW1lc3BhY2VVUkkuZXF1YWxzKFNPQVAxMV9OU19VUkkpKXsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTT0FQMTFfTlNfVVJJIGZvdW5kIGluIHRoZSByZXF1ZXN0Iik7DQotCQkgICAgICAgIHJldHVybiBnZXRTT0FQMTFSZXNwb25zZSgpOw0KLQkJCX0NCi0JCQkvL3JldHVybiBTT0FQMTIgcmVzcG9uc2UgaWYgdGhpcyBpcyBhIFNPQVAxMSBNZXNzYWdlDQotCQkJaWYobmFtZXNwYWNlVVJJLmVxdWFscyhTT0FQMTJfTlNfVVJJKSl7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU09BUDEyX05TX1VSSSBmb3VuZCBpbiB0aGUgcmVxdWVzdCIpOw0KLQkJCQlyZXR1cm4gZ2V0U09BUDEyUmVzcG9uc2UoKTsNCi0JCQl9DQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLQkJfQ0KLQkJdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlJlcXVlc3QgcmVjZWl2ZWQgYnV0IGNvdWxkIG5vdCBpbnRlcnBlciB0aGUgcHJvdG9jb2wiKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRTb2FwVmVyc2lvblVSSShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSl0aHJvd3MgU09BUEV4Y2VwdGlvbnsNCi0JCVNPQVBQYXJ0IHNwID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsNCi0JCVNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7DQotCQlyZXR1cm4gZW52ZWxvcGUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotCX0NCi0JDQotCXByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0U09BUDExUmVzcG9uc2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257DQotCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IFNPQVAxMV9FTlZFTE9QRV9IRUFEICsiPHJldHVybj4iKyBzb2FwMTFSZXNwb25zZVN0cisiPC9yZXR1cm4+IiArIFNPQVAxMV9FTlZFTE9QRV9UQUlMOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBTT0FQMTEgUmVzcG9uc2UiKTsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0JCQ0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBNZXNzYWdlIGdldFNPQVAxMlJlc3BvbnNlKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24sIElPRXhjZXB0aW9uew0KLQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOw0KLQkJTWltZUhlYWRlcnMgaGVhZGVyID0gbmV3IE1pbWVIZWFkZXJzKCk7DQotCQloZWFkZXIuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vc29hcCt4bWwiKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IFNPQVAxMl9FTlZFTE9QRV9IRUFEICsiPHJldHVybj4iKyBzb2FwMTJSZXNwb25zZVN0cisiPC9yZXR1cm4+IiArIFNPQVAxMl9FTlZFTE9QRV9UQUlMOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBTT0FQMTIgUmVzcG9uc2UiKTsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaGVhZGVyLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zb2FwbXNnL1NvYXBNZXNzYWdlUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zb2FwbXNnL1NvYXBNZXNzYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1NmI5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc29hcG1zZy9Tb2FwTWVzc2FnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZy5zb2FwbXNnOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHM7DQotDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiLCBwb3J0TmFtZT0iU29hcE1lc3NhZ2VQcm92aWRlclBvcnQiKQ0KLUBCaW5kaW5nVHlwZShDb25zdGFudHMuU09BUF9IVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsNCi0gICAgICANCi0gICAgU3RyaW5nIHJlc3BvbnNlTXNnU3RhcnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXBlbnY6SGVhZGVyLz48c29hcGVudjpCb2R5PiI7DQotICAgIFN0cmluZyByZXNwb25zZU1zZ0VuZCA9ICI8L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0NCi0gICAgLy8gUmVxdWVzdHMgYW5kIFJlc3BvbnNlIHZhbHVlcyBvZiBpbnZva2Vfc3RyIGFuZCByZXR1cm5fc3RyDQotICAgIC8vIFRoZXNlIGNvbnN0YW50cyBhcmUgcmVmZXJlbmNlZCBieSB0aGUgU29hcE1lc3NhZ2VQcm92aWRlclRlc3QgYW5kIFNvYXBNZXNzYWdlUHJvdmlkZXINCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTUE9OU0VfTkFNRSA9ICJSZXR1cm5UeXBlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTUE9OU0VfREFUQV9OQU1FID0gInJldHVybl9zdHIiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVRVNUX05BTUUgPSAiaW52b2tlT3AiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVRVNUX0RBVEFfTkFNRSA9ICJpbnZva2Vfc3RyIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9SRVFVRVNUICAgICAgICAgICAgICA9ICJ4bWwgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9SRVNQT05TRSAgICAgICAgICAgICA9ICJ4bWwgcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRU1QVFlCT0RZX1JFUVVFU1QgICAgPSAieG1sIGVtcHR5IGJvZHkgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9DSEVDS0hFQURFUlNfUkVRVUVTVCA9ICJ4bWwgY2hlY2sgaGVhZGVycyByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0NIRUNLSEVBREVSU19SRVNQT05TRT0gInhtbCBjaGVjayBoZWFkZXJzIHJlc3BvbnNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0FUVEFDSE1FTlRfUkVRVUVTVCAgID0gInhtbCBhbmQgYXR0YWNobWVudCByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0FUVEFDSE1FTlRfUkVTUE9OU0UgID0gInhtbCBhbmQgYXR0YWNobWVudCByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9NVE9NX1JFUVVFU1QgICAgICAgICA9ICJ4bWwgYW5kIG10b20gcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9NVE9NX1JFU1BPTlNFICAgICAgICA9ICJ4bWwgYW5kIG10b20gcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU1dBUkVGX1JFUVVFU1QgICAgICAgPSAieG1sIGFuZCBzd2FyZWYgcmVxdWVzdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TV0FSRUZfUkVTUE9OU0UgICAgICA9ICJ4bWwgYW5kIHN3YXJlZiByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9GQVVMVF9SRVFVRVNUICAgICAgICA9ICJ4bWwgZmF1bHQiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU09BUDEyX0ZBVUxUX1JFUVVFU1QgPSAieG1sIHNvYXAxMiBmYXVsdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9XU0VfUkVRVUVTVCAgICAgICAgPSAieG1sIHdzZSBmYXVsdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TT0FQMTJfUkVTUE9OU0UgPSAieG1sIHNvYXAxMiByZXNwb25zZSI7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBYTUxfUkVUVVJOID0gIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBBVFRBQ0hNRU5UX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9BVFRBQ0hNRU5UX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBNVE9NX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5NVE9NX1JFRiArDQotICAgICAgICAiPC9uczI6UmV0dXJuVHlwZT4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBTV0FSRUZfUkVUVVJOID0gIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NXQVJFRl9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuU1dBUkVGX1JFRiArDQotICAgICAgICAiPC9uczI6UmV0dXJuVHlwZT4iOyAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIENIRUNLSEVBREVSU19SRVRVUk4gPSAiPG5zMjpSZXR1cm5UeXBlIHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0XCI+PHJldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQ0hFQ0tIRUFERVJTX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+IiArIA0KLSAgICAgICAgIjwvbnMyOlJldHVyblR5cGU+IjsgICAgIA0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVYVF9YTUxfQVRUQUNITUVOVCA9ICI8bXlBdHRhY2htZW50PkhlbGxvIFdvcmxkPC9teUF0dGFjaG1lbnQ+IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiaGVsbG9Xb3JsZDEyMyI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1UT01fUkVGID0gIjxkYXRhPiIgKyANCi0gICAgICAgICI8eG9wOkluY2x1ZGUgaHJlZj0nY2lkOiIgKyBJRCArICInIHhtbG5zOnhvcD0naHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZScgLz4iICsNCi0gICAgICAgICAgICAiPC9kYXRhPiI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNXQVJFRl9SRUYgPSAiPGRhdGE+IiArIA0KLSAgICAgICAgImNpZDoiICsgSUQgKw0KLSAgICAgICAgIjwvZGF0YT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBGT09fSEVBREVSX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2FtcGxlMSIsICJmb28iLCAicHJlMSIpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEJBUl9IRUFERVJfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zYW1wbGUyIiwgImJhciIsICJwcmUyIik7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgQkFUX0hFQURFUl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NhbXBsZTMiLCAiYmF0IiwgInByZTMiKTsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPT19IRUFERVJfQ09OVEVOVCA9ICJmb28gY29udGVudCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBUl9IRUFERVJfQ09OVEVOVDEgPSAiYmFyIGNvbnRlbnQxIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFSX0hFQURFUl9DT05URU5UMiA9ICJiYXIgY29udGVudDIiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRfSEVBREVSX0NPTlRFTlQgPSAiYmF0IGNvbnRlbnQiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZFTE9QRV9IRUFEID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLQkiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBTT0FQMTFfTlNfVVJJICsgIlwiPiIgKw0KLQkiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLQkiPHNvYXBlbnY6Qm9keT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfRU5WRUxPUEVfSEVBRCA9IA0KLQkJIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLQkJIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDEyX05TX1VSSSArICJcIj4iICsNCi0JCSI8c29hcGVudjpIZWFkZXIgLz4iICsgDQotCQkiPHNvYXBlbnY6Qm9keT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfVEFJTCA9IA0KLQkJIjwvc29hcGVudjpCb2R5PiIgKyANCi0JCSI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX1RBSUwgPSANCi0JCSI8L3NvYXBlbnY6Qm9keT4iICsgDQotCQkiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSB0aHJvd3MgU09BUEZhdWx0RXhjZXB0aW9uIHsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU29hcE1lc3NhZ2VQcm92aWRlcjogUmVxdWVzdCByZWNlaXZlZC4iKTsNCi0gICAgCQ0KLSAgICAJdHJ5ew0KLSAgICAJICAgIC8vIExvb2sgYXQgdGhlIGluY29taW5nIHJlcXVlc3QgbWVzc2FnZQ0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXF1ZXN0IG9uIFNlcnZlcjoiKTsNCi0gICAgICAgICAgICAvL3NvYXBNZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSBkaXNjcmltaW5hdGlvbiBlbGVtZW50LiAgVGhpcyBwZXJmb3JtcyBiYXNpYyBhc3NlcnRpb25zIG9uIHRoZSByZWNlaXZlZCBtZXNzYWdlDQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZGlzY0VsZW1lbnQgPSBhc3NlcnRSZXF1ZXN0WE1MKHNvYXBNZXNzYWdlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBVc2UgdGhlIGRhdGEgZWxlbWVudCB0ZXh0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiByZXNwb25zZSB0byBzZW5kDQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgICAgIC8vIFRPRE8gQVhJUzIgU0FBSiBzaG91bGQgKGJ1dCBkb2VzIG5vdCkgc3VwcG9ydCB0aGUgZ2V0VGV4dENvbnRlbnQoKTsNCi0gICAgICAgICAgICAvLyBTdHJpbmcgdGV4dCA9IGRhdGFFbGVtZW50LmdldFRleHRDb250ZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBkaXNjRWxlbWVudC5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgIGlmIChYTUxfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX0VNUFRZQk9EWV9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTEVtcHR5Qm9keVJlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfQ0hFQ0tIRUFERVJTX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZ2V0WE1MQ2hlY2tIZWFkZXJzUmVzcG9uc2Uoc29hcE1lc3NhZ2UsIGRpc2NFbGVtZW50KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9BVFRBQ0hNRU5UX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZ2V0WE1MQXR0YWNobWVudFJlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfTVRPTV9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTE1UT01SZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX1NXQVJFRl9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTFNXQVJlZlJlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfRkFVTFRfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3dTT0FQRmF1bHRFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9XU0VfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmKFhNTF9TT0FQMTJfUkVTUE9OU0UuZXF1YWxzKHRleHQpKXsNCi0gICAgICAgICAgICAJcmVzcG9uc2UgPSBnZXRTT0FQMTJSZXNwb25zZSgpOw0KLSAgICAgICAgICAgIH1lbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBnZXQgaGVyZQ0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVua25vd24gVHlwZSBvZiBNZXNzYWdlIik7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIE1lc3NhZ2UNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFJlc3BvbnNlIGJlaW5nIHNlbnQgYnkgU2VydmVyOiIpOw0KLSAgICAgICAgICAgIC8vcmVzcG9uc2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiXG4iKTsNCi0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIAl9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAJICAgIHRocm93IHdzZTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqRVJST1I6IEluIFNvYXBNZXNzYWdlUHJvdmlkZXIuaW52b2tlOiBDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAJfQ0KLSAgICAJcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb21tb24gYXNzZXJ0aW9uIGNoZWNraW5nIG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBtc2cNCi0gICAgICogQHJldHVybiBTT0FQRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGRhdGEgZWxlbWVudA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQRWxlbWVudCBhc3NlcnRSZXF1ZXN0WE1MKFNPQVBNZXNzYWdlIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBhc3NlcnRUcnVlKG1zZyAhPSBudWxsKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtc2cuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGFzc2VydFRydWUoYm9keSAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgTm9kZSBpbnZva2VFbGVtZW50ID0gKE5vZGUpIGJvZHkuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShpbnZva2VFbGVtZW50IGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShTb2FwTWVzc2FnZVByb3ZpZGVyLlJFUVVFU1RfTkFNRS5lcXVhbHMoaW52b2tlRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICBOb2RlIGRpc2NFbGVtZW50ID0gKE5vZGUpIGludm9rZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNjRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsNCi0gICAgICAgIGFzc2VydFRydWUoU29hcE1lc3NhZ2VQcm92aWRlci5SRVFVRVNUX0RBVEFfTkFNRS5lcXVhbHMoZGlzY0VsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBkaXNjRWxlbWVudC5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXh0Lmxlbmd0aCgpID4gMCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcXVlc3QgTWVzc2FnZSBUeXBlIGlzOiIgKyB0ZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIChTT0FQRWxlbWVudCkgZGlzY0VsZW1lbnQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgb25seSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTFJlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcmFuc3BvcnQgaGVhZGVyIGNoZWNrDQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZXF1YWxzKFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFUVVFU1QpKTsNCi0NCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBCdWlsZCB0aGUgUmVzcG9uc2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlWE1MID0gcmVzcG9uc2VNc2dTdGFydCArIFhNTF9SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNldCBhIGNvbnRlbnQgZGVzY3JpcHRpb24NCi0gICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnREZXNjcmlwdGlvbihTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVNQT05TRSk7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgb25seSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTEVtcHR5Qm9keVJlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLSAgICAgICANCi0NCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBCdWlsZCB0aGUgUmVzcG9uc2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgIA0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIGNoZWNrIGhlYWRlcnMgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxDaGVja0hlYWRlcnNSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQWRkaXRpb25hbCBhc3NlcnRpb24gY2hlY2tzDQotICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVxdWVzdCkgPT0gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIGZvciBzcGVjaWZpYyBoZWFkZXJzDQotICAgICAgICBTT0FQSGVhZGVyIHNoID0gcmVxdWVzdC5nZXRTT0FQSGVhZGVyKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBzaGUgPSAoU09BUEhlYWRlckVsZW1lbnQpDQotICAgICAgICAgICAgc2guZ2V0Q2hpbGRFbGVtZW50cyhGT09fSEVBREVSX1FOQU1FKS5uZXh0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOw0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBzaGUuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoRk9PX0hFQURFUl9DT05URU5ULmVxdWFscyh0ZXh0KSk7DQotICAgICAgICANCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gc2guZ2V0Q2hpbGRFbGVtZW50cyhCQVJfSEVBREVSX1FOQU1FKTsNCi0gICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudCkgaXQubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsNCi0gICAgICAgIHRleHQgPSBzaGUuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoQkFSX0hFQURFUl9DT05URU5UMS5lcXVhbHModGV4dCkpOw0KLSAgICAgICAgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KSBpdC5uZXh0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOw0KLSAgICAgICAgdGV4dCA9IHNoZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShCQVJfSEVBREVSX0NPTlRFTlQyLmVxdWFscyh0ZXh0KSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIXNoLmdldENoaWxkRWxlbWVudHMoQkFUX0hFQURFUl9RTkFNRSkuaGFzTmV4dCgpKTsNCi0gICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBDSEVDS0hFQURFUlNfUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgcmVzcG9uc2UuZ2V0U09BUEhlYWRlcigpLmFkZEhlYWRlckVsZW1lbnQoQkFSX0hFQURFUl9RTkFNRSkuDQotICAgICAgICAgICAgYWRkVGV4dE5vZGUoQkFSX0hFQURFUl9DT05URU5UMSk7DQotICAgICAgICByZXNwb25zZS5nZXRTT0FQSGVhZGVyKCkuYWRkSGVhZGVyRWxlbWVudChCQVJfSEVBREVSX1FOQU1FKS4NCi0gICAgICAgICAgICBhZGRUZXh0Tm9kZShCQVJfSEVBREVSX0NPTlRFTlQyKTsNCi0gICAgICAgIHJlc3BvbnNlLmdldFNPQVBIZWFkZXIoKS5hZGRIZWFkZXJFbGVtZW50KEJBVF9IRUFERVJfUU5BTUUpLg0KLSAgICAgICAgICAgIGFkZFRleHROb2RlKEJBVF9IRUFERVJfQ09OVEVOVCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBhbmQgYW4gQXR0YWNobWVudCByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTEF0dGFjaG1lbnRSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQWRkaXRpb25hbCBhc3NlcnRpb24gY2hlY2tzDQotICAgICAgICBhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVxdWVzdCkgPT0gMSk7DQotICAgICAgICBBdHRhY2htZW50UGFydCByZXF1ZXN0QVAgPSAoQXR0YWNobWVudFBhcnQpIHJlcXVlc3QuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgcmVxdWVzdEFQLmdldENvbnRlbnQoKTsNCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBBVFRBQ0hNRU5UX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCBhdHRhY2ggdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gcmVzcG9uc2UuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0gICAgICAgIGFwLnNldENvbnRlbnRJZChJRCk7DQotICAgICAgICByZXNwb25zZS5hZGRBdHRhY2htZW50UGFydChhcCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBhbmQgYW4gTVRPTSBBdHRhY2htZW50IHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MTVRPTVJlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBNVE9NIE1lc3NhZ2UiKTsNCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgcmVxdWVzdEFQID0gKEF0dGFjaG1lbnRQYXJ0KSByZXF1ZXN0LmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIHJlcXVlc3RBUC5nZXRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotDQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBNVE9NIFJlcXVlc3QgTWVzc2FnZSBhcHBlYXJzIGNvcnJlY3QuIik7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgTVRPTV9SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIHRoZSBhdHRhY2htZW50DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlc3BvbnNlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICBhcC5zZXRDb250ZW50SWQoSUQpOw0KLSAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXR1cm5pbmcgdGhlIFJlc3BvbnNlIE1lc3NhZ2UiKTsNCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBhbmQgYW4gTVRPTSBBdHRhY2htZW50IHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MU1dBUmVmUmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgcmVxdWVzdEFQID0gKEF0dGFjaG1lbnRQYXJ0KSByZXF1ZXN0LmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0QVAuZ2V0Q29udGVudElkKCkuZXF1YWxzKElEKSk7DQotICAgICAgICBTdHJlYW1Tb3VyY2UgY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgcmVxdWVzdEFQLmdldENvbnRlbnQoKTsNCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBTV0FSRUZfUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYW5kIGF0dGFjaCB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSByZXNwb25zZS5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLSAgICAgICAgYXAuc2V0Q29udGVudElkKElEKTsNCi0gICAgICAgIHJlc3BvbnNlLmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dTT0FQRmF1bHRFeGNlcHRpb24oKSB0aHJvd3MgU09BUEZhdWx0RXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtID0gbWYuY3JlYXRlTWVzc2FnZSgpOw0KLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtLmdldFNPQVBCb2R5KCk7DQotICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOw0KLSAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSwgIkNsaWVudCIpOyANCi0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUoZmF1bHRDb2RlKTsNCi0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdFN0cmluZygic2FtcGxlIGZhdWx0Iik7DQotICAgICAgICAgICAgRGV0YWlsIGRldGFpbCA9IGZhdWx0LmFkZERldGFpbCgpOw0KLSAgICAgICAgICAgIE5hbWUgZGVOYW1lID0gc2YuY3JlYXRlTmFtZSgiZGV0YWlsRW50cnkiKTsNCi0gICAgICAgICAgICBTT0FQRWxlbWVudCBkZXRhaWxFbnRyeSA9IGRldGFpbC5hZGREZXRhaWxFbnRyeShkZU5hbWUpOw0KLSAgICAgICAgICAgIGRldGFpbEVudHJ5LmFkZFRleHROb2RlKCJzYW1wbGUgZGV0YWlsIik7DQotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRBY3Rvcigic2FtcGxlIGFjdG9yIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oZmF1bHQpOw0KLSAgICAgICAgICAgIHRocm93IHNmZTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gew0KLSAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkEgV1NFIHdhcyB0aHJvd24iKTsNCi0gICAgfQ0KLSAgICAvKioNCi0gICAgICogQ291bnQgQXR0YWNobWVudHMNCi0gICAgICogQHBhcmFtIG1zZw0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGludCBjb3VudEF0dGFjaG1lbnRzKFNPQVBNZXNzYWdlIG1zZykgew0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBhc3NlcnRUcnVlKGl0ICE9IG51bGwpOw0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGl0Lm5leHQoKTsNCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBc1N0cmluZyhTdHJlYW1Tb3VyY2Ugc3MpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3V0KTsNCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzcywgcmVzdWx0KTsgDQotICAgICAgICBTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpOw0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUcnVlKGJvb2xlYW4gdGVzdEFzc2VydGlvbikgew0KLSAgICAgICAgaWYgKCF0ZXN0QXNzZXJ0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFzc2VydGlvbiBmYWxzZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCXByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0U09BUDEyUmVzcG9uc2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257DQotCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7DQotCQlNaW1lSGVhZGVycyBoZWFkZXIgPSBuZXcgTWltZUhlYWRlcnMoKTsNCi0JCWhlYWRlci5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9zb2FwK3htbCIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlWE1MID0gU09BUDEyX0VOVkVMT1BFX0hFQUQgKyI8cmV0dXJuPiIrWE1MX1NPQVAxMl9SRVNQT05TRSsiPC9yZXR1cm4+IiArIFNPQVAxMl9FTlZFTE9QRV9UQUlMOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBTT0FQMTIgUmVzcG9uc2UiKTsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoaGVhZGVyLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zdHJpbmcvU3RyaW5nUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy9zdHJpbmcvU3RyaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkM2FiMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvc3RyaW5nL1N0cmluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBiaW5kaW5nLnN0cmluZzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlNPQVBCaW5kaW5nU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIiwgDQotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9TdHJpbmdQcm92aWRlci5zb2FwYmluZGluZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwNCi0JCXBvcnROYW1lPSJTT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyUG9ydCIpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5QQVlMT0FEKQ0KLUBCaW5kaW5nVHlwZShDb25zdGFudHMuU09BUF9IVFRQX0JJTkRJTkcpDQotLyoNCi0gKiBQcm92aWRlciB3aXRoIFBBWUxPQUQgTW9kZSBvbiBTZXJ2ZXIsIHdpbGwgcmVjZWl2ZSBzb2FwMTEgYW5kIHNvYXAxMiByZXF1ZXN0cy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3RyaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsNCi0JcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgew0KLQkJaWYob2JqID09IG51bGwpew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJcmV0dXJuICI8cmV0dXJuPkhlbGxvIFN0cmluZyBQcm92aWRlcjwvcmV0dXJuPiI7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3Rlc3RzL1NPQVBCaW5kaW5nUHJvdmlkZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3Rlc3RzL1NPQVBCaW5kaW5nUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTJlNDU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9TT0FQQmluZGluZ1Byb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBiaW5kaW5nLnRlc3RzOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnBvbHltb3JwaGljLnNoYXBlLnRlc3RzLlBvbHltb3JwaGljVGVzdHM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUHJvdmlkZXJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUEJpbmRpbmdQcm92aWRlclNlcnZpY2UuU09BUEJpbmRpbmdQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vU09BUEJpbmRpbmdQcm92aWRlci5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlNPQVBCaW5kaW5nUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSAgbmV3IFFOYW1lKCJodHRwOi8vU09BUEJpbmRpbmdQcm92aWRlci5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlNPQVBCaW5kaW5nUHJvdmlkZXJQb3J0Iik7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZFTE9QRV9IRUFEID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLQkiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBTT0FQMTFfTlNfVVJJICsgIlwiPiIgKw0KLQkiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLQkiPHNvYXBlbnY6Qm9keT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfRU5WRUxPUEVfSEVBRCA9IA0KLQkJIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLQkJIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDEyX05TX1VSSSArICJcIj4iICsNCi0JCSI8c29hcGVudjpIZWFkZXIgLz4iICsgDQotCQkiPHNvYXBlbnY6Qm9keT4iOw0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfVEFJTCA9IA0KLQkJIjwvc29hcGVudjpCb2R5PiIgKyANCi0JCSI8L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX1RBSUwgPSANCi0JCSI8L3NvYXBlbnY6Qm9keT4iICsgDQotCQkiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotDQotCVN0cmluZyByZXF1ZXN0ID0gIjxpbnZva2VPcD5IZWxsbyBXb3JsZDwvaW52b2tlT3A+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNPQVBCaW5kaW5nUHJvdmlkZXJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U29hcDExUmVxdWVzdCgpew0KLQkJdHJ5ew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0JCQkNCi0JCQlEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2g9Z2V0RGlzcGF0Y2goKTsNCi0JCQlTdHJpbmcgc29hcE1lc3NhZ2UgPSBnZXRTT0FQMTFNZXNzYWdlKCk7DQotCQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotCQkJU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc29hcE1lc3NhZ2UuZ2V0Qnl0ZXMoKSkpOw0KLQkJCU9iamVjdCBvYmogPSBkaXNwYXRjaC5pbnZva2UobWVzc2FnZSk7DQotCQkJYXNzZXJ0VHJ1ZShvYmohPW51bGwgJiYgb2JqIGluc3RhbmNlb2YgU09BUE1lc3NhZ2UpOw0KLQkJCWFzc2VydFRydWUoZ2V0VmVyc2lvblVSSShtZXNzYWdlKS5lcXVhbHMoU09BUDExX05TX1VSSSkpOw0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWx1cmUgd2hpbGUgc2VuZGluZyBzb2FwIDExIHJlcXVlc3QiKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOw0KLQkJCWZhaWwoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U29hcDEyUmVxdWVzdCgpew0KLQkJdHJ5ew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0JCQkNCi0JCQlEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2g9Z2V0RGlzcGF0Y2goKTsNCi0JCQlTdHJpbmcgc29hcE1lc3NhZ2UgPSBnZXRTT0FQMTJNZXNzYWdlKCk7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzb2FwIG1lc3NhZ2UgPSIrc29hcE1lc3NhZ2UpOw0KLQkJCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsNCi0JCQlNaW1lSGVhZGVycyBoZWFkZXIgPSBuZXcgTWltZUhlYWRlcnMoKTsNCi0JCQloZWFkZXIuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vc29hcCt4bWwiKTsNCi0JCQlTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKGhlYWRlciwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNvYXBNZXNzYWdlLmdldEJ5dGVzKCkpKTsNCi0JCQlPYmplY3Qgb2JqID0gZGlzcGF0Y2guaW52b2tlKG1lc3NhZ2UpOw0KLQkJCWFzc2VydFRydWUob2JqIT1udWxsICYmIG9iaiBpbnN0YW5jZW9mIFNPQVBNZXNzYWdlKTsNCi0JCQlhc3NlcnRUcnVlKGdldFZlcnNpb25VUkkobWVzc2FnZSkuZXF1YWxzKFNPQVAxMl9OU19VUkkpKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb3ZpZGVyIGVuZHBvaW50IHdhcyBhYmxlIHRvIHJlY2VpdmUgYm90aCBTT0FQIDExIGFuZCBTT0FQIDEyIHJlcXVlc3QiKTsNCi0JCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RpbmcgdGhhdCBlbmRwb2ludCB3aWxsIGJlIGFibGUgdG8gcmVjZWl2ZSBzb2FwIDEyIGFuZCBzb2FwIDExIHJlcXVlc3QiKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOw0KLQkJCWZhaWwoKTsNCi0JCQkNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZ2V0RGlzcGF0Y2goKXsNCi0JCVNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIGVuZHBvaW50VXJsKTsNCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU09BUE1lc3NhZ2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2g7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGdldFNPQVAxMU1lc3NhZ2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257DQotCQlyZXR1cm4gU09BUDExX0VOVkVMT1BFX0hFQUQrcmVxdWVzdCtTT0FQMTFfRU5WRUxPUEVfVEFJTDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U09BUDEyTWVzc2FnZSgpIHRocm93cyBTT0FQRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsNCi0JCXJldHVybiBTT0FQMTJfRU5WRUxPUEVfSEVBRCtyZXF1ZXN0K1NPQVAxMl9FTlZFTE9QRV9UQUlMOwkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblVSSShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSl0aHJvd3MgU09BUEV4Y2VwdGlvbnsNCi0JCVNPQVBQYXJ0IHNwID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsNCi0JCVNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7DQotCQlyZXR1cm4gZW52ZWxvcGUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3Rlc3RzL1NvYXBNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBiaW5kaW5nL3Rlc3RzL1NvYXBNZXNzYWdlUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTA1YjdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9Tb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBiaW5kaW5nLnRlc3RzOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucG9seW1vcnBoaWMuc2hhcGUudGVzdHMuUG9seW1vcnBoaWNUZXN0czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5zb2FwYmluZGluZy5zb2FwbXNnLlNvYXBNZXNzYWdlUHJvdmlkZXI7DQotDQotLyoqDQotICogVGVzdHMgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGNsaWVudCBhbmQgYSBQcm92aWRlcjxTT0FQTWVzc2FnZT4gc2VydmljZS4NCi0gKiBUaGUgY2xpZW50IGFuZCBzZXJ2aWNlIGludGVyYWN0aW9uIHRlc3RzIHZhcmlvdXMgeG1sIGFuZCBhdHRhY2htZW50IHNjZW5hcmlvcw0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFNvYXBNZXNzYWdlUHJvdmlkZXJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQlwcml2YXRlIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UuU29hcE1lc3NhZ2VQcm92aWRlclBvcnQiOw0KLQlwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vc29hcG1zZy5zb2FwYmluZGluZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlNPQVBCaW5kaW5nU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiKTsNCi0JcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9ICBuZXcgUU5hbWUoImh0dHA6Ly9zb2FwbXNnLnNvYXBiaW5kaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiU29hcE1lc3NhZ2VQcm92aWRlclBvcnQiKTsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgcmVxTXNnU3RhcnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiArDQotCSI8c29hcDpFbnZlbG9wZSB4bWxuczpzb2FwPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj48c29hcDpCb2R5PiI7DQotCTsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgcmVxTXNnRW5kID0gIjwvc29hcDpCb2R5Pjwvc29hcDpFbnZlbG9wZT4iOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBYTUxfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVFVRVNUICsNCi0JIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOw0KLQlwcml2YXRlIFN0cmluZyBFTVBUWUJPRFlfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9FTVBUWUJPRFlfUkVRVUVTVCArDQotCSI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0JcHJpdmF0ZSBTdHJpbmcgQ0hFQ0tIRUFERVJTX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQ0hFQ0tIRUFERVJTX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotCXByaXZhdGUgU3RyaW5nIEFUVEFDSE1FTlRfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9BVFRBQ0hNRU5UX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7DQotCXByaXZhdGUgU3RyaW5nIE1UT01fSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5NVE9NX1JFRiArDQotCSI8L25zMjppbnZva2VPcD4iOw0KLQlwcml2YXRlIFN0cmluZyBTV0FSRUZfSU5WT0tFID0gIjxuczI6aW52b2tlT3AgeG1sbnM6bnMyPVwiaHR0cDovL29yZy50ZXN0LnNvYXBtZXNzYWdlXCI+PGludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9TV0FSRUZfUkVRVUVTVCArDQotCSI8L2ludm9rZV9zdHI+IiArIA0KLQlTb2FwTWVzc2FnZVByb3ZpZGVyLlNXQVJFRl9SRUYgKw0KLQkiPC9uczI6aW52b2tlT3A+IjsgICANCi0JcHJpdmF0ZSBTdHJpbmcgWE1MX0ZBVUxUX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfRkFVTFRfUkVRVUVTVCArDQotCSI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0JcHJpdmF0ZSBTdHJpbmcgWE1MX1dTRV9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotCVNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1dTRV9SRVFVRVNUICsNCi0JIjwvaW52b2tlX3N0cj48L25zMjppbnZva2VPcD4iOw0KLQlwcml2YXRlIFN0cmluZyBYTUxfU09BUDEyX0ZBVUxUX0lOVk9LRSA9ICI8bnMyOmludm9rZU9wIHhtbG5zOm5zMj1cImh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZVwiPjxpbnZva2Vfc3RyPiIgKyANCi0JU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU09BUDEyX0ZBVUxUX1JFUVVFU1QgKw0KLQkiPC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZU9wPiI7ICANCi0JcHJpdmF0ZSBTdHJpbmcgWE1MX1NPQVAxMl9SRVNQT05TRV9JTlZPS0UgPSAiPG5zMjppbnZva2VPcCB4bWxuczpuczI9XCJodHRwOi8vb3JnLnRlc3Quc29hcG1lc3NhZ2VcIj48aW52b2tlX3N0cj4iICsgDQotCVNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NPQVAxMl9SRVNQT05TRSArDQotCSI8L2ludm9rZV9zdHI+PC9uczI6aW52b2tlT3A+IjsNCi0JDQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTb2FwTWVzc2FnZVByb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQkvKioNCi0JICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyBvbmx5IHhtbCBkYXRhIA0KLQkgKiBQcm92aWRlciB3aWxsIHRocm93IGEgRmF1bHQNCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlU09BUEZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotCQlEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLQ0KLQkJLy8gQ3JlYXRlIHRoZSBTT0FQTWVzc2FnZQ0KLQkJU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgWE1MX0ZBVUxUX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0JCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkJU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotDQotCQkvLyBUZXN0IHRoZSB0cmFuc3BvcnQgaGVhZGVycyBieSBzZW5kaW5nIGEgY29udGVudCBkZXNjcmlwdGlvbg0KLQkJcmVxdWVzdC5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfRkFVTFRfUkVRVUVTVCk7DQotDQotCQl0cnkgew0KLQkJCS8vIERpc3BhdGNoDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0JCQlTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0JCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBmYWlsdXJlIiwgZmFsc2UpOw0KLQkJfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBPa2F5DQotCQkJU09BUEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdCgpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygic2FtcGxlIGZhdWx0IikpOw0KLQkJCVFOYW1lIGV4cGVjdGVkRmF1bHRDb2RlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiQ2xpZW50Iik7IA0KLQkJCWFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpLmVxdWFscyhleHBlY3RlZEZhdWx0Q29kZSkpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQuZ2V0RGV0YWlsKCkgIT0gbnVsbCk7DQotCQkJRGV0YWlsRW50cnkgZGUgPSAoRGV0YWlsRW50cnkpIGZhdWx0LmdldERldGFpbCgpLmdldERldGFpbEVudHJpZXMoKS5uZXh0KCk7DQotCQkJYXNzZXJ0VHJ1ZShkZSAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGRlLmdldExvY2FsTmFtZSgpLmVxdWFscygiZGV0YWlsRW50cnkiKSk7DQotCQkJYXNzZXJ0VHJ1ZShkZS5nZXRWYWx1ZSgpLmVxdWFscygic2FtcGxlIGRldGFpbCIpKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0QWN0b3IoKS5lcXVhbHMoInNhbXBsZSBhY3RvciIpKTsNCi0JCX0gICAgDQotDQotCQkvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLQkJdHJ5IHsNCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0JCX0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gT2theQ0KLQkJCVNPQVBGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHQoKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoInNhbXBsZSBmYXVsdCIpKTsNCi0JCQlRTmFtZSBleHBlY3RlZEZhdWx0Q29kZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSwgIkNsaWVudCIpOyANCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKS5lcXVhbHMoZXhwZWN0ZWRGYXVsdENvZGUpKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldERldGFpbCgpICE9IG51bGwpOw0KLQkJCURldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KSBmYXVsdC5nZXREZXRhaWwoKS5nZXREZXRhaWxFbnRyaWVzKCkubmV4dCgpOw0KLQkJCWFzc2VydFRydWUoZGUgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShkZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRldGFpbEVudHJ5IikpOw0KLQkJCWFzc2VydFRydWUoZGUuZ2V0VmFsdWUoKS5lcXVhbHMoInNhbXBsZSBkZXRhaWwiKSk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJzYW1wbGUgYWN0b3IiKSk7DQotCQl9ICAgIA0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBTZW5kcyBhbiBTT0FQTWVzc2FnZSBjb250YWluaW5nIG9ubHkgeG1sIGRhdGEgDQotCSAqIFByb3ZpZGVyIHdpbGwgdGhyb3cgYSBnZW5lcmljIFdlYlNlcnZpY2VzRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZVdlYlNlcnZpY2VFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vIENyZWF0ZSB0aGUgZGlzcGF0Y2gNCi0JCURpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotDQotCQkvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotCQlTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBYTUxfV1NFX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0JCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkJU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotDQotCQkvLyBUZXN0IHRoZSB0cmFuc3BvcnQgaGVhZGVycyBieSBzZW5kaW5nIGEgY29udGVudCBkZXNjcmlwdGlvbg0KLQkJcmVxdWVzdC5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfV1NFX1JFUVVFU1QpOw0KLQ0KLQkJdHJ5IHsNCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZmFpbHVyZSIsIGZhbHNlKTsNCi0JCX0gY2F0Y2ggKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKSB7DQotCQkJLy8gT2theS4uLlNPQVBGYXVsdEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duDQotCQkJU09BUEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdCgpOw0KLQkJCWFzc2VydFRydWUoZmF1bHQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiQSBXU0Ugd2FzIHRocm93biIpKTsNCi0JCX0gICANCi0NCi0JCS8vIFRyeSBhIHNlY29uZCB0aW1lDQotCQl0cnkgew0KLQkJCS8vIERpc3BhdGNoDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0JCQlTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0JCQlhc3NlcnRUcnVlKCJFeHBlY3RlZCBmYWlsdXJlIiwgZmFsc2UpOw0KLQkJfSBjYXRjaCAoU09BUEZhdWx0RXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBPa2F5Li4uU09BUEZhdWx0RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24NCi0JCQlTT0FQRmF1bHQgZmF1bHQgPSBlLmdldEZhdWx0KCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJBIFdTRSB3YXMgdGhyb3duIikpOw0KLQkJfSANCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgcmF3IGF0dGFjaG1lbnRzIHRvIHRoZSB3ZWIgc2VydmljZS4gIA0KLQkgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIHRoZSBzYW1lIHJhdyBhdHRhY2htZW50cy4NCi0JICovDQotDQotCXB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlUmF3QXR0YWNobWVudCgpew0KLQkJLy8gUmF3IEF0dGFjaG1lbnRzIGFyZSBhdHRhY2htZW50cyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiB0aGUgeG1sIHdpdGggTVRPTSBvciBTV0FSZWYuDQotCQkvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gc3VwcG9ydCBpbiBBeGlzIDIgZm9yIHRoZXNlIGtpbmRzIG9mIGF0dGFjaG1lbnRzLg0KLQkJLy8gVGhlIGJlbGllZiBpcyB0aGF0IG1vc3QgY3VzdG9tZXJzIHdpbGwgdXNlIE1UT00uICBTb21lIGxlZ2FjeSBjdXN0b21lcnMgd2lsbCB1c2UgU1dBUmVmLg0KLQkJLy8gUmF3IEF0dGFjaG1lbnRzIG1heSBiZSBzbyBvbGQgdGhhdCBubyBjdXN0b21lcnMgbmVlZCB0aGlzIGJlaGF2aW9yLg0KLQkJdHJ5eyAgICAgICANCi0JCQkvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotCQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gY3JlYXRlRGlzcGF0Y2goKTsNCi0NCi0JCQkvLyBDcmVhdGUgdGhlIFNPQVBNZXNzYWdlDQotCQkJU3RyaW5nIG1zZyA9IHJlcU1zZ1N0YXJ0ICsgQVRUQUNITUVOVF9JTlZPS0UgKyByZXFNc2dFbmQ7DQotCQkJTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotCQkJU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCANCi0JCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtc2cuZ2V0Qnl0ZXMoKSkpOw0KLQ0KLQkJCS8vIEFkZCB0aGUgQXR0YWNobWVudA0KLQkJCUF0dGFjaG1lbnRQYXJ0IGFwID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQsICJ0ZXh0L3htbCIpOw0KLQkJCWFwLnNldENvbnRlbnRJZChTb2FwTWVzc2FnZVByb3ZpZGVyLklEKTsNCi0JCQlyZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsNCi0NCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotCQkJLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0JCQlTT0FQRWxlbWVudCBkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9BVFRBQ0hNRU5UX1JFU1BPTlNFKTsNCi0JCQlhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLQ0KLQkJCS8vIEdldCB0aGUgQXR0YWNobWVudA0KLQkJCUF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0NCi0JCQkvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLQkJCVN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotCQkJU3RyaW5nIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0NCi0JCQkvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXNwb25zZSBbIiArIHJlc3BvbnNlLnRvU3RyaW5nKCkgKyAiXSIpOw0KLQ0KLQ0KLQkJCS8vIFRyeSBhIHNlY29uZCB0aW1lDQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCXJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLQkJCS8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotCQkJZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQVRUQUNITUVOVF9SRVNQT05TRSk7DQotCQkJYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlc3BvbnNlKSA9PSAxKTsNCi0NCi0JCQkvLyBHZXQgdGhlIEF0dGFjaG1lbnQNCi0JCQlhdHRhY2htZW50UGFydCA9IChBdHRhY2htZW50UGFydCkgcmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCk7DQotDQotCQkJLy8gQ2hlY2sgdGhlIGF0dGFjaG1lbnQNCi0JCQljb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotCQkJY29udGVudCA9IFNvYXBNZXNzYWdlUHJvdmlkZXIuZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLQ0KLQkJCS8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotDQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotCQl9DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIFNlbmRzIGFuIFNPQVBNZXNzYWdlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIG10b20gYXR0YWNobWVudC4gIA0KLQkgKiBSZWNlaXZlcyBhIHJlc3BvbnNlIGNvbnRhaW5pbmcgeG1sIGRhdGEgYW5kIHRoZSBtdG9tIGF0dGFjaG1lbnQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJTT0FQTWVzc2FnZU1UT00oKXsNCi0JCXRyeXsgICAgICAgDQotCQkJLy8gQ3JlYXRlIHRoZSBkaXNwYXRjaA0KLQkJCURpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGNyZWF0ZURpc3BhdGNoKCk7DQotDQotCQkJLy8gTVRPTSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBkZXRlY3RlZC4gIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGl0DQotCQkJLy9CaW5kaW5nIGJpbmRpbmcgPSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotCQkJLy9TT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgYmluZGluZzsNCi0JCQkvL3NvYXBCaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLQ0KLQkJCS8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0JCQlTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBNVE9NX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0JCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCQlTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIA0KLQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotDQotCQkJLy8gQWRkIHRoZSBBdHRhY2htZW50DQotCQkJQXR0YWNobWVudFBhcnQgYXAgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotCQkJYXAuc2V0Q29udGVudElkKFNvYXBNZXNzYWdlUHJvdmlkZXIuSUQpOw0KLQkJCXJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLQ0KLQkJCS8vIERpc3BhdGNoDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBTT0FQTWVzc2FnZVByb3ZpZGVyRGlzcGF0Y2giKTsNCi0JCQlTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0JCQkvLyBDaGVjayBhc3NlcnRpb25zIGFuZCBnZXQgdGhlIGRhdGEgZWxlbWVudA0KLQkJCVNPQVBFbGVtZW50IGRhdGFFbGVtZW50ID0gYXNzZXJ0UmVzcG9uc2VYTUwocmVzcG9uc2UsIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX01UT01fUkVTUE9OU0UpOw0KLQkJCWFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMSk7DQotDQotCQkJLy8gR2V0IHRoZSBBdHRhY2htZW50DQotCQkJQXR0YWNobWVudFBhcnQgYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpIHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLQ0KLQkJCS8vIENoZWNrIHRoZSBhdHRhY2htZW50DQotCQkJU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnQoKTsNCi0JCQlTdHJpbmcgY29udGVudCA9IFNvYXBNZXNzYWdlUHJvdmlkZXIuZ2V0QXNTdHJpbmcoY29udGVudFNTKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQgIT0gbnVsbCk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCkpOw0KLQ0KLQkJCS8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotDQotDQotCQkJLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotCQkJLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0JCQlkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFU1BPTlNFKTsNCi0JCQlhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLQ0KLQkJCS8vIEdldCB0aGUgQXR0YWNobWVudA0KLQkJCWF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0NCi0JCQkvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLQkJCWNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIGF0dGFjaG1lbnRQYXJ0LmdldENvbnRlbnQoKTsNCi0JCQljb250ZW50ID0gU29hcE1lc3NhZ2VQcm92aWRlci5nZXRBc1N0cmluZyhjb250ZW50U1MpOw0KLQkJCWFzc2VydFRydWUoY29udGVudCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotDQotCQkJLy8gUHJpbnQgb3V0IHRoZSByZXNwb25zZQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gUmVzcG9uc2UgWyIgKyByZXNwb25zZS50b1N0cmluZygpICsgIl0iKTsNCi0NCi0JCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCJDYXVnaHQgZXhjZXB0aW9uICIgKyBlKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2VuZHMgYW4gU09BUE1lc3NhZ2UgY29udGFpbmluZyB4bWwgZGF0YSBhbmQgYSBzd2FyZWYgYXR0YWNobWVudCB0byB0aGUgd2ViIHNlcnZpY2UuICANCi0JICogUmVjZWl2ZXMgYSByZXNwb25zZSBjb250YWluaW5nIHhtbCBkYXRhIGFuZCB0aGUgc3dhcmVmIGF0dGFjaG1lbnQgYXR0YWNobWVudC4NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RQcm92aWRlclNPQVBNZXNzYWdlU1dBUmVmKCl7DQotCQl0cnl7ICAgICAgIA0KLQkJCS8vIENyZWF0ZSB0aGUgZGlzcGF0Y2gNCi0JCQlEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLQ0KLQkJCS8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0JCQlTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBTV0FSRUZfSU5WT0tFICsgcmVxTXNnRW5kOw0KLQkJCU1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkJCVNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgDQotCQkJCQluZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCi0NCi0JCQkvLyBBZGQgdGhlIEF0dGFjaG1lbnQNCi0JCQlBdHRhY2htZW50UGFydCBhcCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0JCQlhcC5zZXRDb250ZW50SWQoU29hcE1lc3NhZ2VQcm92aWRlci5JRCk7DQotCQkJcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhcCk7DQotDQotCQkJLy8gRGlzcGF0Y2gNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IEludm9raW5nIFNPQVBNZXNzYWdlUHJvdmlkZXJEaXNwYXRjaCIpOw0KLQkJCVNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLQkJCS8vIENoZWNrIGFzc2VydGlvbnMgYW5kIGdldCB0aGUgZGF0YSBlbGVtZW50DQotCQkJU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQgPSBhc3NlcnRSZXNwb25zZVhNTChyZXNwb25zZSwgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfU1dBUkVGX1JFU1BPTlNFKTsNCi0JCQlhc3NlcnRUcnVlKGNvdW50QXR0YWNobWVudHMocmVzcG9uc2UpID09IDEpOw0KLQ0KLQkJCS8vIEdldCB0aGUgQXR0YWNobWVudA0KLQkJCUF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0NCi0JCQkvLyBDaGVjayB0aGUgYXR0YWNobWVudA0KLQkJCVN0cmVhbVNvdXJjZSBjb250ZW50U1MgPSAoU3RyZWFtU291cmNlKSBhdHRhY2htZW50UGFydC5nZXRDb250ZW50KCk7DQotCQkJU3RyaW5nIGNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0JCQlhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5JRCwgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudElkKCkpOw0KLQ0KLQkJCS8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotDQotDQotDQotCQkJLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0JCQkvLyBEaXNwYXRjaA0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gSW52b2tpbmcgU09BUE1lc3NhZ2VQcm92aWRlckRpc3BhdGNoIik7DQotCQkJcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotCQkJLy8gQ2hlY2sgYXNzZXJ0aW9ucyBhbmQgZ2V0IHRoZSBkYXRhIGVsZW1lbnQNCi0JCQlkYXRhRWxlbWVudCA9IGFzc2VydFJlc3BvbnNlWE1MKHJlc3BvbnNlLCBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9TV0FSRUZfUkVTUE9OU0UpOw0KLQkJCWFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXNwb25zZSkgPT0gMSk7DQotDQotCQkJLy8gR2V0IHRoZSBBdHRhY2htZW50DQotCQkJYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpIHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLQ0KLQkJCS8vIENoZWNrIHRoZSBhdHRhY2htZW50DQotCQkJY29udGVudFNTID0gKFN0cmVhbVNvdXJjZSkgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudCgpOw0KLQkJCWNvbnRlbnQgPSBTb2FwTWVzc2FnZVByb3ZpZGVyLmdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotCQkJYXNzZXJ0VHJ1ZShjb250ZW50ICE9IG51bGwpOw0KLQkJCWFzc2VydFRydWUoY29udGVudC5jb250YWlucyhTb2FwTWVzc2FnZVByb3ZpZGVyLlRFWFRfWE1MX0FUVEFDSE1FTlQpKTsNCi0JCQlhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5JRCwgYXR0YWNobWVudFBhcnQuZ2V0Q29udGVudElkKCkpOw0KLQ0KLQkJCS8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFJlc3BvbnNlIFsiICsgcmVzcG9uc2UudG9TdHJpbmcoKSArICJdIik7DQotDQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbiAiICsgZSk7DQotCQl9DQotDQotCX0NCi0NCi0JLyogVGhpcyBpcyBhIG5lZ2F0aXZlIHRlc3QgY2FzZSBmb3IgYSBQcm92aWRlciB0aGF0IGhhcyBOTyBTT0FQQmluZGluZyByZXN0cmljdGlvbg0KLQkgKiBEaXNwYXRjaCB3aWxsIHNlbmQgYSBTT0FQMTEgcmVxdWVzdCBhbmQgUHJvdmlkZXIgd2lsbCBzZW5kIGEgU09BUDEyIFJlc3BvbnNlLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFNvYXAxMVJlcXVlc3RXaXRoU29hcDEyUmVzcG9uc2UoKXsNCi0JCVNPQVBNZXNzYWdlIHJlcXVlc3QgPSBudWxsOw0KLQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gbnVsbDsNCi0JCXRyeXsNCi0JCQkvLyBDcmVhdGUgdGhlIGRpc3BhdGNoDQotCQkJZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOw0KLQkJCS8vIENyZWF0ZSB0aGUgU09BUE1lc3NhZ2UNCi0JCQlTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBYTUxfU09BUDEyX1JFU1BPTlNFX0lOVk9LRSArIHJlcU1zZ0VuZDsNCi0JCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCQlyZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIA0KLQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQkJZmFpbCgiQ2F1Z2h0IEV4Y2VwdGlvbiAiK2UpOw0KLQkJfQ0KLQkJdHJ5ew0KLQkJCVNPQVBNZXNzYWdlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQkJCWFzc2VydFRydWUoIkV4cGVjdGluZyBGYWlsdXJlIiwgZmFsc2UpOw0KLQkJfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0JCQlTT0FQRmF1bHQgZmF1bHQgPSBlLmdldEZhdWx0KCk7DQotCQkJYXNzZXJ0VHJ1ZShmYXVsdCAhPSBudWxsKTsNCi0JCQlhc3NlcnRUcnVlKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJSZXF1ZXN0IFNPQVAgbWVzc2FnZSBwcm90b2NvbCBpcyB2ZXJzaW9uIDEuMSwgYnV0IFJlc3BvbnNlIFNPQVAgbWVzc2FnZSBpcyBjb25maWd1cmVkIGZvciBTT0FQIDEuMi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4iKSk7DQotCQl9DQotCQkNCi0JfQ0KLQkvKioNCi0JICogQHJldHVybg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gY3JlYXRlRGlzcGF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0NCi0JCVNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLQkJc3ZjLmFkZFBvcnQocG9ydE5hbWUsbnVsbCwgZW5kcG9pbnRVcmwpOw0KLQkJRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gDQotCQkJc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTT0FQTWVzc2FnZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLQkJcmV0dXJuIGRpc3BhdGNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIERpc3BhdGNoPFN0cmluZz4gY3JlYXRlU3RyaW5nRGlzcGF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0NCi0JCVNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUpOw0KLQkJc3ZjLmFkZFBvcnQocG9ydE5hbWUsbnVsbCwgZW5kcG9pbnRVcmwpOw0KLQkJRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IA0KLQkJCXN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotCQlyZXR1cm4gZGlzcGF0Y2g7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbW1vbiBhc3NlcnRpb24gY2hlY2tpbmcgb2YgdGhlIHJlc3BvbnNlDQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHBhcmFtIGV4cGVjdGVkVGV4dA0KLQkgKiBAcmV0dXJuIFNPQVBFbGVtZW50IHJlcHJlc2VudGluZyB0aGUgZGF0YSBlbGVtZW50DQotCSAqLw0KLQlwcml2YXRlIFNPQVBFbGVtZW50IGFzc2VydFJlc3BvbnNlWE1MKFNPQVBNZXNzYWdlIG1zZywgU3RyaW5nIGV4cGVjdGVkVGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlhc3NlcnRUcnVlKG1zZyAhPSBudWxsKTsNCi0JCVNPQVBCb2R5IGJvZHkgPSBtc2cuZ2V0U09BUEJvZHkoKTsNCi0JCWFzc2VydFRydWUoYm9keSAhPSBudWxsKTsNCi0NCi0JCU5vZGUgaW52b2tlRWxlbWVudCA9IChOb2RlKSBib2R5LmdldEZpcnN0Q2hpbGQoKTsNCi0JCWFzc2VydFRydWUoaW52b2tlRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsNCi0JCWFzc2VydEVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLlJFU1BPTlNFX05BTUUsIGludm9rZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOw0KLQ0KLQkJTm9kZSBkYXRhRWxlbWVudCA9IChOb2RlKSBpbnZva2VFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsNCi0JCWFzc2VydFRydWUoZGF0YUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7DQotCQlhc3NlcnRFcXVhbHMoU29hcE1lc3NhZ2VQcm92aWRlci5SRVNQT05TRV9EQVRBX05BTUUsIGRhdGFFbGVtZW50LmdldExvY2FsTmFtZSgpKTsNCi0NCi0JCS8vIFRPRE8gQVhJUzIgU0FBSiBzaG91bGQgKGJ1dCBkb2VzIG5vdCkgc3VwcG9ydCB0aGUgZ2V0VGV4dENvbnRlbnQoKTsNCi0JCS8vIFN0cmluZyB0ZXh0ID0gZGF0YUVsZW1lbnQuZ2V0VGV4dENvbnRlbnQoKTsNCi0JCVN0cmluZyB0ZXh0ID0gZGF0YUVsZW1lbnQuZ2V0VmFsdWUoKTsNCi0JCWFzc2VydEVxdWFscygiRm91bmQgKCIrIHRleHQgKyAiKSBidXQgZXhwZWN0ZWQgKCIgKyBleHBlY3RlZFRleHQgKyAiKSIsIGV4cGVjdGVkVGV4dCwgdGV4dCk7DQotDQotCQlyZXR1cm4gKFNPQVBFbGVtZW50KSBkYXRhRWxlbWVudDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ291bnQgQXR0YWNobWVudHMNCi0JICogQHBhcmFtIG1zZw0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwcml2YXRlIGludCBjb3VudEF0dGFjaG1lbnRzKFNPQVBNZXNzYWdlIG1zZykgew0KLQkJSXRlcmF0b3IgaXQgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsNCi0JCWludCBjb3VudCA9IDA7DQotCQlhc3NlcnRUcnVlKGl0ICE9IG51bGwpOw0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KLQkJCWl0Lm5leHQoKTsNCi0JCQljb3VudCsrOw0KLQkJfQ0KLQkJcmV0dXJuIGNvdW50Ow0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9TdHJpbmdQcm92aWRlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcGJpbmRpbmcvdGVzdHMvU3RyaW5nUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjMyNDg2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwYmluZGluZy90ZXN0cy9TdHJpbmdQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBiaW5kaW5nLnRlc3RzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgU3RyaW5nUHJvdmlkZXJUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQlwcml2YXRlIFN0cmluZyBlbmRwb2ludFVybCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclNlcnZpY2UuU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclBvcnQiOw0KLQlwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vU3RyaW5nUHJvdmlkZXIuc29hcGJpbmRpbmcucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTT0FQQmluZGluZ1N0cmluZ1Byb3ZpZGVyU2VydmljZSIpOw0KLQlwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gIG5ldyBRTmFtZSgiaHR0cDovL1N0cmluZ1Byb3ZpZGVyLnNvYXBiaW5kaW5nLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiU09BUEJpbmRpbmdTdHJpbmdQcm92aWRlclBvcnQiKTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9OU19VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX05TX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfSEVBRCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0JIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDExX05TX1VSSSArICJcIj4iICsNCi0JIjxzb2FwZW52OkhlYWRlciAvPiIgKyANCi0JIjxzb2FwZW52OkJvZHk+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX0hFQUQgPSANCi0JCSI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0JCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMl9OU19VUkkgKyAiXCI+IiArDQotCQkiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLQkJIjxzb2FwZW52OkJvZHk+IjsNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFX1RBSUwgPSANCi0JCSI8L3NvYXBlbnY6Qm9keT4iICsgDQotCQkiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZFTE9QRV9UQUlMID0gDQotCQkiPC9zb2FwZW52OkJvZHk+IiArIA0KLQkJIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQkNCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFN0cmluZ1Byb3ZpZGVyVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLS8qDQotICogVGhpcyB0ZXN0IGNhc2UgbWFrZXMgc3VyZSB0aGF0IHdlIHJlY2VpdmUgYSBzb2FwMTEgcmVzcG9uc2UgZm9yIGEgc29hcDExIHJlcXVlc3QuDQotICovDQotCXB1YmxpYyB2b2lkIHRlc3Rzb2FwMTFyZXF1ZXN0KCl7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0JCXRyeXsNCi0JCQlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0JCQlzdmMuYWRkUG9ydChwb3J0TmFtZSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBlbmRwb2ludFVybCk7DQotDQotCQkJRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9DQotCQkJCXN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotCQkJU3RyaW5nIHhtbE1lc3NhZ2UgPSBTT0FQMTFfRU5WRUxPUEVfSEVBRCsiPGludm9rZU9wPnNvYXAxMSByZXF1ZXN0PC9pbnZva2VPcD4iK1NPQVAxMV9FTlZFTE9QRV9UQUlMOw0KLQkJCVN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZSh4bWxNZXNzYWdlKTsNCi0NCi0JCQlNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JCQlTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2UuZ2V0Qnl0ZXMoKSkpOw0KLQkJCWFzc2VydFRydWUoZ2V0VmVyc2lvblVSSShzb2FwTWVzc2FnZSkuZXF1YWxzKFNPQVAxMV9OU19VUkkpKTsNCi0JCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGYWlsdXJlIHdoaWxlIHNlbmRpbmcgc29hcCAxMSByZXF1ZXN0Iik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQlmYWlsKCk7DQotCQl9DQotDQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblVSSShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSl0aHJvd3MgU09BUEV4Y2VwdGlvbnsNCi0JCVNPQVBQYXJ0IHNwID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsNCi0JCVNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7DQotCQlyZXR1cm4gZW52ZWxvcGUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL01FVEEtSU5GL1Byb3ZpZGVyU09BUE1lc3NhZ2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL01FVEEtSU5GL1Byb3ZpZGVyU09BUE1lc3NhZ2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNDdmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZy9NRVRBLUlORi9Qcm92aWRlclNPQVBNZXNzYWdlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhLS0NCi0tLT4NCi0NCi08ZGVmaW5pdGlvbnMgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgDQotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIA0KLSAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgIHhtbG5zOnRucz0iaHR0cDovL3NvYXBtc2cucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIA0KLSAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIA0KLSAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiANCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcG1zZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgIAk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2cucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwbXNnLnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdBcnJheSI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciDQotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCi0NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImluTWVzc2FnZSIgdHlwZT0idG5zOlN0cmluZ0FycmF5IiAvPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRNZXNzYWdlIiB0eXBlPSJ0bnM6U3RyaW5nQXJyYXkiIC8+DQotCQkgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlFeGNlcHRpb25GYXVsdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JPC94c2Q6c2NoZW1hPg0KLSAgICANCi0NCi0gIDwvdHlwZXM+DQotICAgDQotICA8bWVzc2FnZSBuYW1lPSJlbXB0eU1lc3NhZ2UiLz4NCi0gIDxtZXNzYWdlIG5hbWU9ImluTWVzc2FnZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczppbk1lc3NhZ2UiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJvdXRNZXNzYWdlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOm91dE1lc3NhZ2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob1NlcnZpY2VJbnRlcmZhY2UiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Imludm9rZU9wIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmluTWVzc2FnZSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvdXRNZXNzYWdlIiAvPg0KLSAgICA8L29wZXJhdGlvbj4gIA0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9TZXJ2aWNlU29hcCIgdHlwZT0idG5zOkVjaG9TZXJ2aWNlSW50ZXJmYWNlIj4NCi0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Imludm9rZU9wIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZWNob1N0cmluZyIgc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IlNvYXBNZXNzYWdlUHJvdmlkZXJTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iU29hcE1lc3NhZ2VQcm92aWRlclBvcnQiIGJpbmRpbmc9InRuczpFY2hvU2VydmljZVNvYXAiPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Tb2FwTWVzc2FnZVByb3ZpZGVyU2VydmljZSIgLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvU29hcE1lc3NhZ2VQcm92aWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2cvU29hcE1lc3NhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNhMTBjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnL1NvYXBNZXNzYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvYXBtc2c7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iU29hcE1lc3NhZ2VQcm92aWRlclNlcnZpY2UiLA0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcG1zZy5wcm92aWRlci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwNCi0JCXdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvUHJvdmlkZXJTT0FQTWVzc2FnZS53c2RsIiwNCi0JCXBvcnROYW1lPSJTb2FwTWVzc2FnZVByb3ZpZGVyUG9ydCIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykNCi1AU2VydmljZU1vZGUodmFsdWU9U2VydmljZS5Nb2RlLk1FU1NBR0UpDQotcHVibGljIGNsYXNzIFNvYXBNZXNzYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTT0FQTWVzc2FnZT4gew0KLSAgICAgIA0KLSAgICBTdHJpbmcgcmVzcG9uc2VNc2dTdGFydCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj48c29hcGVudjpIZWFkZXIvPjxzb2FwZW52OkJvZHk+IjsNCi0gICAgU3RyaW5nIHJlc3BvbnNlTXNnRW5kID0gIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLSAgICAvLyBSZXF1ZXN0cyBhbmQgUmVzcG9uc2UgdmFsdWVzIG9mIGludm9rZV9zdHIgYW5kIHJldHVybl9zdHINCi0gICAgLy8gVGhlc2UgY29uc3RhbnRzIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBTb2FwTWVzc2FnZVByb3ZpZGVyVGVzdCBhbmQgU29hcE1lc3NhZ2VQcm92aWRlcg0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNQT05TRV9OQU1FID0gIlJldHVyblR5cGUiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNQT05TRV9EQVRBX05BTUUgPSAicmV0dXJuX3N0ciI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFUVVFU1RfTkFNRSA9ICJpbnZva2VPcCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFUVVFU1RfREFUQV9OQU1FID0gImludm9rZV9zdHIiOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1JFUVVFU1QgICAgICAgICAgICAgID0gInhtbCByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1JFU1BPTlNFICAgICAgICAgICAgID0gInhtbCByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9FTVBUWUJPRFlfUkVRVUVTVCAgICA9ICJ4bWwgZW1wdHkgYm9keSByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0NIRUNLSEVBREVSU19SRVFVRVNUID0gInhtbCBjaGVjayBoZWFkZXJzIHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfQ0hFQ0tIRUFERVJTX1JFU1BPTlNFPSAieG1sIGNoZWNrIGhlYWRlcnMgcmVzcG9uc2UiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfQVRUQUNITUVOVF9SRVFVRVNUICAgPSAieG1sIGFuZCBhdHRhY2htZW50IHJlcXVlc3QiOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfQVRUQUNITUVOVF9SRVNQT05TRSAgPSAieG1sIGFuZCBhdHRhY2htZW50IHJlc3BvbnNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX01UT01fUkVRVUVTVCAgICAgICAgID0gInhtbCBhbmQgbXRvbSByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX01UT01fUkVTUE9OU0UgICAgICAgID0gInhtbCBhbmQgbXRvbSByZXNwb25zZSI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9TV0FSRUZfUkVRVUVTVCAgICAgICA9ICJ4bWwgYW5kIHN3YXJlZiByZXF1ZXN0IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX1NXQVJFRl9SRVNQT05TRSAgICAgID0gInhtbCBhbmQgc3dhcmVmIHJlc3BvbnNlIjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MX0ZBVUxUX1JFUVVFU1QgICAgICAgID0gInhtbCBmYXVsdCI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9XU0VfUkVRVUVTVCAgICAgICAgPSAieG1sIHdzZSBmYXVsdCI7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBYTUxfUkVUVVJOID0gIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBBVFRBQ0hNRU5UX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9BVFRBQ0hNRU5UX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBNVE9NX1JFVFVSTiA9ICI8bnMyOlJldHVyblR5cGUgeG1sbnM6bnMyPVwiaHR0cDovL3Rlc3RcIj48cmV0dXJuX3N0cj4iICsgDQotICAgICAgICBTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9NVE9NX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5NVE9NX1JFRiArDQotICAgICAgICAiPC9uczI6UmV0dXJuVHlwZT4iOw0KLSAgICBwcml2YXRlIFN0cmluZyBTV0FSRUZfUkVUVVJOID0gIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuWE1MX1NXQVJFRl9SRVNQT05TRSArDQotICAgICAgICAiPC9yZXR1cm5fc3RyPiIgKyANCi0gICAgICAgIFNvYXBNZXNzYWdlUHJvdmlkZXIuU1dBUkVGX1JFRiArDQotICAgICAgICAiPC9uczI6UmV0dXJuVHlwZT4iOyAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIENIRUNLSEVBREVSU19SRVRVUk4gPSAiPG5zMjpSZXR1cm5UeXBlIHhtbG5zOm5zMj1cImh0dHA6Ly90ZXN0XCI+PHJldHVybl9zdHI+IiArIA0KLSAgICAgICAgU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfQ0hFQ0tIRUFERVJTX1JFU1BPTlNFICsNCi0gICAgICAgICI8L3JldHVybl9zdHI+IiArIA0KLSAgICAgICAgIjwvbnMyOlJldHVyblR5cGU+IjsgICAgIA0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVYVF9YTUxfQVRUQUNITUVOVCA9ICI8bXlBdHRhY2htZW50PkhlbGxvIFdvcmxkPC9teUF0dGFjaG1lbnQ+IjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAiaGVsbG9Xb3JsZDEyMyI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1UT01fUkVGID0gIjxkYXRhPiIgKyANCi0gICAgICAgICI8eG9wOkluY2x1ZGUgaHJlZj0nY2lkOiIgKyBJRCArICInIHhtbG5zOnhvcD0naHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZScgLz4iICsNCi0gICAgICAgICAgICAiPC9kYXRhPiI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNXQVJFRl9SRUYgPSAiPGRhdGE+IiArIA0KLSAgICAgICAgImNpZDoiICsgSUQgKw0KLSAgICAgICAgIjwvZGF0YT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBGT09fSEVBREVSX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2FtcGxlMSIsICJmb28iLCAicHJlMSIpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEJBUl9IRUFERVJfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zYW1wbGUyIiwgImJhciIsICJwcmUyIik7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgQkFUX0hFQURFUl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NhbXBsZTMiLCAiYmF0IiwgInByZTMiKTsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPT19IRUFERVJfQ09OVEVOVCA9ICJmb28gY29udGVudCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBUl9IRUFERVJfQ09OVEVOVDEgPSAiYmFyIGNvbnRlbnQxIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFSX0hFQURFUl9DT05URU5UMiA9ICJiYXIgY29udGVudDIiOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRfSEVBREVSX0NPTlRFTlQgPSAiYmF0IGNvbnRlbnQiOw0KLSAgICANCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGludm9rZShTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSkgdGhyb3dzIFNPQVBGYXVsdEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU29hcE1lc3NhZ2VQcm92aWRlcjogUmVxdWVzdCByZWNlaXZlZC4iKTsNCi0gICAgCQ0KLSAgICAJdHJ5ew0KLSAgICAJICAgIC8vIExvb2sgYXQgdGhlIGluY29taW5nIHJlcXVlc3QgbWVzc2FnZQ0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCI+PiBSZXF1ZXN0IG9uIFNlcnZlcjoiKTsNCi0gICAgICAgICAgICAvL3NvYXBNZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gR2V0IHRoZSBkaXNjcmltaW5hdGlvbiBlbGVtZW50LiAgVGhpcyBwZXJmb3JtcyBiYXNpYyBhc3NlcnRpb25zIG9uIHRoZSByZWNlaXZlZCBtZXNzYWdlDQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZGlzY0VsZW1lbnQgPSBhc3NlcnRSZXF1ZXN0WE1MKHNvYXBNZXNzYWdlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBVc2UgdGhlIGRhdGEgZWxlbWVudCB0ZXh0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiByZXNwb25zZSB0byBzZW5kDQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgICAgIC8vIFRPRE8gQVhJUzIgU0FBSiBzaG91bGQgKGJ1dCBkb2VzIG5vdCkgc3VwcG9ydCB0aGUgZ2V0VGV4dENvbnRlbnQoKTsNCi0gICAgICAgICAgICAvLyBTdHJpbmcgdGV4dCA9IGRhdGFFbGVtZW50LmdldFRleHRDb250ZW50KCk7DQotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBkaXNjRWxlbWVudC5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgIGlmIChYTUxfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBnZXRYTUxSZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX0VNUFRZQk9EWV9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTEVtcHR5Qm9keVJlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfQ0hFQ0tIRUFERVJTX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZ2V0WE1MQ2hlY2tIZWFkZXJzUmVzcG9uc2Uoc29hcE1lc3NhZ2UsIGRpc2NFbGVtZW50KTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9BVFRBQ0hNRU5UX1JFUVVFU1QuZXF1YWxzKHRleHQpKSB7DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZ2V0WE1MQXR0YWNobWVudFJlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfTVRPTV9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTE1UT01SZXNwb25zZShzb2FwTWVzc2FnZSwgZGlzY0VsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX1NXQVJFRl9SRVFVRVNULmVxdWFscyh0ZXh0KSkgew0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGdldFhNTFNXQVJlZlJlc3BvbnNlKHNvYXBNZXNzYWdlLCBkaXNjRWxlbWVudCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChYTUxfRkFVTFRfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3dTT0FQRmF1bHRFeGNlcHRpb24oKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKFhNTF9XU0VfUkVRVUVTVC5lcXVhbHModGV4dCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBnZXQgaGVyZQ0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVW5rbm93biBUeXBlIG9mIE1lc3NhZ2UiKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgTWVzc2FnZQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBiZWluZyBzZW50IGJ5IFNlcnZlcjoiKTsNCi0gICAgICAgICAgICAvL3Jlc3BvbnNlLndyaXRlVG8oU3lzdGVtLm91dCk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7DQotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICAJfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsNCi0gICAgCSAgICB0aHJvdyB3c2U7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlcg0KLSAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCIqKipFUlJPUjogSW4gU29hcE1lc3NhZ2VQcm92aWRlci5pbnZva2U6IENhdWdodCBleGNlcHRpb24gIiArIGUpOw0KLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgIAl9DQotICAgIAlyZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbW1vbiBhc3NlcnRpb24gY2hlY2tpbmcgb2YgdGhlIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIG1zZw0KLSAgICAgKiBAcmV0dXJuIFNPQVBFbGVtZW50IHJlcHJlc2VudGluZyB0aGUgZGF0YSBlbGVtZW50DQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBFbGVtZW50IGFzc2VydFJlcXVlc3RYTUwoU09BUE1lc3NhZ2UgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGFzc2VydFRydWUobXNnICE9IG51bGwpOw0KLSAgICAgICAgU09BUEJvZHkgYm9keSA9IG1zZy5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShib2R5ICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBOb2RlIGludm9rZUVsZW1lbnQgPSAoTm9kZSkgYm9keS5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGludm9rZUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7DQotICAgICAgICBhc3NlcnRUcnVlKFNvYXBNZXNzYWdlUHJvdmlkZXIuUkVRVUVTVF9OQU1FLmVxdWFscyhpbnZva2VFbGVtZW50LmdldExvY2FsTmFtZSgpKSk7DQotICAgICAgICANCi0gICAgICAgIE5vZGUgZGlzY0VsZW1lbnQgPSAoTm9kZSkgaW52b2tlRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRpc2NFbGVtZW50IGluc3RhbmNlb2YgU09BUEVsZW1lbnQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShTb2FwTWVzc2FnZVByb3ZpZGVyLlJFUVVFU1RfREFUQV9OQU1FLmVxdWFscyhkaXNjRWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgdGV4dCA9IGRpc2NFbGVtZW50LmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHRleHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHRleHQubGVuZ3RoKCkgPiAwKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0IE1lc3NhZ2UgVHlwZSBpczoiICsgdGV4dCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiAoU09BUEVsZW1lbnQpIGRpc2NFbGVtZW50Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIG9ubHkgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJhbnNwb3J0IGhlYWRlciBjaGVjaw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmdldENvbnRlbnREZXNjcmlwdGlvbigpICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmdldENvbnRlbnREZXNjcmlwdGlvbigpLmVxdWFscyhTb2FwTWVzc2FnZVByb3ZpZGVyLlhNTF9SRVFVRVNUKSk7DQotDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBYTUxfUkVUVVJOICsgcmVzcG9uc2VNc2dFbmQ7DQotICAgICAgICByZXNwb25zZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VYTUwuZ2V0Qnl0ZXMoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZXQgYSBjb250ZW50IGRlc2NyaXB0aW9uDQotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50RGVzY3JpcHRpb24oU29hcE1lc3NhZ2VQcm92aWRlci5YTUxfUkVTUE9OU0UpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSByZXNwb25zZSBmb3IgYW4gWE1MIG9ubHkgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxFbXB0eUJvZHlSZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0gICAgICAgDQotDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7DQotICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgcmVzcG9uc2UgZm9yIGFuIFhNTCBjaGVjayBoZWFkZXJzIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIGRhdGFFbGVtZW50DQotICAgICAqIEByZXR1cm4gU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgZ2V0WE1MQ2hlY2tIZWFkZXJzUmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayBmb3Igc3BlY2lmaWMgaGVhZGVycw0KLSAgICAgICAgU09BUEhlYWRlciBzaCA9IHJlcXVlc3QuZ2V0U09BUEhlYWRlcigpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2hlID0gKFNPQVBIZWFkZXJFbGVtZW50KQ0KLSAgICAgICAgICAgIHNoLmdldENoaWxkRWxlbWVudHMoRk9PX0hFQURFUl9RTkFNRSkubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsNCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gc2hlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKEZPT19IRUFERVJfQ09OVEVOVC5lcXVhbHModGV4dCkpOw0KLSAgICAgICAgDQotICAgICAgICBJdGVyYXRvciBpdCA9IHNoLmdldENoaWxkRWxlbWVudHMoQkFSX0hFQURFUl9RTkFNRSk7DQotICAgICAgICBzaGUgPSAoU09BUEhlYWRlckVsZW1lbnQpIGl0Lm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc2hlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7DQotICAgICAgICB0ZXh0ID0gc2hlLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKEJBUl9IRUFERVJfQ09OVEVOVDEuZXF1YWxzKHRleHQpKTsNCi0gICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudCkgaXQubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzaGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNoZSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsNCi0gICAgICAgIHRleHQgPSBzaGUuZ2V0VmFsdWUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoQkFSX0hFQURFUl9DT05URU5UMi5lcXVhbHModGV4dCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCFzaC5nZXRDaGlsZEVsZW1lbnRzKEJBVF9IRUFERVJfUU5BTUUpLmhhc05leHQoKSk7DQotICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgQ0hFQ0tIRUFERVJTX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIHJlc3BvbnNlLmdldFNPQVBIZWFkZXIoKS5hZGRIZWFkZXJFbGVtZW50KEJBUl9IRUFERVJfUU5BTUUpLg0KLSAgICAgICAgICAgIGFkZFRleHROb2RlKEJBUl9IRUFERVJfQ09OVEVOVDEpOw0KLSAgICAgICAgcmVzcG9uc2UuZ2V0U09BUEhlYWRlcigpLmFkZEhlYWRlckVsZW1lbnQoQkFSX0hFQURFUl9RTkFNRSkuDQotICAgICAgICAgICAgYWRkVGV4dE5vZGUoQkFSX0hFQURFUl9DT05URU5UMik7DQotICAgICAgICByZXNwb25zZS5nZXRTT0FQSGVhZGVyKCkuYWRkSGVhZGVyRWxlbWVudChCQVRfSEVBREVSX1FOQU1FKS4NCi0gICAgICAgICAgICBhZGRUZXh0Tm9kZShCQVRfSEVBREVSX0NPTlRFTlQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgYW5kIGFuIEF0dGFjaG1lbnQgcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcGFyYW0gZGF0YUVsZW1lbnQNCi0gICAgICogQHJldHVybiBTT0FQTWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRYTUxBdHRhY2htZW50UmVzcG9uc2UoU09BUE1lc3NhZ2UgcmVxdWVzdCwgU09BUEVsZW1lbnQgZGF0YUVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgcmVxdWVzdEFQID0gKEF0dGFjaG1lbnRQYXJ0KSByZXF1ZXN0LmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIHJlcXVlc3RBUC5nZXRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgQVRUQUNITUVOVF9SRVRVUk4gKyByZXNwb25zZU1zZ0VuZDsNCi0gICAgICAgIHJlc3BvbnNlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXNwb25zZVhNTC5nZXRCeXRlcygpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIHRoZSBhdHRhY2htZW50DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IHJlc3BvbnNlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KFNvYXBNZXNzYWdlUHJvdmlkZXIuVEVYVF9YTUxfQVRUQUNITUVOVCwgInRleHQveG1sIik7DQotICAgICAgICBhcC5zZXRDb250ZW50SWQoSUQpOw0KLSAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudFBhcnQoYXApOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgYW5kIGFuIE1UT00gQXR0YWNobWVudCByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTE1UT01SZXNwb25zZShTT0FQTWVzc2FnZSByZXF1ZXN0LCBTT0FQRWxlbWVudCBkYXRhRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZWNlaXZlZCBNVE9NIE1lc3NhZ2UiKTsNCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgYXNzZXJ0aW9uIGNoZWNrcw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudEF0dGFjaG1lbnRzKHJlcXVlc3QpID09IDEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgcmVxdWVzdEFQID0gKEF0dGFjaG1lbnRQYXJ0KSByZXF1ZXN0LmdldEF0dGFjaG1lbnRzKCkubmV4dCgpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIHJlcXVlc3RBUC5nZXRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGhlIE1UT00gUmVxdWVzdCBNZXNzYWdlIGFwcGVhcnMgY29ycmVjdC4iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQnVpbGQgdGhlIFJlc3BvbnNlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZVhNTCA9IHJlc3BvbnNlTXNnU3RhcnQgKyBNVE9NX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCBhdHRhY2ggdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gcmVzcG9uc2UuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0gICAgICAgIGFwLnNldENvbnRlbnRJZChJRCk7DQotICAgICAgICByZXNwb25zZS5hZGRBdHRhY2htZW50UGFydChhcCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmV0dXJuaW5nIHRoZSBSZXNwb25zZSBNZXNzYWdlIik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIHJlc3BvbnNlIGZvciBhbiBYTUwgYW5kIGFuIE1UT00gQXR0YWNobWVudCByZXF1ZXN0DQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkYXRhRWxlbWVudA0KLSAgICAgKiBAcmV0dXJuIFNPQVBNZXNzYWdlDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIGdldFhNTFNXQVJlZlJlc3BvbnNlKFNPQVBNZXNzYWdlIHJlcXVlc3QsIFNPQVBFbGVtZW50IGRhdGFFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBZGRpdGlvbmFsIGFzc2VydGlvbiBjaGVja3MNCi0gICAgICAgIGFzc2VydFRydWUoY291bnRBdHRhY2htZW50cyhyZXF1ZXN0KSA9PSAxKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IHJlcXVlc3RBUCA9IChBdHRhY2htZW50UGFydCkgcmVxdWVzdC5nZXRBdHRhY2htZW50cygpLm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdEFQLmdldENvbnRlbnRJZCgpLmVxdWFscyhJRCkpOw0KLSAgICAgICAgU3RyZWFtU291cmNlIGNvbnRlbnRTUyA9IChTdHJlYW1Tb3VyY2UpIHJlcXVlc3RBUC5nZXRDb250ZW50KCk7DQotICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEFzU3RyaW5nKGNvbnRlbnRTUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5UKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEJ1aWxkIHRoZSBSZXNwb25zZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2VYTUwgPSByZXNwb25zZU1zZ1N0YXJ0ICsgU1dBUkVGX1JFVFVSTiArIHJlc3BvbnNlTXNnRW5kOw0KLSAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlWE1MLmdldEJ5dGVzKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCBhdHRhY2ggdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gcmVzcG9uc2UuY3JlYXRlQXR0YWNobWVudFBhcnQoU29hcE1lc3NhZ2VQcm92aWRlci5URVhUX1hNTF9BVFRBQ0hNRU5ULCAidGV4dC94bWwiKTsNCi0gICAgICAgIGFwLnNldENvbnRlbnRJZChJRCk7DQotICAgICAgICByZXNwb25zZS5hZGRBdHRhY2htZW50UGFydChhcCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93U09BUEZhdWx0RXhjZXB0aW9uKCkgdGhyb3dzIFNPQVBGYXVsdEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsNCi0gICAgICAgICAgICBRTmFtZSBmYXVsdENvZGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJDbGllbnQiKTsgDQotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7DQotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoInNhbXBsZSBmYXVsdCIpOw0KLSAgICAgICAgICAgIERldGFpbCBkZXRhaWwgPSBmYXVsdC5hZGREZXRhaWwoKTsNCi0gICAgICAgICAgICBOYW1lIGRlTmFtZSA9IHNmLmNyZWF0ZU5hbWUoImRldGFpbEVudHJ5Iik7DQotICAgICAgICAgICAgU09BUEVsZW1lbnQgZGV0YWlsRW50cnkgPSBkZXRhaWwuYWRkRGV0YWlsRW50cnkoZGVOYW1lKTsNCi0gICAgICAgICAgICBkZXRhaWxFbnRyeS5hZGRUZXh0Tm9kZSgic2FtcGxlIGRldGFpbCIpOw0KLSAgICAgICAgICAgIGZhdWx0LnNldEZhdWx0QWN0b3IoInNhbXBsZSBhY3RvciIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKGZhdWx0KTsNCi0gICAgICAgICAgICB0aHJvdyBzZmU7DQotICAgICAgICB9IGNhdGNoIChTT0FQRmF1bHRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gew0KLSAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkEgV1NFIHdhcyB0aHJvd24iKTsNCi0gICAgfQ0KLSAgICAvKioNCi0gICAgICogQ291bnQgQXR0YWNobWVudHMNCi0gICAgICogQHBhcmFtIG1zZw0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcml2YXRlIGludCBjb3VudEF0dGFjaG1lbnRzKFNPQVBNZXNzYWdlIG1zZykgew0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGludCBjb3VudCA9IDA7DQotICAgICAgICBhc3NlcnRUcnVlKGl0ICE9IG51bGwpOw0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGl0Lm5leHQoKTsNCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBc1N0cmluZyhTdHJlYW1Tb3VyY2Ugc3MpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3V0KTsNCi0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzcywgcmVzdWx0KTsgDQotICAgICAgICBTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpOw0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUcnVlKGJvb2xlYW4gdGVzdEFzc2VydGlvbikgew0KLSAgICAgICAgaWYgKCF0ZXN0QXNzZXJ0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFzc2VydGlvbiBmYWxzZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnY2hlY2ttdG9tL01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ2NoZWNrbXRvbS9Tb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ2NoZWNrbXRvbS9Tb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWI1NTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2djaGVja210b20vU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuc29hcG1zZ2NoZWNrbXRvbTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlNvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXJTZXJ2aWNlIiwNCi0JCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBtc2djaGVja210b20ucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsDQotCQlwb3J0TmFtZT0iU29hcE1lc3NhZ2VDaGVja01UT01Qcm92aWRlclBvcnQiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsNCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmVyeSBzaW1wbGUgb3BlcmF0aW9uLg0KLSAgICAgKiBJZiB0aGVyZSBhcmUgbm8gYXR0YWNobWVudHMsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICAgICAqIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBpcyBlY2hvZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlKSAgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTb2FwTWVzc2FnZUNoZWNrTVRPTVByb3ZpZGVyOiBSZXF1ZXN0IHJlY2VpdmVkLiIpOw0KLQ0KLQ0KLSAgICAgICAgaW50IG51bUF0dGFjaG1lbnRzID0gc29hcE1lc3NhZ2UuY291bnRBdHRhY2htZW50cygpOw0KLSAgICAgICAgaWYgKG51bUF0dGFjaG1lbnRzID09IDApIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXI6IE5vIEF0dGFjaG1lbnRzLiIpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJObyBBdHRhY2htZW50cyBhcmUgZGV0ZWN0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHJlc3BvbnNlLmdldFNPQVBQYXJ0KCk7DQotICAgICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKTsNCi0gICAgICAgICAgICBzb2FwQm9keS5hZGRDaGlsZEVsZW1lbnQoKFNPQVBCb2R5RWxlbWVudCkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTT0FQQm9keSgpLmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCkpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlLmFkZEF0dGFjaG1lbnRQYXJ0KChBdHRhY2htZW50UGFydCkgc29hcE1lc3NhZ2UuZ2V0QXR0YWNobWVudHMoKS5uZXh0KCkpOw0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNvYXBNZXNzYWdlQ2hlY2tNVE9NUHJvdmlkZXI6IFJldHVybmluZy4iKTsNCi0gICAgICAgIHJldHVybiByZXNwb25zZTsgIC8vIGVjaG8gYmFjayB0aGUgc2FtZSBtZXNzYWdlDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb3VudCBBdHRhY2htZW50cw0KLSAgICAgKiBAcGFyYW0gbXNnDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHByaXZhdGUgaW50IGNvdW50QXR0YWNobWVudHMoU09BUE1lc3NhZ2UgbXNnKSB7DQotICAgICAgICBJdGVyYXRvciBpdCA9IG1zZy5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgaW50IGNvdW50ID0gMDsNCi0gICAgICAgIGlmIChpdCA9PSBudWxsICkgew0KLSAgICAgICAgICAgIHJldHVybiAwOw0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGl0Lm5leHQoKTsNCi0gICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvdW50Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc29hcG1zZ211L01FVEEtSU5GL1Byb3ZpZGVyU09BUE1lc3NhZ2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvTUVUQS1JTkYvUHJvdmlkZXJTT0FQTWVzc2FnZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzhlMGUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvTUVUQS1JTkYvUHJvdmlkZXJTT0FQTWVzc2FnZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotLS0+DQotDQotPGRlZmluaXRpb25zIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIA0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwbXNnbXUucHJvdmlkZXIuamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIA0KLSAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIA0KLSAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiANCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcG1zZ211LnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPg0KLSAgPHR5cGVzPg0KLSAgICAgCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcG1zZ211LnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vc29hcG1zZ211LnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdHJpbmdBcnJheSI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciDQotCQkJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4NCi0NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImluTWVzc2FnZSIgdHlwZT0idG5zOlN0cmluZ0FycmF5IiAvPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRNZXNzYWdlIiB0eXBlPSJ0bnM6U3RyaW5nQXJyYXkiIC8+DQotCQkgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlFeGNlcHRpb25GYXVsdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JPC94c2Q6c2NoZW1hPg0KLSAgICANCi0NCi0gIDwvdHlwZXM+DQotICAgDQotICA8bWVzc2FnZSBuYW1lPSJlbXB0eU1lc3NhZ2UiLz4NCi0gIDxtZXNzYWdlIG5hbWU9ImluTWVzc2FnZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczppbk1lc3NhZ2UiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJvdXRNZXNzYWdlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOm91dE1lc3NhZ2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob1NlcnZpY2VJbnRlcmZhY2UiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczppbk1lc3NhZ2UiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3V0TWVzc2FnZSIgLz4NCi0gICAgPC9vcGVyYXRpb24+ICANCi0gIDwvcG9ydFR5cGU+DQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvU2VydmljZVNvYXAiIHR5cGU9InRuczpFY2hvU2VydmljZUludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJlY2hvU3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9iaW5kaW5nPg0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0iU29hcE1lc3NhZ2VNVVByb3ZpZGVyU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIiBiaW5kaW5nPSJ0bnM6RWNob1NlcnZpY2VTb2FwIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU29hcE1lc3NhZ2VNVVByb3ZpZGVyU2VydmljZSIgLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2dtdS9Tb2FwTWVzc2FnZU1VUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb2FwbXNnbXUvU29hcE1lc3NhZ2VNVVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjE2ZjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvYXBtc2dtdS9Tb2FwTWVzc2FnZU1VUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuc29hcG1zZ211Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkF0dGFjaG1lbnRVdGlsOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHNlcnZlciBzaWRlIGltcGxlbWVudGF0aW9uIGZvciBKQVgtV1MgUHJvdmlkZXI8TUVTU0FHRT4NCi0gKiBmb3IgU09BUDExIEJpbmRpbmcgd2l0aCBNb2RlID0gTUVTU0FHRS4NCi0gKg0KLSAqIFRoZSByZWNlaXZpbmcgbWVzc2FnZSBhbmQgdGhlIHNlbmRpbmcgYmFjayBtZXNzYWdlDQotICogbXVzdCBoYXZlIHRoZSBoZWFkZXJzIGRlZmluZWQgaW4gd3NkbC4NCi0gKi8NCi0NCi1AV2ViU2VydmljZVByb3ZpZGVyKA0KLQkJc2VydmljZU5hbWU9IlNvYXBNZXNzYWdlTVVQcm92aWRlclNlcnZpY2UiLA0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcG1zZ211LnByb3ZpZGVyLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLA0KLQkJd3NkbExvY2F0aW9uPSJNRVRBLUlORi9Qcm92aWRlclNPQVBNZXNzYWdlLndzZGwiLA0KLQkJcG9ydE5hbWU9IlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZSA9IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBTb2FwTWVzc2FnZU1VUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTT0FQTWVzc2FnZT4gew0KLSAgICAvKioNCi0gICAgICogVGhpcyBzZXJ2aWNlIHJlY2VpdmVzIHNvYXAgbWVzc2FnZSBhbmQgcmV0dXJuIGl0IGJhY2sgdG8gY2xpZW50IGFzIGlzDQotICAgICAqIG9yIGFkZCBhIHNvYXAgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIGhlYWRlciBhbmQgdGhlbiByZXR1cm4gaXQgYmFjayB0byBjbGllbnQNCi0gICAgICoNCi0gICAgICogQHBhcmFtIFNPQVBNZXNzYWdlIG9iamVjdCBzZW50IGJ5IHRoZSBjbGllbnQNCi0gICAgICogQHJldHVybiB0aGUgU09BUE1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2UgcmVxdWVzdCkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvYXBNZXNzYWdlTVVQcm92aWRlcjpJbnZva2U6IFJlcXVlc3QgcmVjZWl2ZWQiKTsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlc3BvbnNlID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IEF0dGFjaG1lbnRVdGlsLnRvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGlmIChzdHJpbmcgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImludm9rZTogLS0tUmVjZWl2ZWQgbWVzc2FnZT0gIiArIHN0cmluZyk7DQotICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuY29udGFpbnMobmV3IFN0cmluZ0J1ZmZlcihBdHRhY2htZW50VXRpbC5VTkRFUlNUT09EX01VX1RFWFQpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlU3RyID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudFV0aWwubXNnRW52TVVfdW5kZXJzdG9vZC5yZXBsYWNlQWxsKEF0dGFjaG1lbnRVdGlsLk1VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09ELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudFV0aWwuTVVIRUFERVJfU0VSVkVSX1VOREVSU1RPT0QpOw0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBBdHRhY2htZW50VXRpbC50b1NPQVBNZXNzYWdlKHJlc3BvbnNlU3RyKTsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW52b2tlOiAtLS1SZXNwb25zZSBtZXNzYWdlPSAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXR0YWNobWVudFV0aWwudG9TdHJpbmcocmVzcG9uc2UpKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcuY29udGFpbnMobmV3IFN0cmluZ0J1ZmZlcihBdHRhY2htZW50VXRpbC5NVV9URVhUKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVN0ciA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRVdGlsLm1zZ0Vudk1VLnJlcGxhY2VBbGwoQXR0YWNobWVudFV0aWwuTVVIRUFERVJfQ0xJRU5ULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRVdGlsLk1VSEVBREVSX1NFUlZFUik7DQotICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IEF0dGFjaG1lbnRVdGlsLnRvU09BUE1lc3NhZ2UocmVzcG9uc2VTdHIpOw0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpbnZva2U6IC0tLVJlc3BvbnNlIG1lc3NhZ2U9ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBdHRhY2htZW50VXRpbC50b1N0cmluZyhyZXNwb25zZSkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSByZXF1ZXN0Ow0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0TWltZUhlYWRlcnMoKS5yZW1vdmVBbGxIZWFkZXJzKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFkUmVzdWx0ID0gIioqKkVSUk9SIGF0IFNlcnZpY2UgRW5kcG9pbnQ6IFJlY2VpdmVkIG1lc3NhZ2UgaXMgTlVMTC4iOw0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oYmFkUmVzdWx0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU29hcE1lc3NhZ2VNVVByb3ZpZGVyU2VydmljZTogRmFpbGVkIHdpdGggZXhjZXB0aW9uLiIpOw0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvU291cmNlUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2UvU291cmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyZWQ0ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlL1NvdXJjZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvdXJjZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iU291cmNlUHJvdmlkZXJTZXJ2aWNlIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNvdXJjZT4gew0KLSAgICANCi0gICAgLy8gU2FtZSBsb2dpYyBhcyBTdHJpbmdQcm92aWRlcg0KLSAgICBwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2Ugc291cmNlKSB7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlUHJvdmlkZXI6IFJlcXVlc3QgcmVjZWl2ZWQuXG4iKTsNCi0gICAgCWlmIChzb3VyY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiICIuZ2V0Qnl0ZXMoKSk7DQotICAgICAgICAgICAgU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAgICAgICAgIHJldHVybiBzcmNTdHJlYW07DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE5vbi1udWxsIHNvdXJjZQ0KLSAgICAJDQotICAgIAlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAJdHJ5IHsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOw0KLSAgICAgICAgICAgIHQudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsNCi0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAJU3RyaW5nIHRleHQgPSB3cml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBTb3VyY2UgUmVxdWVzdCBvbiBTZXJ2ZXI6IFxuIiArIHRleHQpOw0KLSAgICAJDQotICAgIAlpZiAodGV4dCAhPSBudWxsICYmIHRleHQuY29udGFpbnMoInRocm93V2ViU2VydmljZUV4Y2VwdGlvbiIpKSB7DQotICAgIAkgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oInByb3ZpZGVyIik7DQotICAgIAl9ICBlbHNlIGlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5jb250YWlucygidGhyb3dVc2VyR2VuZXJhdGVkRmF1bHQiKSkgew0KLSAgICAJICAgIFN0cmluZyB1c2VyRmF1bHQgPSAiPHNvYXBlbnY6RmF1bHQgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IiArDQotICAgIAkgICAgIjxmYXVsdGNvZGU+c29hcGVudjpSZWNlaXZlcjwvZmF1bHRjb2RlPiIgKw0KLSAgICAJICAgICI8ZmF1bHRzdHJpbmc+dXNlckdlbmVyYXRlZEZhdWx0VGVzdDwvZmF1bHRzdHJpbmc+IiArDQotICAgIAkgICAgIjxkZXRhaWw+c2FtcGxlIFNPQVAgRmF1bHQgZGV0YWlsczwvZGV0YWlsPiIgKw0KLSAgICAJICAgICI8L3NvYXBlbnY6RmF1bHQ+IjsNCi0gICAgCSAgICB0ZXh0ID0gdXNlckZhdWx0Ow0KLSAgICAJfQ0KLSAgICAgICAgDQotICAgIAkNCi0gICAgCUJ5dGVBcnJheUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpOw0KLSAgICAJU291cmNlIHNyY1N0cmVhbSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAJcmV0dXJuIHNyY1N0cmVhbTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIAkNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2Vtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3NvdXJjZW1zZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2Vtc2cvU291cmNlTWVzc2FnZVByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc291cmNlbXNnL1NvdXJjZU1lc3NhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWJiNmI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zb3VyY2Vtc2cvU291cmNlTWVzc2FnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnNvdXJjZW1zZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotDQotQFdlYlNlcnZpY2VQcm92aWRlcihzZXJ2aWNlTmFtZT0iU291cmNlTWVzc2FnZVByb3ZpZGVyU2VydmljZSIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykNCi1wdWJsaWMgY2xhc3MgU291cmNlTWVzc2FnZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7DQotICAgIFN0cmluZyByZXNwb25zZUFzU3RyaW5nID0gbmV3IFN0cmluZygiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXBlbnY6SGVhZGVyLz48c29hcGVudjpCb2R5PjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vdGVzdFwiPjxyZXR1cm5fc3RyPnNvbWUgcmVzcG9uc2U8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+Iik7DQotICAgIHB1YmxpYyBTb3VyY2UgaW52b2tlKFNvdXJjZSBzb3VyY2UpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBTb3VyY2VNZXNzYWdlUHJvdmlkZXI6IFJlcXVlc3QgcmVjZWl2ZWQuIik7DQotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiPj4gU291cmNlIHRvU3RyaW5nOiBcbiIrc291cmNlLnRvU3RyaW5nKCkpOw0KLSAgICAJDQotICAgIAl0cnl7DQotICAgIAkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCi0JICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0JICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOw0KLQkgICAgICAgIHQudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlcg0KLSAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCI+PiBTb3VyY2UgUmVxdWVzdCBvbiBTZXJ2ZXI6IFxuIiArIHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsNCi0JICAgICAgICANCi0JICAgIAlieXRlW10gYnl0ZXMgPSByZXNwb25zZUFzU3RyaW5nLmdldEJ5dGVzKCk7DQotCSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0JICAgICAgICBTb3VyY2Ugc3JjU3RyZWFtID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotCSAgICAgICAgcmV0dXJuIHNyY1N0cmVhbTsNCi0gICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgCX0NCi0gICAgCXJldHVybiBudWxsOw0KLSAgICB9DQotICAgIAkNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvTUVUQS1JTkYvZWNob3N0cmluZy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZy9NRVRBLUlORi9lY2hvc3RyaW5nLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmU3ZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZy9NRVRBLUlORi9lY2hvc3RyaW5nLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3N0cmluZ3Byb3ZpZGVyLnNhbXBsZS50ZXN0Lm9yZyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlN0cmluZ1Byb3ZpZGVyIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmciPg0KLSAgPHdzZGw6dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3N0cmluZ3Byb3ZpZGVyLnNhbXBsZS50ZXN0Lm9yZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgCTx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgCQk8eHNkOnNlcXVlbmNlPg0KLSAgICAgIAkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0gICAgICAJCTwveHNkOnNlcXVlbmNlPg0KLSAgICAgIAk8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvIj4NCi0gICAgICAJPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAJCTx4c2Q6c2VxdWVuY2U+DQotICAgICAgCQkJPHhzZDplbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0gICAgICAJCTwveHNkOnNlcXVlbmNlPg0KLSAgICAgIAk8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICA8L3hzZDpzY2hlbWE+DQotICA8L3dzZGw6dHlwZXM+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIgbmFtZT0iZWNob1Jlc3BvbnNlIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNobyI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmVjaG8iIG5hbWU9ImVjaG8iLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iU3RyaW5nUHJvdmlkZXJQb3J0VHlwZSI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobyIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlN0cmluZ1Byb3ZpZGVyQmluZGluZyIgdHlwZT0idG5zOlN0cmluZ1Byb3ZpZGVyUG9ydFR5cGUiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc3RyaW5ncHJvdmlkZXIuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmciLz4NCi0gICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpiaW5kaW5nPg0KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJTdHJpbmdQcm92aWRlclNlcnZpY2UiPg0KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpTdHJpbmdQcm92aWRlckJpbmRpbmciIG5hbWU9IlN0cmluZ1Byb3ZpZGVyUG9ydCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlIi8+DQotICAgIDwvd3NkbDpwb3J0Pg0KLSAgPC93c2RsOnNlcnZpY2U+DQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvU3RyaW5nUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmcvU3RyaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YjBmMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nL1N0cmluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnN0cmluZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0NCi1AV2ViU2VydmljZVByb3ZpZGVyKA0KLSAgICAgICAgc2VydmljZU5hbWU9IlN0cmluZ1Byb3ZpZGVyU2VydmljZSIsIA0KLSAgICAgICAgd3NkbExvY2F0aW9uPSJNRVRBLUlORi9lY2hvc3RyaW5nLndzZGwiLCANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3N0cmluZ3Byb3ZpZGVyLnNhbXBsZS50ZXN0Lm9yZyIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykNCi1wdWJsaWMgY2xhc3MgU3RyaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsNCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyB0ZXh0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3RyaW5nUHJvdmlkZXIgaW52b2tlIHJlY2VpdmVkIHRoZSBtZXNzYWdlIFsiICsgdGV4dCArICJdIik7DQotICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICIgIjsNCi0gICAgICAgIH0gZWxzZSBpZiAodGV4dC5jb250YWlucygidGhyb3dXZWJTZXJ2aWNlRXhjZXB0aW9uIikpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigicHJvdmlkZXIiKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodGV4dC5jb250YWlucygiPENvZGU+IikgJiYgdGV4dC5jb250YWlucygiU09BUEZhdWx0UHJvdmlkZXJUZXN0cyIpKSB7IA0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVjZWl2ZWQgZmF1bHQgaGFzIHRoZSBSZWFzb24gc3RyaW5nDQotICAgICAgICAgICAgaWYgKHRleHQuY29udGFpbnMoIjxSZWFzb24+IikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRlc3QgZmFpbGVkOiBObyA8UmVhc29uPiBlbGVtZW50Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmICh0ZXh0LmNvbnRhaW5zKCI8ZmF1bHRjb2RlPiIpICYmIHRleHQuY29udGFpbnMoIlNPQVBGYXVsdFByb3ZpZGVyVGVzdHMiKSkgeyANCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlY2VpdmVkIGZhdWx0IGhhcyB0aGUgUmVhc29uIHN0cmluZw0KLSAgICAgICAgICAgIGlmICh0ZXh0LmNvbnRhaW5zKCI8ZmF1bHRzdHJpbmc+IikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRlc3QgZmFpbGVkOiBObyA8ZmF1bHRzdHJpbmc+IGVsZW1lbnQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIEVjaG8gdGhlIGlucHV0DQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZ21zZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyL3N0cmluZ21zZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvU3RyaW5nTWVzc2FnZVByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXIvc3RyaW5nbXNnL1N0cmluZ01lc3NhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE3MzcyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlci9zdHJpbmdtc2cvU3RyaW5nTWVzc2FnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLnN0cmluZ21zZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlN0cmluZ01lc3NhZ2VQcm92aWRlclNlcnZpY2UiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFN0cmluZ01lc3NhZ2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVzcG9uc2VHb29kID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+PHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT48cHJvdmlkZXI+PG1lc3NhZ2U+cmVxdWVzdCBwcm9jZXNzZWQ8L21lc3NhZ2U+PC9wcm92aWRlcj48L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc3BvbnNlQmFkICA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/Pjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+PHByb3ZpZGVyPjxtZXNzYWdlPkVSUk9SOm51bGwgcmVxdWVzdCByZWNlaXZlZDwvbWVzc2FnZT48cHJvdmlkZXI+PC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgb2JqKSB7DQotICAgICAgICBpZiAob2JqICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZykgb2JqOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBTdHJpbmdNZXNzYWdlUHJvdmlkZXIgcmVjZWl2ZWQgYSBuZXcgcmVxdWVzdCIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiByZXF1ZXN0IFsiICsgc3RyICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VHb29kOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEVSUk9SOm51bGwgcmVxdWVzdCByZWNlaXZlZCIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlQmFkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Bc3luY0NhbGxiYWNrLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvQXN5bmNDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjY2YTYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Bc3luY0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247DQotDQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXN5bmNDYWxsYmFjayBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlciB7DQotDQotICAgIHB1YmxpYyBBc3luY0NhbGxiYWNrKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlciNoYW5kbGVSZXNwb25zZShqYXZheC54bWwud3MuUmVzcG9uc2UpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShSZXNwb25zZSByZXNwb25zZSkgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSByZXNwb25zZS5nZXQoKTsNCi0gICAgICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBSZXR1cm5UeXBlKXsNCi0gICAgICAgICAgICAgICAgUmV0dXJuVHlwZSB0eXBlID0gKFJldHVyblR5cGUpb2JqOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5SZXR1cm4gU3RyaW5nID0gIiArIHR5cGUuZ2V0UmV0dXJuU3RyKCkpOw0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIG9yZy50ZXN0LnByb3h5LmRvY2xpdG5vbndyYXBwZWQuUmV0dXJuVHlwZSl7DQotICAgICAgICAgICAgICAgIG9yZy50ZXN0LnByb3h5LmRvY2xpdG5vbndyYXBwZWQuUmV0dXJuVHlwZSByZXR1cm5UeXBlID0gKG9yZy50ZXN0LnByb3h5LmRvY2xpdG5vbndyYXBwZWQuUmV0dXJuVHlwZSlvYmo7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PlJldHVybiBTdHJpbmcgPSAiICsgcmV0dXJuVHlwZS5nZXRSZXR1cm5TdHIoKSk7DQotICAgICAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlLmdldCBzaG91bGQgaGF2ZSBiZWVuIFJldHVyblR5cGUiKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGVjdXRpb25FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH1jYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Hb3JpbGxhRExXUHJveHlUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L0dvcmlsbGFETFdQcm94eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Y2VkODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L0dvcmlsbGFETFdQcm94eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJVdGlsc01vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkdvcmlsbGFJbnRlcmZhY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBHb3JpbGxhRExXUHJveHlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2RsdyIsICJHb3JpbGxhU2VydmljZSIpOw0KLSAgICBwcml2YXRlIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0dvcmlsbGFTZXJ2aWNlLkdvcmlsbGFQcm94eUltcGxQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0IiwNCi0gICAgICAgICAgICAiR29yaWxsYVBvcnQiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L01FVEEtSU5GL2dvcmlsbGFfZGx3LndzZGwiOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEdvcmlsbGFETFdQcm94eVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHByb3h5DQotICAgICAqIEByZXR1cm4gR29yaWxsYUludGVyZmFjZSBwcm94eQ0KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIEdvcmlsbGFJbnRlcmZhY2UgZ2V0UHJveHkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0gICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgR29yaWxsYUludGVyZmFjZS5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7IA0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gKEdvcmlsbGFJbnRlcmZhY2UpcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IE1ldGhvZCB0byBnZXQgYSBEaXNwYXRjaDxTdHJpbmc+DQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcuDQotICAgICAqIElmIHRoaXMgdGVzdCBmYWlscywgaXQgdXN1YWxseSBtZWFucyB0aGF0IHRoZXJlIGFyZSBjb25uZWN0aW9uDQotICAgICAqIHByb2JsZW1zIG9yIGRlcGxveSBwcm9ibGVtcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIEdvcmlsbGFJbnRlcmZhY2UgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFN0cmFpZ2h0IEZvcndhcmQgVGVzdA0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIkhlbGxvIFdvcmxkIjsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB3ZSBjYW4gZWNobyBhIG51bGwNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBHb3JpbGxhSW50ZXJmYWNlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG51bGw7ICAvLyBOdWxsIGlzIGFuIGFwcHJvcHJpYXRlIGlucHV0DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgPT0gbnVsbCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlID09IG51bGwpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB3aGV0aGVyIHRoZSBAWG1sU2VlQWxzbyB0aGF0IHdhcyBhZGRlZCB0byB0aGUgU0VJDQotICAgICAqIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBKQVhCQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFhtbFNlZUFsc28oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyBTZXQgdXAgdGhlIEpBWEJVdGlscyBtb25pdG9yDQotICAgICAgICAgICAgSkFYQlV0aWxzTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIEpBWEJVdGlsc01vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBHb3JpbGxhSW50ZXJmYWNlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICJIZWxsbyBXb3JsZCI7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLCByZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBOb3cgcXVlcnkgdGhlIG1vbml0b3INCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4ga2V5cyA9IEpBWEJVdGlsc01vbml0b3IuZ2V0UGFja2FnZUtleXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGtleXMgIT0gbnVsbCAmJiBrZXlzLnNpemUoKSA+IDApOw0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxrZXlzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBvYnNlcnZlZEtleSA9IGtleXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiT2JzZXJ2ZWQgS2V5ID0iICsgb2JzZXJ2ZWRLZXkpOw0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igb25lIG9mIHRoZSBleHBlY3RlZCAocmVmZXJlbmNlZCkgcGFja2FnZXMNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvYnNlcnZlZEtleS5jb250YWlucygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhIikpOw0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHBhY2thZ2UgcmVmZXJlbmNlZCBvbmx5IGJ5IGFuIEBYbWxTZWVBbHNvDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUob2JzZXJ2ZWRLZXkuY29udGFpbnMoIm9yZy50ZXN0LnN0b2NrMiIpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgICAgIEpBWEJVdGlsc01vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIE5vdyBxdWVyeSB0aGUgbW9uaXRvcg0KLSAgICAgICAgICAgIGtleXMgPSBKQVhCVXRpbHNNb25pdG9yLmdldFBhY2thZ2VLZXlzKCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShrZXlzICE9IG51bGwgJiYga2V5cy5zaXplKCkgPiAwKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8a2V5cy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgb2JzZXJ2ZWRLZXkgPSBrZXlzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk9ic2VydmVkIEtleSA9IiArIG9ic2VydmVkS2V5KTsNCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG9uZSBvZiB0aGUgZXhwZWN0ZWQgKHJlZmVyZW5jZWQpIHBhY2thZ2VzDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUob2JzZXJ2ZWRLZXkuY29udGFpbnMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YSIpKTsNCi0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBwYWNrYWdlIHJlZmVyZW5jZWQgb25seSBieSBhbiBAWG1sU2VlQWxzbw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG9ic2VydmVkS2V5LmNvbnRhaW5zKCJvcmcudGVzdC5zdG9jazIiKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCVXRpbHNNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdGluZyBvZiBTdHJpbmdMaXN0ICh4c2Q6bGlzdCBvZiBzdHJpbmcpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFJ1biB0aGUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0byB2ZXJpZnkgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nTGlzdCgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nTGlzdCgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nTGlzdCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RWNob1N0cmluZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIFdvcmxkDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDEuYWRkKCJIZWxsbyIpOw0KLSAgICAgICAgICAgIHJlcXVlc3QxLmFkZCgiV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UxID0gcHJveHkuZWNob1N0cmluZ0xpc3QocmVxdWVzdDEpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UxICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3QxLCByZXNwb25zZTEpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgbGlzdA0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTIgPSBwcm94eS5lY2hvU3RyaW5nTGlzdChyZXF1ZXN0Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDIsIHJlc3BvbnNlMikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBudWxsDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSByZXNwb25zZSB3aWxsIGJlIGFuIGVtcHR5IGFycmF5IGJlY2F1c2UNCi0gICAgICAgICAgICAvLyB0aGUgSkFYQiBiZWFuIHdpbGwgbmV2ZXIgcmVwcmVzZW50IExpc3Q8U3RyaW5nPiBhcyBhIG51bGwuICBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0MyA9IG51bGw7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMyA9IHByb3h5LmVjaG9TdHJpbmdMaXN0KHJlcXVlc3QzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMyAhPSBudWxsICYmIHJlc3BvbnNlMy5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIG51bGwgV29ybGQNCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG51bGwgaXMgcHVyZ2VkIGJ5IEpBWEIuICBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0NCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q0LmFkZCgiSGVsbG8iKTsNCi0gICAgICAgICAgICByZXF1ZXN0NC5hZGQobnVsbCk7DQotICAgICAgICAgICAgcmVxdWVzdDQuYWRkKCJXb3JsZCIpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTQgPSBwcm94eS5lY2hvU3RyaW5nTGlzdChyZXF1ZXN0NCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTQhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0MSwgcmVzcG9uc2U0KSk7ICAvLyBSZXNwb25zZSA0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgIkhlbGxvIFdvcmxkIg0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgSGVsbG8gV29ybGQgaXMgZGl2aWRlZCBpbnRvIHR3byBpdGVtcy4NCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGR1ZSB0byB0aGUgeHNkOmxpc3Qgc2VyaWFsaXphdGlvbi4gVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0NS5hZGQoIkhlbGxvIFdvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlNSA9IHByb3h5LmVjaG9TdHJpbmdMaXN0KHJlcXVlc3Q1KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNSE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3QxLCByZXNwb25zZTUpKTsgLy8gUmVzcG9uc2UgNSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0aW5nIG9mIFN0cmluZ0xpc3QgKHhzZDpsaXN0IG9mIHN0cmluZykNCi0gICAgICogU0VJIGlzIG1hcHBlZCB0byBTdHJpbmdbXSBpbnN0ZWFkIG9mIExpc3Q8U3RyaW5nPg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9TdHJpbmdMaXN0QWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIC8vIFJ1biB0aGUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0byB2ZXJpZnkgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nTGlzdEFsdCgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nTGlzdEFsdCgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nTGlzdEFsdCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RWNob1N0cmluZ0xpc3RBbHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIFdvcmxkDQotICAgICAgICAgICAgU3RyaW5nW10gcmVxdWVzdDEgPSBuZXcgU3RyaW5nW10geyJIZWxsbyIsICJXb3JsZCJ9Ow0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMSA9IHByb3h5LmVjaG9TdHJpbmdMaXN0QWx0KHJlcXVlc3QxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVBcnJheXMocmVxdWVzdDEsIHJlc3BvbnNlMSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSBhcnJheQ0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3QyID0gbmV3IFN0cmluZ1tdIHt9Ow0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMiA9IHByb3h5LmVjaG9TdHJpbmdMaXN0QWx0KHJlcXVlc3QyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMiAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVBcnJheXMocmVxdWVzdDIsIHJlc3BvbnNlMikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBudWxsDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSByZXNwb25zZSB3aWxsIGJlIGFuIGVtcHR5IGFycmF5IGJlY2F1c2UNCi0gICAgICAgICAgICAvLyB0aGUgSkFYQiBiZWFuIHdpbGwgbmV2ZXIgcmVwcmVzZW50IExpc3Q8U3RyaW5nPiBhcyBhIG51bGwuICBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3QzID0gbnVsbDsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTMgPSBwcm94eS5lY2hvU3RyaW5nTGlzdEFsdChyZXF1ZXN0Myk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTMgIT0gbnVsbCAmJiByZXNwb25zZTMubGVuZ3RoID09IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyBIZWxsbyBudWxsIFdvcmxkDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBudWxsIGlzIHB1cmdlZCBieSBKQVhCLiAgVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0NCA9IG5ldyBTdHJpbmdbXSB7IkhlbGxvIiwgbnVsbCwgIldvcmxkIn07DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2U0ID0gcHJveHkuZWNob1N0cmluZ0xpc3RBbHQocmVxdWVzdDQpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U0IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3QxLCByZXNwb25zZTQpKTsgIC8vIFJlc3BvbnNlIDQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFJlcXVlc3QgMQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyAiSGVsbG8gV29ybGQiDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBIZWxsbyBXb3JsZCBpcyBkaXZpZGVkIGludG8gdHdvIGl0ZW1zLg0KLSAgICAgICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSB4c2Q6bGlzdCBzZXJpYWxpemF0aW9uLiBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3Q1ID0gbmV3IFN0cmluZ1tdIHsiSGVsbG8gV29ybGQifTsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTUgPSBwcm94eS5lY2hvU3RyaW5nTGlzdEFsdChyZXF1ZXN0NSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTUhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVBcnJheXMocmVxdWVzdDEsIHJlc3BvbnNlNSkpOyAvLyBSZXNwb25zZSA1IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgb2YgU3RyaW5nIEFycmF5IChzdHJpbmcgbWF4T2NjdXJzPXVuYm91bmRlZCkNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvSW5kZXhlZFN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBSdW4gdGhlIHRlc3QgbXVsdGlwbGUgdGltZXMgdG8gdmVyaWZ5IGNvcnJlY3QgYmVoYXZpb3INCi0gICAgICAgIF90ZXN0RWNob0luZGV4ZWRTdHJpbmdBcnJheSgpOw0KLSAgICAgICAgX3Rlc3RFY2hvSW5kZXhlZFN0cmluZ0FycmF5KCk7DQotICAgICAgICBfdGVzdEVjaG9JbmRleGVkU3RyaW5nQXJyYXkoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEVjaG9JbmRleGVkU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIFdvcmxkDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDEuYWRkKCJIZWxsbyIpOw0KLSAgICAgICAgICAgIHJlcXVlc3QxLmFkZCgiV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UxID0gcHJveHkuZWNob0luZGV4ZWRTdHJpbmdBcnJheShyZXF1ZXN0MSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTEgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDEsIHJlc3BvbnNlMSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSBsaXN0DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlMiA9IHByb3h5LmVjaG9JbmRleGVkU3RyaW5nQXJyYXkocmVxdWVzdDIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UyICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3QyLCByZXNwb25zZTIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHdpdGggbnVsbA0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBhbiBlbXB0eSBhcnJheSBiZWNhdXNlDQotICAgICAgICAgICAgLy8gdGhlIEpBWEIgYmVhbiB3aWxsIG5ldmVyIHJlcHJlc2VudCBMaXN0PFN0cmluZz4gYXMgYSBudWxsLiAgVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDMgPSBudWxsOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXNwb25zZTMgPSBwcm94eS5lY2hvSW5kZXhlZFN0cmluZ0FycmF5KHJlcXVlc3QzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMyAhPSBudWxsICYmIHJlc3BvbnNlMy5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIG51bGwgV29ybGQNCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG51bGwgaXMgcHJlc2VydmVkIGFuZCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UNCi0gICAgICAgICAgICAvLyBhcmUgdGhlIHNhbWUuLm5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSB4c2Q6bGlzdCBwcm9jZXNzaW5nIChzZWUgdGVzdFN0cmluZ0xpc3QgYWJvdmUpDQotICAgICAgICAgICAgLy8gVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0NC5hZGQoIkhlbGxvIik7DQotICAgICAgICAgICAgcmVxdWVzdDQuYWRkKG51bGwpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q0LmFkZCgiV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2U0ID0gcHJveHkuZWNob0luZGV4ZWRTdHJpbmdBcnJheShyZXF1ZXN0NCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZTQhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0NCwgcmVzcG9uc2U0KSk7ICAvLyBSZXNwb25zZSA0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgIkhlbGxvIFdvcmxkIg0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgSGVsbG8gV29ybGQgcmVtYWlucyBvbmUgaXRlbS4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0NS5hZGQoIkhlbGxvIFdvcmxkIik7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3BvbnNlNSA9IHByb3h5LmVjaG9JbmRleGVkU3RyaW5nQXJyYXkocmVxdWVzdDUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U1IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlTGlzdHMocmVxdWVzdDUsIHJlc3BvbnNlNSkpOyAvLyBSZXNwb25zZSA1IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBSZXF1ZXN0IDENCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgb2YgU3RyaW5nIEFycmF5IChzdHJpbmcgbWF4T2NjdXJzPXVuYm91bmRlZCkNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUnVuIHRoZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRvIHZlcmlmeSBjb3JyZWN0IGJlaGF2aW9yDQotICAgICAgICBfdGVzdEVjaG9TdHJpbmdBcnJheSgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nQXJyYXkoKTsNCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0FycmF5KCk7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RFY2hvU3RyaW5nQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIFdvcmxkDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdDEuYWRkKCJIZWxsbyIpOw0KLSAgICAgICAgICAgIHJlcXVlc3QxLmFkZCgiV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UxID0gcHJveHkuZWNob1N0cmluZ0FycmF5KHJlcXVlc3QxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0MSwgcmVzcG9uc2UxKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCB3aXRoIGVtcHR5IGxpc3QNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UyID0gcHJveHkuZWNob1N0cmluZ0FycmF5KHJlcXVlc3QyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMiAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVMaXN0cyhyZXF1ZXN0MiwgcmVzcG9uc2UyKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCB3aXRoIG51bGwNCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIHJlc3BvbnNlIHdpbGwgYmUgYW4gZW1wdHkgYXJyYXkgYmVjYXVzZQ0KLSAgICAgICAgICAgIC8vIHRoZSBKQVhCIGJlYW4gd2lsbCBuZXZlciByZXByZXNlbnQgTGlzdDxTdHJpbmc+IGFzIGEgbnVsbC4gIFRoaXMgaXMgZXhwZWN0ZWQuDQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlcXVlc3QzID0gbnVsbDsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2UzID0gcHJveHkuZWNob1N0cmluZ0FycmF5KHJlcXVlc3QzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMyAhPSBudWxsICYmIHJlc3BvbnNlMy5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGVzdCBzZW5kaW5nIEhlbGxvIG51bGwgV29ybGQNCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG51bGwgaXMgcHJlc2VydmVkIGFuZCB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UNCi0gICAgICAgICAgICAvLyBhcmUgdGhlIHNhbWUuLm5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSB4c2Q6bGlzdCBwcm9jZXNzaW5nIChzZWUgdGVzdFN0cmluZ0xpc3QgYWJvdmUpDQotICAgICAgICAgICAgLy8gVGhpcyBpcyBleHBlY3RlZC4NCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVxdWVzdDQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICByZXF1ZXN0NC5hZGQoIkhlbGxvIik7DQotICAgICAgICAgICAgcmVxdWVzdDQuYWRkKG51bGwpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q0LmFkZCgiV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2U0ID0gcHJveHkuZWNob1N0cmluZ0FycmF5KHJlcXVlc3Q0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNCE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3Q0LCByZXNwb25zZTQpKTsgIC8vIFJlc3BvbnNlIDQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFJlcXVlc3QgMQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyAiSGVsbG8gV29ybGQiDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBIZWxsbyBXb3JsZCByZW1haW5zIG9uZSBpdGVtLg0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXF1ZXN0NSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIHJlcXVlc3Q1LmFkZCgiSGVsbG8gV29ybGQiKTsNCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzcG9uc2U1ID0gcHJveHkuZWNob1N0cmluZ0FycmF5KHJlcXVlc3Q1KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlNSE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyZUxpc3RzKHJlcXVlc3Q1LCByZXNwb25zZTUpKTsgLy8gUmVzcG9uc2UgNSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG9mIFN0cmluZyBBcnJheSAoc3RyaW5nIG1heE9jY3Vycz11bmJvdW5kZWQpIHdoaWNoIGlzIG1hcHBlZCB0byBTdHJpbmdbXQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9TdHJpbmdBcnJheUFsdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBSdW4gdGhlIHRlc3QgbXVsdGlwbGUgdGltZXMgdG8gdmVyaWZ5IGNvcnJlY3QgYmVoYXZpb3INCi0gICAgICAgIF90ZXN0RWNob1N0cmluZ0FycmF5QWx0KCk7DQotICAgICAgICBfdGVzdEVjaG9TdHJpbmdBcnJheUFsdCgpOw0KLSAgICAgICAgX3Rlc3RFY2hvU3RyaW5nQXJyYXlBbHQoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEVjaG9TdHJpbmdBcnJheUFsdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBHb3JpbGxhSW50ZXJmYWNlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgSGVsbG8gV29ybGQNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0MSA9IG5ldyBTdHJpbmdbXSB7IkhlbGxvIiwgIldvcmxkIn07DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UxID0gcHJveHkuZWNob1N0cmluZ0FycmF5QWx0KHJlcXVlc3QxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVBcnJheXMocmVxdWVzdDEsIHJlc3BvbnNlMSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSBsaXN0DQotICAgICAgICAgICAgU3RyaW5nW10gcmVxdWVzdDIgPSBuZXcgU3RyaW5nW10ge307DQotICAgICAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UyID0gcHJveHkuZWNob1N0cmluZ0FycmF5QWx0KHJlcXVlc3QyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlMiAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmVBcnJheXMocmVxdWVzdDIsIHJlc3BvbnNlMikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgd2l0aCBudWxsDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSByZXNwb25zZSB3aWxsIGJlIGFuIGVtcHR5IGFycmF5IGJlY2F1c2UNCi0gICAgICAgICAgICAvLyB0aGUgSkFYQiBiZWFuIHdpbGwgbmV2ZXIgcmVwcmVzZW50IExpc3Q8U3RyaW5nPiBhcyBhIG51bGwuICBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3QzID0gbnVsbDsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTMgPSBwcm94eS5lY2hvU3RyaW5nQXJyYXlBbHQocmVxdWVzdDMpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UzICE9IG51bGwgJiYgcmVzcG9uc2UzLmxlbmd0aCA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUZXN0IHNlbmRpbmcgSGVsbG8gbnVsbCBXb3JsZA0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgbnVsbCBpcyBwcmVzZXJ2ZWQgYW5kIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZQ0KLSAgICAgICAgICAgIC8vIGFyZSB0aGUgc2FtZS4ubm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHhzZDpsaXN0IHByb2Nlc3NpbmcgKHNlZSB0ZXN0U3RyaW5nTGlzdCBhYm92ZSkNCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3Q0ID0gbmV3IFN0cmluZ1tdIHsiSGVsbG8iLCBudWxsLCAiV29ybGQifTsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTQgPSBwcm94eS5lY2hvU3RyaW5nQXJyYXlBbHQocmVxdWVzdDQpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U0IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3Q0LCByZXNwb25zZTQpKTsgIC8vIFJlc3BvbnNlIDQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFJlcXVlc3QgMQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRlc3Qgc2VuZGluZyAiSGVsbG8gV29ybGQiDQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBIZWxsbyBXb3JsZCByZW1haW5zIG9uZSBpdGVtLg0KLSAgICAgICAgICAgIFN0cmluZ1tdIHJlcXVlc3Q1ID0gbmV3IFN0cmluZ1tdIHsiSGVsbG8gV29ybGQifTsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZTUgPSBwcm94eS5lY2hvU3RyaW5nQXJyYXlBbHQocmVxdWVzdDUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2U1IT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJlQXJyYXlzKHJlcXVlc3Q1LCByZXNwb25zZTUpKTsgLy8gUmVzcG9uc2UgNSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgUmVxdWVzdCAxDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvRGF0ZSgpIHRocm93cyBFeGNlcHRpb257DQotICAgIAl0cnl7DQotICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0RWNob0RhdGUiKTsNCi0JICAgIAlHb3JpbGxhSW50ZXJmYWNlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0JICAgIAlHcmVnb3JpYW5DYWxlbmRhciBjYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoQ2FsZW5kYXIuWUVBUiwgQ2FsZW5kYXIuTU9OVEgsIENhbGVuZGFyLkRBWV9PRl9NT05USCk7DQotCSAgICAJRGF0YXR5cGVGYWN0b3J5IGphdmF4dHlwZUZhY3RvcnkgPSBEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JICAgIAlYTUxHcmVnb3JpYW5DYWxlbmRhciByZXF1ZXN0PSAgamF2YXh0eXBlRmFjdG9yeS5uZXdYTUxHcmVnb3JpYW5DYWxlbmRhcihjYWwpOw0KLQkgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiSmF2YXggRmFjdG9yeSBDbGF6eiBOYW1lID0gIityZXF1ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0JICAgIAlEdXJhdGlvbiBkID0gamF2YXh0eXBlRmFjdG9yeS5uZXdEdXJhdGlvbihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7DQotCSAgICAJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmVzcG9uc2UgPSBwcm94eS5lY2hvRGF0ZShyZXF1ZXN0LCBkKTsNCi0JICAgIAlTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UudG9TdHJpbmcoKSk7DQotCSAgICAJYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgIAkJZmFpbCgiRXhjZXB0aW9uIGluIHRlc3RFY2hvRGF0ZSA6IitlKTsNCi0gICAgCX0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFBvbHltb3JwaGljRGF0ZSgpIHRocm93cyBFeGNlcHRpb257DQotICAgIAl0cnl7DQotCSAgICAJR29yaWxsYUludGVyZmFjZSBwcm94eSA9IGdldFByb3h5KCk7DQotCSAgICAJR3JlZ29yaWFuQ2FsZW5kYXIgY2FsID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKENhbGVuZGFyLllFQVIsIENhbGVuZGFyLk1PTlRILCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgpOw0KLQkgICAgCURhdGF0eXBlRmFjdG9yeSB0eXBlRmFjdG9yeSA9IERhdGF0eXBlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLQkgICAgCVhNTEdyZWdvcmlhbkNhbGVuZGFyIHJlcXVlc3QgPSAgdHlwZUZhY3RvcnkubmV3WE1MR3JlZ29yaWFuQ2FsZW5kYXIoY2FsKTsNCi0JICAgICAgICBwcm94eS5lY2hvUG9seW1vcnBoaWNEYXRlKHJlcXVlc3QpOw0KLQkgICAgCQ0KLSAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAJCWZhaWwoIkV4Y2VwdGlvbiBpbiB0ZXN0RWNob0RhdGUgOiIrZSk7DQotICAgIAl9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlTGlzdHMoTGlzdCBpbiwgTGlzdCBvdXQpIHsNCi0gICAgICAgIGlmIChpbi5zaXplKCkgIT0gb3V0LnNpemUoKSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTaXplIG1pc21hdGNoICIgKyBpbi5zaXplKCkgKyAiIT0iICsgb3V0LnNpemUoKSk7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGluLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgT2JqZWN0IGluSXRlbSA9IGluLmdldChpKTsNCi0gICAgICAgICAgICBPYmplY3Qgb3V0SXRlbSA9IG91dC5nZXQoaSk7DQotICAgICAgICAgICAgaWYgKGluSXRlbSAhPSBudWxsICYmICFpbkl0ZW0uZXF1YWxzKG91dEl0ZW0pIHx8DQotICAgICAgICAgICAgICAgIChpbkl0ZW0gPT0gbnVsbCAmJiBpbkl0ZW0gIT0gb3V0SXRlbSkpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkl0ZW0gIiArIGkgKyAiIG1pc21hdGNoICIgKyBpbkl0ZW0gKyAiIT0iICsgb3V0SXRlbSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlQXJyYXlzKFN0cmluZ1tdIGluLCBTdHJpbmdbXSBvdXQpIHsNCi0gICAgICAgIGlmIChpbi5sZW5ndGggIT0gb3V0Lmxlbmd0aCkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTaXplIG1pc21hdGNoICIgKyBpbi5sZW5ndGggKyAiIT0iICsgb3V0Lmxlbmd0aCk7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGluLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgT2JqZWN0IGluSXRlbSA9IGluW2ldOw0KLSAgICAgICAgICAgIE9iamVjdCBvdXRJdGVtID0gb3V0W2ldOw0KLSAgICAgICAgICAgIGlmIChpbkl0ZW0gIT0gbnVsbCAmJiAhaW5JdGVtLmVxdWFscyhvdXRJdGVtKSB8fA0KLSAgICAgICAgICAgICAgICAoaW5JdGVtID09IG51bGwgJiYgaW5JdGVtICE9IG91dEl0ZW0pKSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJJdGVtICIgKyBpICsgIiBtaXNtYXRjaCAiICsgaW5JdGVtICsgIiE9IiArIG91dEl0ZW0pOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9Qcm94eU5vbldyYXBwZWRUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1Byb3h5Tm9uV3JhcHBlZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZGI4NDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1Byb3h5Tm9uV3JhcHBlZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5kb2NsaXRub253cmFwcGVkLnNlaS5Eb2NMaXRub25XcmFwcGVkUHJveHk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5zZWkuUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLkludm9rZTsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5PYmplY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLlJldHVyblR5cGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgdGVzdCBjYXNlcyB3aWxsIHVzZSBwcm94eSBOT04gd3JhcHBlZCB3c2RsIHRvIGludm9rZSBtZXRob2RzDQotICogb24gYSBkZXBsb3llZCBTZXJ2ZXIgRW5kcG9pbnQuDQotICovDQotcHVibGljIGNsYXNzIFByb3h5Tm9uV3JhcHBlZFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsICJQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Qcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UuRG9jTGl0bm9uV3JhcHBlZEltcGxQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsICJQcm94eURvY0xpdFdyYXBwZWRQb3J0Iik7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRub25XcmFwcGVkLndzZGwiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoUHJveHlOb25XcmFwcGVkVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZSgpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5UZXN0aW5nIFN5bmMgSW5vdm9rZSBvbiBQcm94eSBEb2NMaXQgbm9uLXdyYXBwZWQiKTsNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBJbnZva2UgaW52b2tlT2JqID0gZmFjdG9yeS5jcmVhdGVJbnZva2UoKTsNCi0gICAgICAgIGludm9rZU9iai5zZXRJbnZva2VTdHIoInRlc3QgcmVxdWVzdCBmb3IgdHdvV2F5IE9wZXJhdGlvbiIpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsNCi0gICAgICAgIERvY0xpdG5vbldyYXBwZWRQcm94eSBwcm94eSA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0bm9uV3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgUmV0dXJuVHlwZSByZXNwb25zZSA9IHByb3h5Lmludm9rZShpbnZva2VPYmopOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5SZXNwb25zZSA9IiArIHJlc3BvbnNlLmdldFJldHVyblN0cigpKTsNCi0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5pbnZva2UoaW52b2tlT2JqKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+UmVzcG9uc2UgPSIgKyByZXNwb25zZS5nZXRSZXR1cm5TdHIoKSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEludm9rZSgpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5UZXN0aW5nIFN5bmMgSW52b2tlIG9uIFByb3h5IERvY0xpdCBiYXJlIHdpdGggYSBudWxsIHBhcmFtZXRlciIpOw0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEludm9rZSBpbnZva2VPYmogPSBudWxsOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsNCi0gICAgICAgIERvY0xpdG5vbldyYXBwZWRQcm94eSBwcm94eSA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0bm9uV3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgUmV0dXJuVHlwZSByZXNwb25zZSA9IHByb3h5Lmludm9rZShpbnZva2VPYmopOw0KLSAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2Fpbg0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5pbnZva2UoaW52b2tlT2JqKTsNCi0gICAgICAgIGFzc2VydE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFzeW5jQ2FsbGJhY2soKXsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRvY0xpdE5vbldyYXBwZWQgdGVzdCBjYXNlOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAvL0NyZWF0ZSB3c2RsIHVybA0KLSAgICAgICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsgDQotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICAgICAgLy9jcmVhdGUgaW5wdXQgb2JqZWN0IHRvIHdlYiBzZXJ2aWNlIG9wZXJhdGlvbg0KLSAgICAgICAgICAgIEludm9rZSBpbnZva2VPYmogPSBmYWN0b3J5LmNyZWF0ZUludm9rZSgpOw0KLSAgICAgICAgICAgIGludm9rZU9iai5zZXRJbnZva2VTdHIoInRlc3QgcmVxdWVzdCBmb3IgdHdvV2F5IEFzeW5jIE9wZXJhdGlvbiIpOw0KLSAgICAgICAgICAgIC8vQ3JlYXRlIFNlcnZpY2UNCi0gICAgICAgICAgICBQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2Ugc2VydmljZSA9IG5ldyBQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2Uod3NkbFVybCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIC8vQ3JlYXRlIHByb3h5DQotICAgICAgICAgICAgRG9jTGl0bm9uV3JhcHBlZFByb3h5IHByb3h5ID0gc2VydmljZS5nZXRQcm94eURvY0xpdG5vbldyYXBwZWRQb3J0KCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+SW52b2tpbmcgQmluZGluZyBQcm92aWRlciBwcm9wZXJ0eSIpOw0KLSAgICAgICAgICAgIC8vU2V0dXAgRW5kcG9pbnQgdXJsIC0tIG9wdGlvbmFsLg0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBQcm94eSBBc3luY2hyb25vdXMgQ2FsbGJhY2siKTsNCi0gICAgICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gaGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgLy9JbnZva2Ugb3BlcmF0aW9uIEFzeW5jaHJvbm91c2x5Lg0KLSAgICAgICAgICAgIEZ1dHVyZTw/PiBtb25pdG9yID0gcHJveHkuaW52b2tlQXN5bmMoaW52b2tlT2JqLCBoYW5kbGVyKTsNCi0gICAgICAgICAgICB3aGlsZSghbW9uaXRvci5pc0RvbmUoKSl7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFByb3h5IEFzeW5jaHJvbm91cyBDYWxsYmFjayIpOw0KLSAgICAgICAgICAgIGhhbmRsZXIgPSBuZXcgQXN5bmNDYWxsYmFjaygpOw0KLSAgICAgICAgICAgIC8vSW52b2tlIG9wZXJhdGlvbiBBc3luY2hyb25vdXNseS4NCi0gICAgICAgICAgICBtb25pdG9yID0gcHJveHkuaW52b2tlQXN5bmMoaW52b2tlT2JqLCBoYW5kbGVyKTsNCi0gICAgICAgICAgICB3aGlsZSghbW9uaXRvci5pc0RvbmUoKSl7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQXN5bmNQb2xsaW5nKCl7DQotICAgICAgICANCi0gICAgfQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvUHJveHlUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1Byb3h5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiYzJlMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvUHJveHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuRG9jTGl0V3JhcHBlZFByb3h5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2U7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1wdWJsaWMgY2xhc3MgUHJveHlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsICJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZS5Eb2NMaXRXcmFwcGVkUHJveHlJbXBsUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwNCi0gICAgICAgICAgICAiRG9jTGl0V3JhcHBlZFByb3h5SW1wbFBvcnQiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvTUVUQS1JTkYvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwiOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gcnVubmluZ09uQXhpcyA9IHRydWU7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShQcm94eVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZUNhbGxzKCl7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgaWYoIXJ1bm5pbmdPbkF4aXMpew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDoiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG5ldyBTdHJpbmcoInNvbWUgc3RyaW5nIHJlcXVlc3QiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU2VydmljZSBDYWxsICMxIik7DQotICAgICAgICAgICAgUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSBzZXJ2aWNlMSA9IG5ldyBQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0V3JhcHBlZFByb3h5IHByb3h5MSA9IHNlcnZpY2UxLmdldERvY0xpdFdyYXBwZWRQcm94eUltcGxQb3J0KCk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAxID0gICAgKEJpbmRpbmdQcm92aWRlcilwcm94eTE7DQotICAgICAgICAgICAgcDEuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UxID0gcHJveHkxLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUHJveHkgUmVzcG9uc2UgPSIgKyByZXNwb25zZTEpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU2VydmljZSBDYWxsICMyIik7DQotICAgICAgICAgICAgUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSBzZXJ2aWNlMiA9IG5ldyBQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0V3JhcHBlZFByb3h5IHByb3h5MiA9IHNlcnZpY2UyLmdldERvY0xpdFdyYXBwZWRQcm94eUltcGxQb3J0KCk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAyID0gICAgKEJpbmRpbmdQcm92aWRlcilwcm94eTI7DQotICAgICAgICAgICAgcDIuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UyID0gcHJveHkyLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUHJveHkgUmVzcG9uc2UgPSIgKyByZXNwb25zZTIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGdldE5hbWUoKSArICIgZmFpbGVkIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VXaXRoTnVsbFBhcmFtKCl7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIGlmKCFydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgTmFtZTogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOyANCi0gICAgICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5JbnZva2luZyBCaW5kaW5nIFByb3ZpZGVyIHByb3BlcnR5Iik7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBEb2NMaXRXcmFwcGVkUHJveHkgZHdwID0gKERvY0xpdFdyYXBwZWRQcm94eSlwcm94eTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgUHJveHkgU3luY2hyb25vdXNseSIpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkd3AuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJQcm94eSBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYWdhaW4NCi0gICAgICAgICAgICByZXNwb25zZSA9IGR3cC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlByb3h5IFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlKCl7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIGlmKCFydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbmV3IFN0cmluZygic29tZSBzdHJpbmcgcmVxdWVzdCIpOyANCi0gICAgICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5JbnZva2luZyBCaW5kaW5nIFByb3ZpZGVyIHByb3BlcnR5Iik7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBkd3AgPSAoRG9jTGl0V3JhcHBlZFByb3h5KXByb3h5Ow0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBQcm94eSBTeW5jaHJvbm91c2x5Iik7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZHdwLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUHJveHkgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkd3AuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJQcm94eSBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZVdpdGhXU0RMKCl7DQotDQotICAgIAl0cnl7IA0KLSAgICAgICAgICAgIGlmKCFydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbmV3IFN0cmluZygic29tZSBzdHJpbmcgcmVxdWVzdCIpOyANCi0gICAgICAgICAgICBPYmplY3QgcHJveHkgPXNlcnZpY2UuZ2V0UG9ydChwb3J0TmFtZSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj5JbnZva2luZyBCaW5kaW5nIFByb3ZpZGVyIHByb3BlcnR5Iik7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgRG9jTGl0V3JhcHBlZFByb3h5IGR3cCA9IChEb2NMaXRXcmFwcGVkUHJveHkpcHJveHk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFByb3h5IFN5bmNocm9ub3VzbHkiKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkd3AuaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJQcm94eSBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYWdhaW4NCi0gICAgICAgICAgICByZXNwb25zZSA9IGR3cC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlByb3h5IFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZUFzeW5jQ2FsbGJhY2soKXsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgaWYoIXJ1bm5pbmdPbkF4aXMpew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBuZXcgU3RyaW5nKCJzb21lIHN0cmluZyByZXF1ZXN0Iik7IA0KLSAgICAgICAgICAgIE9iamVjdCBwcm94eSA9c2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBEb2NMaXRXcmFwcGVkUHJveHkuY2xhc3MpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+Pkludm9raW5nIEJpbmRpbmcgUHJvdmlkZXIgcHJvcGVydHkiKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgRG9jTGl0V3JhcHBlZFByb3h5IGR3cCA9IChEb2NMaXRXcmFwcGVkUHJveHkpcHJveHk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIFByb3h5IEFzeW5jaHJvbm91cyBDYWxsYmFjayIpOw0KLSAgICAgICAgICAgIEFzeW5jSGFuZGxlciBoYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICBGdXR1cmU8Pz4gcmVzcG9uc2UgPSBkd3AuaW52b2tlQXN5bmMocmVxdWVzdCwgaGFuZGxlcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkd3AuaW52b2tlQXN5bmMocmVxdWVzdCwgaGFuZGxlcik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlQXN5bmNQb2xsaW5nKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IHdzZGwudG9VUkwoKTsgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBwcm94eSA9c2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBEb2NMaXRXcmFwcGVkUHJveHkuY2xhc3MpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbmV3IFN0cmluZygic29tZSBzdHJpbmcgcmVxdWVzdCIpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBCaW5kaW5nIFByb3ZpZGVyIHByb3BlcnR5Iik7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBQcm94eSB3aXRoIGFzeW5jIHBvbGxpbmcgcmVxdWVzdCIpOw0KLSAgICAgICAgICAgIFJlc3BvbnNlPFJldHVyblR5cGU+IGFzeW5jUmVzcG9uc2UgPSBwcm94eS5pbnZva2VBc3luYyhyZXF1ZXN0KTsNCi0NCi0gICAgICAgICAgICB3aGlsZSAoIWFzeW5jUmVzcG9uc2UuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEFzeW5jIGludm9jYXRpb24gc3RpbGwgbm90IGNvbXBsZXRlIik7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgUmV0dXJuVHlwZSByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgYXN5bmNSZXNwb25zZSA9IHByb3h5Lmludm9rZUFzeW5jKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlICghYXN5bmNSZXNwb25zZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsNCi0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXNwb25zZSA9IGFzeW5jUmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXkoKXsNCi0gICAgICAgIA0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBpZihydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBuZXcgU3RyaW5nKCJzb21lIHN0cmluZyByZXF1ZXN0Iik7IA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE9iamVjdCBwcm94eSA9c2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBEb2NMaXRXcmFwcGVkUHJveHkuY2xhc3MpOyANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgRG9jTGl0V3JhcHBlZFByb3h5IGR3cCA9IChEb2NMaXRXcmFwcGVkUHJveHkpcHJveHk7ICANCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkd3AudHdvV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkd3AudHdvV2F5KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXkoKXsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyKCl7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFR3b1dheUFzeW5jQ2FsbGJhY2soKXsNCi0gICAgICAgIA0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBpZihydW5uaW5nT25BeGlzKXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBuZXcgU3RyaW5nKCJzb21lIHN0cmluZyByZXF1ZXN0Iik7IA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE9iamVjdCBwcm94eSA9c2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBEb2NMaXRXcmFwcGVkUHJveHkuY2xhc3MpOyANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIERvY0xpdFdyYXBwZWRQcm94eSBkd3AgPSAoRG9jTGl0V3JhcHBlZFByb3h5KXByb3h5Ow0KLSAgICAgICAgICAgIEFzeW5jSGFuZGxlciBoYW5kbGVyID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICBGdXR1cmU8Pz4gcmVzcG9uc2UgPSBkd3AudHdvV2F5QXN5bmMocmVxdWVzdCwgaGFuZGxlcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluDQotICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSBkd3AudHdvV2F5QXN5bmMocmVxdWVzdCwgaGFuZGxlcik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9vbGluZygpew0KLSAgICAgICAgDQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1JQQ0xpdFNXQVByb3h5VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9SUENMaXRTV0FQcm94eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjg2NGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1JQQ0xpdFNXQVByb3h5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXRzd2Euc2VpLlJQQ0xpdFNXQTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkZpbGVJbWFnZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLXB1YmxpYyBjbGFzcyBSUENMaXRTV0FQcm94eVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBuZXcgUU5hbWUoDQotICAgICAgICAgICAgImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIsICJSUENMaXRTV0FTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0U1dBU2VydmljZS5SUENMaXRTV0EiOw0KLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLA0KLSAgICAgICAgICAgICJSUENMaXRTV0EiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisNCi0gICAgInRlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvTUVUQS1JTkYvUlBDTGl0U1dBLndzZGwiOw0KLSAgICAgICAgDQotICAgIHN0YXRpYyB7DQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9DQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3INCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpbWFnZSI7DQotDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgICAgICBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwgInRlc3QuanBnIiwgaW1hZ2UpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgICAgDQotICAgICAgICB9DQotICAgIH0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGF0YVNvdXJjZSBpbWFnZURTOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFJQQ0xpdFNXQVByb3h5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcHJveHkNCi0gICAgICogQHJldHVybiBSUENMaXQgcHJveHkNCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBSUENMaXRTV0EgZ2V0UHJveHkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0gICAgICAgIEZpbGUgd3NkbD0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIGFzc2VydFRydWUoIldTREwgZG9lcyBub3QgZXhpc3Q6IiArIHdzZGxMb2NhdGlvbix3c2RsLmV4aXN0cygpKTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIE9iamVjdCBwcm94eSA9c2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBSUENMaXRTV0EuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5OyANCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIChSUENMaXRTV0EpcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IE1ldGhvZCB0byBnZXQgYSBEaXNwYXRjaDxTdHJpbmc+DQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROT09QKCkgew0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgdGVzdCB0aGF0IGVuc3VyZXMgdGhhdCB3ZSBjYW4gZWNobyBhIHN0cmluZyB0byBhbiBycGMvbGl0IHdlYiBzZXJ2aWNlDQotICAgICAqIE5PVEU6DQotICAgICAqIFRvIGVuYWJsZSB0aGlzIHRlc3QsIHJlbW92ZSB0aGUgXy4NCi0gICAgICogT25jZSB5b3UgZG8gdGhpcywgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBjb2RlIHRvIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbC4NCi0gICAgICogYnVpbGRBdHRhY2htZW50SW5mb3JtYXRpb24oKQ0KLSAgICAgKiAvLyBUT0RPOiBTdGFydCBIQUNLIGZvciBSUENMaXRTV0FQcm94eVRlc3QNCi0gICAgICAgIGFkZFBhcnRBdHRhY2htZW50RGVzY3JpcHRpb24oImR1bW15QXR0YWNobWVudElOIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwoQXR0YWNobWVudFR5cGUuU1dBLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsidGV4dC9wbGFpbiJ9KSk7DQotICAgICAgICBhZGRQYXJ0QXR0YWNobWVudERlc2NyaXB0aW9uKCJkdW1teUF0dGFjaG1lbnRJTk9VVCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsKEF0dGFjaG1lbnRUeXBlLlNXQSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImltYWdlL2pwZWcifSkpOw0KLSAgICAgICAgYWRkUGFydEF0dGFjaG1lbnREZXNjcmlwdGlvbigiZHVtbXlBdHRhY2htZW50T1VUIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwoQXR0YWNobWVudFR5cGUuU1dBLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsidGV4dC9wbGFpbiJ9KSk7DQotICAgICAgICAvLyBUT0RPOiBFbmQgSEFDSyBmb3IgUlBDTGlzdFNXQVByb3h5VGVzdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFJQQ0xpdFNXQUVjaG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgICAgIFJQQ0xpdFNXQSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiVGhpcyBpcyBhIG5vdCBhdHRhY2htZW50IGRhdGEiOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyBhdHRhY2htZW50SU4gPSAiRGF0YSBmb3IgcGxhaW4gdGV4dCBhdHRhY2htZW50IjsNCi0gICAgICAgICAgICBEYXRhSGFuZGxlciBhdHRhY2htZW50SU5PVVQgPSBnZXRJbWFnZURIKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgSG9sZGVyPERhdGFIYW5kbGVyPiBhdHRhY2htZW50SU5PVVRfSG9sZGVyID0gbmV3IEhvbGRlcjxEYXRhSGFuZGxlcj4oKTsNCi0gICAgICAgICAgICBhdHRhY2htZW50SU5PVVRfSG9sZGVyLnZhbHVlID0gYXR0YWNobWVudElOT1VUOw0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHJlc3BvbnNlX0hvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IGF0dGFjaG1lbnRPVVRfSG9sZGVyID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBwcm94eS5lY2hvKHJlcXVlc3QsIGF0dGFjaG1lbnRJTiwgYXR0YWNobWVudElOT1VUX0hvbGRlciwgcmVzcG9uc2VfSG9sZGVyLCANCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRPVVRfSG9sZGVyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJCYWQgUmVzcG9uc2UgSG9sZGVyIiwgcmVzcG9uc2VfSG9sZGVyICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIHZhbHVlIGlzIG51bGwiLCByZXNwb25zZV9Ib2xkZXIudmFsdWUgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2UgaXMgbm90IHRoZSBzYW1lIGFzIHJlcXVlc3QuIFJlY2VpdmU9IityZXNwb25zZV9Ib2xkZXIudmFsdWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5lcXVhbHMocmVzcG9uc2VfSG9sZGVyLnZhbHVlKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG91dHB1dCBhdHRhY2htZW50IGhvbGRlciBpcyBudWxsIiwgYXR0YWNobWVudE9VVF9Ib2xkZXIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG91dHB1dCBhdHRhY2htZW50IGlzIG51bGwiLCBhdHRhY2htZW50T1VUX0hvbGRlci52YWx1ZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgb3V0cHV0IGF0dGFjaG1lbnQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBpbnB1dC4gIFJlY2VpdmVkPSIgKyANCi0gICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRPVVRfSG9sZGVyLnZhbHVlLCANCi0gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRJTi5lcXVhbHMoYXR0YWNobWVudE9VVF9Ib2xkZXIudmFsdWUpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBpbm91dCBhdHRhY2htZW50IGhvbGRlciBpcyBudWxsIiwgYXR0YWNobWVudElOT1VUX0hvbGRlciAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgaW5vdXQgYXR0YWNobWVudCBpcyBudWxsIiwgYXR0YWNobWVudElOT1VUX0hvbGRlci52YWx1ZSAhPSBudWxsKTsNCi0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBvYmplY3QNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIudmFsdWUgIT0gYXR0YWNobWVudElOT1VUKTsgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAgICAgLy8gVHJ5IGFnYWluIHdpdGggdGhlIHNhbWUgcHJveHkNCi0gICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgICAgICByZXF1ZXN0ID0gIlRoaXMgaXMgYSBub3QgYXR0YWNobWVudCBkYXRhIjsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhdHRhY2htZW50SU4gPSAiRGF0YSBmb3IgcGxhaW4gdGV4dCBhdHRhY2htZW50IjsNCi0gICAgICAgICAgICBhdHRhY2htZW50SU5PVVQgPSBnZXRJbWFnZURIKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXR0YWNobWVudElOT1VUX0hvbGRlciA9IG5ldyBIb2xkZXI8RGF0YUhhbmRsZXI+KCk7DQotICAgICAgICAgICAgYXR0YWNobWVudElOT1VUX0hvbGRlci52YWx1ZSA9IGF0dGFjaG1lbnRJTk9VVDsNCi0gICAgICAgICAgICByZXNwb25zZV9Ib2xkZXIgPSBuZXcgSG9sZGVyPFN0cmluZz4oKTsNCi0gICAgICAgICAgICBhdHRhY2htZW50T1VUX0hvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPigpOw0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgcHJveHkuZWNobyhyZXF1ZXN0LCBhdHRhY2htZW50SU4sIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIsIHJlc3BvbnNlX0hvbGRlciwgDQotICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50T1VUX0hvbGRlcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmFkIFJlc3BvbnNlIEhvbGRlciIsIHJlc3BvbnNlX0hvbGRlciAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSB2YWx1ZSBpcyBudWxsIiwgcmVzcG9uc2VfSG9sZGVyLnZhbHVlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIGlzIG5vdCB0aGUgc2FtZSBhcyByZXF1ZXN0LiBSZWNlaXZlPSIrcmVzcG9uc2VfSG9sZGVyLnZhbHVlLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlX0hvbGRlci52YWx1ZSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBvdXRwdXQgYXR0YWNobWVudCBob2xkZXIgaXMgbnVsbCIsIGF0dGFjaG1lbnRPVVRfSG9sZGVyICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBvdXRwdXQgYXR0YWNobWVudCBpcyBudWxsIiwgYXR0YWNobWVudE9VVF9Ib2xkZXIudmFsdWUgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIG91dHB1dCBhdHRhY2htZW50IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBSZWNlaXZlZD0iICsgDQotICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50T1VUX0hvbGRlci52YWx1ZSwgDQotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50SU4uZXF1YWxzKGF0dGFjaG1lbnRPVVRfSG9sZGVyLnZhbHVlKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgaW5vdXQgYXR0YWNobWVudCBob2xkZXIgaXMgbnVsbCIsIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGlub3V0IGF0dGFjaG1lbnQgaXMgbnVsbCIsIGF0dGFjaG1lbnRJTk9VVF9Ib2xkZXIudmFsdWUgIT0gbnVsbCk7DQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgb2JqZWN0DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdHRhY2htZW50SU5PVVRfSG9sZGVyLnZhbHVlICE9IGF0dGFjaG1lbnRJTk9VVCk7ICANCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIGdldEltYWdlREgoKSB7DQotICAgICAgICByZXR1cm4gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvUlBDUHJveHlUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L1JQQ1Byb3h5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyNjA4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvUlBDUHJveHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LlJQQ0xpdEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaS5SUENGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQuc2VpLlJQQ0xpdDsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkucnBjbGl0LkNvbXBsZXhBbGw7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LnJwY2xpdC5FbnVtOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1wdWJsaWMgY2xhc3MgUlBDUHJveHlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQiLCAiUlBDTGl0U2VydmljZSIpOw0KLSAgICBwcml2YXRlIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFNlcnZpY2UuUlBDTGl0SW1wbFBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQiLA0KLSAgICAgICAgICAgICJSUENMaXQiKTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9SUENMaXQud3NkbCI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoUlBDUHJveHlUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBwcm94eQ0KLSAgICAgKiBAcmV0dXJuIFJQQ0xpdCBwcm94eQ0KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFJQQ0xpdCBnZXRQcm94eSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSB3c2RsPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOyANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gd3NkbC50b1VSTCgpOyANCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIE9iamVjdCBwcm94eSA9c2VydmljZS5nZXRQb3J0KHBvcnROYW1lLCBSUENMaXQuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5OyANCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIChSUENMaXQpcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IE1ldGhvZCB0byBnZXQgYSBEaXNwYXRjaDxTdHJpbmc+DQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotICAgICAgICBGaWxlIHdzZGw9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7IA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSB3c2RsLnRvVVJMKCk7IA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIlRoaXMgaXMgYSB0ZXN0Li4uIjsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgdGVzdCB0aGF0IGVuc3VyZXMgdGhhdCB3ZSBjYW4gZWNobyBhIHN0cmluZyB0byBhbiBycGMvbGl0IHdlYiBzZXJ2aWNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlSW5PdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCA9ICJUaGlzIGlzIGEgdGVzdC4uLiI7DQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gcmVxdWVzdFBhcmFtID0gbmV3IEhvbGRlcjxTdHJpbmc+KCk7DQotICAgICAgICAgICAgcmVxdWVzdFBhcmFtLnZhbHVlID0gcmVxdWVzdDsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGVJbk91dChyZXF1ZXN0UGFyYW0pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVxdWVzdFBhcmFtLnZhbHVlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGVJbk91dChyZXF1ZXN0UGFyYW0pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVxdWVzdFBhcmFtLnZhbHVlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgdGVzdCB0aGF0IGVuc3VyZXMgdGhhdCB3ZSBjYW4gZWNobyBhIHN0cmluZyB0byBhbiBycGMvbGl0IHdlYiBzZXJ2aWNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlMigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5eyANCi0gICAgICAgICAgICBSUENMaXQgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0MSA9ICJoZWxsbyI7DQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QyID0gIndvcmxkIjsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUyKHJlcXVlc3QxLCByZXF1ZXN0Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscygiaGVsbG93b3JsZCIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkudGVzdFNpbXBsZTIocmVxdWVzdDEsIHJlcXVlc3QyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKCJoZWxsb3dvcmxkIikpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZS4NCi0gICAgICogVGhpcyB0ZXN0IHBhc3NlcyB0aGUgaW5mb3JtYXRpb24gaW4gaGVhZGVycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0MSA9ICJoZWxsbyI7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdDIgPSAid29ybGQiOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50ZXN0SGVhZGVyKHJlcXVlc3QxLCByZXF1ZXN0Mik7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMoImhlbGxvd29ybGQiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICByZXNwb25zZSA9IHByb3h5LnRlc3RIZWFkZXIocmVxdWVzdDEsIHJlcXVlc3QyKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscygiaGVsbG93b3JsZCIpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgYSBzZXJ2aWNlIGZhdWx0IGlzIHRocm93biBjb3JyZWN0bHkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgcHJveHkudGVzdEZhdWx0KCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgUlBDRmF1bHQiKTsNCi0gICAgICAgIH0gY2F0Y2goUlBDRmF1bHQgcnBjRmF1bHQpeyANCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJwY0ZhdWx0LmdldE1lc3NhZ2UoKS5lcXVhbHMoIlRocm93IFJQQ0ZhdWx0IikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocnBjRmF1bHQuZ2V0RmF1bHRJbmZvKCkgPT0gMTIzKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIHByb3h5LnRlc3RGYXVsdCgpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFJQQ0ZhdWx0Iik7DQotICAgICAgICB9IGNhdGNoKFJQQ0ZhdWx0IHJwY0ZhdWx0KXsgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShycGNGYXVsdC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJUaHJvdyBSUENGYXVsdCIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJwY0ZhdWx0LmdldEZhdWx0SW5mbygpID09IDEyMyk7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdGhhdCBlbnN1cmVzIHRoYXQgd2UgY2FuIGVjaG8gYSBzdHJpbmcgdG8gYW4gcnBjL2xpdCB3ZWIgc2VydmljZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZvck51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICB0cnl7ICAgDQotICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBudWxsOw0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdFNpbXBsZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJSUEMvTElUIHNob3VsZCB0aHJvdyB3ZWJzZXJ2aWNlRXhjZXB0aW9uIHdoZW4gb3BlcmF0aW9uIGlzIGludm9rZWQgd2l0aCBudWxsIGlucHV0IHBhcmFtZXRlciIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgdHJ5eyAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gbnVsbDsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiUlBDL0xJVCBzaG91bGQgdGhyb3cgd2Vic2VydmljZUV4Y2VwdGlvbiB3aGVuIG9wZXJhdGlvbiBpcyBpbnZva2VkIHdpdGggbnVsbCBpbnB1dCBwYXJhbWV0ZXIiKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXBsZSB0ZXN0IHRoYXQgZW5zdXJlcyB0aGF0IHdlIGNhbiBlY2hvIGEgc3RyaW5nIHRvIGFuIHJwYy9saXQgd2ViIHNlcnZpY2UNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JOdWxsUmV0dXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnRlc3RTaW1wbGUoInJldHVybk51bGwiKTsNCi0gICAgICAgICAgICBmYWlsKCJSUEMvTElUIHNob3VsZCB0aHJvdyB3ZWJzZXJ2aWNlRXhjZXB0aW9uIHdoZW4gb3BlcmF0aW9uIGlzIGludm9rZWQgd2l0aCBudWxsIG91dCBwYXJhbWV0ZXIiKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdFNpbXBsZSgicmV0dXJuTnVsbCIpOw0KLSAgICAgICAgICAgIGZhaWwoIlJQQy9MSVQgc2hvdWxkIHRocm93IHdlYnNlcnZpY2VFeGNlcHRpb24gd2hlbiBvcGVyYXRpb24gaXMgaW52b2tlZCB3aXRoIG51bGwgb3V0IHBhcmFtZXRlciIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoZS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVfRGlzcGF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFNlbmQgYSBwYXlsb2FkIHRoYXQgc2ltdWxhdGVzDQotICAgICAgICAvLyB0aGUgcnBjIG1lc3NhZ2UNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0bnM6dGVzdFNpbXBsZSB4bWxuczp0bnM9J2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCc+IiArDQotICAgICAgICAiPHNpbXBsZUluIHhzaTp0eXBlPSd4c2Q6c3RyaW5nJyB4bWxuczp4c2Q9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJz4iICsNCi0gICAgICAgICJQQVlMT0FEIFdJVEggWFNJOlRZUEUiICsNCi0gICAgICAgICI8L3NpbXBsZUluPjwvdG5zOnRlc3RTaW1wbGU+IjsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic2ltcGxlT3V0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIjpzaW1wbGVPdXQiKSk7ICAvLyBNYWtlIHN1cmUgc2ltcGxlIG91dCBpcyBub3QgbmFtZXNwYWNlIHF1YWxpZmllZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiOnRlc3RTaW1wbGVSZXNwb25zZSIpKTsgIC8vIE1ha2Ugc3VyZSByZXNwb25zZSBpcyBuYW1lc3BhY2UgcXVhbGlmaWVkICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIlBBWUxPQUQgV0lUSCBYU0k6VFlQRSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic2ltcGxlT3V0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIjpzaW1wbGVPdXQiKSk7ICAvLyBNYWtlIHN1cmUgc2ltcGxlIG91dCBpcyBub3QgbmFtZXNwYWNlIHF1YWxpZmllZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiOnRlc3RTaW1wbGVSZXNwb25zZSIpKTsgIC8vIE1ha2Ugc3VyZSByZXNwb25zZSBpcyBuYW1lc3BhY2UgcXVhbGlmaWVkICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIlBBWUxPQUQgV0lUSCBYU0k6VFlQRSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZTJfRGlzcGF0Y2hXaXRob3V0WFNJVHlwZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gU2VuZCBhIHBheWxvYWQgdGhhdCBzaW11bGF0ZXMNCi0gICAgICAgIC8vIHRoZSBycGMgbWVzc2FnZQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPHRuczp0ZXN0U2ltcGxlMiB4bWxuczp0bnM9J2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCc+IiArDQotICAgICAgICAiPHNpbXBsZTJJbjE+IiArDQotICAgICAgICAiSEVMTE8iICsNCi0gICAgICAgICI8L3NpbXBsZTJJbjE+IiArDQotICAgICAgICAiPHNpbXBsZTJJbjI+IiArDQotICAgICAgICAiV09STEQiICsNCi0gICAgICAgICI8L3NpbXBsZTJJbjI+PC90bnM6dGVzdFNpbXBsZTI+IjsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRmF1bHQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzaW1wbGUyT3V0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIjpzaW1wbGUyT3V0IikpOy8vIE1ha2Ugc3VyZSBzaW1wbGVPdXQgaXMgbm90IG5hbWVzcGFjZSBxdWFsaWZpZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjp0ZXN0U2ltcGxlMlJlc3BvbnNlIikpOyANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkhFTExPV09STEQiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRmF1bHQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJzaW1wbGUyT3V0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIjpzaW1wbGUyT3V0IikpOy8vIE1ha2Ugc3VyZSBzaW1wbGVPdXQgaXMgbm90IG5hbWVzcGFjZSBxdWFsaWZpZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjp0ZXN0U2ltcGxlMlJlc3BvbnNlIikpOyANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkhFTExPV09STEQiKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVfRGlzcGF0Y2hXaXRob3V0WFNJVHlwZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gU2VuZCBhIHBheWxvYWQgdGhhdCBzaW11bGF0ZXMNCi0gICAgICAgIC8vIHRoZSBycGMgbWVzc2FnZQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPHRuczp0ZXN0U2ltcGxlIHhtbG5zOnRucz0naHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0Jz4iICsNCi0gICAgICAgICI8c2ltcGxlSW4+IiArDQotICAgICAgICAiUEFZTE9BRCBXSVRIT1VUIFhTSTpUWVBFIiArDQotICAgICAgICAiPC9zaW1wbGVJbj48L3Ruczp0ZXN0U2ltcGxlPiI7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygic2ltcGxlT3V0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIjpzaW1wbGVPdXQiKSk7ICAvLyBNYWtlIHN1cmUgc2ltcGxlT3V0IGlzIG5vdCBuYW1lc3BhY2UgcXVhbGlmaWVkDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCI6dGVzdFNpbXBsZVJlc3BvbnNlIikpOyANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIlBBWUxPQUQgV0lUSE9VVCBYU0k6VFlQRSIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoImRpc3BhdGNoIGludm9rZSByZXR1cm5lZCBudWxsIiwgcmVzcG9uc2UpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgY29ycmVjdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJGYXVsdCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoInNpbXBsZU91dCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCI6c2ltcGxlT3V0IikpOyAgLy8gTWFrZSBzdXJlIHNpbXBsZU91dCBpcyBub3QgbmFtZXNwYWNlIHF1YWxpZmllZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiOnRlc3RTaW1wbGVSZXNwb25zZSIpKTsgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJQQVlMT0FEIFdJVEhPVVQgWFNJOlRZUEUiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgdGVzdCB0aGF0IGVuc3VyZXMgdGhhdCB3ZSBjYW4gZWNobyBhIHN0cmluZyB0byBhbiBycGMvbGl0IHdlYiBzZXJ2aWNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBTdHJpbmdbXSByZXF1ZXN0ID0gbmV3IFN0cmluZ1tdIHsiSGVsbG8iICwgIldvcmxkIn07DQotICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmdbXSByZXNwb25zZSA9IHByb3h5LnRlc3RTdHJpbmdMaXN0MihyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UubGVuZ3RoPT0yKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlWzBdLmVxdWFscygiSGVsbG8iKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVsxXS5lcXVhbHMoIldvcmxkIikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS50ZXN0U3RyaW5nTGlzdDIocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmxlbmd0aD09Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVswXS5lcXVhbHMoIkhlbGxvIikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VbMV0uZXF1YWxzKCJXb3JsZCIpKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7IA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IA0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiByZWNlaXZlZCIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RfRGlzcGF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFNlbmQgYSBwYXlsb2FkIHRoYXQgc2ltdWxhdGVzDQotICAgICAgICAvLyB0aGUgcnBjIG1lc3NhZ2UNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjx0bnM6dGVzdFN0cmluZ0xpc3QyIHhtbG5zOnRucz0naHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0Jz4iICsNCi0gICAgICAgIC8vIjx0bnM6YXJnXzJfMCB4bWxuczp0bnM9J2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCcgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeHNpOnR5cGU9J3RuczpTdHJpbmdMaXN0JyA+IiArDQotICAgICAgICAiPHRuczphcmdfMl8wPiIgKw0KLSAgICAgICAgIkhlbGxvIFdvcmxkIiArDQotICAgICAgICAiPC90bnM6YXJnXzJfMD48L3Ruczp0ZXN0U3RyaW5nTGlzdDI+IjsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGlzcGF0Y2ggaW52b2tlIHJldHVybmVkIG51bGwiLCByZXNwb25zZSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBjb3JyZWN0DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkZhdWx0IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygidGVzdFN0cmluZ0xpc3QyUmV0dXJuIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygidGVzdFN0cmluZ0xpc3QyUmVzcG9uc2UiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJIZWxsbyBXb3JsZCIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJkaXNwYXRjaCBpbnZva2UgcmV0dXJuZWQgbnVsbCIsIHJlc3BvbnNlKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGNvcnJlY3QNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygiRmF1bHQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJ0ZXN0U3RyaW5nTGlzdDJSZXR1cm4iKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJ0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkhlbGxvIFdvcmxkIikpOw0KLSAgICB9DQotICAgIC8qKg0KLSAgICAgKiBDdXJyZW50bHkgbm90IGVuYWJsZWQgZHVlIHRvIHByb2JsZW1zIHdpdGggDQotICAgICAqIG1hcnNoYWxpbmcgYW4geHNkOmxpc3Qgb2YgUU5hbWUuDQotICAgICAqIA0KLSAgICAgKiBVc2VycyBzaG91bGQgdXNlIGRvY3VtZW50L2xpdGVyYWwgcHJvY2Vzc2luZyBpZiB0aGV5IA0KLSAgICAgKiBuZWVkIHN1Y2ggY29tcGxpY2F0ZWQgc2NlbmFyaW9zLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RMaXN0cygpIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBRTmFtZVtdIHJlcXVlc3QgPSBuZXcgUU5hbWVbXSB7UlBDTGl0SW1wbC5xbmFtZTEsIFJQQ0xpdEltcGwucW5hbWUyfTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFFOYW1lW10gcU5hbWVzID0gcHJveHkudGVzdExpc3RzKHJlcXVlc3QsDQotICAgICAgICAgICAgICAgICAgICBuZXcgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbMF0sDQotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXJbMF0sDQotICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZ1swXSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBFbnVtWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21wbGV4QWxsKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUocU5hbWVzLmxlbmd0aD09Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXNbMF0uZXF1YWxzKFJQQ0xpdEltcGwucW5hbWUxKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXNbMV0uZXF1YWxzKFJQQ0xpdEltcGwucW5hbWUyKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy9UcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIHFOYW1lcyA9IHByb3h5LnRlc3RMaXN0cyhyZXF1ZXN0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbMF0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZ1swXSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVudW1bMF0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wbGV4QWxsKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXMubGVuZ3RoPT0yKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocU5hbWVzWzBdLmVxdWFscyhSUENMaXRJbXBsLnFuYW1lMSkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXNbMV0uZXF1YWxzKFJQQ0xpdEltcGwucW5hbWUyKSk7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDdXJyZW50bHkgbm90IGVuYWJsZWQgZHVlIHRvIHByb2JsZW1zIG1hcnNoYWxsaW5nL3VubWFyc2hhbGxpbmcNCi0gICAgICogYW4geHNkOmxpc3Qgb2YgWE1MR3JlZ29yaWFuQ2FsZW5kYXIuDQotICAgICAqIA0KLSAgICAgKiBVc2VycyBzaG91bGQgdXNlIGRvY3VtZW50L2xpdGVyYWwgcHJvY2Vzc2luZyBpZiB0aGV5IA0KLSAgICAgKiBuZWVkIHN1Y2ggY29tcGxpY2F0ZWQgc2NlbmFyaW9zLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RDYWxlbmRhcnMoKSB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbXSByZXF1ZXN0ID0gbmV3IFhNTEdyZWdvcmlhbkNhbGVuZGFyW10ge1JQQ0xpdEltcGwuYmRheSwgUlBDTGl0SW1wbC5ob2xpZGF5fTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIFhNTEdyZWdvcmlhbkNhbGVuZGFyW10gY2FscyAgPSBwcm94eS50ZXN0Q2FsZW5kYXJMaXN0MShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNhbHMubGVuZ3RoID09IDIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY2Fsc1swXS5jb21wYXJlKFJQQ0xpdEltcGwuYmRheSkgPT0gMCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYWxzWzFdLmNvbXBhcmUoUlBDTGl0SW1wbC5ob2xpZGF5KSA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIGNhbHMgID0gcHJveHkudGVzdENhbGVuZGFyTGlzdDEocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYWxzLmxlbmd0aCA9PSAyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGNhbHNbMF0uY29tcGFyZShSUENMaXRJbXBsLmJkYXkpID09IDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoY2Fsc1sxXS5jb21wYXJlKFJQQ0xpdEltcGwuaG9saWRheSkgPT0gMCk7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpeyANCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyANCi0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gcmVjZWl2ZWQiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdJbnRlZ2VycygpIHsNCi0gICAgICAgIHRyeXsgDQotICAgICAgICAgICAgUlBDTGl0IHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICBCaWdJbnRlZ2VyW10gcmVxdWVzdCA9IG5ldyBCaWdJbnRlZ2VyW10ge1JQQ0xpdEltcGwuYmlnSW50MSwgUlBDTGl0SW1wbC5iaWdJbnQyfTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIEJpZ0ludGVnZXJbXSBpbnRzICA9IHByb3h5LnRlc3RCaWdJbnRlZ2VyTGlzdDMocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnRzLmxlbmd0aD09Mik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnRzWzBdLmNvbXBhcmVUbyhSUENMaXRJbXBsLmJpZ0ludDEpID09IDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoaW50c1sxXS5jb21wYXJlVG8oUlBDTGl0SW1wbC5iaWdJbnQyKSA9PSAwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIGludHMgID0gcHJveHkudGVzdEJpZ0ludGVnZXJMaXN0MyhyZXF1ZXN0KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGludHMubGVuZ3RoPT0yKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGludHNbMF0uY29tcGFyZVRvKFJQQ0xpdEltcGwuYmlnSW50MSkgPT0gMCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnRzWzFdLmNvbXBhcmVUbyhSUENMaXRJbXBsLmJpZ0ludDIpID09IDApOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ3MoKSB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgTG9uZ1tdIHJlcXVlc3QgPSBuZXcgTG9uZ1tdIHtuZXcgTG9uZygwKSwgbmV3IExvbmcoMSksIG5ldyBMb25nKDIpfTsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIExvbmdbXSBsb25ncyAgPSBwcm94eS50ZXN0TG9uZ0xpc3Q0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUobG9uZ3MubGVuZ3RoPT0zKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGxvbmdzWzBdID09IDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUobG9uZ3NbMV0gPT0gMSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb25nc1syXSA9PSAyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZQ0KLSAgICAgICAgICAgIGxvbmdzICA9IHByb3h5LnRlc3RMb25nTGlzdDQocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb25ncy5sZW5ndGg9PTMpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUobG9uZ3NbMF0gPT0gMCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsb25nc1sxXSA9PSAxKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGxvbmdzWzJdID09IDIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bXMoKSB7DQotICAgICAgICB0cnl7IA0KLSAgICAgICAgICAgIFJQQ0xpdCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgRW51bVtdIHJlcXVlc3QgPSBuZXcgRW51bVtdIHtFbnVtLk9ORSwgRW51bS5UV08sIEVudW0uVEhSRUV9Ow0KLSAgICAgICAgICAgDQotICAgICAgICAgICAgRW51bVtdIGVudW1zICA9IHByb3h5LnRlc3RFbnVtTGlzdDUocmVxdWVzdCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtcy5sZW5ndGg9PTMpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZW51bXNbMF0gPT0gRW51bS5PTkUpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZW51bXNbMV0gPT0gRW51bS5UV08pOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZW51bXNbMl0gPT0gRW51bS5USFJFRSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgICAgICBlbnVtcyAgPSBwcm94eS50ZXN0RW51bUxpc3Q1KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZW51bXMubGVuZ3RoPT0zKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzBdID09IEVudW0uT05FKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzFdID09IEVudW0uVFdPKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzJdID09IEVudW0uVEhSRUUpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsgDQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgDQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHJlY2VpdmVkIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9TT0FQMTJQcm94eVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvU09BUDEyUHJveHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTJjYzczLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9TT0FQMTJQcm94eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5zb2FwMTIuRWNobzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5zb2FwMTIuU09BUDEyRWNob1NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEEgc3VpdGUgb2YgdGVzdHMgdG8gdGVzdCBkeW5hbWljIHByb3h5IGNsaWVudHMgc2VuZGluZyBTT0FQIDEuMg0KLSAqIHJlcXVlc3RzLiAgVGhlIGVuZHBvaW50IGNhbiBhY2NlcHQgZGlmZmVyZW50IGtleXMgdG8gZGV0ZXJtaW5lDQotICogd2hhdCBpdCBzaG91bGQgc2VuZCBiYWNrLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTT0FQMTJQcm94eVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRU5EX1NPQVAxMV9SRVNQT05TRSA9ICJSRVNQT05TRS1TT0FQMTEiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VORF9TT0FQMTJfUkVTUE9OU0UgPSAiUkVTUE9OU0UtU09BUDEyIjsNCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUDEyRWNob1NlcnZpY2UuRWNob1BvcnQiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFNPQVAxMlByb3h5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2VuZCBhIFNPQVAgMS4yIHJlcXVlc3QgYW5kIGV4cGVjdCBhIFNPQVAgMS4yIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVAxMlJlcXVlc3RTT0FQMTJSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBjcmVhdGUgdGhlIHByb3h5IGluc3RhbmNlLiAgdGhlIFdTREwgdXNlZCBieSB0aGlzIHByb3h5DQotICAgICAgICAvLyBzaG91bGQgaGF2ZSBhIHByb3BlciBTT0FQIDEuMiBiaW5kaW5nIGNvbmZpZ3VyZWQNCi0gICAgICAgIFNPQVAxMkVjaG9TZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU09BUDEyRWNob1NlcnZpY2UoKTsNCi0gICAgICAgIEVjaG8gcHJveHkgPSBzZXJ2aWNlLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiLCAiRWNob1BvcnQiKSwgRWNoby5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgIC8vIGludm9rZSB0aGUgcmVtb3RlIG9wZXJhdGlvbi4gIHNlbmQgYSBrZXkgdGhhdCB0ZWxscyB0aGUgDQotICAgICAgICAvLyBzZXJ2aWNlIHNlbmQgYmFjayBhIFNPQVAgMS4yIHJlc3BvbnNlLg0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNobyhTRU5EX1NPQVAxMl9SRVNQT05TRSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgcmV0dXJuZWQgWyIgKyByZXNwb25zZSArICJdIik7DQotICAgICAgICANCi0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmVxdWFscygiRkFJTCIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUNCi0gICAgICAgIHJlc3BvbnNlID0gcHJveHkuZWNobyhTRU5EX1NPQVAxMl9SRVNQT05TRSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgcmV0dXJuZWQgWyIgKyByZXNwb25zZSArICJdIik7DQotICAgICAgICANCi0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIXJlc3BvbnNlLmVxdWFscygiRkFJTCIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNlbmQgYSBTT0FQIDEuMiByZXF1ZXN0LCBidXQgaGF2ZSB0aGUgc2VydmVyIHNlbmQgYmFjayBhIFNPQVAgMS4xDQotICAgICAqIHJlc3BvbnNlLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbi4NCi0gICAgICovDQotICAgIC8vIFRPRE8gZml4IGFuZCByZS1lbmFibGUNCi0gICAgcHVibGljIHZvaWQgX3Rlc3RTT0FQMTJSZXF1ZXN0U09BUDExUmVzcG9uc2UoKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcHJveHkgaW5zdGFuY2UuICB0aGUgV1NETCB1c2VkIGJ5IHRoaXMgcHJveHkNCi0gICAgICAgIC8vIHNob3VsZCBoYXZlIGEgcHJvcGVyIFNPQVAgMS4yIGJpbmRpbmcgY29uZmlndXJlZA0KLSAgICAgICAgU09BUDEyRWNob1NlcnZpY2Ugc2VydmljZSA9IG5ldyBTT0FQMTJFY2hvU2VydmljZSgpOw0KLSAgICAgICAgRWNobyBwcm94eSA9IHNlcnZpY2UuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIsICJFY2hvUG9ydCIpLCBFY2hvLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gaW52b2tlIHRoZSByZW1vdGUgb3BlcmF0aW9uLiAgc2VuZCBhIGtleSB0aGF0IHRlbGxzIHRoZSANCi0gICAgICAgIC8vIHNlcnZpY2Ugc2VuZCBiYWNrIGEgU09BUCAxLjEgcmVzcG9uc2UuICB0aGlzIHNob3VsZCByZXN1bHQNCi0gICAgICAgIC8vIGluIGFuIGVycm9yLg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvKFNFTkRfU09BUDExX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgcmV0dXJuZWQgWyIgKyByZXNwb25zZSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gaWYgd2UndmUgZ290dGVuIHRoaXMgZmFyLCB0aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLg0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJhbiBleGNlcHRpb24gd2FzIHRocm93biwgYXMgZXhwZWN0ZWQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh3c2UuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IGRvIGl0IGEgc2Vjb25kIHRpbWUgdG8gY29uZmlybSB0aGUgc2FtZSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvKFNFTkRfU09BUDExX1JFU1BPTlNFKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmVzcG9uc2UgcmV0dXJuZWQgWyIgKyByZXNwb25zZSArICJdIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gaWYgd2UndmUgZ290dGVuIHRoaXMgZmFyLCB0aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nLg0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJhbiBleGNlcHRpb24gd2FzIHRocm93biwgYXMgZXhwZWN0ZWQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh3c2UuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfSANCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7DQotICAgICAgICAvLyBOT09QDQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvRG9jTGl0bm9uV3JhcHBlZEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL0RvY0xpdG5vbldyYXBwZWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NGM0MTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvRG9jTGl0bm9uV3JhcHBlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0bm9ud3JhcHBlZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoDQotICAgICAgICBzZXJ2aWNlTmFtZT0iUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlIiwgDQotICAgICAgICB3c2RsTG9jYXRpb249Ik1FVEEtSU5GL3Byb3h5X2RvY2xpdF91bndyLndzZGwiLCANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIERvY0xpdG5vbldyYXBwZWRJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotDQotCQ0KLQlwdWJsaWMgRG9jTGl0bm9uV3JhcHBlZEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5Qcm92aWRlciNpbnZva2UoVCkNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnZva2Vfc3RyKSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRW5kIHBvaW50IGNhbGxlZCB3aXRoIFN0cmluZyB2YWx1ZSA9IiArIGludm9rZV9zdHIpOw0KLSAgICAgICAgaWYgKGludm9rZV9zdHIuY29udGFpbnMoIm5pbCIpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIjxuczI6UmV0dXJuVHlwZSB4c2k6bmlsPSd0cnVlJyB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4bWxuczpuczI9XCJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZ1wiLz4iKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZ1wiPjxyZXR1cm5fc3RyPnNvbWUgcmVzcG9uc2U8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvTUVUQS1JTkYvcHJveHlfZG9jbGl0X3Vud3Iud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL01FVEEtSU5GL3Byb3h5X2RvY2xpdF91bndyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODk3OTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvTUVUQS1JTkYvcHJveHlfZG9jbGl0X3Vud3Iud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhLS0NCi0JVGhpcyBpcyBhIGNvcHkgb2YgcHJveHlfZG9jbGl0d3Iud3NkbC4gU2VydmljZSBhbmQgcG9ydCBuYW1lcw0KLQloYXZlIGJlZW4gY2huYWdlZCB0byBiZSBBbHBoYSBjb21wYXRpYmxlIGFuZCBlbmRwb2ludCBhZGRyZXNzDQotCWhhcyBiZWVuIGNoYW5nZWQNCi0tLT4NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0icHJveHkiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciPg0KLQkNCi0JPHdzZGw6dHlwZXM+DQotCQk8eHNkOnNjaGVtYQ0KLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlGYXVsdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkNCi0JCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlIiBuaWxsYWJsZT0idHJ1ZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2Vfc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldHVyblR5cGUiIG5pbGxhYmxlPSJ0cnVlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkJDQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JDQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOmludm9rZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkNCi0JDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdG5vbldyYXBwZWRQcm94eSI+DQotDQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczppbnZva2VSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkJDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iUHJveHlEb2NMaXRub25XcmFwcGVkIiB0eXBlPSJ0bnM6RG9jTGl0bm9uV3JhcHBlZFByb3h5Ij4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnL2ludm9rZVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkNCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JDQotCTwvd3NkbDpiaW5kaW5nPg0KLQkNCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQcm94eURvY0xpdFVud3JhcHBlZFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6UHJveHlEb2NMaXRub25XcmFwcGVkIiBuYW1lPSJEb2NMaXRub25XcmFwcGVkSW1wbFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9ASE9TVEA6QFBPUlRAL2pheHdzLnByb3h5L3NlcnZpY2VzL1Byb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL3NlaS9Eb2NMaXRub25XcmFwcGVkUHJveHkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXRub253cmFwcGVkL3NlaS9Eb2NMaXRub25XcmFwcGVkUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1NmViZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9zZWkvRG9jTGl0bm9uV3JhcHBlZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdG5vbndyYXBwZWQuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLkludm9rZTsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0bm9ud3JhcHBlZC5SZXR1cm5UeXBlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdG5vbldyYXBwZWRQcm94eSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIpDQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi1wdWJsaWMgaW50ZXJmYWNlIERvY0xpdG5vbldyYXBwZWRQcm94eSB7DQotCS8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LnByb3h5LmRvY2xpdG5vbndyYXBwZWQuUmV0dXJuVHlwZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmcvaW52b2tlUmV0dXJuIikNCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IGludm9rZUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgSW52b2tlIGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmcvaW52b2tlUmV0dXJuIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIEludm9rZSBhbGxCeU15c2VsZiwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gImFzeW5jSGFuZGxlciIpDQotICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcudGVzdC5wcm94eS5kb2NsaXRub253cmFwcGVkLlJldHVyblR5cGUNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnL2ludm9rZVJldHVybiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICBwdWJsaWMgUmV0dXJuVHlwZSBpbnZva2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdG5vbndyYXBwZWQucHJveHkudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBJbnZva2UgYWxsQnlNeXNlbGYpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9zZWkvUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0bm9ud3JhcHBlZC9zZWkvUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NzJhOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdG5vbndyYXBwZWQvc2VpL1Byb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5kb2NsaXRub253cmFwcGVkLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0bm9ud3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJwcm94eV9kb2NsaXRfdW53ci53c2RsIikNCi1wdWJsaWMgY2xhc3MgUHJveHlEb2NMaXRVbndyYXBwZWRTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFBST1hZRE9DTElUVU5XUkFQUEVEU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L0M6L3RlbXAvcHJveHlfZG9jbGl0X3Vud3Iud3NkbCIpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgUFJPWFlET0NMSVRVTldSQVBQRURTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFBST1hZRE9DTElUVU5XUkFQUEVEU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgIlByb3h5RG9jTGl0VW53cmFwcGVkU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRG9jTGl0bm9uV3JhcHBlZFByb3h5DQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJQcm94eURvY0xpdG5vbldyYXBwZWRQb3J0IikNCi0gICAgcHVibGljIERvY0xpdG5vbldyYXBwZWRQcm94eSBnZXRQcm94eURvY0xpdG5vbldyYXBwZWRQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChEb2NMaXRub25XcmFwcGVkUHJveHkpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXRub253cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgIlByb3h5RG9jTGl0bm9uV3JhcHBlZFBvcnQiKSwgRG9jTGl0bm9uV3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9Eb2NMaXRXcmFwcGVkUHJveHlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9Eb2NMaXRXcmFwcGVkUHJveHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMGYwOTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvRG9jTGl0V3JhcHBlZFByb3h5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5kb2NsaXR3cmFwcGVkOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotQFdlYlNlcnZpY2VQcm92aWRlcigNCi0gICAgICAgIHNlcnZpY2VOYW1lPSJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIiwgDQotICAgICAgICB3c2RsTG9jYXRpb249Ik1FVEEtSU5GL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXRXcmFwcGVkUHJveHlJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnZva2Vfc3RyKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRW5kIHBvaW50IGNhbGxlZCB3aXRoIFN0cmluZyB2YWx1ZSA9IiArIGludm9rZV9zdHIpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIjxuczI6UmV0dXJuVHlwZSB4bWxuczpuczI9XCJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZ1wiPjxyZXR1cm5fc3RyPnNvbWUgcmVzcG9uc2U8L3JldHVybl9zdHI+PC9uczI6UmV0dXJuVHlwZT4iKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvTUVUQS1JTkYvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9Qcm94eURvY0xpdFdyYXBwZWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5YmJjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9NRVRBLUlORi9Qcm94eURvY0xpdFdyYXBwZWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm94eSINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyI+DQotDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZSAvPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25ld2F5X3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX2ludCINCi0JCQkJCQkJdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvd2F5X3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXR1cm5UeXBlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotDQotCQkJDQotDQotCQkJPCEtLSBmaW4gb3AgZGVmaW5pdGlvbiAtLT4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3AiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3AiDQotCQkJCQkJCXR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSINCi0JCQkJCQkJdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbW91bnQiIHR5cGU9InhzZDpmbG9hdCIgLz4NCi0JCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaXRoZHJhdyI+DQotCQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVtbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXBvc2l0Ij4NCi0JCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPg0KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0dXMiDQotCQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCQk8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVZvaWRSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXlWb2lkIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6aW52b2tlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkRvY0xpdFdyYXBwZWRQcm94eSI+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVZvaWRSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczppbnZva2VSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOnBvcnRUeXBlPg0KLQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlByb3h5RG9jTGl0V3JhcHBlZCINCi0JCXR5cGU9InRuczpEb2NMaXRXcmFwcGVkUHJveHkiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiDQotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvZmluT3AiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQk8L3dzZGw6YmluZGluZz4NCi0NCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOlByb3h5RG9jTGl0V3JhcHBlZCINCi0JCQluYW1lPSJEb2NMaXRXcmFwcGVkUHJveHlJbXBsUG9ydCI+DQotCQkJPHNvYXA6YWRkcmVzcw0KLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL1Byb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UvaW52b2tlIiAvPg0KLQkJPC93c2RsOnBvcnQ+DQotCTwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9zZWkvRG9jTGl0V3JhcHBlZFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9zZWkvRG9jTGl0V3JhcHBlZFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjQ5MWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2RvY2xpdHdyYXBwZWQvc2VpL0RvY0xpdFdyYXBwZWRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0d3JhcHBlZC5zZWk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3BSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5hbmNpYWxPcGVyYXRpb247DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdFdyYXBwZWRQcm94eSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIpDQotcHVibGljIGludGVyZmFjZSBEb2NMaXRXcmFwcGVkUHJveHkgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAT25ld2F5DQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5Vm9pZCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLk9uZVdheVZvaWQiKQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9uZXdheVN0cg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQE9uZXdheQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIm9uZVdheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5PbmVXYXkiKQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvbmV3YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgb25ld2F5U3RyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50DQotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJTdHINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8ZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy5zZWkuVHdvV2F5SG9sZGVyPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsIGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxUd29XYXlIb2xkZXI+IHR3b1dheUhvbGRlckFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9pbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIGludCB0d29XYXlIb2xkZXJJbnQpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQNCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsIGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5SG9sZGVyQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgdHdvV2F5SG9sZGVyU3RyLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgaW50IHR3b1dheUhvbGRlckludCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFR3b1dheUhvbGRlcj4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50DQotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJTdHINCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikNCi0gICAgcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHR3b1dheUhvbGRlclN0ciwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9pbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8SW50ZWdlcj4gdHdvV2F5SG9sZGVySW50KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHdvd2F5U3RyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPGRvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcuc2VpLlJldHVyblR5cGU+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5IiwgYWN0aW9uID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5SZXR1cm5UeXBlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IHR3b1dheUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHR3b3dheVN0cik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHR3b3dheVN0cg0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheSIsIGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiB0d29XYXlBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b3dheV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB0d293YXlTdHINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikNCi0gICAgcHVibGljIFN0cmluZyB0d29XYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgdHdvd2F5U3RyKTsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaW52b2tlU3RyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuUmV0dXJuVHlwZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiBpbnZva2VBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBpbnZva2VTdHIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpbnZva2VTdHINCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgaW52b2tlU3RyLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaW52b2tlU3RyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJldHVybl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIGludm9rZVN0cik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9wDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPGRvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcuc2VpLkZpbk9wUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmluT3AiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvZmluT3AiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3BSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxGaW5PcFJlc3BvbnNlPiBmaW5PcEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9wDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmluT3AiLCBhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvZmluT3AiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3BSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZmluT3BBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBGaW5hbmNpYWxPcGVyYXRpb24gb3AsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxGaW5PcFJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvcA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGRvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcuc2VpLkZpbmFuY2lhbE9wZXJhdGlvbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvZmluT3AiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3BSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRmluYW5jaWFsT3BlcmF0aW9uIGZpbk9wKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL3NlaS9Qcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZG9jbGl0d3JhcHBlZC9zZWkvUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzgzY2ZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL3NlaS9Qcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gIlByb3h5RG9jTGl0V3JhcHBlZC53c2RsIikNCi1wdWJsaWMgY2xhc3MgUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBQUk9YWURPQ0xJVFdSQVBQRURTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9kb2NsaXR3cmFwcGVkL01FVEEtSU5GL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyICA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQkNCi0gICAgICAgIAl9DQotICAgICAgICAJRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICAgICAgDQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBQUk9YWURPQ0xJVFdSQVBQRURTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoUFJPWFlET0NMSVRXUkFQUEVEU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIiwgIlByb3h5RG9jTGl0V3JhcHBlZFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIERvY0xpdFdyYXBwZWRQcm94eQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUHJveHlEb2NMaXRXcmFwcGVkUG9ydCIpDQotICAgIHB1YmxpYyBEb2NMaXRXcmFwcGVkUHJveHkgZ2V0RG9jTGl0V3JhcHBlZFByb3h5SW1wbFBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKERvY0xpdFdyYXBwZWRQcm94eSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciLCAiRG9jTGl0V3JhcHBlZFByb3h5SW1wbFBvcnQiKSwgRG9jTGl0V3JhcHBlZFByb3h5LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvR29yaWxsYVByb3h5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L0dvcmlsbGFQcm94eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3NzRhMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvR29yaWxsYVByb3h5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5GcnVpdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuQXNzZXJ0RmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkdvcmlsbGFJbnRlcmZhY2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb247DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGVzdHMgbW9yZSBjb21wbGljYXRlZCBEb2N1bWVudC9MaXRlcmFsIFdyYXBwZWQgc2NlbmFyaW9zDQotICoNCi0gKi8NCi1AV2ViU2VydmljZSgNCi0JCXRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIsDQotCQlzZXJ2aWNlTmFtZT0iR29yaWxsYVNlcnZpY2UiLA0KLSAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkdvcmlsbGFJbnRlcmZhY2UiKQ0KLXB1YmxpYyBjbGFzcyBHb3JpbGxhUHJveHlJbXBsIGltcGxlbWVudHMgR29yaWxsYUludGVyZmFjZSB7DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9TdHJpbmcoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9TdHJpbmcyKGphdmEubGFuZy5TdHJpbmcsIGphdmF4LnhtbC53cy5Ib2xkZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBlY2hvU3RyaW5nMihTdHJpbmcgZGF0YSwgSG9sZGVyPFN0cmluZz4gaW5vdXQpDQotICAgICAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIC8vIENvbWJpbmUgdGhlIHN0cmluZ3MgdG9nZXRoZXIuDQotICAgICAgICAvLyBUaGUgc3RyaW5ncyBtYXkgYmUgbnVsbCBvbiBpbnB1dA0KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7DQotICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGlub3V0LnZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHQgPSBkYXRhICsgaW5vdXQudmFsdWU7DQotICAgICAgICB9IGVsc2UgIHsNCi0gICAgICAgICAgICByZXN1bHQgPSAoZGF0YSAhPSBudWxsKSA/IGRhdGEgOiBpbm91dC52YWx1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlub3V0LnZhbHVlID0gcmVzdWx0Ow0KLQ0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9JbnQoamF2YS5sYW5nLkludGVnZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW50ZWdlciBlY2hvSW50KEludGVnZXIgZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpLkdvcmlsbGFJbnRlcmZhY2UjZWNob0FueVR5cGUoamF2YS5sYW5nLk9iamVjdCkNCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3QgZWNob0FueVR5cGUoT2JqZWN0IGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvU3RyaW5nTGlzdChqYXZhLnV0aWwuTGlzdCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZWNob1N0cmluZ0xpc3QoTGlzdDxTdHJpbmc+IGRhdGEpDQotICAgICAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nW10gZWNob1N0cmluZ0xpc3RBbHQoU3RyaW5nW10gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TGlzdDxTdHJpbmc+PiBlY2hvU3RyaW5nTGlzdEFycmF5KExpc3Q8TGlzdDxTdHJpbmc+PiBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0gICAgDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9TdHJpbmdBcnJheShqYXZhLnV0aWwuTGlzdCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZWNob1N0cmluZ0FycmF5KExpc3Q8U3RyaW5nPiBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdHJpbmdbXSBlY2hvU3RyaW5nQXJyYXlBbHQoU3RyaW5nW10gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZWNob0luZGV4ZWRTdHJpbmdBcnJheShMaXN0PFN0cmluZz4gZGF0YSkgdGhyb3dzIEFzc2VydEZhdWx0IHsNCi0gICAgICAgIHJldHVybiBkYXRhOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9TdHJpbmcyQXJyYXkoamF2YS51dGlsLkxpc3QsIGphdmF4LnhtbC53cy5Ib2xkZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBlY2hvU3RyaW5nMkFycmF5KExpc3Q8U3RyaW5nPiBkYXRhLCBIb2xkZXI8TGlzdDxTdHJpbmc+PiBpbm91dCkNCi0gICAgICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgaW5vdXQudmFsdWUuYWRkQWxsKGRhdGEpOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaS5Hb3JpbGxhSW50ZXJmYWNlI2VjaG9JbnRBcnJheShqYXZhLnV0aWwuTGlzdCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IGVjaG9JbnRBcnJheShMaXN0PEludGVnZXI+IGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5zZWkuR29yaWxsYUludGVyZmFjZSNlY2hvQW55VHlwZUFycmF5KGphdmEudXRpbC5MaXN0KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBlY2hvQW55VHlwZUFycmF5KExpc3Q8T2JqZWN0PiBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZydWl0IGVjaG9FbnVtKEZydWl0IGRhdGEpIHRocm93cyBBc3NlcnRGYXVsdCB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxGcnVpdD4gZWNob0VudW1BcnJheShMaXN0PEZydWl0PiBkYXRhKSB0aHJvd3MgQXNzZXJ0RmF1bHQgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGVjaG9EYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHJlcXVlc3RlZFRlcm1pbmF0aW9uVGltZSwgRHVyYXRpb24gcmVxdWVzdGVkTGlmZXRpbWVEdXJhdGlvbikgew0KLQ0KLQkJcmV0dXJuIHJlcXVlc3RlZFRlcm1pbmF0aW9uVGltZTsNCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCBlY2hvUG9seW1vcnBoaWNEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHJlcXVlc3QpIHsgDQotCQkvL1Rlc3QgdG8gbWFrZSBzdXJlIHBvbHltb3JwaWMgY2FzZXMgY2FuIG1hcnNoYWwgb24gY2xpZW50IGFuZCBzZXJ2ZXIuDQotCQlpZihyZXF1ZXN0PT1udWxsKXsNCi0JCQkNCi0JCX0NCi0JfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9NRVRBLUlORi9nb3JpbGxhX2Rsdy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L01FVEEtSU5GL2dvcmlsbGFfZGx3LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NmY2NTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L01FVEEtSU5GL2dvcmlsbGFfZGx3LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5MDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyINCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIgDQotICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHciIA0KLSAgICB4bWxuczpkYXRhPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIg0KLSAgICB4bWxuczpqYXhiPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXhiIiAgamF4Yjp2ZXJzaW9uPSIyLjAiDQotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDwhLS0gVXNlIGVsZW1lbnRGb3JtRGVmYXVsdD1xdWFsaWZpZWQuICBNYW55IHVzZXJzIHVzZSB0aGlzIHNldHRpbmcgZm9yIGludGVyb3AgY29tcGF0aWJpbGl0eSAtLT4NCi0gICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiANCi0gICAgICAgIHhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCINCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIgPg0KLQ0KLSAgICAgIDxzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEyIiAgLz4NCi0NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZmF1bHREYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8czpzaW1wbGVUeXBlIG5hbWU9InN0cmluZ0xpc3QiPiAgIA0KLSAgICAgICAgPHM6bGlzdCBpdGVtVHlwZT0iczpzdHJpbmciLz4gDQotICAgICAgPC9zOnNpbXBsZVR5cGU+DQotDQotICAgICAgPHM6c2ltcGxlVHlwZSBuYW1lPSJmcnVpdCI+DQotICAgICAgICAgPHM6cmVzdHJpY3Rpb24gYmFzZT0iczpzdHJpbmciPg0KLSAgICAgICAgICAgIDxzOmVudW1lcmF0aW9uIHZhbHVlPSJhcHBsZSIvPiAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0ib3JhbmdlIi8+ICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICA8czplbnVtZXJhdGlvbiB2YWx1ZT0icGVhciIvPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgPC9zOnJlc3RyaWN0aW9uPg0KLSAgICAgIDwvczpzaW1wbGVUeXBlPg0KLQ0KLSAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9Ik9iamVjdDAiPg0KLSAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJkYXRhMCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0NCi0gICAgICA8IS0tIEVjaG8gYSBTdHJpbmcuICBUaGlzIGFsc28gc3VwcG9ydHMgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGVyZSBpcyBubyBzdHJpbmcgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGNvbWJpbmVkIFN0cmluZy0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZzIiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Imlub3V0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZzJSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iaW5vdXQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGludCAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9JbnQiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9InM6aW50IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvSW50UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iczppbnQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gZW51bSAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9FbnVtIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOmZydWl0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvRW51bVJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9ImRhdGE6ZnJ1aXQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gYW55VHlwZS4gIFRlc3QgcG9seW1vcnBoaXNtIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0FueVR5cGUiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9InM6YW55VHlwZSIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0FueVR5cGVSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOmFueVR5cGUiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gc3RyaW5nTGlzdC4gIFRlc3RzIHhzZDpsaXN0LS0+DQotICAgICAgPCEtLSBCb3RoIHRoZSBTRUkgYW5kIHRoZSBiZWFuIHVzZSBMaXN0IFN0cmluZyB0byByZXByZXNlbnQgdGhlIGRhdGEuICAtLT4NCi0gICAgICA8IS0tIEJ1dCB0aGVyZSBhcmUgc29tZSBzZW1hbnRpYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgYW5kIGVjaG9TdHJpbmdBcnJheSAtLT4NCi0gICAgICA8IS0tIGR1ZSB0byB4bWwgZGlmZmVyZW5jZXMgYmV0d2VlbiB4c2Q6bGlzdCBhbmQgbWF4T2NjdXJzIHVuYm91bmRlZCAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkYXRhIiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InJlc3VsdCIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBKdXN0IGxpa2Ugc3RyaW5nTGlzdCwgZXhjZXB0IHRoZSBTRUkgcGFyYW1ldGVyIGlzIG1hbnVhbGx5IGNoYW5nZWQgdG8gU3RyaW5nW10gLS0+DQotICAgICAgPCEtLSBUaGlzIHdpbGwgdGVzdCBMaXN0IDwtPiBqYXZhIEFycmF5IHByb2Nlc3NpbmcgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdCI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gSnVzdCBsaWtlIHN0cmluZ0xpc3QsIGV4Y2VwdCB0aGUgU0VJIHBhcmFtZXRlciBpcyBtYW51YWxseSBjaGFuZ2VkIHRvIExpbmtlZExpc3QgU3RyaW5nIC0tPg0KLSAgICAgIDwhLS0gVGhpcyB3aWxsIHRlc3QgTGlzdCA8LT4gamF2YSBBcnJheSBwcm9jZXNzaW5nIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3QiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQkgIA0KLQkgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3RSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdEFzTGlua2VkTGlzdFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJyZXN1bHQiIHR5cGU9ImRhdGE6c3RyaW5nTGlzdCIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gVGhlIFNFSSBhbmQgYmVhbiBwcm9wZXJ0eSBtYXAgdG8gTGlzdCBMaXN0IFN0cmluZyAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdMaXN0QXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iZGF0YTpzdHJpbmdMaXN0IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nTGlzdEFycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJkYXRhOnN0cmluZ0xpc3QiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gYSBTdHJpbmcgYXJheS4gLS0+DQotICAgICAgPCEtLSBQcm9iYWJseSB0aGUgbW9zdCBjb21tb24gY2FzZS4gIEJvdGggdGhlIFNFSSBhbmQgYmVhbiBhcmUgbWFwcGVkIHRvIExpc3QgU3RyaW5nIC0tPg0KLSAgICAgIDwhLS0gVGhlIHhtbCBtYXhPY2N1cnMgc2VtYW50aWNzIGFyZSB1c2VkIHRvIG1hcnNoYWwgYW5kIHVubWFyc2hhbCB0aGUgdmFsdWVzLi4uIC0tPg0KLSAgICAgIDwhLS0gV2hpY2ggbWFrZXMgdGhpcyBhIGxpdHRsZSBkaWZmZXJlbnQgdGhhbiB0aGUgZWNob1N0cmluZ0xpc3QgY2FzZSAtLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gU2FtZSBhcyBlY2hvU3RyaW5nQXJyYXksIGV4Y2VwdCB0aGUgU0VJIGlzIG1hbnVhbGx5IGNoYW5nZWQgdG8gU3RyaW5nW10gLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBbHQiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheUFsdFJlc3BvbnNlIj4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJlc3VsdCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIFNhbWUgYXMgZWNob1N0cmluZ0FycmF5LCBleGNlcHQgdGhlIFNFSSBpcyBtYW51YWxseSBjaGFuZ2VkIHRvIExpbmtlZExpc3QgU3RyaW5nIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3RSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6c3RyaW5nIiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIEluZGV4ZWQgU3RyaW5nIEFycmF5IC0tPg0KLSAgICAgIDwhLS0gSW4gdGhpcyBjYXNlIHRoZSBwYXJhbWV0ZXIgaXMgYSBMaXN0IFN0cmluZywgYnV0IHRoZSBiZWFuIHByb3BlcnR5IHVzZXMgdGhlIGluZGV4ZWQgLS0+DQotICAgICAgPCEtLSBzZXR0ZXIvZ2V0dGVyIHN0eWxlIG1ldGhvZHMgLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvSW5kZXhlZFN0cmluZ0FycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6c3RyaW5nIiA+DQotICAgICAgICAgICAgICA8czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgICA8czphcHBpbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxqYXhiOnByb3BlcnR5IGNvbGxlY3Rpb25UeXBlPSJpbmRleGVkIiAvPg0KLSAgICAgICAgICAgICAgICA8L3M6YXBwaW5mbz4NCi0gICAgICAgICAgICAgIDwvczphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDwvczplbGVtZW50Pg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvSW5kZXhlZFN0cmluZ0FycmF5UmVzcG9uc2UiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmVzdWx0IiB0eXBlPSJzOnN0cmluZyIgPg0KLSAgICAgICAgICAgICAgPHM6YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICAgPHM6YXBwaW5mbz4NCi0gICAgICAgICAgICAgICAgICA8amF4Yjpwcm9wZXJ0eSBjb2xsZWN0aW9uVHlwZT0iaW5kZXhlZCIgLz4NCi0gICAgICAgICAgICAgICAgPC9zOmFwcGluZm8+DQotICAgICAgICAgICAgICA8L3M6YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQ0KLSAgICAgIDwhLS0gRWNobyBjb21iaW5lZCBTdHJpbmctLT4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmcyQXJyYXkiPg0KLSAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGF0YSIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbm91dCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmcyQXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbm91dCIgdHlwZT0iczpzdHJpbmciIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gaW50IC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0ludEFycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9InM6aW50IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvSW50QXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6aW50IiAvPg0KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotICAgICAgPC9zOmVsZW1lbnQ+DQotDQotICAgICAgPCEtLSBFY2hvIGVudW0gLS0+DQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvRW51bUFycmF5Ij4NCi0gICAgICAgIDxzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImRhdGEiIHR5cGU9ImRhdGE6ZnJ1aXQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9FbnVtQXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9ImRhdGE6ZnJ1aXQiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0NCi0gICAgICA8IS0tIEVjaG8gYW55VHlwZS4gIFRlc3QgcG9seW1vcnBoaXNtIC0tPg0KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0FueVR5cGVBcnJheSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkYXRhIiB0eXBlPSJzOmFueVR5cGUiIC8+DQotICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgICA8L3M6ZWxlbWVudD4NCi0gICAgICA8czplbGVtZW50IG5hbWU9ImVjaG9BbnlUeXBlQXJyYXlSZXNwb25zZSI+DQotICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXN1bHQiIHR5cGU9InM6YW55VHlwZSIgLz4NCi0gICAgICAgICAgPC9zOnNlcXVlbmNlPg0KLSAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwvczplbGVtZW50Pg0KLQkgIA0KLSAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvRGF0ZSI+ICAgICAJIA0KLSAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+DQotCQkgICA8czpjaG9pY2U+DQotCQkJCTxzOmVsZW1lbnQgbmFtZT0iUmVxdWVzdGVkVGVybWluYXRpb25UaW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpkYXRlVGltZSIgLz4NCi0JCQkJPHM6ZWxlbWVudCBuYW1lPSJSZXF1ZXN0ZWRMaWZldGltZUR1cmF0aW9uIiB0eXBlPSJzOmR1cmF0aW9uIiAvPg0KLQkJCTwvczpjaG9pY2U+DQotCQkJDQotICAgICAgICAgICAgIDwhLS08czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InJlcXVlc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOmRhdGUiIC8+DQotICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4gLS0+DQotCQkJIA0KLSAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPg0KLQkgIDwvczplbGVtZW50Pg0KLQ0KLQkgIDxzOmVsZW1lbnQgbmFtZT0iZWNob0RhdGVSZXNwb25zZSI+DQotICAgICAgICAgICA8czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICAgPHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0iczpkYXRlIiAvPg0KLSAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+DQotCSAgPC9zOmVsZW1lbnQ+DQotCSAgDQotCSAgPHM6Y29tcGxleFR5cGUgbmFtZT0iZWNob0Jhc2V0eXBlIj4NCi0JICAgICAgICAgICAgPHM6c2VxdWVuY2U+DQotCSAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0iczpkYXRlIiAvPg0KLQkgICAgICAgICAgICA8L3M6c2VxdWVuY2U+DQotCSAgICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0JCQkgDQotCSAgCSA8czplbGVtZW50IG5hbWU9ImVjaG9Qb2x5bW9ycGhpY0RhdGUiPg0KLQkJCSA8czpjb21wbGV4VHlwZT4NCi0JCQkJPHM6Y29tcGxleENvbnRlbnQ+DQotCQkJCQk8czpleHRlbnNpb24gYmFzZT0iZGF0YTplY2hvQmFzZXR5cGUiLz4NCi0JCQkJPC9zOmNvbXBsZXhDb250ZW50Pg0KLQkJCTwvczpjb21wbGV4VHlwZT4NCi0JCSA8L3M6ZWxlbWVudD4NCi0JCSAJICANCi0gICAgPC9zOnNjaGVtYT4NCi0NCi0gICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YTIiID4NCi0gICAgICAgIA0KLSAgICAgICAgPCEtLSBGb3IgYW55VHlwZSBwcm9jZXNzaW5nLCAgT2JqZWN0MSBpcyBpbiBhbiBpbXBvcnRlZCBzY2hlbWEsIHRodXMgaXQgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlIGFueVR5cGUgLS0+DQotICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3QxIj4NCi0gICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImRhdGExIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgPC9zOnNjaGVtYT4NCi0NCi0gICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhVW5yZWYiID4NCi0gICAgICAgIA0KLSAgICAgICAgPCEtLSBGb3IgYW55VHlwZSBwcm9jZXNzaW5nLCAgT2JqZWN0MiBpcyBpbiBhbiB1bnJlZmVyZW5jZWQgc2NoZW1hLCB0aHVzIG1heSBmYWlsIHdoZW4gdXNlZCB3aXRoIGFueVR5cGUgLS0+DQotICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJPYmplY3QyIj4NCi0gICAgICAgICAgIDxzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImRhdGEyIiB0eXBlPSJzOnN0cmluZyIgLz4NCi0gICAgICAgICAgIDwvczpzZXF1ZW5jZT4NCi0gICAgICAgIDwvczpjb21wbGV4VHlwZT4NCi0gICAgPC9zOnNjaGVtYT4NCi0gDQotICA8L3R5cGVzPg0KLQ0KLSAgPCEtLSBtZXNzYWdlcyAtLT4NCi0gIDxtZXNzYWdlIG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTphc3NlcnRGYXVsdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmciIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmcyIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nMiIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmcyUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmcyUmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvSW50IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvSW50UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvRW51bSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0VudW0iIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvRW51bVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvRW51bVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0FueVR5cGUiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9BbnlUeXBlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0FueVR5cGVSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0FueVR5cGVSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdCI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RBbHQiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nTGlzdEFsdFJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3QiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0QXNMaW5rZWRMaXN0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3RSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3RSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0QXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nTGlzdEFycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdMaXN0QXJyYXlSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0FycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5QWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nQXJyYXlBbHQiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBbHRSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZ0FycmF5QWx0UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3QiPg0KLSAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJkYXRhOmVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3RSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0luZGV4ZWRTdHJpbmdBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0luZGV4ZWRTdHJpbmdBcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9JbmRleGVkU3RyaW5nQXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0luZGV4ZWRTdHJpbmdBcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZzJBcnJheSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZzJBcnJheSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmcyQXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob1N0cmluZzJBcnJheVJlc3BvbnNlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0ludEFycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvSW50QXJyYXkiIC8+DQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50QXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9IngiIGVsZW1lbnQ9ImRhdGE6ZWNob0ludEFycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvRW51bUFycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvRW51bUFycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0VudW1BcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvRW51bUFycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvQW55VHlwZUFycmF5Ij4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvQW55VHlwZUFycmF5IiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob0FueVR5cGVBcnJheVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ieCIgZWxlbWVudD0iZGF0YTplY2hvQW55VHlwZUFycmF5UmVzcG9uc2UiIC8+DQotICA8L21lc3NhZ2U+DQotICANCi0gIA0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Qb2x5bW9ycGhpY0RhdGVNZXNzYWdlIj4NCi0gICAgICA8cGFydCBuYW1lPSJkYXRlUmVxdWVzdCIgZWxlbWVudD0iZGF0YTplY2hvUG9seW1vcnBoaWNEYXRlIi8+DQotICAgPC9tZXNzYWdlPg0KLSAgIA0KLSAgIDxtZXNzYWdlIG5hbWU9ImVjaG9EYXRlTWVzc2FnZSI+DQotICAgICAgPHBhcnQgbmFtZT0iZGF0ZVJlcXVlc3QiIGVsZW1lbnQ9ImRhdGE6ZWNob0RhdGUiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPG1lc3NhZ2UgbmFtZT0iZWNob0RhdGVSZXNwb25zZU1lc3NhZ2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9ImRhdGVSZXNwb25zZSIgZWxlbWVudD0iZGF0YTplY2hvRGF0ZVJlc3BvbnNlIi8+DQotICAgPC9tZXNzYWdlPg0KLQ0KLSAgPCEtLSBvcGVyYXRpb24gLS0+DQotICA8cG9ydFR5cGUgbmFtZT0iR29yaWxsYUludGVyZmFjZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nIiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZzIiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZzIiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZzJSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnQiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludCIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvSW50UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRW51bSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRW51bSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRW51bVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0FueVR5cGUiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0FueVR5cGUiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0FueVR5cGVSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdMaXN0UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nTGlzdEFsdCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdEFsdCIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdEFsdFJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3QiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3QiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3RSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdMaXN0QXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0xpc3RBcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nTGlzdEFycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXlBbHQiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5QWx0IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheUFsdFJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlBc0xpbmtlZExpc3QiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5QXNMaW5rZWRMaXN0UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbmRleGVkU3RyaW5nQXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0luZGV4ZWRTdHJpbmdBcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvSW5kZXhlZFN0cmluZ0FycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmcyQXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZzJBcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nMkFycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50QXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludEFycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRBcnJheVJlc3BvbnNlIiAvPg0KLSAgICAgIDxmYXVsdCAgbmFtZT0iYXNzZXJ0RmF1bHQiIG1lc3NhZ2U9InRuczphc3NlcnRGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VudW1BcnJheSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRW51bUFycmF5IiAvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9FbnVtQXJyYXlSZXNwb25zZSIgLz4NCi0gICAgICA8ZmF1bHQgIG5hbWU9ImFzc2VydEZhdWx0IiBtZXNzYWdlPSJ0bnM6YXNzZXJ0RmF1bHQiIC8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9BbnlUeXBlQXJyYXkiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0FueVR5cGVBcnJheSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvQW55VHlwZUFycmF5UmVzcG9uc2UiIC8+DQotICAgICAgPGZhdWx0ICBuYW1lPSJhc3NlcnRGYXVsdCIgbWVzc2FnZT0idG5zOmFzc2VydEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvUG9seW1vcnBoaWNEYXRlIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9Qb2x5bW9ycGhpY0RhdGVNZXNzYWdlIiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0JPG9wZXJhdGlvbiBuYW1lPSJlY2hvRGF0ZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRGF0ZU1lc3NhZ2UiIC8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0RhdGVSZXNwb25zZU1lc3NhZ2UiIC8+DQotCTwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDwhLS0gYmluZGluZyAtLT4NCi0gIDxiaW5kaW5nIG5hbWU9IkdvcmlsbGFTT0FQIiB0eXBlPSJ0bnM6R29yaWxsYUludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmcyIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnQiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VudW0iPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0FueVR5cGUiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3QiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3RBbHQiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3RBc0xpbmtlZExpc3QiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0xpc3RBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5QWx0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheUFzTGlua2VkTGlzdCI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW5kZXhlZFN0cmluZ0FycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmcyQXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludEFycmF5Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiAvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICAgIDxmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJhc3NlcnRGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbnVtQXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIC8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImFzc2VydEZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9ImFzc2VydEZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgPC9vcGVyYXRpb24+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0FueVR5cGVBcnJheSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iYXNzZXJ0RmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRGF0ZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dD4NCi0gICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4gIA0KLQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9Qb2x5bW9ycGhpY0RhdGUiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvaW5wdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSA8L2JpbmRpbmc+DQotDQotICA8c2VydmljZSBuYW1lPSJHb3JpbGxhU2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IkdvcmlsbGFQb3J0IiBiaW5kaW5nPSJ0bnM6R29yaWxsYVNPQVAiPg0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9Hb3JpbGxhU2VydmljZSIgLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L3NlaS9Bc3NlcnRGYXVsdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L3NlaS9Bc3NlcnRGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIyOTQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9zZWkvQXNzZXJ0RmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gImFzc2VydEZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLXB1YmxpYyBjbGFzcyBBc3NlcnRGYXVsdA0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5Bc3NlcnRGYXVsdCBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIEFzc2VydEZhdWx0KFN0cmluZyBtZXNzYWdlLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuQXNzZXJ0RmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBBc3NlcnRGYXVsdChTdHJpbmcgbWVzc2FnZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkFzc2VydEZhdWx0IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkFzc2VydEZhdWx0IGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L3NlaS9Hb3JpbGxhSW50ZXJmYWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvc2VpL0dvcmlsbGFJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3YTg1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvc2VpL0dvcmlsbGFJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkZydWl0Ow0KLQ0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvOw0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb247DQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJHb3JpbGxhSW50ZXJmYWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3IikNCi1AWG1sU2VlQWxzbyhvcmcudGVzdC5zdG9jazIuR2V0UHJpY2UuY2xhc3MpICAvLyBUZXN0IHNlZSBhbHNvIHByb2Nlc3NpbmcNCi1wdWJsaWMgaW50ZXJmYWNlIEdvcmlsbGFJbnRlcmZhY2Ugew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBTdHJpbmcgZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHBhcmFtIGlub3V0DQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nMiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nMiIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmcyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZzJSZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIGVjaG9TdHJpbmcyKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIFN0cmluZyBkYXRhLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5vdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIG1vZGUgPSBNb2RlLklOT1VUKQ0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gaW5vdXQpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLkludGVnZXINCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9JbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0ludCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9JbnRSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvSW50UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgSW50ZWdlciBlY2hvSW50KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIEludGVnZXIgZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRnJ1aXQNCi0gICAgICogQHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9FbnVtIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9FbnVtIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0VudW1SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvRW51bVJlc3BvbnNlIikNCi0gICAgcHVibGljIEZydWl0IGVjaG9FbnVtKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIEZydWl0IGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkYXRhDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLk9iamVjdA0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0FueVR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0FueVR5cGUiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvQW55VHlwZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9BbnlUeXBlUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgT2JqZWN0IGVjaG9BbnlUeXBlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIE9iamVjdCBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+Pg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0xpc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZ0xpc3QiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nTGlzdFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdMaXN0UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGVjaG9TdHJpbmdMaXN0KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZ1tdDQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIC8vIE5PVEU6IFRoZSByZXR1cm4gYW5kIHBhcmFtIGFyZSBtYW51YWxseSBjaGFuZ2VkIGZyb20gTGlzdDxTdHJpbmc+IHRvIFN0cmluZ1tdDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nTGlzdEFsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nTGlzdEFsdCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdMaXN0QWx0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZ0xpc3RBbHRSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmdbXSBlY2hvU3RyaW5nTGlzdEFsdCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBTdHJpbmdbXSBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+Pg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0xpc3RBcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvU3RyaW5nTGlzdEFycmF5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0xpc3RBcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdMaXN0QXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBMaXN0PExpc3Q8U3RyaW5nPj4gZWNob1N0cmluZ0xpc3RBcnJheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBMaXN0PExpc3Q8U3RyaW5nPj4gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0FycmF5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdBcnJheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIikNCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBlY2hvU3RyaW5nQXJyYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGRhdGEpDQotICAgICAgICB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZ1tdDQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIC8vICBOT1RFOiBUaGUgcmV0dXJuIGFuZCBwYXJhbSBhcmUgbWFudWFsbHkgY2hhbmdlZCBmcm9tIExpc3Q8U3RyaW5nPiB0byBTdHJpbmdbXQ0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ0FycmF5QWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdBcnJheUFsdCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdBcnJheUFsdFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmdBcnJheUFsdFJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZ1tdIGVjaG9TdHJpbmdBcnJheUFsdCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBTdHJpbmdbXSBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+DQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvSW5kZXhlZFN0cmluZ0FycmF5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9JbmRleGVkU3RyaW5nQXJyYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvSW5kZXhlZFN0cmluZ0FycmF5UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0luZGV4ZWRTdHJpbmdBcnJheVJlc3BvbnNlIikNCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBlY2hvSW5kZXhlZFN0cmluZ0FycmF5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIExpc3Q8U3RyaW5nPiBkYXRhKQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0gICAgDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHBhcmFtIGlub3V0DQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nMkFycmF5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9TdHJpbmcyQXJyYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nMkFycmF5UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1N0cmluZzJBcnJheVJlc3BvbnNlIikNCi0gICAgcHVibGljIHZvaWQgZWNob1N0cmluZzJBcnJheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBMaXN0PFN0cmluZz4gZGF0YSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImlub3V0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxMaXN0PFN0cmluZz4+IGlub3V0KQ0KLSAgICAgICAgdGhyb3dzIEFzc2VydEZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGF0YQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5JbnRlZ2VyPg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0ludEFycmF5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9JbnRBcnJheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9JbnRBcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9JbnRBcnJheVJlc3BvbnNlIikNCi0gICAgcHVibGljIExpc3Q8SW50ZWdlcj4gZWNob0ludEFycmF5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZGF0YSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgICAgIExpc3Q8SW50ZWdlcj4gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRnJ1aXQ+DQotICAgICAqIEB0aHJvd3MgQXNzZXJ0RmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvRW51bUFycmF5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9FbnVtQXJyYXkiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvRW51bUFycmF5UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0VudW1BcnJheVJlc3BvbnNlIikNCi0gICAgcHVibGljIExpc3Q8RnJ1aXQ+IGVjaG9FbnVtQXJyYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgTGlzdDxGcnVpdD4gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKiBAdGhyb3dzIEFzc2VydEZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0FueVR5cGVBcnJheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9kYXRhIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuZ29yaWxsYV9kbHcuZGF0YS5FY2hvQW55VHlwZUFycmF5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0FueVR5cGVBcnJheVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9BbnlUeXBlQXJyYXlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZWNob0FueVR5cGVBcnJheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBMaXN0PE9iamVjdD4gZGF0YSkNCi0gICAgICAgIHRocm93cyBBc3NlcnRGYXVsdA0KLSAgICA7DQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3RlZFRlcm1pbmF0aW9uVGltZQ0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdGVkTGlmZXRpbWVEdXJhdGlvbg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob0RhdGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob0RhdGUiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvRGF0ZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5nb3JpbGxhX2Rsdy5kYXRhLkVjaG9EYXRlUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZWNob0RhdGUoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJSZXF1ZXN0ZWRUZXJtaW5hdGlvblRpbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIpDQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhciByZXF1ZXN0ZWRUZXJtaW5hdGlvblRpbWUsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJSZXF1ZXN0ZWRMaWZldGltZUR1cmF0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgRHVyYXRpb24gcmVxdWVzdGVkTGlmZXRpbWVEdXJhdGlvbik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQE9uZXdheQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9Qb2x5bW9ycGhpY0RhdGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvZGF0YSIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LmRhdGEuRWNob1BvbHltb3JwaGljRGF0ZSIpDQotICAgIHB1YmxpYyB2b2lkIGVjaG9Qb2x5bW9ycGhpY0RhdGUoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3L2RhdGEiKQ0KLSAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmVxdWVzdCk7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9zZWkvR29yaWxsYVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2Rsdy9zZWkvR29yaWxsYVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2MGFkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvZ29yaWxsYV9kbHcvc2VpL0dvcmlsbGFTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmdvcmlsbGFfZGx3LnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkdvcmlsbGFTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3Iiwgd3NkbExvY2F0aW9uID0gImdvcmlsbGFfZGx3LndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBHb3JpbGxhU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBHT1JJTExBU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L0M6L2NvbXB3c2RsL2dvcmlsbGFfZGx3LndzZGwiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEdPUklMTEFTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEdvcmlsbGFTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgR29yaWxsYVNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihHT1JJTExBU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L2dvcmlsbGFfZGx3IiwgIkdvcmlsbGFTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBHb3JpbGxhSW50ZXJmYWNlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJHb3JpbGxhUG9ydCIpDQotICAgIHB1YmxpYyBHb3JpbGxhSW50ZXJmYWNlIGdldEdvcmlsbGFQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChHb3JpbGxhSW50ZXJmYWNlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9nb3JpbGxhX2RsdyIsICJHb3JpbGxhUG9ydCIpLCBHb3JpbGxhSW50ZXJmYWNlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YjU2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9SUENMaXQud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvTUVUQS1JTkYvUlBDTGl0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzZiNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9NRVRBLUlORi9SUENMaXQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB4bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotIDx3c2RsOnR5cGVzPg0KLSAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgUU5hbWUgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlFOYW1lTGlzdCI+DQotICAgICAgPHhzZDpsaXN0IGl0ZW1UeXBlPSJ4c2Q6UU5hbWUiLz4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IlFOYW1lTGlzdCIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UU5hbWVMaXN0Ii8+DQotDQotICA8IS0tIEV4YW1wbGUgb2YgYSBDYWxlbmRhciBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIGphdmEudXRpbC5DYWxlbmRhcltdIC0tPg0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJDYWxlbmRhckxpc3QiPiAgIA0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOmRhdGVUaW1lIi8+IA0KLSAgIDwveHNkOnNpbXBsZVR5cGU+ICAgICAgICAgICAgICAgICANCi0gICA8ZWxlbWVudCBuYW1lPSJDYWxlbmRhckxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkNhbGVuZGFyTGlzdCIvPg0KLSAgDQotICA8IS0tIEV4YW1wbGUgb2YgYSBTdHJpbmcgbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBqYXZhLmxhbmcuU3RyaW5nW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN0cmluZ0xpc3QiPiAgIA0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOnN0cmluZyIvPiANCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IlN0cmluZ0xpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0gIA0KLSAgPCEtLSBFeGFtcGxlIG9mIGEgeHNkOm5lZ2F0aXZlSW50ZWdlciBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIGphdmEubWF0aC5CaWdJbnRlZ2VyW10gLS0+DQotICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkJpZ0ludGVnZXJMaXN0Ij4NCi0gICAgICA8eHNkOnJlc3RyaWN0aW9uPiAgICAgDQotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4gDQotICAgICAgICAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPg0KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgICAgIDwveHNkOnJlc3RyaWN0aW9uPg0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iQmlnSW50ZWdlckxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkJpZ0ludGVnZXJMaXN0Ii8+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIHhzZDp1bnNpZ25lZEludCBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIGxvbmdbXSAtLT4NCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9uZ0xpc3QiPg0KLSAgICAgIDx4c2Q6bGlzdD4NCi0gICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp1bnNpZ25lZEludCIvPg0KLSAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgICAgIDwveHNkOmxpc3Q+DQotICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICA8ZWxlbWVudCBuYW1lPSJMb25nTGlzdCIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhbiBFbnVtZXJhdGlvbiB0eXBlLiAgVGhpcyBzaG91bGQgbWFwIHRvIEVudW0uamF2YSAtLT4gIA0KLSAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFbnVtIj4NCi0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPg0KLSAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvbmUiLz4gICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InR3byIvPiAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InRocmVlIi8+ICAgICAgICAgICAgICAgICAgICANCi0gICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCi0gICA8L3hzZDpzaW1wbGVUeXBlPg0KLSAgIDxlbGVtZW50IG5hbWU9IkVudW0iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkVudW0iLz4NCi0gDQotICA8IS0tIEV4YW1wbGUgb2YgYSB4c2Q6ZW51bWVyYXRpb24gbGlzdC4gIFRoaXMgc2hvdWxkIG1hcCB0byBFbnVtW10gLS0+ICANCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bUxpc3QiPg0KLSAgICAgIDx4c2Q6bGlzdCBpdGVtVHlwZT0iaW1wbDpFbnVtIi8+IA0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iRW51bUxpc3QiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotICANCi0gIDwhLS0gRXhhbXBsZSBvZiBhIHhzZDplbnVtZXJhdGlvbiBlbWJlZGRlZCBsaXN0LiAgVGhpcyBzaG91bGQgbWFwIHRvIEVudW1MaXN0MltdIC0tPiANCi0gICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iRW51bUxpc3QyIj4NCi0gICAgICA8eHNkOmxpc3Q+DQotICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPg0KLSAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXBwbGUiIC8+DQotICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPcmFuZ2UiIC8+DQotICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJHcmFwZSIgLz4NCi0gICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4NCi0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICA8L3hzZDpsaXN0Pg0KLSAgIDwveHNkOnNpbXBsZVR5cGU+DQotICAgPGVsZW1lbnQgbmFtZT0iRW51bUxpc3QyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4gDQotDQotICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb21wbGV4QWxsIj4NCi0gICAgICA8eHNkOmFsbD4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15SW50IiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteVN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iRW51bSIgdHlwZT0iaW1wbDpFbnVtIi8+DQotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJteVFOYW1lTGlzdCIgdHlwZT0iaW1wbDpRTmFtZUxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15Q2FsZW5kYXJMaXN0IiB0eXBlPSJpbXBsOkNhbGVuZGFyTGlzdCIvPg0KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXlTdHJpbmdMaXN0IiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15QmlnSW50ZWdlckxpc3QiIHR5cGU9ImltcGw6QmlnSW50ZWdlckxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15TG9uZ0xpc3QiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15RW51bUxpc3QiIHR5cGU9ImltcGw6RW51bUxpc3QiLz4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im15RW51bUxpc3QyIiB0eXBlPSJpbXBsOkVudW1MaXN0MiIvPg0KLSAgICAgIDwveHNkOmFsbD4NCi0gICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICANCi0gICA8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclJldHVybiIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0gICANCi0gICAgPHhzZDplbGVtZW50IG5hbWU9Im15RmF1bHQiIHR5cGU9InhzZDppbnQiIC8+DQotICA8L3NjaGVtYT4NCi0gPC93c2RsOnR5cGVzPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdExpc3RzUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdExpc3RzUmV0dXJuIiB0eXBlPSJpbXBsOlFOYW1lTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdExpc3RzUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfMF8wIiB0eXBlPSJpbXBsOlFOYW1lTGlzdCIvPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzFfMCIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ18yXzAiIHR5cGU9ImltcGw6U3RyaW5nTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzNfMCIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzRfMCIgdHlwZT0iaW1wbDpMb25nTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzVfMCIgdHlwZT0iaW1wbDpFbnVtTGlzdCIvPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzdfMCIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4NCi0gICAgICANCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ182XzAiIHR5cGU9ImltcGw6Y29tcGxleEFsbCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0Q2FsZW5kYXJMaXN0MVJldHVybiIgdHlwZT0iaW1wbDpDYWxlbmRhckxpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfMV8wIiB0eXBlPSJpbXBsOkNhbGVuZGFyTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmV0dXJuIiB0eXBlPSJpbXBsOlN0cmluZ0xpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzJfMCIgdHlwZT0iaW1wbDpTdHJpbmdMaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1JldHVybiIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1JlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iYXJnXzNfMCIgdHlwZT0iaW1wbDpCaWdJbnRlZ2VyTGlzdCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLSAgIA0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdExvbmdMaXN0NFJlc3BvbnNlIj4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InRlc3RMb25nTGlzdDRSZXR1cm4iIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RMb25nTGlzdDRSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ180XzAiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RFbnVtTGlzdDVSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmV0dXJuIiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNV8wIiB0eXBlPSJpbXBsOkVudW1MaXN0Ii8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0idGVzdEVudW1MaXN0N1JldHVybiIgdHlwZT0iaW1wbDpFbnVtTGlzdDIiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RFbnVtTGlzdDdSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImFyZ183XzAiIHR5cGU9ImltcGw6RW51bUxpc3QyIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXR1cm4iIHR5cGU9ImltcGw6Y29tcGxleEFsbCIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdENvbXBsZXhBbGw2UmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJhcmdfNl8wIiB0eXBlPSJpbXBsOmNvbXBsZXhBbGwiLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RTaW1wbGVSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZUluIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0Ij4NCi0NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZUluT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGVPdXQiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9InNpbXBsZUluT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0U2ltcGxlMlJlcXVlc3QiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlMkluMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0ic2ltcGxlMkluMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLQ0KLSAgIDwvd3NkbDptZXNzYWdlPg0KLQ0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFNpbXBsZTJSZXNwb25zZSI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJzaW1wbGUyT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotICAgDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0SGVhZGVyUmVxdWVzdCI+DQotDQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJib2R5UGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICA8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclBhcmFtIiBlbGVtZW50PSJpbXBsOmhlYWRlclBhcmFtIi8+DQotDQotICAgPC93c2RsOm1lc3NhZ2U+DQotDQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0SGVhZGVyUmVzcG9uc2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyUmV0dXJuIiB0eXBlPSJpbXBsOmhlYWRlclJldHVybiIgLz4NCi0NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RGYXVsdFJlcXVlc3QiIC8+DQotICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0RmF1bHRSZXNwb25zZSIgLz4NCi0gICANCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9InJwY0ZhdWx0Ij4NCi0gICAgIDx3c2RsOnBhcnQgbmFtZT0icnBjRmF1bHQiIGVsZW1lbnQ9ImltcGw6bXlGYXVsdCIgLz4NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJSUENMaXQiPg0KLSAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTaW1wbGUiIHBhcmFtZXRlck9yZGVyPSJzaW1wbGVJbiI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlUmVxdWVzdCIgbmFtZT0idGVzdFNpbXBsZVJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlUmVzcG9uc2UiIG5hbWU9InRlc3RTaW1wbGVSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXQiIHBhcmFtZXRlck9yZGVyPSJzaW1wbGVJbk91dCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0IiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZUluT3V0UmVzcG9uc2UiIG5hbWU9InRlc3RTaW1wbGVJbk91dFJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFNpbXBsZTIiIHBhcmFtZXRlck9yZGVyPSJzaW1wbGUySW4xIHNpbXBsZTJJbjIiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFNpbXBsZTJSZXF1ZXN0IiBuYW1lPSJ0ZXN0U2ltcGxlMlJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0U2ltcGxlMlJlc3BvbnNlIiBuYW1lPSJ0ZXN0U2ltcGxlMlJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEhlYWRlciIgcGFyYW1ldGVyT3JkZXI9ImJvZHlQYXJhbSBoZWFkZXJQYXJhbSI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVxdWVzdCIgbmFtZT0idGVzdEhlYWRlclJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVzcG9uc2UiIG5hbWU9InRlc3RIZWFkZXJSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RMaXN0cyIgcGFyYW1ldGVyT3JkZXI9ImFyZ18wXzAgYXJnXzFfMCBhcmdfMl8wIGFyZ18zXzAgYXJnXzRfMCBhcmdfNV8wIGFyZ183XzAgYXJnXzZfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0TGlzdHNSZXF1ZXN0IiBuYW1lPSJ0ZXN0TGlzdHNSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdExpc3RzUmVzcG9uc2UiIG5hbWU9InRlc3RMaXN0c1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdENhbGVuZGFyTGlzdDEiIHBhcmFtZXRlck9yZGVyPSJhcmdfMV8wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCIgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSIgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RTdHJpbmdMaXN0MiIgcGFyYW1ldGVyT3JkZXI9ImFyZ18yXzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdFN0cmluZ0xpc3QyUmVxdWVzdCIgbmFtZT0idGVzdFN0cmluZ0xpc3QyUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIiBuYW1lPSJ0ZXN0U3RyaW5nTGlzdDJSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDMiIHBhcmFtZXRlck9yZGVyPSJhcmdfM18wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RCaWdJbnRlZ2VyTGlzdDNSZXF1ZXN0IiBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RCaWdJbnRlZ2VyTGlzdDNSZXNwb25zZSIgbmFtZT0idGVzdEJpZ0ludGVnZXJMaXN0M1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdExvbmdMaXN0NCIgcGFyYW1ldGVyT3JkZXI9ImFyZ180XzAiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6dGVzdExvbmdMaXN0NFJlcXVlc3QiIG5hbWU9InRlc3RMb25nTGlzdDRSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdExvbmdMaXN0NFJlc3BvbnNlIiBuYW1lPSJ0ZXN0TG9uZ0xpc3Q0UmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RW51bUxpc3Q1IiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzVfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q1UmVxdWVzdCIgbmFtZT0idGVzdEVudW1MaXN0NVJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RW51bUxpc3Q1UmVzcG9uc2UiIG5hbWU9InRlc3RFbnVtTGlzdDVSZXNwb25zZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RFbnVtTGlzdDciIHBhcmFtZXRlck9yZGVyPSJhcmdfN18wIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RFbnVtTGlzdDdSZXF1ZXN0IiBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVxdWVzdCIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOnRlc3RFbnVtTGlzdDdSZXNwb25zZSIgbmFtZT0idGVzdEVudW1MaXN0N1Jlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdENvbXBsZXhBbGw2IiBwYXJhbWV0ZXJPcmRlcj0iYXJnXzZfMCI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDp0ZXN0Q29tcGxleEFsbDZSZXF1ZXN0IiBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6dGVzdENvbXBsZXhBbGw2UmVzcG9uc2UiIG5hbWU9InRlc3RDb21wbGV4QWxsNlJlc3BvbnNlIi8+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEZhdWx0Ij4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJpbXBsOnRlc3RGYXVsdFJlcXVlc3QiIG5hbWU9InRlc3RGYXVsdFJlcXVlc3QiLz4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0iaW1wbDp0ZXN0RmF1bHRSZXNwb25zZSIgbmFtZT0idGVzdEZhdWx0UmVzcG9uc2UiLz4NCi0gICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJycGNGYXVsdCIgbWVzc2FnZT0iaW1wbDpycGNGYXVsdCIgLz4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJQQ0xpdFNvYXBCaW5kaW5nIiB0eXBlPSJpbXBsOlJQQ0xpdCI+DQotDQotICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0NCi0gICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlIj4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0U2ltcGxlUmVxdWVzdCI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdFNpbXBsZVJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlSW5PdXQiPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RTaW1wbGVJbk91dFJlcXVlc3QiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RTaW1wbGVJbk91dFJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0U2ltcGxlMiI+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdFNpbXBsZTJSZXF1ZXN0Ij4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0U2ltcGxlMlJlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0SGVhZGVyIj4NCi0JCQkNCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0SGVhZGVyUmVxdWVzdCI+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9ImJvZHlQYXJhbSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbXBsOnRlc3RIZWFkZXJSZXF1ZXN0IiBwYXJ0PSJoZWFkZXJQYXJhbSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0SGVhZGVyUmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW1wbDp0ZXN0SGVhZGVyUmVzcG9uc2UiIHBhcnQ9ImhlYWRlclJldHVybiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0TGlzdHMiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdExpc3RzUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdExpc3RzUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDYWxlbmRhckxpc3QxIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RDYWxlbmRhckxpc3QxUmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdENhbGVuZGFyTGlzdDFSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdFN0cmluZ0xpc3QyIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RTdHJpbmdMaXN0MlJlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RCaWdJbnRlZ2VyTGlzdDNSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0QmlnSW50ZWdlckxpc3QzUmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RMb25nTGlzdDQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotDQotICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0idGVzdExvbmdMaXN0NFJlcXVlc3QiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6aW5wdXQ+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RMb25nTGlzdDRSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0idGVzdEVudW1MaXN0NSI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0RW51bUxpc3Q1UmVxdWVzdCI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0idGVzdEVudW1MaXN0NVJlc3BvbnNlIj4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0RW51bUxpc3Q3Ij4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RFbnVtTGlzdDdSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0RW51bUxpc3Q3UmVzcG9uc2UiPg0KLQ0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiB1c2U9ImxpdGVyYWwiLz4NCi0NCi0gICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLQ0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RDb21wbGV4QWxsNiI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0Q29tcGxleEFsbDZSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotDQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4gDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RGYXVsdCI+DQotDQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ0ZXN0RmF1bHQiLz4NCi0NCi0gICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJ0ZXN0RmF1bHRSZXF1ZXN0Ij4NCi0NCi0gICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdCIgdXNlPSJsaXRlcmFsIi8+DQotDQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJ0ZXN0RmF1bHRSZXNwb25zZSI+DQotDQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiIHVzZT0ibGl0ZXJhbCIvPg0KLQ0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0icnBjRmF1bHQiPg0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpmYXVsdCBuYW1lPSJycGNGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLSAgICAgICAgIDwvd3NkbDpmYXVsdD4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPiAgICAgIA0KLQ0KLSAgIDwvd3NkbDpiaW5kaW5nPg0KLQ0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iUlBDTGl0U2VydmljZSI+DQotDQotICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbXBsOlJQQ0xpdFNvYXBCaW5kaW5nIiBuYW1lPSJSUENMaXQiPg0KLQ0KLSAgICAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvYXhpczIvc2VydmljZXMvUlBDTGl0U2VydmljZSIvPg0KLQ0KLSAgICAgIDwvd3NkbDpwb3J0Pg0KLQ0KLSAgIDwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L1JQQ0xpdEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvUlBDTGl0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmI2NmRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvUlBDTGl0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaS5SUENGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQuc2VpLlJQQ0xpdDsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkucnBjbGl0LkNvbXBsZXhBbGw7DQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LnJwY2xpdC5FbnVtOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLQ0KLS8qKg0KLSAqIA0KLSAqDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IlJQQ0xpdFNlcnZpY2UiLA0KLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiLA0KLQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaS5SUENMaXQiKQ0KLXB1YmxpYyBjbGFzcyBSUENMaXRJbXBsIGltcGxlbWVudHMgUlBDTGl0IHsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBEYXRhdHlwZUZhY3RvcnkgZGYgOw0KLSAgICBwdWJsaWMgc3RhdGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGJkYXk7DQotICAgIHB1YmxpYyBzdGF0aWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgaG9saWRheTsNCi0gICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGJpZ0ludDEgPSBuZXcgQmlnSW50ZWdlcigiMSIpOw0KLSAgICBwdWJsaWMgc3RhdGljIEJpZ0ludGVnZXIgYmlnSW50MiA9IG5ldyBCaWdJbnRlZ2VyKCIyIik7DQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgcW5hbWUxID0gbmV3IFFOYW1lKCJ1cm46Ly9zYW1wbGUiLCAiaGVsbG8iICk7DQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgcW5hbWUyID0gbmV3IFFOYW1lKCJ1cm46Ly9zYW1wbGUiLCAid29ybGQiICk7DQotICAgIA0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZiA9IERhdGF0eXBlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIGJkYXkgPSBkZi5uZXdYTUxHcmVnb3JpYW5DYWxlbmRhckRhdGUoMTk2NCwgMTIsIDMsICBEYXRhdHlwZUNvbnN0YW50cy5GSUVMRF9VTkRFRklORUQpOw0KLSAgICAgICAgICAgIGhvbGlkYXkgPSBiZGF5ID0gZGYubmV3WE1MR3JlZ29yaWFuQ2FsZW5kYXJEYXRlKDIwMDcsIDEsIDEsICBEYXRhdHlwZUNvbnN0YW50cy5GSUVMRF9VTkRFRklORUQpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEVjaG8gdGhlIGlucHV0DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RTaW1wbGUoU3RyaW5nIHNpbXBsZUluKSB7DQotICAgICAgICBhc3NlcnRUcnVlKHNpbXBsZUluICE9IG51bGwpOyAgLy8gQWNjb3JkaW5nIHRvIEpBWC1XUyBhbiBSUEMgc2VydmljZSBzaG91bGQgbmV2ZXIgcmVjZWl2ZSBhIG51bGwNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGVzdCB0byBlbnN1cmUgdGhhdCByZXR1cm5pbmcgbnVsbCBjYXVzZXMgdGhlIHByb3BlciBleGNlcHRpb24gDQotICAgICAgICBpZiAoc2ltcGxlSW4uY29udGFpbnMoInJldHVybk51bGwiKSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHNpbXBsZUluOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRWNobyB0aGUgaW5wdXQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFNpbXBsZTIoU3RyaW5nIHNpbXBsZTJJbjEsIFN0cmluZyBzaW1wbGUySW4yKSB7DQotICAgICAgICByZXR1cm4gc2ltcGxlMkluMSArIHNpbXBsZTJJbjI7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBRTmFtZVtdIHRlc3RMaXN0cygNCi0gICAgICAgICAgICBRTmFtZVtdIHFOYW1lcywNCi0gICAgICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhcltdIGNhbGVuZGFycywNCi0gICAgICAgICAgICBTdHJpbmdbXSB0ZXh0cywNCi0gICAgICAgICAgICBCaWdJbnRlZ2VyW10gYmlnSW50cywNCi0gICAgICAgICAgICBMb25nW10gbG9uZ3MsDQotICAgICAgICAgICAgRW51bVtdIGVudW1zLA0KLSAgICAgICAgICAgIFN0cmluZ1tdIHRleHQyLA0KLSAgICAgICAgICAgIENvbXBsZXhBbGwgYWxsKSB7DQotICAgICAgICBhc3NlcnRUcnVlKHFOYW1lcy5sZW5ndGg9PTIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXNbMF0uZXF1YWxzKHFuYW1lMSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShxTmFtZXNbMV0uZXF1YWxzKHFuYW1lMikpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcU5hbWVzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBYTUxHcmVnb3JpYW5DYWxlbmRhcltdIHRlc3RDYWxlbmRhckxpc3QxKFhNTEdyZWdvcmlhbkNhbGVuZGFyW10gY2Fscykgew0KLSAgICAgICBhc3NlcnRUcnVlKGNhbHMubGVuZ3RoID09IDIpOw0KLSAgICAgICBhc3NlcnRUcnVlKGNhbHNbMF0uY29tcGFyZShiZGF5KSA9PSAwKTsNCi0gICAgICAgYXNzZXJ0VHJ1ZShjYWxzWzFdLmNvbXBhcmUoaG9saWRheSkgPT0gMCk7DQotICAgICAgIHJldHVybiBjYWxzOw0KLSAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gdGVzdFN0cmluZ0xpc3QyKFN0cmluZ1tdIGFyZzIwKSB7DQotDQotICAgICAgICBhc3NlcnRUcnVlKGFyZzIwLmxlbmd0aD09Mik7DQotICAgICAgICBhc3NlcnRUcnVlKGFyZzIwWzBdLmVxdWFscygiSGVsbG8iKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGFyZzIwWzFdLmVxdWFscygiV29ybGQiKSk7DQotICAgICAgICByZXR1cm4gYXJnMjA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpZ0ludGVnZXJbXSB0ZXN0QmlnSW50ZWdlckxpc3QzKEJpZ0ludGVnZXJbXSBhcmczMCkgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmczMC5sZW5ndGg9PTIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmczMFswXS5jb21wYXJlVG8oYmlnSW50MSkgPT0gMCk7DQotICAgICAgICBhc3NlcnRUcnVlKGFyZzMwWzFdLmNvbXBhcmVUbyhiaWdJbnQyKSA9PSAwKTsNCi0gICAgICAgIHJldHVybiBhcmczMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTG9uZ1tdIHRlc3RMb25nTGlzdDQoTG9uZ1tdIGxvbmdzKSB7DQotICAgICAgICBhc3NlcnRUcnVlKGxvbmdzLmxlbmd0aD09Myk7DQotICAgICAgICBhc3NlcnRUcnVlKGxvbmdzWzBdID09IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShsb25nc1sxXSA9PSAxKTsNCi0gICAgICAgIGFzc2VydFRydWUobG9uZ3NbMl0gPT0gMik7DQotICAgICAgICByZXR1cm4gbG9uZ3M7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVudW1bXSB0ZXN0RW51bUxpc3Q1KEVudW1bXSBlbnVtcykgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtcy5sZW5ndGg9PTMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbnVtc1swXSA9PSBFbnVtLk9ORSk7DQotICAgICAgICBhc3NlcnRUcnVlKGVudW1zWzFdID09IEVudW0uVFdPKTsNCi0gICAgICAgIGFzc2VydFRydWUoZW51bXNbMl0gPT0gRW51bS5USFJFRSk7DQotICAgICAgICByZXR1cm4gZW51bXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENvbXBsZXhBbGwgdGVzdENvbXBsZXhBbGw2KENvbXBsZXhBbGwgYXJnNjApIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nW10gdGVzdEVudW1MaXN0NyhTdHJpbmdbXSBhcmc3MCkgew0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmc3MC5sZW5ndGg9PTIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmc3MFswXS5lcXVhbHMoIkFwcGxlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhcmc3MFswXS5lcXVhbHMoIk9yYW5nZSIpKTsNCi0gICAgICAgIHJldHVybiBhcmc3MDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VHJ1ZShib29sZWFuIHZhbHVlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoIXZhbHVlKSB7DQotICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiByZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgRkFJTFVSRT0iICsgcmUpOw0KLSAgICAgICAgICAgIHRocm93IHJlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdEhlYWRlcihTdHJpbmcgYm9keVBhcmFtLCBTdHJpbmcgaGVhZGVyUGFyYW0pIHsNCi0gICAgICAgIHJldHVybiBib2R5UGFyYW0gKyBoZWFkZXJQYXJhbTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHQoKSB0aHJvd3MgUlBDRmF1bHQgew0KLSAgICAgICAgdGhyb3cgbmV3IFJQQ0ZhdWx0KCJUaHJvdyBSUENGYXVsdCIsIDEyMyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0ZXN0U2ltcGxlSW5PdXQoSG9sZGVyPFN0cmluZz4gc2ltcGxlSW5PdXQpIHsNCi0gICAgICAgIHJldHVybiBzaW1wbGVJbk91dC52YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L3NlaS9SUENGYXVsdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0ZmMxNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0L3NlaS9SUENGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotQFdlYkZhdWx0KG5hbWUgPSAibXlGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQiKQ0KLXB1YmxpYyBjbGFzcyBSUENGYXVsdCBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotICAgIHByaXZhdGUgaW50IGZhdWx0SW5mbzsNCi0gICAgcHVibGljIFJQQ0ZhdWx0KCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUlBDRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIGludCBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0ZhdWx0KFN0cmluZyBtZXNzYWdlLCBpbnQgZmF1bHRJbmZvLFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0xpdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDTGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWRiZTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDTGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQuc2VpOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5ycGNsaXQuQ29tcGxleEFsbDsNCi1pbXBvcnQgb3JnLnRlc3QucHJveHkucnBjbGl0LkVudW07DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdDsNCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJSUENMaXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IikNCi1AU09BUEJpbmRpbmcoc3R5bGUgPSBTdHlsZS5SUEMpDQotcHVibGljIGludGVyZmFjZSBSUENMaXQgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBzaW1wbGVJbg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInNpbXBsZU91dCIsIHBhcnROYW1lID0gInNpbXBsZU91dCIpDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFNpbXBsZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInNpbXBsZUluIiwgcGFydE5hbWUgPSAic2ltcGxlSW4iKQ0KLSAgICAgICAgU3RyaW5nIHNpbXBsZUluKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHNpbXBsZUluT3V0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKiBURVNUUyBjb21iaW5hdGlvbiBvZiBvdXQgYW5kIHJldHVybiB2YWx1ZXMNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInNpbXBsZU91dCIsIHBhcnROYW1lID0gInNpbXBsZU91dCIpDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFNpbXBsZUluT3V0KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAic2ltcGxlSW5PdXQiLCBwYXJ0TmFtZSA9ICJzaW1wbGVJbk91dCIsIG1vZGU9TW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHNpbXBsZUluT3V0KTsNCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBzaW1wbGUySW4xDQotICAgICAqIEBwYXJhbSBzaW1wbGUySW4yDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAic2ltcGxlMk91dCIsIHBhcnROYW1lID0gInNpbXBsZTJPdXQiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RTaW1wbGUyKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAic2ltcGxlMkluMSIsIHBhcnROYW1lID0gInNpbXBsZUluMSIpDQotICAgICAgICBTdHJpbmcgc2ltcGxlMkluMSwgDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJzaW1wbGUySW4yIiwgcGFydE5hbWUgPSAic2ltcGxlMkluMiIpDQotICAgICAgICBTdHJpbmcgc2ltcGxlMkluMik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGJvZHlQYXJhbQ0KLSAgICAgKiBAcGFyYW0gaGVhZGVyUGFyYW0NCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJoZWFkZXJSZXR1cm4iLCBoZWFkZXI9dHJ1ZSkNCi0gICAgcHVibGljIFN0cmluZyB0ZXN0SGVhZGVyKA0KLSAgICAgICAgQFdlYlBhcmFtKHBhcnROYW1lID0gImJvZHlQYXJhbSIpDQotICAgICAgICBTdHJpbmcgYm9keVBhcmFtLCANCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImhlYWRlclBhcmFtIiwgaGVhZGVyPXRydWUpDQotICAgICAgICBTdHJpbmcgaGVhZGVyUGFyYW0pOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnNzANCi0gICAgICogQHBhcmFtIGFyZzAwDQotICAgICAqIEBwYXJhbSBhcmcxMA0KLSAgICAgKiBAcGFyYW0gYXJnMjANCi0gICAgICogQHBhcmFtIGFyZzMwDQotICAgICAqIEBwYXJhbSBhcmc0MA0KLSAgICAgKiBAcGFyYW0gYXJnNTANCi0gICAgICogQHBhcmFtIGFyZzYwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdDQotICAgICAqLw0KLSAgICBAWG1sTGlzdA0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJ0ZXN0TGlzdHNSZXR1cm4iLCBwYXJ0TmFtZSA9ICJ0ZXN0TGlzdHNSZXR1cm4iKQ0KLSAgICBwdWJsaWMgUU5hbWVbXSB0ZXN0TGlzdHMoDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzBfMCIsIHBhcnROYW1lID0gImFyZ18wXzAiKQ0KLSAgICAgICAgUU5hbWVbXSBhcmcwMCwNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfMV8wIiwgcGFydE5hbWUgPSAiYXJnXzFfMCIpDQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhcltdIGFyZzEwLA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ18yXzAiLCBwYXJ0TmFtZSA9ICJhcmdfMl8wIikNCi0gICAgICAgIFN0cmluZ1tdIGFyZzIwLA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ18zXzAiLCBwYXJ0TmFtZSA9ICJhcmdfM18wIikNCi0gICAgICAgIEJpZ0ludGVnZXJbXSBhcmczMCwNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfNF8wIiwgcGFydE5hbWUgPSAiYXJnXzRfMCIpDQotICAgICAgICBMb25nW10gYXJnNDAsDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzVfMCIsIHBhcnROYW1lID0gImFyZ181XzAiKQ0KLSAgICAgICAgRW51bVtdIGFyZzUwLA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ183XzAiLCBwYXJ0TmFtZSA9ICJhcmdfN18wIikNCi0gICAgICAgIFN0cmluZ1tdIGFyZzcwLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzZfMCIsIHBhcnROYW1lID0gImFyZ182XzAiKQ0KLSAgICAgICAgQ29tcGxleEFsbCBhcmc2MCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzEwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RDYWxlbmRhckxpc3QxUmV0dXJuIiwgcGFydE5hbWUgPSAidGVzdENhbGVuZGFyTGlzdDFSZXR1cm4iKQ0KLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXJbXSB0ZXN0Q2FsZW5kYXJMaXN0MSgNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfMV8wIiwgcGFydE5hbWUgPSAiYXJnXzFfMCIpDQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhcltdIGFyZzEwKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMjANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RTdHJpbmdMaXN0MlJldHVybiIsIHBhcnROYW1lID0gInRlc3RTdHJpbmdMaXN0MlJldHVybiIpDQotICAgIHB1YmxpYyBTdHJpbmdbXSB0ZXN0U3RyaW5nTGlzdDIoDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzJfMCIsIHBhcnROYW1lID0gImFyZ18yXzAiKQ0KLSAgICAgICAgU3RyaW5nW10gYXJnMjApOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmczMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubWF0aC5CaWdJbnRlZ2VyW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RCaWdJbnRlZ2VyTGlzdDNSZXR1cm4iLCBwYXJ0TmFtZSA9ICJ0ZXN0QmlnSW50ZWdlckxpc3QzUmV0dXJuIikNCi0gICAgcHVibGljIEJpZ0ludGVnZXJbXSB0ZXN0QmlnSW50ZWdlckxpc3QzKA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ18zXzAiLCBwYXJ0TmFtZSA9ICJhcmdfM18wIikNCi0gICAgICAgIEJpZ0ludGVnZXJbXSBhcmczMCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzQwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLkxvbmdbXQ0KLSAgICAgKi8NCi0gICAgQFhtbExpc3QNCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAidGVzdExvbmdMaXN0NFJldHVybiIsIHBhcnROYW1lID0gInRlc3RMb25nTGlzdDRSZXR1cm4iKQ0KLSAgICBwdWJsaWMgTG9uZ1tdIHRlc3RMb25nTGlzdDQoDQotICAgICAgICBAWG1sTGlzdA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzRfMCIsIHBhcnROYW1lID0gImFyZ180XzAiKQ0KLSAgICAgICAgTG9uZ1tdIGFyZzQwKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnNTANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdC5FbnVtW10NCi0gICAgICovDQotICAgIEBYbWxMaXN0DQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInRlc3RFbnVtTGlzdDVSZXR1cm4iLCBwYXJ0TmFtZSA9ICJ0ZXN0RW51bUxpc3Q1UmV0dXJuIikNCi0gICAgcHVibGljIEVudW1bXSB0ZXN0RW51bUxpc3Q1KA0KLSAgICAgICAgQFhtbExpc3QNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZ181XzAiLCBwYXJ0TmFtZSA9ICJhcmdfNV8wIikNCi0gICAgICAgIEVudW1bXSBhcmc1MCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzYwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXQuQ29tcGxleEFsbA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAidGVzdENvbXBsZXhBbGw2UmV0dXJuIiwgcGFydE5hbWUgPSAidGVzdENvbXBsZXhBbGw2UmV0dXJuIikNCi0gICAgcHVibGljIENvbXBsZXhBbGwgdGVzdENvbXBsZXhBbGw2KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnXzZfMCIsIHBhcnROYW1lID0gImFyZ182XzAiKQ0KLSAgICAgICAgQ29tcGxleEFsbCBhcmc2MCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmc3MA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmdbXQ0KLSAgICAgKi8NCi0gICAgQFhtbExpc3QNCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAidGVzdEVudW1MaXN0N1JldHVybiIsIHBhcnROYW1lID0gInRlc3RFbnVtTGlzdDdSZXR1cm4iKQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gdGVzdEVudW1MaXN0NygNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmdfN18wIiwgcGFydE5hbWUgPSAiYXJnXzdfMCIpDQotICAgICAgICBTdHJpbmdbXSBhcmc3MCk7DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyBGYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPSJ0ZXN0RmF1bHQiLCBhY3Rpb249InRlc3RGYXVsdCIpDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdCgpIHRocm93cyBSUENGYXVsdDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDTGl0U2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdC9zZWkvUlBDTGl0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI1MGFiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXQvc2VpL1JQQ0xpdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0LnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlJQQ0xpdFNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0Iiwgd3NkbExvY2F0aW9uID0gIlJQQ0xpdC53c2RsIikNCi1wdWJsaWMgY2xhc3MgUlBDTGl0U2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBSUENMSVRTRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovQzovcnBjdGVzdC9zYW1wbGUvUlBDTGl0LndzZGwiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFJQQ0xJVFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUlBDTGl0U2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0xpdFNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihSUENMSVRTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiwgIlJQQ0xpdFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFJQQ0xpdA0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUlBDTGl0IikNCi0gICAgcHVibGljIFJQQ0xpdCBnZXRSUENMaXQoKSB7DQotICAgICAgICByZXR1cm4gKFJQQ0xpdClzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0IiwgIlJQQ0xpdCIpLCBSUENMaXQuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL01FVEEtSU5GL1JQQ0xpdFNXQS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9NRVRBLUlORi9SUENMaXRTV0Eud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1NmYwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL01FVEEtSU5GL1JQQ0xpdFNXQS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiIA0KLXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQoteG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiANCi14bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiIA0KLXhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIgDQoteG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLXhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi14bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIg0KLXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1JlcXVlc3QiPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50SU4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJkdW1teUF0dGFjaG1lbnRJTk9VVCIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIgLz4NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZSI+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZHVtbXlBdHRhY2htZW50SU5PVVQiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiIC8+DQotICAgICAgPHdzZGw6cGFydCBuYW1lPSJkdW1teUF0dGFjaG1lbnRPVVQiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0NCi0gICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJSUENMaXRTV0EiPg0KLSAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLQ0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6ZWNob1JlcXVlc3QiIG5hbWU9ImVjaG9SZXF1ZXN0Ii8+DQotDQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6ZWNob1Jlc3BvbnNlIiBuYW1lPSJlY2hvUmVzcG9uc2UiLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgICAgDQotICAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iUlBDTGl0U1dBU29hcEJpbmRpbmciIHR5cGU9ImltcGw6UlBDTGl0U1dBIj4NCi0NCi0gICAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uLz4NCi0gICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icmVxdWVzdCIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIvPiANCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRJTiIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImR1bW15QXR0YWNobWVudElOT1VUIiB0eXBlPSJpbWFnZS9qcGVnIi8+DQotICAgICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InJlc3BvbnNlIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiAgLz4NCi0gICAgICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJkdW1teUF0dGFjaG1lbnRJTk9VVCIgdHlwZT0iaW1hZ2UvanBlZyIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImR1bW15QXR0YWNobWVudE9VVCIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICA8L3dzZGw6YmluZGluZz4NCi0NCi0gICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJQQ0xpdFNXQVNlcnZpY2UiPg0KLQ0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpSUENMaXRTV0FTb2FwQmluZGluZyIgbmFtZT0iUlBDTGl0U1dBIj4NCi0NCi0gICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL2F4aXMyL3NlcnZpY2VzL1JQQ0xpdFNXQVNlcnZpY2UiLz4NCi0NCi0gICAgICA8L3dzZGw6cG9ydD4NCi0NCi0gICA8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9SUENMaXRTV0FJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL1JQQ0xpdFNXQUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxYjM2YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL1JQQ0xpdFNXQUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0c3dhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnJwY2xpdHN3YS5zZWkuUlBDTGl0U1dBOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi1AV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIsDQotICAgICAgICAgICAgc2VydmljZU5hbWU9IlJQQ0xpdFNXQVNlcnZpY2UiLCANCi0gICAgICAgICAgICBwb3J0TmFtZT0iUlBDTGl0U1dBIiwNCi0gICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXRzd2Euc2VpLlJQQ0xpdFNXQSIpDQotcHVibGljIGNsYXNzIFJQQ0xpdFNXQUltcGwgaW1wbGVtZW50cyBSUENMaXRTV0Egew0KLQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKFN0cmluZyByZXF1ZXN0LCBTdHJpbmcgZHVtbXlBdHRhY2htZW50SU4sDQotICAgICAgICAgICAgSG9sZGVyPERhdGFIYW5kbGVyPiBkdW1teUF0dGFjaG1lbnRJTk9VVCwgSG9sZGVyPFN0cmluZz4gcmVzcG9uc2UsDQotICAgICAgICAgICAgSG9sZGVyPFN0cmluZz4gZHVtbXlBdHRhY2htZW50T1VUKSB7DQotICAgICAgICByZXNwb25zZS52YWx1ZSA9IHJlcXVlc3Q7DQotICAgICAgICBkdW1teUF0dGFjaG1lbnRPVVQudmFsdWUgPSBkdW1teUF0dGFjaG1lbnRJTjsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhL3NlaS9SUENMaXRTV0EuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2Evc2VpL1JQQ0xpdFNXQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTA3MDZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2Evc2VpL1JQQ0xpdFNXQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5ycGNsaXRzd2Euc2VpOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIlJQQ0xpdFNXQSIsIA0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YSIsIA0KLQkJd3NkbExvY2F0aW9uID0gIk1FVEEtSU5GL1JQQ0xpdFNXQS53c2RsIikNCi1AU09BUEJpbmRpbmcoc3R5bGUgPSBTdHlsZS5SUEMpDQotcHVibGljIGludGVyZmFjZSBSUENMaXRTV0Egew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkdW1teUF0dGFjaG1lbnRJTk9VVA0KLSAgICAgKiBAcGFyYW0gZHVtbXlBdHRhY2htZW50T1VUDQotICAgICAqIEBwYXJhbSByZXNwb25zZQ0KLSAgICAgKiBAcGFyYW0gZHVtbXlBdHRhY2htZW50SU4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgcHVibGljIHZvaWQgZWNobygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCBwYXJ0TmFtZSA9ICJyZXF1ZXN0IikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZHVtbXlBdHRhY2htZW50SU4iLCBwYXJ0TmFtZSA9ICJkdW1teUF0dGFjaG1lbnRJTiIpDQotICAgICAgICBTdHJpbmcgZHVtbXlBdHRhY2htZW50SU4sDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJkdW1teUF0dGFjaG1lbnRJTk9VVCIsIG1vZGUgPSBNb2RlLklOT1VULCBwYXJ0TmFtZSA9ICJkdW1teUF0dGFjaG1lbnRJTk9VVCIpDQotICAgICAgICBIb2xkZXI8RGF0YUhhbmRsZXI+IGR1bW15QXR0YWNobWVudElOT1VULA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVzcG9uc2UiLCBtb2RlID0gTW9kZS5PVVQsIHBhcnROYW1lID0gInJlc3BvbnNlIikNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHJlc3BvbnNlLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZHVtbXlBdHRhY2htZW50T1VUIiwgbW9kZSA9IE1vZGUuT1VULCBwYXJ0TmFtZSA9ICJkdW1teUF0dGFjaG1lbnRPVVQiKQ0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gZHVtbXlBdHRhY2htZW50T1VUKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9zZWkvUlBDTGl0U1dBU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3JwY2xpdHN3YS9zZWkvUlBDTGl0U1dBU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWUzNjY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2Evc2VpL1JQQ0xpdFNXQVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkucnBjbGl0c3dhLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlJQQ0xpdFNXQVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvcnBjbGl0c3dhIiwgd3NkbExvY2F0aW9uID0gInJwY2xpdHN3YS53c2RsIikNCi1wdWJsaWMgY2xhc3MgUlBDTGl0U1dBU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBSUENMSVRTV0FFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9DOi9kZWZlY3RzL3JwY2xpdHN3YS53c2RsIik7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBSUENMSVRTV0FFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUlBDTGl0U1dBU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJQQ0xpdFNXQVNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihSUENMSVRTV0FFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLCAiUlBDTGl0U1dBU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgUlBDTGl0U1dBDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJSUENMaXRTV0EiKQ0KLSAgICBwdWJsaWMgUlBDTGl0U1dBIGdldFJQQ0xpdFNXQSgpIHsNCi0gICAgICAgIHJldHVybiAoUlBDTGl0U1dBKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9ycGNsaXRzd2EiLCAiUlBDTGl0U1dBIiksIFJQQ0xpdFNXQS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9FY2hvLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5ZmUxZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuc29hcDEyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIpDQotcHVibGljIGludGVyZmFjZSBFY2hvIHsNCi0NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnNvYXAxMi5FY2hvVHlwZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm94eS5zb2FwMTIuRWNob1Jlc3BvbnNlVHlwZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNobygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9TT0FQMTJFY2hvU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9TT0FQMTJFY2hvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmEwMzc2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvU09BUDEyRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJveHkuc29hcDEyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlNPQVAxMkVjaG9TZXJ2aWNlIiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIiwgDQotICAgICAgICB3c2RsTG9jYXRpb24gPSAiU09BUDEyRWNoby53c2RsIikNCi1wdWJsaWMgY2xhc3MgU09BUDEyRWNob1NlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICANCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFNPQVAxMkVDSE9TRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvc2VydmVyL01FVEEtSU5GL1NPQVAxMkVjaG8ud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciAgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU09BUDEyRUNIT1NFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU09BUDEyRWNob1NlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTT0FQMTJFY2hvU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFNPQVAxMkVDSE9TRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIiwgIlNPQVAxMkVjaG9TZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9Qb3J0IikNCi0gICAgcHVibGljIEVjaG8gZ2V0RWNob1BvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEVjaG8pc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIsICJFY2hvUG9ydCIpLCBFY2hvLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL3NlcnZlci9NRVRBLUlORi9TT0FQMTJFY2hvLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJveHkvc29hcDEyL3NlcnZlci9NRVRBLUlORi9TT0FQMTJFY2hvLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MzExMmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9zZXJ2ZXIvTUVUQS1JTkYvU09BUDEyRWNoby53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiDQotICAgICAgeG1sbnM6dG5zPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9wcm94eS9zb2FwMTIiDQotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiANCi0gICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI+DQotDQotICAgPHR5cGVzPg0KLSAgICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvcHJveHkvc29hcDEyIg0KLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotDQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9UeXBlIj4NCi0gICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0NCi0gICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlVHlwZSI+DQotICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLQ0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG8iIHR5cGU9InRuczplY2hvVHlwZSIvPg0KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4NCi0NCi0gICAgICA8L3hzZDpzY2hlbWE+DQotICAgPC90eXBlcz4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvIj4NCi0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPg0KLSAgIDwvbWVzc2FnZT4NCi0NCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvUmVzcG9uc2UiLz4NCi0gICA8L21lc3NhZ2U+DQotDQotICAgPHBvcnRUeXBlIG5hbWU9IkVjaG8iPg0KLSAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+DQotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPg0KLSAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgLz4NCi0gICAgICA8L29wZXJhdGlvbj4NCi0gICA8L3BvcnRUeXBlPg0KLQ0KLSAgIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNobyI+DQotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4NCi0gICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgICAgPGlucHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9pbnB1dD4NCi0NCi0gICAgICAgICA8b3V0cHV0Pg0KLSAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgPC9vdXRwdXQ+DQotICAgICAgPC9vcGVyYXRpb24+DQotICAgPC9iaW5kaW5nPg0KLQ0KLSAgIDxzZXJ2aWNlIG5hbWU9IlNPQVAxMkVjaG9TZXJ2aWNlIj4NCi0gICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU09BUDEyRWNob1NlcnZpY2UiLz4NCi0gICAgICA8L3BvcnQ+DQotICAgPC9zZXJ2aWNlPg0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9zZXJ2ZXIvU09BUDEyRWNob0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm94eS9zb2FwMTIvc2VydmVyL1NPQVAxMkVjaG9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWQ2YTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3h5L3NvYXAxMi9zZXJ2ZXIvU09BUDEyRWNob0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LnNvYXAxMi5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotQFdlYlNlcnZpY2VQcm92aWRlcih0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMiIsDQotCQkJCQlzZXJ2aWNlTmFtZT0iU09BUDEyRWNob1NlcnZpY2UiLA0KLQkJCQkJd3NkbExvY2F0aW9uPSJNRVRBLUlORi9TT0FQMTJFY2hvLndzZGwiLA0KLQkJCQkJcG9ydE5hbWU9IkVjaG9Qb3J0IikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZShNb2RlLk1FU1NBR0UpDQotcHVibGljIGNsYXNzIFNPQVAxMkVjaG9JbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VORF9TT0FQMTFfUkVTUE9OU0UgPSAiUkVTUE9OU0UtU09BUDExIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRfU09BUDEyX1JFU1BPTlNFID0gIlJFU1BPTlNFLVNPQVAxMiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WRUxPUEVfSEVBRCA9IA0KLSAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+IiArIA0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgU09BUDExX05TX1VSSSArICJcIj4iICsNCi0gICAgICAgICI8c29hcGVudjpIZWFkZXIgLz4iICsgDQotICAgICAgICAiPHNvYXBlbnY6Qm9keT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX0hFQUQgPSANCi0gICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiIgKyANCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIFNPQVAxMl9OU19VUkkgKyAiXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLSAgICAgICAgIjxzb2FwZW52OkJvZHk+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMV9FTlZFTE9QRV9UQUlMID0gDQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArIA0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVkVMT1BFX1RBSUwgPSANCi0gICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsgDQotICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7DQotICAgICAgICANCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygicmVjZWl2ZWQgcmVxdWVzdCBbIiArIGlucHV0ICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gY2hlY2sgdGhlIHJlcXVlc3QgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoZSBTT0FQIDEuMSBuYW1lc3BhY2UgDQotICAgICAgICAvLyBVUkkuICBpZiBzbywgdGhlbiB0aGF0IGlzIGFuIGVycm9yIGFuZCB3ZSBzaG91bGQgcmVzcG9uZCB3aXRoIA0KLSAgICAgICAgLy8gYSBmYWlsdXJlLg0KLSAgICAgICAgU3RyaW5nIHN0YXR1cyA9ICJGQUlMIjsNCi0gICAgICAgIGlmIChpbnB1dC5pbmRleE9mKFNPQVAxMl9OU19VUkkpID4gMCkgew0KLSAgICAgICAgICAgIHN0YXR1cyA9ICJQQVNTIjsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGhlIHJlcXVlc3QgY29udGFpbnMgdGhlIFNPQVAgMS4yIG5hbWVzcGFjZSBhcyBleHBlY3RlZC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0aGUgcmVxdWVzdCBkaWQgTk9UIGNvbnRhaW4gdGhlIFNPQVAgMS4yIG5hbWVzcGFjZS4iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zygic2VuZGluZyBiYWNrIGEgZmFpbHVyZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyB0aGUgY29udGVudHMgb2YgdGhlIHJlc3BvbnNlIHNob3VsZCBjb250YWluIHRoZSBzdGF0dXMNCi0gICAgICAgIFN0cmluZyByZXNwb25zZUJvZHkgPSAgICAgICAgICAgICANCi0gICAgICAgICAgICAiPGVjaG9SZXNwb25zZSB4bWxucz1cImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL3Byb3h5L3NvYXAxMlwiPiIgKw0KLSAgICAgICAgICAgICI8cmVzcG9uc2U+IiArIHN0YXR1cyArICI8L3Jlc3BvbnNlPiIgKw0KLSAgICAgICAgICAgICI8L2VjaG9SZXNwb25zZT4iOyANCi0gICAgICAgIA0KLSAgICAgICAgLy8gYnVpbGQgdXAgdGhlIGFwcHJvcHJpYXRlIGVudmVsb3BlIHR5cGUgZm9yIHRoZSByZXNwb25zZQ0KLSAgICAgICAgLy8gYmFzZWQgb24gd2hhdCB3YXMgdGhlIGNsaWVudCByZXF1ZXN0ZWQuDQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzcG9uc2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICBpZiAoaW5wdXQuaW5kZXhPZihTRU5EX1NPQVAxMV9SRVNQT05TRSkgPiAwKSB7DQotICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKFNPQVAxMV9FTlZFTE9QRV9IRUFEKTsNCi0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQocmVzcG9uc2VCb2R5KTsNCi0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoU09BUDExX0VOVkVMT1BFX1RBSUwpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoaW5wdXQuaW5kZXhPZihTRU5EX1NPQVAxMl9SRVNQT05TRSkgPiAwKSB7DQotICAgICAgICAgICAgcmVzcG9uc2UuYXBwZW5kKFNPQVAxMl9FTlZFTE9QRV9IRUFEKTsNCi0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQocmVzcG9uc2VCb2R5KTsNCi0gICAgICAgICAgICByZXNwb25zZS5hcHBlbmQoU09BUDEyX0VOVkVMT1BFX1RBSUwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInNlbmRpbmcgcmVzcG9uc2UgWyIgKyByZXNwb25zZSArICJdIik7DQotICAgICAgICByZXR1cm4gcmVzcG9uc2UudG9TdHJpbmcoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL01FVEEtSU5GL3JwY2xpdGVudW0ud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvTUVUQS1JTkYvcnBjbGl0ZW51bS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2I0ZjY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvTUVUQS1JTkYvcnBjbGl0ZW51bS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ycGNsaXQudGVzdC5vcmciDQotICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICB4bWxuczp0bnM9Imh0dHA6Ly9ycGNsaXQudGVzdC5vcmciIA0KLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICB4bWxuczppbnRmPSJodHRwOi8vc2NoZW1hLnJwY2xpdC50ZXN0Lm9yZyIgDQotICB4bWxuczppbXBsPSJodHRwOi8vc2NoZW1hLnJwY2xpdC50ZXN0Lm9yZyIgDQotICB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIA0KLSAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0NCi0gIDx0eXBlcz4NCi0gICAgPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYS5ycGNsaXQudGVzdC5vcmciIA0KLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLSAgICAgIDwhLS0gPGVsZW1lbnQgbmFtZT0iZWxlbWVudFN0cmluZyI+IC0tPg0KLSAgICAgICAgPHNpbXBsZVR5cGUgbmFtZT0iZWxlbWVudFN0cmluZyI+DQotICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkEiLz4NCi0gICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkIiLz4NCi0gICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkMiLz4NCi0gICAgICAgICAgPC9yZXN0cmljdGlvbj4NCi0gICAgICAgIDwvc2ltcGxlVHlwZT4NCi0gICAgICA8IS0tIDwvZWxlbWVudD4gLS0+DQotICAgIDwvc2NoZW1hPg0KLSAgPC90eXBlcz4NCi0NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPg0KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBTdHJpbmciIHR5cGU9ImludGY6ZWxlbWVudFN0cmluZyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgbmFtZT0icFN0cmluZyIgdHlwZT0iaW50ZjplbGVtZW50U3RyaW5nIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlBvcnRUeXBlIj4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0IiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1JlcXVlc3QiLz4NCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotDQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkJpbmRpbmciIHR5cGU9InRuczpQb3J0VHlwZSI+DQotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4NCi0gICAgICAgIDx3c2Rsc29hcDpib2R5DQotICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyINCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkNCi0gICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIg0KLSAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOmJpbmRpbmc+DQotDQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlJQQ0xpdEVudW1TZXJ2aWNlIj4NCi0gICAgPHdzZGw6cG9ydCBuYW1lPSJQb3J0IiBiaW5kaW5nPSJ0bnM6QmluZGluZyI+DQotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRFbnVtU2VydmljZSIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLQ0KLSAgDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL1BvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJmYjY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZS5zZWkuUG9ydFR5cGU7DQotaW1wb3J0IG9yZy50ZXN0LnJwY2xpdC5zY2hlbWEuRWxlbWVudFN0cmluZzsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IlJQQ0xpdEVudW1TZXJ2aWNlIiwNCi0JCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZS5zZWkuUG9ydFR5cGUiKQ0KLXB1YmxpYyBjbGFzcyBQb3J0VHlwZUltcGwgaW1wbGVtZW50cyBQb3J0VHlwZSB7DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZS5zZWkuUG9ydFR5cGUjZWNob1N0cmluZyhqYXZheC54bWwud3MuSG9sZGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZWNob1N0cmluZyhIb2xkZXI8RWxlbWVudFN0cmluZz4gcFN0cmluZykgew0KLSAgICAgICBFbGVtZW50U3RyaW5nIGVzID0gcFN0cmluZy52YWx1ZTsNCi0gICAgICAgaWYoZXMgPT0gZXMuQSl7DQotICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRW51bSBBIik7DQotICAgICAgIH0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJyZXNldHRpbmcgRW51bSB0byBCIik7DQotICAgICAgIGVzID0gZXMuQjsNCi0gICAgICAgcFN0cmluZy52YWx1ZSA9IGVzOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvc2VpL1BvcnRUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3NlaS9Qb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgzZGQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvc2VpL1BvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZS5zZWk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnJwY2xpdC5zY2hlbWEuRWxlbWVudFN0cmluZzsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIikNCi1AU09BUEJpbmRpbmcoc3R5bGUgPSBTdHlsZS5SUEMpDQotcHVibGljIGludGVyZmFjZSBQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHBTdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgcHVibGljIHZvaWQgZWNob1N0cmluZygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBTdHJpbmciLCBtb2RlID0gTW9kZS5JTk9VVCwgcGFydE5hbWUgPSAicFN0cmluZyIpDQotICAgICAgICBIb2xkZXI8RWxlbWVudFN0cmluZz4gcFN0cmluZyk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvc2VpL1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvZW51bXR5cGUvc2VpL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3YTNjMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3NlaS9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5lbnVtdHlwZS5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiUlBDTGl0RW51bVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJzb2FwZW5jLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlDQotICAgIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBTRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL01FVEEtSU5GL3JwY2xpdGVudW0ud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vcnBjbGl0LnRlc3Qub3JnIiwgIlJQQ0xpdEVudW1TZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUG9ydCIpDQotICAgIHB1YmxpYyBQb3J0VHlwZSBnZXRQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3JwY2xpdC50ZXN0Lm9yZyIsICJQb3J0IiksIFBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3Rlc3RzL1JQQ0xpdEVudW1UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9lbnVtdHlwZS90ZXN0cy9SUENMaXRFbnVtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhOTRjZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L2VudW10eXBlL3Rlc3RzL1JQQ0xpdEVudW1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUudGVzdHM7DQotDQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LmVudW10eXBlLnNlaS5Qb3J0VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuZW51bXR5cGUuc2VpLlNlcnZpY2U7DQotaW1wb3J0IG9yZy50ZXN0LnJwY2xpdC5zY2hlbWEuRWxlbWVudFN0cmluZzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgUlBDTGl0RW51bVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLQlTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRFbnVtU2VydmljZS5Qb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFJQQ0xpdEVudW1UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFbnVtU2ltcGxlVHlwZSgpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZSgpOw0KLSAgICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gc2VydmljZS5nZXRQb3J0KCk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0VHlwZTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIEhvbGRlcjxFbGVtZW50U3RyaW5nPiBwU3RyaW5nID0gbmV3IEhvbGRlcjxFbGVtZW50U3RyaW5nPihFbGVtZW50U3RyaW5nLkEpOw0KLSAgICAgICAgICAgIHBvcnRUeXBlLmVjaG9TdHJpbmcocFN0cmluZyk7DQotICAgICAgICAgICAgRWxlbWVudFN0cmluZyBlcyA9IHBTdHJpbmcudmFsdWU7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0iICsgZXMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICAgICAgcFN0cmluZyA9IG5ldyBIb2xkZXI8RWxlbWVudFN0cmluZz4oRWxlbWVudFN0cmluZy5BKTsNCi0gICAgICAgICAgICBwb3J0VHlwZS5lY2hvU3RyaW5nKHBTdHJpbmcpOw0KLSAgICAgICAgICAgIGVzID0gcFN0cmluZy52YWx1ZTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSIgKyBlcyk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvRWNob0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvRWNob0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyNTc1Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L0VjaG9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5zdHJpbmdhcnJheTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucnBjbGl0LnN0cmluZ2FycmF5LlN0cmluZ0FycmF5Ow0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIiwNCi0JCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXkuc2VpLkVjaG8iKQ0KLXB1YmxpYyBjbGFzcyBFY2hvSW1wbCB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgYXJnMCkgew0KLSAgICAJcmV0dXJuIGFyZzA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ0FycmF5IGVjaG9TdHJpbmdBcnJheShTdHJpbmdBcnJheSBhcmcwKXsNCi0gICAgICAgIGlmKGFyZzAgPT0gbnVsbCl7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCBudWxsIHBhcmFtZXRlciIpOw0KLSAgICAgICAgfWVsc2V7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCBpbnB1dCBwYXJhbWV0ZXIgc3RyaW5nQXJyYXkgPSIrYXJnMC50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGFyZzA7DQotICAgIH0NCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9FY2hvSW1wbE5vU0VJLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L0VjaG9JbXBsTm9TRUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxYjQwYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L0VjaG9JbXBsTm9TRUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9Ob1NFSSIsIHNlcnZpY2VOYW1lPSJSUENMaXRTdHJpbmdBcnJheVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlaS5zdHJpbmdhcnJheS5ycGNsaXQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi1AU09BUEJpbmRpbmcoc3R5bGUgPSBTdHlsZS5SUEMpCi1wdWJsaWMgY2xhc3MgRWNob0ltcGxOb1NFSSB7Ci0KLSAgICBAV2ViTWV0aG9kCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBhcmcwKSB7Ci0gICAgCXJldHVybiBhcmcwOwotICAgIH0KLQotICAgQFdlYk1ldGhvZAotICAgIHB1YmxpYyBTdHJpbmdbXSBlY2hvU3RyaW5nQXJyYXkoU3RyaW5nIFtdIGFyZ3MpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhcmdzW2ldID0gYXJnc1tpXSArICJyZXR1cm4iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcmdzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9NRVRBLUlORi9ycGNsaXRzdHJpbmdhcnJheS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9NRVRBLUlORi9ycGNsaXRzdHJpbmdhcnJheS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWJhMWQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvTUVUQS1JTkYvcnBjbGl0c3RyaW5nYXJyYXkud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIG5hbWU9IkVjaG9TZXJ2aWNlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3NlaS5zdHJpbmdhcnJheS5ycGNsaXQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgeG1sbnM6bnMxPSAiaHR0cDovL3N0cmluZ2FycmF5LnJwY2xpdC50ZXN0Lm9yZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4NCi0gIDx0eXBlcz4NCi0gICAgPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCXRhcmdldE5hbWVzcGFjZT0gImh0dHA6Ly9zdHJpbmdhcnJheS5ycGNsaXQudGVzdC5vcmciPg0KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyaW5nQXJyYXkiIGZpbmFsPSIjYWxsIj4NCi0JCTx4c2Q6c2VxdWVuY2U+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9Iml0ZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIj48L3hzZDplbGVtZW50Pg0KLQkJPC94c2Q6c2VxdWVuY2U+DQotCSAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPg0KLSAgICA8cGFydCBuYW1lPSJhcmcwIiB0eXBlPSJuczE6c3RyaW5nQXJyYXkiPg0KLSAgICA8L3BhcnQ+DQotDQotICA8L21lc3NhZ2U+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ibnMxOnN0cmluZ0FycmF5Ij4NCi0gICAgPC9wYXJ0Pg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIj4NCi0gICAgPC9wYXJ0Pg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZyI+DQotICAgIDxwYXJ0IG5hbWU9ImFyZzAiIHR5cGU9InhzZDpzdHJpbmciPg0KLSAgICA8L3BhcnQ+DQotICA8L21lc3NhZ2U+DQotICA8cG9ydFR5cGUgbmFtZT0iRWNobyI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyIgcGFyYW1ldGVyT3JkZXI9ImFyZzAiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZyI+DQotICAgIDwvaW5wdXQ+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIj4NCi0NCi0gICAgPC9vdXRwdXQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImFyZzAiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5Ij4NCi0gICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+DQotICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvcG9ydFR5cGU+DQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvUG9ydEJpbmRpbmciIHR5cGU9InRuczpFY2hvIj4NCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vc3RyaW5nYXJyYXkucnBjbGl0LnRlc3Qub3JnIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3N0cmluZ2FycmF5LnJwY2xpdC50ZXN0Lm9yZyIvPg0KLQ0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJlY2hvU3RyaW5nQXJyYXkiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vc3RyaW5nYXJyYXkucnBjbGl0LnRlc3Qub3JnIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3N0cmluZ2FycmF5LnJwY2xpdC50ZXN0Lm9yZyIvPg0KLQ0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0gIDxzZXJ2aWNlIG5hbWU9IlJQQ0xpdFN0cmluZ0FycmF5U2VydmljZSI+DQotICAgIDxwb3J0IG5hbWU9IkVjaG9Qb3J0IiBiaW5kaW5nPSJ0bnM6RWNob1BvcnRCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvc2VpL0VjaG8uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvc2VpL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0MTAwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3NlaS9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5zdHJpbmdhcnJheS5zZWk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnJwY2xpdC5zdHJpbmdhcnJheS5TdHJpbmdBcnJheTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG8iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlaS5zdHJpbmdhcnJheS5ycGNsaXQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotQFNPQVBCaW5kaW5nKHN0eWxlID0gU3R5bGUuUlBDKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRWNobyB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQocGFydE5hbWUgPSAicmV0dXJuIikNCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHBhcnROYW1lID0gImFyZzAiKQ0KLSAgICAgICAgU3RyaW5nIGFyZzApOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLnRlc3QucnBjbGl0LnN0cmluZ2FycmF5LlN0cmluZ0FycmF5DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQocGFydE5hbWUgPSAicmV0dXJuIikNCi0gICAgcHVibGljIFN0cmluZ0FycmF5IGVjaG9TdHJpbmdBcnJheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCBwYXJ0TmFtZSA9ICJhcmcwIikNCi0gICAgICAgIFN0cmluZ0FycmF5IGFyZzApOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3NlaS9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvc2VpL1JQQ0xpdFN0cmluZ0FycmF5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg5ZjZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ycGNsaXQvc3RyaW5nYXJyYXkvc2VpL1JQQ0xpdFN0cmluZ0FycmF5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ycGNsaXQuc3RyaW5nYXJyYXkuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJSUENMaXRTdHJpbmdBcnJheVNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlaS5zdHJpbmdhcnJheS5ycGNsaXQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJlY2hvc2VydmljZS53c2RsIikNCi1wdWJsaWMgY2xhc3MgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFJQQ0xJVFNUUklOR0FSUkFZU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uID0NCi0gICAgICAgICIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS9NRVRBLUlORi9ycGNsaXRzdHJpbmdhcnJheS53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBSUENMSVRTVFJJTkdBUlJBWVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoUlBDTElUU1RSSU5HQVJSQVlTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL3NlaS5zdHJpbmdhcnJheS5ycGNsaXQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJSUENMaXRTdHJpbmdBcnJheVNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEVjaG8NCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9Qb3J0IikNCi0gICAgcHVibGljIEVjaG8gZ2V0RWNob1BvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEVjaG8pc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9zZWkuc3RyaW5nYXJyYXkucnBjbGl0LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiRWNob1BvcnQiKSwgRWNoby5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JwY2xpdC9zdHJpbmdhcnJheS90ZXN0cy9SUENMaXRTdHJpbmdBcnJheVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3Rlc3RzL1JQQ0xpdFN0cmluZ0FycmF5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzMzA3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnBjbGl0L3N0cmluZ2FycmF5L3Rlc3RzL1JQQ0xpdFN0cmluZ0FycmF5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5zdHJpbmdhcnJheS50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnBjbGl0LnN0cmluZ2FycmF5LnNlaS5FY2hvOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJwY2xpdC5zdHJpbmdhcnJheS5zZWkuUlBDTGl0U3RyaW5nQXJyYXlTZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5ycGNsaXQuc3RyaW5nYXJyYXkuU3RyaW5nQXJyYXk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotDQotcHVibGljIGNsYXNzIFJQQ0xpdFN0cmluZ0FycmF5VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFJQQ0xpdFN0cmluZ0FycmF5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXJyYXlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICBSUENMaXRTdHJpbmdBcnJheVNlcnZpY2Ugc2VydmljZSA9IG5ldyBSUENMaXRTdHJpbmdBcnJheVNlcnZpY2UoKTsNCi0gICAgICAgIEVjaG8gcG9ydFR5cGUgPSBzZXJ2aWNlLmdldEVjaG9Qb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnRUeXBlOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UuRWNob0ltcGxQb3J0Iik7DQotDQotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheT0geyJzdHIxIiwgInN0cjIiLCAic3RyMyIsICJzdHI0IDUifTsNCi0gICAgICAgIFN0cmluZ0FycmF5IGFycmF5ID0gbmV3IFN0cmluZ0FycmF5KCk7DQotICAgICAgICBhcnJheS5nZXRJdGVtKCkuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RyQXJyYXkpKTsNCi0gICAgICAgIFN0cmluZ0FycmF5IHJlc3VsdCA9IHBvcnRUeXBlLmVjaG9TdHJpbmdBcnJheShhcnJheSk7DQotICAgICAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoYXJyYXkuZ2V0SXRlbSgpLnNpemUoKSwgcmVzdWx0LmdldEl0ZW0oKS5zaXplKCkpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5nZXRJdGVtKCkuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYXJyYXkuZ2V0SXRlbSgpLmdldChpKSwgcmVzdWx0LmdldEl0ZW0oKS5nZXQoaSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBTdHJpbmdbXSBzdHJBcnJheTIgPSB7InN0cjEiLCAic3RyMiIsICJzdHIzIiwgInN0cjQgNSJ9Ow0KLSAgICAgICAgYXJyYXkgPSBuZXcgU3RyaW5nQXJyYXkoKTsNCi0gICAgICAgIGFycmF5LmdldEl0ZW0oKS5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHJBcnJheTIpKTsNCi0gICAgICAgIHJlc3VsdCA9IHBvcnRUeXBlLmVjaG9TdHJpbmdBcnJheShhcnJheSk7DQotICAgICAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoYXJyYXkuZ2V0SXRlbSgpLnNpemUoKSwgcmVzdWx0LmdldEl0ZW0oKS5zaXplKCkpOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5nZXRJdGVtKCkuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYXJyYXkuZ2V0SXRlbSgpLmdldChpKSwgcmVzdWx0LmdldEl0ZW0oKS5nZXQoaSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0FycmF5VHlwZU5vU0VJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICBSUENMaXRTdHJpbmdBcnJheVNlcnZpY2Ugc2VydmljZSA9IG5ldyBSUENMaXRTdHJpbmdBcnJheVNlcnZpY2UoKTsNCi0gICAgICAgIEVjaG8gcG9ydFR5cGUgPSBzZXJ2aWNlLmdldEVjaG9Qb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnRUeXBlOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SUENMaXRTdHJpbmdBcnJheVNlcnZpY2UuRWNob05vU0VJUG9ydCIpOw0KLQ0KLSAgICAgICAgU3RyaW5nW10gc3RyQXJyYXk9IHsic3RyMSIsICJzdHIyIiwgInN0cjMiLCAic3RyNCA1In07DQotICAgICAgICBTdHJpbmdBcnJheSBhcnJheSA9IG5ldyBTdHJpbmdBcnJheSgpOw0KLSAgICAgICAgYXJyYXkuZ2V0SXRlbSgpLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0ckFycmF5KSk7DQotICAgICAgICBTdHJpbmdBcnJheSByZXN1bHQgPSBwb3J0VHlwZS5lY2hvU3RyaW5nQXJyYXkoYXJyYXkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5zaXplKCksIHJlc3VsdC5nZXRJdGVtKCkuc2l6ZSgpKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0SXRlbSgpLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5nZXQoaSkgKyAicmV0dXJuIiwgcmVzdWx0LmdldEl0ZW0oKS5nZXQoaSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIFN0cmluZ1tdc3RyQXJyYXkyID0geyJzdHIxIiwgInN0cjIiLCAic3RyMyIsICJzdHI0IDUifTsNCi0gICAgICAgIGFycmF5ID0gbmV3IFN0cmluZ0FycmF5KCk7DQotICAgICAgICBhcnJheS5nZXRJdGVtKCkuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc3RyQXJyYXkyKSk7DQotICAgICAgICByZXN1bHQgPSBwb3J0VHlwZS5lY2hvU3RyaW5nQXJyYXkoYXJyYXkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5zaXplKCksIHJlc3VsdC5nZXRJdGVtKCkuc2l6ZSgpKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuZ2V0SXRlbSgpLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFycmF5LmdldEl0ZW0oKS5nZXQoaSkgKyAicmV0dXJuIiwgcmVzdWx0LmdldEl0ZW0oKS5nZXQoaSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9BZGROdW1iZXJzSGFuZGxlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FkZE51bWJlcnNIYW5kbGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmYmFmYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FkZE51bWJlcnNIYW5kbGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzSGFuZGxlclRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotCQ0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9BZGROdW1iZXJzSGFuZGxlclNlcnZpY2UuQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGxQb3J0IjsNCi0gICAgc3RhdGljIEZpbGUgcmVxdWVzdEZpbGUgPSBudWxsOw0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgU3RyaW5nIHJlc291cmNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKw0KLSAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yKyJ0ZXN0LXJlc291cmNlcyIrRmlsZS5zZXBhcmF0b3IrInhtbCI7DQotICAgICAgICByZXF1ZXN0RmlsZSA9IG5ldyBGaWxlKHJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJhZGRudW1iZXJzdGVzdC54bWwiKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVsb2duYW1lID0gInRhcmdldC9BZGROdW1iZXJzSGFuZGxlclRlc3RzLmxvZyI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShBZGROdW1iZXJzSGFuZGxlclRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENsaWVudCBhcHAgc2VuZHMgMTAsIDEwIGFzIHBhcmFtcyB0byBzdW0uICBObyBjbGllbnQtc2lkZSBoYW5kbGVycyBhcmUgY29uZmlndXJlZA0KLSAgICAgKiBmb3IgdGhpcyBzY2VuYXJpby4gIFRoZSBzZXJ2ZXItc2lkZSBBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgaXMgaW5zdGFudGlhdGVkIHdpdGggYQ0KLSAgICAgKiB2YXJpYWJsZSAiZGVkdWN0aW9uIiB3aXRoIHZhbHVlIDEuICBVcG9uIGNsYXNzIGluaXRpYWxpemF0aW9uIHVzaW5nIFBvc3RDb25zdHJ1Y3QNCi0gICAgICogYW5ub3RhdGlvbiwgdGhhdCBpbnRlcm5hbCB2YXJpYWJsZSBpcyBjaGFuZ2VkIHRvIHZhbHVlIDIuICBUaGUgaW5ib3VuZCBBZGROdW1iZXJzTG9naWNhbEhhbmRsZXINCi0gICAgICogc3VidHJhY3RzIDEgZnJvbSB0aGUgZmlyc3QgcGFyYW0sIHRoZW4gb3V0Ym91bmQgaXQgc3VidHJhY3RzIDIgZnJvbSB0aGUgcmVzdWx0IHN1bS4NCi0gICAgICogDQotICAgICAqIFRoaXMgdGVzdCBhY2NvbXBsaXNoZXMgdGhyZWUgdGhpbmdzICh3aGljaCBhbHNvIGNhcnJ5IG92ZXIgdG8gb3RoZXIgdGVzdHMgc2luY2UgdGhleSBhbGwgdXNlDQotICAgICAqIHRoZSBzYW1lIGVuZHBvaW50IGFuZCBzZXJ2ZXItc2lkZSBoYW5kbGVyczoNCi0gICAgICogMSkgIFBvc3RDb25zdHJ1Y3QgYW5ub3RhdGlvbiBob25vcmVkIGluIHRoZSBoYW5kbGVyIGZyYW1ld29yayBmb3IgaGFuZGxlciBpbnN0YW50aWF0aW9uDQotICAgICAqIDIpICBBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgYWxzbyBzZXRzIHR3byBtZXNzYWdlIGNvbnRleHQgcHJvcGVydGllcywgb25lIHdpdGggQVBQTElDQVRJT04NCi0gICAgICogICAgIHNjb3BlLCB3aGljaCB0aGUgZW5kcG9pbnQgY2hlY2tzLg0KLSAgICAgKiAzKSAgSGFuZGxlcnMgYXJlIHNoYXJpbmcgcHJvcGVydGllcywgYm90aCBBUFBMSUNBVElPTiBzY29wZWQgYW5kIEhBTkRMRVIgc2NvcGVkDQotICAgICAqIDMpICBHZW5lcmFsIGhhbmRsZXIgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdHk7IG1ha2Ugc3VyZSBoYW5kbGVycyBhcmUgaW5zdGFudGlhdGVkIGFuZCBjYWxsZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdW1iZXJzSGFuZGxlcigpIHsNCi0JCXRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0JCQkNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0JCQkNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9CShCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcigxMCwgMTApOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV2l0aCBoYW5kbGVyIG1hbmlwdWxhdGlvbiwgdG90YWwgc2hvdWxkIGJlIDMgbGVzcyB0aGFuIGEgcHJvcGVyIHN1bWF0aW9uLiIsIDE3LCB0b3RhbCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRvdGFsIChhZnRlciBoYW5kbGVyIG1hbmlwdWxhdGlvbikgPSAiICsgdG90YWwpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIGFsc28gY29uZmlybSB0aGF0IEBQcmVEZXN0cm95IG1ldGhvZCBpcyBjYWxsZWQuICBTaW5jZSBpdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwgaXQgb24gdGhlIG1hbmFnZWQNCi0gICAgICAgICAgICAvLyAoc2VydmVyKSBzaWRlIGFuZCBqdXN0IGJlZm9yZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBnb2VzIG91dCBvZiBzY29wZSwgd2UgYXJlIGNyZWF0aW5nIGEgZmlsZSBpbiB0aGUNCi0gICAgICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2QsIGFuZCB3aWxsIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGhlcmUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgbWVhbnMNCi0gICAgICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5ldmVyIGNhbGxlZC4gIFRoZSBmaWxlIGlzIHNldCB0byAuZGVsZXRlT25FeGl0KCksIHNvIG5vIG5lZWQgdG8gZGVsZXRlIGl0Lg0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0Iik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0IGRvZXMgbm90IGV4aXN0LCBtZWFuaW5nIHRoZSBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuIiwgZmlsZS5leGlzdHMoKSk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0NCi0gICAgICAgICAgICAgICAgICAgICAgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENsaWVudCBhcHAgc2VuZHMgTUFYVkFMVUUsIE1BWFZBTFVFIGFzIHBhcmFtcyB0byBhZGQuDQotICAgICAqIE5vIGNsaWVudC1zaWRlIGhhbmRsZXJzIGFyZSBjb25maWd1cmVkIGZvciB0aGlzIHNjZW5hcmlvLiAgDQotICAgICAqIFRoZSBlbmRwb2ludCBtZXRob2QgKGFkZE51bWJlcnNIYW5kbGVyKSB3aWxsIGRldGVjdCB0aGUgcG9zc2libGUgb3ZlcmZsb3cgYW5kDQotICAgICAqIHRocm93IGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiwgQWRkTnVtYmVyc0hhbmRsZUZhdWx0X0V4Y2VwdGlvbi4NCi0gICAgICogDQotICAgICAqIFRoZSBzZXJ2ZXItc2lkZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIHdpbGwNCi0gICAgICogYWNjZXNzIHRoZSB0aHJvd24gZXhjZXB0aW9uIHVzaW5nIHRoZSAiamF4d3Mud2VibWV0aG9kLmV4Y2VwdGlvbiINCi0gICAgICogcHJvcGVydHkgYW5kIGFkZCB0aGUgc3RhY2sgdHJhY2Ugc3RyaW5nIHRvIGZhdWx0IHN0cmluZy4NCi0gICAgICogDQotICAgICAqIFRoZSBjbGllbnQgc2hvdWxkIHJlY2VpdmUgYSBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbiB0aGF0IGhhcyBhIHN0YWNrDQotICAgICAqIHRyYWNlIGFzIHBhcnQgb2YgdGhlIG1lc3NhZ2UuDQotICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGUgZm9sbG93aW5nOg0KLSAgICAgKiANCi0gICAgICogMSkgIFByb3BlciBleGNlcHRpb24vZmF1bHQgcHJvY2Vzc2luZyB3aGVuIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQuDQotICAgICAqIDIpICBBY2Nlc3MgdG8gdGhlIHNwZWNpYWwgImpheHdzLndlYm1ldGhvZC5leGNlcHRpb24iDQotICAgICAqIDMpICBQcm9wZXIgZXhjZXB0aW9uIGNhbGwgZmxvdyB3aGVuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJfV2l0aENoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEFkZE51bWJlcnNIYW5kbGVyUG9ydCgpOw0KLQ0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcHJveHkuYWRkTnVtYmVyc0hhbmRsZXIoSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkDQotICAgICAgICAgICAgdCA9IGU7DQotICAgICAgICAgICAgDQotICAgICAgICB9IA0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlciBleGNlcHRpb24gaXMgdGhyb3duDQotICAgICAgICBpZiAodCA9PSBudWxsKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24gdG8gYmUgdGhyb3duIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24gPSAoQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24pIHQ7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uIHRvIGJlIHRocm93biwgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGUgZXhjZXB0aW9uIGlzOiAiICsgdCk7DQotICAgICAgICB9DQotICAgICAgIA0KLSAgICAgICAgLy8gYWxzbyBjb25maXJtIHRoYXQgQFByZURlc3Ryb3kgbWV0aG9kIGlzIGNhbGxlZC4gIFNpbmNlIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCBpdCBvbiB0aGUgbWFuYWdlZA0KLSAgICAgICAgLy8gKHNlcnZlcikgc2lkZSBhbmQganVzdCBiZWZvcmUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZ29lcyBvdXQgb2Ygc2NvcGUsIHdlIGFyZSBjcmVhdGluZyBhIGZpbGUgaW4gdGhlDQotICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2QsIGFuZCB3aWxsIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGhlcmUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgbWVhbnMNCi0gICAgICAgIC8vIEBQcmVEZXN0cm95IG1ldGhvZCB3YXMgbmV2ZXIgY2FsbGVkLiAgVGhlIGZpbGUgaXMgc2V0IHRvIC5kZWxldGVPbkV4aXQoKSwgc28gbm8gbmVlZCB0byBkZWxldGUgaXQuDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5wcmVEZXN0cm95LnR4dCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0IGRvZXMgbm90IGV4aXN0LCBtZWFuaW5nIHRoZSBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuIiwgZmlsZS5leGlzdHMoKSk7DQotDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9DQotICAgICAgICAgICAgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICANCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJFeHBlY3RlZCBFeGNlcHRpb24gaXMgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIG91dGJvdW5kIHNlcnZpY2UgaGFuZGxlciBhZGRzIHRoZSBzdGFjayB0cmFjZSB0byB0aGUgDQotICAgICAgICAvLyBtZXNzYWdlLiAgTWFrZSBzdXJlIHRoZSBzdGFjayB0cmFjZSBjb250YWlucyB0aGUgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwNCi0gICAgICAgIGFzc2VydFRydWUoIkEgc3RhY2sgdHJhY2Ugd2FzIG5vdCBwcmVzZW50IGluIHRoZSByZXR1cm5lZCBleGNlcHRpb24ncyBtZXNzYWdlOiIgKyANCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpLA0KLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuaW5kZXhPZigiQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwiKSA+IDApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2xpZW50IGFwcCBzZW5kcyBNQVhWQUxVRSwgTUFYVkFMVUUgYXMgcGFyYW1zIHRvIGFkZC4NCi0gICAgICogTm8gY2xpZW50LXNpZGUgaGFuZGxlcnMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgc2NlbmFyaW8uICANCi0gICAgICogVGhlIGVuZHBvaW50IG1ldGhvZCAoYWRkTnVtYmVyc0hhbmRsZXIpIHdpbGwgZGV0ZWN0IHRoZSBwb3NzaWJsZSBvdmVyZmxvdyBhbmQNCi0gICAgICogdGhyb3cgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwgTnVsbFBvaW50ZXJFeGNlcHRpb24uDQotICAgICAqIA0KLSAgICAgKiBUaGUgc2VydmVyLXNpZGUgQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciB3aWxsDQotICAgICAqIGFjY2VzcyB0aGUgdGhyb3duIGV4Y2VwdGlvbiB1c2luZyB0aGUgImpheHdzLndlYm1ldGhvZC5leGNlcHRpb24iDQotICAgICAqIHByb3BlcnR5IGFuZCBhZGQgdGhlIHN0YWNrIHRyYWNlIHN0cmluZyB0byBmYXVsdCBzdHJpbmcuDQotICAgICAqIA0KLSAgICAgKiBUaGUgY2xpZW50IHNob3VsZCByZWNlaXZlIGEgU09BUEZhdWx0RXhjZXB0aW9uIHRoYXQgaGFzIGEgc3RhY2sNCi0gICAgICogdHJhY2UgYXMgcGFydCBvZiB0aGUgbWVzc2FnZS4NCi0gICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBmb2xsb3dpbmc6DQotICAgICAqIA0KLSAgICAgKiAxKSAgUHJvcGVyIGV4Y2VwdGlvbi9mYXVsdCBwcm9jZXNzaW5nIHdoZW4gaGFuZGxlcnMgYXJlIGluc3RhbGxlZC4NCi0gICAgICogMikgIEFjY2VzcyB0byB0aGUgc3BlY2lhbCAiamF4d3Mud2VibWV0aG9kLmV4Y2VwdGlvbiINCi0gICAgICogMykgIFByb3BlciBleGNlcHRpb24gY2FsbCBmbG93IHdoZW4gYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJfV2l0aFVuQ2hlY2tlZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpOw0KLSAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcHJveHkuYWRkTnVtYmVyc0hhbmRsZXIoLTEwMDAsIEludGVnZXIuTUlOX1ZBTFVFKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkDQotICAgICAgICAgICAgdCA9IGU7DQotICAgICAgICAgICAgDQotICAgICAgICB9IA0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByb3BlciBleGNlcHRpb24gaXMgdGhyb3duDQotICAgICAgICBpZiAodCA9PSBudWxsKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24gdG8gYmUgdGhyb3duIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgdDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgU09BUEZhdWx0RXhjZXB0aW9uIHRvIGJlIHRocm93biwgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGUgZXhjZXB0aW9uIGlzOiAiICsgdCk7DQotICAgICAgICB9DQotICAgICAgIA0KLSAgICAgICAgLy8gYWxzbyBjb25maXJtIHRoYXQgQFByZURlc3Ryb3kgbWV0aG9kIGlzIGNhbGxlZC4gIFNpbmNlIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gY2FsbCBpdCBvbiB0aGUgbWFuYWdlZA0KLSAgICAgICAgLy8gKHNlcnZlcikgc2lkZSBhbmQganVzdCBiZWZvcmUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgZ29lcyBvdXQgb2Ygc2NvcGUsIHdlIGFyZSBjcmVhdGluZyBhIGZpbGUgaW4gdGhlDQotICAgICAgICAvLyBAUHJlRGVzdHJveSBtZXRob2QsIGFuZCB3aWxsIGNoZWNrIGZvciBpdHMgZXhpc3RhbmNlIGhlcmUuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgbWVhbnMNCi0gICAgICAgIC8vIEBQcmVEZXN0cm95IG1ldGhvZCB3YXMgbmV2ZXIgY2FsbGVkLiAgVGhlIGZpbGUgaXMgc2V0IHRvIC5kZWxldGVPbkV4aXQoKSwgc28gbm8gbmVlZCB0byBkZWxldGUgaXQuDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5wcmVEZXN0cm95LnR4dCIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyLnByZURlc3Ryb3kudHh0IGRvZXMgbm90IGV4aXN0LCBtZWFuaW5nIHRoZSBAUHJlRGVzdHJveSBtZXRob2Qgd2FzIG5vdCBjYWxsZWQuIiwgZmlsZS5leGlzdHMoKSk7DQotDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9DQotICAgICAgICAgICAgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfRkFVTFRfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBvdXRib3VuZCBzZXJ2aWNlIGhhbmRsZXIgYWRkcyB0aGUgc3RhY2sgdHJhY2UgdG8gdGhlIA0KLSAgICAgICAgLy8gbWVzc2FnZS4gIE1ha2Ugc3VyZSB0aGUgc3RhY2sgdHJhY2UgY29udGFpbnMgdGhlIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGVJbXBsDQotICAgICAgICANCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJFeHBlY3RlZCBFeGNlcHRpb24gaXMgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gZXhwZWN0ZWRFeGNlcHRpb24uZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkEgc3RhY2sgdHJhY2Ugd2FzIG5vdCBwcmVzZW50IGluIHRoZSByZXR1cm5lZCBleGNlcHRpb24ncyBtZXNzYWdlOiIgKyANCi0gICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKSwNCi0gICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5pbmRleE9mKCJBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbCIpID4gMCk7DQotICAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJEaXNwYXRjaCgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgUU5hbWUgc2VydmljZU5hbWUgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCAiQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIik7DQotICAgICAgICAgICAgUU5hbWUgcG9ydE5hbWUgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCAiQWRkTnVtYmVyc0hhbmRsZXJQb3J0Iik7DQotDQotICAgICAgICAgICAgU2VydmljZSBteVNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgbXlTZXJ2aWNlLmFkZFBvcnQocG9ydE5hbWUsIG51bGwsIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBteURpc3BhdGNoID0gbXlTZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTb3VyY2UuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7DQotDQotICAgICAgICAgICAgLy8gc2V0IGhhbmRsZXIgY2hhaW4gZm9yIGJpbmRpbmcgcHJvdmlkZXINCi0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoKEJpbmRpbmdQcm92aWRlcikgbXlEaXNwYXRjaCkuZ2V0QmluZGluZygpOw0KLQ0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBsaXN0IG9yIHVzZSB0aGUgZXhpc3Rpbmcgb25lDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICANCi0gICAgICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIGJpbmRpbmcuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgQXN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBteURpc3BhdGNoLmludm9rZShjcmVhdGVSZXF1ZXN0U291cmNlKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNTdHJpbmcgPSBnZXRTdHJpbmcocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIGlmICghcmVzU3RyaW5nLmNvbnRhaW5zKCI8cmV0dXJuPjE2PC9yZXR1cm4+IikpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2Ugc3RyaW5nIHNob3VsZCBjb250YWluIDxyZXR1cm4+MTY8L3JldHVybj4sIGJ1dCBkb2VzIG5vdC4gIFRoZSByZXNTdHJpbmcgd2FzOiBcIiIgKyByZXNTdHJpbmcgKyAiXCIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBQT1NUX0NPTlNUUlVDVFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBQUkVfREVTVFJPWVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZF9jYWxscywgbG9nKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNIYW5kbGVyRGlzcGF0Y2hNeVJlc29sdmVyKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9DQotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsICJBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiKTsNCi0gICAgICAgICAgICBRTmFtZSBwb3J0TmFtZSA9DQotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsICJBZGROdW1iZXJzSGFuZGxlclBvcnQiKTsNCi0NCi0gICAgICAgICAgICBTZXJ2aWNlIG15U2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBteVNlcnZpY2Uuc2V0SGFuZGxlclJlc29sdmVyKG5ldyBNeUhhbmRsZXJSZXNvbHZlcigpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBteVNlcnZpY2UuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IG15RGlzcGF0Y2ggPSBteVNlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIFNvdXJjZS5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0NCi0gICAgICAgICAgICAvL0ludm9rZSB0aGUgRGlzcGF0Y2gNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgQXN5bmMgRGlzcGF0Y2giKTsNCi0gICAgICAgICAgICBTb3VyY2UgcmVzcG9uc2UgPSBteURpc3BhdGNoLmludm9rZShjcmVhdGVSZXF1ZXN0U291cmNlKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNTdHJpbmcgPSBnZXRTdHJpbmcocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIGlmICghcmVzU3RyaW5nLmNvbnRhaW5zKCI8cmV0dXJuPjE2PC9yZXR1cm4+IikpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2Ugc3RyaW5nIHNob3VsZCBjb250YWluIDxyZXR1cm4+MTY8L3JldHVybj4sIGJ1dCBkb2VzIG5vdC4gIFRoZSByZXNTdHJpbmcgd2FzOiBcIiIgKyByZXNTdHJpbmcgKyAiXCIiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgQ0xPU0VcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBKQVhXUyA5LjIuMS4xIGNvbmZvcm1hbmNlIHRlc3QNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdW1iZXJzSGFuZGxlclJlc29sdmVyKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0NCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBzZXJ2aWNlLnNldEhhbmRsZXJSZXNvbHZlcihuZXcgTXlIYW5kbGVyUmVzb2x2ZXIoKSk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIGRlc3BpdGUgc2V0dGluZyBNeUhhbmRsZXJSZXNvbHZlciBvbiB0aGUgc2VydmljZSwgd2Ugc2hvdWxkIGdldCBhbiBlbXB0eQ0KLSAgICAgICAgICAgICAqIGxpc3QgZnJvbSB0aGUgZ2V0QmluZGluZygpLmdldEhhbmRsZXJDaGFpbigpIGNhbGwgYmVsb3cuICBKQVhXUyA5LjIuMS4xIGNvbmZvcm1hbmNlDQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTGlzdCBzaG91bGQgYmUgZW1wdHkuICBXZSd2ZSBub3QgY29uZm9ybWVkIHRvIEpBWFdTIDkuMi4xLjEuIiwgbGlzdC5pc0VtcHR5KCkpOw0KLSAgICAgICAgICAgIFN0cmluZyBsb2cgPSByZWFkTG9nRmlsZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE51bGwoImxvZyBzaG91bGQgYmUgZW1wdHksIHNpbmNlIG5vIGhhbmRsZXJzIGFyZSBpbiB0aGUgbGlzdCBhbmQgd2UgbmV2ZXIgY2FsbGVkIGEgc2VydmljZSIsIGxvZyk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJXaXRoRmF1bHQoKSB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsgIA0KLSAgICAgICAgICAgIC8vIHZhbHVlIDk5IHRyaWdnZXJzIHRoZSBoYW5kbGVyIHRvIHRocm93IGFuIGV4Y2VwdGlvbiwgYnV0IGRvZXMNCi0gICAgICAgICAgICAvLyBOT1QgdHJpZ2dlciB0aGUgQWRkTnVtYmVyc0hhbmRsZXIuaGFuZGxlZmF1bHQgbWV0aG9kLg0KLSAgICAgICAgICAgIC8vIFRoZSBzcGVjIGRvZXMgbm90IGNhbGwgdGhlIGhhbmRsZWZhdWx0IG1ldGhvZCBvZiBhIGhhbmRsZXIgdGhhdA0KLSAgICAgICAgICAgIC8vIGNhdXNlcyBhIGZsb3cgcmV2ZXJzYWwNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcig5OSwxMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgZmFpbCgiV2Ugc2hvdWxkIGhhdmUgZ290IGFuIGV4Y2VwdGlvbiBkdWUgdG8gdGhlIGhhbmRsZXIuIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGJlIFNPQVBGYXVsdEV4Y2VwdGlvbiIsIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygoKFNPQVBGYXVsdEV4Y2VwdGlvbillKS5nZXRNZXNzYWdlKCksICJJIGRvbid0IGxpa2UgdGhlIHZhbHVlIDk5Iik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBUSFJPV0lORyBQUk9UT0NPTEVYQ0VQVElPTiBJTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBQUkVfREVTVFJPWVxuIjsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiB0ZXN0QWRkTnVtYmVyc0NsaWVudEhhbmRsZXIgcGVyZm9ybXMgdGhlIHNhbWUgdGVzdHMgYXMgdGVzdEFkZE51bWJlcnNIYW5kbGVyLCBleGNlcHQNCi0gICAgICogdGhhdCB0d28gY2xpZW50LXNpZGUgaGFuZGxlcnMgYXJlIGFsc28gaW5zZXJ0ZWQgaW50byB0aGUgZmxvdy4gIFRoZSBpbmJvdW5kIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcg0KLSAgICAgKiBjaGVja3MgdGhhdCB0aGUgcHJvcGVydGllcyBzZXQgaGVyZSBpbiB0aGlzIG1ldGhvZCAodGhlIGNsaWVudCBhcHApIGFuZCB0aGUgcHJvcGVydGllcyBzZXQgaW4gdGhlDQotICAgICAqIG91dGJvdW5kIEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgYXJlIGFjY2Vzc2libGUuICBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbHNvIGNoZWNrZWQgaGVyZSBpbg0KLSAgICAgKiB0aGUgY2xpZW50IGFwcC4gIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBhbHNvIHN1YnRyYWN0cyAxIGZyb20gdGhlIHN1bSBvbiB0aGUgaW5ib3VuZCBmbG93Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyKCkgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEFkZE51bWJlcnNIYW5kbGVyUG9ydCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCANCi0gICAgICAgICAgICAgICAgICAgIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgibXlDbGllbnRLZXkiLCAibXlDbGllbnRWYWwiKTsNCi0NCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpDQotICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlcigpKTsNCi0gICAgICAgICAgICBwLmdldEJpbmRpbmcoKS5zZXRIYW5kbGVyQ2hhaW4oaGFuZGxlcnMpOw0KLQ0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LmFkZE51bWJlcnNIYW5kbGVyKDEwLDEwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBzZWUgaWYgSSBjYW4gZ2V0IGFuIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eSBzZXQgZHVyaW5nIG91dGJvdW5kIGZsb3cuICBJIHNob3VsZCBiZSBhYmxlIHRvIGRvIHRoaXMgYWNjb3JkaW5nIHRvIDQuMi4xDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVE9ETzogIGFzc2VydCBpcyBub3cgY29tbWVudGVkIG91dC4gIFRoaXMgcHJvcGVydHkgaXMgc2V0IGJ5IGEgY2xpZW50IG91dGJvdW5kIGhhbmRsZXIsIGFuZCBJIGRvbid0IHRoaW5rIGl0DQotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGF2YWlsYWJsZSBvbiB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBjb250ZXh0cy4NCi0gICAgICAgICAgICAvL2Fzc2VydE5vdE51bGwoIlNob3VsZCBiZSBhYmxlIHRvIHJldHJpZXZlIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eSwgYnV0IGNvdWxkIG5vdC4iLCAoKFN0cmluZylwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KCJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyT3V0Ym91bmRBcHBTY29wZWRQcm9wZXJ0eSIpKSk7DQotDQotICAgICAgICAgICAgLy8gc2hvdWxkIE5PVCBiZSBhYmxlIHRvIGdldCB0aGlzIEhBTkRMRVIgc2NvcGVkIHByb3BlcnR5IHRob3VnaA0KLSAgICAgICAgICAgIGFzc2VydE51bGwoIlNob3VsZCBub3QgYmUgYWJsZSB0byByZXRyaWV2ZSBIQU5ETEVSIHNjb3BlZCBwcm9wZXJ0eSwgYnV0IHdhcyBhYmxlLiIsIChTdHJpbmcpcC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJPdXRib3VuZEhhbmRsZXJTY29wZWRQcm9wZXJ0eSIpKTsNCi0gICAgICAgICAgICAvLyBzaG91bGQgYmUgYWJsZSB0byBnZXQgdGhpcyBBUFBMSUNBVElPTiBzY29wZWQgcHJvcGVydHkgc2V0IGR1cmluZyBpbmJvdW5kIGZsb3cNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgYmUgYWJsZSB0byByZXRyaWV2ZSBBUFBMSUNBVElPTiBzY29wZWQgcHJvcGVydHksIGJ1dCBjb3VsZCBub3QuIiwgKFN0cmluZylwLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldCgiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlckluYm91bmRBcHBTY29wZWRQcm9wZXJ0eSIpKTsNCi0gICAgICAgICAgICAvLyBzaG91bGQgTk9UIGJlIGFibGUgdG8gZ2V0IHRoaXMgSEFORExFUiBzY29wZWQgcHJvcGVydHkgdGhvdWdoDQotICAgICAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJldHJpZXZlIEhBTkRMRVIgc2NvcGVkIHByb3BlcnR5LCBidXQgd2FzIGFibGUuIiwgKFN0cmluZylwLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldCgiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlckluYm91bmRIYW5kbGVyU2NvcGVkUHJvcGVydHkiKSk7DQotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gZ2V0IHRoaXMgQVBQTElDQVRJT04gc2NvcGVkIHByb3BlcnR5IHNldCBieSB0aGlzIGNsaWVudA0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBiZSBhYmxlIHRvIHJldHJpZXZlIEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0eSwgYnV0IGNvdWxkIG5vdC4iLCAoU3RyaW5nKXAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoIm15Q2xpZW50S2V5IikpOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV2l0aCBoYW5kbGVyIG1hbmlwdWxhdGlvbiwgdG90YWwgc2hvdWxkIGJlIDQgbGVzcyB0aGFuIGEgcHJvcGVyIHN1bWF0aW9uLiIsIDE2LCB0b3RhbCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRvdGFsIChhZnRlciBoYW5kbGVyIG1hbmlwdWxhdGlvbikgPSAiICsgdG90YWwpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyBsb2cgPSByZWFkTG9nRmlsZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9ICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIFBPU1RfQ09OU1RSVUNUXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZF9jYWxscywgbG9nKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiB1c2VzIGEgY3VzdG9tIEhhbmRsZXJSZXNvbHZlciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LiAgTXlIYW5kbGVyUmVzb2x2ZXINCi0gICAgICogcHV0cyB0aGUgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIGFuZCBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyDQotICAgICAqIGluIHRoZSBmbG93LiAgUmVzdWx0cyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyTXlSZXNvbHZlcigpIHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBzZXJ2aWNlLnNldEhhbmRsZXJSZXNvbHZlcihuZXcgTXlIYW5kbGVyUmVzb2x2ZXIoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcigxMCwxMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXaXRoIGhhbmRsZXIgbWFuaXB1bGF0aW9uLCB0b3RhbCBzaG91bGQgYmUgNCBsZXNzIHRoYW4gYSBwcm9wZXIgc3VtYXRpb24uIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgMTYsDQotICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVG90YWwgKGFmdGVyIGhhbmRsZXIgbWFuaXB1bGF0aW9uKSA9ICIgKyB0b3RhbCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgQ0xPU0VcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGROdW1iZXJzQ2xpZW50UHJvdG9BbmRMb2dpY2FsSGFuZGxlcigpIHsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMgPSBwLmdldEJpbmRpbmcoKS5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIHAuZ2V0QmluZGluZygpLnNldEhhbmRsZXJDaGFpbihoYW5kbGVycyk7DQotDQotICAgICAgICAgICAgLy8gdmFsdWUgMTAyIHRyaWdnZXJzIGFuIGVuZHBvaW50IGV4Y2VwdGlvbiwgd2hpY2ggd2lsbCBydW4gdGhyb3VnaCB0aGUgc2VydmVyIG91dGJvdW5kDQotICAgICAgICAgICAgLy8gaGFuZGxlRmF1bHQgbWV0aG9kcywgdGhlbiBjbGllbnQgaW5ib3VuZCBoYW5kbGVGYXVsdCBtZXRob2RzDQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkuYWRkTnVtYmVyc0hhbmRsZXIoMTAyLDEwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBnb3QgYW4gZXhjZXB0aW9uLCBidXQgZGlkbid0Iik7DQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGJlIFNPQVBGYXVsdEV4Y2VwdGlvbiIsIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgIC8vQVhJUzItMjQxNyAtIGFzc2VydEVxdWFscygoKFNPQVBGYXVsdEV4Y2VwdGlvbillKS5nZXRNZXNzYWdlKCksICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIHdhcyBoZXJlIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgoKFNPQVBGYXVsdEV4Y2VwdGlvbillKS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkdvdCB2YWx1ZSAxMDEuICAiICsNCi0gICAgICAgICAgICAJCSJBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbC5hZGROdW1iZXJzSGFuZGxlciBtZXRob2QgaXMgIiArDQotICAgICAgICAgICAgCQkiY29ycmVjdGx5IHRocm93aW5nIHRoaXMgZXhjZXB0aW9uIGFzIHBhcnQgb2YgdGVzdGluZyIpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRfY2FsbHMgPSAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBQT1NUX0NPTlNUUlVDVFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgSEFORExFX0ZBVUxUX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMiBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgUFJFX0RFU1RST1lcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9GQVVMVF9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBIQU5ETEVfRkFVTFRfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBDTE9TRVxuIjsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0NsaWVudEhhbmRsZXJXaXRoRmF1bHQoKSB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpDQotICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyNCgpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjMoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcC5nZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0NCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzSGFuZGxlcig5OSwxMCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290IGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGRpZG4ndC4iKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV4Y2VwdGlvbiBzaG91bGQgYmUgU09BUEZhdWx0RXhjZXB0aW9uIiwgZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJIGRvbid0IGxpa2UgdGhlIHZhbHVlIDk5IiwgKChTT0FQRmF1bHRFeGNlcHRpb24pZSkuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRfY2FsbHMgPSAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyNCBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzIEhBTkRMRV9GQVVMVF9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMyBIQU5ETEVfRkFVTFRfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzIFJFVFVSTklORyBGQUxTRSBJTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIzIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQgQ0xPU0VcbiI7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogdGVzdCByZXN1bHRzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0ZXN0QWRkTnVtYmVyc0NsaWVudEhhbmRsZXIsIGV4Y2VwdCB0aGF0DQotICAgICAqIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgZG91YmxlcyB0aGUgZmlyc3QgcGFyYW0gb24gb3V0Ym91bmQuICBBc3luYywgb2YgY291cnNlLg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE51bWJlcnNDbGllbnRIYW5kbGVyQXN5bmMoKSB7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIA0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcC5nZXRCaW5kaW5nKCkuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwpDQotICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChuZXcgQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMigpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgcC5nZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlckFzeW5jQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IHByb3h5LmFkZE51bWJlcnNIYW5kbGVyQXN5bmMoMTAsIDEwLCBjYWxsYmFjayk7DQotDQotICAgICAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBpbmNvbXBsZXRlIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IGNhbGxiYWNrLmdldFJlc3BvbnNlVmFsdWUoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldpdGggaGFuZGxlciBtYW5pcHVsYXRpb24sIHRvdGFsIHNob3VsZCBiZSAyNi4iLCAyNiwgdG90YWwpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUb3RhbCAoYWZ0ZXIgaGFuZGxlciBtYW5pcHVsYXRpb24pID0gIiArIHRvdGFsKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRfY2FsbHMgPSAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIFBPU1RfQ09OU1RSVUNUXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEdFVF9IRUFERVJTXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMiBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9PVVRCT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX09VVEJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIFBSRV9ERVNUUk9ZXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBIQU5ETEVfTUVTU0FHRV9JTkJPVU5EXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZF9jYWxscywgbG9nKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVyc0hhbmRsZXJIYW5kbGVyUmVzb2x2ZXIoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7IC8vIHdpbGwgZ2l2ZSBOUEU6DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IHNlcnZpY2UuZ2V0SGFuZGxlclJlc29sdmVyKCkNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRIYW5kbGVyQ2hhaW4obnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgNCi0gICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IGhhbmRsZXJzIGxpc3Qgc2hvdWxkIG5vdCBiZSBudWxsIGJ1dCBlbXB0eS4iLA0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFN0cmluZyBsb2cgPSByZWFkTG9nRmlsZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE51bGwoImxvZyBzaG91bGQgYmUgbnVsbCBzaW5jZSB3ZSBkaWQgbm90IGNhbGwgYW55IHNlcnZpY2VzIiwgbG9nKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0gDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5KCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UoKTsNCi0gICAgICAgICAgICBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRBZGROdW1iZXJzSGFuZGxlclBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUludCgxMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gb25lLXdheSBpbnZvY2F0aW9ucyBydW4gaW4gdGhlaXIgb3duIHRocmVhZCwNCi0gICAgICAgICAgICAvLyBhbmQgd2UgY2FuJ3QgdGVsbCBoZXJlIGluIHRoZSBjbGllbnQgd2hlbiBpdA0KLSAgICAgICAgICAgIC8vIGhhcyBjb21wbGV0ZWQuICBTbywgd2UgbmVlZCB0byB3YWl0IGxvbmcgZW5vdWdoDQotICAgICAgICAgICAgLy8gZm9yIHRoZSBpbnZvY2F0aW9uIHRvIGNvbXBsZXRlLCBzbyBvdXIgbG9nIGZpbGUNCi0gICAgICAgICAgICAvLyBpcyBmdWxseSBwb3B1bGF0ZWQuDQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAgKiA1KTsgLy8gNSBzZWNvbmRzDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGxvZyA9IHJlYWRMb2dGaWxlKCk7DQotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkX2NhbGxzID0gIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgUE9TVF9DT05TVFJVQ1RcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgR0VUX0hFQURFUlNcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBHRVRfSEVBREVSU1xuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgSEFORExFX01FU1NBR0VfSU5CT1VORFxuIg0KLSAgICAgICAgICAgICAgICArICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIEhBTkRMRV9NRVNTQUdFX0lOQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyIENMT1NFXG4iDQotICAgICAgICAgICAgICAgICsgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgQ0xPU0VcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBDTE9TRVxuIjsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRfY2FsbHMsIGxvZyk7DQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5V2l0aFByb3RvY29sRXhjZXB0aW9uKCkgew0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSBzZXJ2aWNlID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEFkZE51bWJlcnNIYW5kbGVyUG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotDQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KCJteUNsaWVudEtleSIsICJteUNsaWVudFZhbCIpOw0KLQ0KLSAgICAgICAgICAgIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMgPSBwLmdldEJpbmRpbmcoKS5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyKCkpOw0KLSAgICAgICAgICAgIHAuZ2V0QmluZGluZygpLnNldEhhbmRsZXJDaGFpbihoYW5kbGVycyk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgLy8gdmFsdWUgOTkgd2lsbCB0cmlnZ2VyIGV4Y2VwdGlvbiBmcm9tIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcg0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUludCg5OSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gZXhjZXB0aW9ucyBvbiBvbmUtd2F5IGludm9jYXRpb25zIGFyZSBzdXBwcmVzc2VkIGJ5IGRlZmF1bHQNCi0gICAgICAgIGFzc2VydE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIC8vIG9uZS13YXkgaW52b2NhdGlvbnMgcnVuIGluIHRoZWlyIG93biB0aHJlYWQsDQotICAgICAgICAvLyBhbmQgd2UgY2FuJ3QgdGVsbCBoZXJlIGluIHRoZSBjbGllbnQgd2hlbiBpdA0KLSAgICAgICAgLy8gaGFzIGNvbXBsZXRlZC4gIFNvLCB3ZSBuZWVkIHRvIHdhaXQgbG9uZyBlbm91Z2gNCi0gICAgICAgIC8vIGZvciB0aGUgaW52b2NhdGlvbiB0byBjb21wbGV0ZSwgc28gb3VyIGxvZyBmaWxlDQotICAgICAgICAvLyBpcyBmdWxseSBwb3B1bGF0ZWQuDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogNSk7IC8vIDUgc2Vjb25kcw0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCi0gICAgICAgICAgICAvLyBub3RoaW5nDQotICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9ICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T25lV2F5V2l0aFJ1bnRpbWVFeGNlcHRpb24oKSB7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotDQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc0hhbmRsZXJTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0NCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoIm15Q2xpZW50S2V5IiwgIm15Q2xpZW50VmFsIik7DQotDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IHAuZ2V0QmluZGluZygpLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgICAgIGlmIChoYW5kbGVycyA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcigpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgcC5nZXRCaW5kaW5nKCkuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0gICAgICAgICAgICAvLyB2YWx1ZSA5OSB3aWxsIHRyaWdnZXIgZXhjZXB0aW9uIGZyb20gQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyDQotICAgICAgICAgICAgcHJveHkub25lV2F5SW50KDk5OSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gZXhjZXB0aW9ucyBvbiBvbmUtd2F5IGludm9jYXRpb25zIGFyZSBzdXBwcmVzc2VkIGJ5IGRlZmF1bHQNCi0gICAgICAgIGFzc2VydE51bGwoZXhjZXB0aW9uKTsgICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgIC8vIG9uZS13YXkgaW52b2NhdGlvbnMgcnVuIGluIHRoZWlyIG93biB0aHJlYWQsDQotICAgICAgICAvLyBhbmQgd2UgY2FuJ3QgdGVsbCBoZXJlIGluIHRoZSBjbGllbnQgd2hlbiBpdA0KLSAgICAgICAgLy8gaGFzIGNvbXBsZXRlZC4gIFNvLCB3ZSBuZWVkIHRvIHdhaXQgbG9uZyBlbm91Z2gNCi0gICAgICAgIC8vIGZvciB0aGUgaW52b2NhdGlvbiB0byBjb21wbGV0ZSwgc28gb3VyIGxvZyBmaWxlDQotICAgICAgICAvLyBpcyBmdWxseSBwb3B1bGF0ZWQuDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogNSk7IC8vIDUgc2Vjb25kcw0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsNCi0gICAgICAgICAgICAvLyBub3RoaW5nDQotICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICBTdHJpbmcgbG9nID0gcmVhZExvZ0ZpbGUoKTsNCi0gICAgICAgIFN0cmluZyBleHBlY3RlZF9jYWxscyA9ICJBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgSEFORExFX01FU1NBR0VfT1VUQk9VTkRcbiINCi0gICAgICAgICAgICAgICAgKyAiQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyIENMT1NFXG4iOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2NhbGxzLCBsb2cpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotDQotDQotICAgIC8qDQotICAgICAqIEEgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjb2xsZWN0IHRoZSBleGNlcHRpb25zDQotICAgICAqLw0KLSAgICBjbGFzcyBBZGROdW1iZXJzSGFuZGxlckFzeW5jQ2FsbGJhY2sgaW1wbGVtZW50cyBBc3luY0hhbmRsZXI8QWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZT4gew0KLSAgICAgDQotICAgICAgICBwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb247DQotICAgICAgICBwcml2YXRlIGludCByZXRWYWw7DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlPEFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2U+IHJlc3BvbnNlKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkZhdWx0eUFzeW5jSGFuZGxlci5oYW5kbGVSZXNwb25zZSgpIHdhcyBjYWxsZWQiKTsNCi0gICAgICAgICAgICAgICAgQWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSByID0gcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJObyBleGNlcHRpb24gd2FzIHRocm93biBmcm9tIFJlc3BvbnNlLmdldCgpIik7DQotICAgICAgICAgICAgICAgIHJldFZhbCA9IHIuZ2V0UmV0dXJuKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd246ICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIGludCBnZXRSZXNwb25zZVZhbHVlKCkgew0KLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBleGNlcHRpb247DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIGNsYXNzIE15SGFuZGxlclJlc29sdmVyIGltcGxlbWVudHMgSGFuZGxlclJlc29sdmVyIHsNCi0NCi0gICAgICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJDaGFpbihQb3J0SW5mbyBwb3J0aW5mbykgew0KLSAgICAgICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcigpKTsNCi0gICAgICAgICAgICBoYW5kbGVycy5hZGQobmV3IEFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIoKSk7DQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmcoU291cmNlIHNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7DQotICAgICAgICB0LnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7DQotICAgICAgICByZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7DQotDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBTb3VyY2UgcmVxdWVzdCB0byBiZSB1c2VkIGJ5IERpc3BhdGNoPFNvdXJjZT4NCi0gICAgICovDQotICAgIHByaXZhdGUgU291cmNlIGNyZWF0ZVJlcXVlc3RTb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVxdWVzdEZpbGUpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UoZmlzKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7DQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbG9nbmFtZSk7DQotICAgICAgICBmaWxlLmRlbGV0ZSgpOyAgLy8geWVzLCBkZWxldGUgZm9yIGVhY2ggcmV0cmlldmFsLCB3aGljaCBzaG91bGQgb25seSBoYXBwZW4gb25jZSBwZXIgdGVzdA0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkTG9nRmlsZSgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKGZpbGVsb2duYW1lKTsNCi0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7DQotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOw0KLSAgICAgICAgICAgIFN0cmluZyByZXQgPSBudWxsOw0KLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0U3RyZWFtLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXQgPSAiIjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXQgPSByZXQuY29uY2F0KGxpbmUgKyAiXG4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZnIuY2xvc2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gcmV0Ow0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsNCi0gICAgICAgICAgICAvLyBpdCdzIHBvc3NpYmxlIHRoZSB0ZXN0IGRvZXMgbm90IGFjdHVhbGx5IGNhbGwgYW55IGhhbmRsZXJzIGFuZCB0aGVyZWZvcmUNCi0gICAgICAgICAgICAvLyBubyBmaWxlIHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuLiAgVGhlIHRlc3Qgc2hvdWxkIGFjY291bnQgZm9yIHRoaXMgYnkNCi0gICAgICAgICAgICAvLyBhc3NlcnROdWxsIG9uIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBoZXJlDQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0gICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChpb2UuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkTnVtYmVyc1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FkZE51bWJlcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTMxZTI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkTnVtYmVyc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVycy5BZGROdW1iZXJzUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0JDQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FkZE51bWJlcnNTZXJ2aWNlLkFkZE51bWJlcnNQb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFkZHJlc3NCb29rVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAJICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTnVtYmVycygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEFkZE51bWJlcnNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQWRkTnVtYmVyc1NlcnZpY2UoKTsNCi0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc1BvcnQoKTsNCi0NCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgaW50IHRvdGFsID0gcHJveHkuYWRkTnVtYmVycygxMCwgMTApOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRvdGFsID0iICsgdG90YWwpOw0KLSAgICAgICAgDQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoInN1bSIsIDIwLCB0b3RhbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHAgcmVzcG9uc2UgY29kZSIsIA0KLSAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKDIwMCksIHAuZ2V0UmVzcG9uc2VDb250ZXh0KCkuZ2V0KE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSkpOw0KLSAgICAgICAgTWFwIGhlYWRlcnMgPSAoTWFwKSBwLmdldFJlc3BvbnNlQ29udGV4dCgpLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFU1BPTlNFX0hFQURFUlMpOw0KLSAgICAgICAgLy8gdGhlIG1hcCBzaG91bGQgY29udGFpbiBzb21lIGhlYWRlcnMNCi0gICAgICAgIGFzc2VydFRydWUoImh0dHAgcmVzcG9uc2UgaGVhZGVycyIsIGhlYWRlcnMgIT0gbnVsbCAmJiAhaGVhZGVycy5pc0VtcHR5KCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgdGVzdCBhZ2Fpbg0KLSAgICAgICAgdG90YWwgPSBwcm94eS5hZGROdW1iZXJzKDEwLCAxMCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVG90YWwgPSIgKyB0b3RhbCk7DQotICAgICAgICANCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygic3VtIiwgMjAsIHRvdGFsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cCByZXNwb25zZSBjb2RlIiwgDQotICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIoMjAwKSwgcC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9DT0RFKSk7DQotICAgICAgICBoZWFkZXJzID0gKE1hcCkgcC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVNQT05TRV9IRUFERVJTKTsNCi0gICAgICAgIC8vIHRoZSBtYXAgc2hvdWxkIGNvbnRhaW4gc29tZSBoZWFkZXJzDQotICAgICAgICBhc3NlcnRUcnVlKCJodHRwIHJlc3BvbnNlIGhlYWRlcnMiLCBoZWFkZXJzICE9IG51bGwgJiYgIWhlYWRlcnMuaXNFbXB0eSgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheSgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQWRkTnVtYmVyc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBZGROdW1iZXJzU2VydmljZSgpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QWRkTnVtYmVyc1BvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUludCgxMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IGl0IG9uZSBtb3JlIHRpbWUNCi0gICAgICAgICAgICBwcm94eS5vbmVXYXlJbnQoMTEpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfSAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FkZHJlc3NCb29rVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkcmVzc0Jvb2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjIwNTU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQWRkcmVzc0Jvb2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay5BZGRFbnRyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkRW50cnlSZXNwb25zZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLkFkZHJlc3NCb29rRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBUaGlzIHRlc3RzIHRoZSBBZGRyZXNzQm9vayBzYW1lIHNlcnZpY2UgdGhhdCBleGlzdHMgdW5kZXINCi0gKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay4qDQotICovDQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgIE5BTUVTUEFDRSwgIkFkZHJlc3NCb29rU2VydmljZSIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9QT1JUID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgIE5BTUVTUEFDRSwgIkFkZHJlc3NCb29rIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZS5BZGRyZXNzQm9va0ltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEFkZHJlc3NCb29rVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgZW5kcG9pbnQgYnkgaW52b2tpbmcgaXQgd2l0aCBhIEpBWC1XUyBEaXNwYXRjaC4gIA0KLSAgICAgKi8NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRyZXNzQm9va1dpdGhEaXNwYXRjaCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goDQotICAgICAgICAgICAgICAgIFFOQU1FX1BPUlQsIGpiYywgTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB0aGF0IHdpbGwgaG9sZCB0aGUgZGF0YQ0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEFkZEVudHJ5IHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUFkZEVudHJ5KCk7DQotICAgICAgICBBZGRyZXNzQm9va0VudHJ5IGNvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZUFkZHJlc3NCb29rRW50cnkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgY29udGVudC5zZXRGaXJzdE5hbWUoIlJvbiIpOw0KLSAgICAgICAgY29udGVudC5zZXRMYXN0TmFtZSgiVGVzdGVyc29uIik7DQotICAgICAgICBjb250ZW50LnNldFBob25lKCI1MTItNDU5LTIyMjIiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGRvYy9saXQgd3JhcHBlZCBXU0RMLCB3ZSBuZWVkIHRvIHNldCB0aGUgDQotICAgICAgICAvLyBkYXRhIGluc2lkZSBvZiBhIHJlcXVlc3Qgd3JhcHBlciBlbGVtZW50Lg0KLSAgICAgICAgcmVxdWVzdC5zZXRFbnRyeShjb250ZW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgQWRkRW50cnlSZXNwb25zZSByZXNwb25zZSA9IChBZGRFbnRyeVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzdWx0cw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmlzU3RhdHVzKCkpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAgICAgLSB2YWxpZCByZXNwb25zZSByZWNlaXZlZCIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltyZXNwb25zZV0gLSAiICsgcmVzcG9uc2UuaXNTdGF0dXMoKSk7DQotDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgZGlzcGF0Y2ggYWdhaW4NCi0gICAgICAgIHJlc3BvbnNlID0gKEFkZEVudHJ5UmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuaXNTdGF0dXMoKSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3Bhc3NdICAgICAtIHZhbGlkIHJlc3BvbnNlIHJlY2VpdmVkIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiW3Jlc3BvbnNlXSAtICIgKyByZXNwb25zZS5pc1N0YXR1cygpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlICJhZGRFbnRyeSIgb3BlcmF0aW9uLiAgVGhpcyBzZW5kcyBhIGNvbXBsZXggdHlwZSBhbmQgcmV0dXJucw0KLSAgICAgKiBhIHNpbXBsZSB0eXBlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgQWRkcmVzc0Jvb2sgYWIgPSBzZXJ2aWNlLmdldFBvcnQoUU5BTUVfUE9SVCwgQWRkcmVzc0Jvb2suY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAxID0gKEJpbmRpbmdQcm92aWRlcikgYWI7DQotICAgICAgICBwMS5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgVVJMX0VORFBPSU5UKTsNCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgY29udGVudCA9IGZhY3RvcnkuY3JlYXRlQWRkcmVzc0Jvb2tFbnRyeSgpOw0KLSAgICAgICAgY29udGVudC5zZXRGaXJzdE5hbWUoIkZvbyIpOw0KLSAgICAgICAgY29udGVudC5zZXRMYXN0TmFtZSgiQmFyIik7DQotICAgICAgICBjb250ZW50LnNldFBob25lKCI1MTItNDU5LTIyMjIiKTsNCi0gICAgICAgIA0KLSAgICAgICAgYm9vbGVhbiBhZGRlZCA9IGFiLmFkZEVudHJ5KGNvbnRlbnQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzdWx0cw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZGRlZCk7DQotICAgICAgICBhc3NlcnRUcnVlKGFkZGVkKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIHRlc3QgYWdhaW4NCi0gICAgICAgIGFkZGVkID0gYWIuYWRkRW50cnkoY29udGVudCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKGFkZGVkKTsNCi0gICAgICAgIGFzc2VydFRydWUoYWRkZWQpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgImZpbmRFbnRyeUJ5TmFtZSIgb3BlcmF0aW9uLiAgVGhpcyBzZW5kcyBhIHNpbXBsZSB0eXBlIGFuZCANCi0gICAgICogcmV0dXJucyBhIGNvbXBsZXggdHlwZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kRW50cnlCeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBBZGRyZXNzQm9vayBhYiA9IHNlcnZpY2UuZ2V0UG9ydChRTkFNRV9QT1JULCBBZGRyZXNzQm9vay5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcDEgPSAoQmluZGluZ1Byb3ZpZGVyKSBhYjsNCi0gICAgICAgIHAxLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgZm5hbWUgPSAiSm9lIjsNCi0gICAgICAgIFN0cmluZyBsbmFtZSA9ICJUZXN0IjsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgcmVzdWx0ID0gYWIuZmluZEVudHJ5QnlOYW1lKGZuYW1lLCBsbmFtZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXN1bHRzDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRGaXJzdE5hbWUoKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRMYXN0TmFtZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldEZpcnN0TmFtZSgpLmVxdWFscyhmbmFtZSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0TGFzdE5hbWUoKS5lcXVhbHMobG5hbWUpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBpbnZva2UgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXN1bHQgPSBhYi5maW5kRW50cnlCeU5hbWUoZm5hbWUsIGxuYW1lKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHJlc3VsdHMNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldEZpcnN0TmFtZSgpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldExhc3ROYW1lKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0Rmlyc3ROYW1lKCkuZXF1YWxzKGZuYW1lKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRMYXN0TmFtZSgpLmVxdWFscyhsbmFtZSkpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0FzeW5jQ2FsbGJhY2suamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQXN5bmNDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFjZjU5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQXN5bmNDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5SG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQXN5bmNDYWxsYmFjayBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlciB7DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBBc3luY0NhbGxiYWNrKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyI2hhbmRsZVJlc3BvbnNlKGphdmF4LnhtbC53cy5SZXNwb25zZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7DQotCQl0cnl7DQotCQkJT2JqZWN0IG9iaiA9IHJlc3BvbnNlLmdldCgpOw0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJldHVyblR5cGUpew0KLQkJCQlSZXR1cm5UeXBlIHR5cGUgPSAoUmV0dXJuVHlwZSlvYmo7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PlJldHVybiBTdHJpbmcgPSAiICsgdHlwZS5nZXRSZXR1cm5TdHIoKSk7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJaWYob2JqIGluc3RhbmNlb2YgVHdvV2F5SG9sZGVyKXsNCi0JCQkJVHdvV2F5SG9sZGVyIHR3aCA9IChUd29XYXlIb2xkZXIpb2JqOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmNDYWxsYmFjayBIb2xkZXIgc3RyaW5nID0iICsgdHdoLmdldFR3b1dheUhvbGRlclN0cigpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jQ2FsbGJhY2sgSG9sZGVyIGludCA9IiArIHR3aC5nZXRUd29XYXlIb2xkZXJJbnQoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJfWNhdGNoKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKXsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfWNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9DQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9CYXJlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvQmFyZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzFlZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9CYXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWkuQmFyZURvY0xpdFNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgQmFyZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfVVJMID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0JhcmVEb2NMaXRTZXJ2aWNlLkRvY0xpdEJhcmVQb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgc29tZSBjaGFyYWN0ZXJzIHRoYXQgcmVxdWlyZSBYTUwgZW5jb2RpbmcNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTENIQVJTID0gIj4+PDw8Mz4+PjM+Pj4zIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShCYXJlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0NCi0gICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdEJhcmVQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QmFyZURvY0xpdFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiSGVsbG8gV29ybGQiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZyhyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSB0ZXN0IGFnYWluDQotICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nX3htbGVuY29kZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdEJhcmVQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QmFyZURvY0xpdFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksICJlY2hvU3RyaW5nIik7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxDSEFSUzsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmcocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgdGVzdCBhZ2Fpbg0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5U3luYygpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIHRyeXsNCi0NCi0gICAgICAgICAgICBCYXJlRG9jTGl0U2VydmljZSBzZXJ2aWNlID0gbmV3IEJhcmVEb2NMaXRTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0QmFyZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRCYXJlRG9jTGl0UG9ydCgpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAidHdvV2F5U2ltcGxlIik7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgRU5EUE9JTlRfVVJMKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50d29XYXlTaW1wbGUoMTApOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTeW5jIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2Fpbg0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkudHdvV2F5U2ltcGxlKDEwKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3luYyBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlTeW5jV2l0aEJvZHlSb3V0aW5nKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgdHJ5ew0KLQ0KLSAgICAgICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBEb2NMaXRCYXJlUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEJhcmVEb2NMaXRQb3J0KCk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LnR3b1dheVNpbXBsZSgxMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlN5bmMgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluDQotICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS50d29XYXlTaW1wbGUoMTApOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTeW5jIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZVdheUVtcHR5KCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgdHJ5ew0KLQ0KLSAgICAgICAgICAgIEJhcmVEb2NMaXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBEb2NMaXRCYXJlUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldEJhcmVEb2NMaXRQb3J0KCk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0NCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksDQotICAgICAgICAgICAgIm9uZVdheUVtcHR5Iik7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBFTkRQT0lOVF9VUkwpOw0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheUVtcHR5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluDQotICAgICAgICAgICAgcHJveHkub25lV2F5RW1wdHkoKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRExXTWluVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRExXTWluVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMGJkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0RMV01pblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWkuR3JlZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaS5UZXN0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLlRlc3RFeGNlcHRpb24yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLlRlc3RFeGNlcHRpb24zOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4udHlwZXMuVGVzdEJlYW47DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBETFdNaW5UZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKA0KLSAgICAgICAgICAgIE5BTUVTUEFDRSwgIkdyZWV0ZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoDQotICAgICAgICAgICAgTkFNRVNQQUNFLCAiR3JlZXRlclBvcnQiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvR3JlZXRlclNlcnZpY2UuR3JlZXRlckltcGxQb3J0IjsNCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShETFdNaW5UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgR3JlZXRlciBnZXRQcm94eShTdHJpbmcgYWN0aW9uKSB7DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIEdyZWV0ZXIgcHJveHkgPSBzZXJ2aWNlLmdldFBvcnQoUU5BTUVfUE9SVCwgR3JlZXRlci5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ow0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCBhY3Rpb24pOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICByZXR1cm4gcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgRGlzcGF0Y2g8U3RyaW5nPiBnZXREaXNwYXRjaChTdHJpbmcgYWN0aW9uKSB7DQotICAgICAgICAvLyBHZXQgYSBkaXNwYXRjaA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KFFOQU1FX1BPUlQsIG51bGwsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2g7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KA0KLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksIGFjdGlvbik7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHNpbXBsZSBncmVldE1lIG1ldGhvZCANCi0gICAgICogd2l0aCBzdHlsZSBkb2MvbGl0IHdyYXBwZWQgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2Ygd3JhcHBlciBjbGFzc2VzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEdyZWV0TWUoKSB7DQotICAgICAgICANCi0gICAgICAgIEdyZWV0ZXIgcHJveHkgPSBnZXRQcm94eSgiZ3JlZXRNZSIpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgbWUgPSAiU2NoZXUiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZ3JlZXRNZShtZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJIZWxsbyBTY2hldSIuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2Fpbg0KLSAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5ncmVldE1lKG1lKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkhlbGxvIFNjaGV1Ii5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3Qgc2ltcGxlIGdyZWV0TWUgbWV0aG9kIHdpdGggZGlzcGF0Y2ggDQotICAgICAqIHdpdGggc3R5bGUgZG9jL2xpdCB3cmFwcGVkIHdpdGhvdXQgdGhlIHByZXNlbmNlIG9mIHdyYXBwZXIgY2xhc3Nlcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHcmVldE1lX0Rpc3BhdGNoKCkgew0KLSAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgiZ3JlZXRNZSIpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9DQotICAgICAgICAgICAgIjxwcmU6Z3JlZXRNZSB4bWxuczpwcmU9J2h0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4nPiIgKw0KLSAgICAgICAgICAgICI8cHJlOnJlcXVlc3RUeXBlPlNjaGV1PC9wcmU6cmVxdWVzdFR5cGU+IiArDQotICAgICAgICAgICAgIjwvcHJlOmdyZWV0TWU+IjsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJEb2MvTGl0IFdyYXBwZWQgTWluaW1hbCBSZXF1ZXN0ID0iICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRG9jL0xpdCBXcmFwcGVkIE1pbmltYWwgUmVzcG9uc2UgPSIgKyByZXNwb25zZSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIkhlbGxvIFNjaGV1IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiZGx3bWluOmdyZWV0TWVSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjpyZXNwb25zZVR5cGUiKSB8fA0KLSAgICAgICAgICAgICAgICAgICByZXNwb25zZS5jb250YWlucygicmVzcG9uc2VUeXBlIHhtbG5zPSIpKTsgIC8vIGFzc2VydCB0aGF0IHJlc3BvbnNlIHR5cGUgaXMgYSBxdWFsaWZpZWQgZWxlbWVudA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2UuY29udGFpbnMoInhzaTp0eXBlIikpOyAvLyB4c2k6dHlwZSBzaG91bGQgbm90IGJlIHVzZWQNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJEb2MvTGl0IFdyYXBwZWQgTWluaW1hbCBSZXNwb25zZSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiSGVsbG8gU2NoZXUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJkbHdtaW46Z3JlZXRNZVJlc3BvbnNlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5jb250YWlucygiOnJlc3BvbnNlVHlwZSIpIHx8DQotICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbnRhaW5zKCJyZXNwb25zZVR5cGUgeG1sbnM9IikpOyAgLy8gYXNzZXJ0IHRoYXQgcmVzcG9uc2UgdHlwZSBpcyBhIHF1YWxpZmllZCBlbGVtZW50DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygieHNpOnR5cGUiKSk7IC8vIHhzaTp0eXBlIHNob3VsZCBub3QgYmUgdXNlZA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzaW1wbGUgZ3JlZXRNZSBtZXRob2QgDQotICAgICAqIHdpdGggc3R5bGUgZG9jL2xpdCB3cmFwcGVkIHdpdGhvdXQgdGhlIHByZXNlbmNlIG9mIHdyYXBwZXIgY2xhc3Nlcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbnF1YWxpZmllZCgpIHsNCi0gICAgICAgIA0KLSAgICAgICAgR3JlZXRlciBwcm94eSA9IGdldFByb3h5KCJ0ZXN0VW5xdWFsaWZpZWQiKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiaGVsbG8gd29ybGQiOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdFVucXVhbGlmaWVkKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGVsbG8gd29ybGQiLmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIGNhbGwgYWdhaW4NCi0gICAgICAgIHJlc3BvbnNlID0gcHJveHkudGVzdFVucXVhbGlmaWVkKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaGVsbG8gd29ybGQiLmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBzaW1wbGUgZ3JlZXRNZSBtZXRob2Qgd2l0aCBkaXNwYXRjaCANCi0gICAgICogd2l0aCBzdHlsZSBkb2MvbGl0IHdyYXBwZWQgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2Ygd3JhcHBlciBjbGFzc2VzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFVucXVhbGlmaWVkX0Rpc3BhdGNoKCkgew0KLSAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgidGVzdFVucXVhbGlmaWVkIik7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0NCi0gICAgICAgICAgICAiPHByZTp1bnF1YWxpZmllZFRlc3RSZXNwb25zZSB4bWxuczpwcmU9J2h0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4nPiIgKw0KLSAgICAgICAgICAgICI8dW5xdWFsaWZpZWRSZXF1ZXN0PmhlbGxvIHdvcmxkPC91bnF1YWxpZmllZFJlcXVlc3Q+IiArDQotICAgICAgICAgICAgIjwvcHJlOnVucXVhbGlmaWVkVGVzdFJlc3BvbnNlPiI7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRG9jL0xpdCBXcmFwcGVkIE1pbmltYWwgUmVxdWVzdCA9IiArIHJlcXVlc3QpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRvYy9MaXQgV3JhcHBlZCBNaW5pbWFsIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJoZWxsbyB3b3JsZCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImRsd21pbjp0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjx1bnF1YWxpZmllZFJlc3BvbnNlIikpOyAgLy8gYXNzZXJ0IHRoYXQgdGhlIGNoaWxkIGVsZW1lbnQgaXMgYW4gdXF1YWxpZmllZCBlbGVtZW50DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygieHNpOnR5cGUiKSk7IC8vIHhzaTp0eXBlIHNob3VsZCBub3QgYmUgdXNlZA0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkRvYy9MaXQgV3JhcHBlZCBNaW5pbWFsIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmNvbnRhaW5zKCJoZWxsbyB3b3JsZCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoImRsd21pbjp0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuY29udGFpbnMoIjx1bnF1YWxpZmllZFJlc3BvbnNlIikpOyAgLy8gYXNzZXJ0IHRoYXQgdGhlIGNoaWxkIGVsZW1lbnQgaXMgYW4gdXF1YWxpZmllZCBlbGVtZW50DQotICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZS5jb250YWlucygieHNpOnR5cGUiKSk7IC8vIHhzaTp0eXBlIHNob3VsZCBub3QgYmUgdXNlZA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBlY2hvIHdpdGggY29tcGxleFR5cGUgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc19FY2hvKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDAsIHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0RGF0YTEoKS5lcXVhbHMoImhlbGxvIHdvcmxkIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXREYXRhMigpID09IDEwKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIGNhbGwgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMCwgcmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXREYXRhMSgpLmVxdWFscygiaGVsbG8gd29ybGQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldERhdGEyKCkgPT0gMTApOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBjaGVja2VkIGV4Y2VwdGlvbiB3L28gYSBKQVhCIEJlYW4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzX0NoZWNrRXhjZXB0aW9uKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMSwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIHN1cHBvcnQgaWYgdGhlIGZhdWx0IGJlYW4gaXMgbWlzc2luZw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod3NlLmdldE1lc3NhZ2UoKS5jb250YWlucygiVXNlciBmYXVsdCBwcm9jZXNzaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKSk7DQotICAgICAgICB9IGNhdGNoIChUZXN0RXhjZXB0aW9uIHRlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJUZXN0RXhjZXB0aW9uIHRocm93biIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldEZsYWcoKSA9PSAxMjMpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBUZXN0RXhjZXB0aW9uIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDEsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24gdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyBzdXBwb3J0IGlmIHRoZSBmYXVsdCBiZWFuIGlzIG1pc3NpbmcNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdzZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlVzZXIgZmF1bHQgcHJvY2Vzc2luZyBpcyBub3Qgc3VwcG9ydGVkIikpOw0KLSAgICAgICAgfSBjYXRjaCAoVGVzdEV4Y2VwdGlvbiB0ZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGVzdEV4Y2VwdGlvbiB0aHJvd24iKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZS5nZXRGbGFnKCkgPT0gMTIzKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbiB0aHJvd24gYnV0IGZvdW5kICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGhhcyBhIEpBWEIgQmVhbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NfQ2hlY2tFeGNlcHRpb24yKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoNCwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbjIgdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChUZXN0RXhjZXB0aW9uMiB0ZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGVzdEV4Y2VwdGlvbjIgdGhyb3duIikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0RmxhZygpID09IDQ1Nik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24yIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkgdGhlIHNhbWUgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDQsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24yIHRocm93biIpOw0KLSAgICAgICAgfSBjYXRjaCAoVGVzdEV4Y2VwdGlvbjIgdGUpIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIlRlc3RFeGNlcHRpb24yIHRocm93biIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldEZsYWcoKSA9PSA0NTYpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBUZXN0RXhjZXB0aW9uMiB0aHJvd24gYnV0IGZvdW5kICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGlzIGEgY29tcGxpYW50IEpBWFdTIGV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NfQ2hlY2tFeGNlcHRpb24zKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoNSwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbjMgdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChUZXN0RXhjZXB0aW9uMyB0ZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0TWVzc2FnZSgpLmVxdWFscygiVGVzdEV4Y2VwdGlvbjMgdGhyb3duIikpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUodGUuZ2V0RmF1bHRJbmZvKCkuZ2V0RmxhZygpID09IDc4OSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24zIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSB0aGUgY2FsbCBhZ2FpbiB0byB2ZXJpZnkgdGhlIHNhbWUgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVGVzdEJlYW4gcmVzcG9uc2UgPSBwcm94eS5wcm9jZXNzKDUsIHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFRlc3RFeGNlcHRpb24zIHRocm93biIpOw0KLSAgICAgICAgfSBjYXRjaCAoVGVzdEV4Y2VwdGlvbjMgdGUpIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIlRlc3RFeGNlcHRpb24zIHRocm93biIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRlLmdldEZhdWx0SW5mbygpLmdldEZsYWcoKSA9PSA3ODkpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBUZXN0RXhjZXB0aW9uMyB0aHJvd24gYnV0IGZvdW5kICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aHJvd2luZyBXZWJTZXJ2aWNlRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc19XZWJTZXJ2aWNlRXhjZXB0aW9uKCkgIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBHcmVldGVyIHByb3h5ID0gZ2V0UHJveHkoInByb2Nlc3MiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdEJlYW4gcmVxdWVzdCA9IG5ldyBUZXN0QmVhbigpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMSgiaGVsbG8gd29ybGQiKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0RGF0YTIoMTApOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMiwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3c2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gdGhyb3duIGJ1dCBmb3VuZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluIHRvIHZlcmlmeSB0aGUgc2FtZSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMiwgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3c2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gdGhyb3duIGJ1dCBmb3VuZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhyb3dpbmcgTlBFDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc19OUEUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIEdyZWV0ZXIgcHJveHkgPSBnZXRQcm94eSgicHJvY2VzcyIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0QmVhbiByZXF1ZXN0ID0gbmV3IFRlc3RCZWFuKCk7DQotICAgICAgICByZXF1ZXN0LnNldERhdGExKCJoZWxsbyB3b3JsZCIpOw0KLSAgICAgICAgcmVxdWVzdC5zZXREYXRhMigxMCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFRlc3RCZWFuIHJlc3BvbnNlID0gcHJveHkucHJvY2VzcygzLCByZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3c2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiTlBFIHRocm93biIpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGJ1dCBmb3VuZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IHRoZSBjYWxsIGFnYWluIHRvIHZlcmlmeSB0aGUgc2FtZSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBUZXN0QmVhbiByZXNwb25zZSA9IHByb3h5LnByb2Nlc3MoMywgcmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIik7DQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUod3NlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIk5QRSB0aHJvd24iKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBidXQgZm91bmQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRG9jTGl0QmFyZU1pblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0RvY0xpdEJhcmVNaW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUzZTAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRG9jTGl0QmFyZU1pblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZW1pbi5zZWkuQmFyZURvY0xpdE1pblNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmVtaW4uc2VpLkRvY0xpdEJhcmVNaW5Qb3J0VHlwZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZU1pblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0RvY0xpdEJhcmVNaW5Qb3J0VHlwZUltcGxTZXJ2aWNlLkRvY0xpdEJhcmVNaW5Qb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERvY0xpdEJhcmVNaW5UZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIAkNCi0JDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIEJhcmVEb2NMaXRNaW5TZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQmFyZURvY0xpdE1pblNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdEJhcmVNaW5Qb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0QmFyZURvY0xpdE1pblBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcikgcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dCgNCi0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCAiZWNobyIpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiZGxyb1cgZWxsb0giOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNobyhyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgdGhlIGNhbGwgYWdhaW4gdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG8ocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHRzU2VydmljZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0ZhdWx0c1NlcnZpY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODFmZjllLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHRzU2VydmljZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2UuQmFzZUZhdWx0X0V4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZS5Db21wbGV4RmF1bHRfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkRlcml2ZWRGYXVsdDFfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkRlcml2ZWRGYXVsdDJfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkZhdWx0c1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2UuRmF1bHRzU2VydmljZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlLkludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2UuU2ltcGxlRmF1bHQ7DQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkJhc2VGYXVsdDsNCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuQ29tcGxleEZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQxOw0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIEZhdWx0c1NlcnZpY2VUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLSAgICANCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRmF1bHRzU2VydmljZS5GYXVsdHNQb3J0IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShGYXVsdHNTZXJ2aWNlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgcHJveHkNCi0gICAgICogQHJldHVybiBwcm94eQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgZ2V0UHJveHkoKSB7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRmF1bHRzU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHNQb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGF4aXNFbmRwb2ludCk7DQotICAgICAgICByZXR1cm4gcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHRoYXQgQmFzZUZhdWx0IGlzIHRocm93bg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UwKCkgew0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiQmFzZUZhdWx0IiwgMik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBnZXQgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBpbiB0aGlzIHRlc3RjYXNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBPYmplY3QgZmF1bHQgPSAoKEJhc2VGYXVsdF9FeGNlcHRpb24pZXhjZXB0aW9uKS5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0Q2xhc3MoKSA9PSBCYXNlRmF1bHQuY2xhc3MpOw0KLSAgICAgICAgQmFzZUZhdWx0IGJmID0gKEJhc2VGYXVsdCkgZmF1bHQ7DQotICAgICAgICBhc3NlcnRUcnVlKGJmLmdldEEoKSA9PSAyKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSANCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIkJhc2VGYXVsdCIsIDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgZ2V0IENvbXBsZXhGYXVsdF9FeGNlcHRpb24gaW4gdGhpcyB0ZXN0Y2FzZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgZmF1bHQgPSAoKEJhc2VGYXVsdF9FeGNlcHRpb24pZXhjZXB0aW9uKS5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0Q2xhc3MoKSA9PSBCYXNlRmF1bHQuY2xhc3MpOw0KLSAgICAgICAgYmYgPSAoQmFzZUZhdWx0KSBmYXVsdDsNCi0gICAgICAgIGFzc2VydFRydWUoYmYuZ2V0QSgpID09IDIpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBCYXNlRmF1bHQgKERlcml2ZWRGYXVsdDEpIGlzIHRocm93bg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UxKCkgew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiRGVyaXZlZEZhdWx0MSIsIDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgZ2V0IENvbXBsZXhGYXVsdF9FeGNlcHRpb24gaW4gdGhpcyB0ZXN0Y2FzZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgT2JqZWN0IGZhdWx0ID0gKChCYXNlRmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gRGVyaXZlZEZhdWx0MS5jbGFzcyk7DQotICAgICAgICBEZXJpdmVkRmF1bHQxIGRmID0gKERlcml2ZWRGYXVsdDEpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGRmLmdldEIoKS5lcXVhbHMoIkRlcml2ZWRGYXVsdDEiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIkRlcml2ZWRGYXVsdDEiLCAyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChCYXNlRmF1bHRfRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChDb21wbGV4RmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGdldCBDb21wbGV4RmF1bHRfRXhjZXB0aW9uIGluIHRoaXMgdGVzdGNhc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGZhdWx0ID0gKChCYXNlRmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gRGVyaXZlZEZhdWx0MS5jbGFzcyk7DQotICAgICAgICBkZiA9IChEZXJpdmVkRmF1bHQxKSBmYXVsdDsNCi0gICAgICAgIGFzc2VydFRydWUoZGYuZ2V0QSgpID09IDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRCKCkuZXF1YWxzKCJEZXJpdmVkRmF1bHQxIikpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBCYXNlRmF1bHQgKERlcml2ZWRGYXVsdDEpIGlzIHRocm93bg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UyKCkgew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiRGVyaXZlZEZhdWx0MiIsIDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgZ2V0IENvbXBsZXhGYXVsdF9FeGNlcHRpb24gaW4gdGhpcyB0ZXN0Y2FzZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgT2JqZWN0IGZhdWx0ID0gKChCYXNlRmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gRGVyaXZlZEZhdWx0Mi5jbGFzcyk7DQotICAgICAgICBEZXJpdmVkRmF1bHQyIGRmID0gKERlcml2ZWRGYXVsdDIpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGRmLmdldEIoKS5lcXVhbHMoIkRlcml2ZWRGYXVsdDIiKSk7ICANCi0gICAgICAgIGFzc2VydFRydWUoZGYuZ2V0QygpID09IDIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJEZXJpdmVkRmF1bHQyIiwgMik7DQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBnZXQgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiBpbiB0aGlzIHRlc3RjYXNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBmYXVsdCA9ICgoQmFzZUZhdWx0X0V4Y2VwdGlvbilleGNlcHRpb24pLmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRDbGFzcygpID09IERlcml2ZWRGYXVsdDIuY2xhc3MpOw0KLSAgICAgICAgZGYgPSAoRGVyaXZlZEZhdWx0MikgZmF1bHQ7DQotICAgICAgICBhc3NlcnRUcnVlKGRmLmdldEEoKSA9PSAyKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGYuZ2V0QigpLmVxdWFscygiRGVyaXZlZEZhdWx0MiIpKTsgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZi5nZXRDKCkgPT0gMik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHRoYXQgQ29tcGx4RmF1bHRGYXVsdCBpcyB0aHJvd24gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTMoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIkNvbXBsZXgiLCAyKTsgIC8vICJDb21wbGV4IiB3aWxsIGNhdXNlIHNlcnZpY2UgdG8gdGhyb3cgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKEJhc2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBnZXQgQmFzZUZhdWx0X0V4Y2VwdGlvbiBpbiB0aGlzIHRlc3RjYXNlIik7DQotICAgICAgICB9IGNhdGNoIChDb21wbGV4RmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgT2JqZWN0IGZhdWx0ID0gKChDb21wbGV4RmF1bHRfRXhjZXB0aW9uKWV4Y2VwdGlvbikuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldENsYXNzKCkgPT0gQ29tcGxleEZhdWx0LmNsYXNzKTsNCi0gICAgICAgIENvbXBsZXhGYXVsdCBjZiA9IChDb21wbGV4RmF1bHQpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGNmLmdldEIoKS5lcXVhbHMoIkNvbXBsZXgiKSk7ICANCi0gICAgICAgIGFzc2VydFRydWUoY2YuZ2V0QygpID09IDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXREKCkgPT0gNSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiQ29tcGxleCIsIDIpOyAgLy8gIkNvbXBsZXgiIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uDQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGdldCBCYXNlRmF1bHRfRXhjZXB0aW9uIGluIHRoaXMgdGVzdGNhc2UiKTsNCi0gICAgICAgIH0gY2F0Y2ggKENvbXBsZXhGYXVsdF9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBmYXVsdCA9ICgoQ29tcGxleEZhdWx0X0V4Y2VwdGlvbilleGNlcHRpb24pLmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRDbGFzcygpID09IENvbXBsZXhGYXVsdC5jbGFzcyk7DQotICAgICAgICBjZiA9IChDb21wbGV4RmF1bHQpIGZhdWx0Ow0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXRBKCkgPT0gMik7DQotICAgICAgICBhc3NlcnRUcnVlKGNmLmdldEIoKS5lcXVhbHMoIkNvbXBsZXgiKSk7ICANCi0gICAgICAgIGFzc2VydFRydWUoY2YuZ2V0QygpID09IDIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjZi5nZXREKCkgPT0gNSk7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aHJvd2luZyBvZiBTaW1wbGVGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2U0KCl7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJTTVBMIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIFNpbXBsZUZhdWx0IGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duICIpOw0KLSAgICAgICAgfWNhdGNoKFNpbXBsZUZhdWx0IGUpew0KLSAgICAgICAgICAgIFNpbXBsZUZhdWx0IGZhdWx0ID0gKFNpbXBsZUZhdWx0KSBlOw0KLQ0KLSAgICAgICAgICAgIGludCBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyA9PSAxMDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgU2ltcGxlRmF1bHQgYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJTTVBMIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIFNpbXBsZUZhdWx0IGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duICIpOw0KLSAgICAgICAgfWNhdGNoKFNpbXBsZUZhdWx0IGUpew0KLSAgICAgICAgICAgIFNpbXBsZUZhdWx0IGZhdWx0ID0gKFNpbXBsZUZhdWx0KSBlOw0KLQ0KLSAgICAgICAgICAgIGludCBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyA9PSAxMDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgU2ltcGxlRmF1bHQgYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhyb3dpbmcgbGVnYWN5IGZhdWx0DQotICAgICAqIERpc2FibGVkIHdoaWxlIEkgZml4IHRoaXMgdGVzdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2U1KCl7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgZmxvYXQgdG90YWwgPSBwcm94eS5nZXRRdW90ZSgiTEVHQyIpOw0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duICIpOw0KLSAgICAgICAgfWNhdGNoKEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbiBmYXVsdCA9IChJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uKSBlOw0KLQ0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHQuZ2V0TGVnYWN5RGF0YTEoKS5lcXVhbHMoIkxFR0MiKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRMZWdhY3lEYXRhMigpID09IDEyMyk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiB0aHJvd24uICBFeHBlY3RlZCBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIGJ1dCByZWNlaXZlZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJMRUdDIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIGZhdWx0ID0gKEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdC5nZXRMZWdhY3lEYXRhMSgpLmVxdWFscygiTEVHQyIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0LmdldExlZ2FjeURhdGEyKCkgPT0gMTIzKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV3JvbmcgZXhjZXB0aW9uIHRocm93bi4gIEV4cGVjdGVkIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24gYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aHJvd2luZyBvZiBCYXNlRmF1bHRfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTYoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJCQVNFIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEJhc2VGYXVsdF9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBCYXNlRmF1bHRfRXhjZXB0aW9uIGZhdWx0ID0gKEJhc2VGYXVsdF9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgQmFzZUZhdWx0IGZhdWx0SW5mbyA9IGZhdWx0LmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEEoKSA9PSA0MDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgQmFzZUZhdWx0X0V4Y2VwdGlvbiBidXQgcmVjZWl2ZWQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJCQVNFIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEJhc2VGYXVsdF9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goQmFzZUZhdWx0X0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBCYXNlRmF1bHRfRXhjZXB0aW9uIGZhdWx0ID0gKEJhc2VGYXVsdF9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgQmFzZUZhdWx0IGZhdWx0SW5mbyA9IGZhdWx0LmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEEoKSA9PSA0MDApOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgQmFzZUZhdWx0X0V4Y2VwdGlvbiBidXQgcmVjZWl2ZWQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhyb3dpbmcgb2YgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHNTZXJ2aWNlNygpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGZsb2F0IHRvdGFsID0gcHJveHkuZ2V0UXVvdGUoIkRGMSIpOw0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbiBidXQgbm8gZmF1bHQgd2FzIHRocm93biIpOw0KLSAgICAgICAgfWNhdGNoKERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGZhdWx0ID0gKERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uKSBlOw0KLQ0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDEgZmF1bHRJbmZvID0gZmF1bHQuZ2V0RmF1bHRJbmZvKCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8gIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8uZ2V0QSgpID09IDEwMCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8uZ2V0QigpLmVxdWFscygiREYxIikpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgZmxvYXQgdG90YWwgPSBwcm94eS5nZXRRdW90ZSgiREYxIik7DQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGJ1dCBubyBmYXVsdCB3YXMgdGhyb3duIik7DQotICAgICAgICB9Y2F0Y2goRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gZmF1bHQgPSAoRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MSBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRBKCkgPT0gMTAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRCKCkuZXF1YWxzKCJERjEiKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIldyb25nIGV4Y2VwdGlvbiB0aHJvd24uICBFeHBlY3RlZCBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbiBidXQgcmVjZWl2ZWQgIiArIGUuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHRocm93aW5nIG9mIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTgoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBmbG9hdCB0b3RhbCA9IHByb3h5LmdldFF1b3RlKCJERjIiKTsNCi0gICAgICAgICAgICBmYWlsKCAiRXhwZWN0ZWQgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24gYnV0IG5vIGZhdWx0IHdhcyB0aHJvd24gIik7DQotICAgICAgICB9Y2F0Y2goRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24gZmF1bHQgPSAoRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MiBmYXVsdEluZm8gPSBmYXVsdC5nZXRGYXVsdEluZm8oKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mbyAhPSBudWxsKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRBKCkgPT0gMjAwKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRCKCkuZXF1YWxzKCJERjIiKSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdEluZm8uZ2V0QygpID09IDgwLjBGKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiV3JvbmcgZXhjZXB0aW9uIHRocm93bi4gIEV4cGVjdGVkIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIGJ1dCByZWNlaXZlZCAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGZsb2F0IHRvdGFsID0gcHJveHkuZ2V0UXVvdGUoIkRGMiIpOw0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiBidXQgbm8gZmF1bHQgd2FzIHRocm93biAiKTsNCi0gICAgICAgIH1jYXRjaChEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiBmYXVsdCA9IChEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbikgZTsNCi0NCi0gICAgICAgICAgICBEZXJpdmVkRmF1bHQyIGZhdWx0SW5mbyA9IGZhdWx0LmdldEZhdWx0SW5mbygpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEEoKSA9PSAyMDApOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZmF1bHRJbmZvLmdldEIoKS5lcXVhbHMoIkRGMiIpKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZhdWx0SW5mby5nZXRDKCkgPT0gODAuMEYpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gdGhyb3duLiAgRXhwZWN0ZWQgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24gYnV0IHJlY2VpdmVkICIgKyBlLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aGF0IFNPQVBGYXVsdEV4Y2VwdGlvbiBpcyB0aHJvd24gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTlhKCl7DQotICAgICAgICBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJTT0FQRmF1bHRFeGNlcHRpb24iLCAyKTsgIC8vICJTT0FQRmF1bHRFeGNlcHRpb24iIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBTT0FQRmF1bHRFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiaGVsbG8gd29ybGQiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJhY3RvciIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldERldGFpbCgpID09IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJTT0FQRmF1bHRFeGNlcHRpb24iLCAyKTsgIC8vICJTT0FQRmF1bHRFeGNlcHRpb24iIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBTT0FQRmF1bHRFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBleGNlcHRpb247DQotICAgICAgICBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoImhlbGxvIHdvcmxkIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRBY3RvcigpLmVxdWFscygiYWN0b3IiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXREZXRhaWwoKSA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBTT0FQRmF1bHRFeGNlcHRpb24gaXMgdGhyb3duIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2U5Yigpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiU09BUEZhdWx0RXhjZXB0aW9uMiIsIDIpOyAgLy8gIlNPQVBGYXVsdEV4Y2VwdGlvbiIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IFNPQVBGYXVsdEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAvLyBPa2F5DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgYSBTT0FQRmF1bHRFeGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBleGNlcHRpb247DQotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJoZWxsbyB3b3JsZDIiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdEFjdG9yKCkuZXF1YWxzKCJhY3RvcjIiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXREZXRhaWwoKSAhPSBudWxsKTsNCi0gICAgICAgIERldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KSBzb2FwRmF1bHQuZ2V0RGV0YWlsKCkuZ2V0RGV0YWlsRW50cmllcygpLm5leHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRlLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygidXJuOi8vc2FtcGxlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImRldGFpbEVudHJ5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZS5nZXRWYWx1ZSgpLmVxdWFscygiVGV4YXMiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIlNPQVBGYXVsdEV4Y2VwdGlvbjIiLCAyKTsgIC8vICJTT0FQRmF1bHRFeGNlcHRpb24iIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBTT0FQRmF1bHRFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBleGNlcHRpb247DQotICAgICAgICBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoImhlbGxvIHdvcmxkMiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldEZhdWx0QWN0b3IoKS5lcXVhbHMoImFjdG9yMiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldERldGFpbCgpICE9IG51bGwpOw0KLSAgICAgICAgZGUgPSAoRGV0YWlsRW50cnkpIHNvYXBGYXVsdC5nZXREZXRhaWwoKS5nZXREZXRhaWxFbnRyaWVzKCkubmV4dCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoZGUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKCJ1cm46Ly9zYW1wbGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGRlLmdldExvY2FsTmFtZSgpLmVxdWFscygiZGV0YWlsRW50cnkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGRlLmdldFZhbHVlKCkuZXF1YWxzKCJUZXhhcyIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3RzIHRoYXQgdGhhdCBTT0FQRmF1bHRFeGNlcHRpb24gKE5QRSkgaXMgdGhyb3duIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0c1NlcnZpY2UxMCgpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiTlBFIiwgMik7ICAvLyAiTlBFIiB3aWxsIGNhdXNlIHNlcnZpY2UgdG8gdGhyb3cgTlBFIFN5c3RlbSBFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theQ0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJOUEUiLCAyKTsgIC8vICJOUEUiIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBOUEUgU3lzdGVtIEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAvLyBPa2F5DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgYSBTT0FQRmF1bHRFeGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aGF0IFNPQVBGYXVsdEV4Y2VwdGlvbiAoTlBFKSBpcyB0aHJvd24gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzU2VydmljZTEwYSgpew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiTlBFMiIsIDIpOyAgLy8gIk5QRSIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IE5QRSBTeXN0ZW0gRXhjZXB0aW9uDQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goU09BUEZhdWx0RXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIC8vIE9rYXkNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBhIFNPQVBGYXVsdEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIk51bGwgUG9pbnRlciBFeGNlcHRpb24gb2NjdXJyZWQiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gdGhlIGludm9rZSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiwgaWYgdGhlIHRlc3QgaXMgcGVyZm9ybWVkIHJpZ2h0DQotICAgICAgICAgICAgaW50IHRvdGFsID0gcHJveHkudGhyb3dGYXVsdCgyLCAiTlBFMiIsIDIpOyAgLy8gIk5QRSIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IE5QRSBTeXN0ZW0gRXhjZXB0aW9uDQotICAgICAgICAgICAgDQotICAgICAgICB9Y2F0Y2goU09BUEZhdWx0RXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIC8vIE9rYXkNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBhIFNPQVBGYXVsdEV4Y2VwdGlvbiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZXhjZXB0aW9uOw0KLSAgICAgICAgc29hcEZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0LmdldEZhdWx0U3RyaW5nKCkuZXF1YWxzKCJOdWxsIFBvaW50ZXIgRXhjZXB0aW9uIG9jY3VycmVkIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgdGhhdCB0aGF0IFNPQVBGYXVsdEV4Y2VwdGlvbiAoZm9yIFdlYlNlcnZpY2VFeGNlcHRpb24pIGlzIHRocm93biANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHNTZXJ2aWNlMTEoKXsNCi0gICAgICAgIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LnRocm93RmF1bHQoMiwgIldTRSIsIDIpOyAgLy8gIldTRSIgd2lsbCBjYXVzZSBzZXJ2aWNlIHRvIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24gU3lzdGVtIEV4Y2VwdGlvbg0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfWNhdGNoKFNPQVBGYXVsdEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAvLyBPa2F5Li4ub24gdGhlIGNsaWVudCBhIFNPQVBGYXVsdEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duDQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgYSBTT0FQRmF1bHRFeGNlcHRpb24iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoc29hcEZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKS5lcXVhbHMoIlRoaXMgaXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS50aHJvd0ZhdWx0KDIsICJXU0UiLCAyKTsgIC8vICJXU0UiIHdpbGwgY2F1c2Ugc2VydmljZSB0byB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uIFN5c3RlbSBFeGNlcHRpb24NCi0gICAgICAgICAgICANCi0gICAgICAgIH1jYXRjaChTT0FQRmF1bHRFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgLy8gT2theS4uLm9uIHRoZSBjbGllbnQgYSBTT0FQRmF1bHRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93bg0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGEgU09BUEZhdWx0RXhjZXB0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICANCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGV4Y2VwdGlvbjsNCi0gICAgICAgIHNvYXBGYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpLmVxdWFscygiVGhpcyBpcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24iKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyBSZXNvdXJjZSBpbmplY3Rpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUluamVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRmF1bHRzU2VydmljZVBvcnRUeXBlIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgZmxvYXQgdG90YWwgPSBwcm94eS5nZXRRdW90ZSgiSU5KRUNUSU9OIik7DQotICAgICAgICANCi0gICAgICAgIC8vIElmIHJlc291cmNlIGluamVjdGlvbiBvY2N1cnJlZCBwcm9wZXJseSwgdGhlbiB0aGUgYSB2YWx1ZSBvZiAxMjM0NTY3IGlzIGV4cGVjdGVkDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXNvdXJjZSBJbmplY3Rpb24gRmFpbGVkIiwgdG90YWwgPT0gMTIzNDU2Nyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRvdGFsID0gcHJveHkuZ2V0UXVvdGUoIklOSkVDVElPTiIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJZiByZXNvdXJjZSBpbmplY3Rpb24gb2NjdXJyZWQgcHJvcGVybHksIHRoZW4gdGhlIGEgdmFsdWUgb2YgMTIzNDU2NyBpcyBleHBlY3RlZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzb3VyY2UgSW5qZWN0aW9uIEZhaWxlZCIsIHRvdGFsID09IDEyMzQ1NjcpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHR5V2ViU2VydmljZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL0ZhdWx0eVdlYlNlcnZpY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc5NmExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvRmF1bHR5V2ViU2VydmljZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVNlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXA7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXBTZXJ2aWNlOw0KLWltcG9ydCBvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1wdWJsaWMgY2xhc3MgRmF1bHR5V2ViU2VydmljZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0ZhdWx0eVdlYlNlcnZpY2VTZXJ2aWNlLkZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEZhdWx0eVdlYlNlcnZpY2VUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotDQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHlXZWJTZXJ2aWNlKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgDQotICAgICAgICBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9CShCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LmZhdWx0eVdlYlNlcnZpY2UoMTApOw0KLQ0KLSAgICAgICAgfWNhdGNoKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24uZ2V0RmF1bHRJbmZvKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiZWFuIGN1c3RvbSBmYXVsdCBpbmZvIiwgZXhjZXB0aW9uLmdldEZhdWx0SW5mbygpLmdldEZhdWx0SW5mbygpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYmVhbiBjdXN0b20gbWVzc2FnZSIsIGV4Y2VwdGlvbi5nZXRGYXVsdEluZm8oKS5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSxheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIC8vIHRoZSBpbnZva2Ugd2lsbCB0aHJvdyBhbiBleGNlcHRpb24sIGlmIHRoZSB0ZXN0IGlzIHBlcmZvcm1lZCByaWdodA0KLSAgICAgICAgICAgIGludCB0b3RhbCA9IHByb3h5LmZhdWx0eVdlYlNlcnZpY2UoMTApOw0KLQ0KLSAgICAgICAgfWNhdGNoKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24uZ2V0RmF1bHRJbmZvKCkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiZWFuIGN1c3RvbSBmYXVsdCBpbmZvIiwgZXhjZXB0aW9uLmdldEZhdWx0SW5mbygpLmdldEZhdWx0SW5mbygpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiYmVhbiBjdXN0b20gbWVzc2FnZSIsIGV4Y2VwdGlvbi5nZXRGYXVsdEluZm8oKS5nZXRNZXNzYWdlKCkpOw0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHlXZWJTZXJ2aWNlX2JhZEVuZHBvaW50KCl7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaG9zdCA9ICJ0aGlzLmlzLmEuYmFkLmVuZHBvaW50LnRlcnJpYmxlLmluLmZhY3QiOw0KLSAgICAgICAgU3RyaW5nIGJhZEVuZHBvaW50ID0gImh0dHA6Ly8iICsgaG9zdDsNCi0NCi0gICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlKDEwKTsNCi0NCi0gICAgICAgIH1jYXRjaChGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgZ2V0IHRoaXMgZXhjZXB0aW9uDQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfWNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJUaGlzIHRlc3RjYXNlIHNob3VsZCBvbmx5IHByb2R1Y2UgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uLiAgV2UgZ290OiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24uZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZihob3N0KSE9LTEpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0gKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICAvLyB0aGUgaW52b2tlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLCBpZiB0aGUgdGVzdCBpcyBwZXJmb3JtZWQgcmlnaHQNCi0gICAgICAgICAgICBpbnQgdG90YWwgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlKDEwKTsNCi0NCi0gICAgICAgIH1jYXRjaChGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBzaG91bGRuJ3QgZ2V0IHRoaXMgZXhjZXB0aW9uDQotICAgICAgICAgICAgZmFpbChlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfWNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJUaGlzIHRlc3RjYXNlIHNob3VsZCBvbmx5IHByb2R1Y2UgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uLiAgV2UgZ290OiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24uZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZihob3N0KSE9LTEpOw0KLQ0KLSAgICB9DQotDQotICAgIC8vIFRPRE8gc2hvdWxkIGFsc28gaGF2ZSBhbiBpbnZva2Ugb25ld2F5IGJhZCBlbmRwb2ludCB0ZXN0IHRvIG1ha2Ugc3VyZQ0KLSAgICAvLyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGFzIGluZGljYXRlZCBpbiBKQVhXUyA2LjQuMi4NCi0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0eVdlYlNlcnZpY2VfYmFkRW5kcG9pbnRfb25lV2F5KCkgew0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSAidGhpcy5pcy5hLmJhZC5lbmRwb2ludC50ZXJyaWJsZS5pbi5mYWN0IjsNCi0gICAgICAgIFN0cmluZyBiYWRFbmRwb2ludCA9ICJodHRwOi8vIiArIGhvc3Q7DQotICAgICAgICANCi0gICAgICAgIERvY0xpdFdyYXBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRG9jTGl0V3JhcFNlcnZpY2UoKTsNCi0gICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBzZXJ2aWNlLmdldERvY0xpdFdyYXBQb3J0KCk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLGJhZEVuZHBvaW50KTsNCi0gICAgICAgIA0KLSAgICAgICANCi0NCi0gICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gbnVsbDsNCi0gICAgICAgICAgIA0KLSAgICAgICAgICAgIHByb3h5Lm9uZVdheVZvaWQoKTsNCi0NCi0gICAgICAgIH1jYXRjaChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBlOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiVGhpcyB0ZXN0Y2FzZSBzaG91bGQgb25seSBwcm9kdWNlIGEgV2ViU2VydmljZUV4Y2VwdGlvbi4gIFdlIGdvdDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleGNlcHRpb24uZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVua25vd25Ib3N0RXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpLmluZGV4T2YoaG9zdCkhPS0xKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICAgICANCi0gICAgICAgICAgICBwcm94eS5vbmVXYXlWb2lkKCk7DQotDQotICAgICAgICB9Y2F0Y2goV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlRoaXMgdGVzdGNhc2Ugc2hvdWxkIG9ubHkgcHJvZHVjZSBhIFdlYlNlcnZpY2VFeGNlcHRpb24uICBXZSBnb3Q6ICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXhjZXB0aW9uKTsNCi0gICAgICAgIGFzc2VydFRydWUoZXhjZXB0aW9uLmdldENhdXNlKCkgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbik7DQotICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKS5pbmRleE9mKGhvc3QpIT0tMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0eVdlYlNlcnZpY2VfYmFkRW5kcG9pbnRfQXN5bmNDYWxsYmFjaygpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSAidGhpcy5pcy5hLmJhZC5lbmRwb2ludC50ZXJyaWJsZS5pbi5mYWN0IjsNCi0gICAgICAgIFN0cmluZyBiYWRFbmRwb2ludCA9ICJodHRwOi8vIiArIGhvc3Q7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgIEZhdWx0eUFzeW5jSGFuZGxlciBjYWxsYmFjayA9IG5ldyBGYXVsdHlBc3luY0hhbmRsZXIoKTsNCi0gICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlQXN5bmMoMSwgY2FsbGJhY2spOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jIGludm9jYXRpb24gaW5jb21wbGV0ZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRXhjZXB0aW9uIGUgPSBjYWxsYmFjay5nZXRFeGNlcHRpb24oKTsNCi0NCi0gICAgICAgIC8vIFNlY3Rpb24gNC4zLjMgc3RhdGVzIHRoYXQgdGhlIHRvcCBsZXZlbCBFeGNlcHRpb24gc2hvdWxkIGJlDQotICAgICAgICAvLyBhbiBFeGVjdXRpb25FeGNlcHRpb24sIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHVuZGVybmVhdGguDQotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgZXhjZXB0aW9uIHdhcyBudWxsLiIsIGUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHRocm93biBleGNlcHRpb24gc2hvdWxkIGJlIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbi4iLCBlDQotICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmVxdWFscyhFeGVjdXRpb25FeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIGFzc2VydFRydWUoDQotICAgICAgICAgICAgICAgICAgICJUaGUgZXhwZWN0ZWQgZmF1bHQgdHlwZSB1bmRlciB0aGUgRXhlY3V0aW9uRXhjZXB0aW9uIHNob3VsZCBiZSBhICINCi0gICAgICAgICAgICAgICAgICAgKyAiU09BUEZhdWx0RXhjZXB0aW9uLiAgRm91bmQgdHlwZTogIg0KLSAgICAgICAgICAgICAgICAgICArIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKQ0KLSAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlRnJvbShTT0FQRmF1bHRFeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgY2FsbGJhY2sgPSBuZXcgRmF1bHR5QXN5bmNIYW5kbGVyKCk7DQotICAgICAgICBmdXR1cmUgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlQXN5bmMoMSwgY2FsbGJhY2spOw0KLQ0KLSAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jIGludm9jYXRpb24gaW5jb21wbGV0ZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZSA9IGNhbGxiYWNrLmdldEV4Y2VwdGlvbigpOw0KLQ0KLSAgICAgICAgLy8gU2VjdGlvbiA0LjMuMyBzdGF0ZXMgdGhhdCB0aGUgdG9wIGxldmVsIEV4Y2VwdGlvbiBzaG91bGQgYmUNCi0gICAgICAgIC8vIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdW5kZXJuZWF0aC4NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBleGNlcHRpb24gd2FzIG51bGwuIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyb3duIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gRXhlY3V0aW9uRXhjZXB0aW9uLiIsIGUNCi0gICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCkuZXF1YWxzKEV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgNCi0gICAgICAgICAgICAgICAgICAgIlRoZSBleHBlY3RlZCBmYXVsdCB0eXBlIHVuZGVyIHRoZSBFeGVjdXRpb25FeGNlcHRpb24gc2hvdWxkIGJlIGEgIg0KLSAgICAgICAgICAgICAgICAgICArICJTT0FQRmF1bHRFeGNlcHRpb24uICBGb3VuZCB0eXBlOiAiDQotICAgICAgICAgICAgICAgICAgICsgZS5nZXRDYXVzZSgpLmdldENsYXNzKCksIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpDQotICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVGcm9tKFNPQVBGYXVsdEV4Y2VwdGlvbi5jbGFzcykpOw0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdHlXZWJTZXJ2aWNlX2JhZEVuZHBvaW50X0FzeW5jUG9sbGluZygpDQotICAgIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nIGhvc3QgPSAidGhpcy5pcy5hLmJhZC5lbmRwb2ludC50ZXJyaWJsZS5pbi5mYWN0IjsNCi0gICAgICAgIFN0cmluZyBiYWRFbmRwb2ludCA9ICJodHRwOi8vIiArIGhvc3Q7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZEVuZHBvaW50KTsNCi0NCi0gICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBwcm94eS5mYXVsdHlXZWJTZXJ2aWNlQXN5bmMoMSk7DQotICAgICAgICB3aGlsZSAoIWZ1dHVyZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBpbmNvbXBsZXRlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBmdXR1cmUuZ2V0KCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTZWN0aW9uIDQuMy4zIHN0YXRlcyB0aGF0IHRoZSB0b3AgbGV2ZWwgRXhjZXB0aW9uIHNob3VsZCBiZQ0KLSAgICAgICAgLy8gYW4gRXhlY3V0aW9uRXhjZXB0aW9uLCB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB1bmRlcm5lYXRoLg0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGV4Y2VwdGlvbiB3YXMgbnVsbC4iLCBlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSB0aHJvd24gZXhjZXB0aW9uIHNob3VsZCBiZSBhbiBFeGVjdXRpb25FeGNlcHRpb24uIiwgZQ0KLSAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5lcXVhbHMoRXhlY3V0aW9uRXhjZXB0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnRUcnVlKA0KLSAgICAgICAgICAgICAgICAgICAiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiDQotICAgICAgICAgICAgICAgICAgICsgIlNPQVBGYXVsdEV4Y2VwdGlvbi4gIEZvdW5kIHR5cGU6ICINCi0gICAgICAgICAgICAgICAgICAgKyBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSwgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkNCi0gICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUZyb20oU09BUEZhdWx0RXhjZXB0aW9uLmNsYXNzKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcHJveHkuZmF1bHR5V2ViU2VydmljZUFzeW5jKDEpOw0KLSAgICAgICAgd2hpbGUgKCFmdXR1cmUuaXNEb25lKCkpIHsNCi0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFzeW5jIGludm9jYXRpb24gaW5jb21wbGV0ZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBmdXR1cmUuZ2V0KCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICBlID0gZXg7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTZWN0aW9uIDQuMy4zIHN0YXRlcyB0aGF0IHRoZSB0b3AgbGV2ZWwgRXhjZXB0aW9uIHNob3VsZCBiZQ0KLSAgICAgICAgLy8gYW4gRXhlY3V0aW9uRXhjZXB0aW9uLCB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB1bmRlcm5lYXRoLg0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGV4Y2VwdGlvbiB3YXMgbnVsbC4iLCBlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSB0aHJvd24gZXhjZXB0aW9uIHNob3VsZCBiZSBhbiBFeGVjdXRpb25FeGNlcHRpb24uIiwgZQ0KLSAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5lcXVhbHMoRXhlY3V0aW9uRXhjZXB0aW9uLmNsYXNzKSk7DQotICAgICAgICBhc3NlcnRUcnVlKA0KLSAgICAgICAgICAgICAgICAgICAiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiDQotICAgICAgICAgICAgICAgICAgICsgIlNPQVBGYXVsdEV4Y2VwdGlvbi4gIEZvdW5kIHR5cGU6ICINCi0gICAgICAgICAgICAgICAgICAgKyBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSwgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkNCi0gICAgICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUZyb20oU09BUEZhdWx0RXhjZXB0aW9uLmNsYXNzKSk7DQotDQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogVGVzdHMgZmF1bHQgcHJvY2Vzc2luZyBmb3IgdXNlciBkZWZpbmVkIGZhdWx0IHR5cGVzDQotICAgICAqLyAgICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tRmF1bHRfQXN5bmNDYWxsYmFjaygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpOw0KLSAgICAgICAgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXRGYXVsdHlXZWJTZXJ2aWNlUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICBGYXVsdHlBc3luY0hhbmRsZXIgY2FsbGJhY2sgPSBuZXcgRmF1bHR5QXN5bmNIYW5kbGVyKCk7DQotICAgICAgICBGdXR1cmU8Pz4gZnV0dXJlID0gcHJveHkuZmF1bHR5V2ViU2VydmljZUFzeW5jKDEsIGNhbGxiYWNrKTsNCi0NCi0gICAgICAgIHdoaWxlICghZnV0dXJlLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJBc3luYyBpbnZvY2F0aW9uIGluY29tcGxldGUiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEV4Y2VwdGlvbiBlID0gY2FsbGJhY2suZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLQ0KLSAgICAgICAgLy8gU2VjdGlvbiA0LjMuMyBzdGF0ZXMgdGhhdCB0aGUgdG9wIGxldmVsIEV4Y2VwdGlvbiBzaG91bGQgYmUNCi0gICAgICAgIC8vIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdW5kZXJuZWF0aC4NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBleGNlcHRpb24gd2FzIG51bGwuIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyb3duIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gRXhlY3V0aW9uRXhjZXB0aW9uLiIsIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZXF1YWxzKEV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiICsNCi0gICAgICAgICAgICAgICAgICAgIkZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uICBGb3VuZCB0eXBlOiAiICsgZS5nZXRDYXVzZSgpLmdldENsYXNzKCksIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICBjYWxsYmFjayA9IG5ldyBGYXVsdHlBc3luY0hhbmRsZXIoKTsNCi0gICAgICAgIGZ1dHVyZSA9IHByb3h5LmZhdWx0eVdlYlNlcnZpY2VBc3luYygxLCBjYWxsYmFjayk7DQotDQotICAgICAgICB3aGlsZSAoIWZ1dHVyZS5pc0RvbmUoKSkgew0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQXN5bmMgaW52b2NhdGlvbiBpbmNvbXBsZXRlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBlID0gY2FsbGJhY2suZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLQ0KLSAgICAgICAgLy8gU2VjdGlvbiA0LjMuMyBzdGF0ZXMgdGhhdCB0aGUgdG9wIGxldmVsIEV4Y2VwdGlvbiBzaG91bGQgYmUNCi0gICAgICAgIC8vIGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdW5kZXJuZWF0aC4NCi0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBleGNlcHRpb24gd2FzIG51bGwuIiwgZSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyb3duIGV4Y2VwdGlvbiBzaG91bGQgYmUgYW4gRXhlY3V0aW9uRXhjZXB0aW9uLiIsIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZXF1YWxzKEV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcykpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGV4cGVjdGVkIGZhdWx0IHR5cGUgdW5kZXIgdGhlIEV4ZWN1dGlvbkV4Y2VwdGlvbiBzaG91bGQgYmUgYSAiICsNCi0gICAgICAgICAgICAgICAgICAgIkZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uICBGb3VuZCB0eXBlOiAiICsgZS5nZXRDYXVzZSgpLmdldENsYXNzKCksIA0KLSAgICAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uY2xhc3MpKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBBIGNhbGxiYWNrIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29sbGVjdCB0aGUgZXhjZXB0aW9ucw0KLSAgICAgKi8NCi0gICAgY2xhc3MgRmF1bHR5QXN5bmNIYW5kbGVyIGltcGxlbWVudHMgQXN5bmNIYW5kbGVyPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gew0KLQ0KLSAgICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbjsNCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gcmVzcG9uc2UpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiRmF1bHR5QXN5bmNIYW5kbGVyLmhhbmRsZVJlc3BvbnNlKCkgd2FzIGNhbGxlZCIpOw0KLSAgICAgICAgICAgICAgICBGYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UgciA9IHJlc3BvbnNlLmdldCgpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTm8gZXhjZXB0aW9uIHdhcyB0aHJvd24gZnJvbSBSZXNwb25zZS5nZXQoKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duOiAiICsgZS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvTXRvbVNhbXBsZUJ5dGVBcnJheVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL010b21TYW1wbGVCeXRlQXJyYXlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDZhNzljLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvTXRvbVNhbXBsZUJ5dGVBcnJheVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLkludm9rZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuU2VuZEltYWdlUmVzcG9uc2U7DQotaW1wb3J0IG9yZy53My5fMjAwNS5fMDUueG1sbWltZS5CYXNlNjRCaW5hcnk7DQotDQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVCeXRlQXJyYXlUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9TRVJWSUNFID0gbmV3IFFOYW1lKCJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJTZW5kSW1hZ2VTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1BPUlQgICAgPSBuZXcgUU5hbWUoInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgInNlbmRJbWFnZVNvYXAiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU2VuZEltYWdlU2VydmljZS5zZW5kSW1hZ2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0RJUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKStGaWxlLnNlcGFyYXRvcisidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJpbWFnZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShNdG9tU2FtcGxlQnl0ZUFycmF5VGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRW5hYmxlIGF0dGFjaG1lbnQgT3B0aW1pemF0aW9uIHRocm91Z2ggdGhlIFNPQVBCaW5kaW5nIG1ldGhvZCANCi0gICAgICogLS0gc2V0TVRPTUVuYWJsZWQoW3RydWV8ZmFsc2VdKQ0KLSAgICAgKiBVc2luZyBTT0FQMTENCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0QXR0YWNobWVudEJ5dGVBcnJheUFQSTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAJDQotICAgICAgCVN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgIAkJDQotICAgICAgCVNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgCXN2Yy5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAJDQotICAgICAgCUpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMSIpOw0KLSAgICAgIAlEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgIAkNCi0gICAgICAJU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZylkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgCWJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgCQ0KLSAgICAgIAlJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZCAobmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKSk7DQotICAgICAgCUltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgIAlpbWFnZURlcG90LnNldEltYWdlRGF0YShpbWFnZSk7DQotICAgICAgICBzZXRUZXh0KGltYWdlRGVwb3QpOw0KLSAgICAgIAkNCi0gICAgICAJLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAJT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAJSW52b2tlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUludm9rZSgpOw0KLSAgICAgIAlyZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgIAkNCi0gICAgICAJU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAJDQotICAgICAgCWFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICBjaGVja1RleHQocmVzcG9uc2UuZ2V0T3V0cHV0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgY2hlY2tUZXh0KHJlc3BvbnNlLmdldE91dHB1dCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRGlzYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiB0aHJvdWdoIHRoZSBTT0FQQmluZGluZyBtZXRob2QgDQotICAgICAqIC0tIHNldE1UT01FbmFibGVkKFt0cnVlfGZhbHNlXSkNCi0gICAgICogVXNpbmcgU09BUDExDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNobWVudEJ5dGVBcnJheUFQSTExX0NsaWVudFNlbmRzTm9uT3B0aW1pemVkTVRPTSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEiKTsNCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpZGlzcGF0Y2guZ2V0QmluZGluZygpOw0KLSAgICAgICAgYmluZGluZy5zZXRNVE9NRW5hYmxlZChmYWxzZSk7ICAvLyBEaXNhYmxpbmcgTVRPTSBvcHRpbWl6YXRpb24gb24gY2xpZW50LCBidXQgc2VydmVyIHdpbGwgcmVzcG9uZCB3aXRoIG9wdGltaXplZCBNVE9NDQotICAgICAgICANCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkIChuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpKTsNCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoaW1hZ2UpOw0KLSAgICAgICAgc2V0VGV4dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUNCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBJbnZva2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlSW52b2tlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgY2hlY2tUZXh0KHJlc3BvbnNlLmdldE91dHB1dCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIGNoZWNrVGV4dChyZXNwb25zZS5nZXRPdXRwdXQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbiB1c2luZyB0aGUgU09BUDExIGJpbmRpbmcNCi0gICAgICogcHJvcGVydHkgZm9yIE1UT00uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNobWVudEJ5dGVBcnJheVByb3BlcnR5MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgCQ0KLSAgICAgIAlTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAJCQ0KLSAgICAgIAlTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgIAlzdmMuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORywgVVJMX0VORFBPSU5UKTsNCi0gICAgICAJDQotICAgICAgCUpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMSIpOw0KLSAgICAgIAlEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIGpiYywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgIAkNCi0gICAgICAJSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQgKG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIikpOw0KLSAgICAgIAlJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAJaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoaW1hZ2UpOw0KLSAgICAgICAgc2V0VGV4dChpbWFnZURlcG90KTsNCi0gICAgICAJDQotICAgICAgCS8vQ3JlYXRlIGEgcmVxdWVzdCBiZWFuIHdpdGggaW1hZ2VkZXBvdCBiZWFuIGFzIHZhbHVlDQotICAgICAgCU9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgCUludm9rZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVJbnZva2UoKTsNCi0gICAgICAJcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAJDQotICAgICAgCVNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgCQ0KLSAgICAgIAlhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgY2hlY2tUZXh0KHJlc3BvbnNlLmdldE91dHB1dCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIGNoZWNrVGV4dChyZXNwb25zZS5nZXRPdXRwdXQoKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRleHQgPSAiQmluYXJ5IEF0dGFjaG1lbnRzIGFyZSByYWRpY2FsIjsNCi0gICAgcHJpdmF0ZSB2b2lkIHNldFRleHQoSW1hZ2VEZXBvdCBkZXBvdCkgew0KLSAgICAgICAgDQotICAgICAgICBCYXNlNjRCaW5hcnkgYmluYXJ5ID0gbmV3IEJhc2U2NEJpbmFyeSgpOw0KLSAgICAgICAgYmluYXJ5LnNldENvbnRlbnRUeXBlKCIiKTsNCi0gICAgICAgIGJpbmFyeS5zZXRWYWx1ZSh0ZXh0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgZGVwb3Quc2V0VGV4dERhdGEoYmluYXJ5KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGV4dChJbWFnZURlcG90IGRlcG90KSB7DQotICAgICAgICBCYXNlNjRCaW5hcnkgYmluYXJ5ID0gZGVwb3QuZ2V0VGV4dERhdGEoKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluYXJ5ICE9IG51bGwpOw0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gYmluYXJ5LmdldENvbnRlbnRUeXBlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCIiLmVxdWFscyhjb250ZW50VHlwZSkpOw0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gYmluYXJ5LmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJ5dGVzICE9IG51bGwpOw0KLSAgICAgICAgU3RyaW5nIHRoZVRleHQgPSBuZXcgU3RyaW5nKGJ5dGVzKTsNCi0gICAgICAgIGFzc2VydFRydWUodGV4dC5lcXVhbHModGhlVGV4dCkpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL010b21TYW1wbGVUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9NdG9tU2FtcGxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhZmJmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL010b21TYW1wbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuRGF0YVNvdXJjZUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uU2VuZEltYWdlOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLlNlbmRJbWFnZVJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uRmlsZUltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1NFUlZJQ0UgPSBuZXcgUU5hbWUoInVybjovL210b20udGVzdC5vcmciLCAiTXRvbVNhbXBsZVNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfUE9SVCAgICA9IG5ldyBRTmFtZSgidXJuOi8vbXRvbS50ZXN0Lm9yZyIsICJNdG9tU2FtcGxlIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVTZXJ2aWNlUG9ydCI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORFBPSU5UX01UT01ESVNBQkxFID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NRGlzYWJsZVNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVF9NVE9NRElTQUJMRTIgPSANCi0gICAgICAgICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvTXRvbVNhbXBsZVNlcnZpY2UuTXRvbVNhbXBsZU1UT01EaXNhYmxlMlNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVF9NVE9NRU5BQkxFID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NRW5hYmxlU2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORFBPSU5UX01UT01ERUZBVUxUID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NRGVmYXVsdFNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FTkRQT0lOVF9NVE9NVEhSRVNIT0xEID0gDQotICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlLk10b21TYW1wbGVNVE9NVGhyZXNob2xkU2VydmljZVBvcnQiOw0KLSAgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0LXJlc291cmNlcyIrRmlsZS5zZXBhcmF0b3IrImltYWdlIjsgICANCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gQ0hFQ0tfVkVSU0lPTk1JU01BVENIID0gdHJ1ZTsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShNdG9tU2FtcGxlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBPcHRpbWl6YXRpb24gdGhyb3VnaCB0aGUgU09BUEJpbmRpbmcgbWV0aG9kIA0KLSAgICAgKiAtLSBzZXRNVE9NRW5hYmxlZChbdHJ1ZXxmYWxzZV0pDQotICAgICAqIFVzaW5nIFNPQVAxMQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRJbWFnZUF0dGFjaG1lbnRBUEkxMSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uDQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBPcHRpbWl6YXRpb24gdGhyb3VnaCB0aGUgTVRPTUZlYXR1cmUNCi0gICAgICogVXNpbmcgU09BUDExDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlRmVhdHVyZTExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tMjEgPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaW50IG51bUNJRHMgPSAoY2lkcyA9PSBudWxsKSA/IDAgOiBjaWRzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG9uZSBhdHRhY2htZW50IGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgYnV0IHRoZXJlIHdlcmU6IiArIG51bUNJRHMsIG51bUNJRHMgPT0gMSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiBidXQgY2FsbCBhbiBlbmRwb2ludCB3aXRoIEBNVE9NKGVuYWJsZT1mYWxzZSkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VfTVRPTURpc2FibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZWNlc3NhcnkgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIE1UT01GZWF0dXJlIG10b20yMSA9IG5ldyBNVE9NRmVhdHVyZSgpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVF9NVE9NRElTQUJMRSk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCwgbXRvbTIxKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCBjaWRzID0gbnVsbDsNCi0gICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcodHJ1ZSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGUgY2lkcyBhcmUgY29sbGVjdGVkIGluIHRoZSBtb25pdG9yLiAgV2Ugd2lsbCBjaGVjaw0KLSAgICAgICAgICAgIC8vIHRoaXMgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBtdG9tIGlzIG5vdCBpbmxpbmVkDQotICAgICAgICAgICAgY2lkcyA9IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5nZXRCbG9iQ0lEcygpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBpbnQgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgemVybyBhdHRhY2htZW50cyBidXQgdGhlcmUgd2VyZToiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgemVybyBhdHRhY2htZW50cyBidXQgdGhlcmUgd2VyZToiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRW5hYmxlIGF0dGFjaG1lbnQgT3B0aW1pemF0aW9uIGJ1dCBjYWxsIGFuIGVuZHBvaW50IHdpdGggQE1UT00oZW5hYmxlPWZhbHNlKQ0KLSAgICAgKiB3aGljaCBzaG91bGQgb3ZlcnJpZGUgdGhlIE1UT00gQmluZGluZ1R5cGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VfTVRPTURpc2FibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tMjEgPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlRfTVRPTURJU0FCTEUyKTsNCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFFOQU1FX1BPUlQsIGpiYywgTW9kZS5QQVlMT0FELCBtdG9tMjEpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0IGNpZHMgPSBudWxsOw0KLSAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRoZSBjaWRzIGFyZSBjb2xsZWN0ZWQgaW4gdGhlIG1vbml0b3IuICBXZSB3aWxsIGNoZWNrDQotICAgICAgICAgICAgLy8gdGhpcyB0byBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIG10b20gaXMgbm90IGlubGluZWQNCi0gICAgICAgICAgICBjaWRzID0gSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmdldEJsb2JDSURzKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGludCBudW1DSURzID0gKGNpZHMgPT0gbnVsbCkgPyAwIDogY2lkcy5zaXplKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB6ZXJvIGF0dGFjaG1lbnRzIGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDApOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcodHJ1ZSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGUgY2lkcyBhcmUgY29sbGVjdGVkIGluIHRoZSBtb25pdG9yLiAgV2Ugd2lsbCBjaGVjaw0KLSAgICAgICAgICAgIC8vIHRoaXMgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBtdG9tIGlzIG5vdCBpbmxpbmVkDQotICAgICAgICAgICAgY2lkcyA9IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5nZXRCbG9iQ0lEcygpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBudW1DSURzID0gKGNpZHMgPT0gbnVsbCkgPyAwIDogY2lkcy5zaXplKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB6ZXJvIGF0dGFjaG1lbnRzIGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDApOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBPcHRpbWl6YXRpb24gYnV0IGNhbGwgYW4gZW5kcG9pbnQgd2l0aCBATVRPTShlbmFibGU9dHJ1ZSkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VfTVRPTUVuYWJsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgTVRPTUZlYXR1cmUgbXRvbTIxID0gbmV3IE1UT01GZWF0dXJlKCk7DQotDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgVVJMX0VORFBPSU5UX01UT01FTkFCTEUpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaW50IG51bUNJRHMgPSAoY2lkcyA9PSBudWxsKSA/IDAgOiBjaWRzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG9uZSBhdHRhY2htZW50IGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgYnV0IHRoZXJlIHdlcmU6IiArIG51bUNJRHMsIG51bUNJRHMgPT0gMSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiBidXQgY2FsbCBhbiBlbmRwb2ludCB3aXRoIEBNVE9NDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlX01UT01EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tMjEgPSBuZXcgTVRPTUZlYXR1cmUoKTsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlRfTVRPTURFRkFVTFQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaW50IG51bUNJRHMgPSAoY2lkcyA9PSBudWxsKSA/IDAgOiBjaWRzLnNpemUoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG9uZSBhdHRhY2htZW50IGJ1dCB0aGVyZSB3ZXJlOiIgKyBudW1DSURzLCBudW1DSURzID09IDEpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHJlc3BvbnNlID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcodHJ1ZSk7DQotICAgICAgICAgICAgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGUgY2lkcyBhcmUgY29sbGVjdGVkIGluIHRoZSBtb25pdG9yLiAgV2Ugd2lsbCBjaGVjaw0KLSAgICAgICAgICAgIC8vIHRoaXMgdG8gbWFrZSBzdXJlIHRoZSByZXNwb25zZSBtdG9tIGlzIG5vdCBpbmxpbmVkDQotICAgICAgICAgICAgY2lkcyA9IEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5nZXRCbG9iQ0lEcygpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBudW1DSURzID0gKGNpZHMgPT0gbnVsbCkgPyAwIDogY2lkcy5zaXplKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBvbmUgYXR0YWNobWVudCBidXQgdGhlcmUgd2VyZToiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAxKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uIHVzaW5nIHRoZSBTT0FQMTEgYmluZGluZw0KLSAgICAgKiBwcm9wZXJ0eSBmb3IgTVRPTS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kSW1hZ2VBdHRhY2htZW50UHJvcGVydHkxMSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGltYWdlUmVzb3VyY2VEaXIgPSBJTUFHRV9ESVI7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YVNvdXJjZSBmcm9tIGFuIGltYWdlIA0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOw0KLSAgICAgICAgDQotICAgICAgICAvL1N0b3JlIHRoZSBkYXRhIGhhbmRsZXIgaW4gSW1hZ2VEZXBvdCBiZWFuDQotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVNlbmRJbWFnZSgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtV1MgY2xpZW50IG5lZWRlZCB0byBzZW5kIHRoZSByZXF1ZXN0IHdpdGggc29hcCAxMSBiaW5kaW5nDQotICAgICAgICAvLyBwcm9wZXJ0eSBmb3IgTVRPTQ0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbiB1c2luZyBib3RoIHRoZSBTT0FQMTEgYmluZGluZw0KLSAgICAgKiBwcm9wZXJ0eSBmb3IgTVRPTSBhbmQgdGhlIEJpbmRpbmcgQVBJDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlQXR0YWNobWVudEFQSVByb3BlcnR5MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZWNlc3NhcnkgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdCB3aXRoIHNvYXAgMTEgYmluZGluZw0KLSAgICAgICAgLy8gcHJvcGVydHkgZm9yIE1UT00NCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vRW5hYmxlIGF0dGFjaG1lbnQgb3B0aW1pemF0aW9uDQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBkaXNwYXRjaC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBFbmFibGUgYXR0YWNobWVudCBvcHRpbWl6YXRpb24gdXNpbmcgYm90aCB0aGUgU09BUDEyIGJpbmRpbmcNCi0gICAgICogcHJvcGVydHkgZm9yIE1UT00NCi0gICAgICogDQotICAgICAqIFNlbmRpbmcgU09BUDEyIG1lc3NhZ2UgdG8gU09BUDExIGVuZHBvaW50IHdpbGwgY29ycmVjdGx5IHJlc3VsdCBpbiBleGNlcHRpb24NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlQXR0YWNobWVudFByb3BlcnR5MTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gSU1BR0VfRElSOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSANCi0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGltYWdlUmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrInRlc3QuanBnIik7DQotICAgICAgICBJbWFnZUlucHV0U3RyZWFtIGZpaXMgPSBuZXcgRmlsZUltYWdlSW5wdXRTdHJlYW0oZmlsZSk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsNCi0gICAgICAgIERhdGFTb3VyY2UgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0DQotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICANCi0gICAgICAgIFNlbmRJbWFnZSByZXF1ZXN0ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBuZWNlc3NhcnkgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5tdG9tIik7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIGNsaWVudCBuZWVkZWQgdG8gc2VuZCB0aGUgcmVxdWVzdCB3aXRoIHNvYXAgMTEgYmluZGluZw0KLSAgICAgICAgLy8gcHJvcGVydHkgZm9yIE1UT00NCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgZmFpbCgiV2FzIGV4cGVjdGluZyBhbiBleGNlcHRpb24gZHVlIHRvIHNlbmRpbmcgU09BUDEyIG1lc3NhZ2UgdG8gU09BUDExIGVuZHBvaW50LiIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGUpOw0KLSAgICAgICAgICAgIGlmIChDSEVDS19WRVJTSU9OTUlTTUFUQ0gpIHsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgU09BUEZhdWx0RXhjZXB0aW9uLCBidXQgcmVjZWl2ZWQ6ICIrIGUuZ2V0Q2xhc3MoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0RXhjZXB0aW9uIHNmZSA9IChTT0FQRmF1bHRFeGNlcHRpb24pIGU7DQotDQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IHNmZS5nZXRGYXVsdCgpOw0KLQ0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJTT0FQRmF1bHQgaXMgbnVsbCAiLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ICE9IG51bGwpOw0KLSAgICAgICAgICAgICAgICBRTmFtZSBmYXVsdENvZGUgPSBzZmUuZ2V0RmF1bHQoKS5nZXRGYXVsdENvZGVBc1FOYW1lKCk7DQotDQotDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIFZFUlNJT04gTUlTTUFUQ0ggYnV0IHJlY2VpdmVkOiAiKyBmYXVsdENvZGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiVmVyc2lvbk1pc21hdGNoIiwgU09BUENvbnN0YW50cy5TT0FQX0VOVl9QUkVGSVgpLmVxdWFscyhmYXVsdENvZGUpKTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXYXMgZXhwZWN0aW5nIGFuIGV4Y2VwdGlvbiBkdWUgdG8gc2VuZGluZyBTT0FQMTIgbWVzc2FnZSB0byBTT0FQMTEgZW5kcG9pbnQuIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZSk7DQotICAgICAgICAgICAgaWYgKENIRUNLX1ZFUlNJT05NSVNNQVRDSCkgew0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBTT0FQRmF1bHRFeGNlcHRpb24sIGJ1dCByZWNlaXZlZDogIisgZS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZTsNCi0NCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNPQVBGYXVsdCBpcyBudWxsICIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IHNmZS5nZXRGYXVsdCgpLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgVkVSU0lPTiBNSVNNQVRDSCBidXQgcmVjZWl2ZWQ6ICIrIGZhdWx0Q29kZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJWZXJzaW9uTWlzbWF0Y2giLCBTT0FQQ29uc3RhbnRzLlNPQVBfRU5WX1BSRUZJWCkuZXF1YWxzKGZhdWx0Q29kZSkpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotDQotCX0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IG9wdGltaXphdGlvbiB1c2luZyBib3RoIHRoZSBTT0FQMTIgYmluZGluZyBBUEkNCi0gICAgICogZm9yIE1UT00NCi0gICAgICogDQotICAgICAqIFNlbmRpbmcgU09BUDEyIG1lc3NhZ2UgdG8gU09BUDExIGVuZHBvaW50IHdpbGwgY29ycmVjdGx5IHJlc3VsdCBpbiBleGNlcHRpb24NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlQXR0YWNobWVudEFQSTEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3Qgd2l0aCBzb2FwIDExIGJpbmRpbmcNCi0gICAgICAgIC8vIHByb3BlcnR5IGZvciBNVE9NDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShRTkFNRV9TRVJWSUNFKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChRTkFNRV9QT1JULCBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCBqYmMsIE1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy9FbmFibGUgYXR0YWNobWVudCBvcHRpbWl6YXRpb24NCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGRpc3BhdGNoLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU2VuZEltYWdlUmVzcG9uc2UgcmVzcG9uc2UgPSAoU2VuZEltYWdlUmVzcG9uc2UpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJXYXMgZXhwZWN0aW5nIGFuIGV4Y2VwdGlvbiBkdWUgdG8gc2VuZGluZyBTT0FQMTIgbWVzc2FnZSB0byBTT0FQMTEgZW5kcG9pbnQuIik7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZSk7DQotICAgICAgICAgICAgaWYgKENIRUNLX1ZFUlNJT05NSVNNQVRDSCkgew0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBTT0FQRmF1bHRFeGNlcHRpb24sIGJ1dCByZWNlaXZlZDogIisgZS5nZXRDbGFzcygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOw0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbikgZTsNCi0NCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gc2ZlLmdldEZhdWx0KCk7DQotDQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlNPQVBGYXVsdCBpcyBudWxsICIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgIT0gbnVsbCk7DQotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IHNmZS5nZXRGYXVsdCgpLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgVkVSU0lPTiBNSVNNQVRDSCBidXQgcmVjZWl2ZWQ6ICIrIGZhdWx0Q29kZSwNCi0gICAgICAgICAgICAgIAkJICBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUsICJWZXJzaW9uTWlzbWF0Y2giLCBTT0FQQ29uc3RhbnRzLlNPQVBfRU5WX1BSRUZJWCkuZXF1YWxzKGZhdWx0Q29kZSkpOw0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZhaWwoIldhcyBleHBlY3RpbmcgYW4gZXhjZXB0aW9uIGR1ZSB0byBzZW5kaW5nIFNPQVAxMiBtZXNzYWdlIHRvIFNPQVAxMSBlbmRwb2ludC4iKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsNCi0gICAgICAgICAgICBpZiAoQ0hFQ0tfVkVSU0lPTk1JU01BVENIKSB7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIFNPQVBGYXVsdEV4Y2VwdGlvbiwgYnV0IHJlY2VpdmVkOiAiKyBlLmdldENsYXNzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEV4Y2VwdGlvbik7DQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdEV4Y2VwdGlvbiBzZmUgPSAoU09BUEZhdWx0RXhjZXB0aW9uKSBlOw0KLQ0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsNCi0NCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU09BUEZhdWx0IGlzIG51bGwgIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCAhPSBudWxsKTsNCi0gICAgICAgICAgICAgICAgUU5hbWUgZmF1bHRDb2RlID0gc2ZlLmdldEZhdWx0KCkuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOw0KLQ0KLQ0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBWRVJTSU9OIE1JU01BVENIIGJ1dCByZWNlaXZlZDogIisgZmF1bHRDb2RlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFLCAiVmVyc2lvbk1pc21hdGNoIiwgU09BUENvbnN0YW50cy5TT0FQX0VOVl9QUkVGSVgpLmVxdWFscyhmYXVsdENvZGUpKTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgIA0KLSAgICB9DQotICAgIC8qDQotICAgICAqIEVuYWJsZSBhdHRhY2htZW50IE9wdGltaXphdGlvbiBidXQgY2FsbCBhbiBlbmRwb2ludCB3aXRoIEBNVE9NKGVuYWJsZT10cnVlLCBUaHJlc2hvbGQgPSA5OTAwMCkNCi0gICAgICovDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEltYWdlX3NldE1UT01UaHJlc2hvbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RTZW5kSW1hZ2Vfc2V0TVRPTVRocmVzaG9sZCgpIik7DQotICAgICAgICBTdHJpbmcgaW1hZ2VSZXNvdXJjZURpciA9IElNQUdFX0RJUjsNCi0gICAgICAgIA0KLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCJ0ZXN0LmpwZyIsaW1hZ2UpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICANCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOw0KLSAgICAgICAgDQotICAgICAgICAvL0NyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOw0KLSAgICAgICAgLy9TZXR0aW5nIFRocmVzaG9sZCB0byBzZW5kIHJlcXVlc3QgSW5saW5lDQotICAgICAgICBpbnQgdGhyZXNob2xkID0gMTAwMDAwOw0KLSAgICAgICAgTVRPTUZlYXR1cmUgbXRvbTIxID0gbmV3IE1UT01GZWF0dXJlKHRydWUsIHRocmVzaG9sZCk7DQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1XUyBjbGllbnQgbmVlZGVkIHRvIHNlbmQgdGhlIHJlcXVlc3QNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgc2VydmljZS5hZGRQb3J0KFFOQU1FX1BPUlQsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgVVJMX0VORFBPSU5UX01UT01USFJFU0hPTEQpOw0KLSAgICAgICAgRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUU5BTUVfUE9SVCwgamJjLCBNb2RlLlBBWUxPQUQsIG10b20yMSk7DQotICAgICAgICANCi0gICAgICAgIExpc3QgY2lkcyA9IG51bGw7DQotICAgICAgICBTZW5kSW1hZ2VSZXNwb25zZSByZXNwb25zZSA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVGhlIGNpZHMgYXJlIGNvbGxlY3RlZCBpbiB0aGUgbW9uaXRvci4gIFdlIHdpbGwgY2hlY2sNCi0gICAgICAgICAgICAvLyB0aGlzIHRvIG1ha2Ugc3VyZSB0aGUgcmVzcG9uc2UgbXRvbSBpcyBub3QgaW5saW5lZA0KLSAgICAgICAgICAgIGNpZHMgPSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuZ2V0QmxvYkNJRHMoKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRPdXRwdXQoKS5nZXRJbWFnZURhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vVGhlcmUgc2hvbGQgYmUgbm8gY2lkIGFzIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGlubGluZWQuDQotICAgICAgICBpbnQgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgaW5saW5lZDoiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgcmVzcG9uc2UgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IChTZW5kSW1hZ2VSZXNwb25zZSkgZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFRoZSBjaWRzIGFyZSBjb2xsZWN0ZWQgaW4gdGhlIG1vbml0b3IuICBXZSB3aWxsIGNoZWNrDQotICAgICAgICAgICAgLy8gdGhpcyB0byBtYWtlIHN1cmUgdGhlIHJlc3BvbnNlIG10b20gaXMgbm90IGlubGluZWQNCi0gICAgICAgICAgICBjaWRzID0gSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLmdldEJsb2JDSURzKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0T3V0cHV0KCkuZ2V0SW1hZ2VEYXRhKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvL1RoZXJlIHNob2xkIGJlIG5vIGNpZCBhcyBhdHRhY2htZW50IHNob3VsZCBiZSBpbmxpbmVkLg0KLSAgICAgICAgbnVtQ0lEcyA9IChjaWRzID09IG51bGwpID8gMCA6IGNpZHMuc2l6ZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgb25lIGF0dGFjaG1lbnQgaW5saW5lZDoiICsgbnVtQ0lEcywgbnVtQ0lEcyA9PSAwKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9Ob25XcmFwVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvTm9uV3JhcFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjMzNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9Ob25XcmFwVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwU2VydmljZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuT2JqZWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXlIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotcHVibGljIGNsYXNzIE5vbldyYXBUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLQlTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXROb25XcmFwU2VydmljZS5Eb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsUG9ydCI7DQotCQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoTm9uV3JhcFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0JDQotICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlTeW5jKCl7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFR3b1dheSB0d29XYXkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVR3b1dheSgpOw0KLSAgICAgICAgICAgIHR3b1dheS5zZXRUd293YXlTdHIoInRlc3Rpbmcgc3luYyBjYWxsIGZvciBqYXZhIGJlYW4gbm9uIHdyYXAgZW5kcG9pbnQiKTsNCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdE5vbldyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXREb2NMaXROb25XcmFwUG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIFJldHVyblR5cGUgcmV0dXJuVmFsdWUgPSBwcm94eS50d29XYXkodHdvV2F5KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhyZXR1cm5WYWx1ZS5nZXRSZXR1cm5TdHIoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgICAgIHJldHVyblZhbHVlID0gcHJveHkudHdvV2F5KHR3b1dheSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcocmV0dXJuVmFsdWUuZ2V0UmV0dXJuU3RyKCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0VHdvV2F5U3luY051bGwoKSB0aHJvd3MgRXhjZXB0aW9uew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXkgdHdvV2F5ID0gbnVsbDsgIC8vIFRoaXMgc2hvdWxkIGNhdXNlIGFuIFdlYlNlcnZpY2VFeGNlcHRpb24NCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdE5vbldyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXREb2NMaXROb25XcmFwUG9ydCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0JCQlwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFJldHVyblR5cGUgcmV0dXJuVmFsdWUgPSBwcm94eS50d29XYXkodHdvV2F5KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZXBlYXQgdG8gdmVyaWZ5IGJlaGF2aW9yDQotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBwcm94eS50d29XYXkodHdvV2F5KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUT0RPIFJldmlzaXQgSkFYQiB2YWxpZGF0aW9uDQotICAgICAgICAgICAgLy8gSkFYV1MgZG9lcyBub3QgbWFrZSB0aGUgZGVjaXNpb24gb2Ygd2hldGhlciBhDQotICAgICAgICAgICAgLy8gbnVsbCBwYXJhbWV0ZXIgY2FuIGJlIG1hcnNoYWxsZWQuICBUaGlzIGRlY2lzaW9uIGlzDQotICAgICAgICAgICAgLy8gZGVsZWdhdGVkIHRvIEpBWEIuICBJbiB0aGlzIGNhc2UsIHRoZSBzY2hlbWEgaW5kaWNhdGVzDQotICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGlzIG5vdCBhIG5pbGxhYmxlIGVsZW1lbnQuICBUaGUgYXNzdW1wdGlvbiBpcw0KLSAgICAgICAgICAgIC8vIHRoYXQgSkFYQiB3aWxsIGZhaWwuICBIb3dldmVyIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgDQotICAgICAgICAgICAgLy8gSkFYQiBjb25zaWRlcnMgdGhpcyBhcyAndmFsaWRhdGlvbiBjaGVja2luZycgYW5kIGlzIG5vdA0KLSAgICAgICAgICAgIC8vIHN1cHBvcnRlZC4gIFRodXMgSkFYQiB3aWxsIG1hcnNoYWwgdGhlIGVsZW1lbnQgd2l0aG91dA0KLSAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiAoYW5kIHVubWFyc2hhbCB3aXRob3V0IGV4Y2VwdGlvbikgZXZlbiB0aG91Z2gNCi0gICAgICAgICAgICAvLyB0aGlzIGlzIGEgdmlvbGF0aW9uIG9mIHRoZSBzY2hlbWEuDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy9mYWlsKCJFeHBlY3RlZCBXZWJTZXJ2aWNlRXhjZXB0aW9uIik7DQotICAgICAgICAgICAgDQotICAgICAgICB9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoZS50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5QVN5bmNDYWxsYmFjaygpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXkgdHdvV2F5ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVUd29XYXkoKTsNCi0gICAgICAgICAgICB0d29XYXkuc2V0VHdvd2F5U3RyKCJ0ZXN0aW5nIEFzeW5jIGNhbGwgZm9yIGphdmEgYmVhbiBub24gd3JhcCBlbmRwb2ludCIpOw0KLSAgICAgICAgICAgIERvY0xpdE5vbldyYXBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRG9jTGl0Tm9uV3JhcFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldERvY0xpdE5vbldyYXBQb3J0KCk7DQotDQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPQkoQmluZGluZ1Byb3ZpZGVyKXByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotDQotICAgICAgICAgICAgQXN5bmNDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgRnV0dXJlPD8+IG1vbml0b3IgPSBwcm94eS50d29XYXlBc3luYyh0d29XYXksIGNhbGxiYWNrKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vbml0b3IpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBBc3luY0NhbGxiYWNrKCk7DQotICAgICAgICAgICAgbW9uaXRvciA9IHByb3h5LnR3b1dheUFzeW5jKHR3b1dheSwgY2FsbGJhY2spOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobW9uaXRvcik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFR3b1dheUhvbGRlcigpew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBUd29XYXlIb2xkZXIgdHdoID0gbmV3IFR3b1dheUhvbGRlcigpOw0KLSAgICAgICAgICAgIHR3aC5zZXRUd29XYXlIb2xkZXJJbnQobmV3IEludGVnZXIoMCkpOw0KLSAgICAgICAgICAgIHR3aC5zZXRUd29XYXlIb2xkZXJTdHIobmV3IFN0cmluZygiUmVxdWVzdCBIb2xkZXIgU3RyaW5nIikpOw0KLSAgICAgICAgICAgIEhvbGRlcjxUd29XYXlIb2xkZXI+IGhvbGRlciA9IG5ldyBIb2xkZXI8VHdvV2F5SG9sZGVyPih0d2gpOw0KLSAgICAgICAgICAgIFR3b1dheSB0d29XYXkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVR3b1dheSgpOw0KLSAgICAgICAgICAgIHR3b1dheS5zZXRUd293YXlTdHIoInRlc3Rpbmcgc3luYyBjYWxsIGZvciBqYXZhIGJlYW4gbm9uIHdyYXAgZW5kcG9pbnQiKTsNCi0gICAgICAgICAgICBEb2NMaXROb25XcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdE5vbldyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIHByb3h5ID0gc2VydmljZS5nZXREb2NMaXROb25XcmFwUG9ydCgpOw0KLQ0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwcm94eTsNCi0gICAgICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBheGlzRW5kcG9pbnQpOw0KLQ0KLSAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihob2xkZXIpOw0KLSAgICAgICAgICAgIHR3aCA9IGhvbGRlci52YWx1ZTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiSG9sZGVyIHN0cmluZyA9IiArIHR3aC5nZXRUd29XYXlIb2xkZXJTdHIoKSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBpbnQgPSIgKyB0d2guZ2V0VHdvV2F5SG9sZGVySW50KCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgICAgICBwcm94eS50d29XYXlIb2xkZXIoaG9sZGVyKTsNCi0gICAgICAgICAgICB0d2ggPSBob2xkZXIudmFsdWU7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBzdHJpbmcgPSIgKyB0d2guZ2V0VHdvV2F5SG9sZGVyU3RyKCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgaW50ID0iICsgdHdoLmdldFR3b1dheUhvbGRlckludCgpKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotCQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5SG9sZGVyQXN5bmMoKXsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICB0cnl7DQotICAgICAgICAgICAgVHdvV2F5SG9sZGVyIHR3aCA9IG5ldyBUd29XYXlIb2xkZXIoKTsNCi0gICAgICAgICAgICB0d2guc2V0VHdvV2F5SG9sZGVySW50KG5ldyBJbnRlZ2VyKDApKTsNCi0gICAgICAgICAgICB0d2guc2V0VHdvV2F5SG9sZGVyU3RyKG5ldyBTdHJpbmcoIlJlcXVlc3QgSG9sZGVyIFN0cmluZyIpKTsNCi0gICAgICAgICAgICBIb2xkZXI8VHdvV2F5SG9sZGVyPiBob2xkZXIgPSBuZXcgSG9sZGVyPFR3b1dheUhvbGRlcj4odHdoKTsNCi0gICAgICAgICAgICBUd29XYXkgdHdvV2F5ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVUd29XYXkoKTsNCi0gICAgICAgICAgICB0d29XYXkuc2V0VHdvd2F5U3RyKCJ0ZXN0aW5nIHN5bmMgY2FsbCBmb3IgamF2YSBiZWFuIG5vbiB3cmFwIGVuZHBvaW50Iik7DQotICAgICAgICAgICAgRG9jTGl0Tm9uV3JhcFNlcnZpY2Ugc2VydmljZSA9IG5ldyBEb2NMaXROb25XcmFwU2VydmljZSgpOw0KLSAgICAgICAgICAgIERvY0xpdE5vbldyYXBQb3J0VHlwZSBwcm94eSA9IHNlcnZpY2UuZ2V0RG9jTGl0Tm9uV3JhcFBvcnQoKTsNCi0NCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9CShCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgYXhpc0VuZHBvaW50KTsNCi0NCi0gICAgICAgICAgICBBc3luY0NhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICBGdXR1cmU8Pz4gbW9uaXRvciA9cHJveHkudHdvV2F5SG9sZGVyQXN5bmModHdoLCBjYWxsYmFjayk7DQotICAgICAgICAgICAgd2hpbGUoIW1vbml0b3IuaXNEb25lKCkpew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobW9uaXRvcik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gUmVwZWF0IHRvIHZlcmlmeSBiZWhhdmlvcg0KLSAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IEFzeW5jQ2FsbGJhY2soKTsNCi0gICAgICAgICAgICBtb25pdG9yID1wcm94eS50d29XYXlIb2xkZXJBc3luYyh0d2gsIGNhbGxiYWNrKTsNCi0gICAgICAgICAgICB3aGlsZSghbW9uaXRvci5pc0RvbmUoKSl7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb25pdG9yKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUGFyYWxsZWxBc3luY1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL1BhcmFsbGVsQXN5bmNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI2YTAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUGFyYWxsZWxBc3luY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnBhcmFsbGVsYXN5bmMuY29tbW9uLkNhbGxiYWNrSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5zZXJ2ZXIuQXN5bmNQb3J0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5wYXJhbGxlbGFzeW5jLnNlcnZlci5Bc3luY1NlcnZpY2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5TbGVlcFJlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLldha2VVcFJlc3BvbnNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIGZvciBBc3luY2hyb255IGluIEpBWC1XUy4gTW9zdCBvZiB0aGUgc2ltcGxlIGludm9rZUFzeW5jL2FzeW5jDQotICogZXhjZXB0aW9ucyBoYXZlIGJlZW4gY292ZXJlZCB1bmRlciBqYXh3cy5kaXNwYXRjaCBhbmQgamF4d3MucHJveHkgdGVzdCBzdWl0ZXMNCi0gKiANCi0gKiBFeGVjdXRpb25FeGNlcHRpb24gdGVzdHMgYXJlIGNvdmVyZWQgaW4gamF4d3MuZGlzcGF0Y2ggYW5kIGpheHdzLnByb3h5DQotICovDQotcHVibGljIGNsYXNzIFBhcmFsbGVsQXN5bmNUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQgPQ0KLSAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Bc3luY1NlcnZpY2UuRG9jTGl0V3JhcHBlZFBvcnRJbXBsUG9ydCI7DQotDQotICAgIC8vIHVzZWQgZm9yIGxvZ2dpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbXlDbGFzc05hbWUgPSAiUGFyYWxsZWxBc3luY1Rlc3RzIjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFBhcmFsbGVsQXN5bmNUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICAgIAkNCi0gICAgcHVibGljIHZvaWQgdGVzdE5PT1AgKCkge30NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgQ2hlY2sgdGhhdCB0aGUgd2ViIHNlcnZpY2UgaXMgdXAgYW5kIHJ1bm5pbmcgDQotICAgICAqICAgICAgICAgICAgICAgYmVmb3JlIHJ1bm5pbmcgYW55IG90aGVyIHRlc3RzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZV9pc0FsaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJ0ZXN0U2VydmljZUFsaXZlIjsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lICsgIiA6ICIgKyBnZXROYW1lKCkgKyAiIDogIjsNCi0NCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgoRXhlY3V0b3IpbnVsbCk7DQotDQotICAgICAgICBTdHJpbmcgcmVxMWJhc2UgPSAic2xlZXBBc3luYyI7DQotICAgICAgICBTdHJpbmcgcmVxMmJhc2UgPSAicmVtYXBwZWRBc3luYyI7DQotDQotICAgICAgICBTdHJpbmcgcmVxdWVzdDEgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QyID0gbnVsbDsNCi0NCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgew0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlcXVlc3QxID0gcmVxMWJhc2UgKyAiXyIgKyBpOw0KLSAgICAgICAgICAgIHJlcXVlc3QyID0gcmVxMmJhc2UgKyAiXyIgKyBpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIml0ZXJhdGlvbiBbIiArIGkgKyAiXSB1c2luZyByZXF1ZXN0MSBbIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgICAgICJdICByZXF1ZXN0MiBbIiArIHJlcXVlc3QyICsgIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyBzdWJtaXQgcmVxdWVzdCAjMSB0byB0aGUgc2VydmVyLXNpZGUgd2ViIHNlcnZpY2UgdGhhdCANCi0gICAgICAgICAgICAvLyB0aGUgd2ViIHNlcnZpY2Ugd2lsbCBrZWVwIHVudGlsIHdlIGFzayBmb3IgaXQNCi0gICAgICAgICAgICBSZXNwb25zZTxTbGVlcFJlc3BvbnNlPiByZXNwMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSk7DQotDQotICAgICAgICAgICAgLy8gc3VibWl0IHJlcXVlc3QgIzIgdG8gdGhlIHNlcnZlciB0aGF0IGVzc2VudGlhbGx5IHByb2Nlc3Nlcw0KLSAgICAgICAgICAgIC8vIHdpdGhvdXQgZGVsYXkNCi0gICAgICAgICAgICBSZXNwb25zZTxDdXN0b21Bc3luY1Jlc3BvbnNlPiByZXNwMiA9IHBvcnQucmVtYXBwZWRBc3luYyhyZXF1ZXN0Mik7DQotDQotICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgcmVzcG9uc2UgZm9yIHJlcXVlc3QgIzIgaXMgZG9uZSANCi0gICAgICAgICAgICB3YWl0QmxvY2tpbmcocmVzcDIpOw0KLQ0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB3YWl0aW5nIHJlcXVlc3QgIzENCi0gICAgICAgICAgICBTdHJpbmcgYXNsZWVwID0gcG9ydC5pc0FzbGVlcChyZXF1ZXN0MSk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odGl0bGUrIml0ZXJhdGlvbiBbIitpKyJdICAgcG9ydC5pc0FzbGVlcChyZXF1ZXN0MSBbIityZXF1ZXN0MSsiXSkgPSBbIithc2xlZXArIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdCAjMQ0KLSAgICAgICAgICAgIFN0cmluZyB3YWtlID0gcG9ydC53YWtlVXAocmVxdWVzdDEpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHRpdGxlKyJpdGVyYXRpb24gWyIraSsiXSAgIHBvcnQud2FrZVVwKHJlcXVlc3QxIFsiK3JlcXVlc3QxKyJdKSA9IFsiK3dha2UrIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyB3YWl0IHVudGlsIHRoZSByZXNwb25zZSBmb3IgcmVxdWVzdCAjMSBpcyBkb25lDQotICAgICAgICAgICAgd2FpdEJsb2NraW5nKHJlc3AxKTsNCi0gICAgICAgIA0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzcG9uc2VzDQotICAgICAgICAgICAgU3RyaW5nIHJlcTFfcmVzdWx0ID0gbnVsbDsNCi0gICAgICAgICAgICBTdHJpbmcgcmVxMl9yZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHJlcTFfcmVzdWx0ID0gcmVzcDEuZ2V0KCkuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICByZXEyX3Jlc3VsdCA9IHJlc3AyLmdldCgpLmdldFJlc3BvbnNlKCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoDQotICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgKyAiaXRlcmF0aW9uIFsiICsgaSArICJdIHVzaW5nIHJlcXVlc3QxIFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIHJlcXVlc3QyIFsiICsgcmVxdWVzdDIgKyAiXSA6ICBnb3QgZXhjZXB0aW9uIFsiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIGNoZWNrIHN0YXR1cyBvbiByZXF1ZXN0ICMxDQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzbGVlcEFzeW5jIGRpZCBub3Qgc2xlZXAgYXMgZXhwZWN0ZWQiLCByZXF1ZXN0MSwgYXNsZWVwKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNsZWVwQXN5bmMgZGlkIG5vdCByZXR1cm4gZXhwZWN0ZWQgcmVzcG9uc2UgIiwgcmVxdWVzdDEsIHJlcTFfcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICAvLyBjaGVjayBzdGF0dXMgb24gcmVxdWVzdCAjMg0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygicmVtYXBwZWRBc3luYyBkaWQgbm90IHJldHVybiBleHBlY3RlZCByZXNwb25zZSIsIHJlcXVlc3QyLCByZXEyX3Jlc3VsdCk7DQotICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgLy8gQ2FsbGluZyBnZXQoKSBhZ2FpbiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgZmlyc3QgY2FsbCB0byBnZXQoKQ0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic2xlZXBBc3luYyBkaWQgbm90IHJldHVybiBleHBlY3RlZCByZXNwb25zZSAiLCByZXF1ZXN0MSwgcmVzcDEuZ2V0KCkuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJlbWFwcGVkQXN5bmMgZGlkIG5vdCByZXR1cm4gZXhwZWN0ZWQgcmVzcG9uc2UiLCByZXF1ZXN0MiwgcmVzcDIuZ2V0KCkuZ2V0UmVzcG9uc2UoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIGNoZWNrIHRoZSBjYWxsYmFjayBvcGVyYXRpb24NCi0JCUNhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPiBzbGVlcENhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXI8U2xlZXBSZXNwb25zZT4oKTsNCi0NCi0gICAgICAgIHJlcXVlc3QxID0gcmVxMWJhc2UgKyAiX3dpdGhfQ2FsbGJhY2siOw0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odGl0bGUrIiBwb3J0LnNsZWVwQXN5bmMoIityZXF1ZXN0MSsiLCBjYWxsYmFja0hhbmRlcikgIGJlaW5nIHN1Ym1pdHRlZC4uLi4iKTsNCi0JCUZ1dHVyZTw/PiBzciA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIpOw0KLQ0KLSAgICAgICAgLy8gd2FpdCBhIGJpdCBmb3IgdGhlIHNlcnZlciB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IC4uLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgd2FpdGluZyByZXF1ZXN0IA0KLSAgICAgICAgU3RyaW5nIGFzbGVlcFdpdGhDYWxsYmFjayA9IHBvcnQuaXNBc2xlZXAocmVxdWVzdDEpOw0KLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odGl0bGUrIiBwb3J0LmlzQXNsZWVwKCIrcmVxdWVzdDErIikgPSBbIithc2xlZXBXaXRoQ2FsbGJhY2srIl0iKTsNCi0NCi0gICAgICAgIC8vIHdha2V1cCB0aGUgd2FpdGluZyByZXF1ZXN0DQotICAgICAgICBTdHJpbmcgd2FrZSA9IHBvcnQud2FrZVVwKHJlcXVlc3QxKTsNCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHRpdGxlKyIgcG9ydC53YWtlVXAoIityZXF1ZXN0MSsiKSA9IFsiK3dha2UrIl0iKTsNCi0NCi0gICAgICAgIC8vIHdhaXQgYSBiaXQuLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7DQotDQotICAgICAgICAvLyBnZXQgdGhlIHJlc3BvbnNlDQotICAgICAgICBTdHJpbmcgcmVxX2NiX3Jlc3VsdCA9IG51bGw7DQotDQotICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgICAgIFNsZWVwUmVzcG9uc2Ugc2xlZXBSZXNwID0gc2xlZXBDYWxsYmFja0hhbmRsZXIuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKHNsZWVwUmVzcCAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmVxX2NiX3Jlc3VsdCA9IHNsZWVwUmVzcC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSA6ICByZXN1bHQgWyIgKyByZXFfY2JfcmVzdWx0ICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArICJdIDogIGdvdCBleGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSAiKTsNCi0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKGV4LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gY2hlY2sgc3RhdHVzIG9uIHJlcXVlc3QNCi0gICAgICAgIGFzc2VydEVxdWFscygic2xlZXBBc3luYyB3aXRoIGNhbGxiYWNrIGRpZCBub3Qgc2xlZXAgYXMgZXhwZWN0ZWQiLCByZXF1ZXN0MSwgcmVxX2NiX3Jlc3VsdCk7DQotDQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgVGVzdCBmb3Igb3JkZXJpbmcgYW4gZXhlY3V0b3IgdG8gc2h1dGRvd25Ob3cgd2hpbGUgdGhlcmUNCi0gICAgICogICAgICAgICAgICAgICBpcyBhIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLiAgVXNlcyB0aGUgZGVmYXVsdCBleGVjdXRvci4NCi0gICAgICogICAgICAgICAgICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlX0V4ZWN1dG9yU2h1dGRvd25Ob3coKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gInRlc3RFeGVjdXRvclNodXRkb3duTm93IjsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lICsgIiA6ICIgKyBnZXROYW1lKCkgKyAiIDogIjsNCi0NCi0gICAgICAgIEFzeW5jU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShudWxsKTsNCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydChzZXJ2aWNlKTsNCi0NCi0JCS8vIGdldCB0aGUgZGVmYXVsdCBleGVjdXRvciBhbmQgY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGFuIGV4ZWN1dG9yIHNlcnZpY2UNCi0gICAgICAgIEV4ZWN1dG9yU2VydmljZSBleCA9IG51bGw7DQotICAgICAgICBFeGVjdXRvciBleGVjdXRvciA9IHNlcnZpY2UuZ2V0RXhlY3V0b3IoKTsNCi0gICAgICAgIGlmICgoZXhlY3V0b3IgIT0gbnVsbCkgJiYgKGV4ZWN1dG9yIGluc3RhbmNlb2YgRXhlY3V0b3JTZXJ2aWNlKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBleCA9IChFeGVjdXRvclNlcnZpY2UpIGV4ZWN1dG9yOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBObyBleGVjdXRvciBzZXJ2aWNlIGF2YWlsYWJsZS4gTm90aGluZyB0byB0ZXN0LiIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0aGF0IHdpbGwgd2FpdCB1bnRpbCB3ZSBhc2sgZm9yIGl0DQotCQlDYWxsYmFja0hhbmRsZXI8U2xlZXBSZXNwb25zZT4gc2xlZXBDYWxsYmFja0hhbmRsZXIxID0gbmV3IENhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QxID0gInNsZWVwQXN5bmNfd2l0aF9DYWxsYmFja18xIjsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBwb3J0LnNsZWVwQXN5bmMoIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgIiwgY2FsbGJhY2tIYW5kZXIxKSAgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLQkJRnV0dXJlPD8+IHNyMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5zbGVlcEFzeW5jKCIgKyByZXF1ZXN0MSArICIsIGNhbGxiYWNrSGFuZGVyMSkgICMxIC4uLi4uc3VibWl0dGVkLiIpOw0KLQ0KLSAgICAgICAgLy8gd2FpdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyIGhhcyB0aGUgcmVxdWVzdA0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLQ0KLQkJLy8gdGVsbCB0aGUgZXhlY3V0b3IgdG8gc2h1dGRvd24gaW1tZWRpYXRlbHksIHdoaWNoIA0KLSAgICAgICAgLy8gYXR0ZW1wdHMgdG8gc3RvcCBhbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzIHZpYSBUaHJlYWQuaW50ZXJydXB0KCkNCi0gICAgICAgIC8vIGFuZCBzaG91bGQgcHJldmVudCBuZXcgdGFza3MgZnJvbSBiZWluZyBzdWJtaXR0ZWQNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyDQotICAgICAgICAgICAgICAgIC5kZWJ1Zyh0aXRsZSArICIgc2h1dHRpbmcgZG93biBleGVjdXRvciBbIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgIGV4LnNodXRkb3duTm93KCk7DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgd2FpdGluZyByZXF1ZXN0IA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQuaXNBc2xlZXAoIiArIHJlcXVlc3QxICsgIikgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgU3RyaW5nIGFzbGVlcFdpdGhDYWxsYmFjazEgPSBwb3J0LmlzQXNsZWVwKHJlcXVlc3QxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5pc0FzbGVlcCgiICsgcmVxdWVzdDEgKyAiKSAjMSA9IFsiICsgYXNsZWVwV2l0aENhbGxiYWNrMSArICJdIik7DQotDQotICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQud2FrZVVwKHJlcXVlc3QxKSAjMSBiZWluZyBzdWJtaXR0ZWQuLi4uIik7DQotICAgICAgICBTdHJpbmcgd2FrZTEgPSBwb3J0Lndha2VVcChyZXF1ZXN0MSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC53YWtlVXAoIiArIHJlcXVlc3QxICsgIikgIzEgPSBbIiArIHdha2UxICsgIl0iKTsNCi0NCi0gICAgICAgIC8vIHdhaXQgYSBiaXQuLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgdGhlIEZ1dHVyZQ0KLSAgICAgICAgaWYgKHNyMS5pc0RvbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgc3IxLmlzRG9uZVtUUlVFXSAiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHJlc3BvbnNlDQotICAgICAgICBib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBTbGVlcFJlc3BvbnNlIHNsZWVwUmVzcDEgPSBzbGVlcENhbGxiYWNrSGFuZGxlcjEuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKHNsZWVwUmVzcDEgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTk9UIE5VTExdIGZyb20gY2FsbGJhY2sgaGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0MSA9IHNsZWVwUmVzcDEuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICByZXN1bHQgWyIgKyByZXN1bHQxICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTlVMTF0gZnJvbSBjYWxsYmFjayBoYW5kbGVyIik7DQotDQotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHRoZSBGdXR1cmUgc2F5cw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICAuLi4uY2hlY2sgRnV0dXJlIHJlc3BvbnNlLi4uIik7DQotICAgICAgICAgICAgICAgIE9iamVjdCBmdXR1cmVSZXN1bHQgPSBzcjEuZ2V0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSAjMTogIC4uLi5GdXR1cmUgcmVzcG9uc2UgWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlUmVzdWx0ICsgIl0uLi4iKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArICJdIDogIGdvdCBleGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIFsiICsgZXhjLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IHJlY2VpdmUgYW4gZXhjZXB0aW9uIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdEV4Y2VwdGlvbik7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgVGVzdCBmb3Igb3JkZXJpbmcgYW4gZXhlY3V0b3IgdG8gc2h1dGRvd25Ob3cgd2hpbGUgdGhlcmUNCi0gICAgICogICAgICAgICAgICAgICBpcyBhIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLiAgVXNlcyBhbiBhcHBsaWNhdGlvbiBleGVjdXRvcg0KLSAgICAgKiAgICAgICAgICAgICAgIHNlcnZpY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZV9FeGVjdXRvclNodXRkb3duTm93XzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gInRlc3RFeGVjdXRvclNodXRkb3duTm93XzIiOw0KLQ0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUgKyAiIDogIiArIGdldE5hbWUoKSArICIgOiAiOw0KLQ0KLSAgICAgICAgQXN5bmNTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKG51bGwpOw0KLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBnZXRQb3J0KHNlcnZpY2UpOw0KLQ0KLQkJLy8gZ2V0IHRoZSBkZWZhdWx0IGV4ZWN1dG9yIGFuZCBjaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgYW4gZXhlY3V0b3Igc2VydmljZQ0KLQkJRXhlY3V0b3JTZXJ2aWNlIGV4ID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7DQotCQlzZXJ2aWNlLnNldEV4ZWN1dG9yKGV4KTsNCi0NCi0NCi0gICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0aGF0IHdpbGwgd2FpdCB1bnRpbCB3ZSBhc2sgZm9yIGl0DQotCQlDYWxsYmFja0hhbmRsZXI8U2xlZXBSZXNwb25zZT4gc2xlZXBDYWxsYmFja0hhbmRsZXIxID0gbmV3IENhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPigpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QxID0gInNsZWVwQXN5bmNfd2l0aF9DYWxsYmFja18xIjsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBwb3J0LnNsZWVwQXN5bmMoIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgIiwgY2FsbGJhY2tIYW5kZXIxKSAgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLQkJRnV0dXJlPD8+IHNyMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5zbGVlcEFzeW5jKCIgKyByZXF1ZXN0MSArICIsIGNhbGxiYWNrSGFuZGVyMSkgICMxIC4uLi4uc3VibWl0dGVkLiIpOw0KLQ0KLSAgICAgICAgLy8gd2FpdCBhIGJpdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyIGhhcyB0aGUgcmVxdWVzdA0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLQ0KLQkJLy8gdGVsbCB0aGUgZXhlY3V0b3IgdG8gc2h1dGRvd24gaW1tZWRpYXRlbHksIHdoaWNoIA0KLSAgICAgICAgLy8gYXR0ZW1wdHMgdG8gc3RvcCBhbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzIHZpYSBUaHJlYWQuaW50ZXJydXB0KCkNCi0gICAgICAgIC8vIGFuZCBzaG91bGQgcHJldmVudCBuZXcgdGFza3MgZnJvbSBiZWluZyBzdWJtaXR0ZWQNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyDQotICAgICAgICAgICAgICAgIC5kZWJ1Zyh0aXRsZSArICIgc2h1dHRpbmcgZG93biBleGVjdXRvciBbIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgIGV4LnNodXRkb3duTm93KCk7DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgd2FpdGluZyByZXF1ZXN0IA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQuaXNBc2xlZXAoIiArIHJlcXVlc3QxICsgIikgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgU3RyaW5nIGFzbGVlcFdpdGhDYWxsYmFjazEgPSBwb3J0LmlzQXNsZWVwKHJlcXVlc3QxKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICB0aXRsZSArICIgcG9ydC5pc0FzbGVlcCgiICsgcmVxdWVzdDEgKyAiKSAjMSA9IFsiICsgYXNsZWVwV2l0aENhbGxiYWNrMSArICJdIik7DQotDQotICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdA0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQud2FrZVVwKHJlcXVlc3QxKSAjMSBiZWluZyBzdWJtaXR0ZWQuLi4uIik7DQotICAgICAgICBTdHJpbmcgd2FrZTEgPSBwb3J0Lndha2VVcChyZXF1ZXN0MSk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC53YWtlVXAoIiArIHJlcXVlc3QxICsgIikgIzEgPSBbIiArIHdha2UxICsgIl0iKTsNCi0NCi0gICAgICAgIC8vIHdhaXQgYSBiaXQuLg0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOw0KLQ0KLSAgICAgICAgLy8gY2hlY2sgdGhlIEZ1dHVyZQ0KLSAgICAgICAgaWYgKHNyMS5pc0RvbmUoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgc3IxLmlzRG9uZVtUUlVFXSAiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHJlc3BvbnNlDQotICAgICAgICBib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBTbGVlcFJlc3BvbnNlIHNsZWVwUmVzcDEgPSBzbGVlcENhbGxiYWNrSGFuZGxlcjEuZ2V0KCk7DQotDQotICAgICAgICAgICAgaWYgKHNsZWVwUmVzcDEgIT0gbnVsbCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTk9UIE5VTExdIGZyb20gY2FsbGJhY2sgaGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0MSA9IHNsZWVwUmVzcDEuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICByZXN1bHQgWyIgKyByZXN1bHQxICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTlVMTF0gZnJvbSBjYWxsYmFjayBoYW5kbGVyIik7DQotDQotICAgICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHRoZSBGdXR1cmUgc2F5cw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICAuLi4uY2hlY2sgRnV0dXJlIHJlc3BvbnNlLi4uIik7DQotICAgICAgICAgICAgICAgIE9iamVjdCBmdXR1cmVSZXN1bHQgPSBzcjEuZ2V0KCk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSAjMTogIC4uLi5GdXR1cmUgcmVzcG9uc2UgWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlUmVzdWx0ICsgIl0uLi4iKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjKSB7DQotDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArICJdIDogIGdvdCBleGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIFsiICsgZXhjLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICB9DQotDQotICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IHJlY2VpdmUgYW4gZXhjZXB0aW9uIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdEV4Y2VwdGlvbik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEB0ZXN0U3RyYXRlZ3kgVGVzdCBmb3Igb3JkZXJpbmcgYW4gZXhlY3V0b3IgdG8gc2h1dGRvd25Ob3cgYmVmb3JlIHRoZXJlDQotICAgICAqICAgICAgICAgICAgICAgaXMgYSByZXF1ZXN0LiAgVXNlcyB0aGUgZGVmYXVsdCBleGVjdXRvci4NCi0gICAgICogICAgICAgICAgICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlX0V4ZWN1dG9yU2h1dGRvd25Ob3dfMygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAidGVzdEV4ZWN1dG9yU2h1dGRvd25Ob3dfMyI7DQotDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSArICIgOiAiICsgZ2V0TmFtZSgpICsgIiA6ICI7DQotDQotICAgICAgICBBc3luY1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UobnVsbCk7DQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZSk7DQotDQotCQkvLyBnZXQgdGhlIGRlZmF1bHQgZXhlY3V0b3IgYW5kIGNoZWNrIHRvIG1ha2Ugc3VyZSBpdCBpcyBhbiBleGVjdXRvciBzZXJ2aWNlDQotICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXggPSBudWxsOw0KLSAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBzZXJ2aWNlLmdldEV4ZWN1dG9yKCk7DQotICAgICAgICBpZiAoKGV4ZWN1dG9yICE9IG51bGwpICYmIChleGVjdXRvciBpbnN0YW5jZW9mIEV4ZWN1dG9yU2VydmljZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgZXggPSAoRXhlY3V0b3JTZXJ2aWNlKSBleGVjdXRvcjsNCi0NCi0gICAgICAgICAgICAvLyB0ZWxsIHRoZSBleGVjdXRvciB0byBzaHV0ZG93biBpbW1lZGlhdGVseSwgd2hpY2ggDQotICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gc3RvcCBhbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzIHZpYSBUaHJlYWQuaW50ZXJydXB0KCkNCi0gICAgICAgICAgICAvLyBhbmQgc2hvdWxkIHByZXZlbnQgbmV3IHRhc2tzIGZyb20gYmVpbmcgc3VibWl0dGVkDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgICAgIC5kZWJ1Zyh0aXRsZSArICIgc2h1dHRpbmcgZG93biBleGVjdXRvciBbIiArIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0iKTsNCi0gICAgICAgICAgICBleC5zaHV0ZG93bk5vdygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBObyBleGVjdXRvciBzZXJ2aWNlIGF2YWlsYWJsZS4gTm90aGluZyB0byB0ZXN0LiIpOw0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0NCi0gICAgICAgIGJvb2xlYW4gZ290UmVxdWVzdEV4Y2VwdGlvbiA9IGZhbHNlOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QxID0gInNsZWVwQXN5bmNfd2l0aF9DYWxsYmFja18xIjsNCi0gICAgICAgIENhbGxiYWNrSGFuZGxlcjxTbGVlcFJlc3BvbnNlPiBzbGVlcENhbGxiYWNrSGFuZGxlcjEgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyPFNsZWVwUmVzcG9uc2U+KCk7DQotICAgICAgICBGdXR1cmU8Pz4gc3IxID0gbnVsbDsNCi0NCi0gICAgICAgIHRyeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIC8vIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB0aGF0IHdpbGwgd2FpdCB1bnRpbCB3ZSBhc2sgZm9yIGl0DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHBvcnQuc2xlZXBBc3luYygiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgIiwgY2FsbGJhY2tIYW5kZXIxKSAgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgICAgIHNyMSA9IHBvcnQuc2xlZXBBc3luYyhyZXF1ZXN0MSwgc2xlZXBDYWxsYmFja0hhbmRsZXIxKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC5zbGVlcEFzeW5jKCIgKyByZXF1ZXN0MSArDQotICAgICAgICAgICAgICAgICAgICAiLCBjYWxsYmFja0hhbmRlcjEpICAjMSAuLi4uLnN1Ym1pdHRlZC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKyAiXSA6ICBnb3QgZXhjZXB0aW9uIFsiICsNCi0gICAgICAgICAgICAgICAgICAgIGV4Yy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICBbIiArIGV4Yy5nZXRNZXNzYWdlKCkgKyAiXSAiKTsNCi0gICAgICAgICAgICBnb3RSZXF1ZXN0RXhjZXB0aW9uID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IHdlbnQgdGhyb3VnaCwgY29udGludWUgcHJvY2Vzc2luZyB0byBzZWUgaWYgdGhlIHJlc3BvbnNlIGlzIHN0b3BwZWQNCi0gICAgICAgIC8vIHRoaXMgbWFrZXMgc3VyZSB0aGF0IHRoZSBzZXJ2ZXIgZG9lc24ndCBrZWVwIHRoZSByZXF1ZXN0IGZvcmV2ZXINCi0gICAgICAgIGJvb2xlYW4gZ290UmVzcG9uc2VFeGNlcHRpb24gPSBmYWxzZTsNCi0NCi0gICAgICAgIGlmICghZ290UmVxdWVzdEV4Y2VwdGlvbikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICAvLyB3YWtldXAgdGhlIHdhaXRpbmcgcmVxdWVzdA0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiBwb3J0Lndha2VVcChyZXF1ZXN0MSkgIzEgYmVpbmcgc3VibWl0dGVkLi4uLiIpOw0KLSAgICAgICAgICAgIFN0cmluZyB3YWtlMSA9IHBvcnQud2FrZVVwKHJlcXVlc3QxKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcG9ydC53YWtlVXAoIiArIHJlcXVlc3QxICsgIikgIzEgPSBbIiArIHdha2UxICsgIl0iKTsNCi0NCi0gICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHRoZSByZXNwb25zZQ0KLSAgICAgICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgICAgIFNsZWVwUmVzcG9uc2Ugc2xlZXBSZXNwMSA9IHNsZWVwQ2FsbGJhY2tIYW5kbGVyMS5nZXQoKTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKHNsZWVwUmVzcDEgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgc2xlZXBSZXNwb25zZSBbTk9UIE5VTExdIGZyb20gY2FsbGJhY2sgaGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdDEgPSBzbGVlcFJlc3AxLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gIzE6ICByZXN1bHQgWyIgKyByZXN1bHQxICsgIl0gIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIzE6ICBzbGVlcFJlc3BvbnNlIFtOVUxMXSBmcm9tIGNhbGxiYWNrIGhhbmRsZXIiKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlZSB3aGF0IHRoZSBGdXR1cmUgc2F5cw0KLSAgICAgICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiIHJlcXVlc3QgWyIgKyByZXF1ZXN0MSArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICMxOiAgLi4uLmNoZWNrIEZ1dHVyZSByZXNwb25zZS4uLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZ1dHVyZVJlc3VsdCA9IHNyMS5nZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIiByZXF1ZXN0IFsiICsgcmVxdWVzdDEgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAjMTogIC4uLi5GdXR1cmUgcmVzcG9uc2UgWyIgKyBmdXR1cmVSZXN1bHQgKyAiXS4uLiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Yykgew0KLQ0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICIgcmVxdWVzdCBbIiArIHJlcXVlc3QxICsgIl0gOiAgZ290IGV4Y2VwdGlvbiBbIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIFsiICsgZXhjLmdldE1lc3NhZ2UoKSArICJdICIpOw0KLSAgICAgICAgICAgICAgICBnb3RSZXNwb25zZUV4Y2VwdGlvbiA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCByZWNlaXZlIGFuIGV4Y2VwdGlvbiBmcm9tIHRyeWluZyB0byBzdWJtaXQgdGhlIHJlcXVlc3Qgd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdFJlcXVlc3RFeGNlcHRpb24pOw0KLQ0KLSAgICAgICAgLy9hc3NlcnRUcnVlKCJEaWQgbm90IHJlY2VpdmUgYW4gZXhjZXB0aW9uIGZyb20gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgcmVzcG9uc2Ugd2hlbiB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93bi4iLGdvdFJlc3BvbnNlRXhjZXB0aW9uKTsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIGZvciBkb2luZyBpc0FzbGVlcCBjaGVja3MuIFdpbGwgcGVyZm9ybSBpc0FzbGVlcA0KLSAgICAgKiB1cCB0byBhIE1BWF9JU0FTTEVFUF9DSEVDSyBudW1iZXIgb2YgY2hlY2tzLiBXaWxsIHNsZWVwIGZvcg0KLSAgICAgKiBTTEVFUF9JU0FTTEVFUF9TRUMgc2Vjb25kcyBpbiBiZXR3ZWVuIHJlcXVlc3RzLiBJZiByZWFjaGVzIG1heGltdW0gbnVtYmVyDQotICAgICAqIGZvIHJldHJpZXMgdGhlbiB3aWxsIGZhaWwgdGhlIHRlc3QNCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FzbGVlcENoZWNrKFN0cmluZyBNRVNTQUdFLCBBc3luY1BvcnQgcG9ydCkgew0KLSAgICAgICAgYm9vbGVhbiBhc2xlZXAgPSBmYWxzZTsNCi0gICAgICAgIGludCBjaGVjayA9IDMwOw0KLSAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7DQotICAgICAgICBkbyB7DQotICAgICAgICAgICAgbXNnID0gcG9ydC5pc0FzbGVlcChNRVNTQUdFKTsNCi0gICAgICAgICAgICBhc2xlZXAgPSAobXNnICE9IG51bGwpOw0KLQ0KLSAgICAgICAgICAgIC8vIGZhaWwgdGhlIHRlc3QgaWYgd2UgcmFuIG91dCBvZiBjaGVja3MNCi0gICAgICAgICAgICBpZiAoKGNoZWNrLS0pID09IDApDQotICAgICAgICAgICAgICAgIGZhaWwoIlNlcnZlIGRpZCBub3QgcmVjZWl2ZSBzbGVlcCBhZnRlciBzZXZlcmFsIHJldHJpZXMiKTsNCi0NCi0gICAgICAgICAgICAvLyBzbGVlcCBmb3IgYSBiaXQNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzApOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IHdoaWxlICghYXNsZWVwKTsNCi0NCi0gICAgICAgIGlmIChhc2xlZXApIHsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJTbGVlcGluZyBvbiBhbiBpbmNvcnJlY3QgbWVzc2FnZSIsIE1FU1NBR0UuZXF1YWxzKG1zZykpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotDQotICAgIHByaXZhdGUgQXN5bmNTZXJ2aWNlIGdldFNlcnZpY2UoRXhlY3V0b3IgZXgpIHsNCi0gICAgICAgIEFzeW5jU2VydmljZSBzZXJ2aWNlID0gbmV3IEFzeW5jU2VydmljZSgpOw0KLQ0KLSAgICAgICAgaWYgKGV4IT0gbnVsbCkNCi0gICAgICAgICAgICBzZXJ2aWNlLnNldEV4ZWN1dG9yKGV4KTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHNlcnZpY2UuZ2V0RXhlY3V0b3IoKSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG15Q2xhc3NOYW1lICsgIiA6IGdldFNlcnZpY2UoKSA6IGV4ZWN1dG9yIGlzIG51bGwiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhteUNsYXNzTmFtZSArICIgOiBnZXRTZXJ2aWNlKCkgOiBleGVjdXRvciBpcyBhdmFpbGFibGUgIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gc2VydmljZTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwcml2YXRlIEFzeW5jUG9ydCBnZXRQb3J0KEFzeW5jU2VydmljZSBzZXJ2aWNlKSB7DQotDQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IHNlcnZpY2UuZ2V0QXN5bmNQb3J0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJQb3J0IGlzIG51bGwiLCBwb3J0KTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcG9ydDsNCi0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIGZvciBvYnRhaW5pbmcgYSBwcm94eSBwcmUtY29uZmlndXJlZCB3aXRoIGENCi0gICAgICogc3BlY2lmaWMgRXhlY3V0b3INCi0gICAgICovDQotICAgIHByaXZhdGUgQXN5bmNQb3J0IGdldFBvcnQoRXhlY3V0b3IgZXgpIHsNCi0gICAgICAgIEFzeW5jU2VydmljZSBzZXJ2aWNlID0gZ2V0U2VydmljZShleCk7DQotDQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IHNlcnZpY2UuZ2V0QXN5bmNQb3J0KCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKCJQb3J0IGlzIG51bGwiLCBwb3J0KTsNCi0NCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwNCi0gICAgICAgICAgICAgICAgRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcG9ydDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRCbG9ja2luZyhGdXR1cmU8Pz4gbW9uaXRvcil7DQotICAgICAgICB3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkpew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUmVzb3VyY2VJbmplY3Rpb25UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9SZXNvdXJjZUluamVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjI3MDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9SZXNvdXJjZUluamVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnJlc291cmNlaW5qZWN0aW9uLnNlaS5SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5zZWkuUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIFN0cmluZyBheGlzRW5kcG9pbnQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZS5SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlSW1wbFBvcnQiOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKFJlc291cmNlSW5qZWN0aW9uVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUgZ2V0UHJveHkoKSB7DQotICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2Ugc2VydmljZSA9IG5ldyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2UoKTsNCi0gICAgICAgIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUgcHJveHkgPSBzZXJ2aWNlLmdldFJlc291cmNlSW5qZWN0aW9uUG9ydCgpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICByZXR1cm4gcHJveHk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IGFuIGVuZHBvaW50IHdpdGggYW4gaW5qZWN0IFdlYlNlcnZpY2VDb250ZXh0DQotICAgICAqIGNhbiBzdWNjZXNzZnVsbHkgZ2V0IGFuZCBxdWVyeSB0aGUgd2ViIHNlcnZpY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1dpdGhSZXNvdXJjZUluamVjdGlvbkFuZExpZmVjeWNsZU1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgICAgDQotICAgICAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudGVzdEluamVjdGlvbigic2FtcGxlIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBudWxsIiwgcmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc3BvbnNlIHdhcyBub3Qgc3VjY2VzZnVsOiAiICsgcmVzcG9uc2UsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuaW5kZXhPZigiU1VDQ0VTUyIpID49IDApOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFJlcGVhdCB0byB2ZXJpZnkgYmVoYXZpb3INCi0gICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnRlc3RJbmplY3Rpb24oInNhbXBsZSIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNwb25zZSB3YXMgbm90IHN1Y2Nlc2Z1bDogIiArIHJlc3BvbnNlLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmluZGV4T2YoIlNVQ0NFU1MiKSA+PSAwKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUnVudGltZUV4Y2VwdGlvbnNBc3luY01lcFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvUnVudGltZUV4Y2VwdGlvbnNBc3luY01lcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3NTA5NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL1J1bnRpbWVFeGNlcHRpb25zQXN5bmNNZXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQRmF1bHRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkZpbGVTeXN0ZW1Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudC5Bc3luY0NsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5jbGllbnQuQXN5bmNQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudC5Bc3luY1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuY2xpZW50LlRocm93RXhjZXB0aW9uRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuY29tbW9uLkNhbGxiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LkV4Y2VwdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2U7Ci0KLS8qKgotICogVGVzdCBmb3IgdmFyaW9zIGFzeW5jIGV4Y2VwdGlvbnMgd2hlcm4gQXN5bmNNRVAgaXMgZW5hYmxlZAotICovCi1wdWJsaWMgY2xhc3MgUnVudGltZUV4Y2VwdGlvbnNBc3luY01lcFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQXN5bmNTZXJ2aWNlMi5Eb2NMaXRXcmFwcGVkUG9ydEltcGxQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVF9FWENFUFRJT05fRU5EUE9JTlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYxL2F4aXMyL3NlcnZpY2VzL0FzeW5jU2VydmljZTIuRG9jTGl0V3JhcHBlZFBvcnRJbXBsUG9ydCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUXzQwNF9FTkRQT0lOVCA9IERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UIC8vIENvbnN0YW50cy5ET0NMSVRXUl9BU1lOQ19FTkRQT0lOVAotICAgICAgICAgICAgKyAiL0RvZXNOb3RFeGlzdCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1RfTk9UX0ZPVU5EX0VORFBPSU5UID0gImh0dHA6Ly90aGlzLmVuZHBvaW50LmRvZXMubm90LmV4aXN0L25vcGUiOwotCi0gICAgLyoKLSAgICAgKiBGb3IgYXN5bmMtb24tdGhlLXdpcmUgZXhjaGFuZ2VzLCB3ZSBuZWVkIHRvIGVuYWJsZSBXUy1BZGRyZXNzaW5nIGFuZCBnZXQgYSB0cmFuc3BvcnQKLSAgICAgKiBsaXN0ZW5lciBzZXR1cCB0byByZWNlaXZlIHRoZSBpbmJvdW5kIHJlcXVlc3QgZnJvbSB0aGUgc2VydmljZS1wcm92aWRlciB3aGljaCBjb250YWlucyB0aGUKLSAgICAgKiByZXNwb25zZS4gIFdlIG9ubHkgbmVlZCB0byBkbyB0aGF0IG9uZSB0aW1lIGZvciBhbGwgdGhlIHRlc3RzLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGxpc3RlbmVyQWxyZWFkeVNldHVwID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3QgdGVzdCA9IGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKAotICAgICAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb25zQXN5bmNNZXBUZXN0LmNsYXNzKSwgbnVsbCwKLSAgICAgICAgICAgICAgICAidGVzdC1yZXNvdXJjZXMvYXhpczJfYWRkcmVzc2luZy54bWwiKTsKLSAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBc3luY1BvcnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBvcnQobnVsbCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQXN5bmNQb3J0IGdldFBvcnQoV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLQotICAgICAgICBBc3luY1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBc3luY1NlcnZpY2UoKTsKLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBzZXJ2aWNlLmdldEFzeW5jUG9ydChmZWF0dXJlcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlBvcnQgaXMgbnVsbCIsIHBvcnQpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgcmMucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsKLQotICAgICAgICByZXR1cm4gcG9ydDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggc3luYyBtZXRob2QsIHNwZWNpZnlpbmcgdGhhdCBpdCBzaG91bGQgdXNlCi0gICAgICogICAgICAgICAgICAgICB0aGUgYXN5bmMtb24tdGhlLXdpcmUgTUVQLiAgVGhlIHByb3h5IGVucGRvaW50IHNwZWNpZmllcyBhIHBvcnQgdGhhdAotICAgICAqICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuICBWZXJpZnkgdGhhdCB0aGUgY29ubmVjdGlvbiBleGNlcHRpb24gaXMgcmVjZWl2ZWQKLSAgICAgKiAgICAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQuCi0gICAgICovCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrX2FzeW5jV2lyZV9Db25uZWN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNldHVwQWRkcmVzc2luZ0FuZExpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByYyA9ICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0KS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICByYy5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIENPTk5FQ1RfRVhDRVBUSU9OX0VORFBPSU5UKTsKLSAgICAgICAgcmMucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXAiLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcCA9IHBvcnQudGhyb3dFeGNlcHRpb24oRXhjZXB0aW9uVHlwZUVudW0uV1NFKTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGFuIGV4Y2VwdGlvbiBhcyBleHBlY3RlZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGVlIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgZ2V0IGEgY2F1c2Ugd2l0aGluIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZWUuZ2V0Q2F1c2UoKSAhPSBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNhdXNlIHdhcyBub3QgQ29ubmVjdGlvbkV4Y2VwdGlvbiBhcyBleHBlY3RlZCIsIAotICAgICAgICAgICAgICAgICAgICAgICBlZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGVzdFN0cmF0ZWd5IEludm9rZSB0aGUgcHJveHkgd2l0aCBhc3luYy1wb2xsaW5nIG1ldGhvZCwgdGhlIHByb3h5IGlzCi0gICAgICogICAgICAgICAgICAgICBjb25maWd1cmVkIGFnYWluc3QgYW4gZW5kcG9pbnQgd2hpY2ggZG9lcyBub3QgZXhpc3QgKHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgIGlzIGEgc2VydmVyIG5vdCBmb3VuZCBjYXNlKS4gRXhwZWN0ZWQgdG8gdGhyb3cgYQotICAgICAqICAgICAgICAgICAgICAgRUUvV1NFL1Vua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9sbGluZ19hc3luY01FUF9Vbmtud29uSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgcmMucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIEhPU1RfTk9UX0ZPVU5EX0VORFBPSU5UKTsKLQotICAgICAgICBSZXNwb25zZTxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiByZXNwID0gcG9ydAotICAgICAgICAgICAgICAgIC50aHJvd0V4Y2VwdGlvbkFzeW5jKEV4Y2VwdGlvblR5cGVFbnVtLldTRSk7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcC5nZXQoKTsKLQotICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIGF0IGludm9rZSB0aW1lIHdoZW4gYW4gaW52YWxpZCBlbmRwb2ludCBhZGRyZXNzIGlzIHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIC8vIENvbnN0YW50cy5sb2dTdGFjayhlZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIkVFLmdldENhdXNlIG11c3QgYmUgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV1NFLmdldENhdXNlIG11c3QgYmUgVW5rbm93bkhvc3RFeGNlcHRpb24iLCBjaGVja1N0YWNrKAotICAgICAgICAgICAgICAgICAgICBlZSwgVW5rbm93bkhvc3RFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0ZXN0U3RyYXRlZ3kgSW52b2tlIHRoZSBwcm94eSB3aXRoIGFzeW5jLXBvbGxpbmcgbWV0aG9kLCB0aGUgcHJveHkgaXMKLSAgICAgKiAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYWdhaW5zdCBhbiBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBleGlzdCAodGhpcwotICAgICAqICAgICAgICAgICAgICAgaXMgYSA0MDQtTm90IEZvdW5kIGNhc2UpLiBFeHBlY3RlZCB0byB0aHJvdyBhIEVFL1dTRQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdfYXN5bmNNRVBfNDA0Tm90Rm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByYyA9ICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0KS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICByYy5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIENPTk5FQ1RfNDA0X0VORFBPSU5UKTsKLSAgICAgICAgUmVzcG9uc2U8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gcmVzcCA9IHBvcnQKLSAgICAgICAgICAgICAgICAudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UpOwotCi0gICAgICAgIEFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyhyZXNwKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3AuZ2V0KCk7Ci0KLSAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZCBhdCBpbnZva2UgdGltZSB3aGVuIGFuIGludmFsaWQgZW5kcG9pbnQgYWRkcmVzcyBpcyBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAvLyBDb25zdGFudHMubG9nU3RhY2soZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJFRS5nZXRDYXVzZSBtdXN0IGJlIFdlYlNlcnZpY2VFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICBlZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgV2ViU2VydmljZUV4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUT0RPOiBSRVZJRVcuIE9yaWdpbmFsIHRlc3Qgd2FzIHdyaXR0ZW4gZXhwZWN0aW5nIGEgNDA0IGZyb20gdGhlCi0gICAgICAgICAgICAgKiBiYWQgVVJMIHNldCBvbiB0aGUgcmVxdWVzdGNvbnRleHQuIEhvd2V2ZXIsIHRoaXMgdGVzdCBhY3R1YWxseQotICAgICAgICAgICAgICogZG9lcyBtYWtlIGl0IHRvIHRoZSBlbmRwb2ludCwgYW5kIHJldHVybnMgdGhlIGV4Y2VwdGlvbiBzcGVjaWZpZWQKLSAgICAgICAgICAgICAqIGluIHRoZSBjYWxsIHRvIHBvcnQudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UpCi0gICAgICAgICAgICAgKiBhYm92ZS4uLnNvIHRoZSBhc3NlcnQgaXMgY29tbWVudGVkIHVudGlsIHdlIGNhbiByZXZpZXcgaXQuIEFsc28sCi0gICAgICAgICAgICAgKiBkaWZmZXJlbnQgc2VydmVycyBtYXkgYmVoYXZlIGRpZmZlcmVudGx5LCBkZXBlbmRpbmcgb24gaG93IHRoZXkKLSAgICAgICAgICAgICAqIHdhbnQgdG8gcGFyc2UgdGhlIGluY29taW5nIHJlcXVlc3QgVVJMLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvLyBhc3NlcnRUcnVlKCJXU0UuZ2V0Q2F1c2UgbXVzdCBiZSA0MDQiLCBjaGVja1N0YWNrKGVlLAotICAgICAgICAgICAgLy8gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtcG9sbGluZyBtZXRob2QsIHRoZSBlbmRwb2ludAotICAgICAqICAgICAgICAgICAgICAgd2lsbCB0aHJvdyBhIFdTRSB3aGljaCBzaG91bGQgcmVzdWx0IGluIGEKLSAgICAgKiAgICAgICAgICAgICAgIEVFL1NPQVBGYXVsdEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdfYXN5bmNNRVBfV2ViU2VydmljZUV4Y2VwdGlvbigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBBc3luY1BvcnQgcG9ydCA9IGdldFBvcnQoKTsKLSAgICAgICAgUmVzcG9uc2U8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gcmVzcCA9IHBvcnQKLSAgICAgICAgICAgICAgICAudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UpOwotCi0gICAgICAgIEFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyhyZXNwKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3AuZ2V0KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgYXQgUmVzcG9uc2UuZ2V0IHdoZW4gZWRucG9pbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIC8vIENvbnN0YW50cy5sb2dTdGFjayhlZSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgICAgICJFeGVjdXRpb25FeGNlcHRpb24uZ2V0Q2F1c2Ugc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIFNPQVBGYXVsdEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtcG9sbGluZyBtZXRob2QsIHRoZSBlbmRwb2ludAotICAgICAqICAgICAgICAgICAgICAgd2lsbCB0aHJvdyBhIHdzZGw6ZmF1bHQgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbiBhCi0gICAgICogICAgICAgICAgICAgICBFRS9TaW1wbGVGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BvbGxpbmdfYXN5bmNNRVBfV3NkbEZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBnZXRQb3J0KCk7Ci0gICAgICAgIFJlc3BvbnNlPFRocm93RXhjZXB0aW9uUmVzcG9uc2U+IHJlc3AgPSBwb3J0Ci0gICAgICAgICAgICAgICAgLnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NETF9GQVVMVCk7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcC5nZXQoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZCBhdCBSZXNwb25zZS5nZXQgd2hlbiBlZG5wb2ludCB0aHJvd3MgYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgLy8gQ29uc3RhbnRzLmxvZ1N0YWNrKGVlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgU2ltcGxlRmF1bHQiLAotICAgICAgICAgICAgICAgICAgICBlZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVGhyb3dFeGNlcHRpb25GYXVsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogKioqKioqKioqKioqKioqKioqKiogQXN5bmMgQ2FsbGJhY2sgKioqKioqKioqKioqKioqKioqKiAqLwotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtY2FsbGJhY2sgbWV0aG9kLCB0aGUgcHJveHkgaXMKLSAgICAgKiAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYWdhaW5zdCBhbiBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBleGlzdCAodGhpcwotICAgICAqICAgICAgICAgICAgICAgaXMgYSBzZXJ2ZXIgbm90IGZvdW5kIGNhc2UpLiBFeHBlY3RlZCB0byB0aHJvdyBhCi0gICAgICogICAgICAgICAgICAgICBFRS9XU0UvVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja19hc3luY01FUF9Vbmtub3duSG9zdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBIT1NUX05PVF9GT1VORF9FTkRQT0lOVCk7Ci0KLSAgICAgICAgQ2FsbGJhY2tIYW5kbGVyPFRocm93RXhjZXB0aW9uUmVzcG9uc2U+IGhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyPFRocm93RXhjZXB0aW9uUmVzcG9uc2U+KCk7Ci0gICAgICAgIEZ1dHVyZTw/PiByZXNwID0gcG9ydC50aHJvd0V4Y2VwdGlvbkFzeW5jKEV4Y2VwdGlvblR5cGVFbnVtLldTRSwKLSAgICAgICAgICAgICAgICBoYW5kbGVyKTsKLQotICAgICAgICBBc3luY0NsaWVudC53YWl0QmxvY2tpbmcocmVzcCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoYW5kbGVyLmdldCgpOwotCi0gICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgYXQgaW52b2tlIHRpbWUgd2hlbiBhbiBpbnZhbGlkIGVuZHBvaW50IGFkZHJlc3MgaXMgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgLy8gQ29uc3RhbnRzLmxvZ1N0YWNrKGVlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV1NFLmdldENhdXNlIG11c3QgYmUgVW5rbm93bkhvc3RFeGNlcHRpb24iLCBjaGVja1N0YWNrKAotICAgICAgICAgICAgICAgICAgICBlZSwgVW5rbm93bkhvc3RFeGNlcHRpb24uY2xhc3MpKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtY2FsbGJhY2sgbWV0aG9kLCB0aGUgcHJveHkgaXMKLSAgICAgKiAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQgYWdhaW5zdCBhbiBlbmRwb2ludCB3aGljaCBkb2VzIG5vdCBleGlzdCAodGhpcwotICAgICAqICAgICAgICAgICAgICAgaXMgYSA0MDQgTm90IEZvdW5kIGNhc2UpLiBFeHBlY3RlZCB0byB0aHJvdyBhCi0gICAgICogICAgICAgICAgICAgICBFRS9XU0UvVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja19hc3luY01FUF80MDROb3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgQ09OTkVDVF80MDRfRU5EUE9JTlQpOwotCi0gICAgICAgIENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiBoYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPigpOwotICAgICAgICBGdXR1cmU8Pz4gcmVzcCA9IHBvcnQudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UsCi0gICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGFuZGxlci5nZXQoKTsKLQotICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIGF0IFJlc3BvbnNlLmdldCB3aGVuIGVkbnBvaW50IHRocm93cyBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAvLyBDb25zdGFudHMubG9nU3RhY2soZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW9uRXhjZXB0aW9uLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgZWUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VFeGNlcHRpb24pOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVE9ETzogUkVWSUVXLiBPcmlnaW5hbCB0ZXN0IHdhcyB3cml0dGVuIGV4cGVjdGluZyBhIDQwNCBmcm9tIHRoZQotICAgICAgICAgICAgICogYmFkIFVSTCBzZXQgb24gdGhlIHJlcXVlc3Rjb250ZXh0LiBIb3dldmVyLCB0aGlzIHRlc3QgYWN0dWFsbHkKLSAgICAgICAgICAgICAqIGRvZXMgbWFrZSBpdCB0byB0aGUgZW5kcG9pbnQsIGFuZCByZXR1cm5zIHRoZSBleGNlcHRpb24gc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiBpbiB0aGUgY2FsbCB0byBwb3J0LnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NFKQotICAgICAgICAgICAgICogYWJvdmUuLi5zbyB0aGUgYXNzZXJ0IGlzIGNvbW1lbnRlZCB1bnRpbCB3ZSBjYW4gcmV2aWV3IGl0LiBBbHNvLAotICAgICAgICAgICAgICogZGlmZmVyZW50IHNlcnZlcnMgbWF5IGJlaGF2ZSBkaWZmZXJlbnRseSwgZGVwZW5kaW5nIG9uIGhvdyB0aGV5Ci0gICAgICAgICAgICAgKiB3YW50IHRvIHBhcnNlIHRoZSBpbmNvbWluZyByZXF1ZXN0IFVSTC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLy8gYXNzZXJ0VHJ1ZSgiV1NFLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZgotICAgICAgICAgICAgLy8gQ29ubmVjdEV4Y2VwdGlvbiIsIGNoZWNrU3RhY2soZWUsCi0gICAgICAgICAgICAvLyBqYXZhLm5pby5jaGFubmVscy5VbnJlc29sdmVkQWRkcmVzc0V4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRlc3RTdHJhdGVneSBJbnZva2UgdGhlIHByb3h5IHdpdGggYXN5bmMtY2FsbGJhY2sgbWV0aG9kLCB0aGUgcHJveHkKLSAgICAgKiAgICAgICAgICAgICAgIHRocm93cyBhIGdlbmVyaWMgV2ViU2VydmljZUV4Y2VwdGlvbi4gSSB0aGluayB3ZSBtYXkgaGF2ZQotICAgICAqICAgICAgICAgICAgICAgdGhlIHJlY29yZCBmb3IgbG9uZ2VzdCBtZXRob2QgbmFtZSBpbiBBcGFjaGUgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDYWxsYmFja19hc3luY01FUF9XZWJTZXJ2aWNlRXhjZXB0aW9uKCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmMgPSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydCkuZ2V0UmVxdWVzdENvbnRleHQoKTsKLSAgICAgICAgcmMucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLAotICAgICAgICAgICAgICAgIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsKLSAgICAgICAgcmMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPLCAiYmxhcmciKTsKLQotICAgICAgICBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gaGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4oKTsKLSAgICAgICAgRnV0dXJlPD8+IHJlc3AgPSBwb3J0LnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NFLAotICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotCi0gICAgICAgIEFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyhyZXNwKTsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGFuZGxlci5nZXQoKTsKLQotICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIGF0IFJlc3BvbnNlLmdldCB3aGVuIGVkbnBvaW50IHRocm93cyBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICBlID0gZWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAiRXhlY3V0aW9uRXhjZXB0aW9uLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICBlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTT0FQRmF1bHRFeGNlcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0ZXN0U3RyYXRlZ3kgSW52b2tlIHRoZSBwcm94eSB3aXRoIGFzeW5jLWNhbGxiYWNrIG1ldGhvZCwgdGhlIHByb3h5Ci0gICAgICogICAgICAgICAgICAgICB0aHJvd3MgYSBnZW5lcmljIFdlYlNlcnZpY2VFeGNlcHRpb24uIEkgdGhpbmsgd2UgbWF5IGhhdmUKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSByZWNvcmQgZm9yIGxvbmdlc3QgbWV0aG9kIG5hbWUgaW4gQXBhY2hlIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2FsbGJhY2tfYXN5bmNNRVBfYXN5bmNXaXJlX0FkZHJlc3NpbmdfV2ViU2VydmljZUV4Y2VwdGlvbigpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0dXBBZGRyZXNzaW5nQW5kTGlzdGVuZXIoKTsKLSAgICAgICAgQXN5bmNQb3J0IHBvcnQgPSBnZXRQb3J0KG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJjID0gKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQpLmdldFJlcXVlc3RDb250ZXh0KCk7Ci0gICAgICAgIHJjLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCk7Ci0gICAgICAgIC8vcmMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX1JFUExZX1RPLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKTsKLSAgICAgICAgcmMucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVzZS5hc3luYy5tZXAiLCBCb29sZWFuLlRSVUUpOwotCi0gICAgICAgIENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPiBoYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcjxUaHJvd0V4Y2VwdGlvblJlc3BvbnNlPigpOwotICAgICAgICBGdXR1cmU8Pz4gcmVzcCA9IHBvcnQudGhyb3dFeGNlcHRpb25Bc3luYyhFeGNlcHRpb25UeXBlRW51bS5XU0UsCi0gICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0KLSAgICAgICAgQXN5bmNDbGllbnQud2FpdEJsb2NraW5nKHJlc3ApOwotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBoYW5kbGVyLmdldCgpOwotCi0gICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgYXQgUmVzcG9uc2UuZ2V0IHdoZW4gZWRucG9pbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgIGUgPSBlZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZSk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAgICAgIkV4ZWN1dGlvbkV4Y2VwdGlvbi5nZXRDYXVzZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgV2ViU2VydmljZUV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGVzdFN0cmF0ZWd5IEludm9rZSB0aGUgcHJveHkgd2l0aCBhc3luYy1jYWxsYmFjayBtZXRob2QsIHRoZSBlbmRwb2ludAotICAgICAqICAgICAgICAgICAgICAgd2lsbCB0aHJvdyBhIHdzZGw6ZmF1bHQgd2hpY2ggc2hvdWxkIHJlc3VsdCBpbiBhCi0gICAgICogICAgICAgICAgICAgICBFRS9TaW1wbGVGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NhbGxiYWNrX2FzeW5jTUVQX1dzZGxGYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEFzeW5jUG9ydCBwb3J0ID0gZ2V0UG9ydCgpOwotICAgICAgICBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gaGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4oKTsKLSAgICAgICAgRnV0dXJlPD8+IHJlc3AgPSBwb3J0LnRocm93RXhjZXB0aW9uQXN5bmMoRXhjZXB0aW9uVHlwZUVudW0uV1NETF9GQVVMVCwKLSAgICAgICAgICAgICAgICBoYW5kbGVyKTsKLQotICAgICAgICBBc3luY0NsaWVudC53YWl0QmxvY2tpbmcocmVzcCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRsZXIuZ2V0KCk7Ci0KLSAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZCBhdCBSZXNwb25zZS5nZXQgd2hlbiBlZG5wb2ludCB0aHJvd3MgYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgLy9Db25zdGFudHMubG9nU3RhY2soZWUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW9uRXhjZXB0aW9uLmdldENhdXNlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBTaW1wbGVGYXVsdCIsCi0gICAgICAgICAgICAgICAgICAgIGVlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBUaHJvd0V4Y2VwdGlvbkZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tTdGFjayhUaHJvd2FibGUgdCwgQ2xhc3MgZmluZCkgewotICAgICAgICBUaHJvd2FibGUgY3VyID0gdDsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmb3VuZCA9IGN1ci5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oZmluZCk7Ci0gICAgICAgICAgICBjdXIgPSBjdXIuZ2V0Q2F1c2UoKTsKLSAgICAgICAgfSB3aGlsZSAoIWZvdW5kICYmIGN1ciAhPSBudWxsKTsKLQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFNldHVwIHRvIHVzZSBhZGRyZXNzaW5nIGFuZCB0byBzdGFydCBhIGxpc3RlbmVyIHRvIHJlY2VpdmUgaW5ib3VuZCBhc3luYyByZXNwb25zZXMKLSAgICAgKiBmcm9tIHRoZSBzZXJ2aWNlLXByb3ZpZGVyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHByaXZhdGUgdm9pZCBzZXR1cEFkZHJlc3NpbmdBbmRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWxpc3RlbmVyQWxyZWFkeVNldHVwKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lckFscmVhZHlTZXR1cCA9IHRydWU7Ci0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHVzZSBhZGRyZXNzaW5nIG9uIHRoZSBjbGllbnQgc2lkZQotICAgICAgICAgICAgU3RyaW5nIHJlcG9wYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIgotICAgICAgICAgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQucmVwb3NpdG9yeSIsICJ0YXJnZXQvY2xpZW50LXJlcG8iKTsKLSAgICAgICAgICAgIFN0cmluZyBheGlzMnhtbHBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpCi0gICAgICAgICAgICAgICAgICAgICsgIi90ZXN0LXJlc291cmNlcy9heGlzMl9hZGRyZXNzaW5nLnhtbCI7Ci0gICAgICAgICAgICBGaWxlU3lzdGVtQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKAotICAgICAgICAgICAgICAgICAgICByZXBvcGF0aCwgYXhpczJ4bWxwYXRoKTsKLSAgICAgICAgICAgIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9TdHJpbmdMaXN0VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvU3RyaW5nTGlzdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTUyY2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9TdHJpbmdMaXN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5zdHJpbmdsaXN0LnNlaS5TdHJpbmdMaXN0UG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Quc2VpLlN0cmluZ0xpc3RTZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMaXN0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgU3RyaW5nIGF4aXNFbmRwb2ludCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU3RyaW5nTGlzdFNlcnZpY2UuU3RyaW5nTGlzdFBvcnRUeXBlSW1wbFBvcnQiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoU3RyaW5nTGlzdFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RTY2VuYXJpbygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIFN0cmluZ0xpc3RTZXJ2aWNlIHNscyA9IG5ldyBTdHJpbmdMaXN0U2VydmljZSgpOw0KLSAgICAgICAgU3RyaW5nTGlzdFBvcnRUeXBlIHBvcnRUeXBlID1zbHMuZ2V0U3RyaW5nTGlzdFBvcnQoKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBwID0JKEJpbmRpbmdQcm92aWRlcilwb3J0VHlwZTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICBTdHJpbmdbXSBzZW5kID0gbmV3IFN0cmluZ1tdeyJTdHJpbmcxIiwiU3RyaW5nMiIsIlN0cmluZzMiLCJTdHJpbmcgU3BhY2UifTsNCi0gICAgICAgIC8vIHNpbmNlIHRoZSBhcnJheSBpcyBzZXJpbGl6ZWQgYXMgeHNkOmxpc3QgdGhlIHN0cmluZyB3aXRoIHNwYWNlIHdpbGwgYmUgY29udmVydGVkDQotICAgICAgICAvLyB0byBhIG5ldyBhcnJheSBlbGVtZW50LiBzbyB3ZSBzZW5kIGFycmF5Lmxlbmd0aCBvZiAzIGJ1dCBnZXQgYmFjayBhcnJheS5sZW5ndGggb2YgNQ0KLSAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW117IlN0cmluZzEiLCJTdHJpbmcyIiwiU3RyaW5nMyIsIlN0cmluZyIsIlNwYWNlIn07DQotICAgICAgICBTdHJpbmdbXSByZXRTdHJpbmcgPSBwb3J0VHlwZS5zdHJpbmdMaXN0KHNlbmQpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRTdHJpbmcpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmV0U3RyaW5nLmxlbmd0aCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCByZXRTdHJpbmdbaV0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXBlYXQgdG8gZW5zdXJlIHZhbGlkaXR5DQotICAgICAgICByZXRTdHJpbmcgPSBwb3J0VHlwZS5zdHJpbmdMaXN0KHNlbmQpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRTdHJpbmcpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmV0U3RyaW5nLmxlbmd0aCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2ldLCByZXRTdHJpbmdbaV0pOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvV1NHZW5UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9XU0dlblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGRkZTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9XU0dlblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uY2xpZW50LldTR2VuSW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5jbGllbnQuV1NHZW5TZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBXU0dlblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9XU0dlblNlcnZpY2UuV1NHZW5Qb3J0IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShXcmFwVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICAJDQotICAgIA0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFdTR2VuKCkgew0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFdTR2VuU2VydmljZSBzZXJ2aWNlID0gbmV3IFdTR2VuU2VydmljZSgpOw0KLSAgICAgICAgICAgIFdTR2VuSW50ZXJmYWNlIHByb3h5ID0gc2VydmljZS5nZXRXU0dlblBvcnQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpcHJveHk7DQotICAgICAgICAgICAgcC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgDQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQpOyAgDQotICAgICAgICAgICAgU3RyaW5nIG91dFN0cmluZyA9ICJ0aGlzIGlzIGEgd29uZGVyZnVsIHRlc3QiOw0KLSAgICAgICAgICAgIFN0cmluZyBzID0gcHJveHkuZWNob1N0cmluZyhvdXRTdHJpbmcpOw0KLQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTdHJpbmcgcyA9ICIgKyBzKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob3V0U3RyaW5nLCBzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZXBlYXQgdG8gZW5zdXJlIHZhbGlkaXR5DQotICAgICAgICAgICAgcyA9IHByb3h5LmVjaG9TdHJpbmcob3V0U3RyaW5nKTsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiU3RyaW5nIHMgPSAiICsgcyk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG91dFN0cmluZywgcyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIldlIHNob3VsZCBub3QgZ2V0IGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGRpZCIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvV3JhcFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL1dyYXBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk4OGM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvV3JhcFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQ3VzdG9tQnVpbGRlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcFNlcnZpY2U7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlcjsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuSGVhZGVyUGFydDA7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclBhcnQxOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFdyYXBUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXRXcmFwU2VydmljZS5Eb2NMaXRXcmFwSW1wbFBvcnQiOw0KLQkNCi0gICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgc29tZSBjaGFyYWN0ZXJzIHRoYXQgcmVxdWlyZSBYTUwgZW5jb2RpbmcNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTENIQVJTID0gIjw8PDM+Pj4zPj4+MyI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoV3JhcFRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogR2V0IHRoZURvY0xpdFdyYXAgUHJ4b3kNCi0gICAgICAgICAqIEByZXR1cm4gRG9jTGl0V3JhcFByb3h5DQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgRG9jTGl0V3JhcCBnZXRQcm94eSgpIHsNCi0gICAgICAgICAgICBEb2NMaXRXcmFwU2VydmljZSBzZXJ2aWNlID0gbmV3IERvY0xpdFdyYXBTZXJ2aWNlKCk7DQotICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IHNlcnZpY2UuZ2V0RG9jTGl0V3JhcFBvcnQoKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgcCA9IChCaW5kaW5nUHJvdmlkZXIpIHByb3h5Ow0KLSAgICAgICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGF4aXNFbmRwb2ludCk7DQotICAgICAgICAgICAgcmV0dXJuIHByb3h5Ow0KLSAgICAgICAgfQ0KLQkNCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlTeW5jKCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVxU3RyaW5nID0gIlRlc3QgdHdvV2F5IFN5bmMiOw0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkudHdvV2F5KHJlcVN0cmluZyk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTeW5jIFJlc3BvbnNlID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVXYXlWb2lkV2l0aE5vSW5wdXRQYXJhbXMoKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotDQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRG9jTGl0V3JhcFNlcnZpY2UoKTsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIHByb3h5Lm9uZVdheVZvaWQoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgICAgICAgICBwcm94eS5vbmVXYXlWb2lkKCk7DQotDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFR3b1dheUhvbGRlcigpew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGhvbGRlclN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgdHdvV2F5IFN5bmMiKTsNCi0gICAgICAgICAgICAgICAgSW50ZWdlciBob2xkZXJJbnRlZ2VyID0gbmV3IEludGVnZXIoMCk7DQotICAgICAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHN0ckhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihob2xkZXJTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBIb2xkZXI8SW50ZWdlcj4gaW50SG9sZGVyID0gbmV3IEhvbGRlcjxJbnRlZ2VyPihob2xkZXJJbnRlZ2VyKTsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihzdHJIb2xkZXIsIGludEhvbGRlcik7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgc3RySG9sZGVyLnZhbHVlKTs7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgSW50ZWdlciA9IiArIGludEhvbGRlci52YWx1ZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQgdG8gZW5zdXJlIGNvcnJlY3QgYmVoYXZpb3INCi0gICAgICAgICAgICAgICAgcHJveHkudHdvV2F5SG9sZGVyKHN0ckhvbGRlciwgaW50SG9sZGVyKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBSZXNwb25zZSBTdHJpbmcgPSIgKyBzdHJIb2xkZXIudmFsdWUpOzsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBSZXNwb25zZSBJbnRlZ2VyID0iICsgaW50SG9sZGVyLnZhbHVlKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvV2F5V2l0aEhlYWRlcnNBbmRIb2xkZXJzKCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOw0KLSAgICAgICAgICAgICAgICBoZWFkZXIuc2V0T3V0KDApOw0KLSAgICAgICAgICAgICAgICBIZWFkZXJQYXJ0MCBocDA9IG5ldyBIZWFkZXJQYXJ0MCgpOw0KLSAgICAgICAgICAgICAgICBocDAuc2V0SGVhZGVyVHlwZSgiQ2xpZW50IHNldHVwIEhlYWRlciBUeXBlIGZvciBIZWFkZXJQYXJ0MCIpOw0KLSAgICAgICAgICAgICAgICBIZWFkZXJQYXJ0MSBocDEgPSBuZXcgSGVhZGVyUGFydDEoKTsNCi0gICAgICAgICAgICAgICAgaHAxLnNldEhlYWRlclR5cGUoIkNsaWVudCBzZXR1cCBIZWFkZXIgVHlwZSBmb3IgSGVhZGVyUGFydDAiKTsNCi0gICAgICAgICAgICAgICAgSG9sZGVyPEhlYWRlclBhcnQwPiBob2xkZXIgPSBuZXcgSG9sZGVyPEhlYWRlclBhcnQwPihocDApOw0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICAgICAgSGVhZGVyUmVzcG9uc2UgaHIgPSBwcm94eS5oZWFkZXIoaGVhZGVyLCBob2xkZXIsIGhwMSk7DQotICAgICAgICAgICAgICAgIGhwMD1ob2xkZXIudmFsdWU7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgaHAwLmdldEhlYWRlclR5cGUoKSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIZWFkZXIgUmVzcG9uc2UgTG9uZyA9IiArIGhyLmdldE91dCgpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdCB0byBlbnN1cmUgY29ycmVjdCBiZWhhdmlvcg0KLSAgICAgICAgICAgICAgICBociA9IHByb3h5LmhlYWRlcihoZWFkZXIsIGhvbGRlciwgaHAxKTsNCi0gICAgICAgICAgICAgICAgaHAwPWhvbGRlci52YWx1ZTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhvbGRlciBSZXNwb25zZSBTdHJpbmcgPSIgKyBocDAuZ2V0SGVhZGVyVHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkhlYWRlciBSZXNwb25zZSBMb25nID0iICsgaHIuZ2V0T3V0KCkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RUd29XYXlIb2xkZXJBc3luYygpew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIGhvbGRlclN0cmluZyA9IG5ldyBTdHJpbmcoIlRlc3QgdHdvV2F5IFN5bmMiKTsNCi0gICAgICAgICAgICAgICAgSW50ZWdlciBob2xkZXJJbnRlZ2VyID0gbmV3IEludGVnZXIoMCk7DQotICAgICAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHN0ckhvbGRlciA9IG5ldyBIb2xkZXI8U3RyaW5nPihob2xkZXJTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBIb2xkZXI8SW50ZWdlcj4gaW50SG9sZGVyID0gbmV3IEhvbGRlcjxJbnRlZ2VyPihob2xkZXJJbnRlZ2VyKTsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihzdHJIb2xkZXIsIGludEhvbGRlcik7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgc3RySG9sZGVyLnZhbHVlKTs7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgSW50ZWdlciA9IiArIGludEhvbGRlci52YWx1ZSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQgDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheUhvbGRlcihzdHJIb2xkZXIsIGludEhvbGRlcik7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgU3RyaW5nID0iICsgc3RySG9sZGVyLnZhbHVlKTs7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJIb2xkZXIgUmVzcG9uc2UgSW50ZWdlciA9IiArIGludEhvbGRlci52YWx1ZSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIGlzIGEgdGVzdCBvZiBhIGRvYy9saXQgZWNobyB0ZXN0DQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nKCkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiaGVsbG8gd29ybGQiOw0KLQ0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gUmVwZWF0DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMShyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIGlzIGEgdGVzdCBvZiBhIGRvYy9saXQgbWV0aG9kIHRoYXQgcGFzc2VzIHRoZSANCi0gICAgICAgICAqIHJlcXVlc3QgaW4gYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIHJlcHJvZHVjZWQgdmlhDQotICAgICAgICAgKiBhbm5vdGF0aW9ucyBhbmQgV1NHRU4uICBXU0ltcG9ydCB3aWxsIG5vdCBhbGxvdyB0aGlzLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1dTR0VOMSgpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gImhlbGxvIHdvcmxkIjsNCi0NCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdA0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgaXMgYSB0ZXN0IG9mIGEgZG9jL2xpdCBtZXRob2QgdGhhdCBwYXNzZXMgdGhlIA0KLSAgICAgICAgICogcmVzcG9uc2UgaW4gYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIHJlcHJvZHVjZWQgdmlhDQotICAgICAgICAgKiBhbm5vdGF0aW9ucyBhbmQgV1NHRU4uICBXU0ltcG9ydCB3aWxsIG5vdCBhbGxvdyB0aGlzLg0KLSAgICAgICAgICovDQotDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1dTR0VOMigpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gImhlbGxvIHdvcmxkIDIiOw0KLQ0KLSAgICAgICAgICAgICAgICBEb2NMaXRXcmFwIHByb3h5ID0gZ2V0UHJveHkoKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMihyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gUmVwZWF0DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcHJveHkuZWNob1N0cmluZ1dTR0VOMihyZXF1ZXN0KTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5lcXVhbHMocmVxdWVzdCkpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUaGlzIGlzIGEgdGVzdCBvZiBhIGRvYy9saXQgZWNobyB0ZXN0IHdpdGggeG1sIGNoYXJzLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ194bWxjaGFycygpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MQ0hBUlM7DQotDQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4xKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4xKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgaXMgYSB0ZXN0IG9mIGEgZG9jL2xpdCBtZXRob2QgdGhhdCBwYXNzZXMgdGhlIA0KLSAgICAgICAgICogcmVxdWVzdCBpbiBhIGhlYWRlci4gIFRoaXMgY2FuIG9ubHkgYmUgcmVwcm9kdWNlZCB2aWENCi0gICAgICAgICAqIGFubm90YXRpb25zIGFuZCBXU0dFTi4gIFdTSW1wb3J0IHdpbGwgbm90IGFsbG93IHRoaXMuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvU3RyaW5nV1NHRU4xX3htbGNoYXJzKCkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxDSEFSUzsNCi0NCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFJlcGVhdA0KLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LmVjaG9TdHJpbmdXU0dFTjEocmVxdWVzdCk7DQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZXF1YWxzKHJlcXVlc3QpKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgaXMgYSB0ZXN0IG9mIGEgZG9jL2xpdCBtZXRob2QgdGhhdCBwYXNzZXMgdGhlIA0KLSAgICAgICAgICogcmVzcG9uc2UgaW4gYSBoZWFkZXIuICBUaGlzIGNhbiBvbmx5IGJlIHJlcHJvZHVjZWQgdmlhDQotICAgICAgICAgKiBhbm5vdGF0aW9ucyBhbmQgV1NHRU4uICBXU0ltcG9ydCB3aWxsIG5vdCBhbGxvdyB0aGlzLg0KLSAgICAgICAgICovDQotDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1N0cmluZ1dTR0VOMl94bWxjaGFycygpIHsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MQ0hBUlM7DQotDQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4yKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBSZXBlYXQNCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm94eS5lY2hvU3RyaW5nV1NHRU4yKHJlcXVlc3QpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmVxdWFscyhyZXF1ZXN0KSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUZXN0IHRvIHZhbGlkYXRlIHdoZXRoZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBpcyBwbHVnZ2VkIGluDQotICAgICAgICAgKiBvbiB0aGUgc2VydmVyLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNCX1NlcnZlcjEoKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgIDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVxU3RyaW5nID0gIkpBWEJDdXN0b21CdWlsZGVyU2VydmVyMSI7DQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgTW9uaXRvcmluZw0KLSAgICAgICAgICAgICAgICBwcm94eS50d29XYXkoIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvclN0YXJ0Iik7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIHJldHVybmVkIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIEpBWEJDdXN0b21CdWlsZGVycw0KLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHNlcnZlciB0aGlzIGNvdWxkIGJlIGFueSBudW1iZXIgMCBvciBncmVhdGVyLg0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgMSA9IiArIHJlc3BvbnNlKTsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlMiA9IHByb3h5LnR3b1dheShyZXFTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgMiA9IiArIHJlc3BvbnNlMik7DQotICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCByZXNwb25zZSB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBKQVhCQ3VzdG9tQnVpbGRlcnMNCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbnkgbnVtYmVyIDEgb3IgZ3JlYXRlci4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQNCi0gICAgICAgICAgICAgICAgLy8gdGhlIEpBWEJDdXN0b21CdWlsZGVyIHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRoZSBzZWNvbmQgaW52b2tlDQotICAgICAgICAgICAgICAgIEludGVnZXIgciA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UyKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmludFZhbHVlKCkgPj0gMSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIEVuZCBNb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheSgiSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yRW5kIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUZXN0IHRvIHZhbGlkYXRlIHdoZXRoZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBpcyBwbHVnZ2VkIGluDQotICAgICAgICAgKiBhbmQgdXNlZCBvbiB0aGUgc2VydmVyLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNCX1NlcnZlcjIoKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgIDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVxU3RyaW5nID0gIkpBWEJDdXN0b21CdWlsZGVyU2VydmVyMiI7DQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgTW9uaXRvcmluZw0KLSAgICAgICAgICAgICAgICBwcm94eS50d29XYXkoIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvclN0YXJ0Iik7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgLy8gVGhlIHJldHVybmVkIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIEpBWEJDdXN0b21CdWlsZGVycw0KLSAgICAgICAgICAgICAgICAvLyB1c2FnZXMuDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSAxID0iICsgcmVzcG9uc2UpOw0KLSAgICAgICAgICAgICAgICBJbnRlZ2VyIHIxID0gSW50ZWdlci5wYXJzZUludChyZXNwb25zZSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZTIgPSBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlIDIgPSIgKyByZXNwb25zZTIpOw0KLSAgICAgICAgICAgICAgICAvLyBUaGUgcmV0dXJuZWQgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRoZSBudW1iZXIgb2YgSkFYQkN1c3RvbUJ1aWxkZXJzDQotICAgICAgICAgICAgICAgIC8vIHVzYWdlcy4gIFRoaXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QgcmVzcG9uc2UNCi0gICAgICAgICAgICAgICAgSW50ZWdlciByMiA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UyKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyMi5pbnRWYWx1ZSgpID4gcjEuaW50VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAgICAgIC8vIEVuZCBNb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheSgiSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yRW5kIik7DQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBUZXN0IHRvIHZhbGlkYXRlIHdoZXRoZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBpcyBwbHVnZ2VkIGFuZCB1c2VkDQotICAgICAgICAgKiBvbiB0aGUgY2xpZW50DQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQ0JfQ2xpZW50KCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0ICA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcVN0cmluZyA9ICJKQVhCQ3VzdG9tQnVpbGRlckNsaWVudCI7DQotICAgICAgICAgICAgICAgIERvY0xpdFdyYXAgcHJveHkgPSBnZXRQcm94eSgpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgLy8gU3RhcnQgTW9uaXRvcmluZw0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmNsZWFyKCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIHdlYiBzZXJ2aWNlcw0KLSAgICAgICAgICAgICAgICBwcm94eS50d29XYXkocmVxU3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFRoZSBzZWNvbmQgaW52b2tlIHNob3VsZCB0cmlnZ2VyIHRoZSBmYXN0DQotICAgICAgICAgICAgICAgIC8vIHVubWFyc2hhbGxpbmcgb2YgdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgICAgIHByb3h5LnR3b1dheShyZXFTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCByZXNwb25zZSB1bm1hcnNoYWxsaW5nIHNob3VsZCB0cnkNCi0gICAgICAgICAgICAgICAgLy8gdGhlIEpBWEJDdXN0b21CdWlsZGVyDQotICAgICAgICAgICAgICAgIGludCB0b3RhbEJ1aWxkZXJzID0gSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQnVpbGRlcnMoKTsNCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbEJ1aWxkZXJzID49IDEpOw0KLSAgICAgICAgICAgICAgICBpbnQgdG90YWxDcmVhdGVzID0gSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQ3JlYXRlcygpOw0KLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRvdGFsQ3JlYXRlcyA+PSAxKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogVGVzdCB0byB2YWxpZGF0ZSB3aGV0aGVyIGEgSkFYQkN1c3RvbUJ1aWxkZXIgaXMgcGx1Z2dlZCBpbg0KLSAgICAgICAgICogb24gdGhlIGNsaWVudC4gIEFsc28gbWFrZXMgc3VyZSB0aGF0IHRoZSBKQVhCQ3VzdG9tQnVpbGRlcg0KLSAgICAgICAgICogZmFsbHMgYmFjayB0byBub3JtYWwgcHJvY2Vzc2luZyB3aGVuIGZhdWx0cyBhcmUgdGhyb3duLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNCX0ZhdWx0KCl7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0ICA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJlcU5vcm1hbFN0cmluZyA9ICJKQVhCQ3VzdG9tQnVpbGRlckNsaWVudCI7DQotICAgICAgICAgICAgICAgIFN0cmluZyByZXFGYXVsdFN0cmluZyA9ICJKQVhCQ3VzdG9tQnVpbGRlckZhdWx0IjsNCi0gICAgICAgICAgICAgICAgRG9jTGl0V3JhcCBwcm94eSA9IGdldFByb3h5KCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBTdGFydCBNb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5zZXRNb25pdG9yaW5nKHRydWUpOw0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIHdlYiBzZXJ2aWNlcw0KLSAgICAgICAgICAgICAgICAgICAgcHJveHkudHdvV2F5KHJlcU5vcm1hbFN0cmluZyk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2Vjb25kIGludm9rZSB3aWxsIGNhdXNlDQotICAgICAgICAgICAgICAgICAgICAvLyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duLg0KLSAgICAgICAgICAgICAgICAgICAgcHJveHkudHdvV2F5KHJlcUZhdWx0U3RyaW5nKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIHdhcyBleHBlY3RlZA0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYWxzZSk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQNCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZXR1cm5lZCByZXNwb25zZSB1bm1hcnNoYWxsaW5nIHNob3VsZCB0cnkNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBKQVhCQ3VzdG9tQnVpbGRlciBidXQgZmFsbGJhY2sgdG8gbm9ybWFsIHVubWFyc2hhbGxpbmcNCi0gICAgICAgICAgICAgICAgICAgIC8vIGR1ZSB0byB0aGUgcHJlc2Vuc2Ugb2YgYSBTT0FQRmF1bHQNCi0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbEJ1aWxkZXJzID0gSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQnVpbGRlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUodG90YWxCdWlsZGVycyA+PSAxKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbENyZWF0ZXMgPSBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuZ2V0VG90YWxDcmVhdGVzKCk7DQotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRvdGFsQ3JlYXRlcyA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbEZhaWxlZENyZWF0ZXMgPSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsRmFpbGVkQ3JlYXRlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b3RhbEZhaWxlZENyZWF0ZXMgPj0gMSk7DQotICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Iuc2V0TW9uaXRvcmluZyhmYWxzZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjM1MGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnM7DQotDQotaW1wb3J0IG9yZy50ZXN0LmFkZG51bWJlcnMuQWRkTnVtYmVyc0ZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChmYXVsdEJlYW49IiIsIG5hbWUgPSAiQWRkTnVtYmVyc0ZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kdWtlL29yZyIpDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24NCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBZGROdW1iZXJzRmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBBZGROdW1iZXJzRmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBBZGROdW1iZXJzRmF1bHQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBkdWtlLm9yZy5BZGROdW1iZXJzRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmE3YTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyczsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkFkZE51bWJlcnNQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotcHVibGljIGludGVyZmFjZSBBZGROdW1iZXJzUG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcxDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgaW50DQotICAgICAqIEB0aHJvd3MgQWRkTnVtYmVyc0ZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkTnVtYmVycyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hZGRudW1iZXJzLkFkZE51bWJlcnMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGROdW1iZXJzUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVycy5BZGROdW1iZXJzUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgaW50IGFkZE51bWJlcnMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIikNCi0gICAgICAgIGludCBhcmcwLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotICAgICAgICBpbnQgYXJnMSkNCi0gICAgICAgIHRocm93cyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uDQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAT25ld2F5DQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5SW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnMuT25lV2F5SW50IikNCi0gICAgcHVibGljIHZvaWQgb25lV2F5SW50KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpDQotICAgICAgICBpbnQgYXJnMCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmFjMWVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGROdW1iZXJzU2VydmljZSIsZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlIikNCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc1BvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIEFkZE51bWJlcnNQb3J0VHlwZSB7DQotDQotICAgIEBSZXNvdXJjZQ0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGN0eDsNCi0gICAgDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzLkFkZE51bWJlcnNQb3J0VHlwZSNhZGROdW1iZXJzKGludCwgaW50KQ0KLQkgKi8NCi0JcHVibGljIGludCBhZGROdW1iZXJzKGludCBhcmcwLCBpbnQgYXJnMSkgdGhyb3dzIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlY2VpdmVkIGFkZE51bWJlcnMgcmVxdWVzdCBmb3IgIiArIGFyZzAgKyAiIGFuZCAiICsgYXJnMSk7DQotICAgICAgICANCi0gICAgICAgIGNoZWNrUHJvcGVydGllcygpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gYXJnMCthcmcxOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hlY2tQcm9wZXJ0aWVzKCkgew0KLQkgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0JICAgIE1hcCBoZWFkZXJzID0gKE1hcCltYy5nZXQoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMpOw0KLQkgICAgLy8gdGhlIG1hcCBzaG91bGQgY29udGFpbiBzb21lIGhlYWRlcnMNCi0JICAgIGlmIChoZWFkZXJzID09IG51bGwgfHwgaGVhZGVycy5pc0VtcHR5KCkpIHsNCi0JICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSFRUUCByZXF1ZXN0IGhlYWRlcnMgbWFwIGlzIG51bGwgb3IgZW1wdHkhIik7DQotCSAgICB9DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlI29uZVdheUludChpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlJbnQoaW50IGFyZzApIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBvbmUtd2F5IHJlcXVlc3QuIik7DQotICAgICAgICByZXR1cm47DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMGU1My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFkZE51bWJlcnNTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgd3NkbExvY2F0aW9uID0gIkFkZE51bWJlcnMxLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBBREROVU1CRVJTU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzL01FVEEtSU5GL0FkZE51bWJlcnMud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgCXVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZE51bWJlcnNTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihBREROVU1CRVJTU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgIkFkZE51bWJlcnNTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBBZGROdW1iZXJzUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFkZE51bWJlcnNQb3J0IikNCi0gICAgcHVibGljIEFkZE51bWJlcnNQb3J0VHlwZSBnZXRBZGROdW1iZXJzUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoQWRkTnVtYmVyc1BvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIsICJBZGROdW1iZXJzUG9ydCIpLCBBZGROdW1iZXJzUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvQWRkTnVtYmVycy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzNlZWYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iQWRkTnVtYmVycyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyINCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0NCi0JPHR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIj4NCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzUmVzcG9uc2UiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVycyI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzEiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJBZGROdW1iZXJzRmF1bHQiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZmF1bHRJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMCIgdHlwZT0ieHNkOmludCIgLz4NCi0JCQkJCTwvc2VxdWVuY2U+DQotCQkJCTwvY29tcGxleFR5cGU+DQotCQkJPC9lbGVtZW50Pg0KLQ0KLQkJPC94c2Q6c2NoZW1hPg0KLQk8L3R5cGVzPg0KLQ0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzIj4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGROdW1iZXJzIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNSZXNwb25zZSI+DQotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczphZGROdW1iZXJzUmVzcG9uc2UiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCTxwYXJ0IG5hbWU9IkFkZE51bWJlcnNGYXVsdCIgZWxlbWVudD0idG5zOkFkZE51bWJlcnNGYXVsdCIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOm9uZVdheUludCIgLz4NCi0JPC9tZXNzYWdlPg0KLQ0KLQk8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc1BvcnRUeXBlIj4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyI+DQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzIiBuYW1lPSJhZGQiIC8+DQotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc1Jlc3BvbnNlIiBuYW1lPSJhZGRSZXNwb25zZSIgLz4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc0ZhdWx0IiAvPg0KLQkJPC9vcGVyYXRpb24+DQotCQk8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCI+DQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlJbnQiIC8+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9wb3J0VHlwZT4NCi0JPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0JpbmRpbmciIHR5cGU9InRuczpBZGROdW1iZXJzUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCINCi0JCQlzdHlsZT0iZG9jdW1lbnQiIC8+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPg0KLQkJCQ0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCQk8b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9mYXVsdD4NCi0JCTwvb3BlcmF0aW9uPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPg0KLQkJCQ0KLQkJCTxpbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9pbnB1dD4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L2JpbmRpbmc+DQotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNTZXJ2aWNlIj4NCi0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlIiAvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRIYW5kbGVycy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRIYW5kbGVycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjNlOWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50SGFuZGxlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0NCi0JPGp3czpoYW5kbGVyLWNoYWluIG5hbWU9IkxvZ2dpbmdIYW5kbGVyQ2hhaW4iPg0KLQkJPHByb3RvY29sLWJpbmRpbmdzPiMjU09BUDExX0hUVFA8L3Byb3RvY29sLWJpbmRpbmdzPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JPC9qd3M6aGFuZGxlci1jaGFpbj4NCi0JDQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjN2JhMzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkF0dGFjaG1lbnRzQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0Lk1ldGhvZE1hcnNoYWxsZXJVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxGYXVsdFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuU0FBSkZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIgDQotaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgSGFuZGxlclRyYWNrZXIgdHJhY2tlciA9IG5ldyBIYW5kbGVyVHJhY2tlcihBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlRmF1bHQob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSANCi0gICAgICAgICAgICAoQm9vbGVhbiltZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2Uob3V0Ym91bmQpOw0KLSAgICAgICAgaWYgKCFvdXRib3VuZCkgeyAgLy8gaW5ib3VuZCByZXNwb25zZSBvbiB0aGUgY2xpZW50DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHN0YW5kYXJkIHByb3BlcnR5IGlzIGF2YWlsYWJsZQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE9iamVjdCBib2IgPSBtZXNzYWdlY29udGV4dC5nZXQoTG9naWNhbE1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSk7DQotICAgICAgICAgICAgaWYgKGJvYiA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYm9iIGlzIG51bGwiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gcHJldmlvdXNseSBjYXVzZWQgYSBOUEUgZHVlIHRvIGludGVybmFsIFByb3BlcnRpZXMucHV0QWxsKG1hcCk7DQotICAgICAgICAgICAgLy8gd2hlcmUgJ21hcCcgaGFkIGEga2V5L3ZhbHVlIHBhaXIgd2l0aCBudWxsIHZhbHVlLiAgU28sIGludGVybmFsbHkNCi0gICAgICAgICAgICAvLyB3ZSBub3cgdXNlIEhhc2hNYXAgaW5zdGVhZCBvZiBQcm9wZXJ0aWVzLg0KLSAgICAgICAgICAgIGludCBzaXplID0gbWVzc2FnZWNvbnRleHQuc2l6ZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogVGhlc2UgcHJvcHMgd2VyZSBzZXQgb24gdGhlIG91dGJvdW5kIGZsb3cuICBJbmJvdW5kIGZsb3cgaGFuZGxlcnMNCi0gICAgICAgICAgICAgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4NCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBTdHJpbmcgcHJvcEtleSA9ICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyT3V0Ym91bmRBcHBTY29wZWRQcm9wZXJ0eSI7DQotICAgICAgICAgICAgU3RyaW5nIG15Q2xpZW50VmFsID0gKFN0cmluZyltZXNzYWdlY29udGV4dC5nZXQocHJvcEtleSk7DQotICAgICAgICAgICAgaWYgKG15Q2xpZW50VmFsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FUENvbnRleHQgaXMgbm90IHNlYXJjaGluZyBoYXJkIGVub3VnaCBmb3IgdGhlIHByb3BlcnR5LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHByZXNlbmNlcyBvZiB0aGUgYXR0YWNobWVudCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIHByb3BLZXkgPSBNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG1lc3NhZ2Vjb250ZXh0LmdldChwcm9wS2V5KTsNCi0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBBdHRhY2htZW50QWRhcHRlciBmb3IgUHJvcGVydHkgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcHJvcEtleSA9ICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVyT3V0Ym91bmRIYW5kbGVyU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgICAgIG15Q2xpZW50VmFsID0gKFN0cmluZyltZXNzYWdlY29udGV4dC5nZXQocHJvcEtleSk7DQotICAgICAgICAgICAgaWYgKG15Q2xpZW50VmFsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FUENvbnRleHQgaXMgbm90IHNlYXJjaGluZyBoYXJkIGVub3VnaCBmb3IgdGhlIHByb3BlcnR5LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIFRoZXNlIHByb3BzIHdlcmUgc2V0IG9uIHRoZSBpbmJvdW5kIGZsb3cuICBJbmJvdW5kIGZsb3cgaGFuZGxlcnMNCi0gICAgICAgICAgICAgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4NCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBwcm9wS2V5ID0gIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJJbmJvdW5kQXBwU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgICAgIG15Q2xpZW50VmFsID0gKFN0cmluZyltZXNzYWdlY29udGV4dC5nZXQocHJvcEtleSk7DQotICAgICAgICAgICAgaWYgKG15Q2xpZW50VmFsID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FUENvbnRleHQgaXMgbm90IHNlYXJjaGluZyBoYXJkIGVub3VnaCBmb3IgdGhlIHByb3BlcnR5LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBwcm9wS2V5ID0gIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJJbmJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBteUNsaWVudFZhbCA9IChTdHJpbmcpbWVzc2FnZWNvbnRleHQuZ2V0KHByb3BLZXkpOw0KLSAgICAgICAgICAgIGlmIChteUNsaWVudFZhbCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgcHJvcEtleSArICIgd2FzIG51bGwuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVBDb250ZXh0IGlzIG5vdCBzZWFyY2hpbmcgaGFyZCBlbm91Z2ggZm9yIHRoZSBwcm9wZXJ0eS4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBzdCA9IGdldFN0cmluZ0Zyb21Tb3VyY2VQYXlsb2FkKG1zZy5nZXRQYXlsb2FkKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyB0eHQgPSBTdHJpbmcudmFsdWVPZihJbnRlZ2VyLnZhbHVlT2YoZ2V0Rmlyc3RBcmcoc3QpKSAtIDEpOw0KLSAgICAgICAgICAgIHN0ID0gcmVwbGFjZUZpcnN0QXJnKHN0LCB0eHQpOw0KLSAgICAgICAgICAgIG1zZy5zZXRQYXlsb2FkKG5ldyBTdHJlYW1Tb3VyY2UobmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHN0KSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNvdXJjZSBzID0gbXNnLmdldFBheWxvYWQoKTsNCi0gICAgICAgICAgICBzID0gbXNnLmdldFBheWxvYWQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgc3QgPSBnZXRTdHJpbmdGcm9tU291cmNlUGF5bG9hZChtc2cuZ2V0UGF5bG9hZCgpKTsNCi0gICAgICAgICAgICBpZiAoc3QuY29udGFpbnMoIj45OTwvYXJnMD4iKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIkkgZG9uJ3QgbGlrZSB0aGUgdmFsdWUgOTkiKTsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LmNvbnRhaW5zKCI+OTk5PC9hcmcwPiIpKSB7DQotICAgICAgICAgICAgICAgIFhNTEZhdWx0IHhtbEZhdWx0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVhNTEZhdWx0RnJvbVN5c3RlbUV4Y2VwdGlvbihuZXcgUnVudGltZUV4Y2VwdGlvbigiSSBkb24ndCBsaWtlIHRoZSB2YWx1ZSA5OTkiKSk7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFKTsNCi0gICAgICAgICAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBtZi5jcmVhdGVNZXNzYWdlKCk7DQotICAgICAgICAgICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlU0FBSkZhdWx0KHhtbEZhdWx0LCBib2R5KTsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oc29hcEZhdWx0KTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzb2FwZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkdvdCBTT0FQRXhjZXB0aW9uLiAgVGhhdCdzIGJhZC4iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIHByZXNlbmNlcyBvZiB0aGUgYXR0YWNobWVudCBwcm9wZXJ0eQ0KLSAgICAgICAgICAgIFN0cmluZyBwcm9wS2V5ID0gTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUzsNCi0gICAgICAgICAgICBNYXAgbWFwID0gKE1hcCkgbWVzc2FnZWNvbnRleHQuZ2V0KHByb3BLZXkpOw0KLSAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvcGVydHkgIiArIHByb3BLZXkgKyAiIHdhcyBudWxsIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICghKG1hcCBpbnN0YW5jZW9mIEF0dGFjaG1lbnRzQWRhcHRlcikpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIEF0dGFjaG1lbnRBZGFwdGVyIGZvciBQcm9wZXJ0eSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaXJzdEFyZyhTdHJpbmcgcGF5bG9hZFN0cmluZykgew0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXlsb2FkU3RyaW5nLCAiPiIpOw0KLSAgICAgICAgc3QubmV4dFRva2VuKCk7ICAvLyBza2lwIGZpcnN0IHRva2VuLg0KLSAgICAgICAgc3QubmV4dFRva2VuKCk7ICAvLyBza2lwIHNlY29uZA0KLSAgICAgICAgU3RyaW5nIHRlbXBTdHJpbmcgPSBzdC5uZXh0VG9rZW4oKTsNCi0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRlbXBTdHJpbmcsICI8IikubmV4dFRva2VuKCk7DQotICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUZpcnN0QXJnKFN0cmluZyBwYXlsb2FkU3RyaW5nLCBTdHJpbmcgbmV3QXJnKSB7DQotICAgICAgICBTdHJpbmcgZmlyc3RBcmcgPSBnZXRGaXJzdEFyZyhwYXlsb2FkU3RyaW5nKTsNCi0gICAgICAgIHBheWxvYWRTdHJpbmcgPSBwYXlsb2FkU3RyaW5nLnJlcGxhY2VGaXJzdChmaXJzdEFyZywgbmV3QXJnKTsNCi0gICAgICAgIHJldHVybiBwYXlsb2FkU3RyaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQoU291cmNlIHBheWxvYWQpIHsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0NCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0NCi0gICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7DQotICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKHBheWxvYWQsIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhY2E3Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXIyIGltcGxlbWVudHMgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI8TG9naWNhbE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKW1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlTWVzc2FnZShvdXRib3VuZCk7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsgIC8vIG91dGJvdW5kIHJlcXVlc3Qgb24gdGhlIGNsaWVudA0KLSAgICAgICAgICAgIExvZ2ljYWxNZXNzYWdlIG1zZyA9IG1lc3NhZ2Vjb250ZXh0LmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7DQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQocGF5bG9hZCk7DQotICAgICAgICAgICAgU3RyaW5nIHR4dCA9IFN0cmluZy52YWx1ZU9mKEludGVnZXIudmFsdWVPZihnZXRGaXJzdEFyZyhzdCkpICogMik7DQotICAgICAgICAgICAgc3QgPSByZXBsYWNlRmlyc3RBcmcoc3QsIHR4dCk7DQotICAgICAgICAgICAgbXNnLnNldFBheWxvYWQobmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oc3QpKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZpcnN0QXJnKFN0cmluZyBwYXlsb2FkU3RyaW5nKSB7DQotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBheWxvYWRTdHJpbmcsICI+Iik7DQotICAgICAgICBzdC5uZXh0VG9rZW4oKTsgIC8vIHNraXAgZmlyc3QgdG9rZW4uDQotICAgICAgICBzdC5uZXh0VG9rZW4oKTsgIC8vIHNraXAgc2Vjb25kDQotICAgICAgICBTdHJpbmcgdGVtcFN0cmluZyA9IHN0Lm5leHRUb2tlbigpOw0KLSAgICAgICAgU3RyaW5nIHJldHVyblN0cmluZyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGVtcFN0cmluZywgIjwiKS5uZXh0VG9rZW4oKTsNCi0gICAgICAgIHJldHVybiByZXR1cm5TdHJpbmc7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlRmlyc3RBcmcoU3RyaW5nIHBheWxvYWRTdHJpbmcsIFN0cmluZyBuZXdBcmcpIHsNCi0gICAgICAgIFN0cmluZyBmaXJzdEFyZyA9IGdldEZpcnN0QXJnKHBheWxvYWRTdHJpbmcpOw0KLSAgICAgICAgcGF5bG9hZFN0cmluZyA9IHBheWxvYWRTdHJpbmcucmVwbGFjZUZpcnN0KGZpcnN0QXJnLCBuZXdBcmcpOw0KLSAgICAgICAgcmV0dXJuIHBheWxvYWRTdHJpbmc7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdGcm9tU291cmNlUGF5bG9hZChTb3VyY2UgcGF5bG9hZCkgew0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOw0KLQ0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOw0KLQ0KLSAgICAgICAgICAgIHRyYW5zLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsNCi0gICAgICAgICAgICB0cmFucy50cmFuc2Zvcm0ocGF5bG9hZCwgcmVzdWx0KTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczNzkxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLQ0KLS8qDQotICogWW91IGNhbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hldGhlciBhIGhhbmRsZXIgaXMgZm9yIGNsaWVudCBvciBzZXJ2ZXIsDQotICogeW91IGp1c3QgaGF2ZSB0byBjaGVjayBpbiB0aGUgaGFuZGxlTWVzc2FnZSBhbmQvb3IgaGFuZGxlRmF1bHQgdG8gbWFrZQ0KLSAqIHN1cmUgd2hhdCBkaXJlY3Rpb24gd2UncmUgZ29pbmcuDQotICovDQotDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjMgIGltcGxlbWVudHMgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI8TG9naWNhbE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0NsaWVudExvZ2ljYWxIYW5kbGVyMy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsgICAgICANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICAvLyBsZXQncyBzZWUgaWYgd2UgY2FuIGRvIHRoaXMNCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlIGxtID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgU3RyaW5nIHMgPSBnZXRTdHJpbmdGcm9tU291cmNlUGF5bG9hZChsbS5nZXRQYXlsb2FkKCkpOw0KLSAgICAgICAgdHJhY2tlci5sb2coIlJFVFVSTklORyBGQUxTRSIsIG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKSBtZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZUZhdWx0KG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQoU291cmNlIHBheWxvYWQpIHsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IGZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsNCi0NCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsNCi0NCi0gICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7DQotICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKHBheWxvYWQsIHJlc3VsdCk7DQotDQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMDY0NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzQ2xpZW50TG9naWNhbEhhbmRsZXI0ICBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyPExvZ2ljYWxNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBIYW5kbGVyVHJhY2tlciB0cmFja2VyID0gbmV3IEhhbmRsZXJUcmFja2VyKEFkZE51bWJlcnNDbGllbnRMb2dpY2FsSGFuZGxlcjQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsgICAgDQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlRmF1bHQob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVNZXNzYWdlKG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTE5MGU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TY29wZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoNCi0gKiBZb3UgY2FuJ3QgYWN0dWFsbHkgc3BlY2lmeSB3aGV0aGVyIGEgaGFuZGxlciBpcyBmb3IgY2xpZW50IG9yIHNlcnZlciwNCi0gKiB5b3UganVzdCBoYXZlIHRvIGNoZWNrIGluIHRoZSBoYW5kbGVNZXNzYWdlIGFuZC9vciBoYW5kbGVGYXVsdCB0byBtYWtlDQotICogc3VyZSB3aGF0IGRpcmVjdGlvbiB3ZSdyZSBnb2luZy4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlciBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0IGdldEhlYWRlcnMoKSB7DQotICAgICAgICB0cmFja2VyLmdldEhlYWRlcnMoKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlTWVzc2FnZShvdXRib3VuZCk7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgYXBwUHJvcDEgPSAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlck91dGJvdW5kQXBwU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgICAgIG1lc3NhZ2Vjb250ZXh0LnB1dChhcHBQcm9wMSwgIm15VmFsIik7DQotICAgICAgICAgICAgbWVzc2FnZWNvbnRleHQuc2V0U2NvcGUoYXBwUHJvcDEsIFNjb3BlLkFQUExJQ0FUSU9OKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTdHJpbmcgYXBwUHJvcDIgPSAiQWRkTnVtYmVyc0NsaWVudFByb3RvY29sSGFuZGxlck91dGJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoYXBwUHJvcDIsICJjbGllbnQgYXBwcyBjYW4ndCBzZWUgdGhpcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7ICAvLyBjbGllbnQgaW5ib3VuZCByZXNwb25zZQ0KLSAgICAgICAgICAgIFN0cmluZyBhcHBQcm9wMSA9ICJBZGROdW1iZXJzQ2xpZW50UHJvdG9jb2xIYW5kbGVySW5ib3VuZEFwcFNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoYXBwUHJvcDEsICJteVZhbCIpOw0KLSAgICAgICAgICAgIG1lc3NhZ2Vjb250ZXh0LnNldFNjb3BlKGFwcFByb3AxLCBTY29wZS5BUFBMSUNBVElPTik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIGFwcFByb3AyID0gIkFkZE51bWJlcnNDbGllbnRQcm90b2NvbEhhbmRsZXJJbmJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IjsNCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoYXBwUHJvcDIsICJjbGllbnQgYXBwcyBjYW4ndCBzZWUgdGhpcyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE5OTE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlckZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChmYXVsdEJlYW49IiIsIG5hbWUgPSAiQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZHVrZS9vcmciKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIEFkZE51bWJlcnNIYW5kbGVyRmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBBZGROdW1iZXJzSGFuZGxlckZhdWx0IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogZHVrZS5vcmcuQWRkTnVtYmVyc0hhbmRsZXJGYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRhYmNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IG9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0vL0BIYW5kbGVyQ2hhaW4oZmlsZT0iTUVUQS1JTkYvQWRkTnVtYmVyc0NsaWVudEhhbmRsZXJzLnhtbCIsIG5hbWU9IiIpDQotcHVibGljIGludGVyZmFjZSBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMQ0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGludA0KLSAgICAgKiBAdGhyb3dzIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkTnVtYmVyc0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBpbnQgYWRkTnVtYmVyc0hhbmRsZXIoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIpDQotICAgICAgICBpbnQgYXJnMCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0gICAgICAgIGludCBhcmcxKQ0KLSAgICAgICAgdGhyb3dzIEFkZE51bWJlcnNIYW5kbGVyRmF1bHRfRXhjZXB0aW9uDQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFkZE51bWJlcnNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLkFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGFkZE51bWJlcnNIYW5kbGVyQXN5bmMoDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiKQ0KLSAgICAgICAgICAgIGludCBhcmcwLA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0gICAgICAgICAgICBpbnQgYXJnMSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPEFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBPbmV3YXkNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXlJbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnNoYW5kbGVyLk9uZVdheUludCIpDQotICAgIHB1YmxpYyB2b2lkIG9uZVdheUludCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIikNCi0gICAgICAgIGludCBhcmcwKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDBmMWE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlckZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlOw0KLQ0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiLGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIikNCi1ASGFuZGxlckNoYWluKGZpbGUgPSAiQWRkTnVtYmVyc0hhbmRsZXJzLnhtbCIsIG5hbWUgPSAiIikNCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZUltcGwgaW1wbGVtZW50cyBBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIHsNCi0NCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjdHg7DQotICAgIA0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZSNhZGROdW1iZXJzSGFuZGxlcihpbnQsIGludCkNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgYWRkTnVtYmVyc0hhbmRsZXIoaW50IGFyZzAsIGludCBhcmcxKSB0aHJvd3MgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdF9FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgLyogRklYTUU6IGdldEhlYWRlcnMoKSBpcyBjdXJyZW50bHkgbm90IGNhbGxlZA0KLQkgICAgaWYgKCF0cmFja2VyLmlzQ2FsbGVkKEhhbmRsZXJUcmFja2VyLk1ldGhvZHMuR0VUX0hFQURFUlMpKSB7DQotCSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldEhlYWRlcnMoKSB3YXMgbm90IGNhbGxlZCBvbiB0aGUgaGFuZGxlciIpOw0KLQkgICAgfQ0KLSAgICAgICAgICovDQotDQotICAgICAgICAvLyBmb3IgdGhlc2UgcHJvcGVydGllcyB0ZXN0cyB0byBhbHdheXMgcGFzcywgYW4gaW5ib3VuZCBzZXJ2ZXItc2lkZSBoYW5kbGVyIG11c3QgInB1dCIgdGhlbQ0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIFN0cmluZyBwcm9wS2V5MSA9ICJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXJJbmJvdW5kQXBwU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgU3RyaW5nIHByb3BLZXkyID0gIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlckluYm91bmRIYW5kbGVyU2NvcGVkUHJvcGVydHkiOw0KLSAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZyltYy5nZXQocHJvcEtleTEpOw0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5IHZhbHVlIGZvciBrZXkgXCIiICsgcHJvcEtleTEgKyAiXCIgd2FzIG51bGwsIGJ1dCBpcyBBUFBMSUNBVElPTiBzY29wZWQgYW5kIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGJ5IHRoZSBlbmRwb2ludCIpOw0KLSAgICAgICAgaWYgKG1jLmNvbnRhaW5zS2V5KHByb3BLZXkyKSkgIC8vIGluc3RlYWQgb2YgImdldCIsIHVzZSAiY29udGFpbnNLZXkiIHRvIGJlIGEgbGl0dGxlIG1vcmUgcm9idXN0IGluIHRlc3RpbmcNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWVzc2FnZUNvbnRleHQuY29udGFpbnNLZXkgcmVwb3J0ZWQgdHJ1ZSBmb3Iga2V5IFwiIiArIHByb3BLZXkyICsgIlwiIHdhcyBub3QgbnVsbC4gIFRoaXMgcHJvcGVydHkgaXMgSEFORExFUiBzY29wZWQgYW5kIHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSBieSB0aGUgZW5kcG9pbnQiKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBhZGROdW1iZXJzSGFuZGxlciByZXF1ZXN0IGZvciAiICsgYXJnMCArICIgYW5kICIgKyBhcmcxKTsNCi0gICAgICAgIGlmIChhcmcwID09IDEwMSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJHb3QgdmFsdWUgMTAxLiAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIkFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGVJbXBsLmFkZE51bWJlcnNIYW5kbGVyIG1ldGhvZCBpcyAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGx5IHRocm93aW5nIHRoaXMgZXhjZXB0aW9uIGFzIHBhcnQgb2YgdGVzdGluZyIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBsb25nIHN1bSA9IChsb25nKSBhcmcwICsgKGxvbmcpIGFyZzE7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU3VtIGlzICIgKyBzdW0pOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IE1BWF9WQUxVRSBpcyAiICsgSW50ZWdlci5NQVhfVkFMVUUpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IE1JTl9WQUxVRSBpcyAiICsgSW50ZWdlci5NSU5fVkFMVUUpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBGb3IgdGVzdGluZyBwdXJwb3NlcywgYW4gb3ZlcmZsb3cgdHJpZ2dlcnMgYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUNCi0gICAgICAgIC8vIEZvciB0ZXN0aW5nIHB1cnBvc2VzLCBhbiB1bmRlcmZsb3cgdHJpZ2dlcnMgYW4gTlBFLg0KLSAgICAgICAgaWYgKHN1bSA+IEludGVnZXIuTUFYX1ZBTFVFKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk92ZXJmbG93IGRldGVjdGVkLiAgVGhyb3dpbmcgQWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIpOw0KLSAgICAgICAgICAgIEFkZE51bWJlcnNIYW5kbGVyRmF1bHQgZmF1bHRJbmZvID0gbmV3IEFkZE51bWJlcnNIYW5kbGVyRmF1bHQoKTsNCi0gICAgICAgICAgICBmYXVsdEluZm8uc2V0RmF1bHRJbmZvKCJvdmVyZmxvdyIpOw0KLSAgICAgICAgICAgIGZhdWx0SW5mby5zZXRNZXNzYWdlKCJvdmVyZmxvdyIpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBBZGROdW1iZXJzSGFuZGxlckZhdWx0X0V4Y2VwdGlvbigib3ZlcmZsb3ciLCBmYXVsdEluZm8pOw0KLSAgICAgICAgfSBlbHNlIGlmIChzdW0gPCBJbnRlZ2VyLk1JTl9WQUxVRSkgew0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJVbmRlcmZsb3cgZGV0ZWN0ZWQuICBUaHJvd2luZyBOdWxsUG9pbnRlckV4Y2VwdGlvbiIpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidW5kZXJmbG93Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gKGludCkgc3VtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gYWRkTnVtYmVyc0hhbmRsZXJBc3luYyhpbnQgYXJnMCwgaW50IGFyZzEsIEFzeW5jSGFuZGxlcjxBZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlPiBhc3luY0hhbmRsZXIpIHsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotDQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlI29uZVdheUludChpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlJbnQoaW50IGFyZzApIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBvbmUtd2F5IHJlcXVlc3QuIik7DQotICAgICAgICByZXR1cm47DQotCX0NCi0gICAgDQotICAgIEBSZXNvdXJjZQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdHgoV2ViU2VydmljZUNvbnRleHQgY3R4KSB7DQotICAgICAgICB0aGlzLmN0eCA9IGN0eDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzSGFuZGxlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzMGI1Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFkZE51bWJlcnNIYW5kbGVyU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCB3c2RsTG9jYXRpb24gPSAiQWRkTnVtYmVyc0hhbmRsZXIxLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQURETlVNQkVSU1NFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvTUVUQS1JTkYvQWRkTnVtYmVyc0hhbmRsZXIud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgCXVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiwgIkFkZE51bWJlcnNIYW5kbGVyU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgQWRkTnVtYmVyc0hhbmRsZXJQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiQWRkTnVtYmVyc0hhbmRsZXJQb3J0IikNCi0gICAgcHVibGljIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUgZ2V0QWRkTnVtYmVyc0hhbmRsZXJQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVyc2hhbmRsZXIiLCAiQWRkTnVtYmVyc0hhbmRsZXJQb3J0IiksIEFkZE51bWJlcnNIYW5kbGVyUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJzLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0hhbmRsZXJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhNzVjNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNIYW5kbGVycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQ0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iTG9nZ2luZ0hhbmRsZXJDaGFpbiI+DQotCQk8andzOnByb3RvY29sLWJpbmRpbmdzPiMjU09BUDExX0hUVFAgIyNzb21ldGhpbmcgYmxhcmc8L2p3czpwcm90b2NvbC1iaW5kaW5ncz4NCi0JCTxqd3M6cG9ydC1uYW1lLXBhdHRlcm4gDQotICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9hZGRudW1iZXJzaGFuZGxlci5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iPm5zMTpBZGROdW1iZXJzSGFuZGxlclAqPC9qd3M6cG9ydC1uYW1lLXBhdHRlcm4+DQotICAgICAgICA8andzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuIA0KLSAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vYWRkbnVtYmVyc2hhbmRsZXIuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIj5uczE6KjwvandzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzTG9naWNhbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotCQ0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNMb2dpY2FsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE3YWZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNMb2dpY2FsSGFuZGxlciANCi1pbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyPExvZ2ljYWxNZXNzYWdlQ29udGV4dD4gew0KLSAgICANCi0gICAgSGFuZGxlclRyYWNrZXIgdHJhY2tlciA9IG5ldyBIYW5kbGVyVHJhY2tlcihBZGROdW1iZXJzTG9naWNhbEhhbmRsZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICBCb29sZWFuIG91dGJvdW5kID0gKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKTsNCi0gICAgICAgIHRyYWNrZXIuaGFuZGxlRmF1bHQob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVNZXNzYWdlKG91dGJvdW5kKTsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGRiYTg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5BdHRhY2htZW50c0FkYXB0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7DQotDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgcHJpdmF0ZSBpbnQgZGVkdWN0aW9uID0gMTsNCi0gICAgDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgQFBvc3RDb25zdHJ1Y3QNCi0gICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsNCi0gICAgICAgIHRyYWNrZXIucG9zdENvbnN0cnVjdCgpOw0KLSAgICAgICAgZGVkdWN0aW9uID0gMjsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsgIC8vIG91dGJvdW5kIHJlc3BvbnNlIGlmIHdlJ3JlIG9uIHRoZSBzZXJ2ZXINCi0gICAgICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBtZXNzYWdlY29udGV4dC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQobXNnLmdldFBheWxvYWQoKSk7DQotICAgICAgICAgICAgc3QgPSBzdC5yZXBsYWNlRmlyc3QoImJsYXJnIiwgIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlcjIgd2FzIGhlcmUiKTsNCi0gICAgICAgICAgICBtc2cuc2V0UGF5bG9hZChuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdC5nZXRCeXRlcygpKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogdGhpcyB0ZXN0IGhhbmRsZU1lc3NhZ2UgbWV0aG9kIGlzIG9idmlvdXNseSBub3Qgd2hhdCBhIGN1c3RvbWVyIG1pZ2h0IHdyaXRlLCBidXQgaXQgZG9lcw0KLSAgICAgKiB0aGUgdHJpY2sgZm9yIGtpY2tpbmcgdGhlIHRpcmVzIGluIHRoZSBoYW5kbGVyIGZyYW1ld29yay4gIFRoZSBBZGROdW1iZXJzIHNlcnZpY2UgdGFrZXMgdHdvDQotICAgICAqIGludHMgYXMgaW5jb21pbmcgcGFyYW1zLCBhZGRzIHRoZW0sIGFuZCByZXR1cm5zIHRoZSBzdW0uICBUaGlzIG1ldGhvZCBzdWJ0cmFjdHMgMSBmcm9tIHRoZSANCi0gICAgICogZmlyc3QgaW50IG9uIHRoZSBpbmJvdW5kIHJlcXVlc3QsIGFuZCBzdWJ0cmFjdHMgImRlZHVjdGlvbiIgZnJvbSB0aGUgaW50IG9uIHRoZSBvdXRib3VuZA0KLSAgICAgKiByZXNwb25zZS4gIFNvIHRoZSBjbGllbnQgYXBwIHNob3VsZCBleHBlY3QgYSBzdW0gMyBsZXNzIHRoYW4gYSBzdW0gd2l0aCB0aGlzIGhhbmRsZXIgDQotICAgICAqIG1hbmlwdWxhdGluZyB0aGUgU09BUCBtZXNzYWdlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShMb2dpY2FsTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbiltZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2Uob3V0Ym91bmQpOw0KLSAgICAgICAgaWYgKCFvdXRib3VuZCkgeyAgLy8gaW5ib3VuZCByZXF1ZXN0IGlmIHdlJ3JlIG9uIHRoZSBzZXJ2ZXINCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBtZXNzYWdlY29udGV4dC5nZXRNZXNzYWdlKCk7DQotICAgICAgICAgICAgU3RyaW5nIHN0ID0gZ2V0U3RyaW5nRnJvbVNvdXJjZVBheWxvYWQobXNnLmdldFBheWxvYWQoKSk7DQotICAgICAgICAgICAgaWYgKHN0LmNvbnRhaW5zKCI8YXJnMD45OTwvYXJnMD4iKSkgew0KLSAgICAgICAgICAgICAgICB0cmFja2VyLmxvZygiVEhST1dJTkcgUFJPVE9DT0xFWENFUFRJT04iLCBvdXRib3VuZCk7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiSSBkb24ndCBsaWtlIHRoZSB2YWx1ZSA5OSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBTdHJpbmcgdHh0ID0gU3RyaW5nLnZhbHVlT2YoSW50ZWdlci52YWx1ZU9mKGdldEZpcnN0QXJnKHN0KSkgLSAxKTsNCi0gICAgICAgICAgICBzdCA9IHJlcGxhY2VGaXJzdEFyZyhzdCwgdHh0KTsNCi0gICAgICAgICAgICBtc2cuc2V0UGF5bG9hZChuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzdCkpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBtZXNzYWdlY29udGV4dC5wdXQoIkFkZE51bWJlcnNMb2dpY2FsSGFuZGxlckluYm91bmRBcHBTY29wZWRQcm9wZXJ0eSIsICJibGFyZ3ZhbCIpOw0KLSAgICAgICAgICAgIG1lc3NhZ2Vjb250ZXh0LnNldFNjb3BlKCJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXJJbmJvdW5kQXBwU2NvcGVkUHJvcGVydHkiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY29wZS5BUFBMSUNBVElPTik7DQotICAgICAgICAgICAgbWVzc2FnZWNvbnRleHQucHV0KCJBZGROdW1iZXJzTG9naWNhbEhhbmRsZXJJbmJvdW5kSGFuZGxlclNjb3BlZFByb3BlcnR5IiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibGFyZ3ZhbCIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgcHJlc2VuY2VzIG9mIHRoZSBhdHRhY2htZW50IHByb3BlcnR5DQotICAgICAgICAgICAgU3RyaW5nIHByb3BLZXkgPSBNZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG1lc3NhZ2Vjb250ZXh0LmdldChwcm9wS2V5KTsNCi0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBBdHRhY2htZW50QWRhcHRlciBmb3IgUHJvcGVydHkgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGVsc2UgeyAvLyBvdXRib3VuZCByZXNwb25zZSBpZiB3ZSdyZSBvbiB0aGUgc2VydmVyDQotICAgICAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbWVzc2FnZWNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBzdCA9IGdldFN0cmluZ0Zyb21Tb3VyY2VQYXlsb2FkKG1zZy5nZXRQYXlsb2FkKCkpOw0KLSAgICAgICAgICAgIFN0cmluZyB0eHQgPSBTdHJpbmcudmFsdWVPZihJbnRlZ2VyLnZhbHVlT2YoZ2V0Rmlyc3RBcmcoc3QpKSAtIGRlZHVjdGlvbik7DQotICAgICAgICAgICAgc3QgPSByZXBsYWNlRmlyc3RBcmcoc3QsIHR4dCk7DQotICAgICAgICAgICAgbXNnLnNldFBheWxvYWQobmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oc3QpKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZXMgb2YgdGhlIGF0dGFjaG1lbnQgcHJvcGVydHkNCi0gICAgICAgICAgICBTdHJpbmcgcHJvcEtleSA9IE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICAgICAgTWFwIG1hcCA9IChNYXApIG1lc3NhZ2Vjb250ZXh0LmdldChwcm9wS2V5KTsNCi0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3BlcnR5ICIgKyBwcm9wS2V5ICsgIiB3YXMgbnVsbCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoIShtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBBdHRhY2htZW50QWRhcHRlciBmb3IgUHJvcGVydHkgIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ0Zyb21Tb3VyY2VQYXlsb2FkKFNvdXJjZSBwYXlsb2FkKSB7DQotICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7DQotDQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7DQotDQotICAgICAgICAgICAgdHJhbnMuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOw0KLSAgICAgICAgICAgIHRyYW5zLnRyYW5zZm9ybShwYXlsb2FkLCByZXN1bHQpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RBcmcoU3RyaW5nIHBheWxvYWRTdHJpbmcpIHsNCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF5bG9hZFN0cmluZywgIj4iKTsNCi0gICAgICAgIHN0Lm5leHRUb2tlbigpOyAgLy8gc2tpcCBmaXJzdCB0b2tlbi4NCi0gICAgICAgIHN0Lm5leHRUb2tlbigpOyAgLy8gc2tpcCBzZWNvbmQNCi0gICAgICAgIFN0cmluZyB0ZW1wU3RyaW5nID0gc3QubmV4dFRva2VuKCk7DQotICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZW1wU3RyaW5nLCAiPCIpLm5leHRUb2tlbigpOw0KLSAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VGaXJzdEFyZyhTdHJpbmcgcGF5bG9hZFN0cmluZywgU3RyaW5nIG5ld0FyZykgew0KLSAgICAgICAgU3RyaW5nIGZpcnN0QXJnID0gZ2V0Rmlyc3RBcmcocGF5bG9hZFN0cmluZyk7DQotICAgICAgICBwYXlsb2FkU3RyaW5nID0gcGF5bG9hZFN0cmluZy5yZXBsYWNlRmlyc3QoZmlyc3RBcmcsIG5ld0FyZyk7DQotICAgICAgICByZXR1cm4gcGF5bG9hZFN0cmluZzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjUwOWI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlciBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIEhhbmRsZXJUcmFja2VyIHRyYWNrZXIgPSBuZXcgSGFuZGxlclRyYWNrZXIoQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xvc2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHRyYWNrZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgdHJhY2tlci5nZXRIZWFkZXJzKCk7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmhhbmRsZUZhdWx0KChCb29sZWFuKSBtZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSkpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IG1lc3NhZ2Vjb250ZXh0LmdldE1lc3NhZ2UoKS5nZXRTT0FQQm9keSgpLmdldEZhdWx0KCk7DQotICAgICAgICAgICAgU3RyaW5nIGZhdWx0U3RyaW5nID0gZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKTsNCi0gICAgICAgICAgICBUaHJvd2FibGUgd2VibWV0aG9kRXhjZXB0aW9uID0gKFRocm93YWJsZSkNCi0gICAgICAgICAgICAgICAgbWVzc2FnZWNvbnRleHQuZ2V0KCJqYXh3cy5vdXRib3VuZC5yZXNwb25zZS53ZWJtZXRob2QuZXhjZXB0aW9uIik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBmYXVsdCBzdHJpbmcgd2l0aCB0aGUgc3RhY2sgdHJhY2UNCi0gICAgICAgICAgICBpZiAod2VibWV0aG9kRXhjZXB0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRoZSB3ZWJtZXRob2QgZXhjZXB0aW9uIGlzIGF2YWlsYWJsZS4uLnNldHRpbmcgdGhlIGZhdWx0IHN0cmluZyIpOw0KLSAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyArPSAic3RhY2sgPSAiICsgIHN0YWNrVG9TdHJpbmcod2VibWV0aG9kRXhjZXB0aW9uKTsNCi0gICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUaGUgd2VibWV0aG9kIGV4Y2VwdGlvbiB3YXMgbm90IGF2YWlsYWJsZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdHJhY2tlci5sb2coIkV4Y2VwdGlvbiBvY2N1cnJlZDoiICsgZS5nZXRNZXNzYWdlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2UoKEJvb2xlYW4pIG1lc3NhZ2Vjb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZKSk7DQotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZXhwZWN0ZWQgaGVhZGVycyBhcmUgcHJlc2VudA0KLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJvcmcudGVzdC5hZGRudW1iZXJzaGFuZGxlciIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFFOYW1lIHFOYW1lPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIsIm15SGVhZGVyIik7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG1lc3NhZ2Vjb250ZXh0LmdldEhlYWRlcnMocU5hbWUsIGNvbnRleHQsIHRydWUpOw0KLQ0KLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPTMgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAhKChKQVhCRWxlbWVudCl2YWx1ZXNbMF0pLmdldFZhbHVlKCkuZXF1YWxzKCJHb29kMSIpIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgISgoSkFYQkVsZW1lbnQpdmFsdWVzWzFdKS5nZXRWYWx1ZSgpLmVxdWFscygiR29vZDIiKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICEoKEpBWEJFbGVtZW50KXZhbHVlc1syXSkuZ2V0VmFsdWUoKS5lcXVhbHMoIkJhZCIpKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRmFpbGVkIGdldHRpbmcgYWxsIG9mIHRoZSBoZWFkZXJzOiIgKyB2YWx1ZXMpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1lc3NhZ2Vjb250ZXh0LmdldEhlYWRlcnMocU5hbWUsIGNvbnRleHQsIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT0yIHx8DQotICAgICAgICAgICAgICAgICAgICAgICAgISgoSkFYQkVsZW1lbnQpdmFsdWVzWzBdKS5nZXRWYWx1ZSgpLmVxdWFscygiR29vZDEiKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICEoKEpBWEJFbGVtZW50KXZhbHVlc1sxXSkuZ2V0VmFsdWUoKS5lcXVhbHMoIkdvb2QyIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJGYWlsZWQgZ2V0dGluZyB0aGUgZXhwZWN0ZWQgaGVhZGVyczoiICsgdmFsdWVzKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgQFByZURlc3Ryb3kNCi0gICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsNCi0gICAgICAgIHRyYWNrZXIucHJlRGVzdHJveSgpOw0KLSAgICAJdHJ5IHsNCi0gICAgCQkvKg0KLSAgICAJCSAqIHNpbmNlIEBQcmVEZXN0cm95IG1ldGhvZHMgYXJlIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgbWFuYWdlZCAoc2VydmVyKSBzaWRlDQotICAgIAkJICogaGFuZGxlciBpbnN0YW5jZSBnb2VzIG91dCBvZiBzY29wZSwgdGhlcmUncyBub3QgYSBnb29kIHdheSB0byB0ZXN0IGlmIGl0IGlzDQotICAgIAkJICogY2FsbGVkLiAgU28sIHdlIGFyZSBjcmVhdGluZyBhIGZpbGUgdGhhdCBvbmUgb2YgdGhlIEFkZE51bWJlcnNIYW5kbGVyVGVzdHMgdGVzdHMNCi0gICAgCQkgKiBjaGVja3MgdGhlIGV4aXN0YW5jZSBvZi4NCi0gICAgCQkgKi8NCi0gICAgCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSgiQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlci5wcmVEZXN0cm95LnR4dCIpOw0KLSAgICAJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOw0KLSAgICAJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7DQotICAgIAkJZm9zLndyaXRlKG5ldyBieXRlW117J2gnLCdpJ30pOw0KLSAgICAJCWZvcy5jbG9zZSgpOw0KLSAgICAJCWZpbGUuZGVsZXRlT25FeGl0KCk7DQotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAJCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgIAl9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsNCi0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoc3cpOw0KLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGJ3KTsNCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsNCi0gICAgICAgIHB3LmNsb3NlKCk7DQotICAgICAgICByZXR1cm4gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL0FkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZjIwNzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9BZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjIgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBIYW5kbGVyVHJhY2tlciB0cmFja2VyID0gbmV3IEhhbmRsZXJUcmFja2VyKEFkZE51bWJlcnNQcm90b2NvbEhhbmRsZXIyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgdHJhY2tlci5jbG9zZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGdldEhlYWRlcnMoKSB7DQotICAgICAgICB0cmFja2VyLmdldEhlYWRlcnMoKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZWNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgdHJhY2tlci5oYW5kbGVGYXVsdChvdXRib3VuZCk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgQm9vbGVhbiBvdXRib3VuZCA9IChCb29sZWFuKSBtZXNzYWdlY29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSk7DQotICAgICAgICB0cmFja2VyLmhhbmRsZU1lc3NhZ2Uob3V0Ym91bmQpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9IYW5kbGVyVHJhY2tlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRudW1iZXJzaGFuZGxlci9IYW5kbGVyVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWMyODIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvSGFuZGxlclRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnNoYW5kbGVyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQotDQotcHVibGljIGNsYXNzIEhhbmRsZXJUcmFja2VyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZpbGVsb2duYW1lID0gInRhcmdldC9BZGROdW1iZXJzSGFuZGxlclRlc3RzLmxvZyI7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0UgPSAiQ0xPU0UiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0hFQURFUlMgPSAiR0VUX0hFQURFUlMiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFX0ZBVUxUX0lOQk9VTkQgPSAiSEFORExFX0ZBVUxUX0lOQk9VTkQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFX01FU1NBR0VfSU5CT1VORCA9ICJIQU5ETEVfTUVTU0FHRV9JTkJPVU5EIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRV9GQVVMVF9PVVRCT1VORCA9ICJIQU5ETEVfRkFVTFRfT1VUQk9VTkQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFX01FU1NBR0VfT1VUQk9VTkQgPSAiSEFORExFX01FU1NBR0VfT1VUQk9VTkQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVF9DT05TVFJVQ1QgPSAiUE9TVF9DT05TVFJVQ1QiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX0RFU1RST1kgPSAiUFJFX0RFU1RST1kiOw0KLSAgICANCi0gICAgLy8gc2hvdWxkIHBhc3MgY2xhc3NuYW1lIGZvciAibmFtZSINCi0gICAgcHVibGljIEhhbmRsZXJUcmFja2VyKFN0cmluZyBuYW1lKSB7DQotICAgICAgICBjbGFzc25hbWUgPSBuYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgew0KLSAgICAgICAgbG9nX3RvX2ZpbGUoUE9TVF9DT05TVFJVQ1QpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgew0KLSAgICAgICAgbG9nX3RvX2ZpbGUoUFJFX0RFU1RST1kpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgICAgIGxvZ190b19maWxlKENMT1NFKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgbG9nX3RvX2ZpbGUoR0VUX0hFQURFUlMpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVGYXVsdChib29sZWFuIG91dGJvdW5kKSB7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsNCi0gICAgICAgICAgICBsb2dfdG9fZmlsZShIQU5ETEVfRkFVTFRfT1VUQk9VTkQpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBsb2dfdG9fZmlsZShIQU5ETEVfRkFVTFRfSU5CT1VORCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShib29sZWFuIG91dGJvdW5kKSB7DQotICAgICAgICBpZiAob3V0Ym91bmQpIHsNCi0gICAgICAgICAgICBsb2dfdG9fZmlsZShIQU5ETEVfTUVTU0FHRV9PVVRCT1VORCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGxvZ190b19maWxlKEhBTkRMRV9NRVNTQUdFX0lOQk9VTkQpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIG1zZywgYm9vbGVhbiBvdXRib3VuZCkgew0KLSAgICAgICAgbG9nX3RvX2ZpbGUobXNnICsgIiAiICsgKG91dGJvdW5kID8gIk9VVEJPVU5EIiA6ICJJTkJPVU5EIikpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiB3ZSBoYXZlIHRvIG9wZW4gYW5kIGNsb3NlIHRoZSBmaWxlIGV2ZXJ5IHRpbWUgd2Ugd3JpdGUNCi0gICAgICogYXMgb3RoZXIgaGFuZGxlciBtZXRob2QgY2FsbHMgbWF5IGJlIGludGVybGVhdmVkIHdpdGggdGhpcyBvbmUNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBsb2dfdG9fZmlsZShTdHJpbmcgbXNnKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihmaWxlbG9nbmFtZSwgdHJ1ZSk7DQotICAgICAgICAgICAgZncud3JpdGUoY2xhc3NuYW1lICsgIiAiICsgbXNnICsgIlxuIik7DQotICAgICAgICAgICAgZncuY2xvc2UoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvTUVUQS1JTkYvQWRkTnVtYmVyc0hhbmRsZXIud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVyc2hhbmRsZXIvTUVUQS1JTkYvQWRkTnVtYmVyc0hhbmRsZXIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNmE5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZG51bWJlcnNoYW5kbGVyL01FVEEtSU5GL0FkZE51bWJlcnNIYW5kbGVyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iQWRkTnVtYmVyc0hhbmRsZXIiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0NCi0JPHR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+DQotCQkJPGVsZW1lbnQgbmFtZT0ibXlIZWFkZXIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJDQotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlciI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzEiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCQk8ZWxlbWVudCBuYW1lPSJBZGROdW1iZXJzSGFuZGxlckZhdWx0Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImZhdWx0SW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0ib25lV2F5SW50Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3NlcXVlbmNlPg0KLQkJCQk8L2NvbXBsZXhUeXBlPg0KLQkJCTwvZWxlbWVudD4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXIiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZE51bWJlcnNIYW5kbGVyIiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNIYW5kbGVyUmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6YWRkTnVtYmVyc0hhbmRsZXJSZXNwb25zZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzSGFuZGxlckZhdWx0Ij4NCi0JCTxwYXJ0IG5hbWU9IkFkZE51bWJlcnNIYW5kbGVyRmF1bHQiIGVsZW1lbnQ9InRuczpBZGROdW1iZXJzSGFuZGxlckZhdWx0IiAvPg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9Im9uZVdheUludCI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6b25lV2F5SW50IiAvPg0KLQk8L21lc3NhZ2U+DQotDQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIj4NCi0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXIiPg0KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc0hhbmRsZXIiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzSGFuZGxlclJlc3BvbnNlIiBuYW1lPSJhZGRSZXNwb25zZSIgLz4NCi0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNIYW5kbGVyRmF1bHQiIC8+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheUludCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L3BvcnRUeXBlPg0KLQk8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzSGFuZGxlckJpbmRpbmciIHR5cGU9InRuczpBZGROdW1iZXJzSGFuZGxlclBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiDQotCQkJc3R5bGU9ImRvY3VtZW50IiAvPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzSGFuZGxlciI+DQotCQkJDQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJCTxvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvb3V0cHV0Pg0KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzSGFuZGxlckZhdWx0Ij4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0hhbmRsZXJGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4NCi0JCQkNCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9iaW5kaW5nPg0KLQk8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzSGFuZGxlclNlcnZpY2UiPg0KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc0hhbmRsZXJQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0hhbmRsZXJCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVySGFuZGxlci9BZGROdW1iZXJzSGFuZGxlckltcGxTZXJ2aWNlIiAvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZEVudHJ5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODY5YjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGFkZEVudHJ5IGVsZW1lbnQgZGVjbGFyYXRpb24uDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtlbGVtZW50IG5hbWU9ImFkZEVudHJ5Ij4NCi0gKiAgICZsdDtjb21wbGV4VHlwZT4NCi0gKiAgICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVudHJ5IiB0eXBlPSJ7aHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rfUFkZHJlc3NCb29rRW50cnkiLz4NCi0gKiAgICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAgICZsdDsvY29tcGxleFR5cGU+DQotICogJmx0Oy9lbGVtZW50Pg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsNCi0gICAgImVudHJ5Ig0KLX0pDQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiYWRkRW50cnkiKQ0KLXB1YmxpYyBjbGFzcyBBZGRFbnRyeSB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCByZXF1aXJlZCA9IHRydWUpDQotICAgIHByb3RlY3RlZCBBZGRyZXNzQm9va0VudHJ5IGVudHJ5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudHJ5IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgQWRkcmVzc0Jvb2tFbnRyeSB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGdldEVudHJ5KCkgew0KLSAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW50cnkgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgQWRkcmVzc0Jvb2tFbnRyeSB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5KEFkZHJlc3NCb29rRW50cnkgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuZW50cnkgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZEVudHJ5UmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkRW50cnlSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGZjNTE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkRW50cnlSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGFkZEVudHJ5UmVzcG9uc2UgZWxlbWVudCBkZWNsYXJhdGlvbi4NCi0gKiANCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIA0KLSAqIDxwcmU+DQotICogJmx0O2VsZW1lbnQgbmFtZT0iYWRkRW50cnlSZXNwb25zZSI+DQotICogICAmbHQ7Y29tcGxleFR5cGU+DQotICogICAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdGF0dXMiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1ib29sZWFuIi8+DQotICogICAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogICAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqICZsdDsvZWxlbWVudD4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7DQotICAgICJzdGF0dXMiDQotfSkNCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJhZGRFbnRyeVJlc3BvbnNlIikNCi1wdWJsaWMgY2xhc3MgQWRkRW50cnlSZXNwb25zZSB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siKQ0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGF0dXM7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3RhdHVzIHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhdHVzKCkgew0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0YXR1cyBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoYm9vbGVhbiB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5zdGF0dXMgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWRkNTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIkFkZHJlc3NCb29rIiwgDQotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIpDQotcHVibGljIGludGVyZmFjZSBBZGRyZXNzQm9vayB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGVudHJ5DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgYm9vbGVhbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAic3RhdHVzIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkRW50cnkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLkFkZEVudHJ5IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYWRkRW50cnlSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkRW50cnlSZXNwb25zZSIpDQotICAgIHB1YmxpYyBib29sZWFuIGFkZEVudHJ5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZW50cnkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIikNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmaXJzdG5hbWUNCi0gICAgICogQHBhcmFtIGxhc3RuYW1lDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2tFbnRyeQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiZW50cnkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5kRW50cnlCeU5hbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rLkZpbmRFbnRyeUJ5TmFtZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vay5GaW5kRW50cnlCeU5hbWVSZXNwb25zZSIpDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGZpbmRFbnRyeUJ5TmFtZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImZpcnN0bmFtZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siKQ0KLSAgICAgICAgU3RyaW5nIGZpcnN0bmFtZSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImxhc3RuYW1lIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIpDQotICAgICAgICBTdHJpbmcgbGFzdG5hbWUpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rRW50cnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNhMjVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBBZGRyZXNzQm9va0VudHJ5IGNvbXBsZXggdHlwZS4NCi0gKiANCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIA0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NCb29rRW50cnkiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImZpcnN0TmFtZSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibGFzdE5hbWUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBob25lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImNpdHkiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InN0YXRlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJBZGRyZXNzQm9va0VudHJ5IiwgcHJvcE9yZGVyID0gew0KLSAgICAiZmlyc3ROYW1lIiwNCi0gICAgImxhc3ROYW1lIiwNCi0gICAgInBob25lIiwNCi0gICAgInN0cmVldCIsDQotICAgICJjaXR5IiwNCi0gICAgInN0YXRlIg0KLX0pDQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rRW50cnkgew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpcnN0TmFtZTsNCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIsIHJlcXVpcmVkID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsYXN0TmFtZTsNCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIsIHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBob25lOw0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgc3RyZWV0Ow0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgY2l0eTsNCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIsIHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0YXRlOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0TmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0TmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLmZpcnN0TmFtZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdE5hbWUgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdE5hbWUgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLmxhc3ROYW1lID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwaG9uZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmUoKSB7DQotICAgICAgICByZXR1cm4gcGhvbmU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwaG9uZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMucGhvbmUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0cmVldCBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyZWV0KCkgew0KLSAgICAgICAgcmV0dXJuIHN0cmVldDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHN0cmVldCBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJlZXQoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnN0cmVldCA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY2l0eSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2l0eSgpIHsNCi0gICAgICAgIHJldHVybiBjaXR5Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY2l0eSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5jaXR5ID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzdGF0ZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7DQotICAgICAgICByZXR1cm4gc3RhdGU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzdGF0ZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0ZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuc3RhdGUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9BZGRyZXNzQm9va0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViNGFjZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIiwNCi0JCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2suQWRkcmVzc0Jvb2siKQ0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzQm9va0ltcGwgaW1wbGVtZW50cyBBZGRyZXNzQm9vayB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxBZGRyZXNzQm9va0VudHJ5PiBkYXRhOw0KLSAgICANCi0gICAgc3RhdGljIHsNCi0gICAgICAgIGRhdGEgPSBuZXcgQXJyYXlMaXN0PEFkZHJlc3NCb29rRW50cnk+KCk7DQotICAgICAgICANCi0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7DQotICAgICAgICBBZGRyZXNzQm9va0VudHJ5IGVudHJ5ID0gZmFjdG9yeS5jcmVhdGVBZGRyZXNzQm9va0VudHJ5KCk7DQotICAgICAgICBlbnRyeS5zZXRGaXJzdE5hbWUoIkpvZSIpOw0KLSAgICAgICAgZW50cnkuc2V0TGFzdE5hbWUoIlRlc3QiKTsNCi0gICAgICAgIGVudHJ5LnNldFN0cmVldCgiMTIxNCBUZXN0IExuLiIpOw0KLSAgICAgICAgZW50cnkuc2V0Q2l0eSgiQXVzdGluIik7DQotICAgICAgICBlbnRyeS5zZXRTdGF0ZSgiVFgiKTsNCi0gICAgICAgIGRhdGEuYWRkKGVudHJ5KTsNCi0gICAgICAgIA0KLSAgICAgICAgZW50cnkgPSBmYWN0b3J5LmNyZWF0ZUFkZHJlc3NCb29rRW50cnkoKTsNCi0gICAgICAgIGVudHJ5LnNldEZpcnN0TmFtZSgiU3VlIik7DQotICAgICAgICBlbnRyeS5zZXRMYXN0TmFtZSgiVGVzdGZpZWxkIik7DQotICAgICAgICBlbnRyeS5zZXRTdHJlZXQoIjc4MCAxc3QgU3QuIik7DQotICAgICAgICBlbnRyeS5zZXRDaXR5KCJOZXcgWW9yayIpOw0KLSAgICAgICAgZW50cnkuc2V0U3RhdGUoIk5ZIik7DQotICAgICAgICBkYXRhLmFkZChlbnRyeSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGFkZEVudHJ5KEFkZHJlc3NCb29rRW50cnkgZW50cnkpIHsNCi0gICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk5ldyBBZGRyZXNzQm9va0VudHJ5IHJlY2VpdmVkIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgICAgIC5kZWJ1ZygiICAgICAgIFtuYW1lXSAiICsgZW50cnkuZ2V0TGFzdE5hbWUoKSArICIsICIgKyBlbnRyeS5nZXRGaXJzdE5hbWUoKSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIiAgICAgIFtwaG9uZV0gIiArIGVudHJ5LmdldFBob25lKCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCIgICAgIFtzdHJlZXRdICIgKyBlbnRyeS5nZXRTdHJlZXQoKSk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjaXR5LCBzdGF0ZV0gIiArIGVudHJ5LmdldENpdHkoKSArICIsICIgKyBlbnRyeS5nZXRTdGF0ZSgpKTsNCi0gICAgICAgICAgICBkYXRhLmFkZChlbnRyeSk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFkZHJlc3NCb29rRW50cnkgZmluZEVudHJ5QnlOYW1lKFN0cmluZyBmaXJzdG5hbWUsIFN0cmluZyBsYXN0bmFtZSkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIk5ldyByZXF1ZXN0IHJlY2VpdmVkLiIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkxvb2tpbmcgZm9yIGVudHJ5OiBbIiArIGZpcnN0bmFtZSArICJdIFsiICsgbGFzdG5hbWUgKyAiXSIpOw0KLSAgICAgICAgSXRlcmF0b3I8QWRkcmVzc0Jvb2tFbnRyeT4gaSA9IGRhdGEuaXRlcmF0b3IoKTsNCi0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkgPSBpLm5leHQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL0lmIHRoZXkgaGF2ZSBhIGZpcnN0bmFtZSBhbmQgaXQgZG9lc24ndCBtYXRjaCwganVzdCBnbyBvbg0KLSAgICAgICAgICAgIC8vdG8gdGhlIG5leHQgZW50cnkuDQotICAgICAgICAgICAgaWYgKGZpcnN0bmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmICghZmlyc3RuYW1lLmVxdWFscyhlbnRyeS5nZXRGaXJzdE5hbWUoKSkpDQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAobGFzdG5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAobGFzdG5hbWUuZXF1YWxzKGVudHJ5LmdldExhc3ROYW1lKCkpKQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svRmluZEVudHJ5QnlOYW1lLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL0ZpbmRFbnRyeUJ5TmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjEzMjdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svRmluZEVudHJ5QnlOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGZpbmRFbnRyeUJ5TmFtZSBlbGVtZW50IGRlY2xhcmF0aW9uLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7ZWxlbWVudCBuYW1lPSJmaW5kRW50cnlCeU5hbWUiPg0KLSAqICAgJmx0O2NvbXBsZXhUeXBlPg0KLSAqICAgICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZmlyc3RuYW1lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Imxhc3RuYW1lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogICAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqICZsdDsvZWxlbWVudD4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7DQotICAgICJmaXJzdG5hbWUiLA0KLSAgICAibGFzdG5hbWUiDQotfSkNCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJmaW5kRW50cnlCeU5hbWUiKQ0KLXB1YmxpYyBjbGFzcyBGaW5kRW50cnlCeU5hbWUgew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgZmlyc3RuYW1lOw0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxhc3RuYW1lOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0bmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3RuYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGZpcnN0bmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0bmFtZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdG5hbWUoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLmZpcnN0bmFtZSA9IHZhbHVlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdG5hbWUgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RuYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGxhc3RuYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdG5hbWUgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdG5hbWUoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLmxhc3RuYW1lID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9GaW5kRW50cnlCeU5hbWVSZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9GaW5kRW50cnlCeU5hbWVSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODAxN2M4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svRmluZEVudHJ5QnlOYW1lUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZHJlc3Nib29rOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBmaW5kRW50cnlCeU5hbWVSZXNwb25zZSBlbGVtZW50IGRlY2xhcmF0aW9uLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7ZWxlbWVudCBuYW1lPSJmaW5kRW50cnlCeU5hbWVSZXNwb25zZSI+DQotICogICAmbHQ7Y29tcGxleFR5cGU+DQotICogICAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlbnRyeSIgdHlwZT0ie2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9va31BZGRyZXNzQm9va0VudHJ5Ii8+DQotICogICAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogICAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqICZsdDsvZWxlbWVudD4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7DQotICAgICJlbnRyeSINCi19KQ0KLUBYbWxSb290RWxlbWVudChuYW1lID0gImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIikNCi1wdWJsaWMgY2xhc3MgRmluZEVudHJ5QnlOYW1lUmVzcG9uc2Ugew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiwgcmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgQWRkcmVzc0Jvb2tFbnRyeSBlbnRyeTsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnRyeSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIEFkZHJlc3NCb29rRW50cnkgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkcmVzc0Jvb2tFbnRyeSBnZXRFbnRyeSgpIHsNCi0gICAgICAgIHJldHVybiBlbnRyeTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVudHJ5IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIEFkZHJlc3NCb29rRW50cnkgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnRyeShBZGRyZXNzQm9va0VudHJ5IHZhbHVlKSB7DQotICAgICAgICB0aGlzLmVudHJ5ID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9NRVRBLUlORi9BZGRyZXNzQm9va1NlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svTUVUQS1JTkYvQWRkcmVzc0Jvb2tTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjkzYzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vay9NRVRBLUlORi9BZGRyZXNzQm9va1NlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIg0KLSAgICB4bWxuczppbXBsPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siIA0KLSAgICB4bWxuczppbnRmPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siIA0KLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICA8d3NkbDp0eXBlcz4NCi0gICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiANCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICAgICAgIHhtbG5zOmltcGw9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hZGRyZXNzYm9vayIgDQotICAgICAgICAgeG1sbnM6aW50Zj0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rIiANCi0gICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgDQotICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzQm9va0VudHJ5Ij4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaXJzdE5hbWUiIG5pbGxhYmxlPSJmYWxzZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibGFzdE5hbWUiIG5pbGxhYmxlPSJmYWxzZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RhdGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgDQotICAgICAgIDxlbGVtZW50IG5hbWU9ImFkZEVudHJ5Ij4NCi0gICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBuaWxsYWJsZT0iZmFsc2UiIHR5cGU9ImltcGw6QWRkcmVzc0Jvb2tFbnRyeSIvPg0KLSAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICA8L2VsZW1lbnQ+DQotICAgIA0KLSAgICAgICA8ZWxlbWVudCBuYW1lPSJhZGRFbnRyeVJlc3BvbnNlIj4NCi0gICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InN0YXR1cyIgbmlsbGFibGU9ImZhbHNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPg0KLSAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICA8L2VsZW1lbnQ+DQotDQotICAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRFbnRyeUJ5TmFtZSI+DQotICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJmaXJzdG5hbWUiIG5pbGxhYmxlPSJmYWxzZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXN0bmFtZSIgbmlsbGFibGU9ImZhbHNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgDQotICAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIj4NCi0gICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBuaWxsYWJsZT0iZmFsc2UiIHR5cGU9ImltcGw6QWRkcmVzc0Jvb2tFbnRyeSIvPg0KLSAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICA8L2VsZW1lbnQ+DQotDQotICAgICA8L3NjaGVtYT4NCi0gICA8L3dzZGw6dHlwZXM+DQotIA0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRFbnRyeVJlcXVlc3QiPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImltcGw6YWRkRW50cnkiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSANCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkRW50cnlSZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDphZGRFbnRyeVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kRW50cnlCeU5hbWVSZXF1ZXN0Ij4NCi0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJpbXBsOmZpbmRFbnRyeUJ5TmFtZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotIA0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kRW50cnlCeU5hbWVSZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDpmaW5kRW50cnlCeU5hbWVSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotDQotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRFbnRyeSI+DQotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDphZGRFbnRyeVJlcXVlc3QiIG5hbWU9ImFkZEVudHJ5UmVxdWVzdCIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOmFkZEVudHJ5UmVzcG9uc2UiIG5hbWU9ImFkZEVudHJ5UmVzcG9uc2UiLz4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgDQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kRW50cnlCeU5hbWUiPg0KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6ZmluZEVudHJ5QnlOYW1lUmVxdWVzdCIgbmFtZT0iZmluZEVudHJ5QnlOYW1lUmVxdWVzdCIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJpbXBsOmZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIiBuYW1lPSJmaW5kRW50cnlCeU5hbWVSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOnBvcnRUeXBlPg0KLQ0KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXAiIHR5cGU9ImltcGw6QWRkcmVzc0Jvb2siPg0KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIA0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYWRkRW50cnkiPg0KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iYWRkRW50cnlSZXF1ZXN0Ij4NCi0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iYWRkRW50cnlSZXNwb25zZSI+DQotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEVudHJ5QnlOYW1lIj4NCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPg0KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRFbnRyeUJ5TmFtZVJlcXVlc3QiPg0KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kRW50cnlCeU5hbWVSZXNwb25zZSI+DQotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgPC93c2RsOmJpbmRpbmc+DQotDQotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+DQotICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpBZGRyZXNzQm9va1NvYXAiIG5hbWU9IkFkZHJlc3NCb29rIj4NCi0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL09iamVjdEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svT2JqZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJmZjlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7DQotDQotDQotLyoqDQotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIA0KLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vayBwYWNrYWdlLiANCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5IA0KLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIA0KLSAqIGZvciBYTUwgY29udGVudC4gVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgWE1MIA0KLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcyANCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hIA0KLSAqIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCANCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlIA0KLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuDQotICogDQotICovDQotQFhtbFJlZ2lzdHJ5DQotcHVibGljIGNsYXNzIE9iamVjdEZhY3Rvcnkgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRyZXNzYm9vaw0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZpbmRFbnRyeUJ5TmFtZSB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEZpbmRFbnRyeUJ5TmFtZSBjcmVhdGVGaW5kRW50cnlCeU5hbWUoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEZpbmRFbnRyeUJ5TmFtZSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFkZEVudHJ5IH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkRW50cnkgY3JlYXRlQWRkRW50cnkoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEFkZEVudHJ5KCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkcmVzc0Jvb2tFbnRyeSB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEFkZHJlc3NCb29rRW50cnkgY3JlYXRlQWRkcmVzc0Jvb2tFbnRyeSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgQWRkcmVzc0Jvb2tFbnRyeSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFkZEVudHJ5UmVzcG9uc2UgfQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBBZGRFbnRyeVJlc3BvbnNlIGNyZWF0ZUFkZEVudHJ5UmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEFkZEVudHJ5UmVzcG9uc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBGaW5kRW50cnlCeU5hbWVSZXNwb25zZSB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlIGNyZWF0ZUZpbmRFbnRyeUJ5TmFtZVJlc3BvbnNlKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBGaW5kRW50cnlCeU5hbWVSZXNwb25zZSgpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svcGFja2FnZS1pbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FkZHJlc3Nib29rL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUwMzZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2svcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2siKQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkcmVzc2Jvb2s7DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jbGllbnQvQXN5bmNDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY2xpZW50L0FzeW5jQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmViZWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jbGllbnQvQXN5bmNDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5jbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEFzeW5jQ2xpZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCA9Ci0gICAgICAgICJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQXN5bmNTZXJ2aWNlMi5Eb2NMaXRXcmFwcGVkUG9ydEltcGxQb3J0IjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBtYXhfaXNhc2xlZXBfY2hlY2sgPSAzMDsKLQkKLQkvKioKLQkgKiBBdXhpbGlhcnkgbWV0aG9kIHVzZWQgZm9yIGRvaWluZyBpc0FzbGVlcCBjaGVja3MuIFdpbGwgcGVyZm9ybSBpc0FzbGVlcAotCSAqIHVwIHRvIGEgTUFYX0lTQVNMRUVQX0NIRUNLIG51bWJlciBvZiBjaGVja3MuIFdpbGwgc2xlZXAgZm9yCi0JICogU0xFRVBfSVNBU0xFRVBfU0VDIHNlY29uZHMgaW4gYmV0d2VlbiByZXF1ZXN0cy4gSWYgcmVhY2hlcyBtYXhpbXVtIG51bWJlcgotCSAqIGZvIHJldHJpZXMgdGhlbiB3aWxsIGZhaWwgdGhlIHRlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBc2xlZXBDaGVjayhTdHJpbmcgTUVTU0FHRSwgQXN5bmNQb3J0IHBvcnQpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGFzbGVlcCA9IGZhbHNlOwotCQlpbnQgY2hlY2sgPSA1OyAvL0NvbnN0YW50cy5NQVhfSVNBU0xFRVBfQ0hFQ0s7Ci0JCVN0cmluZyBtc2cgPSBudWxsOwotCi0JCWZpbmFsIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQuaXNBc2xlZXBDaGVjaygiICsgTUVTU0FHRSArICIpIEVudGVyIik7Ci0KLQkJZG8gewotCQkJdHJ5IHsKLQkJCQltc2cgPSBwb3J0LmlzQXNsZWVwKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC5pc0FzbGVlcENoZWNrIEV4Y2VwdGlvbiBvbiBpc0FzbGVlcDoiICsgZSk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCQotCQkJYXNsZWVwID0gKG1zZyAhPSBudWxsKTsKLQotCQkJLy8gZmFpbCB0aGUgdGVzdCBpZiB3ZSByYW4gb3V0IG9mIGNoZWNrcwotCQkJaWYgKChjaGVjay0tKSA9PSAwKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC5pc0FzbGVlcENoZWNrPSIgKyBhc2xlZXAKLQkJCQkJCSsgIiBhZnRlciAiICsgKC8qQ29uc3RhbnRzLk1BWF9JU0FTTEVFUF9DSEVDSyovIG1heF9pc2FzbGVlcF9jaGVjayAtIGNoZWNrKQotCQkJCQkJKyAiIHRyaWVzIik7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlcnZlciBkaWQgbm90IHJlY2VpdmUgc2xlZXAgYWZ0ZXIgc2V2ZXJhbCByZXRyaWVzIik7Ci0JCQl9Ci0KLQkJCS8vIHNsZWVwIGZvciBhIGJpdAotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoLypDb25zdGFudHMuU0xFRVBfSVNBU0xFRVBfU0VDKi8gMSAqIDEwMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQuaXNBc2xlZXBDaGVjayAoaWdub3JlZCBlcnJvcikgIgotCQkJCQkJKyBlKTsKLQkJCX0KLQotCQl9IHdoaWxlICghYXNsZWVwKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LmlzQXNsZWVwQ2hlY2soKSBhc2xlZXA9IiArIGFzbGVlcCArICIgYWZ0ZXIgIgotCQkJCSsgKC8qQ29uc3RhbnRzLk1BWF9JU0FTTEVFUF9DSEVDSyovIG1heF9pc2FzbGVlcF9jaGVjayAtIGNoZWNrKSArICIgdHJpZXMiKTsKLQotCQlpZiAoYXNsZWVwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LmlzQXNsZWVwQ2hlY2sgc2xlZXBpbmcgb246IiArIG1zZyk7Ci0JCQlpZiAoIU1FU1NBR0UuZXF1YWxzKG1zZykpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2xlZXBpbmcgb24gYW4gaW5jb3JyZWN0IG1lc3NhZ2UiKTsKLQkJCX0KLQkJfQotCi0JCWxvbmcgbWlucyA9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSAvIDEwMDA7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQuaXNBc2xlZXBDaGVjaygpIEV4aXQsIHRpbWU9IiArIG1pbnMgKyAibWluIik7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQXV4aWxpYXJ5IG1ldGhvZCB1c2VkIGZvciBvYnRhaW5pbmcgYSBwcm94eSBwcmUtY29uZmlndXJlZCB3aXRoIGEKLQkgKiBzcGVjaWZpYyBFeGVjdXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXN5bmNQb3J0IGdldFBvcnQoRXhlY3V0b3IgZXgpIHsKLQkJQXN5bmNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXN5bmNTZXJ2aWNlKCk7Ci0KLQkJaWYgKGV4ICE9IG51bGwpIHNlcnZpY2Uuc2V0RXhlY3V0b3IoZXgpOwotCi0JCUFzeW5jUG9ydCBwb3J0ID0gc2VydmljZS5nZXRBc3luY1BvcnQoKTsKLQkJaWYgKHBvcnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInNlcnZpY2UuZ2V0QXN5bmNQb3J0KCkgaXMgbnVsbCIpOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgT2JqZWN0PiByYyA9ICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0KS5nZXRSZXF1ZXN0Q29udGV4dCgpOwotCQlyYy5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksCi0JCQkJRE9DTElUV1JfQVNZTkNfRU5EUE9JTlQpOyAvL0NvbnN0YW50cy5ET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC5nZXRQb3J0KCkgPSAiCi0JCQkJKyBET0NMSVRXUl9BU1lOQ19FTkRQT0lOVCk7IC8vQ29uc3RhbnRzLkRPQ0xJVFdSX0FTWU5DX0VORFBPSU5UKTsKLQotCQlyZXR1cm4gcG9ydDsKLQl9Ci0KLQkvKioKLQkgKiBBdXhpbGlhcnkgbWV0aG9kIHVzZWQgdG8gd2FpdCBmb3IgYSBtb25pdG9yIGZvciBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUKLQkgKiBiZWZvcmUgdGltaW5nIG91dAotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRCbG9ja2luZyhGdXR1cmU8Pz4gbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJBc3luY0NsaWVudC53YWl0QmxvY2tpbmcoKSBFbnRlciIpOwotCi0JCS8vIHdhaXQgZm9yIHJlcXVlc3QgdG8gY29tcGxldGUKLQkJaW50IHNlYyA9IC8qQ29uc3RhbnRzLkNMSUVOVF9NQVhfU0xFRVBfU0VDKi8gbWF4X2lzYXNsZWVwX2NoZWNrOwotCQl3aGlsZSAoIW1vbml0b3IuaXNEb25lKCkgJiYgIW1vbml0b3IuaXNDYW5jZWxsZWQoKSkgewotCQkJVGhyZWFkLnNsZWVwKDEwMDApOwotCQkJc2VjLS07Ci0JCQlpZiAoc2VjIDw9IDApIGJyZWFrOwotCQl9Ci0KLQkJaWYgKHNlYyA8PSAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFzeW5jQ2xpZW50LndhaXRCbG9ja2luZyBFeGl0LCB0aW1lb3V0IGFmdGVyIgotCQkJCQkrIC8qQ29uc3RhbnRzLkNMSUVOVF9NQVhfU0xFRVBfU0VDKi8gbWF4X2lzYXNsZWVwX2NoZWNrICsgIiBzZWMiKTsKLQkJCQotCQkJdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oCi0JCQkJCSJTdG9wcGVkIHdhaXRpbmcgZm9yIEFzeW5jIHJlc3BvbnNlIGFmdGVyICIKLQkJCQkJCQkrIC8qQ29uc3RhbnRzLkNMSUVOVF9NQVhfU0xFRVBfU0VDKi8gbWF4X2lzYXNsZWVwX2NoZWNrICsgIiBzZWMiKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXN5bmNDbGllbnQud2FpdEJsb2NraW5nIEV4aXQsICIgKyBzZWMKLQkJCQkJKyAic2VjIHJlbWFpbmluZyIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jbGllbnQvQXN5bmNQb3J0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzMTMwOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY1BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLy8NCi0vLyBHZW5lcmF0ZWQgQnk6SkFYLVdTIFJJIElCTSAyLjEuMSBpbiBKREsgNiAoSkFYQiBSSSBJQk0gSkFYQiAyLjEuMyBpbiBKREsgMS42KQ0KLS8vDQotDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5jbGllbnQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXJSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmNSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuRXhjZXB0aW9uVHlwZUVudW07DQotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmdSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXBSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25SZXNwb25zZTsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIkFzeW5jUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgQXN5bmNQb3J0IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5hc3luY2RvY2xpdC5QaW5nUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicGluZyIsIGFjdGlvbiA9ICJwaW5nIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5QaW5nIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAicGluZ1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5QaW5nUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8UGluZ1Jlc3BvbnNlPiBwaW5nQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgbWVzc2FnZSk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJwaW5nIiwgYWN0aW9uID0gInBpbmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInBpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmciKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gcGluZ0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxQaW5nUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJwaW5nIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAicGluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInBpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuUGluZ1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBwaW5nKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAic2xlZXAiLCBhY3Rpb24gPSAic2xlZXAiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5TbGVlcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8U2xlZXBSZXNwb25zZT4gc2xlZXBBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInNsZWVwIiwgYWN0aW9uID0gInNsZWVwIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5TbGVlcFJlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBzbGVlcEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxTbGVlcFJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJzbGVlcCIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuU2xlZXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyB2b2lkIHNsZWVwKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IG1lc3NhZ2UpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaXNBc2xlZXAiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImlzQXNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Jc0FzbGVlcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImlzQXNsZWVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LklzQXNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGlzQXNsZWVwKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJ3YWtlVXAiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAibWVzc2FnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIndha2VVcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuV2FrZVVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAid2FrZVVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lldha2VVcFJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyB3YWtlVXAoKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5hc3luY2RvY2xpdC5JbnZva2VBc3luY1Jlc3BvbnNlPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImludm9rZUFzeW5jIiwgYWN0aW9uID0gImludm9rZUFzeW5jIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5JbnZva2VBc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFJlc3BvbnNlPEludm9rZUFzeW5jUmVzcG9uc2U+IGludm9rZUFzeW5jQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2VBc3luYyIsIGFjdGlvbiA9ICJpbnZva2VBc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmNSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmNBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8SW52b2tlQXN5bmNSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImludm9rZUFzeW5jIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmNSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSW52b2tlQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmNSZXNwb25zZT4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJjdXN0b21Bc3luYyIsIGFjdGlvbiA9ICJjdXN0b21Bc3luYyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkN1c3RvbUFzeW5jIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiY3VzdG9tQXN5bmNSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxDdXN0b21Bc3luY1Jlc3BvbnNlPiByZW1hcHBlZEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiY3VzdG9tQXN5bmMiLCBhY3Rpb24gPSAiY3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkN1c3RvbUFzeW5jUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHJlbWFwcGVkQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPEN1c3RvbUFzeW5jUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiY3VzdG9tQXN5bmMiLCBhY3Rpb24gPSAiY3VzdG9tQXN5bmMiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyByZW1hcHBlZCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiYW5vdGhlciIsIGFjdGlvbiA9ICJhbm90aGVyIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8QW5vdGhlclJlc3BvbnNlPiBhbm90aGVyQXN5bmNBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImFub3RoZXIiLCBhY3Rpb24gPSAiYW5vdGhlciIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQW5vdGhlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQW5vdGhlclJlc3BvbnNlIikNCi0gICAgcHVibGljIEZ1dHVyZTw/PiBhbm90aGVyQXN5bmNBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8QW5vdGhlclJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImFub3RoZXIiLCBhY3Rpb24gPSAiYW5vdGhlciIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXIiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LkFub3RoZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgYW5vdGhlckFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBleGNlcHRpb25UeXBlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidGhyb3dFeGNlcHRpb24iLCBhY3Rpb24gPSAidGhyb3dFeGNlcHRpb24iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvbiIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gdGhyb3dFeGNlcHRpb25Bc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImV4Y2VwdGlvblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEV4Y2VwdGlvblR5cGVFbnVtIGV4Y2VwdGlvblR5cGUpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBleGNlcHRpb25UeXBlDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidGhyb3dFeGNlcHRpb24iLCBhY3Rpb24gPSAidGhyb3dFeGNlcHRpb24iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvbiIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHRocm93RXhjZXB0aW9uQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJleGNlcHRpb25UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBFeGNlcHRpb25UeXBlRW51bSBleGNlcHRpb25UeXBlLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8VGhyb3dFeGNlcHRpb25SZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZXhjZXB0aW9uVHlwZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICogQHRocm93cyBUaHJvd0V4Y2VwdGlvbkZhdWx0DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJ0aHJvd0V4Y2VwdGlvbiIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvbiIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RXhjZXB0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRocm93RXhjZXB0aW9uKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZXhjZXB0aW9uVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgRXhjZXB0aW9uVHlwZUVudW0gZXhjZXB0aW9uVHlwZSkNCi0gICAgICAgIHRocm93cyBUaHJvd0V4Y2VwdGlvbkZhdWx0DQotICAgIDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jbGllbnQvQXN5bmNTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlMzRkYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9Bc3luY1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0vLw0KLS8vIEdlbmVyYXRlZCBCeTpKQVgtV1MgUkkgSUJNIDIuMS4xIGluIEpESyA2IChKQVhCIFJJIElCTSBKQVhCIDIuMS4zIGluIEpESyAxLjYpDQotLy8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsNCi0NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkFzeW5jU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCB3c2RsTG9jYXRpb24gPSAiYXN5bmNfZG9jbGl0d3IyLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBBc3luY1NlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQVNZTkNTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9NRVRBLUlORi9hc3luY19kb2NsaXR3cjIud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEFTWU5DU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBc3luY1NlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBc3luY1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihBU1lOQ1NFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCAiQXN5bmNTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBBc3luY1BvcnQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFzeW5jUG9ydCIpDQotICAgIHB1YmxpYyBBc3luY1BvcnQgZ2V0QXN5bmNQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChBc3luY1BvcnQpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsICJBc3luY1BvcnQiKSwgQXN5bmNQb3J0LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmZWF0dXJlcw0KLSAgICAgKiAgICAgQSBsaXN0IG9mIHtAbGluayBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmV9IHRvIGNvbmZpZ3VyZSBvbiB0aGUgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlczwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4NCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBBc3luY1BvcnQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFzeW5jUG9ydCIpDQotICAgIHB1YmxpYyBBc3luY1BvcnQgZ2V0QXN5bmNQb3J0KFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7DQotICAgICAgICByZXR1cm4gKEFzeW5jUG9ydClzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgIkFzeW5jUG9ydCIpLCBBc3luY1BvcnQuY2xhc3MsIGZlYXR1cmVzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9UaHJvd0V4Y2VwdGlvbkZhdWx0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L2NsaWVudC9UaHJvd0V4Y2VwdGlvbkZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTIwYjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jbGllbnQvVGhyb3dFeGNlcHRpb25GYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLS8vDQotLy8gR2VuZXJhdGVkIEJ5OkpBWC1XUyBSSSBJQk0gMi4xLjEgaW4gSkRLIDYgKEpBWEIgUkkgSUJNIEpBWEIgMi4xLjMgaW4gSkRLIDEuNikNCi0vLw0KLQ0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYXN5bmNkb2NsaXQuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotaW1wb3J0IG9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uRmF1bHRCZWFuOw0KLQ0KLUBXZWJGYXVsdChuYW1lID0gInRocm93RXhjZXB0aW9uRmF1bHRCZWFuIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIpDQotcHVibGljIGNsYXNzIFRocm93RXhjZXB0aW9uRmF1bHQNCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFRocm93RXhjZXB0aW9uRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIFRocm93RXhjZXB0aW9uRmF1bHRCZWFuIGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgVGhyb3dFeGNlcHRpb25GYXVsdChTdHJpbmcgbWVzc2FnZSwgVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4gZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBqYXh3cy5hc3luYy53c2Z2dC5jb21tb24uZG9jbGl0d3IuVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4NCi0gICAgICovDQotICAgIHB1YmxpYyBUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvY29tbW9uL0NhbGxiYWNrSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jb21tb24vQ2FsbGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MzJiZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9jb21tb24vQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5jb21tb247DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEdlbmVyaWMgQXN5bmMgY2FsbGJhY2sgaGFuZGxlci4gVGhlIGdldCBtZXRob2QgZW11bGF0ZXMgUmVzcG9uc2UuZ2V0IGJ5DQotICogdGhyb3duaW5nIGFuIGV4Y2VwdGlvbiBpZiBvbmUgaXMgcmVjZWl2ZWQuIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0hhbmRsZXI8VD4gaW1wbGVtZW50cyBBc3luY0hhbmRsZXI8VD4gew0KLQ0KLSAgICBwcml2YXRlIFQgcmVzcG9uc2UgPSBudWxsOw0KLSAgICBwcml2YXRlIFJlc3BvbnNlPFQ+IHJlc3AgPSBudWxsOw0KLSAgICANCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0NCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UoUmVzcG9uc2U8VD4gcmVzcG9uc2UpIHsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVCByZXMgPSAoVCkgcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlczsNCi0gICAgICAgICAgICB0aGlzLnJlc3AgPSByZXNwb25zZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gPSBlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNwb25zZTxUPiBnZXRSZXNwb25zZSgpew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFQgZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOw0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEF1eGlsaWFyeSBtZXRob2QgdXNlZCB0byB3YWl0IGZvciBhIG1vbml0b3IgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZQ0KLSAgICAgKiBiZWZvcmUgdGltaW5nIG91dA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1vbml0b3INCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHdhaXRCbG9ja2luZyhGdXR1cmU8Pz4gbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyB3YWl0IGZvciByZXF1ZXN0IHRvIGNvbXBsZXRlDQotICAgICAgICBpbnQgc2VjID0gMjA7IC8vQ29uc3RhbnRzLkNMSUVOVF9NQVhfU0xFRVBfU0VDOw0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgIHNlYy0tOw0KLSAgICAgICAgICAgIGlmIChzZWMgPD0gMCkgYnJlYWs7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc2VjIDw9IDApDQotICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlN0b3BwZWQgd2FpdGluZyBmb3IgQXN5bmMgcmVzcG9uc2UgYWZ0ZXIgIg0KLSAgICAgICAgICAgICAgICAgICAgKyAyMCAvKkNvbnN0YW50cy5DTElFTlRfTUFYX1NMRUVQX1NFQyovICsgIiBzZWMiKTsNCi0gICAgfSAgIA0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvQXN5bmNQb3J0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9Bc3luY1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmY2ZiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9Bc3luY1BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLy8NCi0vLyBHZW5lcmF0ZWQgQnk6SkFYLVdTIFJJIElCTSAyLjEuMSBpbiBKREsgNiAoSkFYQiBSSSBJQk0gSkFYQiAyLjEuMyBpbiBKREsgMS42KQ0KLS8vDQotDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuRXhjZXB0aW9uVHlwZUVudW07DQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJBc3luY1BvcnQyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIpDQotcHVibGljIGludGVyZmFjZSBBc3luY1BvcnQgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAicGluZyIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInBpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmciKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlBpbmdSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgcGluZygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAic2xlZXAiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5TbGVlcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNsZWVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0LlNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBzbGVlcCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBtZXNzYWdlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImlzQXNsZWVwIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpc0FzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuSXNBc2xlZXAiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpc0FzbGVlcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Jc0FzbGVlcFJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBpc0FzbGVlcCgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAid2FrZVVwIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ3YWtlVXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lldha2VVcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIndha2VVcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5XYWtlVXBSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgd2FrZVVwKCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJpbnZva2VBc3luYyIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5JbnZva2VBc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFzeW5jZG9jbGl0Lkludm9rZUFzeW5jUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiY3VzdG9tQXN5bmMiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luYyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuQ3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5DdXN0b21Bc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBjdXN0b21Bc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImFub3RoZXIiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiYW5vdGhlclJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5Bbm90aGVyUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGFub3RoZXIoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvblR5cGUNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqIEB0aHJvd3MgVGhyb3dFeGNlcHRpb25GYXVsdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAidGhyb3dFeGNlcHRpb24iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0aHJvd0V4Y2VwdGlvbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb24iKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0aHJvd0V4Y2VwdGlvblJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5hc3luY2RvY2xpdC5UaHJvd0V4Y2VwdGlvblJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyB0aHJvd0V4Y2VwdGlvbigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImV4Y2VwdGlvblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIEV4Y2VwdGlvblR5cGVFbnVtIGV4Y2VwdGlvblR5cGUpDQotICAgICAgICB0aHJvd3MgVGhyb3dFeGNlcHRpb25GYXVsdA0KLSAgICA7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL0RvY0xpdFdyYXBwZWRQb3J0SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzhhNTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5zZXJ2ZXI7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuRXhjZXB0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25GYXVsdEJlYW47Ci0KLS8qCi1pbXBvcnQgamF4d3MuYXN5bmMud3NmdnQuY29tbW9uLkNvbnN0YW50czsKLWltcG9ydCBqYXh3cy5hc3luYy53c2Z2dC5jb21tb24uZG9jbGl0d3IuQXN5bmNQb3J0OwotaW1wb3J0IGpheHdzLmFzeW5jLndzZnZ0LmNvbW1vbi5kb2NsaXR3ci5FeGNlcHRpb25UeXBlRW51bTsKLWltcG9ydCBqYXh3cy5hc3luYy53c2Z2dC5jb21tb24uZG9jbGl0d3IuVGhyb3dFeGNlcHRpb25GYXVsdDsKLWltcG9ydCBqYXh3cy5hc3luYy53c2Z2dC5jb21tb24uZG9jbGl0d3IuVGhyb3dFeGNlcHRpb25GYXVsdEJlYW47Ci0qLwotLyoqCi0gKiBBc3luYyBlbmRwb2ludCB1c2VkIGZvciBBc3luYyBjbGllbnQgc2lkZSB0ZXN0cy4gQ2xpZW50cyB3aWxsIGludm9rZUFzeW5jCi0gKiBzbGVlcCBtZXRob2QgdG8gZm9yY2UgdGhlIHNlcnZlciB0byBibG9jayB1bnRpbCB3YWtlVXAgaXMgY2FsbGVkLiBUaGUgY2xpZW50Ci0gKiBjYW4gY2FsbCBpc0FzbGVlcCB0byB2ZXJpZnkgdGhhdCBzbGVlcCBoYXMgYmVlbiBjYWxsZWQgYnkgdGhlIGFzeW5jIHRocmVhZC4KLSAqLwotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkFzeW5jU2VydmljZTIiLAotCQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFzeW5jZG9jbGl0LnNlcnZlci5Bc3luY1BvcnQiKQotcHVibGljIGNsYXNzIERvY0xpdFdyYXBwZWRQb3J0SW1wbCBpbXBsZW1lbnRzIEFzeW5jUG9ydCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQotCS8vIG1lc3NhZ2Ugb24gd2hpY2ggdGhlIHNsZWVwIG1ldGhvZCBpcyBzbGVlcGluZyBvbgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtc2cgPSAiIjsKLQotCS8vIHRocmVhZCBpbnN0YW5jZSB0aGF0IGlzIGN1cnJlbnRseSBzbGVlcGluZyBzbyBpdCBjYW4gYmUgaW50ZXJydXB0ZWQgZnJvbQotCS8vIHdha2V1cAotCXByaXZhdGUgc3RhdGljIFRocmVhZCBzbGVlcGVyID0gbnVsbDsKLQotCS8vIGludGVycnVwdCBmbGFnIGZvciB3YWtlVXAgdG8gc2V0Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb0NhbmNlbGwgPSBmYWxzZTsKLQotCXB1YmxpYyB2b2lkIHNsZWVwKEhvbGRlcjxTdHJpbmc+IG1lc3NhZ2UpIHsKLQotCXRyeSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS52YWx1ZSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5zbGVlcChudWxsKSBFbnRlciIpOwotCQl9Ci0JCQotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwKCIgKyBtZXNzYWdlLnZhbHVlICsgIikgRW50ZXIiKTsKLQotCQlib29sZWFuIGNhbmNlbFJlcXVlc3RlZCA9IGZhbHNlOwotCi0JCW1zZyA9IG1lc3NhZ2UudmFsdWU7Ci0KLQkJc3luY2hyb25pemVkIChtc2cpIHsKLQotCQkJVGhyZWFkIG15VGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQkJCXNsZWVwZXIgPSBteVRocmVhZDsKLQotCQkJdHJ5IHsKLQotCQkJCWRvQ2FuY2VsbCA9IGZhbHNlOwotCi0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5zbGVlcDogZ29pbmcgdG8gc2xlZXAgb24gIgotCQkJCQkJCSsgbXlUaHJlYWQuZ2V0SWQoKSArICIgIiArIG1zZyk7Ci0KLQkJCQkvLyB3YWl0IHVudGlsIGVpdGhlciBhIHRpbWVvdXQgb3IgY2xpZW50IHJlbGVhc2VzIHVzCi0JCQkJLy8gb3IgaWYgYW5vdGhlciByZXF1ZXN0IGJlZ2lucyAobG9ja0lkIGNoYW5nZXMpCi0JCQkJbG9uZyBzZWMgPSAxNTsgLy9Db25zdGFudHMuU0VSVkVSX1NMRUVQX1NFQzsKLQotCQkJCXdoaWxlIChzZWMgPiAwICYmICFkb0NhbmNlbGwgJiYgc2xlZXBlciA9PSBteVRocmVhZCkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5zbGVlcDogIiArIG15VGhyZWFkLmdldElkKCkKLQkJCQkJCQkJKyAiIHRpbWVMZWZ0PSIgKyBzZWMpOwotCQkJCQlzZWMtLTsKLQotCQkJCQltc2cud2FpdCgxMDAwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuc2xlZXA6IGludGVycnVwdGVkIG9uICIgKyBteVRocmVhZC5nZXRJZCgpKTsKLQkJCX0gZmluYWxseSB7Ci0KLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwOiBXb2tlVXAgIiArIG15VGhyZWFkLmdldElkKCkpOwotCi0JCQkJLy8gaWYgd2UgdGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgdGhlbgotCQkJCS8vIHJlbGVhc2UgdGhlIHdhaXQKLQkJCQlpZiAoc2xlZXBlciA9PSBteVRocmVhZCkgewotCQkJCQljYW5jZWxSZXF1ZXN0ZWQgPSBkb0NhbmNlbGw7Ci0JCQkJCWRvQ2FuY2VsbCA9IGZhbHNlOwotCQkJCQlzbGVlcGVyID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQkvLyBvbmx5IG5vdGlmeSBpZiBjYW5jZWwgd2FzIHJlcXVlc3RlZAotCQkJCWlmIChjYW5jZWxSZXF1ZXN0ZWQpIHsKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwuc2xlZXA6IE5vdGlmeSAiICsgbXlUaHJlYWQuZ2V0SWQoKQotCQkJCQkJCQkrICIgaXNEb25lIik7Ci0KLQkJCQkJLy8gd2FrZSB1cCB0aGUgcmVsZWFzZSB0aHJlYWQKLQkJCQkJbXNnLm5vdGlmeSgpOwotCQkJCX0KLQkJCX0KLQkJfS8vIHN5bmNoCi0KLQkJbXNnID0gbnVsbDsKLQotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLnNsZWVwKCIgKyBtZXNzYWdlLnZhbHVlICsgIikgRXhpdCIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5zbGVlcDogIiArIGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGlzQXNsZWVwKCkgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmlzQXNsZWVwKCkgRW50ZXIiKTsKLQkJCi0JCVN0cmluZyByZXQgPSAoc2xlZXBlciAhPSBudWxsKSA/IG1zZyA6IG51bGw7Ci0JCQotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmlzQXNsZWVwKCkgPSAiICsgcmV0KTsKLQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB3YWtlVXAoKSB7Ci0KLQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC53YWtlVXAoKSBFbnRlciIpOwotCi0JCVN0cmluZyB3YWtlVXAgPSBudWxsOwotCi0JCWlmIChzbGVlcGVyID09IG51bGwpIHsKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwud2FrZVVwOiBObyBvbmUgdG8gd2FrZSB1cCIpOwotCQl9IGVsc2UgewotCQkJaWYgKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC53YWtlVXA6IEludGVycnVwdGluZyAiICsgc2xlZXBlci5nZXRJZCgpKTsKLQotCQkJLy8gaW50ZXJydXB0IHRoZSBzbGVlcGVyICYgc2V0IGludGVlcnVwdCBmbGFnIGluIGNhc2UKLQkJCS8vIHRoZSBzbGVlcCBpc24ndCBzbGVlcGluZyBidXQgYWN0dWFsbHkgZG9pbmcgd29yawotCQkJd2FrZVVwID0gbXNnOwotCQkJc2xlZXBlci5pbnRlcnJ1cHQoKTsKLQkJCWRvQ2FuY2VsbCA9IHRydWU7Ci0JCQkKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC53YWtlVXA6IGFib3V0IHRvIGVudGVyIHN5bmMgYmxvY2sgIgotCQkJCQkJKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0KLQkJCS8vIGJsb2NrIHVudGlsIHNsZWVwIGNvbXBsZXRlcwotCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJc3luY2hyb25pemVkIChtc2cpIHsKLQotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC53YWtlVXA6IGVudGVyIHN5bmMgYmxvY2sgIgotCQkJCQkJCQkrIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQotCQkJCQlkb0NhbmNlbGwgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW1zZyA9IG51bGw7Ci0JCX0KLQotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLndha2VVcCgpID0gIiArIHdha2VVcCk7Ci0KLQkJcmV0dXJuIHdha2VVcDsKLQl9Ci0KLQkvKioKLQkgKiBjbGllbnQgc2lkZSB0ZXN0cyBmb3IgcmVtYXBwaW5nIG9wZXJhdGlvbiBuYW1lcywgb24gdGhlIHNlcnZlciBzaWRlIGFsbAotCSAqIHdlIG5lZWQgdG8gZG8gaXMgcm91bmR0cmlwIHRoZSBtZXNzYWdlCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGludm9rZUFzeW5jKFN0cmluZyByZXF1ZXN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmludm9rZUFzeW5jICIgKyByZXF1ZXN0KTsKLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjdXN0b21Bc3luYyhTdHJpbmcgcmVxdWVzdCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvY0xpdFdyYXBwZWRQb3J0SW1wbC5jdXN0b21Bc3luYyAiICsgcmVxdWVzdCk7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlcXVlc3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBhbm90aGVyKFN0cmluZyByZXF1ZXN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmFub3RoZXIgIiArIHJlcXVlc3QpOwotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHBpbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwucGluZyAiICsgbWVzc2FnZSk7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdGhyb3dFeGNlcHRpb24oRXhjZXB0aW9uVHlwZUVudW0gZXhjZXB0aW9uVHlwZSkKLQkJCXRocm93cyBUaHJvd0V4Y2VwdGlvbkZhdWx0IHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb2NMaXRXcmFwcGVkUG9ydEltcGwudGhyb3dFeGNlcHRpb24gIiArIGV4Y2VwdGlvblR5cGUpOwotCQkKLQkJc3dpdGNoIChleGNlcHRpb25UeXBlKSB7Ci0JCWNhc2UgRElWSURFX0JZX1pFUk86Ci0JCQlpbnQgZGl2ID0gMTAgLyAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTlBFOgotCQkJU3RyaW5nIHggPSBudWxsOwotCQkJeC50b1N0cmluZygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV1NFOgotCQkJdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIldlYlNlcnZpY2VGYXVsdCIpOwotCQljYXNlIFdTRExfRkFVTFQ6Ci0JCQlUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiB0ZWZiID0gbmV3IFRocm93RXhjZXB0aW9uRmF1bHRCZWFuKCk7Ci0JCQl0ZWZiLnNldFRleHQoImZhdWx0QmVhbiIpOwotCQkJdGhyb3cgbmV3IFRocm93RXhjZXB0aW9uRmF1bHQoIm1lc3NhZ2UiLCB0ZWZiKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9hc3luY2RvY2xpdC9zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZWZhYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS42LjENCi1DcmVhdGVkLUJ5OiAyLjMgKElCTSBDb3Jwb3JhdGlvbikNCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9NRVRBLUlORi9hc3luY19kb2NsaXR3cjIud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkzNDU4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJhc3luYyIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCI+Ci0JCi0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdCIKLQkJCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IgotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CQkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmciPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCi0JCQkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ic2xlZXBSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImlzQXNsZWVwIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlIC8+Ci0JCQk8L3hzZDplbGVtZW50PgkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImlzQXNsZWVwUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkKLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Indha2VVcCI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZSAvPgotCQkJPC94c2Q6ZWxlbWVudD4JCi0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ3YWtlVXBSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+CQotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmMiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlQXN5bmNSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9tQXN5bmMiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9tQXN5bmNSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkKLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlciI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJCi0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9InRocm93RXhjZXB0aW9uIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvblR5cGUiIHR5cGU9InRuczpFeGNlcHRpb25UeXBlRW51bSIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgkJCi0KLQkJCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFeGNlcHRpb25UeXBlRW51bSI+Ci0JCQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlBFIiAvPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXZpZGVCeVplcm8iIC8+Ci0JCQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldTRSIgLz4KLQkJCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU29hcEZhdWx0IiAvPgotCQkJCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXc2RsRmF1bHQiIC8+Ci0JCQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JCQk8L3hzZDpzaW1wbGVUeXBlPgkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHRCZWFuIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4JCQkKLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9InRocm93RXhjZXB0aW9uUmVzcG9uc2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQk8L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJwaW5nUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnBpbmciIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InBpbmdSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpwaW5nUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InRocm93RXhjZXB0aW9uUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnRocm93RXhjZXB0aW9uIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0aHJvd0V4Y2VwdGlvblJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnRocm93RXhjZXB0aW9uUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6dGhyb3dFeGNlcHRpb25GYXVsdEJlYW4iIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InNsZWVwUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnNsZWVwIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJzbGVlcFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnNsZWVwUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ3YWtlVXBSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOndha2VVcCIgLz4JCi0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Indha2VVcFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOndha2VVcFJlc3BvbnNlIiAvPgkKLQk8L3dzZGw6bWVzc2FnZT4JCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpc0FzbGVlcFJlcXVlc3QiPgotCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppc0FzbGVlcCIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaXNBc2xlZXBSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPgkKLQk8L3dzZGw6bWVzc2FnZT4JCQotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlQXN5bmNSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmMiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZUFzeW5jUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4JCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJjdXN0b21Bc3luY1JlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczpjdXN0b21Bc3luYyIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iY3VzdG9tQXN5bmNSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpjdXN0b21Bc3luY1Jlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgkJCi0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJhbm90aGVyUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmFub3RoZXIiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImFub3RoZXJSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczphbm90aGVyUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+CQkKLQkKLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJBc3luY1BvcnQiPgotCQkKLQkJPCEtLSBzaW1wbGUgcGluZyBvcGVyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZm9yIERvY0xpdFdyYXBwZWQgYXN5bmMgdGVzdC0tPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnBpbmdSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpwaW5nUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+CQkKLQkJCi0JCTwhLS0gcmVxdWVzdCBmb3IgdGhlIHNlcnZlciB0byBnb3RvIHNsZWVwIHVudGlsIHJlbGVhc2UgaXMgY2FsbGVkLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzbGVlcCI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnNsZWVwUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6c2xlZXBSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTwhLS0gY2hlY2sgdG8gc2VlIGlmIHRoZSBzbGVlcCBvcGVyYXRpb24gaGFzIGJlZW4gY2FsbGVkIHlldCAtLT4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6aXNBc2xlZXBSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczppc0FzbGVlcFJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQotCQkKLQkJPCEtLSBmb3JjZSB0aGUgc2xlZXAgb3BlcmF0aW9uIHRvIHN0b3Agc2xlZXBpbmcgLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczp3YWtlVXBSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp3YWtlVXBSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQkJCi0JCQkKLQkJCQotCQk8IS0tIFNlY29uZCBzdWl0ZSBvZiB0ZXN0cyBmb3IgQXN5bmMgb3BlcmF0aW9uIG5hbWluZzoKLQkJCSB3aWxsIHRlc3QgZm9yIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uZHMgdG8KLQkJICAgICBtZXRob2RzIGVuZGluZyBpbiBBc3luYyB3aXRoIGFzeW5jIGJpbmRpbmcgZW5hYmxlZAotCQkgLS0+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2VBc3luYyI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmludm9rZUFzeW5jUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkKLQkJCQotCQk8IS0tIHdpbGwgdGVzdCBmb3IgaG93IHRoZSBpbXBsZW1lbnRhdGlvbiByZXNwb25kcyB0bwotCQkgICAgIG1ldGhvZHMgZW5kaW5nIGluIGFzeW5jIHdpdGggYXN5bmMgYmluZGluZyBlbmFibGVkCi0JCSAtLT4JCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImN1c3RvbUFzeW5jIj4KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6Y3VzdG9tQXN5bmNSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpjdXN0b21Bc3luY1Jlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPCEtLSB3ZSB3aWxsIG1hcCB0aGlzIG9wZXJhdGlvbiB0byBhIGphdmEgbWV0aG9kIGVuZGluZyBpbiBBc3luYwotCQkgLS0+CQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFub3RoZXIiPgotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczphbm90aGVyUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6YW5vdGhlclJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPCEtLSB0ZXN0IGZvciB2YXJpb3MgZXhjZXB0aW9ucywgdG8gdGVzdCBleGNlcHRpb24gaGFuZGxpbmcgd2l0aCBhc3luY01FUAotCQkJIGVuYWJsZWQKLQkJIC0tPgkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0aHJvd0V4Y2VwdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnRocm93RXhjZXB0aW9uUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dGhyb3dFeGNlcHRpb25SZXNwb25zZSIgLz4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiIG1lc3NhZ2U9InRuczp0aHJvd0V4Y2VwdGlvbkZhdWx0IiAvPgkJCQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCQotCQkJCi0JPC93c2RsOnBvcnRUeXBlPgotCQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iQXN5bmMiIHR5cGU9InRuczpBc3luY1BvcnQiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZyI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0L3BpbmciIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNsZWVwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvc2xlZXAiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImlzQXNsZWVwIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvaXNBc2xlZXAiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCi0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3YWtlVXAiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC93YWtlVXAiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZUFzeW5jIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvaW52b2tlQXN5bmMiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQotCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iY3VzdG9tQXN5bmMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9hc3luY2RvY2xpdC9jdXN0b21Bc3luYyIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgkJCi0JCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhbm90aGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvYW5vdGhlciIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRocm93RXhjZXB0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvYXN5bmNkb2NsaXQvdGhyb3dFeGNlcHRpb24iIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJCTx3c2RsOmZhdWx0IG5hbWU9InRocm93RXhjZXB0aW9uRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0idGhyb3dFeGNlcHRpb25GYXVsdCIgLz4KLQkJCTwvd3NkbDpmYXVsdD4JCQkJCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkJCi0JCi0JPC93c2RsOmJpbmRpbmc+Ci0JCi0JPHdzZGw6c2VydmljZSBuYW1lPSJBc3luY1NlcnZpY2UiPgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpBc3luYyIgbmFtZT0iQXN5bmNQb3J0Ij4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9qYXh3cy5hc3luY2RvY2xpdC9zZXJ2aWNlcy9Bc3luY0RvY0xpdFdyYXBwZWRTZXJ2aWNlIiAvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLQkKLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL1Rocm93RXhjZXB0aW9uRmF1bHQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYXN5bmNkb2NsaXQvc2VydmVyL1Rocm93RXhjZXB0aW9uRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0NTZhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2FzeW5jZG9jbGl0L3NlcnZlci9UaHJvd0V4Y2VwdGlvbkZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotLy8NCi0vLyBHZW5lcmF0ZWQgQnk6SkFYLVdTIFJJIElCTSAyLjEuMSBpbiBKREsgNiAoSkFYQiBSSSBJQk0gSkFYQiAyLjEuMyBpbiBKREsgMS42KQ0KLS8vDQotDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hc3luY2RvY2xpdC5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi1pbXBvcnQgb3JnLnRlc3QuYXN5bmNkb2NsaXQuVGhyb3dFeGNlcHRpb25GYXVsdEJlYW47DQotDQotQFdlYkZhdWx0KG5hbWUgPSAidGhyb3dFeGNlcHRpb25GYXVsdEJlYW4iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FzeW5jZG9jbGl0IikNCi1wdWJsaWMgY2xhc3MgVGhyb3dFeGNlcHRpb25GYXVsdA0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIFRocm93RXhjZXB0aW9uRmF1bHRCZWFuIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgVGhyb3dFeGNlcHRpb25GYXVsdChTdHJpbmcgbWVzc2FnZSwgVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4gZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBUaHJvd0V4Y2VwdGlvbkZhdWx0KFN0cmluZyBtZXNzYWdlLCBUaHJvd0V4Y2VwdGlvbkZhdWx0QmVhbiBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IG9yZy50ZXN0LmFzeW5jZG9jbGl0LlRocm93RXhjZXB0aW9uRmF1bHRCZWFuDQotICAgICAqLw0KLSAgICBwdWJsaWMgVGhyb3dFeGNlcHRpb25GYXVsdEJlYW4gZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9HcmVldGVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vR3JlZXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyMzQzYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9HcmVldGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpLkdyZWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWkuVGVzdEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaS5UZXN0RXhjZXB0aW9uMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaS5UZXN0RXhjZXB0aW9uMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnR5cGVzLlByb2Nlc3NGYXVsdDM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi50eXBlcy5UZXN0QmVhbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJHcmVldGVyU2VydmljZSIsDQotCQkJZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaS5HcmVldGVyIiwNCi0JCQl0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIpDQotcHVibGljIGNsYXNzIEdyZWV0ZXJJbXBsIGltcGxlbWVudHMgR3JlZXRlciB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ3JlZXRNZShTdHJpbmcgbWUpIHsNCi0gICAgICAgIHJldHVybiAiSGVsbG8gIiArIG1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdFVucXVhbGlmaWVkKFN0cmluZyBpbikgew0KLSAgICAgICAgcmV0dXJuIGluOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUZXN0QmVhbiBwcm9jZXNzKGludCBpbkFjdGlvbiwgVGVzdEJlYW4gaW4pIHRocm93cyBUZXN0RXhjZXB0aW9uLCBUZXN0RXhjZXB0aW9uMiwgVGVzdEV4Y2VwdGlvbjMgew0KLSAgICAgICAgaWYgKGluQWN0aW9uID09IDApIHsNCi0gICAgICAgICAgICAvLyBlY2hvDQotICAgICAgICAgICAgcmV0dXJuIGluOw0KLSAgICAgICAgfSBlbHNlIGlmIChpbkFjdGlvbiA9PSAxKSB7DQotICAgICAgICAgICAgLy8gdGhyb3cgY2hlY2tlZCBleGNlcHRpb24gdGhhdCBkb2VzIG5vdCBoYXZlIGEgZmF1bHQgYmVhbg0KLSAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uKCJUZXN0RXhjZXB0aW9uIHRocm93biIsIDEyMyk7DQotICAgICAgICB9IGVsc2UgaWYgKGluQWN0aW9uID09IDIpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiV2ViU2VydmljZUV4Y2VwdGlvbiB0aHJvd24iKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoaW5BY3Rpb24gPT0gMykgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTlBFIHRocm93biIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChpbkFjdGlvbiA9PSA0KSB7DQotICAgICAgICAgICAvLyB0aHJvdyBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGRvZXMgaGF2ZSBhIGZhdWx0IGJlYW4NCi0gICAgICAgICAgICB0aHJvdyBuZXcgVGVzdEV4Y2VwdGlvbjIoIlRlc3RFeGNlcHRpb24yIHRocm93biIsIDQ1Nik7DQotICAgICAgICB9IGVsc2UgaWYgKGluQWN0aW9uID09IDUpIHsNCi0gICAgICAgICAgIC8vIHRocm93IGNoZWNrZWQgZXhjZXB0aW9uIHRoYXQgZG9lcyBoYXZlIGEgZmF1bHQgYmVhbg0KLSAgICAgICAgICAgIFByb2Nlc3NGYXVsdDMgZmF1bHRJbmZvID0gbmV3IFByb2Nlc3NGYXVsdDMoKTsNCi0gICAgICAgICAgICBmYXVsdEluZm8uc2V0RmxhZyg3ODkpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uMygiVGVzdEV4Y2VwdGlvbjMgdGhyb3duIiwgZmF1bHRJbmZvKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL01FVEEtSU5GL2dyZWV0ZXIud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL01FVEEtSU5GL2dyZWV0ZXIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyN2YzMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9NRVRBLUlORi9ncmVldGVyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnR5cGVzPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3R5cGVzIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iIG5hbWU9IkhlbGxvV29ybGQiPg0KLSAgICA8d3NkbDp0eXBlcy8+DQotICAgIDx3c2RsOnR5cGVzPg0KLSAgICAgICAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dHlwZXM9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vdHlwZXMiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gICAgICAgICAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi90eXBlcyIgc2NoZW1hTG9jYXRpb249ImdyZWV0ZXJUeXBlcy54c2QiLz4NCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJncmVldE1lIj4NCi0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3RUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJncmVldE1lUmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2VUeXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0VW5xdWFsaWZpZWQiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5xdWFsaWZpZWRSZXF1ZXN0IiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L2VsZW1lbnQ+DQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGVzdFVucXVhbGlmaWVkUmVzcG9uc2UiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idW5xdWFsaWZpZWRSZXNwb25zZSIgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC9lbGVtZW50Pg0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3MiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW5BY3Rpb24iIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaW4iIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ0eXBlczp0ZXN0QmVhbiIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L2VsZW1lbnQ+DQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc1Jlc3BvbnNlIj4NCi0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Im91dCIgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InR5cGVzOnRlc3RCZWFuIi8+DQotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDwvZWxlbWVudD4NCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzRmF1bHQiPg0KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmxhZyIgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiBmb3JtPSJ1bnF1YWxpZmllZCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8L2VsZW1lbnQ+DQotICAgICAgICA8L3NjaGVtYT4NCi0gICAgPC93c2RsOnR5cGVzPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImdyZWV0TWVSZXF1ZXN0Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW4iIGVsZW1lbnQ9InRuczpncmVldE1lIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImdyZWV0TWVSZXNwb25zZSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Im91dCIgZWxlbWVudD0idG5zOmdyZWV0TWVSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJ0ZXN0VW5xdWFsaWZpZWRSZXF1ZXN0Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW4iIGVsZW1lbnQ9InRuczp0ZXN0VW5xdWFsaWZpZWQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdFVucXVhbGlmaWVkUmVzcG9uc2UiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJvdXQiIGVsZW1lbnQ9InRuczp0ZXN0VW5xdWFsaWZpZWRSZXNwb25zZSIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwcm9jZXNzUmVxdWVzdCI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluIiBlbGVtZW50PSJ0bnM6cHJvY2VzcyIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwcm9jZXNzUmVzcG9uc2UiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJvdXQiIGVsZW1lbnQ9InRuczpwcm9jZXNzUmVzcG9uc2UiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icHJvY2Vzc0ZhdWx0Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczpwcm9jZXNzRmF1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icHJvY2Vzc0ZhdWx0MiI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImZhdWx0MiIgZWxlbWVudD0idHlwZXM6cHJvY2Vzc0ZhdWx0MiIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwcm9jZXNzRmF1bHQzIj4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iZmF1bHQzIiBlbGVtZW50PSJ0eXBlczpwcm9jZXNzRmF1bHQzIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJHcmVldGVyIj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJncmVldE1lIj4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJncmVldE1lUmVxdWVzdCIgbWVzc2FnZT0idG5zOmdyZWV0TWVSZXF1ZXN0Ii8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImdyZWV0TWVSZXNwb25zZSIgbWVzc2FnZT0idG5zOmdyZWV0TWVSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0VW5xdWFsaWZpZWQiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InRlc3RVbnF1YWxpZmllZFJlcXVlc3QiIG1lc3NhZ2U9InRuczp0ZXN0VW5xdWFsaWZpZWRSZXF1ZXN0Ii8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InRlc3RVbnF1YWxpZmllZFJlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6dGVzdFVucXVhbGlmaWVkUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icHJvY2VzcyI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0icHJvY2Vzc1JlcXVlc3QiIG1lc3NhZ2U9InRuczpwcm9jZXNzUmVxdWVzdCIvPg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJwcm9jZXNzUmVzcG9uc2UiIG1lc3NhZ2U9InRuczpwcm9jZXNzUmVzcG9uc2UiLz4NCi0gICAgICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQiIG1lc3NhZ2U9InRuczpwcm9jZXNzRmF1bHQiLz4NCi0gICAgICAgICAgICA8d3NkbDpmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQyIiBtZXNzYWdlPSJ0bnM6cHJvY2Vzc0ZhdWx0MiIvPg0KLSAgICAgICAgICAgIDx3c2RsOmZhdWx0IG5hbWU9InByb2Nlc3NGYXVsdDMiIG1lc3NhZ2U9InRuczpwcm9jZXNzRmF1bHQzIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICA8L3dzZGw6cG9ydFR5cGU+DQotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iR3JlZXRlclNPQVBCaW5kaW5nIiB0eXBlPSJ0bnM6R3JlZXRlciI+DQotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJncmVldE1lIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZ3JlZXRNZSIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0VW5xdWFsaWZpZWQiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ0ZXN0VW5xdWFsaWZpZWQiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icHJvY2VzcyI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InByb2Nlc3MiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0icHJvY2Vzc0ZhdWx0Ij4NCi0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0icHJvY2Vzc0ZhdWx0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L2ZhdWx0Pg0KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJwcm9jZXNzRmF1bHQyIj4NCi0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0icHJvY2Vzc0ZhdWx0MiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9mYXVsdD4NCi0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0icHJvY2Vzc0ZhdWx0MyI+DQotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9InByb2Nlc3NGYXVsdDMiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvZmF1bHQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICA8L3dzZGw6YmluZGluZz4NCi0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJHcmVldGVyU2VydmljZSI+DQotICAgICAgICA8d3NkbDpwb3J0IG5hbWU9IkdyZWV0ZXJQb3J0IiBiaW5kaW5nPSJ0bnM6R3JlZXRlclNPQVBCaW5kaW5nIj4NCi0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvR3JlZXRlclNlcnZpY2UiLz4NCi0gICAgICAgIDwvd3NkbDpwb3J0Pg0KLSAgICA8L3dzZGw6c2VydmljZT4NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vTUVUQS1JTkYvZ3JlZXRlclR5cGVzLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL01FVEEtSU5GL2dyZWV0ZXJUeXBlcy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYzE4ODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vTUVUQS1JTkYvZ3JlZXRlclR5cGVzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3R5cGVzIg0KLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotICAgICA8Y29tcGxleFR5cGUgbmFtZT0idGVzdEJlYW4iPg0KLSAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZGF0YTEiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJkYXRhMiIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgPC9jb21wbGV4VHlwZT4NCi0gICAgIDxlbGVtZW50IG5hbWU9InByb2Nlc3NGYXVsdDIiPg0KLSAgICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImZsYWciICAgIGZvcm09InVucXVhbGlmaWVkIiB0eXBlPSJ4c2Q6aW50Ii8+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgPC9lbGVtZW50Pg0KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvY2Vzc0ZhdWx0MyI+DQotICAgICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmxhZyIgICAgZm9ybT0idW5xdWFsaWZpZWQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgICAgPC9lbGVtZW50Pg0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9HcmVldGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvR3JlZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNlM2Y0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9HcmVldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4udHlwZXMuVGVzdEJlYW47DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iLCBuYW1lID0gIkdyZWV0ZXIiKQ0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgR3JlZXRlciB7DQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iLCBuYW1lID0gInJlc3BvbnNlVHlwZSIpDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJncmVldE1lIiwgYWN0aW9uPSJncmVldE1lIikNCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ3JlZXRNZSgNCi0gICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2FwYWNoZS5vcmcvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbiIsIG5hbWUgPSAicmVxdWVzdFR5cGUiKQ0KLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyByZXF1ZXN0VHlwZQ0KLSAgICApOw0KLSAgICANCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAidW5xdWFsaWZpZWRSZXNwb25zZSIpDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0ZXN0VW5xdWFsaWZpZWQiLCBhY3Rpb249InRlc3RVbnF1YWxpZmllZCIpDQotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRlc3RVbnF1YWxpZmllZCgNCi0gICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAidW5xdWFsaWZpZWRSZXF1ZXN0IikNCi0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgcmVxdWVzdFR5cGUNCi0gICAgKTsNCi0gDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gIm91dCIpDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJwcm9jZXNzIiwgYWN0aW9uPSJwcm9jZXNzIikNCi0gICAgcHVibGljIFRlc3RCZWFuIHByb2Nlc3MoDQotICAgICAgICBAV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gImluQWN0aW9uIikNCi0gICAgICAgIGludCBpbkFjdGlvbiwNCi0gICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAiaW4iKQ0KLSAgICAgICAgVGVzdEJlYW4gaW4NCi0gICAgKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbiwgVGVzdEV4Y2VwdGlvbjIsIFRlc3RFeGNlcHRpb24zOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL1Rlc3RFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjNGVhNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnNlaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLS8qKg0KLSAqIEV4YW1wbGUgQ2hlY2tlZCBFeGNlcHRpb24gd2l0aCBubyBjb3JyZXNwb25kaW5nIEpBWEIgYmVhbg0KLSAqLw0KLUBXZWJGYXVsdChuYW1lPSJwcm9jZXNzRmF1bHQiLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hcGFjaGUub3JnL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4iKQ0KLXB1YmxpYyBjbGFzcyBUZXN0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0NCi0gICAgcHVibGljIGludCBmbGFnOw0KLSAgICANCi0NCi0gICAgcHVibGljIFRlc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIGludCBmbGFnKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmxhZyA9IGZsYWc7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBpbnQgZ2V0RmxhZygpIHsNCi0gICAgICAgIHJldHVybiBmbGFnOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3NlaS9UZXN0RXhjZXB0aW9uMi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL1Rlc3RFeGNlcHRpb24yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2VkOTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL1Rlc3RFeGNlcHRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kbHdtaW4uc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogQ2hlY2tlZCBFeGNlcHRpb24gd2l0aCBhIFdlYkZhdWx0IHRoYXQgbG9jYXRlcyBhbiBleGlzdGluZyBKQVhCIEJlYW4NCi0gKg0KLSAqLw0KLUBXZWJGYXVsdChuYW1lPSJwcm9jZXNzRmF1bHQyIiwgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3R5cGVzIiwNCi0gICAgICAgIGZhdWx0QmVhbj0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZGx3bWluLnR5cGVzLlByb2Nlc3NGYXVsdDIiKQ0KLXB1YmxpYyBjbGFzcyBUZXN0RXhjZXB0aW9uMiBleHRlbmRzIEV4Y2VwdGlvbiB7DQotDQotICAgIHB1YmxpYyBpbnQgZmxhZzsNCi0gICAgDQotDQotICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uMihTdHJpbmcgbWVzc2FnZSwgaW50IGZsYWcpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mbGFnID0gZmxhZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGludCBnZXRGbGFnKCkgew0KLSAgICAgICAgcmV0dXJuIGZsYWc7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kbHdtaW4vc2VpL1Rlc3RFeGNlcHRpb24zLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IyMjMzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2Rsd21pbi9zZWkvVGVzdEV4Y2VwdGlvbjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi5zZWk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRsd21pbi50eXBlcy5Qcm9jZXNzRmF1bHQzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogQ2hlY2tlZCBFeGNlcHRpb24gd2l0aCBhIFdlYkZhdWx0IHRoYXQgbG9jYXRlcyBhbiBleGlzdGluZyBKQVhCIEJlYW4NCi0gKg0KLSAqLw0KLUBXZWJGYXVsdChuYW1lPSJwcm9jZXNzRmF1bHQzIiwgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXBhY2hlLm9yZy9heGlzMi9qYXh3cy9zYW1wbGUvZGx3bWluL3R5cGVzIikNCi1wdWJsaWMgY2xhc3MgVGVzdEV4Y2VwdGlvbjMgZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICBwdWJsaWMgUHJvY2Vzc0ZhdWx0MyBmYXVsdEluZm87DQotICAgIA0KLQ0KLSAgICBwdWJsaWMgVGVzdEV4Y2VwdGlvbjMoU3RyaW5nIG1lc3NhZ2UsIFByb2Nlc3NGYXVsdDMgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgUHJvY2Vzc0ZhdWx0MyBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvRG9jTGl0QmFyZVBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ0NjdkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9Eb2NMaXRCYXJlUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaS5Eb2NMaXRCYXJlUG9ydFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkZhdWx0QmVhbldpdGhXcmFwcGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaS5TaW1wbGVGYXVsdDsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLmRvY2xpdGJhcmUuQ29tcG9zaXRlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iQmFyZURvY0xpdFNlcnZpY2UiLA0KLQkJCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaS5Eb2NMaXRCYXJlUG9ydFR5cGUiKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXRCYXJlUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgRG9jTGl0QmFyZVBvcnRUeXBlIHsNCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZSNvbmVXYXlFbXB0eSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBvbmVXYXlFbXB0eSgpIHsNCi0JCVN0cmluZyByZXRWYWx1ZSA9ICJSdW5uaW5nIE9uZSB3YXkgY2FsbCI7DQotDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpLkRvY0xpdEJhcmVQb3J0VHlwZSNvbmVXYXkoamF2YS5sYW5nLlN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIG9uZVdheShTdHJpbmcgYWxsQnlNeXNlbGYpIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCVN0cmluZyByZXRWYWx1ZSA9ICJSdW5uaW5nIE9uZSB3YXkgY2FsbCB3aXRoIFN0cmluZyBpbnB1dCIgKyBhbGxCeU15c2VsZjsNCi0JfQ0KLSAgICAgICAgDQotICAgICAgICAgDQotCXB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgZWNob1N0cmluZ0luKSB7DQotCSAgICByZXR1cm4gZWNob1N0cmluZ0luOw0KLQl9DQotDQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlLnNlaS5Eb2NMaXRCYXJlUG9ydFR5cGUjdHdvV2F5U2ltcGxlKGludCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdHdvV2F5U2ltcGxlKGludCBhbGxCeU15c2VsZikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJU3RyaW5nIHJldFZhbHVlID0gIkFja25vd2xlZGdlbWVudDogcmVjZWl2ZWQgaW5wdXQgdmFsdWUgYXMgaW50ZWdlcjoiKyBhbGxCeU15c2VsZjsNCi0JCXJldHVybiByZXRWYWx1ZTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKA0KLQkgICAgICAgIEBXZWJQYXJhbShuYW1lID0gIkNvbXBvc2l0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLnRlc3Quc2FtcGxlLmRvY2xpdGJhcmUiLCBtb2RlID0gTW9kZS5JTk9VVCwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLQkgICAgICAgIEhvbGRlcjxDb21wb3NpdGU+IGFsbEJ5TXlzZWxmKQ0KLQkgICAgICAgIHRocm93cyBGYXVsdEJlYW5XaXRoV3JhcHBlciwgU2ltcGxlRmF1bHR7DQotCQkNCi0JfQ0KLQkgICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9NRVRBLUlORi9kb2NsaXRiYXJlLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvTUVUQS1JTkYvZG9jbGl0YmFyZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRiYjMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9NRVRBLUlORi9kb2NsaXRiYXJlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkRvY2xpdEJhcmUiDQotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyINCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0JCQ0KLQkJPHhzZDplbGVtZW50IG5hbWU9IlN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlZ2VyIiB0eXBlPSJ4c2Q6aW50IiAvPgkJDQotDQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tcG9zaXRlIj4JCQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ibXlFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCTwveHNkOmVsZW1lbnQ+DQotDQotCQk8IS0tIGJhc2ljIGZhdWx0IHRlc3QsIHRoaXMgc2hvdWxkIGJlIG1hcHBlZCBpbnRvIG1lc3NhZ2UgcGFydA0KLQkJICAgICBvZiB0aGUgZ2VuZXJhdGVkIGZhdWx0QmVhbg0KLQkJICAtLT4NCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJNeUZhdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQ0KLQkJPCEtLSB3cmFwcGVyIGV4Y2VwdGlvbiBhbmQgcG9seW1vcnBoaWMgZmF1bHQgdGVzdA0KLQkJICAgICBUaGlzIGJlYW4gc2hvdWxkIGhhdmUgYW4gYXNzb2NpYXRlZCBleGNlcHRpb24NCi0JCSAgLS0+DQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlCYXNlRmF1bHRCZWFuIiB0eXBlPSJ0bnM6QmFzZUZhdWx0IiAvPgkJDQotDQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJhc2VGYXVsdCI+DQotCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcnJvcl9jb2RlIiB0eXBlPSJ4c2Q6aW50IiAvPgkJCQkJDQotCQkJPC94c2Q6c2VxdWVuY2U+DQotCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXh0ZW5kZWRGYXVsdCI+DQotCQkJPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpCYXNlRmF1bHQiPg0KLQkJCSAgICA8eHNkOnNlcXVlbmNlPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlcl9tZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW5vdGhlcl9lcnJvcl9jb2RlIiB0eXBlPSJ4c2Q6aW50IiAvPgkJCQkJDQotCQkJICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPg0KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJOb1BhcmFtIiAvPg0KLQ0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9TdHJpbmdJbiIgZWxlbWVudD0idG5zOlN0cmluZyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdPdXQiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvU3RyaW5nT3V0IiBlbGVtZW50PSJ0bnM6U3RyaW5nIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iU2luZ2xlUGFyYW0iPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlN0cmluZyIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iU2luZ2xlUGFyYW1JbnQiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOkludGVnZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJTaW5nbGVQYXJhbU90aGVyIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpDb21wb3NpdGUiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkNCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJTaW1wbGVGYXVsdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImRlc2NyaXB0aW9uIiBlbGVtZW50PSJ0bnM6TXlGYXVsdCIgLz4JDQotCTwvd3NkbDptZXNzYWdlPgkNCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJGYXVsdEJlYW5XaXRoV3JhcHBlciI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImRlc2NyaXB0aW9uIiBlbGVtZW50PSJ0bnM6TXlCYXNlRmF1bHRCZWFuIiAvPgkNCi0JPC93c2RsOm1lc3NhZ2U+CQ0KLQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRCYXJlUG9ydFR5cGUiPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5RW1wdHkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpOb1BhcmFtIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOlNpbmdsZVBhcmFtIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nSW4iIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nT3V0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5U2ltcGxlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6U2luZ2xlUGFyYW1JbnQiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpTaW5nbGVQYXJhbSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpTaW5nbGVQYXJhbU90aGVyIiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6U2luZ2xlUGFyYW1PdGhlciIgLz4NCi0JCQk8d3NkbDpmYXVsdCBtZXNzYWdlPSJ0bnM6U2ltcGxlRmF1bHQiIG5hbWU9InR3b1dheUZhdWx0Ii8+DQotCQkJPHdzZGw6ZmF1bHQgbWVzc2FnZT0idG5zOkZhdWx0QmVhbldpdGhXcmFwcGVyIiBuYW1lPSJ3cmFwcGVyRmF1bHQiLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkJDQotCTwvd3NkbDpwb3J0VHlwZT4NCi0JDQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iRG9jTGl0QmFyZSIgdHlwZT0idG5zOkRvY0xpdEJhcmVQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5RW1wdHkiPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotCQkgICAgPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQ0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5U2ltcGxlIj4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JDQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQkJPHdzZGw6ZmF1bHQgbmFtZT0idHdvV2F5RmF1bHQiPg0KLQkJCQk8c29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9InR3b1dheUZhdWx0IiAvPg0KLQkJCTwvd3NkbDpmYXVsdD4JCQkNCi0JCQk8d3NkbDpmYXVsdCBuYW1lPSJ3cmFwcGVyRmF1bHQiPg0KLQkJCQk8c29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9IndyYXBwZXJGYXVsdCIgLz4NCi0JCQk8L3dzZGw6ZmF1bHQ+CQkJCQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkNCi0JPC93c2RsOmJpbmRpbmc+DQotCQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkJhcmVEb2NMaXRTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkRvY0xpdEJhcmUiIG5hbWU9IkJhcmVEb2NMaXRQb3J0Ij4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQmFyZURvY0xpdFNlcnZpY2UiIC8+DQotCQk8L3dzZGw6cG9ydD4NCi0JPC93c2RsOnNlcnZpY2U+DQotCQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0JhcmVEb2NMaXRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0JhcmVEb2NMaXRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTc1OTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL3NlaS9CYXJlRG9jTGl0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkJhcmVEb2NMaXRTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcudGVzdC5zYW1wbGUuZG9jbGl0YmFyZSIsIHdzZGxMb2NhdGlvbiA9ICJwcm94eV9kb2NsaXQud3NkbCIpDQotcHVibGljIGNsYXNzIEJhcmVEb2NMaXRTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEJBUkVET0NMSVRTRVJWSUNFX1dTRExfTE9DQVRJT047DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvTUVUQS1JTkYvZG9jbGl0YmFyZS53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQkFSRURPQ0xJVFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmFyZURvY0xpdFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCYXJlRG9jTGl0U2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEJBUkVET0NMSVRTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIiwgIkJhcmVEb2NMaXRTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBEb2NMaXRCYXJlUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkJhcmVEb2NMaXRQb3J0IikNCi0gICAgcHVibGljIERvY0xpdEJhcmVQb3J0VHlwZSBnZXRCYXJlRG9jTGl0UG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRG9jTGl0QmFyZVBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciLCAiQmFyZURvY0xpdFBvcnQiKSwgRG9jTGl0QmFyZVBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0RvY0xpdEJhcmVQb3J0VHlwZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL3NlaS9Eb2NMaXRCYXJlUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMTczYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0RvY0xpdEJhcmVQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5kb2NsaXRiYXJlLkNvbXBvc2l0ZTsNCi0NCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRCYXJlUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIikNCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRG9jTGl0QmFyZVBvcnRUeXBlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAT25ld2F5DQotICAgIHB1YmxpYyB2b2lkIG9uZVdheUVtcHR5KCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBPbmV3YXkNCi0gICAgcHVibGljIHZvaWQgb25lV2F5KA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiU3RyaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImFsbEJ5TXlzZWxmIikNCi0gICAgICAgIFN0cmluZyBhbGxCeU15c2VsZik7DQotDQotICAgIA0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJTdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdGJhcmUuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiZWNob1N0cmluZ0luIikNCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiU3RyaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIsIHBhcnROYW1lID0gImVjaG9TdHJpbmdPdXQiKQ0KLSAgICAgICAgU3RyaW5nIGVjaG9TdHJpbmdJbik7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlN0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5U2ltcGxlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiSW50ZWdlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBpbnQgYWxsQnlNeXNlbGYpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAdGhyb3dzIEZhdWx0QmVhbldpdGhXcmFwcGVyDQotICAgICAqIEB0aHJvd3MgU2ltcGxlRmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiQ29tcG9zaXRlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kb2NsaXRiYXJlLnNhbXBsZS50ZXN0Lm9yZyIsIG1vZGUgPSBNb2RlLklOT1VULCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBIb2xkZXI8Q29tcG9zaXRlPiBhbGxCeU15c2VsZikNCi0gICAgICAgIHRocm93cyBGYXVsdEJlYW5XaXRoV3JhcHBlciwgU2ltcGxlRmF1bHQNCi0gICAgOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0ZhdWx0QmVhbldpdGhXcmFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmUvc2VpL0ZhdWx0QmVhbldpdGhXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkY2RlYWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL3NlaS9GYXVsdEJlYW5XaXRoV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZS5zZWk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5kb2NsaXRiYXJlLkJhc2VGYXVsdDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViRmF1bHQobmFtZSA9ICJNeUJhc2VGYXVsdEJlYW4iLCBmYXVsdEJlYW49IiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciKQ0KLXB1YmxpYyBjbGFzcyBGYXVsdEJlYW5XaXRoV3JhcHBlcg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIEJhc2VGYXVsdCBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEZhdWx0QmVhbldpdGhXcmFwcGVyKFN0cmluZyBtZXNzYWdlLCBCYXNlRmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBGYXVsdEJlYW5XaXRoV3JhcHBlcihTdHJpbmcgbWVzc2FnZSwgQmFzZUZhdWx0IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLnRlc3Quc2FtcGxlLmRvY2xpdGJhcmUuQmFzZUZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgQmFzZUZhdWx0IGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL3NlaS9TaW1wbGVGYXVsdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlL3NlaS9TaW1wbGVGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGMxOWM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZS9zZWkvU2ltcGxlRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmUuc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gIk15RmF1bHQiLCBmYXVsdEJlYW49IiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZS5zYW1wbGUudGVzdC5vcmciKQ0KLXB1YmxpYyBjbGFzcyBTaW1wbGVGYXVsdA0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFNpbXBsZUZhdWx0KFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICovDQotICAgIHB1YmxpYyBTaW1wbGVGYXVsdChTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogamF2YS5sYW5nLlN0cmluZw0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9Eb2NMaXRCYXJlTWluUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vRG9jTGl0QmFyZU1pblBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNhNjExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9Eb2NMaXRCYXJlTWluUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlbWluOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5kb2NsaXRiYXJlbWluLnNlaS5Eb2NMaXRCYXJlTWluUG9ydFR5cGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIFRlc3QgRG9jTGl0QmFyZU1pblBvcnQNCi0gKi8NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZW1pbi5zZWkuRG9jTGl0QmFyZU1pblBvcnRUeXBlIikNCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZU1pblBvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIERvY0xpdEJhcmVNaW5Qb3J0VHlwZSB7DQotDQotICAgIC8qIA0KLSAgICAgKiBlY2hvDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGFsbEJ5TXlzZWxmKSB7DQotICAgICAgICByZXR1cm4gYWxsQnlNeXNlbGY7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL01FVEEtSU5GL2RvY2xpdGJhcmVtaW4ud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9NRVRBLUlORi9kb2NsaXRiYXJlbWluLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYWNjYTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL01FVEEtSU5GL2RvY2xpdGJhcmVtaW4ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJEb2NsaXRCYXJlTWluIg0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyI+DQotCQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotCQkNCi0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciIC8+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJTaW5nbGVQYXJhbSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6U3RyaW5nIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jTGl0QmFyZU1pblBvcnRUeXBlIj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpTaW5nbGVQYXJhbSIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOlNpbmdsZVBhcmFtIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQkNCi0JPC93c2RsOnBvcnRUeXBlPg0KLQkNCi0JPHdzZGw6YmluZGluZyBuYW1lPSJEb2NMaXRCYXJlTWluIiB0eXBlPSJ0bnM6RG9jTGl0QmFyZU1pblBvcnRUeXBlIj4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkNCi0JCQ0KLQkNCi0JPC93c2RsOmJpbmRpbmc+DQotCQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkJhcmVEb2NMaXRNaW5TZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkRvY0xpdEJhcmVNaW4iIG5hbWU9IkJhcmVEb2NMaXRNaW5Qb3J0Ij4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvQmFyZURvY0xpdE1pblNlcnZpY2UiIC8+DQotCQk8L3dzZGw6cG9ydD4NCi0JPC93c2RsOnNlcnZpY2U+DQotCQ0KLTwvd3NkbDpkZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vc2VpL0JhcmVEb2NMaXRNaW5TZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2RvY2xpdGJhcmVtaW4vc2VpL0JhcmVEb2NMaXRNaW5TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTJmOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL3NlaS9CYXJlRG9jTGl0TWluU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZG9jbGl0YmFyZW1pbi5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkJhcmVEb2NMaXRNaW5TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcudGVzdC5zYW1wbGUuZG9jbGl0YmFyZW1pbiIsIHdzZGxMb2NhdGlvbiA9ICJkb2NsaXRiYXJlbWluLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBCYXJlRG9jTGl0TWluU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBCQVJFRE9DTElUTUlOU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL01FVEEtSU5GL2RvY2xpdGJhcmVtaW4ud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCX0NCi0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgCXVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEJBUkVET0NMSVRNSU5TRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJhcmVEb2NMaXRNaW5TZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmFyZURvY0xpdE1pblNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihCQVJFRE9DTElUTUlOU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9kb2NsaXRiYXJlbWluLnNhbXBsZS50ZXN0Lm9yZyIsICJCYXJlRG9jTGl0TWluU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRG9jTGl0QmFyZVBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJCYXJlRG9jTGl0TWluUG9ydCIpDQotICAgIHB1YmxpYyBEb2NMaXRCYXJlTWluUG9ydFR5cGUgZ2V0QmFyZURvY0xpdE1pblBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKERvY0xpdEJhcmVNaW5Qb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIiwgIkJhcmVEb2NMaXRNaW5Qb3J0IiksIERvY0xpdEJhcmVNaW5Qb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL3NlaS9Eb2NMaXRCYXJlTWluUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZG9jbGl0YmFyZW1pbi9zZWkvRG9jTGl0QmFyZU1pblBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxODUyZjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9kb2NsaXRiYXJlbWluL3NlaS9Eb2NMaXRCYXJlTWluUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmRvY2xpdGJhcmVtaW4uc2VpOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7DQotDQotDQotDQotLyoqDQotICogVGVzdHMgZG9jL2xpdCBiYXJlIG1pbmltYWwNCi0gKiAoTWluaW1hbCBpbmRpY2F0ZXMgdGhhdCBubyBPYmplY3RGYWN0b3J5IGlzIGF2YWlsYWJsZSB0byBkbyB0aGUgcGFyYW1ldGVyIG1hcnNoYWxsaW5nL2RlbWFyc2hhbGxpbmcpDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRCYXJlTWluUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2RvY2xpdGJhcmVtaW4uc2FtcGxlLnRlc3Qub3JnIikNCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRG9jTGl0QmFyZU1pblBvcnRUeXBlIHsNCi0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBlY2hvDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlN0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNobygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIlN0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZG9jbGl0YmFyZW1pbi5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBTdHJpbmcgYWxsQnlNeXNlbGYpOw0KLSAgICAgICAgDQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2YzQ4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHM7DQotDQotaW1wb3J0IG9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlRmF1bHQ7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLS8vIGFubm90YXRpb24gaXMgY29tbWVudGVkIGFzIHBhcnQgb2YgdGhlIHRlc3QgdG8gbWFrZSBzdXJlIGRlZmF1bHRzIGFyZSB1c2VkDQotLy9AV2ViRmF1bHQoZmF1bHRCZWFuPSJvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZUZhdWx0IiwgbmFtZSA9ICJGYXVsdHlXZWJTZXJ2aWNlRmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIpDQotcHVibGljIGNsYXNzIEZhdWx0eVdlYlNlcnZpY2VGYXVsdF9FeGNlcHRpb24NCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBGYXVsdHlXZWJTZXJ2aWNlRmF1bHQgZmF1bHRJbmZvOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqLw0KLSAgICBwdWJsaWMgRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRmF1bHR5V2ViU2VydmljZUZhdWx0IGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRmF1bHR5V2ViU2VydmljZUZhdWx0IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogZHVrZS5vcmcuRmF1bHR5V2ViU2VydmljZUZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgRmF1bHR5V2ViU2VydmljZUZhdWx0IGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4N2JjNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1AV2ViU2VydmljZShuYW1lID0gIkZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIikNCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzENCi0gICAgICogQHBhcmFtIGFyZzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBpbnQNCi0gICAgICogQHRocm93cyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImZhdWx0eVdlYlNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5mYXVsdHMuRmF1bHR5V2ViU2VydmljZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgaW50IGZhdWx0eVdlYlNlcnZpY2UoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiKQ0KLSAgICAgICAgaW50IGFyZzApDQotICAgICAgICB0aHJvd3MgRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbg0KLSAgICA7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIGFyZzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmF1bHR5V2ViU2VydmljZSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmF1bHR5V2ViU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZmF1bHR5V2ViU2VydmljZUFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIikNCi0gICAgICAgIGludCBhcmcwLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8RmF1bHR5V2ViU2VydmljZVJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhcmcwDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmF1bHR5V2ViU2VydmljZSIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmF1bHR5V2ViU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuZmF1bHRzLkZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxGYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2U+IGZhdWx0eVdlYlNlcnZpY2VBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIpDQotICAgICAgICBpbnQgYXJnMCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL0ZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2YmRkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHM7DQotDQotaW1wb3J0IG9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlRmF1bHQ7DQotaW1wb3J0IG9yZy50ZXN0LmZhdWx0cy5GYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iRmF1bHR5V2ViU2VydmljZVNlcnZpY2UiLA0KLQkJCWVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlIikNCi0JCQlwdWJsaWMgY2xhc3MgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlSW1wbCB7DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHMuRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlI2ZhdWx0eVdlYlNlcnZpY2UoaW50KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGludCBmYXVsdHlXZWJTZXJ2aWNlKGludCBhcmcwKSB0aHJvd3MgRmF1bHR5V2ViU2VydmljZUZhdWx0X0V4Y2VwdGlvbiB7DQotDQotICAgICAgICBGYXVsdHlXZWJTZXJ2aWNlRmF1bHQgYmVhbiA9IG5ldyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHQoKTsNCi0gICAgICAgIGJlYW4uc2V0RmF1bHRJbmZvKCJiZWFuIGN1c3RvbSBmYXVsdCBpbmZvIik7DQotICAgICAgICBiZWFuLnNldE1lc3NhZ2UoImJlYW4gY3VzdG9tIG1lc3NhZ2UiKTsNCi0NCi0gICAgICAgIHRocm93IG5ldyBGYXVsdHlXZWJTZXJ2aWNlRmF1bHRfRXhjZXB0aW9uKCJjdXN0b20gZXhjZXB0aW9uIiwgYmVhbik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBmYXVsdHlXZWJTZXJ2aWNlQXN5bmMoaW50IGFyZzAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSGFuZGxlcjxGYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2U+IGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlPEZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZT4gZmF1bHR5V2ViU2VydmljZUFzeW5jKGludCBhcmcwKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvRmF1bHR5V2ViU2VydmljZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzZDQ5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9GYXVsdHlXZWJTZXJ2aWNlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIiwgd3NkbExvY2F0aW9uID0gIkZhdWx0eVdlYlNlcnZpY2UxLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBGQVVMVFlXRUJTRVJWSUNFU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHMvTUVUQS1JTkYvRmF1bHR5V2ViU2VydmljZS53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRkFVTFRZV0VCU0VSVklDRVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmF1bHR5V2ViU2VydmljZVNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKEZBVUxUWVdFQlNFUlZJQ0VTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIsICJGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRmF1bHR5V2ViU2VydmljZVBvcnRUeXBlDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJGYXVsdHlXZWJTZXJ2aWNlUG9ydCIpDQotICAgIHB1YmxpYyBGYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUgZ2V0RmF1bHR5V2ViU2VydmljZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2ZhdWx0cyIsICJGYXVsdHlXZWJTZXJ2aWNlUG9ydCIpLCBGYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL01FVEEtSU5GL0ZhdWx0eVdlYlNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzL01FVEEtSU5GL0ZhdWx0eVdlYlNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhYmU5YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0cy9NRVRBLUlORi9GYXVsdHlXZWJTZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iRmF1bHR5V2ViU2VydmljZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9vcmcvdGVzdC9mYXVsdHMiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+DQotDQotDQotCTx0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvZmF1bHRzIj4NCi0JCQk8ZWxlbWVudCBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiPg0KLQkJCQk8Y29tcGxleFR5cGU+DQotCQkJCQk8c2VxdWVuY2U+DQotCQkJCQkJPGVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0iZmF1bHR5V2ViU2VydmljZSI+DQotCQkJCTxjb21wbGV4VHlwZT4NCi0JCQkJCTxzZXF1ZW5jZT4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQkJPGVsZW1lbnQgbmFtZT0iRmF1bHR5V2ViU2VydmljZUZhdWx0Ij4NCi0JCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQkJPHNlcXVlbmNlPg0KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImZhdWx0SW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC9zZXF1ZW5jZT4NCi0JCQkJPC9jb21wbGV4VHlwZT4NCi0JCQk8L2VsZW1lbnQ+DQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvdHlwZXM+DQotDQotCTxtZXNzYWdlIG5hbWU9ImZhdWx0eVdlYlNlcnZpY2UiPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmZhdWx0eVdlYlNlcnZpY2UiIC8+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iZmF1bHR5V2ViU2VydmljZVJlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmZhdWx0eVdlYlNlcnZpY2VSZXNwb25zZSIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlRmF1bHQiPg0KLQkJPHBhcnQgbmFtZT0iRmF1bHR5V2ViU2VydmljZUZhdWx0IiBlbGVtZW50PSJ0bnM6RmF1bHR5V2ViU2VydmljZUZhdWx0IiAvPg0KLQk8L21lc3NhZ2U+DQotDQotCTxwb3J0VHlwZSBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlUG9ydFR5cGUiPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJmYXVsdHlXZWJTZXJ2aWNlIj4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmZhdWx0eVdlYlNlcnZpY2UiIG5hbWU9ImFkZCIgLz4NCi0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpmYXVsdHlXZWJTZXJ2aWNlUmVzcG9uc2UiIG5hbWU9ImZhdWx0eVdTUmVzcG9uc2UiIC8+DQotCQkJPGZhdWx0IG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VGYXVsdCIgbWVzc2FnZT0idG5zOmZhdWx0eVdlYlNlcnZpY2VGYXVsdCIgLz4NCi0JCTwvb3BlcmF0aW9uPg0KLQk8L3BvcnRUeXBlPg0KLQk8YmluZGluZyBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlQmluZGluZyIgdHlwZT0idG5zOkZhdWx0eVdlYlNlcnZpY2VQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIg0KLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4NCi0JCTxvcGVyYXRpb24gbmFtZT0iZmF1bHR5V2ViU2VydmljZSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4NCi0JCQk8aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC9vdXRwdXQ+DQotCQkJPGZhdWx0IG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VGYXVsdCI+DQotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImZhdWx0eVdlYlNlcnZpY2VGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvZmF1bHQ+DQotCQk8L29wZXJhdGlvbj4NCi0JPC9iaW5kaW5nPg0KLQk8c2VydmljZSBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlU2VydmljZSI+DQotCQk8cG9ydCBuYW1lPSJGYXVsdHlXZWJTZXJ2aWNlUG9ydCIgYmluZGluZz0idG5zOkZhdWx0eVdlYlNlcnZpY2VCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvRmF1bHR5V2ViU2VydmljZS9GYXVsdHlXZWJTZXJ2aWNlSW1wbFNlcnZpY2UiIC8+DQotCQk8L3BvcnQ+DQotCTwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9CYXNlRmF1bHRfRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvQmFzZUZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI2OTI2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9CYXNlRmF1bHRfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5CYXNlRmF1bHQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiQmFzZUZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIpDQotcHVibGljIGNsYXNzIEJhc2VGYXVsdF9FeGNlcHRpb24NCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiBKYXZhIHR5cGUgdGhhdCBnb2VzIGFzIHNvYXBlbnY6RmF1bHQgZGV0YWlsIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBCYXNlRmF1bHQgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBCYXNlRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCYXNlRmF1bHQgZmF1bHRJbmZvKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBCYXNlRmF1bHRfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBCYXNlRmF1bHQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5CYXNlRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyBCYXNlRmF1bHQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvQ29tcGxleEZhdWx0X0V4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0NvbXBsZXhGYXVsdF9FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4OThlMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvQ29tcGxleEZhdWx0X0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuQ29tcGxleEZhdWx0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gIkNvbXBsZXhGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiKQ0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uDQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgQ29tcGxleEZhdWx0IGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQ29tcGxleEZhdWx0IGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQ29tcGxleEZhdWx0IGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuQ29tcGxleEZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29tcGxleEZhdWx0IGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0Rlcml2ZWRGYXVsdDFfRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxYmZkYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2U7DQotDQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkRlcml2ZWRGYXVsdDE7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiRGVyaXZlZEZhdWx0MSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiKQ0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIERlcml2ZWRGYXVsdDEgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRGVyaXZlZEZhdWx0MSBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBEZXJpdmVkRmF1bHQxIGZhdWx0SW5mbywgVGhyb3dhYmxlIGNhdXNlKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuRGVyaXZlZEZhdWx0MQ0KLSAgICAgKi8NCi0gICAgcHVibGljIERlcml2ZWRGYXVsdDEgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9EZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGIwMDllLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9EZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuRGVyaXZlZEZhdWx0MjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViRmF1bHQobmFtZSA9ICJEZXJpdmVkRmF1bHQyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIpDQotcHVibGljIGNsYXNzIERlcml2ZWRGYXVsdDJfRXhjZXB0aW9uDQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgRGVyaXZlZEZhdWx0MiBmYXVsdEluZm87DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIERlcml2ZWRGYXVsdDJfRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBEZXJpdmVkRmF1bHQyIGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIERlcml2ZWRGYXVsdDIgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQyDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVyaXZlZEZhdWx0MiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9FcXVhbEZhdWx0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRXF1YWxGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQ0MThkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9FcXVhbEZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQxOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gIkRlcml2ZWRGYXVsdDEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIikNCi1wdWJsaWMgY2xhc3MgRXF1YWxGYXVsdA0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIERlcml2ZWRGYXVsdDEgZmF1bHRJbmZvOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICovDQotICAgIHB1YmxpYyBFcXVhbEZhdWx0KFN0cmluZyBtZXNzYWdlLCBEZXJpdmVkRmF1bHQxIGZhdWx0SW5mbykgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSk7DQotICAgICAgICB0aGlzLmZhdWx0SW5mbyA9IGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgRXF1YWxGYXVsdChTdHJpbmcgbWVzc2FnZSwgRGVyaXZlZEZhdWx0MSBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZhdWx0IGJlYW46IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkRlcml2ZWRGYXVsdDENCi0gICAgICovDQotICAgIHB1YmxpYyBEZXJpdmVkRmF1bHQxIGdldEZhdWx0SW5mbygpIHsNCi0gICAgICAgIHJldHVybiBmYXVsdEluZm87DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9GYXVsdHNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWE2OTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmZhdWx0c3NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkZhdWx0c1NlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwgd3NkbExvY2F0aW9uID0gIkZhdWx0c1NlcnZpY2Uud3NkbCIpDQotcHVibGljIGNsYXNzIEZhdWx0c1NlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgRkFVTFRTU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL01FVEEtSU5GL0ZhdWx0c1NlcnZpY2Uud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEZBVUxUU1NFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRmF1bHRzU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhdWx0c1NlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihGQVVMVFNTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwgIkZhdWx0c1NlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIEZhdWx0c1NlcnZpY2VQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiRmF1bHRzUG9ydCIpDQotICAgIHB1YmxpYyBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUgZ2V0RmF1bHRzUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRmF1bHRzU2VydmljZVBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLCAiRmF1bHRzUG9ydCIpLCBGYXVsdHNTZXJ2aWNlUG9ydFR5cGUuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9GYXVsdHNTZXJ2aWNlUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9GYXVsdHNTZXJ2aWNlUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzY2VhNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvRmF1bHRzU2VydmljZVBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuRGVyaXZlZEZhdWx0MTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJGYXVsdHNTZXJ2aWNlUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIikNCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0c1NlcnZpY2VQb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHN5bWJvbA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGZsb2F0DQotICAgICAqIEB0aHJvd3MgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIERlcml2ZWRGYXVsdDJfRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgQmFzZUZhdWx0X0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgU2ltcGxlRmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFF1b3RlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5HZXRRdW90ZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImdldFF1b3RlUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5HZXRRdW90ZVJlc3VsdCIpDQotICAgIHB1YmxpYyBmbG9hdCBnZXRRdW90ZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInN5bWJvbCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHN5bWJvbCkNCi0gICAgICAgIHRocm93cyBCYXNlRmF1bHRfRXhjZXB0aW9uLCBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbiwgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24sIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24sIFNpbXBsZUZhdWx0DQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcGFyYW1DDQotICAgICAqIEBwYXJhbSBwYXJhbUINCi0gICAgICogQHBhcmFtIHBhcmFtQQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGludA0KLSAgICAgKiBAdGhyb3dzIEJhc2VGYXVsdF9FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBDb21wbGV4RmF1bHRfRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidGhyb3dGYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuVGhyb3dGYXVsdCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInRocm93RmF1bHRSZXR1cm4iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLlRocm93RmF1bHRSZXR1cm4iKQ0KLSAgICBwdWJsaWMgaW50IHRocm93RmF1bHQoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbUEiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIGludCBwYXJhbUEsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbUIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBwYXJhbUIsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbUMiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIGZsb2F0IHBhcmFtQykNCi0gICAgICAgIHRocm93cyBCYXNlRmF1bHRfRXhjZXB0aW9uLCBDb21wbGV4RmF1bHRfRXhjZXB0aW9uDQotICAgIDsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcGFyYW1aDQotICAgICAqIEBwYXJhbSBwYXJhbVkNCi0gICAgICogQHBhcmFtIHBhcmFtWA0KLSAgICAgKiBAcGFyYW0gZmF1bHQNCi0gICAgICogQHRocm93cyBEZXJpdmVkRmF1bHQxX0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIEVxdWFsRmF1bHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJyZXR1cm5GYXVsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcG9seW1vcnBoaWNmYXVsdHMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuUmV0dXJuRmF1bHQiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJyZXR1cm5GYXVsdFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5SZXR1cm5GYXVsdFJlc3BvbnNlIikNCi0gICAgcHVibGljIHZvaWQgcmV0dXJuRmF1bHQoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbVgiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIGludCBwYXJhbVgsDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbVkiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBwYXJhbVksDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbVoiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIGZsb2F0IHBhcmFtWiwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQ0KLSAgICAgICAgSG9sZGVyPERlcml2ZWRGYXVsdDE+IGZhdWx0KQ0KLSAgICAgICAgdGhyb3dzIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uLCBFcXVhbEZhdWx0DQotICAgIDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2VTb2FwQmluZGluZ0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9GYXVsdHNTZXJ2aWNlU29hcEJpbmRpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzZjZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ZhdWx0c1NlcnZpY2VTb2FwQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRPT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbnZlbG9wZUltcGw7DQotaW1wb3J0IG9yZy50ZXN0LnBvbHltb3JwaGljZmF1bHRzLkJhc2VGYXVsdDsNCi1pbXBvcnQgb3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuQ29tcGxleEZhdWx0Ow0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQxOw0KLWltcG9ydCBvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5EZXJpdmVkRmF1bHQyOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBGYXVsdEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNlcnZlciBzaWRlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgDQotICogRmF1bHRzU2VydmljZVBvcnRUeXBlLg0KLSAqLw0KLQ0KLUBXZWJTZXJ2aWNlICh0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIsDQotICAgICAgICAgICAgIHNlcnZpY2VOYW1lPSJGYXVsdHNTZXJ2aWNlIiwNCi0gICAgICAgICAgICAgcG9ydE5hbWU9IkZhdWx0c1BvcnQiLA0KLSAgICAgICAgICAgLy93c2RsTG9jYXRpb249IldFQi1JTkYvd3NkbC9GYXVsdHNTZXJ2aWNlLndzZGwiLA0KLSAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZS5GYXVsdHNTZXJ2aWNlUG9ydFR5cGUiKQ0KLQ0KLXB1YmxpYyBjbGFzcyBGYXVsdHNTZXJ2aWNlU29hcEJpbmRpbmdJbXBsIGltcGxlbWVudHMgRmF1bHRzU2VydmljZVBvcnRUeXBlIHsNCi0NCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdCA9IGZhbHNlOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRocm93cyB3cmFwcGVyIGV4Y2VwdGlvbnMgZm9yIGZhdWx0IGJlYW5zDQotICAgICAqLw0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0UXVvdGUoU3RyaW5nIHRpY2tlclN5bWJvbCkgdGhyb3dzIA0KLSAgICAgICAgQmFzZUZhdWx0X0V4Y2VwdGlvbiwgRGVyaXZlZEZhdWx0MV9FeGNlcHRpb24sIA0KLSAgICAgICAgRGVyaXZlZEZhdWx0Ml9FeGNlcHRpb24sIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24sIFNpbXBsZUZhdWx0IHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJcbkluIGdldFF1b3RlKCk6ICIgKyB0aWNrZXJTeW1ib2wgKyAiXG4iKTsNCi0gICAgICAgIGlmICh0aWNrZXJTeW1ib2wuZXF1YWxzKCJTTVBMIikpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgU2ltcGxlRmF1bHQoIlNlcnZlciB0aHJvd3MgU2ltcGxlRmF1bHQiLCAxMDApOw0KLSAgICAgICAgfSBlbHNlIGlmICh0aWNrZXJTeW1ib2wuZXF1YWxzKCJMRUdDIikpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbigiU2VydmVyIHRocm93cyBJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uIiwgdGlja2VyU3ltYm9sLCAxMjMpOw0KLSAgICAgICAgfSBlbHNlIGlmICh0aWNrZXJTeW1ib2wuZXF1YWxzKCJERjEiKSkgew0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDEgZGYgPSBuZXcgRGVyaXZlZEZhdWx0MSgpOw0KLSAgICAgICAgICAgIGRmLnNldEEoMTAwKTsNCi0gICAgICAgICAgICBkZi5zZXRCKHRpY2tlclN5bWJvbCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uKCJTZXJ2ZXIgdGhyb3dzIERlcml2ZWRGYXVsdDFfRXhjZXB0aW9uIiwgZGYpOw0KLSAgICAgICAgfSAgZWxzZSBpZiAodGlja2VyU3ltYm9sLmVxdWFscygiREYyIikpIHsNCi0gICAgICAgICAgICBEZXJpdmVkRmF1bHQyIGRmID0gbmV3IERlcml2ZWRGYXVsdDIoKTsNCi0gICAgICAgICAgICBkZi5zZXRBKDIwMCk7DQotICAgICAgICAgICAgZGYuc2V0Qih0aWNrZXJTeW1ib2wpOw0KLSAgICAgICAgICAgIGRmLnNldEMoODAuMEYpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbigiU2VydmVyIHRocm93cyBEZXJpdmVkRmF1bHQyX0V4Y2VwdGlvbiIsIGRmKTsNCi0gICAgICAgIH0gZWxzZSBpZiAodGlja2VyU3ltYm9sLmVxdWFscygiQkFTRSIpKSB7DQotICAgICAgICAgICAgQmFzZUZhdWx0IGJmID0gbmV3IEJhc2VGYXVsdCgpOw0KLSAgICAgICAgICAgIGJmLnNldEEoNDAwKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUZhdWx0X0V4Y2VwdGlvbigiU2VydmVyIHRocm93cyBCYXNlRmF1bHRfRXhjZXB0aW9uIiwgYmYpOw0KLSAgICAgICAgfSBlbHNlIGlmICh0aWNrZXJTeW1ib2wuZXF1YWxzKCJJTkpFQ1RJT04iKSkgew0KLSAgICAgICAgICAgaWYgKGN0eCAhPSBudWxsICYmIGluaXQpIHsNCi0gICAgICAgICAgICAgICAvLyBPbmx5IHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZSBjb250ZXh0IGlzIGluamVjdGVkIGFuZCANCi0gICAgICAgICAgICAgICAvLyB0aGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIGlzIGludm9rZWQNCi0gICAgICAgICAgICAgICByZXR1cm4gMTIzNDU2NzsgDQotICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMTAwOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUaHJvd3Mgd3JhcHBlciBleGNlcHRpb25zIGZvciBkZXJpdmVkIGZhdWx0IGJlYW5zDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IHRocm93RmF1bHQoaW50IGEsIFN0cmluZyBiLCBmbG9hdCBjKSB0aHJvd3MgDQotICAgICAgICBCYXNlRmF1bHRfRXhjZXB0aW9uLCBDb21wbGV4RmF1bHRfRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmKGIuZXF1YWxzKCJDb21wbGV4IikpIHsNCi0gICAgICAgICAgICBDb21wbGV4RmF1bHQgY2YgPSBuZXcgQ29tcGxleEZhdWx0KCk7DQotICAgICAgICAgICAgY2Yuc2V0QShhKTsgDQotICAgICAgICAgICAgY2Yuc2V0QihiKTsgDQotICAgICAgICAgICAgY2Yuc2V0QyhjKTsgDQotICAgICAgICAgICAgY2Yuc2V0RCg1KTsgDQotICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBsZXhGYXVsdF9FeGNlcHRpb24oIlNlcnZlciB0aHJvd3MgQ29tcGxleEZhdWx0X0V4Y2VwdGlvbiIsIGNmKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIkJhc2VGYXVsdCIpKSB7DQotICAgICAgICAgICAgQmFzZUZhdWx0IGJmID0gbmV3IEJhc2VGYXVsdCgpOw0KLSAgICAgICAgICAgIGJmLnNldEEoYSk7ICANCi0gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUZhdWx0X0V4Y2VwdGlvbigiU2VydmVyIHRocm93cyBCYXNlRmF1bHRfRXhjZXB0aW9uIiwgYmYpOw0KLSAgICAgICAgfSBlbHNlIGlmIChiLmVxdWFscygiRGVyaXZlZEZhdWx0MSIpKSB7DQotICAgICAgICAgICAgRGVyaXZlZEZhdWx0MSBkZiA9IG5ldyBEZXJpdmVkRmF1bHQxKCk7DQotICAgICAgICAgICAgZGYuc2V0QShhKTsgDQotICAgICAgICAgICAgZGYuc2V0QihiKTsgDQotICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VGYXVsdF9FeGNlcHRpb24oIlNlcnZlciB0aHJvd3MgQmFzZUZhdWx0X0V4Y2VwdGlvbiIsIGRmKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIkRlcml2ZWRGYXVsdDIiKSkgew0KLSAgICAgICAgICAgIERlcml2ZWRGYXVsdDIgZGYgPSBuZXcgRGVyaXZlZEZhdWx0MigpOw0KLSAgICAgICAgICAgIGRmLnNldEEoYSk7IA0KLSAgICAgICAgICAgIGRmLnNldEIoYik7IA0KLSAgICAgICAgICAgIGRmLnNldEMoYyk7IA0KLSAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRmF1bHRfRXhjZXB0aW9uKCJTZXJ2ZXIgdGhyb3dzIEJhc2VGYXVsdF9FeGNlcHRpb24iLCBkZik7DQotICAgICAgICB9IGVsc2UgaWYgKGIuZXF1YWxzKCJTT0FQRmF1bHRFeGNlcHRpb24iKSkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBjcmVhdGVTT0FQRmF1bHQoKTsNCi0gICAgICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0U3RyaW5nKCJoZWxsbyB3b3JsZCIpOw0KLSAgICAgICAgICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRBY3RvcigiYWN0b3IiKTsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBGYXVsdEV4Y2VwdGlvbihzb2FwRmF1bHQpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gc2UpIHt9DQotICAgICAgICB9IGVsc2UgaWYgKGIuZXF1YWxzKCJTT0FQRmF1bHRFeGNlcHRpb24yIikpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gY3JlYXRlU09BUEZhdWx0KCk7DQotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdFN0cmluZygiaGVsbG8gd29ybGQyIik7DQotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdEFjdG9yKCJhY3RvcjIiKTsNCi0gICAgICAgICAgICAgICAgRGV0YWlsIGRldGFpbCA9IHNvYXBGYXVsdC5hZGREZXRhaWwoKTsNCi0gICAgICAgICAgICAgICAgRGV0YWlsRW50cnkgZGUgPSBkZXRhaWwuYWRkRGV0YWlsRW50cnkobmV3IFFOYW1lKCJ1cm46Ly9zYW1wbGUiLCAiZGV0YWlsRW50cnkiKSk7DQotICAgICAgICAgICAgICAgIGRlLnNldFZhbHVlKCJUZXhhcyIpOw0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEZhdWx0RXhjZXB0aW9uKHNvYXBGYXVsdCk7DQotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkge30NCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIk5QRSIpKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQotICAgICAgICB9IGVsc2UgaWYgKGIuZXF1YWxzKCJOUEUyIikpIHsNCi0gICAgICAgICAgICAvLyBUaHJvdyBOUEUgd2l0aCBhIG1lc3NhZ2UNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk51bGwgUG9pbnRlciBFeGNlcHRpb24gb2NjdXJyZWQiKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYi5lcXVhbHMoIldTRSIpKSB7DQotICAgICAgICAgICAgV2ViU2VydmljZUV4Y2VwdGlvbiB3c2YgPSBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiVGhpcyBpcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24iKTsNCi0gICAgICAgICAgICB0aHJvdyB3c2Y7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhIGZhdWx0IGJlYW4gb3IgdGhyb3dzIGEgd3JhcHBlciBleGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJldHVybkZhdWx0KGludCBhLCBTdHJpbmcgYiwgZmxvYXQgYywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvbGRlcjxEZXJpdmVkRmF1bHQxPiBmYXVsdCkgdGhyb3dzIEVxdWFsRmF1bHQgew0KLQ0KLSAgICAgICAgRGVyaXZlZEZhdWx0MiBuZXdGYXVsdCA9IG5ldyBEZXJpdmVkRmF1bHQyKCk7DQotICAgICAgICBuZXdGYXVsdC5zZXRBKGZhdWx0LnZhbHVlLmdldEEoKSk7ICAgICAgICAgICAgDQotICAgICAgICBuZXdGYXVsdC5zZXRCKGZhdWx0LnZhbHVlLmdldEIoKSk7ICAgICAgICAgICAgDQotICAgICAgICBuZXdGYXVsdC5zZXRDKGMpOw0KLQ0KLSAgICAgICAgaWYoZmF1bHQudmFsdWUuZ2V0QigpLmVxdWFscygiZmF1bHQiKSkgew0KLSAgICAgICAgICAgIGZhdWx0LnZhbHVlID0gbmV3RmF1bHQ7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfSBlbHNlIGlmIChmYXVsdC52YWx1ZS5nZXRCKCkuZXF1YWxzKCJleGNlcHRpb24iKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBFcXVhbEZhdWx0KCJTZXJ2ZXIgdGhyb3dzIEVxdWFsRmF1bHQiLCBuZXdGYXVsdCk7ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBEZXJpdmVkRmF1bHQxIGRmID0gbmV3IERlcml2ZWRGYXVsdDEoKTsNCi0gICAgICAgIGRmLnNldEEoYSArIDEpOyANCi0gICAgICAgIGRmLnNldEIoIlNlcnZlcjogIiArIGIpOyANCi0gICAgICAgIHRocm93IG5ldyBFcXVhbEZhdWx0KCJTZXJ2ZXIgdGhyb3dzIEVxdWFsRmF1bHQiLCBkZik7DQotICAgIH0NCi0gICAgDQotICAgIFNPQVBGYXVsdCBjcmVhdGVTT0FQRmF1bHQoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7DQotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gbnVsbDsNCi0gICAgDQotICAgICAgICAvLyBSRVZJRVc6IFRoZSBmb2xsb3dpbmcgZG9lcyBub3Qgd29yayBkdWUgdG8gQXhpczIgU0FBSiBwcm9ibGVtcy4NCi0gICAgICAgIC8vDQotICAgICAgICAvLyBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAvLyBTT0FQRmF1bHQgc29hcEZhdWx0ID0gc29hcEZhY3RvcnkuY3JlYXRlRmF1bHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQWx0ZXJuYXRlIEFwcHJvYWNoDQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgYXNmID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7DQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCBheGlvbUVudiA9IChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCkgYXNmLmNyZWF0ZVNPQVBFbnZlbG9wZSgpOw0KLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIGVudiA9IG5ldyBTT0FQRW52ZWxvcGVJbXBsKGF4aW9tRW52KTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuYWRkQm9keSgpOw0KLSAgICAgICAgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOw0KLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdDsNCi0gICAgfQ0KLSAgICANCi0gICAgQFBvc3RDb25zdHJ1Y3QNCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpew0KLSAgICAgICAgLy9DYWxsZWQgYWZ0ZXIgcmVzb3VyY2UgaW5qZWN0aW9uIGFuZCBiZWZvcmUgYSBtZXRob2QgaXMgY2FsbGVkLg0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUG9zdENvbnN0cnVjdCB0byBJbml0aWFsaXplIik7DQotICAgICAgICB0aGlzLmluaXQgPSB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICBAUHJlRGVzdHJveQ0KLSAgICBwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotICAgICAgICAvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIEBSZXNvdXJjZQ0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q3R4KFdlYlNlcnZpY2VDb250ZXh0IGN0eCkgew0KLSAgICAgICAgLy8gVGhlIHNldHRlciBpcyBwcml2YXRlLiAgVGhpcyBzaG91bGQgbm90IG1hdHRlciBiZWNhdXNlIHRoZSBlbmdpbmUNCi0gICAgICAgIC8vIHNob3VsZCBzdGlsbCBtYWtlIGl0IGFjY2Vzc2libGUuDQotICAgICAgICB0aGlzLmN0eCA9IGN0eDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL0ludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzNzAxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2ZhdWx0c3NlcnZpY2UvSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZmF1bHRzc2VydmljZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGxlZ2FjeSBleGNlcHRpb24gIHdoaWNoIG1heSBiZSB0aGUgcmVzdWx0IG9mIGEgSkFYLVJQQyBlbWlzc2lvbi4NCi0gKiBUaGUgZmF1bHQgZG9lcyBub3QgaGF2ZSB0aGUgdmFsaWQgY29uc3RydWN0b3JzIGFuZCBsYWNrcyBhIGdldEZhdWx0SW5mbyBtZXRob2QuDQotICogSG93ZXZlciAoaW4gdGhpcyBjYXNlKSB0aGUgZmF1bHQgaGFzIGEgQFdlYkZhdWx0IHRoYXQgaWRlbnRpZmllcyB0aGUgZmF1bHRiZWFuDQotICovDQotQFdlYkZhdWx0KG5hbWUgPSAiSW52YWxpZFRpY2tlckZhdWx0IiwgDQotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIiwNCi0gICAgICAgIGZhdWx0QmVhbj0ib3JnLnRlc3QucG9seW1vcnBoaWNmYXVsdHMuSW52YWxpZFRpY2tlckZhdWx0RXhjZXB0aW9uQmVhbiIpDQotICAgICAgICANCi0gICAgICAgIC8vIGZhdWx0QmVhbiBpcyBpbnRlbnRpb25hbGx5IG5vdCBzcGVjaWZpZWQuIEl0IHNob3VsZCBkZWZhdWx0IHRvIA0KLSAgICAgICAgLy8gZmF1bHRCZWFuPSJvcmcudGVzdC5wb2x5bW9ycGhpY2ZhdWx0cy5JbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uQmVhbiINCi1wdWJsaWMgY2xhc3MgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbg0KLSAgICBleHRlbmRzIEV4Y2VwdGlvbg0KLXsNCi0NCi0gICAgLyoqDQotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwcml2YXRlIFN0cmluZyBsZWdhY3lEYXRhMTsNCi0gICAgcHJpdmF0ZSBpbnQgbGVnYWN5RGF0YTI7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIEludmFsaWRUaWNrZXJGYXVsdF9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBsZWdhY3lEYXRhMSwgaW50IGxlZ2FjeURhdGEyKSB7DQotICAgICAgICBzdXBlcihtZXNzYWdlKTsNCi0gICAgICAgIHRoaXMubGVnYWN5RGF0YTEgPSBsZWdhY3lEYXRhMTsNCi0gICAgICAgIHRoaXMubGVnYWN5RGF0YTIgPSBsZWdhY3lEYXRhMjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBjYXVzZQ0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxlZ2FjeURhdGExLCBpbnQgbGVnYWN5RGF0YTIsIFRocm93YWJsZSBjYXVzZSkgew0KLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLSAgICAgICAgdGhpcy5sZWdhY3lEYXRhMSA9IGxlZ2FjeURhdGExOw0KLSAgICAgICAgdGhpcy5sZWdhY3lEYXRhMiA9IGxlZ2FjeURhdGEyOw0KLSAgICB9DQotDQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExlZ2FjeURhdGExKCkgew0KLSAgICAgICAgcmV0dXJuIGxlZ2FjeURhdGExOw0KLSAgICB9DQotICAgIHB1YmxpYyBpbnQgZ2V0TGVnYWN5RGF0YTIoKSB7DQotICAgICAgICByZXR1cm4gbGVnYWN5RGF0YTI7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL01FVEEtSU5GL0ZhdWx0c1NlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9NRVRBLUlORi9GYXVsdHNTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NjlmMGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL01FVEEtSU5GL0ZhdWx0c1NlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyBuYW1lPSJGYXVsdHNTZXJ2aWNlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyINCi0gICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L3BvbHltb3JwaGljZmF1bHRzIg0KLSAgICAgeG1sbnM6dHM9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyINCi0gICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPg0KLQ0KLSAgPHR5cGVzPg0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyI+DQotICAgICAgICANCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iU2ltcGxlRmF1bHQiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0IiB0eXBlPSJ0czpJbnZhbGlkVGlja2VyRmF1bHRfRXhjZXB0aW9uQmVhbiIvPg0KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0X0V4Y2VwdGlvbkJlYW4iPg0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWdhY3lEYXRhMSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0gICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWdhY3lEYXRhMiIgdHlwZT0ieHNkOmludCIgLz4NCi0gICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IkJhc2VGYXVsdCIgdHlwZT0idHM6QmFzZUZhdWx0Ii8+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCYXNlRmF1bHQiPg0KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImEiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXJpdmVkRmF1bHQxIiB0eXBlPSJ0czpEZXJpdmVkRmF1bHQxIi8+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXJpdmVkRmF1bHQxIj4NCi0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRzOkJhc2VGYXVsdCI+DQotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJEZXJpdmVkRmF1bHQyIiB0eXBlPSJ0czpEZXJpdmVkRmF1bHQyIi8+DQotICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXJpdmVkRmF1bHQyIj4NCi0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRzOkRlcml2ZWRGYXVsdDEiPg0KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYyIgdHlwZT0ieHNkOmZsb2F0Ii8+DQotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50Pg0KLSAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJDb21wbGV4RmF1bHQiIHR5cGU9InRzOkNvbXBsZXhGYXVsdCIvPg0KLSAgICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcGxleEZhdWx0Ij4NCi0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRzOkRlcml2ZWRGYXVsdDIiPg0KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICA8L3hzZDpleHRlbnNpb24+DQotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4NCi0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0UXVvdGUiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0UXVvdGVSZXN1bHQiPg0KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4NCi0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aHJvd0ZhdWx0Ij4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtQSIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbUIiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1DIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4NCi0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aHJvd0ZhdWx0UmV0dXJuIj4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotDQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybkZhdWx0Ij4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtWCIgdHlwZT0ieHNkOmludCIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbVkiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1aIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InRzOkRlcml2ZWRGYXVsdDEiLz4NCi0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLQ0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5GYXVsdFJlc3BvbnNlIj4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhdWx0IiB0eXBlPSJ0czpEZXJpdmVkRmF1bHQxIi8+DQotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgPC94c2Q6ZWxlbWVudD4NCi0NCi0gICAgPC94c2Q6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IlNpbXBsZUZhdWx0Ij4NCi0gICAgPHBhcnQgbmFtZT0iZmF1bHRNZXNzYWdlIiBlbGVtZW50PSJ0czpTaW1wbGVGYXVsdCIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkludmFsaWRUaWNrZXJGYXVsdCI+DQotICAgIDxwYXJ0IG5hbWU9InRpY2tlckZhdWx0IiBlbGVtZW50PSJ0czpJbnZhbGlkVGlja2VyRmF1bHQiLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkJhc2VGYXVsdCI+DQotICAgIDxwYXJ0IG5hbWU9ImJhc2VGYXVsdCIgZWxlbWVudD0idHM6QmFzZUZhdWx0Ii8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJEZXJpdmVkRmF1bHQxIj4NCi0gICAgPHBhcnQgbmFtZT0idGhlRmF1bHQiIGVsZW1lbnQ9InRzOkRlcml2ZWRGYXVsdDEiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJEZXJpdmVkRmF1bHQyIj4NCi0gICAgPHBhcnQgbmFtZT0idGhlRmF1bHQiIGVsZW1lbnQ9InRzOkRlcml2ZWRGYXVsdDIiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJDb21wbGV4RmF1bHQiPg0KLSAgICA8cGFydCBuYW1lPSJjb21wbGV4RmF1bHQiIGVsZW1lbnQ9InRzOkNvbXBsZXhGYXVsdCIvPg0KLSAgPC9tZXNzYWdlPg0KLSANCi0gIDxtZXNzYWdlIG5hbWU9IkVxdWFsRmF1bHQiPg0KLSAgICA8cGFydCBuYW1lPSJ0aGVGYXVsdCIgZWxlbWVudD0idHM6RGVyaXZlZEZhdWx0MSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IkdldFF1b3RlUmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9InRpY2tlclN5bWJvbCIgZWxlbWVudD0idHM6Z2V0UXVvdGUiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJHZXRRdW90ZVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0iR2V0UXVvdGVSZXN1bHQiIGVsZW1lbnQ9InRzOmdldFF1b3RlUmVzdWx0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iVGhyb3dGYXVsdFJlcXVlc3QiPg0KLSAgICA8cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0czp0aHJvd0ZhdWx0IiAvPg0KLSAgPC9tZXNzYWdlPg0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iVGhyb3dGYXVsdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRzOnRocm93RmF1bHRSZXR1cm4iLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9IlJldHVybkZhdWx0UmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9InJlcSIgZWxlbWVudD0idHM6cmV0dXJuRmF1bHQiIC8+DQotICA8L21lc3NhZ2U+DQotDQotICA8bWVzc2FnZSBuYW1lPSJSZXR1cm5GYXVsdFJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0icmV0dXJuIiBlbGVtZW50PSJ0czpyZXR1cm5GYXVsdFJlc3BvbnNlIi8+DQotICA8L21lc3NhZ2U+DQotDQotICA8cG9ydFR5cGUgbmFtZT0iRmF1bHRzU2VydmljZVBvcnRUeXBlIj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpHZXRRdW90ZVJlcXVlc3QiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpHZXRRdW90ZVJlc3BvbnNlIi8+DQotICAgICAgPGZhdWx0IG1lc3NhZ2U9InRuczpJbnZhbGlkVGlja2VyRmF1bHQiIG5hbWU9IkludmFsaWRUaWNrZXJGYXVsdCIgLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOlNpbXBsZUZhdWx0IiBuYW1lPSJTaW1wbGVGYXVsdCIgLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkRlcml2ZWRGYXVsdDEiIG5hbWU9IkZhdWx0MSIvPg0KLSAgICAgIDxmYXVsdCBtZXNzYWdlPSJ0bnM6RGVyaXZlZEZhdWx0MiIgbmFtZT0iRmF1bHQyIi8+DQotICAgICAgPGZhdWx0IG1lc3NhZ2U9InRuczpCYXNlRmF1bHQiIG5hbWU9IkZhdWx0MyIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJ0aHJvd0ZhdWx0Ij4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOlRocm93RmF1bHRSZXF1ZXN0Ii8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6VGhyb3dGYXVsdFJlc3BvbnNlIi8+DQotICAgICAgPGZhdWx0IG1lc3NhZ2U9InRuczpCYXNlRmF1bHQiIG5hbWU9ImJhc2VGYXVsdCIgLz4NCi0gICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkNvbXBsZXhGYXVsdCIgbmFtZT0iY29tcGxleEZhdWx0IiAvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJyZXR1cm5GYXVsdCI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpSZXR1cm5GYXVsdFJlcXVlc3QiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpSZXR1cm5GYXVsdFJlc3BvbnNlIi8+DQotICAgICAgPGZhdWx0IG1lc3NhZ2U9InRuczpEZXJpdmVkRmF1bHQxIiBuYW1lPSJEZXJpdmVkRmF1bHQxIiAvPg0KLSAgICAgIDxmYXVsdCBtZXNzYWdlPSJ0bnM6RXF1YWxGYXVsdCIgbmFtZT0iRXF1YWxGYXVsdCIgLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRmF1bHRzU2VydmljZVNvYXBCaW5kaW5nIiB0eXBlPSJ0bnM6RmF1bHRzU2VydmljZVBvcnRUeXBlIj4NCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UXVvdGUiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iSW52YWxpZFRpY2tlckZhdWx0Ij4NCi0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkludmFsaWRUaWNrZXJGYXVsdCIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgICAgPGZhdWx0IG5hbWU9IkZhdWx0MSI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJGYXVsdDEiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgICAgPGZhdWx0IG5hbWU9IkZhdWx0MiI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJGYXVsdDIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgICAgPGZhdWx0IG5hbWU9IkZhdWx0MyI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJGYXVsdDMiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJ0aHJvd0ZhdWx0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImJhc2VGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJiYXNlRmF1bHQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgICAgPGZhdWx0IG5hbWU9ImNvbXBsZXhGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJjb21wbGV4RmF1bHQiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvZmF1bHQ+DQotICAgIDwvb3BlcmF0aW9uPg0KLQ0KLSAgICA8b3BlcmF0aW9uIG5hbWU9InJldHVybkZhdWx0Ij4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotICAgICAgPC9vdXRwdXQ+DQotICAgICAgPGZhdWx0IG5hbWU9IkRlcml2ZWRGYXVsdDEiPg0KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iRGVyaXZlZEZhdWx0MSIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9mYXVsdD4NCi0gICAgICA8ZmF1bHQgbmFtZT0iRXF1YWxGYXVsdCI+DQotICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJFcXVhbEZhdWx0IiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2ZhdWx0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0NCi0gIDxzZXJ2aWNlIG5hbWU9IkZhdWx0c1NlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJGYXVsdHNQb3J0IiBiaW5kaW5nPSJ0bnM6RmF1bHRzU2VydmljZVNvYXBCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvRmF1bHRzU2VydmljZS9GYXVsdHNTZXJ2aWNlU29hcEJpbmRpbmdJbXBsIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvZmF1bHRzc2VydmljZS9TaW1wbGVGYXVsdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL1NpbXBsZUZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNGE4YWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9mYXVsdHNzZXJ2aWNlL1NpbXBsZUZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5mYXVsdHNzZXJ2aWNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJGYXVsdChuYW1lID0gIlNpbXBsZUZhdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wb2x5bW9ycGhpY2ZhdWx0cyIpDQotcHVibGljIGNsYXNzIFNpbXBsZUZhdWx0DQotICAgIGV4dGVuZHMgRXhjZXB0aW9uDQotew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICovDQotICAgIHByaXZhdGUgaW50IGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvDQotICAgICAqLw0KLSAgICBwdWJsaWMgU2ltcGxlRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIGludCBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gY2F1c2UNCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbw0KLSAgICAgKi8NCi0gICAgcHVibGljIFNpbXBsZUZhdWx0KFN0cmluZyBtZXNzYWdlLCBpbnQgZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBpbnQNCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0RmF1bHRJbmZvKCkgew0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5YjVjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTsNCi0NCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJNdG9tU2FtcGxlIiwNCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20iLCANCi0gICAgICAgICAgICB3c2RsTG9jYXRpb24gPSAiTUVUQS1JTkYvSW1hZ2VEZXBvdC53c2RsIikNCi1wdWJsaWMgaW50ZXJmYWNlIE10b21TYW1wbGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpbnB1dA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0Lm10b20uSW1hZ2VEZXBvdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAib3V0cHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20udGVzdC5vcmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInNlbmRJbWFnZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0Lm10b20uU2VuZEltYWdlIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2VuZEltYWdlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5tdG9tLlNlbmRJbWFnZVJlc3BvbnNlIikNCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbS50ZXN0Lm9yZyIpDQotICAgICAgICBJbWFnZURlcG90IGlucHV0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gaW5wdXQNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3QNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIm91dHB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tLnRlc3Qub3JnIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kVGV4dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0Lm10b20uU2VuZFRleHQiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kVGV4dFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20udGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3QubXRvbS5TZW5kVGV4dFJlc3BvbnNlIikNCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZFRleHQoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tLnRlc3Qub3JnIikNCi0gICAgICAgIGJ5dGVbXSBpbnB1dCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTURlZmF1bHRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01EZWZhdWx0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjA3MmZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTURlZmF1bHRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotLyoqDQotICogRW5kcG9pbnQgd2l0aCBkZWZhdWx0IE1UT00gYW5ub3RhdGlvbg0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJNdG9tU2FtcGxlU2VydmljZSIsDQotCSAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbS5NdG9tU2FtcGxlIikNCi0vL0BCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi1ATVRPTQ0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlTVRPTURlZmF1bHRTZXJ2aWNlIGltcGxlbWVudHMgTXRvbVNhbXBsZSB7DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZShJbWFnZURlcG90IGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTXRvbVNhbXBsZU1UT01EZWZhdWx0U2VydmljZSBbbmV3IHNlbmRJbWFnZSByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YSA9IGlucHV0LmdldEltYWdlRGF0YSgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjb250ZW50VHlwZV0gIiArIGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICBJbWFnZURlcG90IG91dHB1dCA9IChuZXcgT2JqZWN0RmFjdG9yeSgpKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgZGF0YS5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgICAgICBvdXRwdXQuc2V0SW1hZ2VEYXRhKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRUZXh0KGJ5dGVbXSBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltuZXcgc2VuZFRleHQgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNldCB0aGUgbW9uaXRvciBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYW4NCi0gICAgICogYXR0YWNobWVudCBpcyB1bm1hcnNoYWxsZWQgb24gdGhlIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCkgew0KLSAgICAgICAgaWYgKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5pc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTURpc2FibGUyU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRGlzYWJsZTJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjZjN2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRGlzYWJsZTJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotLyoqDQotICogVGhlIGJpbmRpbmcgaW5kaWNhdGVzIE1UT00sIGJ1dCBATVRPTSBpbmRpY2F0ZXMgZW5hYmxlZD1mYWxzZQ0KLSAqIFRodXMgbm8gTVRPTS4NCi0gKi8NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UiLA0KLQkgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20uTXRvbVNhbXBsZSIpDQotQEJpbmRpbmdUeXBlKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKQ0KLUBNVE9NKGVuYWJsZWQ9ZmFsc2UpDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVNVE9NRGlzYWJsZTJTZXJ2aWNlIGltcGxlbWVudHMgTXRvbVNhbXBsZSB7DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZShJbWFnZURlcG90IGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTXRvbVNhbXBsZU1UT01EaXNhYmxlMlNlcnZpY2UgW25ldyBzZW5kSW1hZ2UgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGEgPSBpbnB1dC5nZXRJbWFnZURhdGEoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbY29udGVudFR5cGVdICIgKyBkYXRhLmdldENvbnRlbnRUeXBlKCkpOw0KLSAgICAgICAgSW1hZ2VEZXBvdCBvdXRwdXQgPSAobmV3IE9iamVjdEZhY3RvcnkoKSkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICByZXNldEF0dGFjaG1lbnRVbm1hcnNoYWxsaW5nTW9uaXRvcigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAoSW5wdXRTdHJlYW0pIGRhdGEuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIGltYWdlID0gSW1hZ2VJTy5yZWFkKHN0cmVhbSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwgInRlc3QuanBnIiwgaW1hZ2UpOw0KLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICAgICAgb3V0cHV0LnNldEltYWdlRGF0YShoYW5kbGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kVGV4dChieXRlW10gaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbbmV3IHNlbmRUZXh0IHJlcXVlc3QgcmVjZWl2ZWRdIik7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzZXQgdGhlIG1vbml0b3Igc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIGFuDQotICAgICAqIGF0dGFjaG1lbnQgaXMgdW5tYXJzaGFsbGVkIG9uIHRoZSByZXNwb25zZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCByZXNldEF0dGFjaG1lbnRVbm1hcnNoYWxsaW5nTW9uaXRvcigpIHsNCi0gICAgICAgIGlmIChKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuaXNNb25pdG9yaW5nKCkpIHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01EaXNhYmxlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NRGlzYWJsZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwZjM4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01EaXNhYmxlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTsNCi0NCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXIuRGF0YVNvdXJjZUltcGw7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uSW1hZ2VEZXBvdDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5PYmplY3RGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLmF3dC4qOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLQ0KLS8qKg0KLSAqIEVuZHBvaW50IHdpdGggTVRPTSBkaXNhYmxlZA0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJNdG9tU2FtcGxlU2VydmljZSIsDQotCSAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbS5NdG9tU2FtcGxlIikNCi0vL0BCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi1ATVRPTShlbmFibGVkPWZhbHNlKQ0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlTVRPTURpc2FibGVTZXJ2aWNlIGltcGxlbWVudHMgTXRvbVNhbXBsZSB7DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZShJbWFnZURlcG90IGlucHV0KSB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiTXRvbVNhbXBsZU1UT01EaXNhYmxlU2VydmljZSBbbmV3IHNlbmRJbWFnZSByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YSA9IGlucHV0LmdldEltYWdlRGF0YSgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjb250ZW50VHlwZV0gIiArIGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICBJbWFnZURlcG90IG91dHB1dCA9IChuZXcgT2JqZWN0RmFjdG9yeSgpKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgZGF0YS5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgICAgICBvdXRwdXQuc2V0SW1hZ2VEYXRhKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRUZXh0KGJ5dGVbXSBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltuZXcgc2VuZFRleHQgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNldCB0aGUgbW9uaXRvciBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYW4NCi0gICAgICogYXR0YWNobWVudCBpcyB1bm1hcnNoYWxsZWQgb24gdGhlIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCkgew0KLSAgICAgICAgaWYgKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5pc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTUVuYWJsZVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlTVRPTUVuYWJsZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiMjViZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01FbmFibGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotLyoqDQotICogRW5kcG9pbnQgd2l0aCBNVE9NIGVuYWJsZWQNCi0gKi8NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UiLA0KLQkgICAgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20uTXRvbVNhbXBsZSIpDQotLy9AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotQE1UT00oZW5hYmxlZD10cnVlKQ0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlTVRPTUVuYWJsZVNlcnZpY2UgaW1wbGVtZW50cyBNdG9tU2FtcGxlIHsNCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdG9tU2FtcGxlTVRPTUVuYWJsZVNlcnZpY2UgW25ldyBzZW5kSW1hZ2UgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGEgPSBpbnB1dC5nZXRJbWFnZURhdGEoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbY29udGVudFR5cGVdICIgKyBkYXRhLmdldENvbnRlbnRUeXBlKCkpOw0KLSAgICAgICAgSW1hZ2VEZXBvdCBvdXRwdXQgPSAobmV3IE9iamVjdEZhY3RvcnkoKSkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICByZXNldEF0dGFjaG1lbnRVbm1hcnNoYWxsaW5nTW9uaXRvcigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAoSW5wdXRTdHJlYW0pIGRhdGEuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIGltYWdlID0gSW1hZ2VJTy5yZWFkKHN0cmVhbSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwgInRlc3QuanBnIiwgaW1hZ2UpOw0KLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICAgICAgb3V0cHV0LnNldEltYWdlRGF0YShoYW5kbGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kVGV4dChieXRlW10gaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbbmV3IHNlbmRUZXh0IHJlcXVlc3QgcmVjZWl2ZWRdIik7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzZXQgdGhlIG1vbml0b3Igc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIGFuDQotICAgICAqIGF0dGFjaG1lbnQgaXMgdW5tYXJzaGFsbGVkIG9uIHRoZSByZXNwb25zZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCByZXNldEF0dGFjaG1lbnRVbm1hcnNoYWxsaW5nTW9uaXRvcigpIHsNCi0gICAgICAgIGlmIChKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuaXNNb25pdG9yaW5nKCkpIHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01UaHJlc2hvbGRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZU1UT01UaHJlc2hvbGRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjExNmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVNVE9NVGhyZXNob2xkU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTsNCi0NCi1pbXBvcnQgamF2YS5hd3QuSW1hZ2U7DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyLkRhdGFTb3VyY2VJbXBsOw0KLWltcG9ydCBvcmcudGVzdC5tdG9tLkltYWdlRGVwb3Q7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsNCi0vKioNCi0gKiBFbmRwb2ludCB3aXRoIE1UT00gZW5hYmxlZCBhbmQgVGhyZXNob2xkIHNldCB0byBzaXplIGJpZ2dlciB0aGFuIHRoZSBhdHRhY2htZW50IHNpemUuDQotICogVGhlIHJlc3BvbnNlIGZyb20gU2VydmVyIHNob3VsZCBoYXZlIGF0dGFjaG1lbnRzIGlubGluZWQuDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlIiwNCi0JICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tLk10b21TYW1wbGUiKQ0KLUBNVE9NKGVuYWJsZWQ9dHJ1ZSwgdGhyZXNob2xkPTk5MDAwKQ0KLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlTVRPTVRocmVzaG9sZFNlcnZpY2UgaW1wbGVtZW50cyBNdG9tU2FtcGxlIHsNCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdG9tU2FtcGxlTVRPTUVuYWJsZVNlcnZpY2UgW25ldyBzZW5kSW1hZ2UgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGEgPSBpbnB1dC5nZXRJbWFnZURhdGEoKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbY29udGVudFR5cGVdICIgKyBkYXRhLmdldENvbnRlbnRUeXBlKCkpOw0KLSAgICAgICAgSW1hZ2VEZXBvdCBvdXRwdXQgPSAobmV3IE9iamVjdEZhY3RvcnkoKSkuY3JlYXRlSW1hZ2VEZXBvdCgpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICByZXNldEF0dGFjaG1lbnRVbm1hcnNoYWxsaW5nTW9uaXRvcigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAoSW5wdXRTdHJlYW0pIGRhdGEuZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgIGltYWdlID0gSW1hZ2VJTy5yZWFkKHN0cmVhbSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRGF0YVNvdXJjZSBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwgInRlc3QuanBnIiwgaW1hZ2UpOw0KLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7DQotICAgICAgICAgICAgb3V0cHV0LnNldEltYWdlRGF0YShoYW5kbGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kVGV4dChieXRlW10gaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbbmV3IHNlbmRUZXh0IHJlcXVlc3QgcmVjZWl2ZWRdIik7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzZXQgdGhlIG1vbml0b3Igc28gdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIGFuDQotICAgICAqIGF0dGFjaG1lbnQgaXMgdW5tYXJzaGFsbGVkIG9uIHRoZSByZXNwb25zZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCByZXNldEF0dGFjaG1lbnRVbm1hcnNoYWxsaW5nTW9uaXRvcigpIHsNCi0gICAgICAgIGlmIChKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuaXNNb25pdG9yaW5nKCkpIHsNCi0gICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZVByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20vTXRvbVNhbXBsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTBiNmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIE10b21TYW1wbGVQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBpbnB1dFsiICsgaW5wdXQgKyAiXSIpOw0KLSAgICAgICAgcmV0dXJuIGlucHV0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbS9NdG9tU2FtcGxlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWRhNmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tL010b21TYW1wbGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90Ow0KLWltcG9ydCBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuYXd0Lio7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlIiwNCi0JICAgIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tLk10b21TYW1wbGUiKQ0KLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykNCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVNlcnZpY2UgaW1wbGVtZW50cyBNdG9tU2FtcGxlIHsNCi0NCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJNdG9tU2FtcGxlU2VydmljZSBbbmV3IHNlbmRJbWFnZSByZXF1ZXN0IHJlY2VpdmVkXSIpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YSA9IGlucHV0LmdldEltYWdlRGF0YSgpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltjb250ZW50VHlwZV0gIiArIGRhdGEuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICBJbWFnZURlcG90IG91dHB1dCA9IChuZXcgT2JqZWN0RmFjdG9yeSgpKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBJbWFnZSBpbWFnZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgZGF0YS5nZXRDb250ZW50KCk7DQotICAgICAgICAgICAgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoc3RyZWFtKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBEYXRhU291cmNlIGltYWdlRFMgPSBuZXcgRGF0YVNvdXJjZUltcGwoImltYWdlL2pwZWciLCAidGVzdC5qcGciLCBpbWFnZSk7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgaGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKTsNCi0gICAgICAgICAgICBvdXRwdXQuc2V0SW1hZ2VEYXRhKGhhbmRsZXIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRUZXh0KGJ5dGVbXSBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltuZXcgc2VuZFRleHQgcmVxdWVzdCByZWNlaXZlZF0iKTsNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXNldCB0aGUgbW9uaXRvciBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgYW4NCi0gICAgICogYXR0YWNobWVudCBpcyB1bm1hcnNoYWxsZWQgb24gdGhlIHJlc3BvbnNlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0QXR0YWNobWVudFVubWFyc2hhbGxpbmdNb25pdG9yKCkgew0KLSAgICAgICAgaWYgKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5pc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvTUVUQS1JTkYvc2FtcGxlbXRvbWpwZWcud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvTUVUQS1JTkYvc2FtcGxlbXRvbWpwZWcud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5OGYxMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL210b20xL01FVEEtSU5GL3NhbXBsZW10b21qcGVnLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IS0tDQotTmFtZTogc2FtcGxlbXRvbWpwZWcud3NkbA0KLS0tPg0KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiANCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgDQotICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAgDQotICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIA0KLSAgICB4bWxuczpzMD0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICAgIA0KLSAgPHR5cGVzPg0KLSAgIDx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiDQotICAgIHhtbG5zOnRucz0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciPg0KLSAgICANCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkltYWdlRGVwb3QiPg0KLSAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZXM9ImltYWdlL2pwZWciLz4NCi0gICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0ZXh0RGF0YSIgDQotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4bWltZTpiYXNlNjRCaW5hcnkiICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICB4bWltZTpjb250ZW50VHlwZT0idGV4dC94bWwiLz4NCi0gICAgICAgICAgDQotICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbnZva2UiPg0KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+DQotICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ib3V0cHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPg0KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIA0KLSAgIDwveHM6c2NoZW1hPg0KLSAgPC90eXBlcz4NCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVtcHR5TWVzc2FnZSIvPg0KLSAgPG1lc3NhZ2UgbmFtZT0ic2VuZEltYWdlIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6aW52b2tlIiAvPg0KLSAgPC9tZXNzYWdlPg0KLSAgPG1lc3NhZ2UgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpzZW5kSW1hZ2VSZXNwb25zZSIgLz4NCi0gIDwvbWVzc2FnZT4NCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJzZW5kSW1hZ2VJbnRlcmZhY2UiPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOnNlbmRJbWFnZSIgLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOnNlbmRJbWFnZVJlc3BvbnNlIiAvPg0KLSAgICA8L29wZXJhdGlvbj4gIA0KLSAgPC9wb3J0VHlwZT4NCi0NCi0gIDxiaW5kaW5nIG5hbWU9InNlbmRJbWFnZVNvYXAiIHR5cGU9InMwOnNlbmRJbWFnZUludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzZW5kSW1hZ2UiIHN0eWxlPSJkb2N1bWVudCIgLz4NCi0gICAgICA8aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotDQotICA8c2VydmljZSBuYW1lPSJTZW5kSW1hZ2VTZXJ2aWNlIj4NCi0gICAgPHBvcnQgbmFtZT0iU2VuZEltYWdlUG9ydCIgYmluZGluZz0iczA6c2VuZEltYWdlU29hcCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL01UT01CeXRlQXJyYXkvU2VuZEltYWdlU2VydmljZSIgLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9TZW5kSW1hZ2VJbnRlcmZhY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvU2VuZEltYWdlSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDU5YmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9TZW5kSW1hZ2VJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gInNlbmRJbWFnZUludGVyZmFjZSIsIA0KLS8vCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotCQkgICAgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0JLy8JICAgIHdzZGxMb2NhdGlvbiA9ICJNRVRBLUlORi9zYW1wbGVtdG9tanBlZy53c2RsIikNCi1wdWJsaWMgaW50ZXJmYWNlIFNlbmRJbWFnZUludGVyZmFjZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGlucHV0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubXRvbTEuSW1hZ2VEZXBvdA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAic2VuZEltYWdlIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIm91dHB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLkludm9rZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInNlbmRJbWFnZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL210b20xLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm10b20xLlNlbmRJbWFnZVJlc3BvbnNlIikNCi0gICAgcHVibGljIEltYWdlRGVwb3QgaW52b2tlKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vbXRvbTEuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbnB1dCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbXRvbTEvU2VuZEltYWdlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9TZW5kSW1hZ2VTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDc1YzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9tdG9tMS9TZW5kSW1hZ2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotDQotLyoqDQotICogQSBKQVhCIGltcGxlbWVudGF0aW9uDQotICoNCi0gKi8NCi0NCi1AV2ViU2VydmljZSgNCi0JCXRhcmdldE5hbWVzcGFjZSA9ICJ1cm46Ly9tdG9tMS5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsDQotCQlzZXJ2aWNlTmFtZSA9ICJTZW5kSW1hZ2VTZXJ2aWNlIiwNCi0JCXBvcnROYW1lID0gInNlbmRJbWFnZVBvcnQiLAkJDQotCQllbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5tdG9tMS5TZW5kSW1hZ2VJbnRlcmZhY2UiKQ0KLUBCaW5kaW5nVHlwZSAoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpCQ0KLXB1YmxpYyBjbGFzcyBTZW5kSW1hZ2VTZXJ2aWNlIGltcGxlbWVudHMgU2VuZEltYWdlSW50ZXJmYWNlIHsNCi0gDQotCQ0KLSAgICAvKioNCi0gICAgICogUmVxdWlyZWQgaW1wbCBtZXRob2QgZnJvbSBKQVhCIGludGVyZmFjZQ0KLSAgICAgKiANCi0gICAgICogLSBObyBNVE9NIHNldHRpbmcgdmlhIEBCaW5kaW5nVHlwZQ0KLSAgICAgKiAtIFVzaW5nIFBBWUxPQUQgbW9kZQ0KLSAgICAgKiAtIFNlbmRpbmcgYmFjayB0aGUgc2FtZSBvYmogaXQgcmVjZWl2ZWQNCi0gICAgICogLSBUaGUgSkFYQiBvYmplY3QgaXMgZm9yIGltYWdlL2pwZWcgTUlNRSB0eXBlDQotICAgICAqDQotICAgICAqIEBwYXJhbSBJbWFnZURlcG90IG9iag0KLSAgICAgKiBAcmV0dXJuIEltYWdlRGVwb3Qgb2JqDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBpbnZva2UoSW1hZ2VEZXBvdCByZXF1ZXN0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJTZW5kSW1hZ2VTZXJ2aWNlIik7DQotDQotICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsNCi0gICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJOdWxsIGlucHV0IHJlY2VpdmVkLiIpOw0KLSAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuZ2V0SW1hZ2VEYXRhKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIkltYWdlIGlzIG51bGwiKTsNCi0gICAgICAgfQ0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlNlbmRJbWFnZVNlcnZpY2U6IFJlcXVlc3QgcmVjZWl2ZWQuIik7DQotICAgICAgIHJldHVybiByZXF1ZXN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9Eb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvRG9jTGl0Tm9uV3JhcFBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjAxOGNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9Eb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5PYmplY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5PbmVXYXk7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLk9uZVdheVZvaWQ7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlJldHVyblR5cGU7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlR3b1dheTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5SG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkRvY0xpdE5vbldyYXBTZXJ2aWNlIiwNCi0JCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlIikNCi1wdWJsaWMgY2xhc3MgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIERvY0xpdE5vbldyYXBQb3J0VHlwZSB7DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBEb2NMaXROb25XcmFwUG9ydFR5cGVJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGUjb25lV2F5Vm9pZChvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5PbmVXYXlWb2lkKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgb25lV2F5Vm9pZChPbmVXYXlWb2lkIGFsbEJ5TXlzZWxmKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm5vbndyYXAuc2VpLkRvY0xpdE5vbldyYXBQb3J0VHlwZSNvbmVXYXkob3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuT25lV2F5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgb25lV2F5KE9uZVdheSBhbGxCeU15c2VsZikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQ0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGUjdHdvV2F5SG9sZGVyQXN5bmMob3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5SG9sZGVyKQ0KLQkgKi8NCi0JcHVibGljIFJlc3BvbnNlPFR3b1dheUhvbGRlcj4gdHdvV2F5SG9sZGVyQXN5bmMoVHdvV2F5SG9sZGVyIGFsbEJ5TXlzZWxmKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlI3R3b1dheUhvbGRlckFzeW5jKG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlR3b1dheUhvbGRlciwgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcikNCi0JICovDQotCXB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5SG9sZGVyQXN5bmMoVHdvV2F5SG9sZGVyIGFsbEJ5TXlzZWxmLA0KLQkJCUFzeW5jSGFuZGxlcjxUd29XYXlIb2xkZXI+IGFzeW5jSGFuZGxlcikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm5vbndyYXAuc2VpLkRvY0xpdE5vbldyYXBQb3J0VHlwZSN0d29XYXlIb2xkZXIoamF2YXgueG1sLndzLkhvbGRlcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHR3b1dheUhvbGRlcihIb2xkZXI8VHdvV2F5SG9sZGVyPiBhbGxCeU15c2VsZikgew0KLQkJLy9UT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlUd29XYXlIb2xkZXIgdHdoID0gYWxsQnlNeXNlbGYudmFsdWU7DQotCQl0d2guc2V0VHdvV2F5SG9sZGVySW50KDEwKTsNCi0JCXR3aC5zZXRUd29XYXlIb2xkZXJTdHIoIlJlc3BvbnNlIFN0cmluZyIpOw0KLQ0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5ub253cmFwLnNlaS5Eb2NMaXROb25XcmFwUG9ydFR5cGUjdHdvV2F5QXN5bmMob3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5KQ0KLQkgKi8NCi0JcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IHR3b1dheUFzeW5jKFR3b1dheSBhbGxCeU15c2VsZikgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLm5vbndyYXAuc2VpLkRvY0xpdE5vbldyYXBQb3J0VHlwZSN0d29XYXlBc3luYyhvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXksIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXIpDQotCSAqLw0KLQlwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUFzeW5jKFR3b1dheSBhbGxCeU15c2VsZiwNCi0JCQlBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWkuRG9jTGl0Tm9uV3JhcFBvcnRUeXBlI3R3b1dheShvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXkpDQotCSAqLw0KLQlwdWJsaWMgUmV0dXJuVHlwZSB0d29XYXkoVHdvV2F5IHR3b1dheSkgew0KLQkJDQotCQlTdHJpbmcgcmVxdWVzdFN0cmluZyA9IHR3b1dheS5nZXRUd293YXlTdHIoKTsNCi0JCU9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLQkJUmV0dXJuVHlwZSBydCA9IG9mLmNyZWF0ZVJldHVyblR5cGUoKTsNCi0JCXJ0LnNldFJldHVyblN0cigiQWNrbm93bGVkZ2VtZW50IDogUmVxdWVzdCBTdHJpbmcgcmVjZWl2ZWQgPSAiKyByZXF1ZXN0U3RyaW5nKTsNCi0JCQ0KLQkJcmV0dXJuIHJ0Ow0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9NRVRBLUlORi9kb2NsaXRfbm9ud3JhcC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL01FVEEtSU5GL2RvY2xpdF9ub253cmFwLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzlmMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL01FVEEtSU5GL2RvY2xpdF9ub253cmFwLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6dG5zPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb3h5Ig0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyI+DQotCQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZS8+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXkiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25ld2F5X3N0ciIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkJCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9pbnQiIHR5cGU9InhzZDppbnQiIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b3dheV9zdHIiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJCQ0KLQ0KLQkJCTwhLS0gZmluIG9wIGRlZmluaXRpb24gLS0+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9wIiB0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW1vdW50IiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2l0aGRyYXciPg0KLQkJCSAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0JCQkgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZW1vIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCSAgICAgIDwveHNkOnNlcXVlbmNlPg0KLQkJCSAgICA8L3hzZDpleHRlbnNpb24+DQotCQkJICA8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQkNCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcG9zaXQiPg0KLQkJCSAgPHhzZDpjb21wbGV4Q29udGVudD4NCi0JCQkgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0JCQkgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0dXMiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJICAgICAgPC94c2Q6c2VxdWVuY2U+DQotCQkJICAgICA8L3hzZDpleHRlbnNpb24+DQotCQkJICA8L3hzZDpjb21wbGV4Q29udGVudD4NCi0JCQk8L3hzZDpjb21wbGV4VHlwZT4JDQotDQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlWb2lkUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5Vm9pZCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JDQotCQ0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXROb25XcmFwUG9ydFR5cGUiPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlWb2lkUmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5UmVxdWVzdCIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5UmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdE5vbldyYXAiIHR5cGU9InRuczpEb2NMaXROb25XcmFwUG9ydFR5cGUiPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvb25lV2F5Vm9pZCIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5SG9sZGVyIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXkiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JDQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQ0KLQk8L3dzZGw6YmluZGluZz4NCi0JDQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iRG9jTGl0Tm9uV3JhcFNlcnZpY2UiPg0KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RG9jTGl0Tm9uV3JhcCIgbmFtZT0iRG9jTGl0Tm9uV3JhcFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXROb25XcmFwU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9zZWkvRG9jTGl0Tm9uV3JhcFBvcnRUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvc2VpL0RvY0xpdE5vbldyYXBQb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJkZTcwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9zZWkvRG9jTGl0Tm9uV3JhcFBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWk7DQotDQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLk9uZVdheTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuT25lV2F5Vm9pZDsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuUmV0dXJuVHlwZTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5Ow0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUubm9ud3JhcC5Ud29XYXlIb2xkZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdE5vbldyYXBQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciKQ0KLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpDQotcHVibGljIGludGVyZmFjZSBEb2NMaXROb25XcmFwUG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBPbmV3YXkNCi0gICAgcHVibGljIHZvaWQgb25lV2F5Vm9pZCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9uZVdheVZvaWQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgT25lV2F5Vm9pZCBhbGxCeU15c2VsZik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQE9uZXdheQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvbmVXYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgT25lV2F5IGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3Quc2FtcGxlLm5vbndyYXAuVHdvV2F5SG9sZGVyPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsIGFjdGlvbiA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgcHVibGljIFJlc3BvbnNlPFR3b1dheUhvbGRlcj4gdHdvV2F5SG9sZGVyQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgVHdvV2F5SG9sZGVyIGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCBhY3Rpb24gPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5SG9sZGVyQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgVHdvV2F5SG9sZGVyIGFsbEJ5TXlzZWxmLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAiYXN5bmNIYW5kbGVyIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxUd29XYXlIb2xkZXI+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIG1vZGUgPSBNb2RlLklOT1VULCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBIb2xkZXI8VHdvV2F5SG9sZGVyPiBhbGxCeU15c2VsZik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFsbEJ5TXlzZWxmDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlJldHVyblR5cGU+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5IiwgYWN0aW9uID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8UmV0dXJuVHlwZT4gdHdvV2F5QXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgVHdvV2F5IGFsbEJ5TXlzZWxmKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWxsQnlNeXNlbGYNCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4NCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXkiLCBhY3Rpb24gPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5QXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgcGFydE5hbWUgPSAiYWxsQnlNeXNlbGYiKQ0KLSAgICAgICAgVHdvV2F5IGFsbEJ5TXlzZWxmLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAiYXN5bmNIYW5kbGVyIikNCi0gICAgICAgIEFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhbGxCeU15c2VsZg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0LnNhbXBsZS5ub253cmFwLlJldHVyblR5cGUNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgIHB1YmxpYyBSZXR1cm5UeXBlIHR3b1dheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJhbGxCeU15c2VsZiIpDQotICAgICAgICBUd29XYXkgYWxsQnlNeXNlbGYpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvc2VpL0RvY0xpdE5vbldyYXBTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL25vbndyYXAvc2VpL0RvY0xpdE5vbldyYXBTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZmY0OWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9ub253cmFwL3NlaS9Eb2NMaXROb25XcmFwU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUubm9ud3JhcC5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkRvY0xpdE5vbldyYXBTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub253cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJkb2NsaXRfbm9ud3JhcC53c2RsIikNCi1wdWJsaWMgY2xhc3MgRG9jTGl0Tm9uV3JhcFNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgRE9DTElUTk9OV1JBUFNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvbm9ud3JhcC9NRVRBLUlORi9kb2NsaXRfbm9ud3JhcC53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRE9DTElUTk9OV1JBUFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRG9jTGl0Tm9uV3JhcFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb2NMaXROb25XcmFwU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKERPQ0xJVE5PTldSQVBTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL25vbndyYXAuc2FtcGxlLnRlc3Qub3JnIiwgIkRvY0xpdE5vbldyYXBTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBEb2NMaXROb25XcmFwUG9ydFR5cGUNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkRvY0xpdE5vbldyYXBQb3J0IikNCi0gICAgcHVibGljIERvY0xpdE5vbldyYXBQb3J0VHlwZSBnZXREb2NMaXROb25XcmFwUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoRG9jTGl0Tm9uV3JhcFBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vbm9ud3JhcC5zYW1wbGUudGVzdC5vcmciLCAiRG9jTGl0Tm9uV3JhcFBvcnQiKSwgRG9jTGl0Tm9uV3JhcFBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0NhbGxiYWNrSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL2NvbW1vbi9DYWxsYmFja0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1NjgxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0NhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5jb21tb247DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEdlbmVyaWMgQXN5bmMgY2FsbGJhY2sgaGFuZGxlci4gVGhlIGdldCBtZXRob2QgZW11bGF0ZXMgUmVzcG9uc2UuZ2V0IGJ5DQotICogdGhyb3duaW5nIGFuIGV4Y2VwdGlvbiBpZiBvbmUgaXMgcmVjZWl2ZWQuIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0hhbmRsZXI8VD4gaW1wbGVtZW50cyBBc3luY0hhbmRsZXI8VD4gew0KLQ0KLSAgICBwcml2YXRlIFQgcmVzcG9uc2UgPSBudWxsOw0KLSAgICBwcml2YXRlIFJlc3BvbnNlPFQ+IHJlc3AgPSBudWxsOw0KLSAgICANCi0gICAgcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsNCi0NCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzcG9uc2UoUmVzcG9uc2U8VD4gcmVzcG9uc2UpIHsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVCByZXMgPSAoVCkgcmVzcG9uc2UuZ2V0KCk7DQotICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlczsNCi0gICAgICAgICAgICB0aGlzLnJlc3AgPSByZXNwb25zZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhpcy5leGNlcHRpb24gPSBlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNwb25zZTxUPiBnZXRSZXNwb25zZSgpew0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFQgZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOw0KLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2U7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEF1eGlsaWFyeSBtZXRob2QgdXNlZCB0byB3YWl0IGZvciBhIG1vbml0b3IgZm9yIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZQ0KLSAgICAgKiBiZWZvcmUgdGltaW5nIG91dA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1vbml0b3INCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHdhaXRCbG9ja2luZyhGdXR1cmU8Pz4gbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyB3YWl0IGZvciByZXF1ZXN0IHRvIGNvbXBsZXRlDQotICAgICAgICBpbnQgc2VjID0gQ29uc3RhbnRzLkNMSUVOVF9NQVhfU0xFRVBfU0VDOw0KLSAgICAgICAgd2hpbGUgKCFtb25pdG9yLmlzRG9uZSgpKSB7DQotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOw0KLSAgICAgICAgICAgIHNlYy0tOw0KLSAgICAgICAgICAgIGlmIChzZWMgPD0gMCkgYnJlYWs7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc2VjIDw9IDApDQotICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlN0b3BwZWQgd2FpdGluZyBmb3IgQXN5bmMgcmVzcG9uc2UgYWZ0ZXIgIg0KLSAgICAgICAgICAgICAgICAgICAgKyBDb25zdGFudHMuQ0xJRU5UX01BWF9TTEVFUF9TRUMgKyAiIHNlYyIpOw0KLSAgICB9ICAgDQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0NvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL2NvbW1vbi9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMTMwZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5jb21tb247DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBob2xkcyBjb25zdGFudCBzdHJpbmdzIHN1Y2ggYXMgZW5kcG9pbnQgYWRkcmVzc2VzIGFuZCBjb21tb24NCi0gKiBjb252ZXJzaW9uIG1ldGhvZHMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsNCi0NCi0gICAgLy8gc2VydmVyIGhvc3ROYW1lIGFuZCBXQyBwb3J0DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVIgPSAibG9jYWxob3N0OjYwNjAiOw0KLSAgICANCi0gICAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vY29tbW9uLndzZnZ0LmFzeW5jLmpheHdzIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9OQU1FU1BBQ0UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfTkFNRVNQQUNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU0VSVklDRV9RTkFNRSA9IG5ldyBRTmFtZShXU0RMX05BTUVTUEFDRSwNCi0gICAgICAgICAgICAiQXN5bmNTZXJ2aWNlIik7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUE9SVF9RTkFNRSA9IG5ldyBRTmFtZShXU0RMX05BTUVTUEFDRSwNCi0gICAgICAgICAgICAiQXN5bmNQb3J0Iik7DQotDQotICAgIC8vIEVuZHBvaW50IGFkZHJlc3Nlcw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0VORFBPSU5UID0gImh0dHA6Ly8iICsgU0VSVkVSDQotICAgICAgICAgICAgKyAiL2F4aXMyL3NlcnZpY2VzLyI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ0xJVFdSX0FTWU5DX0VORFBPSU5UID0gQkFTRV9FTkRQT0lOVA0KLSAgICAgICAgICAgICsgIkFzeW5jU2VydmljZSI7IC8vKyAiQXN5bmNEb2NMaXRXcmFwcGVkU2VydmljZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ0xJVF9BU1lOQ19FTkRQT0lOVCA9IEJBU0VfRU5EUE9JTlQNCi0gICAgICAgICAgICArICJBc3luY1NlcnZpY2UiOyAvLysgIkFzeW5jRG9jTGl0U2VydmljZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQ0xJVF9BU1lOQ19FTkRQT0lOVCA9IEJBU0VfRU5EUE9JTlQNCi0gICAgICAgICAgICArICJBc3luY1NlcnZpY2UiOyAvLysgIkFzeW5jUnBjTGl0U2VydmljZSI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIRV9TVFJJTkcgPSAiVGhpcyBJcyBKdXN0IEEgVGVzdCI7DQotDQotICAgIC8vIGhvdyBsb25nIHRoZSBzZXJ2ZXIgc2hvdWxkIHNlZXAgZm9yIGJlZm9yZSByZXR1cm5pbmcgYSByZXNwb25zZQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgU0VSVkVSX1NMRUVQX1NFQyA9IDEyMDsNCi0NCi0gICAgLy8gbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGZvciBhc3luYyBvcGVyYXRpb24gdG8gY29tcGxldGUNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01BWF9TTEVFUF9TRUMgPSAxMjA7DQotDQotICAgIC8vIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYXN5bmMgb3BlcmF0aW9uIHRvIGNvbXBsZXRlDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9TSE9SVF9TTEVFUF9TRUMgPSAxNTsNCi0NCi0gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaWVudCBzaG91bGQgY2hlY2sgdG8gc2VlIGlmDQotICAgIC8vIHRoZSBzZXJ2ZXIgcmVjZWl2ZWQgc2xlZXAgcmVxdWVzdA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfSVNBU0xFRVBfQ0hFQ0sgPSAxMDsNCi0NCi0gICAgLy8gbnVtYmVyIG9mIHNlYyB0byBzbGVlcCBpbiBiZXR3ZWVuIGlzQXNsZWVwIGNoZWNrcw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTEVFUF9JU0FTTEVFUF9TRUMgPSAxOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0tpbGxlclRocmVhZC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL2NvbW1vbi9LaWxsZXJUaHJlYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmMzIzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL0tpbGxlclRocmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5jb21tb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7DQotDQotcHVibGljIGNsYXNzIEtpbGxlclRocmVhZCBleHRlbmRzIFRocmVhZHsNCi0NCi0gICAgcHJpdmF0ZSBTZXJ2aWNlIHN2YyA9IG51bGw7DQotICAgIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNLaWxsZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGludGVycnVwdCA9IGZhbHNlOw0KLSAgICANCi0gICAgcHJpdmF0ZSBpbnQgd2FpdFVudGlsS2lsbGluZ1NlYyA9IDMwOw0KLSAgICANCi0gICAgcHVibGljIEtpbGxlclRocmVhZChTZXJ2aWNlIHNlcnZpY2UsIGludCBjbGllbnRfbWF4X3NsZWVwX3NlYykgew0KLSAgICAgICAgdGhpcy53YWl0VW50aWxLaWxsaW5nU2VjID0gY2xpZW50X21heF9zbGVlcF9zZWM7DQotICAgICAgICB0aGlzLnN2YyA9IHNlcnZpY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcnVuKCl7DQotICAgICAgICBFeGVjdXRvciBlID0gc3ZjLmdldEV4ZWN1dG9yKCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiS2lsbGVyVGhyZWFkOiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQotICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXMgPSAoRXhlY3V0b3JTZXJ2aWNlKSBlOw0KLSAgICAgICAgDQotDQotICAgICAgICBpbnQgaSA9IHdhaXRVbnRpbEtpbGxpbmdTZWM7DQotICAgICAgICB3aGlsZSAoaSA+IDAgJiYgIWludGVycnVwdCl7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiS2lsbGVyVGhyZWFkOiBnb2luZyB0byBzbGVlcCIpOw0KLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7DQotICAgICAgICAgICAgICAgIGkgLS07DQotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIktpbGxlclRocmVhZDogaW50ZXJydXB0ZWQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIGZvcmNlIGV4ZWN1dG9yIHRvIHN0b3ANCi0gICAgICAgIGlmICghaW50ZXJydXB0KXsNCi0gICAgICAgICAgICBpc0tpbGxlZCA9IHRydWU7DQotICAgICAgICAgICAgZXMuc2h1dGRvd25Ob3coKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0tpbGxlZCgpIHsNCi0gICAgICAgIHJldHVybiBpc0tpbGxlZDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgYWJvcnQoKXsNCi0gICAgICAgIHRoaXMuaW50ZXJydXB0ID0gdHJ1ZTsNCi0gICAgICAgIHRoaXMuaW50ZXJydXB0KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL2NvbW1vbi9QYXVzYWJsZUV4ZWN1dG9yLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL1BhdXNhYmxlRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhOTMzMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvY29tbW9uL1BhdXNhYmxlRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnBhcmFsbGVsYXN5bmMuY29tbW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsNCi0NCi0vKioNCi0gKiBBIGN1c3RvbSBleGVjdXRvciB0aGF0IGNhbiBiZSBwYXVzZWQgZm9yIHRlc3Rpbmcgb2YgZXhjZXB0aW9ucyB0aGF0IG9jY3VyDQotICogYmVmb3JlIGFuIGl0ZW0gaXMgZXhlY3V0ZWQuIFRoaXMgZXhlY3V0b3IgcHJvdmlkZXMgYWJzb2x1ZSBjb250cm9sIG92ZXIgaXRzDQotICogdGhyZWFkIHNpemUgdmlhIHNpemUgcGFyYW1ldGVyIGluIHRoZSBjb25zdHJ1Y3Rvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXVzYWJsZUV4ZWN1dG9yIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yIHsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF1c2VkOw0KLQ0KLSAgICBwcml2YXRlIFJlZW50cmFudExvY2sgcGF1c2VMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsNCi0NCi0gICAgcHJpdmF0ZSBDb25kaXRpb24gdW5wYXVzZWQgPSBwYXVzZUxvY2submV3Q29uZGl0aW9uKCk7DQotDQotICAgIHB1YmxpYyBQYXVzYWJsZUV4ZWN1dG9yKGludCBzaXplKSB7DQotICAgICAgICBzdXBlcihzaXplLCBzaXplLCAxLCBUaW1lVW5pdC5TRUNPTkRTLA0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPihzaXplKSk7DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCB2b2lkIGJlZm9yZUV4ZWN1dGUoVGhyZWFkIHQsIFJ1bm5hYmxlIHIpIHsNCi0gICAgICAgIHN1cGVyLmJlZm9yZUV4ZWN1dGUodCwgcik7DQotICAgICAgICBwYXVzZUxvY2subG9jaygpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB3aGlsZSAoaXNQYXVzZWQpDQotICAgICAgICAgICAgICAgIHVucGF1c2VkLmF3YWl0KCk7DQotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KLSAgICAgICAgICAgIHQuaW50ZXJydXB0KCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIHBhdXNlTG9jay51bmxvY2soKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsNCi0gICAgICAgIHBhdXNlTG9jay5sb2NrKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlzUGF1c2VkID0gdHJ1ZTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgcGF1c2VMb2NrLnVubG9jaygpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3VtZSgpIHsNCi0gICAgICAgIHBhdXNlTG9jay5sb2NrKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlzUGF1c2VkID0gZmFsc2U7DQotICAgICAgICAgICAgdW5wYXVzZWQuc2lnbmFsQWxsKCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIHBhdXNlTG9jay51bmxvY2soKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0FzeW5jUG9ydC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9Bc3luY1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkMzM2My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0FzeW5jUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnBhcmFsbGVsYXN5bmMuc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkFub3RoZXJSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luY1Jlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkludm9rZUFzeW5jUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSXNBc2xlZXBSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5QaW5nUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuU2xlZXBSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5XYWtlVXBSZXNwb25zZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjAuMS1qYXh3cy1yZWFyY2gtMjAwNS1uaWdodGx5XzIwMDYtMDgtMTZfMDItMzItMDMtTTENCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiQXN5bmNQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIikNCi1wdWJsaWMgaW50ZXJmYWNlIEFzeW5jUG9ydCB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9waW5nIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAicGluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlBpbmciKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJwaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5QaW5nUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHBpbmcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3QucGFyYWxsZWxhc3luYy5TbGVlcFJlc3BvbnNlPg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInNsZWVwIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3NsZWVwIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8U2xlZXBSZXNwb25zZT4gc2xlZXBBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0Pg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInNsZWVwIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3NsZWVwIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IHNsZWVwQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJtZXNzYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgbWVzc2FnZSwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPFNsZWVwUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3NsZWVwIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJzbGVlcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAic2xlZXBSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBzbGVlcCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm1lc3NhZ2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IFdlYlBhcmFtLk1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiBtZXNzYWdlKTsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2lzQXNsZWVwIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaXNBc2xlZXAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5Jc0FzbGVlcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImlzQXNsZWVwUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5Jc0FzbGVlcFJlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBpc0FzbGVlcCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3dha2VVcCIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIndha2VVcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLldha2VVcCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIndha2VVcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuV2FrZVVwUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHdha2VVcCgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkludm9rZUFzeW5jUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlQXN5bmMiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaW52b2tlQXN5bmMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxJbnZva2VBc3luY1Jlc3BvbnNlPiBpbnZva2VBc3luY0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlQXN5bmMiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvaW52b2tlQXN5bmMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2VBc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuSW52b2tlQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmNBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8SW52b2tlQXN5bmNSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2ludm9rZUFzeW5jIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlQXN5bmMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5JbnZva2VBc3luYyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImludm9rZUFzeW5jUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucGFyYWxsZWxhc3luYy5JbnZva2VBc3luY1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBpbnZva2VBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0KTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkN1c3RvbUFzeW5jUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiY3VzdG9tQXN5bmMiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvY3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxDdXN0b21Bc3luY1Jlc3BvbnNlPiByZW1hcHBlZEFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiY3VzdG9tQXN5bmMiLCBhY3Rpb24gPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvY3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gcmVtYXBwZWRBc3luYygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0LA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBBc3luY0hhbmRsZXI8Q3VzdG9tQXN5bmNSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJjdXN0b21Bc3luYyIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9jdXN0b21Bc3luYyIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImN1c3RvbUFzeW5jIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmMiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJjdXN0b21Bc3luY1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQ3VzdG9tQXN5bmNSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgcmVtYXBwZWQoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCk7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLnRlc3QucGFyYWxsZWxhc3luYy5Bbm90aGVyUmVzcG9uc2U+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiYW5vdGhlciIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9hbm90aGVyIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkFub3RoZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBSZXNwb25zZTxBbm90aGVyUmVzcG9uc2U+IGFub3RoZXJBc3luY0FzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXINCi0gICAgICogQHBhcmFtIHJlcXVlc3QNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+DQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiYW5vdGhlciIsIGFjdGlvbiA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9hbm90aGVyIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkFub3RoZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gYW5vdGhlckFzeW5jQXN5bmMoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJyZXF1ZXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgcmVxdWVzdCwNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgQXN5bmNIYW5kbGVyPEFub3RoZXJSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJhbm90aGVyIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2Fub3RoZXIiKQ0KLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhbm90aGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQW5vdGhlciIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFub3RoZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkFub3RoZXJSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgYW5vdGhlckFzeW5jKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVxdWVzdA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoZXhjbHVkZT10cnVlKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGN1c3RvbUFzeW5jKA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0FzeW5jU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9Bc3luY1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NmJlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0FzeW5jU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC4xLWpheHdzLXJlYXJjaC0yMDA1LW5pZ2h0bHlfMjAwNi0wOC0xNl8wMi0zMi0wMy1NMQ0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJBc3luY1NlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCB3c2RsTG9jYXRpb24gPSAiYXN5bmNfZG9jbGl0d3Iud3NkbCIpDQotcHVibGljIGNsYXNzIEFzeW5jU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBBU1lOQ1NFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvTUVUQS1JTkYvYXN5bmNfZG9jbGl0d3Iud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIEFTWU5DU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotICAgIA0KLQ0KLSAgICBwdWJsaWMgQXN5bmNTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQXN5bmNTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoQVNZTkNTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiLCAiQXN5bmNTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBBc3luY1BvcnQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFzeW5jUG9ydCIpDQotICAgIHB1YmxpYyBBc3luY1BvcnQgZ2V0QXN5bmNQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChBc3luY1BvcnQpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwgIkFzeW5jUG9ydCIpLCBBc3luY1BvcnQuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL0RvY0xpdFdyYXBwZWRQb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzBjNDliLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvRG9jTGl0V3JhcHBlZFBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5jb21tb24uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkFub3RoZXJSZXNwb25zZTsNCi1pbXBvcnQgb3JnLnRlc3QucGFyYWxsZWxhc3luYy5DdXN0b21Bc3luY1Jlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLkludm9rZUFzeW5jUmVzcG9uc2U7DQotaW1wb3J0IG9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuUGluZ1Jlc3BvbnNlOw0KLWltcG9ydCBvcmcudGVzdC5wYXJhbGxlbGFzeW5jLlNsZWVwUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0vKioNCi0gKiBBc3luYyBlbmRwb2ludCB1c2VkIGZvciBBc3luYyBjbGllbnQgc2lkZSB0ZXN0cy4gQ2xpZW50cyB3aWxsIGludm9rZUFzeW5jDQotICogc2xlZXAgbWV0aG9kIHRvIGZvcmNlIHRoZSBzZXJ2ZXIgdG8gYmxvY2sgdW50aWwgd2FrZVVwIGlzIGNhbGxlZC4gVGhlIGNsaWVudA0KLSAqIGNhbiBjYWxsIGlzQXNsZWVwIHRvIHZlcmlmeSB0aGF0IHNsZWVwIGhhcyBiZWVuIGNhbGxlZCBieSB0aGUgYXN5bmMgdGhyZWFkLg0KLSAqLw0KLS8qDQotQFdlYlNlcnZpY2UoDQotICAgICAgICBzZXJ2aWNlTmFtZT0iQXN5bmNTZXJ2aWNlIiwNCi0gICAgICAgIHBvcnROYW1lPSJBc3luY1BvcnQiLA0KLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIiwNCi0gICAgICAgIGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy50ZXN0LnBhcmFsbGVsYXN5bmMuQXN5bmNQb3J0IiwNCi0gICAgICAgIHdzZGxMb2NhdGlvbj0iV0VCLUlORi93c2RsL2FzeW5jX2RvY2xpdHdyLndzZGwiKQ0KLSAgICAgICAgKi8NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iQXN5bmNTZXJ2aWNlIiwNCi0JCQllbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucGFyYWxsZWxhc3luYy5zZXJ2ZXIuQXN5bmNQb3J0IikNCi1wdWJsaWMgY2xhc3MgRG9jTGl0V3JhcHBlZFBvcnRJbXBsIGltcGxlbWVudHMgQXN5bmNQb3J0IHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOw0KLQ0KLSAgICAvLyBpbiBvcmRlciB0byBhbGxvdyBtdWx0aXBsZSBzbGVlcGluZyByZXF1ZXN0cyB0byBiZSBoZWxkIGF0IHRoZSBzYW1lIHRpbWUNCi0gICAgLy8gdXNlIGEgdGFibGUgd2hlcmUgDQotICAgIC8vICAgICAgIHRoZSBrZXkgaXMgdGhlIHJlcXVlc3Qgc3RyaW5nDQotICAgIC8vICAgICAgIHRoZSB2YWx1ZSBpcyB0aGUgb2JqZWN0IHVzZWQgdG8gYmxvY2sgb24NCi0gICAgLy8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHNsZWVwZXJzID0gbmV3IEhhc2h0YWJsZSgpOw0KLQ0KLSAgICAvLyBpbnRlbmRlZCB0byBmbGFnIHRoZSBuZWVkIHRvIGNhbmNlbCBjdXJyZW50IHJlcXVlc3RzIGJlaW5nIGhlbGQgKGllLCBzbGVlcGluZykNCi0gICAgLy8gZG9lcyBub3Qgc3RvcCBuZXcgcmVxdWVzdHMNCi0gICAgLy8gbm90IHNldHRhYmxlIHlldA0KLSAgICAvLyBuZWVkIHRvIGRldGVybWluZSB3aGVuIHRvIHJlc2V0IGl0IHdoZW4gZGVhbGluZyB3aXRoIG11bHRpcGxlIG9wZXJhdGlvbnMNCi0gICAgLy8gY3VycmVudGx5IHJlc2V0IHdoZW4gdGhlIHNsZWVwZXJzIHRhYmxlIGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSByZXF1ZXN0cw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvQ2FuY2VsbCA9IGZhbHNlOw0KLQ0KLSAgICAvLyBzdHJpbmdzIHVzZWQgZm9yIGxvZ2dpbmcNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbXlDbGFzc05hbWUgPSAiRG9jTGl0V3JhcHBlZFBvcnRJbXBsLiI7DQotDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG9wZXJhdGlvbiB0YWtlcyB0aGUgcmVxdWVzdCBhbmQgaG9sZHMgaXQgaW4gdGhlIHdlYiBzZXJ2aWNlIHVudGlsDQotICAgICAqIDxVTD4NCi0gICAgICogPExJPnRoZSBjbGllbnQgYXNrcyBmb3IgaXQgdmlhIHdha2VVcCgpDQotICAgICAqIDxMST50aGUgb3BlcmF0aW9uIHRpbWVzIG91dA0KLSAgICAgKiA8TEk+dGhlIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZA0KLSAgICAgKiA8L1VMPg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHJlcXVlc3QgaWRlbnRpZmllcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2xlZXAoSG9sZGVyPFN0cmluZz4gcmVxdWVzdCkgew0KLQ0KLSAgICAgICAgYm9vbGVhbiBjYW5jZWxSZXF1ZXN0ZWQgPSBmYWxzZTsNCi0NCi0gICAgICAgIFN0cmluZyBrZXkgPSBuZXcgU3RyaW5nKHJlcXVlc3QudmFsdWUpOw0KLSAgICAgICAgU3RyaW5nIG1zZyA9IHJlcXVlc3QudmFsdWU7DQotDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsic2xlZXAoIittc2crIik6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0gIjsNCi0gICAgICAgIC8vaWYgKERFQlVHKQ0KLSAgICAgICAgLy97DQotICAgICAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyB0aWQgKyAiRW50ZXIiKTsNCi0gICAgICAgIC8vfQ0KLQ0KLSAgICAgICAgaWYgKHNsZWVwZXJzLmdldChrZXkpICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gYWxyZWFkeSBob2xkaW5nIHRoaXMgcmVxdWVzdCBpZA0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRocmVhZCBteVRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQotICAgICAgICBsb25nIHRocmVhZElEID0gbXlUaHJlYWQuZ2V0SWQoKTsNCi0NCi0gICAgICAgIC8vIGFkZCB0aGlzIHJlcXVlc3QgdG8gb3VyIGxpc3QNCi0gICAgICAgIHNsZWVwZXJzLnB1dChrZXksbXlUaHJlYWQpOw0KLQ0KLSAgICAgICAgLy8gc2V0IHRoZSB0aW1lb3V0IHZhbHVlDQotICAgICAgICBsb25nIHNlYyA9IENvbnN0YW50cy5TRVJWRVJfU0xFRVBfU0VDOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICAvL2lmIChERUJVRykNCi0gICAgICAgICAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4odGl0bGUgKyAiU3RhcnRpbmcgdG8gc2xlZXAgb24gIg0KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgKyAiIHRocmVhZElEIFsiKyB0aHJlYWRJRCArICJdIiApOw0KLQ0KLSAgICAgICAgICAgIC8vIGhvbGQgdGhpcyByZXF1ZXN0IHVudGlsDQotICAgICAgICAgICAgLy8gIC0gdGhlIHdhaXQgdGltZSBleHBpcmVzDQotICAgICAgICAgICAgLy8gIC0gdGhlIGNsaWVudCBleHBsaWNpdHMgYXNrcyBmb3IgdGhpcyByZXF1ZXN0IHZpYSB3YWtlVXAoKQ0KLSAgICAgICAgICAgIC8vICAtIHRoZSB3YWl0IGlzIGludGVycnVwdGVkDQotICAgICAgICAgICAgLy8gIC0gYSBjYW5jZWwgb2NjdXJzDQotDQotICAgICAgICAgICAgd2hpbGUgKHNlYyA+IDAgJiYgIWRvQ2FuY2VsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJTbGVlcGluZyBvbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aHJlYWRJRCBbIiArIHRocmVhZElEICsgIl0iDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lTGVmdD0iICsgc2VjKTsNCi0gICAgICAgICAgICAgICAgc2VjLS07DQotDQotICAgICAgICAgICAgICAgIC8vbXNnLndhaXQoNTAwKTsNCi0gICAgICAgICAgICAgICAgbXlUaHJlYWQuc2xlZXAoNTAwKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IA0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0NCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJTbGVlcCBpbnRlcnJ1cHRlZCBvbiAiDQotICAgICAgICAgICAgICAgICAgICArICIgdGhyZWFkSUQgWyIgKyB0aHJlYWRJRCArICJdIg0KLSAgICAgICAgICAgICAgICAgICAgKyAiIHRpbWVMZWZ0PVsiICsgc2VjICsgIl0iKTsNCi0NCi0gICAgICAgIH0gDQotICAgICAgICBmaW5hbGx5IHsNCi0NCi0gICAgICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgImZpbmFsIHByb2Nlc3NpbmcgZm9yICINCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgdGhyZWFkSUQgWyIgKyB0aHJlYWRJRCArICJdIik7DQotDQotICAgICAgICAgICAgLy8gcmVtb3ZlIHRoaXMgcmVxdWVzdCBmcm9tIHRoZSBsaXN0DQotICAgICAgICAgICAgc2xlZXBlcnMucmVtb3ZlKGtleSk7DQotDQotICAgICAgICAgICAgLy8gZm9yIG5vdywgcmVzZXQgdGhlIGNhbmNlbGxhdGlvbiBmbGFnIHdoZW4gdGhlIGxpc3Qgb2YgDQotICAgICAgICAgICAgLy8gd2FpdGluZyByZXF1ZXN0cyBnbyB0byB6ZXJvDQotICAgICAgICAgICAgaWYgKHNsZWVwZXJzLmlzRW1wdHkoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGRvQ2FuY2VsbCA9IGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ2hlY2tzIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCB0byBkZXRlcm1pbmUgd2hldGhlcg0KLSAgICAgKiBpdCBpcyBzdGlsbCBiZWluZyBoZWxkIGJ5IHRoZSB3ZWIgc2VydmljZS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSByZXF1ZXN0IGlkZW50aWZpZXIgdG8gY2hlY2sNCi0gICAgICogQHJldHVybiBUaGUgU3RyaW5nIGJlaW5nIHVzZWQgYXMgYSB3YWl0IG9iamVjdCBpZiB0aGUNCi0gICAgICogICAgICAgICByZXF1ZXN0IGlzIHN0aWxsIGJlaW5nIGhlbGQgYnkgdGhlIHNlcnZlcg0KLSAgICAgKiAgICAgICAgIG9yIE5VTEwgaWYgdGhlIHJlcXVlc3QgaXMgbm90IGhlbGQgYnkgdGhlIHNlcnZlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBpc0FzbGVlcChTdHJpbmcgcmVxdWVzdCkgew0KLQ0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrImlzQXNsZWVwKCIrcmVxdWVzdCsiKTogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSAiOw0KLQ0KLSAgICAgICAgaWYgKHNsZWVwZXJzLmlzRW1wdHkoKSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgdGlkICsgIiBOb3Qgc2xlZXBpbmciKTsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFRocmVhZCB2YWx1ZSA9IChUaHJlYWQpIHNsZWVwZXJzLmdldChyZXF1ZXN0KTsNCi0NCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyB0aWQgKyAiIE5vdCBzbGVlcGluZyIpOw0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgdGlkICsgIiBzbGVlcGluZyBvbiBbIiArIHJlcXVlc3QgKyAiXSIpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3Q7DQotICAgIH0NCi0NCi0NCi0NCi0gICAgcHVibGljIFN0cmluZyB3YWtlVXAoU3RyaW5nIHJlcXVlc3QpIHsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJ3YWtlVXAoKTogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotDQotICAgICAgICBpZiAoc2xlZXBlcnMuaXNFbXB0eSgpKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyB0aWQgKyAiIE5vIG9uZSB0byB3YWtlIHVwIik7DQotDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBUaHJlYWQgdmFsdWUgPSAoVGhyZWFkKSBzbGVlcGVycy5nZXQocmVxdWVzdCk7DQotDQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgdGlkICsgIiBUaHJlYWQgbm90IGF2YWlsYWJsZS4gTm8gb25lIHRvIHdha2UgdXAuIik7DQotDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyB0aWQgKyAiIEludGVycnVwdGluZyAiDQotICAgICAgICAgICAgICAgICAgICArICIgdGhyZWFkSUQgWyIgKyB2YWx1ZS5nZXRJZCgpICsgIl0iKTsNCi0NCi0gICAgICAgIC8vIGludGVycnVwdCB0aGUgc2xlZXBlcg0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgdmFsdWUuaW50ZXJydXB0KCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArIHRpZCArICIgSW50ZXJydXB0aW5nICINCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgdGhyZWFkSUQgWyIgKyB2YWx1ZS5nZXRJZCgpICsgIl0gIGdvdCBFeGNlcHRpb24gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3Q7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIGNsaWVudCBzaWRlIHRlc3RzIGZvciByZW1hcHBpbmcgb3BlcmF0aW9uIG5hbWVzLCBvbiB0aGUgc2VydmVyIHNpZGUgYWxsDQotICAgICAqIHdlIG5lZWQgdG8gZG8gaXMgcm91bmR0cmlwIHRoZSBtZXNzYWdlDQotICAgICAqLw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZUFzeW5jKFN0cmluZyByZXF1ZXN0KSB7DQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiaW52b2tlQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiByZXF1ZXN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgY3VzdG9tQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJjdXN0b21lQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiByZXF1ZXN0ICsgImZyb20gY3VzdG9tQXN5bmMgbWV0aG9kIjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGFub3RoZXIoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJhbm90aGVyKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gcmVxdWVzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHBpbmcoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJwaW5nKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gcmVxdWVzdDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHJlbWFwcGVkKFN0cmluZyByZXF1ZXN0KSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsicmVtYXBwZWQoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiByZXF1ZXN0Ow0KLSAgICB9DQotDQotDQotICAgIC8vIE5PVCBVU0VEOg0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBhbm90aGVyQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyJhbm90aGVyQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gYW5vdGhlckFzeW5jQXN5bmMoU3RyaW5nIHJlcXVlc3QsIEFzeW5jSGFuZGxlcjxBbm90aGVyUmVzcG9uc2U+IGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBGdXR1cmU8Pz4gYW5vdGhlckFzeW5jQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNwb25zZTxBbm90aGVyUmVzcG9uc2U+IGFub3RoZXJBc3luY0FzeW5jKFN0cmluZyByZXF1ZXN0KSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIFJlc3BvbnNlPEFub3RoZXJSZXNwb25zZT4gYW5vdGhlckFzeW5jQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmNBc3luYyhTdHJpbmcgcmVxdWVzdCwgQXN5bmNIYW5kbGVyPEludm9rZUFzeW5jUmVzcG9uc2U+IGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBGdXR1cmU8Pz4gaW52b2tlQXN5bmNBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlPEludm9rZUFzeW5jUmVzcG9uc2U+IGludm9rZUFzeW5jQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyIgUmVzcG9uc2U8SW52b2tlQXN5bmNSZXNwb25zZT4gaW52b2tlQXN5bmNBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBwaW5nQXN5bmMoU3RyaW5nIHJlcXVlc3QsIEFzeW5jSGFuZGxlcjxQaW5nUmVzcG9uc2U+IGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBGdXR1cmU8Pz4gcGluZ0FzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8UGluZ1Jlc3BvbnNlPiBwaW5nQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyIgUmVzcG9uc2U8UGluZ1Jlc3BvbnNlPiBwaW5nQXN5bmMoIityZXF1ZXN0KyIpIDogIjsNCi0gICAgICAgIFN0cmluZyB0aWQgPSAiIHRocmVhZElEIFsiKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCkgKyAiXSI7DQotICAgICAgICBpZiAoREVCVUcpDQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcodGl0bGUgKyAiRW50ZXIiICsgdGlkKTsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gcmVtYXBwZWRBc3luYyhTdHJpbmcgcmVxdWVzdCwgQXN5bmNIYW5kbGVyPEN1c3RvbUFzeW5jUmVzcG9uc2U+IGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBGdXR1cmU8Pz4gcmVtYXBwZWRBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlPEN1c3RvbUFzeW5jUmVzcG9uc2U+IHJlbWFwcGVkQXN5bmMoU3RyaW5nIHJlcXVlc3QpIHsNCi0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG15Q2xhc3NOYW1lKyIgUmVzcG9uc2U8Q3VzdG9tQXN5bmNSZXNwb25zZT4gcmVtYXBwZWRBc3luYygiK3JlcXVlc3QrIikgOiAiOw0KLSAgICAgICAgU3RyaW5nIHRpZCA9ICIgdGhyZWFkSUQgWyIrIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0SWQoKSArICJdIjsNCi0gICAgICAgIGlmIChERUJVRykNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyh0aXRsZSArICJFbnRlciIgKyB0aWQpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBzbGVlcEFzeW5jKFN0cmluZyByZXF1ZXN0LCBBc3luY0hhbmRsZXI8U2xlZXBSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7DQotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotICAgICAgICBTdHJpbmcgdGl0bGUgPSBteUNsYXNzTmFtZSsiIEZ1dHVyZTw/PiBzbGVlcEFzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2U8U2xlZXBSZXNwb25zZT4gc2xlZXBBc3luYyhTdHJpbmcgcmVxdWVzdCkgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbXlDbGFzc05hbWUrIiBSZXNwb25zZTxTbGVlcFJlc3BvbnNlPiBzbGVlcEFzeW5jKCIrcmVxdWVzdCsiKSA6ICI7DQotICAgICAgICBTdHJpbmcgdGlkID0gIiB0aHJlYWRJRCBbIisgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpICsgIl0iOw0KLSAgICAgICAgaWYgKERFQlVHKQ0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKHRpdGxlICsgIkVudGVyIiArIHRpZCk7DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcGFyYWxsZWxhc3luYy9zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWVmYWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS42LjENCi1DcmVhdGVkLUJ5OiAyLjMgKElCTSBDb3Jwb3JhdGlvbikNCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3BhcmFsbGVsYXN5bmMvc2VydmVyL01FVEEtSU5GL2FzeW5jX2RvY2xpdHdyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjc4MmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9wYXJhbGxlbGFzeW5jL3NlcnZlci9NRVRBLUlORi9hc3luY19kb2NsaXR3ci53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iDQotCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiDQotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9ImFzeW5jIg0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIj4NCi0JDQotCTx3c2RsOnR5cGVzPg0KLQkJPHhzZDpzY2hlbWENCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jIg0KLQkJCXhtbG5zOnRucz0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMiDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZyI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkNCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZ1Jlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkJDQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9InNsZWVwIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JCQ0KLQkJCQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzbGVlcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXNBc2xlZXAiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaXNBc2xlZXBSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50PgkNCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0id2FrZVVwIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4JDQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Indha2VVcFJlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+CQ0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2VBc3luYyI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZUFzeW5jUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9tQXN5bmMiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21Bc3luY1Jlc3BvbnNlIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgkJCQkJCQ0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImFub3RoZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4JCQkJCQkNCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbm90aGVyUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciIC8+CQkJCQkJDQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InBpbmdSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOnBpbmciIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InBpbmdSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlc3BvbnNlIiBlbGVtZW50PSJ0bnM6cGluZ1Jlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJzbGVlcFJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6c2xlZXAiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InNsZWVwUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOnNsZWVwUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ3YWtlVXBSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOndha2VVcCIgLz4JDQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Indha2VVcFJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczp3YWtlVXBSZXNwb25zZSIgLz4JDQotCTwvd3NkbDptZXNzYWdlPgkNCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaXNBc2xlZXBSZXF1ZXN0Ij4NCi0JPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6aXNBc2xlZXAiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImlzQXNsZWVwUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmlzQXNsZWVwUmVzcG9uc2UiIC8+CQ0KLQk8L3dzZGw6bWVzc2FnZT4JCQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VBc3luY1JlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXF1ZXN0IiBlbGVtZW50PSJ0bnM6aW52b2tlQXN5bmMiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZUFzeW5jUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmludm9rZUFzeW5jUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPgkNCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iY3VzdG9tQXN5bmNSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zOmN1c3RvbUFzeW5jIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJjdXN0b21Bc3luY1Jlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0icmVzcG9uc2UiIGVsZW1lbnQ9InRuczpjdXN0b21Bc3luY1Jlc3BvbnNlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4JCQ0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJhbm90aGVyUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczphbm90aGVyIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJhbm90aGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJyZXNwb25zZSIgZWxlbWVudD0idG5zOmFub3RoZXJSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+CQkNCi0JDQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkFzeW5jUG9ydCI+DQotCQkNCi0JCTwhLS0gc2ltcGxlIHBpbmcgb3BlcmF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBEb2NMaXRXcmFwcGVkIGFzeW5jIHRlc3QtLT4NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnBpbmdSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6cGluZ1Jlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQ0KLQkJDQotCQk8IS0tIHJlcXVlc3QgZm9yIHRoZSBzZXJ2ZXIgdG8gZ290byBzbGVlcCB1bnRpbCByZWxlYXNlIGlzIGNhbGxlZC0tPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNsZWVwIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOnNsZWVwUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnNsZWVwUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8IS0tIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2xlZXAgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbGxlZCB5ZXQgLS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaXNBc2xlZXAiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6aXNBc2xlZXBSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aXNBc2xlZXBSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkJDQotCQkNCi0JCTwhLS0gZm9yY2UgdGhlIHNsZWVwIG9wZXJhdGlvbiB0byBzdG9wIHNsZWVwaW5nIC0tPg0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Indha2VVcCI+DQotCQkJPHdzZGw6aW5wdXQgIG1lc3NhZ2U9InRuczp3YWtlVXBSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6d2FrZVVwUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkJDQotCQkJDQotCQkJDQotCQk8IS0tIFNlY29uZCBzdWl0ZSBvZiB0ZXN0cyBmb3IgQXN5bmMgb3BlcmF0aW9uIG5hbWluZzoNCi0JCQkgd2lsbCB0ZXN0IGZvciBob3cgdGhlIGltcGxlbWVudGF0aW9uIHJlc3BvbmRzIHRvDQotCQkgICAgIG1ldGhvZHMgZW5kaW5nIGluIEFzeW5jIHdpdGggYXN5bmMgYmluZGluZyBlbmFibGVkDQotCQkgLS0+DQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlQXN5bmMiPg0KLQkJCTx3c2RsOmlucHV0ICBtZXNzYWdlPSJ0bnM6aW52b2tlQXN5bmNSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlQXN5bmNSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkJDQotCQkJDQotCQk8IS0tIHdpbGwgdGVzdCBmb3IgaG93IHRoZSBpbXBsZW1lbnRhdGlvbiByZXNwb25kcyB0bw0KLQkJICAgICBtZXRob2RzIGVuZGluZyBpbiBhc3luYyB3aXRoIGFzeW5jIGJpbmRpbmcgZW5hYmxlZA0KLQkJIC0tPgkJCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImN1c3RvbUFzeW5jIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmN1c3RvbUFzeW5jUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmN1c3RvbUFzeW5jUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8IS0tIHdlIHdpbGwgbWFwIHRoaXMgb3BlcmF0aW9uIHRvIGEgamF2YSBtZXRob2QgZW5kaW5nIGluIEFzeW5jDQotCQkgLS0+CQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhbm90aGVyIj4NCi0JCQk8d3NkbDppbnB1dCAgbWVzc2FnZT0idG5zOmFub3RoZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6YW5vdGhlclJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4JCQkJCQ0KLQkJCQ0KLQk8L3dzZGw6cG9ydFR5cGU+DQotCQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkFzeW5jIiB0eXBlPSJ0bnM6QXN5bmNQb3J0Ij4NCi0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InBpbmciPg0KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vb3JnL3Rlc3QvcGFyYWxsZWxhc3luYy9waW5nIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzbGVlcCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL3NsZWVwIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpc0FzbGVlcCI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2lzQXNsZWVwIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkNCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0id2FrZVVwIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvd2FrZVVwIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2VBc3luYyI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2ludm9rZUFzeW5jIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiICAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImN1c3RvbUFzeW5jIj4NCi0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL29yZy90ZXN0L3BhcmFsbGVsYXN5bmMvY3VzdG9tQXN5bmMiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQkNCi0JDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iYW5vdGhlciI+DQotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9vcmcvdGVzdC9wYXJhbGxlbGFzeW5jL2Fub3RoZXIiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgIC8+DQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+CQ0KLQkNCi0JPC93c2RsOmJpbmRpbmc+DQotCQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkFzeW5jU2VydmljZSI+DQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpBc3luYyIgbmFtZT0iQXN5bmNQb3J0Ij4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvamF4d3MuYXN5bmMvc2VydmljZXMvQXN5bmNEb2NMaXRXcmFwcGVkU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0JDQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vTUVUQS1JTkYvcmVzb3VyY2VpbmplY3Rpb24ud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vTUVUQS1JTkYvcmVzb3VyY2VpbmplY3Rpb24ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMmRkOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL01FVEEtSU5GL3Jlc291cmNlaW5qZWN0aW9uLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciPg0KLSAgPHdzZGw6dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Jlc291cmNlaW5qZWN0aW9uLnNhbXBsZS50ZXN0Lm9yZyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlc3RJbmplY3Rpb25SZXNwb25zZSI+DQotICAgICAgCTx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgCQk8eHNkOnNlcXVlbmNlPg0KLSAgICAgIAkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0gICAgICAJCTwveHNkOnNlcXVlbmNlPg0KLSAgICAgIAk8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZXN0SW5qZWN0aW9uIj4NCi0gICAgICAJPHhzZDpjb21wbGV4VHlwZT4NCi0gICAgICAJCTx4c2Q6c2VxdWVuY2U+DQotICAgICAgCQkJPHhzZDplbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ieHNkOnN0cmluZyI+PC94c2Q6ZWxlbWVudD4NCi0gICAgICAJCTwveHNkOnNlcXVlbmNlPg0KLSAgICAgIAk8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICA8L3hzZDpzY2hlbWE+DQotICA8L3dzZGw6dHlwZXM+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9InRlc3RJbmplY3Rpb25SZXNwb25zZSI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOnRlc3RJbmplY3Rpb25SZXNwb25zZSIgbmFtZT0idGVzdEluamVjdGlvblJlc3BvbnNlIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0idGVzdEluamVjdGlvbiI+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOnRlc3RJbmplY3Rpb24iIG5hbWU9InRlc3RJbmplY3Rpb24iLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSI+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0ZXN0SW5qZWN0aW9uIj4NCi0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6dGVzdEluamVjdGlvbiIvPg0KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dGVzdEluamVjdGlvblJlc3BvbnNlIi8+DQotICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICA8L3dzZGw6cG9ydFR5cGU+DQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uQmluZGluZyIgdHlwZT0idG5zOlJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InRlc3RJbmplY3Rpb24iPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnL3Rlc3RJbmplY3Rpb24iLz4NCi0gICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpiaW5kaW5nPg0KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJSZXNvdXJjZUluamVjdGlvblNlcnZpY2UiPg0KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpSZXNvdXJjZUluamVjdGlvbkJpbmRpbmciIG5hbWU9IlJlc291cmNlSW5qZWN0aW9uUG9ydCI+DQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZSIvPg0KLSAgICA8L3dzZGw6cG9ydD4NCi0gIDwvd3NkbDpzZXJ2aWNlPg0KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uUG9ydFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjZhN2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucmVzb3VyY2VpbmplY3Rpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucmVzb3VyY2VpbmplY3Rpb24uc2VpLlJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGU7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBTYW1wbGUgUmVzb3VyY2UgSW5qZWN0aW9uIEVuZHBvaW50DQotICoNCi0gKi8NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZT0iUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlIiwNCi0gICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucmVzb3VyY2VpbmplY3Rpb24uc2VpLlJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUiKQ0KLSAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlSW1wbCBpbXBsZW1lbnRzIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUgew0KLQ0KLSAgICAvLyBUaGUgY3R4IHZhcmlhYmxlIGlzIG1hcmtlZCB3aXRoIHRoZSBAUmVzb3VyY2UgYW5ub3RhdGlvbi4NCi0gICAgLy8gVGhlIHJ1bnRpbWUgd2lsbCBhdXRvbWF0aWNhbGx5IGluamVjdCAoc2V0KSB0aGlzIHZhcmlhYmxlIHRvIHRoZQ0KLSAgICAvLyBjdXJyZW50IFdlYlNlcnZpY2VDb250ZXh0DQotICAgIEBSZXNvdXJjZQ0KLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgY3R4ID0gbnVsbDsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTYW1wbGUgbWV0aG9kIHRoYXQgZW5zdXJlcyB0aGF0IFdlYlNlcnZpY2VDb250ZXh0IHdhcyBwcm9wZXJseSBzZXQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RJbmplY3Rpb24oU3RyaW5nIGFyZykgew0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIGlmIChjdHggPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAiRkFJTFVSRTogVGhlIFdlYlNlcnZpY2VDb250ZXh0IHdhcyBub3Qgc2V0IjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IGN0eC5nZXRNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAiRkFJTFVSRTogVGhlIFdlYlNlcnZpY2VDb250ZXh0IGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ29udGV4dCI7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBpbml0Q2FsbGVkVmFsdWUgPSAoU3RyaW5nKSBtc2dDb250ZXh0LmdldCgiSU5JVF9DQUxMRUQiKTsNCi0gICAgICAgIGlmIChpbml0Q2FsbGVkVmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAiRkFJTFVSRTogVGhlIEBQb3N0Q29uc3RydWN0IGluaXRpYWxpemUgbWV0aG9kIHdhcyBub3QgaW52b2tlZCI7DQotICAgICAgICB9DQotICAgICAgICBRTmFtZSB3c2RsT3BlcmF0aW9uID0gKFFOYW1lKSBtc2dDb250ZXh0LmdldChNZXNzYWdlQ29udGV4dC5XU0RMX09QRVJBVElPTik7DQotICAgICAgICANCi0gICAgICAgIGlmICh3c2RsT3BlcmF0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gIkZBSUxVUkU6IFRoZSBXZWJTZXJ2aWNlQ29udGV4dCdzIE1lc3NhZ2VDb250ZXh0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHdzZGxPcGVyYXRpb24iOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICJTVUNDRVNTOiAiICsgd3NkbE9wZXJhdGlvbi5nZXRMb2NhbFBhcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBAUG9zdENvbnN0cnVjdA0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7DQotICAgICAgICAvL0NhbGxlZCBhZnRlciByZXNvdXJjZSBpbmplY3Rpb24gYW5kIGJlZm9yZSBhIG1ldGhvZCBpcyBjYWxsZWQuDQotICAgICAgICBpZiAoY3R4ICE9IG51bGwgJiYgY3R4LmdldE1lc3NhZ2VDb250ZXh0KCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGN0eC5nZXRNZXNzYWdlQ29udGV4dCgpLnB1dCgiSU5JVF9DQUxMRUQiLCAiSU5JVF9DQUxMRURfVkFMVUUiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBAUHJlRGVzdHJveQ0KLSAgICBwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotICAgICAgICAvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL3NlaS9SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3Jlc291cmNlaW5qZWN0aW9uL3NlaS9SZXNvdXJjZUluamVjdGlvblBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYThjZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9zZWkvUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUucmVzb3VyY2VpbmplY3Rpb24uc2VpOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciKQ0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZw0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmcvTmV3T3BlcmF0aW9uIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidGVzdEluamVjdGlvbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5UZXN0SW5qZWN0aW9uIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidGVzdEluamVjdGlvblJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLnJlc291cmNlaW5qZWN0aW9uLlRlc3RJbmplY3Rpb25SZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgdGVzdEluamVjdGlvbigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZyIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgU3RyaW5nIGFyZyk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vc2VpL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9zZWkvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmEwZjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9yZXNvdXJjZWluamVjdGlvbi9zZWkvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5yZXNvdXJjZWluamVjdGlvbi5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXNvdXJjZWluamVjdGlvbi5zYW1wbGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAicmVzb3VyY2VpbmplY3Rpb24ud3NkbCIpDQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uU2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBSRVNPVVJDRUlOSkVDVElPTlNFUlZJQ0VfV1NETF9MT0NBVElPTjsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvcmVzb3VyY2VpbmplY3Rpb24vTUVUQS1JTkYvcmVzb3VyY2VpbmplY3Rpb24ud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFJFU09VUkNFSU5KRUNUSU9OU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihSRVNPVVJDRUlOSkVDVElPTlNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnIiwgIlJlc291cmNlSW5qZWN0aW9uU2VydmljZSIpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUmVzb3VyY2VJbmplY3Rpb25Qb3J0IikNCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uUG9ydFR5cGUgZ2V0UmVzb3VyY2VJbmplY3Rpb25Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vcmVzb3VyY2VpbmplY3Rpb24uc2FtcGxlLnRlc3Qub3JnIiwgIlJlc291cmNlSW5qZWN0aW9uUG9ydCIpLCBSZXNvdXJjZUluamVjdGlvblBvcnRUeXBlLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3QvTUVUQS1JTkYvU3RyaW5nTGlzdC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L01FVEEtSU5GL1N0cmluZ0xpc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzMDk0MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3QvTUVUQS1JTkYvU3RyaW5nTGlzdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi0NCi08ZGVmaW5pdGlvbnMgbmFtZT0iU3RyaW5nTGlzdCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCINCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4NCi0NCi0NCi0JPHR5cGVzPg0KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0Ij4NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RyaW5nTGlzdCIgdHlwZT0idG5zOlN0cmluZ0xpc3RUeXBlIiAvPg0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdHJpbmdMaXN0UmVzcG9uc2UiIHR5cGU9InRuczpTdHJpbmdMaXN0VHlwZSIgLz4NCi0gICAgDQotCQkJPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlN0cmluZ0xpc3RUeXBlIj4NCi0JCQkJPHhzZDpsaXN0IGl0ZW1UeXBlPSJ4c2Q6c3RyaW5nIi8+DQotCQkJPC94c2Q6c2ltcGxlVHlwZT4NCi0JCQkNCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0NCi0JPG1lc3NhZ2UgbmFtZT0iU3RyaW5nTGlzdCI+DQotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6U3RyaW5nTGlzdCIgLz4NCi0JPC9tZXNzYWdlPg0KLQk8bWVzc2FnZSBuYW1lPSJTdHJpbmdMaXN0UmVzcG9uc2UiPg0KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6U3RyaW5nTGlzdFJlc3BvbnNlIiAvPg0KLQk8L21lc3NhZ2U+DQotCQ0KLQk8cG9ydFR5cGUgbmFtZT0iU3RyaW5nTGlzdFBvcnRUeXBlIj4NCi0JCTxvcGVyYXRpb24gbmFtZT0iU3RyaW5nTGlzdCI+DQotCQkJPGlucHV0IG1lc3NhZ2U9InRuczpTdHJpbmdMaXN0IiBuYW1lPSJhZGQiIC8+DQotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6U3RyaW5nTGlzdFJlc3BvbnNlIiBuYW1lPSJhZGRSZXNwb25zZSIgLz4NCi0JCQkNCi0JCTwvb3BlcmF0aW9uPg0KLQk8L3BvcnRUeXBlPg0KLQk8YmluZGluZyBuYW1lPSJTdHJpbmdMaXN0QmluZGluZyIgdHlwZT0idG5zOlN0cmluZ0xpc3RQb3J0VHlwZSI+DQotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIg0KLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4NCi0JCTxvcGVyYXRpb24gbmFtZT0iU3RyaW5nTGlzdCI+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L2lucHV0Pg0KLQkJCTxvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvb3V0cHV0Pg0KLQkJCQ0KLQkJPC9vcGVyYXRpb24+DQotCQkNCi0JPC9iaW5kaW5nPg0KLQk8c2VydmljZSBuYW1lPSJTdHJpbmdMaXN0U2VydmljZSI+DQotCQk8cG9ydCBuYW1lPSJTdHJpbmdMaXN0UG9ydCIgYmluZGluZz0idG5zOlN0cmluZ0xpc3RCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzDQotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvU3RyaW5nTGlzdFNlcnZpY2UiIC8+DQotCQk8L3BvcnQ+DQotCTwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9TdHJpbmdMaXN0UG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3N0cmluZ2xpc3QvU3RyaW5nTGlzdFBvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc3YWU4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9TdHJpbmdMaXN0UG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5zdHJpbmdsaXN0Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5zdHJpbmdsaXN0LnNlaS5TdHJpbmdMaXN0UG9ydFR5cGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJTdHJpbmdMaXN0U2VydmljZSIsIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5zdHJpbmdsaXN0LnNlaS5TdHJpbmdMaXN0UG9ydFR5cGUiKQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMaXN0UG9ydFR5cGVJbXBsIGltcGxlbWVudHMgU3RyaW5nTGlzdFBvcnRUeXBlIHsNCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3RyaW5nbGlzdC5zZWkuU3RyaW5nTGlzdFBvcnRUeXBlI3N0cmluZ0xpc3QoamF2YS5sYW5nLlN0cmluZ1tdKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZ1tdIHN0cmluZ0xpc3QoU3RyaW5nW10gcGFyYW1ldGVycykgew0KLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L3NlaS9TdHJpbmdMaXN0UG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9zZWkvU3RyaW5nTGlzdFBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTFiOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L3NlaS9TdHJpbmdMaXN0UG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Quc2VpOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJTdHJpbmdMaXN0UG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiKQ0KLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpDQotcHVibGljIGludGVyZmFjZSBTdHJpbmdMaXN0UG9ydFR5cGUgew0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZ1tdDQotICAgICAqLw0KLSAgICBAWG1sTGlzdA0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiU3RyaW5nTGlzdCIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJTdHJpbmdMaXN0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiLCBwYXJ0TmFtZSA9ICJyZXN1bHQiKQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gc3RyaW5nTGlzdCgNCi0gICAgICAgIEBYbWxMaXN0DQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJTdHJpbmdMaXN0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0IiwgcGFydE5hbWUgPSAicGFyYW1ldGVycyIpDQotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L3NlaS9TdHJpbmdMaXN0U2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L3NlaS9TdHJpbmdMaXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEzZWJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvc3RyaW5nbGlzdC9zZWkvU3RyaW5nTGlzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLnN0cmluZ2xpc3Quc2VpOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJTdHJpbmdMaXN0U2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvU3RyaW5nTGlzdCIsIHdzZGxMb2NhdGlvbiA9ICJTdHJpbmdMaXN0LndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdMaXN0U2VydmljZQ0KLSAgICBleHRlbmRzIFNlcnZpY2UNCi17DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBTVFJJTkdMSVNUU0VSVklDRV9XU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgd3NkbExvY2F0aW9uPSIvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9zdHJpbmdsaXN0L01FVEEtSU5GL1N0cmluZ0xpc3Qud3NkbCI7DQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHRyeXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU1RSSU5HTElTVFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nTGlzdFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmdMaXN0U2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFNUUklOR0xJU1RTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L1N0cmluZ0xpc3QiLCAiU3RyaW5nTGlzdFNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZ0xpc3RQb3J0VHlwZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiU3RyaW5nTGlzdFBvcnQiKQ0KLSAgICBwdWJsaWMgU3RyaW5nTGlzdFBvcnRUeXBlIGdldFN0cmluZ0xpc3RQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdMaXN0UG9ydFR5cGUpc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvdGVzdC9TdHJpbmdMaXN0IiwgIlN0cmluZ0xpc3RQb3J0IiksIFN0cmluZ0xpc3RQb3J0VHlwZS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwL0RvY0xpdFdyYXBJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvRG9jTGl0V3JhcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0M2M0NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvRG9jTGl0V3JhcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQ3VzdG9tQnVpbGRlck1vbml0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcDsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuRmluYW5jaWFsT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXI7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclBhcnQwOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJQYXJ0MTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuSGVhZGVyUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJEb2NMaXRXcmFwU2VydmljZSIsDQotCQkJZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXAiKQ0KLXB1YmxpYyBjbGFzcyBEb2NMaXRXcmFwSW1wbCBpbXBsZW1lbnRzIERvY0xpdFdyYXAgew0KLQ0KLQlwdWJsaWMgRmluYW5jaWFsT3BlcmF0aW9uIGZpbk9wKEZpbmFuY2lhbE9wZXJhdGlvbiBvcCkgew0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yg0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIERvY0xpdFdyYXBJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCS8qIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaS5Eb2NMaXRXcmFwI29uZVdheVZvaWQoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgb25lV2F5Vm9pZCgpIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJPbmVXYXlWb2lkIHdpdGggbm8gcGFyYW1ldGVycyBjYWxsZWQiKTsNCi0NCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcCNvbmVXYXkoamF2YS5sYW5nLlN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIG9uZVdheShTdHJpbmcgb25ld2F5U3RyKSB7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotDQotCX0NCi0NCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndyYXAuc2VpLkRvY0xpdFdyYXAjdHdvV2F5SG9sZGVyKGphdmF4LnhtbC53cy5Ib2xkZXIsIGphdmF4LnhtbC53cy5Ib2xkZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoSG9sZGVyPFN0cmluZz4gdHdvV2F5SG9sZGVyU3RyLA0KLQkJCUhvbGRlcjxJbnRlZ2VyPiB0d29XYXlIb2xkZXJJbnQpIHsNCi0NCi0JCXR3b1dheUhvbGRlckludC52YWx1ZSA9IDEwOw0KLQkJdHdvV2F5SG9sZGVyU3RyLnZhbHVlID0gIlJlc3BvbnNlIFN0cmluZyI7DQotDQotCX0NCi0NCi0gICAgICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcCN0d29XYXkoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIFN0cmluZyB0d29XYXkoU3RyaW5nIHR3b3dheVN0cikgew0KLSAgICAgICAgICAgIGlmICh0d293YXlTdHIuZXF1YWxzKCJKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3JTdGFydCIpKSB7DQotICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBtb25pdG9yIGFuZCBzdGFydCBtb25pdG9yaW5nDQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3Iuc2V0TW9uaXRvcmluZyh0cnVlKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuICJKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3JTdGFydCI7DQotICAgICAgICAgICAgfSBlbHNlIGlmICh0d293YXlTdHIuZXF1YWxzKCJKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3JFbmQiKSkgew0KLSAgICAgICAgICAgICAgICAvLyBFbmQgbW9uaXRvcmluZy4NCi0gICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLnNldE1vbml0b3JpbmcoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvckVuZCI7DQotICAgICAgICAgICAgfSBlbHNlIGlmICh0d293YXlTdHIuZXF1YWxzKCJKQVhCQ3VzdG9tQnVpbGRlckNsaWVudCIpKSB7DQotICAgICAgICAgICAgICAgIC8vIENsZWFyIG1vbml0b3Igc28gdGhhdCBjaGFuZ2VzIG9uIHRoZSBjbGllbnQgY2FuIGJlIGRldGVjdGVkDQotICAgICAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5jbGVhcigpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gdHdvd2F5U3RyOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHdvd2F5U3RyLmVxdWFscygiSkFYQkN1c3RvbUJ1aWxkZXJTZXJ2ZXIxIikpIHsNCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVpbGRlcnMgZnJvbSB0aGUgbW9uaXRvcg0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gIiIgICsgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQnVpbGRlcnMoKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldFN0cjsNCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHR3b3dheVN0ci5lcXVhbHMoIkpBWEJDdXN0b21CdWlsZGVyU2VydmVyMiIpKSB7DQotICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGNyZWF0ZXMgZnJvbSB0aGUgbW9uaXRvcg0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gIiIgICsgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLmdldFRvdGFsQ3JlYXRlcygpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHdvd2F5U3RyLmVxdWFscygiSkFYQkN1c3RvbUJ1aWxkZXJGYXVsdCIpKSB7DQotICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBtb25pdG9yIHNvIHRoYXQgY2hhZ25lcyBvbiB0aGUgY2xpZW50IGNhbiBiZSBkZXRlY3RlZA0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuY2xlYXIoKTsNCi0gICAgICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGZvciB0aGlzIGlucHV0DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTeXN0ZW0gRmF1bHQgT2NjdXJyZWQiKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gbmV3IFN0cmluZygiQWNrbm93bGVkZ2VtZW50IDogUmVxdWVzdCBTdHJpbmcgcmVjZWl2ZWQgPSAiKyB0d293YXlTdHIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0U3RyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWkuRG9jTGl0V3JhcCNpbnZva2UoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIGludm9rZVN0cikgew0KLSAgICAgICAgICAgIHJldHVybiBpbnZva2VTdHI7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgSGVhZGVyUmVzcG9uc2UgaGVhZGVyKEhlYWRlciBwYXlsb2FkLCBIb2xkZXI8SGVhZGVyUGFydDA+IGhlYWRlcjAsIEhlYWRlclBhcnQxIGhlYWRlcjEpew0KLQ0KLSAgICAgICAgICAgIEhlYWRlclBhcnQwIGhwbz0gKEhlYWRlclBhcnQwKWhlYWRlcjAudmFsdWU7DQotICAgICAgICAgICAgaHBvID0gbmV3IEhlYWRlclBhcnQwKCk7DQotICAgICAgICAgICAgaHBvLnNldEhlYWRlclR5cGUoIkhlYWRlciBUeXBlIGZyb20gRW5kcG9pbnQgaW1wbGVtZW50YXRpb24iKTsNCi0gICAgICAgICAgICBoZWFkZXIwLnZhbHVlID0gaHBvOw0KLSAgICAgICAgICAgIC8vaHBvLnNldEhlYWRlclR5cGUoIiIpOw0KLSAgICAgICAgICAgIEhlYWRlclJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IEhlYWRlclJlc3BvbnNlKCk7DQotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0T3V0KDEwMDApOw0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZ1dTR0VOMShTdHJpbmcgaGVhZGVyVmFsdWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gaGVhZGVyVmFsdWU7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmdXU0dFTjIoU3RyaW5nIGRhdGEpIHsNCi0gICAgICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwL01FVEEtSU5GL2RvY2xpdHdyYXAud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3JhcC9NRVRBLUlORi9kb2NsaXR3cmFwLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMzg3ZjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwL01FVEEtSU5GL2RvY2xpdHdyYXAud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0id3JhcGphdmFiZWFudGVzdCINCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciPg0KLQ0KLQk8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6dG5zPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciDQotCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2UgLz4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25lV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZXdheV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9pbnQiDQotCQkJCQkJCXR5cGU9InhzZDppbnQiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5Ij4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b3dheV9zdHIiDQotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2Vfc3RyIg0KLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZVJldHVyblR5cGUiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciINCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQ0KLQkJCQ0KLQ0KLQkJCTwhLS0gZmluIG9wIGRlZmluaXRpb24gLS0+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9wIg0KLQkJCQkJCQl0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImZpbk9wUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiDQotCQkJCQkJCXR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW1vdW50IiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+DQotCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2l0aGRyYXciPg0KLQkJCQk8eHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+DQotCQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lbW8iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCQk8L3hzZDpleHRlbnNpb24+DQotCQkJCTwveHNkOmNvbXBsZXhDb250ZW50Pg0KLQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQ0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVwb3NpdCI+DQotCQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4NCi0JCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdHVzIg0KLQkJCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJCTwveHNkOmV4dGVuc2lvbj4NCi0JCQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclBhcnQwIj4NCi0JCQkJPHhzZDpjb21wbGV4VHlwZT4NCi0JCQkJCTx4c2Q6c2VxdWVuY2U+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlclR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0NCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyUGFydDEiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaGVhZGVyVHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXIiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW4iIHR5cGU9InhzZDpzdHJpbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im91dCIgdHlwZT0ieHNkOmxvbmciIC8+DQotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Imlub3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJoZWFkZXJSZXNwb25zZSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGU+DQotCQkJCQk8eHNkOnNlcXVlbmNlPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpsb25nIiAvPg0KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbm91dCIgdHlwZT0ieHNkOmludGVnZXIiIC8+DQotCQkJCQk8L3hzZDpzZXF1ZW5jZT4NCi0JCQkJPC94c2Q6Y29tcGxleFR5cGU+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1dTR0VOMSI+DQotCQkJCTx4c2Q6Y29tcGxleFR5cGUgLz4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPg0KLQkJCQkJPC94c2Q6c2VxdWVuY2U+DQotCQkJCTwveHNkOmNvbXBsZXhUeXBlPg0KLQkJCTwveHNkOmVsZW1lbnQ+DQotCQkJDQotCQkJPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdXU0dFTjIiPg0KLQkJCSAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLQkJCQkJPHhzZDpzZXF1ZW5jZT4NCi0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YSIgdHlwZT0ieHNkOnN0cmluZyIgLz4NCi0JCQkJCTwveHNkOnNlcXVlbmNlPg0KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4NCi0JCQk8L3hzZDplbGVtZW50Pg0KLQ0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiPg0KLQkJCQk8eHNkOmNvbXBsZXhUeXBlIC8+DQotCQkJPC94c2Q6ZWxlbWVudD4NCi0JCQkNCi0JCTwveHNkOnNjaGVtYT4NCi0JPC93c2RsOnR5cGVzPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVZvaWRSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXlWb2lkIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJvbmVXYXlSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXkiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQ0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVzcG9uc2UiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5IiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6aW52b2tlIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXF1ZXN0Ij4NCi0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcCIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9Im9wIiBlbGVtZW50PSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaGVhZGVyUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InBheWxvYWQiIGVsZW1lbnQ9InRuczpoZWFkZXIiIC8+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlcjAiIGVsZW1lbnQ9InRuczpoZWFkZXJQYXJ0MCIgLz4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyMSIgZWxlbWVudD0idG5zOmhlYWRlclBhcnQxIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0NCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJoZWFkZXJSZXNwb25zZSI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9InBheWxvYWQiIGVsZW1lbnQ9InRuczpoZWFkZXJSZXNwb25zZSIgLz4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iaGVhZGVyMCIgZWxlbWVudD0idG5zOmhlYWRlclBhcnQwIiAvPg0KLQk8L3dzZGw6bWVzc2FnZT4NCi0JDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMVJlcXVlc3QiPg0KLQkJPHdzZGw6cGFydCBuYW1lPSJib2R5UGFydCIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdXU0dFTjEiIC8+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclBhcnQiIGVsZW1lbnQ9InRuczpoZWFkZXJWYWx1ZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcnQiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiIC8+DQotCTwvd3NkbDptZXNzYWdlPg0KLQkNCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nV1NHRU4yUmVxdWVzdCI+DQotCQk8d3NkbDpwYXJ0IG5hbWU9ImJvZHlQYXJ0IiBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1dTR0VOMiIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotDQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIj4NCi0JCTx3c2RsOnBhcnQgbmFtZT0iYm9keVBhcnQiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiIC8+DQotCSAgICA8d3NkbDpwYXJ0IG5hbWU9ImhlYWRlclBhcnQiIGVsZW1lbnQ9InRuczpoZWFkZXJWYWx1ZSIgLz4NCi0JPC93c2RsOm1lc3NhZ2U+DQotCQ0KLQkNCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jTGl0V3JhcCI+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheVZvaWRSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXkiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlSZXF1ZXN0IiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6dHdvV2F5SG9sZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJoZWFkZXIiPg0KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpoZWFkZXJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aGVhZGVyUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPgkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4NCi0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotCQkNCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nV1NHRU4xIj4NCi0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMVJlcXVlc3QiIC8+DQotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiIC8+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMiI+DQotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXF1ZXN0IiAvPg0KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIiAvPg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JPC93c2RsOnBvcnRUeXBlPg0KLQ0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkRvY0xpdFdyYXAiDQotCQl0eXBlPSJ0bnM6RG9jTGl0V3JhcCI+DQotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCINCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlWb2lkIj4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheVZvaWQiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4NCi0JCQk8c29hcDpvcGVyYXRpb24NCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL29uZVdheSIgLz4NCi0JCQk8d3NkbDppbnB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+DQotCQkJPC93c2RsOmlucHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5SG9sZGVyIiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJoZWFkZXIiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvaGVhZGVyIiAvPg0KLSAgICAgICAgDQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpoZWFkZXJSZXF1ZXN0IiBwYXJ0PSJoZWFkZXIwIi8+CQkJDQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpoZWFkZXJSZXF1ZXN0IiBwYXJ0PSJoZWFkZXIxIi8+CQkJDQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBwYXJ0cz0icGF5bG9hZCIvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczpoZWFkZXJSZXNwb25zZSIgcGFydD0iaGVhZGVyMCIvPgkJCQ0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgcGFydHM9InBheWxvYWQiLz4JCQkNCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0NCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5IiAvPg0KLQkJCTx3c2RsOmlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4NCi0JCQk8L3dzZGw6b3V0cHV0Pg0KLQ0KLQkJPC93c2RsOm9wZXJhdGlvbj4NCi0JCQ0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy9pbnZva2UiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPg0KLQkJCTxzb2FwOm9wZXJhdGlvbg0KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvZmluT3AiIC8+DQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDppbnB1dD4NCi0JCQk8d3NkbDpvdXRwdXQ+DQotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPg0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotDQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMSI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nV1NHRU4xIiAvPg0KLSAgICAgICAgDQotCQkJPHdzZGw6aW5wdXQ+DQotCQkJCTxzb2FwOmhlYWRlciB1c2U9ImxpdGVyYWwiIG1lc3NhZ2U9InRuczplY2hvU3RyaW5nV1NHRU4xUmVxdWVzdCIgcGFydD0iaGVhZGVyUGFydCIvPgkJCQ0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjFSZXF1ZXN0IiBwYXJ0cz0iYm9keVBhcnQiLz4JCQkNCi0JCQk8L3dzZGw6aW5wdXQ+DQotCQkJPHdzZGw6b3V0cHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4JCQ0KLQkJCTwvd3NkbDpvdXRwdXQ+DQotCQk8L3dzZGw6b3BlcmF0aW9uPg0KLQkJDQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ1dTR0VOMiI+DQotCQkJPHNvYXA6b3BlcmF0aW9uDQotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nV1NHRU4yIiAvPg0KLSAgICAgICAgDQotCQkJPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4JDQotCQkJPC93c2RsOmlucHV0Pg0KLQkJCTx3c2RsOm91dHB1dD4NCi0JCQkgICAgPHNvYXA6aGVhZGVyIHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIgcGFydD0iaGVhZGVyUGFydCIvPgkJCQ0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIgcGFydHM9ImJvZHlQYXJ0Ii8+CQkJDQotCQkJPC93c2RsOm91dHB1dD4NCi0JCTwvd3NkbDpvcGVyYXRpb24+DQotDQotCTwvd3NkbDpiaW5kaW5nPg0KLQ0KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IkRvY0xpdFdyYXBTZXJ2aWNlIj4NCi0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOkRvY0xpdFdyYXAiDQotCQkJbmFtZT0iRG9jTGl0V3JhcFBvcnQiPg0KLQkJCTxzb2FwOmFkZHJlc3MNCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9Eb2NMaXRXcmFwU2VydmljZSIgLz4NCi0JCTwvd3NkbDpwb3J0Pg0KLQk8L3dzZGw6c2VydmljZT4NCi0NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwL3NlaS9Eb2NMaXRXcmFwLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvc2VpL0RvY0xpdFdyYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNDFhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvc2VpL0RvY0xpdFdyYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53cmFwLnNlaTsNCi0NCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuRmluYW5jaWFsT3BlcmF0aW9uOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXI7DQotaW1wb3J0IG9yZy50ZXN0LnNhbXBsZS53cmFwLkhlYWRlclBhcnQwOw0KLWltcG9ydCBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJQYXJ0MTsNCi1pbXBvcnQgb3JnLnRlc3Quc2FtcGxlLndyYXAuSGVhZGVyUmVzcG9uc2U7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRXcmFwIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIpDQotcHVibGljIGludGVyZmFjZSBEb2NMaXRXcmFwIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL3R3b1dheVJldHVybiIpDQotICAgIEBPbmV3YXkNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXlWb2lkIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5PbmVXYXlWb2lkIikNCi0gICAgcHVibGljIHZvaWQgb25lV2F5Vm9pZCgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvbmV3YXlTdHINCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAT25ld2F5DQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5PbmVXYXkiKQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvbmV3YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgb25ld2F5U3RyKTsNCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50DQotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJTdHINCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuVHdvV2F5SG9sZGVyIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5Ud29XYXlIb2xkZXIiKQ0KLSAgICBwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d29XYXlIb2xkZXJfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQ0KLSAgICAgICAgSG9sZGVyPFN0cmluZz4gdHdvV2F5SG9sZGVyU3RyLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxJbnRlZ2VyPiB0d29XYXlIb2xkZXJJbnQpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB0d293YXlTdHINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJldHVybl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLlR3b1dheSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLlJldHVyblR5cGUiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIHR3b1dheSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b3dheV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBpbnZva2VTdHINCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmcvdHdvV2F5UmV0dXJuIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJldHVybl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLkludm9rZSIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLlJldHVyblR5cGUiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBpbnZva2VTdHIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvcA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIG9yZy50ZXN0LnNhbXBsZS53cmFwLkZpbmFuY2lhbE9wZXJhdGlvbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnL2Zpbk9wIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLkZpbk9wIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3BSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRmluT3BSZXNwb25zZSIpDQotICAgIHB1YmxpYyBGaW5hbmNpYWxPcGVyYXRpb24gZmluT3AoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvcCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQ0KLSAgICAgICAgRmluYW5jaWFsT3BlcmF0aW9uIG9wKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGhlYWRlcjENCi0gICAgICogQHBhcmFtIGhlYWRlcjANCi0gICAgICogQHBhcmFtIHBheWxvYWQNCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBvcmcudGVzdC5zYW1wbGUud3JhcC5IZWFkZXJSZXNwb25zZQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2hlYWRlciIpDQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJoZWFkZXJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJwYXlsb2FkIikNCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0gICAgcHVibGljIEhlYWRlclJlc3BvbnNlIGhlYWRlcigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImhlYWRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBwYXJ0TmFtZSA9ICJwYXlsb2FkIikNCi0gICAgICAgIEhlYWRlciBwYXlsb2FkLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaGVhZGVyUGFydDAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgaGVhZGVyID0gdHJ1ZSwgbW9kZSA9IE1vZGUuSU5PVVQsIHBhcnROYW1lID0gImhlYWRlcjAiKQ0KLSAgICAgICAgSG9sZGVyPEhlYWRlclBhcnQwPiBoZWFkZXIwLA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaGVhZGVyUGFydDEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgaGVhZGVyID0gdHJ1ZSwgcGFydE5hbWUgPSAiaGVhZGVyMSIpDQotICAgICAgICBIZWFkZXJQYXJ0MSBoZWFkZXIxKTsNCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhlIFNPQVBCaW5kaW5nIGZvciB0aGlzIG1ldGhvZCB3aWxsIGRlZmF1bHQgdG8gd3JhcHBlZC4gIFllcyBXcmFwcGVkICENCi0gICAgICogSG93ZXZlciB0aGUgcGFyYW1ldGVyIGlzIGEgaGVhZGVyIHBhcmFtZXRlci4uLndoaWNoIHZpb2xhdGVzIHdyYXBwZWQgcnVsZXMuDQotICAgICAqIFVuZm9ydHVuYXRlbHkgV1NHRU4gY2FuIHByb2R1Y2UgdGhpcyBraW5kIG9mIHNpdHVhdGlvbi4uLnRodXMgd2UgbmVlZCB0byANCi0gICAgICogaGFuZGxlIGl0DQotICAgICAqIEBwYXJhbSBoZWFkZXJWYWx1ZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIFN0cmluZw0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmdXU0dFTjEiKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdXU0dFTjEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLkVjaG9TdHJpbmdXU0dFTjEiKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nV1NHRU4xUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLkVjaG9TdHJpbmdXU0dFTjFSZXNwb25zZSIpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZ1dTR0VOMSgNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImhlYWRlclZhbHVlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGhlYWRlciA9IHRydWUpDQotICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUNCi0gICAgKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGUgc2FtZSBhcyBlY2hvU3RyaW5nV1NHRU4xIGV4Y2VwdCB0aGF0IHRoZSByZXR1cm4gU3RyaW5nIGlzIGluIHRoZSBoZWFkZXINCi0gICAgICogQHBhcmFtIGRhdGENCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBTdHJpbmcNCi0gICAgICovDQotICAgIA0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vYWRkaGVhZGVycy5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZ1dTR0VOMiIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1dTR0VOMiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMiIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdXU0dFTjJSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMlJlc3BvbnNlIikNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImhlYWRlclZhbHVlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGhlYWRlciA9IHRydWUpDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZ1dTR0VOMigNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImRhdGEiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgICAgIFN0cmluZyBkYXRhDQotICAgICk7DQotICAgIA0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvc2VpL0RvY0xpdFdyYXBTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvc2VpL0RvY0xpdFdyYXBTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTdjODQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93cmFwL3NlaS9Eb2NMaXRXcmFwU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3JhcC5zZWk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkRvY0xpdFdyYXBTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJEb2NMaXQud3NkbCIpDQotcHVibGljIGNsYXNzIERvY0xpdFdyYXBTZXJ2aWNlDQotICAgIGV4dGVuZHMgU2VydmljZQ0KLXsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIERPQ0xJVFdSQVBTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dyYXAvTUVUQS1JTkYvZG9jbGl0d3JhcC53c2RsIjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgIAl0cnl7DQotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgCX1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAJfQ0KLSAgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgRE9DTElUV1JBUFNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRG9jTGl0V3JhcFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEb2NMaXRXcmFwU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKERPQ0xJVFdSQVBTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL3dyYXAuc2FtcGxlLnRlc3Qub3JnIiwgIkRvY0xpdFdyYXBTZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBEb2NMaXRXcmFwDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJEb2NMaXRXcmFwUG9ydCIpDQotICAgIHB1YmxpYyBEb2NMaXRXcmFwIGdldERvY0xpdFdyYXBQb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChEb2NMaXRXcmFwKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCAiRG9jTGl0V3JhcFBvcnQiKSwgRG9jTGl0V3JhcC5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9NRVRBLUlORi9XU0dlblNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vTUVUQS1JTkYvV1NHZW5TZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZGY0NzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9NRVRBLUlORi9XU0dlblNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIG5hbWU9IldTR2VuU2VydmljZSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+DQotICA8dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hPg0KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiBzY2hlbWFMb2NhdGlvbj0iV1NHZW5TZXJ2aWNlX3NjaGVtYTEueHNkIi8+DQotICAgIDwveHNkOnNjaGVtYT4NCi0gIDwvdHlwZXM+DQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nIj4NCi0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9TdHJpbmciLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIDxwb3J0VHlwZSBuYW1lPSJXU0dlbkludGVyZmFjZSI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgPC9wb3J0VHlwZT4NCi0gIDxiaW5kaW5nIG5hbWU9IldTR2VuUG9ydEJpbmRpbmciIHR5cGU9InRuczpXU0dlbkludGVyZmFjZSI+DQotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPg0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46RWNob1N0cmluZyIvPg0KLSAgICAgIDxpbnB1dD4NCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC9pbnB1dD4NCi0gICAgICA8b3V0cHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L291dHB1dD4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L2JpbmRpbmc+DQotICA8c2VydmljZSBuYW1lPSJXU0dlblNlcnZpY2UiPg0KLSAgICA8cG9ydCBuYW1lPSJXU0dlblBvcnQiIGJpbmRpbmc9InRuczpXU0dlblBvcnRCaW5kaW5nIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvV1NHZW5TZXJ2aWNlIi8+DQotICAgIDwvcG9ydD4NCi0gIDwvc2VydmljZT4NCi08L2RlZmluaXRpb25zPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vTUVUQS1JTkYvV1NHZW5TZXJ2aWNlX3NjaGVtYTEueHNkIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9NRVRBLUlORi9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWY3YmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9NRVRBLUlORi9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPg0KLQ0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyIgdHlwZT0ibnMxOmVjaG9TdHJpbmciIHhtbG5zOm5zMT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIi8+DQotDQotICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZWNob1N0cmluZyI+DQotICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi0NCi0gIDx4czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSIgdHlwZT0ibnMyOmVjaG9TdHJpbmdSZXNwb25zZSIgeG1sbnM6bnMyPSJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLz4NCi0NCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPg0KLSAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAgICA8L3hzOnNlcXVlbmNlPg0KLSAgPC94czpjb21wbGV4VHlwZT4NCi08L3hzOnNjaGVtYT4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9XU0dlbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5ZDAyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW47DQotDQotLy8gU0VSVkVSLVNJREUgQ0xBU1MNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uV1NHZW5JbnRlcmZhY2UiLA0KLSAgICAgICAgc2VydmljZU5hbWU9IldTR2VuU2VydmljZSIsDQotICAgICAgICBwb3J0TmFtZT0iV1NHZW5Qb3J0IiwNCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICApDQotcHVibGljIGNsYXNzIFdTR2VuSW1wbCBpbXBsZW1lbnRzIFdTR2VuSW50ZXJmYWNlIHsNCi0NCi0gICAgcHVibGljIFdTR2VuSW1wbCgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBhcmcwKSB7DQotICAgICAgICByZXR1cm4gYXJnMDsNCi0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW50ZXJmYWNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL1dTR2VuSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzRlOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9XU0dlbkludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW47DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLS8vaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi0vL2ltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIldTR2VuSW50ZXJmYWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotcHVibGljIGludGVyZmFjZSBXU0dlbkludGVyZmFjZSB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGFyZzANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJ1cm46RWNob1N0cmluZyIpDQotICAgIC8vQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgLy9AUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLndzZ2VuLkVjaG9TdHJpbmciKQ0KLSAgICAvL0BSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImVjaG9TdHJpbmdSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uRWNob1N0cmluZ1Jlc3BvbnNlIikNCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKA0KLSAgICAgICAgLy9AV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgYXJnMCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vY2xpZW50L1dTR2VuSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGNkNTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5jbGllbnQ7DQotDQotLy8gU0VSVkVSLVNJREUgQ0xBU1MNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uV1NHZW5JbnRlcmZhY2UiLA0KLSAgICAgICAgc2VydmljZU5hbWU9IldTR2VuU2VydmljZSIsDQotICAgICAgICBwb3J0TmFtZT0iV1NHZW5Qb3J0IiwNCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICApDQotcHVibGljIGNsYXNzIFdTR2VuSW1wbCBpbXBsZW1lbnRzIFdTR2VuSW50ZXJmYWNlIHsNCi0NCi0gICAgcHVibGljIFdTR2VuSW1wbCgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBhcmcwKSB7DQotICAgICAgICByZXR1cm4gYXJnMDsNCi0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlbkludGVyZmFjZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5JbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiZDVlYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2NsaWVudC9XU0dlbkludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4NCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MNCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMA0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiV1NHZW5JbnRlcmZhY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi1wdWJsaWMgaW50ZXJmYWNlIFdTR2VuSW50ZXJmYWNlIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInVybjpFY2hvU3RyaW5nIikNCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5qYXh3cy5FY2hvU3RyaW5nIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5qYXh3cy5FY2hvU3RyaW5nUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoDQotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcwIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpDQotICAgICAgICBTdHJpbmcgYXJnMCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vY2xpZW50L1dTR2VuU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTY3NTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9jbGllbnQvV1NHZW5TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIldTR2VuU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCB3c2RsTG9jYXRpb24gPSAiV1NHZW5TZXJ2aWNlLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBXU0dlblNlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgV1NHRU5TRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB3c2RsTG9jYXRpb249Ii90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL01FVEEtSU5GL1dTR2VuU2VydmljZS53c2RsIjsNCi0gICAgDQotICAgIHN0YXRpYyB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFdTR0VOU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBXU0dlblNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBXU0dlblNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihXU0dFTlNFUlZJQ0VfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiV1NHZW5TZXJ2aWNlIikpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBXU0dlbkludGVyZmFjZQ0KLSAgICAgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiV1NHZW5Qb3J0IikNCi0gICAgcHVibGljIFdTR2VuSW50ZXJmYWNlIGdldFdTR2VuUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiAoV1NHZW5JbnRlcmZhY2Upc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJXU0dlblBvcnQiKSwgV1NHZW5JbnRlcmZhY2UuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvd3NnZW4vamF4d3MvRWNob1N0cmluZy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9qYXh3cy9FY2hvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWMwNmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9qYXh3cy9FY2hvU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0NCi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS53c2dlbi5qYXh3czsNCi0NCi0vLyBTRVJWRVItU0lERSBDTEFTUw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJlY2hvU3RyaW5nIiwgbmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZWNob1N0cmluZyIsIG5hbWVzcGFjZSA9ICJodHRwOi8vd3NnZW4uc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBjbGFzcyBFY2hvU3RyaW5nIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJhcmcwIiwgbmFtZXNwYWNlID0gIiIpDQotICAgIHByaXZhdGUgU3RyaW5nIGFyZzA7DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBTdHJpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJnMCgpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmFyZzA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXJnMA0KLSAgICAgKiAgICAgdGhlIHZhbHVlIGZvciB0aGUgYXJnMCBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0QXJnMChTdHJpbmcgYXJnMCkgew0KLSAgICAgICAgdGhpcy5hcmcwID0gYXJnMDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2pheHdzL0VjaG9TdHJpbmdSZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS93c2dlbi9qYXh3cy9FY2hvU3RyaW5nUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjYzM1MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL3dzZ2VuL2pheHdzL0VjaG9TdHJpbmdSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUud3NnZW4uamF4d3M7DQotDQotLy8gU0VSVkVSLVNJREUgQ0xBU1MNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiZWNob1N0cmluZ1Jlc3BvbnNlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZWNob1N0cmluZ1Jlc3BvbnNlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpDQotcHVibGljIGNsYXNzIEVjaG9TdHJpbmdSZXNwb25zZSB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicmV0dXJuIiwgbmFtZXNwYWNlID0gIiIpDQotICAgIHByaXZhdGUgU3RyaW5nIF9yZXR1cm47DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcmV0dXJucyBTdHJpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0X3JldHVybigpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLl9yZXR1cm47DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gX3JldHVybg0KLSAgICAgKiAgICAgdGhlIHZhbHVlIGZvciB0aGUgX3JldHVybiBwcm9wZXJ0eQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0X3JldHVybihTdHJpbmcgX3JldHVybikgew0KLSAgICAgICAgdGhpcy5fcmV0dXJuID0gX3JldHVybjsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvQmFzaWNBdXRoU2VjdXJpdHlUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L0Jhc2ljQXV0aFNlY3VyaXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0OWY4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VjdXJpdHkvQmFzaWNBdXRoU2VjdXJpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VjdXJpdHk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotcHVibGljIGNsYXNzIEJhc2ljQXV0aFNlY3VyaXR5VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRVcmwgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0Jhc2ljQXV0aFNlY3VyaXR5U2VydmljZS5TaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCI7DQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZyA9ICI8aW52b2tlT3A+dGVzdCBpbnB1dDwvaW52b2tlT3A+IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBTRVJWSUNFX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBQT1JUX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJTaW1wbGVQcm92aWRlclNlcnZpY2VTT0FQMTFwb3J0MCIpOw0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBVU0VSX0lEID0gInRlc3RpZCI7DQotICAgIHByaXZhdGUgU3RyaW5nIFBBU1NXT1JEID0gInRlc3RpZCI7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShCYXNpY0F1dGhTZWN1cml0eVRlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0F1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKFNlcnZpY2UuTW9kZS5QQVlMT0FELA0KLSAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50VXJsLA0KLSAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0gICAgICAgIFN0cmluZyByZXRWYWwgPSBkaXNwYXRjaC5pbnZva2UoeG1sU3RyaW5nKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXNwb25zZSBbIiArIHJldFZhbCArICJdIik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmV0VmFsICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHJldFZhbCA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJpbmcpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXRWYWwgIT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0F1dGhfdWlkX3B3ZCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goU2VydmljZS5Nb2RlLlBBWUxPQUQsDQotICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVcmwsDQotICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKTsNCi0gICAgICAgIA0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlVTRVJOQU1FX1BST1BFUlRZLCBVU0VSX0lEKTsNCi0JCWRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSwgUEFTU1dPUkQpOw0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEludm9raW5nIERpc3BhdGNoPFN0cmluZz4gQmFzaWNBdXRoU2VjdXJpdHlTZXJ2aWNlIik7DQotICAgICAgICBTdHJpbmcgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyByZXRWYWwgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJldFZhbCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0gICAgICAgIHJldFZhbCA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJpbmcpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXRWYWwgIT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0F1dGhfdWlkKCl0aHJvd3MgRXhjZXB0aW9uew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goU2VydmljZS5Nb2RlLlBBWUxPQUQsDQotICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVcmwsDQotICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKTsNCi0gICAgICAgIA0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlVTRVJOQU1FX1BST1BFUlRZLCBVU0VSX0lEKTsNCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBEaXNwYXRjaDxTdHJpbmc+IEJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIpOw0KLSAgICAgICAgU3RyaW5nIHJldFZhbCA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJpbmcpOw0KLSAgICAgICAJVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSW52b2tlIGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0gICAgICAgIHJldFZhbCA9IGRpc3BhdGNoLmludm9rZSh4bWxTdHJpbmcpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXV0aF9wd2QoKXRocm93cyBFeGNlcHRpb257DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygidGVzdDogIiArIGdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaChTZXJ2aWNlLk1vZGUuUEFZTE9BRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFVybCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpOw0KLQ0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlBBU1NXT1JEX1BST1BFUlRZLCBQQVNTV09SRCk7DQotDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0NCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTdHJpbmcgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0NCi0gICAgICAgICAgICBmYWlsKCJTZXQgUEFTU1dPUkQgd2l0aCBubyBVU0VSSUQ6IFdlYlNlcnZpY2VFeGNlcHRpb24gaXMgZXhwZWN0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhnZXROYW1lKCkgKyAiOiAiICsgd3NlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgRGlzcGF0Y2g8U3RyaW5nPiBCYXNpY0F1dGhTZWN1cml0eVNlcnZpY2UiKTsNCi0NCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBTdHJpbmcgcmV0VmFsID0gZGlzcGF0Y2guaW52b2tlKHhtbFN0cmluZyk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IFJlc3BvbnNlIFsiICsgcmV0VmFsICsgIl0iKTsNCi0NCi0gICAgICAgICAgICBmYWlsKCJTZXQgUEFTU1dPUkQgd2l0aCBubyBVU0VSSUQ6IFdlYlNlcnZpY2VFeGNlcHRpb24gaXMgZXhwZWN0ZWQiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKXsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhnZXROYW1lKCkgKyAiOiAiICsgd3NlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0JLyoqDQotCSAqIEF1eGlsaWFyeSBtZXRob2QsIGdlbmVyYXRlcyBhIERpc3BhdGNoIG9iamVjdCBvbiBkZW1hbmQNCi0JICogDQotCSAqIEBwYXJhbSBtb2RlDQotCSAqICAgICAgICAgICAgU2VydmljZS5Nb2RlDQotCSAqIEBwYXJhbSBlbmRwb2ludA0KLQkgKiAgICAgICAgICAgIGVuZHBvaW50IGFkZHJlc3MNCi0JICogQHBhcmFtIGJpbmRpbmcNCi0JICogICAgICAgICAgICBiaW5kaW5nIHR5cGUNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHJpdmF0ZSBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKFNlcnZpY2UuTW9kZSBtb2RlLCBTdHJpbmcgZW5kcG9pbnQsU3RyaW5nIGJpbmRpbmcpIHsNCi0JCQ0KLQkJU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoU0VSVklDRV9RTkFNRSk7DQotCQkNCi0JCXNlcnZpY2UuYWRkUG9ydChQT1JUX1FOQU1FLCBiaW5kaW5nLCBlbmRwb2ludCk7DQotCQlqYXZheC54bWwud3MuRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUE9SVF9RTkFNRSwgU3RyaW5nLmNsYXNzLG1vZGUpOw0KLQ0KLQkJYXNzZXJ0Tm90TnVsbCgiRGlzcGF0Y2ggbm90IG51bGwiLCBkaXNwYXRjaCk7DQotDQotCQlyZXR1cm4gZGlzcGF0Y2g7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZWN1cml0eS9zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGI1NjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZWN1cml0eS9zZXJ2ZXIvU2VjdXJpdHlQcm92aWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9TZWN1cml0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNWFiMDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlY3VyaXR5L3NlcnZlci9TZWN1cml0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlY3VyaXR5LnNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IkJhc2ljQXV0aFNlY3VyaXR5U2VydmljZSIscG9ydE5hbWU9IlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXNwb25zZUdvb2QgPSAiPHByb3ZpZGVyPjxtZXNzYWdlPnJlcXVlc3QgcHJvY2Vzc2VkPC9tZXNzYWdlPjwvcHJvdmlkZXI+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlc3BvbnNlQmFkICA9ICI8cHJvdmlkZXI+PG1lc3NhZ2U+RVJST1I6bnVsbCByZXF1ZXN0IHJlY2VpdmVkPC9tZXNzYWdlPjxwcm92aWRlcj4iOw0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgew0KLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IChTdHJpbmcpIG9iajsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU3RyaW5nUHJvdmlkZXIgcmVjZWl2ZWQgYSBuZXcgcmVxdWVzdCIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiByZXF1ZXN0IFsiICsgc3RyICsgIl0iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VHb29kOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IEVSUk9SOm51bGwgcmVxdWVzdCByZWNlaXZlZCIpOw0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlQmFkOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zd2FtdG9tL1NXQU1UT01UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vU1dBTVRPTVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzI1OGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vU1dBTVRPTVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqL3BhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zd2FtdG9tOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotLyoqDQotICogVGVzdHMgY2FsbGluZyBhbiBlbmRwb2ludCB0aGF0IGhhcyBvbmUgb3BlcmF0aW9uIHRoYXQNCi0gKiB1c2VzIGFuIE1UT00gYXR0YWNobWVudCBhbmQgYW5vdGhlciBvcGVyYXRpb24gdGhhdCB1c2VzIGEgU1dBDQotICogYXR0YWNobWVudC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU1dBTVRPTVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1NFUlZJQ0UgPSBuZXcgUU5hbWUoImh0dHA6Ly9zd2FtdG9tc2VydmljZS50ZXN0Lm9yZyIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTV0FNVE9NU2VydmljZSIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9QT1JUICAgID0gbmV3IFFOYW1lKCJodHRwOi8vc3dhbXRvbXNlcnZpY2UudGVzdC5vcmciLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1dBTVRPTVBvcnRUeXBlUG9ydCIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORFBPSU5UID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9TV0FNVE9NU2VydmljZS5TV0FNVE9NUG9ydFR5cGVQb3J0IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShTV0FNVE9NVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBnZXREaXNwYXRjaChTdHJpbmcgc29hcEFjdGlvbikgew0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoUU5BTUVfU0VSVklDRSk7DQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUU5BTUVfUE9SVCwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBVUkxfRU5EUE9JTlQpOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZS5Nb2RlLk1FU1NBR0UpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIHAgPSAoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaDsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIFVSTF9FTkRQT0lOVCk7DQotICAgICAgICBwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsNCi0gICAgICAgIHAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLCBzb2FwQWN0aW9uKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdHMgY2FsbGluZyBhbiBlbmRwb2ludCB0aGF0IHVuZGVyc3RhbmRzIFNPQVAgMS4xIE1UT00NCi0gICAgICogSG93ZXZlciB3ZSBhcmUgY2FsbGluZyBhbiBvcGVyYXRpb24gb24gdGhlIGVuZHBvaW50IHRoYXQgDQotICAgICAqIHBhc3MgYSBzaW5nbGUgU1dBIGF0dGFjaG1lbnQgYXMgYSByZXF1ZXN0IGFuZCBleHBlY3RzIGEgDQotICAgICAqIHNpbmdsZSBTV0EgYXR0YWNobWVudCBhcyBhIHJlc3BvbnNlLiAgKFRoZSBib2R5IGNvbnRlbnRzIGFyZSBlbXB0eS4pDQotICAgICAqIA0KLSAgICAgKiBUaGlzIHRlc3QgYWNjb21wbGlzaGVzIHRoZSBmb2xsb3dpbmc6DQotICAgICAqICAgLSBlbnN1cmVzIHRoYXQgYSBTV0EgYXR0YWNobWVudCAobm90IGFuIE1UT00gYXR0YWNobWVudCkgaXMgc2VudC4NCi0gICAgICogICAtIGVuc3VyZXMgdGhhdCBhIFNXQSBhdHRhY2htZW50IGNhbiBiZSBzZW50IGFuZCByZXR1cm5lZCBmcm9tIA0KLSAgICAgKiAgICAgYW4gZW5kcG9pbnQgdGhhdCBoYXMgTVRPTSBlbmFibGVkLg0KLSAgICAgKiAgIC0gZW5zdXJlcyB0aGF0IHRoZSBEQkMgY29ycmVjdGx5IG1hcmtzIHRoZSBvcGVyYXRpb24gYW5kIHBhcmFtZXRlcnMNCi0gICAgICogICAgIHN1Y2ggdGhhdCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBvcGVyYXRpb24gYXJlIG1hcHBlZA0KLSAgICAgKiAgICAgdG8gU1dBIGF0dGFjaG1lbnRzLg0KLSAgICAgKiAgIC0gZW5zdXJlcyB0aGF0IHRoZSBtYXJzaGFsbGluZyBjb2RlIGNhbiBoYW5kbGUgdGhlIGNhc2Ugb2YgYW4gDQotICAgICAqICAgICBlbXB0eSBzb2FwIGJvZHkgYW5kIGFsbCBjb21tdW5pY2F0aW9uIHZpYSBTV0EgYXR0YWNobWVudHMuDQotICAgICAqICAgICANCi0gICAgICogVGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCB0aGUgdG9sZXJhdGlvbiBvZiB0aGUgYXR0YWNobWVudHMgd2l0aCBsZWdhY3kgKHByZSBXUy1JIDEuMCkgY29udGVudCBpZHMuDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1dBQXR0YWNobWVudHNfTGVnYWN5Q29udGVudElEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9ICJzd2FBdHRhY2htZW50IjsNCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKHNvYXBBY3Rpb24pOw0KLQ0KLSAgICAgICAgLy8gT2J0YWluIGEgcHJlY29uZmlndXJlZCBTQUFKIE1lc3NhZ2VGYWN0b3J5DQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsNCi0NCi0gICAgICAgIC8vIHNvYXA6Ym9keSBzaG91bGQgYmUgZW1wdHkNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByZXF1ZXN0LmdldFNPQVBCb2R5KCk7DQotDQotICAgICAgICAvLyBhZGQgYXR0YWNobWVudA0KLSAgICAgICAgaW50IGF0dGFjaG1lbnRTaXplID0gMTAwOw0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYXR0YWNobWVudFNpemVdOw0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpICgnYScgKyAoJ3onIC0gJ2EnKSAqIE1hdGgucmFuZG9tKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7DQotICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50ID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydCgpOw0KLSAgICAgICAgLy8gUGVyIFdTSSBTcGVjdCwgdGhlIHN3YSBjb250ZW50IGlkIG11c3Qgc3RhcnQgd2l0aCB0aGUgcGFydCBuYW1lDQotICAgICAgICAvL2h0dHA6Ly93d3cud3MtaS5vcmcvUHJvZmlsZXMvQXR0YWNobWVudHNQcm9maWxlLTEuMC5odG1sI1ZhbHVlLXNwYWNlX29mX0NvbnRlbnQtSWRfSGVhZGVyDQotICAgICAgICBhdHRhY2htZW50LnNldENvbnRlbnRJZCgiU1dBTVRPTVRlc3RTT0FQTWVzc2FnZSIpOw0KLSAgICAgICAgYXR0YWNobWVudC5hZGRNaW1lSGVhZGVyKCJGVlQtc291cmNlIiwgIlNUUl9CT0RZX0VMRU1FTlRfMSIpOw0KLSAgICAgICAgYXR0YWNobWVudC5zZXRSYXdDb250ZW50KGJhaXMsICJ0ZXh0L3BsYWluIik7DQotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGF0dGFjaG1lbnQpOw0KLQ0KLSAgICAgICAgLy8gaW52b2tlDQotICAgICAgICBTT0FQTWVzc2FnZSByZXBseSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNobWVudHMsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZQ0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSByZXBseS5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBtb3JlIHRoZW4gMSBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQQm9keSBzYiA9IHJlcGx5LmdldFNPQVBCb2R5KCk7DQotICAgICAgICBpZiAoc2IuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGZhaWwoIk1lc3NhZ2UgY29udGFpbnMgc29hcDpib2R5IHBheWxvYWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJ5dGVzID0gYXAuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IGVuZHBvaW50IGhhcyBiZWVuIGFibGUgdG8gbW9kaWZ5IHRoZSBhdHRhY2htZW50DQotICAgICAgICBpZiAoYnl0ZXNbMF0gIT0gJ1MnIHx8IGJ5dGVzWzFdICE9ICdXJyB8fCBieXRlc1syXSAhPSAnQScpIHsgDQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCByZWNlaXZlIGEgbW9kaWZpZWQgYXR0YWNobWVudCIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBJbnZva2UgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0NCi0gICAgICAgIC8vIGludm9rZQ0KLSAgICAgICAgcmVwbHkgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dGFjaG1lbnRzLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUNCi0gICAgICAgIGl0ID0gcmVwbHkuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGFwID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoKGFwID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCkpID09IG51bGwpew0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKGl0Lmhhc05leHQoKSl7DQotICAgICAgICAgICAgZmFpbCgiRGV0ZWN0ZWQgbW9yZSB0aGVuIDEgYXR0YWNobWVudCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgc2IgPSByZXBseS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgaWYgKHNiLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBmYWlsKCJNZXNzYWdlIGNvbnRhaW5zIHNvYXA6Ym9keSBwYXlsb2FkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBieXRlcyA9IGFwLmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAwKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgZW1wdHkiKTsgDQotICAgICAgICB9DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCBlbmRwb2ludCBoYXMgYmVlbiBhYmxlIHRvIG1vZGlmeSB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgaWYgKGJ5dGVzWzBdICE9ICdTJyB8fCBieXRlc1sxXSAhPSAnVycgfHwgYnl0ZXNbMl0gIT0gJ0EnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgcmVjZWl2ZSBhIG1vZGlmaWVkIGF0dGFjaG1lbnQiKTsgDQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyBjYWxsaW5nIGFuIGVuZHBvaW50IHRoYXQgdW5kZXJzdGFuZHMgU09BUCAxLjEgTVRPTQ0KLSAgICAgKiBIb3dldmVyIHdlIGFyZSBjYWxsaW5nIGFuIG9wZXJhdGlvbiBvbiB0aGUgZW5kcG9pbnQgdGhhdCANCi0gICAgICogcGFzcyBhIHNpbmdsZSBTV0EgYXR0YWNobWVudCBhcyBhIHJlcXVlc3QgYW5kIGV4cGVjdHMgYSANCi0gICAgICogc2luZ2xlIFNXQSBhdHRhY2htZW50IGFzIGEgcmVzcG9uc2UuICAoVGhlIGJvZHkgY29udGVudHMgYXJlIGVtcHR5LikNCi0gICAgICogDQotICAgICAqIFRoaXMgdGVzdCBhY2NvbXBsaXNoZXMgdGhlIGZvbGxvd2luZzoNCi0gICAgICogICAtIGVuc3VyZXMgdGhhdCBhIFNXQSBhdHRhY2htZW50IChub3QgYW4gTVRPTSBhdHRhY2htZW50KSBpcyBzZW50Lg0KLSAgICAgKiAgIC0gZW5zdXJlcyB0aGF0IGEgU1dBIGF0dGFjaG1lbnQgY2FuIGJlIHNlbnQgYW5kIHJldHVybmVkIGZyb20gDQotICAgICAqICAgICBhbiBlbmRwb2ludCB0aGF0IGhhcyBNVE9NIGVuYWJsZWQuDQotICAgICAqICAgLSBlbnN1cmVzIHRoYXQgdGhlIERCQyBjb3JyZWN0bHkgbWFya3MgdGhlIG9wZXJhdGlvbiBhbmQgcGFyYW1ldGVycw0KLSAgICAgKiAgICAgc3VjaCB0aGF0IGFsbCBvZiB0aGUgcGFyYW1ldGVycyB0byB0aGlzIG9wZXJhdGlvbiBhcmUgbWFwcGVkDQotICAgICAqICAgICB0byBTV0EgYXR0YWNobWVudHMuDQotICAgICAqICAgLSBlbnN1cmVzIHRoYXQgdGhlIG1hcnNoYWxsaW5nIGNvZGUgY2FuIGhhbmRsZSB0aGUgY2FzZSBvZiBhbiANCi0gICAgICogICAgIGVtcHR5IHNvYXAgYm9keSBhbmQgYWxsIGNvbW11bmljYXRpb24gdmlhIFNXQSBhdHRhY2htZW50cy4NCi0gICAgICogICAgIA0KLSAgICAgKiBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHRoZSBlbmRwb2ludCBjYW4gcmVjZWl2ZSBhbmQgcmV0dXJuIGNvbXBsaWFudCAocHJlIFdTLUkgMS4wKSBjb250ZW50IGlkcy4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTV0FBdHRhY2htZW50c19XU0koKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gInN3YUF0dGFjaG1lbnQiOw0KLSAgICAgICAgRGlzcGF0Y2g8U09BUE1lc3NhZ2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goc29hcEFjdGlvbik7DQotDQotICAgICAgICAvLyBPYnRhaW4gYSBwcmVjb25maWd1cmVkIFNBQUogTWVzc2FnZUZhY3RvcnkNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOw0KLQ0KLSAgICAgICAgLy8gc29hcDpib2R5IHNob3VsZCBiZSBlbXB0eQ0KLSAgICAgICAgU09BUEJvZHkgYm9keSA9IHJlcXVlc3QuZ2V0U09BUEJvZHkoKTsNCi0NCi0gICAgICAgIC8vIGFkZCBhdHRhY2htZW50DQotICAgICAgICBpbnQgYXR0YWNobWVudFNpemUgPSAxMDA7DQotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVthdHRhY2htZW50U2l6ZV07DQotDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgKCdhJyArICgneicgLSAnYScpICogTWF0aC5yYW5kb20oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7DQotICAgICAgICAvLyBQZXIgV1NJIFNwZWN0LCB0aGUgc3dhIGNvbnRlbnQgaWQgbXVzdCBzdGFydCB3aXRoIHRoZSBwYXJ0IG5hbWUNCi0gICAgICAgIC8vaHR0cDovL3d3dy53cy1pLm9yZy9Qcm9maWxlcy9BdHRhY2htZW50c1Byb2ZpbGUtMS4wLmh0bWwjVmFsdWUtc3BhY2Vfb2ZfQ29udGVudC1JZF9IZWFkZXINCi0gICAgICAgIGF0dGFjaG1lbnQuc2V0Q29udGVudElkKCJqcGVnSW1hZ2VSZXF1ZXN0PVNXQU1UT01UZXN0U09BUE1lc3NhZ2UiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQuYWRkTWltZUhlYWRlcigiRlZULXNvdXJjZSIsICJTVFJfQk9EWV9FTEVNRU5UXzEiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQuc2V0UmF3Q29udGVudChiYWlzLCAidGV4dC9wbGFpbiIpOw0KLSAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhdHRhY2htZW50KTsNCi0NCi0gICAgICAgIC8vIGludm9rZQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVwbHkgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dGFjaG1lbnRzLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUNCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVwbHkuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoKGFwID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCkpID09IG51bGwpew0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaWQgc3RhcnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIFNXQSBuYW1lDQotICAgICAgICBpZiAoIWFwLmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZVJlc3BvbnNlPSIpKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgY29udGVudCBpZCB0byBzdGFydCB3aXRoIGpwZWdJbWFnZVJlc3BvbnNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKGl0Lmhhc05leHQoKSl7DQotICAgICAgICAgICAgZmFpbCgiRGV0ZWN0ZWQgbW9yZSB0aGVuIDEgYXR0YWNobWVudCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU09BUEJvZHkgc2IgPSByZXBseS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgaWYgKHNiLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBmYWlsKCJNZXNzYWdlIGNvbnRhaW5zIHNvYXA6Ym9keSBwYXlsb2FkIik7DQotICAgICAgICB9DQotDQotICAgICAgICBieXRlcyA9IGFwLmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAwKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgZW1wdHkiKTsgDQotICAgICAgICB9DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCBlbmRwb2ludCBoYXMgYmVlbiBhYmxlIHRvIG1vZGlmeSB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgaWYgKGJ5dGVzWzBdICE9ICdTJyB8fCBieXRlc1sxXSAhPSAnVycgfHwgYnl0ZXNbMl0gIT0gJ0EnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgcmVjZWl2ZSBhIG1vZGlmaWVkIGF0dGFjaG1lbnQiKTsgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLQ0KLSAgICAgICAgLy8gaW52b2tlDQotICAgICAgICByZXBseSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0NCi0gICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgYXR0YWNobWVudHMsIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZQ0KLSAgICAgICAgaXQgPSByZXBseS5nZXRBdHRhY2htZW50cygpOw0KLSAgICAgICAgYXAgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXAgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXAuZ2V0Q29udGVudElkKCkuc3RhcnRzV2l0aCgianBlZ0ltYWdlUmVzcG9uc2U9IikpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBjb250ZW50IGlkIHRvIHN0YXJ0IHdpdGgganBlZ0ltYWdlUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBhdHRhY2htZW50IGlzIG5vdCBudWxsIG9yIGVtcHR5DQotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBtb3JlIHRoZW4gMSBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBzYiA9IHJlcGx5LmdldFNPQVBCb2R5KCk7DQotICAgICAgICBpZiAoc2IuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGZhaWwoIk1lc3NhZ2UgY29udGFpbnMgc29hcDpib2R5IHBheWxvYWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJ5dGVzID0gYXAuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IGVuZHBvaW50IGhhcyBiZWVuIGFibGUgdG8gbW9kaWZ5IHRoZSBhdHRhY2htZW50DQotICAgICAgICBpZiAoYnl0ZXNbMF0gIT0gJ1MnIHx8IGJ5dGVzWzFdICE9ICdXJyB8fCBieXRlc1syXSAhPSAnQScpIHsgDQotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCByZWNlaXZlIGEgbW9kaWZpZWQgYXR0YWNobWVudCIpOyANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE5vdyBpbnZva2UgdGhlIG1lc3NhZ2UgdGhlIGEgcmVjZWl2ZXMgYW5kIHJldHVybnMgMiBhdHRhY2htZW50cw0KLSAgICAgKiANCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTV0FBdHRhY2htZW50czJfV1NJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9ICJzd2FBdHRhY2htZW50MiI7DQotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaChzb2FwQWN0aW9uKTsNCi0NCi0gICAgICAgIC8vIE9idGFpbiBhIHByZWNvbmZpZ3VyZWQgU0FBSiBNZXNzYWdlRmFjdG9yeQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7DQotDQotICAgICAgICAvLyBzb2FwOmJvZHkgc2hvdWxkIGJlIGVtcHR5DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gcmVxdWVzdC5nZXRTT0FQQm9keSgpOw0KLQ0KLSAgICAgICAgLy8gY3JlYXRlIGF0dGFjaG1lbnRzIDEgYW5kIDINCi0gICAgICAgIGJ5dGVbXSBieXRlczEgPSBuZXcgYnl0ZVsxXTsNCi0gICAgICAgIGJ5dGVzMVswXSA9ICcxJzsNCi0gICAgICAgIGJ5dGVbXSBieXRlczIgPSBuZXcgYnl0ZVsxXTsNCi0gICAgICAgIGJ5dGVzMlswXSA9ICcyJzsNCi0NCi0gICAgICAgIC8vIFRoZSBhdHRhY2htZW50cyBhcmUgc2VudCBvdXQgb2Ygb3JkZXIuDQotICAgICAgICAvLyBUaGUgcmVjZWl2ZXIgc2hvdWxkIGJlIHNtYXJ0IGVub3VnaCB0byB1c2UgdGhlIGNvbnRlbnQgaWQNCi0gICAgICAgIC8vIHRvIGVzdGFibGlzaCB0aGUgY29ycmVjdCBvcmRlcg0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMyKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQyID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydCgpOw0KLSAgICAgICAgYXR0YWNobWVudDIuc2V0Q29udGVudElkKCJqcGVnSW1hZ2UyUmVxdWVzdD1TV0FNVE9NVGVzdFNPQVBNZXNzYWdlIik7DQotICAgICAgICBhdHRhY2htZW50Mi5hZGRNaW1lSGVhZGVyKCJGVlQtc291cmNlIiwgIlNUUl9CT0RZX0VMRU1FTlRfMSIpOw0KLSAgICAgICAgYXR0YWNobWVudDIuc2V0UmF3Q29udGVudChiYWlzMiwgInRleHQvcGxhaW4iKTsNCi0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudDIpOw0KLSAgICAgICAgDQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzMSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczEpOw0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudDEgPSByZXF1ZXN0LmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7DQotICAgICAgICBhdHRhY2htZW50MS5zZXRDb250ZW50SWQoImpwZWdJbWFnZTFSZXF1ZXN0PVNXQU1UT01UZXN0U09BUE1lc3NhZ2UiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQxLmFkZE1pbWVIZWFkZXIoIkZWVC1zb3VyY2UiLCAiU1RSX0JPRFlfRUxFTUVOVF8xIik7DQotICAgICAgICBhdHRhY2htZW50MS5zZXRSYXdDb250ZW50KGJhaXMxLCAidGV4dC9wbGFpbiIpOw0KLSAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChhdHRhY2htZW50MSk7DQotDQotICAgICAgICAvLyBpbnZva2UNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlcGx5ID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBhdHRhY2htZW50cywgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lDQotICAgICAgICBJdGVyYXRvciBpdCA9IHJlcGx5LmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBBdHRhY2htZW50UGFydCBhcDMgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXAzID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCkpID09IG51bGwpew0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaWQgc3RhcnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIFNXQSBuYW1lDQotICAgICAgICBpZiAoIWFwMy5nZXRDb250ZW50SWQoKS5zdGFydHNXaXRoKCJqcGVnSW1hZ2UxUmVzcG9uc2U9IikpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBjb250ZW50IGlkIHRvIHN0YXJ0IHdpdGgganBlZ0ltYWdlMVJlc3BvbnNlIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwNCA9IG51bGw7DQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc2Vjb25kIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXA0ID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCkpID09IG51bGwpew0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaWQgc3RhcnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIFNXQSBuYW1lDQotICAgICAgICBpZiAoIWFwNC5nZXRDb250ZW50SWQoKS5zdGFydHNXaXRoKCJqcGVnSW1hZ2UyUmVzcG9uc2U9IikpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBjb250ZW50IGlkIHRvIHN0YXJ0IHdpdGgganBlZ0ltYWdlMlJlc3BvbnNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBtb3JlIHRoZW4gMiBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBTT0FQQm9keSBzYiA9IHJlcGx5LmdldFNPQVBCb2R5KCk7DQotICAgICAgICBpZiAoc2IuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGZhaWwoIk1lc3NhZ2UgY29udGFpbnMgc29hcDpib2R5IHBheWxvYWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJ5dGVbXSBieXRlczMgPSBhcDMuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXMzLmxlbmd0aCA9PSAwKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgZW1wdHkiKTsgDQotICAgICAgICB9DQotICAgICAgICBpZiAoYnl0ZXMzWzBdICE9ICczJykgeyANCi0gICAgICAgICAgICBmYWlsKCJUaGUgcmVzcG9uc2UgYXR0YWNobWVudCBpcyBub3QgY29ycmVjdCIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzNCA9IGFwNC5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlczQubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChieXRlczRbMF0gIT0gJzQnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIlRoZSByZXNwb25zZSBhdHRhY2htZW50IGlzIG5vdCBjb3JyZWN0Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgcmVwbHkgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dGFjaG1lbnRzLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUNCi0gICAgICAgIGl0ID0gcmVwbHkuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIGFwMyA9IG51bGw7DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDMgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXAzLmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTFSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UxUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXA0ID0gbnVsbDsNCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDQgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXA0LmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTJSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UyUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIG1vcmUgdGhlbiAyIGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHNiID0gcmVwbHkuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGlmIChzYi5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgZmFpbCgiTWVzc2FnZSBjb250YWlucyBzb2FwOmJvZHkgcGF5bG9hZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYnl0ZXMzID0gYXAzLmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzMy5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJ5dGVzM1swXSAhPSAnMycpIHsgDQotICAgICAgICAgICAgZmFpbCgiVGhlIHJlc3BvbnNlIGF0dGFjaG1lbnQgaXMgbm90IGNvcnJlY3QiKTsgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGJ5dGVzNCA9IGFwNC5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlczQubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChieXRlczRbMF0gIT0gJzQnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIlRoZSByZXNwb25zZSBhdHRhY2htZW50IGlzIG5vdCBjb3JyZWN0Iik7IA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogTm93IGludm9rZSB0aGUgbWVzc2FnZSB0aGUgYSByZWNlaXZlcyBhbmQgcmV0dXJucyAyIGF0dGFjaG1lbnRzLA0KLSAgICAgKiBidXQgdGhlIHJlcXVlc3QgYXR0YWNobWVudHMgZG9uJ3QgY29tcGx5IHdpdGggd3NpDQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNXQUF0dGFjaG1lbnRzMl9MZWdhY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gInN3YUF0dGFjaG1lbnQyIjsNCi0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKHNvYXBBY3Rpb24pOw0KLQ0KLSAgICAgICAgLy8gT2J0YWluIGEgcHJlY29uZmlndXJlZCBTQUFKIE1lc3NhZ2VGYWN0b3J5DQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsNCi0NCi0gICAgICAgIC8vIHNvYXA6Ym9keSBzaG91bGQgYmUgZW1wdHkNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByZXF1ZXN0LmdldFNPQVBCb2R5KCk7DQotDQotICAgICAgICAvLyBjcmVhdGUgYXR0YWNobWVudHMgMSBhbmQgMg0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzMSA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgYnl0ZXMxWzBdID0gJzEnOw0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzMiA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgYnl0ZXMyWzBdID0gJzInOw0KLQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMxKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQxID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydCgpOw0KLSAgICAgICAgYXR0YWNobWVudDEuc2V0Q29udGVudElkKCJub3RDb21wbGlhbnQxU1dBTVRPTVRlc3RTT0FQTWVzc2FnZSIpOw0KLSAgICAgICAgYXR0YWNobWVudDEuYWRkTWltZUhlYWRlcigiRlZULXNvdXJjZSIsICJTVFJfQk9EWV9FTEVNRU5UXzEiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQxLnNldFJhd0NvbnRlbnQoYmFpczEsICJ0ZXh0L3BsYWluIik7DQotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGF0dGFjaG1lbnQxKTsNCi0gICAgICAgIA0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMyKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQyID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydCgpOw0KLSAgICAgICAgYXR0YWNobWVudDIuc2V0Q29udGVudElkKCJub3RDb21wbGlhbnQyU1dBTVRPTVRlc3RTT0FQTWVzc2FnZSIpOw0KLSAgICAgICAgYXR0YWNobWVudDIuYWRkTWltZUhlYWRlcigiRlZULXNvdXJjZSIsICJTVFJfQk9EWV9FTEVNRU5UXzEiKTsNCi0gICAgICAgIGF0dGFjaG1lbnQyLnNldFJhd0NvbnRlbnQoYmFpczIsICJ0ZXh0L3BsYWluIik7DQotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KGF0dGFjaG1lbnQyKTsNCi0NCi0gICAgICAgIC8vIGludm9rZQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgcmVwbHkgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotDQotICAgICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIGF0dGFjaG1lbnRzLCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUNCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gcmVwbHkuZ2V0QXR0YWNobWVudHMoKTsNCi0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMyA9IG51bGw7DQotDQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDMgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXAzLmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTFSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UxUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYXA0ID0gbnVsbDsNCi0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSBzZWNvbmQgYXR0YWNobWVudCBpcyBub3QgbnVsbCBvciBlbXB0eQ0KLSAgICAgICAgaWYgKChhcDQgPSAoQXR0YWNobWVudFBhcnQpIGl0Lm5leHQoKSkgPT0gbnVsbCl7DQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBudWxsIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29udGVudCBpZCBzdGFydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgU1dBIG5hbWUNCi0gICAgICAgIGlmICghYXA0LmdldENvbnRlbnRJZCgpLnN0YXJ0c1dpdGgoImpwZWdJbWFnZTJSZXNwb25zZT0iKSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGNvbnRlbnQgaWQgdG8gc3RhcnQgd2l0aCBqcGVnSW1hZ2UyUmVzcG9uc2UiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChpdC5oYXNOZXh0KCkpew0KLSAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIG1vcmUgdGhlbiAyIGF0dGFjaG1lbnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIFNPQVBCb2R5IHNiID0gcmVwbHkuZ2V0U09BUEJvZHkoKTsNCi0gICAgICAgIGlmIChzYi5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgZmFpbCgiTWVzc2FnZSBjb250YWlucyBzb2FwOmJvZHkgcGF5bG9hZCIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYnl0ZVtdIGJ5dGVzMyA9IGFwMy5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlczMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChieXRlczNbMF0gIT0gJzMnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIlRoZSByZXNwb25zZSBhdHRhY2htZW50IGlzIG5vdCBjb3JyZWN0Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBieXRlW10gYnl0ZXM0ID0gYXA0LmdldFJhd0NvbnRlbnRCeXRlcygpOw0KLSAgICAgICAgaWYgKGJ5dGVzNC5sZW5ndGggPT0gMCkgeyANCi0gICAgICAgICAgICBmYWlsKCJBdHRhY2htZW50IGlzIGVtcHR5Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJ5dGVzNFswXSAhPSAnNCcpIHsgDQotICAgICAgICAgICAgZmFpbCgiVGhlIHJlc3BvbnNlIGF0dGFjaG1lbnQgaXMgbm90IGNvcnJlY3QiKTsgDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEludm9rZSBhIHNlY29uZCB0aW1lIHRvIHZlcmlmeQ0KLSAgICAgICAgDQotICAgICAgICAvLyBpbnZva2UNCi0gICAgICAgIHJlcGx5ID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLQ0KLSAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBhdHRhY2htZW50cywgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lDQotICAgICAgICBpdCA9IHJlcGx5LmdldEF0dGFjaG1lbnRzKCk7DQotICAgICAgICBhcDMgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXAzID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCkpID09IG51bGwpew0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaWQgc3RhcnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIFNXQSBuYW1lDQotICAgICAgICBpZiAoIWFwMy5nZXRDb250ZW50SWQoKS5zdGFydHNXaXRoKCJqcGVnSW1hZ2UxUmVzcG9uc2U9IikpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBjb250ZW50IGlkIHRvIHN0YXJ0IHdpdGgganBlZ0ltYWdlMVJlc3BvbnNlIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFwNCA9IG51bGw7DQotICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgc2Vjb25kIGF0dGFjaG1lbnQgaXMgbm90IG51bGwgb3IgZW1wdHkNCi0gICAgICAgIGlmICgoYXA0ID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCkpID09IG51bGwpew0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGNvbnRlbnQgaWQgc3RhcnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIFNXQSBuYW1lDQotICAgICAgICBpZiAoIWFwNC5nZXRDb250ZW50SWQoKS5zdGFydHNXaXRoKCJqcGVnSW1hZ2UyUmVzcG9uc2U9IikpIHsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBjb250ZW50IGlkIHRvIHN0YXJ0IHdpdGgganBlZ0ltYWdlMlJlc3BvbnNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKXsNCi0gICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBtb3JlIHRoZW4gMiBhdHRhY2htZW50Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBzYiA9IHJlcGx5LmdldFNPQVBCb2R5KCk7DQotICAgICAgICBpZiAoc2IuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIGZhaWwoIk1lc3NhZ2UgY29udGFpbnMgc29hcDpib2R5IHBheWxvYWQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGJ5dGVzMyA9IGFwMy5nZXRSYXdDb250ZW50Qnl0ZXMoKTsNCi0gICAgICAgIGlmIChieXRlczMubGVuZ3RoID09IDApIHsgDQotICAgICAgICAgICAgZmFpbCgiQXR0YWNobWVudCBpcyBlbXB0eSIpOyANCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChieXRlczNbMF0gIT0gJzMnKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIlRoZSByZXNwb25zZSBhdHRhY2htZW50IGlzIG5vdCBjb3JyZWN0Iik7IA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBieXRlczQgPSBhcDQuZ2V0UmF3Q29udGVudEJ5dGVzKCk7DQotICAgICAgICBpZiAoYnl0ZXM0Lmxlbmd0aCA9PSAwKSB7IA0KLSAgICAgICAgICAgIGZhaWwoIkF0dGFjaG1lbnQgaXMgZW1wdHkiKTsgDQotICAgICAgICB9DQotICAgICAgICBpZiAoYnl0ZXM0WzBdICE9ICc0JykgeyANCi0gICAgICAgICAgICBmYWlsKCJUaGUgcmVzcG9uc2UgYXR0YWNobWVudCBpcyBub3QgY29ycmVjdCIpOyANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICAvLyBUT0RPOiAgQWRkIHNpbWlsYXIgY29kZSB0byBpbnZva2UgdGhlIG10b20gZW5hYmxlZCBvcGVyYXRpb24NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRiNTY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zd2FtdG9tL3NlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zd2FtdG9tL3NlcnZlci9NRVRBLUlORi9zd2FtdG9tc2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL01FVEEtSU5GL3N3YW10b21zZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MDYxZTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL01FVEEtSU5GL3N3YW10b21zZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi08d3NkbDpkZWZpbml0aW9ucw0KLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50ZXN0Lm9yZyINCi0JeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIg0KLQl4bWxuczp0bnM9Imh0dHA6Ly9zd2FtdG9tc2VydmljZS50ZXN0Lm9yZyINCi0JeG1sbnM6dHlwZW5zPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudHlwZXMudGVzdC5vcmciDQotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLQl4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotCSA8d3NkbDp0eXBlcz4NCi0JCTx4c2Q6c2NoZW1hDQotCQkgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0JCSAgeG1sbnM6dG5zPSJodHRwOi8vc3dhbXRvbXNlcnZpY2UudHlwZXMudGVzdC5vcmciDQotCQkgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnR5cGVzLnRlc3Qub3JnIj4NCi0NCi0JCTxlbGVtZW50IG5hbWU9Im10b21BdHRhY2htZW50IiA+DQotCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQk8c2VxdWVuY2U+DQotCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5IiAvPg0KLQkJCQk8L3NlcXVlbmNlPg0KLQkJCTwvY29tcGxleFR5cGU+DQotCQk8L2VsZW1lbnQ+DQotDQotCQk8ZWxlbWVudCBuYW1lPSJtdG9tQXR0YWNobWVudFJlc3BvbnNlIiA+DQotCQkJPGNvbXBsZXhUeXBlPg0KLQkJCQk8c2VxdWVuY2U+DQotCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5IiAvPg0KLQkJCQk8L3NlcXVlbmNlPg0KLQkJCTwvY29tcGxleFR5cGU+DQotCQk8L2VsZW1lbnQ+DQotCQk8L3hzZDpzY2hlbWE+DQotCTwvd3NkbDp0eXBlcz4NCi0NCi0NCi0gIDwhLS0gYXR0YWNobWVudC4uLm5vdGUgbm8gYm9keSBwYXJ0IC0tPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzd2FBdHRhY2htZW50UmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZVJlcXVlc3QiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzd2FBdHRhY2htZW50UmVzcG9uc2UiPg0KLSAgICA8cGFydCBuYW1lPSJqcGVnSW1hZ2VSZXNwb25zZSIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotDQotICANCi0gIDwhLS0gdHdvIGF0dGFjaG1lbnRzLi4uYW5kIG5vIGJvZHkgcGFydCAtLT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3dhQXR0YWNobWVudDJSZXF1ZXN0Ij4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlMVJlcXVlc3QiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlMlJlcXVlc3QiIHR5cGU9InhzZDpoZXhCaW5hcnkiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzd2FBdHRhY2htZW50MlJlc3BvbnNlIj4NCi0gICAgPHBhcnQgbmFtZT0ianBlZ0ltYWdlMVJlc3BvbnNlIiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+DQotICAgIDxwYXJ0IG5hbWU9ImpwZWdJbWFnZTJSZXNwb25zZSIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPg0KLSAgPC93c2RsOm1lc3NhZ2U+DQotICANCi0NCi0gICA8IS0tIG10b20gLS0+DQotDQotICA8d3NkbDptZXNzYWdlIG5hbWU9Im10b21BdHRhY2htZW50UmVxdWVzdCI+DQotICAgIDxwYXJ0IG5hbWU9Im10b21faW4iIGVsZW1lbnQ9InR5cGVuczptdG9tIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXRvbUF0dGFjaG1lbnRSZXNwb25zZSI+DQotICAgIDxwYXJ0IG5hbWU9Im10b21fb3V0IiBlbGVtZW50PSJ0eXBlbnM6bXRvbVJlc3BvbnNlIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0NCi0gICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJTV0FNVE9NUG9ydFR5cGUiPg0KLSAgICAgIA0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzd2FBdHRhY2htZW50Ij4NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6c3dhQXR0YWNobWVudFJlcXVlc3QiIC8+DQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpzd2FBdHRhY2htZW50UmVzcG9uc2UiIC8+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3dhQXR0YWNobWVudDIiPg0KLSAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpzd2FBdHRhY2htZW50MlJlcXVlc3QiIC8+DQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpzd2FBdHRhY2htZW50MlJlc3BvbnNlIiAvPg0KLSAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgDQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im10b21BdHRhY2htZW50Ij4NCi0gICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6bXRvbUF0dGFjaG1lbnRSZXF1ZXN0IiAvPg0KLQ0KLSAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6bXRvbUF0dGFjaG1lbnRSZXNwb25zZSIgLz4NCi0NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgIDwvd3NkbDpwb3J0VHlwZT4NCi0NCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IlNXQU1UT01CaW5kaW5nIiB0eXBlPSJ0bnM6U1dBTVRPTVBvcnRUeXBlIj4NCi0gICAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InN3YUF0dGFjaG1lbnQiPg0KLSAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzd2FBdHRhY2htZW50Ii8+DQotICAgICAgICA8d3NkbDppbnB1dCA+DQotICAgICAgICAgIDxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSIiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLQ0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZVJlcXVlc3QiIHR5cGU9InRleHQvcGxhaW4iLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+DQotICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICA8d3NkbDpvdXRwdXQgPg0KLSAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0iIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2VSZXNwb25zZSIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICA8L21pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICANCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3dhQXR0YWNobWVudDIiPg0KLSAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzd2FBdHRhY2htZW50MiIvPg0KLSAgICAgICAgPHdzZGw6aW5wdXQgPg0KLSAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0iIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L21pbWU6cGFydD4NCi0NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCBwYXJ0PSJqcGVnSW1hZ2UxUmVxdWVzdCIgdHlwZT0idGV4dC9wbGFpbiIvPg0KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0Pg0KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+DQotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImpwZWdJbWFnZTJSZXF1ZXN0IiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgPHdzZGw6b3V0cHV0ID4NCi0gICAgICAgICAgPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4NCi0gICAgICAgICAgICA8bWltZTpwYXJ0Pg0KLSAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9IiIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlMVJlc3BvbnNlIiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgICAgPG1pbWU6cGFydD4NCi0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0ianBlZ0ltYWdlMlJlc3BvbnNlIiB0eXBlPSJ0ZXh0L3BsYWluIi8+DQotICAgICAgICAgICAgPC9taW1lOnBhcnQ+DQotICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPg0KLSAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLQ0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJtdG9tQXR0YWNobWVudCI+DQotICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJtdG9tQXR0YWNobWVudCIvPg0KLSAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICA8d3NkbDpvdXRwdXQgPg0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICA8L3dzZGw6YmluZGluZz4NCi0NCi0gICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlNXQU1UT01TZXJ2aWNlIj4NCi0gICAgIDx3c2RsOnBvcnQgbmFtZT0iU1dBTVRPTVBvcnRUeXBlUG9ydCIgYmluZGluZz0idG5zOlNXQU1UT01CaW5kaW5nIj4NCi0gICAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vQEhPU1RAOkBQT1JUQC9qYXh3cy5zd2FtdG9tL3NlcnZpY2VzL1NXQU1UT01TZXJ2aWNlIiAvPg0KLSAgICAgPC93c2RsOnBvcnQ+DQotICAgPC93c2RsOnNlcnZpY2U+DQotICAgICAgICAgIA0KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvU1dBTVRPTVBvcnRUeXBlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3N3YW10b20vc2VydmVyL1NXQU1UT01Qb3J0VHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmYWQ3NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3dhbXRvbS9zZXJ2ZXIvU1dBTVRPTVBvcnRUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3dhbXRvbS5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuSGV4QmluYXJ5QWRhcHRlcjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7DQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsNCi0NCi0vKioNCi0gKiBFbmRwb250IHRoYXQgaXMgYSBTT0FQIDEuMSBNVE9NIEJpbmRpbmcgDQotICogYnV0IGhhcyBhbiBvcGVyYXRpb24gKHN3YUF0dGFjaG1lbnQpIHRoYXQgcGFzc2VzDQotICogU1dBIGF0dGFjaG1lbnRzDQotICoNCi0gKi8NCi1AV2ViU2VydmljZShuYW1lPSJTV0FNVE9NUG9ydFR5cGUiLA0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lPSJTV0FNVE9NU2VydmljZSIsIA0KLSAgICAgICAgICAgIHdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvc3dhbXRvbXNlcnZpY2Uud3NkbCIsIA0KLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3N3YW10b21zZXJ2aWNlLnRlc3Qub3JnIikNCi1AQmluZGluZ1R5cGUoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotcHVibGljIGNsYXNzIFNXQU1UT01Qb3J0VHlwZUltcGwgew0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgcGFzc2VzIGFuIFNXQSBhdHRhY2htZW50IGFzIGEgcmVxdWVzdA0KLSAgICAgKiBhbmQgZXhwZWN0cyBhbiBTV0EgYXR0YWNobWVudCBhcyBhIHJlc3BvbnNlLg0KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGJvZHkgY29udGVudCBpbiBib3RoIGNhc2VzIGlzIGVtcHR5Lg0KLSAgICAgKiAoU2VlIHRoZSB3c2RsKQ0KLSAgICAgKiBAcGFyYW0gYXR0YWNobWVudCAoc3dhKQ0KLSAgICAgKiBAcmV0dXJuIGF0dGFjaG1lbnQgKHN3YSkNCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZT0ic3dhQXR0YWNobWVudCIsIGFjdGlvbj0ic3dhQXR0YWNobWVudCIpDQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoSGV4QmluYXJ5QWRhcHRlci5jbGFzcykNCi0gICAgQFdlYlJlc3VsdChuYW1lID0gImpwZWdJbWFnZVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIHBhcnROYW1lID0gImpwZWdJbWFnZVJlc3BvbnNlIikNCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0gICAgcHVibGljIGJ5dGVbXSBzd2FBdHRhY2htZW50KA0KLSAgICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKEhleEJpbmFyeUFkYXB0ZXIuY2xhc3MpDQotICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImpwZWdJbWFnZVJlcXVlc3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAianBlZ0ltYWdlUmVxdWVzdCIpDQotICAgICAgICAgIGJ5dGVbXSBhdHRhY2htZW50KSB7DQotICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsIHx8IGF0dGFjaG1lbnQubGVuZ3RoID09IDApew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWNlaXZlZCBlbXB0eSBhdHRhY2htZW50Iik7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgZmlyc3QgdGhyZWUgY2hhcmFjdGVycyBhbmQgcmV0dXJuIHRoZSBhdHRhY2htZW50DQotICAgICAgICAgICAgYXR0YWNobWVudFswXSA9ICdTJzsNCi0gICAgICAgICAgICBhdHRhY2htZW50WzFdID0gJ1cnOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRbMl0gPSAnQSc7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYXR0YWNobWVudDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHBhc3NlcyB0d28gU1dBIGF0dGFjaG1lbnRzIGFzIGEgcmVxdWVzdA0KLSAgICAgKiBhbmQgZXhwZWN0cyB0d28gU1dBIGF0dGFjaG1lbnRzIGFzIGEgcmVzcG9uc2UuDQotICAgICAqIE5vdGUgdGhhdCB0aGUgYm9keSBjb250ZW50IGluIGJvdGggY2FzZXMgaXMgZW1wdHkuDQotICAgICAqIChTZWUgdGhlIHdzZGwpDQotICAgICAqIEBwYXJhbSBhdHRhY2htZW50IChzd2EpDQotICAgICAqIEByZXR1cm4gYXR0YWNobWVudCAoc3dhKQ0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPSJzd2FBdHRhY2htZW50MiIsIGFjdGlvbj0ic3dhQXR0YWNobWVudDIiKQ0KLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQ0KLSAgICBwdWJsaWMgdm9pZCBzd2FBdHRhY2htZW50MigNCi0gICAgICAgICAgQFhtbEphdmFUeXBlQWRhcHRlcihIZXhCaW5hcnlBZGFwdGVyLmNsYXNzKQ0KLSAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJqcGVnSW1hZ2UxUmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJqcGVnSW1hZ2UxUmVxdWVzdCIpDQotICAgICAgICAgIGJ5dGVbXSBhdHRhY2htZW50LA0KLSAgICAgICAgICANCi0gICAgICAgICAgQFhtbEphdmFUeXBlQWRhcHRlcihIZXhCaW5hcnlBZGFwdGVyLmNsYXNzKQ0KLSAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJqcGVnSW1hZ2UyUmVxdWVzdCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJqcGVnSW1hZ2UyUmVxdWVzdCIpDQotICAgICAgICAgIGJ5dGVbXSBhdHRhY2htZW50MiwNCi0gICAgICAgICAgDQotICAgICAgICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoSGV4QmluYXJ5QWRhcHRlci5jbGFzcykNCi0gICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAianBlZ0ltYWdlMVJlc3BvbnNlIiwgDQotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiIiwgDQotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZSA9ICJqcGVnSW1hZ2UxUmVzcG9uc2UiLA0KLSAgICAgICAgICAgICAgICAgICAgbW9kZT0gTW9kZS5PVVQpDQotICAgICAgICAgIEhvbGRlcjxieXRlW10+IGF0dGFjaG1lbnRPdXQxLA0KLSAgICAgICAgICANCi0gICAgICAgICAgQFhtbEphdmFUeXBlQWRhcHRlcihIZXhCaW5hcnlBZGFwdGVyLmNsYXNzKQ0KLSAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJqcGVnSW1hZ2UyUmVzcG9uc2UiLCANCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICIiLCANCi0gICAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gImpwZWdJbWFnZTJSZXNwb25zZSIsDQotICAgICAgICAgICAgICAgICAgICBtb2RlPSBNb2RlLk9VVCkNCi0gICAgICAgICAgSG9sZGVyPGJ5dGVbXT4gYXR0YWNobWVudE91dDIpIHsNCi0gICAgICAgICAgDQotICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsIHx8IGF0dGFjaG1lbnQubGVuZ3RoID09IDApew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWNlaXZlZCBlbXB0eSBmaXJzdCBhdHRhY2htZW50Iik7DQotICAgICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQyID09IG51bGwgfHwgYXR0YWNobWVudDIubGVuZ3RoID09IDApew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWNlaXZlZCBlbXB0eSBzZWNvbmQgYXR0YWNobWVudCIpOw0KLSAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50WzBdICE9ICcxJykgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGaXJzdCBhdHRhY2htZW50IGlzIG5vdCAnMSciKTsNCi0gICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudDJbMF0gIT0gJzInKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlY29uZCBhdHRhY2htZW50IGlzIG5vdCAnMiciKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgYXR0YWNobWVudE91dDEudmFsdWUgPSBuZXcgYnl0ZVsxXTsNCi0gICAgICAgICAgICBhdHRhY2htZW50T3V0MS52YWx1ZVswXSA9ICczJzsNCi0gICAgICAgICAgICBhdHRhY2htZW50T3V0Mi52YWx1ZSA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRPdXQyLnZhbHVlWzBdID0gJzQnOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZT0ibXRvbUF0dGFjaG1lbnQiLCBhY3Rpb249Im10b21BdHRhY2htZW50IikNCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlPVBhcmFtZXRlclN0eWxlLkJBUkUpDQotICAgIHB1YmxpYyB2b2lkIG10b21BdHRhY2htZW50KEhvbGRlcjxieXRlW10+IG1lc3NhZ2UpIHsNCi0NCi0gICAgICAgIGJ5dGVbXSBhdHRhY2htZW50ID0gbWVzc2FnZS52YWx1ZTsNCi0NCi0gICAgICAgIGlmIChhdHRhY2htZW50ID09IG51bGwgfHwgYXR0YWNobWVudC5sZW5ndGggPT0gMCl7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlY2VpdmVkIGVtcHR5IG10b20gYXR0YWNobWVudCIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBDaGFuZ2UgdGhlIGZpcnN0IGNoYXJhY3RlcnMNCi0gICAgICAgICAgICBhdHRhY2htZW50WzBdID0gJ1gnOw0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRbMV0gPSAnTyc7DQotICAgICAgICAgICAgYXR0YWNobWVudFsyXSA9ICdQJzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1lc3NhZ2UudmFsdWUgPSBhdHRhY2htZW50Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9BcHBsZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0FwcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZmExODUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0FwcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnR5cGVfc3Vic3RpdHV0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXBwbGUgewotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjb2xvcjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZsYXZvcjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGFyZykgewotICAgICAgICB0aGlzLmNvbG9yID0gYXJnOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmxhdm9yKCkgewotICAgICAgICByZXR1cm4gZmxhdm9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZsYXZvcihTdHJpbmcgZmxhKSB7Ci0gICAgICAgIHRoaXMuZmxhdm9yID0gZmxhOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIGFyZykgewotICAgICAgICB0aGlzLnR5cGUgPSBhcmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9BcHBsZUZpbmRlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9BcHBsZUZpbmRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlOWRhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vQXBwbGVGaW5kZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy50eXBlX3N1YnN0aXR1dGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287Ci0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkFwcGxlRmluZGVyU2VydmljZSIsCi0gICAgICAgICAgICBwb3J0TmFtZSA9ICJBcHBsZUZpbmRlclBvcnQiLCAKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYXBwbGUub3JnIikKLUBYbWxTZWVBbHNvKHsgRnJleWJ1cmcuY2xhc3MsIEZ1amkuY2xhc3MgfSkKLXB1YmxpYyBjbGFzcyBBcHBsZUZpbmRlckltcGwgeyAKLQotICAgIHB1YmxpYyBMaXN0PEFwcGxlPiBnZXRBcHBsZXMoKSB7Ci0gICAgICAgIExpc3Q8QXBwbGU+IGFwcGxlcyA9IG5ldyBBcnJheUxpc3Q8QXBwbGU+KCk7Ci0gICAgICAgIGFwcGxlcy5hZGQobmV3IEZ1amkoIlJlZCIsICJtaWxkIiwgIkphcGFuIikpOwotICAgICAgICBhcHBsZXMuYWRkKG5ldyBGcmV5YnVyZygiWWVsbG93IiwgInN3ZWV0IiwgImVhcmx5IE9jdG9iZXIiKSk7Ci0gICAgICAgIHJldHVybiBhcHBsZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0ZyZXlidXJnLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vRnJleWJ1cmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhNmJkMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vRnJleWJ1cmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudHlwZV9zdWJzdGl0dXRpb247Ci0KLXB1YmxpYyBjbGFzcyBGcmV5YnVyZyBleHRlbmRzIEFwcGxlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlYXNvbjsKLQotICAgIHB1YmxpYyBGcmV5YnVyZygpIHsKLSAgICAgICAgc2V0VHlwZSgiRnJleWJ1cmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnJleWJ1cmcoU3RyaW5nIGNvbG9yLCBTdHJpbmcgZmxhdm9yLCBTdHJpbmcgc2Vhc29uKSB7Ci0gICAgICAgIHNldFR5cGUoIkZyZXlidXJnIik7Ci0gICAgICAgIHNldENvbG9yKGNvbG9yKTsKLSAgICAgICAgc2V0Rmxhdm9yKGZsYXZvcik7Ci0gICAgICAgIAotICAgICAgICBzZXRTZWFzb24oc2Vhc29uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWFzb24oU3RyaW5nIGFyZzApIHsKLSAgICAgICAgdGhpcy5zZWFzb24gPSBhcmcwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vhc29uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZWFzb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vRnVqaS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL0Z1amkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlODRkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vRnVqaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy50eXBlX3N1YnN0aXR1dGlvbjsKLQotcHVibGljIGNsYXNzIEZ1amkgZXh0ZW5kcyBBcHBsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQotICAgIHB1YmxpYyBGdWppKCkgewotICAgICAgICBzZXRUeXBlKCJGdWppIik7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1amkoU3RyaW5nIGNvbG9yLCBTdHJpbmcgZmxhdm9yLCBTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgc2V0VHlwZSgiRnVqaSIpOwotICAgICAgICBzZXRDb2xvcihjb2xvcik7Ci0gICAgICAgIHNldEZsYXZvcihmbGF2b3IpOwotICAgICAgICAKLSAgICAgICAgc2V0TG9jYXRpb24obG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHRoaXMubG9jYXRpb24gPSBhcmcwOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL2pheHdzL0dldEFwcGxlcy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL2pheHdzL0dldEFwcGxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg0OTkyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9qYXh3cy9HZXRBcHBsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudHlwZV9zdWJzdGl0dXRpb24uamF4d3M7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLS8qKgotICogPHA+SmF2YSBjbGFzcyBmb3IgZ2V0QXBwbGVzIGNvbXBsZXggdHlwZS4KLSAqIAotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIAotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJnZXRBcHBsZXMiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqIAotICogCi0gKi8KLUBYbWxSb290RWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2FwcGxlLm9yZyIsIG5hbWUgPSAiZ2V0QXBwbGVzIikKLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWVzcGFjZSA9ICJodHRwOi8vYXBwbGUub3JnIiwgbmFtZSA9ICJnZXRBcHBsZXMiKQotcHVibGljIGNsYXNzIEdldEFwcGxlcyB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi9qYXh3cy9HZXRBcHBsZXNSZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL2pheHdzL0dldEFwcGxlc1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjYwZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3R5cGVfc3Vic3RpdHV0aW9uL2pheHdzL0dldEFwcGxlc1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnR5cGVfc3Vic3RpdHV0aW9uLmpheHdzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy50eXBlX3N1YnN0aXR1dGlvbi5BcHBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldEFwcGxlc1Jlc3BvbnNlIGNvbXBsZXggdHlwZS4KLSAqIAotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIAotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJnZXRBcHBsZXNSZXNwb25zZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9IntodHRwOi8vYXBwbGUub3JnfWFwcGxlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKiAKLSAqIAotICovCi1AWG1sUm9vdEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9hcHBsZS5vcmciLCBuYW1lID0gImdldEFwcGxlc1Jlc3BvbnNlIikKLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWVzcGFjZSA9ICJodHRwOi8vYXBwbGUub3JnIiwgbmFtZSA9ICJnZXRBcHBsZXNSZXNwb25zZSIsIHByb3BPcmRlciA9IHsiX3JldHVybiJ9KQotcHVibGljIGNsYXNzIEdldEFwcGxlc1Jlc3BvbnNlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicmV0dXJuIikKLSAgICBwcm90ZWN0ZWQgTGlzdDxBcHBsZT4gX3JldHVybjsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAotICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKLSAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgotICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcmV0dXJuIHByb3BlcnR5LgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldFJldHVybigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiAKLSAgICAgKiAKLSAgICAgKiA8cD4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAotICAgICAqIHtAbGluayBBcHBsZSB9Ci0gICAgICogCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QXBwbGU+IGdldFJldHVybigpIHsKLSAgICAgICAgaWYgKF9yZXR1cm4gPT0gbnVsbCkgewotICAgICAgICAgICAgX3JldHVybiA9IG5ldyBBcnJheUxpc3Q8QXBwbGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuX3JldHVybjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi90ZXN0cy9UeXBlU3Vic3RpdHV0aW9uVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90eXBlX3N1YnN0aXR1dGlvbi90ZXN0cy9UeXBlU3Vic3RpdHV0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxNThmYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdHlwZV9zdWJzdGl0dXRpb24vdGVzdHMvVHlwZVN1YnN0aXR1dGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnR5cGVfc3Vic3RpdHV0aW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUeXBlU3Vic3RpdHV0aW9uVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIE5TID0gImh0dHA6Ly9hcHBsZS5vcmciOwotICAgIHByaXZhdGUgUU5hbWUgWFNJX1RZUEUgPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInR5cGUiKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50VXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9BcHBsZUZpbmRlclNlcnZpY2UuQXBwbGVGaW5kZXJQb3J0IjsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKE5TLCAiQXBwbGVGaW5kZXJTZXJ2aWNlIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZShOUywgIkFwcGxlRmluZGVyUG9ydCIpOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHJlcU1zZ1N0YXJ0ID0gCi0gICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsKLSAgICAgICAgIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPjxzb2FwOkJvZHk+IjsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyByZXFNc2dFbmQgPSAiPC9zb2FwOkJvZHk+PC9zb2FwOkVudmVsb3BlPiI7Ci0gICAKLSAgICBwcml2YXRlIFN0cmluZyBHRVRfQVBQTEVTID0gIjxuczI6Z2V0QXBwbGVzIHhtbG5zOm5zMj1cIiIgKyBOUyArICJcIi8+IjsKLSAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShUeXBlU3Vic3RpdHV0aW9uVGVzdHMuY2xhc3MpKTsKLSAgICB9Ci0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVN1YnN0aXR1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gZGlzcGF0Y2ggPSBjcmVhdGVEaXNwYXRjaCgpOwotICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgbXNnID0gcmVxTXNnU3RhcnQgKyBHRVRfQVBQTEVTICsgcmVxTXNnRW5kOwotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZShudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIAotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsKLQotICAgICAgICBTT0FQQm9keSBib2R5ID0gcmVzcG9uc2UuZ2V0U09BUEJvZHkoKTsKLQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgWyIgKyBib2R5ICsgIl0iKTsKLQotICAgICAgICBRTmFtZSBleHBlY3RlZFhzaVR5cGUxID0gbmV3IFFOYW1lKE5TLCAiZnVqaSIpOwotICAgICAgICBRTmFtZSBleHBlY3RlZFhzaVR5cGUyID0gbmV3IFFOYW1lKE5TLCAiZnJleWJ1cmciKTsKLQotICAgICAgICBJdGVyYXRvciBpdGVyOwotICAgICAgICBTT0FQRWxlbWVudCBlbGVtZW50OwotICAgICAgICBRTmFtZSB4c2lUeXBlOwotCi0gICAgICAgIGl0ZXIgPSBib2R5LmdldENoaWxkRWxlbWVudHMobmV3IFFOYW1lKE5TLCAiZ2V0QXBwbGVzUmVzcG9uc2UiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgZWxlbWVudCA9IChTT0FQRWxlbWVudClpdGVyLm5leHQoKTsKLQotICAgICAgICBpdGVyID0gZWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKG5ldyBRTmFtZSgicmV0dXJuIikpOwotCi0gICAgICAgIC8vIGNoZWNrIHZhbHVlMQotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgZWxlbWVudCA9IChTT0FQRWxlbWVudClpdGVyLm5leHQoKTsKLSAgICAgICAgeHNpVHlwZSA9IGdldFhzaVR5cGVBdHRyaWJ1dGUoZWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygieHNpOnR5cGUgMSIsIGV4cGVjdGVkWHNpVHlwZTEsIHhzaVR5cGUpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdmFsdWUyCi0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOwotICAgICAgICBlbGVtZW50ID0gKFNPQVBFbGVtZW50KWl0ZXIubmV4dCgpOwotICAgICAgICB4c2lUeXBlID0gZ2V0WHNpVHlwZUF0dHJpYnV0ZShlbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4c2k6dHlwZSAyIiwgZXhwZWN0ZWRYc2lUeXBlMiwgeHNpVHlwZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUU5hbWUgZ2V0WHNpVHlwZUF0dHJpYnV0ZShTT0FQRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShYU0lfVFlQRSk7Ci0gICAgICAgIFFOYW1lIHhzaVR5cGUgPSBudWxsOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHBvcyA9IHZhbHVlLmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgIGlmIChwb3MgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdmFsdWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHZhbHVlLnN1YnN0cmluZyhwb3MrMSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgeHNpVHlwZSA9IG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsTmFtZSwgcHJlZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeHNpVHlwZSA9IG5ldyBRTmFtZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhzaVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTT0FQTWVzc2FnZT4gY3JlYXRlRGlzcGF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnROYW1lLCBudWxsLCBlbmRwb2ludFVybCk7Ci0gICAgICAgIERpc3BhdGNoPFNPQVBNZXNzYWdlPiBkaXNwYXRjaCA9IAotICAgICAgICAgICAgc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnROYW1lLCBTT0FQTWVzc2FnZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOwotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9TaW1wbGVTZXJ2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NpbXBsZVNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTI2ZTY2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NpbXBsZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCi0NCi0NCi0NCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2VydmVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlSFRUUFNlcnZlciBzZXJ2ZXI7DQotICAgIHByaXZhdGUgU3RyaW5nIHJlcG9zaXRvcnlEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iK1N5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQucmVwb3NpdG9yeSIsIiIpOw0KLSAgICBwcml2YXRlIFN0cmluZyBheGlzMnhtbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYXhpczIuY29uZmlnIik7DQotICAgIHByaXZhdGUgaW50IHBvcnQgPSA2MDYwOw0KLQ0KLSAgICBwdWJsaWMgU2ltcGxlU2VydmVyKCkge30NCi0gICAgDQotICAgIC8qDQotICAgICAqIHVzZXJzIG1heSBwYXNzIGluIHRoZWlyIG93biByZXBvc2l0b3J5RGlyIHBhdGggYW5kIHBhdGggdG8gY3VzdG9tIGNvbmZpZ3VyYXRpb24gZmlsZS4NCi0gICAgICogUGFzc2luZyAnbnVsbCcgZm9yIGVpdGhlciBwYXJhbSB3aWxsIHVzZSB0aGUgZGVmYXVsdA0KLSAgICAgKi8NCi0gICAgcHVibGljIFNpbXBsZVNlcnZlcihTdHJpbmcgcmVwb3NpdG9yeURpciwgU3RyaW5nIGF4aXMyeG1sKSB7DQotICAgICAgICBpZiAocmVwb3NpdG9yeURpciAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5yZXBvc2l0b3J5RGlyID0gcmVwb3NpdG9yeURpcjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChheGlzMnhtbCAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5heGlzMnhtbCA9IGF4aXMyeG1sOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj4+IHJlcG9zaXRvcnlEaXIgPSAiICsgcmVwb3NpdG9yeURpcik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gYXhpczIueG1sICAgICA9ICIgKyBheGlzMnhtbCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKA0KLSAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeURpciwgYXhpczJ4bWwpOw0KLSAgICAgICAgICAgIHNlcnZlciA9IG5ldyBTaW1wbGVIVFRQU2VydmVyKGNvbmZpZywgcG9ydCk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLSBzdGFydGluZyBzZXJ2ZXIgLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBpbml0KCk7DQotICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgew0KLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0gZG9uZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLSBzdG9wcGluZyBzZXJ2ZXIgLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLSBkb25lIC0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gVG8gY2hhbmdlIHRoZSBzZXR0aW5ncywgZWRpdCB0aGUgbG9nNGoucHJvcGVydHkgZmlsZQ0KLSAgICAgICAgLy8gaW4gdGhlIHRlc3QtcmVzb3VyY2VzIGRpcmVjdG9yeS4NCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOw0KLSAgICAgICAgU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBTaW1wbGVTZXJ2ZXIoKTsNCi0gICAgICAgIHNlcnZlci5zdGFydCgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmNhYmEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1UaGUgeG1saHR0cCB0ZXN0IHRoZSBYTUwgSFRUUCBwcm90b2NvbC4NCi0NCi1UaGUgc3RydWN0dXJlIG9mIHRoZSB0ZXN0cyB3aWxsIGJlIA0KLQ0KLW9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAuLi5NRVRBX0lORiwgZXRjLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS4gLi4uTUVUQV9JTkYsIGV0Yy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuIC4uLk1FVEFfSU5GLCBldGMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLiAuLi5NRVRBX0lORiwgZXRjLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzb3VyY2UgLi4uTUVUQV9JTkYsIGV0Yy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vic2VydmljZS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbC4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEFfSU5GIC4uLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGVzdHMuIGRpc3BhdGNoLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzb3VyY2UNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheGINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9kYXRhc291cmNlL0Rpc3BhdGNoWE1lc3NhZ2VEYXRhU291cmNlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL2RhdGFzb3VyY2UvRGlzcGF0Y2hYTWVzc2FnZURhdGFTb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzA1OTc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL2RhdGFzb3VyY2UvRGlzcGF0Y2hYTWVzc2FnZURhdGFTb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5jbGllbnRUZXN0cy5kaXNwYXRjaC5kYXRhc291cmNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLmltcGwuQnVmZmVyVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uRmlsZUltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotcHVibGljIGNsYXNzIERpc3BhdGNoWE1lc3NhZ2VEYXRhU291cmNlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBIT1NUUE9SVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAiOw0KLSAgICAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIEVORFBPSU5UX1VSTCA9IEhPU1RQT1JUICsgIi9heGlzMi9zZXJ2aWNlcy9YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlci5YTWVzc2FnZURhdGFTb3VyY2VQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIFNFUlZJQ0VfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyIik7DQotICAgIHByaXZhdGUgUU5hbWUgUE9SVF9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXJQb3J0Iik7DQotIA0KLSAgICBwcml2YXRlIERhdGFTb3VyY2UgaW1hZ2VEUzsNCi0gICAgcHJpdmF0ZSBGaWxlRGF0YVNvdXJjZSB0eHREUzsNCi0gICAgcHJpdmF0ZSBEYXRhU291cmNlIGF0dGFjaG1lbnREUzsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERpc3BhdGNoWE1lc3NhZ2VEYXRhU291cmNlVGVzdHMuY2xhc3MpKTsNCi0gICAgfQ0KLSANCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJpbWFnZSI7DQotDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJ0ZXN0LmpwZyIpOw0KLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZmlpcyk7DQotICAgICAgICBpbWFnZURTID0gbmV3IERhdGFTb3VyY2VJbXBsKCJpbWFnZS9qcGVnIiwidGVzdC5qcGciLGltYWdlKTsNCi0NCi0gICAgICAgIFN0cmluZyB0ZXh0UmVzb3VyY2VEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cCI7DQotICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUodGV4dFJlc291cmNlRGlyK0ZpbGUuc2VwYXJhdG9yKyJSRUFETUUudHh0Iik7DQotICAgICAgICB0eHREUyA9IG5ldyBGaWxlRGF0YVNvdXJjZShmaWxlMik7DQotDQotICAgICAgICBTdHJpbmcgcmVzb3VyY2VEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0LXJlc291cmNlcyI7DQotICAgICAgICBGaWxlIGZpbGUzID0gbmV3IEZpbGUocmVzb3VyY2VEaXIrRmlsZS5zZXBhcmF0b3IrImxvZzRqLnByb3BlcnRpZXMiKTsNCi0gICAgICAgIGF0dGFjaG1lbnREUyA9IG5ldyBGaWxlRGF0YVNvdXJjZShmaWxlMyk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBEaXNwYXRjaDxEYXRhU291cmNlPiBnZXREaXNwYXRjaCgpIHsNCi0gICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoU0VSVklDRV9OQU1FKTsNCi0gICAgICAgc2VydmljZS5hZGRQb3J0KFBPUlRfTkFNRSwgSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLEVORFBPSU5UX1VSTCk7DQotICAgICAgIERpc3BhdGNoPERhdGFTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChQT1JUX05BTUUsIERhdGFTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVNvdXJjZVdpdGhUWFQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPERhdGFTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIERhdGFTb3VyY2UgcmVxdWVzdCA9IHR4dERTOw0KLSAgICAgICAgRGF0YVNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKSwidGV4dC9wbGFpbiIpOw0KLSAgICAgICAgU3RyaW5nIHJlcSA9IG5ldyBTdHJpbmcoZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKSk7DQotICAgICAgICBTdHJpbmcgcmVzID0gbmV3IFN0cmluZyhnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVxLCByZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU291cmNlV2l0aEltYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxEYXRhU291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBEYXRhU291cmNlIHJlcXVlc3QgPSBpbWFnZURTOw0KLSAgICAgICAgRGF0YVNvdXJjZSByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0Q29udGVudFR5cGUoKSwiaW1hZ2UvanBlZyIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSksIA0KLSAgICAgICAgICAgICAgICBnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU291cmNlV2l0aFRYVFBsdXNBdHRhY2htZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxEYXRhU291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotDQotICAgICAgICBNYXAgYXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgTWFwIHJlcXVlc3RDb250ZXh0ID0gZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0NCi0vLyAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5TT19USU1FT1VUICwgbmV3IA0KLS8vICAgICAgICBJbnRlZ2VyKDk5OTk5OSkpOw0KLS8vICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQob3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkNPTk5FQ1RJT05fVElNRU9VVCwgbmV3IA0KLS8vICAgICAgICBJbnRlZ2VyKDk5OTk5OSkpOw0KLQ0KLSAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMsDQotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzKTsNCi0gICAgICAgIGF0dGFjaG1lbnRzLnB1dChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSwgbmV3IERhdGFIYW5kbGVyKGF0dGFjaG1lbnREUykpOw0KLQ0KLSAgICAgICAgRGF0YVNvdXJjZSByZXF1ZXN0ID0gdHh0RFM7DQotICAgICAgICBEYXRhU291cmNlIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRDb250ZW50VHlwZSgpLCJ0ZXh0L3BsYWluIik7DQotICAgICAgICBTdHJpbmcgcmVxID0gbmV3IFN0cmluZyhnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpKTsNCi0gICAgICAgIFN0cmluZyByZXMgPSBuZXcgU3RyaW5nKGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlc3BvbnNlLmdldElucHV0U3RyZWFtKCkpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXEsIHJlcyk7DQotICAgICAgICBNYXAgYXR0YWNobWVudHMyID0gKE1hcCkgZGlzcGF0Y2guZ2V0UmVzcG9uc2VDb250ZXh0KCkuZ2V0KE1lc3NhZ2VDb250ZXh0LklOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7DQotICAgICAgICBhc3NlcnRUcnVlKGF0dGFjaG1lbnRzMiAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhhdHRhY2htZW50czIuc2l6ZSgpLCAxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVNvdXJjZVdpdGhJbWFnZVBsdXNBdHRhY2htZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxEYXRhU291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotDQotICAgICAgICBNYXAgYXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOw0KLSAgICAgICAgTWFwIHJlcXVlc3RDb250ZXh0ID0gZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0NCi0gICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChNZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTLA0KLSAgICAgICAgICAgICAgICBhdHRhY2htZW50cyk7DQotICAgICAgICBhdHRhY2htZW50cy5wdXQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCksIG5ldyBEYXRhSGFuZGxlcihhdHRhY2htZW50RFMpKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGF0YVNvdXJjZSByZXF1ZXN0ID0gaW1hZ2VEUzsNCi0gICAgICAgIERhdGFTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldENvbnRlbnRUeXBlKCksImltYWdlL2pwZWciKTsNCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhnZXRTdHJlYW1Bc0J5dGVBcnJheShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpLCANCi0gICAgICAgICAgICAgICAgZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKSkpKTsNCi0gICAgICAgIE1hcCBhdHRhY2htZW50czIgPSAoTWFwKSBkaXNwYXRjaC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudHMyICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dGFjaG1lbnRzMi5zaXplKCksIDEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhU291cmNlV2l0aFRYVFBsdXNUd29BdHRhY2htZW50cygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8RGF0YVNvdXJjZT4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLQ0KLSAgICAgICAgTWFwIGF0dGFjaG1lbnRzID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIE1hcCByZXF1ZXN0Q29udGV4dCA9IGRpc3BhdGNoLmdldFJlcXVlc3RDb250ZXh0KCk7DQotDQotICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUywNCi0gICAgICAgICAgICAgICAgYXR0YWNobWVudHMpOw0KLSAgICAgICAgYXR0YWNobWVudHMucHV0KFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpLCBuZXcgRGF0YUhhbmRsZXIoYXR0YWNobWVudERTKSk7DQotICAgICAgICBhdHRhY2htZW50cy5wdXQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCksIG5ldyBEYXRhSGFuZGxlcihpbWFnZURTKSk7DQotDQotICAgICAgICBEYXRhU291cmNlIHJlcXVlc3QgPSB0eHREUzsNCi0gICAgICAgIERhdGFTb3VyY2UgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldENvbnRlbnRUeXBlKCksInRleHQvcGxhaW4iKTsNCi0gICAgICAgIFN0cmluZyByZXEgPSBuZXcgU3RyaW5nKGdldFN0cmVhbUFzQnl0ZUFycmF5KHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSkpOw0KLSAgICAgICAgU3RyaW5nIHJlcyA9IG5ldyBTdHJpbmcoZ2V0U3RyZWFtQXNCeXRlQXJyYXkocmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKSkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcSwgcmVzKTsNCi0gICAgICAgIE1hcCBhdHRhY2htZW50czIgPSAoTWFwKSBkaXNwYXRjaC5nZXRSZXNwb25zZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuSU5CT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudHMyICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dGFjaG1lbnRzMi5zaXplKCksIDIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRTdHJlYW1Bc0J5dGVBcnJheShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOyANCi0gICAgICAgIEJ1ZmZlclV0aWxzLmlucHV0U3RyZWFtMk91dHB1dFN0cmVhbShpcywgYmFvcyk7DQotICAgICAgICBiYW9zLmZsdXNoKCk7DQotICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL2pheGIvRGlzcGF0Y2hYUGF5bG9hZEpBWEJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvamF4Yi9EaXNwYXRjaFhQYXlsb2FkSkFYQlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmRkOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvamF4Yi9EaXNwYXRjaFhQYXlsb2FkSkFYQlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAuY2xpZW50VGVzdHMuZGlzcGF0Y2guamF4YjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgdGVzdC5FY2hvU3RyaW5nOw0KLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotcHVibGljIGNsYXNzIERpc3BhdGNoWFBheWxvYWRKQVhCVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBIT1NUUE9SVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAiOw0KLSAgICAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIEVORFBPSU5UX1VSTCA9IEhPU1RQT1JUICsgIi9heGlzMi9zZXJ2aWNlcy9YUGF5bG9hZFNvdXJjZVByb3ZpZGVyLlhQYXlsb2FkU291cmNlUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBTRVJWSUNFX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYUGF5bG9hZFNvdXJjZVByb3ZpZGVyIik7DQotICAgIHByaXZhdGUgUU5hbWUgUE9SVF9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWFBheWxvYWRTb3VyY2VQcm92aWRlclBvcnQiKTsNCi0NCi0gICAgU3RyaW5nIFhNTF9URVhUID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5oZWxsbyB3b3JsZDwvcDplY2hvPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRGlzcGF0Y2hYUGF5bG9hZEpBWEJUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGdldERpc3BhdGNoKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoU0VSVklDRV9OQU1FKTsNCi0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChQT1JUX05BTUUsIEhUVFBCaW5kaW5nLkhUVFBfQklORElORyxFTkRQT0lOVF9VUkwpOw0KLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoInRlc3QiKTsNCi0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKFBPUlRfTkFNRSwgamJjLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgKiBTaW1wbGUgWE1ML0hUVFAgTWVzc2FnZSBUZXN0DQotICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgKi8NCi0gICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICBFY2hvU3RyaW5nIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgICAgICAgICANCi0gICAgICAgcmVxdWVzdC5zZXRJbnB1dCgiU1lOQyBKQVhCIFhNTCBQQVlMT0FEIFRFU1QiKTsNCi0gICAgICAgDQotICAgICAgIC8vIEludm9rZSB0aGUgRGlzcGF0Y2g8T2JqZWN0Pg0KLSAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gSW52b2tpbmcgc3luYyBEaXNwYXRjaCB3aXRoIEpBWC1CIFBhcmFtZXRlciIpOw0KLSAgICAgICBFY2hvU3RyaW5nIHJlc3BvbnNlID0gKEVjaG9TdHJpbmcpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgDQotICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgY29udGVudDogIiArIHJlc3BvbnNlLmdldElucHV0KCkpOw0KLSAgICAgICANCi0gICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFJlc3BvbnNlIG9iamVjdCB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCByZXNwb25zZS5nZXRJbnB1dCgpICE9IG51bGwpOw0KLSAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIHJlc3BvbnNlLmdldElucHV0KCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRJbnB1dCgpLmVxdWFscyhyZXF1ZXN0LmdldElucHV0KCkpKTsNCi0gICAgICAgDQotICAgICAgIC8vIFRlc3QgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgLy8gSW52b2tlIHRoZSBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIHdpdGggSkFYLUIgUGFyYW1ldGVyIik7DQotICAgICAgIHJlc3BvbnNlID0gKEVjaG9TdHJpbmcpIGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgDQotICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOw0KLQ0KLSAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVzcG9uc2UgY29udGVudDogIiArIHJlc3BvbnNlLmdldElucHV0KCkpOw0KLSAgICAgICANCi0gICAgICAgYXNzZXJ0VHJ1ZSgiW0VSUk9SXSAtIFJlc3BvbnNlIG9iamVjdCB3YXMgbnVsbCIsIHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gTm8gY29udGVudCBpbiByZXNwb25zZSBvYmplY3QiLCByZXNwb25zZS5nZXRJbnB1dCgpICE9IG51bGwpOw0KLSAgICAgICBhc3NlcnRUcnVlKCJbRVJST1JdIC0gWmVybyBsZW5ndGggY29udGVudCBpbiByZXNwb25zZSIsIHJlc3BvbnNlLmdldElucHV0KCkubGVuZ3RoKCkgPiAwKTsNCi0gICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRJbnB1dCgpLmVxdWFscyhyZXF1ZXN0LmdldElucHV0KCkpKTsNCi0NCi0gICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3NvdXJjZS9EaXNwYXRjaFhNZXNzYWdlU291cmNlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3NvdXJjZS9EaXNwYXRjaFhNZXNzYWdlU291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0NTgzZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9zb3VyY2UvRGlzcGF0Y2hYTWVzc2FnZVNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLmNsaWVudFRlc3RzLmRpc3BhdGNoLnNvdXJjZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlJlYWRlcjJXcml0ZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hYTWVzc2FnZVNvdXJjZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBIT1NUUE9SVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAiOw0KLSAgICAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIEVORFBPSU5UX1VSTCA9IEhPU1RQT1JUICsgIi9heGlzMi9zZXJ2aWNlcy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLlhNZXNzYWdlU291cmNlUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBTRVJWSUNFX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYTWVzc2FnZVNvdXJjZVByb3ZpZGVyIik7DQotICAgIHByaXZhdGUgUU5hbWUgUE9SVF9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWE1lc3NhZ2VTb3VyY2VQcm92aWRlclBvcnQiKTsNCi0gDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxfVEVYVCA9ICI8cDplY2hvIHhtbG5zOnA9XCJodHRwOi8vc2FtcGxlXCI+aGVsbG8gd29ybGQ8L3A6ZWNobz4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MX1RFWFRfTlBFID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5OUEU8L3A6ZWNobz4iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFVF9SRVNQT05TRSA9ICI8cmVzcG9uc2U+R0VUPC9yZXNwb25zZT4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERpc3BhdGNoWE1lc3NhZ2VTb3VyY2VUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEaXNwYXRjaDxTb3VyY2U+IGdldERpc3BhdGNoKCkgew0KLSAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShTRVJWSUNFX05BTUUpOw0KLSAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUE9SVF9OQU1FLCBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsRU5EUE9JTlRfVVJMKTsNCi0gICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUE9SVF9OQU1FLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIFhNTC9IVFRQIE1lc3NhZ2UgVGVzdA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IFhNTF9URVhUOw0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlcXVlc3QuZ2V0Qnl0ZXMoKSk7DQotICAgICAgICBTb3VyY2UgaW5Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgIA0KLSAgICAgICAgU291cmNlIG91dFNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShpblNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihvdXRTb3VyY2UpOw0KLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gcjJ3LmdldEFzU3RyaW5nKCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRlc3QgYSBzZWNvbmQgdGltZSB0byB2ZXJpZnkNCi0gICAgICAgIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXF1ZXN0LmdldEJ5dGVzKCkpOw0KLSAgICAgICAgaW5Tb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgICAgIA0KLSAgICAgICAgb3V0U291cmNlID0gZGlzcGF0Y2guaW52b2tlKGluU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIob3V0U291cmNlKTsNCi0gICAgICAgIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICByZXNwb25zZSA9IHIydy5nZXRBc1N0cmluZygpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotDQotICAgICAgICAvLyB0aGlzIHNob3VsZCBmYWlsDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShudWxsKTsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIHRoYXQncyB3aGF0IHdlIGV4cGVjdA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyB0aGlzIHNob3VsZCB3b3JrIG9rDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9ELCAiR0VUIik7IA0KLSAgICAgICAgU291cmNlIG91dFNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIob3V0U291cmNlKTsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IHIydy5nZXRBc1N0cmluZygpOyAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoR0VUX1JFU1BPTlNFLCByZXNwb25zZSk7ICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gdGhpcyBzaG91bGQgZmFpbCBhZ2Fpbg0KLSAgICAgICAgZGlzcGF0Y2guZ2V0UmVxdWVzdENvbnRleHQoKS5yZW1vdmUoTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX01FVEhPRCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZShudWxsKTsNCi0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24iKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIHRoYXQncyB3aGF0IHdlIGV4cGVjdA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgDQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3NvdXJjZS9EaXNwYXRjaFhQYXlsb2FkU291cmNlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3NvdXJjZS9EaXNwYXRjaFhQYXlsb2FkU291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNTRlYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9zb3VyY2UvRGlzcGF0Y2hYUGF5bG9hZFNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAuY2xpZW50VGVzdHMuZGlzcGF0Y2guc291cmNlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hYUGF5bG9hZFNvdXJjZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBIT1NUUE9SVCA9ICJodHRwOi8vbG9jYWxob3N0OjYwNjAiOw0KLSAgICAgICAgDQotICAgIHByaXZhdGUgU3RyaW5nIEVORFBPSU5UX1VSTCA9IEhPU1RQT1JUICsgIi9heGlzMi9zZXJ2aWNlcy9YTWVzc2FnZVNvdXJjZVByb3ZpZGVyLlhNZXNzYWdlU291cmNlUHJvdmlkZXJQb3J0IjsNCi0gICAgcHJpdmF0ZSBRTmFtZSBTRVJWSUNFX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYUGF5bG9hZFNvdXJjZVByb3ZpZGVyIik7DQotICAgIHByaXZhdGUgUU5hbWUgUE9SVF9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWFBheWxvYWRTb3VyY2VQcm92aWRlclBvcnQiKTsNCi0gDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxfVEVYVCA9ICI8cDplY2hvIHhtbG5zOnA9XCJodHRwOi8vc2FtcGxlXCI+aGVsbG8gd29ybGQ8L3A6ZWNobz4iOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MX1RFWFRfTlBFID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5OUEU8L3A6ZWNobz4iOw0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERpc3BhdGNoWFBheWxvYWRTb3VyY2VUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotICANCi0gICAgcHVibGljIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFNFUlZJQ0VfTkFNRSk7DQotICAgICAgIHNlcnZpY2UuYWRkUG9ydChQT1JUX05BTUUsIEhUVFBCaW5kaW5nLkhUVFBfQklORElORyxFTkRQT0lOVF9VUkwpOw0KLSAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChQT1JUX05BTUUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgWE1ML0hUVFAgUGF5bG9hZCBUZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MX1RFWFQ7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRCeXRlcygpKTsNCi0gICAgICAgIFNvdXJjZSBpblNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAgICAgDQotICAgICAgICBTb3VyY2Ugb3V0U291cmNlID0gZGlzcGF0Y2guaW52b2tlKGluU291cmNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2UgY29udGVudCBmb3IgY2hlY2tpbmcNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG91dFNvdXJjZSk7DQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGEgc2Vjb25kIHRpbWUgdG8gdmVyaWZ5DQotICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRCeXRlcygpKTsNCi0gICAgICAgIGluU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgoSW5wdXRTdHJlYW0pIHN0cmVhbSk7DQotICAgICAgICANCi0gICAgICAgIG91dFNvdXJjZSA9IGRpc3BhdGNoLmludm9rZShpblNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlIGNvbnRlbnQgZm9yIGNoZWNraW5nDQotICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG91dFNvdXJjZSk7DQotICAgICAgICByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOw0KLSAgICAgICAgcmVzcG9uc2UgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICANCi19DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc3RyaW5nL0Rpc3BhdGNoWE1lc3NhZ2VTdHJpbmdUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvY2xpZW50VGVzdHMvZGlzcGF0Y2gvc3RyaW5nL0Rpc3BhdGNoWE1lc3NhZ2VTdHJpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI2OGQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3N0cmluZy9EaXNwYXRjaFhNZXNzYWdlU3RyaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAuY2xpZW50VGVzdHMuZGlzcGF0Y2guc3RyaW5nOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5UZXN0TG9nZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5BYnN0cmFjdFRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi0NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hYTWVzc2FnZVN0cmluZ1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgSE9TVFBPUlQgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwIjsNCi0gICAgICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBFTkRQT0lOVF9VUkwgPSBIT1NUUE9SVCArICIvYXhpczIvc2VydmljZXMvWE1lc3NhZ2VTdHJpbmdQcm92aWRlci5YTWVzc2FnZVN0cmluZ1Byb3ZpZGVyUG9ydCI7DQotICAgIHByaXZhdGUgUU5hbWUgU0VSVklDRV9OQU1FICA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiWE1lc3NhZ2VTdHJpbmdQcm92aWRlciIpOw0KLSAgICBwcml2YXRlIFFOYW1lIFBPUlRfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhNZXNzYWdlU3RyaW5nUHJvdmlkZXJQb3J0Iik7DQotIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWE1MX1RFWFQgPSAiPHA6ZWNobyB4bWxuczpwPVwiaHR0cDovL3NhbXBsZVwiPmhlbGxvIHdvcmxkPC9wOmVjaG8+IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTF9URVhUX05QRSA9ICI8cDplY2hvIHhtbG5zOnA9XCJodHRwOi8vc2FtcGxlXCI+TlBFPC9wOmVjaG8+IjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGdldFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKERpc3BhdGNoWE1lc3NhZ2VTdHJpbmdUZXN0cy5jbGFzcykpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKCkgew0KLSAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShTRVJWSUNFX05BTUUpOw0KLSAgICAgICBzZXJ2aWNlLmFkZFBvcnQoUE9SVF9OQU1FLCBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsRU5EUE9JTlRfVVJMKTsNCi0gICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2goUE9SVF9OQU1FLCBTdHJpbmcuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsNCi0gICAgICAgcmV0dXJuIGRpc3BhdGNoOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIFhNTC9IVFRQIE1lc3NhZ2UgVGVzdA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IFhNTF9URVhUOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhIHNlY29uZCB0aW1lDQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVE9ETyBOZWVkIHRvIGZpeCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiIjsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVE9ETyBOZWVkIHRvIGZpeCB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHRlc3QNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIF90ZXN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IG51bGw7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRPRE8gTmVlZCB0byBmaXggdGhlIGltcGxlbWVudGF0aW9uIGFuZCB0ZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKCk7DQotICAgICAgICBTdHJpbmcgcmVxdWVzdCA9IFhNTF9URVhUX05QRTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUcnkgYWdhaW4gdG8gdmVyaWZ5DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNwb25zZSA9ICIgKyByZXNwb25zZSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmVxdWFscyhyZXNwb25zZSkpOw0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3N0cmluZy9EaXNwYXRjaFhQYXlsb2FkU3RyaW5nVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL2NsaWVudFRlc3RzL2Rpc3BhdGNoL3N0cmluZy9EaXNwYXRjaFhQYXlsb2FkU3RyaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmMDI3Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9jbGllbnRUZXN0cy9kaXNwYXRjaC9zdHJpbmcvRGlzcGF0Y2hYUGF5bG9hZFN0cmluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLmNsaWVudFRlc3RzLmRpc3BhdGNoLnN0cmluZzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuQWJzdHJhY3RUZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotcHVibGljIGNsYXNzIERpc3BhdGNoWFBheWxvYWRTdHJpbmdUZXN0cyBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIEhPU1RQT1JUID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MCI7DQotICAgICAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgRU5EUE9JTlRfVVJMID0gSE9TVFBPUlQgKyAiL2F4aXMyL3NlcnZpY2VzL1hQYXlsb2FkU3RyaW5nUHJvdmlkZXIuWFBheWxvYWRTdHJpbmdQcm92aWRlclBvcnQiOw0KLSAgICBwcml2YXRlIFFOYW1lIFNFUlZJQ0VfTkFNRSAgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlhQYXlsb2FkU3RyaW5nUHJvdmlkZXIiKTsNCi0gICAgcHJpdmF0ZSBRTmFtZSBQT1JUX05BTUUgID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJYUGF5bG9hZFN0cmluZ1Byb3ZpZGVyUG9ydCIpOw0KLSANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFhNTF9URVhUID0gIjxwOmVjaG8geG1sbnM6cD1cImh0dHA6Ly9zYW1wbGVcIj5oZWxsbyB3b3JsZDwvcDplY2hvPiI7DQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBYTUxfVEVYVF9OUEUgPSAiPHA6ZWNobyB4bWxuczpwPVwiaHR0cDovL3NhbXBsZVwiPk5QRTwvcDplY2hvPiI7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0VGVzdFNldHVwKG5ldyBUZXN0U3VpdGUoRGlzcGF0Y2hYUGF5bG9hZFN0cmluZ1Rlc3RzLmNsYXNzKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERpc3BhdGNoPFN0cmluZz4gZ2V0RGlzcGF0Y2goKSB7DQotICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKFNFUlZJQ0VfTkFNRSk7DQotICAgICAgIHNlcnZpY2UuYWRkUG9ydChQT1JUX05BTUUsIEhUVFBCaW5kaW5nLkhUVFBfQklORElORyxFTkRQT0lOVF9VUkwpOw0KLSAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZS5jcmVhdGVEaXNwYXRjaChQT1JUX05BTUUsIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgWE1ML0hUVFAgUGF5bG9hZCBUZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gWE1MX1RFWFQ7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRPRE8gTmVlZCB0byBmaXggdGhlIGltcGxlbWVudGF0aW9uIGFuZCB0ZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gZ2V0RGlzcGF0Y2goKTsNCi0gICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIiI7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRPRE8gTmVlZCB0byBmaXggdGhlIGltcGxlbWVudGF0aW9uIGFuZCB0ZXN0DQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBudWxsOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRyeSBhZ2FpbiB0byB2ZXJpZnkNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXF1ZXN0ICA9ICIgKyByZXF1ZXN0KTsNCi0gICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2guaW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc3BvbnNlID0gIiArIHJlc3BvbnNlKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZXF1YWxzKHJlc3BvbnNlKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUT0RPIE5lZWQgdG8gZml4IHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGVzdA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX3Rlc3RFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBnZXREaXNwYXRjaCgpOw0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSBYTUxfVEVYVF9OUEU7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVxdWVzdCAgPSAiICsgcmVxdWVzdCk7DQotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVHJ5IGFnYWluIHRvIHZlcmlmeQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlcXVlc3QgID0gIiArIHJlcXVlc3QpOw0KLSAgICAgICAgcmVzcG9uc2UgPSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzcG9uc2UgPSAiICsgcmVzcG9uc2UpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5lcXVhbHMocmVzcG9uc2UpKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9kYXRhc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9kYXRhc291cmNlL1hNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2Yjc3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL2RhdGFzb3VyY2UvWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5wcm92aWRlci5tZXNzYWdlLmRhdGFzb3VyY2U7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIFNhbXBsZSBYTUwvSFRUUCBEYXRhU291cmNlIFByb3ZpZGVyIA0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlhNZXNzYWdlRGF0YVNvdXJjZVByb3ZpZGVyIikNCi1AQmluZGluZ1R5cGUoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1wdWJsaWMgY2xhc3MgWE1lc3NhZ2VEYXRhU291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxEYXRhU291cmNlPiB7DQotICAgIEBSZXNvdXJjZQ0KLSAgICBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQ7DQotICAgIA0KLSAgICBwdWJsaWMgRGF0YVNvdXJjZSBpbnZva2UoRGF0YVNvdXJjZSBpbnB1dCkgew0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgY3R4ID0gd3NDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNYXAgYXR0YWNobWVudHMgPSAoTWFwKSBjdHguZ2V0KE1lc3NhZ2VDb250ZXh0LklOQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7DQotICAgICAgICBjdHgucHV0KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMsIGF0dGFjaG1lbnRzKTsNCi0gICAgICAgIHJldHVybiBpbnB1dDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhmMWJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc291cmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zb3VyY2UvWE1lc3NhZ2VTb3VyY2VQcm92aWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zb3VyY2UvWE1lc3NhZ2VTb3VyY2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWI2YWQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc291cmNlL1hNZXNzYWdlU291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MueG1saHR0cC5wcm92aWRlci5tZXNzYWdlLnNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsNCi0NCi0vKioNCi0gKiBTYW1wbGUgWE1ML0hUVFAgU3RyaW5nIFByb3ZpZGVyIA0KLSAqLw0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IlhNZXNzYWdlU291cmNlUHJvdmlkZXIiKQ0KLUBCaW5kaW5nVHlwZShIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpDQotQFNlcnZpY2VNb2RlKHZhbHVlPVNlcnZpY2UuTW9kZS5NRVNTQUdFKQ0KLXB1YmxpYyBjbGFzcyBYTWVzc2FnZVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7DQotDQotICAgIEBSZXNvdXJjZQ0KLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgY3R4Ow0KLSAgICANCi0gICAgcHVibGljIFNvdXJjZSBpbnZva2UoU291cmNlIGlucHV0KSB7DQotICAgICAgICBTdHJpbmcgbWV0aG9kID0gKFN0cmluZyljdHguZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCk7DQotICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ID0gIjxyZXNwb25zZT4iICsgbWV0aG9kICsgIjwvcmVzcG9uc2U+IjsNCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRCeXRlcygpKTsNCi0gICAgICAgICAgICBpbnB1dCA9IG5ldyBTdHJlYW1Tb3VyY2UoKElucHV0U3RyZWFtKSBzdHJlYW0pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGlucHV0Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL21lc3NhZ2Uvc3RyaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3N0cmluZy9YTWVzc2FnZVN0cmluZ1Byb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9tZXNzYWdlL3N0cmluZy9YTWVzc2FnZVN0cmluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjhjOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvbWVzc2FnZS9zdHJpbmcvWE1lc3NhZ2VTdHJpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLnByb3ZpZGVyLm1lc3NhZ2Uuc3RyaW5nOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotLyoqDQotICogU2FtcGxlIFhNTC9IVFRQIFN0cmluZyBQcm92aWRlciANCi0gKi8NCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJYTWVzc2FnZVN0cmluZ1Byb3ZpZGVyIikNCi1AQmluZGluZ1R5cGUoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKQ0KLUBTZXJ2aWNlTW9kZSh2YWx1ZT1TZXJ2aWNlLk1vZGUuTUVTU0FHRSkNCi1wdWJsaWMgY2xhc3MgWE1lc3NhZ2VTdHJpbmdQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gew0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgIGlmIChpbnB1dC5jb250YWlucygiTlBFIikpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIk5QRSBUaHJvd24hIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaW5wdXQ7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZjFiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3NvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc291cmNlL1hQYXlsb2FkU291cmNlUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc291cmNlL1hQYXlsb2FkU291cmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1MTMxYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3NvdXJjZS9YUGF5bG9hZFNvdXJjZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnhtbGh0dHAucHJvdmlkZXIucGF5bG9hZC5zb3VyY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotLyoqDQotICogU2FtcGxlIFhNTC9IVFRQIFN0cmluZyBQcm92aWRlciANCi0gKi8NCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJYUGF5bG9hZFNvdXJjZVByb3ZpZGVyIikNCi1AQmluZGluZ1R5cGUoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBYUGF5bG9hZFNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7DQotDQotICAgIHB1YmxpYyBTb3VyY2UgaW52b2tlKFNvdXJjZSBpbnB1dCkgew0KLSAgICAgICAgcmV0dXJuIGlucHV0Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy94bWxodHRwL3Byb3ZpZGVyL3BheWxvYWQvc3RyaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGYxYmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zdHJpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MveG1saHR0cC9wcm92aWRlci9wYXlsb2FkL3N0cmluZy9YUGF5bG9hZFN0cmluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Njc4MzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3htbGh0dHAvcHJvdmlkZXIvcGF5bG9hZC9zdHJpbmcvWFBheWxvYWRTdHJpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy54bWxodHRwLnByb3ZpZGVyLnBheWxvYWQuc3RyaW5nOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotDQotLyoqDQotICogU2FtcGxlIFhNTC9IVFRQIFN0cmluZyBQcm92aWRlciANCi0gKi8NCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lPSJYUGF5bG9hZFN0cmluZ1Byb3ZpZGVyIikNCi1AQmluZGluZ1R5cGUoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBYUGF5bG9hZFN0cmluZ1Byb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7DQotDQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgaWYgKGlucHV0LmNvbnRhaW5zKCJOUEUiKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTlBFIFRocm93biEiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpbnB1dDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNoby5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3NjZjZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZWNobyBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvIiwgcHJvcE9yZGVyID0gew0KLSAgICAidGV4dCINCi19KQ0KLXB1YmxpYyBjbGFzcyBFY2hvIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNob1BvcnQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvUG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQzYWY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLg0KLSAqIEpBWC1XUyBSSSAyLjAtYjI2LWVhMw0KLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wDQotICogDQotICovDQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIHdzZGxMb2NhdGlvbiA9ICJcXHdvcmtcXGFwcHNcXGVjbGlwc2VcXHdvcmtzcGFjZVxcYXhpczItbGl2ZVxcbW9kdWxlc1xcamF4d3NcXHRlc3QtcmVzb3VyY2VzXFx3c2RsXFxXU0RMVGVzdHMud3NkbCIpDQotcHVibGljIGludGVyZmFjZSBFY2hvUG9ydCB7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHRleHQNCi0gICAgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJFY2hvIiwgYWN0aW9uID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzL2VjaG8iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIkVjaG8iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvIikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiRWNob1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNob1Jlc3BvbnNlIikNCi0gICAgcHVibGljIHZvaWQgZWNobygNCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInRleHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpDQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB0ZXh0KTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9SZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9SZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFjZmU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuYXhpczIudGVzdHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVjaG9SZXNwb25zZSBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqIA0KLSAqIA0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gImVjaG9SZXNwb25zZSIsIHByb3BPcmRlciA9IHsNCi0gICAgInRleHQiDQotfSkNCi1wdWJsaWMgY2xhc3MgRWNob1Jlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvRWNob1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQyZDY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC1iMjYtZWEzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkVjaG9TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgRUNIT1NFUlZJQ0UgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9TZXJ2aWNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIEVDSE9QT1JUID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvUG9ydCIpOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L0M6L3dvcmsvYXBwcy9lY2xpcHNlL3dvcmtzcGFjZS9heGlzMi1saXZlL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbCIpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFY2hvU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFdTRExfTE9DQVRJT04sIEVDSE9TRVJWSUNFKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRWNob1BvcnQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9Qb3J0IikNCi0gICAgcHVibGljIEVjaG9Qb3J0IGdldEVjaG9Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChFY2hvUG9ydClzdXBlci5nZXRQb3J0KEVDSE9QT1JULCBFY2hvUG9ydC5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9FY2hvU2VydmljZUltcGxXaXRoU0VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTIyNDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuYXhpczIudGVzdHM7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9TZXJ2aWNlIiwgZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNob1BvcnQiKQ0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZUltcGxXaXRoU0VJIHsNCi0gICAgLy8gVE9ETzogVGVzdCBhbGwgY29uZGl0aW9ucyBpbiBKU1ItMTgxIHNwZWMgU2VjIDMuMSBwMTMNCi0gICAgcHVibGljIHZvaWQgZWNobyhIb2xkZXI8U3RyaW5nPiB0ZXh0KSB7DQotICAgICAgICB0ZXh0LnZhbHVlID0gIkVjaG8gIiArIHRleHQudmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL09iamVjdEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNTBmODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9vcmcvYXBhY2hlL3dzL2F4aXMyL3Rlc3RzL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuYXhpczIudGVzdHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCANCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlIA0KLSAqIGdlbmVyYXRlZCBpbiB0aGUgb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cyBwYWNrYWdlLiANCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5IA0KLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIA0KLSAqIGZvciBYTUwgY29udGVudC4gVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgWE1MIA0KLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcyANCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hIA0KLSAqIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCANCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlIA0KLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuDQotICogDQotICovDQotQFhtbFJlZ2lzdHJ5DQotcHVibGljIGNsYXNzIE9iamVjdEZhY3Rvcnkgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfRWNob1Jlc3BvbnNlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvUmVzcG9uc2UiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0VjaG9fUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG8iKTsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3NlcyBmb3IgcGFja2FnZTogb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cw0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVjaG9SZXNwb25zZSB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEVjaG9SZXNwb25zZSBjcmVhdGVFY2hvUmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEVjaG9SZXNwb25zZSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVjaG8gfQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBFY2hvIGNyZWF0ZUVjaG8oKSB7DQotICAgICAgICByZXR1cm4gbmV3IEVjaG8oKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEVjaG9SZXNwb25zZSB9e0Bjb2RlID59fQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBuYW1lID0gIkVjaG9SZXNwb25zZSIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxFY2hvUmVzcG9uc2U+IGNyZWF0ZUVjaG9SZXNwb25zZShFY2hvUmVzcG9uc2UgdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RWNob1Jlc3BvbnNlPihfRWNob1Jlc3BvbnNlX1FOQU1FLCBFY2hvUmVzcG9uc2UuY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEVjaG8gfXtAY29kZSA+fX0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgbmFtZSA9ICJFY2hvIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEVjaG8+IGNyZWF0ZUVjaG8oRWNobyB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxFY2hvPihfRWNob19RTkFNRSwgRWNoby5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9wYWNrYWdlLWluZm8uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS93cy9heGlzMi90ZXN0cy9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwNWFlNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L29yZy9hcGFjaGUvd3MvYXhpczIvdGVzdHMvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIpDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzOw0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5MjQxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotDQotDQotICAgICAgICAvKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIEVjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQuamF2YQ0KLSAgICAgICAgICoNCi0gICAgICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICAgICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UIEFwciAwOSwgMjAwNiAoMTA6MjA6MzYgQ0RUKQ0KLSAgICAgICAgICovDQotICAgICAgICBwYWNrYWdlIHNlcnZlcjsNCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogIEVjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQgbWVzc2FnZSByZWNlaXZlcg0KLSAgICAgICAgICovDQotDQotICAgICAgICBwdWJsaWMgY2xhc3MgRWNob1NlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dCBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyew0KLQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG5ld01zZ0NvbnRleHQpDQotICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotDQotICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgLy8gZ2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlDQotICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QobXNnQ29udGV4dCk7DQotDQotICAgICAgICAvL0luamVjdCB0aGUgTWVzc2FnZSBDb250ZXh0IGlmIGl0IGlzIGFza2VkIGZvcg0KLSAgICAgICAgLy9vcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZXBlbmRlbmN5TWFuYWdlci5jb25maWd1cmVCdXNpbmVzc0xvZ2ljUHJvdmlkZXIob2JqLCBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSk7DQotDQotICAgICAgICBFY2hvU2VydmljZVNrZWxldG9uIHNrZWwgPSAoRWNob1NlcnZpY2VTa2VsZXRvbilvYmo7DQotICAgICAgICAvL091dCBFbnZlbG9wDQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsNCi0gICAgICAgIC8vRmluZCB0aGUgYXhpc09wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIHNldCBieSB0aGUgRGlzcGF0Y2ggcGhhc2UuDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24gb3AgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCk7DQotICAgICAgICBpZiAob3AgPT0gbnVsbCkgew0KLSAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJPcGVyYXRpb24gaXMgbm90IGxvY2F0ZWQsIGlmIHRoaXMgaXMgZG9jbGl0IHN0eWxlIHRoZSBTT0FQLUFDVElPTiBzaG91bGQgc3BlY2lmaWVkIHZpYSB0aGUgU09BUCBBY3Rpb24gdG8gdXNlIHRoZSBSYXdYTUxQcm92aWRlciIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7DQotICAgICAgICBpZihvcC5nZXROYW1lKCkgIT0gbnVsbCAmIChtZXRob2ROYW1lID0gb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSAhPSBudWxsKXsNCi0NCi0gICAgICAgIA0KLQ0KLQ0KLSAgICAgICAgICAgIGlmKCJlY2hvU3RyaW5nIi5lcXVhbHMobWV0aG9kTmFtZSkpew0KLQ0KLQ0KLSAgICAgICAgICAgIHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UgcGFyYW0zID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIC8vZG9jIHN0eWxlDQotICAgICAgICAgICAgICAgICAgICBwYXJhbTMgPXNrZWwuZWNob1N0cmluZygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcnZlci5FY2hvU3RyaW5nKWZyb21PTShtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLCBzZXJ2ZXIuRWNob1N0cmluZy5jbGFzcykpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlID0gdG9FbnZlbG9wZShnZXRTT0FQRmFjdG9yeShtc2dDb250ZXh0KSwgcGFyYW0zLCBmYWxzZSk7DQotICAgICAgICAgICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIA0KLQ0KLSAgICAgICAgbmV3TXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7DQotICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgIA0KLSAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIHByaXZhdGUgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50ICB0b09NKHNlcnZlci5FY2hvU3RyaW5nIHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlciBidWlsZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHBhcmFtLmdldFB1bGxQYXJzZXIoc2VydmVyLkVjaG9TdHJpbmcuTVlfUU5BTUUpKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGRvY3VtZW50RWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTm9kZUV4KSBkb2N1bWVudEVsZW1lbnQpLnNldFBhcmVudChudWxsKTsgLy8gcmVtb3ZlIHRoZSBwYXJlbnQgbGluaw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdG9kbyBmaW5pc2ggdGhpcyBvbmVjZSB0aGUgYmVhbiBzZXJpYWxpemVyIGhhcyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCBzZXJ2ZXIuRWNob1N0cmluZyBwYXJhbSwgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbil7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJTT0FQTW9kZWxCdWlsZGVyKHBhcmFtLmdldFB1bGxQYXJzZXIoc2VydmVyLkVjaG9TdHJpbmcuTVlfUU5BTUUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvZG8gZmluaXNoIHRoaXMgb25lY2UgdGhlIGJlYW4gc2VyaWFsaXplciBoYXMgdGhlIG5lY2Vzc2FyeSBtZXRob2RzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICBwcml2YXRlICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCAgdG9PTShzZXJ2ZXIuRWNob1N0cmluZ1Jlc3BvbnNlIHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy5BREJCZWFuKXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlciBidWlsZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TdHJlYW1XcmFwcGVyKHBhcmFtLmdldFB1bGxQYXJzZXIoc2VydmVyLkVjaG9TdHJpbmdSZXNwb25zZS5NWV9RTkFNRSkpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01Ob2RlRXgpIGRvY3VtZW50RWxlbWVudCkuc2V0UGFyZW50KG51bGwpOyAvLyByZW1vdmUgdGhlIHBhcmVudCBsaW5rDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQ7DQotICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90b2RvIGZpbmlzaCB0aGlzIG9uZWNlIHRoZSBiZWFuIHNlcmlhbGl6ZXIgaGFzIHRoZSBuZWNlc3NhcnkgbWV0aG9kcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBwcml2YXRlICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnksIHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UgcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KXsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW4pew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQlNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCU09BUE1vZGVsQnVpbGRlcihwYXJhbS5nZXRQdWxsUGFyc2VyKHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UuTVlfUU5BTUUpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvZG8gZmluaXNoIHRoaXMgb25lY2UgdGhlIGJlYW4gc2VyaWFsaXplciBoYXMgdGhlIG5lY2Vzc2FyeSBtZXRob2RzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotDQotICAgICAgICAgICAvKioNCi0gICAgICAgICAgICogIGdldCB0aGUgZGVmYXVsdCBlbnZlbG9wZQ0KLSAgICAgICAgICAgKi8NCi0gICAgICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5KXsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICAgICB9DQotDQotDQotICAgICAgICAgICAgcHJpdmF0ZSAgamF2YS5sYW5nLk9iamVjdCBmcm9tT00ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sDQotICAgICAgICAgICAgamF2YS5sYW5nLkNsYXNzIHR5cGUpew0KLQ0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIuRWNob1N0cmluZy5jbGFzcy5lcXVhbHModHlwZSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXIuRWNob1N0cmluZy5GYWN0b3J5LnBhcnNlKHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIuRWNob1N0cmluZ1Jlc3BvbnNlLmNsYXNzLmVxdWFscyh0eXBlKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UuRmFjdG9yeS5wYXJzZShwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgIA0KLQ0KLSAgICAgICAgfQ0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU2VydmljZVNrZWxldG9uLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU2VydmljZVNrZWxldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2Q0MzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1NlcnZpY2VTa2VsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEVjaG9TZXJ2aWNlU2tlbGV0b24uamF2YQ0KLSAqDQotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwNCi0gKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246IFNOQVBTSE9UIEFwciAwOSwgMjAwNiAoMTA6MjA6MzYgQ0RUKQ0KLSAqLw0KLXBhY2thZ2Ugc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLlRlc3RMb2dnZXI7DQotDQotLyoqDQotICogIEVjaG9TZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlDQotICovDQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlU2tlbGV0b24gew0KLQ0KLSAgICAvKioNCi0gICAgICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQ0KLSAgICAgKiBAcGFyYW0gcGFyYW0wDQotICAgICAqLw0KLSAgICBwdWJsaWMgIHNlcnZlci5FY2hvU3RyaW5nUmVzcG9uc2UgZWNob1N0cmluZyhzZXJ2ZXIuRWNob1N0cmluZyBpbnB1dCkgew0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXINCi0gICAgICAgICAgICAgICAgLmRlYnVnKCI+PiBFbnRlcmluZyBtZXRob2QgW0VjaG9TdHJpbmdSZXNwb25zZSBFY2hvU2VydmljZVNrZWxldG9uLmVjaG9TdHJpbmcoRWNob1N0cmluZyldIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gRW5kcG9pbnQgcmVjZWl2ZWQgaW5wdXQgWyIgKyBpbnB1dC5nZXRJbnB1dCgpICsgIl0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZXR1cm5pbmcgc3RyaW5nIFtFQ0hPOiIgKyBpbnB1dC5nZXRJbnB1dCgpICsgIl0iKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyDQotICAgICAgICAgICAgICAgIC5kZWJ1ZygiPDwgRG9uZSB3aXRoIG1ldGhvZCBbRWNob1N0cmluZ1Jlc3BvbnNlIEVjaG9TZXJ2aWNlU2tlbGV0b24uZWNob1N0cmluZyhFY2hvU3RyaW5nKV0iKTsNCi0gICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBvdXRwdXQgPSBuZXcgRWNob1N0cmluZ1Jlc3BvbnNlKCk7DQotICAgICAgICBvdXRwdXQuc2V0RWNob1N0cmluZ1JldHVybigiRUNITzoiICsgaW5wdXQuZ2V0SW5wdXQoKSk7DQotICAgICAgICByZXR1cm4gb3V0cHV0Ow0KLSAgICB9DQotfQ0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU3RyaW5nLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9FY2hvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGNjMmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1N0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLQ0KLSAgICAgICAgICAgIC8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0gICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAqIEVjaG9TdHJpbmcuamF2YQ0KLSAgICAgICAgICAgICoNCi0gICAgICAgICAgICAqIFRoaXMgZmlsZSB3YXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBXU0RMDQotICAgICAgICAgICAgKiBieSB0aGUgQXBhY2hlIEF4aXMyIHZlcnNpb246ICNheGlzVmVyc2lvbiMgI3RvZGF5Iw0KLSAgICAgICAgICAgICovDQotDQotICAgICAgICAgICAgcGFja2FnZSBzZXJ2ZXI7DQotDQotICAgICAgICAgICAgaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLSAgICAgICAgICAgIGltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsNCi0gICAgICAgICAgICBpbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOw0KLQ0KLSAgICAgICAgICAgIGltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLSAgICAgICAgICAgIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi0NCi0gICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAqICBFY2hvU3RyaW5nIGJlYW4gY2xhc3MNCi0gICAgICAgICAgICAqLw0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyAgY2xhc3MgRWNob1N0cmluZw0KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkJlYW57DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBNWV9RTkFNRSA9IG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKA0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QiLA0KLSAgICAgICAgICAgICAgICAiZWNob1N0cmluZyIsDQotICAgICAgICAgICAgICAgICJuczEiKTsNCi0NCi0NCi0NCi0NCi0gICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAqIGZpZWxkIGZvciBJbnB1dA0KLSAgICAgICAgICAgICovDQotDQotICAgICAgICAgICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxJbnB1dCA7DQotDQotDQotDQotICAgICAgICAgICAvKioNCi0gICAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZA0KLSAgICAgICAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICAgICAgICovDQotICAgICAgICAgICBwdWJsaWMgIGphdmEubGFuZy5TdHJpbmcgZ2V0SW5wdXQoKSB7DQotICAgICAgICAgICAgICAgaWYgKGxvY2FsSW5wdXQuZXF1YWxzKCJUSFJPVyBFWENFUFRJT04iKSkNCi0gICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInRlc3QgZXhjZXB0aW9uIik7DQotICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsSW5wdXQ7DQotICAgICAgICAgICB9DQotDQotDQotDQotICAgICAgICAgICAgICAgICAgICAvKioNCi0gICAgICAgICAgICAgICAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kDQotICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHBhcmFtIElucHV0DQotICAgICAgICAgICAgICAgICAgICovDQotICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElucHV0KGphdmEubGFuZy5TdHJpbmcgcGFyYW0pew0KLQ0KLSAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsSW5wdXQ9cGFyYW07DQotICAgICAgICAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgKiBkYXRhYmluZGluZyBtZXRob2QgdG8gZ2V0IGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdA0KLSAgICAgICAgKg0KLSAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciBnZXRQdWxsUGFyc2VyKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcU5hbWUpew0KLQ0KLQ0KLQ0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGF0dHJpYkxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOw0KLQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudExpc3QuYWRkKG5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCJodHRwOi8vdGVzdCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCIpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TGlzdC5hZGQobG9jYWxJbnB1dD09bnVsbD9udWxsOg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGxvY2FsSW5wdXQpKTsNCi0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLnJlYWRlci5BREJYTUxTdHJlYW1SZWFkZXJJbXBsKHFOYW1lLCBlbGVtZW50TGlzdC50b0FycmF5KCksIGF0dHJpYkxpc3QudG9BcnJheSgpKTsNCi0NCi0NCi0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGZpbmFsIFFOYW1lIHBhcmVudFFOYW1lLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT01GYWN0b3J5IGZhY3RvcnksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEFEQkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUocGFyZW50UU5hbWUsIGZhY3RvcnksIHhtbFdyaXRlciwgZmFsc2UpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VyaWFsaXplVHlwZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbiBpbXBsZW1lbnRlZCBtZXRob2QiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLSAgICAgICAgLyoqDQotICAgICAgICAgICAgICogIEZhY3RvcnkgY2xhc3MgdGhhdCBrZWVwcyB0aGUgcGFyc2UgbWV0aG9kDQotICAgICAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3Rvcnl7DQotDQotICAgICAgICAgICAgICAgLyoqDQotICAgICAgICAgICAgICAgKiBzdGF0aWMgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgb2JqZWN0DQotICAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIEVjaG9TdHJpbmcgcGFyc2UoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbnsNCi0gICAgICAgICAgICAgICBFY2hvU3RyaW5nIG9iamVjdCA9IG5ldyBFY2hvU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7DQotDQotICAgICAgICAgICAgICAvL2V2ZW50IGJldHRlciBiZSBhIFNUQVJUX0VMRU1FTlQuIGlmIG5vdCB3ZSBzaG91bGQgZ28gdXAgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgaGVyZQ0KLSAgICAgICAgICAgICAgIHdoaWxlIChldmVudCE9IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsNCi0gICAgICAgICAgICAgICAgICAgZXZlbnQgPSByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgIH0NCi0NCi0NCi0gICAgICAgICAgICAgICBpZiAoIU1ZX1FOQU1FLmVxdWFscyhyZWFkZXIuZ2V0TmFtZSgpKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiV3JvbmcgUU5hbWUiKTsNCi0gICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLlNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUgc3RhdGVNYWNoaW5lMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLlNpbXBsZUVsZW1lbnRSZWFkZXJTdGF0ZU1hY2hpbmUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgc3RhcnRRbmFtZTEgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVNYWNoaW5lMS5zZXRFbGVtZW50TmFtZVRvVGVzdChzdGFydFFuYW1lMSk7DQotICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLnNldE5pbGxhYmxlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLnJlYWQocmVhZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRJbnB1dCgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVNYWNoaW5lMS5nZXRUZXh0KCk9PW51bGw/bnVsbDoNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLkNvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLmdldFRleHQoKSkpOw0KLQ0KLSAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ow0KLSAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICB9Ly9lbmQgb2YgZmFjdG9yeSBjbGFzcw0KLQ0KLQ0KLQ0KLQ0KLQ0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgDQotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL0VjaG9TdHJpbmdSZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTBiYWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MtaW50ZWdyYXRpb24vdGVzdC9zZXJ2ZXIvRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLS8qKg0KLSAqIEVjaG9TdHJpbmdSZXNwb25zZS5qYXZhDQotICoNCi0gKiBUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIGZyb20gV1NETA0KLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogI2F4aXNWZXJzaW9uIyAjdG9kYXkjDQotICovDQotcGFja2FnZSBzZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLkFEQkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiAgRWNob1N0cmluZ1Jlc3BvbnNlIGJlYW4gY2xhc3MNCi0gKi8NCi1wdWJsaWMgIGNsYXNzIEVjaG9TdHJpbmdSZXNwb25zZSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcuQURCQmVhbnsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIE1ZX1FOQU1FID0gbmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoDQotICAgICAgICAgICAgImh0dHA6Ly90ZXN0IiwNCi0gICAgICAgICAgICAiZWNob1N0cmluZ1Jlc3BvbnNlIiwNCi0gICAgICAgICAgICAibnMxIik7DQotDQotICAgIC8qKg0KLSAgICAgKiBmaWVsZCBmb3IgRWNob1N0cmluZ1JldHVybg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbG9jYWxFY2hvU3RyaW5nUmV0dXJuOw0KLQ0KLSAgICAvKioNCi0gICAgICogQXV0byBnZW5lcmF0ZWQgZ2V0dGVyIG1ldGhvZA0KLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVjaG9TdHJpbmdSZXR1cm4oKSB7DQotICAgICAgICByZXR1cm4gbG9jYWxFY2hvU3RyaW5nUmV0dXJuOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBzZXR0ZXIgbWV0aG9kDQotICAgICAqIEBwYXJhbSBwYXJhbSBFY2hvU3RyaW5nUmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRFY2hvU3RyaW5nUmV0dXJuKGphdmEubGFuZy5TdHJpbmcgcGFyYW0pIHsNCi0NCi0gICAgICAgIHRoaXMubG9jYWxFY2hvU3RyaW5nUmV0dXJuID0gcGFyYW07DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIGRhdGFiaW5kaW5nIG1ldGhvZCB0byBnZXQgYW4gWE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0DQotICAgICAqDQotICAgICAqLw0KLSAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UHVsbFBhcnNlcigNCi0gICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIHFOYW1lKSB7DQotDQotICAgICAgICBqYXZhLnV0aWwuQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsNCi0gICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QgYXR0cmliTGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7DQotDQotICAgICAgICBlbGVtZW50TGlzdC5hZGQobmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoImh0dHA6Ly90ZXN0IiwNCi0gICAgICAgICAgICAgICAgImVjaG9TdHJpbmdSZXR1cm4iKSk7DQotDQotICAgICAgICBlbGVtZW50TGlzdC5hZGQobG9jYWxFY2hvU3RyaW5nUmV0dXJuID09IG51bGwgPyBudWxsDQotICAgICAgICAgICAgICAgIDogb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsDQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnZlcnRUb1N0cmluZyhsb2NhbEVjaG9TdHJpbmdSZXR1cm4pKTsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5yZWFkZXIuQURCWE1MU3RyZWFtUmVhZGVySW1wbCgNCi0gICAgICAgICAgICAgICAgcU5hbWUsIGVsZW1lbnRMaXN0LnRvQXJyYXkoKSwgYXR0cmliTGlzdC50b0FycmF5KCkpOw0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShmaW5hbCBRTmFtZSBwYXJlbnRRTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NRmFjdG9yeSBmYWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBREJFeGNlcHRpb24gew0KLSAgICAgICAgc2VyaWFsaXplKHBhcmVudFFOYW1lLCBmYWN0b3J5LCB4bWxXcml0ZXIsIGZhbHNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoZmluYWwgUU5hbWUgcGFyZW50UU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPTUZhY3RvcnkgZmFjdG9yeSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlcmlhbGl6ZVR5cGUpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgQURCRXhjZXB0aW9uIHsNCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW4gaW1wbGVtZW50ZWQgbWV0aG9kIik7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqICBGYWN0b3J5IGNsYXNzIHRoYXQga2VlcHMgdGhlIHBhcnNlIG1ldGhvZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IHsNCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogc3RhdGljIG1ldGhvZCB0byBjcmVhdGUgdGhlIG9iamVjdA0KLSAgICAgICAgICovDQotDQotICAgICAgICBwdWJsaWMgc3RhdGljIEVjaG9TdHJpbmdSZXNwb25zZSBwYXJzZSgNCi0gICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgcmVhZGVyKQ0KLSAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIG9iamVjdCA9IG5ldyBFY2hvU3RyaW5nUmVzcG9uc2UoKTsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBpbnQgZXZlbnQgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7DQotDQotICAgICAgICAgICAgICAgIC8vZXZlbnQgYmV0dGVyIGJlIGEgU1RBUlRfRUxFTUVOVC4gaWYgbm90IHdlIHNob3VsZCBnbyB1cCB0byB0aGUgc3RhcnQgZWxlbWVudCBoZXJlDQotICAgICAgICAgICAgICAgIHdoaWxlIChldmVudCAhPSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7DQotICAgICAgICAgICAgICAgICAgICBldmVudCA9IHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKCFNWV9RTkFNRS5lcXVhbHMocmVhZGVyLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldyb25nIFFOYW1lIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5TaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lIHN0YXRlTWFjaGluZTEgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5TaW1wbGVFbGVtZW50UmVhZGVyU3RhdGVNYWNoaW5lKCk7DQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgc3RhcnRRbmFtZTEgPSBuZXcgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QiLCAiZWNob1N0cmluZ1JldHVybiIpOw0KLSAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLnNldEVsZW1lbnROYW1lVG9UZXN0KHN0YXJ0UW5hbWUxKTsNCi0gICAgICAgICAgICAgICAgc3RhdGVNYWNoaW5lMS5zZXROaWxsYWJsZSgpOw0KLSAgICAgICAgICAgICAgICBzdGF0ZU1hY2hpbmUxLnJlYWQocmVhZGVyKTsNCi0gICAgICAgICAgICAgICAgb2JqZWN0DQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldEVjaG9TdHJpbmdSZXR1cm4oc3RhdGVNYWNoaW5lMS5nZXRUZXh0KCkgPT0gbnVsbCA/IG51bGwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb252ZXJ0VG9TdHJpbmcoc3RhdGVNYWNoaW5lMQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KCkuZ2V0Qnl0ZXMoKSkpOw0KLQ0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5FeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBvYmplY3Q7DQotICAgICAgICB9DQotDQotICAgIH0vL2VuZCBvZiBmYWN0b3J5IGNsYXNzDQotDQotfQ0KLSAgICAgICAgICAgDQotICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvc2VydmVyL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMjliZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy1pbnRlZ3JhdGlvbi90ZXN0L3NlcnZlci9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c2VydmljZUdyb3VwPg0KLSA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+DQotICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIgY2xhc3M9InNlcnZlci5FY2hvU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT3V0Ii8+DQotICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2VydmVyLkVjaG9TZXJ2aWNlU2tlbGV0b248L3BhcmFtZXRlcj4NCi0gIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4NCi0gICAgPGFjdGlvbk1hcHBpbmcvPg0KLSAgPC9vcGVyYXRpb24+DQotIDwvc2VydmljZT4NCi08L3NlcnZpY2VHcm91cD4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy1tYXIvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzLW1hci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2IwNWVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLW1hci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3cy1tYXI8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKQVhXUyAobWFyKTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgSkFYV1MgSW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2pheHdzLW1hcjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2pheHdzLW1hcjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4d3MtbWFyPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgCi0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotCi0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLnByb3BlcnRpZXM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotCi0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtbWFyL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sIGIvMV81L21vZHVsZXMvamF4d3MtbWFyL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzAyNDY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLW1hci9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxtb2R1bGUgbmFtZT0iamF4d3MiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1vZHVsZS5KQVhXU01vZHVsZSI+Ci0gICAgPERlc2NyaXB0aW9uPlRoaXMgaXMgQXhpczIgaW1wbGVtZW50YXRpb24gb2YgSkFYLVdTPC9EZXNjcmlwdGlvbj4KLQotICAgIDxJbkZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZENoZWNrZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZENoZWNrZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJEaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2guRGlzcGF0Y2hPcGVyYXRpb25IYW5kbGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRDaGVja2VyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GYXVsdEZsb3c+Ci0KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MtbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21vZHVsZS9KQVhXU01vZHVsZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MtbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21vZHVsZS9KQVhXU01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YzZWMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzLW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tb2R1bGUvSkFYV1NNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubW9kdWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU01vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIHJlZ2lzdGVyR2xvYmFsTW9kdWxlKGF4aXNDb25maWd1cmF0aW9uLCAiamF4d3MiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyR2xvYmFsTW9kdWxlKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kdWxlTmFtZSkgewotICAgICAgICBpZiAoIWF4aXNDb25maWd1cmF0aW9uLmdldEdsb2JhbE1vZHVsZXMoKS5jb250YWlucyhtb2R1bGVOYW1lKSkgewotICAgICAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkR2xvYmFsTW9kdWxlUmVmKG1vZHVsZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvamF4d3MvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTEyMmYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9Iml0ZXN0IiBkZWZhdWx0PSJidWlsZC1yZXBvIiBiYXNlZGlyPSIuIj4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtcmVwbyIgdW5sZXNzPSJ0ZXN0LnNraXAiPgotCi0JCTwhLS0gU3RhbmRhcmQgcmVwb3NpdG9yeSAtLT4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkiLz4KLQkJPG1rZGlyIGRpcj0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZiIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeS9zZXJ2aWNlcyIvPgotCQk8bWtkaXIgZGlyPSJ0YXJnZXQvcmVwb3NpdG9yeS9tb2R1bGVzIi8+Ci0JCTxjb3B5IGZpbGU9Ii4uL2FkZHJlc3NpbmcvdGFyZ2V0L2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIKLSAgICAJICAgICAgICAgICAgICAgICAgdG9maWxlPSJ0YXJnZXQvcmVwb3NpdG9yeS9tb2R1bGVzL2FkZHJlc3NpbmctJHthZGRyZXNzaW5nX3ZlcnNpb259Lm1hciIvPgotCQk8Y29weSBmaWxlPSIuLi9rZXJuZWwvY29uZi9heGlzMi54bWwiCi0gICAgCSAgICAgICAgICAgICAgICAgIHRvZmlsZT0idGFyZ2V0L3JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiLz4KLQotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9wb20ueG1sIGIvMV81L21vZHVsZXMvamF4d3MvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0ODYzNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBKQVhXUzwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgSkFYV1MgSW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFubm90YXRpb25fMS4wX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNhYWo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54bWwtcmVzb2x2ZXI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtcmVzb2x2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNyMTczPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhhbGFuPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3MzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbHVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4d3M8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9qYXh3czwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamF4d3M8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi53c2RsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgLVhib290Y2xhc3NwYXRoL3A6JHtiYXNlZGlyfS8uLi9qYXh3cy1hcGkvdGFyZ2V0L2NsYXNzZXMke3BhdGguc2VwYXJhdG9yfSR7YmFzZWRpcn0vLi4vandzLWFwaS90YXJnZXQvY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlclZlcnNpb24+MS41PC9jb21waWxlclZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbi10czwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXNrcyB1bmxlc3M9Im1hdmVuLnRlc3Quc2tpcCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhlcmVzIGdvdCB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMveHNkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id3NkbC5zb3VyY2UuZGlyIiB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvd3NkbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5vdXRwdXQuYmFzZS5kaXIiIHZhbHVlPSJ0YXJnZXQvc2NoZW1hIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9zcmMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfS9jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIG1ha2UgdGhlIGRpcnMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSdW4gSkFYQiBzY2hlbWEgY29tcGlsZXIgd2l0aCBkZXNpZ25hdGVkIHNjaGVtYXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgSkFYLUIgY2xhc3NlcyBmcm9tIFhTRHM8L2VjaG8+Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gZWNoby54c2Q8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgJHtzY2hlbWEuc291cmNlLmRpcn0vZWNoby54c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBzdG9jazEueHNkPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3N0b2NrMS54c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBzdG9jazIueHNkPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0ICR7c2NoZW1hLnNvdXJjZS5kaXJ9L3N0b2NrMi54c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBzYW1wbGVtdG9tLnhzZDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAke3NjaGVtYS5zb3VyY2UuZGlyfS9zYW1wbGVtdG9tLnhzZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXZhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobz5HZW5lcmF0aW5nIGphdmEgZnJvbSBQcm94eURvY0xpdFdyYXBwZWQud3NkbDwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ibWF2ZW4ucnVudGltZS5jbGFzc3BhdGgiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbXBpbGVkLmNsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IC1xdWlldCAtcCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkIC1xdWlldCAtd3NkbCAke3dzZGwuc291cmNlLmRpcn0vUHJveHlEb2NMaXRXcmFwcGVkLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gQWRkTnVtYmVycy53c2RsPC9lY2hvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5zdW4udG9vbHMueGpjLkRyaXZlciIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7Y29tcGlsZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyBsaW5lPSItZCAke3NjaGVtYS5nZW5lcmF0ZWQuc3JjLmRpcn0gLXF1aWV0IC13c2RsICR7d3NkbC5zb3VyY2UuZGlyfS9BZGROdW1iZXJzLndzZGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmJ1aWxkLXJlcG88L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3MgdW5sZXNzPSJtYXZlbi50ZXN0LnNraXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSB0b0Rpcj0idGFyZ2V0L3Rlc3QtY2xhc3Nlcy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0LXJlc291cmNlcy8iPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9heGlzMi54bWwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFkZHJlc3NpbmdfdmVyc2lvbiIgdmFsdWU9IiR7cHJvamVjdC52ZXJzaW9ufSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9Ii4iIHRhcmdldD0iYnVpbGQtcmVwbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFkZC10ZXN0LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXRlc3Qtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vdGFyZ2V0L3NjaGVtYS9zcmM8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5vbmNlPC9mb3JrTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhtczI1Nm0gLVhteDUxMm08L2FyZ0xpbmU+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gRW5hYmxlIHRoZSBuZXh0IDIgbGluZXMgaWYgeW91IHdhbnQgdG8gYXR0YWNoIGEgZGVidWdnZXIKLSAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhkZWJ1ZyAtWG5vYWdlbnQgLURqYXZhLmNvbXBpbGVyPU5PTkUgLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNjwvYXJnTGluZT4tLT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+T0FTSVNDYXRhbG9nTWFuYWdlci5jYXRhbG9nLmRlYnVnLmxldmVsPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT45OTk5PC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+LS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVpbGQucmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+Li90YXJnZXQvdGVzdC1jbGFzc2VzPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuYXhpczIuc2Fhai5NZXNzYWdlRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBGYWN0b3J5SW1wbDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBDb25uZWN0aW9uRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5NZXRhRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNBQUpNZXRhRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTmVlZCB0aGlzIGZvciB0aGUgY2xpZW50IHNpZGUgdG8gcGlja3VwIGFuIGF4aXMyLnhtbCB0byBjb25maWd1cmUgU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbmZpZy5wYXRoPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4uL3RhcmdldC90ZXN0LWNsYXNzZXMvYXhpczIueG1sPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZXBvLnBhdGg8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPi4vdGFyZ2V0L3JlcG9zaXRvcnk8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHJldmVudCBNYWMgT1MgWCBmcm9tIHNob3dpbmcgYW4gaWNvbiBpbiB0aGUgZG9jayBkdXJpbmcgdGhlIHRlc3QgcnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmEuYXd0LmhlYWRsZXNzPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLndzLnNwaS5Qcm92aWRlciBiLzFfNS9tb2R1bGVzL2pheHdzL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwud3Muc3BpLlByb3ZpZGVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTUzMTk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwud3Muc3BpLlByb3ZpZGVyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL1NvdXJjZURhdGFTb3VyY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvU291cmNlRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDVjMzM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvU291cmNlRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZTsNCi0NCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uZHMuT01EYXRhU291cmNlRXh0QmFzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0Ow0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIE9NRGF0YVNvdXJjZSBiYWNrZWQgYnkgYSBzb3VyY2UNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU291cmNlRGF0YVNvdXJjZSBleHRlbmRzIE9NRGF0YVNvdXJjZUV4dEJhc2Ugew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU291cmNlRGF0YVNvdXJjZS5jbGFzcyk7DQotICAgIFNvdXJjZSBkYXRhOw0KLQ0KLSAgICBwdWJsaWMgU291cmNlRGF0YVNvdXJjZShTb3VyY2UgZGF0YSkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9NRGF0YVNvdXJjZUV4dCBjb3B5KCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7DQotICAgICAgICByZXR1cm4gZGF0YTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSAidXRmLTgiOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldFhNTEJ5dGVzKGVuY29kaW5nKSk7DQotICAgICAgICAgICAgcmV0dXJuIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMsIGVuY29kaW5nKTsNCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgZ2V0WE1MQnl0ZXMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGJ5dGVzID0gKGJ5dGVbXSkgbnVsbDsNCi0NCi0gICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgew0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9ICgoU3RyZWFtU291cmNlKSBkYXRhKS5nZXRJbnB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBnZXRCeXRlc0Zyb21TdHJlYW0oaXMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3V0KTsNCi0gICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOw0KLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZGF0YSwgcmVzdWx0KTsNCi0gICAgICAgICAgICAgICAgYnl0ZXMgPSBvdXQudG9CeXRlQXJyYXkoKTsNCi0gICAgICAgICAgICB9ICAgICAgICAgICAgDQotICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgZ2V0WE1MQnl0ZXMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBieXRlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsNCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRCeXRlc0Zyb21TdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAvLyBUT0RPIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYXZhaWxhYmxlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmVhbS4NCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2lzLmF2YWlsYWJsZSgpXTsNCi0gICAgICAgIGlzLnJlYWQoYnl0ZXMpOw0KLSAgICAgICAgcmV0dXJuIGJ5dGVzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvWE1MU3RyaW5nRGF0YVNvdXJjZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9YTUxTdHJpbmdEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MzE1YzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9YTUxTdHJpbmdEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2U7DQotDQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmRzLk9NRGF0YVNvdXJjZUV4dEJhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIE9NRGF0YVNvdXJjZSBiYWNrZWQgYnkgYSBzdHJpbmcgY29udGFpbmluZyB4bWwgZGF0YQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBYTUxTdHJpbmdEYXRhU291cmNlIGV4dGVuZHMgT01EYXRhU291cmNlRXh0QmFzZSB7DQotICAgIFN0cmluZyBkYXRhOw0KLQ0KLSAgICBwdWJsaWMgWE1MU3RyaW5nRGF0YVNvdXJjZShTdHJpbmcgZGF0YSkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9NRGF0YVNvdXJjZUV4dCBjb3B5KCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBYTUxTdHJpbmdEYXRhU291cmNlKGRhdGEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgew0KLSAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gInV0Zi04IjsNCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShnZXRYTUxCeXRlcyhlbmNvZGluZykpOw0KLSAgICAgICAgICAgIHJldHVybiBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzLCBlbmNvZGluZyk7DQotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBieXRlW10gZ2V0WE1MQnl0ZXMoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gZGF0YS5nZXRCeXRlcyhlbmNvZGluZyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVdyaXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDU3NDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJBdHRhY2htZW50TWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01YTUxTdHJlYW1Xcml0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NVGV4dEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZheC5tYWlsLk1lc3NhZ2luZ0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5JbnRlcm5ldEhlYWRlcnM7DQotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZUJvZHlQYXJ0Ow0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0Lk1pbWVQYXJ0RGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50TWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7DQotDQotLyoqDQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWEIgQXR0YWNobWVudE1hcnNoYWxsZXIgdGhhdCBpcyB1c2VkIHRvIGhhbmRsZSBiaW5hcnkgZGF0YSBmcm9tIEpBWEINCi0gKiBhbmQgY3JlYXRlIHBvcHVsYXRlIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RzIG9uIHRoZSBNZXNzYWdlQ29udGV4dA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIgZXh0ZW5kcyBBdHRhY2htZW50TWFyc2hhbGxlciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQ7DQotICAgIHByaXZhdGUgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX09DVEVUID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IHRoZSBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIgdGhhdCBoYXMgYWNjZXNzIHRvIHRoZSBNZXNzYWdlQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gd3JpdGVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsNCi0gICAgICAgIHRoaXMubXNnQ29udGV4dCA9IG1zZ0NvbnRleHQ7DQotICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogT3ZlcnJpZGUgaXNYT1BQYWNrYWdldCB0byBjYWxjdWxhdGUgdGhlIGlzWE9QUGFja2FnZSBzZXR0aW5nDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hPUFBhY2thZ2UoKSB7DQotICAgICAgICBib29sZWFuIHZhbHVlID0gZmFsc2U7DQotICAgICAgICANCi0gICAgICAgIC8vIEZvciBvdXRib3VuZCBtZXNzYWdlcywgb25seSB0cmlnZ2VyIE1UT00gaWYNCi0gICAgICAgIC8vIHRoZSBtZXNzYWdlIGlzIG10b20gZW5hYmxlZC4NCi0gICAgICAgIHZhbHVlID0gaXNNVE9NRW5hYmxlZCgpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJZiB0aGUgd3JpdGVyIGlzIG5vdCBhbiBNVE9NIFhNTFN0cmVhbVdyaXRlciB0aGVuIHdlIGRvbid0IGhhdmUNCi0gICAgICAgIC8vIGFueSBwbGFjZSB0byBzdG9yZSB0aGUgYXR0YWNobWVudA0KLSAgICAgICAgaWYgKCEod3JpdGVyIGluc3RhbmNlb2YgTVRPTVhNTFN0cmVhbVdyaXRlcikpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgd3JpdGVyIGlzIG5vdCBlbmFibGVkIGZvciBNVE9NLiAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVRPTSB2YWx1ZXMgd2lsbCBub3QgYmUgb3B0aW1pemVkIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHZhbHVlID0gZmFsc2U7DQotICAgICAgICB9DQotICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsgDQotICAgICAgICAgICAgbG9nLmRlYnVnKCJpc1hPUFBhY2thZ2UgcmV0dXJucyAiICsgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHZhbHVlOyAgICAgICAgDQotICAgIH0NCi0NCi0gICAgDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRNYXJzaGFsbGVyI2FkZE10b21BdHRhY2htZW50KGJ5dGVbXSwgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGFkZE10b21BdHRhY2htZW50KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkgew0KLQ0KLSAgICAgICAgaWYgKG9mZnNldCAhPSAwIHx8IGxlbmd0aCAhPSBkYXRhLmxlbmd0aCkgew0KLSAgICAgICAgICAgIGludCBsZW4gPSBsZW5ndGggLSBvZmZzZXQ7DQotICAgICAgICAgICAgYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtsZW5dOw0KLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBuZXdEYXRhLCAwLCBsZW4pOw0KLSAgICAgICAgICAgIGRhdGEgPSBuZXdEYXRhOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAobWltZVR5cGUgPT0gbnVsbCB8fCBtaW1lVHlwZS5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgbWltZVR5cGUgPSBBUFBMSUNBVElPTl9PQ1RFVDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsgDQotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgTVRPTS9YT1AgYnl0ZSBhcnJheSBhdHRhY2htZW50IGZvciBlbGVtZW50OiAiICsgDQotICAgICAgICAgICAgICAgICAgICAgICJ7IiArIG5hbWVzcGFjZSArICJ9IiArIGxvY2FsUGFydCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBjaWQgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIE1JTUUgQm9keSBQYXJ0DQotICAgICAgICAgICAgICAgIEludGVybmV0SGVhZGVycyBpaCA9IG5ldyBJbnRlcm5ldEhlYWRlcnMoKTsNCi0gICAgICAgICAgICAgICAgaWguc2V0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgbWltZVR5cGUpOw0KLSAgICAgICAgICAgICAgICBNaW1lQm9keVBhcnQgbWJwID0gbmV3IE1pbWVCb2R5UGFydChpaCwgZGF0YSk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvL0NyZWF0ZSBhIGRhdGEgc291cmNlIGZvciB0aGUgTUlNRSBCb2R5IFBhcnQNCi0gICAgICAgICAgICAgICAgTWltZVBhcnREYXRhU291cmNlIG1wZHMgPSBuZXcgTWltZVBhcnREYXRhU291cmNlKG1icCk7DQotICAgICAgICAgICAgICAgIGxvbmcgZGF0YUxlbmd0aCA9ZGF0YS5sZW5ndGg7DQotICAgICAgICAgICAgICAgIEludGVnZXIgdmFsdWUgPSBudWxsOw0KLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChJbnRlZ2VyKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1UT01fVEhSRVNIT0xEKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQgb3B0aW1pemVkVGhyZXNob2xkID0gKHZhbHVlICE9IG51bGwpID8gdmFsdWUuaW50VmFsdWUoKSA6IDA7DQotDQotICAgICAgICAgICAgICAgIGlmKG9wdGltaXplZFRocmVzaG9sZD09MCB8fCBkYXRhTGVuZ3RoID4gb3B0aW1pemVkVGhyZXNob2xkKXsNCi0gICAgICAgICAgICAgICAgCURhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKG1wZHMpOw0KLSAgICAgICAgICAgICAgICAJY2lkID0gYWRkRGF0YUhhbmRsZXIoZGF0YUhhbmRsZXIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNvbnRlbnQgaWQgdG8gdGhlIG1pbWUgYm9keSBwYXJ0DQotICAgICAgICAgICAgICAgIG1icC5zZXRIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9JRCwgY2lkKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChNZXNzYWdpbmdFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gY2lkID09IG51bGwgPyBudWxsIDogImNpZDoiICsgY2lkOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudE1hcnNoYWxsZXIjYWRkTXRvbUF0dGFjaG1lbnQoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgYWRkTXRvbUF0dGFjaG1lbnQoRGF0YUhhbmRsZXIgZGF0YSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsgDQotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgTVRPTS9YT1AgZGF0YWhhbmRsZXIgYXR0YWNobWVudCBmb3IgZWxlbWVudDogIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAieyIgKyBuYW1lc3BhY2UgKyAifSIgKyBsb2NhbFBhcnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU3RyaW5nIGNpZCA9IGFkZERhdGFIYW5kbGVyKGRhdGEpOw0KLSAgICAgICAgcmV0dXJuIGNpZCA9PSBudWxsID8gbnVsbCA6ICJjaWQ6IiArIGNpZDsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRNYXJzaGFsbGVyI2FkZFN3YVJlZkF0dGFjaG1lbnQoamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcikNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgYWRkU3dhUmVmQXR0YWNobWVudChEYXRhSGFuZGxlciBkYXRhKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpeyANCi0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBTV0FSRUYgYXR0YWNobWVudCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgY2lkID0gYWRkRGF0YUhhbmRsZXIoZGF0YSk7DQotICAgICAgICBzZXREb2luZ1NXQSgpOw0KLSAgICAgICAgcmV0dXJuICJjaWQ6IiArIGNpZDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgRGF0YUhhbmRsZXIgdG8gdGhlIHdyaXRlciBhbmQgY29udGV4dA0KLSAgICAgKiBAcGFyYW0gZGgNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWRkRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGgpIHsNCi0gICAgICAgIFN0cmluZyBjaWQgPSBudWxsOw0KLSAgICAgICAgT01UZXh0IHRleHROb2RlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBNVE9NWE1MU3RyZWFtV3JpdGVyIHRoZW4gaW5mb3JtIHRoZSB3cml0ZXIgDQotICAgICAgICAvLyB0aGF0IGl0IG11c3Qgd3JpdGUgb3V0IHRoaXMgYXR0Y2htZW50IChJIGd1ZXNzIHdlIHNob3VsZCBkbyB0aGlzDQotICAgICAgICAvLyBldmVuIGlmIHRoZSBhdHRhY2htZW50IGlzIFNXQVJFRiA/KQ0KLSAgICAgICAgaWYgKHdyaXRlciBpbnN0YW5jZW9mIE1UT01YTUxTdHJlYW1Xcml0ZXIpIHsNCi0gICAgICAgICAgICB0ZXh0Tm9kZSA9IG5ldyBPTVRleHRJbXBsKGRoLCBudWxsKTsNCi0gICAgICAgIAlpZigoKE1UT01YTUxTdHJlYW1Xcml0ZXIpIHdyaXRlcikuaXNPcHRpbWl6ZWRUaHJlc2hvbGQodGV4dE5vZGUpKXsNCi0gICAgICAgIAkJY2lkID0gdGV4dE5vZGUuZ2V0Q29udGVudElEKCk7DQotICAgICAgICAJCSgoTVRPTVhNTFN0cmVhbVdyaXRlcikgd3JpdGVyKS53cml0ZU9wdGltaXplZCh0ZXh0Tm9kZSk7DQotICAgICAgICAJCS8vIFJlbWVtYmVyIHRoZSBhdHRhY2htZW50IG9uIHRoZSBtZXNzYWdlLg0KLSAgICAgICAgCQlhZGREYXRhSGFuZGxlcihkaCwgY2lkKTsNCi0gICAgICAgIAl9ICAgICAgICAJDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7IA0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgY29udGVudCBpZD0iICsgY2lkKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIiAgIGRhdGFIYW5kbGVyICA9IiArIGRoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjaWQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gaWYgTVRPTSBlbmFibGVkIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY29udGV4dCBpbmZvcm1hdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpIHsNCi0gICAgICAgIGlmIChtc2dDb250ZXh0ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSk7DQotICAgICAgICAgICAgcmV0dXJuICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSh2YWx1ZSkpOw0KLSAgICAgICAgfSAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZSBvbiB0aGUgY29udGV4dCB0aGF0IFNXQSBhdHRhY2htZW50cyBhcmUgZW5jb3VudGVyZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldERvaW5nU1dBKCkgew0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdTd0EodHJ1ZSk7DQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9TV0EsICJ0cnVlIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmZvcm0gdGhlIGNvbnRleHQgdGhhdCBhbiBBdHRhY2htZW50IChEYXRhSGFuZGxlciwgQ0lEKSBpcyB3cml0dGVuLg0KLSAgICAgKiBAcGFyYW0gZGgNCi0gICAgICogQHBhcmFtIGNpZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGgsIFN0cmluZyBjaWQpIHsNCi0gICAgICAgIGlmIChtc2dDb250ZXh0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBtc2dDb250ZXh0LmFkZEF0dGFjaG1lbnQoY2lkLCBkaCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhZDgzMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50VW5tYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotLyoqDQotICogSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXINCi0gKiA8cC8+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxsaW5rPmphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudFVubWFyc2hhbGxlcjwvbGluaz4gdGhhdCBpcw0KLSAqIHVzZWQgZm9yIGRlc2VyaWFsaXppbmcgWE9QIGVsZW1lbnRzIGludG8gdGhlaXIgY29ycmVzcG9uZGluZyBiaW5hcnkgZGF0YSBwYWNrYWdlcy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgZXh0ZW5kcyBBdHRhY2htZW50VW5tYXJzaGFsbGVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyLmNsYXNzKTsNCi0NCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0Ow0KLSAgICBwcml2YXRlIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXI7DQotDQotICAgIHB1YmxpYyBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlcihNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIpIHsNCi0gICAgICAgIHRoaXMubXNnQ29udGV4dCA9IG1zZ0NvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNYT1BQYWNrYWdlKCkgew0KLSAgICAgICAgDQotICAgICAgICAvLyBBbnkgbWVzc2FnZSB0aGF0IGlzIHJlY2VpdmVkIG1pZ2h0IGNvbnRhaW4gTVRPTS4NCi0gICAgICAgIC8vIFNvIGFsd2F5cyByZXR1cm4gdHJ1ZS4NCi0gICAgICAgIGJvb2xlYW4gdmFsdWUgPSB0cnVlOw0KLSAgICAgICAgDQotICAgICAgICAvLyBIYXZlIHRoZSBPTSBYTUxTdHJlYW1SZWFkZXIgKE9NU3RBWFdyYXBwZXIpDQotICAgICAgICAvLyBzZW50IHhvcDppbmNsdWRlIGV2ZW50cw0KLSAgICAgICAgaWYgKHhtbFN0cmVhbVJlYWRlciBpbnN0YW5jZW9mIE9NWE1MU3RyZWFtUmVhZGVyKSB7DQotICAgICAgICAgICAgKChPTVhNTFN0cmVhbVJlYWRlcikgeG1sU3RyZWFtUmVhZGVyKS5zZXRJbmxpbmVNVE9NKHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7IA0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiaXNYT1BQYWNrYWdlIHJldHVybnMgIiArIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEF0dGFjaG1lbnRBc0J5dGVBcnJheShTdHJpbmcgY2lkKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gcmV0cmlldmUgYXR0YWNobWVudCBbIiArIGNpZCArICJdIGFzIGEgYnl0ZVtdIik7DQotICAgICAgICB9DQotICAgICAgICBEYXRhSGFuZGxlciBkaCA9IGdldEF0dGFjaG1lbnRBc0RhdGFIYW5kbGVyKGNpZCk7DQotICAgICAgICBpZiAoZGggIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0KGRoKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIHRoZSBieXRlW10gIiArIGlvZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKGlvZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJyZXR1cm5pbmcgbnVsbCBieXRlW10iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXRBdHRhY2htZW50QXNEYXRhSGFuZGxlcihTdHJpbmcgY2lkKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gcmV0cmlldmUgYXR0YWNobWVudCBbIiArIGNpZCArICJdIGFzIGEgRGF0YUhhbmRsZXIiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gZ2V0RGF0YUhhbmRsZXIoY2lkKTsNCi0gICAgICAgIGlmIChkaCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGRoOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBTdHJpbmcgY2lkMiA9IGdldE5ld0NJRChjaWQpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgZGF0YUhhbmRsZXIgd2FzIG5vdCBmb3VuZCBmb3IgWyIgKyBjaWQgKyAiXSB0cnlpbmcgWyIgKyBjaWQyICsgIl0iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZGggPSBnZXREYXRhSGFuZGxlcihjaWQyKTsNCi0gICAgICAgICAgICBpZiAoZGggIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGg7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gTm8gRGF0YSBIYW5kbGVyIGZvdW5kDQotICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibm9EYXRhSGFuZGxlciIsIGNpZCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGNpZA0KLSAgICAgKiBAcmV0dXJuIGNpZCB3aXRoIHRyYW5zbGF0ZWQgY2hhcmFjdGVycw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3Q0lEKFN0cmluZyBjaWQpIHsNCi0gICAgICAgIFN0cmluZyBjaWQyID0gY2lkOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBjaWQyID0gamF2YS5uZXQuVVJMRGVjb2Rlci5kZWNvZGUoY2lkLCAiVVRGLTgiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0TmV3Q0lEIGRlY29kaW5nICIgKyBjaWQgKyAiIGFzIFVURi04IGRlY29kaW5nIGVycm9yOiAiICsgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNpZDI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFJlYWQgdGhlIGJ5dGVzIGZyb20gdGhlIERhdGFIYW5kbGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGgNCi0gICAgICogQHJldHVybiBieXRlW10NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBieXRlW10gY29udmVydChEYXRhSGFuZGxlciBkaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBieXRlW10gZnJvbSBEYXRhSGFuZGxlciAiICsgZGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBkaC5nZXRJbnB1dFN0cmVhbSgpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJEYXRhSGFuZGxlciBJbnB1dFN0cmVhbSAiICsgaXMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzEwMjRdOw0KLSAgICAgICAgaW50IG51bSA9IGlzLnJlYWQoYik7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBpZiAobnVtIDw9IDApIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEYXRhSGFuZGxlciBJbnB1dFN0cmVhbSBjb250YWlucyBubyBkYXRhLiBudW09IiArIG51bSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgd2hpbGUgKG51bSA+IDApIHsNCi0gICAgICAgICAgICBiYW9zLndyaXRlKGIsIDAsIG51bSk7DQotICAgICAgICAgICAgbnVtID0gaXMucmVhZChiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcihTdHJpbmcgY2lkKSB7DQotICAgICAgICBTdHJpbmcgYmxvYmNpZCA9IGNpZDsNCi0gICAgICAgIGlmIChibG9iY2lkLnN0YXJ0c1dpdGgoImNpZDoiKSkgew0KLSAgICAgICAgICAgIGJsb2JjaWQgPSBibG9iY2lkLnN1YnN0cmluZyg0KTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIEdldCB0aGUgYXR0YWNobWVudCBmcm9tIHRoZSBtZXNzYWdlY29udGV4dCB1c2luZyB0aGUgYmxvYiBjaWQNCi0gICAgICAgIGlmIChtc2dDb250ZXh0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG1zZ0NvbnRleHQuZ2V0QXR0YWNobWVudChibG9iY2lkKTsNCi0gICAgICAgICAgICBpZiAoZGggIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuYWRkQmxvYkNJRChibG9iY2lkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHhtbFN0cmVhbVJlYWRlciBpbnN0YW5jZW9mIE9NWE1MU3RyZWFtUmVhZGVyKSB7DQotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSANCi0gICAgICAgICAgICAgICAgKChPTVhNTFN0cmVhbVJlYWRlcikgeG1sU3RyZWFtUmVhZGVyKS5nZXREYXRhSGFuZGxlcihibG9iY2lkKTsNCi0gICAgICAgICAgICBpZiAoZGggIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuYWRkQmxvYkNJRChibG9iY2lkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGRoOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZiYTE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGUgbW9uaXRvciBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyB0byBlbnN1cmUNCi0gKiB0aGF0IHRoZSBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlciBpcyB1c2VkIGFuZCBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuDQotICogSW4gbm9ybWFsIHVzYWdlLCBtb25pdG9yaW5nIGlzIG9mZi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1vbml0b3JpbmcgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGJsb2JDSURzID0gbmV3IEFycmF5TGlzdCgpOyANCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlbWlmb3JlID0gIkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvciI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW50ZW50aW9uYWxseSBwcml2YXRlLiAgQWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4NCi0gICAgICovDQotICAgIHByaXZhdGUgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yKCkgew0KLSAgICAgICAgDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtb25pdG9yaW5nDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb25pdG9yaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIG1vbml0b3Jpbmc7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCBtb25pdG9yaW5nDQotICAgICAqIEBwYXJhbSBtb25pdG9yaW5nIGJvb2xlYW4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNb25pdG9yaW5nKGJvb2xlYW4gbW9uaXRvcmluZykgew0KLSAgICAgICAgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXJNb25pdG9yLm1vbml0b3JpbmcgPSBtb25pdG9yaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2xlYXIgdGhlIG51bWJlciBvZiBjcmVhdGVzIGFuZCBmYWlsZWQgY3JlYXRlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgew0KLSAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgYmxvYkNJRHMuY2xlYXIoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgSkFYQkN1c3RvbUJ1aWxkZXJzIGNyZWF0ZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRCbG9iQ0lEcygpIHsNCi0gICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5VTSBCTE9CIENJRFMgPSIgKyBibG9iQ0lEcy5zaXplKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdChibG9iQ0lEcyk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5jcmVhc2UgbnVtYmVyIG9mIHRvdGFsIGJ1aWxkZXJzIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEJsb2JDSUQoU3RyaW5nIGJsb2JDSUQpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2FsbCBBREQgQkxPQiBDSUQgPSIgKyBibG9iQ0lEKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQUREIEJMT0IgQ0lEID0iICsgYmxvYkNJRCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYmxvYkNJRHMuYWRkKGJsb2JDSUQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQ3VzdG9tQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNTBjZDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Db250YWluZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Tb3VyY2VkRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuQ3VzdG9tQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi0NCi0vKioNCi0gKiBKQVhCQ3VzdG9tQnVpbGRlciBjcmVhdGVzIGFuIE9NU291cmNlZEVsZW1lbnQgYmFja2VkIGJ5IGEgSkFYQkRhdGFTb3VyY2UNCi0gKiBmb3IgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgYW5kIGxvY2FsUGFydC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQkN1c3RvbUJ1aWxkZXIgaW1wbGVtZW50cyBDdXN0b21CdWlsZGVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJDdXN0b21CdWlsZGVyLmNsYXNzKTsNCi0gICAgDQotICAgIEpBWEJEU0NvbnRleHQgamRzQ29udGV4dDsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBKQVhCQ3VzdG9tQnVpbGRlcg0KLSAgICAgKiBAcGFyYW0gY29udGV4dCBKQVhCRFNDb250ZXh0DQotICAgICAqLw0KLSAgICBwdWJsaWMgSkFYQkN1c3RvbUJ1aWxkZXIoSkFYQkRTQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5qZHNDb250ZXh0ID0gY29udGV4dDsNCi0gICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci51cGRhdGVUb3RhbEJ1aWxkZXJzKCk7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIE9NRWxlbWVudCBjcmVhdGUoU3RyaW5nIG5hbWVzcGFjZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUNvbnRhaW5lciBwYXJlbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIE9NRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJjcmVhdGUgbmFtZXNwYWNlID0gIiArIG5hbWVzcGFjZSk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGxvY2FsUGFydCA9ICIgKyBsb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICByZWFkZXIgPSAiICsgcmVhZGVyLmdldENsYXNzKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGVyZSBhcmUgc29tZSBzaXR1YXRpb25zIHdoZXJlIHdlIHdhbnQgdG8gdXNlIG5vcm1hbA0KLSAgICAgICAgLy8gdW5tYXJzaGFsbGluZywgc28gcmV0dXJuIG51bGwNCi0gICAgICAgIGlmICghc2hvdWxkVW5tYXJzaGFsKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KSkgew0KLSAgICAgICAgICAgIEpBWEJDdXN0b21CdWlsZGVyTW9uaXRvci51cGRhdGVUb3RhbEZhaWxlZENyZWF0ZXMoKTsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIE9NU291cmNlZEVsZW1lbnQgYmFja2VkIGJ5IGFuIHVubWFyc2hhbGxlZCBKQVhCIG9iamVjdA0KLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIHJlYWRlci5nZXRQcmVmaXgoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgT2JqZWN0IGpheGIgPSBqZHNDb250ZXh0LnVubWFyc2hhbChyZWFkZXIpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlN1Y2Nlc3NmdWxseSB1bm1hcnNoYWxsZWQgamF4YiBvYmplY3QgIiArIGpheGIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSBuZXcgSkFYQkRhdGFTb3VyY2UoamF4YiwgamRzQ29udGV4dCk7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIEpBWEJEYXRhU291cmNlIGlzICIgKyBkcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE9NU291cmNlZEVsZW1lbnQgb21zZSA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGRzLCBsb2NhbFBhcnQsIG5zKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQob21zZSk7DQotICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLnVwZGF0ZVRvdGFsQ3JlYXRlcygpOw0KLSAgICAgICAgICAgIHJldHVybiBvbXNlOw0KLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLnVwZGF0ZVRvdGFsRmFpbGVkQ3JlYXRlcygpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UNCi0gICAgICogQHBhcmFtIGxvY2FsUGFydA0KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBucyBhbmQgbG9jYWwgcGFydCBpcyBhY2NlcHRhYmxlIGZvciB1bm1hcnNoYWxsaW5nDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkVW5tYXJzaGFsKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQpIHsNCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBqZHNDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBpZiAobXNnQ3R4ICE9IG51bGwpIHsNCi0gICAgICAgICAgICB2YWx1ZSA9IG1zZ0N0eC5nZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfRU5BQkxFX0pBWEJfUEFZTE9BRF9TVFJFQU1JTkcpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7DQotICAgICAgICAgICAgYm9vbGVhbiBzdHJlYW1pbmdFbmFibGVkID0gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCk7DQotICAgICAgICAgICAgaWYgKCFzdHJlYW1pbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCIHBheWxvYWQgc3RyZWFtaW5nIGRpc2FibGVkIGJ5IG1lc3NhZ2VDb250ZXh0IHByb3BlcnR5ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENvbnN0YW50cy5KQVhXU19FTkFCTEVfSkFYQl9QQVlMT0FEX1NUUkVBTUlORw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXQgdG8gIiArIHN0cmVhbWluZ0VuYWJsZWQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIERvbid0IHVubWFyc2hhbGwgU09BUEZhdWx0cyBvciBhbnl0aGluZyBlbHNlIGluIHRoZSBTT0FQIA0KLSAgICAgICAgLy8gbmFtZXNwYWNlLg0KLSAgICAgICAgLy8gRG9uJ3QgdW5tYXJzaGFsbCBlbGVtZW50cyB0aGF0IGFyZSB1bnF1YWxpZmllZA0KLSAgICAgICAgaWYgKGxvY2FsUGFydCA9PSBudWxsIHx8IG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwIHx8DQotICAgICAgICAgICAgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUuZXF1YWxzKG5hbWVzcGFjZSkgfHwNCi0gICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRS5lcXVhbHMobmFtZXNwYWNlKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgDQotICAgICAgICAvLyBEb24ndCB1bm1hcnNoYWwgaWYgdGhpcyBsb29rcyBsaWtlIGVuY3J5cHRlZCBkYXRhDQotICAgICAgICBpZiAobG9jYWxQYXJ0LmVxdWFscygiRW5jcnlwdGVkRGF0YSIpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWM3M2M0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4YjsNCi0NCi0vKioNCi0gKiBUaGUgbW9uaXRvciBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyB0byBlbnN1cmUNCi0gKiB0aGF0IHRoZSBKQVhCQ3VzdG9tQnVpbGRlciBpcyB1c2VkIGFuZCBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuDQotICogSW4gbm9ybWFsIHVzYWdlLCBtb25pdG9yaW5nIGlzIG9mZi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbW9uaXRvcmluZyA9IGZhbHNlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdG90YWxCdWlsZGVycyA9IDA7DQotICAgIHByaXZhdGUgc3RhdGljIGludCB0b3RhbENyZWF0ZXMgPSAwOw0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgdG90YWxGYWlsZWRDcmVhdGVzID0gMDsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlbWlmb3JlID0gIkpBWEJDdXN0b21CdWlsZGVyTW9uaXRvciI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW50ZW50aW9uYWxseSBwcml2YXRlLiAgQWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4NCi0gICAgICovDQotICAgIHByaXZhdGUgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yKCkgew0KLSAgICAgICAgDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtb25pdG9yaW5nDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb25pdG9yaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIG1vbml0b3Jpbmc7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCBtb25pdG9yaW5nDQotICAgICAqIEBwYXJhbSBtb25pdG9yaW5nIGJvb2xlYW4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRNb25pdG9yaW5nKGJvb2xlYW4gbW9uaXRvcmluZykgew0KLSAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLm1vbml0b3JpbmcgPSBtb25pdG9yaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2xlYXIgdGhlIG51bWJlciBvZiBjcmVhdGVzIGFuZCBmYWlsZWQgY3JlYXRlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgew0KLSAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgdG90YWxDcmVhdGVzID0gMDsNCi0gICAgICAgICAgICB0b3RhbEZhaWxlZENyZWF0ZXMgPSAwOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBKQVhCQ3VzdG9tQnVpbGRlcnMgY3JlYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VG90YWxCdWlsZGVycygpIHsNCi0gICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgIHJldHVybiB0b3RhbEJ1aWxkZXJzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEluY3JlYXNlIG51bWJlciBvZiB0b3RhbCBidWlsZGVycyANCi0gICAgICovDQotICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVRvdGFsQnVpbGRlcnMoKSB7DQotICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IudG90YWxCdWlsZGVycysrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBzdWNjZXNzZnVsIGNyZWF0ZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRvdGFsQ3JlYXRlcygpIHsNCi0gICAgICAgIGlmIChpc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxDcmVhdGVzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGNyZWF0ZXMNCi0gICAgICovDQotICAgIHN0YXRpYyB2b2lkIHVwZGF0ZVRvdGFsQ3JlYXRlcygpIHsNCi0gICAgICAgIGlmIChpc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlck1vbml0b3IudG90YWxDcmVhdGVzKys7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmYWlsZWQgYXR0ZW1wdHMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFRvdGFsRmFpbGVkQ3JlYXRlcygpIHsNCi0gICAgICAgIGlmIChpc01vbml0b3JpbmcoKSkgew0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZChzZW1pZm9yZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxGYWlsZWRDcmVhdGVzOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGZhaWxlZCBjcmVhdGVzDQotICAgICAqLw0KLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVUb3RhbEZhaWxlZENyZWF0ZXMoKSB7DQotICAgICAgICBpZiAoaXNNb25pdG9yaW5nKCkpIHsNCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXJNb25pdG9yLnRvdGFsRmFpbGVkQ3JlYXRlcysrOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCRFNDb250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkRTQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjJlNmMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCRFNDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NWE1MU3RyZWFtV3JpdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxTdHJlYW1Xcml0ZXJXaXRoT1M7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlhNTFJvb3RFbGVtZW50VXRpbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50TWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYXR0YWNobWVudC5BdHRhY2htZW50VW5tYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247DQotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLS8qDQotICogVG8gbWFyc2hhbCBvciB1bm1hcnNoYWwgYSBKQVhCIG9iamVjdCwgdGhlIEpBWEJDb250ZXh0IGlzIG5lY2Vzc2FyeS4NCi0gKiBJbiBhZGRpdGlvbiwgYWNjZXNzIHRvIHRoZSBNZXNzYWdlQ29udGV4dCBhbmQgb3RoZXIgY29udGV4dCBvYmplY3RzIG1heSBiZSBuZWNlc3NhcnkNCi0gKiB0byBnZXQgY2xhc3Nsb2FkZXIgaW5mb3JtYXRpb24sIHN0b3JlIGF0dGFjaG1lbnRzIGV0Yy4NCi0gKiANCi0gKiBUaGUgSkFYQkRTQ29udGV4dCBidW5kbGVzIGFsbCBvZiB0aGlzIGluZm9ybWF0aW9uIHRvZ2V0aGVyLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCRFNDb250ZXh0IHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJEU0NvbnRleHQuY2xhc3MpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRU5BQkxFRCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLQ0KLSAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXM7ICAvLyBMaXN0IG9mIHBhY2thZ2VzIG5lZWRlZCBieSB0aGUgY29udGV4dA0KLSAgICBwcml2YXRlIFN0cmluZyBjb250ZXh0UGFja2FnZXNLZXk7ICAgICAgICAvLyBVbmlxdWUga2V5IHRoYXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHBhY2thZ2VzDQotICAgIA0KLSAgICBwcml2YXRlIEpBWEJDb250ZXh0IGN1c3RvbWVySkFYQkNvbnRleHQ7ICAgICAgLy8gSkFYQkNvbnRleHQgcHJvdmlkZWQgYnkgdGhlIGN1c3RvbWVyIGFwaQ0KLSAgICAvLyAgSkFYQkNvbnRleHQgbG9hZGVkIGJ5IHRoZSBlbmdpbmUuICBJdCBpcyB3ZWFrcmVmJ2QgdG8gYWxsb3cgR0MNCi0gICAgcHJpdmF0ZSBXZWFrUmVmZXJlbmNlPEpBWEJDb250ZXh0PiBhdXRvSkFYQkNvbnRleHQgPSBudWxsOyAgIA0KLSAgICBwcml2YXRlIEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRSAgICAgICAvLyBIb3cgdGhlIEpBWEJDb250ZXh0IGlzIGNvbnN0cnVjdGVkDQotICAgICAgICAgICAgY29uc3RydWN0aW9uVHlwZSA9IEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRS5VTktOT1dOOw0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQ7ICAgIA0KLQ0KLSAgICAvLyBUaGVyZSBhcmUgdHdvIG1vZGVzIG9mIG1hcnNoYWxsaW5nIGFuZCB1bm1hcnNoYWxsaW5nOiANCi0gICAgLy8gICAiYnkgamF2YSB0eXBlIiBhbmQgImJ5IHNjaGVtYSBlbGVtZW50Ii4NCi0gICAgLy8gVGhlIHByZWZlcmVkIG1vZGUgaXMgImJ5IHNjaGVtYSBlbGVtZW50IiBiZWNhdXNlIGl0IGlzIHNhZmUgYW5kIHhtbC1jZW50cmljLg0KLSAgICAvLyBIb3dldmVyIHRoZXJlIGFyZSBzb21lIGNpcmN1bXN0YW5jZXMgd2hlbiAiYnkgc2NoZW1hIGVsZW1lbnQiIGlzIG5vdCBhdmFpbGFibGUuDQotICAgIC8vICAgIEV4YW1wbGVzOiBSUEMgTGl0IHByb2Nlc3NpbmcgKHRoZSB3aXJlIGVsZW1lbnQgaXMgZGVmaW5lZCBieSBhIHdzZGw6cGFydC4uLm5vdCBzY2hlbWEpDQotICAgIC8vICAgICAgICAgICAgICBEb2MvTGl0IEJhcmUgIk1pbmltYWwiIFByb2Nlc3NpbmcgKEpBWEIgT2JqZWN0RmFjdG9yaWVzIGFyZSBtaXNzaW5nLi4uDQotICAgIC8vICAgICAgICAgICAgICAgICAgIGFuZCB0aHVzIHdlIG11c3QgdXNlICJieSB0eXBlIiBmb3IgcHJpbWl0aXZlcy9TdHJpbmcpDQotICAgIC8vIFBsZWFzZSBkb24ndCB1c2UgImJ5IGphdmEgdHlwZSIgcHJvY2Vzc2luZyB0byBnZXQgYXJvdW5kIGVycm9ycy4NCi0gICAgcHJpdmF0ZSBDbGFzcyBwcm9jZXNzVHlwZSA9IG51bGw7DQotICAgIHByaXZhdGUgYm9vbGVhbiBpc3htbExpc3QgPWZhbHNlOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZU5hbWVzcGFjZTsNCi0NCi0gICAgLyoqDQotICAgICAqIEZ1bGwgQ29uc3RydWN0b3IgSkFYQkRTQ29udGV4dCAobW9zdCBwZXJmb3JtYW50KQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcGFja2FnZXMgU2V0IG9mIHBhY2thZ2VzIG5lZWRlZCBieSB0aGUgSkFYQkNvbnRleHQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgSkFYQkRTQ29udGV4dChUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMsIFN0cmluZyBwYWNrYWdlc0tleSkgew0KLSAgICAgICAgdGhpcy5jb250ZXh0UGFja2FnZXMgPSBwYWNrYWdlczsNCi0gICAgICAgIHRoaXMuY29udGV4dFBhY2thZ2VzS2V5ID0gcGFja2FnZXNLZXk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNsaWdodGx5IHNsb3dlciBjb25zdHJ1Y3Rvcg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcGFja2FnZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhCRFNDb250ZXh0KFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcykgew0KLSAgICAgICAgdGhpcyhwYWNrYWdlcywgcGFja2FnZXMudG9TdHJpbmcoKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE5vcm1hbCBDb25zdHJ1Y3RvciBKQVhCQmxvY2tDb250ZXh0DQotICAgICAqDQotICAgICAqIEBwYXJhbSBjb250ZXh0UGFja2FnZQ0KLSAgICAgKiBAZGVwcmVjYXRlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIEpBWEJEU0NvbnRleHQoU3RyaW5nIGNvbnRleHRQYWNrYWdlKSB7DQotICAgICAgICB0aGlzLmNvbnRleHRQYWNrYWdlcyA9IG5ldyBUcmVlU2V0KCk7DQotICAgICAgICB0aGlzLmNvbnRleHRQYWNrYWdlcy5hZGQoY29udGV4dFBhY2thZ2UpOw0KLSAgICAgICAgdGhpcy5jb250ZXh0UGFja2FnZXNLZXkgPSB0aGlzLmNvbnRleHRQYWNrYWdlcy50b1N0cmluZygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiAiRGlzcGF0Y2giIENvbnN0cnVjdG9yIA0KLSAgICAgKiBVc2UgdGhpcyBmdWxsIGNvbnN0cnVjdG9yIHdoZW4gdGhlIEpBWEJDb250ZW50IGlzIHByb3ZpZGVkIGJ5IHRoZQ0KLSAgICAgKiBjdXN0b21lci4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGpheGJDb250ZXh0DQotICAgICAqLw0KLSAgICBwdWJsaWMgSkFYQkRTQ29udGV4dChKQVhCQ29udGV4dCBqYXhiQ29udGV4dCkgew0KLSAgICAgICAgdGhpcy5jdXN0b21lckpBWEJDb250ZXh0ID0gamF4YkNvbnRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqIEByZXR1cm4gQ2xhc3MgcmVwcmVzZW50aW5nIHR5cGUgb2YgdGhlIGVsZW1lbnQgKi8NCi0gICAgcHVibGljIFRyZWVTZXQ8U3RyaW5nPiBnZXRDb250ZXh0UGFja2FnZXMoKSB7DQotICAgICAgICByZXR1cm4gY29udGV4dFBhY2thZ2VzOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gZ2V0SkFYQkNvbnRleHQobnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gZ2V0IHRoZSBKQVhCQ29udGV4dA0KLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dChDbGFzc0xvYWRlciBjbCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGN1c3RvbWVySkFYQkNvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBjdXN0b21lckpBWEJDb250ZXh0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBHZXQgdGhlIHdlYWtseSBjYWNoZWQgSkFYQkNvbnRleHQNCi0gICAgICAgIEpBWEJDb250ZXh0IGpjID0gbnVsbDsNCi0gICAgICAgIGlmIChhdXRvSkFYQkNvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGpjID0gYXV0b0pBWEJDb250ZXh0LmdldCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoamMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoDQotICAgICAgICAgICAgICAgICAgICAgICAgIkEgSkFYQkNvbnRleHQgZGlkIG5vdCBleGlzdCwgY3JlYXRpbmcgYSBuZXcgb25lIHdpdGggdGhlIGNvbnRleHQgcGFja2FnZXMuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEhvbGRlcjxKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEU+IGNvbnN0cnVjdFR5cGUgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEhvbGRlcjxKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEU+KCk7DQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbnVsbDsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIFdlIHNldCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgdG8gdGhlIHdlYiBzZXJ2aWNlIG5hbWVzcGFjZSB0byBmaXggYW4NCi0gICAgICAgICAgICAgKiBvYnNjdXIgYnVnLg0KLSAgICAgICAgICAgICAqIA0KLSAgICAgICAgICAgICAqIElmIHRoZSBjbGFzcyByZXByZXNlbnRpbmcgYSBKQVhCIGRhdGEgb2JqZWN0IGRvZXMgbm90IGRlZmluZSBhIG5hbWVzcGFjZQ0KLSAgICAgICAgICAgICAqICh2aWEgYW4gYW5ub3RhdGlvbiBsaWtlIEBYbWxUeXBlIG9yIHZpYSBPYmplY3RGYWN0b3J5IG9yIHNjaGVtYSBnZW4gaW5mb3JtYXRpb24pDQotICAgICAgICAgICAgICogdGhlbiB0aGUgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIGRlZmF1bHRlZC4NCi0gICAgICAgICAgICAgKiANCi0gICAgICAgICAgICAgKiBUaGUgeGpjIHRvb2wgZGVmYXVsdHMgdGhlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiB0byB1bnF1YWxpZmllZC4NCi0gICAgICAgICAgICAgKiBIb3dldmVyIHRoZSB3c2ltcG9ydCB0b29sIGRlZmF1bHRzIHRoZSBuYW1lc3BhY2UgdG8gdGhlIG5hbWVzcGFjZSBvZiB0aGUNCi0gICAgICAgICAgICAgKiB3ZWJzZXJ2aWNlLg0KLSAgICAgICAgICAgICAqIA0KLSAgICAgICAgICAgICAqIFRvICJ3b3JrYXJvdW5kIiB0aGlzIGlzc3VlLCBhIGRlZmF1bHQgbmFtZXNwYWNlIGVxdWFsIHRvIHRoZSB3ZWJzZXJ2aWNlDQotICAgICAgICAgICAgICogbmFtZXNwYWNlIGlzIHNldCBvbiB0aGUgSkFYQiBtYXJzaGFsbGVyLiAgVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBjaGFuZ2luZyB0aGUNCi0gICAgICAgICAgICAgKiAidW5xdWFsaWZpZWQgbmFtZXNwYWNlcyIgaW50byB0aGUgbmFtZXNwYWNlIHVzZWQgYnkgdGhlIHdlYnNlcnZpY2UuDQotICAgICAgICAgICAgICogDQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgaWYgKHRoaXMud2ViU2VydmljZU5hbWVzcGFjZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsNCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoSkFYQlV0aWxzLkRFRkFVTFRfTkFNRVNQQUNFX1JFTUFQLCB0aGlzLndlYlNlcnZpY2VOYW1lc3BhY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBqYyA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChjb250ZXh0UGFja2FnZXMsIGNvbnN0cnVjdFR5cGUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYWNrYWdlc0tleSwgY2wsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIGNvbnN0cnVjdGlvblR5cGUgPSBjb25zdHJ1Y3RUeXBlLnZhbHVlOw0KLSAgICAgICAgICAgIGF1dG9KQVhCQ29udGV4dCA9IG5ldyBXZWFrUmVmZXJlbmNlPEpBWEJDb250ZXh0PihqYyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVzaW5nIGFuIGV4aXN0aW5nIEpBWEJDb250ZXh0Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGpjOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgew0KLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlTmFtZXNwYWNlID0gbmFtZXNwYWNlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKiogQHJldHVybiBSUEMgRGVjbGFyZWQgVHlwZSAqLw0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UHJvY2Vzc1R5cGUoKSB7DQotICAgICAgICByZXR1cm4gcHJvY2Vzc1R5cGU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCBSUEMgRGVjbGFyZWQgVHlwZS4gIFRoZSB1c2Ugb2YgdXNlIHRoaXMgcHJvcGVydHkgaWYgdGhlIG1lc3NhZ2UgaXMgc3R5bGU9ZG9jdW1lbnQgaXMNCi0gICAgICogZGlzY291cmFnZWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB0eXBlDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzVHlwZShDbGFzcyB0eXBlKSB7DQotICAgICAgICBwcm9jZXNzVHlwZSA9IHR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRSBnZXRDb25zdHJ1Y3Rpb25UeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdGlvblR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXN4bWxMaXN0KCkgew0KLSAgICAgICAgcmV0dXJuIGlzeG1sTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc3htbExpc3QoYm9vbGVhbiBpc3htbExpc3QpIHsNCi0gICAgICAgIHRoaXMuaXN4bWxMaXN0ID0gaXN4bWxMaXN0Ow0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKSB7DQotICAgICAgICByZXR1cm4gbXNnQ29udGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgew0KLSAgICAgICAgdGhpcy5tc2dDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGNvbnRleHQgPSBnZXRNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIGNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIEF0dGFjaG1lbnRNYXJzaGFsbGVyIHRvIG1hcnNoYWwgTVRPTS9TV0EgQXR0YWNobWVudHMNCi0gICAgICogQHBhcmFtIHdyaXRlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgQXR0YWNobWVudE1hcnNoYWxsZXIgY3JlYXRlQXR0YWNobWVudE1hcnNoYWxsZXIoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIoZ2V0TWVzc2FnZUNvbnRleHQoKSwgd3JpdGVyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBBdHRhY2htZW50IHVubWFyc2hhbGxlciBmb3IgdW5tYXJzaGFsbGluZyBNVE9NL1NXQSBBdHRhY2htZW50cw0KLSAgICAgKiBAcmV0dXJuIEF0dGFjaG1lbnRVbm1hcnNoYWxsZXINCi0gICAgICovDQotICAgIHByb3RlY3RlZCBBdHRhY2htZW50VW5tYXJzaGFsbGVyIGNyZWF0ZUF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlcihnZXRNZXNzYWdlQ29udGV4dCgpLCByZWFkZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBVbm1hcnNoYWwgdGhlIHhtbCBpbnRvIGEgSkFYQiBvYmplY3QNCi0gICAgICogQHBhcmFtIHJlYWRlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGEgcHJlZmVycmVkIGNsYXNzbG9hZGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQNCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgVW5tYXJzaGFsbGVyIHUgPSBKQVhCVXRpbHMuZ2V0SkFYQlVubWFyc2hhbGxlcihnZXRKQVhCQ29udGV4dChjbCkpOw0KLQ0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYW4gYXR0YWNobWVudCB1bm1hcnNoYWxsZXINCi0gICAgICAgIEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgYXVtID0gY3JlYXRlQXR0YWNobWVudFVubWFyc2hhbGxlcihyZWFkZXIpOw0KLQ0KLSAgICAgICAgaWYgKGF1bSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgdG8gVW5tYXJzaGFsbGVyIik7DQotICAgICAgICAgICAgfSANCi0gICAgICAgICAgICB1LnNldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoYXVtKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE9iamVjdCBqYXhiID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIFVubWFyc2hhbCBpbnRvIHRoZSBidXNpbmVzcyBvYmplY3QuDQotICAgICAgICBpZiAoZ2V0UHJvY2Vzc1R5cGUoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgamF4YiA9IHVubWFyc2hhbEJ5RWxlbWVudCh1LCByZWFkZXIpOyAgIC8vIHByZWZlcnJlZCBhbmQgYWx3YXlzIHVzZWQgZm9yDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlPWRvY3VtZW50DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpheGIgPSB1bm1hcnNoYWxCeVR5cGUodSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2Nlc3NUeXBlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3htbExpc3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnN0cnVjdGlvblR5cGUoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTdWNjZXNzZnVsbHkgdW5tYXJzaGFsbGVkIHRoZSBvYmplY3QNCi0gICAgICAgIEpBWEJVdGlscy5yZWxlYXNlSkFYQlVubWFyc2hhbGxlcihnZXRKQVhCQ29udGV4dChjbCksIHUpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBEb24ndCBjbG9zZSB0aGUgcmVhZGVyLiAgVGhlIHJlYWRlciBpcyBvd25lZCBieSB0aGUgY2FsbGVyLCBhbmQgaXQNCi0gICAgICAgIC8vIG1heSBjb250YWluIG90aGVyIHhtbCBpbnN0YW5jZSBkYXRhIChvdGhlciB0aGFuIHRoaXMgSkFYQiBvYmplY3QpDQotICAgICAgICAvLyByZWFkZXIuY2xvc2UoKTsNCi0gICAgICAgIHJldHVybiBqYXhiOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogTWFyc2hhbCB0aGUgamF4YiBvYmplY3QNCi0gICAgICogQHBhcmFtIG9iag0KLSAgICAgKiBAcGFyYW0gd3JpdGVyDQotICAgICAqIEBwYXJhbSBhbSBBdHRhY2htZW50TWFyc2hhbGxlciwgb3B0aW9uYWwgQXR0YWNobWVudA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3Qgb2JqLCANCi0gICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgLy8gVGhlcmUgbWF5IGJlIGEgcHJlZmVycmVkIGNsYXNzbG9hZGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQNCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGdldENsYXNzTG9hZGVyKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVmVyeSBlYXN5LCB1c2UgdGhlIENvbnRleHQgdG8gZ2V0IHRoZSBNYXJzaGFsbGVyLg0KLSAgICAgICAgICAgIC8vIFVzZSB0aGUgbWFyc2hhbGxlciB0byB3cml0ZSB0aGUgb2JqZWN0Lg0KLSAgICAgICAgICAgIE1hcnNoYWxsZXIgbSA9IEpBWEJVdGlscy5nZXRKQVhCTWFyc2hhbGxlcihnZXRKQVhCQ29udGV4dChjbCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRNYXJzaGFsbGVyIGFtID0gY3JlYXRlQXR0YWNobWVudE1hcnNoYWxsZXIod3JpdGVyKTsNCi0gICAgICAgICAgICBpZiAoYW0gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyIHRvIE1hcnNoYWxsZXIiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBtLnNldEF0dGFjaG1lbnRNYXJzaGFsbGVyKGFtKTsNCi0gICAgICAgICAgICB9DQotDQotDQotICAgICAgICAgICAgLy8gTWFyc2hhbCB0aGUgb2JqZWN0DQotICAgICAgICAgICAgaWYgKGdldFByb2Nlc3NUeXBlKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBtYXJzaGFsQnlFbGVtZW50KG9iaiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyFhbS5pc1hPUFBhY2thZ2UoKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgbWFyc2hhbEJ5VHlwZShvYmosDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvY2Vzc1R5cGUoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3htbExpc3QoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25zdHJ1Y3Rpb25UeXBlKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBTdWNjZXNzZnVsbHkgbWFyc2hhbGxlZCB0aGUgZGF0YQ0KLSAgICAgICAgICAgIEpBWEJVdGlscy5yZWxlYXNlSkFYQk1hcnNoYWxsZXIoZ2V0SkFYQkNvbnRleHQoY2wpLCBtKTsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBQcmVmZXJyZWQgd2F5IHRvIG1hcnNoYWwgb2JqZWN0cy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBiIE9iamVjdCB0aGF0IGNhbiBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50IGFuZCB0aGUgZWxlbWVudCBuYW1lIGlzIGtub3duIGJ5IHRoZQ0KLSAgICAgKiBNYXJzaGFsbGVyDQotICAgICAqIEBwYXJhbSBtIE1hcnNoYWxsZXINCi0gICAgICogQHBhcmFtIHdyaXRlciBYTUxTdHJlYW1Xcml0ZXINCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFyc2hhbEJ5RWxlbWVudChmaW5hbCBPYmplY3QgYiwgZmluYWwgTWFyc2hhbGxlciBtLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG9wdGltaXplKSB7DQotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgLy8gTWFyc2hhbGxpbmcgZGlyZWN0bHkgdG8gdGhlIG91dHB1dCBzdHJlYW0gaXMgZmFzdGVyIHRoYW4gbWFyc2hhbGxpbmcgdGhyb3VnaCB0aGUNCi0gICAgICAgICAgICAgICAgLy8gWE1MU3RyZWFtV3JpdGVyLiANCi0gICAgICAgICAgICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBvcHRpbWl6YXRpb24gaWYgdGhlcmUgaXMgYW4gb3V0cHV0IHN0cmVhbS4NCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW1pemUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0U3RyZWFtKHdyaXRlcik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSAob3B0aW1pemUpID8gZ2V0T3V0cHV0U3RyZWFtKHdyaXRlcikgOiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIG1hcnNoYWxCeUVsZW1lbnQuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxpbmcgdG8gYW4gT3V0cHV0U3RyZWFtLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgaXMgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXREZWJ1Z05hbWUoYikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBtLm1hcnNoYWwoYiwgb3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIG1hcnNoYWxCeUVsZW1lbnQuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxpbmcgdG8gYW4gWE1MU3RyZWFtV3JpdGVyLiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPYmplY3QgaXMgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXREZWJ1Z05hbWUoYikpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBtLm1hcnNoYWwoYiwgd3JpdGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9fSk7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWJ1Z05hbWUoT2JqZWN0IG8pIHsNCi0gICAgICAgIHJldHVybiAobyA9PSBudWxsKSA/ICJudWxsIiA6IG8uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIElmIHRoZSB3cml0ZXIgaXMgYmFja2VkIGJ5IGFuIE91dHB1dFN0cmVhbSwgdGhlbiByZXR1cm4gdGhlIE91dHB1dFN0cmVhbQ0KLSAgICAgKiBAcGFyYW0gd3JpdGVyDQotICAgICAqIEByZXR1cm4gT3V0cHV0U3RyZWFtIG9yIG51bGwNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIlhNTFN0cmVhbVdyaXRlciBpcyAiICsgd3JpdGVyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQotICAgICAgICBpZiAod3JpdGVyLmdldENsYXNzKCkgPT0gTVRPTVhNTFN0cmVhbVdyaXRlci5jbGFzcykgew0KLSAgICAgICAgICAgIG9zID0gKChNVE9NWE1MU3RyZWFtV3JpdGVyKSB3cml0ZXIpLmdldE91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk91dHB1dFN0cmVhbSBhY2Nlc3NpYmxlIGZyb20gTVRPTVhNTFN0cmVhbVdyaXRlciBpcyAiICsgb3MpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3cml0ZXIuZ2V0Q2xhc3MoKSA9PSBYTUxTdHJlYW1Xcml0ZXJXaXRoT1MuY2xhc3MpIHsNCi0gICAgICAgICAgICBvcyA9ICgoWE1MU3RyZWFtV3JpdGVyV2l0aE9TKSB3cml0ZXIpLmdldE91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk91dHB1dFN0cmVhbSBhY2Nlc3NpYmxlIGZyb20gWE1MU3RyZWFtV3JpdGVyV2l0aE9TIGlzICIgKyBvcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9zOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhlIHJvb3QgZWxlbWVudCBiZWluZyByZWFkIGlzIGRlZmluZWQgYnkgc2NoZW1hL0pBWEI7IGhvd2V2ZXIgaXRzIGNvbnRlbnRzIGFyZSBrbm93biBieQ0KLSAgICAgKiBzY2hlbWEvSkFYQi4gVGhlcmVmb3JlIHdlIHVzZSB1bm1hcnNoYWwgYnkgdGhlIGRlY2xhcmVkIHR5cGUgKFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8NCi0gICAgICogdW5tYXJzaGFsIHJwYyBlbGVtZW50cykNCi0gICAgICogDQotICAgICAqIEBwYXJhbSB1IFVubWFyc2hhbGxlcg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgKiBAcGFyYW0gdHlwZSBDbGFzcw0KLSAgICAgKiBAcmV0dXJuIE9iamVjdA0KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHVubWFyc2hhbEJ5VHlwZShmaW5hbCBVbm1hcnNoYWxsZXIgdSwgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyB0eXBlLCBmaW5hbCBib29sZWFuIGlzTGlzdCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUgY3R5cGUpDQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotDQotICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdW5tYXJzaGFsQnlUeXBlLiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBSUEMgaXMgdHlwZSBiYXNlZC4gVGh1cyBhDQotICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlZCB0eXBlIG11c3QgYmUgdXNlZCB0byB1bm1hcnNoYWwgdGhlIHhtbC4NCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBqYXhiOw0KLSAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIGlmICghaXNMaXN0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZTogV2UgYXJlIG5vdCB1bm1hcnNoYWxsaW5nIGFuIHhzZDpsaXN0IGJ1dCBhbiBBcnJheS4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRleHQgaXMgY3JlYXRlZCB1c2luZyBwYWNrYWdlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgbm90IGhhdmUgY29tbW9uIGFycmF5cyBvciB0eXBlIGFycmF5IGluIHRoZSBjb250ZXh0DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gYWJvdXQgaXQgc28gc2VyYWxpemUgaXQgYXMNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN0eXBlID09IEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRS5CWV9DT05URVhUX1BBVEgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheGIgPSB1LnVubWFyc2hhbChyZWFkZXIsIHR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb24gY2xpZW50IGFycmF5IG9uIHNlcnZlciwgQ2FuIGhhcHBlbiBvbmx5IGluIHN0YXJ0IGZyb20gamF2YQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoY3R5cGUgPT0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLkJZX0NMQVNTX0FSUkFZKSkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHR5cGUgY291bGQgYmUgYW55IE9iamVjdCBvciBwcmltaXRpdmUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkgd2lsbCBmaXJzdCB1bm1hcnNoYWxsIHRoZSB4bWxkYXRhIHRvIGEgU3RyaW5nW10NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZW4gdXNlIHRoZSB1bm1hcnNoYWxsZWQgamF4YkVsZW1lbnQgdG8gY3JlYXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXIgdHlwZSBPYmplY3QgQXJyYXkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheGIgPSB1bm1hcnNoYWxBcnJheShyZWFkZXIsIHUsIHR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheGIgPSB1LnVubWFyc2hhbChyZWFkZXIsIHR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuaXNFbnVtKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBKQVhCQ29udGV4dCBpcyBjcmVhdGVkIHVzaW5nIGEgY29udGV4dCBwYXRoLCBpdCB3aWxsIG5vdCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZSBFbnVtIGNsYXNzZXMuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNsYXNzZXMgaGF2ZSBAWG1sRW51bSBhbm5vdGF0aW9uIGJ1dCBub3QgQFhtbFR5cGUvQFhtbEVsZW1lbnQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSB1c2VyIHdpbGwgc2VlIE1hcnNoYWxsaW5nRXgsIGNsYXNzIG5vdCBrbm93biB0byBjdHh0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGpheC1iIGRlZmVjdCwgZm9yIG5vdyB0aGlzIGZpeCBpcyBpbiBwbGFjZSB0byBwYXNzIENUUy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBvbmx5IGZpeGVzIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXR1YXRpb24gd2hlcmUgdGhlIGVudW0gaXMgdGhlIHRvcC1sZXZlbCBvYmplY3QgKGUuZy4sIG1lc3NhZ2UtcGFydA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBycGMtbGl0IHNjZW5hcmlvKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1wbGUgb2Ygd2hhdCBlbnVtIGxvb2tzIGxpa2U6DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEBYbWxFbnVtIHB1YmxpYyBlbnVtIEVudW1TdHJpbmcgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAWG1sRW51bVZhbHVlKCJTdHJpbmcxIikgU1RSSU5HXzEoIlN0cmluZzEiKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQFhtbEVudW1WYWx1ZSgiU3RyaW5nMiIpIFNUUklOR18yKCJTdHJpbmcyIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWUoU3RyaW5nKXt9IDwtLSByZXNvbHZlcyBhICJ2YWx1ZSIgdG8gYW4gZW11bQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygidW5tYXJzaGFsQnlUeXBlLiBVbm1hcnNoYWxsaW5nICIgKyB0eXBlLmdldE5hbWUoKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgRW51bSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWEJFbGVtZW50PFN0cmluZz4gZW51bVZhbHVlID0gdS51bm1hcnNoYWwocmVhZGVyLCBTdHJpbmcuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtID0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRNZXRob2QoImZyb21WYWx1ZSIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YiA9IG0uaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IGVudW1WYWx1ZS5nZXRWYWx1ZSgpIH0pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YiA9IG51bGw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWwgY2FzZTogV2UgYXJlIG5vdCB1bm1hcnNoYWxsaW5nIGEgeHNkOmxpc3Qgb3IgQXJyYXkNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF4YiA9IHUudW5tYXJzaGFsKHJlYWRlciwgdHlwZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIHhzZDpsaXN0LCB3ZSBuZWVkIHRvIHJldHVybiB0aGUgYXBwcm9wcmlhdGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXN0IG9yIGFycmF5IChzZWUgTk9URSBhYm92ZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJzdCB1bm1hcnNoYWwgYXMgYSBTdHJpbmcNCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1NlY29uZCBjb252ZXJ0IHRoZSBTdHJpbmcgaW50byBhIGxpc3Qgb3IgYXJyYXkNCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXhiID0gdW5tYXJzaGFsQXNMaXN0T3JBcnJheShyZWFkZXIsIHUsIHR5cGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpheGI7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24odCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgdW5tYXJzaGFsQXJyYXkoZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVbm1hcnNoYWxsZXIgdSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyB0eXBlKQ0KLSAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB1bm1hcnNoYWxBcnJheSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBPYmplY3QgamF4YiA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUudW5tYXJzaGFsKHJlYWRlciwgU3RyaW5nW10uY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgICAgIE9iamVjdCB0eXBlT2JqID0gZ2V0VHlwZUVuYWJsZWRPYmplY3QoamF4Yik7DQotDQotICAgICAgICAgICAgLy8gTm93IGNvbnZlcnQgU3RyaW5nIEFycmF5IGluIHRvIHRoZSByZXF1aXJlZCBUeXBlIEFycmF5Lg0KLSAgICAgICAgICAgIGlmICh0eXBlT2JqIGluc3RhbmNlb2YgU3RyaW5nW10pIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gc3RyQXJyYXkgPSAoU3RyaW5nW10pIHR5cGVPYmo7DQotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBYU0RMaXN0VXRpbHMuZnJvbVN0cmluZ0FycmF5KHN0ckFycmF5LCB0eXBlKTsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPQ0KLSAgICAgICAgICAgICAgICAgICAgWE1MUm9vdEVsZW1lbnRVdGlsLmdldFhtbFJvb3RFbGVtZW50UU5hbWVGcm9tT2JqZWN0KGpheGIpOw0KLSAgICAgICAgICAgICAgICBqYXhiID0gbmV3IEpBWEJFbGVtZW50KHFOYW1lLCB0eXBlLCBvYmopOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gamF4YjsNCi0gICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24odCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICANCi0gICAgLyoqDQotICAgICAqIGNvbnZlcnQgdGhlIFN0cmluZyBpbnRvIGEgbGlzdCBvciBhcnJheQ0KLSAgICAgKiBAcGFyYW0gPFQ+DQotICAgICAqIEBwYXJhbSBqYXhiDQotICAgICAqIEBwYXJhbSB0eXBlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24NCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24NCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgdW5tYXJzaGFsQXNMaXN0T3JBcnJheShmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVbm1hcnNoYWxsZXIgdSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHR5cGUpDQotICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sTm9TdWNoTWV0aG9kRXhjZXB0aW9uLA0KLSAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwNCi0gICAgICAgIERhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbixJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLEpBWEJFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIHVubWFyc2hhQXJyYXkiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiB4c2Q6bGlzdCwgd2UgbmVlZCB0byByZXR1cm4gdGhlIGFwcHJvcHJpYXRlDQotICAgICAgICAgICAgLy8gbGlzdCBvciBhcnJheSAoc2VlIE5PVEUgYWJvdmUpDQotICAgICAgICAgICAgLy8gRmlyc3QgdW5tYXJzaGFsIGFzIGEgU3RyaW5nDQotICAgICAgICAgICAgT2JqZWN0IGpheGIgPSBudWxsOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGpheGIgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LnVubWFyc2hhbChyZWFkZXIsIFN0cmluZy5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0pOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24odCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vU2Vjb25kIGNvbnZlcnQgdGhlIFN0cmluZyBpbnRvIGEgbGlzdCBvciBhcnJheQ0KLSAgICAgICAgICAgIGlmIChnZXRUeXBlRW5hYmxlZE9iamVjdChqYXhiKSBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IFhNTFJvb3RFbGVtZW50VXRpbC5nZXRYbWxSb290RWxlbWVudFFOYW1lRnJvbU9iamVjdChqYXhiKTsNCi0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IFhTRExpc3RVdGlscy5mcm9tWFNETGlzdFN0cmluZygoU3RyaW5nKSBnZXRUeXBlRW5hYmxlZE9iamVjdChqYXhiKSwgdHlwZSk7DQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQocU5hbWUsIHR5cGUsIG9iaik7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGpheGI7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm4gdHlwZSBlbmFibGVkIG9iamVjdA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gb2JqIHR5cGUgb3IgZWxlbWVudCBlbmFibGVkIG9iamVjdA0KLSAgICAgKiBAcmV0dXJuIHR5cGUgZW5hYmxlZCBvYmplY3QNCi0gICAgICovDQotICAgIHN0YXRpYyBPYmplY3QgZ2V0VHlwZUVuYWJsZWRPYmplY3QoT2JqZWN0IG9iaikgew0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsNCi0gICAgICAgICAgICByZXR1cm4gKChKQVhCRWxlbWVudCkgb2JqKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG9iajsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWFyc2hhbCBvYmplY3RzIGJ5IHR5cGUNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBiIE9iamVjdCB0aGF0IGNhbiBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50LCBidXQgdGhlIGVsZW1lbnQgbmFtZSBpcyBub3Qga25vd24gdG8gdGhlDQotICAgICAqIHNjaGVtYSAoaS5lLiBycGMpDQotICAgICAqIEBwYXJhbSBtIE1hcnNoYWxsZXINCi0gICAgICogQHBhcmFtIHdyaXRlciBYTUxTdHJlYW1Xcml0ZXINCi0gICAgICogQHBhcmFtIHR5cGUNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFyc2hhbEJ5VHlwZShmaW5hbCBPYmplY3QgYiwgZmluYWwgTWFyc2hhbGxlciBtLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgZmluYWwgQ2xhc3MgdHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNMaXN0LCBmaW5hbCBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUgY3R5cGUpDQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIE5PVEUNCi0gICAgICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6DQotICAgICAgICAgICAgICAgICAgICAvLyA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTG9uZ0xpc3QiPg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPHhzZDpsaXN0Pg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPHhzZDpzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dW5zaWduZWRJbnQiLz4NCi0gICAgICAgICAgICAgICAgICAgIC8vIDwveHNkOnNpbXBsZVR5cGU+DQotICAgICAgICAgICAgICAgICAgICAvLyA8L3hzZDpsaXN0Pg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPC94c2Q6c2ltcGxlVHlwZT4NCi0gICAgICAgICAgICAgICAgICAgIC8vIDxlbGVtZW50IG5hbWU9Im15TG9uZyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6TG9uZ0xpc3QiLz4NCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAvLyBMb25nTGlzdCB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGFuIGludFtdDQotICAgICAgICAgICAgICAgICAgICAvLyBPbiB0aGUgd2lyZSBteUxvbmcgd2lsbCBiZSByZXByZXNlbnRlZCBhcyBhIGxpc3Qgb2YgaW50ZWdlcnMNCi0gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gPG15TG9uZz4xIDIgMzwvbXlMb25nPg0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHdlIGFyZSB0cnlpbmcgdG8gbWFyc2hhbCBieSB0eXBlLiBUaGVyZWZvcmUNCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gbWFyc2hhbCBhbiBlbGVtZW50IChmb28pIHRoYXQgaXMgdW5rbm93biB0byBzY2hlbWEuDQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSB1c2UgdGhlIG5vcm1hbCBtYXJzaGFsIGNvZGUsIHRoZSB3aXJlIHdpbGwgbG9vayBsaWtlDQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzICh3aGljaCBpcyBpbmNvcnJlY3QpOg0KLSAgICAgICAgICAgICAgICAgICAgLy8gPGZvbz48aXRlbT4xPC9pdGVtPjxpdGVtPjI8L2l0ZW0+PGl0ZW0+MzwvaXRlbT48L2Zvbz4NCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc29sdXRpb24gaXMgdG8gZGV0ZWN0IHRoaXMgc2l0dWF0aW9uIGFuZCBtYXJzaGFsIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nIGluc3RlYWQuIFRoZW4gd2UgZ2V0IHRoZSBjb3JyZWN0IHdpcmUgZm9ybWF0Og0KLSAgICAgICAgICAgICAgICAgICAgLy8gPGZvbz4xIDIgMzwvZm9vPg0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGpibyA9IGI7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNMaXN0KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtYXJzaGFsbGluZyB0eXBlIHdoaWNoIGlzIGEgTGlzdCBvciBBcnJheSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBKQVhCQ29udGV4dCBkb2VzIG5vdCB1bmRlcnN0YW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFycmF5IG9yIGxpc3QuIEluIHN1Y2ggY2FzZXMsIHRoZSBjb250ZW50cyBhcmUgY29udmVydGVkDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYSBTdHJpbmcgYW5kIHBhc3NlZCBkaXJlY3RseS4NCi0gICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R5cGUgPT0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFLkJZX0NPTlRFWFRfUEFUSCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IFhNTFJvb3RFbGVtZW50VXRpbC5nZXRYbWxSb290RWxlbWVudFFOYW1lRnJvbU9iamVjdChiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBYU0RMaXN0VXRpbHMudG9YU0RMaXN0U3RyaW5nKGdldFR5cGVFbmFibGVkT2JqZWN0KGIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWFyc2hhbGxpbmcgW2NvbnRleHQgcGF0aCBhcHByb2FjaF0gIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggeG1sbGlzdCB0ZXh0ID0gIiArIHRleHQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpibyA9IG5ldyBKQVhCRWxlbWVudChxTmFtZSwgU3RyaW5nLmNsYXNzLCB0ZXh0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN0eXBlID09IEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRS5CWV9DTEFTU19BUlJBWSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEpBWEIgaGF2ZSBhcnJheS9saXN0IHByb2Nlc3NpbmcgYnVpbHQgaW4uDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBpcyBhIHNhZmVndWFyZCBiZWNhdXNlIGFwcGFyZW50bHkgc29tZSB2ZXJzaW9ucw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBKQVhCIGRvbid0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IFhNTFJvb3RFbGVtZW50VXRpbC5nZXRYbWxSb290RWxlbWVudFFOYW1lRnJvbU9iamVjdChiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBYU0RMaXN0VXRpbHMudG9YU0RMaXN0U3RyaW5nKGdldFR5cGVFbmFibGVkT2JqZWN0KGIpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWFyc2hhbGxpbmcgW2NsYXNzIGFycmF5IGFwcHJvYWNoXSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB4bWxsaXN0IHRleHQgPSAiICsgdGV4dCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamJvID0gbmV3IEpBWEJFbGVtZW50KHFOYW1lLCBTdHJpbmcuY2xhc3MsIHRleHQpOyANCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIEpBWEJDb250ZXh0IGlzIGNyZWF0ZWQgdXNpbmcgYSBjb250ZXh0IHBhdGgsIGl0IHdpbGwgbm90IGluY2x1ZGUgRW51bQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3Nlcy4NCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNsYXNzZXMgaGF2ZSBAWG1sRW51bSBhbm5vdGF0aW9uIGJ1dCBub3QgQFhtbFR5cGUvQFhtbEVsZW1lbnQsIHNvIHRoZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlciB3aWxsIHNlZSBNYXJzaGFsbGluZ0V4LCBjbGFzcyBub3Qga25vd24gdG8gY3R4dC4NCi0gICAgICAgICAgICAgICAgICAgIC8vIA0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGpheC1iIGRlZmVjdCwgZm9yIG5vdyB0aGlzIGZpeCBpcyBpbiBwbGFjZSB0byBwYXNzIENUUy4gVGhpcyBvbmx5DQotICAgICAgICAgICAgICAgICAgICAvLyBmaXhlcyB0aGUNCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpdHVhdGlvbiB3aGVyZSB0aGUgZW51bSBpcyB0aGUgdG9wLWxldmVsIG9iamVjdCAoZS5nLiwgbWVzc2FnZS1wYXJ0IGluDQotICAgICAgICAgICAgICAgICAgICAvLyBycGMtbGl0IHNjZW5hcmlvKQ0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIC8vIFNhbXBsZSBvZiB3aGF0IGVudW0gbG9va3MgbGlrZToNCi0gICAgICAgICAgICAgICAgICAgIC8vIEBYbWxFbnVtIHB1YmxpYyBlbnVtIEVudW1TdHJpbmcgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gQFhtbEVudW1WYWx1ZSgiU3RyaW5nMSIpIFNUUklOR18xKCJTdHJpbmcxIiksDQotICAgICAgICAgICAgICAgICAgICAvLyBAWG1sRW51bVZhbHVlKCJTdHJpbmcyIikgU1RSSU5HXzIoIlN0cmluZzIiKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vIC4uLiB9DQotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0VudW0oKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWFyc2hhbEJ5VHlwZS4gTWFyc2hhbGluZyAiICsgdHlwZS5nZXROYW1lKCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzIEVudW0iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhCRWxlbWVudCBqYmUgPSAoSkFYQkVsZW1lbnQpIGI7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFhNTFJvb3RFbGVtZW50VXRpbC5nZXRFbnVtVmFsdWUoKEVudW0pIGpiZS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamJvID0gbmV3IEpBWEJFbGVtZW50KGpiZS5nZXROYW1lKCksIFN0cmluZy5jbGFzcywgdmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBtYXJzaGFsQnlUeXBlLiAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXJzaGFsaW5nIHRvIGFuIFhNTFN0cmVhbVdyaXRlci4gT2JqZWN0IGlzICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RGVidWdOYW1lKGIpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgLy8vIFRPRE8gDQotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdGhlIGNhc2VzIGxpa2UgZW51bSBhbmQgbGlzdCwgc2hvdWxkIHdlIA0KLSAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJjZXB0IGV4Y2VwdGlvbnMgYW5kIHRyeSBhIGRpZmZlcmVudCBhcHByb2FjaCA/DQotICAgICAgICAgICAgICAgICAgICBtLm1hcnNoYWwoamJvLCB3cml0ZXIpOw0KLQ0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQcmVmZXJyZWQgd2F5IHRvIHVubWFyc2hhbCBvYmplY3RzDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdSBVbm1hcnNoYWxsZXINCi0gICAgICogQHBhcmFtIHJlYWRlciBYTUxTdHJlYW1SZWFkZXINCi0gICAgICogQHJldHVybiBPYmplY3QgdGhhdCByZXByZXNlbnRzIGFuIGVsZW1lbnQNCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB1bm1hcnNoYWxCeUVsZW1lbnQoZmluYWwgVW5tYXJzaGFsbGVyIHUsIGZpbmFsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpDQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdW5NYXJzaGFsQnlFbGVtZW50Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LnVubWFyc2hhbChyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbih0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkRhdGFTb3VyY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDliMTkwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFzb3VyY2UvamF4Yi9KQVhCRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZUV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5kcy5PTURhdGFTb3VyY2VFeHRCYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTVhNTFN0cmVhbVdyaXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuWE1MU3RyZWFtV3JpdGVyV2l0aE9TOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi0NCi0vKioNCi0gKiBPTURhdGFTb3VyY2UgYmFja2VkIGJ5IGEgamF4YiBvYmplY3QNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQkRhdGFTb3VyY2UgZXh0ZW5kcyBPTURhdGFTb3VyY2VFeHRCYXNlIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhCRGF0YVNvdXJjZS5jbGFzcyk7DQotICAgIA0KLSAgICBPYmplY3QgamF4YjsNCi0gICAgSkFYQkRTQ29udGV4dCBjb250ZXh0Ow0KLQ0KLSAgICBwdWJsaWMgSkFYQkRhdGFTb3VyY2UoT2JqZWN0IGpheGIsIEpBWEJEU0NvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMuamF4YiA9IGpheGI7DQotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0Ow0KLSAgICAgICAgDQotICAgICAgICAvLyBDdXJyZW50bHkgd2UgY2Fubm90IGNvbnRyb2wgaG93IHRoZSB1bm1hcnNoYWxsZXIgd2lsbCBlbWl0IHRoZSBwcmVmaXgNCi0gICAgICAgIC8vIFNvIGlmIHRoZSB2YWx1ZSBvZiB0aGUgcHJlZml4IGlzIG5lZWRlZCwgZnVsbCBleHBhbnNpb24gaXMgbmVjZXNzYXJ5Lg0KLSAgICAgICAgc2V0UHJvcGVydHkoT01EYXRhU291cmNlRXh0LkxPU1NZX1BSRUZJWCwgQm9vbGVhbi5UUlVFKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT01EYXRhU291cmNlRXh0IGNvcHkoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJEYXRhU291cmNlKGpheGIsIGNvbnRleHQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgew0KLSAgICAgICAgcmV0dXJuIGpheGI7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBKQVhCRFNDb250ZXh0IGdldENvbnRleHQoKSB7DQotICAgICAgICByZXR1cm4gY29udGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSAidXRmLTgiOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldFhNTEJ5dGVzKGVuY29kaW5nKSk7DQotICAgICAgICAgICAgcmV0dXJuIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMsIGVuY29kaW5nKTsNCi0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBNVE9NWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBNVE9NWE1MU3RyZWFtV3JpdGVyKG91dHB1dCwgZm9ybWF0KTsNCi0gICAgICAgIHNlcmlhbGl6ZSh3cml0ZXIpOw0KLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOw0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gY2FuIG9jY3VyIGlmIG5vdGhpbmcgaXMgd3JpdHRlbiB0byB0aGUgDQotICAgICAgICAgICAgLy8gd3JpdGVyLiAgVGhpcyBpcyBwb3NzaWJsZSBpZiB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZQ0KLSAgICAgICAgICAgIC8vIHdyaXRlcnMgdG8gdGhlIG91dHB1dCBzdHJlYW0gZGlyZWN0bHkuDQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2F0Y2hpbmcgYW5kIHN3YWxsb3dpbmcgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXJUYXJnZXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBNVE9NWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9DQotICAgICAgICAgICAgbmV3IE1UT01YTUxTdHJlYW1Xcml0ZXIoU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXJUYXJnZXQpKTsNCi0gICAgICAgIHdyaXRlci5zZXRPdXRwdXRGb3JtYXQoZm9ybWF0KTsNCi0gICAgICAgIHNlcmlhbGl6ZSh3cml0ZXIpOw0KLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7DQotICAgICAgICB3cml0ZXIuY2xvc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGNvbnRleHQubWFyc2hhbChqYXhiLCB4bWxXcml0ZXIpOw0KLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBqZSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBmb3IgbWFyc2hhbCBmYWlsdXJlOiIgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEpBWEJDb250ZXh0KGNvbnRleHQuZ2V0Q2xhc3NMb2FkZXIoKSkpOw0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oamUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0NCi0gICAgICAgICAgICAvLyBFeHBvc2VzIGdldE91dHB1dFN0cmVhbSwgd2hpY2ggYWxsb3dzIGZhc3RlciB3cml0ZXMuDQotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyV2l0aE9TIHdyaXRlciA9IG5ldyBYTUxTdHJlYW1Xcml0ZXJXaXRoT1MoYmFvcywgZW5jb2RpbmcpOw0KLQ0KLSAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBidXNpbmVzcyBvYmplY3QgdG8gdGhlIHdyaXRlcg0KLSAgICAgICAgICAgIHNlcmlhbGl6ZSh3cml0ZXIpOw0KLQ0KLSAgICAgICAgICAgIC8vIEZsdXNoIHRoZSB3cml0ZXINCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsNCi0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsNCi0gICAgICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOw0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVdyaXRlKCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQlhNTFN0cmVhbVdyaXRlckZpbHRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJYTUxTdHJlYW1Xcml0ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZDZkMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQlhNTFN0cmVhbVdyaXRlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0vKioKLSAqIE9uIHNvbWUgb2NjYXNpb25zLCBKQVhCIHdyaXRlcyBvdXQgaW5jb3JyZWN0IHhtbG5zIGFuZCBuYW1lc3BhY2UgaW5mb3JtYXRpb24uIFRoaXMgZmlsdGVyIGlzCi0gKiB1c2VmdWwgZm9yIGxvZ2dpbmcgYW5kIGNvcnJlY3RpbmcgdGhlc2Uga2luZHMgb2YgcHJvYmxlbXMuCi0gKi8KLWNsYXNzIEpBWEJYTUxTdHJlYW1Xcml0ZXJGaWx0ZXIgaW1wbGVtZW50cyBYTUxTdHJlYW1Xcml0ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhCWE1MU3RyZWFtV3JpdGVyRmlsdGVyLmNsYXNzKTsKLQotICAgIFhNTFN0cmVhbVdyaXRlciBkZWxlZ2F0ZTsKLSAgICBpbnQgbnVtRWxlbWVudHMgPSAwOwotICAgIGludCBudW1EZWZhdWx0TlMgPSAwOwotCi0gICAgcHVibGljIEpBWEJYTUxTdHJlYW1Xcml0ZXJGaWx0ZXIoWE1MU3RyZWFtV3JpdGVyIGRlbGVnYXRlKSB7Ci0gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLmZsdXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQcmVmaXgoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgYXJnMCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQcm9wZXJ0eShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGRlZmF1bHQgbmFtZXNwYWNlVVJJPSIgKyBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtRGVmYXVsdE5TKys7Ci0gICAgICAgICAgICBpZiAobnVtRGVmYXVsdE5TID4gMSkgewotICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyBKQVhCIHdyaXRlcyBvdXQgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHR3aWNlCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBzZWVtcyB0byBiZSByZWxhdGVkIHRvIHdyaXRpbmcgb3V0IHhtbG5zLi4uc2VlIGJlbG93Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIFdIWSBJUyBUSEUgREVGQVVMVCBOQU1FU1BBQ0UgV1JJVFRFTiBUV0lDRT8iKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5zdGFja1RvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZWdhdGUuc2V0RGVmYXVsdE5hbWVzcGFjZShuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUNvbnRleHQoTmFtZXNwYWNlQ29udGV4dCBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUuc2V0TmFtZXNwYWNlQ29udGV4dChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUuc2V0UHJlZml4KGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHByZWZpeD0iICsgcHJlZml4ICsgIiBuYW1lc3BhY2U9IiArIG5hbWVzcGFjZVVSSSArICIgbG9jYWxOYW1lPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lICsgIiB2YWx1ZT0iICsgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlQXR0cmlidXRlKHByZWZpeCwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgdmFsdWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG51bUVsZW1lbnRzID09IDEpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBuYW1lc3BhY2U9IiArIG5hbWVzcGFjZVVSSSArICIgbG9jYWxOYW1lPSIgKyBsb2NhbE5hbWUgKyAiIHZhbHVlPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlQXR0cmlidXRlKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVBdHRyaWJ1dGUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG51bUVsZW1lbnRzID09IDEpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBsb2NhbE5hbWU9IiArIGxvY2FsTmFtZSArICIgdmFsdWU9IiArIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxlZ2F0ZS53cml0ZUF0dHJpYnV0ZShsb2NhbE5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNEYXRhKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVDRGF0YShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoY2hhcltdIGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlQ2hhcmFjdGVycyhhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJhY3RlcnMoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUNoYXJhY3RlcnMoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDb21tZW50KFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVDb21tZW50KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRGVmYXVsdE5hbWVzcGFjZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZURURChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRFREKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUVtcHR5RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUVtcHR5RWxlbWVudChhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVtcHR5RWxlbWVudChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRW1wdHlFbGVtZW50KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVFbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVudGl0eVJlZihTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlRW50aXR5UmVmKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHByZWZpeD0iICsgcHJlZml4ICsgIiBuYW1lc3BhY2VVUkk9IiArIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoInhtbG5zIi5lcXVhbHMocHJlZml4KSkgewotICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyBKQVhCIHdyaXRlcyBvdXQgdGhlIFhNTE5TIGF0dHJpYnV0ZS4uLm5lZWQgdG8gZmluZCBvdXQgd2h5Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIElOVkFMSUQgWE1MTlMgYXR0cmlidXRlIGlzIHJlbW92ZWQgcHJlZml4PSIpOwotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RG9jdW1lbnQoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUud3JpdGVTdGFydERvY3VtZW50KGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudChTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlU3RhcnREb2N1bWVudChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIG51bUVsZW1lbnRzKys7Ci0gICAgICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgcHJlZml4PSIgKyBwcmVmaXggKyAiIG5hbWVzcGFjZT0iICsgbmFtZXNwYWNlVVJJICsgIiBsb2NhbE5hbWU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGVnYXRlLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBudW1FbGVtZW50cysrOwotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIG5hbWVzcGFjZT0iICsgbmFtZXNwYWNlVVJJICsgIiBsb2NhbE5hbWU9IiArIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZWdhdGUud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBudW1FbGVtZW50cysrOwotICAgICAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGxvY2FsTmFtZT0iICsgbG9jYWxOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxlZ2F0ZS53cml0ZVN0YXJ0RWxlbWVudChsb2NhbE5hbWUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvWFNETGlzdFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvWFNETGlzdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGY3ZmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL1hTRExpc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKiogVXRpbGl0aWVzIHRvIGNvbnZlcnQgdG8vZnJvbSB4c2Q6bGlzdCBTdHJpbmcgdG8gT2JqZWN0W10vTGlzdCB2YWx1ZXMuICovCi1wdWJsaWMgY2xhc3MgWFNETGlzdFV0aWxzIHsKLSAgICAvKiogQ29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBwcml2YXRlICovCi0gICAgcHJpdmF0ZSBYU0RMaXN0VXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLy8gIEV4YW1wbGU6Ci0gICAgLy8gPHhzZDpzaW1wbGVUeXBlIG5hbWU9IkxvbmdMaXN0Ij4KLSAgICAvLyAgIDx4c2Q6bGlzdD4KLSAgICAvLyAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgIC8vICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnVuc2lnbmVkSW50Ii8+Ci0gICAgLy8gICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgLy8gICA8L3hzZDpsaXN0PgotICAgIC8vIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgLy8gPGVsZW1lbnQgbmFtZT0ibXlMb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpMb25nTGlzdCIvPgotICAgIC8vCi0gICAgLy8gTG9uZ0xpc3Qgd2lsbCBiZSByZXByZXNlbnRlZCBhcyBhbiBpbnRbXQotICAgIC8vIE9uIHRoZSB3aXJlIG15TG9uZyB3aWxsIGJlIHJlcHJlc2VudGVkIGFzIGEgbGlzdCBvZiBpbnRlZ2VycwotICAgIC8vIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZQotICAgIC8vICAgPG15TG9uZz4xIDIgMzwvbXlMb25nPgotICAgIC8vCi0gICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHdlIHdhbnQgdG8gbWFyc2hhbCBieSB0eXBlLiAgVGhlcmVmb3JlCi0gICAgLy8gd2Ugd2FudCB0byBtYXJzaGFsIGFuIGVsZW1lbnQgKGZvbykgdGhhdCBpcyB1bmtub3duIHRvIHNjaGVtYS4KLSAgICAvLyBJZiB3ZSB1c2UgdGhlIG5vcm1hbCBtYXJzaGFsIGNvZGUsIHRoZSB3aXJlIHdpbGwgbG9vayBsaWtlCi0gICAgLy8gdGhpcyAod2hpY2ggaXMgaW5jb3JyZWN0KToKLSAgICAvLyAgPGZvbz48aXRlbT4xPC9pdGVtPjxpdGVtPjI8L2l0ZW0+PGl0ZW0+MzwvaXRlbT48L2Zvbz4KLSAgICAvLwotICAgIC8vIFRoZSBzb2x1dGlvbiBpcyB0byBkZXRlY3QgdGhpcyBzaXR1YXRpb24gYW5kIG1hcnNoYWwgdGhlIAotICAgIC8vIFN0cmluZyBpbnN0ZWFkLiAgVGhlbiB3ZSBnZXQgdGhlIGNvcnJlY3Qgd2lyZSBmb3JtYXQ6Ci0gICAgLy8gPGZvbz4xIDIgMzwvZm9vPgotICAgIC8vIAotICAgIC8vIFRoaXMgdXRpbGl0eSBjb250YWlucyBjb2RlIHRvIGNvbnZlcnQgZnJvbSBBcnJheS9MaXN0IC0+IFN0cmluZwotICAgIC8vIGFuZCBmcm9tIFN0cmluZyAtPiBBcnJheS9MaXN0Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHRvIFN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIHhzZDpsaXN0IGNvbnRlbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250YWluZXIgT2JqZWN0Ci0gICAgICogQHJldHVybiB4c2Q6bGlzdCBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1hTRExpc3RTdHJpbmcoT2JqZWN0IGNvbnRhaW5lcikgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIG9ubHkgc3VwcG9ydHMgYXJyYXlzIHJpZ2h0IG5vdy4gIE5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZm9yIExpc3QKLSAgICAJaWYgKGNvbnRhaW5lciAhPW51bGwgJiYgY29udGFpbmVyLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgeHNkU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFycmF5LmdldExlbmd0aChjb250YWluZXIpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50ID0gQXJyYXkuZ2V0KGNvbnRhaW5lciwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHhzZFN0cmluZy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhzZFN0cmluZyArPSAiICI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhzZFN0cmluZyArPSBnZXRBc1RleHQoY29tcG9uZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB4c2RTdHJpbmc7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIGlmKGNvbnRhaW5lciE9bnVsbCAmJiBMaXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY29udGFpbmVyLmdldENsYXNzKCkpKXsKLSAgICAgICAgICAgIFN0cmluZyB4c2RTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgIExpc3QgY29udGFpbmVyQXNMaXN0ID0gKExpc3QpY29udGFpbmVyOwotICAgICAgICAgICAgZm9yIChPYmplY3QgY29tcG9uZW50OmNvbnRhaW5lckFzTGlzdCkgewotICAgICAgICAgICAgICAgIGlmICh4c2RTdHJpbmcubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB4c2RTdHJpbmcgKz0gIiAiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4c2RTdHJpbmcgKz0gZ2V0QXNUZXh0KGNvbXBvbmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geHNkU3RyaW5nOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRhaW5lci5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBmcm9tIHhzZExpc3RTdHJpbmcgdG8gYW4gYXJyYXkvbGlzdAotICAgICAqCi0gICAgICogQHBhcmFtIHhzZExpc3RTdHJpbmcKLSAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICBDbGFzcyBvZiByZXR1cm4KLSAgICAgKiBAcmV0dXJuIEFycmF5IG9yIExpc3QKLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZnJvbVhTRExpc3RTdHJpbmcoU3RyaW5nIHhzZExpc3RTdHJpbmcsIENsYXNzIHR5cGUpIHRocm93cwotICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIERhdGF0eXBlQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gb25seSBzdXBwb3J0cyBhcnJheXMgcmlnaHQgbm93LiAgTmVlZCB0byBpbXBsZW1lbnQgdGhpcyBmb3IgTGlzdAotICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIENsYXNzIGNvbXBvbmVudFR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgLy8gUGFyc2UgdGhlIHRva2VucyBiYXNlZCBvbiB3aGl0ZXNwYWNlCi0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHhzZExpc3RTdHJpbmcpOwotICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvbmVudE9iamVjdCA9IGdldEZyb21UZXh0KHRleHQsIGNvbXBvbmVudFR5cGUpOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudE9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzcyBhcnJheVR5cGUgPSBjb21wb25lbnRUeXBlOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgIENsYXNzIGJveGVkVHlwZSA9IGdldEJveGVkVHlwZShjb21wb25lbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoYm94ZWRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlID0gYm94ZWRUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZSwgbGlzdC5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgoT2JqZWN0W10pYXJyYXkpOwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHR5cGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBmcm9tU3RyaW5nQXJyYXkoU3RyaW5nW10gaXRlbXMsIENsYXNzIHR5cGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAodHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIENsYXNzIGNvbXBvbmVudFR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IGl0ZW1zKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvbmVudE9iamVjdCA9IGdldEZyb21UZXh0KGl0ZW0sIGNvbXBvbmVudFR5cGUpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnRPYmplY3QpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgQ2xhc3MgYXJyYXlUeXBlID0gY29tcG9uZW50VHlwZTsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBib3hlZFR5cGUgPSBnZXRCb3hlZFR5cGUoY29tcG9uZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJveGVkVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZSA9IGJveGVkVHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGFycmF5VHlwZSwgbGlzdC5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgoT2JqZWN0W10pYXJyYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9TdHJpbmdBcnJhYXkoT2JqZWN0IGNvbnRhaW5lcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGludCBzaXplID0gQXJyYXkuZ2V0TGVuZ3RoKGNvbnRhaW5lcik7ICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBbXSBzdHJBcnJheSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb25lbnQgPSBBcnJheS5nZXQoY29udGFpbmVyLCBpKTsKLSAgICAgICAgICAgICAgICBzdHJBcnJheVtpXSA9IGdldEFzVGV4dChjb21wb25lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0ckFycmF5OyAgICAKLSAgICAgICAgfSBlbHNlIGlmKGNvbnRhaW5lciAhPSBudWxsICYmIExpc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjb250YWluZXIuZ2V0Q2xhc3MoKSkpeyAgIAotICAgICAgICAgICAgTGlzdCBjb250YWluZXJBc0xpc3QgPSAoTGlzdCljb250YWluZXI7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IGNvbnRhaW5lckFzTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBTdHJpbmcgW10gc3RyQXJyYXkgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzdHJBcnJheVtpXSA9IGdldEFzVGV4dChjb250YWluZXJBc0xpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gc3RyQXJyYXk7ICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250YWluZXIuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogQHJldHVybiB4bWwgdGV4dCBmb3IgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXNUZXh0KE9iamVjdCBvYmopIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBOZWVkIHRvIHVwZ3JhZGUgdG8gaGFuZGxlIG1vcmUgY29tcGxpY2F0ZWQgb2JqZWN0cyBsaWtlIGNhbGVuZGFyIGFuZCBxbmFtZQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUU5hbWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJYU0RMaXN0Tm90U3VwcG9ydGVkIiwgUU5hbWUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWE1MR3JlZ29yaWFuQ2FsZW5kYXIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhTRExpc3ROb3RTdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmouZ2V0Q2xhc3MoKS5pc0VudW0oKSkgewotICAgICAgICAgICAgLy8gVE9ETyBNZXRob2Qgc2hvdWxkIGJlIGNhY2hlZCBmb3IgcGVyZm9ybWFuY2UKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPQotICAgICAgICAgICAgICAgICAgICBvYmouZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgidmFsdWUiLCBuZXcgQ2xhc3NbXSB7IH0pOwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpbWV0aG9kLmludm9rZShvYmosIG5ldyBPYmplY3RbXSB7IH0pOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iai50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlCi0gICAgICogQHJldHVybiBPYmplY3QgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIHhtbCB0ZXh0ICh2YWx1ZSkKLSAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldEZyb21UZXh0KFN0cmluZyB2YWx1ZSwgQ2xhc3MgY29tcG9uZW50VHlwZSkgdGhyb3dzCi0gICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLAotICAgICAgICAgICAgRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETyBUaGlzIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIGhhbmRsZSBtb3JlIGNvbXBsaWNhdGVkIG9iamVjdHMgKGVudW0sIGNhbGVuZGFyLCBwcmltaXRpdmUsIGV0Yy4pCi0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IFN0cmluZy5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnRUeXBlLmlzRW51bSgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB5b3UgZ2V0IGFuIGV4Y2VwdGlvbiBoZXJlLCBjb25zaWRlciBhZGRpbmcgdGhlIGNvZGUgdG8gY29udmVydCB0aGUgU3RyaW5nIHZhbHVlIHRvIHRoZSByZXF1aXJlZCBjb21wb25lbnQgb2JqZWN0Ci0gICAgICAgICAgICAvLyBEZWZhdWx0OiBDYWxsIHRoZSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgLy8gVE9ETyBNZXRob2Qgc2hvdWxkIGJlIGNhY2hlZCBmb3IgcGVyZm9ybWFuY2UKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUeXBlLmdldERlY2xhcmVkTWV0aG9kKCJmcm9tVmFsdWUiLCBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBtZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOwotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudFR5cGUgPSBCeXRlLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRUeXBlID0gU2hvcnQuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICBjb21wb25lbnRUeXBlID0gSW50ZWdlci5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IEZsb2F0LmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IGRvdWJsZS5jbGFzcykgewotICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IERvdWJsZS5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PSBjaGFyLmNsYXNzKSB7Ci0gICAgICAgICAgICBDaGFyYWN0ZXIgY2ggPSBudWxsOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2ggPSBDaGFyYWN0ZXIudmFsdWVPZih2YWx1ZS5jaGFyQXQoMCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09IGJvb2xlYW4uY2xhc3MpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudFR5cGUgPSBCb29sZWFuLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuZXF1YWxzKFFOYW1lLmNsYXNzKSkgewotICAgICAgICAgICAgLy8gVE9ETyBNaXNzaW5nIFN1cHBvcnQKLQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWFNETGlzdE5vdFN1cHBvcnRlZCIsIGNvbXBvbmVudFR5cGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50VHlwZS5lcXVhbHMoWE1MR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIE1pc3NpbmcgU3VwcG9ydAotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWFNETGlzdE5vdFN1cHBvcnRlZCIsIGNvbXBvbmVudFR5cGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB5b3UgZ2V0IGFuIGV4Y2VwdGlvbiBoZXJlLCBjb25zaWRlciBhZGRpbmcgdGhlIGNvZGUgdG8gY29udmVydCB0aGUgU3RyaW5nIHZhbHVlIHRvIHRoZSByZXF1aXJlZCBjb21wb25lbnQgb2JqZWN0Ci0gICAgICAgIC8vIERlZmF1bHQ6IENhbGwgdGhlIGNvbnN0cnVjdG9yCi0gICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gY29tcG9uZW50VHlwZS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHZhbHVlIH0pOwotICAgICAgICByZXR1cm4gb2JqOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGdldEJveGVkVHlwZShDbGFzcyBwcmltaXRpdmVUeXBlKSB7Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBCeXRlLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IHNob3J0LmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gU2hvcnQuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByaW1pdGl2ZVR5cGUgPT0gaW50LmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZWdlci5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSA9PSBsb25nLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gTG9uZy5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSA9PSBmbG9hdC5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIEZsb2F0LmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IGRvdWJsZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5jbGFzczsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSA9PSBjaGFyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmltaXRpdmVUeXBlID09IGJvb2xlYW4uY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEdyZWdvcmlhbkNhbGVuZGFyIHRvR3JlZ29yaWFuQ2FsZW5kYXIoU3RyaW5nIHZhbHVlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBEYXRlIGQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpLnBhcnNlKHZhbHVlKTsKLSAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgZ2Muc2V0VGltZShkKTsKLSAgICAgICAgcmV0dXJuIGdjOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL0JpbmRpbmdQcm92aWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQmluZGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzkzNGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQmluZGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRSZWZlcmVuY2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmcuQmluZGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZy5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5Qcm9wZXJ0eVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmluZGluZ1Byb3ZpZGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzcG9uc2VDb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjOwotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGU7Ci0KLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmcgYmluZGluZzsKLQotICAgIHB1YmxpYyBCaW5kaW5nUHJvdmlkZXIoU2VydmljZURlbGVnYXRlIHN2Y0RlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB0aGlzLmVuZHBvaW50RGVzYyA9IGVwRGVzYzsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRGVsZWdhdGUgPSBzdmNEZWxlZ2F0ZTsKLSAgICAgICAgCi0gICAgICAgIGluaXRpYWxpemUoZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIGFueSBvYmplY3RzIG5lZWRlZCBieSB0aGUgQmluZGluZ1Byb3ZpZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUob3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICByZXF1ZXN0Q29udGV4dCA9IG5ldyBWYWxpZGF0aW5nQ2xpZW50Q29udGV4dCgpOwotICAgICAgICByZXNwb25zZUNvbnRleHQgPSBuZXcgVmFsaWRhdGluZ0NsaWVudENvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNldHRpbmcgc3RhbmRhcmQgcHJvcGVydHkgZGVmYXVsdHMgZm9yIHRoZSByZXF1ZXN0IGNvbnRleHQKLSAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTZXQgdGhlIGVuZHBvaW50IGFkZHJlc3MKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcyA9IChlcHIgIT0gbnVsbCApID8gZXByLmdldEFkZHJlc3MoKSA6IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEFkZHJlc3MoKTsgICAgICAgIAotICAgICAgICBpZiAoZW5kcG9pbnRBZGRyZXNzICE9IG51bGwgJiYgISIiLmVxdWFscyhlbmRwb2ludEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50QWRkcmVzcyk7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBKQVhXUyA5LjIuMS4xIHJlcXVpcmVzIHRoYXQgd2UgZ28gYWhlYWQgYW5kIGNyZWF0ZSB0aGUgYmluZGluZyBvYmplY3QKLSAgICAgICAgLy8gc28gd2UgY2FuIGFsc28gc2V0IHRoZSBoYW5kbGVyY2hhaW4KLSAgICAgICAgYmluZGluZyA9IChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nKSBCaW5kaW5nVXRpbHMuY3JlYXRlQmluZGluZyhlbmRwb2ludERlc2MpOwotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkxvb2tpZ24gZm9yIEhhbmRsZXIgUmVzb2x2ZXIiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBhbGxvdyB0aGUgU2VydmljZURlbGVnYXRlIHRvIGZpZ3VyZSBvdXQgdGhlIGRlZmF1bHQgaGFuZGxlcnJlc29sdmVyPyAgUHJvYmFibHkgeWVzLCBzaW5jZSBhIGNsaWVudCBhcHAgbWF5IGxvb2sgZm9yIG9uZSB0aGVyZS4KLSAgICAgICAgSGFuZGxlclJlc29sdmVyIGhhbmRsZXJSZXNvbHZlciA9IG51bGw7Ci0gICAgICAgIGlmKHNlcnZpY2VEZWxlZ2F0ZS5nZXRIYW5kbGVyUmVzb2x2ZXIoKSAhPSBudWxsKXsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWRpbmcgZGVmYXVsdCBIYW5kbGVyIFJlc29sdmVyICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlclJlc29sdmVyID0gc2VydmljZURlbGVnYXRlLmdldEhhbmRsZXJSZXNvbHZlcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICBoYW5kbGVyUmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChlbmRwb2ludERlc2MuZ2V0U2VydmljZURlc2NyaXB0aW9uKCksIHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBuZXcgSGFuZGxlciBSZXNvbHZlciB1c2luZyBIYW5kbGVyUmVzb2x2ZXJJbXBsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgdGhlIG1ldGFkYXRhIGZyb20gY3JlYXRpbmcgdGhlIHNlcnZpY2UgaW5kaWNhdGVzIHRoYXQgTVRPTSBzaG91bGQgYmUgZW5hYmxlZAotICAgICAgICBpZiAoYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAvLyBNVE9NIGNhbiBiZSBlbmFibGVkIGVpdGhlciBhdCB0aGUgU2VydmljZURlc2NyaXB0aW9uIGxldmVsICh2aWEgdGhlIFdTREwgYmluZGluZyB0eXBlKSBvcgotICAgICAgICAgICAgLy8gYXQgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gbGV2ZWwgdmlhIHRoZSBiaW5kaW5nIHR5cGUgdXNlZCB0byBjcmVhdGUgYSBEaXNwYXRjaC4KLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlTVRPTUZyb21NZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGFuIFNFSSBmb3IgdGhlIHBvcnQsIHRoZW4gd2UnbGwgdXNlIGl0IGluIG9yZGVyIHRvIHNlYXJjaCBmb3IgTVRPTSBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBpZihlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRTRUlDbGFzcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVNVE9NRnJvbU1ldGFkYXRhID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmlzTVRPTUVuYWJsZWQoc2VydmljZURlbGVnYXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNFSUNsYXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5hYmxlTVRPTUZyb21NZXRhZGF0YSA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5pc01UT01FbmFibGVkKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWVuYWJsZU1UT01Gcm9tTWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlTVRPTUZyb21NZXRhZGF0YSA9IChiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpIHx8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbmFibGVNVE9NRnJvbU1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgKChTT0FQQmluZGluZykgYmluZGluZykuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgZm9yIHByb3BlcnRpZXMgdGhhdCBuZWVkIHRvIGJlIHNldCBvbiB0aGUgQmluZGluZ1Byb3ZpZGVyCi0gICAgICAgIFN0cmluZyBzZWlOYW1lID0gbnVsbDsKLSAgICAgICAgaWYoZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKSAhPSBudWxsIAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRTRUlDbGFzcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlaU5hbWUgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNFSUNsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwb3J0UU5hbWVTdHJpbmcgPSBlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCkudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IHNlaU5hbWUgKyAiOiIgKyBwb3J0UU5hbWVTdHJpbmc7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYlByb3BzID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldEJpbmRpbmdQcm9wZXJ0aWVzKHNlcnZpY2VEZWxlZ2F0ZSwga2V5KTsKLSAgICAgICAgaWYoYlByb3BzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIGJpbmRpbmcgcHJvcHMgd2l0aCBzaXplOiAiICsgYlByb3BzLnNpemUoKSArICIgb24gIiArCi0gICAgICAgICAgICAgICAgIkJpbmRpbmdQcm92aWRlciBSZXF1ZXN0Q29udGV4dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVxdWVzdENvbnRleHQucHV0QWxsKGJQcm9wcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJpbmRpbmcuc2V0SGFuZGxlckNoYWluKGhhbmRsZXJSZXNvbHZlci5nZXRIYW5kbGVyQ2hhaW4oZW5kcG9pbnREZXNjLmdldFBvcnRJbmZvKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IEpBWC1XUyAyLjEgcmVsYXRlZCBwcm9wZXJ0aWVzLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgYmluZGluZy5zZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKGVwcik7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldEFkZHJlc3NpbmdOYW1lc3BhY2UoYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldEZlYXR1cmVzKGZlYXR1cmVzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZURlbGVnYXRlIGdldFNlcnZpY2VEZWxlZ2F0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gZW5kcG9pbnREZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFJlcXVlc3RDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UmVzcG9uc2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGZvciBtYWludGFpbiBzZXNzaW9uIHN0YXRlIGVuYWJsZW1lbnQgZWl0aGVyIGluIHRoZQotICAgICAqIE1lc3NhZ2VDb250ZXh0LmlzTWFpbnRhaW5TZXNzaW9uKCkgb3IgaW4gdGhlIFNlcnZpY2VDb250ZXh0IHByb3BlcnRpZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1jCi0gICAgICogQHBhcmFtIGljCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tNYWludGFpblNlc3Npb25TdGF0ZShNZXNzYWdlQ29udGV4dCBtYywgSW52b2NhdGlvbkNvbnRleHQgaWMpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gaWMuZ2V0U2VydmljZUNsaWVudCgpLmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBib29sZWFuIGJWYWx1ZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwKLSAgICAgICAgICAgICYmIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkoamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKSkgewotICAgICAgICAgICAgYlZhbHVlID0gKEJvb2xlYW4pIHByb3BlcnRpZXMKLSAgICAgICAgICAgICAgICAuZ2V0KGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIuU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1jLmlzTWFpbnRhaW5TZXNzaW9uKCkgfHwgYlZhbHVlID09IHRydWUpIHsKLSAgICAgICAgICAgIHNldHVwU2Vzc2lvbkNvbnRleHQocHJvcGVydGllcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogRW5zdXJlIHRoYXQgdGhlIG5leHQgcmVxdWVzdCBjb250ZXh0IGNvbnRhaW5zIHRoZSBzZXNzaW9uIHZhbHVlIHJldHVybmVkCi0gICAgKiBmcm9tIHByZXZpb3VzIHJlcXVlc3QKLSAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwU2Vzc2lvbkNvbnRleHQoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIFN0cmluZyBzZXNzaW9uS2V5ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IHNlc3Npb25WYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJOb01haW50YWluU2Vzc2lvblByb3BlcnR5IikpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnRpZXMuY29udGFpbnNLZXkoSFRUUENvbnN0YW50cy5IRUFERVJfTE9DQVRJT04pKSB7Ci0gICAgICAgICAgICBzZXNzaW9uS2V5ID0gSFRUUENvbnN0YW50cy5IRUFERVJfTE9DQVRJT047Ci0gICAgICAgICAgICBzZXNzaW9uVmFsdWUgPSBwcm9wZXJ0aWVzLmdldChzZXNzaW9uS2V5KTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uVmFsdWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNlc3Npb25WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHNlc3Npb25WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocHJvcGVydGllcy5jb250YWluc0tleShIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uS2V5ID0gSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFOwotICAgICAgICAgICAgc2Vzc2lvblZhbHVlID0gcHJvcGVydGllcy5nZXQoc2Vzc2lvbktleSk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvblZhbHVlICE9IG51bGwgJiYgISIiLmVxdWFscyhzZXNzaW9uVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQucHV0KEhUVFBDb25zdGFudHMuQ09PS0lFX1NUUklORywgc2Vzc2lvblZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRTIpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uS2V5ID0gSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFMjsKLSAgICAgICAgICAgIHNlc3Npb25WYWx1ZSA9IHByb3BlcnRpZXMuZ2V0KHNlc3Npb25LZXkpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25WYWx1ZSAhPSBudWxsICYmICEiIi5lcXVhbHMoc2Vzc2lvblZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnB1dChIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcsIHNlc3Npb25WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJOb01haW50YWluU2Vzc2lvblByb3BlcnR5IikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlc3Npb25WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsVmFsdWVGb3JNYWludGFpblNlc3Npb25Qcm9wZXJ0eSIsIHNlc3Npb25LZXkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCBhIFNPQVBBY3Rpb24gaGVhZGVyIHNob3VsZCBiZSBzZW50IHdpdGgKLSAgICAgKiB0aGUgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VTb2FwQWN0aW9uKCkgewotICAgICAgICAvL1RPRE86IEFkZCBzb21lIGJpdCBvZiB2YWxpZGF0aW9uIGZvciB0aGlzIHByb3BlcnR5IHNvIHRoYXQgd2Uga25vdwotICAgICAgICAvLyBpdCBpcyBhY3R1YWxseSBhIEJvb2xlYW4gYW5kIG5vdCBhIFN0cmluZy4KLSAgICAgICAgQm9vbGVhbiB1c2UgPSAoQm9vbGVhbilyZXF1ZXN0Q29udGV4dC5nZXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZKTsKLSAgICAgICAgaWYgKHVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodXNlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0LCB0aGVuIGp1c3QgZGVmYXVsdCB0byBzZW5kaW5nIGEgU09BUEFjdGlvbgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyI2dldEVuZHBvaW50UmVmZXJlbmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbmRwb2ludFJlZmVyZW5jZShXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlciNnZXRFbmRwb2ludFJlZmVyZW5jZShqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICovCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gY2xhenopIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIgPSBudWxsOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShjbGF6eik7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9IGJpbmRpbmcuZ2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZXByID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHJlcXVlc3RDb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VRTmFtZSgpOwotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnQgPSBlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICgoU2VydmljZURlc2NyaXB0aW9uV1NETCkgZW5kcG9pbnREZXNjLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpKS5nZXRXU0RMTG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgIGVwciA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzLCBzZXJ2aWNlLCBwb3J0LCB3c2RsTG9jYXRpb24sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIWFkZHJlc3NpbmdOYW1lc3BhY2UuZXF1YWxzKGJpbmRpbmcuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ1Byb3ZpZGVyRXJyMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldEFkZHJlc3NpbmdOYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgamF4d3NFUFIgPSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludFJlZkNvbnN0cnVjdGlvbkZhaWx1cmUzIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNsYXp6LmNhc3QoamF4d3NFUFIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICogQW4gaW5uZXIgY2xhc3MgdXNlZCB0byB2YWxpZGF0ZSBwcm9wZXJ0aWVzIGFzIHRoZXkgYXJlIHNldCBieSB0aGUgY2xpZW50LgotICAgICovCi0gICAgY2xhc3MgVmFsaWRhdGluZ0NsaWVudENvbnRleHQgZXh0ZW5kcyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzQ4NTExMjIwNTgwMTkxNzg1OEw7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIC8vIHN1cGVyLnB1dCByaWdodGx5IHRocm93cyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGtleSBvciB2YWx1ZSBpcyBudWxsLCBzbyBkb24ndCBjb250aW51ZSBpZiB0aGF0J3MgdGhlIGNhc2UKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKFByb3BlcnR5VmFsaWRhdG9yLnZhbGlkYXRlKGtleSwgdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRQcm9wVmFsdWUiLCBrZXksIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbGlkYXRvci5nZXRFeHBlY3RlZFZhbHVlKGtleSkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0MWNkZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3czsKLQotLyoqCi0gKiBDb25zdGFudHMgdGhhdCBhcHBseSB0byB0aGUgSkFYLVdTIGltcGxlbWVudGF0aW9uLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0NPTlRFWFRfTUFQID0KLSAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50Q29udGV4dE1hcCI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfT1VUQk9VTkRfU09BUF9IRUFERVJTICA9IAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5KQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSU5CT1VORF9TT0FQX0hFQURFUlMgICA9IAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5KQVhXU19JTkJPVU5EX1NPQVBfSEVBREVSUzsKLSAgICAvKioKLSAgICAgKiBWYWx1ZSB0aGF0IGNhbiBiZSBzZXQgb24gYSBNZXNzYWdlQ29udGV4dC4gIFRoZSBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgYSBCb29sZWFuKCkKLSAgICAgKiAKLSAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gSkFYQiBzdHJlYW1pbmcgb2YgdGhlIFhNTCBib2R5IGlzIGRpc2FibGVkLgotICAgICAqIEEgdmFsdWUgb2YgZmFsc2Ugd2lsbCByZXN1bHQgaW4gc2xvd2VyIHBlcmZvcm1hbmNlIGZvciB1bm1hcnNoYWxsaW5nIEpBWEIgb2JqZWN0cwotICAgICAqIGJ1dCBpcyBhIGxvc3MtbGVzcyB0cmFuc2Zvcm1hdGlvbi4gIAotICAgICAqICAKLSAgICAgKiBBIHZhbHVlIG9mIHRydWUgd2lsbCBjYXVzZSB0aGUgSkFYQiBvYmplY3RzIHRvIGJlIGNyZWF0ZWQgd2hlbiB0aGUgWE1MIGJvZHkgaXMgaW5pdGlhbGx5IAotICAgICAqIHBhcnNlZCwgd2hpY2ggaXMgbW9yZSBwZXJmb3JtYW50LCBidXQgaXQgbWF5IGxvb3NlIHNvbWUgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSAKLSAgICAgKiBvcmlnaW5hbCBYTUwgc3VjaCBhcyBuYW1lc3BhY2UgcHJlZml4ZXMgaWYgdGhlIFhNTCBzdHJlYW0gaXMgcmVjcmVhdGVkIGZyb20gdGhlIEpBWEIgCi0gICAgICogb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBCb29sZWFuKHRydWUpIGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldC4gIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX0VOQUJMRV9KQVhCX1BBWUxPQURfU1RSRUFNSU5HID0gCi0gICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmVuYWJsZUpBWEJQYXlsb2FkU3RyZWFtaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVBfQ09OVEVYVCA9IAotICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLk1FUENvbnRleHQiOwotICAgIAotICAgIC8qKgotICAgICAqIElmIGEgY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duIGJ5IHRoZSB3ZWJzZXJ2aWNlJ3Mgd2VibWV0aG9kLCB0aGVuCi0gICAgICogdGhlIG5hbWUgb2YgdGhlIGNoZWNrZWQgZXhjZXB0aW9uIGlzIHBsYWNlZCBpbiB0aGUgb3V0Ym91bmQgcmVzcG9uc2UgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0VEX0VYQ0VQVElPTiA9Ci0gICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNoZWNrZWRFeGNlcHRpb24iOwotICAgIAotICAgIC8qKgotICAgICAqIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlIEpBWFdTIHdlYnNlcnZpY2UncyB3ZWJtZXRob2QsIHRoZSAKLSAgICAgKiBUaHJvd2FibGUgb2JqZWN0IGlzIHBsYWNlZCBpbiB0aGUgc2VydmljZSBvdXRib3VuZCByZXNwb25zZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX1dFQk1FVEhPRF9FWENFUFRJT04gPSAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGNvbnN0YW50IGludHJvZHVjZXMgYW4gZXh0ZW5zaW9uIGZvciBAQmluZGluZ1R5cGUgYW5ub3RhdGlvbi4KLSAgICAgKiBXaGVuIHRoZSB2YWx1ZSBvZiBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uIGlzIHNldCB0byB0aGlzIGNvbnN0YW50LAotICAgICAqIHRoZSBqYXZheC54bWwud3MuUHJvdmlkZXIgamF2YSBlbmRwb2ludHMgd2lsbCBjYXRlciB0byBTT0FQMTEgYW5kIFNPQVAxMgotICAgICAqIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfSFRUUF9CSU5ESU5HID0iU09BUF9IVFRQX0JJTkRJTkciOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzdmY2U0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL1dlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLQ0KLS8qKg0KLSAqIENvbnRyb2xzIGVycm9yIGxvZ2dpbmcgb2YgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIFdlYlNlcnZpY2UgYXBwbGljYXRpb24gKHByb3ZpZGVyLCBpbXBsLCBldGMuKQ0KLSAqIA0KLSAqIFRoaXMgY2xhc3MgbG9ncyBlcnJvcnMgZm9yIGFsbCBub24tY2hlY2tlZCBleGNlcHRpb25zLg0KLSAqIFRoaXMgY2xhc3MgbG9ncyBleHRlbnNpdmUgZGVidWcgaW5mb3JtYXRpb24gZm9yIGFsbCBleGNlcHRpb25zLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXIuY2xhc3MpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIExvZ3MgYW4gZXJyb3IgaWYgdGhlIGV4Y2VwdGlvbiB0aHJvd24gYnkgQFdlYk1ldGhvZCBtIGlzIG5vdCBhIGNoZWNrZWQgZXhjZXB0aW9uLg0KLSAgICAgKiBJZiBkZWJ1ZyBsb2dnaW5nIGlzIGVuYWJsZWQsIGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQuDQotICAgICAqIEBwYXJhbSBtZXRob2QNCi0gICAgICogQHBhcmFtIHRocm93YWJsZQ0KLSAgICAgKiBAcGFyYW0gbG9nRnVsbHkgKGlmIHRydWUgdGhlbiB0aGUgZXhjZXB0aW9uIGlzIGxvZ2dlZCwgb3RoZXJ3aXNlIG9ubHkgdGhlIGNsYXNzIGFuZCBzdGFjayBpcyBsb2dnZWQpDQotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW1wbENsYXNzIGNsYXNzIG9mIHNlcnZpY2UgaW1wbGVtZW50YXRpb24NCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbnN0YW5jZSANCi0gICAgICogQHBhcmFtIGFyZ3MgT2JqZWN0W10gYXJndW1lbnRzIHBhc3MgdG8gbWV0aG9kDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKE1ldGhvZCBtZXRob2QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbG9nRnVsbHksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUltcGxDbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MpIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTXVzdCBoYXZlIGRlYnVnIG9yIGVycm9yIGxvZ2dpbmcgZW5hYmxlZA0KLSAgICAgICAgaWYgKCFsb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiAhbG9nLmlzRXJyb3JFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEdldCB0aGUgcm9vdCBvZiB0aGUgZXhjZXB0aW9uDQotICAgICAgICBUaHJvd2FibGUgcm9vdFQgPSBudWxsOw0KLSAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICByb290VCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdGhyb3dhYmxlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgbmFtZSA9IHJvb3RULmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgU3RyaW5nIHN0YWNrID0gc3RhY2tUb1N0cmluZyhyb290VCk7DQotICAgICAgICANCi0gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgY2hlY2tlZCBleGNlcHRpb24gb3Igbm9uLWNoZWNrZWQgZXhjZXB0aW9uDQotICAgICAgICBDbGFzcyBjaGVja2VkRXhjZXB0aW9uID0gSmF2YVV0aWxzLmdldENoZWNrZWRFeGNlcHRpb24ocm9vdFQsIG1ldGhvZCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChjaGVja2VkRXhjZXB0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBPbmx5IGxvZyBlcnJvcnMgZm9yIG5vbi1jaGVja2VkIGV4Y2VwdGlvbnMNCi0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSAiIjsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZ0Z1bGx5KSB7DQotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZmFpbHVyZUxvZ2dlciIsIG5hbWUsIHJvb3RULnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIHRleHQgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJmYWlsdXJlTG9nZ2VyIiwgbmFtZSwgc3RhY2spOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICB9IA0KLSAgICAgICAgDQotICAgICAgICAvLyBGdWxsIGxvZ2dpbmcgaWYgZGVidWcgaXMgZW5hYmxlZC4NCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIGludm9raW5nIGEgbWV0aG9kIG9mICIgKyBzZXJ2aWNlSW1wbENsYXNzLnRvU3RyaW5nKCkNCi0gICAgICAgICAgICAgICAgICAgICsgIiBvZiBpbnN0YW5jZSAiICsgc2VydmljZUluc3RhbmNlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHR5cGUgdGhyb3duOiAiICsgdGhyb3dhYmxlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZiAocm9vdFQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJvb3QgRXhjZXB0aW9uIHR5cGUgdGhyb3duOiAiICsgcm9vdFQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoY2hlY2tlZEV4Y2VwdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGV4Y2VwdGlvbiBpcyBhbiBpbnN0YW5jZSBvZiBjaGVja2VkIGV4Y2VwdGlvbjogIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEV4Y2VwdGlvbi5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBsb2cuZGVidWcoIk1ldGhvZCA9ICIgKyBtZXRob2QudG9HZW5lcmljU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzW2ldID09IG51bGwpID8gIm51bGwiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFyZ3NbaV0uZ2V0Q2xhc3MoKS50b1N0cmluZygpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBBcmd1bWVudFsiICsgaSArICJdIGlzICIgKyB2YWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RhY2sgb2YgdGhlIHNwZWNpZmllZCBleGNlcHRpb24NCi0gICAgICoNCi0gICAgICogQHBhcmFtIGUNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsNCi0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IGphdmEuaW8uQnVmZmVyZWRXcml0ZXIoc3cpOw0KLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGJ3KTsNCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsNCi0gICAgICAgIHB3LmNsb3NlKCk7DQotICAgICAgICBTdHJpbmcgdGV4dCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7DQotICAgICAgICAvLyBKdW1wIHBhc3QgdGhlIHRocm93YWJsZQ0KLSAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKHRleHQuaW5kZXhPZigiYXQiKSk7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL1N1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQ0YTllLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBFbmRwb2ludFJlZmVyZW5jZVR5cGUgY29tcGxleCB0eXBlLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iRW5kcG9pbnRSZWZlcmVuY2VUeXBlIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiB0eXBlPSJ7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nfUF0dHJpYnV0ZWRVUkkiLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9IlJlZmVyZW5jZVByb3BlcnRpZXMiIHR5cGU9IntodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmd9UmVmZXJlbmNlUHJvcGVydGllc1R5cGUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iUmVmZXJlbmNlUGFyYW1ldGVycyIgdHlwZT0ie2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZ31SZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSIgbWluT2NjdXJzPSIwIi8+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJQb3J0VHlwZSIgdHlwZT0ie2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZ31BdHRyaWJ1dGVkUU5hbWUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iU2VydmljZU5hbWUiIHR5cGU9IntodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmd9U2VydmljZU5hbWVUeXBlIiBtaW5PY2N1cnM9IjAiLz4NCi0gKiAgICAgICAgICZsdDthbnkvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICogDQotICogDQotICovDQotQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiRW5kcG9pbnRSZWZlcmVuY2UiLCBuYW1lc3BhY2UgPSBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuTlMpDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiRW5kcG9pbnRSZWZlcmVuY2VUeXBlIiwgbmFtZXNwYWNlID0gU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLk5TLCBwcm9wT3JkZXIgPSB7DQotICAgICJhZGRyZXNzIiwNCi0gICAgInJlZmVyZW5jZVByb3BlcnRpZXMiLA0KLSAgICAicmVmZXJlbmNlUGFyYW1ldGVycyIsDQotICAgICJwb3J0VHlwZSIsDQotICAgICJzZXJ2aWNlTmFtZSIsDQotICAgICJhbnkiDQotfSkNCi1wdWJsaWMgY2xhc3MgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2Ugew0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOUyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOw0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEpBWEJDb250ZXh0IGpheGJDb250ZXh0Ow0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gIkFkZHJlc3MiLCBuYW1lc3BhY2UgPSBOUywgcmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgQXR0cmlidXRlZFVSSSBhZGRyZXNzOw0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gIlJlZmVyZW5jZVByb3BlcnRpZXMiLCBuYW1lc3BhY2UgPSBOUykNCi0gICAgcHJvdGVjdGVkIFJlZmVyZW5jZVByb3BlcnRpZXNUeXBlIHJlZmVyZW5jZVByb3BlcnRpZXM7DQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiUmVmZXJlbmNlUGFyYW1ldGVycyIsIG5hbWVzcGFjZSA9IE5TKQ0KLSAgICBwcm90ZWN0ZWQgUmVmZXJlbmNlUGFyYW1ldGVyc1R5cGUgcmVmZXJlbmNlUGFyYW1ldGVyczsNCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJQb3J0VHlwZSIsIG5hbWVzcGFjZSA9IE5TKQ0KLSAgICBwcm90ZWN0ZWQgQXR0cmlidXRlZFFOYW1lIHBvcnRUeXBlOw0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gIlNlcnZpY2VOYW1lIiwgbmFtZXNwYWNlID0gTlMpDQotICAgIHByb3RlY3RlZCBTZXJ2aWNlTmFtZVR5cGUgc2VydmljZU5hbWU7DQotICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpDQotICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55Ow0KLSAgICBAWG1sQW55QXR0cmlidXRlDQotICAgIHByaXZhdGUgTWFwPFFOYW1lLCBTdHJpbmc+IG90aGVyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBTdHJpbmc+KCk7DQotICAgIA0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgdHJ5IHsgDQotICAgICAgICAgICAgamF4YkNvbnRleHQgPShKQVhCQ29udGV4dCkNCi0gICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICB9KTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImpheGJDb250ZXh0RmFpbHVyZSIsIGUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UoKSB7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UoU291cmNlIGVwckluZm9zZXQpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVtID0gamF4YkNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7DQotICAgICAgICAgICAgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUiA9DQotICAgICAgICAgICAgICAgIChTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UpIHVtLnVubWFyc2hhbChlcHJJbmZvc2V0KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhZGRyZXNzID0gc3ViRVBSLmFkZHJlc3M7DQotICAgICAgICAgICAgcmVmZXJlbmNlUGFyYW1ldGVycyA9IHN1YkVQUi5yZWZlcmVuY2VQYXJhbWV0ZXJzOw0KLSAgICAgICAgICAgIHJlZmVyZW5jZVByb3BlcnRpZXMgPSBzdWJFUFIucmVmZXJlbmNlUHJvcGVydGllczsNCi0gICAgICAgICAgICBwb3J0VHlwZSA9IHN1YkVQUi5wb3J0VHlwZTsNCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHN1YkVQUi5zZXJ2aWNlTmFtZTsNCi0gICAgICAgICAgICBhbnkgPSBzdWJFUFIuYW55Ow0KLSAgICAgICAgICAgIG90aGVyQXR0cmlidXRlcy5wdXRBbGwoc3ViRVBSLm90aGVyQXR0cmlidXRlcyk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludFJlZkNvbnN0cnVjdGlvbkZhaWx1cmUyIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgIH0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhSZXN1bHQgcmVzdWx0KSB7DQotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmZXJlbmNlV3JpdGVFcnJvcjEiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgTWFyc2hhbGxlciBtID0gamF4YkNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOw0KLSAgICAgICAgICAgIG0uc2V0UHJvcGVydHkoTWFyc2hhbGxlci5KQVhCX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUpOw0KLSAgICAgICAgICAgIG0ubWFyc2hhbCh0aGlzLCByZXN1bHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRSZWZlcmVuY2VXcml0ZUVycm9yMSIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiA8cD5KYXZhIGNsYXNzIGZvciBBdHRyaWJ1dGVkVVJJIGNvbXBsZXggdHlwZS4NCi0gICAgICogDQotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICAgICAqIA0KLSAgICAgKiA8cHJlPg0KLSAgICAgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQXR0cmlidXRlZFVSSSI+DQotICAgICAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+DQotICAgICAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5hbnlVUkkiPg0KLSAgICAgKiAgICAgJmx0Oy9leHRlbnNpb24+DQotICAgICAqICAgJmx0Oy9zaW1wbGVDb250ZW50Pg0KLSAgICAgKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAgICAgKiA8L3ByZT4NCi0gICAgICogDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLSAgICBAWG1sVHlwZShuYW1lID0gIkF0dHJpYnV0ZWRVUkkiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAidmFsdWUiDQotICAgIH0pDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZWRVUkkgew0KLQ0KLSAgICAgICAgQFhtbFZhbHVlDQotICAgICAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpDQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOw0KLSAgICAgICAgQFhtbEFueUF0dHJpYnV0ZQ0KLSAgICAgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIEF0dHJpYnV0ZWRVUkkoKSB7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiA8cD5KYXZhIGNsYXNzIGZvciBSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSBjb21wbGV4IHR5cGUuDQotICAgICAqIA0KLSAgICAgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAgICAgKiANCi0gICAgICogPHByZT4NCi0gICAgICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IlJlZmVyZW5jZVBhcmFtZXRlcnNUeXBlIj4NCi0gICAgICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICAgICAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAgICAgKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICAgICAqICAgICAgICAgJmx0O2FueS8+DQotICAgICAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICAgICAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAgICAgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICAgICAqICZsdDsvY29tcGxleFR5cGU+DQotICAgICAqIDwvcHJlPg0KLSAgICAgKiANCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotICAgIEBYbWxUeXBlKG5hbWUgPSAiUmVmZXJlbmNlUGFyYW1ldGVyc1R5cGUiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAiYW55Ig0KLSAgICB9KQ0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSB7DQotDQotICAgICAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQ0KLSAgICAgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBhbnk7DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBSZWZlcmVuY2VQYXJhbWV0ZXJzVHlwZSgpIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIDxwPkphdmEgY2xhc3MgZm9yIFJlZmVyZW5jZVByb3BlcnRpZXNUeXBlIGNvbXBsZXggdHlwZS4NCi0gICAgICogDQotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICAgICAqIA0KLSAgICAgKiA8cHJlPg0KLSAgICAgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlUHJvcGVydGllc1R5cGUiPg0KLSAgICAgKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gICAgICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICAgICAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gICAgICogICAgICAgICAmbHQ7YW55Lz4NCi0gICAgICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gICAgICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICAgICAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gICAgICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gICAgICogPC9wcmU+DQotICAgICAqIA0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi0gICAgQFhtbFR5cGUobmFtZSA9ICJSZWZlcmVuY2VQcm9wZXJ0aWVzVHlwZSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJhbnkiDQotICAgIH0pDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZmVyZW5jZVByb3BlcnRpZXNUeXBlIHsNCi0NCi0gICAgICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpDQotICAgICAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGFueTsNCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIFJlZmVyZW5jZVByb3BlcnRpZXNUeXBlKCkgew0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogPHA+SmF2YSBjbGFzcyBmb3IgU2VydmljZU5hbWVUeXBlIGNvbXBsZXggdHlwZS4NCi0gICAgICogDQotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICAgICAqIA0KLSAgICAgKiA8cHJlPg0KLSAgICAgKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iU2VydmljZU5hbWVUeXBlIj4NCi0gICAgICogICAmbHQ7c2ltcGxlQ29udGVudD4NCi0gICAgICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPlFOYW1lIj4NCi0gICAgICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJQb3J0TmFtZSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfU5DTmFtZSIgLz4NCi0gICAgICogICAgICZsdDsvZXh0ZW5zaW9uPg0KLSAgICAgKiAgICZsdDsvc2ltcGxlQ29udGVudD4NCi0gICAgICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gICAgICogPC9wcmU+DQotICAgICAqIA0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi0gICAgQFhtbFR5cGUobmFtZSA9ICJTZXJ2aWNlTmFtZVR5cGUiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAidmFsdWUiDQotICAgIH0pDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VOYW1lVHlwZSB7DQotDQotICAgICAgICBAWG1sVmFsdWUNCi0gICAgICAgIHByb3RlY3RlZCBRTmFtZSB2YWx1ZTsNCi0gICAgICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJQb3J0TmFtZSIpDQotICAgICAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpDQotICAgICAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gIk5DTmFtZSIpDQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lOw0KLSAgICAgICAgQFhtbEFueUF0dHJpYnV0ZQ0KLSAgICAgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIFNlcnZpY2VOYW1lVHlwZSgpIHsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIDxwPkphdmEgY2xhc3MgZm9yIEF0dHJpYnV0ZWRRTmFtZSBjb21wbGV4IHR5cGUuDQotICAgICAqIA0KLSAgICAgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAgICAgKiANCi0gICAgICogPHByZT4NCi0gICAgICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkF0dHJpYnV0ZWRRTmFtZSI+DQotICAgICAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+DQotICAgICAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5RTmFtZSI+DQotICAgICAqICAgICAmbHQ7L2V4dGVuc2lvbj4NCi0gICAgICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+DQotICAgICAqICZsdDsvY29tcGxleFR5cGU+DQotICAgICAqIDwvcHJlPg0KLSAgICAgKiANCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotICAgIEBYbWxUeXBlKG5hbWUgPSAiQXR0cmlidXRlZFFOYW1lIiwgcHJvcE9yZGVyID0gew0KLSAgICAgICAgInZhbHVlIg0KLSAgICB9KQ0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVkUU5hbWUgew0KLQ0KLSAgICAgICAgQFhtbFZhbHVlDQotICAgICAgICBwcm90ZWN0ZWQgUU5hbWUgdmFsdWU7DQotICAgICAgICBAWG1sQW55QXR0cmlidXRlDQotICAgICAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOw0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgQXR0cmlidXRlZFFOYW1lKCkgew0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MzI2MjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50UmVmZXJlbmNlVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHtAbGluayBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2V9Lg0KLSAqDQotICogQHNlZSBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWxlbWVudFtdIFpFUk9fTEVOR1RIX0FSUkFZID0gbmV3IEVsZW1lbnRbMF07DQotDQotCXByaXZhdGUgU3RyaW5nIGFkZHJlc3M7DQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWU7DQotICAgIHByaXZhdGUgUU5hbWUgZW5kcG9pbnROYW1lOw0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsRG9jdW1lbnRMb2NhdGlvbjsNCi0gICAgcHJpdmF0ZSBMaXN0PEVsZW1lbnQ+IHJlZmVyZW5jZVBhcmFtZXRlcnM7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydFR5cGU7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICoNCi0gICAgICovDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCkgew0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBhZGRyZXNzIFVSSSB0byB1c2UuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBVUkkNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiB0aGF0IGhhcw0KLSAgICAgKiBiZWVuIHVwZGF0ZWQgYXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgYWRkcmVzcyhTdHJpbmcgYWRkcmVzcykgew0KLSAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsNCi0gICAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBXU0RMIHNlcnZpY2UgbmFtZSBvZiB0aGUgZW5kcG9pbnQgdGhhdCB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIHdpbGwgdGFyZ2V0Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHRoZSBXU0RMIHNlcnZpY2UgbmFtZQ0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI8L2NvZGU+IHRoYXQgaGFzDQotICAgICAqIGJlZW4gdXBkYXRlZCBhcyBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlciBzZXJ2aWNlTmFtZShRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOw0KLSAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIFdTREwgcG9ydCBuYW1lIG9mIHRoZSBlbmRwb2ludCB0aGF0IHRoZSBlbmRwb2ludCByZWZlcmVuY2Ugd2lsbCB0YXJnZXQuDQotICAgICAqIFRoZSBXU0RMIHBvcnQgbmFtZSBjYW4gb25seSBiZSBzZXQgYWZ0ZXIgdGhlIFdTREwgc2VydmljZSBuYW1lIGhhcyBiZWVuIHNldC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBlbmRwb2ludE5hbWUgdGhlIFdTREwgcG9ydCBuYW1lDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gdGhhdCBoYXMNCi0gICAgICogYmVlbiB1cGRhdGVkIGFzIHNwZWNpZmllZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIGVuZHBvaW50TmFtZShRTmFtZSBlbmRwb2ludE5hbWUpIHsNCi0gICAgICAgIGlmICh0aGlzLnNlcnZpY2VOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UU5hbWVTZXRFcnJvciIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludE5hbWUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB0aGlzLmVuZHBvaW50TmFtZSA9IGVuZHBvaW50TmFtZTsNCi0gICAgICAgIHJldHVybiB0aGlzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBVUkkgZnJvbSB3aGVyZSB0aGUgV1NETCBmb3IgdGhlIGVuZHBvaW50IHRoYXQgdGhlIGVuZHBvaW50IHJlZmVyZW5jZSB3aWxsDQotICAgICAqIHRhcmdldCBjYW4gYmUgcmV0cmlldmVkLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHdzZGxEb2N1bWVudExvY2F0aW9uIHRoZSBsb2NhdGlvbiBVUkkgb2YgdGhlIFdTREwNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiB0aGF0IGhhcw0KLSAgICAgKiBiZWVuIHVwZGF0ZWQgYXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgd3NkbERvY3VtZW50TG9jYXRpb24oU3RyaW5nIHdzZGxEb2N1bWVudExvY2F0aW9uKSB7DQotICAgICAgICB0aGlzLndzZGxEb2N1bWVudExvY2F0aW9uID0gd3NkbERvY3VtZW50TG9jYXRpb247DQotICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCByZWZlcmVuY2UgcHJvcGVydGllcy4gVGhlc2Ugd2lsbCBhcHBlYXIgaW4gdGhlIGVuZHBvaW50IHJlZmVyZW5jZSBhcyByZWZlcmVuY2UNCi0gICAgICogcGFyYW1ldGVycy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZWZlcmVuY2VQcm9wZXJ0eSB0aGUgcmVmZXJlbmNlIHByb3BlcnR5DQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gdGhhdCBoYXMNCi0gICAgICogYmVlbiB1cGRhdGVkIGFzIHNwZWNpZmllZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHJlZmVyZW5jZVByb3BlcnR5KEVsZW1lbnQgcmVmZXJlbmNlUHJvcGVydHkpIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2VQcm9wZXJ0eSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJyZWZlcmVuY2VQcm9wZXJ0eU51bGxFcnIiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmICh0aGlzLnJlZmVyZW5jZVBhcmFtZXRlcnMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgdGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzLmFkZChyZWZlcmVuY2VQcm9wZXJ0eSk7DQotICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCByZWZlcmVuY2UgcGFyYW1ldGVycy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSByZWZlcmVuY2VQYXJhbWV0ZXIgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXINCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyPC9jb2RlPiB0aGF0IGhhcw0KLSAgICAgKiBiZWVuIHVwZGF0ZWQgYXMgc3BlY2lmaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgcmVmZXJlbmNlUGFyYW1ldGVyKEVsZW1lbnQgcmVmZXJlbmNlUGFyYW1ldGVyKSB7DQotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVyID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlZmVyZW5jZVBhcmFtZXRlck51bGxFcnIiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmICh0aGlzLnJlZmVyZW5jZVBhcmFtZXRlcnMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudD4oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgdGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzLmFkZChyZWZlcmVuY2VQYXJhbWV0ZXIpOw0KLSAgICAgICAgcmV0dXJuIHRoaXM7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGQgdGhlIG5hbWUgb2YgdGhlIFdTREwgcG9ydCB0eXBlLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHBvcnRUeXBlIHRoZSBXU0RMIHBvcnQgdHlwZSBuYW1lDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+U3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjwvY29kZT4gdGhhdCBoYXMNCi0gICAgICogYmVlbiB1cGRhdGVkIGFzIHNwZWNpZmllZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHBvcnRUeXBlKFFOYW1lIHBvcnRUeXBlKSB7DQotICAgICAgICB0aGlzLnBvcnRUeXBlID0gcG9ydFR5cGU7DQotICAgICAgICByZXR1cm4gdGhpczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gYmFzZWQgb24gdGhlIHZhbHVlcw0KLSAgICAgKiBzcGVjaWZpZWQuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgYnVpbGQoKSB7DQotICAgIAlTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2Ugc3VibWlzc2lvbkVQUiA9IG51bGw7DQotICAgIAkNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0NCi0gICAgICAgIAlFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmdldEFkZHJlc3NpbmdOYW1lc3BhY2UoU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsgICAgCQ0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0NCi0gICAgICAgIAlFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcywgc2VydmljZU5hbWUsIGVuZHBvaW50TmFtZSwgd3NkbERvY3VtZW50TG9jYXRpb24sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICAJDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhheGlzMkVQUiwgcmVmZXJlbmNlUGFyYW1ldGVycy50b0FycmF5KFpFUk9fTEVOR1RIX0FSUkFZKSk7DQotICAgICAgICAJDQotICAgICAgICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpDQotICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuYWRkSW50ZXJmYWNlKGF4aXMyRVBSLCBwb3J0VHlwZSwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICAJDQotICAgICAgICAgICAgc3VibWlzc2lvbkVQUiA9DQotICAgICAgICAgICAgICAgIChTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UpIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydEZyb21BeGlzMihheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludFJlZkNvbnN0cnVjdGlvbkZhaWx1cmUyIiwgZS50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBzdWJtaXNzaW9uRVBSOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkFkZHJlc3M6ICIpLmFwcGVuZChhZGRyZXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIFNlcnZpY2UgbmFtZTogIikuYXBwZW5kKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGVuZHBvaW50TmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBFbmRwb2ludCBuYW1lOiAiKS5hcHBlbmQoZW5kcG9pbnROYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIFBvcnQgdHlwZTogIikuYXBwZW5kKHBvcnRUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiwgUmVmZXJlbmNlIHBhcmFtZXRlcnM6ICIpLmFwcGVuZChyZWZlcmVuY2VQYXJhbWV0ZXJzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHdzZGxEb2N1bWVudExvY2F0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIFdTREwgbG9jYXRpb246ICIpLmFwcGVuZCh3c2RsRG9jdW1lbnRMb2NhdGlvbik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L0F4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0NTM4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGZhY3RvcmllcyB0aGF0IGNhbiBiZSB1c2UgdG8gY3JlYXRlIGluc3RhbmNlcyBvZg0KLSAqIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0gdGhhdCBjYW4gdWx0aW1hdGVseSBiZSBjb252ZXJ0ZWQgaW50byBpbnN0YW5jZXMNCi0gKiBvZiB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlfSB0aGF0IGFyZSBzdWl0YWJsZSB0byBiZSByZXR1cm5lZA0KLSAqIHZpYSB0aGUgYXBwcm9wcmlhdGUgSkFYLVdTIDIuMSBBUEkgbWV0aG9kcy4NCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5IHsNCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBVUkkgdG8gdXNlLiBJdCBjYW5ub3QgYmUgbnVsbC4NCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoU3RyaW5nIGFkZHJlc3MpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gdGhhdCB0YXJnZXRzIHRoZSBlbmRwb2ludA0KLSAgICAgKiBpZGVudGlmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgV1NETCBzZXJ2aWNlIG5hbWUgYW5kIGVuZHBvaW50IG5hbWUuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgdGhlIFdTREwgc2VydmljZSBuYW1lDQotICAgICAqIEBwYXJhbSBlbmRwb2ludCB0aGUgV1NETCBwb3J0IG5hbWUNCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4gdGhhdCB0YXJnZXRzIHRoZSBzcGVjaWZpZWQNCi0gICAgICogZW5kcG9pbnQNCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgZW5kcG9pbnQpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uIElmIHRoZSBhZGRyZXNzIGlzIHNwZWNpZmllZA0KLSAgICAgKiB0aGVuIGl0IHdpbGwgYmUgdXNlZC4gSWYgdGhlIGFkZHJlc3MgaXMgbnVsbCwgYnV0IHRoZSBXU0RMIHNlcnZpY2UgbmFtZSBhbmQgcG9ydA0KLSAgICAgKiBuYW1lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aGV5IHdpbGwgYmUgdXNlZCB0byB0YXJnZXQgdGhlIHNwZWNpZmllZCBlbmRwb2ludC4gRWl0aGVyDQotICAgICAqIHRoZSBhZGRyZXNzIFVSSSwgb3IgdGhlIFdTREwgc2VydmljZSBuYW1lIGFuZCBwb3J0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyBVUkkgdG8gdXNlLCBpZiBzcGVjaWZpZWQNCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHRoZSBXU0RMIHNlcnZpY2UgbmFtZSwgaWYgc3BlY2lmaWVkDQotICAgICAqIEBwYXJhbSBwb3J0TmFtZSB0aGUgV1NETCBwb3J0IG5hbWUsIGlmIHNwZWNpZmllZA0KLSAgICAgKiBAcGFyYW0gd3NkbERvY3VtZW50TG9jYXRpb24gdGhlIFVSSSBmcm9tIHdoZXJlIHRoZSBXU0RMIGZvciB0aGUgZW5kcG9pbnQgY2FuIGJlDQotICAgICAqIHJldHJpZXZlZCwgaWYgc3BlY2lmaWVkLg0KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSB0aGUgaW50ZW5kZWQgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UgdGhhdCB0aGUgPGNvZGU+DQotICAgICAqIEVuZHBvaW50UmVmZW5jZTwvY29kZT4gc2hvdWxkIGNvbXBseSB3aXRoLg0KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPi4NCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcywgUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24sIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L0pBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMjRkYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBmYWN0b3JpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBpbnN0YW5jZXMgb2YgdGhlDQotICoge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfS4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5IHsNCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIHN1cHBvcnRlZCBzdWJjbGFzcyBvZiA8Y29kZT5FbmRwb2ludFJlZmVyZW5jZTwvY29kZT4uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZXBySW5mb3NldCB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlDQotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+Lg0KLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShTb3VyY2UgZXBySW5mb3NldCkgdGhyb3dzIEpBWEJFeGNlcHRpb247DQotICAgIA0KLSAgICAvKioNCi0gICAgICogTWFwIHRoZSBzcGVjaWZpZWQgY2xhc3MgdG8gYSBzdXBwb3J0ZWQgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gPFQ+IGEgc3ViY2xhc3Mgb2YgPGNvZGU+RW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+Lg0KLSAgICAgKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzLg0KLSAgICAgKiBAcmV0dXJuIHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xhc3MuDQotICAgICAqLw0KLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbmRwb2ludFJlZmVyZW5jZT4gU3RyaW5nIGdldEFkZHJlc3NpbmdOYW1lc3BhY2UoQ2xhc3M8VD4gY2xhenopOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL2ZhY3RvcnkvaW1wbC9BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9pbXBsL0F4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI1ZTljLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9pbXBsL0F4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRDb250ZXh0TWFwOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludEtleTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRSZWZlcmVuY2VVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTRExXcmFwcGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBwcm9kdWNlcyBpbnN0YW5jZXMgb2Yge0BsaW5rIEVuZHBvaW50UmVmZXJlbmNlfS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSB7DQotICAgIHB1YmxpYyBBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwoKSB7DQotICAgIAlzdXBlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5I2NyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKGphdmEubGFuZy5TdHJpbmcpDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoU3RyaW5nIGFkZHJlc3MpIHsNCi0gICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpDQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGVuZHBvaW50IGFkZHJlc3MgVVJJIGlzIG51bGwuIik7DQotDQotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkjY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkNCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgZW5kcG9pbnQpIHsNCi0gICAgICAgIEVuZHBvaW50S2V5IGtleSA9IG5ldyBFbmRwb2ludEtleShzZXJ2aWNlTmFtZSwgZW5kcG9pbnQpOw0KLSAgICAgICAgRW5kcG9pbnRDb250ZXh0TWFwIG1hcCA9IEVuZHBvaW50Q29udGV4dE1hcE1hbmFnZXIuZ2V0RW5kcG9pbnRDb250ZXh0TWFwKCk7DQotICAgICAgICANCi0gICAgICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpDQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBhIGRlcGxveWVkIHNlcnZpY2UgdGhhdCBtYXBzIHRvIHRoZSByZXF1ZXN0ZWQgZW5kcG9pbnQsICIgKyBrZXkpOw0KLSAgICAgICAgDQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgbWFwLmdldChrZXkpOw0KLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGFkZHJlc3MgPSBheGlzU2VydmljZS5nZXRFUFJzKClbMF07DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL2RvIG5vdGhpbmcNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkjY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoamF2YS5sYW5nLlN0cmluZywgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcywgUU5hbWUgc2VydmljZU5hbWUsIFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24sIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKSB7DQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCAmJiBwb3J0TmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJheGlzRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5RXJyIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYXhpczJFUFIgPSBjcmVhdGVFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2UgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwgJiYgcG9ydE5hbWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGF4aXMyRVBSID0gY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2Uoc2VydmljZU5hbWUsIHBvcnROYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJheGlzRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5RXJyMiIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy9UT0RPIElmIG5vIHNlcnZpY2UgbmFtZSBhbmQgcG9ydCBuYW1lIGFyZSBzcGVjaWZpZWQsIGJ1dCB0aGUgd3NkbCBsb2NhdGlvbiBpcw0KLSAgICAgICAgLy9zcGVjaWZpZWQsIGFuZCB0aGUgV1NETCBvbmx5IGNvbnRhaW5zIG9uZSBzZXJ2aWNlIGFuZCBvbmUgcG9ydCB0aGVuIG1heWJlIHdlDQotICAgICAgICAvL3Nob3VsZCBzaW1wbHkgdXNlIHRob3NlLiAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vVGhpcyBjb2RlIGlzIGxvY2F0ZSBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFFOYW1lLCBRTmFtZSkNCi0gICAgICAgICAgICAvL21ldGhvZCBzbyB0aGF0IGlmIHRoZSBhZGRyZXNzIGlzIGFsc28gc3BlY2lmaWVkIHRoZSBFUFIgbWV0YWRhdGEgd2lsbCBzdGlsbCBiZQ0KLSAgICAgICAgICAgIC8vZmlsbGVkIGluIGNvcnJlY3RseS4NCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmFkZFNlcnZpY2UoYXhpczJFUFIsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotDQotICAgICAgICAgICAgaWYgKHdzZGxEb2N1bWVudExvY2F0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAJVVJMIHdzZGxVUkwgPSBuZXcgVVJMKHdzZGxEb2N1bWVudExvY2F0aW9uKTsNCi0gICAgICAgICAgICAJLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSB1c2FnZSwgc28gdXNlIGEgbWVtb3J5IHNlbnNpdGl2ZSB3cmFwcGVyDQotICAgICAgICAgICAgICAgIFdTRExXcmFwcGVyIHdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih3c2RsVVJMLCB0cnVlLCAyKTsNCi0gICAgICAgICAgICAJDQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlci5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTWlzc2luZ1NlcnZpY2VOYW1lIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUudG9TdHJpbmcoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbERvY3VtZW50TG9jYXRpb24pKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcG9ydHMgPSB3cmFwcGVyLmdldFBvcnRzKHNlcnZpY2VOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydExvY2FsTmFtZSA9IHBvcnROYW1lLmdldExvY2FsUGFydCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9ydHMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwb3J0IDogcG9ydHMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0LmVxdWFscyhwb3J0TG9jYWxOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJNaXNzaW5nUG9ydE5hbWUiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUudG9TdHJpbmcoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxEb2N1bWVudExvY2F0aW9uKSk7IA0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmFkZExvY2F0aW9uKGF4aXMyRVBSLCBwb3J0TmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgd3NkbERvY3VtZW50TG9jYXRpb24sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsNCi0gICAgICAgIAl0aHJvdyBpc2U7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lg0KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRSZWZDcmVhdGlvbkVycm9yIiksIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGF4aXMyRVBSOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvZmFjdG9yeS9pbXBsL0pBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L2ltcGwvSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOGZhMjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9mYWN0b3J5L2ltcGwvSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgaW5zdGFuY2VzIG9mIHRoZSBmb2xsb3dpbmcgc3ViY2xhc3NlcyBvZg0KLSAqIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0uDQotICoNCi0gKiBAc2VlIGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2UNCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnkgew0KLSAgICBwcml2YXRlIEpBWEJDb250ZXh0IGpheGJDb250ZXh0Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICovDQotICAgIHB1YmxpYyBKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwoKSB7DQotICAgICAgICBzdXBlcigpOw0KLQ0KLSAgICAgICAgdHJ5IHsgDQotICAgICAgICAgICAgamF4YkNvbnRleHQgPShKQVhCQ29udGV4dCkNCi0gICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKA0KLSAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZS5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgfSk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJqYXhiQ29udGV4dEZhaWx1cmUiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5I2NyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKFNvdXJjZSBlcHJJbmZvc2V0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7DQotICAgICAgICBVbm1hcnNoYWxsZXIgdW0gPSBqYXhiQ29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsNCi0gICAgICAgIHJldHVybiAoRW5kcG9pbnRSZWZlcmVuY2UpIHVtLnVubWFyc2hhbChlcHJJbmZvc2V0KTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5mYWN0b3J5LkpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5I2dldEFkZHJlc3NpbmdOYW1lc3BhY2UoamF2YS5sYW5nLkNsYXNzKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFN0cmluZyBnZXRBZGRyZXNzaW5nTmFtZXNwYWNlKENsYXNzPFQ+IGNsYXp6KSB7DQotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIGlmIChXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgew0KLSAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBGaW5hbC5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgfSBlbHNlIGlmIChTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsNCi0gICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgfSBlbHNlICB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmtub3duQ2xhc3NUeXBlIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ei50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBhZGRyZXNzaW5nTmFtZXNwYWNlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvbWlncmF0b3IvRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvbWlncmF0b3IvRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyNjM3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL21pZ3JhdG9yL0VuZHBvaW50Q29udGV4dE1hcE1pZ3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcubWlncmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50Q29udGV4dE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5UaHJlYWRDb250ZXh0TWlncmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBlbmFibGUgdGhlIEpBWC1XUyAyLjEgQVBJIG1ldGhvZHMgdG8gY3JlYXRlIGluc3RhbmNlcyBvZgotICoge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZX0gdGhhdCB0YXJnZXQgYSBwYXJ0aWN1bGFyIHdlYiBzZXJ2aWNlCi0gKiBlbmRwb2ludCwgaWRlbnRpZmllZCBieSBzcGVjaWZ5aW5nIHRoZSBXU0RMIHNlcnZpY2UgbmFtZSBhbmQgcG9ydCBuYW1lIG9mIHRoZQotICogZW5kcG9pbnQsIHRvIHdvcmsgY29ycmVjdGx5LiBUaGlzIGlzIGFjaGlldmVkIGJ5IGVuYWJsaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAKLSAqIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeX0KLSAqIHRvIHJldHJpZXZlIHRoZSBjb250ZXh0IGl0IG5lZWRzIGZyb20gdGhlIGludm9raW5nIHRocmVhZC4gVGhlIGluc3RhbmNlcyBvZgotICoge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZX0gdGhhdCBpdCBwcm9kdWNlcyBjYW4KLSAqIHRoZW4gY29udmVydGVkIHRvIGluc3RhbmNlcyBvZiB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlfSwgYXMKLSAqIG5lZWRlZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IgaW1wbGVtZW50cyBUaHJlYWRDb250ZXh0TWlncmF0b3IgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvciNtaWdyYXRlQ29udGV4dFRvVGhyZWFkKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtaWdyYXRlQ29udGV4dFRvVGhyZWFkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vT25seSBtYWtlIHRoZSBjb250ZXh0IG1hcCBhdmFpbGFibGUgaWYgd2UgaGF2ZSBhbiBpbmJvdW5kIHJlcXVlc3QKLSAgICAgICAgLy9tZXNzYWdlLCBpbiB0aGUgc2VydmVyLgotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBtZXAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgaW50IG1lcENvbnN0YW50ID0gVXRpbHMuZ2V0QXhpc1NwZWNpZk1FUENvbnN0YW50KG1lcCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT05MWSB8fAotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUIHx8Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PUFRJT05BTF9PVVQgfHwKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID09IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZKQotICAgICAgICB7Ci0gICAgICAgICAgICBFbmRwb2ludENvbnRleHRNYXAgbWFwID0gKEVuZHBvaW50Q29udGV4dE1hcCkgCi0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRQcm9wZXJ0eShDb25zdGFudHMuRU5EUE9JTlRfQ09OVEVYVF9NQVApOwotICAgICAgICAgICAgRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlci5zZXRFbmRwb2ludENvbnRleHRNYXAobWFwKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvciNjbGVhbnVwVGhyZWFkKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwVGhyZWFkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIC8vT25seSBjbGVhbiB1cCBpZiB3ZSBhcmUgaW5ib3VuZCB0byB0aGUgc2VydmVyLgotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBtZXAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgaW50IG1lcENvbnN0YW50ID0gVXRpbHMuZ2V0QXhpc1NwZWNpZk1FUENvbnN0YW50KG1lcCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT05MWSB8fAotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUIHx8Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PUFRJT05BTF9PVVQgfHwKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID09IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZKQotICAgICAgICB7Ci0gICAgICAgICAgICBFbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyLnNldEVuZHBvaW50Q29udGV4dE1hcChudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudXRpbC5UaHJlYWRDb250ZXh0TWlncmF0b3IjbWlncmF0ZVRocmVhZFRvQ29udGV4dChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWlncmF0ZVRocmVhZFRvQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvL05vdGhpbmcgdG8gZG8uCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvciNjbGVhbnVwQ29udGV4dChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cENvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgLy9Ob3RoaW5nIHRvIGRvLgotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9wYWNrYWdlLWluZm8uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTk5ZGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdCA9IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnNGb3JtLlFVQUxJRklFRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIikNCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZzsNCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRDb250ZXh0TWFwLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRDb250ZXh0TWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTU1ZmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50Q29udGV4dE1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIHRoZSBjb250ZXh0IG5lZWRlZCB0byBjb3JyZWN0bHkgcHJvZHVjZSBpbnN0YW5jZXMgb2YKLSAqIHtAbGluayBqYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2V9IGZvciBhIHBhcnRpY3VsYXIgd2ViIHNlcnZpY2UgZW5kcG9pbnQKLSAqIGlkZW50aWZpZWQgYnkgYW4ge0BsaW5rIEVuZHBvaW50S2V5fS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludENvbnRleHRNYXAgZXh0ZW5kcyBDb25jdXJyZW50SGFzaE1hcDxFbmRwb2ludEtleSwgT2JqZWN0PiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjk0NTM5NzM0ODI1NTAwNTk5TDsKLQotICAgIHB1YmxpYyBFbmRwb2ludENvbnRleHRNYXAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50Q29udGV4dE1hcE1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludENvbnRleHRNYXBNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NDNmZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50Q29udGV4dE1hcE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1hbmFnZSB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhbiB7QGxpbmsgRW5kcG9pbnRDb250ZXh0TWFwfQotICogYW5kIGEgdGhyZWFkLgotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8RW5kcG9pbnRDb250ZXh0TWFwPiB2YXJpYWJsZSA9Ci0gICAgICAgIG5ldyBJbmhlcml0YWJsZVRocmVhZExvY2FsPEVuZHBvaW50Q29udGV4dE1hcD4oKTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50Q29udGV4dE1hcCBzZXRFbmRwb2ludENvbnRleHRNYXAoRW5kcG9pbnRDb250ZXh0TWFwIG5ld01hcCkgewotICAgICAgICBFbmRwb2ludENvbnRleHRNYXAgb2xkTWFwID0gdmFyaWFibGUuZ2V0KCk7Ci0gICAgICAgIHZhcmlhYmxlLnNldChuZXdNYXApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9sZE1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludENvbnRleHRNYXAgZ2V0RW5kcG9pbnRDb250ZXh0TWFwKCkgewotICAgICAgICBFbmRwb2ludENvbnRleHRNYXAgY3VycmVudE1hcCA9IHZhcmlhYmxlLmdldCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudE1hcCA9IGdldERlZmF1bHRFbmRwb2ludE1hcCgpOwotICAgICAgICAgICAgc2V0RW5kcG9pbnRDb250ZXh0TWFwKGN1cnJlbnRNYXApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY3VycmVudE1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRDb250ZXh0TWFwIGdldERlZmF1bHRFbmRwb2ludE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludENvbnRleHRNYXAoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRLZXkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGYwYTdmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9FbmRwb2ludEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgcGFydGljdWxhciB3ZWIgc2VydmljZSBlbmRwb2ludCBiYXNlZCBvbg0KLSAqIHRoZSBjb21iaW5hdGlvbiBvZiBXU0RMIHNlcnZpY2UgbmFtZSBhbmQgcG9ydCBuYW1lLg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEVuZHBvaW50S2V5IHsNCi0gICAgcHJpdmF0ZSBmaW5hbCBRTmFtZSBzZXJ2aWNlOw0KLSAgICBwcml2YXRlIGZpbmFsIFFOYW1lIGVuZHBvaW50Ow0KLSAgICANCi0gICAgcHVibGljIEVuZHBvaW50S2V5KFFOYW1lIHNlcnZpY2UsIFFOYW1lIGVuZHBvaW50KSB7DQotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzZXJ2aWNlIHFuYW1lIGNhbm5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkNCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZW5kcG9pbnQgcW5hbWUgY2Fubm90IGJlIG51bGwuIik7DQotICAgICAgICANCi0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7DQotICAgICAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldEVuZHBvaW50KCkgew0KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBHZW5lcmF0ZWQgYnkgRWNsaXBzZSAtIHN1Z2dlc3QgcmUtZ2VuZXJhdGlvbiBpZiBjbGFzcyBjaGFuZ2VzDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmICh0aGlzID09IG9iaikNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICBmaW5hbCBFbmRwb2ludEtleSBvdGhlciA9IChFbmRwb2ludEtleSkgb2JqOw0KLSAgICAgICAgaWYgKGVuZHBvaW50ID09IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAob3RoZXIuZW5kcG9pbnQgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfSBlbHNlIGlmICghZW5kcG9pbnQuZXF1YWxzKG90aGVyLmVuZHBvaW50KSkNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKG90aGVyLnNlcnZpY2UgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfSBlbHNlIGlmICghc2VydmljZS5lcXVhbHMob3RoZXIuc2VydmljZSkpDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBHZW5lcmF0ZWQgYnkgRWNsaXBzZSAtIHN1Z2dlc3QgcmUtZ2VuZXJhdGlvbiBpZiBjbGFzcyBjaGFuZ2VzDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCi0gICAgICAgIGZpbmFsIGludCBQUklNRSA9IDMxOw0KLSAgICAgICAgaW50IHJlc3VsdCA9IDE7DQotICAgICAgICByZXN1bHQgPSBQUklNRSAqIHJlc3VsdCArICgoZW5kcG9pbnQgPT0gbnVsbCkgPyAwIDogZW5kcG9pbnQuaGFzaENvZGUoKSk7DQotICAgICAgICByZXN1bHQgPSBQUklNRSAqIHJlc3VsdCArICgoc2VydmljZSA9PSBudWxsKSA/IDAgOiBzZXJ2aWNlLmhhc2hDb2RlKCkpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsNCi0gICAgfQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICBidWZmZXIuYXBwZW5kKCJTZXJ2aWNlOiAiKTsNCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQoc2VydmljZSk7DQotICAgICAgICBidWZmZXIuYXBwZW5kKCIsIFBvcnQ6ICIpOw0KLSAgICAgICAgYnVmZmVyLmFwcGVuZChlbmRwb2ludCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50UmVmZXJlbmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1NTI5ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuSW50ZXJmYWNlTmFtZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLlNlcnZpY2VOYW1lOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuV1NETExvY2F0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuZmFjdG9yeS5BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7DQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotDQotcHVibGljIGZpbmFsIGNsYXNzIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMgew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLQ0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnZlcnQgZnJvbSBhIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0gdG8gYQ0KLSAgICAgKiBzdWJjbGFzcyBvZiB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlfS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzMkVQUg0KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZSBjb252ZXJ0RnJvbUF4aXMyKEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkNCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShhZGRyZXNzaW5nTmFtZXNwYWNlLCAiRW5kcG9pbnRSZWZlcmVuY2UiLCAid3NhIik7DQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0NCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci50b09NKG9tRmFjdG9yeSwgYXhpczJFUFIsIHFuYW1lLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgb21FbGVtZW50LnNlcmlhbGl6ZShiYW9zKTsNCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsgICAgICAgIA0KLSAgICAgICAgU291cmNlIGVwckluZm9zZXQgPSBuZXcgU3RyZWFtU291cmNlKGJhaXMpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gY29udmVydEZyb21Tb3VyY2UoZXBySW5mb3NldCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnZlcnQgZnJvbSBhIHtAbGluayBTb3VyY2V9IHRvIGENCi0gICAgICogc3ViY2xhc3Mgb2Yge0BsaW5rIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZX0uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZXBySW5mb3NldA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZSBjb252ZXJ0RnJvbVNvdXJjZShTb3VyY2UgZXBySW5mb3NldCkNCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSBmYWN0b3J5ID0gKEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRW5kcG9pbnRSZWZlcmVuY2UoZXBySW5mb3NldCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb252ZXJ0IGZyb20gYSB7QGxpbmsgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlfSB0byBhIGFuIGluc3RhbmNlIG9mDQotICAgICAqIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZX0uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpczJFUFINCi0gICAgICogQHBhcmFtIGpheHdzRVBSDQotICAgICAqIEByZXR1cm4gdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIG9mIHRoZSA8Y29kZT5qYXZheC54bWwud3MuRW5kcG9pbnRSZWZlcmVuY2U8L2NvZGU+Lg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXhpczIoRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIsIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUikNCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGpheHdzRVBSLndyaXRlVG8obmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7DQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7DQotICAgICAgICBPTUVsZW1lbnQgZXByRWxlbWVudCA9IChPTUVsZW1lbnQpIFhNTFV0aWxzLnRvT00oYmFpcyk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oYXhpczJFUFIsIGVwckVsZW1lbnQpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIDxUPg0KLSAgICAgKiBAcGFyYW0gY2xhenoNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZT4gU3RyaW5nIGdldEFkZHJlc3NpbmdOYW1lc3BhY2UoQ2xhc3M8VD4gY2xhenopIHsNCi0gICAgICAgIEpBWFdTRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5IGZhY3RvcnkgPSAoSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKGNsYXp6KTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYWRkcmVzcw0KLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUNCi0gICAgICogQHBhcmFtIHBvcnROYW1lDQotICAgICAqIEBwYXJhbSB3c2RsRG9jdW1lbnRMb2NhdGlvbg0KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoU3RyaW5nIGFkZHJlc3MsIFFOYW1lIHNlcnZpY2VOYW1lLCBRTmFtZSBwb3J0TmFtZSwgU3RyaW5nIHdzZGxEb2N1bWVudExvY2F0aW9uLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkgew0KLSAgICAgICAgQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkgZmFjdG9yeSA9IChBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgd3NkbERvY3VtZW50TG9jYXRpb24sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBhZGRyZXNzDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZShTdHJpbmcgYWRkcmVzcykgew0KLSAgICAgICAgQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkgZmFjdG9yeSA9IChBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICANCi0gICAgCXJldHVybiBmYWN0b3J5LmNyZWF0ZUVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzMkVQUg0KLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUGFyYW1ldGVycw0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFJlZmVyZW5jZVBhcmFtZXRlcnMoRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIsIEVsZW1lbnQuLi5yZWZlcmVuY2VQYXJhbWV0ZXJzKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IgKEVsZW1lbnQgZWxlbWVudCA6IHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsNCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IFhNTFV0aWxzLnRvT00oZWxlbWVudCk7DQotICAgICAgICAgICAgICAgIGF4aXMyRVBSLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihvbUVsZW1lbnQpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgIH0gICAgCQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzMkVQUg0KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGENCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZXRhZGF0YShFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiwgRWxlbWVudC4uLm1ldGFkYXRhKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7DQotICAgICAgICAgICAgZm9yIChFbGVtZW50IGVsZW1lbnQgOiBtZXRhZGF0YSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gWE1MVXRpbHMudG9PTShlbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgYXhpczJFUFIuYWRkTWV0YURhdGEob21FbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXMyRVBSDQotICAgICAqIEBwYXJhbSBwb3J0VHlwZQ0KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEludGVyZmFjZShFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiwgUU5hbWUgcG9ydFR5cGUsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCWlmIChwb3J0VHlwZSAhPSBudWxsKSB7DQotICAgIAkJSW50ZXJmYWNlTmFtZSBpbnRlcmZhY2VOYW1lID0gbmV3IEludGVyZmFjZU5hbWUocG9ydFR5cGUpOw0KLSAgICAJCUVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnNldEludGVyZmFjZU5hbWVNZXRhZGF0YShvbUZhY3RvcnksIGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBpbnRlcmZhY2VOYW1lKTsNCi0gICAgCX0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpczJFUFINCi0gICAgICogQHBhcmFtIHNlcnZpY2UNCi0gICAgICogQHBhcmFtIHBvcnQNCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTZXJ2aWNlKEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSLCBRTmFtZSBzZXJ2aWNlLCBRTmFtZSBwb3J0LCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkNCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIHBvcnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFNlcnZpY2VOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFNlcnZpY2VOYW1lKHNlcnZpY2UsIHBvcnQuZ2V0TG9jYWxQYXJ0KCkpOw0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnNldFNlcnZpY2VOYW1lTWV0YWRhdGEob21GYWN0b3J5LCBheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSwgc2VydmljZU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzMkVQUg0KLSAgICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlDQotICAgICAqIEBwYXJhbSB3c2RsRG9jdW1lbnRMb2NhdGlvbg0KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZExvY2F0aW9uKEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24sIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKQ0KLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiB3c2RsRG9jdW1lbnRMb2NhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgV1NETExvY2F0aW9uIHdzZGxMb2NhdGlvbiA9IG5ldyBXU0RMTG9jYXRpb24odGFyZ2V0TmFtZXNwYWNlLCB3c2RsRG9jdW1lbnRMb2NhdGlvbik7DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuc2V0V1NETExvY2F0aW9uTWV0YWRhdGEob21GYWN0b3J5LCBheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSwgd3NkbExvY2F0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvUmVmZXJlbmNlUGFyYW1ldGVyTGlzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL1JlZmVyZW5jZVBhcmFtZXRlckxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5MzNlMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvUmVmZXJlbmNlUGFyYW1ldGVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIGEgcmVhZC1vbmx5IGxpc3Qgb2YgcmVmZXJlbmNlIHBhcmFtZXRlcnMNCi0gKiB2aWEgdGhlIEpBWC1XUyAyLjEgYXBpLg0KLSAqDQotICogQHNlZSBNZXNzYWdlQ29udGV4dCNSRUZFUkVOQ0VfUEFSQU1FVEVSUw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VQYXJhbWV0ZXJMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0PEVsZW1lbnQ+IHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlZmVyZW5jZVBhcmFtZXRlckxpc3QuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbGVtZW50W10gRU1QVFlfQVJSQVkgPSBuZXcgRWxlbWVudFswXTsNCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRTsNCi0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyIGhlYWRlcjsNCi0gICAgcHJpdmF0ZSBFbGVtZW50W10gcmVmZXJlbmNlUGFyYW1ldGVyczsNCi0NCi0gICAgcHVibGljIFJlZmVyZW5jZVBhcmFtZXRlckxpc3QoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgUmVmZXJlbmNlUGFyYW1ldGVyTGlzdChTT0FQSGVhZGVyIGhlYWRlcikgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXQoaW50IGluZGV4KSB7DQotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyA9PSBudWxsKQ0KLSAgICAgICAgICAgIGluaXRpYWxpemUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZVBhcmFtZXRlcnNbaW5kZXhdOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7DQotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyA9PSBudWxsKQ0KLSAgICAgICAgICAgIGluaXRpYWxpemUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZVBhcmFtZXRlcnMubGVuZ3RoOw0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsNCi0gICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoImluaXRpYWxpemU6IE5vIFNPQVAgaGVhZGVyIHRvIGNoZWNrIGZvciByZWZlcmVuY2UgcGFyYW1ldGVycy4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmVmZXJlbmNlUGFyYW1ldGVycyA9IEVNUFRZX0FSUkFZOyAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiaW5pdGlhbGl6ZTogQ2hlY2tpbmcgU09BUCBoZWFkZXIgZm9yIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnQ+KCk7DQotICAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsNCi0gICAgICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgaGVhZGVyRWxlbWVudCA9IChPTUVsZW1lbnQpaGVhZGVyQmxvY2tzLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgaXNSZWZQYXJhbUF0dHIgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShuYW1lc3BhY2UsICJJc1JlZmVyZW5jZVBhcmFtZXRlciIpKTsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImluaXRpYWxpemU6IENoZWNraW5nIGhlYWRlciBlbGVtZW50OiAiICsgaGVhZGVyRWxlbWVudC5nZXRRTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKGlzUmVmUGFyYW1BdHRyICE9IG51bGwgJiYgDQotICAgICAgICAgICAgICAgICAgICAoInRydWUiLmVxdWFscyhpc1JlZlBhcmFtQXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICIxIi5lcXVhbHMoaXNSZWZQYXJhbUF0dHIuZ2V0QXR0cmlidXRlVmFsdWUoKSkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFhNTFV0aWxzLnRvRE9NKGhlYWRlckVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGVsZW1lbnQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlZmVyZW5jZVBhcmFtZXRlckNvbnN0cnVjdGlvbkVyciIpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiaW5pdGlhbGl6ZTogSGVhZGVyOiAiICsgaGVhZGVyRWxlbWVudC5nZXRRTmFtZSgpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaGFzIElzUmVmZXJlbmNlUGFyYW1ldGVyIGF0dHJpYnV0ZS4gQWRkaW5nIHRvIHRvRVBSLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBsaXN0LnRvQXJyYXkoRU1QVFlfQVJSQVkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvQmluZGluZ0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvQmluZGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhMDhiYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL0JpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuQ2xpZW50Q29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuQ2xpZW50Q29uZmlndXJhdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQ2xhc3NlcyB0aGF0IHdvdWxkIG5vcm1hbGx5ICJpbXBsZW1lbnQgamF2YXgueG1sLndzLkJpbmRpbmciCi0gKiBzaG91bGQgZXh0ZW5kIHRoaXMgY2xhc3MgaW5zdGVhZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgQmluZGluZyB7Ci0gICAgLy8gYW4gdW5zb3J0ZWQgbGlzdCBvZiBoYW5kbGVycwotICAgIHByaXZhdGUgTGlzdDxIYW5kbGVyPiBoYW5kbGVyczsKLQotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M7Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGllbnRGcmFtZXdvcmsgZnJhbWV3b3JrID0gbmV3IENsaWVudEZyYW1ld29yaygpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBiaW5kaW5nSWQ7Ci0KLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gcm9sZXM7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WX05TID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9FTlZfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKLQotICAgIHB1YmxpYyBCaW5kaW5nSW1wbChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYykgewotICAgICAgICB0aGlzLmVuZHBvaW50RGVzYyA9IGVuZHBvaW50RGVzYzsKLSAgICAgICAgLy8gY2xpZW50Ci0gICAgICAgIHRoaXMuYmluZGluZ0lkID0gZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAgICBpZiAodGhpcy5iaW5kaW5nSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2VydmVyCi0gICAgICAgICAgICB0aGlzLmJpbmRpbmdJZCA9IGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTZXQ8U3RyaW5nPiBpZHMgPSBDbGllbnRDb25maWd1cmF0b3JSZWdpc3RyeS5nZXRJZHMoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoU3RyaW5nIGlkIDogaWRzKSB7Ci0gICAgICAgICAgICBDbGllbnRDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gQ2xpZW50Q29uZmlndXJhdG9yUmVnaXN0cnkuZ2V0Q29uZmlndXJhdG9yKGlkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRvci5zdXBwb3J0cyh0aGlzKSkKLSAgICAgICAgICAgICAgICBmcmFtZXdvcmsuYWRkQ29uZmlndXJhdG9yKGlkLCBjb25maWd1cmF0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8SGFuZGxlcj4gZ2V0SGFuZGxlckNoYWluKCkgewotICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbm9uLW51bGwgc28gY2xpZW50IGFwcHMgY2FuIG1hbmlwdWxhdGUKLSAgICAgICAgICAgIGhhbmRsZXJzID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEhhbmRsZXJSZXNvbHZlckltcGwoZW5kcG9pbnREZXNjLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpKS5nZXRIYW5kbGVyQ2hhaW4oZW5kcG9pbnREZXNjLmdldFBvcnRJbmZvKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYW5kbGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW4oTGlzdDxIYW5kbGVyPiBsaXN0KSB7Ci0gICAgICAgIC8vIGhhbmRsZXJzIGNhbm5vdCBiZSBudWxsIHNvIGEgY2xpZW50IGFwcCBjYW4gcmVxdWVzdCBhbmQgbWFuaXB1bGF0ZSBpdAotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsgLy8gbm9uLW51bGwsIGJ1dCByYXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVycyA9IGxpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgSkFYLVdTIDIuMQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lEKCkgewotICAgICAgICByZXR1cm4gdGhpcy5iaW5kaW5nSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgZnJhbWV3b3JrLmNvbmZpZ3VyZShtZXNzYWdlQ29udGV4dCwgcHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlRmVhdHVyZSBnZXRGZWF0dXJlKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gZnJhbWV3b3JrLmdldEZlYXR1cmUoaWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZlYXR1cmVzKFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKFdlYlNlcnZpY2VGZWF0dXJlIGZlYXR1cmUgOiBmZWF0dXJlcykgewotICAgICAgICAgICAgICAgIGZyYW1ld29yay5hZGRGZWF0dXJlKGZlYXR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3NpbmdOYW1lc3BhY2UoU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpIHsKLSAgICAgICAgaWYgKGFkZHJlc3NpbmdOYW1lc3BhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJpbmRpbmdNZXRob2ROb3RTdXBwb3J0ZWQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRBZGRyZXNzaW5nTmFtZXNwYWNlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSWQpKTsgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKEVuZHBvaW50UmVmZXJlbmNlIGVwcikgewotICAgICAgICBpZiAoZXByICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJiaW5kaW5nTWV0aG9kTm90U3VwcG9ydGVkIiwgInNldEF4aXMyRW5kcG9pbnRSZWZlcmVuY2UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdJZCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzaW5nTmFtZXNwYWNlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJpbmRpbmdNZXRob2ROb3RTdXBwb3J0ZWQiLCAiZ2V0QWRkcmVzc2luZ05hbWVzcGFjZSIsIGJpbmRpbmdJZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJpbmRpbmdNZXRob2ROb3RTdXBwb3J0ZWQiLCAiZ2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZSIsIGJpbmRpbmdJZCkpOyAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL0JpbmRpbmdVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9CaW5kaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3ZjI4My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL0JpbmRpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1V0aWxzIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBCaW5kaW5nIGluc3RhbmNlIGJhc2VkIG9uIGFuIEVuZHBvaW50RGVzY3JpcHRpb24uCi0gICAgICogQHBhcmFtIGVkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQmluZGluZyBjcmVhdGVCaW5kaW5nKEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgaWYgKGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRW5kcG9pbnREZXNjcmlwdGlvbiBpcyBudWxsIik7ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSAKLSAgICAgICAgICAgIChlZC5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5pc1NlcnZlclNpZGUoKSkgPyAKLSAgICAgICAgICAgICAgICAgICAgZWQuZ2V0QmluZGluZ1R5cGUoKQotICAgICAgICAgICAgICAgICAgICA6IGVkLmdldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKEJpbmRpbmdVdGlscy5pc1NPQVBCaW5kaW5nKGJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQQmluZGluZyhlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoQmluZGluZ1V0aWxzLmlzSFRUUEJpbmRpbmcoYmluZGluZ1R5cGUpKSB7IAotICAgICAgICAgICAgcmV0dXJuIG5ldyBIVFRQQmluZGluZyhlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaWd1cmUgaXQgb3V0LCBsZXQncyBkZWZhdWx0IHRvIAotICAgICAgICAgICAgLy8gYSBTT0FQQmluZGluZwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQQmluZGluZyhlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU09BUEJpbmRpbmcoU3RyaW5nIHVybCkgewotICAgICAgICByZXR1cm4gKGlzU09BUDExQmluZGluZyh1cmwpIHx8IGlzU09BUDEyQmluZGluZyh1cmwpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU09BUDExQmluZGluZyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiAodXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfTVRPTV9CSU5ESU5HKSAgKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTT0FQMTJCaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsICYmICh1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19NVE9NX0JJTkRJTkcpICApKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01UT01CaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgKHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19NVE9NX0JJTkRJTkcpICAgKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVFRQQmluZGluZyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiB1cmwuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9IVFRQQmluZGluZy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9IVFRQQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQ0MTU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2JpbmRpbmcvSFRUUEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5iaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBIVFRQQmluZGluZyBleHRlbmRzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcgewotCi0gICAgcHVibGljIEhUVFBCaW5kaW5nKEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgc3VwZXIoZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbihMaXN0PEhhbmRsZXI+IGxpc3QpIHsKLSAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChIYW5kbGVyIGhhbmRsZXIgOiBsaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBTT0FQSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiQ2hhaW4gY29udGFpbnMgaW5jb21wYXRpYmlsZSBoYW5kbGVyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLnNldEhhbmRsZXJDaGFpbihsaXN0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL1NPQVBCaW5kaW5nLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9iaW5kaW5nL1NPQVBCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTcxYmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYmluZGluZy9TT0FQQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5TQUFKRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8bGluaz5qYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzwvbGluaz4KLSAqIGludGVyZmFjZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiaW5kaW5nIGZvciBKQVgtV1MsIGFuZCB3aWxsIGV4aXN0IGZvciBhbGwKLSAqIERpc3BhdGNoIGFuZCBEeW5hbWljIFByb3h5IGluc3RhbmNlcyB1bmxlc3MgdGhlIFhNTC9IVFRQIEJpbmRpbmcgaXMKLSAqIGV4cGxpY2l0bHkgc3BlY2lmaWNpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZyBleHRlbmRzIEJpbmRpbmdJbXBsIGltcGxlbWVudHMgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcgewotICAgIHByaXZhdGUgYm9vbGVhbiBtdG9tRW5hYmxlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIGVwcjsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlOwotCi0gICAgcHVibGljIFNPQVBCaW5kaW5nKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjKSB7Ci0gICAgICAgIHN1cGVyKGVuZHBvaW50RGVzYyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyNnZXRNZXNzYWdlRmFjdG9yeSgpCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5IGdldE1lc3NhZ2VGYWN0b3J5KCkgewotICAgICAgICBTdHJpbmcgYmluZGluZ05hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU0FBSkZhY3RvcnkuY3JlYXRlTWVzc2FnZUZhY3RvcnkgdGFrZXMgYSBuYW1lc3BhY2UgU3RyaW5nIGFzIGEKLSAgICAgICAgICAgICAqIHBhcmFtOiAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIChTT0FQMS4xKQotICAgICAgICAgICAgICogImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIgKFNPQVAxLjIpCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFRoZSBiaW5kaW5nSWQgd2lsbCBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKLSAgICAgICAgICAgICAqICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cCIgKFNPQVAxLjEpCi0gICAgICAgICAgICAgKiAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIiAoU09BUDEuMikKLSAgICAgICAgICAgICAqLwotICAgICAgICAJCi0gICAgICAgICAgICBpZiAoQmluZGluZ1V0aWxzLmlzU09BUDEyQmluZGluZyhiaW5kaW5nSWQpKXsKLSAgICAgICAgICAgIAliaW5kaW5nTmFtZXNwYWNlID0gU09BUDEyX0VOVl9OUzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBjdXJyZW50bHkgZGVmYXVsdHMgdG8gU09BUDExLiBTaG91bGQgd2UgYmUgbW9yZSBzdHJpY2N0Ci0gICAgICAgICAgICAgICAgLy8gYWJvdXQgY2hlY2tpbmc/Ci0gICAgICAgICAgICAgICAgYmluZGluZ05hbWVzcGFjZSA9IFNPQVAxMV9FTlZfTlM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU0FBSkZhY3RvcnkuY3JlYXRlTWVzc2FnZUZhY3RvcnkoYmluZGluZ05hbWVzcGFjZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBsb2cgaXQgYW5kIHRoZW4gd2hhdD8KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV2ViU2VydmljZUV4Y2VwdGlvbiBjYWxsaW5nIFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJpbmRpbmdOYW1lc3BhY2UgKyAiXCIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBsb2cgaXQgYW5kIHRoZW4gd2hhdD8KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU09BUEV4Y2VwdGlvbiBjYWxsaW5nIFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJpbmRpbmdOYW1lc3BhY2UgKyAiXCIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZyNnZXRSb2xlcygpCi0gICAgICovCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJvbGVzKCkgewotICAgICAgICAvLyBkbyBub3QgYWxsb3cgbnVsbCByb2xlcywgcGVyIHRoZSBKQVgtV1MgQ1RTCi0gICAgICAgIGlmIChyb2xlcyA9PSBudWxsKQotICAgICAgICAgICAgcm9sZXMgPSBhZGREZWZhdWx0Um9sZXMobnVsbCk7Ci0gICAgICAgIHJldHVybiByb2xlczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI2dldFNPQVBGYWN0b3J5KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoKSB7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTQUFKRmFjdG9yeS5jcmVhdGVNZXNzYWdlRmFjdG9yeSB0YWtlcyBhIG5hbWVzcGFjZSBTdHJpbmcgYXMgYQotICAgICAgICAgICAgICogcGFyYW06ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgKFNPQVAxLjEpCi0gICAgICAgICAgICAgKiAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIiAoU09BUDEuMikKLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogVGhlIGJpbmRpbmdJZCB3aWxsIGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgotICAgICAgICAgICAgICogImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwIiAoU09BUDEuMSkKLSAgICAgICAgICAgICAqICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iIChTT0FQMS4yKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoYmluZGluZ0lkLmVxdWFsc0lnbm9yZUNhc2UoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdJZC5lcXVhbHNJZ25vcmVDYXNlKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdOYW1lc3BhY2UgPSBTT0FQMTJfRU5WX05TOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIGN1cnJlbnRseSBkZWZhdWx0cyB0byBTT0FQMTEuIFNob3VsZCB3ZSBiZSBtb3JlIHN0cmljY3QKLSAgICAgICAgICAgICAgICAvLyBhYm91dCBjaGVja2luZz8KLSAgICAgICAgICAgICAgICBiaW5kaW5nTmFtZXNwYWNlID0gU09BUDExX0VOVl9OUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTQUFKRmFjdG9yeS5jcmVhdGVTT0FQRmFjdG9yeShiaW5kaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGxvZyBpdCBhbmQgdGhlbiB3aGF0PwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXZWJTZXJ2aWNlRXhjZXB0aW9uIGNhbGxpbmcgU0FBSkZhY3RvcnkuY3JlYXRlU09BUEZhY3RvcnkoXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZ05hbWVzcGFjZSArICJcIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGxvZyBpdCBhbmQgdGhlbiB3aGF0PwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTT0FQRXhjZXB0aW9uIGNhbGxpbmcgU0FBSkZhY3RvcnkuY3JlYXRlU09BUEZhY3RvcnkoXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZ05hbWVzcGFjZSArICJcIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI2lzTVRPTUVuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtdG9tRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI3NldE1UT01FbmFibGVkKGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TVRPTUVuYWJsZWQoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIG10b21FbmFibGVkID0gZmxhZzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nI3NldFJvbGVzKGphdmEudXRpbC5TZXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZXMoU2V0PFN0cmluZz4gc2V0KSB7Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSB2YWx1ZXMgaW4gdGhlIHNldAotICAgICAgICBpZiAoc2V0ICE9IG51bGwgJiYgIXNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBmb3Igc2V0dGluZyBhIHJvbGUgb2YgIm5vbmUiCi0gICAgICAgICAgICAvLyBQZXIgSkFYV1MgMi4wIFNlYyAxMC4xLjEuMSBTT0FQIFJvbGVzLCBwYWdlIDExNjoKLSAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnMoU09BUENvbnN0YW50cy5VUklfU09BUF8xXzJfUk9MRV9OT05FKSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicm9sZVZhbGlkYXRpb0VyciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcm9sZXMgPSBhZGREZWZhdWx0Um9sZXMoc2V0KTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBhZGREZWZhdWx0Um9sZXMoU2V0PFN0cmluZz4gc2V0KSB7Ci0gICAgICAgIAotICAgICAgICBTZXQ8U3RyaW5nPiByZXR1cm5TZXQgPSBzZXQ7Ci0gICAgICAgIGlmIChyZXR1cm5TZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHRzIGZvciB0aGUgYmluZGluZyB0eXBlIGFyZSBpbiB0aGUgc2V0Ci0gICAgICAgIC8vIGFuZCBhZGQgdGhlbSBpZiBub3QuICBOb3RlIHRoYXQgZm9yIGJvdGggU09BUDExIGFuZCBTT0FQMTIsIHRoZSByb2xlIG9mIHVsdGltYXRlCi0gICAgICAgIC8vIHJlY2lldmVyIGNhbiBiZSBpbmRpY2F0ZWQgYnkgdGhlIG9taXNzaW9uIG9mIHRoZSByb2xlIGF0dHJpYnV0ZS4KLSAgICAgICAgLy8gUkVWSUVXOiBUaGlzIGlzIFdST05HIGJlY2F1c2UgdGhlIGJpbmRpbmdJRCBmcm9tIHRoZSBXU0RMIGlzIG5vdCB0aGUgc2FtZSB2YWx1ZSBhcwotICAgICAgICAvLyAgIFNPQVBCaW5kaW5nIGFubm90YXRpb24gY29uc3RhbnRzLiAgVGhlcmUgYXJlIG90aGVyIHBsYWNlcyBpbiB0aGUgY29kZSB0aGF0IGhhdmUKLSAgICAgICAgLy8gICB0aGlzIHNhbWUgaXNzdWUgSSBhbSBzdXJlLgotICAgICAgICBpZiAoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nSWQpCi0gICAgICAgICAgICAgICAgfHwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdJZCkpIHsKLSAgICAgICAgICAgIGlmIChyZXR1cm5TZXQuaXNFbXB0eSgpIHx8ICFyZXR1cm5TZXQuY29udGFpbnMoU09BUENvbnN0YW50cy5VUklfU09BUF8xXzJfUk9MRV9ORVhUKSkgewotICAgICAgICAgICAgICAgIHJldHVyblNldC5hZGQoU09BUENvbnN0YW50cy5VUklfU09BUF8xXzJfUk9MRV9ORVhUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHJldHVyblNldC5pc0VtcHR5KCkgfHwgIXJldHVyblNldC5jb250YWlucyhTT0FQQ29uc3RhbnRzLlVSSV9TT0FQX0FDVE9SX05FWFQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU2V0LmFkZChTT0FQQ29uc3RhbnRzLlVSSV9TT0FQX0FDVE9SX05FWFQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5TZXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzaW5nTmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzc2luZ05hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIGVwcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzaW5nTmFtZXNwYWNlKFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMuYWRkcmVzc2luZ05hbWVzcGFjZSA9IGFkZHJlc3NpbmdOYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZShFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHsKLSAgICAgICAgdGhpcy5lcHIgPSBlcHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0NsaWVudFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvQ2xpZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzNDU3ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvQ2xpZW50VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIENsaWVudFV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbGllbnRVdGlscy5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoYXQgdGhlIFNPQVBBY3Rpb24gdmFsdWUgc2hvdWxkIGJlIGZvciBhIGdpdmVuIE1lc3NhZ2VDb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGN0eCAtIFRoZSBNZXNzYWdlQ29udGV4dCBmb3IgdGhlIHJlcXVlc3QKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHdpdGggdGhlIGNhbGN1bGF0ZWQgU09BUEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRTT0FQQWN0aW9uKE1lc3NhZ2VDb250ZXh0IGN0eCkgewotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCA9IGN0eC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBCb29sZWFuIHVzZVNvYXBBY3Rpb24gPQotICAgICAgICAgICAgICAgIChCb29sZWFuKWN0eC5nZXRQcm9wZXJ0eShCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFkpOwotICAgICAgICBpZiAodXNlU29hcEFjdGlvbiAhPSBudWxsICYmIHVzZVNvYXBBY3Rpb24uYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIC8vIElmIFNPQVBBY3Rpb24gdXNlIGhhc24ndCBiZWVuIGRpc2FibGVkIGJ5IHRoZSBjbGllbnQsIHRoZW4gZmlyc3QKLSAgICAgICAgICAgIC8vIGxvb2sgaW4gdGhlIGNvbnRleHQgcHJvcGVydGllcy4KLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKWN0eC5nZXRQcm9wZXJ0eShCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFkpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBzb2FwIGFjdGlvbiBmcm9tIEpBWC1XUyByZXF1ZXN0IGNvbnRleHQuICBBY3Rpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nIGluIHRoZSBjb250ZXh0IHByb3BzLCB0aGVuIHdlIG5lZWQgdG8gCi0gICAgICAgICAgICAvLyBjaGVjayB0aGUgT3BlcmF0aW9uRGVzY3JpdGlvbiB0byBzZWUgaWYgb25lIHdhcyBjb25maWd1cmVkIGluIHRoZSBXU0RMLgotICAgICAgICAgICAgaWYgKG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBvcC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgc29hcCBhY3Rpb24gZnJvbSBvcGVyYXRpb24gZGVzY3JpcHRpb24uICBBY3Rpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5ub3Qgc2V0IHRoZSBzb2FwIGFjdGlvbi4gIE5vIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiB3YXMgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTb2FwIGFjdGlvbiB1c2FnZSB3YXMgZGlzYWJsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3BlcnR5TWlncmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm9wZXJ0eU1pZ3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDNjYzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3BlcnR5TWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLk1FUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkubWlncmF0b3IuQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBQcm9wZXJ0eU1pZ3JhdG9yIGltcGxlbWVudHMgdGhlIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yIGluIG9yZGVyIHRvIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeQotICogbWFuaXB1bGF0aW9ucyBvZiBwcm9wZXJ0aWVzIGR1cmluZyBhIHJlcXVlc3Qgb3IgcmVzcG9uc2UgZmxvdy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5TWlncmF0b3IgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciwgU2VyaWFsaXphYmxlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvcGVydHlNaWdyYXRvci5jbGFzcyk7Ci0gICAgcHVibGljIHZvaWQgbWlncmF0ZVByb3BlcnRpZXNGcm9tTWVzc2FnZUNvbnRleHQoTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydGluZyBtaWdyYXRlUHJvcGVydHlGcm9tTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgfQotICAgICAgICBNRVBDb250ZXh0IG1lcENvbnRleHQgPSBtZXNzYWdlQ29udGV4dC5nZXRNRVBDb250ZXh0KCk7Ci0gICAgICAgIGlmIChtZXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMgZnJvbSBNRVBDb250ZXh0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1c2VyQ29udGV4dC5wdXRBbGwobWVwQ29udGV4dC5nZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIm1pZ3JhdGVQcm9wZXJ0eUZyb21NZXNzYWdlQ29udGV4dCBDb21wbGV0ZSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWlncmF0ZVByb3BlcnRpZXNUb01lc3NhZ2VDb250ZXh0KE1hcDxTdHJpbmcsIE9iamVjdD4gdXNlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0KLSAgICAgICAgLy8gQXZvaWQgdXNpbmcgcHV0QWxsIGFzIHRoaXMgY2F1c2VzIGNvcGllcyBvZiB0aGUgcHJvcGVyeSBzZXQKLSAgICAgICAgaWYgKHVzZXJDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCBub3QgdXNlIGl0ZXJhdG9yIGhlcmUgYmVjYXVzZSB0aGlzIG1hcCBtYXkgYmUgbW9kaWZpZWQKLSAgICAgICAgICAgIC8vIG9uIGRpZmZlcmVudCB0aHJlYWRzIGJ5IHRoZSB1c2VyIG9yIG90aGVyIEpBWC1XUyBjb2RlCi0gICAgICAgICAgICBTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1t1c2VyQ29udGV4dC5rZXlTZXQoKS5zaXplKCldOwotICAgICAgICAgICAga2V5cyA9IHVzZXJDb250ZXh0LmtleVNldCgpLnRvQXJyYXkoa2V5cyk7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0ga2V5c1tpXTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSB1c2VyQ29udGV4dC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbXRvbSBzdGF0ZSBpbiB0aGUgdXNlciBjb250ZXh0LCB0aGUgbWVzc2FnZSBjb250ZXh0LCAKLSAgICAgICAgICAgICAgICAvLyB0aGUgTUVQIGNvbnRleHQgYXJlIHRoZSBzYW1lLgotICAgICAgICAgICAgICAgIGlmKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NKSl7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWVzc2FnZUNvbnRleHQuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0TUVQQ29udGV4dCgpLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm9wZXJ0eVZhbGlkYXRvci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3BlcnR5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmYyZmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Byb3BlcnR5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsaWRhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzcz4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLlVTRVJOQU1FX1BST1BFUlRZLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSwgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSwgQm9vbGVhbi5jbGFzcyk7Ci0gICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCBCb29sZWFuLmNsYXNzKTsKLSAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksIFN0cmluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdmFsaWQgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFuZCB0aGUgdHlwZSB0aGF0Ci0gICAgICogaXMgZXhwZWN0ZWQgYnkgSkFYLVdTLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BOYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgcHJvcE5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBDbGFzcyBleHBlY3RlZFR5cGUgPSBtYXAuZ2V0KHByb3BOYW1lKTsKLSAgICAgICAgaWYgKGV4cGVjdGVkVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWRUeXBlLmVxdWFscyh2YWx1ZS5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEV4cGVjdGVkVmFsdWUoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Bc3luY1Jlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvYXN5bmMvQXN5bmNSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThiZmNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Bc3luY1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5BdHRhY2htZW50c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJDaGFpblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuU09BUEhlYWRlcnNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5UcmFuc3BvcnRIZWFkZXJzQWRhcHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkubWlncmF0b3IuQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLS8qKgotICogVGhlIEFzeW5jUmVzcG9uc2UgY2xhc3MgaXMgdXNlZCB0byBjb2xsZWN0IHRoZSByZXNwb25zZSBpbmZvcm1hdGlvbiBmcm9tIEF4aXMyIGFuZCBkZWxpdmVyIGl0IHRvCi0gKiBhIEpBWC1XUyBjbGllbnQuICBBc3luY1Jlc3BvbnNlIGltcGxlbWVudHMgdGhlIDxsaW5rPmphdmF4LnhtbC53cy5SZXNwb25zZTwvbGluaz4gQVBJIHRoYXQgaXMKLSAqIGRlZmluZWQgaW4gdGhlIEpBWC1XUyAyLjAgc3BlY2lmaWNhdGlvbi4gIFRoZSA8Y29kZT5SZXNwb25zZTwvY29kZT4gb2JqZWN0IHdpbGwgY29udGFpbiBib3RoIHRoZQotICogb2JqZWN0IHRoYXQgaXMgcmV0dXJuZWQgYXMgdGhlIHJlc3BvbnNlIGFsb25nIHdpdGggYSA8bGluaz5qYXZhLnV0aWwuTWFwPC9saW5rPiB3aXRoIHRoZSBjb250ZXh0Ci0gKiBpbmZvcm1hdGlvbiBvZiB0aGUgcmVzcG9uc2UuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Jlc3BvbnNlIGltcGxlbWVudHMgUmVzcG9uc2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzeW5jUmVzcG9uc2UuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhbmNlbGxlZDsKLQotICAgIHByaXZhdGUgVGhyb3dhYmxlIGZhdWx0OwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgZmF1bHRNZXNzYWdlQ29udGV4dDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlOwotCi0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3BvbnNlQ29udGV4dDsKLQotICAgIC8vIENvdW50RG93bkxhdGNoIGlzIHVzZWQgdG8gdHJhY2sgd2hldGhlciB3ZSd2ZSByZWNlaXZlZCBhbmQKLSAgICAvLyBwcm9jZXNzZWQgdGhlIGFzeW5jIHJlc3BvbnNlLiAgRm9yIGV4YW1wbGUsIHRoZSBjbGllbnQgYXBwCi0gICAgLy8gY291bGQgYmUgcG9sbGluZyBvbiAzMCBzZWNvbmQgaW50ZXJ2YWxzLCBhbmQgd2UgZG9uJ3QgcmVjZWl2ZQotICAgIC8vIHRoZSBhc3luYyByZXNwb25zZSB1bnRpbCB0aGUgMToxNSBtYXJrLiAgSW4gdGhhdCBjYXNlLCB0aGUKLSAgICAvLyBmaXJzdCBmZXcgcG9sbHMgY2FsbGluZyB0aGUgLmdldCgpIHdvdWxkIGhpdCB0aGUgbGF0Y2guYXdhaXQoKQotICAgIC8vIHdoaWNoIGJsb2NrcyB0aGUgdGhyZWFkIGlmIHRoZSBsYXRjaCBjb3VudCA+IDAKLSAgICBwcml2YXRlIENvdW50RG93bkxhdGNoIGxhdGNoOwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWNoZVZhbGlkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBPYmplY3QgY2FjaGVkT2JqZWN0ID0gbnVsbDsKLSAgICAKLSAgICAvLyBUaGUgcmVzcG9uc2UgYnVzaW5lc3Mgb2JqZWN0IHRvIGJlIHJldHVybmVkCi0gICAgcHJpdmF0ZSBPYmplY3QgcmVzcG9uc2VPYmplY3QgPSBudWxsOwotICAgIAotICAgIC8vIFRoZSBleGNlcHRpb24gdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGV2ZW50IG9mIGEgZmF1bHQgb3IgZmFpbHVyZSBpbiAKLSAgICAvLyBwcm9jZXNzaW5nIHRoZSByZXNwb25zZSBjb250ZW50LgotICAgIHByaXZhdGUgRXhlY3V0aW9uRXhjZXB0aW9uIHNhdmVkRXhjZXB0aW9uID0gbnVsbDsKLSAgICAKLSAgICBwcm90ZWN0ZWQgQXN5bmNSZXNwb25zZShFbmRwb2ludERlc2NyaXB0aW9uIGVkKSB7Ci0gICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24gPSBlZDsKLSAgICAgICAgbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25FcnJvcihUaHJvd2FibGUgZmx0LCBNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dENMID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBvbkVycm9yKGZsdCwgbWMpOwotICAgICAgICBjaGVja0NsYXNzTG9hZGVyKGNsLCBjb250ZXh0Q0wpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkVycm9yKFRocm93YWJsZSBmbHQsIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q3R4KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luY1Jlc3BvbnNlIHJlY2VpdmVkIGEgZmF1bHQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdCA9IGZsdDsKLSAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dCA9IGZhdWx0Q3R4OwotICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldEVuZHBvaW50RGVzY3JpcHRpb24oZW5kcG9pbnREZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgLy8gUHJvYmFibHkgYSBnb29kIGlkZWEgdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGUKLSAgICAgICAgY2FjaGVWYWxpZCA9IGZhbHNlOwotICAgICAgICBjYWNoZWRPYmplY3QgPSBudWxsOwotCi0gICAgICAgIFRocm93YWJsZSB0ID0gcHJvY2Vzc0ZhdWx0UmVzcG9uc2UoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEpBWFdTIDQuMy4zIGNvbmZvcm1hbmNlIGJ1bGxldCBzYXlzIHRvIHRocm93IGFuIEV4ZWN1dGlvbkV4Y2VwdGlvbiBmcm9tIGhlcmUKLSAgICAgICAgc2F2ZWRFeGNlcHRpb24gPSBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKHQpOwotICAgICAgICAgCi0gICAgICAgIC8vIENvdW50ZG93biBzbyB0aGF0IHRoZSBGdXR1cmUgb2JqZWN0IHdpbGwga25vdyB0aGF0IHByb2Nlc2luZyBpcyBjb21wbGV0ZS4KLSAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTmV3IGxhdGNoIGNvdW50ID0gWyIgKyBsYXRjaC5nZXRDb3VudCgpICsgIl0iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBmb3IgYSB2YWxpZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB1bm1hcnNoYWxsaW5nIGNsYXNzbG9hZGVyIGFuZAotICAgICAqIEFwcGxpY2F0aW9uJ3MgY3VycmVudCBjb250ZXh0IGNsYXNzbG9hZGVyCi0gICAgICogQHBhcmFtIGNsCi0gICAgICogQHBhcmFtIGNvbnRleHRDTAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0NsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGNsLCBmaW5hbCBDbGFzc0xvYWRlciBjb250ZXh0Q0wpIHsKLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGNsYXNzbG9hZGVyIChjbCkgdXNlZCBmb3IgdW5tYXJzaGFsbGluZyBpcyB0aGUgc2FtZQotICAgICAgICAvLyBvciBhIHBhcmVudCBvZiB0aGUgY3VycmVudCBjb250ZXh0IGNsYXNzbG9hZGVyLiAgT3RoZXJ3aXNlIAotICAgICAgICAvLyBDbGFzc0Nhc3RFeGNlcHRpb25zIGNhbiBvY2N1cgotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luY1Jlc3BvbnNlIENsYXNzTG9hZGVyIGlzOiIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKGNsLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbC5lcXVhbHMoY29udGV4dENMKSkgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jUmVzcG9uc2UgQ2xhc3NMb2FkZXIgbWF0Y2hlcyBDb250ZXh0IENsYXNzTG9hZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29udGV4dCBDbGFzc0xvYWRlciBpczoiKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoY29udGV4dENMLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gZ2V0UGFyZW50Q2xhc3NMb2FkZXIoY29udGV4dENMKTsKLSAgICAgICAgICAgIHdoaWxlKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudC5lcXVhbHMoY2wpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luY1Jlc3BvbnNlIENsYXNzTG9hZGVyIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBDb250ZXh0IENsYXNzTG9hZGVyIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcmVudCA9IGdldFBhcmVudENsYXNzTG9hZGVyKHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0aHJlYWRDbHNMb2FkZXJFcnIiLAotICAgICAgICAgICAgICAgICAgIGNvbnRleHRDTC5nZXRDbGFzcygpLnRvU3RyaW5nKCksIGNsLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBDbGFzc0xvYWRlciBnZXRQYXJlbnRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9uQ29tcGxldGUoTWVzc2FnZUNvbnRleHQgbWMsIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNvbnRleHRDTCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgb25Db21wbGV0ZShtYyk7Ci0gICAgICAgIGNoZWNrQ2xhc3NMb2FkZXIoY2wsIGNvbnRleHRDTCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25Db21wbGV0ZShNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXN5bmNSZXNwb25zZSByZWNlaXZlZCBhIE1lc3NhZ2VDb250ZXh0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQSBuZXcgbWVzc2FnZSBjb250ZXh0IGludmFsaWRhdGVzIHRoZSBjYWNoZWQgb2JqZWN0IHJldHJpZXZlZAotICAgICAgICAvLyBkdXJpbmcgdGhlIGxhc3QgZ2V0KCkKLSAgICAgICAgaWYgKHJlc3BvbnNlICE9IG1jKSB7Ci0gICAgICAgICAgICBjYWNoZWRPYmplY3QgPSBudWxsOwotICAgICAgICAgICAgY2FjaGVWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzcG9uc2UgPSBtYzsKLSAgICAgICAgcmVzcG9uc2Uuc2V0RW5kcG9pbnREZXNjcmlwdGlvbihlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGZvciBjYWNoZWQgYXR0YWNobWVudCBmaWxlKHMpIGlmIGF0dGFjaG1lbnRzIGV4aXN0LiAKLSAgICAgICAgaWYgKHJlc3BvbnNlLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldEF0dGFjaG1lbnRNYXAoKSAhPSBudWxsKXsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRVdGlscy5maW5kQ2FjaGVkQXR0YWNobWVudChyZXNwb25zZS5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRBdHRhY2htZW50TWFwKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBQcm9jZXNzIHRoZSByZXNwb25zZSBhcyBzb29uIGFzIGl0IGlzIGF2YWlsYWJsZS4gIFRoaXMgbWVhbnMgbWFraW5nIHN1cmUgdGhhdAotICAgICAgICAvLyBubyBjb250ZW50IGlzIGxlZnQgdW5yZWFkIGluIHRoZSByZXNwb25zZSBzdHJlYW0uICBMZWF2aW5nIGNvbnRlbnQgdGhlcmUgY291bGQKLSAgICAgICAgLy8gcmVzdWx0IGluIGFuIGVycm9yIGlmIHRoZSBydW50aW1lIGlzIGdyZWVkeSBhYm91dCBjbGVhbmluZyB1cC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3BvbnNlT2JqZWN0ID0gcHJvY2Vzc1Jlc3BvbnNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzYXZlZEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlc3BvbnNlOiAiICsgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ291bnRkb3duIHNvIHRoYXQgdGhlIEZ1dHVyZSBvYmplY3Qgd2lsbCBrbm93IHRoYXQgcHJvY2VzaW5nIGlzIGNvbXBsZXRlLgotICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk5ldyBsYXRjaCBjb3VudCA9IFsiICsgbGF0Y2guZ2V0Q291bnQoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBqYXZheC54bWwud3MuUmVzcG9uc2UgQVBJcwotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKGJvb2xlYW4gbWF5SW50ZXJydXB0SWZSdW5uaW5nKSB7Ci0gICAgICAgIC8vIFRoZSB0YXNrIGNhbm5vdCBiZSBjYW5jZWxsZWQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWQKLSAgICAgICAgLy8gYmVmb3JlIG9yIGlmIGl0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZC4KLSAgICAgICAgaWYgKGNhbmNlbGxlZCB8fCBsYXRjaC5nZXRDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FuY2VsbGF0aW9uIGF0dGVtcHQgZmFpbGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGNhbmNlbGxlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNhbmNlbGxlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENhbmNlbGxhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJnZXRFcnIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXYWl0IGZvciB0aGUgcmVzcG9uc2UgdG8gY29tZSBiYWNrCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJXYWl0aW5nIGZvciBhc3luYyByZXNwb25zZSBkZWxpdmVyeS4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgbGF0Y2ggY291bnQgPiAwLCBpdCBtZWFucyB3ZSBoYXZlIG5vdCB5ZXQgcmVjZWl2ZWQKLSAgICAgICAgLy8gYW5kIHByb2Nlc3NlZCB0aGUgYXN5bmMgcmVzcG9uc2UsIGFuZCBtdXN0IGJsb2NrIHRoZQotICAgICAgICAvLyB0aHJlYWQuCi0gICAgICAgIGxhdGNoLmF3YWl0KCk7Ci0KLSAgICAgICAgaWYgKHNhdmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IHNhdmVkRXhjZXB0aW9uOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KQotICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotICAgICAgICBpZiAoY2FuY2VsbGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImdldEVyciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdhaXQgZm9yIHRoZSByZXNwb25zZSB0byBjb21lIGJhY2sKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIldhaXRpbmcgZm9yIGFzeW5jIHJlc3BvbnNlIGRlbGl2ZXJ5IHdpdGggdGltZSBvdXQuIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInRpbWVvdXQgPSAiICsgdGltZW91dCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInVuaXRzICAgPSAiICsgdW5pdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGxhdGNoLmF3YWl0IHdpbGwgb25seSBibG9jayBpZiBpdHMgY291bnQgaXMgPiAwCi0gICAgICAgIGxhdGNoLmF3YWl0KHRpbWVvdXQsIHVuaXQpOwotCi0gICAgICAgIGlmIChzYXZlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBzYXZlZEV4Y2VwdGlvbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIHN0aWxsIGhhc24ndCBiZWVuIHJldHVybmVkLCB0aGVuIHdlJ3ZlIHRpbWVkIG91dAotICAgICAgICAvLyBhbmQgbXVzdCB0aHJvdyBhIFRpbWVvdXRFeGNlcHRpb24KLSAgICAgICAgaWYgKGxhdGNoLmdldENvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJnZXRFcnIxIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotICAgICAgICByZXR1cm4gY2FuY2VsbGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChsYXRjaC5nZXRDb3VudCgpID09IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBwcm9jZXNzUmVzcG9uc2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAJCi0gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBmYXVsdCwgdGhlbiB3ZSBoYXZlIHRvIGhhdmUgYSBNZXNzYWdlQ29udGV4dCBmb3IgdGhlIHJlc3BvbnNlLgotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJvY2Vzc1Jlc3BFcnIiKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXZvaWQgYSByZXBhcnNlIG9mIHRoZSBtZXNzYWdlLiBJZiB3ZSBhbHJlYWR5IHJldHJpdmVkIHRoZSBvYmplY3QsIHJldHVybgotICAgICAgICAvLyBpdCBub3cuCi0gICAgICAgIGlmIChjYWNoZVZhbGlkKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybiBvYmplY3QgY2FjaGVkIGZyb20gbGFzdCBnZXQoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNhY2hlZE9iamVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgYWRhcHRlcnMgYW5kIGludm9rZSBpbmJvdW5kIGhhbmRsZXJzLgotICAgICAgICAgICAgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChyZXNwb25zZSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50c0FkYXB0ZXIuaW5zdGFsbChyZXNwb25zZSk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChyZXNwb25zZSk7Ci0gICAgICAgICAgICBIYW5kbGVySW52b2tlclV0aWxzLmludm9rZUluYm91bmRIYW5kbGVycyhyZXNwb25zZS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRJbnZvY2F0aW9uQ29udGV4dCgpLmdldEhhbmRsZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBJTVBPUlRBTlQ6IHRoaXMgaXMgdGhlIHJpZ2h0IGNhbGwgaGVyZSwgYnV0IGJld2FyZSB0aGF0IHRoZSAKLSAgICAgICAgICAgIC8vIG1lc3NhZ2Vjb250ZXh0IG1heSBiZSB0dXJuZWQgaW50byBhIGZhdWx0IGNvbnRleHQgd2l0aCBhIGZhdWx0IG1lc3NhZ2UuICAKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgZm9yIHRoaXMgYW5kLCBpZiBuZWNlc3NhcnksIG1ha2UgYW4gZXhjZXB0aW9uIGFuZCB0aHJvdyBpdC4KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5tYXJzaGFsbGluZyB0aGUgYXN5bmMgcmVzcG9uc2UgbWVzc2FnZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRG8gdGhlIHJlYWwgd29yayB0byB1bm1hcnNoYWxsIHRoZSByZXNwb25zZS4KLSAgICAgICAgICAgIG9iaiA9IGdldFJlc3BvbnNlVmFsdWVPYmplY3QocmVzcG9uc2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgJiYgb2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVubWFyc2hhbGxlZCByZXNwb25zZSBvYmplY3Qgb2YgdHlwZTogIiArIG9iai5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIG9iamVjdCBpbiBjYXNlIGl0IGlzIHJlcXVpcmVkIGFnYWluCi0gICAgICAgICAgICBjYWNoZVZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIGNhY2hlZE9iamVjdCA9IG9iajsKLQotICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgICAgIC8vIE1pZ3JhdGUgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgYmFjawotICAgICAgICAgICAgLy8gdG8gdGhlIGNsaWVudCByZXNwb25zZSBjb250ZXh0IGJhZy4KLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uRnJvbU1lc3NhZ2VDb250ZXh0KENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRocm93YWJsZSBwcm9jZXNzRmF1bHRSZXNwb25zZSgpIHsKLSAgICAgICAgLy8gQSBmYXVsdE1lc3NhZ2VDb250ZXh0IG1lYW5zIHRoYXQgdGhlcmUgY291bGQgcG9zc2libHkgYmUgYSBTT0FQRmF1bHQKLSAgICAgICAgLy8gb24gdGhlIE1lc3NhZ2VDb250ZXh0IHRoYXQgd2UgbmVlZCB0byB1bm1hcnNoYWxsLgotICAgICAgICBpZiAoZmF1bHRNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgIAlUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKLSAgICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoZSBtZXNzYWdlIGNvdWxkIGJlIG51bGwuICBGb3IgZXhhbXBsZSwgaWYgd2UgZ2F2ZSB0aGUgcHJveHkgYSBiYWQgZW5kcG9pbnQgYWRkcmVzcy4KLSAgICAgICAgICAgIC8vIElmIGl0IGlzIHRoZSBjYXNlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgbnVsbCwgdGhlcmUncyBubyBzZW5zZSBydW5uaW5nIHRocm91Z2ggdGhlIGhhbmRsZXJzLgotICAgICAgICAgICAgaWYgKGZhdWx0TWVzc2FnZUNvbnRleHQuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgYWRhcHRlcnMgYXJlIGludGVudGlvbmFsbHkgTk9UIGluc3RhbGxlZCBoZXJlLiAgVGhleSBjYXVzZSB1bml0IHRlc3QgZmFpbHVyZXMKLSAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5pbnN0YWxsKGZhdWx0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIC8vIEF0dGFjaG1lbnRzQWRhcHRlci5pbnN0YWxsKGZhdWx0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgCXRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEludm9rZSBpbmJvdW5kIGhhbmRsZXJzLgotICAgICAgICAgICAgCSAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIAkgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgdGhlIEpBWC1XUyBoYW5kbGVyIGNoYWluIGZvciB0aGUgZmF1bHQgcmVzcG9uc2UuIik7Ci0gICAgICAgICAgICAJICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VJbmJvdW5kSGFuZGxlcnMoZmF1bHRNZXNzYWdlQ29udGV4dC5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIYW5kbGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVTUE9OU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAJICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgCSAgICAgICAgbG9nLmRlYnVnKCJBbiBlcnJvciBvY2N1cnJlZCAoIiArIHQuZ2V0Q2xhc3MoKSArICIgd2hpbGUgcHJvY2Vzc2luZyAiICsKLSAgICAgICAgICAgIAkgICAgICAgICJ0aGUgZmF1bHQgcmVzcG9uc2UgaGFuZGxlciBjaGFpbi4iKTsKLSAgICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgCSAgICB0aHJvd2FibGUgPSB0OwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWFsIHdvcmsgdG8gdW5tYXJzaGFsIHRoZSBmYXVsdCByZXNwb25zZS4KLSAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSBnZXRGYXVsdFJlc3BvbnNlKGZhdWx0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dhYmxlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihmYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihmYXVsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldFJlc3BvbnNlVmFsdWVPYmplY3QoTWVzc2FnZUNvbnRleHQgbWMpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFRocm93YWJsZSBnZXRGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1jKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0FzeW5jVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Bc3luY1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGU0YTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2FzeW5jL0FzeW5jVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEFzeW5jVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFzeW5jVXRpbHMuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlSkFYV1NNZXNzYWdlQ29udGV4dChBc3luY1Jlc3VsdCByZXN1bHQpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBBc3luY1V0aWxzLmNyZWF0ZUpBWFdTTWVzc2FnZUNvbnRleHQocmVzdWx0LmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVKQVhXU01lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbnVsbDsKLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLVdTIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0IGZyb20gdGhlIEF4aXMyIHJlc3BvbnNlCi0gICAgICAgIHJlc3BvbnNlID0gbmV3IE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgLy8gZG9uJ3Qgc2V0IHRoZSByZXNwb25zZS5zZXRNRVBDb250ZXh0KCkgaGVyZS4KLQotICAgICAgICAvLyBSRVZJRVc6IEFyZSB3ZSBvbiB0aGUgZmluYWwgdGhyZWFkIG9mIGV4ZWN1dGlvbiBoZXJlIG9yIGRvZXMgdGhpcyBnZXQgaGFuZGVkIG9mZiB0byB0aGUgZXhlY3V0b3I/Ci0gICAgICAgIC8vIFRPRE86IFJlbW92ZSB3b3JrYXJvdW5kIGZvciBXUy1BZGRyZXNzaW5nIHJ1bm5pbmcgaW4gdGhpbiBjbGllbnQgKG5vbi1zZXJ2ZXIpIGVudmlyb25tZW50Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgICAgIC5wZXJmb3JtTWlncmF0aW9uVG9UaHJlYWQoQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIG1jKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtYy5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwgIiArIHQpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiLi4uY2F1c2VkIGJ5ICIgKyB0LmdldENhdXNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvYXN5bmMvQ2FsbGJhY2tGdXR1cmUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9DYWxsYmFja0Z1dHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTBhOGE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9DYWxsYmFja0Z1dHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci0KLS8qKgotICogVGhlIENhbGxiYWNrRnV0dXJlIGltcGxlbWVudHMgdGhlIEF4aXMyIDxsaW5rPm9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrPC9saW5rPiBBUEkKLSAqIGFuZCB3aWxsIGdldCByZWdpc3RlcmVkIHdpdGggdGhlIEF4aXMyIGVuZ2luZSB0byByZWNlaXZlIHRoZSBhc3luY2hyb25vdXMgY2FsbGJhY2sgcmVzcG9uc2VzLgotICogVGhpcyBvYmplY3QgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHRoZSA8bGluaz5qYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjwvbGluaz4gZ2l2ZW4KLSAqIHRvIGl0IGJ5IHRoZSBKQVgtV1MgY2xpZW50IGFuZCB1c2luZyB0aGF0IGFzIHRoZSB0aHJlYWQgb24gd2hpY2ggdG8gZGVsaXZlciB0aGUgYXN5bmMgcmVzcG9uc2UKLSAqIHRoZSBKQVgtV1MgPGxpbms+amF2YXgueG1sLndzLkFzeW5jaEhhbmRsZXI8L2xpbms+LgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tGdXR1cmUgZXh0ZW5kcyBDYWxsYmFjayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2FsbGJhY2tGdXR1cmUuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIHByaXZhdGUgQ2FsbGJhY2tGdXR1cmVUYXNrIGNmdDsKLSAgICBwcml2YXRlIEV4ZWN1dG9yIGV4ZWN1dG9yOwotICAgIHByaXZhdGUgRnV0dXJlVGFzayB0YXNrOwotICAgIAotICAgIHByaXZhdGUgSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkN0eDsKLSAgICAKLSAgICAvKgotICAgICAqIFRoZXJlIGFyZSB0d28gQXN5bmMgQ2FsbGJhY2sgRnV0dXJlLmNhbmNlbCBzY2VuYXJpbyB0aGF0IHdlIGFkZHJlc3MKLSAgICAgKiAxKSBDbGllbnQgYXBwIGNyZWF0ZXMgcmVxdWVzdCBhbmQgY2FsbCBBc3luYyBPcGVyYXRpb24uIE5vdyBiZWZvcmUgdGhlIHJlcXVlc3QgaXMgc3VibWl0dGVkCi0gICAgICogCSAgYnkgSkFYV1MgdG8gRXhlY3V0b3IgZm9yIHByb2Nlc3NpbmcgYW5kIGFueSByZXNwb25zZSBpcyByZWNlaXZlZCBjbGllbnQgZGVjaWRlcyB0byBjYW5jZWwgCi0gICAgICogCSAgdGhlIGZ1dHVyZSB0YXNrLgotICAgICAqIDIpIENsaWVudCBhcHAgY3JlYXRlcyByZXF1ZXN0IGFuZCBjYWxsIEFzeW5jIE9wZXJhdGlvbi4gUmVxdWVzdCBpcyBzdWJtaXR0ZWQgYnkgSkFYV1MgCi0gICAgICogCSAgdG8gRXhlY3V0b3IgZm9yIHByb2Nlc3NpbmcgYW5kIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgYW5kIGNsaWVudCBkZWNpZGVzIHRvIGNhbmNlbCB0aGUgZnV0dXJlCi0gICAgICogCSAgdGFzay4KLSAgICAgKiAKLSAgICAgKiBXZSB3aWxsIGFkZHJlc3MgYm90aCB0aGVzZSBzY2VuYXJpb3MgaW4gdGhlIGNvZGUuIEluIHNjZW5hcmlvIDEgd2Ugd2lsbCBkbyB0aGUgZm9sbG93aW5nOgotICAgICAqIDEpIENoZWNrIHRoZSBmb3IgdGhlIGZ1dHVyZS5pc0NhbmNlbGxlZCBiZWZvcmUgc3VibWl0dGluZyB0aGUgdGFzayB0byBFeGVjdXRvciAKLSAgICAgKiAyKSBJZiBjYW5jZWxsZWQgdGhlbiBkbyBub3Qgc3VibWl0IHRoZSB0YXNrIGFuZCBkbyBub3QgY2FsbCB0aGUgQXN5bmMgSGFuZGxlciBvZiBjbGllbnQuIAotICAgICAqIDMpVGhlIGNsaWVudCBwcm9ncmFtIGluIHRoaXMgY2FzZSAoU2luY2UgaXQgY2FuY2VsbGVkIHRoZSBmdXR1cmUpIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGNsZWFuaW5nIGFueSByZXNvdXJjZXMgdGhhdCBpdCBlbmdhZ2VzLgotICAgICAqIAotICAgICAqIEluIFNlY29uZCBTY2VuYXJpbyB3ZSB3aWxsIGNhbGwgdGhlIEFzeW5jSGFuZGxlciBhcyBGdXR1cmUuaXNDYW5jZWxsZWQgd2lsbCBiZSBmYWxzZS4gQXMgcGVyIGphdmEgZG9jCi0gICAgICogdGhlIEZ1dHVyZSBjYW5ub3QgYmUgY2FuY2VsbGVkIG9uY2UgdGhlIHRhc2sgaGFzIGJlZW4gc3VibWl0dGVkLiBBbHNvIHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBhcnJpdmVkIHNvIAotICAgICAqIHdlIHdpbGwgbWFrZSB0aGUgQXN5bmNIYW5kbGVyIGFuZCBsZXQgdGhlIGNsaWVudCBjb2RlIGRlY2lkZWQgaG93IGl0IHdhbnRzIHRvIHRyZWF0IHRoZSByZXNwb25zZS4KLSAgICAgKi8KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBDYWxsYmFja0Z1dHVyZShJbnZvY2F0aW9uQ29udGV4dCBpYywgQXN5bmNIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgY2Z0ID0gbmV3IENhbGxiYWNrRnV0dXJlVGFzayhpYy5nZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIoKSwgaGFuZGxlcik7Ci0gICAgICAgIHRhc2sgPSBuZXcgRnV0dXJlVGFzayhjZnQpOwotICAgICAgICBleGVjdXRvciA9IGljLmdldEV4ZWN1dG9yKCk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPIHJldmlldy4gIFdlIG5lZWQgdG8gc2F2ZSB0aGUgaW52b2NhdGlvbiBjb250ZXh0IHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlCi0gICAgICAgICAqIHJlc3BvbnNlIChvciBmYXVsdCkgY29udGV4dCBzbyB0aGUgRnV0dXJlQ2FsbGJhY2sgaGFzIGFjY2VzcyB0byB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgKi8KLSAgICAgICAgaW52b2NhdGlvbkN0eCA9IGljOwotICAgIH0KLQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZ2V0RnV0dXJlVGFzaygpIHsKLSAgICAgICAgcmV0dXJuIChGdXR1cmU8Pz4pdGFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgewotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYLVdTIHJlY2VpdmVkIHRoZSBhc3luYyByZXNwb25zZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSBBc3luY1V0aWxzLmNyZWF0ZUpBWFdTTWVzc2FnZUNvbnRleHQocmVzdWx0KTsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldEludm9jYXRpb25Db250ZXh0KGludm9jYXRpb25DdHgpOwotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHRzIHNoYXJlIGEgc2luZ2xlIHBhcmVudAotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TUVQQ29udGV4dChpbnZvY2F0aW9uQ3R4LmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLmdldE1FUENvbnRleHQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgY2Z0LnNldEVycm9yKGUpOwotICAgICAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgYXN5bmMgcmVzcG9uc2UuICAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICB9Ci0KLSAgICAgICAgY2Z0LnNldE1lc3NhZ2VDb250ZXh0KHJlc3BvbnNlKTsKLSAgICAgICAgZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gSWYgYSBTT0FQRmF1bHQgd2FzIHJldHVybmVkIGJ5IHRoZSBBeGlzRW5naW5lLCB0aGUgQXhpc0ZhdWx0Ci0gICAgICAgIC8vIHRoYXQgaXMgcmV0dXJuZWQgc2hvdWxkIGhhdmUgYSBNZXNzYWdlQ29udGV4dCB3aXRoIGl0LiAgVXNlCi0gICAgICAgIC8vIHRoaXMgdG8gdW5tYXJzaGFsbCB0aGUgZmF1bHQgaW5jbHVkZWQgdGhlcmUuCi0gICAgICAgIGlmIChlLmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShBeGlzRmF1bHQuY2xhc3MpKSB7Ci0gICAgICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSAoQXhpc0ZhdWx0KWU7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dCAgPSBBc3luY1V0aWxzLmNyZWF0ZUpBWFdTTWVzc2FnZUNvbnRleHQoZmF1bHQuZ2V0RmF1bHRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldEludm9jYXRpb25Db250ZXh0KGludm9jYXRpb25DdHgpOwotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSByZXF1ZXN0IGFuZCByZXNwb25zZSBjb250ZXh0cyBzaGFyZSBhIHNpbmdsZSBwYXJlbnQKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldE1FUENvbnRleHQoaW52b2NhdGlvbkN0eC5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5nZXRNRVBDb250ZXh0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgICAgICBjZnQuc2V0RXJyb3Iod3NlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2Z0LnNldEVycm9yKGUpOwotICAgICAgICAgICAgY2Z0LnNldE1lc3NhZ2VDb250ZXh0KGZhdWx0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2Z0LnNldEVycm9yKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhlY3V0b3IgdGFzayBzdGFydGluZyB0byBwcm9jZXNzIGFzeW5jIHJlc3BvbnNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhlY3V0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCAmJiAhdGFzay5pc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh0YXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGVjdXRvckV4YykgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGJhY2tGdXR1cmUuZXhlY3V0ZSgpOiAgZXhlY3V0b3IgZXhjZXB0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JFeGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYXR0ZW1wdCB0byBjYW5jZWwgdGhlIEZ1dHVyZVRhc2sKLSAgICAgICAgICAgICAgICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gICBub3RlOiBpZiBpdCBpcyBiZWNvbWVzIHJlcXVpcmVkIHRvIHJldHVybiB0aGUgYWN0dWFsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRvIHRoZSBjbGllbnQsIHRoZW4gd2Ugd291bGQgbmVlZCB0byBkb2luZyBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBzaW1pbGFyIHRvIHNldHRpbmcgdGhlIENhbGxiYWNrRnV0dXJlVGFzayB3aXRoIHRoZSBlcnJvcgotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGFuZCBpbnZva2luZyB0aGUgQ2FsbGJhY2tGdXR1cmVUYXNrLmNhbGwoKSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB0byBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRhc2sgc3VibWl0dGVkIHRvIEV4ZWN1dG9yIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogVE9ETzogIHJldmlldwotICAgICAgICAgICAgICAgICAqIEEgdGhyZWFkIHN3aXRjaCB3aWxsIG9jY3VyIGltbWVkaWF0ZWx5IGFmdGVyIGdvaW5nIG91dCBvZiBzY29wZQotICAgICAgICAgICAgICAgICAqIG9uIHRoaXMgbWV0aG9kLiAgVGhpcyBpcyBvaywgZXhjZXB0IG9uIHNvbWUgcGxhdGZvcm1zIHRoaXMgd2lsbAotICAgICAgICAgICAgICAgICAqIHByb21wdCB0aGUgSlZNIHRvIGNsZWFuIHVwIHRoZSBvbGQgdGhyZWFkLCB0aHVzIGNsZWFuaW5nIHVwIGFueQotICAgICAgICAgICAgICAgICAqIElucHV0U3RyZWFtcyB0aGVyZS4gIElmIHRoYXQncyB0aGUgY2FzZSwgYW5kIHdlIGhhdmUgbm90IGZ1bGx5Ci0gICAgICAgICAgICAgICAgICogcmVhZCB0aGUgSW5wdXRTdHJlYW1zLCB3ZSB3aWxsIGxpa2VseSBnZXQgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAqIGNvbWluZyBmcm9tIHRoZSBwYXJzZXIsIHdoaWNoIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgKiB0aGF0IGdvdCBudWxsZWQgb3V0IGZyb20gdW5kZXIgaXQuICBNYWtlIHN1cmUgdG8gZG8gdGhlCi0gICAgICAgICAgICAgICAgICogY2Z0Lm5vdGlmeUFsbCgpIGluIHRoZSByaWdodCBwbGFjZS4gIENhbGxiYWNrRnV0dXJlVGFzay5jYWxsKCkKLSAgICAgICAgICAgICAgICAgKiBpcyB0aGUgcmlnaHQgcGxhY2Ugc2luY2UgYXQgdGhhdCBwb2ludCwgdGhlIHBhcnNlciBoYXMgZnVsbHkgcmVhZAotICAgICAgICAgICAgICAgICAqIHRoZSBJbnB1dFN0cmVhbS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNmdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWNmdC5kb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z0LndhaXQoMTgwMDAwKTsgIC8vIDMgbWludXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2Z0LndhaXQoKSB3YXMgaW50ZXJydXB0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGVjdXRvciB0YXNrIHdhcyBub3Qgc3VtYml0dGVkIGFzIEFzeW5jIEZ1dHVyZSB0YXNrIHdhcyBjYW5jZWxsZWQgYnkgY2xpZW50cyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGVjdXRvciB0YXNrIGNvbXBsZXRlZCIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1jbGFzcyBDYWxsYmFja0Z1dHVyZVRhc2sgaW1wbGVtZW50cyBDYWxsYWJsZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2FsbGJhY2tGdXR1cmVUYXNrLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7Ci0KLSAgICBBc3luY1Jlc3BvbnNlIHJlc3BvbnNlOwotICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eDsKLSAgICBBc3luY0hhbmRsZXIgaGFuZGxlcjsKLSAgICBFeGNlcHRpb24gZXJyb3I7Ci0gICAgYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0KLSAgICBDYWxsYmFja0Z1dHVyZVRhc2soQXN5bmNSZXNwb25zZSByLCBBc3luY0hhbmRsZXIgaCkgewotICAgICAgICByZXNwb25zZSA9IHI7Ci0gICAgICAgIGhhbmRsZXIgPSBoOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgQXN5bmNIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHNldE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIG1zZ0N0eCA9IG1jOwotICAgIH0KLQotICAgIHZvaWQgc2V0RXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgZXJyb3IgPSBlOwotICAgIH0KLQotICAgIAotICAgIC8qCi0gICAgICogQW4gaW52b2NhdGlvbiBvZiB0aGUgY2FsbCgpIG1ldGhvZCBpcyB3aGF0IGRyaXZlcyB0aGUgcmVzcG9uc2UgcHJvY2Vzc2luZwotICAgICAqIGZvciBDYWxsYmFjayBjbGllbnRzLiAgVGhlIGVuZCByZXN1bHQgb2YgdGhpcyBzaG91bGQgYmUgdGhhdCB0aGUgQXlzbmNIYW5kbGVyCi0gICAgICogKHRoZSBjYWxsYmFjayBpbnN0YW5jZSkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpcyBjYWxsZWQgYW5kIHRoZSByZXNwb25zZSBvcgotICAgICAqIGFuIGVycm9yIGlzIGRlbGl2ZXJlZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoZSBDbGFzc0xvYWRlciB0aGF0IHdhcyB1c2VkIHRvIGxvYWQgdGhlIEFzeW5jSGFuZGxlciBpbnN0YW5jZSBpcyB0aGUgc2FtZQotICAgICAgICAgICAgLy8gb25lIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgdGhlIEpBWEIgcmVxdWVzdCBvYmplY3QgaW5zdGFuY2VzLiAgQmVjYXVzZSBvZiB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgc2FtZSBDbGFzc0xvYWRlciBhcyB3ZSBzdGFydCByZXNwb25zZQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBvciBDbGFzc0Nhc3RFeGNlcHRpb25zIHdpbGwgb2NjdXIuCi0gICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgdXAgdGhlIHRocmVhZCdzIENsYXNzTG9hZGVyIik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGNsYXNzTG9hZGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNldCB0aGUgcmVzcG9uc2Ugb3IgZmF1bHQgY29udGVudCBvbiB0aGUgQXN5bmNSZXNwb25zZSBvYmplY3QKLSAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGNvbGxlY3RlZCBpbnNpZGUgdGhlIEV4ZWN1dG9yIHRocmVhZCBhbmQgcHJvY2Vzc2VkLgotICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5vbkVycm9yKGVycm9yLCBtc2dDdHgsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uub25Db21wbGV0ZShtc2dDdHgsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTm93IHRoYXQgdGhlIGNvbnRlbnQgaXMgYXZhaWxhYmxlLCBjYWxsIHRoZSBKQVgtV1MgQXN5bmNIYW5kbGVyIGNsYXNzCi0gICAgICAgICAgICAvLyB0byBkZWxpdmVyIHRoZSByZXNwb25zZSB0byB0aGUgdXNlci4KLSAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBKQVgtV1MgQXN5bmNIYW5kbGVyIHdpdGggdGhlIFJlc3BvbnNlIG9iamVjdCIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXluY0hhbmRsZXIgY2xhc3M6ICIgKyBoYW5kbGVyLmdldENsYXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlci5oYW5kbGVSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgaW52b2tpbmcgdGhlIGNhbGxiYWNrIG9iamVjdC4iKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVycm9yOiAiICsgdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgIAl9IGZpbmFsbHkgewotICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Qb2xsaW5nRnV0dXJlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvYXN5bmMvUG9sbGluZ0Z1dHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBlOGZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9hc3luYy9Qb2xsaW5nRnV0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFBvbGxpbmdGdXR1cmUgZXh0ZW5kcyBDYWxsYmFjayB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUG9sbGluZ0Z1dHVyZS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgcHJpdmF0ZSBJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ3R4OwotICAgIAotICAgIHB1YmxpYyBQb2xsaW5nRnV0dXJlKEludm9jYXRpb25Db250ZXh0IGljKSB7Ci0gICAgICAgIHJlc3BvbnNlID0gaWMuZ2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKCk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPIHJldmlldy4gIFdlIG5lZWQgdG8gc2F2ZSB0aGUgaW52b2NhdGlvbiBjb250ZXh0IHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlCi0gICAgICAgICAqIHJlc3BvbnNlIChvciBmYXVsdCkgY29udGV4dCBzbyB0aGUgRnV0dXJlQ2FsbGJhY2sgaGFzIGFjY2VzcyB0byB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgKi8KLSAgICAgICAgaW52b2NhdGlvbkN0eCA9IGljOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQXN5bmNSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIGJvb2xlYW4gZGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkpBWC1XUyBhc3luYyByZXNwb25zZSBsaXN0ZW5lciByZWNlaXZlZCB0aGUgcmVzcG9uc2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4ID0gQXN5bmNVdGlscy5jcmVhdGVKQVhXU01lc3NhZ2VDb250ZXh0KHJlc3VsdCk7Ci0gICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5zZXRJbnZvY2F0aW9uQ29udGV4dChpbnZvY2F0aW9uQ3R4KTsKLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSByZXF1ZXN0IGFuZCByZXNwb25zZSBjb250ZXh0cyBzaGFyZSBhIHNpbmdsZSBwYXJlbnQKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LnNldE1FUENvbnRleHQoaW52b2NhdGlvbkN0eC5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5nZXRNRVBDb250ZXh0KCkpOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLm9uRXJyb3IoZSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBhc3luYyByZXNwb25zZS4gICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIH0KLQotICAgICAgICByZXNwb25zZS5vbkNvbXBsZXRlKHJlc3BvbnNlTXNnQ3R4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIElmIGEgU09BUEZhdWx0IHdhcyByZXR1cm5lZCBieSB0aGUgQXhpc0VuZ2luZSwgdGhlIEF4aXNGYXVsdAotICAgICAgICAvLyB0aGF0IGlzIHJldHVybmVkIHNob3VsZCBoYXZlIGEgTWVzc2FnZUNvbnRleHQgd2l0aCBpdC4gIFVzZQotICAgICAgICAvLyB0aGlzIHRvIHVubWFyc2hhbGwgdGhlIGZhdWx0IGluY2x1ZGVkIHRoZXJlLgotICAgICAgICBpZiAoZS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oQXhpc0ZhdWx0LmNsYXNzKSkgewotICAgICAgICAgICAgQXhpc0ZhdWx0IGZhdWx0ID0gKEF4aXNGYXVsdCllOwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRNZXNzYWdlQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZUNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNVdGlscy5jcmVhdGVKQVhXU01lc3NhZ2VDb250ZXh0KGZhdWx0LmdldEZhdWx0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dC5zZXRJbnZvY2F0aW9uQ29udGV4dChpbnZvY2F0aW9uQ3R4KTsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dHMgc2hhcmUgYSBzaW5nbGUgcGFyZW50Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dC5zZXRNRVBDb250ZXh0KGludm9jYXRpb25DdHguZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuZ2V0TUVQQ29udGV4dCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gd3NlKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uub25FcnJvcih3c2UsIG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXNwb25zZS5vbkVycm9yKGUsIGZhdWx0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzcG9uc2Uub25FcnJvcihlLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvY29uZmlnL0FkZHJlc3NpbmdDb25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvQWRkcmVzc2luZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmZiNzIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvQWRkcmVzc2luZ0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmNvbmZpZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmcuU09BUEJpbmRpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdpbGwgZW5hYmxlL2Rpc2FibGUgV1MtQWRkcmVzc2luZyBpbiBhIEpBWC1XUyAyLjEgY2xpZW50LA0KLSAqIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCB0byBpdCB2aWEgYW4gPGNvZGU+QWRkcmVzc2luZ0ZlYXR1cmU8L2NvZGU+DQotICogYW5kL29yIGEgPGNvZGU+U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlPC9jb2RlPi4NCi0gKiAgDQotICogIEBzZWUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUNCi0gKiAgQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlDQotICovDQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdDb25maWd1cmF0b3IgaW1wbGVtZW50cyBDbGllbnRDb25maWd1cmF0b3Igew0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3IjY29uZmlndXJlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dCwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpIHsNCi0gICAgICAgIEJpbmRpbmcgYm5kID0gKEJpbmRpbmcpIHByb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIEFkZHJlc3NpbmdGZWF0dXJlIGFkZHJlc3NpbmdGZWF0dXJlID0NCi0gICAgICAgICAgICAoQWRkcmVzc2luZ0ZlYXR1cmUpIGJuZC5nZXRGZWF0dXJlKEFkZHJlc3NpbmdGZWF0dXJlLklEKTsNCi0gICAgICAgIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBzdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgPQ0KLSAgICAgICAgICAgIChTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUpIGJuZC5nZXRGZWF0dXJlKFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5JRCk7DQotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IGJuZC5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKCk7DQotICAgICAgICBCb29sZWFuIGRpc2FibGVBZGRyZXNzaW5nID0NCi0gICAgICAgICAgICAoQm9vbGVhbikgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUyk7DQotICAgICAgICANCi0gICAgICAgIC8vRmlndXJlIG91dCB3aGljaCBXUy1BZGRyZXNzaW5nIGZlYXR1cmUgd2FzIHNwZWNpZmllZCBjYXVzaW5nIHRoaXMgY29uZmlndXJhdG9yIHRvIHJ1bi4gDQotICAgICAgICBpZiAoYWRkcmVzc2luZ0ZlYXR1cmUgIT0gbnVsbCAmJiBzdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vQm90aCBmZWF0dXJlcyBtdXN0IGhhdmUgYmVlbiBzcGVjaWZpZWQuDQotICAgICAgICAgICAgYm9vbGVhbiB3M2NBZGRyZXNzaW5nRW5hYmxlZCA9IGFkZHJlc3NpbmdGZWF0dXJlLmlzRW5hYmxlZCgpOw0KLSAgICAgICAgICAgIGJvb2xlYW4gc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkID0gc3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmlzRW5hYmxlZCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGlmICh3M2NBZGRyZXNzaW5nRW5hYmxlZCAmJiBzdWJtaXNzaW9uQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgLy9Vc2UgdGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIG9mIHRoZSBFUFIgc3BlY2lmaWVkDQotICAgICAgICAgICAgICAgIC8vdmlhIHRoZSBKQVgtV1MgMi4xIEFQSS4gSWYgbm8gRVBSIHdhcyBzcGVjaWZpZWQNCi0gICAgICAgICAgICAgICAgLy90aGVuIHRoZSAyMDA1LzA4IG5hbWVzcGFjZSB3aWxsIGJlIHVzZWQuDQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzaW5nTmFtZXNwYWNlID09IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRmluYWwuV1NBX05BTUVTUEFDRTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5GQUxTRTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSBpZiAodzNjQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgLy9FbmFibGUgb25seSAyMDA1LzA4IGFkZHJlc3NpbmcNCi0gICAgICAgICAgICAgICAgaWYgKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRmVhdHVyZU5hbWVzcGFjZU5vdFN1cHBvcnRlZCIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBGaW5hbC5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWRkcmVzc2luZyA9IEJvb2xlYW4uRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAvL0VuYWJsZSBvbmx5IDIwMDQvMDggYWRkcmVzc2luZw0KLSAgICAgICAgICAgICAgICBpZiAoRmluYWwuV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRmVhdHVyZU5hbWVzcGFjZU5vdFN1cHBvcnRlZCIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRTsNCi0gICAgICAgICAgICAgICAgZGlzYWJsZUFkZHJlc3NpbmcgPSBCb29sZWFuLkZBTFNFOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy9EaXNhYmxlIDIwMDUvMDggYW5kIDIwMDQvMDggYWRkcmVzc2luZw0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWRkcmVzc2luZyA9IEJvb2xlYW4uVFJVRTsNCi0gICAgICAgICAgICB9ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoYWRkcmVzc2luZ0ZlYXR1cmUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vVGhlIEFkZHJlc3NpbmdGZWF0dXJlIG11c3QgaGF2ZSBiZWVuIHNwZWNpZmllZC4NCi0gICAgICAgICAgICBib29sZWFuIHczY0FkZHJlc3NpbmdFbmFibGVkID0gYWRkcmVzc2luZ0ZlYXR1cmUuaXNFbmFibGVkKCk7DQotDQotICAgICAgICAgICAgaWYgKHczY0FkZHJlc3NpbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIC8vRW5hYmxlIDIwMDUvMDggYWRkcmVzc2luZw0KLSAgICAgICAgICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkZlYXR1cmVOYW1lc3BhY2VOb3RTdXBwb3J0ZWQiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UgPSBGaW5hbC5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWRkcmVzc2luZyA9IEJvb2xlYW4uRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvL0Rpc2FibGUgMjAwNS8wOCBhZGRyZXNzaW5nDQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmIChzdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vVGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBtdXN0IGhhdmUgYmVlbiBzcGVjaWZpZWQuDQotICAgICAgICAgICAgYm9vbGVhbiBzdWJtaXNzaW9uQWRkcmVzc2luZ0VuYWJsZWQgPSBzdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuaXNFbmFibGVkKCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAvL0VuYWJsZSAyMDA0LzA4IGFkZHJlc3NpbmcNCi0gICAgICAgICAgICAgICAgaWYgKEZpbmFsLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkZlYXR1cmVOYW1lc3BhY2VOb3RTdXBwb3J0ZWQiLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NpbmdOYW1lc3BhY2UpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFOw0KLSAgICAgICAgICAgICAgICBkaXNhYmxlQWRkcmVzc2luZyA9IEJvb2xlYW4uRkFMU0U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvL0Rpc2FibGUgMjAwNC8wOCBhZGRyZXNzaW5nDQotICAgICAgICAgICAgICAgIGRpc2FibGVBZGRyZXNzaW5nID0gQm9vbGVhbi5UUlVFOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAvL0lmIG5laXRoZXIgd2VyZSBzcGVjaWZpZWQgdGhlbiB0aGlzIGNvbmZpZ3VyYXRvciBzaG91bGQgbmV2ZXIgcnVuLg0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTm9XU0FkZHJlc3NpbmdGZWF0dXJlcyIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKCFkaXNhYmxlQWRkcmVzc2luZykgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IGJuZC5nZXRBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCk7DQotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMk1lc3NhZ2VDb250ZXh0ID0NCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgICAgICAgICBheGlzMk1lc3NhZ2VDb250ZXh0LnNldFRvKGVwcik7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBtZXNzYWdlQ29udGV4dC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBzZC5nZXRBeGlzQ29uZmlnQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgICAgIGlmICghYXhpc0NvbmZpZy5pc0VuZ2FnZWQoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKSkgew0KLSAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5lbmdhZ2VNb2R1bGUoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4NCi0gICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQWRkcmVzc2luZ0VuZ2FnZW1lbnRFcnJvciIsIGUudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMsIGRpc2FibGVBZGRyZXNzaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3Ijc3VwcG9ydHMob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEJpbmRpbmcgYmluZGluZykgew0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmcgaW5zdGFuY2VvZiBTT0FQQmluZGluZzsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvY29uZmlnL01UT01Db25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvTVRPTUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTc1ZDY2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvTVRPTUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmNvbmZpZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZy5TT0FQQmluZGluZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuQ2xpZW50Q29uZmlndXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NRmVhdHVyZTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTVRPTUNvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIENsaWVudENvbmZpZ3VyYXRvciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNVE9NQ29uZmlndXJhdG9yLmNsYXNzKTsNCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUudXRpbC5XZWJTZXJ2aWNlRmVhdHVyZUNvbmZpZ3VyYXRvciNwZXJmb3JtQ29uZmlndXJhdGlvbihvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQsIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyKSB7DQotICAgICAgICBCaW5kaW5nIGJuZCA9IChCaW5kaW5nKSBwcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBNVE9NRmVhdHVyZSBtdG9tRmVhdHVyZSA9IChNVE9NRmVhdHVyZSkgYm5kLmdldEZlYXR1cmUoTVRPTUZlYXR1cmUuSUQpOw0KLSAgICAgICAgTWVzc2FnZSByZXF1ZXN0TXNnID0gbWVzc2FnZUNvbnRleHQuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICAvL0Rpc2FibGUgTVRPTS4NCi0gICAgICAgIHJlcXVlc3RNc2cuc2V0TVRPTUVuYWJsZWQoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIGlmIChtdG9tRmVhdHVyZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4NCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm10b21GZWF0dXJlRXJyIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy9FbmFibGUgTVRPTSBpZiBzcGVjaWZpZWQuDQotICAgICAgICBpZiAobXRvbUZlYXR1cmUuaXNFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBpbnQgdGhyZXNob2xkID0gbXRvbUZlYXR1cmUuZ2V0VGhyZXNob2xkKCk7DQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGF0dGFjaG1lbnRJRHMgPSByZXF1ZXN0TXNnLmdldEF0dGFjaG1lbnRJRHMoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBFbmFibGUgTVRPTQ0KLSAgICAgICAgICAgIHJlcXVlc3RNc2cuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKHRocmVzaG9sZCA8PSAwKSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmFibGluZyBNVE9NIHdpdGggbm8gdGhyZXNob2xkLiIpOw0KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIH1lbHNlew0KLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7DQotICAgICAgICAgICAgICAgIAlsb2cuZGVidWcoIk1UT00gVGhyZXNob2xkIFZhbHVlID0iK3RocmVzaG9sZCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vc2V0IE1UT00gdGhyZXNob2xkIHZhbHVlIG9uIG1lc3NhZ2UgY29udGV4dC4NCi0gICAgICAgICAgICAgICAgLy9PbmNlIE1UT00gdGhyZXNob2xkIGlzIHNldCBvbiBtZXNzYWdlIGNvbnRleHQgaXQgd2lsbCBiZQ0KLSAgICAgICAgICAgICAgICAvL3JlYWQgYnkgU09BUE1lc3NhZ2VGb3JtYXR0ZXIud3JpdGVUbygpIHdoaWxlIHdyaXRpbmcgdGhlIGF0dGFjaG1lbnQNCi0gICAgICAgICAgICAgICAgLy9TT0FQTWVzc2FnZUZvcm1hdHRlciB3aWxsIGZ1cnRoZXIgcHJvcG9nYXRlIHRoZSB0aHJlc2hvbGQgdmFsdWUgdG8NCi0gICAgICAgICAgICAgICAgLy9BeGlvbS5PTU91dHB1dEZvcm1hdC4gSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgd2lsbCB0aGVuIG1ha2UgDQotICAgICAgICAgICAgICAgIC8vZGVjaXNpb24gaWYgdGhlIGF0dGFjaG1lbnQgc2hvdWxkIGJlIGlubGluZWQgb3Igb3B0aW1pemVkLiAgDQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1UT01fVEhSRVNIT0xELCBuZXcgSW50ZWdlcih0aHJlc2hvbGQpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgTVRPTUZlYXR1cmUgd2FzIGZvdW5kLCBidXQgbm90IGVuYWJsZWQuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLkNsaWVudENvbmZpZ3VyYXRvciNzdXBwb3J0cyhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQmluZGluZyBiaW5kaW5nKSB7DQotICAgICAgICByZXR1cm4gYmluZGluZyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9jb25maWcvUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0ZmQ4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvY29uZmlnL1Jlc3BlY3RCaW5kaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5jb25maWc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuQ2xpZW50Q29uZmlndXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nRmVhdHVyZTsNCi0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIENsaWVudENvbmZpZ3VyYXRvciB7DQotDQotICAgIC8qDQotICAgICAqICAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLnV0aWwuV2ViU2VydmljZUZlYXR1cmVDb25maWd1cmF0b3IjcGVyZm9ybUNvbmZpZ3VyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIpDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIEJpbmRpbmdQcm92aWRlciBwcm92aWRlcikgew0KLSAgICAgICAgQmluZGluZyBibmQgPSAoQmluZGluZykgcHJvdmlkZXIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgUmVzcGVjdEJpbmRpbmdGZWF0dXJlIHJlc3BlY3RCaW5kaW5nRmVhdHVyZSA9DQotICAgICAgICAgICAgKFJlc3BlY3RCaW5kaW5nRmVhdHVyZSkgYm5kLmdldEZlYXR1cmUoUmVzcGVjdEJpbmRpbmdGZWF0dXJlLklEKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHJlc3BlY3RCaW5kaW5nRmVhdHVyZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlc3BlY3RCaW5kaW5nTm90U3BlY2lmaWVkIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHJlc3BlY3RCaW5kaW5nRmVhdHVyZS5pc0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIC8vVE9ETyBJbXBsZW1lbnRhdGlvbiByZXF1aXJlZC4NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3Ijc3VwcG9ydHMob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEJpbmRpbmcgYmluZGluZykgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Jhc2VEaXNwYXRjaC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Jhc2VEaXNwYXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmEzMzg2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9CYXNlRGlzcGF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5NZXRob2RNYXJzaGFsbGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLm1pZ3JhdG9yLkFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRGlzcGF0Y2g8VD4gZXh0ZW5kcyBCaW5kaW5nUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBqYXZheC54bWwud3MuRGlzcGF0Y2ggewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJhc2VEaXNwYXRjaC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgSW52b2NhdGlvbkNvbnRyb2xsZXIgaWM7Ci0KLSAgICBwcm90ZWN0ZWQgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50OwotCi0gICAgcHJvdGVjdGVkIE1vZGUgbW9kZTsKLQotICAgIHByb3RlY3RlZCBCYXNlRGlzcGF0Y2goU2VydmljZURlbGVnYXRlIHN2Y0RlbGdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgc3VwZXIoc3ZjRGVsZ2F0ZSwgZXBEZXNjLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLQotICAgICAgICBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkgaWNmID0gKEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgaWMgPSBpY2YuZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJtaXNzaW5nSW52b2NhdGlvbkNvbnRyb2xsZXIiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlIHRoZSBpbnB1dCBvYmplY3QgYW5kIHR1cm4gaXQgaW50byBhbiBPTUVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgc2VudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVZhbHVlKE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIG1lc3NhZ2UsIHJldHVybiB0aGUgYnVzaW5lc3Mgb2JqZWN0IGJhc2VkIG9uIHRoZSByZXF1ZXN0b3IncyByZXF1aXJlZCBmb3JtYXQgKFBBWUxPQUQKLSAgICAgKiB2cy4gTUVTU0FHRSkgYW5kIGRhdGF0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRWYWx1ZUZyb21NZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBBc3luY0xpc3RlbmVyIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3Igd2FpdGluZyBmb3IgYXN5bmMgcmVzcG9uc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIGNvbmZpZ3VyZWQgQXN5bmNMaXN0ZW5lciBpbnN0YW5jZQotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBc3luY1Jlc3BvbnNlIGNyZWF0ZUFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpOwotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iaikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIENhdGNoIGFsbCBleGNlcHRpb25zIGFuZCByZXRocm93IGFuIGFwcHJvcHJpYXRlIFdlYlNlcnZpY2UgRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyZWQgc3luY2hyb25vdXMgaW52b2NhdGlvbjogQmFzZURpc3BhdGNoLmludm9rZSgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgSW52b2NhdGlvbkNvbnRleHQgaW5zdGFuY2UgZm9yIHRoaXMgcmVxdWVzdC9yZXNwb25zZSBmbG93LgotICAgICAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlSW52b2NhdGlvbkNvbnRleHQobnVsbCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRTZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIE1lc3NhZ2VDb250ZXh0IHRvIGhvbGQgdGhlIGFjdHVhbCByZXF1ZXN0IG1lc3NhZ2UgYW5kIGl0cwotICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldEVuZHBvaW50RGVzY3JpcHRpb24oZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRPRE86IHJldmlldzogbWFrZSBzdXJlIHRoZSBoYW5kbGVycyBhcmUgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dAotICAgICAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYV1MgcnVudGltZSBkb2VzIG5vdCB1c2UgRW5kcG9pbnQsIHdoaWNoCi0gICAgICAgICAgICAgKiB3b3VsZCBub3JtYWxseSBiZSB0aGUgcGxhY2UgdG8gaW5pdGlhbGl6ZSBhbmQgc3RvcmUgdGhlIGhhbmRsZXIgbGlzdC4KLSAgICAgICAgICAgICAqIEluIGxpZXUgb2YgdGhhdCwgd2Ugd2lsbCBoYXZlIHRvIGludGlhbGl6ZSBhbmQgc3RvcmUgdGhlbSBvbiB0aGUgCi0gICAgICAgICAgICAgKiBJbnZvY2F0aW9uQ29udGV4dC4gIGFsc28gc2VlIHRoZSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuICBPbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgKiBzaWRlLCB0aGUgYmluZGluZyBpcyBub3QgeWV0IHNldCB3aGVuIHdlIGNhbGwgaW50byB0aGF0IGZhY3RvcnksIHNvIHRoZQotICAgICAgICAgICAgICogaGFuZGxlciBsaXN0IGRvZXNuJ3QgZ2V0IHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQgb2JqZWN0IHRoZXJlLiAgVGh1cwotICAgICAgICAgICAgICogd2UgZ290dGEgZG8gaXQgaGVyZS4KLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAvLyBiZSBzdXJlIHRvIHVzZSB3aGF0ZXZlciBoYW5kbGVycmVzb2x2ZXIgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgU2VydmljZQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldEhhbmRsZXJzKGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCkpOwotCi0gICAgICAgICAgICBpbml0TWVzc2FnZUNvbnRleHQob2JqLCByZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIGlmIFNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkgaXMgdHJ1ZSwgYW5kIHRoZSBjbGllbnQgYXBwIGhhcyBleHBsaWNpdGx5IHNldCBhIEhFQURFUl9DT09LSUUgb24gdGhlIHJlcXVlc3QgY29udGV4dCwgYXNzdW1lIHRoZSBjbGllbnQKLSAgICAgICAgICAgICAqIGFwcCBpcyBleHBlY3RpbmcgdGhlIEhFQURFUl9DT09LSUUgdG8gYmUgdGhlIHNlc3Npb24gaWQuICBJZiB3ZSB3ZXJlIGVzdGFibGlzaGluZyBhIG5ldyBzZXNzaW9uLCBubyBjb29raWUgd291bGQgYmUgc2VudCwgYW5kIHRoZSAKLSAgICAgICAgICAgICAqIHNlcnZlciB3b3VsZCByZXBseSB3aXRoIGEgIlNldC1Db29raWUiIGhlYWRlciwgd2hpY2ggaXMgY29waWVkIGFzIGEgIkNvb2tpZSIta2V5ZWQgcHJvcGVydHkgdG8gdGhlIHNlcnZpY2UgY29udGV4dCBkdXJpbmcgcmVzcG9uc2UuCi0gICAgICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIGlmIHdlIHN1Y2NlZWQgaW4gdXNpbmcgYW4gZXhpc3Rpbmcgc2VydmVyIHNlc3Npb24sIG5vICJTZXQtQ29va2llIiBoZWFkZXIgd2lsbCBiZSByZXR1cm5lZCwgYW5kIHRoZXJlZm9yZSBubwotICAgICAgICAgICAgICogIkNvb2tpZSIta2V5ZWQgcHJvcGVydHkgd291bGQgYmUgc2V0IG9uIHRoZSBzZXJ2aWNlIGNvbnRleHQuICBTbywgbGV0J3MgY29weSBvdXIgcmVxdWVzdCBjb250ZXh0IEhFQURFUl9DT09LSUUga2V5IHRvIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICAgKiBjb250ZXh0IG5vdyB0byBwcmV2ZW50IHRoZSAibm8gY29va2llIiBleGNlcHRpb24gaW4gQmluZGluZ1Byb3ZpZGVyLnNldHVwU2Vzc2lvbkNvbnRleHQuICBJdCBpcyBwb3NzaWJsZSB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQKLSAgICAgICAgICAgICAqIHNlc3Npb25zLCBpbiB3aGljaCBjYXNlIG5vIGVycm9yIG9jY3VycywgYnV0IHRoZSBjbGllbnQgYXBwIHdvdWxkIGFzc3VtZSBpdCBpcyBwYXJ0aWNpcGF0aW5nIGluIGEgc2Vzc2lvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChyZXF1ZXN0Q29udGV4dC5jb250YWluc0tleShCaW5kaW5nUHJvdmlkZXIuU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSkpICYmICgoQm9vbGVhbilyZXF1ZXN0Q29udGV4dC5nZXQoQmluZGluZ1Byb3ZpZGVyLlNFU1NJT05fTUFJTlRBSU5fUFJPUEVSVFkpKSkgewotICAgICAgICAgICAgICAgIGlmICgocmVxdWVzdENvbnRleHQuY29udGFpbnNLZXkoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFKSkgJiYgKHJlcXVlc3RDb250ZXh0LmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnZvY2F0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0U2VydmljZUNvbnRleHQoKS5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LmdldFNlcnZpY2VDbGllbnQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSwgcmVxdWVzdENvbnRleHQuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDbGllbnQtYXBwIGRlZmluZWQgQ29va2llIHByb3BlcnR5IChhc3N1bWUgdG8gYmUgc2Vzc2lvbiBjb29raWUpIG9uIHJlcXVlc3QgY29udGV4dCBjb3BpZWQgdG8gc2VydmljZSBjb250ZXh0LiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQ2F1dGlvbjogIHNlcnZlciBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IHNlc3Npb25zLCBidXQgY2xpZW50IGFwcCB3aWxsIG5vdCBiZSBpbmZvcm1lZCB3aGVuIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE1pZ3JhdGUgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpZW50IHJlcXVlc3QgY29udGV4dCBiYWcgdG8KLSAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0LgotICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub01lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELAotICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Q29udGV4dCgpLCByZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy8gUGVyZm9ybSB0aGUgV2ViU2VydmljZUZlYXR1cmUgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgICAgICBiaW5kaW5nLmNvbmZpZ3VyZShyZXF1ZXN0TXNnQ3R4LCB0aGlzKTsKLQotICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVxdWVzdCB1c2luZyB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIKLSAgICAgICAgICAgIGljLmludm9rZShpbnZvY2F0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguc2V0RW5kcG9pbnREZXNjcmlwdGlvbihyZXF1ZXN0TXNnQ3R4LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKSk7Ci0KLSAgICAgICAgICAgIC8vIE1pZ3JhdGUgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgYmFjawotICAgICAgICAgICAgLy8gdG8gdGhlIGNsaWVudCByZXNwb25zZSBjb250ZXh0IGJhZy4KLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uRnJvbU1lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELAotICAgICAgICAgICAgICAgICAgICBnZXRSZXNwb25zZUNvbnRleHQoKSwgcmVzcG9uc2VNc2dDdHgpOwotCi0gICAgICAgICAgICBpZiAoaGFzRmF1bHRSZXNwb25zZShyZXNwb25zZU1zZ0N0eCkpIHsKLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSA9IEJhc2VEaXNwYXRjaC5nZXRGYXVsdFJlc3BvbnNlKHJlc3BvbnNlTXNnQ3R4KTsKLSAgICAgICAgICAgICAgICB0aHJvdyB3c2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgcmV0dXJuIG9iamVjdAotICAgICAgICAgICAgT2JqZWN0IHJldHVybk9iaiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2VNc2cgPSByZXNwb25zZU1zZ0N0eC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT2JqID0gZ2V0VmFsdWVGcm9tTWVzc2FnZShyZXNwb25zZU1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBGcmVlIHRoZSBpbmNvbWluZyBpbnB1dCBzdHJlYW0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5mcmVlSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbWFpbnRhaW4gc2Vzc2lvbiBzdGF0ZQotICAgICAgICAgICAgY2hlY2tNYWludGFpblNlc3Npb25TdGF0ZShyZXF1ZXN0TXNnQ3R4LCBpbnZvY2F0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3luY2hyb25vdXMgaW52b2NhdGlvbiBjb21wbGV0ZWQ6IEJhc2VEaXNwYXRjaC5pbnZva2UoKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmV0dXJuT2JqOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBBbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biBhcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TWVzc2FnZUNvbnRleHQoT2JqZWN0IG9iaiwgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCkgewotICAgICAgICBNZXNzYWdlIHJlcXVlc3RNc2cgPSBjcmVhdGVSZXF1ZXN0TWVzc2FnZShvYmopOwotICAgICAgICBzZXR1cE1lc3NhZ2VQcm9wZXJ0aWVzKHJlcXVlc3RNc2cpOwotICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldE1lc3NhZ2UocmVxdWVzdE1zZyk7Ci0gICAgICAgIC8vIGhhbmRsZSBIVFRQX1JFUVVFU1RfTUVUSE9EIHByb3BlcnR5Ci0gICAgICAgIFN0cmluZyBtZXRob2QgPSAoU3RyaW5nKXJlcXVlc3RDb250ZXh0LmdldChqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfTUVUSE9EKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QsIG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoT2JqZWN0IG9iaikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRlcmVkIG9uZS13YXkgaW52b2NhdGlvbjogQmFzZURpc3BhdGNoLmludm9rZU9uZVdheSgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgSW52b2NhdGlvbkNvbnRleHQgaW5zdGFuY2UgZm9yIHRoaXMgcmVxdWVzdC9yZXNwb25zZSBmbG93LgotICAgICAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlSW52b2NhdGlvbkNvbnRleHQobnVsbCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRTZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIE1lc3NhZ2VDb250ZXh0IHRvIGhvbGQgdGhlIGFjdHVhbCByZXF1ZXN0IG1lc3NhZ2UgYW5kIGl0cwotICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldEVuZHBvaW50RGVzY3JpcHRpb24oZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRPRE86IHJldmlldzogbWFrZSBzdXJlIHRoZSBoYW5kbGVycyBhcmUgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dAotICAgICAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYV1MgcnVudGltZSBkb2VzIG5vdCB1c2UgRW5kcG9pbnQsIHdoaWNoCi0gICAgICAgICAgICAgKiB3b3VsZCBub3JtYWxseSBiZSB0aGUgcGxhY2UgdG8gaW5pdGlhbGl6ZSBhbmQgc3RvcmUgdGhlIGhhbmRsZXIgbGlzdC4KLSAgICAgICAgICAgICAqIEluIGxpZXUgb2YgdGhhdCwgd2Ugd2lsbCBoYXZlIHRvIGludGlhbGl6ZSBhbmQgc3RvcmUgdGhlbSBvbiB0aGUgCi0gICAgICAgICAgICAgKiBJbnZvY2F0aW9uQ29udGV4dC4gIGFsc28gc2VlIHRoZSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuICBPbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgKiBzaWRlLCB0aGUgYmluZGluZyBpcyBub3QgeWV0IHNldCB3aGVuIHdlIGNhbGwgaW50byB0aGF0IGZhY3RvcnksIHNvIHRoZQotICAgICAgICAgICAgICogaGFuZGxlciBsaXN0IGRvZXNuJ3QgZ2V0IHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQgb2JqZWN0IHRoZXJlLiAgVGh1cwotICAgICAgICAgICAgICogd2UgZ290dGEgZG8gaXQgaGVyZS4KLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAvLyBiZSBzdXJlIHRvIHVzZSB3aGF0ZXZlciBoYW5kbGVycmVzb2x2ZXIgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgU2VydmljZQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldEhhbmRsZXJzKGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCkpOwotCi0gICAgICAgICAgICBpbml0TWVzc2FnZUNvbnRleHQob2JqLCByZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy8gTWlncmF0ZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBjbGllbnQgcmVxdWVzdCBjb250ZXh0IGJhZyB0bwotICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybU1pZ3JhdGlvblRvTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsCi0gICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RDb250ZXh0KCksIHJlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgdXNlci4KLSAgICAgICAgICAgIGJpbmRpbmcuY29uZmlndXJlKHJlcXVlc3RNc2dDdHgsIHRoaXMpOwotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgaWMuaW52b2tlT25lV2F5KGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3RNc2dDdHgsIGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPbmUtd2F5IGludm9jYXRpb24gY29tcGxldGVkOiBCYXNlRGlzcGF0Y2guaW52b2tlT25lV2F5KCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBBbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biBhcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGludm9rZUFzeW5jKE9iamVjdCBvYmosIEFzeW5jSGFuZGxlciBhc3luY2hhbmRsZXIpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBBbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biBhcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50ZXJlZCBhc3luY2hyb25vdXMgKGNhbGxiYWNrKSBpbnZvY2F0aW9uOiBCYXNlRGlzcGF0Y2guaW52b2tlQXN5bmMoKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEludm9jYXRpb25Db250ZXh0IGluc3RhbmNlIGZvciB0aGlzIHJlcXVlc3QvcmVzcG9uc2UgZmxvdy4KLSAgICAgICAgICAgIEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUludm9jYXRpb25Db250ZXh0KG51bGwpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0U2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBNZXNzYWdlQ29udGV4dCB0byBob2xkIHRoZSBhY3R1YWwgcmVxdWVzdCBtZXNzYWdlIGFuZCBpdHMKLSAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgcHJvcGVydGllcwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgcmVxdWVzdE1zZ0N0eC5zZXRFbmRwb2ludERlc2NyaXB0aW9uKGdldEVuZHBvaW50RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQocmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUT0RPOiByZXZpZXc6IG1ha2Ugc3VyZSB0aGUgaGFuZGxlcnMgYXJlIHNldCBvbiB0aGUgSW52b2NhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWFdTIHJ1bnRpbWUgZG9lcyBub3QgdXNlIEVuZHBvaW50LCB3aGljaAotICAgICAgICAgICAgICogd291bGQgbm9ybWFsbHkgYmUgdGhlIHBsYWNlIHRvIGluaXRpYWxpemUgYW5kIHN0b3JlIHRoZSBoYW5kbGVyIGxpc3QuCi0gICAgICAgICAgICAgKiBJbiBsaWV1IG9mIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBpbnRpYWxpemUgYW5kIHN0b3JlIHRoZW0gb24gdGhlIAotICAgICAgICAgICAgICogSW52b2NhdGlvbkNvbnRleHQuICBhbHNvIHNlZSB0aGUgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LiAgT24gdGhlIGNsaWVudAotICAgICAgICAgICAgICogc2lkZSwgdGhlIGJpbmRpbmcgaXMgbm90IHlldCBzZXQgd2hlbiB3ZSBjYWxsIGludG8gdGhhdCBmYWN0b3J5LCBzbyB0aGUKLSAgICAgICAgICAgICAqIGhhbmRsZXIgbGlzdCBkb2Vzbid0IGdldCBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0IG9iamVjdCB0aGVyZS4gIFRodXMKLSAgICAgICAgICAgICAqIHdlIGdvdHRhIGRvIGl0IGhlcmUuCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgLy8gYmUgc3VyZSB0byB1c2Ugd2hhdGV2ZXIgaGFuZGxlcnJlc29sdmVyIGlzIHJlZ2lzdGVyZWQgb24gdGhlIFNlcnZpY2UKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBnZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRIYW5kbGVycyhiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpKTsKLQotICAgICAgICAgICAgaW5pdE1lc3NhZ2VDb250ZXh0KG9iaiwgcmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vIE1pZ3JhdGUgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgY2xpZW50IHJlcXVlc3QgY29udGV4dCBiYWcgdG8KLSAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0LgotICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub01lc3NhZ2VDb250ZXh0KAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELAotICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0Q29udGV4dCgpLCByZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy8gUGVyZm9ybSB0aGUgV2ViU2VydmljZUZlYXR1cmUgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgICAgICBiaW5kaW5nLmNvbmZpZ3VyZShyZXF1ZXN0TXNnQ3R4LCB0aGlzKTsKLQotICAgICAgICAgICAgLy8gU2V0dXAgdGhlIEV4ZWN1dG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRyaXZlIGFzeW5jIHJlc3BvbnNlcyBiYWNrIHRvIAotICAgICAgICAgICAgLy8gdGhlIGNsaWVudC4KLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGRuJ3QgYmUgZ2V0dGluZyB0aGlzIGZyb20gdGhlIFNlcnZpY2VEZWxlZ2F0ZSwgcmF0aGVyIGVhY2ggCi0gICAgICAgICAgICAvLyBEaXNwYXRjaCBvYmplY3Qgc2hvdWxkIGhhdmUgaXQncyBvd24uCi0gICAgICAgICAgICBFeGVjdXRvciBlID0gc2VydmljZURlbGVnYXRlLmdldEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRFeGVjdXRvcihlKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBBc3luY0xpc3RlbmVyIHRoYXQgaXMgdG8gYmUgdXNlZCBieSB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIuCi0gICAgICAgICAgICBBc3luY1Jlc3BvbnNlIGxpc3RlbmVyID0gY3JlYXRlQXN5bmNSZXNwb25zZUxpc3RlbmVyKCk7Ci0gICAgICAgICAgICBpbnZvY2F0aW9uQ29udGV4dC5zZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgICAgICAvLyBTZW5kIHRoZSByZXF1ZXN0IHVzaW5nIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlcgotICAgICAgICAgICAgRnV0dXJlPD8+IGFzeW5jUmVzcG9uc2UgPSBpYy5pbnZva2VBc3luYyhpbnZvY2F0aW9uQ29udGV4dCwgYXN5bmNoYW5kbGVyKTsKLQotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3RNc2dDdHgsIGludm9jYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luY2hyb25vdXMgKGNhbGxiYWNrKSBpbnZvY2F0aW9uIHNlbnQ6IEJhc2VEaXNwYXRjaC5pbnZva2VBc3luYygpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBhc3luY1Jlc3BvbnNlOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBBbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biBhcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlQXN5bmMoT2JqZWN0IG9iaikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIGFzIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRlcmVkIGFzeW5jaHJvbm91cyAocG9sbGluZykgaW52b2NhdGlvbjogQmFzZURpc3BhdGNoLmludm9rZUFzeW5jKCkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBpbnN0YW5jZSBmb3IgdGhpcyByZXF1ZXN0L3Jlc3BvbnNlIGZsb3cuCi0gICAgICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIEludm9jYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVJbnZvY2F0aW9uQ29udGV4dChudWxsKTsKLSAgICAgICAgICAgIGludm9jYXRpb25Db250ZXh0LnNldFNlcnZpY2VDbGllbnQoc2VydmljZUNsaWVudCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgTWVzc2FnZUNvbnRleHQgdG8gaG9sZCB0aGUgYWN0dWFsIHJlcXVlc3QgbWVzc2FnZSBhbmQgaXRzCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHByb3BlcnRpZXMKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0RW5kcG9pbnREZXNjcmlwdGlvbihnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVE9ETzogcmV2aWV3OiBtYWtlIHN1cmUgdGhlIGhhbmRsZXJzIGFyZSBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKQVhXUyBydW50aW1lIGRvZXMgbm90IHVzZSBFbmRwb2ludCwgd2hpY2gKLSAgICAgICAgICAgICAqIHdvdWxkIG5vcm1hbGx5IGJlIHRoZSBwbGFjZSB0byBpbml0aWFsaXplIGFuZCBzdG9yZSB0aGUgaGFuZGxlciBsaXN0LgotICAgICAgICAgICAgICogSW4gbGlldSBvZiB0aGF0LCB3ZSB3aWxsIGhhdmUgdG8gaW50aWFsaXplIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSAKLSAgICAgICAgICAgICAqIEludm9jYXRpb25Db250ZXh0LiAgYWxzbyBzZWUgdGhlIEludm9jYXRpb25Db250ZXh0RmFjdG9yeS4gIE9uIHRoZSBjbGllbnQKLSAgICAgICAgICAgICAqIHNpZGUsIHRoZSBiaW5kaW5nIGlzIG5vdCB5ZXQgc2V0IHdoZW4gd2UgY2FsbCBpbnRvIHRoYXQgZmFjdG9yeSwgc28gdGhlCi0gICAgICAgICAgICAgKiBoYW5kbGVyIGxpc3QgZG9lc24ndCBnZXQgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBvYmplY3QgdGhlcmUuICBUaHVzCi0gICAgICAgICAgICAgKiB3ZSBnb3R0YSBkbyBpdCBoZXJlLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8vIGJlIHN1cmUgdG8gdXNlIHdoYXRldmVyIGhhbmRsZXJyZXNvbHZlciBpcyByZWdpc3RlcmVkIG9uIHRoZSBTZXJ2aWNlCi0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZ2V0QmluZGluZygpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0SGFuZGxlcnMoYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0KLSAgICAgICAgICAgIGluaXRNZXNzYWdlQ29udGV4dChvYmosIHJlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvLyBNaWdyYXRlIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0IGNvbnRleHQgYmFnIHRvCi0gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dC4KLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtTWlncmF0aW9uVG9NZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdENvbnRleHQoKSwgcmVxdWVzdE1zZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vIFBlcmZvcm0gdGhlIFdlYlNlcnZpY2VGZWF0dXJlIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLgotICAgICAgICAgICAgYmluZGluZy5jb25maWd1cmUocmVxdWVzdE1zZ0N0eCwgdGhpcyk7Ci0KLSAgICAgICAgICAgIC8vIFNldHVwIHRoZSBFeGVjdXRvciB0aGF0IHdpbGwgYmUgdXNlZCB0byBkcml2ZSBhc3luYyByZXNwb25zZXMgYmFjayB0byAKLSAgICAgICAgICAgIC8vIHRoZSBjbGllbnQuCi0gICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkbid0IGJlIGdldHRpbmcgdGhpcyBmcm9tIHRoZSBTZXJ2aWNlRGVsZWdhdGUsIHJhdGhlciBlYWNoIAotICAgICAgICAgICAgLy8gRGlzcGF0Y2ggb2JqZWN0IHNob3VsZCBoYXZlIGl0J3Mgb3duLgotICAgICAgICAgICAgRXhlY3V0b3IgZSA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRFeGVjdXRvcigpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0RXhlY3V0b3IoZSk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgQXN5bmNMaXN0ZW5lciB0aGF0IGlzIHRvIGJlIHVzZWQgYnkgdGhlIEludm9jYXRpb25Db250cm9sbGVyLgotICAgICAgICAgICAgQXN5bmNSZXNwb25zZSBsaXN0ZW5lciA9IGNyZWF0ZUFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpOwotICAgICAgICAgICAgaW52b2NhdGlvbkNvbnRleHQuc2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVxdWVzdCB1c2luZyB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIKLSAgICAgICAgICAgIFJlc3BvbnNlIGFzeW5jUmVzcG9uc2UgPSBpYy5pbnZva2VBc3luYyhpbnZvY2F0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbWFpbnRhaW4gc2Vzc2lvbiBzdGF0ZQotICAgICAgICAgICAgY2hlY2tNYWludGFpblNlc3Npb25TdGF0ZShyZXF1ZXN0TXNnQ3R4LCBpbnZvY2F0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXN5bmNocm9ub3VzIChwb2xsaW5nKSBpbnZvY2F0aW9uIHNlbnQ6IEJhc2VEaXNwYXRjaC5pbnZva2VBc3luYygpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBhc3luY1Jlc3BvbnNlOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBBbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biBhcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xpZW50KFNlcnZpY2VDbGllbnQgc2MpIHsKLSAgICAgICAgc2VydmljZUNsaWVudCA9IHNjOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RlIGdldE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZGUoTW9kZSBtKSB7Ci0gICAgICAgIG1vZGUgPSBtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZhdWx0IHRoYXQgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgTWVzc2FnZUNvbnRleHQgZm9yIGFuIGludm9jYXRpb24uIElmIG5vIGZhdWx0Ci0gICAgICogZXhpc3RzLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ3R4Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUV4Y2VwdGlvbiBnZXRGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtc2dDdHguZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsICYmIG1zZy5pc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAvL1hNTEZhdWx0IGZhdWx0ID0gbXNnLmdldFhNTEZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgLy8gNC4zLjIgY29uZm9ybWFuY2UgYnVsbGV0IDEgcmVxdWlyZXMgYSBQcm90b2NvbEV4Y2VwdGlvbiBoZXJlCi0gICAgICAgICAgICAgICAgUHJvdG9jb2xFeGNlcHRpb24gcGUgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlU3lzdGVtRXhjZXB0aW9uKG1zZy5nZXRYTUxGYXVsdCgpLCBtc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiBwZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnQ3R4LmdldExvY2FsRXhjZXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZmFjdG9yeSwgaXQnbGwgdGhyb3cgdGhlIHJpZ2h0IHRoaW5nOgotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZ0N0eC5nZXRMb2NhbEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIEZyZWUgdGhlIGluY29taW5nIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtc2dDdHguZnJlZUlucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgTWVzc2FnZUNvbnRleHQgY29udGFpbmVkIGEgZmF1bHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ3R4Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbXNnQ3R4KSB7Ci0gICAgICAgIGlmIChtc2dDdHguZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgbXNnQ3R4LmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZSBpZiAobXNnQ3R4LmdldExvY2FsRXhjZXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb25maWd1cmUgYW55IHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIG5lZWRlZCBvbiB0aGUgTWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cE1lc3NhZ2VQcm9wZXJ0aWVzKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBlbmFibGVkIE1UT00gb24gdGhlIFNPQVBCaW5kaW5nLCB3ZSBuZWVkCi0gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IGdldHMgcHVzaGVkIHRvIHRoZSBNZXNzYWdlIG9iamVjdC4KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGdldEJpbmRpbmcoKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKWJpbmRpbmc7Ci0gICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcuaXNNVE9NRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIG1zZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBpbnZvY2F0aW9uIGlzIHZhbGlkCi0gICAgKiBnaXZlbiB0aGUgc2NlbmFyaW8gdGhhdCB0aGUgY2xpZW50IGlzIG9wZXJhdGluZyBpbi4gIFRoZXJlIGFyZQotICAgICogc29tZSBjYXNlcyB3aGVuIG51bGxzIGFyZSBhbGxvd2VkIGFuZCBvdGhlcnMgd2hlcmUgaXQgaXMKLSAgICAqIGFuIGVycm9yLgotICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRJbnZvY2F0aW9uUGFyYW0oT2JqZWN0IG9iamVjdCkgewotICAgICAgICBTdHJpbmcgYmluZGluZ0lkID0gZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpOwotCi0gICAgICAgIC8vIElmIG5vIGJpbmRpbmdJZCB3YXMgZm91bmQsIHVzZSB0aGUgZGVmYXVsdC4KLSAgICAgICAgaWYgKGJpbmRpbmdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiaW5kaW5nSWQgPSBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBpdCdzIG5vdCBhbiBIVFRQX0JJTkRJTkcsIHRoZW4gd2UgY2FuIGFsbG93IGZvciBudWxsIHBhcmFtcywgIAotICAgICAgICAvLyBidXQgb25seSBpbiBQQVlMT0FEIG1vZGUgcGVyIEpBWC1XUyBTZWN0aW9uIDQuMy4yLgotICAgICAgICBpZiAoIWJpbmRpbmdJZC5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuTUVTU0FHRSkgJiYgb2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoTnVsbFBhcmFtTWVzc2FnZU1vZGUiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbiBhbGwgY2FzZXMgKFBBWUxPQUQgYW5kIE1FU1NBR0UpIHdlIG11c3QgdGhyb3cgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgICAgICAvLyBpZiB0aGUgcGFyYW1ldGVyIGlzIG51bGwgYW5kIHJlcXVlc3QgbWV0aG9kIGlzIFBPU1Qgb3IgUFVULgotICAgICAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsICYmIGlzUE9TVG9yUFVUUmVxdWVzdCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaE51bGxQYXJhbUh0dHBCaW5kaW5nIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERPTVNvdXJjZSkgewotICAgICAgICAgICAgRE9NU291cmNlIGRzID0gKERPTVNvdXJjZSlvYmplY3Q7Ci0gICAgICAgICAgICBpZiAoZHMuZ2V0Tm9kZSgpID09IG51bGwgJiYgZHMuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaEJhZERPTVNvdXJjZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhciwgdGhlbiBhbGwgaXMgZ29vZC4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BPU1RvclBVVFJlcXVlc3QoKSB7Ci0gICAgICAgIFN0cmluZyBtZXRob2QgPSAoU3RyaW5nKXRoaXMucmVxdWVzdENvbnRleHQuZ2V0KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QpOwotICAgICAgICAvLyBpZiBIVFRQX1JFUVVFU1RfTUVUSE9EIGlzIG5vdCBzcGVjaWZpZWQsIGFzc3VtZSBpdCBpcyBhIFBPU1QgbWV0aG9kCi0gICAgICAgIHJldHVybiAobWV0aG9kID09IG51bGwgfHwgCi0gICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5IRUFERVJfUE9TVC5lcXVhbHNJZ25vcmVDYXNlKG1ldGhvZCkgfHwgCi0gICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5IRUFERVJfUFVULmVxdWFsc0lnbm9yZUNhc2UobWV0aG9kKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTWVzc2FnZSBjcmVhdGVSZXF1ZXN0TWVzc2FnZShPYmplY3Qgb2JqKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG9iamVjdCBpcyBhIHZhbGlkIGludm9jYXRpb24gcGFyYW1ldGVyLiAgCi0gICAgICAgIC8vIFRoZW4gY3JlYXRlIHRoZSBtZXNzYWdlIGZyb20gdGhlIG9iamVjdC4KLSAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIG9jY3VycywgaXQgaXMgbG9jYWwgdG8gdGhlIGNsaWVudCBhbmQgdGhlcmVmb3JlIGlzIGEKLSAgICAgICAgLy8gV2ViU2VydmljZUV4Y2VwdGlvbiAoYW5kIG5vdCBQcm90b2NvbEV4Y2VwdGlvbnMpLgotICAgICAgICAvLyBUaGlzIGNvZGUgY29tcGxpZXMgd2l0aCBKQVgtV1MgMi4wIHNlY3Rpb25zIDQuMy4yLCA0LjMuMyBhbmQgNC4zLjQuCi0gICAgICAgIGlmICghaXNWYWxpZEludm9jYXRpb25QYXJhbShvYmopKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoSW52YWxpZFBhcmFtIikpOwotICAgICAgICB9IAotICAgICAgICBNZXNzYWdlIHJlcXVlc3RNc2cgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgIHJlcXVlc3RNc2cgPSBjcmVhdGVNZXNzYWdlRnJvbVZhbHVlKG9iaik7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvLyBUaGUgd2Vic2VydmljZSBleGNlcHRpb24gd3JhcHMgdGhlIHRocm93biBleGNlcHRpb24uCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0TXNnOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkNzU2Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hPcGVyYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKgotICogSW4gSkFYLVdTIERpc3BhdGNoIGNsaWVudHMgd2UgZG9uJ3Qga25vdyB3aGF0IGFjdHVhbCBvcGVyYXRpb24gd2UgYXJlIGNhbGxpbmcKLSAqIHVudGlsIHRoZSBtZXNzYWdlIGlzIGNvbnZlcnRlZCB0byBhIFNPQVAgZW52ZWxvcGUuIFNvIGxldCdzIHRyeSB0byBmaW5kIHRoZSByZWFsCi0gKiBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGJvZHkgaW4gb3JkZXIgdG8gc2VuZCB0aGUgcmlnaHQgV1NBCi0gKiBhY3Rpb24uCi0gKiAKLSAqIFRoaXMgaGFuZGxlciBzaG91bGQgYmUgaW5zdGFsbGVkIGluIE91dEZsb3cgY2hhaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaE9wZXJhdGlvbkhhbmRsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERpc3BhdGNoT3BlcmF0aW9uSGFuZGxlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbm9ueW1vdXNPcGVyYXRpb24oQXhpc09wZXJhdGlvbiBvcCkgewotICAgICAgICByZXR1cm4gKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1AuZXF1YWxzKG9wLmdldE5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICBTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX09OTFlfT1AuZXF1YWxzKG9wLmdldE5hbWUoKSkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFFOYW1lIGdldEZpcnN0Qm9keUVsZW1lbnQoU09BUEVudmVsb3BlIGVudmVsb3BlKSB7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIGlmIChib2R5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBmaXJzdEVsZW1lbnQgPSBib2R5LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0RWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gZmluZFJlYWxPcGVyYXRpb25BY3Rpb24oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBRTmFtZSBmaXJzdEJvZHlFbGVtZW50ID0gZ2V0Rmlyc3RCb2R5RWxlbWVudChtc2dDb250ZXh0LmdldEVudmVsb3BlKCkpOwotICAgICAgICBpZiAoZmlyc3RCb2R5RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKGZpcnN0Qm9keUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzT3BlcmF0aW9uOyAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOyAgICAgICAKLSAgICAgICAgaWYgKCFtc2dDb250ZXh0LmlzU2VydmVyU2lkZSgpICYmIG9wICE9IG51bGwgJiYgaXNBbm9ueW1vdXNPcGVyYXRpb24ob3ApKSB7Ci0gICAgICAgICAgICBvcCA9IGZpbmRSZWFsT3BlcmF0aW9uQWN0aW9uKG1zZ0NvbnRleHQpOyAgICAgICAgIAotICAgICAgICAgICAgaWYgKG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldEF4aXNPcGVyYXRpb24ob3ApOwotICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkFub255bW91cyBvcGVyYXRpb24gZGV0ZWN0ZWQuIFJlcGxhY2VkIHdpdGggcmVhbCBvcGVyYXRpb246ICIgKyBvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9KQVhCRGlzcGF0Y2guamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9KQVhCRGlzcGF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3NjBkYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSkFYQkRpc3BhdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlhNTFJvb3RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCRGlzcGF0Y2g8VD4gZXh0ZW5kcyBCYXNlRGlzcGF0Y2g8VD4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhCRGlzcGF0Y2guY2xhc3MpOwotICAgIHByaXZhdGUgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgSkFYQkRpc3BhdGNoKFNlcnZpY2VEZWxlZ2F0ZSBzdmNEZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgdGhpcyhzdmNEZWxlZ2F0ZSwgZXBEZXNjLCBudWxsLCBudWxsLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWEJEaXNwYXRjaChTZXJ2aWNlRGVsZWdhdGUgc3ZjRGVsZWdhdGUsCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYywKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgc3VwZXIoc3ZjRGVsZWdhdGUsIGVwRGVzYywgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SkFYQkNvbnRleHQoSkFYQkNvbnRleHQgamJjKSB7Ci0gICAgICAgIGpheGJDb250ZXh0ID0gamJjOwotICAgIH0KLQotICAgIHB1YmxpYyBBc3luY1Jlc3BvbnNlIGNyZWF0ZUFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpIHsKLSAgICAgICAgSkFYQkRpc3BhdGNoQXN5bmNMaXN0ZW5lciBsaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgbmV3IEpBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIoZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgbGlzdGVuZXIuc2V0SkFYQkNvbnRleHQoamF4YkNvbnRleHQpOwotICAgICAgICBsaXN0ZW5lci5zZXRNb2RlKG1vZGUpOwotICAgICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZUZyb21WYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpc3BhdGNoIGludm9rZWQgd2l0aCBudWxsIHBhcmFtZXRlciBWYWx1ZSIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY3JlYXRpbmcgZW1wdHkgc29hcCBtZXNzYWdlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbXB0eU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldENsaWVudEJpbmRpbmdJRCgpKSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoamF4YkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChjbGF6ei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZSBwcm90b2NvbCBvZiB0aGUgTWVzc2FnZSB0aGF0IGlzIGNyZWF0ZWQgc2hvdWxkIGJlIGJhc2VkCi0gICAgICAgICAgICAvLyBvbiB0aGUgYmluZGluZyBpbmZvcm1hdGlvbiBhdmFpbGFibGUuCi0gICAgICAgICAgICBQcm90b2NvbCBwcm90byA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCkpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBibG9jayBmcm9tIHRoZSB2YWx1ZQotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBYTUxSb290RWxlbWVudFV0aWwuZ2V0WG1sUm9vdEVsZW1lbnRRTmFtZUZyb21PYmplY3QodmFsdWUpOwotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBmYWN0b3J5LmNyZWF0ZUZyb20odmFsdWUsIGNvbnRleHQsIHFOYW1lKTsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuUEFZTE9BRCkpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3JtYWwgY2FzZQotCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1mLmNyZWF0ZShwcm90byk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlIG1vZGUuLnJhcmUgY2FzZQotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIE1lc3NhZ2UgZnJvbSBibG9jawotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZi5jcmVhdGVGcm9tKGJsb2NrLCBudWxsLCBwcm90byk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlRnJvbU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZShtZXNzYWdlLCBtb2RlLCBqYXhiQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIGNvZGUgdG8gZ2V0IHRoZSB2YWx1ZSBmb3IgSkFYQkRpc3BhdGNoIGFuZCBKQVhCRGlzcGF0Y2hBc3luY0xpc3RlbmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBtb2RlCi0gICAgICogQHBhcmFtIGpheGJDb250ZXh0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWUoTWVzc2FnZSBtZXNzYWdlLCBNb2RlIG1vZGUsIEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobW9kZS5lcXVhbHMoTW9kZS5QQVlMT0FEKSkgewotICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBDYXNlCi0gICAgICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChKQVhCQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGpheGJDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKGNvbnRleHQsIGZhY3RvcnkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBSRVZJRVcgVGhpcyBzZWVtcyBsaWtlIHRoZSBjb3JyZWN0IGJlaGF2aW9yLiAgSWYgdGhlIGJvZHkgaXMgZW1wdHksIHJldHVybiBhIG51bGwKLSAgICAgICAgICAgICAgICAgICAgLy8gQW55IGNoYW5nZXMgaGVyZSBzaG91bGQgYWxzbyBiZSBtYWRlIHRvIFhNTERpc3BhdGNoLmdldFZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIGluIHRoZSBib2R5IHRvIHVubWFyc2hhbC4gIEpBWEJEaXNwYXRjaCByZXR1cm5zIGEgbnVsbCB2YWx1ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoamF4YkNvbnRleHQpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gbWVzc2FnZS5nZXRWYWx1ZShjb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBubyBlbGVtZW50cyB0byB1bm1hcnNoYWwuICBKQVhCRGlzcGF0Y2ggcmV0dXJucyBhIG51bGwgdmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtZXNzYWdlLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTWVzc2FnZSBjcmVhdGVFbXB0eU1lc3NhZ2UoUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotICAgICAgICByZXR1cm4gbTsKLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9KQVhCRGlzcGF0Y2hBc3luY0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDBjZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0pBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLQotLyoqCi0gKiBUaGUgSkFYQkRpc3BhdGNoQXN5bmNMaXN0ZW5lciBpcyBhbiBleHRlbnNpb24gb2YgdGhlIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlfQotICogY2xhc3MgdG8gcHJvdmlkZSBKQVgtQiBzcGVjaWZpYyBmdW5jdGlvbiB3aGVuIHByb2Nlc3NpbmcgYW4gYXN5bmMgcmVzcG9uc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhCRGlzcGF0Y2hBc3luY0xpc3RlbmVyIGV4dGVuZHMgQXN5bmNSZXNwb25zZSB7Ci0KLSAgICBwcml2YXRlIE1vZGUgbW9kZTsKLSAgICBwcml2YXRlIEpBWEJDb250ZXh0IGpheGJDb250ZXh0OwotCi0gICAgcHVibGljIEpBWEJEaXNwYXRjaEFzeW5jTGlzdGVuZXIoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCkgewotICAgICAgICBzdXBlcihlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG0pIHsKLSAgICAgICAgbW9kZSA9IG07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SkFYQkNvbnRleHQoSkFYQkNvbnRleHQgamJjKSB7Ci0gICAgICAgIGpheGJDb250ZXh0ID0gamJjOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzcG9uc2VWYWx1ZU9iamVjdChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEpBWEJEaXNwYXRjaC5nZXRWYWx1ZShtYy5nZXRNZXNzYWdlKCksIG1vZGUsIGpheGJDb250ZXh0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIEZyZWUgdGhlIGluY29taW5nIHN0cmVhbQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYy5mcmVlSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgcmV0dXJuIEJhc2VEaXNwYXRjaC5nZXRGYXVsdFJlc3BvbnNlKG1jKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvWE1MRGlzcGF0Y2guamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9YTUxEaXNwYXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTI1ODEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9YTUxEaXNwYXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5EYXRhU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5EYXRhU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk9NQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuWE1MU3RyaW5nQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuT01CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbC5PTUJsb2NrRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgWE1MRGlzcGF0Y2g8VD4gZXh0ZW5kcyBCYXNlRGlzcGF0Y2g8VD4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxEaXNwYXRjaC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBDbGFzcyB0eXBlOwotICAgIHByaXZhdGUgQ2xhc3MgYmxvY2tGYWN0b3J5VHlwZTsKLQotICAgIHB1YmxpYyBYTUxEaXNwYXRjaChTZXJ2aWNlRGVsZWdhdGUgc3ZjRGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB0aGlzKHN2Y0RlbGVnYXRlLCBlbmRwb2ludERlc2MsIG51bGwsIG51bGwsIGZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MRGlzcGF0Y2goU2VydmljZURlbGVnYXRlIHN2Y0RlbGVnYXRlLAotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHN1cGVyKHN2Y0RlbGVnYXRlLCBlbmRwb2ludERlc2MsIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgZmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzIGMpIHsKLSAgICAgICAgdHlwZSA9IGM7Ci0gICAgfQotCi0gICAgcHVibGljIEFzeW5jUmVzcG9uc2UgY3JlYXRlQXN5bmNSZXNwb25zZUxpc3RlbmVyKCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbmV3IEFzeW5jTGlzdGVuZXIgZm9yIFhNTERpc3BhdGNoIik7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxEaXNwYXRjaEFzeW5jTGlzdGVuZXIgYWwgPSBuZXcgWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyKGdldEVuZHBvaW50RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIGFsLnNldE1vZGUobW9kZSk7Ci0gICAgICAgIGFsLnNldFR5cGUodHlwZSk7Ci0gICAgICAgIGFsLnNldEJsb2NrRmFjdG9yeVR5cGUoYmxvY2tGYWN0b3J5VHlwZSk7Ci0gICAgICAgIHJldHVybiBhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlRnJvbVZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IHZhbHVlLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlciB0eXBlOiAiICsgdHlwZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSBtb2RlOiAiICsgbW9kZS5uYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEaXNwYXRjaCBpbnZva2VkIHdpdGggbnVsbCBwYXJhbWV0ZXIgVmFsdWUiKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNyZWF0aW5nIGVtcHR5IHNvYXAgbWVzc2FnZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBibG9ja0ZhY3RvcnlUeXBlID0gZ2V0QmxvY2tGYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVtcHR5TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCkpKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgQmxvY2sgYmxvY2sgPSBudWxsOwotICAgICAgICBibG9ja0ZhY3RvcnlUeXBlID0gZ2V0QmxvY2tGYWN0b3J5KHZhbHVlKTsKLSAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkgPSAoQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KGJsb2NrRmFjdG9yeVR5cGUpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9hZGVkIGJsb2NrIGZhY3RvcnkgdHlwZSBbIiArIGJsb2NrRmFjdG9yeVR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgcHJvdG9jb2wgb2YgdGhlIE1lc3NhZ2UgdGhhdCBpcyBjcmVhdGVkIHNob3VsZCBiZSBiYXNlZAotICAgICAgICAvLyBvbiB0aGUgYmluZGluZyBpbmZvcm1hdGlvbiBhdmFpbGFibGUuCi0gICAgICAgIFByb3RvY29sIHByb3RvID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLlBBWUxPQUQpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgYmxvY2sgPSBmYWN0b3J5LmNyZWF0ZUZyb20odmFsdWUsIG51bGwsIG51bGwpOwotCi0KLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWYuY3JlYXRlKHByb3RvKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobW9kZS5lcXVhbHMoTW9kZS5NRVNTQUdFKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBjb250YWlucyBqdXN0IHRoZSB4bWwgZGF0YSwgdGhlbiB5b3UgY2FuIGNyZWF0ZSB0aGUgTWVzc2FnZSBkaXJlY3RseSBmcm9tIHRoZQotICAgICAgICAgICAgICAgIC8vIEJsb2NrLiAgSWYgdGhlIHZhbHVlIGNvbnRhaW5zIGF0dGFjaG1lbnRzLCB5b3UgbmVlZCB0byBkbyBtb3JlLgotICAgICAgICAgICAgICAgIC8vIFRPRE8gRm9yIG5vdyB0aGUgb25seSB2YWx1ZSB0aGF0IGNvbnRhaW5zIEF0dGFjaG1lbnRzIGlzIFNPQVBNZXNzYWdlCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU09BUE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1mLmNyZWF0ZUZyb20oKFNPQVBNZXNzYWdlKXZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbSh2YWx1ZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZi5jcmVhdGVGcm9tKGJsb2NrLCBudWxsLCBwcm90byk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUZyb21NZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWUobWVzc2FnZSwgbW9kZSwgYmxvY2tGYWN0b3J5VHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tbW9uIGNvZGUgdXNlZCBieSBYTUxEaXNwYXRjaCBhbmQgWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4gb2JqZWN0Ci0gICAgICovCi0gICAgc3RhdGljIE9iamVjdCBnZXRWYWx1ZShNZXNzYWdlIG1lc3NhZ2UsIE1vZGUgbW9kZSwgQ2xhc3MgYmxvY2tGYWN0b3J5VHlwZSkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICBCbG9jayBibG9jayA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gZ2V0IHRoZSB2YWx1ZSBvYmplY3QgZnJvbSB0aGUgcmV0dXJuZWQgbWVzc2FnZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLlBBWUxPQUQpKSB7Ci0gICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkgPSAoQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZhY3RvcnkoYmxvY2tGYWN0b3J5VHlwZSk7Ci0gICAgICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEJvZHlCbG9jayhudWxsLCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPTUJsb2NrRmFjdG9yeUltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKChPTUJsb2NrKXZhbHVlKS5nZXRPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJFVklFVyBUaGlzIHNlZW1zIGxpa2UgdGhlIGNvcnJlY3QgYmVoYXZpb3IuICBJZiB0aGUgYm9keSBpcyBlbXB0eSwgcmV0dXJuIGEgbnVsbAotICAgICAgICAgICAgICAgICAgICAvLyBBbnkgY2hhbmdlcyBoZXJlIHNob3VsZCBhbHNvIGJlIG1hZGUgdG8gWE1MRGlzcGF0Y2guZ2V0VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGVyZSBhcmUgbm8gZWxlbWVudHMgaW4gdGhlIGJvZHkgdG8gdW5tYXJzaGFsLiAgWE1MRGlzcGF0Y2ggcmV0dXJucyBhIG51bGwgdmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuZXF1YWxzKE1vZGUuTUVTU0FHRSkpIHsKLSAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IChCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoYmxvY2tGYWN0b3J5VHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBPTUJsb2NrRmFjdG9yeUltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoT01FbGVtZW50KW1lc3NhZ2UuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1lc3NhZ2UuZ2V0VmFsdWUobnVsbCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIHRvIHVubWFyc2hhbC4gIFhNTERpc3BhdGNoIHJldHVybnMgYSBudWxsIHZhbHVlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBjcmVhdGluZyB0aGUgYmxvY2siKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0dXJuaW5nIGEgbnVsbCB2YWx1ZSIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0dXJuaW5nIHZhbHVlIG9mIHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzcyBnZXRCbG9ja0ZhY3RvcnkoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIj4+IHJldHVybmluZyBTb3VyY2VCbG9ja0ZhY3RvcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoRGF0YVNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG8uZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIERhdGFTb3VyY2VCbG9ja0ZhY3RvcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBEYXRhU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oby5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgU09BUE1lc3NhZ2VGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBFbnZlbG9wZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG8uZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIFNPQVBFbnZlbG9wZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChPTUVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIj4+IHJldHVybmluZyBPTUJsb2NrRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9NQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiBFUlJPUjogRmFjdG9yeSBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGdldEJsb2NrRmFjdG9yeSgpIHsKLQotICAgICAgICBpZiAoU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgU291cmNlQmxvY2tGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiPj4gcmV0dXJuaW5nIFNPQVBNZXNzYWdlRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChTT0FQRW52ZWxvcGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiByZXR1cm5pbmcgU09BUEVudmVsb3BlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKE9NRWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIj4+IHJldHVybmluZyBPTUJsb2NrRmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9NQmxvY2tGYWN0b3J5LmNsYXNzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCI+PiBFUlJPUjogRmFjdG9yeSBub3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lc3NhZ2UgY3JlYXRlRW1wdHlNZXNzYWdlKFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLSAgICAgICAgcmV0dXJuIG07Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0TWVzc2FnZUNvbnRleHQoT2JqZWN0IG9iaiwgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCkgewotICAgICAgICBzdXBlci5pbml0TWVzc2FnZUNvbnRleHQob2JqLCByZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgaWYob2JqIGluc3RhbmNlb2YgRGF0YVNvdXJjZSl7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfRk9STUFUVEVSLCAKLSAgICAgICAgICAgICAgICAgICAgbmV3IERhdGFTb3VyY2VGb3JtYXR0ZXIoKChEYXRhU291cmNlKW9iaikuZ2V0Q29udGVudFR5cGUoKSkpOyAgICAKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL1hNTERpc3BhdGNoQXN5bmNMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL1hNTERpc3BhdGNoQXN5bmNMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk4Njc2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9YTUxEaXNwYXRjaEFzeW5jTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuYXN5bmMuQXN5bmNSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLQotLyoqCi0gKiBUaGUgWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2V9Ci0gKiBjbGFzcyB0byBwcm92aWRlIHByb3BlciBkZXNlcmlhbGl6YXRpb24gaW50byB0aGUgdGFyZ2V0IGZvcm1hdCAoWE1MIFN0cmluZyBvciBTb3VyY2UpLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRGlzcGF0Y2hBc3luY0xpc3RlbmVyIGV4dGVuZHMgQXN5bmNSZXNwb25zZSB7Ci0KLSAgICBwcml2YXRlIE1vZGUgbW9kZTsKLSAgICBwcml2YXRlIENsYXNzIHR5cGU7Ci0gICAgcHJpdmF0ZSBDbGFzcyBibG9ja0ZhY3RvcnlUeXBlOwotCi0gICAgcHVibGljIFhNTERpc3BhdGNoQXN5bmNMaXN0ZW5lcihFbmRwb2ludERlc2NyaXB0aW9uIGVkKSB7Ci0gICAgICAgIHN1cGVyKGVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKE1vZGUgbSkgewotICAgICAgICBtb2RlID0gbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENsYXNzIHQpIHsKLSAgICAgICAgdHlwZSA9IHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmxvY2tGYWN0b3J5VHlwZShDbGFzcyB0KSB7Ci0gICAgICAgIGJsb2NrRmFjdG9yeVR5cGUgPSB0OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVzcG9uc2VWYWx1ZU9iamVjdChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFhNTERpc3BhdGNoLmdldFZhbHVlKG1jLmdldE1lc3NhZ2UoKSwgbW9kZSwgYmxvY2tGYWN0b3J5VHlwZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBGcmVlIGluY29taW5nIHN0cmVhbQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtYy5mcmVlSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGdldEZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgcmV0dXJuIEJhc2VEaXNwYXRjaC5nZXRGYXVsdFJlc3BvbnNlKG1jKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvSkFYV1NQcm94eUhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9KQVhXU1Byb3h5SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QzODQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9KQVhXU1Byb3h5SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQucHJveHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmZhY3RvcnkuTWV0aG9kTWFyc2hhbGxlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLm1pZ3JhdG9yLkFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLS8qKgotICogUHJveHlIYW5kbGVyIGlzIHRoZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciBpbXBsZW1lbnRhdGlvbi4gV2hlbiBhIEpBWC1XUyBjbGllbnQKLSAqIGNhbGxzIHRoZSBtZXRob2Qgb24gYSBwcm94eSBvYmplY3QsIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgU2VydmljZURlbGVnYXRlLmdldFBvcnQoLi4uKSBtZXRob2QsCi0gKiB0aGUgaW5vdmtlIG1ldGhvZCBvbiB0aGUgUHJveHlIYW5kbGVyIGlzIGNhbGxlZC4KLSAqIDxwLz4KLSAqIFByb3h5SGFuZGxlciB1c2VzIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRvciBhbmQgZmluZHMgb3V0IGlmIDEpIFRoZSBjbGllbnQgY2FsbCBpcyBEb2N1bWVudAotICogTGl0ZXJhbCBvciBScGMgTGl0ZXJhbCAyKSBUaGUgV1NETCBpcyB3cmFwcGVkIG9yIHVuV3JhcHBlZC4KLSAqIDxwLz4KLSAqIFByb3h5SGFuZGxlciB0aGVuIHJlYWRzIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHVzaW5nIE1ldGhvZCBuYW1lIGNhbGxlZCBieSBDbGllbnQgRnJvbQotICogT3BlcmF0aW9uRGVzY3JpcHRpb24gaXQgZG9lcyB0aGUgZm9sbG93aW5nIDEpIGlmIHRoZSB3c2RsIGlzV3JhcHBlZCgpIHJlYWRzIFJlcXVlc3RXcmFwcGVyIENsYXNzCi0gKiBhbmQgcmVzcG9uc2VXcmFwcGVyQ2xhc3MgMikgdGhlbiByZWFkcyB0aGUgd2ViUGFyYW1zIGZvciB0aGUgT3BlcmF0aW9uLgotICogPHAvPgotICogaXNXcmFwcGVkKCkgPSB0cnVlICBhbmQgRG9jTGl0ZXJhbCB0aGVuIFByb3h5SGFuZGxlciB0aGVuIHVzZXMgV3JhcHBlclRvb2wgdG8gY3JlYXRlIFJlcXVlc3QgdGhhdAotICogaXMgYSBXcmFwcGVkIEpBWEJPYmplY3QuIENyZWF0ZXMgSkFYQkJsb2NrIHVzaW5nIEpBWEJCbG9ja0ZhY3RvcnkgQ3JlYXRlcyBNZXNzYWdlQ29udGV4dC0+TWVzc2FnZQotICogYW5kIHNldHMgSkFYQkJsb2NrIHRvIHhtbFBhcnQgYXMgUmVxdWVzdE1zZ0N0eCBpbiBJbnZvY2F0aW9uQ29udGV4dC4gTWFrZXMgY2FsbCB0bwotICogSW52b2NhdGlvbkNvbnRyb2xsZXIuIFJlYWRzIFJlc3BvbnNlTXNnQ3R4IC0+TWVzc2FnZUN0eC0+TWVzc2FnZS0+WE1MUGFydC4gQ29udmVydHMgdGhhdCB0bwotICogSkFYQmxvY2sgdXNpbmcgSkFYQkJsb2NrRmFjdG9yeSBhbmQgcmV0dXJucyB0aGUgQk8gZnJvbSB0aGlzIEpBWEJCbG9jay4KLSAqIDxwLz4KLSAqIGlzV3JhcHBlZCgpICE9IHRydWUgYW5kIERvY0xpdGVyYWwgdGhlbiBQcm94eUhhbmRsZXIgY3JlYXRlcyB0aGUgSkFYQkJsb2NrIGZvciB0aGUgaW5wdXQgcmVxdWVzdAotICogY3JlYXRlcyBhIE1lc3NhZ2VDb250ZXh0IHRoYXQgaXMgdGhlbiB1c2VkIGJ5IElidm9jYXRpb25Db250cm9sbGVyIHRvIGludm9rZS4gUmVzcG9uc2UgaXMgcmVhZAotICogYW5kIHJldHVybiBvYmplY3QgaXMgZGVyaXZlZCB1c2luZyBAV2VicmVzdWx0IGFubm90YXRpb24uIEEgSkFYQkJsb2NrIGlzIGNyZWF0ZWQgZnJvbSB0aGUKLSAqIFJlc3BvbnNlIGFuZCB0aGUgQk8gZnJvbSBKQVhCQmxvY2sgaXMgcmV0dXJuZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIEpBWFdTUHJveHlIYW5kbGVyIGV4dGVuZHMgQmluZGluZ1Byb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgSW52b2NhdGlvbkhhbmRsZXIgewotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhXU1Byb3h5SGFuZGxlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENsYXNzIHNlaUNsYXp6ID0gbnVsbDsKLSAgICBwcml2YXRlIE1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgIAotICAgIC8vUmVmZXJlbmNlIHRvIFNlcnZpY2VEZWxlZ2F0ZSBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgUHJveHkKLSAgICBwcm90ZWN0ZWQgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBJbnZvY2F0aW9uQ29udHJvbGxlciBjb250cm9sbGVyOwotICAgIAotICAgIHB1YmxpYyBKQVhXU1Byb3h5SGFuZGxlcihTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaUNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgdGhpcyhkZWxlZ2F0ZSwgc2VpQ2xhenosIGVwRGVzYywgbnVsbCwgbnVsbCwgZmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBKQVhXU1Byb3h5SGFuZGxlcihTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUsCi0gICAgICAgICAgICBDbGFzcyBzZWlDbGF6eiwKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjLAotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICBzdXBlcihkZWxlZ2F0ZSwgZXBEZXNjLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMuc2VpQ2xhenogPSBzZWlDbGF6ejsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRGVzYyA9IGRlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXIjaW52b2tlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCwgamF2YS5sYW5nLk9iamVjdFtdKQotICAgICoKLSAgICAqIEludm9rZXMgdGhlIG1ldGhvZCB0aGF0IHdhcyBjYWxsZWQgb24gdGhlIGphdmEubGFuZy5yZWZsZWN0LlByb3h5IGluc3RhbmNlLgotICAgICovCi0gICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1waW5nIHRvIGludm9rZSBNZXRob2Q6ICIgKyBtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOwotCi0gICAgICAgIGlmICghaXNWYWxpZE1ldGhvZENhbGwobWV0aG9kKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJveHlFcnIxIiwgbWV0aG9kLmdldE5hbWUoKSwgc2VpQ2xhenouZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzUHVibGljKG1ldGhvZCkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInByb3h5UHJpdmF0ZU1ldGhvZCIsIG1ldGhvZC5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0JpbmRpbmdQcm92aWRlckludm9rZWQobWV0aG9kKSkgewotICAgICAgICAgICAgLy8gU2luY2UgdGhlIEpBWC1XUyBwcm94eSBpbnN0YW5jZSBtdXN0IGFsc28gaW1wbGVtZW50IHRoZSBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyCi0gICAgICAgICAgICAvLyBpbnRlcmZhY2UsIHRoaXMgb2JqZWN0IG11c3QgaGFuZGxlIHRob3NlIGludm9jYXRpb25zIGFzIHdlbGwuICBJbiB0aGF0IGNhc2UsIHdlJ2xsCi0gICAgICAgICAgICAvLyBkZWxlZ2F0ZSB0aG9zZSBjYWxscyB0byB0aGUgQmluZGluZ1Byb3ZpZGVyIG9iamVjdC4KLSAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbnZva2luZyBhIHB1YmxpYyBtZXRob2Qgb24gdGhlIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIgaW50ZXJmYWNlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0aGlzLCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgaW52b2tpbmcgdGhlIG1ldGhvZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldE9wZXJhdGlvbihtZXRob2QpOwotICAgICAgICAgICAgaWYgKGlzTWV0aG9kRXhjbHVkZWQob3BlcmF0aW9uRGVzYykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicHJveHlFeGNsdWRlZE1ldGhvZCIsIG1ldGhvZC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnZva2VTRUlNZXRob2QobWV0aG9kLCBhcmdzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiBQZXJmb3JtcyB0aGUgaW52b2NhdGlvbiBvZiB0aGUgbWV0aG9kIGRlZmluZWQgb24gdGhlIFNlcnZpY2UgRW5kcG9pbnQKLSAgICAqIEludGVyZmFjZS4KLSAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGludm9rZVNFSU1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gaW52b2tlIFNFSSBNZXRob2QgIiArIG1ldGhvZC5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRPcGVyYXRpb24obWV0aG9kKTsKLQotICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dAotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCByZXF1ZXN0SUMgPSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlSW52b2NhdGlvbkNvbnRleHQobnVsbCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBjcmVhdGVSZXF1ZXN0KG1ldGhvZCwgYXJncyk7Ci0gICAgICAgIHJlcXVlc3Quc2V0RW5kcG9pbnREZXNjcmlwdGlvbihnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXF1ZXN0LnNldE9wZXJhdGlvbkRlc2NyaXB0aW9uKG9wZXJhdGlvbkRlc2MpOwotCi0gICAgICAgIC8vIEVuYWJsZSBNVE9NIG9uIHRoZSBNZXNzYWdlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgc2V0IG9uIHRoZSBTT0FQQmluZGluZy4KLSAgICAgICAgQmluZGluZyBibmQgPSAoQmluZGluZykgZ2V0QmluZGluZygpOwotICAgICAgICBpZiAoYm5kICE9IG51bGwgJiYgYm5kIGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLSAgICAgICAgICAgIGlmICgoKFNPQVBCaW5kaW5nKWJuZCkuaXNNVE9NRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSByZXF1ZXN0TXNnID0gcmVxdWVzdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdE1zZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogVE9ETzogcmV2aWV3OiBtYWtlIHN1cmUgdGhlIGhhbmRsZXJzIGFyZSBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWFdTIHJ1bnRpbWUgZG9lcyBub3QgdXNlIEVuZHBvaW50LCB3aGljaAotICAgICAgICAgKiB3b3VsZCBub3JtYWxseSBiZSB0aGUgcGxhY2UgdG8gaW5pdGlhbGl6ZSBhbmQgc3RvcmUgdGhlIGhhbmRsZXIgbGlzdC4KLSAgICAgICAgICogSW4gbGlldSBvZiB0aGF0LCB3ZSB3aWxsIGhhdmUgdG8gaW50aWFsaXplIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSAKLSAgICAgICAgICogSW52b2NhdGlvbkNvbnRleHQuICBhbHNvIHNlZSB0aGUgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5LiAgT24gdGhlIGNsaWVudAotICAgICAgICAgKiBzaWRlLCB0aGUgYmluZGluZyBpcyBub3QgeWV0IHNldCB3aGVuIHdlIGNhbGwgaW50byB0aGF0IGZhY3RvcnksIHNvIHRoZQotICAgICAgICAgKiBoYW5kbGVyIGxpc3QgZG9lc24ndCBnZXQgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBvYmplY3QgdGhlcmUuICBUaHVzCi0gICAgICAgICAqIHdlIGdvdHRhIGRvIGl0IGhlcmUuCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgLy8gYmUgc3VyZSB0byB1c2Ugd2hhdGV2ZXIgaGFuZGxlcnJlc29sdmVyIGlzIHJlZ2lzdGVyZWQgb24gdGhlIFNlcnZpY2UKLSAgICAgICAgcmVxdWVzdElDLnNldEhhbmRsZXJzKGJuZC5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0KLSAgICAgICAgcmVxdWVzdElDLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsKLSAgICAgICAgcmVxdWVzdElDLnNldFNlcnZpY2VDbGllbnQoc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VDbGllbnQoZW5kcG9pbnREZXNjLmdldFBvcnRRTmFtZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBpZiBTRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZIGlzIHRydWUsIGFuZCB0aGUgY2xpZW50IGFwcCBoYXMgZXhwbGljaXRseSBzZXQgYSBIRUFERVJfQ09PS0lFIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQsIGFzc3VtZSB0aGUgY2xpZW50Ci0gICAgICAgICAqIGFwcCBpcyBleHBlY3RpbmcgdGhlIEhFQURFUl9DT09LSUUgdG8gYmUgdGhlIHNlc3Npb24gaWQuICBJZiB3ZSB3ZXJlIGVzdGFibGlzaGluZyBhIG5ldyBzZXNzaW9uLCBubyBjb29raWUgd291bGQgYmUgc2VudCwgYW5kIHRoZSAKLSAgICAgICAgICogc2VydmVyIHdvdWxkIHJlcGx5IHdpdGggYSAiU2V0LUNvb2tpZSIgaGVhZGVyLCB3aGljaCBpcyBjb3BpZWQgYXMgYSAiQ29va2llIi1rZXllZCBwcm9wZXJ0eSB0byB0aGUgc2VydmljZSBjb250ZXh0IGR1cmluZyByZXNwb25zZS4KLSAgICAgICAgICogSW4gdGhpcyBjYXNlLCBpZiB3ZSBzdWNjZWVkIGluIHVzaW5nIGFuIGV4aXN0aW5nIHNlcnZlciBzZXNzaW9uLCBubyAiU2V0LUNvb2tpZSIgaGVhZGVyIHdpbGwgYmUgcmV0dXJuZWQsIGFuZCB0aGVyZWZvcmUgbm8KLSAgICAgICAgICogIkNvb2tpZSIta2V5ZWQgcHJvcGVydHkgd291bGQgYmUgc2V0IG9uIHRoZSBzZXJ2aWNlIGNvbnRleHQuICBTbywgbGV0J3MgY29weSBvdXIgcmVxdWVzdCBjb250ZXh0IEhFQURFUl9DT09LSUUga2V5IHRvIHRoZSBzZXJ2aWNlCi0gICAgICAgICAqIGNvbnRleHQgbm93IHRvIHByZXZlbnQgdGhlICJubyBjb29raWUiIGV4Y2VwdGlvbiBpbiBCaW5kaW5nUHJvdmlkZXIuc2V0dXBTZXNzaW9uQ29udGV4dC4gIEl0IGlzIHBvc3NpYmxlIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAgICAgKiBzZXNzaW9ucywgaW4gd2hpY2ggY2FzZSBubyBlcnJvciBvY2N1cnMsIGJ1dCB0aGUgY2xpZW50IGFwcCB3b3VsZCBhc3N1bWUgaXQgaXMgcGFydGljaXBhdGluZyBpbiBhIHNlc3Npb24uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKHJlcXVlc3RDb250ZXh0LmNvbnRhaW5zS2V5KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKSkgJiYgKChCb29sZWFuKXJlcXVlc3RDb250ZXh0LmdldChCaW5kaW5nUHJvdmlkZXIuU0VTU0lPTl9NQUlOVEFJTl9QUk9QRVJUWSkpKSB7Ci0gICAgICAgICAgICBpZiAoKHJlcXVlc3RDb250ZXh0LmNvbnRhaW5zS2V5KEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSkpICYmIChyZXF1ZXN0Q29udGV4dC5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SUMuZ2V0U2VydmljZUNsaWVudCgpLmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJQy5nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0U2VydmljZUNvbnRleHQoKS5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUsIHJlcXVlc3RDb250ZXh0LmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9DT09LSUUpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNsaWVudC1hcHAgZGVmaW5lZCBDb29raWUgcHJvcGVydHkgKGFzc3VtZSB0byBiZSBzZXNzaW9uIGNvb2tpZSkgb24gcmVxdWVzdCBjb250ZXh0IGNvcGllZCB0byBzZXJ2aWNlIGNvbnRleHQuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIENhdXRpb246ICBzZXJ2ZXIgbWF5IG9yIG1heSBub3Qgc3VwcG9ydCBzZXNzaW9ucywgYnV0IGNsaWVudCBhcHAgd2lsbCBub3QgYmUgaW5mb3JtZWQgd2hlbiBub3Qgc3VwcG9ydGVkLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBNaWdyYXRlIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0IGNvbnRleHQgYmFnIHRvCi0gICAgICAgIC8vIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0LgotICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybU1pZ3JhdGlvblRvTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgCi0gICAgICAgICAgICAgICAgZ2V0UmVxdWVzdENvbnRleHQoKSwgcmVxdWVzdCk7Ci0KLSAgICAgICAgLy8gUGVyZm9ybSB0aGUgV2ViU2VydmljZUZlYXR1cmUgY29uZmlndXJhdGlvbiByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCi0gICAgICAgIGJuZC5jb25maWd1cmUocmVxdWVzdCwgdGhpcyk7Ci0KLSAgICAgICAgLy8gV2UnbGwgbmVlZCBhbiBJbnZvY2F0aW9uQ29udHJvbGxlciBpbnN0YW5jZSB0byBzZW5kIHRoZSByZXF1ZXN0LgotICAgICAgICBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkgaWNmID0gKEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgY29udHJvbGxlciA9IGljZi5nZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWlzc2luZ0ludm9jYXRpb25Db250cm9sbGVyIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayBpZiB0aGUgY2FsbCBpcyBPbmVXYXksIEFzeW5jIG9yIFN5bmMKLSAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPbmVXYXkgQ2FsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udHJvbGxlci5pbnZva2VPbmVXYXkocmVxdWVzdElDKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbWFpbnRhaW4gc2Vzc2lvbiBzdGF0ZQotICAgICAgICAgICAgY2hlY2tNYWludGFpblNlc3Npb25TdGF0ZShyZXF1ZXN0LCByZXF1ZXN0SUMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgPT0gRnV0dXJlLmNsYXNzKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFzeW5jIENhbGxiYWNrIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vR2V0IEFzeW5jSGFuZGxlciBmcm9tIE9iamVjdHMgYW5kIHNlbnQgdGhhdCB0byBJbnZva2VBc3luYwotICAgICAgICAgICAgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlciA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBhcmdzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsICYmIEFzeW5jSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iai5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICBhc3luY0hhbmRsZXIgPSAoQXN5bmNIYW5kbGVyKW9iajsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGUgaW52b2NhdGlvbiB0byBjb250aW51ZSBpZiB0aGUgaW52b2NhdGlvbiByZXF1aXJlcyBhIGNhbGxiYWNrCi0gICAgICAgICAgICAvLyBvYmplY3QsIGJ1dCBub25lIHdhcyBzdXBwbGllZC4KLSAgICAgICAgICAgIGlmIChhc3luY0hhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm94eU51bGxDYWxsYmFjayIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFzeW5jUmVzcG9uc2UgbGlzdGVuZXIgPSBjcmVhdGVQcm94eUxpc3RlbmVyKGFyZ3MsIG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgcmVxdWVzdElDLnNldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIGlmICgoc2VydmljZURlbGVnYXRlLmdldEV4ZWN1dG9yKCkgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHNlcnZpY2VEZWxlZ2F0ZS5nZXRFeGVjdXRvcigpIGluc3RhbmNlb2YgRXhlY3V0b3JTZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBlcyA9IChFeGVjdXRvclNlcnZpY2Upc2VydmljZURlbGVnYXRlLmdldEV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVzLmlzU2h1dGRvd24oKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXhlY3V0b3Igc2VydmljZSBpcyBzaHV0ZG93biBhbmQgd29uJ3QgYWNjZXB0IG5ldyB0YXNrcwotICAgICAgICAgICAgICAgICAgICAvLyBzbyByZXR1cm4gYW4gZXJyb3IgYmFjayB0byB0aGUgY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRXhlY3V0b3JTaHV0ZG93biIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcXVlc3RJQy5zZXRFeGVjdXRvcihzZXJ2aWNlRGVsZWdhdGUuZ2V0RXhlY3V0b3IoKSk7Ci0KLSAgICAgICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBjb250cm9sbGVyLmludm9rZUFzeW5jKHJlcXVlc3RJQywgYXN5bmNIYW5kbGVyKTsKLQotICAgICAgICAgICAgLy9DaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBtYWludGFpbiBzZXNzaW9uIHN0YXRlCi0gICAgICAgICAgICBjaGVja01haW50YWluU2Vzc2lvblN0YXRlKHJlcXVlc3QsIHJlcXVlc3RJQyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBmdXR1cmU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBSZXNwb25zZS5jbGFzcykgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luYyBQb2xsaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3luY1Jlc3BvbnNlIGxpc3RlbmVyID0gY3JlYXRlUHJveHlMaXN0ZW5lcihhcmdzLCBvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgICAgIHJlcXVlc3RJQy5zZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgcmVxdWVzdElDLnNldEV4ZWN1dG9yKHNlcnZpY2VEZWxlZ2F0ZS5nZXRFeGVjdXRvcigpKTsKLQotICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjb250cm9sbGVyLmludm9rZUFzeW5jKHJlcXVlc3RJQyk7Ci0KLSAgICAgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbWFpbnRhaW4gc2Vzc2lvbiBzdGF0ZQotICAgICAgICAgICAgY2hlY2tNYWludGFpblNlc3Npb25TdGF0ZShyZXF1ZXN0LCByZXF1ZXN0SUMpOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW9wZXJhdGlvbkRlc2MuaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgcmVzcG9uc2VJQyA9IGNvbnRyb2xsZXIuaW52b2tlKHJlcXVlc3RJQyk7Ci0KLSAgICAgICAgICAgIC8vQ2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gbWFpbnRhaW4gc2Vzc2lvbiBzdGF0ZQotICAgICAgICAgICAgY2hlY2tNYWludGFpblNlc3Npb25TdGF0ZShyZXF1ZXN0LCByZXF1ZXN0SUMpOwotCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZUNvbnRleHQgPSByZXNwb25zZUlDLmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTWlncmF0ZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dCBiYWNrCi0gICAgICAgICAgICAvLyB0byB0aGUgY2xpZW50IHJlc3BvbnNlIGNvbnRleHQgYmFnLgotICAgICAgICAgICAgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Gcm9tTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIAotICAgICAgICAgICAgICAgICAgICBnZXRSZXNwb25zZUNvbnRleHQoKSwgcmVzcG9uc2VDb250ZXh0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IHJlc3BvbnNlT2JqID0gY3JlYXRlUmVzcG9uc2UobWV0aG9kLCBhcmdzLCByZXNwb25zZUNvbnRleHQsIG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlT2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQXN5bmNSZXNwb25zZSBjcmVhdGVQcm94eUxpc3RlbmVyKE9iamVjdFtdIGFyZ3MsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpIHsKLSAgICAgICAgUHJveHlBc3luY0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3h5QXN5bmNMaXN0ZW5lcihvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgbGlzdGVuZXIuc2V0SGFuZGxlcih0aGlzKTsKLSAgICAgICAgbGlzdGVuZXIuc2V0SW5wdXRBcmdzKGFyZ3MpOwotICAgICAgICByZXR1cm4gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBc3luYygpIHsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZE5hbWUuZW5kc1dpdGgoIkFzeW5jIikgJiYgKHJldHVyblR5cGUuaXNBc3NpZ25hYmxlRnJvbShSZXNwb25zZS5jbGFzcykgfHwKLSAgICAgICAgICAgICAgICByZXR1cm5UeXBlLmlzQXNzaWduYWJsZUZyb20oRnV0dXJlLmNsYXNzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQgZm9yIHRoZSBtZXRob2QgY2FsbC4gVGhpcyByZXF1ZXN0IGNvbnRleHQgd2lsbCBiZSB1c2VkIGJ5Ci0gICAgICogSW52b2NhdGlvbkNvbnRyb2xsZXIgdG8gcm91dGUgdGhlIG1ldGhvZCBjYWxsIHRvIGF4aXMgZW5naW5lLgotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2QgaW52b2tlZCBvbiB0aGUgcHJveHkgb2JqZWN0LgotICAgICAqIEBwYXJhbSBhcmdzICAgLSBUaGUgcGFyYW1ldGVyIGxpc3QKLSAgICAgKiBAcmV0dXJuIEEgTWVzc2FnZUNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhlIGludm9jYXRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgY3JlYXRlUmVxdWVzdChNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGEgbmV3IE1lc3NhZ2UgdXNpbmcgdGhlIHJlcXVlc3QgcGFyYW1ldGVycy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0T3BlcmF0aW9uKG1ldGhvZCk7Ci0KLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkuZ2V0TWFyc2hhbGxlcihvcGVyYXRpb25EZXNjLCB0cnVlLCBudWxsKQotICAgICAgICAgICAgICAgIC5tYXJzaGFsUmVxdWVzdChhcmdzLCBvcGVyYXRpb25EZXNjKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVxdWVzdCBNZXNzYWdlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICByZXF1ZXN0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJlcXVlc3QgTWVzc2FnZUNvbnRleHQgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgZm9yIHRoZSBtZXRob2QgY2FsbC4gVGhpcyByZXNwb25zZSBjb250ZXh0IHdpbGwgYmUgdXNlZCB0bwotICAgICAqIGNyZWF0ZSByZXNwb25zZSByZXN1bHQgdG8gdGhlIGNsaWVudCBjYWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZCAgICAgICAgICAtIFRoZSBtZXRob2QgaW52b2tlZCBvbiB0aGUgcHJveHkgb2JqZWN0LgotICAgICAqIEBwYXJhbSBhcmdzICAgICAgICAgICAgLSBUaGUgcGFyYW1ldGVyIGxpc3QuCi0gICAgICogQHBhcmFtIHJlc3BvbnNlQ29udGV4dCAtIFRoZSBNZXNzYWdlQ29udGV4dCB0byBiZSB1c2VkIGZvciB0aGUgcmVzcG9uc2UuCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbkRlc2MgICAtIFRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbiB0aGF0IGZvciB0aGUgaW52b2tlZCBtZXRob2QuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlUmVzcG9uc2UoTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncywgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE1lc3NhZ2UgcmVzcG9uc2VNc2cgPSByZXNwb25zZUNvbnRleHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb2Nlc3NpbmcgdGhlIHJlc3BvbnNlIE1lc3NhZ2UgdG8gY3JlYXRlIHRoZSByZXR1cm4gdmFsdWUocykuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpbmQgb3V0IGlmIHRoZXJlIHdhcyBhIGZhdWx0IG9uIHRoZSByZXNwb25zZSBhbmQgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSAKLSAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0eXBlLgotICAgICAgICAgICAgaWYgKGhhc0ZhdWx0UmVzcG9uc2UocmVzcG9uc2VDb250ZXh0KSkgewotICAgICAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZ2V0RmF1bHRSZXNwb25zZShyZXNwb25zZUNvbnRleHQsIG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IChDbGFzc0xvYWRlcikgcmVzcG9uc2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUik7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkuZ2V0TWFyc2hhbGxlcihvcGVyYXRpb25EZXNjLCB0cnVlLCBjbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZW1hcnNoYWxSZXNwb25zZShyZXNwb25zZU1zZywgYXJncywgb3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSByZXNwb25zZSB3YXMgcHJvY2Vzc2VkIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnLmNsb3NlKCk7Ci0gICAgICAgICAgICAvLyBGcmVlIGluY29taW5nIHN0cmVhbQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZnJlZUlucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBUaHJvd2FibGUgZ2V0RmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtc2dDdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtc2dDdHguZ2V0TWVzc2FnZSgpOwotICAgICAgICAvL09wZXJhdGlvbiBEZXNjcmlwdGlvbiBmb3IgQXN5bmMgbWV0aG9kIGRvZXMgbm90IHN0b3JlIHRoZSBmYXVsdCBkZXNjcmlwdGlvbiBhcyBBc3ljIG9wZXJhdGlvbiAKLSAgICAgICAgLy93aWxsIG5ldmVyIGhhdmUgdGhyb3dzIGNsYXVzZSBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KLSAgICAgICAgLy93ZSB3aWxsIGZldGNoIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBvZiB0aGUgc3luYyBtZXRob2QgYW5kIHRoaXMgc2hvdWxkIGdpdmUgdXMgdGhlCi0gICAgICAgIC8vY29ycmVjdCBmYXVsdCBkZXNjcmlwdGlvbiBzbyB3ZSBjYW4gdGhyb3cgdGhlIHJpZ2h0IHVzZXIgZGVmaW5lZCBleGNlcHRpb24uCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvcERlc2MuaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICBvcERlc2MgPSBvcERlc2MuZ2V0U3luY09wZXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsICYmIG1zZy5pc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IChDbGFzc0xvYWRlcikgbXNnQ3R4LmdldFByb3BlcnR5KENvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IE1ldGhvZE1hcnNoYWxsZXJGYWN0b3J5LmdldE1hcnNoYWxsZXIob3BEZXNjLCB0cnVlLCBjbCkKLSAgICAgICAgICAgICAgICAuZGVtYXJzaGFsRmF1bHRSZXNwb25zZShtc2csIG9wRGVzYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICYmIG9iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQSBmYXVsdCB3YXMgZm91bmQgYW5kIHByb2Nlc3NlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaHJvd2luZyBhIGZhdWx0IG9mIHR5cGU6ICIgKyBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAiIGJhY2sgdG8gdGhlIGNsZW50LiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiAoVGhyb3dhYmxlKW9iamVjdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnQ3R4LmdldExvY2FsRXhjZXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZmFjdG9yeSwgaXQnbGwgdGhyb3cgdGhlIHJpZ2h0IHRoaW5nOgotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZ0N0eC5nZXRMb2NhbEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbXNnQ3R4LmZyZWVJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIGlmIChtYy5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBtYy5nZXRNZXNzYWdlKCkuaXNGYXVsdCgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UgaWYgKG1jLmdldExvY2FsRXhjZXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmluZGluZ1Byb3ZpZGVySW52b2tlZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIENsYXNzIG1ldGhvZHNDbGFzcyA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICByZXR1cm4gKHNlaUNsYXp6ID09IG1ldGhvZHNDbGFzcykgPyBmYWxzZSA6IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRNZXRob2RDYWxsKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgaWYgKGNsYXp6LmlzQXNzaWduYWJsZUZyb20oc2VpQ2xhenopIHx8Ci0gICAgICAgICAgICAgICAgY2xhenouaXNBc3NpZ25hYmxlRnJvbShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIuY2xhc3MpIHx8Ci0gICAgICAgICAgICAgICAgY2xhenouaXNBc3NpZ25hYmxlRnJvbShqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyLmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1B1YmxpYyhNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHJldHVybiBNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc01ldGhvZEV4Y2x1ZGVkKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkRlc2MuaXNFeGNsdWRlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRTZWlDbGF6eigpIHsKLSAgICAgICAgcmV0dXJuIHNlaUNsYXp6OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlaUNsYXp6KENsYXNzIHNlaUNsYXp6KSB7Ci0gICAgICAgIHRoaXMuc2VpQ2xhenogPSBzZWlDbGF6ejsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBc3luY0xpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBc3luY0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTgzMTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5QXN5bmNMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5wcm94eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCi0vKioKLSAqIFByb3h5QXN5bmNMaXN0ZW5lciB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHJlc3BvbnNlIG9iamVjdCB3aGVuIGNsaWVudCBkb2VzIHJlc3BvbnNlLmdldCgpOyBUaGUKLSAqIENsYXNzIHdpbGwgcmV0dXJuIHRoZSBkYXRhIHR5cGUgYXNzb2NpYXRlZCB3aXRoIFJlc3BvbnNlPFQ+IEdlbmVyaWMgQ2xhc3MuIEV4YW1wbGUKLSAqIFJlc3BvbnNlPEZsb2F0PiB3aWxsIHJldHVybiBhIEZsb2F0IG9iamVjdCB0byBjbGllbnQgb24gUmVzcG9uc2UuZ2V0KCkgY2FsbC4KLSAqLwotcHVibGljIGNsYXNzIFByb3h5QXN5bmNMaXN0ZW5lciBleHRlbmRzIEFzeW5jUmVzcG9uc2UgewotCi0gICAgSkFYV1NQcm94eUhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0gICAgT2JqZWN0W10gaW5wdXRBcmdzID0gbnVsbDsKLSAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0gbnVsbDsKLQotICAgIHB1YmxpYyBQcm94eUFzeW5jTGlzdGVuZXIoT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QpIHsKLSAgICAgICAgc3VwZXIob2QuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSBvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkFYV1NQcm94eUhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihKQVhXU1Byb3h5SGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRBcmdzKE9iamVjdFtdIGlucHV0QXJncykgewotICAgICAgICB0aGlzLmlucHV0QXJncyA9IGlucHV0QXJnczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlc3BvbnNlVmFsdWVPYmplY3QoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vRGVsZWdhdGUgdGhlIHJlcXVlc3QgdG8gY3JlYXRlIHJlc3Bvc2UgdG8gcHJveHlIYW5kbGVyIAotICAgICAgICAgICAgLy9zaW5jZSBpdCBoYXMgYWxsIHRoZSBsb2dpYyB3cml0dGVuIHRvIGNyZWF0ZSByZXNwb25zZSBmb3IgU3luYyAKLSAgICAgICAgICAgIC8vYW5kIG9uZVdheS4KLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZVJlc3BvbnNlKG51bGwsIGlucHV0QXJncywgbWMsIG9wZXJhdGlvbkRlc2MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RmF1bHRSZXNwb25zZShNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICByZXR1cm4gSkFYV1NQcm94eUhhbmRsZXIuZ2V0RmF1bHRSZXNwb25zZShtYywgb3BlcmF0aW9uRGVzYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9XZWJTZXJ2aWNlQ29udGV4dEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvV2ViU2VydmljZUNvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjczMDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29udGV4dC9XZWJTZXJ2aWNlQ29udGV4dEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludFJlZmVyZW5jZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb250ZXh0SW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VDb250ZXh0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZUNvbnRleHRJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCNnZXRNZXNzYWdlQ29udGV4dCgpCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCNnZXRVc2VyUHJpbmNpcGFsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7Ci0gICAgICAgIGlmIChzb2FwTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSBzb2FwTWVzc2FnZUNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVRVUVTVCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWNjZXNzIHRvIHRoZSB1c2VyIFByaW5jaXBhbCB3YXMgcmVxdWVzdGVkLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gSHR0cFNlcnZsZXRSZXF1ZXN0IG9iamVjdCB3YXMgZm91bmQsIHNvIG5vIFByaW5jaXBhbCBjYW4gYmUgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQjaXNVc2VySW5Sb2xlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyB1c2VyKSB7Ci0gICAgICAgIGlmIChzb2FwTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFNlcnZsZXRSZXF1ZXN0KSBzb2FwTWVzc2FnZUNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LlNFUlZMRVRfUkVRVUVTVCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgdG8gc2VlIGlmIHRoZSB1c2VyIGluIHRoZSByb2xlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5pc1VzZXJJblJvbGUodXNlcik7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gSHR0cFNlcnZsZXRSZXF1ZXN0IG9iamVjdCB3YXMgZm91bmQsIHNvIG5vIHJvbGUgY2hlY2sgY2FuIGJlIHBlcmZvcm1lZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuc29hcE1lc3NhZ2VDb250ZXh0ID0gc29hcE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyA8VCBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBUIGdldEVuZHBvaW50UmVmZXJlbmNlKENsYXNzPFQ+IGNsYXp6LCBFbGVtZW50Li4uIHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIgPSBudWxsOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuZ2V0QWRkcmVzc2luZ05hbWVzcGFjZShjbGF6eik7Ci0gICAgICAgIAotICAgICAgICBpZiAoc29hcE1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2UgPSAoUU5hbWUpIHNvYXBNZXNzYWdlQ29udGV4dC5nZXQoTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFKTsKLSAgICAgICAgICAgIFFOYW1lIGVuZHBvaW50ID0gKFFOYW1lKSBzb2FwTWVzc2FnZUNvbnRleHQuZ2V0KE1lc3NhZ2VDb250ZXh0LldTRExfUE9SVCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9Ci0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKG51bGwsIHNlcnZpY2UsIGVuZHBvaW50LCBudWxsLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmFkZFJlZmVyZW5jZVBhcmFtZXRlcnMoYXhpczJFUFIsIHJlZmVyZW5jZVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgICAgIGpheHdzRVBSID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZTMiLCBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgid2ViU2VydmljZUNvbnRleHRFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY2xhenouY2FzdChqYXh3c0VQUik7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVuZHBvaW50UmVmZXJlbmNlKEVsZW1lbnQuLi4gcmVmZXJlbmNlUGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gZ2V0RW5kcG9pbnRSZWZlcmVuY2UoVzNDRW5kcG9pbnRSZWZlcmVuY2UuY2xhc3MsIHJlZmVyZW5jZVBhcmFtZXRlcnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvZmFjdG9yeS9NZXNzYWdlQ29udGV4dEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvZmFjdG9yeS9NZXNzYWdlQ29udGV4dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjNGJiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L2ZhY3RvcnkvTWVzc2FnZUNvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LldlYlNlcnZpY2VDb250ZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQudXRpbHMuQ29udGV4dFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Tb2FwTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dEZhY3RvcnkgewotCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0RmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNvbnRleHQgY3JlYXRlV2ViU2VydmljZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZUNvbnRleHRJbXBsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIFNPQVBNZXNzYWdlQ29udGV4dCBiYXNlZCBvbiB0aGUgaW5wdXQgY29yZSBNRVBDb250ZXh0LiAgCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lcEN0eAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvYXBNZXNzYWdlQ29udGV4dCBjcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQgamF4d3NNZXNzYWdlQ29udGV4dCkgewotICAgICAgICBTb2FwTWVzc2FnZUNvbnRleHQgc29hcEN0eCA9IG5ldyBTb2FwTWVzc2FnZUNvbnRleHQoamF4d3NNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIENvbnRleHRVdGlscy5hZGRQcm9wZXJ0aWVzKHNvYXBDdHgsIGpheHdzTWVzc2FnZUNvbnRleHQpOwotICAgICAgICByZXR1cm4gc29hcEN0eDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBiYXNlZCBvbiB0aGUgaW5wdXQgY29yZSBNRVBDb250ZXh0LgotICAgICAqIAotICAgICAqIEBwYXJhbSBtZXBDdHgKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBMb2dpY2FsTWVzc2FnZUNvbnRleHQgY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvdXRpbHMvQ29udGV4dFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb250ZXh0L3V0aWxzL0NvbnRleHRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQxOTA4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvbnRleHQvdXRpbHMvQ29udGV4dFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuUmVmZXJlbmNlUGFyYW1ldGVyTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmltcGwuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENvbnRleHRVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbnRleHRVdGlscy5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIHRvIHRoZSBNZXNzYWdlQ29udGV4dCB0aGF0IHRoZSB1c2VyIHdpbGwgc2VlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGpheHdzTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUHJvcGVydGllcyhTT0FQTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGpheHdzTWVzc2FnZUNvbnRleHQpIHsKLQotICAgICAgICAvLyBDb3B5IEF4aXMyIE1lc3NhZ2VDb250ZXh0IHByb3BlcnRpZXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBzZXQgb2YgQXhpczIgaGFuZGxlcnMKLSAgICAgICAgLy8gaGF2ZSBydW4gYW5kIHBsYWNlZCBzb21lIHByb3BlcnRpZXMgaW4gdGhlIGNvbnRleHQgdGhhdCBuZWVkIHRvIGJlIHZpc2libGUuCi0gICAgICAgIHNvYXBNZXNzYWdlQ29udGV4dC5wdXRBbGwoamF4d3NNZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBqYXh3c01lc3NhZ2VDb250ZXh0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9bnVsbCkgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBXU0RMIHByb3BlcnRpZXMKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaWYgKHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKXNkKS5nZXRXU0RMTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uICE9IG51bGwgJiYgISIiLmVxdWFscyh3c2RsTG9jYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSB3c2RsTG9jYXRpb25VUkkgPSBKYXZhVXRpbHMuY3JlYXRlVVJJKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb25VUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYWRkUHJvcGVydGllc0VyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24udG9TdHJpbmcoKSxkZXNjcmlwdGlvbi5nZXRTZXJ2aWNlUU5hbWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX0RFU0NSSVBUSU9OLCB3c2RsTG9jYXRpb25VUkksIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfU0VSVklDRSwgZGVzY3JpcHRpb24uZ2V0U2VydmljZVFOYW1lKCksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9MYXppbHkgcHJvdmlkZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9Ci0gICAgICAgICAgICBqYXh3c01lc3NhZ2VDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChtc2dDb250ZXh0ICE9IG51bGwgJiYKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXIgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxFbGVtZW50PiBsaXN0ID0gbmV3IFJlZmVyZW5jZVBhcmFtZXRlckxpc3QoaGVhZGVyKTsKLSAgICAgICAgCi0gICAgICAgIHNldFByb3BlcnR5KHNvYXBNZXNzYWdlQ29udGV4dCwgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuUkVGRVJFTkNFX1BBUkFNRVRFUlMsIGxpc3QpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgcmVmZXJlbmNlIHBhcmFtZXRlciBsaXN0LiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB3ZSBhcmUgcnVubmluZyB3aXRoaW4gYSBzZXJ2bGV0IGNvbnRhaW5lciwgdGhlbiBKQVgtV1MgcmVxdWlyZXMgdGhhdCB0aGUKLSAgICAgICAgLy8gc2VydmxldCByZWxhdGVkIHByb3BlcnRpZXMgYmUgc2V0IG9uIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IAotICAgICAgICAgICAgKFNlcnZsZXRDb250ZXh0KWpheHdzTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRDT05URVhUKTsKLSAgICAgICAgaWYgKHNlcnZsZXRDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmxldCBDb250ZXh0IFNldCIpOwotICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX0NPTlRFWFQsIHNlcnZsZXRDb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmxldCBDb250ZXh0IG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IChIdHRwU2VydmxldFJlcXVlc3QpamF4d3NNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVFJFUVVFU1QpOwotICAgICAgICBpZiAocmVxID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSFRUUFNlcnZsZXRSZXF1ZXN0IG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX1JFUVVFU1QsIHJlcSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNFUlZMRVRfUkVRVUVTVCBTZXQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHBhdGhJbmZvID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGF0aEluZm8gPSByZXEuZ2V0UGF0aEluZm8oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImV4Y2VwdGlvbiBpbiBnZXRQYXRoSW5mbyIsIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5QQVRIX0lORk8sIHBhdGhJbmZvKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChwYXRoSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSFRUUF9SRVFVRVNUX1BBVEhJTkZPIFNldCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSFRUUF9SRVFVRVNUX1BBVEhJTkZPIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBxdWVyeVN0cmluZyA9IHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5RVUVSWV9TVFJJTkcsIHF1ZXJ5U3RyaW5nKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSFRUUF9SRVFVRVNUX1FVRVJZU1RSSU5HIFNldCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSFRUUF9SRVFVRVNUX1FVRVJZU1RSSU5HIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXEuZ2V0TWV0aG9kKCk7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LkhUVFBfUkVRVUVTVF9NRVRIT0QsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIVFRQX1JFUVVFU1RfTUVUSE9EIFNldCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSFRUUF9SRVFVRVNUX01FVEhPRCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcyA9IChIdHRwU2VydmxldFJlc3BvbnNlKWpheHdzTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19IVFRQX1NFUlZMRVRSRVNQT05TRSk7Ci0gICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2bGV0IFJlc3BvbnNlIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TRVJWTEVUX1JFU1BPTlNFLCByZXMpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTRVJWTEVUX1JFU1BPTlNFIFNldCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXU0RMUHJvcGVydGllcyhNZXNzYWdlQ29udGV4dCBqYXh3c01lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIGFkZFdTRExQcm9wZXJ0aWVzKGpheHdzTWVzc2FnZUNvbnRleHQsIGdldFNPQVBNZXNzYWdlQ29udGV4dChqYXh3c01lc3NhZ2VDb250ZXh0KSk7ICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkV1NETFByb3BlcnRpZXMoTWVzc2FnZUNvbnRleHQgamF4d3NNZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUE1lc3NhZ2VDb250ZXh0IHNvYXBNZXNzYWdlQ29udGV4dCkgewotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCA9IGpheHdzTWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsKLQotICAgICAgICBpZiAob3AgIT0gbnVsbCAmJiBzb2FwTWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX09QRVJBVElPTiwgb3AuZ2V0TmFtZSgpLCB0cnVlKTsKLQotICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBvcC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZWlkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gZWlkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBwb3J0VHlwZSA9IGVpZC5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsIHx8IHBvcnRUeXBlLmdldExvY2FsUGFydCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IGdldCBwb3J0IHR5cGUgZnJvbSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLCBhdHRlbXB0aW5nIHRvIGdldCBQb3J0VHlwZSBmcm9tIEVuZHBvaW50RGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfUE9SVCwgZWQuZ2V0UG9ydFFOYW1lKCksIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfSU5URVJGQUNFLCBwb3J0VHlwZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byByZWFkIFdTREwgb3BlcmF0aW9uLCBwb3J0IGFuZCBpbnRlcmZhY2UgcHJvcGVydGllcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXU0RMUHJvcGVydGllc19wcm92aWRlcihNZXNzYWdlQ29udGV4dCBqYXh3c01lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIGFkZFdTRExQcm9wZXJ0aWVzX3Byb3ZpZGVyKGpheHdzTWVzc2FnZUNvbnRleHQsIGdldFNPQVBNZXNzYWdlQ29udGV4dChqYXh3c01lc3NhZ2VDb250ZXh0KSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXU0RMUHJvcGVydGllc19wcm92aWRlcihNZXNzYWdlQ29udGV4dCBqYXh3c01lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIFFOYW1lIG9wID0gamF4d3NNZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25OYW1lKCk7ICAgIAkKLSAgICAgICAgCi0gICAgICAgIGlmIChvcCAhPSBudWxsICYmIHNvYXBNZXNzYWdlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShzb2FwTWVzc2FnZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LldTRExfT1BFUkFUSU9OLCBvcCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBvcC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gamF4d3NNZXNzYWdlQ29udGV4dC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoc29hcE1lc3NhZ2VDb250ZXh0LCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5XU0RMX1BPUlQsIGVkLmdldFBvcnRRTmFtZSgpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIHJlYWQgV1NETCBvcGVyYXRpb24sIHBvcnQgYW5kIGludGVyZmFjZSBwcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU09BUE1lc3NhZ2VDb250ZXh0IGdldFNPQVBNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBqYXh3c01lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0KLSAgICAgICAgICAgIGpheHdzTWVzc2FnZUNvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBTT0FQTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VDb250ZXh0IHdzYyA9Ci0gICAgICAgICAgICAgICAgKFdlYlNlcnZpY2VDb250ZXh0KXNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwuV0VCU0VSVklDRV9NRVNTQUdFX0NPTlRFWFQpOwotICAgICAgICAgICAgaWYgKHdzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcE1lc3NhZ2VDb250ZXh0ID0gKFNPQVBNZXNzYWdlQ29udGV4dCl3c2MuZ2V0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLSAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3BlcnR5KFNPQVBNZXNzYWdlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHNldFByb3BlcnR5KGNvbnRleHQsIG5hbWUsIHZhbHVlLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0UHJvcGVydHkoU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gbG9nTWVzc2FnZSkgewotICAgICAgICBjb250ZXh0LnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0U2NvcGUobmFtZSwgU2NvcGUuQVBQTElDQVRJT04pOwotICAgICAgICBpZiAobG9nTWVzc2FnZSAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKG5hbWUgKyAiIDoiICsgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9JbnZvY2F0aW9uQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9JbnZvY2F0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTg5YTJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvSW52b2NhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlOwotCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+SW52b2NhdGlvbkNvbnRleHQ8L2NvZGU+IGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHJlbGV2YW50IHRvIGEgcGFydGljdWxhcgotICogaW52b2NhdGlvbi4gIFRoaXMgdGllcyB0aGUgY29udGV4dCBvZiB0aGUgcmVxdWVzdCBiYWNrIHRvIHRoZSBjb250ZXh0IG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIChpZgotICogYXBwbGljYWJsZSkgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBNZXNzYWdlQ29udGV4dCBBUEkuICBUaGVyZSBpcyBhIHNlcGFyYXRlIE1lc3NhZ2VDb250ZXh0IGZvcgotICogYm90aCB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlLiAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW52b2NhdGlvbkNvbnRleHQgewotCi0gICAgcHVibGljIExpc3Q8SGFuZGxlcj4gZ2V0SGFuZGxlcnMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJzKExpc3Q8SGFuZGxlcj4gbGlzdCk7Ci0gICAgCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGN0eCk7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBjdHgpOwotCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBlKTsKLQotICAgIHB1YmxpYyBBc3luY1Jlc3BvbnNlIGdldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0QXN5bmNSZXNwb25zZUxpc3RlbmVyKEFzeW5jUmVzcG9uc2UgYWwpOwotCi0gICAgLy9GSVhNRTogVGhpcyBpcyB0ZW1wb3JhcnkuCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUNsaWVudChTZXJ2aWNlQ2xpZW50IGNsaWVudCk7Ci0KLSAgICAvL0ZJWE1FOiBUaGlzIGlzIHRlbXBvcmFyeS4KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudCBnZXRTZXJ2aWNlQ2xpZW50KCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL0ludm9jYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9JbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliZjc3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL0ludm9jYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci0KLS8qKiBUaGUgSW52b2NhdGlvbkNvbnRleHRGYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiBhbiBJbnZvY2F0aW9uQ29udGV4dC4gKi8KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkgewotCi0gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYW4gSW52b2NhdGlvbkNvbnRleHQgYmFzZWQgb24gdGhlIEJpbmRpbmcgdGhhdCB3YXMgcGFzc2VkIGluLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhdGlvbkNvbnRleHQgY3JlYXRlSW52b2NhdGlvbkNvbnRleHQoQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0SW1wbCBpYyA9IG5ldyBJbnZvY2F0aW9uQ29udGV4dEltcGwoKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWMuc2V0SGFuZGxlcnMoYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaWM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBjcmVhdGVFbmRwb2ludEludm9jYXRpb25Db250ZXh0KEJpbmRpbmcgYmluZGluZykgewotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IG5ldyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgZWljLnNldEhhbmRsZXJzKGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZWljOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvSW52b2NhdGlvbkNvbnRleHRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL0ludm9jYXRpb25Db250ZXh0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E3YWYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvSW52b2NhdGlvbkNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkFzeW5jUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBpbnRlcmZhY2UuCi0gKgotICogQHNlZSBJbnZvY2F0aW9uQ29udGV4dAotICovCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvbkNvbnRleHRJbXBsIGltcGxlbWVudHMgSW52b2NhdGlvbkNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eDsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4OwotICAgIHByaXZhdGUgRXhlY3V0b3IgZXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2U7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudDsgLy9GSVhNRTogVGhpcyBpcyB0ZW1wb3JhcnkKLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udGV4dEltcGwoKSB7Ci0gICAgICAgIC8vZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKiBAc2VlIEludm9jYXRpb25Db250ZXh0I2dldEhhbmRsZXJzKCkgKi8KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyPiBnZXRIYW5kbGVycygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxpc3Qgb2YgaGFubGRlcnMgZm9yIHRoaXMgSW52b2NhdGlvbkNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcnMoTGlzdDxIYW5kbGVyPiBoYW5kbGVycykgewotICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgSW52b2NhdGlvbkNvbnRleHQjc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0KSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBjdHgpIHsKLSAgICAgICAgcmVxdWVzdE1zZ0N0eCA9IGN0eDsKLSAgICAgICAgaWYgKGN0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldEludm9jYXRpb25Db250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgSW52b2NhdGlvbkNvbnRleHQjc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGN0eCkgewotICAgICAgICByZXNwb25zZU1zZ0N0eCA9IGN0eDsKLSAgICAgICAgaWYgKGN0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5zZXRJbnZvY2F0aW9uQ29udGV4dCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBAc2VlIEludm9jYXRpb25Db250ZXh0I2dldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKSAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VNc2dDdHg7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgSW52b2NhdGlvbkNvbnRleHQjZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdE1zZ0N0eDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBleGVjdXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihFeGVjdXRvciBlKSB7Ci0gICAgICAgIGV4ZWN1dG9yID0gZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXN5bmNSZXNwb25zZSBnZXRBc3luY1Jlc3BvbnNlTGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBhc3luY1Jlc3BvbnNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcihBc3luY1Jlc3BvbnNlIGFyKSB7Ci0gICAgICAgIGFzeW5jUmVzcG9uc2UgPSBhcjsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyB0ZW1wb3JhcnkKLSAgICBwdWJsaWMgU2VydmljZUNsaWVudCBnZXRTZXJ2aWNlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsaWVudDsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyB0ZW1wb3JhcnkKLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xpZW50KFNlcnZpY2VDbGllbnQgY2xpZW50KSB7Ci0gICAgICAgIHNlcnZpY2VDbGllbnQgPSBjbGllbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9NZXNzYWdlQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9NZXNzYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExZDIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5EZXRhY2hhYmxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuTUVQQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIDxjb2RlPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDwvY29kZT4gaXMgYW4gaW50ZXJmYWNlIHRoYXQgZXh0ZW5kcyB0aGUKLSAqIEpBWC1XUyAyLjAgPGNvZGU+amF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ8L2NvZGU+IGRlZmluZWQgaW4gdGhlIHNwZWMuICBUaGlzCi0gKiBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCBvZiB0aGUgTWVzc2FnZUNvbnRleHQgZm9yIHRoZSBvdGhlciBKQVgtV1Mgc3BlYwotICogcGllY2VzICh0aGUgaGFuZGxlcnMgZm9yIGV4YW1wbGUpIGFuZCBhbHNvIHByb3ZpZGVzIHRoZSBuZWVkZWQgYml0cyBvZiBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZvcgotICogdGhlIHJlc3Qgb2YgdGhlIEpBWC1XUyBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwLz4KLSAqIFNwZWNpZmljYWxseSwgdGhpcyBpcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIEFQSXMgc28gdGhhdCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAqIHBvcnRpb25zIGNhbiBnZXQgdG8gdGhlIE1lc3NhZ2UsIGRlZmluZWQgYnkgdGhlIE1lc3NhZ2UgTW9kZWwgZm9ybWF0IGFuZCBhbHNvIGFueSBtZXRhZGF0YSB0aGF0Ci0gKiBpcyBhdmFpbGFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWVzc2FnZUNvbnRleHQuY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkN0eDsKLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzTXNnQ3R4OwotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M7Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjOwotICAgIHByaXZhdGUgUU5hbWUgb3BlcmF0aW9uTmFtZTsgICAgLy9GSVhNRTogVGhpcyBzaG91bGQgYmVjb21lIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbgotICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICAgIHByaXZhdGUgTW9kZSBtb2RlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc091dGJvdW5kOyAgLy8gT3V0Ym91bmQgb3IgaW5ib3VuZCBtZXNzYWdlIGNvbnRleHQKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2ZXIgPSBmYWxzZTsgLy8gSW5kaWNhdGUgaWYgc2VydmVyIHJvbGUsIGRlZmF1bHQgaXMgZmFsc2UKLSAgICAKLSAgICAvKgotICAgICAqIEpBWFdTIHJ1bnRpbWUgdXNlcyBhIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1jLCBidXQgd2UgbmVlZCB0byBrbm93IHRoZSBwYWlyLgotICAgICAqIFdlIHdpbGwgdXNlIHRoaXMgbWVwQ3R4IGFzIGEgd3JhcHBlciB0byB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZSBjb250ZXh0cwotICAgICAqIHdoZXJlIHRoZSByZXF1ZXN0TUMgYW5kIHJlc3BvbnNlTUMgaGF2ZSB0aGUgc2FtZSBwYXJlbnQgTUVQQ29udGV4dCB0bwotICAgICAqIHByZXNlcnZlIHRoZSByZWxhdGlvbnNoaXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNRVBDb250ZXh0IG1lcEN0eDsKLQotICAgIC8vIElmIGEgbG9jYWwgZXhjZXB0aW9uIGlzIHRocm93biwgdGhlIGV4Y2VwdGlvbiBpcyBwbGFjZWQgb24gdGhlIG1lc3NhZ2UgY29udGV4dC4KLSAgICAvLyBJdCBpcyBub3QgY29udmVydGVkIGludG8gYSBNZXNzYWdlLgotICAgIHByaXZhdGUgVGhyb3dhYmxlIGxvY2FsRXhjZXB0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIEF4aXNGYXVsdCBjYXVzZWRCeUV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBNZXNzYWdlQ29udGV4dCB3aXRob3V0IGEgcHJpb3IgQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgKiAodXNhZ2Ugb3V0Ym91bmQgZGlzcGF0Y2gvcHJveHkpCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBheGlzTXNnQ3R4ID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBpc091dGJvdW5kID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgTWVzc2FnZUNvbnRleHQgd2l0aCBhIHByaW9yIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogKHVzYWdlIGluYm91bmQgY2xpZW50L3NlcnZlciBvciBvdXRib3VuZCBzZXJ2ZXIpCi0gICAgICogQHBhcmFtIG1jCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtYykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBBc3N1bWUgaW5ib3VuZCAoY2FsbGVyIG11c3Qgc2V0T3V0Ym91bmQpCi0gICAgICAgIGlzT3V0Ym91bmQgPSBmYWxzZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbWVtYmVyIE1FUENvbnRleHQgb2JqZWN0IGV2ZXJ5IHRpbWUsIHdlIHdpbGwKLSAgICAgICAgICogcmVseSBvbiB1c2VycyBvZiB0aGlzIE1lc3NhZ2VDb250ZXh0IGNsYXNzIHRvIGNyZWF0ZSBhIG5ldwotICAgICAgICAgKiBNRVBDb250ZXh0IGFuZCBjYWxsIHNldE1FUENvbnRleHQoTUVQQ29udGV4dCkKLSAgICAgICAgICovCi0gICAgICAgIAotICAgICAgICBpZiAobWMgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc01zZ0N0eCA9IG1jOwotICAgICAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VVdGlscy5nZXRNZXNzYWdlRnJvbU1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNldE1lc3NhZ2VDb250ZXh0KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXhpc01zZ0N0eCA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udGV4dCBnZXRJbnZvY2F0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGludm9jYXRpb25DdHg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkNvbnRleHQoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsKLSAgICAgICAgaW52b2NhdGlvbkN0eCA9IGljOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIC8vIG9ubHkgdXNlIHByb3BlcnRpZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhlIGF4aXMyIE1DLAotICAgICAgICAvLyBub3QgdGhlIG9wdGlvbnMgYmFnLiAgU2VlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5BYnN0cmFjdENvbnRleHQKLSAgICAgICAgSXRlcmF0b3IgbmFtZXMgPSBheGlzTXNnQ3R4LmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgSGFzaE1hcCB0ZW1wUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgZm9yICg7IG5hbWVzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0KCk7Ci0gICAgICAgICAgICB0ZW1wUHJvcHMucHV0KG5hbWUsIGF4aXNNc2dDdHguZ2V0UHJvcGVydHkobmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vcmV0dXJuIG5ldyBSZWFkT25seVByb3BlcnRpZXModGVtcFByb3BzKTsKLSAgICAgICAgcmV0dXJuIHRlbXBQcm9wczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IF9wcm9wZXJ0aWVzKSB7Ci0gICAgICAgIC8vIG1ha2Ugc3VyZSBjb3B5IGlzIG1hZGUsIG5vdCBqdXN0IHJlZmVyZW5jZToKLSAgICAgICAgX3Byb3BlcnRpZXMucHV0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dC5DT1BZX1BST1BFUlRJRVMsIHRydWUpOwotICAgICAgICBheGlzTXNnQ3R4LnNldFByb3BlcnRpZXMoX3Byb3BlcnRpZXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgLy8gb25seSB1c2UgcHJvcGVydGllcyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgYXhpczIgTUMuCi0gICAgICAgIHJldHVybiBheGlzTXNnQ3R4LmdldExvY2FsUHJvcGVydHkoa2V5LCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gT25seSB1c2UgcHJvcGVydGllcyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgYXhpczIgTUMuCi0gICAgICAgIC8vIEBzZWUgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkKLSAgICAgICAgcmV0dXJuIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcgJiYgZ2V0UHJvcGVydHkoKFN0cmluZylrZXkpICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvLyBhY3RzIGxpa2UgTWFwLnB1dChrZXksIHZhbHVlKQotICAgIHB1YmxpYyBPYmplY3Qgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIC8vIG9ubHkgdXNlIHByb3BlcnRpZXMgdGhhdCBhcmUgbG9jYWwgdG8gdGhlIGF4aXMyIE1DCi0gICAgICAgIE9iamVjdCByZXR2YWwgPSBheGlzTXNnQ3R4LmdldExvY2FsUHJvcGVydHkoa2V5LCBmYWxzZSk7Ci0gICAgICAgIGF4aXNNc2dDdHguc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50RGVzY3JpcHRpb24gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50RGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludERlc2NyaXB0aW9uKEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgZW5kcG9pbnREZXNjID0gZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25EZXNjcmlwdGlvbihPcGVyYXRpb25EZXNjcmlwdGlvbiBvZCkgewotICAgICAgICBvcGVyYXRpb25EZXNjID0gb2Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZGUgZ2V0TW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kZShNb2RlIG0pIHsKLSAgICAgICAgbW9kZSA9IG07Ci0gICAgfQotCi0gICAgLy9GSVhNRTogVGhpcyBzaG91bGQgYmVjb21lIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbgotICAgIHB1YmxpYyBRTmFtZSBnZXRPcGVyYXRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICAvL0ZJWE1FOiBUaGlzIHNob3VsZCBiZWNvbWUgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uTmFtZShRTmFtZSBvcCkgewotICAgICAgICBvcGVyYXRpb25OYW1lID0gb3A7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICBtZXNzYWdlID0gbXNnOwotICAgICAgICBtc2cuc2V0TWVzc2FnZUNvbnRleHQodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBnZXRBeGlzTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBheGlzTXNnQ3R4OwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc3ZjID0gYXhpc01zZ0N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoc3ZjICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gc3ZjLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHNlc3Npb24gc3RhdGUgaGFzIGJlZW4gZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01haW50YWluU2Vzc2lvbigpIHsKLSAgICAgICAgYm9vbGVhbiBtYWludGFpblNlc3Npb24gPSBmYWxzZTsKLQotICAgICAgICBCb29sZWFuIHZhbHVlID0gKEJvb2xlYW4pIGdldFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIG1haW50YWluU2Vzc2lvbiA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWFpbnRhaW5TZXNzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhbCBleGNlcHRpb24gaXMgdGhlIFRocm93YWJsZSBvYmplY3QgaGVsZCBvbiB0aGUgTWVzc2FnZSBmcm9tIGEgcHJvYmxlbSB0aGF0IG9jY3VycmVkCi0gICAgICogZHVlIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzZXJ2ZXIuICBJbiBvdGhlciB3b3Jkcywgbm8gbWVzc2FnZSBldmVyIHRyYXZlbGxlZCBhY3Jvc3MKLSAgICAgKiB0aGUgd2lyZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFRocm93YWJsZSBvYmplY3Qgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0TG9jYWxFeGNlcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbG9jYWwgZXhjZXB0aW9uIGlzIHRoZSBUaHJvd2FibGUgb2JqZWN0IGhlbGQgb24gdGhlIE1lc3NhZ2UgZnJvbSBhIHByb2JsZW0gdGhhdCBvY2N1cnJlZAotICAgICAqIGR1ZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc2VydmVyLiAgSW4gb3RoZXIgd29yZHMsIG5vIG1lc3NhZ2UgZXZlciB0cmF2ZWxsZWQgYWNyb3NzIHRoZQotICAgICAqIHdpcmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdAotICAgICAqIEBzZWUgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxFeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgbG9jYWxFeGNlcHRpb24gPSB0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdXNlZEJ5RXhjZXB0aW9uIChBeGlzRmF1bHQgdCl7Ci0gICAgICAgIHRoaXMuY2F1c2VkQnlFeGNlcHRpb24gPSB0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdCBnZXRDYXVzZWRCeUV4Y2VwdGlvbigpewotICAgICAgICByZXR1cm4gdGhpcy5jYXVzZWRCeUV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHdyYXBwZXIgTUVQQ29udGV4dC4gIEludGVybmFsbHksIHRoaXMgbWV0aG9kIGFsc28gc2V0cwotICAgICAqIHRoZSBNRVBDb250ZXh0J3MgY2hpbGRyZW4gc28gdGhlIHBvaW50ZXIgaXMgYmktZGlyZWN0aW9uYWw7IHlvdSBjYW4KLSAgICAgKiBnZXQgdGhlIE1FUENvbnRleHQgZnJvbSB0aGUgTWVzc2FnZUNvbnRleHQgYW5kIHZpY2UtdmVyc2EuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1lcEN0eAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1FUENvbnRleHQoTUVQQ29udGV4dCBtZXBDdHgpIHsKLSAgICAgICAgaWYgKHRoaXMubWVwQ3R4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotICAgICAgICAgICAgLy8gYW5kIHNldCBwYXJlbnQncyBjaGlsZCBwb2ludGVyCi0gICAgICAgICAgICB0aGlzLm1lcEN0eC5zZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1FUENvbnRleHQgZ2V0TUVQQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKG1lcEN0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KHRoaXMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVwQ3R4OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGlmIG91dGJvdW5kIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPdXRib3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzT3V0Ym91bmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGlzT3V0Ym91bmQgdHJ1ZSBpZiBvdXRib3VuZCBNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dGJvdW5kKGJvb2xlYW4gaXNPdXRib3VuZCkgewotICAgICAgICB0aGlzLmlzT3V0Ym91bmQgPSBpc091dGJvdW5kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzZXJ2ZXIgcm9sZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyKCkgewotICAgICAgICByZXR1cm4gaXNTZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgc2VydmVyIHJvbGUKLSAgICAgKiBAcGFyYW0gaXNTZXJ2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXIoYm9vbGVhbiBpc1NlcnZlcikgewotICAgICAgICB0aGlzLmlzU2VydmVyID0gaXNTZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRnJlZSB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5jb21pbmcgaW5wdXQgc3RyZWFtLiAoaS5lLiBIVFRQSW5wdXRTdHJlYW0pCi0gICAgICogVGhpcyBhbGxvd3MgdGhlIHRyYW5zcG9ydCBsYXllciB0byBmcmVlIHJlc291cmNlcyBhbmQgcG9vbCBjb25uZWN0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZyZWVJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gRHVyaW5nIGJ1aWxkZXIgcHJvY2Vzc2luZywgdGhlIG9yaWdpbmFsIGlucHV0IHN0cmVhbSB3YXMgd3JhcHBlZCB3aXRoCi0gICAgICAgIC8vIGEgZGV0YWNoYWJsZSBpbnB1dCBzdHJlYW0uICBUaGUgZGV0YWNoYWJsZSBpbnB1dCBzdHJlYW0ncyBkZXRhY2ggbWV0aG9kCi0gICAgICAgIC8vIGNhdXNlcyB0aGUgb3JpZ2luYWwgc3RyZWFtIHRvIGJlIGNvbnN1bWVkIGFuZCBjbG9zZWQuCi0gICAgICAgIERldGFjaGFibGVJbnB1dFN0cmVhbSBpcyA9IChEZXRhY2hhYmxlSW5wdXRTdHJlYW0pIAotICAgICAgICAgICAgZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkRFVEFDSEFCTEVfSU5QVVRfU1RSRUFNKTsKLSAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGV0YWNoaW5nIGluYm91bmQgaW5wdXQgc3RyZWFtICIgKyBpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpcy5kZXRhY2goKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9JbnZvY2F0aW9uQ29udHJvbGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25Db250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OTU4MDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKioKLSAqIFRoZSA8dHQ+SW52b2NhdGlvbkNvbnRyb2xsZXI8L3R0PiBpcyBhbiBpbnRlcmZhY2UgbW9kZWxpbmcgdGhlIGludm9jYXRpb24gb2YgYQotICogdGFyZ2V0IHdlYiBzZXJ2aWNlLiAgQWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciBuZWVkcyAKLSAqIHNob3VsZCBleGlzdCB3aXRoaW4gdGhlIEludm9jYXRvbkNvbnRleHQgdGhhdCBpcyBwYXNzZWQgaW4gdG8gdGhlIHZhcmlvdXMgaW52b2tlIAotICogbWV0aG9kcy4KLSAqIDxwLz4KLSAqIFRoZSByZXF1ZXN0IGluZm9ybWF0aW9uIGlzIHBhc3NlZCBpbiB3aXRoaW4gdGhlIEludm9jYXRpb25Db250ZXh0LiAgVGhlIEludm9jYXRpb25Db250cm9sbGVyCi0gKiBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSBNZXNzYWdlQ29udGV4dCB3aXRoaW4gdGhhdCBJbnZvY2F0aW9uQ29udGV4dCB0aGF0IGlzIHBvcHVsYXRlZCB3aXRoIGFsbAotICogb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXQgbmVlZHMgdG8gaW52b2tlLiAgSWYgbm90LCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgT25jZSB0aGUKLSAqIHJlc3BvbnNlIGNvbWVzIGJhY2ssIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhhdCByZXNwb25zZSB3aWxsIGJlIGhlbGQgaW5zaWRlIG9mIHRoZSBNZXNzYWdlQ29udGV4dAotICogcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSwgdGhhdCBleGlzdHMgaW4gdGhlIEludm9jYXRpb25Db250ZXh0LgotICogPHAvPgotICogVGhlIEludm9jYXRpb25Db250cm9sbGVyIHN1cHBvcnRzIGZvdXIgZGlmZmVyZW50IGludm9jYXRpb24gcGF0dGVybnM6Ci0gKiA8cC8+Ci0gKiAxKSBzeW5jaHJvbm91cyAtIFRoaXMgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHtAbGluayAjaW52b2tlKEludm9jYXRpb25Db250ZXh0KX0gbWV0aG9kLiAgVGhpcyBpcyBhCi0gKiBibG9ja2luZywgcmVxdWVzdC9yZXNwb25zZSBjYWxsIHRvIHRoZSB3ZWIgc2VydmljZS4KLSAqIDxwLz4KLSAqIDIpIG9uZS13YXkgLSBUaGlzIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSB7QGxpbmsgI2ludm9rZU9uZVdheShJbnZvY2F0aW9uQ29udGV4dCl9IG1ldGhvZC4gIFRoaXMgaXMKLSAqIGEgb25lLXdheSBpbnZvY2F0aW9uIHRoYXQgb25seSByZXR1cm5zIGVycm9ycyByZWxhdGVkIHRvIHNlbmRpbmcgdGhlIG1lc3NhZ2UuICBJZiBhbiBlcnJvciBvY2N1cnMKLSAqIHdoaWxlIHByb2Nlc3NpbmcsIHRoZSBjbGllbnQgd2lsbCBub3QgYmUgbm90aWZpZWQuCi0gKiA8cC8+Ci0gKiAzKSBhc3luY2hyb25vdXMgKGNhbGxiYWNrKSAtIHtAbGluayAjaW52b2tlQXN5bmMoSW52b2NhdGlvbkNvbnRleHQsIEFzeW5jSGFuZGxlcil9Ci0gKiA8cC8+Ci0gKiA0KSBhc3luY2hyb25vdXMgKHBvbGxpbmcpIC0ge0BsaW5rICNpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCl9Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW52b2NhdGlvbkNvbnRyb2xsZXIgewotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBzeW5jaHJvbm91cyAoYmxvY2tpbmcpIGludm9jYXRpb24gb2YgYSB0YXJnZXQgc2VydmljZS4gIFRoZSBJbnZvY2F0aW9uQ29udGV4dAotICAgICAqIHBhc3NlZCBpbiBzaG91bGQgY29udGFpbiBhIHZhbGlkIE1lc3NhZ2VDb250ZXh0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgYW5kIG1lc3NhZ2UgdG8gYmUKLSAgICAgKiBzZW50IGZvciB0aGUgcmVxdWVzdC4gIFRoZSByZXNwb25zZSBjb250ZW50cyB3aWxsIGJlIHByb2Nlc3NlZCBhbmQgcGxhY2VkIGluIHRoZQotICAgICAqIEludm9jYXRpb25Db250ZXh0IGFzIHdlbGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaWMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25Db250ZXh0IGludm9rZShJbnZvY2F0aW9uQ29udGV4dCBpYyk7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhIG9uZS13YXkgaW52b2NhdGlvbiBvZiB0aGUgY2xpZW50LiAgVGhpcyBpcyBTSE9VTEQgTk9UIGJlIGEgcm9idXN0IGludm9jYXRpb24sIHNvCi0gICAgICogYW55IGZhdWx0IHRoYXQgb2NjdXJzIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCB3aWxsIG5vdCBiZSByZXR1cm5lZCB0byB0aGUKLSAgICAgKiBjbGllbnQuICBFcnJvcnMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCBhcmUgcHJvYmxlbXMgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIHNlbmRpbmcgb2YgdGhlCi0gICAgICogbWVzc2FnZSB0byB0aGUgc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGljCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlT25lV2F5KEludm9jYXRpb25Db250ZXh0IGljKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYW4gYXN5bmNocm9ub3VzIChub24tYmxvY2tpbmcpIGludm9jYXRpb24gb2YgdGhlIGNsaWVudCBiYXNlZCBvbiBhIGNhbGxiYWNrIG1vZGVsLgotICAgICAqIFRoZSBBc3luY0hhbmRsZXIgdGhhdCBpcyBwYXNzZWQgaW4gaXMgdGhlIGNhbGxiYWNrIHRoYXQgdGhlIGNsaWVudCBwcm9ncmFtbWVyIHN1cHBsaWVkIHdoZW4KLSAgICAgKiB0aGV5IGludm9rZWQgdGhlaXIgSkFYLVdTIERpc3BhdGNoIG9yIHRoZWlyIFNFSS1iYXNlZCBkeW5hbWljIHByb3h5LgotICAgICAqCi0gICAgICogQHBhcmFtIGljCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYyk7Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBhbiBhc3luY2hyb25vdXMgKG5vbi1ibG9ja2luZykgaW52b2NhdGlvbiBvZiB0aGUgY2xpZW50IGJhc2VkIG9uIGEgcG9sbGluZyBtb2RlbC4KLSAgICAgKiBUaGUgUmVzcG9uc2Ugb2JqZWN0IHRoYXQgaXMgcmV0dXJuZWQgYWxsb3dzIHRoZSBjbGllbnQgcHJvZ3JhbW1lciB0byBwb2xsIGFnYWluc3QgaXQgdG8gc2VlCi0gICAgICogaWYgYSByZXNwb25zZSBoYXMgYmVlbiBzZW50IGJhY2sgYnkgdGhlIHNlcnZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpYwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGludm9rZUFzeW5jKEludm9jYXRpb25Db250ZXh0IGljLCBBc3luY0hhbmRsZXIgYXN5bmNIYW5kbGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGNjMGY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9JbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5IHsNCi0NCi0gICAgLyoqDQotICAgICAqIFVzZWQgdG8gb2J0YWluIGFuIGluc3RhbmNlIG9mIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciBjdXJyZW50bHkNCi0gICAgICogY29uZmlndXJlZCBmb3IgdGhlIHJ1bnRpbWUuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIEEgdmFsaWQgSW52b2NhdGlvbkNvbnRyb2xsZXIgaW5zdGFuY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW52b2NhdGlvbkNvbnRyb2xsZXIgZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9JbnZvY2F0aW9uUGF0dGVybi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25QYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmU0ZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL0ludm9jYXRpb25QYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyOwotCi1wdWJsaWMgZW51bSBJbnZvY2F0aW9uUGF0dGVybiB7Ci0gICAgU1lOQywKLSAgICBPTkVXQVksCi0gICAgQVNZTkNfQ0FMTEJBQ0ssCi0gICAgQVNZTkNfUE9MTElORwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL2ltcGwvQXhpc0ludm9jYXRpb25Db250cm9sbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9BeGlzSW52b2NhdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhMzExOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9BeGlzSW52b2NhdGlvbkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5DbGllbnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5hc3luYy5Bc3luY1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLkNhbGxiYWNrRnV0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmFzeW5jLlBvbGxpbmdGdXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IdHRwVHJhbnNwb3J0UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci0KLS8qKgotICogVGhlIDx0dD5BeGlzSW52b2NhdGlvbkNvbnRyb2xsZXI8L3R0PiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rCi0gKiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlcn0gaW50ZXJmYWNlLiAgVGhpcyBpbXBsZW1lbmF0aW9uIHVzZXMKLSAqIHRoZSBBeGlzMiBlbmdpbmUgdG8gZHJpdmUgdGhlIHJlcXVlc3QgdG8gdGhlIHRhcmdldCBzZXJ2aWNlLgotICogPHAvPgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGludm9rZSB0aGlzIGNsYXNzLCBwbGVhc2Ugc2VlIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciBpbnRlcmZhY2UKLSAqIGNvbW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgQXhpc0ludm9jYXRpb25Db250cm9sbGVyIGV4dGVuZHMgSW52b2NhdGlvbkNvbnRyb2xsZXJJbXBsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzSW52b2NhdGlvbkNvbnRyb2xsZXIuY2xhc3MpOwotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjaW52b2tlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCkKLSAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBkb0ludm9rZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gV2UgbmVlZCB0aGUgcW5hbWUgb2YgdGhlIG9wZXJhdGlvbiBiZWluZyBpbnZva2VkIHRvIGtub3cgd2hpY2ggCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gdGhlIE9wZXJhdGlvbkNsaWVudCBzaG91bGQgYmUgYmFzZWQgb24uCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgT3BlcmF0aW9uRGVzYyBpcyBvbmx5IHNldCB0aHJvdWdoIHVzZSBvZiB0aGUgUHJveHkuIERpc3BhdGNoCi0gICAgICAgIC8vIGNsaWVudHMgZG8gbm90IHVzZSBvcGVyYXRpb25zLCBzbyB0aGUgb3BlcmF0aW9uRGVzYyB3aWxsIGJlIG51bGwuICBJbiB0aGlzCi0gICAgICAgIC8vIGNhc2UgYW4gYW5vbnltb3VzIEF4aXNTZXJ2aWNlIHdpdGggYW5veW1vdW5zIEF4aXNPcGVyYXRpb25zIGZvciB0aGUgc3VwcG9ydGVkCi0gICAgICAgIC8vIE1FUHMgd2lsbCBiZSBjcmVhdGVkOyBhbmQgaXQgaXMgdGhhdCBhbm9ueW1vdXMgb3BlcmF0aW9uIG5hbWUgd2hpY2ggbmVlZHMgdG8KLSAgICAgICAgLy8gYmUgc3BlY2lmaWVkCi0gICAgICAgIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBnZXRPcGVyYXRpb25OYW1lVG9Vc2UocmVxdWVzdCwgU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0KLSAgICAgICAgLy8gVE9ETzogV2lsbCB0aGUgU2VydmljZUNsaWVudCBzdGljayBhcm91bmQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgIC8vIG9yIHdpbGwgd2UgbmVlZCBzb21lIG90aGVyIG1lY2hhbmlzbSBvZiBjcmVhdGluZyB0aGlzPwotICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbkNsaWVudCBmcm9tIHRoZSBwYXNzZWQgaW4gU2VydmljZUNsaWVudAotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzdmNDbGllbnQgPSBpYy5nZXRTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCA9IGNyZWF0ZU9wZXJhdGlvbkNsaWVudChzdmNDbGllbnQsIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIGluaXRPcGVyYXRpb25DbGllbnQob3BDbGllbnQsIHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgLy8gU2V0dXAgdGhlIGNsaWVudCBzbyB0aGF0IGl0IGtub3dzIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgY2FsbCB0bwotICAgICAgICAvLyBBeGlzMiBrbm93cyB3aGV0aGVyIG9yIG5vdCB0byBzdGFydCBhIGxpc3RlbmluZyBwb3J0IGZvciBhbgotICAgICAgICAvLyBhc3luY2hyb25vdXMgcmVzcG9uc2UuCi0gICAgICAgIEJvb2xlYW4gdXNlQXN5bmNNZXAgPSAoQm9vbGVhbilyZXF1ZXN0LmdldFByb3BlcnR5KENvbnN0YW50cy5VU0VfQVNZTkNfTUVQKTsKLSAgICAgICAgaWYgKCh1c2VBc3luY01lcCAhPSBudWxsICYmIHVzZUFzeW5jTWVwLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgICAgICAgICAgIHx8IG9wQ2xpZW50LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgY29uZmlndXJlQXN5bmNMaXN0ZW5lcihvcENsaWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIG1lc3NhZ2UgZXhjaGFuZ2Ugbm90IGVuYWJsZWQuICBUaGUgaW52b2NhdGlvbiB3aWxsIGJlIHN5bmNocm9ub3VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXF1ZXN0TXNnQ3R4ID0gcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXNwb25zZU1zZ0N0eCA9IG51bGw7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOwotCi0gICAgICAgIEF4aXNGYXVsdCBmYXVsdGV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgICAgbnVsbDsgIC8vIGRvbid0IGxldCB0aGUga2V5d29yZCAiZmF1bHQiIGNvbmZ1c2UgeW91LiAgVGhpcyBpcyBhbiBleGNlcHRpb24gY2xhc3MuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlKG9wQ2xpZW50LCB0cnVlLCBheGlzUmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gSWYgYW4gQXhpc0ZhdWx0IHdhcyB0aHJvd24sIHdlIG5lZWQgdG8gY2xlYW51cCB0aGUgb3JpZ2luYWwgT3BlcmF0aW9uQ29udGV4dC4KLSAgICAgICAgICAgIC8vIEZhaWx1cmUgdG8gZG8gc28gcmVzdWx0cyBpbiBhIG1lbW9yeSBsZWFrLgotICAgICAgICAgICAgb3BDbGllbnQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmNsZWFudXAoKTsKLSAgICAgICAgICAgIC8vIHNhdmUgdGhlIGZhdWx0IGluIGNhc2UgaXQgZGlkbid0IGNvbWUgZnJvbSB0aGUgZW5kcG9pbnQsIGFuZCB0aHVzCi0gICAgICAgICAgICAvLyB0aGVyZSB3b3VsZCBiZSBubyBtZXNzYWdlIG9uIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgZmF1bHRleGNlcHRpb24gPSBhZjsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhheGlzUmVxdWVzdE1zZ0N0eC5nZXRMb2dJRFN0cmluZygpICsgIiBBeGlzRmF1bHQgcmVjZWl2ZWQgZnJvbSBjbGllbnQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0IHRoZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dCBhbmQgZW52ZWxvcGUKLSAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCA9IG9wQ2xpZW50LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICByZXNwb25zZSA9IG5ldyBNZXNzYWdlQ29udGV4dChheGlzUmVzcG9uc2VNc2dDdHgpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TUVQQ29udGV4dChyZXF1ZXN0LmdldE1FUENvbnRleHQoKSk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBNZXNzYWdlIG9iamVjdCBpcyBzdGlsbCBudWxsLCB0aGVuIGl0J3MgcG9zc2libGUgdGhhdCBhCi0gICAgICAgICAgICAvLyBsb2NhbCBBeGlzRmF1bHQgd2FzIHRocm93biBhbmQgd2UgbmVlZCB0byBzYXZlIGl0IGZvciBsYXRlciB0aHJvd2luZwotICAgICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gY3JlYXRlIGEgbWVzc2FnZSBhbmQgZ28gdGhyb3VnaCB0aGUgd2hvbGUgaGFuZGxlciBvcgotICAgICAgICAgICAgLy8gWE1MRmF1bHQgcHJvY2Vzc2luZyBiZWNhdXNlIGl0J3MgdW5uZWNlc3NhcnkuCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIFNhbWUgaXMgdHJ1ZSBpZiB3ZSBnZXQgYSB2YWxpZCBub24tZmF1bHQgc2VydmVyIHJlc3BvbnNlIGJ1dCBzb21lIGpheHdzCi0gICAgICAgICAgICAvLyBjbGllbnQgcHJvY2Vzc2luZyAoYSBoYW5kbGVyLCBwZXJoYXBzKSB0aHJvd3MgYW4gZXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gCi0gICAgICAgICAgICAvLyBJZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBpdHNlbGYgaXMgYSBmYXVsdCBtZXNzYWdlLCBsZXQgaXQgcGFzcyB0aHJvdWdoLgotICAgICAgICAgICAgaWYgKChmYXVsdGV4Y2VwdGlvbiAhPSBudWxsKSAmJiAoKHJlc3BvbnNlLmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB8fCAoIXJlc3BvbnNlLmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCkpKSkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZShyZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRMb2NhbEV4Y2VwdGlvbihmYXVsdGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIG9uIHRoZSB1bHRpbWF0ZSBleGVjdXRpb24gdGhyZWFkCi0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub1RocmVhZCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlciNpbnZva2VPbmVXYXkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0KQotICAgICovCi0gICAgcHVibGljIHZvaWQgZG9JbnZva2VPbmVXYXkoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhIG9uZS13YXkgaW52b2NhdGlvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIHVzZSBhIHNlcGFyYXRlIGNoYW5uZWwKLSAgICAgICAgLy8gZm9yIHRoZSByZXNwb25zZS4KLSAgICAgICAgQm9vbGVhbiB1c2VBc3luY01lcCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KENvbnN0YW50cy5VU0VfQVNZTkNfTUVQKTsKLSAgICAgICAgaWYgKHVzZUFzeW5jTWVwICE9IG51bGwgJiYgdXNlQXN5bmNNZXAuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgib25ld2F5QXN5bmMiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFdlIG5lZWQgdGhlIHFuYW1lIG9mIHRoZSBvcGVyYXRpb24gYmVpbmcgaW52b2tlZCB0byBrbm93IHdoaWNoIAotICAgICAgICAvLyBBeGlzT3BlcmF0aW9uIHRoZSBPcGVyYXRpb25DbGllbnQgc2hvdWxkIGJlIGJhc2VkIG9uLgotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIE9wZXJhdGlvbkRlc2MgaXMgb25seSBzZXQgdGhyb3VnaCB1c2Ugb2YgdGhlIFByb3h5LiBEaXNwYXRjaAotICAgICAgICAvLyBjbGllbnRzIGRvIG5vdCB1c2Ugb3BlcmF0aW9ucywgc28gdGhlIG9wZXJhdGlvbkRlc2Mgd2lsbCBiZSBudWxsLiAgSW4gdGhpcwotICAgICAgICAvLyBjYXNlIGFuIGFub255bW91cyBBeGlzU2VydmljZSB3aXRoIGFub3ltb3VucyBBeGlzT3BlcmF0aW9ucyBmb3IgdGhlIHN1cHBvcnRlZAotICAgICAgICAvLyBNRVBzIHdpbGwgYmUgY3JlYXRlZDsgYW5kIGl0IGlzIHRoYXQgYW5vbnltb3VzIG9wZXJhdGlvbiBuYW1lIHdoaWNoIG5lZWRzIHRvCi0gICAgICAgIC8vIGJlIHNwZWNpZmllZAotICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gZ2V0T3BlcmF0aW9uTmFtZVRvVXNlKHJlcXVlc3QsIFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfT05MWV9PUCk7Ci0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSByZXF1ZXN0LmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc3ZjQ2xpZW50ID0gaWMuZ2V0U2VydmljZUNsaWVudCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGllbnQgPSBjcmVhdGVPcGVyYXRpb25DbGllbnQoc3ZjQ2xpZW50LCBvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBpbml0T3BlcmF0aW9uQ2xpZW50KG9wQ2xpZW50LCByZXF1ZXN0KTsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3RNc2dDdHggPSByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGVjdXRlKG9wQ2xpZW50LCB0cnVlLCBheGlzUmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gSkFYV1MgNi40LjIgc2F5cyB0byB0aHJvdyBpdC4uLgotICAgICAgICAgICAgLy8gV2hhdGV2ZXIgZXhjZXB0aW9uIHdlIGdldCBoZXJlIHdpbGwgbm90IGJlIGZyb20gdGhlIHNlcnZlciBzaW5jZSBhIG9uZS13YXkKLSAgICAgICAgICAgIC8vIGludm9jYXRpb24gaGFzIG5vIHJlc3BvbnNlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIFNFTkRFUiBmYXVsdAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGF4aXNSZXF1ZXN0TXNnQ3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIEF4aXNGYXVsdCByZWNlaXZlZCBmcm9tIGNsaWVudDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihDbGFzc1V0aWxzLmdldFJvb3RDYXVzZShhZikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlciNpbnZva2VBc3luYyhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQsIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXIpCi0gICAgKi8KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGRvSW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgQXN5bmNIYW5kbGVyIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIFdlIG5lZWQgdGhlIHFuYW1lIG9mIHRoZSBvcGVyYXRpb24gYmVpbmcgaW52b2tlZCB0byBrbm93IHdoaWNoIAotICAgICAgICAvLyBBeGlzT3BlcmF0aW9uIHRoZSBPcGVyYXRpb25DbGllbnQgc2hvdWxkIGJlIGJhc2VkIG9uLgotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIE9wZXJhdGlvbkRlc2MgaXMgb25seSBzZXQgdGhyb3VnaCB1c2Ugb2YgdGhlIFByb3h5LiBEaXNwYXRjaAotICAgICAgICAvLyBjbGllbnRzIGRvIG5vdCB1c2Ugb3BlcmF0aW9ucywgc28gdGhlIG9wZXJhdGlvbkRlc2Mgd2lsbCBiZSBudWxsLiAgSW4gdGhpcwotICAgICAgICAvLyBjYXNlIGFuIGFub255bW91cyBBeGlzU2VydmljZSB3aXRoIGFub3ltb3VucyBBeGlzT3BlcmF0aW9ucyBmb3IgdGhlIHN1cHBvcnRlZAotICAgICAgICAvLyBNRVBzIHdpbGwgYmUgY3JlYXRlZDsgYW5kIGl0IGlzIHRoYXQgYW5vbnltb3VzIG9wZXJhdGlvbiBuYW1lIHdoaWNoIG5lZWRzIHRvCi0gICAgICAgIC8vIGJlIHNwZWNpZmllZAotICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gZ2V0T3BlcmF0aW9uTmFtZVRvVXNlKHJlcXVlc3QsIFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotCi0gICAgICAgIC8vIFRPRE86IFdpbGwgdGhlIFNlcnZpY2VDbGllbnQgc3RpY2sgYXJvdW5kIG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dAotICAgICAgICAvLyBvciB3aWxsIHdlIG5lZWQgc29tZSBvdGhlciBtZWNoYW5pc20gb2YgY3JlYXRpbmcgdGhpcz8KLSAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbiBPcGVyYXRpb25DbGllbnQgZnJvbSB0aGUgcGFzc2VkIGluIFNlcnZpY2VDbGllbnQKLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSByZXF1ZXN0LmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc3ZjQ2xpZW50ID0gaWMuZ2V0U2VydmljZUNsaWVudCgpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BDbGllbnQgPSBjcmVhdGVPcGVyYXRpb25DbGllbnQoc3ZjQ2xpZW50LCBvcGVyYXRpb25OYW1lKTsKLQotICAgICAgICBpbml0T3BlcmF0aW9uQ2xpZW50KG9wQ2xpZW50LCByZXF1ZXN0KTsKLQotICAgICAgICAvLyBTZXR1cCB0aGUgY2xpZW50IHNvIHRoYXQgaXQga25vd3Mgd2hldGhlciB0aGUgdW5kZXJseWluZyBjYWxsIHRvCi0gICAgICAgIC8vIEF4aXMyIGtub3dzIHdoZXRoZXIgb3Igbm90IHRvIHN0YXJ0IGEgbGlzdGVuaW5nIHBvcnQgZm9yIGFuCi0gICAgICAgIC8vIGFzeW5jaHJvbm91cyByZXNwb25zZS4KLSAgICAgICAgQm9vbGVhbiB1c2VBc3luY01lcCA9IChCb29sZWFuKXJlcXVlc3QuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLlVTRV9BU1lOQ19NRVApOwotICAgICAgICBpZiAoKHVzZUFzeW5jTWVwICE9IG51bGwgJiYgdXNlQXN5bmNNZXAuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgICAgfHwgb3BDbGllbnQuZ2V0T3B0aW9ucygpLmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKSB7Ci0gICAgICAgICAgICBjb25maWd1cmVBc3luY0xpc3RlbmVyKG9wQ2xpZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMgbWVzc2FnZSBleGNoYW5nZSBub3QgZW5hYmxlZC4gIFRoZSBpbnZvY2F0aW9uIHdpbGwgYmUgc3luY2hyb25vdXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIENhbGxiYWNrRnV0dXJlIGNiZiA9IG51bGw7Ci0gICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYmYgPSBuZXcgQ2FsbGJhY2tGdXR1cmUoaWMsIGNhbGxiYWNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNFcnI0IikpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BDbGllbnQuc2V0Q2FsbGJhY2soY2JmKTsKLQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3RNc2dDdHggPSByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZShvcENsaWVudCwgZmFsc2UsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoYXhpc1JlcXVlc3RNc2dDdHguZ2V0TG9nSURTdHJpbmcoKSArICIgQXhpc0ZhdWx0IHJlY2VpdmVkIGZyb20gY2xpZW50OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2F2ZSB0aGUgZXhjZXB0aW9uIG9uIHRoZSBjYWxsYmFjay4gIFRoZSBjbGllbnQgd2lsbCBsZWFybiBhYm91dCB0aGUgZXJyb3Igd2hlbiB0aGV5IHRyeSB0bwotICAgICAgICAgICAgICogcmV0cmlldmUgdGhlIGFzeW5jIHJlc3VsdHMgdmlhIHRoZSBSZXNwb25zZS5nZXQoKS4gICJFcnJvcnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlIGludm9jYXRpb24KLSAgICAgICAgICAgICAqIGFyZSByZXBvcnRlZCB2aWEgYW4gZXhjZXB0aW9uIHdoZW4gdGhlIGNsaWVudCBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uLiIKLSAgICAgICAgICAgICAqIC0tIEpBWFdTIDQuMy4zCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogVE9ETzogIFRoaXMgaXMgdGhlIGFwcHJvcHJpYXRlIHRoaW5nIHRvIGRvIGhlcmUgc2luY2UgdGhlIHRocm93biBleGNlcHRpb24gbWF5IG9jY3VyIGJlZm9yZQotICAgICAgICAgICAgKiB3ZSBzd2l0Y2ggdGhyZWFkcyB0byB0aGUgYXN5bmMgdGhyZWFkLiAgQnV0Li4uIHdoYXQgaGFwcGVucyBpZiB3ZSd2ZSBhbHJlYWR5IHN3aXRjaGVkIG92ZXIKLSAgICAgICAgICAgICogdG8gdGhlIGFzeW5jIHRocmVhZD8gIFNvIGZhciwgaXQgYXBwZWFycyB0aGF0IHRoZSBleGNlcHRpb24gZ2V0cyBzZXQgb24gdGhlIEZ1dHVyZVRhc2sKLSAgICAgICAgICAgICogQ29uY3VycmVudCBvYmplY3QsIGFuZCB3ZSBuZXZlciBoaXQgdGhpcyBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBsYXRlciwgd2hlbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICAqIGNhbGxzIGZ1dHVyZS5nZXQoKSwgbm8gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGRlc3BpdGUgd2hhdCB0aGUgc3BlYyBzYXlzLiAgVGhlIGNsaWVudCBjYW4sCi0gICAgICAgICAgICAqIGhvd2V2ZXIsIHJldHJpZXZlIGVycm9ycyB2aWEgaXQncyBBc3luY0hhbmRsZXIuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgY2JmLm9uRXJyb3IoYWYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNiZi5nZXRGdXR1cmVUYXNrKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqICAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI2ludm9rZUFzeW5jKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCkKLSAgICAqLwotICAgIHB1YmxpYyBSZXNwb25zZSBkb0ludm9rZUFzeW5jKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0aGUgcW5hbWUgb2YgdGhlIG9wZXJhdGlvbiBiZWluZyBpbnZva2VkIHRvIGtub3cgd2hpY2ggCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gdGhlIE9wZXJhdGlvbkNsaWVudCBzaG91bGQgYmUgYmFzZWQgb24uCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgT3BlcmF0aW9uRGVzYyBpcyBvbmx5IHNldCB0aHJvdWdoIHVzZSBvZiB0aGUgUHJveHkuIERpc3BhdGNoCi0gICAgICAgIC8vIGNsaWVudHMgZG8gbm90IHVzZSBvcGVyYXRpb25zLCBzbyB0aGUgb3BlcmF0aW9uRGVzYyB3aWxsIGJlIG51bGwuICBJbiB0aGlzCi0gICAgICAgIC8vIGNhc2UgYW4gYW5vbnltb3VzIEF4aXNTZXJ2aWNlIHdpdGggYW5veW1vdW5zIEF4aXNPcGVyYXRpb25zIGZvciB0aGUgc3VwcG9ydGVkCi0gICAgICAgIC8vIE1FUHMgd2lsbCBiZSBjcmVhdGVkOyBhbmQgaXQgaXMgdGhhdCBhbm9ueW1vdXMgb3BlcmF0aW9uIG5hbWUgd2hpY2ggbmVlZHMgdG8KLSAgICAgICAgLy8gYmUgc3BlY2lmaWVkCi0gICAgICAgIFFOYW1lIG9wZXJhdGlvbk5hbWUgPSBnZXRPcGVyYXRpb25OYW1lVG9Vc2UocmVxdWVzdCwgU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0KLSAgICAgICAgLy8gVE9ETzogV2lsbCB0aGUgU2VydmljZUNsaWVudCBzdGljayBhcm91bmQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgIC8vIG9yIHdpbGwgd2UgbmVlZCBzb21lIG90aGVyIG1lY2hhbmlzbSBvZiBjcmVhdGluZyB0aGlzPwotICAgICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIE9wZXJhdGlvbkNsaWVudCBmcm9tIHRoZSBwYXNzZWQgaW4gU2VydmljZUNsaWVudAotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzdmNDbGllbnQgPSBpYy5nZXRTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCA9IGNyZWF0ZU9wZXJhdGlvbkNsaWVudChzdmNDbGllbnQsIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgICAgIGluaXRPcGVyYXRpb25DbGllbnQob3BDbGllbnQsIHJlcXVlc3QpOwotCi0gICAgICAgIC8vIFNldHVwIHRoZSBjbGllbnQgc28gdGhhdCBpdCBrbm93cyB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNhbGwgdG8KLSAgICAgICAgLy8gQXhpczIga25vd3Mgd2hldGhlciBvciBub3QgdG8gc3RhcnQgYSBsaXN0ZW5pbmcgcG9ydCBmb3IgYW4KLSAgICAgICAgLy8gYXN5bmNocm9ub3VzIHJlc3BvbnNlLgotICAgICAgICBCb29sZWFuIHVzZUFzeW5jTWVwID0gKEJvb2xlYW4pcmVxdWVzdC5nZXRQcm9wZXJ0eShDb25zdGFudHMuVVNFX0FTWU5DX01FUCk7Ci0gICAgICAgIGlmICgodXNlQXN5bmNNZXAgIT0gbnVsbCAmJiB1c2VBc3luY01lcC5ib29sZWFuVmFsdWUoKSkKLSAgICAgICAgICAgICAgICB8fCBvcENsaWVudC5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyZUFzeW5jTGlzdGVuZXIob3BDbGllbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyBtZXNzYWdlIGV4Y2hhbmdlIG5vdCBlbmFibGVkLiAgVGhlIGludm9jYXRpb24gd2lsbCBiZSBzeW5jaHJvbm91cy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEFzeW5jUmVzcG9uc2UgcmVzcCA9IGljLmdldEFzeW5jUmVzcG9uc2VMaXN0ZW5lcigpOwotICAgICAgICBQb2xsaW5nRnV0dXJlIHBmID0gbmV3IFBvbGxpbmdGdXR1cmUoaWMpOwotICAgICAgICBvcENsaWVudC5zZXRDYWxsYmFjayhwZik7Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXF1ZXN0TXNnQ3R4ID0gcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGUob3BDbGllbnQsIGZhbHNlLCBheGlzUmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGF4aXNSZXF1ZXN0TXNnQ3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIEF4aXNGYXVsdCByZWNlaXZlZCBmcm9tIGNsaWVudDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFNhdmUgdGhlIGV4Y2VwdGlvbiBvbiB0aGUgY2FsbGJhY2suICBUaGUgY2xpZW50IHdpbGwgbGVhcm4gYWJvdXQgdGhlIGVycm9yIHdoZW4gdGhleSB0cnkgdG8KLSAgICAgICAgICAgICAqIHJldHJpZXZlIHRoZSBhc3luYyByZXN1bHRzIHZpYSB0aGUgUmVzcG9uc2UuZ2V0KCkuICAiRXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHRoZSBpbnZvY2F0aW9uCi0gICAgICAgICAgICAgKiBhcmUgcmVwb3J0ZWQgdmlhIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSBjbGllbnQgYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlIHJlc3VsdHMgb2YgdGhlIG9wZXJhdGlvbi4iCi0gICAgICAgICAgICAgKiAtLSBKQVhXUyA0LjMuMwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwZi5vbkVycm9yKGFmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNwOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI3ByZXBhcmVSZXF1ZXN0KG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dCkKLSAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByZXBhcmVSZXF1ZXN0KE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0TXNnQ3R4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL3Rocm93IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1JlcXVlc3RNc2dDdHggPQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgICAgICAvLyBUaGUgTWVzc2FnZUNvbnRleHQgd2lsbCBjb250YWluIGEgTWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUKLSAgICAgICAgICAgIC8vIGNvbnRlbnRzIHRoYXQgbmVlZCB0byBiZSBzZW50LiAgV2UgbmVlZCB0byBnZXQgdGhvc2UgY29udGVudHMKLSAgICAgICAgICAgIC8vIGluIGEgZm9ybSB0aGF0IEF4aXMyIGNhbiBjb25zdW1lIHRoZW0sIGFuIEFYSU9NIFNPQVBFbnZlbG9wZS4KLSAgICAgICAgICAgIE1lc3NhZ2VVdGlscy5wdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1zZ0N0eC5nZXRNZXNzYWdlKCksICAvLyBKQVgtV1MgTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICBheGlzUmVxdWVzdE1zZ0N0eCAvLyBBeGlzIDIgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvcGVydGllczogIiArIGF4aXNSZXF1ZXN0TXNnQ3R4LmdldFByb3BlcnRpZXMoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcmVwYXJlUmVxdWVzdEZhaWwiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcmVwYXJlUmVxdWVzdEZhaWwiKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlciNwcmVwYXJlUmVzcG9uc2Uob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0KQotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4KSB7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdE9wZXJhdGlvbkNsaWVudChPcGVyYXRpb25DbGllbnQgb3BDbGllbnQsIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDdHgpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXF1ZXN0ID0gcmVxdWVzdE1zZ0N0eC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgc2V0dXBQcm9wZXJ0aWVzKHJlcXVlc3RNc2dDdHgpOy8vLCBheGlzUmVxdWVzdC5nZXRPcHRpb25zKCkpOwotCi0gICAgICAgIGlmIChvcENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBvcENsaWVudC5nZXRPcHRpb25zKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0IGVuZHBvaW50IGFkZHJlc3MgYW5kIHNldHVwIHRoZSBUTyBlbmRwb2ludCAKLSAgICAgICAgICAgIC8vIHJlZmVyZW5jZS4gIFRoaXMgdGVsbHMgdXMgd2hlcmUgdGhlIHJlcXVlc3QgaXMgZ29pbmcuCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0b0VQUiA9IGF4aXNSZXF1ZXN0LmdldFRvKCk7Ci0KLSAgICAgICAgICAgIGlmICh0b0VQUiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFVybCA9IChTdHJpbmcpcmVxdWVzdE1zZ0N0eC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICB0b0VQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSh0YXJnZXRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRvRVBSKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBTT0FQIEFjdGlvbiAoaWYgbmVlZGVkKQotICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSBDbGllbnRVdGlscy5maW5kU09BUEFjdGlvbihyZXF1ZXN0TXNnQ3R4KTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKHNvYXBBY3Rpb24pOwotICAgICAgICAgICAgLy8gZ2V0IHRoZSB0aW1lb3V0IGZyb20gdGhlIHJlcXVlc3QgbWVzc2FnZSBjb250ZXh0IG9wdGlvbnMgYXMgaXQgbWF5IGhhdmUgYmVlbgotICAgICAgICAgICAgLy8gc2V0IGJ5IHRoZSB1c2VyOyBpZiBpdCB3YXMgbm90IHNldCBieSB0aGUgdXNlciB3ZSB3aWxsIGp1c3QgYmUgc2V0dGluZyB0aGUKLSAgICAgICAgICAgIC8vIHRpbWVvdXQgb24gdGhlIG9wZXJhdGlvbiBjbGllbnQgdG8gdGhlIGRlZmF1bHQgc28gaXQgd2lsbCBub3QgaGF2ZSBhIG5lZ2F0aXZlCi0gICAgICAgICAgICAvLyBlZmZlY3Q7IHRoaXMgbG9naWMgaXMgcmVsaWFudCBvbiB0aGUgZmFjdCB0aGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0IGlzIGRlbGVnYXRpbmcKLSAgICAgICAgICAgIC8vIHRvIHRoZSBBeGlzMiBPcHRpb25zIG9iamVjdCBhbmQgbm90IHN0b3JpbmcgaXRzIG93biBwcm9wZXJ0eSBiYWcKLSAgICAgICAgICAgIGxvbmcgdGltZW91dCA9IGF4aXNSZXF1ZXN0LmdldE9wdGlvbnMoKS5nZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKHRpbWVvdXQpOwotCi0gICAgICAgICAgICAvLyBVc2UgdGhlIE9wZXJhdGlvbkNsaWVudCB0byBzZW5kIHRoZSByZXF1ZXN0IGFuZCBwdXQgdGhlIGNvbnRlbnRzCi0gICAgICAgICAgICAvLyBvZiB0aGUgcmVzcG9uc2UgaW4gdGhlIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0LgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIEF4aXMyIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICBvcENsaWVudC5hZGRNZXNzYWdlQ29udGV4dChheGlzUmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL1RPRE86IERvIHNvbWV0aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoZSBwcm92aWRlZCBTZXJ2aWNlQ2xpZW50IGluc3RhbmNlIHRvIGNyZWF0ZSBhbiBPcGVyYXRpb25DbGllbnQgaWRlbnRpZmllZCBieSB0aGUKLSAgICAgKiBvcGVyYXRpb24gUU5hbWUgcHJvdmlkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2MKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ2xpZW50IGNyZWF0ZU9wZXJhdGlvbkNsaWVudChTZXJ2aWNlQ2xpZW50IHNjLCBRTmFtZSBvcGVyYXRpb24pIHsKLSAgICAgICAgaWYgKHNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIklDQ3JlYXRlT3BDbGllbnRFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNDcmVhdGVPcENsaWVudEVycjIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgT3BlcmF0aW9uQ2xpZW50IGZvciBvcGVyYXRpb246ICIgKyBvcGVyYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNsaWVudCBjbGllbnQgPSBzYy5jcmVhdGVDbGllbnQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBjbGllbnQ7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUFzeW5jTGlzdGVuZXIoT3BlcmF0aW9uQ2xpZW50IGNsaWVudCkgewotICAgICAgICBjbGllbnQuZ2V0T3B0aW9ucygpLnNldFVzZVNlcGFyYXRlTGlzdGVuZXIodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIFRPRE86IFRoaXMgaXMgYSBmaXJzdCBwYXNzIGF0IGZpbHRlcmluZyB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBzZXQgb24gdGhlCi0gICAgKiBSZXF1ZXN0Q29udGV4dC4gIFJpZ2h0IG5vdyBpdCdzIGNhbGxlZCBkdXJpbmcgdGhlIGludm9rZSwgYnV0IG5lZWRzIHRvIGJlCi0gICAgKiBtb3ZlZCBvdmVyIHRvIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBpbiB0aGUgcGF0aAotICAgICogb2YgcGVyZm9ybWFuY2UuCi0gICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBQcm9wZXJ0aWVzKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ly8sIE9wdGlvbnMgb3BzKSB7Ci0KLSAgICAgICAgLy8gRW5hYmxlIE1UT00KLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtc2cuaXNNVE9NRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtYy5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCAidHJ1ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW5hYmxlIHNlc3Npb24gbWFuYWdlbWVudAotICAgICAgICBpZiAobWMuaXNNYWludGFpblNlc3Npb24oKSkgewotICAgICAgICAgICAgbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0T3B0aW9ucygpLnNldE1hbmFnZVNlc3Npb24odHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgQkFTSUNfQVVUSCBpcyBlbmFibGVkLiAgSWYgc28sIG1ha2Ugc3VyZQotICAgICAgICAvLyB0aGUgcHJvcGVydGllcyBhcmUgc2V0dXAgY29ycmVjdGx5LgotICAgICAgICBpZiAobWMuY29udGFpbnNLZXkoQmluZGluZ1Byb3ZpZGVyLlVTRVJOQU1FX1BST1BFUlRZKSB8fAotICAgICAgICAgICAgbWMuY29udGFpbnNLZXkoQmluZGluZ1Byb3ZpZGVyLlBBU1NXT1JEX1BST1BFUlRZKSkgewotCi0gICAgICAgICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZyltYy5nZXRQcm9wZXJ0eShCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFkpOwotICAgICAgICAgICAgaWYgKHVzZXJJZCA9PSBudWxsIHx8IHVzZXJJZCA9PSAiIikgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjaGVja1VzZXJOYW1lIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1jLmNvbnRhaW5zS2V5KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSkpIHsKLSAgICAgICAgICAgICAgICBwYXNzd29yZCA9IChTdHJpbmcpIG1jLmdldFByb3BlcnR5KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKChTdHJpbmcpbWMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvciBiYXNpY0F1dGhlbnRpY2F0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLkF1dGhlbnRpY2F0b3IoKTsKLSAgICAgICAgICAgIGJhc2ljQXV0aGVudGljYXRpb24uc2V0VXNlcm5hbWUodXNlcklkKTsKLSAgICAgICAgICAgIGJhc2ljQXV0aGVudGljYXRpb24uc2V0UGFzc3dvcmQocGFzc3dvcmQpOwotICAgICAgICAgICAgYmFzaWNBdXRoZW50aWNhdGlvbi5zZXRIb3N0KHVybC5nZXRIb3N0KCkpOwotICAgICAgICAgICAgYmFzaWNBdXRoZW50aWNhdGlvbi5zZXRQb3J0KHVybC5nZXRQb3J0KCkpOwotICAgICAgICAgICAgYmFzaWNBdXRoZW50aWNhdGlvbi5zZXRQcmVlbXB0aXZlQXV0aGVudGljYXRpb24odHJ1ZSk7Ci0KLSAgICAgICAgICAgIG1jLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQVVUSEVOVElDQVRFLCBiYXNpY0F1dGhlbnRpY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIGdldE9wZXJhdGlvbk5hbWVUb1VzZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4LCBRTmFtZSBkZWZhdWx0T3BOYW1lKSB7Ci0gICAgICAgIC8vIFdlIG5lZWQgdGhlIHFuYW1lIG9mIHRoZSBvcGVyYXRpb24gYmVpbmcgaW52b2tlZCB0byBrbm93IHdoaWNoIAotICAgICAgICAvLyBBeGlzT3BlcmF0aW9uIHRoZSBPcGVyYXRpb25DbGllbnQgc2hvdWxkIGJlIGJhc2VkIG9uLgotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIE9wZXJhdGlvbkRlc2MgaXMgb25seSBzZXQgdGhyb3VnaCB1c2Ugb2YgdGhlIFByb3h5LiBEaXNwYXRjaAotICAgICAgICAvLyBjbGllbnRzIGRvIG5vdCB1c2Ugb3BlcmF0aW9ucywgc28gdGhlIG9wZXJhdGlvbkRlc2Mgd2lsbCBiZSBudWxsLiAgSW4gdGhpcwotICAgICAgICAvLyBjYXNlIGFuIGFub255bW91cyBBeGlzU2VydmljZSB3aXRoIGFub255bW91cyBBeGlzT3BlcmF0aW9ucyBmb3IgdGhlIHN1cHBvcnRlZAotICAgICAgICAvLyBNRVBzIHdpbGwgYmUgY3JlYXRlZDsgYW5kIGl0IGlzIHRoYXQgYW5vbnltb3VzIG9wZXJhdGlvbiBuYW1lIHdoaWNoIG5lZWRzIHRvCi0gICAgICAgIC8vIGJlIHNwZWNpZmllZAotICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gbnVsbDsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjID0gcmVxdWVzdE1zZ0N0eC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAob3BEZXNjICE9IG51bGwgJiYgb3BEZXNjLmdldEF4aXNPcGVyYXRpb24oKSAhPSBudWxsKQotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IG9wRGVzYy5nZXROYW1lKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUgPSBkZWZhdWx0T3BOYW1lOwotICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgT3BlcmF0aW9uQ2xpZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BDbGllbnQgICAtIEZ1bGx5IGNvbmZpZ3VyZWQgT3BlcmF0aW9uQ2xpZW50Ci0gICAgICogQHBhcmFtIGJsb2NrICAgICAgLSBJbmRpY2F0ZXMgaWYgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nIGV4ZWN1dGUKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAtIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBBbGwgZXhjZXB0aW9ucyBhcmUgcmV0dXJuZWQgYXMgQXhpc0ZhdWx0cwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlKE9wZXJhdGlvbkNsaWVudCBvcENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFByZS1FeGVjdXRlIGxvZ2dpbmcgYW5kIHNldHVwCi0gICAgICAgICAgICBwcmVFeGVjdXRlKG9wQ2xpZW50LCBibG9jaywgbXNnQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIEludm9rZSB0aGUgT3BlcmF0aW9uQ2xpZW50Ci0gICAgICAgICAgICBvcENsaWVudC5leGVjdXRlKGJsb2NrKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIC8vIENhdGNoIGFsbCBUaHJvd2FibGUgKGluY2x1ZGluZyBydW50aW1lIGV4Y2VwdGlvbnMgYW5kIEVycm9ycykgYW5kCi0gICAgICAgICAgICAvLyB0aHJvdyBhcyBBeGlzRmF1bHQuCi0gICAgICAgICAgICAvLyBTaW5jZSBlIGNvdWxkIGJlIGEgVGhyb3dhYmxlIChvciBFcnJvcikgaW5zdGVhZCBvZiBhbiBFeGNlcHRpb24sIHdlJ2xsIGhhdmUgdG8gd3JhcCBpdDoKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBQb3N0LUV4ZWN1dGUgbG9nZ2luZyBhbmQgc2V0dXAKLSAgICAgICAgICAgIHBvc3RFeGVjdXRlKG9wQ2xpZW50LCBibG9jaywgbXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgZXhlY3V0ZShPcGVyYXRpb25DbGllbnQpIHRvIHBlcmZvcm0gcHJlLWV4ZWN1dGUgdGFza3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BDbGllbnQKLSAgICAgKiBAcGFyYW0gYmxvY2sgICAgICAtIEluZGljYXRlcyBpZiBibG9ja2luZyBvciBub24tYmxvY2tpbmcgZXhlY3V0ZQotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IC0gQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJlRXhlY3V0ZShPcGVyYXRpb25DbGllbnQgb3BDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBvbiB0aGUgdWx0aW1hdGUgZXhlY3V0aW9uIHRocmVhZAotCi0gICAgICAgIC8vVGhpcyBoYXMgdG8gYmUgaGVyZSBzbyB0aGUgVGhyZWFkQ29udGV4dE1pZ3JhdG9yIGNhbiBwaWNrIGl0IHVwLgotICAgICAgICBtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKG9wQ2xpZW50LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbAotICAgICAgICAgICAgICAgIC5wZXJmb3JtTWlncmF0aW9uVG9Db250ZXh0KENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtc2dDb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8vRW5hYmxlIHRoZSBUaHJlYWRDb250ZXh0TWlncmF0b3IgdG8gb3ZlcnJpZGUgVXNlU2VwYXJhdGVMaXN0ZW5lcgotICAgICAgICBvcENsaWVudC5nZXRPcHRpb25zKCkuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcihtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IE9wZXJhdGlvbkNsaWVudC5leGVjdXRlKCIgKyBibG9jayArICIpIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlVzZVNlcGFyYXRlTGlzdGVuZXI6ICIgKyBvcENsaWVudC5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IGV4ZWN1dGUoT3BlcmF0aW9uQ2xpZW50KSB0byBwZXJmb3JtIHBvc3QtZXhlY3V0ZSB0YXNrcy4gIFNob3VsZCBiZSBhIG1pcnJvciBvZgotICAgICAqIHByZUV4ZWN1dGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcENsaWVudAotICAgICAqIEBwYXJhbSBibG9jayAgICAgIC0gSW5kaWNhdGVzIGlmIGJsb2NraW5nIG9yIG5vbi1ibG9ja2luZyBleGVjdXRlCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgLSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3N0RXhlY3V0ZShPcGVyYXRpb25DbGllbnQgb3BDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgT3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUoIiArIGJsb2NrICsgIikiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRPRE8gQ3VycmVudGx5IHRoaXMgY2hlY2sgY2F1c2VzIFNPQVBNZXNzYWdlUHJvdmlkZXJUZXN0cyB0byBmYWlsLgotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHBsb2RlZCBPTVNvdXJjZWRFbGVtZW50Ci0gICAgICAgICAgICBPTUVsZW1lbnQgYm9keUVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9keUVsZW1lbnQgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOyAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJvb2xlYW4gZXhwYW5kZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChib2R5RWxlbWVudCAhPSBudWxsICYmIGJvZHlFbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgICAgICBleHBhbmRlZCA9ICgoT01Tb3VyY2VkRWxlbWVudEltcGwpYm9keUVsZW1lbnQpLmlzRXhwYW5kZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEFuIGV4cGxvZGVkIHhtbCBibG9jayBtYXkgaW5kaWNhdGUgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLiAgCi0gICAgICAgICAgICAvLyBJbiBnZW5lcmFsIGFuIHhtbCBibG9jayBzaG91bGQgcmVtYWluIHVuZXhwbG9kZWQgdW5sZXNzIHRoZXJlIGlzIGFuCi0gICAgICAgICAgICAvLyBvdXRib3VuZCBoYW5kbGVyIHRoYXQgdG91Y2hlcyB0aGUgYmxvY2suCi0gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldmVsb3BlciBEZWJ1ZzogRm91bmQgYW4gZXhwYW5kZWQgeG1sIGJsb2NrOiIgKyBib2R5RWxlbWVudC5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgLy8gQ2xlYW51cCBjb250ZXh0Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybUNvbnRleHRDbGVhbnVwKENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtc2dDb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9JbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL2NvbnRyb2xsZXIvaW1wbC9JbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjMyYTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL2ltcGwvSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSB7DQotICAgIA0KLSAgICBwdWJsaWMgSW52b2NhdGlvbkNvbnRyb2xsZXIgZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEF4aXNJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvY29udHJvbGxlci9pbXBsL0ludm9jYXRpb25Db250cm9sbGVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL2ltcGwvSW52b2NhdGlvbkNvbnRyb2xsZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDEwMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS9jb250cm9sbGVyL2ltcGwvSW52b2NhdGlvbkNvbnRyb2xsZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25QYXR0ZXJuOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUudXRpbC5NZXNzYWdlQ29udGV4dFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuQXR0YWNobWVudHNBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckNoYWluUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXJVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlNPQVBIZWFkZXJzQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi0vKioNCi0gKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIgaW50ZXJmYWNlLiANCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW52b2NhdGlvbkNvbnRyb2xsZXJJbXBsIGltcGxlbWVudHMgSW52b2NhdGlvbkNvbnRyb2xsZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSW52b2NhdGlvbkNvbnRyb2xsZXJJbXBsLmNsYXNzKTsNCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI2ludm9rZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQpDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW52b2NhdGlvbkNvbnRleHQgaW52b2tlKEludm9jYXRpb25Db250ZXh0IGljKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogc3luY2hyb25vdXMiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB3ZSBhdCBsZWFzdCBoYXZlIGEgdmFsaWQgSW52b2NhdGlvbkNvbnRleHQNCi0gICAgICAgIC8vIGFuZCByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBpZiAoaWMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNFcnIxIikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIklDRXJyMiIpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbnVsbDsNCi0NCi0gICAgICAgIHJlcXVlc3Quc2V0UHJvcGVydHkoQ29uc3RhbnRzLklOVk9DQVRJT05fUEFUVEVSTiwgSW52b2NhdGlvblBhdHRlcm4uU1lOQyk7DQotDQotICAgICAgICAvLyBJbnZva2Ugb3V0Ym91bmQgaGFuZGxlcnMuDQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPQ0KLSAgICAgICAgICAgICAgICBIYW5kbGVySW52b2tlclV0aWxzLmludm9rZU91dGJvdW5kSGFuZGxlcnMocmVxdWVzdC5nZXRNRVBDb250ZXh0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYy5nZXRIYW5kbGVycygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOw0KLQ0KLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsNCi0gICAgICAgICAgICBwcmVwYXJlUmVxdWVzdChyZXF1ZXN0KTsNCi0gICAgICAgICAgICByZXNwb25zZSA9IGRvSW52b2tlKHJlcXVlc3QpOw0KLSAgICAgICAgICAgIHByZXBhcmVSZXNwb25zZShyZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHRzIHNoYXJlIGEgc2luZ2xlIHBhcmVudA0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldE1FUENvbnRleHQocmVxdWVzdC5nZXRNRVBDb250ZXh0KCkpOw0KLQ0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgICogVE9ETyBUT0RPIFRPRE8gcmV2aWV3DQotICAgICAgICAgICAgICogDQotICAgICAgICAgICAgICogSW4gbW9zdCBjYXNlcyB3ZSBhcmUgYWRkaW5nIHRoZSBlbmRwb2ludERlc2MgdG8gdGhlDQotICAgICAgICAgICAgICogTWVzc2FnZUNvbnRleHQuIE5vdGljZSBoZXJlIHRoYXQgdGhlICJyZXNwb25zZSIgb2JqZWN0IGlzIHNldCBieQ0KLSAgICAgICAgICAgICAqIHRoZSBjYWxsIHRvIGRvSW52b2tlLiBJdCdzIGEgbmV3IGNvbnRleHQgd2UgYXJlIG5vdyB3b3JraW5nIHdpdGguDQotICAgICAgICAgICAgICogVGhlIGludm9rZUluYm91bmRIYW5kbGVycyB1c2VzIHRoYXQgY29udGV4dCB3YXkgZG93biBpbg0KLSAgICAgICAgICAgICAqIGNyZWF0ZU1lc3NhZ2VDb250ZXh0IC0tPiBDb250ZXh0VXRpbHMuYWRkUHJvcGVydGllcygpDQotICAgICAgICAgICAgICogDQotICAgICAgICAgICAgICogVGhpcyBtYXkgYWxzbyBvY2N1ciBpbiB0aGUgQXN5bmNSZXNwb25zZSBjbGFzcyB3aGVuIGNhbGxpbmcNCi0gICAgICAgICAgICAgKiBpbnZva2VJbmJvdW5kSGFuZGxlcnMNCi0gICAgICAgICAgICAgKiANCi0gICAgICAgICAgICAgKiBGb3Igbm93LCBtYWtlIHN1cmUgdGhlIGVuZHBvaW50RGVzYyBpcyBzZXQgb24gdGhlIHJlc3BvbnNlDQotICAgICAgICAgICAgICogY29udGV4dC4NCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICByZXNwb25zZS5zZXRFbmRwb2ludERlc2NyaXB0aW9uKHJlcXVlc3QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsNCi0NCi0gICAgICAgICAgICAvLyBJbnZva2UgaW5ib3VuZCBoYW5kbGVycy4NCi0gICAgICAgICAgICBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5pbnN0YWxsKHJlc3BvbnNlKTsNCi0gICAgICAgICAgICBBdHRhY2htZW50c0FkYXB0ZXIuaW5zdGFsbChyZXNwb25zZSk7DQotICAgICAgICAgICAgU09BUEhlYWRlcnNBZGFwdGVyLmluc3RhbGwocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIEhhbmRsZXJJbnZva2VyVXRpbHMuaW52b2tlSW5ib3VuZEhhbmRsZXJzKHJlc3BvbnNlLmdldE1FUENvbnRleHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYy5nZXRIYW5kbGVycygpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVTUE9OU0UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOw0KLSAgICAgICAgfSBlbHNlIHsgLy8gdGhlIG91dGJvdW5kIGhhbmRsZXIgY2hhaW4gbXVzdCBoYXZlIGhhZCBhIHByb2JsZW0sIGFuZA0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucw0KLSAgICAgICAgICAgIHJlc3BvbnNlID0gTWVzc2FnZUNvbnRleHRVdGlscy5jcmVhdGVNaW5pbWFsUmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgICAgICAvLyBzaW5jZSB3ZSd2ZSByZXZlcnNlZCBkaXJlY3Rpb25zLCB0aGUgbWVzc2FnZSBoYXMgImJlY29tZSBhDQotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHRzIHNoYXJlIGEgc2luZ2xlIHBhcmVudA0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldE1FUENvbnRleHQocmVxdWVzdC5nZXRNRVBDb250ZXh0KCkpOw0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldE1lc3NhZ2UocmVxdWVzdC5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7DQotICAgICAgICByZXR1cm4gaWM7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE1lc3NhZ2VDb250ZXh0IGRvSW52b2tlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpOw0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXIjaW52b2tlT25lV2F5KG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCkNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGludm9rZU9uZVdheShJbnZvY2F0aW9uQ29udGV4dCBpYykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogb25lLXdheSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYSB2YWxpZCBJbnZvY2F0aW9uQ29udGV4dA0KLSAgICAgICAgLy8gYW5kIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIGlmIChpYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjEiKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNFcnIyIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSU5WT0NBVElPTl9QQVRURVJOLCBJbnZvY2F0aW9uUGF0dGVybi5PTkVXQVkpOw0KLQ0KLSAgICAgICAgLy8gSW52b2tlIG91dGJvdW5kIGhhbmRsZXJzLg0KLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0NCi0gICAgICAgICAgICAgICAgSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VPdXRib3VuZEhhbmRsZXJzKHJlcXVlc3QuZ2V0TUVQQ29udGV4dCgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWMuZ2V0SGFuZGxlcnMoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOw0KLQ0KLSAgICAgICAgaWYgKHN1Y2Nlc3MpIHsNCi0gICAgICAgICAgICBwcmVwYXJlUmVxdWVzdChyZXF1ZXN0KTsNCi0gICAgICAgICAgICBkb0ludm9rZU9uZVdheShyZXF1ZXN0KTsNCi0gICAgICAgIH0gZWxzZSB7IC8vIHRoZSBvdXRib3VuZCBoYW5kbGVyIGNoYWluIG11c3QgaGF2ZSBoYWQgYSBwcm9ibGVtLCBhbmQgd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucw0KLSAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiBwcm9ibGVtIGlzIGR1ZSB0byBhIGhhbmRsZXIgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLiAgSWYgc28sIHRocm93IGl0LA0KLSAgICAgICAgICAgIC8vIGV2ZW4gaW4gdGhpcyBvbmVXYXkgaW52b2tlLg0KLSAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcmVxdWVzdC5nZXRDYXVzZWRCeUV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbillLmdldENhdXNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvSW52b2tlT25lV2F5KE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI2ludm9rZUFzeW5jKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCkNCi0gICAgICovDQotICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYykgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IGFzeW5jaHJvbm91cyhwb2xsaW5nKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYSB2YWxpZCBJbnZvY2F0aW9uQ29udGV4dA0KLSAgICAgICAgLy8gYW5kIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIGlmIChpYyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjEiKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSUNFcnIyIikpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSU5WT0NBVElPTl9QQVRURVJOLCBJbnZvY2F0aW9uUGF0dGVybi5BU1lOQ19QT0xMSU5HKTsNCi0NCi0gICAgICAgIFJlc3BvbnNlIHJlc3AgPSBudWxsOw0KLQ0KLSAgICAgICAgLy8gSW52b2tlIG91dGJvdW5kIGhhbmRsZXJzLg0KLSAgICAgICAgLy8gVE9ETyB1bmNvbW1lbnQsIGFuZCBnZXQgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gZnJvbSB0aGUgcmVxdWVzdCBjb250ZXh0LCB3aGljaCBzaG91bGQgc29vbiBiZSBhdmFpbGFibGUNCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9DQotICAgICAgICAgICAgICAgIEhhbmRsZXJJbnZva2VyVXRpbHMuaW52b2tlT3V0Ym91bmRIYW5kbGVycyhyZXF1ZXN0LmdldE1FUENvbnRleHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljLmdldEhhbmRsZXJzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotICAgICAgICBpZiAoc3VjY2Vzcykgew0KLSAgICAgICAgICAgIHByZXBhcmVSZXF1ZXN0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIHJlc3AgPSBkb0ludm9rZUFzeW5jKHJlcXVlc3QpOw0KLSAgICAgICAgfSBlbHNlDQotICAgICAgICB7IC8vIHRoZSBvdXRib3VuZCBoYW5kbGVyIGNoYWluIG11c3QgaGF2ZSBoYWQgYSBwcm9ibGVtLCBhbmQgd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucw0KLSAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3ZlIHJldmVyc2VkIGRpcmVjdGlvbnMsIHRoZSBtZXNzYWdlIGhhcyAiYmVjb21lIGEgcmVzcG9uc2UgbWVzc2FnZSIgKHNlY3Rpb24gOS4zLjIuMSwgZm9vdG5vdGUgc3VwZXJzY3JpcHQgMikNCi0NCi0gICAgICAgICAgICAvLyBUT0RPIHdlIGtub3cgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdCBtZXNzYWdlLCB3ZSBzaG91bGQNCi0gICAgICAgICAgICAvLyBjb252ZXJ0IGl0IHRvIGFuIGV4Y2VwdGlvbiBhbmQgdGhyb3cgaXQuDQotICAgICAgICAgICAgLy8gc29tZXRoaW5nIGxpa2U6DQotDQotICAgICAgICAgICAgLy90aHJvdyBuZXcgQXhpc0ZhdWx0KHJlcXVlc3QuZ2V0TWVzc2FnZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiByZXNwOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBhYnN0cmFjdCBSZXNwb25zZSBkb0ludm9rZUFzeW5jKE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0NCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyI2ludm9rZUFzeW5jKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dCwgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcikNCi0gICAgICovDQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoSW52b2NhdGlvbkNvbnRleHQgaWMsIEFzeW5jSGFuZGxlciBhc3luY0hhbmRsZXIpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBhc3luY2hyb25vdXMoY2FsbGJhY2spIik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgYXQgbGVhc3QgaGF2ZSBhIHZhbGlkIEludm9jYXRpb25Db250ZXh0DQotICAgICAgICAvLyBhbmQgcmVxdWVzdCBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgaWYgKGljID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIklDRXJyMSIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJQ0VycjIiKSk7DQotICAgICAgICB9DQotICAgICAgICBpZiAoKGljLmdldEV4ZWN1dG9yKCkgIT0gbnVsbCkgJiYgKGljLmdldEV4ZWN1dG9yKCkgaW5zdGFuY2VvZiBFeGVjdXRvclNlcnZpY2UpKSB7DQotICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGVzID0gKEV4ZWN1dG9yU2VydmljZSkgaWMuZ2V0RXhlY3V0b3IoKTsNCi0gICAgICAgICAgICBpZiAoZXMuaXNTaHV0ZG93bigpKSB7DQotICAgICAgICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBzZXJ2aWNlIGlzIHNodXRkb3duIGFuZCB3b24ndCBhY2NlcHQgbmV3IHRhc2tzDQotICAgICAgICAgICAgICAgIC8vIHNvIHJldHVybiBhbiBlcnJvciBiYWNrIHRvIHRoZSBjbGllbnQNCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoIkV4ZWN1dG9yU2h1dGRvd24iKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSU5WT0NBVElPTl9QQVRURVJOLCBJbnZvY2F0aW9uUGF0dGVybi5BU1lOQ19DQUxMQkFDSyk7DQotDQotICAgICAgICBGdXR1cmU8Pz4gZnV0dXJlID0gbnVsbDsNCi0NCi0gICAgICAgIC8vIEludm9rZSBvdXRib3VuZCBoYW5kbGVycy4NCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9DQotICAgICAgICAgICAgICAgIEhhbmRsZXJJbnZva2VyVXRpbHMuaW52b2tlT3V0Ym91bmRIYW5kbGVycyhyZXF1ZXN0LmdldE1FUENvbnRleHQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljLmdldEhhbmRsZXJzKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotICAgICAgICBpZiAoc3VjY2Vzcykgew0KLSAgICAgICAgICAgIHByZXBhcmVSZXF1ZXN0KHJlcXVlc3QpOw0KLSAgICAgICAgICAgIGZ1dHVyZSA9IGRvSW52b2tlQXN5bmMocmVxdWVzdCwgYXN5bmNIYW5kbGVyKTsNCi0gICAgICAgIH0gZWxzZSB7IC8vIHRoZSBvdXRib3VuZCBoYW5kbGVyIGNoYWluIG11c3QgaGF2ZSBoYWQgYSBwcm9ibGVtLCBhbmQNCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlJ3ZlIHJldmVyc2VkIGRpcmVjdGlvbnMNCi0gICAgICAgICAgICAvLyBzaW5jZSB3ZSd2ZSByZXZlcnNlZCBkaXJlY3Rpb25zLCB0aGUgbWVzc2FnZSBoYXMgImJlY29tZSBhDQotICAgICAgICAgICAgLy8gcmVzcG9uc2UgbWVzc2FnZSIgKHNlY3Rpb24gOS4zLjIuMSwgZm9vdG5vdGUgc3VwZXJzY3JpcHQgMikNCi0NCi0gICAgICAgICAgICAvLyBUT0RPOiBob3cgZG8gd2UgZGVhbCB3aXRoIHRoaXM/IFRoZSByZXNwb25zZSBtZXNzYWdlIG1heSBvciBtYXkNCi0gICAgICAgICAgICAvLyBub3QgYmUgYSBmYXVsdA0KLSAgICAgICAgICAgIC8vIG1lc3NhZ2UuIFdlIGRvIGtub3cgdGhhdCB0aGUgZGlyZWN0aW9uIGhhcyByZXZlcnNlZCwgc28gc29tZWhvdw0KLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8NCi0gICAgICAgICAgICAvLyBmbG93IGltbWVkaWF0ZWx5IG91dCBvZiB0aGUgYXN5bmMgYW5kIGdpdmUgdGhlIGV4Y2VwdGlvbiBhbmQvb3INCi0gICAgICAgICAgICAvLyByZXNwb25zZSBvYmplY3QNCi0gICAgICAgICAgICAvLyBiYWNrIHRvIHRoZSBjbGllbnQgYXBwIHdpdGhvdXQgY2FsbGluZw0KLSAgICAgICAgICAgIC8vIEFzeW5jUmVzcG9uc2UucHJvY2Vzc1Jlc3BvbnNlIG9yIHByb2Nlc3NGYXVsdA0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludm9rZUFzeW5jRXJyIikpOw0KLQ0KLSAgICAgICAgICAgIC8vIHRocm93IG5ldyBBeGlzRmF1bHQocmVxdWVzdC5nZXRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGZ1dHVyZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYWJzdHJhY3QgRnV0dXJlPD8+IGRvSW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgbWMsIEFzeW5jSGFuZGxlciBhc3luY0hhbmRsZXIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB3aG9ldmVyIGlzIHByb3ZpZGluZyB0aGUgc3BlY2lmaWMgY2xpZW50IGJpbmRpbmcuDQotICAgICAqICBPbmNlIHRoaXMgaXMgY2FsbGVkLCBldmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkIHRvIGludm9rZSB0aGUgb3BlcmF0aW9uIG11c3QgYmUgYXZhaWxhYmxlIGluDQotICAgICAqIHRoZSBNZXNzYWdlQ29udGV4dC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIG1jDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmVwYXJlUmVxdWVzdChNZXNzYWdlQ29udGV4dCBtYyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHdob2V2ZXIgaXMgcHJvdmlkaW5nIHRoZSBzcGVjaWZpYyBjbGllbnQgYmluZGluZy4NCi0gICAgICogIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSByZXNwb25zZSBoYXMgY29tZSBiYWNrIGFuZCBhbGxvd3MgdGhlIGNsaWVudCBiaW5kaW5nIHRvIHB1dA0KLSAgICAgKiB3aGF0ZXZlciBpbmZvIGl0IGhhcyBpbiB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBtYw0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJlcGFyZVJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS91dGlsL01lc3NhZ2VDb250ZXh0VXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvdXRpbC9NZXNzYWdlQ29udGV4dFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWVhODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY29yZS91dGlsL01lc3NhZ2VDb250ZXh0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci0KLS8qKiBBIHV0aWxpdHkgY2xhc3MgZm9yIGhhbmRsaW5nIHNvbWUgb2YgdGhlIGNvbW1vbiBpc3N1ZXMgcmVsYXRlZCB0byB0aGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0LiAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0VXRpbHMgewotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0LCBjcmVhdGUgYSBuZXcgTWVzc2FnZUNvbnRleHQgZnJvbSB0aGVyZSB3aXRoIHRoZSBuZWNlc3NhcnkKLSAgICAgKiBpbmZvcm1hdGlvbiB0byBtYWtlIHN1cmUgdGhlIG5ldyBNZXNzYWdlQ29udGV4dCBpcyByZWxhdGVkIHRvIHRoZSBleGlzdGluZyBvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWMgLSB0aGUgTWVzc2FnZUNvbnRleHQgdG8gdXNlIGFzIHRoZSBzb3VyY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVSZXNwb25zZU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgc291cmNlQXhpc01DID0gbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIGNvcGllZCBvdmVyIGF0IHRoZQotICAgICAgICAgICAgLy8gQXhpczIgbGV2ZWwuCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbmV3QXhpc01DID0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZU91dE1lc3NhZ2VDb250ZXh0KHNvdXJjZUF4aXNNQyk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG5ld01DID0gbmV3IE1lc3NhZ2VDb250ZXh0KG5ld0F4aXNNQyk7Ci0gICAgICAgICAgICBuZXdNQy5zZXRPdXRib3VuZCh0cnVlKTsKLSAgICAgICAgICAgIG5ld01DLnNldFNlcnZlcih0cnVlKTsKLSAgICAgICAgICAgIG5ld01DLnNldE1FUENvbnRleHQobWMuZ2V0TUVQQ29udGV4dCgpKTsKLSAgICAgICAgICAgIG5ld01DLnNldEVuZHBvaW50RGVzY3JpcHRpb24obWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIG5ld01DLnNldE9wZXJhdGlvbkRlc2NyaXB0aW9uKG1jLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ld01DOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKgotICAgICAqIHNwZWNpYWwgbWVzc2FnZWNvbnRleHQgdGhhdCBoYXMgbm8gQXhpc0NvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGl0LiAgVHlwaWNhbGx5LCB0aGlzCi0gICAgICogd291bGQgYmUgdXNlZCBpbiBhICJjbGllbnQgb3V0Ym91bmQgaGFuZGxlciB0aHJvd3MgZXhjZXB0aW9uIiBjYXNlIHNpbmNlIHRoYXQgd291bGQKLSAgICAgKiBtZWFuIHdlIG5ldmVyIGhpdCB0aGUgSW52b2NhdGlvbkNvbnRyb2xsZXIgYW5kIHRodXMgbmV2ZXIgaGl0IHRoZSBBeGlzIGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWluaW1hbFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IHNvdXJjZUF4aXNNQyA9IG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBuZXdNQyA9IG5ldyBNZXNzYWdlQ29udGV4dChzb3VyY2VBeGlzTUMpOwotICAgICAgICBuZXdNQy5zZXRNRVBDb250ZXh0KG1jLmdldE1FUENvbnRleHQoKSk7Ci0gICAgICAgIG5ld01DLnNldEVuZHBvaW50RGVzY3JpcHRpb24obWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgbmV3TUMuc2V0T3BlcmF0aW9uRGVzY3JpcHRpb24obWMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJldHVybiBuZXdNQzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0LCBjcmVhdGUgYSBuZXcgTWVzc2FnZUNvbnRleHQgZm9yIGEgZmF1bHQgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgZmF1bHRNQyA9Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGpheHdzRmF1bHRNQyA9IG5ldyBNZXNzYWdlQ29udGV4dChmYXVsdE1DKTsKLSAgICAgICAgICAgIGpheHdzRmF1bHRNQy5zZXRPdXRib3VuZCh0cnVlKTsKLSAgICAgICAgICAgIGpheHdzRmF1bHRNQy5zZXRTZXJ2ZXIodHJ1ZSk7Ci0gICAgICAgICAgICBqYXh3c0ZhdWx0TUMuc2V0TUVQQ29udGV4dChtYy5nZXRNRVBDb250ZXh0KCkpOwotICAgICAgICAgICAgamF4d3NGYXVsdE1DLnNldEVuZHBvaW50RGVzY3JpcHRpb24obWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIGpheHdzRmF1bHRNQy5zZXRPcGVyYXRpb25EZXNjcmlwdGlvbihtYy5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIHJldHVybiBqYXh3c0ZhdWx0TUM7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmUyZjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2hlcnMvR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgZGlzcGF0Y2hlciB3aWxsIGxvb2sgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uIG9uIHRoZSBBeGlzU2VydmljZSBhbmQgcmV0dXJuIGl0Ci0gKiBpZiBmb3VuZC4gIFRoaXMgZGlzcGF0Y2hlciBpcyB1c2VkIGZvciBQcm92aWRlci1iYXNlZCBlbmRwb2ludHMgd2hpY2ggZG8gbm90IGhhdmUgV1NETAotICogYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBUaG9zZSB0eXBlcyBvZiBlbmRwb2ludHMgd2lsbCBub3QgaGF2ZSBXU0RMIG9wZXJhdGlvbnMgY3JlYXRlZCBmb3IgdGhlbQotICogc2luY2UgKGEpIHRoZXJlIGlzIG5vIFdTREwgYW5kIChiKSB0aGVyZSBpcyBubyBTRUkgZnJvbSB3aGljaCB0byBidWlsZCBvcGVyYXRpb25zIHVzaW5nCi0gKiBhbm5vdGF0aW9ucy4gIEZvciB0aGVzZSB0eXBlcyBvZiBlbmRwb2ludHMsIGEgZ2VuZXJpYyBvcGVyYXRpb24gd2lsbCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlCi0gKiBzZXJ2aWNlIHdoaWNoIHdpbGwgYWNjZXB0IGFueSBpbmNvbWluZyBXU0RMIG9wZXJhdGlvbiBhbmQgcGFzcyB0aGUgaW5jb21pbmcgbWVzc2FnZSB0byB0aGUKLSAqIFByb3ZpZGVyIGVuZHBvaW50LiAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdERpc3BhdGNoZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kT3BlcmF0aW9uKG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gdGhlT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImZpbmRPcGVyYXRpb24gc2VydmljZSA9ICIgKyBzZXJ2aWNlICsgIjsgbWVzc2FnZWN0eDogIiArIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBBeGlzU2VydmljZSwgdGhlbiBsb29rIGZvciB0aGUgc3BlY2lhbGx5IG5hbWVkIG9wZXJhdGlvbiBhbmQgcmV0dXJuIGl0Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoZU9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLkpBWFdTX05PV1NETF9QUk9WSURFUl9PUEVSQVRJT05fTkFNRSkpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJvcGVyYXRpb24gIiArIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uSkFYV1NfTk9XU0RMX1BST1ZJREVSX09QRVJBVElPTl9OQU1FICsgIiBpcyAiICsgdGhlT3BlcmF0aW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0aGVPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRTZXJ2aWNlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZmluZFNlcnZpY2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBUaGlzIGRpc3BhdGNoZXIgd2lsbCBub3QgdHJ5IHRvIHJlc29sdmUgYW5kIEF4aXNTZXJ2aWNlIGlmIG9uZSBoYXNuJ3QgYmVlbgotICAgICAgICAvLyByZXNvbHZlZCBhbHJlYWR5Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNpbml0RGlzcGF0Y2hlcigpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdERpc3BhdGNoZXIoKSB7Ci0gICAgICAgIC8vIE5vIGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2hlcnMvTXVzdFVuZGVyc3RhbmRDaGVja2VyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZENoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1ZjI2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZENoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBQbHVnaW4gdG8gcmVtb3ZlICJ1bmRlcnN0b29kIiBoZWFkZXJzIGZvciB0aGUgSkFYV1MgcmVsYXRlZCBoZWFkZXJzLiAgVGhpcyBjbGFzcyBtdXN0DQotICogYmUgY29uZmlndXJlZCBpbiB0aGUgYXhpczIueG1sIGZpbGUgb24gYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLg0KLSAqIA0KLSAqICBVbmRlcnN0b29kIGhlYWRlcnMgKHBlciBKQVhXUyAyLjAgU2VjdGlvbiAxMC4yKSBpbmNsdWRlDQotICogIC0gSGVhZGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gU0VJIG1ldGhvZCBwYXJhbWV0ZXJzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNdXN0VW5kZXJzdGFuZENoZWNrZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNdXN0VW5kZXJzdGFuZENoZWNrZXIuY2xhc3MpOw0KLQ0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBoZWFkZXJzIGZvciB0aGUgcm9sZXMgd2UncmUgYWN0aW5nIGluLCB0aGVuIG1hcmsgYW55IHdlIHVuZGVyc3RhbmQNCi0gICAgICAgIC8vIGFzIHByb2Nlc3NlZC4NCi0gICAgICAgIE11c3RVbmRlcnN0YW5kVXRpbHMubWFya1VuZGVyc3Rvb2RIZWFkZXJQYXJhbWV0ZXJzKG1zZ0NvbnRleHQpOw0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDJlNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2hlcnMvTXVzdFVuZGVyc3RhbmRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbiBwcm9jZXNzaW5nIG11c3RVbmRlcnN0YW5kIGhlYWRlcnMgcmVsYXRpdmUgdG8gSkFYV1MuDQotICovDQotcHVibGljIGNsYXNzIE11c3RVbmRlcnN0YW5kVXRpbHMgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTXVzdFVuZGVyc3RhbmRVdGlscy5jbGFzcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogTWFyayBhbGwgaGVhZGVycyBmb3IgSkFYV1MgU0VJIG1ldGhvZCBwYXJhbWF0ZXJzIGFzIHVuZGVyc3Rvb2QuICBOb3RlIHRoYXQgcGVyIHRoZSBKQVhXUw0KLSAgICAgKiAyLjAgc3BlY2lmaWNhdGlvbiwgYSBoZWFkZXIgaXMgY29uc2lkZXJlZCB1bmRlcnN0b29kIGlmIGl0IHVzZWQgYnkgYXMgYSBwYXJhbWV0ZXIgZm9yIA0KLSAgICAgKiBhbnkgbWV0aG9kIG9uIHRoZSBTRUksIG5vdCBqdXN0IHRoZSBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgaW5jb21pbmcgb3BlcmF0aW9uLiAgDQotICAgICAqIFNlZSBTZWN0aW9uIDEwLjIuMSBpdGVtIDMuYSB3aGljaCBzcGVjaWZpY2FsbHkgc2F5cyAibWFwcGVkIHRvIG1ldGhvZCBwYXJhbWV0ZXJzDQotICAgICAqIGluIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSIuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmtVbmRlcnN0b29kSGVhZGVyUGFyYW1ldGVycyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7DQotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7DQotICAgICAgICBpZiAoZW52ZWxvcGUuZ2V0SGVhZGVyKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgQXJyYXlMaXN0IHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXMgPSBNdXN0VW5kZXJzdGFuZFV0aWxzLmdldEhlYWRlclBhcmFtYXRlckxpc3QobXNnQ29udGV4dCk7DQotICAgICAgICBpZiAodW5kZXJzdG9vZEhlYWRlclFOYW1lcyA9PSBudWxsIHx8IHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXMuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBQYXNzaW5nIGluIG51bGwgd2lsbCBnZXQgaGVhZGVycyB0YXJnZXRlZCBmb3IgTkVYVCBhbmQgVUxUSU1BVEUgUkVDRUlWRVINCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3MobnVsbCk7DQotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7DQotICAgICAgICAgICAgUU5hbWUgaGVhZGVyUU4gPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIGlmICh1bmRlcnN0b29kSGVhZGVyUU5hbWVzLmNvbnRhaW5zKGhlYWRlclFOKSkgew0KLSAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkhlYWRlciBtYXJrZWQgYXMgcHJvY2Vzc2VkIGJ5IEpBWFdTIE11c3RVbmRlcnN0YW5kQ2hlY2tlcjogIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhlYWRlclFOKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIGFuIEFycmF5TGlzdCBvZiBRTmFtZXMgY29ycmVzcG9uZGluZyB0byBTT0FQIGhlYWRlcnMgd2hpY2ggbWFwIHRvIG1ldGhvZCBwYXJhbWV0ZXJzDQotICAgICAqIGZvciBhbnkgbWV0aG9kcyBvbiB0aGUgY29ycmVzcG9uZGluZyBTRUkgYW5kIHRoZSBTT0FQIGhhbmRsZXJzLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQNCi0gICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgUU5hbWVzIGZvciBhbGwgaGVhZGVyIHBhcmFtZXRlcnMgZm9yIGFuIFNFSSBhbmQgU09BUCBoYW5kbGVycy4gIA0KLSAgICAgKiAgICAgICAgIFRoZSBsaXN0IG1heSBiZSBlbXB0eSBidXQgd2lsbCBub3QgYmUgbnVsbC4NCi0gICAgICovDQotICAgIHN0YXRpYyBBcnJheUxpc3QgRU1QVFlfTElTVCA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgcHVibGljIHN0YXRpYyBBcnJheUxpc3QgZ2V0SGVhZGVyUGFyYW1hdGVyTGlzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7DQotICAgICAgICBBcnJheUxpc3QgaGVhZGVycyA9IG51bGw7DQotICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdW5kZXJzdG9vZCBoZWFkZXJzIGZvciBhbGwgdGhlIG9wZXJhdGlvbnMgdW5kZXIgdGhlIHNlcnZpY2UNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJCdWlsZGluZyBsaXN0IG9mIHVuZGVyc3Rvb2QgaGVhZGVycyBmb3IgYWxsIG9wZXJhdGlvbnMgdW5kZXIgIiArIGF4aXNTZXJ2aWNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgaGVhZGVycyA9IEVNUFRZX0xJU1Q7DQotICAgICAgICB9IGVsc2UgIHsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHVuZGVyc3Rvb2QgaGVhZGVycyBmcm9tIHRoZSBzZWkgbWV0aG9kcw0KLSAgICAgICAgICAgIEFycmF5TGlzdCBzZWlNZXRob2RIZWFkZXJzID0gKEFycmF5TGlzdCkgDQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKCJzZWlNZXRob2RIZWFkZXJQYXJhbWV0ZXIiKTsNCi0NCi0gICAgICAgICAgICBpZiAoc2VpTWV0aG9kSGVhZGVycyA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIC8vIGV4YW1pbmUgU0VJIG1ldGhvZHMNCi0gICAgICAgICAgICAgICAgc2VpTWV0aG9kSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9uSXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25JdGVyYXRvciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9uSXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gZ2V0U0VJTWV0aG9kSGVhZGVyUGFyYW1ldGVyTGlzdChvcGVyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBoZWFkZXJzIGZyb20gb3BlcmF0aW9uICIgKyBvcGVyYXRpb24gKyAiOyBoZWFkZXJzID0gIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaXN0KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VpTWV0aG9kSGVhZGVycy5hZGRBbGwobGlzdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIGNhbGN1bGF0ZWQgdmFsdWUgc2luY2UgdGhpcyB3b24ndCBjaGFuZ2UNCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcigic2VpTWV0aG9kSGVhZGVyUGFyYW1ldGVyIiwgc2VpTWV0aG9kSGVhZGVycyk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb2JsZW0gY2FjaGluZyBzZWlNZXRob2RIZWFkZXJQYXJhbWV0ZXIuICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgY29udGludWVzIHdpdGhvdXQgY2FjaGVkIHZhbHVlIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgdW5kZXJzdG9vZCBoZWFkZXJzIGZyb20gdGhlIGhhbmRsZXJzDQotICAgICAgICAgICAgQXJyYXlMaXN0IGhhbmRsZXJIZWFkZXJzID0gZ2V0SGFuZGxlcnNIZWFkZXJQYXJhbWV0ZXJMaXN0KGF4aXNTZXJ2aWNlKTsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgaGVhZGVycyBmcm9tIFNPQVAgaGFuZGxlcnM7IGhlYWRlcnMgPSAiICsgaGFuZGxlckhlYWRlcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBNYWtlIHRoZSBjb21iaW5lZCBoZWFkZXJzIGxpc3QuDQotICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGF2b2lkcyBtYWtpbmcgdGVtcG9yYXJ5IGFycmF5IGxpc3RzIGZvciBwZXJmb3JtYW5jZS9nYyByZWFzb25zDQotICAgICAgICAgICAgaWYgKHNlaU1ldGhvZEhlYWRlcnMgPT0gbnVsbCB8fCBzZWlNZXRob2RIZWFkZXJzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBoZWFkZXJzID0gKGhhbmRsZXJIZWFkZXJzID09IG51bGwpID8gRU1QVFlfTElTVCA6IGhhbmRsZXJIZWFkZXJzOyAgLy8gUmV0dXJuIGhhbmRsZXIgaGVhZGVycw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlckhlYWRlcnMgPT0gbnVsbCB8fCBoYW5kbGVySGVhZGVycy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgaGVhZGVycyA9IChzZWlNZXRob2RIZWFkZXJzID09IG51bGwpID8gRU1QVFlfTElTVCA6IHNlaU1ldGhvZEhlYWRlcnM7ICAvLyBSZXR1cm4gc2VpIG1ldGhvZCBoZWFkZXJzDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgaGVhZGVycy5hZGRBbGwoc2VpTWV0aG9kSGVhZGVycyk7DQotICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkQWxsKGhhbmRsZXJIZWFkZXJzKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaGVhZGVyczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJldHVybiBhbiBBcnJheUxpc3Qgb2YgUU5hbWVzIGNvcnJlc3BvbmRpbmcgdG8gU09BUCBoZWFkZXJzIHdoaWNoIG1hcCB0byBtZXRob2QgcGFyYW1ldGVycw0KLSAgICAgKiBmb3IgYSBzcGVjaWZpYyBvcGVyYXRpb24uDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpc09wZXJhdGlvbg0KLSAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCBvZiBoZWFkZXIgUU5hbWVzIGZvciBhbGwgaGVhZGVyIHBhcmFtdGVycyBvbiBhbiBvcGVyYXRpb24sIG9yIG51bGwgaWYgbm9uZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGdldFNFSU1ldGhvZEhlYWRlclBhcmFtZXRlckxpc3QoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0SGVhZGVyUGFyYW1ldGVyTGlzdChheGlzT3BlcmF0aW9uLCBPcGVyYXRpb25EZXNjcmlwdGlvbi5IRUFERVJfUEFSQU1FVEVSX1FOQU1FUyk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm4gYW4gQXJyYXlMaXN0IG9mIFFOYW1lcyB0aGF0IGlzIGEgY29sbGVjdGlvbiBvZiBTT0FQIGhhbmRsZXJzIA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlDQotICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IG9mIGhlYWRlciBRTmFtZXMuICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGdldEhhbmRsZXJzSGVhZGVyUGFyYW1ldGVyTGlzdChBeGlzU2VydmljZSBheGlzU2VydmljZSkgew0KLSAgICAgICAgcmV0dXJuIGdldEhlYWRlclBhcmFtZXRlckxpc3QoYXhpc1NlcnZpY2UsIEVuZHBvaW50RGVzY3JpcHRpb24uSEFORExFUl9QQVJBTUVURVJfUU5BTUVTKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGdldEhlYWRlclBhcmFtZXRlckxpc3QoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwgU3RyaW5nIHBhcmFtTmFtZSkgeyAgICAgICAgDQotICAgICAgICBQYXJhbWV0ZXIgaGVhZGVyUU5hbWVzUGFyYW1ldGVyID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBhcmFtZXRlcihwYXJhbU5hbWUpOw0KLSAgICAgICAgaWYgKGhlYWRlclFOYW1lc1BhcmFtZXRlciA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIG5vdCBvbiAiICsgYXhpc0Rlc2NyaXB0aW9uICsgIjsgIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyYW1OYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBBcnJheUxpc3QgdW5kZXJzdG9vZEhlYWRlclFOYW1lcyA9IChBcnJheUxpc3QpIGhlYWRlclFOYW1lc1BhcmFtZXRlci5nZXRWYWx1ZSgpOw0KLSAgICAgICAgaWYgKHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXMgPT0gbnVsbCB8fCB1bmRlcnN0b29kSGVhZGVyUU5hbWVzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlciB2YWx1ZSBpcyBlbXB0eTogIiAgKyBheGlzRGVzY3JpcHRpb24gKyAiOyAiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbU5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB1bmRlcnN0b29kSGVhZGVyUU5hbWVzOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kaXNwYXRjaGVycy9NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGJjMjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGlzcGF0Y2hlcnMvTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnM7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIERvIEpBWFdTIE11c3RVbmRlcnN0YW5kIGhlYWRlciBwcm9jZXNzaW5nIHBlciB0aGUgSkFYV1MgMi4wIHNwZWNpZmljYXRpb24uICBUaGlzIGNoZWNrcyBmb3INCi0gKiBhIHNwZWNpZmljIGNvbXBsaWFuY2Ugc2l0dWF0aW9uIHdoZXJlIGEgbm9uLWV4aXN0YW50IG9wZXJhdGlvbiB3aXRoIG11c3RVbmRlcnN0b29kIGhlYWRlcnMgDQotICogdGhhdCBhcmUgbm90IHVuZGVyc3Rvb2QgbXVzdCB0aHJvdyBhIG11c3RVbmRlcnN0YW5kRmF1bHQgcmF0aGVyIHRoYW4gYW4gaW52YWxpZCBFUFIgZXhjZXB0aW9uLg0KLSAqIA0KLSAqICBOb3RlIHRoYXQgdGhpcyBoYW5kbGVyIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgaW5ib3VuZCBkaXNwYXRoZXIgY2hhaW5zIHNvIHRoYXQgdGhlDQotICogIERpc3BhdGNoZXIgY2hlY2tQb3N0Q29uZGl0aW9ucyBkb2VzIG5vdCB0aHJvdyB0aGUgaW52YWxpZCBFUFIgZmF1bHQgaWYgdGhlIG9wZXJhdGlvbiBpcyBudWxsLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3REaXNwYXRjaGVyIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIuY2xhc3MpOw0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQ0KLSAgICAgKi8NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpDQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRTZXJ2aWNlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkNCi0gICAgICovDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZmluZFNlcnZpY2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNpbml0RGlzcGF0Y2hlcigpDQotICAgICAqLw0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgaW5pdERpc3BhdGNoZXIoKSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbXNnY3R4LmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkpBWFdTIE11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIuaW52b2tlIG9uIEF4aXNTZXJ2aWNlICIgDQotICAgICAgICAgICAgICAgICAgICAgICsgYXhpc1NlcnZpY2UNCi0gICAgICAgICAgICAgICAgICAgICAgKyAiOyBBeGlzT3BlcmF0aW9uICIgKyBheGlzT3BlcmF0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFJFVklFVzogVGhpcyB3aWxsIG9ubHkgY2hlY2sgZG8gdGhlIG11c3RVbmRlcnN0YW5kIGNoZWNraW5nIGlmIHRoZSBvcGVyYXRpb24gaXMgbnVsbA0KLSAgICAgICAgLy8gVGhhdCBpcyBiZWNhdXNlIEpBWFdTIGNvbXBsaWFuY2UgcmVxdWlyZXMgd2UgdGhyb3cgYSBtdXN0VW5kZXJzdGFuZCBmYXVsdCBldmVuIGlmIHRoZSBvcGVyYXRpb24gaXMNCi0gICAgICAgIC8vIGludmFsaWQuICBJZiB0aGUgb3BlcmF0aW9uIGlzIHZhbGlkLCB0aGVuIGZ1cnRoZXIgbXVzdFVuZGVyc3RhbmQgcHJvY2Vzc2luZyB3aWxsIGJlIGRvbmUNCi0gICAgICAgIC8vIGJ5IHRoZSBKQVhXUyBNdXN0VW5kZXJzdGFuZENoZWNrZXIgaGFuZGxlci4gDQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCAmJiBheGlzT3BlcmF0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICBjaGVja011c3RVbmRlcnN0YW5kKG1zZ2N0eCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja011c3RVbmRlcnN0YW5kKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgYm9vbGVhbiBjaGVja3NQYXNzID0gdHJ1ZTsNCi0NCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGNoZWNrc1Bhc3M7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIEZpcnN0IG1hcmsgYWxsIHRoZSBoZWFkZXJzIEpBWFdTIHdvdWxkIHVuZGVyc3RhbmQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRocm93DQotICAgICAgICAvLyBhIG11c3RVbmRlcnN0YW5kIGZhdWx0IGluYXBwcm9wcmlhdGVseSBmb3IgdGhvc2UuDQotICAgICAgICBNdXN0VW5kZXJzdGFuZFV0aWxzLm1hcmtVbmRlcnN0b29kSGVhZGVyUGFyYW1ldGVycyhtc2dDb250ZXh0KTsNCi0NCi0gICAgICAgIC8vIE5vdyBjaGVjayBhbGwgdGhlIGhlYWRlcnMgYW5kIHRocm93IHRoZSBtdXN0VW5kZXJzdGFuZEZhdWx0IGlmIGFueSBub3QgdW5kZXJzdG9vZC4NCi0gICAgICAgIC8vIFJFVklFVzogTm90ZSB0aGF0IFFvU2VzIHRoYXQgd291bGQgcnVuIGFmdGVyIHRoZSBkaXNwYXRjaCBwaGFzZSB3aWxsIG5vdCBoYXZlIG1hcmtlZA0KLSAgICAgICAgLy8gdGhlaXIgaGVhZGVycyB5ZXQuDQotDQotICAgICAgICBJdGVyYXRvciBoZWFkZXJCbG9ja3MgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5nZXRIZWFkZXJzVG9Qcm9jZXNzKG51bGwpOw0KLSAgICAgICAgd2hpbGUgKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOw0KLSAgICAgICAgICAgIGlmIChoZWFkZXJCbG9jay5pc1Byb2Nlc3NlZCgpIHx8ICFoZWFkZXJCbG9jay5nZXRNdXN0VW5kZXJzdGFuZCgpKSB7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBRTmFtZSBmYXVsdFFOYW1lID0gaGVhZGVyQmxvY2suZ2V0VmVyc2lvbigpLmdldE11c3RVbmRlcnN0YW5kRmF1bHRDb2RlKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtdXN0dW5kZXJzdGFuZGZhaWxlZCIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5nZXRMb2NhbE5hbWUoKSksIGZhdWx0UU5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNoZWNrc1Bhc3M7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9DbGllbnRDb25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvQ2xpZW50Q29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjdjNzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9DbGllbnRDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXI7DQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGludGVyZmFjZSBDbGllbnRDb25maWd1cmF0b3Igew0KLSAgICAvKioNCi0gICAgICogUGVyZm9ybSBjbGllbnQtc2lkZSBjb25maWd1cmF0aW9uIGZvciBhIDxjb2RlPldlYlNlcnZpY2VGZWF0dXJlPC9jb2RlPi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dA0KLSAgICAgKiBAcGFyYW0gcHJvdmlkZXINCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29uZmlndXJhdG9yIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgYmluZGluZy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBiaW5kaW5nIHRoZSBiaW5kaW5nIHRvIHRlc3QNCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdG9yIHN1cHBvcnRzIHRoZSBiaW5kaW5nLCA8Y29kZT5mYWxzZTwvY29kZT4NCi0gICAgICogb3RoZXJ3aXNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQmluZGluZyBiaW5kaW5nKTsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9DbGllbnRGcmFtZXdvcmsuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvQ2xpZW50RnJhbWV3b3JrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODA5Y2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9DbGllbnRGcmFtZXdvcmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBDbGllbnRGcmFtZXdvcmsgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlRmVhdHVyZVtdIFpFUk9fTEVOR1RIX0FSUkFZID0gbmV3IFdlYlNlcnZpY2VGZWF0dXJlWzBdOw0KLSAgICANCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDbGllbnRDb25maWd1cmF0b3I+IGNvbmZpZ3VyYXRvck1hcDsNCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBXZWJTZXJ2aWNlRmVhdHVyZT4gZmVhdHVyZU1hcDsNCi0gICAgDQotICAgIHB1YmxpYyBDbGllbnRGcmFtZXdvcmsoKSB7DQotICAgIAlzdXBlcigpOw0KLSAgICAgICAgY29uZmlndXJhdG9yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGllbnRDb25maWd1cmF0b3I+KCk7DQotICAgICAgICBmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXZWJTZXJ2aWNlRmVhdHVyZT4oKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdG9yKFN0cmluZyBpZCwgQ2xpZW50Q29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgew0KLSAgICAgICAgY29uZmlndXJhdG9yTWFwLnB1dChpZCwgY29uZmlndXJhdG9yKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChXZWJTZXJ2aWNlRmVhdHVyZSBmZWF0dXJlKSB7DQotICAgICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRvck1hcC5jb250YWluc0tleShmZWF0dXJlLmdldElEKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBhZGRGZWF0dXJlKFdlYlNlcnZpY2VGZWF0dXJlIGZlYXR1cmUpIHsNCi0gICAgICAgIGlmICghaXNWYWxpZChmZWF0dXJlKSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZFdTRmVhdHVyZSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5nZXRJRCgpKSk7DQotICAgICAgICB9DQotICAgICAgICBmZWF0dXJlTWFwLnB1dChmZWF0dXJlLmdldElEKCksIGZlYXR1cmUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgV2ViU2VydmljZUZlYXR1cmUgZ2V0RmVhdHVyZShTdHJpbmcgaWQpIHsNCi0gICAgICAgIHJldHVybiBmZWF0dXJlTWFwLmdldChpZCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlRmVhdHVyZVtdIGdldEFsbEZlYXR1cmVzKCkgew0KLSAgICAgICAgcmV0dXJuIGZlYXR1cmVNYXAudmFsdWVzKCkudG9BcnJheShaRVJPX0xFTkdUSF9BUlJBWSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgQmluZGluZ1Byb3ZpZGVyIHByb3ZpZGVyKSB7DQotICAgICAgICBmb3IgKFdlYlNlcnZpY2VGZWF0dXJlIGZlYXR1cmUgOiBnZXRBbGxGZWF0dXJlcygpKSB7DQotICAgICAgICAgICAgQ2xpZW50Q29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvck1hcC5nZXQoZmVhdHVyZS5nZXRJRCgpKTsNCi0gICAgICAgICAgICBjb25maWd1cmF0b3IuY29uZmlndXJlKG1lc3NhZ2VDb250ZXh0LCBwcm92aWRlcik7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL0pBWFdTRGVwbG95ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZyYW1ld29yay9KQVhXU0RlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOGUzMTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZnJhbWV3b3JrL0pBWFdTRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yazsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXJyb3JNc2dzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy51dGlsLkVuZHBvaW50Q29udGV4dE1hcDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRLZXk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkpBWFdTTWVzc2FnZVJlY2VpdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsNCi0NCi0vKg0KLSAqIEpBWFdTRGVwbG95ZXIgaXMgYSBjdXN0b20gZGVwbG95ZXIgbW9kZWxlZCBhZnRlciB0aGUgUE9KT0RlcGxveWVyLiBJdHMgcHVycG9zZQ0KLSAqIGlzIHRvIGRlcGxveSAud2FycyBhbmQgZXhwYW5kZWQgLndhciBkaXJlY3Rvcmllcw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhXU0RlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYV1NEZXBsb3llci5jbGFzcyk7DQotDQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7DQotICAgIHByb3RlY3RlZCBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOw0KLQ0KLSAgICAvL1RvIGluaXRpYWxpemUgdGhlIGRlcGxveWVyDQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7DQotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsNCi0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgZGVwbG95U2VydmljZXNJbldBUkNsYXNzUGF0aCgpOw0KLSAgICB9Ly9XaWxsIHByb2Nlc3MgdGhlIGZpbGUgYW5kIGFkZCB0aGF0IHRvIGF4aXNDb25maWcNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVwbG95U2VydmljZXNJbldBUkNsYXNzUGF0aCgpIHsNCi0gICAgICAgIFN0cmluZyBkaXIgPSBEZXBsb3ltZW50RW5naW5lLmdldFdlYkxvY2F0aW9uU3RyaW5nKCk7DQotICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsNCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIgKyAiL1dFQi1JTkYvY2xhc3Nlcy8iKTsNCi0gICAgICAgICAgICBVUkwgcmVwb3NpdG9yeSA9IGF4aXNDb25maWcuZ2V0UmVwb3NpdG9yeSgpOw0KLSAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpIHx8IHJlcG9zaXRvcnkgPT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgIEFycmF5TGlzdCBjbGFzc0xpc3QgPSBnZXRDbGFzc2VzSW5XZWJJbmZEaXJlY3RvcnkoZmlsZSk7DQotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGhyZWFkQ2xhc3NMb2FkZXIgPSBudWxsOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHRocmVhZENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgICAgIHVybHMuYWRkKHJlcG9zaXRvcnkpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViTG9jYXRpb24gPSBEZXBsb3ltZW50RW5naW5lLmdldFdlYkxvY2F0aW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICh3ZWJMb2NhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB1cmxzLmFkZChuZXcgRmlsZSh3ZWJMb2NhdGlvbikudG9VUkwoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBVdGlscy5jcmVhdGVDbGFzc0xvYWRlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChGaWxlKSBheGlzQ29uZmlnLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7DQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsNCi0gICAgICAgICAgICAgICAgZGVwbG95Q2xhc3NlcygiSkFYV1MtQnVpbHRpbiIsIGZpbGUudG9VUkwoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwgY2xhc3NMaXN0KTsNCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJkZXBsb3lpbmdleGNlcHRpb24iLCBlLmdldE1lc3NhZ2UoKSksIGUpOw0KLSAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDbGFzc0xvYWRlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0aHJlYWRDbGFzc0xvYWRlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRDbGFzc2VzSW5XZWJJbmZEaXJlY3RvcnkoRmlsZSBmaWxlKSB7DQotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgQ29sbGVjdGlvbiBmaWxlcyA9IEZpbGVVdGlscy5saXN0RmlsZXMoZmlsZSwgbmV3IFN0cmluZ1tdeyJjbGFzcyJ9LCB0cnVlKTsNCi0gICAgICAgIEFycmF5TGlzdCBjbGFzc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmlsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgIEZpbGUgZiA9IChGaWxlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgU3RyaW5nIGZQYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZnFjbiA9IGZQYXRoLnN1YnN0cmluZyhmaWxlUGF0aC5sZW5ndGgoKSArIDEpOw0KLSAgICAgICAgICAgIGZxY24gPSBmcWNuLnN1YnN0cmluZygwLCBmcWNuLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOw0KLSAgICAgICAgICAgIGZxY24gPSBmcWNuLnJlcGxhY2UoJy8nLCAnLicpOw0KLSAgICAgICAgICAgIGZxY24gPSBmcWNuLnJlcGxhY2UoJ1xcJywgJy4nKTsNCi0gICAgICAgICAgICBjbGFzc0xpc3QuYWRkKGZxY24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNsYXNzTGlzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgew0KLSAgICAgICAgQ2xhc3NMb2FkZXIgdGhyZWFkQ2xhc3NMb2FkZXIgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0aHJlYWRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7DQotICAgICAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCk7DQotICAgICAgICAgICAgVVJMIGxvY2F0aW9uID0gZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpOw0KLSAgICAgICAgICAgIGlmIChpc0phcihkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95aW5nIGFydGlmYWN0IDogIiArIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgdXJscy5hZGQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsNCi0gICAgICAgICAgICAgICAgdXJscy5hZGQoYXhpc0NvbmZpZy5nZXRSZXBvc2l0b3J5KCkpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgd2ViTG9jYXRpb24gPSBEZXBsb3ltZW50RW5naW5lLmdldFdlYkxvY2F0aW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICh3ZWJMb2NhdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB1cmxzLmFkZChuZXcgRmlsZSh3ZWJMb2NhdGlvbikudG9VUkwoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBVdGlscy5jcmVhdGVDbGFzc0xvYWRlcigNCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChGaWxlKSBheGlzQ29uZmlnLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7DQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsNCi0NCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGNsYXNzTGlzdCA9IGdldExpc3RPZkNsYXNzZXMoZGVwbG95bWVudEZpbGVEYXRhKTsNCi0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBkZXBsb3lDbGFzc2VzKGdyb3VwTmFtZSwgbG9jYXRpb24sIGNsYXNzTG9hZGVyLCBjbGFzc0xpc3QpOyANCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIGlmKHNlcnZpY2VHcm91cCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yOlxuIE5vIGFubm90YXRlZCBjbGFzc2VzIGZvdW5kIGluIHRoZSBqYXI6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi50b1N0cmluZygpICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gU2VydmljZSBkZXBsb3ltZW50IGZhaWxlZC4iOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7DQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldEZhdWx0eVNlcnZpY2VzKCkuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dChkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpLCBtc2cpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgic3Ryb3JpbmdmYXVsdHlzZXJ2aWNlIiwgdC5nZXRNZXNzYWdlKCkpLCB0KTsNCi0gICAgICAgICAgICBzdG9yZUZhdWx0eVNlcnZpY2UoZGVwbG95bWVudEZpbGVEYXRhLCB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKHRocmVhZENsYXNzTG9hZGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhyZWFkQ2xhc3NMb2FkZXIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2VHcm91cCBkZXBsb3lDbGFzc2VzKFN0cmluZyBncm91cE5hbWUsIFVSTCBsb2NhdGlvbiwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIExpc3QgY2xhc3NMaXN0KQ0KLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBBeGlzRmF1bHQgew0KLSAgICAgICAgQXJyYXlMaXN0IGF4aXNTZXJ2aWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gY2xhc3NMaXN0LnNpemUoKTsgaSA8IHNpemU7IGkrKykgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc0xpc3QuZ2V0KGkpOw0KLSAgICAgICAgICAgIENsYXNzIHBvam9DbGFzczsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBwb2pvQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKGNsYXNzTG9hZGVyLCBjbGFzc05hbWUpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFdlYlNlcnZpY2Ugd3NBbm5vdGF0aW9uID0gKFdlYlNlcnZpY2UpIHBvam9DbGFzcy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlciB3c3BBbm5vdGF0aW9uID0gbnVsbDsNCi0gICAgICAgICAgICBpZiAod3NBbm5vdGF0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3NwQW5ub3RhdGlvbiA9IChXZWJTZXJ2aWNlUHJvdmlkZXIpIHBvam9DbGFzcy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBBeGlzIFNlcnZpY2Ugb25seSBpZiB0aGUgY2xhc3MgaXMgbm90IGFuIGludGVyZmFjZSBhbmQgaXQgaGFzIGVpdGhlciANCi0gICAgICAgICAgICAvLyBAV2ViU2VydmljZSBhbm5vdGF0aW9uIG9yIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbi4NCi0gICAgICAgICAgICBpZiAoKHdzQW5ub3RhdGlvbiAhPSBudWxsDQotICAgICAgICAgICAgICAgICAgICB8fCB3c3BBbm5vdGF0aW9uICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICAmJiAhcG9qb0NsYXNzLmlzSW50ZXJmYWNlKCkpIHsNCi0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7DQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0NCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVBeGlzU2VydmljZShjbGFzc0xvYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsNCi0gICAgICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkRlcGxveWluZyBKQVhXUyBhbm5vdGF0ZWQgY2xhc3MgIiArIGNsYXNzTmFtZSArICIgYXMgYSBzZXJ2aWNlIC0gIiArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUxpc3QuYWRkKGF4aXNTZXJ2aWNlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIGludCBzaXplID0gYXhpc1NlcnZpY2VMaXN0LnNpemUoKTsNCi0gICAgICAgIGlmIChzaXplIDw9IDApIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsNCi0gICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGdyb3VwTmFtZSk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBheGlzU2VydmljZUxpc3QuZ2V0KGkpOw0KLSAgICAgICAgICAgIHNlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7DQotICAgICAgICBjb25maWd1cmVBZGRyZXNzaW5nKHNlcnZpY2VHcm91cCk7DQotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZ2V0TGlzdE9mQ2xhc3NlcyhEZXBsb3ltZW50RmlsZURhdGEgZGVwbG95bWVudEZpbGVEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgQXJyYXlMaXN0IGNsYXNzTGlzdDsNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW4gPSBudWxsOw0KLSAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkZXBsb3ltZW50RmlsZURhdGEuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOw0KLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5Ow0KLSAgICAgICAgICAgIGNsYXNzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIi5jbGFzcyIsICIiKTsNCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIi8iLCAiLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChuYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB6aW4uY2xvc2UoKTsNCi0gICAgICAgICAgICBmaW4uY2xvc2UoKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRlcGxveWluZ2V4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmICh6aW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGZpbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGZpbi5jbG9zZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjbGFzc0xpc3Q7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RvcmVGYXVsdHlTZXJ2aWNlKERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEsIFRocm93YWJsZSB0KSB7DQotICAgICAgICBTdHJpbmdXcml0ZXIgZXJyb3JXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotICAgICAgICBQcmludFdyaXRlciBwdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7DQotICAgICAgICB0LnByaW50U3RhY2tUcmFjZShwdGludFdyaXRlcik7DQotICAgICAgICBTdHJpbmcgZXJyb3IgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsNCi0gICAgICAgIGF4aXNDb25maWcuZ2V0RmF1bHR5U2VydmljZXMoKS4NCi0gICAgICAgICAgICAgICAgcHV0KGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIGVycm9yKTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgY3JlYXRlQXhpc1NlcnZpY2UoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZUxvY2F0aW9uKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwNCi0gICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sDQotICAgICAgICAgICAgQXhpc0ZhdWx0IHsNCi0gICAgICAgIENsYXNzIHBvam9DbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc3NMb2FkZXIsIGNsYXNzTmFtZSk7DQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlQXhpc1NlcnZpY2UocG9qb0NsYXNzLCBjb25maWdDdHgpOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBsb2cuaW5mbygiRXhjZXB0aW9uIGNyZWF0aW5nIEF4aXMgU2VydmljZSA6ICIgKyB0LmdldENhdXNlKCksIHQpOw0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VSZWNlaXZlcigpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG5ldyBKQVhXU01lc3NhZ2VSZWNlaXZlcigpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoZmFsc2UpOw0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEZpbGVOYW1lKHNlcnZpY2VMb2NhdGlvbik7DQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOw0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUiwgY2xhc3NMb2FkZXIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdW5EZXBsb3koU3RyaW5nIGZpbGVOYW1lKSB7DQotICAgICAgICBmaWxlTmFtZSA9IFV0aWxzLmdldFNob3J0RmlsZU5hbWUoZmlsZU5hbWUpOw0KLSAgICAgICAgaWYgKGlzSmFyKG5ldyBGaWxlKGZpbGVOYW1lKSkpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9DQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5yZW1vdmVTZXJ2aWNlR3JvdXAoZmlsZU5hbWUpOw0KLSAgICAgICAgICAgICAgICBpZihjb25maWdDdHggIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LnJlbW92ZVNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9SRU1PVkVELA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lKSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgew0KLSAgICAgICAgICAgICAgICAvL01heSBiZSBhIGZhdWx0eSBzZXJ2aWNlDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRkFVTFRZX1NFUlZJQ0VfUkVNT1ZBTCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSksIGF4aXNGYXVsdCk7DQotICAgICAgICAgICAgICAgIGF4aXNDb25maWcucmVtb3ZlRmF1bHR5U2VydmljZShmaWxlTmFtZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDaGVjayBpZiB0aGlzIGlucHV0c3RyZWFtIGlzIGEgamFyL3ppcA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHJldHVybiB0cnVlIGlmIGlucHV0c3RyZWFtIGlzIGEgamFyDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXIoRmlsZSBmKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGppcyA9IG5ldyBKYXJJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsNCi0gICAgICAgICAgICBpZiAoamlzLmdldE5leHRFbnRyeSgpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoU3RyaW5nIHN0cmluZykgew0KLSAgICAgICAgcmV0dXJuIChzdHJpbmcgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc3RyaW5nKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8vU3RvcmUgdGhlIGFkZHJlc3MgVVJJcyB0aGF0IHdlIHdpbGwgbmVlZCB0byBjcmVhdGUgZW5kcG9pbnQgcmVmZXJlbmNlcyBhdCBydW50aW1lLg0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlQWRkcmVzc2luZyhBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCkgew0KLSAgICAgICAgRW5kcG9pbnRDb250ZXh0TWFwIG1hcCA9DQotICAgICAgICAgICAgKEVuZHBvaW50Q29udGV4dE1hcCkgY29uZmlnQ3R4LmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzLkVORFBPSU5UX0NPTlRFWFRfTUFQKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7DQotICAgICAgICAgICAgbWFwID0gRW5kcG9pbnRDb250ZXh0TWFwTWFuYWdlci5nZXRFbmRwb2ludENvbnRleHRNYXAoKTsNCi0gICAgICAgICAgICBjb25maWdDdHguc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHMuRU5EUE9JTlRfQ09OVEVYVF9NQVAsIG1hcCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZUdyb3VwLmdldFNlcnZpY2VzKCk7DQotICAgICAgICANCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9DQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihFbmRwb2ludERlc2NyaXB0aW9uLkFYSVNfU0VSVklDRV9QQVJBTUVURVIpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSAoRW5kcG9pbnREZXNjcmlwdGlvbikgcGFyYW0uZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSA9IGVkLmdldFNlcnZpY2VRTmFtZSgpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnROYW1lID0gZWQuZ2V0UG9ydFFOYW1lKCk7DQotICAgICAgICAgICAgRW5kcG9pbnRLZXkga2V5ID0gbmV3IEVuZHBvaW50S2V5KHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7DQotDQotICAgICAgICAgICAgbWFwLnB1dChrZXksIGF4aXNTZXJ2aWNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0F0dGFjaG1lbnRzQWRhcHRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9BdHRhY2htZW50c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkYjk1Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0F0dGFjaG1lbnRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBKQVgtV1MgZXhwb3NlcyBhdHRhY2htZW50IHByb3BlcnRpZXMgd2hvc2UgdmFsdWUgaXMgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+LiAgVGhlDQotICogU3RyaW5nIGlzIHRoZSBjb250ZW50LWlkIGFuZCBEYXRhSGFuZGxlciBpcyB0aGUgZGF0YSBoYW5kbGVyIHJlcHJlc2VudGluZyB0aGUgYXR0YWNobWVudC4NCi0gKiANCi0gKiBUaGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0IHN0b3JlcyBhdHRhY2htZW50cyBpbiBhbiBBeGlvbSBBdHRhY2htZW50cyBvYmplY3QgbG9jYXRlZCBvbiB0aGUgSkFYLVdTIA0KLSAqIE1lc3NhZ2UuDQotICogDQotICogVGhpcyBjbGFzcywgQXR0YWNobWVudEFkYXB0ZXIsIGlzIGFuIGFkYXB0ZXIgYmV0d2VlbiB0aGUgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IGludGVyZmFjZSBuZWVkZWQNCi0gKiBieSB0aGUgcHJvcGVydGllcyBhbmQgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4gIEFsbCB1c2VmdWwgZnVuY3Rpb24gaXMgZGVsZWdhdGVkIHRocm91Z2ggdGhlIE1lc3NhZ2VDb250ZXh0LCBzbyANCi0gKiB0aGF0IHdlIG9ubHkgaGF2ZSBvbmUgY29weSBvZiB0aGUgYXR0YWNobWVudCBpbmZvcm1hdGlvbi4gIA0KLSAqIA0KLSAqIFRvIHVzZSB0aGlzIGNsYXNzLCBpbnZva2UgdGhlIGluc3RhbGwgbWV0aG9kLiAgVGhpcyB3aWxsIGNyZWF0ZSBhbiBBdHRhY2htZW50QWRhcHRlciAoaWYgbmVjZXNzYXJ5KSBhbmQgaW5zdGFsbCBpdA0KLSAqIG9uIHRoZSBwcm9wZXJ0eSBKQVgtV1Mgc3RhbmRhcmQgYXR0YWNobWVudCBwcm9wZXJ0eS4gIChTZWUgQmFzZU1lc3NhZ2VDb250ZXh0LikNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudHNBZGFwdGVyIGltcGxlbWVudHMgTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+IHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF0dGFjaG1lbnRzQWRhcHRlci5jbGFzcyk7DQotICAgIA0KLSAgICBNZXNzYWdlQ29udGV4dCBtYzsgICAgLy8gTWVzc2FnZUNvbnRleHQgd2hpY2ggcHJvdmlkZXMgdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gb2YgQXR0YWNobWVudHMNCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZTsgIC8vIFRoZSBuYW1lIG9mIHRoZSBKQVgtV1MgcHJvcGVydHkNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGUgYmFja2luZyBzdG9yYWdlIG9mIHRoZSBBdHRhY2htZW50cyBpcyB0aGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0Lg0KLSAgICAgKiBJbnRlbnRpb25hbGx5IHByaXZhdGUsIHVzZSBpbnN0YWxsKE1lc3NhZ2VDb250ZXh0KQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBdHRhY2htZW50c0FkYXB0ZXIoTWVzc2FnZUNvbnRleHQgbWMsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsNCi0gICAgICAgIHRoaXMubWMgPSBtYzsNCi0gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBBdHRhY2htZW50QWRhcHRlciBhcyB0aGUgcHJvcGVydHkgZm9yIHRoZSBpbmJvdW5kIG9yDQotICAgICAqIG91dGJvdW5kIGF0dGFjaG1lbnQgcHJvcGVydHkNCi0gICAgICogQHBhcmFtIG1jIE1lc3NhZ2VDb250ZXh0DQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChNZXNzYWdlQ29udGV4dCBtYykgew0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChtID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBQcm9iYWJseSBhIHVuaXQgdGVzdCwgY2FuJ3QgY29udGludWUuDQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIGlzT3V0Ym91bmQgPSBtYy5pc091dGJvdW5kKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBwcm9wZXJ0eSBpcyBlaXRoZXIgYW4gaW5ib3VuZCBvciBvdXRib3VuZCBwcm9wZXJ0eQ0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChpc091dGJvdW5kKSA/DQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMgOg0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5JTkJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFM7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnN0YWxsaW5nIEF0dGFjaG1lbnRzQWRhcHRlciBmb3IgIiArIHByb3BlcnR5TmFtZSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBtYXANCi0gICAgICAgIE9iamVjdCBtYXAgPSBtYy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXVzZSBleGlzdGluZyBBdHRhY2htZW50c0FkYXB0ZXINCi0gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBBdHRhY2htZW50c0FkYXB0ZXIpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBBdHRhY2htZW50c0FkYXB0ZXIgaXMgYWxyZWFkeSBpbnN0YWxsZWQuICBSZXVzaW5nIHRoZSBleGlzdGluZyBvbmUuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0gDQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBBdHRhY2htZW50c0FkYXB0ZXIgYW5kIHNldCBpdCBvbiB0aGUgcHJvcGVydHkgDQotICAgICAgICBBdHRhY2htZW50c0FkYXB0ZXIgYWEgPSBuZXcgQXR0YWNobWVudHNBZGFwdGVyKG1jLCBwcm9wZXJ0eU5hbWUpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobWFwICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgRGF0YUhhbmRsZXJzIGluIHRoZSBleGlzdGluZyBtYXAgKCIgKyBwcm9wZXJ0eU5hbWUgKyAiKSBhcmUgY29waWVkIHRvIHRoZSBBdHRhY2htZW50c0FkYXB0ZXIuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIE1hcCBjb250ZW50cyB0byB0aGlzIG5ldyBhZGFwdGVyDQotICAgICAgICAgICAgYWEucHV0QWxsKChNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4pIG1hcCk7DQotICAgICAgICB9DQotICAgICAgICBtYy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGFhKTsNCi0gICAgfQ0KLQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoImNsZWFyKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSB0aGlzLmtleVNldCgpOw0KLSAgICAgICAgZm9yKFN0cmluZyBrZXk6IGtleXMpIHsNCi0gICAgICAgICAgICBtLnJlbW92ZURhdGFIYW5kbGVyKGtleSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSB0aGlzLmtleVNldCgpOw0KLSAgICAgICAgcmV0dXJuIGtleXMuY29udGFpbnMoa2V5KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2V0PFN0cmluZz4ga2V5cyA9IHRoaXMua2V5U2V0KCk7DQotICAgICAgICBmb3IoU3RyaW5nIGtleToga2V5cykgew0KLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gbS5nZXREYXRhSGFuZGxlcihrZXkpOw0KLSAgICAgICAgICAgIGlmIChkaC5lcXVhbHModmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFNldDxFbnRyeTxTdHJpbmcsIERhdGFIYW5kbGVyPj4gZW50cnlTZXQoKSB7DQotICAgICAgICBNYXAgdGVtcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGF0YUhhbmRsZXI+KCk7DQotICAgICAgICB0ZW1wTWFwLnB1dEFsbCh0aGlzKTsNCi0gICAgICAgIHJldHVybiB0ZW1wTWFwLmVudHJ5U2V0KCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXQoT2JqZWN0IGtleSkgew0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGggPSAgbS5nZXREYXRhSGFuZGxlcigoU3RyaW5nKSBrZXkpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXQoIiArIGtleSArICIpIHJldHVybnMgZGg9IiArIGRoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBkaDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLmtleVNldCgpLmlzRW1wdHkoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldCgpIHsNCi0gICAgICAgIFNldDxTdHJpbmc+IGtleXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBQYXJ0IGlzIGlnbm9yZWQNCi0gICAgICAgIGludCBpID0gMDsNCi0gICAgICAgIFN0cmluZyBrZXkgPSBtLmdldEF0dGFjaG1lbnRJRChpKTsNCi0gICAgICAgIHdoaWxlIChrZXkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGtleXMuYWRkKGtleSk7DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgICAgIGtleSA9IG0uZ2V0QXR0YWNobWVudElEKGkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGtleXM7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBwdXQoU3RyaW5nIGtleSwgRGF0YUhhbmRsZXIgZGgpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicHV0KCIgKyBrZXkgKyAiICwgIiArIGRoICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIERhdGFIYW5kbGVyIG9sZCA9IGdldChrZXkpOw0KLSAgICAgICAgbS5hZGREYXRhSGFuZGxlcihkaCwga2V5KTsNCi0gICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7ICAvLyBDYW4ndCByZWFsbHkgdGVsbCBpZiB0aGUgYXR0YWNobWVudCBpcyBNVE9NIG9yIFNXQSwgZXRjLiAgTWFyayBhcyBTV0EgdG8gbWFrZSBzdXJlIGl0IGlzIHdyaXR0ZW4gb3V0DQotICAgICAgICByZXR1cm4gb2xkOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXA8PyBleHRlbmRzIFN0cmluZywgPyBleHRlbmRzIERhdGFIYW5kbGVyPiB0KSB7DQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICBmb3IoU3RyaW5nIGtleTogdC5rZXlTZXQoKSkgew0KLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gdC5nZXQoa2V5KTsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhZGREYXRhSGFuZGxlciB2aWEgcHV0QWxsICgiICsga2V5ICsgIiAsICIgKyBkaCArICIpIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG0uYWRkRGF0YUhhbmRsZXIoZGgsIGtleSk7DQotICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsgIC8vIENhbid0IHJlYWxseSB0ZWxsIGlmIHRoZSBhdHRhY2htZW50IGlzIE1UT00gb3IgU1dBLCBldGMuICBNYXJrIGFzIFNXQSB0byBtYWtlIHN1cmUgaXQgaXMgd3JpdHRlbiBvdXQNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIERhdGFIYW5kbGVyIHJlbW92ZShPYmplY3Qga2V5KSB7DQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBQYXJ0IGlzIGlnbm9yZWQNCi0gICAgICAgIHJldHVybiBtLnJlbW92ZURhdGFIYW5kbGVyKChTdHJpbmcpIGtleSk7IA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7DQotICAgICAgICBNZXNzYWdlIG0gPSBtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gdGhpcy5rZXlTZXQoKTsNCi0gICAgICAgIHJldHVybiBrZXlzLnNpemUoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIENvbGxlY3Rpb248RGF0YUhhbmRsZXI+IHZhbHVlcygpIHsNCi0gICAgICAgIE1hcCB0ZW1wTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXRhSGFuZGxlcj4oKTsNCi0gICAgICAgIHRlbXBNYXAucHV0QWxsKHRoaXMpOw0KLSAgICAgICAgcmV0dXJuIHRlbXBNYXAudmFsdWVzKCk7DQotICAgIH0NCi0gICAgDQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQmFzZU1lc3NhZ2VDb250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0Jhc2VNZXNzYWdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmODU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQmFzZU1lc3NhZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQmFzZU1lc3NhZ2VDb250ZXh0IGlzIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgdHdvIGhhbmRsZXIgbWVzc2FnZSBjb250ZXh0czoKLSAqIFNvYXBNZXNzYWdlQ29udGV4dCBhbmQgTG9naWNhbE1lc3NhZ2VDb250ZXh0LiAgSXQgZGVsZWdhdGVzIGV2ZXJ5dGhpbmcgdXAgdG8KLSAqIHRoZSBNRVBDb250ZXh0LCB3aGljaCBpdHNlbGYgZGVsZWdhdGVzIHRvIHRoZSByZXF1ZXN0TUMgb3IgcmVzcG9uc2VNQywgYXMKLSAqIGFwcHJvcHJpYXRlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlTWVzc2FnZUNvbnRleHQgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJhc2VNZXNzYWdlQ29udGV4dC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eDsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUN0eAotICAgICAqLwotICAgIHByb3RlY3RlZCBCYXNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICB0aGlzLm1lc3NhZ2VDdHggPSBtZXNzYWdlQ3R4OwotICAgICAgICAKLSAgICAgICAgLy8gSW5zdGFsbCBhbiBhbiBBdHRhY2htZW50c0FkYXB0ZXIgYmV0d2VlbiB0aGUgCi0gICAgICAgIC8vIGpheHdzIGF0dGFjaG1lbnQgc3RhbmRhcmQgcHJvcGVydGllcyBhbmQgdGhlCi0gICAgICAgIC8vIE1lc3NhZ2VDb250ZXh0IEF0dGFjaG1lbnRzIGltcGxlbWVudGF0aW9uLgotICAgICAgICBBdHRhY2htZW50c0FkYXB0ZXIuaW5zdGFsbChtZXNzYWdlQ3R4KTsKLSAgICAgICAgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuaW5zdGFsbChtZXNzYWdlQ3R4KTsKLSAgICAgICAgU09BUEhlYWRlcnNBZGFwdGVyLmluc3RhbGwobWVzc2FnZUN0eCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNjbGVhcigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNjb250YWluc0tleShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNjb250YWluc1ZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjZW50cnlTZXQoKQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8amF2YS51dGlsLk1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0KCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuZW50cnlTZXQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2dldChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgcHJvcGVydGllcyB0aGF0LCBpbiBzb21lIGNhc2VzLCBzaG91bGQgbm90IHNwYW4gdGhlIG1lc3NhZ2UgZXhjaGFuZ2U7Ci0gICAgICAgIC8vIHRoYXQgaXMsIHRoZXkgc2hvdWxkIGNvbWUgZnJvbSBvbmx5IHRoZSBjdXJyZW50IG1lc3NhZ2UgY29udGV4dC4gIEZvciBvdGhlcnMgcHJvcGVydGllcywKLSAgICAgICAgLy8gdGhleSBzaG91bGQgc3BhbiB0aGUgbWVzc2FnZSBleGNoYW5nZSwgbWVhbmluZyBhIHByb3BlcnR5IGNvdWxkIGJlIHNldCBvbiB0aGUgcmVxdWVzdAotICAgICAgICAvLyBhbmQgaXQgd2lsbCBhbHNvIGJlIGF2YWlsYWJsZSBvbiB0aGUgcmVzcG9uc2UuICBbSkFYV1MgMi4wLCBTZWMgOS40LjEuMSwgcHAuIDExMC0xMTNdCi0gICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmIChzaG91bGRQcm9wZXJ0eVNwYW5NRVAoa2V5KSkgewotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5nZXQoa2V5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWVzc2FnZUN0eC5nZXRQcm9wZXJ0eSgoU3RyaW5nKSBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRm9yIHRoZSBIVFRQX1JFUVVFU1RfSEVBREVSUyBhbmQgSFRUUF9SRVNQT05TRV9IRUFERVJTLCB0aGUgQ1RTIHRlc3RzIHdhbnQgYSBudWxsIHJldHVybmVkIAotICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gaGVhZGVycy4gIFNpbmNlIHdlIGFsd2F5cyBwdXQgYW4gaW5zdGFuY2Ugb2YgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIsCi0gICAgICAgIC8vIHdoaWNoIGNvbnRhaW5zIHRoZSBoZWFkZXJzLCBvbiB0aGUgbWVzc2FnZSBjb250ZXh0LCByZXR1cm4gYSBudWxsIGlmIGl0IGlzIGVtcHR5LgotICAgICAgICBpZiAocmV0dXJuVmFsdWUgIT0gbnVsbCAmJiAocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlcikpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyIGFkYXB0ZXIgPSAoVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIpIHJldHVyblZhbHVlOwotICAgICAgICAgICAgaWYgKGFkYXB0ZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRQcm9wZXJ0eVNwYW5NRVAoT2JqZWN0IGtleSkgewotICAgICAgICBib29sZWFuIHNob3VsZFNwYW4gPSB0cnVlOwotICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gKFN0cmluZykga2V5OwotCi0gICAgICAgIC8vIFRoZSBDVFMgdGVzdHMgcmVxdWlyZSB0aGF0IEhUVFBfUkVRVUVTVF9IRUFERVJTIHNwYW4gdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHRzCi0gICAgICAgIC8vIG9uIHRoZSBzZXJ2aWNlLXByb3ZpZGVyLCBidXQgZG8gTk9UIHNwYW4gdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGNvbnRleHQgb24gdGhlIAotICAgICAgICAvLyBzZXJ2aWNlLXJlcXVlc3Rlci4gIFNvLCBmb3IgYW4gSU5CT1VORCBmbG93LCBkbyBub3QgYWxsb3cgSFRUUF9SRVFVRVNUX0hFQURFUlMgdG8KLSAgICAgICAgLy8gc3BhbiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgY29udGV4dHMuICBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIHNlcnZpY2UtcmVxdWVzdGVyCi0gICAgICAgIC8vIGluYm91bmQgaGFuZGxlciB3aWxsIG5vdCBzZWUgdGhlIHJlcXVlc3QgaGVhZGVycyB3aGlsZSBwcm9jZXNzaW5nIGEgcmVzcG9uc2UuCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmQgPSAoQm9vbGVhbikgbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuZ2V0KE1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOwotICAgICAgICBpZiAob3V0Ym91bmQgIT0gbnVsbCAmJiAhb3V0Ym91bmQpCi0gICAgICAgICAgICBpZiAoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMuZXF1YWxzKGtleVN0cmluZykpIHsKLSAgICAgICAgICAgIHNob3VsZFNwYW4gPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2hvdWxkU3BhbjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI2lzRW1wdHkoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS51dGlsLk1hcCNrZXlTZXQoKQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBrZXlTZXQoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjcHV0QWxsKGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgT2JqZWN0PiB0KSB7Ci0gICAgICAgIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLnB1dEFsbCh0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjc2l6ZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmEudXRpbC5NYXAjdmFsdWVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IHZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDdHguZ2V0TUVQQ29udGV4dCgpLnZhbHVlcygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0I2dldFNjb3BlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFNjb3BlIGdldFNjb3BlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5nZXRTY29wZShzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCNzZXRTY29wZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5TY29wZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgcywgU2NvcGUgc2NvcGUpIHsKLSAgICAgICAgbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuc2V0U2NvcGUocywgc2NvcGUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckNoYWluUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTVkMmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuZmFjdG9yeS5NZXNzYWdlQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUHJlSW52b2tlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5NZXRob2RNYXJzaGFsbGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxGYXVsdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5TQUFKRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhhbmRsZXJDaGFpblByb2Nlc3Nvci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyUHJlSW52b2tlciBoYW5kbGVyUHJlSW52b2tlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyUG9zdEludm9rZXIgaGFuZGxlclBvc3RJbnZva2VyID0gbnVsbDsKLSAgICAKLSAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICBJTiwgT1VUCi0gICAgfTsKLQotICAgIC8vIHRoZSB0eXBlIG9mIG1lc3NhZ2UsIG5vdCBpbmRpY2F0aXZlIG9mIG9uZS13YXkgdnMuIHJlcXVlc3QtcmVzcG9uc2UKLSAgICBwdWJsaWMgZW51bSBNRVAgewotICAgICAgICBSRVFVRVNULCBSRVNQT05TRQotICAgIH07Ci0KLSAgICBwcml2YXRlIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IGN1cnJlbnRNQzsgIC8vIGp1c3QgYSBwb2ludGVyCi0gICAgcHJpdmF0ZSBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG9naWNhbE1DID0gbnVsbDsKLSAgICBwcml2YXRlIFNvYXBNZXNzYWdlQ29udGV4dCBzb2FwTUMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNRVBDb250ZXh0IG1lcEN0eDsKLQotICAgIHByaXZhdGUgTGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IG51bGw7Ci0KLSAgICAvLyB0cmFjayBzdGFydC9lbmQgb2YgbG9naWNhbCBhbmQgcHJvdG9jb2wgaGFuZGxlcnMgaW4gdGhlIGxpc3QKLSAgICAvLyBUaGUgdHdvIHNjZW5hcmlvcyBhcmU6ICAxKSBydW4gbG9naWNhbCBoYW5kbGVycyBvbmx5LCAyKSBydW4gYWxsIGhhbmRsZXJzCi0gICAgLy8gbG9naWNhbCBzdGFydCBpcyBhbHdheXMgMAotICAgIC8vIHByb3RvY29sIHN0YXJ0IGlzIGFsd2F5cyBsb2dpY2FsTGVuZ3RoICsgMQotICAgIC8vIGxpc3QgZW5kIGlzIGFsd2F5cyBoYW5kbGVycy5zaXplKCktMQotICAgIHByaXZhdGUgaW50IGxvZ2ljYWxMZW5ndGggPSAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFNVQ0NFU1NGVUwgPSAwOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBGQUlMRUQgPSAxOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBQUk9UT0NPTF9FWENFUFRJT04gPSAyOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBPVEhFUl9FWENFUFRJT04gPSAzOwotICAgIC8vIHNhdmUgaXQgaWYgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHRocm93cyBvbmUgaW4KLSAgICAvLyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuaGFuZGxlTWVzc2FnZQotICAgIHByaXZhdGUgUnVudGltZUV4Y2VwdGlvbiBzYXZlZEV4Y2VwdGlvbjsKLSAgICBwcml2YXRlIFByb3RvY29sIHByb3RvOyAvLyBuZWVkIHRvIHNhdmUgaXQgaW5jYXNlIHdlIGhhdmUgdG8gbWFrZSBhIGZhdWx0IG1lc3NhZ2UKLQotICAgIC8qCi0gICAgICAqIEhhbmRsZXJDaGFpblByb2Nlc3MgZXhwZWN0cyBudWxsLCBlbXB0eSBsaXN0LCBvciBhbiBhbHJlYWR5LXNvcnRlZAotICAgICAgKiBsaXN0LiAgSWYgdGhlIGNoYWluIHBhc3NlZCBpbnRvIGhlcmUgY2FtZSBmcm9tIG91ciBIYW5kbGVyQ2hhaW5SZXNvbHZlciwKLSAgICAgICogaXQgaXMgc29ydGVkIGFscmVhZHkuICBJZiBhIGNsaWVudCBhcHAgY3JlYXRlZCBvciBtYW5pcHVsYXRlZCB0aGUgbGlzdCwKLSAgICAgICogaXQgbWF5IG5vdCBiZSBzb3J0ZWQuICBUaGUgcHJvY2Vzc0NoYWluIGFuZCBwcm9jZXNzRmF1bHQgbWV0aG9kcyBjaGVjawotICAgICAgKiBmb3IgdGhpcyBieSBjYWxsaW5nIHZlcmlmeUNoYWluLgotICAgICAgKi8KLQlwdWJsaWMgSGFuZGxlckNoYWluUHJvY2Vzc29yKExpc3Q8SGFuZGxlcj4gY2hhaW4sIFByb3RvY29sIHByb3RvKSB7Ci0gICAgICAgIGlmIChjaGFpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLQkJfQotCQllbHNlCi0gICAgICAgICAgICBoYW5kbGVycyA9IGNoYWluOwotICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogc29ydENoYWluIHdpbGwgcHJvcGVybHkgc29ydCB0aGUgY2hhaW4sIGxvZ2ljYWwgdGhlbiBwcm90b2NvbCwgc2luY2UgaXQgbWF5IGJlCi0gICAgICAqIGEgY2hhaW4gYnVpbHQgb3IgbW9kaWZpZWQgYnkgYSBjbGllbnQgYXBwbGljYXRpb24uICBBbHNvIGtlZXAgdHJhY2sgb2YKLSAgICAgICogc3RhcnQvZW5kIGZvciBlYWNoIHR5cGUgb2YgaGFuZGxlci4KLSAgICAgICovCi0JcHJpdmF0ZSB2b2lkIHNvcnRDaGFpbigpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBsb2dpY2FsSGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7Ci0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBwcm90b2NvbEhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3IgaGFuZGxlckl0ZXJhdG9yID0gaGFuZGxlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChoYW5kbGVySXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGEgc2FmZSBjYXN0IHNpbmNlIHRoZSBoYW5kbGVyUmVzb2x2ZXIgYW5kIGJpbmRpbmcuc2V0SGFuZGxlckNoYWluCi0gICAgICAgICAgICAvLyBhbmQgSW52b2NhdGlvbkNvbnRleHQuc2V0SGFuZGxlckNoYWluIHZlcmlmaWVzIGl0IGJlZm9yZSB3ZSBnZXQgaGVyZQotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpaGFuZGxlckl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIC8vIEpBWFdTIDkuMi4xLjIgc29ydCB0aGVtIGJ5IExvZ2ljYWwsIHRoZW4gU09BUAotICAgICAgICAgICAgaWYgKExvZ2ljYWxIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkKLSAgICAgICAgICAgICAgICBsb2dpY2FsSGFuZGxlcnMuYWRkKChMb2dpY2FsSGFuZGxlcikgaGFuZGxlcik7Ci0gICAgICAgICAgICBlbHNlIGlmIChTT0FQSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGhhbmRsZXIuZ2V0Q2xhc3MoKSkpCi0gICAgICAgICAgICAgICAgLy8gaW5zdGFuY2VvZiBQcm90b2NvbEhhbmRsZXIKLSAgICAgICAgICAgICAgICBwcm90b2NvbEhhbmRsZXJzLmFkZCgoU09BUEhhbmRsZXIpIGhhbmRsZXIpOwotICAgICAgICAgICAgZWxzZSBpZiAoSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGhhbmRsZXIuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5FcnIxIiwgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5FcnIyIiwgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBsb2dpY2FsTGVuZ3RoID0gbG9naWNhbEhhbmRsZXJzLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEpBWFdTIDkuMi4xLjIgc29ydCB0aGVtIGJ5IExvZ2ljYWwsIHRoZW4gU09BUAotICAgICAgICBoYW5kbGVycy5jbGVhcigpOwotICAgICAgICBoYW5kbGVycy5hZGRBbGwobG9naWNhbEhhbmRsZXJzKTsKLSAgICAgICAgaGFuZGxlcnMuYWRkQWxsKHByb3RvY29sSGFuZGxlcnMpOwotCX0KLQkKLQotCQotCS8qKgotCSAqIEBwYXJhbSBtYwotCSAqIEJ5IHRoZSB0aW1lIHByb2Nlc3NDaGFpbiBtZXRob2QgaXMgY2FsbGVkLCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNvcnRlZCBjaGFpbiwKLQkgKiBhbmQgbm93IHdlIGhhdmUgdGhlIGRpcmVjdGlvbiwgTUVQLCBNZXNzYWdlQ29udGV4dCwgYW5kIGlmIGEgcmVzcG9uc2UgaXMgZXhwZWN0ZWQuICBXZSBzaG91bGQKLQkgKiBiZSBhYmxlIHRvIGhhbmRsZSBldmVyeXRoaW5nIGZyb20gaGVyZSwgbm8gcHVuIGludGVuZGVkLgotCSAqIAotCSAqIFR3byB0aGluZ3MgYSB1c2VyIG9mIHByb2Nlc3NDaGFpbiBzaG91bGQgY2hlY2sgd2hlbiB0aGUgbWV0aG9kIGNvbXBsZXRlczoKLQkgKiAxLiAgSGFzIHRoZSBNZXNzYWdlQ29udGV4dC5NRVNTQUdFX09VVEJPVU5EX1BST1BFUlRZIGNoYW5nZWQsIGluZGljYXRpbmcgcmV2ZXJzYWwgb2YgbWVzc2FnZSBkaXJlY3Rpb24KLQkgKiAyLiAgSGFzIHRoZSBtZXNzYWdlIGJlZW4gY29udmVydGVkIHRvIGEgZmF1bHQgbWVzc2FnZT8gKGluZGljYXRlZCBieSBhIGZsYWcgaW4gdGhlIG1lc3NhZ2UpCi0JICovCi0gICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0NoYWluKE1FUENvbnRleHQgbWVwQ3R4LCBEaXJlY3Rpb24gZGlyZWN0aW9uLCBNRVAgbWVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGVjdFJlc3BvbnNlKSB7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJzLnNpemUoKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIAotICAgICAgICB0aGlzLm1lcEN0eCA9IG1lcEN0eDsKLSAgICAgICAgc29ydENoYWluKCk7Ci0gICAgICAgIGluaXRDb250ZXh0KGRpcmVjdGlvbik7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpIHsgLy8gOS4zLjIgb3V0Ym91bmQKLSAgICAgICAgICAgIGN1cnJlbnRNQy5wdXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxHZW5lcmljSGFuZGxlcnMobWVwLCBleHBlY3RSZXNwb25zZSwgMCwgaGFuZGxlcnMuc2l6ZSgpIC0gMSwgZGlyZWN0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsgLy8gSU4gY2FzZSAtIDkuMy4yIGluYm91bmQKLSAgICAgICAgICAgIGN1cnJlbnRNQy5wdXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxHZW5lcmljSGFuZGxlcnMobWVwLCBleHBlY3RSZXNwb25zZSwgaGFuZGxlcnMuc2l6ZSgpIC0gMSwgMCwgZGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1lc3NhZ2UgY29udGV4dCBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gYmUgcmVzcG9uc2UsIGFuZCBtZXNzYWdlCi0gICAgICAgIC8vIGNvbnZlcnRlZAotICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIEpBWFdTIHNwZWMgOS4zLjIuMSBmb290bm90ZSAyCi0gICAgICAgIGlmICgoQm9vbGVhbikgKGN1cnJlbnRNQy5nZXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSkpICE9IChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQotICAgIC8qCi0gICAgICAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIEpBWC1XUyAyLjAgc2VjdGlvbiA5LjMuMi4xCi0gICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsR2VuZXJpY0hhbmRsZXJzKE1FUCBtZXAsIGJvb2xlYW4gZXhwZWN0UmVzcG9uc2UsIGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gaWYgdGhpcyBpcyBhIHJlc3BvbnNlIG1lc3NhZ2UsIGV4cGVjdFJlc3BvbnNlIHNob3VsZCBhbHdheXMgYmUgZmFsc2UKLSAgICAgICAgaWYgKG1lcCA9PSBNRVAuUkVTUE9OU0UpCi0gICAgICAgICAgICBleHBlY3RSZXNwb25zZSA9IGZhbHNlOwotCi0gICAgICAgIGludCBpID0gc3RhcnQ7Ci0gICAgICAgIGludCByZXN1bHQgPSBTVUNDRVNTRlVMOwotCi0gICAgICAgIC8vIGRlY2xhcmVkIGFuZCBpbml0aWFsaXplZCBqdXN0IGluIGNhc2Ugd2UgbmVlZCB0aGVtCi0gICAgICAgIC8vIGluIGEgcmV2ZXJzZSBmbG93IHNpdHVhdGlvbgotICAgICAgICBpbnQgbmV3U3RhcnQgPSAwLCBuZXdTdGFydF9pbmNsdXNpdmUgPSAwLCBuZXdFbmQgPSAwOwotICAgICAgICBEaXJlY3Rpb24gbmV3RGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgewotICAgICAgICAgICAgd2hpbGUgKChpIDw9IGVuZCkgJiYgKHJlc3VsdCA9PSBTVUNDRVNTRlVMKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZU1lc3NhZ2UoKChIYW5kbGVyKWhhbmRsZXJzLmdldChpKSksIGRpcmVjdGlvbiwgZXhwZWN0UmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIG5ld1N0YXJ0ID0gaSAtIDE7Ci0gICAgICAgICAgICAgICAgbmV3U3RhcnRfaW5jbHVzaXZlID0gaTsKLSAgICAgICAgICAgICAgICBuZXdFbmQgPSAwOwotICAgICAgICAgICAgICAgIG5ld0RpcmVjdGlvbiA9IERpcmVjdGlvbi5JTjsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBTVUNDRVNTRlVMKSAgLy8gZG9uJ3Qgc3dpdGNoIGlmIGZhaWxlZCwgc2luY2Ugd2UnbGwgYmUgcmV2ZXJzaW5nIGRpcmVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoQ29udGV4dChkaXJlY3Rpb24sIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBJTiBjYXNlCi0gICAgICAgICAgICB3aGlsZSAoKGkgPj0gZW5kKSAmJiAocmVzdWx0ID09IFNVQ0NFU1NGVUwpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlTWVzc2FnZSgoKEhhbmRsZXIpaGFuZGxlcnMuZ2V0KGkpKSwgZGlyZWN0aW9uLCBleHBlY3RSZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgbmV3U3RhcnQgPSBpICsgMTsKLSAgICAgICAgICAgICAgICBuZXdTdGFydF9pbmNsdXNpdmUgPSBpOwotICAgICAgICAgICAgICAgIG5ld0VuZCA9IGhhbmRsZXJzLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgbmV3RGlyZWN0aW9uID0gRGlyZWN0aW9uLk9VVDsKLSAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBTVUNDRVNTRlVMKSAgLy8gZG9uJ3Qgc3dpdGNoIGlmIGZhaWxlZCwgc2luY2Ugd2UnbGwgYmUgcmV2ZXJzaW5nIGRpcmVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoQ29udGV4dChkaXJlY3Rpb24sIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5ld0RpcmVjdGlvbiA9PSBkaXJlY3Rpb24pIC8vIHdlIGRpZG4ndCBhY3R1YWxseSBwcm9jZXNzIGFueXRoaW5nLCBwcm9iYWJseSBkdWUgdG8gZW1wdHkgbGlzdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7ICAvLyBubyBuZWVkIHRvIGNvbnRpbnVlCi0KLSAgICAgICAgLy8gOS4zLjIuMyBpbiBhbGwgc2l0dWF0aW9ucywgd2Ugd2FudCB0byBjbG9zZSBhcyBtYW55IGhhbmRsZXJzIGFzCi0gICAgICAgIC8vIHdlcmUgaW52b2tlZCBwcmlvciB0byBjb21wbGV0aW9uIG9yIGV4Y2VwdGlvbiB0aHJvd2luZwotICAgICAgICBpZiAoZXhwZWN0UmVzcG9uc2UpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIG9ubHkgdXNlIGNhbGxHZW5lcmljSGFuZGxlcnNfYXZvaWRSZWN1cnNpb24gaW4gdGhpcyBjYXNlCi0gICAgICAgICAgICAgICAgY2FsbEdlbmVyaWNIYW5kbGVyc19hdm9pZFJlY3Vyc2lvbihuZXdTdGFydCwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKG5ld1N0YXJ0X2luY2x1c2l2ZSwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gUFJPVE9DT0xfRVhDRVBUSU9OKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbEdlbmVyaWNIYW5kbGVGYXVsdChuZXdTdGFydCwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBjYWxsQ2xvc2VIYW5kbGVycyhuZXdTdGFydF9pbmNsdXNpdmUsIG5ld0VuZCwgbmV3RGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKG5ld1N0YXJ0X2luY2x1c2l2ZSwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyByZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBPVEhFUl9FWENFUFRJT04pIHsKLSAgICAgICAgICAgICAgICBjYWxsQ2xvc2VIYW5kbGVycyhuZXdTdGFydF9pbmNsdXNpdmUsIG5ld0VuZCwgbmV3RGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAvLyBzYXZlZEV4Y2VwdGlvbiBpbml0aWFsaXplZCBpbiBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuaGFuZGxlTWVzc2FnZQotICAgICAgICAgICAgICAgIHRocm93IHNhdmVkRXhjZXB0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBldmVyeXRoaW5nIHdhcyBzdWNjZXNzZnVsIE9SIGZpbmlzaGVkIHByb2Nlc3NpbmcgaGFuZGxlcnMKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGlzIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2Ugc2hvdWxkIGJlCi0gICAgICAgICAgICAgKiBhd2FyZSBvZi4gQW4gaW5jb21pbmcgcmVxdWVzdCB3aXRoIGZhbHNlIGV4cGVjdFJlc3BvbnNlIGlzCi0gICAgICAgICAgICAgKiBlcXVpdmFsZW50IHRvIHNlcnZlciBpbmJvdW5kIG9uZS13YXksIGZvciBleGFtcGxlLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBBbiBvdXRnb2luZyByZXNwb25zZSBpcyBzZXJ2ZXIgb3V0Ym91bmQsIGFuZCBpcyBhbHdheXMgbWFya2VkCi0gICAgICAgICAgICAgKiB3aXRoIGEgZmFsc2UgZXhwZWN0UmVzcG9uc2UuIFRoZSBwcm9ibGVtLCBob3dldmVyLCBpcyB0aGF0IHRoZQotICAgICAgICAgICAgICogZGlyZWN0aW9uIGZvciB0aGUgY2FsbCB0byBjbG9zZWhhbmRsZXJzIHdpbGwgYmUgaW5jb3JyZWN0LiBJbgotICAgICAgICAgICAgICogdGhpcyBjYXNlLCB0aGUgaGFuZGxlcnMgc2hvdWxkIGJlIGNsb3NlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIgb2YKLSAgICAgICAgICAgICAqIHRoZSBPUklHSU5BTCBpbnZvY2F0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobWVwLmVxdWFscyhNRVAuUkVRVUVTVCkpIHsKLSAgICAgICAgICAgICAgICAvLyBhIHJlcXVlc3QgdGhhdCByZXF1aXJlcyBubyByZXNwb25zZSBpcyBhIG9uZS13YXkgbWVzc2FnZQotICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgb25seSBjbG9zZSB3aG9tZXZlciBnb3QgaW52b2tlZAotICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKG5ld1N0YXJ0X2luY2x1c2l2ZSwgbmV3RW5kLCBuZXdEaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEFzIGFjY29yZGluZyB0byB0aGUgU3VuICJleHBlcnRzIiwgZXhjZXB0aW9ucyByYWlzZWQgYnkKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGVycyBpbiBvbmUgd2F5IGludm9jYXRpb24gYXJlIGRpc2NhcmRlZC4gVGhleQotICAgICAgICAgICAgICAgIC8vIGFyZSBOT1QgcHJvcGFnYXRlZCB0byB0aGUgdXNlciBjb2RlLgotICAgICAgICAgICAgICAgIGlmIChzYXZlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJFeGNlcHRpb24gdGhyb3duIGJ5IGEgaGFuZGxlciBpbiBvbmUgd2F5IGludm9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIC8vQnV0IGRvIHJldHVybiBmYWlsdXJlIHNvIHRoYXQgd2Uga25vdyBub3QgdG8gc2VuZCB0byBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGl0J3MgYSByZXNwb25zZSwgc28gd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCAKLSAgICAgICAgICAgICAgICAvLyBBTEwgdGhlIGhhbmRsZXJzIHdlcmUgaW52b2tlZCBvbiB0aGUgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGNsb3NlIEFMTCBvZiB0aGVtCi0gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbi5lcXVhbHMoRGlyZWN0aW9uLklOKSkgewotICAgICAgICAgICAgICAgICAgICBjYWxsQ2xvc2VIYW5kbGVycyhoYW5kbGVycy5zaXplKCkgLSAxLCAwLCBkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKDAsIGhhbmRsZXJzLnNpemUoKSAtIDEsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotIAotICAgICAgICAgICAgICAgIGlmIChzYXZlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBzYXZlZCBleGNlcHRpb24sIHRocm93IGl0IChKQVgtV1MgOS4zLjIuMSAiVGhyb3cgCi0gICAgICAgICAgICAgICAgICAgIC8vIFByb3RvY29sRXhjZXB0aW9uIG9yIGFueSBvdGhlciBydW50aW1lIGV4Y2VwdGlvbiAtLT4gTm8gCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIiBjYXNlLgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBzYXZlZEV4Y2VwdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgd2UndmUgZmFpbGVkIGJlZm9yZSB0aGlzLCB3ZSB3b3VsZCBoYXZlIGFscmVhZHkgdGhyb3duIGV4Y2VwdGlvbgotICAgICAgICAvLyBvciByZXR1cm5lZCBmYWxzZSwgc28ganVzdCByZXR1cm4gdHJ1ZSBoZXJlIC4uLiBkb24ndCBuZWVkIHRvIGNoZWNrIHJlc3VsdCBhZ2Fpbi4KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogY2FsbEdlbmVyaWNIYW5kbGVyc19hdm9pZFJlY3Vyc2lvbiBzaG91bGQgT05MWSBiZSBjYWxsZWQgZnJvbSBvbmUgcGxhY2UuCi0gICAgICAqIFRPRE86ICBXZSBjYW5ub3QgbmVjZXNzYXJpbHkgYXNzdW1lIG5vIGZhbHNlIHJldHVybnMgYW5kIG5vIGV4Y2VwdGlvbnMgd2lsbCBiZQotICAgICAgKiB0aHJvd24gZnJvbSBoZXJlIGV2ZW4gdGhvdWdoIHRoZSBoYW5kbGVycyB3ZSB3aWxsIGJlIGNhbGxpbmcgaGF2ZSBhbGwgYWxyZWFkeQotICAgICAgKiBzdWNjZWVkZWQgaW4gY2FsbEdlbmVyaWNIYW5kbGVycy4KLSAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxHZW5lcmljSGFuZGxlcnNfYXZvaWRSZWN1cnNpb24oaW50IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQsIERpcmVjdGlvbiBkaXJlY3Rpb24pIHsKLSAgICAgICAgaW50IGkgPSBzdGFydDsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpIHsKLSAgICAgICAgICAgIGZvciAoOyBpIDw9IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoQ29udGV4dChkaXJlY3Rpb24sIGkpOwotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgaGFuZGxlTWVzc2FnZSBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UoY3VycmVudE1DKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gSU4gY2FzZQotICAgICAgICAgICAgZm9yICg7IGkgPj0gZW5kOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2hDb250ZXh0KGRpcmVjdGlvbiwgaSk7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIGhhbmRsZU1lc3NhZ2Ugb246ICIgKyBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5oYW5kbGVNZXNzYWdlKGN1cnJlbnRNQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENhbGxzIGhhbmRsZU1lc3NhZ2Ugb24gdGhlIEhhbmRsZXIuIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIGEgcmVzcG9uc2UgaXMgZXhwZWN0ZWQsIHRoZQotICAgICAqIE1lc3NhZ2VDb250ZXh0IGlzIHVwZGF0ZWQgd2l0aCB0aGUgaGFuZGxlciBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQHJldHVybnMgU1VDQ0VTU0ZVTCBpZiBzdWNjZXNzZnVsbHksIFVOU1VDQ0VTU0ZVTCBpZiBmYWxzZSwgRVhDRVBUSU9OIGlmIGV4Y2VwdGlvbiB0aHJvd24KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBoYW5kbGVNZXNzYWdlKEhhbmRsZXIgaGFuZGxlciwgRGlyZWN0aW9uIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0UmVzcG9uc2UpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgaGFuZGxlTWVzc2FnZSBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIHByZSBhbmQgcG9zdCBpbnZva2VycyB3aWxsIGxpa2VseSBuZWVkIG1vcmUgdGhhbiBqdXN0IHRoZSBoYW5kbGVyIG1lc3NhZ2UgY29udGV4dC4KLSAgICAgICAgICAgIC8vIFRoZXkgbWF5IG5lZWQgYWNjZXNzIHRvIHRoZSBheGlzIHNlcnZpY2Ugb2JqZWN0IG9yIGRlc2NyaXB0aW9uIG9iamVjdHMuCi0gICAgICAgICAgICBjdXJyZW50TUMucHV0KENvbnN0YW50cy5NRVBfQ09OVEVYVCwgbWVwQ3R4KTsKLQotICAgICAgICAgICAgZ2V0UHJlSW52b2tlcigpLnByZUludm9rZShjdXJyZW50TUMpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gaGFuZGxlci5oYW5kbGVNZXNzYWdlKGN1cnJlbnRNQyk7Ci0gICAgICAgICAgICBnZXRQb3N0SW52b2tlcigpLnBvc3RJbnZva2UoY3VycmVudE1DKTsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiaGFuZGxlTWVzc2FnZSgpIHJldHVybmVkIHRydWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNVQ0NFU1NGVUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJoYW5kbGVNZXNzYWdlKCkgcmV0dXJuZWQgZmFsc2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdFJlc3BvbnNlKQotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TUMucHV0KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uICE9IERpcmVjdGlvbi5PVVQpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFJTEVEOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgeyAKLSAgICAgICAgICAgIC8vIFJ1bnRpbWVFeGNlcHRpb24gYW5kIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIGhhbmRsZU1lc3NhZ2UoKSBpbnZvY2F0aW9uIik7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbjogIiwgcmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBzYXZlZEV4Y2VwdGlvbiA9IHJlOwotICAgICAgICAgICAgaWYgKGV4cGVjdFJlc3BvbnNlKQotICAgICAgICAgICAgICAgIC8vIG1hcmsgaXQgYXMgcmV2ZXJzZSBkaXJlY3Rpb24KLSAgICAgICAgICAgICAgICBjdXJyZW50TUMucHV0KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3Rpb24gIT0gRGlyZWN0aW9uLk9VVCkpOwotICAgICAgICAgICAgaWYgKFByb3RvY29sRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmUuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICBjb252ZXJ0VG9GYXVsdE1lc3NhZ2UobWVwQ3R4LCByZSwgcHJvdG8pOwotICAgICAgICAgICAgICAgIC8vIGp1c3QgcmUtaW5pdGlhbGl6ZSB0aGUgY3VycmVudCBoYW5kbGVyIG1lc3NhZ2UgY29udGV4dCBzaW5jZQotICAgICAgICAgICAgICAgIC8vIHRoYXQgd2lsbCBwaWNrIHVwIHRoZSBub3ctY2hhbmdlZCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPVEhFUl9FWENFUFRJT047Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgICogc3RhcnQgYW5kIGVuZCBzaG91bGQgYmUgSU5jbHVzaXZlIG9mIHRoZSBoYW5kbGVycyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgICAqIGludm9rZWQgb24gSGFuZGxlci5oYW5kbGVNZXNzYWdlIG9yIEhhbmRsZXIuaGFuZGxlRmF1bHQKLSAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxDbG9zZUhhbmRsZXJzKGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbikgewotICAgICAgICBpbnQgaSA9IHN0YXJ0OwotCi0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgewotICAgICAgICAgICAgZm9yICg7IGkgPD0gZW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hDb250ZXh0KGRpcmVjdGlvbiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBjbG9zZSBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2xvc2UoY3VycmVudE1DKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gd2hlbiB3ZSBjbG9zZSwgYXJlIHdlIGRvbmUgd2l0aCB0aGUgaGFuZGxlciBpbnN0YW5jZSwgYW5kIHRodXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGNhbGwgdGhlIFByZURlc3Ryb3kgYW5ub3RhdGVkIG1ldGhvZD8gIEkgZG9uJ3QgdGhpbmsgc28sIGVzcGVjaWFsbHkKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UndmUgY2FjaGVkIHRoZSBoYW5kbGVyIGxpc3Qgc29tZXdoZXJlLgotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY2FsbGluZyBoYW5kbGVyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uOiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gSU4gY2FzZQotICAgICAgICAgICAgZm9yICg7IGkgPj0gZW5kOyBpLS0pIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hDb250ZXh0KGRpcmVjdGlvbiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBjbG9zZSBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2xvc2UoY3VycmVudE1DKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gd2hlbiB3ZSBjbG9zZSwgYXJlIHdlIGRvbmUgd2l0aCB0aGUgaGFuZGxlciBpbnN0YW5jZSwgYW5kIHRodXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGNhbGwgdGhlIFByZURlc3Ryb3kgYW5ub3RhdGVkIG1ldGhvZD8gIEkgZG9uJ3QgdGhpbmsgc28sIGVzcGVjaWFsbHkKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UndmUgY2FjaGVkIHRoZSBoYW5kbGVyIGxpc3Qgc29tZXdoZXJlLgotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY2FsbGluZyBoYW5kbGVyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uOiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6IiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogcHJvY2Vzc0ZhdWx0IGlzIGF2YWlsYWJsZSBmb3IgYSBzZXJ2ZXIgdG8gdXNlIHdoZW4gdGhlIGVuZHBvaW50Ci0gICAgICAqIHRocm93cyBhbiBleGNlcHRpb24gb3IgYSBjbGllbnQgd2hlbiBpdCBnZXRzIGEgZmF1bHQgcmVzcG9uc2UgbWVzc2FnZQotICAgICAgKgotICAgICAgKiBJbiBib3RoIGNhc2VzLCBhbGwgb2YgdGhlIGhhbmRsZXJzIGhhdmUgcnVuIHN1Y2Nlc3NmdWxseSBpbiB0aGUKLSAgICAgICogb3Bwb3NpdGUgZGlyZWN0aW9uIGFzIHRoaXMgY2FsbCB0byBjYWxsSGFuZGxlRmF1bHQsIGFuZCB0aHVzCi0gICAgICAqIHNob3VsZCBiZSBjbG9zZWQuCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NGYXVsdChNRVBDb250ZXh0IG1lcEN0eCwgRGlyZWN0aW9uIGRpcmVjdGlvbikgewotCi0gICAgICAgIC8vIGRpcmVjdGlvbi5JTiA9IGNsaWVudAotICAgICAgICAvLyBkaXJlY3Rpb24uT1VUID0gc2VydmVyCi0gICAgICAgIGlmIChoYW5kbGVycy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICB0aGlzLm1lcEN0eCA9IG1lcEN0eDsKLQkJc29ydENoYWluKCk7Ci0gICAgICAgIGluaXRDb250ZXh0KGRpcmVjdGlvbik7Ci0JCWN1cnJlbnRNQy5wdXQoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuTUVTU0FHRV9PVVRCT1VORF9QUk9QRVJUWSwgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gRGlyZWN0aW9uLk9VVCkgewotICAgICAgICAgICAgICAgIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQoMCwgaGFuZGxlcnMuc2l6ZSgpIC0gMSwgZGlyZWN0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIElOIGNhc2UKLSAgICAgICAgICAgICAgICBjYWxsR2VuZXJpY0hhbmRsZUZhdWx0KGhhbmRsZXJzLnNpemUoKSAtIDEsIDAsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGxvZyBpdAotICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyB3ZSBjYW4gY2xvc2UgYWxsIHRoZSBIYW5kbGVycyBpbiByZXZlcnNlIG9yZGVyCi0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpIHsKLSAgICAgICAgICAgICAgICBpbml0Q29udGV4dChEaXJlY3Rpb24uSU4pOwotICAgICAgICAgICAgICAgIGNhbGxDbG9zZUhhbmRsZXJzKDAsIGhhbmRsZXJzLnNpemUoKSAtIDEsIERpcmVjdGlvbi5PVVQpOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gSU4gY2FzZQotICAgICAgICAgICAgICAgIGluaXRDb250ZXh0KERpcmVjdGlvbi5JTik7Ci0gICAgICAgICAgICAgICAgY2FsbENsb3NlSGFuZGxlcnMoaGFuZGxlcnMuc2l6ZSgpIC0gMSwgMCwgRGlyZWN0aW9uLklOKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgICogVGhlIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGFueSBpbnZva2VkCi0gICAgICAqIEhhbmRsZXJzLiAgV2UgZG9uJ3Qga25vdyBob3cgZmFyIHRoZSBIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgY2FsbHMgZ290Ci0gICAgICAqIGJlZm9yZSBhIGZhaWx1cmUgbWF5IGhhdmUgb2NjdXJyZWQuCi0gICAgICAqCi0gICAgICAqIFJlZ2FyZGxlc3Mgb2YgdGhlIEhhbmRsZXIuaGFuZGxlRmF1bHQgcmVzdWx0LCB0aGUgZmxvdyBpcyB0aGUgc2FtZSAoOS4zLjIuMikKLSAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNhbGxHZW5lcmljSGFuZGxlRmF1bHQoaW50IHN0YXJ0LCBpbnQgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24pIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgICAgICBpbnQgaSA9IHN0YXJ0OwotICAgICAgICAKLSAgICAgICAgLy8gd2UgbWF5IGJlIHN0YXJ0aW5nIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxpc3QsIGFuZCB0aGVyZWZvcmUgbWF5IG5lZWQgdG8gc3dpdGNoIGNvbnRleHRzCi0gICAgICAgIHN3aXRjaENvbnRleHQoZGlyZWN0aW9uLCBpKTsKLQotICAgICAgICBpZiAoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpIHsKLSAgICAgICAgICAgIGZvciAoOyBpIDw9IGVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBoYW5kbGVGYXVsdCBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBoYW5kbGVyLmhhbmRsZUZhdWx0KGN1cnJlbnRNQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHN3aXRjaENvbnRleHQoZGlyZWN0aW9uLCBpICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIElOIGNhc2UKLSAgICAgICAgICAgIGZvciAoOyBpID49IGVuZDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBoYW5kbGVGYXVsdCBvbjogIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBoYW5kbGVyLmhhbmRsZUZhdWx0KGN1cnJlbnRNQyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHN3aXRjaENvbnRleHQoZGlyZWN0aW9uLCBpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9GYXVsdE1lc3NhZ2UoTUVQQ29udGV4dCBtZXBDdHgsIEV4Y2VwdGlvbiBlLCBQcm90b2NvbCBwcm90b2NvbCkgewotCi0gICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGEgZmF1bHQgbWVzc2FnZSBvciBub3QsCi0gICAgICAgIC8vIHByb2JhYmx5IGJ5IHdheSBvZiBhIGZsYWcgKGlzRmF1bHQpIGluIHRoZSBNZXNzYWdlQ29udGV4dCBvciBNZXNzYWdlCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBhIGZhdWx0IE1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgZXhjZXB0aW9uOiAiICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvKiBUT0RPIFRPRE8gVE9ETwotICAgICAgICAgICAgICogVGhlcmUgaGFzIEdPVCB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMSB8fCBwcm90b2NvbCA9PSBQcm90b2NvbC5zb2FwMTIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2xOUyA9IChwcm90b2NvbCA9PSBQcm90b2NvbC5zb2FwMTEpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8xX0VOVkVMT1BFIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBzZXQgb2YgaW5zdHJ1Y3Rpb25zIGlzIHVzZWQgdG8gYXZvaWQgCi0gICAgICAgICAgICAgICAgLy8gc29tZSB1bmltcGxlbWVudGVkIG1ldGhvZHMgaW4gdGhlIEF4aXMyIFNBQUogaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICBYTUxGYXVsdCB4bWxGYXVsdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5jcmVhdGVYTUxGYXVsdEZyb21TeXN0ZW1FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkgbWYgPSBTQUFKRmFjdG9yeS5jcmVhdGVNZXNzYWdlRmFjdG9yeShwcm90b2NvbE5TKTsKLSAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlU0FBSkZhdWx0KHhtbEZhdWx0LCBib2R5KTsKLQotICAgICAgICAgICAgICAgIC8vIFRPRE8gc29tZXRoaW5nIGlzIHdyb25nIGhlcmUuICBUaGUgbWVzc2FnZSBzaG91bGQgYmUgYSByZXNwb25zZSBtZXNzYWdlLCBub3QKLSAgICAgICAgICAgICAgICAvLyBhIHJlcXVlc3QgbWVzc2FnZS4gIEkgZG9uJ3Qgc2VlIGhvdyB0byBjaGFuZ2UgdGhhdC4gIChzZWUgdGhlIGRlYnVnZ2VyLi4uKQotICAgICAgICAgICAgICAgIC8vIFRPRE8gcHJvYmFibHkgYWxzbyBuZWVkIHRvIHR1cm4gb24gbWVzc2FnZS5XUklURV9YTUxfREVDTEFSQVRJT04KLSAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtc2dGYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtc2dGYWN0b3J5LmNyZWF0ZUZyb20obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgbWVwQ3R4LnNldE1lc3NhZ2UobXNnKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNGYXVsdE1zZ0VyciIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q29udGV4dChEaXJlY3Rpb24gZGlyZWN0aW9uKSB7Ci0gICAgICAgIHNvYXBNQyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWVwQ3R4LmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICBsb2dpY2FsTUMgPSBNZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1lcEN0eC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUKSB7Ci0gICAgICAgICAgICAvLyBsb2dpY2FsIGNvbnRleHQsIHRoZW4gU09BUAotICAgICAgICAgICAgaWYgKChsb2dpY2FsTGVuZ3RoID09IDApICYmIChoYW5kbGVycy5zaXplKCkgPiAwKSkgLy8gd2Ugb25seSBoYXZlIHNvYXAgaGFuZGxlcnMKLSAgICAgICAgICAgICAgICBjdXJyZW50TUMgPSBzb2FwTUM7IC8vTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dChtZXBDdHguZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3VycmVudE1DID0gbG9naWNhbE1DOyAvL01lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVMb2dpY2FsTWVzc2FnZUNvbnRleHQobWVwQ3R4LmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU09BUCBjb250ZXh0LCB0aGVuIGxvZ2ljYWwKLSAgICAgICAgICAgIGlmICgobG9naWNhbExlbmd0aCA9PSBoYW5kbGVycy5zaXplKCkpICYmIChoYW5kbGVycy5zaXplKCkgPiAwKSkgLy8gd2Ugb25seSBoYXZlIGxvZ2ljYWwgaGFuZGxlcnMKLSAgICAgICAgICAgICAgICBjdXJyZW50TUMgPSBsb2dpY2FsTUM7IC8vTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZUxvZ2ljYWxNZXNzYWdlQ29udGV4dChtZXBDdHguZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY3VycmVudE1DID0gc29hcE1DOyAvL01lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWVwQ3R4LmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3aXRjaENvbnRleHQoRGlyZWN0aW9uIGRpcmVjdGlvbiwgaW50IGluZGV4KSB7Ci0KLSAgICAgICAgaWYgKChsb2dpY2FsTGVuZ3RoID09IGhhbmRsZXJzLnNpemUoKSkgfHwgKGxvZ2ljYWxMZW5ndGggPT0gMCkpCi0gICAgICAgICAgICByZXR1cm47IC8vIGFsbCBoYW5kbGVycyBtdXN0IGJlIHRoZSBzYW1lIHR5cGUsIHNvIG5vIGNvbnRleHQgc3dpdGNoCi0KLSAgICAgICAgaWYgKCgoZGlyZWN0aW9uID09IERpcmVjdGlvbi5PVVQpICYmIChpbmRleCA9PSBsb2dpY2FsTGVuZ3RoKSkKLSAgICAgICAgICAgICAgICB8fCAoKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uSU4pICYmIChpbmRleCA9PSAobG9naWNhbExlbmd0aCAtIDEpKSkpIHsKLSAgICAgICAgICAgIC8vaWYgKGN1cnJlbnRNQy5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oTG9naWNhbE1lc3NhZ2VDb250ZXh0LmNsYXNzKSkKLSAgICAgICAgICAgIGlmIChjdXJyZW50TUMgPT0gbG9naWNhbE1DKSAgLy8gb2JqZWN0IGNoZWNrLCBub3QgLmVxdWFscygpCi0gICAgICAgICAgICAgICAgY3VycmVudE1DID0gc29hcE1DOyAvL01lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWVwQ3R4LmdldE1lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGN1cnJlbnRNQyA9IGxvZ2ljYWxNQzsgLy9NZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1lcEN0eC5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhbmRsZXJQcmVJbnZva2VyIGdldFByZUludm9rZXIoKSB7Ci0gICAgCWlmIChoYW5kbGVyUHJlSW52b2tlciA9PSBudWxsKSB7Ci0gICAgCQlIYW5kbGVyUHJlSW52b2tlckZhY3RvcnkgcHJlSW52b2tlckZhY3RvcnkgPSAoSGFuZGxlclByZUludm9rZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgCQloYW5kbGVyUHJlSW52b2tlciA9IChIYW5kbGVyUHJlSW52b2tlcilwcmVJbnZva2VyRmFjdG9yeS5jcmVhdGVIYW5kbGVyUHJlSW52b2tlcigpOwotICAgIAl9Ci0gICAgCXJldHVybiBoYW5kbGVyUHJlSW52b2tlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYW5kbGVyUG9zdEludm9rZXIgZ2V0UG9zdEludm9rZXIoKSB7Ci0gICAgCWlmIChoYW5kbGVyUG9zdEludm9rZXIgPT0gbnVsbCkgewotICAgIAkJSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeSBwb3N0SW52b2tlckZhY3RvcnkgPSAoSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAJCWhhbmRsZXJQb3N0SW52b2tlciA9IChIYW5kbGVyUG9zdEludm9rZXIpcG9zdEludm9rZXJGYWN0b3J5LmNyZWF0ZUhhbmRsZXJQb3N0SW52b2tlcigpOwotICAgIAl9Ci0gICAgCXJldHVybiBoYW5kbGVyUG9zdEludm9rZXI7Ci0gICAgfQotICAgIAotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJJbnZvY2F0aW9uQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVySW52b2NhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlNWRmMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJJbnZvY2F0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgZGF0YSBiZWFuIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBIYW5kbGVySW52b2tlciBpbnN0YW5jZS4NCi0gKiBUaGUgYmVhbiB3aWxsIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBkYXRhIGluIG9yZGVyIHRvIGludm9rZQ0KLSAqIGVpdGhlciBpbmJvdW5kIG9yIG91dGJvdW5kIEhhbmRsZXIgaW5zdGFuY2VzIGZvciBhIGdpdmVuIHJlcXVlc3QuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckludm9jYXRpb25Db250ZXh0IHsNCi0gICAgDQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7DQotICAgIA0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAgbWVwOw0KLSAgICANCi0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOw0KLSAgICANCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT25lV2F5Ow0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheSgpIHsNCi0gICAgICAgIHJldHVybiBpc09uZVdheTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbmVXYXkoYm9vbGVhbiBpc09uZVdheSkgew0KLSAgICAgICAgdGhpcy5pc09uZVdheSA9IGlzT25lV2F5Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlQ29udGV4dCA9IG1lc3NhZ2VDb250ZXh0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQIGdldE1FUCgpIHsNCi0gICAgICAgIHJldHVybiBtZXA7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TUVQKEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAgbWVwKSB7DQotICAgICAgICB0aGlzLm1lcCA9IG1lcDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyPiBnZXRIYW5kbGVycygpIHsNCi0gICAgICAgIHJldHVybiBoYW5kbGVyczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVycyhMaXN0PEhhbmRsZXI+IGhhbmRsZXJzKSB7DQotICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnM7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVySW52b2tlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVySW52b2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjU4ZjQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIGEgY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBieSB0aGUNCi0gKiBKQVgtV1MgRW5kcG9pbnRDb250cm9sbGVyIHRvIGhhbmRsZSB0aGUgaW52b2NhdGlvbiBvZiBib3RoDQotICogaW5ib3VuZCBhbmQgb3V0Ym91bmQgaGFuZGxlcnMuIEluc3RhbmNlcyBvZiB0aGVzZSB3aWxsIGJlDQotICogc2VydmVkIHVwIGJ5IHRoZSBIYW5kbGVySW52b2tlckZhY3RvcnkuDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJJbnZva2VyIHsNCi0NCi0gICAgLyoqDQotICAgICAqIEludm9rZXMgYWxsIGluYm91bmQgaGFuZGxlcnMgZm9yIHRoZSBpbmNvbWluZyByZXF1ZXN0IHRvIHRoZSBlbmRwb2ludC4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIGludm9rZUluYm91bmRIYW5kbGVycyhIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgY29udGV4dCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW52b2tlcyBhbGwgaW5ib3VuZCBoYW5kbGVycyBmb3IgdGhlIGluY29taW5nIHJlcXVlc3QgdG8gdGhlIGVuZHBvaW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaW52b2tlT3V0Ym91bmRIYW5kbGVycyhIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgY29udGV4dCk7DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJJbnZva2VyVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckludm9rZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4MTEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckludm9rZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVySW52b2tlclV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSGFuZGxlckludm9rZXJVdGlscy5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgSW5ib3VuZCBIYW5kbGVycwotICAgICAqIEBwYXJhbSByZXF1ZXN0TXNnQ3R4Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludm9rZUluYm91bmRIYW5kbGVycyhNRVBDb250ZXh0IG1lcE1lc3NhZ2VDdHgsIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQIG1lcCwgYm9vbGVhbiBpc09uZVdheSkgewotCi0gICAgICAgIGlmIChoYW5kbGVycyA9PSBudWxsIHx8IGhhbmRsZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIFN0cmluZyBiaW5kaW5nUHJvdG8gPSBudWxsOwotICAgICAgICBpZiAobWVwLmVxdWFscyhIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QpKSAvLyBpbmJvdW5kIHJlcXVlc3Q7IG11c3QgYmUgb24gdGhlIHNlcnZlcgotICAgICAgICAgICAgYmluZGluZ1Byb3RvID0gbWVwTWVzc2FnZUN0eC5nZXRFbmRwb2ludERlc2MoKS5nZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIGluYm91bmQgcmVzcG9uc2U7IG11c3QgYmUgb24gdGhlIGNsaWVudAotICAgICAgICAgICAgYmluZGluZ1Byb3RvID0gbWVwTWVzc2FnZUN0eC5nZXRFbmRwb2ludERlc2MoKS5nZXRDbGllbnRCaW5kaW5nSUQoKTsKLSAgICAgICAgICAgIC8vIFRoZSBnZXRIZWFkZXIgcHJvY2Vzc2luZyBpcyBkb25lIG9uIHRoZSBzZXJ2ZXIgYnkgdGhlIEVuZHBvaW50Q29udHJvbGxlci4KLSAgICAgICAgICAgIC8vIEZvciBtZXNzYWdlcyBpbmJvdW5kIHRvIHRoZSBjbGllbnQgKGkuZS4gcmVzcG9uc2VzKSwgd2UgZG8gaXQgaGVyZSBzaW5jZSBhbGwgdGhyZWUKLSAgICAgICAgICAgIC8vIGNsaWVudCBKQVgtV1MgQVBJcyAoaS5lLiBzeW5jLCBhc3luYywgYW5kIGFzeW5jIGNhbGxiYWNrKSB1c2UgdGhpcyBtZXRob2QgdG8gCi0gICAgICAgICAgICAvLyBpbnZva2UgdGhlIGhhbmRsZXJzLgotICAgICAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZCA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7Ci0gICAgICAgICAgICBmb3IoSGFuZGxlciBoYW5kbGVyOmhhbmRsZXJzKXsKLSAgICAgICAgICAgICAgICBpZihoYW5kbGVyIGluc3RhbmNlb2YgU09BUEhhbmRsZXIpewotICAgICAgICAgICAgICAgICAgICBTT0FQSGFuZGxlciBzb2FwSGFuZGxlciA9IChTT0FQSGFuZGxlciloYW5kbGVyOwotICAgICAgICAgICAgICAgICAgICAvL0ludm9raW5nIGdldEhlYWRlcnMuCi0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2xpZW50IHNpZGU6IEludm9raW5nIGdldEhlYWRlcigpIG9uIFNPQVBIYW5kbGVyOiAiICsgc29hcEhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNldDxRTmFtZT4gaGVhZGVycyA9IHNvYXBIYW5kbGVyLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoaGVhZGVycyE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoUU5hbWUgaGVhZGVyOmhlYWRlcnMpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF1bmRlcnN0b29kLmNvbnRhaW5zKGhlYWRlcikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBIZWFkZXIgUU5hbWUiICsgaGVhZGVyICsgIiB0byB1ZGVyc3Rvb2RIZWFkZXJRTmFtZSBMaXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9BZGRpbmcgdGhpcyB0byB1bmRlcnN0b29kIGhlYWRlciBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBsaXN0IG9mIGhlYWRlcnMgdW5kZXN0b29kIGJ5IHRoZSBjbGllbnQgaW5ib3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQVgtV1MgaGFuZGxlcnMgc2hvdWxkIGJlIHVzZWQgaW4gY2xpZW50LXNpZGUgaW5ib3VuZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc3Rvb2QuYWRkKGhlYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFByb3RvY29sIHByb3RvID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGJpbmRpbmdQcm90byk7Ci0gICAgICAgIAotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBwcm90byk7Ci0gICAgICAgIC8vIGlmIG5vdCBvbmUtd2F5LCBleHBlY3QgYSByZXNwb25zZQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1lcE1lc3NhZ2VDdHguZ2V0TWVzc2FnZU9iamVjdCgpLmlzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzRmF1bHQobWVwTWVzc2FnZUN0eCwgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtZXBNZXNzYWdlQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc09uZVdheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBoYW5kbGVyIGZyYW1ld29yayBzaG91bGQgb25seSB0aHJvdyBhbiBleGNlcHRpb24gaGVyZSBpZgotICAgICAgICAgICAgICogd2UgYXJlIGluIHRoZSBjbGllbnQgaW5ib3VuZCBjYXNlLiAgTWFrZSBzdXJlIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgKiBjb250ZXh0IGFuZCBtZXNzYWdlIGFyZSB0cmFuc2Zvcm1lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLmNvbnZlcnRUb0ZhdWx0TWVzc2FnZShtZXBNZXNzYWdlQ3R4LCByZSwgcHJvdG8pOwotICAgICAgICAgICAgLy8gZG9uZSBpbnZva2luZyBpbmJvdW5kIGhhbmRsZXJzLCBiZSBzdXJlIHRvIHNldCB0aGUgYWNjZXNzIGxvY2sgZmxhZyBvbiB0aGUgY29udGV4dCB0byB0cnVlCi0gICAgICAgICAgICBtZXBNZXNzYWdlQ3R4LnNldEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzICYmIG1lcC5lcXVhbHMoSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNUKSkgewotICAgICAgICAgICAgLy8gdWgtb2guICBXZSd2ZSBjaGFuZ2VkIGRpcmVjdGlvbnMgb24gdGhlIHNlcnZlciBpbmJvdW5kIGhhbmRsZXIgcHJvY2Vzc2luZywKLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2UncmUgbm93IG9uIGFuIG91dGJvdW5kIGZsb3csIGFuZCB0aGUgZW5kcG9pbnQgd2lsbCBub3QKLSAgICAgICAgICAgIC8vIGJlIGNhbGxlZC4gIEJlIHN1cmUgdG8gbWFyayB0aGUgY29udGV4dCBhbmQgbWVzc2FnZSBhcyBzdWNoLgotCi0gICAgICAgICAgICAvLyBkb25lIGludm9raW5nIGluYm91bmQgaGFuZGxlcnMsIGJlIHN1cmUgdG8gc2V0IHRoZSBhY2Nlc3MgbG9jayBmbGFnIG9uIHRoZSBjb250ZXh0IHRvIHRydWUKLSAgICAgICAgICAgIG1lcE1lc3NhZ2VDdHguc2V0QXBwbGljYXRpb25BY2Nlc3NMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG9uZSBpbnZva2luZyBpbmJvdW5kIGhhbmRsZXJzLCBiZSBzdXJlIHRvIHNldCB0aGUgYWNjZXNzIGxvY2sgZmxhZyBvbiB0aGUgY29udGV4dCB0byB0cnVlCi0gICAgICAgIG1lcE1lc3NhZ2VDdHguc2V0QXBwbGljYXRpb25BY2Nlc3NMb2NrZWQodHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIE91dGJvdW5kSGFuZGxlcnMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbXNnQ3R4Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGludm9rZU91dGJvdW5kSGFuZGxlcnMoTUVQQ29udGV4dCBtZXBNZXNzYWdlQ3R4LCBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAgbWVwLCBib29sZWFuIGlzT25lV2F5KSB7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXJzID09IG51bGwgfHwgaGFuZGxlcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgU3RyaW5nIGJpbmRpbmdQcm90byA9IG51bGw7Ci0gICAgICAgIGlmIChtZXAuZXF1YWxzKEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCkpIC8vIG91dGJvdW5kIHJlcXVlc3Q7IG11c3QgYmUgb24gdGhlIGNsaWVudAotICAgICAgICAgICAgYmluZGluZ1Byb3RvID0gbWVwTWVzc2FnZUN0eC5nZXRFbmRwb2ludERlc2MoKS5nZXRDbGllbnRCaW5kaW5nSUQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gb3V0Ym91bmQgcmVzcG9uc2U7IG11c3QgYmUgb24gdGhlIHNlcnZlcgotICAgICAgICAgICAgYmluZGluZ1Byb3RvID0gbWVwTWVzc2FnZUN0eC5nZXRFbmRwb2ludERlc2MoKS5nZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICBQcm90b2NvbCBwcm90byA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhiaW5kaW5nUHJvdG8pOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBwcm90byk7Ci0gICAgICAgIC8vIGlmIG5vdCBvbmUtd2F5LCBleHBlY3QgYSByZXNwb25zZQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1lcE1lc3NhZ2VDdHguZ2V0TWVzc2FnZU9iamVjdCgpLmlzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzRmF1bHQobWVwTWVzc2FnZUN0eCwgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWVwTWVzc2FnZUN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzT25lV2F5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIGhhbmRsZXIgZnJhbWV3b3JrIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGhlcmUgb24gY2xpZW50IG91dGJvdW5kIGZsb3cgYW5kCi0gICAgICAgICAgICAgKiBzZXJ2ZXIgb3V0Ym91bmQgZmxvdy4gIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBjb250ZXh0IGFuZCBtZXNzYWdlIGFyZSB0cmFuc2Zvcm1lZAotICAgICAgICAgICAgICogYW5kIHRoZSBleGNlcHRpb24gaXMgc2F2ZWQgb24gdGhlIG1lc3NhZ2UgY29udGV4dC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLmNvbnZlcnRUb0ZhdWx0TWVzc2FnZShtZXBNZXNzYWdlQ3R4LCByZSwgcHJvdG8pOwotICAgICAgICAgICAgaWYgKG1lcE1lc3NhZ2VDdHguZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lcE1lc3NhZ2VDdHguZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuc2V0Q2F1c2VkQnlFeGNlcHRpb24obmV3IEF4aXNGYXVsdChyZS5nZXRNZXNzYWdlKCksIHJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVwTWVzc2FnZUN0eC5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lcE1lc3NhZ2VDdHguZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpLnNldENhdXNlZEJ5RXhjZXB0aW9uKG5ldyBBeGlzRmF1bHQocmUuZ2V0TWVzc2FnZSgpLCByZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzICYmIG1lcC5lcXVhbHMoSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNUKSkgewotICAgICAgICAgICAgLy8gdWgtb2guICBXZSd2ZSBjaGFuZ2VkIGRpcmVjdGlvbnMgb24gdGhlIGNsaWVudCBvdXRib3VuZCBoYW5kbGVyIHByb2Nlc3NpbmcsCi0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHdlJ3JlIG5vdyBvbiBhbiBpbmJvdW5kIGZsb3csIGFuZCB0aGUgc2VydmljZSB3aWxsIG5vdAotICAgICAgICAgICAgLy8gYmUgY2FsbGVkLiAgQmUgc3VyZSB0byBtYXJrIHRoZSBjb250ZXh0IGFuZCBtZXNzYWdlIGFzIHN1Y2guCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclBvc3RJbnZva2VyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJQb3N0SW52b2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmM3Yjk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclBvc3RJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLS8qDQotICogSGFuZGxlclBvc3RJbnZva2VyIC0gdGhpcyBpcyB0aGUgaW50ZXJmYWNlIHJldHVybmVkIGJ5IHRoZQ0KLSAqIEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkgdG8gYmUgY2FsbGVkIGp1c3QgYWZ0ZXIgZWFjaA0KLSAqIEpBWFdTIGhhbmRsZXIuaGFuZGxlTWVzc2FnZSBpbnZvY2F0aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSGFuZGxlclBvc3RJbnZva2VyIHsNCi0NCi0JLyoqDQotCSAqIHBvc3RJbnZva2UgaXMgY2FsbGVkIGp1c3QgcHJpb3IgdG8gZWFjaCBKQVhXUyBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UuDQotCSAqIEltcGxlbWVudGF0aW9ucyBtYXkgbmVlZCB0byBjaGVjayBpZiB3ZSBhcmUgaW5ib3VuZCBvciBvdXRib3VuZCwgYW5kDQotCSAqIGNsaWVudCBvciBzZXJ2ZXIuICBJbXBsZW1lbnRhdGlvbnMgbWF5IHZhbGlkYXRlIHRoZSBwcmUtY29uZGl0aW9ucyBmb3IgaGFuZGxlcnMsDQotCSAqIHN1Y2ggYXMgc2F2aW5nIGEgU09BUCBtZXNzYWdlIGJvZHksIHRoYXQgd2VyZSByZWdpc3RlcmVkIGJ5IEhhbmRsZXJQcmVJbnZva2VyLg0KLQkgKiANCi0JICogQHBhcmFtIG1jDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBwb3N0SW52b2tlKE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZUludm9rZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZUludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3MjZlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJQcmVJbnZva2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLS8qDQotICogSGFuZGxlclByZUludm9rZXIgLSB0aGlzIGlzIHRoZSBpbnRlcmZhY2UgcmV0dXJuZWQgYnkgdGhlDQotICogSGFuZGxlclByZUludm9rZXJGYWN0b3J5IHRvIGJlIGNhbGxlZCBqdXN0IHByaW9yIHRvIGVhY2gNCi0gKiBKQVhXUyBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UgaW52b2NhdGlvbi4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJQcmVJbnZva2VyIHsNCi0NCi0JLyoqDQotCSAqIHByZUludm9rZSBpcyBjYWxsZWQganVzdCBwcmlvciB0byBlYWNoIEpBWFdTIGhhbmRsZXIuaGFuZGxlTWVzc2FnZS4NCi0JICogSW1wbGVtZW50YXRpb25zIG1heSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFyZSBpbmJvdW5kIG9yIG91dGJvdW5kLCBhbmQNCi0JICogY2xpZW50IG9yIHNlcnZlci4gIEltcGxlbWVudGF0aW9ucyBtYXkgc2V0IHVwIHByZS1jb25kaXRpb25zIGZvciBoYW5kbGVycywNCi0JICogc3VjaCBhcyBzYXZpbmcgYSBTT0FQIG1lc3NhZ2UgYm9keSwgdG8gYmUgY2hlY2tlZCBieSBIYW5kbGVyUG9zdEludm9rZXINCi0JICogZm9yIGlsbGVnYWwgbW9kaWZpY2F0aW9ucy4NCi0JICogDQotCSAqIEBwYXJhbSBtYw0KLQkgKi8NCi0JcHVibGljIHZvaWQgcHJlSW52b2tlKE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclJlc29sdmVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwN2Q3ZTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5saWZlY3ljbGUuZmFjdG9yeS5IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmZhY3RvcnkuSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkJhc2VIYW5kbGVyUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiAKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFNlcnZpY2VEZWxlZ2F0ZS4KLSAqIEhhbmRsZXJSZXNvbHZlckltcGwuZ2V0SGFuZGxlckNoYWluKFBvcnRJbmZvKSB3aWxsIGJlIGNhbGxlZCBieSB0aGUKLSAqIEludm9jYXRpb25Db250ZXh0LCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHNldCBvbiB0aGUgQmluZGluZwotICogdW5kZXIgdGhlIEJpbmRpbmdQcm92aWRlci4KLSAqIAotICogSGFuZGxlclJlc29sdmVySW1wbC5nZXRIYW5kbGVyQ2hhaW4oUG9ydEluZm8pIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yCi0gKiBzdGFydGluZyBlYWNoIEhhbmRsZXIncyBsaWZlY3ljbGUgYWNjb3JkaW5nIHRvIEpBWC1XUyBzcGVjIDkuMy4xCi0gKi8KLQotcHVibGljIGNsYXNzIEhhbmRsZXJSZXNvbHZlckltcGwgZXh0ZW5kcyBCYXNlSGFuZGxlclJlc29sdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIYW5kbGVyUmVzb2x2ZXJJbXBsLmNsYXNzKTsKLSAgICAvKgotICAgICAgKiBUT0RPOiAgaXMgdGhlcmUgYW55IHZhbHVlL3JlYXNvbiBpbiBjYWNoaW5nIHRoZSBsaXN0IHdlIGNvbGxlY3QgZnJvbSB0aGUKLSAgICAgICogcG9ydHM/ICBJdCBpcyBhICJsaXZlIiBsaXN0IGluIHRoZSBzZW5zZSB0aGF0IHdlIGNvdWxkIHBvc3NpYmx5IHJldHVybgotICAgICAgKiBhIExpc3Qgb3IgQXJyYXlMaXN0IG9iamVjdCB0byBhIHNlcnZpY2Ugb3IgY2xpZW50IGFwcGxpY2F0aW9uLCB3aGVyZQotICAgICAgKiB0aGV5IGNvdWxkIG1hbmlwdWxhdGUgaXQuCi0gICAgICAqLwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2M7Ci0gICAgcHJpdmF0ZSBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5OwotICAgIAotICAgIHB1YmxpYyBIYW5kbGVyUmVzb2x2ZXJJbXBsKFNlcnZpY2VEZXNjcmlwdGlvbiBzZCkgewotICAgICAgICB0aGlzKHNkLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVySW1wbChTZXJ2aWNlRGVzY3JpcHRpb24gc2QsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsgCi0gICAgICAgIHRoaXMuc2VydmljZURlc2MgPSBzZDsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRGVsZWdhdGVLZXkgPSBzZXJ2aWNlRGVsZWdhdGVLZXk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIGdldFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihQb3J0SW5mbyBwb3J0SW5mbykgewotICAgICAgICBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gcmVzb2x2ZWRIYW5kbGVyc0Rlc2MgPSBudWxsOwotICAgICAgICAvLyBPbiB0aGUgY2xpZW50IHRoZSBoYW5kbGVyIGluZm9ybWF0aW9uIGNhbiBiZSBjaGFuZ2VkIHZpYSBzZXJ2aWNlLWRlbGVnYXRlLXNwZWNpZmljCi0gICAgICAgIC8vIGRlcGxveW1lbnQgaW5mb3JtYXRpb24uICBTbywgb25seSBsb29rIGludG8gdGhlIHNlcnZpY2Utc2lkZSBjYWNoZSBvbmx5IGlmIHRoZSAKLSAgICAgICAgLy8gc2VydmljZSBkZWxlZ2F0ZSBrZXkgaXMgbnVsbC4KLSAgICAgICAgaWYgKHNlcnZpY2VEZWxlZ2F0ZUtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvbHZlZEhhbmRsZXJzRGVzYyA9IHNlcnZpY2VEZXNjLmdldFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihwb3J0SW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVkSGFuZGxlcnNEZXNjOwotICAgIH0KLSAgICBwcml2YXRlIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBnZXRPckNyZWF0ZVJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihQb3J0SW5mbyBwb3J0SW5mbykgewotICAgICAgICBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gcmVzb2x2ZWRIYW5kbGVyc0Rlc2MgPSBudWxsOwotICAgICAgICAvLyBPbiB0aGUgY2xpZW50IHRoZSBoYW5kbGVyIGluZm9ybWF0aW9uIGNhbiBiZSBjaGFuZ2VkIHZpYSBzZXJ2aWNlLWRlbGVnYXRlLXNwZWNpZmljCi0gICAgICAgIC8vIGRlcGxveW1lbnQgaW5mb3JtYXRpb24uICBTbywgb25seSBsb29rIGludG8gdGhlIHNlcnZpY2Utc2lkZSBjYWNoZSBvbmx5IGlmIHRoZSAKLSAgICAgICAgLy8gc2VydmljZSBkZWxlZ2F0ZSBrZXkgaXMgbnVsbC4KLSAgICAgICAgaWYgKHNlcnZpY2VEZWxlZ2F0ZUtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvbHZlZEhhbmRsZXJzRGVzYyA9IHNlcnZpY2VEZXNjLmdldFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihwb3J0SW5mbyk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRIYW5kbGVyc0Rlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlcnNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvbHZlZEhhbmRsZXJzRGVzYzsKLSAgICB9Ci0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBnZUNhY2hlZFJlc29sdmVkSGFuZGxlcnNDbGFzc2VzKFBvcnRJbmZvIHBvcnRJbmZvKSB7Ci0gICAgICAgIExpc3Q8Q2xhc3M+IGNhY2hlZEhhbmRsZXJDbGFzc2VzID0gbnVsbDsKLSAgICAgICAgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIHJlc29sdmVkSGFuZGxlcnNEZXNjID0gZ2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKHBvcnRJbmZvKTsKLSAgICAgICAgaWYgKHJlc29sdmVkSGFuZGxlcnNEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlZEhhbmRsZXJDbGFzc2VzID0gcmVzb2x2ZWRIYW5kbGVyc0Rlc2MuZ2V0SGFuZGxlckNsYXNzZXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FjaGVkSGFuZGxlckNsYXNzZXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjYWNoZVJlc29sdmVkSGFuZGxlcnNJbmZvKFBvcnRJbmZvIHBvcnRJbmZvLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMpIHsKLSAgICAgICAgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIHJlc29sdmVkSGFuZGxlcnNEZXNjID0gZ2V0T3JDcmVhdGVSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24ocG9ydEluZm8pOwotICAgICAgICBpZiAocmVzb2x2ZWRIYW5kbGVyc0Rlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzb2x2ZWRIYW5kbGVyc0Rlc2Muc2V0SGFuZGxlckNsYXNzZXMoaGFuZGxlckNsYXNzZXMpOwotICAgICAgICAgICAgcmVzb2x2ZWRIYW5kbGVyc0Rlc2Muc2V0Um9sZXMocm9sZXMpOwotICAgICAgICAgICAgc2VydmljZURlc2Muc2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKHBvcnRJbmZvLCByZXNvbHZlZEhhbmRsZXJzRGVzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IGdldEhhbmRsZXJDbGFzc2VzKFBvcnRJbmZvIHBvcnRJbmZvKSB7Ci0gICAgICAgIExpc3Q8Q2xhc3M+IGhhbmRsZXJDbGFzc2VzID0gZ2VDYWNoZWRSZXNvbHZlZEhhbmRsZXJzQ2xhc3Nlcyhwb3J0SW5mbyk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2xhc3NlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVzb2x2ZVJvbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBoYW5kbGVyQ2xhc3NlcyA9IHJlc29sdmVIYW5kbGVycyhwb3J0SW5mbywgcmVzb2x2ZVJvbGVzKTsKLSAgICAgICAgICAgIGNhY2hlUmVzb2x2ZWRIYW5kbGVyc0luZm8ocG9ydEluZm8sIGhhbmRsZXJDbGFzc2VzLCByZXNvbHZlUm9sZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2xhc3NlczsKLSAgICB9Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0SGFuZGxlclJvbGVzKFBvcnRJbmZvIHBvcnRJbmZvKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiByZXNvbHZlUm9sZXMgPSBnZXRDYWNoZWRSZXNvbHZlZEhhbmRsZXJzUm9sZXMocG9ydEluZm8pOwotICAgICAgICBpZiAocmVzb2x2ZVJvbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc29sdmVSb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgTGlzdDxDbGFzcz4gcmVzb2x2ZUNsYXNzZXMgPSByZXNvbHZlSGFuZGxlcnMocG9ydEluZm8sIHJlc29sdmVSb2xlcyk7Ci0gICAgICAgICAgICBjYWNoZVJlc29sdmVkSGFuZGxlcnNJbmZvKHBvcnRJbmZvLCByZXNvbHZlQ2xhc3NlcywgcmVzb2x2ZVJvbGVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb2x2ZVJvbGVzOwotICAgIH0KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRDYWNoZWRSZXNvbHZlZEhhbmRsZXJzUm9sZXMoUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNhY2hlZEhhbmRsZXJSb2xlcyA9IG51bGw7Ci0gICAgICAgIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiByZXNvbHZlZEhhbmRsZXJzRGVzYyA9IGdldFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbihwb3J0SW5mbyk7Ci0gICAgICAgIGlmIChyZXNvbHZlZEhhbmRsZXJzRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWRIYW5kbGVyUm9sZXMgPSByZXNvbHZlZEhhbmRsZXJzRGVzYy5nZXRSb2xlcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZWRIYW5kbGVyUm9sZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8SGFuZGxlcj4gZ2V0SGFuZGxlckNoYWluKFBvcnRJbmZvIHBvcnRJbmZvKSB7Ci0gICAgICAgIExpc3Q8Q2xhc3M+IGhhbmRsZXJDbGFzc2VzID0gZ2V0SGFuZGxlckNsYXNzZXMocG9ydEluZm8pOwotCi0gICAgICAgIGlmIChoYW5kbGVyQ2xhc3Nlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgLy8gQ3JlYXRlIHRlbXBvcmFyeSBNZXNzYWdlQ29udGV4dCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGN0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBjdHguc2V0RW5kcG9pbnREZXNjcmlwdGlvbihzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRJbmZvLmdldFBvcnROYW1lKCkpKTsKLQotICAgICAgICBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlciBobG0gPSBjcmVhdGVIYW5kbGVybGlmZWN5Y2xlTWFuYWdlcigpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3I8Q2xhc3M+IGl0ZXJhdG9yID0gaGFuZGxlckNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQ2xhc3MgYUNsYXNzID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgLy8gIGluc3RhbnRpYXRlIHBvcnRIYW5kbGVyIGNsYXNzIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoaGxtLmNyZWF0ZUhhbmRsZXJJbnN0YW5jZShjdHgsIGFDbGFzcykpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UganVzdCBpZ25vcmUgdGhpcyBwcm9ibGVtPwotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IGluc3RhbnRpYXRlZCB0aGUgY2xhc3M6ICIgKyBhQ2xhc3MpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Um9sZXMoUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGhhbmRsZXJSb2xlcyA9IGdldEhhbmRsZXJSb2xlcyhwb3J0SW5mbyk7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyUm9sZXM7Ci0gICAgfQotICAgIC8qCi0gICAgICAqIFRoZSBsaXN0IG9mIGhhbmRsZXJzIChyYXRoZXIsIGxpc3Qgb2YgY2xhc3MgbmFtZXMpIGlzIGFscmVhZHkKLSAgICAgICogYXZhaWxhYmxlIHBlciBwb3J0LiAgUG9ydHMgYXJlIHN0b3JlZCB1bmRlciB0aGUgU2VydmljZURlbGVnYXRlCi0gICAgICAqIGFzIFBvcnREYXRhIG9iamVjdHMuCi0gICAgICAqCi0JICogVGhlIHJlc29sdmVIYW5kbGVycyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGluc3RhbnRpYXRpbmcgZWFjaCBIYW5kbGVyLAotCSAqIHJ1bm5pbmcgdGhlIGFubm90YXRlZCBQb3N0Q29uc3RydWN0IG1ldGhvZCwgcmVzb2x2aW5nIHRoZSBsaXN0LAotCSAqIGFuZCByZXR1cm5pbmcgaXQuICBXZSBkbyBub3Qgc29ydCBoZXJlLgotICAgICAgKi8KLSAgICAvKioKLSAgICAgKiBSZXNvbHZlIHRoZSBoYW5kbGVycyBhbmQgcm9sZXMgZm9yIHRoZSBnaXZlbiBwb3J0LiAgVGhpcyB3aWxsIHByb2Nlc3MgdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbgotICAgICAqIGluZm9ybWF0aW9uLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBpbiBhIGZpbGUgb24gYSBIYW5kbGVyQ2hhaW4gYW5ub3RhaXRvbiBvciB2aWEgYQotICAgICAqIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBoYW5kbGVyIGNsYXNzZXMgYW5kIHRoZSBTT0FQIHJvbGVzIHBsYXllZCB3aWxsIGJlIHJlc29sdmVkIGFuZAotICAgICAqIHJldHVybmVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwb3J0aW5mbyAgSW5mb3JtYXRpb24gZGVzY3JpYmluZyB0aGUgcG9ydCBmb3Igd2hpY2ggdGhlIGhhbmRsZXJzIGFuZCByb2xlcyBhcmUgdG8gYmUKLSAgICAgKiAgICAgcmVzb2x2ZWQKLSAgICAgKiBAcGFyYW0gaGFuZGxlclJvbGVzICBPVVRQVVQgUEFSQU1FVEVSISAgVGhlIExpc3QgdGhhdCBpcyBwYXNzZWQgaW4gd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlCi0gICAgICogICAgIHJvbGVzIHJlbGV2YW50IHRvIHRoZSBzcGVjZmllZCBwb3J0LgotICAgICAqIEByZXR1cm4gTGlzdCBvZiBoYW5kbGVyIGNsYXNzZXMgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBwb3J0LgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PENsYXNzPiByZXNvbHZlSGFuZGxlcnMoUG9ydEluZm8gcG9ydGluZm8sIExpc3Q8U3RyaW5nPiBoYW5kbGVyUm9sZXMpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgICAgIEEgc2FtcGxlIFhNTCBmaWxlIGZvciB0aGUgaGFuZGxlci1jaGFpbnM6Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIDxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPgotICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICAgICAgPGp3czpwcm90b2NvbC1iaW5kaW5ncz4jI1hNTF9IVFRQPC9qd3M6cHJvdG9jb2wtYmluZGluZ3M+Ci0gICAgICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1uYW1lPk15SGFuZGxlcjwvandzOmhhbmRsZXItbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLk15SGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgICAgIDwvandzOmhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgPC9qd3M6aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICA8andzOmhhbmRsZXItY2hhaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxqd3M6cG9ydC1uYW1lLXBhdHRlcm4+andzOkZvbyo8L2p3czpwb3J0LW5hbWUtcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLW5hbWU+TXlIYW5kbGVyPC9qd3M6aGFuZGxlci1uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuTXlIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqd3M6c29hcC1yb2xlPmh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL015Um9sZTwvandzOnNvYXAtcm9sZT4KLSAgICAgICAgICAgICAgICAgICAgPC9qd3M6aGFuZGxlcj4KLSAgICAgICAgICAgICAgICA8L2p3czpoYW5kbGVyLWNoYWluPgotICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgICAgICAgICAgPGp3czpzZXJ2aWNlLW5hbWUtcGF0dGVybj5qd3M6QmFyPC9qd3M6c2VydmljZS1uYW1lLXBhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1uYW1lPk15SGFuZGxlcjwvandzOmhhbmRsZXItbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLk15SGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+Ci0gICAgICAgICAgICAgICAgICAgIDwvandzOmhhbmRsZXI+Ci0gICAgICAgICAgICAgICAgPC9qd3M6aGFuZGxlci1jaGFpbj4KLSAgICAgICAgICAgIDwvandzOmhhbmRsZXItY2hhaW5zPgotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb3VwbGUgb2YgdGhpbmdzIEknbSBub3Qgc3VyZSBhYm91dC4uLgotICAgICAgICAgICAgMSkgIGlmIHRoZSBwcm90b2NvbC1iaW5kaW5nLCBwb3J0LW5hbWUtcGF0dGVybiwgYW5kIHNlcnZpY2UtbmFtZS1wYXR0ZXJuIGFsbAotICAgICAgICAgICAgICAgIG1hdGNoIHRoZSBQb3J0SW5mbyBvYmplY3QsIGRvZXMgTXlIYW5kbGVyIGdldCBhZGRlZCB0aHJlZSB0aW1lcz8gIFByb2JhYmx5IHdvdWxkIGdldCBhZGRlZCAzIHRpbWVzLgotICAgICAgICAgICAgMikgIEkgYXNzdW1lIHRoZSBhc3RlcmlzayAiKiIgaXMgYSB3aWxkY2FyZC4gIENhbiB0aGUgYXN0ZXJpc2sgb25seSBvY2N1ciBvbiB0aGUgbG9jYWwgcGFydCBvZiB0aGUgcW5hbWU/Ci0gICAgICAgICAgICAzKSAgQ2FuIHRoZXJlIGJlIG1vcmUgdGhhbiBvbmUgc2VydmljZS1uYW1lLXBhdHRlcm4gb3IgcG9ydC1uYW1lLXBhdHRlcm4sIGp1c3QgbGlrZSBmb3IgcHJvdG9jb2wtYmluZGluZ3M/Ci0gICAgICAgICAgICA0KSAgSG93IG1hbnkgcHJvdG9jb2wtYmluZGluZ3MgYXJlIHRoZXJlPyAgIyNYTUxfSFRUUCAjI1NPQVAxMV9IVFRQICMjU09BUDEyX0hUVFAgIyNTT0FQMTFfSFRUUF9NVE9NICMjU09BUDEyX0hUVFBfTVRPTQotICAgICAgICAgICAgICAgIFRoZXkgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMKLSAgICAgICAgICovCi0KLSAgICAgICAgLy8gb3VyIGltcGxlbWVudGF0aW9uIGFscmVhZHkgaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uLAotICAgICAgICAvLyB3aGljaCBpcyB3aGVyZSBvbmUgbWlnaHQgZ2V0IHRoZSBwb3J0aW5mbyBvYmplY3QuICBXZSBzdGlsbCBoYXZlIHRoZSAKLSAgICAgICAgLy8gcGFzc2VkLWluIHZhcmlhYmxlLCBob3dldmVyLCBkdWUgdG8gdGhlIHNwZWMKLQotICAgICAgICBBcnJheUxpc3Q8Q2xhc3M+IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBUT0RPOiBkbyBhIGJldHRlciBqb2IgY2hlY2tpbmcgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG1hdGNoZXMgdXAKLSAgICAgICAgICogd2l0aCB0aGUgUG9ydEluZm8gb2JqZWN0IGJlZm9yZSB3ZSBhZGQgaXQgdG8gdGhlIGNoYWluLgotICAgICAgICAgKi8KLQotICAgICAgICAvLyBUaGUgSGFuZGxlckNoYWluIGFubm90YXRpb24gY2FuIGJlIHNwZWNpZmllZCBvbjoKLSAgICAgICAgLy8gLSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gKHBlciBKU1ItMTgxKSB3aGljaCBpcyBvbiB0aGUgc2VydmljZS1wcm92aWRlciBzaWRlCi0gICAgICAgIC8vIC0gYW4gU0VJIChwZXIgSlNSLTE4MSksIHdoaWNoIGNhbiBiZSBvbiBib3RoIHRoZSBzZXJ2aWNlLXByb3ZpZGVyIGFuZCAKLSAgICAgICAgLy8gICBzZXJ2aWNlLXJlcXVlc3RlciBzaWRlcwotICAgICAgICAvLyAtIGEgZ2VuZXJhdGVkIFNlcnZpY2UgKHBlciBKU1ItMjI0KSwgd2hpY2ggaXMgb24gdGhlIHNlcnZpY2UtcmVxdWVzdGVyIHNpZGUKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgaGVyZSBpcyBhIGJpdCBjb3VudGVyIGludHVpdGl2ZSBpZiB0aGUgSGFuZGxlckNoYWluIGFubm90YXRpb24KLSAgICAgICAgLy8gaXMgcHJlc2VudCBvbiBtb3JlIHRoYW4gb25lIGNsYXNzLiAgCi0gICAgICAgIC8vIC0gRm9yIHRoZSBzZXJ2aWNlLXByb3ZpZGVyLCBKU1ItMTgxIFtwLiAyNSwgU2VjdGlvbiA0LjYuMV0KLSAgICAgICAgLy8gICBzdGF0ZXMgdGhhdCB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbidzIEhhbmRsZXJDaGFpbiB0YWtlcyBpcyB1c2VkIGlmIGl0IGlzIHByZXNlbnQKLSAgICAgICAgLy8gICBvbiBib3RoIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIFNFSS4KLSAgICAgICAgLy8gLSBGb2xsb3dpbmcgdGhhdCBzYW1lIHBhdHRlcm4sIHdlIGNvbmNsdWRlIHRoYXQgYSBnZW5lcmF0ZWQgc2VydmljZSBIYW5kbGVyQ2hhaW4gc2hvdWxkCi0gICAgICAgIC8vICAgdGFrZSBwcmVjZWRlbmNlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG9uIGJvdGggdGhlIFNlcnZpY2UgYW5kIHRoZSBTRUkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSByZWFzb25pbmcgZm9yIHRoaXMgaXMgKHByb2JhYmx5KSB0aGF0IHRoZSBTRUkgY2FuIGJlIHVzZWQgYnkgbXVsdGlwbGUgZW5kcG9pbnRzIAotICAgICAgICAvLyBhbmQgLyBvciBtdWx0aXBsZSBTZXJ2aWNlIHJlcXVlc3RlcnMsIHNvIHRoZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIFNlcnZpY2UKLSAgICAgICAgLy8gc2hvdWxkIGhhdmUgdGhlIGZpbmFsIHNheSBpbiB3aGF0IGhhbmRsZXJzIGFyZSBydW4sIHJhdGhlciB0aGFuIHRoZSBTRUkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFkZGluZyBEZXBsb3ltZW50IERlc2NyaXB0b3JzIGNvbXBsaWNhdGVzIHRoaXMgZnVydGhlci4gIEEgREQgc2hvdWxkIGhhdmUgdGhlIGFic29sdXRlIAotICAgICAgICAvLyBmaW5hbCBzYXkgKHN1Y2ggYXMgYSBKU1ItMTA5IGNsaWVudCBERCkuICBHaXZlbiB0aGF0LCBvbiBhIHNlcnZpY2UtcmVxdWVzdGVyIGlmIHRoZQotICAgICAgICAvLyBTZXJ2aWNlIGhhcyBhIEhhbmRsZXJDaGFpbiBhbmQgdGhlIFNFSSBoYXMgYSBIYW5kbGVyQ2hhaW4gYW5kIHRoZSBERCBzcGVjaWZpZXMgYSAKLSAgICAgICAgLy8gSGFuZGxlckNoYWluIGZvciBhIHBvcnQsIHRoZW4gdGhlIEREIHNob3VsZCB3aW4uICBTaW5jZSBERHMgYXJlIGltcGxlbnRlZCBhcyBpbmZvcm1hdGlvbgotICAgICAgICAvLyBpbiBhIHNwYXJzZSBjb21wb3NpdGUsIHRoZW4gdGhhdCBtZWFucyB0aGUgc3BhcnNlIGNvbXBvc2l0ZSB3aW5zLgotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBIYW5kbGVyQ2hhaW5zIHNwZWNpZmllZCBvbiB0aGUgRW5kcG9pbnQgKHNlcnZpY2UtcHJvdmlkZXIpIG9yIG9uIHRoZSBTZXJ2aWNlCi0gICAgICAgIC8vIChzZXJ2aWNlLXJlcXVlc3RlcikuCi0gICAgICAgIGhhbmRsZXJDaGFpbnNUeXBlID0gc2VydmljZURlc2MuZ2V0SGFuZGxlckNoYWluKHNlcnZpY2VEZWxlZ2F0ZUtleSk7ICAKLQotICAgICAgICAvLyBIYW5kbGVyQ2hhaW5zIGFwcGx5IHRvIHNwZWNpZmljIFBvcnQgQ29tcG9tZW50cyAoc2VydmljZS1wcm92aWRlcikgb3IgUG9ydHMgKAotICAgICAgICAvLyAoc2VydmljZS1yZXF1ZXN0ZXJzKSBzbyBmaW5kIHRoZSBhcHByb3ByaWF0ZSBvbmUuCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBudWxsOwotICAgICAgICBpZihwb3J0aW5mbyAhPW51bGwpewotICAgICAgICAgICAgIGVkID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0aW5mby5nZXRQb3J0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBIYW5kbGVyQ2hhaW4gaW5mb3JtYXRpb24sIGlmIGFueSwgb2ZmIHRoZSBTRUkgKHNlcnZpY2UtcHJvdmlkZXIgb3IgCi0gICAgICAgIC8vIHNlcnZpY2UtcmVxdXN0ZXIpIGFuZCBjaGVjayBmb3IgYW55IEREIG92ZXJyaWRlcy4KLSAgICAgICAgaWYgKGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBubyBoYW5kbGVyIGNoYWlucyBpbmZvcm1hdGlvbiBzcGVjaWZlZCBvbiB0aGUgZW5kcG9pbnQgKHNlcnZpY2UtCi0gICAgICAgICAgICAvLyBwcm92aWRlcikgb3IgdGhlIFNlcnZpY2UgKHNlcnZpY2UtcmVxdWVzdGVyKQotICAgICAgICAgICAgLy8gLS0gT1IgLS0gCi0gICAgICAgICAgICAvLyBJZiB0aGUgaGFuZGxlciBjaGFpbnMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBpbnN0YW5jZSBvZiBhIHNlcnZpY2UgZGVsZWdhdGUKLSAgICAgICAgICAgIC8vIERPRVMgTk9UIG1hdGNoIHRoZSBoYW5kbGVyIGNoYWlucyBhY3Jvc3MgYWxsIHNlcnZpY2UgZGVsZWdhdGVzLCB0aGVuIHRoZXJlIHdhcwotICAgICAgICAgICAgLy8gc3BhcnNlIGNvbXBvc2l0ZSBpbmZvcm1hdGlvbiBzcGVjaWZpZWQgZm9yIHRoaXMgc2VydmljZSBkZWxlZ2F0ZS4gIFNwYXJzZSBjb21wb3NpdGUKLSAgICAgICAgICAgIC8vIGluZm9ybWF0aW9uIGlzIGhvdyBEZXBsb3ltZW50IERlc2NyaXB0b3IgaW5mb3JtYXRpb24gaXMgc3BlY2lmaWVkLCBhbmQgdGhhdCAKLSAgICAgICAgICAgIC8vIG92ZXJyaWRlcyB0aGUgYW5ub3RhdGlvbnMgYXMgZGVzY3JpYmVkIGluIHRoZSBsb25nLXdpbmRlZCBjb21tZW50IGFib3ZlLgotICAgICAgICAgICAgLy8gLS0gVEhFTiAtLQotICAgICAgICAgICAgLy8gVXNlIHRoaXMgaGFuZGxlciBjaGFpbnMgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIGhjdF9pbmNsdWRpbmdDb21wb3NpdGUgPSBlZC5nZXRIYW5kbGVyQ2hhaW4oc2VydmljZURlbGVnYXRlS2V5KTsKLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIGhjdF9ub0NvbXBvc2l0ZSA9IGVkLmdldEhhbmRsZXJDaGFpbigpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbnNUeXBlID09IG51bGwgfHwgKGhjdF9pbmNsdWRpbmdDb21wb3NpdGUgIT0gaGN0X25vQ29tcG9zaXRlKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNUeXBlID0gaGN0X2luY2x1ZGluZ0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBFbmRwb2ludERlc2NyaXB0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgcG9ydEluZm8gc3BlY2lmaWVkIHNvIAotICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBlbXB0eSBsaXN0IG9mIGhhbmRsZXJzIHNpbmNlIHRoZXJlIGFyZSBubyBwb3J0cyB0aGF0IG1hdGNoCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBQb3J0SW5mbyBvYmplY3QgZGlkIG5vdCBtYXRjaCBhbnkgcG9ydHM7IHJldHVybmluZyBhbiBlbXB0eSBsaXN0IG9mIGhhbmRsZXJzLiIgCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgIFBvcnRJbmZvIFFOYW1lOiAiICsgcG9ydGluZm8uZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBpdCA9IGhhbmRsZXJDaGFpbnNUeXBlID09IG51bGwgPyBudWxsIDogaGFuZGxlckNoYWluc1R5cGUuZ2V0SGFuZGxlckNoYWluKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoKGl0ICE9IG51bGwpICYmIChpdC5oYXNOZXh0KCkpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5UeXBlIGhhbmRsZXJDaGFpblR5cGUgPSAoKEhhbmRsZXJDaGFpblR5cGUpaXQubmV4dCgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gaWYgIW1hdGNoLCBjb250aW51ZSAodG8gbmV4dCBjaGFpbikKLSAgICAgICAgICAgIGlmICghKGNoYWluUmVzb2x2ZXNUb1BvcnQoaGFuZGxlckNoYWluVHlwZSwgcG9ydGluZm8pKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdDxIYW5kbGVyVHlwZT4gaGFuZGxlclR5cGVMaXN0ID0gaGFuZGxlckNoYWluVHlwZS5nZXRIYW5kbGVyKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBodCA9IGhhbmRsZXJUeXBlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGh0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEhhbmRsZXJUeXBlIGhhbmRsZXJUeXBlID0gKEhhbmRsZXJUeXBlKSBodC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBtdXN0IGRvIGJldHRlciBqb2IgY29tcGFyaW5nIHRoZSBoYW5kbGVyVHlwZSB3aXRoIHRoZSBQb3J0SW5mbyBwYXJhbQotICAgICAgICAgICAgICAgIC8vIHRvIHNlZSBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBoYW5kbGVyIGlzIGludGVuZGVkIGZvciB0aGlzIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgLy8gVE9ETyByZXZpZXc6IG5lZWQgdG8gY2hlY2sgZm9yIG51bGwgZ2V0SGFuZGxlckNsYXNzKCkgcmV0dXJuPwotICAgICAgICAgICAgICAgIC8vIG9yIHdpbGwgc2NoZW1hIG5vdCBhbGxvdyBpdD8KLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydEhhbmRsZXIgPSBoYW5kbGVyVHlwZS5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIENsYXNzIGFDbGFzczsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBhQ2xhc3MgPSBsb2FkQ2xhc3MocG9ydEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBqdXN0IGlnbm9yZSB0aGlzIHByb2JsZW0/Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gOS4yLjEuMiBzb3J0IHRoZW0gYnkgTG9naWNhbCwgdGhlbiBTT0FQCi0gICAgICAgICAgICAgICAgaWYgKExvZ2ljYWxIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYUNsYXNzKSkKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGFDbGFzcyk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoU09BUEhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhQ2xhc3MpKQotICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZW9mIFByb3RvY29sSGFuZGxlcgotICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoYUNsYXNzKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYUNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbkVycjEiLCBhQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5FcnIyIiwgYUNsYXNzLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiBhIHJvbGUgd2FzIHNwZWNpZmllZCwgYWRkIGl0IHRvIHRoZSByb2xlcyBwbGF5ZWQKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJvbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4gc29hcFJvbGVzTGlzdCA9IAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclR5cGUuZ2V0U29hcFJvbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IAotICAgICAgICAgICAgICAgICAgICAgICAgc29hcFJvbGVzSXRlcmF0b3IgPSBzb2FwUm9sZXNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzb2FwUm9sZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHNvYXBSb2xlRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcFJvbGVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZFNvYXBSb2xlID0gc29hcFJvbGVFbGVtZW50LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUm9sZXMuYWRkKGFkZFNvYXBSb2xlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIHNvYXAgcm9sZSAiICsgYWRkU29hcFJvbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzOwotICAgIH0KLQotICAgIHByaXZhdGUgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIgY3JlYXRlSGFuZGxlcmxpZmVjeWNsZU1hbmFnZXIoKSB7Ci0gICAgICAgIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSBlbG1mID0gKEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkKLSAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICByZXR1cm4gZWxtZi5jcmVhdGVIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTEzMzBhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLS8qDQotICogVXRpbGl0eSBjbGFzcyB0byBwZXJmb3JtIHN0YXRpYyB1dGlsaXR5IHR5cGUgb2Ygb3BlcmF0aW9ucyBvbiBIYW5kbGVycy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclV0aWxzIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhhbmRsZXJVdGlscy5jbGFzcyk7DQotDQotICAgIC8qKg0KLSAgICAgKiByZWdpc3RlckhhbmRsZXJIZWFkZXJzIHdpbGwgaW52b2tlIGdldEhlYWRlcnMgb24gU09BUEhhbmRsZXJzIGFuZCByZXR1cm4gYSBMaXN0IG9mIGhlYWRlcnMNCi0gICAgICogdGhhdCBhcmUgVW5kZXJzdG9vZCBieSB0aGUgaGFuZGxlcnMuDQotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0DQotICAgICAqIEBwYXJhbSBoYW5kbGVycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFFOYW1lPiByZWdpc3RlclNPQVBIYW5kbGVySGVhZGVycyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzKXsNCi0gICAgCUxpc3Q8UU5hbWU+IHVuZGVyc3Rvb2QgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgaWYobXNnQ29udGV4dCA9PSBudWxsKXsNCi0gICAgICAgICAgICByZXR1cm4gdW5kZXJzdG9vZDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZvcihIYW5kbGVyIGhhbmRsZXI6aGFuZGxlcnMpew0KLSAgICAgICAgICAgIGlmKGhhbmRsZXIgaW5zdGFuY2VvZiBTT0FQSGFuZGxlcil7DQotICAgICAgICAgICAgICAgIFNPQVBIYW5kbGVyIHNvYXBIYW5kbGVyID0gKFNPQVBIYW5kbGVyKWhhbmRsZXI7DQotICAgICAgICAgICAgICAgIC8vSW52b2tpbmcgZ2V0SGVhZGVycy4NCi0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBnZXRIZWFkZXIoKSBvbiBTT0FQSGFuZGxlciIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIFNldDxRTmFtZT4gaGVhZGVycyA9IHNvYXBIYW5kbGVyLmdldEhlYWRlcnMoKTsNCi0gICAgICAgICAgICAgICAgaWYoaGVhZGVycyE9bnVsbCl7DQotICAgICAgICAgICAgICAgICAgICBmb3IoUU5hbWUgaGVhZGVyOmhlYWRlcnMpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF1bmRlcnN0b29kLmNvbnRhaW5zKGhlYWRlcikpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBIZWFkZXIgUU5hbWUiICsgaGVhZGVyICsgIiB0byB1ZGVyc3Rvb2RIZWFkZXJRTmFtZSBMaXN0Iik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9BZGRpbmcgdGhpcyB0byB1bmRlcnN0b29kIGhlYWRlciBsaXN0Lg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kLmFkZChoZWFkZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB1bmRlcnN0b29kOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBjaGVja011c3RVbmRlcnN0YW5kIHdpbGwgdmFsaWRhdGUgaGVhZGVycyB0aGF0IHdoZXJlIGRlbGVnYXRlZCBieSBBeGlzIEVuZ2luZQ0KLSAgICAgKiB0byBNZXNzYWdlUmVjZWl2ZXIgZm9yIG11c3RVbmRlcnN0YW5kIGNoZWNrLg0KLSAgICAgKiANCi0gICAgICogTm90ZSB0aGF0IHRoZXJlIGlzIG90aGVyIEpBWC1XUyByZWxhdGVkIG11c3RVbmRlcnN0YW5kIGNoZWNraW5nIG9jY3VyaW5nIGVsc2V3aGVyZToNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIgDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZENoZWNrZXIgDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCBDb250YWlucyB0aGUgU09BUEVudmVsb3BlIGFuZCBvcHRpb25hbGx5IGEgbGlzdCBvZiBoZWFkZXJzIG5vdCANCi0gICAgICogICAgdW5kZXJzdG9vZCBieSB0aGUgQXhpc0VuZ2luZQ0KLSAgICAgKiBAcGFyYW0gdW5kZXJzdG9vZCBBIGxpc3Qgb2YgaGVhZGVyIFFOYW1lcyB1bmRlcnN0b29kIGJ5IEpBWC1XUywgZm9yIGV4YW1wbGUgdGhvc2UgdW5kZXJzdG9vZA0KLSAgICAgKiAgIGJ5IGFzc29jaWF0ZWQgYXBwbGljYXRpb24gaGFuZGxlcnMuIENhbiBiZSBudWxsLg0KLSAgICAgKiBAcGFyYW0gYWRkaXRpb25hbFJvbGVzIEFuIGluc3RhbmNlIG9mIFJvbGVQbGF5ZXIgZm9yIGFueSBhZGR0aW9uYWwgcm9sZXMgcGxheWVkIGJ5IEpBWC1XUw0KLSAgICAgKiAgIGZvciBleGFtcGxlLCByb2xlcyBjb25maWd1cmVkIGZvciBhc3NvY2lhdGVkIGhhbmRsZXJzLiAgQ2FuIGJlIG51bGwuDQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhbnkgaGVhZGVycyBtYXJrZWQgbXVzdFVuZGVyc2FuZCBhcmUgbm90IHVuZGVyc3Rvb2QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tNdXN0VW5kZXJzdGFuZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBMaXN0PFFOYW1lPiB1bmRlcnN0b29kLCBMaXN0PFN0cmluZz4gYWRkaXRpb25hbFJvbGVzKSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIGlmIChtc2dDb250ZXh0ID09IG51bGwgfHwgIW1zZ0NvbnRleHQuaXNIZWFkZXJQcmVzZW50KCkpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7DQotICAgICAgICBpZiAoZW52ZWxvcGUuZ2V0SGVhZGVyKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBVbnByb2Nlc3NlZEhlYWRlck5hbWVzIGZyb20gTWVzc2FnZSBDb250ZXh0IHByb3BlcnRpZXMiKTsNCi0gICAgICAgIH0NCi0gDQotICAgICAgICBMaXN0PFFOYW1lPiB1bnByb2Nlc3NlZCA9IChMaXN0KW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLlVOUFJPQ0VTU0VEX0hFQURFUl9RTkFNRVMpOw0KLQ0KLSAgICAgICAgLy8gQWRkIHRvIHRoZSB1bnByb2Nlc3NlZCBoZWFkZXIgbGlzdCBhbnkgaGVhZGVycyB0aGF0IGFyZSB1bnByb2Nzc2VkIGFuZCBtdXN0VW5kZXJzdGFuZA0KLSAgICAgICAgLy8gZm9yIGFkZHRpb25hbCByb2xlcywgZm9yIGV4YW1wbGUgdGhvc2UgcGxheWVkIGJ5IGFzc29jaWF0ZWQgSkFYV1MgaGFuZGxlcnMNCi0gICAgICAgIGlmIChhZGRpdGlvbmFsUm9sZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBhbnkgbXVzdFVuZGVyc3RhbmQgaGVhZGVycyBiYXNlZCBvbiBhZGRpdG9uYWwgU09BUCByb2xlczogIiArIGFkZGl0aW9uYWxSb2xlcyk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEhhbmRsZXJSb2xlUGxheWVyIGhhbmRsZXJSb2xlUGxheWVyID0gbmV3IEhhbmRsZXJSb2xlUGxheWVyKGFkZGl0aW9uYWxSb2xlcyk7DQotICAgICAgICAgICAgSXRlcmF0b3IgaGVhZGVyQmxvY2tzID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCkuZ2V0SGVhZGVyc1RvUHJvY2VzcyhoYW5kbGVyUm9sZVBsYXllcik7DQotICAgICAgICAgICAgd2hpbGUgKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNoYiA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGlmICh1bnByb2Nlc3NlZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB1bnByb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgaWYgKCFzaGIuaXNQcm9jZXNzZWQoKSAmJiBzaGIuZ2V0TXVzdFVuZGVyc3RhbmQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgdW5wcm9jZXNzZWQuYWRkKHNoYi5nZXRRTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkZWQgaGVhZGVyIHRvIHVucHJvY2Vzc2VkIGxpc3Q6ICIgKyBzaGIuZ2V0UU5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmKHVucHJvY2Vzc2VkID09IG51bGwgfHwgdW5wcm9jZXNzZWQuc2l6ZSgpID09IDApew0KLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVTlBST0NFU1NFRF9IRUFERVJfUU5BTUVTIG5vdCBmb3VuZC4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvL2xldHMgZ28gdGhydSBlYWNoIGhlYWRlciBvbmx5IGlmIEBIYW5kbGVyQ2hhaW4gaXMgcHJlc2VudA0KLSAgICAgICAgaWYoIWNhblVuZGVyc3RhbmQobXNnQ29udGV4dCkpew0KLSAgICAgICAgICAgIFFOYW1lW10gcU5hbWVzID0gdW5wcm9jZXNzZWQudG9BcnJheShuZXcgUU5hbWVbMF0pOw0KLSAgICAgICAgICAgIFN0cmluZ1tdIGhlYWRlck5hbWVzID0gbmV3IFN0cmluZ1txTmFtZXMubGVuZ3RoXTsNCi0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxxTmFtZXMubGVuZ3RoOyBpKyspew0KLSAgICAgICAgICAgICAgICBoZWFkZXJOYW1lc1tpXSA9InsiICsgcU5hbWVzW2ldLmdldE5hbWVzcGFjZVVSSSgpKyAifSIgKyBxTmFtZXNbaV0uZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIFFOYW1lIGZhdWx0UU5hbWUgPSBlbnZlbG9wZS5nZXRWZXJzaW9uKCkuZ2V0TXVzdFVuZGVyc3RhbmRGYXVsdENvZGUoKTsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm11c3R1bmRlcnN0YW5kZmFpbGVkMiIsIGhlYWRlck5hbWVzKSwgZmF1bHRRTmFtZSk7IA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgY2hlY2tVbnByb2Nlc3NlZChlbnZlbG9wZSwgdW5wcm9jZXNzZWQsIHVuZGVyc3Rvb2QsIG1zZ0NvbnRleHQpOw0KLSAgICAgICAgLy9yZXNldHRpbmcgdGhlIEZBVUxUWV9IRUFERVJfUU5BTUUgdG8gbnVsbC4NCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLlVOUFJPQ0VTU0VEX0hFQURFUl9RTkFNRVMsIG51bGwpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tVbnByb2Nlc3NlZChTT0FQRW52ZWxvcGUgZW52ZWxvcGUsIExpc3Q8UU5hbWU+IHVucHJvY2Vzc2VkLCBMaXN0PFFOYW1lPiB1bmRlcnN0b29kLCBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0ew0KLSAgICAgICAgZm9yIChRTmFtZSBoZWFkZXJRTmFtZSA6IHVucHJvY2Vzc2VkKSB7ICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAodW5kZXJzdG9vZCAhPSBudWxsICYmICF1bmRlcnN0b29kLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICBpZiAodW5kZXJzdG9vZC5jb250YWlucyhoZWFkZXJRTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNdXN0VW5kZXJzdGFuZCBoZWFkZXIgcmVnaXN0ZXJlZCBhcyB1bmRlcnN0b29kIG9uIEF4aXNPcGVyYXRpb246ICIgKyBoZWFkZXJRTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICB9ICAgIA0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNdXN0VW5kZXJzdGFuZCBoZWFkZXIgbm90IHByb2Nlc3NlZCBvciByZWdpc3RlcmVkIGFzIHVuZGVyc3Rvb2QgIiArIGhlYWRlclFOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gVGhyb3cgYSBNdXN0VW5kZXJzdGFuZCBmYXVsdCBmb3IgdGhlIGN1cnJlbnQgU09BUCB2ZXJzaW9uDQotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGVudmVsb3BlLmdldE5hbWVzcGFjZSgpLmdldFByZWZpeCgpOw0KLSAgICAgICAgICAgIGlmICghbXNnQ29udGV4dC5pc1NPQVAxMSgpKSB7DQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCAiIi5lcXVhbHMocHJlZml4KSkgew0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gU09BUENvbnN0YW50cy5TT0FQX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYmUgdXNpbmcgYSBwcmVmaXggb24gdGhlIGZhdWx0Y29kZT8gIFdoYXQgYWJvdXQNCi0gICAgICAgICAgICAgICAgLy8gdGhlIFFOYW1lIG9iamVjdCBDb25zdGFudHMuRkFVTFRfU09BUDEyX01VU1RVTkRFUlNUQU5EPw0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm11c3R1bmRlcnN0YW5kZmFpbGVkIiwNCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCwNCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlclFOYW1lLnRvU3RyaW5nKCkpLA0KLSAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLkZBVUxUX0NPREVfTVVTVF9VTkRFUlNUQU5EKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgYmUgdXNpbmcgYSBwcmVmaXggb24gdGhlIGZhdWx0Y29kZT8gIFdoYXQgYWJvdXQNCi0gICAgICAgICAgICAgICAgLy8gdGhlIFFOYW1lIG9iamVjdCBDb25zdGFudHMuRkFVTFRfTVVTVFVOREVSU1RBTkQ/DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibXVzdHVuZGVyc3RhbmRmYWlsZWQiLA0KLSAgICAgICAgICAgICAgICAgICAgcHJlZml4LA0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyUU5hbWUudG9TdHJpbmcoKSksDQotICAgICAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuRkFVTFRfQ09ERV9NVVNUX1VOREVSU1RBTkQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhblVuZGVyc3RhbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCl7DQotICAgICAgICAvL0pBWFdTTWVzc2FnZVJlY2VpdmVyIHdpbGwgb25seSBjb21taXQgdG8gaGFuZGxpbmcgbXVzdCB1bmRlcnN0YW5kIGlmIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBpcyBwcmVzZW50IG9uIHRoZQ0KLSAgICAgICAgLy9FbmRwb2ludC4gVGhpcyB3aWxsIGluZGljYXRlIHRvIEF4aXNFbmdpbmUgdGhhdCBGYXVsdHkgSGVhZGVyIG5hbWVzIGFyZSB1bmRlcnN0b29kIGhvd2V2ZXIgdGhlIG11c3RVbmRlcnN0YW5kIA0KLSAgICAgICAgLy9DaGVjayB3aWxsIGJlIHBlcmZvcm1lZCBpbiBIYW5kbGVyVXRpbHMgY2xhc3MgYWZ0ZXIgSGFuZGxlcnMgYXJlIGluamVjdGVkIGluIGFwcGxpY2F0aW9uLg0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YyA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIGlmIChheGlzU3ZjLmdldFBhcmFtZXRlcihFbmRwb2ludERlc2NyaXB0aW9uLkFYSVNfU0VSVklDRV9QQVJBTUVURVIpICE9IG51bGwpIHsNCi0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzU3ZjLmdldFBhcmFtZXRlcihFbmRwb2ludERlc2NyaXB0aW9uLkFYSVNfU0VSVklDRV9QQVJBTUVURVIpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSAoRW5kcG9pbnREZXNjcmlwdGlvbilwYXJhbS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgIC8vTGV0cyBjaGVjayBpZiB0aGVyZSBpcyBhIEhhbmRsZXIgaW1wbGVtZW50YXRpb24gcHJlc2VudCB1c2luZyBNZXRhZGF0YSBsYXllci4NCi0gICAgICAgICAgICAvL0hhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGNhbiBiZSBwcmVzZW50IGluIFNlcnZpY2UgRW5kcG9pbnQgb3IgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLg0KLSAgICAgICAgICAgIC8vIGVkLmdldEhhbmRsZXJDaGFpbigpIGxvb2tzIGZvciBIYW5kbGVyQW5ub3RhdGlvbiBhdCBib3RoIEVuZHBvaW50IGFuZCBhdCBTRUkuDQotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNrIHRvIHNlZSBpZiBhIGpheHdzIGhhbmRsZXIgaXMgY29uZmlndXJlZC4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYoZWQuZ2V0SGFuZGxlckNoYWluKCkhPW51bGwpew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZXsNCi0gICAgICAgICAgICAvL0lmIHdlIGNhbm5vdCBnZXQgdG8gU2VydmljZURlc2NyaXB0aW9uIHRvIGNoZWNrIGZvciBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiB3ZSB3aWxsIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotfQ0KLWNsYXNzIEhhbmRsZXJSb2xlUGxheWVyIGltcGxlbWVudHMgUm9sZVBsYXllciB7DQotICAgIExpc3Q8U3RyaW5nPiByb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLQ0KLSAgICBIYW5kbGVyUm9sZVBsYXllcihMaXN0PFN0cmluZz4gYWRkaXRpb25hbFJvbGVzKSB7DQotICAgICAgICByb2xlcy5hZGRBbGwoYWRkaXRpb25hbFJvbGVzKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsNCi0gICAgICAgIHJldHVybiByb2xlczsNCi0gICAgfQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUNvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvTG9naWNhbE1lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYWI2YzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlOwotCi0vKioKLSAqIFRoZSBMb2dpY2FsTWVzc2FnZUNvbnRleHQgaXMgYSBKQVgtV1MgaW50ZXJmYWNlIHRoYXQgaXMgZ2l2ZW4gdG8gTG9naWNhbCBoYW5kbGVycyB0byBwcm92aWRlCi0gKiBhY2Nlc3MgdG8gdGhlIG1lc3NhZ2UgYW5kIGl0cyBhc3NvY2lhdGVkIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpY2FsTWVzc2FnZUNvbnRleHQgZXh0ZW5kcyBCYXNlTWVzc2FnZUNvbnRleHQgaW1wbGVtZW50cwotICAgICAgICBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQgewotCi0gICAgcHVibGljIExvZ2ljYWxNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2VDdHgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0I2dldE1lc3NhZ2UoKQotICAgICAqLwotICAgIHB1YmxpYyBMb2dpY2FsTWVzc2FnZSBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbmV3IExvZ2ljYWxNZXNzYWdlSW1wbChtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Mb2dpY2FsTWVzc2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlODY4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0xvZ2ljYWxNZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgTG9naWNhbE1lc3NhZ2VJbXBsIGltcGxlbWVudHMgTG9naWNhbE1lc3NhZ2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExvZ2ljYWxNZXNzYWdlSW1wbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIE1FUENvbnRleHQgbWVwQ3R4OwotCi0gICAgcHJvdGVjdGVkIExvZ2ljYWxNZXNzYWdlSW1wbChNRVBDb250ZXh0IG0pIHsKLSAgICAgICAgbWVwQ3R4ID0gbTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuTG9naWNhbE1lc3NhZ2UjZ2V0UGF5bG9hZCgpCi0gICAgICovCi0gICAgcHVibGljIFNvdXJjZSBnZXRQYXlsb2FkKCkgewotICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIFNvdXJjZSBwYXlsb2FkID0gKFNvdXJjZSkgX2dldFBheWxvYWQobnVsbCwgZmFjdG9yeSk7Ci0gICAgICAgIHJldHVybiBwYXlsb2FkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlI2dldFBheWxvYWQoamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQYXlsb2FkKEpBWEJDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJldHJlaXZpbmcgdGhlIG1lc3NhZ2UgcGF5bG9hZCBhcyBhIFNvdXJjZSBvYmplY3QiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkgPSAoSkFYQkJsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgamJjID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoY29udGV4dCk7Ci0gICAgICAgIE9iamVjdCBwYXlsb2FkID0gX2dldFBheWxvYWQoamJjLCBmYWN0b3J5KTsKLSAgICAgICAgcmV0dXJuIHBheWxvYWQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT2JqZWN0IF9nZXRQYXlsb2FkKE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBPYmplY3QgcGF5bG9hZCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IG1lcEN0eC5nZXRNZXNzYWdlT2JqZWN0KCkuZ2V0Qm9keUJsb2NrKGNvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkEgbWVzc2FnZSBwYXlsb2FkIHdhcyBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIE9iamVjdCBjb250ZW50ID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIC8vIEZvciBub3csIHdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IEJsb2NrIGZyb20gdGhlIG9yaWdpbmFsIGNvbnRlbnQKLSAgICAgICAgICAgICAgIC8vIGFuZCBzZXQgdGhhdCBiYWNrIG9uIHRoZSBtZXNzYWdlLiAgVGhlIEJsb2NrIGlzIG5vdCBjdXJyZW50bHkKLSAgICAgICAgICAgICAgIC8vIGFibGUgdG8gY3JlYXRlIGEgY29weSBvZiBpdHNlbGYganVzdCB5ZXQuCi0gICAgICAgICAgICAgICBQYXlsb2FkcyBwYXlsb2FkcyA9IGNyZWF0ZVBheWxvYWRzKGNvbnRlbnQpOwotICAgICAgICAgICAgICAgX3NldFBheWxvYWQocGF5bG9hZHMuQ0FDSEVfUEFZTE9BRCwgY29udGV4dCwgZmFjdG9yeSk7Ci0gIAotICAgICAgICAgICAgICAgcGF5bG9hZCA9IHBheWxvYWRzLkhBTkRMRVJfUEFZTE9BRDsgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYmxvY2sgd2FzIG51bGwsIHRoZW4gbGV0J3MgcmV0dXJuIGFuIGVtcHR5Ci0gICAgICAgICAgICAgICAgLy8gU291cmNlIG9iamVjdCByYXRoZXIgdGhhbiBhIG51bGwuCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlcmUgd2FzIG5vIHBheWxvYWQgdG8gYmUgZm91bmQuICBSZXR1cm5pbmcgYW4gZW1wdHkgU291cmNlIG9iamVjdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVswXTsKLSAgICAgICAgICAgICAgICBwYXlsb2FkID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsKLSAgICAgICAgICAgfQotICAgCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcGF5bG9hZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZSNzZXRQYXlsb2FkKGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoT2JqZWN0IG9iaiwgSkFYQkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IChKQVhCQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBqYmMgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgX3NldFBheWxvYWQob2JqLCBqYmMsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlI3NldFBheWxvYWQoamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZChTb3VyY2Ugc291cmNlKSB7Ci0gICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5ID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgX3NldFBheWxvYWQoc291cmNlLCBudWxsLCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIF9zZXRQYXlsb2FkKE9iamVjdCBvYmplY3QsIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShvYmplY3QsIGNvbnRleHQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgaWYgKG1lcEN0eC5nZXRNZXNzYWdlT2JqZWN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFtZXBDdHguZ2V0TWVzc2FnZU9iamVjdCgpLmlzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIG1lcEN0eC5nZXRNZXNzYWdlT2JqZWN0KCkuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBwYXlsb2FkIGNvbnRhaW5zIGEgZmF1bHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbWVwQ3R4LmdldE1lc3NhZ2VPYmplY3QoKS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXlsb2FkIGlzIGEgZmF1bHQsIHRoZW4gd2UgY2FuJ3Qgc2V0IGl0IGJhY2sgb24gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAvLyBhcyBhIGJsb2NrLiAgQmxvY2tzIGFyZSBPTVNvdXJjZWRFbGVtZW50cywgYW5kIGZhdWx0cyBjYW5ub3QgYmUgT01Tb3VyY2VkRWxlbWVudHMuICAKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gKFNPQVBFbnZlbG9wZSkgbWVwQ3R4LmdldE1lc3NhZ2VPYmplY3QoKS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IGVudi50b1N0cmluZ1dpdGhDb25zdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoY29udGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBzdHJlYW0gPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtZi5jcmVhdGVGcm9tKHN0cmVhbSwgbWVwQ3R4LmdldE1lc3NhZ2VPYmplY3QoKS5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHNlcmlhbGl6YXRpb24gb2YgdGhlIE9NIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAgICAgICAgbXNnLmdldEFzT01FbGVtZW50KCkuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG1lcEN0eC5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBheWxvYWRzIGNyZWF0ZVBheWxvYWRzKE9iamVjdCBjb250ZW50KSB7Ci0gICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFBheWxvYWRzIHBheWxvYWRzID0gbmV3IFBheWxvYWRzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjb250ZW50LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEZpcnN0IHdlIGhhdmUgdG8gZ2V0IHRoZSBjb250ZW50IG91dCBvZiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAvLyBTb3VyY2Ugb2JqZWN0IHNvIHdlIGNhbiBidWlsZCB0aGUgY2FjaGUgZnJvbSB0aGVyZS4KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNvdXJjZSBzb3VyY2UgPSAoU291cmNlKSBjb250ZW50OwotICAgICAgICAgICAgICAgIHRyYW5zLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgdHJhbnMuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEdpdmVuIHRoYXQgd2UndmUgY29uc3VtZWQgdGhlIG9yaWdpbmFsIFNvdXJjZSBvYmplY3QsIAotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGFub3RoZXIgb25lIHdpdGggdGhlIG9yaWdpbmFsIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAvLyBhbmQgYXNzaWduIGl0IGJhY2suCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFNvdXJjZSBvYmplY3QgcmV0dXJuZWQgdG8gdGhlIGhhbmRsZXIgc2hvdWxkIGJlIGEKLSAgICAgICAgICAgICAgICAgICAgLy8gRE9NU291cmNlIHNvIHRoYXQgdGhlIGhhbmRsZXIgcHJvZ3JhbW1lciBjYW4gcmVhZCB0aGUgZGF0YQotICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSB0aW1lcyBhbmQgKGFzIG9wcG9zZWQgdG8gdXNpbmcgYSBTdHJlYW1Tb3VyY2UpIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGNhbiBtb3JlIGVhc2lseSBhY2Nlc3MgdGhlIGRhdGEgaW4gRE9NIGZvcm0uCi0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvbSA9IGRiLnBhcnNlKGJhaXMpOwotICAgICAgICAgICAgICAgICAgICBwYXlsb2Fkcy5IQU5ETEVSX1BBWUxPQUQgPSBuZXcgRE9NU291cmNlKGRvbSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBhIGRpZmZlcmVudCBieXRlW10gZm9yIHRoZSBjYWNoZSBzbyB0aGF0IHdlJ3JlIG5vdCBqdXN0Ci0gICAgICAgICAgICAgICAgLy8gYnVpbGRpbmcgdHdvIFNvdXJjZSBvYmplY3RzIHRoYXQgcG9pbnQgdG8gdGhlIHNhbWUgYXJyYXkuCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGNhY2hlQnl0ZXMgPSBuZXcgYnl0ZVtieXRlcy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIGNhY2hlQnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgYnVpbGQgdGhlIFNvdXJlIG9iamVjdCBmb3IgdGhlIGNhY2hlLgotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGNhY2hlQmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjYWNoZUJ5dGVzKTsKLSAgICAgICAgICAgICAgICBwYXlsb2Fkcy5DQUNIRV9QQVlMT0FEID0gbmV3IFN0cmVhbVNvdXJjZShjYWNoZUJhaXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBjYWNoZSBpbXBsZW1lbnRlZCB5ZXQKLSAgICAgICAgICAgIHBheWxvYWRzLkhBTkRMRVJfUEFZTE9BRCA9IGNvbnRlbnQ7Ci0gICAgICAgICAgICBwYXlsb2Fkcy5DQUNIRV9QQVlMT0FEID0gY29udGVudDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwYXlsb2FkczsKLSAgICB9Ci0gICAgICAgICAgICAKLSAgICAvKgotICAgICAqIEEgc2ltcGxlIGhvbGRlciBmb3IgdGhlIGRpZmZlcmVudCBwYXlsb2FkIG9iamVjdHMuCi0gICAgICovCi0gICAgY2xhc3MgUGF5bG9hZHMgewotICAgICAgICBPYmplY3QgSEFORExFUl9QQVlMT0FEOyAgICAvLyBUaGUgcGF5bG9hZCBvYmplY3QgdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBoYW5kbGVyCi0gICAgICAgIE9iamVjdCBDQUNIRV9QQVlMT0FEOyAgICAgIC8vIFRoZSBwYXlsb2FkIG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGNhY2hlCi0gICAgfSAgICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvTUVQQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9NRVBDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzAzYjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9NRVBDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgPHR0Pk1FUENvbnRleHQ8L3R0PiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgTWVzc2FnZUNvbnRleHQKLSAqIHRoYXQgd2lsbCBiZSBnaXZlbiB0byBhcHBsaWNhdGlvbiBoYW5kbGVycyBhcyB0aGUgaGFuZGxlciBsaXN0IAotICogaXMgdHJhdmVyc2VkLiAgSXQgaXMgb25seSB0byBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uIGhhbmRsZXJzLgotICogCi0gKiBUaGUgTUVQQ29udGV4dCBvYmplY3QgaXMgY29uc3RydWN0ZWQgdXNpbmcgYSBub24tbnVsbCByZXF1ZXN0Ci0gKiBjb250ZXh0LiAgT25jZSB0aGUgcmVxdWVzdCBoYXMgYmVlbiBmdWxseSBwcm9jZXNzZWQgaW4gdGhlIEpBWC1XUyBlbmdpbmUsCi0gKiB0aGUgcmVzcG9uc2UgY29udGV4dCBzaG91bGQgYmUgc2V0IG9uIHRoaXMuICBTaW5jZSB0aGUgcmVzcG9uc2UgY29udGV4dAotICogaXMgYWx3YXlzIGxhc3QsIGl0IHRha2VzIHByaW9yaXR5IGluIGFsbCBNRVBDb250ZXh0IG1ldGhvZHMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1FUENvbnRleHQgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCB7Ci0KLSAgICAvLyBJZiB0aGlzIGEgcmVxdWVzdCBmbG93LCB0aGVuIHRoZSBNRVAgY29udGFpbnMgdGhlIHJlcXVlc3QgTUMuCi0gICAgLy8gSWYgdGhpcyBhIHJlc3BvbnNlIGZsb3csIHRoZW4gdGhlIE1FUCBjb250YWlucyBib3RoIHRoZSByZXF1ZXN0IE1DIGFuZCB0aGUgcmVzcG9uc2UgTUMuCi0gICAgLy8gKE5vdGUgdGhhdCBhY2Nlc3MgdG8gdGhlIHJlcXVlc3RNQyBwcm9wZXJ0aWVzIGlzIHNvbWV0aW1lcyBzeW5jaHJvbml6ZWQgaW4gdGhlCi0gICAgLy8gcmVzcG9uc2UgZmxvdy4pCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNQzsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNQzsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFNjb3BlPiBzY29wZXM7ICAvLyBBUFBMSUNBVElPTiBvciBIQU5ETEVSIHNjb3BlIGZvciBwcm9wZXJ0aWVzCi0gICAgCi0gICAgLyoKLSAgICAgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgd2UncmUgYmVpbmcgY2FsbGVkIGZyb20gYSBoYW5kbGVyIG9yIGFuIGFwcGxpY2F0aW9uCi0gICAgICogKGVuZHBvaW50IG9yIGNsaWVudCkuICBVc2VycyBvZiBNRVBDb250ZXh0IHNob3VsZCB1c2UgdGhlICdpcycgYW5kCi0gICAgICogJ3NldCcgYXBwcm9wcmlhdGVseSBmb3IgdGhpcyBmbGFnLiAgVGhlIG1vc3QgbGlrZWx5IHNjZW5hcmlvIGlzIHRvIHNldCB0aGUKLSAgICAgKiBmbGFnIHRvIHRydWUgYWZ0ZXIgdGhlIHNlcnZlci1zaWRlIGluYm91bmQgaGFuZGxlcnMgYXJlIGNvbXBsZXRlLgotICAgICAqIAotICAgICAqIFRPRE8sIGFsbCBtZXRob2RzIHNob3VsZCB1c2UgdGhpcyBmbGFnIHRvIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkID0gZmFsc2U7Ci0KLSAgICAvKgotICAgICAqIElkZWFsbHkgdGhpcyB3b3VsZCBiZSAicHJvdGVjdGVkIiwgYnV0IHdlIHdhbnQgdGhlIGp1bml0IHRlc3RzIHRvIHNlZSBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTUVQQ29udGV4dChNZXNzYWdlQ29udGV4dCByZXF1ZXN0TXNnQ3R4KSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdE1DID0gcmVxdWVzdE1zZ0N0eDsKLSAgICAgICAgc2NvcGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTY29wZT4oKTsKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBNZXNzYWdlQ29udGV4dCBwb2ludHMgYmFjayB0byB0aGlzCi0gICAgICAgIHJlcXVlc3RNc2dDdHguc2V0TUVQQ29udGV4dCh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVuZHBvaW50RGVzY3JpcHRpb24gZ2V0RW5kcG9pbnREZXNjKCkgewotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VNQy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVlc3RNQzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiByZXNwb25zZU1DOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZU1DOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0TUM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNQykgewotICAgICAgICBpZih0aGlzLnJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzcG9uc2VNQy5zZXRQcm9wZXJ0eShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dC5PVVRCT1VORF9NRVNTQUdFX0FUVEFDSE1FTlRTLCAKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZU1DLmdldFByb3BlcnR5KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPIGRvZXMgQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgbWVhbiBhbnl0aGluZyBoZXJlPyAtLSBtZXRob2QgaXMgcHJvdGVjdGVkLCBzbyBwcm9iYWJseSBub3QKLSAgICAgICAgdGhpcy5yZXNwb25zZU1DID0gcmVzcG9uc2VNQzsKLSAgICAgICAgLy8gaWYgY2FsbGVycyBhcmUgYmVpbmcgY2FyZWZ1bCwgdGhlIHJlc3BvbnNlTUMgc2hvdWxkIG5vdCBiZSBzZXQKLSAgICAgICAgLy8gdW50aWwgdGhlIGVuZ2luZSBpcyBkb25lIGludm9raW5nIHRoZSBlbmRwb2ludCwgb24gYm90aCBzZXJ2ZXIgYW5kCi0gICAgICAgIC8vIGNsaWVudCBzaWRlLiAgQXQgdGhhdCBwb2ludCwgd2UgY2FuIHN0YXJ0IGFsbG93aW5nIGNhbGxlcnMgYWNjZXNzCi0gICAgICAgIC8vIHRvIEhBTkRMRVIgc2NvcGVkIHByb3BlcnRpZXMgYWdhaW4uICBTZXQgdGhlIGZsYWc6Ci0gICAgICAgIEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzcG9uc2VNQy5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXF1ZXN0TUMuc2V0TWVzc2FnZShtc2cpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTY29wZSBnZXRTY29wZShTdHJpbmcgcykgewotICAgICAgICBpZiAoc2NvcGVzLmdldChzKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBKQVgtV1MgZGVmYXVsdCA5LjQuMS4gIEhvd2V2ZXIsIHdlIHRyeSB0byBzZXQgdGhlIHNjb3BlIGZvcgotICAgICAgICAgICAgLy8gZXZlcnkgaW5jb21pbmcgcHJvcGVydHkgdG8gSEFORExFUi4gIElmIGEgcHJvcGVydHkgaXMgY29taW5nIGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBheGlzMiBBYnN0cmFjdENvbnRleHQgcHJvcGVydGllcyBiYWcsIHdlIHdhbnQgdGhvc2UgdG8gYmUKLSAgICAgICAgICAgIC8vIEFQUExJQ0FUSU9OIHNjb3BlZC4gIFRob3NlIHByb3BlcnRpZXMgbWF5IGhhdmUgYmVlbiBzZXQgYnkgYW4KLSAgICAgICAgICAgIC8vIGF4aXMgYXBwbGljYXRpb24gaGFuZGxlciwgYW5kIG1heSBuZWVkIHRvIGJlIGFjY2Vzc2libGUgYnkgCi0gICAgICAgICAgICAvLyBhIGNsaWVudCBhcHAgb3IgZW5kcG9pbnQuCi0gICAgICAgICAgICByZXR1cm4gU2NvcGUuQVBQTElDQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjb3Blcy5nZXQocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHMsIFNjb3BlIHNjb3BlKSB7Ci0gICAgICAgIC8vIFRPRE8gcmV2aWV3IG5leHQgdHdvIGxpbmVzCi0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsgIC8vIGVuZHBvaW50cyBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHByb3BlcnR5IHNjb3BlLiAgVGhleSBzaG91bGQgYWxsIGJlIEFQUExJQ0FUSU9OIHNjb3BlZCBhbnl3YXkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzY29wZXMucHV0KHMsIHNjb3BlKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gamF2YS51dGlsLk1hcCBtZXRob2RzCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIC8vIFRPRE8gcmV2aWV3Ci0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsgIC8vIGVuZHBvaW50cyBhcmUgYWxsb3dlZCB0byBjbGVhciBBUFBMSUNBVElPTiBzY29wZWQgcHJvcGVydGllcyBvbmx5Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcFNjb3BlZFByb3BzID0gZ2V0QXBwbGljYXRpb25TY29wZWRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaXQgPSBhcHBTY29wZWRQcm9wcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIHJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgIC8vIFRPRE8gYWxzbyByZW1vdmUgU2NvcGUgc2V0dGluZyBmb3IgImtleSI/ICBIb3c/Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogUkVWSUVXCi0gICAgICAgIC8vIEkgZG9uJ3QgdGhpbmsgdGhpcyB3aWxsIHdvcmsgaWYgdGhlIG1lc3NhZ2UgY29udGV4dHMgaGF2ZSBhIGNvcHkKLSAgICAgICAgLy8gb2YgdGhlIG1hcAotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICByZXF1ZXN0TUMuZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKS5jb250YWluc0tleShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjb250YWluc0tleSA9IHJlc3BvbnNlTUMuY29udGFpbnNLZXkoa2V5KSB8fCByZXF1ZXN0TUMuY29udGFpbnNLZXkoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoKGdldFNjb3BlKChTdHJpbmcpa2V5KSA9PSBTY29wZS5BUFBMSUNBVElPTikgfHwgKCFpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc0tleTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGdldFNjb3BlKChTdHJpbmcpa2V5KSA9PSBTY29wZS5BUFBMSUNBVElPTikgfHwgKCFpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5jb250YWluc0tleShrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QXBwbGljYXRpb25TY29wZWRQcm9wZXJ0aWVzKCkuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBpZiAocmVzcG9uc2VNQy5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNWYWx1ZSh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0TUMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0TUMuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgIC8vIFRPRE8gc2hvdWxkIGNoZWNrIEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkIGZsYWcKLSAgICAgICAgLy8gYW5kIHJldHVybiBvbmx5IEFQUExJQ0FUSU9OIHNjb3BlZCBwcm9wZXJ0aWVzIGlmIHRydWUKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcygpLmVudHJ5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgSGFzaE1hcCB0ZW1wUHJvcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAKLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXRBbGwocmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVtcFByb3BzLnB1dEFsbChyZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXBQcm9wcy5lbnRyeVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXlPYmplY3QpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleU9iamVjdDsKLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlc3BvbnNlTUMuZ2V0UHJvcGVydHkoa2V5KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChnZXRTY29wZSgoU3RyaW5nKWtleSkgPT0gU2NvcGUuQVBQTElDQVRJT04pIHx8ICghaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VNQy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgaWYgKChnZXRTY29wZSgoU3RyaW5nKWtleSkgPT0gU2NvcGUuQVBQTElDQVRJT04pIHx8ICghaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0TUMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QXBwbGljYXRpb25TY29wZWRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpICYmIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKS5rZXlTZXQoKTsKLSAgICAgICAgfQotICAgICAgICBIYXNoTWFwIHRlbXBQcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICB0ZW1wUHJvcHMucHV0QWxsKHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXRBbGwocmVzcG9uc2VNQy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wUHJvcHMua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIC8vIFRPRE8gY2FyZWZ1bDogIGVuZHBvaW50cyBtYXkgb3ZlcndyaXRlIHByZS1leGlzdGluZyBrZXkvdmFsdWUgcGFpcnMuCi0gICAgICAgIC8vIFRob3NlIGtleS92YWx1ZSBwYWlycyBtYXkgYWxyZWFkeSBoYXZlIGEgc2NvcGUgYXR0YWNoZWQgdG8gdGhlbSwgd2hpY2gKLSAgICAgICAgLy8gbWVhbnMgYW4gZW5kcG9pbnQgY291bGQgInB1dCIgYSBwcm9wZXJ0eSB0aGF0IGlzIHdyb25nbHkgc2NvcGVkCi0gICAgICAgIGlmIChzY29wZXMuZ2V0KGtleSkgPT0gbnVsbCkgeyAgLy8gY2hlY2sgdGhlIHNjb3BlcyBvYmplY3QgZGlyZWN0bHksIG5vdCB0aHJvdWdoIGdldFNjb3BlKCkhIQotICAgICAgICAgICAgc2V0U2NvcGUoa2V5LCBTY29wZS5IQU5ETEVSKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RNQy5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VNQy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0TUMuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsKLSAgICAgICAgLy8gVE9ETyBzaW1pbGFyIHByb2JsZW0gYXMgInB1dCIKLSAgICAgICAgZm9yKEl0ZXJhdG9yIGl0ID0gdC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IChFbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZ2V0U2NvcGUoZW50cnkuZ2V0S2V5KCkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRTY29wZShlbnRyeS5nZXRLZXkoKSwgU2NvcGUuSEFORExFUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzcG9uc2VNQy5zZXRQcm9wZXJ0aWVzKHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0TUMuc2V0UHJvcGVydGllcyh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgLy8gY2hlY2sgQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgZmxhZyBhbmQgcHJldmVudCByZW1vdmFsIG9mIEhBTkRMRVIgc2NvcGVkIHByb3BzCi0gICAgICAgIGlmIChpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgIGlmIChnZXRTY29wZSgoU3RyaW5nKWtleSkuZXF1YWxzKFNjb3BlLkhBTkRMRVIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHllcywgcmVtb3ZlIGZyb20gYm90aCBhbmQgcmV0dXJuIHRoZSByaWdodCBvYmplY3QKLSAgICAgICAgLy8gVE9ETyBUaGlzIHdvbid0IHdvcmsgYmVjYXVzZSBnZXRQcm9wZXJ0aWVzIHJldHVybnMgYSB0ZW1wb3JhcnkgbWFwCi0gICAgICAgIE9iamVjdCByZXRWYWwgPSBudWxsOwotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXRWYWwgPSByZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoa2V5KTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcXVlc3RNQykgewotICAgICAgICAgICAgaWYgKHJldFZhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0TUMuZ2V0UHJvcGVydGllcygpLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICBpZiAoaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QXBwbGljYXRpb25TY29wZWRQcm9wZXJ0aWVzKCkuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgcHJvcGVydGllcyBtdXN0IGJlIGNvbWJpbmVkIHRvZ2V0aGVyIGJlY2F1c2Ugc29tZQotICAgICAgICAvLyBrZXlzIG1heSBiZSB0aGUgc2FtZSBvbiB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlLgotICAgICAgICBIYXNoTWFwIHRlbXBQcm9wcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAocmVxdWVzdE1DKSB7Ci0gICAgICAgICAgICB0ZW1wUHJvcHMucHV0QWxsKHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZU1DICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXRBbGwocmVzcG9uc2VNQy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wUHJvcHMuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKGlzQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEFwcGxpY2F0aW9uU2NvcGVkUHJvcGVydGllcygpLnZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIEhhc2hNYXAgdGVtcFByb3BzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIHRlbXBQcm9wcy5wdXRBbGwocmVxdWVzdE1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGVtcFByb3BzLnB1dEFsbChyZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRlbXBQcm9wcy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlT2JqZWN0KCkgewotICAgICAgICAvLyBUT0RPIGRvZXMgQXBwbGljYXRpb25BY2Nlc3NMb2NrZWQgYXBwbHkgaGVyZT8KLSAgICAgICAgaWYgKHJlc3BvbnNlTUMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlTUMuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0TUMuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCkgewotICAgICAgICAvLyBzaW5jZSBNRVBDb250ZXh0IGlzIGJvdGggYSB3cmFwcGVyIGFuZCBhIHN1YmNsYXNzLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdG8gc2V0IGl0IG9ubHkgb24gdGhlIHdyYXBwZXIgb2JqZWN0OgotICAgICAgICBpZiAodGhpcyA9PSByZXF1ZXN0TUMuZ2V0TUVQQ29udGV4dCgpKSB7ICAvLyBvYmplY3QgY29tcGFyZSwgSSBhbSB0aGUgd3JhcHBlciBvYmplY3QKLSAgICAgICAgICAgIHJldHVybiBBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VNQyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdE1DLmdldE1FUENvbnRleHQoKS5pc0FwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VNQy5nZXRNRVBDb250ZXh0KCkuaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpIHx8IHJlcXVlc3RNQy5nZXRNRVBDb250ZXh0KCkuaXNBcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25BY2Nlc3NMb2NrZWQoYm9vbGVhbiBhcHBsaWNhdGlvbkFjY2Vzc0xvY2tlZCkgewotICAgICAgICAvLyBzaW5jZSBNRVBDb250ZXh0IGlzIGJvdGggYSB3cmFwcGVyIGFuZCBhIHN1YmNsYXNzLCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgdG8gc2V0IGl0IG9ubHkgb24gdGhlIHdyYXBwZXIgb2JqZWN0OgotICAgICAgICBpZiAodGhpcyA9PSByZXF1ZXN0TUMuZ2V0TUVQQ29udGV4dCgpKSB7ICAvLyBvYmplY3QgY29tcGFyZSwgSSBhbSB0aGUgd3JhcHBlciBvYmplY3QKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkID0gYXBwbGljYXRpb25BY2Nlc3NMb2NrZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXF1ZXN0TUMuZ2V0TUVQQ29udGV4dCgpLnNldEFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKGFwcGxpY2F0aW9uQWNjZXNzTG9ja2VkKTsKLSAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSByZXR1cm5lZCB0ZW1wTWFwIHNob3VsZCBiZSB1c2VkIGFzIGEgcmVhZC1vbmx5IG1hcCBhcyBjaGFuZ2VzIHRvIGl0IHdpbGwKLSAgICAgKiBub3QgcHJvcG9nYXRlIGludG8gdGhlIHJlcXVlc3RNQyBvciByZXNwb25zZU1DCi0gICAgICogCi0gICAgICogV2F0Y2ggb3V0IGZvciBpbmZpbml0ZSBsb29wIGlmIHlvdSBjYWxsIGFub3RoZXIgbWV0aG9kIGluIHRoaXMgY2xhc3MgdGhhdCB1c2VzIHRoaXMgbWV0aG9kLgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRBcHBsaWNhdGlvblNjb3BlZFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdGVtcE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBpZiAoIXNjb3Blcy5jb250YWluc1ZhbHVlKFNjb3BlLkFQUExJQ0FUSU9OKSkgewotICAgICAgICAgICAgcmV0dXJuIHRlbXBNYXA7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChyZXF1ZXN0TUMpIHsKLSAgICAgICAgICAgIGZvcihJdGVyYXRvciBpdCA9IHJlcXVlc3RNQy5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChnZXRTY29wZSgoU3RyaW5nKWVudHJ5LmdldEtleSgpKS5lcXVhbHMoU2NvcGUuQVBQTElDQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBNYXAucHV0KChTdHJpbmcpZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VNQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaXQgPSByZXNwb25zZU1DLmdldFByb3BlcnRpZXMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFNjb3BlKChTdHJpbmcpZW50cnkuZ2V0S2V5KCkpLmVxdWFscyhTY29wZS5BUFBMSUNBVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcE1hcC5wdXQoKFN0cmluZyllbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wTWFwOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvU09BUEhlYWRlcnNBZGFwdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1NPQVBIZWFkZXJzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQzNDAxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvU09BUEhlYWRlcnNBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi0vKioNCi0gKiBUaGUgSkFYLVdTIGV4cG9zZXMgc29hcCBoZWFkZXIgcHJvcGVydGllcyB3aG9zZSB2YWx1ZSBpcyBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4uICBUaGUNCi0gKiBRTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGFuZCBMaXN0PFN0cmluZz4gYXJlIHRoZSB4bWwgdmFsdWVzIG9mIHRoZSBoZWFkZXJzIGZvciBxbmFtZS4NCi0gKiANCi0gKiBUaGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0IHN0b3JlcyBzb2FwIGhlYWRlcnMgaW4gYW4gQXhpb20gdHJlZSBvYmplY3QgbG9jYXRlZCBvbiB0aGUgSkFYLVdTIA0KLSAqIE1lc3NhZ2UuDQotICogDQotICogVGhpcyBjbGFzcywgU09BUEhlYWRlcnNBZGFwdGVyLCBpcyBhbiBhZGFwdGVyIGJldHdlZW4gdGhlIE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PiBpbnRlcmZhY2UgbmVlZGVkDQotICogYnkgdGhlIHByb3BlcnRpZXMgYW5kIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uICBBbGwgdXNlZnVsIGZ1bmN0aW9uIGlzIGRlbGVnYXRlZCB0aHJvdWdoIHRoZSBNZXNzYWdlQ29udGV4dCwgc28gDQotICogdGhhdCB3ZSBvbmx5IGhhdmUgb25lIGNvcHkgb2YgdGhlIHNvYXAgaGVhZGVyIGluZm9ybWF0aW9uLiAgDQotICogDQotICogVG8gdXNlIHRoaXMgY2xhc3MsIGludm9rZSB0aGUgaW5zdGFsbCBtZXRob2QuICBUaGlzIHdpbGwgY3JlYXRlIGFuIFNPQVBIZWFkZXJBZGFwdGVyIChpZiBuZWNlc3NhcnkpIGFuZCBpbnN0YWxsIGl0DQotICogb24gdG8gcHJvdmlkZSB0aGUgSkFYLVdTIHNvYXAgaGVhZGVycyBwcm9wZXJ0eS4gIChTZWUgQmFzZU1lc3NhZ2VDb250ZXh0LikNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlcnNBZGFwdGVyIGltcGxlbWVudHMgTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+IHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBIZWFkZXJzQWRhcHRlci5jbGFzcyk7DQotICAgIA0KLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1jOyAgICAgLy8gTWVzc2FnZUNvbnRleHQgd2hpY2ggcHJvdmlkZXMgdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gb2YgQXR0YWNobWVudHMNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT3V0Ym91bmQ7ICAgIC8vIElzT3V0Ym91bmQNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQWRkIHRoZSBBdHRhY2htZW50QWRhcHRlciBhcyB0aGUgcHJvcGVydHkgZm9yIHRoZSBpbmJvdW5kIGFuZC9vcg0KLSAgICAgKiBvdXRib3VuZCBhdHRhY2htZW50IHByb3BlcnR5DQotICAgICAqIEBwYXJhbSBtYyBNZXNzYWdlQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoTWVzc2FnZUNvbnRleHQgbWMpIHsNCi0gICAgICAgIA0KLSAgICAgICAgTWVzc2FnZSBtID0gbWMuZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobSA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gUHJvYmFibHkgYSB1bml0IHRlc3QsIGNhbid0IGNvbnRpbnVlLg0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYm9vbGVhbiBpc091dGJvdW5kID0gbWMuaXNPdXRib3VuZCgpOw0KLSAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy50cmFjZSgiSW5zdGFsbGluZyBTT0FQSGVhZGVyc0FkYXB0ZXI6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IChpc091dGJvdW5kKSA/IA0KLSAgICAgICAgICAgICAgICBDb25zdGFudHMuSkFYV1NfT1VUQk9VTkRfU09BUF9IRUFERVJTIDoNCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5KQVhXU19JTkJPVU5EX1NPQVBfSEVBREVSUzsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIG1hcA0KLSAgICAgICAgT2JqZWN0IG1hcCA9IG1jLmdldFByb3BlcnR5KHByb3BlcnR5KTsNCi0NCi0gICAgICAgIC8vIFJldXNlIGV4aXN0aW5nIEFkYXB0ZXINCi0gICAgICAgIGlmIChtYXAgaW5zdGFuY2VvZiBTT0FQSGVhZGVyc0FkYXB0ZXIpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBIFNPQVBIZWFkZXJzQWRhcHRlciBpcyBhbHJlYWR5IGluc3RhbGxlZC4gIFJldXNpbmcgdGhlIGV4aXN0aW5nIG9uZS4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfSANCi0gICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBBdHRhY2htZW50c0FkYXB0ZXIgYW5kIHNldCBpdCBvbiB0aGUgcHJvcGVydHkgDQotICAgICAgICBTT0FQSGVhZGVyc0FkYXB0ZXIgc2hhID0gDQotICAgICAgICAgICAgbmV3IFNPQVBIZWFkZXJzQWRhcHRlcihtYywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc091dGJvdW5kKTsNCi0NCi0gICAgICAgIGlmIChtYXAgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIE1hcCBjb250ZW50cyB0byB0aGlzIG5ldyBhZGFwdGVyDQotICAgICAgICAgICAgc2hhLnB1dEFsbCgoTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+KSBtYXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbWMuc2V0UHJvcGVydHkocHJvcGVydHksIHNoYSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSBiYWNraW5nIHN0b3JhZ2Ugb2YgdGhlIEF0dGFjaG1lbnRzIGlzIHRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQuDQotICAgICAqIEludGVudGlvbmFsbHkgcHJpdmF0ZSwgdXNlIGluc3RhbGwoTWVzc2FnZUNvbnRleHQpDQotICAgICAqLw0KLSAgICBwcml2YXRlIFNPQVBIZWFkZXJzQWRhcHRlcihNZXNzYWdlQ29udGV4dCBtYywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPdXRib3VuZCkgew0KLSAgICAgICAgdGhpcy5tYyA9IG1jOw0KLSAgICAgICAgdGhpcy5pc091dGJvdW5kID0gaXNPdXRib3VuZDsNCi0gICAgICAgIHRoaXMucHJvcGVydHkgPSAoaXNPdXRib3VuZCkgPyANCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5KQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlMgOg0KLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkpBWFdTX0lOQk9VTkRfU09BUF9IRUFERVJTOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkluaXQgU09BUEhlYWRlcnNBZGFwdGVyIGZvciAiICsgcHJvcGVydHkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsNCi0gICAgICAgIC8vIFRocm93IHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBleGNlcHRpb24gcGVyIE1hcCBqYXZhZG9jDQotICAgICAgICAvLyBmb3IgYW55IG1ldGhvZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQuDQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgew0KLSAgICAgICAgU2V0PFFOYW1lPiBrZXlzID0gdGhpcy5rZXlTZXQoKTsNCi0gICAgICAgIHJldHVybiBrZXlzLmNvbnRhaW5zKGtleSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICBTZXQ8UU5hbWU+IGtleXMgPSB0aGlzLmtleVNldCgpOw0KLSAgICAgICAgZm9yKFFOYW1lIGtleToga2V5cykgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB0cnlWYWx1ZSA9IGdldChrZXkpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0cnlWYWx1ZSA9PSB2YWx1ZSB8fA0KLSAgICAgICAgICAgICAgICB2YWx1ZS5lcXVhbHModHJ5VmFsdWUpKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFNldDxFbnRyeTxRTmFtZSwgTGlzdDxTdHJpbmc+Pj4gZW50cnlTZXQoKSB7DQotICAgICAgICBNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4gdGVtcE1hcCA9IG5ldyBIYXNoTWFwPFFOYW1lLCBMaXN0PFN0cmluZz4+KCk7DQotICAgICAgICB0ZW1wTWFwLnB1dEFsbCh0aGlzKTsNCi0gICAgICAgIHJldHVybiB0ZW1wTWFwLmVudHJ5U2V0KCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0KE9iamVjdCBfa2V5KSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmICghKGtleVNldCgpLmNvbnRhaW5zKF9rZXkpKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgUU5hbWUga2V5ID0gKFFOYW1lKSBfa2V5Ow0KLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgICAgICBMaXN0PEJsb2NrPiBibG9ja3MgPSBtLmdldEhlYWRlckJsb2NrcyhrZXkuZ2V0TmFtZXNwYWNlVVJJKCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5nZXRMb2NhbFBhcnQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOw0KLSAgICAgICAgICAgIGlmIChibG9ja3MgPT0gbnVsbCB8fCBibG9ja3Muc2l6ZSgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgc3RyaW5ncyBmcm9tIHRoZSBibG9ja3MNCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB4bWxTdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGJsb2Nrcy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IGJsb2Nrcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChibG9jayA9PSBudWxsKSA/IG51bGwgOiAoU3RyaW5nKSBibG9jay5nZXRCdXNpbmVzc09iamVjdChmYWxzZSk7DQotICAgICAgICAgICAgICAgIHhtbFN0cmluZ3MuYWRkKHZhbHVlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0dXJuIHhtbFN0cmluZ3M7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5rZXlTZXQoKS5pc0VtcHR5KCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTZXQ8UU5hbWU+IGtleVNldCgpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIHJldHVybiBtLmdldEhlYWRlclFOYW1lcygpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHB1dChRTmFtZSBrZXksIExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1jLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicHV0KCIgKyBrZXkgKyAiICwgIiArIHZhbHVlcyArICIpIik7DQotICAgICAgICB9DQotICAgICAgICAvLyBHZXQgdGhlIG9sZCB2YWx1ZQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG9sZCA9IGdldChrZXkpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAob2xkICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgZXhpc3RpbmcgaGVhZGVyIGJsb2Nrcw0KLSAgICAgICAgICAgICAgICBtLnJlbW92ZUhlYWRlckJsb2NrKGtleS5nZXROYW1lc3BhY2VVUkkoKSwga2V5LmdldExvY2FsUGFydCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gZ2V0WE1MU3RyaW5nQmxvY2tGYWN0b3J5KCkuY3JlYXRlRnJvbSh2YWx1ZSwgbnVsbCwga2V5KTsNCi0gICAgICAgICAgICAgICAgbS5hcHBlbmRIZWFkZXJCbG9jayhrZXkuZ2V0TmFtZXNwYWNlVVJJKCksIGtleS5nZXRMb2NhbFBhcnQoKSwgYmxvY2spOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG9sZDsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBRTmFtZSwgPyBleHRlbmRzIExpc3Q8U3RyaW5nPj4gdCkgew0KLSAgICAgICAgZm9yKEVudHJ5PD8gZXh0ZW5kcyBRTmFtZSwgPyBleHRlbmRzIExpc3Q8U3RyaW5nPj4gZW50cnk6IHQuZW50cnlTZXQoKSkgew0KLSAgICAgICAgICAgIFFOYW1lIGtleSA9IGVudHJ5LmdldEtleSgpOw0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7ICANCi0gICAgICAgICAgICBwdXQoa2V5LCB2YWx1ZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcmVtb3ZlKE9iamVjdCBrZXkpIHsNCi0gICAgICAgIC8vIFRocm93IHVuc3VwcG9ydGVkIG9wZXJhdGlvbiBleGNlcHRpb24gcGVyIE1hcCBqYXZhZG9jDQotICAgICAgICAvLyBmb3IgYW55IG1ldGhvZCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQuDQotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGludCBzaXplKCkgew0KLSAgICAgICAgcmV0dXJuIHRoaXMua2V5U2V0KCkuc2l6ZSgpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxMaXN0PFN0cmluZz4+IHZhbHVlcygpIHsNCi0gICAgICAgIE1hcDxRTmFtZSwgTGlzdDxTdHJpbmc+PiB0ZW1wTWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIExpc3Q8U3RyaW5nPj4oKTsNCi0gICAgICAgIHRlbXBNYXAucHV0QWxsKHRoaXMpOw0KLSAgICAgICAgcmV0dXJuIHRlbXBNYXAudmFsdWVzKCk7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGdldFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSgpIHsNCi0gICAgICAgIHJldHVybiAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Tb2FwTWVzc2FnZUNvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvU29hcE1lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODhjZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Tb2FwTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5Sb2xlUGxheWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBTT0FQTWVzc2FnZUNvbnRleHQgaXMgdGhlIGNvbnRleHQgaGFuZGVkIHRvIFNPQVAtYmFzZWQgYXBwbGljYXRpb24gaGFuZGxlcnMuICBJdCBwcm92aWRlcwotICogYWNjZXNzIHRvIHRoZSBTT0FQIG1lc3NhZ2UgdGhhdCByZXByZXNlbnRzIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIHZpYSBTQUFKLiAgSXQgYWxzbyBhbGxvd3MKLSAqIGFjY2VzcyB0byBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGFuZCBzZXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgQmFzZU1lc3NhZ2VDb250ZXh0IGltcGxlbWVudHMKLSAgICAgICAgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTb2FwTWVzc2FnZUNvbnRleHQuY2xhc3MpOwotICAgIAotICAgIC8vIGNhY2hlIHRoZSBtZXNzYWdlIG9iamVjdCBhZnRlciB0cmFuc2Zvcm1hdGlvbiAtLS0gc2VlIGdldE1lc3NhZ2UgYW5kIHNldE1lc3NhZ2UgbWV0aG9kcwotICAgIE1lc3NhZ2UgY2FjaGVkTWVzc2FnZSA9IG51bGw7Ci0gICAgU09BUE1lc3NhZ2UgY2FjaGVkU29hcE1lc3NhZ2UgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBTb2FwTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgewotICAgICAgICBzdXBlcihtZXNzYWdlQ3R4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0SGVhZGVycyhRTmFtZSBxbmFtZSwgSkFYQkNvbnRleHQgamF4YmNvbnRleHQsIGJvb2xlYW4gYWxsUm9sZXMpIHsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgbG9nLmRlYnVnKCJHZXR0aW5nIGFsbCBIZWFkZXJzIGZvciBRbmFtZTogIitxbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihxbmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludmFsaWQgUU5hbWUsIFFOYW1lIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNvYXBNZXNzYWdlQ29udGV4dEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoamF4YmNvbnRleHQgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZhbGlkIEpBWEJDb250ZXh0LCBKQVhCQ29udGV4dCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJTT0FQTWVzc2FnZUNvbnRleHRFcnIyIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBhcyBhIGxpc3Qgb2YgamF4YiBvYmplY3RzCi0gICAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtID0gbWVzc2FnZUN0eC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgamJjID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoamF4YmNvbnRleHQpOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgYWxsUm9sZXMgaXMgbm90IHNwZWNpZmllZCwgcGFzcyBpbiBhIHNldCBvZiByb2xlcy4KLSAgICAgICAgLy8gVGhlIGhlYWRlcnMgbXVzdCBzdXBwb3J0IHRoYXQgcm9sZS4KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbnVsbDsKLSAgICAgICAgaWYgKGFsbFJvbGVzID09IGZhbHNlKSB7Ci0gICAgICAgICAgICByb2xlUGxheWVyID0gZ2V0Um9sZVBsYXllcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihtLmdldE51bUhlYWRlckJsb2NrcygpPjApewotICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIEpBWEIgQmxvY2tzCi0gICAgICAgICAgICBMaXN0PEJsb2NrPiBibG9ja0xpc3QgPSBtLmdldEhlYWRlckJsb2NrcyhuYW1lc3BhY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYmMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVQbGF5ZXIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgbGlzdCBvZiBKQVhCIG9iamVjdHMKLSAgICAgICAgICAgIGlmKGJsb2NrTGlzdCE9bnVsbCAmJiBibG9ja0xpc3Quc2l6ZSgpID4gMCl7Ci0gICAgICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGJsb2NrTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IChCbG9jaykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm8hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeHRyYWN0ZWQgQk8gZnJvbSBIZWFkZXIgQmxvY2siKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Y2F0Y2goWE1MU3RyZWFtRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBPYmplY3RbMF0pOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHsKLSAgICAgICAgTWVzc2FnZSBtc2cgPSBtZXNzYWdlQ3R4LmdldE1FUENvbnRleHQoKS5nZXRNZXNzYWdlT2JqZWN0KCk7Ci0gICAgICAgIGlmIChtc2cgIT0gY2FjaGVkTWVzc2FnZSkgewotICAgICAgICAgICAgY2FjaGVkTWVzc2FnZSA9IG1zZzsKLSAgICAgICAgICAgIGNhY2hlZFNvYXBNZXNzYWdlID0gbXNnLmdldEFzU09BUE1lc3NhZ2UoKTsKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIGNhY2hlZFNvYXBNZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRSb2xlcygpIHsKLSAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgYmV0dGVyLiAgV2Ugc2hvdWxkIGJlIGRvaW5nIHNtYXJ0ZXIgY2hlY2tpbmcgb2YgdGhlIGhlYWRlciwKLSAgICAgICAgLy8gZXNwZWNpYWxseSBmb3IgdGhlIFVsdGltYXRlIHJlY2VpdmVyIGFjdG9yL3JvbGUKLQotICAgICAgICAvKgotICAgICAgICAgKiBKQVZBRE9DIHRvIGhlbHAgZ2V0IHRoaXMgaW1wbGVtZW50ZWQgY29ycmVjdGx5OgotICAgICAgICAgKiAKLSAgICAgICAgICogR2V0cyB0aGUgU09BUCBhY3RvciByb2xlcyBhc3NvY2lhdGVkIHdpdGggYW4gZXhlY3V0aW9uIG9mIHRoZSBoYW5kbGVyCi0gICAgICAgICAqIGNoYWluLiBOb3RlIHRoYXQgU09BUCBhY3RvciByb2xlcyBhcHBseSB0byB0aGUgU09BUCBub2RlIGFuZCBhcmUKLSAgICAgICAgICogbWFuYWdlZCB1c2luZyBTT0FQQmluZGluZy5zZXRSb2xlcyBhbmQgU09BUEJpbmRpbmcuZ2V0Um9sZXMuIEhhbmRsZXIKLSAgICAgICAgICogaW5zdGFuY2VzIGluIHRoZSBoYW5kbGVyIGNoYWluIHVzZSB0aGlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTT0FQCi0gICAgICAgICAqIGFjdG9yIHJvbGVzIHRvIHByb2Nlc3MgdGhlIFNPQVAgaGVhZGVyIGJsb2Nrcy4gTm90ZSB0aGF0IHRoZSBTT0FQCi0gICAgICAgICAqIGFjdG9yIHJvbGVzIGFyZSBpbnZhcmlhbnQgZHVyaW5nIHRoZSBwcm9jZXNzaW5nIG9mIFNPQVAgbWVzc2FnZQotICAgICAgICAgKiB0aHJvdWdoIHRoZSBoYW5kbGVyIGNoYWluLgotICAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiByb2xlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oMyk7Ci0gICAgICAgIC8vIEpBWC1XUyAxMC4xLjEuMSBkZWZhdWx0czoKLSAgICAgICAgLy8gU09BUCAxLjEKLSAgICAgICAgcm9sZXMuYWRkKFNPQVBDb25zdGFudHMuVVJJX1NPQVBfQUNUT1JfTkVYVCk7Ci0gICAgICAgIC8vIFNPQVAgMS4yCi0gICAgICAgIHJvbGVzLmFkZChTT0FQQ29uc3RhbnRzLlVSSV9TT0FQXzFfMl9ST0xFX1VMVElNQVRFX1JFQ0VJVkVSKTsKLSAgICAgICAgcm9sZXMuYWRkKFNPQVBDb25zdGFudHMuVVJJX1NPQVBfMV8yX1JPTEVfTkVYVCk7Ci0gICAgICAgIHJldHVybiByb2xlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFNPQVBNZXNzYWdlIHNvYXBtZXNzYWdlKSB7Ci0gICAgICAgIC8vIFRPRE8gSSBkb24ndCBsaWtlIHRoaXMgYXQgYWxsLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPQotICAgICAgICAgICAgICAgICAgICAoKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcykpLmNyZWF0ZUZyb20oc29hcG1lc3NhZ2UpOwotICAgICAgICAgICAgbWVzc2FnZUN0eC5nZXRNRVBDb250ZXh0KCkuc2V0TWVzc2FnZShtc2cpOwotICAgICAgICAgICAgY2FjaGVkTWVzc2FnZSA9IG1zZzsKLSAgICAgICAgICAgIGNhY2hlZFNvYXBNZXNzYWdlID0gc29hcG1lc3NhZ2U7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGxvZyBpdCwgYW5kIHRocm93IHNvbWV0aGluZz8KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFJvbGVQbGF5ZXIgZ2V0Um9sZVBsYXllcigpIHsKLSAgICAgICAgTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoZ2V0Um9sZXMoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgU01DUm9sZVBsYXllcihyb2xlcyk7Ci0gICAgfQotICAgIAotICAgIGNsYXNzIFNNQ1JvbGVQbGF5ZXIgaW1wbGVtZW50cyBSb2xlUGxheWVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0IHJvbGVzOwotICAgICAgICBTTUNSb2xlUGxheWVyKExpc3Qgcm9sZXMpIHsKLSAgICAgICAgICAgIHRoaXMucm9sZXMgPSByb2xlczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm9sZXM7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVbHRpbWF0ZURlc3RpbmF0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1RyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1RyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDg3YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9UcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogVGhlIEpBWC1XUyBleHBvc2VzIHRyYW5zcG9ydCBwcm9wZXJ0aWVzIHdob3NlIHZhbHVlIGlzIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4uICBUaGUNCi0gKiBTdHJpbmcgaXMgdGhlIGNvbnRlbnQtaWQgYW5kIERhdGFIYW5kbGVyIGlzIHRoZSBkYXRhIGhhbmRsZXIgcmVwcmVzZW50aW5nIHRoZSBUcmFuc3BvcnRIZWFkZXJzLg0KLSAqIA0KLSAqIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgc3RvcmVzIHRyYW5zcG9ydCBwcm9wZXJ0aWVzIGluIGFuIE1hcCBvYmplY3QgbG9jYXRlZCBvbiB0aGUgQVhJUzINCi0gKiBNZXNzYWdlQ29udGV4dC4NCi0gKiANCi0gKiBUaGlzIGNsYXNzLCBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciwgaXMgYW4gYWRhcHRlciBiZXR3ZWVuIHRoZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IA0KLSAqIGludGVyZmFjZSBuZWVkZWQgYnkgdGhlIHByb3BlcnRpZXMgYW5kIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uICANCi0gKiBBbGwgdXNlZnVsIGZ1bmN0aW9uIGlzIGRlbGVnYXRlZCB0aHJvdWdoIHRoZSBNZXNzYWdlQ29udGV4dCwgDQotICogc28gdGhhdCB3ZSBvbmx5IGhhdmUgb25lIGNvcHkgb2YgdGhlIGluZm9ybWF0aW9uLiAgDQotICogDQotICogVG8gdXNlIHRoaXMgY2xhc3MsIGludm9rZSB0aGUgaW5zdGFsbCBtZXRob2QuICBUaGlzIHdpbGwgY3JlYXRlIGFuIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyIA0KLSAqIChpZiBuZWNlc3NhcnkpIGFuZCBpbnN0YWxsIGl0IG9uIHRoZSBwcm9wZXJ0eSBKQVgtV1Mgc3RhbmRhcmQgVHJhbnNwb3J0SGVhZGVycyBwcm9wZXJ0aWVzLiAgDQotICogKFNlZSBCYXNlTWVzc2FnZUNvbnRleHQuKQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciBpbXBsZW1lbnRzIE1hcCB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5jbGFzcyk7DQotDQotICAgIE1lc3NhZ2VDb250ZXh0IG1jOyAvLyBNZXNzYWdlQ29udGV4dCB3aGljaCBwcm92aWRlcyB0aGUgYmFja2luZyBpbXBsZW1lbnRhdGlvbg0KLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lOyAvLyBUaGUgbmFtZSBvZiB0aGUgSkFYLVdTIHByb3BlcnR5DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlcihNZXNzYWdlQ29udGV4dCBtYywgU3RyaW5nIHByb3BlcnR5TmFtZSkgew0KLSAgICAgICAgdGhpcy5tYyA9IG1jOw0KLSAgICAgICAgdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIgYXMgdGhlIHByb3BlcnR5IGZvciBUcmFuc3BvcnRIZWFkZXJzDQotICAgICAqIEBwYXJhbSBtYyBNZXNzYWdlQ29udGV4dA0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoTWVzc2FnZUNvbnRleHQgbWMpIHsNCi0NCi0gICAgICAgIGJvb2xlYW4gaXNSZXF1ZXN0ID0gKG1jLmdldE1FUENvbnRleHQoKS5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSA9PSBtYyk7DQotDQotICAgICAgICAvLyBUaGUgcHJvcGVydHkgaXMgZWl0aGVyIGEgcmVxdWVzdCBvciByZXNwb25zZQ0KLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9DQotICAgICAgICAgICAgICAgIChpc1JlcXVlc3QpID8gamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuSFRUUF9SRVFVRVNUX0hFQURFUlMNCi0gICAgICAgICAgICAgICAgICAgICAgICA6IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfSEVBREVSUzsNCi0NCi0NCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW5zdGFsbGluZyBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciBmb3IgIiArIHByb3BlcnR5TmFtZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgbWFwDQotICAgICAgICBPYmplY3QgbWFwID0gbWMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsNCi0NCi0gICAgICAgIC8vIFJldXNlIGV4aXN0aW5nIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyDQotICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlciBpcyBhbHJlYWR5IGluc3RhbGxlZC4gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldXNpbmcgdGhlIGV4aXN0aW5nIG9uZS4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyIGFuZCBzZXQgaXQgb24gdGhlIHByb3BlcnR5IA0KLSAgICAgICAgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIgdGhhID0gbmV3IFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyKG1jLCBwcm9wZXJ0eU5hbWUpOw0KLQ0KLSAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIFRyYW5zcG9ydEhlYWRlcnMgaW4gdGhlIGV4aXN0aW5nIG1hcCAoIiArIHByb3BlcnR5TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIikgYXJlIGNvcGllZCB0byB0aGUgVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXIuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIE1hcCBjb250ZW50cyB0byB0aGlzIG5ldyBhZGFwdGVyDQotICAgICAgICAgICAgdGhhLnB1dEFsbCgoTWFwKSBtYXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgbWMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcmVzcG9uc2UsIHRoZW4gYWxzbyBzZXQgdGhlIHByb3BlcnR5IGZvciB0aGUgcmVzcG9uc2UgY29kZQ0KLSAgICAgICAgaWYgKCFpc1JlcXVlc3QpIHsNCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtYy5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU1RBVFVTX0NPREUpOw0KLSAgICAgICAgICAgIG1jLnNldFByb3BlcnR5KGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LkhUVFBfUkVTUE9OU0VfQ09ERSwgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXQvQ3JlYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBtYXAgZnJvbSB0aGUgQXhpczIgcHJvcGVydGllcw0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHJldHVybiBNYXANCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBnZXREZWxlZ2F0ZU1hcChNZXNzYWdlQ29udGV4dCBtYykgew0KLSAgICAgICAgLy8gR2V0IHRoZSBheGlzMiBNYXANCi0gICAgICAgIE1hcCBtYXAgPSAoTWFwKSBtYy5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpOw0KLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7DQotICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgICAgICBtYy5zZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMsIG1hcCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWFwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb252ZXJ0IGludHB1dCBpbnRvIGEgTGlzdA0KLSAgICAgKiBAcGFyYW0gbw0KLSAgICAgKiBAcmV0dXJuIExpc3QNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBjb252ZXJ0VG9MaXN0KE9iamVjdCBvKSB7DQotICAgICAgICBpZiAobyA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7DQotICAgICAgICAgICAgcmV0dXJuIChMaXN0KSBvOw0KLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotICAgICAgICAgICAgTGlzdCBsID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgIGwuYWRkKG8pOw0KLSAgICAgICAgICAgIHJldHVybiBsOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW5wdXRDb252ZXJ0aW9uRXJyIixvLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoT2JqZWN0IG8pIHsNCi0gICAgICAgIGlmIChvID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBvOw0KLSAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTGlzdCkgew0KLQ0KLSAgICAgICAgICAgIExpc3QgbCA9IChMaXN0KSBvOw0KLSAgICAgICAgICAgIGlmIChsLnNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobC5zaXplKCkgPT0gMSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbC5nZXQoMCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW5wdXRDb252ZXJ0aW9uRXJyMSIsby5nZXRDbGFzcygpLnRvU3RyaW5nKCkpKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7DQotICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGVNYXAobWMpLnNpemUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KLSAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlTWFwKG1jKS5pc0VtcHR5KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgew0KLSAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlTWFwKG1jKS5jb250YWluc0tleShrZXkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICAvLyBUT0RPIFNob3VsZCB3YWxrIGFsbCBvZiB0aGUgdmFsdWVzIHRvIGRvIHRoaXMgY29ycmVjdGx5Lg0KLSAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gY29udmVydFRvU3RyaW5nKHZhbHVlKTsNCi0gICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZU1hcChtYykuY29udGFpbnNWYWx1ZSh2YWx1ZVN0cmluZyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgew0KLSAgICAgICAgT2JqZWN0IHZhbHVlID0gY29udmVydFRvTGlzdChnZXREZWxlZ2F0ZU1hcChtYykuZ2V0KGtleSkpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXQoIiArIGtleSArICIpIHJldHVybnMgdmFsdWU9IiArIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IHB1dChPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicHV0KCIgKyBrZXkgKyAiICwgIiArIHZhbHVlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIFN0cmluZyB2YWx1ZVN0cmluZyA9IGNvbnZlcnRUb1N0cmluZyh2YWx1ZSk7DQotICAgICAgICByZXR1cm4gY29udmVydFRvTGlzdChnZXREZWxlZ2F0ZU1hcChtYykucHV0KGtleSwgdmFsdWVTdHJpbmcpKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7DQotICAgICAgICByZXR1cm4gY29udmVydFRvTGlzdChnZXREZWxlZ2F0ZU1hcChtYykucmVtb3ZlKGtleSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgew0KLSAgICAgICAgZm9yIChPYmplY3Qga2V5IDogdC5rZXlTZXQoKSkgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHQuZ2V0KGtleSk7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicHV0IHZpYSBwdXRBbGwgKCIgKyBrZXkgKyAiICwgIiArIHZhbHVlICsgIikiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcHV0KGtleSwgdmFsdWUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgew0KLSAgICAgICAgZ2V0RGVsZWdhdGVNYXAobWMpLmNsZWFyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7DQotICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGVNYXAobWMpLmtleVNldCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsNCi0gICAgICAgIHJldHVybiBjb3B5KCkudmFsdWVzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsNCi0gICAgICAgIHJldHVybiBjb3B5KCkuZW50cnlTZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBNYXAgY29weSgpIHsNCi0gICAgICAgIE1hcCB0ZW1wTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7DQotICAgICAgICBmb3IgKE9iamVjdCBrZXkgOiBrZXlTZXQoKSkgew0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZSA9IChMaXN0PFN0cmluZz4pZ2V0KGtleSk7DQotICAgICAgICAgICAgdGVtcE1hcC5wdXQoa2V5LCB2YWx1ZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdGVtcE1hcDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIHJldHVybiAiVHJhbnNwb3J0SGVhZGVyc0FkYXB0ZXI6ICIgKyBnZXREZWxlZ2F0ZU1hcChtYykudG9TdHJpbmcoKTsgICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVySW52b2tlckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVySW52b2tlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0NTY3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvSGFuZGxlckludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9rZXI7DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGlzIGNhbGxlZCBieSB0aGUgRW5kcG9pbnRDb250cm9sbGVyIA0KLSAqIGluIEpBWC1XUyBpbiBvcmRlciB0byBzZXJ2ZSB1cCBhbiBpbnN0YW5jZSBvZiBhIEhhbmRsZXJJbnZva2VyLiANCi0gKiBJbXBsZW1lbnRhdGlvbnMgY2FuIGJlIHJlZ2lzdGVyZWQgdmlhIHRoZSBGYWN0b3J5UmVnaXN0cnkuDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJJbnZva2VyRmFjdG9yeSB7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgSGFuZGxlckludm9rZXIgY2xhc3MuDQotICAgICAqLw0KLSAgICBwdWJsaWMgSGFuZGxlckludm9rZXIgY3JlYXRlSGFuZGxlckludm9rZXIoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L0hhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ3ODY1Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3Rvcnk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyUG9zdEludm9rZXI7DQotDQotLyoqDQotICogSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBhIEhhbmRsZXJQb3N0SW52b2tlcg0KLSAqIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgd2lsbCBiZSBjYWxsZWQganVzdCBhZnRlciBlYWNoDQotICogSkFYV1MgaGFuZGxlci5oYW5kbGVNZXNzYWdlIGludm9jYXRpb24uDQotICovDQotcHVibGljIGludGVyZmFjZSBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5IHsNCi0NCi0JcHVibGljIEhhbmRsZXJQb3N0SW52b2tlciBjcmVhdGVIYW5kbGVyUG9zdEludm9rZXIoKTsNCi0JDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVyUHJlSW52b2tlckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9IYW5kbGVyUHJlSW52b2tlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3MzdiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvSGFuZGxlclByZUludm9rZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJQcmVJbnZva2VyOw0KLQ0KLS8qKg0KLSAqIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeSBpcyB1c2VkIHRvIGNyZWF0ZSBhIEhhbmRsZXJQcmVJbnZva2VyDQotICogaW1wbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIGNhbGxlZCBqdXN0IHByaW9yIHRvIGVhY2gNCi0gKiBKQVhXUyBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UgaW52b2NhdGlvbi4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeSB7DQotCQ0KLQlwdWJsaWMgSGFuZGxlclByZUludm9rZXIgY3JlYXRlSGFuZGxlclByZUludm9rZXIoKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L2ltcGwvSGFuZGxlckludm9rZXJGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L2ltcGwvSGFuZGxlckludm9rZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJjYjdlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9pbXBsL0hhbmRsZXJJbnZva2VyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJJbnZva2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVySW52b2tlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5pbXBsLkhhbmRsZXJJbnZva2VySW1wbDsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBIYW5kbGVySW52b2tlckZhY3RvcnksIA0KLSAqIGFuZCBpdCB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRmFjdG9yeVJlZ2lzdHJ5Lg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEhhbmRsZXJJbnZva2VyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBIYW5kbGVySW52b2tlckZhY3Rvcnkgew0KLQ0KLSAgICBwdWJsaWMgSGFuZGxlckludm9rZXIgY3JlYXRlSGFuZGxlckludm9rZXIoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlckludm9rZXJJbXBsKCk7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9pbXBsL0hhbmRsZXJQb3N0SW52b2tlckZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvaW1wbC9IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJmY2QzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvZmFjdG9yeS9pbXBsL0hhbmRsZXJQb3N0SW52b2tlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclBvc3RJbnZva2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUG9zdEludm9rZXJJbXBsOw0KLQ0KLS8qKg0KLSAqIEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnlJbXBsIC0gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24NCi0gKiBvZiBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5LiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzaG91bGQNCi0gKiBiZSByZWdpc3RlcmVkIHdpdGggdGhlIEZhY3RvcnlSZWdpc3RyeS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeUltcGwgaW1wbGVtZW50cyBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5IHsNCi0NCi0JcHVibGljIEhhbmRsZXJQb3N0SW52b2tlciBjcmVhdGVIYW5kbGVyUG9zdEludm9rZXIoKSB7DQotCQlyZXR1cm4gbmV3IEhhbmRsZXJQb3N0SW52b2tlckltcGwoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvaW1wbC9IYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ZhY3RvcnkvaW1wbC9IYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYWZiZGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9mYWN0b3J5L2ltcGwvSGFuZGxlclByZUludm9rZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJQcmVJbnZva2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUHJlSW52b2tlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5pbXBsLkhhbmRsZXJQcmVJbnZva2VySW1wbDsNCi0NCi0vKioNCi0gKiBIYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsIC0gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24NCi0gKiBvZiBIYW5kbGVyUHJlSW52b2tlckZhY3RvcnkuICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHNob3VsZA0KLSAqIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRmFjdG9yeVJlZ2lzdHJ5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgSGFuZGxlclByZUludm9rZXJGYWN0b3J5IHsNCi0NCi0JcHVibGljIEhhbmRsZXJQcmVJbnZva2VyIGNyZWF0ZUhhbmRsZXJQcmVJbnZva2VyKCkgew0KLQkJcmV0dXJuIG5ldyBIYW5kbGVyUHJlSW52b2tlckltcGwoKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlckludm9rZXJJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2ltcGwvSGFuZGxlckludm9rZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDlmMzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJJbnZva2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2tlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJJbnZva2VyVXRpbHM7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBkcml2aW5nIGJvdGggaW5ib3VuZCBhbmQNCi0gKiBvdXRib3VuZCBoYW5kbGVyIGNoYWlucyBmb3IgYW4gZW5kcG9pbnQgaW52b2NhdGlvbi4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVySW52b2tlckltcGwgaW1wbGVtZW50cyBIYW5kbGVySW52b2tlciB7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIGludm9rZXMgdGhlIGluYm91bmQgaGFuZGxlcnMgZm9yIHRoZSBpbnZvY2F0aW9uLg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gaW52b2tlSW5ib3VuZEhhbmRsZXJzKEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VJbmJvdW5kSGFuZGxlcnMoY29udGV4dC5nZXRNZXNzYWdlQ29udGV4dCgpLg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TUVQQ29udGV4dCgpLCBjb250ZXh0LmdldEhhbmRsZXJzKCksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRNRVAoKSwgY29udGV4dC5pc09uZVdheSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpbnZva2VzIHRoZSBvdXRib3VuZCBoYW5kbGVycyBmb3IgdGhlIGludm9jYXRpb24uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbnZva2VPdXRib3VuZEhhbmRsZXJzKEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gSGFuZGxlckludm9rZXJVdGlscy5pbnZva2VPdXRib3VuZEhhbmRsZXJzKGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNRVBDb250ZXh0KCksIGNvbnRleHQuZ2V0SGFuZGxlcnMoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRNRVAoKSwgY29udGV4dC5pc09uZVdheSgpKTsNCi0gICAgfQ0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJQb3N0SW52b2tlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaW1wbC9IYW5kbGVyUG9zdEludm9rZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDQ4MTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJQb3N0SW52b2tlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclBvc3RJbnZva2VyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclBvc3RJbnZva2VySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQb3N0SW52b2tlciB7DQotDQotCXB1YmxpYyB2b2lkIHBvc3RJbnZva2UoTWVzc2FnZUNvbnRleHQgbWMpIHsNCi0JCS8vIHRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJQcmVJbnZva2VySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9pbXBsL0hhbmRsZXJQcmVJbnZva2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjcxNTJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvaW1wbC9IYW5kbGVyUHJlSW52b2tlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclByZUludm9rZXI7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyUHJlSW52b2tlckltcGwgaW1wbGVtZW50cyBIYW5kbGVyUHJlSW52b2tlciB7DQotDQotCXB1YmxpYyB2b2lkIHByZUludm9rZShNZXNzYWdlQ29udGV4dCBtYykgew0KLQkJLy8gdGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGEgbm8tb3ANCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9mYWN0b3J5L0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2xpZmVjeWNsZS9mYWN0b3J5L0hhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDU2MjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvZmFjdG9yeS9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5saWZlY3ljbGUuTGlmZWN5Y2xlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKLQotLyoKLSAqIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIHRvIGludm9rZSBsaWZ5Y3ljbGUgbWV0aG9kcyBvbiBIYW5kbGVyLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyIHsKLQotICAgIHB1YmxpYyBIYW5kbGVyIGNyZWF0ZUhhbmRsZXJJbnN0YW5jZShNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3MgaGFuZGxlckNsYXNzKQotICAgICAgICAgICAgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiwgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95SGFuZGxlckluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jLCBIYW5kbGVyIGhhbmRsZXIpCi0gICAgCQl0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uLCBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKgotICAgICAgKiBJbnZva2VzIG1ldGhvZCBvbiBlbmRwb2ludCBtYXJrZWQgd2l0aCBAUG9zdENvbnN0cnVjdCBhbm5vdGF0aW9uLgotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VQb3N0Q29uc3RydWN0KCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICAqIEludm9rZXMgbWV0aG9kIG9uIGVuZHBvaW50IG1hcmtlZCB3aXRoIEBwcmVEZXN0cm95IGFubm90YXRpb24uCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZVByZURlc3Ryb3koKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvZmFjdG9yeS9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvbGlmZWN5Y2xlL2ZhY3RvcnkvSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYmYwY2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvZmFjdG9yeS9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5pbXBsLkhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VySW1wbDsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KCkgewotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIgY3JlYXRlSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJJbXBsKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvaW1wbC9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvbGlmZWN5Y2xlL2ltcGwvSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOGU0ZGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9saWZlY3ljbGUvaW1wbC9IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmZhY3RvcnkuSGFuZGxlckxpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkJhc2VMaWZlY3ljbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkxpZmVjeWNsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJJbXBsIGV4dGVuZHMgQmFzZUxpZmVjeWNsZU1hbmFnZXIgaW1wbGVtZW50cyBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlciB7Ci0gICAgICAgIAotICAgIHB1YmxpYyBIYW5kbGVyIGNyZWF0ZUhhbmRsZXJJbnN0YW5jZShNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3MgaGFuZGxlckNsYXNzKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uLCBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlSGFuZGxlckluc3RhbmNlRXJyIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7ICAgICAgICAKLSAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGluamVjdGlvbkRlc2MgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uRGVzYyA9IFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0KHNlcnZpY2VEZXNjLCBoYW5kbGVyQ2xhc3MpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGhhbmRsZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAvL0ludm9rZSBQb3N0Q29uc3RydWN0Ci0gICAgICAgIGlmIChpbmplY3Rpb25EZXNjICE9IG51bGwgJiYgaW5qZWN0aW9uRGVzYy5nZXRQb3N0Q29uc3RydWN0TWV0aG9kKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaW52b2tlUG9zdENvbnN0cnVjdChpbmplY3Rpb25EZXNjLmdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoSGFuZGxlcil0aGlzLmluc3RhbmNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBkZXN0cm95SGFuZGxlckluc3RhbmNlIGNhbGxzIHRoZSBoYW5kbGVyJ3MgYW5ub3RhdGVkIFByZURlc3Ryb3kgbWV0aG9kLAotICAgICAqIGlmIGl0IGV4aXN0cy4gIEEgaGFuZGxlciBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0aHJvdWdoIHRoaXMgbWV0aG9kIFNIT1VMRCBOT1QgYmUgdXNlZCBhZ2FpbgotICAgICAqIAotICAgICAqIEBwYXJhbSBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVzdHJveUhhbmRsZXJJbnN0YW5jZShNZXNzYWdlQ29udGV4dCBtYywgSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uLCBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRlc3Ryb3lIYW5kbGVySW5zdGFuY2VFcnIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBoYW5kbGVyOwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gbWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOyAgICAgICAgCi0gICAgICAgIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBpbmplY3Rpb25EZXNjID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvbkRlc2MgPSBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmdldChzZXJ2aWNlRGVzYywgaGFuZGxlci5nZXRDbGFzcygpKTsgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIC8vSW52b2tlIFByZURlc3Ryb3kKLSAgICAgICAgaWYgKGluamVjdGlvbkRlc2MgIT0gbnVsbCAmJiBpbmplY3Rpb25EZXNjLmdldFByZURlc3Ryb3lNZXRob2QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnZva2VQcmVEZXN0cm95KGluamVjdGlvbkRlc2MuZ2V0UHJlRGVzdHJveU1ldGhvZCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I5MjkyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbWVzc2FnZSAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBjYXVzZSAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2xpZmVjeWNsZS9CYXNlTGlmZWN5Y2xlTWFuYWdlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0Jhc2VMaWZlY3ljbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzRkMmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0Jhc2VMaWZlY3ljbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmxpZmVjeWNsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VMaWZlY3ljbGVNYW5hZ2VyIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQmFzZUxpZmVjeWNsZU1hbmFnZXIuY2xhc3MpOwotICAgIAotICAgIHByb3RlY3RlZCBPYmplY3QgaW5zdGFuY2U7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW52b2tlUG9zdENvbnN0cnVjdCgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsRXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICBNZXRob2QgbWV0aG9kID0gZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludm9rZVBvc3RDb25zdHJ1Y3QobWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZVBvc3RDb25zdHJ1Y3QoTWV0aG9kIG1ldGhvZCkgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBNZXRob2Qgd2l0aCBAUG9zdENvbnN0cnVjdCBhbm5vdGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW52b2tlTWV0aG9kKG1ldGhvZCwgbnVsbCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDb21wbGV0ZWQgaW52b2tlIG9uIE1ldGhvZCB3aXRoIEBQb3N0Q29uc3RydWN0IGFubm90YXRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludm9rZVByZURlc3Ryb3koKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMaWZlY3ljbGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFByZURlc3Ryb3lNZXRob2QoKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnZva2VQcmVEZXN0cm95KG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VQcmVEZXN0cm95KE1ldGhvZCBtZXRob2QpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2tpbmcgTWV0aG9kIHdpdGggQFByZURlc3Ryb3kgYW5ub3RhdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGludm9rZU1ldGhvZChtZXRob2QsIG51bGwpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29tcGxldGVkIGludm9rZSBvbiBNZXRob2Qgd2l0aCBAUHJlRGVzdHJveSBhbm5vdGF0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VNZXRob2QoZmluYWwgTWV0aG9kIG0sIGZpbmFsIE9iamVjdFtdIHBhcmFtcykgdGhyb3dzIExpZmVjeWNsZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5pbnZva2UoaW5zdGFuY2UsIHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IExpZmVjeWNsZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpIHsKLSAgICAgICAgLy8gUkVWSUVXOiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiBwZXJmb3JtYW50IHNpdHVhdGlvbnMuCi0gICAgICAgIC8vIFBsdXMgdGhlIHN1cGVyIGNsYXNzIG1ldGhvZHMgYXJlIG5vdCBiZWluZyBjb25zaWRlcmVkIAotCi0gICAgICAgIC8vcmV0dXJuIE1ldGhvZCB3aXRoIEBQb3N0Q29uc3RydWN0IEFubm90YXRpb24uCi0gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBlbmRwb2ludENsYXp6ID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSAoTWV0aG9kW10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludENsYXp6LmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgIGlmIChpc1Bvc3RDb25zdHJ1Y3QobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldFByZURlc3Ryb3lNZXRob2QoKSB7Ci0gICAgICAgIC8vIFJFVklFVzogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gcGVyZm9ybWFudCBzaXR1YXRpb25zLgotICAgICAgICAvLyBQbHVzIHRoZSBzdXBlciBjbGFzcyBtZXRob2RzIGFyZSBub3QgYmVpbmcgY29uc2lkZXJlZCAKLSAgICAgICAgLy9yZXR1cm4gTWV0aG9kIHdpdGggQFByZURlc3Ryb3kgQW5ub3RhdGlvbgotICAgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgZW5kcG9pbnRDbGF6eiA9IGluc3RhbmNlLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gKE1ldGhvZFtdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kcG9pbnRDbGF6ei5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNQcmVEZXN0cm95KG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQb3N0Q29uc3RydWN0KGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gKEFubm90YXRpb25bXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXREZWNsYXJlZEFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIHJldHVybiBQb3N0Q29uc3RydWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVEZXN0cm95KGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gKEFubm90YXRpb25bXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXREZWNsYXJlZEFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIHJldHVybiBQcmVEZXN0cm95LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9saWZlY3ljbGUvTGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9saWZlY3ljbGUvTGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYjU1MzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0xpZmVjeWNsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmxpZmVjeWNsZTsKLQotcHVibGljIGNsYXNzIExpZmVjeWNsZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgTGlmZWN5Y2xlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbWVzc2FnZSAgKi8KLSAgICBwdWJsaWMgTGlmZWN5Y2xlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIExpZmVjeWNsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNhdXNlICAqLwotICAgIHB1YmxpYyBMaWZlY3ljbGVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvTWV0aG9kTWFyc2hhbGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9NZXRob2RNYXJzaGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2Y2ZTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9NZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFyc2hhbHMgYW5kIHVubWFyc2hhbHMgbWV0aG9kIGludm9jYXRpb25zLgotICogPHAvPgotICogSGVyZSBpcyB0aGUgaGlnaC1sZXZlbCB2aWV3IG9mIG1hcnNoYWxsaW5nOiBTSUdOQVRVUkVfQVJHUyAtLS0+IFR5cGUgRW5hYmxlZCBPYmplY3QgIC0tLS0tPgotICogRWxlbWVudCBFbmFibGVkIE9iamVjdCAtLS0+IE1FU1NBR0UgKFhNTCkKLSAqIDxwLz4KLSAqIFRoZSBTaWduYXR1cmUgb2JqZWN0cyBhcmUgdGhlIG9iamVjdHMgZnJvbSB0aGUgU0VJIG1ldGhvZCBzaWduYXR1cmUuICBUaGV5IG1heSBiZSB2YWx1ZXMgb3IKLSAqIGhvbGRlcnMgb2YgdmFsdWVzLiBUaGUgdmFsdWVzIGFyZSAidHlwZSBlbmFibGVkIG9iamVjdHMiIChpLmUuIFN0cmluZyksIHdoaWNoIG1lYW5zIHRoYXQgdGhleQotICogY2Fubm90IGJlIG1hcnNoYWxsZWQgb3IgdW5tYXJzaGFsbGVkLgotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLlhNTFJvb3RFbGVtZW50VXRpbHMgZm9yIGRldGFpbHMgb24gVHlwZSBFbmFibGVkIGFuZCBFbGVtZW50Ci0gKiAgICAgIEVuYWJsZWQgb2JqZWN0cy4KLSAqICAgICAgPHAvPgotICogICAgICBUaGUgdmFsdWVzIGFyZSBlbmhhbmNlZCAoaWYgbmVjZXNzYXJ5KSBpbnRvIEVsZW1lbnQgRW5hYmxlZCBPYmplY3RzLiAgVGhlc2UgY2FuIGJlCi0gKiAgICAgIG1hcnNoYWxsZWQgb3IgdW5tYXJzaGFsbGVkIHVzaW5nIEpBWEIuCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5QREVsZW1lbnQKLSAqICAgICAgPHAvPgotICogICAgICBUaGUgZWxlbWVudCBlbmFibGVkIG9iamVjdHMgYXJlIHB1dCBvbnRvIHRoZSBtZXNzYWdlLgotICogICAgICA8cC8+Ci0gKiAgICAgIFRoZSBoaWdoLWxldmVsIHZpZXcgb2YgdW5tYXJzaGFsbGluZyBpcyB0aGUgcmV2ZXJzZS4gU0lHTkFUVVJFX0FSR1MgPC0tLS0gVHlwZSBFbmFibGVkCi0gKiAgICAgIE9iamVjdCAgPC0tLS0tIEVsZW1lbnQgRW5hYmxlZCBPYmplY3QgPC0tLS0gTUVTU0FHRSAoWE1MKQotICogICAgICA8cC8+Ci0gKiAgICAgIFNlZSB0aGUgc3BlY2lmaWMgTWV0aG9kTWFyc2hhbGxlciBpbXBsZW1lbnRhdGlvbnMgdG8gc2VlIGhvdyBkb2MvbGl0IHdyYXBwZWQsIGRvYy9saXQgYmFyZQotICogICAgICBhbmQgcnBjL2xpdCBhZmZlY3QgdGhlIHByb2Nlc3Mgb2YgZ29pbmcgZnJvbSBTSUdOQVRVUkVfQVJHUyB0byB0aGUgZWxlbWVudCBlbmFibGVkIG9iamVjdHMuCi0gKiAgICAgIDxwLz4KLSAqICAgICAgSWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcywgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIGlzIHRocm93bi4gIChFYWNoIG9mIHRoZSBtZXRob2RzIGlzCi0gKiAgICAgIGd1cmFudGVlZCB0byBjYXRjaCBhbnkgdW5jaGVja2VkIGV4Y2VwdGlvbiBhbmQgd3JhcCBpdCBpbiBhIFdlYlNlcnZpY2VFeGNlcHRpb24pLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGhvZE1hcnNoYWxsZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY29udmVydHMgU0lHTkFUVVJFX0FSR1MgaW50byBhIE1lc3NhZ2UuIEl0IGlzIHVzZWQgb24gdGhlIGNsaWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHNpZ25hdHVyZUFyZ3MKLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVxdWVzdChPYmplY3RbXSBzaWduYXR1cmVBcmdzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBTSUdOQVRVUkVfQVJHUyBhbmQgUkVUVVJOIG9iamVjdCBpbnRvIGEgTWVzc2FnZS4gSXQgaXMgdXNlZCBvbiB0aGUKLSAgICAgKiBzZXJ2ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXR1cm5PYmplY3QKLSAgICAgKiBAcGFyYW0gc2lnbmF0dXJlQXJncwotICAgICAqIEBwYXJhbSBPcGVyYXRpb25EZXNjCi0gICAgICogQHBhcmFtIFByb3RvY29sICAgICAgZm9yIHJlc3BvbnNlCi0gICAgICogQHJldHVybiBNZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlc3BvbnNlKE9iamVjdCByZXR1cm5PYmplY3QsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYywgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY29udmVydHMgdGhlIE1lc3NhZ2UgaW50byBhIFNJR05BVFVSRV9BUkdTIEl0IGlzIHVzZWQgb24gdGhlIHNlcnZlcgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIHNpZ25hdHVyZSBhcmdzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGRlbWFyc2hhbFJlcXVlc3QoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGdldHMgdGhlIG9iamVjdHMgZnJvbSB0aGUgTWVzc2FnZSBhbmQgc2V0cyB0aGVtIG9udG8gdGhlIFNJR05BVFVSRV9BUkdTIEl0IGFsc28KLSAgICAgKiByZXR1cm5zIHRoZSBSRVRVUk4gb2JqZWN0LiBDYWxsZWQgb24gY2xpZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBzaWduYXR1cmVBZ3MgIChzYW1lIGFycmF5IG9mIGFyZ3MgdGhhdCB3ZXJlIHVzZWQgZm9yIG1hcnNoYWxSZXF1ZXN0LiAgVGhlIG91dC9pbm91dAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGhvbGRlcnMgYXJlIHBvcHVsYXRlZCB3aXRoIG5ldyB2YWx1ZXMpCi0gICAgICogQHBhcmFtIE9wZXJhdGlvbkRlc2MKLSAgICAgKiBAcmV0dXJuIHJldHVybk9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZGVtYXJzaGFsUmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNvbnZlcnRzIGEgTWVzc2FnZSAoY29udGFpbmluZyBhIGZhdWx0KSBpbnRvIGEgSkFYLVdTIFNlcnZpY2Ugb3IKLSAgICAgKiBXZWJTZXJ2aWNlRXhjZXB0aW9uLiBVc2VkIG9uIHRoZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBNZXNzYWdlCi0gICAgICogQHJldHVybiBUaHJvd2FibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGRlbWFyc2hhbEZhdWx0UmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gYSBUaHJvd2FibGUgaW5wdXQgcGFyYW1ldGVyLiBVc2VkIG9uIHRoZSBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gVGhyb3dhYmxlCi0gICAgICogQHBhcmFtIE9wZXJhdGlvbkRlc2MKLSAgICAgKiBAcGFyYW0gUHJvdG9jb2wgICAgICBmb3IgcmVzcG9uc2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbEZhdWx0UmVzcG9uc2UoVGhyb3dhYmxlIHRocm93YWJsZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL01ldGhvZFBhcmFtZXRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9NZXRob2RQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM3ZTNkZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL01ldGhvZFBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotCi0vKioKLSAqIFN0b3JlcyBNZXRob2QgUGFyYW1ldGVyIGFzIE5hbWUgYW5kIFZhbHVlLiBNZXRob2QgUGFyYW1ldGVyIGNhbiBiZSBhbiBpbnB1dCBNZXRob2QgUGFyYW1ldGVyIG9yCi0gKiBvdXRwdXQgTWV0aG9kIHBhcmFtZXRlci4gaW5wdXQgTWV0aG9kIFBhcmFtZXRlciBpcyBhIGlucHV0IHRvIGEgamF2YSBNZXRob2QuIG91dHB1dCBNZXRob2QKLSAqIFBhcmFtZXRlciBpcyBhIHJldHVybiBwYXJhbWV0ZXIgZnJvbSBhIGphdmEgTWV0aG9kLgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFyYW1ldGVyIHsKLSAgICBwcml2YXRlIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtZXRlckRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJSZXN1bHROYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJSZXN1bHRUTlMgPSBudWxsOwotICAgIHByaXZhdGUgQ2xhc3Mgd2ViUmVzdWx0VHlwZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2ViUmVzdWx0ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSBudWxsOwotCi0gICAgcHVibGljIE1ldGhvZFBhcmFtZXRlcihQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbWV0ZXJEZXNjcmlwdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyRGVzY3JpcHRpb24gPSBwYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2RQYXJhbWV0ZXIoU3RyaW5nIHdlYlJlc3VsdE5hbWUsIFN0cmluZyB3ZWJSZXN1bHRUTlMsIENsYXNzIHdlYlJlc3VsdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJEZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICAgIHRoaXMud2ViUmVzdWx0TmFtZSA9IHdlYlJlc3VsdE5hbWU7Ci0gICAgICAgIHRoaXMud2ViUmVzdWx0VE5TID0gd2ViUmVzdWx0VE5TOwotICAgICAgICB0aGlzLndlYlJlc3VsdFR5cGUgPSB3ZWJSZXN1bHRUeXBlOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHRoaXMuaXNXZWJSZXN1bHQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlckRlc2NyaXB0aW9uKFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtZXRlckRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyRGVzY3JpcHRpb24gPSBwYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdlYlJlc3VsdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdlYlJlc3VsdE5hbWUoU3RyaW5nIHdlYlJlc3VsdE5hbWUpIHsKLSAgICAgICAgdGhpcy53ZWJSZXN1bHROYW1lID0gd2ViUmVzdWx0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dlYlJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIGlzV2ViUmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdlYlJlc3VsdChib29sZWFuIGlzV2ViUmVzdWx0KSB7Ci0gICAgICAgIHRoaXMuaXNXZWJSZXN1bHQgPSBpc1dlYlJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXZWJSZXN1bHRUTlMoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHRUTlM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViUmVzdWx0VE5TKFN0cmluZyB3ZWJSZXN1bHRUTlMpIHsKLSAgICAgICAgdGhpcy53ZWJSZXN1bHRUTlMgPSB3ZWJSZXN1bHRUTlM7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFdlYlJlc3VsdFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdlYlJlc3VsdFR5cGUoQ2xhc3Mgd2ViUmVzdWx0VHlwZSkgewotICAgICAgICB0aGlzLndlYlJlc3VsdFR5cGUgPSB3ZWJSZXN1bHRUeXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvZmFjdG9yeS9NZXRob2RNYXJzaGFsbGVyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9mYWN0b3J5L01ldGhvZE1hcnNoYWxsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTYyMmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9mYWN0b3J5L01ldGhvZE1hcnNoYWxsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLk1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LkRvY0xpdEJhcmVNZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5Eb2NMaXRCYXJlTWluaW1hbE1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LkRvY0xpdFdyYXBwZWRNZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5Eb2NMaXRXcmFwcGVkTWluaW1hbE1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LkRvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQuUlBDTGl0TWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotLyoqCi0gKiBUaGUgTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkgY3JlYXRlcyBhIERvYy9MaXQgV3JhcHBlZCwgRG9jL0xpdCBCYXJlIG9yIFJQQyBNYXJzaGFsbGVyIHVzaW5nCi0gKiBTT0FQQmluZGluZyBpbmZvcm1hdGlvbgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXRob2RNYXJzaGFsbGVyRmFjdG9yeS5jbGFzcyk7Ci0JCi0gICAgcHJpdmF0ZSBlbnVtIFNVQlRZUEUgewotICAgICAgICBOT1JNQUwsIFBMVVMsIE1JTklNQUwgfQotCi0gICAgOwotCi0gICAgLyoqIEludGVudGlvbmFsbHkgcHJpdmF0ZSAqLwotICAgIHByaXZhdGUgTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIE1hcnNoYWxsZXIgdXNpbmluZyB0aGUgQmluZGluZyBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHN0eWxlCi0gICAgICogQHBhcmFtIHBhcmFtU3R5bGUKLSAgICAgKiBAcGFyYW0gaXNQbHVzICAgICB1c2VkIHRvIGRlc2lnbmF0ZWQgRE9DTElUV1JBUFBFRCBwbHVzIGFkZGl0aW9uYWwgcnVsZXMgKGkuZS4gaGVhZGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZykKLSAgICAgKiBAcGFyYW0gaXNDbGllbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kTWFyc2hhbGxlciBjcmVhdGVNZXRob2RNYXJzaGFsbGVyKFNPQVBCaW5kaW5nLlN0eWxlIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUWVBFIHN1YlR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDbGllbnQpIHsgIC8vIFRoaXMgZmxhZyBpcyBmb3IgdGVzdGluZyBvbmx5ICEKLSAgICAgICAgaWYgKHN0eWxlID09IFNPQVBCaW5kaW5nLlN0eWxlLlJQQykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSUENMaXRNZXRob2RNYXJzaGFsbGVyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyYW1TdHlsZSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKSB7Ci0gICAgICAgICAgICBpZiAoc3ViVHlwZSA9PSBTVUJUWVBFLlBMVVMpIHsKLSAgICAgICAgICAgICAgICAvLyBBYm5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2NMaXRXcmFwcGVkUGx1c01ldGhvZE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3ViVHlwZSA9PSBTVUJUWVBFLk1JTklNQUwpIHsKLSAgICAgICAgICAgICAgICAvLyBBYm5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2NMaXRXcmFwcGVkTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb2NMaXRXcmFwcGVkTWV0aG9kTWFyc2hhbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHBhcmFtU3R5bGUgPT0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkgewotICAgICAgICAgICAgaWYgKHN1YlR5cGUgPT0gU1VCVFlQRS5NSU5JTUFMKSB7Ci0gICAgICAgICAgICAgICAgLy8gQWJub3JtYWwgY2FzZQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jTGl0QmFyZU1pbmltYWxNZXRob2RNYXJzaGFsbGVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBNZXRob2RNYXJzaGFsbGVyIGdldE1hcnNoYWxsZXIoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3AsIGJvb2xlYW4gaXNDbGllbnQpIHsKLSAgICAgICAgcmV0dXJuIGdldE1hcnNoYWxsZXIob3AsIGlzQ2xpZW50LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1ldGhvZE1hcnNoYWxsZXIgZ2V0TWFyc2hhbGxlcihPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCwgYm9vbGVhbiBpc0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCkgewotCi0gICAgICAgIE1ldGhvZE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IG51bGw7Ci0gICAgICAgIGlmIChvcC5nZXRTb2FwQmluZGluZ1N0eWxlKCkgPT0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQpIHsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIgPSBjcmVhdGVEb2NMaXRNZXRob2RNYXJzaGFsbGVyKG9wLCBpc0NsaWVudCwgY2wpOwotICAgICAgICB9IGVsc2UgaWYgKG9wLmdldFNvYXBCaW5kaW5nU3R5bGUoKSA9PSBTT0FQQmluZGluZy5TdHlsZS5SUEMpIHsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIgPSBjcmVhdGVSUENMaXRNZXRob2RNYXJzaGFsbGVyKGlzQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFyc2hhbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RNYXJzaGFsbGVyIGNyZWF0ZURvY0xpdE1ldGhvZE1hcnNoYWxsZXIoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIHBhcmFtZXRlclN0eWxlID0gbnVsbDsKLSAgICAgICAgU1VCVFlQRSBzdWJUeXBlID0gU1VCVFlQRS5OT1JNQUw7Ci0gICAgICAgIGlmIChpc0RvY0xpdEJhcmUob3ApKSB7Ci0gICAgICAgICAgICBpZiAoaXNEb2NMaXRCYXJlTWluaW1hbChvcCwgY2wpKSB7Ci0gICAgICAgICAgICAgICAgc3ViVHlwZSA9IFNVQlRZUEUuTUlOSU1BTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0RvY0xpdFdyYXBwZWRNaW5pbWFsKG9wKSkgewotICAgICAgICAgICAgICAgIHN1YlR5cGUgPSBTVUJUWVBFLk1JTklNQUw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRG9jTGl0V3JhcHBlZFBsdXMob3ApKSB7Ci0gICAgICAgICAgICAgICAgc3ViVHlwZSA9IFNVQlRZUEUuUExVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlTWV0aG9kTWFyc2hhbGxlcihTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgcGFyYW1ldGVyU3R5bGUsIHN1YlR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RNYXJzaGFsbGVyIGNyZWF0ZVJQQ0xpdE1ldGhvZE1hcnNoYWxsZXIoYm9vbGVhbiBpc0NsaWVudCkgewotICAgICAgICByZXR1cm4gY3JlYXRlTWV0aG9kTWFyc2hhbGxlcihTT0FQQmluZGluZy5TdHlsZS5SUEMsIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRZUEUuTk9STUFMLCBpc0NsaWVudCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRG9jTGl0QmFyZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCkgewotICAgICAgICBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBtZXRob2RQYXJhbVN0eWxlID0gb3AuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotICAgICAgICBpZiAobWV0aG9kUGFyYW1TdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kUGFyYW1TdHlsZSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgU0VJUGFyYW1TdHlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIG9wLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gU0VJUGFyYW1TdHlsZSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRG9jTGl0V3JhcHBlZChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCkgewotICAgICAgICBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBtZXRob2RQYXJhbVN0eWxlID0gb3AuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotICAgICAgICBpZiAobWV0aG9kUGFyYW1TdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kUGFyYW1TdHlsZSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgU0VJUGFyYW1TdHlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIG9wLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gU0VJUGFyYW1TdHlsZSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgYW4gd2ViIHNlcnZpY2UgaXMgY3JlYXRlZCB1c2luZyB3c2dlbiwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc2VpIGRvZXMgbm90IGNvbXBseSB3aXRoCi0gICAgICogdGhlIHdyYXBwZWQgcnVsZXMuICBGb3IgZXhhbXBsZSwgd3NnZW4gd2lsbCBhbGxvdyBoZWFkZXIgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcy4gSW4KLSAgICAgKiBzdWNoIGNhc2VzIHdlIHdpbGwgdXNlIHRoZSBEb2NMaXRXcmFwcGVkUGx1cyBtYXJzaGFsbGVyIHRvIG1hcnNoYWwgYW5kIHVubWFyc2hhbCB0aGUgeG1sIGluCi0gICAgICogdGhlc2UgZXh0cmFvcmRpbmFyeSBzaXR1YXRpb25zCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRG9jTGl0V3JhcHBlZFBsdXMoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3ApIHsKLSAgICAgICAgaWYgKGlzRG9jTGl0V3JhcHBlZChvcCkpIHsKLSAgICAgICAgICAgIGlmIChvcC5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGRzW2ldLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBhIHdlYnNlcnZpY2VzIGlzIGNyZWF0ZWQgd2l0aG91dCB4amMsIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBPYmplY3RGYWN0b3J5IGNsYXNzZXMgcGFja2FnZWQKLSAgICAgKiB3aXRoIHRoZSB3ZWJzZXJ2aWNlLiAgSW4gc3VjaCBjYXNlcywgdXNlIHRoZSBkb2MvbGl0IGJhcmUgbWluaW1hbCBtYXJzaGFsbGVyLiBUaGlzIG1hcnNoYWxsZXIKLSAgICAgKiB3aWxsIHVzZSAiYnkgamF2YSB0eXBlIiBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nIGZvciBwcmltaXRpdmVzIGFuZCBTdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0RvY0xpdEJhcmVNaW5pbWFsKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wLCBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICByZXR1cm4gaXNEb2NMaXRCYXJlKG9wKSAmJiAhaXNDb250ZXh0UGF0aENvbnN0cnVjdGlvbihvcCwgY2wpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBKQVhCQ29udGV4dCBjb25zdHJ1Y3RlZCB1c2luZyBDT05URVhUIFBBVEgKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29udGV4dFBhdGhDb25zdHJ1Y3Rpb24oT3BlcmF0aW9uRGVzY3JpcHRpb24gb3AsIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IG9wLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0KHNlcnZpY2VEZXNjKTsKLSAgICAgICAgLy8gR2V0IHRoZSBKQVhCQ29udGV4dC4uLlNpbmNlIHRoaXMgaXMgYSBjYWNoZWQgb2JqZWN0IHdlIGluY3VyIG5vIHBlbmFsdHkgYnkgbG9va2luZyBhdCB0aGlzIHBvaW50LgotICAgICAgICBIb2xkZXI8SkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFPiBob2xkZXIgPSBuZXcgSG9sZGVyPEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRT4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGNvbnRleHQgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQobWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKSwgaG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpLCBjbCwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaG9sZGVyLnZhbHVlID09IEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRS5CWV9DT05URVhUX1BBVEgpIHsKLSAgICAgICAgICAgIC8vIElmIEpBWEJDb250ZXh0IHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGEgY29udGV4dCBwYXRoLCB0aGlzIGluZGljYXRlcyB0aGF0IE9iamVjdEZhY3RvcnkgKG9yIG90aGVyCi0gICAgICAgICAgICAvLyBvYmplY3RzKSBhcmUgYXZhaWxhYmxlLiAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIEpBWEJDb250ZXh0IHdhcyBjb25zdHJ1Y3RlZCB1c2luZyBhIGNsYXNzW10gb3Igd2UgZG9uJ3Qga25vdyBob3cgaXQgd2FzIGNvbnN0cnVjdGVkLCB0aGVuIGFzc3VtZQotICAgICAgICAgICAgLy8gdGhhdCB3ZSBuZWVkIHRvIGRvIHRoZSBzcGVjaWFsaXplZCAibWluaW1hbCIgbWFyc2hhbGxpbmcuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBhIHdlYiBzZXJ2aWNlIGlzIGNyZWF0ZWQgd2l0aG91dCB3c2dlbiwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgd3JhcHBlciBlbGVtZW50cyBhcmUKLSAgICAgKiBtaXNzaW5nLiAgSW4gc3VjaCBjYXNlcywgdXNlIHRoZSBkb2MvbGl0IHdyYXBwZWQgbWluaW1hbCBtYXJzaGFsbGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRG9jTGl0V3JhcHBlZE1pbmltYWwoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3ApIHsKLSAgICAgICAgaWYgKGlzRG9jTGl0V3JhcHBlZChvcCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IG9wLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0KHNlcnZpY2VEZXNjKTsKLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0V3JhcHBlciA9IG1hcnNoYWxEZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKG9wKTsKLSAgICAgICAgICAgIGlmICghZXhpc3RzKHJlcXVlc3RXcmFwcGVyKSkgewotICAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJbG9nLmRlYnVnKCJSZXF1ZXN0IHdyYXBwZXIgY2xhc3MgbmFtZSBpcyBOVUxMLiIpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9TdHJpbmcgcmVzcG9uc2VXcmFwcGVyID0gbWFyc2hhbERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUob3ApOwotICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlV3JhcHBlciA9IG1hcnNoYWxEZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZShvcCk7Ci0gICAgICAgICAgICBpZiAoIWV4aXN0cyhyZXNwb25zZVdyYXBwZXIpKSB7Ci0gICAgICAgICAgICAJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgCQlsb2cuZGVidWcoIlJlc3BvbnNlIHdyYXBwZXIgY2xhc3MgbmFtZSBpcyBOVUxMLiIpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gRG8gdGhlIHNhbWUgZm9yIHRoZSBmYXVsdCBiZWFucwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4aXN0cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gdHJ5IGFuZCBsb2FkIHRoZSBjbGFzcwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0F0dGFjaG1lbnQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvQXR0YWNobWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjA4NjZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvQXR0YWNobWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNvbnZlcnRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSUlPSW1hZ2U7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VXcml0ZXI7DQotaW1wb3J0IGphdmF4LmltYWdlaW8uc3RyZWFtLkltYWdlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkludGVybmV0SGVhZGVyczsNCi1pbXBvcnQgamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lQm9keVBhcnQ7DQotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuTWltZVBhcnREYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0vKioNCi0gKiBUaGUgQXR0YWNobWVudCBvYmplY3QgaGFzIGEgc2ltaWxhciBmdW5jdGlvbiBhcyB0aGUgDQotICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0LkVsZW1lbnQgb2JqZWN0Lg0KLSAqIFRoZSBFbGVtZW50IG9iamVjdCBpcyB1c2VkIHRvIA0KLSAqICAgIDEpIEdldCB0aGUgImVsZW1lbnQgcmVuZGVyZWQiIG9iamVjdCB0aGF0IGlzIG1hcnNoYWxsZWQvdW5tYXJzaGFsbGVkIGZyb20gdGhlIHdpcmUNCi0gKiAgICAyKSBHZXQgdGhlICJ0eXBlIHJlbmRlcmVkIiBvYmplY3QgdGhhdCBpcyB1c2VkIGFzIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaW4gdGhlIHNpZ25hdHVyZS4NCi0gKiAgICANCi0gKiBUaGUgQXR0YWNobWVudCBvYmplY3QgaGFzIGEgc2ltaWxhciByb2xlLiAgDQotICogVGhlIERhdGFIYW5kbGVyIG9iamVjdCBpcyB1c2VkIGZvciBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nLg0KLSAqIEFuZCB0aGUgZ2V0VmFsdWUgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBzaWduYXR1cmUgcmVwcmVzZW50YXRpb24uDQotICogDQotICoNCi0gKi8NCi1jbGFzcyBBdHRhY2htZW50IHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEF0dGFjaG1lbnQuY2xhc3MpOw0KLSAgICBEYXRhSGFuZGxlciBkaCA9IG51bGw7DQotICAgIFN0cmluZyBjaWQgPSBudWxsOw0KLSAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYURlc2MgPSBudWxsOw0KLSAgICBPYmplY3Qgc2lnVmFsdWUgPSBudWxsOw0KLSAgICBDbGFzcyBzaWdDbGFzcyA9IG51bGw7DQotICAgIFN0cmluZyBwYXJ0TmFtZSA9IG51bGw7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIHNldCBBdHRhY2htZW50IGZyb20gd2lyZSB1bm1hcnNoYWxsaW5nDQotICAgICAqIEBwYXJhbSBkaA0KLSAgICAgKiBAcGFyYW0gY2lkDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXR0YWNobWVudChEYXRhSGFuZGxlciBkaCwgU3RyaW5nIGNpZCkgew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25zdHJ1Y3Qgd2l0aCBkaD0iICsgZGguZ2V0Q29udGVudFR5cGUoKSArICIgY2lkPSIgKyBjaWQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGhpcy5kaCA9IGRoOw0KLSAgICAgICAgdGhpcy5jaWQgPSBjaWQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIEF0dGFjaG1lbnQgZnJvbSBzaWduYXR1cmUgZGF0YQ0KLSAgICAgKiBAcGFyYW0gc2lnVmFsdWUNCi0gICAgICogQHBhcmFtIHNpZ0NsYXNzDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXR0YWNobWVudChPYmplY3Qgc2lnVmFsdWUsIENsYXNzIHNpZ0NsYXNzLCBBdHRhY2htZW50RGVzY3JpcHRpb24gYURlc2MsIFN0cmluZyBwYXJ0TmFtZSkgew0KLSAgICAgICAgdGhpcy5zaWdWYWx1ZSA9IHNpZ1ZhbHVlOw0KLSAgICAgICAgdGhpcy5zaWdDbGFzcyA9IHNpZ0NsYXNzOw0KLSAgICAgICAgdGhpcy5hRGVzYyA9IGFEZXNjOw0KLSAgICAgICAgdGhpcy5wYXJ0TmFtZSA9IHBhcnROYW1lOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIERhdGFIYW5kbGVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0RGF0YUhhbmRsZXIoKSB7DQotICAgICAgICBpZiAoZGggPT0gbnVsbCkgew0KLSAgICAgICAgCS8vaWYgbnVsbCBESCB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksIHJldHVybiBpdCwgZG9uJ3QgY3JlYXRlIHNvbWV0aGluZyBlbHNlLg0KLSAgICAgICAgICAgIGlmIChzaWdWYWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbnRlbnRJRCBhbmQgbnVsbCBEYXRhSGFuZGxlcg0KLSAgICAgICAgICAgICAgICBnZXRDb250ZW50SUQoKTsgLy8gRm9yY2Ugc2V0dGluZyBvZiBjb250ZW50IGlkDQotICAgICAgICAgICAgICAgIGRoID0gKERhdGFIYW5kbGVyKSBudWxsOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlOiBjcmVhdGUgYSBEYXRhSGFuZGxlciBmcm9tIHRoZSBzaWdWYWx1ZSBvYmplY3QNCi0gICAgICAgICAgICAgICAgZGggPSBjcmVhdGVEYXRhSGFuZGxlcihzaWdWYWx1ZSwgc2lnQ2xhc3MsIGFEZXNjLmdldE1pbWVUeXBlcygpLCBnZXRDb250ZW50SUQoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRoOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIENvbnRlbnRJRA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SUQoKSB7DQotICAgICAgICBpZiAoY2lkID09IG51bGwpIHsNCi0gICAgICAgICAgICBjaWQgPSBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsNCi0gICAgICAgICAgICAvLyBQZXIgc3BlYywgdXNlIHRoZSBwYXJ0TmFtZSBpbiB0aGUgY29udGVudC1pZA0KLSAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cud3MtaS5vcmcvUHJvZmlsZXMvQXR0YWNobWVudHNQcm9maWxlLTEuMC5odG1sI1ZhbHVlLXNwYWNlX29mX0NvbnRlbnQtSWRfSGVhZGVyDQotICAgICAgICAgICAgaWYgKHBhcnROYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgY2lkID0gcGFydE5hbWUgKyAiPSIgKyBjaWQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNpZDsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBEYXRhSGFuZGxlciBjcmVhdGVEYXRhSGFuZGxlcihPYmplY3QgdmFsdWUsIENsYXNzIGNscywgU3RyaW5nW10gbWltZVR5cGVzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2lkKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdCBkYXRhIGhhbmRsZXIgZm9yICIgKyBjbHMgKyAiIGNpZD0iICsgY2lkKTsNCi0gICAgICAgIH0NCi0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gbnVsbDsNCi0gICAgICAgIGlmIChjbHMuaXNBc3NpZ25hYmxlRnJvbShEYXRhSGFuZGxlci5jbGFzcykpIHsNCi0gICAgICAgICAgICBkaCA9IChEYXRhSGFuZGxlcikgdmFsdWU7DQotICAgICAgICAgICAgaWYoZGggPT0gbnVsbCkgIA0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGRoOyAvL3JldHVybiBpZiBEYXRhSGFuZGxlciBpcyBudWxsDQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZW50ID0gZGguZ2V0Q29udGVudCgpOw0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udGVudCBpcyBhIFNvdXJjZSwgY29udmVydCB0byBhIFN0cmluZyBkdWUgdG8gDQotICAgICAgICAgICAgICAgIC8vIHByb2JsZW1zIHdpdGggdGhlIERhdGFDb250ZW50SGFuZGxlcg0KLSAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFNvdXJjZSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb252ZXJ0aW5nIERhdGFIYW5kbGVyIFNvdXJjZSBjb250ZW50IHRvICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkRhdGFIYW5kbGVyU3RyaW5nIGNvbnRlbnQiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IChieXRlW10pIENvbnZlcnRVdGlscy5jb252ZXJ0KGNvbnRlbnQsIGJ5dGVbXS5jbGFzcyk7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV3Q29udGVudCA9IG5ldyBTdHJpbmcoYnl0ZXMpOw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhSGFuZGxlcihuZXdDb250ZW50LCBtaW1lVHlwZXNbMF0pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGNyZWF0ZUJ5dGVzKHZhbHVlLCBjbHMsIG1pbWVUeXBlcyk7DQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBNSU1FIEJvZHkgUGFydA0KLSAgICAgICAgICAgICAgICBJbnRlcm5ldEhlYWRlcnMgaWggPSBuZXcgSW50ZXJuZXRIZWFkZXJzKCk7DQotICAgICAgICAgICAgICAgIGloLnNldEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUsIG1pbWVUeXBlc1swXSk7DQotICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBtYnAgPSBuZXcgTWltZUJvZHlQYXJ0KGloLCBieXRlcyk7DQotDQotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgZGF0YSBzb3VyY2UgZm9yIHRoZSBNSU1FIEJvZHkgUGFydA0KLSAgICAgICAgICAgICAgICBNaW1lUGFydERhdGFTb3VyY2UgZHMgPSBuZXcgTWltZVBhcnREYXRhU291cmNlKG1icCk7DQotDQotICAgICAgICAgICAgICAgIGRoID0gbmV3IERhdGFIYW5kbGVyKGRzKTsNCi0gICAgICAgICAgICAgICAgbWJwLnNldEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lELCBjaWQpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRoOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBjcmVhdGVCeXRlcyhPYmplY3QgdmFsdWUsIENsYXNzIGNscywgU3RyaW5nW10gbWltZVR5cGVzKSB7DQotICAgICAgICBpZiAoY2xzLmlzQXNzaWduYWJsZUZyb20oYnl0ZVtdLmNsYXNzKSkgew0KLSAgICAgICAgICAgIHJldHVybiAoYnl0ZVtdKSB2YWx1ZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoY2xzLmlzQXNzaWduYWJsZUZyb20oU3RyaW5nLmNsYXNzKSkgew0KLSAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgdmFsdWUpLmdldEJ5dGVzKCk7DQotICAgICAgICB9IGVsc2UgaWYgKGNscy5pc0Fzc2lnbmFibGVGcm9tKEltYWdlLmNsYXNzKSkgew0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVCeXRlc0Zyb21JbWFnZSgoSW1hZ2UpIHZhbHVlLCBtaW1lVHlwZXNbMF0pOw0KLSAgICAgICAgfSBlbHNlIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZSh2YWx1ZSwgYnl0ZVtdLmNsYXNzKSkgew0KLSAgICAgICAgICAgIHJldHVybiAoYnl0ZVtdKSBDb252ZXJ0VXRpbHMuY29udmVydCh2YWx1ZSwgYnl0ZVtdLmNsYXNzKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0UHJvYmxlbSIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXROYW1lKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlW10iKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNyZWF0ZUJ5dGVzRnJvbUltYWdlKEltYWdlIGltYWdlLCBTdHJpbmcgbWltZVR5cGUpICB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEltYWdlV3JpdGVyIGltYWdlV3JpdGVyID0gbnVsbDsNCi0gICAgICAgICAgICBCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSAoQnVmZmVyZWRJbWFnZSkgaW1hZ2U7DQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBqYXZheC5pbWFnZWlvLkltYWdlSU8uZ2V0SW1hZ2VXcml0ZXJzQnlNSU1FVHlwZShtaW1lVHlwZSk7DQotICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBpbWFnZVdyaXRlciA9IChJbWFnZVdyaXRlcikgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBJbWFnZU91dHB1dFN0cmVhbSBpb3MgPSBqYXZheC5pbWFnZWlvLkltYWdlSU8uY3JlYXRlSW1hZ2VPdXRwdXRTdHJlYW0oYmFvcyk7DQotICAgICAgICAgICAgaW1hZ2VXcml0ZXIuc2V0T3V0cHV0KGlvcyk7DQotICAgICAgICAgICAgaW1hZ2VXcml0ZXIud3JpdGUobmV3IElJT0ltYWdlKGJ1ZmZlcmVkSW1hZ2UsIG51bGwsIG51bGwpKTsNCi0gICAgICAgICAgICBpb3MuZmx1c2goKTsNCi0gICAgICAgICAgICBpbWFnZVdyaXRlci5kaXNwb3NlKCk7DQotICAgICAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsNCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjM2Y2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdEJhcmVNZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5NZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ29udmVydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXIgaW1wbGVtZW50cyBNZXRob2RNYXJzaGFsbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEb2NMaXRCYXJlTWV0aG9kTWFyc2hhbGxlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgRG9jTGl0QmFyZU1ldGhvZE1hcnNoYWxsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBkZW1hcnNoYWxSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cmV0dXJuIC4uLiA+Li4uPC9tOnBhcmFtPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICAoU09BUCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpcyBub3QgaW1wb3J0YW50LCBidXQKLSAgICAgICAgICAgIC8vICAgICAgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcsIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG5hbWUgY29ycmVzcG9uZHMgdG8gCi0gICAgICAgICAgICAvLyAgICAgIGEgc2NoZW1hIHJvb3QgZWxlbWVudCkKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgaXMgZGVmaW5lZCBieSBzY2hlbWE7IHRodXMgaW4gbW9zdCBjYXNlcwotICAgICAgICAgICAgLy8gICAgICBhbiB4c2k6dHlwZSB3aWxsIG5vdCBiZSBwcmVzZW50Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyB1bm1hcnNoYWwgaW5mb3JtYXRpb24gc28gdGhhdCB3ZSBjYW4gc3BlZWQgdXAgcHJvY2Vzc2luZwotICAgICAgICAgICAgLy8gdGhlIG5leHQgdGltZS4KLSAgICAgICAgICAgIGlmIChzaG91bGRSZWdpc3RlclVubWFyc2hhbEluZm8ob3BlcmF0aW9uRGVzYywgbWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpKSkgewotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5yZWdpc3RlclVubWFyc2hhbEluZm8obWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSByZXR1cm4gdmFsdWUuCi0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXR1cm5JbkJvZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSAKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBdHRhY2htZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MuZ2V0QXR0YWNobWVudFR5cGUoKSA9PSBBdHRhY2htZW50VHlwZS5TV0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNpZCA9IG1lc3NhZ2UuZ2V0QXR0YWNobWVudElEKDApOwotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1lc3NhZ2UuZ2V0RGF0YUhhbmRsZXIoY2lkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB3ZWJyZXN1bHQgaXMgaW4gdGhlIGhlYWRlciwgd2UgbmVlZCB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQuCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRSZXR1cm5FbGVtZW50KHBhY2thZ2VzLCBtZXNzYWdlLCBudWxsLCBmYWxzZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5udW1PdXRwdXRCb2R5UGFyYW1zKHBkcykgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsIG1lc3NhZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5udW1PdXRwdXRCb2R5UGFyYW1zKHBkcykgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSByZXR1cm5FbGVtZW50LmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHJldHVyblZhbHVlLCByZXR1cm5UeXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHJldHVyblZhbHVlLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVW5tYXJzaGFsbCB0aGUgUGFyYW1WYWx1ZXMgZnJvbSB0aGUgTWVzc2FnZQotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNSZXR1cm5JbkJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7IC8vIGFsd2F5cyB1bm1hcnNoYWwgd2l0aCAiYnkgZWxlbWVudCIgbW9kZQotCi0gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgcmVzcG9uc2UgSG9sZGVycwotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnVwZGF0ZVJlc3BvbnNlU2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCwgc2lnbmF0dXJlQXJncyk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZGVtYXJzaGFsUmVxdWVzdChNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpwYXJhbSAuLiA+Li4uPC9tOnBhcmFtPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5LiAgCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrcyAobTpwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHNjaGVtYQotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hIChhbmQgcHJvYmFibHkKLSAgICAgICAgICAgIC8vICAgICAgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIHVubWFyc2hhbCBpbmZvcm1hdGlvbiBzbyB0aGF0IHdlIGNhbiBzcGVlZCB1cCBwcm9jZXNzaW5nCi0gICAgICAgICAgICAvLyB0aGUgbmV4dCB0aW1lLgotICAgICAgICAgICAgaWYgKHNob3VsZFJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhvcGVyYXRpb25EZXNjLCBtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzS2V5KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWwgdGhlIFBhcmFtVmFsdWVzIGZyb20gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOyAvLyBhbHdheXMgdW5tYXJzaGFsIHVzaW5nICJieSBlbGVtZW50IiBtb2RlCi0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBzaWduYXR1cmUgYXJndW1lbnRzCi0gICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QpOwotCi0gICAgICAgICAgICByZXR1cm4gc2lnQXJndW1lbnRzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXNwb25zZShPYmplY3QgcmV0dXJuT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOnJldHVybiAuLi4gPi4uLjwvbTpwYXJhbT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrcyAobTpwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHNjaGVtYS4KLSAgICAgICAgICAgIC8vICAgICAgKFNPQVAgaW5kaWNhdGVzIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaXMgbm90IGltcG9ydGFudCwgYnV0Ci0gICAgICAgICAgICAvLyAgICAgIGZvciBkb2N1bWVudCBwcm9jZXNzaW5nLCB3ZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBuYW1lIGNvcnJlc3BvbmRzIHRvIAotICAgICAgICAgICAgLy8gICAgICBhIHNjaGVtYSByb290IGVsZW1lbnQpCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIGlzIGRlZmluZWQgYnkgc2NoZW1hOyB0aHVzIGluIG1vc3QgY2FzZXMKLSAgICAgICAgICAgIC8vICAgICAgYW4geHNpOnR5cGUgd2lsbCBub3QgYmUgcHJlc2VudAotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgcmV0dXJuIG9iamVjdCBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZSAhPSB2b2lkLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjID0gCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjLmdldEF0dGFjaG1lbnRUeXBlKCkgPT0gQXR0YWNobWVudFR5cGUuU1dBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gQXR0YWNobWVudCBvYmplY3Qgd2l0aCB0aGUgc2lnbmF0dXJlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudChyZXR1cm5PYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50RGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5hZGREYXRhSGFuZGxlcihhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmdldENvbnRlbnRJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwZEVsZW1lbnRFcnIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJldHVybkVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZXR1cm5RTmFtZSA9IG5ldyBRTmFtZShvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhyZXR1cm5UeXBlKS5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGVuIGEgc2NoZW1hIGRlZmluZXMgYSBTaW1wbGVUeXBlIHdpdGggeHNkIGxpc3QgamF4d3MgdG9vbGluZyBnZW5lcmF0ZXMgYXJ0LWVmZmVjdHMgd2l0aCBhcnJheSByYXRoZXIgdGhhbiBhIGphdmEudXRpbC5MaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBIb3dldmVyIHRoZSBPYmplY3RGYWN0b3J5IGRlZmluaXRpb24gdXNlcyBhIExpc3QgYW5kIHRodXMgbWFyc2hhbGxpbmcgZmFpbHMuIExldHMgY29udmVydCB0aGUgQXJyYXlzIHRvIExpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGxpc3Q9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXR1cm5UeXBlLmlzQXJyYXkoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgY291bnQgPSAwOyBjb3VudCA8IEFycmF5LmdldExlbmd0aChyZXR1cm5PYmplY3QpOyBjb3VudCsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBBcnJheS5nZXQocmV0dXJuT2JqZWN0LCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChsaXN0LCByZXR1cm5RTmFtZSwgTGlzdC5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShyZXR1cm5FbGVtZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIGFsd2F5cyBtYXJzaGFsIHVzaW5nICJieSBlbGVtZW50IiBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGhvbGRlciBvYmplY3RzIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBQdXQgdmFsdWVzIG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy50b01lc3NhZ2UocHZMaXN0LCBtLCBwYWNrYWdlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEVuYWJsZSBTV0EgZm9yIG5lc3RlZCBTd2FSZWYgYXR0YWNobWVudHMKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXF1ZXN0KE9iamVjdFtdIHNpZ25hdHVyZUFyZ3VtZW50cywgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCkpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOnBhcmFtIC4uID4uLi48L206cGFyYW0+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIChkYXRhOmZvbykgaXMgZGVmaW5lZCBieSBzY2hlbWEgKGFuZCBwcm9iYWJseQotICAgICAgICAgICAgLy8gICAgICBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBvYmplY3QgcmVwcmVzZW50IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzLgotICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGFyZ3VtZW50cyBhcmUgYm90aCBob2xkZXJzIGFuZCBub24taG9sZGVycwotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2lnbmF0dXJlIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB2YWx1ZXMgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShwdkxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgZmF1bHQgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm1hcnNoYWxGYXVsdFJlc3BvbnNlKHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0pOwotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBkZW1hcnNoYWxGYXVsdFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmRlbWFyc2hhbEZhdWx0UmVzcG9uc2Uob3BlcmF0aW9uRGVzYywgbWFyc2hhbERlc2MsIG1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJpbmcgVW5tYXJzaGFsSW5mbyB3aWxsIGNhdXNlIEpBWEIgdW5tYXJzaGFsbGluZyB0byBvY2N1cgotICAgICAqIGR1cmluZyBTdEFYT01CdWlsZGVyIHByb2Nlc3NpbmcgdGhlIG5leHQgdGltZSBhbiB4bWwgbWVzc2FnZSBpcyB0YXJnZXJlZAotICAgICAqIGF0IHRoaXMgd3NkbCBvcGVyYXRpb24uICBJbiBzb21lIGNhc2VzIHdlIHdhbnQgdG8gZGlzYWJsZSB0aGlzIGVhcmx5IHVubWFyc2hhbGxpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiB0cnVlIG9yIGZhbHNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRSZWdpc3RlclVubWFyc2hhbEluZm8oT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICAKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcERlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIGhhdmUgYSBnZW5lcmljIHR5cGUgb2YgT2JqZWN0LCB0aGVuCi0gICAgICAgIC8vIGF2b2lkIGVhcmx5IHVubWFyc2hhbGxpbmcKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICBpZiAocGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbShPYmplY3QuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAob3BEZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgb3BEZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKS5pc0Fzc2lnbmFibGVGcm9tKE9iamVjdC5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdEJhcmVNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Eb2NMaXRCYXJlTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFhNzM1Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdEJhcmVNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5NZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ29udmVydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotCi0vKioKLSAqIFRoZSBEb2MvTGl0IFdyYXBwZWQgTWluaW1hbCBNYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiAxKSBUaGUgd2ViIHNlcnZpY2UgaXMgRG9jL0xpdCBtaW5pbmFsLCBhbmQgMikKLSAqIEpBWEIgYXJ0aWZhY3RzIGFyZSBtaXNzaW5nIChpLmUuIHdlIGRvbid0IGhhdmUgT2JqZWN0RmFjdG9yaWVzKQotICovCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZU1pbmltYWxNZXRob2RNYXJzaGFsbGVyIGltcGxlbWVudHMgTWV0aG9kTWFyc2hhbGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRG9jTGl0QmFyZU1pbmltYWxNZXRob2RNYXJzaGFsbGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBEb2NMaXRCYXJlTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBkZW1hcnNoYWxSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cmV0dXJuIC4uLiA+Li4uPC9tOnBhcmFtPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICAoU09BUCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpcyBub3QgaW1wb3J0YW50LCBidXQKLSAgICAgICAgICAgIC8vICAgICAgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcsIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG5hbWUgY29ycmVzcG9uZHMgdG8gCi0gICAgICAgICAgICAvLyAgICAgIGEgc2NoZW1hIHJvb3QgZWxlbWVudCkKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgaXMgZGVmaW5lZCBieSBzY2hlbWE7IHRodXMgaW4gbW9zdCBjYXNlcwotICAgICAgICAgICAgLy8gICAgICBhbiB4c2k6dHlwZSB3aWxsIG5vdCBiZSBwcmVzZW50Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSByZXR1cm4gdmFsdWUuCi0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXR1cm5JbkJvZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSAKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBdHRhY2htZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MuZ2V0QXR0YWNobWVudFR5cGUoKSA9PSBBdHRhY2htZW50VHlwZS5TV0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNpZCA9IG1lc3NhZ2UuZ2V0QXR0YWNobWVudElEKDApOwotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG1lc3NhZ2UuZ2V0RGF0YUhhbmRsZXIoY2lkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSAiYnlKYXZhVHlwZSIgdW5tYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYnlKYXZhVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQocmV0dXJuVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieUphdmFUeXBlID0gcmV0dXJuVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgd2VicmVzdWx0IGlzIGluIHRoZSBoZWFkZXIsIHdlIG5lZWQgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0LgotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJldHVybkVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmV0dXJuRWxlbWVudChwYWNrYWdlcywgbWVzc2FnZSwgYnlKYXZhVHlwZSwgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubnVtT3V0cHV0Qm9keVBhcmFtcyhwZHMpID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXR1cm5FbGVtZW50KHBhY2thZ2VzLCBtZXNzYWdlLCBieUphdmFUeXBlLCBvcGVyYXRpb25EZXNjLmlzTGlzdFR5cGUoKSwgZmFsc2UsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubnVtT3V0cHV0Qm9keVBhcmFtcyhwZHMpID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXNSZXR1cm5JbkJvZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vVE9ETyBzaG91bGQgd2UgYWxsb3cgbnVsbCBpZiB0aGUgcmV0dXJuIGlzIGEgaGVhZGVyPwotICAgICAgICAgICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAgICAgICAgIC8vQXMgcGVyIEpBWFdTIFNwZWNpZmljYXRpb24gc2VjdGlvbiAzLjYuMi4zIGlmIGEgbnVsbCB2YWx1ZSBpcyBwYXNzZXMgYXMgYW4gYXJndW1lbnQgCi0gICAgICAgICAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gcmV0dXJuRWxlbWVudC5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHJldHVyblZhbHVlLCByZXR1cm5UeXBlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHJldHVyblZhbHVlLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlICJieSBKYXZhIFR5cGUiIHVubWFyc2hhbGxpbmcgZm9yIAotICAgICAgICAgICAgLy8gYWxsYWxsIG5vbi1KQVhCIG9iamVjdHMKLSAgICAgICAgICAgIENsYXNzW10gamF2YVR5cGVzID0gbmV3IENsYXNzW3Bkcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQodHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFUeXBlc1tpXSA9IHR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWxsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXMpOyAvLyBieUphdmFUeXBlIHVubWFyc2hhbGxpbmcKLQotICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIHJlc3BvbnNlIEhvbGRlcnMKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy51cGRhdGVSZXNwb25zZVNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QsIHNpZ25hdHVyZUFyZ3MpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIGRlbWFyc2hhbFJlcXVlc3QoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cGFyYW0gLi4gPi4uLjwvbTpwYXJhbT4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keS4gIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKG06cGFyYW0pIGFyZSBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAoYW5kIHByb2JhYmx5Ci0gICAgICAgICAgICAvLyAgICAgIGlzIG5vdCBwcmVzZW50IGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgdW5tYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGxhbGwgbm9uLUpBWEIgb2JqZWN0cwotICAgICAgICAgICAgQ2xhc3NbXSBqYXZhVHlwZXMgPSBuZXcgQ2xhc3NbcGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgbm90IGEgSkFYQiBSb290IEVsZW1lbnQKLSAgICAgICAgICAgICAgICBpZiAoTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXNbaV0gPSB0eXBlOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVubWFyc2hhbCB0aGUgUGFyYW1WYWx1ZXMgZnJvbSB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIC8vIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YVR5cGVzKTsgLy8gbmV2ZXIgdW5tYXJzaGFsIGJ5IHR5cGUgZm9yIGRvYy9saXQgYmFyZQotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cwotICAgICAgICAgICAgT2JqZWN0W10gc2lnQXJndW1lbnRzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVJlcXVlc3RTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0KTsKLSAgICAgICAgICAgIHJldHVybiBzaWdBcmd1bWVudHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlc3BvbnNlKE9iamVjdCByZXR1cm5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0KLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06cmV0dXJuIC4uLiA+Li4uPC9tOnBhcmFtPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hLgotICAgICAgICAgICAgLy8gICAgICAoU09BUCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpcyBub3QgaW1wb3J0YW50LCBidXQKLSAgICAgICAgICAgIC8vICAgICAgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcsIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIG5hbWUgY29ycmVzcG9uZHMgdG8gCi0gICAgICAgICAgICAvLyAgICAgIGEgc2NoZW1hIHJvb3QgZWxlbWVudCkKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgaXMgZGVmaW5lZCBieSBzY2hlbWE7IHRodXMgaW4gbW9zdCBjYXNlcwotICAgICAgICAgICAgLy8gICAgICBhbiB4c2k6dHlwZSB3aWxsIG5vdCBiZSBwcmVzZW50Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSByZXR1cm4gb2JqZWN0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSAKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBdHRhY2htZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudERlc2MuZ2V0QXR0YWNobWVudFR5cGUoKSA9PSBBdHRhY2htZW50VHlwZS5TV0EpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBBdHRhY2htZW50IG9iamVjdCB3aXRoIHRoZSBzaWduYXR1cmUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0YWNobWVudCA9IG5ldyBBdHRhY2htZW50KHJldHVybk9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uYWRkRGF0YUhhbmRsZXIoYXR0YWNobWVudC5nZXREYXRhSGFuZGxlcigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5nZXRDb250ZW50SUQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGRFbGVtZW50RXJyIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYnlKYXZhVHlwZSBtYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYnlKYXZhVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQocmV0dXJuVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieUphdmFUeXBlID0gcmV0dXJuVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJldHVyblFOYW1lID0gbmV3IFFOYW1lKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKHJldHVyblR5cGUpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHJldHVybkVsZW1lbnQsIHJldHVyblR5cGUsIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5SmF2YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGhvbGRlciBvYmplY3RzIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiBtYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgYm9keSBlbGVtZW50cyBhbmQgYWxsIG5vbi1KQVhCIG9iamVjdHMKLSAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHBkZSA6IHBkZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkZS5nZXRQYXJhbSgpOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudCh0eXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgcGRlLnNldEJ5SmF2YVR5cGVDbGFzcyh0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFB1dCB2YWx1ZXMgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShwZGVMaXN0LCBtLCBwYWNrYWdlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEVuYWJsZSBTV0EgZm9yIG5lc3RlZCBTd2FSZWYgYXR0YWNobWVudHMKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXF1ZXN0KE9iamVjdFtdIHNpZ25hdHVyZUFyZ3VtZW50cywgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCkpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOnBhcmFtIC4uID4uLi48L206cGFyYW0+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChtOnBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgc2NoZW1hCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIChkYXRhOmZvbykgaXMgZGVmaW5lZCBieSBzY2hlbWEgKGFuZCBwcm9iYWJseQotICAgICAgICAgICAgLy8gICAgICBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBvYmplY3QgcmVwcmVzZW50IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzLgotICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGFyZ3VtZW50cyBhcmUgYm90aCBob2xkZXJzIGFuZCBub24taG9sZGVycwotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2lnbmF0dXJlIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgbWFyc2hhbGxpbmcgZm9yIAotICAgICAgICAgICAgLy8gYWxsIGJvZHkgZWxlbWVudHMgYW5kIGFsbCBub24tSkFYQiBvYmplY3RzCi0gICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBwZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZGUuZ2V0UGFyYW0oKTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQodHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBkZS5zZXRCeUphdmFUeXBlQ2xhc3ModHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXQgdmFsdWVzIG9udG8gdGhlIG1lc3NhZ2UuLi5tYXJzaGFsbGluZyBieSB0eXBlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHBkZUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgZmF1bHQgb250byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm1hcnNoYWxGYXVsdFJlc3BvbnNlKHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0pOwotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBkZW1hcnNoYWxGYXVsdFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmRlbWFyc2hhbEZhdWx0UmVzcG9uc2Uob3BlcmF0aW9uRGVzYywgbWFyc2hhbERlc2MsIG1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRNZXRob2RNYXJzaGFsbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRNZXRob2RNYXJzaGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDFhYWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Eb2NMaXRXcmFwcGVkTWV0aG9kTWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNvbnZlcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuSkFYQldyYXBwZXJUb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsLkpBWEJXcmFwcGVyVG9vbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotcHVibGljIGNsYXNzIERvY0xpdFdyYXBwZWRNZXRob2RNYXJzaGFsbGVyIGltcGxlbWVudHMgTWV0aG9kTWFyc2hhbGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRG9jTGl0V3JhcHBlZE1ldGhvZE1hcnNoYWxsZXIuY2xhc3MpOwotCi0KLSAgICBwdWJsaWMgRG9jTGl0V3JhcHBlZE1ldGhvZE1hcnNoYWxsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBkZW1hcnNoYWxSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BlcmF0aW9uUmVzcG9uc2UgLi4uID4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uUmVzcG9uc2U+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keSBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uUmVzcG9uc2UpIGlzIGRlZmluZWQgYnkgdGhlIHNjaGVtYS4KLSAgICAgICAgICAgIC8vICAgICAgSXQgbWF0Y2hlcyB0aGUgb3BlcmF0aW9uIG5hbWUgKyAiUmVzcG9uc2UiLCBhbmQgaXQgaGFzIGEgY29ycmVzcG9uZGluZyBKQVhCIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgZWxlbWVudCBpcyBjYWxsZWQgdGhlIHdyYXBwZXIgZWxlbWVudAotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyBhcmUgKHBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhpcyB1bm1hcnNoYWwgaW5mb3JtYXRpb24gc28gdGhhdCB3ZSBjYW4gc3BlZWQgdXAgcHJvY2Vzc2luZwotICAgICAgICAgICAgLy8gdGhlIG5leHQgdGltZS4KLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5yZWdpc3RlclVubWFyc2hhbEluZm8obWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXNLZXkpOwotCi0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgYSByZXR1cm5WYWx1ZSBpcyBleHBlY3RlZC4KLSAgICAgICAgICAgIC8vIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIGFuIGNoaWxkIGVsZW1lbnQKLSAgICAgICAgICAgIC8vIFRoZSB3cmFwcGVyIGVsZW1lbnQgCi0gICAgICAgICAgICAvLyBvciBudWxsCi0gICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0NoaWxkUmV0dXJuID0gIW9wZXJhdGlvbkRlc2MuaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSAhPSBudWxsKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNOb1JldHVybiA9IChyZXR1cm5UeXBlID09IHZvaWQuY2xhc3MpOwotCi0gICAgICAgICAgICAvLyBJbiB1c2FnZT1XUkFQUEVELCB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlIEpBWEIgYmxvY2sgaW5zaWRlIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gR2V0IHRoaXMgYmxvY2sKLSAgICAgICAgICAgIEpBWEJCbG9ja0NvbnRleHQgYmxvY2tDb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMsIHBhY2thZ2VzS2V5KTsKLSAgICAgICAgICAgIGJsb2NrQ29udGV4dC5zZXRXZWJTZXJ2aWNlTmFtZXNwYWNlKGVkLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChKQVhCQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBtZXNzYWdlLmdldEJvZHlCbG9jayhibG9ja0NvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICAgICAgT2JqZWN0IHdyYXBwZXJPYmplY3QgPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gVGhlIGNoaWxkIGVsZW1lbnRzIGFyZSB3aXRoaW4gdGhlIG9iamVjdCB0aGF0IAotICAgICAgICAgICAgLy8gcmVwcmVzZW50cyB0aGUgdHlwZQotICAgICAgICAgICAgaWYgKHdyYXBwZXJPYmplY3QgaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHdyYXBwZXJPYmplY3QgPSAoKEpBWEJFbGVtZW50KXdyYXBwZXJPYmplY3QpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVzZSB0aGUgd3JhcHBlciB0b29sIHRvIGdldCB0aGUgY2hpbGQgb2JqZWN0cy4KLSAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBuYW1lcyBmb3IgdGhlIG91dHB1dCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+IHBkTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIGlmIChwZC5nZXRNb2RlKCkgPT0gTW9kZS5PVVQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLklOT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChwZC5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBwZExpc3QuYWRkKHBkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRoZSByZXR1cm4gbmFtZSBpcyBhZGRlZCBhcyB0aGUgbGFzdCBuYW1lCi0gICAgICAgICAgICBpZiAoaXNDaGlsZFJldHVybiAmJiAhaXNOb1JldHVybikgewotICAgICAgICAgICAgICAgIG5hbWVzLmFkZChvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGNoaWxkIG9iamVjdHMKLSAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSB3cmFwcGVyVG9vbC51bldyYXAod3JhcHBlck9iamVjdCwgbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0LmdldENsYXNzKCkpKTsKLQotICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSBhIGxpc3Qgb2YgcGFyYW1WYWx1ZXMgc28gdGhhdCB3ZSBjYW4gcG9wdWxhdGUgdGhlIHNpZ25hdHVyZQotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IG5ldyBBcnJheUxpc3Q8UERFbGVtZW50PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb2JqZWN0c1tpXTsKLSAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGluIHRoZSBQREVsZW1lbnQgbXVzdCBiZSBhbiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcGQuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpLmhhc1htbFJvb3RFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudCh2YWx1ZSwgcU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdkxpc3QuYWRkKG5ldyBQREVsZW1lbnQocGQsIGVsZW1lbnQsIG51bGwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIHJlc3BvbnNlIEhvbGRlcnMgaW4gdGhlIHNpZ25hdHVyZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnVwZGF0ZVJlc3BvbnNlU2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCwgc2lnbmF0dXJlQXJncyk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBnZXQgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgaWYgKGlzTm9SZXR1cm4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ2hpbGRSZXR1cm4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IG9iamVjdHNbb2JqZWN0cy5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgICAgICAvLyByZXR1cm5WYWx1ZSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggSkFYLVdTIHNpZ25hdHVyZQotICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShyZXR1cm5WYWx1ZSwgcmV0dXJuVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBDb252ZXJ0VXRpbHMuY29udmVydChyZXR1cm5WYWx1ZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdENsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJuVmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiByZXR1cm5WYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0UHJvYmxlbSIsIG9iamVjdENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gd3JhcHBlck9iamVjdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBkZW1hcnNoYWxSZXF1ZXN0KE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOm9wZXJhdGlvbj4KLSAgICAgICAgICAgIC8vICAgICAgPHBhcmFtPmhlbGxvPC9wYXJhbT4KLSAgICAgICAgICAgIC8vICAgIDwvbTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkuICAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uKSBpcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEgYW5kIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgaXMgY2FsbGVkIHRoZSB3cmFwcGVyIGVsZW1lbnQuICBUaGUgd3JhcHBlciBlbGVtZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgSkFYQiBlbGVtZW50IHBvam8uCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSBwYXJhbWV0ZXJzIChtOnBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnJlZ2lzdGVyVW5tYXJzaGFsSW5mbyhtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlc0tleSk7Ci0KLSAgICAgICAgICAgIC8vIEluIHVzYWdlPVdSQVBQRUQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgSkFYQiBibG9jayBpbnNpZGUgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyBHZXQgdGhpcyBibG9jawotICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0NvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotICAgICAgICAgICAgYmxvY2tDb250ZXh0LnNldFdlYlNlcnZpY2VOYW1lc3BhY2UoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKGJsb2NrQ29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICBPYmplY3Qgd3JhcHBlck9iamVjdCA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotCi0gICAgICAgICAgICAvLyBUaGUgY2hpbGQgZWxlbWVudHMgYXJlIHdpdGhpbiB0aGUgb2JqZWN0IHRoYXQgCi0gICAgICAgICAgICAvLyByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICAgICAgICBpZiAod3JhcHBlck9iamVjdCBpbnN0YW5jZW9mIEpBWEJFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgd3JhcHBlck9iamVjdCA9ICgoSkFYQkVsZW1lbnQpd3JhcHBlck9iamVjdCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZ2V0IHRoZSBjaGlsZCBvYmplY3RzLgotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIG5hbWVzIGZvciB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uPiBwZExpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocGQuZ2V0TW9kZSgpID09IE1vZGUuSU4gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLklOT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChwZC5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBwZExpc3QuYWRkKHBkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBjaGlsZCBvYmplY3RzCi0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gd3JhcHBlclRvb2wudW5XcmFwKHdyYXBwZXJPYmplY3QsIG5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlck9iamVjdC5nZXRDbGFzcygpKSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBjcmVhdGUgYSBsaXN0IG9mIHBhcmFtVmFsdWVzIAotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IG5ldyBBcnJheUxpc3Q8UERFbGVtZW50PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb2JqZWN0c1tpXTsKLSAgICAgICAgICAgICAgICAvLyBUaGUgb2JqZWN0IGluIHRoZSBQREVsZW1lbnQgbXVzdCBiZSBhbiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSkuaGFzWG1sUm9vdEVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudCh2YWx1ZSwgcU5hbWUsIHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB2TGlzdC5hZGQobmV3IFBERWxlbWVudChwZCwgZWxlbWVudCwgbnVsbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cwotICAgICAgICAgICAgT2JqZWN0W10gc2lnQXJndW1lbnRzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVJlcXVlc3RTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0KTsKLQotICAgICAgICAgICAgcmV0dXJuIHNpZ0FyZ3VtZW50czsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVzcG9uc2UoT2JqZWN0IHJldHVybk9iamVjdCwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICBTdHJpbmcgcGFja2FnZXNLZXkgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpOwotCi0gICAgICAgIC8vIFdlIHdhbnQgdG8gcmVzcG9uZCB3aXRoIHRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSByZXF1ZXN0LAotICAgICAgICAvLyBJdCB0aGUgcHJvdG9jb2wgaXMgbnVsbCwgdGhlbiB1c2UgdGhlIFByb3RvY29sIGRlZmluZWQgYnkgdGhlIGJpbmRpbmcKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFNhbXBsZSBEb2N1bWVudCBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOm9wZXJhdGlvblJlc3BvbnNlIC4uLiA+Ci0gICAgICAgICAgICAvLyAgICAgICA8cGFyYW0+aGVsbG88L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wZXJhdGlvblJlc3BvbnNlPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vICAgMikgVGhlIGRhdGEgYmxvY2tzIGFyZSBsb2NhdGVkIHVuZGVybmVhdGggdGhlIGJvZHkgZWxlbWVudC4gCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrIChtOm9wZXJhdGlvblJlc3BvbnNlKSBpcyBkZWZpbmVkIGJ5IHRoZSBzY2hlbWEuCi0gICAgICAgICAgICAvLyAgICAgIEl0IG1hdGNoZXMgdGhlIG9wZXJhdGlvbiBuYW1lICsgIlJlc3BvbnNlIiwgYW5kIGl0IGhhcyBhIGNvcnJlc3BvbmRpbmcgSkFYQiBlbGVtZW50LgotICAgICAgICAgICAgLy8gICAgICBUaGlzIGVsZW1lbnQgaXMgY2FsbGVkIHRoZSB3cmFwcGVyIGVsZW1lbnQKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHBhcmFtZXRlcnMgYXJlIChwYXJhbSkgYXJlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSB3cmFwcGVyIGVsZW1lbnQuCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gbWFyc2hhbERlc2MuZ2V0TWVzc2FnZUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIEluIHVzYWdlPVdSQVBQRUQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgYmxvY2sgaW4gdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlQXJndW1lbnRzIHJlcHJlc2VudCB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhhdCBibG9jawotICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gY29udmVydCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cyBpbnRvIGEgbGlzdAotICAgICAgICAgICAgLy8gb2YgcGFyYW1ldGVyIHZhbHVlcwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB3ZSB3YW50IHRvIGNyZWF0ZSBhIHNpbmdsZSBKQVhCIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgCi0gICAgICAgICAgICAvLyBQYXJhbWV0ZXJWYWx1ZXMuICBXZSB3aWxsIHVzZSB0aGUgd3JhcHBlciB0b29sIHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGlucHV0cyB0byB0aGUgd3JhcHBlciB0b29sCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvYmplY3RMaXN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDbGFzcz4gIGRlY2xhcmVkQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0gICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBwZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBsaXN0IGNvbnRhaW5zIHR5cGUgcmVuZGVyZWQgb2JqZWN0cwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBkZS5nZXRFbGVtZW50KCkuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZGNsQ2xhc3MgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbmFtZUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgIG9iamVjdExpc3QucHV0KG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBkZWNsYXJlZENsYXNzTWFwLnB1dChuYW1lLCBkY2xDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCB0aGUgcmV0dXJuIG9iamVjdCB0byB0aGUgbmFtZUxpc3QgYW5kIG9iamVjdExpc3QKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpOwotICAgICAgICAgICAgICAgIG5hbWVMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICBvYmplY3RMaXN0LnB1dChuYW1lLCByZXR1cm5PYmplY3QpOwotICAgICAgICAgICAgICAgIGRlY2xhcmVkQ2xhc3NNYXAucHV0KG5hbWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3cgY3JlYXRlIHRoZSBzaW5nbGUgSkFYQiBlbGVtZW50Ci0gICAgICAgICAgICBTdHJpbmcgd3JhcHBlck5hbWUgPSBtYXJzaGFsRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICBDbGFzcyBjbHM7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNscyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5sb2FkQ2xhc3Mod3JhcHBlck5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICBjbHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKHdyYXBwZXJOYW1lLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gd3JhcHBlclRvb2wud3JhcChjbHMsIG5hbWVMaXN0LCBvYmplY3RMaXN0LCBkZWNsYXJlZENsYXNzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKGNscykpOwotCi0gICAgICAgICAgICBRTmFtZSB3cmFwcGVyUU5hbWUgPSBuZXcgUU5hbWUob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG9iamVjdCBjYW4gYmUgcmVuZGVyZWQgYXMgYW4gZWxlbWVudAotICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhjbHMpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgSkFYQkVsZW1lbnQod3JhcHBlclFOYW1lLCBjbHMsIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEVuYWJsZSBTV0EgZm9yIG5lc3RlZCBTd2FSZWYgYXR0YWNobWVudHMKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMoKSkgewotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgb2JqZWN0IGludG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChKQVhCQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0NvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotICAgICAgICAgICAgYmxvY2tDb250ZXh0LnNldFdlYlNlcnZpY2VOYW1lc3BhY2UoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBmYWN0b3J5LmNyZWF0ZUZyb20ob2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclFOYW1lKTsKLSAgICAgICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlcXVlc3QoT2JqZWN0W10gc2lnbmF0dXJlQXJndW1lbnRzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5LiAgCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrIChtOm9wZXJhdGlvbikgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hIGFuZCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAgICBUaGlzIGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50LiAgVGhlIHdyYXBwZXIgZWxlbWVudCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudCBwb2pvLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyAobTpwYXJhbSkgYXJlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSB3cmFwcGVyIGVsZW1lbnQuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gbWFyc2hhbERlc2MuZ2V0TWVzc2FnZUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIEluIHVzYWdlPVdSQVBQRUQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgYmxvY2sgaW4gdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlQXJndW1lbnRzIHJlcHJlc2VudCB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhhdCBibG9jawotICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gY29udmVydCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cyBpbnRvIGxpc3QKLSAgICAgICAgICAgIC8vIG9mIHBhcmFtZXRlciB2YWx1ZXMKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyB3ZSB3YW50IHRvIGNyZWF0ZSBhIHNpbmdsZSBKQVhCIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgCi0gICAgICAgICAgICAvLyBQYXJhbWV0ZXJWYWx1ZXMuICBXZSB3aWxsIHVzZSB0aGUgd3JhcHBlciB0b29sIHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGlucHV0cyB0byB0aGUgd3JhcHBlciB0b29sCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvYmplY3RMaXN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDbGFzcz4gZGVjbGFyZWRDbGFzc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHB2IDogcHZMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwdi5nZXRQYXJhbSgpLmdldFBhcmFtZXRlck5hbWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBvYmplY3QgbGlzdCBjb250YWlucyB0eXBlIHJlbmRlcmVkIG9iamVjdHMKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwdi5nZXRFbGVtZW50KCkuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZGNsQ2xhc3MgPSBwdi5nZXRQYXJhbSgpLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICBuYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgICAgb2JqZWN0TGlzdC5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGRlY2xhcmVkQ2xhc3NNYXAucHV0KG5hbWUsIGRjbENsYXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSB0aGUgc2luZ2xlIEpBWEIgZWxlbWVudCAKLSAgICAgICAgICAgIFN0cmluZyB3cmFwcGVyTmFtZSA9IG1hcnNoYWxEZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICAgICAgQ2xhc3MgY2xzOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKHdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgY2xzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyh3cmFwcGVyTmFtZSwgZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlclRvb2wgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IHdyYXBwZXJUb29sLndyYXAoY2xzLCBuYW1lTGlzdCwgb2JqZWN0TGlzdCwgZGVjbGFyZWRDbGFzc01hcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoY2xzKSk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHdyYXBwZXJRTmFtZSA9IG5ldyBRTmFtZShvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG9iamVjdCBjYW4gYmUgcmVuZGVyZWQgYXMgYW4gZWxlbWVudAotICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhjbHMpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgSkFYQkVsZW1lbnQod3JhcHBlclFOYW1lLCBjbHMsIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEVuYWJsZSBTV0EgZm9yIG5lc3RlZCBTd2FSZWYgYXR0YWNobWVudHMKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBvYmplY3QgaW50byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclFOYW1lKTsKLSAgICAgICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbEZhdWx0UmVzcG9uc2UoVGhyb3dhYmxlIHRocm93YWJsZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIGZhdWx0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5tYXJzaGFsRmF1bHRSZXNwb25zZSh0aHJvd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKTsKLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZGVtYXJzaGFsRmF1bHRSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmRlbWFyc2hhbEZhdWx0UmVzcG9uc2Uob3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpOwotICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Eb2NMaXRXcmFwcGVkTWluaW1hbE1ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwYjQ4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIFRoZSBEb2MvTGl0IFdyYXBwZWQgTWluaW1hbCBNYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiAxKSBUaGUgd2ViIHNlcnZpY2UgaXMgRG9jL0xpdCBXcmFwcGVkLCBhbmQgMikKLSAqIFRoZSB3cmFwcGVyIGFuZCBmYXVsdCBiZWFuIG9iamVjdHMgYXJlIG1pc3NpbmcgKGhlbmNlIHRoZSB0ZXJtICdNaW5pbWFsJykKLSAqLwotcHVibGljIGNsYXNzIERvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlciBpbXBsZW1lbnRzIE1ldGhvZE1hcnNoYWxsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERvY0xpdFdyYXBwZWRNaW5pbWFsTWV0aG9kTWFyc2hhbGxlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgRG9jTGl0V3JhcHBlZE1pbmltYWxNZXRob2RNYXJzaGFsbGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXF1ZXN0KE9iamVjdFtdIHNpZ25hdHVyZUFyZ3VtZW50cywgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0Q2xpZW50QmluZGluZ0lEKCkpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BlcmF0aW9uPgotICAgICAgICAgICAgLy8gICAgICA8cGFyYW0+aGVsbG88L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wZXJhdGlvbj4KLSAgICAgICAgICAgIC8vIDwvc29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEltcG9ydGFudCBwb2ludHMuCi0gICAgICAgICAgICAvLyAgIDEpIFRoZXJlIGlzIG5vIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keS4gIAotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9jayAobTpvcGVyYXRpb24pIGlzIGRlZmluZWQgYnkgdGhlIHNjaGVtYSBhbmQgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi4KLSAgICAgICAgICAgIC8vICAgICAgVGhpcyBpcyBjYWxsZWQgdGhlIHdyYXBwZXIgZWxlbWVudC4gIFRoZSB3cmFwcGVyIGVsZW1lbnQgaGFzIGEgY29ycmVzcG9uZGluZyBKQVhCIGVsZW1lbnQgcG9qby4KLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHBhcmFtZXRlcnMgKG06cGFyYW0pIGFyZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgd3JhcHBlciBlbGVtZW50LgotICAgICAgICAgICAgLy8gICA1KSBOT1RFOiBGb3IgZG9jL2xpdGVyYWwgd3JhcHBlZCAibWluaW1hbCIsIHRoZSB3cmFwcGVyIEpBWEIgZWxlbWVudCBwb2pvIGlzIG1pc3NpbmcuCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG5lZWRzIG1vcmUgd29yay4gIFdlIG5lZWQgdG8gY2hlY2sgaW5zaWRlIGhvbGRlcnMgb2YgaW5wdXQgcGFyYW1zLiAgV2UgYWxzbwotICAgICAgICAgICAgLy8gbWF5IHdhbnQgdG8gZXhjbHVkZSBoZWFkZXIgcGFyYW1zIGZyb20gdGhpcyBjaGVjawotICAgICAgICAgICAgLy9WYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBvcGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBudWxsLgotICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICBpZiAocGRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlQXJndW1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIxIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZUFyZ3VtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFyZ3VtZW50IDogc2lnbmF0dXJlQXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIxIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhlIHN0eWxlIGFuZCB3cmFwcGVyIGVsZW1lbnQgbmFtZS4gIFRoaXMgdHJpZ2dlcnMgdGhlIG1lc3NhZ2UgdG8KLSAgICAgICAgICAgIC8vIHB1dCB0aGUgZGF0YSBibG9ja3MgdW5kZXJuZWF0aCB0aGUgd3JhcHBlciBlbGVtZW50Ci0gICAgICAgICAgICBtLnNldFN0eWxlKFN0eWxlLkRPQ1VNRU5UKTsKLSAgICAgICAgICAgIG0uc2V0SW5kaXJlY3Rpb24oMSk7Ci0gICAgICAgICAgICBtLnNldE9wZXJhdGlvbkVsZW1lbnQoZ2V0UmVxdWVzdFdyYXBwZXJRTmFtZShvcGVyYXRpb25EZXNjKSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBpbnB1dCBvYmplY3QgcmVwcmVzZW50IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzLgotICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGFyZ3VtZW50cyBhcmUgYm90aCBob2xkZXJzIGFuZCBub24taG9sZGVycwotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgc2lnbmF0dXJlIGludG8gYSBsaXN0IG9mIEpBWEIgb2JqZWN0cyBmb3IgbWFyc2hhbGxpbmcKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIGRvYy9saXQgd3JhcHBlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsgLy8gZmFsc2UKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgbWFyc2hhbGxpbmcgZm9yIAotICAgICAgICAgICAgLy8gYWxsIG9iamVjdHMKLSAgICAgICAgICAgIGZvciAoUERFbGVtZW50IHBkZSA6IHBkZUxpc3QpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkZS5nZXRQYXJhbSgpOwotICAgICAgICAgICAgICAgIENsYXNzIHR5cGUgPSBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcGRlLnNldEJ5SmF2YVR5cGVDbGFzcyh0eXBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHZhbHVlcyBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHBkZUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZGVtYXJzaGFsUmVxdWVzdChNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3AgeG1sbnM6bT0idXJuOi8vYXBpIj4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbSB4c2k6dHlwZT0iZGF0YTpmb28iID4uLi48L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgUlBDIGhhcyBhbiBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4gIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHdzZGwgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuICAoSW4gZG9jL2xpdAotICAgICAgICAgICAgLy8gICAgICB0aGUgZGF0YSBlbGVtZW50cyBhcmUgdW5kZXJuZWF0aCB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHdzZGw6cGFydCBub3QgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHNjaGVtYS4gIE5vdGUgdGhhdCBpdCBpcyB1bnF1YWxpZmllZCBwZXIgV1NJLUJQCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIChkYXRhOmZvbykgaXMgZGVmaW5lZCBieSBzY2hlbWEgKHRodXMgdGhlcmUgaXMgCi0gICAgICAgICAgICAvLyAgICAgIEpBWEIgdHlwZSByZW5kZXJpbmcuICAKLSAgICAgICAgICAgIC8vICAgNSkgV2UgYWx3YXlzIHNlbmQgYW4geHNpOnR5cGUsIGJ1dCBvdGhlciB2ZW5kb3IncyBtYXkgbm90LgotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBzdHlsZSBpcyBEb2N1bWVudCwgYnV0IHRoZSBibG9ja3MgYXJlIHVuZGVybmVhdGgKLSAgICAgICAgICAgIC8vIHRoZSB3cmFwcGVyIGVsZW1lbnQKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2V0U3R5bGUoU3R5bGUuRE9DVU1FTlQpOwotICAgICAgICAgICAgbWVzc2FnZS5zZXRJbmRpcmVjdGlvbigxKTsKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgdW5tYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgb2JqZWN0cwotICAgICAgICAgICAgQ2xhc3NbXSBqYXZhVHlwZXMgPSBuZXcgQ2xhc3NbcGRzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRzW2ldOwotICAgICAgICAgICAgICAgIGphdmFUeXBlc1tpXSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVW5tYXJzaGFsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXMpOyAgLy8gc2lnaC4uLnVubWFyc2hhbCBieSB0eXBlIGJlY2F1c2UgdGhlcmUgaXMgbm8gd3JhcHBlcgotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cwotICAgICAgICAgICAgT2JqZWN0W10gc2lnQXJndW1lbnRzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVJlcXVlc3RTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0KTsKLQotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG5lZWRzIG1vcmUgd29yay4gIFdlIG5lZWQgdG8gY2hlY2sgaW5zaWRlIGhvbGRlcnMgb2YgaW5wdXQgcGFyYW1zLiAgV2UgYWxzbwotICAgICAgICAgICAgLy8gbWF5IHdhbnQgdG8gZXhjbHVkZSBoZWFkZXIgcGFyYW1zIGZyb20gdGhpcyBjaGVjawotICAgICAgICAgICAgLy9WYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBvcGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBudWxsLgotICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICBpZiAoc2lnQXJndW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBhcmd1bWVudCA6IHNpZ0FyZ3VtZW50cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTnVsbFBhcmFtRXJyMiIsb3BlcmF0aW9uRGVzYy5nZXRKYXZhTWV0aG9kTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2lnQXJndW1lbnRzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlc3BvbnNlKE9iamVjdCByZXR1cm5PYmplY3QsIE9iamVjdFtdIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIFJQQyBtZXNzYWdlCi0gICAgICAgICAgICAvLyAuLgotICAgICAgICAgICAgLy8gPHNvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vICAgIDxtOm9wUmVzcG9uc2UgeG1sbnM6bT0idXJuOi8vYXBpIj4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbSB4c2k6dHlwZT0iZGF0YTpmb28iID4uLi48L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgUlBDIGhhcyBhbiBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4gIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHdzZGwgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuICAoSW4gZG9jL2xpdAotICAgICAgICAgICAgLy8gICAgICB0aGUgZGF0YSBlbGVtZW50cyBhcmUgdW5kZXJuZWF0aCB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHdzZGw6cGFydCBub3QgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHNjaGVtYS4gIE5vdGUgdGhhdCBpdCBpcyB1bnF1YWxpZmllZC4KLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAodGh1cyB0aGVyZSBpcyAKLSAgICAgICAgICAgIC8vICAgICAgSkFYQiB0eXBlIHJlbmRlcmluZy4gIFNpbmNlIHdlIGFyZSB1c2luZyBKQVhCIHRvIG1hcnNoYWwgdGhlIGRhdGEsIAotICAgICAgICAgICAgLy8gICAgICB3ZSBhbHdheXMgZ2VuZXJhdGUgYW4geHNpOnR5cGUgYXR0cmlidXRlLiAgVGhpcyBpcyBhbiBpbXBsZW1lbmF0aW9uIGRldGFpbAotICAgICAgICAgICAgLy8gICAgICBhbmQgaXMgbm90IGRlZmluZWQgYnkgYW55IHNwZWMuCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhlIHN0eWxlIGFuZCB3cmFwcGVyIGVsZW1lbnQgbmFtZS4gIFRoaXMgdHJpZ2dlcnMgdGhlIG1lc3NhZ2UgdG8KLSAgICAgICAgICAgIC8vIHB1dCB0aGUgZGF0YSBibG9ja3MgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQKLSAgICAgICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuRE9DVU1FTlQpOwotICAgICAgICAgICAgbS5zZXRJbmRpcmVjdGlvbigxKTsKLSAgICAgICAgICAgIFFOYW1lIHJlc3BvbnNlT3AgPSBnZXRSZXNwb25zZVdyYXBwZXJRTmFtZShvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgICAgIG0uc2V0T3BlcmF0aW9uRWxlbWVudChyZXNwb25zZU9wKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSByZXR1cm4gb2JqZWN0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5OUyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0dXJuTG9jYWxQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5OUyA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuTG9jYWxQYXJ0ID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybk5TID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm5Mb2NhbFBhcnQgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLQotICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGFsbG93IG51bGwgaWYgdGhlIHJldHVybiBpcyBhIGhlYWRlcj8KLSAgICAgICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgICAgICAvL3RvIGEgbWV0aG9kIHRoZW4gYW4gaW1wbGVtZW50YXRpb24gTVVTVCB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uLgotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5PYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIAkJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIk51bGxQYXJhbUVycjMiLG9wZXJhdGlvbkRlc2MuZ2V0SmF2YU1ldGhvZE5hbWUoKSkpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcmV0dXJuUU5hbWUgPSBuZXcgUU5hbWUocmV0dXJuTlMsIHJldHVybkxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKHJldHVyblR5cGUpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KHJldHVybk9iamVjdCwgcmV0dXJuUU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRWxlbWVudChyZXR1cm5PYmplY3QsIHJldHVyblFOYW1lLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShyZXR1cm5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwgLy8gZm9yY2UgbWFyc2hhbCBieSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBob2xkZXIgb2JqZWN0cyBpbnRvIGEgbGlzdCBvZiBKQVhCIG9iamVjdHMgZm9yIG1hcnNoYWxsaW5nCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAgLy8gZG9jL2xpdCB3cmFwcGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gbm90IHJwYwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiBtYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgb2JqZWN0cwotICAgICAgICAgICAgZm9yIChQREVsZW1lbnQgcGRlIDogcGRlTGlzdCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRlLmdldFBhcmFtKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKHR5cGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgYm9keSB2YWx1ZXM/ICBTaG91bGQgd2UgY2hlY2sgZm9yIG51bGwgb3V0cHV0IGhlYWRlciB2YWx1ZXMgPwotICAgICAgICAgICAgLy8gUHV0IHZhbHVlcyBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHBkZUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgT2JqZWN0IGRlbWFyc2hhbFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BSZXNwb25zZSB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IGl0IGlzIHVucXVhbGlmaWVkIHBlciBXU0ktQlAKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAodGh1cyB0aGVyZSBpcyAKLSAgICAgICAgICAgIC8vICAgICAgSkFYQiB0eXBlIHJlbmRlcmluZy4gIAotICAgICAgICAgICAgLy8gICA1KSBXZSBhbHdheXMgc2VuZCBhbiB4c2k6dHlwZSwgYnV0IG90aGVyIHZlbmRvcidzIG1heSBub3QuCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIHN0eWxlIGlzIERvY3VtZW50LiAKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2V0U3R5bGUoU3R5bGUuRE9DVU1FTlQpOwotICAgICAgICAgICAgbWVzc2FnZS5zZXRJbmRpcmVjdGlvbigxKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSByZXR1cm4gdmFsdWUuCi0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgYm9vbGVhbiBoYXNSZXR1cm5JbkJvZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgd2VicmVzdWx0IGlzIGluIHRoZSBoZWFkZXIsIHdlIG5lZWQgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBzbyB0aGF0IHdlIGNhbiBmaW5kIGl0LgotICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIGlzIGEgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVhZGVyIG5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCksICAgICAvLyBoZWFkZXIgbG9jYWwgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm51bU91dHB1dEJvZHlQYXJhbXMocGRzKSA+IDApOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRSZXR1cm5FbGVtZW50KHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmlzTGlzdFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubnVtT3V0cHV0Qm9keVBhcmFtcyhwZHMpID4gMCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSByZXR1cm5FbGVtZW50LmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGFsbG93IG51bGwgaWYgdGhlIHJldHVybiBpcyBhIGhlYWRlcj8KLSAgICAgICAgICAgICAgICAvL1ZhbGlkYXRlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG9wZXJhdGlvbiBhbmQgbWFrZSBzdXJlIG5vIGlucHV0IHBhcmFtZXRlcnMgYXJlIG51bGwuCi0gICAgICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgICAgICAvL3RvIGEgbWV0aG9kIHRoZW4gYW4gaW1wbGVtZW50YXRpb24gTVVTVCB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uLgotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTnVsbFBhcmFtRXJyMyIsb3BlcmF0aW9uRGVzYy5nZXRKYXZhTWV0aG9kTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSAiYnkgSmF2YSBUeXBlIiB1bm1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBvYmplY3RzCi0gICAgICAgICAgICBDbGFzc1tdIGphdmFUeXBlcyA9IG5ldyBDbGFzc1twZHMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICBqYXZhVHlwZXNbaV0gPSB0eXBlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVbm1hcnNoYWxsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIC8vIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybkluQm9keSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXMpOyAvLyB1bm1hcnNoYWwgYnkgdHlwZQotCi0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgYm9keSB2YWx1ZXM/ICBTaG91bGQgd2UgY2hlY2sgZm9yIG51bGwgb3V0cHV0IGhlYWRlciB2YWx1ZXMgPwotCi0gICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgcmVzcG9uc2UgSG9sZGVycwotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnVwZGF0ZVJlc3BvbnNlU2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCwgc2lnbmF0dXJlQXJncyk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsRmF1bHRSZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIGZhdWx0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5tYXJzaGFsRmF1bHRSZXNwb25zZSh0aHJvd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKTsKLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZGVtYXJzaGFsRmF1bHRSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotCi0gICAgICAgIC8vIE5vdGUgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCBhbmQgcmV0aHJvd24gd2l0aCBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5kZW1hcnNoYWxGYXVsdFJlc3BvbnNlKG9wZXJhdGlvbkRlc2MsIG1hcnNoYWxEZXNjLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiB0OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcmV0dXJuIHJlcXVlc3Qgd3JhcHBlciBxbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIGdldFJlcXVlc3RXcmFwcGVyUU5hbWUoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjKSB7Ci0KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBvcERlc2MuZ2V0TmFtZSgpOwotCi0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBvcERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG9wRGVzYy5nZXRSZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gImRsd21pbiI7ICAvLyBQcmVmZXIgdXNpbmcgYW4gYWN0dWFsIHByZWZpeAotCi0KLSAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUodXJpLCBsb2NhbFBhcnQsIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBxTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3BEZXNjCi0gICAgICogQHJldHVybiByZXF1ZXN0IHdyYXBwZXIgcW5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBRTmFtZSBnZXRSZXNwb25zZVdyYXBwZXJRTmFtZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MpIHsKLQotICAgICAgICBRTmFtZSBxTmFtZSA9IG9wRGVzYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IG9wRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG9wRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJkbHdtaW4iOyAgLy8gUHJlZmVyIHVzaW5nIGFuIGFjdHVhbCBwcmVmaXgKLQotCi0gICAgICAgIHFOYW1lID0gbmV3IFFOYW1lKHVyaSwgbG9jYWxQYXJ0LCBwcmVmaXgpOwotICAgICAgICByZXR1cm4gcU5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Eb2NMaXRXcmFwcGVkUGx1c01ldGhvZE1hcnNoYWxsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxZThlNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L0RvY0xpdFdyYXBwZWRQbHVzTWV0aG9kTWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuTWV0aG9kTWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ29udmVydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5KQVhCV3JhcHBlclRvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGwuSkFYQldyYXBwZXJUb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIFRoZSBEb2NMaXRXcmFwcGVkICJwbHVzIiBtYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiB0aGUgamF2YSBtZXRob2QgaXMgZG9jL2xpdCB3cmFwcGVkLCBidXQgaXQgZG9lcwotICogbm90IGV4YWN0bHkgY29tcGx5IHdpdGggdGhlIGRvYy9saXQgcnVsZXMuICBUaGlzIGNhbiByZXN1bHQgZnJvbSB0aGUgY3VzdG9tZXIgYWRkaW5nIGFubm90YXRpb25zLAotICogYnV0IGl0IGNhbiBhbHNvIGJlIHRoZSByZXN1bHQgb2YgV1NHRU4gZ2VuZXJhdGlvbgotICogPHAvPgotICogSGVyZSBpcyBhbiBleGFtcGxlOgotICoKLSAqIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9hZGRoZWFkZXJzLnNhbXBsZS50ZXN0Lm9yZy9lY2hvU3RyaW5nV1NHRU4xIikKLSAqIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1dTR0VOMSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLAotICogY2xhc3NOYW1lID0gIm9yZy50ZXN0LnNhbXBsZS53cmFwLkVjaG9TdHJpbmdXU0dFTjEiKQotICogQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0KLSAqICJodHRwOi8vd3JhcC5zYW1wbGUudGVzdC5vcmciLCBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMVJlc3BvbnNlIikKLSAqIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZ1dTR0VOMSgKLSAqIEBXZWJQYXJhbShuYW1lID0gImhlYWRlclZhbHVlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGhlYWRlciA9IHRydWUpCi0gKiBTdHJpbmcgaGVhZGVyVmFsdWUgKQotICogPHAvPgotICogSW4gdGhpcyBjYXNlIHRoZSBtZXRob2QgaXMgZG9jL2xpdCwgYnV0IHRoZSBoZWFkZXJWYWx1ZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIHRoZSBoZWFkZXIuICBUaGUKLSAqIHdyYXBwZXIgY2xhc3MgRWNob1N0cmluZ1dTR0VOMSB3aWxsIG5vdCBoYXZlIGFueSBjaGlsZCBlbGVtZW50cy4KLSAqIDxwLz4KLSAqIEEgc2ltaWxhciBleGFtcGxlIGlzOgotICogQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL2FkZGhlYWRlcnMuc2FtcGxlLnRlc3Qub3JnL2VjaG9TdHJpbmdXU0dFTjIiKQotICogQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nV1NHRU4yIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsCi0gKiBjbGFzc05hbWUgPSAib3JnLnRlc3Quc2FtcGxlLndyYXAuRWNob1N0cmluZ1dTR0VOMiIpCi0gKiBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJlY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPQotICogImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zYW1wbGUud3JhcC5FY2hvU3RyaW5nV1NHRU4yUmVzcG9uc2UiKQotICogQFdlYlJlc3VsdChuYW1lID0gImhlYWRlclZhbHVlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cmFwLnNhbXBsZS50ZXN0Lm9yZyIsIGhlYWRlciA9IHRydWUpCi0gKiBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmdXU0dFTjIoCi0gKiBAV2ViUGFyYW0obmFtZSA9ICJkYXRhIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyBkYXRhICkKLSAqIDxwLz4KLSAqIEluIHRoaXMgc2Vjb25kIGNhc2UsIHRoZSByZXR1cm4gaXMgcGFzc2VkIGluIGEgaGVhZGVyIChhcyBkZWZpbmVkIGJ5IEBXZWJSZXN1bHQpCi0gKiA8cC8+Ci0gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIHRoZSAicGx1cyIgbWFyc2hhbGxlciBpcyBvbmx5IHVzZWQgaWYgYSBkb2MvbGl0IHdyYXBwZWQgbWV0aG9kIGhhcwotICogImhlYWRlciIgcGFyYW1ldGVycy4gIElmIG90aGVyIGRldmlhdGlvbnMgYXJlIGZvdW5kLCB0aGlzIGNsYXNzIHdpbGwgYmUgdXBkYXRlZC4gIFRoZSBhZHZhbnRhZ2UKLSAqIG9mIHVzaW5nIERvY0xpdFdyYXBwZXJQbHVzIGZvciB0aGVzZSBkZXZpYXRpb25zIGlzIHRoYXQgaXQgZG9lcyBub3QgaW1wYWN0IHRoZSBub3JtYWwKLSAqIERvY0xpdFdyYXBwZXIgbWFyc2hhbGxpbmcgKHdoaWNoIGlzIHVzZWQgZm9yIDk5JSBvZiB0aGUgY2FzZXMpLiAgVGh1cyB0aGVzZSBkZXZpYXRpb25zIHdpbGwgbm90Ci0gKiBwb2x1dGUgb3Igc2xvdyBkb3duIHRoZSBub3JtYWwgZmxvdy4KLSAqIDxwLz4KLSAqIFNjaGV1Ci0gKi8KLXB1YmxpYyBjbGFzcyBEb2NMaXRXcmFwcGVkUGx1c01ldGhvZE1hcnNoYWxsZXIgaW1wbGVtZW50cyBNZXRob2RNYXJzaGFsbGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEb2NMaXRXcmFwcGVkUGx1c01ldGhvZE1hcnNoYWxsZXIuY2xhc3MpOwotCi0KLSAgICBwdWJsaWMgRG9jTGl0V3JhcHBlZFBsdXNNZXRob2RNYXJzaGFsbGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZGVtYXJzaGFsUmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgRG9jTGl0V3JhcHBlclBsdXNNZXRob2RNYXJzaGFsbGVyLmRlbWFyc2hhbFJlc3BvbnNlIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICIgIFRoZSBEb2NMaXRXcmFwcGVkIFBsdXMgbWFyc2hhbGxlciBpcyB1c2VkIHdoZW4gdGhlIHdlYiBzZXJ2aWNlIG1ldGhvZCBkZXZpYXRlcyBmcm9tIHRoZSBub3JtYWwgZG9jL2xpdCBydWxlcy4iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BlcmF0aW9uUmVzcG9uc2UgLi4uID4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uUmVzcG9uc2U+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keSBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uUmVzcG9uc2UpIGlzIGRlZmluZWQgYnkgdGhlIHNjaGVtYS4KLSAgICAgICAgICAgIC8vICAgICAgSXQgbWF0Y2hlcyB0aGUgb3BlcmF0aW9uIG5hbWUgKyAiUmVzcG9uc2UiLCBhbmQgaXQgaGFzIGEgY29ycmVzcG9uZGluZyBKQVhCIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgZWxlbWVudCBpcyBjYWxsZWQgdGhlIHdyYXBwZXIgZWxlbWVudAotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyBhcmUgKHBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLQotICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGEgcmV0dXJuVmFsdWUgaXMgZXhwZWN0ZWQuCi0gICAgICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSBhbiBjaGlsZCBlbGVtZW50Ci0gICAgICAgICAgICAvLyBUaGUgd3JhcHBlciBlbGVtZW50IAotICAgICAgICAgICAgLy8gb3IgbnVsbAotICAgICAgICAgICAgT2JqZWN0IHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDaGlsZFJldHVybiA9ICFvcGVyYXRpb25EZXNjLmlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkgIT0gbnVsbCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzTm9SZXR1cm4gPSAocmV0dXJuVHlwZSA9PSB2b2lkLmNsYXNzKTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBKQVhCIGJsb2NrIGluc2lkZSB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIEdldCB0aGlzIGJsb2NrCi0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soYmxvY2tDb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgIE9iamVjdCB3cmFwcGVyT2JqZWN0ID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBjaGlsZCBlbGVtZW50cyBhcmUgd2l0aGluIHRoZSBvYmplY3QgdGhhdCAKLSAgICAgICAgICAgIC8vIHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgICAgICAgIGlmICh3cmFwcGVyT2JqZWN0IGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0ID0gKChKQVhCRWxlbWVudCl3cmFwcGVyT2JqZWN0KS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgdGhlIHdyYXBwZXIgdG9vbCB0byBnZXQgdGhlIGNoaWxkIG9iamVjdHMuCi0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlclRvb2wgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgbmFtZXMgZm9yIHRoZSBvdXRwdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uPiBwZExpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocGQuZ2V0TW9kZSgpID09IE1vZGUuT1VUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTk9VVCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXBkLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlYWRlciBuYW1lcyBhcmUgbm90IGluIHRoZSB3cmFwcGVkIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChwZC5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBkTGlzdC5hZGQocGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBpZiAoIW9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlIChCb2R5IFJlc3VsdCkgVGhlIHJldHVybiBuYW1lIGlzIGluIHRoZSB3cmFwcGVkIG9iamVjdAotICAgICAgICAgICAgICAgIGlmIChpc0NoaWxkUmV0dXJuICYmICFpc05vUmV0dXJuKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBjaGlsZCBvYmplY3RzCi0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gd3JhcHBlclRvb2wudW5XcmFwKHdyYXBwZXJPYmplY3QsIG5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlck9iamVjdC5nZXRDbGFzcygpKSk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBjcmVhdGUgYSBsaXN0IG9mIHBhcmFtVmFsdWVzIHNvIHRoYXQgd2UgY2FuIHBvcHVsYXRlIHRoZSBzaWduYXR1cmUKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwdkxpc3QgPSBuZXcgQXJyYXlMaXN0PFBERWxlbWVudD4oKTsKLSAgICAgICAgICAgIGludCBib2R5SW5kZXggPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJvZHkgZWxlbWVudHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIHVud3JhcHBlZCBhcnJheSBvZiBvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9iamVjdHNbYm9keUluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBpbiB0aGUgUERFbGVtZW50IG11c3QgYmUgYW4gZWxlbWVudAotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MocGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lLCBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHZMaXN0LmFkZChuZXcgUERFbGVtZW50KHBkLCBlbGVtZW50LCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlJbmRleCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlYWRlcgotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIEJsb2NrIGZyb20gdGhlIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGQuZ2V0UGFyYW1ldGVyTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsa0NvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNldCB1cCAiYnkgamF2YSB0eXBlIiB1bm1hcnNoYWxsaW5nIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBpZiAoYmxrQ29udGV4dC5nZXRDb25zdHJ1Y3Rpb25UeXBlKCkgIT0gSkFYQlV0aWxzLkNPTlNUUlVDVElPTl9UWVBFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJZX0NPTlRFWFRfUEFUSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYWN0dWFsVHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQoYWN0dWFsVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrQ29udGV4dC5zZXRQcm9jZXNzVHlwZShhY3R1YWxUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtDb250ZXh0LnNldElzeG1sTGlzdChwZC5pc0xpc3RUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbWVzc2FnZS5nZXRIZWFkZXJCbG9jayhwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbG9jYWxOYW1lLCBibGtDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50KHZhbHVlLCBuZXcgUU5hbWUocGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGxvY2FsTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwdkxpc3QuYWRkKG5ldyBQREVsZW1lbnQocGQsIGVsZW1lbnQsIGJsa0NvbnRleHQuZ2V0UHJvY2Vzc1R5cGUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIHJlc3BvbnNlIEhvbGRlcnMgaW4gdGhlIHNpZ25hdHVyZQotICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnVwZGF0ZVJlc3BvbnNlU2lnbmF0dXJlQXJncyhwZHMsIHB2TGlzdCwgc2lnbmF0dXJlQXJncyk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBnZXQgdGhlIHJldHVybiB2YWx1ZQotCi0gICAgICAgICAgICBpZiAoaXNOb1JldHVybikgewotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGlsZFJldHVybikgewotICAgICAgICAgICAgICAgIGlmICghb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbDogR2V0IHRoZSByZXR1cm4gZnJvbSB0aGUgamF4YiBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyIHJlc3VsdDogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBoZWFkZXJzCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsIG1lc3NhZ2UsIG51bGwsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSByZXR1cm5FbGVtZW50LmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyByZXR1cm5WYWx1ZSBtYXkgYmUgaW5jb21wYXRpYmxlIHdpdGggSkFYLVdTIHNpZ25hdHVyZQotICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShyZXR1cm5WYWx1ZSwgcmV0dXJuVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBDb252ZXJ0VXRpbHMuY29udmVydChyZXR1cm5WYWx1ZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9iamVjdENsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJuVmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiByZXR1cm5WYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb252ZXJ0UHJvYmxlbSIsIG9iamVjdENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gd3JhcHBlck9iamVjdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBkZW1hcnNoYWxSZXF1ZXN0KE1lc3NhZ2UgbWVzc2FnZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBEb2NMaXRXcmFwcGVyUGx1c01ldGhvZE1hcnNoYWxsZXIuZGVtYXJzaGFsUmVxdWVzdCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiICBUaGUgRG9jTGl0V3JhcHBlZCBQbHVzIG1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIHRoZSB3ZWIgc2VydmljZSBtZXRob2QgZGV2aWF0ZXMgZnJvbSB0aGUgbm9ybWFsIGRvYy9saXQgcnVsZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5LiAgCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrIChtOm9wZXJhdGlvbikgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hIGFuZCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAgICBUaGlzIGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50LiAgVGhlIHdyYXBwZXIgZWxlbWVudCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudCBwb2pvLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyAobTpwYXJhbSkgYXJlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSB3cmFwcGVyIGVsZW1lbnQuCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlc0tleSA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzS2V5KCk7Ci0KLSAgICAgICAgICAgIC8vIEluIHVzYWdlPVdSQVBQRUQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgSkFYQiBibG9jayBpbnNpZGUgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyBHZXQgdGhpcyBibG9jawotICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0NvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcywgcGFja2FnZXNLZXkpOyAgICAgICAgICAgIAotICAgICAgICAgICAgYmxvY2tDb250ZXh0LnNldFdlYlNlcnZpY2VOYW1lc3BhY2UoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKGJsb2NrQ29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICBPYmplY3Qgd3JhcHBlck9iamVjdCA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotCi0gICAgICAgICAgICAvLyBUaGUgY2hpbGQgZWxlbWVudHMgYXJlIHdpdGhpbiB0aGUgb2JqZWN0IHRoYXQgCi0gICAgICAgICAgICAvLyByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICAgICAgICBpZiAod3JhcHBlck9iamVjdCBpbnN0YW5jZW9mIEpBWEJFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgd3JhcHBlck9iamVjdCA9ICgoSkFYQkVsZW1lbnQpd3JhcHBlck9iamVjdCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZ2V0IHRoZSBjaGlsZCBvYmplY3RzLgotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIG5hbWVzIGZvciB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhtbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uPiBwZExpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAocGQuZ2V0TW9kZSgpID09IE1vZGUuSU4gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLklOT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0aGUgYm9keSBwYXJhbWV0ZXJzIHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgd3JhcHBlciBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWVzLmFkZChwZC5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBkTGlzdC5hZGQocGQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGNoaWxkIG9iamVjdHMKLSAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSB3cmFwcGVyVG9vbC51bldyYXAod3JhcHBlck9iamVjdCwgeG1sTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyT2JqZWN0LmdldENsYXNzKCkpKTsKLQotICAgICAgICAgICAgLy8gTm93IGNyZWF0ZSBhIGxpc3Qgb2YgcGFyYW1WYWx1ZXMgCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gbmV3IEFycmF5TGlzdDxQREVsZW1lbnQ+KCk7Ci0gICAgICAgICAgICBpbnQgYm9keUluZGV4ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGRMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWwgY2FzZTogR2V0IHRoZSBwYXJhbWV0ZXIgdmFsdWUgZnJvbSB0aGUgbGlzdCBvZiBvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9iamVjdHNbYm9keUluZGV4XTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAgVGhlIG9iamVjdCBpbiB0aGUgUERFbGVtZW50IG11c3QgYmUgYW4gZWxlbWVudAotICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcGQuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MocGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQodmFsdWUsIHFOYW1lLCBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHZMaXN0LmFkZChuZXcgUERFbGVtZW50KHBkLCBlbGVtZW50LCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlJbmRleCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlYWRlcgotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIEJsb2NrIGZyb20gdGhlIGhlYWRlcgotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGQuZ2V0UGFyYW1ldGVyTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsa0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlc0tleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHVwICJieSBqYXZhIHR5cGUiIHVubWFyc2hhbGxpbmcgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibGtDb250ZXh0LmdldENvbnN0cnVjdGlvblR5cGUoKSAhPSBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQllfQ09OVEVYVF9QQVRIKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBhY3R1YWxUeXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudChhY3R1YWxUeXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtDb250ZXh0LnNldFByb2Nlc3NUeXBlKGFjdHVhbFR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm9zW10gPSBhY3R1YWxUeXBlLmdldEFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFubm9zID09IG51bGwgfHwgYW5ub3MubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrQ29udGV4dC5zZXRQcm9jZXNzVHlwZShhY3R1YWxUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrQ29udGV4dC5zZXRJc3htbExpc3QocGQuaXNMaXN0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEhlYWRlckJsb2NrKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLCBsb2NhbE5hbWUsIGJsa0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVsZW1lbnQodmFsdWUsIG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbG9jYWxOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHB2TGlzdC5hZGQobmV3IFBERWxlbWVudChwZCwgZWxlbWVudCwgYmxrQ29udGV4dC5nZXRQcm9jZXNzVHlwZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBzaWduYXR1cmUgYXJndW1lbnRzCi0gICAgICAgICAgICBPYmplY3RbXSBzaWdBcmd1bWVudHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuY3JlYXRlUmVxdWVzdFNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QpOwotCi0gICAgICAgICAgICByZXR1cm4gc2lnQXJndW1lbnRzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIG1hcnNoYWxSZXNwb25zZShPYmplY3QgcmV0dXJuT2JqZWN0LCBPYmplY3RbXSBzaWduYXR1cmVBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgRG9jTGl0V3JhcHBlclBsdXNNZXRob2RNYXJzaGFsbGVyLm1hcnNoYWxSZXNwb25zZSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiICBUaGUgRG9jTGl0V3JhcHBlZCBQbHVzIG1hcnNoYWxsZXIgaXMgdXNlZCB3aGVuIHRoZSB3ZWIgc2VydmljZSBtZXRob2QgZGV2aWF0ZXMgZnJvbSB0aGUgbm9ybWFsIGRvYy9saXQgcnVsZXMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gU2FtcGxlIERvY3VtZW50IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BlcmF0aW9uUmVzcG9uc2UgLi4uID4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uUmVzcG9uc2U+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBUaGVyZSBpcyBubyBvcGVyYXRpb24gZWxlbWVudCBpbiB0aGUgbWVzc2FnZQotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keSBlbGVtZW50LiAKLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2sgKG06b3BlcmF0aW9uUmVzcG9uc2UpIGlzIGRlZmluZWQgYnkgdGhlIHNjaGVtYS4KLSAgICAgICAgICAgIC8vICAgICAgSXQgbWF0Y2hlcyB0aGUgb3BlcmF0aW9uIG5hbWUgKyAiUmVzcG9uc2UiLCBhbmQgaXQgaGFzIGEgY29ycmVzcG9uZGluZyBKQVhCIGVsZW1lbnQuCi0gICAgICAgICAgICAvLyAgICAgIFRoaXMgZWxlbWVudCBpcyBjYWxsZWQgdGhlIHdyYXBwZXIgZWxlbWVudAotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyBhcmUgKHBhcmFtKSBhcmUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHdyYXBwZXIgZWxlbWVudC4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW4gdXNhZ2U9V1JBUFBFRCwgdGhlcmUgd2lsbCBiZSBhIHNpbmdsZSBibG9jayBpbiB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vIFRoZSBzaWduYXR1cmVBcmd1bWVudHMgcmVwcmVzZW50IHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGF0IGJsb2NrCi0gICAgICAgICAgICAvLyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBjb252ZXJ0IHRoZSBzaWduYXR1cmUgYXJndW1lbnRzIGludG8gYSBsaXN0Ci0gICAgICAgICAgICAvLyBvZiBwYXJhbWV0ZXIgdmFsdWVzCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIHdhbnQgdG8gY3JlYXRlIGEgc2luZ2xlIEpBWEIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgIC8vIHBhcmFtZXRlciB2YWx1ZXMuICBXZSB3aWxsIHVzZSB0aGUgd3JhcHBlciB0b29sIHRvIGRvIHRoaXMuCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGlucHV0cyB0byB0aGUgd3JhcHBlciB0b29sCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBvYmplY3RMaXN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBDbGFzcz4gZGVjbGFyZWRDbGFzc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gaGVhZGVyUERFTGlzdCA9IG5ldyBBcnJheUxpc3Q8UERFbGVtZW50PigpOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxQREVsZW1lbnQ+IGl0ID0gcGRlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZGUuZ2V0UGFyYW0oKS5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvYmplY3QgbGlzdCBjb250YWlucyB0eXBlIHJlbmRlcmVkIG9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcGRlLmdldEVsZW1lbnQoKS5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZGNsQ2xhc3MgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0TGlzdC5wdXQobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZENsYXNzTWFwLnB1dChuYW1lLCBkY2xDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyIENhc2U6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgaGVhZGVyIGZyb20gdGhlIGxpc3QsIGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IGJlIHBsYWNlZCBpbiB0aGUgd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyUERFTGlzdC5hZGQocGRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIGlmICghb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIChCb2R5IFJlc3VsdCk6IEFkZCB0aGUgcmV0dXJuIG9iamVjdCB0byB0aGUgbmFtZUxpc3QgYW5kIG9iamVjdExpc3QKLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZGNsQ2xhc3MgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RMaXN0LnB1dChuYW1lLCByZXR1cm5PYmplY3QpOwotICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZENsYXNzTWFwLnB1dChuYW1lLCBkY2xDbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBIZWFkZXIgUmVzdWx0OgotICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgcmV0dXJuIG9iamVjdCBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJldHVybkVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZXR1cm5RTmFtZSA9IG5ldyBRTmFtZShvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhyZXR1cm5UeXBlKS5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEVsZW1lbnQocmV0dXJuT2JqZWN0LCByZXR1cm5RTmFtZSwgcmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDbGFzcyBieUphdmFUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQocmV0dXJuVHlwZSwgbWFyc2hhbERlc2MpID8gcmV0dXJuVHlwZSA6IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShyZXR1cm5FbGVtZW50LCAKLSAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQlyZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCW9wZXJhdGlvbkRlc2MuaXNMaXN0VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnlKYXZhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdyBjcmVhdGUgdGhlIHNpbmdsZSBKQVhCIGVsZW1lbnQKLSAgICAgICAgICAgIFN0cmluZyB3cmFwcGVyTmFtZSA9IG1hcnNoYWxEZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZShvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgICAgIENsYXNzIGNsczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyh3cmFwcGVyTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGNscyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5sb2FkQ2xhc3Mod3JhcHBlck5hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXJUb29sID0gbmV3IEpBWEJXcmFwcGVyVG9vbEltcGwoKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSB3cmFwcGVyVG9vbC53cmFwKGNscywgbmFtZUxpc3QsIG9iamVjdExpc3QsIGRlY2xhcmVkQ2xhc3NNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoY2xzKSk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHdyYXBwZXJRTmFtZSA9IG5ldyBRTmFtZShvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgb2JqZWN0IGNhbiBiZSByZW5kZXJlZCBhcyBhbiBlbGVtZW50Ci0gICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKGNscykuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBKQVhCRWxlbWVudCh3cmFwcGVyUU5hbWUsIGNscywgb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBvYmplY3QgaW50byB0aGUgbWVzc2FnZQotICAgICAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgKEpBWEJCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzLCBwYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICBibG9ja0NvbnRleHQuc2V0V2ViU2VydmljZU5hbWVzcGFjZShlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja0NvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclFOYW1lKTsgIC8vIFRoZSBmYWN0b3J5IHdpbGwgZ2V0IHRoZSBxbmFtZSBmcm9tIHRoZSB2YWx1ZQotICAgICAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotCi0gICAgICAgICAgICAvLyAgTm93IHBsYWNlIHRoZSBoZWFkZXJzIGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBpZiAoaGVhZGVyUERFTGlzdC5zaXplKCkgPiAwKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBVc2UgImJ5IGphdmEgdHlwZSIgbWFyc2hhbGxpbmcgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgZm9yIChQREVsZW1lbnQgcGRlIDogaGVhZGVyUERFTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBhY3R1YWxUeXBlID0gcGRlLmdldFBhcmFtKCkuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KGFjdHVhbFR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGRlLnNldEJ5SmF2YVR5cGVDbGFzcyhhY3R1YWxUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKGhlYWRlclBERUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlcXVlc3QoT2JqZWN0W10gc2lnbmF0dXJlQXJndW1lbnRzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBEb2NMaXRXcmFwcGVyUGx1c01ldGhvZE1hcnNoYWxsZXIubWFyc2hhbFJlcXVlc3QiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIiAgVGhlIERvY0xpdFdyYXBwZWQgUGx1cyBtYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiB0aGUgd2ViIHNlcnZpY2UgbWV0aG9kIGRldmlhdGVzIGZyb20gdGhlIG5vcm1hbCBkb2MvbGl0IHJ1bGVzLiIpOwotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VzS2V5ID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXNLZXkoKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgRG9jdW1lbnQgbWVzc2FnZQotICAgICAgICAgICAgLy8gLi4KLSAgICAgICAgICAgIC8vIDxzb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLyAgICA8bTpvcGVyYXRpb24+Ci0gICAgICAgICAgICAvLyAgICAgIDxwYXJhbT5oZWxsbzwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3BlcmF0aW9uPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgVGhlcmUgaXMgbm8gb3BlcmF0aW9uIGVsZW1lbnQgdW5kZXIgdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBib2R5LiAgCi0gICAgICAgICAgICAvLyAgIDMpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGJsb2NrIChtOm9wZXJhdGlvbikgaXMgZGVmaW5lZCBieSB0aGUgc2NoZW1hIGFuZCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAgICBUaGlzIGlzIGNhbGxlZCB0aGUgd3JhcHBlciBlbGVtZW50LiAgVGhlIHdyYXBwZXIgZWxlbWVudCBoYXMgYSBjb3JyZXNwb25kaW5nIEpBWEIgZWxlbWVudCBwb2pvLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgcGFyYW1ldGVycyAobTpwYXJhbSkgYXJlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSB3cmFwcGVyIGVsZW1lbnQuCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVzc2FnZSAKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShwcm90b2NvbCk7Ci0KLSAgICAgICAgICAgIC8vIEluIHVzYWdlPVdSQVBQRUQsIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUgYmxvY2sgaW4gdGhlIGJvZHkuCi0gICAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlQXJndW1lbnRzIHJlcHJlc2VudCB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhhdCBibG9jawotICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHN0ZXAgaXMgdG8gY29udmVydCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cyBpbnRvIGxpc3QKLSAgICAgICAgICAgIC8vIG9mIHBhcmFtZXRlciB2YWx1ZXMKLSAgICAgICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMobWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgIC8vIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gTm93IHdlIHdhbnQgdG8gY3JlYXRlIGEgc2luZ2xlIEpBWEIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgIC8vIFBhcmFtZXRlclZhbHVlcy4gIFdlIHdpbGwgdXNlIHRoZSB3cmFwcGVyIHRvb2wgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgaW5wdXRzIHRvIHRoZSB3cmFwcGVyIHRvb2wKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG9iamVjdExpc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJkQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IGhlYWRlclBERUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBERWxlbWVudD4oKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8UERFbGVtZW50PiBpdCA9IHBkZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBQREVsZW1lbnQgcGRlID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGRlLmdldFBhcmFtKCkuZ2V0UGFyYW1ldGVyTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICghcGRlLmdldFBhcmFtKCkuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOb3JtYWwgY2FzZToKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBsaXN0IGNvbnRhaW5zIHR5cGUgcmVuZGVyZWQgb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwZGUuZ2V0RWxlbWVudCgpLmdldFR5cGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBDbGFzcyBkY2xDbGFzcyA9IHBkZS5nZXRQYXJhbSgpLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZUxpc3QuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBvYmplY3RMaXN0LnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlY2xhcmRDbGFzc01hcC5wdXQobmFtZSwgZGNsQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEhlYWRlciBDYXNlOgotICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGhlYWRlciBmcm9tIHRoZSBsaXN0LCBpdCB3aWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vdCBiZSBwbGFjZWQgaW4gdGhlIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclBERUxpc3QuYWRkKHBkZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3cgY3JlYXRlIHRoZSBzaW5nbGUgSkFYQiBlbGVtZW50IAotICAgICAgICAgICAgU3RyaW5nIHdyYXBwZXJOYW1lID0gbWFyc2hhbERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgICAgICBDbGFzcyBjbHM7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNscyA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5sb2FkQ2xhc3Mod3JhcHBlck5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICBjbHMgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMubG9hZENsYXNzKHdyYXBwZXJOYW1lLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gd3JhcHBlclRvb2wud3JhcChjbHMsIG5hbWVMaXN0LCBvYmplY3RMaXN0LCBkZWNsYXJkQ2xhc3NNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoY2xzKSk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHdyYXBwZXJRTmFtZSA9IG5ldyBRTmFtZShvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG9iamVjdCBjYW4gYmUgcmVuZGVyZWQgYXMgYW4gZWxlbWVudAotICAgICAgICAgICAgaWYgKCFtYXJzaGFsRGVzYy5nZXRBbm5vdGF0aW9uRGVzYyhjbHMpLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgSkFYQkVsZW1lbnQod3JhcHBlclFOYW1lLCBjbHMsIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFB1dCB0aGUgb2JqZWN0IGludG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChKQVhCQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0NvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotICAgICAgICAgICAgYmxvY2tDb250ZXh0LnNldFdlYlNlcnZpY2VOYW1lc3BhY2UoZWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBmYWN0b3J5LmNyZWF0ZUZyb20ob2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclFOYW1lKTsgIC8vIFRoZSBmYWN0b3J5IHdpbGwgZ2V0IHRoZSBxbmFtZSBmcm9tIHRoZSB2YWx1ZQotICAgICAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotCi0gICAgICAgICAgICAvLyBOb3cgcGxhY2UgdGhlIGhlYWRlcnMgaW4gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIGlmIChoZWFkZXJQREVMaXN0LnNpemUoKSA+IDApIHsKLQotICAgICAgICAgICAgICAgIC8vIFVzZSAiYnkgamF2YSB0eXBlIiBtYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBoZWFkZXJQREVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGFjdHVhbFR5cGUgPSBwZGUuZ2V0UGFyYW0oKS5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNZXRob2RNYXJzaGFsbGVyVXRpbHMuaXNOb3RKQVhCUm9vdEVsZW1lbnQoYWN0dWFsVHlwZSwgbWFyc2hhbERlc2MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKGFjdHVhbFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShoZWFkZXJQREVMaXN0LCBtLCBwYWNrYWdlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEVuYWJsZSBTV0EgZm9yIG5lc3RlZCBTd2FSZWYgYXR0YWNobWVudHMKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbEZhdWx0UmVzcG9uc2UoVGhyb3dhYmxlIHRocm93YWJsZSwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBEb2NMaXRXcmFwcGVyUGx1c01ldGhvZE1hcnNoYWxsZXIubWFyc2hhbEZhdWx0UmVzcG9uc2UiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIiAgVGhlIERvY0xpdFdyYXBwZWQgUGx1cyBtYXJzaGFsbGVyIGlzIHVzZWQgd2hlbiB0aGUgd2ViIHNlcnZpY2UgbWV0aG9kIGRldmlhdGVzIGZyb20gdGhlIG5vcm1hbCBkb2MvbGl0IHJ1bGVzLiIpOwotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIGZhdWx0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5tYXJzaGFsRmF1bHRSZXNwb25zZSh0aHJvd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKTsKLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaHJvd2FibGUgZGVtYXJzaGFsRmF1bHRSZXNwb25zZShNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsaW5nIERvY0xpdFdyYXBwZXJQbHVzTWV0aG9kTWFyc2hhbGxlci5kZW1hcnNoYWxGYXVsdFJlc3BvbnNlIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICIgIFRoZSBEb2NMaXRXcmFwcGVkIFBsdXMgbWFyc2hhbGxlciBpcyB1c2VkIHdoZW4gdGhlIHdlYiBzZXJ2aWNlIG1ldGhvZCBkZXZpYXRlcyBmcm9tIHRoZSBub3JtYWwgZG9jL2xpdCBydWxlcy4iKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZGVtYXJzaGFsRmF1bHRSZXNwb25zZShvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvRWxlbWVudC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDRkNTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIENoYXJhY3RlcmlzdGljcyBvZiB0aGUgIkVsZW1lbnQiIHZhbHVlLiAKLSAqIFRoZSBFbGVtZW50IHZhbHVlIGlzIHJlYWR5IGZvciBtYXJzaGFsbGluZyBvciBpcyB0aGUKLSAqIHJlc3VsdCBvZiB1bm1hcnNoYWxsaW5nLiAKLSAqIFRoZSBFbGVtZW50IHZhbHVlIHJlcHJlc2VudHMgdGhlIGVsZW1lbnQgcmVuZGVyaW5nLiAgVGh1cyBpdCBpcyBlaXRoZXIKLSAqIGEgSkFYQkVsZW1lbnQgb3IgaGFzIHRoZSBAWG1sUm9vdEVsZW1lbnQgYW5ub3RhdGlvbi4gIChpLmUuIGl0IGlzIG5ldmVyIGEgamF2YS5sYW5nLlN0cmluZykgCi0gKiBUaGUgRWxlbWVudCB2YWx1ZSBpcyBub3QgYSBKQVgtV1Mgb2JqZWN0LiAoaS5lLiBpdCBpcyBub3QgYSBob2xkZXIgb3IgZXhjZXB0aW9uKSAKLSAqIENoYXJhY3RlcmlzdGljcyBvZiB0aGUgIlR5cGUiIHZhbHVlIAotICogSXQgaXMgdGhlIHR5cGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IHZhbHVlLiAgKFRodXMgaXQgaXMgZWl0aGVyCi0gKiB0aGUgZWxlbWVudCB2YWx1ZSBvciBpdCBpcyB2YWx1ZSBvZiB0aGUgSkFYQkVsZW1lbnQgCi0gKiBUaGUgdHlwZSB2YWx1ZSBpcyB1c3VhbGx5IHRoZSBvYmplY3QgbmVlZGVkCi0gKiBmb3IgdGhlIG1ldGhvZCBzaWduYXR1cmUgKGkuZS4gU3RyaW5nKQotICogPHAvPgotICogSGVyZSBpcyBhbiBleGFtcGxlIGZvciBpbGx1c3RyYXRpb246IDxlbGVtZW50IG5hbWU9J2UxJz4gPGNvbXBsZXhUeXBlPi4uLjwvY29tcGxleFR5cGU+Ci0gKiA8L2VsZW1lbnQ+Ci0gKiA8cC8+Ci0gKiA8ZWxlbWVudCBuYW1lPSdlMicgdHlwZT0ndDInIC8+IDxjb21wbGV4VHlwZSBuYW1lPSAndDInPi4uCi0gKiA8cC8+Ci0gKiA8ZWxlbWVudCBuYW1lPSdlMycgdHlwZT0nZTMnIC8+ICA8IS0tIG5vdGUgZWxlbWVudCBhbmQgdHlwZSBoYXZlIHNhbWUgbmFtZSAtLT4gPGNvbXBsZXhUeXBlIG5hbWU9Ci0gKiAnZTMnPi4uCi0gKiA8cC8+Ci0gKiBKQVhCIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBvYmplY3RzOiAgRTEsIFQyLCBFMyBFMSB3aWxsIGhhdmUgYW4gQFhNTFJvb3RFbGVtZW50IGFubm90YXRpb24uCi0gKiAgSXQgaXMgImVsZW1lbnQiIGFuZCAidHlwZSIgZW5hYmxlZC4gZTIgZG9lcyBub3QgaGF2ZSBhIGdlbmVyYXRlZCBvYmplY3QuICBTbyBpdCB3aWxsIGJlCi0gKiByZXByZXNlbnRlZCBhcyBhIEpBWEJFbGVtZW50IHRoYXQgY29udGFpbnMgYW4gb2JqZWN0IFQyLiAgVGhlIEpBWEJFbGVtZW50IGlzICJlbGVtZW50IiBlbmFibGVkLgotICogVDIgcmVwcmVzZW50cyBhIGNvbXBsZXhUeXBlLiAgSXQgaXMgb25seSAidHlwZSIgZW5hYmxlZC4gRTMgcmVwcmVzZW50cyB0aGUgZTMgY29tcGxleFR5cGUgKGl0Ci0gKiBkb2VzIG5vdCByZXByZXNlbnQgdGhlIGUzIGVsZW1lbnQpLiAgVGh1cyBFMyBpcyAidHlwZSBlbmFibGVkIi4KLSAqIDxwLz4KLSAqIFdoZW4gSkFYQiB1bm1hcnNoYWxzIGFuIG9iamVjdCwgaXQgd2lsbCByZXR1cm4gYW4gImVsZW1lbnQiIGVuYWJsZWQgb2JqZWN0IChlaXRoZXIgYSBnZW5lcmF0YXRlZAotICogb2JqZWN0IHdpdGggQFhNTFJvb3RFbGVtZW50IG9yIGEgSkFYQkVsZW1lbnQpLiBDb252ZXJzZWx5LCB5b3UgbXVzdCBhbHdheXMgbWFyc2hhbCAiZWxlbWVudCIKLSAqIGVuYWJsZWQgb2JqZWN0cy4KLSAqCi0gKiBAc2VlIFBERWxlbWVudAotICogICAgICA8cC8+Ci0gKiAgICAgIEF0IHRoZSBzaWduYXR1cmUgbGV2ZWwsIHRoZSB2YWx1ZXMgcGFzc2VkIGFzIGFyZ3VtZW50cyBpbiBhbiBTRUkgb3BlcmF0aW9uIHJlcHJlc2VudCB0eXBlCi0gKiAgICAgIGVuYWJsZWQgb2JqZWN0cy4gIEVhY2ggb2YgdGhlIG9iamVjdCBtdXN0IGJlIGNvbnZlcnRlZCB0byBhbiBlbGVtZW50IGVuYWJsZWQgb2JqZWN0IHRvCi0gKiAgICAgIG1hcnNoYWwgKG9yIGNvbnZlcnNlbHkgY29udmVydGVkIHRvIGEgdHlwZSBlbmFibGVkIG9iamVjdCB3aGVuIHVubWFyc2hhbGxpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50IHsKLQotICAgIHByaXZhdGUgUU5hbWUgcU5hbWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgZWxlbWVudFZhbHVlOwotICAgIHByaXZhdGUgT2JqZWN0IHR5cGVWYWx1ZTsKLSAgICBwcml2YXRlIENsYXNzIHR5cGVDbGFzczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBFbGVtZW50IGZyb20gYW4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50VmFsdWUgbXVzdCBiZSBKQVhCRWxlbWVudCBvciBAWG1sUm9vdEVsZW1lbnQgcmVuZGVyZWQKLSAgICAgKiBAcGFyYW0gcU5hbWUgICAgICAgIGFzc29jaWF0ZWQgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudChPYmplY3QgZWxlbWVudFZhbHVlLCBRTmFtZSBxTmFtZSkgewotICAgICAgICBpZiAoZWxlbWVudFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudFZhbHVlID0gZWxlbWVudFZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOwotICAgICAgICAgICAgdGhpcy50eXBlVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgdGhpcy50eXBlQ2xhc3MgPSBPYmplY3QuY2xhc3M7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHlwZVZhbHVlIG11c3Qgbm90IGJlIGEgSkFYQkVsZW1lbnQuICBNdXN0IG5vdCBoYXZlIEBYbWxSb290RWxlbWVudCByZW5kZXJpbmcuCi0gICAgICogICAgICAgICAgICAgICAgICB0eXBlVmFsdWUgbXVzdCBub3QgYmUgYSBIb2xkZXIgb3Igb3RoZXIgSkFYV1MgYXBpIHZhbHVlLgotICAgICAqIEBwYXJhbSBxTmFtZSAgICAgYXNzb2NpYXRlZCBRTmFtZQotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudChPYmplY3QgdHlwZVZhbHVlLCBRTmFtZSBxTmFtZSwgQ2xhc3MgY2xzKSB7Ci0gICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKLSAgICAgICAgdGhpcy50eXBlVmFsdWUgPSB0eXBlVmFsdWU7Ci0gICAgICAgIHRoaXMudHlwZUNsYXNzID0gY2xzOwotCi0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRFbGVtZW50VmFsdWUoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIEVsZW1lbnRWYWx1ZSBmcm9tIHR5cGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIGVsZW1lbnRWYWx1ZSA9IG5ldyBKQVhCRWxlbWVudChxTmFtZSwgdHlwZUNsYXNzLCB0eXBlVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbGVtZW50VmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRUeXBlVmFsdWUoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZS5nZXRDbGFzcygpID09IEpBWEJFbGVtZW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoSkFYQkVsZW1lbnQpZWxlbWVudFZhbHVlKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHR5cGVWYWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvTGVnYWN5RXhjZXB0aW9uVXRpbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9MZWdhY3lFeGNlcHRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZTllMDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9MZWdhY3lFeGNlcHRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5GYXVsdEJlYW5EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5KQVhCV3JhcHBlclRvb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGwuSkFYQldyYXBwZXJUb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRoZSBKQVgtV1MgU3BlY2lmaWNhdGlvbiAoY2hhcHRlciAzLjcpIGluZGljYXRlcyB0aGF0IEpBWC1XUwotICogc3VwcG9ydHMgZXhjZXB0aW9ucyB0aGF0IGRvIG5vdCBtYXRjaCB0aGUgbm9ybWFsIHBhdHRlcm4gKHRoZSBub3JtYWwKLSAqIHBhdHRlcm4gaXMgZGVmaW5lZCBpbiBjaGFwdGVyIDIuNS4gIAotICogCi0gKiBUaGVzZSBub24tbWF0Y2hpbmcgZXhjZXB0aW9ucyBhcmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIFdTR2VuCi0gKiBvbiBhIHByZS1leGlzdGluZyB3ZWJzZXJ2aWNlLiAgSSBhbSBnb2luZyB0byB1c2UgdGhlIHRlcm0sIGxlZ2FjeSBleGNlcHRpb24sCi0gKiB0byBkZXNjcmliZSB0aGVzZSBub24tbWF0Y2hpbmcgZXhjZXB0aW9ucy4KLSAqIAotICogVGhlIEpBWC1XUyBtYXJzaGFsbGVyIChzZXJ2ZXIpIG11c3QgbWFyc2hhbCBhIGxlZ2FjeSBleGNlcHRpb24gdGhyb3duIGZyb20KLSAqIHRoZSB3ZWIgc2VydmljZSBpbXBsLiAgVGhlIG1hcnNoYWxsaW5nL21hcHBpbmcgYWxnb3JpdGhtIGlzIGRlZmluZWQgaW4gY2hhcHRlciAzLjcuCi0gKiAKLSAqIE9uIHRoZSBjbGllbnQsIHRoZSBKQVgtV1MgZW5naW5lIHdpbGwgbmVlZCB0byBkZW1hcnNoYWwgZXhjZXB0aW9ucy4gIEhvd2V2ZXIKLSAqIHRoZSBzcGVjaWZpY2F0aW9uIGFzc3VtZXMgdGhhdCB0aGUgY2xpZW50IGlzIGFsd2F5cyBjcmVhdGVkIHZpYSB3c2ltcG9ydDsgdGhlcmVmb3JlCi0gKiB0aGUgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBleGNlcHRpb25zIG9uIHRoZSBjbGllbnQgYXJlIGNvbXBsaWFudCAobmV2ZXIgbGVnYWN5IGV4Y2VwdGlvbnMpLgotICogSSBoYXZlIGluY2x1ZGVkIHNvbWUgY29kZSBoZXJlIGluIGNhc2Ugd2UgaGF2ZSB0byBkZWFsIHdpdGggbGVnYWN5IGV4Y2VwdGlvbnMgb24gdGhlIGNsaWVudC4uLnRoaXMgaXMgbm9uLXNwZWMuCi0gKiAKLSAqCi0gKi8KLQotY2xhc3MgTGVnYWN5RXhjZXB0aW9uVXRpbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTGVnYWN5RXhjZXB0aW9uVXRpbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBpZ25vcmUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBQZXIgQ2hhcCAzLjcgcnVsZSAzLCBpZ25vcmUgdGhlc2UgcHJvcGVydGllcyBvbiB0aGUgZXhjZXB0aW9uCi0gICAgICAgIGlnbm9yZS5hZGQoImxvY2FsaXplZE1lc3NhZ2UiKTsKLSAgICAgICAgaWdub3JlLmFkZCgic3RhY2tUcmFjZSIpOwotICAgICAgICBpZ25vcmUuYWRkKCJjbGFzcyIpOwotICAgICAgICBpZ25vcmUuYWRkKCJjYXVzZSIpOwotICAgIH0KLQotICAgIC8qKiBTdGF0aWMgY2xhc3MuICBDb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IHByaXZhdGUgKi8KLSAgICBwcml2YXRlIExlZ2FjeUV4Y2VwdGlvblV0aWwoKSB7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBGYXVsdEJlYW4gcG9wdWxhdGVkIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgRXhjZXB0aW9uIHQgVGhlIGFsZ29yaXRobSB1c2VkIHRvCi0gICAgICogcG9wdWxhdGUgdGhlIEZhdWx0QmVhbiBpcyBkZXNjcmliZWQgaW4gSkFYLVdTIDMuNwotICAgICAqCi0gICAgICogQHBhcmFtIHQKLSAgICAgKiBAcGFyYW0gZmQKLSAgICAgKiBAcGFyYW0gbWFyc2hhbERlc2MKLSAgICAgKiBAcmV0dXJuIGZhdWx0QmVhbgotICAgICAqLwotICAgIHN0YXRpYyBPYmplY3QgY3JlYXRlRmF1bHRCZWFuKFRocm93YWJsZSB0LCBGYXVsdERlc2NyaXB0aW9uIGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIE9iamVjdCBmYXVsdEJlYW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBmYXVsdCBiZWFuIG5hbWUgZnJvbSB0aGUgZmF1bHQgZGVzY3JpcHRpb24uCi0gICAgICAgICAgICAvLyBSRVZJRVcgVGhlIGRlZmF1bHQgbmFtZSBzaG91bGQgYmU6Ci0gICAgICAgICAgICAvLyAgICAgIFBhY2thZ2UgPSA8U0VJIHBhY2thZ2U+IG9yIDxTRUkgcGFja2FnZT4uamF4d3MKLSAgICAgICAgICAgIC8vICAgICAgTmFtZSA9IDxleGNlcHRpb24gbmFtZT4gKyBCZWFuCi0gICAgICAgICAgICBGYXVsdEJlYW5EZXNjIGZhdWx0QmVhbkRlc2MgPSBtYXJzaGFsRGVzYy5nZXRGYXVsdEJlYW5EZXNjKGZkKTsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdEJlYW5OYW1lID0gZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5DbGFzc05hbWUoKTsKLQotICAgICAgICAgICAgLy8gVE9ETyBBZGQgY2hlY2sgdGhhdCBmYXVsdEJlYW5OYW1lIGlzIGNvcnJlY3QKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTGVnYWN5IEV4Y2VwdGlvbiBGYXVsdEJlYW4gbmFtZSBpcyA9ICIgKyBmYXVsdEJlYW5OYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTG9hZCB0aGUgRmF1bHRCZWFuIENsYXNzCi0gICAgICAgICAgICBDbGFzcyBmYXVsdEJlYW5DbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoZmF1bHRCZWFuTmFtZSAhPSBudWxsICYmIGZhdWx0QmVhbk5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyhmYXVsdEJlYW5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmxvYWRDbGFzcyhmYXVsdEJlYW5OYW1lLCBmZC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbm5vdCBsb2FkIGZhdWx0IGJlYW4gY2xhc3MgPSAiICsgZmF1bHRCZWFuTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuICBGYWxsYmFjayB0byB1c2luZyB0aGUgZXhjZXB0aW9uIG9iamVjdCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmF1bHRCZWFuQ2xhc3MgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBwcm9wZXJ0aWVzIG5hbWVzIGZyb20gdGhlIGV4Y2VwdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcCh0LmdldENsYXNzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBhc3NpZ24gdGhlIGxlZ2FjeSBleGNlcHRpb24gZGF0YSB0byB0aGUgamF2YSBiZWFuIGNsYXNzLgotICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgdXNlIHRoZSBKQVhCV3JhcHBlclRvb2wud3JhcCB1dGlsaXR5IHRvIGRvIHRoaXMuCi0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG1hcCBvZiBjaGlsZCBvYmplY3RzCi0gICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZE9iamVjdHMgPSBnZXRDaGlsZE9iamVjdHNNYXAodCwgcGRNYXApOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJpbmdDbGFzcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oY2hpbGRPYmplY3RzLmtleVNldCgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxpc3Qgb2YgcHJvcGVydGllcyBvbiB0aGUgTGVnYWN5IEV4Y2VwdGlvbiBpcyAiICsgY2hpbGROYW1lcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgd3JhcHBlciB0b29sIHRvIGdldCB0aGUgY2hpbGQgb2JqZWN0cy4KLSAgICAgICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlclRvb2wgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwRm9yQmVhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoZmF1bHRCZWFuQ2xhc3MpOwotICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyVG9vbC53cmFwKGZhdWx0QmVhbkNsYXNzLCBjaGlsZE5hbWVzLCBjaGlsZE9iamVjdHMsIGRlY2xhcmluZ0NsYXNzLCBwZE1hcEZvckJlYW4pOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbXBsZXRlZCBjcmVhdGlvbiBvZiB0aGUgZmF1bHQgYmVhbi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJmYXVsdFByb2Nlc3NpbmdOb3RTdXBwb3J0ZWQiLHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmF1bHRCZWFuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFeGNlcHRpb24gdXNpbmcgdGhlIGRhdGEgaW4gdGhlIEpBWEIgb2JqZWN0LiBUaGUgc3BlY2lmaWNhdGlvbiBpcyBzaWxlbnQgb24gdGhpcwotICAgICAqIGlzc3VlLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbkNsYXNzCi0gICAgICogQHBhcmFtIGpheGIKLSAgICAgKiBAcGFyYW0gbWFyc2hhbERlc2MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIEV4Y2VwdGlvbiBjcmVhdGVGYXVsdEV4Y2VwdGlvbihDbGFzcyBleGNlcHRpb25DbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBqYXhiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MpIHsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgTGVnYWN5IEV4Y2VwdGlvbiBmb3IgIiArIGV4Y2VwdGlvbkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBHZXQgdGhlIHByb3BlcnRpZXMgbmFtZXMgZnJvbSB0aGUgZXhjZXB0aW9uIGNsYXNzCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCA9Ci0gICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLmdldFByb3BlcnR5RGVzY3JpcHRvck1hcChleGNlcHRpb25DbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBnZXQgYSBsaXN0IG9mIFByb3BlcnR5RGVzY3JpcHRvclBsdXMgb2JqZWN0cyB0aGF0IG1hcCB0byB0aGUgamF4YiBiZWFuIHByb3BlcnRpZXMKLSAgICAgICAgICAgIEl0ZXJhdG9yPEVudHJ5PFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+IGl0ID0gcGRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwaUxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGVzY3JpcHRvclBsdXM+KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBlbnRyeSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgICAgICAvLyBTb21lIHByb3BlcnR5TmFtZXMgc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICAgICAgaWYgKCFpZ25vcmUuY29udGFpbnMocHJvcGVydHlOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBwaUxpc3QuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCBhIG1hdGNoaW5nIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gIGNoaWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTGlzdCBvZiBjaGlsZE5hbWVzIG9uIGxlZ2FjeSBleGNlcHRpb24gaXMgIiArIGNoaWxkTmFtZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBmaW5kQ29uc3RydWN0b3IoZXhjZXB0aW9uQ2xhc3MsIHBpTGlzdCwgY2hpbGROYW1lcyk7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGNvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIHRoZSBleGNlcHRpb24gaXMgIiArIGNvbnN0cnVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVzZSB0aGUgd3JhcHBlciB0b29sIHRvIHVud3JhcCB0aGUgamF4YiBvYmplY3QKLSAgICAgICAgICAgIEpBWEJXcmFwcGVyVG9vbCB3cmFwcGVyVG9vbCA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcEZvckJlYW4gPQotICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXAoamF4Yi5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgIE9iamVjdFtdIGNoaWxkT2JqZWN0cyA9IHdyYXBwZXJUb29sLnVuV3JhcChqYXhiLCBjaGlsZE5hbWVzLCBwZE1hcEZvckJlYW4pOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgbmV3SW5zdGFuY2Ugb24gdGhlIGNvbnN0cnVjdG9yICIgKyBjb25zdHJ1Y3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlID0gKEV4Y2VwdGlvbiljb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShjaGlsZE9iamVjdHMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYSBjb25zdHJ1Y29yIHRoYXQgbWF0Y2hlcyB0aGlzIHNldCBvZiBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHBhcmFtIHBkTGlzdAotICAgICAqIEBwYXJhbSBjaGlsZE5hbWVzIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgb2NjdXIgaW4gdGhlIGNvbnN0cnVjdG9yCi0gICAgICogQHJldHVybiBDb25zdHJ1Y3RvciBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29uc3RydWN0b3IgZmluZENvbnN0cnVjdG9yKENsYXNzIGNscywgTGlzdDxQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZExpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzKSB7Ci0gICAgICAgIENvbnN0cnVjdG9yW10gY29uc3RydWN0b3JzID0gY2xzLmdldENvbnN0cnVjdG9ycygpOwotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IG51bGw7Ci0gICAgICAgIGlmIChjb25zdHJ1Y3RvcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3RvcnMubGVuZ3RoICYmIGNvbnN0cnVjdG9yID09IG51bGw7IGkrKykgewotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIHRyeUNvbnN0cnVjdG9yID0gY29uc3RydWN0b3JzW2ldOwotICAgICAgICAgICAgICAgIGlmICh0cnlDb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSBwZExpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRyeSBhbmQgZmluZCB0aGUgYmVzdCBtYXRjaCB1c2luZyB0aGUgcHJvcGVydHkgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFByb3BlcnR5RGVzY3JpcHRvclBsdXM+KHBkTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8UHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlEZXNjcmlwdG9yUGx1cz4oKTsKLQotICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIHBhcm1zID0gdHJ5Q29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBtZXNzYWdlIGlzIGZpcnN0IGluIHRoZSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgibWVzc2FnZSIuZXF1YWxzKGxpc3QuZ2V0KGopLmdldFByb3BlcnR5TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYWRkKGxpc3QucmVtb3ZlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5zaXplKCkgIT0gMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFwYXJtc1swXS5pc0Fzc2lnbmFibGVGcm9tKGFyZ3MuZ2V0KDApLmdldFByb3BlcnR5VHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdyBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBhcmdzCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDwgcGFybXMubGVuZ3RoICYmIHZhbGlkOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgYSBjb21wYXRpYmxlIGFyZ3VtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBwYXJtID0gcGFybXNbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGxpc3Quc2l6ZSgpICYmICFmb3VuZDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYXJnID0gbGlzdC5nZXQoaykuZ2V0UHJvcGVydHlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcm0uaXNBc3NpZ25hYmxlRnJvbShhcmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5hZGQobGlzdC5yZW1vdmUoaykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vIGNvbXBhdGlibGUgYXJndW1lbnQgdGhlbiB0aGlzIGNvbnN0cnVjdG9yIGlzIG5vdCB2YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQSBjb25zdHJ1Y3RvciBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gdHJ5Q29uc3RydWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5hbWVzLmFkZChhcmdzLmdldChpbmRleCkuZ2V0UHJvcGVydHlOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjaGlsZCBvYmplY3RzIG1hcCB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSB3cmFwcGVyIHRvb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uCi0gICAgICogQHBhcmFtIFBhcmFtZXRlckRlc2NyaXB0b3JQbHVzIG1hcCBmb3IgVGhyb3dhYmxlIHQKLSAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIGtleSBpcyBiZWFuIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgYXJlIG9iamVjdHMgZnJvbSB0aGUgRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDaGlsZE9iamVjdHNNYXAoVGhyb3dhYmxlIHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gcGRNYXApCi0gICAgICAgICAgICB0aHJvd3MgSW50cm9zcGVjdGlvbkV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLSAgICAgICAgSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gaXQgPSBwZE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEVudHJ5PFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gZW50cnkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gZW50cnkuZ2V0VmFsdWUoKS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyB4bWxOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAvLyBTb21lIHByb3BlcnR5TmFtZXMgc2hvdWxkIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICBpZiAoIWlnbm9yZS5jb250YWlucyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS5nZXQodCk7Ci0gICAgICAgICAgICAgICAgY29NYXAucHV0KHhtbE5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29NYXA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L01ldGhvZE1hcnNoYWxsZXJVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9NZXRob2RNYXJzaGFsbGVyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiMTEyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L01ldGhvZE1hcnNoYWxsZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxGYXVsdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkFubm90YXRpb25EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkZhdWx0QmVhbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNBQUpGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEZhdWx0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKiBTdGF0aWMgVXRpbHR5IENsYXNzZXMgdXNlZCBieSB0aGUgTWV0aG9kTWFyc2hhbGxlciBpbXBsZW1lbnRhdGlvbnMgaW4gdGhlIGFsdCBwYWNrYWdlLiAqLwotcHVibGljIGNsYXNzIE1ldGhvZE1hcnNoYWxsZXJVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIEpBWEJCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAoSkFYQkJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgIC8qKiBJbnRlbnRpb25hbGx5IFByaXZhdGUuICBUaGlzIGlzIGEgc3RhdGljIHV0aWxpdHkgY2xhc3MgKi8KLSAgICBwcml2YXRlIE1ldGhvZE1hcnNoYWxsZXJVdGlscygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIFBERWxlbWVudHMgdGhhdCBuZWVkIHRvIGJlIG1hcnNoYWxsZWQgb250byB0aGUgd2lyZQotICAgICAqCi0gICAgICogQHBhcmFtIG1hcnNoYWxEZXNjCi0gICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gc2lnQXJndW1lbnRzICAgIGFyZ3VtZW50cwotICAgICAqIEBwYXJhbSBpc0lucHV0ICAgICAgICAgaW5kaWNhdGVzIGlmIGlucHV0IG9yIG91dHB1dCAgcGFyYW1zKGlucHV0IGFyZ3Mgb24gY2xpZW50LCAKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhcmdzIG9uIHNlcnZlcikKLSAgICAgKiBAcGFyYW0gaXNEb2NMaXRXcmFwcGVkCi0gICAgICogQHBhcmFtIGlzUlBDCi0gICAgICogQHJldHVybiBQREVsZW1lbnRzCi0gICAgICovCi0gICAgc3RhdGljIExpc3Q8UERFbGVtZW50PiBnZXRQREVsZW1lbnRzKE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gc2lnQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNEb2NMaXRXcmFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUlBDKSB7Ci0gICAgICAgIExpc3Q8UERFbGVtZW50PiBwZGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQREVsZW1lbnQ+KCk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGFyYW1zW2ldOwotCi0gICAgICAgICAgICBpZiAocGQuZ2V0TW9kZSgpID09IE1vZGUuSU4gJiYgaXNJbnB1dCB8fAotICAgICAgICAgICAgICAgICAgICBwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTk9VVCB8fAotICAgICAgICAgICAgICAgICAgICBwZC5nZXRNb2RlKCkgPT0gTW9kZS5PVVQgJiYgIWlzSW5wdXQpIHsKLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbWF0Y2hpbmcgc2lnbmF0dXJlIGFyZ3VtZW50Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gc2lnQXJndW1lbnRzW2ldOwotCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY29uc2lkZXIgYXN5bmMgaGFuZGxlcnMsIHRoZXkgYXJlIGFyZSBub3QgcmVwcmVzZW50ZWQgb24gdGhlIHdpcmUsCi0gICAgICAgICAgICAgICAgLy8gdGh1cyB0aGV5IGRvbid0IGhhdmUgYSBQREVsZW1lbnQKLSAgICAgICAgICAgICAgICBpZiAoaXNBc3luY0hhbmRsZXIodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBIb2xkZXIgaW50byB2YWx1ZQotICAgICAgICAgICAgICAgIGlmIChpc0hvbGRlcih2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAoKEhvbGRlcil2YWx1ZSkudmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmb3JtYWwgdHlwZSByZXByZXNlbnRpbmcgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgQ2xhc3MgZm9ybWFsVHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBuYW1lc3BhY2UgYW5kIGxvY2FsIG5hbWUgYXJlIG9idGFpbmVkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiAKLSAgICAgICAgICAgICAgICAvLyB0aGUgc3R5bGUvdXNlIGFuZCBoZWFkZXIKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHBkLmlzSGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyAoZXZlbiBycGMpIGFyZSBtYXJzaGFsbGVkIHdpdGggdGhlIG5hbWUgZGVmaW5lZCBieSB0aGUgCi0gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQ9IGF0dHJpYnV0ZSBvbiB0aGUgd3NkOnBhcnQKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUocGQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHBkLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RvY0xpdFdyYXBwZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGRvYy9saXQgd3JhcHBlZCwgdGhlIGxvY2FsTmFtZSBjb21lcyBmcm9tIHRoZSBQYXJ0TmFtZQotICAgICAgICAgICAgICAgICAgICBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcGQuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1JQQykgewotICAgICAgICAgICAgICAgICAgICAvLyBQZXIgV1NJLUJQLCB0aGUgbmFtZXNwYWNlIHVyaSBpcyB1bnF1YWxpZmllZAotICAgICAgICAgICAgICAgICAgICBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBxTmFtZSA9IG5ldyBRTmFtZShwZC5nZXRUYXJnZXROYW1lc3BhY2UoKSwgcGQuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRWxlbWVudCByZW5kZXJpbmcKLSAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IHBkLmdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBjcmVhdGVQREVsZW1lbnRGb3JBdHRhY2htZW50KHBkLCBxTmFtZSwgdmFsdWUsIGZvcm1hbFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBwZGVMaXN0LmFkZChwZGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MoZm9ybWFsVHlwZSkuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hlbiBhIHNjaGVtYSBkZWZpbmVzIGEgU2ltcGxlVHlwZSB3aXRoIHhzZCBsaXN0IGpheHdzIHRvb2xpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBnZW5lcmF0ZXMgYXJ0aWZhY3RzIHdpdGggYXJyYXkgcmF0aGVyIHRoYW4gYSBqYXZhLnV0aWwuTGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgICogSG93ZXZlciB0aGUgT2JqZWN0RmFjdG9yeSBkZWZpbml0aW9uIHVzZXMgYSBMaXN0IGFuZCB0aHVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICogbWFyc2hhbGxpbmcgZmFpbHMuIExldHMgY29udmVydCB0aGUgQXJyYXlzIHRvIExpc3QgYW5kIHJlY3JlYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgSkFYQkVsZW1lbnRzIGZvciB0aGUgc2FtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkLmlzTGlzdFR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hbFR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBBcnJheS5nZXRMZW5ndGgodmFsdWUpOyBjb3VudCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gQXJyYXkuZ2V0KHZhbHVlLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGxpc3QsIHFOYW1lLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSwgZm9ybWFsVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHZhbHVlLCBxTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9iamVjdCBpcyBub3cgcmVhZHkgZm9yIG1hcnNoYWxsaW5nCi0gICAgICAgICAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBuZXcgUERFbGVtZW50KHBkLCBlbGVtZW50LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgcGRlTGlzdC5hZGQocGRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGRlTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBkCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIGZvcm1hbFR5cGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgUERFbGVtZW50IGNyZWF0ZVBERWxlbWVudEZvckF0dGFjaG1lbnQoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGZvcm1hbFR5cGUpIHsKLSAgICAgICAgUERFbGVtZW50IHBkZTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGEgUERFbGVtZW50IGZvciBhbiBhdHRhY2htZW50IHZhbHVlOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSA9PSBudWxsKT8gIm51bGwiOnZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlckRlc2NyaXB0aW9uID0gIiArIHBkLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IHBkLmdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAKLSAgICAgICAgQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50RGVzYy5nZXRBdHRhY2htZW50VHlwZSgpOwotICAgICAgICBpZiAoYXR0YWNobWVudFR5cGUgPT0gQXR0YWNobWVudFR5cGUuU1dBKSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gQXR0YWNobWVudCBvYmplY3Qgd2l0aCB0aGUgc2lnbmF0dXJlIHZhbHVlCi0gICAgICAgICAgICBBdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudCh2YWx1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGQuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICBwZGUgPSBuZXcgUERFbGVtZW50KHBkLCAKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgLy8gRm9yIFNXQSBBdHRhY2htZW50cywgdGhlcmUgaXMgbm8gZWxlbWVudCByZWZlcmVuY2UgdG8gdGhlIGF0dGFjaG1lbnQKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwZEVsZW1lbnRFcnIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBkZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgUERFbGVtZW50cyB0aGF0IGlzIHVubWFyc2hhbGxlZCBmcm9tIHRoZSB3aXJlCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhcmFtcyBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBmb3IgdGhpcyBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlCi0gICAgICogQHBhcmFtIHBhY2thZ2VzIHNldCBvZiBwYWNrYWdlcyBuZWVkZWQgdG8gdW5tYXJzaGFsIG9iamVjdHMgZm9yIHRoaXMgb3BlcmF0aW9uCi0gICAgICogQHBhcmFtIGlzSW5wdXQgaW5kaWNhdGVzIGlmIGlucHV0IG9yIG91dHB1dCAgcGFyYW1zIChpbnB1dCBvbiBzZXJ2ZXIsIG91dHB1dCBvbiBjbGllbnQpCi0gICAgICogQHBhcmFtIGhhc1JldHVybkluQm9keSBpZiBpc0lucHV0PWZhbHNlLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIGEgCi0gICAgICogcmV0dXJuIHZhbHVlIGlzIGV4cGVjdGVkIGluIHRoZSBib2R5LgotICAgICAqIEBwYXJhbSB1bm1hcnNoYWxCeUphdmFUeXBlIGluIG1vc3Qgc2NlbmFyaW9zIHRoaXMgaXMgbnVsbC4gIAotICAgICAqIE9ubHkgdXNlIHRoaXMgaW4gdGhlIHNjZW5hcmlvcyB0aGF0IHJlcXVpcmUgdW5tYXJzaGFsbGluZyBieSBqYXZhIHR5cGUKLSAgICAgKiBAcmV0dXJuIFBhcmFtVmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIExpc3Q8UERFbGVtZW50PiBnZXRQREVsZW1lbnRzKFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1JldHVybkluQm9keSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzW10gdW5tYXJzaGFsQnlKYXZhVHlwZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBERWxlbWVudD4oKTsKLQotICAgICAgICAvLyBDb3VudCAKLSAgICAgICAgaW50IHRvdGFsQm9keUJsb2NrcyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBhcmFtc1tpXTsKLQotICAgICAgICAgICAgaWYgKHBkLmdldE1vZGUoKSA9PSBNb2RlLklOICYmIGlzSW5wdXQgfHwKLSAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuSU5PVVQgfHwKLSAgICAgICAgICAgICAgICAgICAgcGQuZ2V0TW9kZSgpID09IE1vZGUuT1VUICYmICFpc0lucHV0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwZC5pc0hlYWRlcigpICYmICFpc1NXQUF0dGFjaG1lbnQocGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsQm9keUJsb2NrcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNJbnB1dCAmJiBoYXNSZXR1cm5JbkJvZHkpIHsKLSAgICAgICAgICAgIHRvdGFsQm9keUJsb2NrcysrOwotICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgaW50IGluZGV4ID0gKCFpc0lucHV0ICYmIGhhc1JldHVybkluQm9keSkgPyAxIDogMDsKLSAgICAgICAgLy8gVE9ETyBXaGF0IGlmIHJldHVybiBpcyBhbiBzd2EgYXR0YWNobWVudCwgdGhlbiB0aGlzIHNob3VsZCBzdGFydAotICAgICAgICAvLyBhdCAxIG5vdCAwLgotICAgICAgICBpbnQgc3dhSW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwYXJhbXNbaV07Ci0KLSAgICAgICAgICAgIGlmIChwZC5nZXRNb2RlKCkgPT0gTW9kZS5JTiAmJiBpc0lucHV0IHx8Ci0gICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLklOT1VUIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBkLmdldE1vZGUoKSA9PSBNb2RlLk9VVCAmJiAhaXNJbnB1dCkgewotCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgY29uc2lkZXIgYXN5bmMgaGFuZGxlcnMsIHRoZXkgYXJlIGFyZSBub3QgcmVwcmVzZW50ZWQgb24gdGhlIHdpcmUsCi0gICAgICAgICAgICAgICAgLy8gdGh1cyB0aGV5IGRvbid0IGhhdmUgYSBQREVsZW1lbnQKLSAgICAgICAgICAgICAgICAvLyBUT0RPCi0gICAgICAgICAgICAgICAgLy9pZiAoaXNBc3luY0hhbmRsZXIocGFyYW0pKSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgLy99Ci0KLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQocGFja2FnZXMpOwotCi0gICAgICAgICAgICAgICAgQXR0YWNobWVudERlc2NyaXB0aW9uIGF0dGFjaG1lbnREZXNjID0gcGQuZ2V0QXR0YWNobWVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBQcm9jZXNzaW5nOiBOb3QgYW4gQXR0YWNobWVudAotICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHVubWFyc2hhbCBieSBqYXZhIHR5cGUgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hcnNoYWxCeUphdmFUeXBlICE9IG51bGwgJiYgdW5tYXJzaGFsQnlKYXZhVHlwZVtpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb2Nlc3NUeXBlKHVubWFyc2hhbEJ5SmF2YVR5cGVbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJc3htbExpc3QocGQuaXNMaXN0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gVW5tYXJzaGFsIHRoZSBvYmplY3QgaW50byBhIEpBWEIgb2JqZWN0IG9yIEpBWEJFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwZC5pc0hlYWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgQmxvY2sgZnJvbSB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFIFRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBhbHdheXMgdXNlZCB0byBnZXQgdGhlIGhlYWRlciAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQuLi5ldmVuIGlmIHRoZSBzdHlsZSBpcyBSUEMuCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcGQuZ2V0UGFyYW1ldGVyTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEhlYWRlckJsb2NrKHBkLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsQm9keUJsb2NrcyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZb3UgbXVzdCB1c2UgdGhpcyBtZXRob2QgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgYm9keSBibG9jawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIG1heSBjYXVzZSBPTSBleHBhbnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKGluZGV4LCBjb250ZXh0LCBmYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGlmIHlvdSBrbm93IHRoZXJlIGlzIG9ubHkgb25lIGJvZHkgYmxvY2suCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgcHJldmVudHMgT00gZXhwYW5zaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soY29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBuZXcgRWxlbWVudChibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBQREVsZW1lbnQgcGRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQREVsZW1lbnQocGQsIGVsZW1lbnQsIHVubWFyc2hhbEJ5SmF2YVR5cGUgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bm1hcnNoYWxCeUphdmFUeXBlW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgcGRlTGlzdC5hZGQocGRlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2htZW50IFByb2Nlc3NpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnREZXNjLmdldEF0dGFjaG1lbnRUeXBlKCkgPT0gQXR0YWNobWVudFR5cGUuU1dBKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBwZC5nZXRQYXJ0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNpZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkdldHRpbmcgdGhlIGF0dGFjaG1lbnQgZGF0YUhhbmRsZXIgZm9yIHBhcnROYW1lPSIgKyBwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydE5hbWUgIT0gbnVsbCAmJiBwYXJ0TmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGlhbnQgV1MtSSBiZWhhdmlvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZCA9IG1lc3NhZ2UuZ2V0QXR0YWNobWVudElEKHBhcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGFjaG1lbnQgZGF0YUhhbmRsZXIgd2FzIG5vdCBmb3VuZC4gIEZhbGxiYWNrIHRvIHVzZSBhdHRhY2htZW50ICIgKyBzd2FJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvbGVyYXRpb24gbW9kZSBmb3Igbm9uLWNvbXBsaWFudCBhdHRhY2htZW50IG5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lkID0gbWVzc2FnZS5nZXRBdHRhY2htZW50SUQoc3dhSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBtZXNzYWdlLmdldERhdGFIYW5kbGVyKGNpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50IGF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudChkaCwgY2lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBuZXcgUERFbGVtZW50KHBkLCBudWxsLCBudWxsLCBhdHRhY2htZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkZUxpc3QuYWRkKHBkZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2FJbmRleCsrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwZEVsZW1lbnRFcnIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGRlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIHRoZSByZXF1ZXN0IHNpZ25hdHVyZSBhcmd1bWVudHMgKHNlcnZlcikgZnJvbSBhIGxpc3QKLSAgICAgKiBvZiBlbGVtZW50IGVhYmxlZCBvYmplY3QgKFBERWVtZW50cykKLSAgICAgKiBAcGFyYW0gcGRzIFBhcmFtZXRlckRlc2NyaXB0aW9ucyBmb3IgdGhpcyBPcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gcHZMaXN0IEVsZW1lbnQgZW5hYmxlZCBvYmplY3QKLSAgICAgKiBAcmV0dXJuIFNpZ25hdHVyZSBBcmdzCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIE9iamVjdFtdIGNyZWF0ZVJlcXVlc3RTaWduYXR1cmVBcmdzKFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QpCi0gICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIGFyZ3MgPSBuZXcgT2JqZWN0W3Bkcy5sZW5ndGhdOwotICAgICAgICBpbnQgcGRlSW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyYW1WYWx1ZQotICAgICAgICAgICAgUERFbGVtZW50IHBkZSA9IChwZGVJbmRleCA8IHBkZUxpc3Quc2l6ZSgpKSA/IHBkZUxpc3QuZ2V0KHBkZUluZGV4KSA6IG51bGw7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgIGlmIChwZGUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBwZGUuZ2V0UGFyYW0oKSAhPSBwZCkgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBQYXJhbWV0ZXJEZXNjIGJ1dCB0aGVyZSBpcyBub3QgYW4gZXF1aXZhbGVudCBQREVsZW1lbnQuIAotICAgICAgICAgICAgICAgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICBpZiAocGQuaXNIb2xkZXJUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IGNyZWF0ZUhvbGRlcihwZC5nZXRQYXJhbWV0ZXJUeXBlKCksIG51bGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2hpbmcgcGFyYW1WYWx1ZS4gIEdldCB0aGUgdHlwZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGRlLmdldEF0dGFjaG1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGRlLmdldEF0dGFjaG1lbnQoKS5nZXREYXRhSGFuZGxlcigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGRlLmdldEVsZW1lbnQoKS5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGRlSW5kZXgrKzsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHR5cGUsIHRoZXJlIG1heSBiZSBhIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGUgdHlwZSAoYXMgZGVmaW5lZCBieSBKQVhCKSBhbmQgdGhlIGZvcm1hbAotICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAoYXMgZGVmaW5lZCBieSBKQVhXUykuICBGcmVxdWVudGx5IHRoaXMgb2NjdXJzCi0gICAgICAgICAgICAgICAgLy8gd2l0aCByZXNwZWN0IHRvIFRbXSB2ZXJzdXMgTGlzdDxUPi4gIAotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgY29udmVydCB1dGlsaXR5IHRvIHNpbGVudGx5IGRvIGFueSBjb252ZXJzaW9ucwotICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZSh2YWx1ZSwgcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHZhbHVlLCBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3RDbGFzcyA9ICh2YWx1ZSA9PSBudWxsKSA/ICJudWxsIiA6IHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwgb2JqZWN0Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhlIHNpZ25hdHVyZSBtYXkgd2FudCBhIGhvbGRlciByZXByZXNlbnRhdGlvbgotICAgICAgICAgICAgICAgIGlmIChwZC5pc0hvbGRlclR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gY3JlYXRlSG9sZGVyKHBkLmdldFBhcmFtZXRlclR5cGUoKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMgb24gdGhlIGNsaWVudCB3aXRoIHRoZSB1bm1hcnNoYWxsZWQgZWxlbWVudCBlbmFibGVkIG9iamVjdHMKLSAgICAgKiAocHZMaXN0KQotICAgICAqCi0gICAgICogQHBhcmFtIHBkcyAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25zCi0gICAgICogQHBhcmFtIHBkZUxpc3QgICAgICAgRWxlbWVudCBFbmFibGVkIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gc2lnbmF0dXJlQXJncyBTaWduYXR1cmUgQXJndW1lbnRzICh0aGUgb3V0L2lub3V0IGhvbGRlcnMgYXJlIHVwZGF0ZWQpCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgdXBkYXRlUmVzcG9uc2VTaWduYXR1cmVBcmdzKFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzLCBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gc2lnbmF0dXJlQXJncykKLSAgICAgICAgICAgIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHBkZUluZGV4ID0gMDsKLQotICAgICAgICAvLyBFYWNoIFBhcmFtZXRlckRlc2NyaXB0b3IgaGFzIGEgY29ycmVzcG9uZGluZ2luZyBzaWduYXR1cmVBcmcgZnJvbSB0aGUgCi0gICAgICAgIC8vIHRoZSBpbml0aWFsIGNsaWVudCBjYWxsLiAgVGhlIHB2TGlzdCBjb250YWlucyB0aGUgcmVzcG9uc2UgdmFsdWVzIGZyb20gdGhlIG1lc3NhZ2UuCi0gICAgICAgIC8vIFdhbGsgdGhlIFBhcmFtZXRlckRlc2NyaXB0b3IvU2lnbmF0dXJlQXJnIGxpc3QgYW5kIHBvcHVsYXRlIHRoZSBob2xkZXJzIHdpdGggCi0gICAgICAgIC8vIHRoZSBtYXRjaCBQREVsZW1lbnQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyYW0gdmFsdWUKLSAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSAocGRlSW5kZXggPCBwZGVMaXN0LnNpemUoKSkgPyBwZGVMaXN0LmdldChwZGVJbmRleCkgOiBudWxsOwotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZHNbaV07Ci0gICAgICAgICAgICBpZiAocGRlICE9IG51bGwgJiYgcGRlLmdldFBhcmFtKCkgPT0gcGQpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWF0Y2hpbmcgcGFyYW1WYWx1ZS4gIEdldCB0aGUgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAocGRlLmdldEF0dGFjaG1lbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGRlLmdldEVsZW1lbnQoKS5nZXRUeXBlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBkZS5nZXRBdHRhY2htZW50KCkuZ2V0RGF0YUhhbmRsZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGRlSW5kZXgrKzsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdGhlIHR5cGUsIHRoZXJlIG1heSBiZSBhIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGUgdHlwZSAoYXMgZGVmaW5lZCBieSBKQVhCKSBhbmQgdGhlIGZvcm1hbAotICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAoYXMgZGVmaW5lZCBieSBKQVhXUykuICBGcmVxdWVudGx5IHRoaXMgb2NjdXJzCi0gICAgICAgICAgICAgICAgLy8gd2l0aCByZXNwZWN0IHRvIFRbXSB2ZXJzdXMgTGlzdDxUPi4gIAotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgY29udmVydCB1dGlsaXR5IHRvIHNpbGVudGx5IGRvIGFueSBjb252ZXJzaW9ucwotICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZSh2YWx1ZSwgcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHZhbHVlLCBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvYmplY3RDbGFzcyA9ICh2YWx1ZSA9PSBudWxsKSA/ICJudWxsIiA6IHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwgb2JqZWN0Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBBc3NlcnQgdGhhdCB0aGlzIFBhcmFtZXRlckRlc2NyaXB0b3IgbXVzdCByZXByZXNlbnQKLSAgICAgICAgICAgICAgICAvLyBhbiBPVVQgb3IgSU5PVVQgYW5kIG11c3QgaGF2ZSBhIG5vbi1udWxsIGhvbGRlciBvYmplY3QgdG8gCi0gICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgaWYgKGlzSG9sZGVyKHNpZ25hdHVyZUFyZ3NbaV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoSG9sZGVyKXNpZ25hdHVyZUFyZ3NbaV0pLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFyc2hhbCB0aGUgZWxlbWVudCBlbmFibGVkIG9iamVjdHMgKHB2TGlzdCkgdG8gdGhlIE1lc3NhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBwZGVMaXN0ICBlbGVtZW50IGVuYWJsZWQgb2JqZWN0cwotICAgICAqIEBwYXJhbSBtZXNzYWdlICBNZXNzYWdlCi0gICAgICogQHBhcmFtIHBhY2thZ2VzIFBhY2thZ2VzIG5lZWRlZCB0byBkbyBhIEpBWEIgTWFyc2hhbAotICAgICAqIEB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHRvTWVzc2FnZShMaXN0PFBERWxlbWVudD4gcGRlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBpbnQgdG90YWxCb2R5QmxvY2tzID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQREVsZW1lbnQgcGRlID0gcGRlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXBkZS5nZXRQYXJhbSgpLmlzSGVhZGVyKCkgJiYKLSAgICAgICAgICAgICAgICAgcGRlLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7IC8vIEVsZW1lbnQgaXMgbnVsbCBmb3IgU1dBUmVmIGF0dGFjaG1lbnQKLSAgICAgICAgICAgICAgICB0b3RhbEJvZHlCbG9ja3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UuZ2V0TnVtQm9keUJsb2NrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBkZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBERWxlbWVudCBwZGUgPSBwZGVMaXN0LmdldChpKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIEpBWEJDb250ZXh0Ci0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChwYWNrYWdlcyk7Ci0KLSAgICAgICAgICAgIEF0dGFjaG1lbnQgYXR0YWNobWVudCA9IHBkZS5nZXRBdHRhY2htZW50KCk7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIEZsb3c6IE5vdCBhbiBhdHRhY2htZW50Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTWFyc2hhbCBieSB0eXBlIG9ubHkgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgaWYgKHBkZS5nZXRCeUphdmFUeXBlQ2xhc3MoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1R5cGUocGRlLmdldEJ5SmF2YVR5cGVDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYocGRlLmdldFBhcmFtKCkhPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJc3htbExpc3QocGRlLmdldFBhcmFtKCkuaXNMaXN0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgb3V0IG9mIHRoZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAvLyAoTm90ZSB0aGF0IHRoZSBQREVsZW1lbnQuZ2V0VmFsdWUgYWx3YXlzIHJldHVybnMgYW4gb2JqZWN0Ci0gICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgYW4gZWxlbWVudCByZW5kZXJpbmcuLi5pZS4gaXQgaXMgZWl0aGVyIGEgSkFYQkVsZW1lbnQgbwotICAgICAgICAgICAgICAgIC8vIGhhcyBAWG1sUm9vdEVsZW1lbnQgZGVmaW5lZAotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0KLSAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVGcm9tKHBkZS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRlLmdldEVsZW1lbnQoKS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAocGRlLmdldFBhcmFtKCkuaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXIgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBibG9jay5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEhlYWRlckJsb2NrKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgYmxvY2spOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJvZHkgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsQm9keUJsb2NrcyA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGJsb2NrLCB1c2UgdGhlIGZvbGxvd2luZyAibW9yZSBwZXJmb3JtYW50IiBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0Qm9keUJsb2NrKGluZGV4LCBibG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgaXMgYW4gYXR0YWNobWVudAotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRUeXBlIHR5cGUgPSBwZGUuZ2V0UGFyYW0oKS4KLSAgICAgICAgICAgICAgICAgICBnZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKS5nZXRBdHRhY2htZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEF0dGFjaG1lbnRUeXBlLlNXQSkgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgd2UgbmVlZCB0byBkbyBpcyBzZXQgdGhlIGRhdGEgaGFuZGxlciBvbiB0aGUgbWVzc2FnZS4gIAotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgU1dBIGF0dGFjaG1lbnRzLCB0aGUgbWVzc2FnZSBkb2VzIG5vdCByZWZlcmVuY2UgdGhlIGF0dGFjaG1lbnQuCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkRGF0YUhhbmRsZXIoYXR0YWNobWVudC5nZXREYXRhSGFuZGxlcigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmdldENvbnRlbnRJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXJzaGFscyB0aGUgcmV0dXJuIG9iamVjdCB0byB0aGUgbWVzc2FnZSAodXNlZCBvbiBzZXJ2ZXIgdG8gbWFyc2hhbCByZXR1cm4gb2JqZWN0KQotICAgICAqCi0gICAgICogQHBhcmFtIHJldHVybkVsZW1lbnQgICAgICAgICAgICAgIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcmV0dXJuVHlwZQotICAgICAqIEBwYXJhbSBtYXJzaGFsRGVzYwotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIG1hcnNoYWxCeUphdmFUeXBlQ2xhc3MuLndlIG11c3QgZG8gdGhpcyBmb3IgUlBDLi4uZGlzY291cmFnZWQgb3RoZXJ3aXNlCi0gICAgICogQHBhcmFtIGlzSGVhZGVyCi0gICAgICogQHRocm93cyBNZXNzYWdlRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgdG9NZXNzYWdlKEVsZW1lbnQgcmV0dXJuRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIG1hcnNoYWxCeUphdmFUeXBlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNIZWFkZXIpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQmxvY2tDb250ZXh0Ci0gICAgICAgIC8vIFJQQyB1c2VzIHR5cGUgbWFyc2hhbGxpbmcsIHNvIHJlY29yZWQgdGhlIHJwY1R5cGUKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQobWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKSk7Ci0gICAgICAgIGlmIChtYXJzaGFsQnlKYXZhVHlwZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1R5cGUobWFyc2hhbEJ5SmF2YVR5cGVDbGFzcyk7Ci0gICAgICAgICAgICBjb250ZXh0LnNldElzeG1sTGlzdChpc0xpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIENyZWF0ZSBhIEpBWEJCbG9jayBvdXQgb2YgdGhlIHZhbHVlLgotICAgICAgICBCbG9jayBibG9jayA9IGZhY3RvcnkuY3JlYXRlRnJvbShyZXR1cm5FbGVtZW50LmdldEVsZW1lbnRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5FbGVtZW50LmdldFFOYW1lKCkpOwotCi0gICAgICAgIGlmIChpc0hlYWRlcikgewotICAgICAgICAgICAgbWVzc2FnZS5zZXRIZWFkZXJCbG9jayhyZXR1cm5FbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgYmxvY2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5tYXJzaGFsIHRoZSByZXR1cm4gb2JqZWN0IGZyb20gdGhlIG1lc3NhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWNrYWdlcwotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVubWFyc2hhbEJ5SmF2YVR5cGVDbGFzcyBVc2VkIG9ubHkgdG8gaW5kaWNhdGUgdW5tYXJzaGFsaW5nIGJ5IHR5cGUuLi5vbmx5IG5lY2Vzc2FyeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc29tZSBzY2VuYXJpb3MKLSAgICAgKiBAcGFyYW0gaXNIZWFkZXIKLSAgICAgKiBAcGFyYW0gaGVhZGVyTlMgICAgICAgICAgICAgICAgIChvbmx5IG5lZWRlZCBpZiBpc0hlYWRlcikKLSAgICAgKiBAcGFyYW0gaGVhZGVyTG9jYWxQYXJ0ICAgICAgICAgIChvbmx5IG5lZWRlZCBpZiBpc0hlYWRlcikKLSAgICAgKiBAcGFyYW0gaGFzT3V0cHV0Qm9keVBhcmFtcyAodHJ1ZSBpZiB0aGUgbWV0aG9kIGhhcyBvdXQgb3IgaW5vdXQgcGFyYW1zIG90aGVyIAotICAgICAqIHRoYW4gdGhlIHJldHVybiB2YWx1ZSkKLSAgICAgKiBAcmV0dXJuIEVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2UKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBFbGVtZW50IGdldFJldHVybkVsZW1lbnQoVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdW5tYXJzaGFsQnlKYXZhVHlwZUNsYXNzLCAgLy8gbm9ybWFsbHkgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlckxvY2FsUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzT3V0cHV0Qm9keVBhcmFtcykKLQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVGhlIHJldHVybiBvYmplY3QgaXMgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBib2R5Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KHBhY2thZ2VzKTsKLSAgICAgICAgaWYgKHVubWFyc2hhbEJ5SmF2YVR5cGVDbGFzcyAhPSBudWxsICYmICFpc0hlYWRlcikgewotICAgICAgICAgICAgY29udGV4dC5zZXRQcm9jZXNzVHlwZSh1bm1hcnNoYWxCeUphdmFUeXBlQ2xhc3MpOwotICAgICAgICAgICAgY29udGV4dC5zZXRJc3htbExpc3QoaXNMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBCbG9jayBibG9jayA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNCb2R5ID0gZmFsc2U7Ci0gICAgICAgIGlmIChpc0hlYWRlcikgewotICAgICAgICAgICAgYmxvY2sgPSBtZXNzYWdlLmdldEhlYWRlckJsb2NrKGhlYWRlck5TLCBoZWFkZXJMb2NhbFBhcnQsIGNvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGhhc091dHB1dEJvZHlQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICBibG9jayA9IG1lc3NhZ2UuZ2V0Qm9keUJsb2NrKDAsIGNvbnRleHQsIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgIGlzQm9keSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgMSBibG9jaywgd2UgY2FuIHVzZSB0aGUgZ2V0IGJvZHkgYmxvY2sgbWV0aG9kCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBzdHJlYW1zIHRoZSB3aG9sZSBibG9jayBjb250ZW50LgotICAgICAgICAgICAgICAgIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2soY29udGV4dCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgLy9XZSBsb29rIGZvciBib2R5IGJsb2NrIG9ubHkgd2hlbiB0aGUgcmV0dXJuIHR5cGUgYXNzb2NpYXRlZCB3aXRoIG9wZXJhdGlvbiBpcyBub3Qgdm9pZC4KLSAgICAgICAgICAgICAgICAvL0lmIGEgbnVsbCBib2R5IGJsb2NrIGlzIHJldHVybmVkIGluIHJlc3BvbnNlIG9uIGEgb3BlcmF0aW9uIHRoYXQgaXMgbm90IHZvaWQsIGl0cyBhIHVzZXIgZXJyb3IuICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaXNCb2R5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1dlIGxvb2sgZm9yIGJvZHkgYmxvY2sgb25seSB3aGVuIHRoZSByZXR1cm4gdHlwZSBhc3NvY2lhdGVkIHdpdGggb3BlcmF0aW9uIGlzIG5vdCB2b2lkLgotICAgICAgICAvL0lmIGEgbnVsbCBib2R5IGJsb2NrIGlzIHJldHVybmVkIGluIHJlc3BvbnNlIG9uIGEgb3BlcmF0aW9uIHRoYXQgaGFzIG5vbiB2b2lkIHJldHVybiB0eXBlLCBpdHMgYSB1c2VyIGVycm9yLgotICAgICAgICBpZihpc0JvZHkgJiYgYmxvY2sgPT0gbnVsbCl7Ci0gICAgICAgICAgIAlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgIAkJbG9nLmRlYnVnKCJFbXB0eSBCb2R5IEJsb2NrIEZvdW5kIGluIHJlc3BvbnNlIE1lc3NhZ2UgZm9yIHdzZGwgT3BlcmF0aW9uIGRlZmludGlvbiB0aGF0IGV4cGVjdHMgYW4gT3V0cHV0Iik7Ci0gICAgICAgICAgIAkJbG9nLmRlYnVnKCJSZXR1cm4gdHlwZSBhc3NvY2lhdGVkIHdpdGggU0VJIG9wZXJhdGlvbiBpcyBub3Qgdm9pZCwgQm9keSBCbG9jayBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAJfQotICAgICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJNZXRob2RNYXJzaGFsbGVyVXRpbEVycjEiKSk7CQotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCB0aGUgYnVzaW5lc3Mgb2JqZWN0LiAgV2Ugd2FudCB0byByZXR1cm4gdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUuCi0gICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpLCBibG9jay5nZXRRTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIHJldHVybkVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFyc2hhbGluZyBhIGZhdWx0IGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGZvciBycGMvbGl0IGFuZCBkb2MvbGl0LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5Ci0gICAgICogYWxsIG9mIHRoZSBNZXRob2RNYXJzaGFsbGVycwotICAgICAqCi0gICAgICogQHBhcmFtIHRocm93YWJsZSAgICAgVGhyb3dhYmxlIHRvIG1hcnNoYWwKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uRGVzYyBPcGVyYXRpb25EZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBwYWNrYWdlcyAgICAgIFBhY2thZ2VzIG5lZWRlZCB0byBtYXJzaGFsIHRoZSBvYmplY3QKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSAgICAgICBNZXNzYWdlCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgbWFyc2hhbEZhdWx0UmVzcG9uc2UoVGhyb3dhYmxlIHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAvLyBHZXQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIHRocm93YWJsZSBvYmplY3QKLSAgICAgICAgVGhyb3dhYmxlIHQgPSBDbGFzc1V0aWxzLmdldFJvb3RDYXVzZSh0aHJvd2FibGUpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbCBUaHJvd2FibGUgPSIgKyB0aHJvd2FibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHJvb3RDYXVzZSA9IiArIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGV4Y2VwdGlvbj0iICsgdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBzdGFjaz0iICsgc3RhY2tUb1N0cmluZyh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxGYXVsdCB4bWxmYXVsdCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gVGhlcmUgYXJlIDUgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgZXhjZXB0aW9ucy4gIAotICAgICAgICAgICAgLy8gRWFjaCBjYXRlZ29yeSBoYXMgYSBsaXR0bGUgZGlmZmVyZW50IG1hcnNoYWxpbmcgY29kZS4KLSAgICAgICAgICAgIC8vIEEpIFNlcnZpY2UgRXhjZXB0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgSkFYLVdTIAotICAgICAgICAgICAgLy8gICAgc3BlY2lmaWNhdGlvbiAoY2hhcHRlciAyLjUgb2YgdGhlIHNwZWMpCi0gICAgICAgICAgICAvLyBCKSBTZXJ2aWNlIEV4Y2VwdGlvbiB0aGF0IG1hdGNoZXMgdGhlIEpBWC1XUyAibGVnYWN5IiAKLSAgICAgICAgICAgIC8vICAgIGV4Y2VwdGlvbiAoY2hhcHRlciAzLjcgb2YgdGhlIHNwZWMpCi0gICAgICAgICAgICAvLyBDKSBTT0FQRmF1bHRFeGNlcHRpb24KLSAgICAgICAgICAgIC8vIEQpIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgICAgICAgIC8vIEUpIE90aGVyIHJ1bnRpbWUgZXhjZXB0aW9ucyAoaS5lLiBOdWxsUG9pbnRlckV4Y2VwdGlvbikKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBGYXVsdERlc2NyaXB0b3IgbWF0Y2hpbmcgdGhpcyBFeGNlcHRpb24uCi0gICAgICAgICAgICAvLyBJZiBGYXVsdERlc2NyaXB0b3IgaXMgZm91bmQsIHRoaXMgaXMgYSBKQVgtQiBTZXJ2aWNlIEV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIElmIG5vdCBmb3VuZCwgdGhpcyBpcyBhIFN5c3RlbSBFeGNlcHRpb24KLSAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb24gZmQgPQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLnJlc29sdmVGYXVsdEJ5RXhjZXB0aW9uTmFtZSh0LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLQotICAgICAgICAgICAgaWYgKGZkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXJzaGFsIGFzIGEgU2VydmljZSBFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCIENvbnRleHQKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBleGNlcHRpb24gaXMgYSBTZXJ2aWNlIEV4Y2VwdGlvbi4gIAotICAgICAgICAgICAgICAgIC8vIEl0IG1heSBiZSAoQSkgSkFYLVdTIGNvbXBsaWFudCBleGNlcHRpb24gb3IgCi0gICAgICAgICAgICAgICAgLy8gKEIpIEpBWC1XUyBsZWdhY3kgZXhjZXB0aW9uCi0KLSAgICAgICAgICAgICAgICAvLyBUaGUgZmF1bHRCZWFuT2JqZWN0IGlzIGEgSkFYQiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkYXRhIG9mIHRoZSBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgLy8gSXQgaXMgbWFyc2hhbGxlZCBpbiB0aGUgZGV0YWlsIHNlY3Rpb24gb2YgdGhlIHNvYXAgZmF1bHQuICAKLSAgICAgICAgICAgICAgICAvLyBUaGUgZmF1bHRCZWFuT2JqZWN0IGlzIG9idGFpbmVkIGRpcmVjdGlvbiBmcm9tIHRoZSBleGNlcHRpb24gKEEpIG9yIHZpYSAKLSAgICAgICAgICAgICAgICAvLyB0aGUgbGVnYWN5IGV4Y2VwdGlvbiBydWxlcyAoQikuCi0gICAgICAgICAgICAgICAgT2JqZWN0IGZhdWx0QmVhbk9iamVjdCA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBGYXVsdEJlYW5EZXNjIGZhdWx0QmVhbkRlc2MgPSBtYXJzaGFsRGVzYy5nZXRGYXVsdEJlYW5EZXNjKGZkKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHRJbmZvID0gZmQuZ2V0RmF1bHRJbmZvKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhdWx0SW5mbyA9PSBudWxsIHx8IGZhdWx0SW5mby5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExlZ2FjeSBFeGNlcHRpb24gY2FzZQotICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5PYmplY3QgPSBMZWdhY3lFeGNlcHRpb25VdGlsLmNyZWF0ZUZhdWx0QmVhbih0LCBmZCwgbWFyc2hhbERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmF1bHQgYmVhbiBvYmplY3QuICAKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGdldEZhdWx0SW5mbyA9IHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldEZhdWx0SW5mbyIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5PYmplY3QgPSBnZXRGYXVsdEluZm8uaW52b2tlKHQsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBmYXVsdEJlYW4gdHlwZSBpcyIgKyBmYXVsdEJlYW5PYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFVzZSAiYnkgamF2YSB0eXBlIiBtYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICBpZiAoZmF1bHRCZWFuT2JqZWN0ID09IHQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldENvbnN0cnVjdGlvblR5cGUoKSAhPSBKQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJZX0NPTlRFWFRfUEFUSCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vdEpBWEJSb290RWxlbWVudChmYXVsdEJlYW5PYmplY3QuZ2V0Q2xhc3MoKSwgbWFyc2hhbERlc2MpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFByb2Nlc3NUeXBlKGZhdWx0QmVhbk9iamVjdC5nZXRDbGFzcygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSBmYXVsdEJlYW5RTmFtZSA9IG5ldyBRTmFtZShmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbk5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuTG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmF1bHRCZWFuT2JqZWN0IGNhbiBiZSBtYXJzaGFsbGVkIGFzIGFuIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBpZiAoIW1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKGZhdWx0QmVhbk9iamVjdC5nZXRDbGFzcygpKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhc1htbFJvb3RFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5PYmplY3QgPSBuZXcgSkFYQkVsZW1lbnQoZmF1bHRCZWFuUU5hbWUsIGZhdWx0QmVhbk9iamVjdC5nZXRDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBkZXRhaWxibG9jayByZXByZXNlbnRpbmcgdGhlIGZhdWx0QmVhbk9iamVjdAotICAgICAgICAgICAgICAgIEJsb2NrW10gZGV0YWlsQmxvY2tzID0gbmV3IEJsb2NrWzFdOwotICAgICAgICAgICAgICAgIGRldGFpbEJsb2Nrc1swXSA9IGZhY3RvcnkuY3JlYXRlRnJvbShmYXVsdEJlYW5PYmplY3QsIGNvbnRleHQsIGZhdWx0QmVhblFOYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSB0aGUgeG1sRmF1bHQgZm9yIHRoZSBTZXJ2aWNlIEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZhdWx0IHRleHQgdXNpbmcgYWxnb3JpdGhtIGRlZmluZWQgaW4gSkFYLVdTIDEwLjIuMi4zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBOb3cgbWFrZSBhIFhNTEZhdWx0IGNvbnRhaW5pbmcgdGhlIGRldGFpbGJsb2NrCi0gICAgICAgICAgICAgICAgeG1sZmF1bHQgPSBuZXcgWE1MRmF1bHQobnVsbCwgbmV3IFhNTEZhdWx0UmVhc29uKHRleHQpLCBkZXRhaWxCbG9ja3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB4bWxmYXVsdCA9IGNyZWF0ZVhNTEZhdWx0RnJvbVN5c3RlbUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgZGVtYXJzaGFsbGluZyBhbiBleGNlcHRpb24sIAotICAgICAgICAgICAgLy8gdGhlbiByaW5zZSBhbmQgcmVwZWF0IHdpdGggYSBzeXN0ZW0gZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiAoIiArIGUgKyAiKSBvY2N1cnJlZCB3aGlsZSBtYXJzaGFsbGluZyBleGNlcHRpb24gKCIgKyB0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSA9IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB4bWxmYXVsdCA9IGNyZWF0ZVhNTEZhdWx0RnJvbVN5c3RlbUV4Y2VwdGlvbih3c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBmYXVsdCB0byB0aGUgbWVzc2FnZQotICAgICAgICBtZXNzYWdlLnNldFhNTEZhdWx0KHhtbGZhdWx0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFdlYlNlcnZpY2UgSW1wbCBhbmQgUHJvdmlkZXIgdG8gY3JlYXRlIGFuIFhNTEZhdWx0IChmb3IgbWFyc2hhbGxpbmcpCi0gICAgICogZnJvbSBhbiBleGNlcHRpb24gdGhhdCBpcyBhIG5vbi1zZXJ2aWNlIGV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHQgVGhyb3dhYmxlIHRoYXQgcmVwcmVzZW50cyBhIFNlcnZpY2UgRXhjZXB0aW9uCi0gICAgICogQHJldHVybiBYTUxGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MRmF1bHQgY3JlYXRlWE1MRmF1bHRGcm9tU3lzdGVtRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTEZhdWx0IHhtbGZhdWx0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgU09BUEZhdWx0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbCBTT0FQRmF1bHRFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2F0ZWdvcnkgQzogU09BUEZhdWx0RXhjZXB0aW9uIAotICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgeG1sRmF1bHQgZnJvbSB0aGUgU09BUEZhdWx0RXhjZXB0aW9uJ3MgRmF1bHQKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRFeGNlcHRpb24gc2ZlID0gKFNPQVBGYXVsdEV4Y2VwdGlvbil0OwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzZmUuZ2V0RmF1bHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEZhdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gZmF1bHQgPyAgSSB3aWxsIHRyZWF0IHRoaXMgbGlrZSBjYXRlZ29yeSBFCi0gICAgICAgICAgICAgICAgICAgIHhtbGZhdWx0ID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgWE1MRmF1bHQobnVsbCwgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IFhNTEZhdWx0Q29kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYTUxGYXVsdFJlYXNvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvU3RyaW5nKCkpKTsgIC8vIEFzc3VtZXMgdGV4dCBsYW5nIG9mIGN1cnJlbnQgTG9jYWxlCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sZmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVhNTEZhdWx0KHNvYXBGYXVsdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbCBhcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2F0ZWdvcnkgRDogV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC8vIFRoZSByZWFzb24gaXMgY29uc3RydWN0ZWQgd2l0aCB0aGUgZ2V0TWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLiAgCi0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZGV0YWlsCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbil0OwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBmYXVsdCB0ZXh0IHVzaW5nIGFsZ29yaXRobSBkZWZpbmVkIGluIEpBWC1XUyAxMC4yLjIuMwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gd3NlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gd3NlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbGZhdWx0ID0gbmV3IFhNTEZhdWx0KG51bGwsICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBYTUxGYXVsdENvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWE1MRmF1bHRSZWFzb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KSk7ICAvLyBBc3N1bWVzIHRleHQgbGFuZyBvZiBjdXJyZW50IExvY2FsZQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNYXJzaGFsIGFzIGEgdW5jaGVja2VkIFN5c3RlbSBFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2F0ZWdvcnkgRTogT3RoZXIgU3lzdGVtIEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC8vIFRoZSByZWFzb24gaXMgY29uc3RydWN0ZWQgd2l0aCB0aGUgdG9TdHJpbmcgb2YgdGhlIGV4Y2VwdGlvbi4gIAotICAgICAgICAgICAgICAgIC8vIFRoaXMgcGxhY2VzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleGNlcHRpb24gaW4gdGhlIHJlYXNvbgotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGRldGFpbC4KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZhdWx0IHRleHQgdXNpbmcgYWxnb3JpdGhtIGRlZmluZWQgaW4gSkFYLVdTIDEwLjIuMi4zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxmYXVsdCA9IG5ldyBYTUxGYXVsdChudWxsLCAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgWE1MRmF1bHRDb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhNTEZhdWx0UmVhc29uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkpOyAgLy8gQXNzdW1lcyB0ZXh0IGxhbmcgb2YgY3VycmVudCBMb2NhbGUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB4bWxmYXVsdDsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBkZW1hcnNoYWxsaW5nIGFuIGV4Y2VwdGlvbiwgCi0gICAgICAgICAgICAgICAgLy8gdGhlbiByaW5zZSBhbmQgcmVwZWF0IHdpdGggYSB3ZWJzZXJ2aWNlIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiAoIiArIGUgKyAiKSBvY2N1cnJlZCB3aGlsZSBtYXJzaGFsbGluZyBleGNlcHRpb24gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZhdWx0IHRleHQgdXNpbmcgYWxnb3JpdGhtIGRlZmluZWQgaW4gSkFYLVdTIDEwLjIuMi4zCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSA9IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhNTEZhdWx0KG51bGwsICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBYTUxGYXVsdENvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYTUxGYXVsdFJlYXNvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkpOyAgLy8gQXNzdW1lcyB0ZXh0IGxhbmcgb2YgY3VycmVudCBMb2NhbGUKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBFeGNlcHRpb24gZm9yIEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZTIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5tYXJzaGFsIHRoZSBzZXJ2aWNlL3N5c3RlbSBleGNlcHRpb24gZnJvbSBhIE1lc3NhZ2UuIFRoaXMgaXMgdXNlZCBieSBhbGwgb2YgdGhlCi0gICAgICogbWFyc2hhbGxlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25EZXNjCi0gICAgICogQHBhcmFtIG1hcnNoYWxEZXNjCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgVGhyb3dhYmxlIGRlbWFyc2hhbEZhdWx0UmVzcG9uc2UoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQotICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgZmF1bHQgZnJvbSB0aGUgbWVzc2FnZSBhbmQgZ2V0IHRoZSBkZXRhaWwgYmxvY2tzIChwcm9iYWJseSBvbmUpCi0gICAgICAgIFhNTEZhdWx0IHhtbGZhdWx0ID0gbWVzc2FnZS5nZXRYTUxGYXVsdCgpOwotICAgICAgICBCbG9ja1tdIGRldGFpbEJsb2NrcyA9IHhtbGZhdWx0LmdldERldGFpbEJsb2NrcygpOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIGJsb2NrLCBnZXQgdGhlIGVsZW1lbnQgbmFtZSBvZiB0aGF0IGJsb2NrLgotICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoZGV0YWlsQmxvY2tzICE9IG51bGwgJiYgZGV0YWlsQmxvY2tzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBkZXRhaWxCbG9ja3NbMF0uZ2V0UU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzZSB0aGUgZWxlbWVudCBuYW1lIHRvIGZpbmQgdGhlIG1hdGNoaW5nIEZhdWx0RGVzY3JpcHRvcgotICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZhdWx0RGVzYyA9IG51bGw7Ci0gICAgICAgIGlmIChlbGVtZW50UU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25EZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKCkubGVuZ3RoICYmIGZhdWx0RGVzYyA9PSBudWxsOwotICAgICAgICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZkID0gb3BlcmF0aW9uRGVzYy5nZXRGYXVsdERlc2NyaXB0aW9ucygpW2ldOwotICAgICAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IG1hcnNoYWxEZXNjLmdldEZhdWx0QmVhbkRlc2MoZmQpOwotCi0JCQkJaWYgKGZhdWx0QmVhbkRlc2MgIT0gbnVsbCkgewotCQkJCQlRTmFtZSB0cnlRTmFtZSA9IG5ldyBRTmFtZShmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbk5hbWVzcGFjZSgpLAotCQkJCQkJCWZhdWx0QmVhbkRlc2MuZ2V0RmF1bHRCZWFuTG9jYWxOYW1lKCkpOwotCQkJCQlpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLQkJCQkJCWxvZy5kZWJ1ZygiICBGYXVsdERlc2NyaXB0aW9uIHFuYW1lIGlzICgiICsgdHJ5UU5hbWUgKwotCQkJCQkJCQkiKSBhbmQgZGV0YWlsIGVsZW1lbnQgcW5hbWUgaXMgKCIgKyBlbGVtZW50UU5hbWUgKyAiKSIpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGVsZW1lbnRRTmFtZS5lcXVhbHModHJ5UU5hbWUpKSB7Ci0JCQkJCQlmYXVsdERlc2MgPSBmZDsKLQkJCQkJfQotCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYXVsdERlc2MgPT0gbnVsbCAmJiBlbGVtZW50UU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgbm90IGZvdW5kLCByZXRyeSB0aGUgc2VhcmNoIHVzaW5nIGp1c3QgdGhlIGxvY2FsIG5hbWUKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9uRGVzYy5nZXRGYXVsdERlc2NyaXB0aW9ucygpLmxlbmd0aCAmJiBmYXVsdERlc2MgPT0gbnVsbDsKLSAgICAgICAgICAgICAgICAgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RmF1bHREZXNjcmlwdGlvbnMoKVtpXTsKLSAgICAgICAgICAgICAgICBGYXVsdEJlYW5EZXNjIGZhdWx0QmVhbkRlc2MgPSBtYXJzaGFsRGVzYy5nZXRGYXVsdEJlYW5EZXNjKGZkKTsKLSAgICAgICAgICAgICAgICBpZiAoZmF1bHRCZWFuRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB0cnlOYW1lID0gZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5Mb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAJaWYgKGVsZW1lbnRRTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHModHJ5TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAJCWZhdWx0RGVzYyA9IGZkOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoZmF1bHREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzeXN0ZW0gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgZG9lcyBub3QgdGhyb3cgYSBjaGVja2VkIGV4Y2VwdGlvbiBvciBpZgotICAgICAgICAgICAgLy8gdGhlIGRldGFpbCBibG9jayBpcyBtaXNzaW5nIG9yIGNvbnRhaW5zIG11bHRpcGxlIGl0ZW1zLgotICAgICAgICAgICAgZXhjZXB0aW9uID0gY3JlYXRlU3lzdGVtRXhjZXB0aW9uKHhtbGZhdWx0LCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNFcnJvckVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZHkgdG8gZGVtYXJzaGFsIHNlcnZpY2UgZXhjZXB0aW9uLiAgVGhlIGRldGFpbCBlbnRyeSBuYW1lIGlzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IG1hcnNoYWxEZXNjLmdldEZhdWx0QmVhbkRlc2MoZmF1bHREZXNjKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNMZWdhY3kgPQotICAgICAgICAgICAgICAgICAgICAoZmF1bHREZXNjLmdldEZhdWx0SW5mbygpID09IG51bGwgfHwgZmF1bHREZXNjLmdldEZhdWx0SW5mbygpLmxlbmd0aCgpID09IDApOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIEpBWEIgb2JqZWN0IGZyb20gdGhlIGJsb2NrCi0gICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCkpOwotCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgZmF1bHRCZWFuIG1heSBub3QgYmUgYSBiZWFuLCBpdCBjb3VsZCBiZSBhIHByaW1pdGl2ZSAKLSAgICAgICAgICAgIENsYXNzIGZhdWx0QmVhbkZvcm1hbENsYXNzOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW5Gb3JtYWxDbGFzcyA9IGxvYWRDbGFzcyhmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgZmF1bHRCZWFuRm9ybWFsQ2xhc3MgPSBsb2FkQ2xhc3MoZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5DbGFzc05hbWUoKSwgb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVzZSAiYnkgamF2YSB0eXBlIiBtYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgIGlmIChibG9ja0NvbnRleHQuZ2V0Q29uc3RydWN0aW9uVHlwZSgpICE9IAotICAgICAgICAgICAgICAgIEpBWEJVdGlscy5DT05TVFJVQ1RJT05fVFlQRS5CWV9DT05URVhUX1BBVEggJiYKLSAgICAgICAgICAgICAgICAgICAgaXNOb3RKQVhCUm9vdEVsZW1lbnQoZmF1bHRCZWFuRm9ybWFsQ2xhc3MsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgIGJsb2NrQ29udGV4dC5zZXRQcm9jZXNzVHlwZShmYXVsdEJlYW5Gb3JtYWxDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgamF4YiBibG9jayBhbmQgYnVzaW5lc3Mgb2JqZWN0Ci0gICAgICAgICAgICBCbG9jayBqYXhiQmxvY2sgPSBmYWN0b3J5LmNyZWF0ZUZyb20oZGV0YWlsQmxvY2tzWzBdLCBibG9ja0NvbnRleHQpOwotICAgICAgICAgICAgT2JqZWN0IGZhdWx0QmVhbk9iamVjdCA9IGpheGJCbG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLQotICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgZmF1bHRCZWFuT2JqZWN0IGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSByZW5kZXJlZCBhcyBhbgotICAgICAgICAgICAgLy8gZWxlbWVudC4gIFdlIHdhbnQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUuCi0gICAgICAgICAgICBpZiAoZmF1bHRCZWFuT2JqZWN0IGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW5PYmplY3QgPSAoKEpBWEJFbGVtZW50KWZhdWx0QmVhbk9iamVjdCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxvZy5pc0Vycm9yRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbm1hcnNoYWxsZWQgdGhlIGRldGFpbCBlbGVtZW50IGludG8gYSBKQVhCIG9iamVjdCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIEpBWC1XUyBnZW5lcmF0ZWQgZXhjZXB0aW9uIHRoYXQgaG9sZHMgdGhlIGZhdWx0QmVhbk9iamVjdAotICAgICAgICAgICAgQ2xhc3MgZXhjZXB0aW9uQ2xhc3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gbG9hZENsYXNzKGZhdWx0RGVzYy5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gbG9hZENsYXNzKGZhdWx0RGVzYy5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSwgb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobG9nLmlzRXJyb3JFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIEZhdWx0RGVzY3JpcHRpb24uICBUaGUgZXhjZXB0aW9uIG5hbWUgaXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25DbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhjZXB0aW9uID0gY3JlYXRlU2VydmljZUV4Y2VwdGlvbih4bWxmYXVsdC5nZXRSZWFzb24oKS5nZXRUZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkZvcm1hbENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMZWdhY3kpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleGNlcHRpb247Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBkcwotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGlub3V0IG9yIG91dCBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgc3RhdGljIGludCBudW1PdXRwdXRCb2R5UGFyYW1zKFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIC8vIFRPRE8gTmVlZCB0byBjaGFuZ2UgdGhpcyB0byBhbHNvIGRldGVjdCBub3QgYXR0YWNobWVudAotICAgICAgICAgICAgaWYgKCFwZHNbaV0uaXNIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIGlmIChwZHNbaV0uZ2V0TW9kZSgpID09IE1vZGUuSU5PVVQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBkc1tpXS5nZXRNb2RlKCkgPT0gTW9kZS5PVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvdW50OwotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gaWYgYXN5bmMgaGFuZGxlcgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGlzQXN5bmNIYW5kbGVyKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgQXN5bmNIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdmFsdWUgaXMgaG9sZGVyCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNIb2xkZXIoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIEhvbGRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHZhbHVlLmdldENsYXNzKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyYXRlIGEgSG9sZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gPFQ+Ci0gICAgICogQHBhcmFtIHBhcmFtVHlwZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgPFQ+IEhvbGRlcjxUPiBjcmVhdGVIb2xkZXIoQ2xhc3MgcGFyYW1UeXBlLCBUIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpZiAoSG9sZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1UeXBlKSkgewotICAgICAgICAgICAgSG9sZGVyIGhvbGRlciA9IChIb2xkZXIpIHBhcmFtVHlwZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgaG9sZGVyLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gaG9sZGVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBsb2FkZWQgY2xhc3MKLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRG9uJ3QgbWFrZSB0aGlzIHB1YmxpYywgaXRzIGEgc2VjdXJpdHkgZXhwb3N1cmUKLSAgICAgICAgQ2xhc3MgY2xzID0gQ2xhc3NVdGlscy5nZXRQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgIGNscyA9IGZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gbG9hZGVkIGNsYXNzCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xzID0gZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xzOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3MuZm9yTmFtZSBkb2VzIG5vdCBzdXBwb3J0IHByaW1pdGl2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gQ2xhc3NMb2FkZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEpBWC1XUyBTZXJ2aWNlIEV4Y2VwdGlvbiAoR2VuZXJhdGVkIEV4Y2VwdGlvbikKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbmNsYXNzCi0gICAgICogQHBhcmFtIGJlYW4KLSAgICAgKiBAcGFyYW0gYmVhbkZvcm1hbFR5cGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLSAgICAgKiBAcGFybWEgbWFyc2hhbERlc2MgaXMgdXNlZCB0byBnZXQgY2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24gY2xhc3MgYW5kIGJlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBFeGNlcHRpb24gY3JlYXRlU2VydmljZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBleGNlcHRpb25jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYmVhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBiZWFuRm9ybWFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTGVnYWN5RXhjZXB0aW9uKSB0aHJvd3MKLSAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25zdHJ1Y3RpbmcgSkFYLVdTIEV4Y2VwdGlvbjoiICsgZXhjZXB0aW9uY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotICAgICAgICBpZiAoaXNMZWdhY3lFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIC8vIExlZ2FjeSBFeGNlcHRpb24KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IExlZ2FjeUV4Y2VwdGlvblV0aWwuY3JlYXRlRmF1bHRFeGNlcHRpb24oZXhjZXB0aW9uY2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UsIHVzZSB0aGUgY29udHN0cnVjdG9yIHRvIGNyZWF0ZSB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBiZWFuRm9ybWFsVHlwZSB9KTsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IChFeGNlcHRpb24pY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgbWVzc2FnZSwgYmVhbiB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBleGNlcHRpb247Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzeXN0ZW0gZXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb3RvY29sRXhjZXB0aW9uIGNyZWF0ZVN5c3RlbUV4Y2VwdGlvbihYTUxGYXVsdCB4bWxGYXVsdCwgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIFByb3RvY29sRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICBQcm90b2NvbCBwcm90b2NvbCA9IG1lc3NhZ2UuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB4bWxGYXVsdC5nZXRSZWFzb24oKS5nZXRUZXh0KCk7Ci0KLSAgICAgICAgaWYgKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMSB8fCBwcm90b2NvbCA9PSBQcm90b2NvbC5zb2FwMTIpIHsKLSAgICAgICAgICAgIC8vIFRocm93IGEgU09BUEZhdWx0RXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbnN0cnVjdGluZyBTT0FQRmF1bHRFeGNlcHRpb24gZm9yICIgKyB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbE5TID0gKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMSkgPwotICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSA6Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHNldCBvZiBpbnN0cnVjdGlvbnMgaXMgdXNlZCB0byBhdm9pZCAKLSAgICAgICAgICAgICAgICAvLyBzb21lIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyBpbiB0aGUgQXhpczIgU0FBSiBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5IG1mID0gU0FBSkZhY3RvcnkuY3JlYXRlTWVzc2FnZUZhY3RvcnkocHJvdG9jb2xOUyk7Ci0gICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVNBQUpGYXVsdCh4bWxGYXVsdCwgYm9keSk7Ci0gICAgICAgICAgICAgICAgZSA9IG5ldyBTT0FQRmF1bHRFeGNlcHRpb24oc29hcEZhdWx0KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICAgICAgLy8gVE9ETyBQcm9iYWJseSBzaG91bGQgZG8gc29tZXRoaW5nIGJldHRlciBoZXJlCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBmYXVsdCBwcm9jZXNzaW5nOiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZSA9IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVByb3RvY29sRXhjZXB0aW9uKHRleHQsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sID09IFByb3RvY29sLnJlc3QpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIFByb3RvY29sRXhjZXB0aW9uIGZvciAiICsgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPIElzIHRoZXJlIGFuIGV4cGxpY2l0IGV4Y2VwdGlvbiBmb3IgUkVTVAotICAgICAgICAgICAgZSA9IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVByb3RvY29sRXhjZXB0aW9uKHRleHQsIG51bGwpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sID09IFByb3RvY29sLnVua25vd24pIHsKLSAgICAgICAgICAgIC8vIFJFVklFVyBXaGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlcmUgaXMgbm8gcHJvdG9jb2wKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIFByb3RvY29sRXhjZXB0aW9uIGZvciAiICsgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlID0gRXhjZXB0aW9uRmFjdG9yeS5tYWtlUHJvdG9jb2xFeGNlcHRpb24odGV4dCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBnZXRNYXJzaGFsRGVzYyhFbmRwb2ludERlc2NyaXB0aW9uIGVkKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IGVkLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICByZXR1cm4gTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmdldChzZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gdGhlIFBhcmFtZXRlckRlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHBhcmFtIG1hcnNoYWxEZXNjCi0gICAgICogQHJldHVybiB0cnVlIGlmIHByaW1pdGl2ZSwgd3JhcHBlciwgamF2YS5sYW5nLlN0cmluZy4gQ2FsZW5kYXIgKG9yIEdyZWdvcmlhbkNhbGVuZGFyKSwKLSAgICAgKiAgICAgICAgIEJpZ0ludGVnZXIgZXRjIG9yIGFueXRoaW5nIG90aGVyIGphdmEgdHlwZSB0aGF0IGlzIG1hcHBlZCBieSB0aGUgYmFzaWMgc2NoZW1hIHR5cGVzCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNOb3RKQVhCUm9vdEVsZW1lbnQoQ2xhc3MgY2xzLCBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYykgewotICAgICAgICBpZiAoY2xzID09IFN0cmluZy5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNscy5pc1ByaW1pdGl2ZSgpIHx8Ci0gICAgICAgICAgICAgICAgY2xzID09IENhbGVuZGFyLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xzID09IGJ5dGVbXS5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNscyA9PSBHcmVnb3JpYW5DYWxlbmRhci5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNscyA9PSBEYXRlLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xzID09IEJpZ0ludGVnZXIuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbHMgPT0gQmlnRGVjaW1hbC5jbGFzcykgewotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBbm5vdGF0aW9uRGVzYyBhRGVzYyA9IG1hcnNoYWxEZXNjLmdldEFubm90YXRpb25EZXNjKGNscyk7Ci0gICAgICAgIGlmIChhRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBYbWxSb290RWxlbWVudE5hbWUgcmV0dXJucyBudWxsIGlmIEBYbWxSb290RWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkCi0gICAgICAgICAgICByZXR1cm4gKGFEZXNjLmdldFhtbFJvb3RFbGVtZW50TmFtZSgpID09IG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOyAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiAgIAotICAgICAqIEBwYXJhbSBlICAgCi0gICAgICogQHJldHVybiAgICAKLSAgICAgKi8gICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFja1RvU3RyaW5nKFRocm93YWJsZSBlKSB7ICAgICAgIAotICAgICAgICBqYXZhLmlvLlN0cmluZ1dyaXRlciBzdz0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7ICAgICAgICAKLSAgICAgICAgamF2YS5pby5CdWZmZXJlZFdyaXRlciBidyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKHN3KTsgICAgICAgCi0gICAgICAgIGphdmEuaW8uUHJpbnRXcml0ZXIgcHc9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGJ3KTsgICAgICAgCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsgICAgICAgCi0gICAgICAgIHB3LmNsb3NlKCk7ICAgICAgIAotICAgICAgICByZXR1cm4gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIGJvb2xlYW4gaXNTV0FBdHRhY2htZW50KFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkKSB7Ci0gICAgICAgIHJldHVybiBwZC5nZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKSAhPSBudWxsICYmCi0gICAgICAgICAgICBwZC5nZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKS5nZXRBdHRhY2htZW50VHlwZSgpID09IEF0dGFjaG1lbnRUeXBlLlNXQTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgdGhlIHVubWFyc2hhbGxpbmcgaW5mb3JtYXRpb24gc28gdGhhdCBpdCBjYW4gCi0gICAgICogYmUgdXNlZCB0byBzcGVlZCB1cCBzdWJzZXF1ZW50IG1hcnNoYWxsaW5nIGV2ZW50cy4KLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKiBAcGFyYW0gcGFja2FnZXMKLSAgICAgKiBAcGFyYW0gcGFja2FnZXNLZXkKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCByZWdpc3RlclVubWFyc2hhbEluZm8oTWVzc2FnZUNvbnRleHQgbWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlc0tleSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgaW5mb3JtYXRpb24gaXMgcmVnaXN0ZXJlZCBvbiB0aGUgQXhpc09wZXJhdGlvbi4KLSAgICAgICAgaWYgKG1jID09IG51bGwgfHwKLSAgICAgICAgICAgIG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpID09IG51bGwgfHwKLSAgICAgICAgICAgIG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldEF4aXNTZXJ2aWNlKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBzdG9yZWQgb24gdGhlIEF4aXNPcGVyYXRpb24gYXMgdW5tYXJzaGFsbGluZwotICAgICAgICAvLyBpbmZvIHdpbGwgYmUgc3BlY2lmaWMgdG8gYSBtZXRob2QgYW5kIGl0cyBwYXJhbWV0ZXJzCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlcmUgYXJlIHR3byB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIHNhdmVkLgotICAgICAgICAvLyAxKSBUaGUgVW5tYXJzaGFsSW5mbyBvYmplY3QgY29udGFpbmluZyB0aGUgcGFja2FnZXMgCi0gICAgICAgIC8vICAgICh3aGljaCB3aWxsIGJlIHVzZWQgYnkgdGhlIEN1c3RvbUJ1aWxkZXIpCi0gICAgICAgIC8vIDIpIEEgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciB3aGljaCAod2hlbiB0cmlnZ2VyZWQpIHJlZ2lzdGVycwotICAgICAgICAvLyAgICB0aGUgSkFYQkN1c3RvbUJ1aWxkZXIKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc09wLmdldFBhcmFtZXRlcihVbm1hcnNoYWxJbmZvLktFWSk7Ci0gICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVbm1hcnNoYWxJbmZvIGluZm8gPSBuZXcgVW5tYXJzaGFsSW5mbyhwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotICAgICAgICAgICAgYXhpc09wLmFkZFBhcmFtZXRlcihVbm1hcnNoYWxJbmZvLktFWSwgaW5mbyk7Ci0gICAgICAgICAgICBwYXJhbSA9IGF4aXNPcC5nZXRQYXJhbWV0ZXIoVW5tYXJzaGFsSW5mby5LRVkpOwotICAgICAgICAgICAgcGFyYW0uc2V0VHJhbnNpZW50KHRydWUpOwotICAgICAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIHNldCB0aGUgSkFYQkN1c3RvbUJ1aWxkZXIKLSAgICAgICAgICAgIFVubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIuCi0gICAgICAgICAgICAgICAgY3JlYXRlKG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9QREVsZW1lbnQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvUERFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OWI2ZmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9QREVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLmltcGwuYWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLQotCi0vKiogQSBQREVsZW1lbnQgb2JqZWN0IGhvbGRzIGEgUGFyYW1ldGVyRGVzY3JpcHRpb24gIAotICogIEVsZW1lbnQgb2JqZWN0LgotICogCi0gKiBJZiB0aGlzIEVsZW1lbnQgcmVwcmVzZW50cyBhbiBhdHRhY2htZW50LCAKLSAqICAgMSkgVGhlIEVsZW1lbnQgcmVwcmVzZW50cyB0aGUgeG1sIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50IChudWxsIGlmIFNXQSBBdHRhY2htZW50KQotICogICAyKSBUaGUgQXR0YWNobWVudCBvYmplY3QgcmVwcmVzZW50cyB0aGUgYXR0YWNobWVudAotICovCi1wdWJsaWMgY2xhc3MgUERFbGVtZW50IHsKLSAgICBwcml2YXRlIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtOwotICAgIHByaXZhdGUgRWxlbWVudCBlbGVtZW50OwotICAgIHByaXZhdGUgQXR0YWNobWVudCBhdHRhY2htZW50OyAvLyBOdWxsIGlmIG5vdCBhbiBhdHRhY2htZW50Ci0gICAgcHJpdmF0ZSBDbGFzcyBieUphdmFUeXBlQ2xhc3M7ICAvLyBDbGFzcyBmb3IgImJ5IGphdmEgdHlwZSIgbWFyc2hhbGxpbmcgYW5kIHVubWFyc2hhbGxpbmcgaXMgdXNlZC4uLi5ub3JtYWxseSBudWxsCi0KLSAgICBwdWJsaWMgUERFbGVtZW50KFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtLCBFbGVtZW50IGVsZW1lbnQsIENsYXNzIGJ5VHlwZSwgQXR0YWNobWVudCBhdHRhY2htZW50KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgdGhpcy5ieUphdmFUeXBlQ2xhc3MgPSBieVR5cGU7Ci0gICAgICAgIHRoaXMuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFBERWxlbWVudChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbSwgRWxlbWVudCBlbGVtZW50LCBDbGFzcyBieVR5cGUpIHsKLSAgICAgICAgdGhpcyhwYXJhbSwgZWxlbWVudCwgYnlUeXBlLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uIGdldFBhcmFtKCkgewotICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0QnlKYXZhVHlwZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gYnlKYXZhVHlwZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJ5SmF2YVR5cGVDbGFzcyhDbGFzcyBieVR5cGUpIHsKLSAgICAgICAgdGhpcy5ieUphdmFUeXBlQ2xhc3MgPSBieVR5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBdHRhY2htZW50IGdldEF0dGFjaG1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBhdHRhY2htZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvUlBDTGl0TWV0aG9kTWFyc2hhbGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9SUENMaXRNZXRob2RNYXJzaGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWI3ZGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9SUENMaXRNZXRob2RNYXJzaGFsbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tYXJzaGFsbGVyLk1ldGhvZE1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgUlBDTGl0TWV0aG9kTWFyc2hhbGxlciBpbXBsZW1lbnRzIE1ldGhvZE1hcnNoYWxsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJQQ0xpdE1ldGhvZE1hcnNoYWxsZXIuY2xhc3MpOwotCi0gICAgcHVibGljIFJQQ0xpdE1ldGhvZE1hcnNoYWxsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbFJlcXVlc3QoT2JqZWN0W10gc2lnbmF0dXJlQXJndW1lbnRzLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGVuZHBvaW50RGVzYy5nZXRDbGllbnRCaW5kaW5nSUQoKSk7Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3AgeG1sbnM6bT0idXJuOi8vYXBpIj4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbSB4c2k6dHlwZT0iZGF0YTpmb28iID4uLi48L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgUlBDIGhhcyBhbiBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4gIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHdzZGwgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuICAoSW4gZG9jL2xpdAotICAgICAgICAgICAgLy8gICAgICB0aGUgZGF0YSBlbGVtZW50cyBhcmUgdW5kZXJuZWF0aCB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHdzZGw6cGFydCBub3QgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHNjaGVtYS4gIE5vdGUgdGhhdCB0aGUgcGFyYW0gaXMgdW5xdWFsaWZpZWQuLi5wZXIgV1MtSSBCUC4KLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAodGh1cyB0aGVyZSBpcyAKLSAgICAgICAgICAgIC8vICAgICAgSkFYQiB0eXBlIHJlbmRlcmluZy4gIFNpbmNlIHdlIGFyZSB1c2luZyBKQVhCIHRvIG1hcnNoYWwgdGhlIGRhdGEsIAotICAgICAgICAgICAgLy8gICAgICB3ZSBhbHdheXMgZ2VuZXJhdGUgYW4geHNpOnR5cGUgYXR0cmlidXRlLiAgVGhpcyBpcyBhbiBpbXBsZW1lbmF0aW9uIGRldGFpbAotICAgICAgICAgICAgLy8gICAgICBhbmQgaXMgbm90IGRlZmluZWQgYnkgYW55IHNwZWMuCi0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBkcyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRNYXJzaGFsRGVzYyhlbmRwb2ludERlc2MpOwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbWFyc2hhbERlc2MuZ2V0UGFja2FnZXMoKTsKLQotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG5lZWRzIG1vcmUgd29yay4gIFdlIG5lZWQgdG8gY2hlY2sgaW5zaWRlIGhvbGRlcnMgb2YgaW5wdXQgcGFyYW1zLiAgV2UgYWxzbwotICAgICAgICAgICAgLy8gbWF5IHdhbnQgdG8gZXhjbHVkZSBoZWFkZXIgcGFyYW1zIGZyb20gdGhpcyBjaGVjawotICAgICAgICAgICAgLy9WYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBvcGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBudWxsLgotICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICBpZiAocGRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlQXJndW1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIyIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZUFyZ3VtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFyZ3VtZW50IDogc2lnbmF0dXJlQXJndW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIyIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhlIHN0eWxlIGFuZCBvcGVyYXRpb24gZWxlbWVudCBuYW1lLiAgVGhpcyB0cmlnZ2VycyB0aGUgbWVzc2FnZSB0bwotICAgICAgICAgICAgLy8gcHV0IHRoZSBkYXRhIGJsb2NrcyB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudAotICAgICAgICAgICAgbS5zZXRTdHlsZShTdHlsZS5SUEMpOwotICAgICAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KGdldFJQQ09wZXJhdGlvblFOYW1lKG9wZXJhdGlvbkRlc2MsIHRydWUpKTsKLQotICAgICAgICAgICAgLy8gVGhlIGlucHV0IG9iamVjdCByZXByZXNlbnQgdGhlIHNpZ25hdHVyZSBhcmd1bWVudHMuCi0gICAgICAgICAgICAvLyBTaWduYXR1cmUgYXJndW1lbnRzIGFyZSBib3RoIGhvbGRlcnMgYW5kIG5vbi1ob2xkZXJzCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBzaWduYXR1cmUgaW50byBhIGxpc3Qgb2YgSkFYQiBvYmplY3RzIGZvciBtYXJzaGFsbGluZwotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHBkZUxpc3QgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0UERFbGVtZW50cyhtYXJzaGFsRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7IC8vIHVzZSBwYXJ0TmFtZSBzaW5jZSB0aGlzIGlzIHJwYy9saXQKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgbWFyc2hhbGxpbmcgZm9yIAotICAgICAgICAgICAgLy8gYWxsIGJvZHkgZWxlbWVudHMgYW5kIGFsbCBub24tSkFYQiBvYmplY3RzCi0gICAgICAgICAgICBmb3IgKFBERWxlbWVudCBwZGUgOiBwZGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGQgPSBwZGUuZ2V0UGFyYW0oKTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBwZGUuc2V0QnlKYXZhVHlwZUNsYXNzKHR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHV0IHZhbHVlcyBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHBkZUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZGVtYXJzaGFsUmVxdWVzdChNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3AgeG1sbnM6bT0idXJuOi8vYXBpIj4KLSAgICAgICAgICAgIC8vICAgICAgIDxwYXJhbSB4c2k6dHlwZT0iZGF0YTpmb28iID4uLi48L3BhcmFtPgotICAgICAgICAgICAgLy8gICAgPC9tOm9wPgotICAgICAgICAgICAgLy8gPC9zb2FwZW52OmJvZHk+Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHBvaW50cy4KLSAgICAgICAgICAgIC8vICAgMSkgUlBDIGhhcyBhbiBvcGVyYXRpb24gZWxlbWVudCB1bmRlciB0aGUgYm9keS4gIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHdzZGwgb3BlcmF0aW9uLgotICAgICAgICAgICAgLy8gICAyKSBUaGUgZGF0YSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQuICAoSW4gZG9jL2xpdAotICAgICAgICAgICAgLy8gICAgICB0aGUgZGF0YSBlbGVtZW50cyBhcmUgdW5kZXJuZWF0aCB0aGUgYm9keS4KLSAgICAgICAgICAgIC8vICAgMykgVGhlIG5hbWUgb2YgdGhlIGRhdGEgYmxvY2tzIChwYXJhbSkgYXJlIGRlZmluZWQgYnkgdGhlIHdzZGw6cGFydCBub3QgdGhlCi0gICAgICAgICAgICAvLyAgICAgIHNjaGVtYS4gIE5vdGUgdGhhdCBpdCBpcyB1bnF1YWxpZmllZCBwZXIgV1NJLUJQCi0gICAgICAgICAgICAvLyAgIDQpIFRoZSB0eXBlIG9mIHRoZSBkYXRhIGJsb2NrIChkYXRhOmZvbykgaXMgZGVmaW5lZCBieSBzY2hlbWEgKHRodXMgdGhlcmUgaXMgCi0gICAgICAgICAgICAvLyAgICAgIEpBWEIgdHlwZSByZW5kZXJpbmcuICAKLSAgICAgICAgICAgIC8vICAgNSkgV2UgYWx3YXlzIHNlbmQgYW4geHNpOnR5cGUsIGJ1dCBvdGhlciB2ZW5kb3IncyBtYXkgbm90LgotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGF0IHRoZSBzdHlsZSBpcyBSUEMuICBUaGlzIGlzIGltcG9ydGFudCBzbyB0aGF0IHRoZSBtZXNzYWdlIHVuZGVyc3RhbmRzCi0gICAgICAgICAgICAvLyB0aGF0IHRoZSBkYXRhIGJsb2NrcyBhcmUgdW5kZXJuZWF0aCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2V0U3R5bGUoU3R5bGUuUlBDKTsKLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgdW5tYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgYm9keSBlbGVtZW50cyBhbmQgYWxsIG5vbi1KQVhCIG9iamVjdHMKLSAgICAgICAgICAgIENsYXNzW10gamF2YVR5cGVzID0gbmV3IENsYXNzW3Bkcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXNbaV0gPSB0eXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVW5tYXJzaGFsIHRoZSBQYXJhbVZhbHVlcyBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcHZMaXN0ID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldFBERWxlbWVudHMocGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgLy8gaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXMpOyAvLyB1bm1hcnNoYWwgYnkgdHlwZQotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgc2lnbmF0dXJlIGFyZ3VtZW50cwotICAgICAgICAgICAgT2JqZWN0W10gc2lnQXJndW1lbnRzID0gTWV0aG9kTWFyc2hhbGxlclV0aWxzLmNyZWF0ZVJlcXVlc3RTaWduYXR1cmVBcmdzKHBkcywgcHZMaXN0KTsKLQotICAgICAgICAgICAgLy8gVE9ETyBUaGlzIG5lZWRzIG1vcmUgd29yay4gIFdlIG5lZWQgdG8gY2hlY2sgaW5zaWRlIGhvbGRlcnMgb2YgaW5wdXQgcGFyYW1zLiAgV2UgYWxzbwotICAgICAgICAgICAgLy8gbWF5IHdhbnQgdG8gZXhjbHVkZSBoZWFkZXIgcGFyYW1zIGZyb20gdGhpcyBjaGVjawotICAgICAgICAgICAgLy9WYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBvcGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBudWxsLgotICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgIC8vdG8gYSBtZXRob2QgdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIHRocm93IFdlYlNlcnZpY2VFeGNlcHRpb24uCi0gICAgICAgICAgICBpZiAoc2lnQXJndW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBhcmd1bWVudCA6IHNpZ0FyZ3VtZW50cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTnVsbFBhcmFtRXJyMiIsb3BlcmF0aW9uRGVzYy5nZXRKYXZhTWV0aG9kTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaWdBcmd1bWVudHM7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgTWVzc2FnZSBtYXJzaGFsUmVzcG9uc2UoT2JqZWN0IHJldHVybk9iamVjdCwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICAvLyBXZSB3YW50IHRvIHJlc3BvbmQgd2l0aCB0aGUgc2FtZSBwcm90b2NvbCBhcyB0aGUgcmVxdWVzdCwKLSAgICAgICAgLy8gSXQgdGhlIHByb3RvY29sIGlzIG51bGwsIHRoZW4gdXNlIHRoZSBQcm90b2NvbCBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nCi0gICAgICAgIGlmIChwcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BSZXNwb25zZSB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IGl0IGlzIHVucXVhbGlmaWVkLgotICAgICAgICAgICAgLy8gICA0KSBUaGUgdHlwZSBvZiB0aGUgZGF0YSBibG9jayAoZGF0YTpmb28pIGlzIGRlZmluZWQgYnkgc2NoZW1hICh0aHVzIHRoZXJlIGlzIAotICAgICAgICAgICAgLy8gICAgICBKQVhCIHR5cGUgcmVuZGVyaW5nLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEpBWEIgdG8gbWFyc2hhbCB0aGUgZGF0YSwgCi0gICAgICAgICAgICAvLyAgICAgIHdlIGFsd2F5cyBnZW5lcmF0ZSBhbiB4c2k6dHlwZSBhdHRyaWJ1dGUuICBUaGlzIGlzIGFuIGltcGxlbWVuYXRpb24gZGV0YWlsCi0gICAgICAgICAgICAvLyAgICAgIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgc3BlYy4KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGRzID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBtYXJzaGFsRGVzYy5nZXRQYWNrYWdlcygpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIG1lc3NhZ2UgCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUocHJvdG9jb2wpOwotCi0gICAgICAgICAgICAvLyBJbmRpY2F0ZSB0aGUgc3R5bGUgYW5kIG9wZXJhdGlvbiBlbGVtZW50IG5hbWUuICBUaGlzIHRyaWdnZXJzIHRoZSBtZXNzYWdlIHRvCi0gICAgICAgICAgICAvLyBwdXQgdGhlIGRhdGEgYmxvY2tzIHVuZGVybmVhdGggdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgICAgICAgICBtLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0KLQotICAgICAgICAgICAgUU5hbWUgcnBjT3BRTmFtZSA9IGdldFJQQ09wZXJhdGlvblFOYW1lKG9wZXJhdGlvbkRlc2MsIGZhbHNlKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBycGNPcFFOYW1lLmdldExvY2FsUGFydCgpICsgIlJlc3BvbnNlIjsKLSAgICAgICAgICAgIFFOYW1lIHJlc3BvbnNlT3AgPQotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUocnBjT3BRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbG9jYWxQYXJ0LCBycGNPcFFOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIG0uc2V0T3BlcmF0aW9uRWxlbWVudChyZXNwb25zZU9wKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSByZXR1cm4gb2JqZWN0IG9udG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5OUyA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcmV0dXJuTG9jYWxQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5OUyA9IG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuTG9jYWxQYXJ0ID0gb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybk5TID0gIiI7ICAvLyBBY2NvcmRpbmcgdG8gV1NJIEJQIHRoZSBib2R5IHBhcnQgaXMgdW5xdWFsaWZpZWQKLSAgICAgICAgICAgICAgICByZXR1cm5Mb2NhbFBhcnQgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKLQotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYy5nZXRBdHRhY2htZW50VHlwZSgpID09IEF0dGFjaG1lbnRUeXBlLlNXQSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIEF0dGFjaG1lbnQgb2JqZWN0IHdpdGggdGhlIHNpZ25hdHVyZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudCBhdHRhY2htZW50ID0gbmV3IEF0dGFjaG1lbnQocmV0dXJuT2JqZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbS5hZGREYXRhSGFuZGxlcihhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmdldENvbnRlbnRJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwZEVsZW1lbnRFcnIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBhbGxvdyBudWxsIGlmIHRoZSByZXR1cm4gaXMgYSBoZWFkZXI/Ci0gICAgICAgICAgICAgICAgICAgIC8vVmFsaWRhdGUgaW5wdXQgcGFyYW1ldGVycyBmb3Igb3BlcmF0aW9uIGFuZCBtYWtlIHN1cmUgbm8gaW5wdXQgcGFyYW1ldGVycyBhcmUgbnVsbC4KLSAgICAgICAgICAgICAgICAgICAgLy9BcyBwZXIgSkFYV1MgU3BlY2lmaWNhdGlvbiBzZWN0aW9uIDMuNi4yLjMgaWYgYSBudWxsIHZhbHVlIGlzIHBhc3NlcyBhcyBhbiBhcmd1bWVudCAKLSAgICAgICAgICAgICAgICAgICAgLy90byBhIG1ldGhvZCB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybk9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJOdWxsUGFyYW1FcnIzIixvcGVyYXRpb25EZXNjLmdldEphdmFNZXRob2ROYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHJldHVyblFOYW1lID0gbmV3IFFOYW1lKHJldHVybk5TLCByZXR1cm5Mb2NhbFBhcnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFyc2hhbERlc2MuZ2V0QW5ub3RhdGlvbkRlc2MocmV0dXJuVHlwZSkuaGFzWG1sUm9vdEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KHJldHVybk9iamVjdCwgcmV0dXJuUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBFbGVtZW50KHJldHVybk9iamVjdCwgcmV0dXJuUU5hbWUsIHJldHVyblR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG1hcnNoYWxsaW5nIGJ5IGphdmEgdHlwZSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYnlKYXZhVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHJldHVyblR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnlKYXZhVHlwZSA9IHJldHVyblR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLnRvTWVzc2FnZShyZXR1cm5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieUphdmFUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBob2xkZXIgb2JqZWN0cyBpbnRvIGEgbGlzdCBvZiBKQVhCIG9iamVjdHMgZm9yIG1hcnNoYWxsaW5nCi0gICAgICAgICAgICBMaXN0PFBERWxlbWVudD4gcGRlTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZUFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsgICAvLyB1c2UgcGFydE5hbWUgc2luY2UgdGhpcyBpcyBycGMvbGl0Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlICJieSBKYXZhIFR5cGUiIG1hcnNoYWxsaW5nIGZvciAKLSAgICAgICAgICAgIC8vIGFsbCBib2R5IGVsZW1lbnRzIGFuZCBhbGwgbm9uLUpBWEIgb2JqZWN0cwotICAgICAgICAgICAgZm9yIChQREVsZW1lbnQgcGRlIDogcGRlTGlzdCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkID0gcGRlLmdldFBhcmFtKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBkLmlzSGVhZGVyKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy5pc05vdEpBWEJSb290RWxlbWVudCh0eXBlLCBtYXJzaGFsRGVzYykpIHsKLSAgICAgICAgICAgICAgICAgICAgcGRlLnNldEJ5SmF2YVR5cGVDbGFzcyh0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBjaGVjayBmb3IgbnVsbCBvdXRwdXQgYm9keSB2YWx1ZXM/ICBTaG91bGQgd2UgY2hlY2sgZm9yIG51bGwgb3V0cHV0IGhlYWRlciB2YWx1ZXMgPwotICAgICAgICAgICAgLy8gUHV0IHZhbHVlcyBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMudG9NZXNzYWdlKHBkZUxpc3QsIG0sIHBhY2thZ2VzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBmb3IgbmVzdGVkIFN3YVJlZiBhdHRhY2htZW50cwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXREb2luZ1NXQSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgT2JqZWN0IGRlbWFyc2hhbFJlc3BvbnNlKE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0W10gc2lnbmF0dXJlQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlZCA9IG9wZXJhdGlvbkRlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGVkLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTYW1wbGUgUlBDIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIC4uCi0gICAgICAgICAgICAvLyA8c29hcGVudjpib2R5PgotICAgICAgICAgICAgLy8gICAgPG06b3BSZXNwb25zZSB4bWxuczptPSJ1cm46Ly9hcGkiPgotICAgICAgICAgICAgLy8gICAgICAgPHBhcmFtIHhzaTp0eXBlPSJkYXRhOmZvbyIgPi4uLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLyAgICA8L206b3A+Ci0gICAgICAgICAgICAvLyA8L3NvYXBlbnY6Ym9keT4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBJbXBvcnRhbnQgcG9pbnRzLgotICAgICAgICAgICAgLy8gICAxKSBSUEMgaGFzIGFuIG9wZXJhdGlvbiBlbGVtZW50IHVuZGVyIHRoZSBib2R5LiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLSAgICAgICAgICAgIC8vICAgICAgd3NkbCBvcGVyYXRpb24uCi0gICAgICAgICAgICAvLyAgIDIpIFRoZSBkYXRhIGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudC4gIChJbiBkb2MvbGl0Ci0gICAgICAgICAgICAvLyAgICAgIHRoZSBkYXRhIGVsZW1lbnRzIGFyZSB1bmRlcm5lYXRoIHRoZSBib2R5LgotICAgICAgICAgICAgLy8gICAzKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBibG9ja3MgKHBhcmFtKSBhcmUgZGVmaW5lZCBieSB0aGUgd3NkbDpwYXJ0IG5vdCB0aGUKLSAgICAgICAgICAgIC8vICAgICAgc2NoZW1hLiAgTm90ZSB0aGF0IGl0IGlzIHVucXVhbGlmaWVkIHBlciBXU0ktQlAKLSAgICAgICAgICAgIC8vICAgNCkgVGhlIHR5cGUgb2YgdGhlIGRhdGEgYmxvY2sgKGRhdGE6Zm9vKSBpcyBkZWZpbmVkIGJ5IHNjaGVtYSAodGh1cyB0aGVyZSBpcyAKLSAgICAgICAgICAgIC8vICAgICAgSkFYQiB0eXBlIHJlbmRlcmluZy4gIAotICAgICAgICAgICAgLy8gICA1KSBXZSBhbHdheXMgc2VuZCBhbiB4c2k6dHlwZSwgYnV0IG90aGVyIHZlbmRvcidzIG1heSBub3QuCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwZHMgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbWFyc2hhbERlc2MgPQotICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIHN0eWxlIGlzIFJQQy4gIFRoaXMgaXMgaW1wb3J0YW50IHNvIHRoYXQgdGhlIG1lc3NhZ2UgdW5kZXJzdGFuZHMKLSAgICAgICAgICAgIC8vIHRoYXQgdGhlIGRhdGEgYmxvY2tzIGFyZSB1bmRlcm5lYXRoIHRoZSBvcGVyYXRpb24gZWxlbWVudAotICAgICAgICAgICAgbWVzc2FnZS5zZXRTdHlsZShTdHlsZS5SUEMpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJldHVybiB2YWx1ZS4KLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1JldHVybkluQm9keSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYyA9IAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50RGVzYy5nZXRBdHRhY2htZW50VHlwZSgpID09IEF0dGFjaG1lbnRUeXBlLlNXQSkgewotICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2lkID0gbWVzc2FnZS5nZXRBdHRhY2htZW50SUQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbWVzc2FnZS5nZXREYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWxzLmlzQ29udmVydGFibGUocmV0dXJuVmFsdWUsIHJldHVyblR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IENvbnZlcnRVdGlscy5jb252ZXJ0KHJldHVyblZhbHVlLCByZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBkRWxlbWVudEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB3ZWJyZXN1bHQgaXMgaW4gdGhlIGhlYWRlciwgd2UgbmVlZCB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQuCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSAiYnlKYXZhVHlwZSIgdW5tYXJzaGFsbGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgYnlKYXZhVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHJldHVyblR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnlKYXZhVHlwZSA9IHJldHVyblR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJldHVybkVsZW1lbnQocGFja2FnZXMsIG1lc3NhZ2UsIGJ5SmF2YVR5cGUsICBvcGVyYXRpb25EZXNjLmlzTGlzdFR5cGUoKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubnVtT3V0cHV0Qm9keVBhcmFtcyhwZHMpID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBNZXRob2RNYXJzaGFsbGVyVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXR1cm5FbGVtZW50KHBhY2thZ2VzLCBtZXNzYWdlLCBieUphdmFUeXBlLCAgb3BlcmF0aW9uRGVzYy5pc0xpc3RUeXBlKCksIGZhbHNlLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLm51bU91dHB1dEJvZHlQYXJhbXMocGRzKSA+IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFzUmV0dXJuSW5Cb2R5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHJldHVybkVsZW1lbnQuZ2V0VHlwZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGFsbG93IG51bGwgaWYgdGhlIHJldHVybiBpcyBhIGhlYWRlcj8KLSAgICAgICAgICAgICAgICAgICAgLy9WYWxpZGF0ZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciBvcGVyYXRpb24gYW5kIG1ha2Ugc3VyZSBubyBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBudWxsLgotICAgICAgICAgICAgICAgICAgICAvL0FzIHBlciBKQVhXUyBTcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy42LjIuMyBpZiBhIG51bGwgdmFsdWUgaXMgcGFzc2VzIGFzIGFuIGFyZ3VtZW50IAotICAgICAgICAgICAgICAgICAgICAvL3RvIGEgbWV0aG9kIHRoZW4gYW4gaW1wbGVtZW50YXRpb24gTVVTVCB0aHJvdyBXZWJTZXJ2aWNlRXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiTnVsbFBhcmFtRXJyMyIsb3BlcmF0aW9uRGVzYy5nZXRKYXZhTWV0aG9kTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgImJ5IEphdmEgVHlwZSIgdW5tYXJzaGFsbGluZyBmb3IgCi0gICAgICAgICAgICAvLyBhbGwgYm9keSBlbGVtZW50cyBhbmQgYWxsIG5vbi1KQVhCIG9iamVjdHMKLSAgICAgICAgICAgIENsYXNzW10gamF2YVR5cGVzID0gbmV3IENsYXNzW3Bkcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZCA9IHBkc1tpXTsKLSAgICAgICAgICAgICAgICBDbGFzcyB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICghcGQuaXNIZWFkZXIoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmlzTm90SkFYQlJvb3RFbGVtZW50KHR5cGUsIG1hcnNoYWxEZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBqYXZhVHlwZXNbaV0gPSB0eXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVW5tYXJzaGFsbCB0aGUgUGFyYW1WYWx1ZXMgZnJvbSB0aGUgTWVzc2FnZQotICAgICAgICAgICAgTGlzdDxQREVsZW1lbnQ+IHB2TGlzdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5nZXRQREVsZW1lbnRzKHBkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAvLyBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNSZXR1cm5JbkJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YVR5cGVzKTsgLy8gdW5tYXJzaGFsIGJ5IHR5cGUKLQotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgd2UgY2hlY2sgZm9yIG51bGwgb3V0cHV0IGJvZHkgdmFsdWVzPyAgU2hvdWxkIHdlIGNoZWNrIGZvciBudWxsIG91dHB1dCBoZWFkZXIgdmFsdWVzID8KLQotICAgICAgICAgICAgLy8gUG9wdWxhdGUgdGhlIHJlc3BvbnNlIEhvbGRlcnMKLSAgICAgICAgICAgIE1ldGhvZE1hcnNoYWxsZXJVdGlscy51cGRhdGVSZXNwb25zZVNpZ25hdHVyZUFyZ3MocGRzLCBwdkxpc3QsIHNpZ25hdHVyZUFyZ3MpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgbWFyc2hhbEZhdWx0UmVzcG9uc2UoVGhyb3dhYmxlIHRocm93YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVkID0gb3BlcmF0aW9uRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZWQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtYXJzaGFsRGVzYyA9Ci0gICAgICAgICAgICAgICAgTWV0aG9kTWFyc2hhbGxlclV0aWxzLmdldE1hcnNoYWxEZXNjKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG1hcnNoYWxEZXNjLmdldFBhY2thZ2VzKCk7Ci0KLSAgICAgICAgLy8gV2Ugd2FudCB0byByZXNwb25kIHdpdGggdGhlIHNhbWUgcHJvdG9jb2wgYXMgdGhlIHJlcXVlc3QsCi0gICAgICAgIC8vIEl0IHRoZSBwcm90b2NvbCBpcyBudWxsLCB0aGVuIHVzZSB0aGUgUHJvdG9jb2wgZGVmaW5lZCBieSB0aGUgYmluZGluZwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoZW5kcG9pbnREZXNjLmdldEJpbmRpbmdUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSBhbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGFuZCByZXRocm93biB3aXRoIGEgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBtZXNzYWdlIAotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKHByb3RvY29sKTsKLQotICAgICAgICAgICAgLy8gUHV0IHRoZSBmYXVsdCBvbnRvIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMubWFyc2hhbEZhdWx0UmVzcG9uc2UodGhyb3dhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSk7Ci0gICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGRlbWFyc2hhbEZhdWx0UmVzcG9uc2UoTWVzc2FnZSBtZXNzYWdlLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWQgPSBvcGVyYXRpb25EZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBlZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1hcnNoYWxEZXNjID0KLSAgICAgICAgICAgICAgICBNZXRob2RNYXJzaGFsbGVyVXRpbHMuZ2V0TWFyc2hhbERlc2MoZW5kcG9pbnREZXNjKTsKLQotICAgICAgICAvLyBOb3RlIGFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgYW5kIHJldGhyb3duIHdpdGggYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscwotICAgICAgICAgICAgICAgICAgICAuZGVtYXJzaGFsRmF1bHRSZXNwb25zZShvcGVyYXRpb25EZXNjLCBtYXJzaGFsRGVzYywgbWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3BEZXNjCi0gICAgICogQHJldHVybiBxdWFsaWZpZWQgcW5hbWUgdG8gdXNlIGluIHRoZSBycGMgbWVzc2FnZSB0byByZXByZXNlbnQgdGhlIG9wZXJhdGlvbiAocGVyIFdTSSBCUCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBRTmFtZSBnZXRSUENPcGVyYXRpb25RTmFtZShPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MsIGJvb2xlYW4gaXNSZXF1ZXN0KSB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gb3BEZXNjLmdldE5hbWUoKTsKLQotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGlzUmVxdWVzdCkgewotICAgICAgICAgICAgdXJpID0gb3BEZXNjLmdldEJpbmRpbmdJbnB1dE5hbWVzcGFjZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXJpID0gb3BEZXNjLmdldEJpbmRpbmdPdXRwdXROYW1lc3BhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICJycGNPcCI7ICAvLyBQcmVmZXIgdXNpbmcgYW4gYWN0dWFsIHByZWZpeAotCi0KLSAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUodXJpLCBsb2NhbFBhcnQsIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBxTmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvVW5tYXJzaGFsSW5mby5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Vbm1hcnNoYWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTFjYWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWFyc2hhbGxlci9pbXBsL2FsdC9Vbm1hcnNoYWxJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1hcnNoYWxsZXIuaW1wbC5hbHQ7DQotDQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLS8qKg0KLSAqIEluZm9ybWF0aW9uIHNhdmVkIGZyb20gYSBwcmlvciB1bm1hcnNoYWwgdGhhdCBpcyB1c2VkDQotICogdG8gc3BlZWQgdXAgc3Vic2VxdWVudCB1bm1hcnNoYWxsaW5nLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVbm1hcnNoYWxJbmZvIHsNCi0gICAgLy8gVGhlIFVubWFyc2hhbEluZm8gaXMgc2F2ZWQgb24gdGhlIEF4aXNTZXJ2aWNlIHdpdGggdGhlIGZvbGxvd2luZyBLRVkNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5Vbm1hcnNoYWxJbmZvIjsNCi0gICAgDQotICAgIHByaXZhdGUgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzOw0KLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlc0tleTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gcGFja2FnZXMNCi0gICAgICogQHBhcmFtIHBhY2thZ2VzS2V5DQotICAgICAqLw0KLSAgICBVbm1hcnNoYWxJbmZvKFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcywgU3RyaW5nIHBhY2thZ2VzS2V5KSB7DQotICAgICAgICB0aGlzLnBhY2thZ2VzID0gcGFja2FnZXM7DQotICAgICAgICB0aGlzLnBhY2thZ2VzS2V5ID0gcGFja2FnZXNLZXk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gbGlzdCBvZiBwYWNrYWdlcy4uLnVzZWQgYnkgY2FsbGVyIHRvIGJ1aWxkIGEgSkFYQkNvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyBUcmVlU2V0PFN0cmluZz4gZ2V0UGFja2FnZXMoKSB7DQotICAgICAgICByZXR1cm4gcGFja2FnZXM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gcGFja2FnZXNLZXkuLi51c2VkIGJ5IGNhbGxlciBhcyBhIGtleSB0byBnZXQgSkFYQkNvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZXNLZXkoKSB7DQotICAgICAgICByZXR1cm4gcGFja2FnZXNLZXk7DQotICAgIH0NCi0gICAgDQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tYXJzaGFsbGVyL2ltcGwvYWx0L1VubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhlMzA3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21hcnNoYWxsZXIvaW1wbC9hbHQvVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJDdXN0b21CdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRFNDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uTWVzc2FnZUNvbnRleHRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBUaGlzIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgaXMgdHJpZ2dlcmVkIHdoZW4gDQotICogYSBTZXJ2aWNlQ29udGV4dCBpcyBhdHRhY2hlZCB0byB0aGUgTWVzc2FnZUNvbnRleHQgYW5kDQotICogd2hlbiBhIFNPQVBFbnZlbG9wZSBpcyBhdHRhY2hlZCB0byB0aGUgTWVzc2FnZUNvbnRleHQuDQotICogDQotICogSW4gc3VjaCBjYXNlcywgaXQgYXR0ZW1wdHMgdG8gZ2V0IGEgcHJldmlvdXNseSBjYWNoZWQgKGZyb20gYSBwcmlvciB3ZWIgc2VydmljZSBjYWxsKQ0KLSAqIFVubWFyc2hhbEluZm8gb2JqZWN0IGZyb20gdGhlIEF4aXNTZXJ2aWNlLiAgVGhlIFVubWFyc2hhbEluZm8NCi0gKiBkYXRhIGlzIHVzZWQgdG8gY3JlYXRlIGEgSkFYQkN1c3RvbUJ1aWxkZXIgb24gdGhlIFNPQVBFbnZlbG9wZSdzIGJ1aWxkZXIuDQotICogDQotICogVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCB0aGUgU3RBWE9NQnVpbGRlciB3aWxsIHVzZSB0aGUgSkFYQkN1c3RvbUJ1aWxkZXIgZHVyaW5nDQotICogdW5tYXJzaGFsbGluZy4gIFRoaXMgc2F2ZXMgdGltZSBhbmQgc3BhY2UuDQotICovDQotcHVibGljIGNsYXNzIFVubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBNZXNzYWdlQ29udGV4dExpc3RlbmVyIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IA0KLSAgICAgICAgICAgIExvZ0ZhY3RvcnkuZ2V0TG9nKFVubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIuY2xhc3MpOw0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuZCBhZGQgYSBsaXN0ZW5lcg0KLSAgICAgKiBAcGFyYW0gc2MgU2VydmljZUNvbnRleHQNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGUoU2VydmljZUNvbnRleHQgc2MpIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gT25seSBjcmVhdGUgYW5kIGFkZCBvbmUgbGlzdGVuZXIgDQotICAgICAgICBpZiAoc2MgPT0gbnVsbCB8fCANCi0gICAgICAgICAgICBzYy5nZXRBeGlzU2VydmljZSgpID09IG51bGwgfHwNCi0gICAgICAgICAgICBzYy5nZXRBeGlzU2VydmljZSgpLg0KLSAgICAgICAgICAgICAgIGhhc01lc3NhZ2VDb250ZXh0TGlzdGVuZXIoVW5tYXJzaGFsTWVzc2FnZUNvbnRleHRMaXN0ZW5lci5jbGFzcykpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBVbm1hcnNoYWxNZXNzYWdlQ29udGV4dExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFVubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIoKTsNCi0gICAgICAgIHNjLmdldEF4aXNTZXJ2aWNlKCkuYWRkTWVzc2FnZUNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVc2VyIGNyZWF0ZSBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW5kIHJlZ2lzdGVyIGxpc3RlbmVyDQotICAgICAqLw0KLSAgICBwcml2YXRlIFVubWFyc2hhbE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIoKSB7ICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEF0dGFjaCB0aGUgSkFYQkN1c3RvbUJ1aWxkZXIgb24gdGhlIEF4aW9tIGJ1aWxkZXIuDQotICAgICAqIFRoaXMgd2lsbCBzcGVlZHVwIHRoZSBKQVhCIHVubWFyc2hhbGxpbmcgY29kZQ0KLSAgICAgKiBAcGFyYW0gc2MNCi0gICAgICogQHBhcmFtIG1jDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgaW5zdGFsbEpBWEJDdXN0b21CdWlsZGVyKFNlcnZpY2VDb250ZXh0IHNjLCBNZXNzYWdlQ29udGV4dCBtYykgew0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoImF0dGFjaEV2ZW50IGZvciBzYz0gIiArIHNjLmdldE5hbWUoKSArICJhbmQgIG1jPSIgKyBtYy5nZXRMb2dDb3JyZWxhdGlvbklEKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIE1lc3NhZ2VDb250ZXh0IGhhcyBhIFNPQVBFbnZlbG9wZSBhbmQgQnVpbGRlcg0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGVudmVsb3BlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBpZiAoIShlbnZlbG9wZS5nZXRCdWlsZGVyKCkgaW5zdGFuY2VvZiBTdEFYT01CdWlsZGVyKSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm47DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBVbm1hcnNoYWxJbmZvIG9iamVjdC4NCi0gICAgICAgIC8vIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gZnJvbSBwcmlvciB1bm1hcnNoYWxsaW5nDQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG1jLmdldEF4aXNPcGVyYXRpb24oKTsNCi0gICAgICAgIGlmIChheGlzT3AgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlckluZm8gPSBheGlzT3AuZ2V0UGFyYW1ldGVyKFVubWFyc2hhbEluZm8uS0VZKTsNCi0gICAgICAgIGlmIChwYXJhbWV0ZXJJbmZvID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm47DQotICAgICAgICB9DQotICAgICAgICBVbm1hcnNoYWxJbmZvIGluZm8gPSAgKFVubWFyc2hhbEluZm8pIHBhcmFtZXRlckluZm8uZ2V0VmFsdWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JhdGUgYSBKQVhCQ3VzdG9tQnVpbGRlciBhbmQgcmVnaXN0ZXIgaXQgb24gdGhlIEF4aW9tIFN0QVhPTUJ1aWxkZXINCi0gICAgICAgIEpBWEJEU0NvbnRleHQgamF4YkRTQyA9IG5ldyBKQVhCRFNDb250ZXh0KGluZm8uZ2V0UGFja2FnZXMoKSwgaW5mby5nZXRQYWNrYWdlc0tleSgpKTsNCi0gICAgICAgIGpheGJEU0Muc2V0TWVzc2FnZUNvbnRleHQobWMpOw0KLSAgICAgICAgSkFYQkN1c3RvbUJ1aWxkZXIgamNiID0gbmV3IEpBWEJDdXN0b21CdWlsZGVyKGpheGJEU0MpOw0KLSAgICAgICAgKChTdEFYT01CdWlsZGVyKSBlbnZlbG9wZS5nZXRCdWlsZGVyKCkpLnJlZ2lzdGVyQ3VzdG9tQnVpbGRlckZvclBheWxvYWQoamNiKTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVnaXN0ZXJpbmcgSkFYQkN1c3RvbUJ1aWxkZXI6ICIgKyBqY2IgKyAiIGZvciBBeGlzT3BlcmF0aW9uOiAiICsgYXhpc09wLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYXR0YWNoRW52ZWxvcGVFdmVudChNZXNzYWdlQ29udGV4dCBtYykgew0KLSAgICAgICAgaWYgKG1jLmdldFNlcnZpY2VDb250ZXh0KCkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGluc3RhbGxKQVhCQ3VzdG9tQnVpbGRlcihtYy5nZXRTZXJ2aWNlQ29udGV4dCgpLCBtYyk7DQotICAgICAgICB9IA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGF0dGFjaFNlcnZpY2VDb250ZXh0RXZlbnQoU2VydmljZUNvbnRleHQgc2MsIE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICBpZiAobWMuZ2V0RW52ZWxvcGUoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW5zdGFsbEpBWEJDdXN0b21CdWlsZGVyKHNjLCBtYyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9CbG9jay5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRiNWNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogQmxvY2sgQSBCbG9jayByZXByZXNlbnRzIGFuIHhtbCBlbGVtZW50IGFuZCBhc3NvY2lhdGVkIHN1Yi10cmVlLiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBtdXN0IGJlCi0gKiBkZWZpbmVkIGJ5IGEgcm9vdCBlbGVtZW50IGluIGEgc2NoZW1hLiBBbGwgcHJlZml4ZXMgd2l0aGluIHRoZSBzdWJ0cmVlIG11c3QgY29ycmVzcG9uZCB0bwotICogbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBkZWZpbmVkIHdpdGhpbiB0aGUgdHJlZS4gTWFueSBzcGVjaWZpY2F0aW9ucyByZWZlciB0byB0aGlzIGFzIGEgImVtYmVkZGVkCi0gKiBkb2N1bWVudCIgb3IgInhtbCBibG9jayIuICBJIGNob3NlIHRoZSB0ZXJtLCBibG9jaywgZm9yIHNpbXBsaWNpdHkuCi0gKiA8cC8+Ci0gKiBUaGUgYmxvY2sgY2FuIGJlIGV4cG9zZWQgYXM6ICogQnVzaW5lc3NPYmplY3QgKiBTdEFYIG9iamVjdAotICogPHAvPgotICogTm90ZSB0aGF0IHRoZSB3aG9sZSBNZXNzYWdlIGNhbiBhbHNvIGJlIHRob3VnaHQgb2YgYXMgYSBCbG9jay4gIFRodXMgYSBNZXNzYWdlIGNhbiBiZSBjcmVhdGVGcm9tCi0gKiBhIEJsb2NrIGFuZCB3cml0dGVuIGFzIGEgQmxvY2suCi0gKiA8cC8+Ci0gKiBJbiBhZGRpdGlvbiwgZWFjaCBvZiB0aGUgYWNjZXNzb3JzIGhhcyBhIGNvbnN1bWUgcGFyYW1ldGVyLiAgSWYgY29uc3VtZSBpcyB0cnVlLCB0aGUgQmxvY2sgaXMgbm8KLSAqIGxvbmdlciB2YWxpZCBhZnRlciB0aGUgbWVzc2FnZSBpcyBjYWxsZWQuIChpLmUuIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGNhY2hlIHRoZQotICogaW5mb3JtYXRpb24pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2sgZXh0ZW5kcyBPTURhdGFTb3VyY2VFeHQgewotCi0gICAgLyoqCi0gICAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBCdXNpbmVzcyBPYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBCbG9jawotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN1bWUgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlcXVlc3Qgb24gdGhlIGJsb2NrLgotICAgICAqIEByZXR1cm4gT2JqZWN0IChKQVhCLCBTdHJpbmcgZXRjLikKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QnVzaW5lc3NPYmplY3QoYm9vbGVhbiBjb25zdW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0QnVzaW5lc0NvbnRleHQgU29tZSBidXNpbmVzcyBvYmplY3RzIGhhdmUgYW4gYXNzb2NpYXRlZCBjb250ZXh0IG9iamVjdCAoaS5lLiBKQVhCQ29udGV4dCkKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ29udGV4dCBPYmplY3Qgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QnVzaW5lc3NDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFhNTFN0cmVhbVJlYWRlciByZXByZXNlbnRlZCBieSB0aGlzIEJsb2NrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgYmxvY2suCi0gICAgICogQHJldHVybiBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0WE1MU3RyZWFtUmVhZGVyKGJvb2xlYW4gY29uc3VtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIE9NRWxlbWVudCByZXByZXNlbnRlZCBieSB0aGlzIEJsb2NrLiBUaGlzIGNhbGwgYWx3YXlzIGNvbnN1bWVzIHRoZSBibG9jayBiZWNhdXNlIHlvdSBhcmUKLSAgICAgKiB0YWtpbmcgY29udHJvbCBvZiB0aGUgdW5kZXJseWluZyBPTQotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgb3V0IHRoZSBCbG9jawotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciAgWE1MU3RyZWFtV3JpdGVyCi0gICAgICogQHBhcmFtIGNvbnN1bWUgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlcXVlc3Qgb24gdGhlIGJsb2NrLgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRyaG93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGlzQ29uc3VtZWQgUmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIGlzIGNvbnN1bWVkLiAgT25jZSBjb25zdW1lZCwgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBibG9jawotICAgICAqIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIGlzIGNvbnN1bWVkIChhIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggY29uc3VtZT10cnVlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3VtZWQoKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhIHRyYWNlU3RyaW5nLi4udGhlIHRyYWNlIHN0cmluZyBkdW1wcyB0aGUgY29udGVudHMgb2YgdGhlIEJsb2NrIHdpdGhvdXQgZm9yY2luZyBhbgotICAgICAqIHVuZGVybHlpbmcgaWxsLXBlcmZvcm1hbnQgdHJhbnNmb3JtYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRyYWNlIGluZm9ybWF0aW9uCi0gICAgICogQGJvb2xlYW4gaW5kZW50IFN0cmluZyBjb250YWluaW5nIGluZGVudCBjaGFyYWN0ZXJzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gSWYgUU5hbWUgaXMgYXZhaWxhYmxlIHdpdGhvdXQgZG9pbmcgYW4gZXhwZW5zaXZlIHBhcnNlIG9mIHRoZSBidXNpbmVzcyBvYmplY3QsIHRoZW4KLSAgICAgKiAgICAgICAgIHJldHVybiB0cnVlIE90aGVyd2lzZSByZXR1cm4gZmFsc2UgTm90ZTogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gc2l0dWF0aW9ucyB3aGVyZQotICAgICAqICAgICAgICAgaXQgd291bGQgYmUgbmljZSB0byBrbm93IHRoZSBxbmFtZSAobGlrZSBsb2dnaW5nIG9yIGEgc3BlY2lhbCBjaGVjaykgYnV0IHdlIGRvbid0IHdhbnQKLSAgICAgKiAgICAgICAgIHRvIGNhdXNlIGFuIGlsbC1wZXJmb3JtYW50IHBhcnNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUU5hbWVBdmFpbGFibGUoKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUU5hbWUgKG5hbWVzcGFjZSwgbG9jYWxwYXJ0KSBvZiB0aGUgQmxvY2suICBEbyBub3QgZGVwZW5kIG9uIHByZWZpeCBiZWluZyBzZXQgY29ycmVjdGx5LgotICAgICAqIEFza2luZyBmb3IgdGhlIFFOYW1lIGNhbiBjYXVzZSBhIHBlcmZvcm1hbnQgaGl0LgotICAgICAqCi0gICAgICogQHJldHVybiBRTmFtZSBvZiB0aGUgYmxvY2sKLSAgICAgKiBAdGhyb3cgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEBzZWUgaXNRTmFtZUF2YWlsYWJsZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0IEJsb2NrRmFjdG9yeQotICAgICAqCi0gICAgICogQHJldHVybiBCbG9ja0ZhY3RvcnkgdGhhdCBjcmVhdGVkIHRoZSBCbG9jawotICAgICAqLwotICAgIHB1YmxpYyBCbG9ja0ZhY3RvcnkgZ2V0QmxvY2tGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIE1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYmxvY2sKLSAgICAgKgotICAgICAqIEByZXR1cm4gTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGdldFBhcmVudCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBNZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJsb2NrIChUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYnkgdGhlCi0gICAgICogTWVzc2FnZSBJbXBsZW1lbnRhdGlvbiBvbmx5KQotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNZXNzYWdlIHBhcmVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZGF0YSBpcyBhbHdheXMgYW4gZWxlbWVudDsgZmFsc2UgaWYgcG9zc2libHkgbWl4ZWQgY29udGVudCBvciBtdWx0aXBsZQotICAgICAqICAgICAgICAgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREYXRhKCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWZiM2M1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBNZXNzYWdlCi0gKiA8cC8+Ci0gKiBBIE1lc3NhZ2UgcmVwcmVzZW50cyB0aGUgWE1MICsgQXR0YWNobWVudHMKLSAqIDxwLz4KLSAqIE1vc3Qgb2YgdGhlIG1ldGhvZHMgYXZhaWxhYmxlIG9uIGEgbWVzc2FnZSBhcmUgb25seSBhcHBsaWNhYmxlIHRvIHRoZSBYTUwgcGFydCBvZiB0aGUgTWVzc2FnZS4KLSAqIFNlZSB0aGUgWE1MUGFydCBpbnRlcmZhY2UgZm9yIGFuIGV4cGxhbnRhdGlvbiBvZiB0aGVzZSBtZXRob2RzLgotICoKLSAqIEBzZWUgWE1MUGFydAotICogQHNlZSBBdHRhY2htZW50Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIFhNTFBhcnQgewotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm90b2NvbCBmb3IgdGhpcyBNZXNzYWdlIChzb2FwMTEsIHNvYXAxMiwgZXRjLikKLSAgICAgKgotICAgICAqIEByZXR1cm4gUHJvdG9jbAotICAgICAqLwotICAgIHB1YmxpYyBQcm90b2NvbCBnZXRQcm90b2NvbCgpOwotCi0gICAgLyoqCi0gICAgICogZ2V0QXNTT0FQTWVzc2FnZSBHZXQgdGhlIHhtbCBwYXJ0IGFzIGEgcmVhZC93cml0ZSBTT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEByZXR1cm4gU09BUEVudmVsb3BlCi0gICAgICovCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGdldEFzU09BUE1lc3NhZ2UoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEFkZCBBdHRhY2htZW50Ci0gICAgICogQHBhcmFtIGRoIERhdGFIYW5kbGVyICh0eXBlIG9mIEF0dGFjaG1lbnQgaXMgaW5mZXJyZWQgZnJvbSBkaC5nZXRDb250ZW50VHlwZSkKLSAgICAgKiBAcGFyYW0gaWQgU3RyaW5nIHdoaWNoIGlzIHRoZSBBdHRhY2htZW50IGNvbnRlbnQgaWQKLSAgICAgKiBAc2VlIGFkZEF0dGFjaG1lbnQoQXR0YWNobWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREYXRhSGFuZGxlcihEYXRhSGFuZGxlciBkaCwgU3RyaW5nIGlkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgYXR0YWNobWVudCBjb250ZW50IGlkcyBmb3IgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIExpc3Q8U3RyaW5nPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXR0YWNobWVudElEcygpOwotICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGljYXRlZCAobm9uLXNvYXAgcGFydCkgYXR0YWNobWVudCBpZAotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gQ0lEIG9yIG51bGwgaWYgbm90IHByZXNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRJRChpbnQgaW5kZXgpOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kaWNhdGVkIChub24tc29hcCBwYXJ0KSBhdHRhY2htZW50IGlkCi0gICAgICogQHBhcmFtIHBhcnROYW1lIChXUy1JIGluZGljYXRlcyB0aGF0IFNXQSBhdHRhY2htZW50cyBoYXZlIGEgcGFydE5hbWUgcHJlZml4KQotICAgICAqIEByZXR1cm4gQ0lEIG9yIG51bGwgaWYgbm90IHByZXNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRJRChTdHJpbmcgcGFydE5hbWUpOwotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgYXR0YWNobWVudCBpZGVudGlmaWVkIGJ5IHRoZSBjb250ZW50SUQgCi0gICAgICogQHBhcmFtIGNpZAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUhhbmRsZXIgZ2V0RGF0YUhhbmRsZXIoU3RyaW5nIGNpZCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhhdCBhbiBTV0EgRGF0YUhhbmRsZXIgd2FzIGFkZGVkIHRvIHRoZSBtZXNzYWdlLgotICAgICAqIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSB1c2VkIHRvIHRyaWdnZXIgU1dBIHNlcmlhbGl6YXRpb24uCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9pbmdTV0EoYm9vbGVhbiB2YWx1ZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIFNXQSBEYXRhSGFuZGxlciBpcyBwcmVzZW50Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2luZ1NXQSgpOwotICAgIAotICAgIC8qKiAKLSAgICAgKiBHZXQgdGhlIGF0dGFjaG1lbnQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBNZXNzYWdlCi0gICAgICogQHBhcmFtIGNpZAotICAgICAqLwotICAgIHB1YmxpYyBEYXRhSGFuZGxlciByZW1vdmVEYXRhSGFuZGxlcihTdHJpbmcgY2lkKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIG1lc3NhZ2UgaXMgTVRPTSBlbmFibGVkIGlmIHRoZSAKLSAgICAgKiBhc3NvY2lhdGVkIGRpc3BhdGNoL2NsaWVudC9pbXBsL3Byb3ZpZGVyIGhhcyBhIGJpbmRpbmcgdHlwZSAKLSAgICAgKiB0aGF0IGVuYWJsZXMgTVRPTS4KLSAgICAgKiBAcmV0dXJuIGlmIHRoaXMgaXMgYW4gTVRPTSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpOwotCi0gICAgLyoqIAotICAgICAqIEEgbWVzc2FnZSBpcyBNVE9NIGVuYWJsZWQgaWYgdGhlIAotICAgICAqIGFzc29jaWF0ZWQgZGlzcGF0Y2gvY2xpZW50L2ltcGwvcHJvdmlkZXIgaGFzIGEgYmluZGluZyB0eXBlIAotICAgICAqIHRoYXQgZW5hYmxlcyBNVE9NLgotICAgICAqIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBNVE9NIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gYgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1UT01FbmFibGVkKGJvb2xlYW4gYik7Ci0gICAgCi0KLSAgICAvKiogCi0gICAgICogQHJldHVybiBnZXQgdGhlIHRyYW5zcG9ydCBoZWFkZXJzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1pbWVIZWFkZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRyYW5zcG9ydCBoZWFkZXJzCi0gICAgICogQHBhcmFtIG1hcCBNYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW1lSGVhZGVycyhNYXAgbWFwKTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBtZXNzYWdlIGlzIHBhc3NlZCB0aGUgcGl2b3QgcG9pbnQuIEZvciBleGFtcGxlLCB0aGlzIGlzIHNldCBpbiB0aGUgSkFYLVdTCi0gICAgICogRGlzcGF0Y2hlciB0byBpbmRpY2F0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvc3RQaXZvdCgpOwotCi0gICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiBwb3N0IHBpdm90ICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQb3N0UGl2b3QoKTsKLQotICAgIC8qKgotICAgICAqIEpBWC1XUyBNZXNzYWdlIENvbnRleHQgdGhhdCBvd25zIHRoZSBNZXNzYWdlCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gSkFYLVdTIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGdldE1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAvKiAKLSAgICAqIEdldCB0aGUgZW50aXJlIG1lc3NhZ2UgcmVuZGVyZWQgaW4gYSBjZXJ0YWluIHR5cGUgb2YgdmFsdWUgKGkuZS4gU3RyaW5nLCBTb3VyY2UsIFNPQVBNZXNzYWdlLCBldGMuKQotICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkgYmxvY2tmYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUga2luZCBvZiByZW5kZXJpbmcKLSAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvUHJvdG9jb2wuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvUHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxZjFjNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1Byb3RvY29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogUHJvdG9jb2wgRWFjaCBtZXNzYWdlIGhhcyBhIHByb3RvY29sIChzb2FwMTEsIHNvYXAxMiwgcmVzdCkgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIHByb3RvY29sCi0gKiB3aXRoaW4gdGhlIE1lc3NhZ2Ugc3ViLWNvbXBvbmVudAotICovCi1wdWJsaWMgZW51bSBQcm90b2NvbCB7Ci0gICAgc29hcDExLCBzb2FwMTIsIHJlc3QsIHVua25vd247Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvdG9jb2wuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUHJvdG9jb2w+IHByb3RvY29sTWFwcGluZ3M7IAotICAgIAotICAgIC8vIFRoZXNlIG5hbWVzcGFjZXMgYXJlIHVzZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQgdG8gaW5kZW50aWZ5IGEgCi0gICAgLy8gU09BUCAxLjEgdnMuIGEgU09BUCAxLjIgYmluZGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfV1NETF9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVAxMl9XU0RMX0JJTkRJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIiOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTm9ybWFsbHkgYSBzdGF0aWMgSGFzaE1hcCBjYW4gY2F1c2UgY29uY3VycmVuY3kgaXNzdWVzLgotICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgSGFzaE1hcCBpcyBvbmx5IHF1ZXJpZWQgKG5ldmVyIG1vZGlmaWVkKSB0aGVuIAotICAgICAgICAvLyBhY2Nlc3MgYnkgbXVsdGlwbGUgdGhlYWRzIGlzIHNhZmUuCi0gICAgICAgIHByb3RvY29sTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFByb3RvY29sPigpOwotICAgICAgICAKLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncy5wdXQoUHJvdG9jb2wuU09BUDExX1dTRExfQklORElORywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncy5wdXQoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncy5wdXQoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORywgUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChQcm90b2NvbC5TT0FQMTJfV1NETF9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTIpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMik7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTIpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcsIFByb3RvY29sLnJlc3QpOwotICAgICAgICBwcm90b2NvbE1hcHBpbmdzLnB1dChNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcsIFByb3RvY29sLnNvYXAxMik7Ci0gICAgICAgIHByb3RvY29sTWFwcGluZ3MucHV0KE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfTVRPTV9CSU5ESU5HLCBQcm90b2NvbC5zb2FwMTIpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIGVhY2ggb2YgdGhlIFVSTHMgd2l0aCBhICIvIiBhdCB0aGUgZW5kIGZvciBmbGV4aWJpbGl0eQotICAgICAgICBNYXA8U3RyaW5nLCBQcm90b2NvbD4gdXBkYXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJvdG9jb2w+KCk7Ci0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4ga2V5cyA9IHByb3RvY29sTWFwcGluZ3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0ga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIWtleS5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlcy5wdXQoa2V5ICsgIi8iLCBwcm90b2NvbE1hcHBpbmdzLmdldChrZXkpKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdG9jb2xNYXBwaW5ncy5wdXRBbGwodXBkYXRlcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcmlnaHQgdmFsdWUgZm9yIHRoZSBQcm90b2NvbCBiYXNlZCBvbiB0aGUgYmluZGluZyBVUkwgdGhhdCB3YXMgcGFzc2VkIGluLgotICAgICAqCi0gICAgICogQHBhcmFtIHVybAotICAgICAqIEByZXR1cm4gUHJvdG9jb2wgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvdG9jb2wgZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgYm9vbGVhbiBkZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uZmlndXJpbmcgbWVzc2FnZSBwcm90b2NvbCBmb3IgYmluZGluZyBbIiArIHVybCArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm90b2NvbCBwcm90byA9IHByb3RvY29sTWFwcGluZ3MuZ2V0KHVybCk7Ci0gICAgICAgIGlmIChwcm90byAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIHByb3RvY29sIG1hcHBpbmc6ICIgKyBwcm90byk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcHJvdG87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb3RvY29sIHdhcyBub3QgZm91bmQgZm9yOiIgKyB1cmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1hNTEZhdWx0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1hNTEZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjY2FkZTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9YTUxGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSB2YWx1ZSBjbGFzcyB0aGF0IGlzIGFuIGFnbm9zdGljIHJlcHJlc2VudGF0aW9uIG9mIGEgZmF1bHQuIFRoZSBYTUxGYXVsdCBjYW4gYmUgYWRkZWQgdG8KLSAqIG9yIHF1ZXJpZWQgZnJvbSBhIE1lc3NhZ2UvWE1MUGFydC4KLSAqIDxwLz4KLSAqIEV2ZW4gdGhvdWdoIFhNTEZhdWx0IGlzIFNPQVAgMS4xL1NPQVAgMS4yIGFnbm9zdGljLCBTT0FQIDEuMiB0ZXJtcyB3aWxsIGJlIHVzZWQuIEZvciBleGFtcGxlLAotICogInJlYXNvbiIgbWVhbnMgU09BUCAxLjIgUmVhc29uIG9yIFNPQVAgMS4xIGZhdWx0c3RyaW5nLgotICoKLSAqIEBzZWUgWE1MRmF1bHRVdGlscwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmF1bHQgewotCi0gICAgLy8gSGVyZSBpcyBhIHNhbXBsZSBjb21wcmVoZW5zaXZlIFNPQVAgMS4yIGZhdWx0IHdoaWNoIHdpbGwgaGVscCB5b3UgdW5kZXJzdGFuZCB0aGUKLSAgICAvLyBzdHJ1Y3R1cmUgb2YgWE1MRmF1bHQuCi0gICAgLy8gPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKLSAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOm09Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGltZW91dHMiCi0gICAgLy8gICAgICAgICAgICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI+Ci0gICAgLy8gICA8ZW52OkJvZHk+Ci0gICAgLy8gICAgICA8ZW52OkZhdWx0PgotICAgIC8vICAgICAgICA8ZW52OkNvZGU+Ci0gICAgLy8gICAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgLy8gICAgICAgICAgPGVudjpTdWJjb2RlPgotICAgIC8vICAgICAgICAgICAgPGVudjpWYWx1ZT5tOk1lc3NhZ2VUaW1lb3V0PC9lbnY6VmFsdWU+Ci0gICAgLy8gICAgICAgICAgPC9lbnY6U3ViY29kZT4KLSAgICAvLyAgICAgICAgPC9lbnY6Q29kZT4KLSAgICAvLyAgICAgICAgPGVudjpSZWFzb24+Ci0gICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbiI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgIC8vICAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZGUiPlNlbmRlciBUaW1lb3V0PC9lbnY6VGV4dD4KLSAgICAvLyAgICAgICAgPC9lbnY6UmVhc29uPgotICAgIC8vICAgICAgICA8ZW52Ok5vZGU+aHR0cDovL215LmV4YW1wbGUub3JnL05vZGU8L2VudjpOb2RlPgotICAgIC8vICAgICAgICA8ZW52OlJvbGU+aHR0cDovL215LmV4YW1wbGUub3JnL1JvbGU8L2VudjpSb2xlPgotICAgIC8vICAgICAgICA8ZW52OkRldGFpbD4KLSAgICAvLyAgICAgICAgICA8bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgotICAgIC8vICAgICAgICA8L2VudjpEZXRhaWw+ICAgIAotICAgIC8vICAgICAgPC9lbnY6RmF1bHQ+Ci0gICAgLy8gICA8L2VudjpCb2R5PgotICAgIC8vIDwvZW52OkVudmVsb3BlPgotCi0gICAgLy8gSGVyZSBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiByZW5kZXJlZCBhcyBhIFNPQVAgMS4xIGZhdWx0LiAgTm90aWNlCi0gICAgLy8gdGhhdCB0aGlzIGlzIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uLgotICAgIC8vIDxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiCi0gICAgLy8gICAgICAgICAgICAgICB4bWxuczptPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3RpbWVvdXRzIgotICAgIC8vICAgICAgICAgICAgICAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiPgotICAgIC8vICA8ZW52OkJvZHk+Ci0gICAgLy8gICAgICA8ZW52OkZhdWx0PgotICAgIC8vICAgICAgICA8ZmF1bHRjb2RlPmVudi5DbGllbnQ8L2ZhdWx0Y29kZT4KLSAgICAvLyAgICAgICAgPGZhdWx0c3RyaW5nPlNlbmRlciBUaW1lb3V0PC9mYXVsdHN0cmluZz4KLSAgICAvLyAgICAgICAgPGFjdG9yPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Sb2xlPC9hY3Rvcj4KLSAgICAvLyAgICAgICAgPGRldGFpbD4KLSAgICAvLyAgICAgICAgICA8bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgotICAgIC8vICAgICAgICA8ZGV0YWlsPiAgICAKLSAgICAvLyAgICAgIDwvZW52OkZhdWx0PgotICAgIC8vICAgPC9lbnY6Qm9keT4KLSAgICAvLyA8L2VudjpFbnZlbG9wZT4KLQotICAgIC8vIFRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiAobmVjZXNzYXJ5IGZvciBib3RoIFNPQVAgMS4xIGFuZCBTT0FQIDEuMikKLSAgICBwcml2YXRlIFhNTEZhdWx0Q29kZSBjb2RlOwotICAgIHByaXZhdGUgWE1MRmF1bHRSZWFzb24gcmVhc29uOwotICAgIHByaXZhdGUgQmxvY2tbXSBkZXRhaWxCbG9ja3M7Ci0KLSAgICAvLyBUaGUgb3B0aW9uYWwgaW5mb3JtYXRpb24gKGNhbiBiZSBzZXQgb24gWE1MRmF1bHQsIGJ1dCBvbmx5IHJlbmRlcmVkIGluIFNPQVAgMS4yIEZhdWx0cykKLSAgICBwcml2YXRlIFN0cmluZyByb2xlOwotICAgIHByaXZhdGUgU3RyaW5nIG5vZGU7Ci0gICAgcHJpdmF0ZSBRTmFtZVtdIHN1YkNvZGVzID0KLSAgICAgICAgICAgIG51bGw7ICAvLyBUaGUgc3ViQ29kZXMgYXJlIHVzZXItZGVmaW5lZC4gIFRoZSB2YWx1ZXMgYXJlIG5vdCBkZWZpbmVkIGJ5IGEgc3BlY2lmaWNhdGlvbgotICAgIHByaXZhdGUgWE1MRmF1bHRSZWFzb25bXSBzZWNvbmRhcnlSZWFzb25zID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBBcHBsaWNhdGlvbiBYTUxGYXVsdCB3aXRoIG1pbmltdW0gcmVxdWlyZWQgaW5mb3JtYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2RlICAgICAgICAgLSBYTUxGYXVsdENvZGUgb3IgbnVsbCBpZiBkZWZhdWx0IFhNTEZhdWx0Q29kZQotICAgICAqIEBwYXJhbSByZWFzb24gICAgICAgLSBTdHJpbmcgcmVhc29uCi0gICAgICogQHBhcmFtIGRldGFpbEJsb2NrcyAtIEJsb2NrW10gb3IgbnVsbCBpZiBubyBkZXRhaWxCbG9ja3MKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHQoWE1MRmF1bHRDb2RlIGNvZGUsIFhNTEZhdWx0UmVhc29uIHJlYXNvbiwgQmxvY2tbXSBkZXRhaWxCbG9ja3MpIHsKLSAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29kZSA9IFhNTEZhdWx0Q29kZS5SRUNFSVZFUjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOwotICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLSAgICAgICAgdGhpcy5kZXRhaWxCbG9ja3MgPSBkZXRhaWxCbG9ja3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgU3lzdGVtIFhNTEZhdWx0IHdpdGggbWluaW11bSByZXF1aXJlZCBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvZGUgICAtIFhNTEZhdWx0Q29kZSBvciBudWxsIGlmIGRlZmF1bHQgWE1MRmF1bHRDb2RlCi0gICAgICogQHBhcmFtIHJlYXNvbiAtIFN0cmluZyByZWFzb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHQoWE1MRmF1bHRDb2RlIGNvZGUsIFhNTEZhdWx0UmVhc29uIHJlYXNvbikgewotICAgICAgICB0aGlzKGNvZGUsIHJlYXNvbiwgbnVsbCk7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBjb2RlLiAqLwotICAgIHB1YmxpYyBYTUxGYXVsdENvZGUgZ2V0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvZGU7Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBkZXRhaWxCbG9ja3MuICovCi0gICAgcHVibGljIEJsb2NrW10gZ2V0RGV0YWlsQmxvY2tzKCkgewotICAgICAgICByZXR1cm4gZGV0YWlsQmxvY2tzOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVhc29uLiAqLwotICAgIHB1YmxpYyBYTUxGYXVsdFJlYXNvbiBnZXRSZWFzb24oKSB7Ci0gICAgICAgIHJldHVybiByZWFzb247Ci0gICAgfQotCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBub2RlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotCi0KLSAgICAvKiogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vZGUoU3RyaW5nIG5vZGUpIHsKLSAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHJvbGUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSb2xlKCkgewotICAgICAgICByZXR1cm4gcm9sZTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcGFyYW0gcm9sZSBUaGUgcm9sZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZShTdHJpbmcgcm9sZSkgewotICAgICAgICB0aGlzLnJvbGUgPSByb2xlOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgc2Vjb25kYXJ5UmVhc29ucy4gKi8KLSAgICBwdWJsaWMgWE1MRmF1bHRSZWFzb25bXSBnZXRTZWNvbmRhcnlSZWFzb25zKCkgewotICAgICAgICByZXR1cm4gc2Vjb25kYXJ5UmVhc29uczsKLSAgICB9Ci0KLQotICAgIC8qKiBAcGFyYW0gc2Vjb25kYXJ5UmVhc29ucyBUaGUgc2Vjb25kYXJ5UmVhc29ucyB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U2Vjb25kYXJ5UmVhc29ucyhYTUxGYXVsdFJlYXNvbltdIHNlY29uZGFyeVJlYXNvbnMpIHsKLSAgICAgICAgdGhpcy5zZWNvbmRhcnlSZWFzb25zID0gc2Vjb25kYXJ5UmVhc29uczsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1YkNvZGVzLiAqLwotICAgIHB1YmxpYyBRTmFtZVtdIGdldFN1YkNvZGVzKCkgewotICAgICAgICByZXR1cm4gc3ViQ29kZXM7Ci0gICAgfQotCi0KLSAgICAvKiogQHBhcmFtIHN1YkNvZGVzIFRoZSBzdWJDb2RlcyB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U3ViQ29kZXMoUU5hbWVbXSBzdWJDb2RlcykgewotICAgICAgICB0aGlzLnN1YkNvZGVzID0gc3ViQ29kZXM7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHRDb2RlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1hNTEZhdWx0Q29kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU5NWVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHRDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBZ25vc3RpYyByZXByZXNlbnRhdGlvbiBvZiBTT0FQIDEuMSBhbmQgU09BUCAxLjIgZmF1bHQgY29kZSB2YWx1ZXMuCi0gKgotICogQHNlZSBYTUxGYXVsdAotICovCi1wdWJsaWMgY2xhc3MgWE1MRmF1bHRDb2RlIHsKLQotCi0gICAgLy8gICBTRU5ERVIgICAgICAgICAgICAgLT4gU09BUCAxLjIgU2VuZGVyICAgICAgICAgICAgICAvIFNPQVAgMS4xICBDbGllbnQKLSAgICAvLyAgIFJFQ0VJVkVSICAgICAgICAgICAtPiBTT0FQIDEuMiBSZWNlaXZlciAgICAgICAgICAgIC8gU09BUCAxLjEgIFNlcnZlcgotICAgIC8vICAgTVVTVFVOREVSU1RBTkQgICAgIC0+IFNPQVAgMS4yIE11c3RVbmRlcnN0YW5kICAgICAgLyBTT0FQIDEuMSAgTXVzdFVuZGVyc3RhbmQKLSAgICAvLyAgIERBVEFFTkNPRElOR1VOS05PV04tPiBTT0FQIDEuMiBEYXRhRW5jb2RpbmdVbmtub3duIC8gU09BUCAxLjEgIFNlcnZlcgotICAgIC8vICAgVkVSU0lPTk1JU01BVENIICAgIC0+IFNPQVAgMS4yIFZlcnNpb25NaXNtYXRjaCAgICAgLyBTT0FQIDEuMSAgVmVyc2lvbk1pc21hdGNoCi0gICAgLy8gICBDVVNUT01fU09BUDExX09OTFkgLT4gU09BUCAxLjIgUmVjZWl2ZXIgICAgICAgICAgICAvIFNPQVAgMS4xICAiY3VzdG9tIHFuYW1lIgotCi0gICAgLy8gUmVuZGVyZWQgYXMgcW5hbWVzIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhbCBuYW1lcwotICAgIC8vICAgICAodGhlIG5hbWVzcGFjZSBpcyB0aGUgY29ycmVzcG9uZGluZyBlbnZlbG9wZSBuYW1lc3BhY2UpCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBYTUxGYXVsdENvZGUgU0VOREVSID0gKG5ldyBYTUxGYXVsdENvZGUoKSB7Ci0gICAgICAgIHB1YmxpYyBRTmFtZSB0b1FOYW1lKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQ7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgIGxvY2FsUGFydCA9ICJTZW5kZXIiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2NhbFBhcnQgPSAiQ2xpZW50IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBYTUxGYXVsdENvZGUgUkVDRUlWRVIgPSAobmV3IFhNTEZhdWx0Q29kZSgpIHsKLSAgICAgICAgcHVibGljIFFOYW1lIHRvUU5hbWUoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydDsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gIlJlY2VpdmVyIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gIlNlcnZlciI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgWE1MRmF1bHRDb2RlIE1VU1RVTkRFUlNUQU5EID0gKG5ldyBYTUxGYXVsdENvZGUoKSB7Ci0gICAgICAgIHB1YmxpYyBRTmFtZSB0b1FOYW1lKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCAiTXVzdFVuZGVyc3RhbmQiKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgWE1MRmF1bHRDb2RlIERBVEFFTkNPRElOR1VOS05PV04gPSAobmV3IFhNTEZhdWx0Q29kZSgpIHsKLSAgICAgICAgcHVibGljIFFOYW1lIHRvUU5hbWUoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydDsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxQYXJ0ID0gIkRhdGFFbmNvZGluZ1Vua25vd24iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2NhbFBhcnQgPSAiU2VydmVyIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBYTUxGYXVsdENvZGUgVkVSU0lPTk1JU01BVENIID0gKG5ldyBYTUxGYXVsdENvZGUoKSB7Ci0gICAgICAgIHB1YmxpYyBRTmFtZSB0b1FOYW1lKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCAiVmVyc2lvbk1pc21hdGNoIik7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICAKLQotICAgIHByaXZhdGUgUU5hbWUgZmF1bHRDb2RlOwotICAgIAotICAgIHByaXZhdGUgWE1MRmF1bHRDb2RlKCkgeyAgICAgICAgCi0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgWE1MRmF1bHRDb2RlKFFOYW1lIGZhdWx0Q29kZSkgewotICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTnVsbCBmYXVsdCBjb2RlIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5mYXVsdENvZGUgPSBmYXVsdENvZGU7Ci0gICAgfQotICAgIAotICAgIC8vIFV0aWxpdHkgTWV0aG9kcwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIFFOYW1lIGZvciB0aGUgZ2l2ZW4gcHJvdG9jb2wKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2Ugb2YgdGhlIGVudmVsb3BlIGZvciB0aGUgcHJvdG9jb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIHRvUU5hbWUoU3RyaW5nIHByb3RvY29sTmFtZXNwYWNlKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhdWx0Q29kZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgdGhlIFhNTFBhcnQgY29ycmVzcG9uZGluZyB0byB0aGlzIHNwZWNpZmllZCBRTmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIFhNTFBhcnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFhNTEZhdWx0Q29kZSBmcm9tUU5hbWUoUU5hbWUgcU5hbWUpIHsKLSAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFNwZWMgaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgaXMgcmVjZWl2ZXIKLSAgICAgICAgICAgIHJldHVybiBSRUNFSVZFUjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgWE1MRmF1bHRDb2RlIHhtbEZhdWx0Q29kZSA9IG51bGw7Ci0gICAgICAgIC8vIER1ZSB0byBwcm9ibGVtcyBpbiB0aGUgT00sIHNvbWV0aW1lcyB0aGF0IHFuYW1lIGlzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5LgotICAgICAgICAvLyBTbyB1c2UgdGhlIGxvY2FsTmFtZSB0byBmaW5kIHRoZSBYTUxGYXVsdENvZGUKLSAgICAgICAgaWYgKGxvY2FsUGFydC5lcXVhbHNJZ25vcmVDYXNlKCJTZW5kZXIiKSkgeyAgICAgICAgICAvLyBTT0FQIDEuMgotICAgICAgICAgICAgeG1sRmF1bHRDb2RlID0gU0VOREVSOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2FsUGFydC5lcXVhbHNJZ25vcmVDYXNlKCJSZWNlaXZlciIpKSB7IC8vIFNPQVAgMS4yCi0gICAgICAgICAgICB4bWxGYXVsdENvZGUgPSBSRUNFSVZFUjsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NhbFBhcnQuZXF1YWxzSWdub3JlQ2FzZSgiQ2xpZW50IikpIHsgICAvLyBTT0FQIDEuMQotICAgICAgICAgICAgeG1sRmF1bHRDb2RlID0gU0VOREVSOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2FsUGFydC5lcXVhbHNJZ25vcmVDYXNlKCJTZXJ2ZXIiKSkgeyAgIC8vIFNPQVAgMS4xCi0gICAgICAgICAgICB4bWxGYXVsdENvZGUgPSBSRUNFSVZFUjsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NhbFBhcnQuZXF1YWxzSWdub3JlQ2FzZSgiTXVzdFVuZGVyc3RhbmQiKSkgeyAgLy8gQm90aAotICAgICAgICAgICAgeG1sRmF1bHRDb2RlID0gTVVTVFVOREVSU1RBTkQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobG9jYWxQYXJ0LmVxdWFsc0lnbm9yZUNhc2UoIkRhdGFFbmNvZGluZ1Vua25vd24iKSkgeyAgLy8gU09BUCAxLjIKLSAgICAgICAgICAgIHhtbEZhdWx0Q29kZSA9IERBVEFFTkNPRElOR1VOS05PV047Ci0gICAgICAgIH0gZWxzZSBpZiAobG9jYWxQYXJ0LmVxdWFsc0lnbm9yZUNhc2UoIlZlcnNpb25NaXNtYXRjaCIpKSB7IC8vIEJvdGgKLSAgICAgICAgICAgIHhtbEZhdWx0Q29kZSA9IFZFUlNJT05NSVNNQVRDSDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhtbEZhdWx0Q29kZSA9IG5ldyBYTUxGYXVsdENvZGUocU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4geG1sRmF1bHRDb2RlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHRSZWFzb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MRmF1bHRSZWFzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0NmEzMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1hNTEZhdWx0UmVhc29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKiBBZ25vc3RpYyByZXByZXNlbnRhdGlvbiBvZiBhIEZhdWx0IFJlYXNvbi9mYXVsdHN0cmluZy4gU2VlIEBYTUxGYXVsdCAqLwotcHVibGljIGNsYXNzIFhNTEZhdWx0UmVhc29uIHsKLSAgICBTdHJpbmcgdGV4dDsKLSAgICBTdHJpbmcgbGFuZzsKLQotICAgIC8qKgotICAgICAqIEEgRmF1bHQgUmVhc29uIGhhcyB0aGUgcmVhc29uIHRleHQgYW5kIGxhbmd1YWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dAotICAgICAqIEBwYXJhbSBsYW5nCi0gICAgICovCi0gICAgcHVibGljIFhNTEZhdWx0UmVhc29uKFN0cmluZyB0ZXh0LCBTdHJpbmcgbGFuZykgewotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgICB0aGlzLmxhbmcgPSBsYW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgRmF1bHQgUmVhc29uIHdpdGggdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFhNTEZhdWx0UmVhc29uKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHRoaXModGV4dCwgZ2V0RGVmYXVsdExhbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbGFuZy4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExhbmcoKSB7Ci0gICAgICAgIHJldHVybiBsYW5nOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHRleHQuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiB0aGUgSVMwIDYzOSBsYW5ndWFnZSBpZGVudGlmaWVyIGZvciB0aGUgZGVmYXVsdCBsb2NhbGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TGFuZygpIHsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIC8vIFRoZSBzcGVjIGluZGljYXRlcyB0byB1c2UgUkZDIDMwNjYsIHdoaWNoIHVzZXMgdGhlIHZhbHVlcyBkZWZpbmVkIGJ5IElTTyA2MzksCi0gICAgICAgIC8vIHdoaWNoIGlzIHdoYXQgZ2V0TGFuZ3VhZ2UoKSByZXR1cm5zLgotICAgICAgICByZXR1cm4gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1hNTFBhcnQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjMyYmQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvWE1MUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0vKioKLSAqIFhNTFBhcnQKLSAqIAotICogVGhlIFhNTCBwb3J0aW9uIG9mIGEgTWVzc2FnZQotICogCi0gKiBUaGUgSkFYLVdTIGltcGxlbWVudGF0aW9uIChwcm94eSwgbWVzc2FnZSByZWNlaXZlciwgZXRjLikgaW50ZXJhY3Qgd2l0aCB0aGUgCi0gKiBNZXNzYWdlIHZpYSBCbG9ja3MuICBBIEJsb2NrIGlzIHJlcHJlc2VudGVkIGluIHRoZSBtZXNzYWdlIGFzIGEgcm9vdCBlbGVtZW50IHRyZWUgCi0gKiBpbiBlaXRoZXIgdGhlIGhlYWRlciwgYm9keSBvciBmYXVsdCBkZXRhaWwgc2VjdGlvbi4gIFRoZSBCbG9ja3MgY2FuIGJlIGVhc2lseQotICogZGVjb21wb3NlZCBpbnRvIGJ1c2luZXNzIG9iamVjdHMgKHdoaWNoIGFyZSBuZWVkZWQgb24gdGhlIEpBWC1XUyBpbnRlcmZhY2VzKS4KLSAqIAotICogSW4gYWRkaXRpb24sIHRoZSBKQVgtV1MgaGFuZGxlciBtb2RlbCByZXF1aXJlcyB0aGF0IHRoZSBYTUxQYXJ0IGJlIGV4cG9zZWQgYXMKLSAqIGFuIFNBQUogU09BUEVudmVsb3BlLiAgCi0gKiAKLSAqIFRoZSBYTUxQYXJ0IGFic3RyYWN0aW9uIGhpZGVzIHRoZSBkZXRhaWxzIG9mIHRoZSBtZXNzYWdlIHRyYW5zZm9ybWF0aW9ucyBmcm9tCi0gKiB0aGUgSkFYLVdTIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jawotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5YTUxQYXJ0QmFzZSBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscwotICogCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBYTUxQYXJ0IHsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvdG9jb2wgZm9yIHRoaXMgTWVzc2FnZSAoc29hcDExLCBzb2FwMTIsIGV0Yy4pCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFByb3RvY2wKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvdG9jb2wgZ2V0UHJvdG9jb2woKTsKLQotICAgIC8qKgotICAgICAqIFdyaXRlIG91dCB0aGUgTWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciAgWE1MU3RyZWFtV3JpdGVyCi0gICAgICogQHBhcmFtIGNvbnN1bWUgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlcXVlc3Qgb24gdGhlIGJsb2NrLgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dFRvKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIGJvb2xlYW4gY29uc3VtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFhNTFN0cmVhbVJlYWRlciByZXByZXNlbnRlZCBieSB0aGlzIE1lc3NhZ2UgZm9yIHRoZSB4bWwgcGFydAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN1bWUgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHJlcXVlc3Qgb24gdGhlIE1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIFhNTFN0cmVhbVJlYWRlcgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbiBjb25zdW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKiBAcmV0dXJuIHRoZSBTdHlsZSAoZG9jdW1lbnQgb3IgcnBjKSAqLwotICAgIHB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBTdHlsZS4gSWYgdGhlIHN0eWxlIGlzIERPQ1VNRU5ULCB0aGUgYm9keSBibG9ja3MgYXJlIGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgYm9keQotICAgICAqIGVsZW1lbnQuIElmIHRoZSBzdHlsZSBpcyBzZXQgdG8gUlBDLCB0aGVuIHRoZSBib2R5IGJsb2NrcyBhcmUgbG9jYXRlZCB1bmRlcm5lYXRoIHRoZSBycGMKLSAgICAgKiBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGUgU3R5bGUKLSAgICAgKiBAc2VlIHNldCBpbmRpcmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNldCBpbmRpcmVjdGlvbi4gIFVzZWQgdG8gZm9yY2UgdGhlIGNvZGUgdG8gbG9vayBmb3IgYmxvY2tzIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4gRm9yCi0gICAgICogRE9DVU1FTlQgdGhlIGRlZmF1bHQgaXMgMCBGb3IgUlBDIHRoZSBkZWZhdWx0IGlzIDEgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBvdmVycmlkZSB0aGVzZQotICAgICAqIHNldHRpbmdzIGZvciBzcGVjaWFsIGNhc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGlyZWN0aW9uICgwIG9yIDEpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5kaXJlY3Rpb24oaW50IGluZGlyZWN0aW9uKTsKLQotICAgIC8qKgotICAgICAqIEdldCBpbmRpcmVjdGlvbi4gIFVzZWQgdG8gZm9yY2UgdGhlIGNvZGUgdG8gbG9vayBmb3IgYmxvY2tzIGF0IGEgcGFydGljdWxhciBsb2NhdGlvbi4gRm9yCi0gICAgICogRE9DVU1FTlQgdGhlIGRlZmF1bHQgaXMgMCBGb3IgUlBDIHRoZSBkZWZhdWx0IGlzIDEgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBvdmVycmlkZSB0aGVzZQotICAgICAqIHNldHRpbmdzIGZvciBzcGVjaWFsIGNhc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBpbmRpcmVjdGlvbiAoMCBvciAxKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kaXJlY3Rpb24oKTsKLQotICAgIC8qKiBAcmV0dXJuIHRoZSBRTmFtZSBvZiB0aGUgb3BlcmF0aW9uIGVsZW1lbnQgaWYgU3R5bGUucnBjLiAgT3RoZXJ3aXNlIG51bGwgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBvcGVyYXRpb24gZWxlbWVudCBxbmFtZS4gIFRoZSBvcGVyYXRpb24gcW5hbWUgaXMgb25seSB1c2VkIGlmIFN0eWxlLnJwYwotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvblFOYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uRWxlbWVudChRTmFtZSBvcGVyYXRpb25RTmFtZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBpc0NvbnN1bWVkIFJldHVybiB0cnVlIGlmIHRoZSBwYXJ0IGlzIGNvbnN1bWVkLiAgT25jZSBjb25zdW1lZCwgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBwYXJ0IGlzCi0gICAgICogbm8gbG9uZ2VyIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYmxvY2sgaXMgY29uc3VtZWQgKGEgbWV0aG9kIHdhcyBjYWxsZWQgd2l0aCBjb25zdW1lPXRydWUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lZCgpOwotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBYTUxQYXJ0IHJlcHJlc2VudHMgYSBGYXVsdAotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIHJlcHJlc2VudHMgYSBmYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBYTUxQYXJ0IHJlcHJlc2VudHMgYSBmYXVsdCwgYW4gWE1MRmF1bHQgaXMgcmV0dXJuZWQgd2hpY2ggZGVzY3JpYmVzIHRoZSBmYXVsdCBpbiBhCi0gICAgICogcHJvdG9jb2wgYWdub3N0aWMgbWFubmVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBYTUxGYXVsdCBvYmplY3Qgb3IgbnVsbAotICAgICAqIEBzZWUgWE1MRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MRmF1bHQgZ2V0WE1MRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENoYW5nZSB0aGUgWE1MUGFydCBzbyB0aGF0IGl0IHJlcHJlc2VudHMgdGhlIGZhdWx0IGRlc2NyaWJlZCBieSBYTUxGYXVsdAotICAgICAqCi0gICAgICogQHBhcmFtIHhtbGZhdWx0Ci0gICAgICogQHNlZSBYTUxGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhNTEZhdWx0KFhNTEZhdWx0IHhtbEZhdWx0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldFBhcmVudCBHZXQgdGhlIE1lc3NhZ2Ugb2JqZWN0IHRoYXQgdGhpcyBYTUxQYXJ0IGlzIGF0dGFjaGVkIHRvLCBpZiBpdCBpcyBhdHRhY2hlZCB0byBvbmUKLSAgICAgKiBhdCBhbGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UGFyZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBzZXRQYXJlbnQgU2V0IHRoZSBNZXNzYWdlIG9iamVjdCB0aGF0IHdpbGwgaG9sZCB0aGlzIFhNTFBhcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE1lc3NhZ2UgbSk7Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBc0VudmVsb3BlIEdldCB0aGUgeG1sIHBhcnQgYXMgYSByZWFkL3dyaXRlIFNPQVBFbnZlbG9wZQotICAgICAqCi0gICAgICogQHJldHVybiBTT0FQRW52ZWxvcGUKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldEFzU09BUEVudmVsb3BlKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBc09NRWxlbWVudCBHZXQgdGhlIHhtbCBwYXJ0IGFzIGEgcmVhZC93cml0ZSBPTS4uLm5vdGUgdGhpcyByZXR1cm5zIGFuIE9NIFNPQVBFbnZlbG9wZSBmb3IKLSAgICAgKiBhbGwgcHJvdG9jb2xzLi4uZXZlbiBSRVNUCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE9NRWxlbWVudAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0QXNPTUVsZW1lbnQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldE51bUJvZHlCbG9ja3MgQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNhY2hlIHRoZSBPTS4gIEF2b2lkIGl0IGluIHBlcmZvcm1hbnQgc2l0dWF0aW9ucy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJvZHkgYmxvY2tzCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1Cb2R5QmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRCb2R5QmxvY2sgR2V0IHRoZSBib2R5IGJsb2NrIGF0IHRoZSBzcGVjaWZpY2VkIGluZGV4LiBUaGUgQmxvY2tGYWN0b3J5IGFuZCBvYmplY3QgY29udGV4dCBhcmUKLSAgICAgKiBwYXNzZWQgaW4gdG8gaGVscCBjcmVhdGUgdGhlIHByb3BlciBraW5kIG9mIGJsb2NrLiBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgY2FjaGUgdGhlIE9NLiAgQXZvaWQKLSAgICAgKiBpdCBpbiBwZXJmb3JtYW50IHNpdHVhdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIEJsb2NrIG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAc2VlIGdldEJvZHlCbG9jawotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRCb2R5QmxvY2soaW50IGluZGV4LCBPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0Qm9keUJsb2NrIEdldCB0aGUgc2luZ2xlIEJvZHkgQmxvY2suIFRoZSBCbG9ja0ZhY3RvcnkgYW5kIG9iamVjdCBjb250ZXh0IGFyZSBwYXNzZWQgaW4gdG8KLSAgICAgKiBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93bgotICAgICAqIHRoYXQgdGhlcmUgaXMgemVybyBvciBvbmUgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIEJsb2NrIG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0Qm9keUJsb2NrKE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBzZXRCb2R5QmxvY2sgU2V0IHRoZSBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IE9uY2Ugc2V0LCB0aGUgTWVzc2FnZSBvd25zIHRoZSBibG9jay4gIFlvdQotICAgICAqIG11c3QgdXNlIHRoZSBnZXRCb2R5QmxvY2sgbWV0aG9kIHRvIGFjY2VzcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhpbnQgaW5kZXgsIEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHNldEJvZHlCbG9jayBTZXQgdGhpcyBhcyBibG9jayBhcyB0aGUgc2luZ2xlIGJsb2NrIGZvciB0aGUgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiByZW1vdmVCb2R5QmxvY2sgUmVtb3ZlcyB0aGUgaW5kaWNhdGVkIEJvZHlCbG9jawotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQm9keUJsb2NrKGludCBpbmRleCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLQotICAgIC8qKgotICAgICAqIGdldE51bUhlYWRlckJsb2NrcwotICAgICAqCi0gICAgICogQHJldHVybiBudW1iZXIgb2YgaGVhZGVyIGJsb2NrcwotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtSGVhZGVyQmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRIZWFkZXJCbG9jayAKLSAgICAgKiBHZXQgdGhlIGZpcnN0aGVhZGVyIGJsb2NrIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotICAgICAqIFRoZSBCbG9ja0ZhY3RvcnkgYW5kIG9iamVjdCBjb250ZXh0Ci0gICAgICogYXJlIHBhc3NlZCBpbiB0byBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGxvY2FsUGFydAotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIGJsb2NrRmFjdG9yeQotICAgICAqIEByZXR1cm4gQmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0SGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBnZXRIZWFkZXJCbG9jayAKLSAgICAgKiBHZXQgdGhlIGhlYWRlciBibG9ja3Mgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKiBUaGUgQmxvY2tGYWN0b3J5IGFuZCBvYmplY3QgY29udGV4dAotICAgICAqIGFyZSBwYXNzZWQgaW4gdG8gaGVscCBjcmVhdGUgdGhlIHByb3BlciBraW5kIG9mIGJsb2NrLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB1cmkgb2YgaGVhZGVyCi0gICAgICogQHBhcmFtIGxvY2FsUGFydCBsb2NhbCBuYW1lIG9mIGhlYWRlcgotICAgICAqIEBwYXJhbSBjb250ZXh0IGNvbnRleHQgZm9yIGJsb2NrRmFjdG9yeQotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkgIGtpbmQgb2YgZmFjdG9yeSAoaS5lLiBKQVhCKQotICAgICAqIEBwYXJhbSBSb2xlUGxheWVyIGRldGVybWluZXMgYWNjZXB0YWJsZSByb2xlcyAob3IgbnVsbCkKLSAgICAgKiBAcmV0dXJuIExpc3Q8QmxvY2s+Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8QmxvY2s+IGdldEhlYWRlckJsb2NrcyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBzZXRIZWFkZXJCbG9jayAKLSAgICAgKiByZXBsYWNlcyB0aGUgZmlyc3QgZXhpc3RpbmcgaGVhZGVyIGJsb2NrIHdpdGggdGhpcyBuZXcgYmxvY2suICBJZiB0aGVyZSBpcyBubwotICAgICAqIGV4aXN0aW5nIGhlYWRlciBibG9jaywgb25lIGlzIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGhlYWRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgQmxvY2sgYmxvY2spCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBhcHBlbmRIZWFkZXJCbG9jayAKLSAgICAgKiBBcHBlbmQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGhlYWRlciBibG9ja3MuIFRoZSBNZXNzYWdlIG93bnMgdGhlIGJsb2NrLgotICAgICAqIFlvdSBtdXN0IHVzZSB0aGUgZ2V0SGVhZGVyQmxvY2sgbWV0aG9kIHRvIGFjY2VzcyBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgQmxvY2sgYmxvY2spCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUU5hbWVzIG9mIGhlYWRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJRTmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiByZW1vdmVIZWFkZXJCbG9jawotICAgICAqIFJlbW92ZXMgYWxsIGhlYWRlciBibG9ja3Mgd2l0aCB0aGlzIG5hbWVzcGFjZS9sb2NhbHBhcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSB0cmFjZVN0cmluZy4uLnRoZSB0cmFjZSBzdHJpbmcgZHVtcHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBCbG9jayB3aXRob3V0IGZvcmNpbmcgYW4KLSAgICAgKiB1bmRlcmx5aW5nIGlsbC1wZXJmb3JtYW50IHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0cmFjZSBpbmZvcm1hdGlvbgotICAgICAqIEBib29sZWFuIGluZGVudCBTdHJpbmcgY29udGFpbmluZyBpbmRlbnQgY2hhcmFjdGVycwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdHJhY2VTdHJpbmcoU3RyaW5nIGluZGVudCk7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgWE1MUGFydCBtYXkgYmUgaW4gYSBudW1iZXIgb2YgZGlmZmVyZW50IGZvcm1zLiAgQ3VycmVudGx5IHRoZSBmb3JtcwotICAgICAqIGFyZSBVTktOT1dOLCBPTSwgU09BUEVOVkVMT1BFLCBhbmQgU1BJTkUuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgU3RyaW5nIGNvbnRhaW5pbmcgb25lIG9mCi0gICAgICogdGhlc2UgdHlwZXMuICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0cmFjZSBhbmQgdGVzdGluZyBwdXJwb3Nlcy4gIFRoZSBjb25zdW1lcgotICAgICAqIG9mIGEgTWVzc2FnZSBzaG91bGQgbm90IG1ha2UgYW55IGRlY2lzaW9ucyBiYXNlZCBvbiB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhNTFBhcnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYTUxQYXJ0Q29udGVudFR5cGUoKTsKLQotICAgIC8qKiAgICAKLSAgICAgKiBVc2VkIHByaW1hcmlseSB0byBlbnN1cmUgdGhlIHBhcnNlciBpcyBmb3J3YXJkZWQgdG8gdGhlIGVuZCBzbyBpdCBjYW4gYmUgY2xvc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCk7Ci19ICAgCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnRVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9hdHRhY2htZW50cy9BdHRhY2htZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3YjM2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmF0dGFjaG1lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkNhY2hlZEZpbGVEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NTmF2aWdhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKiogQSBzdWl0ZSBvZiB1dGlsaXRpZXMgdXNlZCBmb3IgaGFuZGxpbmcgTVRPTSBhdHRhY2htZW50IGRhdGEuICovCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBdHRhY2htZW50VXRpbHMuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFhPUF9JTkNMVURFID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZSIsICJJbmNsdWRlIik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgdXNlZCB0byBmaW5kIGFsbCBpbnN0YW5jZXMgb2YgdGhlIDxwcmU+PHhvcDppbmNsdWRlPjwvcHJlPiBlbGVtZW50Ci0gICAgICogd2l0aGluIGEgZ2l2ZW4gT00gU09BUEVudmVsb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxPTUVsZW1lbnQ+IGZpbmRYb3BFbGVtZW50cyhPTUVsZW1lbnQgZW52KSB7Ci0gICAgICAgIEFycmF5TGlzdDxPTUVsZW1lbnQ+IHhvcHMgPSBuZXcgQXJyYXlMaXN0PE9NRWxlbWVudD4oKTsKLSAgICAgICAgZmluZFhvcEVsZW1lbnRzKGVudiwgeG9wcyk7Ci0gICAgICAgIHJldHVybiB4b3BzOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBBIHJlY3Vyc2l2ZSBzZWFyY2ggZm9yIGFsbCBvZiB0aGUgPHhvcDppbmNsdWRlPiBlbGVtZW50cyBpbiB0aGUgdHJlZS4KLSAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmluZFhvcEVsZW1lbnRzKE9NRWxlbWVudCByb290LCBBcnJheUxpc3Q8T01FbGVtZW50PiB4b3BzKSB7Ci0KLSAgICAgICAgLy8gICAgICBGb3JjZXMgYSBwYXJzZS4gIFRoaXMgc2VlbXMgdG8gYmUgbmVjZXNzYXJ5IGR1ZSB0byBidWdzIGluIE9NTmF2aWdhdG9yCi0gICAgICAgIHJvb3QuZ2V0TmV4dE9NU2libGluZygpOwotCi0gICAgICAgIC8vIE5hdmlnYXRvciBkb2VzIGEgdHJhdmVyc2FsIHRoYXQgbWltaWNzIHRoZSBzdHJ1Y3R1cmUgb2YgYW4geG1sIGRvY3VtZW50LiAKLSAgICAgICAgLy8gRWFjaCBub24tZWxlbWVudCBvYmplY3QgaXMgcHJvY2Vzc2VkIG9uY2UuCi0gICAgICAgIC8vIEVhY2ggZWxlbWVudCBvYmplY3QgaXMgdmlzaXRlZCBwcmlvciB0byBpdHMgY2hpbGRyZW4gYW5kIGFmdGVyIGl0cyBjaGlsZHJlbi4KLSAgICAgICAgLy8gCi0gICAgICAgIC8vIFN1cHBvc2UgeW91IGhhdmUgdGhlIGZvbGxvd2luZyB0cmVlIChjYXBzIGFyZSBlbGVtZW50cywgbG93ZXJzIGFyZSB0ZXh0KQotICAgICAgICAvLyAKLSAgICAgICAgLy8gICAgIEEKLSAgICAgICAgLy8gICAgLyBcCi0gICAgICAgIC8vICAgQiAgIEMKLSAgICAgICAgLy8gIC9cICAgL1wKLSAgICAgICAgLy8gIEQgZSBGICBnCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFRoZSB0cmF2ZXJzYWwgaXMKLSAgICAgICAgLy8gaXMgQSBCIEQgRCcgZSBCJyBDIEYgRicgZyBDJyBBJwotICAgICAgICAvLyBUaGUgJyBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBzZWNvbmQgdGltZSB0aGUgbm9kZSBpcyB2aXNpdGVkIChpLmUuIG5hdi52aXNpdGVkKCkgCi0gICAgICAgIC8vIHJldHVybnMgdHJ1ZSkKLQotICAgICAgICBPTU5hdmlnYXRvciBuYXYgPSBuZXcgT01OYXZpZ2F0b3Iocm9vdCk7Ci0KLSAgICAgICAgd2hpbGUgKG5hdi5pc05hdmlnYWJsZSgpKSB7Ci0gICAgICAgICAgICBPTU5vZGUgY3VyciA9IG5hdi5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIEluc3BlY3QgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gdmlzaXRlZC4gCi0gICAgICAgICAgICAvLyBJdCBpcyBwcm9iYWJseSBzYWZlciB0byBpbnNwZWN0IHRoZSBub2RlIHdoZW4gaXQgaXMgdmlzaXRlZCwgYmVjYXVzZSAKLSAgICAgICAgICAgIC8vIHRoaXMgZ3VhcmFudGVlcyB0aGF0IGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gcHJvY2Vzc2VkL2V4cGFuZGVkLgotICAgICAgICAgICAgaWYgKG5hdi52aXNpdGVkKCkgJiYgY3VyciBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCljdXJyOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFFOYW1lKCkuZXF1YWxzKFhPUF9JTkNMVURFKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiW1hPUF9JTkNMVURFXSAiICsgZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeG9wcy5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FuIGJlIHVzZWQgdG8gZmluZCBhbGwgb2YgdGhlIG5vZGVzIGluIGEgdHJlZSB0aGF0IGNvbnRhaW4gYmluYXJ5IGNvbnRlbnQgdGhhdCBpcyB0YXJnZXR0ZWQKLSAgICAgKiBmb3Igb3B0aW1pemF0aW9uIHZpYSBNVE9NLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxPTVRleHQ+IGZpbmRCaW5hcnlOb2RlcyhTT0FQRW52ZWxvcGUgZW52KSB7Ci0gICAgICAgIEFycmF5TGlzdDxPTVRleHQ+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxPTVRleHQ+KCk7Ci0gICAgICAgIGZpbmRCaW5hcnlFbGVtZW50cyhlbnYsIG5vZGVzKTsKLSAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBBIHJlY3Vyc2l2ZSBzZWFyY2ggZm9yIGFsbCBvZiB0aGUgYmluYXJ5LCBvcHRpbWl6ZWQgbm9kZXMgaW4gYSB0cmVlLgotICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kQmluYXJ5RWxlbWVudHMoT01Ob2RlIG5vZGUsIEFycmF5TGlzdDxPTVRleHQ+IGF0dGFjaG1lbnRzKSB7Ci0KLSAgICAgICAgLy8gRm9yY2VzIGEgcGFyc2UuICBUaGlzIHNlZW1zIHRvIGJlIG5lY2Vzc2FyeSBkdWUgdG8gYnVncyBpbiBPTU5hdmlnYXRvcgotICAgICAgICBub2RlLmdldE5leHRPTVNpYmxpbmcoKTsKLQotICAgICAgICAvLyBOYXZpZ2F0b3IgZG9lcyBhIHRyYXZlcnNhbCB0aGF0IG1pbWljcyB0aGUgc3RydWN0dXJlIG9mIGFuIHhtbCBkb2N1bWVudC4gCi0gICAgICAgIC8vIEVhY2ggbm9uLWVsZW1lbnQgb2JqZWN0IGlzIHByb2Nlc3NlZCBvbmNlLgotICAgICAgICAvLyBFYWNoIGVsZW1lbnQgb2JqZWN0IGlzIHZpc2l0ZWQgcHJpb3IgdG8gaXRzIGNoaWxkcmVuIGFuZCBhZnRlciBpdHMgY2hpbGRyZW4uCi0gICAgICAgIC8vIAotICAgICAgICAvLyBTdXBwb3NlIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgdHJlZSAoY2FwcyBhcmUgZWxlbWVudHMsIGxvd2VycyBhcmUgdGV4dCkKLSAgICAgICAgLy8gCi0gICAgICAgIC8vICAgICBBCi0gICAgICAgIC8vICAgIC8gXAotICAgICAgICAvLyAgIEIgICBDCi0gICAgICAgIC8vICAvXCAgIC9cCi0gICAgICAgIC8vICBEIGUgRiAgZwotICAgICAgICAvLyAKLSAgICAgICAgLy8gVGhlIHRyYXZlcnNhbCBpcwotICAgICAgICAvLyBUaGUgdHJhdmVyc2FsIGlzCi0gICAgICAgIC8vIGlzIEEgQiBEIEQnIGUgQicgQyBGIEYnIGcgQycgQScKLSAgICAgICAgLy8gVGhlICcgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyB0aGUgc2Vjb25kIHRpbWUgdGhlIG5vZGUgaXMgdmlzaXRlZCAKLSAgICAgICAgLy8gKGkuZS4gbmF2LmlzVmlzaXRlZCgpIHJldHVybnMgdHJ1ZSkKLSAgICAgICAgT01OYXZpZ2F0b3IgbmF2ID0gbmV3IE9NTmF2aWdhdG9yKG5vZGUpOwotCi0gICAgICAgIHdoaWxlIChuYXYuaXNOYXZpZ2FibGUoKSkgewotICAgICAgICAgICAgT01Ob2RlIGN1cnIgPSBuYXYubmV4dCgpOwotICAgICAgICAgICAgaWYgKGN1cnIgaW5zdGFuY2VvZiBPTVRleHQpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGFuIE9NVGV4dCwgc2VlIGlmIGl0cyBvcHRpbWl6ZWQgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ0ZXh0IG5vZGUgZm91bmQiKTsKLQotICAgICAgICAgICAgICAgIE9NVGV4dCB0ZXh0Tm9kZSA9IChPTVRleHQpY3VycjsKLSAgICAgICAgICAgICAgICBpZiAodGV4dE5vZGUuaXNPcHRpbWl6ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm9wdGltaXplZCB0ZXh0IG5vZGUgZm91bmQiKTsKLQotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5hZGQodGV4dE5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGFuIDxwcmU+PHhvcDppbmNsdWRlPjwvcHJlPiBlbGVtZW50LCBjcmVhdGUgYW4gT01UZXh0IGVsZW1lbnQKLSAgICAgKiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhdHRhY2htZW50IGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG9wCi0gICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTVRleHQgbWFrZUJpbmFyeU9NTm9kZShPTUVsZW1lbnQgeG9wLCBEYXRhSGFuZGxlciBkaCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IHhvcC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01UZXh0IGJpbmFyeU5vZGUgPSBmYWN0b3J5LmNyZWF0ZU9NVGV4dChkaCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBiaW5hcnlOb2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGFuIE9NVGV4dCBub2RlLCBjcmVhdGUgaXQncyBjb3JyZXNwb25kaW5nIDxwcmU+PHhvcDppbmNsdWRlPjwvcHJlPgotICAgICAqIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgbWFrZVhvcEVsZW1lbnQoT01UZXh0IGRhdGEpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBkYXRhLmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgeG9wID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoWE9QX0lOQ0xVREUsIG51bGwpOwotICAgICAgICB4b3AuYWRkQXR0cmlidXRlKCJocmVmIiwgZGF0YS5nZXRDb250ZW50SUQoKSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiB4b3A7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYXR0YWNobWVudCdzIGRhdGFIYW5kbGVycyBmb3IgQ2FjaGVkRmlsZURhdGFTb3VyY2UuCi0gICAgICogSWYgZXhpc3QsIGV4ZWN1dGUgZmlsZS5kZWxldGVPbkV4aXQoKSByZXF1ZXN0IG9uIHRoZSBjYWNoZWQKLSAgICAgKiBhdHRhY2htZW50IGZpbGUgcmVmZXJlbmNlZCBieSBlYWNoIENhY2hlZEZpbGVEYXRhU291cmNlLgotICAgICAqIFRoaXMgd2lsbCBkZWxldGUgdGhlIGNhY2hlZCBhdHRhY2htZW50IGZpbGUgb24gSlZNIGV4aXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF0dGFjaG1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbmRDYWNoZWRBdHRhY2htZW50KEF0dGFjaG1lbnRzIGF0dGFjaG1lbnRzKXsKLSAgICAJaWYoYXR0YWNobWVudHMgPT0gbnVsbCl7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgCVN0cmluZ1tdIGNvbnRlbnRJZHMgPSBhdHRhY2htZW50cy5nZXRBbGxDb250ZW50SURzKCk7Ci0gICAgCWlmKGNvbnRlbnRJZHMubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIAlsb2cuZGVidWcoIkF0dGFjaG1lbnRzIGV4aXN0Li4uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAJZm9yKGludCBpPTA7IGkgPCBjb250ZW50SWRzLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgCQlEYXRhSGFuZGxlciBkaCA9IGF0dGFjaG1lbnRzLmdldERhdGFIYW5kbGVyKGNvbnRlbnRJZHNbaV0pOwotICAgICAgICAJCWlmKGRoICE9IG51bGwpewotICAgICAgICAJCQlEYXRhU291cmNlIGRhdGFTb3VyY2UgPSBkaC5nZXREYXRhU291cmNlKCk7Ci0gICAgICAgIAkJCWlmKGRoICE9IG51bGwgJiYgZGF0YVNvdXJjZSBpbnN0YW5jZW9mIENhY2hlZEZpbGVEYXRhU291cmNlKXsKLSAgICAgICAgCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgCWxvZy5kZWJ1ZygiQXR0YWNobWVudCdzIERhdGFIYW5kbGVyIHVzZXMgQ2FjaGVkRmlsZURhdGFTb3VyY2UuLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCUZpbGUgZmlsZSA9ICgoQ2FjaGVkRmlsZURhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJbG9nLmRlYnVnKCIgTWFraW5nIGZpbGUuZGVsZXRlT25FeGl0KCkgcmVxdWVzdCBvbiAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAJZmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9hdHRhY2htZW50cy9KQVhCQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvYXR0YWNobWVudHMvSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjRiOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9hdHRhY2htZW50cy9KQVhCQXR0YWNobWVudE1hcnNoYWxsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmF0dGFjaG1lbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKQVhCIEF0dGFjaG1lbnRNYXJzaGFsbGVyIHRoYXQgaXMgdXNlZCB0byBoYW5kbGUgYmluYXJ5IGRhdGEgZnJvbSBKQVhCCi0gKiBhbmQgY3JlYXRlIHBvcHVsYXRlIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RzIHdpdGhpbiB0aGUgSkFYLVdTIE1lc3NhZ2UgTW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQXR0YWNobWVudE1hcnNoYWxsZXIgewotICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICAgIAotICAgIHB1YmxpYyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIoTWVzc2FnZSBtZXNzYWdlLCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsIHdyaXRlcik7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaWYgTVRPTSBlbmFibGVkIGNhbGN1bGF0ZWQgZnJvbSB0aGUgY29udGV4dCBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlLmlzTVRPTUVuYWJsZWQoKTsKLSAgICAgICAgfSAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIG9uIHRoZSBjb250ZXh0IHRoYXQgU1dBIGF0dGFjaG1lbnRzIGFyZSBlbmNvdW50ZXJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERvaW5nU1dBKCkgewotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlLnNldERvaW5nU1dBKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluZm9ybSB0aGUgY29udGV4dCB0aGF0IGFuIEF0dGFjaG1lbnQgKERhdGFIYW5kbGVyLCBDSUQpIGlzIHdyaXR0ZW4uCi0gICAgICogQHBhcmFtIGRoCi0gICAgICogQHBhcmFtIGNpZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZERhdGFIYW5kbGVyKERhdGFIYW5kbGVyIGRoLCBTdHJpbmcgY2lkKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYWRkRGF0YUhhbmRsZXIoZGgsIGNpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2F0dGFjaG1lbnRzL0pBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTE3NWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9hdHRhY2htZW50cy9KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuYXR0YWNobWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyTW9uaXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci0KLS8qKgotICogSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIKLSAqIDxwLz4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8bGluaz5qYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRVbm1hcnNoYWxsZXI8L2xpbms+IHRoYXQgaXMKLSAqIHVzZWQgZm9yIGRlc2VyaWFsaXppbmcgWE9QIGVsZW1lbnRzIGludG8gdGhlaXIgY29ycmVzcG9uZGluZyBiaW5hcnkgZGF0YSBwYWNrYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgewotCi0gICAgcHJpdmF0ZSBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyOwotCi0gICAgcHVibGljIEpBWEJBdHRhY2htZW50VW5tYXJzaGFsbGVyKE1lc3NhZ2UgbWVzc2FnZSwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlcikgewotICAgICAgICBzdXBlcihudWxsLCB4bWxTdHJlYW1SZWFkZXIpOwotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcihTdHJpbmcgY2lkKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIGF0dGFjaG1lbnQgZnJvbSB0aGUgbWVzc2FnZSB1c2luZyB0aGUgY2lkCi0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gbWVzc2FnZS5nZXREYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgaWYgKGRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuYWRkQmxvYkNJRChjaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoeG1sU3RyZWFtUmVhZGVyIGluc3RhbmNlb2YgT01YTUxTdHJlYW1SZWFkZXIpIHsKLSAgICAgICAgICAgIERhdGFIYW5kbGVyIGRoID0gCi0gICAgICAgICAgICAgICAgKChPTVhNTFN0cmVhbVJlYWRlcikgeG1sU3RyZWFtUmVhZGVyKS5nZXREYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgaWYgKGRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlck1vbml0b3IuYWRkQmxvYkNJRChjaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRoOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9DbGFzc0ZpbmRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9DbGFzc0ZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E2NzlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvQ2xhc3NGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLS8qCi0gKiBDbGFzc0ZpbmRlciB3aWxsIGJlIHVzZWQgdG8gZmluZCBjbGFzc2VzIHdpdGhpbiBhIGdpdmVuIHBhY2thZ2UuIFRoZSBnaXZlbiAKLSAqIHBhY2thZ2UgY2FuIGJlIGZvdW5kIGluIGEgRGlyZWN0b3J5IG9yIGluIGEgamFyIGZpbGUuIENsYXNzRmluZGVyIHdpbGwgdXNlIHRoZSAKLSAqIENsYXNzTG9hZGVyIHRvIGdldCB0aGUgY2xhc3NlcyBmcm9tIHRoZSBqYXIgZmlsZXMuIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NGaW5kZXIgewotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZWFkcyBhbGwgdGhlIGNsYXNzZXMgZnJvbSBnaXZlbiBwYWNrYWdlIGluIGEgamFyIGZpbGUuIEl0IHVzZXMgQ2xhc3NMb2FkZXIgdG8gZmluZAotICAgICAqIHRoZSBnaXZlbiBwYWNrYWdlIGluIGEgamFyIGZpbGUgdGhhdCBpcyBsb2NhdGVkIGluIGNsYXNzcGF0aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwa2cKLSAgICAgKiBAcGFyYW0gY2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgQXJyYXlMaXN0PENsYXNzPiBnZXRDbGFzc2VzRnJvbUphckZpbGUoU3RyaW5nIHBrZywgQ2xhc3NMb2FkZXIgY2wpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvRGF0YVNvdXJjZUJsb2NrLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0RhdGFTb3VyY2VCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWFmNzNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvRGF0YVNvdXJjZUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsNCi0NCi0vKiogRGF0YVNvdXJjZUJsb2NrIEJsb2NrIHdpdGggYSBidXNpbmVzcyBvYmplY3QgdGhhdCBpcyBhIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YVNvdXJjZUJsb2NrIGV4dGVuZHMgQmxvY2sgew0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJCbG9jay5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmN2Q1Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci0KLS8qKiBKQVhCQmxvY2sgQmxvY2sgcmVwcmVzZW50ZWQgYnkgYSBKQVhCIG9iamVjdCAqLwotcHVibGljIGludGVyZmFjZSBKQVhCQmxvY2sgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQkJsb2NrQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQmxvY2tDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMGM3ODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQmxvY2tDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRTQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuYXR0YWNobWVudHMuSkFYQkF0dGFjaG1lbnRNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5hdHRhY2htZW50cy5KQVhCQXR0YWNobWVudFVubWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRNYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudFVubWFyc2hhbGxlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoKLSAqIEEgSkFYQkJsb2NrQ29udGV4dCBjb250cm9scyBhY2Nlc3MgdG8gdGhlIEpBWEJDb250ZXh0Ci0gKiBJbiBhZGRpdGlvbiB0aGUgSkFYQkJsb2NrQ29udGV4dCBjb250YWlucyBhZGRpdGlvbmFsIGNvbnRleHR1cmFsIGluZm9ybWF0aW9uIG5lZWRlZAotICogYnkgdGhlIEpBWC1XUyBjb21wb25lbnQKLSAqLwotCi1wdWJsaWMgY2xhc3MgSkFYQkJsb2NrQ29udGV4dCBleHRlbmRzIEpBWEJEU0NvbnRleHQgewotCi0gICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLSAgICAvKioKLSAgICAgKiBGdWxsIENvbnN0cnVjdG9yIEpBWEJCbG9ja0NvbnRleHQgKG1vc3QgcGVyZm9ybWFudCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYWNrYWdlcyBTZXQgb2YgcGFja2FnZXMgbmVlZGVkIGJ5IHRoZSBKQVhCQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYQkJsb2NrQ29udGV4dChUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMsIFN0cmluZyBwYWNrYWdlc0tleSkgewotICAgICAgICBzdXBlcihwYWNrYWdlcywgcGFja2FnZXNLZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNsaWdodGx5IHNsb3dlciBjb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VzCi0gICAgICovCi0gICAgcHVibGljIEpBWEJCbG9ja0NvbnRleHQoVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzKSB7Ci0gICAgICAgIHRoaXMocGFja2FnZXMsIHBhY2thZ2VzLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vcm1hbCBDb25zdHJ1Y3RvciBKQVhCQmxvY2tDb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dFBhY2thZ2UKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBKQVhCQmxvY2tDb250ZXh0KFN0cmluZyBjb250ZXh0UGFja2FnZSkgewotICAgICAgICBzdXBlcihjb250ZXh0UGFja2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIkRpc3BhdGNoIiBDb25zdHJ1Y3RvciBVc2UgdGhpcyBmdWxsIGNvbnN0cnVjdG9yIHdoZW4gdGhlIEpBWEJDb250ZW50IGlzIHByb3ZpZGVkIGJ5IHRoZQotICAgICAqIGN1c3RvbWVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIEpBWEJCbG9ja0NvbnRleHQoSkFYQkNvbnRleHQgamF4YkNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoamF4YkNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEF0dGFjaG1lbnRNYXJzaGFsbGVyIGNyZWF0ZUF0dGFjaG1lbnRNYXJzaGFsbGVyKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQXR0YWNobWVudE1hcnNoYWxsZXIoZ2V0TWVzc2FnZSgpLCB3cml0ZXIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQXR0YWNobWVudFVubWFyc2hhbGxlciBjcmVhdGVBdHRhY2htZW50VW5tYXJzaGFsbGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCQXR0YWNobWVudFVubWFyc2hhbGxlcihnZXRNZXNzYWdlKCksIHJlYWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotICAgICAgICBpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKS4KLSAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eShDb25zdGFudHMuQ0FDSEVfQ0xBU1NMT0FERVIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRDbGFzc0xvYWRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKSAhPSBudWxsICYmCi0gICAgICAgICAgIG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRNZXNzYWdlQ29udGV4dChtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlQ29udGV4dCgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQkNvbnRleHRGcm9tQ2xhc3Nlcy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQ29udGV4dEZyb21DbGFzc2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MmRmMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCQ29udGV4dEZyb21DbGFzc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsNCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7DQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB1dGlsaXR5IG1ldGhvZCwgbmV3SW5zdGFuY2UsIHdoaWNoDQotICogYnVpbGRzIGEgdmFsaWQgSkFYQkNvbnRleHQgZnJvbSBhIHNlcmllcyBvZiBjbGFzc2VzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQ29udGV4dEZyb21DbGFzc2VzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJDb250ZXh0RnJvbUNsYXNzZXMuY2xhc3MpOw0KLSAgICAvKioNCi0gICAgICogU3RhdGljIHV0aWxpdHkgY2xhc3MuICBDb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IHByaXZhdGUNCi0gICAgICovDQotICAgIHByaXZhdGUgSkFYQkNvbnRleHRGcm9tQ2xhc3NlcygpIHsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgSkFYQkNvbnRleHQgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MgYXJyYXkgYW5kIGNsYXNzIGxvYWRlci4NCi0gICAgICogSWYgZXJyb3JzIG9jY3VyLCB0aGVuIHRoZSBKQVhCQ29udGV4dCBpcyBjcmVhdGVkIGZyb20gdGhlIA0KLSAgICAgKiBtaW5pbWFsIHNldCBvZiB2YWxpZCBjbGFzc2VzLg0KLSAgICAgKiANCi0gICAgICogTm90ZTogU29tZXRpbWVzIHVzZXJzIHdpbGwgaW50ZXJtaW5nbGUgSkFYQiBjbGFzc2VzIGFuZCBvdGhlcg0KLSAgICAgKiBub24tSkFYQiB1dGlsaXR5IGNsYXNzZXMuICBUaGlzIGlzIG5vdCBhIGdvb2QgcHJhY3RpY2UsIGJ1dCBkb2VzDQotICAgICAqIGhhcHBlbi4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHRyeSBhbmQgYnVpbGQgYSB2YWxpZA0KLSAgICAgKiBKQVhCQ29udGV4dCBmcm9tIG9ubHkgdGhlICd2YWxpZCcgY2xhc3Nlcy4gDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gY2xhc3NBcnJheQ0KLSAgICAgKiBAcGFyYW0gY2wNCi0gICAgICogQHJldHVybiBKQVhCQ29udGV4dA0KLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvbnRleHQgbmV3SW5zdGFuY2UoQ2xhc3NbXSBjbGFzc0FycmF5LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSANCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGlmIChjbGFzc0FycmF5ID09IG51bGwgfHwgY2xhc3NBcnJheS5sZW5ndGggPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnkgdG8gY29uc3RydWN0IEpBWEJDb250ZXh0IHdpdGggMCBpbnB1dCBjbGFzc2VzLiIpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnkgdG8gY29uc3RydWN0IEpBWEJDb250ZXh0IHdpdGggIiArIGNsYXNzQXJyYXkubGVuZ3RoICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnB1dCBjbGFzc2VzLiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGpheGJDb250ZXh0ID0gX25ld0luc3RhbmNlKGNsYXNzQXJyYXksIGNsLCBwcm9wZXJ0aWVzKTsNCi0NCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTdWNjZXNzZnVsbHkgY29uc3RydWN0ZWQgSkFYQkNvbnRleHQgIiArIGpheGJDb250ZXh0KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIC8vIFRyeSBmaW5kaW5nIHRoZSBiZXN0IHNldCBvZiBjbGFzc2VzDQotICAgICAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBvcmlnaW5hbCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2xhc3NBcnJheS5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbC5hZGQoY2xhc3NBcnJheVtpXSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEFycmF5TGlzdDxDbGFzcz4gYmVzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICAgICAgamF4YkNvbnRleHQgPSBmaW5kQmVzdFNldChvcmlnaW5hbCwgY2wsIGJlc3QsIHByb3BlcnRpZXMpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGpheGJDb250ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgSkFYQkNvbnRleHQgZnJvbSB0aGUgDQotICAgICAqIGNsYXNzW10gYW5kIENsYXNzTG9hZGVyLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGNsYXNzQXJyYXkNCi0gICAgICogQHBhcmFtIGNsDQotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHQNCi0gICAgICogQHRocm93cyBUaHJvd2FibGUNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0IF9uZXdJbnN0YW5jZShmaW5hbCBDbGFzc1tdIGNsYXNzQXJyYXksIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2wsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSANCi0gICAgICAgIHRocm93cyBUaHJvd2FibGUgew0KLSAgICAgICAgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGpheGJDb250ZXh0ID0gKEpBWEJDb250ZXh0KUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKA0KLSAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIFVubGlrZSB0aGUgSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoQ2xhc3NbXSkgbWV0aG9kDQotICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdyBhY2NlcHQgYSBjbGFzc2xvYWRlci4gIFRvIHdvcmthcm91bmQgdGhpcw0KLSAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNzdWUsIHRoZSBjbGFzc2xvYWRlciBpcyB0ZW1wb3JhcmlseSBjaGFuZ2VkIHRvIGNsDQotICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQgY3VycmVudFRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7DQotICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBzYXZlZENsYXNzTG9hZGVyID0gY3VycmVudFRocmVhZC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRocmVhZC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2wpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjbGFzc0FycmF5LCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRocmVhZC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoc2F2ZWRDbGFzc0xvYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgKTsNCi0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93ICgoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbikgZSkuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIHRocm93IHQ7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IGNsYXNzIHRoYXQgcXVpY2tseSBkaXZpZGVzIGEgbGlzdCBvZiBjbGFzc2VzIGludG8gdHdvIGNhdGVnb3JpZXMuDQotICAgICAqIFRoZSBwcmltYXJ5IGNhdGVnb3J5IGNsYXNzZXMgY29udGFpbiBKQVhCIGFubm90YXRpb25zLg0KLSAgICAgKiBUaGUgc2Vjb25kYXJ5IGNhdGVnb3J5IGNsYXNzZXMgZG8gbm90IGNvbnRhaW4gSkFYQiBhbm5vdGF0aW9ucw0KLSAgICAgKiBAcGFyYW0gb3JpZ2luYWwNCi0gICAgICogQHBhcmFtIHByaW1hcnkNCi0gICAgICogQHBhcmFtIHNlY29uZGFyeQ0KLSAgICAgKi8NCi0gICAgc3RhdGljIHZvaWQgc2VwYXJhdGUoTGlzdDxDbGFzcz4gb3JpZ2luYWwsIExpc3Q8Q2xhc3M+IHByaW1hcnksIExpc3Q8Q2xhc3M+IHNlY29uZGFyeSkgew0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG9yaWdpbmFsLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgQ2xhc3MgY2xzID0gb3JpZ2luYWwuZ2V0KGkpOw0KLSAgICAgICAgICAgIGlmIChjb21tb25BcnJheUNsYXNzZXMuY29udGFpbnMoY2xzKSkgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhpcyBsb29rcyBsaWtlIGEgSkFYQiBjb21tb24gY2xhc3MuIEFkZGluZyBpdCB0byBwcmltYXJ5IGxpc3Q6IiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHByaW1hcnkuYWRkKGNscyk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRBbm5vdGF0aW9uKGNscywgWG1sVHlwZS5jbGFzcykgIT0gbnVsbCB8fA0KLSAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihjbHMsIFhtbFJvb3RFbGVtZW50LmNsYXNzKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGlzIGxvb2tzIGxpa2UgYSBKQVhCIGNsYXNzLiBBZGRpbmcgaXQgdG8gcHJpbWFyeSBsaXN0OiIgKyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBwcmltYXJ5LmFkZChjbHMpOyAgLy8gVGhpcyBsb29rcyBsaWtlIGEgSkFYQiBjbGFzcy4uLmFkZCBpdA0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGlzIG1heSBub3QgYmUgYSBKQVhCIGNsYXNzLiBBZGRpbmcgaXQgdG8gc2Vjb25kYXJ5IGxpc3Q6IiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHNlY29uZGFyeS5hZGQoY2xzKTsgIC8vIFRoaXMgbG9va3MgbGlrZSBpdCBtaWdodCBiZSBzb21ldGhpbmcgZWxzZS4uLg0KLSAgICAgICAgICAgIH0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdpdmVuIGEgbGlzdCBvZiBjbGFzc2VzLCB0aGlzIG1ldGhvZCBkZXRlcm1pbmVzIHRoZSBiZXN0IG1pbmltYWwgc2V0DQotICAgICAqIG9mIGNsYXNzZXMgYW5kIHJldHVybnMgdGhlIEpBWEJDb250ZXh0IGZvciB0aGlzIG1pbmltYWwgc2V0Lg0KLSAgICAgKiBAcGFyYW0gb3JpZ2luYWwgTGlzdDxDbGFzcz4NCi0gICAgICogQHBhcmFtIGNsIENsYXNzTG9hZGVyDQotICAgICAqIEBwYXJhbSBMaXN0TUNsYXNzPiBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgbWluaW1hbCwgYmVzdCBzZXQgb2YgY2xhc3Nlcw0KLSAgICAgKiBAcmV0dXJuIEpBWEJDb250ZXh0DQotICAgICAqLw0KLSAgICBzdGF0aWMgSkFYQkNvbnRleHQgZmluZEJlc3RTZXQoTGlzdDxDbGFzcz4gb3JpZ2luYWwsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGJlc3QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykgew0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBjb25zdHJ1Y3QgSkFYQkNvbnRleHQgd2l0aCB0aGUgaW5pdGlhbCBsaXN0LiIpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm93IHRyeWluZyB0byBjb25zdHJ1Y3QgSkFYQkNvbnRleHQgd2l0aCBvbmx5IHRoZSB2YWxpZCBjbGFzc2VzIGluIHRoZSBsaXN0Iik7DQotICAgICAgICB9DQotICAgICAgICBKQVhCQ29udGV4dCBqYyA9IG51bGw7DQotICAgICAgICBDbGFzc1tdIGNsc0FycmF5ID0gbmV3IENsYXNzWzBdOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgLy8gRGl2aWRlIHRoZSBsaXN0IGludG8gdGhlIGNsYXNzZXMgdGhhdCBoYXZlIEpBWEIgYW5ub3RhdGlvbnMgKHByaW1hcnkpDQotICAgICAgICAvLyBhbmQgdGhvc2UgdGhhdCBkbyBub3QgKHNlY29uZGFyeSkNCi0gICAgICAgIEFycmF5TGlzdDxDbGFzcz4gcHJpbWFyeSA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+ICgpOw0KLSAgICAgICAgQXJyYXlMaXN0PENsYXNzPiBzZWNvbmRhcnkgPSBuZXcgQXJyYXlMaXN0PENsYXNzPiAoKTsNCi0gICAgICAgIHNlcGFyYXRlKG9yaWdpbmFsLCBwcmltYXJ5LCBzZWNvbmRhcnkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBQcmltZSB0aGUgcHVtcA0KLSAgICAgICAgLy8gQnVpbGQgYSBKQVhCQ29udGV4dCB3aXRoIHRoZSBwcmltYXJ5IGNsYXNzZXMNCi0gICAgICAgIGJlc3QuYWRkQWxsKHByaW1hcnkpOw0KLSAgICAgICAgaWYgKGJlc3Quc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGpjID0gX25ld0luc3RhbmNlKGJlc3QudG9BcnJheShjbHNBcnJheSksIGNsLCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIEpBWEJDb250ZXh0IGNyZWF0aW9uIGZhaWxlZCB3aXRoIHRoZSBwcmltYXJ5IGxpc3QiKTsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV2lsbCB0cnkgYSBtb3JlIGJydXRlIGZvcmNlIGFsZ29yaXRobSIpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSByZWFzb24gaXMgIiArIHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vIEFkZCBhbGwgb2YgdGhlIHByaW1hcnkgY2xhc3NlcyB0byB0aGUgc2Vjb25kYXJ5IGxpc3Qgc28gDQotICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgY2FuIHdhbGsgdGhlbSBvbmUgYnkgb25lLg0KLSAgICAgICAgICAgICAgICBzZWNvbmRhcnkuYWRkQWxsKHByaW1hcnkpOw0KLSAgICAgICAgICAgICAgICBiZXN0LmNsZWFyKCk7IC8vIENsZWFyIG91dCB0aGUgYmVzdCBsaXN0DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgYWRkIHNlY29uZGFyeSBjbGFzc2VzIG9uZSBhdCBhIHRpbWUuDQotICAgICAgICAvLyBJZiB0aGUgSkFYQkNvbnRleHQgY3JlYXRpb24gaXMgc3VjY2Vzc2Z1bCwgYWRkIHRoZSBjbGFzcw0KLSAgICAgICAgLy8gdG8gdGhlIGJlc3QgbGlzdC4gIE90aGVyd2lzZSBjb250aW51ZS4NCi0gICAgICAgIC8vIA0KLSAgICAgICAgLy8gQFJFVklFVyBPbmUgb3B0aW1pemF0aW9uIGlzIHRvIGRvIGEgdG9TdHJpbmcoKSBvbiB0aGUgSkFYQkNvbnRleHQNCi0gICAgICAgIC8vIGFuZCBjaGVjayBmb3IgdGhlIHByZXNlbnNlIG9mIHRoZSBzZWNvbmRhcnkgY2xhc3MuICBUaGlzIHdvdWxkDQotICAgICAgICAvLyBzYXZlIHRpbWUuICBIb3dldmVyLCB0aGlzIGFsc28gYXNzdW1lcyB0aGF0IHRoZSB0b1N0cmluZygpIA0KLSAgICAgICAgLy8gb2YgSkFYQkNvbnRleHQgZG9lcyBub3QgY2hhbmdlLg0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8c2Vjb25kYXJ5LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgQ2xhc3MgY2xzID0gc2Vjb25kYXJ5LmdldChpKTsNCi0gICAgICAgICAgICBiZXN0LmFkZChjbHMpOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGpjID0gX25ld0luc3RhbmNlKGJlc3QudG9BcnJheShjbHNBcnJheSksIGNsLCBwcm9wZXJ0aWVzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBub3QgYSBKQVhCIGNsYXNzOiAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBKQVhCQ29udGV4dCBjcmVhdGlvbiBjb250aW51ZXMgd2l0aG91dCB0aGlzIGNsYXNzLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSByZWFzb24gaXMgIiArIHQpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGJlc3QucmVtb3ZlKGNscyk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBAUkVWSUVXDQotICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIHNhdmUgdGhlIGV4Y2VwdGlvbnMgKHBlcmhhcHMgaW4gYSBsaXN0KSBhbmQNCi0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBleGNlcHRpb25zLiAgVGhlbiBpZiBwcm9ibGVtcyBvY2N1ciBsYXRlcg0KLSAgICAgICAgICAgICAgICAvLyAoaS5lLiBkbyB0byBtaXNzaW5nIGV4Y2VwdGlvbnMpIHRoZW4gd2UgY291bGQgdGhyb3cNCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBleGNlcHRpb24uDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gamM7DQotICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCBhbiBhbm5vdGF0aW9uLiAgVGhpcyBpcyB3cmFwcGVyZWQgdG8gYXZvaWQgYSBKYXZhMlNlY3VyaXR5IHZpb2xhdGlvbi4NCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gDQotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbg0KLSAgICAgKiBAcmV0dXJuIGFubm90YXRpb24gb3IgbnVsbA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgew0KLSAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDbGFzcz4gY29tbW9uQXJyYXlDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoYm9vbGVhbltdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoYnl0ZVtdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoY2hhcltdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoZG91YmxlW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChmbG9hdFtdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoaW50W10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChsb25nW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChzaG9ydFtdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoU3RyaW5nW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChPYmplY3RbXS5jbGFzcyk7DQotICAgICAgICBjb21tb25BcnJheUNsYXNzZXMuYWRkKEltYWdlW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChCaWdEZWNpbWFsW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChCaWdJbnRlZ2VyW10uY2xhc3MpOw0KLSAgICAgICAgY29tbW9uQXJyYXlDbGFzc2VzLmFkZChDYWxlbmRhcltdLmNsYXNzKTsNCi0gICAgICAgIGNvbW1vbkFycmF5Q2xhc3Nlcy5hZGQoUU5hbWVbXS5jbGFzcyk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzE0ZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkNsYXNzRmluZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotCi0vKioKLSAqIEpBWEIgVXRpbGl0ZXMgdG8gcG9vbCBKQVhCQ29udGV4dCBhbmQgcmVsYXRlZCBvYmplY3RzLiAKLSAqLwotcHVibGljIGNsYXNzIEpBWEJVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQlV0aWxzLmNsYXNzKTsKLQotICAgIC8vIENyZWF0ZSBhIGNvbmN1cnJlbnQgbWFwIHRvIGdldCB0aGUgSkFYQk9iamVjdDogCi0gICAgLy8gICAga2V5IGlzIHRoZSBTdHJpbmcgKHNvcnRlZCBwYWNrYWdlcykKLSAgICAvLyAgICB2YWx1ZSBpcyBhIFNvZnRSZWZlcmVuY2UgdG8gYSBDb25jdXJyZW50SGFzaE1hcCBvZiBDbGFzc2xvYWRlciBrZXlzIGFuZCBKQVhCQ29udGV4dFZhbHVlIG9iamVjdHMKLSAgICAvLyAgICAgICAgICAgICAgIEl0IGlzIGEgc29mdCBtYXAgdG8gZW5jb3VyYWdlIEdDIGluIGxvdyBtZW1vcnkgc2l0dWF0aW9ucwotICAgIHByaXZhdGUgc3RhdGljIE1hcDwKLSAgICAgICAgU3RyaW5nLCAKLSAgICAgICAgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+PiBqYXhiTWFwID0KLSAgICAgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIAotICAgICAgICAgICAgICAgIFNvZnRSZWZlcmVuY2U8Q29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+Pj4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFBvb2w8SkFYQkNvbnRleHQsIE1hcnNoYWxsZXI+ICAgICAgIG1wb29sID0gbmV3IFBvb2w8SkFYQkNvbnRleHQsIE1hcnNoYWxsZXI+KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUG9vbDxKQVhCQ29udGV4dCwgVW5tYXJzaGFsbGVyPiAgICAgdXBvb2wgPSBuZXcgUG9vbDxKQVhCQ29udGV4dCwgVW5tYXJzaGFsbGVyPigpOwotICAgIHByaXZhdGUgc3RhdGljIFBvb2w8SkFYQkNvbnRleHQsIEpBWEJJbnRyb3NwZWN0b3I+IGlwb29sID0gbmV3IFBvb2w8SkFYQkNvbnRleHQsIEpBWEJJbnRyb3NwZWN0b3I+KCk7Ci0gICAgCi0gICAgLy8gRnJvbSBMaXpldCBFcm5hbmQ6Ci0gICAgLy8gSWYgeW91IHJlYWxseSBjYXJlIGFib3V0IHRoZSBwZXJmb3JtYW5jZSwgCi0gICAgLy8gYW5kL29yIHlvdXIgYXBwbGljYXRpb24gaXMgZ29pbmcgdG8gcmVhZCBhIGxvdCBvZiBzbWFsbCBkb2N1bWVudHMsIAotICAgIC8vIHRoZW4gY3JlYXRpbmcgVW5tYXJzaGFsbGVyIGNvdWxkIGJlIHJlbGF0aXZlbHkgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbi4gCi0gICAgLy8gSW4gdGhhdCBjYXNlLCBjb25zaWRlciBwb29saW5nIFVubWFyc2hhbGxlciBvYmplY3RzLgotICAgIC8vIERpZmZlcmVudCB0aHJlYWRzIG1heSByZXVzZSBvbmUgVW5tYXJzaGFsbGVyIGluc3RhbmNlLCAKLSAgICAvLyBhcyBsb25nIGFzIHlvdSBkb24ndCB1c2Ugb25lIGluc3RhbmNlIGZyb20gdHdvIHRocmVhZHMgYXQgdGhlIHNhbWUgdGltZS4gCi0gICAgLy8gRU5BQkxFX0FEVl9QT09MSU5HIGlzIGZhbHNlLi4ud2hpY2ggbWVhbnMgdGhleSBhcmUgb2J0YWluZWQgZnJvbSB0aGUgSkFYQkNvbnRleHQgaW5zdGVhZCBvZgotICAgIC8vIGZyb20gdGhlIHBvb2wuCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBFTkFCTEVfTUFSU0hBTExfUE9PTElORyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBFTkFCTEVfVU5NQVJTSEFMTF9QT09MSU5HID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIEVOQUJMRV9JTlRST1NQRUNUSU9OX1BPT0xJTkcgPSBmYWxzZTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUFYX0xPQURfRkFDVE9SID0gMzI7ICAvLyBNYXhpbXVtIG51bWJlciBvZiBKQVhCQ29udGV4dCB0byBzdG9yZQotCi0gICAgLy8gQ29uc3RydWN0aW9uIFR5cGUKLSAgICBwdWJsaWMgZW51bSBDT05TVFJVQ1RJT05fVFlQRSB7Ci0gICAgICAgIEJZX0NMQVNTX0FSUkFZLCBCWV9DT05URVhUX1BBVEgsIFVOS05PV059Ci0KLSAgICA7Ci0gICAgCi0gICAgLy8gU29tZSBwYWNrYWdlcyBoYXZlIGEga25vd24gc2V0IG9mIGNsYXNzZXMuCi0gICAgLy8gVGhpcyBtYXAgaXMgaW1tdXRhYmxlIGFmdGVyIGl0cyBzdGF0aWMgY3JlYXRpb24uCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgTGlzdDxDbGFzcz4+IHNwZWNpYWxNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8Q2xhc3M+PigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIFRoZSBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nIHBhY2thZ2UgaGFzIGEgc2luZ2xlIGNsYXNzIChXM0NFbmRwb2ludFJlZmVyZW5jZSkKLSAgICAgICAgTGlzdDxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0gICAgICAgIGNsYXNzZXMuYWRkKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsKLSAgICAgICAgc3BlY2lhbE1hcC5wdXQoImphdmF4LnhtbC53cy53c2FkZHJlc3NpbmciLCBjbGFzc2VzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FU1BBQ0VfUkVNQVAgPSBnZXREZWZhdWx0TmFtZXNwYWNlUmVtYXBQcm9wZXJ0eSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIEpBWEJDb250ZXh0IGZvciB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0UGFja2FnZSBTZXQ8UGFja2FnZT4KLSAgICAgKiBAcmV0dXJuIEpBWEJDb250ZXh0Ci0gICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXMpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEpBWEJDb250ZXh0KGNvbnRleHRQYWNrYWdlcywgbmV3IEhvbGRlcjxDT05TVFJVQ1RJT05fVFlQRT4oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGFja2FnZXMudG9TdHJpbmcoKSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgSkFYQkNvbnRleHQgZm9yIHRoZSBjbGFzcwotICAgICAqIAotICAgICAqIE5vdGU6IFRoZSBjb250ZXh0UGFja2FnZSBvYmplY3QgaXMgdXNlZCBieSBtdWx0aXBsZSB0aHJlYWRzLiAgSXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW1tdXRhYmxlCi0gICAgICogYW5kIG5vdCBhbHRlcmVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRQYWNrYWdlIFNldDxQYWNrYWdlPgotICAgICAqIEBwYXJhbSBjYWNoZUtleSBDbGFzc0xvYWRlcgotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoVHJlZVNldDxTdHJpbmc+IGNvbnRleHRQYWNrYWdlcywgQ2xhc3NMb2FkZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUtleSkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SkFYQkNvbnRleHQoY29udGV4dFBhY2thZ2VzLCBuZXcgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFBhY2thZ2VzLnRvU3RyaW5nKCksIGNhY2hlS2V5LCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dChUcmVlU2V0PFN0cmluZz4gY29udGV4dFBhY2thZ2VzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvbGRlcjxDT05TVFJVQ1RJT05fVFlQRT4gY29uc3RydWN0aW9uVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkpCi0gICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEpBWEJDb250ZXh0KGNvbnRleHRQYWNrYWdlcywgY29uc3RydWN0aW9uVHlwZSwga2V5LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBKQVhCQ29udGV4dCBmb3IgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBOb3RlOiBUaGUgY29udGV4dFBhY2thZ2Ugb2JqZWN0IGlzIHVzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4gIEl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGltbXV0YWJsZQotICAgICAqIGFuZCBub3QgYWx0ZXJlZCBieSB0aGlzIG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29udGV4dFBhY2thZ2UgIFNldDxQYWNrYWdlPiAKLSAgICAgKiBAcGFyYW0gY29udHJ1Y3Rpb25UeXBlIChvdXRwdXQgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgaG93IHRoZSBjb250ZXh0IHdhcyBjb25zdHJ1Y3RlZCkKLSAgICAgKiBAcGFyYW0gY2FjaGVLZXkgQ2xhc3NMb2FkZXIKLSAgICAgKiBAcmV0dXJuIEpBWEJDb250ZXh0Ci0gICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dChUcmVlU2V0PFN0cmluZz4gY29udGV4dFBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPiBjb25zdHJ1Y3Rpb25UeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjYWNoZUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpCi0gICAgICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEpBWEJDb250ZXh0cyBmb3IgdGhlIHNhbWUgY2xhc3MgY2FuIGJlIHJldXNlZCBhbmQgYXJlIHN1cHBvc2VkIHRvIGJlIHRocmVhZC1zYWZlCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJGb2xsb3dpbmcgcGFja2FnZXMgYXJlIGluIHRoaXMgYmF0Y2ggb2YgZ2V0SkFYQkNvbnRleHQoKSA6Iik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBwa2cgOiBjb250ZXh0UGFja2FnZXMpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcocGtnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBKQVhCVXRpbHNNb25pdG9yLmFkZFBhY2thZ2VLZXkoa2V5KTsKLQotICAgICAgICAvLyBHZXQgb3IgQ3JlYXRlIFRoZSBJbm5lck1hcCB1c2luZyB0aGUgcGFja2FnZSBrZXkKLSAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+IGlubmVyTWFwID0gbnVsbDsKLSAgICAgICAgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+IAotICAgICAgICAgICAgc29mdFJlZiA9IGpheGJNYXAuZ2V0KGtleSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc29mdFJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbm5lck1hcCA9IHNvZnRSZWYuZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbm5lck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoamF4Yk1hcCkgewotICAgICAgICAgICAgICAgIHNvZnRSZWYgPSBqYXhiTWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmIChzb2Z0UmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5uZXJNYXAgPSBzb2Z0UmVmLmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5uZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbm5lck1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4oKTsKLSAgICAgICAgICAgICAgICAgICAgc29mdFJlZiA9IAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnRSZWZlcmVuY2U8Q29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+Pihpbm5lck1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIGpheGJNYXAucHV0KGtleSwgc29mdFJlZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBOb3cgZ2V0IHRoZSBjb250ZXh0VmFsdWUgdXNpbmcgZWl0aGVyIHRoZSBjbGFzc2xvYWRlciBrZXkgb3IgCi0gICAgICAgIC8vIHRoZSBjdXJyZW50IENsYXNzbG9hZGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIEpBWEJDb250ZXh0VmFsdWUgY29udGV4dFZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYoY2FjaGVLZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVzaW5nIHN1cHBsaWVkIGNsYXNzbG9hZGVyIHRvIHJldHJpZXZlIEpBWEJDb250ZXh0OiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHRWYWx1ZSA9IGlubmVyTWFwLmdldChjYWNoZUtleSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVXNpbmcgY2xhc3Nsb2FkZXIgZnJvbSBUaHJlYWQgdG8gcmV0cmlldmUgSkFYQkNvbnRleHQ6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2wpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dFZhbHVlID0gaW5uZXJNYXAuZ2V0KGNsKTsKLSAgICAgICAgfQotICAgICAgCi0gICAgICAgIAotCi0gICAgICAgIGlmIChjb250ZXh0UGFja2FnZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dFBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZXh0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChpbm5lck1hcCkgewotICAgICAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgdGhlIGNvbnRleHRWYWx1ZSBvbmNlIG1vcmUgc2luY2Ugc3luYyB3YXMgdGVtcG9yYXJpbHkgZXhpdGVkLgotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsS2V5ID0gKGNhY2hlS2V5ICE9IG51bGwpID8gY2FjaGVLZXk6Y2w7Ci0gICAgICAgICAgICAgICAgY29udGV4dFZhbHVlID0gaW5uZXJNYXAuZ2V0KGNsS2V5KTsKLSAgICAgICAgICAgICAgICBhZGp1c3RQb29sU2l6ZShpbm5lck1hcCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRWYWx1ZT09bnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjb250ZXh0UGFja2FnZXMuICBUaGlzIG5ldyBUcmVlU2V0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbiBvbmx5IHRoZSB2YWxpZCBjb250ZXh0UGFja2FnZXMuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBvcmlnaW5hbCBjb250ZXh0UGFja2FnZSBzZXQgaXMgYWNjZXNzZWQgYnkgbXVsdGlwbGUgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZHMgYW5kIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KLQotICAgICAgICAgICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gdmFsaWRDb250ZXh0UGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbnRleHRQYWNrYWdlcyk7IAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdHJ5Q2wgPSBjbDsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dFZhbHVlID0gY3JlYXRlSkFYQkNvbnRleHRWYWx1ZSh2YWxpZENvbnRleHRQYWNrYWdlcywgY2wsIHByb3BlcnRpZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBhbGwgdGhlIGNsYXNzZXMsIHRyeSB0aGUgY2FjaGVkIGNsYXNzbG9hZGVyIAotICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVLZXkgIT0gbnVsbCAmJiB2YWxpZENvbnRleHRQYWNrYWdlcy5zaXplKCkgIT0gY29udGV4dFBhY2thZ2VzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Q2wgPSBjYWNoZUtleTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQ29udGV4dFBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb250ZXh0UGFja2FnZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFZhbHVlID0gY3JlYXRlSkFYQkNvbnRleHRWYWx1ZSh2YWxpZENvbnRleHRQYWNrYWdlcywgY2FjaGVLZXksIHByb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoamF4Yk1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb250ZXh0IHZhbHVlIHdpdGggdGhlIG9yaWdpbmFsIHBhY2thZ2Ugc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4gbWFwMSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTb2Z0UmVmZXJlbmNlPENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPj4gCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2Z0UmVmMSA9IGpheGJNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29mdFJlZjEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDEgPSBzb2Z0UmVmLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcDEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDEgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdFJlZjEgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnRSZWZlcmVuY2U8Q29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+PihtYXAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiTWFwLnB1dChrZXksIHNvZnRSZWYxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcDEucHV0KGNsS2V5LCBjb250ZXh0VmFsdWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsaWRQYWNrYWdlc0tleSA9IHZhbGlkQ29udGV4dFBhY2thZ2VzLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY29udGV4dCB2YWx1ZSB3aXRoIHRoZSBuZXcgcGFja2FnZSBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwPENsYXNzTG9hZGVyLCBKQVhCQ29udGV4dFZhbHVlPiBtYXAyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNvZnRSZWZlcmVuY2U8Q29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+PiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvZnRSZWYyID0gamF4Yk1hcC5nZXQodmFsaWRQYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29mdFJlZjIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDIgPSBzb2Z0UmVmLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcDIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDIgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29mdFJlZjIgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnRSZWZlcmVuY2U8Q29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+PihtYXAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiTWFwLnB1dChrZXksIHNvZnRSZWYyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcDIucHV0KGNsS2V5LCBjb250ZXh0VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJDb250ZXh0IFtjcmVhdGVkXSBmb3IgIiArIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBhbHNvIHN0b3JlZCBieSB0aGUgbGlzdCBvZiB2YWxpZCBwYWNrYWdlczoiICsgdmFsaWRQYWNrYWdlc0tleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkNvbnRleHQgW2Zyb20gcG9vbF0gZm9yICIgKyBrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0cnVjdGlvblR5cGUudmFsdWUgPSBjb250ZXh0VmFsdWUuY29uc3RydWN0aW9uVHlwZTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHRWYWx1ZS5qYXhiQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBKQVhCQ29udGV4dCB1c2luZyB0aGUgY29udGV4dFBhY2thZ2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dFBhY2thZ2VzIFNldDxTdHJpbmc+Ci0gICAgICogQHBhcmFtIGNsICAgICAgICAgICAgICBDbGFzc0xvYWRlcgotICAgICAqIEByZXR1cm4gSkFYQkNvbnRleHRWYWx1ZSAoSkFYQkNvbnRleHQgKyBjb25zdHJ1Y3Rpb25UeXBlKQotICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0VmFsdWUgY3JlYXRlSkFYQkNvbnRleHRWYWx1ZShUcmVlU2V0PFN0cmluZz4gY29udGV4dFBhY2thZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotCi0gICAgICAgIEpBWEJDb250ZXh0VmFsdWUgY29udGV4dFZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9sbG93aW5nIHBhY2thZ2VzIGFyZSBpbiB0aGlzIGJhdGNoIG9mIGdldEpBWEJDb250ZXh0KCkgOiIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBwa2cgOiBjb250ZXh0UGFja2FnZXMpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcocGtnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhpcyBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQgdG8gY29uc3RydWN0IHRoZSBKQVhCQ29udGV4dCIgKyBjbCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIGNvbnRleHRQYWNrYWdlcyBpcyBhIHNldCBvZiBwYWNrYWdlIG5hbWVzIHRoYXQgYXJlIGNvbnN0cnVjdGVkIHVzaW5nIFBhY2thZ2VTZXRCdWlsZGVyLgotICAgICAgICAvLyBQYWNrYWdlU2V0QnVpbGRlciBnZXRzIHRoZSBwYWNrYWdlcyBuYW1lcyBmcm9tIHZhcmlvdXMgc291cmNlcy4KLSAgICAgICAgLy8gICBhKSBJdCB3YWxrcyB0aGUgdmFyaW91cyBhbm5vdGF0aW9ucyBvbiB0aGUgV2ViU2VydmljZSBjb2xsZWN0aW5nIHBhY2thZ2UgbmFtZXMuCi0gICAgICAgIC8vICAgYikgSXQgd2Fsa3MgdGhlIHdzZGwvc2NoZW1hcyBhbmQgYnVpbGRzIHBhY2thZ2UgbmFtZXMgZm9yIGVhY2ggdGFyZ2V0IG5hbWVzcGFjZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHR3byBzb3VyY2VzIHNob3VsZCBwcm9kdWNlIGFsbCBvZiB0aGUgcGFja2FnZSBuYW1lcy4KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBOb3RlIHRoYXQgKGIpIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGZvbGxvd2luZyBjYXNlOgotICAgICAgICAvLyBBbiBvcGVyYXRpb24gaGFzIGEgcGFyYW1ldGVyIG5hbWVkIEJBU0UuCi0gICAgICAgIC8vIE9iamVjdCBERVJJVkVEIGlzIGFuIGV4dGVuc2lvbiBvZiBCQVNFIGFuZCBpcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHBhY2thZ2Uvc2NoZW1hLgotICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZXJlIHdpbGwgbm90IGJlIGFueSBhbm5vdGF0aW9ucyBvbiB0aGUgV2ViU2VydmljZSB0aGF0IHJlZmVyZW5jZSBERVJJVkVELgotICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gZmluZCB0aGUgcGFja2FnZSBmb3IgREVSSVZFRCBpcyB0byB3YWxrIHRoZSBzY2hlbWFzLgotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGNvbnRleHRQYWNrYWdlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIC8vIERvbid0IGNvbnNpZGVyIGphdmEgYW5kIGphdmF4IHBhY2thZ2VzCi0gICAgICAgICAgICAvLyBSRVZJRVc6IFdlIG1pZ2h0IGhhdmUgdG8gcmVmaW5lIHRoaXMKLSAgICAgICAgICAgIGlmIChwLnN0YXJ0c1dpdGgoImphdmF4LnhtbC53cy53c2FkZHJlc3NpbmciKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHAuc3RhcnRzV2l0aCgiamF2YS4iKSB8fAotICAgICAgICAgICAgICAgICAgICBwLnN0YXJ0c1dpdGgoImphdmF4LiIpKSB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY29uc3RydWN0IHRoZSBjb250ZXh0LgotICAgICAgICAvLyAxKSBVU0UgQSBDT05URVhUUEFUSCwgd2hpY2ggaXMgYSBzdHJpbmcgY29udGFpbmluZwotICAgICAgICAvLyAgICBhbGwgb2YgdGhlIHBhY2thZ2VzIHNlcGFyYXRlZCBieSBjb2xvbnMuCi0gICAgICAgIC8vIDIpIFVTRSBBIENMQVNTW10sIHdoaWNoIGlzIGFuIGFycmF5IG9mIGFsbCBvZiB0aGUgY2xhc3NlcwotICAgICAgICAvLyAgICBpbnZvbHZlZCBpbiB0aGUgbWFyc2hhbC91bm1hcnNoYWwuCi0gICAgICAgIC8vICAgCi0gICAgICAgIC8vIFRoZXJlIGFyZSBwcm9zL2NvbnMgd2l0aCBib3RoIGFwcHJvYWNoZXMuCi0gICAgICAgIC8vIFVTRSBBIENPTlRFWFRQQVRIOiAKLSAgICAgICAgLy8gICAgUHJvczogcHJlZmVycmVkIHdheSBvZiBkb2luZyB0aGlzLiAgCi0gICAgICAgIC8vICAgICAgICAgIHBlcmZvcm1hbnQKLSAgICAgICAgLy8gICAgICAgICAgbW9zdCBkeW5hbWljCi0gICAgICAgIC8vICAgIENvbnM6IEVhY2ggcGFja2FnZSBpbiBjb250ZXh0IHBhdGggbXVzdCBoYXZlIGFuIE9iamVjdEZhY3RvcnkKLSAgICAgICAgLy8gICAgICAgIAotICAgICAgICAvLwotICAgICAgICAvLyBVU0UgQ0xBU1NbXToKLSAgICAgICAgLy8gICAgUHJvczogRG9lc24ndCByZXF1aXJlIE9iamVjdEZhY3RvcnkgaW4gZWFjaCBwYWNrYWdlCi0gICAgICAgIC8vICAgIENvbnM6IEhhcmQgdG8gc2V0IHVwLCBtdXN0IGFjY291bnQgZm9yIEpBWC1XUyBjbGFzc2VzLCBldGMuCi0gICAgICAgIC8vICAgICAgICAgIERvZXMgbm90IHdvcmsgaWYgYXJyYXlzIG9mIGNsYXNzZXMgYXJlIG5lZWRlZAotICAgICAgICAvLyAgICAgICAgICBzbG93ZXIKLSAgICAgICAgLy8KLSAgICAgICAgLy8gIFRoZSBmb2xsb3dpbmcgY29kZSBhdHRlbXB0cyB0byBidWlsZCBhIGNvbnRleHQgcGF0aC4gIEl0IHRoZW4KLSAgICAgICAgLy8gIGNob29zZSBvbmUgb2YgdGhlIHR3byBjb25zdHJ1Y3Rpb25zIGFib3ZlIChwcmVmZXIgVVNFIEEgQ09OVEVYVF9QQVRIKQotICAgICAgICAvLwotCi0gICAgICAgIC8vIFRoZSBwYWNrYWdlcyBhcmUgZXhhbWluZWQgdG8gc2VlIGlmIHRoZXkgaGF2ZSBPYmplY3RGYWN0b3J5L3BhY2thZ2UtaW5mbyBjbGFzc2VzLgotICAgICAgICAvLyBJbnZhbGlkIHBhY2thZ2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIGxpc3QKLSAgICAgICAgaXQgPSBjb250ZXh0UGFja2FnZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgYm9vbGVhbiBjb250ZXh0Q29uc3RydWN0aW9uID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBpc0pBWEJGb3VuZCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIC8vIFNlZSBpZiB0aGlzIHBhY2thZ2UgaGFzIGFuIE9iamVjdEZhY3Rvcnkgb3IgcGFja2FnZS1pbmZvCi0gICAgICAgICAgICBpZiAoY2hlY2tQYWNrYWdlKHAsIGNsKSkgewotICAgICAgICAgICAgICAgIC8vIEZsb3cgdG8gaGVyZSBpbmRpY2F0ZXMgcGFja2FnZSBjYW4gYmUgdXNlZCBmb3IgQ09OVEVYVCBjb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICBpc0pBWEJGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSAiICsgcCArICIgY29udGFpbnMgYW4gT2JqZWN0RmFjdG9yeSBvciBwYWNrYWdlLWluZm8gY2xhc3MuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBGbG93IHRvIGhlcmUgaW5kaWNhdGVzIHRoYXQgdGhlIHBhY2thZ2UgaXMgbm90IHZhbGlkIGZvciBjb250ZXh0IGNvbnN0cnVjdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBQZXJoYXBzIHRoZSBwYWNrYWdlIGlzIGludmFsaWQuCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSAiICsgcCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBjb250YWluIGFuIE9iamVjdEZhY3Rvcnkgb3IgcGFja2FnZS1pbmZvIGNsYXNzLiAgU2VhcmNoaW5nIGZvciBKQVhCIGNsYXNzZXMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gY2xhc3NlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY2xhc3NlcyA9IGdldEFsbENsYXNzZXNGcm9tUGFja2FnZShwLCBjbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCB8fCBjbGFzc2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlICIgKyBwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBoYXZlIGFueSBKQVhCIGNsYXNzZXMuICBJdCBpcyByZW1vdmVkIGZyb20gdGhlIEpBWEIgY29udGV4dCBwYXRoLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENsYXNzZXMgYXJlIGZvdW5kIGluIHRoZSBwYWNrYWdlLiAgV2UgY2Fubm90IHVzZSB0aGUgQ09OVEVYVCBjb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dENvbnN0cnVjdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSAiICsgcCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgY29udGFpbiBPYmplY3RGYWN0b3J5LCBidXQgaXQgZG9lcyBjb250YWluIG90aGVyIEpBWEIgY2xhc3Nlcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNKQVhCRm91bmQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQm90aCBPYmplY3RGYWN0b3J5ICYgcGFja2FnZS1pbmZvIG5vdCBmb3VuZCBpbiBwYWNrYWdlIGhpZXJhY2h5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgY29kZSBhYm92ZSBtYXkgaGF2ZSByZW1vdmVkIHNvbWUgcGFja2FnZXMgZnJvbSB0aGUgbGlzdC4gCi0gICAgICAgIC8vIFJldHJ5IG91ciBsb29rdXAgd2l0aCB0aGUgdXBkYXRlZCBsaXN0Ci0gICAgICAgIFN0cmluZyBrZXkgPSBjb250ZXh0UGFja2FnZXMudG9TdHJpbmcoKTsKLSAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8Q2xhc3NMb2FkZXIsIEpBWEJDb250ZXh0VmFsdWU+IGlubmVyTWFwID0gbnVsbDsKLSAgICAgICAgU29mdFJlZmVyZW5jZTxDb25jdXJyZW50SGFzaE1hcDxDbGFzc0xvYWRlciwgSkFYQkNvbnRleHRWYWx1ZT4+IHNvZnRSZWYgPSBqYXhiTWFwLmdldChrZXkpOwotICAgICAgICBpZiAoc29mdFJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbm5lck1hcCA9IHNvZnRSZWYuZ2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChpbm5lck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBpbm5lck1hcC5nZXQoY2wpOwotICAgICAgICAgICAgaWYgKGNvbnRleHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IGZvdW5kIEpBWEJDb250ZXh0IHdpdGggdXBkYXRlZCBjb250ZXh0IGxpc3Q6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFZhbHVlLmpheGJDb250ZXh0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dFZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ09OVEVYVCBjb25zdHJ1Y3Rpb24KLSAgICAgICAgaWYgKGNvbnRleHRDb25zdHJ1Y3Rpb24pIHsKLSAgICAgICAgICAgIEpBWEJDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVKQVhCQ29udGV4dFVzaW5nQ29udGV4dFBhdGgoY29udGV4dFBhY2thZ2VzLCBjbCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dFZhbHVlID0gbmV3IEpBWEJDb250ZXh0VmFsdWUoY29udGV4dCwgQ09OU1RSVUNUSU9OX1RZUEUuQllfQ09OVEVYVF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENMQVNTIGNvbnN0cnVjdGlvbgotICAgICAgICBpZiAoY29udGV4dFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGl0ID0gY29udGV4dFBhY2thZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBMaXN0PENsYXNzPiBmdWxsTGlzdCA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBmdWxsTGlzdC5hZGRBbGwoZ2V0QWxsQ2xhc3Nlc0Zyb21QYWNrYWdlKHBrZywgY2wpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vTGV0cyBhZGQgYWxsIGNvbW1vbiBhcnJheSBjbGFzc2VzCi0gICAgICAgICAgICBhZGRDb21tb25BcnJheUNsYXNzZXMoZnVsbExpc3QpOwotICAgICAgICAgICAgQ2xhc3NbXSBjbGFzc0FycmF5ID0gZnVsbExpc3QudG9BcnJheShuZXcgQ2xhc3NbMF0pOwotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0X25ld0luc3RhbmNlKGNsYXNzQXJyYXksIGNsLCBwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0VmFsdWUgPSBuZXcgSkFYQkNvbnRleHRWYWx1ZShjb250ZXh0LCBDT05TVFJVQ1RJT05fVFlQRS5CWV9DTEFTU19BUlJBWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN1Y2Nlc3NmdWxseSBjcmVhdGVkIEpBWEJDb250ZXh0ICIgKyBjb250ZXh0VmFsdWUuamF4YkNvbnRleHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHVubWFyc2hhbGxlci4gIFlvdSBtdXN0IGNhbGwgcmVsZWFzZVVubWFyc2hhbGxlciB0byBwdXQgaXQgYmFjayBpbnRvIHRoZSBwb29sCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBKQVhCQ29udGV4dAotICAgICAqIEByZXR1cm4gVW5tYXJzaGFsbGVyCi0gICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBVbm1hcnNoYWxsZXIgZ2V0SkFYQlVubWFyc2hhbGxlcihKQVhCQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghRU5BQkxFX1VOTUFSU0hBTExfUE9PTElORykgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbm1hcnNoYWxsZXIgY3JlYXRlZCBbbm8gcG9vbGluZ10iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbENyZWF0ZVVubWFyc2hhbGxlcihjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBVbm1hcnNoYWxsZXIgdW5tID0gdXBvb2wuZ2V0KGNvbnRleHQpOwotICAgICAgICBpZiAodW5tID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5tYXJzaGFsbGVyIGNyZWF0ZWQgW25vdCBpbiBwb29sXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5tID0gaW50ZXJuYWxDcmVhdGVVbm1hcnNoYWxsZXIoY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVubWFyc2hhbGxlciBvYnRhaW5lZCBbZnJvbSAgcG9vbF0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdW5tOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFVubWFyc2hhbGxlciBpbnRlcm5hbENyZWF0ZVVubWFyc2hhbGxlcihmaW5hbCBKQVhCQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIFVubWFyc2hhbGxlciB1bm07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1bm0gPSAoVW5tYXJzaGFsbGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoSkFYQkV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1bm07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFyc2hhbGxlciBpbnRlcm5hbENyZWF0ZU1hcnNoYWxsZXIoZmluYWwgSkFYQkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICBNYXJzaGFsbGVyIG1hcnNoYWxsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXJzaGFsbGVyID0gKE1hcnNoYWxsZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoSkFYQkV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXJzaGFsbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgVW5tYXJzaGFsbGVyIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB1c2luZyB0aGUKLSAgICAgKiBVbm1hcnNoYWxsZXIuIFdlIG9iamVjdCBteSBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgICAgICBKQVhCQ29udGV4dAotICAgICAqIEBwYXJhbSB1bm1hcnNoYWxsZXIgVW5tYXJzaGFsbGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VKQVhCVW5tYXJzaGFsbGVyKEpBWEJDb250ZXh0IGNvbnRleHQsIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlVubWFyc2hhbGxlciBwbGFjZWQgYmFjayBpbnRvIHBvb2wiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX1VOTUFSU0hBTExfUE9PTElORykgewotICAgICAgICAJdW5tYXJzaGFsbGVyLnNldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIobnVsbCk7Ci0gICAgICAgICAgICB1cG9vbC5wdXQoY29udGV4dCwgdW5tYXJzaGFsbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBKQVhCTWFyc2hhbGxlcgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgSkFYQkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIE1hcnNoYWxsZXIKLSAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcnNoYWxsZXIgZ2V0SkFYQk1hcnNoYWxsZXIoSkFYQkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICBNYXJzaGFsbGVyIG0gPSBudWxsOwotICAgICAgICBpZiAoIUVOQUJMRV9NQVJTSEFMTF9QT09MSU5HKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hcnNoYWxsZXIgY3JlYXRlZCBbbm8gcG9vbGluZ10iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG0gPSBpbnRlcm5hbENyZWF0ZU1hcnNoYWxsZXIoY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtID0gbXBvb2wuZ2V0KGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hcnNoYWxsZXIgY3JlYXRlZCBbbm90IGluIHBvb2xdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG0gPSBpbnRlcm5hbENyZWF0ZU1hcnNoYWxsZXIoY29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1hcnNoYWxsZXIgb2J0YWluZWQgW2Zyb20gIHBvb2xdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG0uc2V0UHJvcGVydHkoTWFyc2hhbGxlci5KQVhCX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUpOyAvLyBObyBQSXMKLSAgICAgICAgcmV0dXJuIG07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVsZWFzZUpBWEJNYXJzaGFsbGxlciBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdXNpbmcgdGhlCi0gICAgICogTWFyc2hhbGxlci4gV2Ugb2JqZWN0IG15IGJlIGluIGFuIGludmFsaWQgc3RhdGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICBKQVhCQ29udGV4dAotICAgICAqIEBwYXJhbSBtYXJzaGFsbGVyIE1hcnNoYWxsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZUpBWEJNYXJzaGFsbGVyKEpBWEJDb250ZXh0IGNvbnRleHQsIE1hcnNoYWxsZXIgbWFyc2hhbGxlcikgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFyc2hhbGxlciBwbGFjZWQgYmFjayBpbnRvIHBvb2wiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX01BUlNIQUxMX1BPT0xJTkcpIHsKLSAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0QXR0YWNobWVudE1hcnNoYWxsZXIobnVsbCk7Ci0gICAgICAgICAgICBtcG9vbC5wdXQoY29udGV4dCwgbWFyc2hhbGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgSkFYQiBJbnRyb3NwZWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEpBWEJDb250ZXh0Ci0gICAgICogQHJldHVybiBKQVhCSW50cm9zcGVjdG9yCi0gICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKQVhCSW50cm9zcGVjdG9yIGdldEpBWEJJbnRyb3NwZWN0b3IoZmluYWwgSkFYQkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICBKQVhCSW50cm9zcGVjdG9yIGkgPSBudWxsOwotICAgICAgICBpZiAoIUVOQUJMRV9JTlRST1NQRUNUSU9OX1BPT0xJTkcpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkludHJvc3BlY3RvciBjcmVhdGVkIFtubyBwb29saW5nXSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaSA9IGludGVybmFsQ3JlYXRlSW50cm9zcGVjdG9yKGNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaSA9IGlwb29sLmdldChjb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCSW50cm9zcGVjdG9yIGNyZWF0ZWQgW25vdCBpbiBwb29sXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpID0gaW50ZXJuYWxDcmVhdGVJbnRyb3NwZWN0b3IoY29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJJbnRyb3NwZWN0b3Igb2J0YWluZWQgW2Zyb20gIHBvb2xdIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEpBWEJJbnRyb3NwZWN0b3IgaW50ZXJuYWxDcmVhdGVJbnRyb3NwZWN0b3IoZmluYWwgSkFYQkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBKQVhCSW50cm9zcGVjdG9yIGk7Ci0gICAgICAgIGkgPSAoSkFYQkludHJvc3BlY3RvcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY3JlYXRlSkFYQkludHJvc3BlY3RvcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIEpBWEJJbnRyb3NwZWN0b3IgRG8gbm90IGNhbGwgdGhpcyBtZXRob2QgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHVzaW5nIHRoZQotICAgICAqIEpBWEJJbnRyb3NwZWN0b3IuIFdlIG9iamVjdCBteSBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgICAgICBKQVhCQ29udGV4dAotICAgICAqIEBwYXJhbSBpbnRyb3NwZWN0b3IgSkFYQkludHJvc3BlY3RvcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlSkFYQkludHJvc3BlY3RvcihKQVhCQ29udGV4dCBjb250ZXh0LCBKQVhCSW50cm9zcGVjdG9yIGludHJvc3BlY3RvcikgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkludHJvc3BlY3RvciBwbGFjZWQgYmFjayBpbnRvIHBvb2wiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRU5BQkxFX0lOVFJPU1BFQ1RJT05fUE9PTElORykgewotICAgICAgICAgICAgaXBvb2wucHV0KGNvbnRleHQsIGludHJvc3BlY3Rvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcCAgUGFja2FnZQotICAgICAqIEBwYXJhbSBjbAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlYWNoIHBhY2thZ2UgaGFzIGEgT2JqZWN0RmFjdG9yeSBjbGFzcyBvciBwYWNrYWdlLWluZm8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrUGFja2FnZShTdHJpbmcgcCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQotICAgICAgICAvLyBFYWNoIHBhY2thZ2UgbXVzdCBoYXZlIGFuIE9iamVjdEZhY3RvcnkKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNoZWNraW5nIHBhY2thZ2UgOiIgKyBwKTsKLQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjbHMgPSBmb3JOYW1lKHAgKyAiLk9iamVjdEZhY3RvcnkiLCBmYWxzZSwgY2wpOwotICAgICAgICAgICAgaWYgKGNscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uLiBTbyB3ZSB3aWxsIGFic29yYiBhbnkgVGhyb3dhYmxlIGV4Y2VwdGlvbiBoZXJlLgotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJPYmplY3RGYWN0b3J5IENsYXNzIE5vdCBGb3VuZCAiICsgZSk7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCIuLi5jYXVzZWQgYnkgIiArIGUuZ2V0Q2F1c2UoKSArICIgIiArIEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjbHMgPSBmb3JOYW1lKHAgKyAiLnBhY2thZ2UtaW5mbyIsIGZhbHNlLCBjbCk7Ci0gICAgICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24uIFNvIHdlIHdpbGwgYWJzb3JiIGFueSBUaHJvd2FibGUgZXhjZXB0aW9uIGhlcmUuCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInBhY2thZ2UtaW5mbyBDbGFzcyBOb3QgRm91bmQgIiArIGUpOwotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiLi4uY2F1c2VkIGJ5ICIgKyBlLmdldENhdXNlKCkgKyAiICIgKyBKYXZhVXRpbHMuc3RhY2tUb1N0cmluZyhlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkNvbnRleHQgdXNpbmcgdGhlIGNvbnRleHRwYXRoIGFwcHJvYWNoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFja2FnZXMKLSAgICAgKiBAcGFyYW0gY2wgICAgICAgQ2xhc3NMb2FkZXIKLSAgICAgKiBAcmV0dXJuIEpBWEJDb250ZXh0IG9yIG51bGwgaWYgdW5zdWNjZXNzZnVsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHQgY3JlYXRlSkFYQkNvbnRleHRVc2luZ0NvbnRleHRQYXRoKFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wpIHsKLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjb250ZXh0cGF0aCA9ICIiOwotCi0gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2xhc3NlcyBhbmQgYnVpbGQgdGhlIGNvbnRleHRwYXRoCi0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBwYWNrYWdlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0cGF0aC5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dHBhdGggKz0gIjoiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dHBhdGggKz0gcDsKLQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gY3JlYXRlIEpBWEJDb250ZXh0IHdpdGggY29udGV4dFBhdGg9IiArIGNvbnRleHRwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRleHQgPSBKQVhCQ29udGV4dF9uZXdJbnN0YW5jZShjb250ZXh0cGF0aCwgY2wpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFN1Y2Nlc3NmdWxseSBjcmVhdGVkIEpBWEJDb250ZXh0OiIgKyBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICIgIFVuc3VjY2Vzc2Z1bDogV2Ugd2lsbCBub3cgdXNlIGFuIGFsdGVyYXRpdmUgSkFYQkNvbnN0cnVjdCBjb25zdHJ1Y3Rpb24iKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgUmVhc29uICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFsbCB0aGUgQ2xhc3MgbmFtZXMgbmVlZGVkIHRvIGNvbnN0cnVjdCBhIEpBWEJDb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGtnICAgICAgICAgUGFja2FnZQotICAgICAqIEBwYXJhbSBDbGFzc0xvYWRlciBjbAotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgZXJyb3Igb2NjdXJzIGdldHRpbmcgcGFja2FnZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q2xhc3M+IGdldEFsbENsYXNzZXNGcm9tUGFja2FnZShTdHJpbmcgcGtnLCBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBpZiAocGtnID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PENsYXNzPigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHNwZWNpYWwgcGFja2FnZSB0aGF0IGhhcyBhIHNldCBvZiBrbm93biBjbGFzc2VzLgotICAgICAgICBMaXN0PENsYXNzPiBrbm93bkNsYXNzZXMgPSBzcGVjaWFsTWFwLmdldChwa2cpOwotICAgICAgICBpZiAoa25vd25DbGFzc2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBrbm93bkNsYXNzZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgYmVzdCBlZmZvcnQgbWV0aG9kLiAgV2Ugc2hvdWxkIGFsd2F5cyByZXR1cm4gYW4gb2JqZWN0LgotICAgICAgICAqLwotCi0gICAgICAgIEFycmF5TGlzdDxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBsb2FkIGNsYXNzZXMgZnJvbSBkaXJlY3RvcnkKLSAgICAgICAgICAgIExpc3Q8Q2xhc3M+IGNsYXNzZXNGcm9tRGlyID0gZ2V0Q2xhc3Nlc0Zyb21EaXJlY3RvcnkocGtnLCBjbCk7Ci0gICAgICAgICAgICBjaGVja0NsYXNzZXMoY2xhc3Nlc0Zyb21EaXIsIHBrZyk7Ci0gICAgICAgICAgICBjbGFzc2VzLmFkZEFsbChjbGFzc2VzRnJvbURpcik7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRDbGFzc2VzRnJvbURpcmVjdG9yeSBmYWlsZWQgdG8gZ2V0IENsYXNzZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9JZiBDbGFzZXMgbm90IGZvdW5kIGluIGRpcmVjdG9yeSB0aGVuIGxvb2sgZm9yIGphciB0aGF0IGhhcyB0aGVzZSBjbGFzc2VzCi0gICAgICAgICAgICBpZiAoY2xhc3Nlcy5zaXplKCkgPD0gMCkgewotICAgICAgICAgICAgICAgIC8vVGhpcyB3aWxsIGxvYWQgY2xhc3NlcyBmcm9tIGphciBmaWxlLgotICAgICAgICAgICAgICAgIENsYXNzRmluZGVyRmFjdG9yeSBjZmYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzRmluZGVyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShDbGFzc0ZpbmRlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIENsYXNzRmluZGVyIGNmID0gY2ZmLmdldENsYXNzRmluZGVyKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdDxDbGFzcz4gY2xhc3Nlc0Zyb21KYXIgPSBjZi5nZXRDbGFzc2VzRnJvbUphckZpbGUocGtnLCBjbCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY2hlY2tDbGFzc2VzKGNsYXNzZXNGcm9tSmFyLCBwa2cpOwotICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkQWxsKGNsYXNzZXNGcm9tSmFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImdldENsYXNzZXNGcm9tSmFyRmlsZSBmYWlsZWQgdG8gZ2V0IENsYXNzZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbGFzc2VzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbGlzdAotICAgICAqIEBwYXJhbSBwa2cKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2xhc3NlcyhMaXN0PENsYXNzPiBsaXN0LCBTdHJpbmcgcGtnKSB7Ci0gICAgICAgIC8vIFRoZSBpbnN0YWxsZWQgY2xhc3NmaW5kZXIgb3IgZGlyZWN0b3J5IHNlYXJjaCBtYXkgaW5hZHZlcnRlbnRseSBhZGQgdG9vIG1hbnkgCi0gICAgICAgIC8vIGNsYXNzZXMuICBUaGlzIHJvdW50aW5lIGlzIGEgJ2RvdWJsZSBjaGVjaycgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNsYXNzZXMKLSAgICAgICAgLy8gYXJlIGFjY2VwdGFibGUuCi0gICAgICAgIGZvciAoaW50IGk9MDsgaTxsaXN0LnNpemUoKTspIHsKLSAgICAgICAgICAgIENsYXNzIGNscyA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKCFjbHMuaXNJbnRlcmZhY2UoKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgKGNscy5pc0VudW0oKSB8fAotICAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihjbHMsIFhtbFR5cGUuY2xhc3MpICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuZ2V0RGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yKGNscykgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAgICAhQ2xhc3NVdGlscy5pc0pBWFdTQ2xhc3MoY2xzKSAmJgotICAgICAgICAgICAgICAgIGNscy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmVxdWFscyhwa2cpKSB7Ci0gICAgICAgICAgICAgICAgaSsrOyAvLyBBY2NlcHRhYmxlIGNsYXNzCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIGNsYXNzICIgKyBjbHMgKyAiIGZyb20gY29uc2lkZXJhdGlvbiBiZWNhdXNlIGl0IGlzIG5vdCBpbiBwYWNrYWdlICIgKyBwa2cgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvciBpcyBhbiBpbnRlcmZhY2Ugb3IgZG9lcyBub3QgaGF2ZSBhIHB1YmxpYyBjb25zdHJ1Y3RvciBvciBpcyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhIGpheHdzIGNsYXNzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PENsYXNzPiBnZXRDbGFzc2VzRnJvbURpcmVjdG9yeShTdHJpbmcgcGtnLCBDbGFzc0xvYWRlciBjbCkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhpcyB3aWxsIGhvbGQgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIG1hdGNoaW5nIHRoZSBwY2tnbmFtZS4gVGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgaWYgYSBwYWNrYWdlIGlzIHNwbGl0IG92ZXIgbXVsdGlwbGUgamFycy9wYXRocwotICAgICAgICBTdHJpbmcgcGNrZ25hbWUgPSBwa2c7Ci0gICAgICAgIEFycmF5TGlzdDxGaWxlPiBkaXJlY3RvcmllcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcGNrZ25hbWUucmVwbGFjZSgnLicsICcvJyk7Ci0gICAgICAgICAgICAvLyBBc2sgZm9yIGFsbCByZXNvdXJjZXMgZm9yIHRoZSBwYXRoCi0gICAgICAgICAgICBFbnVtZXJhdGlvbjxVUkw+IHJlc291cmNlcyA9IGNsLmdldFJlc291cmNlcyhwYXRoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZXNvdXJjZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5hZGQobmV3IEZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkxEZWNvZGVyLmRlY29kZShyZXNvdXJjZXMubmV4dEVsZW1lbnQoKS5nZXRQYXRoKCksICJVVEYtOCIpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgcGNrZ25hbWUgKyAiIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIHBhY2thZ2UgKFVuc3VwcG9ydGVkIGVuY29kaW5nKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQ2xhc3NVdGlsc0VycjIiLCBwY2tnbmFtZSkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2FzIHRocm93biB3aGVuIHRyeWluZyB0byBnZXQgYWxsIHJlc291cmNlcyBmb3IgIiArIHBja2duYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkNsYXNzVXRpbHNFcnIzIiwgcGNrZ25hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0gICAgICAgIC8vIEZvciBldmVyeSBkaXJlY3RvcnkgaWRlbnRpZmllZCBjYXB0dXJlIGFsbCB0aGUgLmNsYXNzIGZpbGVzCi0gICAgICAgIGZvciAoRmlsZSBkaXJlY3RvcnkgOiBkaXJlY3RvcmllcykgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIEFkZGluZyBKQVhCIGNsYXNzZXMgZnJvbSBkaXJlY3Rvcnk6ICIgKyBkaXJlY3RvcnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkaXJlY3RvcnkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2FnZQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiAuY2xhc3MgZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZSAuY2xhc3MgZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIEphdmEyIFNlYwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHBja2duYW1lICsgJy4nICsgZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGgoKSAtIDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGZvck5hbWUoY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFkZCBhbnkgaW50ZXJmYWNlcyBvciBKQVhXUyBzcGVjaWZpYyBjbGFzc2VzLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGRhdGEgYW5kIGNhbiBiZSBtYXJzaGFsbGVkIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEpBWEIgc2hvdWxkIGJlIGFkZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xhenouaXNJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNsYXp6LmlzRW51bSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihjbGF6eiwgWG1sVHlwZS5jbGFzcykgIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzVXRpbHMuZ2V0RGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yKGNsYXp6KSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIUNsYXNzVXRpbHMuaXNKQVhXU0NsYXNzKGNsYXp6KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWphdmEubGFuZy5FeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgdGhlIHJlZmVyZW5jZWQgY2xhc3NlcyBhcmUgbG9hZGFibGUgdG9vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgY2xhc3M6ICIgKyBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbGF6eik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUkVWSUVXOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdXBwb3J0IG9mIFJQQyBsaXN0IChhbmQgcG9zc2libHkgb3RoZXIgc2NlbmFyaW9zKSByZXF1aXJlcyB0aGF0IHRoZSBhcnJheSBjbGFzc2VzIHNob3VsZCBhbHNvIGJlIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHVudGlsIHdlIGNhbiBkZXRlcm1pbmUgaG93IHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhcnJheU5hbWUgYW5kIGxvYWRhYmxlIG5hbWUgYXJlIGRpZmZlcmVudC4gIEdldCB0aGUgbG9hZGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSwgbG9hZCB0aGUgYXJyYXkgY2xhc3MsIGFuZCBhZGQgaXQgdG8gb3VyIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGFzc05hbWUgKz0gIltdIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9TdHJpbmcgbG9hZGFibGVOYW1lID0gQ2xhc3NVdGlscy5nZXRMb2FkYWJsZUNsYXNzTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2xhc3MgYUNsYXp6ID0gQ2xhc3MuZm9yTmFtZShsb2FkYWJsZU5hbWUsIGZhbHNlLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJpZWQgdG8gbG9hZCBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoaWxlIGNvbnN0cnVjdGluZyBhIEpBWEJDb250ZXh0LiAgVGhpcyBjbGFzcyB3aWxsIGJlIHNraXBwZWQuICBQcm9jZXNzaW5nIENvbnRpbnVlcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSByZWFzb24gdGhhdCBjbGFzcyBjb3VsZCBub3QgYmUgbG9hZGVkOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuc3RhY2tUb1N0cmluZyhlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjbGFzc2VzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGNvbW1vbkFycmF5Q2xhc3NlcyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAvLyBwcmltaXRpdmVzCi0gICAgICAgICAgICAiYm9vbGVhbltdIiwKLSAgICAgICAgICAgICJieXRlW10iLAotICAgICAgICAgICAgImNoYXJbXSIsCi0gICAgICAgICAgICAiZG91YmxlW10iLAotICAgICAgICAgICAgImZsb2F0W10iLAotICAgICAgICAgICAgImludFtdIiwKLSAgICAgICAgICAgICJsb25nW10iLAotICAgICAgICAgICAgInNob3J0W10iLAotICAgICAgICAgICAgImphdmEubGFuZy5TdHJpbmdbXSIsCi0gICAgICAgICAgICAvLyBPdGhlcnMKLSAgICAgICAgICAgICJqYXZhLmxhbmcuT2JqZWN0W10iLAotICAgICAgICAgICAgImphdmEuYXd0LkltYWdlW10iLAotICAgICAgICAgICAgImphdmEubWF0aC5CaWdEZWNpbWFsW10iLAotICAgICAgICAgICAgImphdmEubWF0aC5CaWdJbnRlZ2VyW10iLAotICAgICAgICAgICAgImphdmEudXRpbC5DYWxlbmRhcltdIiwKLSAgICAgICAgICAgICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10iIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZENvbW1vbkFycmF5Q2xhc3NlcyhMaXN0PENsYXNzPiBsaXN0KSB7Ci0gICAgICAgIC8vIEFkZCBjb21tb24gcHJpbWl0aXZlcyBhcnJheXMgKG5lY2Vzc2FyeSBmb3IgUlBDIGxpc3QgdHlwZSBzdXBwb3J0KQotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IGdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tb25BcnJheUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjb21tb25BcnJheUNsYXNzZXNbaV07Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIExvYWQgYW5kIGFkZCB0aGUgY2xhc3MKLSAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBmb3JOYW1lKENsYXNzVXRpbHMuZ2V0TG9hZGFibGVDbGFzc05hbWUoY2xhc3NOYW1lKSwgZmFsc2UsIGNsKTsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChjbHMpOwotICAgICAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uCi0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRyaWVkIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGlsZSBjb25zdHJ1Y3RpbmcgYSBKQVhCQ29udGV4dC4gIFRoaXMgY2xhc3Mgd2lsbCBiZSBza2lwcGVkLiAgUHJvY2Vzc2luZyBDb250aW51ZXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBUaGUgcmVhc29uIHRoYXQgY2xhc3MgY291bGQgbm90IGJlIGxvYWRlZDoiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzcy5mb3JOYW1lIGRvZXMgbm90IHN1cHBvcnQgcHJpbWl0aXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBKQVhCQ29udGV4dCBmcm9tIGNvbnRleHQgU3RyaW5nIGFuZCBDbGFzc0xvYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gY2xhc3Nsb2FkZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBKQVhCQ29udGV4dCBKQVhCQ29udGV4dF9uZXdJbnN0YW5jZShmaW5hbCBTdHJpbmcgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgY29udGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkNvbnRleHQgaXMgY29uc3RydWN0ZWQgd2l0aG91dCBhIGNvbnRleHQgU3RyaW5nLiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkNvbnRleHQgaXMgY29uc3RydWN0ZWQgd2l0aCBhIGNvbnRleHQgb2Y6IiArIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGpheGJDb250ZXh0ID0gKEpBWEJDb250ZXh0KUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjb250ZXh0LCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBqYXhiQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgSkFYQkNvbnRleHQgZnJvbSBDbGFzc1tdCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NBcnJheQotICAgICAqIEBwYXJhbSBjbCBDbGFzc0xvYWRlciB0aGF0IGxvYWRlZCB0aGUgY2xhc3NlcwotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0IEpBWEJDb250ZXh0X25ld0luc3RhbmNlKGZpbmFsIENsYXNzW10gY2xhc3NBcnJheSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykKLSAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBudWxsOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgaWYgKGNsYXNzQXJyYXkgPT0gbnVsbCB8fCBjbGFzc0FycmF5Lmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBpcyBjb25zdHJ1Y3RlZCB3aXRoIDAgaW5wdXQgY2xhc3Nlcy4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVhCQ29udGV4dCBpcyBjb25zdHJ1Y3RlZCB3aXRoICIgKyBjbGFzc0FycmF5Lmxlbmd0aCArCi0gICAgICAgICAgICAgICAgIiBpbnB1dCBjbGFzc2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IEpBWEJDb250ZXh0IGZyb20gY2xhc3NlcwotICAgICAgICBqYXhiQ29udGV4dCA9IEpBWEJDb250ZXh0RnJvbUNsYXNzZXMubmV3SW5zdGFuY2UoY2xhc3NBcnJheSwgY2wsIHByb3BlcnRpZXMpOwotCi0gICAgICAgIHJldHVybiBqYXhiQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKiogSG9sZHMgdGhlIEpBWEJDb250ZXh0IGFuZCB0aGUgbWFubmVyIGJ5IHdoaWNoIGl0IHdhcyBjb25zdHJ1Y3RlZCAqLwotICAgIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dFZhbHVlIHsKLQotICAgICAgICBwdWJsaWMgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7Ci0gICAgICAgIHB1YmxpYyBDT05TVFJVQ1RJT05fVFlQRSBjb25zdHJ1Y3Rpb25UeXBlOwotCi0gICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dFZhbHVlKEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBDT05TVFJVQ1RJT05fVFlQRSBjb25zdHJ1Y3Rpb25UeXBlKSB7Ci0gICAgICAgICAgICB0aGlzLmpheGJDb250ZXh0ID0gamF4YkNvbnRleHQ7Ci0gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdGlvblR5cGUgPSBjb25zdHJ1Y3Rpb25UeXBlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBwcml2YXRlIHZvaWQgYWRqdXN0UG9vbFNpemUoTWFwIG1hcCkgewotICAgICAgICBpZiAobWFwLnNpemUoKSA+IE1BWF9MT0FEX0ZBQ1RPUikgewotICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZXJ5IG90aGVyIEVudHJ5IGluIHRoZSBtYXAuCi0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBib29sZWFuIHJlbW92ZUl0ID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChyZW1vdmVJdCkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSXQgPSAhcmVtb3ZlSXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb29sIGEgbGlzdCBvZiBpdGVtcyBmb3IgYSBzcGVjaWZpYyBrZXkKLSAgICAgKgotICAgICAqIEBwYXJhbSA8Sz4gS2V5Ci0gICAgICogQHBhcmFtIDxWPiBQb29sZWQgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9vbDxLLFY+IHsKLSAgICAgICAgcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlPE1hcDxLLExpc3Q8Vj4+PiBzb2Z0TWFwID0gCi0gICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxNYXA8SyxMaXN0PFY+Pj4oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxLLCBMaXN0PFY+PigpKTsKLQotICAgICAgICAvLyBUaGUgbWFwcyBhcmUgZnJlZWQgdXAgd2hlbiBhIExPQUQgRkFDVE9SIGlzIGhpdAotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTUFYX0xJU1RfRkFDVE9SID0gNTA7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGtleQotICAgICAgICAgKiBAcmV0dXJuIHJlbW92ZWQgaXRlbSBmcm9tIHBvb2wgb3IgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBWIGdldChLIGtleSkgewotICAgICAgICAgICAgTGlzdDxWPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoa2V5KTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5zaXplKCk+MCkgewotICAgICAgICAgICAgICAgICAgICBWIHYgPSB2YWx1ZXMucmVtb3ZlKHZhbHVlcy5zaXplKCktMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgaXRlbSBiYWNrIHRvIHBvb2wKLSAgICAgICAgICogQHBhcmFtIGtleQotICAgICAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHB1dChLIGtleSwgViB2YWx1ZSkgewotICAgICAgICAgICAgYWRqdXN0U2l6ZSgpOwotICAgICAgICAgICAgTGlzdDxWPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoa2V5KTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPCBNQVhfTElTVF9GQUNUT1IpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCBvciBjcmVhdGUgYSBsaXN0IG9mIHRoZSB2YWx1ZXMgZm9yIHRoZSBrZXkKLSAgICAgICAgICogQHBhcmFtIGtleQotICAgICAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBMaXN0PFY+IGdldFZhbHVlcyhLIGtleSkgewotICAgICAgICAgICAgTWFwPEssTGlzdDxWPj4gbWFwID0gc29mdE1hcC5nZXQoKTsKLSAgICAgICAgICAgIExpc3Q8Vj4gdmFsdWVzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZih2YWx1ZXMgIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEssIExpc3Q8Vj4+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2Z0TWFwID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNvZnRSZWZlcmVuY2U8TWFwPEssTGlzdDxWPj4+KG1hcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxWPigpOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgdmFsdWVzKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogQWRqdXN0U2l6ZQotICAgICAgICAgKiBXaGVuIHRoZSBudW1iZXIgb2Yga2V5cyBleGNlZWRzIHRoZSBtYXhpbXVtIGxvYWQsIGhhbGYKLSAgICAgICAgICogb2YgdGhlIGVudHJpZXMgYXJlIGRlbGV0ZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBKQVhCQ29udGV4dHMsIFVuTWFyc2hhbGxlcnMsIE1hcnNoYWxsZXJzLCBldGMuIHJlcXVpcmUKLSAgICAgICAgICogYSBsYXJnZSBmb290cHJpbnQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZSgpIHsKLSAgICAgICAgICAgIE1hcDxLLExpc3Q8Vj4+IG1hcCA9IHNvZnRNYXAuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAobWFwICE9IG51bGwgJiYgbWFwLnNpemUoKSA+IE1BWF9MT0FEX0ZBQ1RPUikgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBldmVyeSBvdGhlciBFbnRyeSBpbiB0aGUgbWFwLgotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHJlbW92ZUl0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVJdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSXQgPSAhcmVtb3ZlSXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlUmVtYXBQcm9wZXJ0eSgpIHsKLSAgICAgICAgU3RyaW5nIGV4dGVybmFsID0gImNvbS5zdW4ueG1sLmJpbmQuZGVmYXVsdE5hbWVzcGFjZVJlbWFwIjsKLSAgICAgICAgU3RyaW5nIGludGVybmFsID0gImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuZGVmYXVsdE5hbWVzcGFjZVJlbWFwIjsKLSAgICAgICAgCi0gICAgICAgIEJvb2xlYW4gaXNFeHRlcm5hbCA9IHRlc3RKQVhCUHJvcGVydHkoZXh0ZXJuYWwpOwotICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhpc0V4dGVybmFsKSkgewotICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICBCb29sZWFuIGlzSW50ZXJuYWwgPSB0ZXN0SkFYQlByb3BlcnR5KGludGVybmFsKTsKLSAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoaXNJbnRlcm5hbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbDsKLSAgICAgICAgfQotICAgICAgICAvLyBobW0uLi4gYm90aCBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBzZXQKLSAgICAgICAgcmV0dXJuIGV4dGVybmFsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBCb29sZWFuIHRlc3RKQVhCUHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKSB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgcHJvcHMucHV0KHByb3BOYW1lLCAiaHR0cDovL3Rlc3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShuZXcgQ2xhc3NbXSB7SW50ZWdlci5jbGFzc30sIHByb3BzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBKQVhCRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlsc01vbml0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQlV0aWxzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjM2OTdkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvSkFYQlV0aWxzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGUgbW9uaXRvciBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyB0byBlbnN1cmUNCi0gKiB0aGF0IHRoZSBKQVhCVXRpbHMgY29kZSBpcyB1c2VkIGFuZCBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuDQotICogSW4gbm9ybWFsIHVzYWdlLCBtb25pdG9yaW5nIGlzIG9mZi4NCi0gKiANCi0gKiBDdXJyZW50bHkgdGhlIEpBWEJVdGlsc01vbml0b3Iga2VlcHMgdHJhY2sgb2YgdGhlIHBhY2thZ2VLZXlzDQotICogcGFzc2VkIHRvIGNyZWF0ZUpBWEJDb250ZXh0KCopLiAgRnV0dXJlIGltcHJvdmVtZW50cyBtYXkgbW9uaXRvcg0KLSAqIHRoZSBzaXplIG9mIHRoZSBwb29scywgdGhlIHBvb2wgaGl0cyB2ZXJzdXMgbWlzc2VzLCBldGMuDQotICovDQotcHVibGljIGNsYXNzIEpBWEJVdGlsc01vbml0b3Igew0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJVdGlsc01vbml0b3IuY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1vbml0b3JpbmcgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFN0cmluZz4gcGFja2FnZUtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsgDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZW1pZm9yZSA9ICJKQVhCVXRpbHMiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludGVudGlvbmFsbHkgcHJpdmF0ZS4gIEFsbCBtZXRob2RzIGFyZSBzdGF0aWMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIEpBWEJVdGlsc01vbml0b3IoKSB7DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiB0cnVlIGlmIG1vbml0b3JpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vbml0b3JpbmcoKSB7DQotICAgICAgICByZXR1cm4gbW9uaXRvcmluZzsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0IG1vbml0b3JpbmcNCi0gICAgICogQHBhcmFtIG1vbml0b3JpbmcgYm9vbGVhbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1vbml0b3JpbmcoYm9vbGVhbiBtb25pdG9yaW5nKSB7DQotICAgICAgICBKQVhCVXRpbHNNb25pdG9yLm1vbml0b3JpbmcgPSBtb25pdG9yaW5nOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2xlYXIgdGhlIG51bWJlciBvZiBjcmVhdGVzIGFuZCBmYWlsZWQgY3JlYXRlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKCkgew0KLSAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgcGFja2FnZUtleXMuY2xlYXIoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHJldHVybiBwYWNrYWdlIGtleXMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldFBhY2thZ2VLZXlzKCkgew0KLSAgICAgICAgc3luY2hyb25pemVkKHNlbWlmb3JlKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihwYWNrYWdlS2V5cyk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWRkIFBhY2thZ2VLZXkNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYWNrYWdlS2V5KFN0cmluZyBwYWNrYWdlS2V5KSB7DQotICAgICAgICBpZiAoaXNNb25pdG9yaW5nKCkpIHsNCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoc2VtaWZvcmUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLmNhbGxTdGFja1RvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmICghcGFja2FnZUtleXMuY29udGFpbnMocGFja2FnZUtleSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VLZXlzLmFkZChwYWNrYWdlS2V5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvT01CbG9jay5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9PTUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2I0MDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9PTUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLQotLyoqIE9NQmxvY2sgQmxvY2sgcmVwcmVzZW50ZWQgYnkgYW4gT01FbGVtZW50IG9iamVjdCAqLwotcHVibGljIGludGVyZmFjZSBPTUJsb2NrIGV4dGVuZHMgQmxvY2sgewotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1NPQVBFbnZlbG9wZUJsb2NrLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1NPQVBFbnZlbG9wZUJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTFiMTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9TT0FQRW52ZWxvcGVCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci0KLS8qKgotICogU09BUEVudmVsb3BlQmxvY2sgQmxvY2sgcmVwcmVzZW50ZWQgYnkgYW4gU0FBSiBTT0FQRW52ZWxvcGUuIFRoaXMga2luZCBvZiBibG9jayBpcyB1c2VmdWwgZm9yCi0gKiBidWlsZGluZyB0aGUgaW5pdGlhbCBNZXNzYWdlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEVudmVsb3BlQmxvY2sgZXh0ZW5kcyBCbG9jayB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvU291cmNlQmxvY2suamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvU291cmNlQmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwMGI2ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1NvdXJjZUJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLQotLyoqIFNvdXJjZUJsb2NrIEJsb2NrIHdpdGggYSBidXNpbmVzcyBvYmplY3QgdGhhdCBpcyBhIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlICovCi1wdWJsaWMgaW50ZXJmYWNlIFNvdXJjZUJsb2NrIGV4dGVuZHMgQmxvY2sgewotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1hNTFN0cmluZ0Jsb2NrLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL1hNTFN0cmluZ0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmI0M2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9YTUxTdHJpbmdCbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci0KLS8qKiBYTUxTdHJpbmdCbG9jayBCbG9jayB3aXRoIGEgYnVzaW5lc3Mgb2JqZWN0IHRoYXQgaXMgYSBTdHJpbmcgY29udGFpbmluZyB4bWwgdGV4dCAqLwotcHVibGljIGludGVyZmFjZSBYTUxTdHJpbmdCbG9jayBleHRlbmRzIEJsb2NrIHsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0NsYXNzRmluZGVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0NsYXNzRmluZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTE5ZWRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9DbGFzc0ZpbmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuQ2xhc3NGaW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc0ZpbmRlckltcGwgaW1wbGVtZW50cyBDbGFzc0ZpbmRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsYXNzRmluZGVySW1wbC5jbGFzcyk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkNsYXNzRmluZGVyI2dldENsYXNzZXNGcm9tSmFyRmlsZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpCi0gICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3Q8Q2xhc3M+IGdldENsYXNzZXNGcm9tSmFyRmlsZShTdHJpbmcgcGtnLCBDbGFzc0xvYWRlciBjbCkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxDbGFzcz4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7Ci0gICAgICAgICAgICBVUkxDbGFzc0xvYWRlciB1Y2wgPSAoVVJMQ2xhc3NMb2FkZXIpY2w7Ci0gICAgICAgICAgICBVUkxbXSBzcmNVUkwgPSB1Y2wuZ2V0VVJMcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBwa2cucmVwbGFjZSgnLicsICcvJyk7Ci0gICAgICAgICAgICAvL1JlYWQgcmVzb3VyY2VzIGFzIFVSTCBmcm9tIGNsYXNzIGxvYWRlci4KLSAgICAgICAgICAgIGZvciAoVVJMIHVybCA6IHNyY1VSTCkgewotICAgICAgICAgICAgICAgIGlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh1cmwudG9VUkkoKS5nZXRQYXRoKCkpOyAKLSAgICAgICAgICAgICAgICAgICAgLy9JZiBmaWxlIGlzIG5vdCBvZiB0eXBlIGRpcmVjdG9yeSB0aGVuIGl0cyBhIGphciBmaWxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChmLmV4aXN0cygpICYmICFmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamYuZW50cmllcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVhZCBhbGwgZW50cmllcyBpbiBqYXIgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenpOYW1lID0gamUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhenpOYW1lICE9IG51bGwgJiYgY2xhenpOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9BZGQgdG8gY2xhc3MgbGlzdCBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhenpOYW1lID0gY2xhenpOYW1lLnN1YnN0cmluZygwLCBjbGF6ek5hbWUubGVuZ3RoKCkgLSA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXp6TmFtZSA9IGNsYXp6TmFtZS5yZXBsYWNlKCcvJywgJy4nKS5yZXBsYWNlKCdcXCcsICcuJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJzonLCAnLicpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9XZSBhcmUgb25seSBnb2luZyB0byBhZGQgdGhlIGNsYXNzIHRoYXQgYmVsb25nIHRvIHRoZSBwcm92aWRlZCBwYWNrYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXp6TmFtZS5zdGFydHNXaXRoKHBrZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGZvck5hbWUoY2xhenpOYW1lLCBmYWxzZSwgY2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhZGQgYW55IGludGVyZmFjZXMgb3IgSkFYV1Mgc3BlY2lmaWMgY2xhc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGRhdGEgYW5kIGNhbiBiZSBtYXJzaGFsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEpBWEIgc2hvdWxkIGJlIGFkZGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6LmlzSW50ZXJmYWNlKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF6ei5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmVxdWFscyhwa2cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ2xhc3NVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0UHVibGljQ29uc3RydWN0b3IoY2xhenopICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhQ2xhc3NVdGlscy5pc0pBWFdTQ2xhc3MoY2xhenopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBjbGFzczogIiArIGNsYXp6TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbGF6eik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRyaWVkIHRvIGxvYWQgY2xhc3MgIiArIGNsYXp6TmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hpbGUgY29uc3RydWN0aW5nIGEgSkFYQkNvbnRleHQuICBUaGlzIGNsYXNzIHdpbGwgYmUgc2tpcHBlZC4gIFByb2Nlc3NpbmcgQ29udGludWVzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBUaGUgcmVhc29uIHRoYXQgY2xhc3MgY291bGQgbm90IGJlIGxvYWRlZDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJDbGFzc1V0aWxzRXJyNCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjbGFzc2VzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBDbGFzc0xvYWRlciAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9EYXRhU291cmNlQmxvY2tGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0RhdGFTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTkwZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0RhdGFTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU291cmNlQmxvY2tGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5EYXRhU291cmNlQmxvY2tGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ZhY3RvcnlJbXBsOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7DQotDQotLyoqDQotICogU291cmNlQmxvY2tGYWN0b3J5SW1wbA0KLSAqIDxwLz4NCi0gKiBDcmVhdGVzIGEgU291cmNlQmxvY2sNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUJsb2NrRmFjdG9yeUltcGwgZXh0ZW5kcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgRGF0YVNvdXJjZUJsb2NrRmFjdG9yeSB7DQotDQotICAgIC8qKiBEZWZhdWx0IENvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBGYWN0b3J5ICovDQotICAgIHB1YmxpYyBEYXRhU291cmNlQmxvY2tGYWN0b3J5SW1wbCgpIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkNCi0gICAgICAqLw0KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPYmplY3QgYnVzaW5lc3NPYmplY3QsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkNCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VCbG9ja0ltcGwoKERhdGFTb3VyY2UpYnVzaW5lc3NPYmplY3QsIHFOYW1lLCB0aGlzKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkNCi0gICAgICAqLw0KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gbmV3IERhdGFTb3VyY2VCbG9ja0ltcGwob21FbGVtZW50LCBxTmFtZSwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KCkgew0KLSAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICB9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9EYXRhU291cmNlQmxvY2tJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvRGF0YVNvdXJjZUJsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRiZTgyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9EYXRhU291cmNlQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuaW1wbC5CdWZmZXJVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLlNvdXJjZURhdGFTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkRhdGFTb3VyY2VCbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlJlYWRlcjJXcml0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC5tYWlsLnV0aWwuQnl0ZUFycmF5RGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247DQotDQotLyoqDQotICogU291cmNlQmxvY2sNCi0gKiA8cC8+DQotICogQmxvY2sgY29udGFpbmluZyBhIGJ1c2luZXNzIG9iamVjdCB0aGF0IGlzIGEgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlDQotICogPHAvPg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEYXRhU291cmNlQmxvY2tJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgRGF0YVNvdXJjZUJsb2NrIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERhdGFTb3VyY2VCbG9ja0ltcGwuY2xhc3MpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20gZmFjdG9yeQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYnVzT2JqZWN0DQotICAgICAqIEBwYXJhbSBxTmFtZQ0KLSAgICAgKiBAcGFyYW0gZmFjdG9yeQ0KLSAgICAgKi8NCi0gICAgRGF0YVNvdXJjZUJsb2NrSW1wbChEYXRhU291cmNlIGJ1c09iamVjdCwgUU5hbWUgcU5hbWUsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KQ0KLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyKGJ1c09iamVjdCwgbnVsbCwgcU5hbWUsIGZhY3RvcnkpOw0KLSAgICAgICAgLy8gQ2hlY2sgdmFsaWRpdHkgb2YgRGF0YVNvdXJjZQ0KLSAgICAgICAgaWYgKCEoYnVzT2JqZWN0IGluc3RhbmNlb2YgRGF0YVNvdXJjZSkpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU291cmNlTm90U3VwcG9ydGVkIiwgYnVzT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIGZhY3RvcnkNCi0gICAgICoNCi0gICAgICogQHBhcmFtIHJlYWRlcg0KLSAgICAgKiBAcGFyYW0gcU5hbWUNCi0gICAgICogQHBhcmFtIGZhY3RvcnkNCi0gICAgICovDQotICAgIHB1YmxpYyBEYXRhU291cmNlQmxvY2tJbXBsKE9NRWxlbWVudCBvbUVsZW1lbnQsIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgew0KLSAgICAgICAgc3VwZXIob21FbGVtZW50LCBudWxsLCBxTmFtZSwgZmFjdG9yeSk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBidXNDb250ZXh0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKHIydy5nZXRBc1N0cmluZygpLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7DQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gew0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBuZXcgT01OYW1lc3BhY2VJbXBsKCIiLCAiIik7DQotICAgICAgICBPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbCgiZHVtbXkiLCBucywgZmFjdG9yeSwgdGhpcyk7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBidXNDb250ZXh0KQ0KLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICBPYmplY3QgYnVzT2JqZWN0Ow0KLSAgICAgICAgDQotICAgICAgICAvLyBTaG9ydGN1dCB0byBnZXQgYnVzaW5lc3Mgb2JqZWN0IGZyb20gZXhpc3RpbmcgZGF0YSBzb3VyY2UNCi0gICAgICAgIGlmIChvbUVsZW1lbnQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KSB7DQotICAgICAgICAgICAgT01EYXRhU291cmNlIGRzID0gKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBTb3VyY2VEYXRhU291cmNlKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoKFNvdXJjZURhdGFTb3VyY2UpIGRzKS5nZXRPYmplY3QoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQsIHRoZXJlIGFyZSBzb21lIHNwZWNpYWwgZ3ltbmFzdGljcyB0aGF0IHdlIGhhdmUgdG8gZG8NCi0gICAgICAgIC8vIHRvIGdldCB0aGlzIHdvcmtpbmcgZm9yIGFsbCBvZiB0aGUgaGFuZGxlciBzY2VuYXJpb3MuICANCi0gICAgICAgIGJvb2xlYW4gaGFzRmF1bHQgPSBmYWxzZTsNCi0gICAgICAgIGlmICgocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzRmF1bHQoKSkgfHwgDQotICAgICAgICAgICAgb21FbGVtZW50LmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQRkFVTFRfTE9DQUxfTkFNRSkpIHsNCi0gICAgICAgICAgICBoYXNGYXVsdCA9IHRydWU7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFRyYW5zZm9ybSByZWFkZXIgaW50byBidXNpbmVzcyBvYmplY3QNCi0gICAgICAgIGlmICghaGFzRmF1bHQpIHsNCi0gICAgICAgICAgICBidXNPYmplY3QgPSAoKE9NU291cmNlZEVsZW1lbnQpb21FbGVtZW50KS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICB9DQotICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplKGJhb3MpOw0KLSAgICAgICAgICAgIGJ1c09iamVjdCA9IG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04Iik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYnVzT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmIChidXNPYmogaW5zdGFuY2VvZiBEYXRhU291cmNlKSB7DQotICAgICAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeSBmID0gU3RBWFV0aWxzLmdldFhNTElucHV0RmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZi5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoKChEYXRhU291cmNlKWJ1c09iaikuZ2V0SW5wdXRTdHJlYW0oKSk7DQotICAgICAgICAgICAgICAgIFN0QVhVdGlscy5yZWxlYXNlWE1MSW5wdXRGYWN0b3J5KGYpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU291cmNlTm90U3VwcG9ydGVkIiwgYnVzT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoYnVzT2JqID09IG51bGwpID8gIm5vbmUiIDogYnVzT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkNCi0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJTb3VyY2VSZWFkRXJyIiwgY2xhc3NOYW1lKSwgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBCdWZmZXJVdGlscy5pbnB1dFN0cmVhbTJPdXRwdXRTdHJlYW0oKChEYXRhU291cmNlKWJ1c09iamVjdCkuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0cHV0KTsNCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGZhc3Qgd2F5IHRvIG91dHB1dCB0aGUgU291cmNlIHRvIGEgd3JpdGVyLCBzbyBnZXQgdGhlIHJlYWRlcg0KLSAgICAgICAgLy8gYW5kIHBhc3MgdXNlIHRoZSBkZWZhdWx0IHJlYWRlci0+d3JpdGVyLg0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBfb3V0cHV0RnJvbUJPIik7DQotICAgICAgICB9DQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gX2dldFJlYWRlckZyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYnRhaW5lZCByZWFkZXI9IiArIHJlYWRlcik7DQotICAgICAgICB9DQotICAgICAgICBfb3V0cHV0RnJvbVJlYWRlcihyZWFkZXIsIHdyaXRlcik7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBfb3V0cHV0UmVhZGVyRnJvbUJPIik7DQotICAgICAgICB9DQotICAgICAgICAvLyBSRVZJRVcgU2hvdWxkIHdlIGNhbGwgY2xvc2UoKSBvbiB0aGUgU291cmNlID8NCi0gICAgfQ0KLQ0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsIGJvb2xlYW4gY29uc3VtZSkgew0KLSAgICAgICAgaWYgKGNvbnN1bWUpIHsNCi0gICAgICAgICAgICByZXR1cm4gYnVzT2JqZWN0Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBUT0RPIE1pc3NpbmcgSW1wbA0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJTb3VyY2VNaXNzaW5nU3VwcG9ydCIsIGJ1c09iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudERhdGEoKSB7DQotICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBUaGUgc291cmNlIGNvdWxkIGJlIGEgdGV4dCBvciBlbGVtZW50IGV0Yy4NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lDQotICAgICAqIEByZXR1cm4gQ2xhc3MNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcg0KLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICApOw0KLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBjbDsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgew0KLSAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGNsb3NlDQotICAgIH0NCi0NCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFhNTElucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSAoYnl0ZVtdKSANCi0gICAgICAgICAgICAgICAgQ29udmVydFV0aWxzLmNvbnZlcnQoZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpLCBieXRlW10uY2xhc3MpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOw0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICByZXR1cm4gZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpOw0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVSZWFkKCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVdyaXRlKCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgZ2V0WE1MQnl0ZXMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGJ5dGVzID0gKGJ5dGVbXSkgDQotICAgICAgICAgICAgICAgIENvbnZlcnRVdGlscy5jb252ZXJ0KGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKSwgYnl0ZVtdLmNsYXNzKTsNCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIGdldFhNTEJ5dGVzIik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYnl0ZXM7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL0pBWEJCbG9ja0ZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvSkFYQkJsb2NrRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0MjIxMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvSkFYQkJsb2NrRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJEU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5YTUxSb290RWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKiBKQVhCQmxvY2tGYWN0b3J5SW1wbCBDcmVhdGVzIGEgSkFYQkJsb2NrICovCi1wdWJsaWMgY2xhc3MgSkFYQkJsb2NrRmFjdG9yeUltcGwgZXh0ZW5kcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgSkFYQkJsb2NrRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJCbG9ja0ZhY3RvcnlJbXBsLmNsYXNzKTsKLQotICAgIC8qKiBEZWZhdWx0IENvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBGYWN0b3J5ICovCi0gICAgcHVibGljIEpBWEJCbG9ja0ZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBUaGUgY29udGV4dCBmb3IgYSBKQVhCRmFjdG9yeSBtdXN0IGJlIG5vbi1udWxsIGFuZCBzaG91bGQgYmUgYSBKQVhCQmxvY2tDb250ZXh0LgotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBKQVhXUyBzcGVjIDQuMy40IGNvbmZvcm1hbmNlIHJlcXVpcmVzIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB3aG9zZSBjYXVzZSBpcyBKQVhCRXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgSkFYQkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCQmxvY2tGYWN0b3J5RXJyMSIsICJudWxsIikpKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0IGluc3RhbmNlb2YgSkFYQkJsb2NrQ29udGV4dCkgewotICAgICAgICAgICAgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSkFYV1Mgc3BlYyA0LjMuNCBjb25mb3JtYW5jZSByZXF1aXJlcyBhIFdlYlNlcnZpY2VFeGNlcHRpb24gd2hvc2UgY2F1c2UgaXMgSkFYQkV4Y2VwdGlvbgotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihuZXcgSkFYQkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQkJsb2NrRmFjdG9yeUVycjEiLCBjb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChxTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBxTmFtZSA9IG9tRWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAob21FbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoICgoT01Tb3VyY2VkRWxlbWVudCkgb21FbGVtZW50KS5nZXREYXRhU291cmNlKCkgaW5zdGFuY2VvZiBKQVhCRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgICAgIEpBWEJEYXRhU291cmNlIGRzID0gKEpBWEJEYXRhU291cmNlKSAoKE9NU291cmNlZEVsZW1lbnQpb21FbGVtZW50KS5nZXREYXRhU291cmNlKCk7Ci0gICAgICAgICAgICAgICAgSkFYQkRTQ29udGV4dCBkc0NvbnRleHQgPSBkcy5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRzQ29udGV4dC5nZXRKQVhCQ29udGV4dCgpID09ICgoSkFYQkJsb2NrQ29udGV4dCljb250ZXh0KS5nZXRKQVhCQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaG9ydGN1dCwgdXNlIGV4aXN0aW5nIEpBWEIgb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgamF4YiA9IGRzLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKQVhCQmxvY2tJbXBsKGpheGIsIChKQVhCQmxvY2tDb250ZXh0KWNvbnRleHQsIHFOYW1lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRmFsbGluZyBiYWNrIHRvIHVzaW5nIG5vcm1hbCB1bm1hcnNoYWxsaW5nIGFwcHJvYWNoLiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICggKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKSBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpIHsKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tJbXBsIGJsb2NrID0gKEpBWEJCbG9ja0ltcGwpICgoT01Tb3VyY2VkRWxlbWVudClvbUVsZW1lbnQpLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ29udGV4dCA9IChKQVhCQmxvY2tDb250ZXh0KSBibG9jay5nZXRCdXNpbmVzc0NvbnRleHQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tDb250ZXh0LmdldEpBWEJDb250ZXh0KCkgPT0gKChKQVhCQmxvY2tDb250ZXh0KWNvbnRleHQpLmdldEpBWEJDb250ZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3J0Y3V0LCB1c2UgZXhpc3RpbmcgSkFYQiBvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBqYXhiID0gYmxvY2suZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpBWEJCbG9ja0ltcGwoamF4YiwgKEpBWEJCbG9ja0NvbnRleHQpY29udGV4dCwgcU5hbWUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGYWxsaW5nIGJhY2sgdG8gdXNpbmcgbm9ybWFsIHVubWFyc2hhbGxpbmcgYXBwcm9hY2guICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkJsb2NrSW1wbChvbUVsZW1lbnQsIChKQVhCQmxvY2tDb250ZXh0KWNvbnRleHQsIHFOYW1lLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9iamVjdCBidXNpbmVzc09iamVjdCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFRoZSBjb250ZXh0IG11c3QgYmUgbm9uLW51bGwgYW5kIHNob3VsZCBiZSBhIEpBWEJCbG9ja0NvbnRleHQuCi0gICAgICAgIC8vIEZvciBsZWdhY3kgcmVhc29ucywgYSBKQVhCQ29udGV4dCBpcyBhbHNvIHN1cHBvcnRlZCAoYW5kIHdyYXBwZWQgaW50byBhIEpBWEJCbG9ja0NvbnRleHQpCi0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEpBWFdTIHNwZWMgNC4zLjQgY29uZm9ybWFuY2UgcmVxdWlyZXMgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdob3NlIGNhdXNlIGlzIEpBWEJFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBKQVhCRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJCbG9ja0ZhY3RvcnlFcnIxIiwgIm51bGwiKSkpOwotICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBKQVhCQmxvY2tDb250ZXh0KSB7Ci0gICAgICAgICAgICA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBKQVhXUyBzcGVjIDQuMy40IGNvbmZvcm1hbmNlIHJlcXVpcmVzIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB3aG9zZSBjYXVzZSBpcyBKQVhCRXhjZXB0aW9uCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG5ldyBKQVhCRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCQmxvY2tGYWN0b3J5RXJyMSIsIGNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgYnVzaW5lc3Mgb2JqZWN0IG11c3QgYmUgZWl0aGVyIGEgSkFYQkVsZW1lbnQgb3IgYSBibG9jayB3aXRoIGFuIEBYbWxSb290RWxlbWVudCBxbmFtZS4gIAotICAgICAgICAvLyAoQ2hlY2tpbmcgdGhpcyBpcyBleHBlbnNpdmUsIHNvIGl0IGlzIGFzc3VtZWQpCi0gICAgICAgIC8vIFRoZSBpbnB1dCBRTmFtZSBtdXN0IGJlIHNldCBvdGhlcndpc2Ugd2UgaGF2ZSB0byBsb29rIGl0IHVwLCB3aGljaCBraWxscyBwZXJmb3JtYW5jZS4KLSAgICAgICAgaWYgKHFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHFOYW1lID0gWE1MUm9vdEVsZW1lbnRVdGlsLmdldFhtbFJvb3RFbGVtZW50UU5hbWVGcm9tT2JqZWN0KGJ1c2luZXNzT2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEpBWEJCbG9ja0ltcGwoYnVzaW5lc3NPYmplY3QsIChKQVhCQmxvY2tDb250ZXh0KWNvbnRleHQsIHFOYW1lLCB0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9KQVhCQmxvY2tJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvSkFYQkJsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzYyNmE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9KQVhCQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRFNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuWE1MU3RyZWFtV3JpdGVyV2l0aE9TOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLS8qKgotICogSkFYQkJsb2NrSW1wbCA8cC8+IEEgQmxvY2sgY29udGFpbmluZyBhIEpBWEIgYnVzaW5lc3Mgb2JqZWN0IChlaXRoZXIgYSBKQVhCRWxlbWVudCBvciBhbiBvYmplY3QKLSAqIHdpdGggQFhtbFJvb3RFbGVtZW50KS4KLSAqLwotcHVibGljIGNsYXNzIEpBWEJCbG9ja0ltcGwgZXh0ZW5kcyBCbG9ja0ltcGwgaW1wbGVtZW50cyBKQVhCQmxvY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWEJCbG9ja0ltcGwuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FTkFCTEVEID0gbG9nLmlzRGVidWdFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgSkFYQkJsb2NrRmFjdG9yeQotICAgICAqIAotICAgICAqIEBwYXJhbSBidXNPYmplY3QuLlRoZSBidXNpbmVzcyBvYmplY3QgbXVzdCBiZSBhIEpBWEJFbGVtZW50IG9yIGFuIG9iamVjdCB3aXRoIGFuCi0gICAgICogQFhNTFJvb3RFbGVtZW50LiBUaGlzIGlzIGFzc2VydGlvbiBpcyB2YWxpZGF0ZWQgaW4gdGhlIEpBWEJGYWN0b3J5LgotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHBhcmFtIHFOYW1lIFFOYW1lIG11c3QgYmUgbm9uLW51bGwKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIEpBWEJCbG9ja0ltcGwoT2JqZWN0IGJ1c09iamVjdCwgSkFYQkJsb2NrQ29udGV4dCBidXNDb250ZXh0LCBRTmFtZSBxTmFtZSwgCi0gICAgICAgICAgICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYnVzT2JqZWN0LCBidXNDb250ZXh0LCBxTmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IEpBWEJCbG9ja0ZhY3RvcnkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb21lbGVtZW50Ci0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcGFyYW0gcU5hbWUgbXVzdCBiZSBub24tbnVsbAotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgSkFYQkJsb2NrSW1wbChPTUVsZW1lbnQgb21FbGVtZW50LCBKQVhCQmxvY2tDb250ZXh0IGJ1c0NvbnRleHQsIFFOYW1lIHFOYW1lLAotICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIob21FbGVtZW50LCBidXNDb250ZXh0LCBxTmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBKQVhCQmxvY2tDb250ZXh0LiBBbGwgb2YgdGhlIG5lY2Vzc3J5IGluZm9ybWF0aW9uIGlzIHJlY29yZGVkIG9uIGl0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY3R4ID0gKEpBWEJCbG9ja0NvbnRleHQpIGJ1c0NvbnRleHQ7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVzT2JqZWN0ID0gY3R4LnVubWFyc2hhbChyZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGplKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYQkNvbnRleHQgZm9yIHVubWFyc2hhbCBmYWlsdXJlOiIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5nZXRKQVhCQ29udGV4dChjdHguZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihqZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1c09iamVjdDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgLy8gU2hvcnRjdXQgdG8gZ2V0IGJ1c2luZXNzIG9iamVjdCBmcm9tIGV4aXN0aW5nIGRhdGEgc291cmNlCi0gICAgICAgIGlmIChvbUVsZW1lbnQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KSB7Ci0gICAgICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSAoKE9NU291cmNlZEVsZW1lbnQpIG9tRWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGRzIGluc3RhbmNlb2YgSkFYQkRhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGJ1c2luZXNzIGNvbnRleHQgdG8gdXNlIHRoZSBvbmUgcHJvdmlkZWQKLSAgICAgICAgICAgICAgICAvLyBieSB0aGUgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEpBWEJEU0NvbnRleHQgZHNDb250ZXh0ID0gKChKQVhCRGF0YVNvdXJjZSkgZHMpLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnVzQ29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGRzQ29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoSkFYQkRhdGFTb3VyY2UpIGRzKS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBidXNpbmVzcyBjb250ZXh0IHRvIHVzZSB0aGUgb25lIHByb3ZpZGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0NvbnRleHQgPSAoSkFYQkJsb2NrQ29udGV4dCkgKChKQVhCQmxvY2tJbXBsKSBkcykuZ2V0QnVzaW5lc3NDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgYnVzQ29udGV4dCA9IGJsb2NrQ29udGV4dDsKLQotICAgICAgICAgICAgICAgIHJldHVybiAoKEpBWEJCbG9ja0ltcGwpIGRzKS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuX2dldEJPRnJvbU9NKG9tRWxlbWVudCwgYnVzQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGJ1c09iagotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gX2dldEJ5dGVzRnJvbUJPKE9iamVjdCBidXNPYmosIE9iamVjdCBidXNDb250ZXh0LCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAvLyBFeHBvc2VzIGdldE91dHB1dFN0cmVhbSwgd2hpY2ggYWxsb3dzIGZhc3RlciB3cml0ZXMuCi0gICAgICAgIFhNTFN0cmVhbVdyaXRlcldpdGhPUyB3cml0ZXIgPSBuZXcgWE1MU3RyZWFtV3JpdGVyV2l0aE9TKGJhb3MsIGVuY29kaW5nKTsKLQotICAgICAgICAvLyBXcml0ZSB0aGUgYnVzaW5lc3Mgb2JqZWN0IHRvIHRoZSB3cml0ZXIKLSAgICAgICAgX291dHB1dEZyb21CTyhidXNPYmosIGJ1c0NvbnRleHQsIHdyaXRlcik7Ci0KLSAgICAgICAgLy8gRmx1c2ggdGhlIHdyaXRlcgotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYW9zID0KLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oX2dldEJ5dGVzRnJvbUJPKGJ1c09iaiwgYnVzQ29udGV4dCwgInV0Zi04IikpOwotICAgICAgICByZXR1cm4gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihiYW9zLCAidXRmLTgiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBfZ2V0UmVhZGVyRnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQpIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKLSAgICAgICAgaWYgKG9tRWxlbWVudC5nZXRCdWlsZGVyKCkgIT0gbnVsbCAmJiAhb21FbGVtZW50LmdldEJ1aWxkZXIoKS5pc0NvbXBsZXRlZCgpKSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVhZGVyIGluc3RhbmNlb2YgT01YTUxTdHJlYW1SZWFkZXIpIHsKLSAgICAgICAgICAgICgoT01YTUxTdHJlYW1SZWFkZXIpcmVhZGVyKS5zZXRJbmxpbmVNVE9NKGZhbHNlKTsgIC8vIE9wdGltaXplIGF0dGFjaG1lbnQgdXNhZ2UKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIF9vdXRwdXRGcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGN0eCA9IChKQVhCQmxvY2tDb250ZXh0KSBidXNDb250ZXh0OwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGN0eC5tYXJzaGFsKGJ1c09iamVjdCwgd3JpdGVyKTsKLSAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBqZSkgewotICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWEJDb250ZXh0IGZvciBtYXJzaGFsIGZhaWx1cmU6IiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmdldEpBWEJDb250ZXh0KGN0eC5nZXRDbGFzc0xvYWRlcigpKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudERhdGEoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGNsb3NlCi0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFhNTElucHV0U3RyZWFtKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzPSBfZ2V0Qnl0ZXNGcm9tQk8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCdXNpbmVzc09iamVjdChmYWxzZSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdXNpbmVzc09iamVjdChmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9NRGF0YVNvdXJjZUV4dCBjb3B5KCkgdGhyb3dzIE9NRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk1ha2luZyBhIGNvcHkgb2YgdGhlIEpBWEIgb2JqZWN0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRGF0YVNvdXJjZSh0aGlzLmdldE9iamVjdCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSkFYQkRTQ29udGV4dCkgdGhpcy5nZXRCdXNpbmVzc0NvbnRleHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBfZ2V0Qnl0ZXNGcm9tQk8oZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChidXNDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICgoSkFYQkJsb2NrQ29udGV4dCkgYnVzQ29udGV4dCkuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRQYXJlbnQobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9PTUJsb2NrRmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9PTUJsb2NrRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmODI0Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvT01CbG9ja0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk9NQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0vKioKLSAqIE9NQmxvY2tGYWN0b3J5SW1wbAotICogPHAvPgotICogQ3JlYXRlcyBhbiBPTUJsb2NrCi0gKi8KLXB1YmxpYyBjbGFzcyBPTUJsb2NrRmFjdG9yeUltcGwgZXh0ZW5kcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgT01CbG9ja0ZhY3RvcnkgewotCi0gICAgLyoqIERlZmF1bHQgQ29uc3RydWN0b3IgcmVxdWlyZWQgZm9yIEZhY3RvcnkgKi8KLSAgICBwdWJsaWMgT01CbG9ja0ZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IE9NQmxvY2tJbXBsKG9tRWxlbWVudCwgdGhpcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPYmplY3QgYnVzaW5lc3NPYmplY3QsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IE9NQmxvY2tJbXBsKChPTUVsZW1lbnQpYnVzaW5lc3NPYmplY3QsIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvT01CbG9ja0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9PTUJsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWU0OTAzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9PTUJsb2NrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuT01CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0vKiogT01CbG9ja0ltcGwgQmxvY2sgd2l0aCBhIGJ1c2luZXNzIG9iamVjdCB0aGF0IGlzIGFuIE9NRWxlbWVudCAqLwotcHVibGljIGNsYXNzIE9NQmxvY2tJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgT01CbG9jayB7Ci0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBPTUJsb2NrRmFjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIGJ1c09iamVjdAotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgT01CbG9ja0ltcGwoT01FbGVtZW50IGJ1c09iamVjdCwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoYnVzT2JqZWN0LAotICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICBidXNPYmplY3QuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRha2UgYSBzaG9ydGN1dCBhbmQgcmV0dXJuIHRoZSBPTUVsZW1lbnQKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T01FbGVtZW50KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBfZ2V0UmVhZGVyRnJvbUJPKE9iamVjdCBidXNPYmosIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbSA9IChPTUVsZW1lbnQpYnVzT2JqOwotICAgICAgICByZXR1cm4gb20uZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbU9NKE9NRWxlbWVudCBvbSwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gb207Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgX2dldE9NRnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChPTUVsZW1lbnQpIGJ1c09iamVjdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBfb3V0cHV0RnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0LCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbSA9IChPTUVsZW1lbnQpYnVzT2JqZWN0OwotICAgICAgICBvbS5zZXJpYWxpemUod3JpdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnREYXRhKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBjbG9zZQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRYTUxJbnB1dFN0cmVhbShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0WE1MQnl0ZXMoZW5jb2RpbmcpOwotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdXNpbmVzc09iamVjdChmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFhNTEJ5dGVzKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXRDaGFyU2V0RW5jb2RpbmcoZW5jb2RpbmcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VyaWFsaXplKGJhb3MsIGZvcm1hdCk7Ci0gICAgICAgICAgICBiYW9zLmZsdXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9TT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzIyOTk4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9TT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ZhY3RvcnlJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKiBDcmVhdGVzIGEgU09BUEVudmVsb3BlQmxvY2sgKi8KLXB1YmxpYyBjbGFzcyBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsIGV4dGVuZHMgQmxvY2tGYWN0b3J5SW1wbCBpbXBsZW1lbnRzCi0gICAgICAgIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeSB7Ci0KLSAgICAvKiogRGVmYXVsdCBDb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgRmFjdG9yeSAqLwotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU09BUEVudmVsb3BlQmxvY2tJbXBsKG9tRWxlbWVudCwgbnVsbCwgcU5hbWUsIHRoaXMpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPYmplY3QgYnVzaW5lc3NPYmplY3QsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRW52ZWxvcGVCbG9ja0ltcGwoKFNPQVBFbnZlbG9wZSlidXNpbmVzc09iamVjdCwgbnVsbCwgcU5hbWUsIHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU09BUEVudmVsb3BlQmxvY2tJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU09BUEVudmVsb3BlQmxvY2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MDgwMGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1NPQVBFbnZlbG9wZUJsb2NrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuU09BUEVudmVsb3BlQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TT0FQRWxlbWVudFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRW52ZWxvcGVCbG9ja0ltcGwgZXh0ZW5kcyBCbG9ja0ltcGwgaW1wbGVtZW50cyBTT0FQRW52ZWxvcGVCbG9jayB7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVzT2JqZWN0Ci0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGVCbG9ja0ltcGwoT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoYnVzT2JqZWN0LAotICAgICAgICAgICAgICBidXNDb250ZXh0LAotICAgICAgICAgICAgICAocU5hbWUgPT0gbnVsbCkgPyBnZXRRTmFtZSgoU09BUEVudmVsb3BlKWJ1c09iamVjdCkgOiBxTmFtZSwKLSAgICAgICAgICAgICAgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudAotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlQmxvY2tJbXBsKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBidXNDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHN1cGVyKG9tRWxlbWVudCwgYnVzQ29udGV4dCwgcU5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ltcGwjX2dldEJPRnJvbVJlYWRlcihqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbWYuY3JlYXRlRnJvbShyZWFkZXIsIG51bGwpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gbWVzc2FnZS5nZXRBc1NPQVBFbnZlbG9wZSgpOwotICAgICAgICB0aGlzLnNldFFOYW1lKGdldFFOYW1lKGVudikpOwotICAgICAgICByZXR1cm4gZW52OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbC5CbG9ja0ltcGwjX2dldFJlYWRlckZyb21CTyhqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRWxlbWVudFJlYWRlcigoU09BUEVsZW1lbnQpYnVzT2JqKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tJbXBsI19vdXRwdXRGcm9tQk8oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIpCi0gICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIF9vdXRwdXRGcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBfZ2V0UmVhZGVyRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCk7Ci0gICAgICAgIF9vdXRwdXRGcm9tUmVhZGVyKHJlYWRlciwgd3JpdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFFOYW1lIG9mIHRoZSBlbnZlbG9wZQotICAgICAqCi0gICAgICogQHBhcmFtIGVudgotICAgICAqIEByZXR1cm4gUU5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBRTmFtZSBnZXRRTmFtZShTT0FQRW52ZWxvcGUgZW52KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZW52LmdldE5hbWVzcGFjZVVSSSgpLCBlbnYuZ2V0TG9jYWxOYW1lKCksIGVudi5nZXRQcmVmaXgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gY2xvc2UKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0WE1MSW5wdXRTdHJlYW0oU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IGdldFhNTEJ5dGVzKGVuY29kaW5nKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVzdHJ1Y3RpdmVSZWFkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVdyaXRlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRYTUxCeXRlcyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICBmb3JtYXQuc2V0Q2hhclNldEVuY29kaW5nKGVuY29kaW5nKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZShiYW9zLCBmb3JtYXQpOwotICAgICAgICAgICAgYmFvcy5mbHVzaCgpOwotICAgICAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU291cmNlQmxvY2tGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1NvdXJjZUJsb2NrRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkNmYxOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU291cmNlQmxvY2tGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tGYWN0b3J5SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogU291cmNlQmxvY2tGYWN0b3J5SW1wbAotICogPHAvPgotICogQ3JlYXRlcyBhIFNvdXJjZUJsb2NrCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsIGV4dGVuZHMgQmxvY2tGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFNvdXJjZUJsb2NrRmFjdG9yeSB7Ci0KLSAgICAvKiogRGVmYXVsdCBDb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgRmFjdG9yeSAqLwotICAgIHB1YmxpYyBTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oT2JqZWN0IGJ1c2luZXNzT2JqZWN0LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU291cmNlQmxvY2tJbXBsKChTb3VyY2UpYnVzaW5lc3NPYmplY3QsIHFOYW1lLCB0aGlzKTsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFNvdXJjZUJsb2NrSW1wbChvbUVsZW1lbnQsIHFOYW1lLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9Tb3VyY2VCbG9ja0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZGF0YWJpbmRpbmcvaW1wbC9Tb3VyY2VCbG9ja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4OTQyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvU291cmNlQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Tb3VyY2VkRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLlNvdXJjZURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuU291cmNlQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC51dGlsLkpBWEJTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci0KLS8qKgotICogU291cmNlQmxvY2sKLSAqIDxwLz4KLSAqIEJsb2NrIGNvbnRhaW5pbmcgYSBidXNpbmVzcyBvYmplY3QgdGhhdCBpcyBhIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlLgotICogPHAvPgotICogVGhlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIGlzIGFuIGludGVyZmFjZS4gIFRoZSBhY3R1YWwgY29uY3JldGUgY2xhc3MgbWF5IGJlIG9uZSBvZiB0aGUKLSAqIGZvbGxvd2luZzogLSBTdHJlYW1Tb3VyY2UgLSBET01Tb3VyY2UgLSBKQVhCU291cmNlIC0gU0FYU291cmNlIC0gU3RBWFNvdXJjZQotICogPHAvPgotICogRHVyaW5nIHByb2Nlc3Npbmcgb2YgdGhlIGJsb2NrLCB0aGUgYmxvY2sgaXMgZnJlZSB0byBjaGFuZ2UgdGhlIHJlcHJlc2VudGF0aW9uIGZyb20gb25lIHNvdXJjZQotICogdG8gYW5vdGhlci4gIChpLmUuIGlmIHlvdSBpbml0aWFsbHkgc2VlZCB0aGlzIHdpdGggYSBTQVhTb3VyY2UsIGJ1dCBhIGxhdGVyIGFjY2VzcyBtYXkgZ2l2ZSB5b3UKLSAqIGEgU3RBWFNvdXJjZSkuCi0gKiA8cC8+Ci0gKiBBIFNvdXJjZSBpcyBjb25zdW1lZCB3aGVuIHJlYWQuICBUaGUgYmxvY2sgd2lsbCBtYWtlIGEgY29weSBvZiB0aGUgc291cmNlIGlmIGEgbm9uLWNvbnN1bWFibGUKLSAqIHJlcXVlc3QgaXMgbWFkZS4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZUJsb2NrSW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIFNvdXJjZUJsb2NrIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTb3VyY2VCbG9ja0ltcGwuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIHN0YXhTb3VyY2UgPSBudWxsOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIER5bmFtaWNhbGx5IGRpc2NvdmVyIGlmIFN0QVhTb3VyY2UgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBzdGF4U291cmNlID0gZm9yTmFtZSgiamF2YXgueG1sLnRyYW5zZm9ybS5zdGF4LlN0QVhTb3VyY2UiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RBWFNvdXJjZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgSkRLLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFjY2VwdGFibGUuICBQcm9jZXNzaW5nIGNvbnRpbnVlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBXb29kc3RveCBkb2VzIG5vdCB3b3JrIHdpdGggU3RBWFNvdXJjZQotICAgICAgICAgICAgaWYoWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuaW5kZXhPZigid3N0eCIpIT0tMSl7Ci0gICAgICAgICAgICAgICAgc3RheFNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIGZhY3RvcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIFNvdXJjZUJsb2NrSW1wbChTb3VyY2UgYnVzT2JqZWN0LCBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGJ1c09iamVjdCwgbnVsbCwgcU5hbWUsIGZhY3RvcnkpOwotCi0gICAgICAgIC8vIENoZWNrIHZhbGlkaXR5IG9mIFNvdXJjZQotICAgICAgICBpZiAoYnVzT2JqZWN0IGluc3RhbmNlb2YgRE9NU291cmNlIHx8Ci0gICAgICAgICAgICAgICAgYnVzT2JqZWN0IGluc3RhbmNlb2YgU0FYU291cmNlIHx8Ci0gICAgICAgICAgICAgICAgYnVzT2JqZWN0IGluc3RhbmNlb2YgU3RyZWFtU291cmNlIHx8Ci0gICAgICAgICAgICAgICAgKGJ1c09iamVjdC5nZXRDbGFzcygpLmVxdWFscyhzdGF4U291cmNlKSkgfHwKLSAgICAgICAgICAgICAgICBidXNPYmplY3QgaW5zdGFuY2VvZiBKQVhCU291cmNlKSB7Ci0gICAgICAgICAgICAvLyBPa2F5LCB0aGVzZSBhcmUgc3VwcG9ydGVkIFNvdXJjZSBvYmplY3RzCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImRhdGEgb2JqZWN0IGlzIGEgIiArIGJ1c09iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJTb3VyY2VOb3RTdXBwb3J0ZWQiLCBidXNPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20gZmFjdG9yeQotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSBxTmFtZQotICAgICAqIEBwYXJhbSBmYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIFNvdXJjZUJsb2NrSW1wbChPTUVsZW1lbnQgb21FbGVtZW50LCBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIob21FbGVtZW50LCBudWxsLCBxTmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBfZ2V0Qk9Gcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQmVzdCBzb2x1dGlvbiBpcyB0byB1c2UgYSBTdEFYU291cmNlCi0gICAgICAgIC8vIEhvd2V2ZXIgU3RBWFNvdXJjZSBpcyBub3Qgd2lkZWx5IGFjY2VwdGVkLiAgCi0gICAgICAgIC8vIEZvciBub3csIGEgU3RyZWFtU291cmNlIGlzIGFsd2F5cyByZXR1cm5lZAotICAgICAgICAvKgotICAgICAgICBpZiAoc3RheFNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gQ29uc3RydWN0b3Igc2hvdWxkIGJlIHN0YXRpY2FsbHkgY2FjaGVkIGZvciBwZXJmb3JtYW5jZQotICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yIGMgPQotICAgICAgICAgICAgICAgICAgICAgICAgc3RheFNvdXJjZS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgWE1MU3RyZWFtUmVhZGVyLmNsYXNzIH0pOwotICAgICAgICAgICAgICAgIHJldHVybiBjLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHJlYWRlciB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotICAgICAgICAvLyBUT0RPIFN0cmVhbVNvdXJjZSBpcyBub3QgcGVyZm9ybWFudC4uLndvcmsgaXMgbmVlZGVkIGhlcmUgdG8gbWFrZSB0aGlzIGZhc3RlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIodGV4dCk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKHNyKTsKLQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21PTShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCBidXNPYmplY3Q7Ci0gICAgICAgIAotICAgICAgICAvLyBTaG9ydGN1dCB0byBnZXQgYnVzaW5lc3Mgb2JqZWN0IGZyb20gZXhpc3RpbmcgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG9tRWxlbWVudCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpIHsKLSAgICAgICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb21FbGVtZW50KS5nZXREYXRhU291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBTb3VyY2VEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU291cmNlRGF0YVNvdXJjZSkgZHMpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LCB0aGVyZSBhcmUgc29tZSBzcGVjaWFsIGd5bW5hc3RpY3MgdGhhdCB3ZSBoYXZlIHRvIGRvCi0gICAgICAgIC8vIHRvIGdldCB0aGlzIHdvcmtpbmcgZm9yIGFsbCBvZiB0aGUgaGFuZGxlciBzY2VuYXJpb3MuICAKLSAgICAgICAgYm9vbGVhbiBoYXNGYXVsdCA9IGZhbHNlOwotICAgICAgICBpZiAoKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5pc0ZhdWx0KCkpIHx8IAotICAgICAgICAgICAgb21FbGVtZW50LmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQRkFVTFRfTE9DQUxfTkFNRSkpIHsKLSAgICAgICAgICAgIGhhc0ZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gVHJhbnNmb3JtIHJlYWRlciBpbnRvIGJ1c2luZXNzIG9iamVjdAotICAgICAgICBpZiAoIWhhc0ZhdWx0KSB7Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBzdXBlci5fZ2V0Qk9Gcm9tT00ob21FbGVtZW50LCBidXNDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgb21FbGVtZW50LnNlcmlhbGl6ZShiYW9zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgYnVzT2JqZWN0ID0gbmV3IFN0cmVhbVNvdXJjZShiYWlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVzT2JqZWN0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgX2dldFJlYWRlckZyb21CTyhPYmplY3QgYnVzT2JqLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gVE9ETyBub3Qgc3VyZSBpZiB0aGlzIGlzIGFsd2F5cyB0aGUgbW9zdCBwZXJmb3JtYW50IHdheSB0byBkbyB0aGlzLgotICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGZhaWxlZCBpbiBzb21lIChDVFMpIGVudmlyb25tZW50cy4gCi0JICAgICAgICBpZiAoYnVzT2JqIGluc3RhbmNlb2YgRE9NU291cmNlKSB7Ci0JICAgICAgICAgICAgLy8gTGV0J3MgdXNlIG91ciBvd24gRE9NUmVhZGVyIGZvciBub3cuLi4KLQkgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIC8vIEJ1c2luZXNzIE9iamVjdCBtc3V0IGJlIGEgRG9jdW1lbnQgb3IgRWxlbWVudAotCSAgICAgICAgICAgIE5vZGUgbm9kZSA9ICgoRE9NU291cmNlKWJ1c09iaikuZ2V0Tm9kZSgpOwotCSAgICAgICAgICAgIGlmKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCl7Ci0JICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAoKERvY3VtZW50KW5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpOwotCSAgICAgICAgICAgIH1lbHNlewotCSAgICAgICAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpICgoRE9NU291cmNlKWJ1c09iaikuZ2V0Tm9kZSgpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICAvLyBXZSBoYWQgc29tZSBwcm9ibGVtcyB3aXRoIHRlc3RlcnMgcHJvZHVjaW5nIERPTVNvdXJjZXMgdy9vIE5hbWVzcGFjZXMuICAKLQkgICAgICAgICAgICAvLyBJdCdzIGVhc3kgdG8gY2F0Y2ggdGhpcyBoZXJlLgotCSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpID09IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQlNvdXJjZU5hbWVzcGFjZUVyciIpKSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIAotCSAgICAgICAgICAgIHJldHVybiBuZXcgRE9NUmVhZGVyKGVsZW1lbnQpOwotCSAgICAgICAgfSAKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIGlmIChidXNPYmogaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBYTUxJbnB1dEZhY3RvcnkgZiA9IFN0QVhVdGlscy5nZXRYTUxJbnB1dEZhY3RvcnkoKTsKLQotICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBmLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcigoU291cmNlKWJ1c09iaik7Ci0gICAgICAgICAgICAgICAgU3RBWFV0aWxzLnJlbGVhc2VYTUxJbnB1dEZhY3RvcnkoZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vVE9ETzogRm9yIEdNIHdlIG5lZWQgdG8gb25seSB1c2UgdGhpcyBhcHByb2FjaCB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBpZiB0aGlzIGlzIGEgKDEuNikgU3RheFNvdXJjZSBvciBpZiB0aGUgCi0gICAgICAgICAgICAvLyBpbnN0YWxsZWQgcGFyc2VyIHByb3ZpZGVzIGEgYmV0dGVyIHNvbHV0aW9uLgotICAgICAgICAgICAgLy9UT0RPOiBVbmNvbW1lbnQgdGhpcyBjb2RlIGlmIHdvb2RzdG9jayBwYXJzZXIgaGFuZGxlcyAKLSAgICAgICAgICAgIC8vIEpBWEJTb3VyY2UgYW5kIFNBWFNvdXJjZSBjb3JyZWN0bHkuCi0gICAgICAgICAgICAvL3JldHVybiBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKChTb3VyY2UpIGJ1c09iaik7Ci0gICAgICAgICAgICByZXR1cm4gX3Nsb3dfZ2V0UmVhZGVyRnJvbVNvdXJjZSgoU291cmNlKWJ1c09iaik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKGJ1c09iaiA9PSBudWxsKSA/ICJub25lIiA6IGJ1c09iai5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlNvdXJjZVJlYWRFcnIiLCBjbGFzc05hbWUpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBDcmVhdGVzIGFuIFhNTFN0cmVhbVJlYWRlciBmcm9tIGEgU291cmNlIHVzaW5nIGEgc2xvdyBidXQgcHJvdmVuIGFsZ29yaXRobS4gKi8KLSAgICBwcml2YXRlIFhNTFN0cmVhbVJlYWRlciBfc2xvd19nZXRSZWFkZXJGcm9tU291cmNlKFNvdXJjZSBzcmMpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgX3Nsb3dfZ2V0UmVhZGVyRnJvbVNvdXJjZSIpOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IChieXRlW10pIENvbnZlcnRVdGlscy5jb252ZXJ0KHNyYywgYnl0ZVtdLmNsYXNzKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQgdG8gQnl0ZUFycmF5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGJhaXMpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIF9zbG93X2dldFJlYWRlckZyb21Tb3VyY2UgPSIgKyByZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgX291dHB1dEZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBUaGVyZSBpcyBubyBmYXN0IHdheSB0byBvdXRwdXQgdGhlIFNvdXJjZSB0byBhIHdyaXRlciwgc28gZ2V0IHRoZSByZWFkZXIKLSAgICAgICAgLy8gYW5kIHBhc3MgdXNlIHRoZSBkZWZhdWx0IHJlYWRlci0+d3JpdGVyLgotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnQgX291dHB1dEZyb21CTyIpOwotICAgICAgICB9Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBfZ2V0UmVhZGVyRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJPYnRhaW5lZCByZWFkZXI9IiArIHJlYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgX291dHB1dEZyb21SZWFkZXIocmVhZGVyLCB3cml0ZXIpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIF9vdXRwdXRSZWFkZXJGcm9tQk8iKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSRVZJRVcgU2hvdWxkIHdlIGNhbGwgY2xvc2UoKSBvbiB0aGUgU291cmNlID8KLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbUJPKE9iamVjdCBidXNPYmplY3QsIE9iamVjdCBidXNDb250ZXh0LCBib29sZWFuIGNvbnN1bWUpIHsKLSAgICAgICAgaWYgKGNvbnN1bWUpIHsKLSAgICAgICAgICAgIHJldHVybiBidXNPYmplY3Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPIE1pc3NpbmcgSW1wbAotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU291cmNlTWlzc2luZ1N1cHBvcnQiLCBidXNPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVGhlIHNvdXJjZSBjb3VsZCBiZSBhIHRleHQgb3IgZWxlbWVudCBldGMuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBjbG9zZQotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRYTUxJbnB1dFN0cmVhbShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IChieXRlW10pIAotICAgICAgICAgICAgICAgIENvbnZlcnRVdGlscy5jb252ZXJ0KGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKSwgYnl0ZVtdLmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlUmVhZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVdyaXRlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0WE1MQnl0ZXMoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBnZXRYTUxCeXRlcyIpOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlcyA9IChieXRlW10pIAotICAgICAgICAgICAgICAgIENvbnZlcnRVdGlscy5jb252ZXJ0KGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKSwgYnl0ZVtdLmNsYXNzKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBnZXRYTUxCeXRlcyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvWE1MU3RyaW5nQmxvY2tGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1hNTFN0cmluZ0Jsb2NrRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5YjBlZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvWE1MU3RyaW5nQmxvY2tGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxTdHJpbmdCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuQmxvY2tGYWN0b3J5SW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogWE1MU3RyaW5nRmFjdG9yeUltcGwKLSAqIDxwLz4KLSAqIENyZWF0ZXMgYW4gWE1MU3RyaW5nQmxvY2sKLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeUltcGwgZXh0ZW5kcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IHsKLQotICAgIC8qKiBEZWZhdWx0IENvbnN0cnVjdG9yIHJlcXVpcmVkIGZvciBGYWN0b3J5ICovCi0gICAgcHVibGljIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9ja0ZhY3RvcnkjY3JlYXRlRnJvbShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPYmplY3QgYnVzaW5lc3NPYmplY3QsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IFhNTFN0cmluZ0Jsb2NrSW1wbCgoU3RyaW5nKWJ1c2luZXNzT2JqZWN0LCBxTmFtZSwgdGhpcyk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrRmFjdG9yeSNjcmVhdGVGcm9tKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxTdHJpbmdCbG9ja0ltcGwob21FbGVtZW50LCBxTmFtZSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvWE1MU3RyaW5nQmxvY2tJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL2ltcGwvWE1MU3RyaW5nQmxvY2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzQxYTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9pbXBsL1hNTFN0cmluZ0Jsb2NrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZUV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Tb3VyY2VkRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5YTUxTdHJpbmdEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuWE1MU3RyaW5nQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLkJsb2NrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0vKioKLSAqIFhNTFN0cmluZ0Jsb2NrCi0gKiA8cC8+Ci0gKiBCbG9jayBjb250YWluaW5nIGEgYnVzaW5lc3Mgb2JqZWN0IHRoYXQgaXMgYSBTdHJpbmcgb2YgeG1sIHRleHQKLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmluZ0Jsb2NrSW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIFhNTFN0cmluZ0Jsb2NrIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIGZhY3RvcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIFhNTFN0cmluZ0Jsb2NrSW1wbChTdHJpbmcgYnVzT2JqZWN0LCBRTmFtZSBxTmFtZSwgQmxvY2tGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoYnVzT2JqZWN0LCBudWxsLCBxTmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBjYWxsZWQgZnJvbSBmYWN0b3J5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyCi0gICAgICogQHBhcmFtIHFOYW1lCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyaW5nQmxvY2tJbXBsKE9NRWxlbWVudCBvbUVsZW1lbnQsIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBzdXBlcihvbUVsZW1lbnQsIG51bGwsIHFOYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21SZWFkZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgUmVhZGVyMldyaXRlciBjb252ZXJ0ZXIgYW5kIGdldCB0aGUgb3V0cHV0IGFzIGEgU3RyaW5nCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgcmV0dXJuIHIydy5nZXRBc1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21PTShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBTaG9ydGN1dCB0byBnZXQgYnVzaW5lc3Mgb2JqZWN0IGZyb20gZXhpc3RpbmcgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG9tRWxlbWVudCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpIHsKLSAgICAgICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb21FbGVtZW50KS5nZXREYXRhU291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoZHMgaW5zdGFuY2VvZiBYTUxTdHJpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoWE1MU3RyaW5nRGF0YVNvdXJjZSkgZHMpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5fZ2V0Qk9Gcm9tT00ob21FbGVtZW50LCBidXNDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tQk8oT2JqZWN0IGJ1c09iaiwgT2JqZWN0IGJ1c0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFuIFhNTFN0cmVhbVJlYWRlciBmcm9tIHRoZSBpbnB1dEZhY3RvcnkgdXNpbmcgdGhlIFN0cmluZyBhcyB0aGUgc291cmNlcwotICAgICAgICBTdHJpbmcgc3RyID0gKFN0cmluZylidXNPYmo7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyKTsKLSAgICAgICAgcmV0dXJuIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIF9vdXRwdXRGcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gZmFzdCB3YXkgdG8gb3V0cHV0IHRoZSBTdHJpbmcgdG8gYSB3cml0ZXIsIHNvIGdldCB0aGUgcmVhZGVyCi0gICAgICAgIC8vIGFuZCBwYXNzIHVzZSB0aGUgZGVmYXVsdCByZWFkZXItPndyaXRlci4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IF9nZXRSZWFkZXJGcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0KTsKLSAgICAgICAgX291dHB1dEZyb21SZWFkZXIocmVhZGVyLCB3cml0ZXIpOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50RGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gVGhlIHRleHQgY291bGQgYmUgZWxlbWVudCBvciB0ZXh0IG9yIHNvbWV0aGluZyBlbHNlCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICByZXR1cm47IC8vIE5vdGhpbmcgdG8gY2xvc2UKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0WE1MSW5wdXRTdHJlYW0oU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSAoKFN0cmluZykgZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpKS5nZXRCeXRlcyhlbmNvZGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRCdXNpbmVzc09iamVjdChmYWxzZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cnVjdGl2ZVJlYWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3RydWN0aXZlV3JpdGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9NRGF0YVNvdXJjZUV4dCBjb3B5KCkgdGhyb3dzIE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxTdHJpbmdEYXRhU291cmNlKChTdHJpbmcpIGdldE9iamVjdCgpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0WE1MQnl0ZXMoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIGdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKSkuZ2V0Qnl0ZXMoZW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9CbG9ja0ZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9CbG9ja0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkMDMzZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvQmxvY2tGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogQmxvY2tGYWN0b3J5Ci0gKiA8cC8+Ci0gKiBJbnRlcmZhY2UgdG8gY3JlYXRlIEJsb2NrIG9iamVjdHMgQW4gb2JqZWN0IGlzIGNyZWF0ZWQgZnJvbSBlaXRoZXIgYSByZWFkZXIsIGFub3RoZXIgQmxvY2sgb3IgdGhlCi0gKiBCdXNpbmVzc09iamVjdC4gU29tZSBidXNpbmVzcyBvYmplY3RzIChsaWtlIEpBWEIpIGhhdmUgYW4gYXNzb2NpYXRlZCBjb250ZXh0IG9iamVjdAotICogKEpBWEJDb250ZXh0KSwgdGhlc2UgYXJlIGFsc28gcGFzc2VkIHRvIHRoZSBjcmVhdGVNZXRob2RzLgotICogPHAvPgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIEJsb2NrRmFjdG9yaWVzIHNob3VsZCBhbHdheXMgYmUgc2luZ2xldG9uIG9iamVjdHMgYW5kIG5ldmVyIGNhcnJ5IGFueQotICogaW5zdGFuY2UgZGF0YS4KLSAqIDxwLz4KLSAqIFRoZSBGYWN0b3J5UmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFjY2VzcyB0byBhIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tGYWN0b3J5IHsKLQotICAgIC8qKgotICAgICAqIGNyZWF0ZUJsb2NrIGZyb20gWE1MU3RyZWFtUmVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyICBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKiBAcGFyYW0gY29udGV4dCBBc3NvY2lhdGVkIENvbnRleHQgb3IgbnVsbAotICAgICAqIEBwYXJhbSBRTmFtZSAgIG11c3QgYmUgc3VwcGxpZWQgaWYga25vd24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVCbG9jayBmcm9tIFhNTFN0cmVhbVJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudCBPTUVsZW1lbnQKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgIEFzc29jaWF0ZWQgQ29udGV4dCBvciBudWxsCi0gICAgICogQHBhcmFtIFFOYW1lICAgICBtdXN0IGJlIHN1cHBsaWVkIGlmIGtub3duCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgY29udGV4dCwgUU5hbWUgcU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlQmxvY2sgZnJvbSBhbm90aGVyIEJsb2NrIElmIHRoZSBvdGhlciBCbG9jayB3YXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGZhY3RvcnkgYW5kIGhhcyB0aGUKLSAgICAgKiBzYW1lIGNvbnRleHQsIHRoZSBvdGhlciBCbG9jayBpcyByZXR1cm5lZC4gSWYgdGhlIG90aGVyIEJsb2NrIHdhcyBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50IGZhY3RvcnkKLSAgICAgKiBvciBkaWZmZW50IGNvbnRleHQsIGEgbmV3IGJsb2NrIGlzIHJldHVybmVkIChhbmQgdGhlIG90aGVyIGJsb2NrIGlzIGNvbnN1bWVkKQotICAgICAqCi0gICAgICogQHBhcmFtIG90aGVyICAgQmxvY2sKLSAgICAgKiBAcGFyYW0gY29udGV4dCBBc3NvY2lhdGVkIENvbnRleHQgb3IgbnVsbAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrIGNyZWF0ZUZyb20oQmxvY2sgb3RoZXIsIE9iamVjdCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBmcm9tIGJ1c2luZXNzIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGJ1c2luZXNzT2JqZWN0Ci0gICAgICogQHBhcmFtIGNvbnRleHQgICAgICAgIEFzc29jaWF0ZWQgQ29udGV4dCBvciBudWxsCi0gICAgICogQHBhcmFtIFFOYW1lICAgICAgICAgIG11c3QgYmUgc3VwcGxpZWQgaWYga25vd24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKE9iamVjdCBidXNpbmVzc09iamVjdCwgT2JqZWN0IGNvbnRleHQsIFFOYW1lIHFOYW1lKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgYnVzaW5lc3Mgb2JqZWN0IG11c3QgYmUgcmVuZGVyZWQgYXMgYW4gZWxlbWVudAotICAgICAqIGV4YW1wbGUgSkFYQkZhY3RvcnkgLi4udHJ1ZQotICAgICAqIGV4YW1wbGUgU291cmNlRmFjdG9yeS4uLmZhbHNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvQ2xhc3NGaW5kZXJGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvQ2xhc3NGaW5kZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmJiZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0NsYXNzRmluZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5DbGFzc0ZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbC5DbGFzc0ZpbmRlckltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0ZpbmRlckZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbGFzc0ZpbmRlckZhY3RvcnkuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBDbGFzc0ZpbmRlciBmaW5kZXIgPSBudWxsOwotCi0gICAgcHVibGljIENsYXNzRmluZGVyIGdldENsYXNzRmluZGVyKCkgewotICAgICAgICBpZiAoZmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmaW5kZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0ZpbmRlckltcGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0ZpbmRlcihDbGFzc0ZpbmRlciBmaW5kZXIpIHsKLSAgICAgICAgaWYgKHRoaXMuZmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuZmluZGVyID0gZmluZGVyOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0RhdGFTb3VyY2VCbG9ja0ZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9EYXRhU291cmNlQmxvY2tGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjViODEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L0RhdGFTb3VyY2VCbG9ja0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Ow0KLQ0KLQ0KLS8qKg0KLSAqIERhdGFTb3VyY2VCbG9ja0ZhY3RvcnkNCi0gKiA8cC8+DQotICogQ3JlYXRlcyBhIFNvdXJjZUJsb2NrDQotICogPHAvPg0KLSAqIFRoZSBGYWN0b3J5UmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgRmFjdG9yeQ0KLSAqDQotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeQ0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YVNvdXJjZUJsb2NrRmFjdG9yeSBleHRlbmRzIEJsb2NrRmFjdG9yeSB7DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9KQVhCQmxvY2tGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvSkFYQkJsb2NrRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTIyNzhlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9KQVhCQmxvY2tGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi0KLS8qKgotICogSkFYQkJsb2NrRmFjdG9yeQotICogPHAvPgotICogQ3JlYXRlcyBhIEpBWEJCbG9jay4gIFRoZSBidXNpbmVzcyBvYmplY3Qgb2YgYSBKQVhCQmxvY2sgbXVzdCBiZSBlaXRoZXIgYSBKQVhCRWxlbWVudCBvciBhCi0gKiBnZW5lcmF0ZWQgb2JqZWN0IHdpdGggdGhlIFhNTFJvb3RFbGVtZW50IGFubm90YXRpb24KLSAqIDxwLz4KLSAqICogVGhlIEZhY3RvcnlSZWdpc3RyeSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBGYWN0b3J5Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpBWEJCbG9ja0ZhY3RvcnkgZXh0ZW5kcyBCbG9ja0ZhY3RvcnkgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L01lc3NhZ2VGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvTWVzc2FnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3MTkxYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvTWVzc2FnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogTWVzc2FnZUZhY3RvcnkKLSAqIDxwLz4KLSAqIENyZWF0ZXMgYSBNZXNzYWdlIG9iamVjdC4gIFRoZSBjb21tb24gcGF0dGVybnMgYXJlOiAtIENyZWF0ZSBhbiBlbXB0eSBtZXNzYWdlIGZvciBhIHNwZWNpZmljCi0gKiBwcm90b2NvbCAtIENyZWF0ZSBhIG1lc3NhZ2Ugd2l0aCB0aGUgeG1sIHNvdXJjZWQgZnJvbSBPTSAoWE1MU3RyZWFtUmVhZGVyKSAtIENyZWF0ZSBhIG1lc3NhZ2UKLSAqICh4bWwgKyBhdHRhY2htZW50cykgZnJvbSBhIFNPQVBNZXNzYWdlCi0gKiA8cC8+Ci0gKiBUaGUgRmFjdG9yeVJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUZhY3RvcnkgewotICAgIC8qKgotICAgICAqIGNyZWF0ZSBNZXNzYWdlIHdpdGggdGhlIHhtbCBmcm9tIHRoZSBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIgICBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgKGlmIG51bGwsIHRoZSBzb2FwIHByb3RvY29sIGlzIGluZmVycmVkIGZyb20gdGhlIG5hbWVzcGFjZSkKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZUZyb20oWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIE1lc3NhZ2Ugd2l0aCB0aGUgeG1sIGZyb20gdGhlIE9NRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudCBPTUVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgIChpZiBudWxsLCB0aGUgc29hcCBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lc3BhY2UpCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGNyZWF0ZSBNZXNzYWdlIGZyb20gYSBCbG9jawotICAgICAqCi0gICAgICogQHBhcmFtIGJsb2NrCi0gICAgICogQHBhcmFtIGNvbnRleHQgIEFzc29jaWF0ZWQgQ29udGV4dCBvciBudWxsCi0gICAgICogQHBhcmFtIHByb3RvY29sIChpZiBudWxsLCB0aGUgc29hcCBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lc3BhY2UpCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVGcm9tKEJsb2NrIG90aGVyLCBPYmplY3QgY29udGV4dCwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIE1lc3NhZ2UgZnJvbSBTT0FQTWVzc2FnZSBUaGUgeG1sIGFuZCBhdHRhY2htZW50cyBmcm9tIHRoZSBTT0FQTWVzc2FnZSBhcmUgdXNlZCB0bwotICAgICAqIHBvcHVsYXRlIHRoZSBuZXcgTWVzc2FnZSBUaGUgcHJvdG9jb2wgaXMgaW5mZXJyZWQgZnJvbSB0aGUgU09BUE1lc3NhZ2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBTT0FQTWVzc2FnZQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlRnJvbShTT0FQTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgZW1wdHkgTWVzc2FnZSBvZiB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGUoUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvT01CbG9ja0ZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9PTUJsb2NrRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTUyNGNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9PTUJsb2NrRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotCi0vKioKLSAqIE9NQmxvY2tGYWN0b3J5Ci0gKiA8cC8+Ci0gKiBDcmVhdGVzIGFuIE9NQmxvY2sKLSAqIDxwLz4KLSAqICogVGhlIEZhY3RvcnlSZWdpc3RyeSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBGYWN0b3J5Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9NQmxvY2tGYWN0b3J5IGV4dGVuZHMgQmxvY2tGYWN0b3J5IHsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1NBQUpDb252ZXJ0ZXJGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU0FBSkNvbnZlcnRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2YmEzYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU0FBSkNvbnZlcnRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TQUFKQ29udmVydGVyOwotCi0vKioKLSAqIFNBQUpDb252ZXJ0ZXJGYWN0b3J5IENyZWF0ZXMgYW4gU0FBSkNvbnZlcnRlciBvYmplY3QgQSBmYWN0b3J5IGlzIG5lY2Vzc2FyeSBiZWNhdXNlCi0gKiBpbXBsZW1lbnRhdGlvbnMgbWF5IG5lZWQgdG8gcGx1ZyBpbiB0aGVpciBvd24gU0FBSiBvciBPTSBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8cC8+Ci0gKiBGYWN0b3JpZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIEZhY3RvcnlSZWdpc3RyeQotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBTQUFKQ29udmVydGVyRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgb3IgY3JlYXRlIHRoZSBTQUFKQ29udmVydGVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFNBQUpDb252ZXJ0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU0FBSkNvbnZlcnRlciBnZXRTQUFKQ29udmVydGVyKCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzVjNjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1NPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeTsKLQotCi0vKioKLSAqIFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeQotICogPHAvPgotICogQ3JlYXRlcyBhIFNPQVBFbnZlbG9wZUJsb2NrCi0gKiA8cC8+Ci0gKiBUaGUgRmFjdG9yeVJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5IGV4dGVuZHMgQmxvY2tGYWN0b3J5IHsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1NvdXJjZUJsb2NrRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1NvdXJjZUJsb2NrRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI5MDljLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9Tb3VyY2VCbG9ja0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBTb3VyY2VCbG9ja0ZhY3RvcnkKLSAqIDxwLz4KLSAqIENyZWF0ZXMgYSBTb3VyY2VCbG9jawotICogPHAvPgotICogVGhlIEZhY3RvcnlSZWdpc3RyeSBzaG91bGQgYmUgdXNlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBGYWN0b3J5Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNvdXJjZUJsb2NrRmFjdG9yeSBleHRlbmRzIEJsb2NrRmFjdG9yeSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9YTUxQYXJ0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1hNTFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTBmZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9mYWN0b3J5L1hNTFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0OwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFhNTFBhcnRGYWN0b3J5Ci0gKiA8cC8+Ci0gKiBDcmVhdGVzIGFuIFhNTFBhcnQgb2JqZWN0LiAgVGhlIHR3byBjb21tb24gcGF0dGVybnMgYXJlOiAtIENyZWF0ZSBhbiBlbXB0eSBtZXNzYWdlIGZvciBhIHNwZWNpZmljCi0gKiBwcm90b2NvbCAtIENyZWF0ZSBhIHhtbFBhcnQgc291cmNlZCBmcm9tIE9NIChYTUxTdHJlYW1SZWFkZXIpCi0gKiA8cC8+Ci0gKiBUaGUgRmFjdG9yeVJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkIHRvIGdldCBhY2Nlc3MgdG8gdGhlIEZhY3RvcnkKLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MUGFydEZhY3RvcnkgewotICAgIC8qKgotICAgICAqIGNyZWF0ZSBYTUxQYXJ0IGZyb20gWE1MU3RyZWFtUmVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyICAgWE1MU3RyZWFtUmVhZGVyCi0gICAgICogQHBhcmFtIHByb3RvY29sIChpZiBudWxsLCB0aGUgc29hcCBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lc3BhY2UpCi0gICAgICogQHRocm93cyBNZXNzYWdlU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFhNTFBhcnQgY3JlYXRlRnJvbShYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgWE1MUGFydCBmcm9tIE9NRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudCBPTUVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgIChpZiBudWxsLCB0aGUgc29hcCBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lc3BhY2UpCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFhNTFBhcnQgY3JlYXRlRnJvbShPTUVsZW1lbnQgb21FbGVtZW50LCBQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUgWE1MUGFydCBmcm9tIFNPQVBFbnZlbG9wZQotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBFbnZlbG9wZSBTT0FQRW52ZWxvcGUKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFydCBjcmVhdGVGcm9tKFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogY3JlYXRlIGVtcHR5IFhNTFBhcnQgb2YgdGhlIHNwZWNpZmllZCBwcm90b2NvbAotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBYTUxQYXJ0IGNyZWF0ZShQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9YTUxTdHJpbmdCbG9ja0ZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvZmFjdG9yeS9YTUxTdHJpbmdCbG9ja0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5ZjEyMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ZhY3RvcnkvWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5OwotCi0KLS8qKgotICogWE1MU3RyaW5nQmxvY2tGYWN0b3J5Ci0gKiA8cC8+Ci0gKiBDcmVhdGVzIGEgWE1MU3RyaW5nQmxvY2sKLSAqIDxwLz4KLSAqIFRoZSBGYWN0b3J5UmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgRmFjdG9yeQotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnkKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZXh0ZW5kcyBCbG9ja0ZhY3RvcnkgewotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvQmxvY2tGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL0Jsb2NrRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4YzEwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvQmxvY2tGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKiBCbG9ja0ZhY3RvcnlJbXBsIEFic3RyYWN0IEJhc2UgQ2xhc3MgZm9yIHRoZSBCbG9jayBGYWN0b3JpZXMgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCbG9ja0ZhY3RvcnlJbXBsIGltcGxlbWVudHMgQmxvY2tGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBCbG9ja0ZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2tGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgY3JlYXRlRnJvbShCbG9jayBvdGhlciwgT2JqZWN0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvci4gIERlcml2ZWQgRmFjdG9yaWVzIG1heQotICAgICAgICAvLyBwcm92aWRlIGEgbW9yZSBwZXJmb3JtYW50IGltcGxlbWVudGF0aW9uLgotICAgICAgICBpZiAob3RoZXIuZ2V0QmxvY2tGYWN0b3J5KCkuZXF1YWxzKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAob3RoZXIuZ2V0QnVzaW5lc3NDb250ZXh0KCkgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG90aGVyLmdldEJ1c2luZXNzQ29udGV4dCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgb3RoZXIuZ2V0QnVzaW5lc3NDb250ZXh0KCkuZXF1YWxzKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKG90aGVyLmlzUU5hbWVBdmFpbGFibGUoKSkgewotICAgICAgICAgICAgcU5hbWUgPSBvdGhlci5nZXRRTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIEJsb2NrIG5ld0Jsb2NrID0gY3JlYXRlRnJvbShvdGhlci5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSksIGNvbnRleHQsIHFOYW1lKTsKLSAgICAgICAgcmV0dXJuIG5ld0Jsb2NrOwotICAgIH0KLQotICAgIHB1YmxpYyBCbG9jayBjcmVhdGVGcm9tKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIE9iamVjdCBjb250ZXh0LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihyZWFkZXIpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb20ob21FbGVtZW50LCBjb250ZXh0LCBvbUVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9CbG9ja0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9CbG9ja0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4OTRhZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvQmxvY2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlRXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmRzLkJ5dGVBcnJheURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQmxvY2tJbXBsIEFic3RyYWN0IEJhc2UgY2xhc3MgZm9yIHZhcmlvdXMgQmxvY2sgSW1wbGVtZW50YXRpb25zLgotICogPHAvPgotICogVGhlIGJhc2UgY2xhc3MgdGFrZXMgY2FyZSBvZiBjb250cm9sbGluZyB0aGUgdHJhbnNmb3JtYXRpb25zIGJldHdlZW4gQnVzaW5lc3NPYmplY3QsCi0gKiBYTUxTdHJlYW1SZWFkZXIgYW5kIFNPQVBFbGVtZW50IEEgZGVyaXZlZCBjbGFzcyBtdXN0IG1pbmltYWxseSBkZWZpbmUgdGhlIGZvbGxvd2luZzoKLSAqIF9nZXRCT0Zyb21SZWFkZXIgX2dldFJlYWRlckZyb21CTyBfb3V0cHV0RnJvbUJPCi0gKiA8cC8+Ci0gKiBJbiBhZGR0aW9uLCB0aGUgZGVyaXZlZCBjbGFzcyBtYXkgd2FudCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nOiBfZ2V0Qk9Gcm9tQk8gLi4uaWYgdGhlCi0gKiBCdXNpbmVzc09iamVjdCBpcyBjb25zdW1lZCB3aGVuIHJlYWQgKGkuZS4gaXQgaXMgYW4gSW5wdXRTb3VyY2UpCi0gKiA8cC8+Ci0gKiBUaGUgZGVyaXZlZCBjbGFzc2VzIGRvbid0IGhhdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgaW5zdGFuY2UgZGF0YS4gVGhpcyBlbnN1cmVzIHRoYXQgQmxvY2tJbXBsCi0gKiBjb250cm9scyB0aGUgdHJhbnNmb3JtYXRpb25zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmxvY2tJbXBsIGltcGxlbWVudHMgQmxvY2sgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJsb2NrSW1wbC5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGJ1c09iamVjdDsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGJ1c0NvbnRleHQ7Ci0KLSAgICBwcm90ZWN0ZWQgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWUgcU5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG5vUU5hbWVBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgQmxvY2tGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29uc3VtZWQgPSBmYWxzZTsKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZSBwYXJlbnQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7IC8vIE9NRGF0YVNvdXJjZUV4dCBwcm9wZXJ0aWVzCi0KLSAgICAvKioKLSAgICAgKiBBIEJsb2NrIGhhcyB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dCBvciBudWxsCi0gICAgICogQHBhcmFtIHFOYW1lICAgICAgb3IgbnVsbCBpZiB1bmtub3duCi0gICAgICogQHBhcmFtIGZhY3RvcnkgICAgdGhhdCBjcmVhdGVzIHRoZSBCbG9jawotICAgICAqLwotICAgIHByb3RlY3RlZCBCbG9ja0ltcGwoT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsIFFOYW1lIHFOYW1lLCBCbG9ja0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0aGlzLmJ1c09iamVjdCA9IGJ1c09iamVjdDsKLSAgICAgICAgdGhpcy5idXNDb250ZXh0ID0gYnVzQ29udGV4dDsKLSAgICAgICAgdGhpcy5xTmFtZSA9IHFOYW1lOwotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgQmxvY2sgaGFzIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSBidXNDb250ZXh0IG9yIG51bGwKLSAgICAgKiBAcGFyYW0gcU5hbWUgICAgICBvciBudWxsIGlmIHVua25vd24KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSAgICB0aGF0IGNyZWF0ZXMgdGhlIEJsb2NrCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJsb2NrSW1wbChPTUVsZW1lbnQgb21FbGVtZW50LCBPYmplY3QgYnVzQ29udGV4dCwgUU5hbWUgcU5hbWUsIEJsb2NrRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMub21FbGVtZW50ID0gb21FbGVtZW50OwotICAgICAgICB0aGlzLmJ1c0NvbnRleHQgPSBidXNDb250ZXh0OwotICAgICAgICB0aGlzLnFOYW1lID0gcU5hbWU7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jayNnZXRCbG9ja0ZhY3RvcnkoKQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2tGYWN0b3J5IGdldEJsb2NrRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jayNnZXRCdXNpbmVzc0NvbnRleHQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJ1c2luZXNzQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGJ1c0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNZXNzYWdlIHApIHsKLSAgICAgICAgcGFyZW50ID0gcDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrI2dldEJ1c2luZXNzT2JqZWN0KGJvb2xlYW4pCi0gICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QnVzaW5lc3NPYmplY3QoYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQmxvY2tJbXBsRXJyMSIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVzT2JqZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1c09iamVjdCA9IF9nZXRCT0Zyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQsIGNvbnN1bWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHJlYWRlciBpbnRvIGJ1c2luZXNzIG9iamVjdAotICAgICAgICAgICAgYnVzT2JqZWN0ID0gX2dldEJPRnJvbU9NKG9tRWxlbWVudCwgYnVzQ29udGV4dCk7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgYnVzaW5lc3NPYmplY3QgaW4gYSBsb2NhbCB2YXJpYWJsZQotICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiByZXNldCB0aGUgQmxvY2sgaWYgY29uc3VtZSB3YXMgaW5kaWNhdGVkCi0gICAgICAgIE9iamVjdCBuZXdCdXNPYmplY3QgPSBidXNPYmplY3Q7Ci0gICAgICAgIHNldENvbnN1bWVkKGNvbnN1bWUpOwotICAgICAgICByZXR1cm4gbmV3QnVzT2JqZWN0OwotICAgIH0KLSAgICAKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2sjZ2V0UU5hbWUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UU5hbWUoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElmIHRoZSBRTmFtZSBpcyBub3Qga25vd24sIGZpbmQgaXQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChxTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYSBwcmlvciBjYWxsIGRpc2NvdmVyZWQgdGhhdCB0aGlzIGNvbnRlbnQgaGFzIG5vIFFOYW1lLCB0aGVuIHJldHVybiBudWxsCi0gICAgICAgICAgICAgICAgaWYgKG5vUU5hbWVBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvbUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIG5ld1JlYWRlciA9IF9nZXRSZWFkZXJGcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1c09iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihuZXdSZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgYmxvY2tzIG1heSByZXByZXNlbnQgbm9uLWVsZW1lbnQgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgb2J0YWluaW5nIFFOYW1lOiIgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRWxlbWVudERhdGEoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYmxvY2sgY2FuIGhvbGQgbm9uLWVsZW1lbnQgZGF0YSwgdGhlbiBhY2NlcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIG5vIHFuYW1lIGFuZCBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBibG9jayBkb2VzIG5vdCBjb250YWluIGFuIHhtbCBlbGVtZW50LiBQcm9jZXNzaW5nIGNvbnRpbnVlcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgY29udGVudCBoYXMgbm8gUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZXhjZXB0aW9uIGlzIHN3YWxsb3dlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1FOYW1lQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb250ZW50IHNob3VsZCBjb250YWluIHhtbC4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldGhyb3dpbmcgdGhlIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHFOYW1lID0gb21FbGVtZW50LmdldFFOYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcU5hbWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4c2UpIHsKLSAgICAgICAgICAgIHNldENvbnN1bWVkKHRydWUpOwotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih4c2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGRlcml2ZWQgb2JqZWN0cyB0byBzZXQgdGhlIHFOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcU5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRRTmFtZShRTmFtZSBxTmFtZSkgewotICAgICAgICB0aGlzLnFOYW1lID0gcU5hbWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jayNnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbikKLSAgICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBuZXdSZWFkZXIgPSBudWxsOwotICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgIC8vIEluIHNvbWUgc2NlbmFyaW9zLCB0aGUgbWVzc2FnZSBpcyB3cml0dGVuIG91dCBhZnRlciB0aGUgc2VydmljZSBpbnN0YW5jZSBpcyBpbnZva2VkLgotICAgICAgICAgICAgLy8gSW4gdGhlc2Ugc2l0dWF0aW9ucywgaXQgaXMgcHJlZmVyYWJsZSB0byBzaW1wbHkgaWdub3JlIHRoaXMgYmxvY2suCi0gICAgICAgICAgICBpZiAodGhpcy5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGdldFBhcmVudCgpLmlzUG9zdFBpdm90KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3Bvc3RQaXZvdF9nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkJsb2NrSW1wbEVycjEiLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZSkgewotICAgICAgICAgICAgICAgIGlmIChvbUVsZW1lbnQuZ2V0QnVpbGRlcigpICE9IG51bGwgJiYgIW9tRWxlbWVudC5nZXRCdWlsZGVyKCkuaXNDb21wbGV0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXdSZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXdSZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld1JlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChidXNPYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgcmVhZGVyIGRvZXMgbm90IGRlc3Ryb3kgdGhlIEJ1c2luZXNzT2JqZWN0Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBfZ2V0Qk9Gcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0LCBjb25zdW1lKTsKLSAgICAgICAgICAgIG5ld1JlYWRlciA9IF9nZXRSZWFkZXJGcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBzZXRDb25zdW1lZChjb25zdW1lKTsKLSAgICAgICAgcmV0dXJuIG5ld1JlYWRlcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2UjZ2V0UmVhZGVyKCkKLSAgICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ujc2VyaWFsaXplKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0KQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgTVRPTVhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgTVRPTVhNTFN0cmVhbVdyaXRlcihvdXRwdXQsIGZvcm1hdCk7Ci0gICAgICAgIHNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGNhbiBvY2N1ciBpZiBub3RoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIAotICAgICAgICAgICAgLy8gd3JpdGVyLiAgVGhpcyBpcyBwb3NzaWJsZSBpZiB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZQotICAgICAgICAgICAgLy8gd3JpdGVycyB0byB0aGUgb3V0cHV0IHN0cmVhbSBkaXJlY3RseS4KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2F0Y2hpbmcgYW5kIHN3YWxsb3dpbmcgZXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5Xcml0ZXIsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgd3JpdGVyVGFyZ2V0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBNVE9NWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1UT01YTUxTdHJlYW1Xcml0ZXIoU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXJUYXJnZXQpKTsKLSAgICAgICAgd3JpdGVyLnNldE91dHB1dEZvcm1hdChmb3JtYXQpOwotICAgICAgICBzZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgb3V0cHV0VG8od3JpdGVyLCBpc0Rlc3RydWN0aXZlV3JpdGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTUVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG5ld09NRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gY29uc3VtZSA9IHRydWU7ICAvLyBnZXQgdGhlIE9NIGNvbnN1bWVzIHRoZSBtZXNzYWdlCi0gICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQmxvY2tJbXBsRXJyMSIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob21FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5ld09NRWxlbWVudCA9IG9tRWxlbWVudDsKLSAgICAgICAgfSBlbHNlIGlmIChidXNPYmplY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgcmVhZGVyIGRvZXMgbm90IGRlc3Ryb3kgdGhlIEJ1c2luZXNzT2JqZWN0Ci0gICAgICAgICAgICBidXNPYmplY3QgPSBfZ2V0Qk9Gcm9tQk8oYnVzT2JqZWN0LCBidXNDb250ZXh0LCBjb25zdW1lKTsKLSAgICAgICAgICAgIG5ld09NRWxlbWVudCA9IF9nZXRPTUZyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnN1bWVkKGNvbnN1bWUpOwotICAgICAgICByZXR1cm4gbmV3T01FbGVtZW50OwotICAgIH0KLSAgICAKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2sjaXNDb25zdW1lZCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3VtZWQoKSB7Ci0gICAgICAgIHJldHVybiBjb25zdW1lZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmNlIGNvbnN1bWVkLCBhbGwgaW5zdGFuY2UgZGF0YSBvYmplY3RzIGFyZSBudWxsaWZpZWQgdG8gcHJldmVudCBzdWJzZXF1ZW50IGFjY2VzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnN1bWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uc3VtZWQoYm9vbGVhbiBjb25zdW1lKSB7Ci0gICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbnN1bWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJ1c09iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBidXNDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIHN0YWNrIHRyYWNlIGNvbnN1bWVzIGluZGljYXRlcyB3aGVyZSB0aGUgbWVzc2FnZSBpcyBjb25zdW1lZAotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSBCbG9jayBNb25pdG9yOiBBY3Rpb249Q29uc3VtZWQiKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdW1lZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNRTmFtZUF2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIChxTmFtZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvdXRwdXRUbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNvbnN1bWUpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IG91dHB1dFRvIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICAvLyBJbiBzb21lIHNjZW5hcmlvcywgdGhlIG1lc3NhZ2UgaXMgd3JpdHRlbiBvdXQgYWZ0ZXIgdGhlIHNlcnZpY2UgaW5zdGFuY2UgaXMgaW52b2tlZC4KLSAgICAgICAgICAgIC8vIEluIHRoZXNlIHNpdHVhdGlvbnMsIGl0IGlzIHByZWZlcmFibGUgdG8gc2ltcGx5IGlnbm9yZSB0aGlzIGJsb2NrLgotICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiBnZXRQYXJlbnQoKS5pc1Bvc3RQaXZvdCgpKSB7Ci0gICAgICAgICAgICAgICAgX3Bvc3RQaXZvdF9vdXRwdXRUbyh3cml0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiQmxvY2tJbXBsRXJyMSIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob21FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIF9vdXRwdXRGcm9tT00ob21FbGVtZW50LCB3cml0ZXIsIGNvbnN1bWUpOwotICAgICAgICB9IGVsc2UgaWYgKGJ1c09iamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldyaXRlIGJ1c2luZXNzIG9iamVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVzT2JqZWN0ID0gX2dldEJPRnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCwgY29uc3VtZSk7Ci0gICAgICAgICAgICBfb3V0cHV0RnJvbUJPKGJ1c09iamVjdCwgYnVzQ29udGV4dCwgd3JpdGVyKTsKLSAgICAgICAgfQotICAgICAgICBzZXRDb25zdW1lZChjb25zdW1lKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBvdXRwdXRUbyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgaWYgd2UgaGF2ZSBwYXNzZWQgdGhlIHBpdm90IHBvaW50IGJ1dCBzb21lb25lIHdhbnRzIHRvIG91dHB1dCB0aGUgYmxvY2suIFRoZSBhY3R1YWwKLSAgICAgKiBibG9jayBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIG92ZXJyaWRlIHRoaXMgc2V0dGluZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIF9wb3N0UGl2b3Rfb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFFOYW1lIHRoZVFOYW1lID0gaXNRTmFtZUF2YWlsYWJsZSgpID8gZ2V0UU5hbWUoKSA6IG5ldyBRTmFtZSgidW5rbm93biIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgQmxvY2sgZm9yICIgKyB0aGVRTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIgaXMgYWxyZWFkeSBjb25zdW1lZCBhbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCB3cml0dGVuLiIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJZiB5b3UgbmVlZCB0aGlzIGJsb2NrIHByZXNlcnZlZCwgcGxlYXNlIHNldCB0aGUgIiArIENvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAuU0FWRV9SRVFVRVNUX01TRyArICIgcHJvcGVydHkgb24gdGhlIE1lc3NhZ2VDb250ZXh0LiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgaWYgd2UgaGF2ZSBwYXNzZWQgdGhlIHBpdm90IHBvaW50IGJ1dCBzb21lb25lIHdhbnRzIHRvIG91dHB1dCB0aGUgYmxvY2suIFRoZSBhY3R1YWwKLSAgICAgKiBibG9jayBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIG92ZXJyaWRlIHRoaXMgc2V0dGluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9wb3N0UGl2b3RfZ2V0WE1MU3RyZWFtUmVhZGVyKCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIFFOYW1lIHRoZVFOYW1lID0gaXNRTmFtZUF2YWlsYWJsZSgpID8gZ2V0UU5hbWUoKSA6IG5ldyBRTmFtZSgidW5rbm93biIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgQmxvY2sgZm9yICIgKyB0aGVRTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIgaXMgYWxyZWFkeSBjb25zdW1lZCBhbmQgdGhlcmVmb3JlIGl0IGlzIG9ubHkgcGFydGlhbGx5IHJlYWQuIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIklmIHlvdSBuZWVkIHRoaXMgYmxvY2sgcHJlc2VydmVkLCBwbGVhc2Ugc2V0IHRoZSAiICsgQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgICAgIC5TQVZFX1JFUVVFU1RfTVNHICsgIiBwcm9wZXJ0eSBvbiB0aGUgTWVzc2FnZUNvbnRleHQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBnZXRRTmFtZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9ICIiOwotICAgICAgICBpZiAocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0ZXh0ID0gIjxwcmVmaXg6IiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIiB4bWxuczpwcmVmaXg9JyIgKyBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSArCi0gICAgICAgICAgICAgICAgICAgICInLz4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGV4dCA9ICI8IiArIHFOYW1lLmdldExvY2FsUGFydCgpICsgIi8+IjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOwotICAgICAgICByZXR1cm4gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvY2sgaXMgY3VycmVudGx5IGEgYnVzaW5lc3Mgb2JqZWN0LiBEZXJpdmVkIGNsYXNzZXMKLSAgICAgKiAgICAgICAgIG1heSB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBnZXQgaW5mb3JtYXRpb24gaW4gYSBwZXJmb3JtYW50IHdheS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1c2luZXNzT2JqZWN0KCkgewotICAgICAgICByZXR1cm4gYnVzT2JqZWN0ICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KSB7Ci0gICAgICAgIC8vIFRPRE8gYWRkIHRyYWNlIHN0cmluZwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB0byByZXR1cm4gdGhlIGJ1c2luZXNzIG9iamVjdC4gQSBkZXJpdmVkIGJsb2NrIG1heSB3YW50IHRvCi0gICAgICogb3ZlcnJpZGUgdGhpcyBjbGFzcyBpZiB0aGUgYnVzaW5lc3Mgb2JqZWN0IGlzIGNvbnN1bWVkIHdoZW4gcmVhZCAodGh1cyB0aGUgZGVydml2ZWQgYmxvY2sgbWF5Ci0gICAgICogd2FudCB0byBtYWtlIGEgYnVmZmVyZWQgY29weSkgKEFuIGV4YW1wbGUgdXNlIGNhc2UgZm9yIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaXMgdGhlCi0gICAgICogYnVzaW5lc3NPYmplY3QgaXMgYW4gSW5wdXRTb3VyY2UpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVzT2JqZWN0Ci0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcGFyYW0gY29uc3VtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9nZXRCT0Zyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCwgYm9vbGVhbiBjb25zdW1lKSB7Ci0gICAgICAgIHJldHVybiBidXNPYmplY3Q7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVyaXZlZCBjbGFzcyBtdXN0IHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBidWlsZHMgdGhlIGJ1c2luZXNzIG9iamVjdCBmcm9tIHRoZQotICAgICAqIHJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlciAgICAgWE1MU3RyZWFtUmVhZGVyLCB3aGljaCBpcyBjb25zdW1lZAotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgX2dldEJPRnJvbVJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IG1ldGhvZCBmb3IgZ2V0dGluZyBidXNpbmVzcyBvYmplY3QgZnJvbSBPTS4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgYnVzaW5lc3Mgb2JqZWN0IGZyb20gYQotICAgICAqIGRhdGEgc291cmNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvbQotICAgICAqIEBwYXJhbSBidXNDb250ZXh0Ci0gICAgICogQHJldHVybiBCdXNpbmVzcyBPYmplY3QKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgX2dldEJPRnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQsIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IF9nZXRSZWFkZXJGcm9tT00ob21FbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIF9nZXRCT0Zyb21SZWFkZXIocmVhZGVyLCBidXNDb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGFuIFhNTFN0cmVhbVJlYWRlciBmb3IgdGhlIEJ1c2luZXNzT2JqZWN0IFRoZSBkZXJpdmVkIEJsb2NrIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVzT2JqCi0gICAgICogQHBhcmFtIGJ1c0NvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhNTFN0cmVhbVJlYWRlciBfZ2V0UmVhZGVyRnJvbUJPKE9iamVjdCBidXNPYmosIE9iamVjdCBidXNDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb21FbGVtZW50Ci0gICAgICogQHJldHVybiBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIF9nZXRSZWFkZXJGcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCkgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotICAgICAgICBpZiAob21FbGVtZW50LmdldEJ1aWxkZXIoKSAhPSBudWxsICYmICFvbUVsZW1lbnQuZ2V0QnVpbGRlcigpLmlzQ29tcGxldGVkKCkpIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG9tRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dAotICAgICAqIEByZXR1cm4gT01FbGVtZW50Ci0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT01FbGVtZW50IF9nZXRPTUZyb21CTyhPYmplY3QgYnVzT2JqZWN0LCBPYmplY3QgYnVzQ29udGV4dCkKLSAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIHJlYWRlciBkb2VzIG5vdCBkZXN0cm95IHRoZSBCdXNpbmVzc09iamVjdAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgbmV3UmVhZGVyID0gX2dldFJlYWRlckZyb21CTyhidXNPYmplY3QsIGJ1c0NvbnRleHQpOwotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihuZXdSZWFkZXIpOwotICAgICAgICByZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPdXRwdXQgUmVhZGVyIGNvbnRlbnRzIHRvIGEgV3JpdGVyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm9iYWJseSBzdWZmaWNpZW50IGZvciBtb3N0Ci0gICAgICogZGVyaXZlZCBjbGFzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIF9vdXRwdXRGcm9tUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICByMncub3V0cHV0VG8od3JpdGVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogT3V0cHV0IE9NRWxlbWVudCBjb250ZW50cyB0byBhIFdyaXRlci4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgcHJvYmFibHkgc3VmZmljaWVudCBmb3IgbW9zdAotICAgICAqIGRlcml2ZWQgY2xhc3Nlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbQotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIF9vdXRwdXRGcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldyaXRlIHVzaW5nIE9NRWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZSh3cml0ZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0ZSBVc2luZyBPTUVsZW1lbnQuc2VyaWFsaXplIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2VFeHQjY29weSgpCi0gICAgICovCi0gICAgcHVibGljIE9NRGF0YVNvdXJjZUV4dCBjb3B5KCkgdGhyb3dzIE9NRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uICBNdWNoCi0gICAgICAgIC8vIG1vcmUgcmVmYWN0b3JpbmcgbmVlZHMgdG8gb2NjdXIgdG8gYWNjb3VudCBmb3IgYXR0YWNobWVudHMuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSAidXRmLTgiOyAvLyBDaG9vc2UgYSBjb21tb24gZW5jb2RpbmcKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IHRoaXMuZ2V0WE1MQnl0ZXMoZW5jb2RpbmcpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlEYXRhU291cmNlKGJ5dGVzLCBlbmNvZGluZyk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3V0cHV0IEJ1c2luZXNzT2JqZWN0IGNvbnRlbnRzIHRvIGEgV3JpdGVyLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBtdXN0IHByb3ZpZGUgdGhpcyBpbXBsZW1lbnRhdGlvbgotICAgICAqIEBwYXJhbSBidXNPYmplY3QKLSAgICAgKiBAcGFyYW0gYnVzQ29udGV4dAotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIF9vdXRwdXRGcm9tQk8oT2JqZWN0IGJ1c09iamVjdCwgT2JqZWN0IGJ1c0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQkKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODc3MTk5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9NZXNzYWdlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLlNPQVBFbnZlbG9wZUJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5EYXRhU291cmNlQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKiBNZXNzYWdlRmFjdG9yeUltcGwgKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNZXNzYWdlRmFjdG9yeSB7Ci0KLSAgICAvKiogRGVmYXVsdCBDb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgRmFjdG9yeSAqLwotICAgIHB1YmxpYyBNZXNzYWdlRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZUZyb20oamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIpCi0gICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZUZyb20oWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyOwotICAgICAgICBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wucmVzdCkgewotICAgICAgICAgICAgLy8gQnVpbGQgYSBub3JtYWwgT00gdHJlZQotICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHJlYWRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBCdWlsZCBhIFNPQVAgT00gdHJlZQotICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOyAgLy8gUGFzcyBudWxsIGFzIHRoZSB2ZXJzaW9uIHRvIHRyaWdnZXIgYXV0b2RldGVjdGlvbgotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShvbUVsZW1lbnQsIHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZUZyb20ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZUZyb20oT01FbGVtZW50IG9tRWxlbWVudCwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlSW1wbChvbUVsZW1lbnQsIHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2wpCi0gICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZShQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUltcGwocHJvdG9jb2wpOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5I2NyZWF0ZUZyb20oamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UpCi0gICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZUZyb20oU09BUE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIHdpdGggYW4gWE1MUGFydCBmcm9tIHRoZSBTT0FQRW52ZWxvcGUKLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlSW1wbChtZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKSk7Ci0KLSAgICAgICAgICAgIE1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzID0gbWVzc2FnZS5nZXRNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtaW1lSGVhZGVycy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWltZUhlYWRlciBtaW1lSGVhZGVyID0gKE1pbWVIZWFkZXIpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBtaW1lSGVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtaW1lSGVhZGVyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYoa2V5ICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZighSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLmVxdWFsc0lnbm9yZUNhc2Uoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG0uc2V0TWltZUhlYWRlcnMobWFwKTsKLQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY291bnRBdHRhY2htZW50cygpID4gMCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbWVzc2FnZS5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgICAgIG0uc2V0RG9pbmdTV0EodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IChBdHRhY2htZW50UGFydClpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIG0uYWRkRGF0YUhhbmRsZXIoYXAuZ2V0RGF0YUhhbmRsZXIoKSwgYXAuZ2V0Q29udGVudElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeSNjcmVhdGVGcm9tKG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jaywgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgY3JlYXRlRnJvbShCbG9jayBibG9jaywgT2JqZWN0IGNvbnRleHQsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uIHRvIHF1aWNrbHkgY29uc2lkZXIgdGhlIFNPQVBFbnZlbG9wZSBjYXNlCi0gICAgICAgIGlmIChibG9jayBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZUJsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VJbXBsKChTT0FQRW52ZWxvcGUpYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSksIHByb3RvY29sKTsKLSAgICAgICAgfSBlbHNlIGlmIChibG9jayBpbnN0YW5jZW9mIERhdGFTb3VyY2VCbG9jaykgewotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUZyb20oYmxvY2suZ2V0T01FbGVtZW50KCksIHByb3RvY29sKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSksIHByb3RvY29sKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9NZXNzYWdlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL01lc3NhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWVlMDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL01lc3NhZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5hdHRhY2htZW50cy5BdHRhY2htZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNBQUpDb252ZXJ0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxTdHJpbmdCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTWVzc2FnZUltcGwKLSAqIEEgTWVzc2FnZSBpcyBhbiBYTUwgcGFydCArIEF0dGFjaG1lbnRzLgotICogTW9zdCBvZiB0aGUgaW1wbGVtZW50YXRpb24gZGVsZWdhdGVzIHRvIHRoZSBYTUxQYXJ0IGltcGxlbWVudGF0aW9uLgotICogCi0gKiBOT1RFOiBGb3IgWE1ML0hUVFAgKFJFU1QpLCBhIFNPQVAgMS4xLiBFbnZlbG9wZSBpcyBidWlsdCBhbmQgdGhlIHJlc3QgcGF5bG9hZCBpcyBwbGFjZWQKLSAqIGluIHRoZSBib2R5LiAgVGhpcyBwdXJwb3NlbHkgbWltaWNzIHRoZSBBeGlzMiBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VJbXBsIGltcGxlbWVudHMgTWVzc2FnZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VJbXBsLmNsYXNzKTsKLSAgICAKLSAgICBQcm90b2NvbCBwcm90b2NvbCA9IFByb3RvY29sLnVua25vd247IC8vIHRoZSBwcm90b2NvbCwgZGVmYXVsdHMgdG8gdW5rbm93bgotICAgIFhNTFBhcnQgeG1sUGFydCA9IG51bGw7IC8vIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgeG1scGFydAotICAgIAotICAgIGJvb2xlYW4gbXRvbUVuYWJsZWQ7Ci0gICAgCi0gICAgLy8gVGhlIHRyYW5zcG9ydCBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gYSBNYXAsIHdoaWNoIGlzIHRoZSAKLSAgICAvLyBzYW1lIGRhdGEgcmVwcmVzZW50YXRpb24gdXNlZCBieSB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQgKFRSQU5TUE9SVF9IRUFERVJTKS4KLSAgICBwcml2YXRlIE1hcCB0cmFuc3BvcnRIZWFkZXJzID0gbnVsbDsgCi0gICAgCi0gICAgLy8gVGhlIE1lc3NhZ2UgaXMgY29ubmVjdGVkIHRvIGEgTWVzc2FnZUNvbnRleHQuCi0gICAgLy8gUHJpb3IgdG8gdGhhdCBjb25uZWN0aW9uLCBhdHRhY2htZW50cyBhcmUgc3RvcmVkIGxvY2FsbHkKLSAgICAvLyBBZnRlciB0aGUgY29ubmVjdGlvbiwgYXR0YWNobWVudHMgYXJlIG9idGFpbmVkIGZyb20gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPSBuZXcgQXR0YWNobWVudHMoKTsgIC8vIExvY2FsIEF0dGFjaG1lbnRzCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLSAgICAKLSAgICAvLyBTZXQgYWZ0ZXIgd2UgaGF2ZSBwYXN0IHRoZSBwaXZvdCBwb2ludCB3aGVuIHRoZSBtZXNzYWdlIGlzIGNvbnN1bWVkCi0gICAgcHJpdmF0ZSBib29sZWFuIHBvc3RQaXZvdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBkb2luZ1NXQSA9IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIE1lc3NhZ2VJbXBsIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB2aWEgdGhlIE1lc3NhZ2VGYWN0b3J5LgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgY29uc3RydWN0cyBhbiBlbXB0eSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBwcm90b2NvbAotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqLwotICAgIE1lc3NhZ2VJbXBsKFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlWE1MUGFydChwcm90b2NvbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE1lc3NhZ2UgaXMgY29uc3RydWN0ZWQgYnkgdGhlIE1lc3NhZ2VGYWN0b3J5LgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgY3JlYXRlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgc3BlY2lmaWVkIHJvb3QuCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgb3IgbnVsbAotICAgICAqLwotICAgIE1lc3NhZ2VJbXBsKE9NRWxlbWVudCByb290LCBQcm90b2NvbCBwcm90b2NvbCkgCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiAgewotICAgICAgICBjcmVhdGVYTUxQYXJ0KHJvb3QsIHByb3RvY29sKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWVzc2FnZSBpcyBjb25zdHJ1Y3RlZCBieSB0aGUgTWVzc2FnZUZhY3RvcnkuCi0gICAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbWVzc2FnZSBmcm9tIHRoZSBzcGVjaWZpZWQgcm9vdC4KLSAgICAgKiBAcGFyYW0gcm9vdAotICAgICAqIEBwYXJhbSBwcm90b2NvbCBvciBudWxsCi0gICAgICovCi0gICAgTWVzc2FnZUltcGwoU09BUEVudmVsb3BlIHJvb3QpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gIHsKLSAgICAgICAgY3JlYXRlWE1MUGFydChyb290KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IFhNTFBhcnQgYW5kIFByb3RvY29sIGZyb20gdGhlIHJvb3QKLSAgICAgKiBAcGFyYW0gcm9vdCBTT0FQRW52ZWxvcGUKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYTUxQYXJ0KFNPQVBFbnZlbG9wZSByb290KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MUGFydEZhY3RvcnkgZmFjdG9yeSA9IChYTUxQYXJ0RmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MUGFydEZhY3RvcnkuY2xhc3MpOwotICAgICAgICB4bWxQYXJ0ID0gZmFjdG9yeS5jcmVhdGVGcm9tKHJvb3QpOwotICAgICAgICB0aGlzLnByb3RvY29sID0geG1sUGFydC5nZXRQcm90b2NvbCgpOwotICAgICAgICB4bWxQYXJ0LnNldFBhcmVudCh0aGlzKTsgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBYTUxQYXJ0IGFuZCBQcm90b2NvbCBmcm9tIHRoZSByb290Ci0gICAgICogQHBhcmFtIHJvb3QgT01FbGVtZW50Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWE1MUGFydChPTUVsZW1lbnQgcm9vdCwgUHJvdG9jb2wgcHJvdG9jb2wpIAotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gKFhNTFBhcnRGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxQYXJ0RmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIHhtbFBhcnQgPSBmYWN0b3J5LmNyZWF0ZUZyb20ocm9vdCwgcHJvdG9jb2wpOwotICAgICAgICB0aGlzLnByb3RvY29sID0geG1sUGFydC5nZXRQcm90b2NvbCgpOwotICAgICAgICB4bWxQYXJ0LnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGVtcHR5IFhNTFBhcnQgZnJvbSB0aGUgUHJvdG9jb2wKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYTUxQYXJ0KFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICBpZiAocHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnVua25vd24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiUHJvdG9jb2xJc05vdEtub3duIikpOwotICAgICAgICB9IAotICAgICAgICBYTUxQYXJ0RmFjdG9yeSBmYWN0b3J5ID0gKFhNTFBhcnRGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxQYXJ0RmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIHhtbFBhcnQgPSBmYWN0b3J5LmNyZWF0ZShwcm90b2NvbCk7Ci0gICAgICAgIHhtbFBhcnQuc2V0UGFyZW50KHRoaXMpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZSNnZXRBc1NPQVBNZXNzYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgZ2V0QXNTT0FQTWVzc2FnZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE86IAotICAgICAgICAvLyBUaGlzIGlzIGEgbm9uIHBlcmZvcm1hbnQgd2F5IHRvIGNyZWF0ZSBTT0FQTWVzc2FnZS4gSSB3aWxsIHNlcmlhbGl6ZQotICAgICAgICAvLyB0aGUgeG1scGFydCBjb250ZW50IGFuZCB0aGVuIGNyZWF0ZSBhbiBJbnB1dFN0cmVhbSBvZiBieXRlLgotICAgICAgICAvLyBGaW5hbGx5IGNyZWF0ZSBTT0FQTWVzc2FnZSB1c2luZyB0aGlzIElucHV0U3RyZWFtLgotICAgICAgICAvLyBUaGUgcmVhbCBzb2x1dGlvbiBtYXkgaW52b2x2ZSB1c2luZyBub24tc3BlYywgaW1wbGVtZW50YXRpb24KLSAgICAgICAgLy8gY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBhIE1lc3NhZ2UgZnJvbSBhbiBFbnZlbG9wZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFydCBnZXRBc1NPQVBNZXNzYWdlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBHZXQgT01FbGVtZW50IGZyb20gWE1MUGFydC4KLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0geG1sUGFydC5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIG5hbWVzcGFjZSBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgU09BUDExIG9yIFNPQVAxMgotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemUob3V0U3RyZWFtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyAodXN1YWxseSBpbmJvdW5kKSB0aGUgYnVpbGRlciB3aWxsIG5vdCBiZSBjbG9zZWQgYWZ0ZXIKLSAgICAgICAgICAgIC8vIHNlcmlhbGl6YXRpb24uICBJbiB0aGF0IGNhc2UgaXQgc2hvdWxkIGJlIGNsb3NlZCBtYW51YWxseS4KLSAgICAgICAgICAgIGlmIChlbGVtZW50LmdldEJ1aWxkZXIoKSAhPSBudWxsICYmICFlbGVtZW50LmdldEJ1aWxkZXIoKS5pc0NvbXBsZXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5jbG9zZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG91dFN0cmVhbS50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoYnl0ZXMpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpbnB1dHN0cmVhbSA9ICIgKyB0ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIElucHV0U3RyZWFtCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENyZWF0ZSBNZXNzYWdlRmFjdG9yeSB0aGF0IHN1cHBvcnRzIHRoZSB2ZXJzaW9uIG9mIFNPQVAgaW4gdGhlIG9tIGVsZW1lbnQKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gZ2V0U0FBSkNvbnZlcnRlcigpLmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KG5zLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIHNvYXBNZXNzYWdlIG9iamVjdCBmcm9tIE1lc3NhZ2UgRmFjdG9yeSB1c2luZyB0aGUgaW5wdXQKLSAgICAgICAgICAgIC8vIHN0cmVhbSBjcmVhdGVkIGZyb20gT00uCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgTWltZUhlYWRlcnMgZnJvbSB0aGUgdHJhbnNwb3J0SGVhZGVycyBtYXAKLSAgICAgICAgICAgIE1pbWVIZWFkZXJzIGRlZmF1bHRIZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNwb3J0SGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSB0cmFuc3BvcnRIZWFkZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsbHkgdGhlcmUgaXMgb25lIHZhbHVlIHBlciBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBhZGQgdHJhbnNwb3J0IGhlYWRlci4gaGVhZGVyID0iICsga2V5ICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdmFsdWUgPSAiICsgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGVhZGVycy5hZGRIZWFkZXIoa2V5LCAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIG1heSBiZSBtdWx0aXBsZSB2YWx1ZXMgZm9yIGVhY2gga2V5LiAgVGhpcyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3N1bWVzIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiBTdHJpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSAoU3RyaW5nW10pIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8dmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBhZGQgdHJhbnNwb3J0IGhlYWRlci4gaGVhZGVyID0iICsga2V5ICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHZhbHVlID0gIiArIHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIZWFkZXJzLmFkZEhlYWRlcihrZXksIHZhbHVlc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRvZ2dsZSBiYXNlZCBvbiBTT0FQIDEuMSBvciBTT0FQIDEuMgotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF8xXzFfRU5WRUxPUEUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX0NPTlRFTlRfVFlQRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX0NPTlRFTlRfVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgU3RyaW5nIGN0VmFsdWUgPSBjb250ZW50VHlwZSArIjsgY2hhcnNldD1VVEYtOCI7Ci0gICAgICAgICAgICBkZWZhdWx0SGVhZGVycy5zZXRIZWFkZXIoIkNvbnRlbnQtdHlwZSIsIGN0VmFsdWUpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHNldENvbnRlbnRUeXBlID0iICsgY3RWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IG1mLmNyZWF0ZU1lc3NhZ2UoZGVmYXVsdEhlYWRlcnMsIGluU3RyZWFtKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgWE1MUGFydCBpcyBzdGlsbCBhbiBPTUVsZW1lbnQuICAKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hhbmdlIGl0IHRvIHRoZSBuZXcgU09BUEVudmVsb3BlLgotICAgICAgICAgICAgY3JlYXRlWE1MUGFydChzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiBheGlvbSByZWFkIHRoZSBtZXNzYWdlIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgCi0gICAgICAgICAgICAvLyB0aGVuIG9uZSBvZiB0aGUgYXR0YWNobWVudHMgaXMgYSBTT0FQUGFydC4gIElnbm9yZSB0aGlzIGF0dGFjaG1lbnQKLSAgICAgICAgICAgIFN0cmluZyBzb2FwUGFydENvbnRlbnRJRCA9IGdldFNPQVBQYXJ0Q29udGVudElEKCk7ICAvLyBUaGlzIG1heSBiZSBudWxsCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBzb2FwUGFydENvbnRlbnRJRCA9IiArIHNvYXBQYXJ0Q29udGVudElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRvbnRDb3B5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBpZiAoc29hcFBhcnRDb250ZW50SUQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvbnRDb3B5LmFkZChzb2FwUGFydENvbnRlbnRJRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFkZCBhbnkgbmV3IGF0dGFjaG1lbnRzIGZyb20gdGhlIFNPQVBNZXNzYWdlIHRvIHRoaXMgTWVzc2FnZQotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBzb2FwTWVzc2FnZS5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNpZCA9IGFwLmdldENvbnRlbnRJZCgpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgYWRkIFNPQVBNZXNzYWdlIGF0dGFjaG1lbnQgdG8gTWVzc2FnZS4gIGNpZCA9ICIgKyBjaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGREYXRhSGFuZGxlcihhcC5nZXREYXRhSGFuZGxlcigpLCAgY2lkKTsKLSAgICAgICAgICAgICAgICBkb250Q29weS5hZGQoY2lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQWRkIHRoZSBhdHRhY2htZW50cyBmcm9tIHRoaXMgTWVzc2FnZSB0byB0aGUgU09BUE1lc3NhZ2UKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNpZDpnZXRBdHRhY2htZW50SURzKCkpIHsKLSAgICAgICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IGF0dGFjaG1lbnRzLmdldERhdGFIYW5kbGVyKGNpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkb250Q29weS5jb250YWlucyhjaWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGFkZCBNZXNzYWdlIGF0dGFjaG1lbnQgdG8gU29hcE1lc3NhZ2UuICBjaWQgPSAiICsgY2lkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IE1lc3NhZ2VVdGlscy5jcmVhdGVBdHRhY2htZW50UGFydChjaWQsIGRoLCBzb2FwTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmFkZEF0dGFjaG1lbnRQYXJ0KGFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBUaGUgU09BUE1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0YWNobWVudHMiKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdDIgPSBzb2FwTWVzc2FnZS5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KSBpdDIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBdHRhY2htZW50UGFydCBjaWQ9IiArIGFwLmdldENvbnRlbnRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgICAgIGNvbnRlbnRUeXBlID0iICsgYXAuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImVuZCBnZXRBc1NPQVBNZXNzYWdlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGljYXRlZCAobm9uLXNvYXAgcGFydCkgYXR0YWNobWVudCBpZAotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gQ0lEIG9yIG51bGwgaWYgbm90IHByZXNlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRJRChpbnQgaW5kZXgpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGNpZHMgPSBnZXRBdHRhY2htZW50SURzKCk7Ci0gICAgICAgIFN0cmluZyBzcENJRCA9IGdldFNPQVBQYXJ0Q29udGVudElEKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRBdHRhY2htZW50SUQgZm9yIGluZGV4ID0iICsgaW5kZXgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRhY2htZW50IENJRCAoIiArIGkgKyAiKSA9ICIgKyBjaWRzLmluZGV4T2YoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgU09BUCBQYXJ0IENJRCBpcyBpZ25vcmVkLiAgSXQncyBDSUQgaXMgKCIgKyBzcENJRCArICIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNwSW5kZXggPSAoc3BDSUQgPT0gbnVsbCkgPyAtMSA6IGNpZHMuaW5kZXhPZihzcENJRCk7Ci0gICAgICAgIAotICAgICAgICAvLyBCdW1wIGluZGV4IHNvIHdlIGRvbid0IGNvbnNpZGVyIHRoZSBzb2FwIHBhcnQKLSAgICAgICAgaW5kZXggPSAoc3BJbmRleCAhPSAtMSAmJiBzcEluZGV4IDw9IGluZGV4KSA/IGluZGV4ICsgMSA6IGluZGV4OwotICAgICAgICAKLSAgICAgICAgLy8gUmV0dXJuIHRoZSBjb250ZW50IGlkIGF0IHRoZSBjYWxjdWxhdGVkIGluZGV4Ci0gICAgICAgIFN0cmluZyByZXN1bHRDSUQgPSBudWxsOwotICAgICAgICBpZiAoaW5kZXggPCBjaWRzLnNpemUoKSkgewotICAgICAgICAgICAgcmVzdWx0Q0lEID0gY2lkcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgQ0lEPSIgKyByZXN1bHRDSUQpOwotICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0Q0lEOwotICAgIH0KLSAgICAKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudElEKFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICAvLyBGaW5kIHRoZSBwcmVmaXggdGhhdCBzdGFydHMgd2l0aCB0aGUgCi0gICAgICAgIC8vIHBhcnROYW1lPQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gcGFydE5hbWUgKyAiPSI7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjaWRzID0gZ2V0QXR0YWNobWVudElEcygpOwotICAgICAgICBmb3IgKFN0cmluZyBjaWQ6IGNpZHMpIHsKLSAgICAgICAgICAgIGlmIChjaWQuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRTT0FQUGFydENvbnRlbnRJRCgpIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRJRCA9IG51bGw7Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIEF0dGFjaG1lbnRzIHNldCB1cCBwcm9ncmFtbWF0aWNhbGx5Li4uc28gdGhlcmUgaXMgbm8gU09BUFBhcnQKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udGVudElEID0gYXR0YWNobWVudHMuZ2V0U09BUFBhcnRDb250ZW50SUQoKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBPTSB3aWxsIGtpbmRseSB0aHJvdyBhbiBPTUV4Y2VwdGlvbiBvciBOUEUgaWYgdGhlIGF0dGFjaG1lbnRzIGlzIHNldCB1cCAKLSAgICAgICAgICAgIC8vIHByb2dyYW1tYXRpY2FsbHkuIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRJRDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2UjZ2V0VmFsdWUoamF2YS5sYW5nLk9iamVjdCwgCi0gICAgICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gUHJvdG9jb2wucmVzdCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiByZXN0IHN0b3JlcyB0aGUgcmVzdCB4bWwgaW5zaWRlIGEgZHVtbXkgc29hcCAxLjEgZW52ZWxvcGUuCi0gICAgICAgICAgICAgICAgLy8gU28gdXNlIHRoZSBnZXQgYm9keSBibG9jayBsb2dpYy4KLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IHhtbFBhcnQuZ2V0Qm9keUJsb2NrKGNvbnRleHQsIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgU09BUAotICAgICAgICAgICAgICAgIGlmIChibG9ja0ZhY3RvcnkgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRBc1NPQVBNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBkb2Vzbid0IHNlZW0gcmlnaHQgdG8gbWUuCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgaGF2ZSBhbiBpbnRlcm1lZGlhdGUgU3RyaW5nQmxvY2suCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHBlcmZvcm1hbnQuIFNjaGV1Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZXNzYWdlT00gPSBnZXRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSBtZXNzYWdlT00udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBOUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMSkgPyBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgc29hcEVudlFuYW1lID0gbmV3IFFOYW1lKHNvYXBOUywgIkVudmVsb3BlIik7Ci0KLQotICAgICAgICAgICAgICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3Rvcnkgc3RyaW5nRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgQmxvY2sgc3RyaW5nQmxvY2sgPSBzdHJpbmdGYWN0b3J5LmNyZWF0ZUZyb20oc3RyaW5nVmFsdWUsIG51bGwsIHNvYXBFbnZRbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gYmxvY2tGYWN0b3J5LmNyZWF0ZUZyb20oc3RyaW5nQmxvY2ssIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2UjZ2V0QXR0YWNobWVudElEcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBdHRhY2htZW50SURzKCkgewotICAgICAgICByZXR1cm4gYXR0YWNobWVudHMuZ2V0Q29udGVudElETGlzdCgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZSNnZXREYXRhSGFuZGxlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXREYXRhSGFuZGxlcihTdHJpbmcgY2lkKSB7Ci0gICAgICAgIC8vIGlmIG51bGwgREggd2FzIHNwZWNpZmllZCBleHBsaWNpdGx5LCBqdXN0IHJldHVybgotICAgICAgICBpZihjaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChEYXRhSGFuZGxlcikgbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgYmNpZCA9IGdldEJsb2JDSUQoY2lkKTsKLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzLmdldERhdGFIYW5kbGVyKGJjaWQpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZSNyZW1vdmVEYXRhSGFuZGxlcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBEYXRhSGFuZGxlciByZW1vdmVEYXRhSGFuZGxlcihTdHJpbmcgY2lkKSB7Ci0gICAgICAgIFN0cmluZyBiY2lkID0gZ2V0QmxvYkNJRChjaWQpOwotICAgICAgICBEYXRhSGFuZGxlciBkaCA9IGF0dGFjaG1lbnRzLmdldERhdGFIYW5kbGVyKGJjaWQpOwotICAgICAgICBhdHRhY2htZW50cy5yZW1vdmVEYXRhSGFuZGxlcihiY2lkKTsKLSAgICAgICAgcmV0dXJuIGRoOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRCbG9iQ0lEKFN0cmluZyBjaWQpIHsKLSAgICAgICAgU3RyaW5nIGJsb2JDSUQgPSBjaWQ7Ci0gICAgICAgIGlmIChjaWQuc3RhcnRzV2l0aCgiY2lkOiIpKSB7Ci0gICAgICAgICAgICBibG9iQ0lEID0gY2lkLnN1YnN0cmluZyg0KTsgIC8vIFNraXAgb3ZlciBjaWQ6Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJsb2JDSUQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFByb3RvY29sKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJvdG9jb2wgZ2V0UHJvdG9jb2woKSB7Ci0gICAgICAgIHJldHVybiBwcm90b2NvbDsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRBc09NRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBnZXRBc1NPQVBFbnZlbG9wZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0QXNTT0FQRW52ZWxvcGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhpbnQgaW5kZXgsIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldEJvZHlCbG9jayhpbmRleCwgY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEJsb2NrIGdldEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIE9iamVjdCBjb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkgCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRIZWFkZXJCbG9jayhuYW1lc3BhY2UsIGxvY2FsUGFydCwgY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8QmxvY2s+IGdldEhlYWRlckJsb2NrcyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbGVQbGF5ZXIgcm9sZVBsYXllcikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXRIZWFkZXJCbG9ja3MobmFtZXNwYWNlLCBsb2NhbFBhcnQsIGNvbnRleHQsIGJsb2NrRmFjdG9yeSwgcm9sZVBsYXllcik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1Cb2R5QmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXROdW1Cb2R5QmxvY2tzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0TnVtSGVhZGVyQmxvY2tzKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4geG1sUGFydC5nZXROdW1IZWFkZXJCbG9ja3MoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRYTUxTdHJlYW1SZWFkZXIoYm9vbGVhbiBjb25zdW1lKSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldFhNTFN0cmVhbVJlYWRlcihjb25zdW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lZCgpIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuaXNDb25zdW1lZCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBvdXRwdXRUbyhYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNvbnN1bWUpIAotICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB4bWxQYXJ0Lm91dHB1dFRvKHdyaXRlciwgY29uc3VtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJvZHlCbG9jayhpbnQgaW5kZXgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sUGFydC5yZW1vdmVCb2R5QmxvY2soaW5kZXgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0KSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQucmVtb3ZlSGVhZGVyQmxvY2sobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soaW50IGluZGV4LCBCbG9jayBibG9jaykgCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB4bWxQYXJ0LnNldEJvZHlCbG9jayhpbmRleCwgYmxvY2spOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykgCi0gICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB4bWxQYXJ0LnNldEhlYWRlckJsb2NrKG5hbWVzcGFjZSwgbG9jYWxQYXJ0LCBibG9jayk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKSAKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQuYXBwZW5kSGVhZGVyQmxvY2sobmFtZXNwYWNlLCBsb2NhbFBhcnQsIGJsb2NrKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KSB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LnRyYWNlU3RyaW5nKGluZGVudCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIExvYWQgdGhlIFNBQUpDb252ZXJ0ZXIKLSAgICAgKiBAcmV0dXJuIFNBQUpDb252ZXJ0ZXIKLSAgICAgKi8KLSAgICBTQUFKQ29udmVydGVyIGNvbnZlcnRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTQUFKQ29udmVydGVyIGdldFNBQUpDb252ZXJ0ZXIoKSB7Ci0gICAgICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkgZmFjdG9yeSA9ICgKLSAgICAgICAgICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU0FBSkNvbnZlcnRlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgY29udmVydGVyID0gZmFjdG9yeS5nZXRTQUFKQ29udmVydGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkRGF0YUhhbmRsZXIoRGF0YUhhbmRsZXIgZGgsIFN0cmluZyBpZCkgewotICAgICAgICBpZiAoaWQuc3RhcnRzV2l0aCgiPCIpICAmJiBpZC5lbmRzV2l0aCgiPiIpKSB7Ci0gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxLCBpZC5sZW5ndGgoKS0xKTsKLSAgICAgICAgfQotICAgICAgICBhdHRhY2htZW50cy5hZGREYXRhSGFuZGxlcihpZCwgZGgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTWVzc2FnZSBtc2cpIHsgCi0gICAgICAgIC8vIEEgTWVzc2FnZSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJpbmRpbmcgZm9yIHRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgbXRvbQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7Ci0gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGhhcyBTV0EgYXR0YWNobWVudHMsIHRoaXMgIndpbnMiIG92ZXIgdGhlIG10b20gc2V0dGluZy4KLSAgICAgICAgcmV0dXJuIG10b21FbmFibGVkICYmICFkb2luZ1NXQTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRydWUgaWYgdGhlIGJpbmRpbmcgZm9yIHRoaXMgbWVzc2FnZSBpbmRpY2F0ZXMgbXRvbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1UT01FbmFibGVkKGJvb2xlYW4gYikgewotICAgICAgICBtdG9tRW5hYmxlZCA9IGI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYTUxGYXVsdCBnZXRYTUxGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0WE1MRmF1bHQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0WE1MRmF1bHQoWE1MRmF1bHQgeG1sRmF1bHQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgeG1sUGFydC5zZXRYTUxGYXVsdCh4bWxGYXVsdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmlzRmF1bHQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRYTUxQYXJ0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldFhNTFBhcnRDb250ZW50VHlwZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3R5bGUgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiB4bWxQYXJ0LmdldFN0eWxlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQuc2V0U3R5bGUoc3R5bGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUU5hbWUgZ2V0T3BlcmF0aW9uRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0T3BlcmF0aW9uRWxlbWVudCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25FbGVtZW50KFFOYW1lIG9wZXJhdGlvblFOYW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHhtbFBhcnQuc2V0T3BlcmF0aW9uRWxlbWVudChvcGVyYXRpb25RTmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5BdHRhY2htZW50I2dldE1pbWVIZWFkZXJzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGdldE1pbWVIZWFkZXJzKCkgewotICAgICAgICAvLyBMYXppbHkgY3JlYXRlIHRyYW5zcG9ydCBoZWFkZXJzLgotICAgICAgICBpZiAodHJhbnNwb3J0SGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cmFuc3BvcnRIZWFkZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhbnNwb3J0SGVhZGVyczsKLSAgICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5BdHRhY2htZW50I3NldE1pbWVIZWFkZXJzKGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWltZUhlYWRlcnMoTWFwIG1hcCkgewotICAgICAgICB0cmFuc3BvcnRIZWFkZXJzID0gbWFwOwotICAgICAgICBpZiAodHJhbnNwb3J0SGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cmFuc3BvcnRIZWFkZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBCbG9jayBnZXRCb2R5QmxvY2soT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpIAotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0Qm9keUJsb2NrKGNvbnRleHQsIGJsb2NrRmFjdG9yeSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEJvZHlCbG9jayhCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB4bWxQYXJ0LnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFBvc3RQaXZvdCgpIHsKLSAgICAgICAgdGhpcy5wb3N0UGl2b3QgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Bvc3RQaXZvdCgpIHsKLSAgICAgICAgcmV0dXJuIHBvc3RQaXZvdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRJbmRpcmVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHhtbFBhcnQuZ2V0SW5kaXJlY3Rpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SW5kaXJlY3Rpb24oaW50IGluZGlyZWN0aW9uKSB7Ci0gICAgICAgIHhtbFBhcnQuc2V0SW5kaXJlY3Rpb24oaW5kaXJlY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgaWYgKHRoaXMubWVzc2FnZUNvbnRleHQgIT0gbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgICAgIC8vIENvcHkgYXR0YWNobWVudHMgdG8gdGhlIG5ldyBtYXAKLSAgICAgICAgICAgIEF0dGFjaG1lbnRzIG5ld01hcCA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldEF0dGFjaG1lbnRNYXAoKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRzIG9sZE1hcCA9IGF0dGFjaG1lbnRzOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgY2lkOm9sZE1hcC5nZXRBbGxDb250ZW50SURzKCkpIHsKLSAgICAgICAgICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG9sZE1hcC5nZXREYXRhSGFuZGxlcihjaWQpOwotICAgICAgICAgICAgICAgIGlmIChkaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld01hcC5hZGREYXRhSGFuZGxlcihjaWQsIGRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJZiBub3QgTVRPTSBhbmQgdGhlcmUgYXJlIGF0dGFjaG1lbnRzLCBzZXQgU1dBIHN0eWxlCi0gICAgICAgICAgICBpZiAoIWlzTVRPTUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNpZHMgPSBuZXdNYXAuZ2V0QWxsQ29udGVudElEcygpOwotICAgICAgICAgICAgICAgIGlmIChjaWRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfU1dBLCAidHJ1ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNpZDpuZXdNYXAuZ2V0QWxsQ29udGVudElEcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWVzc2FnZSBoYXMgYW4gYXR0YWNobWVudCB3aXRoIGNvbnRlbnQgaWQ9ICIgKyBjaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dGFjaG1lbnRzID0gbmV3TWFwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayBmb3IgY2FjaGVkIGF0dGFjaG1lbnQgZmlsZShzKSBpZiBhdHRhY2htZW50cyBleGlzdC4KLSAgICAgICAgaWYoYXR0YWNobWVudHMgIT0gbnVsbCAmJiAhbWVzc2FnZUNvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuaXNTZXJ2ZXJTaWRlKCkpewotICAgICAgICAJQXR0YWNobWVudFV0aWxzLmZpbmRDYWNoZWRBdHRhY2htZW50KGF0dGFjaG1lbnRzKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdGhpcy5tZXNzYWdlQ29udGV4dCA9IG1lc3NhZ2VDb250ZXh0OwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2luZ1NXQShib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGRvaW5nU1dBID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEb2luZ1NXQSgpIHsKLSAgICAgICAgcmV0dXJuIGRvaW5nU1dBOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKHhtbFBhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgeG1sUGFydC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0SGVhZGVyUU5hbWVzKCkgewotICAgICAgICByZXR1cm4gKHhtbFBhcnQgPT0gbnVsbCkgPyBudWxsIDogeG1sUGFydC5nZXRIZWFkZXJRTmFtZXMoKTsgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFBhcnRCYXNlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MUGFydEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0YTlhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MUGFydEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVhNTFBhcnNlcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlhNTEZhdWx0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0vKioKLSAqIFhNTFBhcnRCYXNlIGNsYXNzIGZvciBhbiBYTUxQYXJ0IEFuIFhNTFBhcnQgaXMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlIHhtbCBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlLgotICogVGhlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBjYW4gYmUgaW4gb25lIG9mIHRocmVlIGRpZmZlcmVudCBmb3JtczogKiBBbiBPTSB0cmVlICogQSBTQUFKCi0gKiBTT0FQRW52ZWxvcGUgKiBBbiBYTUxTcGluZSAoYW4gb3B0aW1pemVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlKSBUaGUgcmVwcmVzZW50YXRpb24gaXMKLSAqIHN0b3JlZCBpbiB0aGUgcHJpdmF0ZSB2YXJpYWJsZSAoY29udGVudCkKLSAqIDxwLz4KLSAqIFRoZSByZXByZXNlbnRhdGlvbiBjaGFuZ2VzIGFzIHRoZSBNZXNzYWdlIGZsb3dzIHRocm91Z2ggdGhlIEpBWC1XUyBmcmFtZXdvcmsuICBGb3IgZXhhbXBsZSwgaGVyZQotICogaXMgYSB0eXBpY2FsIGZsb3cgb24gdGhlIGluYm91bmQgY2FzZTogYSkgTWVzc2FnZSBpcyBidWlsdCBmcm9tIE9NCi0gKiAocmVwcmVzZW50YXRpb246IE9NKSBiKSBNZXNzYWdlIGZsb3dzIGludG8gU09BUCBIYW5kbGVyIGNoYWluICAgICAgICAgICAgICAocmVwcmVzZW50YXRpb246Ci0gKiBPTS0+U09BUEVudmVsb3BlKSBjKSBNZXNzYWdlIGZsb3dzIG91dCBvZiB0aGUgU09BUCBIYW5kbGVyIGNoYWluIGQpIE1lc3NhZ2UgZmxvd3MgaW50byB0aGUKLSAqIGxvZ2ljYWwgZGlzcGF0Y2ggcHJvY2Vzc2luZyAocmVwcmVzZW50YXRpb246IFNPQVBFbnZlbG9wZS0+WE1MU3BpbmUpCi0gKiA8cC8+Ci0gKiBUaGUga2V5IHRvIHBlcmZvcm1hbmNlIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtYXRpb25zIGJldHdlZW4gT00sIFNBQUogU09BUEVudmVsb3BlCi0gKiBhbmQgWE1MU3BpbmUuICAgVGhpcyBiYXNlIGNsYXNzIGRlZmluZXMgYWxsIG9mIHRoZSBtZXRob2RzIHRoYXQgYXJlIHJlcXVpcmVkIG9uIGFuIFhNTFBhcnQsIHRoZQotICogYWN0dWFsIHRyYW5zZm9ybWF0aW9ucyBhcmUgcHJvdmlkZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBUaGlzIGRpdmlzaW9uIG9mIHdvcmsgYWxsb3dzIHRoZQotICogZGVyaXZlZCBjbGFzcyB0byBjb25jZW50cmF0ZSBvbiB0aGUgb3B0aW1pemF0aW9uIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMuICBGb3IgZXhhbXBsZSwgdGhlCi0gKiBkZXJpdmVkIGNsYXNzIG1heSBpbXBsZW1lbnQgWE1MU3BpbmUgLT4gT00gdXNpbmcgT01PYmplY3RXcmFwcGVyRWxlbWVudCBjb25zdHJ1Y3RzLi4udGh1cyBhdm9pZAotICogZXhwZW5zaXZlIHBhcnNpbmcuCi0gKiA8cC8+Ci0gKiBIZXJlIGFyZSB0aGUgbWV0aG9kcyB0aGF0IHRoZSBkZXJpdmVkIFhNTFBhcnQgc2hvdWxkIGltcGxlbWVudC4gT01FbGVtZW50Ci0gKiBfY29udmVydFNFMk9NKFNPQVBFbnZlbG9wZSBzZSkgT01FbGVtZW50IF9jb252ZXJ0U3BpbmUyT00oWE1MU3BpbmUgc3BpbmUpIFNPQVBFbnZlbG9wZQotICogX2NvbnZlcnRPTTJTRShPTUVsZW1lbnQgb20pIFNPQVBFbnZlbG9wZSBfY29udmVydFNwaW5lMlNFKFhNTFNwaW5lIHNwaW5lKSBYTUxTcGluZQotICogX2NvbnZlcnRPTTJTcGluZShPTUVsZW1lbnQgb20pIFhNTFNwaW5lIF9jb252ZXJ0U0UyU3BpbmUoU09BUEVudmVsb3BlIHNlKSBYTUxTcGluZQotICogX2NyZWF0ZVNwaW5lKFByb3RvY29sIHByb3RvY29sKQotICogPHAvPgotICogTk9URTogRm9yIFhNTC9IVFRQIChSRVNUKSwgYSBTT0FQIDEuMS4gRW52ZWxvcGUgaXMgYnVpbHQgYW5kIHRoZSByZXN0IHBheWxvYWQgaXMgcGxhY2VkIGluIHRoZQotICogYm9keS4gIFRoaXMgcHVycG9zZWx5IG1pbWljcyB0aGUgQXhpczIgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydAotICogQHNlZSBYTUxQYXJ0SW1wbAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWE1MUGFydEJhc2UgaW1wbGVtZW50cyBYTUxQYXJ0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxQYXJ0QmFzZS5jbGFzcyk7Ci0KLSAgICBQcm90b2NvbCBwcm90b2NvbCA9IFByb3RvY29sLnVua25vd247ICAvLyBQcm90b2NvbCBkZWZhdWx0cyB0byB1bmtub3duCi0gICAgU3R5bGUgc3R5bGUgPSBTdHlsZS5ET0NVTUVOVDsgICAgICAgICAgLy8gU3R5bGUgZGVmYXVsdHMgdG8gZG9jdW1lbnQKLSAgICBpbnQgaW5kaXJlY3Rpb24gPSAwOyAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IGluZGlyZWN0aW9uIGZvciBEb2N1bWVudAotCi0gICAgLy8gVGhlIGFjdHVhbCB4bWwgcmVwcmVzZW50YXRpb24gaXMgYWx3YXlzIG9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgLy8gICBPTSBpZiB0aGUgY29udGVudCBpcyBhbiBPTSB0cmVlCi0gICAgLy8gICBTT0FQRU5WRUxPUEUgaWYgdGhlIGNvbnRlbnQgaXMgYSBTT0FQRW52ZWxvcGUKLSAgICAvLyAgIFNQSU5FIGlmIHRoZSBjb250ZW50IGlzIGEgT00gInNwaW5lIiArIEJsb2NrcwotICAgIE9iamVjdCBjb250ZW50ID0gbnVsbDsKLSAgICBpbnQgY29udGVudFR5cGUgPSBVTktOT1dOOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE9NID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNPQVBFTlZFTE9QRSA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBTUElORSA9IDM7Ci0KLSAgICBib29sZWFuIGNvbnN1bWVkID0gZmFsc2U7Ci0KLSAgICBNZXNzYWdlSW1wbCBwYXJlbnQ7Ci0KLQotICAgIC8qKgotICAgICAqIFhNTFBhcnQgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIHZpYSB0aGUgWE1MUGFydEZhY3RvcnkuIFRoaXMgY29uc3RydWN0b3IgY29uc3RydWN0cyBhbiBlbXB0eQotICAgICAqIFhNTFBhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBYTUxQYXJ0QmFzZShQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAocHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnVua25vd24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJQcm90b2NvbElzTm90S25vd24iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGVudCA9IF9jcmVhdGVTcGluZShwcm90b2NvbCwgZ2V0U3R5bGUoKSwgZ2V0SW5kaXJlY3Rpb24oKSwgbnVsbCk7Ci0gICAgICAgIHRoaXMucHJvdG9jb2wgPSAoKFhNTFNwaW5lKWNvbnRlbnQpLmdldFByb3RvY29sKCk7Ci0gICAgICAgIGNvbnRlbnRUeXBlID0gU1BJTkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogWE1MUGFydCBzaG91bGQgYmUgY29uc3RydWN0ZWQgdmlhIHRoZSBYTUxQYXJ0RmFjdG9yeS4gVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIFhNTFBhcnQgZnJvbQotICAgICAqIHRoZSBzcGVjaWZpZWQgcm9vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb290Ci0gICAgICogQHBhcmFtIHByb3RvY29sIChpZiBudWxsLCB0aGUgc29hcCBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lc3BhY2UpCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgWE1MUGFydEJhc2UoT01FbGVtZW50IHJvb3QsIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvbnRlbnQgPSByb290OwotICAgICAgICBjb250ZW50VHlwZSA9IE9NOwotICAgICAgICBRTmFtZSBxTmFtZSA9IHJvb3QuZ2V0UU5hbWUoKTsKLSAgICAgICAgaWYgKHByb3RvY29sID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnByb3RvY29sID0gUHJvdG9jb2wuc29hcDExOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBpZiAocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IFByb3RvY29sLnNvYXAxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBQcm90b2NvbC5yZXN0KSB7Ci0gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gUHJvdG9jb2wucmVzdDsKLSAgICAgICAgICAgIC8vIEF4aXMyIHN0b3JlcyBYTUwvSFRUUCBtZXNzYWdlcyBpbnNpZGUgYSBzb2FwMTEgZW52ZWxvcGUuICBXZSB3aWxsIG1pbWljIHRoaXMgYmVoYXZpb3IKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICAvLyBPa2F5Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICAvLyB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgIC8vICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlc3RXaXRoU09BUEVyciIpKTsKLSAgICAgICAgICAgICAgICAvLyBPa2V5Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBfY3JlYXRlU3BpbmUoUHJvdG9jb2wucmVzdCwgU3R5bGUuRE9DVU1FTlQsIDAsIHJvb3QpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gU1BJTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBYTUxQYXJ0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB2aWEgdGhlIFhNTFBhcnRGYWN0b3J5LiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gWE1MUGFydCBmcm9tCi0gICAgICogdGhlIHNwZWNpZmllZCByb290LgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBYTUxQYXJ0QmFzZShTT0FQRW52ZWxvcGUgcm9vdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBjb250ZW50ID0gcm9vdDsKLSAgICAgICAgY29udGVudFR5cGUgPSBTT0FQRU5WRUxPUEU7Ci0gICAgICAgIFN0cmluZyBucyA9IHJvb3QuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChucy5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgIHByb3RvY29sID0gUHJvdG9jb2wuc29hcDExOwotICAgICAgICB9IGVsc2UgaWYgKG5zLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSBQcm90b2NvbC5zb2FwMTI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJSRVNUSXNOb3RTdXBwb3J0ZWQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q29udGVudChPYmplY3QgY29udGVudCwgaW50IGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRDb250ZW50QXNPTUVsZW1lbnQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tID0gbnVsbDsKLSAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkgewotICAgICAgICAgICAgY2FzZSAoT00pOgotICAgICAgICAgICAgICAgIG9tID0gKE9NRWxlbWVudCljb250ZW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAoU1BJTkUpOgotICAgICAgICAgICAgICAgIG9tID0gX2NvbnZlcnRTcGluZTJPTSgoWE1MU3BpbmUpY29udGVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIChTT0FQRU5WRUxPUEUpOgotICAgICAgICAgICAgICAgIG9tID0gX2NvbnZlcnRTRTJPTSgoU09BUEVudmVsb3BlKWNvbnRlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MUGFydEltcGxFcnIyIikpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnQob20sIE9NKTsKLSAgICAgICAgcmV0dXJuIG9tOwotICAgIH0KLQotICAgIHByaXZhdGUgU09BUEVudmVsb3BlIGdldENvbnRlbnRBc1NPQVBFbnZlbG9wZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIHNlID0gbnVsbDsKLSAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkgewotICAgICAgICAgICAgY2FzZSAoU09BUEVOVkVMT1BFKToKLSAgICAgICAgICAgICAgICBzZSA9IChTT0FQRW52ZWxvcGUpY29udGVudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgKFNQSU5FKToKLSAgICAgICAgICAgICAgICBzZSA9IF9jb252ZXJ0U3BpbmUyU0UoKFhNTFNwaW5lKWNvbnRlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAoT00pOgotICAgICAgICAgICAgICAgIHNlID0gX2NvbnZlcnRPTTJTRSgoT01FbGVtZW50KWNvbnRlbnQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MUGFydEltcGxFcnIyIikpOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnQoc2UsIFNPQVBFTlZFTE9QRSk7Ci0gICAgICAgIHJldHVybiBzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFhNTFNwaW5lIGdldENvbnRlbnRBc1hNTFNwaW5lKCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBYTUxTcGluZSBzcGluZSA9IG51bGw7Ci0gICAgICAgIHN3aXRjaCAoY29udGVudFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgKFNQSU5FKToKLSAgICAgICAgICAgICAgICBzcGluZSA9IChYTUxTcGluZSljb250ZW50OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAoU09BUEVOVkVMT1BFKToKLSAgICAgICAgICAgICAgICBzcGluZSA9IF9jb252ZXJ0U0UyU3BpbmUoKFNPQVBFbnZlbG9wZSljb250ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgKE9NKToKLSAgICAgICAgICAgICAgICBzcGluZSA9IF9jb252ZXJ0T00yU3BpbmUoKE9NRWxlbWVudCljb250ZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFBhcnRJbXBsRXJyMiIpKTsKLSAgICAgICAgfQotICAgICAgICBzcGluZS5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICBzZXRDb250ZW50KHNwaW5lLCBTUElORSk7Ci0gICAgICAgIHJldHVybiBzcGluZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0QXNPTUVsZW1lbnQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldEFzT01FbGVtZW50KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0Q29udGVudEFzT01FbGVtZW50KCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldEFzU09BUEVudmVsb3BlKCkKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZSBnZXRBc1NPQVBFbnZlbG9wZSgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldENvbnRlbnRBc1NPQVBFbnZlbG9wZSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRQcm90b2NvbCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBQcm90b2NvbCBnZXRQcm90b2NvbCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3RvY29sOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRTdHlsZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHlsZSBnZXRTdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0eWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0SW5kaXJlY3Rpb24oKQotICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRpcmVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGluZGlyZWN0aW9uOwotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNzZXRTdHlsZShqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSkKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0eWxlIHN0eWxlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnN0eWxlICE9IHN0eWxlKSB7Ci0gICAgICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gU1BJTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IHN3aXRjaCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBYTUxTcGluZQotICAgICAgICAgICAgICAgIGdldENvbnRlbnRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICAgICAgaWYgKHN0eWxlID09IFN0eWxlLlJQQykgewotICAgICAgICAgICAgc2V0SW5kaXJlY3Rpb24oMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRJbmRpcmVjdGlvbigwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluZGlyZWN0aW9uKGludCBpbmRpcmVjdGlvbikgewotICAgICAgICBpZiAodGhpcy5pbmRpcmVjdGlvbiAhPSBpbmRpcmVjdGlvbikgewotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IFNQSU5FKSB7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBzd2l0Y2ggdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gWE1MU3BpbmUKLSAgICAgICAgICAgICAgICBnZXRDb250ZW50QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLmluZGlyZWN0aW9uID0gaW5kaXJlY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE9wZXJhdGlvbkVsZW1lbnQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgIT0gU3R5bGUuUlBDKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSljb250ZW50KS5nZXRCb2R5KCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICBjYXNlIFNQSU5FOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChYTUxTcGluZSljb250ZW50KS5nZXRPcGVyYXRpb25FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBTT0FQRU5WRUxPUEU6Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gKChTT0FQRW52ZWxvcGUpY29udGVudCkuZ2V0Qm9keSgpLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgbmFtZSA9ICgoU09BUEVsZW1lbnQpbm9kZSkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKG5hbWUuZ2V0VVJJKCksIG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25FbGVtZW50KFFOYW1lIG9wZXJhdGlvblFOYW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpbmRpcmVjdGlvbiA9PSAxKSB7Ci0gICAgICAgICAgICB0aGlzLmdldENvbnRlbnRBc1hNTFNwaW5lKCkuc2V0T3BlcmF0aW9uRWxlbWVudChvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRYTUxQYXJ0Q29udGVudFR5cGUoKQotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkgewotICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE9NOgotICAgICAgICAgICAgICAgIHJldHVybiAiT00iOwotICAgICAgICAgICAgY2FzZSBTT0FQRU5WRUxPUEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJTT0FQRU5WRUxPUEUiOwotICAgICAgICAgICAgY2FzZSBTUElORToKLSAgICAgICAgICAgICAgICByZXR1cm4gIlNQSU5FIjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFhNTFN0cmVhbVJlYWRlcihib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0WE1MU3RyZWFtUmVhZGVyKGJvb2xlYW4gY29uc3VtZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAoY29uc3VtZWQpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MUGFydEltcGxFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gU1BJTkUpIHsKLSAgICAgICAgICAgIHJlYWRlciA9IGdldENvbnRlbnRBc1hNTFNwaW5lKCkuZ2V0WE1MU3RyZWFtUmVhZGVyKGNvbnN1bWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGdldENvbnRlbnRBc09NRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnN1bWUpIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNldENvbnN1bWVkKGNvbnN1bWUpOwotICAgICAgICByZXR1cm4gcmVhZGVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRYTUxGYXVsdCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBYTUxGYXVsdCBnZXRYTUxGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBYTUxGYXVsdCB4bWxGYXVsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGlzRmF1bHQoKSkgewotICAgICAgICAgICAgLy8gQW4gWE1MRmF1bHQgcmVwcmVzZW50cyB0aGUgZGV0YWlsIGVsZW1lbnRzIGFzIEJsb2Nrcywgc28gCi0gICAgICAgICAgICAvLyBpdCBtYWtlcyBzZW5zZSB0byBjb252ZXJ0IHRoZSByZXByZXNlbnRhdGlvbiB0byBhIFNwaW5lIHNpbmNlCi0gICAgICAgICAgICAvLyB0aGF0IGlzIHdoYXQgd2UgZG8gaW4gb3RoZXIgc2l0dWF0aW9ucyB3aGVyZSB3ZSBuZWVkIGEgQmxvY2suCi0gICAgICAgICAgICAvLyBPZiBjb3Vyc2UgdGhlcmUgaXMgc29tZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbiB0aGF0IGNvdWxkIGJlIGRvbmUuCi0gICAgICAgICAgICAvLyBJZiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlcmUgYXJlIG5vIGRldGFpbCBlbGVtZW50cywgdGhlbiB3ZSBjb3VsZAotICAgICAgICAgICAgLy8gYnVpbGQgdGhlIGZhdWx0IGZyb20gYW4gT00gb3IgU09BUEVudmVsb3BlLiAgCi0gICAgICAgICAgICBYTUxTcGluZSBzcGluZSA9IGdldENvbnRlbnRBc1hNTFNwaW5lKCk7Ci0gICAgICAgICAgICB4bWxGYXVsdCA9IHNwaW5lLmdldFhNTEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIC8vIEZvciBlYWNoIGJsb2NrIGluIHRoZSB4bWxmYXVsdCwgc2V0IHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBCbG9ja1tdIGJsb2NrcyA9IHhtbEZhdWx0LmdldERldGFpbEJsb2NrcygpOwotICAgICAgICAgICAgaWYgKGJsb2NrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxGYXVsdDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjc2V0WE1MRmF1bHQob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0KQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYTUxGYXVsdChYTUxGYXVsdCB4bWxGYXVsdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBGb3IgZWFjaCBibG9jayBpbiB0aGUgeG1sZmF1bHQsIHNldCB0aGUgbWVzc2FnZQotICAgICAgICBCbG9ja1tdIGJsb2NrcyA9IHhtbEZhdWx0LmdldERldGFpbEJsb2NrcygpOwotICAgICAgICBpZiAoYmxvY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tzW2ldLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2luY2UgdGhlIFhNTEZhdWx0IGNvbnRhaW5zIGRldGFpbCBCbG9ja3MgaXQgbWFrZXMgc2VuY2UgdG8gY29udmVydAotICAgICAgICAvLyB0byBhbiBYTUxTcGluZSBmaXJzdCAoc2luY2UgdGhhdCBpcyB3aGF0IHdlIGRvIGluIHRoZSBvdGhlciBjYWxscyB0aGF0IHNldCBCbG9ja3MpLgotICAgICAgICAvLyBPZiBjb3Vyc2UgaWYgdGhlIFhNTEZhdWx0IGRpZCBub3QgaGF2ZSBkZXRhaWwgQmxvY2tzIHdlIG1pZ2h0IGJlIGFibGUgdG8gCi0gICAgICAgIC8vIGRvIHRoaXMgd2l0aG91dCBhIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBkYXRhLiAgCi0gICAgICAgIFhNTFNwaW5lIHNwaW5lID0gZ2V0Q29udGVudEFzWE1MU3BpbmUoKTsKLSAgICAgICAgc3BpbmUuc2V0WE1MRmF1bHQoeG1sRmF1bHQpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNpc0ZhdWx0KCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvbnN1bWVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFBhcnRJbXBsRXJyMSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBPTToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTEZhdWx0VXRpbHMuaXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSlnZXRDb250ZW50QXNPTUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBTT0FQRU5WRUxPUEU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBYTUxGYXVsdFV0aWxzLmlzRmF1bHQoZ2V0Q29udGVudEFzU09BUEVudmVsb3BlKCkpOwotICAgICAgICAgICAgICAgIGNhc2UgU1BJTkU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50QXNYTUxTcGluZSgpLmlzRmF1bHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNpc0NvbnN1bWVkKCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdW1lZCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVkOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNvdXRwdXRUbyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciwgYm9vbGVhbikKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb25zdW1lZCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxQYXJ0SW1wbEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IFNQSU5FKSB7Ci0gICAgICAgICAgICBnZXRDb250ZW50QXNYTUxTcGluZSgpLm91dHB1dFRvKHdyaXRlciwgY29uc3VtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gZ2V0Q29udGVudEFzT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29uc3VtZSkgewotICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKHdyaXRlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRDb25zdW1lZChjb25zdW1lKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I3RyYWNlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdHJhY2VTdHJpbmcoU3RyaW5nIGluZGVudCkgewotICAgICAgICAvLyBUT0RPCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRCb2R5QmxvY2soaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3RvcnkpCi0gICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRCb2R5QmxvY2soaW50IGluZGV4LCBPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBnZXRDb250ZW50QXNYTUxTcGluZSgpLmdldEJvZHlCbG9jayhpbmRleCwgY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0Qm9keUJsb2NrKGphdmEubGFuZy5PYmplY3QsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeSkKLSAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRCb2R5QmxvY2soT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5nZXRCb2R5QmxvY2soY29udGV4dCwgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJsb2NrOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRIZWFkZXJCbG9jayhqYXZhLmxhbmcuU3RyaW5nLCAKLSAgICAgICogamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5KQotICAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0SGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgT2JqZWN0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2sgYmxvY2sgPQotICAgICAgICAgICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuZ2V0SGVhZGVyQmxvY2sobmFtZXNwYWNlLCBsb2NhbFBhcnQsIGNvbnRleHQsIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgIGlmIChibG9jayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibG9jazsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0SGVhZGVyUU5hbWVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3dpdGNoIChjb250ZW50VHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgT006IHsKLSAgICAgICAgICAgICAgICAgICAgSGFzaFNldDxRTmFtZT4gcW5hbWVzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbSA9IHRoaXMuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9tIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBzZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG9tOwotICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc2UuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IGhlYWRlci5nZXRDaGlsZEVsZW1lbnRzKCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBudWxsICYmIGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgbm9kZSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lcy5hZGQoKChPTUVsZW1lbnQpIG5vZGUpLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBxbmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgU09BUEVOVkVMT1BFOiB7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hTZXQ8UU5hbWU+IHFuYW1lcyA9IG5ldyBIYXNoU2V0PFFOYW1lPigpOwotICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSB0aGlzLmdldENvbnRlbnRBc1NPQVBFbnZlbG9wZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBzZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBub2RlID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZXMuYWRkKCgoU09BUEVsZW1lbnQpIG5vZGUpLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcW5hbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIFNQSU5FOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5nZXRIZWFkZXJRTmFtZXMoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxCbG9jaz4gZ2V0SGVhZGVyQmxvY2tzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbGVQbGF5ZXIgcm9sZVBsYXllcikgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBMaXN0PEJsb2NrPiBibG9ja3MgPQotICAgICAgICAgICAgZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5nZXRIZWFkZXJCbG9ja3MobmFtZXNwYWNlLCBsb2NhbFBhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgYmxvY2tGYWN0b3J5LCByb2xlUGxheWVyKTsKLSAgICAgICAgZm9yKEJsb2NrIGJsb2NrOmJsb2NrcykgewotICAgICAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibG9ja3M7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldE51bUJvZHlCbG9ja3MoKQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bUJvZHlCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50QXNYTUxTcGluZSgpLmdldE51bUJvZHlCbG9ja3MoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0TnVtSGVhZGVyQmxvY2tzKCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXROdW1IZWFkZXJCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDb250ZW50QXNYTUxTcGluZSgpLmdldE51bUhlYWRlckJsb2NrcygpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNyZW1vdmVCb2R5QmxvY2soaW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVCb2R5QmxvY2soaW50IGluZGV4KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkucmVtb3ZlQm9keUJsb2NrKGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjcmVtb3ZlSGVhZGVyQmxvY2soamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBnZXRDb250ZW50QXNYTUxTcGluZSgpLnJlbW92ZUhlYWRlckJsb2NrKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjc2V0Qm9keUJsb2NrKGludCwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soaW50IGluZGV4LCBCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICBnZXRDb250ZW50QXNYTUxTcGluZSgpLnNldEJvZHlCbG9jayhpbmRleCwgYmxvY2spOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjc2V0Qm9keUJsb2NrKGludCwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrKQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9keUJsb2NrKEJsb2NrIGJsb2NrKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjc2V0SGVhZGVyQmxvY2soamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgZ2V0Q29udGVudEFzWE1MU3BpbmUoKS5zZXRIZWFkZXJCbG9jayhuYW1lc3BhY2UsIGxvY2FsUGFydCwgYmxvY2spOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhcHBlbmRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykKLSAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIGdldENvbnRlbnRBc1hNTFNwaW5lKCkuYXBwZW5kSGVhZGVyQmxvY2sobmFtZXNwYWNlLCBsb2NhbFBhcnQsIGJsb2NrKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNnZXRQYXJlbnQoKQotICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBiYWNrcG9pbnRlciB0byB0aGlzIFhNTFBhcnQncyBwYXJlbnQgTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChNZXNzYWdlIHApIHsKLSAgICAgICAgcGFyZW50ID0gKE1lc3NhZ2VJbXBsKSBwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgU09BUEVudmVsb3BlIGludG8gYW4gT00gdHJlZQotICAgICAqCi0gICAgICogQHBhcmFtIHNlIFNPQVBFbnZlbG9wZQotICAgICAqIEByZXR1cm4gT00KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT01FbGVtZW50IF9jb252ZXJ0U0UyT00oU09BUEVudmVsb3BlIHNlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgWE1MU3BpbmUgaW50byBhbiBPTSB0cmVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3BpbmUgWE1MU3BpbmUKLSAgICAgKiBAcmV0dXJuIE9NCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IE9NRWxlbWVudCBfY29udmVydFNwaW5lMk9NKFhNTFNwaW5lIHNwaW5lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgT00gdHJlZSBpbnRvIGEgU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb20KLSAgICAgKiBAcmV0dXJuIFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTT0FQRW52ZWxvcGUgX2NvbnZlcnRPTTJTRShPTUVsZW1lbnQgb20pIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBYTUxTcGluZSBpbnRvIGEgU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3BpbmUKLSAgICAgKiBAcmV0dXJuIFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTT0FQRW52ZWxvcGUgX2NvbnZlcnRTcGluZTJTRShYTUxTcGluZSBzcGluZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IE9NIGludG8gWE1MU3BpbmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBvbQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWE1MU3BpbmUgX2NvbnZlcnRPTTJTcGluZShPTUVsZW1lbnQgb20pIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBTT0FQRW52ZWxvcGUgaW50byBYTUxTUGluZQotICAgICAqCi0gICAgICogQHBhcmFtIFNPQVBFbnZlbG9wZQotICAgICAqIEByZXR1cm4gWE1MU3BpbmUKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWE1MU3BpbmUgX2NvbnZlcnRTRTJTcGluZShTT0FQRW52ZWxvcGUgc2UpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGVtcHR5LCBkZWZhdWx0IHNwaW5lIGZvciB0aGUgc3BlY2lmaWNlZCBwcm90b2NvbAotICAgICAqCi0gICAgICogQHBhcmFtIHByb3RvY29sCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgWE1MU3BpbmUgX2NyZWF0ZVNwaW5lKFByb3RvY29sIHByb3RvY29sLCBTdHlsZSBzdHlsZSwgaW50IGluZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdG8gc2ltcGx5IGNvbnN0cnVjdCB0aGUgc3BpbmUuCi0gICAgICAgIC8vIERlcml2ZWQgY2xhc3NlcyBtYXkgd2lzaCB0byBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQga2luZCBvZiBYTUxTcGluZQotICAgICAgICByZXR1cm4gbmV3IFhNTFNwaW5lSW1wbChwcm90b2NvbCwgc3R5bGUsIGluZGlyZWN0aW9uLCBwYXlsb2FkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q29uc3VtZWQoYm9vbGVhbiBjb25zdW1lKSB7Ci0gICAgICAgIGlmIChjb25zdW1lKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbnN1bWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVidWcgTW9uaXRvcmluZyBXaGVuIEJsb2NrIGlzIENvbnN1bWVkIik7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKEphdmFVdGlscy5zdGFja1RvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3VtZWQgPSBmYWxzZTsKLQkJfQotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgT01FbGVtZW50IG9tID0gZ2V0Q29udGVudEFzT01FbGVtZW50KCk7Ci0gICAgICAgIGlmIChvbSAhPW51bGwpIHsKLSAgICAgICAgICAgIE9NWE1MUGFyc2VyV3JhcHBlciBidWlsZGVyID0gb20uZ2V0QnVpbGRlcigpOwotICAgICAgICAgICAgaWYgKGJ1aWxkZXIgaW5zdGFuY2VvZiBTdEFYQnVpbGRlcikgewotICAgICAgICAgICAgICAgICBTdEFYQnVpbGRlciBzdGF4QnVpbGRlciA9IChTdEFYQnVpbGRlcikgYnVpbGRlcjsKLSAgICAgICAgICAgICAgICAgc3RheEJ1aWxkZXIucmVsZWFzZVBhcnNlck9uQ2xvc2UodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgIGlmICghc3RheEJ1aWxkZXIuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgc3RheEJ1aWxkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgIH0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0RmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0M2Y4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MUGFydEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxQYXJ0RmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0vKiogTWVzc2FnZUZhY3RvcnlJbXBsICovCi1wdWJsaWMgY2xhc3MgWE1MUGFydEZhY3RvcnlJbXBsIGltcGxlbWVudHMgWE1MUGFydEZhY3RvcnkgewotCi0gICAgLyoqIERlZmF1bHQgQ29uc3RydWN0b3IgcmVxdWlyZWQgZm9yIEZhY3RvcnkgKi8KLSAgICBwdWJsaWMgWE1MUGFydEZhY3RvcnlJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxQYXJ0RmFjdG9yeSNjcmVhdGVGcm9tKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyKQotICAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFydCBjcmVhdGVGcm9tKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIocmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOyAgLy8gUGFzcyBudWxsIGhhcyB0aGUgdmVyc2lvbiB0byB0cmlnZ2VyIGF1dG9kZXRlY3Rpb24KLSAgICAgICAgU09BUEVudmVsb3BlIG9tRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShvbUVudmVsb3BlLCBwcm90b2NvbCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlRmFjdG9yeSNjcmVhdGVGcm9tKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFydCBjcmVhdGVGcm9tKE9NRWxlbWVudCBvbUVsZW1lbnQsIFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgWE1MUGFydEltcGwob21FbGVtZW50LCBwcm90b2NvbCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlRmFjdG9yeSNjcmVhdGUob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sKQotICAgICAgKi8KLSAgICBwdWJsaWMgWE1MUGFydCBjcmVhdGUoUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFhNTFBhcnRJbXBsKHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuWE1MUGFydEZhY3RvcnkjY3JlYXRlRnJvbShqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUpCi0gICAgICAqLwotICAgIHB1YmxpYyBYTUxQYXJ0IGNyZWF0ZUZyb20oamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IFhNTFBhcnRJbXBsKHNvYXBFbnZlbG9wZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MUGFydEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFkMmEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxQYXJ0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TQUFKQ29udmVydGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TQUFKQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFhNTFBhcnRJbXBsCi0gKiA8cC8+Ci0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUxQYXJ0QmFzZSBzbyB0aGF0IGl0IGNhbiBkZWZpbmUgdGhlCi0gKiB0cmFuc2Zvcm1hdGlvbnMgYmV0d2VlbiBPTSwgU0FBSiBTT0FQRW52ZWxvcGUgYW5kIFhNTFNwaW5lLgotICoKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbXBsLlhNTFBhcnRCYXNlCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxQYXJ0SW1wbCBleHRlbmRzIFhNTFBhcnRCYXNlIHsKLQotICAgIFNBQUpDb252ZXJ0ZXIgY29udmVydGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFhNTFBhcnQgc2hvdWxkIGJlIGNvbnN0cnVjdGVkIHZpYSB0aGUgWE1MUGFydEZhY3RvcnkuIFRoaXMgY29uc3RydWN0b3IgY29uc3RydWN0cyBhbiBlbXB0eQotICAgICAqIFhNTFBhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHByb3RvY29sCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBYTUxQYXJ0SW1wbChQcm90b2NvbCBwcm90b2NvbCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBzdXBlcihwcm90b2NvbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogWE1MUGFydCBzaG91bGQgYmUgY29uc3RydWN0ZWQgdmlhIHRoZSBYTUxQYXJ0RmFjdG9yeS4gVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIFhNTFBhcnQgZnJvbQotICAgICAqIHRoZSBzcGVjaWZpZWQgcm9vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb290Ci0gICAgICogQHBhcmFtIHByb3RvY29sIChpZiBudWxsLCB0aGUgc29hcCBwcm90b2NvbCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBuYW1lc3BhY2UpCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgWE1MUGFydEltcGwoT01FbGVtZW50IHJvb3QsIFByb3RvY29sIHByb3RvY29sKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHJvb3QsIHByb3RvY29sKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBYTUxQYXJ0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB2aWEgdGhlIFhNTFBhcnRGYWN0b3J5LiBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYW4gWE1MUGFydCBmcm9tCi0gICAgICogdGhlIHNwZWNpZmllZCByb290LgotICAgICAqCi0gICAgICogQHBhcmFtIHJvb3QKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBYTUxQYXJ0SW1wbChTT0FQRW52ZWxvcGUgcm9vdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBzdXBlcihyb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT01FbGVtZW50IF9jb252ZXJ0U0UyT00oU09BUEVudmVsb3BlIHNlKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnRzID0gKHBhcmVudCA9PSBudWxsKSA/IAotICAgICAgICAgICAgICAgIG51bGwgOiBwYXJlbnQuYXR0YWNobWVudHM7Ci0gICAgICAgIHJldHVybiBnZXRTQUFKQ29udmVydGVyKCkudG9PTShzZSwgYXR0YWNobWVudHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBPTUVsZW1lbnQgX2NvbnZlcnRTcGluZTJPTShYTUxTcGluZSBzcGluZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCBvbUVudmVsb3BlID0gc3BpbmUuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgcmV0dXJuIG9tRW52ZWxvcGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNPQVBFbnZlbG9wZSBfY29udmVydE9NMlNFKE9NRWxlbWVudCBvbSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0U0FBSkNvbnZlcnRlcigpLnRvU0FBSigob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSlvbSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFNPQVBFbnZlbG9wZSBfY29udmVydFNwaW5lMlNFKFhNTFNwaW5lIHNwaW5lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBfY29udmVydE9NMlNFKF9jb252ZXJ0U3BpbmUyT00oc3BpbmUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgWE1MU3BpbmUgX2NvbnZlcnRPTTJTcGluZShPTUVsZW1lbnQgb20pIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYTUxTcGluZUltcGwoKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpb20sIGdldFN0eWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluZGlyZWN0aW9uKCksIGdldFByb3RvY29sKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTcGluZSBfY29udmVydFNFMlNwaW5lKFNPQVBFbnZlbG9wZSBzZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gX2NvbnZlcnRPTTJTcGluZShfY29udmVydFNFMk9NKHNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgU0FBSkNvbnZlcnRlcgotICAgICAqIEByZXR1cm4gU0FBSkNvbnZlcnRlcgotICAgICAqLwotICAgIHByb3RlY3RlZCBTQUFKQ29udmVydGVyIGdldFNBQUpDb252ZXJ0ZXIoKSB7Ci0gICAgICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkgZmFjdG9yeSA9ICgKLSAgICAgICAgICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU0FBSkNvbnZlcnRlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgY29udmVydGVyID0gZmFjdG9yeS5nZXRTQUFKQ29udmVydGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlcjsKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MU3BpbmUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTcGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmEyYTNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTcGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5CbG9ja0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogWE1MU3BpbmUKLSAqIDxwLz4KLSAqIEFuIFhNTFNwaW5lIGlzIGFuIG9wdGltaXplZCBmb3JtIG9mIHRoZSB4bWwgcGFydCBvZiB0aGUgbWVzc2FnZS4gQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgb25lCi0gKiBpbXBsZW1lbnRhdGlvbiAoWE1MU3BpbmVJbXBsKS4KLSAqCi0gKiBAc2VlIFhNTFNwaW5lSW1wbCBmb3IgbW9yZSBkZXRhaWxzCi0gKi8KLWludGVyZmFjZSBYTUxTcGluZSB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcm90b2NvbCBmb3IgdGhpcyBNZXNzYWdlIChzb2FwMTEsIHNvYXAxMiwgZXRjLikKLSAgICAgKgotICAgICAqIEByZXR1cm4gUHJvdG9jbAotICAgICAqLwotICAgIHB1YmxpYyBQcm90b2NvbCBnZXRQcm90b2NvbCgpOwotCi0gICAgLyoqCi0gICAgICogV3JpdGUgb3V0IHRoZSBNZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyICBYTUxTdHJlYW1Xcml0ZXIKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgYmxvY2suCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0cHV0VG8oWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjb25zdW1lKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgWE1MU3RyZWFtUmVhZGVyIHJlcHJlc2VudGVkIGJ5IHRoaXMgTWVzc2FnZSBmb3IgdGhlIHhtbCBwYXJ0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uc3VtZSB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVxdWVzdCBvbiB0aGUgTWVzc2FnZQotICAgICAqIEByZXR1cm4gWE1MU3RyZWFtUmVhZGVyCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihib29sZWFuIGNvbnN1bWUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqIEByZXR1cm4gdGhlIFN0eWxlIChkb2N1bWVudCBvciBycGMpICovCi0gICAgcHVibGljIFN0eWxlIGdldFN0eWxlKCk7Ci0KLSAgICAvKiogQHJldHVybiB0aGUgUU5hbWUgb2YgdGhlIG9wZXJhdGlvbiBlbGVtZW50IGlmIFN0eWxlLnJwYy4gIE90aGVyd2lzZSBudWxsICovCi0gICAgcHVibGljIFFOYW1lIGdldE9wZXJhdGlvbkVsZW1lbnQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3BlcmF0aW9uIGVsZW1lbnQgcW5hbWUuICBUaGUgb3BlcmF0aW9uIHFuYW1lIGlzIG9ubHkgdXNlZCBpZiBTdHlsZS5ycGMKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25RTmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkVsZW1lbnQoUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogaXNDb25zdW1lZCBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGFydCBpcyBjb25zdW1lZC4gIE9uY2UgY29uc3VtZWQsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgcGFydAotICAgICAqIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJsb2NrIGlzIGNvbnN1bWVkIChhIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggY29uc3VtZT10cnVlKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3VtZWQoKTsKLQotICAgIC8qKgotICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgWE1MUGFydCByZXByZXNlbnRzIGEgRmF1bHQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSByZXByZXNlbnRzIGEgZmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgWE1MUGFydCByZXByZXNlbnRzIGEgZmF1bHQsIGFuIFhNTEZhdWx0IGlzIHJldHVybmVkIHdoaWNoIGRlc2NyaWJlcyB0aGUgZmF1bHQgaW4gYQotICAgICAqIHByb3RvY29sIGFnbm9zdGljIG1hbm5lcgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgWE1MRmF1bHQgb2JqZWN0IG9yIG51bGwKLSAgICAgKiBAc2VlIFhNTEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIFhNTEZhdWx0IGdldFhNTEZhdWx0KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDaGFuZ2UgdGhlIFhNTFBhcnQgc28gdGhhdCBpdCByZXByZXNlbnRzIHRoZSBmYXVsdCBkZXNjcmliZWQgYnkgWE1MRmF1bHQKLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxmYXVsdAotICAgICAqIEBzZWUgWE1MRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYTUxGYXVsdChYTUxGYXVsdCB4bWxGYXVsdCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXRBc09NRWxlbWVudCBHZXQgdGhlIHhtbCBwYXJ0IGFzIGEgcmVhZC93cml0ZSBPTQotICAgICAqCi0gICAgICogQHJldHVybiBPTUVsZW1lbnQgKHByb2JhYmx5IE9NIFNPQVBFbnZlbG9wZSkKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldEFzT01FbGVtZW50KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBnZXROdW1Cb2R5QmxvY2tzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBib2R5IGJsb2NrcwotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtQm9keUJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0Qm9keUJsb2NrIEdldCB0aGUgYm9keSBibG9jayBhdCB0aGUgc3BlY2lmaWNlZCBpbmRleC4gVGhlIEJsb2NrRmFjdG9yeSBhbmQgb2JqZWN0IAotICAgICAqIGNvbnRleHQgYXJlIHBhc3NlZCBpbiB0byBoZWxwIGNyZWF0ZSB0aGUgcHJvcGVyIGtpbmQgb2YgYmxvY2suIENhbGxpbmcgdGhpcyBtZXRob2QgCi0gICAgICogd2lsbCBjYWNoZSB0aGUgT00uCi0gICAgICogQXZvaWQgaXQgaW4gcGVyZm9ybWFudCBzaXR1YXRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmxvY2tGYWN0b3J5Ci0gICAgICogQHJldHVybiBCbG9jayBvciBudWxsCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICogQHNlZSBnZXRCb2R5QmxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2sgZ2V0Qm9keUJsb2NrKGludCBpbmRleCwgT2JqZWN0IGNvbnRleHQsIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIGdldEJvZHlCbG9jayBHZXQgdGhlIHNpbmdsZSBCb2R5IEJsb2NrLiBUaGUgQmxvY2tGYWN0b3J5IGFuZCBvYmplY3QgY29udGV4dCBhcmUgcGFzc2VkIGluIHRvCi0gICAgICogaGVscCBjcmVhdGUgdGhlIHByb3BlciBraW5kIG9mIGJsb2NrLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24KLSAgICAgKiB0aGF0IHRoZXJlIGlzIHplcm8gb3Igb25lIGJsb2NrLgotICAgICAqCi0gICAgICogQHBhcmFtIGluZGV4Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmxvY2tGYWN0b3J5Ci0gICAgICogQHJldHVybiBCbG9jayBvciBudWxsCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogc2V0Qm9keUJsb2NrIFNldCB0aGUgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBPbmNlIHNldCwgdGhlIE1lc3NhZ2Ugb3ducyB0aGUgYmxvY2suICBZb3UKLSAgICAgKiBtdXN0IHVzZSB0aGUgZ2V0Qm9keUJsb2NrIG1ldGhvZCB0byBhY2Nlc3MgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcGFyYW0gYmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soaW50IGluZGV4LCBCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBzZXRCb2R5QmxvY2sgU2V0IHRoaXMgYXMgYmxvY2sgYXMgdGhlIHNpbmdsZSBibG9jayBmb3IgdGhlIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXgKLSAgICAgKiBAcGFyYW0gYmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogcmVtb3ZlQm9keUJsb2NrIFJlbW92ZXMgdGhlIGluZGljYXRlZCBCb2R5QmxvY2sKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJvZHlCbG9jayhpbnQgaW5kZXgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBnZXROdW1IZWFkZXJCbG9ja3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGhlYWRlciBibG9ja3MKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE51bUhlYWRlckJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0SGVhZGVyQmxvY2sgR2V0IHRoZSBmaXJzdCBoZWFkZXIgYmxvY2sgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0gICAgICogVGhlIEJsb2NrRmFjdG9yeSBhbmQgb2JqZWN0Ci0gICAgICogY29udGV4dCBhcmUgcGFzc2VkIGluIHRvIGhlbHAgY3JlYXRlIHRoZSBwcm9wZXIga2luZCBvZiBibG9jay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gYmxvY2tGYWN0b3J5Ci0gICAgICogQHJldHVybiBCbG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCbG9jayBnZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIGdldEhlYWRlckJsb2NrIAotICAgICAqIEdldCB0aGUgaGVhZGVyIGJsb2NrcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiBUaGUgQmxvY2tGYWN0b3J5IGFuZCBvYmplY3QKLSAgICAgKiBjb250ZXh0IGFyZSBwYXNzZWQgaW4gdG8gaGVscCBjcmVhdGUgdGhlIHByb3BlciBraW5kIG9mIGJsb2NrLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBibG9ja0ZhY3RvcnkKLSAgICAgKiBAcGFyYW0gcm9sZVBsYXllcihpZiBzZXQpIGluZGljYXRlcyB0aGUgUm9sZXMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZAotICAgICAqIEByZXR1cm4gQmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxCbG9jaz4gZ2V0SGVhZGVyQmxvY2tzKFN0cmluZyBuYW1lc3BhY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHNldEhlYWRlckJsb2NrIAotICAgICAqIHJlcGxhY2VzIHRoZSBmaXJzdCBleGlzdGluZyBoZWFkZXIgYmxvY2sgd2l0aCB0aGlzIG5ldyBibG9jay4gIElmIHRoZXJlIGlzIG5vCi0gICAgICogZXhpc3RpbmcgaGVhZGVyIGJsb2NrLCBvbmUgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVycwotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBsb2NhbFBhcnQKLSAgICAgKiBAcGFyYW0gYmxvY2sKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJCbG9jayhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxQYXJ0LCBCbG9jayBibG9jaykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogYXBwZW5kSGVhZGVyQmxvY2sgCi0gICAgICogQXBwZW5kIHRoZSBibG9jayB0byB0aGUgbGlzdCBvZiBoZWFkZXIgYmxvY2tzLiBUaGUgTWVzc2FnZSBvd25zIHRoZSBibG9jay4KLSAgICAgKiBZb3UgbXVzdCB1c2UgdGhlIGdldEhlYWRlckJsb2NrIG1ldGhvZCB0byBhY2Nlc3MgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGxvY2FsUGFydAotICAgICAqIEBwYXJhbSBibG9jawotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKQotICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFNldCBvZiBRTmFtZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJRTmFtZXMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiByZW1vdmVQYXlsb2FkIAotICAgICAqIFJlbW92ZXMgYWxsIGhlYWRlciBibG9ja3Mgd2l0aCB0aGlzIG5hbWVzcGFjZS9sb2NhbHBhcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSB0cmFjZVN0cmluZy4uLnRoZSB0cmFjZSBzdHJpbmcgZHVtcHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBCbG9jayB3aXRob3V0IGZvcmNpbmcgYW4KLSAgICAgKiB1bmRlcmx5aW5nIGlsbC1wZXJmb3JtYW50IHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyB0cmFjZSBpbmZvcm1hdGlvbgotICAgICAqIEBib29sZWFuIGluZGVudCBTdHJpbmcgY29udGFpbmluZyBpbmRlbnQgY2hhcmFjdGVycwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdHJhY2VTdHJpbmcoU3RyaW5nIGluZGVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGlkZW50aWZ5IHRoZSBNZXNzYWdlIHBhcmVudCBvZiB0aGUgWE1MU3BpbmUKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoTWVzc2FnZSBtc2cpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MU3BpbmVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MU3BpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDAyNDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9pbXBsL1hNTFNwaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NQ29udGFpbmVyRXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmxsb20uc29hcDExLlNPQVAxMUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5PTUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxGYXVsdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogWE1MU3BpbmVJbXBsCi0gKiA8cC8+Ci0gKiBBbiBYTUxTcGluZSBjb25zaXN0cyBpcyBhbiBPTUVudmVsb3BlIChlaXRoZXIgYSBkZWZhdWx0IG9uZSBvciBvbmUgY3JlYXRlIGZyb20gYW4gaW5jb21pbmcKLSAqIG1lc3NhZ2UpLiBBcyBCbG9ja3MgYXJlIGFkZGVkIG9yIHJlcXVlc3RlZCwgdGhleSBhcmUgcGxhY2VkIGluIHRoZSB0cmVlIGFzIE9NU291cmNlZEVsZW1lbnRzLgotICogPHAvPgotICogTk9URTogRm9yIFhNTC9IVFRQIChSRVNUKSBtZXNzYWdlcywgYSBTT0FQIDEuMSBlbnZlbG9wZSBpcyBidWlsdCBhbmQgdGhlIHhtbCBwYXlsb2FkIGlzIAotICogcGxhY2VkIGluIHRoZSBib2R5LiAgVGhpcyBwdXJwb3NlbHkgbWltaWNzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IEF4aXMyLgotICovCi1jbGFzcyBYTUxTcGluZUltcGwgaW1wbGVtZW50cyBYTUxTcGluZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWE1MU3BpbmVJbXBsLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBPTUJsb2NrRmFjdG9yeSBvYmYgPQotICAgICAgICAgICAgKE9NQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgUHJvdG9jb2wgcHJvdG9jb2wgPSBQcm90b2NvbC51bmtub3duOwotICAgIHByaXZhdGUgU3R5bGUgc3R5bGUgPSBTdHlsZS5ET0NVTUVOVDsKLSAgICBwcml2YXRlIGludCBpbmRpcmVjdGlvbiA9IDA7Ci0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgcm9vdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29uc3VtZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIE1lc3NhZ2UgcGFyZW50ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGxpZ2h0d2VpZ2h0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcHJvdG9jb2wgKGkuZS4gdGhlIEVudmVsb3BlLCBIZWFkZXIgYW5kIEJvZHkpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wgICAgICAgUHJvdG9jb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUgICAgICAgICAgU3R5bGUKLSAgICAgKiBAcGFyYW0gaW5kaXJlY3Rpb24gICAgKDAgb3IgMSkgaW5kaWNhdGVzIGxvY2F0aW9uIG9mIGJvZHkgYmxvY2tzCi0gICAgICogQHBhcmFtIGluaXRpYWxQYXlsb2FkIChPTUVsZW1lbnQgb3IgbnVsbC4uLnVzZWQgdG8gYWRkIHJlc3QgcGF5bG9hZCkKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3BpbmVJbXBsKFByb3RvY29sIHByb3RvY29sLCBTdHlsZSBzdHlsZSwgaW50IGluZGlyZWN0aW9uLCBPTUVsZW1lbnQgcGF5bG9hZCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICAgICAgdGhpcy5pbmRpcmVjdGlvbiA9IGluZGlyZWN0aW9uOwotICAgICAgICBzb2FwRmFjdG9yeSA9IF9nZXRGYWN0b3J5KHByb3RvY29sKTsKLSAgICAgICAgcm9vdCA9IF9jcmVhdGVFbXB0eUVudmVsb3BlKHN0eWxlLCBzb2FwRmFjdG9yeSk7Ci0gICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwpIHsKLSAgICAgICAgICAgICgoU09BUEVudmVsb3BlKXJvb3QpLmdldEJvZHkoKS5hZGRDaGlsZChwYXlsb2FkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBzcGluZSBmcm9tIGFuIGV4aXN0aW5nIE9NIHRyZWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnZlbG9wZQotICAgICAqIEBwYXJhbSBzdHlsZSAgICAgICBTdHlsZQotICAgICAqIEBwYXJhbSBpbmRpcmVjdGlvbiAoMCBvciAxKSBpbmRpY2F0ZXMgbG9jYXRpb24gb2YgYm9keSBibG9ja3MKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3BpbmVJbXBsKFNPQVBFbnZlbG9wZSBlbnZlbG9wZSwgU3R5bGUgc3R5bGUsIGludCBpbmRpcmVjdGlvbiwgUHJvdG9jb2wgcHJvdG9jb2wpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICAgICAgdGhpcy5pbmRpcmVjdGlvbiA9IGluZGlyZWN0aW9uOwotICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7Ci0gICAgICAgIGluaXQoZW52ZWxvcGUpOwotICAgICAgICAvLyBJZiBudWxsLCBkZXRlY3QgcHJvdG9jb2wgZnJvbSBzb2FwIG5hbWVzcGFjZQotICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJvb3QuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBQcm90b2NvbC5zb2FwMTE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJvb3QuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkgewotICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBQcm90b2NvbC5zb2FwMTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW52ZWxvcGUKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdChTT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcm9vdCA9IGVudmVsb3BlOwotICAgICAgICBzb2FwRmFjdG9yeSA9IE1lc3NhZ2VVdGlscy5nZXRTT0FQRmFjdG9yeShyb290KTsKLQotICAgICAgICAvLyBBZHZhbmNlIHBhc3QgdGhlIGhlYWRlcgotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IHJvb3QuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaGVhZGVyID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEhlYWRlcihyb290KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBhZHZhbmNlIHRoZSBwYXJzZXIgdG8gdGhlIGJvZHkgZWxlbWVudAotICAgICAgICBTT0FQQm9keSBib2R5ID0gcm9vdC5nZXRCb2R5KCk7Ci0gICAgICAgIGlmIChib2R5ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgYm9keSBpZiBvbmUgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgICAgIGJvZHkgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQQm9keShyb290KTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxQYXJ0I2dldFByb3RvY29sKCkKLSAgICAgICovCi0gICAgcHVibGljIFByb3RvY29sIGdldFByb3RvY29sKCkgewotICAgICAgICByZXR1cm4gcHJvdG9jb2w7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0UGFyZW50KCkKLSAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKgotICAgICogU2V0IHRoZSBiYWNrcG9pbnRlciB0byB0aGlzIFhNTFBhcnQncyBwYXJlbnQgTWVzc2FnZQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KE1lc3NhZ2UgcCkgewotICAgICAgICBwYXJlbnQgPSBwOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MUGFydCNvdXRwdXRUbyhqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlciwgCi0gICAgICAqIGJvb2xlYW4pCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dFRvKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsIGJvb2xlYW4gY29uc3VtZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKGdldFhNTFN0cmVhbVJlYWRlcihjb25zdW1lKSk7Ci0gICAgICAgIHIydy5vdXRwdXRUbyh3cml0ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0WE1MU3RyZWFtUmVhZGVyKGJvb2xlYW4gY29uc3VtZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAoY29uc3VtZSkgewotICAgICAgICAgICAgaWYgKHJvb3QuZ2V0QnVpbGRlcigpICE9IG51bGwgJiYgIXJvb3QuZ2V0QnVpbGRlcigpLmlzQ29tcGxldGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByb290LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLlhNTFNwaW5lI2dldFhNTEZhdWx0KCkKLSAgICAgICovCi0gICAgcHVibGljIFhNTEZhdWx0IGdldFhNTEZhdWx0KCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBpZiAoIWlzRmF1bHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZHZhbmNlIHRocm91Z2ggYWxsIG9mIHRoZSBkZXRhaWwgYmxvY2tzCi0gICAgICAgIGludCBudW1EZXRhaWxCbG9ja3MgPSBnZXROdW1EZXRhaWxCbG9ja3MoKTsKLQotICAgICAgICBCbG9ja1tdIGJsb2NrcyA9IG51bGw7Ci0gICAgICAgIGlmIChudW1EZXRhaWxCbG9ja3MgPiAwKSB7Ci0gICAgICAgICAgICBibG9ja3MgPSBuZXcgQmxvY2tbbnVtRGV0YWlsQmxvY2tzXTsKLSAgICAgICAgICAgIFNPQVBGYXVsdERldGFpbCBkZXRhaWwgPSByb290LmdldEJvZHkoKS5nZXRGYXVsdCgpLmdldERldGFpbCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1EZXRhaWxCbG9ja3M7IGkrKykgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbSA9IHRoaXMuX2dldENoaWxkT01FbGVtZW50KGRldGFpbCwgaSk7Ci0gICAgICAgICAgICAgICAgYmxvY2tzW2ldID0gdGhpcy5fZ2V0QmxvY2tGcm9tT01FbGVtZW50KG9tLCBudWxsLCBvYmYsIGZhbHNlKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgWE1MRmF1bHQgeG1sRmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVhNTEZhdWx0KHJvb3QuZ2V0Qm9keSgpLmdldEZhdWx0KCksIGJsb2Nrcyk7Ci0gICAgICAgIHJldHVybiB4bWxGYXVsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXROdW1EZXRhaWxCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IHJvb3QuZ2V0Qm9keSgpLmdldEZhdWx0KCk7Ci0gICAgICAgICAgICByZXR1cm4gX2dldE51bUNoaWxkRWxlbWVudHMoZmF1bHQuZ2V0RGV0YWlsKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhNTEZhdWx0KFhNTEZhdWx0IHhtbEZhdWx0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQ2xlYXIgb3V0IHRoZSBleGlzdGluZyBib2R5IGFuZCBkZXRhaWwgYmxvY2tzCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByb290LmdldEJvZHkoKTsKLSAgICAgICAgZ2V0TnVtRGV0YWlsQmxvY2tzKCk7IC8vIEZvcmNlcyBwYXJzZSBvZiBleGlzdGluZyBkZXRhaWwgYmxvY2tzCi0gICAgICAgIGdldE51bUJvZHlCbG9ja3MoKTsgIC8vIEZvcmNlcyBwYXJzZSBvdmVyIGJvZHkKLSAgICAgICAgT01Ob2RlIGNoaWxkID0gYm9keS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoaWxkLmRldGFjaCgpOwotICAgICAgICAgICAgY2hpbGQgPSBib2R5LmdldEZpcnN0T01DaGlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIGEgU09BUEZhdWx0IHRvIHRoZSBib2R5LgotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gWE1MRmF1bHRVdGlscy5jcmVhdGVTT0FQRmF1bHQoeG1sRmF1bHQsIGJvZHksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN1bWVkKCkgewotICAgICAgICByZXR1cm4gY29uc3VtZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRBc09NRWxlbWVudCgpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0TnVtQm9keUJsb2NrcygpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TnVtQm9keUJsb2NrcygpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIF9nZXROdW1DaGlsZEVsZW1lbnRzKF9nZXRCb2R5QmxvY2tQYXJlbnQoKSk7Ci0gICAgfQotCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuWE1MU3BpbmUjZ2V0Qm9keUJsb2NrKGludCwgamF2YS5sYW5nLk9iamVjdCwgCi0gICAgICAqIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeSkKLSAgICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhpbnQgaW5kZXgsIE9iamVjdCBjb250ZXh0LCBCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCb2R5QmxvY2s6IEdldCB0aGUgIiArIGluZGV4ICsgImJsb2NrIHVzaW5nIHRoZSBibG9jayBmYWN0b3J5LCAiICsKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZvcmNlcyB0aGUgcGFyc2VyIHRvIHJlYWQgYWxsIG9mIHRoZSBibG9ja3MKLSAgICAgICAgZ2V0TnVtQm9keUJsb2NrcygpOwotCi0gICAgICAgIC8vIEdldCB0aGUgaW5kaWNhdGVkIGJsb2NrCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBfZ2V0Q2hpbGRPTUVsZW1lbnQoX2dldEJvZHlCbG9ja1BhcmVudCgpLCBpbmRleCk7Ci0gICAgICAgIGlmIChvbUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTnVsbCBpbmRpY2F0ZXMgdGhhdCBubyBibG9jayBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Qm9keUJsb2NrOiBUaGUgYmxvY2sgd2FzIG5vdCBmb3VuZCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCb2R5QmxvY2s6IEZvdW5kIG9tRWxlbWVudCAiICsgb21FbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLl9nZXRCbG9ja0Zyb21PTUVsZW1lbnQob21FbGVtZW50LCBjb250ZXh0LCBibG9ja0ZhY3RvcnksIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLlhNTFNwaW5lI2dldEJvZHlCbG9jayhpbnQsIGphdmEubGFuZy5PYmplY3QsIAotICAgICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5KQotICAgICovCi0gICAgcHVibGljIEJsb2NrIGdldEJvZHlCbG9jayhPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Qm9keUJsb2NrIFBFUkZPUk1BTlQ6IEdldCB0aGUgYmxvY2sgdXNpbmcgdGhlIGJsb2NrIGZhY3RvcnksICIgKwotICAgICAgICAgICAgICAgICAgICBibG9ja0ZhY3RvcnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyBOZWVkIHRvIHVwZ3JhZGUgdGhlIGNvZGUgdG8gZ2V0IEJsb2NrcyB0aGF0IHJlcHJlc2VudCB0ZXh0IGFuZCBlbGVtZW50cy4KLQotICAgICAgICAvLyBDYWxsaW5nIGdldEJvZHlCbG9jayBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgb3IgemVybyBib2R5IGJsb2NrcyBpbiB0aGUgbWVzc2FnZS4KLSAgICAgICAgLy8gU3Vic2VxdWVudCBCbG9ja3MgYXJlIGxvc3QuICBJZiB0aGUgY2FsbGVyIG5lZWRzIGFjY2VzcyB0byBtdWx0aXBsZSBib2R5IGJsb2NrcywgCi0gICAgICAgIC8vIHRoZW4gZ2V0Qm9keUJsb2NrcyhpbmRleCwuLi4pIHNob3VsZCBiZSB1c2VkCi0KLSAgICAgICAgLy8gR2V0IHRoZSBpbmRpY2F0ZWQgYmxvY2sKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IF9nZXRDaGlsZE9NRWxlbWVudChfZ2V0Qm9keUJsb2NrUGFyZW50KCksIDApOwotICAgICAgICBpZiAob21FbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE51bGwgaW5kaWNhdGVzIHRoYXQgbm8gYmxvY2sgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImdldEJvZHlCbG9jazogVGhlIGJsb2NrIHdhcyBub3QgZm91bmQgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0Qm9keUJsb2NrOiBGb3VuZCBvbUVsZW1lbnQgIiArIG9tRWxlbWVudC5nZXRRTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QmxvY2tGcm9tT01FbGVtZW50KG9tRWxlbWVudCwgY29udGV4dCwgYmxvY2tGYWN0b3J5LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soaW50IGluZGV4LCBCbG9jayBibG9jaykgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEZvcmNlcyB0aGUgcGFyc2VyIHRvIHJlYWQgYWxsIG9mIHRoZSBibG9ja3MKLSAgICAgICAgZ2V0TnVtQm9keUJsb2NrcygpOwotCi0gICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIE9NRWxlbWVudCBiRWxlbWVudCA9IF9nZXRCb2R5QmxvY2tQYXJlbnQoKTsKLSAgICAgICAgT01FbGVtZW50IG9tID0gdGhpcy5fZ2V0Q2hpbGRPTUVsZW1lbnQoYkVsZW1lbnQsIGluZGV4KTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgaXMgc3VwcG9zZWQgdG8gcmVwcmVzZW50IGEgc2luZ2xlIGVsZW1lbnQuICAKLSAgICAgICAgLy8gQnV0IGlmIGl0IGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbGVtZW50ICwgdGhlIGZvbGxvd2luZyB3aWxsIGZhaWwuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0UHJlZml4KCkpOwotCi0gICAgICAgIE9NRWxlbWVudCBuZXdPTSA9IF9jcmVhdGVPTUVsZW1lbnRGcm9tQmxvY2socU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5zLCBibG9jaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnksIGZhbHNlKTsKLSAgICAgICAgaWYgKG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIGJFbGVtZW50LmFkZENoaWxkKG5ld09NKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tLmluc2VydFNpYmxpbmdCZWZvcmUobmV3T00pOwotICAgICAgICAgICAgb20uZGV0YWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCb2R5QmxvY2soQmxvY2sgYmxvY2spIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBGb3JjZXMgdGhlIHBhcnNlciB0byByZWFkIGFsbCBvZiB0aGUgYmxvY2tzCi0gICAgICAgIGdldE51bUJvZHlCbG9ja3MoKTsKLQotICAgICAgICBibG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgb2YgdGhlIGNoaWxkcmVuCi0gICAgICAgIE9NRWxlbWVudCBiRWxlbWVudCA9IF9nZXRCb2R5QmxvY2tQYXJlbnQoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBiRWxlbWVudC5nZXRDaGlsZHJlbigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChibG9jay5pc0VsZW1lbnREYXRhKCkpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayBpcyBlbGVtZW50IGRhdGEgdGhlbiAgaXQgaXMgc2FmZSB0byBjcmVhdGUKLSAgICAgICAgICAgIC8vIGFuIE9NRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGJsb2NrCi0KLSAgICAgICAgICAgIC8vIFRoZSBibG9jayBpcyBzdXBwb3NlZCB0byByZXByZXNlbnQgYSBzaW5nbGUgZWxlbWVudC4gIAotICAgICAgICAgICAgLy8gQnV0IGlmIGl0IGRvZXMgbm90IHJlcHJlc2VudCBhbiBlbGVtZW50ICwgdGhlIGZvbGxvd2luZyB3aWxsIGZhaWwuCi0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0UHJlZml4KCkpOwotCi0gICAgICAgICAgICBPTUVsZW1lbnQgbmV3T00gPSBfY3JlYXRlT01FbGVtZW50RnJvbUJsb2NrKHFOYW1lLmdldExvY2FsUGFydCgpLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIHNvYXBGYWN0b3J5LCBmYWxzZSk7Ci0gICAgICAgICAgICBiRWxlbWVudC5hZGRDaGlsZChuZXdPTSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkLCBidXQgZm9yIG5vdyB3ZSB3aWxsIHJlcXVpcmUgdGhhdCB0aGVyZSBtdXN0IGJlIGFuIAotICAgICAgICAgICAgLy8gZWxlbWVudC4uLm90aGVyd2lzZSBubyBibG9jayBpcyBhZGRlZAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRQcmVmaXgoKSk7Ci0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbmV3T00gPSBfY3JlYXRlT01FbGVtZW50RnJvbUJsb2NrKHFOYW1lLmdldExvY2FsUGFydCgpLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBzb2FwRmFjdG9yeSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGJFbGVtZW50LmFkZENoaWxkKG5ld09NKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBwYXNzIGEgU291cmNlIG9yIFN0cmluZyB0aGF0IGRvZXMgbm90ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXZlIGFuIHhtbCBlbGVtZW50LiBQcm9jZXNzaW5nIGNvbnRpbnVlcyB3aXRoIGFuIGVtcHR5IHBheWxvYWQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQm9keUJsb2NrKGludCBpbmRleCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBGb3JjZXMgdGhlIHBhcnNlciB0byByZWFkIGFsbCBvZiB0aGUgYmxvY2tzCi0gICAgICAgIGdldE51bUJvZHlCbG9ja3MoKTsKLQotICAgICAgICBPTUVsZW1lbnQgb20gPSB0aGlzLl9nZXRDaGlsZE9NRWxlbWVudChfZ2V0Qm9keUJsb2NrUGFyZW50KCksIGluZGV4KTsKLSAgICAgICAgaWYgKG9tICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9tLmRldGFjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1IZWFkZXJCbG9ja3MoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBfZ2V0TnVtQ2hpbGRFbGVtZW50cyhyb290LmdldEhlYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmxvY2sgZ2V0SGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgT2JqZWN0IGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IG9tID0gX2dldENoaWxkT01FbGVtZW50KHJvb3QuZ2V0SGVhZGVyKCksIG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgaWYgKG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLl9nZXRCbG9ja0Zyb21PTUVsZW1lbnQob20sIGNvbnRleHQsIGJsb2NrRmFjdG9yeSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEJsb2NrPiBnZXRIZWFkZXJCbG9ja3MoU3RyaW5nIG5hbWVzcGFjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8QmxvY2s+IGJsb2NrcyA9IG5ldyBBcnJheUxpc3Q8QmxvY2s+KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgT01FbGVtZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUgaGVhZGVyIG5hbWUKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSByb290LmdldEhlYWRlcigpOwotICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBibG9ja3M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBoZWFkZXJzIHRoYXQgaGF2ZSBhIGFjY2VwdGFibGUgcm9sZQotICAgICAgICBJdGVyYXRvciBpdCA9IG51bGw7Ci0gICAgICAgIGlmIChyb2xlUGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGl0ID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGl0ID0gaGVhZGVyLmdldEhlYWRlcnNUb1Byb2Nlc3Mocm9sZVBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tID0gKE9NRWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYmxvY2sgb3V0IG9mIGVhY2ggaGVhZGVyIHRoYXQgbWF0Y2hlcyAKLSAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0ZWQgbmFtZXNwYWNlL2xvY2FsUGFydAotICAgICAgICAgICAgaWYgKG9tLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhuYW1lc3BhY2UpICYmCi0gICAgICAgICAgICAgICAgb20uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGxvY2FsUGFydCkpIHsKLSAgICAgICAgICAgICAgICBCbG9jayBibG9jayA9IF9nZXRCbG9ja0Zyb21PTUVsZW1lbnQob20sIGNvbnRleHQsIGJsb2NrRmFjdG9yeSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGJsb2Nrcy5hZGQoYmxvY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibG9ja3M7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0SGVhZGVyUU5hbWVzKCkgewotICAgICAgICBIYXNoU2V0PFFOYW1lPiBxbmFtZXMgPSBuZXcgSGFzaFNldDxRTmFtZT4oKTsKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSByb290LmdldEhlYWRlcigpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsgCi0gICAgICAgICAgICB3aGlsZSAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgbm9kZSA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBxbmFtZXMuYWRkKCgoT01FbGVtZW50KSBub2RlKS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHFuYW1lczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwgQmxvY2sgYmxvY2spCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGJsb2NrLnNldFBhcmVudChnZXRQYXJlbnQoKSk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBudWxsKTsKLSAgICAgICAgT01FbGVtZW50IG5ld09NID0KLSAgICAgICAgICAgICAgICBfY3JlYXRlT01FbGVtZW50RnJvbUJsb2NrKGxvY2FsUGFydCwgbnMsIGJsb2NrLCBzb2FwRmFjdG9yeSwgdHJ1ZSk7Ci0gICAgICAgIE9NRWxlbWVudCBvbSA9IHRoaXMuX2dldENoaWxkT01FbGVtZW50KHJvb3QuZ2V0SGVhZGVyKCksIG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgaWYgKG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyb290LmdldEhlYWRlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKHJvb3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm9vdC5nZXRIZWFkZXIoKS5hZGRDaGlsZChuZXdPTSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbS5pbnNlcnRTaWJsaW5nQmVmb3JlKG5ld09NKTsKLSAgICAgICAgICAgIG9tLmRldGFjaCgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEhlYWRlckJsb2NrKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQsIEJsb2NrIGJsb2NrKQotICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgbmV3T00gPQotICAgICAgICAgICAgX2NyZWF0ZU9NRWxlbWVudEZyb21CbG9jayhsb2NhbFBhcnQsIG5zLCBibG9jaywgc29hcEZhY3RvcnksIHRydWUpOwotICAgICAgICBpZiAocm9vdC5nZXRIZWFkZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyKHJvb3QpOwotICAgICAgICB9Ci0gICAgICAgIHJvb3QuZ2V0SGVhZGVyKCkuYWRkQ2hpbGQobmV3T00pOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVyQmxvY2soU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnQgb20gPSB0aGlzLl9nZXRDaGlsZE9NRWxlbWVudChyb290LmdldEhlYWRlcigpLCBuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgIHdoaWxlIChvbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvbS5kZXRhY2goKTsKLSAgICAgICAgICAgIG9tID0gdGhpcy5fZ2V0Q2hpbGRPTUVsZW1lbnQocm9vdC5nZXRIZWFkZXIoKSwgbmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0cmFjZVN0cmluZyhTdHJpbmcgaW5kZW50KSB7Ci0gICAgICAgIC8vIFRPRE8gVHJhY2UgU3RyaW5nIFN1cHBvcnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYTUxQYXJ0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAiU1BJTkUiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmF1bHQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBYTUxGYXVsdFV0aWxzLmlzRmF1bHQocm9vdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0eWxlIGdldFN0eWxlKCkgewotICAgICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE9wZXJhdGlvbkVsZW1lbnQoKSB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSB0aGlzLl9nZXRCb2R5QmxvY2tQYXJlbnQoKTsKLSAgICAgICAgaWYgKG9tRWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBvbUVsZW1lbnQuZ2V0UU5hbWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkVsZW1lbnQoUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHsKLSAgICAgICAgT01FbGVtZW50IG9wRWxlbWVudCA9IHRoaXMuX2dldEJvZHlCbG9ja1BhcmVudCgpOwotICAgICAgICBpZiAoIShvcEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2Uob3BlcmF0aW9uUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblFOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIG9wRWxlbWVudC5zZXRMb2NhbE5hbWUob3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgb3BFbGVtZW50LnNldE5hbWVzcGFjZShucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEJsb2NrIF9nZXRCbG9ja0Zyb21PTUVsZW1lbnQoT01FbGVtZW50IG9tLCBPYmplY3QgY29udGV4dCwgQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzZXRDb21wbGV0ZSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBvbS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBvbS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU2F2ZSB0aGUgUk9MRQotICAgICAgICAgICAgLy8gVE9ETyBOZWVkIHRvIGRvIHRoZSBzYW1lIGZvciBSRUxBWSBhbmQgTVVTVFVOREVSU1RBTkQKLSAgICAgICAgICAgIFN0cmluZyByb2xlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChvbSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJCbG9jaykgewotICAgICAgICAgICAgICAgIHJvbGUgPSAoKFNPQVBIZWFkZXJCbG9jaylvbSkuZ2V0Um9sZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBUT0RPIFdlIGNvdWxkIGdhaW4gcGVyZm9ybWFuY2UgaWYgT01Tb3VyY2VkRWxlbWVudCBleHBvc2VkIGEgZ2V0RGF0YVNvdXJjZSBtZXRob2QgCi0gICAgICAgICAgICAgaWYgKG9tIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudEltcGwgJiYKLSAgICAgICAgICAgICAoKE9NU291cmNlZEVsZW1lbnRJbXBsKSBvbSkuZ2V0RGF0YVNvdXJjZSgpIGluc3RhbmNlb2YgQmxvY2spIHsKLSAgICAgICAgICAgICBCbG9jayBvbGRCbG9jayA9IChCbG9jaykgKChPTVNvdXJjZWRFbGVtZW50SW1wbCkgb20pLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgICBCbG9jayBuZXdCbG9jayA9IGJsb2NrRmFjdG9yeS5jcmVhdGVGcm9tKG9sZEJsb2NrLCBjb250ZXh0KTsKLSAgICAgICAgICAgICBuZXdCbG9jay5zZXRQYXJlbnQoZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgIGlmIChuZXdCbG9jayAhPSBvbGRCbG9jaykgewotICAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIE9NRWxlbWVudCB3aXRoIHRoZSBPTVNvdXJjZWRFbGVtZW50IHRoYXQgZGVsZWdhdGVzIHRvIHRoZSBibG9jawotICAgICAgICAgICAgICBPTVNvdXJjZWRFbGVtZW50SW1wbCBuZXdPTSA9IG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChxTmFtZSwgc29hcEZhY3RvcnksIG5ld0Jsb2NrKTsKLSAgICAgICAgICAgICAgb20uaW5zZXJ0U2libGluZ0JlZm9yZShuZXdPTSk7Ci0gICAgICAgICAgICAgIG9tLmRldGFjaCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHJldHVybiBuZXdCbG9jazsKLSAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBibG9jawotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPSBibG9ja0ZhY3RvcnkuY3JlYXRlRnJvbShvbSwgY29udGV4dCwgcU5hbWUpOwotICAgICAgICAgICAgYmxvY2suc2V0UGFyZW50KGdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGlmIChvbSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJCbG9jaykgewotICAgICAgICAgICAgICAgIGJsb2NrLnNldFByb3BlcnR5KFNPQVBIZWFkZXJCbG9jay5ST0xFX1BST1BFUlRZLCByb2xlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBidXNpbmVzcyBvYmplY3QgdG8gZm9yY2UgYSBwYXJzZQotICAgICAgICAgICAgYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBPTUVsZW1lbnQgd2l0aCB0aGUgT01Tb3VyY2VkRWxlbWVudCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgYmxvY2sKLSAgICAgICAgICAgIE9NRWxlbWVudCBuZXdPTSA9IF9jcmVhdGVPTUVsZW1lbnRGcm9tQmxvY2socU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5zLCBibG9jaywgc29hcEZhY3RvcnksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9tLmdldFBhcmVudCgpIGluc3RhbmNlb2YgU09BUEhlYWRlcikpOwotICAgICAgICAgICAgb20uaW5zZXJ0U2libGluZ0JlZm9yZShuZXdPTSk7Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gc2V0IHRoZSBvbSBlbGVtZW50IGFuZCBpdHMgcGFyZW50cyB0byBjb21wbGV0ZSB0byAKLSAgICAgICAgICAgIC8vIHNodXRkb3duIHRoZSBwYXJzaW5nLiAgCi0gICAgICAgICAgICBpZiAoc2V0Q29tcGxldGUpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50SW1wbCByb290ID0gKE9NRWxlbWVudEltcGwpIG9tOwotICAgICAgICAgICAgICAgIHdoaWxlKHJvb3QuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBPTUVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvb3QgPSAoT01FbGVtZW50SW1wbCkgcm9vdC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyb290LmlzQ29tcGxldGUoKSAmJiByb290LmdldEJ1aWxkZXIoKSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyb290LmdldEJ1aWxkZXIoKS5pc0NvbXBsZXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3J3YXJkIHRoZSBwYXJzZXIgdG8gdGhlIGVuZCBzbyBpdCB3aWxsIGNsb3NlCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocm9vdC5nZXRCdWlsZGVyKCkubmV4dCgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2RvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGFuZCBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQnVpbGRlciBuZXh0IGVycm9yOiIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLnN0YWNrVG9TdHJpbmcoZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIE9NQ29udGFpbmVyIG8gPSBvbTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBPTUNvbnRhaW5lckV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICgoT01Db250YWluZXJFeClvKS5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChvIGluc3RhbmNlb2YgT01Ob2RlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKE9NTm9kZSlvKS5nZXRQYXJlbnQoKSkgaW5zdGFuY2VvZiBPTUNvbnRhaW5lcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICgoT01Ob2RlKW8pLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgb20uZGV0YWNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gYmxvY2s7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiB4c2UpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oeHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBfY3JlYXRlT01FbGVtZW50RnJvbUJsb2NrKFN0cmluZyBsb2NhbE5hbWUsIE9NTmFtZXNwYWNlIG5zLCBCbG9jayBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5LCBib29sZWFuIGlzSGVhZGVyQmxvY2spIHsKLSAgICAgICAgaWYgKGlzSGVhZGVyQmxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQSGVhZGVyQmxvY2sobG9jYWxOYW1lLCBucywgYik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGIsIGxvY2FsTmFtZSwgbnMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIE9NRWxlbWVudCB0aGF0IGlzIHRoZSBwYXJlbnQgb2Ygd2hlcmUgdGhlIHRoZSBib2R5IGJsb2NrcyBhcmUgbG9jYXRlZAotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT01FbGVtZW50IF9nZXRCb2R5QmxvY2tQYXJlbnQoKSB7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSByb290LmdldEJvZHkoKTsKLSAgICAgICAgaWYgKCFib2R5Lmhhc0ZhdWx0KCkgJiYgaW5kaXJlY3Rpb24gPT0gMSkgewotICAgICAgICAgICAgLy8gIEZvciBSUEMgdGhlIGJsb2NrcyBhcmUgd2l0aGluIHRoZSBvcGVyYXRpb24gZWxlbWVudAotICAgICAgICAgICAgT01FbGVtZW50IG9wID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChvcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZQotICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoIiIsICIiKTsKLSAgICAgICAgICAgICAgICBvcCA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiUExBQ0VIT0xERVJfT1BFUkFUSU9OIiwgbnMsIGJvZHkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG9wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBib2R5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZhY3RvcnkgZm9yIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm90b2NvbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTT0FQRmFjdG9yeSBfZ2V0RmFjdG9yeShQcm90b2NvbCBwcm90b2NvbCkgewotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeTsKLSAgICAgICAgaWYgKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBuZXcgU09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sID09IFByb3RvY29sLnNvYXAxMikgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBuZXcgU09BUDEyRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sID09IFByb3RvY29sLnJlc3QpIHsKLSAgICAgICAgICAgIC8vIEZvciBSRVNULCBjcmVhdGUgYSBTT0FQIDEuMSBFbnZlbG9wZSB0byBjb250YWluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBBeGlzMi4KLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlJFU1RJc05vdFN1cHBvcnRlZCIpLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGVtdHB5IGVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAcGFyYW0gc3R5bGUKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTT0FQRW52ZWxvcGUgX2NyZWF0ZUVtcHR5RW52ZWxvcGUoU3R5bGUgc3R5bGUsIFNPQVBGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGZhY3RvcnkuY3JlYXRlU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIC8vIEFkZCBhbiBlbXB0eSBib2R5IGFuZCBoZWFkZXIKLSAgICAgICAgZmFjdG9yeS5jcmVhdGVTT0FQQm9keShlbnYpOwotICAgICAgICBmYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIoZW52KTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBkdW1teSBvcGVyYXRpb24gZWxlbWVudCBpZiB0aGlzIGlzIGFuIHJwYyBtZXNzYWdlCi0gICAgICAgIGlmIChzdHlsZSA9PSBTdHlsZS5SUEMpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiIiwgIiIpOwotICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIlBMQUNFSE9MREVSX09QRVJBVElPTiIsIG5zLCBlbnYuZ2V0Qm9keSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlbnY7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTFBhcnQjZ2V0TnVtQm9keUJsb2NrcygpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IF9nZXROdW1DaGlsZEVsZW1lbnRzKE9NRWxlbWVudCBvbSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICAvLyBBdm9pZCBjYWxsaW5nIHRoaXMgbWV0aG9kLiAgSXQgYWR2YW5jZXMgdGhlIHBhcnNlci4KLSAgICAgICAgaWYgKG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBudW0gPSAwOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9tLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgbnVtKys7Ci0gICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNoaWxkIG9tIGF0IHRoZSBpbmRpY2F0ZWQgaW5kZXgKLSAgICAgKgotICAgICAqIEBwYXJhbSBvbQotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gY2hpbGQgb20gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBfZ2V0Q2hpbGRPTUVsZW1lbnQoT01FbGVtZW50IG9tLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKG9tID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChPTU5vZGUgY2hpbGQgPSBvbS5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgICAgICBjaGlsZCAhPSBudWxsOwotICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dE9NU2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE9NRWxlbWVudCljaGlsZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2hpbGQgb20gYXQgdGhlIGluZGljYXRlZCBpbmRleAotICAgICAqCi0gICAgICogQHBhcmFtIG9tCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZSwKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogQHJldHVybiBjaGlsZCBvbSBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT01FbGVtZW50IF9nZXRDaGlsZE9NRWxlbWVudChPTUVsZW1lbnQgb20sIFN0cmluZyBuYW1lc3BhY2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCkgewotICAgICAgICBpZiAob20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICBJdGVyYXRvciBpdCA9IG9tLmdldENoaWxkcmVuV2l0aE5hbWUocU5hbWUpOwotICAgICAgICBpZiAoaXQgIT0gbnVsbCAmJiBpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoT01FbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2ltcGwvWE1MU3RyZWFtUmVhZGVyRm9yWE1MU3BpbmUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTdHJlYW1SZWFkZXJGb3JYTUxTcGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWJjOTE1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaW1wbC9YTUxTdHJlYW1SZWFkZXJGb3JYTUxTcGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlN0YWNrYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5YTUxTdHJlYW1SZWFkZXJGaWx0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFhNTFN0cmVhbVJlYWRlckZvclhNTFNwaW5lCi0gKiA8cC8+Ci0gKiBBbiBYTUxTcGluZSBpcyBjb21wb3NlZCBvZiBtYW55IGRpZmZlcmVudCBwYXJ0czogYSBzcGFyc2UgT00gdHJlZSwgaGVhZGVyIGJsb2NrcywgYm9keSBibG9ja3MsCi0gKiBldGMuCi0gKiA8cC8+Ci0gKiBUaGUgWE1MU3RyZWFtUmVhZGVyRm9yWE1MU3BpbmUgcHJvdmlkZXMgYW4gWE1MU3RyZWFtUmVhZGVyIHRoYXQgb3ZlciBhbGwgb2YgdGhlc2UgY29tYmluZWQKLSAqIG9iamVjdHMgKHdpdGhvdXQgYnVpbGRpbmcgYSBmdWxsIE9NIHRyZWUpLiBJdCBkb2VzIHRoaXMgYnkgdXNpbmcgYSBTdGFja2FibGVYTUxTdHJlYW1SZWFkZXIgZm9yCi0gKiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBhbmQgcHVzaGluZyB0aGUgWE1MU3RyZWFtUmVhZGVycyBmb3IgdGhlIGJsb2NrcyBvbnRvIHRoZSBzdGFjayBhdAotICogdGhlIGFwcHJvcHJpYXRlIHBvaW50cyBpbiB0aGUgbWVzc2FnZS4KLSAqLwotcHVibGljIGNsYXNzIFhNTFN0cmVhbVJlYWRlckZvclhNTFNwaW5lIGV4dGVuZHMgWE1MU3RyZWFtUmVhZGVyRmlsdGVyIHsKLQotICAgIC8vIENvbXBvbmVudHMgb2YgYW4gWE1MU3BpbmUKLSAgICBPTUVsZW1lbnQgcm9vdDsKLSAgICBwcml2YXRlIExpc3Q8QmxvY2s+IGhlYWRlckJsb2NrcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PEJsb2NrPiBib2R5QmxvY2tzID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8QmxvY2s+IGRldGFpbEJsb2NrcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnN1bWUgPSBmYWxzZTsKLSAgICBQcm90b2NvbCBwcm90b2NvbCA9IG51bGw7Ci0KLSAgICAvLyBMb2NhbCBDb25zdGFudHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWSA9ICJCb2R5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gIkhlYWRlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUID0gIkZhdWx0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMMTEgPSAiZGV0YWlsIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMMTIgPSAiRGV0YWlsIjsKLQotICAgIGJvb2xlYW4gaW5GYXVsdCA9IGZhbHNlOwotICAgIHByaXZhdGUgTGlzdDxCbG9jaz4gaW5zZXJ0QmxvY2tzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByb290ICAgICAgICAgb2YgdGhlIFhNTFNwaW5lCi0gICAgICogQHBhcmFtIGhlYWRlckJsb2NrcwotICAgICAqIEBwYXJhbSBib2R5Qm9ja3MKLSAgICAgKiBAcGFyYW0gZGV0YWlsQmxvY2tzCi0gICAgICogQHBhcmFtIGNvbnN1bWUKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyRm9yWE1MU3BpbmUoT01FbGVtZW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJsb2NrPiBoZWFkZXJCbG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmxvY2s+IGJvZHlCbG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QmxvY2s+IGRldGFpbEJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb25zdW1lKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIHN0YWNrYWJsZSByZWFkZXIgYW5kIHByaW1lIGl0IHdpdGggdGhlIHJvb3Qgb20gdHJlZQotICAgICAgICAvLyBUaGUgWE1MU3RyZWFtUmVhZGVyJ3MgZm9yIHRoZSBibG9ja3Mgd2lsbCBiZSBwdXNoZWQgb250byB0aGUKLSAgICAgICAgLy8gc3RhY2sgYXMgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkLgotICAgICAgICBzdXBlcihuZXcgU3RhY2thYmxlUmVhZGVyKHJvb3QuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpKTsKLSAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICB0aGlzLmhlYWRlckJsb2NrcyA9IGhlYWRlckJsb2NrczsKLSAgICAgICAgdGhpcy5ib2R5QmxvY2tzID0gYm9keUJsb2NrczsKLSAgICAgICAgdGhpcy5kZXRhaWxCbG9ja3MgPSBkZXRhaWxCbG9ja3M7Ci0gICAgICAgIHRoaXMuY29uc3VtZSA9IGNvbnN1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRoZSBuZXh0IG1ldGhvZCBpcyBvdmVycmlkZGVuIHNvIHRoYXQgd2UgY2FuIHB1c2gKLSAgICAgICAgLy8gdGhlIGJsb2NrJ3MgWE1MU3RyZWFtUmVhZGVycyBvbnRvIHRoZSBzdGFjayBhdCB0aGUKLSAgICAgICAgLy8gYXBwcm9wcmlhdGUgcGxhY2VzIGluIHRoZSBtZXNzYWdlIChwcmV0dHkgc2xpY2spLgotCi0gICAgICAgIC8vIEluc2VydCBwZW5kaW5nIGJsb2NrcyBvbnRvIHRoZSBzdGFjawotICAgICAgICBpZiAoaW5zZXJ0QmxvY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHB1c2hCbG9ja3MoaW5zZXJ0QmxvY2tzLCBjb25zdW1lKTsKLSAgICAgICAgICAgIGluc2VydEJsb2NrcyA9IG51bGw7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgbmV4dCBldmVudAotICAgICAgICBpbnQgZXZlbnQgPSBzdXBlci5uZXh0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXJ0IGVsZW1lbnQgZXZlbnQsIHRoZW4gd2UgbWF5IG5lZWQgdG8gaW5zZXJ0Ci0gICAgICAgIC8vIHRoZSBibG9ja3MgcHJpb3IgdG8gdGhlIG5leHQgZXZlbnQKLSAgICAgICAgaWYgKGlzU3RhcnRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc3VwZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy8gSW5zZXJ0IGJvZHkgYmxvY2tzIGFmdGVyIHRoZSBCb2R5Ci0gICAgICAgICAgICBpZiAocU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKEJPRFkpICYmCi0gICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhyb290LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChib2R5QmxvY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QmxvY2tzID0gYm9keUJsb2NrczsKLSAgICAgICAgICAgICAgICAgICAgYm9keUJsb2NrcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW5zZXJ0IGhlYWRlciBibG9ja3MgYWZ0ZXIgdGhlIGhlYWRlcgotICAgICAgICAgICAgZWxzZSBpZiAocU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKEhFQURFUikgJiYKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHJvb3QuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc2VydEJsb2NrcyA9IGhlYWRlckJsb2NrczsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmxvY2tzID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHFOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhGQVVMVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHJvb3QuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgaW5GYXVsdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnNlcnQgRGV0YWlsIGJsb2NrcyBhZmdlciB0aGUgZGV0YWlsLi4ubm90ZSB0aGF0Ci0gICAgICAgICAgICAvLyB0aGUgZGV0YWlsIG5hbWUgaXMgZGlmZmVyZW50IGluIFNPQVAgMS4xIGFuZCBTT0FQIDEuMgotICAgICAgICAgICAgZWxzZSBpZiAoaW5GYXVsdCkgewotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoREVUQUlMMTEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKERFVEFJTDEyKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDEyKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGV0YWlsQmxvY2tzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJsb2NrcyA9IGRldGFpbEJsb2NrczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbEJsb2NrcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1c2ggdGhlIFhNTFN0cmVhbVJlYWRlcnMgZm9yIHRoZSBibG9ja3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBibG9ja3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHVzaEJsb2NrcyhMaXN0PEJsb2NrPiBibG9ja3MsIGJvb2xlYW4gY29uc3VtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFB1c2ggdGhlIFhNTFN0cmVhbVJlYWRlcnMgZm9yIHRoZSBibG9ja3Mgb250byB0aGUKLSAgICAgICAgLy8gZGVsZWdhdGUuICBUaGlzIGlzIGRvbmUgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGUgYmxvY2tzIHNvIHRoYXQgdGhlCi0gICAgICAgIC8vIGZpcnN0ICBibG9jaydzIHhtbHN0cmVhbXJlYWRlciBpcyBvbnRvcCBvZiB0aGUgc3RhY2suCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdGFja2FibGVSZWFkZXIgc3IgPSAoU3RhY2thYmxlUmVhZGVyKWRlbGVnYXRlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGJsb2Nrcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gYmxvY2tzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoYmxvY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzci5wdXNoKGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcihjb25zdW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIG1lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKG1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9ET01SZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9ET01SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyODhlNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvRE9NUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuaW1wbC5YTUxTdHJlYW1SZWFkZXJGcm9tRE9NOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLQotLyoqIERPTVJlYWRlciBDcmVhdGVzIGFuIFhNTFN0cmVhbVJlYWRlciBiYWNrZWQgYnkgYSBET00gdHJlZS4gKi8KLXB1YmxpYyBjbGFzcyBET01SZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0gICAgRWxlbWVudCBlbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSByZXNldHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIERPTVJlYWRlcihFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoX25ld1JlYWRlcihlbGVtZW50KSwgdHJ1ZSk7Ci0KLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyI25ld1JlYWRlcigpCi0gICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgbmV3UmVhZGVyKCkgewotICAgICAgICByZXR1cm4gX25ld1JlYWRlcihlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBfbmV3UmVhZGVyKEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICAvLyBDb25zdHJ1Y3QgYSByZWFkZXIgZnJvbSBhbiBlbGVtZW50Ci0gICAgICAgIHJldHVybiBuZXcgWE1MU3RyZWFtUmVhZGVyRnJvbURPTShlbGVtZW50KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvTWVzc2FnZVV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvTWVzc2FnZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTY0M2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL01lc3NhZ2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01YTUxQYXJzZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuQXR0YWNobWVudHNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5TT0FQSGVhZGVyc0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKiogTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMgdGhhdCBtYXkgYmUgdXNlZnVsIGluc2lkZSBhbmQgb3V0c2lkZSB0aGUgTWVzc2FnZSBzdWJjb21wb25lbnQuICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlVXRpbHMuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGFuIGF4aW9tIFNPQVBGYWN0b3J5IGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlIE9NRWxlbWVudAotICAgICAqIEByZXR1cm4gU09BUEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KE9NRWxlbWVudCBlKSB7Ci0gICAgICAgIC8vIEdldHRpbmcgYSBmYWN0b3J5IGZyb20gYSBTT0FQRW52ZWxvcGUgaXMgbm90IHN0cmFpZ2h0LWZvcndhcmQuCi0gICAgICAgIC8vIFBsZWFzZSBjaGFuZ2UgdGhpcyBjb2RlIGlmIGFuIGVhc2llciBtZWNoYW5pc20gaXMgZGlzY292ZXJlZC4KLQotICAgICAgICBPTVhNTFBhcnNlcldyYXBwZXIgYnVpbGRlciA9IGUuZ2V0QnVpbGRlcigpOwotICAgICAgICBpZiAoYnVpbGRlciBpbnN0YW5jZW9mIFN0QVhCdWlsZGVyKSB7Ci0gICAgICAgICAgICBTdEFYQnVpbGRlciBzdGF4QnVpbGRlciA9IChTdEFYQnVpbGRlcilidWlsZGVyOwotICAgICAgICAgICAgT01Eb2N1bWVudCBkb2N1bWVudCA9IHN0YXhCdWlsZGVyLmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gZG9jdW1lbnQuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBTT0FQRmFjdG9yeSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNPQVBGYWN0b3J5KWZhY3Rvcnk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEZsb3cgdG8gaGVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW52ZWxvcGUgZG9lcyBub3QgaGF2ZQotICAgICAgICAvLyBhbiBhY2Nlc3NpYmxlIGZhY3RvcnkuICBDcmVhdGUgYSBuZXcgZmFjdG9yeSBiYXNlZCBvbiB0aGUgCi0gICAgICAgIC8vIHByb3RvY29sLgotCi0gICAgICAgIHdoaWxlIChlICE9IG51bGwgJiYgIShlIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSkgewotICAgICAgICAgICAgZSA9IChPTUVsZW1lbnQpZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSkgewotICAgICAgICAgICAgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuCi0gICAgICAgICAgICAgICAgICAgIGVxdWFscyhlLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIFNBQUogQXR0YWNobWVudFBhcnQgZnJvbSBhIEpBWFdTIEF0dGFjaG1lbnQKLSAgICAgKiBAcGFyYW0gY2lkIFN0cmluZyBjb250ZW50IGlkCi0gICAgICogQHBhcmFtIGRoIERhdGFIYW5kbGVyCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgU09BUE1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIEF0dGFjaG1lbnRQYXJ0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBdHRhY2htZW50UGFydCBjcmVhdGVBdHRhY2htZW50UGFydChTdHJpbmcgY2lkLCBEYXRhSGFuZGxlciBkaCwgU09BUE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEF0dGFjaG1lbnQgUGFydAotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IG1lc3NhZ2UuY3JlYXRlQXR0YWNobWVudFBhcnQoZGgpOwotICAgICAgICAKLSAgICAgICAgLy8gUkVWSUVXCi0gICAgICAgIC8vIERvIHdlIG5lZWQgdG8gY29weSB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGRhdGFoYW5kbGVyID8KLSAgICAgICAgCi0gICAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBjb250ZW50IGlkCi0gICAgICAgIGFwLnNldENvbnRlbnRJZChjaWQpOwotICAgICAgICByZXR1cm4gYXA7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBKQVgtV1MgTWVzc2FnZSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBvbiBhbiBBeGlzIDIgTWVzc2FnZSBDb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEByZXR1cm4gTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZSBnZXRNZXNzYWdlRnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTdGFydCBnZXRNZXNzYWdlRnJvbU1lc3NhZ2VDb250ZXh0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAvLyBJZiB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQgdGhhdCB3YXMgcGFzc2VkIGluIGhhcyBhIFNPQVBFbnZlbG9wZQotICAgICAgICAvLyBzZXQgb24gaXQsIGdyYWIgdGhhdCBhbmQgY3JlYXRlIGEgSkFYLVdTIE1lc3NhZ2Ugb3V0IG9mIGl0LgotICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudiA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKHNvYXBFbnYgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbXNnRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChNZXNzYWdlRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sID0gbXNnQ29udGV4dC5pc0RvaW5nUkVTVCgpID8gUHJvdG9jb2wucmVzdCA6IG51bGw7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1zZ0ZhY3RvcnkuY3JlYXRlRnJvbShzb2FwRW52LCBwcm90b2NvbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJtc2dGcm9tTXNnRXJyIiksIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBhbGwgdGhlIE1pbWVIZWFkZXJzIGZyb20gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICBNYXAgaGVhZGVyTWFwID0gKE1hcCltc2dDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9IRUFERVJTKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0TWltZUhlYWRlcnMoaGVhZGVyTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIFdPUktBUk9VTkQgZm9yIG1pc3NpbmcgU09BUEZhdWx0IGRhdGEuICBJZiB3ZSBkbyBhIHRvU3RyaW5nIG9uIHRoZQotICAgICAgICAgICAgLy8gU09BUEVudmVsb3BlLCB0aGVuIGFsbCB0aGUgZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgcHJvdmlkZXIuICBPdGhlcndpc2UsIGl0Ci0gICAgICAgICAgICAvLyB3aWxsIGJlIG1pc3NpbmcgdGhlIDxSZWFzb24+IGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgPGZhdWx0c3RyaW5nPiBlbGVtZW50LiAgCi0gICAgICAgICAgICAvLyBUaGUgU09BUEZhdWx0UHJvdmlkZXJUZXN0cyB3aWxsIGNoZWNrIGZvciB0aGlzIGZhaWx1cmUuCi0gICAgICAgICAgICBpZiAoc29hcEVudi5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgc29hcEVudi50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmFsc2UpIHsKLSAgICAgICAgICAgICAgICBtYWtlWE9QSW5jbHVkZU5vZGVzKG1zZ0NvbnRleHQsIG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1dCB0aGUgSkFYLVdTIE1lc3NhZ2Ugb250byB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlICAgIEpBWC1XUyBNZXNzYWdlCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgQXhpczJNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dChNZXNzYWdlIG1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0LCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gUHV0IHRoZSBYTUwgbWVzc2FnZSBvbiB0aGUgQXhpcyAyIE1lc3NhZ2UgQ29udGV4dAotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoU09BUEVudmVsb3BlKW1lc3NhZ2UuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0KLSAgICAgICAgLy8gUHV0IHRoZSBIZWFkZXJzIG9udG8gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIE1hcCBoZWFkZXJNYXAgPSBtZXNzYWdlLmdldE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMsIGhlYWRlck1hcCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMsIGhlYWRlck1hcCk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0UHJvdG9jb2woKSA9PSBQcm90b2NvbC5yZXN0KSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nUkVTVCh0cnVlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFLCBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0aGUgSkFYLVdTIEF0dGFjaG1lbnRBZGFwdGVyIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQKLSAgICAgICAgLy8gU28gdGhhdCBhbnkgdXNlciBhdHRhY2htZW50cyBwcm92aWRlIGFyZSBtb3ZlZCB0byB0aGUgQXhpb20gQXR0YWNobWVudHMKLSAgICAgICAgLy8gTWFwCi0gICAgICAgIGlmIChtZXNzYWdlLmdldE1lc3NhZ2VDb250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgQXR0YWNobWVudHNBZGFwdGVyLmluc3RhbGwobWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyLmluc3RhbGwobWVzc2FnZS5nZXRNZXNzYWdlQ29udGV4dCgpKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJzQWRhcHRlci5pbnN0YWxsKG1lc3NhZ2UuZ2V0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtZXNzYWdlLmlzRG9pbmdTV0EoKSkgewotICAgICAgICAgICAgLy8gRW5hYmxlIFNXQSBvbiB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdTd0EodHJ1ZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbmZpZ3VyYXRpb24uRU5BQkxFX1NXQSwgInRydWUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuYWJsZSBNVE9NIEF0dGFjaG1lbnRzIAotICAgICAgICBpZiAobWVzc2FnZS5pc01UT01FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vIEVuYWJsZSBNVE9NIG9uIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCAidHJ1ZSIpOwotICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgbWFrZUJpbmFyeU5vZGVzKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZXhwYW5kIHRoZSB0cmVlIGFuZCBjcmVhdGUgYmluYXJ5IG5vZGVzCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlQmluYXJ5Tm9kZXMoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk1UT00gaXMgZW5hYmxlZCBvbiB0aGUgSkFYLVdTIE1lc3NhZ2UuLi5sb29rIGZvciBYT1AgSW5jbHVkZXMiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiB3ZSBoYXZlIE1UT00gYXR0YWNobWVudHMsIHdlIG5lZWQgdG8gcmVwbGFjZSB0aGUgPHhvcDppbmNsdWRlPgotICAgICAgICAvLyBlbGVtZW50cyB3aXRoIE9NVGV4dCBiaW5hcnkgbm9kZXMuCi0gICAgICAgIAotICAgICAgICAvLyBGaXJzdCBmaW5kIGFsbCBvZiB0aGUgPHhvcDppbmNsdWRlPiBlbGVtZW50cwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoU09BUEVudmVsb3BlKSBtc2cuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgQXJyYXlMaXN0PE9NRWxlbWVudD4geG9wcyA9IEF0dGFjaG1lbnRVdGlscy5maW5kWG9wRWxlbWVudHMoZW52ZWxvcGUpOwotICAgICAgICAKLSAgICAgICAgaWYgKHhvcHMgIT0gbnVsbCAmJiB4b3BzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgWE9QOkluY2x1ZGUgRWxlbWVudHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUU5hbWUgaHJlZiA9IG5ldyBRTmFtZSgiIiwiaHJlZiIpOwotICAgICAgICAgICAgSXRlcmF0b3I8T01FbGVtZW50PiBpdHIgPSB4b3BzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgeG9wID0gaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2lkID0geG9wLmdldEF0dHJpYnV0ZVZhbHVlKGhyZWYpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIEZpbmQgYW5kIHJlbW92ZSB0aGUgQXR0YWNobWVudCBmcm9tIHRoZSBKQVgtV1MgTWVzc2FnZQotICAgICAgICAgICAgICAgIC8vIChJdCBpcyByZW1vdmVkIHNvIHRoYXQgaXQgaXMgbm90IGNvbnNpZGVyZWQgYSBTV0EgQXR0YWNobWVudCAuLi5zZWUgYmVsb3cpCi0gICAgICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBtc2cucmVtb3ZlRGF0YUhhbmRsZXIoY2lkKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgQmluYXJ5IE9NTm9kZSBmb3IgYXR0YWNobWVudDoiICsgY2lkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgPHhvcDppbmNsdWRlPiBPTUVsZW1lbnQgaW50byBhbiBPTVRleHQKLSAgICAgICAgICAgICAgICAvLyBiaW5hcnkgbm9kZSBhbmQgcmVwbGFjZSBpdCBpbiB0aGUgdHJlZS4gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIE9NVGV4dCBiaW5hcnlOb2RlID0gQXR0YWNobWVudFV0aWxzLm1ha2VCaW5hcnlPTU5vZGUoeG9wLCBkaCk7Ci0gICAgICAgICAgICAgICAgeG9wLmluc2VydFNpYmxpbmdBZnRlcihiaW5hcnlOb2RlKTsKLSAgICAgICAgICAgICAgICB4b3AuZGV0YWNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRXhwYW5kIHRoZSB0cmVlIGFuZCBjcmVhdGUgWE9QIG5vZGVzCi0gICAgICogQHBhcmFtIG1zZwotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYWtlWE9QSW5jbHVkZU5vZGVzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICAvLyBUaGlzIGRlc3Ryb3lzIHBlcmZvcm1hbmNlIGJ5IGZvcmNpbmcgYSBkb3VibGUgcGFzcyB0aHJvdWdoIHRoZSBtZXNzYWdlLgotICAgICAgICAvL0lmIGF0dGFjaG1lbnRzIGFyZSBmb3VuZCBvbiB0aGUgTWVzc2FnZUNvbnRleHQsIHRoZW4gdGhhdCBtZWFucwotICAgICAgICAvL3RoZSBpbmJvdW5kIG1lc3NhZ2UgaGFzIG1vcmUgdGhhbiBqdXN0IHRoZSBub3JtYWwgWE1MIHBheWxvYWQKLSAgICAgICAgQXR0YWNobWVudHMgYXMgPSAoQXR0YWNobWVudHMpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTVRPTUNvbnN0YW50cy5BVFRBQ0hNRU5UUyk7IAotICAgICAgICBpZiAoYXMgIT0gbnVsbCkgeyAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgQXhpcyBNVE9NIEF0dGFjaG1lbnRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vV2FsayB0aGUgdHJlZSBhbmQgZmluZCBhbGwgb2YgdGhlIG9wdGltaXplZCBiaW5hcnkgbm9kZXMuCi0gICAgICAgICAgICBBcnJheUxpc3Q8T01UZXh0PiBiaW5hcnlOb2RlcyA9IEF0dGFjaG1lbnRVdGlscy5maW5kQmluYXJ5Tm9kZXMoKFNPQVBFbnZlbG9wZSkgbWVzc2FnZS5nZXRBc09NRWxlbWVudCgpKTsKLSAgICAgICAgICAgIGlmIChiaW5hcnlOb2RlcyAhPSBudWxsICAmJiBiaW5hcnlOb2Rlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgIiArIGJpbmFyeU5vZGVzLnNpemUoKSArIk1UT00gQmluYXJ5IE5vZGVzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vUmVwbGFjZSBlYWNoIG9mIHRoZSBub2RlcyB3aXRoIGl0J3MgY29ycmVzcG9uZGluZyA8eG9wOmluY2x1ZGU+Ci0gICAgICAgICAgICAgICAgLy9lbGVtZW50LCBzbyBKQVhCIGNhbiBwcm9jZXNzIGl0IGNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxPTVRleHQ+IGl0ciA9IGJpbmFyeU5vZGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01UZXh0IG5vZGUgPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgeG9wID0gQXR0YWNobWVudFV0aWxzLm1ha2VYb3BFbGVtZW50KG5vZGUpOwotICAgICAgICAgICAgICAgICAgICBub2RlLmdldFBhcmVudCgpLmFkZENoaWxkKHhvcCk7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUuZGV0YWNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvL1dlIGhhdmUgdG8gYWRkIHRoZSBpbmRpdmlkdWFsIGF0dGFjaG1lbnRzIGluIHRoZWlyIHJhdwotICAgICAgICAgICAgICAgICAgICAvL2JpbmFyeSBmb3JtLCBzbyB3ZSBjYW4gYWNjZXNzIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgTVRPTSBNZXNzYWdlIEF0dGFjaG1lbnQgZm9yICIgKyBub2RlLmdldENvbnRlbnRJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZERhdGFIYW5kbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEYXRhSGFuZGxlcikgbm9kZS5nZXREYXRhSGFuZGxlcigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmdldENvbnRlbnRJRCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgZm9yIGRlYnVnIHB1cnBvc2VzIG9ubHkKLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBlcnNpc3RNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBtYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcCA9IG1jLmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChjYyA9PSBudWxsICYmIG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYyA9IG9wLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRGVidWdQZXJzaXN0IiwgbnVsbCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlCi0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOwotCi0gICAgICAgICAgICAvLyBBdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIAotICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsKLQotICAgICAgICAgICAgLy8gVHJ5IHRvIHNhdmUgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KG1jKTsKLSAgICAgICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgcmVhZCBpbiB0aGUgcGVyc2lzdGVkIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIFNldHVwIGFuIGlucHV0IHN0cmVhbSB0byB0aGUgZmlsZQotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIAotICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQotICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW5TdHJlYW0pOwotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNQyA9IAotICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICBpblN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgaWYgKGNjID09IG51bGwgJiYgb3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN0b3JlZE1DLmFjdGl2YXRlKGNjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdG9yZWRNQy5hY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KG9wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN0b3JlZE1DLmdldFNlcnZpY2VDb250ZXh0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oIk5vIFNlcnZpY2UgR3JvdXAhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1jLmFjdGl2YXRlKGNjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWMuYWN0aXZhdGVXaXRoT3BlcmF0aW9uQ29udGV4dChvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWMuZ2V0T3BlcmF0aW9uQ29udGV4dCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gT3BlcmF0aW9uIENvbnRleHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtYy5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIFNlcnZpY2UgQ29udGV4dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvUmVhZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWZmMmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1JlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLS8qKgotICogUmVhZGVyIEluIG1hbnkgc2l0dWF0aW9ucywgeW91IHdhbnQgdGhlIGFiaWxpdHkgdG8gcmVzZXQgYW4gWE1MU3RyZWFtUmVhZGVyLiAoT3IgYXQgbGVhc3QgYXNrIGlmCi0gKiB0aGUgWE1MU3RyZWFtUmVhZGVyIGlzIHJlc2V0dGFibGUpLgotICogPHAvPgotICogVGhlIFJlYWRlciBhYnN0cmFjdCBjbGFzczogLSBhY2NlcHRzIGFuIFhNTFN0cmVhbVJlYWRlciAtIHByb3ZpZGVzIHJlc2V0KCkgYW5kIGlzUmVzZXR0YWJsZSgpCi0gKiBtZXRob2RzIEFkZHMgc3VwcG9ydCByZXNldHRhYmxlIHN1cHBvcnQgdG8gWE1MU3RyZWFtUmVhZGVyCi0gKiA8cC8+Ci0gKiBEZXJpdmVkIGNsYXNzZXMgbXVzdCBwYXNzIHRoZSBpbml0aWFsIHJlYWRlciB0byB0aGUgY29uc3RydWN0b3IgYW5kIGluZGljYXRlIGlmIGl0IGlzIHJlc2V0dGFibGUuCi0gKiBEZXJpdmVkIGNsYXNzZXMgbXVzdCBhbHNvIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG5ld1JlYWRlcigpIG1ldGhvZCBpZiByZXNldHRhYmxlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVhZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyIHsKLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVzZXR0YWJsZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUmVhZGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiBAcGFyYW0gcmVzZXR0YWJsZQotICAgICAqLwotICAgIFJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyLCBib29sZWFuIHJlc2V0dGFibGUpIHsKLSAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgIHRoaXMucmVzZXR0YWJsZSA9IHJlc2V0dGFibGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbmV3UmVhZGVyIGZyb20gdGhlIE9iamVjdAotICAgICAqCi0gICAgICogQHJldHVybiBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWE1MU3RyZWFtUmVhZGVyIG5ld1JlYWRlcigpOwotCi0gICAgLyoqCi0gICAgICogaXNSZXNldHRhYmxlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgb3IgZmFsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc2V0dGFibGUoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBpc1Jlc2V0dGFibGUuLi4uIik7Ci0gICAgCWRlYnVnKCJyZXNldHRhYmxlID0gIityZXNldHRhYmxlKTsKLSAgICAgICAgcmV0dXJuIHJlc2V0dGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyByZXNldC4uLi4iKTsKLSAgICAgICAgaWYgKCFyZXNldHRhYmxlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInJlc2V0UmVhZGVyRXJyIikpOwotICAgICAgICB9Ci0gICAgICAgIHJlYWRlciA9IG5ld1JlYWRlcigpOwotICAgICAgICAKLSAgICAgICAgZGVidWcoIkV4aXRpbmcgcmVzZXQuLi4uIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGNsb3NlLi4uLiIpOwotICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgZGVidWcoIkV4aXRpbmcgY2xvc2UuLi4uIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZUNvdW50Li4uLiIpOwotICAgIAlpbnQgYWMgPSByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpID0gIithYyk7Ci0gICAgICAgIHJldHVybiBhYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgYXJnMCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lLi4uLiIpOwotICAgIAlTdHJpbmcgYWxuID0gcmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoYXJnMCkgPSAiK2Fsbik7Ci0gICAgICAgIHJldHVybiBhbG47Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZU5hbWUuLi4uIik7Ci0gICAgCVFOYW1lIHEgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lKGFyZzApID0gIitxKTsKLSAgICAgICAgcmV0dXJuIHE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZS4uLi4iKTsKLSAgICAJU3RyaW5nIGFuID0gcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoYXJnMCkgPSAiK2FuKTsKLSAgICAgICAgcmV0dXJuIGFuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBhcmcwKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRBdHRyaWJ1dGVQcmVmaXguLi4uIik7Ci0gICAgCVN0cmluZyBhcCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoYXJnMCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0QXR0cmlidXRlUHJlZml4KGFyZzApID0gIithcCk7Ci0gICAgICAgIHJldHVybiBhcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZVR5cGUuLi4uIik7Ci0gICAgCVN0cmluZyBhdCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGFyZzApOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEF0dHJpYnV0ZVR5cGUoYXJnMCkgPSAiK2F0KTsKLSAgICAgICAgcmV0dXJuIGF0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldEF0dHJpYnV0ZVZhbHVlLi4uLiIpOwotICAgIAlTdHJpbmcgYXYgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCkgPSAiK2F2KTsKLSAgICAgICAgcmV0dXJuIGF2OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRBdHRyaWJ1dGVWYWx1ZS4uLi4iKTsKLSAgICAJU3RyaW5nIGF2ID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGFyZzAsIGFyZzEpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGFyZzAsIGFyZzEpID0gIithdik7Ci0gICAgICAgIHJldHVybiBhdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUuLi4uIik7Ci0gICAgCVN0cmluZyBjZXMgPSByZWFkZXIuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSA9ICIrY2VzKTsKLSAgICAgICAgcmV0dXJuIGNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRFbGVtZW50VGV4dC4uLi4iKTsKLSAgICAJU3RyaW5nIGV0ID0gcmVhZGVyLmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0RWxlbWVudFRleHQgPSAiK2V0KTsKLSAgICAgICAgcmV0dXJuIGV0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRFbmNvZGluZy4uLi4iKTsKLSAgICAJU3RyaW5nIGUgPSByZWFkZXIuZ2V0RW5jb2RpbmcoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRFbmNvZGluZygpID0gIitlKTsKLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRFdmVudFR5cGUuLi4uIik7Ci0gICAgCWludCBldCA9IHJlYWRlci5nZXRFdmVudFR5cGUoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRFdmVudFR5cGUoKSA9ICIrZXQpOwotICAgICAgICByZXR1cm4gZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRMb2NhdGlvbi4uLi4iKTsKLSAgICAJU3RyaW5nIGxuID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldExvY2FsTmFtZSgpID0gIitsbik7Ci0gICAgICAgIHJldHVybiBsbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRMb2NhdGlvbi4uLi4iKTsKLSAgICAJTG9jYXRpb24gbCA9IHJlYWRlci5nZXRMb2NhdGlvbigpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldExvY2F0aW9uKCkgPSAiK2wpOwotICAgICAgICByZXR1cm4gbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWUuLi4uIik7Ci0gICAgCVFOYW1lIHFuID0gcmVhZGVyLmdldE5hbWUoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lKCkgPSAiK3FuKTsKLSAgICAgICAgcmV0dXJuIHFuOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXROYW1lc3BhY2VDb250ZXh0Li4uLiIpOwotICAgIAlOYW1lc3BhY2VDb250ZXh0IG5zQ29udGV4dCA9IHJlYWRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0TmFtZXNwYWNlQ29udGV4dCgpID0gIituc0NvbnRleHQpOwotICAgICAgICByZXR1cm4gbnNDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXROYW1lc3BhY2VDb3VudC4uLi4iKTsKLSAgICAJaW50IG5zQ291bnQgPSByZWFkZXIuZ2V0TmFtZXNwYWNlQ291bnQoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpID0gIituc0NvdW50KTsKLSAgICAgICAgcmV0dXJuIG5zQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWVzcGFjZVByZWZpeC4uLi4iKTsKLSAgICAJU3RyaW5nIG5zUHJlZml4ID0gcmVhZGVyLmdldE5hbWVzcGFjZVByZWZpeChhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoYXJnMCA9ICIrbnNQcmVmaXgpOwotICAgICAgICByZXR1cm4gbnNQcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXROYW1lc3BhY2VVUkkuLi4uIik7Ci0gICAgCVN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSA9ICIrbnNVcmkpOwotICAgICAgICByZXR1cm4gbnNVcmk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldE5hbWVzcGFjZVVSSS4uLi4iKTsKLSAgICAJU3RyaW5nIG5zVXJpID0gcmVhZGVyLmdldE5hbWVzcGFjZVVSSShhcmcwKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXROYW1lc3BhY2VVUkkoYXJnMCkgPSAiK25zVXJpKTsKLSAgICAgICAgcmV0dXJuIG5zVXJpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBhcmcwKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXROYW1lc3BhY2VVUkkuLi4uIik7Ci0gICAgCVN0cmluZyBuc1VyaSA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoYXJnMCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGFyZzApID0gIituc1VyaSk7Ci0gICAgICAgIHJldHVybiBuc1VyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldFBJRGF0YS4uLi4iKTsKLSAgICAJU3RyaW5nIHBpZCA9IHJlYWRlci5nZXRQSURhdGEoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRQSURhdGEoKSA9ICIrcGlkKTsKLSAgICAgICAgcmV0dXJuIHBpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0UElUYXJnZXQuLi4uIik7Ci0gICAgCVN0cmluZyBwaXQgPSByZWFkZXIuZ2V0UElUYXJnZXQoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRQSVRhcmdldCgpID0gIitwaXQpOwotICAgICAgICByZXR1cm4gcGl0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0UHJlZml4Li4uLiIpOwotICAgIAlTdHJpbmcgZ3BmID0gcmVhZGVyLmdldFByZWZpeCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldFByZWZpeCgpID0gIitncGYpOwotICAgICAgICByZXR1cm4gZ3BmOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGFyZzApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0UHJvcGVydHkgZm9yIC4uLiIgKyBhcmcwKTsKLSAgICAJT2JqZWN0IG8gPSByZWFkZXIuZ2V0UHJvcGVydHkoYXJnMCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0UHJvcGVydHkoYXJnMCkgPSAiK28pOwotICAgICAgICByZXR1cm4gbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRUZXh0Li4uLiIpOwotICAgIAlTdHJpbmcgZ3QgPSByZWFkZXIuZ2V0VGV4dCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmdldFRleHQoKSA9ICIrZ3QpOwotICAgICAgICByZXR1cm4gZ3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGdldFRleHRDaGFyYWN0ZXJzLi4uLiIpOwotICAgIAljaGFyW10gZ3RjID0gcmVhZGVyLmdldFRleHRDaGFyYWN0ZXJzKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKSA9ICIrZ3RjLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZ3RjOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGFyZzAsIGNoYXJbXSBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0VGV4dENoYXJhY3RlcnMuLi4uIik7Ci0gICAgCWludCBndGMgPSByZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKSA9ICIrZ3RjKTsKLSAgICAgICAgcmV0dXJuIGd0YzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRUZXh0TGVuZ3RoLi4uLiIpOwotICAgIAlpbnQgZ3RsID0gcmVhZGVyLmdldFRleHRMZW5ndGgoKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRUZXh0TGVuZ3RoKCkgPSAiK2d0bCk7Ci0gICAgICAgIHJldHVybiBndGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBnZXRUZXh0U3RhcnQuLi4uIik7Ci0gICAgCWludCBndHMgPSByZWFkZXIuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuZ2V0VGV4dFN0YXJ0KCkgPSAiK2d0cyk7Ci0gICAgICAgIHJldHVybiByZWFkZXIuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgZ2V0VmVyc2lvbi4uLi4iKTsKLSAgICAJU3RyaW5nIGd2ID0gcmVhZGVyLmdldFZlcnNpb24oKTsKLSAgICAJZGVidWcoInJlYWRlci5nZXRWZXJzaW9uKCkgPSAiK2d2KTsKLSAgICAgICAgcmV0dXJuIGd2OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBoYXNOYW1lLi4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuaGFzTmFtZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmhhc05hbWUoKSA9ICIrYik7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGhhc05leHQuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5oYXNOZXh0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaGFzTmV4dCgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGhhc1RleHQuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5oYXNUZXh0KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaGFzVGV4dCgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGFyZzApIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGlzQXR0cmlidXRlU3BlY2lmaWVkLi4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoYXJnMCk7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyByZWFkZXIuaXNBdHRyaWJ1dGVTcGVjaWZpZWQoYXJnMCkgIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJzKCkgewotICAgIAlkZWJ1ZygiRW50ZXJpbmcgaXNDaGFyYWN0ZXJzLi4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuaXNDaGFyYWN0ZXJzKCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaXNDaGFyYWN0ZXJzKCkgPSAiK2IpOwotICAgICAgICByZXR1cm4gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBpc0VuZEVsZW1lbnQuLi4uIik7Ci0gICAgCWJvb2xlYW4gYiA9IHJlYWRlci5pc0VuZEVsZW1lbnQoKTsKLSAgICAJZGVidWcoInJlYWRlci5pc0VuZEVsZW1lbnQoKSA9ICIrYik7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGlzU3RhbmRhbG9uZS4uLi4iKTsKLSAgICAJYm9vbGVhbiBiID0gcmVhZGVyLmlzU3RhbmRhbG9uZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmlzU3RhbmRhbG9uZSgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBpc1N0YXJ0RWxlbWVudC4uLi4iKTsKLSAgICAJYm9vbGVhbiBiID0gcmVhZGVyLmlzU3RhcnRFbGVtZW50KCk7Ci0gICAgCWRlYnVnKCJyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSA9ICIrYik7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIGlzV2hpdGVTcGFjZS4uLi4iKTsKLSAgICAJYm9vbGVhbiBiID0gcmVhZGVyLmlzV2hpdGVTcGFjZSgpOwotICAgIAlkZWJ1ZygicmVhZGVyLmlzV2hpdGVTcGFjZSgpID0gIitiKTsKLSAgICAgICAgcmV0dXJuIGI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBuZXh0Li4uLiIpOwotICAgIAlpbnQgbnh0ID0gcmVhZGVyLm5leHQoKTsKLSAgICAJZGVidWcoInJlYWRlci5uZXh0KCkgPSAiK254dCk7Ci0gICAgICAgIHJldHVybiBueHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBuZXh0VGFnLi4uLiIpOwotICAgIAlpbnQgdGFnID0gcmVhZGVyLm5leHRUYWcoKTsKLSAgICAJZGVidWcoInJlYWRlci5uZXh0VGFnKCkgPSAiK3RhZyk7Ci0gICAgICAgIHJldHVybiB0YWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAJZGVidWcoIkVudGVyaW5nIHJlcXVpcmUuLi4uIik7Ci0gICAgCWRlYnVnKCJyZWFkZXIucmVxdWlyZSAtPiBhcmcwID0gIithcmcwKyIgLGFyZzEgPSAiK2FyZzErIiAsYXJnMiA9ICIrYXJnMik7Ci0gICAgICAgIHJlYWRlci5yZXF1aXJlKGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgCWRlYnVnKCJFbnRlcmluZyBzdGFuZGFsb25lU2V0Li4uLiIpOwotICAgIAlib29sZWFuIGIgPSByZWFkZXIuc3RhbmRhbG9uZVNldCgpOwotICAgIAlkZWJ1ZygicmVhZGVyLnN0YW5kYWxvbmVTZXQoKSA9ICIrYik7Ci0gICAgICAgIHJldHVybiBiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmIChpc0RlYnVnKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoc3RyKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1JlYWRlcjJXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9SZWFkZXIyV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NmNiMmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1JlYWRlcjJXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFJlYWRlcjJXcml0ZXIgVGhpcyBpcyBhIHNpbXBsZSBjb252ZXJ0ZXIgdGhhdCBpcyBjb25zdHJ1Y3RlZCB3aXRoIGFuIFhNTFN0cmVhbVJlYWRlciBhbmQgYWxsb3dzCi0gKiB5b3UgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIHRvIGFuIFhNTFN0cmVhbVdyaXRlci4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRlcjJXcml0ZXIgewotCi0gICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGZyb20gYSBSZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIgLS0gdGhlIGlucHV0IHRvIHRoZSBjb252ZXJ0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVhZGVyMldyaXRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7Ci0gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIG91dHB1dFRvIHRoZSB3cml0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3JpdGVyIC0tIHRoZSBvdXRwdXQgb2YgdGhlIGNvbnZlcnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dHB1dFRvKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBVc2luZyBPTSB0byBjb252ZXJ0IHRoZSByZWFkZXIgdG8gYSB3cml0ZXIuICBUaGlzIHNlZW1zIHRvIGJlCi0gICAgICAgIC8vIHRoZSBzYWZlc3Qgd2F5IHRvIG1ha2UgdGhlIGNvbnZlcnNpb24sIGFuZCBpdCBwcm9tb3RlcyBjb2RlIHJlLXVzZS4KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKTsKLSAgICAgICAgT01Eb2N1bWVudCBvbURvY3VtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudCgpOwotICAgICAgICBJdGVyYXRvciBpdCA9IG9tRG9jdW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT01Ob2RlIG9tTm9kZSA9IChPTU5vZGUpaXQubmV4dCgpOwotICAgICAgICAgICAgLy8gVE9ETyBVc2luZyBzZXJpYWxpemUgYW5kIGNvbnN1bWUKLSAgICAgICAgICAgIC8vIGNhdXNlZCBhbiBheGlvbSBidWcuLi5mYWxsaW5nIGJhY2sgdG8gc2VyaWFsaXplCi0gICAgICAgICAgICAvLyAod2hpY2ggaXMgbGVzcyBwZXJmb3JtYW50IGR1ZSB0byBvbSBjYWNoaW5nKQotICAgICAgICAgICAgLy9vbU5vZGUuc2VyaWFsaXplQW5kQ29uc3VtZSh3cml0ZXIpOwotICAgICAgICAgICAgb21Ob2RlLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENsb3NlIHRoZSByZWFkZXIKLSAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gd3JpdGUgdGhlIHJlYWRlciBjb250ZW50cyB0byBhIFN0cmluZwotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBc1N0cmluZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLQotICAgICAgICAvLyBXcml0ZSB0aGUgcmVhZGVyIHRvIHRoZSB3cml0ZXIKLSAgICAgICAgb3V0cHV0VG8od3JpdGVyKTsKLQotICAgICAgICAvLyBGbHVzaCB0aGUgd3JpdGVyIGFuZCBnZXQgdGhlIFN0cmluZwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgc3cuZmx1c2goKTsKLSAgICAgICAgU3RyaW5nIHN0ciA9IHN3LnRvU3RyaW5nKCk7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9SZXNldHRhYmxlUmVhZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvUmVzZXR0YWJsZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzdjNDIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9SZXNldHRhYmxlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi0vKioKLSAqIFJlc2V0dGFibGVSZWFkZXIgQSByZXNldHRhYmxlIFhNTFN0cmVhbVJlYWRlci4KLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5SZWFkZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc2V0dGFibGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0gICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgcmVzZXR0YWJsZSBYTUxTdHJlYW1SZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiBAcGFyYW0gcmVzZXR0YWJsZQotICAgICAqLwotICAgIHB1YmxpYyBSZXNldHRhYmxlUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsKLSAgICAgICAgc3VwZXIocmVhZGVyLCB0cnVlKTsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocmVhZGVyKTsKLSAgICAgICAgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyI25ld1JlYWRlcigpCi0gICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgbmV3UmVhZGVyKCkgewotICAgICAgICByZXR1cm4gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1NBQUpDb252ZXJ0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9TQUFKQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZjZhNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1NBQUpDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0vKiogU0FBSkNvbnZlcnRlciBQcm92aWRlcyBDb252ZXJzaW9uIGJldHdlZW4gU0FBSiBhbmQgT00gQ29uc3RydWN0ZWQgdmlhIHRoZSBTQUFKQ29udmVydGVyRmFjdG9yeSAqLwotcHVibGljIGludGVyZmFjZSBTQUFKQ29udmVydGVyIHsKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IE9NIFNPQVBFbnZsZW9wZSB0byBTQUFKIFNPQVBFbnZlbG9wZQotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudAotICAgICAqIEByZXR1cm4gU09BUEVudmVsb3BlCi0gICAgICogQHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZSB0b1NBQUoob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBvbUVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgU0FBSiBTT0FQRW52ZWxvcGUgdG8gT00gU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2FhakVudmVsb3BlCi0gICAgICogQHJldHVybiBPTSBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvT00oU09BUEVudmVsb3BlIHNhYWpFbnZlbG9wZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnQgU0FBSiBTT0FQRW52ZWxvcGUgdG8gT00gU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2FhakVudmVsb3BlCi0gICAgICogQHBhcmFtIEF0dGFjaG1lbnRzCi0gICAgICogQHJldHVybiBPTSBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvT00oU09BUEVudmVsb3BlIHNhYWpFbnZlbG9wZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50cyBhdHRhY2htZW50cykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBTT0FQRWxlbWVudCBpbnRvIGFuIE9NRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBFbGVtZW50Ci0gICAgICogQHJldHVybiBPTUVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHRvT00oU09BUEVsZW1lbnQgc29hcEVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgb21FbGVtZW50IGludG8gYSBTT0FQRWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBwYXJlbnQgU09BUEVsZW1lbnQuIFRoaXMgbWV0aG9kIHJlcXVpcmVzCi0gICAgICogdGhhdCB0aGUgcGFyZW50IGVsZW1lbnQgaGF2ZSBhbiBhbmNlc3RvciB0aGF0IGlzIGEgU09BUEVudmVsb3BlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSB1c2UgdGhlCi0gICAgICogdG9TQUFKKE9NRWxlbWVudCwgU09BUEVsZW1lbnQsIFNPQVBGYWN0b3J5KSBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBvbUVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcGFyZW50ICAgIFNPQVBFbGVtZW50Ci0gICAgICogQHJldHVybiBTT0FQRWxlbWVudCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcGFyZW50LgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqIEBzZWUgdG9TQUFKKE9NRWxlbWVudCwgU09BUEVsZW1lbnQsIFNPQVBGYWN0b3J5KQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCB0b1NBQUooT01FbGVtZW50IG9tRWxlbWVudCwgU09BUEVsZW1lbnQgcGFyZW50KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IG9tRWxlbWVudCBpbnRvIGEgU09BUEVsZW1lbnQgYW5kIGFkZCBpdCB0byB0aGUgcGFyZW50IFNPQVBFbGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudAotICAgICAqIEBwYXJhbSBwYXJlbnQgICAgU09BUEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2YgICAgICAgIFNPQVBGYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgTmFtZSBvYmplY3RzCi0gICAgICogQHJldHVybiBTT0FQRWxlbWVudCB0aGF0IHdhcyBhZGRlZCB0byB0aGUgcGFyZW50LgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiAqIEBzZWUgdG9TQUFKKE9NRWxlbWVudCwgU09BUEVsZW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHRvU0FBSihPTUVsZW1lbnQgb21FbGVtZW50LCBTT0FQRWxlbWVudCBwYXJlbnQsIFNPQVBGYWN0b3J5IHNmKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgTWVzc2FnZUZhY3RvcnkgdGhhdCBjYW4gc3VwcG9ydCB0aGUgU09BUCB2ZXJzaW9uIGlkZW50aWZpZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIGVudmVsb3BlIG5hbWVzcGFjZS4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiBpZiB0aGUgbmFtZXNwYWNlIGlzIFNPQVAgMS4yIGFuZCB0aGUgU0FBSiBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICogU09BUCAxLjIgb3IgdGhlIG5hbWVzcGFjZSBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRmFjdG9yeSBjcmVhdGVNZXNzYWdlRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvU09BUEVsZW1lbnRSZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9TT0FQRWxlbWVudFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTc1NjRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9TT0FQRWxlbWVudFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLmltcGwuWE1MU3RyZWFtUmVhZGVyRnJvbURPTTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi0vKiogU09BUEVsZW1lbnRSZWFkZXIgQ3JlYXRlcyBhbiBYTUxTdHJlYW1SZWFkZXIgYmFja2VkIGJ5IGEgU09BUEVsZW1lbnQgdHJlZS4gKi8KLXB1YmxpYyBjbGFzcyBTT0FQRWxlbWVudFJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLSAgICBTT0FQRWxlbWVudCBlbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlYWRlcgotICAgICAqIEBwYXJhbSByZXNldHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50UmVhZGVyKFNPQVBFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoX25ld1JlYWRlcihlbGVtZW50KSwgdHJ1ZSk7Ci0KLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyI25ld1JlYWRlcigpCi0gICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1SZWFkZXIgbmV3UmVhZGVyKCkgewotICAgICAgICByZXR1cm4gX25ld1JlYWRlcihlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHN0cmVhbSByZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFhNTFN0cmVhbVJlYWRlciBfbmV3UmVhZGVyKFNPQVBFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgLy8gQ29uc3RydWN0IGEgcmVhZGVyIGZyb20gYW4gZWxlbWVudAotICAgICAgICByZXR1cm4gbmV3IFhNTFN0cmVhbVJlYWRlckZyb21ET00oZWxlbWVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1N0YWNrYWJsZVJlYWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1N0YWNrYWJsZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDc1MDIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9TdGFja2FibGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogU3RhY2thYmxlUmVhZGVyIEEgU3RhY2thYmxlU3RyZWFtUmVhZGVyIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgbWV0aG9kIHB1c2goWE1MU3RyZWFtUmVhZGVyKQotICogPHAvPgotICogWW91IGNhbiBjYWxsIHB1c2goLi4uKSB0byBhZGQgYSBuZXcgWE1MU3RyZWFtUmVhZGVyLiAgVGhlIG5leHQgZXZlbnQgd2lsbCB1c2UgdGhlIHB1c2hlZCBzdHJlYW0KLSAqIHJlYWRlci4gQWZ0ZXIgdGhlIFhNTFN0cmVhbVJlYWRlciBpcyBjb25zdW1lZCwgaXQgaXMgYXV0b21hdGljYWxseSBwb3BwZWQgb2ZmIG9mIHRoZSBzdGFjay4KLSAqIDxwLz4KLSAqIE5vdGUgdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBTdGFja2FibGVSZWFkZXIgaXMgb25seSBhcHBsaWNhYmxlIGZvciB0aGUgdG9wbW9zdAotICogWE1MU3RyZWFtUmVhZGVyLiAgRm9yIGV4YW1wbGUgdGhlIE5hbWVzcGFjZUNvbnRleHQgdGhhdCBpcyByZXR1cm5lZCBpcyBub3QgYSBjb21iaW5hdGlvbiBvZiBhbGwKLSAqIHRoZSBuYW1lc3BhY2UgY29udGV4dHMgb24gdGhlIHN0YWNrLgotICovCi1wdWJsaWMgY2xhc3MgU3RhY2thYmxlUmVhZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyIHsKLQotICAgIFN0YWNrPFhNTFN0cmVhbVJlYWRlcj4gc3RhY2sgPSBuZXcgU3RhY2s8WE1MU3RyZWFtUmVhZGVyPigpOwotICAgIFhNTFN0cmVhbVJlYWRlciBjdXJyZW50ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHN0YWNrYWJsZSByZWFkZXIgd2l0aCB0aGUgaW5pdGlhbCByZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBmaXJzdAotICAgICAqLwotICAgIHB1YmxpYyBTdGFja2FibGVSZWFkZXIoWE1MU3RyZWFtUmVhZGVyIGZpcnN0KSB7Ci0gICAgICAgIGN1cnJlbnQgPSBmaXJzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdXNoIGEgbmV3IFN0cmVhbVJlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmVhbVJlYWRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1c2goWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFB1c2ggdGhlIGN1cnJlbnQgcmVhZGVyIGlmIGl0IGlzIG5vdCBjb25zdW1lZAotICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgY3VycmVudC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHN0YWNrLnB1c2goY3VycmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VycmVudCA9IHN0cmVhbVJlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBjdXJyZW50LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0QXR0cmlidXRlTmFtZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWVzcGFjZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0QXR0cmlidXRlUHJlZml4KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRBdHRyaWJ1dGVUeXBlKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldEVsZW1lbnRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0RW5jb2RpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldExvY2FsTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldE5hbWVzcGFjZVByZWZpeChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZXNwYWNlVVJJKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldE5hbWVzcGFjZVVSSShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0UElEYXRhKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0UElUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0UHJlZml4KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgYXJnMCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldFByb3BlcnR5KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldFRleHRDaGFyYWN0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0Q2hhcmFjdGVycyhpbnQgYXJnMCwgY2hhcltdIGFyZzEsIGludCBhcmcyLCBpbnQgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRUZXh0Q2hhcmFjdGVycyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmdldFRleHRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0VGV4dFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaGFzTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3RhY2sgb25seSBjb250YWlucyByZWFkZXJzIHRoYXQgYXJlIG5vdCBjb25zdW1lZAotICAgICAgICBpZiAoIWN1cnJlbnQuaGFzTmV4dCgpICYmCi0gICAgICAgICAgICAgICAgIXN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBlZWsoKS5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50Lmhhc1RleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5pc0F0dHJpYnV0ZVNwZWNpZmllZChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmlzQ2hhcmFjdGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5kRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaXNFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5pc1N0YW5kYWxvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQuaXNTdGFydEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50LmlzV2hpdGVTcGFjZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IG5leHQgaXMgYWxsb3dlZCB0byBwb3AgdGhlIHN0YWNrCi0gICAgICAgIGlmICghY3VycmVudC5oYXNOZXh0KCkgJiYKLSAgICAgICAgICAgICAgICAhc3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBjdXJyZW50ID0gc3RhY2sucG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgZXZlbnQgb24gdGhlIHN0cmVhbSByZWFkZXIgd2FzIHByb2Nlc3NlZAotICAgICAgICAvLyBwcmlvciB0byBwdXNoaW5nIGEgbmV3IHhtbHN0cmVhbXJlYWRlci4gIHRodXMgd2UgcHJvY2VlZCB0byB0aGUgbmV4dAotICAgICAgICAvLyBldmVudCBpbiBhbGwgY2FzZXMKLSAgICAgICAgaW50IHRhZyA9IGN1cnJlbnQubmV4dCgpOwotCi0gICAgICAgIC8vIFNraXAgc3RhcnQgZG9jdW1lbnQgYW5kIGVuZCBkb2N1bWVudCBldmVudHMgZm9yCi0gICAgICAgIC8vIHN0YWNrZWQgc3RyZWFtIHJlYWRlcnMKLSAgICAgICAgaWYgKCh0YWcgPT0gdGhpcy5TVEFSVF9ET0NVTUVOVCB8fAotICAgICAgICAgICAgICAgIHRhZyA9PSB0aGlzLkVORF9ET0NVTUVOVCkgJiYKLSAgICAgICAgICAgICAgICAhc3RhY2suaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB0YWcgPSBuZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGFnOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoIWN1cnJlbnQuaGFzTmV4dCgpICYmCi0gICAgICAgICAgICAgICAgIXN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnBlZWsoKS5uZXh0VGFnKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnQubmV4dFRhZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGN1cnJlbnQucmVxdWlyZShhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICByZXR1cm4gY3VycmVudC5zdGFuZGFsb25lU2V0KCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxGYXVsdFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvWE1MRmF1bHRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Q0MTgwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxGYXVsdFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Um9sZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0U3ViQ29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0Q29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHRSZWFzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuT01CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU0FBSkNvbnZlcnRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHV0aWxpdGllcyB1c2VkIGJ5IHRoZSBNZXNzYWdlIGltcGxlbWVudGF0aW9uIHRvIHByb2Nlc3MgWE1MRmF1bHRzLgotICoKLSAqIEBzZWUgWE1MRmF1bHQKLSAqLwotcHVibGljIGNsYXNzIFhNTEZhdWx0VXRpbHMgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW52ZWxvcGUgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBTT0FQRW52ZWxvcGUgY29udGFpbnMgYSBTT0FQRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYXVsdChqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChib2R5LmdldEZhdWx0KCkgIT0gbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbnZlbG9wZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBTT0FQRW52ZWxvcGUgY29udGFpbnMgYSBTT0FQRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYXVsdChTT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHsKLSAgICAgICAgcmV0dXJuIGVudmVsb3BlLmhhc0ZhdWx0KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBibG9jayByZXByZXNlbnRpbmcgYSBtZXNzYWdlIHBheWxvYWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxvY2FsbmFtZSAmIG5hbWVzcGFjZSByZXByZXNlbnQgYSBTT0FQIDEuMSBvciBTT0FQIDEuMiBmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNGYXVsdChCbG9jayBiKSB7Ci0gICAgICAgIGlmIChiICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFuID0gYi5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKHFuICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBxbi5nZXRMb2NhbFBhcnQoKS5lcXVhbHMob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBDb25zdGFudHMuU09BUEZBVUxUX0xPQ0FMX05BTUUpCi0gICAgICAgICAgICAgICAgJiYgKHFuLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAgICAgICAgICB8fCBxbi5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gWE1MRmF1bHQgb2JqZWN0IGZyb20gYSBTT0FQRmF1bHQgYW5kIGRldGFpbCBCbG9ja3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwRmF1bHQKLSAgICAgKiBAcGFyYW0gZGV0YWlsQmxvY2tzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MRmF1bHQgY3JlYXRlWE1MRmF1bHQoU09BUEZhdWx0IHNvYXBGYXVsdCwgQmxvY2tbXSBkZXRhaWxCbG9ja3MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gSGVyZSBpcyBhIHNhbXBsZSBjb21wcmVoZW5zaXZlIFNPQVAgMS4yIGZhdWx0IHdoaWNoIHdpbGwgaGVscCB5b3UgCi0gICAgICAgIC8vIHVuZGVyc3RhbmQgdGhlIHN0cnVjdHVyZS4KLSAgICAgICAgLy8gPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKLSAgICAgICAgLy8gICAgICAgICAgICAgICB4bWxuczptPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3RpbWVvdXRzIgotICAgICAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIj4KLSAgICAgICAgLy8gICA8ZW52OkJvZHk+Ci0gICAgICAgIC8vICAgICAgPGVudjpGYXVsdD4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgICAgICA8ZW52OlZhbHVlPm06TWVzc2FnZVRpbWVvdXQ8L2VudjpWYWx1ZT4KLSAgICAgICAgLy8gICAgICAgICAgPC9lbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbiI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImRlIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgICAgIC8vICAgICAgICA8ZW52Ok5vZGU+aHR0cDovL215LmV4YW1wbGUub3JnL05vZGU8L2VudjpOb2RlPgotICAgICAgICAvLyAgICAgICAgPGVudjpSb2xlPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Sb2xlPC9lbnY6Um9sZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6RGV0YWlsPgotICAgICAgICAvLyAgICAgICAgICA8bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgotICAgICAgICAvLyAgICAgICAgPC9lbnY6RGV0YWlsPiAgICAKLSAgICAgICAgLy8gICAgICA8L2VudjpGYXVsdD4KLSAgICAgICAgLy8gICA8L2VudjpCb2R5PgotICAgICAgICAvLyA8L2VudjpFbnZlbG9wZT4KLQotICAgICAgICAvLyBHZXQgdGhlIGNvZGUKLSAgICAgICAgLy8gVE9ETyB3aGF0IGlmIHRoaXMgZmFpbHMgPyAgTG9nIGEgbWVzc2FnZSBhbmQgdHJlYXQgbGlrZSBhIFJFQ0VJVkVSIGZhdWx0ID8KLQotICAgICAgICAvL2ZpZ3VyZW91dCB0aGUgc29hcCB2ZXJzaW9uCi0gICAgICAgIGJvb2xlYW4gaXNTb2FwMTEgPSBzb2FwRmF1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgIFNPQVBGYXVsdENvZGUgc29hcENvZGUgPSBzb2FwRmF1bHQuZ2V0Q29kZSgpOwotICAgICAgICBRTmFtZSBjb2RlUU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoaXNTb2FwMTEpIHsKLSAgICAgICAgICAgIGNvZGVRTmFtZSA9IHNvYXBDb2RlLmdldFRleHRBc1FOYW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2RlUU5hbWUgPSBzb2FwQ29kZS5nZXRWYWx1ZSgpLmdldFRleHRBc1FOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgWE1MRmF1bHRDb2RlIGNvZGUgPSBYTUxGYXVsdENvZGUuZnJvbVFOYW1lKGNvZGVRTmFtZSk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBwcmltYXJ5IHJlYXNvbiB0ZXh0Ci0gICAgICAgIC8vIFRPRE8gd2hhdCBpZiB0aGlzIGZhaWxzCi0gICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzb2FwUmVhc29uID0gc29hcEZhdWx0LmdldFJlYXNvbigpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBsYW5nID0gbnVsbDsKLSAgICAgICAgTGlzdCBzb2FwVGV4dHMgPSBudWxsOwotICAgICAgICBpZiAoaXNTb2FwMTEpIHsKLSAgICAgICAgICAgIHRleHQgPSBzb2FwUmVhc29uLmdldFRleHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBUZXh0cyA9IHNvYXBSZWFzb24uZ2V0QWxsU29hcFRleHRzKCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHJlYXNvblRleHQgPSAoU09BUEZhdWx0VGV4dClzb2FwVGV4dHMuZ2V0KDApOwotICAgICAgICAgICAgdGV4dCA9IHJlYXNvblRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgbGFuZyA9IHJlYXNvblRleHQuZ2V0TGFuZygpOwotICAgICAgICB9Ci0gICAgICAgIFhNTEZhdWx0UmVhc29uIHJlYXNvbiA9IG5ldyBYTUxGYXVsdFJlYXNvbih0ZXh0LCBsYW5nKTsKLQotICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIFhNTEZhdWx0IGZyb20gdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIChjb2RlLCByZWFzb24sIGRldGFpbCBibG9ja3MpCi0gICAgICAgIFhNTEZhdWx0IHhtbEZhdWx0ID0gbmV3IFhNTEZhdWx0KGNvZGUsIHJlYXNvbiwgZGV0YWlsQmxvY2tzKTsKLQotICAgICAgICAvLyBBZGQgdGhlIHNlY29uZGFyeSBmYXVsdCBpbmZvcm1hdGlvbgotCi0gICAgICAgIC8vIEdldCB0aGUgU3ViQ29kZXMKLSAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzb2FwU3ViQ29kZSA9IHNvYXBDb2RlLmdldFN1YkNvZGUoKTsKLSAgICAgICAgaWYgKHNvYXBTdWJDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8UU5hbWU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOwotCi0gICAgICAgICAgICAvLyBXYWxrIHRoZSBuZXN0ZWQgc3ViIGNvZGVzIGFuZCBjb2xsZWN0IHRoZSBxbmFtZXMKLSAgICAgICAgICAgIHdoaWxlIChzb2FwU3ViQ29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0VmFsdWUgc29hcFN1YkNvZGVWYWx1ZSA9IHNvYXBTdWJDb2RlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBzb2FwU3ViQ29kZVZhbHVlLmdldFRleHRBc1FOYW1lKCk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQocU5hbWUpOwotICAgICAgICAgICAgICAgIHNvYXBTdWJDb2RlID0gc29hcFN1YkNvZGUuZ2V0U3ViQ29kZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQdXQgdGhlIGNvbGxlY3RlZCBzdWIgY29kZSBxbmFtZXMgb250byB0aGUgeG1sRmF1bHQKLSAgICAgICAgICAgIFFOYW1lW10gcU5hbWVzID0gbmV3IFFOYW1lW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgIHhtbEZhdWx0LnNldFN1YkNvZGVzKGxpc3QudG9BcnJheShxTmFtZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgc2Vjb25kYXJ5IFJlYXNvbnMuLi50aGUgZmlyc3QgcmVhc29uIHdhcyBhbHJlYWR5IHNhdmVkIGFzIHRoZSBwcmltYXJ5IHJlYXNvbgotICAgICAgICBpZiAoc29hcFRleHRzICE9IG51bGwgJiYgc29hcFRleHRzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIFhNTEZhdWx0UmVhc29uW10gc2Vjb25kYXJ5UmVhc29ucyA9IG5ldyBYTUxGYXVsdFJlYXNvbltzb2FwVGV4dHMuc2l6ZSgpIC0gMV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNvYXBUZXh0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgc29hcFJlYXNvblRleHQgPSAoU09BUEZhdWx0VGV4dClzb2FwVGV4dHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHNlY29uZGFyeVJlYXNvbnNbaSAtIDFdID0gbmV3IFhNTEZhdWx0UmVhc29uKHNvYXBSZWFzb25UZXh0LmdldFRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwUmVhc29uVGV4dC5nZXRMYW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeG1sRmF1bHQuc2V0U2Vjb25kYXJ5UmVhc29ucyhzZWNvbmRhcnlSZWFzb25zKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgTm9kZQotICAgICAgICBTT0FQRmF1bHROb2RlIHNvYXBOb2RlID0gc29hcEZhdWx0LmdldE5vZGUoKTsKLSAgICAgICAgaWYgKHNvYXBOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhtbEZhdWx0LnNldE5vZGUoc29hcE5vZGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgUm9sZQotICAgICAgICBTT0FQRmF1bHRSb2xlIHNvYXBSb2xlID0gc29hcEZhdWx0LmdldFJvbGUoKTsKLSAgICAgICAgaWYgKHNvYXBSb2xlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHhtbEZhdWx0LnNldFJvbGUoc29hcFJvbGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sRmF1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIFhNTEZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEZhdWx0Ci0gICAgICogQHJldHVybiB4bWxGYXVsdAotICAgICAqIEB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MRmF1bHQgY3JlYXRlWE1MRmF1bHQoamF2YXgueG1sLnNvYXAuU09BUEZhdWx0IHNvYXBGYXVsdCkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgQmxvY2tbXSBkZXRhaWxCbG9ja3MgPSBnZXREZXRhaWxCbG9ja3Moc29hcEZhdWx0KTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhNTEZhdWx0KHNvYXBGYXVsdCwgZGV0YWlsQmxvY2tzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gWE1MRmF1bHQgb2JqZWN0IGZyb20gYSBTT0FQRmF1bHQgYW5kIGRldGFpbCBCbG9ja3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwRmF1bHQKLSAgICAgKiBAcGFyYW0gZGV0YWlsQmxvY2tzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgWE1MRmF1bHQgY3JlYXRlWE1MRmF1bHQoamF2YXgueG1sLnNvYXAuU09BUEZhdWx0IHNvYXBGYXVsdCwgQmxvY2tbXSBkZXRhaWxCbG9ja3MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVGhlIFNPQVBGYXVsdCBzdHJ1Y3R1cmUgaXMgbW9kZWxlZCBhZnRlciBTT0FQIDEuMi4gIAotICAgICAgICAvLyBIZXJlIGlzIGEgc2FtcGxlIGNvbXByZWhlbnNpdmUgU09BUCAxLjIgZmF1bHQgd2hpY2ggd2lsbCBoZWxwIHlvdSB1bmRlcnN0YW5kIHRoZQotICAgICAgICAvLyBzdHJ1Y3R1cmUuCi0gICAgICAgIC8vIDxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiCi0gICAgICAgIC8vICAgICAgICAgICAgICAgeG1sbnM6bT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy90aW1lb3V0cyIKLSAgICAgICAgLy8gICAgICAgICAgICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI+Ci0gICAgICAgIC8vICAgPGVudjpCb2R5PgotICAgICAgICAvLyAgICAgIDxlbnY6RmF1bHQ+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6VmFsdWU+ZW52OlNlbmRlcjwvZW52OlZhbHVlPgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlN1YmNvZGU+Ci0gICAgICAgIC8vICAgICAgICAgICAgPGVudjpWYWx1ZT5tOk1lc3NhZ2VUaW1lb3V0PC9lbnY6VmFsdWU+Ci0gICAgICAgIC8vICAgICAgICAgIDwvZW52OlN1YmNvZGU+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpDb2RlPgotICAgICAgICAvLyAgICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4iPlNlbmRlciBUaW1lb3V0PC9lbnY6VGV4dD4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJkZSI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgICAgICAvLyAgICAgICAgPC9lbnY6UmVhc29uPgotICAgICAgICAvLyAgICAgICAgPGVudjpOb2RlPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Ob2RlPC9lbnY6Tm9kZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Um9sZT5odHRwOi8vbXkuZXhhbXBsZS5vcmcvUm9sZTwvZW52OlJvbGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OkRldGFpbD4KLSAgICAgICAgLy8gICAgICAgICAgPG06TWF4VGltZT5QNU08L206TWF4VGltZT4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OkRldGFpbD4gICAgCi0gICAgICAgIC8vICAgICAgPC9lbnY6RmF1bHQ+Ci0gICAgICAgIC8vICAgPC9lbnY6Qm9keT4KLSAgICAgICAgLy8gPC9lbnY6RW52ZWxvcGU+Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBjb2RlIG9yIGRlZmF1bHQgY29kZQotICAgICAgICBRTmFtZSBjb2RlUU5hbWUgPSBzb2FwRmF1bHQuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICBYTUxGYXVsdENvZGUgY29kZSA9IFhNTEZhdWx0Q29kZS5mcm9tUU5hbWUoY29kZVFOYW1lKTsKLQotICAgICAgICAvLyBHZXQgdGhlIHByaW1hcnkgcmVhc29uIHRleHQKLSAgICAgICAgLy8gVE9ETyB3aGF0IGlmIHRoaXMgZmFpbHMKLSAgICAgICAgU3RyaW5nIHRleHQgPSBzb2FwRmF1bHQuZ2V0RmF1bHRTdHJpbmcoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZ0xvY2FsZSgpOwotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24odGV4dCwgbG9jYWxlVG9YbWxMYW5nKGxvY2FsZSkpOwotCi0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgWE1MRmF1bHQgZnJvbSB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gKGNvZGUsIHJlYXNvbiwgZGV0YWlsIGJsb2NrcykKLSAgICAgICAgWE1MRmF1bHQgeG1sRmF1bHQgPSBuZXcgWE1MRmF1bHQoY29kZSwgcmVhc29uLCBkZXRhaWxCbG9ja3MpOwotCi0KLSAgICAgICAgYm9vbGVhbiBpc1NPQVAxMiA9Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0LmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBzZWNvbmRhcnkgZmF1bHQgaW5mb3JtYXRpb24KLQotICAgICAgICAvLyBHZXQgdGhlIFN1YkNvZGVzCi0gICAgICAgIGlmIChpc1NPQVAxMikgewotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBzb2FwRmF1bHQuZ2V0RmF1bHRTdWJjb2RlcygpOwotICAgICAgICAgICAgTGlzdDxRTmFtZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSAoUU5hbWUpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKHFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBRTmFtZVtdIHN1YkNvZGVzID0gbmV3IFFOYW1lW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBzdWJDb2RlcyA9IGxpc3QudG9BcnJheShzdWJDb2Rlcyk7Ci0gICAgICAgICAgICAgICAgeG1sRmF1bHQuc2V0U3ViQ29kZXMoc3ViQ29kZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBzZWNvbmRhcnkgUmVhc29ucy4uLnRoZSBmaXJzdCByZWFzb24gd2FzIGFscmVhZHkgc2F2ZWQgYXMgdGhlIHByaW1hcnkgcmVhc29uCi0gICAgICAgIGlmIChpc1NPQVAxMikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdCA9IHNvYXBGYXVsdC5nZXRGYXVsdFJlYXNvbkxvY2FsZXMoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBMaXN0PFhNTEZhdWx0UmVhc29uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxYTUxGYXVsdFJlYXNvbj4oKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IChMb2NhbGUpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc29hcEZhdWx0LmdldEZhdWx0UmVhc29uVGV4dChsb2NhbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IFhNTEZhdWx0UmVhc29uKHRleHQsIGxvY2FsZVRvWG1sTGFuZyhsb2NhbGUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBYTUxGYXVsdFJlYXNvbltdIHNlY29uZGFyeVJlYXNvbnMgPSBuZXcgWE1MRmF1bHRSZWFzb25bbGlzdC5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlSZWFzb25zID0gbGlzdC50b0FycmF5KHNlY29uZGFyeVJlYXNvbnMpOwotICAgICAgICAgICAgICAgICAgICB4bWxGYXVsdC5zZXRTZWNvbmRhcnlSZWFzb25zKHNlY29uZGFyeVJlYXNvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgTm9kZQotICAgICAgICBpZiAoaXNTT0FQMTIpIHsKLSAgICAgICAgICAgIFN0cmluZyBzb2FwTm9kZSA9IHNvYXBGYXVsdC5nZXRGYXVsdE5vZGUoKTsKLSAgICAgICAgICAgIGlmIChzb2FwTm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgeG1sRmF1bHQuc2V0Tm9kZShzb2FwTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIFJvbGUKLSAgICAgICAgU3RyaW5nIHNvYXBSb2xlID0gc29hcEZhdWx0Ci0gICAgICAgICAgICAgICAgLmdldEZhdWx0QWN0b3IoKTsgIC8vIGdldEZhdWx0QWN0b3Igd29ya3MgZm9yIGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yIHBlciBzcGVjCi0gICAgICAgIGlmIChzb2FwUm9sZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxGYXVsdC5zZXRSb2xlKHNvYXBSb2xlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB4bWxGYXVsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFhNTEZhdWx0IGNyZWF0ZVhNTEZhdWx0KEJsb2NrIGIsIFByb3RvY29sIHApIHsKLSAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgcmVxdWlyZW1lbnQgdGhhdCB3ZSBoYXZlIGEgZnVsbCBTT0FQIGVudmVsb3BlIHN0cnVjdHVyZSBhcwotICAgICAgICAvLyB0aGUgaW5wdXQgdG8gdGhlIFN0QVhTT0FQTW9kZWxCdWlsZGVyLCB3ZSBoYXZlIHRvIGhhdmUgYSBkdW1teSBlbnZlbG9wZQotICAgICAgICAvLyB0aGF0IHdyYXBzIG91ciBmYXVsdC4gIFRoaXMgd2lsbCBhbGxvdyB0aGUgQXhpb20gU09BUEZhdWx0IG9iamVjdCB0bwotICAgICAgICAvLyBiZSBjcmVhdGVkLiAgICAgICAgCi0gICAgICAgIE1lc3NhZ2UgbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgbSA9IG1mLmNyZWF0ZShwKTsKLSAgICAgICAgICAgIG0uc2V0Qm9keUJsb2NrKGIpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU09BUEVudmVsb3BlIGR1bW15RW52ID0gKFNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOyAgICAgICAgCi0gICAgICAgIAotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGR1bW15RW52LmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOwotICAgICAgICBTT0FQRW52ZWxvcGUgbmV3RW52ID0gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBuZXdFbnYuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmdldEZhdWx0KCk7Ci0gICAgICAgIAotICAgICAgICBCbG9ja1tdIGRldGFpbHMgPSBnZXREZXRhaWxCbG9ja3MoZmF1bHQpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIFhNTEZhdWx0VXRpbHMuY3JlYXRlWE1MRmF1bHQoZmF1bHQsIGRldGFpbHMpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBCbG9ja1tdIGdldERldGFpbEJsb2NrcyhTT0FQRmF1bHQgc29hcEZhdWx0KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCbG9ja1tdIGJsb2NrcyA9IG51bGw7Ci0gICAgICAgICAgICBTT0FQRmF1bHREZXRhaWwgZGV0YWlsID0gc29hcEZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgaWYgKGRldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYmxvY2sgZm9yIGVhY2ggZWxlbWVudAotICAgICAgICAgICAgICAgIE9NQmxvY2tGYWN0b3J5IGJmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChPTUJsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoT01CbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxCbG9jaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QmxvY2s+KCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBkZXRhaWwuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tID0gKE9NRWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBCbG9jayBiID0gYmYuY3JlYXRlRnJvbShvbSwgbnVsbCwgb20uZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibG9ja3MgPSBuZXcgQmxvY2tbbGlzdC5zaXplKCldOwotICAgICAgICAgICAgICAgIGJsb2NrcyA9IGxpc3QudG9BcnJheShibG9ja3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJsb2NrczsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCbG9ja1tdIGdldERldGFpbEJsb2NrcyhqYXZheC54bWwuc29hcC5TT0FQRmF1bHQgc29hcEZhdWx0KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQmxvY2tbXSBibG9ja3MgPSBudWxsOwotICAgICAgICAgICAgRGV0YWlsIGRldGFpbCA9IHNvYXBGYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgIGlmIChkZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEdldCBhIFNBQUotPk9NIGNvbnZlcnRlcgotICAgICAgICAgICAgICAgIFNBQUpDb252ZXJ0ZXJGYWN0b3J5IGNvbnZlcnRlckZhY3RvcnkgPSAoU0FBSkNvbnZlcnRlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmFjdG9yeShTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBjb252ZXJ0ZXJGYWN0b3J5LmdldFNBQUpDb252ZXJ0ZXIoKTsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIGJsb2NrIGZvciBlYWNoIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBPTUJsb2NrRmFjdG9yeSBiZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoT01CbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoT01CbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxCbG9jaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QmxvY2s+KCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBkZXRhaWwuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRGV0YWlsRW50cnkgZGUgPSAoRGV0YWlsRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb20gPSBjb252ZXJ0ZXIudG9PTShkZSk7Ci0gICAgICAgICAgICAgICAgICAgIEJsb2NrIGIgPSBiZi5jcmVhdGVGcm9tKG9tLCBudWxsLCBvbS5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsb2NrcyA9IG5ldyBCbG9ja1tsaXN0LnNpemUoKV07Ci0gICAgICAgICAgICAgICAgYmxvY2tzID0gbGlzdC50b0FycmF5KGJsb2Nrcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYmxvY2tzOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFNPQVBGYXVsdCByZXByZXNlbnRpbmcgdGhlIFhNTEZhdWx0IGFuZCBhdHRhY2ggaXQgdG8gYm9keS4gSWYgdGhlcmUgYXJlIDEgb3IgbW9yZQotICAgICAqIGRldGFpbCBCbG9ja3Mgb24gdGhlIFhNTEZhdWx0LCBhIFNPQVBGYXVsdERldGFpbCBpcyBhdHRhY2hlZC4gSWYgaWdub3JlRGV0YWlsQmxvY2tzPWZhbHNlLAotICAgICAqIHRoZW4gT01FbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIFNPQVBGYXVsdERldGFpbC4gSWYgaWdub3JlRGV0YWlsQmxvY2tzPXRydWUsIHRoZW4gdGhlIERldGFpbAotICAgICAqIEJsb2NrcyBhcmUgaWdub3JlZCAodGhpcyBpcyBuZWNlc3NhcnkgZm9yIFhNTFNwaW5lIHByb2Nlc3NpbmcpCi0gICAgICoKLSAgICAgKiBAcGFyYW0geG1sRmF1bHQKLSAgICAgKiBAcGFyYW0gYm9keSAgICAgICAgICAgICAgIC0gQXNzdW1lcyB0aGF0IHRoZSBib2R5IGlzIGVtcHR5Ci0gICAgICogQHBhcmFtIGlnbm9yZURldGFpbEJsb2NrcyB0cnVlIG9yIGZhbHMKLSAgICAgKiBAcmV0dXJuIFNPQVBGYXVsdCAod2hpY2ggaXMgYXR0YWNoZWQgdG8gYm9keSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBGYXVsdCBjcmVhdGVTT0FQRmF1bHQoWE1MRmF1bHQgeG1sRmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBCb2R5IGJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaWdub3JlRGV0YWlsQmxvY2tzKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBmYWN0b3J5IGFuZCBjcmVhdGUgdGhlIHNvYXBGYXVsdAotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZVV0aWxzLmdldFNPQVBGYWN0b3J5KGJvZHkpOwotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHQoYm9keSk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gYm9keS5nZXROYW1lc3BhY2UoKTsKLQotICAgICAgICAvLyBUaGUgU09BUEZhdWx0IHN0cnVjdHVyZSBpcyBtb2RlbGVkIGFmdGVyIFNPQVAgMS4yLiAgCi0gICAgICAgIC8vIEhlcmUgaXMgYSBzYW1wbGUgY29tcHJlaGVuc2l2ZSBTT0FQIDEuMiBmYXVsdCB3aGljaCB3aWxsIGhlbHAgeW91IHVuZGVyc3RhbmQgdGhlCi0gICAgICAgIC8vIHN0cnVjdHVyZS4KLSAgICAgICAgLy8gPGVudjpFbnZlbG9wZSB4bWxuczplbnY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIKLSAgICAgICAgLy8gICAgICAgICAgICAgICB4bWxuczptPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3RpbWVvdXRzIgotICAgICAgICAvLyAgICAgICAgICAgICAgIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIj4KLSAgICAgICAgLy8gICA8ZW52OkJvZHk+Ci0gICAgICAgIC8vICAgICAgPGVudjpGYXVsdD4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Q29kZT4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpWYWx1ZT5lbnY6U2VuZGVyPC9lbnY6VmFsdWU+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgICAgICA8ZW52OlZhbHVlPm06TWVzc2FnZVRpbWVvdXQ8L2VudjpWYWx1ZT4KLSAgICAgICAgLy8gICAgICAgICAgPC9lbnY6U3ViY29kZT4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OkNvZGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OlJlYXNvbj4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJlbiI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlRleHQgeG1sOmxhbmc9ImRlIj5TZW5kZXIgVGltZW91dDwvZW52OlRleHQ+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpSZWFzb24+Ci0gICAgICAgIC8vICAgICAgICA8ZW52Ok5vZGU+aHR0cDovL215LmV4YW1wbGUub3JnL05vZGU8L2VudjpOb2RlPgotICAgICAgICAvLyAgICAgICAgPGVudjpSb2xlPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Sb2xlPC9lbnY6Um9sZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6RGV0YWlsPgotICAgICAgICAvLyAgICAgICAgICA8bTpNYXhUaW1lPlA1TTwvbTpNYXhUaW1lPgotICAgICAgICAvLyAgICAgICAgPC9lbnY6RGV0YWlsPiAgICAKLSAgICAgICAgLy8gICAgICA8L2VudjpGYXVsdD4KLSAgICAgICAgLy8gICA8L2VudjpCb2R5PgotICAgICAgICAvLyA8L2VudjpFbnZlbG9wZT4KLQotICAgICAgICBib29sZWFuIGlzU29hcDExID0gc29hcEZhdWx0LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpCi0gICAgICAgICAgICAgICAgLmVxdWFscyhTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgICAvLyBTZXQgdGhlIHByaW1hcnkgQ29kZSBWYWx1ZQotICAgICAgICBTT0FQRmF1bHRDb2RlIHNvYXBDb2RlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRDb2RlKHNvYXBGYXVsdCk7Ci0gICAgICAgIFFOYW1lIHNvYXBWYWx1ZVFOYW1lID0geG1sRmF1bHQuZ2V0Q29kZSgpLnRvUU5hbWUobnMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBpZiAoaXNTb2FwMTEpIHsKLSAgICAgICAgICAgIHNvYXBDb2RlLnNldFRleHQoc29hcFZhbHVlUU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU09BUEZhdWx0VmFsdWUgc29hcFZhbHVlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzb2FwQ29kZSk7Ci0gICAgICAgICAgICBzb2FwVmFsdWUuc2V0VGV4dChzb2FwVmFsdWVRTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIHByaW1hcnkgUmVhc29uIFRleHQKLSAgICAgICAgU09BUEZhdWx0UmVhc29uIHNvYXBSZWFzb24gPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJlYXNvbihzb2FwRmF1bHQpOwotICAgICAgICBpZiAoaXNTb2FwMTEpIHsKLSAgICAgICAgICAgIHNvYXBSZWFzb24uc2V0VGV4dCh4bWxGYXVsdC5nZXRSZWFzb24oKS5nZXRUZXh0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwVGV4dCA9IGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VGV4dChzb2FwUmVhc29uKTsKLSAgICAgICAgICAgIHNvYXBUZXh0LnNldFRleHQoeG1sRmF1bHQuZ2V0UmVhc29uKCkuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIHNvYXBUZXh0LnNldExhbmcoeG1sRmF1bHQuZ2V0UmVhc29uKCkuZ2V0TGFuZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgRGV0YWlsIGFuZCBjb250ZW50cyBvZiBEZXRhaWwKLSAgICAgICAgQmxvY2tbXSBibG9ja3MgPSB4bWxGYXVsdC5nZXREZXRhaWxCbG9ja3MoKTsKLSAgICAgICAgaWYgKGJsb2NrcyAhPSBudWxsICYmIGJsb2Nrcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHREZXRhaWwgZGV0YWlsID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHREZXRhaWwoc29hcEZhdWx0KTsKLSAgICAgICAgICAgIGlmICghaWdub3JlRGV0YWlsQmxvY2tzKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQSBCbG9jayBpbXBsZW1lbnRzIE9NRGF0YVNvdXJjZS4gIFNvIGNyZWF0ZSBPTVNvdXJjZWRFbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBvZiB0aGUgQmxvY2tzLgotICAgICAgICAgICAgICAgICAgICBPTVNvdXJjZWRFbGVtZW50SW1wbCBlbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT01Tb3VyY2VkRWxlbWVudEltcGwoYmxvY2tzW2ldLmdldFFOYW1lKCksIGZhY3RvcnksIGJsb2Nrc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbC5hZGRDaGlsZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgc2V0IGFsbCBvZiB0aGUgc2Vjb25kYXJ5IGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIC8vIFNldCB0aGUgU3ViQ29kZXMKLSAgICAgICAgUU5hbWVbXSBzdWJDb2RlcyA9IHhtbEZhdWx0LmdldFN1YkNvZGVzKCk7Ci0gICAgICAgIGlmIChzdWJDb2RlcyAhPSBudWxsICYmIHN1YkNvZGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBjdXJyID0gc29hcENvZGU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YkNvZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzdWJDb2RlID0gKGkgPT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRTdWJDb2RlKChTT0FQRmF1bHRDb2RlKWN1cnIpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlU09BUEZhdWx0U3ViQ29kZSgoU09BUEZhdWx0U3ViQ29kZSljdXJyKTsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwU3ViQ29kZVZhbHVlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzdWJDb2RlKTsKLSAgICAgICAgICAgICAgICBzb2FwU3ViQ29kZVZhbHVlLnNldFRleHQoc3ViQ29kZXNbaV0pOwotICAgICAgICAgICAgICAgIGN1cnIgPSBzdWJDb2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBzZWNvbmRhcnkgcmVhc29ucyBhbmQgbGFuZ3VhZ2VzCi0gICAgICAgIFhNTEZhdWx0UmVhc29uIHJlYXNvbnNbXSA9IHhtbEZhdWx0LmdldFNlY29uZGFyeVJlYXNvbnMoKTsKLSAgICAgICAgaWYgKHJlYXNvbnMgIT0gbnVsbCAmJiByZWFzb25zLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhc29ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgc29hcFJlYXNvblRleHQgPSBmYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFRleHQoc29hcFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgc29hcFJlYXNvblRleHQuc2V0VGV4dChyZWFzb25zW2ldLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc29hcFJlYXNvblRleHQuc2V0TGFuZyhyZWFzb25zW2ldLmdldExhbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIFJvbGUKLSAgICAgICAgaWYgKHhtbEZhdWx0LmdldFJvbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRSb2xlIHNvYXBSb2xlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRSb2xlKCk7Ci0gICAgICAgICAgICBzb2FwUm9sZS5zZXRUZXh0KHhtbEZhdWx0LmdldFJvbGUoKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuc2V0Um9sZShzb2FwUm9sZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIE5vZGUKLSAgICAgICAgaWYgKHhtbEZhdWx0LmdldE5vZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHROb2RlIHNvYXBOb2RlID0gZmFjdG9yeS5jcmVhdGVTT0FQRmF1bHROb2RlKCk7Ci0gICAgICAgICAgICBzb2FwTm9kZS5zZXRUZXh0KHhtbEZhdWx0LmdldE5vZGUoKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuc2V0Tm9kZShzb2FwTm9kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcEZhdWx0OwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTT0FQRmF1bHQgcmVwcmVzZW50aW5nIHRoZSBYTUxGYXVsdC4gSWYgdGhlcmUgYXJlIDEgb3IgbW9yZSBkZXRhaWwgQmxvY2tzIG9uIHRoZQotICAgICAqIFhNTEZhdWx0LCBhIFNPQVBGYXVsdERldGFpbCBpcyBhdHRhY2hlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxGYXVsdAotICAgICAqIEBwYXJhbSBib2R5Ci0gICAgICogQHJldHVybiBTT0FQRmF1bHQgKHdoaWNoIGlzIGF0dGFjaGVkIHRvIGJvZHkpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQgY3JlYXRlU0FBSkZhdWx0KFhNTEZhdWx0IHhtbEZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQQm9keSBib2R5KQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24sIFdlYlNlcnZpY2VFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEdldCB0aGUgZmFjdG9yeSBhbmQgY3JlYXRlIHRoZSBzb2FwRmF1bHQKLSAgICAgICAgU3RyaW5nIHByb3RvY29sTlMgPSBib2R5LmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgLy8gVGhlIFNPQVBGYXVsdCBzdHJ1Y3R1cmUgaXMgbW9kZWxlZCBhZnRlciBTT0FQIDEuMi4gIAotICAgICAgICAvLyBIZXJlIGlzIGEgc2FtcGxlIGNvbXByZWhlbnNpdmUgU09BUCAxLjIgZmF1bHQgd2hpY2ggd2lsbCBoZWxwIHlvdSB1bmRlcnN0YW5kIHRoZQotICAgICAgICAvLyBzdHJ1Y3R1cmUuCi0gICAgICAgIC8vIDxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiCi0gICAgICAgIC8vICAgICAgICAgICAgICAgeG1sbnM6bT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy90aW1lb3V0cyIKLSAgICAgICAgLy8gICAgICAgICAgICAgICB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI+Ci0gICAgICAgIC8vICAgPGVudjpCb2R5PgotICAgICAgICAvLyAgICAgIDxlbnY6RmF1bHQ+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OkNvZGU+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6VmFsdWU+ZW52OlNlbmRlcjwvZW52OlZhbHVlPgotICAgICAgICAvLyAgICAgICAgICA8ZW52OlN1YmNvZGU+Ci0gICAgICAgIC8vICAgICAgICAgICAgPGVudjpWYWx1ZT5tOk1lc3NhZ2VUaW1lb3V0PC9lbnY6VmFsdWU+Ci0gICAgICAgIC8vICAgICAgICAgIDwvZW52OlN1YmNvZGU+Ci0gICAgICAgIC8vICAgICAgICA8L2VudjpDb2RlPgotICAgICAgICAvLyAgICAgICAgPGVudjpSZWFzb24+Ci0gICAgICAgIC8vICAgICAgICAgIDxlbnY6VGV4dCB4bWw6bGFuZz0iZW4iPlNlbmRlciBUaW1lb3V0PC9lbnY6VGV4dD4KLSAgICAgICAgLy8gICAgICAgICAgPGVudjpUZXh0IHhtbDpsYW5nPSJkZSI+U2VuZGVyIFRpbWVvdXQ8L2VudjpUZXh0PgotICAgICAgICAvLyAgICAgICAgPC9lbnY6UmVhc29uPgotICAgICAgICAvLyAgICAgICAgPGVudjpOb2RlPmh0dHA6Ly9teS5leGFtcGxlLm9yZy9Ob2RlPC9lbnY6Tm9kZT4KLSAgICAgICAgLy8gICAgICAgIDxlbnY6Um9sZT5odHRwOi8vbXkuZXhhbXBsZS5vcmcvUm9sZTwvZW52OlJvbGU+Ci0gICAgICAgIC8vICAgICAgICA8ZW52OkRldGFpbD4KLSAgICAgICAgLy8gICAgICAgICAgPG06TWF4VGltZT5QNU08L206TWF4VGltZT4KLSAgICAgICAgLy8gICAgICAgIDwvZW52OkRldGFpbD4gICAgCi0gICAgICAgIC8vICAgICAgPC9lbnY6RmF1bHQ+Ci0gICAgICAgIC8vICAgPC9lbnY6Qm9keT4KLSAgICAgICAgLy8gPC9lbnY6RW52ZWxvcGU+Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBwcmltYXJ5IENvZGUgVmFsdWUKLSAgICAgICAgUU5hbWUgc29hcFZhbHVlUU5hbWUgPSB4bWxGYXVsdC5nZXRDb2RlKCkudG9RTmFtZShwcm90b2NvbE5TKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNvYXBGYXVsdC5nZXRQcmVmaXgoKTsKLSAgICAgICAgU3RyaW5nIHNvYXBWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc29hcFZhbHVlID0gc29hcFZhbHVlUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwVmFsdWUgPSBwcmVmaXggKyAiOiIgKyBzb2FwVmFsdWVRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfQotICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRDb2RlKHNvYXBWYWx1ZSk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBwcmltYXJ5IFJlYXNvbiBUZXh0Ci0gICAgICAgIFN0cmluZyByZWFzb25UZXh0ID0geG1sRmF1bHQuZ2V0UmVhc29uKCkuZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgcmVhc29uTGFuZyA9IHhtbEZhdWx0LmdldFJlYXNvbigpLmdldExhbmcoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IChyZWFzb25MYW5nICE9IG51bGwgJiYgcmVhc29uTGFuZy5sZW5ndGgoKSA+IDApID8KLSAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKHJlYXNvbkxhbmcpIDoKLSAgICAgICAgICAgICAgICBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRTdHJpbmcocmVhc29uVGV4dCwgbG9jYWxlKTsKLQotICAgICAgICAvLyBTZXQgdGhlIERldGFpbCBhbmQgY29udGVudHMgb2YgRGV0YWlsCi0gICAgICAgIEJsb2NrW10gYmxvY2tzID0geG1sRmF1bHQuZ2V0RGV0YWlsQmxvY2tzKCk7Ci0gICAgICAgIGlmIChibG9ja3MgIT0gbnVsbCAmJiBibG9ja3MubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgRGV0YWlsIGRldGFpbCA9IHNvYXBGYXVsdC5hZGREZXRhaWwoKTsKLSAgICAgICAgICAgIC8vIEdldCBhIE9NLT5TQUFKIGNvbnZlcnRlcgotICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkgY29udmVydGVyRmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChTQUFKQ29udmVydGVyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBTQUFKQ29udmVydGVyIGNvbnZlcnRlciA9IGNvbnZlcnRlckZhY3RvcnkuZ2V0U0FBSkNvbnZlcnRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIudG9TQUFKKGJsb2Nrc1tpXS5nZXRPTUVsZW1lbnQoKSwgZGV0YWlsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oeHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBzZXQgYWxsIG9mIHRoZSBzZWNvbmRhcnkgZmF1bHQgaW5mb3JtYXRpb24KLSAgICAgICAgLy8gU2V0IHRoZSBTdWJDb2RlcwotICAgICAgICBRTmFtZVtdIHN1YkNvZGVzID0geG1sRmF1bHQuZ2V0U3ViQ29kZXMoKTsKLSAgICAgICAgaWYgKHN1YkNvZGVzICE9IG51bGwgJiYgc3ViQ29kZXMubGVuZ3RoID4gMCAmJgotICAgICAgICAgICAgICAgIHByb3RvY29sTlMuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJDb2Rlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5hcHBlbmRGYXVsdFN1YmNvZGUoc3ViQ29kZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBzZWNvbmRhcnkgcmVhc29ucyBhbmQgbGFuZ3VhZ2VzCi0gICAgICAgIFhNTEZhdWx0UmVhc29uIHJlYXNvbnNbXSA9IHhtbEZhdWx0LmdldFNlY29uZGFyeVJlYXNvbnMoKTsKLSAgICAgICAgaWYgKHJlYXNvbnMgIT0gbnVsbCAmJiByZWFzb25zLmxlbmd0aCA+IDAgJiYKLSAgICAgICAgICAgICAgICBwcm90b2NvbE5TLmVxdWFscyhTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhc29ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChyZWFzb25zW2ldLmdldExhbmcoKSA9PSBudWxsIHx8IHJlYXNvbnNbaV0uZ2V0TGFuZygpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKHJlYXNvbnNbaV0uZ2V0TGFuZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dChyZWFzb25zW2ldLmdldFRleHQoKSwgbG9jYWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgUm9sZQotICAgICAgICBpZiAoeG1sRmF1bHQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdEFjdG9yKAotICAgICAgICAgICAgICAgICAgICB4bWxGYXVsdC5nZXRSb2xlKCkpOyAgLy8gVXNlIEZhdWx0IGFjdG9yIGJlY2F1c2UgaXQgaXMgYXBwbGljYWJsZSBmb3IgU09BUCAxLjEgYW5kIFNPQVAgMS4yCi0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIE5vZGUuLi5vbmx5IGFwcGxpY2FibGUgZm9yIFNPQVAgMS4yCi0gICAgICAgIGlmICh4bWxGYXVsdC5nZXROb2RlKCkgIT0gbnVsbCAmJiBwcm90b2NvbE5TLmVxdWFscyhTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdFJvbGUoeG1sRmF1bHQuZ2V0Tm9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzb2FwRmF1bHQ7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29udmVydGUgYSBMb2NhbGUgb2JqZWN0IHRvIGFuIHhtbExhbmcgU3RyaW5nCi0gICAgICogQHBhcmFtIGxvY2FsZQotICAgICAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBmb3JtIDxsb2NhbGUuZ2V0TGFuZ3VhZ2UoKT4tPGxvY2FsZS5nZXRDb3VudHJ5KCk+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxvY2FsZVRvWG1sTGFuZyhMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSArICItIiArIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsYW5nID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIFN0cmluZyBjb3VudHJ5Q29kZSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0gICAgICAgIGlmIChjb3VudHJ5Q29kZSA9PSBudWxsIHx8IGNvdW50cnlDb2RlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBsYW5nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcobGFuZyArICItIiArIGNvdW50cnlDb2RlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvWE1MU3RyZWFtUmVhZGVyRmlsdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvWE1MU3RyZWFtUmVhZGVyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjM0YjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL1hNTFN0cmVhbVJlYWRlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi0vKioKLSAqIFhNTFN0cmVhbVJlYWRlckZpbHRlciBBYnN0cmFjdCBjbGFzcyB0aGF0IHNpbXBseSBkZWxlZ2F0ZXMgdG8gdGhlIGluaXRpYWwgcmVhZGVyLiBUaGlzIGNsYXNzIGlzCi0gKiB1c2VmdWwgZm9yIGJ1aWxkaW5nIGZpbHRlcnMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFN0cmVhbVJlYWRlckZpbHRlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIGRlbGVnYXRlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgRmlsdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhZGVyIFhNTFN0cmVhbVJlYWRlciB0aGF0IGlzIGZpbHRlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXJGaWx0ZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgewotICAgICAgICBkZWxlZ2F0ZSA9IHJlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldEF0dHJpYnV0ZU5hbWUoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZU5hbWUoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGFyZzApIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVByZWZpeChpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlUHJlZml4KGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlVHlwZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RWxlbWVudFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RW5jb2RpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV2ZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZXNwYWNlQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNwYWNlQ291bnQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VQcmVmaXgoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZXNwYWNlVVJJKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQSURhdGEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UElUYXJnZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByZWZpeCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGFyZzApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UHJvcGVydHkoYXJnMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0Q2hhcmFjdGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGFyZzAsIGNoYXJbXSBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFRleHRDaGFyYWN0ZXJzKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFRleHRMZW5ndGgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFRleHRTdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzVGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlU3BlY2lmaWVkKGludCBhcmcwKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0F0dHJpYnV0ZVNwZWNpZmllZChhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0NoYXJhY3RlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0VuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1N0YW5kYWxvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzU3RhcnRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5uZXh0VGFnKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZGVsZWdhdGUucmVxdWlyZShhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuc3RhbmRhbG9uZVNldCgpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxTdHJlYW1Xcml0ZXJXaXRoT1MuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9YTUxTdHJlYW1Xcml0ZXJXaXRoT1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzOWE1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvWE1MU3RyZWFtV3JpdGVyV2l0aE9TLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi0vKioNCi0gKiBYTUxTdHJlYW1SZWFkZXIgdGhhdCBleHBvc2VzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIE91dHB1dFN0cmVhbS4NCi0gKiBXcml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGlzIGZhc3RlciBpbiBzb21lIGNhc2VzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBYTUxTdHJlYW1Xcml0ZXJXaXRoT1MgaW1wbGVtZW50cyBYTUxTdHJlYW1Xcml0ZXIgew0KLSAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyOw0KLSAgICBTdHJpbmcgY2hhclNldEVuY29kaW5nOw0KLSAgICBPdXRwdXRTdHJlYW0gb3M7DQotICAgIA0KLQ0KLSAgICBwdWJsaWMgWE1MU3RyZWFtV3JpdGVyV2l0aE9TKE91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGNoYXJTZXRFbmNvZGluZykgDQotICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyKCk7DQotICAgICAgICB3cml0ZXIgPSBudWxsOyAvLyBXcml0ZXIgaXMgY3JlYXRlZCB3aGVuIG5lZWRlZA0KLSAgICAgICAgdGhpcy5vcyA9IG9zOw0KLSAgICAgICAgdGhpcy5jaGFyU2V0RW5jb2RpbmcgPSBjaGFyU2V0RW5jb2Rpbmc7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoZSB3cml0ZXIgaXMgY3JlYXRlZCBsYXppbHkuIA0KLSAgICAgKiBJZiBvbmx5IHRoZSBvdXRwdXQgc3RyZWFtIGlzIHVzZWQsIHRoZW4gdGhlIHdyaXRlciBpcyBuZXZlciBjcmVhdGVkLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVdyaXRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7DQotICAgICAgICAgICAgd3JpdGVyID0gIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3MsIGNoYXJTZXRFbmNvZGluZyk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHdyaXRlci5nZXROYW1lc3BhY2VDb250ZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICByZXR1cm4gd3JpdGVyLmdldFByZWZpeChhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBhcmcwKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gd3JpdGVyLmdldFByb3BlcnR5KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2UoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIuc2V0RGVmYXVsdE5hbWVzcGFjZShhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VDb250ZXh0KE5hbWVzcGFjZUNvbnRleHQgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci5zZXROYW1lc3BhY2VDb250ZXh0KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIuc2V0UHJlZml4KGFyZzAsIGFyZzEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXR0cmlidXRlKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKSANCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSANCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhcmcwLCBhcmcxLCBhcmcyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUF0dHJpYnV0ZShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXJnMCwgYXJnMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVDRGF0YShTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUNEYXRhKGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcmFjdGVycyhjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSANCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoYXJnMCwgYXJnMSwgYXJnMik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVDaGFyYWN0ZXJzKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNvbW1lbnQoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVDb21tZW50KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgYXJnMCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZURlZmF1bHROYW1lc3BhY2UoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVEVEQoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVEVEQoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikgDQotICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVFbXB0eUVsZW1lbnQoYXJnMCwgYXJnMSwgYXJnMik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVFbXB0eUVsZW1lbnQoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlRW1wdHlFbGVtZW50KGFyZzAsIGFyZzEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW1wdHlFbGVtZW50KFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlRW1wdHlFbGVtZW50KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW5kRG9jdW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUVuZEVsZW1lbnQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRW50aXR5UmVmKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlRW50aXR5UmVmKGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTmFtZXNwYWNlKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShhcmcwLCBhcmcxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIA0KLSAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGFyZzAsIGFyZzEpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RhcnREb2N1bWVudCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoYXJnMCwgYXJnMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydERvY3VtZW50KFN0cmluZyBhcmcwKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGNyZWF0ZVdyaXRlcigpOw0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnREb2N1bWVudChhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKSANCi0gICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBjcmVhdGVXcml0ZXIoKTsNCi0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoYXJnMCwgYXJnMSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdGFydEVsZW1lbnQoU3RyaW5nIGFyZzApIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgY3JlYXRlV3JpdGVyKCk7DQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoYXJnMCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBJZiB0aGlzIFhNTFN0cmVhbVdyaXRlciBpcyBjb25uZWN0ZWQgdG8gYW4gT3V0cHV0U3RyZWFtDQotICAgICAqIHRoZW4gdGhlIE91dHB1dFN0cmVhbSBpcyByZXR1cm5lZC4gIFRoaXMgYWxsb3dzIGEgbm9kZQ0KLSAgICAgKiAocGVyaGFwcyBhbiBPTVNvdXJjZWRFbGVtZW50KSB0byB3cml0ZSBpdHMgY29udGVudA0KLSAgICAgKiBkaXJlY3RseSB0byB0aGUgT3V0cHV0U3RyZWFtLg0KLSAgICAgKiBAcmV0dXJuIE91dHB1dFN0cmVhbSBvciBudWxsDQotICAgICAqLw0KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBpZiAob3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIEZsdXNoIHRoZSBzdGF0ZSBvZiB0aGUgd3JpdGVyLi5NYW55IHRpbWVzIHRoZSANCi0gICAgICAgICAgICAvLyB3cml0ZSBkZWZlcnMgdGhlIHdyaXRpbmcgb2YgdGFnIGNoYXJhY3RlcnMgKD4pDQotICAgICAgICAgICAgLy8gdW50aWwgdGhlIG5leHQgd3JpdGUuICBGbHVzaCBvdXQgdGhpcyBjaGFyYWN0ZXINCi0gICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhpcy53cml0ZUNoYXJhY3RlcnMoIiIpOyANCi0gICAgICAgICAgICAgICAgdGhpcy5mbHVzaCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9OYW1lc3BhY2VDb250ZXh0RnJvbURPTS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvTmFtZXNwYWNlQ29udGV4dEZyb21ET00uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1MDVjNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9OYW1lc3BhY2VDb250ZXh0RnJvbURPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuaW1wbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBOYW1lc3BhY2UgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGF0IHRoZSBjdXJyZW50IHNjb3BlLiBVdGlsaXR5IGNsYXNzIGZvciBYTUxTdHJlYW1SZWFkZXJGcm9tRE9NCi0gKgotICogQHNlZSBYTUxTdHJlYW1SZWFkZXJGcm9tRE9NCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VDb250ZXh0RnJvbURPTSBpbXBsZW1lbnRzIE5hbWVzcGFjZUNvbnRleHQgewotCi0gICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKiogQHBhcmFtIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHNjb3BlICovCi0gICAgTmFtZXNwYWNlQ29udGV4dEZyb21ET00oRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dCNnZXRQcmVmaXgoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5sb29rdXBQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0I2dldFByZWZpeGVzKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRQcmVmaXhlcyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gKChqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCllbGVtZW50KS5nZXRWaXNpYmxlTmFtZXNwYWNlUHJlZml4ZXMoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgTm9kZSBub2RlID0gZWxlbWVudDsKLSAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2FsayB0aGUgYXR0cmlidXRlcyBsb29raW5nIGZvciBuYW1lc3BhY2UgZGVjbGFyYXRpb25zCi0gICAgICAgICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9ICgoRWxlbWVudClub2RlKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cnMuaXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmdldE5vZGVWYWx1ZSgpLmVxdWFscyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5vZGVOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxucyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByZWZpeC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgbm90IG92ZXJyaWRkZW4gYnkgYSBkZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBhIGNsb3NlciBzY29wZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0LmNvbnRhaW5zKHByZWZpeCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROYW1lc3BhY2VVUkkocHJlZml4KS5lcXVhbHMobmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQb3AgdXAgdG8gdGhlIHBhcmVudCBub2RlCi0gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQubG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL3V0aWwvaW1wbC9TQUFKQ29udmVydGVyRmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1NBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRiMTAyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1NBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU0FBSkNvbnZlcnRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlcjsKLQotLyoqCi0gKiBTQUFKQ29udmVydGVyRmFjdG9yeUltcGwgR2V0IHRoZSBkZWZhdWx0IFNBQUpDb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24uIE9idGFpbiB0aGlzIGZhY3RvcnkgZnJvbQotICogdGhlIEZhY3RvcnlSZWdpc3RyeQotICovCi1wdWJsaWMgY2xhc3MgU0FBSkNvbnZlcnRlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgU0FBSkNvbnZlcnRlckZhY3RvcnkgewotCi0gICAgU0FBSkNvbnZlcnRlckltcGwgY29udmVydGVyID0gbmV3IFNBQUpDb252ZXJ0ZXJJbXBsKCk7Ci0KLSAgICAvKiogUmVxdWlyZWQgZm9yIEZhY3RvcnkgaW5zdGFudGlhdGlvbiAqLwotICAgIHB1YmxpYyBTQUFKQ29udmVydGVyRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNBQUpDb252ZXJ0ZXJGYWN0b3J5I2dldFNBQUpDb252ZXJ0ZXIoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU0FBSkNvbnZlcnRlciBnZXRTQUFKQ29udmVydGVyKCkgewotICAgICAgICByZXR1cm4gY29udmVydGVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvU0FBSkNvbnZlcnRlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1NBQUpDb252ZXJ0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDFmYTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvU0FBSkNvbnZlcnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU09BUEVsZW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNBQUpGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKiogU0FBSkNvbnZlcnRlckltcGwgUHJvdmlkZXMgYW4gY29udmVyc2lvbiBtZXRob2RzIGJldHdlZW4gT008LT5TQUFKICovCi1wdWJsaWMgY2xhc3MgU0FBSkNvbnZlcnRlckltcGwgaW1wbGVtZW50cyBTQUFKQ29udmVydGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTQUFKQ29udmVydGVySW1wbC5jbGFzcyk7Ci0KLSAgICAvKiogQ29uc3RydWN0ZWQgdmlhIFNBQUpDb252ZXJ0ZXJGYWN0b3J5ICovCi0gICAgU0FBSkNvbnZlcnRlckltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXIjdG9TQUFKKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpCi0gICAgICAqLwotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGUgdG9TQUFKKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgb21FbnZlbG9wZSkKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgZGVmYXVsdCBlbnZlbG9wZQotICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBvbUVudmVsb3BlLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBjcmVhdGVNZXNzYWdlRmFjdG9yeShucy5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNwID0gc20uZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIHNvYXBFbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBnZXRTT0FQRW52ZWxvcGUoKSBjYWxsIGNyZWF0ZXMgYSBkZWZhdWx0IFNPQVBFbnZlbG9wZSB3aXRoIGEgU09BUEhlYWRlciBhbmQgU09BUEJvZHkuCi0gICAgICAgICAgICAvLyBUaGUgU09BUEhlYWRlciBhbmQgU09BUEJvZHkgYXJlIHJlbW92ZWQgKHRoZXkgd2lsbCBiZSBhZGRlZCBiYWNrIGluIGlmIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlCi0gICAgICAgICAgICAvLyBPTUVudmVsb3BlKS4KLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIGlmIChzb2FwQm9keSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJvZHkuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gc29hcEVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgaWYgKHNvYXBIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBIZWFkZXIuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IGlmIHRoZXJlIGlzIGEgcmVhbCBPTSB0cmVlIG9yIGp1c3QgYSBiYWNraW5nIFhNTFN0cmVhbVJlYWRlci4KLSAgICAgICAgICAgIC8vIFRoZSBiZXN0IHdheSB0byB3YWxrIHRoZSBkYXRhIGlzIHRvIGdldCB0aGUgWE1MU3RyZWFtUmVhZGVyIGFuZCB1c2UgdGhpcwotICAgICAgICAgICAgLy8gdG8gYnVpbGQgdGhlIFNPQVBFbGVtZW50cwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IG9tRW52ZWxvcGUuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0KLSAgICAgICAgICAgIE5hbWVDcmVhdG9yIG5jID0gbmV3IE5hbWVDcmVhdG9yKHNvYXBFbnZlbG9wZSk7Ci0gICAgICAgICAgICBidWlsZFNPQVBUcmVlKG5jLCBzb2FwRW52ZWxvcGUsIG51bGwsIHJlYWRlciwgZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEVudmVsb3BlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TQUFKQ29udmVydGVyI3RvT00oamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlKQotICAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b09NKFNPQVBFbnZlbG9wZSBzYWFqRW52ZWxvcGUpIHsKLSAgICAgICAgcmV0dXJuIHRvT00oc2FhakVudmVsb3BlLCBudWxsKTsKLSAgICB9Ci0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9PTShTT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnRzKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAJICAgIGxvZy5kZWJ1ZygiQ29udmVydGluZyBTQUFKIFNPQVBFbnZlbG9wZSB0byBhbiBPTSBTT0FQRW52ZWxvcGUiKTsKLSAgICAJfSAgICAJCi0gICAgCQotICAgIAkvLyBCZWZvcmUgd2UgZG8gdGhlIGNvbnZlcnNpb24sIHdlIGhhdmUgdG8gZml4IHRoZSBRTmFtZXMgZm9yIGZhdWx0IGVsZW1lbnRzCi0gICAgICAgIF9maXhGYXVsdEVsZW1lbnRzKHNhYWpFbnZlbG9wZSk7ICAgICAgICAKLSAgICAgICAgLy8gR2V0IGEgWE1MU3RyZWFtUmVhZGVyIGJhY2tlZCBieSBhIFNPQVBFbGVtZW50IHRyZWUKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBTT0FQRWxlbWVudFJlYWRlcihzYWFqRW52ZWxvcGUpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IGEgU09BUCBPTSBCdWlsZGVyLiAgUGFzc2luZyBudWxsIGNhdXNlcyB0aGUgdmVyc2lvbiB0byBiZSBhdXRvbWF0aWNhbGx5IHRyaWdnZXJlZAotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIocmVhZGVyLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyKHJlYWRlciwgYXR0YWNobWVudHMsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBPTSBFbnZlbG9wZQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIG9tRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudCBleHBhbmRzIHRoZSBPTSB0cmVlLiAgVGhpcyBpcyAKLSAgICAgICAgLy8gYSBicnV0ZSBmb3JjZSB3b3JrYXJvdW5kIHRvIGdldCBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZSBvbSBzZXJpYWxpemF0aW9uCi0gICAgICAgIC8vICh0aGUgcHVsbCBzdHJlYW0gcGFyc2luZyB3YXMgbm90IHB1bGxpbmcgdGhlIGZpbmFsIHRhZykuCi0gICAgICAgIC8vIEZvdXIgdGhpbmdzIG5lZWQgdG8gb2NjdXI6Ci0gICAgICAgIC8vICAgYSkgYW5hbHl6ZSBmaXggdGhlIHNlcmlhbGl6YXRpb24vcHVsbCBzdHJlYW0gcHJvYmxlbS4KLSAgICAgICAgLy8gICBiKSBhZGQgYSBtZXRob2Qgc2lnbmF0dXJlIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gcmVxdWVzdCBidWlsZCBvciBubyBidWlsZAotICAgICAgICAvLyAgIGMpIGFkZCBhIG1ldGhvZCBzaWduYXR1cmUgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBlbmFibGUvZGlzYWJsZSBjYWNoaW5nCi0gICAgICAgIC8vICAgZCkgcG9zc2libHkgYWRkIGFuIG9wdGltaXphdGlvbiB0byB1c2UgT01TRSBmb3IgdGhlIGJvZHkgZWxlbWVudHMuLi50byBmbGF0dGVuIHRoZSB0cmVlLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgb21FbnZlbG9wZS5idWlsZCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBMZXQncyB0cnkgdG8gc2VlIGlmIHdlIGNhbiBzYXZlIHRoZSBlbnZlbG9wZSBhcyBhIHN0cmluZwotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIG1ha2UgaXQgaW50byBheGlvbSBTT0FQRW52ZWxvcGUKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9PTSh0b1N0cmluZyhzYWFqRW52ZWxvcGUpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbUVudmVsb3BlOwotICAgIH0KLQotICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b09NKFN0cmluZyB4bWwpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBHZXQgYSBTT0FQIE9NIEJ1aWxkZXIuICBQYXNzaW5nIG51bGwgY2F1c2VzIHRoZSB2ZXJzaW9uIHRvIGJlIGF1dG9tYXRpY2FsbHkgdHJpZ2dlcmVkCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIocmVhZGVyLCBudWxsKTsKLSAgICAgICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gdGhlIE9NIEVudmVsb3BlCi0gICAgICAgIHJldHVybiBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFNPQVBFbnZlbG9wZSBzYWFqRW52ZWxvcGUpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBUcmFuc2Zvcm1lciB0ZjsKLSAgICAgICAgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB0Zi50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShzYWFqRW52ZWxvcGUuZ2V0T3duZXJEb2N1bWVudCgpKSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXIjdG9PTShqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCkKLSAgICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCB0b09NKFNPQVBFbGVtZW50IHNvYXBFbGVtZW50KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgIAkJbG9nLmRlYnVnKCJDb252ZXJ0aW5nIFNBQUogU09BUEVsZW1lbnQgdG8gYW4gT01FbGVtZW50Iik7Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIC8vIEdldCBhIFhNTFN0cmVhbVJlYWRlciBiYWNrZWQgYnkgYSBTT0FQRWxlbWVudCB0cmVlCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgU09BUEVsZW1lbnRSZWFkZXIoc29hcEVsZW1lbnQpOwotICAgICAgICAvLyBHZXQgYSBPTSBCdWlsZGVyLgotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihyZWFkZXIpOwotICAgICAgICAvLyBDcmVhdGUgYW5kIHJldHVybiB0aGUgRWxlbWVudAotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAvLyBUT0RPIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IGV4cGFuZHMgdGhlIE9NIHRyZWUuICBUaGlzIGlzIAotICAgICAgICAvLyBhIGJydXRlIGZvcmNlIHdvcmthcm91bmQgdG8gZ2V0IGFyb3VuZCBhbiBhcHBhcmVudCBidWcgaW4gdGhlIG9tIHNlcmlhbGl6YXRpb24KLSAgICAgICAgLy8gKHRoZSBwdWxsIHN0cmVhbSBwYXJzaW5nIHdhcyBub3QgcHVsbGluZyB0aGUgZmluYWwgdGFnKS4KLSAgICAgICAgLy8gVGhyZWUgdGhpbmdzIG5lZWQgdG8gb2NjdXI6Ci0gICAgICAgIC8vICAgYSkgYW5hbHl6ZSBmaXggdGhlIHNlcmlhbGl6YXRpb24vcHVsbCBzdHJlYW0gcHJvYmxlbS4KLSAgICAgICAgLy8gICBiKSBhZGQgYSBtZXRob2Qgc2lnbmF0dXJlIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8gcmVxdWVzdCBidWlsZCBvciBubyBidWlsZAotICAgICAgICAvLyAgIGMpIGFkZCBhIG1ldGhvZCBzaWduYXR1cmUgdG8gYWxsb3cgdGhlIGNhbGxlciB0byBlbmFibGUvZGlzYWJsZSBjYWNoaW5nCi0gICAgICAgIG9tLmJ1aWxkKCk7Ci0gICAgICAgIHJldHVybiBvbTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlciN0b1NBQUoob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQsIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgdG9TQUFKKE9NRWxlbWVudCBvbUVsZW1lbnQsIFNPQVBFbGVtZW50IHBhcmVudCkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgIAlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAJCWxvZy5kZWJ1ZygiQ29udmVydGluZyBPTUVsZW1lbnQgdG8gYW4gU0FBSiBTT0FQRWxlbWVudCIpOwotICAgIAl9Ci0gICAgCQotICAgIAlYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgICAvLyBJZiB0aGUgT00gZWxlbWVudCBpcyBub3QgYXR0YWNoZWQgdG8gYSBwYXJzZXIgKGJ1aWxkZXIpLCB0aGVuIHRoZSBPTQotICAgICAgICAvLyBpcyBidWlsdCBhbmQgeW91IGNhbm5vdCBhc2sgZm9yIFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nLgotICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIE9NLiAgWW91IHNob3VsZCBiZSBhYmxlIHRvIGFzayB0aGUgT00gd2hldGhlcgotICAgICAgICAvLyBjYWNoaW5nIGlzIHN1cHBvcnRlZC4KLSAgICAgICAgaWYgKG9tRWxlbWVudC5nZXRCdWlsZGVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVhZGVyID0gb21FbGVtZW50LmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEVsZW1lbnQgZW52ID0gcGFyZW50OwotICAgICAgICB3aGlsZSAoZW52ICE9IG51bGwgJiYgIShlbnYgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpKSB7Ci0gICAgICAgICAgICBlbnYgPSBlbnYuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbnYgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU0FBSkNvbnZlcnRlckVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgTmFtZUNyZWF0b3IgbmMgPSBuZXcgTmFtZUNyZWF0b3IoKFNPQVBFbnZlbG9wZSllbnYpOwotICAgICAgICByZXR1cm4gYnVpbGRTT0FQVHJlZShuYywgbnVsbCwgcGFyZW50LCByZWFkZXIsIGZhbHNlKTsKLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5TQUFKQ29udmVydGVyI3RvU0FBSihvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQsIGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5KQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgdG9TQUFKKE9NRWxlbWVudCBvbUVsZW1lbnQsIFNPQVBFbGVtZW50IHBhcmVudCwgU09BUEZhY3Rvcnkgc2YpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgIAkJbG9nLmRlYnVnKCJDb252ZXJ0aW5nIE9NRWxlbWVudCB0byBhbiBTQUFKIFNPQVBFbGVtZW50Iik7Ci0gICAgCX0KLSAgICAJCi0gICAgCVhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOwotCi0gICAgICAgIC8vIElmIHRoZSBPTSBlbGVtZW50IGlzIG5vdCBhdHRhY2hlZCB0byBhIHBhcnNlciAoYnVpbGRlciksIHRoZW4gdGhlIE9NCi0gICAgICAgIC8vIGlzIGJ1aWx0IGFuZCB5b3UgY2Fubm90IGFzayBmb3IgWE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcuCi0gICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gT00uICBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gYXNrIHRoZSBPTSB3aGV0aGVyCi0gICAgICAgIC8vIGNhY2hpbmcgaXMgc3VwcG9ydGVkLgotICAgICAgICBpZiAob21FbGVtZW50LmdldEJ1aWxkZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWFkZXIgPSBvbUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBOYW1lQ3JlYXRvciBuYyA9IG5ldyBOYW1lQ3JlYXRvcihzZik7Ci0gICAgICAgIHJldHVybiBidWlsZFNPQVBUcmVlKG5jLCBudWxsLCBwYXJlbnQsIHJlYWRlciwgZmFsc2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgU09BUFRyZWUgRWl0aGVyIHRoZSByb290IG9yIHRoZSBwYXJlbnQgaXMgbnVsbC4gSWYgdGhlIHJvb3QgaXMgbnVsbCwgYSBuZXcgZWxlbWVudCBpcwotICAgICAqIGNyZWF0ZWQgdW5kZXIgdGhlIHBhcmVudCB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZWFkZXIgSWYgdGhlIHBhcmVudCBpcyBudWxsLCB0aGUgZXhpc3RpbmcKLSAgICAgKiByb290IGlzIHVwZGF0ZWQgd2l0aCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmMgICAgICAgICBOYW1lQ3JlYXRvcgotICAgICAqIEBwYXJhbSByb290ICAgICAgIFNPQVBFbGVtZW50ICh0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGRhdGEgaW4gdGhlIHJlYWRlcikKLSAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAodGhlIHBhcmVudCBvZiB0aGUgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgcmVhZGVyKQotICAgICAqIEBwYXJhbSByZWFkZXIgICAgIFhNTFN0cmVhbVJlYWRlci4gdGhlIGZpcnN0IFNUQVJUX0VMRU1FTlQgbWF0Y2hlcyB0aGUgcm9vdAotICAgICAqIEBwYXJhbSBxdWl0QXRCb2R5IC0gdHJ1ZSBpZiBxdWl0IHJlYWRpbmcgYWZ0ZXIgdGhlIGJvZHkgU1RBUlRfRUxFTUVOVAotICAgICAqLwotICAgIHByb3RlY3RlZCBTT0FQRWxlbWVudCBidWlsZFNPQVBUcmVlKE5hbWVDcmVhdG9yIG5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHJvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBxdWl0QXRCb2R5KQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXZlbnRJRCA9IHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChldmVudElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQ6IHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IFNUQVJUX0VMRU1FTlQgZGVmaW5lcyB0aGUgcHJlZml4IGFuZCBhdHRyaWJ1dGVzIG9mIHRoZSByb290Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVUYWdEYXRhKG5jLCByb290LCByZWFkZXIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSByb290OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBjcmVhdGVFbGVtZW50RnJvbVRhZyhuYywgcGFyZW50LCByZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpdEF0Qm9keSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb290OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQVRUUklCVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXZlbnROYW1lID0gIkFUVFJJQlVURSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91bmV4cGVjdGVkRXZlbnQoZXZlbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLk5BTUVTUEFDRTogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV2ZW50TmFtZSA9ICJOQU1FU1BBQ0UiOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZEV2ZW50KGV2ZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVDogewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DSEFSQUNURVJTOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkVGV4dE5vZGUocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5DREFUQTogewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFkZFRleHROb2RlKHJlYWRlci5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVDogewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU09BUCByZWFsbHkgZG9lc24ndCBoYXZlIGFuIGFkZXF1YXRlIHJlcHJlc2VudGF0aW9uIGZvciBjb21tZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhY3RvIHN0YW5kYXJkIGlzIHRvIGFkZCB0aGUgd2hvbGUgZWxlbWVudCBhcyBhIHRleHQgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRUZXh0Tm9kZSgiPCEtLSIgKyByZWFkZXIuZ2V0VGV4dCgpICsgIi0tPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuU1BBQ0U6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5hZGRUZXh0Tm9kZShyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0RPQ1VNRU5UOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkVORF9ET0NVTUVOVDogewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgcmVhZGVyIGFuZCBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjogewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5FTlRJVFlfUkVGRVJFTkNFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUuIHRoaXMgaXMgdW5leHBlY3RlZCBpbiBhIHdlYiBzZXJ2aWNlIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkRURDogewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlLiB0aGlzIGlzIHVuZXhwZWN0ZWQgaW4gYSB3ZWIgc2VydmljZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdW5leHBlY3RlZEV2ZW50KCJFdmVudElEICIgKyBTdHJpbmcudmFsdWVPZihldmVudElEKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIFNPQVBFbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgdGFnIGRhdGEKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYyAgICAgTmFtZUNyZWF0b3IKLSAgICAgKiBAcGFyYW0gcGFyZW50IFNPQVBFbGVtZW50IGZvciB0aGUgbmV3IFNPQVBFbGVtZW50Ci0gICAgICogQHBhcmFtIHJlYWRlciBYTUxTdHJlYW1SZWFkZXIgd2hvc2UgY3Vyc29yIGlzIGF0IHRoZSBTVEFSVF9FTEVNRU5UCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBTT0FQRWxlbWVudCBjcmVhdGVFbGVtZW50RnJvbVRhZyhOYW1lQ3JlYXRvciBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgU0FBSiBvYmplY3QgaXMgYSBwcm9kdWN0IG9mIGJvdGggdGhlCi0gICAgICAgIC8vIFFOYW1lIG9mIHRoZSBlbGVtZW50IGFuZCB0aGUgcGFyZW50IG9iamVjdC4gIEZvciBleGFtcGxlLAotICAgICAgICAvLyBBbGwgZWxlbWVudCBjaGlsZHJlbiBvZiBhIFNPQVBCb2R5IG11c3QgYmUgb2JqZWN0J3MgdGhhdCBhcmUgU09BUEJvZHlFbGVtZW50cy4KLSAgICAgICAgLy8gY3JlYXRlRWxlbWVudCBjcmVhdGVzIHRoZSBwcm9wZXIgY2hpbGQgZWxlbWVudC4KLSAgICAgICAgUU5hbWUgcU5hbWUgPSByZWFkZXIuZ2V0TmFtZSgpOwotICAgICAgICBTT0FQRWxlbWVudCBjaGlsZCA9IGNyZWF0ZUVsZW1lbnQocGFyZW50LCBxTmFtZSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSB0YWcgZGF0YSBvbiB0aGUgY2hpbGQKLSAgICAgICAgdXBkYXRlVGFnRGF0YShuYywgY2hpbGQsIHJlYWRlciwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBjaGlsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgY2hpbGQgU09BUEVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgU09BUEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gbmFtZSAgIE5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNPQVBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU09BUEVsZW1lbnQgcGFyZW50LCBRTmFtZSBxTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVsZW1lbnQgY2hpbGQ7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpIHsKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocGFyZW50LmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoIkJvZHkiKSkgewotICAgICAgICAgICAgICAgICAgICBjaGlsZCA9ICgoU09BUEVudmVsb3BlKXBhcmVudCkuYWRkQm9keSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gKChTT0FQRW52ZWxvcGUpcGFyZW50KS5hZGRIZWFkZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxkID0gcGFyZW50LmFkZENoaWxkRWxlbWVudChxTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU09BUEJvZHkpIHsKLSAgICAgICAgICAgIGlmIChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocGFyZW50LmdldE5hbWVzcGFjZVVSSSgpKSAmJgotICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoIkZhdWx0IikpIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9ICgoU09BUEJvZHkpcGFyZW50KS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZCA9ICgoU09BUEJvZHkpcGFyZW50KS5hZGRCb2R5RWxlbWVudChxTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU09BUEhlYWRlcikgewotICAgICAgICAgICAgY2hpbGQgPSAoKFNPQVBIZWFkZXIpcGFyZW50KS5hZGRIZWFkZXJFbGVtZW50KHFOYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTT0FQRmF1bHQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBhc3N1bWVzIHRoYXQgdGhlIGFkZENoaWxkRWxlbWVudCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgLy8gaXMgc21hcnQgZW5vdWdoIHRvIGFkZCAiRGV0YWlsIiBvciAiU09BUEZhdWx0RWxlbWVudCIgb2JqZWN0cy4KLSAgICAgICAgICAgIGNoaWxkID0gcGFyZW50LmFkZENoaWxkRWxlbWVudChxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRGV0YWlsKSB7Ci0gICAgICAgICAgICBjaGlsZCA9ICgoRGV0YWlsKXBhcmVudCkuYWRkRGV0YWlsRW50cnkocU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGQgPSBwYXJlbnQuYWRkQ2hpbGRFbGVtZW50KHFOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjaGlsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB1cGRhdGUgdGhlIHRhZyBkYXRhIG9mIHRoZSBTT0FQRWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIE5hbWVDcmVhdG9yIG5jCi0gICAgICogQHBhcmFtIGVsZW1lbnQgICAgIFNPQVBFbGVtZW50Ci0gICAgICogQHBhcmFtIHJlYWRlciAgICAgIFhNTFN0cmVhbVJlYWRlciB3aG9zZSBjdXJzb3IgaXMgYXQgU1RBUlRfRUxFTUVOVAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhZ0RhdGEoTmFtZUNyZWF0b3IgbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld0VsZW1lbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHJlYWRlci5nZXRQcmVmaXgoKTsKLSAgICAgICAgcHJlZml4ID0gKHByZWZpeCA9PSBudWxsKSA/ICIiIDogcHJlZml4OwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIGNvcnJlY3QKLSAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgIWVsZW1lbnQuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLSAgICAgICAgICAgIC8vIER1ZSB0byBhIGJ1ZyBpbiBBeGlvbSBET00gb3IgaW4gdGhlIHJlYWRlci4uLm5vdCBzdXJlIHdoZXJlIHlldCwKLSAgICAgICAgICAgIC8vIHRoZXJlIG1heSBiZSBhIG5vbi1udWxsIHByZWZpeCBhbmQgbm8gbmFtZXNwYWNlCi0gICAgICAgICAgICBTdHJpbmcgbnMgPSByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIW5ld0VsZW1lbnQpIHsgICAgCi0gICAgICAgICAgICAvLyBBZGQgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgcmVhZGVyIGZvciB0aGUgbWlzc2luZyBuYW1lc3BhY2VzCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmUgPSByZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IHJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4aXN0aW5nTlMgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSShwcmUpOwotICAgICAgICAgICAgICAgIGlmICghbnMuZXF1YWxzKGV4aXN0aW5nTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlTmFtZXNwYWNlRGVjbGFyYXRpb24ocHJlKTsgIC8vIElzIGl0IG5lY2Vzc2FyeSB0byByZW1vdmUgdGhlIGV4aXN0aW5nIHByZWZpeC9ucwotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKHByZSwgbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSByZWFkZXIKLSAgICAgICAgICAgIGludCBzaXplID0gcmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihyZWFkZXIuZ2V0TmFtZXNwYWNlUHJlZml4KGkpLCByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFkZEF0dHJpYnV0ZXMobmMsIGVsZW1lbnQsIHJlYWRlcik7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhdHRyaWJ1dGVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gTmFtZUNyZWF0b3IgbmMKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAgICAgU09BUEVsZW1lbnQgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiB0aGUgbmV3IGF0dHJpYnV0ZXMKLSAgICAgKiBAcGFyYW0gcmVhZGVyICAgICAgWE1MU3RyZWFtUmVhZGVyIHdob3NlIGN1cnNvciBpcyBhdCBTVEFSVF9FTEVNRU5UCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhOYW1lQ3JlYXRvciBuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHJlYWRlcgotICAgICAgICBpbnQgc2l6ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSByZWFkZXIuZ2V0QXR0cmlidXRlUHJlZml4KGkpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOwotICAgICAgICAgICAgTmFtZSBuYW1lID0gbmMuY3JlYXRlTmFtZShxTmFtZS5nZXRMb2NhbFBhcnQoKSwgcHJlZml4LCBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBlbGVtZW50LmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgX3VuZXhwZWN0ZWRFdmVudChTdHJpbmcgZXZlbnQpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJTQUFKQ29udmVydGVyRXJyMiIsIGV2ZW50KSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qCi0gICAgICogQSB1dGlsaXR5IG1ldGhvZCB0byBmaXggdGhlIGxvY2FsbmFtZXMgb2YgZWxlbWVudHMgd2l0aCBhbiBBeGlzMiBTQUFKCi0gICAgICogdHJlZS4gIFRoZSBTQUFKIGltcGwgcmVsaWVzIG9uIHRoZSBBeGlvbSBTT0FQIEFQSXMsIHdoaWNoIHJlcHJlc2VudCAKLSAgICAgKiBhbGwgZmF1bHRzIGFzIFNPQVAgMS4yLiAgVGhpcyBoYXMgdG8gYmUgY29ycmVjdGVkIGJlZm9yZSB3ZSBjYW4gY29udmVydAotICAgICAqIHRvIE9NIG9yIHRoZSBmYXVsdHMgd2lsbCBub3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkuIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBfZml4RmF1bHRFbGVtZW50cyhTT0FQRW52ZWxvcGUgZW52KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgU09BUCAxLjIgZW52ZWxvcGUsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLgotICAgICAgICAgICAgaWYgKGVudi5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOwotICAgICAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCAmJiAhYm9keS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAJCWxvZy5kZWJ1ZygiTm8gZmF1bHQgZm91bmQuICBObyBjb252ZXJzaW9uIG5lY2Vzc2FyeS4iKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYm9keSAhPSBudWxsICYmIGJvZHkuaGFzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIAlsb2cuZGVidWcoIkEgZmF1bHQgd2FzIGZvdW5kLiAgQ29udmVydGluZyB0aGUgZmF1bHQgY2hpbGQgZWxlbWVudHMgdG8gU09BUCAxLjEgZm9ybWF0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgCQotICAgICAgICAgICAgCVNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuZ2V0RmF1bHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSBmYXVsdC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSAoU09BUEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfQ09ERV9MT0NBTF9OQU1FKSkgeyAKLSAgICAgICAgICAgICAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAJCWxvZy5kZWJ1ZygiQ29udmVydGluZzogZmF1bHRjb2RlIik7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIAkvLyBBeGlzMiBTQUFKIHN0b3JlcyB0aGUgYWN1dGFsIGZhdWx0Y29kZSB0ZXh0IHVuZGVyIGEgU09BUEZhdWx0VmFsdWUgb2JqZWN0LCBzbyB3ZSBoYXZlIHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoYXQgYW5kIGFkZCBpdCBhcyBhIHRleHQgbm9kZSB1bmRlciB0aGUgb3JpZ2luYWwgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdmFsdWUgPSBzZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVsZW1lbnRJbXBsIHZhbHVlRWxlbWVudCA9IChvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVsZW1lbnRJbXBsKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50SW1wbCBlID0gdmFsdWVFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IGUuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IGNoaWxkID0gZmF1bHQuYWRkQ2hpbGRFbGVtZW50KG5ldyBRTmFtZShzZS5nZXROYW1lc3BhY2VVUkkoKSwgU09BUDExQ29uc3RhbnRzLlNPQVBfRkFVTFRfQ09ERV9MT0NBTF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkVGV4dE5vZGUoY29udGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlLmdldExvY2FsTmFtZSgpLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9ERVRBSUxfTE9DQUxfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAJCWxvZy5kZWJ1ZygiQ29udmVydGluZzogZGV0YWlsIik7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZS5zZXRFbGVtZW50UU5hbWUobmV3IFFOYW1lKHNlLmdldE5hbWVzcGFjZVVSSSgpLCBTT0FQMTFDb25zdGFudHMuU09BUF9GQVVMVF9ERVRBSUxfTE9DQUxfTkFNRSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNlLmdldExvY2FsTmFtZSgpLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9SRUFTT05fTE9DQUxfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAJCWxvZy5kZWJ1ZygiQ29udmVydGluZzogZmF1bHRzdHJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlLnNldEVsZW1lbnRRTmFtZShuZXcgUU5hbWUoc2UuZ2V0TmFtZXNwYWNlVVJJKCksIFNPQVAxMUNvbnN0YW50cy5TT0FQX0ZBVUxUX1NUUklOR19MT0NBTF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzMiBTQUFKIHN0b3JlcyB0aGUgYWN1dGFsIGZhdWx0c3RyaW5nIHRleHQgdW5kZXIgYSBTT0FQRmF1bHRWYWx1ZSBvYmplY3QsIHNvIHdlIGhhdmUgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhhdCBhbmQgYWRkIGl0IGFzIGEgdGV4dCBub2RlIHVuZGVyIHRoZSBvcmlnaW5hbCBlbGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSB2YWx1ZSA9IHNlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRWxlbWVudEltcGwgdmFsdWVFbGVtZW50ID0gKG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRWxlbWVudEltcGwpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRJbXBsIGUgPSB2YWx1ZUVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gZS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBjaGlsZCA9IGZhdWx0LmFkZENoaWxkRWxlbWVudChuZXcgUU5hbWUoc2UuZ2V0TmFtZXNwYWNlVVJJKCksIFNPQVAxMUNvbnN0YW50cy5TT0FQX0ZBVUxUX1NUUklOR19MT0NBTF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkVGV4dE5vZGUoY29udGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UuZGV0YWNoTm9kZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAJCWxvZy5kZWJ1ZygiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBjb252ZXJ0aW5nIGZhdWx0IGVsZW1lbnRzOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAJfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgTmFtZSBjYW4gYmUgY3JlYXRlZCBmcm9tIGVpdGhlciBhIFNPQVBFbnZlbG9wZSBvciBTT0FQRmFjdG9yeS4gRWl0aGVyIG9uZSBvciB0aGUgb3RoZXIgaXMKLSAgICAgKiBhdmFpbGFibGUgd2hlbiB0aGUgY29udmVydGVyIGlzIGNhbGxlZC4gTmFtZUNyZWF0b3IgcHJvdmlkZXMgYSBsZXZlbCBvZiBhYnN0cmFjdGlvbiB3aGljaAotICAgICAqIHNpbXBsaWZpZXMgdGhlIGNvZGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIE5hbWVDcmVhdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZW52ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQRmFjdG9yeSBzZiA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIE5hbWVDcmVhdG9yKFNPQVBFbnZlbG9wZSBlbnYpIHsKLSAgICAgICAgICAgIHRoaXMuZW52ID0gZW52OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE5hbWVDcmVhdG9yKFNPQVBGYWN0b3J5IHNmKSB7Ci0gICAgICAgICAgICB0aGlzLnNmID0gc2Y7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIE5hbWUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgICAgICAgKiBAcGFyYW0gcHJlZml4Ci0gICAgICAgICAqIEBwYXJhbSB1cmkKLSAgICAgICAgICogQHJldHVybiBOYW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHNmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2YuY3JlYXRlTmFtZShsb2NhbE5hbWUsIHByZWZpeCwgdXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudi5jcmVhdGVOYW1lKGxvY2FsTmFtZSwgcHJlZml4LCB1cmkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgY3JlYXRlTWVzc2FnZUZhY3RvcnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uLCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIFNBQUpGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VGYWN0b3J5KG5hbWVzcGFjZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvWE1MU3RyZWFtUmVhZGVyRnJvbURPTS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS91dGlsL2ltcGwvWE1MU3RyZWFtUmVhZGVyRnJvbURPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjcyYWFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvdXRpbC9pbXBsL1hNTFN0cmVhbVJlYWRlckZyb21ET00uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFhNTFN0cmVhbVJlYWRlciBjcmVhdGVkIGZyb20gd2Fsa2luZyBhIERPTS4gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyB1c2VkIGJ5Ci0gKiBTT0FQRWxlbWVudFJlYWRlci4KLSAqCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5TT0FQRWxlbWVudFJlYWRlcgotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RyZWFtUmVhZGVyRnJvbURPTSBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlciB7Ci0KLSAgICBwcml2YXRlIE5vZGUgY3Vyc29yOwotICAgIHByaXZhdGUgU3RhY2s8Tm9kZT4gbmV4dEN1cnNvclN0YWNrID0gbmV3IFN0YWNrPE5vZGU+KCk7Ci0gICAgcHJpdmF0ZSBOb2RlIHJvb3Q7Ci0gICAgcHJpdmF0ZSBpbnQgZXZlbnQgPSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRE9DVU1FTlQ7Ci0gICAgcHJpdmF0ZSBOb2RlIG5leHRDdXJzb3IgPSBudWxsOwotICAgIHByaXZhdGUgaW50IG5leHRFdmVudCA9IC0xOwotCi0gICAgcHJpdmF0ZSBOYW1lc3BhY2VDb250ZXh0RnJvbURPTSBjYWNoZU5DSSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFbGVtZW50IGNhY2hlTkNJS2V5ID0gbnVsbDsKLQotICAgIHByaXZhdGUgTGlzdCBjYWNoZU5EID0gbnVsbDsKLSAgICBwcml2YXRlIEVsZW1lbnQgY2FjaGVOREtleSA9IG51bGw7Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgWE1MU3RyZWFtUmVhZGVyIHdpdGggYW4gRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnZlbG9wZSBFbGVtZW50IChwcm9iYWJseSBhbiBTQUFKIFNPQVBFbnZlbG9wZSkgcmVwcmVzZW50aW5nIHRoZSBFbnZlbG9wZQotICAgICAqLwotICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXJGcm9tRE9NKEVsZW1lbnQgZW52ZWxvcGUpIHsKLSAgICAgICAgcm9vdCA9IGVudmVsb3BlOwotICAgICAgICBjdXJzb3IgPSByb290OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnIxIikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNuZXh0KCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyMiIpKTsKLSAgICAgICAgfQotICAgICAgICBnZXROZXh0KCk7Ci0gICAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7Ci0gICAgICAgIGV2ZW50ID0gbmV4dEV2ZW50OwotICAgICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI3JlcXVpcmUoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBldmVudCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGV2ZW50ICE9IHRoaXMuZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyMyIsIFN0cmluZy52YWx1ZU9mKGV2ZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YodGhpcy5ldmVudCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhbmFtZXNwYWNlLmVxdWFscyhjdXJzb3IuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyMyIsIG5hbWVzcGFjZSwgdGhpcy5jdXJzb3IuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2NhbFBhcnQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhbG9jYWxQYXJ0LmVxdWFscyhjdXJzb3IuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyMyIsIGxvY2FsUGFydCwgdGhpcy5jdXJzb3IuZ2V0TG9jYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldEVsZW1lbnRUZXh0KCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIG5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZXZlbnQgIT0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DSEFSQUNURVJTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0RBVEEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TUEFDRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkVOVElUWV9SRUZFUkVOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlBST0NFU1NJTkdfSU5TVFJVQ1RJT04gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DT01NRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXRFbGVtZW50VGV4dCgpIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0RWxlbWVudFRleHQoKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjbmV4dFRhZygpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBuZXh0KCk7Ci0gICAgICAgIHdoaWxlIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUyAmJiBpc1doaXRlU3BhY2UoKSB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DREFUQSAmJiBpc1doaXRlU3BhY2UoKSB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TUEFDRSB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIHx8Ci0gICAgICAgICAgICAgICAgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNPTU1FTlQpIHsKLSAgICAgICAgICAgIGV2ZW50ID0gbmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCkgewotICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI0IiwgIm5leHRUYWcoKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaGFzTmV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChldmVudCAhPSBYTUxTdHJlYW1SZWFkZXIuRU5EX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjY2xvc2UoKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldE5hbWVzcGFjZVVSSShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIGlmIChjdXJzb3IgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlQ29udGV4dCgpLmdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI0IiwgImdldE5hbWVzcGFjZVVSSShTdHJpbmcpIikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNpc1N0YXJ0RWxlbWVudCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaXNFbmRFbGVtZW50KCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2lzQ2hhcmFjdGVycygpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2lzV2hpdGVTcGFjZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsKLSAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DSEFSQUNURVJTIHx8Ci0gICAgICAgICAgICAgICAgZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNEQVRBKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoKENoYXJhY3RlckRhdGEpY3Vyc29yKS5nZXREYXRhKCk7Ci0gICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiAhKHN0Lmhhc01vcmVUb2tlbnMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIGxpc3Qgb2YgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyAqLwotICAgIHByaXZhdGUgTGlzdCBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgIExpc3QgYXR0cnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgbWFwID0gKChFbGVtZW50KWN1cnNvcikuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgaWYgKG1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBBdHRyIGF0dHIgPSAoQXR0ciltYXAuaXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscygieG1sbnMiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInhtbG5zOiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5hZGQoYXR0cik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXR0cnM7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0QXR0cmlidXRlcygpIikpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRBdHRyaWJ1dGVWYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbFBhcnQpIHsKLSAgICAgICAgaWYgKGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFbGVtZW50KWN1cnNvcikuZ2V0QXR0cmlidXRlTlMobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI0IiwgImdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZywgU3RyaW5nKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlQ291bnQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEF0dHJpYnV0ZUNvdW50KCkgewotICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlcygpLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlTmFtZShpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRBdHRyaWJ1dGVOYW1lKGludCBpbmRleCkgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilnZXRBdHRyaWJ1dGVzKCkuZ2V0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShhdHRyLmdldE5hbWVzcGFjZVVSSSgpLCBhdHRyLmdldExvY2FsTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGludCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGluZGV4KSB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWdldEF0dHJpYnV0ZXMoKS5nZXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gYXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaW50IGluZGV4KSB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWdldEF0dHJpYnV0ZXMoKS5nZXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlUHJlZml4KGludCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGluZGV4KSB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWdldEF0dHJpYnV0ZXMoKS5nZXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gYXR0ci5nZXRQcmVmaXgoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlVHlwZShpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZShpbnQgaW5kZXgpIHsKLSAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpZ2V0QXR0cmlidXRlcygpLmdldChpbmRleCk7Ci0gICAgICAgIHJldHVybiBhdHRyLmdldFNjaGVtYVR5cGVJbmZvKCkuZ2V0VHlwZU5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0QXR0cmlidXRlVmFsdWUoaW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpbmRleCkgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilnZXRBdHRyaWJ1dGVzKCkuZ2V0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50KQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVNwZWNpZmllZChpbnQgYXJnMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG9uIHRoaXMgZWxlbWVudAotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJYTUxTUkVycjQiLCAiZ2V0TmFtZXNwYWNlQ291bnQoKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0TmFtZXNwYWNlUHJlZml4KGludCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChjdXJzb3IgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgIHJldHVybiAoKE5hbWVzcGFjZURlY2xhcmUpbGlzdC5nZXQoaW5kZXgpKS5nZXRQcmVmaXgoKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXROYW1lc3BhY2VQcmVmaXgoaW50KSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0TmFtZXNwYWNlVVJJKGludCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChjdXJzb3IgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgIHJldHVybiAoKE5hbWVzcGFjZURlY2xhcmUpbGlzdC5nZXQoaW5kZXgpKS5nZXRVUkkoKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXROYW1lc3BhY2VVUkkoaW50KSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0TmFtZXNwYWNlQ29udGV4dCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBOYW1lc3BhY2VDb250ZXh0IGdldE5hbWVzcGFjZUNvbnRleHQoKSB7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChjdXJzb3IgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpY3Vyc29yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRWxlbWVudCBwYXJlbnQgPSAoRWxlbWVudCljdXJzb3IuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gKEVsZW1lbnQpbmV4dEN1cnNvclN0YWNrLnBlZWsoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCljdXJzb3IuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50ID09IGNhY2hlTkNJS2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVOQ0k7Ci0gICAgICAgIH0KLSAgICAgICAgY2FjaGVOQ0lLZXkgPSBlbGVtZW50OwotICAgICAgICBjYWNoZU5DSSA9IG5ldyBOYW1lc3BhY2VDb250ZXh0RnJvbURPTShlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGNhY2hlTkNJOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRFdmVudFR5cGUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRUZXh0KCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoZXZlbnQgPT0gWE1MU3RyZWFtUmVhZGVyLkNIQVJBQ1RFUlMgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0RBVEEgfHwKLSAgICAgICAgICAgICAgICBldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVCkgewotICAgICAgICAgICAgcmV0dXJuICgoQ2hhcmFjdGVyRGF0YSljdXJzb3IpLmdldERhdGEoKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXRUZXh0KCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldFRleHRDaGFyYWN0ZXJzKCkKLSAgICAgICovCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldFRleHQoKS50b0NoYXJBcnJheSgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRUZXh0Q2hhcmFjdGVycyhpbnQsIGNoYXJbXSwgaW50LCBpbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IHNvdXJjZVN0YXJ0LCBjaGFyW10gdGFyZ2V0LCBpbnQgdGFyZ2V0U3RhcnQsIGludCBsZW5ndGgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0VGV4dCgpOwotICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHNvdXJjZUVuZCBpbmRleAotICAgICAgICBpbnQgc291cmNlRW5kID0gc291cmNlU3RhcnQgKyBsZW5ndGg7Ci0gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA8IHNvdXJjZUVuZCkgewotICAgICAgICAgICAgc291cmNlRW5kID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUuZ2V0Q2hhcnMoc291cmNlU3RhcnQsIHNvdXJjZUVuZCwgdGFyZ2V0LCB0YXJnZXRTdGFydCk7Ci0gICAgICAgIHJldHVybiBzb3VyY2VFbmQgLSBzb3VyY2VTdGFydDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0VGV4dFN0YXJ0KCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRUZXh0TGVuZ3RoKCkKLSAgICAgICovCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZ2V0VGV4dCgpLmxlbmd0aCgpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXRFbmNvZGluZygpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNoYXNUZXh0KCkKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIChldmVudCA9PSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUyB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DREFUQSB8fAotICAgICAgICAgICAgICAgIGV2ZW50ID09IFhNTFN0cmVhbVJlYWRlci5DT01NRU5UKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0TG9jYXRpb24oKQotICAgICAgKi8KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkdW1teUxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNnZXROYW1lKCkKLSAgICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChjdXJzb3IgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGN1cnNvci5nZXROYW1lc3BhY2VVUkkoKSwgY3Vyc29yLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXROYW1lKCkiKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldExvY2FsTmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIlhNTFNSRXJyNCIsICJnZXRMb2NhbE5hbWUoKSIpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjaGFzTmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoaXNTdGFydEVsZW1lbnQoKSB8fCBpc0VuZEVsZW1lbnQoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldE5hbWVzcGFjZVVSSSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldFByZWZpeCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5nZXRQcmVmaXgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyI2dldFZlcnNpb24oKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciNpc1N0YW5kYWxvbmUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YW5kYWxvbmUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjc3RhbmRhbG9uZVNldCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN0YW5kYWxvbmVTZXQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0UElUYXJnZXQoKQotICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIjZ2V0UElEYXRhKCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKiBTZXRzIG5leHRDdXJzb3IgYW5kIG5leHRFdmVudCBmcm9tIHVzaW5nIHRoZSBjdXJyZW50IGN1cnNvciBhbmQgZXZlbnQuICovCi0gICAgcHJpdmF0ZSB2b2lkIGdldE5leHQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgc3dpdGNoIChldmVudCkgewotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRE9DVU1FTlQ6IHsKLSAgICAgICAgICAgICAgICBuZXh0Q3Vyc29yID0gY3Vyc29yOwotICAgICAgICAgICAgICAgIG5leHRFdmVudCA9IFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5TVEFSVF9FTEVNRU5UOiB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0Q3Vyc29yU3RhY2sucHVzaChuZXh0Q3Vyc29yKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEN1cnNvciA9IGN1cnNvci5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudCA9IHN0YXJ0RXZlbnQobmV4dEN1cnNvcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50ID0gWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkFUVFJJQlVURTogewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI1IiwgIkFUVFJJQlVURSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLk5BTUVTUEFDRTogewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI1IiwgIk5BTUVTUEFDRSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkVORF9FTEVNRU5UOgotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUzoKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkNEQVRBOgotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVDoKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLlNQQUNFOgotICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1SZWFkZXIuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkVOVElUWV9SRUZFUkVOQ0U6Ci0gICAgICAgICAgICBjYXNlIFhNTFN0cmVhbVJlYWRlci5EVEQ6IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5leHRTaWJsaW5nKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0Q3Vyc29yID0gY3Vyc29yLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudCA9IHN0YXJ0RXZlbnQobmV4dEN1cnNvcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPT0gcm9vdCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQgPSBYTUxTdHJlYW1SZWFkZXIuRU5EX0RPQ1VNRU5UOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZG9lcyBub3Qgd29yayB3aXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIEF4aW9tIFRleHQgbm9kZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV4dEN1cnNvciA9IGN1cnNvci5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgYSBzdGFjayBpcyB1c2VkLgotICAgICAgICAgICAgICAgICAgICBuZXh0Q3Vyc29yID0gbmV4dEN1cnNvclN0YWNrLnBvcCgpOwotCi0gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudCA9IFhNTFN0cmVhbVJlYWRlci5FTkRfRUxFTUVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtUmVhZGVyLkVORF9ET0NVTUVOVDogewotICAgICAgICAgICAgICAgIG5leHRDdXJzb3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG5leHRFdmVudCA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiWE1MU1JFcnI1IiwgU3RyaW5nLnZhbHVlT2YoZXZlbnQpKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN0YXJ0IGV2ZW50IGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZQotICAgICAqCi0gICAgICogQHBhcmFtIG5vZGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc3RhcnRFdmVudChOb2RlIG5vZGUpIHsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENEQVRBU2VjdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlci5DREFUQTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuQ09NTUVOVDsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuVGV4dCkgewotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlRleHQgc29hcFRleHQgPSAoamF2YXgueG1sLnNvYXAuVGV4dClub2RlOwotICAgICAgICAgICAgICAgIGlmIChzb2FwVGV4dC5pc0NvbW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gWE1MU3RyZWFtUmVhZGVyLkNPTU1FTlQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlci5DSEFSQUNURVJTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuQ0hBUkFDVEVSUzsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVDsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHIpIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuQVRUUklCVVRFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRE9DVU1FTlQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHlSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgIHJldHVybiBYTUxTdHJlYW1SZWFkZXIuRU5USVRZX1JFRkVSRU5DRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIERvY3VtZW50VHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIFhNTFN0cmVhbVJlYWRlci5EVEQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgYSBkdW1teSBMb2NhdGlvbgotICAgIHByaXZhdGUgRHVtbXlMb2NhdGlvbiBkdW1teUxvY2F0aW9uID0gbmV3IER1bW15TG9jYXRpb24oKTsKLQotICAgIHByaXZhdGUgY2xhc3MgRHVtbXlMb2NhdGlvbiBpbXBsZW1lbnRzIExvY2F0aW9uIHsKLQotICAgICAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRDaGFyYWN0ZXJPZmZzZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zKCkgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoY3Vyc29yIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgZWxlbWVudCA9IChFbGVtZW50KWN1cnNvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gY2FjaGVOREtleSkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FjaGVOREtleSA9IGVsZW1lbnQ7Ci0gICAgICAgIGNhY2hlTkQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyID0gKEF0dHIpYXR0cnMuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJ4bWxucyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZURlY2xhcmUgbmQgPSBuZXcgTmFtZXNwYWNlRGVjbGFyZShwcmVmaXgsIGF0dHIuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBjYWNoZU5ELmFkZChuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWNoZU5EOwotICAgIH0KLQotICAgIGNsYXNzIE5hbWVzcGFjZURlY2xhcmUgewotICAgICAgICBTdHJpbmcgcHJlZml4OwotICAgICAgICBTdHJpbmcgdXJpOwotCi0gICAgICAgIE5hbWVzcGFjZURlY2xhcmUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewotICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgICAgICAgICB0aGlzLnVyaSA9IHVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJlZml4OwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldFVSSSgpIHsKLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBOb2RlIGdldE5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBjdXJzb3I7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvQ2xpZW50Q29uZmlndXJhdG9yUmVnaXN0cnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0NsaWVudENvbmZpZ3VyYXRvclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZTcyZmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvQ2xpZW50Q29uZmlndXJhdG9yUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuY29uZmlnLkFkZHJlc3NpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuY29uZmlnLk1UT01Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuY29uZmlnLlJlc3BlY3RCaW5kaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5DbGllbnRDb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotcHVibGljIGNsYXNzIENsaWVudENvbmZpZ3VyYXRvclJlZ2lzdHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDbGllbnRDb25maWd1cmF0b3I+IG1hcCA9Ci0gICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIENsaWVudENvbmZpZ3VyYXRvcj4oKTsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBtYXAucHV0KEFkZHJlc3NpbmdGZWF0dXJlLklELCBuZXcgQWRkcmVzc2luZ0NvbmZpZ3VyYXRvcigpKTsKLSAgICAgICAgbWFwLnB1dChTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuSUQsIG5ldyBBZGRyZXNzaW5nQ29uZmlndXJhdG9yKCkpOwotICAgICAgICBtYXAucHV0KE1UT01GZWF0dXJlLklELCBuZXcgTVRPTUNvbmZpZ3VyYXRvcigpKTsKLSAgICAgICAgbWFwLnB1dChSZXNwZWN0QmluZGluZ0ZlYXR1cmUuSUQsIG5ldyBSZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRvcihTdHJpbmcgaWQsIENsaWVudENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLSAgICAgICAgbWFwLnB1dChpZCwgY29uZmlndXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBDbGllbnRDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gbWFwLmdldChpZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0SWRzKCkgewotICAgICAgICByZXR1cm4gbWFwLmtleVNldCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L0ZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvRmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGVlM2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuQXhpczJFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuaW1wbC5BeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLmZhY3RvcnkuaW1wbC5KQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLmltcGwuSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVySW52b2tlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUHJlSW52b2tlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuaW1wbC5IYW5kbGVySW52b2tlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LmltcGwuSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuaW1wbC5IYW5kbGVyUHJlSW52b2tlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5saWZlY3ljbGUuZmFjdG9yeS5IYW5kbGVyTGlmZWN5Y2xlTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwuSkFYQkJsb2NrRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwuT01CbG9ja0ZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLlNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwuU291cmNlQmxvY2tGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuaW1wbC5YTUxTdHJpbmdCbG9ja0ZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5pbXBsLkRhdGFTb3VyY2VCbG9ja0ZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkNsYXNzRmluZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk9NQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNBQUpDb252ZXJ0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuWE1MUGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuWE1MU3RyaW5nQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkRhdGFTb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmltcGwuTWVzc2FnZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5pbXBsLlhNTFBhcnRGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5pbXBsLlNBQUpDb252ZXJ0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLlNlcnZpY2VJbnN0YW5jZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuZmFjdG9yeS5FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuZmFjdG9yeS5FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uV2ViU2VydmljZUNvbnRleHRJbmplY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uaW1wbC5XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuZmFjdG9yeS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5mYWN0b3J5LmltcGwuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSkFYV1NFeGVjdXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIAotICogRmFjdG9yeVJlZ2lzdHJ5IFJlZ2lzdHJ5IGNvbnRhaW5pbmcgRmFjdG9yaWVzIHJlbGF0ZWQgdG8gdGhlIEpBWC1XUyBJbXBsZW1lbnRhdGlvbi4KLSAqIFRoZSBleHBlY3RlZCBzY2VuYXJpbyBpczoKLSAqICAgMSkgTW9zdCBvciBhbGwgb2YgdGhlIGZhY3RvcmllcyBhcmUgcmVnaXN0ZXJlZCBkdXJpbmcgc3RhcnR1cC4KLSAqICAgMikgVGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIGdldEZhY3RvcnkgY2FsbHMKLSAqICAgMykgVGhlcmUgbWF5IGJlIGFuIGluZnJlcXVlbnQgY2FsbCB0byBzZXRGYWN0b3J5LgotICogICAKLSAqIFRodXMgYSAiY29weSBvbiBwdXQiIGFwcHJvYWNoIGlzIHVzZWQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgImdldHMiIGFyZSAKLSAqIGZhc3QgKGJlY2F1c2UgdGhleSBhcmUgdW5zeW5jaHJvbml6ZWQpLiAgVGhlICJwdXRzIiBhcmUgc2xvd2VyIGJlY2F1c2UgdGhleQotICogY3JlYXRlIGEgbmV3IGNvcHkgb2YgdGhlIEhhc2hNYXAuCi0gKiBTZWUgaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2phdmEvbGlicmFyeS9qLWhhc2htYXAuaHRtbAotICoqLwotcHVibGljIGNsYXNzIEZhY3RvcnlSZWdpc3RyeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXA8Q2xhc3MsIE9iamVjdD4gdGFibGU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvY2tib3ggPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEZhY3RvcnlSZWdpc3RyeS5jbGFzcyk7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgbG9nLmVycm9yKHQuZ2V0TWVzc2FnZSgpLCB0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGluaXQoKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBBbiB1bnN5bmNocm9uaXplZCBNYXAgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBnZXRzIGFyZSBmYXN0LgotICAgICAgICB0YWJsZSA9IG5ldyBIYXNoTWFwPENsYXNzLCBPYmplY3Q+KDY0LCAuNWYpOwotICAgICAgICAKLSAgICAgICAgLy8gTG9hZCBGYWN0b3JpZXMKLSAgICAgICAgdGFibGUucHV0KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcywgbmV3IFhNTFN0cmluZ0Jsb2NrRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChFbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5LmNsYXNzLCBuZXcgRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChKQVhCQmxvY2tGYWN0b3J5LmNsYXNzLCBuZXcgSkFYQkJsb2NrRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChPTUJsb2NrRmFjdG9yeS5jbGFzcywgbmV3IE9NQmxvY2tGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcywgbmV3IFNvdXJjZUJsb2NrRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChEYXRhU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzLCBuZXcgRGF0YVNvdXJjZUJsb2NrRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnkuY2xhc3MsIG5ldyBTT0FQRW52ZWxvcGVCbG9ja0ZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoTWVzc2FnZUZhY3RvcnkuY2xhc3MsIG5ldyBNZXNzYWdlRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChYTUxQYXJ0RmFjdG9yeS5jbGFzcywgbmV3IFhNTFBhcnRGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzLCBuZXcgU0FBSkNvbnZlcnRlckZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcywgbmV3IEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5LmNsYXNzLCBuZXcgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KCkpOwotICAgICAgICB0YWJsZS5wdXQoQ2xhc3NGaW5kZXJGYWN0b3J5LmNsYXNzLCBuZXcgQ2xhc3NGaW5kZXJGYWN0b3J5KCkpOwotICAgICAgICB0YWJsZS5wdXQoSkFYV1NFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnkuY2xhc3MsIG5ldyBKQVhXU0VuZHBvaW50UmVmZXJlbmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChBeGlzMkVuZHBvaW50UmVmZXJlbmNlRmFjdG9yeS5jbGFzcywgbmV3IEF4aXMyRW5kcG9pbnRSZWZlcmVuY2VGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KEV4ZWN1dG9yRmFjdG9yeS5jbGFzcywgbmV3IEpBWFdTRXhlY3V0b3JGYWN0b3J5KCkpOwotICAgICAgICB0YWJsZS5wdXQoU2VydmljZUluc3RhbmNlRmFjdG9yeS5jbGFzcywgbmV3IFNlcnZpY2VJbnN0YW5jZUZhY3RvcnlJbXBsKCkpOwotICAgICAgICB0YWJsZS5wdXQoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzLCBuZXcgSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5SW1wbCgpKTsKLSAgICAgICAgdGFibGUucHV0KEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS5jbGFzcywgbmV3IEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIHRhYmxlLnB1dChIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5LmNsYXNzLCBuZXcgSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeUltcGwoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyByZWdpc3RlciB0aGUgaW1wbGVtZW50YXRpb24gcmVzcG9uc2libGUgZm9yIGJvdGggV2ViU2VydmljZUNvbnRleHQgCi0gICAgICAgIC8vIGluamVjdGlvbiBhbmQgdGhlIHVwZGF0aW5nIG9mIHRoZSBXZWJTZXJ2aWNlQ29udGV4dCBpbnN0YW5jZXMgdGhhdAotICAgICAgICAvLyBoYXZlIGFscmVhZHkgYmVlbiBpbmplY3RlZCwgd2Ugd2lsbCByZWdpc3RlciB0aGVzZSBieSB0d28gZGlmZmVyZW50Ci0gICAgICAgIC8vIGNsYXNzZXMgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbiBkaWZmZXJlbnQKLSAgICAgICAgLy8gY2xhc3NlcwotICAgICAgICBXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbCB3c2NpSW1wbCA9IG5ldyBXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbCgpOwotICAgICAgICB0YWJsZS5wdXQoV2ViU2VydmljZUNvbnRleHQuY2xhc3MsIHdzY2lJbXBsKTsKLSAgICAgICAgdGFibGUucHV0KFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3IuY2xhc3MsIHdzY2lJbXBsKTsKLSAgICAgICAgdGFibGUucHV0KEhhbmRsZXJJbnZva2VyRmFjdG9yeS5jbGFzcywgbmV3IEhhbmRsZXJJbnZva2VyRmFjdG9yeUltcGwoKSk7Ci0gICAgfQotCi0gICAgLyoqIEZhY3RvcnlSZWdpc3RyeSBpcyBjdXJyZW50bHkgYSBzdGF0aWMgc2luZ2xldG9uICovCi0gICAgcHJpdmF0ZSBGYWN0b3J5UmVnaXN0cnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmYWN0b3J5LiAgVGhpcyBtYXkgYmUgY2FsbGVkIGZyZXF1ZW50bHkuCi0gICAgICogQHBhcmFtIGludGZhY2Ugb2YgdGhlIEZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIE9iamVjdCB0aGF0IGlzIHRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uIGZvciB0aGUgaW50ZmFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZhY3RvcnkoQ2xhc3MgaW50ZmFjZSkgewotICAgICAgICBNYXAgbSA9IHRhYmxlOwotICAgICAgICByZXR1cm4gbS5nZXQoaW50ZmFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHRoZSBmYWN0b3J5LiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGluZnJlcXVlbnRseS4KLSAgICAgKiBAcGFyYW0gaW50ZmFjZQotICAgICAqIEBwYXJhbSBmYWN0b3J5T2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZhY3RvcnkoQ2xhc3MgaW50ZmFjZSwgT2JqZWN0IGZhY3RvcnlPYmplY3QpIHsKLSAgICAgICAgc3luY2hyb25pemVkKGxvY2tib3gpIHsKLSAgICAgICAgICAgIC8vIFVzZSBjb3B5IGFuZCBwdXQgYXBwcm9hY2ggdG8gZW5zdXJlIHRoYXQgImdldCIgc3BlZWQgaXMgZmFzdC4KLSAgICAgICAgICAgIE1hcDxDbGFzcywgT2JqZWN0PiBuZXdNYXAgPSBuZXcgSGFzaE1hcDxDbGFzcywgT2JqZWN0Pih0YWJsZSk7Ci0gICAgICAgICAgICBuZXdNYXAucHV0KGludGZhY2UsIGZhY3RvcnlPYmplY3QpOwotICAgICAgICAgICAgdGFibGUgPSBuZXdNYXA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9yZWdpc3RyeS9JbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcmVnaXN0cnkvSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4ODI4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9yZWdpc3RyeS9JbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2lsbCBwcm92aWRlIGEgbWVhbnMgZm9yIEpBWC1XUyB1c2VycyB0byByZWdpc3Rlcg0KLSAqIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgaW1wbGVtZW50YXRpb25zLiBUaGlzIHdpbGwgbWFuYWdlDQotICogdGhlIGZhY3RvcnkgaW1wbGVtZW50YXRpb25zIHN1Y2ggdGhhdCB0aGV5IGxpc3Qgb2YgZmFjdG9yaWVzDQotICogaXMgb25seSBidWlsdCB3aGVuIG5lY2Vzc2FyeSBzbyBhcyB0byByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mDQotICogZG9pbmcgdGhpcyBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzLg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEludm9jYXRpb25MaXN0ZW5lclJlZ2lzdHJ5IHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhJbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeS5jbGFzcyk7DQotICAgIA0KLSAgICAvLyBUaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgaW5zdGFuY2VzDQotICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gZmFjdG9yeUxpc3QgPSBuZXcgQXJyYXlMaXN0PEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+KCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBvYmplY3QgaW5zdGFuY2UgdGhhdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZg0KLSAgICAgKiB0aGUgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeS4gVGhlIGluc3RhbmNlIHdpbGwgYmUgc3RvcmVkIGluIGFuIA0KLSAgICAgKiBpbnRlcm5hbCBtYXAgYnkgaXRzIGNsYXNzIG5hbWUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGFkZEZhY3RvcnkoSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBmYWNJbnN0YW5jZSkgew0KLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGluc3RhbmNlOiAiICsgZmFjSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gRW5zdXJlIG9ubHkgb25lIGluc3RhbmNlIG9mIGEgc3BlY2lmaWMgZmFjdG9yeSBjbGFzcyBpcyByZWdpc3RlcmVkLg0KLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLSAgICAgICAgZm9yIChJdGVyYXRvcjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBpdGVyYXRvciA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGZhY3RvcnkgPSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgaWYgKGZhY0luc3RhbmNlLmdldENsYXNzKCkgPT0gZmFjdG9yeS5nZXRDbGFzcygpKSB7DQotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZighZm91bmQpew0KLSAgICAgICAgICAgIGZhY3RvcnlMaXN0LmFkZChmYWNJbnN0YW5jZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgaW5zdGFuY2VzIA0KLSAgICAgKiB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGdldEZhY3RvcmllcygpIHsNCi0gICAgICAgIHJldHVybiBmYWN0b3J5TGlzdDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTdjYTkyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0KLS8qKiBVc2VkIHRvIGNhY2hlIEBSZXNvdXJjZSBpbmplY3Rpb24gaW5mb3JtYXRpb24gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGV4dGVuZHMgU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiB7Ci0gICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiBAUmVzb3VyY2UgaXMgZm91bmQgb24gYW55IEZpZWxkIG9yIE1ldGhvZCBvZiB0aGUgSW1wbGVtZW50YXRpb24gY2xhc3MgKi8KLSAgICBib29sZWFuIGhhc1Jlc291cmNlQW5ub3RhdGlvbigpOwotCi0gICAgLyoqIEByZXR1cm4gTWV0aG9kIHdpdGggQFBvc3RDb25zdHJ1Y3Qgb3IgbnVsbCAqLwotICAgIE1ldGhvZCBnZXRQb3N0Q29uc3RydWN0TWV0aG9kKCk7Ci0KLSAgICAvKiogQHJldHVybiBNZXRob2Qgd2l0aCBAUHJlRGVzdHJveSBvciBudWxsICovCi0gICAgTWV0aG9kIGdldFByZURlc3Ryb3lNZXRob2QoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkZDM4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5pbmplY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLmltcGwuUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlcjsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkgewotCi0gICAgLyoqIGludGVudGlvbmFsbHkgcHJpdmF0ZSAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgb3IgY3JlYXRlIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2MKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzCi0gICAgICogQHJldHVybiBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBnZXQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIuZ2V0S2V5KGltcGxDbGFzcyk7Ci0gICAgICAgIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiByaXNyRGVzYyA9Ci0gICAgICAgICAgICAgICAgKFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjLmdldFNlcnZpY2VSdW50aW1lRGVzYyhrZXkpOwotCi0gICAgICAgIGlmIChyaXNyRGVzYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByaXNyRGVzYyA9IFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZShzZXJ2aWNlRGVzYywgaW1wbENsYXNzKTsKLSAgICAgICAgICAgIHNlcnZpY2VEZXNjLnNldFNlcnZpY2VSdW50aW1lRGVzYyhyaXNyRGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJpc3JEZXNjOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL2ltcGwvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9pbmplY3Rpb24vaW1wbC9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTAwNDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9pbmplY3Rpb24vaW1wbC9SZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlciB7Ci0KLSAgICAvKiogSW50ZW50aW9uYWxseSBQcml2YXRlICovCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZQotICAgICAqCi0gICAgICogQHBhcmFtIG9wRGVzYwotICAgICAqIEBwYXJhbSBpbXBsQ2xhc3NOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGNyZWF0ZShTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGltcGxDbGFzcykgewotICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsIGRlc2MgPQotICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsKGdldEtleShpbXBsQ2xhc3MpLCBzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgYm9vbGVhbiB2YWx1ZSA9IGhhc1Jlc291cmNlQW5ub3RhdGlvbihpbXBsQ2xhc3MpOwotICAgICAgICBkZXNjLnNldFJlc291cmNlQW5ub3RhdGlvbih2YWx1ZSk7Ci0KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGdldFBvc3RDb25zdHJ1Y3RNZXRob2QoaW1wbENsYXNzKTsKLSAgICAgICAgZGVzYy5zZXRQb3N0Q29uc3RydWN0TWV0aG9kKG1ldGhvZCk7Ci0KLSAgICAgICAgbWV0aG9kID0gZ2V0UHJlRGVzdHJveU1ldGhvZChpbXBsQ2xhc3MpOwotICAgICAgICBkZXNjLnNldFByZURlc3Ryb3lNZXRob2QobWV0aG9kKTsKLQotICAgICAgICByZXR1cm4gZGVzYzsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRLZXkoQ2xhc3MgaW1wbENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBpbXBsQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbXBsQ2xhc3MKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgRmllbGQgb3IgTWV0aG9kIGhhcyBhIEBSZXNvdXJjZSBhbm5vdGF0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgYm9vbGVhbiBoYXNSZXNvdXJjZUFubm90YXRpb24oQ2xhc3MgaW1wbENsYXNzKSB7Ci0gICAgICAgIC8vIEdldHRpbmcgdGhpcyBpbmZvcm1hdGlvbiBpcyBleHBlbnNpdmUsIGJ1dCBmb3J0dW5hdGVseSBpcyBjYWNoZWQuCi0gICAgICAgIExpc3Q8RmllbGQ+IGZpZWxkcyA9IGdldEZpZWxkcyhpbXBsQ2xhc3MpOwotICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbihmaWVsZCxSZXNvdXJjZS5jbGFzcykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gZ2V0TWV0aG9kcyhpbXBsQ2xhc3MpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbihtZXRob2QsUmVzb3VyY2UuY2xhc3MpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBNZXRob2QgZ2V0UG9zdENvbnN0cnVjdE1ldGhvZChDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBnZXRNZXRob2RzKGltcGxDbGFzcyk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vdGF0aW9uKG1ldGhvZCxQb3N0Q29uc3RydWN0LmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSBNZXRob2QgZ2V0UHJlRGVzdHJveU1ldGhvZChDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBnZXRNZXRob2RzKGltcGxDbGFzcyk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vdGF0aW9uKG1ldGhvZCxQcmVEZXN0cm95LmNsYXNzKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBvZiB0aGUgZmllbGRzIGluIHRoaXMgY2xhc3MgYW5kIHRoZSBzdXBlciBjbGFzc2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIExpc3Q8RmllbGQ+IGdldEZpZWxkcyhmaW5hbCBDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgLy8gVGhpcyBjbGFzcyBtdXN0IHJlbWFpbiBwcml2YXRlIGR1ZSB0byBKYXZhIDIgU2VjdXJpdHkgY29uY2VybnMKLSAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzOwotICAgICAgICBmaWVsZHMgPSAoTGlzdDxGaWVsZD4pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IGJlYW5DbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkW10gZmllbGRBcnJheSA9IGNscy5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICByZXR1cm4gZmllbGRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBjbGFzcyBhbmQgdGhlIHN1cGVyIGNsYXNzZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgTGlzdDxNZXRob2Q+IGdldE1ldGhvZHMoZmluYWwgQ2xhc3MgYmVhbkNsYXNzKSB7Ci0gICAgICAgIC8vIFRoaXMgY2xhc3MgbXVzdCByZW1haW4gcHJpdmF0ZSBkdWUgdG8gSmF2YSAyIFNlY3VyaXR5IGNvbmNlcm5zCi0gICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzOwotICAgICAgICBtZXRob2RzID0gKExpc3Q8TWV0aG9kPilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gYmVhbkNsYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kQXJyYXkgPSBjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotCi0gICAgICAgIHJldHVybiBtZXRob2RzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL2luamVjdGlvbi9pbXBsL1Jlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL2ltcGwvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMxMWQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vaW5qZWN0aW9uL2ltcGwvUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24uaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotICAgICAgICBSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gewotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotICAgIHByaXZhdGUgYm9vbGVhbiBfaGFzUmVzb3VyY2VBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgTWV0aG9kIF9wb3N0Q29uc3RydWN0TWV0aG9kOwotICAgIHByaXZhdGUgTWV0aG9kIF9wcmVEZXN0cm95TWV0aG9kOwotCi0gICAgcHJvdGVjdGVkIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwoU3RyaW5nIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZXNjOwotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZUFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBfaGFzUmVzb3VyY2VBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIF9wb3N0Q29uc3RydWN0TWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0UHJlRGVzdHJveU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIF9wcmVEZXN0cm95TWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRpb24gZ2V0U2VydmljZURlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gc2VydmljZURlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IEJ1aWxkZXIgY29kZQotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgdm9pZCBzZXRSZXNvdXJjZUFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBfaGFzUmVzb3VyY2VBbm5vdGF0aW9uID0gdmFsdWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQb3N0Q29uc3RydWN0TWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgX3Bvc3RDb25zdHJ1Y3RNZXRob2QgPSBtZXRob2Q7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcmVEZXN0cm95TWV0aG9kKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgX3ByZURlc3Ryb3lNZXRob2QgPSBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZToiICsgZ2V0S2V5KCkpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgQFJlc291cmNlIEFubm90YXRpb24gPSAiICsgaGFzUmVzb3VyY2VBbm5vdGF0aW9uKCkpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgUG9zdENvbnN0cnVjdCBNZXRob2QgPSAiICsgZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIFByZURlc3Ryb3kgTWV0aG9kICAgID0gIiArIGdldFByZURlc3Ryb3lNZXRob2QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvQW5ub3RhdGlvbkRlc2MuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9Bbm5vdGF0aW9uRGVzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc1ZTc5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9Bbm5vdGF0aW9uRGVzYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbDsKLQotLyoqIEFubm90YXRpb24gaW5mb3JtYXRpb24gY2FjaGVkIGZvciBhIHBhcnRpY3VsYXIgY2xhc3MgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkRlc2MgewotCi0gICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiBjbGFzcyBoYXMgQFhtbFJvb3RFbGVtZW50ICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzWG1sUm9vdEVsZW1lbnQoKTsKLQotICAgIC8qKiBAcmV0dXJuIEBYbWxSb290RWxlbWVudCBuYW1lIG9yIGRlZmF1bHRlZCBuYW1lIChudWxsIGlmICFoYXNYbWxSb290RWxlbWVudCkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFJvb3RFbGVtZW50TmFtZSgpOwotCi0gICAgLyoqIEByZXR1cm4gQFhtbFJvb3RFbGVtZW50IG5hbWVzcGFjZSBvciBkZWZhdWx0IG5hbWVzcGFjZSAobnVsbCBpZiAhaGFzWG1sUm9vdEVsZW1lbnQpICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxSb290RWxlbWVudE5hbWVzcGFjZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBAWG1sU2VlQWxzbyBjbGFzc2VzIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3NbXSBnZXRYbWxTZWVBbHNvQ2xhc3NlcygpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL0ZhdWx0QmVhbkRlc2MuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9GYXVsdEJlYW5EZXNjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NmQ3MjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL0ZhdWx0QmVhbkRlc2MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWw7Ci0KLS8qKgotICogRGVzY3JpcHRpb24gb2YgRmF1bHRCZWFuIGZvciBhIEZhdWx0RGVzY3JpcHRpb24uIFRoZSBGYXVsdEJlYW4gaXMgdXNlZCB0byBtYXJzaGFsIGFuZCB1bm1hcnNoYWwKLSAqIHRoZSBleGNlcHRpb24uICBUaGUgRmF1bHRCZWFuIGlzIGRldGVybWluZWQgdmlhIGFubm90YXRpb24sIGZhdWx0SW5mbyBhbmQgcGFja2FnZSBpbnRyb3NwZWN0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0QmVhbkRlc2MgewotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmYXVsdCBiZWFuIGZvciB0aGUgRmF1bHREZXNjcmlwdGlvbi4gTm90ZSB0aGF0IHRoZSBGYXVsdEJlYW4gbWF5Ci0gICAgICogbm90IGJlIGEgYmVhbi4gIEl0IGNhbiBiZSBhIG5vbi1iZWFuIChpLmUuIFN0cmluZyBvciBpbnQpCi0gICAgICogPHAvPgotICAgICAqIEFsZ29yaXRobTogMSkgVGhlIGNsYXNzIGRlZmluZWQgb24gQFdlYkZhdWx0IG9mIHRoZSBleGNlcHRpb24gMikgSWYgbm90IHByZXNlbnQgb3IgaW52YWxpZCwKLSAgICAgKiB0aGUgY2xhc3MgZGVmaW5lZCBieSBnZXRGYXVsdEluZm8uIDMpIElmIG5vdCBwcmVzZW50LCB0aGUgY2xhc3MgaXMgZm91bmQgYnkgbG9va2luZyBmb3IgdGhlIGEKLSAgICAgKiBjbGFzcyBuYW1lZCA8ZXhjZXB0aW9uTmFtZT5CZWFuIGluIHRoZSBpbnRlcmZhY2UncyBwYWNrYWdlLiA0KSBJZiBub3QgcHJlc2VudCwgdGhlIGNsYXNzIGlzCi0gICAgICogZm91bmQgYnkgbG9va2luZyBmb3IgdGhlIGEgY2xhc3MgbmFtZWQgPGV4Y2VwdGlvbk5hbWU+QmVhbiBpbiB0aGUgaW50ZXJmYWNlICsgamF4d3MgcGFja2FnZQotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuQ2xhc3NOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGxvY2FsIG5hbWUgb2YgdGhlIGZhdWx0IGJlYW4uIEFsZ29yaXRobTogMSkgVGhlIG5hbWUgZGVmaW5lZCBvbiB0aGUgQFdlYkZhdWx0IG9mIHRoZQotICAgICAqIGV4Y2VwdGlvbi4gMikgSWYgbm90IHByZXNlbnQsIHRoZSBuYW1lIGRlZmluZWQgdmlhIHRoZSBAWG1sUm9vdEVsZW1lbnQgb2YgdGhlIGZhdWx0IGJlYW4KLSAgICAgKiBjbGFzcy4gMykgSWYgbm90IHByZXNlbnQsIHRoZSA8ZXhjZXB0aW9uTmFtZT5CZWFuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGxvY2FsIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbkxvY2FsTmFtZSgpOwotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgZmF1bHQgYmVhbi4gQWxnb3JpdGhtOiAxKSBUaGUgbmFtZXNwYWNlIGRlZmluZWQgb24gdGhlCi0gICAgICogQFdlYkZhdWx0IG9mIHRoZSBleGNlcHRpb24uIDIpIElmIG5vdCBwcmVzZW50LCB0aGUgbmFtZXNwYWNlIGRlZmluZWQgdmlhIHRoZSBAWG1sUm9vdEVsZW1lbnQKLSAgICAgKiBvZiB0aGUgY2xhc3MgbmFtZS4gMykgSWYgbm90IHByZXNlbnQsIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1ldGhvZCdzIGRlY2xhcmVkIGNsYXNzICsKLSAgICAgKiAiL2pheHdzIgotICAgICAqCi0gICAgICogQHJldHVybiBsb2NhbCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGYXVsdEJlYW5OYW1lc3BhY2UoKTsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA1Y2MzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuUHJvcGVydHlEZXNjcmlwdG9yUGx1czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLQotLyoqIFVzZWQgdG8gY2FjaGUgbWFyc2hhbCBpbmZvcm1hdGlvbiAqLwotcHVibGljIGludGVyZmFjZSBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBleHRlbmRzIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gewotCi0gICAgLyoqIEByZXR1cm4gU2V0IG9mIHBhY2thZ2UgbmFtZXMgZm9yIHRoaXMgc2VydmljZSAqLwotICAgIHB1YmxpYyBUcmVlU2V0PFN0cmluZz4gZ2V0UGFja2FnZXMoKTsKLQotICAgIC8qKiBAcmV0dXJuIFVuaXF1ZSBrZXkgdGhhdCByZXByZXNlbnRzIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgZ2V0UGFja2FnZXMgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VzS2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIEFubm90YXRpb25EZXNjIGZvciB0aGlzIGNsYXNzLiBJZiBvbmUgaXMgbm90IGNhY2hlZCwgYSBuZXcgb25lIGlzIGNyZWF0ZAotICAgICAqCi0gICAgICogQHBhcmFtIGNscwotICAgICAqIEByZXR1cm4gQW5ub3RhdGlvbkRlc2MKLSAgICAgKi8KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkRlc2MgZ2V0QW5ub3RhdGlvbkRlc2MoQ2xhc3MgY2xzKTsKLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBQcm9wZXJ0eURlc2NyaXB0b3IgbWFwIGZvciB0aGUgY2xhc3MuIFRoZSBrZXkgb2YgdGhlIG1hcCBpcyBhIGNoaWxkIHhtbCBsb2NhbCBuYW1lLgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIFByb3BlcnR5RGVzY3JpcHRvciwgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2V0L2dldCB2YWx1ZXMgZnJvbSBhIGJlYW4gb2YgdGhlCi0gICAgICogaW5kaWNhdGVkIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHJldHVybiBnZXQgdGhlIGNhY2hlZCBjb3B5IG9yIGNyZWF0ZSBhIG5ldyBvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKENsYXNzIGNscyk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uRGVzYwotICAgICAqIEByZXR1cm4gc3BlY2lmaWVkIG9yIGRlZmF1bHRlZCB3cmFwcGVyIGNsYXNzIG5hbWUuICBBbHdheXMgcmV0dXJucyBudWxsIGlmIHRoZSB3cmFwcGVyIGNsYXNzCi0gICAgICogICAgICAgICBkb2VzIG5vdCBleGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbkRlc2MKLSAgICAgKiBAcmV0dXJuIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgd3JhcHBlciBjbGFzcyBuYW1lLiAgQWx3YXlzIHJldHVybnMgbnVsbCBpZiB0aGUgd3JhcHBlciBjbGFzcwotICAgICAqICAgICAgICAgZG9lcyBub3QgZXhpc3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmF1bHREZXNjCi0gICAgICogQHJldHVybiBGYXVsdEJlYW5EZXNjcmlwdG9yIHRoYXQgZGVzY3JpYmVzIHRoZSBmYXVsdCBiZWFuCi0gICAgICovCi0gICAgcHVibGljIEZhdWx0QmVhbkRlc2MgZ2V0RmF1bHRCZWFuRGVzYyhGYXVsdERlc2NyaXB0aW9uIGZhdWx0RGVzYyk7Ci0KLSAgICAvKiogQHJldHVybiBNZXNzYWdlRmFjdG9yeSBmb3IgdGhpcyBNYXJzaGFsbGVyICovCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5IGdldE1lc3NhZ2VGYWN0b3J5KCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmMTc3Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbC5NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkgewotCi0gICAgLyoqIGludGVudGlvbmFsbHkgcHJpdmF0ZSAqLwotICAgIHByaXZhdGUgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25GYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBvciBjcmVhdGUgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzYwotICAgICAqIEBwYXJhbSBpbXBsQ2xhc3MKLSAgICAgKiBAcmV0dXJuIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBnZXQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIuZ2V0S2V5KCk7Ci0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGRlc2MgPQotICAgICAgICAgICAgICAgIChNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjLmdldFNlcnZpY2VSdW50aW1lRGVzYyhrZXkpOwotCi0gICAgICAgIGlmIChkZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2MgPSBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkJ1aWxkZXIuY3JlYXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgICAgIHNlcnZpY2VEZXNjLnNldFNlcnZpY2VSdW50aW1lRGVzYyhkZXNjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVzYzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9Bbm5vdGF0aW9uQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQW5ub3RhdGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0Zjc2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9Bbm5vdGF0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuQW5ub3RhdGlvbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuRmF1bHRCZWFuRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBXYWxrcyB0aGUgU2VydmljZURlc2NyaXB0aW9uIGFuZCBpdHMgY2hpbGQgKkRlc2NyaXB0aW9uIGNsYXNzZXMgdG8gZmluZCBhbGwgb2YgdGhlIHR5cGVzLiAgQW4KLSAqIEFubm90YXRpb25EZXNjIGlzIGJ1aWx0IGZvciBlYWNoIG9mIHRoZSB0eXBlcwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFubm90YXRpb25CdWlsZGVyLmNsYXNzKTsKLQotCi0gICAgLyoqIFRoaXMgaXMgYSBzdGF0aWMgdXRpbGl0eSBjbGFzcy4gIFRoZSBjb25zdHJ1Y3RvciBpcyBpbnRlbnRpb25hbGx5IHByaXZhdGUgKi8KLSAgICBwcml2YXRlIEFubm90YXRpb25CdWlsZGVyKCkgewotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiBTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gYXAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIHdoaWNoIGZvdW5kL3Byb2R1Y2VkIGFydGlmYWN0IGNsYXNzZXMKLSAgICAgKiBAcmV0dXJuIEFubm90YXRpb25EZXNjIE1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IGdldEFubm90YXRpb25EZXNjcyhTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPigpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjcyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0KLSAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgcGFja2FnZXMgZnJvbSBhbGwgb2YgdGhlIGVuZHBvaW50cwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50RGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uRGVzY3MoZW5kcG9pbnREZXNjc1tpXSwgYXAsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmRwb2ludERlc2MKLSAgICAgKiBAcGFyYW0gYXAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIHdoaWNoIGZvdW5kL3Byb2R1Y2VkIGFydGlmYWN0IGNsYXNzZXMKLSAgICAgKiBAcGFyYW0gbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbm5vdGF0aW9uRGVzY3MoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3IgYXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXApIHsKLSAgICAgICAgU3RyaW5nIGltcGxDbGFzc05hbWUgPSBnZXRTZXJ2aWNlSW1wbENsYXNzTmFtZShlbmRwb2ludERlc2MpOwotICAgICAgICBpZiAoaW1wbENsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBjbHo7Ci0gICAgICAgICAgICBjbHogPSBsb2FkQ2xhc3MoaW1wbENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZihjbHogPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgY2x6ID0gbG9hZENsYXNzKGltcGxDbGFzc05hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNseiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkQW5ub3RhdGlvbihlbmRwb2ludERlc2MsIGNseiwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRBbm5vdGF0aW9uRGVzY3MoZW5kcG9pbnREZXNjLCBlbmRwb2ludEludGVyZmFjZURlc2MsIGFwLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjCi0gICAgICogQHBhcmFtIGFwICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZC9wcm9kdWNlZCBhcnRpZmFjdCBjbGFzc2VzCi0gICAgICogQHBhcmFtIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QW5ub3RhdGlvbkRlc2NzKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwKSB7Ci0gICAgICAgIENsYXNzIGNseiA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTRUlDbGFzcygpOwotICAgICAgICBpZiAoY2x6ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBjbHosIG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIERvbid0IGRpZyBpbnRvIHRoZSBhc3luYyBvcGVyYXRpb25zCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BEZXNjcyA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgcGFja2FnZXMgZnJvbSBhbGwgb2YgdGhlIG9wZXJ0aW9ucwotICAgICAgICBpZiAob3BEZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uRGVzY3MoZW5kcG9pbnREZXNjLCBvcERlc2NzW2ldLCBhcCwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IGFubm90YXRpb25zIGZvciB0aGlzIG9wZXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG9wRGVzYwotICAgICAqIEBwYXJhbSBhcCAgICAgQXJ0aWZhY3RQcm9jZXNzb3Igd2hpY2ggZm91bmQvcHJvZHVjZWQgYXJ0aWZhY3QgY2xhc3NlcwotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFubm90YXRpb25EZXNjcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3IgYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IG1hcCkgewotCi0gICAgICAgIC8vIFdhbGsgdGhlIHBhcmFtZXRlciBpbmZvcm1hdGlvbgotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtZXRlckRlc2NzID0gb3BEZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBpZiAocGFyYW1ldGVyRGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJEZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25EZXNjcyhlbmRwb2ludERlc2MsIHBhcmFtZXRlckRlc2NzW2ldLCBtYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FsayB0aGUgZmF1bHQgaW5mb3JtYXRpb24KLSAgICAgICAgRmF1bHREZXNjcmlwdGlvbltdIGZhdWx0RGVzY3MgPSBvcERlc2MuZ2V0RmF1bHREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgaWYgKGZhdWx0RGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkRlc2NzKGVuZHBvaW50RGVzYywgZmF1bHREZXNjc1tpXSwgYXAsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHNvIGNvbnNpZGVyIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSB3cmFwcGVycwotICAgICAgICBTdHJpbmcgd3JhcHBlck5hbWUgPSBhcC5nZXRSZXF1ZXN0V3JhcHBlck1hcCgpLmdldChvcERlc2MpOwotICAgICAgICBpZiAod3JhcHBlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkQW5ub3RhdGlvbihlbmRwb2ludERlc2MsIHdyYXBwZXJOYW1lLCBtYXApOwotICAgICAgICB9Ci0gICAgICAgIHdyYXBwZXJOYW1lID0gYXAuZ2V0UmVzcG9uc2VXcmFwcGVyTWFwKCkuZ2V0KG9wRGVzYyk7Ci0gICAgICAgIGlmICh3cmFwcGVyTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRBbm5vdGF0aW9uKGVuZHBvaW50RGVzYywgd3JhcHBlck5hbWUsIG1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGaW5hbGx5IGNvbnNpZGVyIHRoZSByZXN1bHQgdHlwZQotICAgICAgICBDbGFzcyBjbHMgPSBvcERlc2MuZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotICAgICAgICBpZiAoY2xzICE9IG51bGwgJiYgY2xzICE9IHZvaWQuY2xhc3MgJiYgY2xzICE9IFZvaWQuY2xhc3MpIHsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBjbHMsIG1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0QW5ub3RhdGlvbkRlc2NzKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwKSB7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSB0eXBlIHRoYXQgZGVmaW5lcyB0aGUgYWN0dWFsIGRhdGEuICAodGhpcyBpcyBuZXZlciBhIGhvbGRlciApCi0gICAgICAgIENsYXNzIHBhcmFtQ2xhc3MgPSBwYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpOwotCi0gICAgICAgIGlmIChwYXJhbUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldFR5cGVBbm5vdGF0aW9uRGVzY3MoZW5kcG9pbnREZXNjLCBwYXJhbUNsYXNzLCBtYXApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHBhY2thZ2Ugc2V0IHdpdGggdGhlIHBhY2thZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBGYXVsdERlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHREZXNjIEZhdWx0RGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gc2V0ICAgICAgIFNldDxQYWNrYWdlPiB0aGF0IGlzIHVwZGF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFubm90YXRpb25EZXNjcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3IgYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IG1hcCkgewotICAgICAgICBGYXVsdEJlYW5EZXNjIGZhdWx0QmVhbkRlc2MgPSBhcC5nZXRGYXVsdEJlYW5EZXNjTWFwKCkuZ2V0KGZhdWx0RGVzYyk7Ci0gICAgICAgIENsYXNzIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbkNsYXNzTmFtZSgpKTsKLSAgICAgICAgaWYoZmF1bHRCZWFuID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5EZXNjLmdldEZhdWx0QmVhbkNsYXNzTmFtZSgpLCBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhdWx0QmVhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRUeXBlQW5ub3RhdGlvbkRlc2NzKGVuZHBvaW50RGVzYywgZmF1bHRCZWFuLCBtYXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3NbXSBub0NsYXNzID0gbmV3IENsYXNzW10geyB9OwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBhbm5vdGF0aW9ucyBmb3IgdGhpcyB0eXBlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRUeXBlQW5ub3RhdGlvbkRlc2NzKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLCBDbGFzcyBjbHMsIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXApIHsKLQotICAgICAgICBpZiAoSkFYQkVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gY2xzLmdldE1ldGhvZCgiZ2V0VmFsdWUiLCBub0NsYXNzKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBjbHMyID0gbS5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgYWRkQW5ub3RhdGlvbihlbmRwb2ludERlc2MsIGNsczIsIG1hcCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2Fubm90IGZpbmQgSkFYQkVsZW1lbnQuZ2V0VmFsdWUgbWV0aG9kLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBjbHMsIG1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFubm90YXRpb24oRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsIFN0cmluZyBjbGFzc05hbWUsIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXApIHsKLQotICAgICAgICBpZiAobWFwLmdldChjbGFzc05hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzIGNseiA9IGxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgaWYgKGNseiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2x6ID0gbG9hZENsYXNzKGNsYXNzTmFtZSwgZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNseiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkQW5ub3RhdGlvbihlbmRwb2ludERlc2MsIGNseiwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQW5ub3RhdGlvbihFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywgQ2xhc3MgY2xzLCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVzYz4gbWFwKSB7Ci0KLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNscy5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIGlmIChtYXAuZ2V0KGNsYXNzTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvbkRlc2MgZGVzYyA9IEFubm90YXRpb25EZXNjSW1wbC5jcmVhdGUoY2xzKTsKLSAgICAgICAgICAgIG1hcC5wdXQoY2xhc3NOYW1lLCBkZXNjKTsKLSAgICAgICAgICAgIGlmIChjbHMuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgIENsYXNzIGNsYXNzMiA9IENsYXNzVXRpbHMuZ2V0V3JhcHBlckNsYXNzKGNscyk7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbkRlc2MgZGVzYzIgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGNsYXNzMik7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dChjbGFzczIuZ2V0Q2Fub25pY2FsTmFtZSgpLCBkZXNjMik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENsYXNzIGNsYXNzMiA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xzKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3MyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkRlc2MgZGVzYzIgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGNsYXNzMik7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoY2xhc3MyLmdldENhbm9uaWNhbE5hbWUoKSwgZGVzYzIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSW5zcGVjdCB0aGUgaW50ZXJmYWNlcy4gIFRoaXMgaXMgZG9uZSB0byBwaWNrIHVwIG90aGVyCi0gICAgICAgICAgICAvLyBAWG1sU2VlQWxzbyB1c2FnZXMuCi0gICAgICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBjbHMuZ2V0SW50ZXJmYWNlcygpOwotICAgICAgICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb24oZW5kcG9pbnREZXNjLCBpbnRlcmZhY2VzW2ldLCBtYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBDbGFzcyAob3IgbnVsbCBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0gICAgICAgIC8vIERvbid0IG1ha2UgdGhpcyBwdWJsaWMsIGl0cyBhIHNlY3VyaXR5IGV4cG9zdXJlCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmV0dXJuIGZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyKTsKLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAvL3JhdGhlciB0aGFuIGp1c3QgRXhjZXB0aW9uLgotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBqYXh3cyBzY2VuYXJpbywgaXQgaXMgbm9ybWFsIHRoYXQgc29tZSBjbGFzc2VzIGFyZSBub3QgYXZhaWxhYmxlLgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbm5vdGF0aW9uQnVpbGRlciBkaWQgbm90IGZpbmQgdGhlIGZvbGxvd2luZyBjbGFzczoiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuIENsYXNzIChvciBudWxsIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgbG9hZGVkKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIC8vIERvbid0IG1ha2UgdGhpcyBwdWJsaWMsIGl0cyBhIHNlY3VyaXR5IGV4cG9zdXJlCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmV0dXJuIGZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIGpheHdzIHNjZW5hcmlvLCBpdCBpcyBub3JtYWwgdGhhdCBzb21lIGNsYXNzZXMgYXJlIG5vdCBhdmFpbGFibGUuCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFubm90YXRpb25CdWlsZGVyIGRpZCBub3QgZmluZCB0aGUgZm9sbG93aW5nIGNsYXNzOiIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcm90ZWN0ZWQgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xhc3MuZm9yTmFtZSBkb2VzIG5vdCBzdXBwb3J0IHByaW1pdGl2ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNscyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLyogQW4gZXhjZXB0aW9uIHNob3VsZCBOT1QgYmUgbG9nZ2VkLiAgRGVwZW5kaW5nIG9uIHRoZSBKQVhXUyBzY2VuYXJpbywgY2VydGFpbiBjbGFzc2VzIAotICAgICAgICAgICAgICogbWF5IG9yIG1heSBub3QgZXhpc3QuICBQdXR0aW5nIGFuIGV4Y2VwdGlvbiBpbiB0aGUgbG9nIHdpbGwgY29uZnVzZSBwcm9ncmFtbWVycyB3aG8KLSAgICAgICAgICAgICAqIGFyZSBzZXJ2aWNpbmcgdGhlIHByb2R1Y3QKLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gQ2xhc3NMb2FkZXIgKi8KLSAgICBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgU2VyaXZjZSBJbXBsIENsYXNzIGJ5IGxvb2tpbmcgYXQgdGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGVuZHBvaW50RGVzY3JpcHRpb24KLSAgICAgKiBAcmV0dXJuIGNsYXNzIG5hbWUgb3IgbnVsbAotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlSW1wbENsYXNzTmFtZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChlbmRwb2ludERlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgaWYgKGFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBhcy5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuU0VSVklDRV9DTEFTUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gaW1wbGVtZW50YXRpb24gY2xhc3MsIHdlIHNob3VsZCBub3QgZ28gYW55IGZ1cnRoZXIKLSAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKFN0cmluZylwYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQW5ub3RhdGlvbkRlc2NJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9Bbm5vdGF0aW9uRGVzY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhOTQzMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9Bbm5vdGF0aW9uRGVzY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5Bbm5vdGF0aW9uRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuWE1MUm9vdEVsZW1lbnRVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0vKioKLSAqIENvbW1vbiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGNsYXNzLiBUaGlzIGlzIHNldHVwIG9uY2UKLSAqIHNvIHRoYXQgYW5kIHN0b3JlZCBpbiB0aGUgQW5ub3RhdGlvbkRlc2Mgc28gdGhhdCBpdCBpcyBlYXNpbHkgYWNjZXNzaWJsZS4KLSAqLwotY2xhc3MgQW5ub3RhdGlvbkRlc2NJbXBsIGltcGxlbWVudHMgQW5ub3RhdGlvbkRlc2MgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIF9oYXNYbWxSb290RWxlbWVudCA9IGZhbHNlOwotICAgIHByaXZhdGUgU3RyaW5nIF9YbWxSb290RWxlbWVudE5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIF9YbWxSb290RWxlbWVudE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBDbGFzc1tdIF9YbWxTZWVBbHNvQ2xhc3NlcyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25EZXNjSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNYbWxSb290RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIF9oYXNYbWxSb290RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFJvb3RFbGVtZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIF9YbWxSb290RWxlbWVudE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYbWxSb290RWxlbWVudE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIF9YbWxSb290RWxlbWVudE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQW5ub3RhdGlvbkRlc2MgY3JlYXRlKENsYXNzIGNscykgewotICAgICAgICBBbm5vdGF0aW9uRGVzY0ltcGwgYURlc2MgPSBuZXcgQW5ub3RhdGlvbkRlc2NJbXBsKCk7Ci0KLSAgICAgICAgLy8gWE1MU2VlQWxzbyBpcyBwYXJ0IG9mIEpBWEIgMi4xLjIuICAKLSAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIGEgcHJlcmVxIGZvciBKQVhXUyAyLjE7IHRodXMKLSAgICAgICAgLy8gd2UgY2FuIHNhZmVseSByZWZlcmVuY2UgdGhpcyBjbGFzcwotICAgICAgICBYbWxTZWVBbHNvIHhtbFNlZUFsc28gPSAoWG1sU2VlQWxzbykKLSAgICAgICAgICAgIGdldEFubm90YXRpb24oY2xzLCBYbWxTZWVBbHNvLmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh4bWxTZWVBbHNvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFEZXNjLl9YbWxTZWVBbHNvQ2xhc3NlcyA9IHhtbFNlZUFsc28udmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBYTUxSb290RWxlbWVudFV0aWwuZ2V0WG1sUm9vdEVsZW1lbnRRTmFtZShjbHMpOwotICAgICAgICBpZiAocU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYURlc2MuX2hhc1htbFJvb3RFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIGFEZXNjLl9YbWxSb290RWxlbWVudE5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGFEZXNjLl9YbWxSb290RWxlbWVudE5hbWVzcGFjZSA9IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3bGluZSA9ICJcbiI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgQFhNTFJvb3RFbGVtZW50IGV4aXN0cyA9ICIgKyB0aGlzLmhhc1htbFJvb3RFbGVtZW50KCkpOwotCi0gICAgICAgIGlmICh0aGlzLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgICBAWE1MUm9vdEVsZW1lbnQgbmFtZXNwYWNlID0gIiArIHRoaXMuZ2V0WG1sUm9vdEVsZW1lbnROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgQFhNTFJvb3RFbGVtZW50IG5hbWUgICAgICA9ICIgKyB0aGlzLmdldFhtbFJvb3RFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLl9YbWxTZWVBbHNvQ2xhc3NlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8X1htbFNlZUFsc29DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgICBAWE1MU2VlQWxzbyBjbGFzcyA9ICIgKyB0aGlzLl9YbWxTZWVBbHNvQ2xhc3Nlc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc1tdIGdldFhtbFNlZUFsc29DbGFzc2VzKCkgewotICAgICAgICByZXR1cm4gX1htbFNlZUFsc29DbGFzc2VzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9BcnRpZmFjdFByb2Nlc3Nvci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvQXJ0aWZhY3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllNzhhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9BcnRpZmFjdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5GYXVsdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuQW5ub3RhdGlvbkRlc2M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuRmF1bHRCZWFuRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBFeGFtaW5lcyBhIFNlcnZpY2VEZXNjIGFuZCBsb2NhdGVzIGFuZC9vciBidWlsZHMgdGhlIEpBWC1XUyBhcnRpZmFjdHMuIFRoZSBKQVgtV1MgYXJ0aWZhY3RzIGFyZToKLSAqIC0gcmVxdWVzdCB3cmFwcGVyIGNsYXNzZXMgLSByZXNwb25zZSB3cmFwcGVyIGNsYXNzZXMgLSBmYXVsdCBiZWFucyBmb3Igbm9uLUpBWC1XUyBjb21wbGlhbnQKLSAqIGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgQXJ0aWZhY3RQcm9jZXNzb3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFydGlmYWN0UHJvY2Vzc29yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjOwotICAgIHByaXZhdGUgTWFwPE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+IHJlcXVlc3RXcmFwcGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gcmVzcG9uc2VXcmFwcGVyTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8RmF1bHREZXNjcmlwdGlvbiwgRmF1bHRCZWFuRGVzYz4gZmF1bHRCZWFuRGVzY01hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxGYXVsdERlc2NyaXB0aW9uLCBGYXVsdEJlYW5EZXNjPigpOwotCi0gICAgLyoqCi0gICAgICogQXJ0aWZhY3QgUHJvY2Vzc29yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2MKLSAgICAgKi8KLSAgICBBcnRpZmFjdFByb2Nlc3NvcihTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZXNjOwotICAgIH0KLQotICAgIE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiBnZXRSZXF1ZXN0V3JhcHBlck1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyTWFwOwotICAgIH0KLQotICAgIE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiBnZXRSZXNwb25zZVdyYXBwZXJNYXAoKSB7Ci0gICAgICAgIHJldHVybiByZXNwb25zZVdyYXBwZXJNYXA7Ci0gICAgfQotCi0gICAgTWFwPEZhdWx0RGVzY3JpcHRpb24sIEZhdWx0QmVhbkRlc2M+IGdldEZhdWx0QmVhbkRlc2NNYXAoKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdEJlYW5EZXNjTWFwOwotICAgIH0KLQotICAgIHZvaWQgYnVpbGQoKSB7Ci0gICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA6IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCkpIHsKLSAgICAgICAgICAgIGlmIChlZC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjIDogZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T3BlcmF0aW9ucygpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlY2xhcmluZ0NsYXNzTmFtZSA9IG9wRGVzYy5nZXRKYXZhRGVjbGFyaW5nQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKGRlY2xhcmluZ0NsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lID0gZ2V0U2ltcGxlQ2xhc3NOYW1lKGRlY2xhcmluZ0NsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gb3BEZXNjLmdldEphdmFNZXRob2ROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZGVmYXVsdCBmb3IgQFJlcXVlc3RXcmFwcGVyL0BSZXNwb25zZVdyYXBwZXIgY2xhc3NuYW1lICBOb25lIGlzIGxpc3RlZCBpbiBTZWMuIDcuMyBvbiBwLiA4MCBvZgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgSkFYLVdTIHNwZWMsIEJVVCBDb25mb3JtYW5jZShVc2luZyBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIpIGluIFNlYyAyLjMuMS4yIG9uIHAuIDEzCi0gICAgICAgICAgICAgICAgICAgIC8vIHNheXMgdGhlIGVudGlyZSBhbm5vdGF0aW9uICIuLi5NQVkgYmUgb21pdHRlZCBpZiBhbGwgaXRzIHByb3BlcnRpZXMgd291bGQgaGF2ZSBkZWZhdWx0IHZhdWxlcy4iCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhpcyBzdGF0ZW1lbnQgZ2l2ZXMgdXMgdGhlIGxpYmVydHkgdG8gZmluZCBhIHdyYXBwZXIgY2xhc3MvYnVpbGQgYSB3cmFwcGVyIGNsYXNzIG9yIAotICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnQgYW4gZW5naW5lIHcvbyB0aGUgd3JhcHBlciBjbGFzcy4KLQotICAgICAgICAgICAgICAgICAgICAvLyBAUmVxdWVzdFdyYXBwZXIgY2xhc3NOYW1lIHByb2Nlc3NpbmcKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RXcmFwcGVyTmFtZSA9IG9wRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFdyYXBwZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlck5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKyAiLiIgKyBqYXZhTWV0aG9kVG9DbGFzc05hbWUobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyTmFtZSA9IGphdmFNZXRob2RUb0NsYXNzTmFtZShtZXRob2ROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm91bmRSZXF1ZXN0V3JhcHBlck5hbWUgPSBmaW5kQXJ0aWZhY3QocmVxdWVzdFdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUmVxdWVzdFdyYXBwZXJOYW1lID0gZmluZEFydGlmYWN0KHJlcXVlc3RXcmFwcGVyTmFtZSwgZWQuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRSZXF1ZXN0V3JhcHBlck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRSZXF1ZXN0V3JhcHBlck5hbWUgPSBtaXNzaW5nQXJ0aWZhY3QocmVxdWVzdFdyYXBwZXJOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRSZXF1ZXN0V3JhcHBlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJNYXAucHV0KG9wRGVzYywgZm91bmRSZXF1ZXN0V3JhcHBlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQFJlc3BvbnNlV3JhcHBlciBjbGFzc05hbWUgcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyTmFtZSA9IG9wRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlV3JhcHBlck5hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhTWV0aG9kVG9DbGFzc05hbWUobWV0aG9kTmFtZSkgKyAiUmVzcG9uc2UiOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJOYW1lID0gamF2YU1ldGhvZFRvQ2xhc3NOYW1lKG1ldGhvZE5hbWUpICsgIlJlc3BvbnNlIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm91bmRSZXNwb25zZVdyYXBwZXJOYW1lID0gZmluZEFydGlmYWN0KHJlc3BvbnNlV3JhcHBlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRSZXNwb25zZVdyYXBwZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUmVzcG9uc2VXcmFwcGVyTmFtZSA9IGZpbmRBcnRpZmFjdChyZXNwb25zZVdyYXBwZXJOYW1lLCBlZC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFJlc3BvbnNlV3JhcHBlck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRSZXNwb25zZVdyYXBwZXJOYW1lID0gbWlzc2luZ0FydGlmYWN0KHJlc3BvbnNlV3JhcHBlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFJlc3BvbnNlV3JhcHBlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyTWFwLnB1dChvcERlc2MsIGZvdW5kUmVzcG9uc2VXcmFwcGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjIDogb3BEZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhdWx0QmVhbkRlc2MgZmF1bHRCZWFuRGVzYyA9IGNyZWF0ZShlZCwgZmF1bHREZXNjLCBvcERlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuRGVzY01hcC5wdXQoZmF1bHREZXNjLCBmYXVsdEJlYW5EZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRmF1bHRCZWFuRGVzYyBjcmVhdGUoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwgRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYykgewotICAgICAgICAvKiBGYXVsdEJlYW5DbGFzcyBhbGdvcml0aG0KLSAgICAgICAgICogICAxKSBUaGUgY2xhc3MgZGVmaW5lZCBvbiBAV2ViRmF1bHQgb2YgdGhlIGV4Y2VwdGlvbgotICAgICAgICAgKiAgIDIpIElmIG5vdCBwcmVzZW50IG9yIGludmFsaWQsIHRoZSBjbGFzcyBkZWZpbmVkIGJ5IGdldEZhdWx0SW5mby4KLSAgICAgICAgICogICAzKSBJZiBub3QgcHJlc2VudCwgdGhlIGNsYXNzIGlzIGZvdW5kIGJ5IGxvb2tpbmcgZm9yIHRoZQotICAgICAgICAgKiAgICAgIGEgY2xhc3MgbmFtZWQgPGV4Y2VwdGlvbk5hbWU+QmVhbiBpbiB0aGUgaW50ZXJmYWNlJ3MgcGFja2FnZS4KLSAgICAgICAgICogICA0KSBJZiBub3QgcHJlc2VudCwgdGhlIGNsYXNzIGlzIGZvdW5kIGJ5IGxvb2tpbmcgZm9yIHRoZQotICAgICAgICAgKiAgICAgIGEgY2xhc3MgbmFtZWQgPGV4Y2VwdGlvbk5hbWU+QmVhbiBpbiB0aGUgaW50ZXJmYWNlICsgamF4d3MgcGFja2FnZQotICAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIGZhdWx0QmVhbkNsYXNzTmFtZSA9IGZhdWx0RGVzYy5nZXRGYXVsdEJlYW4oKTsKLSAgICAgICAgaWYgKGZhdWx0QmVhbkNsYXNzTmFtZSA9PSBudWxsIHx8IGZhdWx0QmVhbkNsYXNzTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW5DbGFzc05hbWUgPSBmYXVsdERlc2MuZ2V0RmF1bHRJbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhdWx0QmVhbkNsYXNzTmFtZSA9PSBudWxsIHx8IGZhdWx0QmVhbkNsYXNzTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVjbGFyaW5nQ2xhc3NOYW1lID0gb3BEZXNjLmdldEphdmFEZWNsYXJpbmdDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKGRlY2xhcmluZ0NsYXNzTmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZSA9IGdldFNpbXBsZUNsYXNzTmFtZShmYXVsdERlc2MuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgc2ltcGxlTmFtZSArICJCZWFuIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRCZWFuQ2xhc3NOYW1lID0gc2ltcGxlTmFtZSArICJCZWFuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZm91bmRDbGFzc05hbWUgPSBmaW5kQXJ0aWZhY3QoZmF1bHRCZWFuQ2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGZvdW5kQ2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzTmFtZSA9IGZpbmRBcnRpZmFjdChmYXVsdEJlYW5DbGFzc05hbWUsIGVkLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvdW5kQ2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzTmFtZSA9IG1pc3NpbmdBcnRpZmFjdChmYXVsdEJlYW5DbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3VuZENsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW5DbGFzc05hbWUgPSBmb3VuZENsYXNzTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIExvY2FsIE5hbWVBbGdvcml0aG06Ci0gICAgICAgICogICAxKSBUaGUgbmFtZSBkZWZpbmVkIG9uIHRoZSBAV2ViRmF1bHQgb2YgdGhlIGV4Y2VwdGlvbi4KLSAgICAgICAgKiAgIDIpIElmIG5vdCBwcmVzZW50LCB0aGUgbmFtZSBkZWZpbmVkIHZpYSB0aGUgQFhtbFJvb3RFbGVtZW50IG9mIHRoZSBmYXVsdCBiZWFuIGNsYXNzLgotICAgICAgICAqICAgMykgSWYgbm90IHByZXNlbnQsIHRoZSA8ZXhjZXB0aW9uTmFtZT5CZWFuCi0gICAgICAgICovCi0gICAgICAgIFN0cmluZyBmYXVsdEJlYW5Mb2NhbE5hbWUgPSBmYXVsdERlc2MuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoZmF1bHRCZWFuTG9jYWxOYW1lID09IG51bGwgfHwgZmF1bHRCZWFuTG9jYWxOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGlmIChmYXVsdEJlYW5DbGFzc05hbWUgIT0gbnVsbCAmJiBmYXVsdEJlYW5DbGFzc05hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZmF1bHRCZWFuOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuID0gbG9hZENsYXNzKGZhdWx0QmVhbkNsYXNzTmFtZSwgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuID0gbG9hZENsYXNzKGZhdWx0QmVhbkNsYXNzTmFtZSwgZWQuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRGVzYyBhRGVzYyA9IEFubm90YXRpb25EZXNjSW1wbC5jcmVhdGUoZmF1bHRCZWFuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFEZXNjLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbkxvY2FsTmFtZSA9IGFEZXNjLmdldFhtbFJvb3RFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhdWx0QmVhbkxvY2FsTmFtZSA9PSBudWxsIHx8IGZhdWx0QmVhbkxvY2FsTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBmYXVsdEJlYW5Mb2NhbE5hbWUgPSBnZXRTaW1wbGVDbGFzc05hbWUoZmF1bHREZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpKSArICJCZWFuIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsZ29yaXRobSBmb3IgZmF1bHQgYmVhbiBuYW1lc3BhY2UKLSAgICAgICAgKiAgIDEpIFRoZSBuYW1lc3BhY2UgZGVmaW5lZCBvbiB0aGUgQFdlYkZhdWx0IG9mIHRoZSBleGNlcHRpb24uCi0gICAgICAgICogICAyKSBJZiBub3QgcHJlc2VudCwgdGhlIG5hbWVzcGFjZSBkZWZpbmVkIHZpYSB0aGUgQFhtbFJvb3RFbGVtZW50IG9mIHRoZSBjbGFzcyBuYW1lLgotICAgICAgICAqICAgMykgSWYgbm90IHByZXNlbnQsIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1ldGhvZCdzIGRlY2xhcmVkIGNsYXNzICsgIi9qYXh3cyIKLSAgICAgICAgKi8KLSAgICAgICAgU3RyaW5nIGZhdWx0QmVhbk5hbWVzcGFjZSA9IGZhdWx0RGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgaWYgKGZhdWx0QmVhbk5hbWVzcGFjZSA9PSBudWxsIHx8IGZhdWx0QmVhbk5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHRCZWFuQ2xhc3NOYW1lICE9IG51bGwgJiYgZmF1bHRCZWFuQ2xhc3NOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGZhdWx0QmVhbjsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5DbGFzc05hbWUsIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5DbGFzc05hbWUsIGVkLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkRlc2MgYURlc2MgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGZhdWx0QmVhbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhRGVzYy5oYXNYbWxSb290RWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdEJlYW5OYW1lc3BhY2UgPSBhRGVzYy5nZXRYbWxSb290RWxlbWVudE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmF1bHRCZWFuTmFtZXNwYWNlID09IG51bGwgfHwgZmF1bHRCZWFuTmFtZXNwYWNlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGZhdWx0QmVhbk5hbWVzcGFjZSA9IG9wRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEZhdWx0QmVhbkRlc2NJbXBsKAotICAgICAgICAgICAgICAgIGZhdWx0QmVhbkNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW5Mb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgZmF1bHRCZWFuTmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBwYWNrYWdlIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgaWYgKGluZGV4IDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuIHNpbXBsZSBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZiAoaW5kZXggPD0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQotICAgICAqIEByZXR1cm4gbWV0aG9kIG5hbWUgY29udmVydGVkIGludG8gYSBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGphdmFNZXRob2RUb0NsYXNzTmFtZShTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1aWxkQ2xhc3NOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihtZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGJ1aWxkQ2xhc3NOYW1lLnJlcGxhY2UoMCwgMSwgbWV0aG9kTmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSk7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSBidWlsZENsYXNzTmFtZS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBpZiB0aGUgYXJ0aWZhY3QgaXMgbWlzc2luZwotICAgICAqCi0gICAgICogQHBhcmFtIGFydGlmYWN0TmFtZQotICAgICAqIEByZXR1cm4gbmV3bHkgY29uc3RydWN0ZWQgbmFtZSBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWlzc2luZ0FydGlmYWN0KFN0cmluZyBhcnRpZmFjdE5hbWUpIHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGZvbGxvd2luZyBjbGFzcyB3YXMgbm90IGZvdW5kOiAiICsgYXJ0aWZhY3ROYW1lICsgIiBQcm9jZXNzaW5nIGNvbnRpbnVlcyB3aXRob3V0IHRoaXMgY2xhc3MuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHRoZSBhY3R1YWwgcGFja2FnZXIgbmFtZSBmb3IgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHMgYnkgdHJ5aW5nIHRvIGxvYWQgdGhlIGNsYXNzCi0gICAgICogZnJvbSBvbmUgb2YgdHdvIHBhY2thZ2VzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgUkkgaW1wbGVtZW50YXRpb25zIG9mIFdTR2VuIGFuZAotICAgICAqIFdTSW1wb3J0IGdlbmVyYXRlIHRoZSBhcnRpZmFjdHMgaW4gZGlmZmVyZW50IHBhY2thZ2VzOiAtIFdTSW1wb3J0IGdlbmVyYXRlcyB0aGUgYXJ0aWZhY3RzIGluCi0gICAgICogdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgU0VJIC0gV1NHZW4gZ2VuZXJhdGVzIHRoZSBhcnRpZmFjdHMgaW4gYSAiamF4d3MiIHN1YiBwYWNrYWdlIHVuZGVyCi0gICAgICogdGhlIFNFSSBwYWNrYWdlLiBOb3RlIHRoYXQgZnJvbSByZWFkaW5nIHRoZSBKQVgtV1Mgc3BlYywgaXQgc2VlbXMgdGhhdCBXU0dlbiBpcyBkb2luZyB0aGF0Ci0gICAgICogY29ycmVjdGx5OyBTZWUgdGhlIGNvbmZvcm1hbmNlIHJlcXVpcmVtZW50IGluIEpBWC1XUyAyLjAgU3BlYyBTZWN0aW9uIDMuNi4yLjEgRG9jdW1lbnQKLSAgICAgKiBXcmFwcGVkIG9uIHBhZ2UgMzY6IENvbmZvcm1hbmNlIChEZWZhdWx0IHdyYXBwZXIgYmVhbiBwYWNrYWdlKTogSW4gdGhlIGFic2VuY2Ugb2YKLSAgICAgKiBjdXN0b21pemF0aW9ucywgdGhlIHdyYXBwZXIgYmVhbnMgcGFja2FnZSBNVVNUIGJlIGEgZ2VuZXJhdGVkIGpheHdzIHN1YnBhY2thZ2Ugb2YgdGhlIFNFSQotICAgICAqIHBhY2thZ2UuIF5eXl5eXl5eXl5eXl5eXl4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnRpZmFjdENsYXNzTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFdTX1NVQlBBQ0tBR0UgPSAiamF4d3MiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRBcnRpZmFjdChTdHJpbmcgYXJ0aWZhY3RDbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRBcnRpZmFjdChhcnRpZmFjdENsYXNzTmFtZSwgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kQXJ0aWZhY3QoU3RyaW5nIGFydGlmYWN0Q2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBTdHJpbmcgcmV0dXJuQXJ0aWZhY3RDbGFzc05hbWUgPSBudWxsOwotICAgICAgICBpZiAoYXJ0aWZhY3RDbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJldHVybkFydGlmYWN0Q2xhc3NOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGxvYWQgdGhlIGNsYXNzIHRoYXQgd2FzIHBhc3NlZCBpbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yTmFtZShhcnRpZmFjdENsYXNzTmFtZSwgdHJ1ZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgcmV0dXJuQXJ0aWZhY3RDbGFzc05hbWUgPSBhcnRpZmFjdENsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBDb3VsZG4ndCBsb2FkIHRoZSBjbGFzczsgd2UnbGwgdHJ5IGFub3RoZXIgb25lIGJlbG93LgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIG9yaWdpbmFsIGNsYXNzIGNvdWxkbid0IGJlIGxvYWRlZCwgdHJ5IGFkZGluZyAiLmpheHdzLiIgdG8gdGhlIHBhY2thZ2UKLSAgICAgICAgaWYgKHJldHVybkFydGlmYWN0Q2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbFBhY2thZ2UgPSBnZXRQYWNrYWdlTmFtZShhcnRpZmFjdENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAob3JpZ2luYWxQYWNrYWdlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhbHRlcm5hdGVQYWNrYWdlID0gb3JpZ2luYWxQYWNrYWdlICsgIi4iICsgSkFYV1NfU1VCUEFDS0FHRTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2ltcGxlQ2xhc3NOYW1lKGFydGlmYWN0Q2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWx0ZXJuYXRlV3JhcHBlckNsYXNzID0gYWx0ZXJuYXRlUGFja2FnZSArICIuIiArIGNsYXNzTmFtZTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsb2FkQ2xhc3MoYWx0ZXJuYXRlV3JhcHBlckNsYXNzLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkFydGlmYWN0Q2xhc3NOYW1lID0gYWx0ZXJuYXRlV3JhcHBlckNsYXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGxvYWQgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkFydGlmYWN0Q2xhc3NOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICByZXR1cm4gZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByb3RlY3RlZCBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzcy5mb3JOYW1lIGRvZXMgbm90IHN1cHBvcnQgcHJpbWl0aXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgCUNsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAl0cnl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJCWlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgCQkJY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgICAgICAgICAgICAgCQlyZXR1cm4gY2xzOwotICAgICAgICAgICAgICAgICAgICAgICAgCQkvL0xldHMgY2F0Y2ggTm9DbGFzc0RlZkZvdW5kRXJyb3IgYXMgaXRzIHBhcnQgb2YgVGhyb3dhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAJCS8vQW55IEV4Y2VwdGlvbiB0aGF0IGV4dGVuZHMgRXhjZXB0aW9uIHdpbGwgYmUgaGFuZGxlZCBieSBkb1ByaXYgbWV0aG9kLiAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgKiBJbiBkaWZmZXJlbnQgamF4d3Mgc2NlbmFyaW9zLCBzb21lIGNsYXNzZXMgbWF5IGJlIG1pc3NpbmcuICBTbyBpdCBpcyBub3JtYWwgYmVoYXZpb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICogdG8gZ2V0IHRvIHRoaXMgcG9pbnQuICBUaGUgZXhjZXB0aW9uIGlzIHN3YWxsb3dlZCBhbmQgYSBudWxsIGlzIHJldHVybmVkLiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgICAqIFRoZSBleGNlcHRpb24gaXMgbm90IGxvZ2dlZC4uLmFzIHRoaXMgd291bGQgZ2l2ZSBzZXJ2aWNhYmlsaXR5IGZvbGtzIHRoZSBpZGVhIHRoYXQgYSBwcm9ibGVtIG9jY3VycmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIAl9IAotICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBjbHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJbiBkaWZmZXJlbnQgamF4d3Mgc2NlbmFyaW9zLCBzb21lIGNsYXNzZXMgbWF5IGJlIG1pc3NpbmcuICBTbyBpdCBpcyBub3JtYWwgYmVoYXZpb3IKLSAgICAgICAgICAgICAqIHRvIGdldCB0byB0aGlzIHBvaW50LiAKLSAgICAgICAgICAgICAqIFRoZSBleGNlcHRpb24gaXMgbm90IGxvZ2dlZC4uLmFzIHRoaXMgd291bGQgZ2l2ZSBzZXJ2aWNhYmlsaXR5IGZvbGtzIHRoZSBpZGVhIHRoYXQgYSBwcm9ibGVtIG9jY3VycmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvRmF1bHRCZWFuRGVzY0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL0ZhdWx0QmVhbkRlc2NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjU0OTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvRmF1bHRCZWFuRGVzY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkZhdWx0QmVhbkRlc2M7Ci0KLWNsYXNzIEZhdWx0QmVhbkRlc2NJbXBsIGltcGxlbWVudHMgRmF1bHRCZWFuRGVzYyB7Ci0KLSAgICBTdHJpbmcgZmF1bHRCZWFuQ2xhc3NOYW1lOwotICAgIFN0cmluZyBmYXVsdEJlYW5Mb2NhbE5hbWU7Ci0gICAgU3RyaW5nIGZhdWx0QmVhbk5hbWVzcGFjZTsKLQotICAgIEZhdWx0QmVhbkRlc2NJbXBsKFN0cmluZyBmYXVsdEJlYW5DbGFzc05hbWUsIFN0cmluZyBmYXVsdEJlYW5Mb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZhdWx0QmVhbk5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLmZhdWx0QmVhbkNsYXNzTmFtZSA9IGZhdWx0QmVhbkNsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5mYXVsdEJlYW5Mb2NhbE5hbWUgPSBmYXVsdEJlYW5Mb2NhbE5hbWU7Ci0gICAgICAgIHRoaXMuZmF1bHRCZWFuTmFtZXNwYWNlID0gZmF1bHRCZWFuTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gZmF1bHRCZWFuQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuTG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gZmF1bHRCZWFuTG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRCZWFuTmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gZmF1bHRCZWFuTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgRmF1bHRCZWFuIENsYXNzIE5hbWUgOiIgKyBmYXVsdEJlYW5DbGFzc05hbWUpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICBzdHJpbmcuYXBwZW5kKCIgICAgICBGYXVsdEJlYW4gTmFtZXNwYWNlICA6IiArIGZhdWx0QmVhbk5hbWVzcGFjZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgIEZhdWx0QmVhbiBMb2NhbCBOYW1lIDoiICsgZmF1bHRCZWFuTG9jYWxOYW1lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2ZmZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLkFubm90YXRpb25EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotcHVibGljIGNsYXNzIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25CdWlsZGVyLmNsYXNzKTsKLQotICAgIC8qKiBJbnRlbnRpb25hbGx5IFByaXZhdGUgKi8KLSAgICBwcml2YXRlIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uQnVpbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcERlc2MKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGNyZWF0ZShTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MpIHsKLSAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb25JbXBsIGRlc2MgPQotICAgICAgICAgICAgICAgIG5ldyBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwoZ2V0S2V5KCksIHNlcnZpY2VEZXNjKTsKLSAgICAgICAgaW5pdChkZXNjLCBzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIHJldHVybiBkZXNjOwotICAgIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuICJKQVhXUy1NQVJTSEFMIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW1wbENsYXNzCi0gICAgICogQHJldHVybiB0cnVlIGlmIEZpZWxkIG9yIE1ldGhvZCBoYXMgYSBAUmVzb3VyY2UgYW5ub3RhdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIHZvaWQgaW5pdChNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwgbWFyc2hhbERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYykgewotCi0gICAgICAgIC8vIEFydGlmYWN0IGNsYXNzIGRpc2NvdmVyeS9idWlsZGVyCi0gICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFydGlmYWN0UHJvY2Vzc29yID0gbmV3IEFydGlmYWN0UHJvY2Vzc29yKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFydGlmYWN0UHJvY2Vzc29yLmJ1aWxkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgICAgIG1hcnNoYWxEZXNjLnNldFJlcXVlc3RXcmFwcGVyTWFwKGFydGlmYWN0UHJvY2Vzc29yLmdldFJlcXVlc3RXcmFwcGVyTWFwKCkpOwotICAgICAgICBtYXJzaGFsRGVzYy5zZXRSZXNwb25zZVdyYXBwZXJNYXAoYXJ0aWZhY3RQcm9jZXNzb3IuZ2V0UmVzcG9uc2VXcmFwcGVyTWFwKCkpOwotICAgICAgICBtYXJzaGFsRGVzYy5zZXRGYXVsdEJlYW5EZXNjTWFwKGFydGlmYWN0UHJvY2Vzc29yLmdldEZhdWx0QmVhbkRlc2NNYXAoKSk7Ci0KLSAgICAgICAgLy8gQnVpbGQgdGhlIGFubm90YXRpb24gbWFwCi0gICAgICAgIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBtYXA7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAgPSBBbm5vdGF0aW9uQnVpbGRlci5nZXRBbm5vdGF0aW9uRGVzY3Moc2VydmljZURlc2MsIGFydGlmYWN0UHJvY2Vzc29yKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBidWlsZGluZyBhIGNhY2hlLCBwcm9jZWVkIHdpdGhvdXQgZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjYWNoZSBwcm9jZXNzaW5nLiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZToiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPigpOwotICAgICAgICB9Ci0gICAgICAgIG1hcnNoYWxEZXNjLnNldEFubm90YXRpb25NYXAobWFwKTsKLQotICAgICAgICAvLyBCdWlsZCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBtYXAKLSAgICAgICAgTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4gY2FjaGU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYWNoZSA9IFByb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5RGVzY01hcHMoc2VydmljZURlc2MsIGFydGlmYWN0UHJvY2Vzc29yKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBidWlsZGluZyBhIGNhY2hlLCBwcm9jZWVkIHdpdGhvdXQgZXhjZXB0aW9uCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBjYWNoZSBwcm9jZXNzaW5nLiAgVGhpcyB3aWxsIGltcGFjdCBwZXJmb3JtYW5jZToiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYWNoZSA9IG5ldyBIYXNoTWFwPENsYXNzLCBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPj4oKTsKLSAgICAgICAgfQotICAgICAgICBtYXJzaGFsRGVzYy5zZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXBDYWNoZShjYWNoZSk7Ci0KLSAgICAgICAgLy8gQFRPRE8gVGhlcmUgYXJlIHR3byB3YXlzIHRvIGdldCB0aGUgcGFja2FnZXMuCi0gICAgICAgIC8vIFNjaGVtYSBXYWxrIChwcmVmZXJlZCkgYW5kIEFubm90YXRpb24gV2Fsay4KLSAgICAgICAgLy8gVGhlIFNjaGVtYSB3YWxrIHJlcXVpcmVzIGFuIGV4aXN0aW5nIG9yIGdlbmVyYXRlZCBzY2hlbWEuCi0gICAgICAgIC8vIAotICAgICAgICAvLyBUaGVyZSBhcmUgc29tZSBsaW1pdGF0aW9ucyBpbiB0aGUgY3VycmVudCBzY2hlbWEgd2FsawotICAgICAgICAvLyBBbmQgdGhlcmUgYXJlIHByb2JsZW1zIGluIHRoZSBhbm5vdGF0aW9uIHdhbGsuCi0gICAgICAgIC8vIFNvIGZvciBub3cgd2Ugd2lsbCBkbyBib3RoLgotICAgICAgICBUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGJvb2xlYW4gZG9TY2hlbWFXYWxrID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBkb0Fubm90YXRpb25XYWxrID0gdHJ1ZTsKLSAgICAgICAgcGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChkb1NjaGVtYVdhbGspIHsKLSAgICAgICAgICAgIHBhY2thZ2VzLmFkZEFsbChQYWNrYWdlU2V0QnVpbGRlci5nZXRQYWNrYWdlc0Zyb21TY2hlbWEoc2VydmljZURlc2MpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9Bbm5vdGF0aW9uV2FsaykgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBwYWNrYWdlIG5hbWVzIGZyb20gdGhlIGFubm90YXRpb25zLiAgVXNlIHRoZSBhbm5vdGF0aW9uIG1hcCB0byByZWR1Y2UgQW5ub3RhdGlvbiBpbnRyb3NwZWN0aW9uCi0gICAgICAgICAgICBwYWNrYWdlcy5hZGRBbGwoUGFja2FnZVNldEJ1aWxkZXIuZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoc2VydmljZURlc2MsIG1hcnNoYWxEZXNjKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWFyc2hhbERlc2Muc2V0UGFja2FnZXMocGFja2FnZXMpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9NYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDE2YzhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL01hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5Bbm5vdGF0aW9uRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5GYXVsdEJlYW5EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5YTUxSb290RWxlbWVudFV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLQotcHVibGljIGNsYXNzIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0gICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIHsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjOwotICAgIHByaXZhdGUgU3RyaW5nIGtleTsKLSAgICBwcml2YXRlIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlczsKLSAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlc0tleTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBhbm5vdGF0aW9uTWFwID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxDbGFzcywgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+IHBkTWFwQ2FjaGUgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPE9wZXJhdGlvbkRlc2NyaXB0aW9uLCBTdHJpbmc+IHJlcXVlc3RXcmFwcGVyTWFwID0gbnVsbDsKLSAgICBwcml2YXRlIE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiByZXNwb25zZVdyYXBwZXJNYXAgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPEZhdWx0RGVzY3JpcHRpb24sIEZhdWx0QmVhbkRlc2M+IGZhdWx0QmVhbkRlc2NNYXAgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPQotICAgICAgICAgICAgKE1lc3NhZ2VGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLQotCi0gICAgcHJvdGVjdGVkIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uSW1wbChTdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZURlc2MgPSBzZXJ2aWNlRGVzYzsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0aW9uIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBUcmVlU2V0PFN0cmluZz4gZ2V0UGFja2FnZXMoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VzS2V5KCkgewotICAgICAgICByZXR1cm4gcGFja2FnZXNLZXk7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQYWNrYWdlcyhUcmVlU2V0PFN0cmluZz4gcGFja2FnZXMpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlcyA9IHBhY2thZ2VzOwotICAgICAgICB0aGlzLnBhY2thZ2VzS2V5ID0gcGFja2FnZXMudG9TdHJpbmcoKTsgIC8vIFVuaXF1ZSBrZXkgZm9yIHNlYXJjaGVzCi0gICAgfQotCi0gICAgcHVibGljIEFubm90YXRpb25EZXNjIGdldEFubm90YXRpb25EZXNjKENsYXNzIGNscykgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xzLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgQW5ub3RhdGlvbkRlc2MgYURlc2MgPSBhbm5vdGF0aW9uTWFwLmdldChjbGFzc05hbWUpOwotICAgICAgICBpZiAoYURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2FjaGUgaGl0Ci0gICAgICAgICAgICByZXR1cm4gYURlc2M7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2FjaGUgbWlzcy4uLndlIGNhbm5vdCB1cGRhdGUgdGhlIG1hcCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gaW50cm9kdWNlIGEgc3luYyBjYWxsLgotICAgICAgICBhRGVzYyA9IEFubm90YXRpb25EZXNjSW1wbC5jcmVhdGUoY2xzKTsKLQotICAgICAgICByZXR1cm4gYURlc2M7Ci0gICAgfQotCi0KLSAgICB2b2lkIHNldEFubm90YXRpb25NYXAoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlc2M+IG1hcCkgewotICAgICAgICB0aGlzLmFubm90YXRpb25NYXAgPSBtYXA7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gZ2V0UHJvcGVydHlEZXNjcmlwdG9yTWFwKENsYXNzIGNscykgewotICAgICAgICAvLyBXZSBhcmUgY2FjaGluZyBieSBjbGFzcy4gIAotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCA9IHBkTWFwQ2FjaGUuZ2V0KGNscyk7Ci0gICAgICAgIGlmIChwZE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYWNoZSBoaXQKLSAgICAgICAgICAgIHJldHVybiBwZE1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhY2hlIG1pc3MuLi50aGlzIGNhbiBvY2N1ciBpZiB0aGUgY2xhc3Nsb2FkZXIgY2hhbmdlZC4KLSAgICAgICAgLy8gV2UgY2Fubm90IGFkZCB0aGlzIG5ldyBwZE1hcCBhdCB0aGlzIHBvaW50IGR1ZSB0byBzeW5jIGlzc3Vlcy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBkTWFwID0gWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcChjbHMpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGRNYXA7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcm9wZXJ0eURlc2NyaXB0b3JNYXBDYWNoZShNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBjYWNoZSkgewotICAgICAgICB0aGlzLnBkTWFwQ2FjaGUgPSBjYWNoZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyTWFwLmdldChvcGVyYXRpb25EZXNjKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFJlcXVlc3RXcmFwcGVyTWFwKE1hcDxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiBtYXApIHsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJNYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYykgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyTWFwLmdldChvcGVyYXRpb25EZXNjKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFJlc3BvbnNlV3JhcHBlck1hcChNYXA8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gbWFwKSB7Ci0gICAgICAgIHJlc3BvbnNlV3JhcHBlck1hcCA9IG1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRCZWFuRGVzYyBnZXRGYXVsdEJlYW5EZXNjKEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdEJlYW5EZXNjTWFwLmdldChmYXVsdERlc2MpOwotICAgIH0KLQotICAgIHZvaWQgc2V0RmF1bHRCZWFuRGVzY01hcChNYXA8RmF1bHREZXNjcmlwdGlvbiwgRmF1bHRCZWFuRGVzYz4gbWFwKSB7Ci0gICAgICAgIGZhdWx0QmVhbkRlc2NNYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld2xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZWxpbmUgPSAiICI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICBNYXJzaGFsU2VydmljZVJ1bnRpbWU6IiArIGdldEtleSgpKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIFBhY2thZ2VzID0gIiArIGdldFBhY2thZ2VzKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIEFubm90YXRpb25EZXNjPiBlbnRyeSA6IHRoaXMuYW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIEFubm90YXRpb25EZXNjIGNhY2hlZCBmb3I6IiArIGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoRW50cnk8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBlbnRyeSA6IHRoaXMucGRNYXBDYWNoZS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIFByb3BlcnR5RGVzY3JpcHRvclBsdXMgTWFwIGNhY2hlZCBmb3I6IiArCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldEtleSgpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICBmb3IgKFByb3BlcnR5RGVzY3JpcHRvclBsdXMgcGRwIDogZW50cnkuZ2V0VmFsdWUoKS52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgcHJvcGVydHlOYW1lICAgPSIgKyBwZHAuZ2V0UHJvcGVydHlOYW1lKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgICAgICB4bWxOYW1lICAgICAgPSIgKyBwZHAuZ2V0WG1sTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICAgICAgcHJvcGVydHlUeXBlID0iICsgcGRwLmdldFByb3BlcnR5VHlwZSgpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBSZXF1ZXN0V3JhcHBlcnMiKTsKLSAgICAgICAgZm9yIChFbnRyeTxPcGVyYXRpb25EZXNjcmlwdGlvbiwgU3RyaW5nPiBlbnRyeSA6IHRoaXMucmVxdWVzdFdyYXBwZXJNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBPcGVyYXRpb246IiArIGVudHJ5LmdldEtleSgpLmdldEphdmFNZXRob2ROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAiIFJlcXVlc3RXcmFwcGVyOiIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBSZXNwb25zZVdyYXBwZXJzIik7Ci0gICAgICAgIGZvciAoRW50cnk8T3BlcmF0aW9uRGVzY3JpcHRpb24sIFN0cmluZz4gZW50cnkgOiB0aGlzLnJlc3BvbnNlV3JhcHBlck1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiICAgIE9wZXJhdGlvbjoiICsgZW50cnkuZ2V0S2V5KCkuZ2V0SmF2YU1ldGhvZE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICIgUmVzcG9uc2VXcmFwcGVyOiIgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBGYXVsdEJlYW5EZXNjIik7Ci0gICAgICAgIGZvciAoRW50cnk8RmF1bHREZXNjcmlwdGlvbiwgRmF1bHRCZWFuRGVzYz4gZW50cnkgOiB0aGlzLmZhdWx0QmVhbkRlc2NNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIiAgICBGYXVsdEV4Y2VwdGlvbjoiICsgZW50cnkuZ2V0S2V5KCkuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLQotCi0gICAgcHVibGljIE1lc3NhZ2VGYWN0b3J5IGdldE1lc3NhZ2VGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3Rvcnk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9QYWNrYWdlU2V0QnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvUGFja2FnZVNldEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3MzQ2NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9ydW50aW1lL2Rlc2NyaXB0aW9uL21hcnNoYWwvaW1wbC9QYWNrYWdlU2V0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5ydW50aW1lLmRlc2NyaXB0aW9uLm1hcnNoYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlBhcmFtZXRlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5Bbm5vdGF0aW9uRGVzYzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5GYXVsdEJlYW5EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLk1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuQ2xhc3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLlNjaGVtYVJlYWRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuaW1wbC5TY2hlbWFSZWFkZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogSW4gb3JkZXIgdG8gbWFyc2hhbCBvciB1bm1hcnNoYWwgdGhlIHVzZXIgZGF0YSwgd2UgbmVlZCB0byBrbm93IHRoZSBzZXQgb2YgcGFja2FnZXMgaW52b2x2ZWQuCi0gKiBUaGUgc2V0IG9mIHBhY2thZ2VzIGlzIHVzZWQgdG8gY29uc3RydWN0IGFuIGFwcHJvcHJpYXRlIEpBWEJDb250ZXh0IG9iamVjdCBkdXJpbmcgdGhlCi0gKiBtYXJzaGFsbGluZy91bm1hcnNoYWxsaW5nLgotICogPHAvPgotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGdldCB0aGlzIGRhdGEuCi0gKiA8cC8+Ci0gKiBTY2hlbWEgV2FsayAocHJlZmVycmVkKTogIEdldCB0aGUgbGlzdCBvZiBwYWNrYWdlcyBieSB3YWxraW5nIHRoZSBzY2hlbWFzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkKLSAqIHRoZSB3c2RsIChvciBnZW5lcmF0ZWQgd3NkbCkuICBFYWNoIHNjaGVtYSByZXByZXNlbnRzIGEgZGlmZmVyZW50IHBhY2thZ2UuICBUaGUgcGFja2FnZSBpcwotICogb2J0YWluZWQgdXNpbmcgdGhlIGpheGIgY3VzdG9taXphdGlvbiBvciBKQVhCIGRlZmF1bHQgbnM8LT5wYWNrYWdlIHJ1bGUuCi0gKiA8cC8+Ci0gKiBBbm5vdGF0aW9uIFdhbGsoc2Vjb25kYXJ5KSA6IFdhbGsgdGhlIGxpc3Qgb2YgRW5kcG9pbnRzLCBPcGVyYXRpb25zLCBQYXJhbWV0ZXJzLCBldGMuIGFuZCBidWlsZCBhCi0gKiBsaXN0IG9mIHBhY2thZ2VzIGJ5IGxvb2tpbmcgYXQgdGhlIGNsYXNzZXMgaW52b2x2ZWQuCi0gKiA8cC8+Ci0gKiBUaGUgU2NoZW1hIFdhbGsgaXMgZmFzdGVyIGFuZCBtb3JlIGNvbXBsZXRlLCBidXQgcmVsaWVzIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgc2NoZW1hIG9yIHdzZGwuCi0gKiA8cC8+Ci0gKiBUaGUgQW5ub3RhdGlvbiBXYWxrIGlzIHNsb3dlciBhbmQgaXMgbm90IGNvbXBsZXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBhbm5vdGF0aW9uIHdhbGsgbWF5IG5vdAotICogZGlzY292ZXIgdGhlIHBhY2thZ2VzIGZvciBkZXJpdmVkIHR5cGVzIHRoYXQgYXJlIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgc2NoZW1hIHRoYW4gdGhlIGZvcm1hbAotICogcGFyYW1ldGVyIHR5cGVzLgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVNldEJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhY2thZ2VTZXRCdWlsZGVyLmNsYXNzKTsKLQotICAgIC8qKiBUaGlzIGlzIGEgc3RhdGljIHV0aWxpdHkgY2xhc3MuICBUaGUgY29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBwcml2YXRlICovCi0gICAgcHJpdmF0ZSBQYWNrYWdlU2V0QnVpbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWxrcyB0aGUgc2NoZW1hcyBvZiB0aGUgc2VydmljZURlc2MncyB3c2RsIChvciBnZW5lcmF0ZWQgd3NkbCkgdG8gZGV0ZXJtaW5lIHRoZSBsaXN0IG9mCi0gICAgICogcGFja2FnZXMuIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBhbGdvcml0aG0gZm9yIGRpc2NvdmVyaW5nIHRoZSBwYWNrYWdlIHNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzYyBTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgKiBAcmV0dXJuIFNldCBvZiBQYWNrYWdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJlZVNldDxTdHJpbmc+IGdldFBhY2thZ2VzRnJvbVNjaGVtYShTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MpIHsKLQotICAgICAgICBUcmVlU2V0PFN0cmluZz4gc2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICAvL0lmIHdlIGFyZSBvbiBjbGllbnQgc2lkZSB3ZSB3aWxsIGdldCB3c2RsIGRlZmluaXRpb24gZnJvbSBTZXJ2aWNlRGVzY3JpcHRpb24uIElmIHdlIGFyZSBvbiBzZXJ2ZXIgc2lkZSB3ZSB3aWxsIGhhdmUgdG8KLSAgICAgICAgLy9yZWFkIHdzZGxMb2NhdGlvbiBmcm9tIEBXZWJTZXJ2aWNlIEFubm90YXRpb24uCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbldTREwgc2R3ID0gKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpc2VydmljZURlc2M7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBzZHcuZ2V0V1NETERlZmluaXRpb24oKTsKLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlbmRwb2ludERlc2NzID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlZDplbmRwb2ludERlc2NzKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAod3NkbERlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIEkgZG9uJ3QgdGhpbmsgd2Ugc2hvdWxkIGJlIHRyeWluZyB0byBsb2FkIHRoZSB3c2RsRGVmaW5pdGlvbiBoZXJlLgotCi0gICAgICAgICAgICAgICAgICAgIC8vTGV0IHNlZSBpZiB3ZSBjYW4gZ2V0IHdzZGwgZGVmaW5pdGlvbiBmcm9tIGVuZHBvaW50IEBXZWJTZXJ2aWNlIGFubm90YXRpb24uCi0gICAgICAgICAgICAgICAgICAgIGlmIChlZCBpbnN0YW5jZW9mIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSllZCkuZ2V0QW5ub1dlYlNlcnZpY2VXU0RMTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uID0gZ2V0V1NETERlZmluaXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL1NvIGF0IHRoaXMgcG9pbnQgZWl0aGVyIHdlIGdvdCB3c2RsIGRlZmluaXRpb24gZnJvbSBTZXJ2aWNlRGVzY3JpcHRpb24gKHdoaWNoIG1lYW5zIHdlIGFyZSBydW5uaW5nIHRoaXMgY29kZQotICAgICAgICAgICAgICAgIC8vb24gY2xpZW50IHNpZGUpIG9yIHdlIGdvdCBpdCBmcm9tIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uICh3aGljaCBtZWFucyB3ZSBhcmUgcnVubmluZyB0aGlzIGNvZGUgb24gc2VydmVyIHNpZGUpCi0gICAgICAgICAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2NoZW1hUmVhZGVyIHNyID0gbmV3IFNjaGVtYVJlYWRlckltcGwoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IHBrZ1NldCA9IHNyLnJlYWRQYWNrYWdlc0Zyb21TY2hlbWEod3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmFkZEFsbChwa2dTZXQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTY2hlbWFSZWFkZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gU2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHJldHVybiBTZXQgb2YgUGFja2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRyZWVTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucyhTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCkgewotICAgICAgICBUcmVlU2V0PFN0cmluZz4gc2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVuZHBvaW50RGVzY3MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEJ1aWxkIGEgc2V0IG9mIHBhY2thZ2VzIGZyb20gYWxsIG9mIHRoZSBlbmRwb2ludHMKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYzogZW5kcG9pbnREZXNjcykgewotICAgICAgICAgICAgICAgIHNldC5hZGRBbGwoZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoZW5kcG9pbnREZXNjLCBtc3JkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnREZXNjIEVuZHBvaW50RGVzY3JpcHRpb24KLSAgICAgKiBAcmV0dXJuIFNldCBvZiBQYWNrYWdlcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFRyZWVTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCkgewotICAgICAgICAKLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgU3RyaW5nIGltcGxDbGFzc05hbWUgPSBnZXRTZXJ2aWNlSW1wbENsYXNzTmFtZShlbmRwb2ludERlc2MpOwotICAgICAgICBpZiAoaW1wbENsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBjbHogPSBsb2FkQ2xhc3MoaW1wbENsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZihjbHogPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgY2x6ID0gbG9hZENsYXNzKGltcGxDbGFzc05hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNseiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkWG1sU2VlQWxzb1BhY2thZ2VzKGNseiwgbXNyZCwgc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucyhlbmRwb2ludERlc2MsIGVuZHBvaW50SW50ZXJmYWNlRGVzYywgc2V0LCBtc3JkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gU2V0IG9mIFBhY2thZ2VzCi0gICAgICogQHBhcmFtIG1zcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKAotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwKLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjLAotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCwKLSAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLSAgICAgICAgCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BEZXNjcyA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgLy8gSW5zcGVjdCB0aGUgQFhtbFNlZUFsc28gY2xhc3NlcyBvbiB0aGUgaW50ZXJmYWNlCi0gICAgICAgIGFkZFhtbFNlZUFsc29QYWNrYWdlcyhlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKSwgbXNyZCwgc2V0KTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBwYWNrYWdlcyBmcm9tIGFsbCBvZiB0aGUgb3BlcmF0aW9ucwotICAgICAgICBpZiAob3BEZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucyhlZCwgb3BEZXNjc1tpXSwgc2V0LCBtc3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIHRoZSBwYWNrYWdlIHNldCB3aXRoIHRoZSBwYWNrYWdlcyByZWZlcmVuY2VkIGJ5IHRoaXMgT3BlcmF0aW9uRGVzYwotICAgICAqCi0gICAgICogQHBhcmFtIG9wRGVzYyBPcGVyYXRpb25EZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBzZXQgICAgU2V0PFBhY2thZ2U+IHRoYXQgaXMgdXBkYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjLCBUcmVlU2V0PFN0cmluZz4gc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCkgewotCi0gICAgICAgIC8vIFdhbGsgdGhlIHBhcmFtZXRlciBpbmZvcm1hdGlvbgotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtZXRlckRlc2NzID0gb3BEZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBpZiAocGFyYW1ldGVyRGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJEZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldFBhY2thZ2VzRnJvbUFubm90YXRpb25zKHBhcmFtZXRlckRlc2NzW2ldLCBzZXQsIG1zcmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2FsayB0aGUgZmF1bHQgaW5mb3JtYXRpb24KLSAgICAgICAgRmF1bHREZXNjcmlwdGlvbltdIGZhdWx0RGVzY3MgPSBvcERlc2MuZ2V0RmF1bHREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgaWYgKGZhdWx0RGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdERlc2NzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoZWQsIGZhdWx0RGVzY3NbaV0sIHNldCwgbXNyZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHNvIGNvbnNpZGVyIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSB3cmFwcGVycwotICAgICAgICBTdHJpbmcgcGtnID0gZ2V0UGFja2FnZUZyb21DbGFzc05hbWUobXNyZC5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZShvcERlc2MpKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2UgZnJvbSBSZXF1ZXN0IFdyYXBwZXIgYW5ub3RhdGlvbiA9ICIgKyBwa2cpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwa2cgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICB9Ci0gICAgICAgIHBrZyA9IGdldFBhY2thZ2VGcm9tQ2xhc3NOYW1lKG1zcmQuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKG9wRGVzYykpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSBmcm9tIFJlc3BvbnNlIFdyYXBwZXIgYW5ub3RhdGlvbiA9ICIgKyBwa2cpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwa2cgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluYWxseSBjb25zaWRlciB0aGUgcmVzdWx0IHR5cGUKLSAgICAgICAgQ2xhc3MgY2xzID0gb3BEZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUoKTsKLSAgICAgICAgaWYgKGNscyAhPSBudWxsICYmIGNscyAhPSB2b2lkLmNsYXNzICYmIGNscyAhPSBWb2lkLmNsYXNzKSB7Ci0gICAgICAgICAgICBQYWNrYWdlIHJldHVyblR5cGVQa2cgPSBjbHMuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlIGZyb20gUmV0dXJuIFR5cGUgPSAiICsgcGtnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlUGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwa2cgPSByZXR1cm5UeXBlUGtnLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBzZXQuYWRkKHBrZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHBhY2thZ2Ugc2V0IHdpdGggdGhlIHBhY2thZ2VzIHJlZmVyZW5jZWQgYnkgdGhpcyBQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtRGVzYyBQYXJhbWV0ZXJEZXNjCi0gICAgICogQHBhcmFtIHNldCAgICAgICBTZXQ8UGFja2FnZT4gdGhhdCBpcyB1cGRhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQYWNrYWdlc0Zyb21Bbm5vdGF0aW9ucyhQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCkgewotCi0gICAgICAgIC8vIEdldCB0aGUgdHlwZSB0aGF0IGRlZmluZXMgdGhlIGFjdHVhbCBkYXRhLiAgKHRoaXMgaXMgbmV2ZXIgYSBob2xkZXIgKQotICAgICAgICBDbGFzcyBwYXJhbUNsYXNzID0gcGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKTsKLQotICAgICAgICBpZiAocGFyYW1DbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRUeXBlQW5kRWxlbWVudFBhY2thZ2VzKHBhcmFtQ2xhc3MsIHBhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1EZXNjLmdldFBhcnROYW1lKCksIHNldCwgbXNyZCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgcGFja2FnZSBzZXQgd2l0aCB0aGUgcGFja2FnZXMgcmVmZXJlbmNlZCBieSB0aGlzIEZhdWx0RGVzY3JpcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdERlc2MgRmF1bHREZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBzZXQgICAgICAgU2V0PFBhY2thZ2U+IHRoYXQgaXMgdXBkYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UGFja2FnZXNGcm9tQW5ub3RhdGlvbnMoRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZhdWx0RGVzYywgVHJlZVNldDxTdHJpbmc+IHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG1zcmQpIHsKLQotICAgICAgICBGYXVsdEJlYW5EZXNjIGZhdWx0QmVhbkRlc2MgPSBtc3JkLmdldEZhdWx0QmVhbkRlc2MoZmF1bHREZXNjKTsKLSAgICAgICAgaWYoZmF1bHRCZWFuRGVzYyA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZhdWx0QmVhbkRlc2MgZnJvbSBNYXJzaGFsbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9OTyBGYXVsdEJlYW5EZXNjIGZvdW5kIG5vdGhpbmcgd2UgY2FuIGRvLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBmYXVsdEJlYW5OYW1lID0gZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5DbGFzc05hbWUoKTsKLSAgICAgICAgaWYoZmF1bHRCZWFuTmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZhdWx0QmVhbk5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9XZSBjYW5ub3QgbG9hZCB0aGUgZmF1bHRCZWFuTmFtZQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzIGZhdWx0QmVhbiA9IGxvYWRDbGFzcyhmYXVsdEJlYW5OYW1lKTsKLSAgICAgICAgaWYoZmF1bHRCZWFuID09IG51bGwpewotICAgICAgICAgICAgZmF1bHRCZWFuID0gbG9hZENsYXNzKGZhdWx0QmVhbk5hbWUsIGVkLmdldEF4aXNTZXJ2aWNlKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhdWx0QmVhbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRUeXBlQW5kRWxlbWVudFBhY2thZ2VzKGZhdWx0QmVhbiwgZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5OYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5Mb2NhbE5hbWUoKSwgc2V0LCBtc3JkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBlYWNoIGRhdGEgZWxlbWVudCwgd2UgbmVlZCB0aGUgcGFja2FnZSBmb3IgYm90aCB0aGUgZWxlbWVudCBhbmQgaXRzIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzICAgICAgIENsYXNzIHJlcHJlc2VudGluZyBlbGVtZW50LCB0eXBlIG9yIGJvdGgKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50Ci0gICAgICogQHBhcmFtIGxvY2FsUGFydCBvZiB0aGUgZWxlbWVudAotICAgICAqIEBwYXJhbSBzZXQgICAgICAgd2l0aCBib3RoIHR5cGUgYW5kIGVsZW1lbnQgcGFja2FnZXMgc2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRUeXBlQW5kRWxlbWVudFBhY2thZ2VzKENsYXNzIGNscywgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCkgewotCi0gICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBhbmQgdHlwZSBjbGFzc2VzCi0gICAgICAgIENsYXNzIGVDbGFzcyA9IGdldEVsZW1lbnQoY2xzLCBtc3JkKTsKLSAgICAgICAgQ2xhc3MgdENsYXNzID0gZ2V0VHlwZShjbHMpOwotCi0gICAgICAgIC8vIFNldCB0aGUgcGFja2FnZSBmb3IgdGhlIHR5cGUKLSAgICAgICAgaWYgKHRDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQYWNrYWdlIHR5cGVQa2cgPSB0Q2xhc3MuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgLy9Gb3IgcHJpbWl0aXZlIHR5cGVzIHRoZXJlIGlzIG5vIHBhY2thZ2UKLSAgICAgICAgICAgIFN0cmluZyBwa2cgPSAodHlwZVBrZyAhPSBudWxsKSA/IHR5cGVQa2cuZ2V0TmFtZSgpIDogbnVsbDsKLQotICAgICAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChwa2cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRkWG1sU2VlQWxzb1BhY2thZ2VzKHRDbGFzcywgbXNyZCwgc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB0aGUgcGFja2FnZSBmb3IgdGhlIGVsZW1lbnQKLSAgICAgICAgaWYgKHRDbGFzcyAhPSBlQ2xhc3MpIHsKLSAgICAgICAgICAgIGlmIChlQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEEgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2UgaW5kaWNhdGVzIHRoYXQgdGhlIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAvLyB1bnF1YWxpZmllZC4gIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgcmVwcmVzZW50ZWQgYXMgYSBjaGlsZCBlbGVtZW50IAotICAgICAgICAgICAgICAgIC8vIGluIGRvYy9saXQgd3JhcHBlZC4gIFRoZSBwYWNrYWdlIGlzIGRldGVybWluZWQgZnJvbSB0aGUgd3JhcHBlciBlbGVtZW50IGluIHN1Y2ggY2Fzc2VzLgotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCAmJiBuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IG5hbWVzcGFjZSB0byBwYWNrYWdlIGFsZ29yaXRobQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gbWFrZVBhY2thZ2UobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHBrZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFBhY2thZ2UgZWxlbWVudFBrZyA9IGVDbGFzcy5nZXRQYWNrYWdlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9IChlbGVtZW50UGtnICE9IG51bGwpID8gZWxlbWVudFBrZy5nZXROYW1lKCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGlmIChwa2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHBrZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZFhtbFNlZUFsc29QYWNrYWdlcyh0Q2xhc3MsIG1zcmQsIHNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiBjbHMgcmVwcmVzZW50cyBhbiB4bWwgZWxlbWVudCB0aGVuIGNscyBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIG51bGwgaXMgcmV0dXJuZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MKLSAgICAgKiBAcmV0dXJuIENsYXNzIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRFbGVtZW50KENsYXNzIGNscywgTWFyc2hhbFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXNyZCkgewotICAgICAgICBBbm5vdGF0aW9uRGVzYyBhbm5vdGF0aW9uRGVzYyA9IG1zcmQuZ2V0QW5ub3RhdGlvbkRlc2MoY2xzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25EZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbgotICAgICAgICAgICAgYW5ub3RhdGlvbkRlc2MgPSBBbm5vdGF0aW9uRGVzY0ltcGwuY3JlYXRlKGNscyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFubm90YXRpb25EZXNjLmhhc1htbFJvb3RFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBjbHM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3NbXSBub0NsYXNzID0gbmV3IENsYXNzW10geyB9OwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNscwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRUeXBlKENsYXNzIGNscykgewotICAgICAgICBpZiAoSkFYQkVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCBtID0gY2xzLmdldE1ldGhvZCgiZ2V0VmFsdWUiLCBub0NsYXNzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbS5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbm5vdCBmaW5kIEpBWEJFbGVtZW50LmdldFZhbHVlIG1ldGhvZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBOYW1lc3BhY2UgdG8gUGFja2FnZSBhbGdvcml0aG0KLSAgICAgKgotICAgICAqIEBwYXJhbSBucwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVBhY2thZ2UoU3RyaW5nIG5zKSB7Ci0gICAgICAgIFN0cmluZyBwa2dOYW1lID0gSmF2YVV0aWxzLmdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKG5zKTsKLSAgICAgICAgcmV0dXJuIHBrZ05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBwYWNrYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xhc3MgbmFtZS4gIFRoZSBjbGFzc05hbWUgbWF5IG5vdCBiZSBzcGVjaWZpZWQgKGluCi0gICAgICogd2hpY2ggY2FzZSBhIG51bGwgUGFja2FnZSBpcyByZXR1cm5lZCkuIGlmIGNsYXNzIGhhcyB1bm5hbWVkIHBhY2thZ2UgcmV0dXJuICIiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFN0cmluZyAobWF5IGJlIG51bGwgb3IgZW1wdHkpCi0gICAgICogQHJldHVybiBQYWNrYWdlIG9yIG51bGwgaWYgcHJvYmxlbXMgb2NjdXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21DbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBDbGFzcyBjbHogPSBsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgU3RyaW5nIHBrZyA9Ci0gICAgICAgICAgICAgICAgKGNseiA9PSBudWxsKSA/IG51bGwgOiAoY2x6LmdldFBhY2thZ2UoKSA9PSBudWxsKSA/ICIiIDogY2x6LmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0gICAgICAgIHJldHVybiBwa2c7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRYbWxTZWVBbHNvUGFja2FnZXMoQ2xhc3MgY2x6LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJzaGFsU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBtc3JkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlU2V0PFN0cmluZz4gc2V0KSB7Ci0gICAgICAgIGlmIChjbHogIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvbkRlc2MgYURlc2MgPSBtc3JkLmdldEFubm90YXRpb25EZXNjKGNseik7Ci0gICAgICAgICAgICBpZiAoYURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzW10gc2VlQWxzbyA9IGFEZXNjLmdldFhtbFNlZUFsc29DbGFzc2VzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlZUFsc28gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8c2VlQWxzby5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBrZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZUFsc29baV0gPT0gbnVsbCkgPyBudWxsIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWVBbHNvW2ldLmdldFBhY2thZ2UoKSA9PSBudWxsKSA/ICIiIDogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVBbHNvW2ldLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHBrZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IGNsei5nZXRJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkWG1sU2VlQWxzb1BhY2thZ2VzKGludGVyZmFjZXNbaV0sIG1zcmQsIHNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gQ2xhc3MgKG9yIG51bGwgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgLy8gRG9uJ3QgbWFrZSB0aGlzIHB1YmxpYywgaXRzIGEgc2VjdXJpdHkgZXhwb3N1cmUKLSAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsIHx8IGNsYXNzTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ2xhc3MuZm9yTmFtZSBkb2VzIG5vdCBzdXBwb3J0IHByaW1pdGl2ZXMKLSAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNscyA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB0aGUgZXhjZXB0aW9uIGJlIHN3YWxsb3dlZCA/Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2VTZXRCdWlsZGVyIGNhbm5vdCBsb2FkIHRoZSBmb2xsb3dpbmcgY2xhc3M6IiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBDbGFzcyAob3IgbnVsbCBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0gICAgICAgIC8vIERvbid0IG1ha2UgdGhpcyBwdWJsaWMsIGl0cyBhIHNlY3VyaXR5IGV4cG9zdXJlCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENsYXNzLmZvck5hbWUgZG9lcyBub3Qgc3VwcG9ydCBwcmltaXRpdmVzCi0gICAgICAgICAgICBDbGFzcyBjbHMgPSBDbGFzc1V0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgbG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjbHM7Ci0gICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uLCBzbyBsZXRzIGNhdGNoIGV2ZXJ5dGhpbmcgdGhhdCBleHRlbmRzIFRocm93YWJsZQotICAgICAgICAgICAgLy9yYXRoZXIgdGhhbiBqdXN0IEV4Y2VwdGlvbi4KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHRoZSBleGNlcHRpb24gYmUgc3dhbGxvd2VkID8KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZVNldEJ1aWxkZXIgY2Fubm90IGxvYWQgdGhlIGZvbGxvd2luZyBjbGFzczoiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKFN0cmluZyB3c2RsTG9jKXsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsTG9jOwotICAgICAgICBpZiAod3NkbExvY2F0aW9uICE9IG51bGwgJiYgd3NkbExvY2F0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvblBhdGggPSBuZXcgRmlsZShiYXNlRGlyICtGaWxlLnNlcGFyYXRvcisgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBXU0RMIGZyb20gVVJMOiIgK3VybC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgdGVtcG9yYXJ5IHdzZGwgYW5kIHdlIHVzZSBpdCB0byBkaWcgaW50byB0aGUgc2NoZW1hcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGh1cyB0aGUgbWVtb3J5IGxpbWl0IGlzIHNldCB0byBmYWxzZS4gIEl0IHdpbGwgYmUgZGlzY2FyZGVkIGFmdGVyIGl0IGlzIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIFBhY2thZ2VTZXRCdWlsZGVyIGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMV3JhcHBlciB3c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCwgZmFsc2UsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3dhbGxvdyBhbmQgY29udGludWUKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gZ2V0dGluZyB3c2RsTG9jYXRpb246ICIgK2UuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJvdGVjdGVkIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsYXNzLmZvck5hbWUgZG9lcyBub3Qgc3VwcG9ydCBwcmltaXRpdmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gQ2xhc3NVdGlscy5nZXRQcmltaXRpdmVDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3Nsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gQ2xhc3NMb2FkZXIgKi8KLSAgICBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldCB0aGUgU2VyaXZjZSBJbXBsIENsYXNzIGJ5IGxvb2tpbmcgYXQgdGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGVuZHBvaW50RGVzY3JpcHRpb24KLSAgICAgKiBAcmV0dXJuIGNsYXNzIG5hbWUgb3IgbnVsbAotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlSW1wbENsYXNzTmFtZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChlbmRwb2ludERlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgaWYgKGFzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBhcy5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuU0VSVklDRV9DTEFTUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gaW1wbGVtZW50YXRpb24gY2xhc3MsIHdlIHNob3VsZCBub3QgZ28gYW55IGZ1cnRoZXIKLSAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKFN0cmluZylwYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvUHJvcGVydHlEZXNjcmlwdG9yTWFwQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvcnVudGltZS9kZXNjcmlwdGlvbi9tYXJzaGFsL2ltcGwvUHJvcGVydHlEZXNjcmlwdG9yTWFwQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU5ZDRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3J1bnRpbWUvZGVzY3JpcHRpb24vbWFyc2hhbC9pbXBsL1Byb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5tYXJzaGFsLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJ1bnRpbWUuZGVzY3JpcHRpb24ubWFyc2hhbC5GYXVsdEJlYW5EZXNjOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5YTUxSb290RWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogV2Fsa3MgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBhbmQgaXRzIGNoaWxkICpEZXNjcmlwdGlvbiBjbGFzc2VzIHRvIGZpbmQgYWxsIG9mIHRoZSB0eXBlcy4gIEFuCi0gKiBBbm5vdGF0aW9uRGVzYyBpcyBidWlsdCBmb3IgZWFjaCBvZiB0aGUgdHlwZXMKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb3BlcnR5RGVzY3JpcHRvck1hcEJ1aWxkZXIuY2xhc3MpOwotCi0KLSAgICAvKiogVGhpcyBpcyBhIHN0YXRpYyB1dGlsaXR5IGNsYXNzLiAgVGhlIGNvbnN0cnVjdG9yIGlzIGludGVudGlvbmFsbHkgcHJpdmF0ZSAqLwotICAgIHByaXZhdGUgUHJvcGVydHlEZXNjcmlwdG9yTWFwQnVpbGRlcigpIHsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gU2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIGFwICAgICAgICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZCB0aGUgYXJ0aWZhY3QgY2xhc3NlcwotICAgICAqIEByZXR1cm4gUHJvcGVydHlEZXNjcmlwdG9yIE1hcAotICAgICAqLwotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gU2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIGFwIEFydGlmYWN0UHJvY2Vzc29yIHdoaWNoIGZvdW5kIHRoZSBhcnRpZmFjdCBjbGFzc2VzCi0gICAgICogQHJldHVybiBQcm9wZXJ0eURlc2NyaXB0b3IgTWFwCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXA8Q2xhc3MsTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+IGdldFByb3BlcnR5RGVzY01hcHMoCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MsCi0gICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciBhcCkgewotICAgICAgICBNYXA8Q2xhc3MsTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+IG1hcCA9IG5ldyBIYXNoTWFwPENsYXNzLE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PigpOwotICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVuZHBvaW50RGVzY3MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEJ1aWxkIGEgc2V0IG9mIHBhY2thZ2VzIGZyb20gYWxsIG9mIHRoZSBlbmRwb2ludHMKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzY3MgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVkOmVuZHBvaW50RGVzY3MpIHsKLSAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eURlc2NNYXBzKGVkLCBhcCwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnREZXNjCi0gICAgICogQHBhcmFtIGFwICAgICAgICAgICBBcnRpZmFjdFByb2Nlc3NvciB3aGljaCBmb3VuZCB0aGUgYXJ0aWZhY3QgY2xhc3NlcwotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFByb3BlcnR5RGVzY01hcHMoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBtYXApIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0UHJvcGVydHlEZXNjTWFwcyhlbmRwb2ludERlc2MsIGVuZHBvaW50SW50ZXJmYWNlRGVzYywgYXAsIG1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBlbmRwb2ludEludGVyZmFjZURlc2MKLSAgICAgKiBAcGFyYW0gYXAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIHdoaWNoIGZvdW5kIHRoZSBhcnRpZmFjdCBjbGFzc2VzCi0gICAgICogQHBhcmFtIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UHJvcGVydHlEZXNjTWFwcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBtYXApIHsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcERlc2NzID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbnMoKTsKLQotICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBwYWNrYWdlcyBmcm9tIGFsbCBvZiB0aGUgb3BlcnRpb25zCi0gICAgICAgIGlmIChvcERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BEZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldFByb3BlcnR5RGVzY01hcHMoZW5kcG9pbnREZXNjLCBvcERlc2NzW2ldLCBhcCwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wRGVzYwotICAgICAqIEBwYXJhbSBtYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldFByb3BlcnR5RGVzY01hcHMoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3RQcm9jZXNzb3IgYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzcywgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4+IG1hcCkgewotCi0gICAgICAgIC8vIFdhbGsgdGhlIGZhdWx0IGluZm9ybWF0aW9uCi0gICAgICAgIEZhdWx0RGVzY3JpcHRpb25bXSBmYXVsdERlc2NzID0gb3BEZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGlmIChmYXVsdERlc2NzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHREZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGdldFByb3BlcnR5RGVzY01hcHMoZW5kcG9pbnREZXNjLCBmYXVsdERlc2NzW2ldLCBhcCwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsc28gY29uc2lkZXIgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHdyYXBwZXJzCi0gICAgICAgIFN0cmluZyB3cmFwcGVyTmFtZSA9IGFwLmdldFJlcXVlc3RXcmFwcGVyTWFwKCkuZ2V0KG9wRGVzYyk7Ci0gICAgICAgIGlmICh3cmFwcGVyTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRQcm9wZXJ0eURlc2MoZW5kcG9pbnREZXNjLCB3cmFwcGVyTmFtZSwgbWFwKTsKLSAgICAgICAgfQotICAgICAgICB3cmFwcGVyTmFtZSA9IGFwLmdldFJlc3BvbnNlV3JhcHBlck1hcCgpLmdldChvcERlc2MpOwotICAgICAgICBpZiAod3JhcHBlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUHJvcGVydHlEZXNjKGVuZHBvaW50RGVzYywgd3JhcHBlck5hbWUsIG1hcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3BEZXNjCi0gICAgICogQHBhcmFtIG1hcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0UHJvcGVydHlEZXNjTWFwcyhFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0UHJvY2Vzc29yIGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBtYXApIHsKLSAgICAgICAgLy8gVE9ETyBUaGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIGxlZ2FjeSBleGNlcHRpb25zIGFuZCB0aGUgY29ycmVzcG9uZGluZyBmYXVsdCBiZWFucyBjb3VsZCBiZSBjYWNoZWQgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgU3RyaW5nIGZhdWx0RGVzY0V4Y2VwdGlvbk5hbWUgPSBmYXVsdERlc2MuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCk7Ci0gICAgICAgIENsYXNzIGZhdWx0RGVzY0V4Y2VwdGlvbiA9IGxvYWRDbGFzcyhmYXVsdERlc2NFeGNlcHRpb25OYW1lKTsKLSAgICAgICAgaWYgKGZhdWx0RGVzY0V4Y2VwdGlvbiAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKGZhdWx0RGVzYy5nZXRGYXVsdEluZm8oKSA9PSBudWxsIHx8IGZhdWx0RGVzYy5nZXRGYXVsdEluZm8oKS5sZW5ndGgoKSA9PSAwKSkgewotCi0gICAgICAgICAgICAvLyBGb3IgbGVnYWN5IGV4Y2VwdGlvbnMsIHRoZSBmYXVsdCBiZWFuIGlzIGEgIndyYXBwZXIgY2xhc3MiIHRoYXQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMKLSAgICAgICAgICAgIC8vIGFzIHRoZSBleGNlcHRpb24uICBUbyBtYXJzaGFsIGFuIGV4Y2VwdGlvbjoKLSAgICAgICAgICAgIC8vICAgIDEpIHRoZSB2YWx1ZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGxlZ2FjeSBleGNlcHRpb24gKHVzaW5nIHRoZSBleGNlcHRpb24ncyBwcm9wZXJ0eSBkZXNjIG1hcCkKLSAgICAgICAgICAgIC8vICAgIDIpIHRoZSB2YWx1ZXMgYXJlIHBsYWNlZCBvbiB0aGUgZmF1bHQgYmVhbiAodXNpbmcgdGhlIGJlYW4ncyBwcm9wZXJ0eSBkZXNjIG1hcCkKLSAgICAgICAgICAgIC8vICAgIDMpIHRoZSBiZWFuIGlzIG1hcnNoYWxsZWQuCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIFVubWFyc2hhbGxpbmcgaXMgb3V0c2lkZSB0aGUgc3BlYywgYnV0IHdlIGRvIHByb3ZpZGUgcHJvcHJpZXRhcnkgc3VwcG9ydC4KLSAgICAgICAgICAgIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzaWNhbGx5Ci0gICAgICAgICAgICAvLyAgICAxKSB1bm1hcnNoYWxsIGludG8gdGhlIGZhdWx0IGJlYW4KLSAgICAgICAgICAgIC8vICAgIDIpIHRoZSB2YWx1ZXMgb24gdGhlIGZhdWx0IGJlYW4gYXJlIG9idGFpbmVkICh1c2luZyB0aGUgYmVhbidzIHByb3BlcnR5IGRlc2MgbWFwKQotICAgICAgICAgICAgLy8gICAgMykgdXNlIGhldXJpc3RpY3MgdG8gZmluZCBhIG1hdGNoaW5nIGNvbnN0cnVjdG9yIG9uIHRoZSBleGNlcHRpb24gY2xhc3MuICBJZiBmb3VuZCBpdCBpcyBpbnN0YW50aWF0ZWQuCi0KLSAgICAgICAgICAgIC8vIFRvIGFjY29tcGxpc2ggdGhlIGFib3ZlIG1hcnNoYWxsaW5nIGFuZCB1bm1hcnNoYWxsaW5nIHdlIG5lZWQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgbWFwcwotICAgICAgICAgICAgLy8gZm9yIHRoZSBleGNlcHRpb24gYW5kIHRoZSBiZWFuLgotICAgICAgICAgICAgRmF1bHRCZWFuRGVzYyBmYXVsdEJlYW5EZXNjID0gYXAuZ2V0RmF1bHRCZWFuRGVzY01hcCgpLmdldChmYXVsdERlc2MpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0RGVzY0JlYW5OYW1lID0gZmF1bHRCZWFuRGVzYy5nZXRGYXVsdEJlYW5DbGFzc05hbWUoKTsKLSAgICAgICAgICAgIENsYXNzIGZhdWx0RGVzY0JlYW4gPSBsb2FkQ2xhc3MoZmF1bHREZXNjQmVhbk5hbWUpOwotICAgICAgICAgICAgaWYgKGZhdWx0RGVzY0JlYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5RGVzYyhlbmRwb2ludERlc2MsIGZhdWx0RGVzY0JlYW5OYW1lLCBtYXApOwotICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5RGVzYyhlbmRwb2ludERlc2MsIGZhdWx0RGVzY0V4Y2VwdGlvbk5hbWUsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUHJvcGVydHlEZXNjKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q2xhc3MsIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+PiBtYXApIHsKLQotICAgICAgICBDbGFzcyBjbHMgPSBsb2FkQ2xhc3MoY2xzTmFtZSk7Ci0gICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xzID0gbG9hZENsYXNzKGNsc05hbWUsIGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hcC5nZXQoY2xzKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJvb3RFbGVtZW50VXRpbC5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAoY2xzKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KGNscywgcGRNYXApOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lCi0gICAgICogQHJldHVybiBDbGFzcyAob3IgbnVsbCBpZiB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICAvLyBEb24ndCBtYWtlIHRoaXMgcHVibGljLCBpdHMgYSBzZWN1cml0eSBleHBvc3VyZQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBmb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAvL3JhdGhlciB0aGFuIGp1c3QgRXhjZXB0aW9uLgotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgdGhlIGV4Y2VwdGlvbiBiZSBzd2FsbG93ZWQgPwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYWNrYWdlU2V0QnVpbGRlciBjYW5ub3QgbG9hZCB0aGUgZm9sbG93aW5nIGNsYXNzOiIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4gQ2xhc3MgKG9yIG51bGwgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgICAgIC8vIERvbid0IG1ha2UgdGhpcyBwdWJsaWMsIGl0cyBhIHNlY3VyaXR5IGV4cG9zdXJlCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCB8fCBjbGFzc05hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgcmV0dXJuIGZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wpOwotICAgICAgICAgICAgLy9DYXRjaCBUaHJvd2FibGUgYXMgQ2xhc3NMb2FkZXIgY2FuIHRocm93IGFuIE5vQ2xhc3NEZWZGb3VuZEVycm9yIHRoYXQKLSAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbiwgc28gbGV0cyBjYXRjaCBldmVyeXRoaW5nIHRoYXQgZXh0ZW5kcyBUaHJvd2FibGUKLSAgICAgICAgICAgIC8vcmF0aGVyIHRoYW4ganVzdCBFeGNlcHRpb24uCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB0aGUgZXhjZXB0aW9uIGJlIHN3YWxsb3dlZCA/Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2VTZXRCdWlsZGVyIGNhbm5vdCBsb2FkIHRoZSBmb2xsb3dpbmcgY2xhc3M6IiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByb3RlY3RlZCBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcylBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGFzcy5mb3JOYW1lIGRvZXMgbm90IHN1cHBvcnQgcHJpbWl0aXZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IENsYXNzVXRpbHMuZ2V0UHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcgotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludENhbGxiYWNrLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkzNTVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVyQ2hhaW5Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2tlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlckludm9rZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5NZXNzYWdlVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRDYWxsYmFjayB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnRDYWxsYmFjay5jbGFzcyk7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXNwb25zZShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgew0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNc2dDdHggPSBlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXNwb25zZU1zZ0N0eCA9DQotICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpbnZva2VPdXRib3VuZEhhbmRsZXJGbG93KGVpYyk7DQotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeShlaWMpOw0KLSAgICAgICAgICAgIE1lc3NhZ2VVdGlscy5wdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dChyZXNwb25zZU1zZ0N0eC5nZXRNZXNzYWdlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCk7DQotDQotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcEN0eCA9IGF4aXNSZXNwb25zZU1zZ0N0eC5nZXRPcGVyYXRpb25Db250ZXh0KCk7DQotICAgICAgICAgICAgb3BDdHguYWRkTWVzc2FnZUNvbnRleHQoYXhpc1Jlc3BvbnNlTXNnQ3R4KTsgICAgICAgICAgICANCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgb24gdGhlIHVsdGltYXRlIGV4ZWN1dGlvbiB0aHJlYWQNCi0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCk7DQotICAgIA0KLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBBeGlzRW5naW5lIGZvciB0aGUgcmVwb25zZSBhbmQgc2VuZCBpdC4NCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIGFzeW5jIHJlc3BvbnNlLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBBeGlzRW5naW5lLnNlbmQoYXhpc1Jlc3BvbnNlTXNnQ3R4KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvL1RoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBvbiB0aGUgdWx0aW1hdGUgZXhlY3V0aW9uIHRocmVhZA0KLSAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwucGVyZm9ybUNvbnRleHRDbGVhbnVwKENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gc2VuZCB0aGUgYXN5bmMgcmVzcG9uc2UuIik7DQotICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFRocm93YWJsZSBmYXVsdE1lc3NhZ2UgPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbih0LCBlaWMpOw0KLSAgICAgICAgICAgIGlmKGZhdWx0TWVzc2FnZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHQgPSBmYXVsdE1lc3NhZ2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkuc2V0Q2F1c2VkQnlFeGNlcHRpb24oQXhpc0ZhdWx0Lm1ha2VGYXVsdCh0KSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtVGhyZWFkQ2xlYW51cChDb25zdGFudHMuVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwNCi0gICAgICAgICAgICAgICAgZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBGSVhNRSAoTkxHKTogVGhpcyBpcyBwcm9iYWJseSBub3QgcmlnaHQNCi0gICAgICAgICAgICBoYW5kbGVGYXVsdFJlc3BvbnNlKGVpYyk7DQotICAgICAgICB9IA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVGYXVsdFJlc3BvbnNlKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1zZ0N0eCA9IGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc1Jlc3BvbnNlTXNnQ3R4ID0NCi0gICAgICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeShlaWMpOw0KLSAgICAgICAgICAgIE1lc3NhZ2VVdGlscy5wdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dChyZXNwb25zZU1zZ0N0eC5nZXRNZXNzYWdlKCksDQotICAgICAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCk7DQotDQotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcEN0eCA9IGF4aXNSZXNwb25zZU1zZ0N0eC5nZXRPcGVyYXRpb25Db250ZXh0KCk7DQotICAgICAgICAgICAgb3BDdHguYWRkTWVzc2FnZUNvbnRleHQoYXhpc1Jlc3BvbnNlTXNnQ3R4KTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1UaHJlYWRDbGVhbnVwKENvbnN0YW50cy5USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELA0KLSAgICAgICAgICAgICAgICBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSBBeGlzRW5naW5lIGZvciB0aGUgcmVwb25zZSBhbmQgc2VuZCBpdC4NCi0gICAgICAgICAgICBBeGlzRW5naW5lLnNlbmRGYXVsdChheGlzUmVzcG9uc2VNc2dDdHgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBUaHJvd2FibGUgZmF1bHRNZXNzYWdlID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24odCwgZWljKTsNCi0gICAgICAgICAgICBpZihmYXVsdE1lc3NhZ2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0ID0gZmF1bHRNZXNzYWdlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKEF4aXNGYXVsdC5tYWtlRmF1bHQodCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKiogDQotICAgICAqIFRoaXMgd2lsbCBjYWxsIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXIgaW5zdGFuY2VzIHRoYXQgd2VyZSBjYWxsZWQgZHVyaW5nDQotICAgICAqIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgZm9yIHRoaXMgbWVzc2FnZS4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHJlc3BvbnNlUmVhZHkoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpICB7DQotICAgICAgICBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gZWljLmdldEludm9jYXRpb25MaXN0ZW5lcnMoKTsNCi0gICAgICAgIGlmKGxpc3RlbmVyTGlzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgSW52b2NhdGlvbkxpc3RlbmVyQmVhbiBiZWFuID0gbmV3IEludm9jYXRpb25MaXN0ZW5lckJlYW4oZWljLCBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuLlN0YXRlLlJFU1BPTlNFKTsNCi0gICAgICAgICAgICBmb3IoSW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJMaXN0KSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5ub3RpZnkoYmVhbik7IA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgaW52b2NhdGlvbiBvZiB0aGUgb3V0Ym91bmQgSkFYLVdTDQotICAgICAqIGFwcGxpY2F0aW9uIGhhbmRsZXIgZmxvdy4NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGludm9rZU91dGJvdW5kSGFuZGxlckZsb3coRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIEludm9rZSB0aGUgb3V0Ym91bmQgcmVzcG9uc2UgaGFuZGxlcnMuDQotICAgICAgICAgICAgLy8gV2UgY2FuIGJlIHN1cmUgd2UgbmVlZCB0byBpbnZva2UgYW55IGhhbmRsZXJzIGJlY2F1c2UgdGhpcw0KLSAgICAgICAgICAgIC8vIGNhbm5vdCBiZSBhIG9uZS13YXkgZmxvdw0KLSAgICAgICAgICAgIHJlc3BvbnNlLnNldE1FUENvbnRleHQocmVxdWVzdC5nZXRNRVBDb250ZXh0KCkpOw0KLSAgICAgICAgICAgIEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBoaUNvbnRleHQgPSBFbmRwb2ludENvbnRyb2xsZXIuYnVpbGRIYW5kbGVySW52b2NhdGlvbkNvbnRleHQoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWMuZ2V0SGFuZGxlcnMoKSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVTUE9OU0UsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsNCi0gICAgICAgICAgICBIYW5kbGVySW52b2tlckZhY3RvcnkgaGlGYWN0b3J5ID0gKEhhbmRsZXJJbnZva2VyRmFjdG9yeSkgDQotICAgICAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEhhbmRsZXJJbnZva2VyRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICAgICAgSGFuZGxlckludm9rZXIgaGFuZGxlckludm9rZXIgPSBoaUZhY3RvcnkuY3JlYXRlSGFuZGxlckludm9rZXIocmVzcG9uc2UpOw0KLSAgICAgICAgICAgIGhhbmRsZXJJbnZva2VyLmludm9rZU91dGJvdW5kSGFuZGxlcnMoaGlDb250ZXh0KTsNCi0gICAgICAgIH0gDQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludENvbnRyb2xsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxNzI5NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLnV0aWwuTWVzc2FnZUNvbnRleHRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLkhhbmRsZXJDaGFpblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlckludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5IYW5kbGVySW52b2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5mYWN0b3J5LkhhbmRsZXJJbnZva2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIubGlmZWN5Y2xlLmZhY3RvcnkuSGFuZGxlckxpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmxpZmVjeWNsZS5mYWN0b3J5LkhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuRW5kcG9pbnREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuUHJvdmlkZXJEaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuZmFjdG9yeS5FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoZSBFbmRwb2ludENvbnRyb2xsZXIgaXMgdGhlIHNlcnZlciBzaWRlIGVxdWl2YWxlbnQgdG8gdGhlIEludm9jYXRpb25Db250cm9sbGVyIG9uIHRoZSBjbGllbnQKLSAqIHNpZGUuICBJdCBpcyBhbiBhYnN0cmFjdGlvbiBvZiB0aGUgc2VydmVyIHNpZGUgZW5kcG9pbnQgaW52b2NhdGlvbiB0aGF0IGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlCi0gKiBBeGlzMiBzZW1hbnRpY3MuCi0gKiA8cC8+Ci0gKiBMaWtlIHRoZSBJbnZvY2F0aW9uQ29udHJvbGxlciwgdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgdGhlIEpBWC1XUyBhcHBsaWNhdGlvbgotICogaGFuZGxlciBjaGFpbiBhbG9uZyB3aXRoIHRha2luZyBhbGwgb2YgdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uIGFuZCBzZXR0aW5nIHVwIHdoYXQncyBuZWVkZWQgdG8KLSAqIHBlcmZvcm0gdGhlIGFjdHVhbCBpbnZvY2F0aW9uIG9mIHRoZSBlbmRwb2ludC4KLSAqLwotcHVibGljIGNsYXNzIEVuZHBvaW50Q29udHJvbGxlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnRDb250cm9sbGVyLmNsYXNzKTsKLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzdGFydCB0aGUgSkFYLVdTIGludm9jYXRpb24gb2YgYSB0YXJnZXQgZW5kcG9pbnQuIEl0IHRha2VzIGFuCi0gICAgICogSW52b2NhdGlvbkNvbnRleHQsIHdoaWNoIG11c3QgaGF2ZSBhIE1lc3NhZ2VDb250ZXh0IHNwZWNpZWQgZm9yIHRoZSByZXF1ZXN0LiAgT25jZSB0aGUKLSAgICAgKiBpbnZvY2F0aW9uIGlzIGNvbXBsZXRlLCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBzdG9yZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWljCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGludm9rZShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgdGhyb3dzIEF4aXNGYXVsdCwgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IHN5bmNocm9ub3VzIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gZ29vZCA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnb29kID0gaGFuZGxlUmVxdWVzdChlaWMpOwotCi0gICAgICAgICAgICBpZiAoIWdvb2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWljOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICAgICAgRW5kcG9pbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBlaWMuZ2V0RGlzcGF0Y2hlcigpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCAmJiBkaXNwYXRjaGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoZXIuaW52b2tlKHJlcXVlc3QpOyAgICAKLSAgICAgICAgICAgICAgICBlaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludm9rZUVyciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICB0aHJvdyBhZjsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0b0JlVGhyb3duID0gSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24oZSwgZWljKTsKLSAgICAgICAgICAgIGlmKHRvQmVUaHJvd24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRvQmVUaHJvd24gPSBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0b0JlVGhyb3duKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChnb29kKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGFzc2VkIHBpdm90IHBvaW50Ci0gICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRNZXNzYWdlKCkuc2V0UG9zdFBpdm90KCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UoZWljKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzdHJveUhhbmRsZXJzKGVpYywgcmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBlaWM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGludm9rZUFzeW5jKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IGFzeW5jaHJvbm91cyIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiBnb29kID0gaGFuZGxlUmVxdWVzdChlaWMpOwotCi0gICAgICAgICAgICBpZiAoIWdvb2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRwb2ludERpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IGVpYy5nZXREaXNwYXRjaGVyKCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsICYmIGRpc3BhdGNoZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoZXIuaW52b2tlQXN5bmMocmVxdWVzdCwgZWljLmdldENhbGxiYWNrKCkpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52b2tlRXJyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHRvQmVUaHJvd24gPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihlLCBlaWMpOwotICAgICAgICAgICAgaWYodG9CZVRocm93biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG9CZVRocm93biA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHRvQmVUaHJvd24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRklYTUUgKE5MRyk6IFByb2JhYmx5IG5lZWQgdG8gcmV2aXNpdCB0aGlzIGxvY2F0aW9uLiAgU2hvdWxkIGl0IGJlIG1vdmVkIGRvd24/Ci0gICAgICAgICAgICAvLyBQYXNzZWQgcGl2b3QgcG9pbnQKLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLnNldFBvc3RQaXZvdCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGludm9rZU9uZVdheShFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuOiBvbmUtd2F5Iik7Ci0gICAgICAgIH0KLSAgICAKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9vbGVhbiBnb29kID0gaGFuZGxlUmVxdWVzdChlaWMpOwotCi0gICAgICAgICAgICBpZiAoIWdvb2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRwb2ludERpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IGVpYy5nZXREaXNwYXRjaGVyKCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsICYmIGRpc3BhdGNoZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoZXIuaW52b2tlT25lV2F5KHJlcXVlc3QpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52b2tlRXJyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHRvQmVUaHJvd24gPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihlLCBlaWMpOwotICAgICAgICAgICAgaWYodG9CZVRocm93biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG9CZVRocm93biA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHRvQmVUaHJvd24pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gUGFzc2VkIHBpdm90IHBvaW50Ci0gICAgICAgICAgICByZXF1ZXN0LmdldE1lc3NhZ2UoKS5zZXRQb3N0UGl2b3QoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVSZXF1ZXN0KEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB0aHJvd3MgQXhpc0ZhdWx0LCBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ29udGV4dCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlcXVlc3RSZWNlaXZlZChlaWMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gZWljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlRW5kcG9pbnQgPSBnZXRTZXJ2aWNlSW1wbGVtZW50YXRpb24ocmVxdWVzdCk7Ci0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGdldEVuZHBvaW50RGVzY3JpcHRpb24ocmVxdWVzdCk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldEVuZHBvaW50RGVzY3JpcHRpb24oZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICAvLyAgVE9ETzogcmV2aWV3OiBtYWtlIHN1cmUgdGhlIGhhbmRsZXJzIGFyZSBzZXQgb24gdGhlIEludm9jYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAvLyAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYV1MgcnVudGltZSBkb2VzIG5vdCB1c2UgRW5kcG9pbnQsIHdoaWNoCi0gICAgICAgICAgICAvLyAgd291bGQgbm9ybWFsbHkgYmUgdGhlIHBsYWNlIHRvIGluaXRpYWxpemUgYW5kIHN0b3JlIHRoZSBoYW5kbGVyIGxpc3QuCi0gICAgICAgICAgICAvLyAgSW4gbGlldSBvZiB0aGF0LCB3ZSB3aWxsIGhhdmUgdG8gaW50aWFsaXplIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSAKLSAgICAgICAgICAgIC8vICBJbnZvY2F0aW9uQ29udGV4dC4gIGFsc28gc2VlIHRoZSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuICBPbiB0aGUgY2xpZW50Ci0gICAgICAgICAgICAvLyAgc2lkZSwgdGhlIGJpbmRpbmcgaXMgbm90IHlldCBzZXQgd2hlbiB3ZSBjYWxsIGludG8gdGhhdCBmYWN0b3J5LCBzbyB0aGUKLSAgICAgICAgICAgIC8vICBoYW5kbGVyIGxpc3QgZG9lc24ndCBnZXQgc2V0IG9uIHRoZSBJbnZvY2F0aW9uQ29udGV4dCBvYmplY3QgdGhlcmUuICBUaHVzCi0gICAgICAgICAgICAvLyAgd2UgZ290dGEgZG8gaXQgaGVyZS4KLSAgICAgICAgICAgIC8vICAKLSAgICAgICAgICAgIC8vICBTaW5jZSB3ZSdyZSBvbiB0aGUgc2VydmVyLCBhbmQgdGhlcmUgYXBwYXJlbnRseSBpcyBubyBCaW5kaW5nIG9iamVjdAotICAgICAgICAgICAgLy8gIGFueXdoZXJlIHRvIGJlIGZvdW5kLi4uCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlaWMuZ2V0SGFuZGxlcnMoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gaGFuZGxlcnMgZm91bmQgb24gdGhlIEludm9jYXRpb25Db250ZXh0LCBpbml0aWFsaXppbmcgaGFuZGxlciBsaXN0LiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhyaSA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgUG9ydEluZm8gcG9ydEluZm8gPSBlbmRwb2ludERlc2MuZ2V0UG9ydEluZm8oKTsKLSAgICAgICAgICAgICAgICBlaWMuc2V0SGFuZGxlcnMoaHJpLmdldEhhbmRsZXJDaGFpbihwb3J0SW5mbykpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJSb2xlcyA9IGhyaS5nZXRSb2xlcyhwb3J0SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vICBHZXQgdGhlIHNlcnZpY2UgaW5zdGFuY2UuICBUaGlzIHdpbGwgcnVuIHRoZSBAUG9zdENvbnN0cnVjdCBjb2RlLgotICAgICAgICAgICAgU2VydmljZUluc3RhbmNlRmFjdG9yeSBpbnN0YW5jZUZhY3RvcnkgPSAoU2VydmljZUluc3RhbmNlRmFjdG9yeSkgCi0gICAgICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU2VydmljZUluc3RhbmNlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gaW5zdGFuY2VGYWN0b3J5LmNyZWF0ZVNlcnZpY2VJbnN0YW5jZShyZXF1ZXN0LCBzZXJ2aWNlRW5kcG9pbnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgYXBwbGljYXRpb24gaGFuZGxlcnMgYW5kIGRpc3BhdGNoZXIgaW52b2tlIHdpbGwgCi0gICAgICAgICAgICAvLyBtb2RpZnkvZGVzdHJveSBwYXJ0cyBvZiB0aGUgbWVzc2FnZS4gIE1ha2Ugc3VyZSB0byBzYXZlCi0gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBtZXNzYWdlIGlmIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgc2F2ZVJlcXVlc3RNZXNzYWdlKHJlcXVlc3QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBQZXJmb3JtIGluYm91bmQgaGVhZGVyL2hhbmRsZXIgcHJvY2Vzc2luZyBvbmx5IGlmIHRoZXJlIGlzIGFyZSBoZWFkZXJzIE9SIGhhbmRsZXJzCi0gICAgICAgICAgICBpZiAoIChyZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRFbnZlbG9wZSgpLmdldEhlYWRlcigpICE9IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgIChlaWMuZ2V0SGFuZGxlcnMoKSAhPSBudWxsICYmICFlaWMuZ2V0SGFuZGxlcnMoKS5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IGluYm91bmRIZWFkZXJBbmRIYW5kbGVyUHJvY2Vzc2luZyhyZXF1ZXN0LCBlaWMsIGhhbmRsZXJSb2xlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSkFYLVdTIGluYm91bmQgaGFuZGxlciBjaGFpbiBpbnZvY2F0aW9uIGNvbXBsZXRlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGRpc3BhdGNoZXIuCi0gICAgICAgICAgICAgICAgRW5kcG9pbnREaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBnZXRFbmRwb2ludERpc3BhdGNoZXIocmVxdWVzdCwgc2VydmljZUVuZHBvaW50LCBzZXJ2aWNlSW5zdGFuY2UpOwotICAgICAgICAgICAgICAgIEJvb2xlYW4gaWdub3JlU09BUFZlcnNpb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgCWxvZy5kZWJ1ZygiQ2hlY2tpbmcgZm9yIFByb3ZpZGVyRGlzcGF0Y2hlciBpbnN0YW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkaXNwYXRjaGVyIGluc3RhbmNlb2YgUHJvdmlkZXJEaXNwYXRjaGVyKXsKLSAgICAgICAgICAgICAgICAJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgIAkJbG9nLmRlYnVnKCJQcm92aWRlckRpc3BhdGNoZXIgaW5zdGFuY2UgRm91bmQiKTsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIAlTdHJpbmcgYmluZGluZ1R5cGUgPSBlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKTsKLSAgICAgICAgICAgICAgICAJaWYoYmluZGluZ1R5cGUuZXF1YWxzKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKSl7Ci0gICAgICAgICAgICAgICAgCQlpZ25vcmVTT0FQVmVyc2lvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgCX0gICAKLSAgICAgICAgICAgICAgICAJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgIAkJbG9nLmRlYnVnKCJpZ25vcmVTT0FQVmVyc2lvbiBWYWx1ZSA9IitpZ25vcmVTT0FQVmVyc2lvbi5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9OZWVkIHRvIG1ha2Ugc3VyZSB0aGUgcHJvdG9jb2wgKGVudmVsb3BlIG5zKSAgb2YgdGhlIHJlcXVlc3QgbWF0Y2hlcyB0aGUgYmluZGluZwotICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIGJ5IHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVTT0FQVmVyc2lvbiAmJiAhVXRpbHMuYmluZGluZ1R5cGVzTWF0Y2gocmVxdWVzdCwgZW5kcG9pbnREZXNjKSkgewotICAgICAgICAgICAgICAgIAlQcm90b2NvbCBwcm90b2NvbCA9IHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCk7Ci0gICAgICAgICAgICAgICAgCU1lc3NhZ2VDb250ZXh0IGZhdWx0Q29udGV4dCA9IFV0aWxzLmNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UocmVxdWVzdCwgcHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIAllaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChmYXVsdENvbnRleHQpOwotICAgICAgICAgICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGVpYy5zZXRFbmRwb2ludERpc3BhdGNoZXIoZGlzcGF0Y2hlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyB0aGUgaW5ib3VuZCBoYW5kbGVyIGNoYWluIG11c3QgaGF2ZSBoYWQgYSBwcm9ibGVtLCBhbmQgd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkpBWC1XUyBpbmJvdW5kIGhhbmRsZXIgY2hhaW4gaW52b2NhdGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvcnMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dFV0aWxzLmNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgLy8gc2luY2Ugd2UndmUgcmV2ZXJzZWQgZGlyZWN0aW9ucywgdGhlIG1lc3NhZ2UgaGFzICJiZWNvbWUgYSByZXNwb25zZSBtZXNzYWdlIiAoc2VjdGlvbiA5LjMuMi4xLCBmb290bm90ZSBzdXBlcnNjcmlwdCAyKQotICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnQ29udGV4dC5zZXRNZXNzYWdlKHJlcXVlc3QuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBlaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZU1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlUmVhZHkoZWljKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgdGhyb3cgYWY7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGZvciBub3csIHRocm93IGl0LiAgV2UgcHJvYmFibHkgc2hvdWxkIHRyeSB0byBtYWtlIGFuIFhNTEZhdWx0IG9iamVjdCBhbmQgc2V0IGl0IG9uIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGluYm91bmQgSGFuZGxlciBhbmQgSGVhZGVyIHByb2Nlc3NpbmcKLSAgICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBtdXN0IHVuZGVyc3RhbmQgY2hlY2tpbmcgYW5kCi0gICAgICogaW52b2tpbmcgdGhlIGluYm91bmQgaGFuZGxlciBjaGFpbgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIGVpYwotICAgICAqIEBwYXJhbSBoYW5kbGVyUm9sZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5ib3VuZEhlYWRlckFuZEhhbmRsZXJQcm9jZXNzaW5nKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBoYW5kbGVyUm9sZXMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvL0xldHMgSW5pdGlhbGl6ZSB0aGUgdW5kZXJzdG9vZCBRTmFtZSBoZXJlLCBhZGQgb25seSB0aGUgaGVhZGVycyB0aGF0IHRoZSBoYW5kbGVyIAotICAgICAgICAvL2luamVjdHMgd2hlbiB3ZSBpbnZva2UgdGhlIGdldEhlYWRlcigpLgotICAgICAgICAvL1NpbmNlIHdlIGFyZSBhZGRpbmcgdGhlIGhhbmRsZXJzIHRvIGRlc2NyaXB0aW9uIGxheWVyIGhlcmUgd2Ugd2lsbCByZWdpc3RlciBhbGwgdGhlCi0gICAgICAgIC8vaGVhZGVycyBzZXQgYnkgU09BUEhhbmRsZXItPmdldEhlYWRlcigpLgotICAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZCA9Ci0gICAgICAgICAgICAgSGFuZGxlclV0aWxzLnJlZ2lzdGVyU09BUEhhbmRsZXJIZWFkZXJzKHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCksIGVpYy5nZXRIYW5kbGVycygpKTsKLQotICAgICAgICAvL0FzIHBlciBzZWN0aW9uIDEwLjIuMSBvZiBKQVhXUyBTcGVjaWZpY2F0aW9uLCBwZXJmb3JtIGEgbXVzdFVuZGVyc3RhbmQgcHJvY2Vzc2luZyBiZWZvcmUKLSAgICAgICAgLy9pbnZva2luZyBpbmJvdW5kIGhhbmRsZXJzLgotICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChyZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLCB1bmRlcnN0b29kLCBoYW5kbGVyUm9sZXMpOwotCi0gICAgICAgIC8vIEludm9rZSBpbmJvdW5kIGFwcGxpY2F0aW9uIGhhbmRsZXJzLiAgSXQncyBzYWZlIHRvIHVzZSB0aGUgZmlyc3Qgb2JqZWN0IG9uIHRoZSBpdGVyYXRvciBiZWNhdXNlIHRoZXJlIGlzCi0gICAgICAgIC8vIGFsd2F5cyBleGFjdGx5IG9uZSBFbmRwb2ludERlc2NyaXB0aW9uIG9uIGEgc2VydmVyIGludm9rZQotICAgICAgICBIYW5kbGVySW52b2NhdGlvbkNvbnRleHQgaGlDb250ZXh0ID0gYnVpbGRIYW5kbGVySW52b2NhdGlvbkNvbnRleHQocmVxdWVzdCwgZWljLmdldEhhbmRsZXJzKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPbmVXYXkocmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSkpOwotICAgICAgICBIYW5kbGVySW52b2tlckZhY3RvcnkgaGlGYWN0b3J5ID0gKEhhbmRsZXJJbnZva2VyRmFjdG9yeSkgCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEhhbmRsZXJJbnZva2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEhhbmRsZXJJbnZva2VyIGhhbmRsZXJJbnZva2VyID0gaGlGYWN0b3J5LmNyZWF0ZUhhbmRsZXJJbnZva2VyKHJlcXVlc3QpOwotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBoYW5kbGVySW52b2tlci5pbnZva2VJbmJvdW5kSGFuZGxlcnMoaGlDb250ZXh0KTsKLQotICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGhhbmRsZVJlc3BvbnNlKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBlaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gZWljLmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgCS8vQmVmb3JlIHJ1bm5pbmcgaW5ib3VuZCBoYW5kbGVycyBsZXRzIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBoYXZlIG5vIHByb3RvY29sIG1pc21hdGNoLgotICAgICAgICAgICAgCUVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID1yZXF1ZXN0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIAlTdHJpbmcgYmluZGluZ1R5cGUgPSBlbmRwb2ludERlc2MuZ2V0QmluZGluZ1R5cGUoKTsKLSAgICAgICAgICAgIAlpZihiaW5kaW5nVHlwZS5lcXVhbHMob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5Db25zdGFudHMuU09BUF9IVFRQX0JJTkRJTkcpKXsKLSAgICAgICAgICAgIAkJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgCQkJbG9nLmRlYnVnKCJDaGVjayBmb3IgcHJvdG9jb2wgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCQlNZXNzYWdlQ29udGV4dCBmYXVsdENvbnRleHQgPSBpc1Byb3RvY29sTWlzbWF0Y2gocmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICAgICAgCQlpZihmYXVsdENvbnRleHQhPW51bGwpewotICAgICAgICAgICAgCQkJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgCQkJCWxvZy5kZWJ1ZygiVGhlcmUgaXMgYSBwcm90b2NvbCBtaXNtYXRjaCwgZ2VuZXJhdGluZyBmYXVsdCBtZXNzYWdlIik7Ci0gICAgICAgICAgICAJCQl9Ci0gICAgICAgICAgICAJCQllaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChmYXVsdENvbnRleHQpOwotICAgICAgICAgICAgCQkJcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJCWxvZy5kZWJ1ZygiVGhlcmUgaXMgbm8gcHJvdG9jb2wgbWlzbWF0Y2giKTsKLSAgICAgICAgICAgIAkJfQotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgIC8vIEludm9rZSB0aGUgb3V0Ym91bmQgcmVzcG9uc2UgaGFuZGxlcnMuCi0gICAgICAgICAgICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBvbmUgd2F5LCB3ZSBzaG91bGQgbm90IGludm9rZSB0aGUgcmVzcG9uc2UgaGFuZGxlcnMuICBUaGVyZSBpcyBubyByZXNwb25zZQotICAgICAgICAgICAgICAgLy8gTWVzc2FnZUNvbnRleHQgc2luY2UgYSBvbmUgd2F5IGludm9jYXRpb24gaXMgY29uc2lkZXJlZCB0byBoYXZlIGEgInZvaWQiIHJldHVybi4KLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgaWYgKCFpc09uZVdheShyZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRNRVBDb250ZXh0KHJlcXVlc3QuZ2V0TUVQQ29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBoaUNvbnRleHQgPSBidWlsZEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dChyZXF1ZXN0LCBlaWMuZ2V0SGFuZGxlcnMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBIYW5kbGVySW52b2tlckZhY3RvcnkgaGlGYWN0b3J5ID0gKEhhbmRsZXJJbnZva2VyRmFjdG9yeSkgCi0gICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShIYW5kbGVySW52b2tlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBIYW5kbGVySW52b2tlciBoYW5kbGVySW52b2tlciA9IGhpRmFjdG9yeS5jcmVhdGVIYW5kbGVySW52b2tlcihyZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJJbnZva2VyLmludm9rZU91dGJvdW5kSGFuZGxlcnMoaGlDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGZvciBub3csIHRocm93IGl0LiAgV2UgcHJvYmFibHkgc2hvdWxkIHRyeSB0byBtYWtlIGFuIFhNTEZhdWx0IG9iamVjdCBhbmQgc2V0IGl0IG9uIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICBUaHJvd2FibGUgdG9CZVRocm93biA9IEludm9jYXRpb25IZWxwZXIuZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKGUsIGVpYyk7Ci0gICAgICAgICAgICBpZih0b0JlVGhyb3duID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0b0JlVGhyb3duID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24odG9CZVRocm93bik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAkvLyBhdCB0aGlzIHBvaW50LCB3ZSBhcmUgZG9uZSB3aXRoIGhhbmRsZXIgaW5zdGFuY2VzIG9uIHRoZSBzZXJ2ZXI7IGNhbGwgQFByZURlc3Ryb3kgb24gYWxsIG9mIHRoZW0KLSAgICAgICAgICAgIGRlc3Ryb3lIYW5kbGVycyhlaWMsIHJlcXVlc3QpOwotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeShlaWMpOwotICAgICAgICAgICAgcmVzdG9yZVJlcXVlc3RNZXNzYWdlKHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBlaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95SGFuZGxlcnMoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMsIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHsKLSAgICAgICAgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXIgaGxtID0gY3JlYXRlSGFuZGxlcmxpZmVjeWNsZU1hbmFnZXIoKTsKLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gZWljLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgIGlmKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGhsbS5kZXN0cm95SGFuZGxlckluc3RhbmNlKHJlcXVlc3QsIGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNhbiB3ZSBpZ25vcmUgdGhpcz8KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgdGhlIENsYXNzIG9iamVjdCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB3ZWIgc2VydmljZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGdldFNlcnZpY2VJbXBsZW1lbnRhdGlvbihNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBTdHJpbmcgaW1wbENsYXNzTmFtZSA9IGdldFNlcnZpY2VJbXBsQ2xhc3NOYW1lKG1jKTsKLSAgICAgICAgQ2xhc3MgaW1wbENsYXNzID0gbG9hZFNlcnZpY2VJbXBsQ2xhc3MoaW1wbENsYXNzTmFtZSwgbWMuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIHJldHVybiBpbXBsQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogR2V0IHRoZSBhcHByb3ByaWF0ZSBFbmRwb2ludERpc3BhdGNoZXIgZm9yIGEgZ2l2ZW4gc2VydmljZSBlbmRwb2ludC4KLSAgICAgICovCi0gICAgcHJvdGVjdGVkIEVuZHBvaW50RGlzcGF0Y2hlciBnZXRFbmRwb2ludERpc3BhdGNoZXIoQ2xhc3Mgc2VydmljZUltcGxDbGFzcywgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGdldEVuZHBvaW50RGlzcGF0Y2hlcihudWxsLCBzZXJ2aWNlSW1wbENsYXNzLCBzZXJ2aWNlSW5zdGFuY2UpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgRW5kcG9pbnREaXNwYXRjaGVyIGdldEVuZHBvaW50RGlzcGF0Y2hlcihNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3Mgc2VydmljZUltcGxDbGFzcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkgCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5IGZhY3RvcnkgPSAKLSAgICAgICAgICAgIChFbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEVuZHBvaW50RGlzcGF0Y2hlckZhY3RvcnkuY2xhc3MpOyAgICAgICAgCi0gICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZUVuZHBvaW50RGlzcGF0Y2hlcihtYywgc2VydmljZUltcGxDbGFzcywgc2VydmljZUluc3RhbmNlKTsgICAKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlSW1wbENsYXNzTmFtZShNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICAvLyBUaGUgUEFSQU1fU0VSVklDRV9DTEFTUyBwcm9wZXJ0eSB0aGF0IGlzIHNldCBvbiB0aGUgQXhpc1NlcnZpY2UKLSAgICAgICAgLy8gd2lsbCB0ZWxsIHVzIHdoYXQgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMuCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzTXNnQ29udGV4dCA9IG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBBeGlzU2VydmljZSBhcyA9IGF4aXNNc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGFzLmdldFBhcmFtZXRlcihvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5TRVJWSUNFX0NMQVNTKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSB3YXMgbm8gaW1wbGVtZW50YXRpb24gY2xhc3MsIHdlIHNob3VsZCBub3QgZ28gYW55IGZ1cnRoZXIKLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgIkVuZHBvaW50Q29udHJvbGxlckVycjIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKChTdHJpbmcpcGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAgKiBUcmllcyB0byBsb2FkIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB0aGF0IHdhcyBzcGVjaWZpZWQgZm9yIHRoZQotICAgICAgKiB0YXJnZXQgZW5kcG9pbnQKLSAgICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBsb2FkU2VydmljZUltcGxDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byBsb2FkIHNlcnZpY2UgaW1wbCBjbGFzczogIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9UT0RPOiBXaGF0IHNob3VsZCBiZSBkb25lIGlmIHRoZSBzdXBwbGllZCBDbGFzc0xvYWRlciBpcyBudWxsPwotICAgICAgICAgICAgQ2xhc3MgX2NsYXNzID0gZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsKTsKLSAgICAgICAgICAgIHJldHVybiBfY2xhc3M7Ci0gICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgLy9kb2VzIG5vdCBleHRlbmQgRXhjZXB0aW9uLCBzbyBsZXRzIGNhdGNoIGV2ZXJ5dGhpbmcgdGhhdCBleHRlbmRzIFRocm93YWJsZQotICAgICAgICAgICAgLy9yYXRoZXIgdGhhbiBqdXN0IEV4Y2VwdGlvbi4KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGNuZikgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAiRW5kcG9pbnRDb250cm9sbGVyRXJyNCIsIGNsYXNzTmFtZSksIGNuZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGlzIG5hbWUKLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUsIGZpbmFsIGJvb2xlYW4gaW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWwgQ2F1c2UgaXMgIiArIGUuZ2V0RXhjZXB0aW9uKCkuZ2V0Q2F1c2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBHZXRzIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCB0aGF0IGlzIGN1cnJlbnRseQotICAgICogYmVpbmcgcHJvY2Vzc2VkLgotICAgICovCi0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGdldEVuZHBvaW50RGVzY3JpcHRpb24oTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YyA9IG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNTdmMuZ2V0UGFyYW1ldGVyKEVuZHBvaW50RGVzY3JpcHRpb24uQVhJU19TRVJWSUNFX1BBUkFNRVRFUik7Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAJLy8gSWYgd2UndmUgbWFkZSBpdCBoZXJlLCBpdHMgdmVyeSBsaWtlbHkgdGhhdCBhbHRob3VnaCB0aGUgQXhpc1NlcnZpY2Ugd2FzIGRlcGxveWVkLCB0aGUgCi0gICAgICAgIAkvLyBhc3NvY2lhdGVkIFNlcnZpY2VEZXNjcmlwdGlvbiB3YXMgbm90IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY0VycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSAoRW5kcG9pbnREZXNjcmlwdGlvbikgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgcmV0dXJuIGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgdGhlIHJlcXVlc3QgbWVzc2FnZSBpZiBpbmRpY2F0ZWQgYnkgdGhlIFNBVkVfUkVRVUVTVF9NU0cgcHJvcGVydHkKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0TXNnQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzYXZlUmVxdWVzdE1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0NvbnRleHQpIHsKLQotICAgICAgICAvLyBUT0RPOiBURVNUSU5HLi4uRk9SQ0UgU0FWSU5HIFRIRSBSRVFVRVNUIE1FU1NBR0UKLSAgICAgICAgLy8gcmVxdWVzdE1zZ0NvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuc2V0UHJvcGVydHkoQ29uc3RhbnRzLlNBVkVfUkVRVUVTVF9NU0csIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIC8vIEVORCBURVNUSU5HCi0KLSAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKQotICAgICAgICAgICAgICAgIHJlcXVlc3RNc2dDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldFByb3BlcnR5KENvbnN0YW50cy5TQVZFX1JFUVVFU1RfTVNHKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIC8vIFJFVklFVzogVGhpcyBkb2VzIG5vdCBwcm9wZXJseSBhY2NvdW50IGZvciBhdHRhY2htZW50cy4KLSAgICAgICAgICAgIE1lc3NhZ2UgbSA9IHJlcXVlc3RNc2dDb250ZXh0LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBzYXZlZE1zZyA9IG0uZ2V0QXNPTUVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgcmVxdWVzdE1zZ0NvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KENvbnN0YW50cy5TQVZFRF9SRVFVRVNUX01TR19URVhULCBzYXZlZE1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZnJvbSB0aGUgc2F2ZWQgbWVzc2FnZSB0ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdE1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVJlcXVlc3RNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3RNc2dDb250ZXh0KSB7Ci0KLSAgICAgICAgQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKQotICAgICAgICAgICAgICAgIHJlcXVlc3RNc2dDb250ZXh0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldFByb3BlcnR5KENvbnN0YW50cy5TQVZFX1JFUVVFU1RfTVNHKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIC8vIFJFVklFVzogVGhpcyBkb2VzIG5vdCBwcm9wZXJseSBhY2NvdW50IGZvciBhdHRhY2htZW50cy4KLSAgICAgICAgICAgIFN0cmluZyBzYXZlZE1zZyA9IChTdHJpbmcpcmVxdWVzdE1zZ0NvbnRleHQuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5TQVZFRF9SRVFVRVNUX01TR19URVhUKTsKLSAgICAgICAgICAgIGlmIChzYXZlZE1zZyAhPSBudWxsICYmIHNhdmVkTXNnLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2F2ZWRNc2cpOwotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1scmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2wgcHJvdG9jb2wgPSByZXF1ZXN0TXNnQ29udGV4dC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5pc0RvaW5nUkVTVCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbC5yZXN0IDogbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtZi5jcmVhdGVGcm9tKHhtbHJlYWRlciwgcHJvdG9jb2wpOwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TXNnQ29udGV4dC5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBURVNUSU5HLi4uLlNJTVVMQVRFIEEgUEVSU0lTVCBPRiBUSEUgUkVRVUVTVCBNRVNTQUdFCi0gICAgICAgIC8vIFN0cmluZyB0ZXh0ID0gcmVxdWVzdE1zZ0NvbnRleHQuZ2V0TWVzc2FnZSgpLmdldEFzT01FbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQZXJzaXN0IE1lc3NhZ2UiICsgdGV4dCk7Ci0gICAgICAgIC8vIEVORCBURVNUSU5HCi0gICAgfQotCi0gICAgLyoKLSAgICAqIERldGVybWluZSBpZiB0aGlzIGlzIGEgb25lLXdheSBpbnZvY2F0aW9uIG9yIG5vdC4KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09uZVdheShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgaWYgKG1jICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBtYy5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVwID0gb3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotCi0gICAgICAgICAgICBpZiAobWVwLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbWVwLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZKSB8fAotICAgICAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZKXx8Ci0gICAgICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSl8fAotICAgICAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEJ1aWxkcyB0aGUgSGFuZGxlckludm9jYXRpb25Db250ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gaW52b2tpbmcgCi0gICAgICogaW5ib3VuZC9vdXRib3VuZCBoYW5kbGVyIGNoYWlucy4KLSAgICAgKi8KLSAgICBzdGF0aWMgSGFuZGxlckludm9jYXRpb25Db250ZXh0IGJ1aWxkSGFuZGxlckludm9jYXRpb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIExpc3Q8SGFuZGxlcj4gaGFuZGxlcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAgbWVwLCBib29sZWFuIGlzT25lV2F5KSB7Ci0gICAgICAgIEhhbmRsZXJJbnZvY2F0aW9uQ29udGV4dCBoaUNvbnRleHQgPSBuZXcgSGFuZGxlckludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIGhpQ29udGV4dC5zZXRNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsKLSAgICAgICAgaGlDb250ZXh0LnNldE1FUChtZXApOwotICAgICAgICBoaUNvbnRleHQuc2V0SGFuZGxlcnMoaGFuZGxlcnMpOwotICAgICAgICBoaUNvbnRleHQuc2V0T25lV2F5KGlzT25lV2F5KTsKLSAgICAgICAgcmV0dXJuIGhpQ29udGV4dDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXRyaWV2ZSBhbGwgdGhlIEludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkgaW5zdGFuY2VzIGFuZAotICAgICAqIGNhbGwgdGhlICdjcmVhdGVJbnZvY2F0aW9uTGlzdGVuZXInIGluc3RhbmNlIG9uIGVhY2guIElmIGEgbm9uLW51bGwgbGlzdGVuZXIKLSAgICAgKiBpcyByZXR1cm5lZCwgdGhlICdyZXF1ZXN0UmVjZWl2ZWQnIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgaW5zdGFuY2UsCi0gICAgICogYW5kIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVxdWVzdFJlY2VpdmVkKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSAgewotICAgICAgICBDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGZhY3RvcnlMaXN0ID0gZWljLmdldEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcygpOwotICAgICAgICBpZihmYWN0b3J5TGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4gPSBuZXcgSW52b2NhdGlvbkxpc3RlbmVyQmVhbihlaWMsIEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVRVUVTVCk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBmYWN0b3J5SXRlciA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZShmYWN0b3J5SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGZhY3RvcnkgID0gZmFjdG9yeUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IGZhY3RvcnkuY3JlYXRlSW52b2NhdGlvbkxpc3RlbmVyKGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgaWYobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubm90aWZ5KGJlYW4pOyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIGluc3RhbmNlIHNvIGl0IGNhbiBiZSBjYWxsZWQgb24gdGhlIHJlc3BvbnNlIGFsc28KLSAgICAgICAgICAgICAgICAgICAgICAgIGVpYy5hZGRJbnZvY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIHJlcXVlc3Quc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLklOVk9DQVRJT05fTElTVEVORVJfTElTVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGlzIHdpbGwgY2FsbCB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyB0aGF0IHdlcmUgY2FsbGVkIGR1cmluZwotICAgICAqIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgZm9yIHRoaXMgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNwb25zZVJlYWR5KEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSAgewotICAgICAgICBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gZWljLmdldEludm9jYXRpb25MaXN0ZW5lcnMoKTsKLSAgICAgICAgaWYobGlzdGVuZXJMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEludm9jYXRpb25MaXN0ZW5lckJlYW4gYmVhbiA9IG5ldyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuKGVpYywgSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5TdGF0ZS5SRVNQT05TRSk7Ci0gICAgICAgICAgICBmb3IoSW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubm90aWZ5KGJlYW4pOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogd2UgbmVlZCBhIEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyIHNvIHdlIGNhbiBjYWxsIHRoZSBAUHJlRGVzdHJveSB3aGVuIHdlIGFyZSBkb25lIHdpdGggdGhlIHNlcnZlci1zaWRlIGhhbmRsZXIgaW5zdGFuY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYW5kbGVyTGlmZWN5Y2xlTWFuYWdlciBjcmVhdGVIYW5kbGVybGlmZWN5Y2xlTWFuYWdlcigpIHsKLSAgICAgICAgSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IGVsbWYgPSAoSGFuZGxlckxpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeQotICAgICAgICAgICAgICAgIC5nZXRGYWN0b3J5KEhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBlbG1mLmNyZWF0ZUhhbmRsZXJMaWZlY3ljbGVNYW5hZ2VyKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgaXNQcm90b2NvbE1pc21hdGNoKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlKXsKLSAgICAJUHJvdG9jb2wgcmVxdWVzdFByb3RvY29sID1yZXF1ZXN0LmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpOwotICAgIAlQcm90b2NvbCByZXNwb25zZVByb3RvY29sID0gcmVzcG9uc2UuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCk7Ci0gICAgCWJvb2xlYW4gcHJvdG9jb2xNaXNtYXRjaCA9IGZhbHNlOwotICAgIAlTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAJaWYocmVxdWVzdFByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKXsKLSAgICAJCWlmKCFyZXNwb25zZVByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKXsKLSAgICAJCQlwcm90b2NvbE1pc21hdGNoID0gdHJ1ZTsKLSAgICAJCQltc2cgPSAiUmVxdWVzdCBTT0FQIG1lc3NhZ2UgcHJvdG9jb2wgaXMgdmVyc2lvbiAxLjEsIGJ1dCBSZXNwb25zZSBTT0FQIG1lc3NhZ2UgaXMgY29uZmlndXJlZCBmb3IgU09BUCAxLjIuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICAJCX0KLSAgICAJfQotICAgIAllbHNlIGlmKHJlcXVlc3RQcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDEyKSl7Ci0gICAgCQlpZighcmVzcG9uc2VQcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wuc29hcDEyKSl7Ci0gICAgCQkJcHJvdG9jb2xNaXNtYXRjaCA9IHRydWU7Ci0gICAgCQkJbXNnID0gIlJlcXVlc3QgU09BUCBtZXNzYWdlIHByb3RvY29sIGlzIHZlcnNpb24gMS4yLCBidXQgUmVzcG9uc2UgU09BUCBtZXNzYWdlIGlzIGNvbmZpZ3VyZWQgZm9yIFNPQVAgMS4xLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG51bGw7Ci0gICAgCWlmKHByb3RvY29sTWlzbWF0Y2gpewotICAgIAkJbXNnQ29udGV4dCA9IFV0aWxzLmNyZWF0ZUZhdWx0TWVzc2FnZShyZXNwb25zZSwgbXNnKTsKLSAgICAJfQotICAgIAlyZXR1cm4gbXNnQ29udGV4dDsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50SW52b2NhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwOWI3Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuRW5kcG9pbnREaXNwYXRjaGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotLyoqDQotICogVGhlIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBiYXNlIEludm9jYXRpb25Db250ZXh0DQotICogdGhhdCBwcm92aWRlcyBleHRlbnNpb25zIHNwZWNpZmljIHRvIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgc2VydmljZQ0KLSAqIGVuZHBvaW50LiAgDQotICovDQotcHVibGljIGludGVyZmFjZSBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGV4dGVuZHMgSW52b2NhdGlvbkNvbnRleHQgew0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgY2FsbGJhY2sgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGFzeW5jaHJvbm91cyANCi0gICAgICogZW5kcG9pbnQgaW52b2NhdGlvbnMuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIEVuZHBvaW50Q2FsbGJhY2sgLSB0aGUgRW5kcG9pbnRDYWxsYmFjayBpbnN0YW5jZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludENhbGxiYWNrIGdldENhbGxiYWNrKCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgY2FsbGJhY2sgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGFzeW5jaHJvbm91cyANCi0gICAgICogZW5kcG9pbnQgaW52b2NhdGlvbnMuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gY2IgLSB0aGUgRW5kcG9pbnRDYWxsYmFjayBpbnN0YW5jZSB0byBiZSB1c2VkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soRW5kcG9pbnRDYWxsYmFjayBjYik7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludERpc3BhdGNoZXIgZ2V0RGlzcGF0Y2hlcigpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50RGlzcGF0Y2hlcihFbmRwb2ludERpc3BhdGNoZXIgZWQpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGludm9jYXRpb24NCi0gICAgICogcGF0dGVybiBmb3IgdGhlIHJlcXVlc3QgaXMgb25lIHdheSBvciBub3QuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheSgpOyANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbWFya2luZyB0aGUgcmVxdWVzdCBhcyBhIG9uZSB3YXkgaW52b2NhdGlvbi4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0SXNPbmVXYXkoYm9vbGVhbiB2YWx1ZSk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBpbnN0YW5jZXMgcmVnaXN0ZXJlZCB3aXRoIEpBWC1XUy4NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gZmFjdG9yaWVzKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGluc3RhbmNlcyByZWdpc3RlcmVkIHdpdGggSkFYLVdTLg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBnZXRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGFuIEludm9jYXRpb25MaXN0ZW5lciB0byB0aGUgY29udGV4Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkSW52b2NhdGlvbkxpc3RlbmVyKEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcik7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0cyBsaXN0IG9mIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEludm9jYXRpb25MaXN0ZW5lcnMoTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVycyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyBmcm9tIHRoZSBjb250ZXh0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPiBnZXRJbnZvY2F0aW9uTGlzdGVuZXJzKCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9FbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjQzMTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0VuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuRW5kcG9pbnREaXNwYXRjaGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCBleHRlbmRzIEludm9jYXRpb25Db250ZXh0SW1wbA0KLSAgICBpbXBsZW1lbnRzIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgew0KLQ0KLSAgICBwcml2YXRlIEVuZHBvaW50Q2FsbGJhY2sgY2FsbGJhY2s7DQotICAgIHByaXZhdGUgRW5kcG9pbnREaXNwYXRjaGVyIGRpc3BhdGNoZXI7DQotICAgIHByaXZhdGUgQm9vbGVhbiBvbmVXYXk7DQotICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5PiBpbEZhY3RvcmllczsNCi0gICAgcHJpdmF0ZSBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gaWxJbnN0YW5jZXMgPSBuZXcgTGlua2VkTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+KCk7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNnZXRDYWxsYmFjaygpDQotICAgICAqLw0KLSAgICBwdWJsaWMgRW5kcG9pbnRDYWxsYmFjayBnZXRDYWxsYmFjaygpIHsNCi0gICAgICAgIHJldHVybiBjYWxsYmFjazsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNnZXREaXNwYXRjaGVyKCkNCi0gICAgICovDQotICAgIHB1YmxpYyBFbmRwb2ludERpc3BhdGNoZXIgZ2V0RGlzcGF0Y2hlcigpIHsNCi0gICAgICAgIHJldHVybiBkaXNwYXRjaGVyOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I3NldENhbGxiYWNrKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50Q2FsbGJhY2spDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhFbmRwb2ludENhbGxiYWNrIGNiKSB7DQotICAgICAgICBjYWxsYmFjayA9IGNiOw0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I3NldEVuZHBvaW50RGlzcGF0Y2hlcihvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLkVuZHBvaW50RGlzcGF0Y2hlcikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50RGlzcGF0Y2hlcihFbmRwb2ludERpc3BhdGNoZXIgZWQpIHsNCi0gICAgICAgIGRpc3BhdGNoZXIgPSBlZDsNCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNpc09uZVdheSgpDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheSgpIHsNCi0gICAgICAgIGlmIChvbmVXYXkgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBvbmVXYXkuYm9vbGVhblZhbHVlKCk7ICAgIA0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgLy8gVE9ETzogV2UgY2FuIGFkZCBzb21lIGNvZGUgdG8gZGVyaXZlIGl0IGhlcmUgDQotICAgICAgICAgICAgLy8gc2hvdWxkIHdlIHNlZSBmaXQuDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludEludm9jYXRpb25Db250ZXh0I3NldElzT25lV2F5KGJvb2xlYW4pDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc09uZVdheShib29sZWFuIHZhbHVlKSB7DQotICAgICAgICBvbmVXYXkgPSB2YWx1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjc2V0SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzDQotICAgICAqIChDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+KQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gaWxGYWN0b3JpZXMpIHsNCi0gICAgICAgIHRoaXMuaWxGYWN0b3JpZXMgPSBpbEZhY3RvcmllczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjZ2V0SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKCkNCi0gICAgICovDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGdldEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcygpIHsNCi0gICAgICAgIHJldHVybiBpbEZhY3RvcmllczsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjc2V0SW52b2NhdGlvbkxpc3RlbmVycyhMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0SW52b2NhdGlvbkxpc3RlbmVycyhMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzKSB7DQotICAgICAgICB0aGlzLmlsSW5zdGFuY2VzID0gbGlzdGVuZXJzOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCNhZGRJbnZvY2F0aW9uTGlzdGVuZXIoSW52b2NhdGlvbkxpc3RlbmVyKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkSW52b2NhdGlvbkxpc3RlbmVyKEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLSAgICAgICAgaWxJbnN0YW5jZXMuYWRkKGxpc3RlbmVyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQjZ2V0SW52b2NhdGlvbkxpc3RlbmVycygpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+IGdldEludm9jYXRpb25MaXN0ZW5lcnMoKSB7DQotICAgICAgICByZXR1cm4gaWxJbnN0YW5jZXM7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25IZWxwZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNGZhYWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBzdGF0aWMgbWV0aG9kcyB0aGF0IGFyZSB1dGlsaXplZCBkdXJpbmcgdGhlIGNvdXJzZQ0KLSAqIG9mIGludm9jYXRpb24gb2YgYSBKQVgtV1MgZW5kcG9pbnQuIFRoaXMgdXRpbGl0eSBjbGFzcyBpcyBzcGVjaWZpY2FsbHkNCi0gKiBtZWFudCB0byBiZSB1c2VkIHdpdGhpbiB0aGUgSkFYLVdTIHNlcnZlci1zaWRlIGZsb3cuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW52b2NhdGlvbkhlbHBlciB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSW52b2NhdGlvbkhlbHBlci5jbGFzcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGRyaXZpbmcgdGhlIG1ldGhvZCBiZWxvdy4gSXQgd2lsbCBhcHByb3ByaWF0ZWx5DQotICAgICAqIHdyYXAgdGhlIE1lc3NhZ2VDb250ZXh0IGluIGFuIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQuIFRoZSBNZXNzYWdlQ29udGV4dCANCi0gICAgICogaW5zdGFuY2UgTVVTVCBiZSBhIHJlcXVlc3QgTWVzc2FnZUNvbnRleHQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbihUaHJvd2FibGUgdCwgTWVzc2FnZUNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSBuZXcgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGwoKTsNCi0gICAgICAgIGVpYy5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoY29udGV4dCk7DQotICAgICAgICBlaWMuc2V0SW52b2NhdGlvbkxpc3RlbmVycygoTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+KWNvbnRleHQuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLklOVk9DQVRJT05fTElTVEVORVJfTElTVCkpOw0KLSAgICAgICAgY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbih0LCBlaWMpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGRyaXZpbmcgdGhlIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMnDQotICAgICAqICdub3RpZnlPbkV4Y2VwdGlvbicgbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnl0aW1lIHRoYXQgYW4NCi0gICAgICogZXhjZXB0aW9uIG9jY3VycyB3aXRoaW4gdGhlIEpBWC1XUyBzZXJ2ZXIgc2lkZSBjb2RlIGZsb3cuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbihUaHJvd2FibGUgdCwgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMpIHsNCi0gICAgICAgIExpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPiBpbnZvY2F0aW9uTGlzdGVuZXJzID0gZWljLmdldEludm9jYXRpb25MaXN0ZW5lcnMoKTsNCi0gICAgICAgIFRocm93YWJsZSByZXR1cm5FeGNlcHRpb24gPSBudWxsOw0KLSAgICAgICAgaWYoaW52b2NhdGlvbkxpc3RlbmVycyAhPSBudWxsICYmICFpbnZvY2F0aW9uTGlzdGVuZXJzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIEludm9jYXRpb25MaXN0ZW5lckJlYW4gYmVhbiA9IG5ldyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuKCk7DQotICAgICAgICAgICAgYmVhbi5zZXRFbmRwb2ludEludm9jYXRpb25Db250ZXh0KGVpYyk7DQotICAgICAgICAgICAgYmVhbi5zZXRTdGF0ZShlaWMuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpICE9IG51bGwgPyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuLlN0YXRlLlJFU1BPTlNFIDogDQotICAgICAgICAgICAgICAgIEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVRVUVTVCk7DQotICAgICAgICAgICAgYmVhbi5zZXRUaHJvd2FibGUodCk7DQotICAgICAgICAgICAgZm9yKEludm9jYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA6IGludm9jYXRpb25MaXN0ZW5lcnMpIHsNCi0gICAgICAgICAgICAgICAgbGlzdGVuZXIubm90aWZ5T25FeGNlcHRpb24oYmVhbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgY2FsbCB0byB0aGUgYWJvdmUgbWV0aG9kcy4gSXQgd2lsbCBkcml2ZSB0aGUgY2FsbCB0bw0KLSAgICAgKiB0aGUgJ25vdGlmeU9uRXhjZXB0aW9uJyBtZXRob2RzIG9mIGFsbCBJbnZvY2F0aW9uTGlzdGVuZXJzLiBBZnRlciBkb2luZyB0aGlzLCBpdA0KLSAgICAgKiB3aWxsIGRldGVybWluZSBpZiBhbm90aGVyIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQgYXMgdGhlIG1hcHBlZCBleGNlcHRpb24sIGFuZCBpZg0KLSAgICAgKiBzbyBpdCB3aWxsIHJldHVybiB0aGlzIGV4Y2VwdGlvbi4gT3RoZXJ3aXNlLCBudWxsIGlzIHJldHVybmVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0LCBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgew0KLSAgICAgICAgVGhyb3dhYmxlIHJldHVyblRocm93YWJsZSA9IG51bGw7DQotICAgICAgICBjYWxsTGlzdGVuZXJzRm9yRXhjZXB0aW9uKHQsIGVpYyk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0Q29udGV4dCA9IGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCA9IGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBpZihyZXF1ZXN0Q29udGV4dCAhPSBudWxsIA0KLSAgICAgICAgICAgICAgICAmJiANCi0gICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04pICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm5UaHJvd2FibGUgPSAoVGhyb3dhYmxlKSByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuTUFQUEVEX0VYQ0VQVElPTik7DQotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIG1hcHBlZCBleGNlcHRpb24gdG86ICIgKyByZXR1cm5UaHJvd2FibGUgKyAiIGZyb20gcmVxdWVzdCAiICsNCi0gICAgICAgICAgICAgICAgCQkiTWVzc2FnZUNvbnRleHQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBlbHNlIGlmKHJlc3BvbnNlQ29udGV4dCAhPSBudWxsDQotICAgICAgICAgICAgICAgICYmDQotICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuTUFQUEVEX0VYQ0VQVElPTikgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVyblRocm93YWJsZSA9IChUaHJvd2FibGUpIHJlc3BvbnNlQ29udGV4dC5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuTUFQUEVEX0VYQ0VQVElPTik7DQotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIG1hcHBlZCBleGNlcHRpb24gdG86ICIgKyByZXR1cm5UaHJvd2FibGUgKyAiIGZyb20gcmVzcG9uc2UgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZUNvbnRleHQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuVGhyb3dhYmxlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgY2FsbCB0byB0aGUgYWJvdmUgbWV0aG9kcy4gSXQgd2lsbCBkcml2ZSB0aGUgY2FsbCB0bw0KLSAgICAgKiB0aGUgJ25vdGlmeU9uRXhjZXB0aW9uJyBtZXRob2RzIG9mIGFsbCBJbnZvY2F0aW9uTGlzdGVuZXJzLiBBZnRlciBkb2luZyB0aGlzLCBpdA0KLSAgICAgKiB3aWxsIGRldGVybWluZSBpZiBhbm90aGVyIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQgYXMgdGhlIG1hcHBlZCBleGNlcHRpb24sIGFuZCBpZg0KLSAgICAgKiBzbyBpdCB3aWxsIHJldHVybiB0aGlzIGV4Y2VwdGlvbi4gT3RoZXJ3aXNlLCBudWxsIGlzIHJldHVybmVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKFRocm93YWJsZSB0LCBNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IChFbmRwb2ludEludm9jYXRpb25Db250ZXh0KWNvbnRleHQuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIGlmIChlaWMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGVpYyA9IG5ldyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCgpOw0KLSAgICAgICAgICAgIGVpYy5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoY29udGV4dCk7DQotICAgICAgICB9DQotICAgICAgICBlaWMuc2V0SW52b2NhdGlvbkxpc3RlbmVycygoTGlzdDxJbnZvY2F0aW9uTGlzdGVuZXI+KWNvbnRleHQuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLklOVk9DQVRJT05fTElTVEVORVJfTElTVCkpOw0KLSAgICAgICAgcmV0dXJuIGRldGVybWluZU1hcHBlZEV4Y2VwdGlvbih0LCBlaWMpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uTGlzdGVuZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9JbnZvY2F0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiMmM4Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHRob3NlIGNvbXBvbmVudHMgd2lzaGluZyB0bw0KLSAqIGJlIG5vdGlmaWVkIHdoZW4gcmVxdWVzdHMgYXJlIHJlY2VpdmVkIG9uIHRoZSBzZXJ2ZXItc2lkZSBhbmQgd2hlbg0KLSAqIHJlc3BvbnNlcyBoYXZlIGJlZW4gY29uc3RydWN0ZWQgb24gdGhlIHNlcnZlci1zaWRlLiBJbXBsZW1lbnRhdGlvbnMNCi0gKiBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBGYWN0b3J5UmVnaXN0cnkuDQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIEludm9jYXRpb25MaXN0ZW5lciB7DQotDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYnkgSkFYLVdTIHdoZW4gYSBtZXNzYWdlIGhhcyBiZWVuDQotICAgICAqIHJlY2VpdmVkIG9yIGp1c3QgYmVmb3JlIGEgcmVzcG9uc2UgaXMgc2VudCB0byB0aGUgY2xpZW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbm90aWZ5KEludm9jYXRpb25MaXN0ZW5lckJlYW4gYmVhbikgdGhyb3dzIEV4Y2VwdGlvbjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhbnl0aW1lIHRoYXQgYW4gZXhjZXB0aW9uIG9jY3Vycw0KLSAgICAgKiB3aXRoaW4gdGhlIEpBWC1XUyBzZXJ2ZXItc2lkZSBjb2RlIGZsb3cuIEludm9jYXRpb25MaXN0ZW5lcg0KLSAgICAgKiBpbnN0YW5jZXMgbWF5IGNoYW5nZSB0aGUgZXhjZXB0aW9uIGJlaW5nIG9wZXJhdGVkIG9uIGJ5IHNldHRpbmcgDQotICAgICAqIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuTUFQUEVEX0VYQ0VQVElPTg0KLSAgICAgKiBwcm9wZXJ0eSBvbiBlaXRoZXIgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQuIFRoZQ0KLSAgICAgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mIFRocm93YWJsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeU9uRXhjZXB0aW9uKEludm9jYXRpb25MaXN0ZW5lckJlYW4gYmVhbik7DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjY2IyNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotLyoqDQotICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIA0KLSAqIGluc3RhbmNlcyBpbiBib3RoIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBmbG93LiBUaGlzIGJlYW4gd2lsbCANCi0gKiBob2xkIGRhdGEgdGhhdCBhbGxvd3MgdGhlIEludm9jYXRpb25MaXN0ZW5lciB0byBkZXRlcm1pbmUgdGhlIG1lc3NhZ2UNCi0gKiBmbG93IChyZXF1ZXN0IHZzLiByZXNwb25zZSkgYXMgd2VsbCBhcyBvdGhlciBjb250ZXh0IGluZm9ybWF0aW9uLg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIEludm9jYXRpb25MaXN0ZW5lckJlYW4gew0KLSAgICANCi0gICAgcHJpdmF0ZSBUaHJvd2FibGUgdGhyb3dhYmxlOw0KLSAgICANCi0gICAgcHVibGljIEludm9jYXRpb25MaXN0ZW5lckJlYW4oKSB7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEludm9jYXRpb25MaXN0ZW5lckJlYW4oRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMsIFN0YXRlIHN0YXRlKSB7DQotICAgICAgICB0aGlzLmVpYyA9IGVpYzsNCi0gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIFN0YXRlIHsNCi0gICAgICAgIFJFUVVFU1QsDQotICAgICAgICBSRVNQT05TRSwNCi0gICAgICAgIEVYQ0VQVElPTg0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljOw0KLSAgICANCi0gICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsNCi0NCi0gICAgcHVibGljIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZ2V0RW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBlaWM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dChFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYykgew0KLSAgICAgICAgdGhpcy5laWMgPSBlaWM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0YXRlIGdldFN0YXRlKCkgew0KLSAgICAgICAgcmV0dXJuIHN0YXRlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKFN0YXRlIHN0YXRlKSB7DQotICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldFRocm93YWJsZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7DQotICAgICAgICB0aGlzLnRocm93YWJsZSA9IHRocm93YWJsZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUoKSB7DQotICAgICAgICByZXR1cm4gdGhyb3dhYmxlOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0ludm9jYXRpb25MaXN0ZW5lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4YmIwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHRob3NlIHdpc2hpbmcgdG8NCi0gKiBjcmVhdGUgaW5zdGFuY2VzIG9mIGFuIEludm9jYXRpb25MaXN0ZW5lciBiYXNlZCBvbiBjZXJ0YWluDQotICogY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiByZXF1ZXN0LiBUaGUgY29udGV4dCBpbmZvcm1hdGlvbg0KLSAqIG1heSBiZSBvYnRhaW5lZCB2aWEgdGhlIE1lc3NhZ2VDb250ZXh0IHByb3ZpZGVkLg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IHsNCi0gICAgDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uTGlzdGVuZXIgY3JlYXRlSW52b2NhdGlvbkxpc3RlbmVyKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0pBWFdTTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYWI3NTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL0pBWFdTTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuQXR0YWNobWVudHNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5TT0FQSGVhZGVyc0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlRyYW5zcG9ydEhlYWRlcnNBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5JbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIEpBWFdTTWVzc2FnZVJlY2VpdmVyIGlzIHRoZSBlbnRyeSBwb2ludCwgZnJvbSB0aGUgc2VydmVyJ3MgcGVyc3BlY3RpdmUsIHRvIHRoZSBKQVgtV1MgY29kZS4KLSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIEF4aXMgRW5naW5lIGFuZCBpcyB0aGUgZW5kIG9mIHRoZSBjaGFpbiBmcm9tIGFuIEF4aXMyIHBlcnNwZWN0aXZlLgotICovCi1wdWJsaWMgY2xhc3MgSkFYV1NNZXNzYWdlUmVjZWl2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEpBWFdTTWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBQQVJBTV9TRVJWSUNFX0NMQVNTID0gIlNlcnZpY2VDbGFzcyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUEFSQU1fQklORElORyA9ICJCaW5kaW5nIjsKLQotICAgIC8qKgotICAgICAqIFdlIHNob3VsZCBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB3aGljaCBBeGlzU2VydmljZSB3ZSdyZSB0YXJnZXR0aW5nIGF0IHRoaXMgcG9pbnQuICBTbyBub3csCi0gICAgICoganVzdCBnZXQgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYW5kIGludm9rZSB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLgotICAgICAqIEBwYXJhbSBheGlzUmVxdWVzdE1zZ0N0eAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzUmVxdWVzdE1zZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzRmF1bHQgZmF1bHRUb1JldHVybiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIm5ldyByZXF1ZXN0IHJlY2VpdmVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0dldCB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSBpbXBsIHRoYXQgd2FzIHN0b3JlZCBhcyBhIHBhcmFtZXRlcgotICAgICAgICAvLyBpbnNpZGUgb2YgdGhlIHNlcnZpY2VzLnhtbC4KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGF4aXNSZXF1ZXN0TXNnQ3R4LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciBzdmNDbGFzc1BhcmFtID0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFBhcmFtZXRlcihQQVJBTV9TRVJWSUNFX0NMQVNTKTsKLQotICAgICAgICBpZiAoc3ZjQ2xhc3NQYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYV1NNZXNzYWdlUmVjZWl2ZXJOb1NlcnZpY2VDbGFzcyIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBlbmRwb2ludERlc2NQYXJhbSA9Ci0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRQYXJhbWV0ZXIoRW5kcG9pbnREZXNjcmlwdGlvbi5BWElTX1NFUlZJQ0VfUEFSQU1FVEVSKTsKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzY1BhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWFdTTWVzc2FnZVJlY2VpdmVyTm9TZXJ2aWNlQ2xhc3MiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBheGlzUmVxdWVzdE1zZ0N0eC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBtZXAgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTUVQOiAiICsgbWVwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIG9uIHRoZSB1bHRpbWF0ZSBleGVjdXRpb24gdGhyZWFkCi0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub1RocmVhZCgKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy9XZSdsbCBuZWVkIGFuIGluc3RhbmNlIG9mIHRoZSBFbmRwb2ludENvbnRyb2xsZXIgdG8gYWN0dWFsbHkKLSAgICAgICAgICAgIC8vZHJpdmUgdGhlIGludm9jYXRpb24uCi0gICAgICAgICAgICAvL1RPRE86IE1vcmUgd29yayBuZWVkZWQgdG8gZGV0ZXJtaW5lIHRoZSBsaWZlY3ljbGUgb2YgdGhpcyB0aGluZwotICAgICAgICAgICAgRW5kcG9pbnRDb250cm9sbGVyIGVuZHBvaW50Q3RsciA9IG5ldyBFbmRwb2ludENvbnRyb2xsZXIoKTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dChheGlzUmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldFNlcnZlcih0cnVlKTsKLSAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChyZXF1ZXN0TXNnQ3R4KSk7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDYWNoZWRDbGFzc0xvYWRlcihheGlzUmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0TXNnQ3R4LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5DQUNIRV9DTEFTU0xPQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgYWRhcHRlcnMgbmVlZCB0byBiZSBpbnN0YWxsZWQgb24gdGhlIG5ldyByZXF1ZXN0IE1lc3NhZ2UgQ29udGV4dAotICAgICAgICAgICAgQXR0YWNobWVudHNBZGFwdGVyLmluc3RhbGwocmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICBUcmFuc3BvcnRIZWFkZXJzQWRhcHRlci5pbnN0YWxsKHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgU09BUEhlYWRlcnNBZGFwdGVyLmluc3RhbGwocmVxdWVzdE1zZ0N0eCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKWF4aXNSZXF1ZXN0TXNnQ3R4LmdldFByb3BlcnR5KFBBUkFNX0JJTkRJTkcpOwotICAgICAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSBJbnZvY2F0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dChiaW5kaW5nKTsKLSAgICAgICAgICAgIGFkZEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcyhlaWMpOwotICAgICAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICAgICAgLy8gV0FSTklORzogVGhpcyBzaG91bGQgYmUgbGVmdCBkaXNhYmxlZCBmb3Igbm93LiAgVGhpcyBsb2NrcyB0aGUgc2VydmVyIHNpZGUKLSAgICAgICAgICAgIC8vIGludG8gYSBzaW5nbGUgdGhyZWFkZWQgaW52b2NhdGlvbi4KLSAgICAgICAgICAgIGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5zZXRQcm9wZXJ0eShTZXJ2ZXJDb25zdGFudHMuU0VSVkVSX0RJU0FCTEVfVEhSRUFEX1NXSVRDSCwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGlmIChpc01lcEluT25seShtZXApKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGV0ZWN0ZWQgYSBvbmUgd2F5IGludm9jYXRpb24uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVpYy5zZXRJc09uZVdheSh0cnVlKTsKLSAgICAgICAgICAgICAgICBlbmRwb2ludEN0bHIuaW52b2tlT25lV2F5KGVpYyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGF4aXNSZXF1ZXN0TXNnQ3R4LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuSVNfQUREUl9JTkZPX0FMUkVBRFlfUFJPQ0VTU0VEKSkKLSAgICAgICAgICAgICAgICAmJiAoYXhpc1JlcXVlc3RNc2dDdHguZ2V0UmVwbHlUbygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiAhYXhpc1JlcXVlc3RNc2dDdHguZ2V0UmVwbHlUbygpLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZXRlY3RlZCBhbiBhc3luYyBpbnZvY2F0aW9uLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBFbmRwb2ludENhbGxiYWNrIGVjYiA9IG5ldyBFbmRwb2ludENhbGxiYWNrKCk7Ci0gICAgICAgICAgICAgICAgZWljLnNldENhbGxiYWNrKGVjYik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZW5kcG9pbnRDdGxyLmludm9rZUFzeW5jKGVpYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGVjdGVkIGEgc3luYyBpbnZvY2F0aW9uLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlaWMgPSBlbmRwb2ludEN0bHIuaW52b2tlKGVpYyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgdHdvLXdheSBleGNoYW5nZSwgdGhlcmUgc2hvdWxkIGFscmVhZHkgYmUgYSAKLSAgICAgICAgICAgICAgICAvLyBKQVgtV1MgTWVzc2FnZUNvbnRleHQgZm9yIHRoZSByZXNwb25zZS4gIFdlIG5lZWQgdG8gcHVsbCAKLSAgICAgICAgICAgICAgICAvLyB0aGUgTWVzc2FnZSBkYXRhIG91dCBvZiB0aGVyZSBhbmQgc2V0IGl0IG9uIHRoZSBBeGlzMiAKLSAgICAgICAgICAgICAgICAvLyBNZXNzYWdlQ29udGV4dC4KLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZU1zZ0N0eCA9IGVpYy5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNSZXNwb25zZU1zZ0N0eCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlscy5wdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dChyZXNwb25zZU1zZ0N0eC5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0KLSAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wQ3R4ID0gYXhpc1Jlc3BvbnNlTXNnQ3R4LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBvcEN0eC5hZGRNZXNzYWdlQ29udGV4dChheGlzUmVzcG9uc2VNc2dDdHgpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGZhdWx0IG1lc3NhZ2UsIHdlIHdhbnQgdG8gdGhyb3cgaXQgYXMgYW4KLSAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gc28gdGhhdCB0aGUgdHJhbnNwb3J0IGNhbiBkbyB0aGUgYXBwcm9wcmlhdGUgdGhpbmdzCi0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlTXNnQ3R4LmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vUmF0aGVyIHRoYW4gY3JlYXRlIGEgbmV3IEF4aXNGYXVsdCwgd2Ugc2hvdWxkIHVzZSB0aGUgQXhpc0ZhdWx0IHRoYXQgd2FzCi0gICAgICAgICAgICAgICAgICAgIC8vY3JlYXRlZCBhdCB0aGUgY2F1c2VkQnkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlTXNnQ3R4LmdldENhdXNlZEJ5RXhjZXB0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0VG9SZXR1cm4gPSByZXNwb25zZU1zZ0N0eC5nZXRDYXVzZWRCeUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0VG9SZXR1cm4gPSBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciB3YXMgZGV0ZWN0ZWQgZHVyaW5nIEpBWFdTIHByb2Nlc3NpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvL1RoaXMgYXNzdW1lcyB0aGF0IHdlIGFyZSBvbiB0aGUgdWx0aW1hdGUgZXhlY3V0aW9uIHRocmVhZAotICAgICAgICAgICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIEF4aXNFbmdpbmUgZm9yIHRoZSByZXBvbnNlIGFuZCBzZW5kIGl0LgotICAgICAgICAgICAgICAgICAgICBBeGlzRW5naW5lLnNlbmQoYXhpc1Jlc3BvbnNlTXNnQ3R4KTsKLSAgICAgICAgICAgICAgICAgICAgLy9UaGlzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgb24gdGhlIHVsdGltYXRlIGV4ZWN1dGlvbiB0aHJlYWQKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5wZXJmb3JtQ29udGV4dENsZWFudXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIGF4aXNSZXNwb25zZU1zZ0N0eCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgdGhyb3cgYWY7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLnBlcmZvcm1UaHJlYWRDbGVhbnVwKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgYXhpc1JlcXVlc3RNc2dDdHgpOwotCi0gICAgICAgICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE8uICBUaGlzIGlzIHRocm93aW5nIGEgY2xpZW50IGV4Y2VwdGlvbiA/Ci0gICAgICAgICAgICAvLyBUT0RPIFdoeSBhcmUgd2UgcHJlc2VydmluZyB0aGUgc3RhY2sgaW5mb3JtYXRpb24gID8gIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNYWtlIGEgd2Vic2VydmljZSBleGNlcHRpb24gKHdoaWNoIHdpbGwgc3RyaXAgb3V0IGEgdW5uZWNlc3Nhcnkgc3R1ZmYpCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSA9IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBBeGlzRW5naW5lIGV4cGVjdHMgYW4gQXhpc0ZhdWx0Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KHdzZSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIG9uIHRoZSB1bHRpbWF0ZSBleGVjdXRpb24gdGhyZWFkCi0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybVRocmVhZENsZWFudXAoQ29uc3RhbnRzLlRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIGF4aXNSZXF1ZXN0TXNnQ3R4KTsKLQotICAgICAgICBpZiAoZmF1bHRUb1JldHVybiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBmYXVsdFRvUmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNZXBJbk9ubHkoU3RyaW5nIG1lcCkgewotICAgICAgICBib29sZWFuIGluT25seSA9IG1lcC5lcXVhbHMoV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkpIHx8Ci0gICAgICAgICAgICAgICAgbWVwLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZKSB8fAotICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZKSB8fAotICAgICAgICAgICAgICAgIG1lcC5lcXVhbHMoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSkgfHwKLSAgICAgICAgICAgICAgICBtZXAuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkpIHx8Ci0gICAgICAgICAgICAgICAgbWVwLmVxdWFscyhXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgICAgICByZXR1cm4gaW5Pbmx5OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHJlZ2lzdGVyZWQgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSBpbnN0YW5jZXMgYW5kIHNldHMgdGhlbQotICAgICAqIG9uIHRoZSBjdXJyZW50IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQuCi0gICAgICogQHBhcmFtIGVpYwotICAgICAqLwotICAgIHZvaWQgYWRkSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSB7Ci0gICAgICAgIGVpYy5zZXRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuZ2V0RmFjdG9yaWVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDYWNoZWRDbGFzc0xvYWRlcihvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkuZ2V0UGFyYW1ldGVyVmFsdWUob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvU2VydmVyQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvU2VydmVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzczZGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL1NlcnZlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotcHVibGljIGNsYXNzIFNlcnZlckNvbnN0YW50cyB7DQotDQotICAgIC8qKg0KLSAgICAgKiBBIGNvbnN0YW50IGZvciB0aGUgcHJvcGVydHkgdXNlZCB0byBkaXNhYmxlIHRoZSBzZXJ2ZXIgc2lkZQ0KLSAgICAgKiB0aHJlYWQgc3dpdGNoIG9uIGFzeW5jIGFuZCBvbmUgd2F5IHJlcXVlc3RzLiAgVGhpcyBwcm9wZXJ0eQ0KLSAgICAgKiBtdXN0IGJlIHNldCBvbiB0aGUgTWVzc2FnZUNvbnRleHQgZm9yIHRoZSByZXF1ZXN0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0RJU0FCTEVfVEhSRUFEX1NXSVRDSCA9ICJzZXJ2ZXJEaXNhYmxlVGhyZWFkU3dpdGNoIjsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvU2VydmljZUluc3RhbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWYzNDE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIENvZGUgd2lzaGluZyB0byBjcmVhdGUgd2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gaW5zdGFuY2VzIGZvciBKQVgtV1MNCi0gKiByZXF1ZXN0cyBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgdGhlDQotICogSkFYLVdTIEZhY3RvcnlSZWdpc3RyeS4gVGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeSB3aWxsIGJlIGxvb2tlZCB1cA0KLSAqIGFuZCB1dGlsaXplZCBieSB0aGUgSkFYLVdTIHJ1bnRpbWUgaW4gb3JkZXIgdG8gY3JlYXRlIG9yIG90aGVyd2lzZQ0KLSAqIG9idGFpbiBhIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGluc3RhbmNlIGZvciBhbnkgcmVxdWVzdC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZUluc3RhbmNlRmFjdG9yeSB7DQotDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlLCBvciBvdGhlcndpc2Ugb2J0YWluIGEgcmVmZXJlbmNlIHRvIGFuIA0KLSAgICAgICAgICogaW5zdGFuY2Ugb2YgYSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gVGhlIGV4cGVjdGF0aW9uDQotICAgICAgICAgKiBpcyB0aGF0IHVwb24gdGhlIGNvbXBsZXRpb24gb2YgdGhpcyBtZXRob2QgdGhlcmUgd2lsbCBiZSBhIHdlYg0KLSAgICAgICAgICogc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSBjcmV0YWVkIGFuZCBhbGwgbmVjZXNzYXJ5IHJlc291cmNlDQotICAgICAgICAgKiBpbmplY3Rpb24gd2lsbCBoYXZlIHRha2VuIHBsYWNlLg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBDbGFzcyBzZXJ2aWNlQ2xhc3MpIA0KLSAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOw0KLSAgICAgICAgDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9TZXJ2aWNlSW5zdGFuY2VGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL1NlcnZpY2VJbnN0YW5jZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDY1ZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL1NlcnZpY2VJbnN0YW5jZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3RvcnkuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YNCi0gKiBhIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBlYWNoIGluY29taW5nIHJlcXVlc3QNCi0gKiBpbnRvIHRoZSBKQVgtV1MgcnVudGltZS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW5zdGFuY2VGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2VJbnN0YW5jZUZhY3Rvcnkgew0KLSAgICAgICAgDQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2VydmljZUluc3RhbmNlRmFjdG9yeUltcGwuY2xhc3MpOw0KLQ0KLSAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgQ2xhc3Mgc2VydmljZUNsYXNzKSB0aHJvd3MgDQotICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiANCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIHdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGluc3RhbmNlIGZvcjogIiArIHNlcnZpY2VDbGFzcy4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkgZWxtZiA9IChFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KSANCi0gICAgICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGVsbSA9IGVsbWYuY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKCk7DQotICAgICAgICAgICAgcmV0dXJuIGVsbS5jcmVhdGVTZXJ2aWNlSW5zdGFuY2UocmVxdWVzdCwgc2VydmljZUNsYXNzKTsNCi0gICAgICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvRW5kcG9pbnREaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9FbmRwb2ludERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlYzRlZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9FbmRwb2ludERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZGlzcGF0Y2hlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludENhbGxiYWNrOwotCi0vKioKLSAqIFRoZSBFbmRwb2ludERpc3BhdGNoZXIgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIGRvaW5nIHRoZSBpbnZvY2F0aW9uIG9mIGFuCi0gKiBlbmRwb2ludHMgdGFyZ2V0IEphdmEgb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50RGlzcGF0Y2hlciB7Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2UgdGhlIHRhcmdldCBlbmRwb2ludCBzeW5jaHJvbm91c2x5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGludm9rZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB0aHJvd3MgRXhjZXB0aW9uOwotICAgIAotICAgIHB1YmxpYyB2b2lkIGludm9rZU9uZVdheShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBpbnZva2VBc3luYyhNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvSmF2YUJlYW5EaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9KYXZhQmVhbkRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlZmEyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9KYXZhQmVhbkRpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXI7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmcuQmluZGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC51dGlscy5Db250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS51dGlsLk1lc3NhZ2VDb250ZXh0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5NZXRob2RNYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5mYWN0b3J5Lk1ldGhvZE1hcnNoYWxsZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludENhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSW52b2NhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5TZXJ2ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5FeGVjdXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlNpbmdsZVRocmVhZGVkRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKLQotLyoqCi0gKiBUaGUgSmF2YUJlYW5EaXNwYXRjaGVyIGlzIHVzZWQgdG8gbWFuYWdlIGNyZWF0aW5nIGFuIGluc3RhbmNlIG9mIGEgSkFYLVdTIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KLSAqIGJlYW4gYW5kIGRpc3BhdGNoaW5nIHRoZSBpbmJvdW5kIHJlcXVlc3QgdG8gdGhhdCBpbnN0YW5jZS4KLSAqLwotcHVibGljIGNsYXNzIEphdmFCZWFuRGlzcGF0Y2hlciBleHRlbmRzIEphdmFEaXNwYXRjaGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKYXZhQmVhbkRpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgSmF2YUJlYW5EaXNwYXRjaGVyKENsYXNzIGltcGxDbGFzcywgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkgewotICAgICAgICBzdXBlcihpbXBsQ2xhc3MsIHNlcnZpY2VJbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnREaXNwYXRjaGVyI2ludm9rZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQpCi0gICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIHNlcnZpY2UgZW5kcG9pbnQ6ICIgKyBzZXJ2aWNlSW1wbENsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogdHdvIHdheSwgc3luYyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdGlhbGl6ZShtYyk7Ci0gICAgICAgIAotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0gVXRpbHMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24obWMpOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0W10gbWV0aG9kSW5wdXRQYXJhbXMgPSBjcmVhdGVSZXF1ZXN0UGFyYW1ldGVycyhtYyk7Ci0gICAgICAgIAotICAgICAgICBNZXRob2QgdGFyZ2V0ID0gZ2V0SmF2YU1ldGhvZChtYywgc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIE9wRGVzYyBpbmNsdWRlcyBldmVyeXRoaW5nIHdlIGtub3csIGluY2x1ZGluZyB0aGUgYWN0dWFsIG1ldGhvZAotICAgICAgICAgICAgLy8gb24gdGhlIHNlcnZpY2UgaW1wbCB3ZSB3aWxsIGRlbGVnYXRlIHRvOyBpdCB3YXMgc2V0IGJ5IGdldEphdmFNZXRob2QoLi4uKSBhYm92ZS4KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSmF2YUJlYW5EaXNwYXRjaGVyIGFib3V0IHRvIGludm9rZSB1c2luZyBPcGVyYXRpb25EZXNjOiAiICsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGhhdmUgdGhlIG1ldGhvZCB0aGF0IGlzIGdvaW5nIHRvIGJlIGludm9rZWQgYW5kIHRoZSBwYXJhbWV0ZXIgZGF0YSB0byBpbnZva2UgaXQgCi0gICAgICAgIC8vIHdpdGgsIHNvIGp1c3QgaW52b2tlIHRoZSBvcGVyYXRpb24uCi0gICAgICAgIGJvb2xlYW4gZmF1bHRUaHJvd24gPSBmYWxzZTsKLSAgICAgICAgVGhyb3dhYmxlIGZhdWx0ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0IG91dHB1dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBpbnZva2VUYXJnZXRPcGVyYXRpb24odGFyZ2V0LCBtZXRob2RJbnB1dFBhcmFtcyk7Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgZmF1bHRUaHJvd24gPSB0cnVlOwotICAgICAgICAgICAgZmF1bHQgPSBlOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBudWxsOwotICAgICAgICBpZiAob3BlcmF0aW9uRGVzYy5pc09uZVdheSgpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGlzIG9uZS13YXksIHRoZW4gd2UgY2FuIGp1c3QgcmV0dXJuIG51bGwgYmVjYXVzZQotICAgICAgICAgICAgLy8gd2UgY2Fubm90IGNyZWF0ZSBhIE1lc3NhZ2VDb250ZXh0IGZvciBvbmUtd2F5IHJlc3BvbnNlcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKGZhdWx0VGhyb3duKSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IGNyZWF0ZUZhdWx0UmVzcG9uc2UobWMsIG1jLmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpLCBmYXVsdCk7Ci0gICAgICAgICAgICBzZXRFeGNlcHRpb25Qcm9wZXJ0aWVzKHJlc3BvbnNlLCB0YXJnZXQsIGZhdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3BvbnNlID0gY3JlYXRlUmVzcG9uc2UobWMsIG1jLmdldE1lc3NhZ2UoKS5nZXRQcm90b2NvbCgpLCBtZXRob2RJbnB1dFBhcmFtcywgb3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW52b2tlT25lV2F5KE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIHNlcnZpY2UgZW5kcG9pbnQ6ICIgKyBzZXJ2aWNlSW1wbENsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogb25lIHdheSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5pdGlhbGl6ZShyZXF1ZXN0KTsKLSAgICAgICAgCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPSBVdGlscy5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihyZXF1ZXN0KTsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIG1ldGhvZElucHV0UGFyYW1zID0gY3JlYXRlUmVxdWVzdFBhcmFtZXRlcnMocmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICBNZXRob2QgdGFyZ2V0ID0gZ2V0SmF2YU1ldGhvZChyZXF1ZXN0LCBzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgT3BEZXNjIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgd2Uga25vdywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgbWV0aG9kCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2VydmljZSBpbXBsIHdlIHdpbGwgZGVsZWdhdGUgdG87IGl0IHdhcyBzZXQgYnkgZ2V0SmF2YU1ldGhvZCguLi4pIGFib3ZlLgotICAgICAgICAgICAgbG9nLmRlYnVnKCJKYXZhQmVhbkRpc3BhdGNoZXIgYWJvdXQgdG8gaW52b2tlIHVzaW5nIE9wZXJhdGlvbkRlc2M6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBvcGVyYXRpb25EZXNjLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IChFbmRwb2ludEludm9jYXRpb25Db250ZXh0KSByZXF1ZXN0LmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEFzeW5jSW52b2NhdGlvbldvcmtlciB3b3JrZXIgPSBuZXcgQXN5bmNJbnZvY2F0aW9uV29ya2VyKHRhcmdldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZElucHV0UGFyYW1zLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wsIGVpYyk7Ci0gICAgICAgIEZ1dHVyZVRhc2sgdGFzayA9IG5ldyBGdXR1cmVUYXNrPEFzeW5jSW52b2NhdGlvbldvcmtlcj4od29ya2VyKTsKLSAgICAgICAgCi0gICAgICAgIEV4ZWN1dG9yRmFjdG9yeSBlZiA9IChFeGVjdXRvckZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEV4ZWN1dG9yRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gZWYuZ2V0RXhlY3V0b3JJbnN0YW5jZShFeGVjdXRvckZhY3RvcnkuU0VSVkVSX0VYRUNVVE9SKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8gZGlzYWJsZSB0aHJlYWQgc3dpdGNoaW5nLCB0aGVuIHdlIGNhbiAKLSAgICAgICAgLy8gZG8gc28gYnkgdXNpbmcgYSBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yIGluc3RhbmNlIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gd29yayBvbiB0aGUgZXhpc3RpbmcgdGhyZWFkLgotICAgICAgICBCb29sZWFuIGRpc2FibGUgPSAoQm9vbGVhbikgCi0gICAgICAgICAgICByZXF1ZXN0LmdldFByb3BlcnR5KFNlcnZlckNvbnN0YW50cy5TRVJWRVJfRElTQUJMRV9USFJFQURfU1dJVENIKTsKLSAgICAgICAgaWYgKGRpc2FibGUgIT0gbnVsbCAmJiBkaXNhYmxlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZlciBzaWRlIHRocmVhZCBzd2l0Y2ggZGlzYWJsZWQuICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgRXhlY3V0b3IgdG8gdGhlIFNpbmdsZVRocmVhZGVkRXhlY3V0b3IuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGVjdXRvciA9IG5ldyBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOyAgICAgCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VBc3luYyhNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBzZXJ2aWNlIGVuZHBvaW50OiAiICsgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IHR3byB3YXksIGFzeW5jIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbml0aWFsaXplKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9IFV0aWxzLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgT2JqZWN0W10gbWV0aG9kSW5wdXRQYXJhbXMgPSBjcmVhdGVSZXF1ZXN0UGFyYW1ldGVycyhyZXF1ZXN0KTsKLSAgICAgICAgCi0gICAgICAgIE1ldGhvZCB0YXJnZXQgPSBnZXRKYXZhTWV0aG9kKHJlcXVlc3QsIHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSBPcERlc2MgaW5jbHVkZXMgZXZlcnl0aGluZyB3ZSBrbm93LCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBtZXRob2QKLSAgICAgICAgICAgIC8vIG9uIHRoZSBzZXJ2aWNlIGltcGwgd2Ugd2lsbCBkZWxlZ2F0ZSB0bzsgaXQgd2FzIHNldCBieSBnZXRKYXZhTWV0aG9kKC4uLikgYWJvdmUuCi0gICAgICAgICAgICBsb2cuZGVidWcoIkphdmFCZWFuRGlzcGF0Y2hlciBhYm91dCB0byBpbnZva2UgdXNpbmcgT3BlcmF0aW9uRGVzYzogIgotICAgICAgICAgICAgICAgICAgICArIG9wZXJhdGlvbkRlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gKEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQpIHJlcXVlc3QuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAKLSAgICAgICAgQXN5bmNJbnZvY2F0aW9uV29ya2VyIHdvcmtlciA9IG5ldyBBc3luY0ludm9jYXRpb25Xb3JrZXIodGFyZ2V0LCBtZXRob2RJbnB1dFBhcmFtcywgY2wsIGVpYyk7Ci0gICAgICAgIEZ1dHVyZVRhc2sgdGFzayA9IG5ldyBGdXR1cmVUYXNrPEFzeW5jSW52b2NhdGlvbldvcmtlcj4od29ya2VyKTsKLSAgICAgICAgCi0gICAgICAgIEV4ZWN1dG9yRmFjdG9yeSBlZiA9IChFeGVjdXRvckZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEV4ZWN1dG9yRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gZWYuZ2V0RXhlY3V0b3JJbnN0YW5jZShFeGVjdXRvckZhY3RvcnkuU0VSVkVSX0VYRUNVVE9SKTsKLSAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGhhcyBiZWVuIHNldCB0byBkaXNhYmxlIHRocmVhZCBzd2l0Y2hpbmcsIHRoZW4gd2UgY2FuIAotICAgICAgICAvLyBkbyBzbyBieSB1c2luZyBhIFNpbmdsZVRocmVhZGVkRXhlY3V0b3IgaW5zdGFuY2UgdG8gY29udGludWUgcHJvY2Vzc2luZwotICAgICAgICAvLyB3b3JrIG9uIHRoZSBleGlzdGluZyB0aHJlYWQuCi0gICAgICAgIEJvb2xlYW4gZGlzYWJsZSA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KFNlcnZlckNvbnN0YW50cy5TRVJWRVJfRElTQUJMRV9USFJFQURfU1dJVENIKTsKLSAgICAgICAgaWYgKGRpc2FibGUgIT0gbnVsbCAmJiBkaXNhYmxlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZlciBzaWRlIHRocmVhZCBzd2l0Y2ggZGlzYWJsZWQuICBTZXR0aW5nIEV4ZWN1dG9yIHRvIHRoZSBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhlY3V0b3IgPSBuZXcgU2luZ2xlVGhyZWFkZWRFeGVjdXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUodGFzayk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgbWMuc2V0T3BlcmF0aW9uTmFtZShtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgbWMuc2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oVXRpbHMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24obWMpKTsKLSAgICAgICAgZW5kcG9pbnREZXNjID0gbWMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjLmlzTVRPTUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbWMuZ2V0TWVzc2FnZSgpLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IFNPQVAgT3BlcmF0aW9uIFJlbGF0ZWQgcHJvcGVydGllcyBpbiBTT0FQTWVzc2FnZUNvbnRleHQuCi0gICAgICAgIENvbnRleHRVdGlscy5hZGRXU0RMUHJvcGVydGllcyhtYyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2RNYXJzaGFsbGVyIGdldE1ldGhvZE1hcnNoYWxsZXIoUHJvdG9jb2wgcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBzdHlsZU9uU0VJID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nU3R5bGUoKTsKLSAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgc3R5bGVPbk1ldGhvZCA9IG9wZXJhdGlvbkRlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpOwotICAgICAgICBpZiAoc3R5bGVPbk1ldGhvZCAhPSBudWxsICYmIHN0eWxlT25TRUkgIT0gc3R5bGVPbk1ldGhvZCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm94eUVycjIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGNoZWNrIGZvciBhIHN0b3JlZCBjbGFzc2xvYWRlciB0byBiZSB1c2VkIGFzIHRoZSBjYWNoZSBrZXkKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgICAgICBpZihtYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcikgbWMuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNBQ0hFX0NMQVNTTE9BREVSKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWV0aG9kTWFyc2hhbGxlckZhY3RvcnkuZ2V0TWFyc2hhbGxlcihvcGVyYXRpb25EZXNjLCBmYWxzZSwgY2wpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0SmF2YU1ldGhvZChNZXNzYWdlQ29udGV4dCBtYywgQ2xhc3Mgc2VydmljZUltcGxDbGFzcykgewotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA9IG1jLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChvcERlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwcm94eUVycjMiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXRob2QgcmV0dXJuTWV0aG9kID0gb3BEZXNjLmdldE1ldGhvZEZyb21TZXJ2aWNlSW1wbChzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgaWYgKHJldHVybk1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKYXZhQmVhbkRpc3BhdGNoZXJFcnIxIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybk1ldGhvZDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBjcmVhdGVSZXF1ZXN0UGFyYW1ldGVycyhNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgTWV0aG9kTWFyc2hhbGxlciBmb3IgdGhlIFdTREwgdHlwZS4gIFRoaXMgd2lsbCByZWZsZWN0Ci0gICAgICAgIC8vIHRoZSAic3R5bGUiIGFuZCAidXNlIiBvZiB0aGUgV1NETC4KLSAgICAgICAgUHJvdG9jb2wgcmVxdWVzdFByb3RvY29sID0gcmVxdWVzdC5nZXRNZXNzYWdlKCkuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgTWV0aG9kTWFyc2hhbGxlciBtZXRob2RNYXJzaGFsbGVyID0KLSAgICAgICAgICAgICAgICBnZXRNZXRob2RNYXJzaGFsbGVyKHJlcXVlc3RQcm90b2NvbCwgcmVxdWVzdC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgTWV0aG9kTWFyc2hhbGxlciB3aWxsIHJldHVybiB0aGUgaW5wdXQgcGFyYW1ldGVycyB0aGF0IGFyZSBuZWVkZWQgdG8gCi0gICAgICAgIC8vIGludm9rZSB0aGUgdGFyZ2V0IG1ldGhvZC4KLSAgICAgICAgT2JqZWN0W10gbWV0aG9kSW5wdXRQYXJhbXMgPQotICAgICAgICAgICAgICAgIG1ldGhvZE1hcnNoYWxsZXIuZGVtYXJzaGFsUmVxdWVzdChyZXF1ZXN0LmdldE1lc3NhZ2UoKSwgcmVxdWVzdC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJVbm1hcnNoYWxsZWQgcGFyYW1ldGVycyBmb3IgcmVxdWVzdCIpOwotICAgICAgICAgICAgaWYgKG1ldGhvZElucHV0UGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobWV0aG9kSW5wdXRQYXJhbXMubGVuZ3RoICsgIiBwYXJhbWV0ZXJzIHdlcmUgZm91bmQuIik7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbWV0aG9kSW5wdXRQYXJhbXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVSZXNwb25zZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBPYmplY3RbXSBpbnB1dCwgT2JqZWN0IG91dHB1dCkgewotICAgICAgICByZXR1cm4gY3JlYXRlUmVzcG9uc2UocmVxdWVzdCwgcmVxdWVzdC5nZXRNZXNzYWdlKCkuZ2V0UHJvdG9jb2woKSwgaW5wdXQsIG91dHB1dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVSZXNwb25zZShNZXNzYWdlQ29udGV4dCByZXF1ZXN0LCBQcm90b2NvbCBwLCBPYmplY3RbXSBwYXJhbXMsIE9iamVjdCBvdXRwdXQpIHsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9IHJlcXVlc3QuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG9wZXJhdGlvbkRlc2MuZ2V0TWV0aG9kRnJvbVNlcnZpY2VJbXBsKHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSByZXNwb25zZSBtZXNzYWdlLCB1c2luZyB0aGUgcHJvdG9jb2wgZnJvbSB0aGUKLSAgICAgICAgLy8gcmVxdWVzdCBtZXNzYWdlLgotICAgICAgICBNZXRob2RNYXJzaGFsbGVyIG1hcnNoYWxsZXIgPSBnZXRNZXRob2RNYXJzaGFsbGVyKHAsIHJlcXVlc3QuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KTsKLSAgICAgICAgTWVzc2FnZSBtID0gbnVsbDsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKSB7Ci0gICAgICAgICAgICBtID0gbWFyc2hhbGxlci5tYXJzaGFsUmVzcG9uc2UobnVsbCwgcGFyYW1zLCBvcGVyYXRpb25EZXNjLCBwKTsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtID0gbWFyc2hhbGxlci5tYXJzaGFsUmVzcG9uc2Uob3V0cHV0LCBwYXJhbXMsIG9wZXJhdGlvbkRlc2MsIHApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBXZSdsbCBuZWVkIGEgTWVzc2FnZUNvbnRleHQgY29uZmlndXJlZCBiYXNlZCBvbiB0aGUgcmVzcG9uc2UuCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gTWVzc2FnZUNvbnRleHRVdGlscy5jcmVhdGVSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOwotICAgICAgICByZXNwb25zZS5zZXRNZXNzYWdlKG0pOwotICAgICAgICAKLSAgICAgICAgLy8gRW5hYmxlIE1UT00gZm9yIHRoZSByZXNwb25zZSBpZiBuZWNlc3NhcnkuCi0gICAgICAgIC8vIChNVE9NIGlzIG5vdCBlbmFibGVkIGl0IHRoaXMgb3BlcmF0aW9uIGhhcyBTV0EgcGFyYW1ldGVycwotICAgICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MgPSByZXF1ZXN0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZXBEZXNjLmdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNNVE9NQmluZGluZyA9IGVwRGVzYy5pc01UT01FbmFibGVkKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNEb2luZ1NXQSA9IG0uaXNEb2luZ1NXQSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kcG9pbnREZXNjcmlwdGlvbiA9ICIgKyBlcERlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkJpbmRpbmdUeXBlID0gIiArIGJpbmRpbmdUeXBlKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiaXNNVE9NQmluZGluZyA9ICIgKyBpc01UT01CaW5kaW5nKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiaXNEb2luZ1NXQSA9ICIgKyBpc0RvaW5nU1dBKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW0uaXNEb2luZ1NXQSgpICYmIGlzTVRPTUJpbmRpbmcpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTVRPTSBlbmFibGVkIGZvciB0aGUgcmVzcG9uc2UgbWVzc2FnZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG0uc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhdWx0UmVzcG9uc2UocmVxdWVzdCwgcmVxdWVzdC5nZXRNZXNzYWdlKCkuZ2V0UHJvdG9jb2woKSwgdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIFByb3RvY29sIHAsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIAotICAgICAgICAvLyBjYWxsIHRoZSBJbnZvY2F0aW9uTGlzdGVuZXIgaW5zdGFuY2VzIGJlZm9yZSBtYXJzaGFsbGluZwotICAgICAgICAvLyB0aGUgZmF1bHQgaW50byBhIG1lc3NhZ2UKLSAgICAgICAgLy8gY2FsbCB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyBiZWZvcmUgbWFyc2hhbGxpbmcKLSAgICAgICAgLy8gdGhlIGZhdWx0IGludG8gYSBtZXNzYWdlCi0gICAgICAgIFRocm93YWJsZSBmYXVsdE1lc3NhZ2UgPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbih0LCByZXF1ZXN0KTsKLSAgICAgICAgaWYoZmF1bHRNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHQgPSBmYXVsdE1lc3NhZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1ldGhvZE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGdldE1ldGhvZE1hcnNoYWxsZXIocCwgcmVxdWVzdC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZSBtID0gbWFyc2hhbGxlci5tYXJzaGFsRmF1bHRSZXNwb25zZSh0LCByZXF1ZXN0LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCksIHApOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBNZXNzYWdlQ29udGV4dFV0aWxzLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQocmVxdWVzdCk7Ci0gICAgICAgIHJlc3BvbnNlLnNldE1lc3NhZ2UobSk7Ci0KLSAgICAgICAgQXhpc0ZhdWx0IGF4aXNGYXVsdCA9IG5ldyBBeGlzRmF1bHQoIlRoZSBlbmRwb2ludCByZXR1cm5lZCBhIGZhdWx0IHdoZW4gaW52b2tpbmcgdGhlIHRhcmdldCBvcGVyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQpOwotICAgICAgICAKLSAgICAgICAgcmVzcG9uc2Uuc2V0Q2F1c2VkQnlFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgCi0gICAgICAgIHNldEZhdWx0UmVzcG9uc2VBY3Rpb24odCwgcmVxdWVzdCwgcmVzcG9uc2UpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL0phdmFEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9KYXZhRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ2YzRiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL0phdmFEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50Q2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5JbnZvY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkludm9jYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5JbnZvY2F0aW9uTGlzdGVuZXJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5DbGFzc1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLS8qKgotICogSmF2YURpc3BhdGNoZXIgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgdG8gaW1wbGVtZW50IGFuIEVuZHBvaW50RGlzcGF0Y2hlciB0byBhCi0gKiBKYXZhIG9iamVjdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFEaXNwYXRjaGVyIGltcGxlbWVudHMgRW5kcG9pbnREaXNwYXRjaGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKYXZhRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3Mgc2VydmljZUltcGxDbGFzczsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZTsKLQotICAgIHByb3RlY3RlZCBKYXZhRGlzcGF0Y2hlcihDbGFzcyBpbXBsLCBPYmplY3Qgc2VydmljZUluc3RhbmNlKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUltcGxDbGFzcyA9IGltcGw7Ci0gICAgICAgIHRoaXMuc2VydmljZUluc3RhbmNlID0gc2VydmljZUluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBNZXNzYWdlQ29udGV4dCBpbnZva2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2VPbmVXYXkoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCk7Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlQXN5bmMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgRW5kcG9pbnRDYWxsYmFjayBjYWxsYmFjayk7Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZUNvbnRleHQgY3JlYXRlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgT2JqZWN0W10gaW5wdXQsIE9iamVjdCBvdXRwdXQpOwotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdFJlc3BvbnNlKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIFRocm93YWJsZSBmYXVsdCk7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIENsYXNzIGdldFNlcnZpY2VJbXBsZW1lbnRhdGlvbkNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUltcGxDbGFzczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIE9iamVjdCBpbnZva2VUYXJnZXRPcGVyYXRpb24oTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE9iamVjdCBvdXRwdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0ID0gbWV0aG9kLmludm9rZShzZXJ2aWNlSW5zdGFuY2UsIGFyZ3MpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBEZWxlZ2F0ZSBsb2dnaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlIFdlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXIuCi0gICAgICAgICAgICAvLyBVc2VycyBjYW4gc3BlY2lmaXkgZGVidWcgdHJhY2luZyBvZiB0aGUgV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlciB0byBzZWUKLSAgICAgICAgICAgIC8vIGFsbCBleGNlcHRpb25zLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBXZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyIG9ubHkgbG9ncyBlcnJvcnMgZm9yIG5vbi1jaGVja2VkIGV4Y2VwdGlvbnMKLSAgICAgICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb25Mb2dnZXIubG9nKG1ldGhvZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW1wbENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCBjbGFzcyBBc3luY0ludm9jYXRpb25Xb3JrZXIgaW1wbGVtZW50cyBDYWxsYWJsZSB7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIE1ldGhvZCBtZXRob2Q7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0W10gcGFyYW1zOwotICAgICAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgICAgICBwcml2YXRlIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEFzeW5jSW52b2NhdGlvbldvcmtlcihNZXRob2QgbSwgT2JqZWN0W10gcCwgQ2xhc3NMb2FkZXIgY2wsIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgY3R4KSB7Ci0gICAgICAgICAgICBtZXRob2QgPSBtOwotICAgICAgICAgICAgcGFyYW1zID0gcDsKLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gY2w7Ci0gICAgICAgICAgICBlaWMgPSBjdHg7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB0YXJnZXQgZW5kcG9pbnQgdmlhIHRoZSBhc3luYyB3b3JrZXIuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgcHJvcGVyIGNsYXNzIGxvYWRlciBzbyB0aGF0IHdlIGNhbiBwcm9wZXJseSBtYXJzaGFsbCB0aGUKLSAgICAgICAgICAgICAgICAvLyBvdXRib3VuZCByZXNwb25zZS4KLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCAmJiAoY2xhc3NMb2FkZXIgIT0gY3VycmVudExvYWRlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29udGV4dCBDbGFzc0xvYWRlciBzZXQgdG86IiArIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBtZXRob2QgdGhhdCBpcyBnb2luZyB0byBiZSBpbnZva2VkIGFuZCB0aGUgcGFyYW1ldGVyIGRhdGEgdG8gaW52b2tlIGl0IAotICAgICAgICAgICAgICAgIC8vIHdpdGgsIHNvIGp1c3QgaW52b2tlIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAgICAgICAgT2JqZWN0IG91dHB1dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmYXVsdFRocm93biA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFRocm93YWJsZSBmYXVsdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gaW52b2tlVGFyZ2V0T3BlcmF0aW9uKG1ldGhvZCwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdCA9IENsYXNzVXRpbHMuZ2V0Um9vdENhdXNlKGUpOwotICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgbmV3RmF1bHQgPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihmYXVsdCwgZWljKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobmV3RmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQgPSBuZXdGYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmYXVsdFRocm93biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBvbmUgd2F5IGludm9jYXRpb24sIHdlIGFyZSBkb25lIGFuZCBqdXN0IG5lZWQgdG8gcmV0dXJuLgotICAgICAgICAgICAgICAgIGlmIChlaWMuaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52b2NhdGlvbiBwYXR0ZXJuIHdhcyBvbmUgd2F5LCB3b3JrIGNvbXBsZXRlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXNwb25zZVJlYWR5KGVpYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGZhdWx0VGhyb3duKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZmF1bHQgd2FzIHRocm93biwgd2UgbmVlZCB0byBjcmVhdGUgYSBzbGlnaHRseSBkaWZmZXJlbnQKLSAgICAgICAgICAgICAgICAgICAgLy8gTWVzc2FnZUNvbnRleHQsIHRoYW4gaW4gdGhlIHJlc3BvbnNlIHBhdGguCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gY3JlYXRlRmF1bHRSZXNwb25zZShyZXF1ZXN0LCBmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEV4Y2VwdGlvblByb3BlcnRpZXMocmVzcG9uc2UsIG1ldGhvZCwgZmF1bHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBc3luYyBpbnZvY2F0aW9uIG9mIHRoZSBlbmRwb2ludCB3YXMgc3VjY2Vzc2Z1bC4gIENyZWF0aW5nIHJlc3BvbnNlIG1lc3NhZ2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjcmVhdGVSZXNwb25zZShyZXF1ZXN0LCBwYXJhbXMsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldEludm9jYXRpb25Db250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlaWMgPSAoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCkgcmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBlaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrID0gZWljLmdldENhbGxiYWNrKCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBoYW5kbGVGYXVsdCA9IHJlc3BvbnNlLmdldE1lc3NhZ2UoKS5pc0ZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gZmF1bHQgZGV0ZWN0ZWQgaW4gcmVzcG9uc2UgbWVzc2FnZSwgc2VuZGluZyBiYWNrIGFwcGxpY2F0aW9uIHJlc3BvbnNlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmhhbmRsZVJlc3BvbnNlKGVpYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQSBmYXVsdCB3YXMgZGV0ZWN0ZWQuICBTZW5kaW5nIGJhY2sgYSBmYXVsdCByZXNwb25zZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5oYW5kbGVGYXVsdFJlc3BvbnNlKGVpYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdGhyZWFkJ3MgQ2xhc3NMb2FkZXIgYmFjayB0byB3aGF0IGl0IG9yaWdpbmFsbHkgd2FzLgotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBjYWNoZWQgYXR0YWNobWVudHMgZnJvbSB0aGUgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlLgotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLmRlbGV0ZUF0dGFjaG1lbnRzKGVpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMuZGVsZXRlQXR0YWNobWVudHMoZWljLmdldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb25zIGFyZSBzd2FsbG93ZWQsIHRoZXJlIGlzIG5vIHJlYXNvbiB0byByZXRocm93IHRoZW0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBTiBVTkVYUEVDVEVEIEVSUk9SIE9DQ1VSUkVEIElOIFRIRSBBU1lOQyBXT1JLRVIgVEhSRUFEIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIGlzOiIgKyBlLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGlzIHdpbGwgY2FsbCB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyB0aGF0IHdlcmUgY2FsbGVkIGR1cmluZwotICAgICAqIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgZm9yIHRoaXMgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZXNwb25zZVJlYWR5KEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljKSAgewotICAgICAgICBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gZWljLmdldEludm9jYXRpb25MaXN0ZW5lcnMoKTsKLSAgICAgICAgaWYobGlzdGVuZXJMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEludm9jYXRpb25MaXN0ZW5lckJlYW4gYmVhbiA9IG5ldyBJbnZvY2F0aW9uTGlzdGVuZXJCZWFuKGVpYywgSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5TdGF0ZS5SRVNQT05TRSk7Ci0gICAgICAgICAgICBmb3IoSW52b2NhdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubm90aWZ5KGJlYW4pOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0RmF1bHRSZXNwb25zZUFjdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlKSB7Ci0gICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHJlcXVlc3QuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICBleGNlcHRpb24gPSBDbGFzc1V0aWxzLmdldFJvb3RDYXVzZShleGNlcHRpb24pOyAgICAgICAgCi0gICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG9wZXJhdGlvbi5nZXRGYXVsdEFjdGlvbihleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuc2V0V1NBQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiBpcyBhIGNoZWNrZWQgZXhjZXB0aW9uLgotICAgICAqIElmIHNvLCB0aGVuIHNldCB0aGUgbmFtZSBvZiB0aGUgY2hlY2tlZCBleGNlcHRpb24gb24gdGhlIHJlc3BvbnNlIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcGFyYW0gbSBNZXRob2QKLSAgICAgKiBAcGFyYW0gdCBUaHJvd2FibGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc2V0Q2hlY2tlZEV4Y2VwdGlvblByb3BlcnR5KE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlLCBNZXRob2QgbSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgLy8gR2V0IHRoZSByb290IG9mIHRoZSBleGNlcHRpb24KLSAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB0ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB0KS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSB0aHJvd24gZXhjZXB0aW9uIGlzIGNoZWNrZWQKLSAgICAgICAgQ2xhc3MgY2hlY2tlZEV4Y2VwdGlvbiA9IEphdmFVdGlscy5nZXRDaGVja2VkRXhjZXB0aW9uKHQsIG0pOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoZSBwcm9wZXJ0eQotICAgICAgICBpZiAoY2hlY2tlZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ0hFQ0tFRF9FWENFUFRJT04sIGNoZWNrZWRFeGNlcHRpb24uZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTdG9yZSB0aGUgYWN0dWFsIGV4Y2VwdGlvbiBvbiB0aGUgcmVzcG9uc2UgY29udGV4dAotICAgICAqIEBwYXJhbSByZXNwb25zZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSB0IFRocm93YWJsZQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZXRXZWJNZXRob2RFeGNlcHRpb25Qcm9wZXJ0eShNZXNzYWdlQ29udGV4dCByZXNwb25zZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgcm9vdCBvZiB0aGUgZXhjZXB0aW9uCi0gICAgICAgIGlmICh0IGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotICAgICAgICAgICAgdCA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgdCkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkpBWFdTX1dFQk1FVEhPRF9FWENFUFRJT04sIHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleGNlcHRpb24gaXMgc3RvcmVkIG9uIHRoZSBvdXRib3VuZCByZXNwb25zZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIG0gTWV0aG9kCi0gICAgICogQHBhcmFtIHQgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldEV4Y2VwdGlvblByb3BlcnRpZXMoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCkgewotICAgICAgICBzZXRDaGVja2VkRXhjZXB0aW9uUHJvcGVydHkocmVzcG9uc2UsIG0sIHQpOwotICAgICAgICBzZXRXZWJNZXRob2RFeGNlcHRpb25Qcm9wZXJ0eShyZXNwb25zZSwgdCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvUHJvdmlkZXJEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9Qcm92aWRlckRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyYThjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZGlzcGF0Y2hlci9Qcm92aWRlckRpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LnV0aWxzLkNvbnRleHRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLnV0aWwuTWVzc2FnZUNvbnRleHRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWFyc2hhbGxlci5pbXBsLmFsdC5NZXRob2RNYXJzaGFsbGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLkJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLk9NQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkRhdGFTb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuT01CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNvdXJjZUJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxTdHJpbmdCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuWE1MRmF1bHRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5FbmRwb2ludENhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSW52b2NhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5TZXJ2ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkNsYXNzVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkRhdGFTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuU2luZ2xlVGhyZWFkZWRFeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOwotCi0vKioKLSAqIFRoZSBQcm92aWRlckRpc3BhdGNoZXIgaXMgdXNlZCB0byBpbnZva2UgaW5zdGFuY2VzIG9mIGEgdGFyZ2V0IGVuZHBvaW50IHRoYXQgaW1wbGVtZW50IHRoZSB7QGxpbmsKLSAqIGphdmF4LnhtbC53cy5Qcm92aWRlcn0gaW50ZXJmYWNlLgotICogPHAvPgotICogVGhlIFByb3ZpZGVyPFQ+IGlzIGEgZ2VuZXJpYyBjbGFzcywgd2l0aCBjZXJ0YWluIHJlc3RyaWN0aW9ucyBvbiB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIFQuICBUaGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHR5cGVzOgotICogPHAvPgotICogamF2YS5sYW5nLlN0cmluZyBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UKLSAqIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm92aWRlckRpc3BhdGNoZXIgZXh0ZW5kcyBKYXZhRGlzcGF0Y2hlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJvdmlkZXJEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQmxvY2tGYWN0b3J5IF9ibG9ja0ZhY3RvcnkgPSBudWxsOyAgLy8gQ2FjaGUgdGhlIGJsb2NrIGZhY3RvcnkKLSAgICBwcml2YXRlIENsYXNzIF9wcm92aWRlclR5cGUgPSBudWxsOyAgICAgICAgLy8gQ2FjaGUgdGhlIHByb3ZpZGVyIHR5cGUKLSAgICBwcml2YXRlIFByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UgPSBudWxsOwotICAgIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKLSAgICBwcml2YXRlIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gX2NsYXNzCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBQcm92aWRlckRpc3BhdGNoZXIoQ2xhc3MgX2NsYXNzLCBPYmplY3Qgc2VydmljZUluc3RhbmNlKSB7Ci0gICAgICAgIHN1cGVyKF9jbGFzcywgc2VydmljZUluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLkVuZHBvaW50RGlzcGF0Y2hlciNleGVjdXRlKCkKLSAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBpbnZva2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcmVwYXJpbmcgdG8gaW52b2tlIGphdmF4LnhtbC53cy5Qcm92aWRlciBiYXNlZCBlbmRwb2ludCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IHR3byB3YXksIHN5bmMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGluaXRpYWxpemUocmVxdWVzdCk7Ci0KLSAgICAgICAgcHJvdmlkZXJJbnN0YW5jZSA9IGdldFByb3ZpZGVySW5zdGFuY2UoKTsKLQotICAgICAgICBPYmplY3QgcGFyYW0gPSBjcmVhdGVSZXF1ZXN0UGFyYW1ldGVycyhyZXF1ZXN0KTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIENsYXNzIHByb3ZpZGVyVHlwZSA9IGdldFByb3ZpZGVyVHlwZSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGlucHV0ID0gcHJvdmlkZXJUeXBlLmNhc3QocGFyYW0pOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyBQcm92aWRlcjwiICsgcHJvdmlkZXJUeXBlLmdldE5hbWUoKSArICI+Iik7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIHR5cGU6ICIgKyBpbnB1dC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcmFtZXRlciBpcyBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbnZva2UgdGhlIGFjdHVhbCBQcm92aWRlci5pbnZva2UoKSBtZXRob2QKLSAgICAgICAgYm9vbGVhbiBmYXVsdFRocm93biA9IGZhbHNlOwotICAgICAgICBUaHJvd2FibGUgZmF1bHQgPSBudWxsOwotICAgICAgICBPYmplY3RbXSBpbnB1dCA9IG5ldyBPYmplY3RbXSB7cGFyYW19OwotICAgICAgICBPYmplY3QgcmVzcG9uc2VQYXJhbVZhbHVlID0gbnVsbDsKLSAgICAgICAgTWV0aG9kIHRhcmdldCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0YXJnZXQgPSBnZXRKYXZhTWV0aG9kKCk7Ci0gICAgICAgICAgICByZXNwb25zZVBhcmFtVmFsdWUgPSBpbnZva2VUYXJnZXRPcGVyYXRpb24odGFyZ2V0LCBpbnB1dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBmYXVsdCA9IENsYXNzVXRpbHMuZ2V0Um9vdENhdXNlKGUpOwotICAgICAgICAgICAgZmF1bHRUaHJvd24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4ID0gbnVsbDsKLSAgICAgICAgaWYgKGZhdWx0VGhyb3duKSB7Ci0gICAgICAgICAgICAvLyBJZiBhIGZhdWx0IHdhcyB0aHJvd24sIHdlIG5lZWQgdG8gY3JlYXRlIGEgc2xpZ2h0bHkgZGlmZmVyZW50Ci0gICAgICAgICAgICAvLyBNZXNzYWdlQ29udGV4dCwgdGhhbiBpbiB0aGUgcmVzcG9uc2UgcGF0aC4KLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4ID0gY3JlYXRlRmF1bHRSZXNwb25zZShyZXF1ZXN0LCBmYXVsdCk7Ci0gICAgICAgICAgICBzZXRFeGNlcHRpb25Qcm9wZXJ0aWVzKHJlc3BvbnNlTXNnQ3R4LCB0YXJnZXQsIGZhdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3BvbnNlTXNnQ3R4ID0gY3JlYXRlUmVzcG9uc2UocmVxdWVzdCwgaW5wdXQsIHJlc3BvbnNlUGFyYW1WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcG9uc2VNc2dDdHg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGludm9rZU9uZVdheShNZXNzYWdlQ29udGV4dCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcmVwYXJpbmcgdG8gaW52b2tlIGphdmF4LnhtbC53cy5Qcm92aWRlciBiYXNlZCBlbmRwb2ludCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZvY2F0aW9uIHBhdHRlcm46IG9uZSB3YXkiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6ZShyZXF1ZXN0KTsKLQotICAgICAgICBwcm92aWRlckluc3RhbmNlID0gZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotCi0gICAgICAgIE9iamVjdCBwYXJhbSA9IGNyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJzKHJlcXVlc3QpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgQ2xhc3MgcHJvdmlkZXJUeXBlID0gZ2V0UHJvdmlkZXJUeXBlKCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgaW5wdXQgPSBwcm92aWRlclR5cGUuY2FzdChwYXJhbSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIFByb3ZpZGVyPCIgKyBwcm92aWRlclR5cGUuZ2V0TmFtZSgpICsgIj4iKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJhbWV0ZXIgdHlwZTogIiArIGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEV4ZWN1dG9yRmFjdG9yeSBlZiA9IChFeGVjdXRvckZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEV4ZWN1dG9yRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gZWYuZ2V0RXhlY3V0b3JJbnN0YW5jZShFeGVjdXRvckZhY3RvcnkuU0VSVkVSX0VYRUNVVE9SKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8gZGlzYWJsZSB0aHJlYWQgc3dpdGNoaW5nLCB0aGVuIHdlIGNhbiAKLSAgICAgICAgLy8gZG8gc28gYnkgdXNpbmcgYSBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yIGluc3RhbmNlIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gd29yayBvbiB0aGUgZXhpc3RpbmcgdGhyZWFkLgotICAgICAgICBCb29sZWFuIGRpc2FibGUgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShTZXJ2ZXJDb25zdGFudHMuU0VSVkVSX0RJU0FCTEVfVEhSRUFEX1NXSVRDSCk7Ci0gICAgICAgIGlmIChkaXNhYmxlICE9IG51bGwgJiYgZGlzYWJsZS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2ZXIgc2lkZSB0aHJlYWQgc3dpdGNoIGRpc2FibGVkLiAgU2V0dGluZyBFeGVjdXRvciB0byB0aGUgU2luZ2xlVGhyZWFkZWRFeGVjdXRvci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4ZWN1dG9yID0gbmV3IFNpbmdsZVRocmVhZGVkRXhlY3V0b3IoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWV0aG9kIG0gPSBnZXRKYXZhTWV0aG9kKCk7Ci0gICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbXSB7cGFyYW19OwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSAoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCkgcmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBBc3luY0ludm9jYXRpb25Xb3JrZXIgd29ya2VyID0gbmV3IEFzeW5jSW52b2NhdGlvbldvcmtlcihtLCBwYXJhbXMsIGNsLCBlaWMpOwotICAgICAgICBGdXR1cmVUYXNrIHRhc2sgPSBuZXcgRnV0dXJlVGFzazxBc3luY0ludm9jYXRpb25Xb3JrZXI+KHdvcmtlcik7Ci0gICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUodGFzayk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGludm9rZUFzeW5jKE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QsIEVuZHBvaW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlByZXBhcmluZyB0byBpbnZva2UgamF2YXgueG1sLndzLlByb3ZpZGVyIGJhc2VkIGVuZHBvaW50Iik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb24gcGF0dGVybjogdHdvIHdheSwgYXN5bmMiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW5pdGlhbGl6ZShyZXF1ZXN0KTsKLQotICAgICAgICBwcm92aWRlckluc3RhbmNlID0gZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotCi0gICAgICAgIE9iamVjdCBwYXJhbSA9IGNyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJzKHJlcXVlc3QpOwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgQ2xhc3MgcHJvdmlkZXJUeXBlID0gZ2V0UHJvdmlkZXJUeXBlKCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgaW5wdXQgPSBwcm92aWRlclR5cGUuY2FzdChwYXJhbSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkludm9raW5nIFByb3ZpZGVyPCIgKyBwcm92aWRlclR5cGUuZ2V0TmFtZSgpICsgIj4iKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJhbWV0ZXIgdHlwZTogIiArIGlucHV0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEV4ZWN1dG9yRmFjdG9yeSBlZiA9IChFeGVjdXRvckZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEV4ZWN1dG9yRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gZWYuZ2V0RXhlY3V0b3JJbnN0YW5jZShFeGVjdXRvckZhY3RvcnkuU0VSVkVSX0VYRUNVVE9SKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8gZGlzYWJsZSB0aHJlYWQgc3dpdGNoaW5nLCB0aGVuIHdlIGNhbiAKLSAgICAgICAgLy8gZG8gc28gYnkgdXNpbmcgYSBTaW5nbGVUaHJlYWRlZEV4ZWN1dG9yIGluc3RhbmNlIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKLSAgICAgICAgLy8gd29yayBvbiB0aGUgZXhpc3RpbmcgdGhyZWFkLgotICAgICAgICBCb29sZWFuIGRpc2FibGUgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShTZXJ2ZXJDb25zdGFudHMuU0VSVkVSX0RJU0FCTEVfVEhSRUFEX1NXSVRDSCk7Ci0gICAgICAgIGlmIChkaXNhYmxlICE9IG51bGwgJiYgZGlzYWJsZS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2ZXIgc2lkZSB0aHJlYWQgc3dpdGNoIGRpc2FibGVkLiAgU2V0dGluZyBFeGVjdXRvciB0byB0aGUgU2luZ2xlVGhyZWFkZWRFeGVjdXRvci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4ZWN1dG9yID0gbmV3IFNpbmdsZVRocmVhZGVkRXhlY3V0b3IoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWV0aG9kIG0gPSBnZXRKYXZhTWV0aG9kKCk7Ci0gICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbXSB7cGFyYW19OwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSAoRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCkgcmVxdWVzdC5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIAotICAgICAgICBBc3luY0ludm9jYXRpb25Xb3JrZXIgd29ya2VyID0gbmV3IEFzeW5jSW52b2NhdGlvbldvcmtlcihtLCBwYXJhbXMsIGNsLCBlaWMpOwotICAgICAgICBGdXR1cmVUYXNrIHRhc2sgPSBuZXcgRnV0dXJlVGFzazxBc3luY0ludm9jYXRpb25Xb3JrZXI+KHdvcmtlcik7Ci0gICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUodGFzayk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUmVxdWVzdFBhcmFtZXRlcnMoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCkgewotICAgICAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGtub3cgd2hhdCBraW5kIG9mIFByb3ZpZGVyIGluc3RhbmNlIHdlJ3JlIGdvaW5nCi0gICAgICAgIC8vIHRvIGJlIGludm9raW5nIGFnYWluc3QKLSAgICAgICAgQ2xhc3MgcHJvdmlkZXJUeXBlID0gZ2V0UHJvdmlkZXJUeXBlKCk7Ci0KLSAgICAgICAgLy8gUkVWSUVXOiBUaGlzIGFzc3VtZXMgdGhlcmUgaXMgb25seSBvbmUgZW5kcG9pbnQgZGVzY3JpcHRpb24gb24gdGhlIHNlcnZpY2UuICBJcyB0aGF0IGFsd2F5cyB0aGUgY2FzZT8KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSByZXF1ZXN0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgICAgICAvLyBOb3cgdGhhdCB3ZSBrbm93IHdoYXQga2luZCBvZiBQcm92aWRlciB3ZSBoYXZlLCB3ZSBjYW4gY3JlYXRlIHRoZSAKLSAgICAgICAgLy8gcmlnaHQgdHlwZSBvZiBCbG9jayBmb3IgdGhlIHJlcXVlc3QgcGFyYW1ldGVyIGRhdGEKLSAgICAgICAgT2JqZWN0IHJlcXVlc3RQYXJhbVZhbHVlID0gbnVsbDsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gcmVxdWVzdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gRW5hYmxlIE1UT00gaWYgaW5kaWNhdGVkCi0gICAgICAgICAgICBpZiAoZW5kcG9pbnREZXNjLmlzTVRPTUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNhdmUgb2ZmIHRoZSBwcm90b2NvbCBpbmZvIHNvIHdlIGNhbiB1c2UgaXQgd2hlbiBjcmVhdGluZyB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KLSAgICAgICAgICAgIFByb3RvY29sIG1lc3NhZ2VQcm90b2NvbCA9IG1lc3NhZ2UuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICAgIC8vIERldGVybWluZSB3aGF0IHR5cGUgYmxvY2tzIHdlIHdhbnQgdG8gY3JlYXRlIChTdHJpbmcsIFNvdXJjZSwgZXRjKSBiYXNlZCBvbiBQcm92aWRlciBUeXBlCi0gICAgICAgICAgICBCbG9ja0ZhY3RvcnkgZmFjdG9yeSA9IGNyZWF0ZUJsb2NrRmFjdG9yeShwcm92aWRlclR5cGUpOwotCi0KLSAgICAgICAgICAgIFNlcnZpY2UuTW9kZSBwcm92aWRlclNlcnZpY2VNb2RlID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VNb2RlKCk7Ci0KLSAgICAgICAgICAgIGlmIChwcm92aWRlclNlcnZpY2VNb2RlICE9IG51bGwgJiYgcHJvdmlkZXJTZXJ2aWNlTW9kZSA9PSBTZXJ2aWNlLk1vZGUuTUVTU0FHRSkgewotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlclR5cGUuZXF1YWxzKFNPQVBNZXNzYWdlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gZ2V0IHRoZSBTT0FQTWVzc2FnZSBkaXJlY3RseSBmcm9tIHRoZSBtZXNzYWdlIGl0c2VsZgotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvdmlkZXIgVHlwZSBpcyBTT0FQTWVzc2FnZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTnVtYmVyIE1lc3NhZ2UgYXR0YWNobWVudHM9IiArIG1lc3NhZ2UuZ2V0QXR0YWNobWVudElEcygpLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyVHlwZS5lcXVhbHMoT01FbGVtZW50LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGFyYW1WYWx1ZSA9IG1lc3NhZ2UuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGFyYW1WYWx1ZSA9IG1lc3NhZ2UuZ2V0VmFsdWUobnVsbCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0UGFyYW1WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgYXJlIG5vIGVsZW1lbnRzIHRvIHVubWFyc2hhbC4gIFByb3ZpZGVyRGlzcGF0Y2ggd2lsbCBwYXNzIGEgbnVsbCBhcyBpbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QgTUVTU0FHRSwgdGhlbiBpdCBpcyBQQVlMT0FEICh3aGljaCBpcyB0aGUgZGVmYXVsdCk7IG9ubHkgd29yayB3aXRoIHRoZSBib2R5IAotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gbWVzc2FnZS5nZXRCb2R5QmxvY2sobnVsbCwgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJsb2NrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbVZhbHVlID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFBhcmFtVmFsdWUgaW5zdGFuY2VvZiBPTUJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBhcmFtVmFsdWUgPSAoKE9NQmxvY2spcmVxdWVzdFBhcmFtVmFsdWUpLmdldE9NRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBib2R5IGJsb2NrcyBpbiBTT0FQTWVzc2FnZSwgQ2FsbGluZyBwcm92aWRlciBtZXRob2Qgd2l0aCBudWxsIGlucHV0IHBhcmFtZXRlcnMiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGFyYW1WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlcXVlc3RQYXJhbVZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgT2JqZWN0W10gaW5wdXQsIE9iamVjdCBvdXRwdXQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IGNyZWF0ZVJlc3BvbnNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZSBtOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlbmRwb2ludERlc2MgPSByZXF1ZXN0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIFNlcnZpY2UuTW9kZSBtb2RlID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VNb2RlKCk7Ci0gICAgICAgICAgICBtID0gY3JlYXRlTWVzc2FnZUZyb21WYWx1ZShvdXRwdXQsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCksIG1vZGUpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaHJvd2FibGUgY2F1Z2h0Iik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaHJvd2FibGU9IiArIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNwb25zZSBtZXNzYWdlIGlzIGNyZWF0ZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEVuYWJsZSBNVE9NIGlmIGluZGljYXRlZCAKLSAgICAgICAgICAgIGlmIChlbmRwb2ludERlc2MuaXNNVE9NRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICByZXNwb25zZSA9IE1lc3NhZ2VDb250ZXh0VXRpbHMuY3JlYXRlUmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsKLSAgICAgICAgICAgIGluaXRNZXNzYWdlQ29udGV4dChyZXNwb25zZSwgbSwgb3V0cHV0KTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRocm93YWJsZSBjYXVnaHQgY3JlYXRpbmcgUmVzcG9uc2UgTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRocm93YWJsZT0iICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkVuZCBjcmVhdGVSZXNwb25zZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCByZXNwb25zZU1zZ0N0eCwgTWVzc2FnZSBtLCBPYmplY3Qgb3V0cHV0KSB7Ci0gICAgICAgIHJlc3BvbnNlTXNnQ3R4LnNldE1lc3NhZ2UobSk7Ci0gICAgICAgIGlmKG91dHB1dCBpbnN0YW5jZW9mIERhdGFTb3VyY2UpewotICAgICAgICAgICAgcmVzcG9uc2VNc2dDdHguc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9GT1JNQVRURVIsIAotICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YVNvdXJjZUZvcm1hdHRlcigoKERhdGFTb3VyY2Upb3V0cHV0KS5nZXRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUZhdWx0UmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVxdWVzdCwgVGhyb3dhYmxlIGZhdWx0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGUgWE1MRmF1bHQgZm9yIGNyZWF0ZUZhdWx0UmVzcG9uc2UiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2FsbCB0aGUgSW52b2NhdGlvbkxpc3RlbmVyIGluc3RhbmNlcyBiZWZvcmUgbWFyc2hhbGxpbmcKLSAgICAgICAgLy8gdGhlIGZhdWx0IGludG8gYSBtZXNzYWdlCi0gICAgICAgIFRocm93YWJsZSBmYXVsdE1lc3NhZ2UgPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihmYXVsdCwgcmVxdWVzdCk7Ci0gICAgICAgIGlmKGZhdWx0TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdCA9IGZhdWx0TWVzc2FnZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWVzc2FnZSBtOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSByZXF1ZXN0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIFNlcnZpY2UuTW9kZSBtb2RlID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VNb2RlKCk7Ci0gICAgICAgICAgICBYTUxGYXVsdCB4bWxGYXVsdCA9IE1ldGhvZE1hcnNoYWxsZXJVdGlscy5jcmVhdGVYTUxGYXVsdEZyb21TeXN0ZW1FeGNlcHRpb24oZmF1bHQpOwotICAgICAgICAgICAgbSA9IGNyZWF0ZU1lc3NhZ2VGcm9tVmFsdWUoeG1sRmF1bHQsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCksIG1vZGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVzcG9uc2UgPSBNZXNzYWdlQ29udGV4dFV0aWxzLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQocmVxdWVzdCk7Ci0gICAgICAgIHJlc3BvbnNlLnNldE1lc3NhZ2UobSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgZW5kcG9pbnQgcHJvdmlkZXIgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEByZXR1cm4gUHJvdmlkZXIKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQcm92aWRlciBnZXRQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm92aWRlciBwID0gZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotICAgICAgICBzZXRQcm92aWRlcihwKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbmRwb2ludCBwcm92aWRlciBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIF9wcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKFByb3ZpZGVyIF9wcm92aWRlcikgewotICAgICAgICB0aGlzLnByb3ZpZGVySW5zdGFuY2UgPSBfcHJvdmlkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwYXJhbWV0ZXIgZm9yIGEgZ2l2ZW4gZW5kcG9pbnQgaW52b2NhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHBhcmFtZXRlciBmb3IgYSBnaXZlbiBlbmRwb2ludCBpbnZvY2F0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtc2c7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIENyZWF0ZSBhIE1lc3NhZ2Ugb2JqZWN0IG91dCBvZiB0aGUgdmFsdWUgb2JqZWN0IHRoYXQgd2FzIHJldHVybmVkLgotICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2VGcm9tVmFsdWUoT2JqZWN0IHZhbHVlLCBQcm90b2NvbCBwcm90b2NvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZS5Nb2RlIG1vZGUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtc2dGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAoTWVzc2FnZUZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBwcm92aWRlclR5cGUgPSBnZXRQcm92aWRlclR5cGUoKTsKLSAgICAgICAgICAgIEJsb2NrRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlQmxvY2tGYWN0b3J5KHByb3ZpZGVyVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhNTEZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbWVzc2FnZSBmcm9tIFhNTEZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtc2dGYWN0b3J5LmNyZWF0ZShwcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRYTUxGYXVsdCgoWE1MRmF1bHQpdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlICE9IG51bGwgJiYgbW9kZSA9PSBTZXJ2aWNlLk1vZGUuTUVTU0FHRSkgewotICAgICAgICAgICAgICAgIC8vIEZvciBNRVNTQUdFIG1vZGUsIHdvcmsgd2l0aCB0aGUgZW50aXJlIG1lc3NhZ2UsIEhlYWRlcnMgYW5kIEJvZHkKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGJhc2VkIG9uIGxvZ2ljIGluIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlhNTERpc3BhdGNoLmNyZWF0ZU1lc3NhZ2VGcm9tQnVuZGxlKCkKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTT0FQTWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbWVzc2FnZSBmcm9tIFNPQVBNZXNzYWdlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1zZ0ZhY3RvcnkuY3JlYXRlRnJvbSgoU09BUE1lc3NhZ2UpdmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGZyb20gdGhlIHByb3ZpZGVyIGlzIGFscmVhZHkgYW4gU09BUEVudmVsb3BlIE9NRWxlbWVudCwgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gaXQgZG9lc24ndCBuZWVkIHRvIGJlIHBhcnNlZCBpbnRvIG9uZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG1lc3NhZ2UgZnJvbSBPTUVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gbXNnRmFjdG9yeS5jcmVhdGVGcm9tKChTT0FQRW52ZWxvcGUpIHZhbHVlLCBwcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG1lc3NhZ2UgdXNpbmcgIiArIGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKHZhbHVlLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1zZ0ZhY3RvcnkuY3JlYXRlRnJvbShibG9jaywgbnVsbCwgcHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUEFZTE9BRCBtb2RlIGRlYWxzIG9ubHkgd2l0aCB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBtZXNzYWdlIChwYXlsb2FkKSB1c2luZyAiICsgZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJsb2NrIGJsb2NrID0gZmFjdG9yeS5jcmVhdGVGcm9tKHZhbHVlLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gbXNnRmFjdG9yeS5jcmVhdGUocHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChYTUxGYXVsdFV0aWxzLmNvbnRhaW5zRmF1bHQoYmxvY2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgcmVzcG9uc2UgYmxvY2sgY3JlYXRlZCBjb250YWluZWQgYSBmYXVsdC4gIENvbnZlcnRpbmcgdG8gYW4gWE1MRmF1bHQgb2JqZWN0LiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBQcm92aWRlciByZXR1cm5lZCBhIGZhdWx0LCB0aGVuIGxldCdzIGNvcnJlY3QgdGhlIG91dHB1dCBhbmQgCi0gICAgICAgICAgICAgICAgICAgIC8vIHB1dCBhbiBYTUxGYXVsdCBvbiB0aGUgTWVzc2FnZS4gIFRoaXMgbWFrZXMgaXQgZWFzaWVyIGZvciBkb3duc3RyZWFtIAotICAgICAgICAgICAgICAgICAgICAvLyBjb25zdW1lcnMgdG8gZ2V0IHRoZSBTT0FQRmF1bHQgZnJvbSB0aGUgT00gU09BUEVudmVsb3BlLgotICAgICAgICAgICAgICAgICAgICBYTUxGYXVsdCBmYXVsdCA9IFhNTEZhdWx0VXRpbHMuY3JlYXRlWE1MRmF1bHQoYmxvY2ssIG1lc3NhZ2UuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0WE1MRmF1bHQoZmF1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBjcmVhdGUgYSBtZXNzYWdlIGFib3ZlIChiZWNhdXNlIHRoZXJlIHdhcyBubyB2YWx1ZSksIGNyZWF0ZSBvbmUgaGVyZQotICAgICAgICAgICAgbWVzc2FnZSA9IG1zZ0ZhY3RvcnkuY3JlYXRlKHByb3RvY29sKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogRGV0ZXJtaW5lIHRoZSBQcm92aWRlciB0eXBlIGZvciB0aGlzIGluc3RhbmNlCi0gICAgICAqLwotICAgIHByaXZhdGUgUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBnZXRQcm92aWRlclR5cGUoKTsKLQotICAgICAgICBpZiAoIWlzVmFsaWRQcm92aWRlclR5cGUoY2xhenopKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIFRoaXMgd2lsbCBjaGFuZ2Ugb25jZSBkZXBsb3ltZW50IGNvZGUgaXQgaW4gcGxhY2UKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSW52YWxpZFByb3ZpZGVyIiwgY2xhenouZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MpIHsKLSAgICAgICAgICAgIHByb3ZpZGVyID0gKFByb3ZpZGVyPFN0cmluZz4pc2VydmljZUluc3RhbmNlOwotICAgICAgICB9IGVsc2UgaWYgKGNsYXp6ID09IFNvdXJjZS5jbGFzcykgewotICAgICAgICAgICAgcHJvdmlkZXIgPSAoUHJvdmlkZXI8U291cmNlPilzZXJ2aWNlSW5zdGFuY2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gU09BUE1lc3NhZ2UuY2xhc3MpIHsKLSAgICAgICAgICAgIHByb3ZpZGVyID0gKFByb3ZpZGVyPFNPQVBNZXNzYWdlPilzZXJ2aWNlSW5zdGFuY2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2xhenogPT0gRGF0YVNvdXJjZS5jbGFzcykgewotICAgICAgICAgICAgcHJvdmlkZXIgPSAoUHJvdmlkZXI8RGF0YVNvdXJjZT4pc2VydmljZUluc3RhbmNlOwotICAgICAgICB9IGVsc2UgaWYgKGNsYXp6ID09IE9NRWxlbWVudC5jbGFzcykgewotICAgICAgICAgICAgcHJvdmlkZXIgPSAoUHJvdmlkZXI8T01FbGVtZW50PilzZXJ2aWNlSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSW52YWxpZFByb3ZpZGVyQ3JlYXRlIiwgY2xhenouZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJvdmlkZXI7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEdldCB0aGUgcHJvdmlkZXIgdHlwZSBmcm9tIGEgZ2l2ZW4gaW1wbGVtZW50aW9uIGNsYXNzIGluc3RhbmNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzczw/PiBnZXRQcm92aWRlclR5cGUoKSB7Ci0KLSAgICAgICAgaWYgKF9wcm92aWRlclR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm92aWRlclR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgQ2xhc3MgcHJvdmlkZXJUeXBlID0gbnVsbDsKLQotICAgICAgICBUeXBlW10gZ2lUeXBlcyA9IHNlcnZpY2VJbXBsQ2xhc3MuZ2V0R2VuZXJpY0ludGVyZmFjZXMoKTsKLSAgICAgICAgZm9yIChUeXBlIGdpVHlwZSA6IGdpVHlwZXMpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcmFtVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSlnaVR5cGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgbWF5IG5vdCBiZSBhIHBhcmFtZXRlcml6ZWQgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzcyBpbnRlcmZhY2VOYW1lID0gKENsYXNzKXBhcmFtVHlwZS5nZXRSYXdUeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VOYW1lID09IGphdmF4LnhtbC53cy5Qcm92aWRlci5jbGFzcykgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwVHlwZUVyciIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXJUeXBlID0gKENsYXNzKXBhcmFtVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX3Byb3ZpZGVyVHlwZSA9IHByb3ZpZGVyVHlwZTsKLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogVmFsaWRhdGUgd2hldGhlciBvciBub3QgdGhlIENsYXNzIHBhc3NlZCBpbiBpcyBhIHZhbGlkIHR5cGUgb2YKLSAgICAqIGphdmF4LnhtbC53cy5Qcm92aWRlcjxUPi4gIFBlciB0aGUgSkFYLVdTIDIuMCBzcGVjaWZpY2F0aW9uLCB0aGUKLSAgICAqIHBhcmFtZXRlcml6ZWQgdHlwZSBvZiBhIFByb3ZpZGVyIGNhbiBvbmx5IGJlOgotICAgICoKLSAgICAqICAgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UKLSAgICAqICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UKLSAgICAqICAgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlCi0gICAgKiAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ci0gICAgKgotICAgICogV2UndmUgYWxzbyBhZGRlZCBzdXBwb3J0IGZvciBTdHJpbmcgdHlwZXMgd2hpY2ggaXMgTk9UIGRpY3RhdGVkCi0gICAgKiBieSB0aGUgc3BlYy4KLSAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJvdmlkZXJUeXBlKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIGJvb2xlYW4gdmFsaWQgPSBjbGF6eiA9PSBTdHJpbmcuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBTT0FQTWVzc2FnZS5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNsYXp6ID09IFNvdXJjZS5jbGFzcyB8fAotICAgICAgICAgICAgICAgIGNsYXp6ID09IERhdGFTb3VyY2UuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBPTUVsZW1lbnQuY2xhc3M7Ci0KLSAgICAgICAgaWYgKCF2YWxpZCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDbGFzcyAiICsgY2xhenouZ2V0TmFtZSgpICsgIiBpcyBub3QgYSB2YWxpZCBQcm92aWRlcjxUPiB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsaWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEdpdmVuIGEgdGFyZ2V0IGNsYXNzIHR5cGUgZm9yIGEgcGF5bG9hZCwgbG9hZCB0aGUgYXBwcm9wcmlhdGUgQmxvY2tGYWN0b3J5LgotICAgICovCi0gICAgcHJpdmF0ZSBCbG9ja0ZhY3RvcnkgY3JlYXRlQmxvY2tGYWN0b3J5KENsYXNzIHR5cGUpIHsKLSAgICAgICAgaWYgKF9ibG9ja0ZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIF9ibG9ja0ZhY3Rvcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgX2Jsb2NrRmFjdG9yeSA9IChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoRGF0YVNvdXJjZS5jbGFzcykpIHsKLSAgICAgICAgICAgIF9ibG9ja0ZhY3RvcnkgPSAoRGF0YVNvdXJjZUJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoU291cmNlLmNsYXNzKSkgewotICAgICAgICAgICAgX2Jsb2NrRmFjdG9yeSA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS5lcXVhbHMoU09BUE1lc3NhZ2UuY2xhc3MpKSB7Ci0gICAgICAgICAgICBfYmxvY2tGYWN0b3J5ID0gKFNPQVBFbnZlbG9wZUJsb2NrRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmVxdWFscyhPTUVsZW1lbnQuY2xhc3MpKSB7Ci0gICAgICAgICAgICBfYmxvY2tGYWN0b3J5ID0gKE9NQmxvY2tGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICBPTUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJiRmFjdG9yeUVyciIsdHlwZS5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBfYmxvY2tGYWN0b3J5OwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldEphdmFNZXRob2QoKSB7Ci0gICAgICAgIE1ldGhvZCBtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG0gPSBwcm92aWRlckluc3RhbmNlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJpbnZva2UiLCBuZXcgQ2xhc3NbXSB7Z2V0UHJvdmlkZXJUeXBlKCl9KTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0KLSAgICAgICAgbWMuc2V0T3BlcmF0aW9uTmFtZShtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICBlbmRwb2ludERlc2MgPSBtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludERlc2MuaXNNVE9NRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtYy5nZXRNZXNzYWdlKCkuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCBTT0FQIE9wZXJhdGlvbiBSZWxhdGVkIHByb3BlcnRpZXMgaW4gU09BUE1lc3NhZ2VDb250ZXh0LgotCi0gICAgICAgIENvbnRleHRVdGlscy5hZGRXU0RMUHJvcGVydGllc19wcm92aWRlcihtYyk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL2ZhY3RvcnkvRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvZmFjdG9yeS9FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTA0ZDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvZmFjdG9yeS9FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLkVuZHBvaW50RGlzcGF0Y2hlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50RGlzcGF0Y2hlckZhY3RvcnkgewotCi0gICAgcHVibGljIEVuZHBvaW50RGlzcGF0Y2hlciBjcmVhdGVFbmRwb2ludERpc3BhdGNoZXIoQ2xhc3Mgc2VydmljZUltcGwsIAotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlKTsKLSAgICAKLSAgICBwdWJsaWMgRW5kcG9pbnREaXNwYXRjaGVyIGNyZWF0ZUVuZHBvaW50RGlzcGF0Y2hlcihNZXNzYWdlQ29udGV4dCBtYywgCi0gICAgICAgIENsYXNzIHNlcnZpY2VJbXBsLCBPYmplY3Qgc2VydmljZUluc3RhbmNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvZmFjdG9yeS9FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2Rpc3BhdGNoZXIvZmFjdG9yeS9FbmRwb2ludERpc3BhdGNoZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM3ZDZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9kaXNwYXRjaGVyL2ZhY3RvcnkvRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuZmFjdG9yeTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5kaXNwYXRjaGVyLkVuZHBvaW50RGlzcGF0Y2hlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZGlzcGF0Y2hlci5KYXZhQmVhbkRpc3BhdGNoZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmRpc3BhdGNoZXIuUHJvdmlkZXJEaXNwYXRjaGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIEVuZHBvaW50RGlzcGF0Y2hlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgRW5kcG9pbnREaXNwYXRjaGVyRmFjdG9yeSB7DQotDQotICAgIHB1YmxpYyBFbmRwb2ludERpc3BhdGNoZXIgY3JlYXRlRW5kcG9pbnREaXNwYXRjaGVyKE1lc3NhZ2VDb250ZXh0IG1jLCANCi0gICAgICAgIENsYXNzIHNlcnZpY2VJbXBsLCBPYmplY3Qgc2VydmljZUluc3RhbmNlKSB7DQotICAgICAgICAvLyBUT0RPOiAgVGhpcyBjaGVjayBzaG91bGQgYmUgYmFzZWQgb24gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gcHJvY2Vzc2luZyBvZiBhbm5vdGF0aW9ucw0KLSAgICAgICAgLy8gSXQgaXMgbGVmdCB0aGlzIHdheSBmb3Igbm93IGJlY2F1c2Ugc29tZSB0ZXN0cyBoYXZlIGFuIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gb24NCi0gICAgICAgIC8vIFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50cyBhcyBhIHByZS1leGlzdGluZyB3b3JrYXJvdW5kLg0KLSAgICAgICAgaWYgKFByb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc2VydmljZUltcGwpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm92aWRlckRpc3BhdGNoZXIoc2VydmljZUltcGwsIHNlcnZpY2VJbnN0YW5jZSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YUJlYW5EaXNwYXRjaGVyKHNlcnZpY2VJbXBsLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbmRwb2ludERpc3BhdGNoZXIgY3JlYXRlRW5kcG9pbnREaXNwYXRjaGVyKENsYXNzIHNlcnZpY2VJbXBsLA0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkgew0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZUVuZHBvaW50RGlzcGF0Y2hlcihudWxsLCBzZXJ2aWNlSW1wbCwgc2VydmljZUluc3RhbmNlKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvRW5kcG9pbnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvRW5kcG9pbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjdkZTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L0VuZHBvaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWwuRW5kcG9pbnRSZWZlcmVuY2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmJpbmRpbmcuQmluZGluZ1V0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQV29ya2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5TaW1wbGVIdHRwU2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLldvcmtlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludEltcGwgZXh0ZW5kcyBqYXZheC54bWwud3MuRW5kcG9pbnQgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hlZDsKLSAgICBwcml2YXRlIE9iamVjdCBpbXBsZW1lbnRvcjsKLSAgICBwcml2YXRlIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjOwotICAgIHByaXZhdGUgQmluZGluZyBiaW5kaW5nOwotICAgIHByaXZhdGUgU2ltcGxlSHR0cFNlcnZlciBzZXJ2ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFNvdXJjZT4gbWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBFeGVjdXRvciBleGVjdXRvcjsKLQotICAgIHB1YmxpYyBFbmRwb2ludEltcGwoT2JqZWN0IG8pIHsKLSAgICAgICAgaW1wbGVtZW50b3IgPSBvOwotICAgICAgICBpbml0aWFsaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50SW1wbChPYmplY3QgbywgQmluZGluZyBibmQsIEVuZHBvaW50RGVzY3JpcHRpb24gZWQpIHsKLSAgICAgICAgaW1wbGVtZW50b3IgPSBvOwotICAgICAgICBlbmRwb2ludERlc2MgPSBlZDsKLSAgICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBpZiAoaW1wbGVtZW50b3IgPT0gbnVsbCkgewotICAgICAgICAJCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImluaXRFcnIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhlIG5lY2Vzc2FyeSBtZXRhZGF0YSwgbGV0J3MgZ28gYWhlYWQgYW5kCi0gICAgICAgIC8vIGNyZWF0ZSBpdC4KLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYyA9PSBudWxsKSB7ICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oaW1wbGVtZW50b3IuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICBlbmRwb2ludERlc2MgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYyAhPSBudWxsICYmIGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZyA9IEJpbmRpbmdVdGlscy5jcmVhdGVCaW5kaW5nKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1Ymxpc2hlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNnZXRNZXRhZGF0YSgpCi0gICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTb3VyY2U+IGdldE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjc2V0TWV0YWRhdGEoamF2YS51dGlsLkxpc3QpCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YShMaXN0PFNvdXJjZT4gbGlzdCkgewotICAgICAgICB0aGlzLm1ldGFkYXRhID0gbGlzdDsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjZ2V0UHJvcGVydGllcygpCi0gICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNzZXRQcm9wZXJ0aWVzKGphdmEudXRpbC5NYXApCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNnZXRCaW5kaW5nKCkKLSAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I2dldEV4ZWN1dG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I2dldEltcGxlbWVudG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEltcGxlbWVudG9yKCkgewotICAgICAgICByZXR1cm4gaW1wbGVtZW50b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuRW5kcG9pbnQjaXNQdWJsaXNoZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHVibGlzaGVkKCkgewotICAgICAgICByZXR1cm4gcHVibGlzaGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKE9iamVjdCBvYmopIHsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I3B1Ymxpc2goamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKFN0cmluZyBzKSB7Ci0gICAgICAgIGludCBwb3J0ID0gLTE7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSShzKTsKLSAgICAgICAgICAgIHBvcnQgPSB1cmkuZ2V0UG9ydCgpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIC8vIERlZmF1bHQgdG8gODA4MAotICAgICAgICBpZihwb3J0ID09IC0xKXsKLSAgICAgICAgICAgIHBvcnQgPSA4MDgwOwotICAgICAgICB9Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGN0eCA9IGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRBeGlzQ29uZmlnQ29udGV4dCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24gdGhlIEF4aXNTZXJ2aWNlIGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIHNvIHdlIG5lZWQgdG8gZG8gaXQgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIGF2YWlsYWJsZS4KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHN2YyA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShzdmMpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSAgICAgICAgCi0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0ICJheGlzMiIgY29udGV4dCByb290LgotICAgICAgICBjdHguc2V0Q29udGV4dFJvb3QoIi8iKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIFdvcmtlckZhY3Rvcnkgd2YgPSBuZXcgSFRUUFdvcmtlckZhY3RvcnkoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmVyID0gbmV3IFNpbXBsZUh0dHBTZXJ2ZXIoY3R4LCB3ZiwgcG9ydCk7Ci0gICAgICAgICAgICBzZXJ2ZXIuaW5pdCgpOyAgICAgICAgICAgIAotICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaXNoZWQgPSB0cnVlOyAgICAgIAotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YXgueG1sLndzLkVuZHBvaW50I3NldEV4ZWN1dG9yKGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKEV4ZWN1dG9yIGV4ZWN1dG9yKSB7Ci0gICAgICAgIHRoaXMuZXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5FbmRwb2ludCNzdG9wKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYoc2VydmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuZGVzdHJveSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VCBleHRlbmRzIEVuZHBvaW50UmVmZXJlbmNlPiBUIGdldEVuZHBvaW50UmVmZXJlbmNlKENsYXNzPFQ+IGNsYXp6LCBFbGVtZW50Li4uIHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKLSAgICAgICAgaWYgKCFpc1B1Ymxpc2hlZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiRW5kcG9pbnQgaXMgbm90IHB1Ymxpc2hlZCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIUJpbmRpbmdVdGlscy5pc1NPQVBCaW5kaW5nKGJpbmRpbmcuZ2V0QmluZGluZ0lEKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIGlzIHVuc3VwcG9ydGVkIGZvciB0aGUgYmluZGluZzogIiArIGJpbmRpbmcuZ2V0QmluZGluZ0lEKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKGNsYXp6KTsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRBZGRyZXNzKCk7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gZW5kcG9pbnREZXNjLmdldFNlcnZpY2VRTmFtZSgpOwotICAgICAgICBRTmFtZSBwb3J0TmFtZSA9IGVuZHBvaW50RGVzYy5nZXRQb3J0UU5hbWUoKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9Ci0gICAgICAgIAlFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoYWRkcmVzcywgc2VydmljZU5hbWUsIHBvcnROYW1lLCBudWxsLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmFkZFJlZmVyZW5jZVBhcmFtZXRlcnMoYXhpczJFUFIsIHJlZmVyZW5jZVBhcmFtZXRlcnMpOwotICAgICAgICAgICAgamF4d3NFUFIgPSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRSZWZDcmVhdGlvbkVycm9yIiksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsYXp6LmNhc3QoamF4d3NFUFIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRFbmRwb2ludFJlZmVyZW5jZShFbGVtZW50Li4uIHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKLSAgICAgICAgcmV0dXJuIGdldEVuZHBvaW50UmVmZXJlbmNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzLCByZWZlcmVuY2VQYXJhbWV0ZXJzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGQyMWUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYmluZGluZy5CaW5kaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLnV0aWwuTWVzc2FnZUNvbnRleHRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0Q29kZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0UmVhc29uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBVdGlscyB7DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhVdGlscy5jbGFzcyk7DQotICAgIA0KLSAgICBARGVwcmVjYXRlZA0KLSAgICAvKioNCi0gICAgICogQ29tcGFyZXMgdGhlIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UgaW4gdGhlIE1lc3NhZ2VDb250ZXh0IHRvIHdoYXQncyBleHBlY3RlZA0KLSAgICAgKiBnaXZlbiB0aGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhlIGJlaGF2aW9yIGlzIGRlc2NyaWJlZCBpbiB0aGUgU09BUCAxLjINCi0gICAgICogc3BlY2lmaWNhdGlvbiB1bmRlciBBcHBlbmRpeCAnQScuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBiaW5kaW5nVHlwZXNNYXRjaChNZXNzYWdlQ29udGV4dCBtYywgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjKSB7DQotICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVkcyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpOw0KLQ0KLSAgICAgICAgLy8gRGlzcGF0Y2ggZW5kcG9pbnRzIGRvIG5vdCBoYXZlIFNFSXMsIHNvIHdhdGNoIG91dCBmb3IgbnVsbCBvciBlbXB0eSBhcnJheQ0KLSAgICAgICAgaWYgKChlZHMgIT0gbnVsbCkgJiYgKGVkcy5zaXplKCkgPiAwKSkgew0KLSAgICAgICAgICAgIEl0ZXJhdG9yPEVuZHBvaW50RGVzY3JpcHRpb24+IGkgPSBlZHMuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVkcy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIFByb3RvY29sIHByb3RvY29sID0gbWMuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCk7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGVkLmdldEJpbmRpbmdUeXBlKCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgZm9yIG1hdGNoaW5nIGJpbmRpbmcgdHlwZXMuIik7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBtZXNzYWdlIHByb3RvY29sOiAiICsgcHJvdG9jb2wpOw0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgICAgIGJpbmRpbmcgdHlwZTogIiArIGJpbmRpbmdUeXBlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKSB7IA0KLSAgICAgICAgICAgICAgICAJcmV0dXJuIChCaW5kaW5nVXRpbHMuaXNTT0FQMTFCaW5kaW5nKGJpbmRpbmdUeXBlKSk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpIHsNCi0gICAgICAgICAgICAgICAgCXJldHVybiAoQmluZGluZ1V0aWxzLmlzU09BUDEyQmluZGluZyhiaW5kaW5nVHlwZSkpOyAgICAgICAgICAgICAgIAkNCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoUHJvdG9jb2wucmVzdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nVHlwZSk7DQotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlcmUgd2VyZSBubyBlbmRwb2ludCBkZXNjcmlwdGlvbnMgZm91bmQsIHRodXMgdGhlIGJpbmRpbmcgbWF0Y2ggZmFpbGVkLiIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb21wYXJlcyB0aGUgdmVyc2lvbiBvZiB0aGUgbWVzc2FnZSBpbiB0aGUgTWVzc2FnZUNvbnRleHQgdG8gd2hhdCdzIGV4cGVjdGVkDQotICAgICAqIGdpdmVuIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGUgYmVoYXZpb3IgaXMgZGVzY3JpYmVkIGluIHRoZSBTT0FQIDEuMg0KLSAgICAgKiBzcGVjaWZpY2F0aW9uIHVuZGVyIEFwcGVuZGl4ICdBJy4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBtYw0KLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2MNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGJpbmRpbmdUeXBlc01hdGNoKE1lc3NhZ2VDb250ZXh0IG1jLCBFbmRwb2ludERlc2NyaXB0aW9uIGVkKSB7DQotICAgICAgICANCi0gICAgICAgIFByb3RvY29sIHByb3RvY29sID0gbWMuZ2V0TWVzc2FnZSgpLmdldFByb3RvY29sKCk7DQotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBlZC5nZXRCaW5kaW5nVHlwZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGZvciBtYXRjaGluZyBiaW5kaW5nIHR5cGVzLiIpOw0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIG1lc3NhZ2UgcHJvdG9jb2w6ICIgKyBwcm90b2NvbCk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgICAgIGJpbmRpbmcgdHlwZTogIiArIGJpbmRpbmdUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKSB7IA0KLSAgICAgICAgICAgICAgICByZXR1cm4gKEJpbmRpbmdVdGlscy5pc1NPQVAxMUJpbmRpbmcoYmluZGluZ1R5cGUpKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIChCaW5kaW5nVXRpbHMuaXNTT0FQMTJCaW5kaW5nKGJpbmRpbmdUeXBlKSk7ICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5yZXN0KSkgew0KLSAgICAgICAgICAgIHJldHVybiBIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nVHlwZSk7DQotICAgICAgICB9ICAgICAgICAgICAgICAgDQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZXMgYSBmYXVsdCBtZXNzYWdlIHRoYXQgcmVmbGVjdHMgYSB2ZXJzaW9uIG1pc21hdGNoIGZvciB0aGUgY29uZmlndXJlZCBtZXNzYWdlIHByb3RvY29sLg0KLSAgICAgKiBUaGUgcmV0dXJuZWQgbWVzc2FnZSB3aWxsIGFsd2F5cyBiZSBhIFNPQVAgMS4xIG1lc3NhZ2UgcGVyIHRoZSBzcGVjaWZpY2F0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG1jDQotICAgICAqIEBwYXJhbSBtc2cNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1jLCBQcm90b2NvbCBwcm90b2NvbCkgew0KLSAgICAgICAgLy8gT25seSBpZiBwcm90b2NvbCBpcyBzb2FwMTIgYW5kIE1JU21hdGNoZXMgdGhlIGVuZHBvaW50IGRvIHdlIGhhbHQgcHJvY2Vzc2luZw0KLSAgICAgICAgaWYgKHByb3RvY29sLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKSB7DQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJbmNvbWluZyBTT0FQIG1lc3NhZ2UgcHJvdG9jb2wgaXMgdmVyc2lvbiAxLjIsIGJ1dCBlbmRwb2ludCBpcyBjb25maWd1cmVkIGZvciBTT0FQIDEuMSI7DQotICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmNyZWF0ZUZhdWx0TWVzc2FnZShtYywgbXNnKTsNCi0gICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2wuZXF1YWxzKFByb3RvY29sLnNvYXAxMSkpIHsNCi0gICAgICAgICAgICAvLyBTT0FQIDEuMSBtZXNzYWdlIGFuZCBTT0FQIDEuMiBiaW5kaW5nDQotDQotICAgICAgICAgICAgLy8gVGhlIGNhblN1cHBvcnQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB3ZSBjYW4gc3VwcG9ydCB0aGlzIHNjZW5hcmlvLg0KLSAgICAgICAgICAgIC8vIFBvc3NpYmxlIEV4YW1wbGVzIG9mIGNhblN1cHBvcnQ6ICBKQVhCIGltcGwgYmluZGluZywgSkFYQiBQcm92aWRlcg0KLSAgICAgICAgICAgIC8vIFBvc3NpYmxlIEV4YW1wbGUgb2YgIWNhblN1cHBvcnQ6IEFwcGxpY2F0aW9uIGhhbmRsZXIgdXNhZ2UsIG5vbi1KQVhCIFByb3ZpZGVyDQotICAgICAgICAgICAgLy8gSW5pdGlhbGx5IEkgdm90ZSB0byBoYXJkIGNvZGUgdGhpcyBhcyBmYWxzZS4NCi0gICAgICAgICAgICBib29sZWFuIGNhblN1cHBvcnQgPSBmYWxzZTsNCi0gICAgICAgICAgICBpZiAoY2FuU3VwcG9ydCkgew0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBPa2F5LCBidXQgd2UgbmVlZCB0byBzY3J1YiB0aGUgTWVzc2FnZSBjcmVhdGUgY29kZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVzcG9uc2UgbWVzc2FnZQ0KLSAgICAgICAgICAgICAgICAvLyBpcyBhbHdheXMgYnVpbHQgZnJvbSB0aGUgcmVjZWl2ZXIgcHJvdG9jb2wuLi5ub3QgdGhlIGJpbmRpbmcgcHJvdG9jb2wNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJbmNvbWluZyBTT0FQIG1lc3NhZ2UgcHJvdG9jb2wgaXMgdmVyc2lvbiAxLjEsIGJ1dCBlbmRwb2ludCBpcyBjb25maWd1cmVkIGZvciBTT0FQIDEuMi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4iOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuY3JlYXRlRmF1bHRNZXNzYWdlKG1jLCBtc2cpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJbmNvbWluZyBtZXNzYWdlIHByb3RvY29sIGRvZXMgbm90IG1hdGNoIGVuZHBvaW50IHByb3RvY29sLiI7DQotICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmNyZWF0ZUZhdWx0TWVzc2FnZShtYywgbXNnKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdE1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbWMsIFN0cmluZyBtc2cpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgWE1MRmF1bHQgeG1sZmF1bHQgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFhNTEZhdWx0KFhNTEZhdWx0Q29kZS5WRVJTSU9OTUlTTUFUQ0gsIG5ldyBYTUxGYXVsdFJlYXNvbihtc2cpKTsNCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOw0KLSAgICAgICAgICAgIG1lc3NhZ2Uuc2V0WE1MRmF1bHQoeG1sZmF1bHQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTXNnQ3R4ID0gTWVzc2FnZUNvbnRleHRVdGlscy5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KG1jKTsNCi0gICAgICAgICAgICByZXNwb25zZU1zZ0N0eC5zZXRNZXNzYWdlKG1lc3NhZ2UpOw0KLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZU1zZ0N0eDsNCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gTmVlZCB0byBmaXggdGhpcyAhICAgQXQgbGVhc3QgcHJvdmlkZSBsb2dnaW5nDQotICAgICAgICAgICAgLy8gVE9ETyBmb3Igbm93LCB0aHJvdyBpdC4gIFdlIHByb2JhYmx5IHNob3VsZCB0cnkgdG8gbWFrZSBhbiBYTUxGYXVsdCBvYmplY3QgYW5kIHNldCBpdCBvbiB0aGUgbWVzc2FnZQ0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIEdldHMgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdCB0aGF0IGlzIGN1cnJlbnRseQ0KLSAgICAgKiBiZWluZyBwcm9jZXNzZWQuDQotICAgICAqIA0KLSAgICAgKiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IGRvbmUgaW4gdGhlIEVuZHBvaW50Q29udHJvbGxlciBzaW5jZSBvcGVyYXRpb25zIGFyZSBvbmx5IHJlbGV2YW50DQotICAgICAqICB0byBFbmRwb2ludC1iYXNlZCBpbXBsZW1lbnRhdGlvbiAoaS5lLiBub3QgdG8gUHJveHktYmFzZWQgb25lcylzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKE1lc3NhZ2VDb250ZXh0IG1jKSB7DQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcCA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIG9wID0gbWMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsNCi0gICAgICAgIGlmIChvcCA9PSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gT3BlcmF0aW9uRGVzY3JpcHRpb24gZm91bmQgb24gTWVzc2FnZUNvbnRleHQsIHNlYXJjaGluZyBleGlzdGluZyBvcGVyYXRpb25zIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBtYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBlZC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7DQotDQotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcHMgPSBlaWQuZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9uKG1jLmdldE9wZXJhdGlvbk5hbWUoKSk7DQotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHNpZ25hdHVyZSBtYXRjaGluZy4gIEN1cnJlbnRseSBvbmx5IG1hdGNoaW5nIG9uIHRoZSB3c2RsOk9wZXJhdGlvbk5hbWUgaXMgc3VwcG9ydGVkLg0KLSAgICAgICAgICAgIC8vICAgICAgIFRoYXQgbWVhbnMgdGhhdCBvdmVybG9hZGluZyBvZiB3c2RsIG9wZXJhdGlvbnMgaXMgbm90IHN1cHBvcnRlZCAoYWx0aG91Z2ggdGhhdCdzIG5vdCBzdXBwb3J0ZWQgaW4gDQotICAgICAgICAgICAgLy8gICAgICAgV1NETCAxLjEgYW55d2F5KS4NCi0gICAgICAgICAgICBpZiAob3BzID09IG51bGwgfHwgb3BzLmxlbmd0aCA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3ByRGVzY3JFcnIiLG1jLmdldE9wZXJhdGlvbk5hbWUoKS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChvcHMubGVuZ3RoID4gMSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wckRlc2NyRXJyMSIsbWMuZ2V0T3BlcmF0aW9uTmFtZSgpLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgb3AgPSBvcHNbMF07DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygid3NkbCBvcGVyYXRpb246ICIgKyBvcC5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgIGphdmEgbWV0aG9kOiAiICsgb3AuZ2V0SmF2YU1ldGhvZE5hbWUoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXhpc3RpbmcgT3BlcmF0aW9uRGVzY3JpcHRpb24gd2FzIGZvdW5kIG9uIHRoZSBNZXNzYWdlQ29udGV4dC4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBvcDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY2ZDI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoKLSAqIFJlc291cmNlIEluamVjdGlvbiBpcyByZXNwb25zaWJsZSB0byBJbmplY3RpbmcgUmVzb3VyY2UgT2JqZWN0IHRvIGVuZHBvaW50IEluc3RhbmNlIGF0IHJ1bnRpbWUuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUluamVjdG9yIHsKLQotICAgIC8qKgotICAgICAqIEluamVjdCByZXNvdXJjZSBvbiBGaWxlZCwgTWV0aG9kIG9yIENsYXNzIGRlcGVuZGluZyBvbiBob3cgdGhlIEBSZXNvdXJjZSBhbm5vdGF0aW9uIGlzIGRlZmluZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGluamVjdChPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSkgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVzb3VyY2Ugd2lsbCBiZSBpbmplY3RlZCBvbiB0aGUgZmllbGQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gaW5zdGFuY2UKLSAgICAgKiBAcGFyYW0gZmllbGQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBpbmplY3RPbkZpZWxkKE9iamVjdCByZXNvdXJjZSwgT2JqZWN0IGluc3RhbmNlLCBGaWVsZCBmaWVsZCkKLSAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlc291cmNlIHdpbGwgYmUgaW5qZWN0ZWQgb24gdGhlIE1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEBwYXJhbSBpbnN0YW5jZQotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBpbmplY3RPbk1ldGhvZChPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlc291cmNlIHdpbGwgYmUgaW5qZWN0aW9uIG9uIHRoZSBjbGFzcy4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcGFyYW0gaW5zdGFuY2UKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCBpbmplY3RPbkNsYXNzKE9iamVjdCByZXNvdXJjZSwgT2JqZWN0IGluc3RhbmNlLCBDbGFzcyBjbGF6eikKLSAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vV2ViU2VydmljZUNvbnRleHRJbmplY3Rvci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OWJkODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLQotLyoKLSAqIFdlYnNlcnZpY2VDb250ZXh0IEluamVjdGlvbiBpcyByZXNwb25zaWJsZSB0byBJbmplY3RpbmcgV2ViU2VydmljZUNvbnRleHQgT2JqZWN0IHRvIGEgSkFYV1MgZW5kcG9pbnQgSW5zdGFuY2UgYXQgcnVudGltZS4KLSAqIEluamVjdGlvbiB3aWxsIGhhcHBlbiB3aGVuIHRoZSBFbmRwb2ludCBpbnN0YW5jZSBpcyBmaXJzdCBpbml0aWFsaXplZC4KLSAqIFdlYlNlcnZpY2VDb250ZXh0IG1ldGhvZHMgc2hvdWxkIGJlIGludm9rZWQgd2hlbiBvbmUgb2YgdGhlIHdlYnNlcnZpY2UgbWV0aG9kcyBpcyBpbnZva2VkLgotICogSW52b2NhdGlvbiBvZiBXZWJTZXJ2aWNlQ29udGV4dCBtZXRob2Qgb3V0c2lkZSBvZiBpbnZvY2F0aW9uIG9mIGl0cyB3ZWJzZXJ2aWNlIG1ldGhvZCBpcyBpbGxpZ2FsIGFzIHBlciBqYXh3cyBzcGVjIHNlY3Rpb24gNS4zLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUNvbnRleHRJbmplY3RvciBleHRlbmRzIFJlc291cmNlSW5qZWN0b3IgewotCi0gICAgLyoqCi0gICAgICogTWVzc2FnZUNvbnRleHQgaXMgbWFkZSBhdmFpbGJsZSB0byB0aGUgZW5kcG9pbnQgaW5zdGFuY2UgdmlhIHRoZSBXZWJTZXJ2aWNlQ29udGV4dC4gVGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIGFkZCBNZXNzYWdlQ29udGV4dCB0byBXZWJTZXJ2aWNlQ29udGV4dCB0aGF0IGlzIGluamVjdGVkIGluIFdlYlNlcnZpY2UuIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogcmVwcmVzZW50cyB0aGUgY29udGV4dCBvZiBJbmJvdW5kIG1lc3NhZ2UgZm9sbG93aW5nIHRoZSBIYW5kbGVyIEV4ZWN1dGlvbi4gT25seSBwcm9wZXJ0aWVzIHdpdGgKLSAgICAgKiBBcHBsaWNhdGlvbiBzY29wZSB3aWxsIGJlIGV4cG9zZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2MKLSAgICAgKiBAcGFyYW0gbWMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlQ29udGV4dChXZWJTZXJ2aWNlQ29udGV4dCB3YywgTWVzc2FnZUNvbnRleHQgbWMpOwotCQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9mYWN0b3J5L1Jlc291cmNlSW5qZWN0aW9uRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9mYWN0b3J5L1Jlc291cmNlSW5qZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjA4N2JhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vZmFjdG9yeS9SZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLmZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIHRoYXQgY2FuIAotICogaGFuZGxlIHJlc291cmNlIGluamVjdGlvbi4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGFwcHJvcHJpYXRlIFJlc291cmNlSW5qZWN0b3IgaW5zdGFuY2UKLSAgICAgKiBiYXNlZCBvbiB0aGUgdHlwZSB0aGF0IGlzIHN1cHBsaWVkLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VJbmplY3RvciBjcmVhdGVSZXNvdXJjZUluamVjdG9yKENsYXNzIHJlc291cmNlVHlwZSkKLSAgICAgICAgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KHJlc291cmNlVHlwZSk7Ci0gICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBudWxsOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgUmVzb3VyY2VJbmplY3RvciBpbnN0YW5jZQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2VJbmplY3RvcikgewotICAgICAgICAgICAgaW5qZWN0b3IgPSAoUmVzb3VyY2VJbmplY3Rvcikgb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluamVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJSZXNvdXJjZUluamVjdGlvbkZhY3RvcnlFcnIxIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGluamVjdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9pbmplY3Rpb24vaW1wbC9XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9ySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9pbXBsL1dlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODlmNTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2luamVjdGlvbi9pbXBsL1dlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5XZWJTZXJ2aWNlQ29udGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5XZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUNvbnRleHRJbmplY3RvckltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV2ViU2VydmljZUNvbnRleHRJbmplY3RvckltcGwuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJzZXQiOwotICAgIHByaXZhdGUgc3RhdGljIGludCBOVU1CRVJfT0ZfUEFSQU1FVEVSUyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFVFVSTl9UWVBFID0gInZvaWQiOwotCi0gICAgcHVibGljIFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3JJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5XZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbiNhZGRNZXNzYWdlQ29udGV4dChqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQsIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0KQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlQ29udGV4dChXZWJTZXJ2aWNlQ29udGV4dCB3YywgTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHRJbXBsIHdzQ29udGV4dCA9IChXZWJTZXJ2aWNlQ29udGV4dEltcGwpd2M7Ci0gICAgICAgIHdzQ29udGV4dC5zZXRTb2FwTWVzc2FnZUNvbnRleHQobWMpOwotCi0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvbiNpbmplY3QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW5qZWN0KE9iamVjdCByZXNvdXJjZSwgT2JqZWN0IGluc3RhbmNlKSB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5ub3QgaW5qZWN0IFJlc291cmNlIG9uIGEgbnVsbCBTZXJ2aWNlIEluc3RhbmNlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJXZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnIxIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3Mgc2VydmljZUNsYXp6ID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAvKkxvb2sgZm9yIEBSZXNvdXJjZSBhbm5vdGF0aW9uIG9uIEZpZWxkLiBJZiBmb3VuZCB0aGVuIGxvb2sgZm9yIHR5cGUgb24gdGhlIGFubm90YXRpb24uIElmIGZvdW5kLCB0aGVuCi0gICAgICAgICAgICogaWYgdHlwZSBpcyBqYXZhLmxhbmcuT2JqZWN0IHRoZW4gbWFrZSBzdXJlIHR5cGUgb24gZGVjbGFyZWQgZmllbGQgaW4gamF2YXgueG1sLldlYlNlcnZpY2VDb250ZXh0IGFuZCBhc3NpZ24gdGhlIHJlc291cmNlIHZhbHVlCi0gICAgICAgICAgICogaWYgdHlwZSBpcyBqYXZheC54bWwuV2ViU2VydmljZUNvbnRleHQgdGhlbiBhc3NpZ24gdGhlIHJlc291cmNlIHZhbHVlCi0gICAgICAgICAgKi8KLSAgICAgICAgRmllbGQgcmVzb3VyY2VGaWVsZCA9IHNlYXJjaEZpZWxkc0ZvclJlc291cmNlQW5ub3RhdGlvbihzZXJ2aWNlQ2xhenopOwotICAgICAgICBpZiAocmVzb3VyY2VGaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gaW5qZWN0IFJlc291cmNlIG9uIEZpZWxkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0ZvdW5kIGZpZWxkIHRoYXQgaGFzIGEgQFJlc291cmNlIGZvciBXZWJTZXJ2aWNlQ29udGV4dAotICAgICAgICAgICAgLy9JbmplY3QgUmVzb3VyY2UuCi0gICAgICAgICAgICBpbmplY3RPbkZpZWxkKHJlc291cmNlLCBpbnN0YW5jZSwgcmVzb3VyY2VGaWVsZCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlc291cmNlIEluamVjdGVkIG9uIEZpZWxkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZiBAUmVzb3VyY2UgYW5ub3RhdGlvbiBub3QgZm91bmQgb24gZGVjbGFyZWQgRmlsZWRzLCB0aGVuIGxvb2sgZm9yIGl0IG9uIE1ldGhvZHMuIElmIGZvdW5kIHRoZW4sCi0gICAgICAgICAgICogaWYgQFJlc291cmNlIHR5cGUgaXMgamF2YS5sYW5nLk9iamVjdCB0aGVuLAotICAgICAgICAgICAqIGxvb2sgZm9yIFByb3BlcnR5RGVzY3JpcHRvciB3aG8ncyB3cml0ZSBNZXRob2Qgb3Igc2V0dGVyIGlzIHRoZSBNZXRob2Qgb24gd2hpY2ggeW91IGZvdW5kIHRoZSBhbm5vdGF0aW9uIGFuZAotICAgICAgICAgICAqIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG9mIHRoYXQgcHJvcGVydHkgaXMgamF2YXgueG1sLldlYlNlcnZpY2VDb250ZXh0IGFuZCBpbnZva2UgdGhlIE1ldGhvZCB3aXRoIFJlc291cmNlLgotICAgICAgICAgICAqIGlmIEBSZXNvdXJjZSB0eXBlIGlzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCwgSW52b2tlIHRoZSBNZXRob2Qgd2l0aCBSZXNvdXJjZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHNlYXJjaE1ldGhvZHNSZXNvdXJjZUFubm90YXRpb24oc2VydmljZUNsYXp6KTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gaW5qZWN0IHJlc291cmNlIG9uIE1ldGhvZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTWV0aG9kKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmplY3Rpb24gY2FuIGhhcHBlbiB1c2luZyBtZXRob2QgaWYgbWV0aG9kIG5hbWUgc3RhcnRzIHdpdGggXCJzZXRcIiByZXR1cm5zIGEgdm9pZCBhbmQgb25seSBoYXMgb25lIHBhcmFtZXRlciBhbmQgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggcmVzb3VyY2UuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIldlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjYiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmplY3RPbk1ldGhvZChyZXNvdXJjZSwgaW5zdGFuY2UsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlc291cmNlIEluamVjdGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvL05vdGhpbmcgdG8gaW5qZWN0Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5SZXNvdXJjZUluamVjdGlvbiNpbmplY3RPbkNsYXNzKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW5qZWN0T25DbGFzcyhPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSwgQ2xhc3MgY2xhenopCi0gICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW5qZWN0T25DbHNFcnIiKSk7Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uI2luamVjdE9uRmllbGQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluamVjdE9uRmllbGQoT2JqZWN0IHJlc291cmNlLCBPYmplY3QgaW5zdGFuY2UsIEZpZWxkIGZpZWxkKQotICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2Fubm90IGluamVjdCBSZXNvdXJjZSBvbiBhIG51bGwgU2VydmljZSBJbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbmplY3QgV2ViU2VydmljZUNvbnRleHQgb24gU2VydmljZUluc3RhbmNlIEZpZWxkLCBmaWVsZCBjYW5ub3QgYmUgTlVMTCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJXZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnIzIikpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgewotICAgICAgICAgICAgICAgIHNldEFjY2Vzc2libGUoZmllbGQsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9JbmplY3QgUmVzb3VyY2UuCi0gICAgICAgICAgICBmaWVsZC5zZXQoaW5zdGFuY2UsIHJlc291cmNlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb24jaW5qZWN0T25NZXRob2QoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmplY3RPbk1ldGhvZChPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSwgTWV0aG9kIG1ldGhvZCkKLSAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbm5vdCBpbmplY3QgUmVzb3VyY2Ugb24gYSBudWxsIFNlcnZpY2UgSW5zdGFuY2UuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIldlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluamVjdCBXZWJTZXJ2aWNlQ29udGV4dCBvbiBTZXJ2aWNlSW5zdGFuY2UgTWV0aG9kLCBtZXRob2QgY2Fubm90IGJlIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMyIpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgc2V0QWNjZXNzaWJsZShtZXRob2QsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWV0aG9kLmludm9rZShpbnN0YW5jZSwgcmVzb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGFjY2Vzc2libGUuICBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqICAgQWNjZXNzaWJsZU9iamVjdAotICAgICAqIEBwYXJhbSB2YWx1ZSB0cnVlIG9yIGZhbHNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRBY2Nlc3NpYmxlKGZpbmFsIEFjY2Vzc2libGVPYmplY3Qgb2JqLCBmaW5hbCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgb2JqLnNldEFjY2Vzc2libGUodmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICAqIFNlYXJjaCBmb3IgRmllbGQgd2l0aCBAUmVzb3VyY2UgQW5ub3RhdGlvbi4KLSAgICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZCBzZWFyY2hGaWVsZHNGb3JSZXNvdXJjZUFubm90YXRpb24oQ2xhc3MgYmVhbikgewotICAgICAgICBpZiAoYmVhbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBMaXN0PEZpZWxkPiBmaWVsZHMgPSBnZXRGaWVsZHMoYmVhbik7Ci0gICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGZpZWxkLmdldEFubm90YXRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW4gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgICAgIGlmIChSZXNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFuLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIGl0IGlzIGEgQFJlc291cmNlIGZvciBXZWJTZXJ2aWNlQ29udGV4dC4KLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgYXRSZXNvdXJjZSA9IChSZXNvdXJjZSlhbjsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgdHlwZSA9IGF0UmVzb3VyY2UudHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNXZWJTZXJ2aWNlQ29udGV4dFJlc291cmNlKGF0UmVzb3VyY2UsIGZpZWxkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBjbGFzcyBhbmQgdGhlIHN1cGVyIGNsYXNzZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgTGlzdDxGaWVsZD4gZ2V0RmllbGRzKGZpbmFsIENsYXNzIGJlYW5DbGFzcykgewotICAgICAgICAvLyBUaGlzIGNsYXNzIG11c3QgcmVtYWluIHByaXZhdGUgZHVlIHRvIEphdmEgMiBTZWN1cml0eSBjb25jZXJucwotICAgICAgICBMaXN0PEZpZWxkPiBmaWVsZHM7Ci0gICAgICAgIGZpZWxkcyA9IChMaXN0PEZpZWxkPilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEZpZWxkPiBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xzID0gYmVhbkNsYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRbXSBmaWVsZEFycmF5ID0gY2xzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkQXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzLmFkZChmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGRzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotCi0gICAgICAgIHJldHVybiBmaWVsZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgb2YgdGhlIGZpZWxkcyBpbiB0aGlzIGNsYXNzIGFuZCB0aGUgc3VwZXIgY2xhc3NlcwotICAgICAqCi0gICAgICogQHBhcmFtIGJlYW5DbGFzcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBMaXN0PE1ldGhvZD4gZ2V0TWV0aG9kcyhmaW5hbCBDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgLy8gVGhpcyBjbGFzcyBtdXN0IHJlbWFpbiBwcml2YXRlIGR1ZSB0byBKYXZhIDIgU2VjdXJpdHkgY29uY2VybnMKLSAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHM7Ci0gICAgICAgIG1ldGhvZHMgPSAoTGlzdDxNZXRob2Q+KUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbHMgPSBiZWFuQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RbXSBtZXRob2RBcnJheSA9IGNscy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RBcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0KLSAgICAgICAgcmV0dXJuIG1ldGhvZHM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogU2VhcmNoIGZvciBNZXRob2Qgd2l0aCBAUmVzb3VyY2UgQW5ub3RhdGlvbgotICAgICAgKi8KLSAgICBwcml2YXRlIE1ldGhvZCBzZWFyY2hNZXRob2RzUmVzb3VyY2VBbm5vdGF0aW9uKENsYXNzIGJlYW4pIHsKLSAgICAgICAgaWYgKGJlYW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMgPSBnZXRNZXRob2RzKGJlYW4pOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFJlc291cmNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYW4uZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9jaGVjayB0byBtYWtlIHN1cmUgaXQgaXMgYSBAUmVzb3VyY2UgZm9yIFdlYlNlcnZpY2VDb250ZXh0LgotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSBhdFJlc291cmNlID0gKFJlc291cmNlKWFuOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNXZWJTZXJ2aWNlQ29udGV4dFJlc291cmNlKGF0UmVzb3VyY2UsIG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2ViU2VydmljZUNvbnRleHRSZXNvdXJjZShSZXNvdXJjZSBhdFJlc291cmNlLCBGaWVsZCBmaWVsZCkgewotICAgICAgICBDbGFzcyB0eXBlID0gYXRSZXNvdXJjZS50eXBlKCk7Ci0gICAgICAgIGlmICh0eXBlID09IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIHsKLSAgICAgICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmdldFR5cGUoKSA9PSBXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViU2VydmljZUNvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgIC8vVE9ETzogU2hvdWxkIEkgY2hlY2sgaWYgdGhlIGZpZWxkIGRlY2xhcmVkIHR5cGUgaXMgYXNzaWduYWJsZSBmcm9tIFdlYlNlcnZpY2VDb250ZXh0LiBTcGVjIGlzIG5vdCBjbGVhciBhYm91dCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEZpZWxkIHR5cGUgb3IgUmVzb3VyY2UgVHlwZSBmb3VuZCwgY2Fubm90IGluamVjdCBXZWJTZXJ2aWNlQ29udGV4dCBvbiB0aGlzIGZpZWxkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlNlcnZpY2VDb250ZXh0UmVzb3VyY2UoUmVzb3VyY2UgYXRSZXNvdXJjZSwgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICAvL0FzIHBlciBKU1ItMjUwIHRoZSBtZXRob2QgaW5qZWN0aW9uIGlzIG5vdGhpbmcgYnV0IHNldHRlciBiYXNlZCBpbmplY3Rpb24sCi0gICAgICAgIC8vU3VjaCBhIGluamVjdGlvbiBjYW4gaGFwcGVuIGlmIG1ldGhvZCBuYW1lIHN0YXJ0cyB3aXRoICJzZXQiIHJldHVybnMgYSB2b2lkIGFuZAotICAgICAgICAvL29ubHkgaGFzIG9uZSBwYXJhbWV0ZXIgYW5kIHRoZSB0eXBlIG9mIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoCi0gICAgICAgIC8vcmVzb3VyY2UuCi0KLSAgICAgICAgQ2xhc3MgdHlwZSA9IGF0UmVzb3VyY2UudHlwZSgpOwotICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgZm9yIChDbGFzcyBwYXJhbVR5cGUgOiBwYXJhbVR5cGVzKQotICAgICAgICAgICAgaWYgKHR5cGUgPT0gamF2YS5sYW5nLk9iamVjdC5jbGFzcykgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGUgPT0gV2ViU2VydmljZUNvbnRleHQuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZS5pc0Fzc2lnbmFibGVGcm9tKFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViU2VydmljZUNvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAvL1RPRE86IFNob3VsZCBJIGNoZWNrIGlmIHRoZSBmaWVsZCBkZWNsYXJlZCB0eXBlIGlzIGFzc2lnbmFibGUgZnJvbSBXZWJTZXJ2aWNlQ29udGV4dC4gU3BlYyBpcyBub3QgY2xlYXIgYWJvdXQgdGhpcy4KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEZpZWxkIHR5cGUgb3IgUmVzb3VyY2UgVHlwZSBmb3VuZCwgY2Fubm90IGluamVjdCBXZWJTZXJ2aWNlQ29udGV4dCBvbiB0aGlzIG1ldGhvZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZE1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIC8vQXMgcGVyIEpTUi0yNTAgdGhlIG1ldGhvZCBpbmplY3Rpb24gaXMgbm90aGluZyBidXQgc2V0dGVyIGJhc2VkIGluamVjdGlvbiwKLSAgICAgICAgLy9TdWNoIGEgaW5qZWN0aW9uIGNhbiBoYXBwZW4gaWYgbWV0aG9kIG5hbWUgc3RhcnRzIHdpdGggInNldCIgcmV0dXJucyBhIHZvaWQgYW5kCi0gICAgICAgIC8vb25seSBoYXMgb25lIHBhcmFtZXRlciBhbmQgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGgKLSAgICAgICAgLy9yZXNvdXJjZS4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgQ2xhc3NbXSB0eXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBpbnQgbm9PZkRlY2xhcmVkUGFyYW1ldGVyID0gMDsKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5vT2ZEZWNsYXJlZFBhcmFtZXRlciA9IHR5cGVzLmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoTUVUSE9EX05BTUUpICYmIG5vT2ZEZWNsYXJlZFBhcmFtZXRlciA9PSBOVU1CRVJfT0ZfUEFSQU1FVEVSUyAmJgotICAgICAgICAgICAgICAgIHJldHVyblR5cGUuZ2V0TmFtZSgpLmVxdWFscyhSRVRVUk5fVFlQRSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIGZvdW5kIHdpdGggQFJlc291cmNlIGFubm90YWlvbiBhbmQgaW5wdXQgcGFyYW0gdG8gc2V0IFdlYlNlcnZpY2VDb250ZXh0IE9iamVjdCwgSG93ZXZlciBtZXRob2QgZGlkIG5vdCBtZWV0IHRoZSBjcml0ZXJpYSBmb3IgaW5qZWN0aW9uIGFzIHBlciBKU1ItMjUwIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZTFhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkxpZmVjeWNsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEVuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uIGV4dGVuZHMgTGlmZWN5Y2xlRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1lc3NhZ2UgICovCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gY2F1c2UgICovCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhZGFjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5saWZlY3ljbGUuTGlmZWN5Y2xlRXhjZXB0aW9uOwotCi0vKgotICogRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGlzIHJlc3BvbnNpYmxlIHRvIGludm9rZSBsaWZ5Y3ljbGUgbWV0aG9kcyBvbiBFbmRwb2ludC4gQW4gRW5kcG9pbnQgY291bGQgYmUgYSAKLSAqIEphdmEgQmVhbiBFbmRwb2ludCBvciBQcm92aWRlciBFbmRwb2ludC4gTGlmZWN5Y2xlIG1hbmFnZXIgc2hvdWxkIGJlIGludm9rZWQgd2l0aCBwcm9wZXIgRW5kcG9pbnQgT2JqZWN0LgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIHsKLQotICAgIC8qKgotICAgICAqIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciB3aWxsIGNyZWF0ZSBhIHNlcnZpY2UgaW5zdGFuY2UuIEl0IHdpbGwgaW5qZWN0IFJlc291cmNlcyBhbmQgdGhlbiBjYWxsCi0gICAgICogdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9uIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1jCi0gICAgICogQHBhcmFtIHNlcnZpY2VJbXBsQ2xhc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UoTWVzc2FnZUNvbnRleHQgbWMsIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpCi0gICAgICAgICAgICB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uLCBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICAqIEludm9rZXMgbWV0aG9kIG9uIGVuZHBvaW50IG1hcmtlZCB3aXRoIEBQb3N0Q29uc3RydWN0IGFubm90YXRpb24uCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZVBvc3RDb25zdHJ1Y3QoKSB0aHJvd3MgTGlmZWN5Y2xlRXhjZXB0aW9uOwotCi0gICAgLyoKLSAgICAgICogSW52b2tlcyBtZXRob2Qgb24gZW5kcG9pbnQgbWFya2VkIHdpdGggQHByZURlc3Ryb3kgYW5ub3RhdGlvbi4KLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlUHJlRGVzdHJveSgpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ZhY3RvcnkvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2VuZHBvaW50L2xpZmVjeWNsZS9mYWN0b3J5L0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjYWU2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ZhY3RvcnkvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkgewotCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBjcmVhdGVFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIoT2JqZWN0IGVuZHBvaW50SW5zdGFuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEVuZHBvaW50TGlmZWN5Y2xlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBjcmVhdGVFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvZmFjdG9yeS9pbXBsL0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ZhY3RvcnkvaW1wbC9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDgyYWQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvZmFjdG9yeS9pbXBsL0VuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuZmFjdG9yeS5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3RvcnkuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmltcGwuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbDsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS4NCi0gKiBUaGlzIHdpbGwgcmV0dXJuIGFuIGluc3RhbmNlIGNhcGFibGUgb2YgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHdlYiBzZXJ2aWNlDQotICogZW5kcG9pbnQgb2JqZWN0cy4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3Rvcnkgew0KLQ0KLSAgICBwdWJsaWMgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeUltcGwoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKE9iamVjdCBlbmRwb2ludEluc3RhbmNlKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRW5kcG9pbnRMaWZlY3ljbGVFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGVuZHBvaW50SW5zdGFuY2UgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBFbmRwb2ludExpZmVjeWNsZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsRXJyMSIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbChlbmRwb2ludEluc3RhbmNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGNyZWF0ZUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcigpIHsNCi0NCi0gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbCgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvaW1wbC9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvZW5kcG9pbnQvbGlmZWN5Y2xlL2ltcGwvRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI3YTlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9lbmRwb2ludC9saWZlY3ljbGUvaW1wbC9FbmRwb2ludExpZmVjeWNsZU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5saWZlY3ljbGUuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuV2ViU2VydmljZUNvbnRleHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5mYWN0b3J5Lk1lc3NhZ2VDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLlNvYXBNZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5saWZlY3ljbGUuQmFzZUxpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5saWZlY3ljbGUuTGlmZWN5Y2xlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucnVudGltZS5kZXNjcmlwdGlvbi5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uUmVzb3VyY2VJbmplY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uV2ViU2VydmljZUNvbnRleHRJbmplY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uZmFjdG9yeS5SZXNvdXJjZUluamVjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGwgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlTWFuYWdlciBpbXBsZW1lbnRzCi0gICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9NRVNTQUdFX0NPTlRFWFQgPSAiamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbC5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbChPYmplY3QgZW5kcG9pbnRJbnN0YW5jZSkgewotICAgICAgICB0aGlzLmluc3RhbmNlID0gZW5kcG9pbnRJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VySW1wbCgpIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLkVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciNjcmVhdGVTZXJ2aWNlSW5zdGFuY2Uob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0LCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlU2VydmljZUluc3RhbmNlKE1lc3NhZ2VDb250ZXh0IG1jLCBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIC8vIEdldCB0aGUgU2VydmljZURlc2NyaXB0aW9uIGFuZCBpbmplY3Rpb25EZXNjIHdoaWNoIGNvbnRhaW4KLSAgICAgICAgLy8gY2FjaGVkIGluZm9ybWF0aW9uCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IG1jLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGluamVjdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIGdldEluamVjdGlvbkRlc2Moc2VydmljZURlc2MsIHNlcnZpY2VJbXBsQ2xhc3MpOwotCi0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VpbXBsID0gcmV0cmlldmVTZXJ2aWNlSW5zdGFuY2UobWMpOwotICAgICAgICBpZiAoc2VydmljZWltcGwgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IHNlcnZpY2VpbXBsOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2UgSW5zdGFuY2UgZm91bmQgaW4gdGhlIHNlcnZpY2UgY29udGV4dCwgcmV1c2luZyB0aGUgaW5zdGFuY2UiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgcmVzb3VyY2UgaW5qZWN0aW9uIGlzIG5lZWRlZCwgY3JlYXRlIHRoZSBTT0FQTWVzc2FnZUNvbnRleHQgYW5kIHVwZGF0ZSB0aGUgV2ViU2VydmljZUNvbnRleHQKLSAgICAgICAgICAgIC8vIENyZWF0ZSBNZXNzYWdlQ29udGV4dCBmb3IgY3VycmVudCBpbnZvY2F0aW9uLgotICAgICAgICAgICAgaWYgKGhhc1Jlc291cmNlQW5ub3RhdGlvbihpbmplY3Rpb25EZXNjKSkgewotICAgICAgICAgICAgICAgIHBlcmZvcm1XZWJTZXJ2aWNlQ29udGV4dFVwZGF0ZShtYyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vc2luY2Ugc2VydmljZSBpbXBsIGlzIHRoZXJlIGluIHNlcnZpY2UgY29udGV4dCAsIHRha2UgdGhhdCBmcm9tIHRoZXJlCi0gICAgICAgICAgICByZXR1cm4gc2VydmljZWltcGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgc2VydmljZSBpbXBsIGNsYXNzIGZvciB0aGF0IHNlcnZpY2UKLSAgICAgICAgICAgIHNlcnZpY2VpbXBsID0gY3JlYXRlU2VydmljZUluc3RhbmNlKG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKSwgc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gc2VydmljZWltcGw7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTmV3IFNlcnZpY2UgSW5zdGFuY2UgY3JlYXRlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiByZXNvdXJjZSBpbmplY3Rpb24gaXMgbmVlZGVkLCBjcmVhdGUgdGhlIFNPQVBNZXNzYWdlQ29udGV4dCBhbmQgYnVpbGQgdGhlIFdlYlNlcnZpY2VDb250ZXh0Ci0gICAgICAgICAgICAvLyBDcmVhdGUgTWVzc2FnZUNvbnRleHQgZm9yIGN1cnJlbnQgaW52b2NhdGlvbi4KLSAgICAgICAgICAgIGlmIChoYXNSZXNvdXJjZUFubm90YXRpb24oaW5qZWN0aW9uRGVzYykpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb24obWMsIHNlcnZpY2VpbXBsKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvL0ludm9rZSBQb3N0Q29uc3RydWN0Ci0gICAgICAgICAgICBpZiAoaW5qZWN0aW9uRGVzYyAhPSBudWxsICYmIGluamVjdGlvbkRlc2MuZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnZva2VQb3N0Q29uc3RydWN0KGluamVjdGlvbkRlc2MuZ2V0UG9zdENvbnN0cnVjdE1ldGhvZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoU2VydmljZUNvbnRleHQuU0VSVklDRV9PQkpFQ1QsIHNlcnZpY2VpbXBsKTsKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlaW1wbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGxvY2F0ZXMgYW4gZXhpc3Rpbmcgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZSBpZgotICAgICAqIG9uZSBoYXMgYmVlbiBwcmV2aW91c2x5IHN0b3JlZCBhd2F5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgcmV0cmlldmVTZXJ2aWNlSW5zdGFuY2UoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBtYy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBpbnN0YW5jZSA9IHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KFNlcnZpY2VDb250ZXh0LlNFUlZJQ0VfT0JKRUNUKTsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9uIGluIG9yZGVyIHRvIGluamVjdAotICAgICAqIGEgV2ViU2VydmljZUNvbnRleHQgaW5zdGFuY2Ugb24gYSBtZW1iZXIgb2YgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVdlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uKE1lc3NhZ2VDb250ZXh0IG1jLCBPYmplY3Qgc2VydmljZUltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFJlc291cmNlSW5qZWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0ID0gY3JlYXRlV2ViU2VydmljZUNvbnRleHQobWMpOwotICAgICAgICAvLyBJbmplY3QgV2ViU2VydmljZUNvbnRleHQKLSAgICAgICAgaW5qZWN0V2ViU2VydmljZUNvbnRleHQobWMsIHdzQ29udGV4dCwgc2VydmljZUltcGwpOwotICAgICAgICBzYXZlV2ViU2VydmljZUNvbnRleHQobWMsIHdzQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBwcm92aWRlIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb24gaW4gb3JkZXIgdG8gdXBkYXRlCi0gICAgICogYW4gZXhpc3RpbmcgV2ViU2VydmljZUNvbnRleHQgaW5zdGFuY2Ugd2l0aCBhIE1lc3NhZ2VDb250ZXh0IGZvcgotICAgICAqIHRoZSBjdXJyZW50IHJlcXVlc3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVdlYlNlcnZpY2VDb250ZXh0VXBkYXRlKE1lc3NhZ2VDb250ZXh0IG1jKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQgPSBjcmVhdGVTT0FQTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IG1jLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgLy9HZXQgV2ViU2VydmljZUNvbnRleHQgZnJvbSBTZXJ2aWNlQ29udGV4dAotICAgICAgICBXZWJTZXJ2aWNlQ29udGV4dCB3cyA9Ci0gICAgICAgICAgICAgICAgKFdlYlNlcnZpY2VDb250ZXh0KSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShXRUJTRVJWSUNFX01FU1NBR0VfQ09OVEVYVCk7Ci0KLSAgICAgICAgLy9BZGQgdGhlIE1lc3NhZ2VDb250ZXh0IGZvciBjdXJyZW50IGludm9jYXRpb24KLSAgICAgICAgaWYgKHdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVwZGF0ZVdlYlNlcnZpY2VDb250ZXh0KHdzLCBzb2FwTWVzc2FnZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBwcm92aWRlIHRoZSBmdW5jdGlvbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aGUgV2ViU2VydmljZUNvbnRleHQKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNhdmVXZWJTZXJ2aWNlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtYywgV2ViU2VydmljZUNvbnRleHQgd3NDb250ZXh0KSB7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gbWMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgc2Muc2V0UHJvcGVydHkoV0VCU0VSVklDRV9NRVNTQUdFX0NPTlRFWFQsIHdzQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugb2YgYSBXZWJTZXJ2aWNlQ29udGV4dAotICAgICAqIGFuZCBpbml0aWFsaXppbmcgdGhlIGluc3RhbmNlIHdpdGggYSBNZXNzYWdlQ29udGV4dC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgV2ViU2VydmljZUNvbnRleHQgY3JlYXRlV2ViU2VydmljZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0ID0gY3JlYXRlU09BUE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgLy8gQ3JlYXRlIFdlYlNlcnZpY2VDb250ZXh0Ci0gICAgICAgIFdlYlNlcnZpY2VDb250ZXh0SW1wbCB3c0NvbnRleHQgPSBuZXcgV2ViU2VydmljZUNvbnRleHRJbXBsKCk7Ci0gICAgICAgIC8vQWRkIE1lc3NhZ2VDb250ZXh0IGZvciB0aGlzIHJlcXVlc3QuCi0gICAgICAgIHdzQ29udGV4dC5zZXRTb2FwTWVzc2FnZUNvbnRleHQoc29hcE1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIHdzQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGEgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGlmIG9uZQotICAgICAqIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBTZXJ2aWNlRGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBnZXRJbmplY3Rpb25EZXNjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpIHsKLSAgICAgICAgUmVzb3VyY2VJbmplY3Rpb25TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGluamVjdGlvbkRlc2MgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0KHNlcnZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbmplY3Rpb25EZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB3ZSBuZWVkIHRvIHBlcmZvcm0gV2ViU2VydmljZUNvbnRleHQgaW5qZWN0aW9uCi0gICAgICogb24gYSBmaWVsZCB3aXRoaW4gb3VyIGVuZHBvaW50IGluc3RhbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlQW5ub3RhdGlvbihSZXNvdXJjZUluamVjdGlvblNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gaW5qZWN0aW9uRGVzYykgewotICAgICAgICByZXR1cm4gKGluamVjdGlvbkRlc2MgIT0gbnVsbCAmJiBpbmplY3Rpb25EZXNjLmhhc1Jlc291cmNlQW5ub3RhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UoQXhpc1NlcnZpY2Ugc2VydmljZSwgQ2xhc3Mgc2VydmljZUltcGxDbGFzcykgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgbmV3IGluc3RhbmNlIG9mIHNlcnZpY2UgZW5kcG9pbnQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlSW1wbENsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRW5kcG9pbnRDb250cm9sbGVyRXJyNSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBhbGxvdyBhbHRlcm5hdGl2ZSBkZWZpbml0aW9uIG9mIG1ha2VOZXdTZXJ2aWNlT2JqZWN0Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsICYmIHNlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX09CSkVDVF9TVVBQTElFUikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VPYmplY3RQYXJhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9PQkpFQ1RfU1VQUExJRVIpOwotICAgICAgICAgICAgICAgIENsYXNzIHNlcnZpY2VPYmplY3RNYWtlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXIubG9hZENsYXNzKGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgc2VydmljZU9iamVjdFBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGaW5kIHN0YXRpYyBnZXRTZXJ2aWNlT2JqZWN0KCkgbWV0aG9kLCBjYWxsIGl0IGlmIHRoZXJlCi0gICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlT2JqZWN0TWFrZXIuZ2V0TWV0aG9kKCJnZXRTZXJ2aWNlT2JqZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBBeGlzU2VydmljZS5jbGFzcyB9KTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uoc2VydmljZU9iamVjdE1ha2VyLm5ld0luc3RhbmNlKCksIG5ldyBPYmplY3RbXSB7IHNlcnZpY2UgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5zdGFuY2UgPSBzZXJ2aWNlSW1wbENsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJFbmRwb2ludENvbnRyb2xsZXJFcnI2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW1wbENsYXNzLmdldE5hbWUoKSkpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRW5kcG9pbnRDb250cm9sbGVyRXJyNiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiRW5kcG9pbnRDb250cm9sbGVyRXJyNiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDbGFzcy5nZXROYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgY3JlYXRlU09BUE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgIFNvYXBNZXNzYWdlQ29udGV4dCBzb2FwTWVzc2FnZUNvbnRleHQgPQotICAgICAgICAgICAgICAgIChTb2FwTWVzc2FnZUNvbnRleHQpIE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICByZXR1cm4gc29hcE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluamVjdFdlYlNlcnZpY2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1jLCBXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZUluamVjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlSW5qZWN0b3IgcmkgPQotICAgICAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uRmFjdG9yeS5jcmVhdGVSZXNvdXJjZUluamVjdG9yKFdlYlNlcnZpY2VDb250ZXh0LmNsYXNzKTsKLSAgICAgICAgcmkuaW5qZWN0KHdzQ29udGV4dCwgc2VydmljZUluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlQ29udGV4dChXZWJTZXJ2aWNlQ29udGV4dCB3c0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgc29hcE1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmVzb3VyY2VJbmplY3Rpb25FeGNlcHRpb24gewotICAgICAgICBXZWJTZXJ2aWNlQ29udGV4dEluamVjdG9yIHdjaSA9Ci0gICAgICAgICAgICAgICAgKFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3IpIFJlc291cmNlSW5qZWN0aW9uRmFjdG9yeS5jcmVhdGVSZXNvdXJjZUluamVjdG9yKFdlYlNlcnZpY2VDb250ZXh0SW5qZWN0b3IuY2xhc3MpOwotICAgICAgICB3Y2kuYWRkTWVzc2FnZUNvbnRleHQod3NDb250ZXh0LCBzb2FwTWVzc2FnZUNvbnRleHQpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQmluZGluZy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiOWQxYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7DQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGludGVyZmFjZSBCaW5kaW5nIGV4dGVuZHMgamF2YXgueG1sLndzLkJpbmRpbmcgew0KLSAgICBwdWJsaWMgdm9pZCBzZXRGZWF0dXJlcyhXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcyk7DQotICAgIA0KLSAgICBwdWJsaWMgV2ViU2VydmljZUZlYXR1cmUgZ2V0RmVhdHVyZShTdHJpbmcgaWQpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBCaW5kaW5nUHJvdmlkZXIgcHJvdmlkZXIpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZShFbmRwb2ludFJlZmVyZW5jZSBlcHIpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0QWRkcmVzc2luZ05hbWVzcGFjZShTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgIA0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0QXhpczJFbmRwb2ludFJlZmVyZW5jZSgpOw0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzaW5nTmFtZXNwYWNlKCk7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9CaW5kaW5nUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9CaW5kaW5nUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwMDY0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQmluZGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpbmRpbmdQcm92aWRlciBleHRlbmRzIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIgewotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgZ2V0U2VydmljZURlbGVnYXRlKCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjdjNTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotLyoqIEpBWFdTIFNQSSBDb25zdGFudHMgKi8KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgewotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIE1lc3NhZ2VDb250ZXh0IFByb3BlcnR5IEtleXMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBWYWx1ZSA9IEJvb2xlYW4KLSAgICAvLyBVc2FnZTogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIHRydWUgd2lsbCBjYXVzZSB0aGUgZW50aXJlIHJlcXVlc3QgbWVzc2FnZQotICAgIC8vICAgdG8gYmUgc2F2ZWQgYW5kIHJlc3RvcmVkLiBBIHJlbGlhYmxlIG1lc3NhZ2luZyBpbmJvdW5kIGhhbmRsZXIgc2hvdWxkIHNldCAKLSAgICAvLyAgIHRoaXMgZmxhZyBpZiB0aGUgZW50aXJlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNhdmVkLiAgU2V0dGluZyB0aGlzIGZsYWcgd2lsbCBzdWJzdGFudGlhbGx5Ci0gICAgLy8gICBkZWdyYWRlIHBlcmZvcm1hbmNlLgotICAgIC8vCi0gICAgLy8gICBUaGUgZGVmYXVsdCBpcyB0byBub3Qgc2F2ZSB0aGUgZW50aXJlIG1lc3NhZ2UuICBBZnRlciBzZXJ2ZXIgZGlzcGF0Y2ggcHJvY2Vzc2luZywgdGhlIAotICAgIC8vICAgYm9keSBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gIFRoaXMgaXMgYWNjZXB0YWJsZSBpbiBtb3N0IHNjZW5hcmlvcy4KLSAgICAvLwotICAgIC8vIFJFVklFVyBPbmx5IGhvbm9yZWQgb24gdGhlIHNlcnZlcjogU2F2ZWQgYmVmb3JlIGluYm91bmQgYXBwbGljYXRpb24gaGFuZGxlciBwcm9jZXNzaW5nIGFuZAotICAgIC8vICAgcmVzdG9yZWQgYWZ0ZXIgb3V0Ym91bmQgYXBwbGljYXRpb24gaGFuZGxlciBwcm9jZXNzaW5nLgotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9SRVFVRVNUX01TRyA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TQVZFX1JFUVVFU1RfTVNHIjsKLQotICAgIC8vIFZhbHVlID0gU3RyaW5nCi0gICAgLy8gVXNhZ2U6IFZhbHVlIG9mIHNhdmVkIHJlcXVlc3QKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVEX1JFUVVFU1RfTVNHX1RFWFQgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNBVkVEX1JFUVVFU1RfTVNHX1RFWFQiOwotCi0gICAgLy8gVmFsdWUgPSBDb2xsZWN0aW9uCi0gICAgLy8gVXNhZ2U6IEEgbGlzdCBvZiBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciBvYmplY3RzIHRoYXQgYXJlIHRvIGJlIGNhbGxlZCBmb3IgYW4gaW52b2NhdGlvbi4KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQgPQotICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9ycyI7Ci0gICAgCi0gICAgLy8gVmFsdWUgPSBDbGFzc0xvYWRlcgotICAgIC8vIFVzYWdlOiBTdG9yZXMgQ2xhc3NMb2FkZXIgaW5zdGFuY2Ugb24gcmVzcG9uc2UgbWVzc2FnZSBjb250ZXh0IHRoYXQgZW5zdXJlcyB0aGUgCi0gICAgLy8gSkFYQlV0aWxzIGNsYXNzIHdpbGwgdXNlIHRoZSBzYW1lIENsYXNzTG9hZGVyIHRvIHJldHJpZXZlIGEgSkFYQkNvbnRleHQgYXMgdGhlCi0gICAgLy8gb25lIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSByZXF1ZXN0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ0xBU1NMT0FERVIgPSAiQ0FDSEVfQ0xBU1NMT0FERVIiOwotICAgIAotICAgIC8vIFZhbHVlID0gTGlzdAotICAgIC8vIFVzYWdlOiBTdG9yZSBsaXN0IG9mIEludm9jYXRpb25MaXN0ZW5lciBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gcmVxdWVzdC9yZXNwb25zZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVk9DQVRJT05fTElTVEVORVJfTElTVCA9IAotICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuSU5WT0NBVElPTl9MSVNURU5FUl9MSVNUIjsKLSAgICAKLSAgICAvLyBWYWx1ZSA9IFRocm93YWJsZQotICAgIC8vIFVzYWdlOiBTdG9yZSBUaHJvd2FibGUgdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gY29uc3RydWN0aW5nIG1lc3NhZ2UgdG8gYmUKLSAgICAvLyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9FWENFUFRJT04gPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuTUFQUEVEX0VYQ0VQVElPTiI7Ci0gICAgCi0gICAgLyoqIEludGVudGlvbmFsbHkgUHJpdmF0ZSAqLwotICAgIHByaXZhdGUgQ29uc3RhbnRzKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1Byb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwMTFkYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YS5TZXJ2aWNlTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGEuV1NETExvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludFJlZmVyZW5jZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5FbmRwb2ludEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBQcm92aWRlciBleHRlbmRzIGphdmF4LnhtbC53cy5zcGkuUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVsZW1lbnRbXSBaRVJPX0xFTkdUSF9BUlJBWSA9IG5ldyBFbGVtZW50WzBdOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVuZHBvaW50IGNyZWF0ZUFuZFB1Ymxpc2hFbmRwb2ludChTdHJpbmcgcywgT2JqZWN0IG9iaikgewotICAgICAgICBFbmRwb2ludCBlcCA9IG5ldyBFbmRwb2ludEltcGwob2JqKTsKLSAgICAgICAgZXAucHVibGlzaChzKTsKLSAgICAgICAgcmV0dXJuIGVwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbmRwb2ludCBjcmVhdGVFbmRwb2ludChTdHJpbmcgYmluZGluZywgT2JqZWN0IG9iaikgewotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50SW1wbChvYmopOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgY3JlYXRlU2VydmljZURlbGVnYXRlKFVSTCB1cmwsIFFOYW1lIHFuYW1lLCBDbGFzcyBjbGF6eikgewotICAgICAgICByZXR1cm4gbmV3IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSh1cmwsIHFuYW1lLCBjbGF6eik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlIGNyZWF0ZVczQ0VuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzLAotICAgICAgICAgICAgUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICBRTmFtZSBwb3J0TmFtZSwKLSAgICAgICAgICAgIExpc3Q8RWxlbWVudD4gbWV0YWRhdGEsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbERvY3VtZW50TG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IHJlZmVyZW5jZVBhcmFtZXRlcnMpIHsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UgPQotICAgICAgICAJRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5nZXRBZGRyZXNzaW5nTmFtZXNwYWNlKFczQ0VuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsgICAgCQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQotICAgICAgICAJRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSwgd3NkbERvY3VtZW50TG9jYXRpb24sIGFkZHJlc3NpbmdOYW1lc3BhY2UpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmFkZE1ldGFkYXRhKGF4aXMyRVBSLCBtZXRhZGF0YS50b0FycmF5KFpFUk9fTEVOR1RIX0FSUkFZKSk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5hZGRSZWZlcmVuY2VQYXJhbWV0ZXJzKGF4aXMyRVBSLCByZWZlcmVuY2VQYXJhbWV0ZXJzLnRvQXJyYXkoWkVST19MRU5HVEhfQVJSQVkpKTsKLSAgICAgICAgCQotICAgICAgICAgICAgdzNjRVBSID0KLSAgICAgICAgICAgICAgICAoVzNDRW5kcG9pbnRSZWZlcmVuY2UpIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydEZyb21BeGlzMihheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJyZWZlcmVuY2VQYXJhbWV0ZXJDb25zdHJ1Y3Rpb25FcnIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdzNjRVBSOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KEVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSLCBDbGFzczxUPiBzZWksIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIGlmIChqYXh3c0VQUiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoTm9FbmRwb2ludFJlZmVyZW5jZTIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzZWkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZ2V0UG9ydEludmFsaWRTRUkiLCBqYXh3c0VQUi50b1N0cmluZygpLCAibnVsbCIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0VG9BeGlzMihheGlzMkVQUiwgamF4d3NFUFIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZEVuZHBvaW50UmVmZXJlbmNlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2VOYW1lIHNlcnZpY2VOYW1lID0KLSAgICAgICAgICAgIAlFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5nZXRTZXJ2aWNlTmFtZU1ldGFkYXRhKGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIFdTRExMb2NhdGlvbiB3c2RsTG9jYXRpb24gPQotICAgICAgICAgICAgCUVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmdldFdTRExMb2NhdGlvbk1ldGFkYXRhKGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgICAgIFVSTCB3c2RsTG9jYXRpb25VUkwgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIAl3c2RsTG9jYXRpb25VUkwgPSBuZXcgVVJMKHdzZGxMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIAl3c2RsTG9jYXRpb25VUkwgPSBuZXcgVVJMKGF4aXMyRVBSLmdldEFkZHJlc3MoKSArICI/d3NkbCIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzZXJ2aWNlRGVsZWdhdGUgPQotICAgICAgICAgICAgCW5ldyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUod3NkbExvY2F0aW9uVVJMLCBzZXJ2aWNlTmFtZS5nZXROYW1lKCksIFNlcnZpY2UuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludFVwZGF0ZUVycm9yIiksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZWxlZ2F0ZS5nZXRQb3J0KGF4aXMyRVBSLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCBzZWksIGZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgcmVhZEVuZHBvaW50UmVmZXJlbmNlKFNvdXJjZSBlcHJJbmZvc2V0KSB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF4d3NFUFIgPSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tU291cmNlKGVwckluZm9zZXQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnRSZWZDcmVhdGlvbkVycm9yIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gamF4d3NFUFI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1NlcnZpY2VEZWxlZ2F0ZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1NlcnZpY2VEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU0OGRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9TZXJ2aWNlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcudXRpbC5FbmRwb2ludFJlZmVyZW5jZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlByb3BlcnR5TWlncmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2guSkFYQkRpc3BhdGNoOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoLlhNTERpc3BhdGNoOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnByb3h5LkpBWFdTUHJveHlIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkubWlncmF0b3IuQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuRXhlY3V0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBTZXJ2aWNlRGVsZWdhdGUgc2VydmVzIGFzIHRoZSBiYWNraW5nIGltcGxlbWVudGF0aW9uIGZvciBhbGwgb2YgdGhlIG1ldGhvZHMgaW4gdGhlIHtAbGluawotICogamF2YXgueG1sLndzLlNlcnZpY2V9IEFQSS4gIFRoaXMgaXMgdGhlIHBsdWcgcG9pbnQgZm9yIHRoZSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRGVsZWdhdGUgZXh0ZW5kcyBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZpY2VEZWxlZ2F0ZS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBzcGFyc2VTZXJ2aWNlQ29tcG9zaXRlVGhyZWFkTG9jYWwgPSBuZXcgVGhyZWFkTG9jYWw8RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gc3BhcnNlUG9ydENvbXBvc2l0ZVRocmVhZExvY2FsID0gbmV3IFRocmVhZExvY2FsPERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAKLSAgICBwcml2YXRlIEV4ZWN1dG9yIGV4ZWN1dG9yOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZVFuYW1lOwotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbnVsbDsKLQotICAgIHByaXZhdGUgSGFuZGxlclJlc29sdmVyIGhhbmRsZXJSZXNvbHZlciA9IG51bGw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTk9OLVNUQU5EQVJEIFNQSSEgU2V0IGFueSBtZXRhZGF0YSB0byBiZSB1c2VkIG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgTkVYVCBTZXJ2aWNlIGJ5IHRoaXMgdGhyZWFkLgotICAgICAqIE5PVEUgdGhhdCB0aGlzIHVzZXMgVGhyZWFkTG9jYWwgdG8gc3RvcmUgdGhlIG1ldGFkYXRhLCBhbmQgdGhhdCBUaHJlYWRMb2NhbCBpcyBjbGVhcmVkIGFmdGVyIGl0IGlzCi0gICAgICogdXNlZCB0byBjcmVhdGUgYSBTZXJ2aWNlLiAgVGhhdCBtZWFuczoKLSAgICAgKiAxKSBUaGUgdGhyZWFkIHRoYXQgc2V0cyB0aGUgbWV0YWRhdGEgdG8gdXNlIE1VU1QgYmUgdGhlIHRocmVhZCB0aGF0IGNyZWF0ZXMgdGhlIFNlcnZpY2UKLSAgICAgKiAyKSBDcmVhdGlvbiBvZiB0aGUgU2VydmljZSBzaG91bGQgYmUgdGhlIHZlcnkgbmV4dCB0aGluZyB0aGUgdGhyZWFkIGRvZXMKLSAgICAgKiAzKSBUaGUgbWV0YWRhdGEgd2lsbCBiZSBzZXQgdG8gbnVsbCB3aGVuIHRoZSBTZXJ2aWNlIGlzIGNyZWF0ZWQsIHNvIHRvIGNyZWF0ZSBhbm90aGVyIAotICAgICAqICAgIHNlcnZpY2Ugd2l0aCB0aGUgc2FtZSBtZXRhZGF0YSwgaXQgd2lsbCBuZWVkIHRvIGJlIHNldCBhZ2FpbiBwcmlvciB0byBjcmVhdGluZyB0aGUKLSAgICAgKiAgICBzZXJ2aWNlCi0gICAgICogNCkgVGhlIG1ldGFkYXRhIGNhbiBiZSBzZXQgcHJpb3IgdG8gY3JlYXRpbmcgYm90aCBnZW5lcmljIFNlcnZpY2UgYW5kIGdlbmVyYXRlZCBTZXJ2aWNlIAotICAgICAqICAgIGluc3RhbmNlcy4gICAgICAKLSAgICAgKiAKLSAgICAgKiBUaGlzIGFsbG93cyBjcmVhdGluZyBhIGdlbmVyaWMgU2VydmljZSAoamF2YXgueG1sLndzLlNlcnZpY2UpIG9yIGEgZ2VuZXJhdGVkIFNlcnZpY2UKLSAgICAgKiAoc3ViY2xhc3Mgb2YgamF2YXgueG1sLndzLlNlcnZpY2UpIHNwZWNpZnlpbmcgYWRkaXRpb25hbCBtZXRhZGF0YSB2aWEgYQotICAgICAqIHNwYXJzZSBjb21wb3NpdGUuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IGEgcnVudGltZSB0byBjcmVhdGUgYSBTZXJ2aWNlIGZvciBhIHJlcXVlc3RlciB1c2luZwotICAgICAqIGFkZGl0aW9uYWwgbWV0YWRhdGEgc3VjaCBhcyBtaWdodCBjb21lIGZyb20gYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb3IgZnJvbSByZXNvdXJjZQotICAgICAqIGluamVjdGlvbiBwcm9jZXNzaW5nIG9mIEBSZXNvdXJjZSBvciBAV2ViU2VydmljZVJlZihzKSBhbm5vdGF0aW9ucy4gIEFkZGl0aW9uYWwgbWV0YWRhdGEKLSAgICAgKiBtYXkgaW5jbHVkZSB0aGluZ3MgbGlrZSBAV2ViU2VydmljZUNsaWVudC53c2RsTG9jYXRpb24gb3IgYSBASGFuZGxlckNoYWluIHNwZWNpZmljYXRpb24uCi0gICAgICogCi0gICAgICogICAgQHNlZSBqYXZheC54bWwud3MuU2VydmljZSNjcmVhdGUoUU5hbWUpCi0gICAgICogICAgQHNlZSBqYXZheC54bWwud3MuU2VydmljZSNjcmVhdGUoVVJMLCBRTmFtZSkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIEFkZGl0aW9uYWwgbWV0YWRhdGEgKGlmIGFueSkgdG8gYmUgdXNlZCBpbiBjcmVhdGlvbiBvZiB0aGUgc2VydmljZQotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTWV0YWRhdGEoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBzcGFyc2VTZXJ2aWNlQ29tcG9zaXRlVGhyZWFkTG9jYWwuc2V0KGNvbXBvc2l0ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE5PTi1TVEFOREFSRCBTUEkhIFJldHVybnMgdGhlIGNvbXBvc2l0ZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiB0aGUgY3JlYXRpb24gb2YgdGhlIG5leHQgCi0gICAgICogU2VydmljZSBieSB0aGlzIHRocmVhZC4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNzZXRTZXJ2aWNlTWV0YWRhdGEoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKQotICAgICAqIAotICAgICAqIEByZXR1cm4gY29tcG9zaXRlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgbmV4dCBTZXJ2aWNlIGJ5IHRoaXMgdGhyZWFkLCBvciBudWxsCi0gICAgICogICAgICAgICBpZiBubyBjb21wb3NpdGUgaXMgdG8gYmUgdXNlZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGdldFNlcnZpY2VNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIHNwYXJzZVNlcnZpY2VDb21wb3NpdGVUaHJlYWRMb2NhbC5nZXQoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFueSBjb21wb3NpdGUgc28gdGhhdCBjcmVhdGlvbiBvZiB0aGUgbmV4dCBTZXJ2aWNlIGJ5IHRoaXMgdGhyZWFkIHdpbGwgTk9UIGJlIAotICAgICAqIGFmZmVjdGVkIGJ5IGFueSBhZGRpdGlvbmFsIG1ldGFkYXRhLgotICAgICAqIAotICAgICAqIEBzZWUgI3NldFNlcnZpY2VNZXRhZGF0YShEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUpCi0gICAgICogCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgcmVzZXRTZXJ2aWNlTWV0YWRhdGEoKSB7Ci0gICAgICAgIHNwYXJzZVNlcnZpY2VDb21wb3NpdGVUaHJlYWRMb2NhbC5zZXQobnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIE5PTi1TVEFOREFSRCBTUEkhIFNldCBhbnkgbWV0YWRhdGEgdG8gYmUgdXNlZCBvbiB0aGUgY3JlYXRpb24gb2YgdGhlIE5FWFQgUG9ydCBieSB0aGlzIHRocmVhZC4KLSAgICAgKiBOT1RFIHRoYXQgdGhpcyB1c2VzIFRocmVhZExvY2FsIHRvIHN0b3JlIHRoZSBtZXRhZGF0YSwgYW5kIHRoYXQgVGhyZWFkTG9jYWwgaXMgY2xlYXJlZCBhZnRlciBpdCBpcwotICAgICAqIHVzZWQgdG8gY3JlYXRlIGEgUG9ydC4gIFRoYXQgbWVhbnM6Ci0gICAgICogMSkgVGhlIHRocmVhZCB0aGF0IHNldHMgdGhlIG1ldGFkYXRhIHRvIHVzZSBNVVNUIGJlIHRoZSB0aHJlYWQgdGhhdCBjcmVhdGVzIHRoZSBQb3J0Ci0gICAgICogMikgQ3JlYXRpb24gb2YgdGhlIFBvcnQgc2hvdWxkIGJlIHRoZSB2ZXJ5IG5leHQgdGhpbmcgdGhlIHRocmVhZCBkb2VzCi0gICAgICogMykgVGhlIG1ldGFkYXRhIHdpbGwgYmUgc2V0IHRvIG51bGwgd2hlbiB0aGUgUG9ydCBpcyBjcmVhdGVkLCBzbyB0byBjcmVhdGUgYW5vdGhlciAKLSAgICAgKiAgICBQb3J0IHdpdGggdGhlIHNhbWUgbWV0YWRhdGEsIGl0IHdpbGwgbmVlZCB0byBiZSBzZXQgYWdhaW4gcHJpb3IgdG8gY3JlYXRpbmcgdGhlCi0gICAgICogICAgUG9ydAotICAgICAqIDQpIFRoZSBtZXRhZGF0YSBjYW4gYmUgc2V0IHByaW9yIHRvIGNyZWF0aW5nIFBvcnQgd2hpY2ggc3BlY2lmaWVzIGEgUU5hbWUgdmlhIAotICAgICAqICAgIFNlcnZpY2UuZ2V0UG9ydChRTmFtZSwgQ2xhc3MpIG9yIG9uZSB0aGF0IG9ubHkgc3BlY2lmaWVzIHRoZSBTRUkgY2xhc3MgdmlhIAotICAgICAqICAgIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykKLSAgICAgKiA1KSBNZXRhZGF0YSBjYW4gbm90IGJlIHNwZWNpZmllZCBmb3IgZHluYW1pYyBwb3J0cywgaS5lLiB0aG9zZSBhZGRlZCB2aWEgCi0gICAgICogICAgU2VydmljZS5hZGRQb3J0KC4uLikuCi0gICAgICogNikgTWV0YWRhdGEgY2FuIG5vdCBiZSBzcGVjZmllZCB3aGVuIGNyZWF0aW5nIGEgZGlzcGF0Y2ggY2xpZW50LCBpLmUuIHZpYSAKLSAgICAgKiAgICBTZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKC4uLikKLSAgICAgKiA3KSBUaGUgU2VydmljZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcG9ydCBjYW4gYmUgdGhlIGdlbmVyaWMgc2VydmljZSBvciBhIGdlbmVyYXRlZCAKLSAgICAgKiAgICBzZXJ2aWNlLiAgICAgIAotICAgICAqIAotICAgICAqIFRoaXMgYWxsb3dzIGNyZWF0aW5nIFBvcnQgc3BlY2lmeWluZyBhZGRpdGlvbmFsIG1ldGFkYXRhIHZpYSBhIHNwYXJzZSBjb21wb3NpdGUuICAKLSAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IGEgcnVudGltZSB0byBjcmVhdGUgYSBQb3J0IGZvciBhIHJlcXVlc3RlciB1c2luZwotICAgICAqIGFkZGl0aW9uYWwgbWV0YWRhdGEgc3VjaCBhcyBtaWdodCBjb21lIGZyb20gYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb3IgZnJvbSByZXNvdXJjZQotICAgICAqIGluamVjdGlvbiBwcm9jZXNzaW5nLiAgQWRkaXRpb25hbCBtZXRhZGF0YSBtaWdodCBpbmNsdWRlIHRoaW5ncyBsaWtlIAotICAgICAqIGEgQEhhbmRsZXJDaGFpbiBzcGVjaWZpY2F0aW9uLgotICAgICAqIAotICAgICAqICAgIEBzZWUgamF2YXgueG1sLndzLlNlcnZpY2UjZ2V0UG9ydChDbGFzcykKLSAgICAgKiAgICBAc2VlIGphdmF4LnhtbC53cy5TZXJ2aWNlI2dldFBvcnQoUU5hbWUsIENsYXNzKQotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgQWRkaXRpb25hbCBtZXRhZGF0YSAoaWYgYW55KSB0byBiZSB1c2VkIGluIGNyZWF0aW9uIG9mIHRoZSBwb3J0Ci0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIHNldFBvcnRNZXRhZGF0YShEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIHNwYXJzZVBvcnRDb21wb3NpdGVUaHJlYWRMb2NhbC5zZXQoY29tcG9zaXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOT04tU1RBTkRBUkQgU1BJISBSZXR1cm5zIHRoZSBjb21wb3NpdGUgdGhhdCB3aWxsIGJlIHVzZWQgb24gdGhlIGNyZWF0aW9uIG9mIHRoZSBuZXh0IAotICAgICAqIFBvcnQgYnkgdGhpcyB0aHJlYWQuCi0gICAgICogCi0gICAgICogQHNlZSAjc2V0UG9ydE1ldGFkYXRhKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvbXBvc2l0ZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiB0aGUgY3JlYXRpb24gb2YgdGhlIG5leHQgUG9ydCBieSB0aGlzIHRocmVhZCwgb3IgbnVsbAotICAgICAqICAgICAgICAgaWYgbm8gY29tcG9zaXRlIGlzIHRvIGJlIHVzZWQuCi0gICAgICovCi0gICAgc3RhdGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXRQb3J0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBzcGFyc2VQb3J0Q29tcG9zaXRlVGhyZWFkTG9jYWwuZ2V0KCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSBhbnkgY29tcG9zaXRlIHNvIHRoYXQgY3JlYXRpb24gb2YgdGhlIG5leHQgUG9ydCBieSB0aGlzIHRocmVhZCB3aWxsIE5PVCBiZSAKLSAgICAgKiBhZmZlY3RlZCBieSBhbnkgYWRkaXRpb25hbCBtZXRhZGF0YS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNzZXRQb3J0TWV0YWRhdGEoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKQotICAgICAqIAotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHJlc2V0UG9ydE1ldGFkYXRhKCkgewotICAgICAgIHNwYXJzZVBvcnRDb21wb3NpdGVUaHJlYWRMb2NhbC5zZXQobnVsbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUoVVJMIHVybCwgUU5hbWUgcW5hbWUsIENsYXNzIGNsYXp6KSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuc2VydmljZVFuYW1lID0gcW5hbWU7Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkU2VydmljZU5hbWUoKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlbGVnYXRlQ29uc3RydWN0MCIsICIiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IGFueSBtZXRhZGF0YSB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gYnVpbGQgdXAgdGhpcyBzZXJ2aWNlLCB0aGVuIHJlc2V0IGl0IHNvIGl0IGlzbid0IHVzZWQKLSAgICAgICAgLy8gdG8gY3JlYXRlIGFueSBvdGhlciBzZXJ2aWNlcy4KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGdldFNlcnZpY2VNZXRhZGF0YSgpOwotICAgICAgICByZXNldFNlcnZpY2VNZXRhZGF0YSgpOwotICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24odXJsLCBzZXJ2aWNlUW5hbWUsIGNsYXp6LCBzcGFyc2VDb21wb3NpdGUsIHRoaXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbih1cmwsIHNlcnZpY2VRbmFtZSwgY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IFRoaXMgY2hlY2sgc2hvdWxkIGJlIGRvbmUgd2hlbiB0aGUgU2VydmljZSBEZXNjcmlwdGlvbiBpcyBjcmVhdGVkIGFib3ZlOyB0aGF0IHNob3VsZCB0aHJvdyB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgICAgLy8gVGhhdCBpcyBiZWNhdXNlIHdlIChmb2xsb3dpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBSSSkgcmVxdWlyZSB0aGUgV1NETCBiZSBmdWxseSBzcGVjaWZpZWQgKG5vdCBwYXJ0aWFsKSBvbiB0aGUgY2xpZW50Ci0gICAgICAgIGlmIChpc1ZhbGlkV1NETExvY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlRGVmaW5lZChzZXJ2aWNlUW5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2VEZWxlZ2F0ZUNvbnN0cnVjdDAiLCBzZXJ2aWNlUW5hbWUudG9TdHJpbmcoKSwgdXJsLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9UT0RPOiBJcyB0aGlzIHRoZSBiZXN0IHBsYWNlIGZvciB0aGlzIGNvZGU/Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKTsKLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgbmVjZXNzYXJ5IEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9ycwotICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwuYWRkQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IoY29udGV4dCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBuZXcgUHJvcGVydHlNaWdyYXRvcigpKTsKLSAgICB9Ci0KLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEpBWC1XUyBBUEkgbWV0aG9kcwotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNhZGRQb3J0KGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgKi8KLSAgICAvLyBDcmVhdGVzIGEgRElTUEFUQ0ggT05MWSBwb3J0LiAgUGVyIEpBWFdTIFNlYyA0LjEgamF2YXgueG0uLndzLlNlcnZpY2UsIHAuIDQ5LCBwb3J0cyBhZGRlZCB2aWEgYWRkUG9ydCBtZXRob2QKLSAgICAvLyBhcmUgb25seSBzdWl0aWJhbGUgZm9yIGNyZWF0aW5nIERpc3RwYWNoIGluc3RhbmNlcy4KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0KFFOYW1lIHBvcnROYW1lLCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgYWRkUG9ydCA6ICgiCi0gICAgICAgICAgICAgICAgICAgICAgKyBwb3J0TmFtZSArICIsIiArIGJpbmRpbmdJZCArICIsIiArIGVuZHBvaW50QWRkcmVzcyArICIpIik7Ci0gICAgICAgIH0KLSAgICAJaWYoZW5kcG9pbnRBZGRyZXNzIT1udWxsICYmIGVuZHBvaW50QWRkcmVzcy50cmltKCkubGVuZ3RoKCk9PTApewotICAgIAkJRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJhZGRQb3J0RXJyMSIsIChwb3J0TmFtZSE9bnVsbCk/cG9ydE5hbWUuZ2V0TG9jYWxQYXJ0KCk6IiIsIGVuZHBvaW50QWRkcmVzcykpOwotICAgIAl9Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBudWxsLCBwb3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuQUREX1BPUlQsIHRoaXMsIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICAgICAgLy8gVE9ETzogTmVlZCB0byBzZXQgZW5kcG9pbnRBZGRyZXNzIGFuZCBzZXQgb3IgY2hlY2sgYmluZGluZ0lkIG9uIHRoZSBFbmRwb2ludERlc2MKLSAgICAgICAgZW5kcG9pbnREZXNjLnNldEVuZHBvaW50QWRkcmVzcyhlbmRwb2ludEFkZHJlc3MpOwotICAgICAgICBlbmRwb2ludERlc2Muc2V0Q2xpZW50QmluZGluZ0lEKGJpbmRpbmdJZCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUjY3JlYXRlRGlzcGF0Y2goamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgamF2YS5sYW5nLkNsYXNzLCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlKQotICAgICovCi0gICAgcHVibGljIDxUPiBEaXNwYXRjaDxUPiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgQ2xhc3M8VD4gdHlwZSwgTW9kZSBtb2RlKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWUsIHR5cGUsIG1vZGUsIChXZWJTZXJ2aWNlRmVhdHVyZVtdKSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNjcmVhdGVEaXNwYXRjaChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lLCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCwgamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZSkKLSAgICAqLwotICAgIHB1YmxpYyBEaXNwYXRjaDxqYXZhLmxhbmcuT2JqZWN0PiBjcmVhdGVEaXNwYXRjaChRTmFtZSBwb3J0TmFtZSwgSkFYQkNvbnRleHQgY29udGV4dCwgTW9kZSBtb2RlKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgY29udGV4dCwgbW9kZSwgKFdlYlNlcnZpY2VGZWF0dXJlW10pIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VD4gRGlzcGF0Y2g8VD4gY3JlYXRlRGlzcGF0Y2goRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIsIENsYXNzPFQ+IHR5cGUsIE1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIGlmIChqYXh3c0VQUiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaE5vRW5kcG9pbnRSZWZlcmVuY2UiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghaXNWYWxpZERpc3BhdGNoVHlwZSh0eXBlKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZGlzcGF0Y2hJbnZhbGlkVHlwZSIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFpc1ZhbGlkRGlzcGF0Y2hUeXBlV2l0aE1vZGUodHlwZSwgbW9kZSkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoSW52YWxpZFR5cGVXaXRoTW9kZSIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0VG9BeGlzMihheGlzMkVQUiwgamF4d3NFUFIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRFbmRwb2ludFJlZmVyZW5jZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIG51bGwsIGF4aXMyRVBSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5DUkVBVEVfRElTUEFUQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnREZXNjcmlwdGlvbkNvbnN0cnVjdGlvbkZhaWx1cmUiLCAKLSAgICAgICAgICAgICAgICAgICAgamF4d3NFUFIudG9TdHJpbmcoKSkpOyAKLSAgICAgICAgfQotCi0gICAgICAgIFhNTERpc3BhdGNoPFQ+IGRpc3BhdGNoID0gbmV3IFhNTERpc3BhdGNoPFQ+KHRoaXMsIGVuZHBvaW50RGVzYywgYXhpczJFUFIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIGZlYXR1cmVzKTsKLQotICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaC5zZXRNb2RlKG1vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzcGF0Y2guc2V0TW9kZShTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNsaWVudCA9PSBudWxsKQotICAgICAgICAgICAgc2VydmljZUNsaWVudCA9IGdldFNlcnZpY2VDbGllbnQoZW5kcG9pbnREZXNjLmdldFBvcnRRTmFtZSgpKTsKLQotICAgICAgICBkaXNwYXRjaC5zZXRTZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpOwotICAgICAgICBkaXNwYXRjaC5zZXRUeXBlKHR5cGUpOwotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpc3BhdGNoPE9iamVjdD4gY3JlYXRlRGlzcGF0Y2goRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIsIEpBWEJDb250ZXh0IGNvbnRleHQsIE1vZGUgbW9kZSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIGlmIChqYXh3c0VQUiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaE5vRW5kcG9pbnRSZWZlcmVuY2UiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJFUFIsIGpheHdzRVBSKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZEVuZHBvaW50UmVmZXJlbmNlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIG51bGwsIGF4aXMyRVBSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5DUkVBVEVfRElTUEFUQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25Db25zdHJ1Y3Rpb25GYWlsdXJlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpheHdzRVBSLnRvU3RyaW5nKCkpKTsgCi0gICAgICAgIH0KLQotICAgICAgICBKQVhCRGlzcGF0Y2g8T2JqZWN0PiBkaXNwYXRjaCA9IG5ldyBKQVhCRGlzcGF0Y2godGhpcywgZW5kcG9pbnREZXNjLCBheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSwgZmVhdHVyZXMpOwotCi0gICAgICAgIGlmIChtb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoLnNldE1vZGUobW9kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXNwYXRjaC5zZXRNb2RlKFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlQ2xpZW50ID09IG51bGwpCi0gICAgICAgICAgICBzZXJ2aWNlQ2xpZW50ID0gZ2V0U2VydmljZUNsaWVudChlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCkpOwotCi0gICAgICAgIGRpc3BhdGNoLnNldEpBWEJDb250ZXh0KGNvbnRleHQpOwotICAgICAgICBkaXNwYXRjaC5zZXRTZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpOwotCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IERpc3BhdGNoPFQ+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBDbGFzczxUPiB0eXBlLCBNb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlRGlzcGF0Y2hGYWlsMCIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFpc1ZhbGlkRGlzcGF0Y2hUeXBlKHR5cGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaEludmFsaWRUeXBlIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc1ZhbGlkRGlzcGF0Y2hUeXBlV2l0aE1vZGUodHlwZSwgbW9kZSkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImRpc3BhdGNoSW52YWxpZFR5cGVXaXRoTW9kZSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCAKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5DUkVBVEVfRElTUEFUQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotCi0gICAgICAgIGlmIChlbmRwb2ludERlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlRGlzcGF0Y2hGYWlsMiIsIHBvcnROYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFhNTERpc3BhdGNoPFQ+IGRpc3BhdGNoID0gbmV3IFhNTERpc3BhdGNoPFQ+KHRoaXMsIGVuZHBvaW50RGVzYywgZmVhdHVyZXMpOwotCi0gICAgICAgIGlmIChtb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoLnNldE1vZGUobW9kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkaXNwYXRjaC5zZXRNb2RlKFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlQ2xpZW50ID09IG51bGwpCi0gICAgICAgICAgICBzZXJ2aWNlQ2xpZW50ID0gZ2V0U2VydmljZUNsaWVudChwb3J0TmFtZSk7Ci0KLSAgICAgICAgZGlzcGF0Y2guc2V0U2VydmljZUNsaWVudChzZXJ2aWNlQ2xpZW50KTsKLSAgICAgICAgZGlzcGF0Y2guc2V0VHlwZSh0eXBlKTsKLSAgICAgICAgcmV0dXJuIGRpc3BhdGNoOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaXNwYXRjaDxPYmplY3Q+IGNyZWF0ZURpc3BhdGNoKFFOYW1lIHBvcnROYW1lLCBKQVhCQ29udGV4dCBjb250ZXh0LCBNb2RlIG1vZGUsIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICBpZiAocG9ydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlRGlzcGF0Y2hGYWlsMCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCAKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5DUkVBVEVfRElTUEFUQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotCi0gICAgICAgIGlmIChlbmRwb2ludERlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlRGlzcGF0Y2hGYWlsMiIsIHBvcnROYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEpBWEJEaXNwYXRjaDxPYmplY3Q+IGRpc3BhdGNoID0gbmV3IEpBWEJEaXNwYXRjaCh0aGlzLCBlbmRwb2ludERlc2MsIGZlYXR1cmVzKTsKLQotICAgICAgICBpZiAobW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaC5zZXRNb2RlKG1vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzcGF0Y2guc2V0TW9kZShTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNsaWVudCA9PSBudWxsKQotICAgICAgICAgICAgc2VydmljZUNsaWVudCA9IGdldFNlcnZpY2VDbGllbnQocG9ydE5hbWUpOwotCi0gICAgICAgIGRpc3BhdGNoLnNldEpBWEJDb250ZXh0KGNvbnRleHQpOwotICAgICAgICBkaXNwYXRjaC5zZXRTZXJ2aWNlQ2xpZW50KHNlcnZpY2VDbGllbnQpOwotCi0gICAgICAgIHJldHVybiBkaXNwYXRjaDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2dldFBvcnQoamF2YS5sYW5nLkNsYXNzKQotICAgICAqLwotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KENsYXNzPFQ+IHNlaSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UG9ydCgoUU5hbWUpIG51bGwsIHNlaSwgKFdlYlNlcnZpY2VGZWF0dXJlW10pIG51bGwpOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2dldFBvcnQoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSwgamF2YS5sYW5nLkNsYXNzKQotICAgICovCi0gICAgcHVibGljIDxUPiBUIGdldFBvcnQoUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IHNlaSkgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0UG9ydChwb3J0TmFtZSwgc2VpLCAoV2ViU2VydmljZUZlYXR1cmVbXSkgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUPiBUIGdldFBvcnQoQ2xhc3M8VD4gc2VpLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICByZXR1cm4gZ2V0UG9ydCgoUU5hbWUpIG51bGwsIHNlaSwgZmVhdHVyZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VD4gVCBnZXRQb3J0KEVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSLCBDbGFzczxUPiBzZWksIFdlYlNlcnZpY2VGZWF0dXJlLi4uIGZlYXR1cmVzKSB7Ci0gICAgICAgIC8qIFRPRE8gQ2hlY2sgdG8gc2VlIGlmIFdTREwgTG9jYXRpb24gaXMgcHJvdmlkZWQuCi0gICAgICAgICAqIGlmIG5vdCBjaGVjayBXZWJTZXJ2aWNlIGFubm90YXRpb24ncyBXU0RMTG9jYXRpb24KLSAgICAgICAgICogaWYgYm90aCBhcmUgbm90IHByb3ZpZGVkIHRoZW4gdGhyb3cgZXhjZXB0aW9uLgotICAgICAgICAgKiAoSkxCKTogSSdtIG5vdCBzdXJlIGxhY2sgb2YgV1NETCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uCi0gICAgICAgICAqLwotCi0KLSAgICAgICAgaWYgKCFpc1ZhbGlkV1NETExvY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIC8vVE9ETzogU2hvdWxkIEkgdGhyb3cgRXhjZXB0aW9uIGlmIG5vIFdTREwKLSAgICAgICAgICAgIC8vdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigiV1NMRCBOb3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGpheHdzRVBSID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJkaXNwYXRjaE5vRW5kcG9pbnRSZWZlcmVuY2UyIikpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImdldFBvcnRJbnZhbGlkU0VJIiwgamF4d3NFUFIudG9TdHJpbmcoKSwgIm51bGwiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJFUFIsIGpheHdzRVBSKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRFbmRwb2ludFJlZmVyZW5jZSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZ2V0UG9ydChheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSwgc2VpLCBmZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUPiBUIGdldFBvcnQoUU5hbWUgcG9ydE5hbWUsIENsYXNzPFQ+IHNlaSwgV2ViU2VydmljZUZlYXR1cmUuLi4gZmVhdHVyZXMpIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIC8qIFRPRE8gQ2hlY2sgdG8gc2VlIGlmIFdTREwgTG9jYXRpb24gaXMgcHJvdmlkZWQuCi0gICAgICAgICAqIGlmIG5vdCBjaGVjayBXZWJTZXJ2aWNlIGFubm90YXRpb24ncyBXU0RMTG9jYXRpb24KLSAgICAgICAgICogaWYgYm90aCBhcmUgbm90IHByb3ZpZGVkIHRoZW4gdGhyb3cgZXhjZXB0aW9uLgotICAgICAgICAgKiAoSkxCKTogSSdtIG5vdCBzdXJlIGxhY2sgb2YgV1NETCBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uCi0gICAgICAgICAqLwotCi0KLSAgICAgICAgaWYgKCFpc1ZhbGlkV1NETExvY2F0aW9uKCkpIHsKLSAgICAgICAgICAgIC8vVE9ETzogU2hvdWxkIEkgdGhyb3cgRXhjZXB0aW9uIGlmIG5vIFdTREwKLSAgICAgICAgICAgIC8vdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigiV1NMRCBOb3QgZm91bmQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImdldFBvcnRJbnZhbGlkU0VJIiwgcG9ydE5hbWUudG9TdHJpbmcoKSwgIm51bGwiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gZ2V0UG9ydE1ldGFkYXRhKCk7Ci0gICAgICAgIHJlc2V0UG9ydE1ldGFkYXRhKCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gbnVsbDsKLSAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmRwb2ludERlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgcG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUsIHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZW5kcG9pbnREZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdGhpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5kcG9pbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInBvcnRFcnIiLHBvcnROYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGludGVyZmFjZXNOYW1lcyA9IAotICAgICAgICAgICAgbmV3IFN0cmluZyBbXSB7c2VpLmdldE5hbWUoKSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyLmNsYXNzLmdldE5hbWUoKX07Ci0gICAgICAgIAotICAgICAgICAvLyBBcyByZXF1aXJlZCBieSBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eSwgZW5zdXJlIHRoYXQgdGhlIGludGVyZmFjZXMKLSAgICAgICAgLy8gZm9yIHRoZSBwcm94eSBhcmUgbG9hZGFibGUgYnkgdGhlIHNhbWUgY2xhc3MgbG9hZGVyLiAKLSAgICAgICAgQ2xhc3NbXSBpbnRlcmZhY2VzID0gbnVsbDsKLSAgICAgICAgLy8gRmlyc3QsIGxldCdzIHRyeSBsb2FkaW5nIHRoZSBpbnRlcmZhY2VzIHdpdGggdGhlIFNFSSBjbGFzc0xvYWRlcgotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzTG9hZGVyKHNlaSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VzID0gbG9hZENsYXNzZXMoY2xhc3NMb2FkZXIsIGludGVyZmFjZXNOYW1lcyk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgIC8vIExldCdzIHRyeSB3aXRoIGNvbnRleHQgY2xhc3NMb2FkZXIgbm93Ci0gICAgICAgICAgICBjbGFzc0xvYWRlciA9IGdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VzID0gbG9hZENsYXNzZXMoY2xhc3NMb2FkZXIsIGludGVyZmFjZXNOYW1lcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwb3J0RXJyMSIpLCBlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEpBWFdTUHJveHlIYW5kbGVyIHByb3h5SGFuZGxlciA9IG5ldyBKQVhXU1Byb3h5SGFuZGxlcih0aGlzLCBpbnRlcmZhY2VzWzBdLCBlbmRwb2ludERlc2MsIGZlYXR1cmVzKTsKLSAgICAgICAgT2JqZWN0IHByb3h5Q2xhc3MgPSBQcm94eS5uZXdQcm94eUluc3RhbmNlKGNsYXNzTG9hZGVyLCBpbnRlcmZhY2VzLCBwcm94eUhhbmRsZXIpOwotICAgICAgICByZXR1cm4gc2VpLmNhc3QocHJveHlDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUjZ2V0RXhlY3V0b3IoKQotICAgICovCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotICAgICAgICAvL0ZJWE1FOiBVc2UgY2xpZW50IHByb3ZpZGVyIGV4ZWN1dG9yIHRvby4KLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWN1dG9yID0gZ2V0RGVmYXVsdEV4ZWN1dG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4ZWN1dG9yOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2dldEhhbmRsZXJSZXNvbHZlcigpCi0gICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVyIGdldEhhbmRsZXJSZXNvbHZlcigpIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIGlmIChoYW5kbGVyUmVzb2x2ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlclJlc29sdmVyID0gbmV3IEhhbmRsZXJSZXNvbHZlckltcGwoc2VydmljZURlc2NyaXB0aW9uLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlclJlc29sdmVyOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI2dldFBvcnRzKCkKLSAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvcjxRTmFtZT4gZ2V0UG9ydHMoKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICByZXR1cm4gZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0UG9ydHModGhpcykuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwud3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZSNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlUW5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLndzLnNwaS5TZXJ2aWNlRGVsZWdhdGUjZ2V0V1NETERvY3VtZW50TG9jYXRpb24oKQotICAgICovCi0gICAgcHVibGljIFVSTCBnZXRXU0RMRG9jdW1lbnRMb2NhdGlvbigpIHsKLSAgICAgICAgdmVyaWZ5U2VydmljZURlc2NyaXB0aW9uQWN0aXZlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKSBzZXJ2aWNlRGVzY3JpcHRpb24pLmdldFdTRExMb2NhdGlvbigpOwotICAgICAgICAgICAgaWYod3NkbExvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI3NldEV4ZWN1dG9yKGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yKQotICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0b3IoRXhlY3V0b3IgZSkgewotICAgICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjYW5ub3RTZXRFeGN1dG9yVG9OdWxsIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0b3IgPSBlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC53cy5zcGkuU2VydmljZURlbGVnYXRlI3NldEhhbmRsZXJSZXNvbHZlcihqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXIpCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyUmVzb2x2ZXIoSGFuZGxlclJlc29sdmVyIGhhbmRsZXJyZXNvbHZlcikgewotICAgICAgICB0aGlzLmhhbmRsZXJSZXNvbHZlciA9IGhhbmRsZXJyZXNvbHZlcjsKLSAgICB9Ci0KLSAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEludGVybmFsIHB1YmxpYyBBUElzCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKiBHZXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiB0cmVlIHRoYXQgdGhpcyBTZXJ2aWNlRGVsZWdhdGUgKi8KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0aW9uIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvL1RPRE8gQ2hhbmdlIHdoZW4gU2VydmljZURlc2NyaXB0aW9uIGhhcyB0byByZXR1cm4gU2VydmljZUNsaWVudCBvciBPcGVyYXRpb25DbGllbnQKLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ2xpZW50IGdldFNlcnZpY2VDbGllbnQoUU5hbWUgcG9ydFFOYW1lKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICByZXR1cm4gc2VydmljZURlc2NyaXB0aW9uLmdldFNlcnZpY2VDbGllbnQocG9ydFFOYW1lLCB0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIDxUPiBUIGdldFBvcnQob3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwgQ2xhc3M8VD4gc2VpLCBXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgewotICAgICAgICB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGdldFBvcnRNZXRhZGF0YSgpOwotICAgICAgICByZXNldFBvcnRNZXRhZGF0YSgpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBheGlzMkVQUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZSwgdGhpcyk7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBheGlzMkVQUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZW5kcG9pbnREZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZWxlZ2F0ZU5vUG9ydCIsIGF4aXMyRVBSLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzTmFtZXMgPSAKLSAgICAgICAgICAgIG5ldyBTdHJpbmcgW10ge3NlaS5nZXROYW1lKCksIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlci5jbGFzcy5nZXROYW1lKCl9OwotICAgICAgICAKLSAgICAgICAgLy8gQXMgcmVxdWlyZWQgYnkgamF2YS5sYW5nLnJlZmxlY3QuUHJveHksIGVuc3VyZSB0aGF0IHRoZSBpbnRlcmZhY2VzCi0gICAgICAgIC8vIGZvciB0aGUgcHJveHkgYXJlIGxvYWRhYmxlIGJ5IHRoZSBzYW1lIGNsYXNzIGxvYWRlci4gCi0gICAgICAgIENsYXNzW10gaW50ZXJmYWNlcyA9IG51bGw7Ci0gICAgICAgIC8vIEZpcnN0LCBsZXQncyB0cnkgbG9hZGluZyB0aGUgaW50ZXJmYWNlcyB3aXRoIHRoZSBTRUkgY2xhc3NMb2FkZXIKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzc0xvYWRlcihzZWkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50ZXJmYWNlcyA9IGxvYWRDbGFzc2VzKGNsYXNzTG9hZGVyLCBpbnRlcmZhY2VzTmFtZXMpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAvLyBMZXQncyB0cnkgd2l0aCBjb250ZXh0IGNsYXNzTG9hZGVyIG5vdwotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlcyA9IGxvYWRDbGFzc2VzKGNsYXNzTG9hZGVyLCBpbnRlcmZhY2VzTmFtZXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVsZWdhdGVQcm94eUVycm9yIiwgZTIuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBKQVhXU1Byb3h5SGFuZGxlciBwcm94eUhhbmRsZXIgPSBuZXcgSkFYV1NQcm94eUhhbmRsZXIodGhpcywgaW50ZXJmYWNlc1swXSwgZW5kcG9pbnREZXNjLCBheGlzMkVQUiwgYWRkcmVzc2luZ05hbWVzcGFjZSwgZmVhdHVyZXMpOwotICAgICAgICBPYmplY3QgcHJveHlDbGFzcyA9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoY2xhc3NMb2FkZXIsIGludGVyZmFjZXMsIHByb3h5SGFuZGxlcik7Ci0gICAgICAgIHJldHVybiBzZWkuY2FzdChwcm94eUNsYXNzKTsgICAgICAgIAotICAgIH0KLQotICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gSW1wbCBtZXRob2RzCi0gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8vVE9ETzogTmVlZCB0byBtYWtlIHRoZSBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGNvbmZpZ3VyYWJsZQotICAgIHByaXZhdGUgRXhlY3V0b3IgZ2V0RGVmYXVsdEV4ZWN1dG9yKCkgewotICAgIAlFeGVjdXRvckZhY3RvcnkgZXhlY3V0b3JGYWN0b3J5ID0gKEV4ZWN1dG9yRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoCi0gICAgCQkJRXhlY3V0b3JGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dG9yRmFjdG9yeS5nZXRFeGVjdXRvckluc3RhbmNlKEV4ZWN1dG9yRmFjdG9yeS5DTElFTlRfRVhFQ1VUT1IpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlUW5hbWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNlcnZpY2VRbmFtZS50b1N0cmluZygpLnRyaW0oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRXU0RMTG9jYXRpb24oKSB7Ci0gICAgICAgIFVSTCB3c2RsTG9jYXRpb24gPSBnZXRXU0RMRG9jdW1lbnRMb2NhdGlvbigpOwotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uICE9IG51bGwgJiYgISIiLmVxdWFscyh3c2RsTG9jYXRpb24udG9TdHJpbmcoKS50cmltKCkpOwotICAgIH0KLQotICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG1ldGhvZCBhbmQgcHV0IHRoZSBXU0RMV3JhcHBlciBtZXRob2RzIG9uIHRoZSBTZXJ2aWNlRGVzY3JpcHRvciBkaXJlY3RseQotICAgIHByaXZhdGUgV1NETFdyYXBwZXIgZ2V0V1NETFdyYXBwZXIoKSB7Ci0gICAgICAgIHZlcmlmeVNlcnZpY2VEZXNjcmlwdGlvbkFjdGl2ZSgpOwotICAgICAgICByZXR1cm4gKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKXNlcnZpY2VEZXNjcmlwdGlvbikuZ2V0V1NETFdyYXBwZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aWNlRGVmaW5lZChRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICByZXR1cm4gZ2V0V1NETFdyYXBwZXIoKS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKSAhPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGlzcGF0Y2hUeXBlKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHJldHVybiBjbGF6eiAhPSBudWxsICYmIChjbGF6eiA9PSBTdHJpbmcuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBTb3VyY2UuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBEYXRhU291cmNlLmNsYXNzIHx8Ci0gICAgICAgICAgICAgICAgY2xhenogPT0gU09BUE1lc3NhZ2UuY2xhc3MgfHwKLSAgICAgICAgICAgICAgICBjbGF6eiA9PSBPTUVsZW1lbnQuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGlzcGF0Y2hUeXBlV2l0aE1vZGUoQ2xhc3MgY2xhenosIE1vZGUgbW9kZSkgewotCi0gICAgCWlmIChjbGF6eiAhPSBudWxsICYmICEoY2xhenogPT0gU09BUE1lc3NhZ2UuY2xhc3MgJiYgbW9kZS5lcXVhbHMoU2VydmljZS5Nb2RlLlBBWUxPQUQpKSkgewotICAgIAkJCXJldHVybiB0cnVlOwotICAgIAl9IGVsc2UgewotICAgIAkJcmV0dXJuIGZhbHNlOwotICAgIAl9Ci0gIAotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3MgY2xzKSB7Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgbWV0aG9kIG11c3QgcmVtYWluIHByaXZhdGUgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotICAgIAotICAgIC8qKiBAcmV0dXJuIENsYXNzTG9hZGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcml2YXRlIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJvdGVjdGVkIGJlY2F1c2UgaXQgdXNlcyBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gbG9hZENsYXNzZXMoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFN0cmluZ1tdIGNsYXNzTmFtZXMpCi0gICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzW2NsYXNzTmFtZXMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjbGFzc2VzW2ldID0gZm9yTmFtZShjbGFzc05hbWVzW2ldLCB0cnVlLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzZXM7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBST1BSSUVUQVJZIE1FVEhPRCBUTyBSRUxFQVNFIFJFU09VQ0VTLiAgVVNFIE9GIFRISVMgTUVUSE9EIElTIE5PVCBKQVgtV1MgQ09NUExJQU5UIAotICAgICAqIEFORCBJUyBOT04tUE9SVEFCTEUhICAKLSAgICAgKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IGNsaWVudCBjb2RlIHRvIHRyeSB0byByZWxlYXNlCi0gICAgICogcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZSBpbnN0YW5jZSBwYXJhbWV0ZXIuICBUaGVzZSByZXNvdXJjZXMgaW5jbHVkZQotICAgICAqIHRoZSBKQVgtV1MgbWV0YWRhdGEgb2JqZWN0cyAoZS5nLiBTZXJ2aWNlRGVzY3JpcHRpb24sIEVuZHBvaW50RGVzY3JpcHRpb24pIGFuZCB0aGUKLSAgICAgKiBhc3NvY2lhdGVkIEF4aXMyIG9iamVjdHMgKGUuZy4gQXhpc1NlcnZpY2UgYW5kIHJlYWx0ZWQgb2JqZWN0cykuICBOb3RlIHRoYXQgdGhlc2UgCi0gICAgICogcmVzb3VyY2VzIGNhbiBiZSBzaGFyZWQgYWNyb3NzIG11bHRpcGxlIHNlcnZpY2UgZGVsZWdhdGVzLCBhbmQgc28gdGhleSB3aWxsIG5vdCBhY3R1YWxseSAKLSAgICAgKiBiZSByZWxlYXNlZCB1bnRpbCB0aGUgbGFzdCBzZXJ2aWNlIGRlbGVnYXRlIHVzaW5nIHRoZW0gaXMgY2xvc2VkLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBtZXRob2Qgc2luY2UgdGhlIHNlcnZpY2UgZGVsZWdhdGUgZmluYWxpemVyCi0gICAgICogd2lsbCBhbHNvIHJlbGVhc2UgdGhlIHJlc291cmNlcyBhcyBhcHByb3ByaWF0ZS4gIEhvd2V2ZXIsIGZpbmFsaXplcnMgYXJlIG5vdCBuZWNlc3NhcmlseSBydW4KLSAgICAgKiBpbiBhIHRpbWVseSBmYXNoaW9uIGFuZCB0aGUgdGltaW5nIHZhcmllcyBhY3Jvc3MgSlZNcy4gIFRvIHByZWRpY3RpYmx5IHJlbGVhc2UgcmVzb3VyY2VzCi0gICAgICogdG8gcHJldmVudCBsYXJnZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZC9vciBPdXRPZk1lbW9yeSBlcnJvcnMsIHRoaXMgcHJvcHJpZXRhcnkgcmVsZWFzZSAKLSAgICAgKiBtZXRob2QgY2FuIGJlIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmljZSBJbnN0YW5jZSBvZiB0aGUgU2VydmljZSBmb3Igd2hpY2ggcmVzb3VyY2VzIG1heSBiZSByZWxlYXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZVNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIFNlcnZpY2VEZWxlZ2F0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZXJ2aWNlIHRvIGJlIGNsb3NlZAotICAgICAgICAvLyBUaGlzIGlzIHRoZSBiYWNrIHdheSBhcm91bmQgc2luY2UgdGhlcmUgaXMgbm8gY2xvc2Ugb24gdGhlIFNlcnZpY2UKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IGdldFNlcnZpY2VEZWxlZ2F0ZUZvclNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZVJlc291cmNlcygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBTZXJ2aWNlRGVsZWdhdGUgZ2V0U2VydmljZURlbGVnYXRlRm9yU2VydmljZShTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgLy8gTmVlZCB0byBnZXQgdG8gdGhlIHByaXZhdGUgU2VydmljZS5fZGVsZWdhdGUKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpZWxkIHNlcnZpY2VEZWxnYXRlRmllbGQgPSBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKVswXTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGVsZ2F0ZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU2VydmljZURlbGVnYXRlID0gKFNlcnZpY2VEZWxlZ2F0ZSkgc2VydmljZURlbGdhdGVGaWVsZC5nZXQoc2VydmljZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF5IGJlIGEgZ2VuZXJhdGVkIHNlcnZpY2Ugc3ViY2xhc3MsIHNvIGdldCB0aGUgZGVsZWdhdGUgZnJvbSB0aGUgc3VwZXJjbGFzcwotICAgICAgICAgICAgICAgIEZpZWxkIHNlcnZpY2VEZWxlZ2F0ZUZpZWxkID0gc2VydmljZS5nZXRDbGFzcygpLmdldFN1cGVyY2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkcygpWzBdOwotICAgICAgICAgICAgICAgIHNlcnZpY2VEZWxlZ2F0ZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU2VydmljZURlbGVnYXRlID0gKFNlcnZpY2VEZWxlZ2F0ZSkgc2VydmljZURlbGVnYXRlRmllbGQuZ2V0KHNlcnZpY2UpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBdHRlbXB0IHRvIGdldCBzZXJ2aWNlIGRlbGVnYXRlIGZvciBzZXJ2aWNlIGNhdWdodCBleGNlcHRpb24uIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdCB0byBnZXQgc2VydmljZSBkZWxlZ2F0ZSBmb3Igc2VydmljZSBjYXVnaHQgZXhjZXB0aW9uLiIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuU2VydmljZURlbGVnYXRlOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBwcm9wcmlldGFyeSBzdGF0aWMgcmVsZWFzZSBtZXRob2QgKHdoaWNoIGNhbiBiZSBjYWxsZWQgdmlhIAotICAgICAqIGNsaWVudCBjb2RlKSwgb3IgaXQgY2FuIGJlIGNhbGxlZCBieSB0aGUgZmluYWxpemVyLiAgVGhpcyBtZXRob2QgdHJpZXMgdG8gcmVsZWFzZSByZXNvdXJjZXMgCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2aWNlRGVsZWdhdGUuICBOb3RlIHRoYXQgc2luY2Ugb3RoZXIgU2VydmljZURlbGVnYXRlcyBjYW4gc2hhcmUgdGhlc2UgCi0gICAgICogcmVzb3VyY2VzIChlLmcuIFNlcnZpY2VEZXNjcmlwdGlvbiwgRW5kcG9pbnREZXNjcmlwdGlvbiwgQXhpc1NlcnZpY2UpLCB0aGUgcmVzb3VyY2VzIG1heSAKLSAgICAgKiBub3QgYmUgcmVsZWFzZWVkIHVudGlsIHRoZSBsYXN0IFNlcnZpY2VEZWxlZ2F0ZSB1c2luZyB0aGVtIGlzc3VlcyBhIGNsb3NlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlU2VydmljZVJlc291cmNlcygpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZVJlc291Y2VzIGVudHJ5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyBjYW4gYmUgY2FsbGVkIGluZGlyZWN0bHkgYnkgY2xpZW50IGNvZGUgb3IgYnkgdGhlIGZpbmFsaXplci4gIElmIGl0IGhhc24ndCBiZWVuCi0gICAgICAgIC8vIGNhbGxlZCB5ZXQsIGhhdmUgdGhlIGVuZHBvaW50RGVzY3JpcHRpb25zIHJlbGVhc2UgcmVzb3VyY2VzLgotICAgICAgICBpZiAoc2VydmljZURlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbi5yZWxlYXNlUmVzb3VyY2VzKHRoaXMpOwotICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGFuIGFzc29jaWF0ZWQgc2VydmljZURlc2NyaXB0aW9uIGZvciB0aGlzIGRlbGVnYXRlLiAgSWYgbm90LCBhCi0gICAgICogd2ViU2VydmljZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gIEEgc2VydmljZURlbGVnYXRlIG1heSBoYXZlIGEgbnVsbCBzZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgKiBpZiB0aGUgY2xpZW50IGNvZGUgaXNzdWVzIHRoZSBwcm9wcmlldGFyeSBtZXRob2QgY2FsbCByZWxlYWxzZVNlcnZpY2VSZXNvdXJjZXMuIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlTZXJ2aWNlRGVzY3JpcHRpb25BY3RpdmUoKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgTkxTJ2QKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIFNlcnZpY2UgYWZ0ZXIgaXQgd2FzIHJlbGVhc2VkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlbGVhc2VTZXJ2aWNlUmVzb3VyY2VzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZWxnYXRlIEZpbmFsaXplciBjYXVnaHQgZXhjZXB0aW9uIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvQmFzZUhhbmRsZXJSZXNvbHZlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvQmFzZUhhbmRsZXJSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQyNmQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0Jhc2VIYW5kbGVyUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuRGVzY3JpcHRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7DQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHN1YmNsYXNzZWQgdG8gcHJvZHVjZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBIYW5kbGVyUmVzb2x2ZXJ9DQotICoNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUhhbmRsZXJSZXNvbHZlciBpbXBsZW1lbnRzIEhhbmRsZXJSZXNvbHZlciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlSGFuZGxlclJlc29sdmVyLmNsYXNzKTsNCi0NCi0gICAgLy8gVE9ETyBzaG91bGQgcHJvYmFibHkgdXNlIGNvbnN0YW50cyBkZWZpbmVkIGVsc2V3aGVyZQ0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvdG9jb2xCaW5kaW5nc01hcCA9DQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oNSk7DQotDQotICAgIHByb3RlY3RlZCBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZTsNCi0gICAgDQotICAgIHByb3RlY3RlZCBCYXNlSGFuZGxlclJlc29sdmVyKCkgew0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgQmFzZUhhbmRsZXJSZXNvbHZlcihTdHJpbmcgZmlsZSkgew0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPQ0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMub3BlbkhhbmRsZXJDb25maWdTdHJlYW0oZmlsZSwgY2xhc3NOYW1lLCBjbGFzc0xvYWRlcik7DQotICAgICAgICANCi0gICAgICAgIGlmKGlzID09IG51bGwpIHsNCi0gICAgICAgICAgICBsb2cud2FybigiVW5hYmxlIHRvIGxvYWQgaGFuZGxlcnMgZnJvbSBmaWxlOiAiICsgZmlsZSk7ICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaGFuZGxlckNoYWluc1R5cGUgPSBEZXNjcmlwdGlvblV0aWxzLmxvYWRIYW5kbGVyQ2hhaW5zKGlzLCBjbGFzc0xvYWRlcik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjaGFpblJlc29sdmVzVG9Qb3J0KEhhbmRsZXJDaGFpblR5cGUgaGN0LCBQb3J0SW5mbyBwb3J0aW5mbykgew0KLSAgICAgICAgDQotICAgICAgICBMaXN0PFN0cmluZz4gcHJvdG9jb2xCaW5kaW5ncyA9IGhjdC5nZXRQcm90b2NvbEJpbmRpbmdzKCk7DQotICAgICAgICBpZiAocHJvdG9jb2xCaW5kaW5ncyAhPSBudWxsKSB7DQotICAgICAgICAgICAgYm9vbGVhbiBtYXRjaCA9IHRydWU7DQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ID0gcHJvdG9jb2xCaW5kaW5ncy5pdGVyYXRvcigpIDsgaXQuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgICAgICBtYXRjaCA9IGZhbHNlOyAgLy8gZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcHJvdG9jb2wgYmluZGluZ3MgdW50aWwgd2UgZmluZCBhIG1hdGNoDQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbEJpbmRpbmcgPSBpdC5uZXh0KCk7DQotICAgICAgICAgICAgICAgIHByb3RvY29sQmluZGluZyA9IHByb3RvY29sQmluZGluZy5zdGFydHNXaXRoKCIjIyIpID8gcHJvdG9jb2xCaW5kaW5nc01hcC5nZXQocHJvdG9jb2xCaW5kaW5nKSA6IHByb3RvY29sQmluZGluZzsNCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHByb3RvY29sQmluZGluZ3NNYXAgcmV0dXJucyBudWxsLCBpdCB3b3VsZCBtZWFuIHNvbWVvbmUgaGFzIHNvbWUgbm9uc2Vuc2UgIyNiaW5kaW5nDQotICAgICAgICAgICAgICAgIGlmICgocHJvdG9jb2xCaW5kaW5nICE9IG51bGwpICYmIChwcm90b2NvbEJpbmRpbmcuZXF1YWxzKHBvcnRpbmZvLmdldEJpbmRpbmdJRCgpKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChtYXRjaCA9PSBmYWxzZSkgew0KLSAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBjaGVja2VkIGFsbCB0aGUgcHJvdG9jb2xCaW5kaW5ncywgYnV0IGRpZG4ndCBmaW5kIGEgbWF0Y2gsIG5vIG5lZWQgdG8gY29udGludWUNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qDQotICAgICAgICAgKiBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGdldCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIG91dCBvZiB0aGUgcG9ydC1uYW1lLXBhdHRlcm4gYW5kIHNlcnZpY2UtbmFtZS1wYXR0ZXJuDQotICAgICAgICAgKi8NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKCFkb2VzUGF0dGVybk1hdGNoKHBvcnRpbmZvLmdldFBvcnROYW1lKCksIGhjdC5nZXRQb3J0TmFtZVBhdHRlcm4oKSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gd2UndmUgY2hlY2tlZCB0aGUgcG9ydC1uYW1lLXBhdHRlcm4sIGFuZCBkaWRuJ3QgZmluZCBhIG1hdGNoLCBubyBuZWVkIHRvIGNvbnRpbnVlDQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKCFkb2VzUGF0dGVybk1hdGNoKHBvcnRpbmZvLmdldFNlcnZpY2VOYW1lKCksIGhjdC5nZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gd2UndmUgY2hlY2tlZCB0aGUgc2VydmljZS1uYW1lLXBhdHRlcm4sIGFuZCBkaWRuJ3QgZmluZCBhIG1hdGNoLCBubyBuZWVkIHRvIGNvbnRpbnVlDQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhenopIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgcmV0dXJuIGZvck5hbWUoY2xhenosIHRydWUsIGdldENvbnRleHRDbGFzc0xvYWRlcigpKTsNCi0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9lc1BhdHRlcm5NYXRjaChRTmFtZSBwb3J0SW5mb1FOYW1lLCBRTmFtZSBwYXR0ZXJuKSB7DQotICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKQ0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgdmFsaWRhdGVQYXR0ZXJuKHBhdHRlcm4pOw0KLSAgICAgICAgLy8gYnVpbGQgdXAgdGhlIHN0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZGVmaW5lZCBhdCBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkDQotICAgICAgICAvLyB1c2UgdGhlIHByZWZpeCwgbm90IHRoZSBsaXRlcmFsIG5hbWVzcGFjZQ0KLSAgICAgICAgU3RyaW5nIHBvcnRJbmZvUHJlZml4ID0gcG9ydEluZm9RTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsgLy9QcmVmaXgoKTsNCi0gICAgICAgIFN0cmluZyBwb3J0SW5mb0xvY2FsUGFydCA9IHBvcnRJbmZvUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICBTdHJpbmcgcG9ydEluZm9TdHJpbmcgPSAoKHBvcnRJbmZvUHJlZml4ID09IG51bGwpIHx8IChwb3J0SW5mb1ByZWZpeC5lcXVhbHMoIiIpKSkgPyAiIiA6IHBvcnRJbmZvUHJlZml4ICsgIjoiOw0KLSAgICAgICAgcG9ydEluZm9TdHJpbmcgKz0gcG9ydEluZm9Mb2NhbFBhcnQ7DQotICAgICAgICANCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuU3RyaW5nUHJlZml4ID0gcGF0dGVybi5nZXROYW1lc3BhY2VVUkkoKTsgLy9QcmVmaXgoKTsNCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuSW5mb0xvY2FsUGFydCA9IHBhdHRlcm4uZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICBTdHJpbmcgcGF0dGVyblN0cmluZyA9ICgocGF0dGVyblN0cmluZ1ByZWZpeCA9PSBudWxsKSB8fCAocGF0dGVyblN0cmluZ1ByZWZpeC5lcXVhbHMoIiIpKSkgPyAiIiA6IHBhdHRlcm5TdHJpbmdQcmVmaXggKyAiOiI7DQotICAgICAgICBwYXR0ZXJuU3RyaW5nICs9IHBhdHRlcm5JbmZvTG9jYWxQYXJ0Ow0KLSAgICAgICAgDQotICAgICAgICAvLyBub3cgbWF0Y2ggdGhlIHBvcnRJbmZvUU5hbWUgdG8gdGhlIHVzZXIgcGF0dGVybg0KLSAgICAgICAgLy8gQnV0IGZpcnN0LCBjb252ZXJ0IHRoZSB1c2VyIHBhdHRlcm4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uICBSZW1lbWJlciwgdGhlIG9ubHkgbm9uLVFOYW1lIGNoYXJhY3RlciBhbGxvd2VkIGlzICIqIiwgd2hpY2gNCi0gICAgICAgIC8vIGlzIGEgd2lsZGNhcmQsIHdpdGggb2J2aW91cyByZXN0cmljdGlvbnMgb24gd2hhdCBjaGFyYWN0ZXJzIGNhbiBtYXRjaCAoZm9yIGV4YW1wbGUsIGEgLmphdmEgZmlsZW5hbWUgY2Fubm90IGNvbnRhaW4gcGVyZW50aGVzZXMpLg0KLSAgICAgICAgLy8gV2UnbGwganVzdCB1c2UgcGFydCBvZiB0aGUgYWJvdmUgcmVnIGV4IHRvIGZvcm0gdGhlIGFwcHJvcHJpYXRlIHJlc3RyaWN0aW9ucyBvbiB0aGUgdXNlci1zcGVjaWZpZWQgIioiIGNoYXJhY3RlcjoNCi0gICAgICAgIFBhdHRlcm4gdXNlcnAgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVyblN0cmluZy5yZXBsYWNlKCIqIiwgIihcXHd8XFwufC18XykqIikpOw0KLSAgICAgICAgTWF0Y2hlciB1c2VybSA9IHVzZXJwLm1hdGNoZXIocG9ydEluZm9TdHJpbmcpOw0KLSAgICAgICAgYm9vbGVhbiBtYXRjaCA9IHVzZXJtLm1hdGNoZXMoKTsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGlmICghbWF0Y2gpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXR0ZXJuIG1hdGNoIGZhaWxlZDogXCIiICsgcG9ydEluZm9TdHJpbmcgKyAiXCIgZG9lcyBub3QgbWF0Y2ggXCIiICsgcGF0dGVyblN0cmluZyArICJcIiIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGF0dGVybiBtYXRjaCBzdWNjZWVkZWQ6IFwiIiArIHBvcnRJbmZvU3RyaW5nICsgIlwiIG1hdGNoZXMgXCIiICsgcGF0dGVyblN0cmluZyArICJcIiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtYXRjaDsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVBhdHRlcm4oUU5hbWUgcGF0dGVybikgew0KLSAgICAgICAgU3RyaW5nIHBhdHRlcm5TdHJpbmdQcmVmaXggPSBwYXR0ZXJuLmdldFByZWZpeCgpOw0KLSAgICAgICAgU3RyaW5nIHBhdHRlcm5JbmZvTG9jYWxQYXJ0ID0gcGF0dGVybi5nZXRMb2NhbFBhcnQoKTsNCi0gICAgICAgIFN0cmluZyBwYXR0ZXJuU3RyaW5nID0gKChwYXR0ZXJuU3RyaW5nUHJlZml4ID09IG51bGwpIHx8IChwYXR0ZXJuU3RyaW5nUHJlZml4LmVxdWFscygiIikpKSA/ICIiIDogcGF0dGVyblN0cmluZ1ByZWZpeCArICI6IjsNCi0gICAgICAgIHBhdHRlcm5TdHJpbmcgKz0gcGF0dGVybkluZm9Mb2NhbFBhcnQ7DQotDQotICAgICAgICAvKg0KLSAgICAgICAgICogQmVsb3cgcGF0dGVybiBpcyBwb3J0ZWQgZnJvbTogIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QNCi0gICAgICAgICAqIFNjaGVtYSByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBkZWZpbmVkIGRpZmZlcmVudGx5IGZyb20gSmF2YSByZWd1bGFyIGV4cHJlc3Npb25zIHdoaWNoIGFyZSBkaWZmZXJlbnQgZnJvbSBQZXJsIHJlZ3VsYXINCi0gICAgICAgICAqIGV4cHJlc3Npb25zLiAgSSd2ZSBjb252ZXJ0ZWQgdGhlIHBhdHRlcm4gZGVmaW5lZCBpbiB0aGUgYWJvdmUgbGlua2VkIHNjaGVtYSB0byBpdHMgSmF2YSBlcXVpdmFsZW50LCBhcyBiZXN0IGFzIEkgY2FuLg0KLSAgICAgICAgICogDQotICAgICAgICAgKiBTY2hlbWEgcmVnIGV4OiAgIlwqfChbXGktWzpdXVtcYy1bOl1dKjopP1tcaS1bOl1dW1xjLVs6XV0qXCo/Ig0KLSAgICAgICAgICogSmF2YSByZWcgZXg6ICAiXFwqfCgoXFx3fF8pKFxcd3xcXC58LXxfKSo6KT8oXFx3fF8pKFxcd3xcXC58LXxfKSpcXCo/Ig0KLSAgICAgICAgICovDQotDQotICAgICAgICAvLyBmaXJzdCwgY29uZmlybSB0aGUgZGVmaW5lZCBwYXR0ZXJuIGlzIGxlZ2FsDQotICAgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIlxcKnwoKFxcd3xfKShcXHd8XFwufC18XykqOik/KFxcd3xfKShcXHd8XFwufC18XykqXFwqPyIpOw0KLSAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKHBhdHRlcm5TdHJpbmcpOw0KLSAgICAgICAgaWYgKCFtLm1hdGNoZXMoKSkgew0KLSAgICAgICAgICAgIC8vIHBhdHRlcm4gZGVmaW5lZCBieSB1c2VyIGluIGhhbmRsZXIgY2hhaW4geG1sIGZpbGUgaXMgaWxsZWdhbCAtLSByZXBvcnQgaXQgYnV0IGNvbnRpbnVlDQotICAgICAgICAgICAgbG9nLndhcm4oIlBhdHRlcm4gZGVmaW5lZCBieSB1c2VyIGlzIGlsbGVnYWw6ICBcIiIgKyBwYXR0ZXJuU3RyaW5nICsgIlwiIGRvZXMgbm90IG1hdGNoIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBzY2hlbWEgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZC4gIFBhdHRlcm4gbWF0Y2hpbmcgc2hvdWxkIG5vdyBiZSBjb25zaWRlcmVkIFwiYmVzdC1lZmZvcnQuXCIiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lDQotICAgICAqDQotICAgICAqIEByZXR1cm4gQ2xhc3MNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBOT1RFOiBUaGlzIG1ldGhvZCBtdXN0IHJlbWFpbiBwcm90ZWN0ZWQgYmVjYXVzZSBpdCB1c2VzIEFjY2Vzc0NvbnRyb2xsZXINCi0gICAgICAgIENsYXNzIGNsID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJIYW5kbGVyUmVzb2x2ZXJJbXBsIGF0dGVtcHRpbmcgdG8gbG9hZCBDbGFzczogIitjbGFzc05hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc0xvYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB0aGUgZXhjZXB0aW9uIGJlIHN3YWxsb3dlZCA/DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkhhbmRsZXJSZXNvbHZlckltcGwgY2Fubm90IGxvYWQgdGhlIGZvbGxvd2luZyBjbGFzcyBUaHJvd2FibGUgRXhjZXB0aW9uIE9jY3VyZWQ6ICIgKyBjbGFzc05hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oIkhhbmRsZXJSZXNvbHZlckltcGwgY2Fubm90IGxvYWQgdGhlIGZvbGxvd2luZyBjbGFzcyBUaHJvd2FibGUgRXhjZXB0aW9uIE9jY3VyZWQ6IiArIGNsYXNzTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgKTsNCi0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY2w7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqIEByZXR1cm4gQ2xhc3NMb2FkZXIgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgew0KLSAgICAgICAgLy8gTk9URTogVGhpcyBtZXRob2QgbXVzdCByZW1haW4gcHJpdmF0ZSBiZWNhdXNlIGl0IHVzZXMgQWNjZXNzQ29udHJvbGxlcg0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgKTsNCi0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gY2w7DQotICAgIH0NCi0gICAgDQotICAgIHN0YXRpYyB7DQotICAgICAgICBwcm90b2NvbEJpbmRpbmdzTWFwLnB1dCgiIyNTT0FQMTFfSFRUUCIsICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiKTsNCi0gICAgICAgIHByb3RvY29sQmluZGluZ3NNYXAucHV0KCIjI1NPQVAxMV9IVFRQX01UT00iLCAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cD9tdG9tPXRydWUiKTsNCi0gICAgICAgIHByb3RvY29sQmluZGluZ3NNYXAucHV0KCIjI1NPQVAxMl9IVFRQIiwgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iKTsNCi0gICAgICAgIHByb3RvY29sQmluZGluZ3NNYXAucHV0KCIjI1NPQVAxMl9IVFRQX01UT00iLCAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8/bXRvbT10cnVlIik7DQotICAgICAgICBwcm90b2NvbEJpbmRpbmdzTWFwLnB1dCgiIyNYTUxfSFRUUCIsICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2h0dHAiKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjgyZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvSGFuZGxlclJlc29sdmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkxpZmVjeWNsZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXJSZXNvbHZlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBIYW5kbGVyUmVzb2x2ZXJ9IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhIEpBWC1XUyBjbGllbnQNCi0gKiB0byBzZXQgdGhlIGhhbmRsZXIgbGlzdC4NCi0gKg0KLSAqIEBzZWUgamF2YXgueG1sLndzLlNlcnZpY2Ujc2V0SGFuZGxlclJlc29sdmVyKEhhbmRsZXJSZXNvbHZlcikNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclJlc29sdmVySW1wbCBleHRlbmRzIEJhc2VIYW5kbGVyUmVzb2x2ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSGFuZGxlclJlc29sdmVySW1wbC5jbGFzcyk7DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZpbGVQYXRoIHRoZSBwYXRoIHRvIHRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBVUkkgZm9ybWF0DQotICAgICAqLw0KLSAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVySW1wbChTdHJpbmcgZmlsZVBhdGgpIHsNCi0gICAgICAgIHN1cGVyKGZpbGVQYXRoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZmlsZVVSSSB0aGUgPGNvZGU+VVJJPC9jb2RlPiBvZiB0aGUgaGFuZGxlciBjb25maWd1cmF0aW9uIGZpbGUNCi0gICAgICovDQotICAgIHB1YmxpYyBIYW5kbGVyUmVzb2x2ZXJJbXBsKFVSSSBmaWxlVVJJKSB7DQotICAgICAgICB0aGlzKGZpbGVVUkkudG9TdHJpbmcoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGZpbGUgdGhlIGhhbmRsZXIgY29uZmlndXJhdGlvbiBmaWxlDQotICAgICAqLw0KLSAgICBwdWJsaWMgSGFuZGxlclJlc29sdmVySW1wbChGaWxlIGZpbGUpIHsNCi0gICAgICAgIHRoaXMoZmlsZS50b1VSSSgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXIjZ2V0SGFuZGxlckNoYWluKGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIExpc3Q8SGFuZGxlcj4gZ2V0SGFuZGxlckNoYWluKFBvcnRJbmZvIHBvcnRpbmZvKSB7DQotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KCk7DQotICAgICAgICBJdGVyYXRvciBpdCA9IGhhbmRsZXJDaGFpbnNUeXBlID09IG51bGwgPyBudWxsIDogaGFuZGxlckNoYWluc1R5cGUuZ2V0SGFuZGxlckNoYWluKCkuaXRlcmF0b3IoKTsNCi0NCi0gICAgICAgIHdoaWxlICgoaXQgIT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsNCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5UeXBlIGhhbmRsZXJDaGFpblR5cGUgPSAoKEhhbmRsZXJDaGFpblR5cGUpaXQubmV4dCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBpZiAhbWF0Y2gsIGNvbnRpbnVlICh0byBuZXh0IGNoYWluKQ0KLSAgICAgICAgICAgIGlmICghKGNoYWluUmVzb2x2ZXNUb1BvcnQoaGFuZGxlckNoYWluVHlwZSwgcG9ydGluZm8pKSkNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyVHlwZT4gaGFuZGxlclR5cGVMaXN0ID0gaGFuZGxlckNoYWluVHlwZS5nZXRIYW5kbGVyKCk7DQotICAgICAgICAgICAgSXRlcmF0b3IgaHQgPSBoYW5kbGVyVHlwZUxpc3QuaXRlcmF0b3IoKTsNCi0gICAgICAgICAgICB3aGlsZSAoaHQuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICBIYW5kbGVyVHlwZSBoYW5kbGVyVHlwZSA9IChIYW5kbGVyVHlwZSlodC5uZXh0KCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIG11c3QgZG8gYmV0dGVyIGpvYiBjb21wYXJpbmcgdGhlIGhhbmRsZXJUeXBlIHdpdGggdGhlIFBvcnRJbmZvIHBhcmFtDQotICAgICAgICAgICAgICAgIC8vIHRvIHNlZSBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBoYW5kbGVyIGlzIGludGVuZGVkIGZvciB0aGlzIHNlcnZpY2UuDQotDQotICAgICAgICAgICAgICAgIC8vIFRPRE8gcmV2aWV3OiBuZWVkIHRvIGNoZWNrIGZvciBudWxsIGdldEhhbmRsZXJDbGFzcygpIHJldHVybj8NCi0gICAgICAgICAgICAgICAgLy8gb3Igd2lsbCBzY2hlbWEgbm90IGFsbG93IGl0Pw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydEhhbmRsZXIgPSBoYW5kbGVyVHlwZS5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vICBpbnN0YW50aWF0ZSBwb3J0SGFuZGxlciBjbGFzcyANCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBjcmVhdGVIYW5kbGVySW5zdGFuY2UobG9hZENsYXNzKHBvcnRIYW5kbGVyKSk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UganVzdCBpZ25vcmUgdGhpcyBwcm9ibGVtPw0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3VjY2Vzc2Z1bGx5IGluc3RhbnRpYXRlZCB0aGUgY2xhc3M6ICIgKyBoYW5kbGVyLmdldENsYXNzKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAvLyA5LjIuMS4yIHNvcnQgdGhlbSBieSBMb2dpY2FsLCB0aGVuIFNPQVANCi0gICAgICAgICAgICAgICAgaWYgKExvZ2ljYWxIYW5kbGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkNCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZCgoTG9naWNhbEhhbmRsZXIpIGhhbmRsZXIpOw0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChTT0FQSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGhhbmRsZXIuZ2V0Q2xhc3MoKSkpDQotICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZW9mIFByb3RvY29sSGFuZGxlcg0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKChTT0FQSGFuZGxlcikgaGFuZGxlcik7DQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKEhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShoYW5kbGVyLmdldENsYXNzKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5FcnIxIiwgaGFuZGxlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiaGFuZGxlckNoYWluRXJyMiIsIGhhbmRsZXINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBoYW5kbGVyczsNCi0gICAgfQ0KLSAgICANCi0gICAgLy9DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGhhbmRsZXIgY2xhc3MgYW5kIHBlcmZvcm0gYXBwcm9wcmlhdGUgbGlmZWN5Y2xlIGFjdGl2aXRpZXMNCi0gICAgLy90byBpdC4NCi0gICAgcHJpdmF0ZSBIYW5kbGVyIGNyZWF0ZUhhbmRsZXJJbnN0YW5jZShDbGFzcyBoYW5kbGVyQ2xhc3MpIHRocm93cyBMaWZlY3ljbGVFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGhhbmRsZXJDbGFzcyA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS4NCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZUhhbmRsZXJJbnN0YW5jZUVyciIpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy9SZXNvdXJjZSBpbmplY3Rpb24gbm90IHN1cHBvcnRlZC4NCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG51bGw7DQotICAgICAgICANCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgb2JqZWN0ID0gaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsNCi0gICAgICAgIH0NCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAvL0ludm9rZSBQb3N0Q29uc3RydWN0DQotICAgICAgICBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcihvYmplY3QpOw0KLSAgICAgICAgbWFuYWdlci5pbnZva2VQb3N0Q29uc3RydWN0KCk7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiAoSGFuZGxlcikgb2JqZWN0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0xpZmVjeWNsZU1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0xpZmVjeWNsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExMjM3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9MaWZlY3ljbGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlLkJhc2VMaWZlY3ljbGVNYW5hZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBMaWZlY3ljbGVNYW5hZ2VyIGV4dGVuZHMgQmFzZUxpZmVjeWNsZU1hbmFnZXIgew0KLQ0KLSAgICBwdWJsaWMgTGlmZWN5Y2xlTWFuYWdlcihPYmplY3QgaW5zdGFuY2UpIHsNCi0gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgTWV0aG9kIGdldFBvc3RDb25zdHJ1Y3RNZXRob2QoKSB7DQotICAgICAgICBpZiAoaW5zdGFuY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIExpc3Q8TWV0aG9kPiBtZXRob2RzID0gZ2V0TWV0aG9kcyhpbnN0YW5jZS5nZXRDbGFzcygpKTsNCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7DQotICAgICAgICAgICAgICAgIGlmIChnZXRBbm5vdGF0aW9uKG1ldGhvZCxQb3N0Q29uc3RydWN0LmNsYXNzKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBnZXRQcmVEZXN0cm95TWV0aG9kKCkgew0KLSAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsNCi0gICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IGdldE1ldGhvZHMoaW5zdGFuY2UuZ2V0Q2xhc3MoKSk7DQotICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgew0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0QW5ub3RhdGlvbihtZXRob2QsUHJlRGVzdHJveS5jbGFzcykgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIGFsbCBvZiB0aGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFuZCB0aGUgc3VwZXIgY2xhc3Nlcw0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzDQotICAgICAqIEByZXR1cm4NCi0gICAgICovDQotICAgIHByaXZhdGUgTGlzdDxNZXRob2Q+IGdldE1ldGhvZHMoZmluYWwgQ2xhc3MgYmVhbkNsYXNzKSB7DQotICAgICAgICAvLyBUaGlzIGNsYXNzIG11c3QgcmVtYWluIHByaXZhdGUgZHVlIHRvIEphdmEgMiBTZWN1cml0eSBjb25jZXJucw0KLSAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHM7DQotICAgICAgICBtZXRob2RzID0gKExpc3Q8TWV0aG9kPilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IGJlYW5DbGFzczsNCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2xzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kQXJyYXkgPSBjbHMuZ2V0RGVjbGFyZWRNZXRob2RzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZEFycmF5KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2QpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscyA9IGNscy5nZXRTdXBlcmNsYXNzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RzOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICApOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1ldGhvZHM7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uDQotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIA0KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBDbGFzcyBvZiByZXF1cmVzdGVkIEFubm90YXRpb24NCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihmaW5hbCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIGZpbmFsIENsYXNzIGFubm90YXRpb24pIHsNCi0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7DQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEFubm90YXRpb24oYW5ub3RhdGlvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL21pZ3JhdG9yL0FwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvbWlncmF0b3IvQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkYTJkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvbWlncmF0b3IvQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkubWlncmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBDb250ZXh0UHJvcGVydHlNaWdyYXRvciBpcyBhIHV0aWxpdHkgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSBhbnkKLSAqIHRyYW5zZm9ybWF0aW9uIG9yIG1pZ3JhdGlvbiB0aGF0IG5lZWRzIHRvIGhhcHBlbiBiZXR3ZWVuIHRoZSBpbnRlcm5hbCBKQVgtV1MgTWVzc2FnZUNvbnRleHQgZm9yIGEKLSAqIHJlcXVlc3Qgb3IgYSByZXNwb25zZSBhbmQgdGhlIGFzc29jaWF0ZWQgY29udGV4dCBmb3IgdGhlIGNsaWVudCBvciB0aGUgc2VydmVyLgotICogPHAvPgotICogY2xpZW50IC0gT24gdGhlIGNsaWVudCBzaWRlLCB0aGlzIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UgY29udGV4dCBmcm9tIHRoZQotICogQmluZGluZ1Byb3ZpZGVyIGluc3RhbmNlLgotICogPHAvPgotICogc2VydmVyIC0gT24gdGhlIHNlcnZlciBzaWRlLCB0aGlzIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0Ci0gKiBpbnN0YW5jZSB0aGF0IHRoZSBzZXJ2aWNlIGVuZHBvaW50IHdpbGwgc2VlLiAgVGhpcyBpcyB0aGUgc2FtZSBjb250ZXh0IHRoYXQgd2lsbCBiZSBpbmplY3RlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yIHsKLQotICAgIC8qKgotICAgICAqIElzIGNhbGxlZCB0byBoYW5kbGUgcHJvcGVydHkgbWlncmF0aW9uIEZST00gdGhlIHVzZXIgY29udGV4dCAoQmluZGluZ1Byb3ZpZGVyIGNsaWVudCBjb250ZXh0Ci0gICAgICogb3Igc2VydmVyIE1lc3NhZ2VDb250ZXh0KSBUTyBhIHRhcmdldCBpbnRlcm5hbCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlckNvbnRleHQgICAgLSBUaGUgc291cmNlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgdXNlciBjb250ZXh0IHByb3BlcnRpZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gVGhlIHRhcmdldCBNZXNzYWdlQ29udGV4dCB0byByZWNlaXZlIHRoZSBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1pZ3JhdGVQcm9wZXJ0aWVzVG9NZXNzYWdlQ29udGV4dChNYXA8U3RyaW5nLCBPYmplY3Q+IHVzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBJcyBjYWxsZWQgdG8gaGFuZGxlIHByb3BlcnR5IG1pZ3JhdG9tIEZST00gdGhlIGludGVybmFsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dAotICAgICAqIFRPIGEgdGFyZ2V0IHVzZXIgY29udGV4dCAoQmluZGluZ1Byb3ZpZGVyIGNsaWVudCBjb250ZXh0IG9yIHNlcnZlciBNZXNzYWdlQ29udGV4dCkgdGhhdCB0aGUKLSAgICAgKiB1c2VyIHdpbGwgYWNjZXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIHVzZXJDb250ZXh0ICAgIC0gVGhlIHRhcmdldCB1c2VyIGNvbnRleHQgdG8gcmVjZWl2ZSB0aGUgcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgLSBUaGUgc291cmNlIE1lc3NhZ2VDb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnR5IHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtaWdyYXRlUHJvcGVydGllc0Zyb21NZXNzYWdlQ29udGV4dChNYXA8U3RyaW5nLCBPYmplY3Q+IHVzZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL21pZ3JhdG9yL0FwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL21pZ3JhdG9yL0FwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjU1NDkzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9taWdyYXRvci9BcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLm1pZ3JhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLk1FUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQuU2NvcGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Db250ZXh0TWlncmF0b3JVdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG5ldyBDb250ZXh0UHJvcGVydHlNaWdyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEBwYXJhbSBjb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dCB0aGF0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgbGlzdCBvZiBtaWdyYXRvcnMuCi0gICAgICogQHBhcmFtIG1pZ3JhdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dE1pZ3JhdG9yTGlzdElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciBtaWdyYXRvcikgewotICAgICAgICBMaXN0PEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiBtaWdyYXRvckxpc3QgPQotICAgICAgICAgICAgICAgIChMaXN0PEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiljb25maWd1cmF0aW9uQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KGNvbnRleHRNaWdyYXRvckxpc3RJRCk7Ci0KLSAgICAgICAgaWYgKG1pZ3JhdG9yTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtaWdyYXRvckxpc3QgPSBuZXcgTGlua2VkTGlzdDxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4oKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LnNldFByb3BlcnR5KGNvbnRleHRNaWdyYXRvckxpc3RJRCwgbWlncmF0b3JMaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobWlncmF0b3JMaXN0KSB7Ci0gICAgICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZW4ndCBhbHJlYWR5IGFkZGVkIHRoaXMgbWlncmF0b3IgdG8gdGhlCi0gICAgICAgICAgICAvLyBsaXN0LgotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yPEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiBpdHIgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yIG0gPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChtLmdldENsYXNzKCkuZXF1YWxzKG1pZ3JhdG9yLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yOiAiICsgbWlncmF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWlncmF0b3JMaXN0LmFkZChtaWdyYXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dE1pZ3JhdG9yTGlzdElECi0gICAgICogQHBhcmFtIHJlcXVlc3RDb250ZXh0Ci0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBlcmZvcm1NaWdyYXRpb25Ub01lc3NhZ2VDb250ZXh0KFN0cmluZyBjb250ZXh0TWlncmF0b3JMaXN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibnVsbE1zZ0N0eEVyciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IG1lc3NhZ2VDb250ZXh0LmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IHNkLmdldEF4aXNDb25maWdDb250ZXh0KCk7Ci0gICAgICAgICAgICBMaXN0PEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiBtaWdyYXRvckxpc3QgPSAoTGlzdDxBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvcj4pIGNvbmZpZ0N0eC5nZXRQcm9wZXJ0eShjb250ZXh0TWlncmF0b3JMaXN0SUQpOwotICAgICAgICAgICAgaWYgKG1pZ3JhdG9yTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvcHkgdG8gYXZvaWQgdXNpbmcgc2hhcmVkIGxpc3QKLSAgICAgICAgICAgICAgICBMaXN0IGxpc3RDUE0gPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIG9uIG5vbi1udWxsIG1pZ3JhdG9yTGlzdAotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtaWdyYXRvckxpc3QpewotICAgICAgICAgICAgICAgICAgICAgbGlzdENQTSA9IG5ldyBBcnJheUxpc3QobWlncmF0b3JMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yPEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiBpdHIgPSBsaXN0Q1BNLmxpc3RJdGVyYXRvcigpOyAgIC8vIEl0ZXJhdGUgb3ZlciBub24tc2hhcmVkIGxpc3QKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHRNaWdyYXRvciBjcG0gPSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWlncmF0b3I6ICIgKyBjcG0uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLm1pZ3JhdGVQcm9wZXJ0aWVzVG9NZXNzYWdlQ29udGV4dCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTeW5jaHJvbml6aW5nIGhlcmUgaXMgZXhwZW5zaXZlIHRvby4KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBjcG0gcmVxdWlyZXMgc3luY2hyb25pemF0aW9uLCBpdCBzaG91bGQgcHJvdmlkZSBpdCBpbnNpZGUgb2YgaXRzIG1pZ3JhdGVQcm9wZXJ0aWVzRnJvbU1lc3NhZ2VDb250ZXh0IGltcGxlbWVudGF0aW9uLgotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgY3BtLm1pZ3JhdGVQcm9wZXJ0aWVzVG9NZXNzYWdlQ29udGV4dChuZXcgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFJlYWRlcihyZXF1ZXN0Q29udGV4dCwgbWVzc2FnZUNvbnRleHQuZ2V0TUVQQ29udGV4dCgpKSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb250ZXh0TWlncmF0b3JMaXN0SUQKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2VDb250ZXh0Ci0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBlcmZvcm1NaWdyYXRpb25Gcm9tTWVzc2FnZUNvbnRleHQoU3RyaW5nIGNvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3BvbnNlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJudWxsTXNnQ3R4RXJyIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gbWVzc2FnZUNvbnRleHQuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gc2QuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKTsKLSAgICAgICAgICAgIExpc3Q8QXBwbGljYXRpb25Db250ZXh0TWlncmF0b3I+IG1pZ3JhdG9yTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIChMaXN0PEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yPiljb25maWdDdHguZ2V0UHJvcGVydHkoY29udGV4dE1pZ3JhdG9yTGlzdElEKTsKLQotICAgICAgICAgICAgaWYgKG1pZ3JhdG9yTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvcHkgdG8gYXZvaWQgdXNpbmcgc2hhcmVkIGxpc3QKLSAgICAgICAgICAgICAgICBMaXN0IGxpc3RDUE0gPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIG9uIG5vbi1udWxsIG1pZ3JhdG9yTGlzdAotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChtaWdyYXRvckxpc3QpewotICAgICAgICAgICAgICAgICAgICAgbGlzdENQTSA9IG5ldyBBcnJheUxpc3QobWlncmF0b3JMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMaXN0SXRlcmF0b3I8QXBwbGljYXRpb25Db250ZXh0TWlncmF0b3I+IGl0ciA9IGxpc3RDUE0ubGlzdEl0ZXJhdG9yKCk7ICAgLy8gSXRlcmF0ZSBvdmVyIG5vbi1zaGFyZWQgbGlzdAotICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dE1pZ3JhdG9yIGNwbSA9IGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtaWdyYXRvcjogIiArIGNwbS5nZXRDbGFzcygpLmdldE5hbWUoKSArICIubWlncmF0ZVByb3BlcnRpZXNGcm9tTWVzc2FnZUNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFN5bmNocm9uaXppbmcgaGVyZSBpcyBleHBlbnNpdmUgdG9vLgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGNwbSByZXF1aXJlcyBzeW5jaHJvbml6YXRpb24sIGl0IHNob3VsZCBwcm92aWRlIGl0IGluc2lkZSBvZiBpdHMgbWlncmF0ZVByb3BlcnRpZXNGcm9tTWVzc2FnZUNvbnRleHQgaW1wbGVtZW50YXRpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgY3BtLm1pZ3JhdGVQcm9wZXJ0aWVzRnJvbU1lc3NhZ2VDb250ZXh0KG5ldyBBcHBsaWNhdGlvblByb3BlcnR5TWFwV3JpdGVyKHJlc3BvbnNlQ29udGV4dCwgbWVzc2FnZUNvbnRleHQuZ2V0TUVQQ29udGV4dCgpKSwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLQotICAgIC8qKgotICAgICAqCi0gICAgICogQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFJlYWRlciBpcyBhIHdyYXBwZXIgZm9yIHRoZSBTT1VSQ0UgcHJvcGVydHkgbWFwIHBhc3NlZCB0byBpbmRpdmlkdWFsCi0gICAgICogcHJvcGVydHkgbWlncmF0b3JzLiAgV2hlbiBhIHByb3BlcnR5IG1pZ3JhdG9yIGNvcGllcyBwcm9wZXJ0aWVzIGZyb20gYSByZXF1ZXN0IGNvbnRleHQgbWFwCi0gICAgICogdG8gYSBKQVhXUyBNZXNzYWdlQ29udGV4dCBvYmplY3QsIGFsbCBvZiB0aG9zZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBtYXJrZWQgQVBQTElDQVRJT04KLSAgICAgKiBzY29wZSBzbyB0aGV5IGNhbiBsYXRlciBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVxdWVzdCBjb250ZXh0IG9yIHJlc3BvbnNlIGNvbnRleHQKLSAgICAgKiBpbiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLgotICAgICAqCi0gICAgICogV2Ugb3ZlcnJpZGUgdGhlIEVudHJ5U2V0IGFuZCBJdGVyYXRvciB0byBtYWtlIHN1cmUgdGhlIHNjb3BlIGlzIHByb3Blcmx5IHNldCBpbiB0aGUKLSAgICAgKiAicmVxdWVzdCBjb250ZXh0IHRvIEpBWFdTIG1lc3NhZ2UgY29udGV4dCIgY2FzZSB3aGVyZSB0aGUgcHJvcGVydHkgbWlncmF0b3IgdXNlcwotICAgICAqIGdldChTdHJpbmcga2V5KSBvciBwdXRBbGwoTWFwIHNvdXJjZSkuICBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QsIGhvd2V2ZXIsCi0gICAgICogYmVjYXVzZSBhIHByb3BlcnR5IG1pZ3JhdG9yIGNvdWxkIHNpbXBseSBiZSBkb2luZyBhIGdldChTdHJpbmcga2V5KSB0byBvYnNlcnZlIHByb3BlcnRpZXMKLSAgICAgKiByYXRoZXIgdGhhbiBjb3B5IHRoZW0uICBUaGlzIGp1c3QgbWVhbnMgd2UgbWlnaHQgYmUgc2V0dGluZyBzY29wZSBmb3IgYSBwcm9wZXJ0eSB0aGF0Ci0gICAgICogbmV2ZXIgYWN0dWFsbHkgbWFrZXMgaXRzIHdheSBpbnRvIHRoZSBKQVhXUyBtZXNzYWdlIGNvbnRleHQuICBJZiBzb21lb25lIChhIGhhbmRlciwKLSAgICAgKiBwZXJoYXBzKSBsYXRlciBzZXRzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksIGl0cyBzY29wZSBtYXkgYmUgInByZS1zZXQiIGFuZAotICAgICAqIHRoZXJlZm9yZSBpbmNvcnJlY3QuCi0gICAgICogCi0gICAgICogVE9ETzogIGZpbmQgc29sdXRpb24gdG8gYWJvdmUgcHJvYmxlbS4gIFRoZSBNRVBDb250ZXh0LnB1dCBzZXRzIGFuIGV4cGxpY2l0IHNjb3BlIHdoZW5ldmVyCi0gICAgICogYSBwcm9wZXJ0eSBpcyBhbmQgYSBzY29wZSBpcyBub3QgYWxyZWFkeSBwcmVzZW50IGZvciB0aGF0IHByb3BlcnR5LiAgQW4gZXhhbXBsZQotICAgICAqIG9mIHdoZXJlIHRoaXMgaWRlYSB3b3VsZCBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyBpcyB3aGVyZSBhIHNjb3BlIHdhcyBzZXQgdG8gQVBQTElDQVRJT04KLSAgICAgKiBpbiB0aGUgcHJvcGVydHkgbWlncmF0b3IgZm9yIGtleS92YWx1ZSBwYWlyICJteUtleS9zb21lVmFsdWUiLCBidXQgbXlLZXkgbmV2ZXIgYWN0dWFsbHkgbWFkZQotICAgICAqIGl0IGludG8gdGhlIG1lc3NhZ2Vjb250ZXh0LiAgTGF0ZXIgYSBoYW5kbGVyIG1pZ2h0IHB1dCBhICJteUtleS90aGVIYW5kbGVyVmFsdWUiLiAgSW4gdGhpcwotICAgICAqIGNhc2UgdGhlIHNjb3BlIHdhcyBhbHJlYWR5IHNldCB0byBBUFBMSUNBVElPTiBhbmQgd291bGQgdGhlcmVmb3JlIG5vdCBiZSBzZXQgYnkgdGhlCi0gICAgICogTUVQQ29udGV4dC5wdXQgYW5kIHRoZXJlZm9yZSBiZSBpbmNvcnJlY3QuCi0gICAgICoKLSAgICAgKiBBcHBsaWNhdGlvblByb3BlcnR5TWFwUmVhZGVyIG9ubHkgc2V0cyB0aGUgc2NvcGUgaWYgYSBtaWdyYXRvciBjYWxscyAiZ2V0IiBvbiB0aGlzIG1hcCBvcgotICAgICAqIGl0ZXJhdGVzIG92ZXIgdGhlIGVudHJ5U2V0LCB3aGljaCBtYXkgb2NjdXIgZXhwbGljaXRseSBpbiB0aGUgbWlncmF0b3IsIG9yIGltcGxpY2l0bHkgd2hlbgotICAgICAqIHRoaXMgbWFwIGlzIHRoZSBzb3VyY2UgZm9yIGEgY2FsbCBzdWNoIGFzIG90aGVyTWFwLnB1dEFsbChNYXAgc291cmNlKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcHBsaWNhdGlvblByb3BlcnR5TWFwUmVhZGVyIGV4dGVuZHMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gewotCi0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyTWFwOwotICAgICAgICBwcml2YXRlIE1FUENvbnRleHQgbWVwQ3R4OwotICAgICAgICAKLSAgICAgICAgcHVibGljIEFwcGxpY2F0aW9uUHJvcGVydHlNYXBSZWFkZXIoTWFwPFN0cmluZywgT2JqZWN0PiB1c2VyTWFwLCBNRVBDb250ZXh0IG1lcEN0eCkgewotICAgICAgICAgICAgdGhpcy51c2VyTWFwID0gdXNlck1hcDsKLSAgICAgICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBwdXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAvL21lcEN0eC5zZXRTY29wZShrZXksIFNjb3BlLkFQUExJQ0FUSU9OKTsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBPYmplY3Q+IG0pIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHNtYXJ0ZXIgcHV0KFN0cmluZywgT2JqZWN0KQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG0uZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcHV0KChTdHJpbmcpZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcEVudHJ5U2V0KHVzZXJNYXAuZW50cnlTZXQoKSwgbWVwQ3R4KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICAvLyBXQVJOSU5HOiAgdGhlcmUncyBubyByZWFsIGd1YXJhbnRlZSB0aGF0IHRoZSByZWFzb24gYSBtaWdyYXRvciBpcyBnZXR0aW5nCi0gICAgICAgICAgICAvLyBhIHByb3BlcnR5IGlzIGR1ZSB0byBpdCBiZWluZyBwdXQgb24gdGhlIE1lc3NhZ2VDb250ZXh0LgotICAgICAgICAgICAgLy8gV2Ugd291bGQgdGhlcmVmb3JlIGJlIHNldHRpbmcgc2NvcGUgZm9yIGEgcHJvcGVydHkgdGhhdCBuZXZlciBhY3R1YWxseSBtYWtlcwotICAgICAgICAgICAgLy8gaXRzIHdheSBpbnRvIHRoZSBtZXNzYWdlQ29udGV4dC4KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSB1c2VyTWFwLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVwQ3R4LnNldFNjb3BlKChTdHJpbmcpa2V5LCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5rZXlTZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5yZW1vdmUoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAudmFsdWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcEVudHJ5U2V0IGV4dGVuZHMgQWJzdHJhY3RTZXQgewotCi0gICAgICAgICAgICBTZXQgY29udGFpbmVkU2V0OwotICAgICAgICAgICAgTUVQQ29udGV4dCBtZXBDdHg7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyBBcHBsaWNhdGlvblByb3BlcnR5TWFwRW50cnlTZXQoU2V0IHNldCwgTUVQQ29udGV4dCBtZXBDdHgpIHsKLSAgICAgICAgICAgICAgICBjb250YWluZWRTZXQgPSBzZXQ7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZXBDdHggPSBtZXBDdHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEVudHJ5U2V0SXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVNldEl0ZXJhdG9yKGNvbnRhaW5lZFNldC5pdGVyYXRvcigpLCBtZXBDdHgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVkU2V0LnNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIGNsYXNzIEVudHJ5U2V0SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgY29udGFpbmVkSXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIE1FUENvbnRleHQgbWVwQ3R4OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcml2YXRlIEVudHJ5U2V0SXRlcmF0b3IoSXRlcmF0b3IgY29udGFpbmVkSXRlcmF0b3IsIE1FUENvbnRleHQgbWVwQ3R4KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZWRJdGVyYXRvciA9IGNvbnRhaW5lZEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIHRoaXMubWVwQ3R4ID0gbWVwQ3R4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBvdmVycmlkZSByZW1vdmUoKSB0byBtYWtlIHRoaXMgSXRlcmF0b3IgY2xhc3MgcmVhZC1vbmx5Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lZEl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgewotICAgICAgICAgICAgICAgIC8vIFdBUk5JTkc6ICB0aGVyZSdzIG5vIHJlYWwgZ3VhcmFudGVlIHRoYXQgdGhlIHJlYXNvbiBhIG1pZ3JhdG9yIGlzIGl0ZXJhdGluZwotICAgICAgICAgICAgICAgIC8vIG92ZXIgdGhlIHByb3BlcnRpZXMgaXMgZHVlIHRvIHRoaXMgYmVpbmcgdGhlIHNvdXJjZSBvYmplY3QgZm9yIGEgcHV0QWxsKHNvdXJjZSkKLSAgICAgICAgICAgICAgICAvLyBXZSB3b3VsZCB0aGVyZWZvcmUgYmUgc2V0dGluZyBzY29wZSBmb3IgYSBwcm9wZXJ0eSB0aGF0IG5ldmVyIGFjdHVhbGx5IG1ha2VzCi0gICAgICAgICAgICAgICAgLy8gaXRzIHdheSBpbnRvIHRoZSBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpY29udGFpbmVkSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIG1lcEN0eC5zZXRTY29wZSgoU3RyaW5nKWVudHJ5LmdldEtleSgpLCBTY29wZS5BUFBMSUNBVElPTik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBcHBsaWNhdGlvblByb3BlcnR5TWFwV3JpdGVyIGlzIHNpbWlsYXIgdG8gdGhlIEFwcGxpY2F0aW9uUHJvcGVydHlNYXBSZWFkZXIgaW4gdGhhdCBpdAotICAgICAqIG9ic2VydmVzIHNjb3BlIHRvIGRldGVybWluZSB3aGF0IGNhbiBiZSByZXR1cm5lZCB0byBhIHByb3BlcnR5IG1pZ3JhdG9yLiAgSW5kaXZpZHVhbAotICAgICAqIHByb3BlcnR5IG1pZ3JhdG9ycyBzaG91bGQgb25seSBiZSBhbGxvd2VkIHRvIHJldHJpZXZlIEFQUExJQ0FUSU9OLXNjb3BlZCBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIFRPRE86ICBUaGVyZSdzIHF1aXRlIGEgYml0IG9mIGV4cGVuc2l2ZSBsb2dpYyB0aGF0IHdvdWxkIG5lZWQgdG8gZ28gaW50byB0aGlzIHRvIGJlCi0gICAgICogZnVsbHkgY29ycmVjdC4gIEZvciBleGFtcGxlLCBpZiBhIG1pZ3JhdG9yIGNhbGxzIHNpemUsIHdlIGNhbm5vdCBzaW1wbHkgcmV0dXJuCi0gICAgICogdXNlck1hcC5zaXplKCkuICBSYXRoZXIsIHdlIHdvdWxkIGhhdmUgdG8gY291bnQgb25seSB0aGUgQVBQTElDQVRJT04gc2NvcGVkIHByb3BlcnRpZXMKLSAgICAgKiBhbmQgcmV0dXJuIHRob3NlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uUHJvcGVydHlNYXBXcml0ZXIgZXh0ZW5kcyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiB7Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IHVzZXJNYXA7Ci0gICAgICAgIHByaXZhdGUgTUVQQ29udGV4dCBtZXBDdHg7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgQXBwbGljYXRpb25Qcm9wZXJ0eU1hcFdyaXRlcihNYXA8U3RyaW5nLCBPYmplY3Q+IHVzZXJNYXAsIE1FUENvbnRleHQgbWVwQ3R4KSB7Ci0gICAgICAgICAgICB0aGlzLnVzZXJNYXAgPSB1c2VyTWFwOwotICAgICAgICAgICAgdGhpcy5tZXBDdHggPSBtZXBDdHg7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IHB1dChTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIC8vIG5vdGljZSB0aGUgbG9naWMgaGVyZSEgIFdlIHdvbid0IHB1dCBhIHByb3BlcnR5IG9uIHRoZSB1c2VyTWFwIHRoYXQgaXMgbm90IEFQUExJQ0FUSU9OIHNjb3BlZAotICAgICAgICAgICAgaWYgKG1lcEN0eC5nZXRTY29wZShrZXkpID09IFNjb3BlLkFQUExJQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgU3RyaW5nLCA/IGV4dGVuZHMgT2JqZWN0PiBtKSB7Ci0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzbWFydGVyIHB1dChTdHJpbmcsIE9iamVjdCkKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIHB1dCgoU3RyaW5nKWVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIGlmIChtZXBDdHguZ2V0U2NvcGUoKFN0cmluZylrZXkpID09IFNjb3BlLkFQUExJQ0FUSU9OKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJNYXAuZ2V0KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0IGtleVNldCgpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLmtleVNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLnJlbW92ZShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB1c2VyTWFwLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck1hcC52YWx1ZXMoKTsKLSAgICAgICAgfQotICAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0F0dGFjaG1lbnRVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmZGRkNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0F0dGFjaG1lbnRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7DQotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50VXRpbHMgew0KLXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBdHRhY2htZW50VXRpbHMuY2xhc3MpOw0KLQkNCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVJbWFnZXMoSW1hZ2UgaW1nMSwgSW1hZ2UgaW1nMil7DQotCQlpZihpbWcxID09IG51bGwgJiYgaW1nMj09bnVsbCl7DQotCQkJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpew0KLQkJCQlsb2cuZGVidWcoIkJvdGggSW1hZ2UgT2JqZWN0cyBhcmUgbnVsbCwgY2Fubm90IGNvbXBhcmUgSW1hZ2VzIHJldHVybmluZyBmYWxzZSIpOw0KLQkJCX0NCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpbnQgaDEgPSBpbWcxLmdldEhlaWdodChudWxsKTsNCi0JCWludCBoMiA9IGltZzIuZ2V0SGVpZ2h0KG51bGwpOw0KLQkJaW50IHcxID0gaW1nMS5nZXRXaWR0aChudWxsKTsNCi0JCWludCB3MiA9IGltZzEuZ2V0V2lkdGgobnVsbCk7DQotCQlpZihoMSAhPSBoMiB8fCB3MSAhPSB3Mil7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYoaW1nMSBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW1hZ2UgJiYgaW1nMiBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW1hZ2Upew0KLQkJCUJ1ZmZlcmVkSW1hZ2UgYmkxID0gKEJ1ZmZlcmVkSW1hZ2UpaW1nMTsNCi0JCQlCdWZmZXJlZEltYWdlIGJpMiA9IChCdWZmZXJlZEltYWdlKWltZzI7DQotCQkJZm9yKGludCBoPTA7aDxoMTsrK2gpew0KLQkJCQlmb3IoaW50IHc9MDsgdzx3MTsgKyt3KXsNCi0JCQkJCWludCBJbWcxUGl4ZWwgPWJpMS5nZXRSR0IodywgaCk7DQotCQkJCQlpbnQgSW1nMlBpeGVsID1iaTIuZ2V0UkdCKHcsIGgpOw0KLQkJCQkJaWYoSW1nMVBpeGVsIT1JbWcyUGl4ZWwpew0KLQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB0cnVlOwkJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9DbGFzc1V0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0NsYXNzVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxZjE1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0NsYXNzVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKiBDb250YWlucyBzdGF0aWMgQ2xhc3MgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gbWV0aG9kIHBhcmFtZXRlci9hcmd1bWVudCBtYXJzaGFsbGluZy4gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc1V0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbGFzc1V0aWxzLmNsYXNzKTsKLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgUm9vdENhdXNlIGZvciBhbiB0aHJvd2FibGUuIFRoZSByb290IGNhdXNlIGlzIGRlZmluZWQgYXMgdGhlIGZpcnN0Ci0gICAgICogbm9uLUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZSBUaHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZSByb290IGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsKLQotICAgICAgICBpZiAoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICB0ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKWUpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGUgPSBnZXRSb290Q2F1c2UodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcCBsb2FkQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgiYnl0ZSIsIGJ5dGUuY2xhc3MpOwotICAgICAgICBsb2FkQ2xhc3NNYXAucHV0KCJpbnQiLCBpbnQuY2xhc3MpOwotICAgICAgICBsb2FkQ2xhc3NNYXAucHV0KCJzaG9ydCIsIHNob3J0LmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgibG9uZyIsIGxvbmcuY2xhc3MpOwotICAgICAgICBsb2FkQ2xhc3NNYXAucHV0KCJmbG9hdCIsIGZsb2F0LmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgiZG91YmxlIiwgZG91YmxlLmNsYXNzKTsKLSAgICAgICAgbG9hZENsYXNzTWFwLnB1dCgiYm9vbGVhbiIsIGJvb2xlYW4uY2xhc3MpOwotICAgICAgICBsb2FkQ2xhc3NNYXAucHV0KCJjaGFyIiwgY2hhci5jbGFzcyk7Ci0gICAgICAgIGxvYWRDbGFzc01hcC5wdXQoInZvaWQiLCB2b2lkLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogQ29udmVydHMgdGV4dCBvZiB0aGUgZm9ybSBGb29bXSB0byB0aGUgcHJvcGVyIGNsYXNzIG5hbWUgZm9yIGxvYWRpbmcgW0xGb28gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGxvYWRhYmxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgiYnl0ZSIsICJCIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgiY2hhciIsICJDIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgiZG91YmxlIiwgIkQiKTsKLSAgICAgICAgbG9hZGFibGVNYXAucHV0KCJmbG9hdCIsICJGIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgiaW50IiwgIkkiKTsKLSAgICAgICAgbG9hZGFibGVNYXAucHV0KCJsb25nIiwgIkoiKTsKLSAgICAgICAgbG9hZGFibGVNYXAucHV0KCJzaG9ydCIsICJTIik7Ci0gICAgICAgIGxvYWRhYmxlTWFwLnB1dCgiYm9vbGVhbiIsICJaIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHRleHQgU3RyaW5nCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBmb3IgQ2xhc3MuZm9yTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvYWRhYmxlQ2xhc3NOYW1lKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGludCBicmFja2V0ID0gdGV4dC5pbmRleE9mKCJbIik7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSB0ZXh0OwotCi0gICAgICAgIC8vIEdldCB0aGUgY2xhc3NOYW1lIHdpdGhvdXQgYW55IGFycmF5IGJyYWNrZXRzCi0gICAgICAgIGlmIChicmFja2V0ID4gMCkgewotICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBicmFja2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBnZXQgdGhlIGxvYWRhYmxlIG5hbWUgZnJvbSB0aGUgbWFwIG9yIAotICAgICAgICAvLyBpdHMgTDxjbGFzc05hbWU+OwotICAgICAgICBTdHJpbmcgbG9hZENsYXNzID0gKFN0cmluZylsb2FkYWJsZU1hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGxvYWRDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2FkQ2xhc3MgPSAiTCIgKyBjbGFzc05hbWUgKyAiOyI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3cgcHJlcGVuZCBbIGZvciBlYWNoIGFycmF5IGRpbWVuc2lvbgotICAgICAgICBpZiAoYnJhY2tldCA+IDApIHsKLSAgICAgICAgICAgIGludCBpID0gdGV4dC5pbmRleE9mKCJdIik7Ci0gICAgICAgICAgICB3aGlsZSAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBsb2FkQ2xhc3MgPSAiWyIgKyBsb2FkQ2xhc3M7Ci0gICAgICAgICAgICAgICAgaSA9IHRleHQuaW5kZXhPZigiXSIsIGkgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9hZENsYXNzOwotICAgIH0KLQotICAgIC8qKiBDb252ZXJ0cyB0ZXh0IG9mIHRoZSBmb3JtIFtMRm9vIHRvIHRoZSBGb29bXSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHRDbGFzc05hbWUoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaWYgKHRleHQgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHRleHQuaW5kZXhPZigiWyIpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCgpICYmCi0gICAgICAgICAgICAgICAgdGV4dC5jaGFyQXQoaW5kZXgpID09ICdbJykgewotICAgICAgICAgICAgaW5kZXggKys7Ci0gICAgICAgICAgICBjbGFzc05hbWUgKz0gIltdIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5kZXggPCB0ZXh0Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdCJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAiYnl0ZSIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT0gJ0MnKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJjaGFyIiArIGNsYXNzTmFtZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRleHQuY2hhckF0KGluZGV4KSA9PSAnRCcpCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gImRvdWJsZSIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT0gJ0YnKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJmbG9hdCIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT0gJ0knKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJpbnQiICsgY2xhc3NOYW1lOwotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5jaGFyQXQoaW5kZXgpID09ICdKJykKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAibG9uZyIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT0gJ1MnKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJzaG9ydCIgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZXh0LmNoYXJBdChpbmRleCkgPT0gJ1onKQotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJib29sZWFuIiArIGNsYXNzTmFtZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHRleHQuZXF1YWxzKCJ2b2lkIikpCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gInZvaWQiOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdGV4dC5zdWJzdHJpbmcoaW5kZXggKyAxLCB0ZXh0LmluZGV4T2YoIjsiKSkgKyBjbGFzc05hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJpbWl0aXZlCi0gICAgICogQHJldHVybiBqYXZhIHdyYXBwZXIgY2xhc3Mgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0V3JhcHBlckNsYXNzKENsYXNzIHByaW1pdGl2ZSkgewotICAgICAgICBpZiAocHJpbWl0aXZlID09IGludC5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuSW50ZWdlci5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlID09IHNob3J0LmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5TaG9ydC5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlID09IGJvb2xlYW4uY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkJvb2xlYW4uY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBieXRlLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5CeXRlLmNsYXNzOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmUgPT0gbG9uZy5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuTG9uZy5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAocHJpbWl0aXZlID09IGRvdWJsZS5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuRG91YmxlLmNsYXNzOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmUgPT0gZmxvYXQuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkZsb2F0LmNsYXNzOwotICAgICAgICBlbHNlIGlmIChwcmltaXRpdmUgPT0gY2hhci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdyYXBwZXIKLSAgICAgKiBAcmV0dXJuIHByaW1pdGl2ZSBjbGFzIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFByaW1pdGl2ZUNsYXNzKENsYXNzIHdyYXBwZXIpIHsKLSAgICAgICAgaWYgKHdyYXBwZXIgPT0gamF2YS5sYW5nLkludGVnZXIuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gaW50LmNsYXNzOwotICAgICAgICBlbHNlIGlmICh3cmFwcGVyID09IGphdmEubGFuZy5TaG9ydC5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBzaG9ydC5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAod3JhcHBlciA9PSBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBib29sZWFuLmNsYXNzOwotICAgICAgICBlbHNlIGlmICh3cmFwcGVyID09IGphdmEubGFuZy5CeXRlLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGJ5dGUuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHdyYXBwZXIgPT0gamF2YS5sYW5nLkxvbmcuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gbG9uZy5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAod3JhcHBlciA9PSBqYXZhLmxhbmcuRG91YmxlLmNsYXNzKQotICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5jbGFzczsKLSAgICAgICAgZWxzZSBpZiAod3JhcHBlciA9PSBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gZmxvYXQuY2xhc3M7Ci0gICAgICAgIGVsc2UgaWYgKHdyYXBwZXIgPT0gamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcykKLSAgICAgICAgICAgIHJldHVybiBjaGFyLmNsYXNzOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gbm9DbGFzcyA9IG5ldyBDbGFzc1tdIHsgfTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGVmYXVsdCBwdWJsaWMgY29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gQ29uc3RydWN0b3Igb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZ2V0RGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yKENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0Q29uc3RydWN0b3Iobm9DbGFzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIG9mIHByaW1pdGl2ZSB0eXBlCi0gICAgICogQHJldHVybiBwcmltaXRpdmUgQ2xhc3Mgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UHJpbWl0aXZlQ2xhc3MoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcmV0dXJuIChDbGFzcylsb2FkQ2xhc3NNYXAuZ2V0KHRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjbHMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIEpBWC1XUyBvciBKQVgtV1MgZ2VuZXJhdGVkIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSkFYV1NDbGFzcyhDbGFzcyBjbHMpIHsKLSAgICAgICAgLy8gVE9ETyBQcm9jZXNzaW5nIGFsbCBvZiB0aGVzZSBhbm5vdGF0aW9ucyBpcyB2ZXJ5IGV4cGVuc2l2ZS4gIFdlIG5lZWQgdG8gY2FjaGUgdGhlIAotICAgICAgICAvLyByZXN1bHQgaW4gYSBzdGF0aWMgV2Vha0hhc2hNYXA8Q2xhc3MsIEJvb2xlYW4+Ci0KLSAgICAgICAgLy8gS2luZHMgb2YgZ2VuZXJhdGVkIGNsYXNzZXM6IFNlcnZpY2UsIFByb3ZpZGVyLCBJbXBsLCBFeGNlcHRpb24sIEhvbGRlcgotICAgICAgICAvLyBPciB0aGUgY2xhc3MgaXMgaW4gdGhlIGpheHdzLnhtbC53cyBwYWNrYWdlCi0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIEltcGwKLSAgICAgICAgV2ViU2VydmljZSB3c0FubiA9IChXZWJTZXJ2aWNlKWdldEFubm90YXRpb24oY2xzLFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBpZiAod3NBbm4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBmb3Igc2VydmljZQotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzY0FubiA9IChXZWJTZXJ2aWNlQ2xpZW50KWdldEFubm90YXRpb24oY2xzLFdlYlNlcnZpY2VDbGllbnQuY2xhc3MpOwotICAgICAgICBpZiAod3NjQW5uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHByb3ZpZGVyCi0gICAgICAgIFdlYlNlcnZpY2VQcm92aWRlciB3c3BBbm4gPSAoV2ViU2VydmljZVByb3ZpZGVyKQotICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihjbHMsV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHdzcEFubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGZvciBFeGNlcHRpb24KLSAgICAgICAgV2ViRmF1bHQgd2ZBbm4gPSAoV2ViRmF1bHQpZ2V0QW5ub3RhdGlvbihjbHMsV2ViRmF1bHQuY2xhc3MpOwotICAgICAgICBpZiAod2ZBbm4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDaGVjayBmb3IgSG9sZGVyCi0gICAgICAgIGlmIChIb2xkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbHMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGZvciBhIGphdmF4LnhtbC53cy5TZXJ2aWNlIGNsYXNzIGluc3RhbmNlCi0gICAgICAgIGlmIChTZXJ2aWNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xzLmdldFBhY2thZ2UoKSA9PSBudWxsID8gbnVsbCA6IGNscy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnN0YXJ0c1dpdGgoImphdmF4LnhtbC53cyIpICYmICFjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YXgueG1sLndzLndzYWRkcmVzc2luZyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvQ29udmVydFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0NvbnZlcnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGMxYjNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvQ29udmVydFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0aWVzIHRvIGNvbnZlcnQgYW4gb2JqZWN0IGludG8gYSBkaWZmZXJlbnQga2luZCBvZiBPYmplY3QuIEZvciBleGFtcGxlLCBjb252ZXJ0IGEKLSAqIFN0cmluZ1tdIGludG8gYSBMaXN0PFN0cmluZz4KLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ29udmVydFV0aWxzLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udmVydCBtZXRob2Qgd2lsbCBzdWNjZWVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgYW55IGNoYW5nZXMgdG8gaXNDb252ZXJ0YWJsZSgpIG11c3QgYWxzbyBiZSBhY2NvbXBhbmllZCBieSBzaW1pbGFyIGNoYW5nZXMgdG8KLSAgICAgKiBjb252ZXJ0KCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogIHNvdXJjZSBvYmplY3Qgb3IgY2xhc3MKLSAgICAgKiBAcGFyYW0gZGVzdCBkZXN0aW5hdGlvbiBjbGFzcwotICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNvbnZlcnQoLi4pIGNhbiBjb252ZXJ0IG9iaiB0byB0aGUgZGVzdGluYXRpb24gY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb252ZXJ0YWJsZShPYmplY3Qgb2JqLCBDbGFzcyBkZXN0KSB7Ci0gICAgICAgIENsYXNzIHNyYyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBzcmMgPSAoQ2xhc3Mpb2JqOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcmMgPSBvYmouZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSdyZSBkaXJlY3RseSBhc3NpZ25hYmxlLCB3ZSdyZSBnb29kLgotICAgICAgICBpZiAoZGVzdC5pc0Fzc2lnbmFibGVGcm9tKHNyYykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgaXQncyBhIHdyYXBwaW5nIGNvbnZlcnNpb24sIHdlJ3JlIGdvb2QuCi0gICAgICAgIGlmIChKYXZhVXRpbHMuZ2V0V3JhcHBlckNsYXNzKHNyYykgPT0gZGVzdCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEphdmFVdGlscy5nZXRXcmFwcGVyQ2xhc3MoZGVzdCkgPT0gc3JjKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGl0J3MgTGlzdCAtPiBBcnJheSBvciB2aWNlIHZlcnNhLCB3ZSdyZSBnb29kLgotICAgICAgICBpZiAoKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzcmMpIHx8IHNyYy5pc0FycmF5KCkpICYmCi0gICAgICAgICAgICAgICAgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShkZXN0KSB8fCBkZXN0LmlzQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBjb25zaWRlciB0aGUgY29tcG9uZW50IHR5cGVzIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRydWUuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG93IG1hcHBpbmcgb2YgSGFzaE1hcHMgdG8gSGFzaHRhYmxlcwotICAgICAgICBpZiAoc3JjID09IEhhc2hNYXAuY2xhc3MgJiYgZGVzdCA9PSBIYXNodGFibGUuY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAvLyBBbGxvdyBtYXBwaW5nIG9mIENhbGVuZGFyIHRvIERhdGUKLSAgICAgICAgaWYgKENhbGVuZGFyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3JjKSAmJiBkZXN0ID09IERhdGUuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNyYy5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNDb252ZXJ0YWJsZShKYXZhVXRpbHMuZ2V0V3JhcHBlckNsYXNzKHNyYyksIGRlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKElucHV0U3RyZWFtLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc3JjKSAmJiBkZXN0ID09IGJ5dGVbXS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0gICAgICAgICAKLSAgICAgICAgIGlmIChTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzcmMpICYmIGRlc3QgPT0gYnl0ZVtdLmNsYXNzKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0gICAgICAgICAKLSAgICAgICAgIGlmIChEYXRhSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNyYykgJiYgaXNDb252ZXJ0YWJsZShieXRlW10uY2xhc3MsIGRlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChEYXRhSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNyYykgJiYgZGVzdCA9PSBJbWFnZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRGF0YUhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzcmMpICYmIGRlc3QgPT0gU291cmNlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChieXRlW10uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzcmMpICYmIGRlc3QgPT0gU3RyaW5nLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAgCi0gICAgICAgIC8vIElmIGl0J3MgYSBNSU1FIHR5cGUgbWFwcGluZyBhbmQgd2Ugd2FudCBhIERhdGFIYW5kbGVyLAotICAgICAgICAvLyB0aGVuIHdlJ3JlIGdvb2QuCi0gICAgICAgIC8vIFJFVklFVyBEbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcwotICAgICAgICAvKgotICAgICAgICBpZiAoZGVzdC5nZXROYW1lKCkuZXF1YWxzKCJqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gc3JjLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChzcmMgPT0gU3RyaW5nLmNsYXNzCi0gICAgICAgICAgICAgICAgICAgIHx8IHNyYyA9PSBqYXZhLmF3dC5JbWFnZS5jbGFzcwotICAgICAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFscygiamF2YXgubWFpbC5pbnRlcm5ldC5NaW1lTXVsdGlwYXJ0IikKLSAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5lcXVhbHMoImphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYW4gT2JqZWN0IHRvIHNvbWUgZGVzaXJlZCBDbGFzcy4KLSAgICAgKiA8cC8+Ci0gICAgICogTm9ybWFsbHkgdGhpcyBpcyB1c2VkIGZvciBUW10gdG8gTGlzdDxUPiBwcm9jZXNzaW5nLiBPdGhlciBjb252ZXJzaW9ucyBhcmUgYWxzbyBkb25lIChpLmUuCi0gICAgICogSGFzaE1hcCA8LT5IYXNodGFibGUsIGV0Yy4pCi0gICAgICogPHAvPgotICAgICAqIFVzZSB0aGUgaXNDb252ZXJ0YWJsZSgpIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgY29udmVyc2lvbiBpcyBwb3NzaWJsZS4gTm90ZSB0aGF0IGFueSBjaGFuZ2VzCi0gICAgICogdG8gY29udmVydCgpIG11c3QgYWxzbyBiZSBhY2NvbXBhbmllZCBieSBzaW1pbGFyIGNoYW5nZXMgdG8gaXNDb252ZXJ0YWJsZSgpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnICAgICAgIHRoZSBhcnJheSB0byBjb252ZXJ0Ci0gICAgICogQHBhcmFtIGRlc3RDbGFzcyB0aGUgYWN0dWFsIGNsYXNzIHdlIHdhbnQKLSAgICAgKiBAcmV0dXJuIG9iamVjdCBvZiBkZXN0Q2xhc3MgaWYgY29udmVyc2lvbiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHJldHVybnMgYXJnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29udmVydChPYmplY3QgYXJnLCBDbGFzcyBkZXN0Q2xhc3MpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRlc3RDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFyZyAhPSBudWxsICYmIGRlc3RDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGFyZy5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgcmV0dXJuIGFyZzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNsc05hbWUgPSAibnVsbCI7Ci0gICAgICAgICAgICBpZiAoYXJnICE9IG51bGwpIGNsc05hbWUgPSBhcmcuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNvbnZlcnRpbmcgYW4gb2JqZWN0IG9mIHR5cGUgIiArIGNsc05hbWUgKyAiIHRvIGFuIG9iamVjdCBvZiB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICBkZXN0Q2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnZlcnQgYmV0d2VlbiBDYWxlbmRhciBhbmQgRGF0ZQotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgQ2FsZW5kYXIgJiYgZGVzdENsYXNzID09IERhdGUuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKENhbGVuZGFyKWFyZykuZ2V0VGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29udmVydCBiZXR3ZWVuIEhhc2hNYXAgYW5kIEhhc2h0YWJsZQotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgSGFzaE1hcCAmJiBkZXN0Q2xhc3MgPT0gSGFzaHRhYmxlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2h0YWJsZSgoSGFzaE1hcClhcmcpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0gJiYgZGVzdENsYXNzID09IGJ5dGVbXS5jbGFzcykgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKElucHV0U3RyZWFtKSBhcmc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEJ5dGVzRnJvbVN0cmVhbShpcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBTb3VyY2UgJiYgZGVzdENsYXNzID09IGJ5dGVbXS5jbGFzcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgU3RyZWFtU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChTdHJlYW1Tb3VyY2UpIGFyZykuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCeXRlc0Zyb21TdHJlYW0oaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3V0KTsKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKChTb3VyY2UpIGFyZywgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIERhdGFIYW5kbGVyKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gKChEYXRhSGFuZGxlcikgYXJnKS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlmIChkZXN0Q2xhc3MgPT0gSW1hZ2UuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEltYWdlSU8ucmVhZChpcyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0Q2xhc3MgPT0gU291cmNlLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0Qnl0ZXNGcm9tU3RyZWFtKGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydChieXRlcywgZGVzdENsYXNzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBieXRlW10gJiYgZGVzdENsYXNzID09IFN0cmluZy5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoKGJ5dGVbXSkgYXJnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhbiBhcnJheSBhbmQgdGhlIHNvdXJjZQotICAgICAgICAvLyBpcyBhIHN1aXRhYmxlIGNvbXBvbmVudCwgcmV0dXJuIGFuIGFycmF5IHdpdGggCi0gICAgICAgIC8vIHRoZSBzaW5nbGUgaXRlbS4KLSAgICAgICAgLyogUkVWSUVXIGRvIHdlIG5lZWQgdG8gc3VwcG9ydCBhdG9taWMgdG8gYXJyYXkgY29udmVyc2lvbiA/Ci0gICAgICAgIGlmIChhcmcgIT0gbnVsbCAmJgotICAgICAgICAgICAgZGVzdENsYXNzLmlzQXJyYXkoKSAmJgotICAgICAgICAgICAgIWRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkuZXF1YWxzKE9iamVjdC5jbGFzcykgJiYKLSAgICAgICAgICAgIGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbShhcmcuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IAotICAgICAgICAgICAgICAgIEFycmF5Lm5ld0luc3RhbmNlKGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCksIDEpOwotICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCAwLCBhcmcpOwotICAgICAgICAgICAgcmV0dXJuIGFycmF5OwotICAgICAgICB9Ci0gICAgICAgICovCi0KLSAgICAgICAgLy8gUmV0dXJuIGlmIG5vIGNvbnZlcnNpb24gaXMgYXZhaWxhYmxlCi0gICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIENvbGxlY3Rpb24gfHwKLSAgICAgICAgICAgICAgICAoYXJnICE9IG51bGwgJiYgYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXJnID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGFyZyBtYXkgYmUgYW4gYXJyYXkgb3IgTGlzdCAKLSAgICAgICAgT2JqZWN0IGRlc3RWYWx1ZSA9IG51bGw7Ci0gICAgICAgIGludCBsZW5ndGggPSAwOwotICAgICAgICBpZiAoYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgoYXJnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlbmd0aCA9ICgoQ29sbGVjdGlvbilhcmcpLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkZXN0Q2xhc3MuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFzc2lnbiBhcnJheSBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCBpLCBBcnJheS5nZXQoYXJnLCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9ICgoQ29sbGVjdGlvbilhcmcpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgaWR4KyssIGkubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXN0VmFsdWUgPSBhcnJheTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBbXSBhcnJheTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gKE9iamVjdCBbXSlBcnJheS5uZXdJbnN0YW5jZShkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGNvbnZlcnQgdG8gYXNzaWduIGFycmF5IGVsZW1lbnRzLgotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBjb252ZXJ0KEFycmF5LmdldChhcmcsIGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gKChDb2xsZWN0aW9uKWFyZykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbaWR4KytdID0gY29udmVydChpLm5leHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDbGFzcy5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RWYWx1ZSA9IGFycmF5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGRlc3RDbGFzcykpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIG5ld0xpc3QgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSB0cnlpbmcgdG8gY3JlYXRlIGFuIGludGVyZmFjZSwgYnVpbGQgc29tZXRoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZXN0Q2xhc3MgPT0gQ29sbGVjdGlvbi5jbGFzcyB8fCBkZXN0Q2xhc3MgPT0gTGlzdC5jbGFzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXN0Q2xhc3MgPT0gU2V0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xpc3QgPSAoQ29sbGVjdGlvbilkZXN0Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgY29kZSBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgYnVpbGQgb25lIGZvciBzb21lIHJlYXNvbi4uLiBzbyBmb3JnZXQgaXQuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGFyZy5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdMaXN0LmFkZChBcnJheS5nZXQoYXJnLCBqKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSAoKENvbGxlY3Rpb24pYXJnKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGouaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGlzdC5hZGQoai5uZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlc3RWYWx1ZSA9IG5ld0xpc3Q7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc3RWYWx1ZSA9IGFyZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRVdGlscyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuZ2V0Q2xhc3MoKS50b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENsYXNzLnRvU3RyaW5nKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkZXN0VmFsdWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZXRCeXRlc0Zyb21TdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhdmFpbGFibGUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyZWFtLgotICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtpcy5hdmFpbGFibGUoKV07Ci0gICAgICAgIGlzLnJlYWQoYnl0ZXMpOwotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9EYXRhU291cmNlRm9ybWF0dGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0RhdGFTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgyY2E5OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0RhdGFTb3VyY2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NU291cmNlZEVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NSU1FT3V0cHV0VXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuQXR0YWNobWVudHNBZGFwdGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuRGF0YVNvdXJjZUJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwuVVJMVGVtcGxhdGluZ1V0aWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsNCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotcHVibGljIGNsYXNzIERhdGFTb3VyY2VGb3JtYXR0ZXIgaW1wbGVtZW50cyBNZXNzYWdlRm9ybWF0dGVyIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFR5cGU7DQotDQotICAgIHB1YmxpYyBEYXRhU291cmNlRm9ybWF0dGVyKFN0cmluZyBjb250ZW50VHlwZSkgew0KLSAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJGSVhNRSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgQXR0YWNobWVudHNBZGFwdGVyIGF0dGFjaG1lbnRzID0gKEF0dGFjaG1lbnRzQWRhcHRlcikgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuT1VUQk9VTkRfTUVTU0FHRV9BVFRBQ0hNRU5UUyk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInN0YXJ0IHdyaXRlVG8oKSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHMgIT0gbnVsbCAmJiAhYXR0YWNobWVudHMuaXNFbXB0eSgpKSB7DQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZSBidXNPYmplY3Q7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBidXNPYmplY3QgPSAoRGF0YVNvdXJjZSkoKERhdGFTb3VyY2VCbG9jaykoKE9NU291cmNlZEVsZW1lbnQpIG9tRWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpKS5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgTUlNRU91dHB1dFV0aWxzLndyaXRlRGF0YUhhbmRsZXJXaXRoQXR0YWNobWVudHNNZXNzYWdlKA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhSGFuZGxlcihidXNPYmplY3QpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLCANCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cywgDQotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsNCi0gICAgICAgICAgICB9IGVsc2UgeyANCi0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvbUVsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50LnNlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGZvcm1hdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShvdXRwdXRTdHJlYW0sIGZvcm1hdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImVuZCB3cml0ZVRvKCkiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgU3RyaW5nIHNvYXBBY3Rpb24pIHsNCi0gICAgICAgIEF0dGFjaG1lbnRzQWRhcHRlciBhdHRhY2htZW50cyA9IChBdHRhY2htZW50c0FkYXB0ZXIpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0Lk9VVEJPVU5EX01FU1NBR0VfQVRUQUNITUVOVFMpOw0KLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzICE9IG51bGwgJiYgIWF0dGFjaG1lbnRzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmb3JtYXQuZ2V0Q29udGVudFR5cGVGb3JTd0EoY29udGVudFR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBVUkwgZ2V0VGFyZ2V0QWRkcmVzcyhvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgVVJMIHRhcmdldFVSTCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhDQotICAgICAgICAvLyB2YWx1ZXMgYW5kIGNyZWF0ZSBhIG5ldyB0YXJnZXQgVVJMLg0KLSAgICAgICAgdGFyZ2V0VVJMID0gVVJMVGVtcGxhdGluZ1V0aWwuZ2V0VGVtcGxhdGVkVVJMKHRhcmdldFVSTCwgbWVzc2FnZUNvbnRleHQsIGZhbHNlKTsNCi0gICAgICAgIHJldHVybiB0YXJnZXRVUkw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBmb3JtYXRTT0FQQWN0aW9uKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LCBTdHJpbmcgc29hcEFjdGlvbikgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9FeGVjdXRvckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvRXhlY3V0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzUyYjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9FeGVjdXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGNsYXNzZXMgdGhhdCB3aXNoIHRvCi0gKiBwcm92aWRlIEV4ZWN1dG9yIGluc3RhbmNlcyB0byB0aGUgSkFYLVdTIHJ1bnRpbWUuIFdoZW4gdGhlIHJ1bnRpbWUgbmVlZHMgYW4KLSAqIEV4ZWN1dG9yIGluc3RhbmNlIGl0IHdpbGwgbG9vayBpbiB0aGUgRmFjdG9yeVJlZ2lzdHJ5IGZvciBhbiBpbXBsZW1lbnRhdGlvbgotICogb2YgdGhpcyBmYWN0b3J5IGFuZCByZXRyaWV2ZSB0aGUgaW5zdGFuY2UuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4ZWN1dG9yRmFjdG9yeSB7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX0VYRUNVVE9SID0gMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVkVSX0VYRUNVVE9SID0gMTsKLSAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcmV0dXJuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3JJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gZXhlY3V0b3JUeXBlCi0gICAgICAgICAqIEByZXR1cm4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBFeGVjdXRvciBnZXRFeGVjdXRvckluc3RhbmNlKGludCBleGVjdXRvclR5cGUpOwotCQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KQVhXU0V4ZWN1dG9yRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KQVhXU0V4ZWN1dG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYyOTRiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSkFYV1NFeGVjdXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotCi0vKioKLSAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEV4ZWN1dG9yRmFjdG9yeSBpbnRlcmZhY2UuIEl0IGlzIHVzZWQKLSAqIHRvIHByb3ZpZGUgYW4gRXhlY3V0b3IgdG8gYSBTZXJ2aWNlRGVsZWdhdGUgaW5zdGFuY2UuIFRoZSBFeGVjdXRvciBpbnN0YW5jZQotICogd2lsbCBiZSBiYWNrZWQgYnkgdGhlIEpBWFdTVGhyZWFkRmFjdG9yeS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKQVhXU0V4ZWN1dG9yRmFjdG9yeSBpbXBsZW1lbnRzIEV4ZWN1dG9yRmFjdG9yeSB7Ci0KLSAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3JJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMywgbmV3IEpBWFdTVGhyZWFkRmFjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3JJbnN0YW5jZShpbnQgZXhlY3V0b3JUeXBlKSB7Ci0gICAgICAgIHJldHVybiBnZXRFeGVjdXRvckluc3RhbmNlKCk7Ci0gICAgfQotICAgICAgICAKLQkKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KQVhXU1RocmVhZEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSkFYV1NUaHJlYWRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzkyN2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KQVhXU1RocmVhZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHRocmVhZHMgaW4gdGhlIFRocmVhZFBvb2wgRXhlY3V0b3IuICBXZSBwcm92aWRlIGEgZmFjdG9yeSBzbyAKLSAqIHRoZSB0aHJlYWRzIGNhbiBiZSBzZXQgYXMgZGFlbW9uIHRocmVhZHMgc28gdGhhdCB0aGV5IGRvIG5vdCBwcmV2ZW50IHRoZSBKVk0gZnJvbSAKLSAqIGV4aXRpbmcgbm9ybWFsbHkgd2hlbiB0aGUgbWFpbiBjbGllbnQgdGhyZWFkIGlzIGZpbmlzaGVkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEpBWFdTVGhyZWFkRmFjdG9yeSBpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhKQVhXU1RocmVhZEZhY3RvcnkuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGludCBncm91cE51bWJlciA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgdGhyZWFkTnVtYmVyID0gMDsKLSAgICAvLyBXZSBwdXQgdGhlIHRocmVhZHMgaW50byBhIHVuaXF1ZSB0aHJlYWQgZ3JvdXAgb25seSBmb3IgZWFzZSBvZiBpZGVudGlmeWluZyB0aGVtCi0gICAgcHJpdmF0ZSBUaHJlYWRHcm91cCB0aHJlYWRHcm91cCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChmaW5hbCBSdW5uYWJsZSByKSB7Ci0gICAgICAgIGlmICh0aHJlYWRHcm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRocmVhZEdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChUaHJlYWRHcm91cCkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGhyZWFkR3JvdXAoIkpBWC1XUyBEZWZhdWx0IEV4ZWN1dG9yIEdyb3VwICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdyb3VwTnVtYmVyKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocmVhZE51bWJlcisrOwotICAgICAgICBUaHJlYWQgcmV0dXJuVGhyZWFkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVyblRocmVhZCA9IChUaHJlYWQpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQgbmV3VGhyZWFkID0gbmV3IFRocmVhZCh0aHJlYWRHcm91cCwgcik7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1RocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdUaHJlYWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5UaHJlYWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KYXZhVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvSmF2YVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzFiMmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KYXZhVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKiBDb21tb24gSmF2YSBVdGlsaXRlcyAqLwotcHVibGljIGNsYXNzIEphdmFVdGlscyBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEphdmFVdGlscy5jbGFzcyk7Ci0gICAgCi0gICAgLyoqIFByaXZhdGUgQ29uc3RydWN0b3IuLi5BbGwgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSBzdGF0aWMgKi8KLSAgICBwcml2YXRlIEphdmFVdGlscygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lc3BhY2UgMiBQYWNrYWdlIGFsZ29yaXRobSBhcyBkZWZpbmVkIGJ5IHRoZSBKQVhCIFNwZWNpZmljYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBOYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNldGluZyBOYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc3RlcHMgY29ycmVzcG9uZCB0byBzdGVwcyBkZXNjcmliZWQgaW4gdGhlIEpBWEIgU3BlY2lmaWNhdGlvbgotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJuYW1lc3BhY2UgKCIgK25hbWVzcGFjZSArIikiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTdGVwIDE6IFNjYW4gb2ZmIHRoZSBob3N0IG5hbWUKLSAgICAgICAgU3RyaW5nIGhvc3RuYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGhvc3RuYW1lID0gdXJsLmdldEhvc3QoKTsKLSAgICAgICAgICAgIHBhdGggPSB1cmwuZ2V0UGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gTm8gRkZEQyBjb2RlIG5lZWRlZAotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgIC8vIEJyYWluLWRlYWQgY29kZSB0byBza2lwIG92ZXIgdGhlIHByb3RvY29sCi0gICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBuYW1lc3BhY2Uuc3Vic3RyaW5nKG5hbWVzcGFjZS5pbmRleE9mKCI6IikgKyAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBuYW1lc3BhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImhvc3RuYW1lICgiICtob3N0bmFtZSArIikiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicGF0aCAoIiArcGF0aCArIikiKTsKLSAgICAgICAgfQotICAgICAgICAKLQotICAgICAgICAvLyBTdGVwIDM6IFRva2VuaXplIHRoZSBob3N0IG5hbWUgdXNpbmcgIjoiIGFuZCAiLyIKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihob3N0bmFtZSwgIjovIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gd29yZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAvL1JlYWQgSG9zdG5hbWUgZmlyc3QuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBzdCAhPSBudWxsICYmIGkgPCBzdC5jb3VudFRva2VucygpOyArK2kpIHsKLSAgICAgICAgICAgIHdvcmRMaXN0LmFkZChzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9SZWFkIHJlc3QgT2YgdGhlIHBhdGggbm93Ci0gICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXRoc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgsICIvIik7Ci0gICAgICAgICAgICB3aGlsZSAocGF0aHN0ICE9IG51bGwgJiYgcGF0aHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIHdvcmRMaXN0LmFkZChwYXRoc3QubmV4dFRva2VuKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHdvcmRzID0gd29yZExpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQotICAgICAgICAvLyBOb3cgZG8gc3RlcCAyOiBTdHJpcCBvZmYgdGhlIHRyYWlsaW5nICIuIiAoaS5lLiBzdHJpcCBvZmYgLmh0bWwpCi0gICAgICAgIGlmICh3b3JkcyAhPSBudWxsICYmIHdvcmRzLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0V29yZCA9IHdvcmRzW3dvcmRzLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgaW50IGluZGV4ID0gbGFzdFdvcmQubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICB3b3Jkc1t3b3Jkcy5sZW5ndGggLSAxXSA9IGxhc3RXb3JkLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDQ6IFVuZXNjYXBlIGVhY2ggZXNjYXBlIHNlcXVlbmNlCi0gICAgICAgIC8vIFRPRE8gSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZS4KLQotICAgICAgICAvLyBTdGVwIDU6IElmIHByb3RvY29sIGlzIHVybiwgcmVwbGFjZSAtIHdpdGggLiBpbiB0aGUgZmlyc3Qgd29yZAotICAgICAgICBpZiAobmFtZXNwYWNlLnN0YXJ0c1dpdGgoInVybjoiKSkgewotICAgICAgICAgICAgd29yZHNbMF0gPSByZXBsYWNlKHdvcmRzWzBdLCAiLSIsICIuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDY6IFRva2VuaXplIHRoZSBmaXJzdCB3b3JkIHdpdGggIi4iIGFuZCByZXZlcnNlIHRoZSBvcmRlci4gKHRoZSB3d3cgaXMgYWxzbyByZW1vdmVkKS4KLSAgICAgICAgLy8gVE9ETyBUaGlzIGlzIG5vdCBleGFjdGx5IGVxdWl2YWxlbnQgdG8gdGhlIEpBWEIgUnVsZS4KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAod29yZHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0MiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIod29yZHNbMF0sICIuIik7Ci0gICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKHN0Mi5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHN0cmluZ3Mgc28gdGhleSBhcmUgaW4gcmV2ZXJzZSBvcmRlcgotICAgICAgICAgICAgICAgIGxpc3QuYWRkKDAsIHN0Mi5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFJlbW92ZSB3d3cKLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIGxhc3QgPSBsaXN0LmdldChsaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaWYgKGxhc3QuZXF1YWxzKCJ3d3ciKSkgewotICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm93IGVhY2ggb2Ygd29yZHMgaXMgcmVwcmVzZW50ZWQgYnkgbGlzdAotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZCh3b3Jkc1tpXSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGVwIDc6IGxvd2VyY2FzZSBlYWNoIHdvcmQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd29yZCA9IGxpc3QucmVtb3ZlKGkpOwotICAgICAgICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKGksIHdvcmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3RlcCA4OiBtYWtlIGludG8gYW5kIGFuIGFwcHJvcHJpYXRlIGphdmEgd29yZAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gbGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIC8vIDhhOiBDb252ZXJ0IHNwZWNpYWwgY2hhcmFjdGVycyB0byB1bmRlcnNjb3JlCi0gICAgICAgICAgICAvLyBDb252ZXJ0IG5vbi1qYXZhIHdvcmRzIHRvIHVuZGVyc2NvcmUuCi0gICAgICAgICAgICAvLyBUT0RPOiBOZWVkIHRvIGRvIHRoaXMgZm9yIGFsbCBjaGFycy4ubm90IGp1c3QgaHlwaGVucwotICAgICAgICAgICAgd29yZCA9IHJlcGxhY2Uod29yZCwgIi0iLCAiXyIpOwotCi0gICAgICAgICAgICAvLyA4YjogQXBwZW5kIF8gdG8gamF2YSBrZXl3b3JkcwotICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc0phdmFLZXl3b3JkKHdvcmQpKSB7Ci0gICAgICAgICAgICAgICAgd29yZCA9IHdvcmQgKyAiXyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyA4YzogcHJlcGVuZCBfIGlmIGZpcnN0IGNoYXJhY3RlciBjYW5ub3QgYmUgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGphdmEgaWRlbnRpZmllcgotICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHdvcmQuY2hhckF0KDApKSkgewotICAgICAgICAgICAgICAgIHdvcmQgPSAiXyIgKyB3b3JkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsaXN0LnNldChpLCB3b3JkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN0ZXAgOTogQ29uY2F0ZW5hdGUgYW5kIHJldHVybgotICAgICAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgIi4iICsgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJwYWNrYWdlIG5hbWUgKCIgK25hbWUgKyIpIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RhY2sgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhY2tUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN0YWNrVG9TdHJpbmcobmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIG9mIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFja1RvU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgamF2YS5pby5CdWZmZXJlZFdyaXRlcihzdyk7Ci0gICAgICAgIGphdmEuaW8uUHJpbnRXcml0ZXIgcHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihidyk7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKLSAgICAgICAgcHcuY2xvc2UoKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotICAgICAgICAvLyBKdW1wIHBhc3QgdGhlIHRocm93YWJsZQotICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCJhdCIpKTsKLSAgICAgICAgdGV4dCA9IHJlcGxhY2UodGV4dCwgImF0ICIsICJERUJVR19GUkFNRSA9ICIpOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IGNoZWNrZWQgZXhjZXB0aW9uCi0gICAgICogQHBhcmFtIHRocm93YWJsZSBUaHJvd2FibGUKLSAgICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZAotICAgICAqIEByZXR1cm4gQ2xhc3Mgb2YgdGhlIGNoZWNrZWQgZXhjZXB0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldENoZWNrZWRFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSwgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzW10gZXhjZXB0aW9ucyA9IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICBpZiAoZXhjZXB0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8IGV4Y2VwdGlvbnMubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbnNbaV0uaXNBc3NpZ25hYmxlRnJvbSh0aHJvd2FibGUuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbnNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIFN0cmluZyB0byBhIFVSSSwgaGFuZGxpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBTdHJpbmcgc3VjaCBhcwotICAgICAqIHNwYWNlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aFN0cmluZyBUaGUgU3RyaW5nIHRvIGJlIGNvbnZlcnRlZCB0byBhIFVSSQotICAgICAqIEByZXR1cm4gYSBVUkkgb3IgbnVsbCBpZiB0aGUgU3RyaW5nIGNhbid0IGJlIGNvbnZlcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHBhdGhTdHJpbmcpIHsKLSAgICAgICAgVVJJIHBhdGhVUkkgPSBudWxsOwotICAgICAgICBpZiAocGF0aFN0cmluZyA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXRoU3RyaW5nKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXRoIHN0cmluZyBhcmd1bWVudCBpcyBpbnZhbGlkIFsiICsgcGF0aFN0cmluZyArICJdOyByZXR1cm5pbmcgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGF0aFVSSSA9IG5ldyBVUkkocGF0aFN0cmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleDEpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGNyZWF0ZSBVUkkgZnJvbSBbIiArIHBhdGhTdHJpbmcgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIl0sIHRyeWluZyBhbHRlcm5hdGl2ZSBhcHByb2FjaCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBVUkkgY3JlYXRpb24gcmVxdWlyZXMgc3BlY2lhbCBjaGFyYWN0ZXJzLCBzdWNoIGFzIHNwYWNlcywgYmUgZXNjYXBlZCBvcgotICAgICAgICAgICAgICogY29udmVydGVkLiAgVGhlIDUgYXJndW1lbnQgY29uc3R1Y3RvciB3aWxsIGRvIHRoYXQgZm9yIHVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhdGhVUkkgPSBuZXcgVVJJKG51bGwsIG51bGwsIHBhdGhTdHJpbmcsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4MikgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIlVuYWJsZSB0byBjcmVhdGUgVVJJIHVzaW5nIGFsdGVybmF0aXZlIGFwcHJvYWNoOyByZXR1cm5pbmcgbnVsbC4gIEV4Y2VwdGlvbiBjYXVnaHQgZHVyaW5nIGluaXRhbCBhdHRlbXB0OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGV4MSkpOwotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkV4Y2VwdGlvbiBjYXVnaHQgZHVyaW5nIGFsdGVybmV0IGF0dGVtdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEphdmFVdGlscy5zdGFja1RvU3RyaW5nKGV4MikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZXgyLnRvU3RyaW5nKCksIGV4Mik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGhVUkk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1Byb3BlcnR5RGVzY3JpcHRvclBsdXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmYzQ1My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1Byb3BlcnR5RGVzY3JpcHRvclBsdXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGwuSkFYQldyYXBwZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmEuYmVhbnMuSW5kZXhlZFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBBIFByb3BlcnR5RGVzY3JpcHRvciBwcm92aWRlcyBhY2Vzc3MgdG8gYSBiZWFuIHByb3BlcnR5LiAgVmFsdWVzIGNhbiBiZSBxdWVyaWVkL2NoYW5nZWQgdXNpbmcgdGhlCi0gKiByZWFkIGFuZCB3cml0ZXIgbWV0aG9kcyBvZiB0aGUgUHJvcGVydHlEZXNjcmlwdG9yLgotICogPHAvPgotICogQSBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIG9iamVjdCB3cmFwcyBhIFByb3BlcnR5RGVzY3JpcHRvciBhbmQgc3VwcGxpZXMgZW5oYW5jZWQgc2V0L2dldCBtZXRob2RzCi0gKiB0aGF0IG1hdGNoIEpBWEIgc2VtYW50aXMuCi0gKiA8cC8+Ci0gKiBGb3IgZXhhbXBsZSwgdGhlIHNldCguLikgbWV0aG9kIGlzIHNtYXJ0IGVub3VnaCB0byBhZGQgbGlzdHMsIGFycmF5cyBhbmQgYXRvbWljIHZhbHVlcyBvbiBKQVhCCi0gKiBiZWFucy4KLSAqIDxwLz4KLSAqIFRoZSBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIG9iamVjdCBhbHNvIHN0b3JlcyB0aGUgeG1sTmFtZSBvZiB0aGUgcHJvcGVydHkuCi0gKgotICogQFNlZSBYTUxSb290RWxlbWVudFV0aWwuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yTWFwICwgd2hpY2ggY3JlYXRlcyB0aGUgUHJvcGVydHlEZXNjcmlwdG9yUGx1cwotICogb2JqZWN0cwotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyB7Ci0gICAgUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgUU5hbWUgeG1sTmFtZSA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb3BlcnR5RGVzY3JpcHRvclBsdXMuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRU5BQkxFRCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogUGFja2FnZSBwcm90ZWN0ZWQgY29uc3RydWN0b3IuICBPbmx5IGNyZWF0ZWQgYnkgWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcAotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZQotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAgICogQHNlZSBYTUxSb290RWxlbWVudFV0aWwuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yTWFwCi0gICAgICovCi0gICAgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyhQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciwgUU5hbWUgeG1sTmFtZSkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhY2thZ2UgcHJvdGVjdGVkIGNvbnN0cnVjdG9yLiAgT25seSBjcmVhdGVkIGJ5IFhNTFJvb3RFbGVtZW50VXRpbC5jcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JNYXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcgotICAgICAqIEBzZWUgWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcAotICAgICAqLwotICAgIFByb3BlcnR5RGVzY3JpcHRvclBsdXMoUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyB4bWxOYW1lKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIHRoaXMueG1sTmFtZSA9IG5ldyBRTmFtZSgiIiwgeG1sTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4geG1sbmFtZSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFhtbFFOYW1lKCkgewotICAgICAgICByZXR1cm4geG1sTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEByZXR1cm4gcHJvcGVydHkgdHlwZSAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRQcm9wZXJ0eVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIHByb3BlcnR5IG5hbWUgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0QmVhbgotICAgICAqIEByZXR1cm4gT2JqZWN0IGZvciB0aGlzIHByb3BlcnR5IG9yIG51bGwKLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3QgdGFyZ2V0QmVhbikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgaWYoZGVzY3JpcHRvciA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwRGVzY3JFcnIiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgICAgICBpZihtZXRob2QgPT0gbnVsbCAmJiBkZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpID09IEJvb2xlYW4uY2xhc3MpewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZihwcm9wZXJ0eU5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gImlzIjsKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUgKyAoKHByb3BlcnR5TmFtZS5sZW5ndGgoKT4wKT9wcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKToiIik7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lICsgKChwcm9wZXJ0eU5hbWUubGVuZ3RoKCkgPiAxKT9wcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOiIiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXRob2QgTmFtZSA9IiArbWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHRhcmdldEJlYW4uZ2V0Q2xhc3MoKS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgfWNhdGNoKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNZXRob2Qgbm90IGZvdW5kIiArIG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKG1ldGhvZCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwRGVzY3JFcnIyIix0YXJnZXRCZWFuLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcmV0ID0gbWV0aG9kLmludm9rZSh0YXJnZXRCZWFuLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCAmJiBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpID09IEpBWEJFbGVtZW50LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gKChKQVhCRWxlbWVudCkgcmV0KS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEJlYW4KLSAgICAgKiBAcGFyYW0gcHJvcFZhbHVlCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldChPYmplY3QgdGFyZ2V0QmVhbiwgT2JqZWN0IHByb3BWYWx1ZSwgQ2xhc3MgZGNsQ2xhc3MpCi0gICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSkFYQldyYXBwZXJFeGNlcHRpb24gewotCi0gICAgICAgIE1ldGhvZCB3cml0ZU1ldGhvZCAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTm8gc2V0IG9jY3VycyBpZiB0aGUgdmFsdWUgaXMgbnVsbAotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUaGVyZSBhcmUgMyBkaWZmZXJlbnQgdHlwZXMgb2Ygc2V0dGVycyB0aGF0IGNhbiBvY2N1ci4KLSAgICAgICAgICAgIC8vIDEpIE5vcm1hbCBBdHRvbWljIFNldHRlciA6IHNldEZvbyh0eXBlKQotICAgICAgICAgICAgLy8gMikgSW5kZXhlZCBBcnJheSBTZXR0ZXIgOiBzZXRGb28odHlwZVtdKQotICAgICAgICAgICAgLy8gMykgTm8gU2V0dGVyIGNhc2UgaWYgdGhlIHByb3BlcnR5IGlzIGEgTGlzdDxUPi4KLQotICAgICAgICAgICAgd3JpdGVNZXRob2QgPSBkZXNjcmlwdG9yLmdldFdyaXRlTWV0aG9kKCk7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICAvLyBTZXQgZm9yIGluZGV4ZWQgIFRbXQotICAgICAgICAgICAgICAgIHNldEluZGV4ZWRBcnJheSh0YXJnZXRCZWFuLCBwcm9wVmFsdWUsIHdyaXRlTWV0aG9kKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3JpdGVNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFNldCBmb3IgTGlzdDxUPgotICAgICAgICAgICAgICAgIHNldExpc3QodGFyZ2V0QmVhbiwgcHJvcFZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKSA9PSBKQVhCRWxlbWVudC5jbGFzcykgewotICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGRjbENsYXNzIT1udWxsID8gZGNsQ2xhc3MgOiBwcm9wVmFsdWUuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgSkFYQkVsZW1lbnQgZWxlbWVudCA9IG5ldyBKQVhCRWxlbWVudCh4bWxOYW1lLCBjbGF6eiwgcHJvcFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0QXRvbWljKHRhcmdldEJlYW4sIGVsZW1lbnQsIHdyaXRlTWV0aG9kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlCi0gICAgICAgICAgICAgICAgc2V0QXRvbWljKHRhcmdldEJlYW4sIHByb3BWYWx1ZSwgd3JpdGVNZXRob2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcENsYXNzID0gcHJvcFZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gc2V0IGEgcHJvcGVydHkgb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJlYW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIHNldHRlciBtZXRob2QgaXMgIiArIHdyaXRlTWV0aG9kICk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgY2xhc3Mgb2YgdGhlIGFyZ3VtZW50IGlzIDoiICtwcm9wQ2xhc3MpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIFByb3BlcnR5RGVzY3JpcHRvciBpczogIiArIHRoaXMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgZXhjZXB0aW9uIGlzOiAiICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvbnRvIHRhcmdldEJlYW4gdXNpbmcgdGhlIHdyaXRlTWV0aG9kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0QmVhbgotICAgICAqIEBwYXJhbSBwcm9wVmFsdWUKLSAgICAgKiBAcGFyYW0gd3JpdGVNZXRob2QgKHNldChUKSkKLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEF0b21pYyhPYmplY3QgdGFyZ2V0QmVhbiwgT2JqZWN0IHByb3BWYWx1ZSwgTWV0aG9kIHdyaXRlTWV0aG9kKSAKLSAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSkFYQldyYXBwZXJFeGNlcHRpb24gewotICAgICAgICAvLyBKQVhCIHByb3ZpZGVzIHNldHRlcnMgZm9yIGF0b21pYyB2YWx1ZS4KLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2UKLSAgICAgICAgCU9iamVjdFtdIFNJTkdMRV9QQVJBTSA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgICAgICBTSU5HTEVfUEFSQU1bMF0gPSBwcm9wVmFsdWU7Ci0gICAgICAgICAgICB3cml0ZU1ldGhvZC5pbnZva2UodGFyZ2V0QmVhbiwgU0lOR0xFX1BBUkFNKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENsYXNzW10gcGFyYW1UeXBlcyA9IHdyaXRlTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKHBhcmFtVHlwZXMgIT1udWxsICYmIHBhcmFtVHlwZXMubGVuZ3RoID09MSl7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1swXTsKLSAgICAgICAgICAgICAgICBpZihwYXJhbVR5cGUuaXNQcmltaXRpdmUoKSAmJiBwcm9wVmFsdWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIC8vSWdub3JpbmcgbnVsbCB2YWx1ZSBmb3IgcHJpbWl0aXZlIHR5cGUsIHRoaXMgY291bGQgcG90ZW50aWFsbHkgYmUgdGhlIHdheSBvZiBhIGN1c3RvbWVyIGluZGljYXRpbmcgdG8gc2V0Ci0gICAgICAgICAgICAgICAgICAgIC8vZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZCBpbiBKQVhCT2JqZWN0L3htbFNjaGVtYS4KLSAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfRU5BQkxFRCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIklnbm9yaW5nIG51bGwgdmFsdWUgZm9yIHByaW1pdGl2ZSB0eXBlLCB0aGlzIGlzIHRoZSB3YXkgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGRlZmluZWQgaW4gSkFYQk9iamVjdC94bWxTY2hlbWEuIGZvciBwcmltaXRpdmUgdHlwZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgdXNpbmcgdGhlIGluZGV4ZWQgYXJyYXkgc2V0dGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0QmVhbgotICAgICAqIEBwYXJhbSBwcm9wVmFsdWUKLSAgICAgKiBAcGFyYW0gd3JpdGVNZXRob2Qgc2V0KFRbXSkKLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEluZGV4ZWRBcnJheShPYmplY3QgdGFyZ2V0QmVhbiwgT2JqZWN0IHByb3BWYWx1ZSwgTWV0aG9kIHdyaXRlTWV0aG9kKQotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLQotICAgICAgICBDbGFzcyBwYXJhbVR5cGUgPSB3cml0ZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBhc0FycmF5KHByb3BWYWx1ZSwgcGFyYW1UeXBlKTsKLSAgICAgICAgLy8gSkFYQiBwcm92aWRlcyBzZXR0ZXJzIGZvciBhdG9taWMgdmFsdWUuCi0gICAgICAgIE9iamVjdFtdIFNJTkdMRV9QQVJBTSA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgIFNJTkdMRV9QQVJBTVswXSA9dmFsdWU7Ci0gICAgICAgIAotICAgICAgICB3cml0ZU1ldGhvZC5pbnZva2UodGFyZ2V0QmVhbiwgU0lOR0xFX1BBUkFNKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgY29sbGVjdGlvbiBjYXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEJlYW4KLSAgICAgKiBAcGFyYW0gcHJvcFZhbHVlCi0gICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRMaXN0KE9iamVjdCB0YXJnZXRCZWFuLCBPYmplY3QgcHJvcFZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRm9yIHRoZSBMaXN0PFQ+IGNhc2UsIHRoZXJlIGlzIG5vIHNldHRlci4gCi0gICAgICAgIC8vIFlvdSBhcmUgc3VwcG9zZWQgdG8gdXNlIHRoZSBnZXR0ZXIgdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgY29sbGVjdGlvbiBhbmQgdGhlbiBhZGQgdGhlIGNvbGxlY3Rpb24KLQotICAgICAgICBDb2xsZWN0aW9uIHZhbHVlID0gYXNDb2xsZWN0aW9uKHByb3BWYWx1ZSwgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKSk7Ci0gICAgICAgIENvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKWdldCh0YXJnZXRCZWFuKTsKLQotICAgICAgICAvLyBOb3cgYWRkIG91ciBvdXIgb2JqZWN0IHRvIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKLSAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZEFsbCh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvcFZhbHVlCi0gICAgICogQHBhcmFtIGRlc3RUeXBlCi0gICAgICogQHJldHVybiBwcm9wVmFsdWUgYXMgYSBDb2xsZWN0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBhc0NvbGxlY3Rpb24oT2JqZWN0IHByb3BWYWx1ZSwgQ2xhc3MgZGVzdFR5cGUpIHsKLSAgICAgICAgLy8gVE9ETyBNaXNzaW5nIGZ1bmN0aW9uCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIG9iamVjdCBpbnRvIGFuIGVxdWl2YWxlbnQgb2JqZWN0IHRoYXQgaXMgYSBjb2xsZWN0aW9uCi0gICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShwcm9wVmFsdWUsIGRlc3RUeXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uKUNvbnZlcnRVdGlscy5jb252ZXJ0KHByb3BWYWx1ZSwgZGVzdFR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG9iamVjdENsYXNzID0gKHByb3BWYWx1ZSA9PSBudWxsKSA/ICJudWxsIiA6IHByb3BWYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnZlcnRQcm9ibGVtIiwgb2JqZWN0Q2xhc3MsIGRlc3RUeXBlLmdldE5hbWUoKSkpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvcFZhbHVlCi0gICAgICogQHBhcmFtIGRlc3RUeXBlICBUW10KLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGNvbXBvbmVudCB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGFzQXJyYXkoT2JqZWN0IHByb3BWYWx1ZSwgQ2xhc3MgZGVzdFR5cGUpIHsKLSAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKHByb3BWYWx1ZSwgZGVzdFR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29udmVydFV0aWxzLmNvbnZlcnQocHJvcFZhbHVlLCBkZXN0VHlwZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0Q2xhc3MgPSAocHJvcFZhbHVlID09IG51bGwpID8gIm51bGwiIDogcHJvcFZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY29udmVydFByb2JsZW0iLCBvYmplY3RDbGFzcywgZGVzdFR5cGUuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICJQcm9wZXJ0eURlc2NyaXB0b3JQbHVzWyI7Ci0gICAgICAgIHZhbHVlICs9ICIgbmFtZT0iICsgdGhpcy5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgICAgdmFsdWUgKz0gIiB0eXBlPSIgKyB0aGlzLmdldFByb3BlcnR5VHlwZSgpLmdldE5hbWUoKTsKLSAgICAgICAgdmFsdWUgKz0gIiBwcm9wZXJ0eURlY3JpcHRvcj0iICsgdGhpcy5kZXNjcmlwdG9yOwotICAgICAgICByZXR1cm4gdmFsdWUgKyAiXSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9TQUFKRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9TQUFKRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODM4M2UyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU0FBSkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBQcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGNvbnN0cnVjdCBhIFNPQVAgMS4xIG9yIFNPQVAgMS4yIFNBQUogTWVzc2FnZUZhY3Rvcnkgb3IKLSAqIFNPQVBGYWN0b3J5LiBUaGUgY29kZSB1c2VzIHJlZmxlY3Rpb247IHRodXMsIHdoZW4gQXhpczIgdXBncmFkZXMgdG8gU0FBSiAxLjMsIG5vIGNoYW5nZXMgd2lsbCBiZQotICogbmVkZWQgdG8gdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFNBQUpGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfRU5WX05TID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEyX0VOVl9OUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOwotCi0gICAgLy8gUHJvdG9jb2wgTmFtZXMgcGVyIHRoZSBTQUFKIDEuMyBzcGVjaWZpY2F0aW9uLgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfMV8xX1BST1RPQ09MID0gIlNPQVAgMS4xIFByb3RvY29sIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQXzFfMl9QUk9UT0NPTCA9ICJTT0FQIDEuMiBQcm90b2NvbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19QUk9UT0NPTCA9ICJEeW5hbWljIFByb3RvY29sIjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBTT0FQRmFjdG9yeSB1c2luZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBlbnZlbG9wZSBuYW1lc3BhY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTT0FQRmFjdG9yeSBjcmVhdGVTT0FQRmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlKQotICAgICAgICAgICAgdGhyb3dzIFdlYlNlcnZpY2VFeGNlcHRpb24sIFNPQVBFeGNlcHRpb24gewotICAgICAgICBNZXRob2QgbSA9IGdldFNPQVBGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IG51bGw7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMV9FTlZfTlMpKSB7Ci0gICAgICAgICAgICAgICAgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU09BUDEyV2l0aFNBQUoxMkVyciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IERZTkFNSUNfUFJPVE9DT0w7Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyhTT0FQMTFfRU5WX05TKSkgewotICAgICAgICAgICAgICAgIHByb3RvY29sID0gU09BUF8xXzFfUFJPVE9DT0w7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZS5lcXVhbHMoU09BUDEyX0VOVl9OUykpIHsKLSAgICAgICAgICAgICAgICBwcm90b2NvbCA9IFNPQVBfMV8yX1BST1RPQ09MOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZiA9IChTT0FQRmFjdG9yeSltLmludm9rZShudWxsLCBuZXcgT2JqZWN0W10geyBwcm90b2NvbCB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Y7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIE1lc3NhZ2VGYWN0b3J5IHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGVudmVsb3BlIG5hbWVzcGFjZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VGYWN0b3J5IGNyZWF0ZU1lc3NhZ2VGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiwgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1ldGhvZCBtID0gZ2V0TWVzc2FnZUZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kKCk7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gbnVsbDsKLSAgICAgICAgaWYgKG0gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoU09BUDExX0VOVl9OUykpIHsKLSAgICAgICAgICAgICAgICBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJTT0FQMTJXaXRoU0FBSjEyRXJyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gRFlOQU1JQ19QUk9UT0NPTDsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFNPQVAxMV9FTlZfTlMpKSB7Ci0gICAgICAgICAgICAgICAgcHJvdG9jb2wgPSBTT0FQXzFfMV9QUk9UT0NPTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlLmVxdWFscyhTT0FQMTJfRU5WX05TKSkgewotICAgICAgICAgICAgICAgIHByb3RvY29sID0gU09BUF8xXzJfUFJPVE9DT0w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1mID0gKE1lc3NhZ2VGYWN0b3J5KW0uaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7IHByb3RvY29sIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgbWVzc2FnZUZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFNBQUogMS4zIGhhcyBhIG5ld0luc3RhbmNlIG1ldGhvZCB0aGF0IGhhcyBhIHByb3RvY29sIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbmV3SW5zdGFuY2UoU3RyaW5nKSBtZXRob2QgaWYgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldE1lc3NhZ2VGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCgpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2VGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeS5jbGFzcy5nZXRNZXRob2QoIm5ld0luc3RhbmNlIiwgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gTWlnaHQgd2FudCB0byBsb2cgdGhpcy4KLSAgICAgICAgICAgICAgICAvLyBGbG93IHRvIGhlcmUgaW5kaWNhdGVzIHRoYXQgdGhlIGluc3RhbGxlZCBTQUFKIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdmVyc2lvbiAxLjMKLSAgICAgICAgICAgICAgICBtZXNzYWdlRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIHNvYXBGYWN0b3J5TmV3SW5zdGFuY2VQcm90b2NvbE1ldGhvZCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBTQUFKIDEuMyBoYXMgYSBuZXdJbnN0YW5jZSBtZXRob2QgdGhhdCBoYXMgYSBwcm90b2NvbCBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5ld0luc3RhbmNlKFN0cmluZykgbWV0aG9kIGlmIGF2YWlsYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRTT0FQRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QoKSB7Ci0gICAgICAgIGlmIChzb2FwRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeU5ld0luc3RhbmNlUHJvdG9jb2xNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhY3RvcnkuY2xhc3MuZ2V0TWV0aG9kKCJuZXdJbnN0YW5jZSIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzIH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIE1pZ2h0IHdhbnQgdG8gbG9nIHRoaXMuCi0gICAgICAgICAgICAgICAgLy8gRmxvdyB0byBoZXJlIGluZGljYXRlcyB0aGF0IHRoZSBpbnN0YWxsZWQgU0FBSiBtb2RlbCBkb2VzIG5vdCBzdXBwb3J0IHZlcnNpb24gMS4zCi0gICAgICAgICAgICAgICAgc29hcEZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEZhY3RvcnlOZXdJbnN0YW5jZVByb3RvY29sTWV0aG9kOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1NpbmdsZVRocmVhZGVkRXhlY3V0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU2luZ2xlVGhyZWFkZWRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmZiZWRlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvU2luZ2xlVGhyZWFkZWRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsNCi0NCi0vKioNCi0gKiBBIHNpbXBsZSBFeGVjdXRvciBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IGNyZWF0ZSBhIG5ldyB0aHJlYWQgDQotICogZm9yIHByb2Nlc3Npbmcgd29yaywgYnV0IGp1c3QgYm9ycm93cyB0aGUgY3VycmVudCB0aHJlYWQuDQotICovDQotcHVibGljIGNsYXNzIFNpbmdsZVRocmVhZGVkRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNpbmdsZVRocmVhZGVkRXhlY3V0b3IuY2xhc3MpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBjb21tYW5kKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIkpBWC1XUyB3b3JrIG9uIFNpbmdsZVRocmVhZGVkRXhlY3RvciBzdGFydGVkLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2luZ2xlVGhyZWFkZWRFeGVjdXRvckVycjEiKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgY29tbWFuZC5ydW4oKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJKQVgtV1Mgd29yayBvbiBTaW5nbGVUaHJlYWRlZEV4ZWN0dW9yIGNvbXBsZXRlLiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvWE1MUm9vdEVsZW1lbnRVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1hNTFJvb3RFbGVtZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjhhMDkxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvWE1MUm9vdEVsZW1lbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW1WYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MUm9vdEVsZW1lbnRVdGlsIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxSb290RWxlbWVudFV0aWwuY2xhc3MpOwotCi0gICAgLyoqIENvbnN0cnVjdG9yIGlzIGludGVudGlvbmFsbHkgcHJpdmF0ZS4gIFRoaXMgY2xhc3Mgb25seSBwcm92aWRlcyBzdGF0aWMgdXRpbGl0eSBtZXRob2RzICovCi0gICAgcHJpdmF0ZSBYTUxSb290RWxlbWVudFV0aWwoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xhenoKLSAgICAgKiBAcmV0dXJuIG5hbWVzcGFjZSBvZiByb290IGVsZW1lbnQgcW5hbWUgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGEKLSAgICAgKiAgICAgICAgIHJvb3QgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0WG1sUm9vdEVsZW1lbnRRTmFtZUZyb21PYmplY3QoT2JqZWN0IG9iaikgewotCi0gICAgICAgIC8vIEEgSkFYQkVsZW1lbnQgc3RvcmVzIGl0cyBuYW1lCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBKQVhCRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuICgoSkFYQkVsZW1lbnQpb2JqKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyBjbGF6eiA9IChvYmogaW5zdGFuY2VvZiBqYXZhLmxhbmcuQ2xhc3MpID8gKENsYXNzKW9iaiA6IG9iai5nZXRDbGFzcygpOwotICAgICAgICByZXR1cm4gZ2V0WG1sUm9vdEVsZW1lbnRRTmFtZShjbGF6eik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBuYW1lc3BhY2Ugb2Ygcm9vdCBlbGVtZW50IHFuYW1lIG9yIG51bGwgaWYgdGhpcyBpcyBub3Qgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhCi0gICAgICogICAgICAgICByb290IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFhtbFJvb3RFbGVtZW50UU5hbWUoQ2xhc3MgY2xhenopIHsKLQotICAgICAgICAvLyBTZWUgaWYgdGhlIG9iamVjdCByZXByZXNlbnRzIGEgcm9vdCBlbGVtZW50Ci0gICAgICAgIFhtbFJvb3RFbGVtZW50IHJvb3QgPSAoWG1sUm9vdEVsZW1lbnQpCi0gICAgICAgICAgICBnZXRBbm5vdGF0aW9uKGNsYXp6LFhtbFJvb3RFbGVtZW50LmNsYXNzKTsKLSAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHJvb3QubmFtZSgpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcm9vdC5uYW1lc3BhY2UoKTsKLQotICAgICAgICAvLyBUaGUgbmFtZSBtYXkgbmVlZCB0byBiZSBkZWZhdWx0ZWQKLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDAgfHwgbmFtZS5lcXVhbHMoIiMjZGVmYXVsdCIpKSB7Ci0gICAgICAgICAgICBuYW1lID0gZ2V0U2ltcGxlTmFtZShjbGF6ei5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIG5hbWVzcGFjZSBtYXkgbmVlZCB0byBiZSBkZWZhdWx0ZWQKLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwIHx8IG5hbWVzcGFjZS5lcXVhbHMoIiMjZGVmYXVsdCIpKSB7Ci0gICAgICAgICAgICBQYWNrYWdlIHBrZyA9IGNsYXp6LmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSAoWG1sU2NoZW1hKQotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24ocGtnLCBYbWxTY2hlbWEuY2xhc3MpOwotICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gc2NoZW1hLm5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWUobmFtZXNwYWNlLCBuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBuYW1lc3BhY2Ugb2Ygcm9vdCBlbGVtZW50IHFuYW1lIG9yIG51bGwgaWYgdGhpcyBpcyBub3Qgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhIHJvb3QgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudW1WYWx1ZShFbnVtIG15RW51bSl7Ci0JCUZpZWxkIGY7Ci0JCVN0cmluZyB2YWx1ZTsKLQkJdHJ5IHsKLQkJCWYgPSBteUVudW0uZ2V0Q2xhc3MoKS5nZXRGaWVsZChteUVudW0ubmFtZSgpKTsKLQkJCQotCQkJZi5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJCi0JCQlYbWxFbnVtVmFsdWUgeGV2ID0gKFhtbEVudW1WYWx1ZSkgZ2V0QW5ub3RhdGlvbihmLCBYbWxFbnVtVmFsdWUuY2xhc3MpOwotCQkJaWYgKHhldiA9PSBudWxsKXsKLQkJCQl2YWx1ZSA9IGYuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZSA9IHhldi52YWx1ZSgpOwotCQkJfQotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHV0aWxpdHkgbWV0aG9kIHRvIGdldCB0aGUgbGFzdCB0b2tlbiBpbiBhICIuIi1kZWxpbWl0ZWQgcGFja2FnZStjbGFzc25hbWUgc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGluKSB7Ci0gICAgICAgIGlmIChpbiA9PSBudWxsIHx8IGluLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBpbjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgb3V0ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4sICIuIik7Ci0gICAgICAgIGlmICh0b2tlbml6ZXIuY291bnRUb2tlbnMoKSA9PSAwKQotICAgICAgICAgICAgb3V0ID0gaW47Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICBvdXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSkFYQkNsYXNzIGhhcyBhIHNldCBvZiBiZWFuIHByb3BlcnRpZXMgZWFjaCByZXByZXNlbnRlZCBieSBhIFByb3BlcnR5RGVzY3JpcHRvciBFYWNoIG9mCi0gICAgICogdGhlIGZpZWxkcyBvZiB0aGUgY2xhc3MgaGFzIGFuIGFzc29jaWF0ZWQgeG1sIG5hbWUuIFRoZSBtZXRob2QgcmV0dXJucyBhIG1hcCB3aGVyZSB0aGUga2V5IGlzCi0gICAgICogdGhlIHhtbCBuYW1lIGFuZCB2YWx1ZSBpcyB0aGUgUHJvcGVydHlEZXNjcmlwdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4YkNsYXNzCi0gICAgICogQHJldHVybiBtYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcChDbGFzcyBqYXhiQ2xhc3MpCi0gICAgICAgICAgICB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIEludHJvc3BlY3Rpb25FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJHZXQgdGhlIFByb3BlcnR5RGVzY3JpcHRvcltdIGZvciAiICsgamF4YkNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkcyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhqYXhiQ2xhc3MpLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPigpOwotCi0gICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlIGVsZW1lbnQgbmFtZXMgYXJlIHN0b3JlZCBvbiB0aGUgZmllbGRzLgotICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGNsYXNzIGFuZCBzdXBlciBjbGFzc2VzCi0KLSAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzID0gZ2V0RmllbGRzKGpheGJDbGFzcyk7Ci0KLSAgICAgICAgLy8gTm93IG1hdGNoIHVwIHRoZSBmaWVsZHMgd2l0aCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMuLi5TaWdoIHdoeSBkaWRuJ3QgSkFYQiBwdXQgdGhlIEBYTUxFbGVtZW50IGFubm90YXRpb25zIG9uIHRoZSAKLSAgICAgICAgLy8gcHJvcGVydHkgbWV0aG9kcyEKLSAgICAgICAgZm9yIChQcm9wZXJ0eURlc2NyaXB0b3IgcGQgOiBwZHMpIHsKLQotICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBjbGFzcyBwcm9wZXJ0eS4uaXQgaXMgbmV2ZXIgcmVwcmVzZW50ZWQgYXMgYW4geG1sIGVsZW1lbnQKLSAgICAgICAgICAgIGlmIChwZC5nZXROYW1lKCkuZXF1YWxzKCJjbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgZmluZCBhIG1hdGNoaW5nIGZpZWxkLi4uc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSB4bWwgbmFtZQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFN0YXJ0OiBGaW5kIHhtbG5hbWUgZm9yIHByb3BlcnR5OiIgKyBwZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWVsZE5hbWUgPSBmaWVsZC5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCBwcm9wZXJ0eSB0byBmaW5kIHRoZSBtYXRjaAotICAgICAgICAgICAgICAgIGlmIChmaWVsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShwZC5nZXREaXNwbGF5TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UocGQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHhtbEVsZW1lbnQgbmFtZSBmb3IgdGhpcyBmaWVsZAotICAgICAgICAgICAgICAgICAgICBRTmFtZSB4bWxOYW1lID0gZ2V0WG1sRWxlbWVudFJlZk9yRWxlbWVudFFOYW1lKGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCksIGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEZvdW5kIGZpZWxkICIgKyBmaWVsZC5nZXROYW1lKCkgKyAiIHdoaWNoIGhhcyB4bWxuYW1lPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmdldCh4bWxOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBTEVSVDogcHJvcGVydHkgIiArIG1hcC5nZXQoeG1sTmFtZSkuZ2V0UHJvcGVydHlOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbHJlYWR5IGhhcyB0aGlzIHNhbWUgeG1sTmFtZS4udGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCh4bWxOYW1lLmdldExvY2FsUGFydCgpLCBuZXcgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyhwZCwgeG1sTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBzb21ldGltZXMgdGhlIGZpZWxkIG5hbWUgaXMgcHJlY2VlZGVkIGJ5IGFuIHVuZGVyc2NvcmUKLSAgICAgICAgICAgICAgICBpZiAoZmllbGROYW1lLnN0YXJ0c1dpdGgoIl8iKSkgewotICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUgPSBmaWVsZE5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UocGQuZ2V0RGlzcGxheU5hbWUoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShwZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHhtbEVsZW1lbnQgbmFtZSBmb3IgdGhpcyBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgeG1sTmFtZSA9IGdldFhtbEVsZW1lbnRSZWZPckVsZW1lbnRRTmFtZShmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLCBmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBGb3VuZCBmaWVsZCAiICsgZmllbGQuZ2V0TmFtZSgpICsgIiB3aGljaCBoYXMgeG1sbmFtZT0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5nZXQoeG1sTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBBTEVSVDogcHJvcGVydHkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmdldCh4bWxOYW1lKS5nZXRQcm9wZXJ0eU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbHJlYWR5IGhhcyB0aGlzIHNhbWUgeG1sTmFtZS4udGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCh4bWxOYW1lLmdldExvY2FsUGFydCgpLCBuZXcgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyhwZCwgeG1sTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGEgZmllbGQuICBEZWZhdWx0IHRoZSB4bWxuYW1lIHRvIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHhtbE5hbWUgPSBwZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEEgbWF0Y2hpbmcgZmllbGQgd2FzIG5vdCBmb3VuZC4gIERlZmF1bHRpbmcgeG1sbmFtZSB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1hcC5nZXQoeG1sTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIEFMRVJUOiBwcm9wZXJ0eSAiICsgbWFwLmdldCh4bWxOYW1lKS5nZXRQcm9wZXJ0eU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWxyZWFkeSBoYXMgdGhpcyBzYW1lIHhtbE5hbWUuLnRoaXMgbWF5IGNhdXNlIHByb2JsZW1zLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1hcC5wdXQoeG1sTmFtZSwgbmV3IFByb3BlcnR5RGVzY3JpcHRvclBsdXMocGQsIHhtbE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBFbmQ6IEZpbmQgeG1sbmFtZSBmb3IgcHJvcGVydHk6IiArIHBkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCBvZiB0aGUgZmllbGRzIGluIHRoaXMgY2xhc3MgYW5kIHRoZSBzdXBlciBjbGFzc2VzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVhbkNsYXNzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBwcml2YXRlIExpc3Q8RmllbGQ+IGdldEZpZWxkcyhmaW5hbCBDbGFzcyBiZWFuQ2xhc3MpIHsKLSAgICAgICAgLy8gVGhpcyBjbGFzcyBtdXN0IHJlbWFpbiBwcml2YXRlIGR1ZSB0byBKYXZhIDIgU2VjdXJpdHkgY29uY2VybnMKLSAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzOwotICAgICAgICBmaWVsZHMgPSAoTGlzdDxGaWVsZD4pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxGaWVsZD4gZmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNscyA9IGJlYW5DbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkW10gZmllbGRBcnJheSA9IGNscy5nZXREZWNsYXJlZEZpZWxkcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZEFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICByZXR1cm4gZmllbGRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYnkgbG9va2luZyBhdCB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJDbGFzcwotICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIGdldFhtbEVsZW1lbnRSZWZPckVsZW1lbnRRTmFtZShDbGFzcyBqYXhiQ2xhc3MsIEZpZWxkIGZpZWxkKQotICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0gKFhtbEVsZW1lbnRSZWYpCi0gICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihmaWVsZCwgWG1sRWxlbWVudFJlZi5jbGFzcyk7Ci0gICAgICAgIGlmICh4bWxFbGVtZW50UmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoeG1sRWxlbWVudFJlZi5uYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgeG1sRWxlbWVudFJlZi5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIFhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IChYbWxFbGVtZW50KQotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oZmllbGQsIFhtbEVsZW1lbnQuY2xhc3MpOwotCi0gICAgICAgIC8vIElmIFhtbEVsZW1lbnQgZG9lcyBub3QgZXhpc3QsIGRlZmF1bHQgdG8gdXNpbmcgdGhlIGZpZWxkIG5hbWUKLSAgICAgICAgaWYgKHhtbEVsZW1lbnQgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHhtbEVsZW1lbnQubmFtZSgpLmVxdWFscygiIyNkZWZhdWx0IikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIiIsIGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh4bWxFbGVtZW50Lm5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgIHhtbEVsZW1lbnQubmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL0pBWEJXcmFwcGVyVG9vbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9KQVhCV3JhcHBlclRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3OTViOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL0pBWEJXcmFwcGVyVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuUHJvcGVydHlEZXNjcmlwdG9yUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuaW1wbC5KQVhCV3JhcHBlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIEpBWEJXcmFwcGVyIHRvb2wgaXMgdXNlZCB0byBjcmVhdGUgYSBKQVhCIE9iamVjdCBmcm9tIGEgc2VyaWVzIG9mIGNoaWxkIG9iamVjdHMgKHdyYXApIG9yIGdldAotICogdGhlIGNoaWxkIG9iamVjdHMgZnJvbSBhIEpBWEIgT2JqZWN0ICh1bndyYXApCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSkFYQldyYXBwZXJUb29sIHsKLSAgICAvKioKLSAgICAgKiB1bndyYXAgUmV0dXJucyB0aGUgbGlzdCBvZiBjaGlsZCBvYmplY3RzIG9mIHRoZSBqYXhiIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGpheGJPYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlCi0gICAgICogQHBhcmFtIGNoaWxkTmFtZXMgbGlzdCBvZiB4bWwgY2hpbGQgbmFtZXMgYXMgU3RyaW5nCi0gICAgICogQHBhcmFtIHBkTWFwICAgICAgUHJvcGVydHlEZXNjcmlwdG9yTWFwIGRlc2NyaWJpbmcgdGhlIGpheGJPYmplY3QKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgT2JqZWN0cyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZWxlbWVudCBuYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdW5XcmFwKE9iamVjdCBqYXhiT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCkgdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogdW53cmFwIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hpbGQgb2JqZWN0cyBvZiB0aGUgamF4YiBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXhiT2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZQotICAgICAqIEBwYXJhbSBjaGlsZE5hbWVzIGxpc3Qgb2YgeG1sIGNoaWxkIG5hbWVzIGFzIFN0cmluZwotICAgICAqIEByZXR1cm4gbGlzdCBvZiBPYmplY3RzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBlbGVtZW50IG5hbWVzLiBOb3RlOiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEKLSAgICAgKiAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBtYXA7IHRodXMgaXQgaXMgbGVzcyBwZXJmb3JtYW50IHRoYW4gdGhlIG90aGVyIHVuV3JhcCBtZXRob2QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdW5XcmFwKE9iamVjdCBqYXhiT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMpIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogd3JhcCBDcmVhdGVzIGEgamF4YiBvYmplY3QgdGhhdCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjaGlsZCBvYmplY3RzLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGpheGJDbGFzcyBtdXN0IGJlIHRoZSBjbGFzcyB0aGUgcmVwcmVzZW50cyB0aGUgY29tcGxleFR5cGUuIChJdCBzaG91bGQgbmV2ZXIgYmUKLSAgICAgKiBKQVhCRWxlbWVudCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXhiQ2xhc3MKLSAgICAgKiBAcGFyYW0gY2hpbGROYW1lcyAgICBsaXN0IG9mIHhtbCBjaGlsZCBuYW1lcyBhcyBTdHJpbmcKLSAgICAgKiBAcGFyYW0gY2hpbGRPYmplY3RzLCBjb21wb25lbnQgdHlwZSBvYmplY3RzCi0gICAgICogQHBhcmFtIHBkTWFwICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yTWFwIGRlc2NyaWJpbmcgdGhlIGpheGJPYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IHdyYXAoQ2xhc3MgamF4YkNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gY2hpbGROYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJlZENsYXNzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCkgdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogd3JhcCBDcmVhdGVzIGEgamF4YiBvYmplY3QgdGhhdCBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjaGlsZCBvYmplY3RzLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGpheGJDbGFzcyBtdXN0IGJlIHRoZSBjbGFzcyB0aGUgcmVwcmVzZW50cyB0aGUgY29tcGxleFR5cGUuIChJdCBzaG91bGQgbmV2ZXIgYmUKLSAgICAgKiBKQVhCRWxlbWVudCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBqYXhiQ2xhc3MKLSAgICAgKiBAcGFyYW0gY2hpbGROYW1lcyAgICBsaXN0IG9mIHhtbCBjaGlsZCBuYW1lcyBhcyBTdHJpbmcKLSAgICAgKiBAcGFyYW0gY2hpbGRPYmplY3RzLCBjb21wb25lbnQgdHlwZSBvYmplY3RzCi0gICAgICogQHBhcmFtIHBkTWFwICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yTWFwIGRlc2NyaWJpbmcgdGhlIGpheGJPYmplY3QgTm90ZTogVGhpcyBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVzIGEgUHJvcGVydHlEZXNjcmlwdG9yIG1hcDsgdGh1cyBpdCBpcyBsZXNzIHBlcmZvcm1hbnQgdGhhbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvdGhlciB1bldyYXAgbWV0aG9kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCB3cmFwKENsYXNzIGpheGJDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRPYmplY3RzKSB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb247Ci0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL2ltcGwvSkFYQldyYXBwZXJFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dyYXBwZXIvaW1wbC9KQVhCV3JhcHBlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA5NGRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dyYXBwZXIvaW1wbC9KQVhCV3JhcHBlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuaW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgSkFYQldyYXBwZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYQldyYXBwZXJFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBKQVhCV3JhcHBlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbWVzc2FnZSAgKi8KLSAgICBwdWJsaWMgSkFYQldyYXBwZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0KLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNhdXNlICAqLwotICAgIHB1YmxpYyBKQVhCV3JhcHBlckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL2ltcGwvSkFYQldyYXBwZXJUb29sSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3JhcHBlci9pbXBsL0pBWEJXcmFwcGVyVG9vbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwNGZiMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93cmFwcGVyL2ltcGwvSkFYQldyYXBwZXJUb29sSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53cmFwcGVyLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlByb3BlcnR5RGVzY3JpcHRvclBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LlhNTFJvb3RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuSkFYQldyYXBwZXJUb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBKQVhCV3JhcHBlciB0b29sIGlzIHVzZWQgdG8gY3JlYXRlIGEgSkFYQiBPYmplY3QgZnJvbSBhIHNlcmllcyBvZiBjaGlsZCBvYmplY3RzICh3cmFwKSBvciBnZXQKLSAqIHRoZSBjaGlsZCBvYmplY3RzIGZyb20gYSBKQVhCIE9iamVjdCAodW53cmFwKQotICovCi1wdWJsaWMgY2xhc3MgSkFYQldyYXBwZXJUb29sSW1wbCBpbXBsZW1lbnRzIEpBWEJXcmFwcGVyVG9vbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYQldyYXBwZXJUb29sLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIHVud3JhcCBSZXR1cm5zIHRoZSBsaXN0IG9mIGNoaWxkIG9iamVjdHMgb2YgdGhlIGpheGIgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4Yk9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUKLSAgICAgKiBAcGFyYW0gY2hpbGROYW1lcyBsaXN0IG9mIHhtbCBjaGlsZCBuYW1lcyBhcyBTdHJpbmcKLSAgICAgKiBAcGFyYW0gcGRNYXAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgbWFwIGZvciB0aGlzIGpheGJPYmplY3QKLSAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgT2JqZWN0cyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZWxlbWVudCBuYW1lcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gdW5XcmFwKE9iamVjdCBqYXhiT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiBwZE1hcCkgdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGlmIChqYXhiT2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCV3JhcHBlckVycjEiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoaWxkTmFtZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJXcmFwcGVyRXJyMiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgb2JqZWN0IHRoYXQgd2lsbCBoYXZlIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAoaS5lLiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29tcGxleFR5cGUpCi0gICAgICAgIE9iamVjdCBqYXhiQ29tcGxleFR5cGVPYmogPSBqYXhiT2JqZWN0OwotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB1bldyYXAoKSBtZXRob2Qgd2l0aCBqYXhiIG9iamVjdDoiICsKLSAgICAgICAgICAgICAgICAgICAgamF4YkNvbXBsZXhUeXBlT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGlucHV0IGNoaWxkIHhtbG5hbWVzIGFyZTogIiArIHRvU3RyaW5nKGNoaWxkTmFtZXMpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdGhlIFByb3BlcnR5RGVzY3JpcHRvclBsdXMgbWFwIGlmIGRlYnVnIGlzIGVuYWJsZWQuCi0gICAgICAgIC8vIFRoZSBtZXRob2QgbWFrZXMgc3VyZSB0aGF0IGVhY2ggY2hpbGQgbmFtZSBoYXMgYSBtYXRjaGluZyBqYXhiIHByb3BlcnR5Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgY2hlY2tQcm9wZXJ0eURlc2NyaXB0b3JNYXAoamF4YkNvbXBsZXhUeXBlT2JqLmdldENsYXNzKCksIGNoaWxkTmFtZXMsIHBkTWFwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgY29ycmVzcG9uc2luZyBvYmplY3RzIGZyb20gdGhlIGpheGIgYmVhbgotICAgICAgICBBcnJheUxpc3Q8T2JqZWN0PiBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNoaWxkTmFtZSA6IGNoaWxkTmFtZXMpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvclBsdXMgcHJvcEluZm8gPSBwZE1hcC5nZXQoY2hpbGROYW1lKTsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgICAgICAgICAgaWYgKHByb3BJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQldyYXBwZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQldyYXBwZXJFcnI2IiwgCi0gICAgICAgICAgICAgICAgICAgICAgamF4YkNvbXBsZXhUeXBlT2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0ID0gcHJvcEluZm8uZ2V0KGpheGJDb21wbGV4VHlwZU9iaik7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFuIGV4Y2VwdGlvbiAiICsgZS5nZXRDbGFzcygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIGNhbGwgZ2V0KCkgb24gIiArIHByb3BJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgY29ycmVzcG9uZGluZyB4bWwgY2hpbGQgbmFtZSBpczogIiArIGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iakxpc3QuYWRkKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0W10gamF4Yk9iamVjdHMgPSBvYmpMaXN0LnRvQXJyYXkoKTsKLSAgICAgICAgb2JqTGlzdCA9IG51bGw7Ci0gICAgICAgIHJldHVybiBqYXhiT2JqZWN0czsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHdyYXAgQ3JlYXRlcyBhIGpheGIgb2JqZWN0IHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY2hpbGQgb2JqZWN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBqYXhiQ2xhc3MgbXVzdCBiZSB0aGUgY2xhc3MgdGhlIHJlcHJlc2VudHMgdGhlIGNvbXBsZXhUeXBlLiAoSXQgc2hvdWxkIG5ldmVyIGJlCi0gICAgICogSkFYQkVsZW1lbnQpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gamF4YkNsYXNzCi0gICAgICogQHBhcmFtIGNoaWxkTmFtZXMgICAgbGlzdCBvZiB4bWwgY2hpbGQgbmFtZXMgYXMgU3RyaW5nCi0gICAgICogQHBhcmFtIGNoaWxkT2JqZWN0cywgY29tcG9uZW50IHR5cGUgb2JqZWN0cwotICAgICAqIEBwYXJhbSBwZE1hcCAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBtYXAgZm9yIHRoaXMgamF4Yk9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3Qgd3JhcChDbGFzcyBqYXhiQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkT2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M+IGRlY2xhcmVkQ2xhc3NNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwKSB0aHJvd3MgSkFYQldyYXBwZXJFeGNlcHRpb24gewotCi0KLSAgICAgICAgaWYgKGNoaWxkTmFtZXMgPT0gbnVsbCB8fCBjaGlsZE9iamVjdHMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJXcmFwcGVyRXJyMyIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2hpbGROYW1lcy5zaXplKCkgIT0gY2hpbGRPYmplY3RzLnNpemUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBWEJXcmFwcGVyRXJyNCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnZva2luZyB1bndyYXAoKSBtZXRob2QgdG8gY3JlYXRlIGpheGIgb2JqZWN0OiIgKyBqYXhiQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGlucHV0IGNoaWxkIHhtbG5hbWVzIGFyZTogIiArIHRvU3RyaW5nKGNoaWxkTmFtZXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEp1c3QgbGlrZSB1bldyYXAsIGNoZWNrIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG1hcCB0byBtYWtlIHN1cmUgaXQgaXMgYWNjdXJhdGUKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBjaGVja1Byb3BlcnR5RGVzY3JpcHRvck1hcChqYXhiQ2xhc3MsIGNoaWxkTmFtZXMsIHBkTWFwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBqYXhiIG9iamVjdCBhbHdheXMgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENyZWF0ZSB0aGUgb2JqZWN0Ci0gICAgICAgIE9iamVjdCBqYXhiT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGpheGJPYmplY3QgPSBqYXhiQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXhjZXB0aW9uICIgKyB0LmdldENsYXNzKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgamF4Ym9iamVjdCAgIiArIGpheGJDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IHNldCBlYWNoIG9iamVjdCBvbnRvIHRoZSBqYXhiIG9iamVjdAotICAgICAgICBmb3IgKFN0cmluZyBjaGlsZE5hbWUgOiBjaGlsZE5hbWVzKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIHByb3BJbmZvID0gcGRNYXAuZ2V0KGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjaGlsZE9iamVjdHMuZ2V0KGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICBDbGFzcyBkY2xDbGFzcyA9IGRlY2xhcmVkQ2xhc3NNYXAuZ2V0KGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICBpZiAocHJvcEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJKQVhCV3JhcHBlckVycjYiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXhiQ2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvcEluZm8uc2V0KGpheGJPYmplY3QsIHZhbHVlLCBkY2xDbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQW4gZXhjZXB0aW9uICIgKyB0LmdldENsYXNzKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY2FsbCBzZXQoKSBvbiAgIiArIHByb3BJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgY29ycmVzcG9uZGluZyB4bWwgY2hpbGQgbmFtZSBpczogIiArIGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKHZhbHVlID09IG51bGwpID8gIjxudWxsPiIgOiB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvYmplY3QgaXM6ICIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV0dXJuIHRoZSBqYXhiIG9iamVjdCAKLSAgICAgICAgcmV0dXJuIGpheGJPYmplY3Q7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRoaXMgY29kZSBjaGVja3MgdGhlIHBkTWFwIHRvIG1ha2Ugc3VyZSB0aGF0IGEgUHJvcGVydHlEZXNjcmlwdG9yCi0gICAgICogZXhpc3RzIGZvciBlYWNoIGNoaWxkIG5hbWUuICBUaGlzIGNvZGUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4KLSAgICAgKiBkZWJ1ZyBpcyBlbmFibGVkIG9yIGFuIGV4Y2VwdGlvbiBvY2N1cnMuICAoSXQgaXMgdG9vIHNsb3cgZm9yIHRoZSBtYWlubGluZSBwYXRoKSAKLSAgICAgKiBAcGFyYW0gamF4YkNsYXNzCi0gICAgICogQHBhcmFtIHhtbENoaWxkTmFtZXMKLSAgICAgKiBAcGFyYW0gcGRNYXAKLSAgICAgKiBAdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUHJvcGVydHlEZXNjcmlwdG9yTWFwKENsYXNzIGpheGJDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhtbENoaWxkTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFByb3BlcnR5RGVzY3JpcHRvclBsdXM+IHBkTWFwKQotICAgIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeG1sQ2hpbGROYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHhtbENoaWxkTmFtZSA9IHhtbENoaWxkTmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyBwZCA9IHBkTWFwLmdldCh4bWxDaGlsZE5hbWUpOwotICAgICAgICAgICAgaWYgKHBkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBFYWNoIHhtbCBjaGlsZCBuYW1lIG11c3QgaGF2ZSBhIG1hdGNoaW5nIHByb3BlcnR5LiAgCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9jY3VycmVkIHRyeWluZyB0byBtYXRjaCBhbiB4bWwgbmFtZSB0byBhIGNoaWxkIG9mIGEgamF4YiBvYmplY3QiKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSBKQVhCQ2xhc3MgaXM6IiArIGpheGJDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgVGhlIGNoaWxkIG5hbWUgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IgaXM6IiArIHhtbENoaWxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBUaGUgSkFYQkNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGNoaWxkIHhtbCBuYW1lczoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKHBkTWFwLmtleVNldCgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBDb21wbGV0ZSBsaXN0IG9mIGNoaWxkIG5hbWVzIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoeG1sQ2hpbGROYW1lcykpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKQVhCV3JhcHBlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiSkFYQldyYXBwZXJFcnI2IiwgamF4YkNsYXNzLmdldE5hbWUoKSwgeG1sQ2hpbGROYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uCi0gICAgICogQHJldHVybiBsaXN0IG9mIHRoZSBuYW1lcyBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gIlsiOwotICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gIltdIjsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdGV4dCArPSBuYW1lOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0ICs9ICIsIiArIG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRleHQgKyAiXSI7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdFtdIHVuV3JhcChPYmplY3QgamF4Yk9iamVjdCwgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMpIHRocm93cyBKQVhCV3JhcHBlckV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBtYXAgZm9yIHRoaXMgSkFYQkNsYXNzCi0gICAgICAgIENsYXNzIGpheGJDbGFzcyA9IGpheGJPYmplY3QuZ2V0Q2xhc3MoKTsKLSAgICAgICAgTWFwPFN0cmluZywgUHJvcGVydHlEZXNjcmlwdG9yUGx1cz4gIHBkTWFwID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBkTWFwID0gWE1MUm9vdEVsZW1lbnRVdGlsLmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvck1hcChqYXhiQ2xhc3MpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFcnJvciBvY2N1cnJlZCB0byBidWlsZCB0aGUgUHJvcGVydHlEZXNjcmlwdG9yIG1hcCIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFRoZSBKQVhCQ2xhc3MgaXM6IiArIGpheGJDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJXcmFwcGVyRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGVsZWdhdGUKLSAgICAgICAgcmV0dXJuIHVuV3JhcChqYXhiT2JqZWN0LCBjaGlsZE5hbWVzLCBwZE1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB3cmFwKENsYXNzIGpheGJDbGFzcywgTGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMsIE1hcDxTdHJpbmcsIE9iamVjdD4gY2hpbGRPYmplY3RzKQotICAgICAgICAgICAgdGhyb3dzIEpBWEJXcmFwcGVyRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG1hcAotICAgICAgICBNYXA8U3RyaW5nLCBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzPiAgcGRNYXAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGRNYXAgPSBYTUxSb290RWxlbWVudFV0aWwuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yTWFwKGpheGJDbGFzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVycm9yIG9jY3VycmVkIHRvIGJ1aWxkIHRoZSBQcm9wZXJ0eURlc2NyaXB0b3IgbWFwIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgVGhlIEpBWEJDbGFzcyBpczoiICsgamF4YkNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSkFYQldyYXBwZXJFeGNlcHRpb24odCk7Ci0gICAgICAgIH0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIENsYXNzPiBkZWNsYXJpbmdDbGFzcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M+KCk7Ci0gICAgICAgIC8vIERlbGVnYXRlCi0gICAgICAgIHJldHVybiB3cmFwKGpheGJDbGFzcywgY2hpbGROYW1lcywgY2hpbGRPYmplY3RzLCBkZWNsYXJpbmdDbGFzcywgcGRNYXApOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1NjaGVtYVJlYWRlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9TY2hlbWFSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzNmJhYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1NjaGVtYVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBTY2hlbWEgUmVhZGVyIGludGVyZmFjZSBpcyB1c2VkIHRvIHJlYWQgc2NoZW1hIGZyb20gd3NkbCBhbmQgZGVyaXZlIGFwcHJvcHJpYXRlIHBhY2thZ2UgbmFtZXMKLSAqIGZyb20gdGFyZ2V0bmFtZXNwYWNlLiBUaGUgYWxnb3JpdGhtIGZvciBkZXJpdmluZyByZWFkaW5nIHBhY2thZ2VzIG5hbWVzIGZyb20gc2NoZW1hIGlzIGFzCi0gKiBmb2xsb3dzOiAxKSBSZWFkIHRoZSBpbmxpbmUgc2NoZW1hIGRlZmluZWQgaW4gdGhlIHdzZGwgMikgY2hlY2sgaWYgdGhlcmUgaXMgYW55IGpheGIKLSAqIGN1c3RvbWl6YXRpb24vYmluZGluZyBkZWZpbmVkIG5hbWVseSBzY2hlbWFCaW5kaW5nLiBpZihzY2hlbWFCaW5kaW5nIGRlZmluZWQpIHRoZW4gcmVhZCB0aGUKLSAqIHBhY2thZ2UgbmFtZSBhbmQgYWRkIHRoYXQgdG8gdGhlIHBhY2thZ2Ugc2V0LiBlbHNlIHJlYWQgdGhlIHRhcmdldG5hbWVzcGFjZSBjb252ZXJ0IHRucyB0bwotICogcGFja2FnZSBhbmQgYWRkIHRvIHBrZyBzZXQuIDMpIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgeHNkIGltcG9ydHMgb3IgaW5jbHVkZXMgdGhlbiBmb3IoZWFjaAotICogaW1wb3J0KSByZWFkIHRoZSBpbmxpbmUgc2NoZW1hIG9yIHBlcmZvciBzdGVwIDEgY2hlY2sgaWYgdGhlcmUgaXMgYW55IGpheGIgc2NoZW1hQmluZGluZwotICogY3VzdG9taXphdGlvbiBkZWZpbmVkIGlmKHNjaGVtYUJpbmRpbmcgZGVmaW5lZCkgdGhlbiByZWFkIHRoZSBwYWNrYWdlIG5hbWUgYW5kIGFkZCB0aGF0IHRvIHRoZQotICogcGFja2FnZSBzZXQuIGVsc2UgcmVhZCB0aGUgdGFyZ2V0bmFtZXNwYWNlIGNvbnZlcnQgdG5zIHRvIHBhY2thZ2UgYW5kIGFkZCB0byBwa2cgc2V0LiBEbyBTdGVwIDMKLSAqIHJlY3Vyc2l2ZWx5IHNvIHdlIGNvdmVyIFNjaGVtYSBpbXBvcnRzIHdpdGhpbiBpbXBvcnQgbiB0aW1lcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFSZWFkZXIgewotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiByZWFkUGFja2FnZXNGcm9tU2NoZW1hKERlZmluaXRpb24gd3NkbERlZmluaXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hUmVhZGVyRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9TY2hlbWFSZWFkZXJFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvU2NoZW1hUmVhZGVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNjRlYzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9TY2hlbWFSZWFkZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsOwotCi1wdWJsaWMgY2xhc3MgU2NoZW1hUmVhZGVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBTY2hlbWFSZWFkZXJFeGNlcHRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hUmVhZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCi0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYVJlYWRlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTY2hlbWFSZWFkZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9pbXBsL1NjaGVtYVJlYWRlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvaW1wbC9TY2hlbWFSZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTUwYjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3Mvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9pbXBsL1NjaGVtYVJlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWxpdHkuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLlNjaGVtYVJlYWRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLlNjaGVtYUltcG9ydDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlYWRlckltcGwgaW1wbGVtZW50cyBTY2hlbWFSZWFkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBWEJfU0NIRU1BX0JJTkRJTkcgPSAic2NoZW1hQmluZGluZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBKQVhCX1NDSEVNQV9CSU5ESU5HX1BBQ0tBR0UgPSAicGFja2FnZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBWEJfU0NIRU1BX0JpbmRpbmdfUEFDS0FHRU5BTUUgPSAibmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNDSEVNQV9UQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBwcml2YXRlIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTY2hlbWFSZWFkZXJJbXBsLmNsYXNzKTsKLSAgICAKLSAgICAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGxpc3Qgb2Ygc2NoZW1hIHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBzY2hlbWEtPnBhY2thZ2VzCi0gICAgLy8gYWxnb3JpdGhtLgotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBpZ25vcmVTY2hlbWEgPSBudWxsOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIGlnbm9yZVNjaGVtYSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZ25vcmVTY2hlbWEuYWRkKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciKTsKLSAgICAgICAgaWdub3JlU2NoZW1hLmFkZCgiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5TY2hlbWFSZWFkZXIjcmVhZFBhY2thZ2VzRnJvbVNjaGVtYShqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAgICAqLwotICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiByZWFkUGFja2FnZXNGcm9tU2NoZW1hKERlZmluaXRpb24gd3NkbERlZmluaXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hUmVhZGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW52YWxpZCB3c2RsIGRlZmluaXRpb24gcHJvdmlkZWQsIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFSZWFkZXJFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiU2NoZW1hUmVhZGVyRXJyMSIpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gd3NkbERlZmluaXRpb247Ci0gICAgICAgIExpc3Q8U2NoZW1hPiBzY2hlbWFMaXN0ID0gbmV3IEFycmF5TGlzdDxTY2hlbWE+KCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHBhY2thZ2VMaXN0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICAvL0FkZCBXU0RMIFRhcmdldE5hbWVzcGFjZQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gd3NkbERlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlU3RyaW5nID0gSmF2YVV0aWxzLmdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgIHBhY2thZ2VMaXN0LmFkZChwYWNrYWdlU3RyaW5nKTsKLQotICAgICAgICAvL1JlYWQgQWxsIFNjaGVtYSBEZWZpbml0aW9uIGluIHdzZGw7Ci0gICAgICAgIFR5cGVzIHR5cGVzID0gd3NkbERlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV0FSTklORzogQ291bGQgbm90IGZpbmQgYW55IFNjaGVtYS9UeXBlcyBmcm9tIFdTREwiKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5vIHBhY2thZ2VzIHdpbGwgZGVyaXZlZCBmcm9tIFdTREwgc2NoZW1hIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZUxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogZXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSB7Ci0gICAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgaXNTY2hlbWEoKEV4dGVuc2liaWxpdHlFbGVtZW50KW9iaikpIHsKLSAgICAgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSlvYmo7Ci0gICAgICAgICAgICAgICAgLy9wcm9jZXNzIHNjaGVtYXMgYW5kIHJlYWQgcGFja2FnZXMgZnJvbSB0aGVtLgotICAgICAgICAgICAgICAgIHByb2Nlc3NTY2hlbWEoc2NoZW1hLCBzY2hlbWFMaXN0LCBwYWNrYWdlTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvL1NldCBhbHdheXMgc3RvcmVzIHVuaXF1ZSBvYmplY3RzLCBzbyBJIGRvbnQgaGF2ZSB0byB3b3JyeSBhYm91dCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gdGhpcyBzZXQuCi0gICAgICAgIHJldHVybiBwYWNrYWdlTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NjaGVtYShTY2hlbWEgc2NoZW1hLCBMaXN0PFNjaGVtYT4gc2NoZW1hTGlzdCwgU2V0PFN0cmluZz4gcGFja2FnZUxpc3QpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hUmVhZGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNjaGVtYUxpc3QuY29udGFpbnMoc2NoZW1hKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8U2NoZW1hSW1wb3J0PiBpbXBvcnRMaXN0ID0gbmV3IEFycmF5TGlzdDxTY2hlbWFJbXBvcnQ+KCk7Ci0gICAgICAgIC8vU3RhcnQgcmVhZGluZyBpbmxpbmUgc2NoZW1hCi0gICAgICAgIC8vQ2hlY2sgaWYgdGhlcmUgaXMgQmluZGluZyBjdXN0b21pemF0aW9uIGFuZCByZWFkIHBhY2thZ2UgZnJvbSBpdC4KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VTdHJpbmcgPSByZWFkU2NoZW1hQmluZGluZ1BhY2thZ2VOYW1lKHNjaGVtYSk7Ci0gICAgICAgIC8vTm8gYmluZGluZyBjdXN0b21pemF0aW9uIHByZXNlbnQgdGhlbiBnZXQgdGhlIFRhcmdldG5hbWVzcGFjZSBvZiBTY2hlbWEKLSAgICAgICAgaWYgKHBhY2thZ2VTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgLy9ubyBTY2hlbWEgQmluZGluZyBwYWNrYWdlIG5hbWUgZm91bmQsIHRoaXMgbWVhbnMgbm8gamF4YiBjdXN0b21pemF0aW9ucyBpbiBzY2hlbWEsIGxldHMgcmVhZCB3c2RsCi0gICAgICAgICAgICAvL3RhcmdldG5hbWVzcGFjZS4gVGhhdHMgd2hhdCB3aWxsIGJlIHVzZWQgYnkgUkkgdG9vbGluZyB0byBzdG9yZSBqYXZhIEJlYW5zCi0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVhZFNjaGVtYVRhcmdldG5hbWVzcGFjZShzY2hlbWEpOwotICAgICAgICAgICAgaWYgKGlnbm9yZVNjaGVtYS5jb250YWlucyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgc2NoZW1hIGFuZCBpdHMgY29udGVudHMuLi5jb250aW51ZQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIklnbm9yaW5nIHRhcmdldG5hbWVzcGFjZSAiICsgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2NoZW1hTGlzdC5hZGQoc2NoZW1hKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYWNrYWdlU3RyaW5nID0gSmF2YVV0aWxzLmdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9HYXRoZXIgYWxsIGltcG9ydHMgYW5kIHByb2Nlc3MgU2NoZW1hIGZyb20gdGhlc2UgaW1wb3J0cwotICAgICAgICBNYXAgbWFwID0gc2NoZW1hLmdldEltcG9ydHMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbWFwLnZhbHVlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgVmVjdG9yIHZhbHVlID0gKFZlY3RvcilpLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IHZlY3Rvck9iaiA6IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hSW1wb3J0IHNpID0gKFNjaGVtYUltcG9ydCl2ZWN0b3JPYmo7Ci0gICAgICAgICAgICAgICAgaW1wb3J0TGlzdC5hZGQoc2kpOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2kgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRpbmcgaW1wb3J0IGZvciBTY2hlbWFMb2NhdGlvbiA9IiArIHNpLmdldFNjaGVtYUxvY2F0aW9uVVJJKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vR2V0IG5hbWVzcGFjZSBhbmQgZmxhZyB0aGUgc2NoZW1hIGFzIHJlYWQKLSAgICAgICAgc2NoZW1hTGlzdC5hZGQoc2NoZW1hKTsKLSAgICAgICAgLy9QYWNrYWdlIFN0cmluZyBjb3VsZCBiZSBudWxsIGlmIHRoZXJlIGlzIG5vIHNjaGVtYSBkZWZpbnRpb24gaW5zaWRlIHR5cGVzCi0gICAgICAgIGlmIChwYWNrYWdlU3RyaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhY2thZ2VMaXN0LmFkZChwYWNrYWdlU3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFNjaGVtYUltcG9ydCBzaSA6IGltcG9ydExpc3QpIHsKLSAgICAgICAgICAgIHByb2Nlc3NJbXBvcnQoc2ksIHNjaGVtYUxpc3QsIHBhY2thZ2VMaXN0KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbXBvcnQoU2NoZW1hSW1wb3J0IHNpLCBMaXN0PFNjaGVtYT4gc2NoZW1hTGlzdCwgU2V0PFN0cmluZz4gcGFja2FnZUxpc3QpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hUmVhZGVyRXhjZXB0aW9uIHsKLSAgICAgICAgU2NoZW1hIHJlZlNjaGVtYSA9IHNpLmdldFJlZmVyZW5jZWRTY2hlbWEoKTsKLSAgICAgICAgaWYgKHJlZlNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9jZXNzU2NoZW1hKHJlZlNjaGVtYSwgc2NoZW1hTGlzdCwgcGFja2FnZUxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFNjaGVtYVRhcmdldG5hbWVzcGFjZShTY2hlbWEgc2NoZW1hKSB7Ci0gICAgICAgIE5vZGUgcm9vdCA9IHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBub2RlTWFwID0gcm9vdC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBOb2RlIGF0dHJpYnV0ZU5vZGUgPSBub2RlTWFwLmdldE5hbWVkSXRlbShTQ0hFTUFfVEFSR0VUTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlTm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkU2NoZW1hQmluZGluZ1BhY2thZ2VOYW1lKFNjaGVtYSBzY2hlbWEpIHsKLQotICAgICAgICAvKiBKQVhCIFNwZWNpZmljYXRpb24gc2VjdGlvbiA3LjYgaGF2ZSBmb2xsb3dpbmcgaW1wb3J0YW50IHBvaW50cwotICAgICAgICAgICAqIDEpIDxzY2hlbWFCaW5kaW5ncz4gYmluZGluZyBkZWNsYXJhdGlvbiBoYXZlIHNjaGVtYSBzY29wZQotICAgICAgICAgICAqIDIpIEZvciBpbmxpbmUgYW5ub3RhdGlvbiAgYSA8c2NoZW1hQmluZGluZ3M+IGlzIHZhbGlkIG9ubHkgaW4gdGhlIGFubm90YXRpb24gZWxlbWVudCBvZiB0aGUgPHNjaGVtYT4gZWxlbWVudC4KLSAgICAgICAgICAgKiAzKSBUaGVyZSBtdXN0IG9ubHkgYmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgPHNjaGVtYUJpbmRpbmdzPiBkZWNsYXJhdGlvbiBpbiB0aGUgYW5ub3RhdGlvbiBlbGVtZW50IG9mIHRoZSA8c2NoZW1hPiBlbGVtZW50LgotICAgICAgICAgICAqLwotCi0gICAgICAgIC8vR2V0IHJvb3Qgbm9kZSBmb3Igc2NoZW1hLgotICAgICAgICBOb2RlIHJvb3QgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAocm9vdC5oYXNDaGlsZE5vZGVzKCkpIHsKLQotICAgICAgICAgICAgLy9nZXQgYWxsIGNoaWxkIG5vZGVzIGZvciBzY2hlbWEKLSAgICAgICAgICAgIE5vZGVMaXN0IGxpc3QgPSByb290LmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICAgICAgLy9zZWFyY2ggZm9yIEpBWEIgc2NoZW1hQmluZGluZyBjdXN0b21pemF0aW9uIGluIHNjaGVtYSBlbGVtZW50IGRlZmluaXRpb25zLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IGxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbGVtZW50TmFtZShKQVhCX1NDSEVNQV9CSU5ESU5HLCBjaGlsZE5vZGUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9TY2hlbWFCaW5kaW5nIGhhcyBiZWVuIGRlZmluZWQsIHNvIGxldHMgbG9vayBmb3IgcGFja2FnZSBlbGVtZW50LgotICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBzY2hlbWFCaW5kaW5nTm9kZUxpc3QgPSBjaGlsZE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjaGVtYUJpbmRpbmdOb2RlTGlzdC5nZXRMZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIHNjaGVtYUJpbmRpbmdOb2RlID0gc2NoZW1hQmluZGluZ05vZGVMaXN0Lml0ZW0oaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbGVtZW50TmFtZShKQVhCX1NDSEVNQV9CSU5ESU5HX1BBQ0tBR0UsIHNjaGVtYUJpbmRpbmdOb2RlKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9QYWNrYWdlIEVsZW1lbnQgZm91bmQsIHNvIGxldHMgcmVhZCB0aGUgcGFja2FnZSBuYW1lIGF0dHJpYnV0ZSBhbmQgcmV0dXJuIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBzY2hlbWFCaW5kaW5nTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBhdHRyaWJ1dGVOb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVNYXAuZ2V0TmFtZWRJdGVtKEpBWEJfU0NIRU1BX0JpbmRpbmdfUEFDS0FHRU5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVOb2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnROYW1lKFN0cmluZyBuYW1lLCBOb2RlIGRvbU5vZGUpIHsKLSAgICAgICAgaWYgKGRvbU5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBkb21Ob2RlLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5lcXVhbHMobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjaGVtYShFeHRlbnNpYmlsaXR5RWxlbWVudCBleEVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIFdTRExXcmFwcGVyLlNDSEVNQS5lcXVhbHMoZXhFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU5YTYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4NCi0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPnRydWU8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLS0+DQotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPg0KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+DQotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1UaGlzIGlzIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIG9mIGFkbWluIGNvbnNvbGUtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+DQotICAgIDwhLS1TZXJ2aWNlc0RpcmVjdG9yeSBvbmx5IHdvcmtzIG9uIHRoZSBmb2xsb3dpbmcgY2FzZXMtLT4NCi0gICAgPCEtLS1GaWxlIGJhc2VkIGNvbmZpZ3VyYXRvciBhbmQgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBmaWxlIFVSTCAoaHR0cDovLyBub3QgYWxsb3dlZCktLT4NCi0gICAgPCEtLS1XaGVuIGNyZWF0aW5nIFVSTCBCYXNlZCBjb25maWd1cmF0b3Igd2l0aCBVUkwg4oCcZmlsZTovL+KAnSAgLS0+DQotICAgIDwhLS0tIFdhciBiYXNlZCBjb25maWd1cmF0b3Igd2l0aCBleHBhbmRlZCBjYXNlICwgLS0+DQotDQotICAgIDwhLS1BbGwgdGhlIG90aGVyIHNjZW5hcmlvcyBpdCB3aWxsIGJlIGlnbm9yZWQuLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4NCi0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRob3NlIGVuZHBvaW50cy0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gQXhpczItLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tSkFYV1MgZGVwbG95ZXIgZm9yIHNlcnZpY2VqYXJzLCB0aGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gZHJvcCAuamFyIGZpbGVzIGFuZCBoYXZlIHRoZW0gZGVwbG95ZWQgYXMgYSBzZXJ2aWNlIC0tPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSJqYXIiIGRpcmVjdG9yeT0ic2VydmljZWphcnMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5KQVhXU0RlcGxveWVyIi8+DQotICAgIA0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIGhvc3QgbmFtZSBmb3IgdGhlIGVwci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgbG9ja2VkPSJ0cnVlIj5teWhvc3QuY29tPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVmYXVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4NCi0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPg0KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4NCi0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4NCi0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+DQotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+DQotICAgICAgICA8IS0tTGVmdCBjb21tZW50ZWQgYmVjYXVzZSBpdCBhZGRzIHRoZSBkZXBhbmRhbmN5IG9mIHNlcnZsZXQtYXBpIHRvIG90aGVyIG1vZHVsZXMuDQotICAgICAgICBQbGVhc2UgdW5jb21tZW50IHRvIFJlY2VpdmUgbWVzc2FnZXMgaW4gbXVsdGlwYXJ0L2Zvcm0tZGF0YSBmb3JtYXQtLT4NCi0gICAgICAgIDwhLS08bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPi0tPg0KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRhcmdldCBSZXNvbHZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBhbmQgc3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBmb3IgeW91ciBUYXJnZXRSZXNvbHZlciB0byBhZGQgLS0+DQotICAgIDwhLS0gYSBUYXJnZXRSZXNvbHZlci4gVGFyZ2V0UmVzb2x2ZXJzIGFyZSB1c2VkIHRvIHByb2Nlc3MgdGhlIFRvIEVQUiBmb3IgZXhhbXBsZSB0byAtLT4NCi0gICAgPCEtLSBjaG9vc2UgYSBzZXJ2ZXIgaW4gYSBjbHVzdGVyIC0tPg0KLSAgICA8IS0tPHRhcmdldFJlc29sdmVycz4tLT4NCi0gICAgPCEtLTx0YXJnZXRSZXNvbHZlciBjbGFzcz0iIiAvPi0tPg0KLSAgICA8IS0tPC90YXJnZXRSZXNvbHZlcnM+LS0+DQotDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4NCi0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4NCi0gICAgICAgIDwhLS11bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciAsIGFuZCBzZXQgYXMgeW91IHJlcXVpcmVkLi0tPg0KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPmh0dHA6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4NCi0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPg0KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBoYXNlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUtZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kQ2hlY2tlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZENoZWNrZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+DQotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4NCi0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLk11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlci5Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kQ2hlY2tlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZENoZWNrZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotPC9heGlzY29uZmlnPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvYmFzaWMtY2F0YWxvZy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2Jhc2ljLWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQyYTM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvYmFzaWMtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXJfMl8wLmR0ZCIgLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvY2hpbGQtY2F0YWxvZy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2NoaWxkLWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAzNGZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvY2hpbGQtY2F0YWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvPgotICAgPHB1YmxpYwotICAgICAgIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICB1cmk9ImNhdGFsb2cvZHRkL2VqYi1qYXIuZHRkIiAvPgotICAgPG5leHRDYXRhbG9nIGNhdGFsb2c9Im5leHQueG1sIi8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjEvYWJzdHJhY3Qud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMS9hYnN0cmFjdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjBkMTZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMS9hYnN0cmFjdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvbWVzc2FnZVR5cGVzIgotICB4bWxucz0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L21lc3NhZ2VUeXBlcyIKLSAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICB4bWxuczpuczE9InVybjp0eXBlczEiCi0gIHhtbG5zOm5zMj0idXJuOnR5cGVzMiI+Ci0gIAotICA8d3NkbDp0eXBlcyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIAotICAgIDx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9tZXNzYWdlVHlwZXMiCi0gICAgICB4bWxuczpucz0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L21lc3NhZ2VUeXBlcyIgCi0gICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VG90YWwiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgIDwveHM6ZWxlbWVudD4gICAgIAotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VG90YWxSZXNwb25zZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmludCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0idXJuOnR5cGVzMSIgc2NoZW1hTG9jYXRpb249ImRvZXNub3RleGlzdC54c2QiLz4KLSAgICA8L3hzOnNjaGVtYT4KLSAgICAKLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFRvdGFsUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iZ2V0VG90YWwiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRUb3RhbFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iZ2V0VG90YWxSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTphZGQiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTphZGRSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNsZWFyUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmNsZWFyIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY2xlYXJSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpjbGVhclJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZGl2aWRlUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmRpdmlkZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImRpdmlkZVJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmRpdmlkZVJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZGl2aWRlQnlaZXJvRXhjZXB0aW9uIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6ZGl2aWRlQnlaZXJvRmF1bHQiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtdWx0aXBseVJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTptdWx0aXBseSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Im11bHRpcGx5UmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczI6bXVsdGlwbHlSZXNwb25zZSIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InN1YnRyYWN0UmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMyOnN1YnRyYWN0IiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3VidHJhY3RSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMjpzdWJ0cmFjdFJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIAotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9kaXIyL2ltcG9ydGVkMS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjIvaW1wb3J0ZWQxLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4ZmYzMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjIvaW1wb3J0ZWQxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0idXJuOnR5cGVzMSIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJ1cm46dHlwZXMyIiBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGQiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGVhciI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGVhclJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpdmlkZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpdmlkZVJlc3BvbnNlIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpdmlkZUJ5WmVyb0ZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbHkiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgPC94c2Q6c2NoZW1hPgotICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2RpcjMvaW1wb3J0ZWQyLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMy9pbXBvcnRlZDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZiNzQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZGlyMy9pbXBvcnRlZDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJ1cm46dHlwZXMyIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGlwbHlSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZS8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdWJ0cmFjdCI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbTAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN1YnRyYWN0UmVzcG9uc2UiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2UvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gIDwveHNkOnNjaGVtYT4KLSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL2ZpcnN0SW1wb3J0RmFpbC54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjY2Q4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPCEtLXN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLy0tPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJkb2Vzbm90ZXhpc3QueHNkIgotICAgICAgIHVyaT0iZGlyMi9pbXBvcnRlZDEueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vbmV2ZXJFeGlzdGVkLnhzZCIKLSAgICAgICB1cmk9ImRpcjMvaW1wb3J0ZWQyLnhzZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyLmR0ZCIgLz4KLSAgIDxwdWJsaWMKLSAgICAgICBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iCi0gICAgICAgdXJpPSJjYXRhbG9nL2R0ZC9lamItamFyXzJfMC5kdGQiIC8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvcm9vdC1jYXRhbG9nLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9yb290LWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY3ZGEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9yb290LWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotICAgPG5leHRDYXRhbG9nIGNhdGFsb2c9InRoaXJkSW1wb3J0RmFpbC54bWwiLz4KLTwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9zZWNvbmRJbXBvcnRGYWlsLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvZmFpbC9zZWNvbmRJbXBvcnRGYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5ZmI2My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvc2Vjb25kSW1wb3J0RmFpbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjYXRhbG9nIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6ZW50aXR5OnhtbG5zOnhtbDpjYXRhbG9nIj4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIgotICAgICAgIHVyaT0iY2F0YWxvZy9zY2hlbWEvYXBwbGljYXRpb25fMV80LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgIHVyaT0iaW1wb3J0QXV4LnhzZCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiCi0gICAgICAgdXJpPSJkaXIxL2Fic3RyYWN0LndzZGwiIC8+Ci0gICA8IS0tc3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9ImRvZXNub3RleGlzdC54c2QiCi0gICAgICAgdXJpPSJkaXIyL2ltcG9ydGVkMS54c2QiIC8tLT4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iaHR0cDovL2V4YW1wbGUuY29tL25ldmVyRXhpc3RlZC54c2QiCi0gICAgICAgdXJpPSJkaXIzL2ltcG9ydGVkMi54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9mYWlsL3RoaXJkSW1wb3J0RmFpbC54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvdGhpcmRJbXBvcnRGYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5Y2JlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ZhaWwvdGhpcmRJbXBvcnRGYWlsLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiCi0gICAgICAgdXJpPSJjYXRhbG9nL3NjaGVtYS9hcHBsaWNhdGlvbl8xXzQueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgdXJpPSJpbXBvcnRBdXgueHNkIiAvPgotICAgPHN5c3RlbQotICAgICAgIHN5c3RlbUlkPSJodHRwOi8vZXhhbXBsZS5jb20vdGVzdC9kb2Vzbm90ZXhpc3Qud3NkbCIKLSAgICAgICB1cmk9ImRpcjEvYWJzdHJhY3Qud3NkbCIgLz4KLSAgIDxzeXN0ZW0KLSAgICAgICBzeXN0ZW1JZD0iZG9lc25vdGV4aXN0LnhzZCIKLSAgICAgICB1cmk9ImRpcjIvaW1wb3J0ZWQxLnhzZCIgLz4KLSAgIDwhLS0gc3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9leGFtcGxlLmNvbS9uZXZlckV4aXN0ZWQueHNkIgotICAgICAgIHVyaT0iZGlyMy9pbXBvcnRlZDIueHNkIiAvLS0+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgueHNkIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI2NDVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QXV4LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICA8YWxsPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC9hbGw+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgICA8ZWxlbWVudCBuYW1lPSJTT0FQV3JhcHBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eDIueHNkIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRBdXgyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYWJhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEF1eDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIgotICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2QxPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgIDxhbGw+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8L2FsbD4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgIDxlbGVtZW50IG5hbWU9IlNPQVBXcmFwcGVyMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhZC54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhZC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjJhYjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9pbXBvcnRCYWQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICB4bWxuczp4c2QyPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiCi0gICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiBzY2hlbWFMb2NhdGlvbj0iaW1wb3J0QXV4Mi54c2QiPjwvaW1wb3J0PgotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RQYXJhbSIgdHlwZT0ieHNkMjpTT0FQU3RydWN0Ii8+Ci08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFzZS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL2ltcG9ydEJhc2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhkODcwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvaW1wb3J0QmFzZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgIHhtbG5zOnhzZDI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiIHNjaGVtYUxvY2F0aW9uPSJpbXBvcnRBdXgueHNkIj48L2ltcG9ydD4KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDI6U09BUFN0cnVjdCIvPgotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3QtY2F0YWxvZy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3QtY2F0YWxvZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Yjg4ZmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY2F0YWxvZy9yb290LWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCIKLSAgICAgICB1cmk9ImNhdGFsb2cvc2NoZW1hL2FwcGxpY2F0aW9uXzFfNC54c2QiIC8+Ci0gICA8c3lzdGVtCi0gICAgICAgc3lzdGVtSWQ9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIKLSAgICAgICB1cmk9ImltcG9ydEF1eC54c2QiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphci5kdGQiIC8+Ci0gICA8cHVibGljCi0gICAgICAgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIgotICAgICAgIHVyaT0iY2F0YWxvZy9kdGQvZWpiLWphcl8yXzAuZHRkIiAvPgotICAgPG5leHRDYXRhbG9nIGNhdGFsb2c9ImNoaWxkLWNhdGFsb2cueG1sIi8+Ci08L2NhdGFsb2c+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3Jvb3Qud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDEwOTg4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zCi0gIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gIHhtbG5zOmF4aXMybnMxPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLSAgeG1sbnM6bXNndHlwZXM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9tZXNzYWdlVHlwZXMiCi0gIHhtbG5zOm5zMT0idXJuOnR5cGVzMSIKLSAgeG1sbnM6bnMyPSJ1cm46dHlwZXMyIgotICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvbWVzc2FnZVR5cGVzIiBsb2NhdGlvbj0iaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QvZG9lc25vdGV4aXN0LndzZGwiLz4KLSAgCi0gIDwhLS0gSW1wb3J0aW5nIGRvZXMgbm90IGFjdHVhbGx5IGJyaW5nIGluIHRoZSBtZXNzYWdlcywganVzdCB0aGUgYWJpbGl0eSB0byByZWZlciB0byB0aGVtLgotICAgICAgIFdpdGhvdXQgdGhlIGZvbGxvd2luZyAoZHVwbGljYXRlZCkgbWVzc2FnZXMgdGhlIHdzZGwgZGVmaW5pdGlvbiB3b3VsZCBub3QgaGF2ZSBhbnkgbWVzc2FnZXMuCi0gICAgICAgSG93ZXZlciwgZG8gdXNlIHRoZSBpbXBvcnRlZCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXNzYWdlcyBpbiB0aGUgb3BlcmF0aW9uIGRlc2NyaXB0aW9ucyBiZWxvdy4KLSAgLS0+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VG90YWxSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJtc2d0eXBlczpnZXRUb3RhbCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFRvdGFsUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJtc2d0eXBlczpnZXRUb3RhbFJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmFkZCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmFkZFJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY2xlYXJSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6Y2xlYXIiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJjbGVhclJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOmNsZWFyUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJkaXZpZGVSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6ZGl2aWRlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZGl2aWRlUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczE6ZGl2aWRlUmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJkaXZpZGVCeVplcm9FeGNlcHRpb24iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMTpkaXZpZGVCeVplcm9GYXVsdCIgbmFtZT0icGFydDEiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Im11bHRpcGx5UmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMxOm11bHRpcGx5IiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibXVsdGlwbHlSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im5zMjptdWx0aXBseVJlc3BvbnNlIiBuYW1lPSJwYXJ0MSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic3VidHJhY3RSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJuczI6c3VidHJhY3QiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzdWJ0cmFjdFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibnMyOnN1YnRyYWN0UmVzcG9uc2UiIG5hbWU9InBhcnQxIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0VG90YWwiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmdldFRvdGFsUmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJtc2d0eXBlczpnZXRUb3RhbFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGQiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmFkZFJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibXNndHlwZXM6YWRkUmVzcG9uc2VNZXNzYWdlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNsZWFyIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJtc2d0eXBlczpjbGVhclJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibXNndHlwZXM6Y2xlYXJSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZGl2aWRlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJtc2d0eXBlczpkaXZpZGVSZXF1ZXN0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOmRpdmlkZVJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOmZhdWx0IG1lc3NhZ2U9Im1zZ3R5cGVzOmRpdmlkZUJ5WmVyb0V4Y2VwdGlvbiIKLSAgICAgICAgbmFtZT0iZGl2aWRlQnlaZXJvRXhjZXB0aW9uIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im11bHRpcGx5IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJtc2d0eXBlczptdWx0aXBseVJlcXVlc3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0ibXNndHlwZXM6bXVsdGlwbHlSZXNwb25zZU1lc3NhZ2UiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3VidHJhY3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9Im1zZ3R5cGVzOnN1YnRyYWN0UmVxdWVzdCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJtc2d0eXBlczpzdWJ0cmFjdFJlc3BvbnNlTWVzc2FnZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2VTT0FQMTFCaW5kaW5nIgotICAgIHR5cGU9ImF4aXMybnMxOkNhbGN1bGF0b3JTZXJ2aWNlIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0gICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRUb3RhbCIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRUb3RhbCIgc3R5bGU9ImRvY3VtZW50IiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iYWRkIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmFkZCIgc3R5bGU9ImRvY3VtZW50IiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY2xlYXIiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Y2xlYXIiIHN0eWxlPSJkb2N1bWVudCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRpdmlkZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpkaXZpZGUiIHN0eWxlPSJkb2N1bWVudCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZGl2aWRlQnlaZXJvRXhjZXB0aW9uIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmZhdWx0IGJvZHk9InVzZSIgbmFtZT0iZGl2aWRlQnlaZXJvRXhjZXB0aW9uIgotICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJtdWx0aXBseSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjptdWx0aXBseSIgc3R5bGU9ImRvY3VtZW50IiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8d3NkbDppbnB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3Rlc3QvY2FsY3VsYXRvciIKLSAgICAgICAgICB1c2U9ImxpdGVyYWwiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic3VidHJhY3QiIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46c3VidHJhY3QiIHN0eWxlPSJkb2N1bWVudCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgICAgPHdzZGw6aW5wdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS90ZXN0L2NhbGN1bGF0b3IiCi0gICAgICAgICAgdXNlPSJsaXRlcmFsIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkNhbGN1bGF0b3JTZXJ2aWNlV2ViU2VydmljZSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx3c2RsOnBvcnQgYmluZGluZz0iYXhpczJuczE6Q2FsY3VsYXRvclNlcnZpY2VTT0FQMTFCaW5kaW5nIgotICAgICAgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2VTT0FQMTFwb3J0IiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSIiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jYXRhbG9nL3VuaXF1ZS1jYXRhbG9nLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvdW5pcXVlLWNhdGFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZmZjM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvdW5pcXVlLWNhdGFsb2cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y2F0YWxvZyB4bWxucz0idXJuOm9hc2lzOm5hbWVzOnRjOmVudGl0eTp4bWxuczp4bWw6Y2F0YWxvZyI+Ci0KLTxwdWJsaWMgcHVibGljSWQ9Ii0vL09BU0lTLy9EVEQgWE1MIERvY0Jvb2sgVjQuMS4yLy9FTiIKLSAgICAgICAgdXJpPSJkb2Nib29rL3htbC9kb2Nib29reC5kdGQiLz4KLQotPHN5c3RlbSBzeXN0ZW1JZD0idXJuOngtb2FzaXM6ZG9jYm9vay14bWwtdjQuMS4yIgotICAgICAgICB1cmk9ImRvY2Jvb2sveG1sL2RvY2Jvb2t4LmR0ZCIvPgotCi08ZGVsZWdhdGVQdWJsaWMgcHVibGljSWRTdGFydFN0cmluZz0iLS8vRXhhbXBsZS8vIgotICAgICAgICAgIGNhdGFsb2c9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY2F0YWxvZyIvPgotPC9jYXRhbG9nPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZGQwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLQ0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSANCi0jIHN2biwgb25lIGZvciBkZXZlbG9wZW1lbnQgKG9uZSBhdCBzcmMvdGVzdC1yZXNvdXJjZXMpIGFuZCBvdGhlciBmb3IgcHJvZHVjYXRpb24NCi0gDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLg0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZw0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nDQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXINCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9jb25maWd1cmF0aW9uL2hhbmRsZXJzL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWM4ZTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0NCi0JPGp3czpoYW5kbGVyLWNoYWluIG5hbWU9IkxvZ2dpbmdIYW5kbGVyQ2hhaW4iPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpbkhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JPC9qd3M6aGFuZGxlci1jaGFpbj4NCi0JDQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9oYW5kbGVyLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvaGFuZGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWJjZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvY29uZmlndXJhdGlvbi9oYW5kbGVycy9oYW5kbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLSAgPGp3czpoYW5kbGVyLWNoYWluPg0KLSAgICA8andzOmhhbmRsZXI+DQotICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlTT0FQSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotICAgIDwvandzOmhhbmRsZXI+DQotICAgIDxqd3M6aGFuZGxlcj4NCi0gICAgICA8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlci5EdW1teUxvZ2ljYWxIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0gICAgPC9qd3M6aGFuZGxlcj4NCi0gIDwvandzOmhhbmRsZXItY2hhaW4+DQotPC9qd3M6aGFuZGxlci1jaGFpbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvaW1hZ2UvaW1hZ2UxLmpwZWcgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9pbWFnZS9pbWFnZTEuanBlZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczM2JmMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9pbWFnZS9pbWFnZTEuanBlZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMi5qcGVnIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvaW1hZ2UvaW1hZ2UyLmpwZWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZmQ3YjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvaW1hZ2UvaW1hZ2UyLmpwZWcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9pbWFnZS90ZXN0LmpwZyBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL3Rlc3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQyOTVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL3Rlc3QuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWZlNDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4NCi0jbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQ09OU09MRSwgTE9HRklMRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIExPR0ZJTEUNCi1sb2c0ai5yb290Q2F0ZWdvcnk9RVJST1IsIENPTlNPTEUNCi0NCi0jIFNldCBzZWxlY3RlZCBsb2dnaW5nDQotIyAoWW91IG1pZ2h0IHdhbnQgdG8gZG8gdGhpcyB0byBjdXQgZG93biBvbiB0aGUgc2l6ZSBvZiB0aGUgZmlsZSkNCi0jIFRoZSBleGFtcGxlIGJlbG93IGFkZHMgZGVidWcgdHJhY2UgZm9yIFN0QVhVdGlscyBvciBqYXh3cyBzZXJ2ZXIgdG8gDQotIyB0aGUgYXhpczIuc21hbGwubG9nLg0KLSMgWW91IGNhbiBhZGQgdGhpcyB3aXRob3V0IGNoYW5naW5nIHRoZSByb290IGNhdGVnb3J5Lg0KLSNsb2c0ai5jYXRlZ29yeS5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U9REVCVUcsIFNNQUxMDQotDQotIyBFbmFibGUgdGhlIGZvbGxvd2luZyB0byBnZXQgSkFYV1MgVGVzdExvZ2dlciB0cmFjZS4NCi0jbG9nNGouY2F0ZWdvcnkuSkFYV1MtVGVzdHM9REVCVUcsIFNNQUxMDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4NCi0NCi0jIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuRmlsZT1heGlzMi5sb2cNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkFwcGVuZD10cnVlDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICVjICV4IC0gJW0lbg0KLQ0KLSMgU01BTEwgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuU01BTEw9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5TTUFMTC5GaWxlPWF4aXMyLnNtYWxsLmxvZw0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMLkFwcGVuZD10cnVlDQotbG9nNGouYXBwZW5kZXIuU01BTEwubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLlNNQUxMLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvcHJvdmlkZXIveG1sL3dlYi54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9wcm92aWRlci94bWwvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiOGU1Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy9wcm92aWRlci94bWwvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHRlc3RPcGVyYXRpb24+Ci0gIDx0ZXN0UGFyYW0+SGVsbG8gV29ybGQ8L3Rlc3RQYXJhbT4KLTwvdGVzdE9wZXJhdGlvbj4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQWRkTnVtYmVycy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDI4ZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLQotPGRlZmluaXRpb25zIG5hbWU9IkFkZE51bWJlcnMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+Ci0KLQotCTx0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiPgotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVyc1Jlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmludCIgLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcxIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9IkFkZE51bWJlcnNGYXVsdCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJmYXVsdEluZm8iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9Im9uZVdheUludCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJPC94c2Q6c2NoZW1hPgotCTwvdHlwZXM+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZE51bWJlcnMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4KLQkJPHBhcnQgbmFtZT0iQWRkTnVtYmVyc0ZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTnVtYmVyc0ZhdWx0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJvbmVXYXlJbnQiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6b25lV2F5SW50IiAvPgotCTwvbWVzc2FnZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzUG9ydFR5cGUiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzIiBuYW1lPSJhZGQiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzUmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNGYXVsdCIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5SW50IiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc1BvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCSAKLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCI+Ci0JCQkgCi0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc1NlcnZpY2UiPgotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2UiIC8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmFkRW5kcG9pbnRBZGRyZXNzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzY2Y3MDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9CYWRFbmRwb2ludEFkZHJlc3Mud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnIgotICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLSAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLQotICAgPHR5cGVzPgotICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLSAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvVHlwZSI+Ci0gICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZVR5cGUiPgotICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob1R5cGUiLz4KLSAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZVR5cGUiLz4KLQotICAgICAgPC94c2Q6c2NoZW1hPgotICAgPC90eXBlcz4KLQotICAgPG1lc3NhZ2UgbmFtZT0iZWNobyI+Ci0gICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6ZWNobyIvPgotICAgPC9tZXNzYWdlPgotCi0gICA8bWVzc2FnZSBuYW1lPSJlY2hvUmVzcG9uc2UiPgotICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmVjaG9SZXNwb25zZSIvPgotICAgPC9tZXNzYWdlPgotCi0gICA8cG9ydFR5cGUgbmFtZT0iRWNobyI+Ci0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvIiAvPgotICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Jlc3BvbnNlIiAvPgotICAgICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotCi0gICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0idG5zOkVjaG8iPgotICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgIDwvaW5wdXQ+Ci0KLSAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICA8L29wZXJhdGlvbj4KLSAgIDwvYmluZGluZz4KLQotICAgPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICAgICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9CaW5kaW5nIiBuYW1lPSJFY2hvUG9ydCI+Ci0gICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJ0aGlzIGlzIGFuIGludmFsaWQgc3RyaW5nIi8+Ci0gICAgICA8L3BvcnQ+Ci0gICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YS53c2RsIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODg2YWFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICANCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIg0KLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLSAgPHR5cGVzPiAgICAgIA0KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiANCi0gICAgICAgICAgICAgICAgeG1sbnM6dHM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3hzZCINCi0gICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPg0KLSAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgDQotICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotICAgIDwveHNkOnNjaGVtYT4gICAgDQotICA8L3R5cGVzPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0icmVzdWx0IiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L3BvcnRUeXBlPiAgICAgDQotDQotICA8YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICANCi0gICAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgICANCi0gICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgPG91dHB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgDQotICAgICAgPC9vdXRwdXQ+ICAgICAgIA0KLSAgICA8L29wZXJhdGlvbj4gICAgDQotICA8L2JpbmRpbmc+ICAgICANCi0NCi0gIDxzZXJ2aWNlIG5hbWU9InN2Y0xvY2FsUGFydCI+ICAgICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0Ij4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhTXVsdGlQb3J0LndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhTXVsdGlQb3J0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMmFlZDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU11bHRpUG9ydC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotICA8dHlwZXM+ICAgICAgDQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICAgICAgICAgICAgICB4bWxuczp0cz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcveHNkIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi0gICAgPC94c2Q6c2NoZW1hPiAgICANCi0gIDwvdHlwZXM+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvcG9ydFR5cGU+ICAgICANCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgIA0KLSAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICA8b3V0cHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICANCi0gICAgICA8L291dHB1dD4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvYmluZGluZz4gICAgIA0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0ic3ZjTG9jYWxQYXJ0Ij4gICAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRNdWx0aTEiPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZS9wb3J0TG9jYWxQYXJ0TXVsdGkxIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE11bHRpMiI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlL3BvcnRMb2NhbFBhcnRNdWx0aTIiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJwb3J0TG9jYWxQYXJ0TXVsdGkzIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UvcG9ydExvY2FsUGFydE11bHRpMyIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICA8L3NlcnZpY2U+ICANCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQ2xpZW50TWV0YWRhdGFPdGhlci53c2RsIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU90aGVyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTJkMTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU90aGVyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PiAgDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciDQotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICANCi0gIDx0eXBlcz4gICAgICANCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy94c2QiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgICA8L3hzZDpzY2hlbWE+ICAgIA0KLSAgPC90eXBlcz4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICANCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9wb3J0VHlwZT4gICAgIA0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgDQotICAgICAgPC9pbnB1dD4gICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIA0KLSAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9iaW5kaW5nPiAgICAgDQotDQotICA8c2VydmljZSBuYW1lPSJzdmNMb2NhbFBhcnQiPiAgICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydE90aGVyIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo2MDYwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgIDwvcG9ydD4gICAgIA0KLSAgPC9zZXJ2aWNlPiAgDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOWQ1MzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRNZXRhZGF0YU92ZXJyaWRlbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIA0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIg0KLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgDQotICA8dHlwZXM+ICAgICAgDQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciIA0KLSAgICAgICAgICAgICAgICB4bWxuczp0cz0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcveHNkIg0KLSAgICAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+DQotICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4NCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiIHR5cGU9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgICAgICANCi0gICAgPC94c2Q6c2NoZW1hPiAgICANCi0gIDwvdHlwZXM+ICAgICANCi0NCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICANCi0gIDwvbWVzc2FnZT4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8cG9ydFR5cGUgbmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgDQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIgLz4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvcG9ydFR5cGU+ICAgICANCi0NCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIA0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIi8+ICAgICAgICAgIA0KLSAgICAgIDwvaW5wdXQ+ICAgICAgICAgICANCi0gICAgICA8b3V0cHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICANCi0gICAgICA8L291dHB1dD4gICAgICAgDQotICAgIDwvb3BlcmF0aW9uPiAgICANCi0gIDwvYmluZGluZz4gICAgIA0KLQ0KLSAgPHNlcnZpY2UgbmFtZT0ic3ZjTG9jYWxQYXJ0Ij4gICAgICAgDQotICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9InBvcnRMb2NhbFBhcnRPdmVycmlkZW4iPiAgICAgICAgICANCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICANCi0gICAgPC9wb3J0PiAgICAgDQotICA8L3NlcnZpY2U+ICANCi08L2RlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMV9zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTk1MDYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzIiB0eXBlPSJuczE6YWRkVHdvTnVtYmVycyIgeG1sbnM6bnMxPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIi8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZFR3b051bWJlcnMiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOmludCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiIHR5cGU9Im5zMjphZGRUd29OdW1iZXJzUmVzcG9uc2UiIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZWZjNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczp0bnM9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9InByb3h5IgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciPgotCi0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIKLQkJCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlGYXVsdCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZVdheVZvaWQiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2UgLz4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXkiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25ld2F5X3N0ciIKLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXIiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyX3N0ciIKLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9pbnQiCi0JCQkJCQkJdHlwZT0ieHNkOmludCIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5Ij4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b3dheV9zdHIiCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCQkJCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV0dXJuVHlwZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm5fc3RyIgotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2Vfc3RyIgotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Imludm9rZVJldHVyblR5cGUiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciIKLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQotCQkJCi0KLQkJCTwhLS0gZmluIG9wIGRlZmluaXRpb24gLS0+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5PcCI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvcCIKLQkJCQkJCQl0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJmaW5PcFJlc3BvbnNlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIgotCQkJCQkJCXR5cGU9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJGaW5hbmNpYWxPcGVyYXRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJhbW91bnQiIHR5cGU9InhzZDpmbG9hdCIgLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldpdGhkcmF3Ij4KLQkJCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIj4KLQkJCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im1lbW8iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVwb3NpdCI+Ci0JCQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzdGF0dXMiCi0JCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5Vm9pZFJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5Vm9pZCIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ib25lV2F5UmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpvbmVXYXkiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheUhvbGRlclJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5SG9sZGVyIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczp0d29XYXlIb2xkZXIiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9InR3b1dheVJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5IiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczpSZXR1cm5UeXBlIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJpbnZva2VSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOmludm9rZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJvcCIgZWxlbWVudD0idG5zOmZpbk9wIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5PcFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJvcCIgZWxlbWVudD0idG5zOmZpbk9wUmVzcG9uc2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJEb2NMaXRXcmFwcGVkUHJveHkiPgotCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJvbmVXYXlWb2lkIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlWb2lkUmVxdWVzdCIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlSZXF1ZXN0IiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheUhvbGRlclJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOnR3b1dheVJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Imludm9rZSI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6aW52b2tlUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmZpbk9wUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZmluT3BSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCTwvd3NkbDpwb3J0VHlwZT4KLQotCTx3c2RsOmJpbmRpbmcgbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkIgotCQl0eXBlPSJ0bnM6RG9jTGl0V3JhcHBlZFByb3h5Ij4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbgotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXlIb2xkZXIiPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCi0JCTwvd3NkbDpvcGVyYXRpb24+Ci0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9InR3b1dheSI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCi0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluT3AiPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvZmluT3AiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCTwvd3NkbDpiaW5kaW5nPgotCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlIj4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6UHJveHlEb2NMaXRXcmFwcGVkIgotCQkJbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkUG9ydCI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9heGlzMi9zZXJ2aWNlcy9Qcm94eURvY0xpdFdyYXBwZWRTZXJ2aWNlL2ludm9rZSIgLz4KLQkJPC93c2RsOnBvcnQ+Ci0JPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETE11bHRpVGVzdHMud3NkbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NETE11bHRpVGVzdHMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZGQ5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExNdWx0aVRlc3RzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLQotPGRlZmluaXRpb25zIG5hbWU9IkFkZE51bWJlcnMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIKLQl4bWxuczpub3Rzb2FwPSJodHRwOi8vbm90LmEuc29hcC5hZGRyZXNzL3dzZGwvbm90c29hcC8iPgotCi0KLQk8dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIj4KLQkJCTxlbGVtZW50IG5hbWU9ImFkZE51bWJlcnNSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVycyI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHNkOmludCIgLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJBZGROdW1iZXJzRmF1bHQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iZmF1bHRJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJvbmVXYXlJbnQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYXJnMCIgdHlwZT0ieHNkOmludCIgLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCi0JCTwveHNkOnNjaGVtYT4KLQk8L3R5cGVzPgotCi0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVycyI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGROdW1iZXJzIiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczphZGROdW1iZXJzUmVzcG9uc2UiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+Ci0JCTxwYXJ0IG5hbWU9IkFkZE51bWJlcnNGYXVsdCIgZWxlbWVudD0idG5zOkFkZE51bWJlcnNGYXVsdCIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0ib25lV2F5SW50Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOm9uZVdheUludCIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc1BvcnRUeXBlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVycyIgbmFtZT0iYWRkIiAvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc1Jlc3BvbnNlIiBuYW1lPSJhZGRSZXNwb25zZSIgLz4KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiIG1lc3NhZ2U9InRuczphZGROdW1iZXJzRmF1bHQiIC8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOm9uZVdheUludCIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8cG9ydFR5cGUgbmFtZT0iQWRkTnVtYmVyc1BvcnRUeXBlT3RoZXJQVCI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnMiIG5hbWU9ImFkZCIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgbmFtZT0iYWRkUmVzcG9uc2UiIC8+Ci0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiBtZXNzYWdlPSJ0bnM6YWRkTnVtYmVyc0ZhdWx0IiAvPgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczpvbmVXYXlJbnQiIC8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JCi0JPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0JpbmRpbmciIHR5cGU9InRuczpBZGROdW1iZXJzUG9ydFR5cGUiPgotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIgotCQkJc3R5bGU9ImRvY3VtZW50IiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvZmF1bHQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiAvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNCaW5kaW5nU2FtZVBUIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc1BvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzQmluZGluZ090aGVyUFQiIHR5cGU9InRuczpBZGROdW1iZXJzUG9ydFR5cGVPdGhlclBUIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiIC8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0IiB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L2ZhdWx0PgotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJvbmVXYXlJbnQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQkKLQk8IS0tCi0JCUlNUE9SVEFOVCBOT1RFOiBUaGVzZSBwb3J0cyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNvbm5lY3RlZCB0b28hICBUaGlzIHRlc3QgaXMgc2ltcGx5IGZvcgotCQlXU0RMIHByb2Nlc3NpbmcgYW5kIFNlcnZpY2UuYWRkUG9ydCguLi4pIGFuZCBTZXJ2aWNlLmdldFBvcnQoLi4uKSB2YWxpZGF0aW9uOyBubyBhdHRlbXB0IGlzCi0JCW1hZGUgdG8gYWN0dWFsbHkgY29ubmVjdCB0byB0aGUgZW5kcG9pbnRzIGRlZmluZWQgYmVsb3c7IHRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIGFuZCBubwotCQl2YWxpZCBlbmRwb2ludCBhdCB0aG9zZSBhZGRyZXNzZXMuCQotCS0tPgotCQotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNTZXJ2aWNlMSI+Ci0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzFQMSIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMVAxIiAvPgotCQk8L3BvcnQ+Ci0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzFQMiIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMVAyIiAvPgotCQk8L3BvcnQ+Ci0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzFQMyIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMVAzIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNTZXJ2aWNlMiI+Ci0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzJQMSIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMlAxIiAvPgotCQk8L3BvcnQ+Ci0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzJQMiIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMlAyIiAvPgotCQk8L3BvcnQ+Ci0JCTxwb3J0IG5hbWU9IkFkZE51bWJlcnNQb3J0UzJQMyIgYmluZGluZz0idG5zOkFkZE51bWJlcnNCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTMlAzIiAvPgotCQk8L3BvcnQ+Ci0JCQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTMlA0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMyUDQiIC8+Ci0JCTwvcG9ydD4KLQkJCi0JPC9zZXJ2aWNlPgotCQk8c2VydmljZSBuYW1lPSJBZGROdW1iZXJzU2VydmljZTMiPgotCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMzUDEiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZ090aGVyUFQiPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMzUDEiIC8+Ci0JCTwvcG9ydD4KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTM1AyIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMzUDIiIC8+Ci0JCTwvcG9ydD4KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnRTM1AzIiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0JpbmRpbmdTYW1lUFQiPgotCQkJPG5vdHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvQWRkTnVtYmVyL0FkZE51bWJlcnNJbXBsU2VydmljZVMzUDMiIC8+Ci0JCTwvcG9ydD4KLQkJCQk8cG9ydCBuYW1lPSJBZGROdW1iZXJzUG9ydFMzUDQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+Ci0JCQk8c29hcDEyOmFkZHJlc3MKLQkJCQlsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL0FkZE51bWJlci9BZGROdW1iZXJzSW1wbFNlcnZpY2VTM1A0IiAvPgotCQk8L3BvcnQ+Ci0JCQotCTwvc2VydmljZT4KLQkKLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2NzY4NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFdTREwgZGVzY3JpcHRpb24gb2YgdGhlIFdTUyBQaW5nIGludGVyb3Agc2NlbmFyaW9zIC0tPgotCi08ZGVmaW5pdGlvbnMgbmFtZT0iRWNobyIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIgotICAgIHhtbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIgCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiCi0gICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL3dzLXBvbGljeS50ZXN0cyI+Ci0gICAgCSAgCi0gIDx0eXBlcz4KLSAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG8iPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iRWNobyIgdHlwZT0idG5zOmVjaG8iLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZSIvPgotICAgIDwvc2NoZW1hPgotICA8L3R5cGVzPgotCi0gIDxtZXNzYWdlIG5hbWU9IkVjaG9SZXF1ZXN0Ij4KLSAgICA8cGFydCBuYW1lPSJlY2hvIiBlbGVtZW50PSJ0bnM6RWNobyIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1Jlc3BvbnNlIj4KLSAgICA8cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpFY2hvUmVzcG9uc2UiLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvUG9ydCI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJFY2hvIj4KLSAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOkVjaG9SZXF1ZXN0IiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vaW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpFY2hvUmVzcG9uc2UiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9vdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvUG9ydCI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLXN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iRWNobyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIvPgotICAgICAgPGlucHV0PiAKLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLSAgIAotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InRuczpFY2hvQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvRWNob1NlcnZpY2UiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvV1NHZW5TZXJ2aWNlX3NjaGVtYTEueHNkIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTkzMzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0dlblNlcnZpY2Vfc2NoZW1hMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzZ2VuLnNhbXBsZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0gIDx4czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciIHR5cGU9Im5zMTplY2hvU3RyaW5nIiB4bWxuczpuczE9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHM6c2VxdWVuY2U+Ci0gIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiB0eXBlPSJuczI6ZWNob1N0cmluZ1Jlc3BvbnNlIiB4bWxuczpuczI9Imh0dHA6Ly93c2dlbi5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzOnNlcXVlbmNlPgotICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL3NoYXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTlkOWZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucwotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlaS5zaGFwZS5wb2x5bW9ycGhpYy5qYXh3cy5heGlzMi5hcGFjaGUub3JnIgotCXhtbG5zPSJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0JCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6dG5zPSJodHRwOi8vc2VpLnNoYXBlLnBvbHltb3JwaGljLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0JeG1sbnM6dG5zMT0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIgotCXhtbG5zOnRuczI9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciCi0JeG1sbnM6dG5zMz0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLQotCTx3c2RsOnR5cGVzPgotCSAgICA8eHNkOnNjaGVtYT4KLQkJICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciCi0JCSAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSIuLi94c2Qvc2hhcGUueHNkIi8+Ci0JCSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RocmVlZC5zaGFwZS50ZXN0Lm9yZyIKLQkJICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Ii4uL3hzZC8zRFNoYXBlLnhzZCIvPgotCQkgICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93cmFwcGVyLnNoYXBlLnRlc3Qub3JnIgotCQkgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iLi4veHNkL3NoYXBlX3dyYXBwZXJzLnhzZCIvPgotCSAgICA8L3hzZDpzY2hlbWE+Ci0JICAgIAotCTwvd3NkbDp0eXBlcz4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImRyYXczRFJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcXVlc3QiIGVsZW1lbnQ9InRuczM6ZHJhdzNEIj4KLQkJPC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJkcmF3UmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icmVxdWVzdCIgZWxlbWVudD0idG5zMzpkcmF3Ij4KLQkJPC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJkcmF3UmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InR5cGVzUU5hbWVSZXNwb25zZSIgZWxlbWVudD0idG5zMzpkcmF3UmVzcG9uc2UiPgotCQk8L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQkKLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlUG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZHJhdyI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZHJhd1JlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmRyYXdSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXczRCI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZHJhdzNEUmVxdWVzdCIgLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZHJhd1Jlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQkKLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlBvbHltb3JwaGljU2hhcGVCaW5kaW5nIiB0eXBlPSJ0bnM6UG9seW1vcnBoaWNTaGFwZVBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZHJhdyI+CQkJCi0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9kcmF3IiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImRyYXczRCI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vc2VpLnBvbHltb3JwaGljc2hhcGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9kcmF3M0QiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOmJpbmRpbmc+Ci0JCi0JPHdzZGw6c2VydmljZSBuYW1lPSJQb2x5bW9ycGhpY1NoYXBlU2VydmljZSI+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iUG9seW1vcnBoaWNTaGFwZVBvcnQiCi0JCQliaW5kaW5nPSJ0bnM6UG9seW1vcnBoaWNTaGFwZUJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjYwNjAvYXhpczIvc2VydmljZXMvUG9seW1vcnBoaWNTaGFwZVNlcnZpY2UiIC8+Ci0JCTwvd3NkbDpwb3J0PgotCTwvd3NkbDpzZXJ2aWNlPgotCQotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL2FkZG51bWJlcnN0ZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3htbC9hZGRudW1iZXJzdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzVjZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL2FkZG51bWJlcnN0ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj4NCi0gICAgICAgIDxzb2FwOkhlYWRlcj4gDQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+R29vZDE8L25zMTpteUhlYWRlcj4NCi0JCQk8bnMxOm15SGVhZGVyIHhtbG5zOm5zMT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnNoYW5kbGVyIiBzb2FwOmFjdG9yPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiPkdvb2QyPC9uczE6bXlIZWFkZXI+DQotCQkJPG5zMTpteUhlYWRlciB4bWxuczpuczE9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciIgc29hcDphY3Rvcj0iaHR0cDovL2JhZEFjdG9yIj5CYWQ8L25zMTpteUhlYWRlcj4NCi0JCTwvc29hcDpIZWFkZXI+DQotIAkJPHNvYXA6Qm9keT4gDQotCQkJPG5zMjphZGROdW1iZXJzSGFuZGxlciB4bWxuczpuczI9Imh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzaGFuZGxlciI+DQotCQkJPG5zMjphcmcwPjEwPC9uczI6YXJnMD4NCi0JCQk8bnMyOmFyZzE+MTA8L25zMjphcmcxPg0KLQkJCTwvbnMyOmFkZE51bWJlcnNIYW5kbGVyPg0KLQkJPC9zb2FwOkJvZHk+DQotCTwvc29hcDpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTdjODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL3JlZmVyZW5jZXBhcmFtZXRlcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iDQotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgIHhtbG5zOndzYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIj4NCi0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOmZhYnJpa2FtPSJodHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0iIHhtbG5zOmF4aXMyPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIj4NCi0gICAgICAgIDx3c2E6TWVzc2FnZUlEIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+DQotICAgICAgICAgICAgdXVpZDo5MjBDNTE5MC0wQjhGLTExRDktOENFRC1GMjJFREVFQkY3RTU8L3dzYTpNZXNzYWdlSUQ+DQotICAgICAgICA8d3NhOlRvIGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+aHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQ8L3dzYTpUbz4NCi0gICAgICAgIDxheGlzMjpQYXJhbU9uZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPjAxMjM0NTY3ODk8L2F4aXMyOlBhcmFtT25lPg0KLSAgICAgICAgPGF4aXMyOlBhcmFtVHdvIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0ndHJ1ZSc+QUJDREVGRzwvYXhpczI6UGFyYW1Ud28+DQotICAgICAgICA8YXhpczI6UGFyYW1UaHJlZSB3c2E6SXNSZWZlcmVuY2VQYXJhbWV0ZXI9J3RydWUnPmFiY2RlZmc8L2F4aXMyOlBhcmFtVGhyZWU+DQotICAgICAgICA8YXhpczI6UGFyYW1Gb3VyIHdzYTpJc1JlZmVyZW5jZVBhcmFtZXRlcj0nMSc+eHl6PC9heGlzMjpQYXJhbUZvdXI+DQotICAgICAgICA8d3NhOkFjdGlvbiBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPmh0dHA6Ly93cy5hcGFjaGUub3JnL3Rlc3RzL2FjdGlvbjwvd3NhOkFjdGlvbj4NCi0gICAgICAgIDx3c2E6UmVwbHlUbyBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPg0KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vZXhhbXBsZS5jb20vZmFicmlrYW0vYWNjdDwvd3NhOkFkZHJlc3M+DQotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPg0KLSAgICAgICAgICAgICAgICA8ZmFicmlrYW06Q3VzdG9tZXJLZXk+MTIzNDU2Nzg5PC9mYWJyaWthbTpDdXN0b21lcktleT4NCi0gICAgICAgICAgICAgICAgPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+DQotICAgICAgICAgICAgPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4NCi0gICAgICAgICAgICA8d3NhOk1ldGFkYXRhPg0KLSAgICAgICAgICAgICAgICA8YXhpczI6TWV0YUV4dCBheGlzMjpBdHRyRXh0PSIxMjM0NTY3ODkiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4NCi0gICAgICAgICAgICA8L3dzYTpNZXRhZGF0YT4NCi0gICAgICAgICAgICA8YXhpczI6RVBSRXh0IGF4aXMyOkF0dHJFeHQ9IjEyMzQ1Njc4OSI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+DQotICAgICAgICA8L3dzYTpSZXBseVRvPg0KLSAgICA8L3NvYXBlbnY6SGVhZGVyPg0KLSAgICA8c29hcGVudjpCb2R5Pg0KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPg0KLSAgICAgICAgICAgIDxhY2NvdW50Tm8gaHJlZj0iI2lkMCIvPg0KLSAgICAgICAgPC9uczE6Z2V0QmFsYW5jZT4NCi0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiDQotICAgICAgICAgICAgICAgIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iDQotICAgICAgICAgICAgICAgIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+DQotICAgICAgICAgICAgMTAwMTwvbXVsdGlSZWY+DQotICAgIDwvc29hcGVudjpCb2R5Pg0KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvc29hcG1lc3NhZ2UueG1sIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveG1sL3NvYXBtZXNzYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxNTZlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94bWwvc29hcG1lc3NhZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSAKLQk8IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gCi0JPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPgotIAkJPHNvYXA6Qm9keT4gCi0JCQk8bnMyOmludm9rZSB4bWxuczpuczI9Imh0dHA6Ly9vcmcudGVzdC5zb2FwbWVzc2FnZSI+PGludm9rZV9zdHI+c29tZSByZXF1ZXN0PC9pbnZva2Vfc3RyPjwvbnMyOmludm9rZT4KLQkJPC9zb2FwOkJvZHk+Ci0JPC9zb2FwOkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC8zRFNoYXBlLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC8zRFNoYXBlLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyN2IwNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2QvM0RTaGFwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCXhtbG5zOnRuczE9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyIKLQkJeG1sbnM6dG5zPSJodHRwOi8vdGhyZWVkLnNoYXBlLnRlc3Qub3JnIiAKLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIgotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90aHJlZWQuc2hhcGUudGVzdC5vcmciPgotCQkKLQkJPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2hhcGUudGVzdC5vcmciCi0JCQkgICAgc2NoZW1hTG9jYXRpb249InNoYXBlLnhzZCIgLz4KLQkJCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGhyZWVEU3F1YXJlIj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczE6U3F1YXJlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYnJlZHRoIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQotCQkKLTwveHNkOnNjaGVtYT4JCQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL2VjaG8ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzljNWIxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9lY2hvLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMKLSAgICAgdXNlZCBieSB0aGUgSkFYLUIgRGlzcGF0Y2ggdGVzdHMgLS0+Ci08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3Rlc3QiPgotICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPgotICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICA8L3M6Y29tcGxleFR5cGU+Ci0gIDwvczplbGVtZW50PgotICA8czplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgPC9zOmNvbXBsZXhUeXBlPgotICA8L3M6ZWxlbWVudD4KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3NhbXBsZW10b20ueHNkIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3NhbXBsZW10b20ueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ0MWMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zYW1wbGVtdG9tLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgeG1sbnM6dG5zPSJ1cm46Ly9tdG9tLnRlc3Qub3JnIgotICAgIHRhcmdldE5hbWVzcGFjZT0idXJuOi8vbXRvbS50ZXN0Lm9yZyI+Ci0gICAgPCEtLSBVc2UgbG9jYWwgZmlsZSBmb3Igc3BlZWQgLS0+Ci0gICAgPCEtLSA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIvPi0tPgotICAgIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0gICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0ieG1sbWltZS54c2QiLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW1hZ2VEZXBvdCI+Ci0gICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbWFnZURhdGEiIAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiCi0gICAgICAgICAgICAgICAgICAgICAgIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSJtdWx0aXBhcnQvKiIvPgotICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPgotICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRUZXh0Ij4KLSAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgIDx4czplbGVtZW50IG5pbGxhYmxlPSJmYWxzZSIgbmFtZT0iaW5wdXQiIAotICAgICAgICAgICAgICAgIHR5cGU9InhzOmJhc2U2NEJpbmFyeSIgeG1pbWU6ZXhwZWN0ZWRDb250ZW50VHlwZT0idGV4dC94bWwiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRUZXh0UmVzcG9uc2UiPgotICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im91dHB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4KLSAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZS54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkzMjQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCXhtbG5zOnRucz0iaHR0cDovL3NoYXBlLnRlc3Qub3JnIiAKLQkJeG1sbnM6amF4Yj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF4YiIgIGpheGI6dmVyc2lvbj0iMi4wIgotCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyI+Ci0JCQotCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNoYXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ4QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ5QXhpcyIgdHlwZT0ieHNkOmZsb2F0IiAvPgotCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCTwveHNkOmNvbXBsZXhUeXBlPgotCQkKLQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTcXVhcmUiID4KLQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOlNoYXBlIj4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0id2lkdGgiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCTwveHNkOmNvbXBsZXhDb250ZW50PgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCi0JCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2lyY2xlIiA+Ci0JCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpTaGFwZSI+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmFkaXVzIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpleHRlbnNpb24+Ci0JCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJPC94c2Q6Y29tcGxleFR5cGU+CQotCQkKLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc2hhcGVfd3JhcHBlcnMueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQwZjI5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zaGFwZV93cmFwcGVycy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCXhtbG5zOnRucz0iaHR0cDovL3dyYXBwZXIuc2hhcGUudGVzdC5vcmciIAotCQl4bWxuczp0bnMxPSJodHRwOi8vc2hhcGUudGVzdC5vcmciCi0JCXhtbG5zOmpheGI9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2pheGIiICBqYXhiOnZlcnNpb249IjIuMCIKLQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3JhcHBlci5zaGFwZS50ZXN0Lm9yZyI+Ci0JCQotCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zaGFwZS50ZXN0Lm9yZyIKLQkJCSAgICBzY2hlbWFMb2NhdGlvbj0ic2hhcGUueHNkIiAvPgotCQkKLQkJPHhzZDplbGVtZW50IG5hbWU9ImRyYXczRCI+Ci0JCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ0bnMxOlNoYXBlIiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOmVsZW1lbnQ+Ci0JCQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhdyI+Ci0JCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ0bnMxOlNoYXBlIiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOmVsZW1lbnQ+Ci0JCQotCQk8eHNkOmVsZW1lbnQgbmFtZT0iZHJhd1Jlc3BvbnNlIj4KLQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ0bnMxOlNoYXBlIiAvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOmVsZW1lbnQ+Ci0JCQotPC94c2Q6c2NoZW1hPgkJCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2sxLnhzZCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE0ODRlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC9zdG9jazEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFRoaXMgc2NoZW1hIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIEpBWC1CIGFydGlmYWN0cyBmb3IgdGhlIEpBWEJXcmFwcGVyVGVzdHMgLS0+Ci08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9zdG9jazEudGVzdC5vcmciCi0JeG1sbnM6dG5zPSJ1cm46Ly9zdG9jazEudGVzdC5vcmciID4KLQk8czplbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6Z2V0UHJpY2UiIC8+Ci0JPHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0UHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImZ1bmQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9ImhvbGRpbmdzLiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0ibmF2IiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPgotICAgICAgPC9zOmNvbXBsZXhDb250ZW50PgotICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAKLSAgICA8czplbGVtZW50IG5hbWU9ImdldFByaWNlUmVzcG9uc2UiIHR5cGU9InRuczpTdG9ja1ByaWNlIiAvPgotCTxzOmNvbXBsZXhUeXBlIG5hbWU9IlN0b2NrUHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPgotICAgICAgPC9zOmNvbXBsZXhDb250ZW50PgotICAgIDwvczpjb21wbGV4VHlwZT4KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3N0b2NrMi54c2QgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2syLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2OWIyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy94c2Qvc3RvY2syLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSBUaGlzIHNjaGVtYSBpcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBKQVgtQiBhcnRpZmFjdHMgZm9yIHRoZSBKQVhCV3JhcHBlclRlc3RzLS0+Ci08czpzY2hlbWEgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JdGFyZ2V0TmFtZXNwYWNlPSJ1cm46Ly9zdG9jazIudGVzdC5vcmciCi0JeG1sbnM6dG5zPSJ1cm46Ly9zdG9jazIudGVzdC5vcmciID4KLQk8czplbGVtZW50IG5hbWU9ImdldFByaWNlIiB0eXBlPSJ0bnM6Z2V0UHJpY2UiIC8+Ci0JPHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0UHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgIDwvczpyZXN0cmljdGlvbj4KLSAgICAgIDwvczpjb21wbGV4Q29udGVudD4KLSAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPHM6ZWxlbWVudCBuYW1lPSJnZXRQcmljZVJlc3BvbnNlIiB0eXBlPSJ0bnM6U3RvY2tQcmljZSIvPgotCTxzOmNvbXBsZXhUeXBlIG5hbWU9IlN0b2NrUHJpY2UiPgotICAgICAgPHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDxzOnJlc3RyaWN0aW9uIGJhc2U9InM6YW55VHlwZSI+Ci0gICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgPC9zOnJlc3RyaWN0aW9uPgotICAgICAgPC9zOmNvbXBsZXhDb250ZW50PgotICAgIDwvczpjb21wbGV4VHlwZT4KLTwvczpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3htbG1pbWUueHNkIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMveHNkL3htbG1pbWUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY5ZWRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3QtcmVzb3VyY2VzL3hzZC94bWxtaW1lLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLQotICAgVzNDIFhNTCBTY2hlbWEgZGVmaW5lZCBpbiB0aGUgRGVzY3JpYmluZyBNZWRpYSBDb250ZW50IG9mIEJpbmFyeSBEYXRhIGluIFhNTAotICAgc3BlY2lmaWNhdGlvbgotICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtbWVkaWEtdHlwZXMKLQotICAgQ29weXJpZ2h0IChDKSAyMDA1IFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gIAotICAgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEV1cm9wZWFuIFJlc2VhcmNoIENvbnNvcnRpdW0gZm9yCi0gICBJbmZvcm1hdGljcyBhbmQgTWF0aGVtYXRpY3MsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMKLSAgIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQyhSKSBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBpbiB0aGUgaG9wZSB0aGF0Ci0gICBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgCi0gICBbMV0gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQotCi0gICAkSWQ6IHhtbG1pbWUueHNkLHYgMS4xIDIwMDUvMDQvMjUgMTc6MDg6MzUgaHVnbyBFeHAgJAotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIKLSAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiID4KLQotICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlIj4KLSAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciID4KLSAgICAgIDx4czptaW5MZW5ndGggdmFsdWU9IjMiIC8+Ci0gICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgPC94czphdHRyaWJ1dGU+Ci0KLSAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHBlY3RlZENvbnRlbnRUeXBlcyIgdHlwZT0ieHM6c3RyaW5nIiAvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJiYXNlNjRCaW5hcnkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiID4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJoZXhCaW5hcnkiID4KLSAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpoZXhCaW5hcnkiID4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLSAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgPC94czpzaW1wbGVDb250ZW50PgotICA8L3hzOmNvbXBsZXhUeXBlPgotCi08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2FlNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjYuNQ0KLUNyZWF0ZWQtQnk6IDIuMyAoSUJNIENvcnBvcmF0aW9uKQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkyMzQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlR3JvdXA+Ci0gPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ic2VydmVyLkVjaG9TZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQiLz4KLSAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2VydmVyLkVjaG9TZXJ2aWNlU2tlbGV0b248L3BhcmFtZXRlcj4KLSAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiPgotICAgIDxhY3Rpb25NYXBwaW5nLz4KLSAgPC9vcGVyYXRpb24+Ci0gPC9zZXJ2aWNlPgotPC9zZXJ2aWNlR3JvdXA+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXJEaXNhYmxlU3RyZWFtaW5nVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kYXRhc291cmNlL2pheGIvSkFYQkN1c3RvbUJ1aWxkZXJEaXNhYmxlU3RyZWFtaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmMzkyZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGF0YXNvdXJjZS9qYXhiL0pBWEJDdXN0b21CdWlsZGVyRGlzYWJsZVN0cmVhbWluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiAgICAgIA0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ29uc3RhbnRzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uTG9jYXRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdCB0aGF0IHRoZSBKQVhCIFBheWxvYWQgc3RyZWFtaW5nIGNhbiBiZSBkaXNhYmxlZC4gDQotICovDQotcHVibGljIGNsYXNzIEpBWEJDdXN0b21CdWlsZGVyRGlzYWJsZVN0cmVhbWluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVKQVhCUGF5bG9hZFN0cmVhbWluZygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqYXhiRFNDID0gbmV3IEpBWEJEU0NvbnRleHQobnVsbCwgbnVsbCk7DQotICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqYXhiQ0IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamF4YkRTQyk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIC8vIERpc2FibGUgdGhlIEpBWEIgUGF5bG9hZCBzdHJlYW1pbmcNCi0gICAgICAgIG1zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfRU5BQkxFX0pBWEJfUEFZTE9BRF9TVFJFQU1JTkcsIG5ldyBCb29sZWFuKGZhbHNlKSk7DQotICAgICAgICBqYXhiRFNDLnNldE1lc3NhZ2VDb250ZXh0KG1zZ0N0eCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGFzc2VydE51bGwoamF4YkNCLmNyZWF0ZSgibnMiLCAibHAiLCBudWxsLCBuZXcgTW9ja1hNTFN0cmVhbVJlYWRlcigpLCBudWxsKSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFNpbmNlIHdlIGRpZG4ndCBzZXQgdXAgdGhlIEpBWEJEU0NvbnRleHQgZnVsbHksIGlmIHRoZSBkaXNhYmxpbmcgb2YgaXQgZGlkbid0DQotICAgICAgICAgICAgLy8gd29yaywgdGhlbiB3ZSdsbCBnZXQgc29tZSBzb3J0IG9mIGV4Y2VwdGlvbi4NCi0gICAgICAgICAgICBmYWlsKCJKQVhCIFBheWxvYWQgc3RyZWFtaW5nIHdhcyBub3QgZGlzYWJsZWQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRKQVhCUGF5bG9hZFN0cmVhbWluZygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqYXhiRFNDID0gbmV3IEpBWEJEU0NvbnRleHQobnVsbCwgbnVsbCk7DQotICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqYXhiQ0IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamF4YkRTQyk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIC8vIERvIE5PVCBEaXNhYmxlIHRoZSBKQVhCIFBheWxvYWQgc3RyZWFtaW5nOyB0aGUgZGVmYXVsdCBzaG91bGQgYmUgT04NCi0gICAgICAgIC8vIG1zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfRU5BQkxFX0pBWEJfUEFZTE9BRF9TVFJFQU1JTkcsIG5ldyBCb29sZWFuKGZhbHNlKSk7DQotICAgICAgICBqYXhiRFNDLnNldE1lc3NhZ2VDb250ZXh0KG1zZ0N0eCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGpheGJDQi5jcmVhdGUoIm5zIiwgImxwIiwgbnVsbCwgbmV3IE1vY2tYTUxTdHJlYW1SZWFkZXIoKSwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiSkFYQiBQYXlsb2FkIHN0cmVhbWluZyBkZWZhdWx0IHdhcyBub3QgZW5hYmxlZCIpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgNCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBkaWRuJ3Qgc2V0IHVwIHRoZSBKQVhCRFNDb250ZXh0IGZ1bGx5LCBpZiB0aGUgZGlzYWJsaW5nIG9mIGl0IGRpZG4ndA0KLSAgICAgICAgICAgIC8vIHdvcmssIHRoZW4gd2UnbGwgZ2V0IHNvbWUgc29ydCBvZiBleGNlcHRpb24uDQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgDQotICAgIGNsYXNzIE1vY2tYTUxTdHJlYW1SZWFkZXIgaW1wbGVtZW50cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciB7DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXRBdHRyaWJ1dGVDb3VudCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIHMsIFN0cmluZyBzMSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcykgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBJVGFyZ2V0KCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBjaGFyW10gZ2V0VGV4dENoYXJhY3RlcnMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldFRleHRDaGFyYWN0ZXJzKGludCBpLCBjaGFyW10gYWMsIGludCBqLCBpbnQgaykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1RleHQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIDA7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgaW50IG5leHRUYWcoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IGksIFN0cmluZyBzLCBTdHJpbmcgczEpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9Qcm94eUFjdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9Qcm94eUFjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNWQwMDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvUHJveHlBY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LkludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5UZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci0KLS8qKgotICogVGhpcyBzdWl0ZSBvZiB0ZXN0cyBpcyBmb3IgdGhlIEFjdGlvbiBhbm5vdGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUFjdGlvblRlc3RzIGV4dGVuZHMgSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnMgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24iOwotICAgIAotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIFdTLUFkZHJlc3NpbmcgRGVmYXVsdCBBY3Rpb24gUGF0dGVybiBpcyB1c2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FjdGlvbkFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eUFkZHJlc3NpbmdTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0gICAgICAgIAotICAgICAgICBwcm94eS5kb1NvbWV0aGluZygiMTIzNDUiKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSByZXF1ZXN0LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvZC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZG9Tb21ldGhpbmdSZXF1ZXN0IiwgYXhpc09wZXJhdGlvbi5nZXRPdXRwdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZG9Tb21ldGhpbmdSZXNwb25zZSIsIGF4aXNPcGVyYXRpb24uZ2V0SW5wdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvYWRkcmVzc2luZy9hY3Rpb24vU2VydmljZTEvZG9Tb21ldGhpbmcvRmF1bHQvVGVzdEV4Y2VwdGlvbiIsIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCB0aGUgdXNlIG9mIHRoZSBBY3Rpb24gYW5ub3RhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aW9uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlBZGRyZXNzaW5nU2VydmljZSIpKTsKLSAgICAgICAgUHJveHlBZGRyZXNzaW5nU2VydmljZVdpdGhBY3Rpb24gcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eUFkZHJlc3NpbmdTZXJ2aWNlV2l0aEFjdGlvbi5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9kID0gcmVxdWVzdC5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb2QuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0L2lucHV0IiwgYXhpc09wZXJhdGlvbi5nZXRPdXRwdXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3Qvb3V0cHV0IiwgYXhpc09wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC9mYXVsdCIsIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oKSk7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKG5hbWU9IlNlcnZpY2UxIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGludGVyZmFjZSBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Tb21ldGhpbmcoU3RyaW5nIGlkKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKG5hbWU9IlNlcnZpY2UyIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGludGVyZmFjZSBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlV2l0aEFjdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBAQWN0aW9uKGlucHV0PSJodHRwOi8vdGVzdC9pbnB1dCIsIG91dHB1dD0iaHR0cDovL3Rlc3Qvb3V0cHV0IiwKLSAgICAgICAgICAgICAgICBmYXVsdD17IEBGYXVsdEFjdGlvbihjbGFzc05hbWU9VGVzdEV4Y2VwdGlvbi5jbGFzcywgdmFsdWU9Imh0dHA6Ly90ZXN0L2ZhdWx0IikgfSkgICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Tb21ldGhpbmcoU3RyaW5nIGlkKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbjsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBXZWJGYXVsdChuYW1lPSJUZXN0RXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlPW5zKQotICAgIGNsYXNzIFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlsc1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL0VuZHBvaW50UmVmZXJlbmNlVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJjODg5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL3V0aWwvRW5kcG9pbnRSZWZlcmVuY2VVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7DQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50Ow0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgdGVzdHMgdGhlIGVucG9pbnQgcmVmZXJlbmNlIGNsYXNzZXMgdXNlZCBpbiB0aGUgSkFYLVdTIDIuMSBBUEkuDQotICovDQotcHVibGljIGNsYXNzIEVuZHBvaW50UmVmZXJlbmNlVXRpbHNUZXN0cyBleHRlbmRzIFhNTFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT01GYWN0b3J5IE9NRiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBFTEVNRU5UMjAwNTA4ID0NCi0gICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCAiRW5kcG9pbnRSZWZlcmVuY2UiLCAid3NhIik7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlQyMDA0MDggPQ0KLSAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVQUjIwMDUwOCA9DQotICAgICI8d3NhOkVuZHBvaW50UmVmZXJlbmNlIHhtbG5zOmF4aXMyPVwiaHR0cDovL3dzLmFwYWNoZS5vcmcvbmFtZXNwYWNlcy9heGlzMlwiIHhtbG5zOndzYT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ1wiIGF4aXMyOkF0dHJFeHQ9XCIxMjM0NTY3ODlcIj4iKw0KLSAgICAgICAgIjx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4iKw0KLSAgICAgICAgIjx3c2E6UmVmZXJlbmNlUGFyYW1ldGVycyB4bWxuczpmYWJyaWthbT1cImh0dHA6Ly9leGFtcGxlLmNvbS9mYWJyaWthbVwiPiIrDQotICAgICAgICAgICAgIjxmYWJyaWthbTpDdXN0b21lcktleT4xMjM0NTY3ODk8L2ZhYnJpa2FtOkN1c3RvbWVyS2V5PiIrDQotICAgICAgICAgICAgIjxmYWJyaWthbTpTaG9wcGluZ0NhcnQ+QUJDREVGRzwvZmFicmlrYW06U2hvcHBpbmdDYXJ0PiIrDQotICAgICAgICAiPC93c2E6UmVmZXJlbmNlUGFyYW1ldGVycz4iKw0KLSAgICAgICAgIjx3c2E6TWV0YWRhdGE+IisNCi0gICAgICAgICAgICAiPGF4aXMyOk1ldGFFeHQgYXhpczI6QXR0ckV4dD1cIjEyMzQ1Njc4OVwiPjEyMzQ1Njc4OTwvYXhpczI6TWV0YUV4dD4iKw0KLSAgICAgICAgIjwvd3NhOk1ldGFkYXRhPiIrDQotICAgICAgICAiPGF4aXMyOkVQUkV4dCBheGlzMjpBdHRyRXh0PVwiMTIzNDU2Nzg5XCI+MTIzNDU2Nzg5PC9heGlzMjpFUFJFeHQ+IisNCi0gICAgIjwvd3NhOkVuZHBvaW50UmVmZXJlbmNlPiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBSMjAwNDA4ID0NCi0gICAgIjx3c2E6RW5kcG9pbnRSZWZlcmVuY2UgeG1sbnM6YXhpczI9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyXCIgeG1sbnM6d3NhPVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nXCIgYXhpczI6QXR0ckV4dD1cIjEyMzQ1Njc4OVwiPiIrDQotICAgICAgICAiPHdzYTpBZGRyZXNzPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPiIrDQotICAgICAgICAiPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzIHhtbG5zOmZhYnJpa2FtPVwiaHR0cDovL2V4YW1wbGUuY29tL2ZhYnJpa2FtXCI+IisNCi0gICAgICAgICAgICAiPGZhYnJpa2FtOkN1c3RvbWVyS2V5PjEyMzQ1Njc4OTwvZmFicmlrYW06Q3VzdG9tZXJLZXk+IisNCi0gICAgICAgICAgICAiPGZhYnJpa2FtOlNob3BwaW5nQ2FydD5BQkNERUZHPC9mYWJyaWthbTpTaG9wcGluZ0NhcnQ+IisNCi0gICAgICAgICI8L3dzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPiIrDQotICAgICAgICAiPHdzYTpQb3J0VHlwZT5heGlzMjpKYW5lPC93c2E6UG9ydFR5cGU+IisNCi0gICAgICAgICI8d3NhOlNlcnZpY2VOYW1lIFBvcnROYW1lPVwiRnJlZFwiPmF4aXMyOkpvaG48L3dzYTpTZXJ2aWNlTmFtZT4iKw0KLSAgICAgICAgIjxheGlzMjpFUFJFeHQgYXhpczI6QXR0ckV4dD1cIjEyMzQ1Njc4OVwiPjEyMzQ1Njc4OTwvYXhpczI6RVBSRXh0PiIrDQotICAgICI8L3dzYTpFbmRwb2ludFJlZmVyZW5jZT4iOw0KLSAgICANCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlVXRpbHNUZXN0cyhTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgc3VwZXIobmFtZSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMDA1MDhDb252ZXJzaW9uU3RhcnRpbmdGcm9tQXhpczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBwYXJzZXIgPQ0KLSAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKEVQUjIwMDUwOCkpOw0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIocGFyc2VyKTsNCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKG9tRWxlbWVudCk7DQotICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9DQotICAgICAgICAgICAgKFczQ0VuZHBvaW50UmVmZXJlbmNlKSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIEZpbmFsLldTQV9OQU1FU1BBQ0UpOw0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBqYXh3c0VQUi50b1N0cmluZygpKTsNCi0gICAgIA0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJSZXN1bHQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY3JlYXRlQXhpczJFbmRwb2ludFJlZmVyZW5jZSgiIik7DQotICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJSZXN1bHQsIGpheHdzRVBSKTsNCi0gICAgICAgIE9NRWxlbWVudCBlcHJFbGVtZW50ID0NCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci50b09NKE9NRiwgYXhpczJSZXN1bHQsIEVMRU1FTlQyMDA1MDgsIGFkZHJlc3NpbmdOYW1lc3BhY2UpOw0KLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBlcHJFbGVtZW50LnRvU3RyaW5nKCkpOw0KLSAgICB9DQotICAgIA0KLS8vIEZJWE1FOiBCcmVha3MgaW4gSkRLMS42IGFzIGl0IHBpY2tzIHVwIFczQ0VuZHBvaW50UmVmZXJlbmNlIGNsYXNzIGZyb20gdGhlIEpESyAgICANCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0MjAwNTA4Q29udmVyc2lvblN0YXJ0aW5nRnJvbUpBWFdTKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotLy8gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWMgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotLy8gICAgICAgIGRiZmFjLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLS8vICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRiZmFjLm5ld0RvY3VtZW50QnVpbGRlcigpOw0KLS8vICAgICAgICBEb2N1bWVudCBqYXh3c0RvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoRVBSMjAwNTA4KSkpOw0KLS8vICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShqYXh3c0RvYyk7DQotLy8gICAgICAgIA0KLS8vICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZSBqYXh3c0VQUiA9IG5ldyBXM0NFbmRwb2ludFJlZmVyZW5jZShzb3VyY2UpOw0KLS8vICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9DQotLy8gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNyZWF0ZUF4aXMyRW5kcG9pbnRSZWZlcmVuY2UoIiIpOw0KLS8vICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSA9IEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydFRvQXhpczIoYXhpczJFUFIsIGpheHdzRVBSKTsNCi0vLyAgICAgICAgT01FbGVtZW50IGVwckVsZW1lbnQgPQ0KLS8vICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUYsIGF4aXMyRVBSLCBFTEVNRU5UMjAwNTA4LCBhZGRyZXNzaW5nTmFtZXNwYWNlKTsNCi0vLyAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBlcHJFbGVtZW50LnRvU3RyaW5nKCkpOw0KLS8vDQotLy8gICAgICAgIFczQ0VuZHBvaW50UmVmZXJlbmNlIGpheHdzUmVzdWx0ID0NCi0vLyAgICAgICAgICAgIChXM0NFbmRwb2ludFJlZmVyZW5jZSkgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKGF4aXMyRVBSLCBGaW5hbC5XU0FfTkFNRVNQQUNFKTsNCi0vLyAgICAgICAgYXNzZXJ0WE1MRXF1YWwoRVBSMjAwNTA4LCBqYXh3c1Jlc3VsdC50b1N0cmluZygpKTsNCi0vLyAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MjAwNDA4Q29udmVyc2lvblN0YXJ0aW5nRnJvbUF4aXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0NCi0gICAgICAgICAgICBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IFN0cmluZ1JlYWRlcihFUFIyMDA0MDgpKTsNCi0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHBhcnNlcik7DQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgYXhpczJFUFIgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShvbUVsZW1lbnQpOw0KLSAgICAgICAgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIGpheHdzRVBSID0NCi0gICAgICAgICAgICAoU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlKSBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoYXhpczJFUFIsIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7DQotICAgICAgICBhc3NlcnRYTUxFcXVhbChFUFIyMDA0MDgsIGpheHdzRVBSLnRvU3RyaW5nKCkpOw0KLSAgICAgDQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMlJlc3VsdCA9DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0VG9BeGlzMihheGlzMlJlc3VsdCwgamF4d3NFUFIpOw0KLSAgICAgICAgT01FbGVtZW50IGVwckVsZW1lbnQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBheGlzMlJlc3VsdCwgRUxFTUVOVDIwMDQwOCwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICBhc3NlcnRYTUxFcXVhbChFUFIyMDA0MDgsIGVwckVsZW1lbnQudG9TdHJpbmcoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QyMDA0MDhDb252ZXJzaW9uU3RhcnRpbmdGcm9tSkFYV1MoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWMgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICBkYmZhYy5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0gICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZGJmYWMubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQotICAgICAgICBEb2N1bWVudCBqYXh3c0RvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoRVBSMjAwNDA4KSkpOw0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoamF4d3NEb2MpOw0KLSAgICAgICAgDQotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NFUFIgPSBuZXcgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlKHNvdXJjZSk7DQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBheGlzMkVQUiA9DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsNCi0gICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlID0gRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0VG9BeGlzMihheGlzMkVQUiwgamF4d3NFUFIpOw0KLSAgICAgICAgT01FbGVtZW50IGVwckVsZW1lbnQgPQ0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBheGlzMkVQUiwgRUxFTUVOVDIwMDQwOCwgYWRkcmVzc2luZ05hbWVzcGFjZSk7DQotICAgICAgICBhc3NlcnRYTUxFcXVhbChFUFIyMDA0MDgsIGVwckVsZW1lbnQudG9TdHJpbmcoKSk7DQotDQotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UgamF4d3NSZXN1bHQgPQ0KLSAgICAgICAgICAgIChTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2UpIEVuZHBvaW50UmVmZXJlbmNlVXRpbHMuY29udmVydEZyb21BeGlzMihheGlzMkVQUiwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgIGFzc2VydFhNTEVxdWFsKEVQUjIwMDQwOCwgamF4d3NSZXN1bHQudG9TdHJpbmcoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlcygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRGcm9tQXhpczIoKEVuZHBvaW50UmVmZXJlbmNlKSBudWxsLCBGaW5hbC5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUuIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL3Bhc3MNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKChFbmRwb2ludFJlZmVyZW5jZSkgbnVsbCwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUuIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL3Bhc3MNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jb252ZXJ0RnJvbUF4aXMyKChFbmRwb2ludFJlZmVyZW5jZSkgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBmYWlsdXJlLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy9wYXNzDQotICAgICAgICB9DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGF4aXMyRVBSID0NCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VVdGlscy5jcmVhdGVBeGlzMkVuZHBvaW50UmVmZXJlbmNlKCIiKTsNCi0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZVV0aWxzLmNvbnZlcnRUb0F4aXMyKGF4aXMyRVBSLCBudWxsKTsNCi0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIGZhaWx1cmUuIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvL3Bhc3MNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL1JlZmVyZW5jZVBhcmFtZXRlckxpc3RUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvdXRpbC9SZWZlcmVuY2VQYXJhbWV0ZXJMaXN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwMjVjZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy91dGlsL1JlZmVyZW5jZVBhcmFtZXRlckxpc3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLnV0aWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7DQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VQYXJhbWV0ZXJMaXN0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VGaWxlTmFtZSA9ICJ4bWwvcmVmZXJlbmNlcGFyYW1ldGVycy54bWwiOw0KLSAgICBwcml2YXRlIFNPQVBIZWFkZXIgaGVhZGVyOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgRmlsZSByZXNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsIHJlc291cmNlRmlsZU5hbWUpOw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEZpbGVSZWFkZXIocmVzb3VyY2VGaWxlKSk7DQotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHBhcnNlciwgbnVsbCk7DQotICAgICAgICBoZWFkZXIgPSAoKFNPQVBFbnZlbG9wZSlidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpKS5nZXRIZWFkZXIoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVBhcmFtZXRlckxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIExpc3Q8RWxlbWVudD4gZW1wdHlMaXN0ID0gbmV3IFJlZmVyZW5jZVBhcmFtZXRlckxpc3QoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZW1wdHlMaXN0LmlzRW1wdHkoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZW1wdHlMaXN0LnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIFNldDxTdHJpbmc+cmVzdWx0cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsNCi0gICAgICAgIHJlc3VsdHMuYWRkKCIwMTIzNDU2Nzg5Iik7DQotICAgICAgICByZXN1bHRzLmFkZCgiQUJDREVGRyIpOw0KLSAgICAgICAgcmVzdWx0cy5hZGQoImFiY2RlZmciKTsNCi0gICAgICAgIHJlc3VsdHMuYWRkKCJ4eXoiKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxFbGVtZW50PiBycExpc3QgPSBuZXcgUmVmZXJlbmNlUGFyYW1ldGVyTGlzdChoZWFkZXIpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UocnBMaXN0LmlzRW1wdHkoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0cy5zaXplKCksIHJwTGlzdC5zaXplKCkpOw0KLQ0KLSAgICAgICAgZm9yIChFbGVtZW50IHJwIDogcnBMaXN0KSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcnAuZ2V0VGV4dENvbnRlbnQoKTsNCi0gICAgICAgICAgICBpZiAocmVzdWx0cy5jb250YWlucyh2YWx1ZSkpIHsNCi0gICAgICAgICAgICAgICAgcmVzdWx0cy5yZW1vdmUodmFsdWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiVmFsdWUgbm90IHJlY29nbml6ZWQ6ICIgKyB2YWx1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0cy5zaXplKCkpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hdHRhY2htZW50cy9NVE9NU2VyaWFsaXphdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvYXR0YWNobWVudHMvTVRPTVNlcmlhbGl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWYwN2IxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hdHRhY2htZW50cy9NVE9NU2VyaWFsaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmF0dGFjaG1lbnRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5sbG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLkpBWEJCbG9ja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaS5EYXRhU291cmNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci1pbXBvcnQgb3JnLnRlc3QubXRvbS5JbWFnZURlcG90OwotaW1wb3J0IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcudGVzdC5tdG9tLlNlbmRJbWFnZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOwotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgTVRPTVNlcmlhbGl6YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgRGF0YVNvdXJjZSBpbWFnZURTOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvIisidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJpbWFnZSI7Ci0gICAgICAgIAotICAgICAgICAvL0NyZWF0ZSBhIERhdGFTb3VyY2UgZnJvbSBhbiBpbWFnZSAKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VSZXNvdXJjZURpcitGaWxlLnNlcGFyYXRvcisidGVzdC5qcGciKTsKLSAgICAgICAgSW1hZ2VJbnB1dFN0cmVhbSBmaWlzID0gbmV3IEZpbGVJbWFnZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICBJbWFnZSBpbWFnZSA9IEltYWdlSU8ucmVhZChmaWlzKTsKLSAgICAgICAgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsInRlc3QuanBnIixpbWFnZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNVE9NU2VyaWFsaXphdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFNpbXVsYXRlIGJ1aWxkaW5nIHVwIGFuIE9NIHRoYXQgaXMgc291cmNlZCBmcm9tIEpBWEIgYW5kIGNvbnRhaW5zCi0gICAgICogYmluYXJ5IGRhdGEgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIHdoZW4gc2VyaWFsaXplZC4gIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbk9NU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gY3JlYXRlUGF5bG9hZCgpOwotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICBmb3JtYXQuc2V0U09BUDExKHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBwYXlsb2FkLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgZm9ybWF0KTsKLQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhiYW9zLnRvU3RyaW5nKCkpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFNpbXVsYXRlIGJ1aWxkaW5nIHVwIGFuIE9NIFNPQVBFbnZlbG9wZSB0aGF0IGhhcyB0aGUgY29udGVudHMgb2YKLSAgICAgKiB0aGUgYm9keSBzb3VyY2VkIGZyb20gSkFYQiBhbmQgY29udGFpbnMgYmluYXJ5IGRhdGEgdGhhdCBzaG91bGQgYmUgCi0gICAgICogb3B0aW1pemVkIHdoZW4gc2VyaWFsaXplZC4gIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwT01TZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVQYXlsb2FkKCk7Ci0gICAgICAgIAotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGZhY3RvcnkuY3JlYXRlU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBmYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KGVudik7Ci0gICAgICAgIAotICAgICAgICBib2R5LmFkZENoaWxkKHBheWxvYWQpOwotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICBmb3JtYXQuc2V0U09BUDExKHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBmb3JtYXQpOwotCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKGJhb3MudG9TdHJpbmcoKSk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXR0YWNobWVudFdyaXRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJ0ZXN0OiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7Ci0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIC8vSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoIm9yZy50ZXN0Lm10b20iKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoU2VuZEltYWdlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy9DcmVhdGUgYSByZXF1ZXN0IGJlYW4gd2l0aCBpbWFnZWRlcG90IGJlYW4gYXMgdmFsdWUKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZVNlbmRJbWFnZSgpOwotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOwotICAgICAgICAKLSAgICAgICAgQmxvY2tGYWN0b3J5IGJsa0ZhY3RvcnkgPSAoSkFYQkJsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gYmxrRmFjdG9yeS5jcmVhdGVGcm9tKHJlcXVlc3QsIGNvbnRleHQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbXNnRmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IG1zZ0ZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICBtc2cuc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIG1zZy5zZXRNVE9NRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwT00gPSAoU09BUEVudmVsb3BlKSBtc2cuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICBmb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsKLSAgICAgICAgZm9ybWF0LnNldFNPQVAxMSh0cnVlKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgc29hcE9NLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgZm9ybWF0KTsKLSAgICAgICAgU3RyaW5nIG91dHB1dFRleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXR0YWNobWVudCBpcyBzZXJpYWxpemVkCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0VGV4dC5pbmRleE9mKCJDb250ZW50LVR5cGU6IGltYWdlL2pwZWciKSA+IDApOwotCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG91dHB1dFRleHQpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUF0dGFjaG1lbnRXcml0ZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoInRlc3Q6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy9DcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoaW1hZ2VEUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbgotICAgICAgICBJbWFnZURlcG90IGltYWdlRGVwb3QgPSBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsKLSAgICAgICAgaW1hZ2VEZXBvdC5zZXRJbWFnZURhdGEoZGF0YUhhbmRsZXIpOwotICAgICAgICAKLSAgICAgICAgLy9KQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgib3JnLnRlc3QubXRvbSIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChTZW5kSW1hZ2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvL0NyZWF0ZSBhIHJlcXVlc3QgYmVhbiB3aXRoIGltYWdlZGVwb3QgYmVhbiBhcyB2YWx1ZQotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBTZW5kSW1hZ2UgcmVxdWVzdCA9IGZhY3RvcnkuY3JlYXRlU2VuZEltYWdlKCk7Ci0gICAgICAgIHJlcXVlc3Quc2V0SW5wdXQoaW1hZ2VEZXBvdCk7Ci0gICAgICAgIAotICAgICAgICBCbG9ja0ZhY3RvcnkgYmxrRmFjdG9yeSA9IChKQVhCQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBibGtGYWN0b3J5LmNyZWF0ZUZyb20ocmVxdWVzdCwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtc2dGYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gbXNnRmFjdG9yeS5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIG1zZy5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgbXNnLnNldE1UT01FbmFibGVkKHRydWUpOwotICAgICAgICAKLSAgICAgICAgLy8gQ29udmVydCBtZXNzYWdlIHRvIFNBQUogdG8gc2ltdWxhdGUgYW4gb3V0Ym91bmQgaGFuZGxlcgotICAgICAgICBtc2cuZ2V0QXNTT0FQTWVzc2FnZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gTm93IGNvbnZlcnQgaXQgYmFjayB0byBBWElPTQotICAgICAgICAKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBPTSA9IChTT0FQRW52ZWxvcGUpIG1zZy5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICBmb3JtYXQuc2V0U09BUDExKHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBzb2FwT00uc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBmb3JtYXQpOwotICAgICAgICBTdHJpbmcgb3V0cHV0VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBhdHRhY2htZW50IGlzIHNlcmlhbGl6ZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRUZXh0LmluZGV4T2YoIkNvbnRlbnQtVHlwZTogaW1hZ2UvanBlZyIpID4gMCk7Ci0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcob3V0cHV0VGV4dCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZVBheWxvYWQoKSB7Ci0gICAgICAgIC8vQ3JlYXRlIGEgRGF0YUhhbmRsZXIgd2l0aCB0aGUgU3RyaW5nIERhdGFTb3VyY2Ugb2JqZWN0Ci0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGltYWdlRFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgidXJuOi8vbXRvbS50ZXN0Lm9yZyIsICJtdG9tIik7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgc2VuZEltYWdlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic2VuZEltYWdlIiwgb21Ocyk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgaW5wdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJpbnB1dCIsIG9tTnMpOwotICAgICAgICBzZW5kSW1hZ2UuYWRkQ2hpbGQoaW5wdXQpOwotICAgICAgICAKLSAgICAgICAgT01FbGVtZW50IGltYWdlRGF0YSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImltYWdlRGF0YSIsIG9tTnMpOwotICAgICAgICBpbnB1dC5hZGRDaGlsZChpbWFnZURhdGEpOwotICAgICAgICAKLSAgICAgICAgT01UZXh0IGJpbmFyeURhdGEgPSBmYWMuY3JlYXRlT01UZXh0KGRhdGFIYW5kbGVyLCB0cnVlKTsKLSAgICAgICAgaW1hZ2VEYXRhLmFkZENoaWxkKGJpbmFyeURhdGEpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNlbmRJbWFnZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9NdWx0aVJlZGlyZWN0aW9uQ2F0YWxvZ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL011bHRpUmVkaXJlY3Rpb25DYXRhbG9nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTIxMzAyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL011bHRpUmVkaXJlY3Rpb25DYXRhbG9nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuaW1wbC5PQVNJU0NhdGFsb2dNYW5hZ2VyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLklucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7DQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUZXN0cyB0aGUgdXNlIG9mIHRoZSBBcGFjaGUgQ29tbW9ucyBSZXNvbHZlciBBUEkgdG8gcmVzb2x2ZSBVUklzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNdWx0aVJlZGlyZWN0aW9uQ2F0YWxvZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1dTREwgPSAiL3Rlc3QtcmVzb3VyY2VzL2NhdGFsb2cvcm9vdC53c2RsIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0VTID0gIi90ZXN0LXJlc291cmNlcy9jYXRhbG9nLyI7DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lQ2F0YWxvZ1N1Y2Nlc3MoKSB7DQotCQl2ZXJpZnlTdWNjZXNzKFJPT1RfV1NETCwgVEVTVF9SRVNPVVJDRVMgKyAiYmFzaWMtY2F0YWxvZy54bWwiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dENhdGFsb2dTdWNjZXNzKCkgew0KLQkJdmVyaWZ5U3VjY2VzcyhST09UX1dTREwsIFRFU1RfUkVTT1VSQ0VTICsgInJvb3QtY2F0YWxvZy54bWwiKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE5leHRDYXRhbG9nRmFpbHVyZSgpIHsNCi0JCXZlcmlmeUZhaWx1cmUoUk9PVF9XU0RMLCBURVNUX1JFU09VUkNFUyArICJmYWlsL3Jvb3QtY2F0YWxvZy54bWwiKTsJCQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9DYXRFbnRyeUZvckZpcnN0SW1wb3J0KCkgew0KLQkJdmVyaWZ5RmFpbHVyZShST09UX1dTREwsIFRFU1RfUkVTT1VSQ0VTICsgImZhaWwvZmlyc3RJbXBvcnRGYWlsLnhtbCIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9DYXRFbnRyeUZvclNlY29uZEltcG9ydCgpIHsNCi0JCXZlcmlmeUZhaWx1cmUoUk9PVF9XU0RMLCBURVNUX1JFU09VUkNFUyArICJmYWlsL3NlY29uZEltcG9ydEZhaWwueG1sIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3ROb0NhdEVudHJ5Rm9yVGhpcmRJbXBvcnQoKSB7DQotCQl2ZXJpZnlGYWlsdXJlKFJPT1RfV1NETCwgVEVTVF9SRVNPVVJDRVMgKyAiZmFpbC90aGlyZEltcG9ydEZhaWwueG1sIik7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBFbnN1cmUgdGhhdCB0aGUgY2F0YWxvZyBpcyB1c2VkIHRvIGxvY2F0ZSBpbXBvcnRlZCByZXNvdXJjZXMuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3VjY2VzcyhTdHJpbmcgd3NkbExvY2F0aW9uLCBTdHJpbmcgY2F0YWxvZ0ZpbGUpIHsNCi0JICAgIFVSTCB1cmwgPSBnZXRVUkxGcm9tTG9jYXRpb24od3NkbExvY2F0aW9uKTsNCi0JICAgIA0KLQkgICAgdHJ5ew0KLQkJCU9BU0lTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOw0KLQkJCWNhdGFsb2dNYW5hZ2VyLnNldENhdGFsb2dGaWxlcyhnZXRVUkxGcm9tTG9jYXRpb24oY2F0YWxvZ0ZpbGUpLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgICAgIFdTREw0SldyYXBwZXIgdzRqID0gbmV3IFdTREw0SldyYXBwZXIodXJsLCBjYXRhbG9nTWFuYWdlciwgZmFsc2UsIDApOw0KLQkgICAgCURlZmluaXRpb24gd3NkbERlZiA9IHc0ai5nZXREZWZpbml0aW9uKCk7DQotCSAgICAJYXNzZXJ0Tm90TnVsbCh3c2RsRGVmKTsgICANCi0JICAgIAlRTmFtZSBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vdGVzdC9jYWxjdWxhdG9yIiwNCi0JICAgIAkJCSAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0b3JTZXJ2aWNlIiwNCi0JICAgIAkJCSAgICAgICAgICAgICAgICAgICAgICAgIiIpOw0KLQkgICAgCVBvcnRUeXBlIHBvcnRUeXBlID0gd3NkbERlZi5nZXRQb3J0VHlwZShwb3J0VHlwZU5hbWUpOw0KLQkgICAgCWFzc2VydE5vdE51bGwocG9ydFR5cGUpOw0KLQkgICAgCU9wZXJhdGlvbiBjbGVhck9wID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uKCJjbGVhciIsIG51bGwsIG51bGwpOw0KLQkgICAgCWFzc2VydE5vdE51bGwoY2xlYXJPcCk7DQotCSAgICAJSW5wdXQgY2xlYXJPcElucHV0ID0gY2xlYXJPcC5nZXRJbnB1dCgpOw0KLQkgICAgCWFzc2VydE5vdE51bGwoY2xlYXJPcElucHV0KTsNCi0JICAgIAlNZXNzYWdlIG1zZyA9IGNsZWFyT3BJbnB1dC5nZXRNZXNzYWdlKCk7DQotCSAgICAJYXNzZXJ0Tm90TnVsbChtc2cpOw0KLQkgICAgCVBhcnQgZXhwZWN0ZWRQYXJ0ID0gbXNnLmdldFBhcnQoInBhcnQxIik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChleHBlY3RlZFBhcnQpOw0KLQkgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JICAgIAllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkgICAgCWZhaWwoKTsNCi0JICAgIH0NCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBFbnN1cmUgdGhhdCB0aGUgdGVzdCBjYXNlIGlzIHZhbGlkIGJ5IGZhaWxpbmcgaW4gdGhlIGFic2VuY2Ugb2YgYSBuZWVkZWQNCi0JICogY2F0YWxvZyBlbnRyeS4NCi0JICovDQotCXByaXZhdGUgdm9pZCB2ZXJpZnlGYWlsdXJlKFN0cmluZyB3c2RsTG9jYXRpb24sIFN0cmluZyBjYXRhbG9nRmlsZSkgew0KLQkgICAgVVJMIHVybCA9IGdldFVSTEZyb21Mb2NhdGlvbih3c2RsTG9jYXRpb24pOw0KLQkgICAgDQotCSAgICB0cnl7DQotCQkJT0FTSVNDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciA9IG5ldyBPQVNJU0NhdGFsb2dNYW5hZ2VyKCk7DQotICAgICAgICAgICAgY2F0YWxvZ01hbmFnZXIuc2V0Q2F0YWxvZ0ZpbGVzKGdldFVSTEZyb21Mb2NhdGlvbihjYXRhbG9nRmlsZSkudG9TdHJpbmcoKSk7DQotCSAgICAJV1NETDRKV3JhcHBlciB3NGogPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsIGNhdGFsb2dNYW5hZ2VyLCBmYWxzZSwgMCk7DQotCSAgICAJdzRqLmdldERlZmluaXRpb24oKTsNCi0JICAgIAlmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIFdTRExFeGNlcHRpb24gZHVlIHRvIHRoZSBpbnZhbGlkIFdTREwgbG9jYXRpb24gIiANCi0JICAgICAgICAJCSsgIm5vdCByZWRpcmVjdGVkIGJ5IHRoZSBjYXRhbG9nLiIpOw0KLQkgICAgfSBjYXRjaChXU0RMRXhjZXB0aW9uIGUpIHsNCi0JICAgIAkvLyBkbyBub3RoaW5nIC0gc3VjY2Vzc2Z1bCB0ZXN0IGNhc2UNCi0JICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpew0KLQkgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCSAgICAJZmFpbCgpOw0KLQkgICAgfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogR2l2ZW4gYSBTdHJpbmcgcmVwcmVzZW50aW5nIGEgZmlsZSBsb2NhdGlvbiwgcmV0dXJuIGEgVVJMLg0KLQkgKiBAcGFyYW0gd3NkbExvY2F0aW9uDQotCSAqIEByZXR1cm4NCi0JICovDQotCXByaXZhdGUgVVJMIGdldFVSTEZyb21Mb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKSB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JICAgIHRyeSB7DQotCSAgICAJdHJ5ew0KLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLQkgICAgICAgIAl3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgd3NkbExvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgCQlmYWlsKCk7DQotICAgICAgICAJfQ0KLQkgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotCSAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOw0KLQkgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLQkgICAgICAgIGZhaWwoKTsNCi0JICAgIH0NCi0JICAgIA0KLQkgICAgcmV0dXJuIHVybDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9YTUxDYXRhbG9nVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL1hNTENhdGFsb2dUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQyM2I3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYXRhbG9nL1hNTENhdGFsb2dUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNhdGFsb2dVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVzZSBvZiB0aGUgQXBhY2hlIENvbW1vbnMgUmVzb2x2ZXIgQVBJIHRvIHJlc29sdmUgVVJJcy4KLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVNPVVJDRVMgPSAidGVzdC1yZXNvdXJjZXMvY2F0YWxvZy8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19DQVRBTE9HID0gIi8iICsgVEVTVF9SRVNPVVJDRVMgKyAiYmFzaWMtY2F0YWxvZy54bWwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQkFTRSA9IFRFU1RfUkVTT1VSQ0VTICsgImltcG9ydEJhc2UueHNkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0JBRCA9IFRFU1RfUkVTT1VSQ0VTICsgImltcG9ydEJhZC54c2QiOwkKLQotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IGFsbCB0aGUgZXhwZWN0ZWQgY29uZGl0aW9ucyBhcmUgbWV0ICh0aGUgY29udHJvbCBjYXNlKS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFJbXBvcnROb0NhdGFsb2dOb05lZWQoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShJTVBPUlRfQkFTRSk7Ci0gICAgICAgIC8vY3JlYXRlIGEgRE9NIGRvY3VtZW50Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS4KLSAgICAgICAgICAgICAgICBwYXJzZShmaWxlLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiBzY2hlbWFDb2wgPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLGZpbGUudG9VUkwoKS50b1N0cmluZygpLG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VHlwZUJ5TmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIsIlNPQVBTdHJ1Y3QiKSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRFbGVtZW50QnlOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiwiU09BUFdyYXBwZXIiKSkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBWZXJpZnkgdGhhdCB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCB3aGVuIHVzaW5nIElNUE9SVF9CQUQgaW4gdGhlIAotICAgICAqIGFic2VuY2Ugb2YgYSBDYXRhbG9nTWFuYWdlci4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFJbXBvcnRDYXRhbG9nTmVlZE5vdFByZXNlbnQoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShJTVBPUlRfQkFEKTsKLSAgICAgICAgLy9jcmVhdGUgYSBET00gZG9jdW1lbnQKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLgotICAgICAgICAgICAgICAgIHBhcnNlKGZpbGUudG9VUkwoKS50b1N0cmluZygpKTsKLQotICAgICAgICBYbWxTY2hlbWFDb2xsZWN0aW9uIHNjaGVtYUNvbCA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0gICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFDb2wucmVhZChkb2MsZmlsZS50b1VSTCgpLnRvU3RyaW5nKCksbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUeXBlQnlOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiwiU09BUFN0cnVjdCIpKSk7Ci0gICAgICAgIGFzc2VydE51bGwoc2NoZW1hLmdldEVsZW1lbnRCeU5hbWUobmV3IFFOYW1lKCJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZDIiLCJTT0FQV3JhcHBlciIpKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IGlzIHByZXNlbnQgdXNpbmcgSU1QT1JUX0JBRCBpZiB0aGUgWE1MIFJlc29sdmVyIAotICAgICAqIGlzIHVzZWQuICBUaGlzIHRlc3QgaXMgZm9yIGEgc2ltcGxlLCBzaW5nbGUtZmlsZSBjYXRhbG9nLgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUltcG9ydEJhc2ljQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb257Ci0JCU9BU0lTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotCQljYXRhbG9nTWFuYWdlci5zZXRDYXRhbG9nRmlsZXMoZ2V0VVJMRnJvbUxvY2F0aW9uKEJBU0lDX0NBVEFMT0cpLnRvU3RyaW5nKCkpOwotCQkKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoSU1QT1JUX0JBRCk7Ci0gICAgICAgIC8vY3JlYXRlIGEgRE9NIGRvY3VtZW50Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS4KLSAgICAgICAgICAgICAgICBwYXJzZShmaWxlLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29sbGVjdGlvbiBzY2hlbWFDb2wgPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICBzY2hlbWFDb2wuc2V0U2NoZW1hUmVzb2x2ZXIobmV3IENhdGFsb2dVUklSZXNvbHZlcihjYXRhbG9nTWFuYWdlcikpOwotICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gc2NoZW1hQ29sLnJlYWQoZG9jLGZpbGUudG9VUkwoKS50b1N0cmluZygpLG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VHlwZUJ5TmFtZShuZXcgUU5hbWUoImh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkMiIsIlNPQVBTdHJ1Y3QiKSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRFbGVtZW50QnlOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QyIiwiU09BUFdyYXBwZXIiKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgU3RyaW5nIHJlcHJlc2VudGluZyBhIGZpbGUgbG9jYXRpb24sIHJldHVybiBhIFVSTC4KLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgVVJMIGdldFVSTEZyb21Mb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQkgICAgCi0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9DbGllbnRDb25maWdUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9DbGllbnRDb25maWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjRkZmVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvQ2xpZW50Q29uZmlnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50Q29uZmlnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgQ2xpZW50Q29uZmlnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRXc2RsVXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgIi90ZXN0LXJlc291cmNlcy93c2RsL0JhZEVuZHBvaW50QWRkcmVzcy53c2RsIikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZSh1cmwsIG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiRWNob1NlcnZpY2UiKSk7Ci0gICAgICAgIERpc3BhdGNoIGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiRWNob1BvcnQiKSwgCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBNb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRpc3BhdGNoLmludm9rZSgiIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiB3YXNuJ3QgdGhyb3duLCB0aGVuIGl0J3MgYW4gZXJyb3IuCi0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGEgV2ViU2VydmljZUV4Y2VwdGlvbiBoZXJlLiAgQW55dGhpbmcgZWxzZQotICAgICAgICAgICAgLy8gaXMgYSBmYWlsdXJlLgotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIHRoZSBwcm9wZXIgZmF1bHQgdHlwZSB3YXMgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0ludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5NTQ4Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0ludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUaGlzIFRlc3RDYXNlIGNhbiBiZSBleHRlbmRlZCB0byB3cml0ZSBKQVgtV1MgY2xpZW50IHNpZGUgdW5pdCB0ZXN0cyB3aXRob3V0IA0KLSAqIGhhdmluZyB0byBoYXZlIGFuIGVuZC10by1lbmQgdGVzdC4gIFRoZSA8c291cmNlPlRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcjwvc291cmNlPg0KLSAqIHdpbGwgYmUgdXNlZCB0byBjYXB0dXJlIHRoZSByZXF1ZXN0LiAgDQotICovDQotcHVibGljIGNsYXNzIEludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZSBleHRlbmRzIFhNTFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3Rvcnkgb2xkRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5IG5ld0ZhY3Rvcnk7DQotICAgIHByaXZhdGUgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyOw0KLSAgICANCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlci5zZXRVcCgpOw0KLSAgICAgICAgDQotICAgICAgICBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkgaWNmID0gKEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIG9sZEZhY3RvcnkgPSBpY2Y7DQotICAgICAgICANCi0gICAgICAgIHRlc3RDb250cm9sbGVyID0gbmV3IFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgDQotICAgICAgICBuZXdGYWN0b3J5ID0gbmV3IFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkoKTsNCi0gICAgICAgIG5ld0ZhY3Rvcnkuc2V0SW52b2NhdGlvbkNvbnRyb2xsZXIodGVzdENvbnRyb2xsZXIpOw0KLSAgICAgICAgDQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuY2xhc3MsIG5ld0ZhY3RvcnkpOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsNCi0NCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5jbGFzcywgb2xkRmFjdG9yeSk7DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKSB7DQotICAgICAgICByZXR1cm4gdGVzdENvbnRyb2xsZXI7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvSW52YWxpZEVQUlRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L0ludmFsaWRFUFJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmUyNzdmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvSW52YWxpZEVQUlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogVGVzdCBmb3IgdGhlIGNvcnJlY3QgZXhjZXB0aW9ucyBpZiBhbiBpbnZhbGlkIEVQUiBpcyBzcGVjaWZpZWQuDQotICovDQotcHVibGljIGNsYXNzIEludmFsaWRFUFJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU3RyaW5nUHJvdmlkZXJTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydE5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIiwgIlNpbXBsZVByb3ZpZGVyU2VydmljZVNPQVAxMXBvcnQwIik7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIENBTk5PVF9JTkZFUl9FWENFUFRJT04gPSAiVGhlIHN5c3RlbSBjYW5ub3QgaW5mZXIgdGhlIHRyYW5zcG9ydCBpbmZvcm1hdGlvbiBmcm9tIHRoZSI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgdGhhdCB3ZSBnZXQgYSByZWFvbnNhYmx5IGRlc3JpcHRpdmUgZXhjZXB0aW9uIGlmIHRoZSBUcmFuc3BvcnRPdXQNCi0gICAgICogY2FuJ3QgYmUgZm91bmQgZm9yIGEgYmFkIEVQUiBmb3JtYXQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVQUkZvcm1hdCgpIHsNCi0gICAgICAgIFN0cmluZyBlbmRwb2ludFVybCA9ICJJbnZhbGlkX0VQUiBqbXM6L3F1ZXVlP2Rlc3RpbmF0aW9uPWptcy9Td2FwUXVldWUmY29ubmVjdGlvbkZhY3Rvcnk9am1zL1N3YXBRQ0YmdGFyZ2V0U2VydmljZT1Td2FwSk1TQmVhbiZpbml0aWFsQ29udGV4dEZhY3Rvcnk9Y29tLmlibS53ZWJzcGhlcmUubmFtaW5nLldzbkluaXRpYWxDb250ZXh0RmFjdG9yeSZqbmRpUHJvdmlkZXJVUkw9Y29yYmFsb2M6aWlvcDpzYXQuaHVyc2xleS5pYm0uY29tOjk4MTAsaWlvcDpzYXQuaHVyc2xleS5pYm0uY29tOjk4MTEiOw0KLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IGdldERpc3BhdGNoKGVuZHBvaW50VXJsKTsNCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3QgPSAiPGludm9rZT5oZWxsbyB3b3JsZDwvaW52b2tlPiI7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShyZXF1ZXN0KTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgZXhjZXB0aW9uIGZvciBpbnZhbGlkIEVQUiAiICsgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXgudG9TdHJpbmcoKS5jb250YWlucyhDQU5OT1RfSU5GRVJfRVhDRVBUSU9OKSk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgcHJpdmF0ZSBEaXNwYXRjaDxTdHJpbmc+IGdldERpc3BhdGNoKFN0cmluZyBlbmRwb2ludFVybCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlTmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZSwgbnVsbCwgZW5kcG9pbnRVcmwpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc3ZjDQotICAgICAgICAgICAgICAgIC5jcmVhdGVEaXNwYXRjaChwb3J0TmFtZSwgU3RyaW5nLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEZvcmNlIHNvYXAgYWN0aW9uIGJlY2F1c2Ugd2UgYXJlIHBhc3NpbmcganVuayBvdmVyIHRoZSB3aXJlDQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VU0VfUFJPUEVSVFksIEJvb2xlYW4uVFJVRSk7DQotICAgICAgICBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksImh0dHA6Ly9zdHJpbmdwcm92aWRlci5zYW1wbGUudGVzdC5vcmcvZWNob1N0cmluZyIpOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gZGlzcGF0Y2g7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm9wZXJ0eVZhbHVlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvUHJvcGVydHlWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTQ2ZjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9Qcm9wZXJ0eVZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBzdWl0ZSB0byB0ZXN0IHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBjbGllbnQgcmVxdWVzdC9yZXNwb25zZSBjb250ZXh0IHByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5VmFsdWVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgUHJvcGVydHlWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0SW52YWxpZENsaWVudFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOwotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0Iik7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KHBvcnRRTmFtZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIERpc3BhdGNoIGRpc3BhdGNoID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnRRTmFtZSwgU3RyaW5nLmNsYXNzLCBNb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBkaXNwYXRjaC5nZXRSZXF1ZXN0Q29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbcGFzc10gLSBleGNlcHRpb24gdGhyb3duIGFzIGV4cGVjdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFwLnB1dChCaW5kaW5nUHJvdmlkZXIuVVNFUk5BTUVfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbcGFzc10gLSBleGNlcHRpb24gdGhyb3duIGFzIGV4cGVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5QQVNTV09SRF9QUk9QRVJUWSwgbmV3IEludGVnZXIoNCkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5TRVNTSU9OX01BSU5UQUlOX1BST1BFUlRZLCAidHJ1ZSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hcC5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLCAidHJ1ZSIpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYXAucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwgbmV3IEludGVnZXIoNCkpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltwYXNzXSAtIGV4Y2VwdGlvbiB0aHJvd24gYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9SZWxlYXNlU2VydmljZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1JlbGVhc2VTZXJ2aWNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzMzkzYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1JlbGVhc2VTZXJ2aWNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uVGVzdFV0aWxzMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ2xpZW50TWV0YWRhdGFUZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFZlcmlmeSB0aGF0IHdoZW4gYSBTZXJ2aWNlIChpLmUuIGEgSkFYV1MgU2VydmljZSBEZWxlZ2F0ZSBpbnN0YW5jZSkgaXMgbm8gbG9uZ2VyIG5lZWRlZA0KLSAqIHRoZSByZXNvdXJjZXMgaXQgdXNlcyBhcmUgY2xlYW5lZCB1cCAoaS5lIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uLCBBeGlzU2VydmljZSwgZXRjKS4NCi0gKiBUaGUgcmVsZWFzZSBjYW4gYmUgZHJpdmVuIGJ5IGFuIGV4cGxpY2l0IHByb3ByaWV0YXJ5IGNhbGwgb3IgdmlhIHRoZSBmaW5hbGl6ZXIgb24gdGhlDQotICogU2VydmljZURlbGVnYXRlIHRoYXQgaXMgcnVuIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uDQotICovDQotcHVibGljIGNsYXNzIFJlbGVhc2VTZXJ2aWNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9kaXNwYXRjaC5jbGllbnQuamF4d3MuYXhpczIuYXBhY2hlLm9yZyI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotICAgIA0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGR5bmFtaWNQb3J0MSA9ICJkeW5hbWljUG9ydDEiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGJpbmRpbmdJRDEgPSBudWxsOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGVwcjEgPSBudWxsOw0KLQ0KLSAgICAvKioNCi0gICAgICogV2hlbiBhIFNlcnZpY2VEZWxlZ2F0ZSB3aWxsIG5vdCBiZSB1c2VkIGFueW1vcmUsIGEgY2xvc2UgY2FsbCBvbiBpdCBzaG91bGQgcmVsZWFzZQ0KLSAgICAgKiB0aGUgQXhpc1NlcnZpY2VzIGFuZCBzdWNoIGl0IGhvbGRzLiBWZXJpZnkgdGhpcyBmb3IgZHluYW1pYyBwb3J0cy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUmVsZWFzZUR5bmFtaWNQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSk7DQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotDQotICAgICAgICAgICAgLy8gVXNlciBpbnRlcm5hbCBzdGF0ZSB0byB2ZXJpZnkgdGhlIHBvcnQgaW5mb3JtYXRpb24gYmVmb3JlIGFuZCBhZnRlciB0aGUgY2xvc2UNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gZGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2M9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4sIGRlbGVnYXRlKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzYyk7DQotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IHN2Y0Rlc2MuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIEhhc2hNYXAgYXhpc1NlcnZpY2VzID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBheGlzU2VydmljZXMuc2l6ZSgpKTsNCi0NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotDQotICAgICAgICAgICAgYXhpc1NlcnZpY2VzID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBheGlzU2VydmljZXMuc2l6ZSgpKTsNCi0NCi0gICAgICAgICAgICBlcERlc2M9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4sIGRlbGVnYXRlKTsNCi0gICAgICAgICAgICBhc3NlcnROdWxsKGVwRGVzYyk7ICAgICAgICAgICAgICAgIA0KLQ0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdGhyb3dhYmxlICIgKyB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2ltcGxlIHRlc3QgdG8gY3JlYXRlIGEgc2VydmljZSwgYWRkIHF1aXRlIGEgZmV3IGR5bmFtaWMgcG9ydHMgdW5kZXIgaXQsIHRoZW4gcmVsZWFzZQ0KLSAgICAgKiB0aGUgc2VydmljZS4gVGhpcyB0ZXN0IGlzIG1vc3RseSBmb3IgZGVidWdnaW5nIHRoZSByZWxlYXNlIGxvZ2ljIG91dHNpZGUgdGhlIHRlc3RzIHRoYXQgDQotICAgICAqIGNyZWF0ZSBhIGxvdCBvZiBzZXJ2aWNlcyB0byB0ZXN0IGFuIE9PTSBpc24ndCBwcm9kdWNlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlUmVsZWFzZVNpbmdsZVNlcnZpY2VEZXNjcmlwdGlvblJlbGVhc2UoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0NCi0gICAgICAgICAgICBRTmFtZSBzdmNRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgZHluYW1pY1BvcnQxICsgIl8iICsgaSk7DQotICAgICAgICAgICAgICAgIHN2YzEuYWRkUG9ydChwb3J0UU4sIGJpbmRpbmdJRDEsIGVwcjEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB0aHJvd2FibGUgIiArIHQpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgYnVuY2ggb2Ygc2VydmljZXMgd2l0aCBhIGJ1bmNoIG9mIHBvcnRzIHVuZGVyIGVhY2gsIGNsb3NpbmcgdGhlIHNlcnZpY2UNCi0gICAgICogYmVmb3JlIHRoZSBuZXh0IG9uZSBpcyBjcmVhdGVkLiAgVGhpcyBzaG91bGQgcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGZvciB0aGF0IHNlcnZpY2UuICBUaGUNCi0gICAgICogbnVtYmVyIG9mIHNlcnZpY2VzIGFuZCBwb3J0cyBjcmVhdGVkIGlzIGxhcmdlIGVub3VnaCB0byBjYXVzZSBhbiBPT00gaWYgdGhlIHJlbGVhc2UgaXNuJ3QNCi0gICAgICogYmVpbmcgZG9uZSBjb3JyZWN0bHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlTXVsdGlwbGVQb3J0UmVsZWFzZUxvb3AoKSB7DQotICAgICAgICAvLyBDcmVhdGUgYSBidW5jaCBvZiBkaWZmZXJlbnQgc2VydmljZXMsIG1ha2Ugc3VyZSB0aGUgc2VydmljZSBkZXNjIGZpbmFsaXplciBpcyBjYWxsZWQNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0Lmluc3RhbGxDYWNoaW5nRmFjdG9yeSgpOw0KLQ0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFFOYW1lIHN2Y1FOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0ICsgIl8iICsgaSk7DQotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMSA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyMDA7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgZHluYW1pY1BvcnQxICsgIl9zdmNfIiArIGkgKyAiX3BvcnRfIiArIGopOw0KLSAgICAgICAgICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlLnJlbGVhc2VTZXJ2aWNlKHN2YzEpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHRocm93YWJsZSAiICsgdCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoYXQgY3JlYXRpbmcgYSBsYXJnZSBudW1iZXIgb2Ygc2VydmljZXMgYW5kIHBvcnRzLCBhbmQgdGhlbiBoYXZpbmcgdGhlbSByZWxlYXNlZCBieQ0KLSAgICAgKiB0aGUgZmluYWxpemVycyBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9ucyBkb2VzIG5vdCBwcm9kdWNlIG9uIE91dCBvZiBNZW1vcnkgRXJyb3IuDQotICAgICAqIA0KLSAgICAgKiBOT1RFOiBUaGlzIHRlc3QgaXMgZGlzYWJsZWQgYmVjYXVzZSBmb3JjaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBhbiBpbmV4YWN0IHNjaWVuY2UNCi0gICAgICogYXQgYmVzdC4gIFlvdSBjYW4gb25seSBhc2sgdGhlIEpWTSB0byBjb25zaWRlciBkb2luZyBHQywgYW5kIHRoYXQgYmVoYXZlcyBkaWZmZXJudGx5DQotICAgICAqIG9uIGRpZmZlcmVudCBKVk1TLiAgU28sIHRoZXJlJ3Mgbm8gcmVsaWFibGUgd2F5IHRvIG1ha2Ugc3VyZSB0aGlzIHRlc3QgcnVucyBvbiB2YXJpb3VzDQotICAgICAqIEpWTXMuICBTbywgaXQgaXMgZGlzYWJsZWQuICBTZWUgdGhlIHRlc3QgdGhhdCBydW5ucyBpbiBhIHNpbWlsYXIgbG9vcCBjcmVhdGluZyBsb3RzIG9mIA0KLSAgICAgKiBzZXJ2aWNlcyBhbmQgcG9ydHMsIGFuZCB0aGVuIGV4cGxpY2l0bHkgY2FsbHMgdGhlIHJlbGVzZSBtZXRob2QuICBUaGF0IHRlc3Qgc2hvdWxkIA0KLSAgICAgKiByZWxpYWJseSBhbmQgcHJlZGljdGFibHkgbm90IHByb2R1Y2UgYW4gT09NIGJlY2F1c2Ugb2YgdGhlIGV4cGxpY2l0IHJlbGVhc2UgY2FsbC4gIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgX0RJU0FCTEVEX3Rlc3RTZXJ2aWNlUmVsZWFzZVNlcnZpY2VEZXNjcmlwdGlvbkZpbmFsaXplcigpIHsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZXJ2aWNlcywgbWFrZSBzdXJlIHRoZSBzZXJ2aWNlIGRlc2MgZmluYWxpemVyIGlzIGNhbGxlZA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgZmluYWwgaW50IE1BWF9PT01fQ09VTlQgPSA1Ow0KLSAgICAgICAgICAgIGludCBvb21Db3VudFNlcnZpY2UgPSAwOw0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBpbnQgb29tQ291bnQgPSAwOw0KLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQgKyAiXyIgKyBpKTsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRpbmcgc2VydmljZSAiICsgc3ZjUU4pOw0KLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyMDA7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSArICJfc3ZjXyIgKyBpICsgIl9wb3J0XyIgKyBqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRpbmcgcG9ydCAiICsgcG9ydFFOKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIGV2ZXJ5IHNvIG9mdGVuIHRvIGdpdmUgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiA+IDApICYmIChqICUgNTApID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGF1c2luZyBwb3J0IGFkZCBmb3IgR0MgdG8gcnVuIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhdWdodCBPT00gbnVtYmVyICIgKyArK29vbUNvdW50KTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9vbUNvdW50IDw9IE1BWF9PT01fQ09VTlQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2xlZXBpbmcgdG8gYWxsb3cgZm9yIEdDIGFmdGVyIE9PTSBjYXVnaHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxNTAwMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldha2luZyB1cCBhbmQgZm9jaW5nIGdjIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2MoKSBtZXRob2QgcmV0dXJuZWQ7IGNvbnRpbnVpbmcgbG9vcCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCAoIk1heGltdW0gT09NIGNvdW50IGV4Y2VlZGVkICIgKyBNQVhfT09NX0NPVU5UKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNhbGwgcmVsZWFzZTsgdGhlIGZpbmFsaXplciBzaG91bGQgZG8gaXQNCi0vLyAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMxKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHRvIGdpdmUgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuDQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhdXNpbmcgc2VydmljZSBhZGQgZm9yIEdDIHRvIHJ1biIpOw0KLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7DQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgew0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQgU2VydmljZSBPT00gbnVtYmVyICIgKyArK29vbUNvdW50U2VydmljZSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAob29tQ291bnRTZXJ2aWNlIDw9IE1BWF9PT01fQ09VTlQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNsZWVwaW5nIHRvIGFsbG93IGZvciBHQyBhZnRlciBTZXJ2aWNlIE9PTSBjYXVnaHQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTUwMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2FraW5nIHVwIGFuZCBmb3JjaW5nIGdjIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdjKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGb3JjZWQgZ2MgY29tcGxldGUsIGNvbnRpbnVpbmcgc2VydmljZSBsb29wIik7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgKCJNYXhpbXVtIFNlcnZjaWNlIE9PTSBjb3VudCBleGNlZWRlZCAiICsgTUFYX09PTV9DT1VOVCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBmYWlsZWQsIGNhdWdodDogIiArIHQudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdGhyb3dhYmxlICIgKyB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmlmeSB0aGF0IGFmdGVyIGEgc2VydmljZSBpcyByZWxlYXNlZCwgaXQgY2FuIGJlIHJlLXVzZWQgd2l0aCB0aGUgc2FtZSBkeW5hbWljIHBvcnRzDQotICAgICAqIGJlaW5nIGFkZGVkIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VSZXVzZUR5bmFtaWNQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSk7DQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotDQotICAgICAgICAgICAgLy8gVXNlIGludGVybmFsIHN0YXRlIHRvIHZlcmlmeSBhbGwgaXMgd2VsbA0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBkZWxlZ2F0ZTEgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IGRlbGVnYXRlMS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MxKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzE9IHN2Y0Rlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOLCBkZWxlZ2F0ZTEpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjMSk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UxID0gZXBEZXNjMS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UxKTsNCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnMSA9IHN2Y0Rlc2MxLmdldEF4aXNDb25maWdDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBIYXNoTWFwIGF4aXNTZXJ2aWNlczEgPSBheGlzQ29uZmlnMS5nZXRTZXJ2aWNlcygpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBheGlzU2VydmljZXMxLnNpemUoKSk7DQotDQotICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRlbGVnYXRlLCB3aGljaCBzaG91bGQgcmVsZWFzZSByZXNvdXJjZXMgYW5kIHJlbW92ZSBvYmplY3RzIGZyb20gY2FjaGVzDQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlLnJlbGVhc2VTZXJ2aWNlKHN2YzEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMiA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICBzdmMyLmFkZFBvcnQocG9ydFFOLCBiaW5kaW5nSUQxLCBlcHIxKTsNCi0NCi0gICAgICAgICAgICAvLyBVc2UgaW50ZXJuYWwgc3RhdGUgdG8gdmVyaWZ5IGFsbCBpcyB3ZWxsOyBjb21wYXJlIHRvIHZhbHVlcyBmcm9tIHRoZSBmaXJzdCB0aW1lDQotICAgICAgICAgICAgLy8gYXJvdW5kIHRvIG1ha2Ugc3VyZSB0aGUgY2FjaGUgdmFsdWVzIGZvciB0aGluZ3MgbGlrZSB0aGUgU2VydmljZURlc2NyaXB0aW9uIGdvdCANCi0gICAgICAgICAgICAvLyBjbGVhcmVkIG91dCB3aGVuIHRoZSBsYXN0IFNlcnZpY2VEZWxlZ2F0ZSAoaW4gdGhlIHRlc3QgdGhlIG9ubHkgb25lKSByZWxlc2FlZA0KLSAgICAgICAgICAgIC8vIHRoZSByZXNvdXJjZXMuDQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIGRlbGVnYXRlMiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShkZWxlZ2F0ZTEsIGRlbGVnYXRlMik7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MyID0gZGVsZWdhdGUyLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc3ZjRGVzYzEsIHN2Y0Rlc2MyKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzI9IHN2Y0Rlc2MyLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOLCBkZWxlZ2F0ZTIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShlcERlc2MxLCBlcERlc2MyKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTIgPSBlcERlc2MyLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZTIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoYXhpc1NlcnZpY2UxLCBheGlzU2VydmljZTIpOw0KLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcyID0gc3ZjRGVzYzIuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIEhhc2hNYXAgYXhpc1NlcnZpY2VzMiA9IGF4aXNDb25maWcyLmdldFNlcnZpY2VzKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF4aXNTZXJ2aWNlczIuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHNlcnZpY2UgZnJvbSB0aGUgbWFwIGFuZCBFbmRwb2ludERlc2MgYXJlIHRoZSBzYW1lDQotICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBvbmx5IG9uZSBlbGVtZW50IGluIHRoZSBtYXAsIHdlIGNhbiBnZXQgaXQgZGlyZWN0bHkgb2ZmIHRoZSBpdGVyYXRvcg0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoYXhpc1NlcnZpY2UyLCAoKE1hcC5FbnRyeSkgYXhpc1NlcnZpY2VzMi5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRWYWx1ZSgpKTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgaWYgbXVsdGlwbGUgc2VydmljZSBhcmUgc2hhcmluZyBhIHNlcnZpY2UgZGVzY3JpcHRpb24sIHRoZSByZWxlYXNlIG9mDQotICAgICAqIHJlc291cmNlcyBkb2VzIG5vdCBoYXBwZW4gb24gdGhlIGZpcnN0IGNsb3NlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZU11bHRpcGxlUG9ydFJlbGVhc2UoKSB7DQotICAgICAgICBRTmFtZSBzdmNRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YzEgPSBTZXJ2aWNlLmNyZWF0ZShzdmNRTik7DQotICAgICAgICAgICAgU2VydmljZSBzdmMyID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLQ0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjIgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEgKyAiXzIiKTsNCi0gICAgICAgICAgICBzdmMxLmFkZFBvcnQocG9ydFFOMSxiaW5kaW5nSUQxLCBlcHIxKTsNCi0gICAgICAgICAgICBzdmMxLmFkZFBvcnQocG9ydFFOMiwgYmluZGluZ0lEMSwgZXByMSk7DQotDQotICAgICAgICAgICAgc3ZjMi5hZGRQb3J0KHBvcnRRTjEsYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgc3ZjMi5hZGRQb3J0KHBvcnRRTjIsIGJpbmRpbmdJRDEsIGVwcjEpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZDEgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZDIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2QxLCBzZDIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IHNkMS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYzIgPSBzZDIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IHN2Y0Rlc2MxLmdldEF4aXNDb25maWdDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHN2Y0Rlc2MxLCBzdmNEZXNjMik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MxX3BvcnQxID0gc3ZjRGVzYzEuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4xLCBzZDEpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjMl9wb3J0MSA9IHN2Y0Rlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QyKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzFfcG9ydDEsIGVwRGVzYzJfcG9ydDEpOw0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMxX3BvcnQxID0gZXBEZXNjMV9wb3J0MS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMyX3BvcnQxID0gZXBEZXNjMl9wb3J0MS5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoYXhpc1N2YzFfcG9ydDEsIGF4aXNTdmMyX3BvcnQxKTsNCi0NCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzFfcG9ydDIgPSBzdmNEZXNjMS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIsIHNkMSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQyID0gc3ZjRGVzYzEuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjMV9wb3J0MiwgZXBEZXNjMl9wb3J0Mik7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzFfcG9ydDIgPSBlcERlc2MxX3BvcnQyLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzJfcG9ydDIgPSBlcERlc2MyX3BvcnQyLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShheGlzU3ZjMV9wb3J0MiwgYXhpc1N2YzJfcG9ydDIpOw0KLQ0KLSAgICAgICAgICAgIC8vIEZpcnN0IGNsb3NlIHNob3VsZCBOT1QgY2xlYW51cCB0aGUgZW5kcG9pbnRzIHNpbmNlIHRoZSBvdGhlciBzZXJ2aWNlIGlzDQotICAgICAgICAgICAgLy8gc3RpbGwgdXNpbmcgdGhlbS4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MyX2FmdGVyQ2xvc2UgPSBzZDIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMiwgc3ZjRGVzYzJfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQxX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzJfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MyX3BvcnQxLCBlcERlc2MyX3BvcnQxX2FmdGVyQ2xvc2UpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlID0gDQotICAgICAgICAgICAgICAgIHN2Y0Rlc2MyX2FmdGVyQ2xvc2UuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjMl9wb3J0MiwgZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBBZGQgYSB0aGlyZCwgc2hvdWxkIHVzZSB0aGUgc2FtZQ0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMyA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICBzdmMzLmFkZFBvcnQocG9ydFFOMSxiaW5kaW5nSUQxLCBlcHIxKTsNCi0gICAgICAgICAgICBzdmMzLmFkZFBvcnQocG9ydFFOMiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDIsIHNkMyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzID0gc2QzLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzJfYWZ0ZXJDbG9zZSwgc3ZjRGVzYzMpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0MSA9IHN2Y0Rlc2MzLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QzKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzNfcG9ydDEsIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQyID0gc3ZjRGVzYzMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlKTsNCi0NCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgMm5kIGRlbGVnYXRlIGFuZCBtYWtlIHN1cmUgY2FoY2VkIG9iamVjdHMgYXJlIHN0aWxsIHRoZXJlDQotICAgICAgICAgICAgLy8gc2luY2UgdGhlcmUncyBhIDNyZCBkZWxlZ2F0ZSBub3cNCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMik7DQotDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UgPSBzZDMuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMywgc3ZjRGVzYzNfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzNfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMyk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MzX3BvcnQxLCBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlID0gDQotICAgICAgICAgICAgICAgIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgbGFzdCBkZWxlZ2F0ZSB0aGVuIHZlcmlmeSBhbGwgdGhlIHNlcnZpY2VzIGhhdmUgYmVlbiByZW1vdmVkIA0KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIA0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMzKTsNCi0gICAgICAgICAgICBIYXNoTWFwIGF4aXNTZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXhpc1NlcnZpY2VzLnNpemUoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXZpY2VVc2VBZnRlckNsb3NlKCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMxID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGR5bmFtaWNQb3J0MSk7DQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICANCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgc3ZjMS5hZGRQb3J0KHBvcnRRTiwgYmluZGluZ0lEMSwgZXByMSk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGFuIGV4Y2VwdGlvbiIpOw0KLQ0KLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgd3JvbmcgZXhjZXB0aW9uICIgKyBlKTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlY2xhcmVkX25hbWVzcGFjZVVSSSA9ICJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVjbGFyZWRfc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlQb3J0V3NkbCA9ICJDbGllbnRNZXRhZGF0YU11bHRpUG9ydC53c2RsIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxID0gInBvcnRMb2NhbFBhcnRNdWx0aTEiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIgPSAicG9ydExvY2FsUGFydE11bHRpMiI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MyA9ICJwb3J0TG9jYWxQYXJ0TXVsdGkzIjsNCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZU11bHRpcGVEZWNsYXJlZFBvcnRzKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKGRlY2xhcmVkX25hbWVzcGFjZVVSSSAsIGRlY2xhcmVkX3N2Y0xvY2FsUGFydCk7DQotICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdzZGxVUkwobXVsdGlQb3J0V3NkbCk7DQotICAgICAgICBRTmFtZSBwb3J0UU4xID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSk7DQotICAgICAgICBRTmFtZSBwb3J0UU4yID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotICAgICAgICBRTmFtZSBwb3J0UU4zID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Myk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0gICAgICAgICAgICAvLyBPcGVuIDIgc2VydmljZXMNCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YzEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHN2YzFfcG9ydDEgPSBzdmMxLmdldFBvcnQocG9ydFFOMSwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgc3ZjMV9wb3J0MiA9IHN2YzEuZ2V0UG9ydChwb3J0UU4yLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBzdmMxX3BvcnQzID0gc3ZjMS5nZXRQb3J0KHBvcnRRTjMsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHN2YzJfcG9ydDEgPSBzdmMyLmdldFBvcnQocG9ydFFOMSwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgc3ZjMl9wb3J0MiA9IHN2YzIuZ2V0UG9ydChwb3J0UU4yLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBzdmMyX3BvcnQzID0gc3ZjMi5nZXRQb3J0KHBvcnRRTjMsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotDQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDEsIHNkMik7DQotDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MxID0gc2QxLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMiA9IHNkMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gc3ZjRGVzYzEuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzEsIHN2Y0Rlc2MyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzFfcG9ydDEgPSBzdmNEZXNjMS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQxID0gc3ZjRGVzYzEuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4xLCBzZDIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjMV9wb3J0MSwgZXBEZXNjMl9wb3J0MSk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzFfcG9ydDEgPSBlcERlc2MxX3BvcnQxLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YzJfcG9ydDEgPSBlcERlc2MyX3BvcnQxLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShheGlzU3ZjMV9wb3J0MSwgYXhpc1N2YzJfcG9ydDEpOw0KLQ0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjMV9wb3J0MiA9IHN2Y0Rlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMiwgc2QxKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzJfcG9ydDIgPSBzdmNEZXNjMS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIsIHNkMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MxX3BvcnQyLCBlcERlc2MyX3BvcnQyKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjMV9wb3J0MiA9IGVwRGVzYzFfcG9ydDIuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjMl9wb3J0MiA9IGVwRGVzYzJfcG9ydDIuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGF4aXNTdmMxX3BvcnQyLCBheGlzU3ZjMl9wb3J0Mik7DQotDQotICAgICAgICAgICAgLy8gRmlyc3QgY2xvc2Ugc2hvdWxkIE5PVCBjbGVhbnVwIHRoZSBlbmRwb2ludHMgc2luY2UgdGhlIG90aGVyIHNlcnZpY2UgaXMNCi0gICAgICAgICAgICAvLyBzdGlsbCB1c2luZyB0aGVtLg0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYzJfYWZ0ZXJDbG9zZSA9IHNkMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHN2Y0Rlc2MyLCBzdmNEZXNjMl9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSA9IA0KLSAgICAgICAgICAgICAgICBzdmNEZXNjMl9hZnRlckNsb3NlLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QyKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzJfcG9ydDEsIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MyX3BvcnQyX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzJfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIsIHNkMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MyX3BvcnQyLCBlcERlc2MyX3BvcnQyX2FmdGVyQ2xvc2UpOw0KLQ0KLSAgICAgICAgICAgIC8vIEFkZCBhIHRoaXJkLCBzaG91bGQgdXNlIHRoZSBzYW1lDQotICAgICAgICAgICAgU2VydmljZSBzdmMzID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgc3ZjM19wb3J0MSA9IHN2YzMuZ2V0UG9ydChwb3J0UU4xLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBzdmMzX3BvcnQyID0gc3ZjMy5nZXRQb3J0KHBvcnRRTjIsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNkMyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjMyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZDIsIHNkMyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzID0gc2QzLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzJfYWZ0ZXJDbG9zZSwgc3ZjRGVzYzMpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0MSA9IHN2Y0Rlc2MzLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOMSwgc2QzKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKGVwRGVzYzNfcG9ydDEsIGVwRGVzYzJfcG9ydDFfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQyID0gc3ZjRGVzYzMuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjMl9wb3J0Ml9hZnRlckNsb3NlKTsNCi0NCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgMm5kIGRlbGVnYXRlIGFuZCBtYWtlIHN1cmUgY2FoY2VkIG9iamVjdHMgYXJlIHN0aWxsIHRoZXJlDQotICAgICAgICAgICAgLy8gc2luY2UgdGhlcmUncyBhIDNyZCBkZWxlZ2F0ZSBub3cNCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2Uoc3ZjMik7DQotDQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UgPSBzZDMuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMywgc3ZjRGVzYzNfYWZ0ZXJDbG9zZSk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UgPSANCi0gICAgICAgICAgICAgICAgc3ZjRGVzYzNfYWZ0ZXJDbG9zZS5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjEsIHNkMyk7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2MzX3BvcnQxLCBlcERlc2MzX3BvcnQxX2FmdGVyQ2xvc2UpOw0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlID0gDQotICAgICAgICAgICAgICAgIHN2Y0Rlc2MzX2FmdGVyQ2xvc2UuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4yLCBzZDMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoZXBEZXNjM19wb3J0MiwgZXBEZXNjM19wb3J0Ml9hZnRlckNsb3NlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgbGFzdCBkZWxlZ2F0ZSB0aGVuIHZlcmlmeSBhbGwgdGhlIHNlcnZpY2VzIGhhdmUgYmVlbiByZW1vdmVkIA0KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIA0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShzdmMzKTsNCi0gICAgICAgICAgICBIYXNoTWFwIGF4aXNTZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXhpc1NlcnZpY2VzLnNpemUoKSk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfU0VSVklDRV9XU0RMID0gIkNsaWVudE1ldGFkYXRhLndzZGwiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9TRVJWSUNFX05TID0gImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfU0VSVklDRV9MUCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlZFNlcnZpY2VSZWxlYXNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlIGdlblN2YyA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdlblN2Yyk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQgPSBnZW5TdmMuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9ydCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gVXNlciBpbnRlcm5hbCBzdGF0ZSB0byB2ZXJpZnkgdGhlIHBvcnQgaW5mb3JtYXRpb24gYmVmb3JlIGFuZCBhZnRlciB0aGUgY2xvc2UNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKGdlblN2Yyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBkZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZXBEZXNjQXJyYXk9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzY0FycmF5KTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjQXJyYXkubGVuZ3RoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gc3ZjRGVzYy5nZXRBeGlzQ29uZmlnQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgICAgICAgICAgSGFzaE1hcCBheGlzU2VydmljZXMgPSBheGlzQ29uZmlnLmdldFNlcnZpY2VzKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF4aXNTZXJ2aWNlcy5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZS5yZWxlYXNlU2VydmljZShnZW5TdmMpOw0KLQ0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXhpc1NlcnZpY2VzLnNpemUoKSk7DQotDQotICAgICAgICAgICAgZXBEZXNjQXJyYXk9IHN2Y0Rlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXBEZXNjQXJyYXkubGVuZ3RoKTsgICAgICAgICAgICAgICAgDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRTZXJ2aWNlUmVsYXNlTG9vcCgpIHsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZXJ2aWNlcywgbWFrZSBzdXJlIHRoZSBzZXJ2aWNlIGRlc2MgZmluYWxpemVyIGlzIGNhbGxlZA0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlIGdlblN2YyA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsNCi0gICAgICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQgPSBnZW5TdmMuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGUucmVsZWFzZVNlcnZpY2UoZ2VuU3ZjKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB0aHJvd2FibGUgIiArIHQpOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAvLyBVdGlsaXR5IG1ldGhvZHMNCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIC8qKg0KLSAgICAgKiBHaXZlbiBhIHNpbXBsZSBmaWxlIG5hbWUgKHdpdGggbm8gYmFzZSBkaWN0b3J5IG9yIHBhdGgpLCByZXR1cm5zIGEgVVJMIHRvIHRoZSBXU0RMIGZpbGUNCi0gICAgICogd2l0aCB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHBhdGggcHJlcGVuZGVkLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZQ0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqLw0KLSAgICBzdGF0aWMgVVJMIGdldFdzZGxVUkwoU3RyaW5nIHdzZGxGaWxlTmFtZSkgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0V3NkbExvY2F0aW9uKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBjb252ZXJ0aW5nIFdTREwgZmlsZSB0byBVUkw6ICIgKyBlLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHVybDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUHJlcGVuZHMgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCB0aGUgcGF0aCB3aGVyZSB0aGUgdGVzdCBXU0RMIGxpdmVzIHRvIGEgZmlsZW5hbWUuDQotICAgICAqIEBwYXJhbSB3c2RsRmlsZU5hbWUNCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgc3RhdGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxGaWxlTmFtZSkgew0KLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7DQotICAgICAgICBTdHJpbmcgYmFzZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKTsNCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9IGJhc2VEaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvIiArIHdzZGxGaWxlTmFtZTsNCi0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247DQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UobmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLWludGVyZmFjZSBDbGllbnRNZXRhZGF0YVBvcnRTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBzdHJpbmcpOw0KLX0NCi0NCi1AV2ViU2VydmljZUNsaWVudCgpDQotY2xhc3MgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2Ugew0KLSAgICBwdWJsaWMgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoUmVsZWFzZVNlcnZpY2VUZXN0cy5nZXRXc2RsVVJMKFJlbGVhc2VTZXJ2aWNlVGVzdHMuR0VORVJBVEVEX1NFUlZJQ0VfV1NETCksDQotICAgICAgICAgICAgICBuZXcgUU5hbWUoUmVsZWFzZVNlcnZpY2VUZXN0cy5HRU5FUkFURURfU0VSVklDRV9OUywgUmVsZWFzZVNlcnZpY2VUZXN0cy5HRU5FUkFURURfU0VSVklDRV9MUCkpOw0KLSAgICB9DQotICAgIHB1YmxpYyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L1Rlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBhMGRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIGltcGxlbWVudHMgSW52b2NhdGlvbkNvbnRyb2xsZXIgew0KLQ0KLSAgICBwcml2YXRlIEludm9jYXRpb25Db250ZXh0IGNhY2hlZEN0eDsNCi0gICAgDQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udGV4dCBpbnZva2UoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsNCi0gICAgICAgIGNhY2hlZEN0eCA9IGljOw0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7ICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIHJlc3BvbnNlLnNldEVuZHBvaW50RGVzY3JpcHRpb24ocmVxdWVzdC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCkpOw0KLSAgICAgICAgcmVzcG9uc2Uuc2V0TWVzc2FnZShyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7ICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgaWMuc2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dChyZXNwb25zZSk7DQotICAgICAgICByZXR1cm4gaWM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYywgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgY2FjaGVkQ3R4ID0gaWM7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUmVzcG9uc2UgaW52b2tlQXN5bmMoSW52b2NhdGlvbkNvbnRleHQgaWMpIHsNCi0gICAgICAgIGNhY2hlZEN0eCA9IGljOw0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgaW52b2tlT25lV2F5KEludm9jYXRpb25Db250ZXh0IGljKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNhY2hlZEN0eCA9IGljOw0KLQ0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgSW52b2NhdGlvbkNvbnRleHQgZ2V0SW52b2NhdGlvbkNvbnRleHQoKSB7DQotICAgICAgICByZXR1cm4gY2FjaGVkQ3R4Ow0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9UZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGExZjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9UZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLmNvbnRyb2xsZXIuSW52b2NhdGlvbkNvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSB7DQotICAgIA0KLSAgICBwcml2YXRlIEludm9jYXRpb25Db250cm9sbGVyIGljOw0KLSAgICANCi0gICAgcHVibGljIEludm9jYXRpb25Db250cm9sbGVyIGdldEludm9jYXRpb25Db250cm9sbGVyKCkgew0KLSAgICAgICAgaWYgKGljICE9IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuIGljOw0KLSAgICAgICAgZWxzZSANCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnZvY2F0aW9uQ29udHJvbGxlcihJbnZvY2F0aW9uQ29udHJvbGxlciBpbnN0KSB7DQotICAgICAgICBpYyA9IGluc3Q7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaEFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaEFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTI0NzNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hBZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgc3VpdGUgb2YgdGVzdHMgaXMgZm9yIHRoZSBBZGRyZXNzaW5nRmVhdHVyZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuCi0gKiBiZSB1c2VkIG9uIERpc3BhdGNoIGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaEFkZHJlc3NpbmdGZWF0dXJlVGVzdCBleHRlbmRzIEludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT01GYWN0b3J5IE9NRiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlQyMDA1MDggPQotICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHczY0J1aWxkZXIgPSBuZXcgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHczY0VQUiA9IHczY0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgc3ViQnVpbGRlciA9IG5ldyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHN1YkVQUiA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ha2Ugc3VyZSBBZGRyZXNzaW5nIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaCh3M2NFUFIsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRBZGRyZXNzaW5nRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOwotICAgICAgICBzdmMuYWRkUG9ydChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHczY0VQUiwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7Ci0gICAgICAgIAotICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRGYWxzZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBlcHIsIEVMRU1FTlQyMDA1MDgsIEZpbmFsLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICBhc3NlcnRYTUxFcXVhbCh3M2NFUFIudG9TdHJpbmcoKSwgb21FbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgZGlzYWJsaW5nIHRoZSBBZGRyZXNzaW5nIGZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFNldCB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZC4KLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7ICAgICAgICAKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHczY0VQUiwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7Ci0gICAgICAgIAotICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRUcnVlKGRpc2FibGVkKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMlJlcXVlc3QgPQotICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9Ci0gICAgICAgICAgICBheGlzMlJlcXVlc3QuZ2V0VG8oKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwoZXByKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gVGVzdCBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBub3QgYWxsb3dlZCB3aXRoIHRoZSBBZGRyZXNzaW5nRmVhdHVyZQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBBZGRyZXNzaW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IEFkZHJlc3NpbmdGZWF0dXJlKCk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOwotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2goc3ViRVBSLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBmZWF0dXJlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUgd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hNVE9NRmVhdHVyZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRGlzcGF0Y2hNVE9NRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkYmYzYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoTVRPTUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LkludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5NZXNzYWdlQ29udGV4dDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi0NCi0vKioNCi0gKiBUaGlzIHN1aXRlIG9mIHRlc3RzIGlzIGZvciB0aGUgTVRPTUZlYXR1cmUgY29uZmlndXJhdGlvbiB0aGF0IGNhbg0KLSAqIGJlIHVzZWQgb24gRGlzcGF0Y2ggY2xpZW50cy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hNVE9NRmVhdHVyZVRlc3QgZXh0ZW5kcyBJbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2Ugew0KLQ0KLSAgICAvKg0KLSAgICAgKiBNYWtlIHN1cmUgTVRPTSBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vTVRPTUZlYXR1cmUoKSB7DQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7DQotICAgICAgICBzdmMuYWRkUG9ydChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsNCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgDQotICAgICAgICBTT0FQQmluZGluZyBzYiA9IChTT0FQQmluZGluZykgZC5nZXRCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJTT0FQQmluZGluZyBzaG91bGQgbm90IGJlIG51bGwuIiwgc2IgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBub3QgYmUgZW5hYmxlZCBvbiB0aGUgYmluZGluZyBieSBkZWZhdWx0LiIsICFzYi5pc01UT01FbmFibGVkKCkpOw0KLSAgICAgICAgDQotICAgICAgICBkLmludm9rZShudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWVzdCBzaG91bGQgbm90IGJlIG51bGwuIiwgcmVxdWVzdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKCJNVE9NIHNob3VsZCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0LiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgTVRPTUZlYXR1cmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1UT01GZWF0dXJlKCkgew0KLSAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGZlYXR1cmUgY29uZmlnDQotICAgICAgICBNVE9NRmVhdHVyZSBmZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKCk7DQotICAgICAgICANCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOw0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgDQotICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7DQotICAgICAgICANCi0gICAgICAgIGQuaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBiZSBlbmFibGVkIHZpYSB0aGUgTVRPTUZlYXR1cmUuIiwgcmVxdWVzdC5nZXRNZXNzYWdlKCkuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIE1UT00gZmVhdHVyZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZE1UT01GZWF0dXJlKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICANCi0gICAgICAgIC8vIFNldCB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZC4NCi0gICAgICAgIE1UT01GZWF0dXJlIGZlYXR1cmUgPSBuZXcgTVRPTUZlYXR1cmUoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IiksIA0KLSAgICAgICAgICAgIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQsIGZlYXR1cmUpOw0KLSAgICAgICAgDQotICAgICAgICBkLmludm9rZShudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgICAgIA0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRGYWxzZSgiTVRPTSBzaG91bGQgYmUgZGlzYWJsZWQgdmlhIHRoZSBNVE9NRmVhdHVyZS4iLCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0aHJlc2hvbGQgZm9yIE1UT00gd2hlbiBubyBhdHRhY2htZW50IGlzIA0KLSAgICAgKiBzcGVjaWZpZWQuICBJbiB0aGlzIGNhc2UsIGFsdGhvdWdoIGVuYWJsZWQgcGVyIHRoZSBNVE9NRmVhdHVyZSwgTVRPTSBzaG91bGQNCi0gICAgICogbm90IGJlIGVuYWJsZWQgb24gdGhlIE1lc3NhZ2UsIHNpbmNlIHRoZSBhdHRhY2htZW50IHNpemUgaXMgdG9vIHNtYWxsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01GZWF0dXJlVGhyZXNob2xkV2l0aE5vQXR0YWNobWVudCgpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTZXQgdGhlIGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQuDQotICAgICAgICBpbnQgdGhyZXNob2xkID0gMjAwMDA7DQotICAgICAgICBNVE9NRmVhdHVyZSBmZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKHRocmVzaG9sZCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgDQotICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7DQotICAgICAgICANCi0gICAgICAgIGQuaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgDQotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIEEgVGhyZXNob2xkIGluZGljYXRlcyB0aGF0IE1UT00gc2hvdWxkIGJlIGVuYWJsZWQuDQotICAgICAgICAvLyBUaGUgZGVjaXNpb24gYWJvdXQgd2hldGhlciB0aGUgYXR0YWNobWVudCBpcyBpbmxpbmVkIGlzIG1hZGUgb24gYSBwZXIgYXR0YWNobWVudA0KLSAgICAgICAgLy8gYmFzaXMgaW4gQXhpb20uLi5hbmQgY2Fubm90IGJlIHRlc3RlZCBpbiB1bml0IHRlc3QgdGhhdCBkb2VzIG5vdCBzZW5kIHRoZSBtZXNzYWdlDQotICAgICAgICAvLyB0byB0aGUgc2VydmVyLg0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgYmUgZW5hYmxlZC4iLCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IHRoZSBjby1leGlzdGVuY2Ugb2YgYW4gTVRPTUZlYXR1cmUgYW5kIGEgTVRPTSBiaW5kaW5nIHR5cGUgZm9yIGEgY2xpZW50Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01GZWF0dXJlQW5kQmluZGluZygpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsNCi0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICANCi0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZw0KLSAgICAgICAgTVRPTUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZSgpOw0KLSAgICAgICAgDQotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2gobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCANCi0gICAgICAgICAgICBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBmZWF0dXJlKTsNCi0gICAgICAgIA0KLSAgICAgICAgZC5pbnZva2UobnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7DQotICAgICAgICANCi0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgYmUgZW5hYmxlZCB2aWEgdGhlIE1UT01GZWF0dXJlLiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFRlc3QgdGhlIG92ZXJyaWRlIG9mIGFuIE1UT00gYmluZGluZyBieSBkaXNhYmxpbmcgTVRPTSB2aWEgdGhlIE1UT01GZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT01GZWF0dXJlQW5kQmluZGluZ092ZXJyaWRlKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIikpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGZlYXR1cmUgY29uZmlnDQotICAgICAgICBNVE9NRmVhdHVyZSBmZWF0dXJlID0gbmV3IE1UT01GZWF0dXJlKGZhbHNlKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgDQotICAgICAgICAgICAgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7DQotICAgICAgICANCi0gICAgICAgIGQuaW52b2tlKG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgDQotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydEZhbHNlKCJNVE9NIHNob3VsZCBiZSBkaXNhYmxlZCB2aWEgdGhlIE1UT01GZWF0dXJlLiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7ICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9kaXNwYXRjaC9EaXNwYXRjaFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzNTNiYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0Rpc3BhdGNoU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuZGlzcGF0Y2g7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgc3VpdGUgb2YgdGVzdHMgaXMgZm9yIHRoZSBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgY29uZmlndXJhdGlvbiB0aGF0IGNhbgotICogYmUgdXNlZCBvbiBEaXNwYXRjaCBjbGllbnRzLgotICovCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmVUZXN0IGV4dGVuZHMgSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPTUZhY3RvcnkgT01GID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgRUxFTUVOVDIwMDQwOCA9Ci0gICAgICAgIG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsICJFbmRwb2ludFJlZmVyZW5jZSIsICJ3c2EiKTsKLSAgICAKLSAgICBwcml2YXRlIFczQ0VuZHBvaW50UmVmZXJlbmNlIHczY0VQUjsKLSAgICBwcml2YXRlIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZSBzdWJFUFI7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICAgICAgCi0gICAgICAgIFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlciB3M2NCdWlsZGVyID0gbmV3IFczQ0VuZHBvaW50UmVmZXJlbmNlQnVpbGRlcigpOwotICAgICAgICB3M2NCdWlsZGVyID0gdzNjQnVpbGRlci5hZGRyZXNzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9zb21laG93Iik7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLnNlcnZpY2VOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICB3M2NFUFIgPSB3M2NCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgIAotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHN1YkJ1aWxkZXIgPSBuZXcgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcigpOwotICAgICAgICBzdWJCdWlsZGVyID0gc3ViQnVpbGRlci5hZGRyZXNzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9zb21laG93Iik7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLnNlcnZpY2VOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICBzdWJFUFIgPSBzdWJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgU3VibWlzc2lvbkFkZHJlc3NpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChzdWJFUFIsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICAKLSAgICAgICAgZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChzdWJFUFIsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQsIGZlYXR1cmUpOwotICAgICAgICAKLSAgICAgICAgZC5pbnZva2UobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRGYWxzZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01GLCBlcHIsIEVMRU1FTlQyMDA0MDgsIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIGFzc2VydFhNTEVxdWFsKHN1YkVQUi50b1N0cmluZygpLCBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nIGZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgewotICAgICAgICAvLyBTZXQgdGhlIGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQuCi0gICAgICAgIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7ICAgICAgICAKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHN1YkVQUiwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCwgZmVhdHVyZSk7Ci0gICAgICAgIAotICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvLyBUZXN0IGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHdpdGggdGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlIGZlYXR1cmUgPSBuZXcgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFNlcnZpY2UiKSk7Ci0gICAgICAgIHN2Yy5hZGRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCAiaHR0cDovL2xvY2FsaG9zdCIpOwotICAgICAgICBEaXNwYXRjaDxTb3VyY2U+IGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2godzNjRVBSLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FELCBmZWF0dXJlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkLmludm9rZShudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUgd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRHluYW1pY1BvcnRDYWNoaW5nVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvRHluYW1pY1BvcnRDYWNoaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAzOTY3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0R5bmFtaWNQb3J0Q2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiAgICAgIA0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LmRpc3BhdGNoOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25UZXN0VXRpbHMyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ2xpZW50TWV0YWRhdGFUZXN0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFRlc3RzIHRoZSBjYWNoaW5nIGFuZCBpc29sYXRpb24gb2YgZHluYW1pYyBwb3J0cyxpLmUuIHRob3NlIGNyZWF0ZWQgd2l0aA0KLSAqIFNlcnZpY2UuYWRkUG9ydCguLi4pLiAgRHluYW1pYyBwb3J0cyBzaG91bGQNCi0gKiAxKSBPbmx5IGJlIHZpc2libGUgdG8gc2VydmljZXMgb24gd2hpY2ggYW4gYWRkUG9ydCB3YXMgZG9uZQ0KLSAqIDIpIFNoYXJlIGluc3RhbmNlcyBvZiB0aGUgZGVzY3JpcHRpb24gb2JqZWN0cyAoZS5nLiBBeGlzU2VydmljZSkgZm9yIHBvcnRzDQotICogYWRkZWQgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzZXJ2aWNlIHRoYXQgdXNlIHRoZSBzYW1lIGNsaWVudA0KLSAqIGNvbmZpZ3VyYXRpb24NCi0gKiAzKSBJZGVudGljYWwgcG9ydHMgb24gc2VydmljZXMgdXNpbmcgZGlmZmVyZW50IGNsaWVudCBjb25maWd1cmF0aW9uIHNob3VsZA0KLSAqIG5vdCBiZSBzaGFyZWQgDQotICovDQotcHVibGljIGNsYXNzIER5bmFtaWNQb3J0Q2FjaGluZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vZGlzcGF0Y2guY2xpZW50LmpheHdzLmF4aXMyLmFwYWNoZS5vcmciOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICANCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkeW5hbWljUG9ydDEgPSAiZHluYW1pY1BvcnQxIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBiaW5kaW5nSUQxID0gbnVsbDsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBlcHIxID0gbnVsbDsNCi0NCi0gICAgLyoqDQotICAgICAqIFR3byBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIHNlcnZpY2Ugc2hvdWxkIHNoYXJlIHRoZSBzYW1lDQotICAgICAqIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uIChlLmcuIEF4aXNTZXJ2aWNlKSBpZiB0aGUgc2FtZSBwb3J0IGlzIGFkZGVkDQotICAgICAqIHRvIGJvdGggDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFNhbWVQb3J0c1NhbWVTZXJ2aWNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMSA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2YzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzdmNEbGcxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzdmMxKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0RsZzEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IHN2Y0RsZzEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjMSk7DQotDQotICAgICAgICAgICAgU2VydmljZSBzdmMyID0gU2VydmljZS5jcmVhdGUoc3ZjUU4pOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjMik7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHN2Y0RsZzIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHN2YzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGxnMik7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MyID0gc3ZjRGxnMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKCJTZXJ2aWNlIGluc3RhbmNlcyBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwgc3ZjMSwgc3ZjMik7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgiU2VydmljZSBkZWxlZ2F0ZXMgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsIHN2Y0RsZzEsIHN2Y0RsZzIpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoIkluc3RhbmNlIG9mIFNlcnZpY2VEZXNjcmlwdGlvbiBzaG91bGQgYmUgdGhlIHNhbWUiLCBzdmNEZXNjMSwgc3ZjRGVzYzIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEFkZCBhIHBvcnQgdG8gMXN0IHNlcnZpY2UsIHNob3VsZCBub3QgYmUgdmlzaWJsZSB1bmRlciB0aGUgMm5kIHNlcnZpY2UNCi0gICAgICAgICAgICBzdmMxLmFkZFBvcnQobmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgZHluYW1pY1BvcnQxKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0lEMSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXByMSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldExpc3Qoc3ZjMS5nZXRQb3J0cygpKS5zaXplKCkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBnZXRMaXN0KHN2YzIuZ2V0UG9ydHMoKSkuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHNhbWUgcG9ydCB0byAybmQgc2VydmljZSwgc2hvdWxkIG5vdyBoYXZlIHNhbWUgcG9ydHMgYW5kIGRlc2NyaXB0aW9uDQotICAgICAgICAgICAgLy8gb2JqZWN0cw0KLSAgICAgICAgICAgIHN2YzIuYWRkUG9ydChuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSUQxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICBlcHIxKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2V0TGlzdChzdmMxLmdldFBvcnRzKCkpLnNpemUoKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldExpc3Qoc3ZjMi5nZXRQb3J0cygpKS5zaXplKCkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQb3J0T09NKCkgew0KLSAgICAgICAgUU5hbWUgc3ZjUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDAwIDsgaSsrKSB7DQotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc3ZjMSA9IFNlcnZpY2UuY3JlYXRlKHN2Y1FOKTsNCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQb3J0IG51bWJlciAiICsgaSk7DQotICAgICAgICAgICAgICAgIHN2YzEuYWRkUG9ydChuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBkeW5hbWljUG9ydDEgKyAiXyIgLyorIGkqLyksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSUQxLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXByMSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdGhyb3dhYmxlICIgKyB0KTsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3QgZ2V0TGlzdChJdGVyYXRvciBpdCkgew0KLSAgICAgICAgTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQoaXQubmV4dCgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXR1cm5MaXN0Ow0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSW52b2NhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L2Rpc3BhdGNoL0ludm9jYXRpb25Db250cm9sbGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODJlZjQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvZGlzcGF0Y2gvSW52b2NhdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5kaXNwYXRjaDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLkludm9jYXRpb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5JbnZvY2F0aW9uQ29udHJvbGxlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5jb250cm9sbGVyLmltcGwuQXhpc0ludm9jYXRpb25Db250cm9sbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuY29udHJvbGxlci5pbXBsLkludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbnZvY2F0aW9uQ29udHJvbGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHByaXZhdGUgUU5hbWUgc3ZjUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RTZXJ2aWNlIik7DQotICAgIHByaXZhdGUgUU5hbWUgcG9ydFFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRJbnZvY2F0aW9uQ29udHJvbGxlcigpIHsNCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc3ZjUW5hbWUpOw0KLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydFFuYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICJodHRwOi8vbG9jYWxob3N0Iik7DQotICAgICAgICBEaXNwYXRjaCBkID0gc3ZjLmNyZWF0ZURpc3BhdGNoKHBvcnRRbmFtZSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7DQotICAgICAgICANCi0gICAgICAgIEJhc2VEaXNwYXRjaCBiZCA9IChCYXNlRGlzcGF0Y2gpIGQ7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIkFuIEludm9jYXRpb25Db250cm9sbGVyIGluc3RhbmNlIHdhcyBub3QgY3JlYXRlZCIsIGJkLmljICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGRlZmF1bHQgSW52b2NhdGlvbkNvbnRyb2xsZXIgdHlwZSB3YXMgaW5jb3JyZWN0LiIsIA0KLSAgICAgICAgICAgIEF4aXNJbnZvY2F0aW9uQ29udHJvbGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJkLmljLmdldENsYXNzKCkpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFBsdWdnYWJsZUludm9jYXRpb25Db250cm9sbGVyKCkgew0KLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LnNldEZhY3RvcnkoSW52b2NhdGlvbkNvbnRyb2xsZXJGYWN0b3J5LmNsYXNzLCBuZXcgVGVzdEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShzdmNRbmFtZSk7DQotICAgICAgICBzdmMuYWRkUG9ydChwb3J0UW5hbWUsIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORywgImh0dHA6Ly9sb2NhbGhvc3QiKTsNCi0gICAgICAgIERpc3BhdGNoIGQgPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydFFuYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsNCi0gICAgICAgIA0KLSAgICAgICAgQmFzZURpc3BhdGNoIGJkID0gKEJhc2VEaXNwYXRjaCkgZDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0IGl0IGJhY2sgdG8gdGhlIGRlZmF1bHQgc28gd2UgZG9uJ3QgYnJlYWsgb3RoZXIgdGVzdHMuDQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnkuY2xhc3MsIG5ldyBJbnZvY2F0aW9uQ29udHJvbGxlckZhY3RvcnlJbXBsKCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJBbiBJbnZvY2F0aW9uQ29udHJvbGxlciBpbnN0YW5jZSB3YXMgbm90IGNyZWF0ZWQiLCBiZC5pYyAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBkZWZhdWx0IEludm9jYXRpb25Db250cm9sbGVyIHR5cGUgd2FzIGluY29ycmVjdC4iLCANCi0gICAgICAgICAgICBUZXN0SW52b2NhdGlvbkNvbnRyb2xsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiZC5pYy5nZXRDbGFzcygpKSk7DQotICAgIH0NCi19DQotDQotY2xhc3MgVGVzdEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyRmFjdG9yeSB7DQotICAgIHB1YmxpYyBJbnZvY2F0aW9uQ29udHJvbGxlciBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpIHsNCi0gICAgICAgIHJldHVybiBuZXcgVGVzdEludm9jYXRpb25Db250cm9sbGVyKCk7IA0KLSAgICB9DQotfQ0KLQ0KLWNsYXNzIFRlc3RJbnZvY2F0aW9uQ29udHJvbGxlciBpbXBsZW1lbnRzIEludm9jYXRpb25Db250cm9sbGVyIHsNCi0NCi0gICAgcHVibGljIEludm9jYXRpb25Db250ZXh0IGludm9rZShJbnZvY2F0aW9uQ29udGV4dCBpYykgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZ1dHVyZTw/PiBpbnZva2VBc3luYyhJbnZvY2F0aW9uQ29udGV4dCBpYywgQXN5bmNIYW5kbGVyIGFzeW5jSGFuZGxlcikgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFJlc3BvbnNlIGludm9rZUFzeW5jKEludm9jYXRpb25Db250ZXh0IGljKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VPbmVXYXkoSW52b2NhdGlvbkNvbnRleHQgaWMpIHRocm93cyBFeGNlcHRpb24ge30gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jbGllbnQvcHJveHkvUHJveHlBZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNjY3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5QWRkcmVzc2luZ0ZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5wcm94eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi0vKioKLSAqIFRoaXMgc3VpdGUgb2YgdGVzdHMgaXMgZm9yIHRoZSBBZGRyZXNzaW5nRmVhdHVyZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuCi0gKiBiZSB1c2VkIG9uIFByb3h5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eUFkZHJlc3NpbmdGZWF0dXJlVGVzdCBleHRlbmRzIEludGVyY2VwdGFibGVDbGllbnRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT01GYWN0b3J5IE9NRiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIEVMRU1FTlQyMDA1MDggPQotICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgIAotICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgdzNjQnVpbGRlciA9IG5ldyBXM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIoKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuYWRkcmVzcygiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIpOwotICAgICAgICB3M2NCdWlsZGVyID0gdzNjQnVpbGRlci5zZXJ2aWNlTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICB3M2NFUFIgPSB3M2NCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgIAotICAgICAgICBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHN1YkJ1aWxkZXIgPSBuZXcgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcigpOwotICAgICAgICBzdWJCdWlsZGVyID0gc3ViQnVpbGRlci5hZGRyZXNzKCJodHRwOi8vc29tZXdoZXJlLmNvbS9zb21laG93Iik7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLnNlcnZpY2VOYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlBZGRyZXNzaW5nU2VydmljZSIpKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHN1YkVQUiA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1ha2Ugc3VyZSBBZGRyZXNzaW5nIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoUHJveHlBZGRyZXNzaW5nU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRBZGRyZXNzaW5nRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydCh3M2NFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKLSAgICAgICAgCi0gICAgICAgIHByb3h5LmRvU29tZXRoaW5nKCIxMjM0NSIpOwotICAgICAgICAKLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBCb29sZWFuIGRpc2FibGVkID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGRpc2FibGVkKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMlJlcXVlc3QgPQotICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9Ci0gICAgICAgICAgICBheGlzMlJlcXVlc3QuZ2V0VG8oKTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUYsIGVwciwgRUxFTUVOVDIwMDUwOCwgRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIGFzc2VydFhNTEVxdWFsKHczY0VQUi50b1N0cmluZygpLCBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCBkaXNhYmxpbmcgdGhlIEFkZHJlc3NpbmcgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRBZGRyZXNzaW5nRmVhdHVyZSgpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGZlYXR1cmUgY29uZmlnCi0gICAgICAgIEFkZHJlc3NpbmdGZWF0dXJlIGZlYXR1cmUgPSBuZXcgQWRkcmVzc2luZ0ZlYXR1cmUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydCh3M2NFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnRUcnVlKCJQcm94eSBpbnN0YW5jZSB3YXMgbnVsbCIsIHByb3h5ICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhGaW5hbC5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKGVwcik7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBBZGRyZXNzaW5nRmVhdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFkZHJlc3NpbmdGZWF0dXJlKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcKLSAgICAgICAgQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBBZGRyZXNzaW5nRmVhdHVyZSgpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChzdWJFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm94eS5kb1NvbWV0aGluZygiMTIzNDUiKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIHdzZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUgd2FzIHRocm93bi4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSgpCi0gICAgcHVibGljIGludGVyZmFjZSBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHsKLSAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBkb1NvbWV0aGluZyhTdHJpbmcgaWQpOwotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5TVRPTUZlYXR1cmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5TVRPTUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjdmNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9Qcm94eU1UT01GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LnByb3h5Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2xpZW50LlRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLkludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTUZlYXR1cmU7DQotDQotLyoqDQotICogVGhpcyBzdWl0ZSBvZiB0ZXN0cyBpcyBmb3IgdGhlIE1UT01GZWF0dXJlIGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4NCi0gKiBiZSB1c2VkIG9uIFByb3h5IGNsaWVudHMuDQotICovDQotcHVibGljIGNsYXNzIFByb3h5TVRPTUZlYXR1cmVUZXN0IGV4dGVuZHMgSW50ZXJjZXB0YWJsZUNsaWVudFRlc3RDYXNlIHsNCi0NCi0gICAgLyoNCi0gICAgICogTWFrZSBzdXJlIE1UT00gaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb01UT01GZWF0dXJlKCkgew0KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5TVRPTVNlcnZpY2UiKSk7DQotICAgICAgICBQcm94eU1UT01TZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoUHJveHlNVE9NU2VydmljZS5jbGFzcyk7DQotICAgICAgICBhc3NlcnRUcnVlKCJQcm94eSBpbnN0YW5jZSB3YXMgbnVsbCIsIHByb3h5ICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBwcm94eS5zZW5kQXR0YWNobWVudCgiMTIzNDUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsNCi0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVxdWVzdCBzaG91bGQgbm90IGJlIG51bGwuIiwgcmVxdWVzdCAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUoIk1UT00gc2hvdWxkIG5vdCBiZSBhYmxlZCBvbiB0aGUgTWVzc2FnZSBieSBkZWZhdWx0LiIsICFyZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIE1UT01GZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRNVE9NRmVhdHVyZSgpIHsNCi0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZw0KLSAgICAgICAgTVRPTUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZSgpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlNVE9NU2VydmljZSIpKTsNCi0gICAgICAgIFByb3h5TVRPTVNlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eU1UT01TZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlByb3h5IGluc3RhbmNlIHdhcyBudWxsIiwgcHJveHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHByb3h5LnNlbmRBdHRhY2htZW50KCIxMjM0NSIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0IHNob3VsZCBub3QgYmUgbnVsbC4iLCByZXF1ZXN0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgYmUgYWJsZWQgb24gdGhlIE1lc3NhZ2UgYnkgZGVmYXVsdC4iLCByZXF1ZXN0LmdldE1lc3NhZ2UoKS5pc01UT01FbmFibGVkKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiBUZXN0IGRpc2FibGluZyB0aGUgTVRPTSBmZWF0dXJlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkTVRPTUZlYXR1cmUoKSB7DQotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZmVhdHVyZSBjb25maWcNCi0gICAgICAgIE1UT01GZWF0dXJlIGZlYXR1cmUgPSBuZXcgTVRPTUZlYXR1cmUoZmFsc2UpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlNVE9NU2VydmljZSIpKTsNCi0gICAgICAgIFByb3h5TVRPTVNlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eU1UT01TZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlByb3h5IGluc3RhbmNlIHdhcyBudWxsIiwgcHJveHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHByb3h5LnNlbmRBdHRhY2htZW50KCIxMjM0NSIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0IHNob3VsZCBub3QgYmUgbnVsbC4iLCByZXF1ZXN0ICE9IG51bGwpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTSBzaG91bGQgTk9UIGJlIGFibGVkIG9uIHRoZSBNZXNzYWdlIGJ5IGRlZmF1bHQuIiwgIXJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qDQotICAgICAqIFRlc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRocmVzaG9sZCBmb3IgTVRPTSB3aGVuIG5vIGF0dGFjaG1lbnQgaXMgDQotICAgICAqIHNwZWNpZmllZC4gIEluIHRoaXMgY2FzZSwgYWx0aG91Z2ggZW5hYmxlZCBwZXIgdGhlIE1UT01GZWF0dXJlLCBNVE9NIHNob3VsZA0KLSAgICAgKiBub3QgYmUgZW5hYmxlZCBvbiB0aGUgTWVzc2FnZSwgc2luY2UgdGhlIGF0dGFjaG1lbnQgc2l6ZSBpcyB0b28gc21hbGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVRPTUZlYXR1cmVUaHJlc2hvbGQoKSB7DQotICAgICAgICAvLyBTZXQgYSB0aHJlc2hvbGQgdGhhdCB3ZSB3aWxsIG5vdCBtZWV0Lg0KLSAgICAgICAgaW50IHRocmVzaG9sZCA9IDIwMDAwOw0KLSAgICAgICAgTVRPTUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBNVE9NRmVhdHVyZSh0aHJlc2hvbGQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiUHJveHlNVE9NU2VydmljZSIpKTsNCi0gICAgICAgIFByb3h5TVRPTVNlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChQcm94eU1UT01TZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlByb3h5IGluc3RhbmNlIHdhcyBudWxsIiwgcHJveHkgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHByb3h5LnNlbmRBdHRhY2htZW50KCIxMjM0NSIpOw0KLSAgICAgICAgDQotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOw0KLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJSZXF1ZXN0IHNob3VsZCBub3QgYmUgbnVsbC4iLCByZXF1ZXN0ICE9IG51bGwpOw0KLSAgICAgICAgLy8gQSBUaHJlc2hvbGQgaW5kaWNhdGVzIHRoYXQgTVRPTSBzaG91bGQgYmUgZW5hYmxlZC4NCi0gICAgICAgIC8vIFRoZSBkZWNpc2lvbiBhYm91dCB3aGV0aGVyIHRoZSBhdHRhY2htZW50IGlzIGlubGluZWQgaXMgbWFkZSBvbiBhIHBlciBhdHRhY2htZW50DQotICAgICAgICAvLyBiYXNpcyBpbiBBeGlvbS4uLmFuZCBjYW5ub3QgYmUgdGVzdGVkIGluIHVuaXQgdGVzdCB0aGF0IGRvZXMgbm90IHNlbmQgdGhlIG1lc3NhZ2UNCi0gICAgICAgIC8vIHRvIHRoZSBzZXJ2ZXIuDQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBiZSBlbmFibGVkLiIsIHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKCkNCi0gICAgcHVibGljIGludGVyZmFjZSBQcm94eU1UT01TZXJ2aWNlIHsNCi0gICAgDQotICAgICAgICBwdWJsaWMgU3RyaW5nIHNlbmRBdHRhY2htZW50KFN0cmluZyBpZCk7DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NsaWVudC9wcm94eS9Qcm94eVN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyYzExNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2xpZW50L3Byb3h5L1Byb3h5U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQucHJveHk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNsaWVudC5JbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jbGllbnQuVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZS5JbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBzdWl0ZSBvZiB0ZXN0cyBpcyBmb3IgdGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZSBjb25maWd1cmF0aW9uIHRoYXQgY2FuCi0gKiBiZSB1c2VkIG9uIFByb3h5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eVN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3QgZXh0ZW5kcyBJbnRlcmNlcHRhYmxlQ2xpZW50VGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9NRmFjdG9yeSBPTUYgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBFTEVNRU5UMjAwNDA4ID0KLSAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgIkVuZHBvaW50UmVmZXJlbmNlIiwgIndzYSIpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBidWlsZGVyID0gYnVpbGRlci5lbmRwb2ludE5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0UG9ydCIpKTsKLSAgICAgICAgdzNjRVBSID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAKLSAgICAgICAgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlQnVpbGRlciBzdWJCdWlsZGVyID0gbmV3IFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIoKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuYWRkcmVzcygiaHR0cDovL3NvbWV3aGVyZS5jb20vc29tZWhvdyIpOwotICAgICAgICBzdWJCdWlsZGVyID0gc3ViQnVpbGRlci5zZXJ2aWNlTmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmVuZHBvaW50TmFtZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0IikpOwotICAgICAgICBzdWJFUFIgPSBzdWJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBNYWtlIHN1cmUgU3VibWlzc2lvbkFkZHJlc3NpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoUHJveHlBZGRyZXNzaW5nU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotICAgICAgICAKLSAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgIAotICAgICAgICBUZXN0Q2xpZW50SW52b2NhdGlvbkNvbnRyb2xsZXIgdGVzdENvbnRyb2xsZXIgPSBnZXRJbnZvY2F0aW9uQ29udHJvbGxlcigpOwotICAgICAgICBJbnZvY2F0aW9uQ29udGV4dCBpYyA9IHRlc3RDb250cm9sbGVyLmdldEludm9jYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBpYy5nZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIEJvb2xlYW4gZGlzYWJsZWQgPSAoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE51bGwodmVyc2lvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGlzYWJsZWQpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXMyUmVxdWVzdCA9Ci0gICAgICAgICAgICByZXF1ZXN0LmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UgZXByID0KLSAgICAgICAgICAgIGF4aXMyUmVxdWVzdC5nZXRUbygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbChlcHIpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIFRlc3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQoc3ViRVBSLCBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0gICAgICAgIAotICAgICAgICBwcm94eS5kb1NvbWV0aGluZygiMTIzNDUiKTsKLSAgICAgICAgCi0gICAgICAgIFRlc3RDbGllbnRJbnZvY2F0aW9uQ29udHJvbGxlciB0ZXN0Q29udHJvbGxlciA9IGdldEludm9jYXRpb25Db250cm9sbGVyKCk7Ci0gICAgICAgIEludm9jYXRpb25Db250ZXh0IGljID0gdGVzdENvbnRyb2xsZXIuZ2V0SW52b2NhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IGljLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgQm9vbGVhbiBkaXNhYmxlZCA9IChCb29sZWFuKSByZXF1ZXN0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGRpc2FibGVkKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzMlJlcXVlc3QgPQotICAgICAgICAgICAgcmVxdWVzdC5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlIGVwciA9Ci0gICAgICAgICAgICBheGlzMlJlcXVlc3QuZ2V0VG8oKTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShPTUYsIGVwciwgRUxFTUVOVDIwMDQwOCwgU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgYXNzZXJ0WE1MRXF1YWwoc3ViRVBSLnRvU3RyaW5nKCksIG9tRWxlbWVudC50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBUZXN0IGRpc2FibGluZyB0aGUgU3VibWlzc2lvbkFkZHJlc3NpbmcgZmVhdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZShuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlByb3h5QWRkcmVzc2luZ1NlcnZpY2UiKSk7Ci0gICAgICAgIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UgcHJveHkgPSBzdmMuZ2V0UG9ydChzdWJFUFIsIFByb3h5QWRkcmVzc2luZ1NlcnZpY2UuY2xhc3MsIGZlYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKLSAgICAgICAgCi0gICAgICAgIHByb3h5LmRvU29tZXRoaW5nKCIxMjM0NSIpOwotICAgICAgICAKLSAgICAgICAgVGVzdENsaWVudEludm9jYXRpb25Db250cm9sbGVyIHRlc3RDb250cm9sbGVyID0gZ2V0SW52b2NhdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAgICAgSW52b2NhdGlvbkNvbnRleHQgaWMgPSB0ZXN0Q29udHJvbGxlci5nZXRJbnZvY2F0aW9uQ29udGV4dCgpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gaWMuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBCb29sZWFuIGRpc2FibGVkID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkaXNhYmxlZCk7Ci0gICAgICAgIAotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpczJSZXF1ZXN0ID0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSBlcHIgPQotICAgICAgICAgICAgYXhpczJSZXF1ZXN0LmdldFRvKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKGVwcik7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogVGVzdCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBmZWF0dXJlIGNvbmZpZwotICAgICAgICBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIikpOwotICAgICAgICBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlIHByb3h5ID0gc3ZjLmdldFBvcnQodzNjRVBSLCBQcm94eUFkZHJlc3NpbmdTZXJ2aWNlLmNsYXNzLCBmZWF0dXJlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm94eSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJveHkuZG9Tb21ldGhpbmcoIjEyMzQ1Iik7Ci0gICAgICAgICAgICBmYWlsKCJBbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UpIHsKLSAgICAgICAgICAgIC8vcGFzcwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhlIHdyb25nIGV4Y2VwdGlvbiB0eXBlIHdhcyB0aHJvd24uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UoKQotICAgIHB1YmxpYyBpbnRlcmZhY2UgUHJveHlBZGRyZXNzaW5nU2VydmljZSB7Ci0gICAgCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Tb21ldGhpbmcoU3RyaW5nIGlkKTsKLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NvcmUvTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg4OWYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jb3JlL01lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29yZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLS8qDQotICogVGVzdGluZyBqYXh3cyBtZXNzYWdlIGNvbnRleHQncyBpbnRlcmF0aW9uIHdpdGggYXhpczIgbWVzc2FnZSBjb250ZXh0Lg0KLSAqIEpBWFdTIGRlbGVnYXRlcyBhbGwgcHJvcGVydHkgc2V0dGluZy9nZXR0aW5nIHVwIHRvIGF4aXMyLCBidXQgd2UgbmVlZCB0byANCi0gKiBiZSBjYXJlZnVsIGhvdyB3ZSB1c2UgYXhpczIncyBNQy4gIFdlIHNob3VsZCBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIG9wdGlvbnMNCi0gKiBiYWcgaW4gdGhlIGF4aXMyIE1DLCBmb3IgZXhhbXBsZS4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUNvbnRleHRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXkxID0gIk9OYXhpc01DIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXkyID0gIk9OYXhpc01DT3B0aW9ucyI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5MyA9ICJPTmpheHdzTUMiOw0KLSAgICANCi0gICAgLyogVE9ETzoNCi0gICAgICogc2hvdWxkIGFsc28gdGVzdCB0byBtYWtlIHN1cmUgc2VydmljZSBvciBvcGVyYXRpb24gY29udGV4dCBwcm9wZXJ0aWVzDQotICAgICAqIG9uIHRoZSBheGlzMiBNQyBhcmUgbm90IGFjY2Vzc2libGUuICBUaGF0J3MgcHJvYmFibHkgYmVzdCBsZWZ0IGZvciBhbm90aGVyIHRlc3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUNvbnRleHRQcm9wZXJ0aWVzQWNjZXNzaWJpbGl0eSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNNQyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGpheHdzTUMgPSBuZXcgTWVzc2FnZUNvbnRleHQoYXhpc01DKTsNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eShrZXkxLCAidmFsdWUiKTsNCi0gICAgICAgIGF4aXNNQy5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoa2V5MiwgInZhbHVlIik7DQotICAgICAgICBqYXh3c01DLnNldFByb3BlcnR5KGtleTMsICJ2YWx1ZSIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKGpheHdzTUMuZ2V0UHJvcGVydHkoa2V5MSkpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChqYXh3c01DLmdldFByb3BlcnR5KGtleTIpKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoamF4d3NNQy5nZXRQcm9wZXJ0eShrZXkzKSk7DQotICAgICAgICANCi0gICAgICAgIE1hcCBwcm9wcyA9IGpheHdzTUMuZ2V0UHJvcGVydGllcygpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzLmdldChrZXkxKSk7DQotICAgICAgICBhc3NlcnROdWxsKHByb3BzLmdldChrZXkyKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BzLmdldChrZXkzKSk7DQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kYXRhYmluZGluZy9CaW5kaW5nVG9Qcm90b2NvbFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGF0YWJpbmRpbmcvQmluZGluZ1RvUHJvdG9jb2xUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM2Y2VkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kYXRhYmluZGluZy9CaW5kaW5nVG9Qcm90b2NvbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRhdGFiaW5kaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBBIHN1aXRlIG9mIHRlc3RzIGZvciByZWFkaW5nIHRoZSBiaW5kaW5nIGZyb20gYSBXU0RMIGZpbGUgYW5kCi0gKiBtYWtpbmcgc3VyZSB3ZSBhcmUgY29uZmlndXJpbmcgdGhlIFByb3RvY29sIGNvcnJlY3RseSBmb3IgCi0gKiBtZXNzYWdlcyBiYXNlZCBvbiB0aGF0IGJpbmRpbmcgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVG9Qcm90b2NvbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFfVEVTVF9OUyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfVEVTVF9OUyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9iaW5kaW5ndGVzdC9zb2FwMTIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVAxMV9TVkNfUU5BTUUgPSBuZXcgUU5hbWUoU09BUDExX1RFU1RfTlMsICJTT0FQMTFFY2hvU2VydmljZSIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVAxMl9TVkNfUU5BTUUgPSBuZXcgUU5hbWUoU09BUDEyX1RFU1RfTlMsICJTT0FQMTJFY2hvU2VydmljZSIpOwotICAgIAotICAgIHB1YmxpYyBCaW5kaW5nVG9Qcm90b2NvbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIHNlZSBpZiB3ZSBjYW4gcmVhZCB0aGUgU09BUCAxLjEgYmluZGluZyB0cmFuc3BvcnQgVVJMCi0gICAgICogaW4gYSBXU0RMLCBhcyBzcGVjaWZpZWQgYnkgSkFYLVdTIHNlY3Rpb24gMTAuNC4xLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkSkFYV1NTT0FQMTFCaW5kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIC8vIEdldCB0aGUgV1NETCB3aXRoIHRoZSBKQVgtV1MgYmluZGluZyB1cmwKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLUpBWFdTLndzZGwiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE86IFRoZXJlIHNob3VsZCBiZSBhbiBlYXNpZXIgd2F5IHRvIGRvIHRoaXMgd2l0aG91dAotICAgICAgICAvLyByZXF1cmluZyB0aGUgY3JlYXRpbmcgb2YgYSBTZXJ2aWNlIG9iamVjdC4gIFNob3VsZCB0aGUKLSAgICAgICAgLy8gU2VydmljZURlc2NyaXB0aW9uIGJlIGNvbnN0cnVjdGVkIGZyb20ganVzdCBhIFdTREwgZmlsZT8KLSAgICAgICAgU2VydmljZSBzdmMgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBTT0FQMTFfU1ZDX1FOQU1FKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIGRlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0U2VydmljZURlbGVnYXRlKHN2Yyk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IGRlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkcyA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInBvcnQgWyIgKyBlZHNbaV0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgKyAiOiIgKyBlZHNbaV0uZ2V0TmFtZSgpICsgIl0iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKFNPQVAxMV9URVNUX05TLCAiRWNob1BvcnQiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHdhcyBub3QgY3JlYXRlZC4iLCBlZCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmluZGluZ0lEID0gZWQuZ2V0Q2xpZW50QmluZGluZ0lEKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlRoZSBiaW5kaW5nIElEIHdhcyBudWxsLiIsIGJpbmRpbmdJRCk7Ci0gICAgICAgIAotICAgICAgICBQcm90b2NvbCBwID0gUHJvdG9jb2wuZ2V0UHJvdG9jb2xGb3JCaW5kaW5nKGJpbmRpbmdJRCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlByb3RvY29sIGNvbmZpZ3VyZWQgaW5jb3JyZWN0bHkiLCBwLmVxdWFscyhQcm90b2NvbC5zb2FwMTEpKTsKLSAgICAgICAgKi8KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0byBzZWUgaWYgd2UgY2FuIHJlYWQgdGhlIFNPQVAgMS4xIGJpbmRpbmcgdHJhbnNwb3J0IFVSTAotICAgICAqIGluIGEgV1NETCwgYXMgc3BlY2lmaWVkIGJ5IFdTLUkgQmFzaWMgUHJvZmlsZSAxLjEuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRXU0lTT0FQMTFCaW5kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgIC8vIEdldCB0aGUgV1NETCB3aXRoIHRoZSBKQVgtV1MgYmluZGluZyB1cmwKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vdGVzdC1yZXNvdXJjZXMvd3NkbC9TT0FQMTFCaW5kaW5nLVdTSS53c2RsIik7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPOiBUaGVyZSBzaG91bGQgYmUgYW4gZWFzaWVyIHdheSB0byBkbyB0aGlzIHdpdGhvdXQKLSAgICAgICAgLy8gcmVxdXJpbmcgdGhlIGNyZWF0aW5nIG9mIGEgU2VydmljZSBvYmplY3QuICBTaG91bGQgdGhlCi0gICAgICAgIC8vIFNlcnZpY2VEZXNjcmlwdGlvbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGp1c3QgYSBXU0RMIGZpbGU/Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgU09BUDExX1NWQ19RTkFNRSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFNlcnZpY2VEZWxlZ2F0ZShzdmMpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBkZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlZHMgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwb3J0IFsiICsgZWRzW2ldLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgZWRzW2ldLmdldE5hbWUoKSArICJdIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShTT0FQMTFfVEVTVF9OUywgIkVjaG9Qb3J0IikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiB3YXMgbm90IGNyZWF0ZWQuIiwgZWQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdJRCA9IGVkLmdldENsaWVudEJpbmRpbmdJRCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgYmluZGluZyBJRCB3YXMgbnVsbC4iLCBiaW5kaW5nSUQpOwotICAgICAgICAKLSAgICAgICAgUHJvdG9jb2wgcCA9IFByb3RvY29sLmdldFByb3RvY29sRm9yQmluZGluZyhiaW5kaW5nSUQpOwotICAgICAgICBhc3NlcnRUcnVlKCJQcm90b2NvbCBjb25maWd1cmVkIGluY29ycmVjdGx5IiwgcC5lcXVhbHMoUHJvdG9jb2wuc29hcDExKSk7Ci0gICAgICAgICovCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdG8gc2VlIGlmIHdlIGNhbiByZWFkIHRoZSBTT0FQIDEuMiBiaW5kaW5nIHRyYW5zcG9ydCBVUkwKLSAgICAgKiBpbiBhIFdTREwsIGFzIHNwZWNpZmllZCBieSBKQVgtV1MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRKQVhXU1NPQVAxMkJpbmRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLyoKLSAgICAgICAgLy8gR2V0IHRoZSBXU0RMIHdpdGggdGhlIEpBWC1XUyBiaW5kaW5nIHVybAotICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoImZpbGU6Li90ZXN0LXJlc291cmNlcy93c2RsL1NPQVAxMkJpbmRpbmctSkFYV1Mud3NkbCIpOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogVGhlcmUgc2hvdWxkIGJlIGFuIGVhc2llciB3YXkgdG8gZG8gdGhpcyB3aXRob3V0Ci0gICAgICAgIC8vIHJlcXVyaW5nIHRoZSBjcmVhdGluZyBvZiBhIFNlcnZpY2Ugb2JqZWN0LiAgU2hvdWxkIHRoZQotICAgICAgICAvLyBTZXJ2aWNlRGVzY3JpcHRpb24gYmUgY29uc3RydWN0ZWQgZnJvbSBqdXN0IGEgV1NETCBmaWxlPwotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIFNPQVAxMl9TVkNfUU5BTUUpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgZGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRTZXJ2aWNlRGVsZWdhdGUoc3ZjKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZWRzID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicG9ydCBbIiArIGVkc1tpXS5nZXRUYXJnZXROYW1lc3BhY2UoKSArICI6IiArIGVkc1tpXS5nZXROYW1lKCkgKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUoU09BUDEyX1RFU1RfTlMsICJFY2hvUG9ydCIpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gd2FzIG5vdCBjcmVhdGVkLiIsIGVkKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiaW5kaW5nSUQgPSBlZC5nZXRDbGllbnRCaW5kaW5nSUQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiVGhlIGJpbmRpbmcgSUQgd2FzIG51bGwuIiwgYmluZGluZ0lEKTsKLSAgICAgICAgCi0gICAgICAgIFByb3RvY29sIHAgPSBQcm90b2NvbC5nZXRQcm90b2NvbEZvckJpbmRpbmcoYmluZGluZ0lEKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUHJvdG9jb2wgY29uZmlndXJlZCBpbmNvcnJlY3RseSIsIHAuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpOwotICAgICAgICAqLwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIHNlZSBpZiB3ZSBhcmUgZGVmYXVsdGluZyB0aGUgc29hcCBiaW5kaW5nIHRvIFNPQVAgMS4xCi0gICAgICogY29ycmVjdGx5IGluIHRoZSBhYnNlbmNlIG9mIGEgV1NETCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpbmRpbmdOb1dTREwoKSB7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uRGVzY3JpcHRpb25UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzFlNTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogRGlyZWN0bHkgdGVzdCB0aGUgRGVzY3JpcHRpb24gY2xhc3NlcyBidWlsdCB2aWEgYW5ub3RhdGlvbnMgd2l0aG91dCBhIFdTREwgZmlsZS4KLSAqIFRoZXNlIHRlc3RzIGZvY3VzIG9uIGNvbWJpbmF0aW9ucyBvZiB0aGUgZm9sbG93aW5nOgotICogLSBBIGdlbmVyaWMgc2VydmljZSAobm8gYW5ub3RhdGlvbnMpCi0gKiAtIEEgZ2VuZXJhdGVkIHNlcnZpY2UgKGFubm90YXRpb25zKQotICogLSBBbiBTRUkKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25EZXNjcmlwdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIC8qIAotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBUZXN0cwotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXJ2aWNlKCkgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkIjsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobnVsbCwgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgU3RyaW5nIHBvcnRMb2NhbFBhcnQgPSAiRWNob1NlcnZpY2VBbm5vdGF0ZWRQb3J0IjsKLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7Ci0gICAgICAgIERvY3VtZW50TGl0ZXJhbFdyYXBwZWRQcm94eSBkbHdwID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgRG9jdW1lbnRMaXRlcmFsV3JhcHBlZFByb3h5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIEVuZHBvaW50IGFuZCBFbmRwb2ludEludGVyZmFjZSBEZXNjcmlwdGlvbnMgd2VyZSBjcmVhdGVkIGNvcnJlY3RseQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFbmRwb2ludCBub3QgY3JlYXRlZCAiLCBlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIkVuZHBvaW50SW50ZXJmYWNlIG5vdCBjcmVhdGVkIiwgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIC8vIFZlcmlmeSB3ZSBjYW4gZ2V0IHRoZSBzYW1lIGVuZHBvaW50IGRlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBTRUkgY2xhc3MKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGZyb21TRUlDbGFzcyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKERvY3VtZW50TGl0ZXJhbFdyYXBwZWRQcm94eS5jbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLGZyb21TRUlDbGFzcy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjcmlwdGlvbiwgZnJvbVNFSUNsYXNzWzBdKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgZ2V0T3BlcmF0aW9uIG1ldGhvZHMgcGFyYW1ldGVyIHZhbGlkYXRpb24KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25SZXN1bHRBcnJheSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uZ2V0T3BlcmF0aW9uKChRTmFtZSkgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uUmVzdWx0QXJyYXkpOwotICAgICAgICBvcGVyYXRpb25SZXN1bHRBcnJheSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgiIiwiIikpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvblJlc3VsdEFycmF5KTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uUmVzdWx0ID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5nZXRPcGVyYXRpb24oKE1ldGhvZCkgbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uUmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgZ2V0T3BlcmF0aW9ucygpOiBOdW1iZXIgb2YgbWV0aG9kcyBvbiBTRUkgc2hvdWxkIG1hdGNoIG51bWJlciBvZiBvcGVyYXRpb25EZXNjcmlwdGlvbnMKLSAgICAgICAgTWV0aG9kW10gc2VpTWV0aG9kcyA9IERvY3VtZW50TGl0ZXJhbFdyYXBwZWRQcm94eS5jbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIG9wZXJhdGlvblJlc3VsdEFycmF5ID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIFNFSSBtZXRob2RzIGFuZCBvcGVyYXRpb25zIGRpZCBub3QgbWF0Y2giLCBzZWlNZXRob2RzLmxlbmd0aCwgb3BlcmF0aW9uUmVzdWx0QXJyYXkubGVuZ3RoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgZ2V0T3BlcmF0aW9uKFFOYW1lKQotICAgICAgICAvLyBWZXJpZnkgQFdlYk1ldGhvZC5uYW1lIGlzIHVzZWQgaWYgcHJlc2VudC4gIFNlZSB0aGUgU0VJIGNsYXNzIGFubm90YXRpb25zIGZvciBtb3JlIGluZm9ybWF0aW9uCi0gICAgICAgIC8vIFRoZSBTRUkgaGFzIEBXZWJNZXRob2QgYW5ub3RhdGlvbnMgdGhhdCBvdmVycmlkZSB0aGUgbmFtZSBvZiAiaW52b2tlQXN5bmMiLCBzbyBub25lIHNob3VsZCBiZSBmb3VuZC4KLSAgICAgICAgUU5hbWUgamF2YU1ldGhvZFFOYW1lID0gbmV3IFFOYW1lKCIiLCAiaW52b2tlQXN5bmMiKTsKLSAgICAgICAgb3BlcmF0aW9uUmVzdWx0QXJyYXkgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbihqYXZhTWV0aG9kUU5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvblJlc3VsdEFycmF5KTsKLSAgICAgICAgLy8gVGhlIFNFSSBoYXMgQFdlYk1ldGhvZCBhbm5vdGF0aW9ucyB0aGF0IG5hbWUgdGhyZWUgb3BlcmF0aW9ucyAiaW52b2tlIgotICAgICAgICBqYXZhTWV0aG9kUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJpbnZva2UiKTsKLSAgICAgICAgb3BlcmF0aW9uUmVzdWx0QXJyYXkgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbihqYXZhTWV0aG9kUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvblJlc3VsdEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG9wZXJhdGlvblJlc3VsdEFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IGdldE9wZXJhdGlvbihNZXRob2QpCi0gICAgICAgIC8vIFZlcmlmeSBhbiBTRUkgbWV0aG9kIGxvb2t1cCB3b3JrcwotICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbihzZWlNZXRob2RzWzBdKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25SZXN1bHQpOwotICAgICAgICAvLyBWZXJpZnkgYSBub24tU0VJIG1ldGhvZCByZXR1cm5zIGEgbnVsbAotICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpWzBdKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25SZXN1bHQpOwotICAgIH0KLSAgICAKLSAgICAgICAKLSAgICAvKgotICAgICAqIFRPIFRFU1QKLSAgICAgKiAtIEludmFsaWQgbmFtZXNwYWNlLiAgVE5TIGluIGFubm90YXRpb24gZG9lc24ndCBtYXRjaCBvbmUgZnJvbSBnZXRQb3J0Ci0gICAgICogLSBNdWx0aXBsZSBzZXJ2aWNlLmdldFBvcnQoKSBjYWxscyB3aXRoIHNhbWUgU0VJIGFuZCBkaWZmZXJlbnQgUU5hbWUsIGFuZCB0aGF0IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzYyhDbGFzcykgcmV0dXJucyBtdWx0aWVsZW1lbnQgYXJyYXkKLSAgICAgKiAtIFRlc3Qgc2VydmljZS5nZXRQb3J0KC4uKSB3aXRoIHNhbWUgUU5hbWU7IHNob3VsZCByZXR1cm4gc2FtZSBkZXNjcnBwdGlvbgotICAgICAqLwotLyogICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkU2VydmljZUdldEVuZHBvaW50KCkgewotICAgICAgICBRTmFtZSB2YWxpZFBvcnRRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24odmFsaWRQb3J0UW5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZExvY2FscGFydFNlcnZpY2VHZXRFbmRwb2ludCgpIHsKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkludmFsaWRFY2hvUG9ydCIpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRbmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmFtZXNwYWNlU2VydmljZUdldEVuZHBvaW50KCkgewotICAgICAgICBRTmFtZSB2YWxpZFBvcnRRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvSU5WQUxJRCIsICJFY2hvUG9ydCIpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRbmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLSovICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0NsaWVudEFubm90YXRpb25UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0NsaWVudEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjVhY2RiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9DbGllbnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsNCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUZXN0IHRoYXQgdGhlIGFubm90YXRpb25zIHZhbGlkIG9uIGEgc2VydmljZSByZXF1ZXN0ZXIgY2FuIGJlIA0KLSAqIHByb2Nlc3NlZC4gDQotICovDQotcHVibGljIGNsYXNzIENsaWVudEFubm90YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkNsaWVudEFubm90YXRpb25UZXN0cyI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLSAgICBwcml2YXRlIFN0cmluZyBwb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnQiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJQW5ub3RhdGlvbnMoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudEFubm90YXRpb25UZXN0c1NlcnZpY2UobnVsbCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLSAgICAgICAgQ2xpZW50QW5ub3RhdGlvblRlc3RzU0VJIHBvcnQgPSBzZXJ2aWNlLmdldFBvcnQocG9ydFFOYW1lLCBDbGllbnRBbm5vdGF0aW9uVGVzdHNTRUkuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50DQotY2xhc3MgQ2xpZW50QW5ub3RhdGlvblRlc3RzU2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgcHJvdGVjdGVkIENsaWVudEFubm90YXRpb25UZXN0c1NlcnZpY2UoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLUBIYW5kbGVyQ2hhaW4oZmlsZT0iQ2xpZW50QW5ub3RhdGlvblRlc3RzSGFuZGxlci54bWwiKQ0KLWludGVyZmFjZSBDbGllbnRBbm5vdGF0aW9uVGVzdHNTRUkgew0KLSANCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0DQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAV2ViUGFyYW0NCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcpOw0KLSAgICANCi0gICAgQE9uZXdheQ0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoKTsNCi0gICAgDQotICAgIEBSZXNwb25zZVdyYXBwZXINCi0gICAgQFJlcXVlc3RXcmFwcGVyDQotICAgIHB1YmxpYyBTdHJpbmcgZWNob1dyYXAoU3RyaW5nIGFydCk7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9DbGllbnRBbm5vdGF0aW9uVGVzdHNIYW5kbGVyLnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9DbGllbnRBbm5vdGF0aW9uVGVzdHNIYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5OTYzMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQ2xpZW50QW5ub3RhdGlvblRlc3RzSGFuZGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08andzOmhhbmRsZXItY2hhaW5zIHhtbG5zOmp3cz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIj4NCi0gIDxqd3M6aGFuZGxlci1jaGFpbj4NCi0gICAgPGp3czpoYW5kbGVyPg0KLSAgICAgIDxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkR1bW15U09BUEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLSAgICA8L2p3czpoYW5kbGVyPg0KLSAgICA8andzOmhhbmRsZXI+DQotICAgICAgPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlMb2dpY2FsSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotICAgIDwvandzOmhhbmRsZXI+DQotICA8L2p3czpoYW5kbGVyLWNoYWluPg0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlsczIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlsczIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkNmQyZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25UZXN0VXRpbHMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVGVzdFV0aWxzMiB7Ci0gICAgCi0gICAgLyoKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBUZXN0IHV0aWxpdHkgbWV0aG9kcwotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0V1NETFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFdTRExVUkwoIldTRExUZXN0cy53c2RsIik7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICAvLyBHZXQgdGhlIFVSTCB0byB0aGUgV1NETCBmaWxlLiAgTm90ZSB0aGF0ICdiYXNlZGlyJyBpcyBzZXR1cCBieSBNYXZlbgotICAgICAgICBTdHJpbmcgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKTsKLSAgICAgICAgcmV0dXJuIGJhc2VkaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvIiArIHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0V1NETFVSTChTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGdldFdTRExMb2NhdGlvbih3c2RsRmlsZU5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBGaWxlKHVybFN0cmluZykuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiQ2F1Z2h0IGV4Y2VwdGlvbiBjcmVhdGluZyBXU0RMIFVSTCA6IiArIHVybFN0cmluZyArICI7IGV4Y2VwdGlvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbFVSTDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdGljIERlZmluaXRpb24gY3JlYXRlV1NETERlZmluaXRpb24oVVJMIHdzZGxVUkwpIHsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETCh3c2RsVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIKLSAgICAgICAgICAgICAgICAgICAgLmRlYnVnKCIqKiogRVJST1IgKioqOiBDYXVnaHQgZXhjZXB0aW9uIHRyeWluZyB0byBjcmVhdGUgV1NETCBEZWZpbml0aW9uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBTZXJ2aWNlRGVsZWdhdGUgZ2V0U2VydmljZURlbGVnYXRlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICAvLyBOZWVkIHRvIGdldCB0byB0aGUgcHJpdmF0ZSBTZXJ2aWNlLl9kZWxlZ2F0ZSBmaWVsZCBpbiBvcmRlciB0byBnZXQgdG8gdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiB0byB0ZXN0Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSByZXR1cm5TZXJ2aWNlRGVsZWdhdGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzZXJ2aWNlRGVsZ2F0ZUZpZWxkID0gc2VydmljZS5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKClbMF07Ci0gICAgICAgICAgICAgICAgc2VydmljZURlbGdhdGVGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IChTZXJ2aWNlRGVsZWdhdGUpIHNlcnZpY2VEZWxnYXRlRmllbGQuZ2V0KHNlcnZpY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSBhIGdlbmVyYXRlZCBzZXJ2aWNlIHN1YmNsYXNzLCBzbyBnZXQgdGhlIGRlbGVnYXRlIGZyb20gdGhlIHN1cGVyY2xhc3MKLSAgICAgICAgICAgICAgICBGaWVsZCBzZXJ2aWNlRGVsZWdhdGVGaWVsZCA9IHNlcnZpY2UuZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKVswXTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGVsZWdhdGVGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VEZWxlZ2F0ZSA9IChTZXJ2aWNlRGVsZWdhdGUpIHNlcnZpY2VEZWxlZ2F0ZUZpZWxkLmdldChzZXJ2aWNlKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuU2VydmljZURlbGVnYXRlOwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHJldHVybkNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIC8vIE5lZWQgdG8gZ2V0IHRoZSBjb21wb3NpdGUgb2ZmIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZ2V0dGVyIG1ldGhvZCwgYnV0IGl0IGlzIGFsbAotICAgICAgICAvLyBwYWNrYWdlZCBwcm90ZWN0ZWQgYW5kIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgZ2V0Q29tcG9zaXRlID0gc3ZjRGVzYy5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUiKTsKLSAgICAgICAgICAgIGdldENvbXBvc2l0ZS5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuQ29tcG9zaXRlID0gKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkgZ2V0Q29tcG9zaXRlLmludm9rZShzdmNEZXNjLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVybkNvbXBvc2l0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2N1bWVudExpdGVyYWxXcmFwcGVkUHJveHkuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2N1bWVudExpdGVyYWxXcmFwcGVkUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjZDQ2ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRG9jdW1lbnRMaXRlcmFsV3JhcHBlZFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5hbmNpYWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlOwotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2UobmFtZSA9ICJEb2NMaXRXcmFwcGVkUHJveHkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiKQotcHVibGljIGludGVyZmFjZSBEb2N1bWVudExpdGVyYWxXcmFwcGVkUHJveHkgewotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQE9uZXdheQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5Vm9pZCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuT25lV2F5Vm9pZCIpCi0gICAgcHVibGljIHZvaWQgb25lV2F5Vm9pZCgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG9uZXdheVN0cgotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAT25ld2F5Ci0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5PbmVXYXkiKQotICAgIHB1YmxpYyB2b2lkIG9uZVdheSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib25ld2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgb25ld2F5U3RyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlR3b1dheUhvbGRlcj4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5SG9sZGVyIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpCi0gICAgcHVibGljIFJlc3BvbnNlPFR3b1dheUhvbGRlcj4gdHdvV2F5SG9sZGVyQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBpbnQgdHdvV2F5SG9sZGVySW50KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlclN0cgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheUhvbGRlciIsIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5SG9sZGVyQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBpbnQgdHdvV2F5SG9sZGVySW50LAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhc3luY0hhbmRsZXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgQXN5bmNIYW5kbGVyPFR3b1dheUhvbGRlcj4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJJbnQKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVyU3RyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXIiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBwdWJsaWMgdm9pZCB0d29XYXlIb2xkZXIoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkKLSAgICAgICAgSG9sZGVyPEludGVnZXI+IHR3b1dheUhvbGRlckludCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdHdvd2F5U3RyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGU+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInR3b1dheSIsIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiB0d29XYXlBc3luYygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgdHdvd2F5U3RyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5IiwgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5IikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJSZXR1cm5UeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUFzeW5jKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIsCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXkiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBTdHJpbmcgdHdvV2F5KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyB0d293YXlTdHIpOwotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW52b2tlU3RyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGU+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImludm9rZSIsIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IGludm9rZUFzeW5jKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyBpbnZva2VTdHIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGludm9rZVN0cgotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiLCBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGUiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIGludm9rZVN0ciwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEFzeW5jSGFuZGxlcjxSZXR1cm5UeXBlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGludm9rZVN0cgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXR1cm5fc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImludm9rZV9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIGludm9rZVN0cik7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuRmluT3BSZXNwb25zZT4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmluT3AiLCBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC9maW5PcCIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBSZXNwb25zZTxGaW5PcFJlc3BvbnNlPiBmaW5PcEFzeW5jKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvcCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBGaW5hbmNpYWxPcGVyYXRpb24gb3ApOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcgotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU8PyBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImZpbk9wIiwgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvZmluT3AiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcFJlc3BvbnNlIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IGZpbk9wQXN5bmMoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCwKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEFzeW5jSGFuZGxlcjxGaW5PcFJlc3BvbnNlPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuRmluYW5jaWFsT3BlcmF0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC9maW5PcCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3AiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBGaW5hbmNpYWxPcGVyYXRpb24gZmluT3AoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9HZXREZXNjRnJvbUJpbmRpbmdQcm92aWRlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vR2V0RGVzY0Zyb21CaW5kaW5nUHJvdmlkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTMyMWIwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9HZXREZXNjRnJvbUJpbmRpbmdQcm92aWRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LmVjaG8uRWNob1BvcnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGVzdCB0aGF0IHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGNhbiBiZSBnb3R0ZW4gZnJvbQotICogdGhlIEJpbmRpbmcgUHJvdmlkZXIgaW1wbCBjbGFzcyBhbmQgdGhhdCB0aGUgQXhpc1NlcnZpY2UgY2FuIGJlIAotICogZ290dGVuIGZyb20gdGhlIEVuZHBvaW50RGVzYy4gIE5vdGUgdGhhdCB0aGUgQmluZGluZ1Byb3ZpZGVyIGNsYXNzIGlzIE5PVAotICogdGhlIGpheHdzIEFQSSBvbmU7IGl0IGlzIHRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBCaW5kaW5nUHJvdmlkZXIgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZXREZXNjRnJvbUJpbmRpbmdQcm92aWRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB3c2RsU09BUEFkZHJlc3MgPSAiaHR0cDovL2xvY2FsaG9zdDo2MDYwL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlIjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yUHJveHkoKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlIjsKLQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbFVSTCk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHZhbGlkUG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgIkVjaG9Qb3J0Iik7Ci0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIoZWNob1BvcnQpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBlbmRwb2ludCBhZGRyZXNzIHNob3VsZCBtYXRjaCB3aGF0IGlzIGluIHRoZSBXU0RMCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRBZGRyZXNzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3c2RsU09BUEFkZHJlc3MsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JEaXNwYXRjaCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsVVJMKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBlbmRwb2ludCBhZGRyZXNzIHNob3VsZCBtYXRjaCB3aGF0IGlzIGluIHRoZSBXU0RMCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRBZGRyZXNzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh3c2RsU09BUEFkZHJlc3MsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JBZGRQb3J0KCkgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJFY2hvU2VydmljZSI7Ci0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxVUkwpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICBRTmFtZSB2YWxpZFBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksICJFY2hvUG9ydEFkZGVkIik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydCh2YWxpZFBvcnRRTmFtZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHZhbGlkUG9ydFFOYW1lLCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsKLSAgICAgICAgCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBkaXNwYXRjaDsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IGJpbmRpbmdQcm92aWRlci5nZXRTZXJ2aWNlRGVsZWdhdGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IGJpbmRpbmdQcm92aWRlci5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZSk7Ci0gICAgICAgIC8vIFRoZSBlbmRwb2ludCBhZGRyZXNzIHNob3VsZCBiZSBudWxsIHNpbmNlIGl0IHdhc24ndCBzcGVjaWZpZWQgb24gdGhlIGFkZFBvcnQKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEFkZHJlc3MoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChlbmRwb2ludEFkZHJlc3MpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUyID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgIkVjaG9Qb3J0QWRkZWQyIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwb3J0MkVuZHBvaW50QWRkcmVzcyA9ICJodHRwOi8vdGVzdEFkZHJlc3M6NjA2MC9teS90ZXN0L2FkZHJlc3MiOyAKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHZhbGlkUG9ydFFOYW1lMiwgbnVsbCwgcG9ydDJFbmRwb2ludEFkZHJlc3MpOwotICAgICAgICBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUyLCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsKLSAgICAgICAgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2g7Ci0gICAgICAgIGVuZHBvaW50RGVzYyA9IGJpbmRpbmdQcm92aWRlci5nZXRFbmRwb2ludERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgLy8gVGhlIGVuZHBvaW50IGFkZHJlc3Mgc2hvdWxkIGJlIGFzIHNldCBvbiB0aGUgYWRkUG9ydCBhYm92ZS4KLSAgICAgICAgZW5kcG9pbnRBZGRyZXNzID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocG9ydDJFbmRwb2ludEFkZHJlc3MsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JQcm94eU5vV1NETCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlY2hvUG9ydCk7Ci0gICAgICAgIAotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcilQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihlY2hvUG9ydCk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBiaW5kaW5nUHJvdmlkZXIuZ2V0U2VydmljZURlbGVnYXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBiaW5kaW5nUHJvdmlkZXIuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UpOwotICAgICAgICAvLyBUaGUgZW5kcG9pbnQgYWRkcmVzcyBzaG91bGQgYmUgbnVsbCBzaW5jZSB0aGVyZSB3YXMgbm8gV1NETCBhbmQgaXQgaGFzbid0IGJlZW4gc2V0IHlldAotICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50QWRkcmVzcygpOwotICAgICAgICBhc3NlcnROdWxsKGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JEaXNwYXRjaE5vV1NETCgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCAiRWNob1BvcnQiKTsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEZvckFkZFBvcnROb1dTREwoKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlIjsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHZhbGlkUG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgIkVjaG9Qb3J0QWRkZWQiKTsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHZhbGlkUG9ydFFOYW1lLCBudWxsLCBudWxsKTsKLSAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICAKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIGRpc3BhdGNoOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gYmluZGluZ1Byb3ZpZGVyLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUG9ydFNlbGVjdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUG9ydFNlbGVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTVlNWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BvcnRTZWxlY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5TZXJ2aWNlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5lY2hvLkVjaG9Qb3J0OwotCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0U2VsZWN0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMyA9ICJBZGROdW1iZXJzU2VydmljZTMiOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlRGVzY1BvcnRTZWxlY3Rpb25NZXRob2RzKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8zKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbldTREwgc2VydmljZURlc2NXU0RMID0gKFNlcnZpY2VEZXNjcmlwdGlvbldTREwpIHNlcnZpY2VEZXNjOwotICAgICAgICAKLSAgICAgICAgTWFwIGFsbFBvcnRzID0gc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYWxsUG9ydHMuc2l6ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFR5cGUiKTsgCi0gICAgICAgIExpc3Q8UG9ydD4gcG9ydHNVc2luZ1BvcnRUeXBlID0gc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0c1VzaW5nUG9ydFR5cGUocG9ydFR5cGVRTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBwb3J0c1VzaW5nUG9ydFR5cGUuc2l6ZSgpKTsKLQotICAgICAgICBRTmFtZSBvdGhlclBvcnRUeXBlUU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFR5cGVPdGhlclBUIik7IAotICAgICAgICBMaXN0PFBvcnQ+IHBvcnRzVXNpbmdPdGhlclBvcnRUeXBlID0gc2VydmljZURlc2NXU0RMLmdldFdTRExQb3J0c1VzaW5nUG9ydFR5cGUob3RoZXJQb3J0VHlwZVFOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvcnRzVXNpbmdPdGhlclBvcnRUeXBlLnNpemUoKSk7Ci0KLSAgICAgICAgTGlzdDxQb3J0PiBwb3J0c1VzaW5nU09BUEFkZHJlc3MgPSBzZXJ2aWNlRGVzY1dTREwuZ2V0V1NETFBvcnRzVXNpbmdTT0FQQWRkcmVzcyhwb3J0c1VzaW5nUG9ydFR5cGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydHNVc2luZ1NPQVBBZGRyZXNzLnNpemUoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3J0U2VsZWN0aW9uKCkgewotICAgICAgICAvLyBUZXN0IHRoZSBTZXJ2aWNlLmdldFBvcnQgY2FsbAotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8zKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgQWRkTnVtYmVyc1BvcnRUeXBlIHNlbGVjdFBvcnQgPSBzZXJ2aWNlLmdldFBvcnQoQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpUHJveHkuZ2V0SW52b2NhdGlvbkhhbmRsZXIoc2VsZWN0UG9ydCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gYmluZGluZ1Byb3ZpZGVyLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgUU5hbWUgc2VsZWN0ZWRQb3J0UU5hbWUgPSBlbmRwb2ludERlc2MuZ2V0UG9ydFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VsZWN0ZWRQb3J0UU5hbWUpOwotICAgICAgICAvLyBXZSBleHBlY3QgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIFdTREwgd2hpY2ggdXNlcyB0aGUgUG9ydFR5cGUgZm9yIHRoZSBTRUkgQWRkTnVtYmVyc1BvcnRUeXBlIHRvIGJlIHNlbGVjdGVkCi0gICAgICAgIC8vIFVORk9SVFVOQVRFTFkhICBXU0RMNEogU2VydmljZS5nZXRQb3J0cygpLCB3aGljaCByZXR1cm5zIGEgTWFwIG9mIHBvcnRzIHVuZGVyIHRoZSBzZXJ2aWNlIERPRVMgTk9UIHJldHVybgotICAgICAgICAvLyB0aGVtIGluIHRoZSBvcmRlciBkZWZpbmVkIGluIHRoZSBXU0RMLiAgVGhlcmVmb3JlLCB3ZSBjYW4ndCBuZWNlc3NhcmlseSBwcmVkaWN0IHdoaWNoIG9uZSB3ZSdsbCBnZXQgYmFjay4KLSAgICAgICAgLy8gU28sIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIG1heSBjYXVzZSB0aGUgdGVzdCB0byBmYWlsLgotLy8gICAgICAgIFFOYW1lIGV4cGVjdGVkUU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFMzUDIiKTsKLS8vICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRRTmFtZSwgc2VsZWN0ZWRQb3J0UU5hbWUpOwotICAgICAgICAvLyBTbywgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIGp1c3QgdGVzdCB0aGF0IE9ORSBvZiB0aGUgdmFsaWQgcG9ydHMgaXMgdGhlIG9uZSB0aGF0IHdhcyBzZWxlY3RlZC4KLSAgICAgICAgYm9vbGVhbiB0ZXN0U3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBRTmFtZVtdIHZhbGlkUG9ydHMgPSBuZXcgUU5hbWVbM107Ci0gICAgICAgIHZhbGlkUG9ydHNbMF0gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJBZGROdW1iZXJzUG9ydFMzUDIiKTsKLSAgICAgICAgdmFsaWRQb3J0c1sxXSA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgIkFkZE51bWJlcnNQb3J0UzNQMyIpOwotICAgICAgICB2YWxpZFBvcnRzWzJdID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiQWRkTnVtYmVyc1BvcnRTM1A0Iik7Ci0gICAgICAgIGZvciAoUU5hbWUgY2hlY2tQb3J0IDogdmFsaWRQb3J0cykgewotICAgICAgICAgICAgaWYgKHNlbGVjdGVkUG9ydFFOYW1lLmVxdWFscyhjaGVja1BvcnQpKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUodGVzdFN1Y2Nlc3NmdWwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBvcnRTZWxlY3Rpb24oKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoIldTRExNdWx0aVRlc3RzLndzZGwiKTsKLQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzMpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gcG9ydHMgaW4gdGhlIHNlcnZpY2UgdGhhdCB1c2UgdGhpcyBTRUkhCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvUG9ydCBzZWxlY3RQb3J0ID0gc2VydmljZS5nZXRQb3J0KEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBoYXZlIGZvdW5kIGEgcG9ydCBmb3IgdGhlIGdpdmVuIFNFSSEiKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY29kZSBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzQzOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSA9ICJBZGROdW1iZXJzU2VydmljZTEiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8yID0gIkFkZE51bWJlcnNTZXJ2aWNlMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1BPUlRfUzFQMSA9ICJBZGROdW1iZXJzUG9ydFMxUDEiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJRF9QT1JUX1MxUDIgPSAiQWRkTnVtYmVyc1BvcnRTMVAyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfUE9SVF9TMVAzID0gIkFkZE51bWJlcnNQb3J0UzFQMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1BPUlRfUzJQMSA9ICJBZGROdW1iZXJzUG9ydFMyUDEiOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJRF9QT1JUX1MyUDIgPSAiQWRkTnVtYmVyc1BvcnRTMlAyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURfUE9SVF9TMlAzID0gIkFkZE51bWJlcnNQb3J0UzJQMyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFZBTElEX1BPUlRfUzJQNCA9ICJBZGROdW1iZXJzUG9ydFMyUDQiOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTZXJ2aWNlTmFtZXNwYWNlKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0gICAgICAgIFFOYW1lIGludmFsaWRTZXJ2aWNlUU4gPSBuZXcgUU5hbWUoImludmFsaWRTZXJ2aWNlTmFtZXNwYWNlIiwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlIGludmFsaWRTZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgaW52YWxpZFNlcnZpY2VRTik7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGVkIHNlcnZpY2Ugd2l0aCBpbnZhbGlkIG5hbWVzcGFjZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU2VydmljZUxvY2FsUGFydCgpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgiV1NETE11bHRpVGVzdHMud3NkbCIpOwotICAgICAgICBRTmFtZSBpbnZhbGlkU2VydmljZVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiaW52YWxpZFNlcnZpY2VOYW1lIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlIGludmFsaWRTZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgaW52YWxpZFNlcnZpY2VRTik7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGVkIHNlcnZpY2Ugd2l0aCBpbnZhbGlkIG5hbWVzcGFjZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFNhbWVTZXJ2aWNlKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0gICAgICAgIAotICAgICAgICBRTmFtZSB2YWxpZFNlcnZpY2UxUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzEpOwotICAgICAgICBTZXJ2aWNlIHZhbGlkU2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCB2YWxpZFNlcnZpY2UxUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHZhbGlkU2VydmljZTEpOwotCi0gICAgICAgIFFOYW1lIHZhbGlkU2VydmljZTJRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2UgdmFsaWRTZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHZhbGlkU2VydmljZTJRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmFsaWRTZXJ2aWNlMik7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZE11bHRpU2VydmljZXMoKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoIldTRExNdWx0aVRlc3RzLndzZGwiKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIHZhbGlkU2VydmljZTFRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2UgdmFsaWRTZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHZhbGlkU2VydmljZTFRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodmFsaWRTZXJ2aWNlMSk7Ci0KLSAgICAgICAgUU5hbWUgdmFsaWRTZXJ2aWNlMlFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8yKTsKLSAgICAgICAgU2VydmljZSB2YWxpZFNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgdmFsaWRTZXJ2aWNlMlFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWxpZFNlcnZpY2UyKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSh2YWxpZFNlcnZpY2UxLCB2YWxpZFNlcnZpY2UyKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTZXJ2aWNlRGVjbGFyZWRQb3J0cygpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgiV1NETE11bHRpVGVzdHMud3NkbCIpOwotCi0gICAgICAgIFFOYW1lIHNlcnZpY2UxUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzEpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZTFRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTEpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZTFEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTEpOwotICAgICAgICBhc3NlcnROb3ROdWxsIChzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2UxRGVzYyA9IHNlcnZpY2UxRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTFEZXNjKTsKLSAgICAgICAgTGlzdDxRTmFtZT4gc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTFQb3J0c0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgc2VydmljZTFQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UxUG9ydEl0ZXJhdG9yID0gc2VydmljZTEuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTFQb3J0SXRlcmF0b3IsIHNlcnZpY2UxUG9ydHNMaXN0KTsKLQotICAgICAgICBRTmFtZSBzZXJ2aWNlMlFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8yKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIHNlcnZpY2UyUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2UyRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCAoc2VydmljZTJEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlMkRlc2MgPSBzZXJ2aWNlMkRlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyRGVzYyk7Ci0gICAgICAgIExpc3Q8UU5hbWU+IHNlcnZpY2UyUG9ydHNMaXN0ID0gc2VydmljZTJEZXNjLmdldFBvcnRzKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UyUG9ydHNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNlcnZpY2UyUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yPFFOYW1lPiBzZXJ2aWNlMlBvcnRJdGVyYXRvciA9IHNlcnZpY2UyLmdldFBvcnRzKCk7Ci0gICAgICAgIGFzc2VydFFOYW1lSXRlcmF0b3JTYW1lQXNMaXN0KHNlcnZpY2UyUG9ydEl0ZXJhdG9yLCBzZXJ2aWNlMlBvcnRzTGlzdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNlcnZpY2VBZGRlZFBvcnRzKCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZTFRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlMVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTFEZXNjID0gc2VydmljZTFEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMURlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMVBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBzZXJ2aWNlMS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UxLmFkZFBvcnQobmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiYWRkZWRQb3J0UzFQMiIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBJdGVyYXRvcjxRTmFtZT4gc2VydmljZTFQb3J0SXRlcmF0b3IgPSBzZXJ2aWNlMS5nZXRQb3J0cygpOwotICAgICAgICBhc3NlcnRRTmFtZUl0ZXJhdG9yU2FtZUFzTGlzdChzZXJ2aWNlMVBvcnRJdGVyYXRvciwgc2VydmljZTFQb3J0c0xpc3QpOwotCi0gICAgICAgIFFOYW1lIHNlcnZpY2UyUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzIpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZTJRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTIpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZTJEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTIpOwotICAgICAgICBhc3NlcnROb3ROdWxsIChzZXJ2aWNlMkRlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2UyRGVzYyA9IHNlcnZpY2UyRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTJEZXNjKTsKLSAgICAgICAgTGlzdDxRTmFtZT4gc2VydmljZTJQb3J0c0xpc3QgPSBzZXJ2aWNlMkRlc2MuZ2V0UG9ydHMoc2VydmljZTJEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTJQb3J0c0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgc2VydmljZTIuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJhZGRlZFBvcnRTMlAxIiksIG51bGwsIG51bGwpOwotICAgICAgICBzZXJ2aWNlMi5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMyUDIiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UyUG9ydHNMaXN0ID0gc2VydmljZTJEZXNjLmdldFBvcnRzKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UyUG9ydEl0ZXJhdG9yID0gc2VydmljZTIuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTJQb3J0SXRlcmF0b3IsIHNlcnZpY2UyUG9ydHNMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNlcnZpY2VEZWNsYXJlZFBvcnRzQWZ0ZXJHZXRQb3J0KCkgewotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCJXU0RMTXVsdGlUZXN0cy53c2RsIik7Ci0KLSAgICAgICAgUU5hbWUgc2VydmljZTFRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMSk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlMVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTFEZXNjID0gc2VydmljZTFEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMURlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMVBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMVAxID0gc2VydmljZTEuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzFQMSksIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7IAotICAgICAgICBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHNlcnZpY2UxUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBhZGROdW1iZXJzUG9ydFMxUDMgPSBzZXJ2aWNlMS5nZXRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfUE9SVF9TMVAzKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsgCi0gICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBzZXJ2aWNlMS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UxLmFkZFBvcnQobmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiYWRkZWRQb3J0UzFQMiIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBJdGVyYXRvcjxRTmFtZT4gc2VydmljZTFQb3J0SXRlcmF0b3IgPSBzZXJ2aWNlMS5nZXRQb3J0cygpOwotICAgICAgICBhc3NlcnRRTmFtZUl0ZXJhdG9yU2FtZUFzTGlzdChzZXJ2aWNlMVBvcnRJdGVyYXRvciwgc2VydmljZTFQb3J0c0xpc3QpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgc2VydmljZTJRTiA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfU0VSVklDRV9MT0NBTFBBUlRfMik7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBzZXJ2aWNlMlFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMik7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMkRlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTJEZXNjID0gc2VydmljZTJEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMkRlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMlBvcnRzTGlzdCA9IHNlcnZpY2UyRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMkRlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMlBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBzZXJ2aWNlMlBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMlAxID0gc2VydmljZTIuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzJQMSksIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7IAotICAgICAgICBzZXJ2aWNlMlBvcnRzTGlzdCA9IHNlcnZpY2UyRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMkRlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHNlcnZpY2UyUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBhZGROdW1iZXJzUG9ydFMyUDMgPSBzZXJ2aWNlMi5nZXRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgVkFMSURfUE9SVF9TMlAzKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsgCi0gICAgICAgIGFzc2VydEVxdWFscyg0LCBzZXJ2aWNlMlBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMlA0ID0gc2VydmljZTIuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzJQNCksIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7IAotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgc2VydmljZTIuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJhZGRlZFBvcnRTMlAxIiksIG51bGwsIG51bGwpOwotICAgICAgICBzZXJ2aWNlMi5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMyUDIiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UyUG9ydHNMaXN0ID0gc2VydmljZTJEZXNjLmdldFBvcnRzKHNlcnZpY2UyRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNiwgc2VydmljZTJQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UyUG9ydEl0ZXJhdG9yID0gc2VydmljZTIuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTJQb3J0SXRlcmF0b3IsIHNlcnZpY2UyUG9ydHNMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNTZXJ2aWNlKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlMVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCAiRHluYW1pY1NlcnZpY2UxIik7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZShudWxsLCBzZXJ2aWNlMVFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlMURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwgKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZTFEZXNjID0gc2VydmljZTFEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMURlc2MpOwotICAgICAgICBMaXN0PFFOYW1lPiBzZXJ2aWNlMVBvcnRzTGlzdCA9IHNlcnZpY2UxRGVzYy5nZXRQb3J0cyhzZXJ2aWNlMURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMVBvcnRzTGlzdCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2VydmljZTFQb3J0c0xpc3QuaXNFbXB0eSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlcnZpY2UxUG9ydHNMaXN0LnNpemUoKSk7Ci0gICAgICAgIEFkZE51bWJlcnNQb3J0VHlwZSBhZGROdW1iZXJzUG9ydFMxUDEgPSBzZXJ2aWNlMS5nZXRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImR5bmFtaWNQb3J0UzFQMSIpLCBBZGROdW1iZXJzUG9ydFR5cGUuY2xhc3MpOyAKLSAgICAgICAgc2VydmljZTFQb3J0c0xpc3QgPSBzZXJ2aWNlMURlc2MuZ2V0UG9ydHMoc2VydmljZTFEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlMVBvcnRzTGlzdC5zaXplKCkpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMVAzID0gc2VydmljZTEuZ2V0UG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJkeW5hbWljUG9ydFMxUDIiKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsgCi0gICAgICAgIHNlcnZpY2UxUG9ydHNMaXN0ID0gc2VydmljZTFEZXNjLmdldFBvcnRzKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VydmljZTFQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgc2VydmljZTEuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsICJhZGRlZFBvcnRTMVAxIiksIG51bGwsIG51bGwpOwotICAgICAgICBzZXJ2aWNlMS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDIiKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2UxUG9ydHNMaXN0ID0gc2VydmljZTFEZXNjLmdldFBvcnRzKHNlcnZpY2UxRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgc2VydmljZTFQb3J0c0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHNlcnZpY2UxUG9ydEl0ZXJhdG9yID0gc2VydmljZTEuZ2V0UG9ydHMoKTsKLSAgICAgICAgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3Qoc2VydmljZTFQb3J0SXRlcmF0b3IsIHNlcnZpY2UxUG9ydHNMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURpc3BhdGNoV1NETCgpIHsKLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0V1NETFVSTCgiV1NETE11bHRpVGVzdHMud3NkbCIpOwotCi0gICAgICAgIFFOYW1lIHNlcnZpY2UxUU4gPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1NFUlZJQ0VfTE9DQUxQQVJUXzEpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVSTCwgc2VydmljZTFRTik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTEpOwotICAgICAgICAvLyBDcmVhdGUgRGlzcGF0Y2ggc2hvdWxkIHdvcmsgb24gYSBXU0RMIGRlY2xhcmVkIHBvcnQgcHJpb3IgdG8gYSBnZXRQb3J0Ci0gICAgICAgIC8vIGFuZCBhZ2FpbiBhZnRlciB0aGUgY2FsbCB0byBnZXRQb3J0Ci0gICAgICAgIFFOYW1lIHZhbGlkUG9ydFFOYW1lID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9QT1JUX1MxUDEpOwotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGlzcGF0Y2gpOwotICAgICAgICBBZGROdW1iZXJzUG9ydFR5cGUgYWRkTnVtYmVyc1BvcnRTMVAxID0gc2VydmljZTEuZ2V0UG9ydCh2YWxpZFBvcnRRTmFtZSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhZGROdW1iZXJzUG9ydFMxUDEpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIERpc3BhdGNoIHNob3VsZCBOT1Qgd29yayBvbiBhIGR5bmFtaWMgcG9ydCB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQKLSAgICAgICAgLy8gYnV0IHNob3VsZCB3b3JrIGFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkCi0gICAgICAgIFFOYW1lIGFkZGVkUG9ydCA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2gyID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2goYWRkZWRQb3J0LCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRlIERpc3BhdGNoIG9uIG5vbi1leGlzdGFudCBwb3J0IHNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZTEuYWRkUG9ydChhZGRlZFBvcnQsIG51bGwsIG51bGwpOwotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoMiA9IHNlcnZpY2UxLmNyZWF0ZURpc3BhdGNoKGFkZGVkUG9ydCwgU3RyaW5nLmNsYXNzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaDIpOwotCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXNwYXRjaE5vV1NETCgpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgaW50ZW50aW9uYWxseSB1c2luZyB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgV1NETCB0ZXN0LCBldmVuIHRob3VnaCBubyBXU0RMIGlzCi0gICAgICAgIC8vIHByb3ZpZGVkLiAgVGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB1c2luZyB0aGUgc2FtZSBuYW1lcyBpbiB0aGUgYWJzY2Vuc2Ugb2YgV1NETCBkb2Vzbid0IGNhdXNlIGFueQotICAgICAgICAvLyBpc3N1ZXMuCi0gICAgICAgIAotICAgICAgICBRTmFtZSBzZXJ2aWNlMVFOID0gbmV3IFFOYW1lKFZBTElEX1NFUlZJQ0VfTkFNRVNQQUNFLCBWQUxJRF9TRVJWSUNFX0xPQ0FMUEFSVF8xKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2UxUU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UxKTsKLSAgICAgICAgLy8gQ3JlYXRlIERpc3BhdGNoIHNob3VsZCBOT1Qgd29yayBvbiBhIGR5bmFtaWMgcG9ydCBwcmlvciB0byBhIGdldFBvcnQKLSAgICAgICAgLy8gYnV0IHNob3VsZCB3b3JrIGFmdGVyIHRoZSBnZXRQb3J0IGNhdXNlcyB0aGUgcG9ydCB0byBiZSBhZGRlZC4KLSAgICAgICAgUU5hbWUgdmFsaWRQb3J0UU5hbWUgPSBuZXcgUU5hbWUoVkFMSURfU0VSVklDRV9OQU1FU1BBQ0UsIFZBTElEX1BPUlRfUzFQMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFN0cmluZy5jbGFzcywgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJDcmVhdGUgRGlzcGF0Y2ggb24gbm9uLWV4aXN0YW50IHBvcnQgc2hvdWxkIGhhdmUgdGhyb3duIGFuZCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQWRkTnVtYmVyc1BvcnRUeXBlIGFkZE51bWJlcnNQb3J0UzFQMSA9IHNlcnZpY2UxLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEFkZE51bWJlcnNQb3J0VHlwZS5jbGFzcyk7Ci0gICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2ggPSBzZXJ2aWNlMS5jcmVhdGVEaXNwYXRjaCh2YWxpZFBvcnRRTmFtZSwgU3RyaW5nLmNsYXNzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIERpc3BhdGNoIHNob3VsZCBOT1Qgd29yayBvbiBhIGR5bmFtaWMgcG9ydCB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZCB5ZXQKLSAgICAgICAgLy8gYnV0IHNob3VsZCB3b3JrIGFmdGVyIGl0IGhhcyBiZWVuIGFkZGVkCi0gICAgICAgIFFOYW1lIGFkZGVkUG9ydCA9IG5ldyBRTmFtZShWQUxJRF9TRVJWSUNFX05BTUVTUEFDRSwgImFkZGVkUG9ydFMxUDEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERpc3BhdGNoPFN0cmluZz4gZGlzcGF0Y2gyID0gc2VydmljZTEuY3JlYXRlRGlzcGF0Y2goYWRkZWRQb3J0LCBTdHJpbmcuY2xhc3MsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiQ3JlYXRlIERpc3BhdGNoIG9uIG5vbi1leGlzdGFudCBwb3J0IHNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biAiICsgZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZTEuYWRkUG9ydChhZGRlZFBvcnQsIG51bGwsIG51bGwpOwotICAgICAgICBEaXNwYXRjaDxTdHJpbmc+IGRpc3BhdGNoMiA9IHNlcnZpY2UxLmNyZWF0ZURpc3BhdGNoKGFkZGVkUG9ydCwgU3RyaW5nLmNsYXNzLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaDIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UU5hbWVJdGVyYXRvclNhbWVBc0xpc3QoSXRlcmF0b3I8UU5hbWU+IGl0ZXJhdG9yLCBMaXN0PFFOYW1lPiBsaXN0KSB7Ci0gICAgICAgIGludCBpdGVyYXRvclNpemUgPSAwOwotICAgICAgICBmb3IgKFFOYW1lIGl0ZXJhdG9yRWxlbWVudCA9IG51bGw7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7IAotICAgICAgICAgICAgaXRlcmF0b3JFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaXRlcmF0b3JTaXplKys7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoaXRlcmF0b3JFbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpLCBpdGVyYXRvclNpemUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9XU0RMRGVzY3JpcHRpb25UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExEZXNjcmlwdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2I1YmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExEZXNjcmlwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuU2VydmljZURlbGVnYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNoby5FY2hvUG9ydDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIERpcmVjdGx5IHRlc3QgdGhlIERlc2NyaXB0aW9uIGNsYXNzZXMgYnVpbHQgd2l0aCBhIFdTREwgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFdTRExEZXNjcmlwdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTsKLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfUE9SVCA9ICJFY2hvUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX05BTUVTUEFDRSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgcHJpdmF0ZSBRTmFtZSB2YWxpZFBvcnRRTmFtZSA9IG5ldyBRTmFtZShWQUxJRF9OQU1FU1BBQ0UsIFZBTElEX1BPUlQpOwotCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzZXJ2aWNlIGZvciBlYWNoIHRlc3QgdG8gdGVzdCB2YXJpb3VzIHZhbGlkIGFuZCBpbnZhbGlkCi0gICAgICAgIC8vIGZsb3dzCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBWQUxJRF9OQU1FU1BBQ0U7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2UiOwotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbFVSTCk7Ci0gICAgICAgIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVVJMLCBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgc2VydmljZURlc2NyaXB0aW9uID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBUZXN0cwotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTG9jYWxwYXJ0U2VydmljZUdldEVuZHBvaW50KCkgewotICAgICAgICBRTmFtZSBpbnZhbGlkUG9ydFFuYW1lID0gbmV3IFFOYW1lKFZBTElEX05BTUVTUEFDRSwgIkludmFsaWRFY2hvUG9ydCIpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihpbnZhbGlkUG9ydFFuYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgiRW5kcG9pbnREZXNjcmlwdGlvbiBzaG91bGQgbm90IGJlIGZvdW5kIiwgZW5kcG9pbnREZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lc3BhY2VTZXJ2aWNlR2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgIFFOYW1lIGludmFsaWRQb3J0UW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzL0lOVkFMSUQiLCBWQUxJRF9QT1JUKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24oaW52YWxpZFBvcnRRbmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoIkVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBmb3VuZCIsIGVuZHBvaW50RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEVuZHBvaW50RGVzY3JpcHRpb24gVGVzdHMKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRHZXRQb3J0V2l0aENsYXNzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQoRWNob1BvcnQuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkR2V0UG9ydFdpdGhDbGFzc0FuZFFOYW1lKCkgewotICAgICAgICBFY2hvUG9ydCBlY2hvUG9ydCA9IHNlcnZpY2UuZ2V0UG9ydCh2YWxpZFBvcnRRTmFtZSwgRWNob1BvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVjaG9Qb3J0KTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHZhbGlkUG9ydFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY1ZpYVNFSSA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKEVjaG9Qb3J0LmNsYXNzKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NWaWFTRUkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLCBlbmRwb2ludERlc2NWaWFTRUkpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0gICAgICAgIENsYXNzIHNlaSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTRUlDbGFzcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRWNob1BvcnQuY2xhc3MsIHNlaSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZE11bHRpcGxlR2V0UG9ydCgpIHsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlY2hvUG9ydCk7Ci0KLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQyID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRNdWx0aXBsZUdldFBvcnQoKSB7Ci0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvUG9ydDIgZWNob1BvcnQyID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydDIuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1Z2h0IGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGZsb3cKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkQWRkUG9ydCgpIHsKLSAgICAgICAgUU5hbWUgZGlzcGF0Y2hQb3J0UU4gPSBuZXcgUU5hbWUoVkFMSURfTkFNRVNQQUNFLCAiZGlzcGF0Y2hQb3J0Iik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChkaXNwYXRjaFBvcnRRTiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKGRpc3BhdGNoUG9ydFFOLCBzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0TnVsbChlbmRwb2ludEludGVyZmFjZURlc2MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFkZFBvcnRFeGlzdHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBvcnQodmFsaWRQb3J0UU5hbWUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWRkIGEgcG9ydCB0aGF0IGV4aXN0cyBpbiB0aGUgV1NETCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFkZFBvcnQoKSB7Ci0gICAgICAgIC8vIE51bGwgcG9ydFFuYW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBvcnQobnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBhZGQgYSBwb3J0IHdpdGggYSBudWxsIFFOYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRW1wdHkgUG9ydCBRTmFtZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZS5hZGRQb3J0KG5ldyBRTmFtZSgiIiwgIiIpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFkZCBhbiBlbXB0eSBwb3J0IFFOYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtcHR5IGJpbmRpbmcgSUQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UuYWRkUG9ydChuZXcgUU5hbWUoVkFMSURfTkFNRVNQQUNFLCAiZGlzcGF0Y2hQb3J0MiIpLCAiIiwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGRuJ3QgYmUgYWJsZSB0byBhZGQgYSBwb3J0IHdpdGggYW4gZW1wdHkgYmluZGluZyB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEludmFsaWQgYmluZGluZyBJRAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZS5hZGRQb3J0KG5ldyBRTmFtZShWQUxJRF9OQU1FU1BBQ0UsICJkaXNwYXRjaFBvcnQzIiksICJJbnZhbGlkQmluZGluZ1R5cGUiLCBudWxsKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZG4ndCBiZSBhYmxlIHRvIGFkZCBhIHBvcnQgd2l0aCBhbiBpbnZhbGlkIGJpbmRpbmcgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIGNhdWdodCAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRBZGRBbmRHZXRQb3J0KCkgewotICAgICAgICBRTmFtZSBkaXNwYXRjaFBvcnRRTiA9IG5ldyBRTmFtZShWQUxJRF9OQU1FU1BBQ0UsICJkaXNwYXRjaFBvcnQiKTsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KGRpc3BhdGNoUG9ydFFOLCBudWxsLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NWaWFTRUkgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihFY2hvUG9ydC5jbGFzcylbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjVmlhU0VJKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZHBvaW50RGVzYywgZW5kcG9pbnREZXNjVmlhU0VJKTsKLSAgICAgICAgCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludEludGVyZmFjZURlc2MpOwotICAgICAgICBDbGFzcyBzZWkgPSBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVjaG9Qb3J0LmNsYXNzLCBzZWkpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjRGlzcGF0Y2ggPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihkaXNwYXRjaFBvcnRRTiwgc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NEaXNwYXRjaCk7Ci0gICAgICAgCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjRGlzcGF0Y2ggPSBlbmRwb2ludERlc2NEaXNwYXRjaC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjRGlzcGF0Y2gpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDcmVhdGVEaXNwYXRjaCgpIHsKLSAgICAgICAgRGlzcGF0Y2g8U291cmNlPiBkaXNwYXRjaCA9IHNlcnZpY2UuY3JlYXRlRGlzcGF0Y2godmFsaWRQb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3BhdGNoKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHZhbGlkUG9ydFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICAvLyBTaW5jZSB0aGVyIGlzIG5vIFNFSSwgY2FuIG5vdCBnZXQgdGhlIGVuZHBvaW50RGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIHNlaSBjbGFzcwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjVmlhU0VJID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24oRWNob1BvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROdWxsKGVuZHBvaW50RGVzY1ZpYVNFSSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGVyZSB3aWxsIGJlIGFuIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gYmVjYXVzZSB0aGUgc2VydmljZSB3YXMgY3JlYXRlZCB3aXRoIAotICAgICAgICAvLyBXU0RMLCBob3dldmVyIHRoZXJlIHdpbGwgYmUgbm8gU0VJIGNyZWF0ZWQgYmVjYXVzZSBhIGdldFBvcnQgaGFzIG5vdCBiZWVuIGRvbmUKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDcmVhdGVBbmRHZXQoKSB7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHZhbGlkUG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24odmFsaWRQb3J0UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIC8vIFNpbmNlIHRoZXIgaXMgbm8gU0VJLCBjYW4gbm90IGdldCB0aGUgZW5kcG9pbnREZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgc2VpIGNsYXNzCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2NWaWFTRUkgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnREZXNjVmlhU0VJKTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCkpOwotCi0gICAgICAgIEVjaG9Qb3J0IGVjaG9Qb3J0ID0gc2VydmljZS5nZXRQb3J0KHZhbGlkUG9ydFFOYW1lLCBFY2hvUG9ydC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWNob1BvcnQpOwotICAgICAgICAvLyBTaW5jZSBhIGdldFBvcnQgaGFzIGJlZW4gZG9uZSwgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGdldCB0aGluZ3MgYmFzZWQgb24gdGhlIFNFSQotICAgICAgICBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgLy8gU2luY2UgdGhlciBpcyBubyBTRUksIGNhbiBub3QgZ2V0IHRoZSBlbmRwb2ludERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBzZWkgY2xhc3MKLSAgICAgICAgZW5kcG9pbnREZXNjVmlhU0VJID0gc2VydmljZURlc2NyaXB0aW9uLmdldEVuZHBvaW50RGVzY3JpcHRpb24oRWNob1BvcnQuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzY1ZpYVNFSSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbmRwb2ludERlc2MsIGVuZHBvaW50RGVzY1ZpYVNFSVswXSk7Ci0gICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVjaG9Qb3J0LmNsYXNzLCBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEdldEFuZENyZWF0ZSgpIHsKLSAgICAgICAgRWNob1BvcnQgZWNob1BvcnQgPSBzZXJ2aWNlLmdldFBvcnQodmFsaWRQb3J0UU5hbWUsIEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlY2hvUG9ydCk7Ci0gICAgICAgIERpc3BhdGNoPFNvdXJjZT4gZGlzcGF0Y2ggPSBzZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHZhbGlkUG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwYXRjaCk7Ci0KLSAgICAgICAgLy8gU2luY2UgYSBnZXRQb3J0IGhhcyBiZWVuIGRvbmUsIHNob3VsZCBub3cgYmUgYWJsZSB0byBnZXQgdGhpbmdzIGJhc2VkIG9uIHRoZSBTRUkKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbih2YWxpZFBvcnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgLy8gU2luY2UgdGhlciBpcyBubyBTRUksIGNhbiBub3QgZ2V0IHRoZSBlbmRwb2ludERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBzZWkgY2xhc3MKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzY1ZpYVNFSSA9IHNlcnZpY2VEZXNjcmlwdGlvbi5nZXRFbmRwb2ludERlc2NyaXB0aW9uKEVjaG9Qb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NWaWFTRUkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLCBlbmRwb2ludERlc2NWaWFTRUlbMF0pOwotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRJbnRlcmZhY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVjaG9Qb3J0LmNsYXNzLCBlbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U0VJQ2xhc3MoKSk7Ci0gICAgfQotICAgIC8vIFRPRE86IE5lZWQgdG8gYWRkIGEgc2ltaWxhciB0ZXN0IHdpdGggbm8gV1NETCBwcmVzZW50OyBub3RlIHRoYXQgaXQgY3VycmVudGx5IHdvdWxkIG5vdCBwYXNzCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRBZGRBbmRHZXRQb3J0KCkgewotICAgICAgICAvLyBTaG91bGQgbm90IGJlIGFibGUgdG8gZG8gYSBnZXRQb3J0IG9uIG9uZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGFkZFBvcnQKLSAgICAgICAgUU5hbWUgZGlzcGF0Y2hQb3J0UU4gPSBuZXcgUU5hbWUoVkFMSURfTkFNRVNQQUNFLCAiZGlzcGF0Y2hQb3J0Iik7Ci0gICAgICAgIHNlcnZpY2UuYWRkUG9ydChkaXNwYXRjaFBvcnRRTiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvUG9ydCBlY2hvUG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChkaXNwYXRjaFBvcnRRTiwgRWNob1BvcnQuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGEgV2ViU2VydmljZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gRWNob1BvcnQyIGlzIGlkZW50aWNhbCB0byBFY2hvUG9ydCwgYnV0IGl0IHNob3VsZCBzdGlsbCBjYXVzZSBhbiBleGNlcHRpb24KLS8vIGlmIGl0IGlzIHVzZWQgb24gYSBzdWJzZXF1ZW50IGdldFBvcnQgYWZ0ZXIgZ2V0UG9ydChFY2hvUG9ydC5jbGFzcykgaXMgZG9uZS4KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNob1BvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCB3c2RsTG9jYXRpb24gPSAiXFx3b3JrXFxhcHBzXFxlY2xpcHNlXFx3b3Jrc3BhY2VcXGF4aXMyLWxpdmVcXG1vZHVsZXNcXGpheHdzXFx0ZXN0LXJlc291cmNlc1xcd3NkbFxcV1NETFRlc3RzLndzZGwiKQotaW50ZXJmYWNlIEVjaG9Qb3J0MiB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXh0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIkVjaG8iLCBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJFY2hvIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNobyIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiRWNob1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNob1Jlc3BvbnNlIikKLSAgICBwdWJsaWMgdm9pZCBlY2hvKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0ZXh0IiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIsIG1vZGUgPSBNb2RlLklOT1VUKQotICAgICAgICBIb2xkZXI8U3RyaW5nPiB0ZXh0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dTRExUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY2MjM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9XU0RMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLlNlcnZpY2VEZWxlZ2F0ZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRlc3RzIGJ1aWxkaW5nIGEgU2VydmljZURlc2NyaXB0aW9uIHVzaW5nIFdTREwgYW5kIHRoZSBKQVhXUyBTZXJ2aWNlIEFQSS4gIAotICogTm90ZSB0aGF0IGEgU2VydmljZURlc2NyaXB0aW9uIGlzIGJ1aWx0IHdoZW4gYSBqYXZheC54bWwud3MuU2VydmljZSBpcyBjcmVhdGVkLiAgU2luY2UgdGhhdCBpcyB0aGUgYWN0dWFsIEFQSSAKLSAqIHRoYXQgc2hvdWxkIGJlIHVzZWQsIHRoaXMgdGVzdCB3aWxsIGNyZWF0ZSBTZXJ2aWNlIG9iamVjdHMgYW5kIHRoZW4gdXNlIGludHJvc3BlY3Rpb24KLSAqIHRvIGNoZWNrIHRoZSB1bmRlcmx5aW5nIFNlcnZpY2VEZWxlZ2F0ZSB3aGljaCBjb250YWlucyB0aGUgU2VydmljZURlc2NyaXB0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZFdTRExTZXJ2aWNlKCkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gbnVsbDsKLSAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSST0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJFY2hvU2VydmljZSI7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFdTRExVUkwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsVVJMKTsKLSAgICAgICAgc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIG5vdCBjcmVhdGVkIiwgc2VydmljZSk7Ci0KLSAgICAgICAgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2VydmljZURlbGVnYXRlIG5vdCBjcmVhdGVkIiwgc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24gPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNlcnZpY2VEZXNjcmlwdGlvbiBub3QgY3JlYXRlZCIsIHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgIAotLy8gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gc2VydmljZURlc2NyaXB0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0vLyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQXhpc1NlcnZpY2Ugbm90IGNyZWF0ZWQiLCBheGlzU2VydmljZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU2VydmljZUxvY2FsTmFtZSgpIHsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSST0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJCQURFY2hvU2VydmljZSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRXU0RMVVJMKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxVUkwpOwotICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVUkwsIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCkpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGZvciBpbnZhbGlkIFNlcnZpY2UgbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3c7IGl0IGlzIHJlYWxseSBtb3JlIGEgdGVzdCBvZiBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsV1NETExvY2F0aW9uKCkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkk9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyI7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSAiRWNob1NlcnZpY2VfbnVsbFdTREwiOwotICAgICAgICBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUobmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIlNlcnZpY2Ugbm90IGNyZWF0ZWQiLCBzZXJ2aWNlKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU2VydmljZU5hbWUoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKG51bGwpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGZvciBudWxsIFNlcnZpY2UgbmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIGZsb3c7IGl0IGlzIHJlYWxseSBtb3JlIGEgdGVzdCBvZiBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBTZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgICAgICAgIC8vIGJ1dCB3ZSBhcmUgdmVyaWZ5aW5nIGV4cGVjdGVkIGJlaGF2aW9yLgotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc0ZhdWx0X0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzE1ZGNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnM7Ci0KLWltcG9ydCBvcmcudGVzdC5hZGRudW1iZXJzLkFkZE51bWJlcnNGYXVsdDsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYkZhdWx0KGZhdWx0QmVhbj0iIiwgbmFtZSA9ICJBZGROdW1iZXJzRmF1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2R1a2Uvb3JnIikKLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uCi0gICAgZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQotICAgIC8qKgotICAgICAqIEphdmEgdHlwZSB0aGF0IGdvZXMgYXMgc29hcGVudjpGYXVsdCBkZXRhaWwgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIEFkZE51bWJlcnNGYXVsdCBmYXVsdEluZm87Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmF1bHRJbmZvCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0ZhdWx0X0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0ZhdWx0IGZhdWx0SW5mbykgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhdWx0SW5mbwotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFkZE51bWJlcnNGYXVsdCBmYXVsdEluZm8sIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmYXVsdCBiZWFuOiBkdWtlLm9yZy5BZGROdW1iZXJzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0ZhdWx0IGdldEZhdWx0SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyOWJkYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnM7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcwotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAKLSAqIAotICovCi1AV2ViU2VydmljZShuYW1lID0gIkFkZE51bWJlcnNQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpCi1wdWJsaWMgaW50ZXJmYWNlIEFkZE51bWJlcnNQb3J0VHlwZSB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBhcmcxCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgaW50Ci0gICAgICogQHRocm93cyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZAotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImFkZE51bWJlcnMiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVycy5BZGROdW1iZXJzIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGROdW1iZXJzUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCBjbGFzc05hbWUgPSAib3JnLnRlc3QuYWRkbnVtYmVycy5BZGROdW1iZXJzUmVzcG9uc2UiKQotICAgIHB1YmxpYyBpbnQgYWRkTnVtYmVycygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXJnMCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIpCi0gICAgICAgIGludCBhcmcwLAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJhcmcxIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIikKLSAgICAgICAgaW50IGFyZzEpCi0gICAgICAgIHRocm93cyBBZGROdW1iZXJzRmF1bHRfRXhjZXB0aW9uCi0gICAgOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyZzAKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kCi0gICAgQE9uZXdheQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5SW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvdGVzdC9hZGRudW1iZXJzIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LmFkZG51bWJlcnMuT25lV2F5SW50IikKLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlJbnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFyZzAiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiKQotICAgICAgICBpbnQgYXJnMCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvQWRkTnVtYmVyc1BvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzUxOWEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzUG9ydFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJBZGROdW1iZXJzU2VydmljZSIsZW5kcG9pbnRJbnRlcmZhY2U9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlIikKLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzUG9ydFR5cGVJbXBsIGltcGxlbWVudHMgQWRkTnVtYmVyc1BvcnRUeXBlIHsKLQotICAgIEBSZXNvdXJjZQotICAgIHByaXZhdGUgV2ViU2VydmljZUNvbnRleHQgY3R4OwotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlI2FkZE51bWJlcnMoaW50LCBpbnQpCi0JICovCi0JcHVibGljIGludCBhZGROdW1iZXJzKGludCBhcmcwLCBpbnQgYXJnMSkgdGhyb3dzIEFkZE51bWJlcnNGYXVsdF9FeGNlcHRpb24gewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gUmVjZWl2ZWQgYWRkTnVtYmVycyByZXF1ZXN0IGZvciAiICsgYXJnMCArICIgYW5kICIgKyBhcmcxKTsKLSAgICAgICAgCi0gICAgICAgIGNoZWNrUHJvcGVydGllcygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGFyZzArYXJnMTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUHJvcGVydGllcygpIHsKLQkgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjdHguZ2V0TWVzc2FnZUNvbnRleHQoKTsKLQkgICAgTWFwIGhlYWRlcnMgPSAoTWFwKW1jLmdldChNZXNzYWdlQ29udGV4dC5IVFRQX1JFUVVFU1RfSEVBREVSUyk7Ci0JICAgIC8vIHRoZSBtYXAgc2hvdWxkIGNvbnRhaW4gc29tZSBoZWFkZXJzCi0JICAgIGlmIChoZWFkZXJzID09IG51bGwgfHwgaGVhZGVycy5pc0VtcHR5KCkpIHsKLQkgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJIVFRQIHJlcXVlc3QgaGVhZGVycyBtYXAgaXMgbnVsbCBvciBlbXB0eSEiKTsKLQkgICAgfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlLmFkZG51bWJlcnMuQWRkTnVtYmVyc1BvcnRUeXBlI29uZVdheUludChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgb25lV2F5SW50KGludCBhcmcwKSB7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCI+PiBSZWNlaXZlZCBvbmUtd2F5IHJlcXVlc3QuIik7Ci0gICAgICAgIHJldHVybjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9BZGROdW1iZXJzU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTljN2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3NhbXBsZS9hZGRudW1iZXJzL0FkZE51bWJlcnNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5zYW1wbGUuYWRkbnVtYmVyczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJBZGROdW1iZXJzU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIsIHdzZGxMb2NhdGlvbiA9ICJBZGROdW1iZXJzMS53c2RsIikKLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzU2VydmljZQotICAgIGV4dGVuZHMgU2VydmljZQotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT047Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwiOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAJdHJ5ewotCSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JICAgICAgICAJd3NkbExvY2F0aW9uID0gbmV3IEZpbGUoYmFzZURpciArIHdzZGxMb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIAl9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAJdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBBREROVU1CRVJTU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGROdW1iZXJzU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc1NlcnZpY2UoKSB7Ci0gICAgICAgIHN1cGVyKEFERE5VTUJFUlNTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCAiQWRkTnVtYmVyc1NlcnZpY2UiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIEFkZE51bWJlcnNQb3J0VHlwZQotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkFkZE51bWJlcnNQb3J0IikKLSAgICBwdWJsaWMgQWRkTnVtYmVyc1BvcnRUeXBlIGdldEFkZE51bWJlcnNQb3J0KCkgewotICAgICAgICByZXR1cm4gKEFkZE51bWJlcnNQb3J0VHlwZSlzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiLCAiQWRkTnVtYmVyc1BvcnQiKSwgQWRkTnVtYmVyc1BvcnRUeXBlLmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvQWRkTnVtYmVycy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFmM2E3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9BZGROdW1iZXJzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLQotPGRlZmluaXRpb25zIG5hbWU9IkFkZE51bWJlcnMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiCi0JeG1sbnM6dG5zPSJodHRwOi8vb3JnL3Rlc3QvYWRkbnVtYmVycyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+Ci0KLQotCTx0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy90ZXN0L2FkZG51bWJlcnMiPgotCQkJPGVsZW1lbnQgbmFtZT0iYWRkTnVtYmVyc1Jlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmludCIgLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcxIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9IkFkZE51bWJlcnNGYXVsdCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJmYXVsdEluZm8iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9Im9uZVdheUludCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ4c2Q6aW50IiAvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJPC94c2Q6c2NoZW1hPgotCTwvdHlwZXM+Ci0KLQk8bWVzc2FnZSBuYW1lPSJhZGROdW1iZXJzIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZE51bWJlcnMiIC8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImFkZE51bWJlcnNSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmFkZE51bWJlcnNSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iYWRkTnVtYmVyc0ZhdWx0Ij4KLQkJPHBhcnQgbmFtZT0iQWRkTnVtYmVyc0ZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTnVtYmVyc0ZhdWx0IiAvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJvbmVXYXlJbnQiPgotCQk8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6b25lV2F5SW50IiAvPgotCTwvbWVzc2FnZT4KLQotCTxwb3J0VHlwZSBuYW1lPSJBZGROdW1iZXJzUG9ydFR5cGUiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImFkZE51bWJlcnMiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzIiBuYW1lPSJhZGQiIC8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczphZGROdW1iZXJzUmVzcG9uc2UiIG5hbWU9ImFkZFJlc3BvbnNlIiAvPgotCQkJPGZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgbWVzc2FnZT0idG5zOmFkZE51bWJlcnNGYXVsdCIgLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5SW50IiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc1BvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLQkJCXN0eWxlPSJkb2N1bWVudCIgLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJhZGROdW1iZXJzIj4KLQkJCQotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJhZGROdW1iZXJzRmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0IG5hbWU9ImFkZE51bWJlcnNGYXVsdCIgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9mYXVsdD4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0ib25lV2F5SW50Ij4KLQkJCQotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9pbnB1dD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iQWRkTnVtYmVyc1BvcnQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzQmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9BZGROdW1iZXIvQWRkTnVtYmVyc0ltcGxTZXJ2aWNlIiAvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vc2FtcGxlL2FkZG51bWJlcnMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzM1MTM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9zYW1wbGUvYWRkbnVtYmVycy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlR3JvdXA+Ci0gPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc1NlcnZpY2UiPgotICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVycy5BZGROdW1iZXJzUG9ydFR5cGVJbXBsPC9wYXJhbWV0ZXI+Ci0gIDxvcGVyYXRpb24gbmFtZT0iYWRkTnVtYmVycyIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICA8YWN0aW9uTWFwcGluZy8+Ci0gIDwvb3BlcmF0aW9uPgotICA8b3BlcmF0aW9uIG5hbWU9Im9uZVdheUludCIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+Ci0gICAgPGFjdGlvbk1hcHBpbmcvPgotICA8L29wZXJhdGlvbj4KLSA8L3NlcnZpY2U+Ci08L3NlcnZpY2VHcm91cD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9lbmRwb2ludC9CYXNpY0VuZHBvaW50VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9lbmRwb2ludC9CYXNpY0VuZHBvaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2OTM2Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZW5kcG9pbnQvQmFzaWNFbmRwb2ludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZW5kcG9pbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY0VuZHBvaW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2ltcGxlRW5kcG9pbnQoKSB7Ci0gICAgICAgIFNhbXBsZUVuZHBvaW50IHNhbXBsZSA9IG5ldyBTYW1wbGVFbmRwb2ludCgpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnQgZXAgPSBFbmRwb2ludC5jcmVhdGUoc2FtcGxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIEVuZHBvaW50IGluc3RhbmNlIHdhcyBudWxsIiwgZXAgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBlcC5wdWJsaXNoKCJ0ZXN0Iik7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBlbmRwb2ludCB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkiLCBlcC5pc1B1Ymxpc2hlZCgpKTsKLSAgICAgICAgZXAuc3RvcCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kUHVibGlzaEVuZHBvaW50KCkgewotICAgICAgICBTYW1wbGVFbmRwb2ludCBzYW1wbGUgPSBuZXcgU2FtcGxlRW5kcG9pbnQoKTsKLQotICAgICAgICBFbmRwb2ludCBlcCA9IEVuZHBvaW50LnB1Ymxpc2goInRlc3QiICwgc2FtcGxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIEVuZHBvaW50IGluc3RhbmNlIHdhcyBudWxsIiwgZXAgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBlbmRwb2ludCB3YXMgbm90IHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkiLCBlcC5pc1B1Ymxpc2hlZCgpKTsKLSAgICAgICAgZXAuc3RvcCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QmluZGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTYW1wbGVFbmRwb2ludCBzYW1wbGUgPSBuZXcgU2FtcGxlRW5kcG9pbnQoKTsKLQotICAgICAgICBFbmRwb2ludCBlcCA9IEVuZHBvaW50LmNyZWF0ZShzYW1wbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgRW5kcG9pbnQgaW5zdGFuY2Ugd2FzIG51bGwiLCBlcCAhPSBudWxsKTsKLQotICAgICAgICBCaW5kaW5nIGJuZCA9IGVwLmdldEJpbmRpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIEJpbmRpbmcgaW5zdGFuY2Ugd2FzIG51bGwiLCBibmQgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBCaW5kaW5nIGluc3RhbmNlIHdhcyBvZiB0aGUgd3JvbmcgdHlwZSAoIiArIGJuZC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIpLCBleHBlY3RlZCBTT0FQQmluZGluZyIsIAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYm5kLmdldENsYXNzKCkpKTsKLSAgICAgICAgZXAuc3RvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBbmRQdWJsaXNoT25BbHRlcm5hdGVQb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVuZHBvaW50IGVwID0gRW5kcG9pbnQuY3JlYXRlKG5ldyBTYW1wbGVFbmRwb2ludCgpKTsKLSAgICAgICAgZXAucHVibGlzaCgiaHR0cDovL2xvY2FsaG9zdDoxNjA2MC9TYW1wbGVFbmRwb2ludCIpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgRW5kcG9pbnQgaW5zdGFuY2Ugd2FzIG51bGwiLCBlcCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGVuZHBvaW50IHdhcyBub3QgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseSIsIGVwLmlzUHVibGlzaGVkKCkpOwotICAgICAgICBlcC5zdG9wKCk7Ci0gICAgfQotCi0gICAgQFdlYlNlcnZpY2UKLSAgICBjbGFzcyBTYW1wbGVFbmRwb2ludCB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IGZvbyhTdHJpbmcgYmFyKSB7Ci0gICAgICAgICAgICByZXR1cm4gYmFyLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9leGNlcHRpb24vRXhjZXB0aW9uRmFjdG9yeVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZXhjZXB0aW9uL0V4Y2VwdGlvbkZhY3RvcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNkNTI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9leGNlcHRpb24vRXhjZXB0aW9uRmFjdG9yeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgRXhjZXB0aW9uRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uRmFjdG9yeVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0gIlNhbXBsZSI7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBFeGNlcHRpb25GYWN0b3J5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEB0ZXN0c3RyYXRlZ3kgVGVzdHMgY3JlYXRpb24gb2YgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkZhY3RvcnkwMCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAl0cnl7Ci0gICAgCQl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHNhbXBsZVRleHQpOwotICAgIAl9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSl7Ci0gICAgCQlhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSA9PSBudWxsKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAdGVzdHN0cmF0ZWd5IFRlc3RzIGNyZWF0aW9uIG9mIGEgV2ViU2VydmljZUV4Y2VwdGlvbiBmcm9tIGFub3RoZXIgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25GYWN0b3J5MDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJdHJ5ewotICAgIAkJV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbikgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihzYW1wbGVUZXh0KTsKLSAgICAJCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24od3NlKTsKLSAgICAJfSBjYXRjaChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpewotICAgIAkJLy8gU2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgV2ViU2VydmljZUV4Y2VwdGlvbgotICAgIAkJYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpOwotICAgIAkJYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgPT0gbnVsbCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHRlc3RzdHJhdGVneSBUZXN0cyBjcmVhdGlvbiBvZiBhIFdlYlNlcnZpY2VFeGNlcHRpb24tPldlYlNlcnZpY2VFeGNlcHRpb24tPlByb3RvY29sRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkZhY3RvcnkwMigpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlQcm90b2NvbEV4Y2VwdGlvbiBwZSA9IG5ldyBQcm90b2NvbEV4Y2VwdGlvbihzYW1wbGVUZXh0KTsKLSAgICAJdHJ5ewotICAgIAkJV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbikgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihwZSk7Ci0gICAgCQl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHdzZSk7Ci0gICAgCX0gY2F0Y2goV2ViU2VydmljZUV4Y2VwdGlvbiBlKXsKLSAgICAJCS8vIFNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIFdlYlNlcnZpY2VFeGNlcHRpb24gd2l0aCBhIFByb3RvY29sIEV4Y2VwdGlvbgotICAgIAkJYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpOwotICAgIAkJYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgPT0gbnVsbCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHRlc3RzdHJhdGVneSBUZXN0cyBjcmVhdGlvbiBvZiBhIFdlYlNlcnZpY2VFeGNlcHRpb24tPldlYlNlcnZpY2VFeGNlcHRpb24tPk51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkZhY3RvcnkwMygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAJdHJ5ewotICAgIAkJV2ViU2VydmljZUV4Y2VwdGlvbiB3c2UgPSAoV2ViU2VydmljZUV4Y2VwdGlvbikgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihucGUpOwotICAgIAkJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbih3c2UpOwotICAgIAl9IGNhdGNoKFdlYlNlcnZpY2VFeGNlcHRpb24gZSl7Ci0gICAgCQkvLyBTaG91bGQgb25seSBiZSBhIHNpbmdsZSBXZWJTZXJ2aWNlRXhjZXB0aW9uIHdpdGggYSBQcm90b2NvbCBFeGNlcHRpb24KLSAgICAJCWFzc2VydFRydWUoZS5nZXRDYXVzZSgpID09IG5wZSk7Ci0gICAgCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkgPT0gbnVsbCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3JUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlckNoYWluUHJvY2Vzc29yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhNDJkZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyQ2hhaW5Qcm9jZXNzb3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmZhY3RvcnkuSGFuZGxlckludm9rZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuc29hcC5TT0FQTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKgotICogVGhlcmUgYXJlIG15cmlhZCBzY2VuYXJpb3MgdG8gdGVzdCBoZXJlOgotICogSGFuZGxlciBpbXBsZW1lbnRhdGlvbnMgY2FuIGltcGxlbWVudCB0d28gY2xhc3NlczogIFNPQVBIYW5kbGVyIG9yIExvZ2ljYWxIYW5kbGVyICgyKQotICogVGhleSBpbXBsZW1lbnQgdHdvIGNyaXRpY2FsIG1ldGhvZHM6ICBoYW5kbGVNZXNzYWdlIGFuZCBoYW5kbGVGYXVsdCAoMikKLSAqIFRoZXNlIG1ldGhvZHMgaGF2ZSBmb3VyIHBvc3NpYmxlIHJlc3VsdHM6ICB0cnVlLCBmYWxzZSwgUHJvdG9jb2xFeGNlcHRpb24sIG90aGVyIGV4Y2VwdGlvbgotICogCi0gKiBCZXNpZGVzIHRoZSBwb3NzaWJsZSBiZWhhdmlvcnMgb2YgdGhlIEhhbmRsZXIgaW1wbGVtZW50YXRpb25zLCB3ZSBhbHNvCi0gKiBoYXZlIHRvIGNvbnNpZGVyIHdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgaW5jb21pbmcgb3Igb3V0Z29pbmcsIHdoZXRoZXIKLSAqIGl0J3MgYSByZXNwb25zZSBvciBhIHJlcXVlc3QsIGFuZCBpZiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkLgotICogCi0gKiBEbyBvdXIgYmVzdCB0byBjb3ZlciBhbGwgc2NlbmFyaW9zLgotICogCi0gKiBUaGUgdGVzdEhhbmRsZU1lc3NhZ2VfKiBtZXRob2RzIHRlc3QgdGhlIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4oKSBtZXRob2QKLSAqIFRoZSB0ZXN0SGFuZGxlRmF1bHRfKiBtZXRob2RzIHRlc3QgdGhlIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5wcm9jZXNzRmF1bHQoKSBtZXRob2QKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluUHJvY2Vzc29yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvLyBTdHJpbmcgcmVzdWx0IGlzIGhvdyB3ZSdsbCB2ZXJpZnkgdGhlIHJpZ2h0IG1ldGhvZHMgZnJvbQotICAgIC8vIHRoZSBIYW5kbGVyIGltcGxlbWVudGF0aW9ucyB3ZXJlIGNhbGxlZAotICAgIHByaXZhdGUgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQotICAgIHByaXZhdGUgZW51bSBSZXN1bHREZXNpcmVkIHsKLSAgICAgICAgVFJVRSwgRkFMU0UsIFBST1RPQ09MX0VYQ0VQVElPTiwgT1RIRVJfRVhDRVBUSU9OCi0gICAgfTsKLQotICAgIC8vIHVzZSB0aGUgZm9sbG93aW5nIHRvIGRpY3RhdGUgaG93IHRoZSBIYW5kbGVyIG1ldGhvZHMgYmVoYXZlCi0gICAgcHJpdmF0ZSBSZXN1bHREZXNpcmVkIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZDsKLSAgICBwcml2YXRlIFJlc3VsdERlc2lyZWQgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZDsKLSAgICBwcml2YXRlIFJlc3VsdERlc2lyZWQgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkOwotICAgIHByaXZhdGUgUmVzdWx0RGVzaXJlZCBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkOwotICAgIHByaXZhdGUgUmVzdWx0RGVzaXJlZCBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQ7Ci0gICAgcHJpdmF0ZSBSZXN1bHREZXNpcmVkIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQ7Ci0gICAgcHJpdmF0ZSBSZXN1bHREZXNpcmVkIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZDsKLSAgICBwcml2YXRlIFJlc3VsdERlc2lyZWQgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZDsKLQotICAgIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEhhbmRsZXJDaGFpblByb2Nlc3NvciBleHBlY3RzIGEgc29ydGVkIGNoYWluCi0gICAgICAgIGhhbmRsZXJzLmFkZChuZXcgTG9naWNhbEhhbmRsZXIyKCkpOwotICAgICAgICBoYW5kbGVycy5hZGQobmV3IExvZ2ljYWxIYW5kbGVyMSgpKTsKLSAgICAgICAgaGFuZGxlcnMuYWRkKG5ldyBTT0FQSGFuZGxlcjEoKSk7Ci0gICAgICAgIGhhbmRsZXJzLmFkZChuZXcgU09BUEhhbmRsZXIyKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogZW1wdHkgbGlzdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX2VtcHR5MSgpIHsKLQotICAgICAgICBFeGNlcHRpb24gbG9jYWxfZXhjZXB0aW9uID0gbnVsbDsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yMSA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobnVsbCwgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvcjIgPQotICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobmV3IEFycmF5TGlzdDxIYW5kbGVyPigpLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgICAgIHByb2Nlc3NvcjEucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzIgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIG1jMi5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMikpOwotICAgICAgICAgICAgcHJvY2Vzc29yMi5wcm9jZXNzQ2hhaW4obWMyLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvY2FsX2V4Y2VwdGlvbiA9IGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBubyBleGNlcHRpb25zIQotICAgICAgICBhc3NlcnROdWxsKGxvY2FsX2V4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBvbmUgcHJvdG9jb2wgaGFuZGxlcgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX29uZXByb3RvMSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gdXNlIGEgbG9jYWwgbGlzdAotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gbG9jYWxfbGlzdCA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgbG9jYWxfbGlzdC5hZGQobmV3IFNPQVBIYW5kbGVyMSgpKTsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGxvY2FsX2xpc3QsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMxbTpTMWM6IiwgcmVzdWx0KTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogb25lIHByb3RvY29sIGhhbmRsZXIgaW4gYSBsb2dpY2FsIGNvbnRleHQKLSAgICAgKiBubyBoYW5kbGVycyB3aWxsIGJlIHByb2Nlc3NlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX29uZXByb3RvMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gdXNlIGEgbG9jYWwgbGlzdAotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gbG9jYWxfbGlzdCA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgbG9jYWxfbGlzdC5hZGQobmV3IFNPQVBIYW5kbGVyMSgpKTsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGxvY2FsX2xpc3QsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMxbTpTMWM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG9uZSBsb2dpY2FsIGhhbmRsZXIKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV9vbmVsb2dpY2FsKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB1c2UgYSBsb2NhbCBsaXN0Ci0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBsb2NhbF9saXN0ID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICBsb2NhbF9saXN0LmFkZChuZXcgTG9naWNhbEhhbmRsZXIxKCkpOwotCi0gICAgICAgIC8vIHdlIHdhbnQgYWxsIGdvb2QgcmVzcG9uc2VzOgotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobG9jYWxfbGlzdCwgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiTDFtOkwxYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgbm8gY2xvc2luZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3RydWUxKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwybToiLCByZXN1bHQpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXF1ZXN0ICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBOT1QgZXhwZWN0ZWQKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV90cnVlMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBhbGwgZ29vZCByZXNwb25zZXM6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiUzJtOlMxbTpMMW06TDJtOkwyYzpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXNwb25zZSAod2UgbXVzdCBiZSBvbiB0aGUgY2xpZW50KSwgcmVzcG9uc2UgZXhwZWN0ZWQgKGlnbm9yZWQpCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIGNsb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfdHJ1ZTMoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgYWxsIGdvb2QgcmVzcG9uc2VzOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVNQT05TRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBzaW5jZSB0aGlzIGlzIGNsaWVudCBpbmJvdW5kIHJlc3BvbnNlLCB0aGUgb3JpZ2luYWwgb3V0Ym91bmQgaW52b2NhdGlvbgotICAgICAgICAgKiB3b3VsZCBoYXZlIGJlZW4gTDJtOkwxbTpTMW06UzJtLCBzbyB0aGUgY2xvc2VzIHdvdWxkIGJlIFMyYzpTMWM6TDFjOkwyYwotICAgICAgICAgKi8KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwybTpTMmM6UzFjOkwxYzpMMmM6IiwgcmVzdWx0KTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogb3V0Z29pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgY2xpZW50KSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgbm9ybWFsIG9yZGVyLCBubyBjbG9zaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfdHJ1ZTQoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgYWxsIGdvb2QgcmVzcG9uc2VzOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06UzFtOlMybToiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogb3V0Z29pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgY2xpZW50KSwgcmVzcG9uc2UgTk9UIGV4cGVjdGVkCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIG5vcm1hbCBvcmRlciwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV90cnVlNSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBhbGwgZ29vZCByZXNwb25zZXM6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06UzFtOlMybTpTMmM6UzFjOkwxYzpMMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlc3BvbnNlICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBleHBlY3RlZCAoaWdub3JlZCkKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgbm9ybWFsIG9yZGVyLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3RydWU2KCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHNpbmNlIHRoaXMgaXMgc2VydmVyIG91dGJvdW5kIHJlc3BvbnNlLCB0aGUgb3JpZ2luYWwgaW5ib3VuZCBpbnZvY2F0aW9uCi0gICAgICAgICAqIHdvdWxkIGhhdmUgYmVlbiBTMm06UzFtOkwxbTpMMm0sIHNvIHRoZSBjbG9zZXMgd291bGQgYmUgTDJjOkwxYzpTMWM6UzJjCi0gICAgICAgICAqLwotCi0gICAgICAgIGFzc2VydEVxdWFscygiTDJtOkwxbTpTMW06UzJtOkwyYzpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSBzb3J0aW5nIGFuZCBjbG9zaW5nIGxvZ2ljIGlzIGFsbCBnb29kLAotICAgICAqIGFsbCB0aGF0J3MgbGVmdCBpcyB0byBtYWtlIHN1cmUgdGhlIFNPQVAgaGFuZGxlcnMgYXJlIGV4Y2x1ZGVkIHdoZW4KLSAgICAgKiB3ZSdyZSBpbiBhIExvZ2ljYWxNZXNzYWdlQ29udGV4dC4KLSAgICAgKiAKLSAgICAgKiBvdXRnb2luZyByZXNwb25zZSAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQgKGlnbm9yZWQpCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgb25seSwgbm9ybWFsIG9yZGVyLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3RydWU3KCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IGFsbCBnb29kIHJlc3BvbnNlczoKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFU1BPTlNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHNpbmNlIHRoaXMgaXMgc2VydmVyIG91dGJvdW5kIHJlc3BvbnNlLCB0aGUgb3JpZ2luYWwgaW52b2NhdGlvbgotICAgICAgICAgKiB3b3VsZCBoYXZlIGJlZW4gUzJtOlMxbTpMMW06TDJtLCBzbyB0aGUgY2xvc2VzIHdvdWxkIGJlIEwyYzpMMWM6UzFjOlMyYwotICAgICAgICAgKi8KLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06UzFtOlMybTpMMmM6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluY29taW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIGV4cGVjdGVkCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHJldHVybnMgZmFsc2UKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgbWVzc2FnZSByZXZlcnNlZCwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV9mYWxzZTEoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5GQUxTRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzQ2hhaW4obWMxLmdldE1FUENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxbTpTMm06TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIGNsaWVudCksIHJlc3BvbnNlIGV4cGVjdGVkCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHJldHVybnMgZmFsc2UKLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgbm9ybWFsIG9yZGVyLCBtZXNzYWdlIHJldmVyc2VkLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX2ZhbHNlMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLkZBTFNFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06TDJtOkwxYzpMMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIGNsaWVudCksIHJlc3BvbnNlIE5PVCBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSByZXR1cm5zIGZhbHNlCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIG5vcm1hbCBvcmRlciwgbWVzc2FnZSBOT1QgcmV2ZXJzZWQsIGNsb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfZmFsc2UzKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IG9uZSBmYWxzZSByZXNwb25zZToKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuRkFMU0U7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwybTpMMW06TDFjOkwyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBhIG1pZGRsZSBIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIG1lc3NhZ2UgcmV2ZXJzZWQsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3Byb3RvY29sZXhfdHJ1ZTEoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT047Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICAgICAgLy8gaGFuZGxlRmF1bHQgcHJvY2Vzc2luZwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxZjpTMmY6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluY29taW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIE5PVCBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgKiBwcm9jZXNzaW5nIGV4cGVjdGVkOiAgTG9naWNhbCBhbmQgU09BUCwgcmV2ZXJzZSBvcmRlciwgbWVzc2FnZSBOT1QgcmV2ZXJzZWQsIGNsb3NlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZU1lc3NhZ2VfcHJvdG9jb2xleF90cnVlMigpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuUFJPVE9DT0xfRVhDRVBUSU9OOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIGUgPSBwZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROdWxsKGUpOwotICAgICAgICAvLyBubyBoYW5kbGVGYXVsdCBjYWxscwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwxYzpTMWM6UzJjOiIsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXF1ZXN0ICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBtZXNzYWdlIHJldmVyc2VkLCAobm8gaGFuZGxlRmF1bHQpLCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3J1bnRpbWVleF90cnVlKCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IG9uZSBmYWxzZSByZXNwb25zZToKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuT1RIRVJfRVhDRVBUSU9OOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBlID0gcmU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICAvLyBubyBoYW5kbGVGYXVsdCBjYWxscwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOkwxYzpTMWM6UzJjOiIsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBpbmNvbWluZyByZXF1ZXN0ICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpLCByZXNwb25zZSBleHBlY3RlZAotICAgICAqIGEgbWlkZGxlIEhhbmRsZXIuaGFuZGxlTWVzc2FnZSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24sIGxhdGVyIGEgSGFuZGxlci5oYW5kbGVGYXVsdCByZXR1cm5zIGZhbHNlCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIG1lc3NhZ2UgcmV2ZXJzZWQsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3Byb3RvY29sZXhfZmFsc2UoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLkZBTFNFOwotICAgICAgICBzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuUFJPVE9DT0xfRVhDRVBUSU9OOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLk1FUC5SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIC8vIGhhbmRsZUZhdWx0IHByb2Nlc3NpbmcsIGJ1dCBub3RpY2UgUzJmIGRvZXMgbm90IGdldCBjYWxsZWQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTMm06UzFtOkwxbTpTMWY6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGluY29taW5nIHJlcXVlc3QgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIGV4cGVjdGVkCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVNZXNzYWdlIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiwgbGF0ZXIgYSBIYW5kbGVyLmhhbmRsZUZhdWx0IHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBtZXNzYWdlIHJldmVyc2VkLCBoYW5kbGVGYXVsdCwgY2xvc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlTWVzc2FnZV9wcm90b2NvbGV4X3Byb3RvY29sZXgoKSB7Ci0KLSAgICAgICAgLy8gcmVzZXQgcmVzdWx0Ci0gICAgICAgIHJlc3VsdCA9ICIiOwotCi0gICAgICAgIC8vIHdlIHdhbnQgb25lIGZhbHNlIHJlc3BvbnNlOgotICAgICAgICBzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGhhbmRsZUZhdWx0IHByb2Nlc3NpbmcsIGJ1dCBub3RpY2UgUzJmIGRvZXMgbm90IGdldCBjYWxsZWQsIGFuZCB3ZSBnZXQgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0NoYWluKG1jMS5nZXRNRVBDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5NRVAuUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICBlID0gcGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxZjpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVxdWVzdCAod2UgbXVzdCBiZSBvbiB0aGUgc2VydmVyKSwgcmVzcG9uc2UgZXhwZWN0ZWQKLSAgICAgKiBhIG1pZGRsZSBIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uLCBsYXRlciBhIEhhbmRsZXIuaGFuZGxlRmF1bHQgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIHJldmVyc2Ugb3JkZXIsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVNZXNzYWdlX3Byb3RvY29sZXhfcnVudGltZWV4KCkgewotCi0gICAgICAgIC8vIHJlc2V0IHJlc3VsdAotICAgICAgICByZXN1bHQgPSAiIjsKLQotICAgICAgICAvLyB3ZSB3YW50IG9uZSBmYWxzZSByZXNwb25zZToKLSAgICAgICAgc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT047Ci0gICAgICAgIHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT047Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzYW1lIHJlc3VsdHMgYXMgdGVzdEhhbmRsZXJzX3Byb3RvY29sZXhfcHJvdG9jb2xleAotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYzEuZ2V0TUVQQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICBlID0gcGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnROb3ROdWxsKGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlMybTpTMW06TDFtOlMxZjpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBlbXB0eSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZhdWx0X2VtcHR5MSgpIHsKLQotICAgICAgICBFeGNlcHRpb24gbG9jYWxfZXhjZXB0aW9uID0gbnVsbDsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yMSA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobnVsbCwgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvcjIgPQotICAgICAgICAgICAgICAgIG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IobmV3IEFycmF5TGlzdDxIYW5kbGVyPigpLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgICAgIHByb2Nlc3NvcjEucHJvY2Vzc0ZhdWx0KG1jMS5nZXRNRVBDb250ZXh0KCksIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4pOwotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMyID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBtYzIuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzIpKTsKLSAgICAgICAgICAgIHByb2Nlc3NvcjIucHJvY2Vzc0ZhdWx0KG1jMi5nZXRNRVBDb250ZXh0KCksIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uSU4pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9jYWxfZXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vIGV4Y2VwdGlvbnMhCi0gICAgICAgIGFzc2VydE51bGwobG9jYWxfZXhjZXB0aW9uKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogb3V0Z29pbmcgcmVzcG9uc2UgKHdlIG11c3QgYmUgb24gdGhlIHNlcnZlciksIHJlc3BvbnNlIGV4cGVjdGVkIChpZ25vcmVkKQotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCBub3JtYWwgb3JkZXIsIGhhbmRsZUZhdWx0LCBjbG9zZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVGYXVsdF90cnVlMSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMxID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jMS5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jMSkpOwotICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0ZhdWx0KG1jMS5nZXRNRVBDb250ZXh0KCksIEhhbmRsZXJDaGFpblByb2Nlc3Nvci5EaXJlY3Rpb24uT1VUKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkwyZjpMMWY6UzFmOlMyZjpMMmM6TDFjOlMxYzpTMmM6IiwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIG91dGdvaW5nIHJlc3BvbnNlICh3ZSBtdXN0IGJlIG9uIHRoZSBzZXJ2ZXIpCi0gICAgICogYSBtaWRkbGUgSGFuZGxlci5oYW5kbGVGYXVsdCByZXR1cm5zIGZhbHNlCi0gICAgICogcHJvY2Vzc2luZyBleHBlY3RlZDogIExvZ2ljYWwgYW5kIFNPQVAsIG5vcm1hbCBvcmRlciwgaGFuZGxlRmF1bHQsIGNsb3NlIChhbGwpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUZhdWx0X2ZhbHNlMSgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLkZBTFNFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0KLSAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IoaGFuZGxlcnMsIFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jMSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYzEuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYzEpKTsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NGYXVsdChtYzEuZ2V0TUVQQ29udGV4dCgpLCBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLk9VVCk7Ci0KLSAgICAgICAgLy8gbm90aWNlIGFsbCBoYW5kbGVycyBhcmUgY2xvc2VkIGluIHRoaXMgc2NlbmFyaW8KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJMMmY6TDFmOkwyYzpMMWM6UzFjOlMyYzoiLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogaW5jb21pbmcgcmVzcG9uc2UgKHdlIG11c3QgYmUgb24gdGhlIGNsaWVudCkKLSAgICAgKiBhIG1pZGRsZSBIYW5kbGVyLmhhbmRsZUZhdWx0IHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqIHByb2Nlc3NpbmcgZXhwZWN0ZWQ6ICBMb2dpY2FsIGFuZCBTT0FQLCByZXZlcnNlIG9yZGVyLCBoYW5kbGVGYXVsdCwgY2xvc2UgKGFsbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRmF1bHRfcHJvdG9jb2xleCgpIHsKLQotICAgICAgICAvLyByZXNldCByZXN1bHQKLSAgICAgICAgcmVzdWx0ID0gIiI7Ci0KLSAgICAgICAgLy8gd2Ugd2FudCBvbmUgZmFsc2UgcmVzcG9uc2U6Ci0gICAgICAgIHNvYXBoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9IFJlc3VsdERlc2lyZWQuVFJVRTsKLSAgICAgICAgc29hcGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlRSVUU7Ci0gICAgICAgIGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTjsKLSAgICAgICAgbG9naWNhbGhhbmRsZXIyX01lc3NhZ2VSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotICAgICAgICBsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID0gUmVzdWx0RGVzaXJlZC5UUlVFOwotCi0gICAgICAgIEhhbmRsZXJDaGFpblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSGFuZGxlckNoYWluUHJvY2Vzc29yKGhhbmRsZXJzLCBQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYzEgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMxLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMxKSk7Ci0gICAgICAgIEV4Y2VwdGlvbiBlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIG5vdGljZSBhbGwgaGFuZGxlcnMgYXJlIGNsb3NlZCBpbiB0aGlzIHNjZW5hcmlvLCBhbmQgd2UgZ2V0IGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NGYXVsdChtYzEuZ2V0TUVQQ29udGV4dCgpLCBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuRGlyZWN0aW9uLklOKTsKLSAgICAgICAgfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIGUgPSBwZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydE5vdE51bGwoZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUzJmOlMxZjpMMWY6UzJjOlMxYzpMMWM6TDJjOiIsIHJlc3VsdCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhIGRlZmF1bHQgSGFuZGxlckludm9rZXJGYWN0b3J5IHJlZ2lzdGVyZWQKLSAgICAgKiB3aXRoIHRoZSBGYWN0b3J5UmVnaXN0cnkgYW5kIHRoYXQgdGhlIGZhY3RvcnkgcmV0dXJucyBhIG5vbi1udWxsIEhhbmRsZXJJbnZva2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckhhbmRsZXJGYWN0b3J5KCkgewotICAgICAgICBIYW5kbGVySW52b2tlckZhY3RvcnkgZmFjdG9yeSA9IChIYW5kbGVySW52b2tlckZhY3RvcnkpIAotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSGFuZGxlckludm9rZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmYWN0b3J5KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChmYWN0b3J5LmNyZWF0ZUhhbmRsZXJJbnZva2VyKG5ldyBNZXNzYWdlQ29udGV4dCgpKSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIFNPQVBIYW5kbGVyMSBpbXBsZW1lbnRzIFNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gewotCi0gICAgICAgIHB1YmxpYyBTZXQgZ2V0SGVhZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIlMxYzoiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiUzFmOiIpOwotICAgICAgICAgICAgaWYgKHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5UUlVFKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLkZBTFNFKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNvYXBoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuT1RIRVJfRVhDRVBUSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIlMxbToiKTsKLSAgICAgICAgICAgIGlmIChzb2FwaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5UUlVFKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuUFJPVE9DT0xfRVhDRVBUSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIxX01lc3NhZ2VSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuT1RIRVJfRVhDRVBUSU9OKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgU09BUEhhbmRsZXIyIGltcGxlbWVudHMgU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7Ci0KLSAgICAgICAgcHVibGljIFNldCBnZXRIZWFkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiUzJjOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJTMmY6Iik7Ci0gICAgICAgICAgICBpZiAoc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAoc29hcGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHNvYXBoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiUzJtOiIpOwotICAgICAgICAgICAgaWYgKHNvYXBoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5GQUxTRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChzb2FwaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMb2dpY2FsSGFuZGxlcjEgaW1wbGVtZW50cyBMb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDFjOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJMMWY6Iik7Ci0gICAgICAgICAgICBpZiAobG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAobG9naWNhbGhhbmRsZXIxX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxvZ2ljYWxoYW5kbGVyMV9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDFtOiIpOwotICAgICAgICAgICAgaWYgKGxvZ2ljYWxoYW5kbGVyMV9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5GQUxTRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjFfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBMb2dpY2FsSGFuZGxlcjIgaW1wbGVtZW50cyBMb2dpY2FsSGFuZGxlcjxMb2dpY2FsTWVzc2FnZUNvbnRleHQ+IHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZShqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDJjOiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoTG9naWNhbE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJMMmY6Iik7Ci0gICAgICAgICAgICBpZiAobG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfRmF1bHRSZXN1bHREZXNpcmVkID09IFJlc3VsdERlc2lyZWQuRkFMU0UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZWxzZSBpZiAobG9naWNhbGhhbmRsZXIyX0ZhdWx0UmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlBST1RPQ09MX0VYQ0VQVElPTikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGxvZ2ljYWxoYW5kbGVyMl9GYXVsdFJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTDJtOiIpOwotICAgICAgICAgICAgaWYgKGxvZ2ljYWxoYW5kbGVyMl9NZXNzYWdlUmVzdWx0RGVzaXJlZCA9PSBSZXN1bHREZXNpcmVkLlRSVUUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5GQUxTRSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5QUk9UT0NPTF9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChsb2dpY2FsaGFuZGxlcjJfTWVzc2FnZVJlc3VsdERlc2lyZWQgPT0gUmVzdWx0RGVzaXJlZC5PVEhFUl9FWENFUFRJT04pCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQotICAgICAgICAgICAgLy8gZGVmYXVsdAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZVBvc3RJbnZva2VyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJQcmVQb3N0SW52b2tlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjYxMjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvSGFuZGxlclByZVBvc3RJbnZva2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuZmFjdG9yeS5IYW5kbGVyUHJlSW52b2tlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5Qcm90b2NvbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEhhbmRsZXJQcmVQb3N0SW52b2tlclRlc3RzIHZlcmlmaWVzIHRoYXQgdGhlIG1lY2hhbmlzbXMgZm9yIGZpbmRpbmcgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgdG8gDQotICogY2FsbCBiZWZvcmUgYW5kIGFmdGVyIGhhbmRsZXIuaGFuZGxlTWVzc2FnZSB3b3JrLCBhbmQgdGhhdCB0aGUgY2FsbHMgYXJlIGFjdHVhbGx5IG1hZGUuICBTaW1wbGUgYXMgdGhhdC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclByZVBvc3RJbnZva2VyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotCXByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWMgPSBudWxsOw0KLQlwcml2YXRlIGJvb2xlYW4gcHJlSW52b2tlckNhbGxlZCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gcG9zdEludm9rZXJDYWxsZWQgPSBmYWxzZTsNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwMTFlbnYgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLQkNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX0VOVkVMT1BFID0gDQotICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4iICsgDQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBzb2FwMTFlbnYgKyAiXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+IiArIA0KLSAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArDQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArIA0KLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOw0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UgYW5kIE1lc3NhZ2VDb250ZXh0DQotCQkvLyBJIGp1c3QgZ3JhYmJlZCB0aGlzIGNvZGUgZnJvbSB0aGUgSkFYV1MgTWVzc2FnZVRlc3RzDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7DQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9DQotICAgICAgICAgICAgICAgIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShTT0FQMTFfRU5WRUxPUEUsIG51bGwsIG51bGwpOw0KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOw0KLQ0KLSAgICAgICAgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIG1jLnNldE1lc3NhZ2UobSk7DQotICAgICAgICBtYy5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdHMgYXJlIGFzIGV4cGVjdGVkDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RmFjdG9yeVJlZ2lzdHJ5KCkgew0KLQkJSGFuZGxlclByZUludm9rZXJGYWN0b3J5IHByZUZhY3QgPSAoSGFuZGxlclByZUludm9rZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeS5jbGFzcyk7DQotCQlIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5IHBvc3RGYWN0ID0gKEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSGFuZGxlclBvc3RJbnZva2VyRmFjdG9yeS5jbGFzcyk7DQotCQlIYW5kbGVyUHJlSW52b2tlciBwcmVJbnZva2VyID0gcHJlRmFjdC5jcmVhdGVIYW5kbGVyUHJlSW52b2tlcigpOw0KLQkJSGFuZGxlclBvc3RJbnZva2VyIHBvc3RJbnZva2VyID0gcG9zdEZhY3QuY3JlYXRlSGFuZGxlclBvc3RJbnZva2VyKCk7DQotCQlhc3NlcnRUcnVlKCJwcmVJbnZva2VyIHNob3VsZCBiZSBpbnN0YW5jZW9mICIgKyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUHJlSW52b2tlckltcGwuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCBwcmVJbnZva2VyIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmltcGwuSGFuZGxlclByZUludm9rZXJJbXBsKTsNCi0JCWFzc2VydFRydWUoInBvc3RJbnZva2VyIHNob3VsZCBiZSBpbnN0YW5jZW9mICIgKyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUG9zdEludm9rZXJJbXBsLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgcG9zdEludm9rZXIgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuaW1wbC5IYW5kbGVyUG9zdEludm9rZXJJbXBsKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIG1ha2Ugc3VyZSB0aGUgcmVnaXN0ZXJlZCBmYWN0b3JpZXMgYXJlIHVzZWQsIGFuZCB0aGUgY2FsbHMgYXJlIG1hZGUgaW4gdGhlIHBsYWNlcyB3ZSBleHBlY3QNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RGYWN0b3J5UHJlUG9zdCgpIHsNCi0JCQ0KLQkJRmFjdG9yeVJlZ2lzdHJ5LnNldEZhY3RvcnkoSGFuZGxlclByZUludm9rZXJGYWN0b3J5LmNsYXNzLCBuZXcgSGFuZGxlclByZUludm9rZXJGYWN0b3J5SW1wbCgpKTsNCi0JCUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KEhhbmRsZXJQb3N0SW52b2tlckZhY3RvcnkuY2xhc3MsIG5ldyBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5SW1wbCgpKTsNCi0JCQ0KLQkJQXJyYXlMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOw0KLQkJaGFuZGxlcnMuYWRkKG5ldyBTT0FQSGFuZGxlcjEoKSk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IgcHJvY2Vzc29yID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhbmRsZXJDaGFpblByb2Nlc3NvcihoYW5kbGVycywgUHJvdG9jb2wuc29hcDExKTsNCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIHNlcnZlci1zaWRlIGluY29taW5nIHJlcXVlc3QNCi0gICAgICAgICAgICBzdWNjZXNzID0gcHJvY2Vzc29yLnByb2Nlc3NDaGFpbihtYy5nZXRNRVBDb250ZXh0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluUHJvY2Vzc29yLkRpcmVjdGlvbi5JTiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Qcm9jZXNzb3IuTUVQLlJFUVVFU1QsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydE51bGwoZSk7ICAvLyBzaG91bGQgbm90IGdldCBleGNlcHRpb24NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgicHJvY2Vzc0NoYWluIHNob3VsZCBoYXZlIHN1Y2NlZWRlZCIsIHN1Y2Nlc3MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgicHJlSW52b2tlciBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZCIsIHByZUludm9rZXJDYWxsZWQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgicG9zdEludm9rZXIgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQiLCBwb3N0SW52b2tlckNhbGxlZCk7DQotDQotCX0NCi0JDQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLQkgKiBDbGFzc2VzIG5lZWRlZCBmb3IganVuaXQgdGVzdGNhc2UgICAgICoNCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQkNCi0gICAgcHJpdmF0ZSBjbGFzcyBTT0FQSGFuZGxlcjEgaW1wbGVtZW50cyBTT0FQSGFuZGxlcjxTT0FQTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgICAgIHB1YmxpYyBTZXQgZ2V0SGVhZGVycygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdChTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICAJcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlclByZUludm9rZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQcmVJbnZva2VyRmFjdG9yeSB7DQotCQlwdWJsaWMgSGFuZGxlclByZUludm9rZXIgY3JlYXRlSGFuZGxlclByZUludm9rZXIoKSB7DQotCQkJcmV0dXJuIG5ldyBIYW5kbGVyUHJlSW52b2tlckltcGwoKTsNCi0JCX0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBjbGFzcyBIYW5kbGVyUG9zdEludm9rZXJGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQb3N0SW52b2tlckZhY3Rvcnkgew0KLSAgICAJcHVibGljIEhhbmRsZXJQb3N0SW52b2tlciBjcmVhdGVIYW5kbGVyUG9zdEludm9rZXIoKSB7DQotICAgIAkJcmV0dXJuIG5ldyBIYW5kbGVyUG9zdEludm9rZXJJbXBsKCk7DQotICAgIAl9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlclByZUludm9rZXJJbXBsIGltcGxlbWVudHMgSGFuZGxlclByZUludm9rZXIgew0KLQkJcHVibGljIHZvaWQgcHJlSW52b2tlKGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IG1jKSB7DQotCQkJcHJlSW52b2tlckNhbGxlZCA9IHRydWU7DQotCQl9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlclBvc3RJbnZva2VySW1wbCBpbXBsZW1lbnRzIEhhbmRsZXJQb3N0SW52b2tlciB7DQotCQlwdWJsaWMgdm9pZCBwb3N0SW52b2tlKGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0IG1jKSB7DQotCQkJcG9zdEludm9rZXJDYWxsZWQgPSB0cnVlOw0KLQkJfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0hhbmRsZXJSZXNvbHZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzOTI5Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuRGVzY3JpcHRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFZlcmlmeSB0aGUgSGFuZGxlclJlc29sdmVySW1wbCBmdW5jdGlvbmFsaXR5Lg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyUmVzb2x2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL3d3dy5hcGFjaGUub3JnL3Rlc3QvbmFtZXNwYWNlIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gIkR1bW15U2VydmljZSI7DQotICAgIHByaXZhdGUgU3RyaW5nIHBvcnRMb2NhbFBhcnQgPSAiRHVtbXlQb3J0IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydFdyb25nTG9jYWxQYXJ0ID0gIldyb25nUG9ydCI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBoYW5kbGVyIGNoYWluIHR5cGUgb24gYSBzcGFyc2UgY29tcG9zaXRlLCBidXQgbm90IA0KLSAgICAgKiAgc3BlY2lmeWluZyB0aGF0IGNvbXBvc2l0ZSBkdXJpbmcgY29uc3RydWN0aW9uIG9mIHRoZSBIYW5kbGVyUmVzb2x2ZXIgKGkuZS4gbm8NCi0gICAgICogIERlbGVnYXRlIGtleSBzcGVjaWZpZWQpIHJlc3VsdHMgaW4gbm8gaGFubGRlcnMgcmV0dXJuZWQgZnJvbSB0aGlzIHJlc29sdmVyLiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyUmVzb2x2ZXJOb0tleSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIEpBWEIgSGFuZGxlciBDb25maWcgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIEhhbmRsZXJSZXNvbHZlclRlc3RTZXJ2aWNlLmNsYXNzLCBzcGFyc2VDb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhlIHNwYXJzZSBjb21wb3NpdGUgaGFzIGhhbmRsZXIgY29uZmlnIGluZm9ybWF0aW9uIGZvciB0aGUga2V5IHRoYXQgdGhlIEhhbmRsZXJSZXNvbHZlcg0KLSAgICAgKiBpcyBjcmVhdGVkIHdpdGgsIHNvIHRoYXQgaGFuZGxlciByZXNvbHZlciBjb250YWlucyB0aG9zZSBoYW5kbGVycy4gIEhvd2V2ZXIsIHRoZSANCi0gICAgICogcG9ydEluZm8gc3BlY2lmaWVkIG9uIHRoZSBnZXRIYW5kbGVyQ2hhaW4gZG9lcyBOT1QgbWF0Y2ggdGhlIFFOYW1lIGluIHRoZSBjb25maWcgZmlsZQ0KLSAgICAgKiBzbyBubyBoYW5kbGVycyBzaG91bGQgYmUgcmV0dXJuZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVySW52YWxpZFBvcnRJbmZvKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRXcm9uZ0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIEpBWEIgSGFuZGxlciBDb25maWcgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGdldEhhbmRsZXJDaGFpbiB3aWxsIGRvIGhhbmRsZXIgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYXMgd2VsbCwgc28gdGhlcmUgbmVlZHMgdG8gYmUNCi0gICAgICAgIC8vIGFuZCBFbnBkb2ludERlc2NyaXB0aW9uIChyZXByZXNlbnRpbmcgdGhlIFBvcnQpIHVuZGVyIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24NCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBIYW5kbGVyUmVzb2x2ZXJUZXN0U2VydmljZS5jbGFzcywgc3BhcnNlQ29tcG9zaXRlLCBzZXJ2aWNlRGVsZWdhdGVLZXkpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2MsIEhhbmRsZXJSZXNvbHZlclRlc3RTRUkuY2xhc3MsIHBvcnRRTmFtZSwgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQpOw0KLSAgICAgICAgSGFuZGxlclJlc29sdmVyIHJlc29sdmVyID0gbmV3IEhhbmRsZXJSZXNvbHZlckltcGwoc2VydmljZURlc2MsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBoYXMgaGFuZGxlciBjb25maWcgaW5mb3JtYXRpb24gZm9yIHRoZSBrZXkgdGhhdCB0aGUgSGFuZGxlclJlc29sdmVyDQotICAgICAqIGlzIGNyZWF0ZWQgd2l0aCwgc28gdGhhdCBoYW5kbGVyIHJlc29sdmVyIGNvbnRhaW5zIHRob3NlIGhhbmRsZXJzLiAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyVmFsaWRQb3J0SW5mbygpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIGEgSkFYQiBIYW5kbGVyIENvbmZpZyANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotDQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSA9ICJDb21wb3NpdGVLZXkiOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgZ2V0SGFuZGxlckNoYWluIHdpbGwgZG8gaGFuZGxlciBsaWZlY3ljbGUgbWFuYWdlbWVudCBhcyB3ZWxsLCBzbyB0aGVyZSBuZWVkcyB0byBiZQ0KLSAgICAgICAgLy8gYW5kIEVucGRvaW50RGVzY3JpcHRpb24gKHJlcHJlc2VudGluZyB0aGUgUG9ydCkgdW5kZXIgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbg0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIEhhbmRsZXJSZXNvbHZlclRlc3RTZXJ2aWNlLmNsYXNzLCBzcGFyc2VDb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzYywgSGFuZGxlclJlc29sdmVyVGVzdFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYywgc2VydmljZURlbGVnYXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzb2x2ZXIpOw0KLSAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpIHsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0WE1MRmlsZVN0cmVhbSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpcyk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSByZXR1cm5IQ1QgPSBEZXNjcmlwdGlvblV0aWxzLmxvYWRIYW5kbGVyQ2hhaW5zKGlzLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybkhDVCk7DQotICAgICAgICByZXR1cm4gcmV0dXJuSENUOw0KLSAgICB9DQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0WE1MRmlsZVN0cmVhbSgpIHsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjb25maWdMb2MgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgc2VwID0gIi8iOw0KLSAgICAgICAgICAgIGNvbmZpZ0xvYyA9IHNlcCArICJ0ZXN0LXJlc291cmNlcyIgKyBzZXAgKyAiY29uZmlndXJhdGlvbiIgKyBzZXAgKyAiaGFuZGxlcnMiICsgc2VwICsgImhhbmRsZXIueG1sIjsNCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOw0KLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGUoYmFzZURpciArIGNvbmZpZ0xvYykudG9VUkwoKS5vcGVuU3RyZWFtKCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGNsYXNzIER1bW15UG9ydEluZm8gaW1wbGVtZW50cyBQb3J0SW5mbyB7DQotDQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJRCgpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFFOYW1lIGdldFBvcnROYW1lKCkgew0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy90ZXN0L25hbWVzcGFjZSIsICJEdW1teVBvcnQiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvdGVzdC9uYW1lc3BhY2UiLCAiRHVtbXlTZXJ2aWNlIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQotDQotQFdlYlNlcnZpY2VDbGllbnQNCi1jbGFzcyBIYW5kbGVyUmVzb2x2ZXJUZXN0U2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgcHJvdGVjdGVkIEhhbmRsZXJSZXNvbHZlclRlc3RTZXJ2aWNlKFVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxEb2N1bWVudExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UNCi1pbnRlcmZhY2UgSGFuZGxlclJlc29sdmVyVGVzdFNFSSB7DQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgdG9FY2hvKTsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiZGJkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0LlNjb3BlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBNZXNzYWdlQ29udGV4dDsNCi0NCi0vKg0KLSAqIFlvdSBjYW4ndCBhY3R1YWxseSBzcGVjaWZ5IHdoZXRoZXIgYSBoYW5kbGVyIGlzIGZvciBjbGllbnQgb3Igc2VydmVyLA0KLSAqIHlvdSBqdXN0IGhhdmUgdG8gY2hlY2sgaW4gdGhlIGhhbmRsZU1lc3NhZ2UgYW5kL29yIGhhbmRsZUZhdWx0IHRvIG1ha2UNCi0gKiBzdXJlIHdoYXQgZGlyZWN0aW9uIHdlJ3JlIGdvaW5nLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBSb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXIgaW1wbGVtZW50cyBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyPFNPQVBNZXNzYWdlQ29udGV4dD4gew0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNldCBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgbWVzc2FnZWNvbnRleHQpIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1JvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMueG1sIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODQ3Y2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRIYW5kbGVyQ2hhaW4iPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCQk8andzOnNvYXAtcm9sZT5odHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0FkZGVkUm9sZTwvandzOnNvYXAtcm9sZT4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0czIueG1sIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVyc3RhbmRUZXN0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZhM2E4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL1JvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotCTxqd3M6aGFuZGxlci1jaGFpbiBuYW1lPSJSb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXJDaGFpbiI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJCTxqd3M6c29hcC1yb2xlPmh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQWRkZWRSb2xlPC9qd3M6c29hcC1yb2xlPg0KLQkJCTxqd3M6c29hcC1yb2xlPmh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQWRkZWRSb2xlMjwvandzOnNvYXAtcm9sZT4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotPC9qd3M6aGFuZGxlci1jaGFpbnM+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvUm9sZUJhc2VkTXVzdFVuZGVydGFuZFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJ0YW5kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyN2YwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9Sb2xlQmFzZWRNdXN0VW5kZXJ0YW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5UeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJUeXBlOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuUG9ydEluZm87DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0IFJvbGUgKFNPQVAgMS4yIHRlcm1pbm9sb2d5KSBvciBBY3RvciAoU09BUCAxLjEgdGVybWlub2xvZ3kpIG11c3RVbmRlcnRhbmQgcHJvY2Vzc2luZy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUm9sZUJhc2VkTXVzdFVuZGVydGFuZFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFNPQVBGYWN0b3J5IHNvYXAxMUZhY3Rvcnk7DQotICAgIHByaXZhdGUgU09BUEZhY3Rvcnkgc29hcDEyRmFjdG9yeTsNCi0gICAgcHJpdmF0ZSBPTUZhY3Rvcnkgb21GYWN0b3J5Ow0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly9Sb2xlQmFzZWRNdXN0VW5kZXJzdGFuZFRlc3QvZ29vZC9uYW1lc3BhY2UiOw0KLSAgICBwcml2YXRlIFN0cmluZyBzb2FwMTFOYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOw0KLSAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJfdWx0aW1hdGVSZWNlaXZlciA9ICJoZWFkZXJfdWx0aW1hdGVSZWNlaXZlciI7DQotICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyX3Byb2Nlc3NlZCA9ICJoZWFkZXJfdWx0bWlhdGVSZWNlaXZlcl9wcm9jZXNzZWQiOw0KLSAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJfcm9sZVBsYXllZCA9ICJoZWFkZXJfcm9sZVBsYXllZCI7DQotICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlcl9yb2xlTm90UGxheWVkID0gImhlYWRlcl9yb2xlTm90UGxheWVkIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyX2JpbmRpbmdBZGRlZCA9ICJoZWFkZXJfYmluZGluZ0FkZGVkIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyX1NvYXBOZXh0ID0gImhlYWRlcl9Tb2FwTmV4dCI7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlUGxheWVkMSA9ICJodHRwOi8vUm9sZS9QbGF5ZWQvcm9sZTEiOw0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlTm90UGxheWVkID0gImh0dHA6Ly9Sb2xlL05vdC9QbGF5ZWQvcm9sZTEiOw0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlQmluZGluZ0FkZGVkID0gImh0dHA6Ly9Sb2xlL0FkZGVkL0J5L0JpbmRpbmciOw0KLSAgICBwcml2YXRlIFN0cmluZyByb2xlTm9IZWFkZXJzID0gImh0dHA6Ly9Sb2xlL1BsYXllZC9Oby9IZWFkZXJzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm9sZUhhbmRsZXJBZGRlZCA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL0FkZGVkUm9sZSI7DQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGVIYW5kbGVyQWRkZWQyID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvQWRkZWRSb2xlMiI7DQotICAgIHByaXZhdGUgU3RyaW5nIHJvbGVTb2FwMTFOZXh0ID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCI7DQotDQotICAgIHB1YmxpYyBSb2xlQmFzZWRNdXN0VW5kZXJ0YW5kVGVzdHMoU3RyaW5nIHRlc3ROYW1lKSB7DQotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7DQotICAgICAgICBzb2FwMTFGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOw0KLSAgICAgICAgc29hcDEyRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsNCi0gICAgICAgIG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgdGhhdCBoYW5kbGVyIGluZm9ybWF0aW9uIGNhbiBiZSBjYWNoZWQgb24gdGhlIFNlcnZpY2VEZXNjcml0cGlvbiBvbiB0aGUgc2VydmVyIHNpZGUuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENhY2hpbmdPblNlcnZlcigpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUm9sZUJhc2VkTVVTZXJ2aWNlSW1wbC5jbGFzcyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlcjEgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlcjIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKClbMF07DQotICAgICAgICBQb3J0SW5mbyBwb3J0SW5mbyA9IGVwRGVzYy5nZXRQb3J0SW5mbygpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMxID0gaGFuZGxlclJlc29sdmVyMS5nZXRSb2xlcyhwb3J0SW5mbyk7DQotICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMyID0gaGFuZGxlclJlc29sdmVyMi5nZXRSb2xlcyhwb3J0SW5mbyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJvbGVzMSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJvbGVzMik7DQotICAgICAgICBhc3NlcnRUcnVlKHJvbGVzMSA9PSByb2xlczIpOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIHRoYXQgaGFuZGxlciBpbmZvcm1hdGlvbiBjYW4gTk9UIGJlIGNhY2hlZCBvbiB0aGUgY2xpZW50LiAgVGhhdCBpcyBiZWNhdXNlIHRoZSBjbGllbnQNCi0gICAgICogY2FuIHNwZWNpZnkgaGFuZGxlciBpbmZvcm1hdGlvbiBwZXIgaW5zdGFuY2Ugb2YgYSBzZXJ2aWNlIGRlbGVnYXRlLiAgVGhvc2Ugc2VydmljZQ0KLSAgICAgKiBkZWxlZ2F0ZXMgY291bGQgc2hhcmUgYSBTZXJ2aWNlRGVzY3JpcHRpb24sIGJ1dCBzaW5jZSBlYWNoIHNlcnZpY2UgZGVsZWdhdGUgY291bGQgc3BlY2lmeQ0KLSAgICAgKiB1bmlxdWUgaGFuZGxlciBpbmZvcm1hdGlvbiwgd2UgY2FuJ3QgdXNlIGNvbW1vbiBoYW5kbGVyIGluZm9ybWF0aW9uIHN0b3JlZCBvbiB0aGUNCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENhY2hpbmdPbkNsaWVudCgpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUm9sZUJhc2VkTVVTZXJ2aWNlSW1wbC5jbGFzcyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlcjEgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYywgInNkMSIpOw0KLSAgICAgICAgSGFuZGxlclJlc29sdmVySW1wbCBoYW5kbGVyUmVzb2x2ZXIyID0gbmV3IEhhbmRsZXJSZXNvbHZlckltcGwoc2VydmljZURlc2MsICJzZDIiKTsNCi0NCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZXBEZXNjLmdldFBvcnRJbmZvKCk7DQotICAgICAgICANCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlczEgPSBoYW5kbGVyUmVzb2x2ZXIxLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlczIgPSBoYW5kbGVyUmVzb2x2ZXIyLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocm9sZXMxKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocm9sZXMyKTsNCi0gICAgICAgIGFzc2VydFRydWUocm9sZXMxICE9IHJvbGVzMik7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoZSBKQVhXUyBTcGVjLCBzZWN0aW9uIDEwLCBzYXlzIHJvbGVzIGNhbiBiZSBzZXQgb24gdGhlIFNPQVAgYmluZGluZy4gIFZlcmlmeSB0aGF0IGEgDQotICAgICAqIG11c3RVbmRlcnN0YW5kIGhlYWRlciB3aGljaCBpcyBub3QgcHJvY2Vzc2VkIGZvciBhIHJvbGUgYWRkZWQgYnkgdGhlIFNPQVBCaW5kaW5nIGNhdXNlcw0KLSAgICAgKiBhIE5vdCBVbmRlcnN0b29kIGZhdWx0IA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFJvbGVBZGRlZFRvU29hcEJpbmRpbmcoKSB7DQotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgVWx0aW1hdGVEZXN0aW5hdGlvblJvbGVzKCk7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zY0N0eDExID0gY3JlYXRlTWVzc2FnZUNvbnRleHQoc29hcDExRmFjdG9yeSk7DQotICAgICAgICAvLyBOb3RlIHRoYXQgc2luY2UgdGhpcyByb2xlIGlzIFVsdGltYXRlUmVjZWl2ZXIsIGFsbCB1bnByb2Nlc3NlZCBoZWFkZXJzIHdpbGwgYmUgc2V0DQotICAgICAgICAvLyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBzZXRVbnByb2Nlc3NlZEhlYWRlcnMobXNjQ3R4MTEsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgdGhlIGhlYWRlcnMgZm9yIFVsdGltYXRlIFJlY2VpdmVyIGFuZCB0aGUNCi0gICAgICAgIC8vIHJvbGUgd2UgYXJlIGFjdGluZyBpbi4gIFdlIGRvbid0IGluZGljYXRlIHdlIHVuZGVyc3RhbmQgdGhlIGhlYWRlciB0aGF0IHRoZSBTT0FQQmluZGluZw0KLSAgICAgICAgLy8gYWRkZWQsIHNvIHRoYXQgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgbGlzdCBvZiBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgYWN0ZWQgaW4gKGUuZy4gb25lIHBsYXllZCBieSBhIEpBWFdTDQotICAgICAgICAvLyBoYW5kbGVyKQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclJvbGVzUGxheWVkID0gYmluZGluZ0FkZGVkUm9sZSgpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2NDdHgxMSwgdW5kZXJzdG9vZEhlYWRlcnMsIGhlYWRlclJvbGVzUGxheWVkKTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gTm90VW5kZXJzdG9vZCBmYXVsdCBmb3IgaGVhZGVyIGZvciByb2xlIGFkZGVkIGJ5IGJpbmRpbmc6ICIgKyBoZWFkZXJfYmluZGluZ0FkZGVkKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgew0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGg7IHNob3VsZCBnZXQgZXhjZXB0aW9uIGZvciB1bHRpbWF0ZSByZWNlaXZlciBub3QgcHJvY2Vzc2VkLg0KLSAgICAgICAgICAgIFN0cmluZyBjaGVja0ZhdWx0ID0gYWYudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBpZiAoIWNoZWNrRmF1bHQuY29udGFpbnMoIk11c3QgVW5kZXJzdGFuZCBjaGVjayBmYWlsZWQiKQ0KLSAgICAgICAgICAgICAgICB8fCAhY2hlY2tGYXVsdC5jb250YWlucyhoZWFkZXJfYmluZGluZ0FkZGVkKSkgew0KLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBleHBlY3RlZCBOb3RVbmRlcnN0b29kIEF4aXNGYXVsdC4gIFVuZXhwZWN0ZWQgZmF1bHQgIiArIGFmKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAgKyBlIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHdoZXJlIHRoZXJlIGFyZSBubyBwcmV2aW91cyBub24tdW5kZXJzdG9vZCBoZWFkZXJzIG9uIHRoZSBNZXNzYWdlQ29udGV4dCBhbmQgdGhlcmUncyBhbiANCi0gICAgICogYWRkaXRpb25hbCBSb2xlIGFkZGVkIGJ5IGEgSkFYV1MgaGFuZGxlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE9ubHlTb2FwQmluZGluZ1JvbGUoKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2NDdHgxMSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHNvYXAxMUZhY3RvcnkpOw0KLSAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFyZSBub3QgcHV0dGluZyBhbnkgbm9uLXVuZGVyc3Rvb2QgaGVhZGVycyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIGFkZGl0aW9uYWwgcm9sZXMgKGUuZy4gb25lIHBsYXllZCBieSBhIEpBWFdTDQotICAgICAgICAvLyBoYW5kbGVyDQotICAgICAgICBMaXN0PFN0cmluZz4gaGVhZGVyUm9sZXNQbGF5ZWQgPSBiaW5kaW5nQWRkZWRSb2xlKCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEhhbmRsZXJVdGlscy5jaGVja011c3RVbmRlcnN0YW5kKG1zY0N0eDExLCBudWxsLCBoZWFkZXJSb2xlc1BsYXllZCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIE5vdFVuZGVyc3Rvb2QgZmF1bHQgZm9yIGhlYWRlciBmb3Igcm9sZSBhZGRlZCBieSBiaW5kaW5nOiAiICsgaGVhZGVyX2JpbmRpbmdBZGRlZCk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoOyBzaG91bGQgZ2V0IGV4Y2VwdGlvbiBmb3IgdWx0aW1hdGUgcmVjZWl2ZXIgbm90IHByb2Nlc3NlZC4NCi0gICAgICAgICAgICBTdHJpbmcgY2hlY2tGYXVsdCA9IGFmLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgaWYgKCFjaGVja0ZhdWx0LmNvbnRhaW5zKCJNdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIikNCi0gICAgICAgICAgICAgICAgfHwgIWNoZWNrRmF1bHQuY29udGFpbnMoaGVhZGVyX2JpbmRpbmdBZGRlZCkpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgTm90VW5kZXJzdG9vZCBBeGlzRmF1bHQuICBVbmV4cGVjdGVkIGZhdWx0ICIgKyBhZik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gICsgZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGF0IGFkZGluZyBhIHJvbGUgZm9yIGhlYWRlcnMgdGhhdCBkb2VzIG5vdCBleGlzdCBkb2VzIG5vdCBjYXVzZSBhbnkgZmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0hlYWRlcnNGb3JTb2FwQmluZGluZ1JvbGUoKSB7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2NDdHgxMSA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHNvYXAxMUZhY3RvcnkpOw0KLQ0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclJvbGVzUGxheWVkID0gbm9IZWFkZXJzUm9sZSgpOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2NDdHgxMSwgbnVsbCwgaGVhZGVyUm9sZXNQbGF5ZWQpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7DQotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBBeGlzRmF1bHQgIisgYWYpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gICsgZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIEEgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIGZvciBhIHJvbGUgbm90IGJlaW5nIGFjdGVkIGluIHNob3VsZCBOT1QgY2F1c2UgYSBub3RVbmRlcnN0b29kDQotICAgICAqIGZhdWx0LiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSb2xlTm90QWN0aW5nSW4oKSB7DQotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgVWx0aW1hdGVEZXN0aW5hdGlvblJvbGVzKCk7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zY0N0eDExID0gY3JlYXRlTWVzc2FnZUNvbnRleHQoc29hcDExRmFjdG9yeSk7DQotICAgICAgICAvLyBOb3RlIHRoYXQgc2luY2UgdGhpcyByb2xlIGlzIFVsdGltYXRlUmVjZWl2ZXIsIGFsbCB1bnByb2Nlc3NlZCBoZWFkZXJzIHdpbGwgYmUgc2V0DQotICAgICAgICAvLyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBzZXRVbnByb2Nlc3NlZEhlYWRlcnMobXNjQ3R4MTEsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgdGhlIGhlYWRlcnMgZm9yIFVsdGltYXRlIFJlY2VpdmVyIGFuZCB0aGUNCi0gICAgICAgIC8vIHJvbGUgd2UgYXJlIGFjdGluZyBpbi4gIFRoaXMgbGVhdmVzIHRoZSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgZm9yIHRoZSByb2xlIHdlIGFyZSBub3QgDQotICAgICAgICAvLyBhY3RpbmcgaW4sIHdoaWNoIHNob3VsZCBub3QgY2F1c2UgYW4gZXhjZXB0aW9uLg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobXNjQ3R4MTEsIHVuZGVyc3Rvb2RIZWFkZXJzLCBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGNhdWdodCBhbiBBeGlzRmF1bHQgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBtdXN0VW5kZXJzdGFuZCBwcm9jZXNzaW5nIGZvciBVbHRpbWF0ZSBSZWNlaXZlciB3aXRoIGFuIHVuZGVyc3Rvb2QgaGVhZGVyIGxpc3QNCi0gICAgICogcGFzc2VkIHRvIHRoZSBtdXN0VW5kZXJzdGFuZCBjaGVja2luZw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFVsdGltYXRlUmVjZWl2ZXJSb2xlcygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IFVsdGltYXRlRGVzdGluYXRpb25Sb2xlcygpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNjQ3R4MTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtc2NDdHgxMSwgcm9sZVBsYXllcik7DQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgYWxsIHRoZSBoZWFkZXJzLg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobXNjQ3R4MTEsIHVuZGVyc3Rvb2RIZWFkZXJzLCBudWxsKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGNhdWdodCBhbiBBeGlzRmF1bHQgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCBhbiBVbHRpbWF0ZSBSZWNlaXZlciB3aXRoIG5vIHJvbGVzIG9ubHkgeWllbGRzIHRoZSBoZWFkZXIgd2l0aCBubyByb2xlIHNwZWNpZmllZA0KLSAgICAgKiBhcyB1bnByb2Nlc3NlZCBhbmQgdGhhdCBwYXNzaW5nIGEgbGlzdCBvZiB1bmRlcnN0b29kIGhlYWRlcnMgaW5jbHVkaW5nIGp1c3QgdGhhdCBvbmUgY2F1c2VzDQotICAgICAqIHRoZSBtdXN0VW5kZXJzdGFuZCBjaGVja3MgdG8gcGFzcy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbHRpbWF0ZVJlY2VpdmVyKCkgew0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IFVsdGltYXRlRGVzdGluYXRpb25Ob1JvbGVzKCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIC8vIEluZGljYXRlIHRoZSBtdXN0IHVuZGVyc3RhbmQgaGVhZGVyIHdpdGhvdXQgYW4gZXhwbGljaXQgcm9sZSB3aWxsIGJlIHVuZGVyc3Rvb2QuDQotICAgICAgICAvLyBUaGUgb3RoZXIgaGVhZGVycywgd2l0aCBleHBsaWNpdCByb2xlcywgc2hvdWxkIG5vdCBjYXVzZSBhbiBlcnJvci4NCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtc2dDdHgsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEhhbmRsZXJVdGlscy5jaGVja011c3RVbmRlcnN0YW5kKG1zZ0N0eCwgdW5kZXJzdG9vZEhlYWRlcnMsIG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgY2F1Z2h0IGFuZCBBeGlzRmF1bHQgIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG11c3RVbmRlcnN0YW5kIHByb2Nlc3NpbmcgZm9yIFVsdGltYXRlIFJlY2VpdmVyIHdpdGhvdXQgYWRkaXRpb25hbCB1bmRlcnN0b29kIGhlYWRlcnMNCi0gICAgICogYmVpbmcgcGFzc2VkIHRvIHRoZSBjaGVja2VyLiAgVGhpcyBzaG91bGQgY2F1c2UgYSBub3RVbmRlcnN0b29kIGZhdWx0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VWx0aW1hdGVSZWNlaXZlck5vUm9sZXMoKSB7DQotICAgICAgICBSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgVWx0aW1hdGVEZXN0aW5hdGlvbk5vUm9sZXMoKTsNCi0NCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0MTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtZXNzYWdlQ29udGV4dDExLCByb2xlUGxheWVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobWVzc2FnZUNvbnRleHQxMSwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIE11c3RVbmRlcnN0YW5kIEhlYWRlciBOb3QgVW5kZXJzdG9vZCBmYXVsdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aDsgc2hvdWxkIGdldCBleGNlcHRpb24gZm9yIHVsdGltYXRlIHJlY2VpdmVyIG5vdCBwcm9jZXNzZWQuDQotICAgICAgICAgICAgU3RyaW5nIGNoZWNrRmF1bHQgPSBhZi50b1N0cmluZygpOw0KLSAgICAgICAgICAgIGlmICghY2hlY2tGYXVsdC5jb250YWlucygiTXVzdCBVbmRlcnN0YW5kIGNoZWNrIGZhaWxlZCIpDQotICAgICAgICAgICAgICAgIHx8ICFjaGVja0ZhdWx0LmNvbnRhaW5zKGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSkgew0KLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IGdldCBleHBlY3RlZCBOb3RVbmRlcnN0b29kIEF4aXNGYXVsdC4gIFVuZXhwZWN0ZWQgZmF1bHQgIiArIGFmKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiAgKyBlIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0MTIgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTJGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtZXNzYWdlQ29udGV4dDEyLCByb2xlUGxheWVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobWVzc2FnZUNvbnRleHQxMiwgbnVsbCwgbnVsbCk7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIE11c3RVbmRlcnN0YW5kIEhlYWRlciBOb3QgVW5kZXJzdG9vZCBmYXVsdCIpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aDsgc2hvdWxkIGdldCBleGNlcHRpb24gZm9yIHVsdGltYXRlIHJlY2VpdmVyIG5vdCBwcm9jZXNzZWQuDQotICAgICAgICAgICAgaWYgKCFhZi50b1N0cmluZygpLmNvbnRhaW5zKCJNdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIikpIHsNCi0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBnZXQgZXhwZWN0ZWQgTm90VW5kZXJzdG9vZCBBeGlzRmF1bHQuICBVbmV4cGVjdGVkIGZhdWx0ICIgKyBhZik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gICsgZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCBhIFJvbGVQbGF5ZXIgdGhhdCBpcyBub3QgYW4gdWx0aW1hdGUgcmVjZWl2ZXIgYW5kIGRvZXMgbm90IGFjdCBpbiBhbnkgcm9sZXMNCi0gICAgICogY29ycmVzcG9uZGluZyB0byBoZWFkZXJzLiAgVGhlcmUgc2hvdWxkIGJlIG5vIGZhdWx0cyBjYXVzZSBieSB0aGUgbXVzdFVuZGVyc3RhbmQgaGVhZGVycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vdFVsdGltYXRlUmVjZWl2ZXJOb1JvbGVzKCkgew0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IE5vdFVsdGltYXRlRGVzdGluYXRpb25Ob1JvbGVzKCk7DQotICAgICAgICANCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eDExID0gY3JlYXRlTWVzc2FnZUNvbnRleHQoc29hcDExRmFjdG9yeSk7DQotICAgICAgICBzZXRVbnByb2Nlc3NlZEhlYWRlcnMobXNnQ3R4MTEsIHJvbGVQbGF5ZXIpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2dDdHgxMSwgbnVsbCwgbnVsbCk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgew0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSBjYXVnaHQgYW5kIEF4aXNGYXVsdCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHgxMiA9IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHNvYXAxMkZhY3RvcnkpOw0KLSAgICAgICAgc2V0VW5wcm9jZXNzZWRIZWFkZXJzKG1zZ0N0eDEyLCByb2xlUGxheWVyKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSGFuZGxlclV0aWxzLmNoZWNrTXVzdFVuZGVyc3RhbmQobXNnQ3R4MTIsIG51bGwsIG51bGwpOw0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgY2F1Z2h0IGFuZCBBeGlzRmF1bHQiKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCB0aGUgSGFuZGxlclJlc29sdmVySW1wbCByZXR1cm5zIHRoZSBjb3JyZWN0IHJvbGVzIGRlZmluZWQgaW4gdGhlIGhhbmRsZXIgY29uZmlnDQotICAgICAqIGZpbGUgPHNvYXAtcm9sZT4gZWxlbWVudHMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyR2V0Um9sZXMoKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFJvbGVCYXNlZE1VU2VydmljZUltcGwuY2xhc3MpOw0KLSAgICAgICAgSGFuZGxlclJlc29sdmVySW1wbCBoYW5kbGVyUmVzb2x2ZXIgPSBuZXcgSGFuZGxlclJlc29sdmVySW1wbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByb2xlIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlciBjb25maWcgZmlsZQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgZXBIYW5kbGVyQ2hhaW5zID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcEhhbmRsZXJDaGFpbnMpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBlcEhhbmRsZXJDaGFpbiA9IGVwSGFuZGxlckNoYWlucy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXJDaGFpbi5zaXplKCkpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyVHlwZT4gZXBIYW5kbGVyID0gZXBIYW5kbGVyQ2hhaW4uZ2V0KDApLmdldEhhbmRsZXIoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXIuc2l6ZSgpKTsNCi0gICAgICAgIEhhbmRsZXJUeXBlIGhhbmRsZXJUeXBlID0gZXBIYW5kbGVyLmdldCgwKTsNCi0gICAgICAgIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHNvYXBSb2xlcyA9IA0KLSAgICAgICAgICAgIGhhbmRsZXJUeXBlLmdldFNvYXBSb2xlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBSb2xlcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc29hcFJvbGVzLnNpemUoKSk7DQotICAgICAgICBTdHJpbmcgYWRkZWRSb2xlID0gc29hcFJvbGVzLmdldCgwKS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGVIYW5kbGVyQWRkZWQsIGFkZGVkUm9sZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhlIHJvbGUgaW5mb3JtYXRpb24gaW4gdGhlIGhhbmRsZXIgY29uZmlnIGZpbGUgY29ycmVjdGx5IGFmZmVjdHMgdGhlDQotICAgICAgICAvLyByb2xlcyBwbGF5ZWQgcmV0dXJuZWQgZnJvbSB0aGUgUmVzb2x2ZXINCi0gICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZXBEZXNjLmdldFBvcnRJbmZvKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzID0gaGFuZGxlclJlc29sdmVyLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGFuZGxlclJvbGVzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBoYW5kbGVyUm9sZXMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlSGFuZGxlckFkZGVkLCBoYW5kbGVyUm9sZXMuZ2V0KDApKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW4gPSBoYW5kbGVyUmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGFuZGxlckNoYWluKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBoYW5kbGVyQ2hhaW4uc2l6ZSgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCBtdWx0aXBsZSA8c29hcC1yb2xlPiBlbGVtZW50cyBpbiB0aGUgaGFuZGxlciBjb25maWcgZmlsZSB3b3JrIGNvcnJlY3RseS4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyR2VyUm9sZXMyKCkgew0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihSb2xlQmFzZWRNVVNlcnZpY2VJbXBsMi5jbGFzcyk7DQotICAgICAgICBIYW5kbGVyUmVzb2x2ZXJJbXBsIGhhbmRsZXJSZXNvbHZlciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByb2xlIGluZm9ybWF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgaGFuZGxlciBjb25maWcgZmlsZQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgZXBIYW5kbGVyQ2hhaW5zID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcEhhbmRsZXJDaGFpbnMpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBlcEhhbmRsZXJDaGFpbiA9IGVwSGFuZGxlckNoYWlucy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXJDaGFpbi5zaXplKCkpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyVHlwZT4gZXBIYW5kbGVyID0gZXBIYW5kbGVyQ2hhaW4uZ2V0KDApLmdldEhhbmRsZXIoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcEhhbmRsZXIuc2l6ZSgpKTsNCi0gICAgICAgIEhhbmRsZXJUeXBlIGhhbmRsZXJUeXBlID0gZXBIYW5kbGVyLmdldCgwKTsNCi0gICAgICAgIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHNvYXBSb2xlcyA9IA0KLSAgICAgICAgICAgIGhhbmRsZXJUeXBlLmdldFNvYXBSb2xlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBSb2xlcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc29hcFJvbGVzLnNpemUoKSk7DQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjaGVja1JvbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQotICAgICAgICBjaGVja1JvbGVzLmFkZChzb2FwUm9sZXMuZ2V0KDApLmdldFZhbHVlKCkpOw0KLSAgICAgICAgY2hlY2tSb2xlcy5hZGQoc29hcFJvbGVzLmdldCgxKS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hlY2tSb2xlcy5jb250YWlucyhyb2xlSGFuZGxlckFkZGVkKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUm9sZXMuY29udGFpbnMocm9sZUhhbmRsZXJBZGRlZDIpKTsNCi0NCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhlIHJvbGUgaW5mb3JtYXRpb24gaW4gdGhlIGhhbmRsZXIgY29uZmlnIGZpbGUgY29ycmVjdGx5IGFmZmVjdHMgdGhlDQotICAgICAgICAvLyByb2xlcyBwbGF5ZWQgcmV0dXJuZWQgZnJvbSB0aGUgUmVzb2x2ZXINCi0gICAgICAgIFBvcnRJbmZvIHBvcnRJbmZvID0gZXBEZXNjLmdldFBvcnRJbmZvKCk7DQotDQotICAgICAgICBMaXN0PFN0cmluZz4gaGFuZGxlclJvbGVzID0gaGFuZGxlclJlc29sdmVyLmdldFJvbGVzKHBvcnRJbmZvKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaGFuZGxlclJvbGVzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBoYW5kbGVyUm9sZXMuc2l6ZSgpKTsNCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoZWNrUmVzb2x2ZXJSb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgY2hlY2tSZXNvbHZlclJvbGVzLmFkZCgoU3RyaW5nKSBoYW5kbGVyUm9sZXMuZ2V0KDApKTsNCi0gICAgICAgIGNoZWNrUmVzb2x2ZXJSb2xlcy5hZGQoKFN0cmluZykgaGFuZGxlclJvbGVzLmdldCgxKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUmVzb2x2ZXJSb2xlcy5jb250YWlucyhyb2xlSGFuZGxlckFkZGVkKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUmVzb2x2ZXJSb2xlcy5jb250YWlucyhyb2xlSGFuZGxlckFkZGVkMikpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJDaGFpbiA9IGhhbmRsZXJSZXNvbHZlci5nZXRIYW5kbGVyQ2hhaW4ocG9ydEluZm8pOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoYW5kbGVyQ2hhaW4pOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhhbmRsZXJDaGFpbi5zaXplKCkpOw0KLQ0KLSAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhhdCBhIFJvbGVQbGF5ZXIgd2l0aCBubyByb2xlcyBkb2Vzbid0IGNhdXNlIGFueSBwcm9ibGVtcyBpbiB0aGUgbXVzdFVuZGVyc3RhbmQNCi0gICAgICogY2hlY2tpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyRW1wdHlSb2xlc1BsYXllZCgpIHsNCi0gICAgICAgIA0KLSAgICAgICAgUm9sZVBsYXllciByb2xlUGxheWVyID0gbmV3IFVsdGltYXRlRGVzdGluYXRpb25Sb2xlcygpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4MTEgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChzb2FwMTFGYWN0b3J5KTsNCi0gICAgICAgIHNldFVucHJvY2Vzc2VkSGVhZGVycyhtc2dDdHgxMSwgcm9sZVBsYXllcik7DQotICAgICAgICAvLyBJbmRpY2F0ZSB3ZSB1bmRlcnN0YW5kIChlLmcuIHZpYSBoYW5kbGVycykgYWxsIHRoZSBoZWFkZXJzLg0KLSAgICAgICAgTGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgdW5kZXJzdG9vZEhlYWRlcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGhlYWRlcl91bHRpbWF0ZVJlY2VpdmVyKSk7DQotICAgICAgICB1bmRlcnN0b29kSGVhZGVycy5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0NCi0gICAgICAgIExpc3Q8U3RyaW5nPiBoYW5kbGVyUm9sZVBsYXllciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBIYW5kbGVyVXRpbHMuY2hlY2tNdXN0VW5kZXJzdGFuZChtc2dDdHgxMSwgdW5kZXJzdG9vZEhlYWRlcnMsIGhhbmRsZXJSb2xlUGxheWVyKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBoYXZlIGNhdWdodCBhbmQgQXhpc0ZhdWx0Iik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICAvLyBVdGlsaXR5IG1ldGhvZHMNCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkpIHsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbnVsbDsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsNCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOw0KLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0gICAgICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMSk7DQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzMSk7DQotDQotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEVudmVsb3BlKCk7DQotDQotICAgICAgICAgICAgU09BUEhlYWRlciBzaCA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIoc2UpOw0KLQ0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGIxID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXIsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXIpKTsNCi0gICAgICAgICAgICAvLyBTaW5jZSBubyByb2xlIHdhcyBzZXQgb24gdGhlIHNoYjEsIGRlZmF1bHQgaXMgdWx0aW1hdGUgcmVjZWl2ZXINCi0gICAgICAgICAgICBzaGIxLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGIyID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX3JvbGVQbGF5ZWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgaGVhZGVyX3JvbGVQbGF5ZWQpKTsNCi0gICAgICAgICAgICBzaGIyLnNldFJvbGUocm9sZVBsYXllZDEpOw0KLSAgICAgICAgICAgIHNoYjIuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNoYjMgPSBzaC5hZGRIZWFkZXJCbG9jayhoZWFkZXJfcm9sZU5vdFBsYXllZCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBoZWFkZXJfcm9sZU5vdFBsYXllZCkpOw0KLSAgICAgICAgICAgIHNoYjMuc2V0Um9sZShyb2xlTm90UGxheWVkKTsNCi0gICAgICAgICAgICBzaGIzLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGI0ID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX2JpbmRpbmdBZGRlZCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsIGhlYWRlcl9iaW5kaW5nQWRkZWQpKTsNCi0gICAgICAgICAgICBzaGI0LnNldFJvbGUocm9sZUJpbmRpbmdBZGRlZCk7DQotICAgICAgICAgICAgc2hiNC5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBUaGlzIGhlYWRlciBpcyBkZXN0aW5lZCBmb3IgdGhlIHVsbWlhdGUgcmVjZWl2ZXIsIGJ1dCBpdCBpcyBhbHJlYWR5IHByb2Nlc3NlZA0KLSAgICAgICAgICAgIC8vIHNvIGl0IHNob3VsZG4ndCBjYXVzZSBtdXN0VW5kZXJzdGFuZCBmYXVsdA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGI1ID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXJfcHJvY2Vzc2VkLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgaGVhZGVyX3VsdGltYXRlUmVjZWl2ZXJfcHJvY2Vzc2VkKSk7DQotICAgICAgICAgICAgLy8gU2luY2Ugbm8gcm9sZSB3YXMgc2V0IG9uIHRoZSBzaGIxLCBkZWZhdWx0IGlzIHVsdGltYXRlIHJlY2VpdmVyDQotICAgICAgICAgICAgc2hiNS5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsNCi0gICAgICAgICAgICBzaGI1LnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIEhlYWRlciB0YXJnZXRlZCBmb3IgU09BUDExIHJvbGUgb2YgTmV4dCwgbm90IHNldCB0byBNdXN0VW5kZXJzdGFuZA0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBzaGI2ID0gc2guYWRkSGVhZGVyQmxvY2soaGVhZGVyX1NvYXBOZXh0LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHNvYXAxMU5hbWVzcGFjZSwgaGVhZGVyX1NvYXBOZXh0KSk7DQotICAgICAgICAgICAgc2hiNi5zZXRSb2xlKHJvbGVTb2FwMTFOZXh0KTsNCi0NCi0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShzZSk7DQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjcmVhdGluZyBtZXNzYWdlIGNvbnRleHQiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQ7DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBzZXRVbnByb2Nlc3NlZEhlYWRlcnMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFJvbGVQbGF5ZXIgcm9sZVBsYXllcikgew0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3Mocm9sZVBsYXllcik7DQotICAgICAgICBMaXN0PFFOYW1lPiB1bnByb2Nlc3NlZEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOw0KLSAgICAgICAgd2hpbGUgKGhlYWRlckJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOw0KLSAgICAgICAgICAgIFFOYW1lIGhlYWRlck5hbWUgPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIC8vIGlmIHRoaXMgaGVhZGVyIGJsb2NrIGhhcyBiZWVuIHByb2Nlc3NlZCBvciBtdXN0VW5kZXJzdGFuZCBpc24ndA0KLSAgICAgICAgICAgIC8vIHR1cm5lZCBvbiB0aGVuIGl0cyBjb29sDQotICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrLmlzUHJvY2Vzc2VkKCkgfHwgIWhlYWRlckJsb2NrLmdldE11c3RVbmRlcnN0YW5kKCkpIHsNCi0gICAgICAgICAgICAgICAgY29udGludWU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdW5wcm9jZXNzZWRIZWFkZXJzLmFkZChoZWFkZXJOYW1lKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBpZih1bnByb2Nlc3NlZEhlYWRlcnMgIT1udWxsICYmIHVucHJvY2Vzc2VkSGVhZGVycy5zaXplKCk+MCl7DQotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLlVOUFJPQ0VTU0VEX0hFQURFUl9RTkFNRVMsIHVucHJvY2Vzc2VkSGVhZGVycyk7ICAgICAgICAgICANCi0gICAgICAgIH0gICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGJpbmRpbmdBZGRlZFJvbGUoKSB7DQotICAgICAgICBMaXN0PFN0cmluZz4gcm9sZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIHJvbGVzLmFkZChyb2xlQmluZGluZ0FkZGVkKTsNCi0gICAgICAgIHJldHVybiByb2xlczsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbm9IZWFkZXJzUm9sZSgpIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgcm9sZXMuYWRkKHJvbGVOb0hlYWRlcnMpOw0KLSAgICAgICAgcmV0dXJuIHJvbGVzOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIC8vIElubmVyIFRlc3QgQ2xhc3Nlcw0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0gICAgDQotICAgIGNsYXNzIFVsdGltYXRlRGVzdGluYXRpb25Ob1JvbGVzIGltcGxlbWVudHMgUm9sZVBsYXllciB7DQotICAgICAgICBwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVWx0aW1hdGVEZXN0aW5hdGlvbigpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBjbGFzcyBOb3RVbHRpbWF0ZURlc3RpbmF0aW9uTm9Sb2xlcyBpbXBsZW1lbnRzIFJvbGVQbGF5ZXIgew0KLSAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBVbHRpbWF0ZURlc3RpbmF0aW9uUm9sZXMgaW1wbGVtZW50cyBSb2xlUGxheWVyIHsNCi0gICAgICAgIExpc3Q8U3RyaW5nPiByb2xlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KLSAgICAgICAgcHVibGljIFVsdGltYXRlRGVzdGluYXRpb25Sb2xlcygpIHsNCi0gICAgICAgICAgICByb2xlcy5hZGQocm9sZVBsYXllZDEpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHVibGljIExpc3QgZ2V0Um9sZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHJvbGVzOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVbHRpbWF0ZURlc3RpbmF0aW9uKCkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBAV2ViU2VydmljZQ0KLSAgICBASGFuZGxlckNoYWluKGZpbGU9IlJvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMueG1sIikNCi0gICAgY2xhc3MgUm9sZUJhc2VkTVVTZXJ2aWNlSW1wbCB7DQotICAgICAgICANCi0gICAgfQ0KLQ0KLSAgICBAV2ViU2VydmljZQ0KLSAgICBASGFuZGxlckNoYWluKGZpbGU9IlJvbGVCYXNlZE11c3RVbmRlcnN0YW5kVGVzdHMyLnhtbCIpDQotICAgIGNsYXNzIFJvbGVCYXNlZE1VU2VydmljZUltcGwyIHsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvQ29tcG9zaXRlTWVzc2FnZUNvbnRleHRUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvY29udGV4dC9Db21wb3NpdGVNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOTliZDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2hhbmRsZXIvY29udGV4dC9Db21wb3NpdGVNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuZmFjdG9yeS5NZXNzYWdlQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5Tb2FwTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC53cy5Mb2dpY2FsTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQSB0ZXN0IHN1aXRlIGZvciBzY2VuYXJpb3Mgd2hlcmUgdGhlIGludGVybmFsIE1lc3NhZ2VDb250ZXh0IGlzIGNvbnZlcnRlZAotICogYmV0d2VlbiBoYW5kbGVyIGNvbnRleHQgZm9ybWF0cyAoU09BUE1lc3NhZ2VDb250ZXh0IGFuZCBMb2dpY2FsTWVzc2FnZUNvbnRleHQpLgotICogCi0gKiBUaGUgZmxvd3MgdGhhdCBuZWVkIHRvIGJlIHRlc3RlZCBoZXJlIGFyZToKLSAqIAotICogMSkgSU5CT1VORDogVGhlIE1lc3NhZ2VDb250ZXh0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBMb2dpY2FsTWVzc2FnZUNvbnRleHQKLSAqICAgICAgICAgICAgIHRvIGEgU09BUE1lc3NhZ2VDb250ZXh0LiAgVGhpcyBkcml2ZXMgY29udmVydGluZyB0aGUgT00gbWVzc2FnZSAKLSAqICAgICAgICAgICAgIHRvIGFuIFNBQUogU09BUE1lc3NhZ2UgYW1vbmcgb3RoZXIgdGhpbmdzLgotICogICAgCi0gKiAgICBzcGVjaWZpYyB0ZXN0czogICAgICAgICAKLSAqICAgIC0gTm9ybWFsIG1lc3NhZ2UKLSAqICAgIC0gRmF1bHQgbWVzc2FnZQotICogICAgCi0gKiAyKSBPVVRCT1VORDogVGhlIE1lc3NhZ2VDb250ZXh0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBTT0FQTWVzc2FnZUNvbnRleHQgCi0gKiAgICAgICAgICAgICAgdG8gYSBMb2dpY2FsTWVzc2FnZUNvbnRleHQuICBUaGlzIHdpbGwgZHJpdmUgY29udmVyc2lvbiBmcm9tIAotICogICAgICAgICAgICAgIGFuIFNBQUogU09BUE1lc3NhZ2UgYmFjayB0byBhbiBPTSAodGhlcmUgYXJlIHNvbWUgdmVyeSB0cmlja3kgCi0gKiAgICAgICAgICAgICAgcGllY2VzIG9mIGNvZGUgY29udGFpbmVkIHdpdGhpbiB0aGF0IHNjZW5hcmlvKS4gCi0gKiAgICAgICAgICAgICAgCi0gKiAgICBzcGVjaWZpYyB0ZXN0OgotICogICAgLSBOb3JtYWwgbWVzc2FnZQotICogICAgLSBGYXVsdCBtZXNzYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVNZXNzYWdlQ29udGV4dFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRkFVTFRfSU5QVVQgPSAic2FtcGxlIGZhdWx0IGlucHV0IjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHRlc3QgdGhhdCBtaW1pY3MgdGhlIGluYm91bmQgZmxvdyB0aHJvdWdoIGEgaGFuZGxlciBjaGFpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ib3VuZEZhdWx0RmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IGNyZWF0ZVNhbXBsZUZhdWx0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBNZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgTG9naWNhbE1lc3NhZ2UgbG0gPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IGxtLmdldFBheWxvYWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKFNvdXJjZSkgd2FzIG51bGwiLCBwYXlsb2FkICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgdC50cmFuc2Zvcm0ocGF5bG9hZCwgcmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgY29udGVudCAoU3RyaW5nKSBmcm9tIHRoZSBwYXlsb2FkIHdhcyBudWxsIiwgY29udGVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIDxmYXVsdGNvZGU+IGVsZW1lbnQgd2FzIG5vdCBmb3VuZCIsIGNvbnRlbnQuaW5kZXhPZigiZmF1bHRjb2RlIikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSA8ZmF1bHRzdHJpbmc+IGVsZW1lbnQgd2FzIG5vdCBmb3VuZCIsIGNvbnRlbnQuaW5kZXhPZigiZmF1bHRzdHJpbmciKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGZhdWx0IGRpZCBub3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgZmF1bHQgc3RyaW5nIiwgY29udGVudC5pbmRleE9mKEZBVUxUX0lOUFVUKSA+IC0xKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgU29hcE1lc3NhZ2VDb250ZXh0IHNtYyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IHNtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBTT0FQTWVzc2FnZSB3YXMgbnVsbCIsIHNtICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUE1lc3NhZ2UgZGlkIG5vdCBjb250YWluIGEgU09BUEJvZHkiLCBzbS5nZXRTT0FQQm9keSgpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUEJvZHkgZGlkIG5vdCBjb250YWluIGEgU09BUEZhdWx0Iiwgc20uZ2V0U09BUEJvZHkoKS5nZXRGYXVsdCgpICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHRlc3QgdGhhdCBtaW1pY3MgdGhlIG91dGJvdW5kIGZsb3cgdGhyb3VnaCBhIGhhbmRsZXIgY2hhaW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kRmF1bHRGbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gY3JlYXRlU2FtcGxlRmF1bHRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgU29hcE1lc3NhZ2VDb250ZXh0IHNtYyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IHNtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBTT0FQTWVzc2FnZSB3YXMgbnVsbCIsIHNtICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUE1lc3NhZ2UgZGlkIG5vdCBjb250YWluIGEgU09BUEJvZHkiLCBzbS5nZXRTT0FQQm9keSgpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU09BUEJvZHkgZGlkIG5vdCBjb250YWluIGEgU09BUEZhdWx0Iiwgc20uZ2V0U09BUEJvZHkoKS5nZXRGYXVsdCgpICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxtYyA9IE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVMb2dpY2FsTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBMb2dpY2FsTWVzc2FnZSBsbSA9IGxtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIFNvdXJjZSBwYXlsb2FkID0gbG0uZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHQgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB0LnRyYW5zZm9ybShwYXlsb2FkLCByZXN1bHQpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBjb250ZW50IChTdHJpbmcpIGZyb20gdGhlIHBheWxvYWQgd2FzIG51bGwiLCBjb250ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgPGZhdWx0Y29kZT4gZWxlbWVudCB3YXMgbm90IGZvdW5kIiwgY29udGVudC5pbmRleE9mKCJmYXVsdGNvZGUiKSA+IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIDxmYXVsdHN0cmluZz4gZWxlbWVudCB3YXMgbm90IGZvdW5kIiwgY29udGVudC5pbmRleE9mKCJmYXVsdHN0cmluZyIpID4gLTEpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZmF1bHQgZGlkIG5vdCBjb250YWluIHRoZSBleHBlY3RlZCBmYXVsdCBzdHJpbmciLCBjb250ZW50LmluZGV4T2YoRkFVTFRfSU5QVVQpID4gLTEpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVNhbXBsZUZhdWx0TWVzc2FnZUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0KLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uID0gbmV3IFhNTEZhdWx0UmVhc29uKEZBVUxUX0lOUFVUKTsKLSAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBuZXcgWE1MRmF1bHQoWE1MRmF1bHRDb2RlLlNFTkRFUiwgcmVhc29uKTsKLSAgICAgICAgbXNnLnNldFhNTEZhdWx0KGZhdWx0KTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jKSk7Ci0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnKTsKLQotICAgICAgICByZXR1cm4gbWM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvTG9naWNhbE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvTG9naWNhbE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiN2M5YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9jb250ZXh0L0xvZ2ljYWxNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbnRleHQuZmFjdG9yeS5NZXNzYWdlQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5CbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLlhNTEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgdGVzdC5FY2hvU3RyaW5nOwotaW1wb3J0IHRlc3QuT2JqZWN0RmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkxvZ2ljYWxNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxNZXNzYWdlQ29udGV4dDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHRoZSBjcmVhdGlvbiBhbmQgdXNhZ2Ugb2YgdGhlIExvZ2ljYWxNZXNzYWdlQ29udGV4dCB0aGF0IGlzCi0gKiB1c2VkIGZvciBoYW5kbGVyIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dpY2FsTWVzc2FnZUNvbnRleHRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTlBVVCA9ICJzYW1wbGUgaW5wdXQiOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEZBVUxUX0lOUFVUID0gInNhbXBsZSBmYXVsdCBpbnB1dCI7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2FtcGxlU09BUDExRmF1bHRQYXlsb2FkID0KLSAgICAgICAgIjxzb2FwZW52OkZhdWx0IHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIKLSAgICAgICAgKyAiPGZhdWx0Y29kZT5zb2FwZW52OlNlcnZlcjwvZmF1bHRjb2RlPiIgKyAiPGZhdWx0c3RyaW5nPiIgKyBGQVVMVF9JTlBVVAotICAgICAgICArICI8L2ZhdWx0c3RyaW5nPiIgKyAiPC9zb2FwZW52OkZhdWx0PiI7Ci0gICAKLSAgICBwdWJsaWMgTG9naWNhbE1lc3NhZ2VDb250ZXh0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIGJhc2VkIEFQSXMgb24gdGhlIExvZ2ljYWxNZXNzYWdlIGludGVyZmFjZS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXlsb2FkQXNTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxtYyA9IGNyZWF0ZVNhbXBsZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlIG1zZyA9IGxtYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBMb2dpY2FsTWVzc2FnZSB3YXMgbnVsbCIsIG1zZyAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFNvdXJjZSBwYXlsb2FkID0gbXNnLmdldFBheWxvYWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKFNvdXJjZSkgd2FzIG51bGwiLCBwYXlsb2FkICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShwYXlsb2FkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIG51bGwiLCByZXN1bHRDb250ZW50ICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgY29udGVudCByZXR1cm5lZCB3YXMgaW5jb21wbGV0ZSwgdW5leHBlY3RlZCBlbGVtZW50IiwgcmVzdWx0Q29udGVudC5pbmRleE9mKCJlY2hvU3RyaW5nIikgPiAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIHdhcyBpbmNvbXBsZXRlLCB1bmV4cGVjdGVkIGNvbnRlbnQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoSU5QVVQpID4gLTEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgc2V0dGluZyBvZiB0aGUgcGF5bG9hZCBhbmQgbWFrZSBzdXJlIHdlIGRvbid0IGNhY2hlIGltcHJvcGVybHkuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kU2V0UGF5bG9hZEFzU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBjcmVhdGVTYW1wbGVDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgTG9naWNhbE1lc3NhZ2Ugd2FzIG51bGwiLCBtc2cgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBwYXlsb2FkIChTb3VyY2UpIHdhcyBudWxsIiwgcGF5bG9hZCAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXN1bHRDb250ZW50ID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCIsIHJlc3VsdENvbnRlbnQuaW5kZXhPZihJTlBVVCkgPiAwKTsKLQotICAgICAgICAvLyBOb3cgbWFuaXBsdWF0ZSB0aGUgY29udGVudCBhbmQgc2V0IGl0IGJhY2sgb24gdGhlIG1lc3NhZ2UuCi0gICAgICAgIGludCBzdGFydCA9IHJlc3VsdENvbnRlbnQuaW5kZXhPZihJTlBVVCk7Ci0gICAgICAgIGludCBlbmQgPSBzdGFydCArIElOUFVULmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5ld0lucHV0ID0gIm5ldyBjb250ZW50IGdvZXMgaGVyZSI7Ci0gICAgICAgIFN0cmluZyBuZXdDb250ZW50ID0gcmVzdWx0Q29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnQpICsgbmV3SW5wdXQgKyByZXN1bHRDb250ZW50LnN1YnN0cmluZyhlbmQpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdDb250ZW50LmdldEJ5dGVzKCkpOwotICAgICAgICBTdHJlYW1Tb3VyY2UgbmV3UGF5bG9hZCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7IAotICAgICAgICAKLSAgICAgICAgbXNnLnNldFBheWxvYWQobmV3UGF5bG9hZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBjb250ZW50IHRoYXQgd2UgYWRkZWQgCi0gICAgICAgIC8vIHdhcyBpbnN0ZXJ0ZWQgY29ycmVjdGx5LgotICAgICAgICBTb3VyY2UgcGF5bG9hZDIgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQyICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQyID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZDIpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudDIgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSB1cGRhdGVkIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgb2xkIGNvbnRlbnQgZm91bmQiLCByZXN1bHRDb250ZW50Mi5pbmRleE9mKElOUFVUKSA8IDApOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBpbmNvcnJlY3QsIG5ldyBjb250ZW50IG5vdCBmb3VuZCIsIHJlc3VsdENvbnRlbnQyLmluZGV4T2YobmV3SW5wdXQpID4gLTEpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IHRoZSBwYXlsb2FkIG11bHRpcGxlIHRpbWVzIGZyb20gdGhlIHNhbWUgTG9naWNhbE1lc3NhZ2UuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TXVsdGlwbGVQYXlsb2Fkc0FzU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBjcmVhdGVTYW1wbGVDb250ZXh0KCk7Ci0KLSAgICAgICAgTG9naWNhbE1lc3NhZ2UgbXNnID0gbG1jLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIExvZ2ljYWxNZXNzYWdlIHdhcyBudWxsIiwgbXNnICE9IG51bGwpOwotCi0gICAgICAgIGludCBsb29wQ291bnQgPSAzOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBdHRlbXB0IG51bWJlciAiICArIGkgKyAiIHRvIGdldCB0aGUgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQgIT0gbnVsbCk7Ci0KLQotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShwYXlsb2FkKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIGluIGxvb3AgIiArIGkgKyAiIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudCAhPSBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIGluIGxvb3AgIiArIGkgKyAiIHdhcyBpbmNvbXBsZXRlLCB1bmV4cGVjdGVkIGVsZW1lbnQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoImVjaG9TdHJpbmciKSA+IC0xKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIGluIGxvb3AgIiArIGkgKyAiIHdhcyBpbmNvbXBsZXRlLCB1bmV4cGVjdGVkIGNvbnRlbnQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoSU5QVVQpID4gLTEpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBzZXR0aW5nIG9mIHRoZSBwYXlsb2FkIHdoZW4gdGhlIG9yaWdpbmFsIGNvbnRlbnQgaXMgYSBmYXVsdC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbmRTZXRGYXVsdFBheWxvYWRBc1NvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG1jID0gY3JlYXRlU2FtcGxlRmF1bHRDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgTG9naWNhbE1lc3NhZ2Ugd2FzIG51bGwiLCBtc2cgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2UgcGF5bG9hZCA9IG1zZy5nZXRQYXlsb2FkKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSByZXR1cm5lZCBwYXlsb2FkIChTb3VyY2UpIHdhcyBudWxsIiwgcGF5bG9hZCAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXN1bHRDb250ZW50ID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCIsIHJlc3VsdENvbnRlbnQuaW5kZXhPZihGQVVMVF9JTlBVVCkgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgbm8gZmF1bHQgZm91bmQiLCByZXN1bHRDb250ZW50LmluZGV4T2YoIkZhdWx0IikgPiAwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyBtYW5pcGx1YXRlIHRoZSBjb250ZW50IGFuZCBzZXQgaXQgYmFjayBvbiB0aGUgbWVzc2FnZS4KLSAgICAgICAgaW50IHN0YXJ0ID0gcmVzdWx0Q29udGVudC5pbmRleE9mKEZBVUxUX0lOUFVUKTsKLSAgICAgICAgaW50IGVuZCA9IHN0YXJ0ICsgRkFVTFRfSU5QVVQubGVuZ3RoKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmV3RmF1bHRJbnB1dCA9ICJuZXcgZmF1bHQgY29udGVudCBnb2VzIGhlcmUiOwotICAgICAgICBTdHJpbmcgbmV3Q29udGVudCA9IHJlc3VsdENvbnRlbnQuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIG5ld0ZhdWx0SW5wdXQgKyByZXN1bHRDb250ZW50LnN1YnN0cmluZyhlbmQpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXdDb250ZW50LmdldEJ5dGVzKCkpOwotICAgICAgICBTdHJlYW1Tb3VyY2UgbmV3UGF5bG9hZCA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7IAotICAgICAgICAKLSAgICAgICAgbXNnLnNldFBheWxvYWQobmV3UGF5bG9hZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgcGF5bG9hZCB0byBtYWtlIHN1cmUgdGhlIG5ldyBjb250ZW50IHRoYXQgd2UgYWRkZWQgCi0gICAgICAgIC8vIHdhcyBpbnN0ZXJ0ZWQgY29ycmVjdGx5LgotICAgICAgICBTb3VyY2UgcGF5bG9hZDIgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQyICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQyID0gX2dldFN0cmluZ0Zyb21Tb3VyY2UocGF5bG9hZDIpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBudWxsIiwgcmVzdWx0Q29udGVudDIgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSB1cGRhdGVkIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgb2xkIGNvbnRlbnQgZm91bmQiLCByZXN1bHRDb250ZW50Mi5pbmRleE9mKEZBVUxUX0lOUFVUKSA8IDApOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb250ZW50IHJldHVybmVkIHdhcyBpbmNvcnJlY3QsIG5vIGZhdWx0IGZvdW5kIiwgcmVzdWx0Q29udGVudC5pbmRleE9mKCJGYXVsdCIpID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSB1cGRhdGVkIGNvbnRlbnQgcmV0dXJuZWQgd2FzIGluY29ycmVjdCwgbmV3IGNvbnRlbnQgbm90IGZvdW5kIiwgcmVzdWx0Q29udGVudDIuaW5kZXhPZihuZXdGYXVsdElucHV0KSA+IC0xKTsKLSAgICB9Ci0KLS8vIEZJWE1FOiBUZW1wb3JhcmlseSBjb21tZW50IG91dCB0ZXN0IGJlY2F1c2Ugb2YgYnVpbGQgYnJlYWsuICAgIAotLy8gICAgLyoqCi0vLyAgICAgKiBUZXN0IHRoZSBKQVhCIGJhc2VkIEFQSXMgb24gdGhlIExvZ2ljYWxNZXNzYWdlIGludGVyZmFjZS4KLS8vICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXlsb2FkQXNKQVhCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGxtYyA9IGNyZWF0ZVNhbXBsZUNvbnRleHQoKTsKLS8vICAgICAgICAgICAgICAgIAotLy8gICAgICAgIExvZ2ljYWxNZXNzYWdlIG1zZyA9IGxtYy5nZXRNZXNzYWdlKCk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIExvZ2ljYWxNZXNzYWdlIHdhcyBudWxsIiwgbXNnICE9IG51bGwpOwotLy8gICAgICAgIAotLy8gICAgICAgIEpBWEJDb250ZXh0IGpiYyA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0Iik7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgT2JqZWN0IG9iaiA9IG1zZy5nZXRQYXlsb2FkKGpiYyk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKE9iamVjdCkgd2FzIG51bGwiLCBvYmogIT0gbnVsbCk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJldHVybmVkIHBheWxvYWQgKE9iamVjdCkgd2FzIG9mIHRoZSB3cm9uZyB0eXBlOiAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBvYmouZ2V0Q2xhc3MoKS5lcXVhbHMoRWNob1N0cmluZy5jbGFzcykpOwotLy8gICAgICAgIAotLy8gICAgICAgIEVjaG9TdHJpbmcgZWNobyA9IChFY2hvU3RyaW5nKSBvYmo7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEVjaG9TdHJpbmcgb2JqZWN0IGhhZCBudWxsIGlucHV0IiwgZWNoby5nZXRJbnB1dCgpICE9IG51bGwpOwotLy8gICAgICAgIGFzc2VydFRydWUoIlRoZSBFY2hvU3RyaW5nIG9iamVjdCBoYWQgYmFkIGlucHV0OiAiICsgZWNoby5nZXRJbnB1dCgpLCBlY2hvLmdldElucHV0KCkuZXF1YWxzKElOUFVUKSk7Ci0vLyAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRNZXNzYWdlVG9GYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG1jID0gY3JlYXRlU2FtcGxlQ29udGV4dCgpOwotIAotICAgICAgICBMb2dpY2FsTWVzc2FnZSBtc2cgPSBsbWMuZ2V0TWVzc2FnZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgTG9naWNhbE1lc3NhZ2Ugd2FzIG51bGwiLCBtc2cgIT0gbnVsbCk7Ci0KLSAgICAgICAgU291cmNlIHBheWxvYWQgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmV0dXJuZWQgcGF5bG9hZCAoU291cmNlKSB3YXMgbnVsbCIsIHBheWxvYWQgIT0gbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHJlc3VsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShwYXlsb2FkKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGNvbnRlbnQgcmV0dXJuZWQgd2FzIG51bGwiLCByZXN1bHRDb250ZW50ICE9IG51bGwpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYW1wbGVTT0FQMTFGYXVsdFBheWxvYWQuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIFN0cmVhbVNvdXJjZSBmYXVsdFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoYmFpcyk7Ci0gICAgICAgIAotICAgICAgICBtc2cuc2V0UGF5bG9hZChmYXVsdFNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2UgbmV3RmF1bHRTb3VyY2UgPSBtc2cuZ2V0UGF5bG9hZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgbmV3IGZhdWx0IGNvbnRlbnQgcmV0dXJuZWQgd2FzIG51bGwiLCBmYXVsdFNvdXJjZSAhPSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuZXdGYXVsdENvbnRlbnQgPSBfZ2V0U3RyaW5nRnJvbVNvdXJjZShuZXdGYXVsdFNvdXJjZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBuZXcgZmF1bHQgY29udGVudCByZXR1cm5lZCB3YXMgaW52YWxpZCIsIG5ld0ZhdWx0Q29udGVudC5lcXVhbHMoc2FtcGxlU09BUDExRmF1bHRQYXlsb2FkKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTG9naWNhbE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVNhbXBsZUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IG9iakZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nIGVjaG8gPSBvYmpGYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsKLSAgICAgICAgZWNoby5zZXRJbnB1dChJTlBVVCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIG5lY2Vzc2FyeSBKQVhCQ29udGV4dAotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgidGVzdCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGJsb2NrQ3R4ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoamJjKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgQmxvY2sgCi0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0gKEpBWEJCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBCbG9jayBibG9jayA9IGJsb2NrRmFjdG9yeS5jcmVhdGVGcm9tKGVjaG8sIGJsb2NrQ3R4LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIG1zZy5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0TUVQQ29udGV4dChuZXcgTUVQQ29udGV4dChtYykpOwotICAgICAgICBtYy5zZXRNZXNzYWdlKG1zZyk7Ci0gICAgICAgIAotICAgICAgICBMb2dpY2FsTWVzc2FnZUNvbnRleHQgbG1jID0gTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZUxvZ2ljYWxNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbG1jOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBjcmVhdGVTYW1wbGVGYXVsdENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24oRkFVTFRfSU5QVVQpOyAgICAgICAgCi0gICAgICAgIFhNTEZhdWx0IGZhdWx0ID0gbmV3IFhNTEZhdWx0KFhNTEZhdWx0Q29kZS5TRU5ERVIsIHJlYXNvbik7Ci0gICAgICAgIG1zZy5zZXRYTUxGYXVsdChmYXVsdCk7Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRNRVBDb250ZXh0KG5ldyBNRVBDb250ZXh0KG1jKSk7Ci0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnKTsKLSAgICAgICAgCi0gICAgICAgIExvZ2ljYWxNZXNzYWdlQ29udGV4dCBsbWMgPSBNZXNzYWdlQ29udGV4dEZhY3RvcnkuY3JlYXRlTG9naWNhbE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsbWM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIF9nZXRTdHJpbmdGcm9tU291cmNlKFNvdXJjZSBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zKTsKLSAgICAgICAgCi0gICAgICAgIHRyYW5zLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKLSAgICAgICAgdHJhbnMudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbnRlbnQ7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvU09BUE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9oYW5kbGVyL2NvbnRleHQvU09BUE1lc3NhZ2VDb250ZXh0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxNzlmYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaGFuZGxlci9jb250ZXh0L1NPQVBNZXNzYWdlQ29udGV4dFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5oYW5kbGVyLmNvbnRleHQ7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb250ZXh0LmZhY3RvcnkuTWVzc2FnZUNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvcmUuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaGFuZGxlci5NRVBDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmhhbmRsZXIuU29hcE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuQmxvY2s7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5NZXNzYWdlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuUHJvdG9jb2w7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5KQVhCQmxvY2tGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsNCi1pbXBvcnQgdGVzdC5PYmplY3RGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7DQotDQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQ29udGV4dFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBJTlBVVF8xID0gInNhbXBsZSBpbnB1dCI7DQotCXByaXZhdGUgZmluYWwgU3RyaW5nIElOUFVUXzIgPSAic2FtcGxlIGlucHV0IHR3byI7DQotCQ0KLSAgICBwcml2YXRlIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShTdHJpbmcgaW5wdXQpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBvYmpGYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgZWNobyA9IG9iakZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOw0KLSAgICAgICAgZWNoby5zZXRJbnB1dChpbnB1dCk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgbmVjZXNzYXJ5IEpBWEJDb250ZXh0DQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSgidGVzdCIpOw0KLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBibG9ja0N0eCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KGpiYyk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgQmxvY2sgDQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSA9IChKQVhCQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIEJsb2NrIGJsb2NrID0gYmxvY2tGYWN0b3J5LmNyZWF0ZUZyb20oZWNobywgYmxvY2tDdHgsIG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICBtc2cuc2V0Qm9keUJsb2NrKGJsb2NrKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG1zZzsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTb2FwTWVzc2FnZUNvbnRleHQgY3JlYXRlU2FtcGxlQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgTWVzc2FnZSBtc2cgPSBjcmVhdGVNZXNzYWdlKElOUFVUXzEpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIG1jLnNldE1FUENvbnRleHQobmV3IE1FUENvbnRleHQobWMpKTsNCi0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb250ZXh0RmFjdG9yeS5jcmVhdGVTb2FwTWVzc2FnZUNvbnRleHQobWMpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXNTb2FwTWVzc2FnZU9iamVjdElEKCkgew0KLSAgICAJdHJ5IHsNCi0gICAgCQlTb2FwTWVzc2FnZUNvbnRleHQgc21jID0gY3JlYXRlU2FtcGxlQ29udGV4dCgpOw0KLSAgICAJCVNPQVBNZXNzYWdlIG0xID0gc21jLmdldE1lc3NhZ2UoKTsNCi0gICAgCQlTT0FQTWVzc2FnZSBtMiA9IHNtYy5nZXRNZXNzYWdlKCk7DQotICAgIAkJLy8gbm90IHVzaW5nIGFzc2VydEVxdWFscyBiZWNhdXNlIEkgd2FudCBvYmplY3QgaWQgZXF1YWxpdHkNCi0gICAgCQlhc3NlcnRUcnVlKCJyZXRyaWV2YWwgb2YgbWVzc2FnZSBmcm9tIFNvYXBNZXNzYWdlQ29udGV4dCB0d2ljZSBpbiBhIHJvdyBzaG91bGQgcmVzdWx0IGluIHNhbWUgb2JqZWN0IiwgbTEgPT0gbTIpOw0KLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgCQlhc3NlcnROdWxsKCJzaG91bGQgbm90IGdldCBhbiBleGNlcHRpb24gaW4gdGhpcyB0ZXN0IiwgZSk7DQotICAgIAl9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwTWVzc2FnZUNhY2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2UgbXNnMSA9IGNyZWF0ZU1lc3NhZ2UoSU5QVVRfMSk7DQotICAgICAgICBNZXNzYWdlIG1zZzIgPSBjcmVhdGVNZXNzYWdlKElOUFVUXzIpOw0KLSAgICAgICAgDQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgbWMuc2V0TWVzc2FnZShtc2cxKTsNCi0gICAgICAgIFNvYXBNZXNzYWdlQ29udGV4dCBzb2FwQ3R4ID0gTWVzc2FnZUNvbnRleHRGYWN0b3J5LmNyZWF0ZVNvYXBNZXNzYWdlQ29udGV4dChtYyk7DQotICAgICAgICANCi0gICAgICAgIFNPQVBNZXNzYWdlIG0xID0gc29hcEN0eC5nZXRNZXNzYWdlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtMiA9IHNvYXBDdHguZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJyZXRyaWV2YWwgb2YgbWVzc2FnZSBmcm9tIFNvYXBNZXNzYWdlQ29udGV4dCB0d2ljZSBpbiBhIHJvdyBzaG91bGQgcmVzdWx0IGluIHNhbWUgb2JqZWN0IiwgbTEgPT0gbTIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBsZXQncyBjaGFuZ2UgdW5kZXJseWluZyBtZXNzYWdlIGFzIA0KLSAgICAgICAgLy8gSGFuZGxlckNoYWluUHJvY2Vzc29yLmNvbnZlcnRUb0ZhdWx0TWVzc2FnZSgpIGRvZXMNCi0gICAgICAgIG1jLnNldE1lc3NhZ2UobXNnMik7DQotICAgICAgICANCi0gICAgICAgIFNPQVBNZXNzYWdlIG0zID0gc29hcEN0eC5nZXRNZXNzYWdlKCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBtNCA9IHNvYXBDdHguZ2V0TWVzc2FnZSgpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJyZXRyaWV2YWwgb2YgbWVzc2FnZSBmcm9tIFNvYXBNZXNzYWdlQ29udGV4dCB0d2ljZSBpbiBhIHJvdyBzaG91bGQgcmVzdWx0IGluIHNhbWUgb2JqZWN0IiwgbTMgPT0gbTQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTb2FwIG1lc3NhZ2VzIGZyb20gYmVmb3JlIGFuZCBhZnRlciBtdXN0IGJlIGRpZmZlcmVudCENCi0gICAgICAgIGFzc2VydFRydWUoInJldHJpZXZhbCBvZiBtZXNzYWdlIGZyb20gU29hcE1lc3NhZ2VDb250ZXh0IGFmdGVyIG1lc3NhZ2UgaGFzIGNoYW5nZWQgaW4gdGhlIHVuZGVybHlpbmcgY29udGV4dCIsIG0xICE9IG0zKTsgIA0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL0pheHdzTWVzc2FnZUJ1bmRsZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9KYXh3c01lc3NhZ2VCdW5kbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjYzODMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL0pheHdzTWVzc2FnZUJ1bmRsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBiYXNpYyBmdW5jdGlvbiBvZiB0aGUgTWVzc2FnZSBCdW5kbGUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXh3c01lc3NhZ2VCdW5kbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgSmF4d3NNZXNzYWdlQnVuZGxlVGVzdHMoKSB7IAotICAgICAgICBzdXBlcigpOwotICAgIH0KLSAgIAotICAgIHB1YmxpYyBKYXh3c01lc3NhZ2VCdW5kbGVUZXN0cyhTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7ICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEB0ZXN0U3RyYXRlZ3k6IFRlc3QgdGhhdCB0aGUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICogaXMgaW5zdGFsbGVkIGJ5IG9idGFpbmluZyBhIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9ICJUaGlzIHN0cmluZyBpcyBhIHRlc3Qgc3RyaW5nIDAxLiI7Ci0gICAgICAgIFN0cmluZyB0ZW1wU3RyID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgidGVzdDAxIik7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc3RyLmVxdWFscyh0ZW1wU3RyKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNDg0Y2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDEgew0KLQ0KLQlAUmVzb3VyY2UNCi0JcHVibGljIFdlYlNlcnZpY2VDb250ZXh0IGN0eCA9IG51bGw7DQotCQ0KLQlwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDEoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0JDQotCUBQb3N0Q29uc3RydWN0DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0JCS8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFBvc3RDb25zdHJ1Y3QgdG8gSW5pdGlhbGl6ZSIpOw0KLQl9DQotCQ0KLQlAUHJlRGVzdHJveQ0KLQlwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotCQkvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0JCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5MjZhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMnsNCi0NCi0JDQotCXB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLQkNCi0JcHVibGljIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwyKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotDQotCUBQb3N0Q29uc3RydWN0DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0JCS8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFBvc3RDb25zdHJ1Y3QgdG8gSW5pdGlhbGl6ZSIpOw0KLQl9DQotCQ0KLQlAUHJlRGVzdHJveQ0KLQlwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotCQkvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0JCQ0KLQl9DQotCUBSZXNvdXJjZQ0KLQlwdWJsaWMgdm9pZCBzZXRDdHgoV2ViU2VydmljZUNvbnRleHQgY3R4KSB7DQotCQl0aGlzLmN0eCA9IGN0eDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDVkZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbmplY3Rpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDMgew0KLQ0KLQlAUmVzb3VyY2UNCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLQkNCi0JcHVibGljIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzKCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotCQ0KLQlAUG9zdENvbnN0cnVjdA0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7DQotCQkvL0NhbGxlZCBhZnRlciByZXNvdXJjZSBpbmplY3Rpb24gYW5kIGJlZm9yZSBhIG1ldGhvZCBpcyBjYWxsZWQuDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQb3N0Q29uc3RydWN0IHRvIEluaXRpYWxpemUiKTsNCi0JfQ0KLQkNCi0JQFByZURlc3Ryb3kNCi0JcHVibGljIHZvaWQgZGlzdHJ1Y3Rvcigpew0KLQkJLy9DYWxsZWQgYmVmb3JlIHRoZSBzY29wZSBvZiByZXF1ZXN0IG9yIHNlc3Npb24gb3IgYXBwbGljYXRpb24gZW5kcy4NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFByZURlc3Ryb3kgIik7DQotCQkNCi0JfQ0KLQlwdWJsaWMgV2ViU2VydmljZUNvbnRleHQgZ2V0Q3R4KCl7DQotCQlyZXR1cm4gY3R4Ow0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjNTdhNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdEltcGw0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmluamVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7DQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsNCB7DQotDQotCQ0KLQlwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGN0eCA9IG51bGw7DQotCQ0KLQlwdWJsaWMgUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQoKSB7DQotCQlzdXBlcigpOw0KLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViDQotCX0NCi0JDQotCUBQb3N0Q29uc3RydWN0DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsNCi0JCS8vQ2FsbGVkIGFmdGVyIHJlc291cmNlIGluamVjdGlvbiBhbmQgYmVmb3JlIGEgbWV0aG9kIGlzIGNhbGxlZC4NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFBvc3RDb25zdHJ1Y3QgdG8gSW5pdGlhbGl6ZSIpOw0KLQl9DQotCQ0KLQlAUHJlRGVzdHJveQ0KLQlwdWJsaWMgdm9pZCBkaXN0cnVjdG9yKCl7DQotCQkvL0NhbGxlZCBiZWZvcmUgdGhlIHNjb3BlIG9mIHJlcXVlc3Qgb3Igc2Vzc2lvbiBvciBhcHBsaWNhdGlvbiBlbmRzLg0KLQ0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIkNhbGxpbmcgUHJlRGVzdHJveSAiKTsNCi0JCQ0KLQl9DQotCUBSZXNvdXJjZQ0KLQlwcml2YXRlIHZvaWQgc2V0Q3R4KFdlYlNlcnZpY2VDb250ZXh0IGN0eCkgew0KLQkJdGhpcy5jdHggPSBjdHg7DQotCX0NCi0JDQotCXB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBnZXRDdHgoKXsNCi0JCXJldHVybiBjdHg7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsNS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2luamVjdGlvbi9SZXNvdXJjZUluamVjdGlvblRlc3RJbXBsNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhhYTQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7DQotDQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsNCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95Ow0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNvbnRleHQ7DQotDQotDQotcHVibGljIGNsYXNzIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1IHsNCi0NCi0JQFJlc291cmNlKHR5cGU9V2ViU2VydmljZUNvbnRleHQuY2xhc3MpDQotCXB1YmxpYyBXZWJTZXJ2aWNlQ29udGV4dCBjdHggPSBudWxsOw0KLQkNCi0JcHVibGljIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1KCkgew0KLQkJc3VwZXIoKTsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1Yg0KLQl9DQotCQ0KLQlAUG9zdENvbnN0cnVjdA0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCl7DQotCQkvL0NhbGxlZCBhZnRlciByZXNvdXJjZSBpbmplY3Rpb24gYW5kIGJlZm9yZSBhIG1ldGhvZCBpcyBjYWxsZWQuDQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiQ2FsbGluZyBQb3N0Q29uc3RydWN0IHRvIEluaXRpYWxpemUiKTsNCi0JfQ0KLQkNCi0JQFByZURlc3Ryb3kNCi0JcHVibGljIHZvaWQgZGlzdHJ1Y3Rvcigpew0KLQkJLy9DYWxsZWQgYmVmb3JlIHRoZSBzY29wZSBvZiByZXF1ZXN0IG9yIHNlc3Npb24gb3IgYXBwbGljYXRpb24gZW5kcy4NCi0NCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJDYWxsaW5nIFByZURlc3Ryb3kgIik7DQotCQkNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW5qZWN0aW9uL1Jlc291cmNlSW5qZWN0aW9uVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdiZGJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbmplY3Rpb24vUmVzb3VyY2VJbmplY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29udGV4dC5XZWJTZXJ2aWNlQ29udGV4dEltcGw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmluamVjdGlvbi5SZXNvdXJjZUluamVjdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5lbmRwb2ludC5pbmplY3Rpb24uZmFjdG9yeS5SZXNvdXJjZUluamVjdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUluamVjdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBTdHJpbmcgYXhpc0VuZHBvaW50ID0gImh0dHA6Ly9sb2NhbGhvc3Q6NjA2MC9heGlzMi9zZXJ2aWNlcy9SZXNvdXJjZUluamVjdGlvblNlcnZpY2UuUmVzb3VyY2VJbmplY3Rpb25Qb3J0VHlwZUltcGxQb3J0IjsNCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgcmVzb3VyY2UgPSBuZXcgV2ViU2VydmljZUNvbnRleHRJbXBsKCk7DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25PbkZpZWxkKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxIHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDEpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuY3R4KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzb3VyY2UgSW5qZWN0ZWQgb24gRmllbGQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25Pbk1ldGhvZCgpew0KLSAgICAgICAgT2JqZWN0IHNlcnZpY2VJbnN0YW5jZSA9IG5ldyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMigpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsNCi0gICAgICAgIHRyeXsNCi0gICAgICAgICAgICBSZXNvdXJjZUluamVjdG9yIGluamVjdG9yID0gUmVzb3VyY2VJbmplY3Rpb25GYWN0b3J5LmNyZWF0ZVJlc291cmNlSW5qZWN0b3IoV2ViU2VydmljZUNvbnRleHQuY2xhc3MpOw0KLSAgICAgICAgICAgIGluamVjdG9yLmluamVjdChyZXNvdXJjZSwgc2VydmljZUluc3RhbmNlKTsNCi0gICAgICAgICAgICBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMiBzZXJ2aWNlSW1wbCA9KFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwyKXNlcnZpY2VJbnN0YW5jZTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VJbXBsLmN0eCk7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlJlc291cmNlIEluamVjdGVkIG9uIE1ldGhvZCIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbk9uUHJpdmF0ZUZpZWxkKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzKCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwzIHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDMpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuZ2V0Q3R4KCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNvdXJjZSBJbmplY3RlZCBvbiBQcml2YXRlIEZpZWxkIik7DQotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOw0KLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgICAgIGZhaWwoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT25Qcm92YXRlTWV0aG9kKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw0KCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw0IHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDQpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuZ2V0Q3R4KCkpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJSZXNvdXJjZSBJbmplY3RlZCB1c2luZyBwcml2YXRlIE1ldGhvZCIpOw0KLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgICAgICBmYWlsKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdFR5cGVkUmVzb3VyY2VJbmplY3Rpb25PbkZpZWxkKCl7DQotICAgICAgICBPYmplY3Qgc2VydmljZUluc3RhbmNlID0gbmV3IFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1KCk7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOw0KLSAgICAgICAgdHJ5ew0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0b3IgaW5qZWN0b3IgPSBSZXNvdXJjZUluamVjdGlvbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VJbmplY3RvcihXZWJTZXJ2aWNlQ29udGV4dC5jbGFzcyk7DQotICAgICAgICAgICAgaW5qZWN0b3IuaW5qZWN0KHJlc291cmNlLCBzZXJ2aWNlSW5zdGFuY2UpOw0KLSAgICAgICAgICAgIFJlc291cmNlSW5qZWN0aW9uVGVzdEltcGw1IHNlcnZpY2VJbXBsID0oUmVzb3VyY2VJbmplY3Rpb25UZXN0SW1wbDUpc2VydmljZUluc3RhbmNlOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZUltcGwuY3R4KTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUmVzb3VyY2UgSW5qZWN0ZWQgb24gRmllbGQiKTsNCi0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7DQotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL21mcXVvdGUvU3RvY2tRdW90ZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZDEwZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5qYXhiLm1mcXVvdGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJTdG9ja1F1b3RlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QiLCB3c2RsTG9jYXRpb24gPSAiU3RvY2tRdW90ZS53c2RsIikKLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlCi0gICAgZXh0ZW5kcyBTZXJ2aWNlCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgU1RPQ0tRVU9URV9XU0RMX0xPQ0FUSU9OOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOi9DOi90ZW1wL1N0b2NrUXVvdGUud3NkbCIpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBTVE9DS1FVT1RFX1dTRExfTE9DQVRJT04gPSB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0b2NrUXVvdGUoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0b2NrUXVvdGUoKSB7Ci0gICAgICAgIHN1cGVyKFNUT0NLUVVPVEVfV1NETF9MT0NBVElPTiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0IiwgIlN0b2NrUXVvdGUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIFN0b2NrUXVvdGVJRgotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlN0b2NrUXVvdGVQb3J0IikKLSAgICBwdWJsaWMgU3RvY2tRdW90ZUlGIGdldFN0b2NrUXVvdGVQb3J0KCkgewotICAgICAgICByZXR1cm4gKFN0b2NrUXVvdGVJRilzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdCIsICJTdG9ja1F1b3RlUG9ydCIpLCBTdG9ja1F1b3RlSUYuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlSUYuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL21mcXVvdGUvU3RvY2tRdW90ZUlGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOGQyMzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvbWZxdW90ZS9TdG9ja1F1b3RlSUYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmpheGIubWZxdW90ZTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLgotICogSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzCi0gKiBHZW5lcmF0ZWQgc291cmNlIHZlcnNpb246IDIuMAotICogCi0gKi8KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiU3RvY2tRdW90ZUlGIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QiKQotcHVibGljIGludGVyZmFjZSBTdG9ja1F1b3RlSUYgewotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gIDEwSG9sZGluZ3MKLSAgICAgKiBAcGFyYW0gZnVuZAotICAgICAqIEBwYXJhbSBuYXYKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlL2dldFByaWNlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicHJpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL3N0b2NrMS50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zdG9jazEuR2V0UHJpY2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vc3RvY2sxLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMS5TdG9ja1ByaWNlIikKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByaWNlKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJmdW5kIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgIFN0cmluZyBmdW5kLAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJfMTBob2xkaW5ncyIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgXzEwSG9sZGluZ3MsCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm5hdiIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICBTdHJpbmcgbmF2KTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvc3RvY2txdW90ZS9TdG9ja1F1b3RlLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkyMTg3Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmpheGIuc3RvY2txdW90ZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4KLSAqIEpBWC1XUyBSSSAyLjBfMDEtYjE1LWZjcwotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAKLSAqIAotICovCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIlN0b2NrUXVvdGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdCIsIHdzZGxMb2NhdGlvbiA9ICJTdG9ja1F1b3RlLndzZGwiKQotcHVibGljIGNsYXNzIFN0b2NrUXVvdGUKLSAgICBleHRlbmRzIFNlcnZpY2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBTVE9DS1FVT1RFX1dTRExfTE9DQVRJT047Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QvU3RvY2tRdW90ZS53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIFNUT0NLUVVPVEVfV1NETF9MT0NBVElPTiA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RvY2tRdW90ZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RvY2tRdW90ZSgpIHsKLSAgICAgICAgc3VwZXIoU1RPQ0tRVU9URV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Rlc3QiLCAiU3RvY2tRdW90ZSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgU3RvY2tRdW90ZUlGCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiU3RvY2tRdW90ZVBvcnQiKQotICAgIHB1YmxpYyBTdG9ja1F1b3RlSUYgZ2V0U3RvY2tRdW90ZVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoU3RvY2tRdW90ZUlGKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy90ZXN0IiwgIlN0b2NrUXVvdGVQb3J0IiksIFN0b2NrUXVvdGVJRi5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGVJRi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2pheGIvc3RvY2txdW90ZS9TdG9ja1F1b3RlSUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxNmVmYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi9zdG9ja3F1b3RlL1N0b2NrUXVvdGVJRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuamF4Yi5zdG9ja3F1b3RlOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuCi0gKiBKQVgtV1MgUkkgMi4wXzAxLWIxNS1mY3MKLSAqIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wCi0gKiAKLSAqLwotQFdlYlNlcnZpY2UobmFtZSA9ICJTdG9ja1F1b3RlSUYiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdGVzdCIpCi1wdWJsaWMgaW50ZXJmYWNlIFN0b2NrUXVvdGVJRiB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBzeW1ib2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlL2dldFByaWNlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicHJpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gInVybjovL3N0b2NrMi50ZXN0Lm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5zdG9jazIuR2V0UHJpY2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImdldFByaWNlUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAidXJuOi8vc3RvY2syLnRlc3Qub3JnIiwgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMi5TdG9ja1ByaWNlIikKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByaWNlKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJzeW1ib2wiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICAgICAgU3RyaW5nIHN5bWJvbCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL3dyYXBwZXIvV3JhcHBlclRvb2xUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvamF4Yi93cmFwcGVyL1dyYXBwZXJUb29sVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFlYzY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9qYXhiL3dyYXBwZXIvV3JhcHBlclRvb2xUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmpheGIud3JhcHBlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndyYXBwZXIuSkFYQldyYXBwZXJUb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsLkpBWEJXcmFwcGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3JhcHBlci5pbXBsLkpBWEJXcmFwcGVyVG9vbEltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgV3JhcHBlclRvb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwU3RvY2tRdW90ZSgpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlciA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXhiQ2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMi5HZXRQcmljZSI7Ci0gICAgICAgICAgICBDbGFzcyBqYXhiQ2xhc3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGlsZE5hbWUgPSAic3ltYm9sIjsKLSAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKGNoaWxkTmFtZSk7Ci0gICAgICAgICAgICBTdHJpbmcgc3ltYm9sT2JqID0gbmV3IFN0cmluZygiSUJNIik7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNoaWxkT2JqZWN0cz0gbmV3IFdlYWtIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgY2hpbGRPYmplY3RzLnB1dChjaGlsZE5hbWUsIHN5bWJvbE9iaik7Ci0gICAgICAgICAgICBPYmplY3QgamF4Yk9iamVjdCA9IHdyYXBwZXIud3JhcChqYXhiQ2xhc3MsIGNoaWxkTmFtZXMsIGNoaWxkT2JqZWN0cyk7Ci0gICAgICAgICAgICBvcmcudGVzdC5zdG9jazIuR2V0UHJpY2UgZ2V0UHJpY2UgPSAob3JnLnRlc3Quc3RvY2syLkdldFByaWNlKWpheGJPYmplY3Q7Ci0KLSAgICAgICAgfWNhdGNoKEpBWEJXcmFwcGVyRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfWNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVud3JhcFN0b2NrUXVvdGUoKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgSkFYQldyYXBwZXJUb29sIHdyYXBwZXIgPSBuZXcgSkFYQldyYXBwZXJUb29sSW1wbCgpOwotICAgICAgICAgICAgb3JnLnRlc3Quc3RvY2syLkdldFByaWNlIHByaWNlID0gbmV3IG9yZy50ZXN0LnN0b2NrMi5HZXRQcmljZSgpOwotICAgICAgICAgICAgcHJpY2Uuc2V0U3ltYm9sKCJJQk0iKTsKLQotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gY2hpbGROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgU3RyaW5nIGNoaWxkTmFtZSA9ICJzeW1ib2wiOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQoY2hpbGROYW1lKTsKLQotICAgICAgICAgICAgT2JqZWN0W10gamF4Yk9iamVjdHMgPSB3cmFwcGVyLnVuV3JhcChwcmljZSwgY2hpbGROYW1lcyk7Ci0KLSAgICAgICAgfWNhdGNoKEpBWEJXcmFwcGVyRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwTUZRdW90ZSgpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlciA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBqYXhiQ2xhc3NOYW1lID0gIm9yZy50ZXN0LnN0b2NrMS5HZXRQcmljZSI7Ci0gICAgICAgICAgICBDbGFzcyBqYXhiQ2xhc3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgIGpheGJDbGFzcyA9IENsYXNzLmZvck5hbWUoamF4YkNsYXNzTmFtZSwgZmFsc2UsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGNoaWxkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIFN0cmluZyBmdW5kID0iZnVuZCI7Ci0gICAgICAgICAgICBTdHJpbmcgZnVuZE5hbWUgPSBuZXcgU3RyaW5nKCJQUkdGWCIpOwotICAgICAgICAgICAgU3RyaW5nIGhvbGRpbmcgPSAiaG9sZGluZ3MuIjsKLSAgICAgICAgICAgIFN0cmluZyB0b3BIb2xkaW5nID0gbmV3IFN0cmluZygiR0UiKTsKLSAgICAgICAgICAgIFN0cmluZyBuYXYgPSJuYXYiOwotICAgICAgICAgICAgU3RyaW5nIG5hdkluTWlsbGlvbiA9IG5ldyBTdHJpbmcoIjcwMCIpOwotCi0gICAgICAgICAgICBjaGlsZE5hbWVzLmFkZChmdW5kKTsKLSAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKGhvbGRpbmcpOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQobmF2KTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjaGlsZE9iamVjdHM9IG5ldyBXZWFrSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICAgICAgY2hpbGRPYmplY3RzLnB1dChmdW5kLCBmdW5kTmFtZSk7Ci0gICAgICAgICAgICBjaGlsZE9iamVjdHMucHV0KGhvbGRpbmcsIHRvcEhvbGRpbmcpOwotICAgICAgICAgICAgY2hpbGRPYmplY3RzLnB1dChuYXYsIG5hdkluTWlsbGlvbik7Ci0KLSAgICAgICAgICAgIE9iamVjdCBqYXhiT2JqZWN0ID0gd3JhcHBlci53cmFwKGpheGJDbGFzcywgY2hpbGROYW1lcywgY2hpbGRPYmplY3RzKTsKLSAgICAgICAgICAgIG9yZy50ZXN0LnN0b2NrMS5HZXRQcmljZSBnZXRQcmljZSA9IChvcmcudGVzdC5zdG9jazEuR2V0UHJpY2UpamF4Yk9iamVjdDsKLQotICAgICAgICB9Y2F0Y2goSkFYQldyYXBwZXJFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Y2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW53cmFwTUZRdW90ZSgpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBKQVhCV3JhcHBlclRvb2wgd3JhcHBlciA9IG5ldyBKQVhCV3JhcHBlclRvb2xJbXBsKCk7Ci0gICAgICAgICAgICBvcmcudGVzdC5zdG9jazEuR2V0UHJpY2UgcHJpY2UgPSBuZXcgb3JnLnRlc3Quc3RvY2sxLkdldFByaWNlKCk7Ci0gICAgICAgICAgICBwcmljZS5zZXRGdW5kKCJQUkdGWCIpOwotICAgICAgICAgICAgcHJpY2Uuc2V0SG9sZGluZ3MoIkdFIik7Ci0gICAgICAgICAgICBwcmljZS5zZXROYXYoIjcwMCIpOwotCi0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjaGlsZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZnVuZCA9ImZ1bmQiOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQoZnVuZCk7Ci0gICAgICAgICAgICBTdHJpbmcgaG9sZGluZyA9ICJob2xkaW5ncy4iOwotICAgICAgICAgICAgY2hpbGROYW1lcy5hZGQoaG9sZGluZyk7Ci0gICAgICAgICAgICBTdHJpbmcgbmF2ID0ibmF2IjsKLSAgICAgICAgICAgIGNoaWxkTmFtZXMuYWRkKG5hdik7Ci0KLSAgICAgICAgICAgIE9iamVjdFtdIGpheGJPYmplY3RzID0gd3JhcHBlci51bldyYXAocHJpY2UsIGNoaWxkTmFtZXMpOwotICAgICAgICB9Y2F0Y2goSkFYQldyYXBwZXJFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2xpZmVjeWNsZS9FbmRwb2ludExpZmVjeWNsZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyZmQ2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbGlmZWN5Y2xlL0VuZHBvaW50TGlmZWN5Y2xlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubGlmZWN5Y2xlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW5qZWN0aW9uLlJlc291cmNlSW5qZWN0aW9uVGVzdEltcGwxOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmVuZHBvaW50LmxpZmVjeWNsZS5FbmRwb2ludExpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuZW5kcG9pbnQubGlmZWN5Y2xlLmZhY3RvcnkuRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLS8qKgotICogVW5pdCBUZXN0cyBmb3IgbGlmZWN5Y2xlIGNyZWF0b2luCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRMaWZlY3ljbGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBPYmplY3QgZW5kcG9pbnRJbnN0YW5jZSA9IG5ldyBSZXNvdXJjZUluamVjdGlvblRlc3RJbXBsMSgpOwotICAgIE9iamVjdCBiYWRPYmplY3QgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmcwCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50TGlmZWN5Y2xlVGVzdHMoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Q29uc3RydWN0KCl7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSBlbG1mID0gKEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVsbWYpOwotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGVsbSA9IGVsbWYuY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKGVuZHBvaW50SW5zdGFuY2UpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG1mKTsKLSAgICAgICAgICAgIGVsbS5pbnZva2VQb3N0Q29uc3RydWN0KCk7Ci0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVEZXN0cm95KCl7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIlRlc3QgOiAiICsgZ2V0TmFtZSgpKTsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSBlbG1mID0gKEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkpRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVsbWYpOwotICAgICAgICAgICAgRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyIGVsbSA9IGVsbWYuY3JlYXRlRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyKGVuZHBvaW50SW5zdGFuY2UpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG0pOwotICAgICAgICAgICAgZWxtLmludm9rZVByZURlc3Ryb3koKTsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZFBvc3RDb25zdHJ1Y3QoKXsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiVGVzdCA6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5IGVsbWYgPSAoRW5kcG9pbnRMaWZlY3ljbGVNYW5hZ2VyRmFjdG9yeSlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZWxtZik7Ci0gICAgICAgICAgICBFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIgZWxtID0gZWxtZi5jcmVhdGVFbmRwb2ludExpZmVjeWNsZU1hbmFnZXIoYmFkT2JqZWN0KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZWxtZik7Ci0gICAgICAgICAgICBlbG0uaW52b2tlUG9zdENvbnN0cnVjdCgpOwotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUHJlRGVzdHJveSgpewotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJUZXN0IDogIiArIGdldE5hbWUoKSk7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkgZWxtZiA9IChFbmRwb2ludExpZmVjeWNsZU1hbmFnZXJGYWN0b3J5KUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG1mKTsKLSAgICAgICAgICAgIEVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBlbG0gPSBlbG1mLmNyZWF0ZUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlcihiYWRPYmplY3QpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbG0pOwotICAgICAgICAgICAgZWxtLmludm9rZVByZURlc3Ryb3koKTsKLSAgICAgICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvQmxvY2tUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvQmxvY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRiYjQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0Jsb2NrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRFNDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXNvdXJjZS5qYXhiLkpBWEJEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuT01CbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuU291cmNlQmxvY2tGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UudXRpbC5SZWFkZXIyV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnkuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsKLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLnV0aWwuSkFYQlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi0vKioKLSAqIEJsb2NrVGVzdHMKLSAqIFRlc3RzIHRvIGNyZWF0ZSBhbmQgdmFsaWRhdGUgYmxvY2tzLgotICogVGhlc2UgYXJlIG5vdCBjbGllbnQvc2VydmVyIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8vIFN0cmluZyB0ZXN0IHZhcmlhYmxlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0KLSAgICAgICAgIjxwcmU6YSB4bWxuczpwcmU9XCJ1cm46Ly9zYW1wbGVcIj4iICsKLSAgICAgICAgIjxiPkhlbGxvPC9iPiIgKwotICAgICAgICAiPGM+V29ybGQ8L2M+IiArCi0gICAgICAgICI8L3ByZTphPiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgc2FtcGxlUU5hbWUgPSBuZXcgUU5hbWUoInVybjovL3NhbXBsZSIsICJhIik7Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQotCi0gICAgcHVibGljIEJsb2NrVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJsb2NrVGVzdHMoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nT3V0ZmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9IChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgdXNpbmcgdGhlIHNhbXBsZSBzdHJpbmcgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFN0cmluZz4gY2xpZW50Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNhbXBsZVRleHQsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZAotICAgICAqIHNpbXVsYXRlIGEgZGlmZmVyZW50IERpc3BhdGNoPFN0cmluZz4gZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ091dGZsb3cyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U3RyaW5nPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oc2FtcGxlVGV4dCwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gV2UgZGlkbid0IHBhc3MgaW4gYSBxbmFtZSwgc28gdGhlIGZvbGxvd2luZyBzaG91bGQgcmV0dXJuIGZhbHNlCi0gICAgICAgIGFzc2VydFRydWUoIWJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgc2FtcGxlUU5hbWUgKyAiIGJ1dCBmb3VuZDogIiArIHFOYW1lLCBzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIGEgWE1MU3RyZWFtUmVhZGVyIHdpbGwgYmUgcmVxdWVzdGVkLi4udG8gZ28gdG8gT00uICAgQXQgdGhpcyBwb2ludCB0aGUKLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQKLSAgICAgKiBzaW11bGF0ZSBhIGRpZmZlcmVudCBTdHJpbmcgcGFyYW1ldGVyIGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdPdXRmbG93MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9IChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgdXNpbmcgdGhlIHNhbXBsZSBzdHJpbmcgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIFN0cmluZyBwYXJhbWV0ZXIgb24gdGhlIGNsaWVudC4KLSAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoZSBRTmFtZSBwcmlvciB0byBjcmVhdGluZyB0aGUgQmxvY2suLi5zbyBsZXQncyBwYXNzIGl0IGluLgotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzYW1wbGVUZXh0LCBudWxsLCBzYW1wbGVRTmFtZSk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBRTmFtZSBpcyBjb3JyZWN0LgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIG5vcm1hbCBEaXNwYXRjaDxTdHJpbmc+IGlucHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIFhNTFN0cmVhbVJlYWRlciAocHJvYmFibHkgZnJvbSBPTSkKLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gIFdlIHdpbGwgc2ltdWxhdGUgdGhpcyB3aXRoIGluZmxvdy4KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIGZyb20gdGhlIGluZmxvdy4gIAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShpbmZsb3csIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgdGhlIHByb3h5IGNvZGUgd2lsbCBhc2sgZm9yIHRoZSBidXNpbmVzcyBvYmplY3QgKFN0cmluZykuCi0gICAgICAgIE9iamVjdCBibyA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvLnRvU3RyaW5nKCkpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBYTUxTdHJpbmcgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBEaXNwYXRjaDxTdHJpbmc+IGluZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0luZmxvdzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIFhNTFN0cmVhbVJlYWRlciAocHJvYmFibHkgZnJvbSBPTSkKLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gIFdlIHdpbGwgc2ltdWxhdGUgdGhpcyB3aXRoIGluZmxvdy4KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIGZyb20gdGhlIGluZmxvdy4gIAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShpbmZsb3csIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB3ZSBuZWVkIHRvIGdldCB0aGUgUU5hbWUgdG8gZmluZCB0aGUgb3BlcmF0aW9uIG5hbWUuCi0gICAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBhbiB1bmRlcmx5aW5nIHBhcnNlCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0cmluZyk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhiby50b1N0cmluZygpKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgU3RyaW5nICBpbmZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3czKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICBBc3N1bWUgdGhhdCB3ZSBrbm93IHRoZSBRTmFtZSBhbHJlYWR5Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgbnVsbCwgc2FtcGxlUU5hbWUpOwotCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB3ZSBuZWVkIHRvIGdldCB0aGUgUU5hbWUgdG8gZmluZCB0aGUgb3BlcmF0aW9uIG5hbWUuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0cmluZyk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhiby50b1N0cmluZygpKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gSkFYQiBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8SkFYQj4gZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgCi0gICAgICAgIGpheGIuc2V0SW5wdXQoIkhlbGxvIFdvcmxkIik7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KEVjaG9TdHJpbmcuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgSkFYQkludHJvc3BlY3RvciBqYmkgPSBKQVhCVXRpbHMuZ2V0SkFYQkludHJvc3BlY3Rvcihjb250ZXh0LmdldEpBWEJDb250ZXh0KCkpOwotICAgICAgICBRTmFtZSBleHBlY3RlZFFOYW1lID0gamJpLmdldEVsZW1lbnROYW1lKGpheGIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxKQVhCPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oamF4YiwgY29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gSkFYQiBvYmplY3RzIHNldCB0aGUgcW5hbWUgZnJvbSB0aGVpciBpbnRlcm5hbCBkYXRhCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNRTmFtZUF2YWlsYWJsZSgpKTsKLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFFOYW1lIChwZXJoYXBzIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gYW5kIAotICAgICAgICAvLyBkZXRlcm1pbmUgaWYgaGFuZGxlcnMgYXJlIGluc3RhbGxlZCkuICAgVGhpcyBpcyBub3QgdmVyeSBwZXJmb21hbnQgc2luY2UgCi0gICAgICAgIC8vIGl0IGNhdXNlcyBhbiB1bmRlcmx5aW5nIHBhcnNlIG9mIHRoZSBTdHJpbmcuLi5idXQgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFFOYW1lICsgIiBidXQgZm91bmQ6ICIgKyBxTmFtZSwgZXhwZWN0ZWRRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIGEgWE1MU3RyZWFtUmVhZGVyIHdpbGwgYmUgcmVxdWVzdGVkLi4udG8gZ28gdG8gT00uICAgQXQgdGhpcyBwb2ludCB0aGUKLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiSGVsbG8gV29ybGQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiZWNob1N0cmluZyIpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBKQVhCIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQgRGlzcGF0Y2g8SkFYQj4gZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJPdXRmbG93MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgamF4YiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgRWNob1N0cmluZyBqYXhiID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7IAotICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoY29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWRRTmFtZSA9IGpiaS5nZXRFbGVtZW50TmFtZShqYXhiKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIHdpdGggYW4gb3V0Ym91bmQgSkFYLVdTIEpBWEIgcGFyYW1ldGVyCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGpheGIsIGNvbnRleHQsIGV4cGVjdGVkUU5hbWUpOwotCi0gICAgICAgIC8vIFdlIGRpZCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWRRTmFtZSArICIgYnV0IGZvdW5kOiAiICsgcU5hbWUsIGV4cGVjdGVkUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkhlbGxvIFdvcmxkIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoImVjaG9TdHJpbmciKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gSkFYQiBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8SkFYQj4gaW5wdXQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIGpheGIgb2JqZWN0Ci0gICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIEVjaG9TdHJpbmcgamF4YiA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyAKLSAgICAgICAgamF4Yi5zZXRJbnB1dCgiSGVsbG8gV29ybGQiKTsKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gbmV3IEpBWEJCbG9ja0NvbnRleHQoRWNob1N0cmluZy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLSAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSk7Ci0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOwotICAgICAgICBKQVhCVXRpbHMucmVsZWFzZUpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSwgbWFyc2hhbGxlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgZnJvbSB0aGUgaW5mbG93LiAgCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgY29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdC4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZDoiICsgKChFY2hvU3RyaW5nKWJvKS5nZXRJbnB1dCgpLCAoKEVjaG9TdHJpbmcpYm8pLmdldElucHV0KCkuZXF1YWxzKGpheGIuZ2V0SW5wdXQoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIEpBWEIgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogbm9ybWFsIERpc3BhdGNoPEpBWEI+IGlucHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSW5mbG93MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgamF4YiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgRWNob1N0cmluZyBqYXhiID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7IAotICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoY29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWRRTmFtZSA9IGpiaS5nZXRFbGVtZW50TmFtZShqYXhiKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLSAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSk7Ci0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOwotICAgICAgICBKQVhCVXRpbHMucmVsZWFzZUpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSwgbWFyc2hhbGxlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgZnJvbSB0aGUgaW5mbG93LiAgCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgY29udGV4dCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWRRTmFtZSArICIgYnV0IGZvdW5kOiAiICsgcU5hbWUsIGV4cGVjdGVkUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdC4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayBmb3IgYWNjdXJhY3kKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZDoiICsgKChFY2hvU3RyaW5nKWJvKS5nZXRJbnB1dCgpLCAoKEVjaG9TdHJpbmcpYm8pLmdldElucHV0KCkuZXF1YWxzKGpheGIuZ2V0SW5wdXQoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIEpBWEIgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogbm9ybWFsIERpc3BhdGNoPEpBWEI+IGlucHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSW5mbG93MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgamF4YiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgRWNob1N0cmluZyBqYXhiID0gZmFjdG9yeS5jcmVhdGVFY2hvU3RyaW5nKCk7IAotICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoY29udGV4dC5nZXRKQVhCQ29udGV4dCgpKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWRRTmFtZSA9IGpiaS5nZXRFbGVtZW50TmFtZShqYXhiKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsKLSAgICAgICAgTWFyc2hhbGxlciBtYXJzaGFsbGVyID0gSkFYQlV0aWxzLmdldEpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSk7Ci0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOwotICAgICAgICBKQVhCVXRpbHMucmVsZWFzZUpBWEJNYXJzaGFsbGVyKGNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKSwgbWFyc2hhbGxlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBzdy5mbHVzaCgpOwotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHN3LnRvU3RyaW5nKCkpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgZnJvbSB0aGUgaW5mbG93LiAgCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgY29udGV4dCwgZXhwZWN0ZWRRTmFtZSk7Ci0KLSAgICAgICAgLy8gV2UgcGFzc2VkIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiB0cnVlCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNRTmFtZUF2YWlsYWJsZSgpKTsKLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIFFOYW1lIChwZXJoYXBzIHRvIGlkZW50aWZ5IHRoZSBvcGVyYXRpb24gYW5kIAotICAgICAgICAvLyBkZXRlcm1pbmUgaWYgaGFuZGxlcnMgYXJlIGluc3RhbGxlZCkuICAgVGhpcyBpcyBub3QgdmVyeSBwZXJmb21hbnQgc2luY2UgCi0gICAgICAgIC8vIGl0IGNhdXNlcyBhbiB1bmRlcmx5aW5nIHBhcnNlIG9mIHRoZSBTdHJpbmcuLi5idXQgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFFOYW1lICsgIiBidXQgZm91bmQ6ICIgKyBxTmFtZSwgZXhwZWN0ZWRRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0LgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIEVjaG9TdHJpbmcpOwotICAgICAgICBhc3NlcnRUcnVlKGJvICE9IGpheGIpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkOiIgKyAoKEVjaG9TdHJpbmcpYm8pLmdldElucHV0KCksICgoRWNob1N0cmluZylibykuZ2V0SW5wdXQoKS5lcXVhbHMoamF4Yi5nZXRJbnB1dCgpKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gSkFYQiBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8SkFYQj4gaW5wdXQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3c0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBqYXhiIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgCi0gICAgICAgIGpheGIuc2V0SW5wdXQoIkhlbGxvIFdvcmxkIik7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KEVjaG9TdHJpbmcuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gY29udGV4dC5nZXRKQVhCQ29udGV4dCgpOwotCi0gICAgICAgIEpBWEJJbnRyb3NwZWN0b3IgamJpID0gSkFYQlV0aWxzLmdldEpBWEJJbnRyb3NwZWN0b3IoamF4YkNvbnRleHQpOwotICAgICAgICBRTmFtZSBleHBlY3RlZFFOYW1lID0gamJpLmdldEVsZW1lbnROYW1lKGpheGIpOwotCi0gICAgICAgIC8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIHByb2JhYmx5IGJlIGFuIE9NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBJbiB0aGlzIHNjZW5hcmlvLCB0aGUgT00gY29udGFpbnMKLSAgICAgICAgLy8gYSBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgYmFja2VkIGJ5IEVjaG9TdHJpbmcuCi0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgSkFYQkRTQ29udGV4dCBkc0NvbnRleHQgPSBuZXcgSkFYQkRTQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgIEpBWEJEYXRhU291cmNlIGRzID0gbmV3IEpBWEJEYXRhU291cmNlKGpheGIsIGRzQ29udGV4dCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21GYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKGV4cGVjdGVkUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksICJwcmUiKTsKLSAgICAgICAgT01FbGVtZW50IG9tID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChkcywgZXhwZWN0ZWRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbnMpOwotICAgICAgICAKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20ob20sIGNvbnRleHQsIGV4cGVjdGVkUU5hbWUpOwotCi0gICAgICAgIC8vIFdlIHBhc3NlZCBpbiBhIHFuYW1lLCBzbyB0aGUgZm9sbG93aW5nIHNob3VsZCByZXR1cm4gdHJ1ZQotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIAotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgZXhwZWN0ZWRRTmFtZSArICIgYnV0IGZvdW5kOiAiICsgcU5hbWUsIGV4cGVjdGVkUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdC4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbmNlIHRoZSBFY2hvU3RyaW5nIHdhcyBhbHJlYWR5IHByb3ZpZGVkIGluIGEgZGF0YSBzb3VyY2UsIHRoaXMKLSAgICAgICAgLy8gb2JqZWN0IHNob3VsZCBiZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBlY2hvU3RyaW5nCi0gICAgICAgIGFzc2VydFRydWUoYm8gPT0gamF4Yik7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQ6IiArICgoRWNob1N0cmluZylibykuZ2V0SW5wdXQoKSwgKChFY2hvU3RyaW5nKWJvKS5nZXRJbnB1dCgpLmVxdWFscyhqYXhiLmdldElucHV0KCkpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBPTSBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8T01FbGVtZW50PiBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T01PdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIE9NQmxvY2tGYWN0b3J5IGYgPSAoT01CbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8T01FbGVtZW50PiBjbGllbnQKLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0UmVhZGVyKTsgIAotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShvbSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIE9NIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIGRpZmZlcmVudCBEaXNwYXRjaDxPTUVsZW1lbnQ+IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPTU91dGZsb3cyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIE9NQmxvY2tGYWN0b3J5IGYgPSAoT01CbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8T01FbGVtZW50PiBjbGllbnQKLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVUZXh0KTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKGlucHV0UmVhZGVyKTsgIAotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShvbSwgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgbmVlZCB0byBmaW5kIHRoZSBRTmFtZSAocGVyaGFwcyB0byBpZGVudGlmeSB0aGUgb3BlcmF0aW9uIGFuZCAKLSAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQpLiAgIFRoaXMgaXMgbm90IHZlcnkgcGVyZm9tYW50IHNpbmNlIAotICAgICAgICAvLyBpdCBjYXVzZXMgYW4gdW5kZXJseWluZyBwYXJzZSBvZiB0aGUgU3RyaW5nLi4uYnV0IHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzLgotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkOiAiICsgc2FtcGxlUU5hbWUgKyAiIGJ1dCBmb3VuZDogIiArIHFOYW1lLCBzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIAotICAgICAqICBEaXNwYXRjaDxPTUVsZW1lbnQ+IGluZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9NSW5mbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIE9NQmxvY2tGYWN0b3J5IGYgPSAoT01CbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE9NQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oaW5mbG93LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgd2UgbmVlZCB0byBnZXQgdGhlIFFOYW1lIHRvIGZpbmQgdGhlIG9wZXJhdGlvbiBuYW1lLgotICAgICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgYW4gdW5kZXJseWluZyBwYXJzZQotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBPTUVsZW1lbnQpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMoYm8udG9TdHJpbmcoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGEgU291cmNlIGFuZCBzaW11bGF0ZSBhIAotICAgICAqIG5vcm1hbCBEaXNwYXRjaDxTb3VyY2U+IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICBTdHJlYW1Tb3VyY2Ugc3MgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTb3VyY2U+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzcywgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gV2UgZGlkbid0IHBhc3MgaW4gYSBxbmFtZSwgc28gdGhlIGZvbGxvd2luZyBzaG91bGQgcmV0dXJuIGZhbHNlCi0gICAgICAgIGFzc2VydFRydWUoIWJsb2NrLmlzUU5hbWVBdmFpbGFibGUoKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhIFNvdXJjZSBhbmQKLSAgICAgKiBzaW11bGF0ZSBhIGRpZmZlcmVudCBEaXNwYXRjaDxTb3VyY2U+IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VPdXRmbG93MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkgZiA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgU3RyZWFtU291cmNlIHNzID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVRleHQpKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U291cmNlPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oc3MsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IHdlIG5lZWQgdG8gZmluZCB0aGUgUU5hbWUgKHBlcmhhcHMgdG8gaWRlbnRpZnkgdGhlIG9wZXJhdGlvbiBhbmQgCi0gICAgICAgIC8vIGRldGVybWluZSBpZiBoYW5kbGVycyBhcmUgaW5zdGFsbGVkKS4gICBUaGlzIGlzIG5vdCB2ZXJ5IHBlcmZvbWFudCBzaW5jZSAKLSAgICAgICAgLy8gaXQgY2F1c2VzIGFuIHVuZGVybHlpbmcgcGFyc2Ugb2YgdGhlIFN0cmluZy4uLmJ1dCB3ZSBuZWVkIHRvIHN1cHBvcnQgdGhpcy4KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBibG9jay5nZXRRTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZDogIiArIHNhbXBsZVFOYW1lICsgIiBidXQgZm91bmQ6ICIgKyBxTmFtZSwgc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlCi0gICAgICAgIC8vIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZC4KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGJsb2NrLmdldFhNTFN0cmVhbVJlYWRlcih0cnVlKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhIFNvdXJjZSBhbmQKLSAgICAgKiBzaW11bGF0ZSBhIGRpZmZlcmVudCBTb3VyY2UgcGFyYW1ldGVyIGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VPdXRmbG93MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkgZiA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgU3RyZWFtU291cmNlIHNzID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVRleHQpKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgU3RyaW5nIHBhcmFtZXRlciBvbiB0aGUgY2xpZW50LgotICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGtub3cgdGhlIFFOYW1lIHByaW9yIHRvIGNyZWF0aW5nIHRoZSBCbG9jay4uLnNvIGxldCdzIHBhc3MgaXQgaW4uCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNzLCBudWxsLCBzYW1wbGVRTmFtZSk7Ci0KLSAgICAgICAgLy8gV2UgcGFzc2VkIGluIGEgcW5hbWUsIHNvIGl0IHNob3VsZCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgUU5hbWUgaXMgY29ycmVjdC4KLSAgICAgICAgUU5hbWUgcU5hbWUgPSBibG9jay5nZXRRTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVFOYW1lLmVxdWFscyhxTmFtZSkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U291cmNlPiBpbnB1dCBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU291cmNlSW5mbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oaW5mbG93LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFNvdXJjZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoKFNvdXJjZSkgYm8pOwotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIERpc3BhdGNoPFNvdXJjZT4gaW5mbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU291cmNlSW5mbG93MigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICAKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oaW5mbG93LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBMZXQncyBhc3N1bWUgd2UgbmVlZCB0byBnZXQgdGhlIFFOYW1lIHRvIGZpbmQgdGhlIG9wZXJhdGlvbiBuYW1lLgotICAgICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgYW4gdW5kZXJseWluZyBwYXJzZQotICAgICAgICBRTmFtZSBxTmFtZSA9IGJsb2NrLmdldFFOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlUU5hbWUuZXF1YWxzKHFOYW1lKSk7Ci0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBTb3VyY2UpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKChTb3VyY2UpIGJvKTsKLSAgICAgICAgUmVhZGVyMldyaXRlciByMncgPSBuZXcgUmVhZGVyMldyaXRlcihyZWFkZXIpOwotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IHIydy5nZXRBc1N0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKG5ld1RleHQpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBTb3VyY2UgYW5kIHNpbXVsYXRlIGEgCi0gICAgICogc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBTb3VyY2UgaW5mbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU291cmNlSW5mbG93MygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYSBYTUxTdHJlYW1SZWFkZXIgKHByb2JhYmx5IGZyb20gT00pCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBXZSB3aWxsIHNpbXVsYXRlIHRoaXMgd2l0aCBpbmZsb3cuCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlVGV4dCk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayBmcm9tIHRoZSBpbmZsb3cuICBBc3N1bWUgdGhhdCB3ZSBrbm93IHRoZSBRTmFtZSBhbHJlYWR5Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKGluZmxvdywgbnVsbCwgc2FtcGxlUU5hbWUpOwotCi0gICAgICAgIC8vIFdlIHBhc3NlZCBpbiBhIHFuYW1lLCBzbyB0aGUgZm9sbG93aW5nIHNob3VsZCByZXR1cm4gZmFsc2UKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIExldCdzIGFzc3VtZSB3ZSBuZWVkIHRvIGdldCB0aGUgUU5hbWUgdG8gZmluZCB0aGUgb3BlcmF0aW9uIG5hbWUuCi0gICAgICAgIFFOYW1lIHFOYW1lID0gYmxvY2suZ2V0UU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVRTmFtZS5lcXVhbHMocU5hbWUpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFNvdXJjZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIFN0cmluZyBmb3IgYWNjdXJhY3kKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoKFNvdXJjZSkgYm8pOwotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotCi0gICAgfQotICAgIC8qCi0gICAgICogVGVzdGluZyBKQVhCU291cmNlLCBDcmVhdGluZyBTb3VyY2UgQmxvY2sgdXNpbmcgSkFYQlNvdXJjZSBhbmQgdGhlbgotICAgICAqIFNlcmlhbGl6aW5nIGl0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCU291cmNlSW5GbG93MSgpdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgLy8gIENyZWF0ZSBhIGpheGIgb2JqZWN0Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIE9iamVjdEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSBmYWN0b3J5LmNyZWF0ZUVjaG9TdHJpbmcoKTsgCi0gICAgICAgICAgICBqYXhiLnNldElucHV0KCJIZWxsbyBXb3JsZCIpOwotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0Iik7Ci0KLSAgICAgICAgICAgIEpBWEJTb3VyY2Ugc3JjID0gbmV3IEpBWEJTb3VyY2UoY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCksIGpheGIpOwotICAgICAgICAgICAgQmxvY2tGYWN0b3J5IGYgPSAoU291cmNlQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAgICAgQmxvY2sgYmxvY2sgPWYuY3JlYXRlRnJvbShzcmMsIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgICAgIG1zZy5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPSAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSltc2cuZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSAKLSAgICAgICAgICAgIC8vIEhUVFAgY2xpZW50LgotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcobmV3VGV4dCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0gICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9ICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlNvdXJjZU91dGZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvL1NhbXBsZSB0ZXh0IGZvciBKQVhCU291cmNlCi0gICAgICAgIFN0cmluZyBlY2hvU2FtcGxlID0gIjxlY2hvU3RyaW5nIHhtbG5zPVwiaHR0cDovL3Rlc3RcIj48aW5wdXQ+SGVsbG8gV29ybGQ8L2lucHV0PjwvZWNob1N0cmluZz4iOwotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFNvdXJjZUJsb2NrRmFjdG9yeSBmID0gKFNvdXJjZUJsb2NrRmFjdG9yeSkKLSAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU291cmNlQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgLy9DcmVhdGUgYSBKQVhCU291cmNlCi0KLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKCJ0ZXN0Iik7Ci0KLSAgICAgICAgVW5tYXJzaGFsbGVyIHUgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlY2hvU2FtcGxlLmdldEJ5dGVzKCkpOwotICAgICAgICBFY2hvU3RyaW5nIGpheGIgPSAoRWNob1N0cmluZyl1LnVubWFyc2hhbChpbnB1dFN0cmVhbSk7Ci0gICAgICAgIEpBWEJTb3VyY2Ugc3JjID0gbmV3IEpBWEJTb3VyY2UoY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCksIGpheGIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTb3VyY2U+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzcmMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlY2hvU2FtcGxlLmVxdWFscyhuZXdUZXh0KSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhIERPTVNvdXJjZSBpbnN0YW5jZSBhbmQgc2ltdWxhdGUgYW4gCi0gICAgICogb3V0Ym91bmQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERPTVNvdXJjZU91dGZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgU291cmNlQmxvY2tGYWN0b3J5IGYgPSAoU291cmNlQmxvY2tGYWN0b3J5KQotICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTb3VyY2VCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIFR1cm4gdGhlIGNvbnRlbnQgaW50byBhIHN0cmVhbQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNhbXBsZVRleHQuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgRE9NIHRyZWUgZnJvbSB0aGUgc2FtcGxlIHRleHQKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb21GYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9tQnVpbGRlciA9IGRvbUZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIERvY3VtZW50IGRvbVRyZWUgPSBkb21CdWlsZGVyLnBhcnNlKGJhaXMpOwotICAgICAgICBOb2RlIG5vZGUgPSBkb21UcmVlLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyhub2RlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIERPTVNvdXJjZSBvYmplY3QgZnJvbSB0aGUgRE9NIHRyZWUKLSAgICAgICAgRE9NU291cmNlIGRzID0gbmV3IERPTVNvdXJjZShub2RlKTsKLSAgICAgICAgbm9kZSA9IGRzLmdldE5vZGUoKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U291cmNlPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20oZHMsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIFdlIGRpZG4ndCBwYXNzIGluIGEgcW5hbWUsIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHJldHVybiBmYWxzZQotICAgICAgICBhc3NlcnRUcnVlKCFibG9jay5pc1FOYW1lQXZhaWxhYmxlKCkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBibG9jay5nZXRYTUxTdHJlYW1SZWFkZXIodHJ1ZSk7Ci0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0KLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIocmVhZGVyKTsKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzYW1wbGVUZXh0LmVxdWFscyhuZXdUZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGEgU0FYU291cmNlIGluc3RhbmNlIGFuZCBzaW11bGF0ZSBhbiAKLSAgICAgKiBvdXRib3VuZCBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0FYU291cmNlT3V0ZmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBTb3VyY2VCbG9ja0ZhY3RvcnkgZiA9IChTb3VyY2VCbG9ja0ZhY3RvcnkpCi0gICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU0FYU291cmNlIGZyb20gdGhlIHNhbXBsZSB0ZXh0Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IHNhbXBsZVRleHQuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXQgPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsKLSAgICAgICAgU0FYU291cmNlIHNzID0gbmV3IFNBWFNvdXJjZShpbnB1dCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgQmxvY2sgdXNpbmcgdGhlIHNhbXBsZSBzdHJpbmcgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFNvdXJjZT4gY2xpZW50Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNzLCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBXZSBkaWRuJ3QgcGFzcyBpbiBhIHFuYW1lLCBzbyB0aGUgZm9sbG93aW5nIHNob3VsZCByZXR1cm4gZmFsc2UKLSAgICAgICAgYXNzZXJ0VHJ1ZSghYmxvY2suaXNRTmFtZUF2YWlsYWJsZSgpKTsKLQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIGEgWE1MU3RyZWFtUmVhZGVyIHdpbGwgYmUgcmVxdWVzdGVkLi4udG8gZ28gdG8gT00uICAgQXQgdGhpcyBwb2ludCB0aGUKLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKHJlYWRlcik7Ci0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gcjJ3LmdldEFzU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMobmV3VGV4dCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvRmF1bHRUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvRmF1bHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDY2ZWU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0ZhdWx0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5Tb3VyY2VCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIE1lc3NhZ2VUZXN0cwotICogVGVzdHMgdG8gY3JlYXRlIGFuZCB2YWxpZGF0ZSBNZXNzYWdlIHByb2Nlc3NpbmcKLSAqIFRoZXNlIGFyZSBub3QgY2xpZW50L3NlcnZlciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEZhdWx0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmF1bHRTdHJpbmcgPSAiSW50ZXJuYWwgc2VydmVyIGVycm9yIGZyb20gV0FTIjsKLQkKLQkvLyBTdHJpbmcgdGVzdCB2YXJpYWJsZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlU09BUDExRmF1bHRFbnZlbG9wZTEgPSAKLQkJIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIKLQkJKyAiPHNvYXBlbnY6Qm9keT4iCi0JCSsgIjxzb2FwZW52OkZhdWx0PiIKLQkJKyAiPGZhdWx0Y29kZT5zb2FwZW52OlNlcnZlcjwvZmF1bHRjb2RlPiIKLQkJKyAiPGZhdWx0c3RyaW5nPiIgKyBmYXVsdFN0cmluZyArICJzYW1wbGVTT0FQMTFGYXVsdEVudmVsb3BlMTwvZmF1bHRzdHJpbmc+IgotCQkrICI8L3NvYXBlbnY6RmF1bHQ+IgotCQkrICI8L3NvYXBlbnY6Qm9keT4iCi0JCSsgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVTT0FQMTFGYXVsdEVudmVsb3BlMiA9Ci0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiIgKwotICAgICAgICAiIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiICsKLQkJIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIiArCi0JCSIgeG1sbnM6Y3dtcD1cImh0dHA6Ly9jd21wLmNvbVwiPiIgKwotCQkiIDxzb2FwZW52OkhlYWRlcj4iICsKLQkJIiA8Y3dtcDpJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPVwiMVwiPkhFQURFUklELTc4Njc2Nzg8L2N3bXA6SUQ+IiArCi0JCSIgPC9zb2FwZW52OkhlYWRlcj4iICsKLQkJIiA8c29hcGVudjpCb2R5PiIgKwotCQkiIDxzb2FwZW52OkZhdWx0PiIgKwotCQkiIDxmYXVsdGNvZGU+c29hcGVudjpDbGllbnQ8L2ZhdWx0Y29kZT4iICsKLQkJIiA8ZmF1bHRzdHJpbmc+IiArIGZhdWx0U3RyaW5nICsgInNhbXBsZVNPQVAxMUZhdWx0RW52ZWxvcGUyPC9mYXVsdHN0cmluZz4iICsKLQkJIiA8ZmF1bHRhY3Rvcj5odHRwOi8vZ2l6bW9zLmNvbS9vcmRlcjwvZmF1bHRhY3Rvcj4iICsKLQkJIiA8ZGV0YWlsPiIgKwotCQkiIDxjd21wOkZhdWx0PiIgKwotCQkiIDxjd21wOkZhdWx0Q29kZT5UaGlzIGlzIHRoZSBmYXVsdCBjb2RlPC9jd21wOkZhdWx0Q29kZT4iICsKLQkJIiA8Y3dtcDpGYXVsdFN0cmluZz5GYXVsdCBNZXNzYWdlPC9jd21wOkZhdWx0U3RyaW5nPiIgKwotCQkiIDxjd21wOk1lc3NhZ2U+VGhpcyBpcyBhIHRlc3QgZmF1bHQ8L2N3bXA6TWVzc2FnZT4iICsKLQkJIiA8L2N3bXA6RmF1bHQ+IiArCi0JCSIgPC9kZXRhaWw+IiArIC8qKi8KLQkJIiA8L3NvYXBlbnY6RmF1bHQ+IiArCi0JCSIgPC9zb2FwZW52OkJvZHk+IiArCi0JCSIgPC9zb2FwZW52OkVudmVsb3BlPiI7Ci0JCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUxID0KLSAgICAgICAgLy8iPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4iCi0gICAgICAgICI8ZW52OkVudmVsb3BlIHhtbG5zOmVudj1cImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZVwiPiIKLSAgICAgICAgKyAiPGVudjpCb2R5PiIKLSAgICAgICAgKyAiPGVudjpGYXVsdD4iCi0gICAgICAgICsgIjxlbnY6Q29kZT48ZW52OlZhbHVlPmVudjpSZWNlaXZlcjwvZW52OlZhbHVlPjwvZW52OkNvZGU+IgotICAgICAgICArICI8ZW52OlJlYXNvbj48ZW52OlRleHQgbGFuZz1cIiIrIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSArIlwiPiIKLSAgICAgICAgKyBmYXVsdFN0cmluZyArICJzYW1wbGVTT0FQMTJGYXVsdEVudmVsb3BlMTwvZW52OlRleHQ+PC9lbnY6UmVhc29uPiIKLSAgICAgICAgKyAiPC9lbnY6RmF1bHQ+IgotICAgICAgICArICI8L2VudjpCb2R5PiIKLSAgICAgICAgKyAiPC9lbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICAvLyBtaXNzaW5nIG5hbWVzcGFjZSBmb3IgZmF1bHRjb2RlIHZhbHVlCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUyID0KLSAgICAgICAgLy8iPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4iCi0gICAgICAgICI8ZW52OkVudmVsb3BlIHhtbG5zOmVudj1cImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZVwiPiIKLSAgICAgICAgKyAiPGVudjpCb2R5PiIKLSAgICAgICAgKyAiPGVudjpGYXVsdD4iCi0gICAgICAgICsgIjxlbnY6Q29kZT48ZW52OlZhbHVlPlNlbmRlcjwvZW52OlZhbHVlPjwvZW52OkNvZGU+IgotICAgICAgICArICI8ZW52OlJlYXNvbj48ZW52OlRleHQgbGFuZz1cIiIrIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKSArIlwiPiIKLSAgICAgICAgKyBmYXVsdFN0cmluZyArICJzYW1wbGVTT0FQMTJGYXVsdEVudmVsb3BlMjwvZW52OlRleHQ+PC9lbnY6UmVhc29uPiIKLSAgICAgICAgKyAiPC9lbnY6RmF1bHQ+IgotICAgICAgICArICI8L2VudjpCb2R5PiIKLSAgICAgICAgKyAiPC9lbnY6RW52ZWxvcGU+IjsKLSAgICAKLQlwcml2YXRlIHN0YXRpYyBYTUxJbnB1dEZhY3RvcnkgaW5wdXRGYWN0b3J5ID0gWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCi0JcHVibGljIEZhdWx0VGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEZhdWx0VGVzdHMoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgdGVzdCBlZmZlY3RpdmVseSB0ZXN0cyBYTUxGYXVsdCBjb25zdHJ1Y3Rpb24gZnJvbQotCSAqIAotCSAqIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQgc29hcGZhdWx0LCBMaXN0PEJsb2NrPiBkZXRhaWxCbGtzCi0JICogCi0JICogd2hpY2ggaXMgYSBjbGllbnQtc2lkZSBvcGVyYXRpb24uICBBbHNvIHRlc3RzIHRoZSAic2VyaWFsaXphdGlvbiIgb2YgdGhlCi0JICogWE1MRmF1bHQgb2JqZWN0IGludG8gYSBNZXNzYWdlIG9iamVjdCB3aGljaCBpcyBhIHNlcnZlci1zaWRlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0luZmxvdzEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXRyeSB7Ci0JCS8vIE9uIGluYm91bmQsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhbiBPTQotCQkvLyB3aGljaCByZXByZXNlbnRzIHRoZSBtZXNzYWdlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQKLQkJLy8gT00KLQkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVTT0FQMTFGYXVsdEVudmVsb3BlMSk7Ci0JCVhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotCQlPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLQkJCi0JCS8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00KLQkJTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0JCQlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0JCU1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLQkJCi0JCWFzc2VydFRydWUobS5pc0ZhdWx0KCkpOwotCQkKLQkJaWYgKG0uaXNGYXVsdCgpKSB7Ci0JCQlYTUxGYXVsdCB4ID0gbS5nZXRYTUxGYXVsdCgpOwotCQkJYXNzZXJ0RXF1YWxzKGZhdWx0U3RyaW5nICsgInNhbXBsZVNPQVAxMUZhdWx0RW52ZWxvcGUxIiwgeC5nZXRSZWFzb24oKS5nZXRUZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJTZXJ2ZXIiLCB4LmdldENvZGUoKS4KLSAgICAgICAgICAgICAgICAgICAgdG9RTmFtZSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iKS5nZXRMb2NhbFBhcnQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCJNZXNzYWdlIHNob3VsZCBiZSBtYXJrZWQgYXMgYSBmYXVsdC4iKTsKLQkJfQotCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCX0KLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93MigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQkvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLQkJCS8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlCi0JCQkvLyBpbnB1dAotCQkJLy8gT00KLQkJCVN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlU09BUDExRmF1bHRFbnZlbG9wZTIpOwotCQkJWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csCi0JCQkJCW51bGwpOwotCQkJT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0KLQkJCS8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00KLQkJCU1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkKLQkJCQkJLmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotCQkJTWVzc2FnZSBtID0gbWYuY3JlYXRlRnJvbShvbUVsZW1lbnQsIG51bGwpOwotCi0JCQlhc3NlcnRUcnVlKG0uaXNGYXVsdCgpKTsKLQkJCQotCQkJaWYgKG0uaXNGYXVsdCgpKSB7Ci0JCQkJWE1MRmF1bHQgeCA9IG0uZ2V0WE1MRmF1bHQoKTsKLQkJCQlhc3NlcnRFcXVhbHMoZmF1bHRTdHJpbmcgKyAic2FtcGxlU09BUDExRmF1bHRFbnZlbG9wZTIiLCB4LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGllbnQiLCB4LmdldENvZGUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIikuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJCQotCQkJCS8vIGRyaWxsIGRvd24gdG8gdGhlIGZhdWx0Y29kZSB0ZXh0IGluIHRoZSBkZXRhaWwgdG8gbWFrZSBzdXJlIGl0J3MgdGhlcmUgYW5kIGl0J3Mgc2V0Ci0JCQkJQmxvY2tbXSBibG9ja3MgPSB4LmdldERldGFpbEJsb2NrcygpOwotCQkJCUJsb2NrIGJsb2NrID0gYmxvY2tzWzBdOwotCQkJCU9NRWxlbWVudCBlbGVtZW50ID0gYmxvY2suZ2V0T01FbGVtZW50KCk7Ci0JCQkJT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudCllbGVtZW50LmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBjaGlsZC5nZXRUZXh0KCk7Ci0JCQkJCi0JCQkJCi0JCQkJYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIHRoZSBmYXVsdCBjb2RlIiwgdGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWZhaWwoIk1lc3NhZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBhIGZhdWx0LiIpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyB0ZXN0IGVmZmVjdGl2ZWx5IHRlc3RzIFhNTEZhdWx0IGNvbnN0cnVjdGlvbiBmcm9tCi0JICogCi0JICogb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdCBzb2FwZmF1bHQsIExpc3Q8QmxvY2s+IGRldGFpbEJsa3MKLQkgKiAKLQkgKiB3aGljaCBpcyBhIGNsaWVudC1zaWRlIG9wZXJhdGlvbi4gIEFsc28gdGVzdHMgdGhlICJzZXJpYWxpemF0aW9uIiBvZiB0aGUKLQkgKiBYTUxGYXVsdCBvYmplY3QgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IHdoaWNoIGlzIGEgc2VydmVyLXNpZGUgb3BlcmF0aW9uLgotCSAqIAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93MygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJdHJ5IHsKLQkJLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NCi0JCS8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBUaGUgZm9sbG93aW5nIGNvZGUgc2ltdWxhdGVzIHRoZSBpbnB1dAotCQkvLyBPTQotCQlTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUxKTsKLQkJWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotCQlTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0JCU9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotCQkKLQkJLy8gVGhlIEpBWC1XUyBsYXllciBjcmVhdGVzIGEgTWVzc2FnZSBmcm9tIHRoZSBPTQotCQlNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLQkJCUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLQkJTWVzc2FnZSBtID0gbWYuY3JlYXRlRnJvbShvbUVsZW1lbnQsIG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtLmlzRmF1bHQoKSk7Ci0JCQotCQlpZiAobS5pc0ZhdWx0KCkpIHsKLQkJCVhNTEZhdWx0IHggPSBtLmdldFhNTEZhdWx0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoZmF1bHRTdHJpbmcgKyAic2FtcGxlU09BUDEyRmF1bHRFbnZlbG9wZTEiLCB4LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlY2VpdmVyIiwgeC5nZXRDb2RlKCkuCi0gICAgICAgICAgICAgICAgICAgIHRvUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSIpLmdldExvY2FsUGFydCgpKTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoIk1lc3NhZ2Ugc2hvdWxkIGJlIG1hcmtlZCBhcyBhIGZhdWx0LiIpOwotCQl9Ci0JCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJfQotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93NCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBUaGUgZm9sbG93aW5nIGNvZGUgc2ltdWxhdGVzIHRoZSBpbnB1dAotICAgICAgICAvLyBPTQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVNPQVAxMkZhdWx0RW52ZWxvcGUyKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIEpBWC1XUyBsYXllciBjcmVhdGVzIGEgTWVzc2FnZSBmcm9tIHRoZSBPTQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlRnJvbShvbUVsZW1lbnQsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShtLmlzRmF1bHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAobS5pc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgIFhNTEZhdWx0IHggPSBtLmdldFhNTEZhdWx0KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmF1bHRTdHJpbmcgKyAic2FtcGxlU09BUDEyRmF1bHRFbnZlbG9wZTIiLCB4LmdldFJlYXNvbigpLmdldFRleHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNlbmRlciIsIHguZ2V0Q29kZSgpLgotICAgICAgICAgICAgICAgICAgICB0b1FOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWlsKCJNZXNzYWdlIHNob3VsZCBiZSBtYXJrZWQgYXMgYSBmYXVsdC4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNPQVAxMVhNTEZhdWx0QXNPTSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24oInNhbXBsZSBmYXVsdCByZWFzb24iKTsKLSAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBuZXcgWE1MRmF1bHQoWE1MRmF1bHRDb2RlLlNFTkRFUiwgcmVhc29uKTsKLSAgICAgICAgbXNnLnNldFhNTEZhdWx0KGZhdWx0KTsKLSAgICAgICAgCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IG1zZy5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgb20uc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBlbnYgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52LmluZGV4T2YoImZhdWx0Y29kZSIpID4gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52LmluZGV4T2YoImZhdWx0c3RyaW5nIikgPiAwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFNPQVAxMVhNTEZhdWx0QXNCbG9jaygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICBYTUxGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgWE1MRmF1bHRSZWFzb24oInNhbXBsZSBmYXVsdCByZWFzb24iKTsKLSAgICAgICAgWE1MRmF1bHQgZmF1bHQgPSBuZXcgWE1MRmF1bHQoWE1MRmF1bHRDb2RlLlNFTkRFUiwgcmVhc29uKTsKLSAgICAgICAgbXNnLnNldFhNTEZhdWx0KGZhdWx0KTsKLSAgICAgICAgCi0gICAgICAgIEJsb2NrRmFjdG9yeSBiZiA9IChCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNvdXJjZUJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEJsb2NrIGIgPSBtc2cuZ2V0Qm9keUJsb2NrKG51bGwsIGJmKTsKLSAgICAgICAgCi0gICAgICAgIFNvdXJjZSBjb250ZW50ID0gKFNvdXJjZSkgYi5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gX2dldEJ5dGVzKGNvbnRlbnQpOwotICAgICAgICBTdHJpbmcgZmF1bHRDb250ZW50ID0gbmV3IFN0cmluZyhieXRlcyk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGZhdWx0IGNvbnRlbnQ6ICIgKyBmYXVsdENvbnRlbnQpOyAKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdENvbnRlbnQuaW5kZXhPZigiZmF1bHRjb2RlIikgPiAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmYXVsdENvbnRlbnQuaW5kZXhPZigiZmF1bHRzdHJpbmciKSA+IDApOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJ5dGVbXSBfZ2V0Qnl0ZXMoU291cmNlIGlucHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHQgPSB0Zi5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCBvdXRwdXQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotICAgICAgICAKLSAgICAgICAgdC50cmFuc2Zvcm0oaW5wdXQsIG91dHB1dCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOyAKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0pBWEJDdXN0b21CdWlsZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL0pBWEJDdXN0b21CdWlsZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlNjU5Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9KQVhCQ3VzdG9tQnVpbGRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCQ3VzdG9tQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRTQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRhdGFTb3VyY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZzsNCi1pbXBvcnQgdGVzdC5PYmplY3RGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLS8qKg0KLSAqIFVuaXQgVGVzdGluZyBvZiBKQVhCQ3VzdG9tQnVpbGRlci4NCi0gKiANCi0gKiBBIEpBWEJDdXN0b21CdWlsZGVyIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBeGlvbSBDdXN0b21CdWlsZGVyLg0KLSAqIFdoZW4gcmVnaXN0ZXJlZCBvbiBhIFN0QVhPTUJ1aWxkZXIsIHRoZSBidWlsZGVyIHdpbGwgZGVsZWdhdGUgdG8gDQotICogdGhlIEpBWEJDdXN0b21CdWlsZGVyIHdoZW4gdGhlIHBheWxvYWQgZWxlbWVudCBpcyBlbmNvdW50ZXJlZC4NCi0gKiANCi0gKiBUaGUgSkFYQkN1c3RvbUJ1aWxkZXIgd2lsbCBidWlsZCBhbiBPTVNvdXJjZWRFbGVtZW50IGJhY2tlZCBieSBhIEpBWEINCi0gKiBvYmplY3QgYW5kIHBsYWNlIGl0IGluIHRoZSBPTSB0cmVlLiAgVGhpcyBpcyBtdWNoIGZhc3RlciBhbmQgbW9yZQ0KLSAqIGVmZmljaWVudCB0aGFuIGJ1aWxkaW5nIGFuIGVudGlyZSBPTSB0cmVlLg0KLSAqIA0KLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuV3JhcFRlc3RzIGZvciBhbiBhY3R1YWwgdXNlIGNhc2UNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKQVhCQ3VzdG9tQnVpbGRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgIHByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBjb250ZXh0UGFja2FnZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQotICAgICAgICBjb250ZXh0UGFja2FnZXMuYWRkKEVjaG9TdHJpbmcuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7DQotICAgICAgICAvKioNCi0gICAgICAgIC8vIFNldHVwOiBDcmVhdGUgYSBqYXhiIG9iamVjdA0KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgamF4YiA9IGZhY3RvcnkuY3JlYXRlRWNob1N0cmluZygpOyANCi0gICAgICAgIGpheGIuc2V0SW5wdXQoIkhlbGxvIFdvcmxkIik7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJVdGlscy5nZXRKQVhCQ29udGV4dChjb250ZXh0UGFja2FnZXMpOw0KLSAgICAgICAgICAgDQotICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIHhtbA0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHN3KTsNCi0gICAgICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IEpBWEJVdGlscy5nZXRKQVhCTWFyc2hhbGxlcihjb250ZXh0KTsNCi0gICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbChqYXhiLCB3cml0ZXIpOw0KLSAgICAgICAgSkFYQlV0aWxzLnJlbGVhc2VKQVhCTWFyc2hhbGxlcihjb250ZXh0LCBtYXJzaGFsbGVyKTsNCi0gICAgICAgIHdyaXRlci5mbHVzaCgpOw0KLSAgICAgICAgc3cuZmx1c2goKTsNCi0gICAgICAgIFN0cmluZyBvdXR0ZXh0ID0gc3cudG9TdHJpbmcoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT1VUPSIgKyBvdXR0ZXh0KTsNCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIob3V0dGV4dCk7DQotICAgICAgICAqKi8NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIGluVGV4dCA9ICI8cHJlOmVjaG9TdHJpbmcgeG1sbnM6cHJlPVwiaHR0cDovL3Rlc3RcIj48cHJlOmlucHV0PkhlbGxvIFdvcmxkPC9wcmU6aW5wdXQ+PC9wcmU6ZWNob1N0cmluZz4iOw0KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihpblRleHQpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZWFkIHRoZSBzYW1wbGUgdGV4dCB1c2luZyBPTSBiYWNrZWQgYnkgU3RBWC4NCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOw0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoaW5wdXRSZWFkZXIpOyANCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQ3VzdG9tQnVpbGRlcg0KLSAgICAgICAgSkFYQkRTQ29udGV4dCBqZHNDb250ZXh0ID0gbmV3IEpBWEJEU0NvbnRleHQoY29udGV4dFBhY2thZ2VzKTsNCi0gICAgICAgIEpBWEJDdXN0b21CdWlsZGVyIGpjYiA9IG5ldyBKQVhCQ3VzdG9tQnVpbGRlcihqZHNDb250ZXh0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIEpBWEJDdXN0b21CdWlsZGVyLi4udGhpcyB3aWxsIGludGVyY2VwdCB0aGUgcGF5bG9hZA0KLSAgICAgICAgLy8gYW5kIGJ1aWxkIGEgamF4YiBlbGVtZW50DQotICAgICAgICBidWlsZGVyLnJlZ2lzdGVyQ3VzdG9tQnVpbGRlckZvclBheWxvYWQoamNiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gR2V0IHRoZSBPTSBlbGVtZW50DQotICAgICAgICBPTUVsZW1lbnQgb20gPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOyAgDQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBPTSBFbGVtZW50IGlzIGJhY2tlZCBieSBhbiB1bm1hcnNoYWxsZWQgamF4YiBvYmplY3QNCi0gICAgICAgIGFzc2VydFRydWUob20gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb20pLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCRGF0YVNvdXJjZSk7DQotICAgICAgICBKQVhCRGF0YVNvdXJjZSBqYXhiRFMgPSAoSkFYQkRhdGFTb3VyY2UpIGRzOw0KLSAgICAgICAgT2JqZWN0IGpheGJPYmplY3QgPSBqYXhiRFMuZ2V0T2JqZWN0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGpheGJPYmplY3QgaW5zdGFuY2VvZiBFY2hvU3RyaW5nKTsNCi0gICAgICAgIEVjaG9TdHJpbmcgcmVzdWx0ID0gKEVjaG9TdHJpbmcpIGpheGJPYmplY3Q7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRJbnB1dCgpLmVxdWFscygiSGVsbG8gV29ybGQiKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCBuYW1lIGNhbiBiZSBvYnRhaW5lZCB3aXRob3V0IGV4cGFuc2lvbg0KLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG9tLmdldExvY2FsTmFtZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZWNob1N0cmluZyIuZXF1YWxzKGxvY2FsTmFtZSkpOw0KLSAgICAgICAgZHMgPSAoKE9NU291cmNlZEVsZW1lbnQpIG9tKS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRzICE9IG51bGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmFtZXNwYWNlIHVyaSBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBleHBhbnNpb24NCi0gICAgICAgIE9NTmFtZXNwYWNlIG9tTlMgPSBvbS5nZXROYW1lc3BhY2UoKTsNCi0gICAgICAgIFN0cmluZyB1cmkgPSBvbU5TLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiaHR0cDovL3Rlc3QiLmVxdWFscyAodXJpKSk7DQotICAgICAgICBkcyA9ICgoT01Tb3VyY2VkRWxlbWVudCkgb20pLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJlZml4IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3V0cHV0DQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gb21OUy5nZXRQcmVmaXgoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcmVmaXgpOw0KLSAgICAgICAgU3RyaW5nIHRleHQgPSBvbS50b1N0cmluZygpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRleHQpOw0KLSAgICAgICAgU3RyaW5nIHNlYXJjaFN0cmluZyA9IChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkgPyANCi0gICAgICAgICAgICAgICAgICAgICI8L2VjaG9TdHJpbmc+IiA6DQotICAgICAgICAgICAgICAgICAgICAiPC8iICsgcHJlZml4ICsgIjplY2hvU3RyaW5nPiI7DQotICAgICAgICBhc3NlcnRUcnVlKHRleHQuaW5kZXhPZihzZWFyY2hTdHJpbmcpID4gMCk7DQotICAgICAgICAgICAgDQotICAgIH0NCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VQZXJzaXN0YW5jZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9NZXNzYWdlUGVyc2lzdGFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM5NDY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VQZXJzaXN0YW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRhY2htZW50QWNjZXNzb3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQ29weVV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmcuSkFYQkJsb2NrQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmRhdGFiaW5kaW5nLmltcGwuSkFYQkJsb2NrSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLk1lc3NhZ2VVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaS5EYXRhU291cmNlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy50ZXN0Lm10b20uSW1hZ2VEZXBvdDsNCi1pbXBvcnQgb3JnLnRlc3QubXRvbS5TZW5kSW1hZ2U7DQotaW1wb3J0IHRlc3QuRWNob1N0cmluZ1Jlc3BvbnNlOw0KLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7DQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOw0KLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5GaWxlSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgamF2YS5hd3QuKjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogVGhlc2UgdGVzdHMgc2ltdWxhdGUgdGhlIG91dGJvdW5kIHByb2Nlc3NpbmcgDQotICogZnJvbSBKQVgtV1Mgd2l0aCBNZXNzYWdlIFBlcnNpc3RhbmNlLiAgVGhlIHRlc3RzIHZhbGlkYXRlIHRoYXQgdGhlDQotICogbWVzc2FnZSBpcyBwcm9wZXJseSBjbG9uZWQvd3JpdHRlbi9yZWFkIGFuZCB0aGF0IHRoZSBPTSBpcyBub3QNCi0gKiB1bm5lY2Vzc2FyaWx5IGV4cGFuZGVkICh3aGljaCBpcyBhIHBlcmZvcm1hbmNlIGNvbmNlcm4pLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUGVyc2lzdGFuY2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgRGF0YVNvdXJjZSBzdHJpbmdEUywgaW1hZ2VEUzsNCi0gICAgcHVibGljIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImltYWdlIjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2FtcGxlVGV4dCA9ICJTYW1wbGUgVGV4dCI7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIFhPUF9JTkNMVURFID0gDQotICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiLCAiSW5jbHVkZSIpOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIHN1cGVyLnNldFVwKCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYSBTdHJpbmcNCi0gICAgICAgIHN0cmluZ0RTID0gbmV3IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZShzYW1wbGVUZXh0LmdldEJ5dGVzKCksICJ0ZXh0L3BsYWluIik7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBEYXRhU291cmNlIGZyb20gYW4gaW1hZ2UgDQotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZVJlc291cmNlRGlyICsgRmlsZS5zZXBhcmF0b3IgKyAidGVzdC5qcGciKTsNCi0gICAgICAgIEltYWdlSW5wdXRTdHJlYW0gZmlpcyA9IG5ldyBGaWxlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKTsNCi0gICAgICAgIEltYWdlIGltYWdlID0gSW1hZ2VJTy5yZWFkKGZpaXMpOw0KLSAgICAgICAgaW1hZ2VEUyA9IG5ldyBEYXRhU291cmNlSW1wbCgiaW1hZ2UvanBlZyIsICJ0ZXN0LmpwZyIsIGltYWdlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAqIG91dHB1dCBmbG93DQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RfRmlsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB0aGF0IGlzIHR5cGljYWwgZnJvbSBhIEpBWC1XUyBhcHANCi0gICAgICAgIFN0cmluZyBzYW1wbGVKQVhCVGV4dCA9ICJzYW1wbGUgcmV0dXJuIHZhbHVlIjsNCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIG9iaiA9IG9mLmNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpOw0KLSAgICAgICAgb2JqLnNldEVjaG9TdHJpbmdSZXR1cm4oInNhbXBsZSByZXR1cm4gdmFsdWUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWEIgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgQXhpb20gdHJlZSBhcyBhbiBPTVNvdXJjZWRFbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIHR5cGljYWwgc3RydWN0dXJlIGlzDQotICAgICAgICAvLyAgIE9NIFNPQVBFbnZlbG9wZQ0KLSAgICAgICAgLy8gICBPTSBTT0FQQm9keQ0KLSAgICAgICAgLy8gICBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgc291cmNlZCBieSBhIEpBWEJCbG9ja0ltcGwgd2hpY2ggaXMgYmFja2VjZCBieSBhIEpBWEIgT2JqZWN0Lg0KLSAgICAgICAgTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZShvYmopOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBpcyBzZXQgb24gdGhlIEpBWFdTIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBqYXh3c01DID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBqYXh3c01DLnNldE1lc3NhZ2UobSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiBUaGUgZW5naW5lIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4NCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLA0KLSAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgaXMgY29udmVydGVkIGludG8gYW4gQXhpczIgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzTUMgPSBqYXh3c01DLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZVV0aWxzLnB1dE1lc3NhZ2VPbk1lc3NhZ2VDb250ZXh0KG0sIGpheHdzTUMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBZGQgb3RoZXIgcHJvcGVydGllcyB0byB0aGUgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTiwgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOw0KLSAgICAgICAgYXhpc01DLnNldFByb3BlcnR5KCJrZXlTdHJpbmciLCAidmFsdWVTdHJpbmciKTsNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eSgia2V5SW50ZWdlciIsIG5ldyBJbnRlZ2VyKDUpKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIEF4aW9tIHN0cnVjdHVyZSBpcyBpbnRhY3QNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIE9NU291cmNlZEVsZW1lbnQgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgc2ltdWxhdGUgcGVyc2lzdGluZyB0aGUgbWVzc2FnZQ0KLSAgICAgICAgRmlsZSB0aGVGaWxlID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyB0aGVGaWxlbmFtZSA9IG51bGw7DQotICAgICAgICB0aGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiTWVzc2FnZVBlcnNpc3RUZXN0IiwgbnVsbCk7DQotICAgICAgICAvL3RoZUZpbGUuZGVsZXRlT25FeGl0KCk7DQotICAgICAgICB0aGVGaWxlbmFtZSA9IHRoZUZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0dXAgYW4gb3V0cHV0IHN0cmVhbSB0byBhIHBoeXNpY2FsIGZpbGUNCi0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhlRmlsZSk7DQotDQotICAgICAgICAvLyBBdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiB3cml0aW5nIG9iamVjdHMgdG8gdGhlIA0KLSAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLSAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dE9ialN0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0U3RyZWFtKTsNCi0NCi0gICAgICAgIC8vIFRyeSB0byBzYXZlIHRoZSBtZXNzYWdlIGNvbnRleHQNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7DQotICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3QoYXhpc01DKTsNCi0NCi0gICAgICAgIC8vIENsb3NlIG91dCB0aGUgc3RyZWFtcw0KLSAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7DQotICAgICAgICBvdXRPYmpTdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOw0KLSAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi4uLi5zYXZlZCBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOw0KLSAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHRoZUZpbGUubGVuZ3RoKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgc2l6ZSBhZnRlciBzYXZlIFsiICsgZmlsZXNpemUNCi0gICAgICAgICAgICAgICAgKyAiXSAgIHRlbXAgZmlsZSA9IFsiICsgdGhlRmlsZW5hbWUgKyAiXSIpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIEF4aW9tIHN0cnVjdHVyZSBpcyBpbnRhY3QuICANCi0gICAgICAgIGVudiA9IGF4aXNNQy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgYm9keSA9IGVudi5nZXRCb2R5KCk7DQotICAgICAgICBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBvbXNlID0gKE9NU291cmNlZEVsZW1lbnQpIGNoaWxkOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghb21zZS5pc0V4cGFuZGVkKCkpOw0KLSAgICAgICAgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2ltdWxhdGUgdHJhbnNwb3J0DQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsNCi0NCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUNCi0gICAgICAgIC8vIHJlYWRlcg0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3VGV4dCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoc2FtcGxlSkFYQlRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHJlYWQgaW4gdGhlIHBlcnNpc3RlZCBtZXNzYWdlDQotICAgICAgICAvLyBTZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgDQotICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotDQotICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7DQotDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNQyA9IA0KLSAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBpblN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBpbiB0aW1lLCB0aGUgcmVzdG9yZWRNZXNzYWdlIHdpbGwgYmUgYSBmdWxsIHRyZWUuDQotICAgICAgICAvLyBUT0RPIElmIHRoaXMgY2hhbmdlcywgcGxlYXNlIGFkZCBtb3JlIGFzc2VydGlvbnMgaGVyZS4NCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgcGVyc2lzdGVkIHByb3BlcnRpZXMNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGV4Y2VwdGlvbiBtaWdodCBiZSBwZXJzaXN0ZWQuLi4uYnV0IGluIHRoZSB2ZXJ5IGxlYXN0IGl0IHNob3VsZA0KLSAgICAgICAgLy8gbm90IGNhdXNlIGFuIGV4Y2VwdGlvbi4NCi0gICAgICAgIFRocm93YWJsZSB0ID0gKFRocm93YWJsZSkgcmVzdG9yZWRNQy5nZXRQcm9wZXJ0eShDb25zdGFudHMuSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTik7DQotICAgICAgICBhc3NlcnRUcnVlKHQgPT0gbnVsbCB8fCB0IGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGtleVN0cmluZyBwcm9wZXJ0eSB3YXMgcGVyc2lzdGVkDQotICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcgPSAgKFN0cmluZykgcmVzdG9yZWRNQy5nZXRQcm9wZXJ0eSgia2V5U3RyaW5nIik7DQotICAgICAgICBhc3NlcnRUcnVlKCJ2YWx1ZVN0cmluZyIuZXF1YWxzKHZhbHVlU3RyaW5nKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUga2V5SW50ZWdlciBwcm9wZXJ0eSB3YXMgcGVyc2lzdGVkLg0KLSAgICAgICAgSW50ZWdlciB2YWx1ZUludGVnZXIgPSAgKEludGVnZXIpIHJlc3RvcmVkTUMuZ2V0UHJvcGVydHkoImtleUludGVnZXIiKTsNCi0gICAgICAgIGFzc2VydFRydWUodmFsdWVJbnRlZ2VyID09IDUpOw0KLSAgICAgICAgDQotICAgICAgICBheGlzTUMuc2V0UHJvcGVydHkoImtleUludGVnZXIiLCBuZXcgSW50ZWdlcig1KSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGVudiA9IHJlc3RvcmVkTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsNCi0gICAgICAgIFN0cmluZyByZXN0b3JlZFRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdG9yZWRUZXh0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKHNhbXBsZUpBWEJUZXh0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuZXF1YWxzKG5ld1RleHQpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPE9iamVjdD4NCi0gICAgICogb3V0cHV0IGZsb3cNCi0gICAgICogDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdF9Jbk1lbW9yeSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB0aGF0IGlzIHR5cGljYWwgZnJvbSBhIEpBWC1XUyBhcHANCi0gICAgICAgIFN0cmluZyBzYW1wbGVKQVhCVGV4dCA9ICJzYW1wbGUgcmV0dXJuIHZhbHVlIjsNCi0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIG9iaiA9IG9mLmNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpOw0KLSAgICAgICAgb2JqLnNldEVjaG9TdHJpbmdSZXR1cm4oInNhbXBsZSByZXR1cm4gdmFsdWUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWEIgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgQXhpb20gdHJlZSBhcyBhbiBPTVNvdXJjZWRFbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIHR5cGljYWwgc3RydWN0dXJlIGlzDQotICAgICAgICAvLyAgIE9NIFNPQVBFbnZlbG9wZQ0KLSAgICAgICAgLy8gICBPTSBTT0FQQm9keQ0KLSAgICAgICAgLy8gICBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgc291cmNlZCBieSBhIEpBWEJCbG9ja0ltcGwgd2hpY2ggaXMgYmFja2VjZCBieSBhIEpBWEIgT2JqZWN0Lg0KLSAgICAgICAgTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZShvYmopOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBpcyBzZXQgb24gdGhlIEpBWFdTIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBNZXNzYWdlQ29udGV4dCBqYXh3c01DID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBqYXh3c01DLnNldE1lc3NhZ2UobSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiBUaGUgZW5naW5lIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuDQotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4NCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLA0KLSAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgTWVzc2FnZUNvbnRleHQgaXMgY29udmVydGVkIGludG8gYW4gQXhpczIgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCBheGlzTUMgPSBqYXh3c01DLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgTWVzc2FnZVV0aWxzLnB1dE1lc3NhZ2VPbk1lc3NhZ2VDb250ZXh0KG0sIGpheHdzTUMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIEF4aW9tIHN0cnVjdHVyZSBpcyBpbnRhY3QNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgT01FbGVtZW50IGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIE9NU291cmNlZEVsZW1lbnQgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIE9NRGF0YVNvdXJjZSBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgc2ltdWxhdGUgcGVyc2lzdGluZyB0aGUgbWVzc2FnZSBpbiBtZW1vcnkNCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnYyID0gQ29weVV0aWxzLmNvcHkoZW52KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0LiAgDQotICAgICAgICBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgY2hpbGQgPSBib2R5LmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpOw0KLSAgICAgICAgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIGRzID0gb21zZS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRzIGluc3RhbmNlb2YgSkFYQkJsb2NrSW1wbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7DQotDQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlDQotICAgICAgICAvLyByZWFkZXINCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ld1RleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZUpBWEJUZXh0KSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyBjaGVjayB0aGUgY29waWVkIGVudmVsb3BlDQotICAgICAgICBib2R5ID0gZW52Mi5nZXRCb2R5KCk7DQotICAgICAgICBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBvbXNlID0gKE9NU291cmNlZEVsZW1lbnQpIGNoaWxkOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghb21zZS5pc0V4cGFuZGVkKCkpOw0KLSAgICAgICAgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCRGF0YVNvdXJjZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCi0gICAgICAgIGVudjIuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7DQotICAgICAgICBTdHJpbmcgcmVzdG9yZWRUZXh0ID0gYmFvcy50b1N0cmluZygpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3RvcmVkVGV4dCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucyhzYW1wbGVKQVhCVGV4dCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmVxdWFscyhuZXdUZXh0KSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAqIG91dHB1dCBmbG93DQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RfQXR0YWNobWVudHNfRmlsZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBUT0RPIEFkZCBhIFNXQVJlZiBhbmQgYSByYXcgYXR0YWNobWVudA0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdCB3aXRoIGFuIGF0dGFjaG1lbnQNCi0gICAgICAgIC8vIENyZWF0ZSBhIERhdGFIYW5kbGVyIHdpdGggdGhlIFN0cmluZyBEYXRhU291cmNlIG9iamVjdA0KLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoc3RyaW5nRFMpOw0KLQ0KLSAgICAgICAgLy9TdG9yZSB0aGUgZGF0YSBoYW5kbGVyIGluIEltYWdlRGVwb3QgYmVhbg0KLSAgICAgICAgb3JnLnRlc3QubXRvbS5PYmplY3RGYWN0b3J5IG9mID0gbmV3IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeSgpOw0KLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUltYWdlRGVwb3QoKTsNCi0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGRhdGFIYW5kbGVyKTsNCi0gICAgICAgIFNlbmRJbWFnZSBvYmogPSBvZi5jcmVhdGVTZW5kSW1hZ2UoKTsNCi0gICAgICAgIG9iai5zZXRJbnB1dChpbWFnZURlcG90KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWEIgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUgQXhpb20gdHJlZSBhcyBhbiBPTVNvdXJjZWRFbGVtZW50Lg0KLSAgICAgICAgLy8gVGhlIHR5cGljYWwgc3RydWN0dXJlIGlzDQotICAgICAgICAvLyAgIE9NIFNPQVBFbnZlbG9wZQ0KLSAgICAgICAgLy8gICBPTSBTT0FQQm9keQ0KLSAgICAgICAgLy8gICBPTVNvdXJjZWRFbGVtZW50IHRoYXQgaXMgc291cmNlZCBieSBhIEpBWEJCbG9ja0ltcGwgd2hpY2ggaXMgYmFja2VjZCBieSBhIEpBWEIgT2JqZWN0Lg0KLSAgICAgICAgTWVzc2FnZSBtID0gY3JlYXRlTWVzc2FnZShvYmopOw0KLSAgICAgICAgbS5zZXRNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgaXMgc2V0IG9uIHRoZSBKQVhXUyBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgamF4d3NNQyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgamF4d3NNQy5zZXRNZXNzYWdlKG0pOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGVuZ2luZSB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLg0KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uDQotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwNCi0gICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgSkFYLVdTIE1lc3NhZ2VDb250ZXh0IGlzIGNvbnZlcnRlZCBpbnRvIGFuIEF4aXMyIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgYXhpc01DID0gamF4d3NNQy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VVdGlscy5wdXRNZXNzYWdlT25NZXNzYWdlQ29udGV4dChtLCBqYXh3c01DLmdldEF4aXNNZXNzYWdlQ29udGV4dCgpKTsNCi0gICAgICAgIGF4aXNNQy5zZXRQcm9wZXJ0eShDb25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCAidHJ1ZSIgKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gYXhpc01DLmdldEVudmVsb3BlKCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsNCi0gICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBPTVNvdXJjZWRFbGVtZW50IG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHNpbXVsYXRlIHBlcnNpc3RpbmcgdGhlIG1lc3NhZ2UNCi0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG51bGw7DQotICAgICAgICBTdHJpbmcgdGhlRmlsZW5hbWUgPSBudWxsOw0KLSAgICAgICAgdGhlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIk1lc3NhZ2VQZXJzaXN0VGVzdCIsIG51bGwpOw0KLSAgICAgICAgLy90aGVGaWxlLmRlbGV0ZU9uRXhpdCgpOw0KLSAgICAgICAgdGhlRmlsZW5hbWUgPSB0aGVGaWxlLmdldE5hbWUoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVtcCBmaWxlID0gWyIgKyB0aGVGaWxlbmFtZSArICJdIik7DQotICAgICAgICANCi0gICAgICAgIC8vIFNldHVwIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBwaHlzaWNhbCBmaWxlDQotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoZUZpbGUpOw0KLQ0KLSAgICAgICAgLy8gQXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSANCi0gICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7DQotDQotICAgICAgICAvLyBUcnkgdG8gc2F2ZSB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBtZXNzYWdlIGNvbnRleHQuLi4uLiIpOw0KLSAgICAgICAgb3V0T2JqU3RyZWFtLndyaXRlT2JqZWN0KGF4aXNNQyk7DQotDQotICAgICAgICAvLyBDbG9zZSBvdXQgdGhlIHN0cmVhbXMNCi0gICAgICAgIG91dE9ialN0cmVhbS5mbHVzaCgpOw0KLSAgICAgICAgb3V0T2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsNCi0gICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4uc2F2ZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsNCi0gICAgICAgIGxvbmcgZmlsZXNpemUgPSB0aGVGaWxlLmxlbmd0aCgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIiArIGZpbGVzaXplDQotICAgICAgICAgICAgICAgICsgIl0gICB0ZW1wIGZpbGUgPSBbIiArIHRoZUZpbGVuYW1lICsgIl0iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0LiAgDQotICAgICAgICBlbnYgPSBheGlzTUMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGJvZHkgPSBlbnYuZ2V0Qm9keSgpOw0KLSAgICAgICAgY2hpbGQgPSBib2R5LmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZCBpbnN0YW5jZW9mIE9NU291cmNlZEVsZW1lbnQpOw0KLSAgICAgICAgb21zZSA9IChPTVNvdXJjZWRFbGVtZW50KSBjaGlsZDsNCi0gICAgICAgIGFzc2VydFRydWUoIW9tc2UuaXNFeHBhbmRlZCgpKTsNCi0gICAgICAgIGRzID0gb21zZS5nZXREYXRhU291cmNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGRzIGluc3RhbmNlb2YgSkFYQkJsb2NrSW1wbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFNpbXVsYXRlIHRyYW5zcG9ydA0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBPTU91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOw0KLSAgICAgICAgb3V0cHV0Rm9ybWF0LnNldE1pbWVCb3VuZGFyeSgiTUlNRUJvdW5kYXJ5X0F4aXMyUm9ja3MiKTsNCi0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG91dHB1dEZvcm1hdCk7DQotDQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIG91dHB1dCBpcyBjb3JyZWN0DQotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXdUZXh0KTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuaW5kZXhPZigiTUlNRUJvdW5kYXJ5X0F4aXMyUm9ja3MiKSA+IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmluZGV4T2Yoc2FtcGxlVGV4dCkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5pbmRleE9mKCI8c29hcGVudjpCb2R5PjxzZW5kSW1hZ2UgeG1sbnM9XCJ1cm46Ly9tdG9tLnRlc3Qub3JnXCI+PGlucHV0PjxpbWFnZURhdGE+PHhvcDpJbmNsdWRlIikgPiAwKTsNCi0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHJlYWQgaW4gdGhlIHBlcnNpc3RlZCBtZXNzYWdlDQotICAgICAgICAvLyBTZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhlRmlsZSk7DQotDQotICAgICAgICAvLyBhdHRhY2ggYSBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIG9iamVjdHMgZnJvbSB0aGUgDQotICAgICAgICAvLyBzdHJlYW0gY29ubmVjdGVkIHRvIHRoZSBmaWxlDQotICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotDQotICAgICAgICAvLyB0cnkgdG8gcmVzdG9yZSB0aGUgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3RvcmluZyBhIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7DQotDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQgcmVzdG9yZWRNQyA9IA0KLSAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIGluT2JqU3RyZWFtLmNsb3NlKCk7DQotICAgICAgICBpblN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIuLi4ucmVzdG9yZWQgbWVzc2FnZSBjb250ZXh0Li4uLi4iKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBpbiB0aW1lLCB0aGUgcmVzdG9yZWRNZXNzYWdlIHdpbGwgYmUgYSBmdWxsIHRyZWUuDQotICAgICAgICAvLyBUT0RPIElmIHRoaXMgY2hhbmdlcywgcGxlYXNlIGFkZCBtb3JlIGFzc2VydGlvbnMgaGVyZS4NCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2ltdWxhdGUgdHJhbnNwb3J0IG9uIHRoZSByZXN0b3JlZCBtZXNzYWdlDQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgZW52ID0gcmVzdG9yZWRNQy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgb3V0cHV0Rm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7DQotICAgICAgICBvdXRwdXRGb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXRNaW1lQm91bmRhcnkoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIik7DQotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBvdXRwdXRGb3JtYXQpOw0KLSAgICAgICAgU3RyaW5nIHJlc3RvcmVkVGV4dCA9IGJhb3MudG9TdHJpbmcoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN0b3JlZFRleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5jb250YWlucygiQm9keSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2YoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIikgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2Yoc2FtcGxlVGV4dCkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2YoIjxzb2FwZW52OkJvZHk+PHNlbmRJbWFnZSB4bWxucz1cInVybjovL210b20udGVzdC5vcmdcIj48aW5wdXQ+PGltYWdlRGF0YT48eG9wOkluY2x1ZGUiKSA+IDApOw0KLSAgICAgICAgDQotICAgICAgICAvLyBOb3cgdHJ5IHdhbGtpbmcgdGhlIHNhdmVkIGVudmVsb3BlIGFzIGFuIFhNTElucHV0U3RyZWFtLg0KLSAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIG1lc3NhZ2UgY29udGV4dCBhZ2Fpbg0KLSAgICAgICAgLy8gTm93IHJlYWQgaW4gdGhlIHBlcnNpc3RlZCBtZXNzYWdlDQotICAgICAgICAvLyBTZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGVGaWxlKTsNCi0NCi0gICAgICAgIC8vIGF0dGFjaCBhIHN0cmVhbSBjYXBhYmxlIG9mIHJlYWRpbmcgb2JqZWN0cyBmcm9tIHRoZSANCi0gICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0gICAgICAgIGluT2JqU3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGluU3RyZWFtKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzdG9yaW5nIGEgbWVzc2FnZSBjb250ZXh0IGFnYWluLi4uLi4iKTsNCi0NCi0gICAgICAgIHJlc3RvcmVkTUMgPSANCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KSBpbk9ialN0cmVhbS5yZWFkT2JqZWN0KCk7DQotICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLi4uLnJlc3RvcmVkIG1lc3NhZ2UgY29udGV4dC4uLi4uIik7ICAgIA0KLSAgICAgICAgZW52ID0gcmVzdG9yZWRNQy5nZXRFbnZlbG9wZSgpOw0KLSAgICAgICAgZW52LmJ1aWxkKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFVzZSB0cmVlIGFzIGlucHV0IHRvIFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgICAgT01YTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gKE9NWE1MU3RyZWFtUmVhZGVyKSBlbnYuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIElzc3VlIFhPUDpJbmNsdWRlIGV2ZW50cyBmb3Igb3B0aW1pemVkIE1UT00gdGV4dCBub2Rlcw0KLSAgICAgICAgeG1sU3RyZWFtUmVhZGVyLnNldElubGluZU1UT00oZmFsc2UpOw0KLSAgICAgICAgDQotICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG51bGw7DQotICAgICAgICB3aGlsZSh4bWxTdHJlYW1SZWFkZXIuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICBpZiAoeG1sU3RyZWFtUmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsNCi0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPXhtbFN0cmVhbVJlYWRlci5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgIGlmIChYT1BfSU5DTFVERS5lcXVhbHMocU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaHJlZlZhbHVlID0geG1sU3RyZWFtUmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKCIiLCAiaHJlZiIpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhyZWZWYWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgZGggPSgoT01BdHRhY2htZW50QWNjZXNzb3IpeG1sU3RyZWFtUmVhZGVyKS5nZXREYXRhSGFuZGxlcihocmVmVmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKGRoICE9IG51bGwpOyAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxPYmplY3Q+DQotICAgICAqIG91dHB1dCBmbG93DQotICAgICAqIA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RfQXR0YWNobWVudHNfSW5NZW1vcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVE9ETyBBZGQgYSBTV0FSZWYgYW5kIGEgcmF3IGF0dGFjaG1lbnQNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtQiBvYmplY3Qgd2l0aCBhbiBhdHRhY2htZW50DQotICAgICAgICAvLyBDcmVhdGUgYSBEYXRhSGFuZGxlciB3aXRoIHRoZSBTdHJpbmcgRGF0YVNvdXJjZSBvYmplY3QNCi0gICAgICAgIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKHN0cmluZ0RTKTsNCi0NCi0gICAgICAgIC8vU3RvcmUgdGhlIGRhdGEgaGFuZGxlciBpbiBJbWFnZURlcG90IGJlYW4NCi0gICAgICAgIG9yZy50ZXN0Lm10b20uT2JqZWN0RmFjdG9yeSBvZiA9IG5ldyBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3RvcnkoKTsNCi0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBvcmcudGVzdC5tdG9tLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7DQotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShkYXRhSGFuZGxlcik7DQotICAgICAgICBTZW5kSW1hZ2Ugb2JqID0gb2YuY3JlYXRlU2VuZEltYWdlKCk7DQotICAgICAgICBvYmouc2V0SW5wdXQoaW1hZ2VEZXBvdCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVhCIG9iamVjdCBpcyBzdG9yZWQgaW4gdGhlIEF4aW9tIHRyZWUgYXMgYW4gT01Tb3VyY2VkRWxlbWVudC4NCi0gICAgICAgIC8vIFRoZSB0eXBpY2FsIHN0cnVjdHVyZSBpcw0KLSAgICAgICAgLy8gICBPTSBTT0FQRW52ZWxvcGUNCi0gICAgICAgIC8vICAgT00gU09BUEJvZHkNCi0gICAgICAgIC8vICAgT01Tb3VyY2VkRWxlbWVudCB0aGF0IGlzIHNvdXJjZWQgYnkgYSBKQVhCQmxvY2tJbXBsIHdoaWNoIGlzIGJhY2tlY2QgYnkgYSBKQVhCIE9iamVjdC4NCi0gICAgICAgIE1lc3NhZ2UgbSA9IGNyZWF0ZU1lc3NhZ2Uob2JqKTsNCi0gICAgICAgIG0uc2V0TVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIGlzIHNldCBvbiB0aGUgSkFYV1MgTWVzc2FnZUNvbnRleHQNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGpheHdzTUMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIGpheHdzTUMuc2V0TWVzc2FnZShtKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBlbmdpbmUgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4NCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLg0KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsNCi0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksDQotICAgICAgICAgICAgICAgICAgICJTUElORSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIEpBWC1XUyBNZXNzYWdlQ29udGV4dCBpcyBjb252ZXJ0ZWQgaW50byBhbiBBeGlzMiBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IGF4aXNNQyA9IGpheHdzTUMuZ2V0QXhpc01lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlVXRpbHMucHV0TWVzc2FnZU9uTWVzc2FnZUNvbnRleHQobSwgamF4d3NNQy5nZXRBeGlzTWVzc2FnZUNvbnRleHQoKSk7DQotICAgICAgICBheGlzTUMuc2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgInRydWUiKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBeGlvbSBzdHJ1Y3R1cmUgaXMgaW50YWN0DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gYXhpc01DLmdldEVudmVsb3BlKCk7DQotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsNCi0gICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCk7DQotICAgICAgICBPTVNvdXJjZWRFbGVtZW50IG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBPTURhdGFTb3VyY2UgZHMgPSBvbXNlLmdldERhdGFTb3VyY2UoKTsNCi0gICAgICAgIGFzc2VydFRydWUoZHMgaW5zdGFuY2VvZiBKQVhCQmxvY2tJbXBsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHNpbXVsYXRlIHBlcnNpc3RpbmcgdGhlIG1lc3NhZ2UgaW4gbWVtb3J5DQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52MiA9IENvcHlVdGlscy5jb3B5KGVudik7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgQXhpb20gc3RydWN0dXJlIGlzIGludGFjdC4gIA0KLSAgICAgICAgZW52ID0gYXhpc01DLmdldEVudmVsb3BlKCk7DQotICAgICAgICBib2R5ID0gZW52LmdldEJvZHkoKTsNCi0gICAgICAgIGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJCbG9ja0ltcGwpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBTaW11bGF0ZSB0cmFuc3BvcnQNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgT01PdXRwdXRGb3JtYXQgb3V0cHV0Rm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7DQotICAgICAgICBvdXRwdXRGb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXRNaW1lQm91bmRhcnkoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIik7DQotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBvdXRwdXRGb3JtYXQpOw0KLQ0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3VGV4dCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmluZGV4T2YoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIikgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5pbmRleE9mKHNhbXBsZVRleHQpID4gMCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuaW5kZXhPZigiPHNvYXBlbnY6Qm9keT48c2VuZEltYWdlIHhtbG5zPVwidXJuOi8vbXRvbS50ZXN0Lm9yZ1wiPjxpbnB1dD48aW1hZ2VEYXRhPjx4b3A6SW5jbHVkZSIpID4gMCk7ICAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IGNoZWNrIHRoZSBjb3BpZWQgZW52ZWxvcGUNCi0gICAgICAgIGJvZHkgPSBlbnYyLmdldEJvZHkoKTsNCi0gICAgICAgIGNoaWxkID0gYm9keS5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoY2hpbGQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50KTsNCi0gICAgICAgIG9tc2UgPSAoT01Tb3VyY2VkRWxlbWVudCkgY2hpbGQ7DQotICAgICAgICBhc3NlcnRUcnVlKCFvbXNlLmlzRXhwYW5kZWQoKSk7DQotICAgICAgICBkcyA9IG9tc2UuZ2V0RGF0YVNvdXJjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkcyBpbnN0YW5jZW9mIEpBWEJEYXRhU291cmNlKTsNCi0gICAgICAgICAgDQotICAgICAgICAvLyBTaW11bGF0ZSB0cmFuc3BvcnQgb24gdGhlIGNvcGllZCBtZXNzYWdlDQotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgb3V0cHV0Rm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7DQotICAgICAgICBvdXRwdXRGb3JtYXQuc2V0RG9PcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgIG91dHB1dEZvcm1hdC5zZXRNaW1lQm91bmRhcnkoIk1JTUVCb3VuZGFyeV9BeGlzMlJvY2tzIik7DQotICAgICAgICBlbnYyLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgb3V0cHV0Rm9ybWF0KTsNCi0gICAgICAgIFN0cmluZyByZXN0b3JlZFRleHQgPSBiYW9zLnRvU3RyaW5nKCk7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdG9yZWRUZXh0KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmNvbnRhaW5zKCJzb2FwIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoIkVudmVsb3BlIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN0b3JlZFRleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3RvcmVkVGV4dC5pbmRleE9mKCJNSU1FQm91bmRhcnlfQXhpczJSb2NrcyIpID4gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGF0dGFjaG1lbnQgaXMgbm90IGlubGluZWQNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2Yoc2FtcGxlVGV4dCkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdG9yZWRUZXh0LmluZGV4T2YoIjxzb2FwZW52OkJvZHk+PHNlbmRJbWFnZSB4bWxucz1cInVybjovL210b20udGVzdC5vcmdcIj48aW5wdXQ+PGltYWdlRGF0YT48eG9wOkluY2x1ZGUiKSA+IDApOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKE9iamVjdCBqYXhiT2JqKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsNCi0NCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5DQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQ29udGV4dA0KLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0NCi0gICAgICAgICAgICAgICAgbmV3IEpBWEJCbG9ja0NvbnRleHQoamF4Yk9iai5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgLy8gQ3JlYXRlIGEgSkFYQkJsb2NrIHVzaW5nIHRoZSBFY2hvIG9iamVjdCBhcyB0aGUgY29udGVudC4gVGhpcyBzaW11bGF0ZXMNCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgRGlzcGF0Y2g8T2JqZWN0PiBjbGllbnQNCi0gICAgICAgIEJsb2NrIGJsb2NrID0gYmYuY3JlYXRlRnJvbShqYXhiT2JqLCBjb250ZXh0LCBudWxsKTsNCi0NCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4NCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsNCi0gICAgICAgIHJldHVybiBtOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VSUENUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVJQQ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWFiMGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVJQQ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LkpBWEJCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmhlYWRlcnMuQ29uZmlnQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaGVhZGVycy5Db25maWdIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOwotaW1wb3J0IG9yZy50ZXN0LnN0b2NrMS5PYmplY3RGYWN0b3J5OwotaW1wb3J0IG9yZy50ZXN0LnN0b2NrMS5TdG9ja1ByaWNlOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKiBNZXNzYWdlVGVzdHMKLSAqIFRlc3RzIHRvIGNyZWF0ZSBhbmQgdmFsaWRhdGUgTWVzc2FnZSBwcm9jZXNzaW5nCi0gKiBUaGVzZSBhcmUgbm90IGNsaWVudC9zZXJ2ZXIgdGVzdHMuICBJbnN0ZWFkIHRoZSB0ZXN0cyBzaW11bGF0ZSB0aGUgcHJvY2Vzc2luZyBvZiBhIE1lc3NhZ2UgZHVyaW5nCi0gKiBjbGllbnQvc2VydmVyIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUlBDVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvLyBTdHJpbmcgdGVzdCB2YXJpYWJsZXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc29hcDExZW52ID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc29hcDEyZW52ID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlSGVhZDExID0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgc29hcDExZW52ICsgIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZUhlYWQxMiA9Ci0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiIiArIHNvYXAxMmVudiArICJcIj4iICsKLSAgICAgICAgIjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+IjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVUYWlsID0gCi0gICAgICAgICI8L3NvYXBlbnY6Qm9keT48L3NvYXBlbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlVGV4dCA9Ci0gICAgICAgICI8bTpvcCB4bWxuczptPSd1cm46Ly9zYW1wbGUnPiIgKwotCQkiPG06cGFyYW0geG1sbnM6cHJlPSd1cm46Ly9zdG9jazEudGVzdC5vcmcnIHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhzaTp0eXBlPSdwcmU6U3RvY2tQcmljZSc+IiArCi0JCSI8cHJpY2U+MTAwPC9wcmljZT4iICsKLQkJIjwvbTpwYXJhbT4iICsKLSAgICAgICAgIjwvbTpvcD4iOwotCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZTExID0gCi0gICAgICAgIHNhbXBsZUVudmVsb3BlSGVhZDExICsKLSAgICAgICAgc2FtcGxlVGV4dCArCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGUxMiA9IAotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQxMiArCi0gICAgICAgIHNhbXBsZVRleHQgKwotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7Ci0gICAgICAgIAotCQotCXByaXZhdGUgc3RhdGljIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkKLQlwdWJsaWMgTWVzc2FnZVJQQ1Rlc3RzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNZXNzYWdlUlBDVGVzdHMoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEpBWEJCbG9jayBjb250YWluaW5nIGEgSkFYLUIgYnVzaW5lc3Mgb2JqZWN0IAotICAgICAqIGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBQcm94eSBvdXRwdXQgZmxvdwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3R5bGUgaXMgUlBDLCBJbmRpY2F0ZSB0aGUgT3BlcmF0aW9uIFFOYW1lCi0gICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuUlBDKTsKLSAgICAgICAgUU5hbWUgb3BRTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgIm9wIiwgIm0iKTsKLSAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KG9wUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBiZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KFN0b2NrUHJpY2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IG9mID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU3RvY2tQcmljZSBvYmogPSBvZi5jcmVhdGVTdG9ja1ByaWNlKCk7Ci0gICAgICAgIG9iai5zZXRQcmljZSgiMTAwIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIEVsZW1lbnQKLSAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgInBhcmFtIiwgIm0iKTsKLSAgICAgICAgSkFYQkVsZW1lbnQgZSA9IG5ldyBKQVhCRWxlbWVudChwYXJhbVFOYW1lLCBTdG9ja1ByaWNlLmNsYXNzLCBvYmopOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgSkFYQkJsb2NrIHVzaW5nIHRoZSBwYXJhbSBvYmplY3QgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIFByb3h5IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20oZSwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gT24gYW4gb3V0Ym91bmQgZmxvdywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBNZXNzYWdlIAotICAgICAgICAvLyB0byBhbiBPTUVsZW1lbnQsIHNwZWNpZmljYWxseSBhbiBPTSBTT0FQRW52ZWxvcGUsIAotICAgICAgICAvLyBzbyB3ZSBjYW4gc2V0IGl0IG9uIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudiA9IAotICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSAKLSAgICAgICAgLy8gSFRUUCBjbGllbnQuCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIm06b3AiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygibTpwYXJhbSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCIxMDAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiQm9keSIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgCi0gICAgICogYW5kIHNpbXVsYXRlIGEgbm9ybWFsIFByb3h5IG91dHB1dCBmbG93Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQk91dGZsb3dQZXJmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICAKLSAgICAgICAgLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3R5bGUgaXMgUlBDLCBJbmRpY2F0ZSB0aGUgT3BlcmF0aW9uIFFOYW1lCi0gICAgICAgIG0uc2V0U3R5bGUoU3R5bGUuUlBDKTsKLSAgICAgICAgUU5hbWUgb3BRTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgIm9wIiwgIm0iKTsKLSAgICAgICAgbS5zZXRPcGVyYXRpb25FbGVtZW50KG9wUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBiZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KFN0b2NrUHJpY2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3RGYWN0b3J5IG9mID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU3RvY2tQcmljZSBvYmogPSBvZi5jcmVhdGVTdG9ja1ByaWNlKCk7Ci0gICAgICAgIG9iai5zZXRQcmljZSgiMTAwIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWC1CIEVsZW1lbnQKLSAgICAgICAgUU5hbWUgcGFyYW1RTmFtZSA9IG5ldyBRTmFtZSgidXJuOi8vc2FtcGxlIiwgInBhcmFtIiwgIm0iKTsKLSAgICAgICAgSkFYQkVsZW1lbnQgZSA9IG5ldyBKQVhCRWxlbWVudChwYXJhbVFOYW1lLCBTdG9ja1ByaWNlLmNsYXNzLCBvYmopOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgSkFYQkJsb2NrIHVzaW5nIHRoZSBwYXJhbSBvYmplY3QgYXMgdGhlIGNvbnRlbnQuICBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIFByb3h5IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20oZSwgY29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gT24gYW4gb3V0Ym91bmQgZmxvdywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBNZXNzYWdlIAotICAgICAgICAvLyB0byBhbiBPTUVsZW1lbnQsIHNwZWNpZmljYWxseSBhbiBPTSBTT0FQRW52ZWxvcGUsIAotICAgICAgICAvLyBzbyB3ZSBjYW4gc2V0IGl0IG9uIHRoZSBBeGlzMiBNZXNzYWdlQ29udGV4dAotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudiA9IAotICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFBFUkZPUk1BTkNFIENIRUNLOgotICAgICAgICAvLyBUaGUgcGFyYW0gaW4gdGhlIGJvZHkgc2hvdWxkIGJlIGFuIE9NU291cmNlZEVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IG8gPSBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPTVNvdXJjZWRFbGVtZW50SW1wbClvKS5pc0V4cGFuZGVkKCkgPT0gZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcobmV3VGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygibTpvcCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJtOnBhcmFtIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIjEwMCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUVudmVsb3BlMTIpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEpBWEJJbmZsb3coU3RyaW5nIHNhbXBsZUpBWEJFbnZlbG9wZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgT00gb3V0IG9mIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MLiAgVGhpcwotICAgICAgICAvLyBzaW11bGF0ZXMgd2hhdCBBeGlzMiB3aWxsIGJlIGRvaW5nIHdpdGggdGhlIGluYm91bmQgbWVzc2FnZS4gCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlSkFYQkVudmVsb3BlKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZSBmcm9tIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIFJQQwotICAgICAgICBtLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gdG8gZGVzZXJpYWxpemUgdGhlIEpBWC1CIG9iamVjdCBjb250ZW50IGluIHRoZSBtZXNzYWdlLgotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChTdG9ja1ByaWNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBKQVhCQmxvY2sgdGhhdCB3cmFwcyB0aGUgY29udGVudAotICAgICAgICBCbG9jayBiID0gbS5nZXRCb2R5QmxvY2soY29udGV4dCwgYmYpOwotICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNQSU5FIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBidXNpbmVzcyBvYmplY3QgZnJvbSB0aGUgYmxvY2ssIHdoaWNoIHNob3VsZCBiZSBhIAotICAgICAgICAvLyBKQVgtQiBvYmplY3QKLSAgICAgICAgT2JqZWN0IGJvID0gYi5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb2JqZWN0IHdhcyByZXR1cm5lZAotICAgICAgICBhc3NlcnROb3ROdWxsKGJvKTsKLSAgICAgICAgaWYgKGJvIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIGJvID0gKChKQVhCRWxlbWVudCkgYm8pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0b2NrUHJpY2UpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29udGVudCBvZiB0aGF0IG9iamVjdCBpcyBjb3JyZWN0Ci0gICAgICAgIFN0b2NrUHJpY2Ugb2JqID0gKFN0b2NrUHJpY2UpIGJvOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iaik7Ci0gICAgICAgIGFzc2VydFRydWUob2JqLmdldFByaWNlKCkuZXF1YWxzKCIxMDAiKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+XG4iICsKLSAgICAgICAgICAgICAgICAiXHQ8c29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdDxuczI6Q29uZmlnSGVhZGVyMiB4bWxuczpuczI9XCJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0XCI+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdFx0PG1lc3NhZ2U+Y29uZmlnSGVhZGVyMjwvbWVzc2FnZT5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PC9uczI6Q29uZmlnSGVhZGVyMj5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PG5zMjpDb25maWdIZWFkZXIzIHhtbG5zOm5zMj1cImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczRcIj5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0XHQ8bWVzc2FnZT54eXo8L21lc3NhZ2U+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdDwvbnMyOkNvbmZpZ0hlYWRlcjM+XG4iICsKLSAgICAgICAgICAgICAgICAiXHQ8L3NvYXBlbnY6SGVhZGVyPlxuIiArCi0gICAgICAgICAgICAgICAgIlx0PHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PHJwY09wOkNvbmZpZ1Jlc3BvbnNlIHhtbG5zOnJwY09wPVwiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNFwiPlxuIiArCi0gICAgICAgICAgICAgICAgIlx0XHQ8cnBjUGFyYW06Q29uZmlnQm9keSB4bWxuczpycGNQYXJhbT1cImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczRcIj5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0XHQ8bWVzc2FnZT5Hb3QgaXQ8L21lc3NhZ2U+XG4iICsKLSAgICAgICAgICAgICAgICAiXHRcdDwvcnBjUGFyYW06Q29uZmlnQm9keT5cbiIgKwotICAgICAgICAgICAgICAgICJcdFx0PC9ycGNQYXJhbTpDb25maWdSZXNwb25zZT5cbiIgKwotICAgICAgICAgICAgICAgICJcdDwvc29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgT00gb3V0IG9mIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MLiAgVGhpcwotICAgICAgICAvLyBzaW11bGF0ZXMgd2hhdCBBeGlzMiB3aWxsIGJlIGRvaW5nIHdpdGggdGhlIGluYm91bmQgbWVzc2FnZS4gCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoeG1sKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZSBmcm9tIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGFjY2Vzc2VkIGFzIFJQQwotICAgICAgICBtLnNldFN0eWxlKFN0eWxlLlJQQyk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICAgICAgLy8gdG8gZGVzZXJpYWxpemUgdGhlIEpBWC1CIG9iamVjdCBjb250ZW50IGluIHRoZSBtZXNzYWdlLgotICAgICAgICBKQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChDb25maWdIZWFkZXIuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotCi0gICAgICAgIC8vIEdldCB0aGUgSkFYQkJsb2NrIHRoYXQgd3JhcHMgdGhlIGNvbnRlbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBtLmdldEhlYWRlckJsb2NrKCJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IiwiQ29uZmlnSGVhZGVyMiIsIGNvbnRleHQsIGJmKTsKLQotICAgICAgICAvLyBHZXQgdGhlIGJ1c2luZXNzIG9iamVjdCBmcm9tIHRoZSBibG9jaywgd2hpY2ggc2hvdWxkIGJlIGEgCi0gICAgICAgIC8vIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb2JqZWN0IHdhcyByZXR1cm5lZAotICAgICAgICBhc3NlcnROb3ROdWxsKGJvKTsKLSAgICAgICAgaWYgKGJvIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIGJvID0gKChKQVhCRWxlbWVudCkgYm8pLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIENvbmZpZ0hlYWRlcik7Ci0gICAgICAgIAotICAgICAgICBCbG9jayBibG9jazIgPSBtLmdldEJvZHlCbG9jayhjb250ZXh0LCBiZik7Ci0gICAgICAgIE9iamVjdCBiMiA9IGJsb2NrMi5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgaWYgKGIyIGluc3RhbmNlb2YgSkFYQkVsZW1lbnQpIHsKLSAgICAgICAgICAgIGIyID0gKChKQVhCRWxlbWVudCkgYjIpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShiMiBpbnN0YW5jZW9mIENvbmZpZ0JvZHkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL01lc3NhZ2VUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YWM3MmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvTWVzc2FnZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVNvdXJjZWRFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5sbG9tLk9NU291cmNlZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkN1c3RvbUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhc291cmNlLmpheGIuSkFYQkRTQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFzb3VyY2UuamF4Yi5KQVhCRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCQmxvY2tDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuSkFYQkJsb2NrRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5TQUFKQ29udmVydGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZmFjdG9yeS5YTUxTdHJpbmdCbG9ja0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuU0FBSkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LlRlc3RMb2dnZXI7Ci0KLWltcG9ydCB0ZXN0LkVjaG9TdHJpbmdSZXNwb25zZTsKLWltcG9ydCB0ZXN0Lk9iamVjdEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogTWVzc2FnZVRlc3RzCi0gKiBUZXN0cyB0byBjcmVhdGUgYW5kIHZhbGlkYXRlIE1lc3NhZ2UgcHJvY2Vzc2luZwotICogVGhlc2UgYXJlIG5vdCBjbGllbnQvc2VydmVyIHRlc3RzLiAgCi0gKiBJbnN0ZWFkIHRoZSB0ZXN0cyBzaW11bGF0ZSB0aGUgcHJvY2Vzc2luZyBvZiBhIE1lc3NhZ2UgZHVyaW5nIGNsaWVudC9zZXJ2ZXIgcHJvY2Vzc2luZy4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vIFN0cmluZyB0ZXN0IHZhcmlhYmxlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwMTFlbnYgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzb2FwMTJlbnYgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGVIZWFkMTEgPQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIgKyBzb2FwMTFlbnYgKyAiXCI+IiArCi0gICAgICAgICI8c29hcGVudjpIZWFkZXIgLz48c29hcGVudjpCb2R5PiI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlSGVhZDEyID0KLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCIiICsgc29hcDEyZW52ICsgIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZVRhaWwgPSAKLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0KLQkJIjxwcmU6YSB4bWxuczpwcmU9XCJ1cm46Ly9zYW1wbGVcIj4iICsKLQkJIjxiPkhlbGxvPC9iPiIgKwotCQkiPGM+V29ybGQ8L2M+IiArCi0JCSI8L3ByZTphPiI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZURvdWJsZSA9Ci0gICAgICAgICI8cHJlOmEgeG1sbnM6cHJlPVwidXJuOi8vc2FtcGxlXCI+IiArCi0gICAgICAgICI8Yj5IZWxsbzwvYj4iICsKLSAgICAgICAgIjxjPldvcmxkPC9jPiIgKwotICAgICAgICAiPC9wcmU6YT4iICsKLSAgICAgICAgIjxwcmU6YWEgeG1sbnM6cHJlPVwidXJuOi8vc2FtcGxlXCI+IiArCi0gICAgICAgICI8Yj5IZWxsbzwvYj4iICsKLSAgICAgICAgIjxjPldvcmxkPC9jPiIgKwotICAgICAgICAiPC9wcmU6YWE+IjsKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlRW52ZWxvcGUxMSA9IAotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQxMSArCi0gICAgICAgIHNhbXBsZVRleHQgKwotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlMTIgPSAKLSAgICAgICAgc2FtcGxlRW52ZWxvcGVIZWFkMTIgKwotICAgICAgICBzYW1wbGVUZXh0ICsKLSAgICAgICAgc2FtcGxlRW52ZWxvcGVUYWlsOwotICAgICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlSkFYQlRleHQgPSAKLSAgICAgICAgIjxlY2hvU3RyaW5nUmVzcG9uc2UgeG1sbnM9XCJodHRwOi8vdGVzdFwiPiIgKwotICAgICAgICAiPGVjaG9TdHJpbmdSZXR1cm4+c2FtcGxlIHJldHVybiB2YWx1ZTwvZWNob1N0cmluZ1JldHVybj4iICsgCi0gICAgICAgICI8L2VjaG9TdHJpbmdSZXNwb25zZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVKQVhCRW52ZWxvcGUxMSA9IAotICAgICAgICBzYW1wbGVFbnZlbG9wZUhlYWQxMSArIAotICAgICAgICBzYW1wbGVKQVhCVGV4dCArIAotICAgICAgICBzYW1wbGVFbnZlbG9wZVRhaWw7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUpBWEJFbnZlbG9wZTEyID0gCi0gICAgICAgIHNhbXBsZUVudmVsb3BlSGVhZDEyICsgCi0gICAgICAgIHNhbXBsZUpBWEJUZXh0ICsgCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZU5vSGVhZGVyMTEgPQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIrIHNvYXAxMWVudiArIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsgCi0gICAgICAgIHNhbXBsZVRleHQgKyAKLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVFbnZlbG9wZU5vSGVhZGVyMTIgPQotICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cIiIrIHNvYXAxMmVudiArIlwiPiIgKwotICAgICAgICAiPHNvYXBlbnY6Qm9keT4iICsgCi0gICAgICAgIHNhbXBsZVRleHQgKyAKLSAgICAgICAgIjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIHNhbXBsZVFOYW1lID0gbmV3IFFOYW1lKCJ1cm46Ly9zYW1wbGUiLCAiYSIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIAotICAgIHByaXZhdGUgVzNDRW5kcG9pbnRSZWZlcmVuY2UgdzNjRVBSOwotICAgIHByaXZhdGUgU3VibWlzc2lvbkVuZHBvaW50UmVmZXJlbmNlIHN1YkVQUjsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICAKLSAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyIHczY0J1aWxkZXIgPSBuZXcgVzNDRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHczY0J1aWxkZXIgPSB3M2NCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgdzNjQnVpbGRlciA9IHczY0J1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHczY0VQUiA9IHczY0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgCi0gICAgICAgIFN1Ym1pc3Npb25FbmRwb2ludFJlZmVyZW5jZUJ1aWxkZXIgc3ViQnVpbGRlciA9IG5ldyBTdWJtaXNzaW9uRW5kcG9pbnRSZWZlcmVuY2VCdWlsZGVyKCk7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBzdWJCdWlsZGVyLmFkZHJlc3MoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuc2VydmljZU5hbWUobmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpKTsKLSAgICAgICAgc3ViQnVpbGRlciA9IHN1YkJ1aWxkZXIuZW5kcG9pbnROYW1lKG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QiLCAiVGVzdFBvcnQiKSk7Ci0gICAgICAgIHN1YkVQUiA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZVRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlVGVzdHMoU3RyaW5nIGFyZzApIHsKLSAgICAgICAgc3VwZXIoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93LiBJbgotICAgICAqIGFkZGl0aW9uIHRoZSB0ZXN0IG1ha2VzIHN1cmUgdGhhdCB0aGUgWE1MU3RyaW5nIGJsb2NrIGlzIG5vdCBleHBhbmRlZCBkdXJpbmcgdGhpcyBwcm9jZXNzLgotICAgICAqIChFeHBhbmRpbmcgdGhlIGJsb2NrIGRlZ3JhZGVzIHBlcmZvcm1hbmNlKS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdPdXRmbG93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLQotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgZiA9Ci0gICAgICAgICAgICAgICAgKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTdHJpbmc+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzYW1wbGVUZXh0LCBudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgLy8gT24gYW4gb3V0Ym91bmQgZmxvdywgd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBNZXNzYWdlCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwKLSAgICAgICAgLy8gc28gd2UgY2FuIHNldCBpdCBvbiB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYgPQotICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKSBtLmdldEFzT01FbGVtZW50KCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICJPTSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBQRVJGT1JNQU5DRSBDSEVDSzoKLSAgICAgICAgLy8gVGhlIGVsZW1lbnQgaW4gdGhlIGJvZHkgc2hvdWxkIGJlIGFuIE9NU291cmNlZEVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IG8gPSBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPTVNvdXJjZWRFbGVtZW50SW1wbCkgbykuaXNFeHBhbmRlZCgpID09IGZhbHNlKTsKLQotICAgICAgICAvLyBTZXJpYWxpemUgdGhlIEVudmVsb3BlIHVzaW5nIHRoZSBzYW1lIG1lY2hhbmlzbSBhcyB0aGUKLSAgICAgICAgLy8gSFRUUCBjbGllbnQuCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoc2FtcGxlVGV4dCkpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiQm9keSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxTdHJpbmc+IGZsb3cgd2l0aCBhbgotICAgICAqIGFwcGxpY2F0aW9uIGhhbmRsZXIuCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nT3V0ZmxvdzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0KLSAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiBUaGlzIHNpbXVsYXRlcwotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFN0cmluZz4gY2xpZW50Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNhbXBsZVRleHQsIG51bGwsIG51bGwpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgSkFYLVdTIGhhbmRsZXIsIHRoZSBNZXNzYWdlIGlzIGNvbnZlcnRlZCBpbnRvIGEgU09BUEVudmVsb3BlCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBtLmdldEFzU09BUEVudmVsb3BlKCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIlNPQVBFTlZFTE9QRSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgYXNzdW1lIHRoYXQgaXQKLSAgICAgICAgLy8gZG9lcy4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYSIuZXF1YWxzKG5hbWUpKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkIGF0IHRoaXMgcG9pbnQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIEFmdGVyIHRoZSBoYW5kbGVyIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2UgaXMgb2J0YWluZWQgYXMgYW4gT00KLSAgICAgICAgT01FbGVtZW50IG9tID0gbS5nZXRBc09NRWxlbWVudCgpOwotCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZQotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgbmV3IE9NT3V0cHV0Rm9ybWF0KCkpOwotCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhuZXdUZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIGVtcHR5IFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93IHdpdGggYW4gYXBwbGljYXRpb24gaGFuZGxlci4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIERJU0FCTEVEIFRISVMgVEVTVC4gVEhFIFRFU1QgSVMgTk9UIFZBTElEIEJFQ0FVU0UgQU4gQVRURU1QVCBXQVMgCi0gICAgICogTUFERSBUTyBBREQgQSBCTE9DSyBUSEFUIElTIE5PVCBBTiBFTEVNRU5ULgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIF90ZXN0U3RyaW5nT3V0Zmxvd0VtcHR5U3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBTYW1wbGUgdGV4dCBpcyB3aGl0ZXNwYWNlLiAgVGhlcmUgaXMgbm8gZWxlbWVudAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHdoaXRlU3BhY2VUZXh0ID0gIjwhLS0gQ29tbWVudCAtLT4iOwotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U3RyaW5nPiBjbGllbnQKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBmLmNyZWF0ZUZyb20od2hpdGVTcGFjZVRleHQsIG51bGwsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoZSBibG9jayB0byB0aGUgbWVzc2FnZSBhcyBub3JtYWwgYm9keSBjb250ZW50LgotICAgICAgICBtLnNldEJvZHlCbG9jayhibG9jayk7Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIEpBWC1XUyBoYW5kbGVyLCB0aGUgTWVzc2FnZSBpcyBjb252ZXJ0ZWQgaW50byBhIFNPQVBFbnZlbG9wZQotICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlID0gbS5nZXRBc1NPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU09BUEVOVkVMT1BFIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gTm9ybWFsbHkgdGhlIGhhbmRsZXIgd291bGQgbm90IHRvdWNoIHRoZSBib2R5Li4uYnV0IGZvciBvdXIgc2NlbmFyaW8sIAotICAgICAgICAvLyBhc3N1bWUgdGhhdCBpdCBkb2VzLgotICAgICAgICAvLyBUaGUgd2hpdGVzcGFjZSBpcyBub3QgcHJlc2VydmVkLCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gZmlyc3QgY2hpbGQgaW4gdGhlIGJvZHkKLSAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQgYXQgdGhpcyBwb2ludAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZnRlciB0aGUgaGFuZGxlciBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlIGlzIG9idGFpbmVkIGFzIGFuIE9NCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgbmV3IE9NT3V0cHV0Rm9ybWF0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhuZXdUZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgICAgIAotICAgIH0KLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIHdpdGggMiBlbGVtZW50cyBhbmQgc2ltdWxhdGUgYSAKLSAgICAgKiBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBmbG93IHdpdGggYW4gYXBwbGljYXRpb24gaGFuZGxlci4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBSRVZJRVcgVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2UgKGEpIGl0IGZhaWxzIGFuZCAoYikgd2UgZG9uJ3QgYmVsaWV2ZSB0aGlzCi0gICAgICogaXMgYWxsb3dlZCBkdWUgYnkgV1NJLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIF90ZXN0U3RyaW5nT3V0Zmxvd0RvdWJsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgMS4xIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZShQcm90b2NvbC5zb2FwMTEpOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBkaXNwYXRjaDxTdHJpbmc+IGNsaWVudAotICAgICAgICAvLyBJbiB0aGlzIGNhc2UgdGhlIHNhbXBsZSBzdHJpbmcgY29udGFpbnMgMiBlbGVtZW50cyBhIGFuZCBhYQotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbSh0aGlzLnNhbXBsZURvdWJsZSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZGQgdGhlIGJsb2NrIHRvIHRoZSBtZXNzYWdlIGFzIG5vcm1hbCBib2R5IGNvbnRlbnQuCi0gICAgICAgIG0uc2V0Qm9keUJsb2NrKGJsb2NrKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgSkFYLVdTIGhhbmRsZXIsIHRoZSBNZXNzYWdlIGlzIGNvbnZlcnRlZCBpbnRvIGEgU09BUEVudmVsb3BlCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBtLmdldEFzU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICJTT0FQRU5WRUxPUEUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgCi0gICAgICAgIC8vIGFzc3VtZSB0aGF0IGl0IGRvZXMuCi0gICAgICAgIFN0cmluZyBuYW1lID0gc29hcEVudmVsb3BlLmdldEJvZHkoKS5nZXRGaXJzdENoaWxkKCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoImEiLmVxdWFscyhuYW1lKSk7Ci0gICAgICAgIG5hbWUgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldExhc3RDaGlsZCgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJhYSIuZXF1YWxzKG5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQgYXQgdGhpcyBwb2ludAotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBZnRlciB0aGUgaGFuZGxlciBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlIGlzIG9idGFpbmVkIGFzIGFuIE9NCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG9tLnNlcmlhbGl6ZUFuZENvbnN1bWUoYmFvcywgbmV3IE9NT3V0cHV0Rm9ybWF0KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gVG8gY2hlY2sgdGhhdCB0aGUgb3V0cHV0IGlzIGNvcnJlY3QsIGdldCB0aGUgU3RyaW5nIGNvbnRlbnRzIG9mIHRoZSAKLSAgICAgICAgLy8gcmVhZGVyCi0gICAgICAgIFN0cmluZyBuZXdUZXh0ID0gYmFvcy50b1N0cmluZygpOwotICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZyhuZXdUZXh0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLQkvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nIGFuZCBzaW11bGF0ZSBhIG5vcm1hbCBEaXNwYXRjaDxTdHJpbmc+IGlucHV0IGZsb3cKLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3dfc29hcDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0U3RyaW5nSW5mbG93KHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3dfc29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0U3RyaW5nSW5mbG93KHNhbXBsZUVudmVsb3BlMTIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0U3RyaW5nSW5mbG93KFN0cmluZyBzYW1wbGVFbnZlbG9wZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlIGlucHV0Ci0gICAgICAgIC8vIE9NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlRW52ZWxvcGUpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgaW5mbG93ID0gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzcik7Ci0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoaW5mbG93LCBudWxsKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0KLSAgICAgICAgLy8gVGhlIEpBWC1XUyBsYXllciBjcmVhdGVzIGEgTWVzc2FnZSBmcm9tIHRoZSBPTQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBib29sZWFuIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4KLSAgICAgICAgLy8gaXMgdGhlIHByb3h5IGNvZGUgd2lsbCBhc2sgZm9yIHRoZSBidXNpbmVzcyBvYmplY3QgKFN0cmluZykuCi0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkgPQotICAgICAgICAgICAgICAgIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIEJsb2NrIGJsb2NrID0gbS5nZXRCb2R5QmxvY2sobnVsbCwgYmxvY2tGYWN0b3J5KTsKLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7Ci0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBTdHJpbmcpOwotCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgYmUgY29uc3VtZWQKLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMoYm8udG9TdHJpbmcoKSkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgQmxvY2sgcmVwcmVzZW50aW5nIGFuIFhNTFN0cmluZyBhbmQgc2ltdWxhdGUgYSBub3JtYWwgRGlzcGF0Y2g8U3RyaW5nPiBpbnB1dCBmbG93Ci0gICAgICogd2l0aCBhIEpBWC1XUyBIYW5kbGVyCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93Ml9zb2FwMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RTdHJpbmdJbmZsb3cyKHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3cyX3NvYXAxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IHJ1biB0ZXN0IGlmIGFuIFNBQUogMS4zIE1lc3NhZ2VGYWN0b3J5IGlzIGF2YWlsYWJsZQotICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZiA9IGdldFNBQUpDb252ZXJ0ZXIoKS5jcmVhdGVNZXNzYWdlRmFjdG9yeShzb2FwMTJlbnYpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGlmIChtZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBfdGVzdFN0cmluZ0luZmxvdzIoc2FtcGxlRW52ZWxvcGUxMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFN0cmluZ0luZmxvdzIoU3RyaW5nIHNhbXBsZUVudmVsb3BlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQKLSAgICAgICAgLy8gT00KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLQotICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gdGhlIE9NCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAiT00iLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBKQVgtV1MgaGFuZGxlciwgdGhlIE1lc3NhZ2UgaXMgY29udmVydGVkIGludG8gYSBTT0FQRW52ZWxvcGUKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IG0uZ2V0QXNTT0FQRW52ZWxvcGUoKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIlNPQVBFTlZFTE9QRSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgYXNzdW1lIHRoYXQgaXQKLSAgICAgICAgLy8gZG9lcy4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYSIuZXF1YWxzKG5hbWUpKTsKLQotICAgICAgICAvLyBUaGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBCbG9jayBibG9jayA9IG0uZ2V0Qm9keUJsb2NrKG51bGwsIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgIE9iamVjdCBibyA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvLnRvU3RyaW5nKCkpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJsb2NrIHJlcHJlc2VudGluZyBhbiBYTUxTdHJpbmcgYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPFN0cmluZz4gaW5wdXQgZmxvdwotICAgICAqIHdpdGggYSBKQVgtV1MgSGFuZGxlciB0aGF0IG5lZWRzIHRoZSB3aG9sZSBNZXNzYWdlCi0gICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSW5mbG93M19zb2FwMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RTdHJpbmdJbmZsb3czKHNhbXBsZUVudmVsb3BlMTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3czX3NvYXAxMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbmx5IHJ1biB0ZXN0IGlmIGFuIFNBQUogMS4zIE1lc3NhZ2VGYWN0b3J5IGlzIGF2YWlsYWJsZQotICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBtZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZiA9IGdldFNBQUpDb252ZXJ0ZXIoKS5jcmVhdGVNZXNzYWdlRmFjdG9yeShzb2FwMTJlbnYpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgICAgIGlmIChtZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBfdGVzdFN0cmluZ0luZmxvdzMoc2FtcGxlRW52ZWxvcGUxMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFN0cmluZ0luZmxvdzMoU3RyaW5nIHNhbXBsZUVudmVsb3BlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQKLSAgICAgICAgLy8gT00KLSAgICAgICAgU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLQotICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gdGhlIE9NCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAiT00iLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBKQVgtV1MgaGFuZGxlciwgdGhlIE1lc3NhZ2UgaXMgY29udmVydGVkIGludG8gYSBTT0FQRW52ZWxvcGUKLSAgICAgICAgU09BUE1lc3NhZ2Ugc20gPSBtLmdldEFzU09BUE1lc3NhZ2UoKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGlzRmF1bHQgPSBtLmlzRmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXNGYXVsdCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlhNTFBhcnQgUmVwcmVzZW50YXRpb24gaXMgIiArIG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIlNPQVBFTlZFTE9QRSIuZXF1YWxzKG0uZ2V0WE1MUGFydENvbnRlbnRUeXBlKCkpKTsKLQotICAgICAgICAvLyBOb3JtYWxseSB0aGUgaGFuZGxlciB3b3VsZCBub3QgdG91Y2ggdGhlIGJvZHkuLi5idXQgZm9yIG91ciBzY2VuYXJpbywgYXNzdW1lIHRoYXQgaXQKLSAgICAgICAgLy8gZG9lcy4KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBzbS5nZXRTT0FQQm9keSgpLmdldEZpcnN0Q2hpbGQoKS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYSIuZXF1YWxzKG5hbWUpKTsKLQotICAgICAgICAvLyBUaGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLgotICAgICAgICBYTUxTdHJpbmdCbG9ja0ZhY3RvcnkgYmxvY2tGYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICBCbG9jayBibG9jayA9IG0uZ2V0Qm9keUJsb2NrKG51bGwsIGJsb2NrRmFjdG9yeSk7Ci0gICAgICAgIE9iamVjdCBibyA9IGJsb2NrLmdldEJ1c2luZXNzT2JqZWN0KHRydWUpOwotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsKLQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvLnRvU3RyaW5nKCkpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBCbG9jayByZXByZXNlbnRpbmcgYW4gWE1MU3RyaW5nLCBidXQgdGhpcyB0aW1lIHVzZSBvbmUgdGhhdAotICAgICAqIGRvZXNuJ3QgaGF2ZSBhICZsdDtzb2FwOkhlYWRlciZndDsgZWxlbWVudCBpbiBpdC4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJbmZsb3c0X3NvYXAxMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlfdGVzdFN0cmluZ0luZmxvdzQoc2FtcGxlRW52ZWxvcGVOb0hlYWRlcjExKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0luZmxvdzRfc29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCV90ZXN0U3RyaW5nSW5mbG93NChzYW1wbGVFbnZlbG9wZU5vSGVhZGVyMTIpOwotCX0KLQlwdWJsaWMgdm9pZCBfdGVzdFN0cmluZ0luZmxvdzQoU3RyaW5nIHNhbXBsZUVudmVsb3BlTm9IZWFkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00KLSAgICAgICAgLy8gd2hpY2ggcmVwcmVzZW50cyB0aGUgbWVzc2FnZS4gIFRoZSBmb2xsb3dpbmcgY29kZSBzaW11bGF0ZXMgdGhlIGlucHV0Ci0gICAgICAgIC8vIE9NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlRW52ZWxvcGVOb0hlYWRlcik7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbgotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4KLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSA9IAotICAgICAgICAgICAgKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoWE1MU3RyaW5nQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgQmxvY2sgYmxvY2sgPSBtLmdldEJvZHlCbG9jayhudWxsLCBibG9ja0ZhY3RvcnkpOwotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIFN0cmluZyk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5Ci0gICAgICAgIGFzc2VydFRydWUoc2FtcGxlVGV4dC5lcXVhbHMoYm8udG9TdHJpbmcoKSkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgCi0gICAgICogYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPE9iamVjdD4gb3V0cHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT3V0ZmxvdygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgYmYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtQiBvYmplY3QKLSAgICAgICAgT2JqZWN0RmFjdG9yeSBvZiA9IG5ldyBPYmplY3RGYWN0b3J5KCk7Ci0gICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBvYmogPSBvZi5jcmVhdGVFY2hvU3RyaW5nUmVzcG9uc2UoKTsKLSAgICAgICAgb2JqLnNldEVjaG9TdHJpbmdSZXR1cm4oInNhbXBsZSByZXR1cm4gdmFsdWUiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQKLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gCi0gICAgICAgICAgICBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgdXNpbmcgdGhlIEVjaG8gb2JqZWN0IGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBEaXNwYXRjaDxPYmplY3Q+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20ob2JqLCBjb250ZXh0LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBhbiBvdXRib3VuZCBmbG93LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIE1lc3NhZ2UgCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwgCi0gICAgICAgIC8vIHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgVGVzdExvZ2dlci5sb2dnZXIuZGVidWcobmV3VGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucyhzYW1wbGVKQVhCVGV4dCkpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoInNvYXAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiQm9keSIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYQkJsb2NrIGNvbnRhaW5pbmcgYSBKQVgtQiBidXNpbmVzcyBvYmplY3QgCi0gICAgICogYW5kIHNpbXVsYXRlIGEgbm9ybWFsIERpc3BhdGNoPE9iamVjdD4gb3V0cHV0IGZsb3cKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT3V0Zmxvd19XM0NFbmRwb2ludFJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOwotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDExKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgQmxvY2tGYWN0b3J5Ci0gICAgICAgIEpBWEJCbG9ja0ZhY3RvcnkgYmYgPSAoSkFYQkJsb2NrRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KEpBWEJCbG9ja0ZhY3RvcnkuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVgtQiBvYmplY3QuLi4gYSBXM0NFbmRwb2ludFJlZmVyZW5jZQotICAgICAgICBXM0NFbmRwb2ludFJlZmVyZW5jZSBvYmogPSB3M2NFUFI7Ci0gICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIENsYXNzW10gY2xhc3NlcyA9IG5ldyBDbGFzc1tdIHtXM0NFbmRwb2ludFJlZmVyZW5jZS5jbGFzc307Ci0gICAgICAgIC8vSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjbGFzc2VzKTsKLSAgICAgICAgLy9KQVhCQmxvY2tDb250ZXh0IGNvbnRleHQgPSBuZXcgSkFYQkJsb2NrQ29udGV4dChqYXhiQ29udGV4dCk7Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IG5ldyBKQVhCQmxvY2tDb250ZXh0KCJqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nIik7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpBWEJDb250ZXh0PSAiICsgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgdXNpbmcgdGhlIEVjaG8gb2JqZWN0IGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBEaXNwYXRjaDxPYmplY3Q+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20ob2JqLCBjb250ZXh0LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBhbiBvdXRib3VuZCBmbG93LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIE1lc3NhZ2UgCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwgCi0gICAgICAgIC8vIHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBFbnZlbG9wZSB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIAotICAgICAgICAvLyBIVFRQIGNsaWVudC4KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVudi5zZXJpYWxpemVBbmRDb25zdW1lKGJhb3MsIG5ldyBPTU91dHB1dEZvcm1hdCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgCi0gICAgICAgIC8vIHJlYWRlcgotICAgICAgICBTdHJpbmcgbmV3VGV4dCA9IGJhb3MudG9TdHJpbmcoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJFbnZlbG9wZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJCb2R5IikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIEpBWEJPdXRwdXRmbG93LCBidXQgaGFzIGFuIGFkZGl0aW9uYWwgY2hlY2sKLSAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgSkFYQiBzZXJpYWxpemF0aW9uIGlzIGRlZmVycnJlZAotICAgICAqIHVudGlsIHRoZSBhY3R1YWwgc2VyaWFsaXphdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT3V0Zmxvd1BlcmYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjEgTWVzc2FnZQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkKLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgTWVzc2FnZSBtID0gbWYuY3JlYXRlKFByb3RvY29sLnNvYXAxMSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQotICAgICAgICBKQVhCQmxvY2tGYWN0b3J5IGJmID0gKEpBWEJCbG9ja0ZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShKQVhCQmxvY2tGYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYLUIgb2JqZWN0Ci0gICAgICAgIE9iamVjdEZhY3Rvcnkgb2YgPSBuZXcgT2JqZWN0RmFjdG9yeSgpOwotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2Ugb2JqID0gb2YuY3JlYXRlRWNob1N0cmluZ1Jlc3BvbnNlKCk7Ci0gICAgICAgIG9iai5zZXRFY2hvU3RyaW5nUmV0dXJuKCJzYW1wbGUgcmV0dXJuIHZhbHVlIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJCbG9ja0NvbnRleHQgY29udGV4dCA9IAotICAgICAgICAgICAgbmV3IEpBWEJCbG9ja0NvbnRleHQoRWNob1N0cmluZ1Jlc3BvbnNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQmxvY2sgdXNpbmcgdGhlIEVjaG8gb2JqZWN0IGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMKLSAgICAgICAgLy8gd2hhdCBvY2N1cnMgb24gdGhlIG91dGJvdW5kIEpBWC1XUyBEaXNwYXRjaDxPYmplY3Q+IGNsaWVudAotICAgICAgICBCbG9jayBibG9jayA9IGJmLmNyZWF0ZUZyb20ob2JqLCBjb250ZXh0LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEFkZCB0aGUgYmxvY2sgdG8gdGhlIG1lc3NhZ2UgYXMgbm9ybWFsIGJvZHkgY29udGVudC4KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgYm9vbGVhbiBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBPbiBhbiBvdXRib3VuZCBmbG93LCB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhlIE1lc3NhZ2UgCi0gICAgICAgIC8vIHRvIGFuIE9NRWxlbWVudCwgc3BlY2lmaWNhbGx5IGFuIE9NIFNPQVBFbnZlbG9wZSwgCi0gICAgICAgIC8vIHNvIHdlIGNhbiBzZXQgaXQgb24gdGhlIEF4aXMyIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gCi0gICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIGlzIGEgZmF1bHQuICBUaGUgY2xpZW50L3NlcnZlciB3aWxsIGFsd2F5cyBjYWxsIHRoaXMgbWV0aG9kLgotICAgICAgICAvLyBUaGUgTWVzc2FnZSBtdXN0IHJlc3BvbmQgYXBwcm9wcmlhdGVseSB3aXRob3V0IGRvaW5nIGEgY29udmVyc2lvbi4KLSAgICAgICAgaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgLy8gUEVSRk9STUFOQ0UgQ0hFQ0s6Ci0gICAgICAgIC8vIFRoZSBlbGVtZW50IGluIHRoZSBib2R5IHNob3VsZCBiZSBhbiBPTVNvdXJjZWRFbGVtZW50Ci0gICAgICAgIE9NRWxlbWVudCBvID0gZW52LmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudEltcGwpOwotICAgICAgICBhc3NlcnRUcnVlKCgoT01Tb3VyY2VkRWxlbWVudEltcGwpbykuaXNFeHBhbmRlZCgpID09IGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgRW52ZWxvcGUgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIHRoZSAKLSAgICAgICAgLy8gSFRUUCBjbGllbnQuCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbnYuc2VyaWFsaXplQW5kQ29uc3VtZShiYW9zLCBuZXcgT01PdXRwdXRGb3JtYXQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIAotICAgICAgICAvLyByZWFkZXIKLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSBiYW9zLnRvU3RyaW5nKCk7Ci0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoc2FtcGxlSkFYQlRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKCJzb2FwIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkVudmVsb3BlIikpOwotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgZmluYWwgaW50IE5PX1BFUlNJU1QgICAgICAgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFBFUlNJU1QgICAgICAgICA9IDE7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgU0FWRV9BTkRfUEVSU0lTVCA9IDI7Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0SkFYQkluZmxvdyhzYW1wbGVKQVhCRW52ZWxvcGUxMSwgTk9fUEVSU0lTVCwgZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTFfd2l0aEN1c3RvbUJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUpBWEJFbnZlbG9wZTExLCBOT19QRVJTSVNULCB0cnVlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIF90ZXN0SkFYQkluZmxvdyhzYW1wbGVKQVhCRW52ZWxvcGUxMiwgTk9fUEVSU0lTVCwgZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkluZmxvd19zb2FwMTFfd2l0aFBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgX3Rlc3RKQVhCSW5mbG93KHNhbXBsZUpBWEJFbnZlbG9wZTExLCBQRVJTSVNULCBmYWxzZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCSW5mbG93X3NvYXAxMl93aXRoUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBfdGVzdEpBWEJJbmZsb3coc2FtcGxlSkFYQkVudmVsb3BlMTIsIFBFUlNJU1QsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDExX3dpdGhTYXZlQW5kUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBfdGVzdEpBWEJJbmZsb3coc2FtcGxlSkFYQkVudmVsb3BlMTEsIFNBVkVfQU5EX1BFUlNJU1QsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJJbmZsb3dfc29hcDEyX3dpdGhTYXZlQW5kUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBfdGVzdEpBWEJJbmZsb3coc2FtcGxlSkFYQkVudmVsb3BlMTIsIFNBVkVfQU5EX1BFUlNJU1QsIGZhbHNlKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgX3Rlc3RKQVhCSW5mbG93KFN0cmluZyBzYW1wbGVKQVhCRW52ZWxvcGUsIGludCBwZXJzaXN0LCBib29sZWFuIGluc3RhbGxKQVhCQ3VzdG9tQnVpbGRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIFNPQVAgT00gb3V0IG9mIHRoZSBzYW1wbGUgaW5jb21pbmcgWE1MLiAgVGhpcwotICAgICAgICAvLyBzaW11bGF0ZXMgd2hhdCBBeGlzMiB3aWxsIGJlIGRvaW5nIHdpdGggdGhlIGluYm91bmQgbWVzc2FnZS4gCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlSkFYQkVudmVsb3BlKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGluZmxvdywgbnVsbCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgSkFYQkRTQ29udGV4dCBqZHMgPSBudWxsOwotICAgICAgICBpZiAoaW5zdGFsbEpBWEJDdXN0b21CdWlsZGVyKSB7Ci0gICAgICAgICAgICBqZHMgPSBuZXcgSkFYQkRTQ29udGV4dChFY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBKQVhCQ3VzdG9tQnVpbGRlciBqY2IgPSBuZXcgSkFYQkN1c3RvbUJ1aWxkZXIoamRzKTsKLSAgICAgICAgICAgIGJ1aWxkZXIucmVnaXN0ZXJDdXN0b21CdWlsZGVyRm9yUGF5bG9hZChqY2IpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMSBNZXNzYWdlIGZyb20gdGhlIHNhbXBsZSBpbmNvbWluZyBYTUwKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIGZhdWx0LiAgVGhlIGNsaWVudC9zZXJ2ZXIgd2lsbCBhbHdheXMgY2FsbCB0aGlzIG1ldGhvZC4KLSAgICAgICAgLy8gVGhlIE1lc3NhZ2UgbXVzdCByZXNwb25kIGFwcHJvcHJpYXRlbHkgd2l0aG91dCBkb2luZyBhIGNvbnZlcnNpb24uCi0gICAgICAgIGJvb2xlYW4gaXNGYXVsdCA9IG0uaXNGYXVsdCgpOwotICAgICAgICBhc3NlcnRUcnVlKCFpc0ZhdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWE1MUGFydCBSZXByZXNlbnRhdGlvbiBpcyAiICsgbS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIk9NIi5lcXVhbHMobS5nZXRYTUxQYXJ0Q29udGVudFR5cGUoKSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGluc3RhbGxKQVhCQ3VzdG9tQnVpbGRlcikgewotICAgICAgICAgICAgLy8gVGhlIEpBWEJEU0NvbnRleHQgYW5kIHRoZSBKQVhCVXRpbHMgYWNjZXNzIHRoZSBKQVhCQ29udGV4dAotICAgICAgICAgICAgLy8gZm9yIHRoZSAidGVzdCIgcGFja2FnZS4KLSAgICAgICAgICAgIC8vIFRoZSBKQVhCQ29udGV4dCBjcmVhdGlvbiBpcyB2ZXJ5IGV4cGVuc2l2ZS4KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIgdGhlIEpBWEJDb250ZXh0IGNhbiBhbHNvIGJlIHZlcnkgbGFyZ2UuCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIEZvciB0aGVzZSByZWFzb25zLCB0aGUgSkFYQlV0aWxzIGNvZGUgY2FjaGVzIHRoZSBKQVhCQ29udGV4dCB2YWx1ZXMuCi0gICAgICAgICAgICAvLyBBbmQsIHRoZSBKQVhCRFNDb250ZXh0IGFuZCBKQVhCVXRpbHMgY29kZSB1c2UgV2Vha1JlZmVyZW5jZXMgdG8gcmVmZXIgCi0gICAgICAgICAgICAvLyB0byB0aGUgSkFYQkNvbnRleHQgKHNvIHRoYXQgaXQgaXMgZWFzaWx5IGdjJ2QpLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgY2hlY2tzIG1ha2VzIHN1cmUgdGhhdCB0aGUgY2FjaGluZyBhbmQgZ2MgaXMgY29ycmVjdC4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBKQVhCQ29udGV4dAotICAgICAgICAgICAgSkFYQkNvbnRleHQgY29udGV4dCA9IGpkcy5nZXRKQVhCQ29udGV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGlkZW50aXR5IGhhc2ggY29kZS4gIFRoaXMgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSB1bmlxdWUgbWVtb3J5IHBvaW50ZXIKLSAgICAgICAgICAgIC8vIGZvciB0aGUgY29udGV4dC4KLSAgICAgICAgICAgIGludCBjb250ZXh0UG9pbnRlciA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGNvbnRleHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBSZWxlYXNlIG91ciBhY2Nlc3MgdG8gdGhlIGNvbnRleHQuCi0gICAgICAgICAgICAvLyBOb3cgdGhlIG9ubHkgYWNjZXNzZXMgaW4gdGhlIHN5c3RlbSBzaG91bGQgYmUgInNvZnQgcmVmcyIKLSAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBGb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIFN5c3RlbS5nYygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgYSBuZXcgY29udGV4dCBmcm9tIEpBWEJVdGlscwotICAgICAgICAgICAgVHJlZVNldDxTdHJpbmc+IHBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgcGFja2FnZXMuYWRkKEVjaG9TdHJpbmdSZXNwb25zZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRleHQgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQocGFja2FnZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGlzIG5ldyBjb250ZXh0IHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IHBvaW50ZXIgdGhhbiB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgIGludCBjb250ZXh0UG9pbnRlcjIgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShjb250ZXh0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLiAgVGhlIAotICAgICAgICAgICAgLy8gSkFYQkNvbnRleHQgaXMgc3RvcmVkIGluIGEgU29mdFJlZmVyZW5jZSAod2hpY2ggd2lsbCBvbmx5Ci0gICAgICAgICAgICAvLyBnZXQgZ2MnZCBpZiBtZW1vcnkgaXMgbG93KS4gIAotICAgICAgICAgICAgLy9hc3NlcnRUcnVlKGNvbnRleHRQb2ludGVyICE9IGNvbnRleHRQb2ludGVyMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGhvbGQgb24gdGhlIGNvbnRleHQKLSAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgY2FsbCBKQVhCVXRpbHMgYWdhaW4gdG8gZ2V0IGEgSkFYQkNvbnRleHQuCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSB3YXMgbm8gaW50ZXJ2ZW5pbmcgZ2MoKSwgaXQgc2hvdWxkIHJldHVybiB0aGUgY2FjaGVkIHZhbHVlCi0gICAgICAgICAgICBjb250ZXh0ID0gSkFYQlV0aWxzLmdldEpBWEJDb250ZXh0KHBhY2thZ2VzKTsKLSAgICAgICAgICAgIGludCBjb250ZXh0UG9pbnRlcjMgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShjb250ZXh0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY29udGV4dFBvaW50ZXIzID09IGNvbnRleHRQb2ludGVyMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzYXZlTXNnVGV4dCA9ICIiOwotICAgICAgICBpZiAocGVyc2lzdCA9PSBTQVZFX0FORF9QRVJTSVNUKSB7Ci0gICAgICAgICAgICAvLyBTaW11bGF0ZSBzYXZpbmcgdGhlIG1lc3NhZ2Ugc28gdGhhdCBpdCBjYW4gYmUgZnVsbHkgcmVidWlsdC4KLSAgICAgICAgICAgIHNhdmVNc2dUZXh0ID0gbS5nZXRBc09NRWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBjdXN0b21CdWlsdE9iamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChpbnN0YWxsSkFYQkN1c3RvbUJ1aWxkZXIpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbSA9IG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgICAgIG9tID0gKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlKSBvbSkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG9tIGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudCAmJgotICAgICAgICAgICAgICAgICgoT01Tb3VyY2VkRWxlbWVudCkgb20pLmdldERhdGFTb3VyY2UoKSBpbnN0YW5jZW9mIEpBWEJEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgY3VzdG9tQnVpbHRPYmplY3QgPSAoKEpBWEJEYXRhU291cmNlKSAoKE9NU291cmNlZEVsZW1lbnQpIG9tKS5nZXREYXRhU291cmNlKCkpLmdldE9iamVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkKLSAgICAgICAgSkFYQkJsb2NrRmFjdG9yeSBiZiA9IChKQVhCQmxvY2tGYWN0b3J5KQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoSkFYQkJsb2NrRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0IGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkCi0gICAgICAgIC8vIHRvIGRlc2VyaWFsaXplIHRoZSBKQVgtQiBvYmplY3QgY29udGVudCBpbiB0aGUgbWVzc2FnZS4KLSAgICAgICAgSkFYQkJsb2NrQ29udGV4dCBjb250ZXh0ID0gCi0gICAgICAgICAgICBuZXcgSkFYQkJsb2NrQ29udGV4dChFY2hvU3RyaW5nUmVzcG9uc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIEpBWEJCbG9jayB0aGF0IHdyYXBzIHRoZSBjb250ZW50Ci0gICAgICAgIEJsb2NrIGIgPSBtLmdldEJvZHlCbG9jayhjb250ZXh0LCBiZik7Ci0gICAgIAotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1lc3NhZ2UgaXMgYSBmYXVsdC4gIFRoZSBjbGllbnQvc2VydmVyIHdpbGwgYWx3YXlzIGNhbGwgdGhpcyBtZXRob2QuCi0gICAgICAgIC8vIFRoZSBNZXNzYWdlIG11c3QgcmVzcG9uZCBhcHByb3ByaWF0ZWx5IHdpdGhvdXQgZG9pbmcgYSBjb252ZXJzaW9uLgotICAgICAgICBpc0ZhdWx0ID0gbS5pc0ZhdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWlzRmF1bHQpOwotICAgICAgICBhc3NlcnRUcnVlKCJYTUxQYXJ0IFJlcHJlc2VudGF0aW9uIGlzICIgKyBtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAiU1BJTkUiLmVxdWFscyhtLmdldFhNTFBhcnRDb250ZW50VHlwZSgpKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBHZXQgdGhlIGJ1c2luZXNzIG9iamVjdCBmcm9tIHRoZSBibG9jaywgd2hpY2ggc2hvdWxkIGJlIGEgCi0gICAgICAgIC8vIEpBWC1CIG9iamVjdAotICAgICAgICBPYmplY3QgYm8gPSBiLmdldEJ1c2luZXNzT2JqZWN0KGZhbHNlKTsKLSAgICAgICAgbS5zZXRQb3N0UGl2b3QoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbXVsYXRlIHJlc3RvcmluZyB0aGUgbWVzc2FnZQotICAgICAgICBpZiAocGVyc2lzdCA9PSBTQVZFX0FORF9QRVJTSVNUKSB7Ci0gICAgICAgICAgICBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2F2ZU1zZ1RleHQpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHNhdmVNc2dSZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc2F2ZU1zZ1JlYWRlciwgbnVsbCk7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAgICAgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmIChpbnN0YWxsSkFYQkN1c3RvbUJ1aWxkZXIpIHsKLSAgICAgICAgICAgIC8vIElmIGluc3RhbGxlZCBqYXhiIGN1c3RvbSBidWlsZGVyLCB0aGVuIGN1c3RvbSBidWlsdCBvYmplY3Qgc2hvdWxkIGJlIHNhbWUgb2JqZWN0IGFzIHRoZSBidXNpbmVzcyBvYmplY3QKLSAgICAgICAgICAgIGFzc2VydFRydWUgKGN1c3RvbUJ1aWx0T2JqZWN0ID09IGJvKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb2JqZWN0IHdhcyByZXR1cm5lZAotICAgICAgICBhc3NlcnROb3ROdWxsKGJvKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShibyBpbnN0YW5jZW9mIEVjaG9TdHJpbmdSZXNwb25zZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgb2YgdGhhdCBvYmplY3QgaXMgY29ycmVjdAotICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgZXNyID0gKEVjaG9TdHJpbmdSZXNwb25zZSkgYm87Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXNyLmdldEVjaG9TdHJpbmdSZXR1cm4oKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZXNyLmdldEVjaG9TdHJpbmdSZXR1cm4oKS5lcXVhbHMoInNhbXBsZSByZXR1cm4gdmFsdWUiKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTaW11bGF0ZSBvdXRib3VuZAotICAgICAgICBpZiAocGVyc2lzdCA9PSBQRVJTSVNUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGVyc2lzdE1zZyA9IG0uZ2V0QXNPTUVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gcGVyc2lzdCB0aGUgbWVzc2FnZSwgCi0gICAgICAgICAgICAvLyBhbmQgdGhlIHBlcnNpc3RlZCBtZXNzYWdlIFdJTEwgY29udGFpbiB0aGUgZWNob1N0cmluZ1Jlc3BvbnNlIGNvbnRlbnRzCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHBlcnNpc3RNc2cuY29udGFpbnMoIkJvZHkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBlcnNpc3RNc2cuY29udGFpbnMoImVjaG9TdHJpbmdSZXNwb25zZSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocGVyc2lzdE1zZy5jb250YWlucygic2FtcGxlIHJldHVybiB2YWx1ZSIpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgaWYgKHBlcnNpc3QgPT0gU0FWRV9BTkRfUEVSU0lTVCkgewotICAgICAgICAgICAgU3RyaW5nIHBlcnNpc3RNc2cgPSBtLmdldEFzT01FbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIHBlcnNpc3QgdGhlIG1lc3NhZ2UsIAotICAgICAgICAgICAgLy8gYW5kIHRoZSBwZXJzaXN0ZWQgbWVzc2FnZSBXSUxMIGNvbnRhaW4gdGhlIGVjaG9TdHJpbmdSZXNwb25zZSBjb250ZW50cwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwZXJzaXN0TXNnLmNvbnRhaW5zKCJCb2R5IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwZXJzaXN0TXNnLmNvbnRhaW5zKCJlY2hvU3RyaW5nUmVzcG9uc2UiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBlcnNpc3RNc2cuY29udGFpbnMoInNhbXBsZSByZXR1cm4gdmFsdWUiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEFmdGVyIHBlcnNpc3RhbmNlOiBTYW5kZXNoYSBtYXkgaW5zcGVjdCB0aGUgYm9keS4gIE1ha2Ugc3VyZSB0aGlzIGRvZXMgbm90IGNhdXNlIGFuIGVycm9yCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUoInVyaTovL2Zha2UiLCAiZmFrZSIpOwotICAgICAgICBlbnYuZ2V0Qm9keSgpLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShxTmFtZSk7Ci0gICAgfQotCi0gICAgU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTQUFKQ29udmVydGVyIGdldFNBQUpDb252ZXJ0ZXIoKSB7Ci0gICAgICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgU0FBSkNvbnZlcnRlckZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICAgIChTQUFKQ29udmVydGVyRmFjdG9yeSkgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoU0FBSkNvbnZlcnRlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgY29udmVydGVyID0gZmFjdG9yeS5nZXRTQUFKQ29udmVydGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnZlcnRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9TQUFKQ29udmVydGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1NBQUpDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGU1YWZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL1NBQUpDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlNBQUpDb252ZXJ0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS51dGlsLlNBQUpDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIFNBQUpDb252ZXJ0ZXJUZXN0cwotICogCi0gKiBUZXN0IHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IG9mIHRoZSBTQUFKQ29udmVydGVyLgotICogWW91IGNhbiBhbHNvIHVzZSB0aGVzZSB0ZXN0cyB0byBhcyBzYW1wbGUgY29kZSBvbiBob3cgdG8gdXNlCi0gKiB0aGUgY29udmVydGVyLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNBQUpDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYW1wbGVUZXh0ID0KLQkJIjxwcmU6YSB4bWxuczpwcmU9XCJ1cm46Ly9zYW1wbGVcIj4iICsKLQkJIjxiPkhlbGxvPC9iPiIgKwotCQkiPGM+V29ybGQ8L2M+IiArCi0JCSI8L3ByZTphPiI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlID0gCi0JCSI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLQkJIjxzb2FwZW52OkhlYWRlciAvPjxzb2FwZW52OkJvZHk+IiArCi0JCXNhbXBsZVRleHQgKwotCQkiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQotCXB1YmxpYyBTQUFKQ29udmVydGVyVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNBQUpDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGVzdFN0cmF0ZWd5IFRlc3RzIGNvbnZlcnNpb25zIGJldHdlZW4gU0FBSiBhbmQgT00gU09BUEVudmVsb3BlcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBCb290c3RyYXA6IENyZWF0ZSBhbiBPTSBTT0FQRW52ZWxvcGUgZnJvbSB0aGUgc2FtcGxlIHRleHQKLQkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0JCVhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotCQlvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIG9tRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotCQkKLQkJLy8gU3RlcCAxOiBHZXQgdGhlIFNBQUpDb252ZXJ0ZXIgb2JqZWN0IGZyb20gdGhlIEZhY3RvcnkKLQkJU0FBSkNvbnZlcnRlckZhY3RvcnkgZiA9IChTQUFKQ29udmVydGVyRmFjdG9yeSkgCi0JCQlGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShTQUFKQ29udmVydGVyRmFjdG9yeS5jbGFzcyk7Ci0JCVNBQUpDb252ZXJ0ZXIgY29udmVydGVyID0gZi5nZXRTQUFKQ29udmVydGVyKCk7Ci0JCQotCQkvLyBTdGVwIDI6IENvbnZlcnQgdGhlIE9NIFNPQVBFbnZlbG9wZSB0byBhbiBTQUFKIFNPQVBFbnZlbG9wZQotCQlTT0FQRW52ZWxvcGUgc2FhakVudmVsb3BlID0gY29udmVydGVyLnRvU0FBSihvbUVudmVsb3BlKTsKLQkJCi0JCS8vIFN0ZXAgMmE6IFNpbXBsZSBhc3NlcnRpb24gY2hlY2sgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLgotCQlTdHJpbmcgbmFtZSA9IHNhYWpFbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RDaGlsZCgpLmdldExvY2FsTmFtZSgpOwotCQlhc3NlcnRUcnVlKCJhIi5lcXVhbHMobmFtZSkpOwotCQkKLQkJLy8gU3RlcCAzOiBDb252ZXJ0IHRoZSBTQUFKIFNPQVBFbnZlbG9wZSB0byBhbiBPTSBTT0FQRW52ZWxvcGUKLQkJb21FbnZlbG9wZSA9IGNvbnZlcnRlci50b09NKHNhYWpFbnZlbG9wZSk7Ci0JCQotCQkvLyBTdGVwIDNhOiBTaW1wbGUgYXNzZXJ0aW9uIGNoZWNrIHRvIGVuc3VyZSBjb3JyZWN0bmVzcwotCQluYW1lID0gb21FbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCk7Ci0JCWFzc2VydFRydWUoImEiLmVxdWFscyhuYW1lKSk7Ci0JCQotCQkvLyBTdGVwIDQ6IFJpbnNlIGFuZCByZXBlYXQKLQkJc2FhakVudmVsb3BlID0gY29udmVydGVyLnRvU0FBSihvbUVudmVsb3BlKTsKLQkJbmFtZSA9IHNhYWpFbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RDaGlsZCgpLmdldExvY2FsTmFtZSgpOwotCQlhc3NlcnRUcnVlKCJhIi5lcXVhbHMobmFtZSkpOwotCQlvbUVudmVsb3BlID0gY29udmVydGVyLnRvT00oc2FhakVudmVsb3BlKTsKLQkJbmFtZSA9IG9tRW52ZWxvcGUuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotCQlhc3NlcnRUcnVlKCJhIi5lcXVhbHMobmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBAdGVzdFN0cmF0ZWd5IFRlc3RzIGNvbnZlcnNpb25zIGJldHdlZW4gU0FBSiBhbmQgT00gZm9yIG5vcm1hbCBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIEJvb3RzdHJhcDogQ3JlYXRlIGFuIE9NIFNPQVBFbnZlbG9wZSBmcm9tIHRoZSBzYW1wbGUgdGV4dC4KLQkJU3RyaW5nUmVhZGVyIHNyID0gbmV3IFN0cmluZ1JlYWRlcihzYW1wbGVFbnZlbG9wZSk7Ci0JCVhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsKLQkJU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOwotCQlvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIG9tRW52ZWxvcGUgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotCQkKLQkJLy8gQm9vdHN0cmFwOiBHZXQgYW4gT01FbGVtZW50IGZyb20gdGhlIGJvZHkKLQkJT01FbGVtZW50IG9tID0gb21FbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQkvLyBCb290c3RyYXA6IEdldCBhbiBTQUFKIEJvZHkgdG8gaG9sZCB0aGUgdGFyZ2V0IFNPQVBFbGVtZW50Ci0JCU1lc3NhZ2VGYWN0b3J5IG1zZ0ZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlTT0FQTWVzc2FnZSBtZXNzYWdlID0gbXNnRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0JCVNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0JCQotCQkvLyBTdGVwIDE6IEdldCB0aGUgU0FBSkNvbnZlcnRlciBvYmplY3QgZnJvbSB0aGUgRmFjdG9yeQotCQlTQUFKQ29udmVydGVyRmFjdG9yeSBmID0gKFNBQUpDb252ZXJ0ZXJGYWN0b3J5KSAKLQkJCUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzKTsKLQkJU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBmLmdldFNBQUpDb252ZXJ0ZXIoKTsKLQkJCi0JCS8vIFN0ZXAgMjogQ29udmVydCBPTSB0byBTQUFKCi0JCVNPQVBFbGVtZW50IHNlID0gY29udmVydGVyLnRvU0FBSihvbSwgYm9keSk7Ci0JCQotCQkvLyBTdGVwIDJhOiBWZXJpZnkKLQkJYXNzZXJ0VHJ1ZShzZSBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7Ci0JCWFzc2VydFRydWUoc2UuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJhIikpOwotCQkKLQkJLy8gU3RlcCAzOiBDb252ZXJ0IFNBQUogdG8gT00KLQkJb20gPSBjb252ZXJ0ZXIudG9PTShzZSk7Ci0JCQotCQkvLyBTdGVwIDNhOiBWZXJpZnkKLQkJYXNzZXJ0VHJ1ZShvbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImEiKSk7Ci0JCQotCQkvLyBTdGVwIDQ6IFJpbnNlIGFuZCBSZXBlYXQKLQkJc2UgPSBjb252ZXJ0ZXIudG9TQUFKKG9tLCBib2R5KTsKLQkJYXNzZXJ0VHJ1ZShzZSBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7Ci0JCWFzc2VydFRydWUoc2UuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJhIikpOwotCQlvbSA9IGNvbnZlcnRlci50b09NKHNlKTsKLQkJYXNzZXJ0VHJ1ZShvbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoImEiKSk7Ci0JfQotCQotCS8qKgotCSAqIEB0ZXN0U3RyYXRlZ3k6IENyZWF0ZSBhbiBPTUVsZW1lbnQsIHdpdGhvdXQgdXNpbmcgYSBidWlsZGVyLiAgVmVyaWZpY2F0aW9uIG9mIEFYSVMyLTk3MAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCQotLy8gICAgCSBTdGVwIDE6IEdldCB0aGUgU0FBSkNvbnZlcnRlciBvYmplY3QgZnJvbSB0aGUgRmFjdG9yeQotCQlTQUFKQ29udmVydGVyRmFjdG9yeSBmID0gKFNBQUpDb252ZXJ0ZXJGYWN0b3J5KSAKLQkJCUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFNBQUpDb252ZXJ0ZXJGYWN0b3J5LmNsYXNzKTsKLQkJU0FBSkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBmLmdldFNBQUpDb252ZXJ0ZXIoKTsKLQkJCi0JCS8vIFN0ZXB0IDI6IENyZWF0ZSBPTSBhbmQgcGFyZW50IFNPQVBFbGVtZW50Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugd3JhcE5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKCJuYW1lc3BhY2UiLCAicHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBvbWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJsb2NhbG5hbWUiLCB3cmFwTnMpOwotICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IHNlID0gc2YuY3JlYXRlRWxlbWVudCgibmFtZSIpOwotICAgICAgICAKLSAgICAgICAgLy8gU3RlcCAzOiBEbyB0aGUgY29udmVyc2lvbgotICAgICAgICBjb252ZXJ0ZXIudG9TQUFKKG9tZSwgc2UsIHNmKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9TT0FQMTJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvU09BUDEyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4NjUyMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9TT0FQMTJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLmZhY3RvcnkuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5mYWN0b3J5LlhNTFN0cmluZ0Jsb2NrRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuUmVhZGVyMldyaXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5GYWN0b3J5UmVnaXN0cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuVGVzdExvZ2dlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCi0NCi0vKioNCi0gKiBUaGlzIHN1aXRlIGlzIHVzZWQgdG8gdGVzdCB0aGUgY3JlYXRpb24gb2YgbWVzc2FnZXMgYmFzZWQgb24gU09BUCAxLjINCi0gKiB3aXRoIGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQgc2ltdWxhdGlvbnMuIA0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFNPQVAxMlRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlVGV4dCA9IA0KLSAgICAgICAgIjxlY2hvPnRlc3Qgc3RyaW5nPC9lY2hvPiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2FtcGxlU29hcDEyRW52ZWxvcGVIZWFkID0NCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlXCI+IiArDQotICAgICAgICAiPHNvYXBlbnY6SGVhZGVyIC8+PHNvYXBlbnY6Qm9keT4iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZUVudmVsb3BlVGFpbCA9DQotICAgICAgICAiPC9zb2FwZW52OkJvZHk+PC9zb2FwZW52OkVudmVsb3BlPiI7ICAgIA0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNhbXBsZVNvYXAxMkVudmVsb3BlID0gDQotICAgICAgICBzYW1wbGVTb2FwMTJFbnZlbG9wZUhlYWQgKyANCi0gICAgICAgIHNhbXBsZVRleHQgKyANCi0gICAgICAgIHNhbXBsZUVudmVsb3BlVGFpbDsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTlNfVVJJID0gDQotICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICANCi0gICAgcHVibGljIFNPQVAxMlRlc3RzKFN0cmluZyBuYW1lKSB7DQotICAgICAgICBzdXBlcihuYW1lKTsNCi0gICAgfQ0KLSAgICANCi0gICAgc3RhdGljIHsNCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTaW11bGF0ZSBjcmVhdGluZyBhIFNPQVAgMS4yIG1lc3NhZ2Ugd2hlbiB0aGUgYnVzaW5lc3Mgb2JqZWN0DQotICAgICAqIHByb3ZpZGVkIGlzIGp1c3QgdGhlIHBheWxvYWQuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNvYXAxMkZyb21QYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBDcmVhdGUgYSBTT0FQIDEuMiBNZXNzYWdlDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGUoUHJvdG9jb2wuc29hcDEyKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gR2V0IHRoZSBCbG9ja0ZhY3RvcnkNCi0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBmID0gKFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBCbG9jayB1c2luZyB0aGUgc2FtcGxlIHN0cmluZyBhcyB0aGUgY29udGVudC4gIFRoaXMgc2ltdWxhdGVzDQotICAgICAgICAvLyB3aGF0IG9jY3VycyBvbiB0aGUgb3V0Ym91bmQgSkFYLVdTIGRpc3BhdGNoPFN0cmluZz4gY2xpZW50DQotICAgICAgICBCbG9jayBibG9jayA9IGYuY3JlYXRlRnJvbShzYW1wbGVUZXh0LCBudWxsLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQWRkIHRoZSBibG9jayB0byB0aGUgbWVzc2FnZSBhcyBub3JtYWwgYm9keSBjb250ZW50Lg0KLSAgICAgICAgbS5zZXRCb2R5QmxvY2soYmxvY2spOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuDQotICAgICAgICAvLyBpcyBhIFhNTFN0cmVhbVJlYWRlciB3aWxsIGJlIHJlcXVlc3RlZC4uLnRvIGdvIHRvIE9NLiAgIEF0IHRoaXMgcG9pbnQgdGhlDQotICAgICAgICAvLyBibG9jayBzaG91bGQgYmUgY29uc3VtZWQuDQotICAgICAgICBPTUVsZW1lbnQgb20gPSBtLmdldEFzT01FbGVtZW50KCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBibG9jayBzaG91bGQgbm90IGJlIGNvbnN1bWVkIHlldC4uLmJlY2F1c2UgdGhlIG1lc3NhZ2UgaGFzIG5vdCBiZWVuIHJlYWQNCi0gICAgICAgIGFzc2VydFRydWUoIWJsb2NrLmlzQ29uc3VtZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0LCBnZXQgdGhlIFN0cmluZyBjb250ZW50cyBvZiB0aGUgDQotICAgICAgICAvLyByZWFkZXINCi0gICAgICAgIFJlYWRlcjJXcml0ZXIgcjJ3ID0gbmV3IFJlYWRlcjJXcml0ZXIob20uZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOw0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUobS5nZXRQcm90b2NvbCgpLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEVudmVsb3BlIG9tU29hcEVudiA9IChTT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsNCi0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21Tb2FwRW52LmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyX05TX1VSSSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkIGF0IHRoaXMgcG9pbnQNCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNpbXVsYXRlIGNyZWF0aW5nIGEgU09BUCAxLjIgbWVzc2FnZSB3aGVuIHRoZSBidXNpbmVzcyBvYmplY3QNCi0gICAgICogcHJvdmlkZWQgaXMgdGhlIGZ1bGwgbWVzc2FnZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTb2FwMTJGcm9tTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gQ3JlYXRlIGEgU09BUCAxLjIgTWVzc2FnZQ0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSAoTWVzc2FnZUZhY3RvcnkpDQotICAgICAgICAgICAgRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoTWVzc2FnZUZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBHZXQgdGhlIEJsb2NrRmFjdG9yeQ0KLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGYgPSAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIEJsb2NrIHVzaW5nIHRoZSBzYW1wbGUgc3RyaW5nIGFzIHRoZSBjb250ZW50LiAgVGhpcyBzaW11bGF0ZXMNCi0gICAgICAgIC8vIHdoYXQgb2NjdXJzIG9uIHRoZSBvdXRib3VuZCBKQVgtV1MgZGlzcGF0Y2g8U3RyaW5nPiBjbGllbnQNCi0gICAgICAgIEJsb2NrIGJsb2NrID0gZi5jcmVhdGVGcm9tKHNhbXBsZVNvYXAxMkVudmVsb3BlLCBudWxsLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgTWVzc2FnZSB3aXRoIHRoZSBmdWxsIFhNTCBjb250ZW50cyB0aGF0IHdlIGhhdmUNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20oYmxvY2suZ2V0WE1MU3RyZWFtUmVhZGVyKHRydWUpLCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQXNzdW1pbmcgbm8gaGFuZGxlcnMgYXJlIGluc3RhbGxlZCwgdGhlIG5leHQgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbg0KLSAgICAgICAgLy8gaXMgYSBYTUxTdHJlYW1SZWFkZXIgd2lsbCBiZSByZXF1ZXN0ZWQuLi50byBnbyB0byBPTS4gICBBdCB0aGlzIHBvaW50IHRoZQ0KLSAgICAgICAgLy8gYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkLg0KLSAgICAgICAgT01FbGVtZW50IG9tID0gbS5nZXRBc09NRWxlbWVudCgpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUbyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgaXMgY29ycmVjdCwgZ2V0IHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlIA0KLSAgICAgICAgLy8gcmVhZGVyDQotICAgICAgICBSZWFkZXIyV3JpdGVyIHIydyA9IG5ldyBSZWFkZXIyV3JpdGVyKG9tLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCkpOw0KLSAgICAgICAgU3RyaW5nIG5ld1RleHQgPSByMncuZ2V0QXNTdHJpbmcoKTsNCi0gICAgICAgIFRlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKG5ld1RleHQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXdUZXh0LmNvbnRhaW5zKHNhbXBsZVRleHQpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygic29hcCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUobmV3VGV4dC5jb250YWlucygiRW52ZWxvcGUiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKG5ld1RleHQuY29udGFpbnMoIkJvZHkiKSk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUobS5nZXRQcm90b2NvbCgpLmVxdWFscyhQcm90b2NvbC5zb2FwMTIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgU09BUEVudmVsb3BlIG9tU29hcEVudiA9IChTT0FQRW52ZWxvcGUpIG0uZ2V0QXNPTUVsZW1lbnQoKTsNCi0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gb21Tb2FwRW52LmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyX05TX1VSSSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkIGF0IHRoaXMgcG9pbnQNCi0gICAgICAgIGFzc2VydFRydWUoYmxvY2suaXNDb25zdW1lZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFBheWxvYWRGcm9tU29hcDEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAvLyBPbiBpbmJvdW5kLCB0aGVyZSB3aWxsIGFscmVhZHkgYmUgYW4gT00NCi0gICAgICAgIC8vIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2UuICBUaGUgZm9sbG93aW5nIGNvZGUgc2ltdWxhdGVzIHRoZSBpbnB1dA0KLSAgICAgICAgLy8gT00NCi0gICAgICAgIFN0cmluZ1JlYWRlciBzciA9IG5ldyBTdHJpbmdSZWFkZXIoc2FtcGxlU29hcDEyRW52ZWxvcGUpOw0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIGluZmxvdyA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc3IpOw0KLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihpbmZsb3csIG51bGwpOw0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSBKQVgtV1MgbGF5ZXIgY3JlYXRlcyBhIE1lc3NhZ2UgZnJvbSB0aGUgT00NCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gKE1lc3NhZ2VGYWN0b3J5KQ0KLSAgICAgICAgICAgIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KE1lc3NhZ2VGYWN0b3J5LmNsYXNzKTsNCi0gICAgICAgIE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZUZyb20ob21FbGVtZW50LCBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByaWdodCBQcm90b2NvbCB3YXMgc2V0IG9uIHRoZSBNZXNzYWdlDQotICAgICAgICBhc3NlcnRUcnVlKG0uZ2V0UHJvdG9jb2woKS5lcXVhbHMoUHJvdG9jb2wuc29hcDEyKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRoZSBTT0FQRW52ZWxvcGUgdG8gbWFrZSBzdXJlIHdlJ3ZlIGdvdCB0aGUgcmlnaHQNCi0gICAgICAgIC8vIHByb3RvY29sIG5hbWVzcGFjZSB0aGVyZSBhcyB3ZWxsLg0KLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnYgPSAoU09BUEVudmVsb3BlKSBtLmdldEFzT01FbGVtZW50KCk7DQotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IHNvYXBFbnYuZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKG5zLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhTT0FQMTJfTlNfVVJJKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIEFzc3VtaW5nIG5vIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQsIHRoZSBuZXh0IHRoaW5nIHRoYXQgd2lsbCBoYXBwZW4NCi0gICAgICAgIC8vIGlzIHRoZSBwcm94eSBjb2RlIHdpbGwgYXNrIGZvciB0aGUgYnVzaW5lc3Mgb2JqZWN0IChTdHJpbmcpLg0KLSAgICAgICAgWE1MU3RyaW5nQmxvY2tGYWN0b3J5IGJsb2NrRmFjdG9yeSA9IA0KLSAgICAgICAgICAgIChYTUxTdHJpbmdCbG9ja0ZhY3RvcnkpIEZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFhNTFN0cmluZ0Jsb2NrRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBCbG9jayBibG9jayA9IG0uZ2V0Qm9keUJsb2NrKG51bGwsIGJsb2NrRmFjdG9yeSk7DQotICAgICAgICBPYmplY3QgYm8gPSBibG9jay5nZXRCdXNpbmVzc09iamVjdCh0cnVlKTsNCi0gICAgICAgIGFzc2VydFRydWUoYm8gaW5zdGFuY2VvZiBTdHJpbmcpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgYmxvY2sgc2hvdWxkIGJlIGNvbnN1bWVkDQotICAgICAgICBhc3NlcnRUcnVlKGJsb2NrLmlzQ29uc3VtZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIENoZWNrIHRoZSBTdHJpbmcgZm9yIGFjY3VyYWN5DQotICAgICAgICBhc3NlcnRUcnVlKHNhbXBsZVRleHQuZXF1YWxzKGJvKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlRnJvbVNvYXAxMigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLy8gT24gaW5ib3VuZCwgdGhlcmUgd2lsbCBhbHJlYWR5IGJlIGFuIE9NDQotICAgICAgICAvLyB3aGljaCByZXByZXNlbnRzIHRoZSBtZXNzYWdlLiAgVGhlIGZvbGxvd2luZyBjb2RlIHNpbXVsYXRlcyB0aGUgaW5wdXQNCi0gICAgICAgIC8vIE9NDQotICAgICAgICBTdHJpbmdSZWFkZXIgc3IgPSBuZXcgU3RyaW5nUmVhZGVyKHNhbXBsZVNvYXAxMkVudmVsb3BlKTsNCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciBpbmZsb3cgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNyKTsNCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoaW5mbG93LCBudWxsKTsNCi0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBidWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBUaGUgSkFYLVdTIGxheWVyIGNyZWF0ZXMgYSBNZXNzYWdlIGZyb20gdGhlIE9NDQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IChNZXNzYWdlRmFjdG9yeSkNCi0gICAgICAgICAgICBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShNZXNzYWdlRmFjdG9yeS5jbGFzcyk7DQotICAgICAgICBNZXNzYWdlIG0gPSBtZi5jcmVhdGVGcm9tKG9tRWxlbWVudCwgbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmlnaHQgUHJvdG9jb2wgd2FzIHNldCBvbiB0aGUgTWVzc2FnZQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtLmdldFByb3RvY29sKCkuZXF1YWxzKFByb3RvY29sLnNvYXAxMikpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0aGUgU09BUEVudmVsb3BlIHRvIG1ha2Ugc3VyZSB3ZSd2ZSBnb3QgdGhlIHJpZ2h0DQotICAgICAgICAvLyBwcm90b2NvbCBuYW1lc3BhY2UgdGhlcmUgYXMgd2VsbC4NCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ID0gKFNPQVBFbnZlbG9wZSkgbS5nZXRBc09NRWxlbWVudCgpOw0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBzb2FwRW52LmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShucy5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoU09BUDEyX05TX1VSSSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBBc3N1bWluZyBubyBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLCB0aGUgbmV4dCB0aGluZyB0aGF0IHdpbGwgaGFwcGVuDQotICAgICAgICAvLyBpcyB0aGUgcHJveHkgY29kZSB3aWxsIGFzayBmb3IgdGhlIGJ1c2luZXNzIG9iamVjdCAoU3RyaW5nKS4NCi0gICAgICAgIFhNTFN0cmluZ0Jsb2NrRmFjdG9yeSBibG9ja0ZhY3RvcnkgPSANCi0gICAgICAgICAgICAoWE1MU3RyaW5nQmxvY2tGYWN0b3J5KSBGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShYTUxTdHJpbmdCbG9ja0ZhY3RvcnkuY2xhc3MpOw0KLSAgICAgICAgQmxvY2sgYmxvY2sgPSBibG9ja0ZhY3RvcnkuY3JlYXRlRnJvbShtLmdldEFzT01FbGVtZW50KCksIG51bGwsIG51bGwpOw0KLSAgICAgICAgT2JqZWN0IGJvID0gYmxvY2suZ2V0QnVzaW5lc3NPYmplY3QodHJ1ZSk7DQotICAgICAgICBhc3NlcnRUcnVlKGJvIGluc3RhbmNlb2YgU3RyaW5nKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIGJsb2NrIHNob3VsZCBiZSBjb25zdW1lZA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShibG9jay5pc0NvbnN1bWVkKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBDaGVjayB0aGUgU3RyaW5nIGZvciBhY2N1cmFjeQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKFN0cmluZylibykuY29udGFpbnMoIjxzb2FwZW52OkJvZHk+PGVjaG8+dGVzdCBzdHJpbmc8L2VjaG8+PC9zb2FwZW52OkJvZHk+IikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlsc1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9kYXRhYmluZGluZy9KQVhCVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNjOGZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2RhdGFiaW5kaW5nL0pBWEJVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuZGF0YWJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5kYXRhYmluZGluZy5KQVhCVXRpbHMuQ09OU1RSVUNUSU9OX1RZUEU7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4Yi5hLkJhZERhdGExOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheGIuYS5CYWREYXRhMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhiLmEuRGF0YTE7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4Yi5hLkRhdGEyOw0KLWltcG9ydCBvcmcuYXBhY2hlLndzLmpheGIuYS5EYXRhMzsNCi1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXhiLmIuQmFkRGF0YTM7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3QgSkFYQlV0aWxzIGZ1bmN0aW9uYWxpdHkNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYQlV0aWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogV2UgaGF2ZSBlbmNvdW50ZXJlZCBzaXR1YXRpb25zIHdoZXJlIHVzZXJzIGhhdmUgaW50ZXJtaW5nbGVkDQotICAgICAqIEpBWEIgYW5kIG5vbi1KQVhCIGNsYXNzZXMgaW4gdGhlIHNhbWUgcGFja2FnZS4gIFRoaXMgcHJhY3RpY2UgaXMNCi0gICAgICogc3Ryb25nbHkgZGlzY291cmFnZWQ7IGhvd2V2ZXIgaXQgY2FuIGhhcHBlbi4gIA0KLSAgICAgKiBUaGUgSkFYQlV0aWxzIGNvZGUgKGFjdHVhbGx5IEpBWEJDb250ZXh0RnJvbUNsYXNzZXMpIGNvbnRhaW5zIA0KLSAgICAgKiBhbiBhbGdvcml0aG0gdG8gdHJ5IGFuZCBmaW5kIHRoZSBtaW5pbWFsIHNldCBvZiB2YWxpZCBjbGFzc2VzIA0KLSAgICAgKiBpbiB0aGVzZSBjYXNlcy4gIA0KLSAgICAgKiANCi0gICAgICogVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGUgY29kZS4gIFNldmVyYWwgZ29vZCBKQVhCIGNsYXNzZXMNCi0gICAgICogKGFsbCBuYW1lZCBEYXRhKikgYXJlIGludGVybWluZ2xlZCBpbiBwYWNrYWVzIHdpdGggbm9uLUpBWEIgY2xhc3Nlcw0KLSAgICAgKiAoYWxsIG5hbWVkIEJhZERhdGEqKS4gIFRoaXMgdGVzdCBwYXNzZXMgaWYgdGhlIEpBWEJDb250ZXh0IGNvbnRhaW5zDQotICAgICAqIHRoZSBEYXRhIGNsYXNzZXMgYW5kIGV4Y2x1ZGVzIHRoZSBCYWREYXRhIGNsYXNzZXMuDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRQYWNrYWdlcygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICAvLyBDcmVhdGUgYSBKQVhCQ29udGV4dA0KLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IGNvbnRleHRQYWNrYWdlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsNCi0gICAgICAgIGNvbnRleHRQYWNrYWdlcy5hZGQoIm9yZy5hcGFjaGUud3MuamF4Yi5hIik7DQotICAgICAgICBjb250ZXh0UGFja2FnZXMuYWRkKCJvcmcuYXBhY2hlLndzLmpheGIuYiIpOw0KLSAgICAgICAgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPmNvbnN0cnVjdGlvblR5cGUgPSBuZXcgSG9sZGVyPENPTlNUUlVDVElPTl9UWVBFPigpOw0KLSAgICAgICAgDQotICAgICAgICBKQVhCQ29udGV4dCBqYmMgPSBKQVhCVXRpbHMuZ2V0SkFYQkNvbnRleHQoY29udGV4dFBhY2thZ2VzLCBjb25zdHJ1Y3Rpb25UeXBlLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0UGFja2FnZXMudG9TdHJpbmcoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZSB0b1N0cmluZyBtZXRob2QgbGlzdHMgYWxsIG9mIHRoZSBjb250YWluZWQgY2xhc3Nlcy4NCi0gICAgICAgIFN0cmluZyBqYmNTdHJpbmcgPSBqYmMudG9TdHJpbmcoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBnb29kIERhdGEgaXMgaW4gdGhlIEpBWEJDb250ZXh0DQotICAgICAgICBhc3NlcnRUcnVlKGpiY1N0cmluZy5pbmRleE9mKERhdGExLmNsYXNzLmdldE5hbWUoKSkgPiAwKTsNCi0gICAgICAgIGFzc2VydFRydWUoamJjU3RyaW5nLmluZGV4T2YoRGF0YTIuY2xhc3MuZ2V0TmFtZSgpKSA+IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShqYmNTdHJpbmcuaW5kZXhPZihEYXRhMy5jbGFzcy5nZXROYW1lKCkpID4gMCk7DQotICAgICAgICANCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgYmFkIERhdGEgaXMgbm90IGluIHRoZSBKQVhCQ29udGV4dA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShqYmNTdHJpbmcuaW5kZXhPZihCYWREYXRhMS5jbGFzcy5nZXROYW1lKCkpIDwgMCk7DQotICAgICAgICBhc3NlcnRUcnVlKGpiY1N0cmluZy5pbmRleE9mKEJhZERhdGEyLmNsYXNzLmdldE5hbWUoKSkgPCAwKTsNCi0gICAgICAgIGFzc2VydFRydWUoamJjU3RyaW5nLmluZGV4T2YoQmFkRGF0YTMuY2xhc3MuZ2V0TmFtZSgpKSA8IDApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvQ29uZmlnQm9keS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NjlhMTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdCb2R5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaGVhZGVyczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgQ29uZmlnQm9keSBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJDb25maWdCb2R5Ij4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJDb25maWdCb2R5IiwgcHJvcE9yZGVyID0gew0KLSAgICAibWVzc2FnZSINCi19KQ0KLXB1YmxpYyBjbGFzcyBDb25maWdCb2R5IHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdIZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvQ29uZmlnSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTYwYzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9Db25maWdIZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5oZWFkZXJzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBDb25maWdIZWFkZXIgY29tcGxleCB0eXBlLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iQ29uZmlnSGVhZGVyIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJDb25maWdIZWFkZXIiLCBwcm9wT3JkZXIgPSB7DQotICAgICJtZXNzYWdlIg0KLX0pDQotcHVibGljIGNsYXNzIENvbmZpZ0hlYWRlciB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvT2JqZWN0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMTJjMGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21lc3NhZ2UvaGVhZGVycy9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuaGVhZGVyczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotDQotQFhtbFJlZ2lzdHJ5DQotcHVibGljIGNsYXNzIE9iamVjdEZhY3Rvcnkgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQ29uZmlnSGVhZGVyMV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNCIsICJDb25maWdIZWFkZXIxIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9Db25maWdIZWFkZXIzX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IiwgIkNvbmZpZ0hlYWRlcjMiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0NvbmZpZ0hlYWRlcjJfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczQiLCAiQ29uZmlnSGVhZGVyMiIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQ29uZmlnQm9keV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNCIsICJDb25maWdCb2R5Iik7DQotDQotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIENvbmZpZ0hlYWRlciB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIENvbmZpZ0hlYWRlciBjcmVhdGVDb25maWdIZWFkZXIoKSB7DQotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ0hlYWRlcigpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBDb25maWdIZWFkZXIgfQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIHB1YmxpYyBDb25maWdCb2R5IGNyZWF0ZUNvbmZpZ0JvZHkoKSB7DQotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ0JvZHkoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIENvbmZpZ0JvZHkgfXtAY29kZSA+fX0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczQiLCBuYW1lID0gIkNvbmZpZ0JvZHkiKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8Q29uZmlnQm9keT4gY3JlYXRlQ29uZmlnQm9keShDb25maWdCb2R5IHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PENvbmZpZ0JvZHk+KF9Db25maWdCb2R5X1FOQU1FLCBDb25maWdCb2R5LmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQ29uZmlnSGVhZGVyIH17QGNvZGUgPn19DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IiwgbmFtZSA9ICJDb25maWdIZWFkZXIxIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PENvbmZpZ0hlYWRlcj4gY3JlYXRlQ29uZmlnSGVhZGVyMShDb25maWdIZWFkZXIgdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8Q29uZmlnSGVhZGVyPihfQ29uZmlnSGVhZGVyMV9RTkFNRSwgQ29uZmlnSGVhZGVyLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBDb25maWdIZWFkZXIgfXtAY29kZSA+fX0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9oZWFkZXJzLm1lc3NhZ2UuamF4d3MuYXhpczIuYXBhY2hlLm9yZy90eXBlczQiLCBuYW1lID0gIkNvbmZpZ0hlYWRlcjMiKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8Q29uZmlnSGVhZGVyPiBjcmVhdGVDb25maWdIZWFkZXIzKENvbmZpZ0hlYWRlciB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxDb25maWdIZWFkZXI+KF9Db25maWdIZWFkZXIzX1FOQU1FLCBDb25maWdIZWFkZXIuY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIENvbmZpZ0hlYWRlciB9e0Bjb2RlID59fQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2hlYWRlcnMubWVzc2FnZS5qYXh3cy5heGlzMi5hcGFjaGUub3JnL3R5cGVzNCIsIG5hbWUgPSAiQ29uZmlnSGVhZGVyMiIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxDb25maWdIZWFkZXI+IGNyZWF0ZUNvbmZpZ0hlYWRlcjIoQ29uZmlnSGVhZGVyIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PENvbmZpZ0hlYWRlcj4oX0NvbmZpZ0hlYWRlcjJfUU5BTUUsIENvbmZpZ0hlYWRlci5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvcGFja2FnZS1pbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWVzc2FnZS9oZWFkZXJzL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWVlMDZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9tZXNzYWdlL2hlYWRlcnMvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vaGVhZGVycy5tZXNzYWdlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvdHlwZXM0IikNCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5oZWFkZXJzOw0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0NvbnZlcnRVdGlsc1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9taXNjL0NvbnZlcnRVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzMDIxNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9Db252ZXJ0VXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5taXNjOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eS5Db252ZXJ0VXRpbHM7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLQ0KLS8qKg0KLSAqIFVuaXQgVGVzdCBmb3IgdGhlIENvbnZlcnRVdGlscyB1dGlsaXR5DQotICovDQotcHVibGljIGNsYXNzIENvbnZlcnRVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlQXJyYXl0b2J5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgQnl0ZVtdIGlucHV0ID0gbmV3IEJ5dGVbM107DQotICAgICAgICBpbnB1dFswXSA9IG5ldyBCeXRlKChieXRlKSAwKTsNCi0gICAgICAgIGlucHV0WzFdID0gbmV3IEJ5dGUoKGJ5dGUpIDEpOw0KLSAgICAgICAgaW5wdXRbMl0gPSBuZXcgQnl0ZSgoYnl0ZSkgMik7DQotICAgICAgICANCi0gICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBuZXcgYnl0ZVszXTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKENvbnZlcnRVdGlscy5pc0NvbnZlcnRhYmxlKGlucHV0LCBvdXRwdXQuZ2V0Q2xhc3MoKSkpIHsNCi0gICAgICAgICAgICBvdXRwdXQgPSAoYnl0ZVtdKSBDb252ZXJ0VXRpbHMuY29udmVydChpbnB1dCwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0Lmxlbmd0aCA9PSAzKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0WzBdID09IChieXRlKSAwKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0WzFdID09IChieXRlKSAxKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0WzJdID09IChieXRlKSAyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdEJMaXN0dG9CQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEFycmF5TGlzdDxCPiBpbnB1dCA9IG5ldyBBcnJheUxpc3Q8Qj4oKTsNCi0gICAgICAgIEIgYiA9IG5ldyBCKCk7DQotICAgICAgICBiLnNldERhdGEoMCk7DQotICAgICAgICBpbnB1dC5hZGQoYik7DQotICAgICAgICBiID0gbmV3IEIoKTsNCi0gICAgICAgIGIuc2V0RGF0YSgxKTsNCi0gICAgICAgIGlucHV0LmFkZChiKTsNCi0gICAgICAgIGIgPSBuZXcgQigpOw0KLSAgICAgICAgYi5zZXREYXRhKDIpOw0KLSAgICAgICAgaW5wdXQuYWRkKGIpOw0KLSAgICAgICAgDQotICAgICAgICBCW10gb3V0cHV0ID0gbmV3IEJbMF07DQotICAgICAgICANCi0gICAgICAgIGlmIChDb252ZXJ0VXRpbHMuaXNDb252ZXJ0YWJsZShpbnB1dCwgb3V0cHV0LmdldENsYXNzKCkpKSB7DQotICAgICAgICAgICAgb3V0cHV0ID0gKEJbXSkgQ29udmVydFV0aWxzLmNvbnZlcnQoaW5wdXQsIG91dHB1dC5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQubGVuZ3RoID09IDMpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRbMF0uZ2V0RGF0YSgpID09IDApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRbMV0uZ2V0RGF0YSgpID09IDEpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXRbMl0uZ2V0RGF0YSgpID09IDIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QkFycmF5dG9CTGlzdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBCW10gaW5wdXQgPSBuZXcgQlszXTsNCi0gICAgICAgIGlucHV0WzBdID0gbmV3IEIoKTsNCi0gICAgICAgIGlucHV0WzBdLnNldERhdGEoMCk7DQotICAgICAgICBpbnB1dFsxXSA9IG5ldyBCKCk7DQotICAgICAgICBpbnB1dFsxXS5zZXREYXRhKDEpOw0KLSAgICAgICAgaW5wdXRbMl0gPSBuZXcgQigpOw0KLSAgICAgICAgaW5wdXRbMl0uc2V0RGF0YSgyKTsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBBcnJheUxpc3Q8Qj4gb3V0cHV0ID0gbmV3IEFycmF5TGlzdDxCPigpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoQ29udmVydFV0aWxzLmlzQ29udmVydGFibGUoaW5wdXQsIG91dHB1dC5nZXRDbGFzcygpKSkgew0KLSAgICAgICAgICAgIG91dHB1dCA9IChBcnJheUxpc3Q8Qj4pIENvbnZlcnRVdGlscy5jb252ZXJ0KGlucHV0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZ2V0Q2xhc3MoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0LnNpemUoKSA9PSAzKTsNCi0gICAgICAgIGFzc2VydFRydWUob3V0cHV0LmdldCgwKS5nZXREYXRhKCkgPT0gMCk7DQotICAgICAgICBhc3NlcnRUcnVlKG91dHB1dC5nZXQoMSkuZ2V0RGF0YSgpID09IDEpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvdXRwdXQuZ2V0KDIpLmdldERhdGEoKSA9PSAyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqIA0KLSAgICAgKiBOZWdhdGl2ZSB0ZXN0Li4uY2FuJ3QgY29udmVydCBMaXN0IG9mIEIgaW50byBDW10NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RCTGlzdHRvQ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBBcnJheUxpc3Q8Qj4gaW5wdXQgPSBuZXcgQXJyYXlMaXN0PEI+KCk7DQotICAgICAgICBCIGIgPSBuZXcgQigpOw0KLSAgICAgICAgYi5zZXREYXRhKDApOw0KLSAgICAgICAgaW5wdXQuYWRkKGIpOw0KLSAgICAgICAgYiA9IG5ldyBCKCk7DQotICAgICAgICBiLnNldERhdGEoMSk7DQotICAgICAgICBpbnB1dC5hZGQoYik7DQotICAgICAgICBiID0gbmV3IEIoKTsNCi0gICAgICAgIGIuc2V0RGF0YSgyKTsNCi0gICAgICAgIGlucHV0LmFkZChiKTsNCi0gICAgICAgIA0KLSAgICAgICAgQ1tdIG91dHB1dCA9IG5ldyBDWzBdOw0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgb3V0cHV0ID0gKENbXSkgQ29udmVydFV0aWxzLmNvbnZlcnQoaW5wdXQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkNhbm5vdCBjb252ZXJ0IikpOw0KLSAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOw0KLSAgICAgICAgfSANCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzdWNjZXNzKTsNCi0gICAgfQ0KLSAgICBjbGFzcyBCIHsNCi0gICAgICAgIHByaXZhdGUgaW50IGRhdGEgPSAwOw0KLQ0KLSAgICAgICAgcHVibGljIGludCBnZXREYXRhKCkgew0KLSAgICAgICAgICAgIHJldHVybiBkYXRhOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGF0YShpbnQgZGF0YSkgew0KLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIGNsYXNzIEMgew0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZGF0YSA9IDA7DQotDQotICAgICAgICBwdWJsaWMgaW50IGdldERhdGEoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGRhdGE7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhKGludCBkYXRhKSB7DQotICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9OUzJQa2dUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9OUzJQa2dUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzg4NTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21pc2MvTlMyUGtnVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1pc2M7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsKLQotLyoqCi0gKiBUZXN0cyBOYW1lc3BhY2UgdG8gUGFja2FnZSBBbGdvcml0aG0KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBOUzJQa2dUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdDAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuczEgPSAiaHR0cDovL2V4YW1wbGUub3JnL05ld0J1c2luZXNzLyI7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFBrZzEgPSAib3JnLmV4YW1wbGUubmV3YnVzaW5lc3MiOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBrZyA9IEphdmFVdGlscy5nZXRQYWNrYWdlRnJvbU5hbWVzcGFjZShuczEpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWRQa2cxICsgIlJlY2VpdmVkICIgK3BrZywgZXhwZWN0ZWRQa2cxLmVxdWFscyhwa2cpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuczEgPSAidXJuOi8vZXhhbXBsZS1vcmcvTmV3QnVzaW5lc3MiOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRQa2cxID0gIm9yZy5leGFtcGxlIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwa2cgPSBKYXZhVXRpbHMuZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UobnMxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgIiArIGV4cGVjdGVkUGtnMSArICJSZWNlaXZlZCAiICtwa2csIGV4cGVjdGVkUGtnMS5lcXVhbHMocGtnKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3QwMygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbnMxID0gIiI7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFBrZzEgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwa2cgPSBKYXZhVXRpbHMuZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UobnMxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgIiArIGV4cGVjdGVkUGtnMSArICJSZWNlaXZlZCAiICtwa2csIGV4cGVjdGVkUGtnMS5lcXVhbHMocGtnKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL21pc2MvWE1MRmF1bHRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9YTUxGYXVsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxNmE0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvbWlzYy9YTUxGYXVsdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWlzYzsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLm1lc3NhZ2UuWE1MRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdENvZGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MubWVzc2FnZS5YTUxGYXVsdFJlYXNvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5tZXNzYWdlLnV0aWwuWE1MRmF1bHRVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5LkphdmFVdGlsczsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5Ow0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOw0KLQ0KLS8qKg0KLSAqIFRlc3RzIFhNTEZhdWx0IGxvZ2ljDQotICovDQotcHVibGljIGNsYXNzIFhNTEZhdWx0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgQ1VTVE9NID0gbmV3IFFOYW1lKCJodHRwOi8vbXlTYW1wbGUiLCAiQ3VzdG9tQ29kZSIsICJwcmUiKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IEN1c3RvbSBGYXVsdFFOYW1lIGZvciBTT0FQIDEuMQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUZhdWx0MTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBzbS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdChDVVNUT00sICJDdXN0b20gRmF1bHQiKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MRmF1bHQgeG1sRmF1bHQgPSBYTUxGYXVsdFV0aWxzLmNyZWF0ZVhNTEZhdWx0KGZhdWx0KTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWxGYXVsdCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MRmF1bHRSZWFzb24gcmVhc29uID0geG1sRmF1bHQuZ2V0UmVhc29uKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbiAhPSBudWxsKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVhc29uLmdldFRleHQoKS5lcXVhbHMoIkN1c3RvbSBGYXVsdCIpKTsNCi0gICAgICAgIA0KLSAgICAgICAgWE1MRmF1bHRDb2RlIGNvZGUgPSB4bWxGYXVsdC5nZXRDb2RlKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvZGUgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIFFOYW1lIGNvZGVRTmFtZSA9IGNvZGUudG9RTmFtZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMV9FTlZFTE9QRSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBRTmFtZSA9ICIgKyBDVVNUT00gKyAiIGJ1dCByZWNlaXZlZCA9ICIgKyBjb2RlUU5hbWUsIGNvZGVRTmFtZS5lcXVhbHMoQ1VTVE9NKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IEN1c3RvbSBGYXVsdFFOYW1lIGZvciBTT0FQIDEuMg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUZhdWx0MTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7DQotICAgICAgICBTT0FQTWVzc2FnZSBzbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBzbS5nZXRTT0FQQm9keSgpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoQ1VTVE9NLCAiQ3VzdG9tIEZhdWx0Iik7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRmFpbHVyZSwgY3VzdG9tIGZhdWx0IGNvZGVzIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggU09BUCAxLjIiKTsNCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIEV4cGVjdGVkLi4uDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGRpZmZlcmVudCBmYWlsdXJlLCByZWNlaXZlZDogIiArIHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXJhcGkvQXR0YWNobWVudFV0aWwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9BdHRhY2htZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGZlOGEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9BdHRhY2htZW50VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaTsKLQotaW1wb3J0IGphdmF4LmltYWdlaW8uSUlPSW1hZ2U7Ci1pbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZVdyaXRlcjsKLWltcG9ydCBqYXZheC5pbWFnZWlvLnN0cmVhbS5JbWFnZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyB3aWxsIHNlcnZlIGFzIGEgaGVscGVyIGNsYXNzIGZvciBhdHRhY2htZW50cyB1dGlsaXR5IG1ldGhvZHMuIEFsbCBtZXRob2RzCi0gKiBhcmUgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBzdGF0aWNseS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50VXRpbCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVV9URVhUID0gInNvYXAgbWVzc2FnZSBtdXN0VW5kZXJzdGFuZCBoZWFkZXIgcmVxdWVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJTVE9PRF9NVV9URVhUID0gInVuZGVyc3Rvb2QgaGVhZGVycyBzb2FwIG1lc3NhZ2UgbXVzdFVuZGVyc3RhbmQgaGVhZGVyIHJlcXVlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAic29hcCBtZXNzYWdlIHJlcXVlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT0RFID0gIjwiK1ZBTFVFKyI+IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT0RFX1NMQVNIID0gIjwvIitWQUxVRSsiPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0hFQURFUiA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX0NMSUVOVCA9ICJuczE6bXVjbGllbnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX1NFUlZFUiA9ICJuczE6bXVzZXJ2ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09EID0gIm5zMTptdWNsaWVudHVuZGVyc3Rvb2QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VSEVBREVSX1NFUlZFUl9VTkRFUlNUT09EID0gIm5zMTptdXNlcnZlcnVuZGVyc3Rvb2QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudk1VID0gCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpIZWFkZXI+IiArCi0gICAgICAgICAgICAgICAgIjwiK01VSEVBREVSX0NMSUVOVCsiIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCIgc29hcGVudjptdXN0VW5kZXJzdGFuZD1cIjFcIj5NVWluZm88LyIrTVVIRUFERVJfQ0xJRU5UKyI+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkhlYWRlcj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgTVVfVEVYVCArCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREVfU0xBU0ggKwotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBtc2dFbnYgPSAKLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKwotICAgICAgICAgICAgIjxzb2FwZW52OkJvZHk+IiArCi0gICAgICAgICAgICAgICAgIjxuczE6aW52b2tlIHhtbG5zOm5zMT1cImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyXCI+IiArCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREUgKwotICAgICAgICAgICAgICAgICAgICBNVV9URVhUICsKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsKLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0VudlBsYWluID0gCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgVEVYVCArCi0gICAgICAgICAgICAgICAgICAgIFZBTFVFX05PREVfU0xBU0ggKwotICAgICAgICAgICAgICAgICI8L25zMTppbnZva2U+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+IiArCi0gICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudk1VX3VuZGVyc3Rvb2QgPSAKLSAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiPiIgKwotICAgICAgICAgICAgIjxzb2FwZW52OkhlYWRlcj4iICsKLSAgICAgICAgICAgICAgICAiPCIrTVVIRUFERVJfQ0xJRU5UX1VOREVSU1RPT0QrIiB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9XCIxXCI+TVVpbmZvPC8iK01VSEVBREVSX0NMSUVOVF9VTkRFUlNUT09EKyI+IiArCi0gICAgICAgICAgICAiPC9zb2FwZW52OkhlYWRlcj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgVU5ERVJTVE9PRF9NVV9URVhUICsKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsKLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG1zZ0Vudl91bmRlcnN0b29kID0gCi0gICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIj4iICsKLSAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8bnMxOmludm9rZSB4bWxuczpuczE9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMlwiPiIgKwotICAgICAgICAgICAgICAgICAgICBWQUxVRV9OT0RFICsKLSAgICAgICAgICAgICAgICAgICAgVU5ERVJTVE9PRF9NVV9URVhUICsKLSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTk9ERV9TTEFTSCArCi0gICAgICAgICAgICAgICAgIjwvbnMxOmludm9rZT4iICsKLSAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotICAgIAotICAgIC8qKgotICAgICAqIFN0b3JlIGEgZ2l2ZW4gaW1hZ2UgdG8gYW4gSW1hZ2Ugb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBtaW1lVHlwZQotICAgICAqIEBwYXJhbSBpbWFnZQotICAgICAqIEBwYXJhbSBvcwotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlSW1hZ2UoU3RyaW5nIG1pbWVUeXBlLCBJbWFnZSBpbWFnZSwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSW1hZ2VXcml0ZXIgaW1hZ2VXcml0ZXIgPSBudWxsOwotICAgICAgICBCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSAoQnVmZmVyZWRJbWFnZSkgaW1hZ2U7Ci0gICAgICAgIAotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5nZXRJbWFnZVdyaXRlcnNCeU1JTUVUeXBlKG1pbWVUeXBlKTsKLSAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAJaW1hZ2VXcml0ZXIgPSAoSW1hZ2VXcml0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBJbWFnZU91dHB1dFN0cmVhbSBpb3MgPSBqYXZheC5pbWFnZWlvLkltYWdlSU8uY3JlYXRlSW1hZ2VPdXRwdXRTdHJlYW0ob3MpOwotICAgICAgICBpbWFnZVdyaXRlci5zZXRPdXRwdXQoaW9zKTsKLQotICAgICAgICBpbWFnZVdyaXRlci53cml0ZShuZXcgSUlPSW1hZ2UoYnVmZmVyZWRJbWFnZSwgbnVsbCwgbnVsbCkpOwotICAgICAgICBpb3MuZmx1c2goKTsKLSAgICAgICAgaW1hZ2VXcml0ZXIuZGlzcG9zZSgpOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBBZGFwdGVyIG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgYW55IHR5cGUgb2YgU291cmNlIHRvIGEgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFNvdXJjZSBpbnB1dCkgewotCi0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJVHJhbnNmb3JtZXIgdHJhc2Zvcm1lcjsKLQkJdHJ5IHsKLQkJCXRyYXNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsKLQkJCXRyYXNmb3JtZXIudHJhbnNmb3JtKGlucHV0LCByZXN1bHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gd3JpdGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHRlciBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGFueSB0eXBlIG9mIFNPQVBNZXNzYWdlIHRvIGEgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKFNPQVBNZXNzYWdlIGlucHV0KSB7Ci0KLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlucHV0LmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpOwotCQl9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdG9TdHJpbmcocmVzdWx0KTsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgdG8gY29udmVydCBTdHJpbmdzIHRvIFNPQVBNZXNzYWdlcwotCSAqIAotCSAqIEBwYXJhbSBtc2dTdHJpbmcKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU09BUE1lc3NhZ2UgdG9TT0FQTWVzc2FnZShTdHJpbmcgbXNnU3RyaW5nKSB7Ci0KLSAgICAgICAgIGlmIChtc2dTdHJpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHVzYWdlIG9mIHNwZWNpZmljIE1lc2FzZ2VGYWN0b3JpZXMKLSAgICAgICAgICAgICAgICAgaWYgKG1zZ1N0cmluZy5pbmRleE9mKFNPQVAxMV9OQU1FU1BBQ0UpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTCk7Ci0gICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRTT0FQUGFydCgpLnNldENvbnRlbnQoKFNvdXJjZSkgbmV3IFN0cmVhbVNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKG1zZ1N0cmluZykpKTsKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidG9TT0FQTWVzc2FnZSBFeGNlcHRpb24gZW5jb3VudGVyZWQ6ICIgKyBlKTsKLSAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBtZXNzYWdlOyAgICAgCi0gICAgfQotICAgIAotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXJhcGkvRGF0YVNvdXJjZUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9EYXRhU291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRlYWIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9EYXRhU291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEFuIGltcGwgY2xhc3MgZm9yIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBpbnRlcmZhY2UuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUltcGwgaW1wbGVtZW50cyBEYXRhU291cmNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29udGVudFR5cGU7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBieXRlQXJyYXk7Ci0KLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPUzsKLSAgICAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBfY29udGVudFR5cGUKLQkgKiBAcGFyYW0gX2ZpbGVOYW1lCi0JICogQHBhcmFtIGltYWdlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGF0YVNvdXJjZUltcGwoU3RyaW5nIF9jb250ZW50VHlwZSwgU3RyaW5nIF9maWxlTmFtZSwgSW1hZ2UgaW1hZ2UpIHRocm93cyBFeGNlcHRpb257Ci0JCXN1cGVyKCk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAJaWYoKF9jb250ZW50VHlwZSA9PSBudWxsKSB8fCAoX2NvbnRlbnRUeXBlID09ICIiKSl7Ci0gICAgICAgIAkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUeXBlIGlzIE5VTEw6IE11c3QgcHJvdmlkZSBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWlmKChfZmlsZU5hbWUgPT0gbnVsbCkgfHwgKF9jb250ZW50VHlwZSA9PSAiIikpewotICAgICAgICAJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiRmlsZSBuYW1lIGlzIE5VTEw6IE11c3QgcHJvdmlkZSBjb250ZW50IGZpbGUgbmFtZSIpOwotICAgICAgICAJfQotICAgICAgICAJCi0gICAgICAgIAl0aGlzLmZpbGVOYW1lID0gX2ZpbGVOYW1lOwotICAgIAkJdGhpcy5jb250ZW50VHlwZSA9IF9jb250ZW50VHlwZTsKLSAgICAgICAgCQotICAgICAgICAgICAgaWYgKGltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlieXRlQXJyYXlPUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50VXRpbC5zdG9yZUltYWdlKHRoaXMuY29udGVudFR5cGUsIGltYWdlLCBieXRlQXJyYXlPUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UjZ2V0Q29udGVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSNnZXRJbnB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuYnl0ZUFycmF5T1Muc2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuYnl0ZUFycmF5ID0gdGhpcy5ieXRlQXJyYXlPUy50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgdGhpcy5ieXRlQXJyYXlPUy5yZXNldCgpOwotICAgICAgICB9Ci0JCQotCQlpZih0aGlzLmJ5dGVBcnJheSA9PSBudWxsKXsKLQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotCQkJCi0JCX0KLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0aGlzLmJ5dGVBcnJheSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsZU5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlI2dldE91dHB1dFN0cmVhbSgpCi0JICovCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodGhpcy5ieXRlQXJyYXlPUy5zaXplKCkgIT0gMCkgewotCQkJdGhpcy5ieXRlQXJyYXkgPSB0aGlzLmJ5dGVBcnJheU9TLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB0aGlzLmJ5dGVBcnJheU9TLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnl0ZUFycmF5T1M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL0dlbmVyaWNPcGVyYXRpb25Qcm92aWRlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9HZW5lcmljT3BlcmF0aW9uUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwODBjNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL0dlbmVyaWNPcGVyYXRpb25Qcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucHJvdmlkZXJhcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXI7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09wZXJhdGlvblByb3ZpZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0hUVFBCaW5kaW5nT3BlcmF0aW9uKCkgewotICAgICAgICAvLyBUaGUgSFRUUCBiaW5kaW5nIHN1cHBvcnRzIGEgZ2VuZXJpYyBvcGVyYXRpb24gZm9yIFdTREwtbGVzcyBlbmRwb2ludHMuCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oSFRUUEJpbmRpbmdQcm92aWRlckltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU3ZjID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1N2Yyk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGludGVyZmFjZURlc2MpOwotCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBPcERlc2Mgd2l0aCBhIHNpbmdsZSBBeGlzT3BlcmF0aW9uIHdpdGggYSBzcGVjaWZpYyBuYW1lCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzY3NbXSA9IGludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wRGVzY3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3BEZXNjcy5sZW5ndGgpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBvcERlc2NzWzBdLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uSkFYV1NfTk9XU0RMX1BST1ZJREVSX09QRVJBVElPTl9OQU1FLCBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3cgdmVyaWZ5IHRoYXQgdGhlIHNwZWNpYWwgZGlzcGF0aGVyIGNhbiBmaW5kIHRoaXMgb3BlcmF0aW9uCi0gICAgICAgIEdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IG5ldyBHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGF4aXNTdmMpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaGVyIHdpbGwgbm90IHRyeSB0byByZXNvbHZlIGFuIEF4aXNTZXJ2aWNlCi0gICAgICAgICAgICBhc3NlcnROdWxsKGRpc3BhdGNoZXIuZmluZFNlcnZpY2UobWVzc2FnZUNvbnRleHQpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVGhlIGRpc3BhdGNoZXIgc2hvdWxkIGZpbmQgdGhlIHNwZWNpYWwgQXhpc09wZXJhdGlvbgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGF4aXNPcGVyYXRpb24sIGRpc3BhdGNoZXIuZmluZE9wZXJhdGlvbihheGlzU3ZjLCBtZXNzYWdlQ29udGV4dCkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24iICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZW5lcmljU09BUEJpbmRpbmdPcGVyYXRpb24oKSB7Ci0gICAgICAgIC8vIFJFVklFVzogQ3VycmVudGx5IGdlbmVyaWMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgU09BUCBCaW5kaW5ncwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihTT0FQQmluZGluZ1Byb3ZpZGVySW1wbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU3ZjKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFNpbmNlIHRoZXJlJ3Mgbm8gV1NETCwgdGhlcmUgd2lsbCBiZSBubyBvcGVyYXRpb25zIGFuZCBubyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uCi0gICAgICAgIC8vIGJlY2F1c2UgdGhpcyBpcyBhIFNPQVBCaW5kaW5nLgotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGludGVyZmFjZURlc2MgPSBlbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROdWxsKGludGVyZmFjZURlc2MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJQmFzZWRFbmRwb2ludCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihTRUlCYXNlZEVuZHBvaW50LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1N2YyA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTdmMpOwotICAgICAgICAKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBpbnRlcmZhY2VEZXNjID0gZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnRlcmZhY2VEZXNjKTsKLQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgT3BEZXNjIHdpdGggYSBzaW5nbGUgQXhpc09wZXJhdGlvbiBiYXNlZCBvbiB0aGUgU0VJIGJlbG93Ci0gICAgICAgIC8vIEJ1dCBpdCBzaG91bGQgbm90IGJlIHRoZSBzcGVjaWFsIG5hbWVkIG9wZXJhdGlvbiBhbmQgdGhlIHNwZWNpYWwgZGlzcGF0Y2hlciBzaG91bGQgbm90Ci0gICAgICAgIC8vIHJldHVybiBudWxsIGZvciBvcGVyYXRpb24gZGlzcGF0Y2gKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjc1tdID0gaW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BEZXNjcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcERlc2NzLmxlbmd0aCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG9wRGVzY3NbMF0uZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb24pOwotICAgICAgICBpZiAoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi5KQVhXU19OT1dTRExfUFJPVklERVJfT1BFUkFUSU9OX05BTUUuZXF1YWxzKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgZmFpbCgiT3BlcmF0aW9uIGhhcyB0aGUgZ2VuZXJpYyBwcm92aWRlciBuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE5vdyB2ZXJpZnkgdGhhdCB0aGUgc3BlY2lhbCBkaXNwYXRoZXIgZG9lc24ndCBmaW5kIHRoZSBzcGVjaWFsIG9wZXJhdGlvbgotICAgICAgICBHZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBuZXcgR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlcigpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShheGlzU3ZjKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUaGUgZGlzcGF0Y2hlciB3aWxsIG5vdCB0cnkgdG8gcmVzb2x2ZSBhbiBBeGlzU2VydmljZQotICAgICAgICAgICAgYXNzZXJ0TnVsbChkaXNwYXRjaGVyLmZpbmRTZXJ2aWNlKG1lc3NhZ2VDb250ZXh0KSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZSBkaXNwYXRjaGVyIHNob3VsZCBmaW5kIHRoZSBzcGVjaWFsIEF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgIGFzc2VydE51bGwoZGlzcGF0Y2hlci5maW5kT3BlcmF0aW9uKGF4aXNTdmMsIG1lc3NhZ2VDb250ZXh0KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci19Ci0KLQotLy8gTm90aWNlIG5vIFdTREwgaXMgc3BlY2lmaWVkCi1AV2ViU2VydmljZVByb3ZpZGVyKCkKLUBCaW5kaW5nVHlwZSh2YWx1ZT1IVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpCi1AU2VydmljZU1vZGUodmFsdWU9amF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFKQotY2xhc3MgSFRUUEJpbmRpbmdQcm92aWRlckltcGwgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsKLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi19Ci0vL05vdGljZSBubyBXU0RMIGlzIHNwZWNpZmllZAotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1jbGFzcyBTT0FQQmluZGluZ1Byb3ZpZGVySW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gewotCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQotLy8gU0VJIGJhc2VkIGVuZHBvaW50IHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGdldCBnZXQgdGhlIHNwZWNpYWwgZ2VuZXJpYyBwcm92aWRlciBvcGVyYXRpb24gYWRkZWQKLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFNFSUJhc2VkRW5kcG9pbnQgewotICAgIHB1YmxpYyBTdHJpbmcgZWNobygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL1Byb3ZpZGVyVGVzdENhc2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9Qcm92aWRlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTYwYWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3Byb3ZpZGVyYXBpL1Byb3ZpZGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5wcm92aWRlcmFwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdmlkZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBRTmFtZSBwb3J0TmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiLCAiU2ltcGxlUHJvdmlkZXJTZXJ2aWNlU09BUDExcG9ydDAiKTsKLSAgICBwdWJsaWMgU3RyaW5nIHByb3ZpZGVyUmVzb3VyY2VEaXIgPSAidGVzdC1yZXNvdXJjZXMiK0ZpbGUuc2VwYXJhdG9yKyJwcm92aWRlciI7Ci0gICAgcHVibGljIFN0cmluZyBpbWFnZVJlc291cmNlRGlyID0gInRlc3QtcmVzb3VyY2VzIitGaWxlLnNlcGFyYXRvcisiaW1hZ2UiOwotICAgIHB1YmxpYyBTdHJpbmcgYmFzZWRpciA9IG51bGw7Ci0gICAgCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy9TdGFydFNlcnZlciBzdGFydFNlcnZlciA9IG5ldyBTdGFydFNlcnZlcigic2VydmVyMSIpOwotCQkvL3N0YXJ0U2VydmVyLnRlc3RTdGFydFNlcnZlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCS8vU3RvcFNlcnZlciBzdG9wU2VydmVyID0gbmV3IFN0b3BTZXJ2ZXIoInNlcnZlcjEiKTsKLQkJLy9zdG9wU2VydmVyLnRlc3RTdG9wU2VydmVyKCk7Ci0JfQotCQotICAgIHB1YmxpYyBQcm92aWRlclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBpZihiYXNlZGlyID09IG51bGwpewotICAgICAgICAgICAgYmFzZWRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdmlkZXJSZXNvdXJjZURpciA9IG5ldyBGaWxlKGJhc2VkaXIsIHByb3ZpZGVyUmVzb3VyY2VEaXIpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBpbWFnZVJlc291cmNlRGlyID0gbmV3IEZpbGUoYmFzZWRpciwgaW1hZ2VSZXNvdXJjZURpcikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvcHJvdmlkZXJhcGkvU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZlZjlkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9wcm92aWRlcmFwaS9Tb2FwTWVzc2FnZU1VUHJvdmlkZXJDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3ZpZGVyYXBpOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotLyoqDQotICogUGx1Z2luIHRvIHJlbW92ZSAidW5kZXJzdG9vZCIgaGVhZGVycyBmb3IgdGhlIFNvYXBNZXNzYWdlTVVQcm92aWRlclRlc3RzLiAgVGhpcyBjbGFzcyBtdXN0DQotICogYmUgY29uZmlndXJlZCBpbiB0aGUgYXhpczIueG1sIGZpbGUgb24gYm90aCB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU29hcE1lc3NhZ2VNVVByb3ZpZGVyQ2hlY2tlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIHsNCi0NCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgaGVhZGVycyBmb3IgdGhlIHJvbGVzIHdlJ3JlIGFjdGluZyBpbiwgdGhlbiBtYXJrIGFueSB3ZSB1bmRlcnN0YW5kDQotICAgICAgICAvLyBhcyBwcm9jZXNzZWQuDQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7DQotICAgICAgICBpZiAoZW52ZWxvcGUuZ2V0SGVhZGVyKCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7DQotICAgICAgICB9DQotICAgICAgICAvLyBUaGVzZSBhcmUgdGhlIGhlYWRlcnMgdGhlIHRlc3QgZXhwZWN0cyB0byBiZSB1bmRlcnN0b29kDQotICAgICAgICBTdHJpbmcgbnMxID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIjsNCi0gICAgICAgIFN0cmluZyBjbGllbnRMb2NhbE5hbWUgPSAibXVjbGllbnR1bmRlcnN0b29kIjsNCi0gICAgICAgIFN0cmluZyBzZXJ2ZXJMb2NhbE5hbWUgPSAibXVzZXJ2ZXJ1bmRlcnN0b29kIjsNCi0NCi0gICAgICAgIFFOYW1lIGNsaWVudFFOID0gbmV3IFFOYW1lKG5zMSwgY2xpZW50TG9jYWxOYW1lKTsNCi0gICAgICAgIFFOYW1lIHNlcnZlclFOID0gbmV3IFFOYW1lKG5zMSwgc2VydmVyTG9jYWxOYW1lKTsNCi0NCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3MobnVsbCk7DQotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IChTT0FQSGVhZGVyQmxvY2spIGhlYWRlckJsb2Nrcy5uZXh0KCk7DQotICAgICAgICAgICAgUU5hbWUgaGVhZGVyUU4gPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIGlmIChjbGllbnRRTi5lcXVhbHMoaGVhZGVyUU4pKSB7DQotLy8gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXJraW5nIGFzIHByb2Nlc3NlZCBDTElFTlQgUU46ICIgKyBjbGllbnRRTik7DQotICAgICAgICAgICAgICAgIGhlYWRlckJsb2NrLnNldFByb2Nlc3NlZCgpOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmVyUU4uZXF1YWxzKGhlYWRlclFOKSkgew0KLS8vICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFya2luZyBhcyBwcm9jZXNzZWQgU0VSVkVSIFFOOiAiICsgc2VydmVyUU4pOw0KLSAgICAgICAgICAgICAgICBoZWFkZXJCbG9jay5zZXRQcm9jZXNzZWQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvSkFYV1NTZXJ2ZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU1NlcnZlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTYzNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9KQVhXU1NlcnZlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jb3JlLk1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5Lkludm9jYXRpb25MaXN0ZW5lclJlZ2lzdHJ5Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotcHVibGljIGNsYXNzIEpBWFdTU2VydmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGZhYzEgPSBuZXcgVGVzdEludm9jYXRpb25Qcm9jZXNzb3JGYWN0b3J5MSgpOw0KLSAgICBJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3J5IGZhYzIgPSBuZXcgVGVzdEludm9jYXRpb25Qcm9jZXNzb3JGYWN0b3J5MigpOw0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7DQotICAgICAgICBJbnZvY2F0aW9uTGlzdGVuZXJSZWdpc3RyeS5hZGRGYWN0b3J5KGZhYzEpOw0KLSAgICAgICAgSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuYWRkRmFjdG9yeShmYWMyKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgdmVyaWZpZXMgdGhhdCBtdWx0aXBsZSBJbnZvY2F0aW9uUHJvY2Vzc29yRmFjdG9yaWVzIGNhbiBiZQ0KLSAgICAgKiByZWdpc3RlcmVkIHdpdGggdGhlIEZhY3RvcnlSZWdpc3RyeS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckZhY3RvcmllcygpIHsNCi0gICAgICAgIENvbGxlY3Rpb248SW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeT4gZmFjdG9yaWVzID0gSW52b2NhdGlvbkxpc3RlbmVyUmVnaXN0cnkuZ2V0RmFjdG9yaWVzKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGZhY3Rvcmllcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZmFjdG9yaWVzLnNpemUoKSwgMik7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHdpbGwgdmVyaWZ5IHRoYXQgdGhlIEpBWFdTTWVzc2FnZVJlY2VpdmVyIGlzIGFibGUgdG8gZmluZCBhbmQNCi0gICAgICogc3RvcmUgSW52b2NhdGlvblByb2Nlc3NvckZhY3RvcmllcyBvbiB0aGUgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGYWN0b3JpZXNUb0VJQygpIHsNCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICBKQVhXU01lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG5ldyBKQVhXU01lc3NhZ2VSZWNlaXZlcigpOw0KLSAgICAgICAgcmVjZWl2ZXIuYWRkSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yaWVzKGVpYyk7DQotICAgICAgICBDb2xsZWN0aW9uPEludm9jYXRpb25MaXN0ZW5lckZhY3Rvcnk+IGZhY3RvcmllcyA9IGVpYy5nZXRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZmFjdG9yaWVzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWN0b3JpZXMuc2l6ZSgpLCAyKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyB3aWxsIHRlc3RzIHRoYXQgcmVnaXN0ZXJlZCBJbnZvY2F0aW9uTGlzdGVuZXJzIGFyZSBwcm9wZXJseSBjYWxsZWQNCi0gICAgICogYnkgdGhlIEpBWC1XUyBzZXJ2ZXItc2lkZSBjb2RlLiBUaGlzIHRlc3QgYXBwcm94aW1hdGVzIGEgc3luY2hyb25vdXMNCi0gICAgICogbWVzc2FnZSByZXF1ZXN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0ludm9jYXRpb25MaXN0ZW5lcigpIHsNCi0gICAgICAgIEVuZHBvaW50Q29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IEVuZHBvaW50Q29udHJvbGxlcigpOw0KLSAgICAgICAgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCBlaWMgPSBuZXcgRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dEltcGwoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlcXVlc3QgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBlaWMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOw0KLSAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOw0KLSAgICAgICAgSkFYV1NNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgSkFYV1NNZXNzYWdlUmVjZWl2ZXIoKTsNCi0gICAgICAgIHJlY2VpdmVyLmFkZEludm9jYXRpb25MaXN0ZW5lckZhY3RvcmllcyhlaWMpOw0KLSAgICAgICAgY29udHJvbGxlci5yZXF1ZXN0UmVjZWl2ZWQoZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdFJlY2VpdmVkIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikgcmVxdWVzdC5nZXRQcm9wZXJ0eSgicmVxdWVzdFJlY2VpdmVkIikpOw0KLSAgICAgICAgY29udHJvbGxlci5yZXNwb25zZVJlYWR5KGVpYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldFByb3BlcnR5KCJyZXNwb25zZVJlYWR5IikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoQm9vbGVhbikgcmVzcG9uc2UuZ2V0UHJvcGVydHkoInJlc3BvbnNlUmVhZHkiKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHdpbGwgdGVzdHMgdGhhdCByZWdpc3RlcmVkIEludm9jYXRpb25MaXN0ZW5lcnMgYXJlIHByb3Blcmx5IGNhbGxlZA0KLSAgICAgKiBieSB0aGUgSkFYLVdTIHNlcnZlci1zaWRlIGNvZGUuIFRoaXMgdGVzdCBhcHByb3hpbWF0ZXMgYW4gYXN5bmNocm9ub3VzDQotICAgICAqIG1lc3NhZ2UgcmVxdWVzdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFzeW5jSW52b2NhdGlvbkxpc3RlbmVyKCkgew0KLSAgICAgICAgRW5kcG9pbnRDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgRW5kcG9pbnRDb250cm9sbGVyKCk7DQotICAgICAgICBFbmRwb2ludENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IEVuZHBvaW50Q2FsbGJhY2soKTsNCi0gICAgICAgIEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXF1ZXN0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIGVpYy5zZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHJlc3BvbnNlKTsNCi0gICAgICAgIEpBWFdTTWVzc2FnZVJlY2VpdmVyIHJlY2VpdmVyID0gbmV3IEpBWFdTTWVzc2FnZVJlY2VpdmVyKCk7DQotICAgICAgICByZWNlaXZlci5hZGRJbnZvY2F0aW9uTGlzdGVuZXJGYWN0b3JpZXMoZWljKTsNCi0gICAgICAgIGNvbnRyb2xsZXIucmVxdWVzdFJlY2VpdmVkKGVpYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlcXVlc3QuZ2V0UHJvcGVydHkoInJlcXVlc3RSZWNlaXZlZCIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoKEJvb2xlYW4pIHJlcXVlc3QuZ2V0UHJvcGVydHkoInJlcXVlc3RSZWNlaXZlZCIpKTsNCi0gICAgICAgIGNhbGxiYWNrLnJlc3BvbnNlUmVhZHkoZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0UHJvcGVydHkoInJlc3BvbnNlUmVhZHkiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKChCb29sZWFuKSByZXNwb25zZS5nZXRQcm9wZXJ0eSgicmVzcG9uc2VSZWFkeSIpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgd2lsbCB0ZXN0IHRoYXQgZXhjZXB0aW9ucyBhcmUgcHJvcGVybHkgaGFuZGVkIGRvd24gdG8gdGhlIHJlZ2lzdGVyZWQNCi0gICAgICogaW5zdGFuY2VzIG9mIEludm9jYXRpb25MaXN0ZW5lciBvYmplY3RzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZUV4Y2VwdGlvbigpIHsNCi0gICAgICAgIEVuZHBvaW50Q29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IEVuZHBvaW50Q29udHJvbGxlcigpOw0KLSAgICAgICAgRW5kcG9pbnRDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBFbmRwb2ludENhbGxiYWNrKCk7DQotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IG5ldyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIGVpYy5hZGRJbnZvY2F0aW9uTGlzdGVuZXIobmV3IFRlc3RJbnZvY2F0aW9uTGlzdGVuZXIoKSk7DQotICAgICAgICBFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oKTsNCi0gICAgICAgIEludm9jYXRpb25IZWxwZXIuY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbihlLCBlaWMpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXF1ZXN0LmdldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5NQVBQRURfRVhDRVBUSU9OKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIG5vdyB0ZXN0IHRoYXQgaW4gdGhlIGNhc2UgdGhpcyBoYXBwZW5zIG9uIGEgcmVzcG9uc2UsIHdlIHNldCB2YWx1ZXMgDQotICAgICAgICAvLyBvbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBjb250ZXh0DQotICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlc3BvbnNlTWVzc2FnZUNvbnRleHQocmVzcG9uc2UpOw0KLSAgICAgICAgZWljLmFkZEludm9jYXRpb25MaXN0ZW5lcihuZXcgVGVzdEludm9jYXRpb25MaXN0ZW5lcigpKTsNCi0gICAgICAgIGUgPSBuZXcgRXhjZXB0aW9uKCk7DQotICAgICAgICBJbnZvY2F0aW9uSGVscGVyLmNhbGxMaXN0ZW5lcnNGb3JFeGNlcHRpb24oZSwgZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04pKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gbm93IHRlc3QgdGhlIEludm9jYXRpb25IZWxwZXIgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHRocm93YWJsZSBhbmQNCi0gICAgICAgIC8vIE1lc3NhZ2VDb250ZXh0DQotICAgICAgICBjb250cm9sbGVyID0gbmV3IEVuZHBvaW50Q29udHJvbGxlcigpOw0KLSAgICAgICAgY2FsbGJhY2sgPSBuZXcgRW5kcG9pbnRDYWxsYmFjaygpOw0KLSAgICAgICAgZWljID0gbmV3IEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHRJbXBsKCk7DQotICAgICAgICByZXF1ZXN0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7DQotICAgICAgICBlaWMuc2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KHJlcXVlc3QpOw0KLSAgICAgICAgZWljLmFkZEludm9jYXRpb25MaXN0ZW5lcihuZXcgVGVzdEludm9jYXRpb25MaXN0ZW5lcigpKTsNCi0gICAgICAgIGUgPSBuZXcgRXhjZXB0aW9uKCk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWMuZ2V0SW52b2NhdGlvbkxpc3RlbmVycygpKTsNCi0gICAgICAgIEludm9jYXRpb25IZWxwZXIuY2FsbExpc3RlbmVyc0ZvckV4Y2VwdGlvbihlLCByZXF1ZXN0KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVxdWVzdC5nZXRQcm9wZXJ0eShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5Db25zdGFudHMuTUFQUEVEX0VYQ0VQVElPTikpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3Qgd2lsbCB2ZXJpZnkgdGhhdCB0aGUgSW52b2NhdGlvbkhlbHBlci5kZXRlcm1pbmVNYXBwZWRFeGNlcHRpb24gbWV0aG9kIGlzIA0KLSAgICAgKiBjYXBhYmxlIG9mIGNvcnJlY3RseSBpZGVudGlmeWluZyB0aGUgbWV0aG9kIHRvIGJlIHRocm93biBvbiB0aGUgc2VydmVyLXNpZGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5lRXhjZXB0aW9uKCkgew0KLSAgICAgICAgDQotICAgICAgICAvLyB0ZXN0IHRoZSBzaWduYXR1cmUgb2YgZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uIHRoYXQgdGFrZXMgYW4gRW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dA0KLSAgICAgICAgRW5kcG9pbnRDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgRW5kcG9pbnRDb250cm9sbGVyKCk7DQotICAgICAgICBFbmRwb2ludEludm9jYXRpb25Db250ZXh0IGVpYyA9IG5ldyBFbmRwb2ludEludm9jYXRpb25Db250ZXh0SW1wbCgpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLSAgICAgICAgZWljLnNldFJlcXVlc3RNZXNzYWdlQ29udGV4dChyZXF1ZXN0KTsNCi0gICAgICAgIGVpYy5hZGRJbnZvY2F0aW9uTGlzdGVuZXIobmV3IFRlc3RJbnZvY2F0aW9uTGlzdGVuZXIoKSk7DQotICAgICAgICBUaHJvd2FibGUgdCA9IEludm9jYXRpb25IZWxwZXIuZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uKG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSwgZWljKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodCk7DQotICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyB0ZXN0IHRoZSBzaWduYXR1cmUgb2YgZGV0ZXJtaW5lTWFwcGVkRXhjZXB0aW9uIHRoYXQgdGFrZXMgYSBNZXNzYWdlQ29udGV4dA0KLSAgICAgICAgY29udHJvbGxlciA9IG5ldyBFbmRwb2ludENvbnRyb2xsZXIoKTsNCi0gICAgICAgIHJlcXVlc3QgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIGVpYy5zZXRSZXF1ZXN0TWVzc2FnZUNvbnRleHQocmVxdWVzdCk7DQotICAgICAgICBMaXN0PEludm9jYXRpb25MaXN0ZW5lcj4gaW52b2NhdGlvbkxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SW52b2NhdGlvbkxpc3RlbmVyPigpOw0KLSAgICAgICAgaW52b2NhdGlvbkxpc3RlbmVycy5hZGQobmV3IFRlc3RJbnZvY2F0aW9uTGlzdGVuZXIoKSk7DQotICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNvbnN0YW50cy5JTlZPQ0FUSU9OX0xJU1RFTkVSX0xJU1QsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uTGlzdGVuZXJzKTsNCi0gICAgICAgIHQgPSBJbnZvY2F0aW9uSGVscGVyLmRldGVybWluZU1hcHBlZEV4Y2VwdGlvbihuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCksIHJlcXVlc3QpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0KTsNCi0gICAgICAgIGFzc2VydFRydWUodC5nZXRDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpKSk7DQotICAgIH0NCi0gICAgDQotICAgIHN0YXRpYyBjbGFzcyBUZXN0SW52b2NhdGlvblByb2Nlc3NvckZhY3RvcnkxIGltcGxlbWVudHMgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSB7DQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvbkxpc3RlbmVyIGNyZWF0ZUludm9jYXRpb25MaXN0ZW5lcihNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0SW52b2NhdGlvbkxpc3RlbmVyKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHN0YXRpYyBjbGFzcyBUZXN0SW52b2NhdGlvblByb2Nlc3NvckZhY3RvcnkyIGltcGxlbWVudHMgSW52b2NhdGlvbkxpc3RlbmVyRmFjdG9yeSB7DQotICAgICAgICBwdWJsaWMgSW52b2NhdGlvbkxpc3RlbmVyIGNyZWF0ZUludm9jYXRpb25MaXN0ZW5lcihNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0SW52b2NhdGlvbkxpc3RlbmVyKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICBzdGF0aWMgY2xhc3MgVGVzdEludm9jYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEludm9jYXRpb25MaXN0ZW5lciB7DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeShJbnZvY2F0aW9uTGlzdGVuZXJCZWFuIGJlYW4pIHsNCi0gICAgICAgICAgICBpZihiZWFuLmdldFN0YXRlKCkuZXF1YWxzKEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVRVUVTVCkpIHsNCi0gICAgICAgICAgICAgICAgYmVhbi5nZXRFbmRwb2ludEludm9jYXRpb25Db250ZXh0KCkuZ2V0UmVxdWVzdE1lc3NhZ2VDb250ZXh0KCkuDQotICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSgicmVxdWVzdFJlY2VpdmVkIiwgdHJ1ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKGJlYW4uZ2V0U3RhdGUoKS5lcXVhbHMoSW52b2NhdGlvbkxpc3RlbmVyQmVhbi5TdGF0ZS5SRVNQT05TRSkpew0KLSAgICAgICAgICAgICAgICBiZWFuLmdldEVuZHBvaW50SW52b2NhdGlvbkNvbnRleHQoKS5nZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkuDQotICAgICAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSgicmVzcG9uc2VSZWFkeSIsIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5T25FeGNlcHRpb24oSW52b2NhdGlvbkxpc3RlbmVyQmVhbiBiZWFuKSB7DQotICAgICAgICAgICAgaWYoYmVhbi5nZXRTdGF0ZSgpLmVxdWFscyhJbnZvY2F0aW9uTGlzdGVuZXJCZWFuLlN0YXRlLlJFUVVFU1QpKSB7DQotICAgICAgICAgICAgICAgIGJlYW4uZ2V0RW5kcG9pbnRJbnZvY2F0aW9uQ29udGV4dCgpLmdldFJlcXVlc3RNZXNzYWdlQ29udGV4dCgpLg0KLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIGlmIChiZWFuLmdldFN0YXRlKCkuZXF1YWxzKEludm9jYXRpb25MaXN0ZW5lckJlYW4uU3RhdGUuUkVTUE9OU0UpKXsNCi0gICAgICAgICAgICAgICAgYmVhbi5nZXRFbmRwb2ludEludm9jYXRpb25Db250ZXh0KCkuZ2V0UmVzcG9uc2VNZXNzYWdlQ29udGV4dCgpLg0KLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQ29uc3RhbnRzLk1BUFBFRF9FWENFUFRJT04sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmdQcm92aWRlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0JpbmRpbmdQcm92aWRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTIyZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9CaW5kaW5nUHJvdmlkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLQotLyoqCi0gKiBUaGUgY2xpZW50IEFQSXMgc2hvdWxkIGVhY2ggaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIKLSAqIGludGVyZmFjZS4gIFRoaXMgc3VpdGUgc2hvdWxkIGJlIHVzZWQgZm9yIGFueSBjbGllbnQgQVBJcyB0byB2ZXJpZnkgdGhhdCB0aGV5IAotICogbWFpbnRhaW4gdGhhdCBiZWhhdmlvci4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nUHJvdmlkZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgUU5hbWUgc2VydmljZVFOYW1lOwotICAgIHB1YmxpYyBRTmFtZSBwb3J0UU5hbWU7Ci0gICAgCi0gICAgcHVibGljIEJpbmRpbmdQcm92aWRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsICJUZXN0U2VydmljZSIpOwotICAgICAgICBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0IiwgIlRlc3RQb3J0Iik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEEgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgRGlzcGF0Y2ggb2JqZWN0cyBpbXBsZW1lbnQgdGhlIHByb3BlciBpbnRlcmZhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcHRhY2hCaW5kaW5nUHJvdmlkZXJTUEkoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsKLSAgICAgICAgc3ZjLmFkZFBvcnQocG9ydFFOYW1lLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsICIiKTsKLSAgICAgICAgCi0gICAgICAgIERpc3BhdGNoIGRzcCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChwb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLk1FU1NBR0UpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBjYXN0IHRoZSBvYmplY3QgdG8gdGhlIHJpZ2h0IGludGVyZmFjZXMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIERpc3BhdGNoIG9iamVjdCBzaG91bGQgYWxzbyBiZSBhIGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXIiLCAKLSAgICAgICAgICAgICAgICAoZHNwIGluc3RhbmNlb2YgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcikpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRGlzcGF0Y2ggb2JqZWN0IHNob3VsZCBhbHNvIGJlIGEgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyIiwgCi0gICAgICAgICAgICAgICAgZHNwIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyKTsKLSAgICAgICAgCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlciBicCA9IChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIpIGRzcDsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZCA9IGJwLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU2VydmljZURlc2NyaXB0aW9uIHdhcyBudWxsIiwgc2QgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gYnAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiB3YXMgbnVsbCIsIGVkICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgcHJveHkgb2JqZWN0cyBpbXBsZW1lbnQgdGhlIHByb3BlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3h5QmluZGluZ1Byb3ZpZGVyU1BJKCkgewotICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIFNhbXBsZSBzID0gc3ZjLmdldFBvcnQoU2FtcGxlLmNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gY2FzdCB0aGUgb2JqZWN0IHRvIHRoZSByaWdodCBpbnRlcmZhY2VzCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBQcm94eSBvYmplY3Qgc2hvdWxkIGFsc28gYmUgYSBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyIiwKLSAgICAgICAgICAgICAgICBzIGluc3RhbmNlb2YgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcik7Ci0gICAgICAgIGFzc2VydFRydWUoIlRoZSBQcm94eSBvYmplY3Qgc2hvdWxkIGFsc28gYmUgYSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIiLAotICAgICAgICAgICAgICAgIHMgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5CaW5kaW5nUHJvdmlkZXIpOwotICAgICAgICAKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuQmluZGluZ1Byb3ZpZGVyIGJwID0gKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkJpbmRpbmdQcm92aWRlcikgczsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZCA9IGJwLmdldFNlcnZpY2VEZWxlZ2F0ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU2VydmljZURlc2NyaXB0aW9uIHdhcyBudWxsIiwgc2QgIT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gYnAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiB3YXMgbnVsbCIsIGVkICE9IG51bGwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5IYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmMxM2NmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qDQotICogWW91IGNhbid0IGFjdHVhbGx5IHNwZWNpZnkgd2hldGhlciBhIGhhbmRsZXIgaXMgZm9yIGNsaWVudCBvciBzZXJ2ZXIsDQotICogeW91IGp1c3QgaGF2ZSB0byBjaGVjayBpbiB0aGUgaGFuZGxlTWVzc2FnZSBhbmQvb3IgaGFuZGxlRmF1bHQgdG8gbWFrZQ0KLSAqIHN1cmUgd2hhdCBkaXJlY3Rpb24gd2UncmUgZ29pbmcuDQotICovDQotDQotcHVibGljIGNsYXNzIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlciBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KSB7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0IGdldEhlYWRlcnMoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzcyNDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9DbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuRGVzY3JpcHRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsNCi0NCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlclJlc29sdmVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIFZlcmlmeSB0aGF0IGhhbmRsZXIgY2hhaW5zIHNwZWNpZmllZCB1c2luZyB0aGUgSGFuZGxlckNoYWluc1R5cGUgaW4gYSBzcGFyc2UNCi0gKiBjb21wb3NpdGUgYXJlIGNvcnJlY3RseSBhcHBsaWVkIHRvIFNlcnZpY2VzIGFuZCBQb3J0cyBvbiB0aGUgY2xpZW50IHJlcXVlc3Rlci4gDQotICovDQotcHVibGljIGNsYXNzIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly93d3cuYXBhY2hlLm9yZy90ZXN0L25hbWVzcGFjZSI7DQotICAgIHN0YXRpYyBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gIkR1bW15U2VydmljZSI7DQotICAgIHN0YXRpYyBwcml2YXRlIFN0cmluZyBwb3J0TG9jYWxQYXJ0ID0gIkR1bW15UG9ydCI7DQotICAgIHByaXZhdGUgc3RhdGljIGludCB1bmlxdWVTZXJ2aWNlID0gMDsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiAgVGVzdCBjcmVhdGluZyBhIHNlcnZpY2Ugd2l0aG91dCBhIHNwYXJzZSBjb21wb3NpdGUuICBUaGlzIHZlcmlmaWVzIHByZS1leGlzdGluZyBkZWZhdWx0DQotICAgICAqICBiZWhhdmlvci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQW5kUG9ydE5vQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLQ0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsNCi0gICAgICAgIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlciA9IHNlcnZpY2UuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU5hbWUsIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSS5jbGFzcyk7DQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBwb3J0cyBjcmVhdGVkIHVuZGVyIHRoZSBzZXJ2aWNlIGhhdmUgbm8gaGFuZGxlcnMgZnJvbSB0aGUgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGVzdCBjcmVhdGluZyBhIHNlcnZpY2Ugd2l0aCBhIHNwYXJzZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyBoYW5kbGVyIGNvbmZpZ3VyYXRpb24NCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgc2VydmljZSBkZWxlZ2F0ZS4gIFZlcmlmeSB0aGF0IHRoZSBoYW5kbGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIA0KLSAgICAgKiBjaGFpbi4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlV2l0aENvbXBvc2l0ZSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIC8vIENyZWF0ZSBhIGNvbXBvc2l0ZSB3aXRoIGEgSkFYQiBIYW5kbGVyIENvbmZpZyANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLQ0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0NCi0gICAgICAgIC8vIFZlcmlmeSB0aGUgSGFuZGxlclJlc29sdmVyIG9uIHRoZSBzZXJ2aWNlIGtub3dzIGFib3V0IHRoZSBoYW5kbGVycyBpbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgICAgSGFuZGxlclJlc29sdmVyIHJlc29sdmVyID0gc2VydmljZS5nZXRIYW5kbGVyUmVzb2x2ZXIoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocmVzb2x2ZXIpOw0KLSAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhlIHNlcnZpY2UgaGF2ZSBoYW5kbGVycw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpblNhbWVIYW5kbGVycyhwb3J0SGFuZGxlcnMsIGxpc3QpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYSBzdWJzZXF1ZW50IHBvcnQgYXJlIGRpZmZlcmVudCBhbmQgdGhhdCB0aGV5IGFsc28gZ2V0cyB0aGUgY29ycmVjdCBoYW5kbGVycw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcyID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlcjIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMyID0gYmluZGluZzIuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHBvcnQsIHBvcnQyKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMyLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5TYW1lSGFuZGxlcnMocG9ydEhhbmRsZXJzMiwgbGlzdCkpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU2V0IGEgc3BhcnNlIGNvbXBvc2l0ZSBvbiBhIHNwZWNpZmljIFBvcnQuICBWZXJpZnkgdGhhdCBpbnN0YW5jZXMgb2YgdGhhdCBQb3J0IGhhdmUgdGhlDQotICAgICAqIGNvcnJlY3QgaGFuZGxlcnMgYXNzb2NpYXRlZCBhbmQgb3RoZXIgUG9ydHMgZG8gbm90Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFBvcnRXaXRoQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLQ0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRlIHdpdGggYSBKQVhCIEhhbmRsZXIgQ29uZmlnIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlID0gZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsNCi0gICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5zZXRIYW5kbGVyQ2hhaW5zVHlwZShoYW5kbGVyQ2hhaW5zVHlwZSk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU5hbWUsIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSS5jbGFzcyk7DQotDQotICAgICAgICAvLyBWZXJpZnkgdGhlIEhhbmRsZXJSZXNvbHZlciBvbiB0aGUgc2VydmljZSBrbm93cyBhYm91dCB0aGUgaGFuZGxlcnMgaW4gdGhlIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICAgIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlciA9IHNlcnZpY2UuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc29sdmVyKTsNCi0gICAgICAgIFBvcnRJbmZvIHBpID0gbmV3IER1bW15UG9ydEluZm8oKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgcG9ydCBjcmVhdGVkIHdpdGggdGhlIHNwYXJzZSBtZXRhZGF0YSBoYXMgdGhvc2UgaGFuZGxlcnMNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVycyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydEhhbmRsZXJzLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5TYW1lSGFuZGxlcnMocG9ydEhhbmRsZXJzLCBsaXN0KSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IGEgY3JlYXRpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgc2FtZSBwb3J0IGFsc28gZ2V0cyB0aG9zZSBoYW5kbGVycw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcyID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlcjIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMyID0gYmluZGluZzIuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHBvcnQsIHBvcnQyKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMyLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5TYW1lSGFuZGxlcnMocG9ydEhhbmRsZXJzMiwgbGlzdCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBjcmVhdGVpbmcgYSBkaWZmZXJlbnQgcG9ydCBkb2Vzbid0IGdldCB0aGUgaGFuZGxlcnMNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZTMgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0ICsgIjMiKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSSBwb3J0MyA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU5hbWUzLCBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlcjMgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MzsNCi0gICAgICAgIEJpbmRpbmcgYmluZGluZzMgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyMy5nZXRCaW5kaW5nKCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVyczMgPSBiaW5kaW5nMy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygwLCBwb3J0SGFuZGxlcnMzLnNpemUoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSBzZXR0aW5nIHRoZSBtZXRhZGF0YSBvbiBhIGRpZmZlcmVudCBwb3J0IChhIGRpZmZlcmVudCBRTmFtZSkgd2lsbCBnZXQgaGFuZGxlcnMuDQotICAgICAgICBRTmFtZSBwb3J0UU5hbWU0ID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCArICI0Iik7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydDQgPSBzZXJ2aWNlLmdldFBvcnQocG9ydFFOYW1lNCwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXI0ID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmc0ID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlcjQuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnM0ID0gYmluZGluZzQuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydEhhbmRsZXJzNC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhlIHNlcnZpY2UgaGFuZGxlciByZXNvbHZlciBrbm93cyBhYm91dCBib3RocyBzZXRzIG9mIGhhbmRsZXJzDQotICAgICAgICAvLyBhdHRhY2hlZCB0byB0aGUgdHdvIGRpZmZlcmVudCBwb3J0IFFOYW1lcyBhbmQgbm9uZSBhcmUgYXR0YWNoZWQgZm9yIHRoZSB0aGlyZCBwb3J0DQotICAgICAgICBMaXN0PEhhbmRsZXI+IGxpc3RGb3JQb3J0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0Rm9yUG9ydC5zaXplKCkpOw0KLQ0KLSAgICAgICAgUG9ydEluZm8gcGk0ID0gbmV3IER1bW15UG9ydEluZm8ocG9ydFFOYW1lNCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IGxpc3RGb3JQb3J0NCA9IHJlc29sdmVyLmdldEhhbmRsZXJDaGFpbihwaTQpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3RGb3JQb3J0NC5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICBQb3J0SW5mbyBwaTMgPSBuZXcgRHVtbXlQb3J0SW5mbyhwb3J0UU5hbWUzKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gbGlzdEZvclBvcnQzID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpMyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdEZvclBvcnQzLnNpemUoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCBoYW5kbGVycyBzcGVjaWZpZWQgaW4gYSBzcGFyc2UgY29tcG9pc3RlIG9uIHRoZSBzZXJ2aWNlIGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCANCi0gICAgICogdGhhdCBzcGVjaWZpYyBzZXJ2aWNlIGRlbGVnYXRlIChpLmUuIFNlcnZpY2UgaW5zdGFuY2UpLCBldmVuIGlmIHRoZSBRTmFtZXMgYXJlIHRoZSBzYW1lIA0KLSAgICAgKiBhY3Jvc3MgdHdvIGluc3RhbmNlcyBvZiBhIFNlcnZpY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlRGVsZ2F0ZXNTZXJ2aWNlQ29tcG9zaXRlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBOZWVkIHRvIGNhY2hlIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb25zIHNvIHRoYXQgdGhleSBhcmUgc2hhcmVkDQotICAgICAgICAgICAgLy8gYWNyb3NzIHRoZSB0d28gaW5zdGFuY2VzIG9mIHRoZSBzYW1lIFNlcnZpY2UuDQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0Lmluc3RhbGxDYWNoaW5nRmFjdG9yeSgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIFNlcnZpY2Ugc3BlY2lmeWluZyBhIHNwYXJzZSBjb21wb3NpdGUgYW5kIHZlcmlmeSB0aGUNCi0gICAgICAgICAgICAvLyBwb3J0cyB1bmRlciB0aGF0IHNlcnZpY2UgZ2V0IHRoZSBjb3JyZWN0IGhhbmRsZXJzIGFzc29jaWF0ZWQuDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIHRoZSBzYW1lIFNlcnZpY2UsIGJ1dCB3aXRob3V0DQotICAgICAgICAgICAgLy8gbWV0YWRhdGEuIFBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhhdCBzZXJ2aWNlIHNob3VsZCBub3QgZ2V0IGhhbmRsZXIncyBhc3NvY2lhdGVkLg0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIC8vIE5vIHBvcnRzIGNyZWF0ZWQgeWV0LCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcmVsZXZhbnQgaGFuZGxlcg0KLSAgICAgICAgICAgIC8vIGNoYWlucy4NCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIxID0gc2VydmljZTEuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MSA9IHJlc29sdmVyMS5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0MS5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcG9ydCwgaXQgc2hvdWxkIGdldCBoYW5kbGVycy4NCi0gICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUxID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQxID0NCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UxLmdldFBvcnQocG9ydFFOYW1lMSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMSA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxOw0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZzEgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyMS5nZXRCaW5kaW5nKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMxID0gYmluZGluZzEuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvcnRIYW5kbGVyczEuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBoYW5kbGVyIGxpc3QgZnJvbSB0aGUgcmVzb2x2ZXIgYWZ0ZXIgdGhlIHBvcnQgaXMgY3JlYXRlZA0KLSAgICAgICAgICAgIGxpc3QxID0gcmVzb2x2ZXIxLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluU2FtZUhhbmRsZXJzKHBvcnRIYW5kbGVyczEsIGxpc3QxKSk7DQotDQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSAybmQgU2VydmljZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQNCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIyID0gc2VydmljZTIuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MiA9IHJlc29sdmVyMi5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0Mi5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2FtZSBwb3J0IGNyZWF0ZWQgdW5kZXIgdGhlIDJuZCBzZXJ2aWNlIGFsc28NCi0gICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydDIgPQ0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZTIuZ2V0UG9ydChwb3J0UU5hbWUxLCBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nMiA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVyczIgPSBiaW5kaW5nMi5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcG9ydEhhbmRsZXJzMi5zaXplKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgaGFuZGxlcnMgc3BlY2lmaWVkIGluIGEgc3BhcnNlIGNvbXBvaXN0ZSBvbiB0aGUgcG9ydCBhcmUgb25seSBhc3NvY2lhdGVkIHdpdGggDQotICAgICAqIHRoYXQgcG9ydCBvbiB0aGF0IHNwZWNpZmljIHNlcnZpY2UgZGVsZWdhdGUgKGkuZS4gU2VydmljZSBpbnN0YW5jZSksIGV2ZW4gaWYgdGhlIFFOYW1lcyBhcmUgdGhlIHNhbWUgDQotICAgICAqIGFjcm9zcyB0d28gaW5zdGFuY2VzIG9mIGEgU2VydmljZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNlcnZpY2VEZWxnYXRlc1BvcnRDb21wb3NpdGUoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FjaGUgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc28gdGhhdCB0aGV5IGFyZSBzaGFyZWQNCi0gICAgICAgICAgICAvLyBhY3Jvc3MgdGhlIHR3byBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgU2VydmljZS4NCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBQb3J0SW5mbyBwaSA9IG5ldyBEdW1teVBvcnRJbmZvKCk7DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHR3byBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgU2VydmljZQ0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOw0KLQ0KLSAgICAgICAgICAgIC8vIE5vIHBvcnRzIGNyZWF0ZWQgeWV0LCBzbyB0aGVyZSBzaG91bGQgYmUgbm8gcmVsZXZhbnQgaGFuZGxlcg0KLSAgICAgICAgICAgIC8vIGNoYWlucy4NCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIxID0gc2VydmljZTEuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MSA9IHJlc29sdmVyMS5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0MS5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIFBvcnQgc3BlY2lmeWluZyBhIHNwYXJzZSBjb21wb3NpdGUgYW5kIHZlcmlmeSB0aGUNCi0gICAgICAgICAgICAvLyBwb3J0IGdldHMgdGhlIGNvcnJlY3QgaGFuZGxlcnMgYXNzb2NpYXRlZC4NCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgICAgIEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlID0gZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsNCi0gICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUxID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQxID0NCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UxLmdldFBvcnQocG9ydFFOYW1lMSwgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMSA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxOw0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZzEgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyMS5nZXRCaW5kaW5nKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMxID0gYmluZGluZzEuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvcnRIYW5kbGVyczEuc2l6ZSgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBoYW5kbGVyIGxpc3QgZnJvbSB0aGUgcmVzb2x2ZXIgYWZ0ZXIgdGhlIHBvcnQgaXMgY3JlYXRlZA0KLSAgICAgICAgICAgIGxpc3QxID0gcmVzb2x2ZXIxLmdldEhhbmRsZXJDaGFpbihwaSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluU2FtZUhhbmRsZXJzKHBvcnRIYW5kbGVyczEsIGxpc3QxKSk7DQotDQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSAybmQgU2VydmljZSBpbnN0YW5jZSBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQNCi0gICAgICAgICAgICBIYW5kbGVyUmVzb2x2ZXIgcmVzb2x2ZXIyID0gc2VydmljZTIuZ2V0SGFuZGxlclJlc29sdmVyKCk7DQotICAgICAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0MiA9IHJlc29sdmVyMi5nZXRIYW5kbGVyQ2hhaW4ocGkpOw0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBsaXN0Mi5zaXplKCkpOw0KLQ0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc2FtZSBwb3J0IGNyZWF0ZWQgdW5kZXIgdGhlIDJuZCBzZXJ2aWNlIGFsc28NCi0gICAgICAgICAgICAvLyBkb2Vzbid0IGhhdmUgaGFuZGxlcnMNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydDIgPQ0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZTIuZ2V0UG9ydChwb3J0UU5hbWUxLCBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nMiA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVyczIgPSBiaW5kaW5nMi5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcG9ydEhhbmRsZXJzMi5zaXplKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBvcmlnaW5hbCBmdW5jdGlvbmFsaXR5IG9mIHNwZWNpZnlpbmcgYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiB3aXRoIGENCi0gICAgICogZmlsZSBtZW1iZXIgd29ya3MgYXMgaXQgc2hvdWxkLiANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyQ2hhaW5PblNFSSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU4pOw0KLSAgICAgICAgDQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uSGFuZGxlcnMocG9ydEhhbmRsZXJzKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCBoYW5kbGVyIGluZm9ybWF0aW9uIGluIGEgc3BhcnNlIGNvbXBvc2l0ZSBvbiB0aGUgUG9ydCB3aWxsIG92ZXJyaWRlIGFueSBoYW5kbGVyIGNoYWluDQotICAgICAqIGFubm90YXRpb24gb24gdGhlIFNFSS4gDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJSGFuZGxlckNoYWluT3ZlcnJpZGVPblBvcnQoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQgKyB1bmlxdWVTZXJ2aWNlKyspOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU4pOw0KLQ0KLSAgICAgICAgLy8gVGhlIFNFSSBoYXMgYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiwgYnV0IHRoZSBzcGFyc2UgbWV0YWRhdGEgc2hvdWxkIG92ZXJyaWRlIGl0DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSVdpdGhIQyBwb3J0ID0gc2VydmljZS5nZXRQb3J0KENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSVdpdGhIQy5jbGFzcyk7DQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMgPSBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBvcnRIYW5kbGVycy5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc1NwYXJzZUNvbXBvc2l0ZUhhbmRsZXJzKHBvcnRIYW5kbGVycykpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgaGFuZGxlciBpbmZvcm1hdGlvbiBpbiBhIHNwYXJzZSBjb21wb3NpdGUgb24gdGhlIFNlcnZpY2Ugd2lsbCBvdmVycmlkZSBhbnkgaGFuZGxlciBjaGFpbg0KLSAgICAgKiBhbm5vdGF0aW9uIG9uIHRoZSBTRUkuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNFSUhhbmRsZXJDaGFpbk92ZXJyaWRlT25TZXJ2aWNlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0ICsgdW5pcXVlU2VydmljZSsrKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIFNFSSBoYXMgYSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiwgYnV0IHRoZSBzcGFyc2UgbWV0YWRhdGEgc2hvdWxkIG92ZXJyaWRlIGl0DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTik7DQotDQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUlXaXRoSEMuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNTcGFyc2VDb21wb3NpdGVIYW5kbGVycyhwb3J0SGFuZGxlcnMpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNldCBkaWZmZXJlbnQgY29tcG9zaXRlcyBvbiB0aGUgU2VydmljZSBhbmQgdGhlIFBvcnQgdGhhdCBzcGVjaWZ5IGRpZmZlcmVudCANCi0gICAgICogSGFuZGxlckNoYWluc1R5cGUgdmFsdWVzLiAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlT25TZXJ2aWNlQW5kUG9ydCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCArIHVuaXF1ZVNlcnZpY2UrKyk7DQotICAgICAgICANCi0gICAgICAgIC8vIENyZWF0ZSBhIHNlcnZpY2Ugd2l0aCBhIGNvbXBvc2l0ZSBzcGVjaWZ5aW5nIGhhbmRsZXJzDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTik7DQotDQotICAgICAgICAvLyBDcmVhdGUgYSBwb3J0IHdpdGggYSBjb21wb3NpdGUgc3BlY2lmeWluZyBkaWZmZXJlbnQgaGFuZGxlcnMNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBwb3J0Q29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgcG9ydEhhbmRsZXJDaGFpbnNUeXBlID0gZ2V0SGFuZGxlckNoYWluc1R5cGUoIkNsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwiKTsNCi0gICAgICAgIHBvcnRDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUocG9ydEhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEocG9ydENvbXBvc2l0ZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkuY2xhc3MpOw0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlciA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQ7DQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gcG9ydEhhbmRsZXJzID0gYmluZGluZy5nZXRIYW5kbGVyQ2hhaW4oKTsNCi0NCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgSGFuZGxlckNoYWluc1R5cGUgY29tcG9zaXRlIHNwZWNpZmllZCBvbiBib3RoIHRoZSBTZXJ2aWNlIGFuZCB0aGUgUG9ydCwNCi0gICAgICAgIC8vIHRoZW4gdGhlIGNvbXBvc2l0ZSBzcGVjaWZpZWQgb24gdGhlIFBvcnQgc2hvdWxkIGJlIHRoZSBvbmUgdXNlZCB0byBhc3NvY2lhdGUgdGhlIA0KLSAgICAgICAgLy8gaGFuZGxlcnMgZm9yIHRoYXQgUG9ydC4NCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBwb3J0SGFuZGxlcnMuc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoY29udGFpbnNIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uSGFuZGxlcnMocG9ydEhhbmRsZXJzKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJmaXkgdGhhdCBhIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG9uIHRoZSBTZXJ2aWNlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUG9ydCANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRTZXJ2aWNlV2l0aEhDKCkgew0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U2VydmljZVdpdGhIQyBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNlcnZpY2VXaXRoSEMoKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNFSS5jbGFzcyk7DQotDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kaW5nUHJvdmlkZXIuZ2V0QmluZGluZygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBwb3J0SGFuZGxlcnMgPSBiaW5kaW5nLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBvcnRIYW5kbGVycy5zaXplKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWluc0hhbmRsZXJDaGFpbkFubm90YXRpb25IYW5kbGVycyhwb3J0SGFuZGxlcnMpKTsNCi0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZlcmZpeSB0aGF0IGdpdmVuIGEgSGFuZGxlckNoYWluIGFubm90YXRpb24gb24gdGhlIFNlcnZpY2UgYW5kIGEgUG9ydCBhbmQgYSBzcGFyc2UgY29tcG9zaXRlDQotICAgICAqIG9uIHRoZSBQb3J0IGFzc29jaWF0ZXMgdGhlIGhhbmRsZXJzIGZyb20gdGhlIHNwYXJzZSBjb21wb3NpdGUgb24gdGhlIFBvcnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkU2VydmljZVdpdGhIQ1BvcnRPdmVycmlkZSgpIHsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdFNlcnZpY2VXaXRoSEMgc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTZXJ2aWNlV2l0aEhDKCk7DQotDQotICAgICAgICAvLyBTZXQgYSBIYW5kbGVyQ2hhaW5zVHlwZSBvbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBmb3IgdGhlIFBvcnQgY3JlYXRpb247IGl0IHNob3VsZCBvdmVycmlkZSB0aGUgDQotICAgICAgICAvLyBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBvbiB0aGUgU2VydmljZS4NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zVHlwZSA9IGdldEhhbmRsZXJDaGFpbnNUeXBlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SGFuZGxlckNoYWluc1R5cGUoaGFuZGxlckNoYWluc1R5cGUpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJIHBvcnQgPSBzZXJ2aWNlLmdldFBvcnQoQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJLmNsYXNzKTsNCi0NCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVycyA9IGJpbmRpbmcuZ2V0SGFuZGxlckNoYWluKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcG9ydEhhbmRsZXJzLnNpemUoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zU3BhcnNlQ29tcG9zaXRlSGFuZGxlcnMocG9ydEhhbmRsZXJzKSk7DQotICAgIH0NCi0NCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICAgIC8vIEhlbHBlciBtZXRob2RzIGFuZCBjbGFzc2VzDQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNTcGFyc2VDb21wb3NpdGVIYW5kbGVycyhMaXN0PEhhbmRsZXI+IGhhbmRsZXJMaXN0KSB7DQotICAgICAgICBMaXN0PENsYXNzPiBpbnB1dEhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXMoaGFuZGxlckxpc3QpOw0KLQ0KLSAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBoYW5kbGVycyBkZWZpbmVkIGluIHRoZSBIYW5kbGVyQ2hhaW5zVHlwZSBwbGFjZWQgb24gdGhlIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICAgIExpc3Q8Q2xhc3M+IGNvbXBvc2l0ZUhhbmRsZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIGNvbXBvc2l0ZUhhbmRsZXJDbGFzc2VzLmFkZChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaS5oYW5kbGVyLkR1bW15U09BUEhhbmRsZXIuY2xhc3MpOw0KLSAgICAgICAgY29tcG9zaXRlSGFuZGxlckNsYXNzZXMuYWRkKG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLmhhbmRsZXIuRHVtbXlMb2dpY2FsSGFuZGxlci5jbGFzcyk7DQotDQotICAgICAgICBpZiAoaW5wdXRIYW5kbGVyQ2xhc3Nlcy5zaXplKCkgIT0gY29tcG9zaXRlSGFuZGxlckNsYXNzZXMuc2l6ZSgpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoaW5wdXRIYW5kbGVyQ2xhc3Nlcy5jb250YWluc0FsbChjb21wb3NpdGVIYW5kbGVyQ2xhc3NlcykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBbnN3ZXIgaWYgdGhlIExpc3QgY29udGFpbnMgdGhlIHNhbWUgaGFuZGxlcnMgYXMgZGVmaW5lZCBpbiB0aGUgU0VJDQotICAgICAqIHZpYSB0aGUgSGFuZGxlckNoYWluLmZpbGUgYW5ub3RhdGlvbiBtZW1lYmVyLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHBvcnRIYW5kbGVycyBMaXN0IG9mIGhhbmRsZXJzDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbGlzdCBtYXRjaGVzIHdoYXQgd2FzIGRlZmluZWQgb24gdGhlIFNFSSB2aWEgdGhlDQotICAgICAqICAgSGFuZGxlckNoYWluIGFubm90YXRpb247IGZhbHNlIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0hhbmRsZXJDaGFpbkFubm90YXRpb25IYW5kbGVycyhMaXN0PEhhbmRsZXI+IHBvcnRIYW5kbGVycykgew0KLSAgICAgICAgTGlzdDxDbGFzcz4gcG9ydEhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXMocG9ydEhhbmRsZXJzKTsNCi0gICAgICAgIExpc3Q8Q2xhc3M+IHNlaUhhbmRsZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oKTsNCi0gICAgICAgIHNlaUhhbmRsZXJDbGFzc2VzLmFkZChDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpbkhhbmRsZXIuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAocG9ydEhhbmRsZXJDbGFzc2VzLnNpemUoKSAhPSBzZWlIYW5kbGVyQ2xhc3Nlcy5zaXplKCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGlmIChwb3J0SGFuZGxlckNsYXNzZXMuY29udGFpbnNBbGwoc2VpSGFuZGxlckNsYXNzZXMpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQW5zd2VyIGlmIHR3byBMaXN0PEhhbmRsZXI+IGFyZ3VtZW50cyBjb250YWluIHRoZSBzYW1lIGhhbmRsZXIgQ2xhc3MgZmlsZXMuDQotICAgICAqIEBwYXJhbSBsaXN0MQ0KLSAgICAgKiBAcGFyYW0gbGlzdDINCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5TYW1lSGFuZGxlcnMoTGlzdDxIYW5kbGVyPiBsaXN0MSwgTGlzdDxIYW5kbGVyPiBsaXN0Mikgew0KLSAgICAgICAgaWYgKGxpc3QxLnNpemUoKSAhPSBsaXN0Mi5zaXplKCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICBMaXN0PENsYXNzPiBsaXN0MUhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXMobGlzdDEpOw0KLSAgICAgICAgTGlzdDxDbGFzcz4gbGlzdDJIYW5kbGVyQ2xhc3NlcyA9IGhhbmRsZXJDbGFzc2VzKGxpc3QyKTsNCi0NCi0gICAgICAgIGlmIChsaXN0MUhhbmRsZXJDbGFzc2VzLmNvbnRhaW5zQWxsKGxpc3QySGFuZGxlckNsYXNzZXMpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3NlcyhMaXN0PEhhbmRsZXI+IGxpc3RPZkhhbmRsZXJzKSB7DQotICAgICAgICBMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KCk7DQotICAgICAgICBJdGVyYXRvcjxIYW5kbGVyPiBoYW5kbGVySXRlcmF0b3IgPSBsaXN0T2ZIYW5kbGVycy5pdGVyYXRvcigpOw0KLSAgICAgICAgd2hpbGUgKGhhbmRsZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBoYW5kbGVyQ2xhc3Nlcy5hZGQoaGFuZGxlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBoYW5kbGVyQ2xhc3NlczsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgiaGFuZGxlci54bWwiKTsNCi0gICAgfQ0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbnNUeXBlIGdldEhhbmRsZXJDaGFpbnNUeXBlKFN0cmluZyBmaWxlTmFtZSkgew0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRYTUxGaWxlU3RyZWFtKGZpbGVOYW1lKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoaXMpOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgcmV0dXJuSENUID0gRGVzY3JpcHRpb25VdGlscy5sb2FkSGFuZGxlckNoYWlucyhpcywgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5IQ1QpOw0KLSAgICAgICAgcmV0dXJuIHJldHVybkhDVDsNCi0gICAgfQ0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldFhNTEZpbGVTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7DQotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotICAgICAgICBTdHJpbmcgY29uZmlnTG9jID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3RyaW5nIHNlcCA9ICIvIjsNCi0gICAgICAgICAgICBjb25maWdMb2MgPSBzZXAgKyAidGVzdC1yZXNvdXJjZXMiICsgc2VwICsgImNvbmZpZ3VyYXRpb24iICsgc2VwICsgImhhbmRsZXJzIiArIHNlcCArIGZpbGVOYW1lOw0KLSAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgaXMgPSBuZXcgRmlsZShiYXNlRGlyICsgY29uZmlnTG9jKS50b1VSTCgpLm9wZW5TdHJlYW0oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBpczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgY2xhc3MgRHVtbXlQb3J0SW5mbyBpbXBsZW1lbnRzIFBvcnRJbmZvIHsNCi0gICAgICAgIHByaXZhdGUgUU5hbWUgcG9ydFFOOw0KLSAgICAgICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlUU47DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyBEdW1teVBvcnRJbmZvKCkgew0KLSAgICAgICAgICAgIHRoaXMucG9ydFFOID0gbmV3IFFOYW1lKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvdGVzdC9uYW1lc3BhY2UiLCAiRHVtbXlQb3J0Iik7DQotICAgICAgICAgICAgdGhpcy5zZXJ2aWNlUU4gPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy90ZXN0L25hbWVzcGFjZSIsICJEdW1teVNlcnZpY2UiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgcHVibGljIER1bW15UG9ydEluZm8oUU5hbWUgcG9ydFFOKSB7DQotICAgICAgICAgICAgdGhpcygpOw0KLSAgICAgICAgICAgIHRoaXMucG9ydFFOID0gcG9ydFFOOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gcG9ydFFOOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VRTjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLWludGVyZmFjZSBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHRvRWNobyk7DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlDQotQEhhbmRsZXJDaGFpbihmaWxlPSJDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3QueG1sIikNCi1pbnRlcmZhY2UgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U0VJV2l0aEhDIHsNCi0gICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyB0b0VjaG8pOw0KLX0NCi0NCi1AV2ViU2VydmljZUNsaWVudA0KLUBIYW5kbGVyQ2hhaW4oZmlsZT0iQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbCIpDQotY2xhc3MgQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0U2VydmljZVdpdGhIQyBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTZXJ2aWNlV2l0aEhDKCkgew0KLSAgICAgICAgICAgIHN1cGVyKG51bGwsDQotICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC5uYW1lc3BhY2VVUkksIENsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC5zdmNMb2NhbFBhcnQpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHB1YmxpYyBDbGllbnRNZXRhZGF0YUhhbmRsZXJDaGFpblRlc3RTZXJ2aWNlV2l0aEhDKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgICAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFIYW5kbGVyQ2hhaW5UZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxYzhlMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQ0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iTG9nZ2luZ0hhbmRsZXJDaGFpbiI+DQotCQk8andzOmhhbmRsZXI+DQotCQkJPGp3czpoYW5kbGVyLWNsYXNzPm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpLkNsaWVudE1ldGFkYXRhSGFuZGxlckNoYWluSGFuZGxlcjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQk8L2p3czpoYW5kbGVyLWNoYWluPg0KLQkNCi08L2p3czpoYW5kbGVyLWNoYWlucz4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhUG9ydFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFQb3J0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc2NDc5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvQ2xpZW50TWV0YWRhdGFQb3J0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25UZXN0VXRpbHMyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50TWV0YWRhdGFQb3J0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLQ0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG9yaWdpbmFsV3NkbCA9ICJDbGllbnRNZXRhZGF0YS53c2RsIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdmVycmlkZW5Xc2RsID0gIkNsaWVudE1ldGFkYXRhT3ZlcnJpZGVuLndzZGwiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG90aGVyV3NkbCA9ICJDbGllbnRNZXRhZGF0YU90aGVyLndzZGwiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG11bHRpUG9ydFdzZGwgPSAiQ2xpZW50TWV0YWRhdGFNdWx0aVBvcnQud3NkbCI7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3JpZ2luYWxXc2RsX3BvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydCI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3ZlcnJpZGVuV3NkbF9wb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnRPdmVycmlkZW4iOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0ID0gInBvcnRMb2NhbFBhcnRPdGhlciI7DQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSA9ICJwb3J0TG9jYWxQYXJ0TXVsdGkxIjsNCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQyID0gInBvcnRMb2NhbFBhcnRNdWx0aTIiOw0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDMgPSAicG9ydExvY2FsUGFydE11bHRpMyI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGVzdCB0aGUgZ2V0UG9ydCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgYW55IGNvbXBvc2l0ZSBzcGVjaWZpZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JpZ2luYWxHZXRQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwob3RoZXJXc2RsKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGRiY0luU2VydmljZURlc2MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOw0KLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGdlbmVyaWMgU2VydmljZSB3aXRoIG5vIG92ZXJyaWRlcywgdGhlcmUgd2lsbCBiZSBubyBXZWJTZXJ2aWNlQ2xpZW50IGFubm90YXRpb24NCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudCk7DQotDQotICAgICAgICAvLyBXU0RMIHdhcyBzcGVjaWZpZWQgb24gdGhlIGNyZWF0ZSwgc28gbWFrZSBzdXJlIHRoZSByaWdodCBvbmUgd2FzIHVzZWQgYnkgY2hlY2tpbmcgdGhlIHBvcnRzDQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCBDbGllbnRNZXRhZGF0YVRlc3QudmFsaWRhdGVQb3J0KHNlcnZpY2UsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KSk7DQotICAgICAgICANCi0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocG9ydCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTcGVjaWZ5IGEgc3BhcnNlIGNvbXBvc2l0ZSBvbiBhIGdldFBvcnQgY2FsbA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFBvcnRXaXRoQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwob3RoZXJXc2RsKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRQb3J0TWV0YWRhdGEoKSk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZSwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwocG9ydCk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRQb3J0TWV0YWRhdGEoKSk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjQXJyYXlbXSA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjQXJyYXkubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQyA9IGVwRGVzY0FycmF5WzBdLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQyk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZSwgZXBEQkMpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUsIGVwREJDLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERvIG11bHRpcGxlIGdldFBvcnRzIG9uIHRoZSBzYW1lIHNlcnZpY2Ugc3BlY2lmaXlpbmcgZGlmZmVyZW50IHNwYXJzZSBjb21wb3NpdGUuICBWZXJpZnkgdGhhdA0KLSAgICAgKiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBvbmUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsaXRwbGVHZXRQb3J0U2FtZVNlcnZpY2UoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChvdGhlcldzZGwpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLQ0KLSAgICAgICAgLy8gRG8gdGhlIGZpcnN0IGdldFBvcnQgb24gdGhlIGZpcnN0IFNlcnZpY2UNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUxID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUxKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMSwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MSA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MVtdID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NBcnJheTEubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzEgPSBlcERlc2NBcnJheTFbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwREJDMSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMSk7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIERvIGEgc2Vjb25kIGdldFBvcnQgZm9yIHRoZSBzYW1lIHBvcnQgb24gdGhlIHNhbWUgc2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBjb21wb3NpdGUNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0NCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MltdID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NBcnJheTIubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzIgPSBlcERlc2NBcnJheTJbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwREJDMik7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTIsIGVwREJDMik7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTIsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgICAgICAvLyBWZXJpZnkgdGhlIHByZXZpb3VzIHNwYXJzZSBjb21wb3NpdGUgd2FzIG92ZXJ3cml0dGVuIGZvciB0aGlzIGRlbGVnYXRlDQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IG11bHRpcGxlIGdldFBvcnRzIHVzaW5nIGRpZmZlcmVudCBjb21wb3NpdGVzIG9uIGRpZmZlcmVudCBzZXJ2aWNlcy4gIFZhbGlkYXRlIHRoZSBjb21wb3NpdGUNCi0gICAgICogaXMgZm9yIGVhY2ggc2VydmljZSBkZWxlZ2F0ZSBpcyBkaWZmZXJlbnQuICBOb3RlIHRoYXQgd2UgaGF2ZSB0byBpbnN0YWxsIGEgY29uZmlndXJhdGlvbg0KLSAgICAgKiBmYWN0b3J5IHRoYXQgd2lsbCBjYXVzZSB0aGUgU2VydmljZURlc2NyaXB0aW9ucyB0byBiZSBjYWNoZWQ7IHRoZSBkZWZhdWx0IGZhY3Rvcnkgd2lsbA0KLSAgICAgKiBub3QuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9ydERpZmZlcmVudFNlcnZpY2VzKCkgew0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG90aGVyV3NkbCk7DQotDQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaXJzdCBzZXJ2aWNlIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzEgPSBzZXJ2aWNlRGVsZWdhdGUxLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIERvIHRoZSBmaXJzdCBnZXRQb3J0IG9uIHRoZSBmaXJzdCBTZXJ2aWNlDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMSk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMSwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlMS5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MVtdID0gc2VydmljZURlc2MxLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY0FycmF5MS5sZW5ndGgpOw0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzEgPSBlcERlc2NBcnJheTFbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQzEpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc3BhcnNlQ29tcG9zaXRlMSwgZXBEQkMxKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlMSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2Vjb25kIHNlcnZpY2UgDQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsNCi0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotDQotICAgICAgICAgICAgLy8gRG8gdGhlIGdldFBvcnQgb24gdGhlIHNlY29uZCBTZXJ2aWNlDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTIgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRQb3J0TWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMik7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDIgPSBzZXJ2aWNlMi5nZXRQb3J0KHBvcnRRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MltdID0gc2VydmljZURlc2MyLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY0FycmF5Mi5sZW5ndGgpOw0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzIgPSBlcERlc2NBcnJheTJbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQzIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMyKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBpbnN0YWxsZWQgYSBjYWNoaW5nIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSBhYm92ZSwgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMNCi0gICAgICAgICAgICAvLyBzaG91bGQgbWF0Y2ggZm9yIHRoZSB0d28gc2VydmljZSBkZWxlZ2F0ZXMuICBUaGUgRW5kcG9pbnREZXNjIGFuZCB0aGUgY29tcG9zaXRlDQotICAgICAgICAgICAgLy8gaW4gdGhlIEVuZHBvaW50RGVzYyBzaG91bGQgYmUgdGhlIHNhbWUuICBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBzaG91bGQgYmUgdW5pcXVlIHRvDQotICAgICAgICAgICAgLy8gZWFjaCBzZXJ2aWNlIGRlbGVnYXRlLg0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzZXJ2aWNlRGVzYzEsIHNlcnZpY2VEZXNjMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERCQzEsIGVwREJDMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShlcERlc2NBcnJheTFbMF0sIGVwRGVzY0FycmF5MlswXSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzcGFyc2VDb21wb3NpdGUxLCBzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlMSkpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMyLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUyKSk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IGRvaW5nIEdFVF9QT1JUIG9uIHNlcGVyYXRlIHBvcnRzIHVuZGVyIHRoZSBzYW1lIHNlcnZpY2UuICBUaGV5IHNob3VsZCBoYXZlIHVuaXF1ZQ0KLSAgICAgKiBFbmRwb2ludERlc3JpcHRpb25zIGFuZCB0aGUgc3BhcnNlIGNvbXBvc2l0ZXMgc2hvdWxkIGJlIHVuaXF1ZSB0byB0aGUgc2VydmljZSBkZWxlZ2F0ZSBhbmQNCi0gICAgICogZW5kcG9pbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVQb3J0c1NhbWVTZXJ2aWNlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwobXVsdGlQb3J0V3NkbCk7DQotICAgICAgICBRTmFtZSBwb3J0UU4xID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSk7DQotICAgICAgICBRTmFtZSBwb3J0UU4yID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotDQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7DQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotDQotICAgICAgICAvLyBEbyB0aGUgZmlyc3QgZ2V0UG9ydCBvbiB0aGUgZmlyc3QgU2VydmljZQ0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0UG9ydE1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZTEpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCBTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZS5nZXRQb3J0KHBvcnRRTjEsIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0FycmF5MVtdID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NBcnJheTEubGVuZ3RoKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERCQzEgPSBlcERlc2NBcnJheTFbMF0uZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwREJDMSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMSk7DQotICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTEsIGVwREJDMS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIERvIGEgc2Vjb25kIGdldFBvcnQgZm9yIGEgZGlmZmVyZW50IHBvcnQgb24gdGhlIHNhbWUgc2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBjb21wb3NpdGUNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0UG9ydE1ldGFkYXRhKCkpOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFBvcnRNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgU2VydmljZURlbGVnYXRlLmdldFBvcnRNZXRhZGF0YSgpKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0UU4yLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2NBcnJheTJbXSA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZXBEZXNjQXJyYXkyLmxlbmd0aCk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwZFBvcnQxID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU4xKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBkUG9ydDIgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTjIpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcGRQb3J0MSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwZFBvcnQyKTsNCi0gICAgICAgIGFzc2VydE5vdFNhbWUoZXBkUG9ydDEsIGVwZFBvcnQyKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGVwREJDMiA9IGVwZFBvcnQyLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERCQzIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRTYW1lKGVwRGVzY0FycmF5MVswXSwgZXBkUG9ydDEpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShlcERCQzEsIGVwREJDMik7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMyLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsNCi0gICAgICAgIGFzc2VydE5vdFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgZXBEQkMxLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCBlcERCQzEuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShzcGFyc2VDb21wb3NpdGUxLCBlcERCQzIuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZSBzZXR0aW5nIGEgcHJlZmVyZWQgcG9ydCB3aGVuIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHJlc3VsdHMgaW4gYSBwYXJ0aWN1bGFyDQotICAgICAqIHBvcnQgYmVpbmcgcmV0dXJuZWQgb24gdGhlIGdldFBvcnQoQ2xhc3MpIGNhbGwuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZmVycmVkUG9ydCgpIHsNCi0gICAgICAgIC8vIFdpdGhvdXQgc2V0dGluZyBhIHByZWZlcmVkIHBvcnQsIHRoZSBmaXJzdCBwb3J0IGluIHRoZSBXU0RMIHNob3VsZA0KLSAgICAgICAgLy8gYmUgcmV0dXJuZWQuDQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIFFOYW1lIHBvcnRRTjEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxKTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlMS5nZXRQb3J0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHBvcnQxKTsNCi0gICAgICAgIC8vIEdldCB0aGUgZW5kcG9pbnQgYWRkcmVzcyB0byB2ZXJpZnkgd2hpY2ggcG9ydCB3ZSBnb3QuICBOb3RlIHRoYXQgdGhlIFdTREwgaXMgc2V0dXANCi0gICAgICAgIC8vIHNvIHRoYXQgdGhlIGVuZHBvaW50IGFkZHJlc3MgZW5kcyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGZvciB0ZXN0aW5nLg0KLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlcjEgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MTsNCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQxID0gYmluZGluZ1Byb3ZpZGVyMS5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzczEgPSAoU3RyaW5nKSByZXF1ZXN0Q29udGV4dDEuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRBZGRyZXNzMSk7DQotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGUgZmlyc3QgcG9ydCBpbiB0aGUgV1NETCwgYnV0IHRoYXQgaXNuJ3Qgd29ya2luZw0KLSAgICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBKREsgaW4gdXNlLCB0aGUgMm5kIG9yIDNyZCBwb3J0IGlzIHJldHVybmVkDQotLy8gICAgICAgIGFzc2VydFRydWUoZW5kcG9pbnRBZGRyZXNzLmVuZHNXaXRoKG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2V0IGEgcHJlZmVyZWQgcG9ydCBhbmQgY3JlYXRlIHRoZSBzZXJ2aWNlDQotICAgICAgICBRTmFtZSBwb3J0UU4yID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlMiA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIHNwYXJzZUNvbXBvc2l0ZTIuc2V0UHJlZmVycmVkUG9ydChwb3J0UU4yKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMik7DQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UyLmdldFBvcnQoQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDI7DQotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0MiA9IGJpbmRpbmdQcm92aWRlcjIuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MyID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQyLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50QWRkcmVzczIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShlbmRwb2ludEFkZHJlc3MyLmVuZHNXaXRoKG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZSBzZXR0aW5nIGEgcHJlZmVyZWQgcG9ydCB3aGVuIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHJlc3VsdHMgaW4gYSBwYXJ0aWN1bGFyDQotICAgICAqIHBvcnQgYmVpbmcgcmV0dXJuZWQgb24gdGhlIGdldFBvcnQoQ2xhc3MpIGNhbGwuICBUaGUgU2VydmljZURlc2MgaW4gdGhpcyBjYXNlIA0KLSAgICAgKiBhcmUgY2FjaGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByZWZlcnJlZFBvcnRDYWNoZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgLy8gV2l0aG91dCBzZXR0aW5nIGEgcHJlZmVyZWQgcG9ydCwgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIFdTREwgc2hvdWxkDQotICAgICAgICAgICAgLy8gYmUgcmV0dXJuZWQuDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG11bHRpUG9ydFdzZGwpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlMSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTEpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZTEuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9ydDEpOw0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZW5kcG9pbnQgYWRkcmVzcyB0byB2ZXJpZnkgd2hpY2ggcG9ydCB3ZSBnb3QuICBOb3RlIHRoYXQgdGhlIFdTREwgaXMgc2V0dXANCi0gICAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBlbmRwb2ludCBhZGRyZXNzIGVuZHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcG9ydCBmb3IgdGVzdGluZy4NCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMSA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxOw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQxID0gYmluZGluZ1Byb3ZpZGVyMS5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MxID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQxLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludEFkZHJlc3MxKTsNCi0gICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGdldCB0aGUgZmlyc3QgcG9ydCBpbiB0aGUgV1NETCwgYnV0IHRoYXQgaXNuJ3Qgd29ya2luZw0KLSAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgSkRLIGluIHVzZSwgdGhlIDJuZCBvciAzcmQgcG9ydCBpcyByZXR1cm5lZA0KLS8vICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbmRwb2ludEFkZHJlc3MuZW5kc1dpdGgobXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSkpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIFNldCBhIHByZWZlcmVkIHBvcnQgYW5kIGNyZWF0ZSB0aGUgc2VydmljZQ0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTjIgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQyKTsNCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlMiA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUyLnNldFByZWZlcnJlZFBvcnQocG9ydFFOMik7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsNCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlMiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTIpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZXJ2aWNlMSwgc2VydmljZTIpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7DQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzdmNEZXNjMSwgc3ZjRGVzYzIpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UyLmdldFBvcnQoQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyMiA9IChCaW5kaW5nUHJvdmlkZXIpIHBvcnQyOw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVxdWVzdENvbnRleHQyID0gYmluZGluZ1Byb3ZpZGVyMi5nZXRSZXF1ZXN0Q29udGV4dCgpOw0KLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEFkZHJlc3MyID0gKFN0cmluZykgcmVxdWVzdENvbnRleHQyLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludEFkZHJlc3MyKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGVuZHBvaW50QWRkcmVzczIuZW5kc1dpdGgobXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MikpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRoaXJkIHNlcnZpY2Ugd2l0aG91dCBhIGNvbXBvc2l0ZSBhbmQgbWFrZSBzdXJlIHRoZSBwcmV2aW91cyBjb21wb3NpdGUNCi0gICAgICAgICAgICAvLyBzZXR0aW5nIG9mIHByZWZlcnJlZCBwb3J0IGRvZXNuJ3QgYWZmZWN0IHRoaXMgb25lLg0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTMgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUzID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMyk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MzID0gc2VydmljZURlbGVnYXRlMy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKHNlcnZpY2UyLCBzZXJ2aWNlMyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShzZXJ2aWNlRGVsZWdhdGUxLCBzZXJ2aWNlRGVsZWdhdGUzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKHNlcnZpY2VEZWxlZ2F0ZTIsIHNlcnZpY2VEZWxlZ2F0ZTMpOw0KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3ZjRGVzYzEsIHN2Y0Rlc2MzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDMgPSBzZXJ2aWNlMy5nZXRQb3J0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3J0Myk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJpbmRpbmdQcm92aWRlcjMgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MzsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlcXVlc3RDb250ZXh0MyA9IGJpbmRpbmdQcm92aWRlcjMuZ2V0UmVxdWVzdENvbnRleHQoKTsNCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzMyA9IChTdHJpbmcpIHJlcXVlc3RDb250ZXh0My5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnRBZGRyZXNzMSk7DQotICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBnZXQgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIFdTREwsIGJ1dCB0aGF0IGlzbid0IHdvcmtpbmcNCi0gICAgICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIEpESyBpbiB1c2UsIHRoZSAybmQgb3IgM3JkIHBvcnQgaXMgcmV0dXJuZWQNCi0vLyAgICAgICAgICAgIGFzc2VydFRydWUoZW5kcG9pbnRBZGRyZXNzLmVuZHNXaXRoKG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpKTsNCi0NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFUZXN0LnJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGVuYWJsaW5nIE1UT00gd2hlbiBjcmVhdGluZyB0aGUgc2VydmljZSByZXN1bHRzIHBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhhdCBzZXJ2aWNlDQotICAgICAqIGhhdmUgTVRPTSBlbmFibGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZU1UT00oKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SXNNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3J0KTsNCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IE1UT00gaXMgZW5hYmxlZCBvbiB0aGlzIHBvcnQuDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmcuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgc3BlY2lmaWMgcG9ydHMgdW5kZXIgdGhpcyBzZXJ2aWNlIGFsc28gaGF2ZSBNVE9NIGVuYWJsZWQNCi0gICAgICAgIFFOYW1lIHBvcnQxUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQxKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MSA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0MVFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZzEgPSAoKFNPQVBCaW5kaW5nKSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydDEpLmdldEJpbmRpbmcoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmcxLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIFFOYW1lIHBvcnQyUU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBtdWx0aVBvcnRXc2RsX3BvcnRMb2NhbFBhcnQyKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UuZ2V0UG9ydChwb3J0MlFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZzIgPSAoKFNPQVBCaW5kaW5nKSAoKEJpbmRpbmdQcm92aWRlcikgcG9ydDIpLmdldEJpbmRpbmcoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmcyLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWYWxpZGF0ZSBlbmFibGluZyBNVE9NIHdoZW4gY3JlYXRpbmcgdGhlIHNlcnZpY2UgcmVzdWx0cyBwb3J0cyBjcmVhdGVkIHVuZGVyIHRoYXQgc2VydmljZQ0KLSAgICAgKiBoYXZlIE1UT00gZW5hYmxlZC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVNVE9NRnJvbVNlcnZpY2VEQkMoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBzZWlUb01UT00gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7DQotICAgICAgICBzZWlUb01UT00ucHV0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcy5nZXROYW1lKCksIHRydWUpOw0KLSAgICAgICAgc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5wdXQoTURRQ29uc3RhbnRzLlNFSV9NVE9NX0VOQUJMRU1FTlRfTUFQLCBzZWlUb01UT00pOw0KLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0ID0gc2VydmljZS5nZXRQb3J0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHBvcnQpOw0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgTVRPTSBpcyBlbmFibGVkIG9uIHRoaXMgcG9ydC4NCi0gICAgICAgIEJpbmRpbmdQcm92aWRlciBiaW5kaW5nUHJvdmlkZXIgPSAoQmluZGluZ1Byb3ZpZGVyKSBwb3J0Ow0KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgYmluZGluZ1Byb3ZpZGVyLmdldEJpbmRpbmcoKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluZGluZy5pc01UT01FbmFibGVkKCkpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBWZXJpZnkgdGhhdCBzcGVjaWZpYyBwb3J0cyB1bmRlciB0aGlzIHNlcnZpY2UgYWxzbyBoYXZlIE1UT00gZW5hYmxlZA0KLSAgICAgICAgUU5hbWUgcG9ydDFRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZS5nZXRQb3J0KHBvcnQxUU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMSA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MSkuZ2V0QmluZGluZygpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluZGluZzEuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgUU5hbWUgcG9ydDJRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnQyUU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMiA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MikuZ2V0QmluZGluZygpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYmluZGluZzIuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGVuYWJsaW5nIE1UT00gd2hlbiBjcmVhdGluZyB0aGUgc2VydmljZSByZXN1bHRzIHBvcnRzIGNyZWF0ZWQgdW5kZXIgdGhhdCBzZXJ2aWNlDQotICAgICAqIGhhdmUgTVRPTSBlbmFibGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVNVE9NRnJvbVNlcnZpY2VEQkMoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChtdWx0aVBvcnRXc2RsKTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBzZWlUb01UT00gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7DQotICAgICAgICBzZWlUb01UT00ucHV0KENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcy5nZXROYW1lKCksIGZhbHNlKTsNCi0gICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkucHV0KE1EUUNvbnN0YW50cy5TRUlfTVRPTV9FTkFCTEVNRU5UX01BUCwgc2VpVG9NVE9NKTsNCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydCA9IHNlcnZpY2UuZ2V0UG9ydChDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwb3J0KTsNCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IE1UT00gaXMgZW5hYmxlZCBvbiB0aGlzIHBvcnQuDQotICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYmluZGluZ1Byb3ZpZGVyID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDsNCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGJpbmRpbmdQcm92aWRlci5nZXRCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCFiaW5kaW5nLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgICAgICANCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHNwZWNpZmljIHBvcnRzIHVuZGVyIHRoaXMgc2VydmljZSBhbHNvIGhhdmUgTVRPTSBlbmFibGVkDQotICAgICAgICBRTmFtZSBwb3J0MVFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0MSk7DQotICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlLmdldFBvcnQocG9ydDFRTiwgQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzKTsNCi0gICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcxID0gKChTT0FQQmluZGluZykgKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxKS5nZXRCaW5kaW5nKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSghYmluZGluZzEuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgUU5hbWUgcG9ydDJRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDIpOw0KLSAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQyID0gc2VydmljZS5nZXRQb3J0KHBvcnQyUU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMiA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MikuZ2V0QmluZGluZygpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIWJpbmRpbmcyLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgZW5hYmxpbmcgTVRPTSB3aGVuIGNyZWF0aW5nIHRoZSBzZXJ2aWNlIHJlc3VsdHMgaW4gZW5hYmxlbWVudCBvbmx5DQotICAgICAqIGZvciB0aGF0IHNlcnZpY2UgZGVsZWdhdGUsIGFuZCBub3QgYSBkaWZmZXJlbnQgc2VydmljZSBkZWxlZ2F0ZSByZWZlcmVuY2luZw0KLSAgICAgKiB0aGUgc2FtZSBzZXJ2aWNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZU1UT01DYWNoZWRTZXJ2aWNlKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG11bHRpUG9ydFdzZGwpOw0KLQ0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldElzTVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MSA9IHNlcnZpY2UxLmdldFBvcnQocG9ydFFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSSBwb3J0MiA9IHNlcnZpY2UyLmdldFBvcnQocG9ydFFOLCBDbGllbnRNZXRhZGF0YVBvcnRTRUkuY2xhc3MpOw0KLQ0KLSAgICAgICAgICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcxID0gKChTT0FQQmluZGluZykgKChCaW5kaW5nUHJvdmlkZXIpIHBvcnQxKS5nZXRCaW5kaW5nKCkpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZzEuaXNNVE9NRW5hYmxlZCgpKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTT0FQQmluZGluZyBiaW5kaW5nMiA9ICgoU09BUEJpbmRpbmcpICgoQmluZGluZ1Byb3ZpZGVyKSBwb3J0MikuZ2V0QmluZGluZygpKTsNCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShiaW5kaW5nMi5pc01UT01FbmFibGVkKCkpOw0KLQ0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QucmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgICAgICANCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGVuYWJsaW5nIHRoZSBzZXR0aW5nIG9mIHByb3BlcnRpZXMgb24gdGhlIEJpbmRpbmdQcm92aWRlciBiYXNlZA0KLSAgICAgKiBvbiBhIG1hcCBvZiBwcm9wZXJ0aWVzIHN1cHBsaWVkIHRvIHRoZSBzcGFyc2UgY29tcG9zaXRlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEJpbmRpbmdQcm9wZXJ0aWVzKCkgew0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVRlc3QuaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7DQotDQotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG11bHRpUG9ydFdzZGwpOw0KLSAgICAgICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpOw0KLQ0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLnNldElzTVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWxsQmluZGluZ1Byb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLE9iamVjdD4+KCk7DQotICAgICAgICAgICAgU3RyaW5nIGtleSA9IENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcy5nZXROYW1lKCkgKyAiOiIgKyBwb3J0UU4udG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGJpbmRpbmdQcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOw0KLSAgICAgICAgICAgIGJpbmRpbmdQcm9wcy5wdXQoImN1c3RvbVByb3BlcnR5IiwgInNvbWVWYWx1ZSIpOw0KLSAgICAgICAgICAgIGFsbEJpbmRpbmdQcm9wcy5wdXQoa2V5LCBiaW5kaW5nUHJvcHMpOw0KLSAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkucHV0KE1EUUNvbnN0YW50cy5CSU5ESU5HX1BST1BTX01BUCwgYWxsQmluZGluZ1Byb3BzKTsNCi0NCi0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZSk7DQotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7DQotICAgICAgICAgICAgQ2xpZW50TWV0YWRhdGFQb3J0U0VJIHBvcnQxID0gc2VydmljZTEuZ2V0UG9ydChwb3J0UU4sIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDE7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldCgiY3VzdG9tUHJvcGVydHkiKSk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KCJjdXN0b21Qcm9wZXJ0eSIpLCAic29tZVZhbHVlIik7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgd2lsbCB2YWxpZGF0ZSB0aGF0IHRoZSBwcm9wZXJ0aWVzIHRvIGJlIHNldCBvbiB0aGUgQmluZGluZ1Byb3ZpZGVyLCB2aWENCi0gICAgICogdGhlIHNwYXJzZSBjb21wb3NpdGUsIGNhbiBiZSBjb3JyZWN0bHkgc2NvcGVkIGF0IHRoZSBwb3J0IGxldmVsLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdE5vU2V0QmluZGluZ1Byb3BlcnRpZXMoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5pbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsNCi0NCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwobXVsdGlQb3J0V3NkbCk7DQotICAgICAgICAgICAgUU5hbWUgcG9ydFFOID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbXVsdGlQb3J0V3NkbF9wb3J0TG9jYWxQYXJ0Mik7DQotDQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUuc2V0SXNNVE9NRW5hYmxlZCh0cnVlKTsNCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBPYmplY3Q+PiBhbGxCaW5kaW5nUHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsT2JqZWN0Pj4oKTsNCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gQ2xpZW50TWV0YWRhdGFQb3J0U0VJLmNsYXNzLmdldE5hbWUoKSArICI6IiArIHBvcnRRTi50b1N0cmluZygpOw0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYmluZGluZ1Byb3BzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQotICAgICAgICAgICAgYmluZGluZ1Byb3BzLnB1dCgiY3VzdG9tUHJvcGVydHkiLCAic29tZVZhbHVlIik7DQotICAgICAgICAgICAgYWxsQmluZGluZ1Byb3BzLnB1dChrZXksIGJpbmRpbmdQcm9wcyk7DQotICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5wdXQoTURRQ29uc3RhbnRzLkJJTkRJTkdfUFJPUFNfTUFQLCBhbGxCaW5kaW5nUHJvcHMpOw0KLQ0KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsNCi0gICAgICAgICAgICBDbGllbnRNZXRhZGF0YVBvcnRTRUkgcG9ydDEgPSBzZXJ2aWNlMS5nZXRQb3J0KG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG11bHRpUG9ydFdzZGxfcG9ydExvY2FsUGFydDEpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudE1ldGFkYXRhUG9ydFNFSS5jbGFzcyk7DQotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgcG9ydDE7DQotICAgICAgICAgICAgYXNzZXJ0TnVsbChicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldCgiY3VzdG9tUHJvcGVydHkiKSk7DQotDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIENsaWVudE1ldGFkYXRhVGVzdC5yZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7DQotICAgICAgICB9DQotICAgIH0NCi19DQotDQotQFdlYlNlcnZpY2UobmFtZT0iRWNob01lc3NhZ2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLWludGVyZmFjZSBDbGllbnRNZXRhZGF0YVBvcnRTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBzdHJpbmcpOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9DbGllbnRNZXRhZGF0YVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhODAwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL0NsaWVudE1ldGFkYXRhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc3BpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvblRlc3RVdGlsczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUNsaWVudEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5EZXNjcmlwdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUZXN0IGNyZWF0aW9uIG9mIGEgZ2VuZXJpYyBTZXJ2aWNlIGFuZCBnZW5lcmF0ZWQgU2VydmljZSB3aXRoIGFuZCB3aXRob3V0IGFkZGl0aW9uYWwKLSAqIG1ldGFkYXRhIHNwZWNpZmllZCBkdXJpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSBzZXJ2aWNlLiAgQWRkaXRpb25hbCBtZXRhZGF0YSBjb3VsZCBiZSBzdXBwbGllZAotICogYnkgYSBydW50aW1lIGluIG9yZGVyIHRvIHN1cHBvcnQgSlNSLTEwOSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG9yIGluamVjdGlvbiBvZiBXZWJTZXJ2aWNlUmVmCi0gKiBhbm5vdGF0aW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRNZXRhZGF0YVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG9yaWdpbmFsV3NkbCA9ICJDbGllbnRNZXRhZGF0YS53c2RsIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG92ZXJyaWRlbldzZGwgPSAiQ2xpZW50TWV0YWRhdGFPdmVycmlkZW4ud3NkbCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdGhlcldzZGwgPSAiQ2xpZW50TWV0YWRhdGFPdGhlci53c2RsIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3JpZ2luYWxXc2RsX3BvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdmVycmlkZW5Xc2RsX3BvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydE92ZXJyaWRlbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBvdGhlcldzZGxfcG9ydExvY2FsUGFydCA9ICJwb3J0TG9jYWxQYXJ0T3RoZXIiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgdW5pcXVlQ2F0YWxvZyA9ICJ0ZXN0LXJlc291cmNlcy91bmlxdWUtY2F0YWxvZy54bWwiOwotCi0gICAgLyoqCi0gICAgICogVGVzdCBTZXJ2aWNlLmNyZWF0ZShRTmFtZSkgd2l0aCBubyBjb21wb3NpdGUgc3BlY2lmaWVkIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZVdpdGhvdXRDb21wb3NpdGUoKSB7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjSW5TZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIGdlbmVyaWMgU2VydmljZSB3aXRoIG5vIG92ZXJyaWRlcywgdGhlcmUgd2lsbCBiZSBubyBXZWJTZXJ2aWNlQ2xpZW50IGFubm90YXRpb24KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE51bGwod3NDbGllbnQpOwotICAgICAgICAKLSAgICAgICAgLy8gTm8gV1NETCBzaG91bGQgaGF2ZSBiZWVuIHVzZWQsIHNvIG5vIFBvcnRzIHNob3VsZCBiZSBmb3VuZAotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgbnVsbCkpOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShVUkwsIFFOYW1lKSB3aXRoIG5vIGNvbXBvc2l0ZSBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VXaXRob3V0Q29tcG9zaXRlKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdzZGxVUkwob3RoZXJXc2RsKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmNJblNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgZ2VuZXJpYyBTZXJ2aWNlIHdpdGggbm8gb3ZlcnJpZGVzLCB0aGVyZSB3aWxsIGJlIG5vIFdlYlNlcnZpY2VDbGllbnQgYW5ub3RhdGlvbgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudCk7Ci0KLSAgICAgICAgLy8gV1NETCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjcmVhdGUsIHNvIG1ha2Ugc3VyZSB0aGUgcmlnaHQgb25lIHdhcyB1c2VkIGJ5IGNoZWNraW5nIHRoZSBwb3J0cwotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmljZS5jcmVhdGUoUU5hbWUpIHdpdGggYSBjb21wb3NpdGUgc3BlY2lmaWVkIGJ1dCBubyBvdmVycmlkZSBpbiB0aGUgY29tcG9zaXRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZVdpdGhDb21wb3NpdGUoKSB7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgLy8gVXNlIHRoZSBwcm9wcmlldGFyeSBTUEkgdG8gY3JlYXRlIGEgc2VydmljZSB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgc3BlY2lmaWVkCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29tcG9zaXRlIGhhcyBiZWVuIHJlc2V0IHNvIHRoYXQgaXQgd291bGQgbm90IGFmZmVjdCB0aGUgbmV4dCBTZXJ2aWNlCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBnZW5lcmljIFNlcnZpY2Ugd2l0aCBubyBvdmVycmlkZXMsIHRoZXJlIHdpbGwgYmUgbm8gV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vIFdTREwgc2hvdWxkIGhhdmUgYmVlbiB1c2VkLCBzbyBubyBQb3J0cyBzaG91bGQgYmUgZm91bmQKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG51bGwpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShVUkwsIFFOYW1lKSB3aXRoIGEgY29tcG9zaXRlIHNwZWNpZmllZCBidXQgbm8gb3ZlcnJpZGUgaW4gdGhlIGNvbXBvc2l0ZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VXaXRoQ29tcG9zaXRlKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIFVSTCB3c2RsVXJsID0gZ2V0V3NkbFVSTChvdGhlcldzZGwpOwotICAgICAgICAvLyBVc2UgdGhlIHByb3ByaWV0YXJ5IFNQSSB0byBjcmVhdGUgYSBzZXJ2aWNlIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSBzcGVjaWZpZWQKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29tcG9zaXRlIGhhcyBiZWVuIHJlc2V0IHNvIHRoYXQgaXQgd291bGQgbm90IGFmZmVjdCB0aGUgbmV4dCBTZXJ2aWNlCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBnZW5lcmljIFNlcnZpY2Ugd2l0aCBubyBvdmVycmlkZXMsIHRoZXJlIHdpbGwgYmUgbm8gV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgd2FzIHNwZWNpZmllZCBvbiB0aGUgY3JlYXRlLCBzbyBtYWtlIHN1cmUgdGhlIHJpZ2h0IG9uZSB3YXMgdXNlZCBieSBjaGVja2luZyB0aGUgcG9ydHMKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJ2aWNlIGNvbnN0cnVjdG9yKCkgd2l0aCBubyBjb21wb3NpdGUgc3BlY2lmaWVkIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ0dlbmVyYXRlZFNlcnZpY2UoKSB7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLQotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVGhlcmUgaXMgV2ViU2VydmljZUNsaWVudCBvbiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UKLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NDbGllbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxXc2RsLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgbm90IHNwZWNpZmllZCwgc28gZ2VuZXJhdGVkIFNlcnZpY2Ugc2hvdWxkIHVzZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIFVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3JpZ2luYWxXc2RsX3BvcnRMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBubyBjb21wb3NpdGUgc3BlY2lmaWVkIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QyQXJnR2VuZXJhdGVkU2VydmljZSgpIHsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0KLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFRoZXJlIGlzIFdlYlNlcnZpY2VDbGllbnQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxXc2RsLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsKLQotICAgICAgICAvLyBXU0RMIHdhcyBzcGVjaWZpZWQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIGNvbnN0cnVjdG9yLCAKLSAgICAgICAgLy8gc28gbWFrZSBzdXJlIHRoZSByaWdodCBvbmUgd2FzIHVzZWQgYnkgY2hlY2tpbmcgdGhlIHBvcnRzCi0gICAgICAgIGFzc2VydFRydWUoIldyb25nIFdTREwgdXNlZCIsIHZhbGlkYXRlUG9ydChzZXJ2aWNlLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjb25zdHJ1Y3RvcigpIHdpdGggY29tcG9zaXRlIHNwZWNpZmllZCBidXQgbm8gb3ZlcnJpZGUgaW4gY29tcG9zaXRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ0dlbmVyYXRlZFNlcnZpY2VXaXRoQ29tcG9zaXRlKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGVyZSBpcyBXZWJTZXJ2aWNlQ2xpZW50IG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBhbmQgaXQgd2Fzbid0IG92ZXJyaWRlbiBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsV3NkbCwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsVE5TIiwgd3NDbGllbnQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBObyBXU0RMIG92ZXJyaWRlIHNwZWNpZmllZCBpbiB0aGUgY29tcG9zaXRlLCBzbyBnZW5lcmF0ZWQgU2VydmljZSBzaG91bGQgdXNlIHRoZSBhbm5vdGF0aW9uIHZhbHVlCi0gICAgICAgIGFzc2VydFRydWUoIldyb25nIFdTREwgVXNlZCIsIHZhbGlkYXRlUG9ydChzZXJ2aWNlLCBvcmlnaW5hbFdzZGxfcG9ydExvY2FsUGFydCkpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBjb21wb3NpdGUgc3BlY2lmaWVkIGJ1dCBubyBvdmVycmlkZSBpbiBjb21wb3NpdGUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDJBcmdHZW5lcmF0ZWRTZXJ2aWNlV2l0aENvbXBvc2l0ZSgpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGVyZSBpcyBXZWJTZXJ2aWNlQ2xpZW50IG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBhbmQgaXQgd2Fzbid0IG92ZXJyaWRlbiBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsV3NkbCwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsVE5TIiwgd3NDbGllbnQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV1NETCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBjb25zdHJ1Y3RvciwgYW5kIG5vbmUgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICAvLyBzbyBzaG91bGQgZ2V0IHRoZSBXU0RMIHNwZWNpZmllZCBvbiB0aGUgY29uc3RydWN0b3IKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlcnZpY2UuY3JlYXRlKFFOYW1lKSB3aXRoIGEgY29tcG9zaXRlIHRoYXQgc3BlY2lmaWVzIGEgd3NkbExvY2F0aW9uIG92ZXJyaWRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZU92ZXJyaWRlV3NkbExvY2F0aW9uKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7Ci0gICAgICAgIC8vIFVzZSB0aGUgcHJvcHJpZXRhcnkgU1BJIHRvIGNyZWF0ZSBhIHNlcnZpY2Ugd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhIHNwZWNpZmllZAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZShzZXJ2aWNlUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbXBvc2l0ZSBoYXMgYmVlbiByZXNldCBzbyB0aGF0IGl0IHdvdWxkIG5vdCBhZmZlY3QgdGhlIG5leHQgU2VydmljZQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGlzIGlzIGEgZ2VuZXJpYyBTZXJ2aWNlIHdpdGggb3ZlcnJpZGVzLCB0aGVyZSB3aWxsIGJlIFdlYlNlcnZpY2VDbGllbnQgYW5ub3RhdGlvbgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCksIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwod3NDbGllbnQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgb3ZlcnJpZGUgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG92ZXJyaWRlbldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IG92ZXJyaWRlcyB0aGUgVGFyZ2V0TmFtZXNwYWNlLiAgTW9zdCBvZiB0aGUKLSAgICAgKiBvdGhlciB0ZXN0cyBvdmVycmlkZSB0aGUgV1NETCBMb2NhdGlvbiBzaW5jZSB0aGF0IGlzIHdoYXQgYSBKU1ItMTA5IEREIGNhbiBzcGVjaWZ5LiAgVGhpcwotICAgICAqIHRlc3QgbWFrZXMgc3VyZSBvdGhlciB2YWx1ZXMgY2FuIGJlIG92ZXJyaWRkZW4gYXMgd2VsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZU92ZXJyaWRlVE5TKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCAib3ZlcnJpZGVUTlMiLCBudWxsKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICAvLyBVc2UgdGhlIHByb3ByaWV0YXJ5IFNQSSB0byBjcmVhdGUgYSBzZXJ2aWNlIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSBzcGVjaWZpZWQKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb21wb3NpdGUgaGFzIGJlZW4gcmVzZXQgc28gdGhhdCBpdCB3b3VsZCBub3QgYWZmZWN0IHRoZSBuZXh0IFNlcnZpY2UKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVGhlIHRhcmdldCBuYW1lc3BhY2UgZm9yIHRoZSBrZXkgc2hvdWxkIGJlIG92ZXJyaWRlbjsgaXQgc2hvdWxkIG5vdCBiZSBvdmVycmlkZW4gZm9yCi0gICAgICAgIC8vIG5vIGtleS4KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE51bGwod3NDbGllbnQpOwotICAgICAgICAKLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudEtleWVkID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudEtleWVkKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudEtleWVkLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdmVycmlkZVROUyIsIHdzQ2xpZW50S2V5ZWQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50S2V5ZWQubmFtZSgpKTsKLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlLmNyZWF0ZShRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIENhdGFsb2dNYW5hZ2VyIG92ZXJyaWRlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QxQXJnU2VydmljZU92ZXJyaWRlQ2F0YWxvZ01hbmFnZXIoKSB7Ci0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIE9BU0lTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIgPSBuZXcgT0FTSVNDYXRhbG9nTWFuYWdlcigpOwotICAgICAgICBjYXRhbG9nTWFuYWdlci5zZXRDYXRhbG9nRmlsZXMoZ2V0Q2F0YWxvZ0xvY2F0aW9uKHVuaXF1ZUNhdGFsb2cpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldENhdGFsb2dNYW5hZ2VyKGNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgLy8gVXNlIHRoZSBwcm9wcmlldGFyeSBTUEkgdG8gY3JlYXRlIGEgc2VydmljZSB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgc3BlY2lmaWVkCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gU2VydmljZS5jcmVhdGUoc2VydmljZVFOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb21wb3NpdGUgaGFzIGJlZW4gcmVzZXQgc28gdGhhdCBpdCB3b3VsZCBub3QgYWZmZWN0IHRoZSBuZXh0IFNlcnZpY2UKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIENhdGFsb2dNYW5hZ2VyIGZvciB0aGUgU2VydmljZSB1c2VzIHRoZSB1bmlxdWUgY2F0YWxvZyBmaWxlLgotICAgICAgICBTdHJpbmcgc2VydmljZUNhdGFsb2dGaWxlID0gKFN0cmluZykgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKS5nZXRDYXRhbG9nTWFuYWdlcigpLmdldENhdGFsb2dGaWxlcygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VDYXRhbG9nRmlsZSwgZ2V0Q2F0YWxvZ0xvY2F0aW9uKHVuaXF1ZUNhdGFsb2cpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VydmljZS5jcmVhdGUoVVJMLCBRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIHdzZGxMb2NhdGlvbiBvdmVycmlkZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VPdmVycmlkZVdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBnZXRXc2RsVVJMKG90aGVyV3NkbCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3c0NsaWVudEFubm8gPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7Ci0gICAgICAgIC8vIFVzZSB0aGUgcHJvcHJpZXRhcnkgU1BJIHRvIGNyZWF0ZSBhIHNlcnZpY2Ugd2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhIHNwZWNpZmllZAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29tcG9zaXRlIGhhcyBiZWVuIHJlc2V0IHNvIHRoYXQgaXQgd291bGQgbm90IGFmZmVjdCB0aGUgbmV4dCBTZXJ2aWNlCi0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFNpbmNlIHRoaXMgaXMgYSBnZW5lcmljIFNlcnZpY2Ugd2l0aCAgb3ZlcnJpZGVzLCB0aGVyZSB3aWxsIGJlIGEgV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFdzZGxMb2NhdGlvbihvdmVycmlkZW5Xc2RsKSwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnROdWxsKHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh3c0NsaWVudC5uYW1lKCkpOwotCi0gICAgICAgIC8vIFdTREwgb3ZlcnJpZGUgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG92ZXJyaWRlbldzZGxfcG9ydExvY2FsUGFydCkpOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNlcnZpY2UuY3JlYXRlKFVSTCwgUU5hbWUpIHdpdGggYSBjb21wb3NpdGUgdGhhdCBzcGVjaWZpZXMgYSBDYXRhbG9nTWFuYWdlciBvdmVycmlkZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ1NlcnZpY2VPdmVycmlkZUNhdGFsb2dNYW5hZ2VyKCkgewotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICBVUkwgd3NkbFVybCA9IGdldFdzZGxVUkwob3RoZXJXc2RsKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgT0FTSVNDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciA9IG5ldyBPQVNJU0NhdGFsb2dNYW5hZ2VyKCk7Ci0gICAgICAgIGNhdGFsb2dNYW5hZ2VyLnNldENhdGFsb2dGaWxlcyhnZXRDYXRhbG9nTG9jYXRpb24odW5pcXVlQ2F0YWxvZykpOwotICAgICAgICBjb21wb3NpdGUuc2V0Q2F0YWxvZ01hbmFnZXIoY2F0YWxvZ01hbmFnZXIpOwotICAgICAgICAvLyBVc2UgdGhlIHByb3ByaWV0YXJ5IFNQSSB0byBjcmVhdGUgYSBzZXJ2aWNlIHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YSBzcGVjaWZpZWQKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvbXBvc2l0ZSBoYXMgYmVlbiByZXNldCBzbyB0aGF0IGl0IHdvdWxkIG5vdCBhZmZlY3QgdGhlIG5leHQgU2VydmljZQotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBDYXRhbG9nTWFuYWdlciBmb3IgdGhlIFNlcnZpY2UgdXNlcyB0aGUgdW5pcXVlIGNhdGFsb2cgZmlsZS4KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VDYXRhbG9nRmlsZSA9IChTdHJpbmcpIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkuZ2V0Q2F0YWxvZ01hbmFnZXIoKS5nZXRDYXRhbG9nRmlsZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlQ2F0YWxvZ0ZpbGUsIGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoKSB3aXRoIGEgY29tcG9zaXRlIHRoYXQgc3BlY2lmaWVzIGEgd3NkbExvY2F0aW9uIG92ZXJyaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQXJnR2VuZXJhdGVkU2VydmljZU92ZXJyaWRlV3NkbExvY2F0aW9uKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZSgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFRoZXJlIGlzIFdlYlNlcnZpY2VDbGllbnQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIGFuZCBpdCB3YXMgb3ZlcnJpZGVuIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgLy8gZm9yIHRoaXMga2V5LCBob3dldmVyIHRoZSBrZXlsZXNzIGNvbXBvc2l0ZSBzaG91bGQgbm90IGhhdmUgYW55IG92ZXJyaWRlcy4KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NDbGllbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxXc2RsLCB3c0NsaWVudC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnRLZXllZCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUod3NDbGllbnQsIHdzQ2xpZW50S2V5ZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpLCB3c0NsaWVudEtleWVkLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50S2V5ZWQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50S2V5ZWQubmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdTREwgb3ZlcnJpZGUgc3BlY2lmaWVkIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UsIG92ZXJyaWRlbldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjb25zdHJ1Y3RvcigpIHdpdGggYSBjb21wb3NpdGUgdGhhdCBzcGVjaWZpZXMgYSBDYXRhbG9nTWFuYWdlciBvdmVycmlkZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ0dlbmVyYXRlZFNlcnZpY2VPdmVycmlkZUNhdGFsb2dNYW5hZ2VyKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBPQVNJU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgY2F0YWxvZ01hbmFnZXIuc2V0Q2F0YWxvZ0ZpbGVzKGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDYXRhbG9nTWFuYWdlcihjYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQ2F0YWxvZ01hbmFnZXIgZm9yIHRoZSBTZXJ2aWNlIHVzZXMgdGhlIHVuaXF1ZSBjYXRhbG9nIGZpbGUuCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ2F0YWxvZ0ZpbGUgPSAoU3RyaW5nKSBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpLmdldENhdGFsb2dNYW5hZ2VyKCkuZ2V0Q2F0YWxvZ0ZpbGVzKCkuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZUNhdGFsb2dGaWxlLCBnZXRDYXRhbG9nTG9jYXRpb24odW5pcXVlQ2F0YWxvZykpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjb25zdHJ1Y3RvcihVUkwsIFFOYW1lKSB3aXRoIGEgY29tcG9zaXRlIHRoYXQgc3BlY2lmaWVzIGEgd3NkbExvY2F0aW9uIG92ZXJyaWRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDJBcmdHZW5lcmF0ZWRTZXJ2aWNlT3ZlcnJpZGVXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3c0NsaWVudEFubm8gPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKGdldFdzZGxVUkwob3RoZXJXc2RsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotICAgICAgICAvLyBUaGVyZSBpcyBXZWJTZXJ2aWNlQ2xpZW50IG9uIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBhbmQgaXQgd2FzIG92ZXJyaWRlbiBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIC8vIGZvciB0aGlzIGtleSwgaG93ZXZlciB0aGUga2V5bGVzcyBjb21wb3NpdGUgc2hvdWxkIG5vdCBoYXZlIGFueSBvdmVycmlkZXMuCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBkYmNJblNlcnZpY2VEZXNjLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzQ2xpZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsV3NkbCwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yaWdpbmFsVE5TIiwgd3NDbGllbnQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7Ci0KLSAgICAgICAgV2ViU2VydmljZUNsaWVudCB3c0NsaWVudEtleWVkID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSh3c0NsaWVudCwgd3NDbGllbnRLZXllZCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpLCB3c0NsaWVudEtleWVkLndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50S2V5ZWQudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50S2V5ZWQubmFtZSgpKTsKLQotICAgICAgICAvLyBXU0RMIG92ZXJyaWRlIHNwZWNpZmllZCBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIGFzc2VydFRydWUoIldyb25nIFdTREwgdXNlZCIsIHZhbGlkYXRlUG9ydChzZXJ2aWNlLCBvdmVycmlkZW5Xc2RsX3BvcnRMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIAotICAgICAqIHRhcmdldCBOYW1lc3BhY2Ugb3ZlcnJpZGUuICBNb3N0IG9mIHRoZSBvdGhlciB0ZXN0cyBhcmUgYmFzZWQgb24gd3NkbExvY2F0aW9uIHNpbmNlCi0gICAgICogdGhhdCBpcyB3aGF0IEpTUi0xMDkgRERzIG92ZXJyaWRlLiAgVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgb3RoZXIgbWVtYmVycyBjYW4gYWxzbwotICAgICAqIGJlIG92ZXJyaWRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3QyQXJnR2VuZXJhdGVkU2VydmljZU92ZXJyaWRlVE5TKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgIm92ZXJyaWRlVE5TIiwgZ2V0V3NkbExvY2F0aW9uKG92ZXJyaWRlbldzZGwpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZShnZXRXc2RsVVJMKG90aGVyV3NkbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlbGVnYXRlKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gc2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiY0luU2VydmljZURlc2MgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjKTsKLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlLmNsYXNzLCBkYmNJblNlcnZpY2VEZXNjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgLy8gVGhlcmUgaXMgV2ViU2VydmljZUNsaWVudCBvbiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgYW5kIGl0IHdhcyBvdmVycmlkZW4gaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICAvLyBmb3IgdGhpcyBrZXksIGhvd2V2ZXIgdGhlIGtleWxlc3MgY29tcG9zaXRlIHNob3VsZCBub3QgaGF2ZSBhbnkgb3ZlcnJpZGVzLgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFdzZGwsIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudC5uYW1lKCkpOwotCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnRLZXllZCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUod3NDbGllbnQsIHdzQ2xpZW50S2V5ZWQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFdzZGxMb2NhdGlvbihvdmVycmlkZW5Xc2RsKSwgd3NDbGllbnRLZXllZC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3ZlcnJpZGVUTlMiLCB3c0NsaWVudEtleWVkLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudEtleWVkLm5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV1NETCBvdmVycmlkZSBzcGVjaWZpZWQgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3ZlcnJpZGVuV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdlbmVyYXRlZCBzZXJ2aWNlIGNvbnN0cnVjdG9yKFVSTCwgUU5hbWUpIHdpdGggYSBjb21wb3NpdGUgdGhhdCBzcGVjaWZpZXMgYSAKLSAgICAgKiBDYXRhbG9nIE1hbmFnZXIgb3ZlcnJpZGUuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MkFyZ0dlbmVyYXRlZFNlcnZpY2VPdmVycmlkZUNhdGFsb2dNYW5hZ2VyKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBPQVNJU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgY2F0YWxvZ01hbmFnZXIuc2V0Q2F0YWxvZ0ZpbGVzKGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDYXRhbG9nTWFuYWdlcihjYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoY29tcG9zaXRlKTsKLQotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKGdldFdzZGxVUkwob3RoZXJXc2RsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgIAotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVsZWdhdGUpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSBzZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjSW5TZXJ2aWNlRGVzYyA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MpOwotICAgICAgICBhc3NlcnRTYW1lKGNvbXBvc2l0ZSwgZGJjSW5TZXJ2aWNlRGVzYy5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UuY2xhc3MsIGRiY0luU2VydmljZURlc2MuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBDYXRhbG9nTWFuYWdlciBmb3IgdGhlIFNlcnZpY2UgdXNlcyB0aGUgdW5pcXVlIGNhdGFsb2cgZmlsZS4KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VDYXRhbG9nRmlsZSA9IChTdHJpbmcpIGRiY0luU2VydmljZURlc2MuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZSkuZ2V0Q2F0YWxvZ01hbmFnZXIoKS5nZXRDYXRhbG9nRmlsZXMoKS5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlQ2F0YWxvZ0ZpbGUsIGdldENhdGFsb2dMb2NhdGlvbih1bmlxdWVDYXRhbG9nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVkIHNlcnZpY2UgY29uc3RydWN0b3IoVVJMLCBRTmFtZSkgd2l0aCBhIGNvbXBvc2l0ZSB0aGF0IHNwZWNpZmllcyBhIHdzZGxMb2NhdGlvbiBvdmVycmlkZQotICAgICAqIHdoZXJlIHRoZSBvdmVycmlkZSBpcyBhIGZ1bGx5IHNwZWNpZmVkIFVSTCB0byBhIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdDJBcmdHZW5lcmF0ZWRTZXJ2aWNlT3ZlcnJpZGVXc2RsTG9jYXRpb25XaXRoUHJvdG9jb2woKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIC8vIElmIHRoZSB3c2RsTG9jYXRpb24gaW4gdGhlIGNvbXBvc2l0ZSBzcGVjaWZpZXMgYSBwcm90b2NvbCAobGlrZSBmaWxlOiBvciBodHRwOikgdGhlbgotICAgICAgICAvLyBpdCBzaG91bGQgYmUgdXNlZCBhcy1pcy4gIE90aGVyd2lzZSAoYXMgc2hvd24gYnkgdGhlIG90aGVyIHRlc3RzKSwgaXQgaXMgdHJlYXRlZCBhcwotICAgICAgICAvLyBhIHBhdGggb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uCi0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBnZXRXc2RsTG9jYXRpb24ob3ZlcnJpZGVuV3NkbCk7Ci0gICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgVW5peC9MaW51eCBmaWxlIHBhdGhzIGJlZ2luCi0gICAgICAgIC8vIHdpdGggYSAnLycuIFdoZW4gYWRkaW5nIHRoZSBwcmVmaXggJ2phcjpmaWxlOi8nIHdlIG1heSBlbmQKLSAgICAgICAgLy8gdXAgd2l0aCAnLy8nIGFmdGVyIHRoZSAnZmlsZTonIHBhcnQuIFRoaXMgY2F1c2VzIHRoZSBVUkwgCi0gICAgICAgIC8vIG9iamVjdCB0byB0cmVhdCB0aGlzIGxpa2UgYSByZW1vdGUgcmVzb3VyY2UKLSAgICAgICAgaWYod3NkbExvY2F0aW9uLmluZGV4T2YoIi8iKSA9PSAwKSB7Ci0gICAgICAgICAgICB3c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb24uc3Vic3RyaW5nKDEsIHdzZGxMb2NhdGlvbi5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZnVsbFdzZGxMb2NhdGlvbiA9ICJmaWxlOi8iICsgd3NkbExvY2F0aW9uOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgZnVsbFdzZGxMb2NhdGlvbik7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qod3NDbGllbnRBbm5vKTsKLSAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShjb21wb3NpdGUpOwotCi0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCkpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgCi0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYyk7Ci0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBkYmNJblNlcnZpY2VEZXNjLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0gICAgICAgIC8vIFRoZXJlIGlzIFdlYlNlcnZpY2VDbGllbnQgb24gdGhlIGdlbmVyYXRlZCBTZXJ2aWNlIGFuZCBpdCB3YXMgb3ZlcnJpZGVuIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgLy8gZm9yIHRoZSBrZXkuICBUaGUgYW5ub3RhdGlvbiB3aXRoIG5vIGtleSBzaG91bGQgYmUgdW5jaGFuZ2VkLgotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gZGJjSW5TZXJ2aWNlRGVzYy5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0NsaWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFdzZGwsIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFROUyIsIHdzQ2xpZW50LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudC5uYW1lKCkpOwotCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnRLZXllZCA9IGRiY0luU2VydmljZURlc2MuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KHNlcnZpY2VEZWxlZ2F0ZSk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUod3NDbGllbnQsIHdzQ2xpZW50S2V5ZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZnVsbFdzZGxMb2NhdGlvbiwgd3NDbGllbnRLZXllZC53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudEtleWVkLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB3c0NsaWVudEtleWVkLm5hbWUoKSk7Ci0KLSAgICAgICAgLy8gV1NETCBvdmVycmlkZSBzcGVjaWZpZWQgaW4gdGhlIGNvbXBvc2l0ZQotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBXU0RMIHVzZWQiLCB2YWxpZGF0ZVBvcnQoc2VydmljZSwgb3ZlcnJpZGVuV3NkbF9wb3J0TG9jYWxQYXJ0KSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgb3ZlcnJpZGUgV1NETCBmaWxlIHRoYXQgaXMgZnVsbCBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFdzZGxMb2NhdGlvbk92ZXJyaWRlV2l0aFByb3RvY29sKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0V3NkbExvY2F0aW9uKCJJbnZhbGlkRmlsZU5hbWUud3NkbCIpOwotICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIFVuaXgvTGludXggZmlsZSBwYXRocyBiZWdpbgotICAgICAgICAvLyB3aXRoIGEgJy8nLiBXaGVuIGFkZGluZyB0aGUgcHJlZml4ICdqYXI6ZmlsZTovJyB3ZSBtYXkgZW5kCi0gICAgICAgIC8vIHVwIHdpdGggJy8vJyBhZnRlciB0aGUgJ2ZpbGU6JyBwYXJ0LiBUaGlzIGNhdXNlcyB0aGUgVVJMIAotICAgICAgICAvLyBvYmplY3QgdG8gdHJlYXQgdGhpcyBsaWtlIGEgcmVtb3RlIHJlc291cmNlCi0gICAgICAgIGlmKHdzZGxMb2NhdGlvbi5pbmRleE9mKCIvIikgPT0gMCkgewotICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uLnN1YnN0cmluZygxLCB3c2RsTG9jYXRpb24ubGVuZ3RoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxXc2RsTG9jYXRpb24gPSAiaHR0cDovIiArIHdzZGxMb2NhdGlvbjsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCB3c0NsaWVudEFubm8gPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbChudWxsLCBudWxsLCBmdWxsV3NkbExvY2F0aW9uKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIGludmFsaWQgV1NETCBmaWxlIG5hbWUgaW4gb3ZlcnJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG92ZXJpZGUgV1NETCBmaWxlIGRvZXNuJ3QgZXhpc3Q7IHNob3VsZCBjYXRjaCBhbiBlcnJvciAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFdzZGxMb2NhdGlvbk92ZXJyaWRlKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd3NDbGllbnRBbm5vID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZVdlYlNlcnZpY2VDbGllbnRBbm5vdEltcGwobnVsbCwgbnVsbCwgZ2V0V3NkbExvY2F0aW9uKCJJbnZhbGlkRmlsZU5hbWUud3NkbCIpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c0NsaWVudEFubm8pOwotICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIGludmFsaWQgV1NETCBmaWxlIG5hbWUgaW4gb3ZlcnJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzZXJ2aWNlLiAgVmFsaWRhdGUgdGhhdCB0aGUgc2VydmljZSBkZWxlZ2F0ZXMgYXJlCi0gICAgICogdW5pcXVlIGFuZCB0aGUgU2VydmljZURlc2NyaXB0aW9uIGlzIHNoYXJlZC4gIE5vdGUgd2UgaGF2ZSB0byBpbnN0YWxsIGEgc3BlY2lhbCBmYWN0b3J5Ci0gICAgICogc28gdGhhdCB0aGUgU2VydmljZURlc2NyaXB0aW9ucyBhcmUgY2FjaGVkOyB0aGUgZGVmYXVsdCBmYWN0b3J5IHdpbGwgbm90IGNhdXNlIHRoZW0gdG8gYmUKLSAgICAgKiBjYWNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VydmljZXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnN0YWxsQ2FjaGluZ0ZhY3RvcnkoKTsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgICAgICBRTmFtZSBwb3J0UU4gPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IENsaWVudE1ldGFkYXRhVGVzdC5nZXRXc2RsVVJMKG90aGVyV3NkbCk7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2VydmljZSAKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTEgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTEgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UxKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzEgPSBzZXJ2aWNlRGVsZWdhdGUxLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGVQb3J0KHNlcnZpY2UxLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2Vjb25kIHNlcnZpY2UgCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUyID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MyID0gc2VydmljZURlbGVnYXRlMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMiwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb3RTYW1lKHNlcnZpY2VEZWxlZ2F0ZTEsIHNlcnZpY2VEZWxlZ2F0ZTIpOwotICAgICAgICAgICAgLy8gU2luY2Ugd2UgaW5zdGFsbGVkIGEgY2FjaGluZyBmYWN0b3J5LCB0aGUgc2VydmljZSBkZXNjcmlwdGlvbnMgV0lMTCBiZSBjYWNoZWQuCi0gICAgICAgICAgICAvLyBXaXRob3V0IHRoYXQgZmFjdG9yeSwgdGhleSB3b3VsZCBub3QgaGF2ZSBiZWVuIGNhY2hlZC4gIFRoZSByZWFzb24gaXMgdGhhdCB0aGUKLSAgICAgICAgICAgIC8vIEF4aXNDb25maWd1cmF0aW9uIGluc3RhbmNlIGlzIHBhcnQgb2YgdGhlIGtleS4gIFRoZSBkZWZhdWx0IGZhY3RvcnkgaW4gdGhpcyAKLSAgICAgICAgICAgIC8vIGVudmlyb25tZW50IGFsd2F5cyByZXR1cm5zIGEgbmV3IGluc3RhbmNlLiAgVGhlIHRlc3QgZmFjdG9yeSBkb2VzIG5vdC4KLSAgICAgICAgICAgIGFzc2VydFNhbWUoc2VydmljZURlc2MxLCBzZXJ2aWNlRGVzYzIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVzdG9yZU9yaWdpbmFsRmFjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgZmFjdG9yeSBXQVMgcmVzdG9yZWQuICBEbyB0aGUgc2FtZSB0aGluZyBhcyBhYm92ZSwgYnV0IHRoaXMgdGltZQotICAgICAgICAvLyB0aGUgc2VydmljZSBkZXNjcyBzaG91bGQgTk9UIGJlIHRoZSBzYW1lIHNpbmNlIHRoZXkgd2VyZW4ndCBjYWNoZWQuCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7Ci0gICAgICAgIFFOYW1lIHBvcnRRTiA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsKLSAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChvdGhlcldzZGwpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2VydmljZSAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMSwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2VydmljZSAKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlMiA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUyID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMiwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShzZXJ2aWNlRGVsZWdhdGUxLCBzZXJ2aWNlRGVsZWdhdGUyKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSgiQ2xpZW50IENvbmZpZ3VyYXRpb24gZmFjdG9yeSBOT1QgcmVzdG9yZWQ7IHN1YnNlcXVlbnQgdGVzdHMgbWF5IGJlIGFmZmVjdGVkISIsIHNlcnZpY2VEZXNjMSwgc2VydmljZURlc2MyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHR3byBzZXJ2aWNlcyBzdWNoIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgc2hhcmVkLgotICAgICAqIENyZWF0ZSB0aGUgZmlyc3Qgd2l0aG91dCBhIGNvbXBvc2l0ZSwgdGhlIHNlY29uZCB3aXRoIGEgY29tcG9zaXRlLCB0aGVuIHZhbGlkYXRlIHRoZSBzZWNvbmQgCi0gICAgICogc2VydmljZSdzIGNvbXBvc2l0ZS4gIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgZmFjdG9yeSBzbyB0aGF0IHRoZSBzZXJ2aWNlCi0gICAgICogZGVzY3JpcHRpb25zIGFyZSBjYWNoZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlc01peGVkQ29tcG9zaXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7Ci0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOwotICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChvdGhlcldzZGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGZpcnN0IHNlcnZpY2UgCi0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UxID0gU2VydmljZS5jcmVhdGUod3NkbFVybCwgc2VydmljZVFOYW1lKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MxID0gc2VydmljZURlbGVnYXRlMS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHZhbGlkYXRlUG9ydChzZXJ2aWNlMSwgb3RoZXJXc2RsX3BvcnRMb2NhbFBhcnQpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNlY29uZCBzZXJ2aWNlIHNwZWNpZml5aW5nIGEgc3BhcnNlIGNvbXBvc2l0ZQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzIgPSBzZXJ2aWNlRGVsZWdhdGUyLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGVQb3J0KHNlcnZpY2UyLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBpbnN0YWxsZWQgYSBjYWNoaW5nIGZhY3RvcnksIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9ucyBXSUxMIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhhdCBmYWN0b3J5LCB0aGV5IHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FjaGVkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHRoZQotICAgICAgICAgICAgLy8gQXhpc0NvbmZpZ3VyYXRpb24gaW5zdGFuY2UgaXMgcGFydCBvZiB0aGUga2V5LiAgVGhlIGRlZmF1bHQgZmFjdG9yeSBpbiB0aGlzIAotICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgYWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuICBUaGUgdGVzdCBmYWN0b3J5IGRvZXMgbm90LgotICAgICAgICAgICAgYXNzZXJ0U2FtZShzZXJ2aWNlRGVzYzEsIHNlcnZpY2VEZXNjMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBub3QgYmUgYSBzcGFyc2UgY29tcG9zaXRlIGZvciB0aGUgZmlyc3Qgc2VydmljZSBkZWxlZ2F0ZSBhbmQgdGhlcmUKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBvbmUgZm9yIHRoZSBzZWNvbmQgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgYXNzZXJ0TnVsbChEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjMikuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZTEpKTsKLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlLCBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjMikuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZTIpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlc3RvcmVPcmlnaW5hbEZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHR3byBzZXJ2aWNlcyBzdWNoIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgc2hhcmVkLgotICAgICAqIENyZWF0ZSB0aGUgZmlyc3Qgd2l0aCBhIGNvbXBvc2l0ZSwgdGhlIHNlY29uZCB3aXRoIGEgY29tcG9zaXRlLCB0aGVuIHZhbGlkYXRlIGJvdGggCi0gICAgICogY29tcG9zaXRlcy4gIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgZmFjdG9yeSBzbyB0aGF0IHRoZSBzZXJ2aWNlCi0gICAgICogZGVzY3JpcHRpb25zIGFyZSBjYWNoZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZXJ2aWNlc011bHRpcGxlQ29tcG9zaXRlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluc3RhbGxDYWNoaW5nRmFjdG9yeSgpOwotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsKLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gQ2xpZW50TWV0YWRhdGFUZXN0LmdldFdzZGxVUkwob3RoZXJXc2RsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaXJzdCBzZXJ2aWNlIAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZTEpOwotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IFNlcnZpY2UuY3JlYXRlKHdzZGxVcmwsIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUgc2VydmljZURlbGVnYXRlMSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVsZWdhdGUoc2VydmljZTEpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVBvcnQoc2VydmljZTEsIG90aGVyV3NkbF9wb3J0TG9jYWxQYXJ0KTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2VydmljZSBzcGVjaWZpeWluZyBhIHNwYXJzZSBjb21wb3NpdGUKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlLnNldFNlcnZpY2VNZXRhZGF0YShzcGFyc2VDb21wb3NpdGUyKTsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZTIgPSBTZXJ2aWNlLmNyZWF0ZSh3c2RsVXJsLCBzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgU2VydmljZURlbGVnYXRlIHNlcnZpY2VEZWxlZ2F0ZTIgPSBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlbGVnYXRlKHNlcnZpY2UyKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoU2VydmljZURlbGVnYXRlLmdldFNlcnZpY2VNZXRhZGF0YSgpKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzIgPSBzZXJ2aWNlRGVsZWdhdGUyLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdmFsaWRhdGVQb3J0KHNlcnZpY2UyLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7Ci0gICAgICAgICAgICAvLyBTaW5jZSB3ZSBpbnN0YWxsZWQgYSBjYWNoaW5nIGZhY3RvcnksIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9ucyBXSUxMIGJlIGNhY2hlZC4KLSAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhhdCBmYWN0b3J5LCB0aGV5IHdvdWxkIG5vdCBoYXZlIGJlZW4gY2FjaGVkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IHRoZQotICAgICAgICAgICAgLy8gQXhpc0NvbmZpZ3VyYXRpb24gaW5zdGFuY2UgaXMgcGFydCBvZiB0aGUga2V5LiAgVGhlIGRlZmF1bHQgZmFjdG9yeSBpbiB0aGlzIAotICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgYWx3YXlzIHJldHVybnMgYSBuZXcgaW5zdGFuY2UuICBUaGUgdGVzdCBmYWN0b3J5IGRvZXMgbm90LgotICAgICAgICAgICAgYXNzZXJ0U2FtZShzZXJ2aWNlRGVzYzEsIHNlcnZpY2VEZXNjMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBub3QgYmUgYSBzcGFyc2UgY29tcG9zaXRlIGZvciB0aGUgZmlyc3Qgc2VydmljZSBkZWxlZ2F0ZSBhbmQgdGhlcmUKLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBvbmUgZm9yIHRoZSBzZWNvbmQgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCBEZXNjcmlwdGlvblRlc3RVdGlsczIuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHNlcnZpY2VEZXNjMikuZ2V0U3BhcnNlQ29tcG9zaXRlKHNlcnZpY2VEZWxlZ2F0ZTEpKTsKLSAgICAgICAgICAgIGFzc2VydFNhbWUoc3BhcnNlQ29tcG9zaXRlMiwgRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYzIpLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUyKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdHdvIGdlbmVyYXRlZCBzZXJ2aWNlcyBzdWNoIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgc2hhcmVkLgotICAgICAqIENyZWF0ZSB0aGUgZmlyc3Qgd2l0aCBhIGNvbXBvc2l0ZSwgdGhlIHNlY29uZCB3aXRoIGEgY29tcG9zaXRlLCB0aGVuIHZhbGlkYXRlIGJvdGggCi0gICAgICogY29tcG9zaXRlcy4gIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgZmFjdG9yeSBzbyB0aGF0IHRoZSBzZXJ2aWNlCi0gICAgICogZGVzY3JpcHRpb25zIGFyZSBjYWNoZWQuICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVHZW5lcmF0ZWRTZXJ2aWNlV2l0aE11bHRpcGxlQ29tcG9zaXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5zdGFsbENhY2hpbmdGYWN0b3J5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlyc3Qgc2VydmljZSB3aXRoIGEgc3BhcnNlIGNvbXBvc2l0ZQotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZTEgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBTZXJ2aWNlRGVsZWdhdGUuc2V0U2VydmljZU1ldGFkYXRhKHNwYXJzZUNvbXBvc2l0ZTEpOwotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlMSA9IG5ldyBDbGllbnRNZXRhZGF0YUdlbmVyYXRlZFNlcnZpY2UoZ2V0V3NkbFVSTChvdGhlcldzZGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZTEpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChTZXJ2aWNlRGVsZWdhdGUuZ2V0U2VydmljZU1ldGFkYXRhKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNlY29uZCBzZXJ2aWNlIHdpdGggYSBzcGFyc2UgY29tcG9zaXRlCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlMiA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZS5zZXRTZXJ2aWNlTWV0YWRhdGEoc3BhcnNlQ29tcG9zaXRlMik7Ci0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UyID0gbmV3IENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZShnZXRXc2RsVVJMKG90aGVyV3NkbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKFNlcnZpY2VEZWxlZ2F0ZS5nZXRTZXJ2aWNlTWV0YWRhdGEoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFZlcmlmaXkgdGhlIHNlcnZpY2UgZGVsZWdhdGVzIGFyZSBkaWZmZXJlbnQgYW5kIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9ucyBhcmUgdGhlIHNhbWUKLSAgICAgICAgICAgIC8vIHNpbmNlIHdlIGluc3RhbGxlZCBhIGNhY2hpbmcgZmFjdG9yeSBhYm92ZS4KLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUxID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZTEpOwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMSA9IHNlcnZpY2VEZWxlZ2F0ZTEuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjMSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VEZWxlZ2F0ZSBzZXJ2aWNlRGVsZWdhdGUyID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZWxlZ2F0ZShzZXJ2aWNlMik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZWxlZ2F0ZTIpOwotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjMiA9IHNlcnZpY2VEZWxlZ2F0ZTIuZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjMik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoc2VydmljZURlbGVnYXRlMSwgc2VydmljZURlbGVnYXRlMik7Ci0gICAgICAgICAgICBhc3NlcnRTYW1lKHNlcnZpY2VEZXNjMSwgc2VydmljZURlc2MyKTsKLQotICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgc3BhcnNlIGNvbXBvc2l0ZSBmb3IgdGhlIGZpcnN0IHNlcnZpY2UgZGVsZWdhdGUgYW5kCi0gICAgICAgICAgICAvLyBvbmUgZm9yIHRoZSBzZWNvbmQgc2VydmljZSBkZWxlZ2F0ZQotICAgICAgICAgICAgYXNzZXJ0U2FtZShzcGFyc2VDb21wb3NpdGUxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYzIpLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGUxKSk7Ci0gICAgICAgICAgICBhc3NlcnRTYW1lKHNwYXJzZUNvbXBvc2l0ZTIsIERlc2NyaXB0aW9uVGVzdFV0aWxzMi5nZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoc2VydmljZURlc2MyKS5nZXRTcGFyc2VDb21wb3NpdGUoc2VydmljZURlbGVnYXRlMikpOwotCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmNJblNlcnZpY2VEZXNjID0gRGVzY3JpcHRpb25UZXN0VXRpbHMyLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZXJ2aWNlRGVzYzEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZS5jbGFzcywgZGJjSW5TZXJ2aWNlRGVzYy5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSk7Ci0KLSAgICAgICAgICAgIC8vIFdTREwgd2FzIHNwZWNpZmllZCBvbiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgY29uc3RydWN0b3IsIGFuZCBub25lIGluIHRoZSBjb21wb3NpdGUKLSAgICAgICAgICAgIC8vIHNvIHNob3VsZCBnZXQgdGhlIFdTREwgc3BlY2lmaWVkIG9uIHRoZSBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UxLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgV1NETCB1c2VkIiwgdmFsaWRhdGVQb3J0KHNlcnZpY2UyLCBvdGhlcldzZGxfcG9ydExvY2FsUGFydCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCk7Ci0gICAgICAgIH0gICAgICAgIAotCi0gICAgfQotICAgIAotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIFV0aWxpdHkgbWV0aG9kcwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyoqCi0gICAgICogUHJlcGVuZHMgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCB0aGUgcGF0aCB3aGVyZSB0aGUgdGVzdCBXU0RMIGxpdmVzIHRvIGEgZmlsZW5hbWUuCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbihTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOwotICAgICAgICBTdHJpbmcgYmFzZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKTsKLSAgICAgICAgd3NkbExvY2F0aW9uID0gYmFzZURpciArICIvdGVzdC1yZXNvdXJjZXMvd3NkbC8iICsgd3NkbEZpbGVOYW1lOwotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQcmVwZW5kcyB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSBwYXRoIHdoZXJlIHRoZSB0ZXN0IENhdGFsb2cgbGl2ZXMgdG8gYSBmaWxlbmFtZS4KLSAgICAgKiBAcGFyYW0gY2F0YWxvZ0ZpbGVOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKFN0cmluZyBjYXRhbG9nRmlsZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBiYXNlRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpOwotICAgICAgICB3c2RsTG9jYXRpb24gPSBiYXNlRGlyICsgIi90ZXN0LXJlc291cmNlcy9jYXRhbG9nLyIgKyBjYXRhbG9nRmlsZU5hbWU7Ci0gICAgICAgIHJldHVybiBjYXRhbG9nRmlsZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdpdmVuIGEgc2ltcGxlIGZpbGUgbmFtZSAod2l0aCBubyBiYXNlIGRpY3Rvcnkgb3IgcGF0aCksIHJldHVybnMgYSBVUkwgdG8gdGhlIFdTREwgZmlsZQotICAgICAqIHdpdGggdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCBwYXRoIHByZXBlbmRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gd3NkbEZpbGVOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBVUkwgZ2V0V3NkbFVSTChTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0V3NkbExvY2F0aW9uKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBjb252ZXJ0aW5nIFdTREwgZmlsZSB0byBVUkw6ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQgdGhlIFNlcnZpY2UgY29udGFpbnMgdGhlIGV4cGVjdGVkIHBvcnQuICBJZiB0aGUgcG9ydExvY2FsUGFydCBpcyBudWxsIHRoZW4KLSAgICAgKiBubyBwb3J0cyBhcmUgZXhwZWN0ZWQgdG8gZXhpc3QgdW5kZXIgdGhlIHNlcnZpY2UuICAKLSAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSB0byBjaGVjayBmb3IgdGhlIHNwZWNpZmllZCBwb3J0Ci0gICAgICogQHBhcmFtIHBvcnRMb2NhbFBhcnQgSWYgbnVsbCBtZWFucyBubyBwb3J0cyBhcmUgZXhwZWN0ZWQ7IG90aGVyd2lzZSB0aGUgbG9jYWxuYW1lIG9mIHRoZQotICAgICAqICAgIHNpbmdsZSBwb3J0IGV4cGVjdGVkIHVuZGVyIHRoZSBzZXJ2aWNlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlUG9ydChTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBwb3J0TG9jYWxQYXJ0KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRWFjaCBzZXJ2aWNlIGluIHRoZSBXU0RMcyBmb3IgdGhpcyB0ZXN0IGhhdmUgYSBzaW5nbGUgcG9ydAotICAgICAgICBib29sZWFuIHBvcnROYW1lVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGV4cGVjdGVkTnVtYmVyT2ZQb3J0cyA9IDE7ICAKLSAgICAgICAgaW50IG51bWJlck9mUG9ydHMgPSAwOwotICAgICAgICAKLSAgICAgICAgSXRlcmF0b3I8UU5hbWU+IHBvcnRJdGVyYXRvciA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgd2hpbGUgKHBvcnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG51bWJlck9mUG9ydHMrKzsKLSAgICAgICAgICAgIFFOYW1lIGNoZWNrUG9ydCA9IHBvcnRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGZvdW5kIGEgbWF0Y2ggZm9yIHRoZSBwb3J0IHlldCwgc2VlIGlmIHRoaXMgb25lIG1hdGNoZXMKLSAgICAgICAgICAgIGlmICghcG9ydE5hbWVWYWxpZCkgewotICAgICAgICAgICAgICAgIHBvcnROYW1lVmFsaWQgPSBwb3J0TG9jYWxQYXJ0LmVxdWFscyhjaGVja1BvcnQuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwb3J0TG9jYWxQYXJ0ID09IG51bGwgJiYgbnVtYmVyT2ZQb3J0cyA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBObyBwb3J0cyBleHBlY3RlZCAoaS5lLiBubyBXU0RMIHNob3VsZCBoYXZlIGJlZW4gdXNlZCkKLSAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChleHBlY3RlZE51bWJlck9mUG9ydHMgPT0gbnVtYmVyT2ZQb3J0cykgJiYgcG9ydE5hbWVWYWxpZCkgewotICAgICAgICAgICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzVmFsaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kcyB0byBpbnN0YWxsIGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gZmFjdG9yeSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBzYW1lIEF4aXNDb25maWd1cmF0aW9uCi0gICAgICogZWFjaCB0aW1lLiAgVGhpcyBpcyB1c2VkIHNvIHRoYXQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbnMgd2lsbCBiZSBjYWNoZWQgaW4gdGhlIERlc2NyaXB0aW9uRmFjdG9yeS4KLSAgICAgKiAKLSAgICAgKiBJTVBPUlRBTlQhISEKLSAgICAgKiBJZiB5b3UgaW5zdGFsbCBhIGNhY2hpbmcgZmFjdG9yeSwgeW91IE1VU1QgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZmFjdG9yeSBiZWZvcmUgeW91ciB0ZXN0Ci0gICAgICogZXhpdHMsIG90aGVyd2lzZSBpdCB3aWxsIHJlbWFpbiBpbnN0YWxsZWQgd2hlbiBzdWJzZXF1ZW50IHRlc3RzIHJ1biBhbmQgY2F1c2UgUkVBTExZIFNUUkFOR0UKLSAgICAgKiBmYWlsdXJlcy4gIFVzZSByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCkgSU5TSURFIEEgZmluYWxseSgpIGJsb2NrIHRvIHJlc3RvcmUgdGhlIGZhY3RvcnkuCi0gICAgICovCi0gICAgc3RhdGljIHByaXZhdGUgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnkgb3JpZ2luYWxGYWN0b3J5ID0gbnVsbDsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbENhY2hpbmdGYWN0b3J5KCkgewotICAgICAgICAvLyBpbnN0YWxsIGNhY2hpbmcgZmFjdG9yeQotICAgICAgICBpZiAob3JpZ2luYWxGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXR0ZW1wdCB0byBpbnN0YWxsIHRoZSBjYWNoaW5nIGZhY3Rvcnkgd2hlbiB0aGUgb3JpZ2luYWwgZmFjdG9yeSBoYXMgYWxyZWFkeSBiZWVuIG92ZXJ3cml0dGVuIik7Ci0gICAgICAgIH0KLSAgICAgICAgb3JpZ2luYWxGYWN0b3J5ID0gCi0gICAgICAgICAgICAoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkpTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIE1ldGFkYXRhVGVzdENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSBuZXdGYWN0b3J5ID0gbmV3IE1ldGFkYXRhVGVzdENhY2hpbmdDbGllbnRDb250ZXh0RmFjdG9yeSgpOwotICAgICAgICBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5zZXRGYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLCBuZXdGYWN0b3J5KTsKLSAgICAgICAgcmVzZXRDbGllbnRDb25maWdGYWN0b3J5KCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXN0b3JlT3JpZ2luYWxGYWN0b3J5KCkgewotICAgICAgICBpZiAob3JpZ2luYWxGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXR0ZW1wdCB0byByZXN0b3JlIG9yaWdpbmFsIGZhY3RvcnkgdG8gYSBudWxsIHZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgb3JpZ2luYWxGYWN0b3J5KTsKLSAgICAgICAgcmVzZXRDbGllbnRDb25maWdGYWN0b3J5KCk7Ci0gICAgICAgIG9yaWdpbmFsRmFjdG9yeSA9IG51bGw7Ci0gICAgfQotICAgIHN0YXRpYyB2b2lkIHJlc2V0Q2xpZW50Q29uZmlnRmFjdG9yeSgpIHsKLS8vICAgICAgICBGaWVsZCBmaWVsZDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBmaWVsZCA9IERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiY2xpZW50Q29uZmlnRmFjdG9yeSIpOwotLy8gICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotLy8gICAgICAgICAgICBmaWVsZC5zZXQobnVsbCwgbnVsbCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzZXQgY2xpZW50IGNvbmZpZyBmYWN0b3J5OyBjYXVnaHQgIiArIGUpOwotLy8gICAgICAgIH0KLSAgICB9Ci0gICAgCi19Ci0KLUBXZWJTZXJ2aWNlQ2xpZW50KHRhcmdldE5hbWVzcGFjZT0ib3JpZ2luYWxUTlMiLCB3c2RsTG9jYXRpb249Q2xpZW50TWV0YWRhdGFUZXN0Lm9yaWdpbmFsV3NkbCkKLWNsYXNzIENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsKLSAgICBwdWJsaWMgQ2xpZW50TWV0YWRhdGFHZW5lcmF0ZWRTZXJ2aWNlKCkgewotICAgICAgICBzdXBlcihDbGllbnRNZXRhZGF0YVRlc3QuZ2V0V3NkbFVSTChDbGllbnRNZXRhZGF0YVRlc3Qub3JpZ2luYWxXc2RsKSwKLSAgICAgICAgICAgICAgbmV3IFFOYW1lKENsaWVudE1ldGFkYXRhVGVzdC5uYW1lc3BhY2VVUkksIENsaWVudE1ldGFkYXRhVGVzdC5zdmNMb2NhbFBhcnQpKTsKLSAgICB9Ci0gICAgcHVibGljIENsaWVudE1ldGFkYXRhR2VuZXJhdGVkU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci19Ci0KLQotY2xhc3MgTWV0YWRhdGFUZXN0Q2FjaGluZ0NsaWVudENvbnRleHRGYWN0b3J5IGV4dGVuZHMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgewotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQ7Ci0gICAgCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldENsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gc3VwZXIuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgdmVyc2lvbiBvZiBNZXRhZGF0YVRlc3RDYWNoaW5nQ2xpZW50Q29udGV4dEZhY3Rvcnk6ICIgKyBjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjb250ZXh0ID0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1NhbXBsZS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9TYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwYjg4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL1NhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNwaTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1AV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZXN0IiwKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lPSJUZXN0U2VydmljZSIsCi0gICAgICAgICAgICBwb3J0TmFtZT0iVGVzdFBvcnQiKQotcHVibGljIGludGVyZmFjZSBTYW1wbGUgewotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZWNob1N0cmluZyhTdHJpbmcgaW5wdXQpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlMb2dpY2FsSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0R1bW15TG9naWNhbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzY2Q5Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlMb2dpY2FsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgRHVtbXlMb2dpY2FsSGFuZGxlciBpbXBsZW1lbnRzIExvZ2ljYWxIYW5kbGVyPExvZ2ljYWxNZXNzYWdlQ29udGV4dD4gew0KLSAgICANCi0gICAgQFBvc3RDb25zdHJ1Y3QNCi0gICAgcHVibGljIHZvaWQgc2V0dXAoKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkBQb3N0Q29uc3RydWN0IG1ldGhvZCBpbnZva2VkLiIpOw0KLSAgICB9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTG9naWNhbE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KExvZ2ljYWxNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlTT0FQSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NwaS9oYW5kbGVyL0R1bW15U09BUEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZhMDVhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvRHVtbXlTT0FQSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBEdW1teVNPQVBIYW5kbGVyIGltcGxlbWVudHMgU09BUEhhbmRsZXI8U09BUE1lc3NhZ2VDb250ZXh0PiB7DQotDQotCXB1YmxpYyBTZXQgZ2V0SGVhZGVycygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoU09BUE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhbmRsZUZhdWx0KFNPQVBNZXNzYWdlQ29udGV4dCBtZXNzYWdlY29udGV4dCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2Vjb250ZXh0KXsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc3BpL2hhbmRsZXIvSGFuZGxlclJlc29sdmVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmViNGFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zcGkvaGFuZGxlci9IYW5kbGVyUmVzb2x2ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zcGkuaGFuZGxlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5IYW5kbGVyUmVzb2x2ZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlclJlc29sdmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIHRlc3RSZXNvdXJjZURpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlclJlc29sdmVyKCkgew0KLSAgICAgICAgU3RyaW5nIHBhdGggPSAiL2NvbmZpZ3VyYXRpb24vaGFuZGxlcnMvaGFuZGxlci54bWwiOw0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodGVzdFJlc291cmNlRGlyLCBwYXRoKTsNCi0gICAgICAgIEhhbmRsZXJSZXNvbHZlciByZXNvbHZlciA9IG5ldyBIYW5kbGVyUmVzb2x2ZXJJbXBsKGZpbGUpOw0KLSAgICAgICAgUG9ydEluZm8gcGkgPSBuZXcgRHVtbXlQb3J0SW5mbygpOw0KLSAgICAgICAgTGlzdDxIYW5kbGVyPiBsaXN0ID0gcmVzb2x2ZXIuZ2V0SGFuZGxlckNoYWluKHBpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBjbGFzcyBEdW1teVBvcnRJbmZvIGltcGxlbWVudHMgUG9ydEluZm8gew0KLQ0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSUQoKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0TmFtZSgpIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvdGVzdC9uYW1lc3BhY2UiLCAiRHVtbXlQb3J0Iik7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5hcGFjaGUub3JnL3Rlc3QvbmFtZXNwYWNlIiwgIkR1bW15U2VydmljZSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9UZXN0TG9nZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvVGVzdExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY0ZDJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9UZXN0TG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFRlc3RMb2dnZXIgewotICAgIC8vIEp1c3QgYSBwbGFjZWhvbGRlciBmb3IgdGhpcyBzaGFyZWQgbG9nZ2VyIG9iamVjdAotICAgIHB1YmxpYyBzdGF0aWMgTG9nIGxvZ2dlciA9IExvZ0ZhY3RvcnkuZ2V0TG9nKCJKQVhXUy1UZXN0cyIpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNoby5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJmNDE4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZWNobyBjb21wbGV4IHR5cGUuDQotICogDQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvIiwgcHJvcE9yZGVyID0gew0KLSAgICAidGV4dCINCi19KQ0KLXB1YmxpYyBjbGFzcyBFY2hvIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybg0KLSAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICogICAgIA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIHRleHQ7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHZhbHVlDQotICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9FY2hvUG9ydC5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkN2EyMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9FY2hvUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC1iMjYtZWEzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9Qb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG9Qb3J0IHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gdGV4dA0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIkVjaG8iLCBhY3Rpb24gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIpDQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiRWNobyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG8iKQ0KLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJFY2hvUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKA0KLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidGV4dCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkNCi0gICAgICAgIEhvbGRlcjxTdHJpbmc+IHRleHQpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9FY2hvUmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9SZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTgyZmRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9SZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotDQotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvUmVzcG9uc2UgY29tcGxleCB0eXBlLg0KLSAqIA0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogDQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKiANCi0gKiANCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJlY2hvUmVzcG9uc2UiLCBwcm9wT3JkZXIgPSB7DQotICAgICJ0ZXh0Ig0KLX0pDQotcHVibGljIGNsYXNzIEVjaG9SZXNwb25zZSB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcw0KLSAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqICAgICANCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSB2YWx1ZQ0KLSAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMNCi0gICAgICogICAgIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKiAgICAgDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjlmODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZCBieSB0aGUgSkFYV1MgU0kuDQotICogSkFYLVdTIFJJIDIuMC1iMjYtZWEzDQotICogR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjANCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZUNsaWVudChuYW1lID0gIkVjaG9TZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UNCi0gICAgZXh0ZW5kcyBTZXJ2aWNlDQotew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgV1NETF9MT0NBVElPTjsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgRUNIT1NFUlZJQ0UgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9TZXJ2aWNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIEVDSE9QT1JUID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvUG9ydCIpOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L0M6L3dvcmsvYXBwcy9lY2xpcHNlL3dvcmtzcGFjZS9heGlzMi1saXZlL21vZHVsZXMvamF4d3MvdGVzdC1yZXNvdXJjZXMvd3NkbC9XU0RMVGVzdHMud3NkbCIpOw0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgV1NETF9MT0NBVElPTiA9IHVybDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFY2hvU2VydmljZSgpIHsNCi0gICAgICAgIHN1cGVyKFdTRExfTE9DQVRJT04sIEVDSE9TRVJWSUNFKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqIEByZXR1cm4NCi0gICAgICogICAgIHJldHVybnMgRWNob1BvcnQNCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9Qb3J0IikNCi0gICAgcHVibGljIEVjaG9Qb3J0IGdldEVjaG9Qb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIChFY2hvUG9ydClzdXBlci5nZXRQb3J0KEVDSE9QT1JULCBFY2hvUG9ydC5jbGFzcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzZlMGZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL0VjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotDQotLyoqDQotICogDQotICovDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2UiLCBlbmRwb2ludEludGVyZmFjZT0icmcuYXBhY2hlLmF4aXMyLmpheHdzLnVuaXRUZXN0LmVjaG8uRWNob1BvcnQiKQ0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZUltcGxXaXRoU0VJIHsNCi0gICAgLy8gVE9ETzogVGVzdCBhbGwgY29uZGl0aW9ucyBpbiBKU1ItMTgxIHNwZWMgU2VjIDMuMSBwMTMNCi0gICAgcHVibGljIHZvaWQgZWNobyhIb2xkZXI8U3RyaW5nPiB0ZXh0KSB7DQotICAgICAgICB0ZXh0LnZhbHVlID0gIkVjaG8gIiArIHRleHQudmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjc1MWRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91bml0VGVzdC9lY2hvL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLQ0KLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2w7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotDQotLyoqDQotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIA0KLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzIHBhY2thZ2UuIA0KLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgDQotICogY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24gDQotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgDQotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIA0KLSAqIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBvZiBzY2hlbWEgDQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIA0KLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgDQotICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4NCi0gKiANCi0gKi8NCi1AWG1sUmVnaXN0cnkNCi1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9FY2hvUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwgIkVjaG9SZXNwb25zZSIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfRWNob19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNobyIpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNob1Jlc3BvbnNlIH0NCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgRWNob1Jlc3BvbnNlIGNyZWF0ZUVjaG9SZXNwb25zZSgpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNob1Jlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWNobyB9DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgcHVibGljIEVjaG8gY3JlYXRlRWNobygpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNobygpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNob1Jlc3BvbnNlIH17QGNvZGUgPn19DQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIG5hbWUgPSAiRWNob1Jlc3BvbnNlIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEVjaG9SZXNwb25zZT4gY3JlYXRlRWNob1Jlc3BvbnNlKEVjaG9SZXNwb25zZSB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxFY2hvUmVzcG9uc2U+KF9FY2hvUmVzcG9uc2VfUU5BTUUsIEVjaG9SZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNobyB9e0Bjb2RlID59fQ0KLSAgICAgKiANCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBuYW1lID0gIkVjaG8iKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8RWNobz4gY3JlYXRlRWNobyhFY2hvIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEVjaG8+KF9FY2hvX1FOQU1FLCBFY2hvLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3VuaXRUZXN0L2VjaG8vcGFja2FnZS1pbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzYzJhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdW5pdFRlc3QvZWNoby9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIikNCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudW5pdFRlc3QuZWNobzsNCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbGl0eVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9BdHRhY2htZW50VXRpbGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTJmNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvQXR0YWNobWVudFV0aWxpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFV0aWxpdHlUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVEaWZmZXJlbnRJbWFnZXMoKXsNCi0JCXRyeXsNCi0JCQlTdHJpbmcgaW1nMVBhdGggPSAiL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMS5qcGVnIjsNCi0JCQlTdHJpbmcgaW1nMlBhdGggPSAiL3Rlc3QtcmVzb3VyY2VzL2ltYWdlL2ltYWdlMi5qcGVnIjsNCi0JCQkNCi0JCQlTdHJpbmcgaW1nMUZpbGVQYXRoID0gZ2V0QWJzb2x1dGVMb2NhdGlvbigpK2ltZzFQYXRoOw0KLQkJCVN0cmluZyBpbWcyRmlsZVBhdGggPSBnZXRBYnNvbHV0ZUxvY2F0aW9uKCkraW1nMlBhdGg7DQotCQkJDQotCQkJRmlsZSBpbWcxRmlsZSA9IG5ldyBGaWxlKGltZzFGaWxlUGF0aCk7DQotCQkJRmlsZSBpbWcyRmlsZSA9IG5ldyBGaWxlKGltZzJGaWxlUGF0aCk7DQotCQkJSW1hZ2UgaW1nMT1JbWFnZUlPLnJlYWQoaW1nMUZpbGUpIDsNCi0JCQlJbWFnZSBpbWcyPSBJbWFnZUlPLnJlYWQoaW1nMkZpbGUpOw0KLQkJCWFzc2VydEZhbHNlKEF0dGFjaG1lbnRVdGlscy5jb21wYXJlSW1hZ2VzKGltZzEsIGltZzIpKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlIENvbXBhcmVkIHN1Y2Nlc3NmdWxseSIpOw0KLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlIENvbXBhcmUgRmFpbGVkIik7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlmYWlsKCk7DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVTYW1lSW1hZ2VzKCl7DQotCQl0cnl7DQotCQkJU3RyaW5nIGltZzFQYXRoID0gIi90ZXN0LXJlc291cmNlcy9pbWFnZS9pbWFnZTEuanBlZyI7DQotCQkJU3RyaW5nIGltZzFGaWxlUGF0aCA9IGdldEFic29sdXRlTG9jYXRpb24oKStpbWcxUGF0aDsNCi0JCQkNCi0JCQlGaWxlIGltZzFGaWxlID0gbmV3IEZpbGUoaW1nMUZpbGVQYXRoKTsNCi0JCQlGaWxlIGltZzJGaWxlID0gbmV3IEZpbGUoaW1nMUZpbGVQYXRoKTsNCi0JCQkNCi0JCQlJbWFnZSBpbWcxPUltYWdlSU8ucmVhZChpbWcxRmlsZSkgOw0KLQkJCUltYWdlIGltZzI9IEltYWdlSU8ucmVhZChpbWcyRmlsZSk7DQotCQkJDQotCQkJYXNzZXJ0VHJ1ZShBdHRhY2htZW50VXRpbHMuY29tcGFyZUltYWdlcyhpbWcxLCBpbWcxKSk7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbWFnZSBDb21wYXJlZCBzdWNjZXNzZnVsbHkiKTsNCi0JCX1jYXRjaChFeGNlcHRpb24gZSl7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltYWdlIENvbXBhcmUgRmFpbGVkIik7DQotCQkJZmFpbCgpOw0KLQkJfQ0KLQl9DQotCXByaXZhdGUgU3RyaW5nIGdldEFic29sdXRlTG9jYXRpb24oKXsNCi0JCQ0KLQkJcmV0dXJuIG5ldyBGaWxlKCIiKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9JbnZva2VBY3Rpb24uamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0ludm9rZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdlODRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0ludm9rZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgaW52b2tlQWN0aW9uIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iaW52b2tlQWN0aW9uIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJhcmcwIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gImludm9rZUFjdGlvbiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vdXRpbGl0eS5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJhcmcwIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgSW52b2tlQWN0aW9uIHsNCi0NCi0gICAgQFhtbEVsZW1lbnRSZWYobmFtZSA9ICJhcmcwIiwgdHlwZSA9IEpBWEJFbGVtZW50LmNsYXNzKQ0KLSAgICBwcm90ZWN0ZWQgSkFYQkVsZW1lbnQ8Ynl0ZVtdPiBhcmcwOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFyZzAgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgYnl0ZVtdfXtAY29kZSA+fQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEpBWEJFbGVtZW50PGJ5dGVbXT4gZ2V0QXJnMCgpIHsNCi0gICAgICAgIHJldHVybiBhcmcwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYXJnMCBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBieXRlW119e0Bjb2RlID59DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmcwKEpBWEJFbGVtZW50PGJ5dGVbXT4gdmFsdWUpIHsNCi0gICAgICAgIHRoaXMuYXJnMCA9ICgoSkFYQkVsZW1lbnQ8Ynl0ZVtdPikgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0phdmFVdGlsc1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9KYXZhVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQzNjBkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L0phdmFVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhlIHV0aWxpdHkgbWV0aG9kcyBpbiB0aGUgSmF2YVV0aWxzIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoYXQgc3BhY2VzIGluIHRoZSBzdHJpbmcgY2FuIGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gY29udmVydGluZyB0byBhIFVSSS4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVVSSV9zcGFjZXMoKSB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGF0aFdpdGhTcGFjZXMgPSAiZmlsZTovRjovUHJvZ3JhbSBGaWxlcy9NeUFwcFNlcnZlci9pbnN0YWxsZWRBcHBzL015RWFyLmVhci9NeVdhci53YXIvV0VCLUlORi93c2RsL015V1NETC53c2RsIjsKLSAgICAgICAgCi0gICAgICAgIFVSSSB1cmkgPSBKYXZhVXRpbHMuY3JlYXRlVVJJKHBhdGhXaXRoU3BhY2VzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1cmkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG51bGwgYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0cnlpbmcgdG8gY29udmVydCB0byBhIFVSSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVVJJX2ludmFsaWQoKSB7Ci0gICAgICAgIAotICAgICAgICBVUkkgdXJpID0gSmF2YVV0aWxzLmNyZWF0ZVVSSShudWxsKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh1cmkpOwotICAgICAgICAKLSAgICAgICAgVVJJIHVyaTIgPSBKYXZhVXRpbHMuY3JlYXRlVVJJKCIiKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh1cmkyKTsKLSAgICAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9Qcm9wZXJ0eURlc2NyaXB0b3JQbHVzVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1Byb3BlcnR5RGVzY3JpcHRvclBsdXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJjMzZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsaXR5L1Byb3BlcnR5RGVzY3JpcHRvclBsdXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsaXR5Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLmJlYW5zLkJlYW5JbmZvOw0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsNCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotDQotcHVibGljIGNsYXNzIFByb3BlcnR5RGVzY3JpcHRvclBsdXNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBJbnZva2VBY3Rpb24gb2JqZWN0ID0gbmV3IEludm9rZUFjdGlvbigpOw0KLQ0KLSAgICAgICAgQmVhbkluZm8gc3RydWN0QmVhbkluZm8gPSBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8oSW52b2tlQWN0aW9uLmNsYXNzKTsNCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gc3RydWN0QmVhbkluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9ycyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZGVzY3JpcHRvcnMubGVuZ3RoLCAyKTsNCi0NCi0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKCIiLCAiYXJnczAiKTsNCi0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBudWxsOw0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgew0KLSAgICAgICAgICAgIGlmKGRlc2NyaXB0b3JzW2ldLmdldE5hbWUoKS5lcXVhbHMoImFyZzAiKSl7DQotICAgICAgICAgICAgICAgIHByb3BlcnR5RGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2ldOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnROb3ROdWxsKHByb3BlcnR5RGVzY3JpcHRvcik7DQotICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3JQbHVzIHBsdXMgPSBuZXcgUHJvcGVydHlEZXNjcmlwdG9yUGx1cyhwcm9wZXJ0eURlc2NyaXB0b3IsIHFOYW1lKTsNCi0gICAgICAgIGJ5dGVbXSB0ZXN0VmFsdWUgPSB7MHhkLCAweGUsIDB4YSwgMHhkLCAweGIsIDB4ZSwgMHhlLCAweGZ9Ow0KLSAgICAgICAgcGx1cy5zZXQob2JqZWN0LCB0ZXN0VmFsdWUsIG51bGwpOw0KLQ0KLSAgICAgICAgSkFYQkVsZW1lbnQ8Ynl0ZVtdPiBhcmcwID0gb2JqZWN0LmdldEFyZzAoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhhcmcwLmdldERlY2xhcmVkVHlwZSgpLCBieXRlW10uY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFyZzAuZ2V0TmFtZSgpLCBxTmFtZSk7DQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHModGVzdFZhbHVlLCBhcmcwLmdldFZhbHVlKCkpKTsNCi0NCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHBsdXMuZ2V0KG9iamVjdCk7DQotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUuZ2V0Q2xhc3MoKSwgYnl0ZVtdLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0VmFsdWUsIChieXRlW10pIHZhbHVlKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWxpdHkvV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlclRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNTE1Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbGl0eS9XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbGl0eTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5XZWJTZXJ2aWNlRXhjZXB0aW9uTG9nZ2VyOw0KLQ0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotDQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsNCi1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFZhbGlkYXRlIHRoZSBGYWlsdXJlTG9nZ2VyIHV0aWxpdHkNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4Y2VwdGlvbkxvZ2dlclRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICAvKioNCi0gICAgICogVmFsaWRhdGUgRmFpbHVyZUxvZ2dlci5nZXRDaGVja2VkRXhjZXB0aW9uIG1ldGhvZA0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgTWV0aG9kIG0gPSBTYW1wbGUuY2xhc3MuZ2V0TWV0aG9kKCJtIiwgbmV3IENsYXNzW10ge30pOw0KLSAgICAgICAgDQotICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBFeGNlcHRpb25BKCk7DQotICAgICAgICBDbGFzcyBjaGVja2VkRXhjZXB0aW9uID0gSmF2YVV0aWxzLmdldENoZWNrZWRFeGNlcHRpb24odCwgbSk7ICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKEV4Y2VwdGlvbkEuY2xhc3MuZXF1YWxzKGNoZWNrZWRFeGNlcHRpb24pKTsNCi0gICAgICAgIA0KLSAgICAgICAgdCA9IG5ldyBFeGNlcHRpb25CKCk7DQotICAgICAgICBjaGVja2VkRXhjZXB0aW9uID0gSmF2YVV0aWxzLmdldENoZWNrZWRFeGNlcHRpb24odCwgbSk7IA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShFeGNlcHRpb25CLmNsYXNzLmVxdWFscyhjaGVja2VkRXhjZXB0aW9uKSk7DQotICAgICAgICANCi0gICAgICAgIHQgPSBuZXcgRXhjZXB0aW9uQygpOw0KLSAgICAgICAgY2hlY2tlZEV4Y2VwdGlvbiA9IEphdmFVdGlscy5nZXRDaGVja2VkRXhjZXB0aW9uKHQsIG0pOyANCi0gICAgICAgIGFzc2VydFRydWUoRXhjZXB0aW9uQi5jbGFzcy5lcXVhbHMoY2hlY2tlZEV4Y2VwdGlvbikpOw0KLSAgICAgICAgDQotICAgICAgICB0ID0gbmV3IEV4Y2VwdGlvbkQoKTsNCi0gICAgICAgIGNoZWNrZWRFeGNlcHRpb24gPSBKYXZhVXRpbHMuZ2V0Q2hlY2tlZEV4Y2VwdGlvbih0LCBtKTsgDQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrZWRFeGNlcHRpb24gPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIHQgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCi0gICAgICAgIGNoZWNrZWRFeGNlcHRpb24gPSBKYXZhVXRpbHMuZ2V0Q2hlY2tlZEV4Y2VwdGlvbih0LCBtKTsgDQotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrZWRFeGNlcHRpb24gPT0gbnVsbCk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgY2xhc3MgU2FtcGxlIHsNCi0gICAgICAgIHB1YmxpYyB2b2lkIG0oKSB0aHJvd3MgRXhjZXB0aW9uQSwgRXhjZXB0aW9uQiB7fQ0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBFeGNlcHRpb25BIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBFeGNlcHRpb25CIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBjbGFzcyBFeGNlcHRpb25DIGV4dGVuZHMgRXhjZXB0aW9uQiB7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgY2xhc3MgRXhjZXB0aW9uRCBleHRlbmRzIEV4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9zY2hlbWFyZWFkZXIvU2NoZW1hUmVhZGVyVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL3NjaGVtYXJlYWRlci9TY2hlbWFSZWFkZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE0Y2IxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL3NjaGVtYXJlYWRlci9TY2hlbWFSZWFkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuc2NoZW1hcmVhZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51bml0VGVzdC5UZXN0TG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbC5pbXBsLlNjaGVtYVJlYWRlckltcGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFNjaGVtYVJlYWRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWFSZWFkZXIoKXsKLQkJU2NoZW1hUmVhZGVySW1wbCBzcmkgPSBuZXcgU2NoZW1hUmVhZGVySW1wbCgpOwotCQkKLQkgICAgU3RyaW5nIHdzZGxMb2NhdGlvbj0iL3Rlc3QtcmVzb3VyY2VzL3dzZGwvc2hhcGVzLndzZGwiOwotCSAgICBVUkwgdXJsID0gbnVsbDsKLQkgICAgdHJ5IHsKLQkgICAgCXRyeXsKLQkgICAgICAgIAlTdHJpbmcgYmFzZURpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCSAgICAgICAgCXdzZGxMb2NhdGlvbiA9IG5ldyBGaWxlKGJhc2VEaXIgKyB3c2RsTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAJCWZhaWwoKTsKLSAgICAgICAgCX0KLQkgICAgICAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxMb2NhdGlvbik7Ci0JICAgICAgIAl1cmwgPSBmaWxlLnRvVVJMKCk7Ci0JICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgICAgZmFpbCgpOwotCSAgICB9Ci0JICAgIHRyeXsKLQkgICAgCVdTREw0SldyYXBwZXIgdzRqID0gbmV3IFdTREw0SldyYXBwZXIodXJsKTsKLQkgICAgCURlZmluaXRpb24gd3NkbERlZiA9IHc0ai5nZXREZWZpbml0aW9uKCk7Ci0JICAgIAlhc3NlcnROb3ROdWxsKHdzZGxEZWYpOwotCSAgICAJU2V0PFN0cmluZz4gcGtnID0gc3JpLnJlYWRQYWNrYWdlc0Zyb21TY2hlbWEod3NkbERlZik7Ci0gICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiUGFja2FnZXM6Iik7Ci0JICAgIAlmb3IoU3RyaW5nIHBrZ05hbWU6cGtnKXsKLSAgICAgICAgICAgICAgICBUZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1Zyhwa2dOYW1lKTsKLQkgICAgCX0KLQkgICAgfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgIAlmYWlsKCk7Ci0JICAgIH0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGExLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3M2ZmNjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9CYWREYXRhMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhiLmE7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotDQotcHVibGljIGNsYXNzIEJhZERhdGExIHsNCi0gICAgcHVibGljIElucHV0U3RyZWFtIGlzOw0KLSAgICANCi0gICANCi0gICAgcHVibGljIEJhZERhdGExKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SXMoKSB7DQotICAgICAgICByZXR1cm4gaXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SXMoSW5wdXRTdHJlYW0gaXMpIHsNCi0gICAgICAgIHRoaXMuaXMgPSBpczsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGEyLmphdmEgYi8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0JhZERhdGEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmQxNzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9CYWREYXRhMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXhiLmE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF4Yi5iLkJhZERhdGEzOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBCYWREYXRhMiB7DQotICAgcHVibGljIEJhZERhdGEzIGRhdGEzOw0KLSAgIA0KLSAgIHB1YmxpYyBCYWREYXRhMigpIHsNCi0gICAgICAgc3VwZXIoKTsNCi0gICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTEuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjMmY1ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0RhdGExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheGIuYTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotLyoqDQotICogR29vZCBKQVhCIGVsZW1lbnQNCi0gKiBEYXRhMSBjb250YWlucyBKQVhCIGFubm90YXRpb25zLg0KLSAqIFJlZmVyZW5jZXMgRGF0YTINCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJkYXRhMSIsIG5hbWVzcGFjZT0idXJuOi8vamF4Yi5hIiwgcHJvcE9yZGVyID0gew0KLSAgICAidGV4dCIsICJkYXRhMiINCi19KQ0KLQ0KLXB1YmxpYyBjbGFzcyBEYXRhMSB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7DQotICAgIA0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIERhdGEyIGRhdGEyOw0KLQ0KLSAgICBwdWJsaWMgRGF0YTIgZ2V0RGF0YTIoKSB7DQotICAgICAgICByZXR1cm4gZGF0YTI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YTIoRGF0YTIgZGF0YTIpIHsNCi0gICAgICAgIHRoaXMuZGF0YTIgPSBkYXRhMjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB9DQotICAgIA0KLSAgICANCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9EYXRhMi5qYXZhIGIvMV81L21vZHVsZXMvamF4d3MvdGVzdC9vcmcvYXBhY2hlL3dzL2pheGIvYS9EYXRhMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZiMmU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUud3MuamF4Yi5hOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0vKioNCi0gKiBHb29kIEpBWEIgZWxlbWVudA0KLSAqIERhdGEyIGNvbnRhaW5zIEpBWEIgYW5ub3RhdGlvbnMuDQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZGF0YTIiLCBuYW1lc3BhY2U9InVybjovL2pheGIuYSIsIHByb3BPcmRlciA9IHsNCi0gICAgInRleHQiDQotfSkNCi1wdWJsaWMgY2xhc3MgRGF0YTIgew0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUsIG5pbGxhYmxlID0gdHJ1ZSkNCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0Ow0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2EvRGF0YTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkNjZiOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9hL0RhdGEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheGIuYTsNCi0NCi1wdWJsaWMgY2xhc3MgRGF0YTMgew0KLSAgICBwcml2YXRlIFN0cmluZyB0ZXh0Ow0KLSAgICANCi0gICAgcHVibGljIERhdGEzKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotICAgICAgICB0aGlzLnRleHQgPSB0ZXh0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2IvQmFkRGF0YTMuamF2YSBiLzFfNS9tb2R1bGVzL2pheHdzL3Rlc3Qvb3JnL2FwYWNoZS93cy9qYXhiL2IvQmFkRGF0YTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOWUzZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qYXh3cy90ZXN0L29yZy9hcGFjaGUvd3MvamF4Yi9iL0JhZERhdGEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLndzLmpheGIuYjsNCi0NCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQmFkRGF0YTMgew0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gaXM7DQotICAgIA0KLSAgICBwdWJsaWMgQmFkRGF0YTMoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJcygpIHsNCi0gICAgICAgIHJldHVybiBpczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJcyhJbnB1dFN0cmVhbSBpcykgew0KLSAgICAgICAgdGhpcy5pcyA9IGlzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL2ppYngvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzYjczOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWppYng8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSmlCWCBEYXRhIEJpbmRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkppQlggZGF0YSBiaW5kaW5nIHN1cHBvcnQgZm9yIEF4aXMgMi4wPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5qaWJ4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amlieC1iaW5kPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmppYng8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qaWJ4LXJ1bjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvamlieDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2ppYng8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2ppYng8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvbXBpbGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3MgdW5sZXNzPSJtYXZlbi50ZXN0LnNraXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5qaWJ4LmJpbmRpbmcuQ29tcGlsZSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249InRhcmdldC90ZXN0LWNsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy9iaW5kaW5nL2N1c3RvbWVyLWJpbmRpbmcueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0idGVzdC1yZXNvdXJjZXMvYmluZGluZy9saWJyYXJ5LWJpbmRpbmcueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW4tY3A8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3MgdW5sZXNzPSJtYXZlbi50ZXN0LnNraXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3AiIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtjcH0iIGZpbGU9InRhcmdldC9jcC50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEgYi8xXzUvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvQ29kZUdlbmVyYXRpb25VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmEyNTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0NvZGVHZW5lcmF0aW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLkppQlhFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkphdmFUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5NZXNzYWdlUGFydEluZm9ybWF0aW9uSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVBhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTaW1wbGVUeXBlUmVzdHJpY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuQmluZGluZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmppYnguYmluZGluZy5tb2RlbC5FbGVtZW50QmFzZTsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLkZvcm1hdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmppYnguYmluZGluZy5tb2RlbC5JbmNsdWRlRWxlbWVudDsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLk1hcHBpbmdFbGVtZW50QmFzZTsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLk1vZGVsVmlzaXRvcjsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLk5hbWVzcGFjZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmppYnguYmluZGluZy5tb2RlbC5WYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuamlieC5iaW5kaW5nLm1vZGVsLlZhbGlkYXRpb25Qcm9ibGVtOwotaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSmlCWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBGcmFtZXdvcmstbGlua2VkIGNvZGUgdXNlZCBieSBKaUJYIGRhdGEgYmluZGluZyBzdXBwb3J0LiBUaGlzIGlzIGFjY2Vzc2VkIHZpYSByZWZsZWN0aW9uIGZyb20gdGhlCi0gKiBKaUJYIGNvZGUgZ2VuZXJhdGlvbiBleHRlbnNpb24gd2hlbiBKaUJYIGRhdGEgYmluZGluZyBpcyBzZWxlY3RlZC4gSmlCWCB1c2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoCi0gKiB0byB1bndyYXBwaW5nIG1ldGhvZCBwYXJhbWV0ZXJzIGZyb20gdGhhdCBpbXBsZW1lbnRlZCBieSBBREIsIGFuZCBzaW5jZSB0aGUgQURCIHRlY2huaXF1ZSBpcwotICogYXNzdW1lZCBieSBhbGwgY29kZSBnZW5lcmF0aW9uIHRlbXBsYXRlcyB0aGlzIGhhcyB0byBjcmVhdGUgdGhlIHNhbWUgZGF0YSBzdHJ1Y3R1cmVzLiBUaGVzZSBkYXRhCi0gKiBzdHJ1Y3R1cmVzIGFyZSB1bmRvY3VtZW50ZWQsIGFuZCBjYW4gb25seSBiZSBkZXRlcm1pbmVkIGJ5IGdvaW5nIHRocm91Z2ggdGhlIHtAbGluawotICogb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlNjaGVtYVVud3JhcHBlckV4dGVuc2lvbn0gYW5kIHtAbGluawotICogb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZW1pdHRlci5BeGlzU2VydmljZUJhc2VkTXVsdGlMYW5ndWFnZUVtaXR0ZXJ9IGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlR2VuZXJhdGlvblV0aWxpdHkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZUdlbkNvbmZpZzsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hTZXQgc19wcmltaXRpdmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgc19wcmltaXRpdmVTZXQuYWRkKCJib29sZWFuIik7Ci0gICAgICAgIHNfcHJpbWl0aXZlU2V0LmFkZCgiYnl0ZSIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoImNoYXIiKTsKLSAgICAgICAgc19wcmltaXRpdmVTZXQuYWRkKCJkb3VibGUiKTsKLSAgICAgICAgc19wcmltaXRpdmVTZXQuYWRkKCJmbG9hdCIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoImludCIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoImxvbmciKTsKLSAgICAgICAgc19wcmltaXRpdmVTZXQuYWRkKCJzaG9ydCIpOwotICAgICAgICBzX3ByaW1pdGl2ZVNldC5hZGQoInZvaWQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHNfd3JhcHBlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBzX3dyYXBwZXJNYXAucHV0KCJib29sZWFuIiwgIkJvb2xlYW4iKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgiYnl0ZSIsICJCeXRlIik7Ci0gICAgICAgIHNfd3JhcHBlck1hcC5wdXQoImNoYXIiLCAiQ2hhcmFjdGVyIik7Ci0gICAgICAgIHNfd3JhcHBlck1hcC5wdXQoImRvdWJsZSIsICJEb3VibGUiKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgiZmxvYXQiLCAiRmxvYXQiKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgiaW50IiwgIkludGVnZXIiKTsKLSAgICAgICAgc193cmFwcGVyTWFwLnB1dCgibG9uZyIsICJMb25nIik7Ci0gICAgICAgIHNfd3JhcHBlck1hcC5wdXQoInNob3J0IiwgIlNob3J0Iik7Ci0gICAgfQotCi0gICAgLyoqIFJlc2VydmVkIHdvcmRzIGZvciBKYXZhIChrZXl3b3JkcyBhbmQgbGl0ZXJhbHMpLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQgc19yZXNlcnZlZFdvcmRzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIHN0YXRpYyB7Ci0KLSAgICAgICAgLy8ga2V5d29yZHMKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiYWJzdHJhY3QiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiYXNzZXJ0Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImJvb2xlYW4iKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiYnJlYWsiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiYnl0ZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJjYXNlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImNhdGNoIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImNoYXIiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiY2xhc3MiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiY29uc3QiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiY29udGludWUiKTsKLQotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJkZWZhdWx0Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImRvIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImRvdWJsZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJlbHNlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImVudW0iKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZXh0ZW5kcyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJmaW5hbCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJmaW5hbGx5Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImZsb2F0Iik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImZvciIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJnb3RvIik7Ci0KLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiaWYiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiaW1wbGVtZW50cyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJpbXBvcnQiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiaW5zdGFuY2VvZiIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJpbnQiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiaW50ZXJmYWNlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoImxvbmciKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgibmF0aXZlIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoIm5ldyIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJwYWNrYWdlIik7Ci0KLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgicHJpdmF0ZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJwcm90ZWN0ZWQiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgicHVibGljIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInJldHVybiIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJzaG9ydCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJzdGF0aWMiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgic3RyaWN0ZnAiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgic3VwZXIiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgic3dpdGNoIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInN5bmNocm9uaXplZCIpOwotCi0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInRoaXMiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidGhyb3ciKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidGhyb3dzIik7Ci0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInRyYW5zaWVudCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ0cnkiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidm9pZCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ2b2xhdGlsZSIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ3aGlsZSIpOwotCi0gICAgICAgIC8vIGxpdGVyYWxzCi0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInRydWUiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgiZmFsc2UiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgibnVsbCIpOwotCi0gICAgICAgIC8vIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgdGVtcGxhdGUgdW53cmFwcGVkIGNvZGUgZ2VuZXJhdGlvbgotICAgICAgICAvLyBUT0RPIGNoYW5nZSB0ZW1wbGF0ZXMgdG8gdXNlICR4eHggbmFtZXMsIGJsb2NrIGdlbmVyYXRpb24gZnJvbSBXU0RMCi0gICAgICAgIHNfcmVzZXJ2ZWRXb3Jkcy5hZGQoInRydWUiKTsKLSAgICAgICAgc19yZXNlcnZlZFdvcmRzLmFkZCgidWN0eCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJjaGlsZCIpOwotICAgICAgICBzX3Jlc2VydmVkV29yZHMuYWRkKCJ3cmFwcGVyIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnIGNvZGUgZ2VuZXJhdGlvbiBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIENvZGVHZW5lcmF0aW9uVXRpbGl0eShDb2RlR2VuQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgY29kZUdlbkNvbmZpZyA9IGNvbmZpZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgdGhlIGNvZGUgZ2VuZXJhdGlvbiBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycyBhbmQgV1NETC4gVGhpcyBmaXJzdCBnZXRzIHR5cGUKLSAgICAgKiBtYXBwaW5ncyBmcm9tIGJpbmRpbmcgZGVmaW5pdGlvbiwgdGhlbiBnb2VzIHRocm91Z2ggdGhlIG9wZXJhdGlvbnMgY2hlY2tpbmcgdGhlIGlucHV0IGFuZAotICAgICAqIG91dHB1dCBtZXNzYWdlcy4gSWYgdW53cmFwcGluZyBpcyBkaXNhYmxlZCB0aGUgbWVzc2FnZSBlbGVtZW50IG11c3QgYmUgaGFuZGxlZCBkaXJlY3RseSBieSBhCi0gICAgICogbWFwcGluZy4gSWYgdW53cmFwcGluZyBpcyBlbmFibGVkLCB0aGlzIGNoZWNrcyB0aGF0IHRoZSBtZXNzYWdlIGVsZW1lbnQgaXMgb2YgdGhlIHByb3BlciBmb3JtCi0gICAgICogKGEgc2VxdWVuY2Ugb2Ygb3RoZXIgZWxlbWVudHMsIHdoaWNoIGFsbCBoYXZlIG1heE9jY3Vycz0iMSIpLiBJdCB0aGVuIGdlbmVyYXRlcyBhbiB1bndyYXBwaW5nCi0gICAgICogZGVzY3JpcHRpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBjb25maWd1cmF0aW9uLCB3aGVyZSBpdCdsbCBiZSBwaWNrZWQgdXAgYW5kCi0gICAgICogaW5jbHVkZWQgaW4gdGhlIFhNTCBwYXNzZWQgdG8gY29kZSBnZW5lcmF0aW9uLiBUaGlzIGFsc28gY29uc3RydWN0cyBhIHR5cGUgbWFwcGluZywgc2luY2UKLSAgICAgKiB0aGF0J3MgcmVxdWlyZWQgYnkgdGhlIGJhc2UgQXhpczIgY29kZSBnZW5lcmF0aW9uLiBJbiB0aGUgY2FzZSBvZiB1bndyYXBwZWQgZWxlbWVudHMsIHRoZQotICAgICAqIHR5cGUgbWFwcGluZyBpbmNsdWRlcyBhIHN5bnRoZXNpemVkIHFuYW1lIGZvciBlYWNoIHVud3JhcHBlZCBwYXJhbWV0ZXIsIGFuZCB0aGUgZGV0YWlsZWQKLSAgICAgKiBpbmZvcm1hdGlvbiBpcyBzZXQgb24gdGhlIG1lc3NhZ2UgaW5mb3JtYXRpb24uIFNvdW5kIGNvbmZ1c2luZz8gV2VsY29tZSB0byBBeGlzMiBjb2RlCi0gICAgICogZ2VuZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIGJpbmRpbmcgcGF0aCAoPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2UoU3RyaW5nIHBhdGgpIHsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGJpbmRpbmcgZGVmaW5pdGlvbiBmaWxlIGlzIHByZXNlbnQsIGlmIHBhc3NlZAotICAgICAgICBGaWxlIGZpbGUgPSBudWxsOwotICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiamlieCBiaW5kaW5nIGRlZmluaXRpb24gZmlsZSAiICsgcGF0aCArICIgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gc2V0IGZsYWcgZm9yIHVud3JhcHBpbmcKLSAgICAgICAgICAgIGJvb2xlYW4gdW53cmFwID0gIWNvZGVHZW5Db25maWcuaXNQYXJhbWV0ZXJzV3JhcHBlZCgpOwotCi0gICAgICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBiaW5kaW5nIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBCaW5kaW5nRWxlbWVudCBiaW5kaW5nID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIHVud3JhcHBlZCBjYW4gYmUgdXNlZCB3aXRob3V0IGEgYmluZGluZywgYnV0IHdyYXBwZWQgcmVxdWlyZXMgb25lCi0gICAgICAgICAgICAgICAgaWYgKCF1bndyYXApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkppQlggd3JhcHBlZCBzdXBwb3J0IHJlcXVpcmVzIGEgYmluZGluZyBkZWZpbml0aW9uIHRvIGJlIHByb3ZpZGVkIHVzaW5nIHRoZSAtRSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmlCWEV4dGVuc2lvbi5CSU5ESU5HX1BBVEhfT1BUSU9OICsgIiB7ZmlsZS1wYXRofSBwYXJhbWV0ZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBKaUJYIGJpbmRpbmcgZGVmaW5pdGlvbiBpbnRvIG1lbW9yeS4gVGhlIGJpbmRpbmcgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgIC8vIGlzIG9ubHkgcHJldmFsaWRhdGVkIHNvIGFzIG5vdCB0byByZXF1aXJlIHRoZSB1c2VyIHRvIGhhdmUgYWxsCi0gICAgICAgICAgICAgICAgLy8gdGhlIHJlZmVyZW5jZWQgY2xhc3NlcyBpbiB0aGUgY2xhc3NwYXRoLCB0aG91Z2ggdGhpcyBkb2VzIG1ha2UgZm9yCi0gICAgICAgICAgICAgICAgLy8gYWRkZWQgd29yayBpbiBmaW5kaW5nIHRoZSBuYW1lc3BhY2VzLgotICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Db250ZXh0IHZjdHggPSBCaW5kaW5nRWxlbWVudC5uZXdWYWxpZGF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIGJpbmRpbmcgPSBCaW5kaW5nRWxlbWVudC5yZWFkQmluZGluZyhuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpLCBwYXRoLCB2Y3R4KTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nLnNldEJhc2VVcmwoZmlsZS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICB2Y3R4LnNldEJpbmRpbmdSb290KGJpbmRpbmcpOwotICAgICAgICAgICAgICAgIEluY2x1ZGVQcmV2YWxpZGF0aW9uVmlzaXRvciBpcHYgPSBuZXcgSW5jbHVkZVByZXZhbGlkYXRpb25WaXNpdG9yKHZjdHgpOwotICAgICAgICAgICAgICAgIHZjdHgudG91clRyZWUoYmluZGluZywgaXB2KTsKLSAgICAgICAgICAgICAgICBpZiAodmN0eC5nZXRFcnJvckNvdW50KCkgIT0gMCB8fCB2Y3R4LmdldEZhdGFsQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwcm9icyA9IHZjdHguZ2V0UHJvYmxlbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcnMgaW4gZ2VuZXJhdGVkIGJpbmRpbmc6Iik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcHJvYnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25Qcm9ibGVtIHByb2IgPSAoVmFsaWRhdGlvblByb2JsZW0pcHJvYnMuZ2V0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludChwcm9iLmdldFNldmVyaXR5KCkgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvblByb2JsZW0uRVJST1JfTEVWRUwgPyAiRXJyb3I6ICIgOiAiV2FybmluZzogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocHJvYi5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBqaWJ4IGJpbmRpbmcgZGVmaW5pdGlvbiBmaWxlICIgKyBwYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0YWJsZSB3aXRoIGFsbCBidWlsdC1pbiBmb3JtYXQgZGVmaW5pdGlvbnMKLSAgICAgICAgICAgIE1hcCBzaW1wbGVUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJieXRlIiwgImJ5dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVCeXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VCeXRlIiwgIjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJ1bnNpZ25lZFNob3J0IiwgImNoYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVDaGFyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VDaGFyIiwgIjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJkb3VibGUiLCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplRG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VEb3VibGUiLCAiMC4wIiwgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICBidWlsZEZvcm1hdCgiZmxvYXQiLCAiZmxvYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVGbG9hdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnBhcnNlRmxvYXQiLCAiMC4wIiwgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICBidWlsZEZvcm1hdCgiaW50IiwgImludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZUludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnBhcnNlSW50IiwgIjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJsb25nIiwgImxvbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVMb25nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VMb25nIiwgIjAiLCBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJzaG9ydCIsICJzaG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZVNob3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkucGFyc2VTaG9ydCIsICIwIiwgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICBidWlsZEZvcm1hdCgiYm9vbGVhbiIsICJib29sZWFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuc2VyaWFsaXplQm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnBhcnNlQm9vbGVhbiIsICJmYWxzZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJkYXRlVGltZSIsICJqYXZhLnV0aWwuRGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZURhdGVUaW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuZGVzZXJpYWxpemVEYXRlVGltZSIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTWFwKTsKLSAgICAgICAgICAgIGJ1aWxkRm9ybWF0KCJkYXRlIiwgImphdmEuc3FsLkRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5zZXJpYWxpemVTcWxEYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuamlieC5ydW50aW1lLlV0aWxpdHkuZGVzZXJpYWxpemVTcWxEYXRlIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoInRpbWUiLCAiamF2YS5zcWwuVGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZVNxbFRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5kZXNlcmlhbGl6ZVNxbFRpbWUiLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlVHlwZU1hcCk7Ci0gICAgICAgICAgICBidWlsZEZvcm1hdCgiYmFzZTY0QmluYXJ5IiwgImJ5dGVbXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LnNlcmlhbGl6ZUJhc2U2NCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmppYngucnVudGltZS5VdGlsaXR5LmRlc2VyaWFsaXplQmFzZTY0IiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgYnVpbGRGb3JtYXQoInN0cmluZyIsICJqYXZhLmxhbmcuU3RyaW5nIiwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVNYXApOwotCi0gICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCB0aGUgdG9wLWxldmVsIG1hcHBpbmcgYW5kIGZvcm1hdCBkZWZpbml0aW9ucwotICAgICAgICAgICAgTWFwIGVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgTWFwIGNvbXBsZXhUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIE1hcCBiaW5kaW5nTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb2xsZWN0VG9wTGV2ZWxDb21wb25lbnRzKGJpbmRpbmcsICIiLCBlbGVtZW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGVNYXAsIHNpbXBsZVR5cGVNYXAsIGJpbmRpbmdNYXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2xhc3NlcyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWJzdHJhY3QgbWFwcGluZ3MKLSAgICAgICAgICAgIGlmICh1bndyYXAgJiYgY29tcGxleFR5cGVNYXAuc2l6ZSgpID4gMCAmJiAoYmluZGluZyA9PSBudWxsIHx8ICFiaW5kaW5nLmlzRm9yY2VDbGFzc2VzKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAidW53cmFwcGVkIGJpbmRpbmcgbXVzdCB1c2UgZm9yY2UtY2xhc3Nlcz0ndHJ1ZScgb3B0aW9uIGluICIgKyBwYXRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZm9yY2Ugb2ZmIGluYXBwcm9wcmlhdGUgb3B0aW9uIChzZXQgYnkgZXJyb3IgaW4gb3B0aW9ucyBoYW5kbGluZykKLSAgICAgICAgICAgIGNvZGVHZW5Db25maWcuc2V0UGFja0NsYXNzZXMoZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBjb25maWd1cmUgaGFuZGxpbmcgZm9yIGFsbCBvcGVyYXRpb25zIG9mIHNlcnZpY2UKLSAgICAgICAgICAgIGNvZGVHZW5Db25maWcuc2V0VHlwZU1hcHBlcihuZXcgTmFtZWRQYXJhbWV0ZXJUeXBlTWFwcGVyKCkpOwotICAgICAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGNvZGVHZW5Db25maWcuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGludCBvcGluZGV4ID0gMDsKLSAgICAgICAgICAgIE1hcCB0eXBlTWFwcGVkQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgU3RyaW5nIG1hcHBlZGNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIFNldCBvYmppbnMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgU2V0IG9iam91dHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgU2V0IG9iamZhdWx0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICBNYXAgbnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgQXJyYXlMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGJhc2ljIG9wZXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSAoQXhpc09wZXJhdGlvbilvcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVwID0gb3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGlubXNnID0gbnVsbDsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRtc2cgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChtZXApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlubXNnID0gb3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5tc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnB1dCBtZXNzYWdlIG5vdCBmb3VuZCBmb3Igb3BlcmF0aW9uICIgKyBvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBoZWFkZXJzID0gaW5tc2cuZ2V0U29hcEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIgPSAoU09BUEhlYWRlck1lc3NhZ2UpaGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBtYXBNZXNzYWdlKGhlYWRlciwgZWxlbWVudE1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmppbnMuYWRkKGNuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRjbGFzcyA9PSBudWxsICYmIGlzTG9va3VwQ2xhc3MoY25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkY2xhc3MgPSBjbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKG1lcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0bXNnID0gb3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG91dHB1dCBtZXNzYWdlIG5vdCBmb3VuZCBmb3Igb3BlcmF0aW9uICIgKyBvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBoZWFkZXJzID0gb3V0bXNnLmdldFNvYXBIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyID0gKFNPQVBIZWFkZXJNZXNzYWdlKWhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gbWFwTWVzc2FnZShoZWFkZXIsIGVsZW1lbnRNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgb2Jqb3V0cy5hZGQoY25hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZGNsYXNzID09IG51bGwgJiYgaXNMb29rdXBDbGFzcyhjbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRjbGFzcyA9IGNuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh1bndyYXApIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdW53cmFwcGluZyBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcm5hbWUgPSAiamlieFJlY2VpdmVyIiArIG9waW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBkYm1ldGhvZCA9IGRvYy5jcmVhdGVFbGVtZW50KCJkYm1ldGhvZCIpOwotICAgICAgICAgICAgICAgICAgICBkYm1ldGhvZC5zZXRBdHRyaWJ1dGUoInJlY2VpdmVyLW5hbWUiLCByZWNlaXZlcm5hbWUpOwotICAgICAgICAgICAgICAgICAgICBkYm1ldGhvZC5zZXRBdHRyaWJ1dGUoIm1ldGhvZC1uYW1lIiwgb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0IG5hbWVzZXQgPSBuZXcgSGFzaFNldChzX3Jlc2VydmVkV29yZHMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5tc2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB3cmFwcGVyID0gdW53cmFwTWVzc2FnZShpbm1zZywgZmFsc2UsIHNpbXBsZVR5cGVNYXAsIGVsZW1lbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlTWFwLCB0eXBlTWFwcGVkQ2xhc3NNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdNYXAsIG5hbWVzZXQsIG5zTWFwLCBkb2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGJtZXRob2QuYXBwZW5kQ2hpbGQod3JhcHBlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVycy5hZGQod3JhcHBlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dG1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHdyYXBwZXIgPSB1bndyYXBNZXNzYWdlKG91dG1zZywgdHJ1ZSwgc2ltcGxlVHlwZU1hcCwgZWxlbWVudE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFR5cGVNYXAsIHR5cGVNYXBwZWRDbGFzc01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ01hcCwgbmFtZXNldCwgbnNNYXAsIGRvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYm1ldGhvZC5hcHBlbmRDaGlsZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdW53cmFwcGluZyBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIGNvZGUgZ2VuZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICBvcC5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhcmFtZXRlcihDb25zdGFudHMuREFUQUJJTkRJTkdfR0VORVJBVEVEX1JFQ0VJVkVSLCByZWNlaXZlcm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgb3AuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLkRBVEFCSU5ESU5HX0dFTkVSQVRFRF9JTVBMRU1FTlRBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wLmFkZFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5EQVRBQklORElOR19PUEVSQVRJT05fREVUQUlMUywgZGJtZXRob2QpKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29uY3JldGUgbWFwcGluZ3MsIGp1c3Qgc2F2ZSB0aGUgbWFwcGVkIGNsYXNzIG5hbWUocykKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlubXNnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IG1hcE1lc3NhZ2UoaW5tc2csIGVsZW1lbnRNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgb2JqaW5zLmFkZChjbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkY2xhc3MgPT0gbnVsbCAmJiBpc0xvb2t1cENsYXNzKGNuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZGNsYXNzID0gY25hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dG1zZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBtYXBNZXNzYWdlKG91dG1zZywgZWxlbWVudE1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmpvdXRzLmFkZChjbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVkY2xhc3MgPT0gbnVsbCAmJiBpc0xvb2t1cENsYXNzKGNuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZGNsYXNzID0gY25hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBoYW5kbGUgZmF1bHRzIGFzIHdyYXBwZWQKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcC5nZXRGYXVsdE1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IG1hcE1lc3NhZ2UoKEF4aXNNZXNzYWdlKWl0ZXIubmV4dCgpLCBlbGVtZW50TWFwKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZmF1bHRzLmFkZChjbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRjbGFzcyA9PSBudWxsICYmIGlzTG9va3VwQ2xhc3MoY25hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRjbGFzcyA9IGNuYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjaGVjayBmb3IgZGVmYXVsdCBuYW1lc3BhY2UgdXNhZ2Ugd2l0aGluIGJpbmRpbmdzIG9yIHdyYXBwZXJzCi0gICAgICAgICAgICAvLyAgKG1lYW5pbmcgd2UgY2FuJ3QgZGVjbGFyZSBhIGNvbmZsaWN0aW5nIGRlZmF1bHQgbmFtZXNwYWNlKQotICAgICAgICAgICAgQ29sbGVjdGlvbiBwcmVmaXhlcyA9IG5zTWFwLnZhbHVlcygpOwotICAgICAgICAgICAgYm9vbGVhbiBkZmx0bnMgPSBwcmVmaXhlcy5jb250YWlucygiIik7Ci0gICAgICAgICAgICBib29sZWFuIHdyYXBkZmx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIWRmbHRucykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JhcHBlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB3cmFwcGVyID0gKEVsZW1lbnQpd3JhcHBlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyh3cmFwcGVyLmdldEF0dHJpYnV0ZSgidXNlcy1kZWZhdWx0IikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cmFwZGZsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmluZCBhIHByZWZpeCB0aGF0IHdlIGNhbiB1c2Ugd2hlcmUgbmVlZGVkIGZvciBleHRyYSBuYW1lc3BhY2UKLSAgICAgICAgICAgIFN0cmluZyB4dHJhcHJlZiA9ICIiOwotICAgICAgICAgICAgaWYgKGRmbHRucyB8fCB3cmFwZGZsdCkgewotICAgICAgICAgICAgICAgIHh0cmFwcmVmID0gIl8iOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHByZWZpeGVzLmNvbnRhaW5zKHh0cmFwcmVmKSkgewotICAgICAgICAgICAgICAgICAgICB4dHJhcHJlZiA9ICJfIiArIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3IgZWFjaCB3cmFwcGVyIChpbnB1dCBhbmQgb3V0cHV0KSwgZGV0ZXJtaW5lIHdoYXQgYWRkaXRpb25hbAotICAgICAgICAgICAgLy8gIG5hbWVzcGFjZXMgbmVlZCB0byBiZSBkZWNsYXJlZCwgd2hhdCBwcmVmaXggaXMgdG8gYmUgdXNlZCBmb3IKLSAgICAgICAgICAgIC8vICB0aGUgd3JhcHBlciBlbGVtZW50LCBhbmQgd2hhdCBwcmVmaXggdG8gYmUgdXNlZCBmb3IgZWFjaCBjaGlsZAotICAgICAgICAgICAgLy8gIGVsZW1lbnQKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3JhcHBlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHdyYXBwZXIgPSAoRWxlbWVudCl3cmFwcGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRucyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IHdyYXBwZXIuZ2V0QXR0cmlidXRlKCJucyIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyh3cmFwcGVyLmdldEF0dHJpYnV0ZSgibmVlZC1uYW1lc3BhY2VzIikpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZXh0cmEgZGVmaW5pdGlvbiBuZWVkZWQgZm9yIHdyYXBwZXIgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKG5zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRmbHRucyB8fCB3cmFwZGZsdCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCBhIG5hbWVzcGFjZSwgY2FuJ3QgYmUgZGVmYXVsdCwgZ2V0IG9yIHNldCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IChTdHJpbmcpbnNNYXAuZ2V0KG5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0geHRyYXByZWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZG5zID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IG1ha2UgdGhlIHdyYXBwZXIgbmFtZXNwYWNlIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkbnMgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5zZXRBdHRyaWJ1dGUoInByZWZpeCIsIHByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHByZWZpeGVzIGZvciBjaGlsZCBlbGVtZW50cyBvZiB3cmFwcGVyCi0gICAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IHdyYXBwZXIuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJwYXJhbWV0ZXItZWxlbWVudCIuZXF1YWxzKGxuYW1lKSB8fCAicmV0dXJuLWVsZW1lbnQiLmVxdWFscyhsbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hpbGRucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJucyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGNoaWxkbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgicHJlZml4IiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5zLmVxdWFscyhjaGlsZG5zKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInByZWZpeCIsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hpbGRwcmVmaXggPSAoU3RyaW5nKW5zTWFwLmdldChjaGlsZG5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBzZXQgbmFtZXNwYWNlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRucyArICIgZm9yIGNoaWxkIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcmVmaXgiLCBjaGlsZHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGV4dHJhIGRlZmluaXRpb24gbmVlZGVkIGZvciB3cmFwcGVyIG5hbWVzcGFjZQotICAgICAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhucykpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBtYWtlIHRoZSB3cmFwcGVyIG5hbWVzcGFjZSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRucyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLnNldEF0dHJpYnV0ZSgicHJlZml4IiwgcHJlZml4KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZXQgcHJlZml4ZXMgZm9yIGNoaWxkIGVsZW1lbnRzIG9mIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgTm9kZSBub2RlID0gd3JhcHBlci5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsbmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInBhcmFtZXRlci1lbGVtZW50Ii5lcXVhbHMobG5hbWUpIHx8ICJyZXR1cm4tZWxlbWVudCIuZXF1YWxzKGxuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZG5zID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5zIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoY2hpbGRucykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJwcmVmaXgiLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnMuZXF1YWxzKGNoaWxkbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgicHJlZml4IiwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gc2V0IG5hbWVzcGFjZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRucyArICIgZm9yIGNoaWxkIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWRkbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBhZGRlZG5zID0gZG9jLmNyZWF0ZUVsZW1lbnQoImV4dHJhLW5hbWVzcGFjZSIpOwotICAgICAgICAgICAgICAgICAgICBhZGRlZG5zLnNldEF0dHJpYnV0ZSgibnMiLCBucyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZGVkbnMuc2V0QXR0cmlidXRlKCJwcmVmaXgiLCBwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGFkZGVkbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIHR5cGUgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGJpbmRpbmcgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgIExpc3QgZGV0YWlscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgYmluZGluaXQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5pdGlhbGl6ZS1iaW5kaW5nIik7Ci0gICAgICAgICAgICBpZiAoIXR5cGVNYXBwZWRDbGFzc01hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlTWFwcGVkQ2xhc3NNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHRuYW1lID0gKFFOYW1lKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xzaW5kZXggPSAoKEludGVnZXIpdHlwZU1hcHBlZENsYXNzTWFwLmdldCh0bmFtZSkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgZGV0YWlsID0gZG9jLmNyZWF0ZUVsZW1lbnQoImFic3RyYWN0LXR5cGUiKTsKLSAgICAgICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgibnMiLCB0bmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0bmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbC5zZXRBdHRyaWJ1dGUoInR5cGUtaW5kZXgiLCBjbHNpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbml0LmFwcGVuZENoaWxkKGRldGFpbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRjbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nRWxlbWVudEJhc2UgbWFwcGluZyA9IChNYXBwaW5nRWxlbWVudEJhc2UpY29tcGxleFR5cGVNYXAuZ2V0KHRuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZGNsYXNzID0gbWFwcGluZy5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0IGJpbmRpbmcgbG9va3VwIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5nZXROYW1lKCkgIT0gbnVsbCAmJiBiaW5kaW5nLmdldFRhcmdldFBhY2thZ2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluaXQuc2V0QXR0cmlidXRlKCJiaW5kaW5nLW5hbWUiLCBiaW5kaW5nLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYmluZGluaXQuc2V0QXR0cmlidXRlKCJiaW5kaW5nLXBhY2thZ2UiLCBiaW5kaW5nLmdldFRhcmdldFBhY2thZ2UoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtYXBwZWRjbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcHBlZGNsYXNzID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpbmRpbml0LnNldEF0dHJpYnV0ZSgiYm91bmQtY2xhc3MiLCBtYXBwZWRjbGFzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGluY2x1ZGUgYmluZGluZyBuYW1lc3BhY2VzIGluIGluaXRpYWxpemF0aW9uIGRhdGEKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG5zTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpbnNNYXAuZ2V0KG5zKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGRldGFpbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJiaW5kaW5nLW5hbWVzcGFjZSIpOwotICAgICAgICAgICAgICAgIGRldGFpbC5zZXRBdHRyaWJ1dGUoIm5zIiwgbnMpOwotICAgICAgICAgICAgICAgIGRldGFpbC5zZXRBdHRyaWJ1dGUoInByZWZpeCIsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgYmluZGluaXQuYXBwZW5kQ2hpbGQoZGV0YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldGFpbHMuYWRkKGJpbmRpbml0KTsKLQotICAgICAgICAgICAgLy8gYWRkIGRldGFpbHMgZm9yIGFsbCBvYmplY3RzIHVzZWQgYXMgaW5wdXRzL291dHB1dHMvZmF1bHRzCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmppbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBkZXRhaWwgPSBkb2MuY3JlYXRlRWxlbWVudCgib2JqZWN0LWlucHV0Iik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgidHlwZSIsIGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy5hZGQoZGV0YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iam91dHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBkZXRhaWwgPSBkb2MuY3JlYXRlRWxlbWVudCgib2JqZWN0LW91dHB1dCIpOwotICAgICAgICAgICAgICAgIGRldGFpbC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBjbGFzc25hbWUpOwotICAgICAgICAgICAgICAgIGRldGFpbHMuYWRkKGRldGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmpmYXVsdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBkZXRhaWwgPSBkb2MuY3JlYXRlRWxlbWVudCgib2JqZWN0LWZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsLnNldEF0dHJpYnV0ZSgidHlwZSIsIGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlscy5hZGQoZGV0YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvZGVHZW5Db25maWcuZ2V0QXhpc1NlcnZpY2UoKQotICAgICAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLkRBVEFCSU5ESU5HX1NFUlZJQ0VfREVUQUlMUywgZGV0YWlscykpOwotCi0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSmlCWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIGNsYXNzIGlzIHBvdGVudGlhbGx5IHVzYWJsZSBmb3IgbG9va2luZyB1cCBiaW5kaW5nIGluZm9ybWF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcG90ZW50aWFsbHkgdXNhYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvb2t1cENsYXNzKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAhdHlwZS5zdGFydHNXaXRoKCJqYXZhLiIpICYmICF0eXBlLnN0YXJ0c1dpdGgoImphdmF4LiIpICYmCi0gICAgICAgICAgICAgICAgIXR5cGUuc3RhcnRzV2l0aCgib3JnLnczYy4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgZm9ybWF0IGRlZmluaXRpb24gZm9yIHR5cGUgd2l0aCBidWlsdC1pbiBKaUJYIGhhbmRsaW5nIHRvIG1hcC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHlwZSBzY2hlbWEgdHlwZSBuYW1lCi0gICAgICogQHBhcmFtIGp0eXBlIGphdmEgdHlwZSBuYW1lCi0gICAgICogQHBhcmFtIHNuYW1lIHNlcmlhbGl6ZXIgbWV0aG9kIG5hbWUKLSAgICAgKiBAcGFyYW0gZG5hbWUgZGVzZXJpYWxpemVyIG1ldGhvZCBuYW1lCi0gICAgICogQHBhcmFtIGRmbHQgIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBAcGFyYW0gbWFwICAgc2NoZW1hIHR5cGUgcW5hbWUgdG8gZm9ybWF0IGRlZmluaXRpb24gbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEZvcm1hdChTdHJpbmcgc3R5cGUsIFN0cmluZyBqdHlwZSwgU3RyaW5nIHNuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRuYW1lLCBTdHJpbmcgZGZsdCwgTWFwIG1hcCkgewotICAgICAgICBGb3JtYXRFbGVtZW50IGZvcm1hdCA9IG5ldyBGb3JtYXRFbGVtZW50KCk7Ci0gICAgICAgIGZvcm1hdC5zZXRUeXBlTmFtZShqdHlwZSk7Ci0gICAgICAgIGZvcm1hdC5zZXRTZXJpYWxpemVyTmFtZShzbmFtZSk7Ci0gICAgICAgIGZvcm1hdC5zZXREZXNlcmlhbGl6ZXJOYW1lKGRuYW1lKTsKLSAgICAgICAgZm9ybWF0LnNldERlZmF1bHRUZXh0KGRmbHQpOwotICAgICAgICBtYXAucHV0KG5ldyBRTmFtZShTQ0hFTUFfTkFNRVNQQUNFLCBzdHlwZSksIGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB1bndyYXBwaW5nIGEgbWVzc2FnZS4gVGhpcyBnZW5lcmF0ZXMgYW5kIHJldHVybnMgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGUKLSAgICAgKiBtZXNzYWdlIGlzIHRvIGJlIHVud3JhcHBlZC4gSXQgYWxzbyBjcmVhdGVzIHRoZSBkYXRhIHN0cnVjdHVyZXMgZXhwZWN0ZWQgYnkgdGhlIGNvZGUKLSAgICAgKiBnZW5lcmF0aW9uIGluIG9yZGVyIHRvIGJlIHNvbWV3aGF0IGNvbXBhdGlibGUgd2l0aCBBREIgdW53cmFwcGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgICAgICAgICAgICAgICAgbWVzc2FnZSB0byBiZSB1bndyYXBwZWQKLSAgICAgKiBAcGFyYW0gaXNvdXQgICAgICAgICAgICAgIG91dHB1dCBtZXNzYWdlIGZsYWcgKHdyYXBwZXIgaW5oZXJpdHMgaW5uZXIgdHlwZSwgZm9yIFhTTFRzKQotICAgICAqIEBwYXJhbSBzaW1wbGVUeXBlTWFwICAgICAgYmluZGluZyBmb3JtYXRzCi0gICAgICogQHBhcmFtIGVsZW1lbnRNYXAgICAgICAgICBtYXAgZnJvbSBlbGVtZW50IG5hbWVzIHRvIGNvbmNyZXRlIG1hcHBpbmcgY29tcG9uZW50cyBvZiBiaW5kaW5nCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlTWFwICAgICBiaW5kaW5nIG1hcHBpbmdzCi0gICAgICogQHBhcmFtIHR5cGVNYXBwZWRDbGFzc01hcCBtYXAgZnJvbSB0eXBlIHFuYW1lIHRvIGluZGV4Ci0gICAgICogQHBhcmFtIGJpbmRpbmdNYXAgICAgICAgICBtYXAgZnJvbSBtYXBwaW5nIGNvbXBvbmVudHMgdG8gY29udGFpbmluZyBiaW5kaW5nIGRlZmluaXRpb24KLSAgICAgKiBAcGFyYW0gbmFtZXNldCAgICAgICAgICAgIHBhcmFtZXRlciB2YXJpYWJsZSBuYW1lcyB1c2VkIGluIG1ldGhvZAotICAgICAqIEBwYXJhbSBuc21hcCAgICAgICAgICAgICAgbWFwciBmcm9tIFVSSSB0byBwcmVmaXggZm9yIG5hbWVzcGFjZXMgdG8gYmUgZGVmaW5lZCBvbiB3cmFwcGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Ci0gICAgICogQHBhcmFtIGRvYyAgICAgICAgICAgICAgICBkb2N1bWVudCB1c2VkIGZvciBET00gY29tcG9uZW50cwotICAgICAqIEByZXR1cm4gZGV0YWlsZWQgZGVzY3JpcHRpb24gZWxlbWVudCBmb3IgY29kZSBnZW5lcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50IHVud3JhcE1lc3NhZ2UoQXhpc01lc3NhZ2UgbXNnLCBib29sZWFuIGlzb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzaW1wbGVUeXBlTWFwLCBNYXAgZWxlbWVudE1hcCwgTWFwIGNvbXBsZXhUeXBlTWFwLCBNYXAgdHlwZU1hcHBlZENsYXNzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBiaW5kaW5nTWFwLCBTZXQgbmFtZXNldCwgTWFwIG5zbWFwLCBEb2N1bWVudCBkb2MpIHsKLQotICAgICAgICAvLyBmaW5kIHRoZSBzY2hlbWEgZGVmaW5pdGlvbiBmb3IgdGhpcyBtZXNzYWdlIGVsZW1lbnQKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBtc2cuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZWxlbWVudCByZWZlcmVuY2UgaW4gbWVzc2FnZSAiICsgbXNnLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB3cmFwZGVmID0gY29kZUdlbkNvbmZpZy5nZXRBeGlzU2VydmljZSgpLmdldFNjaGVtYUVsZW1lbnQocW5hbWUpOwotICAgICAgICBpZiAod3JhcGRlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCAtIG5vIGRlZmluaXRpb24gZm91bmQgZm9yIGVsZW1lbnQgIiArIHFuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSB3cmFwZGVmLmdldFNjaGVtYVR5cGUoKTsKLQotICAgICAgICAvLyBjcmVhdGUgZG9jdW1lbnQgdG8gaG9sZCBkYXRhIGJpbmRpbmcgZGV0YWlscyBmb3IgZWxlbWVudAotICAgICAgICBFbGVtZW50IHdyYXBkZXRhaWwgPSBkb2MuY3JlYXRlRWxlbWVudChpc291dCA/ICJvdXQtd3JhcHBlciIgOiAiaW4td3JhcHBlciIpOwotICAgICAgICB3cmFwZGV0YWlsLnNldEF0dHJpYnV0ZSgibnMiLCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIHdyYXBkZXRhaWwuc2V0QXR0cmlidXRlKCJuYW1lIiwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIC8vIGRpZyBkb3duIHRvIHRoZSBjb21wbGV4VHlwZSBwYXJ0aWNsZQotICAgICAgICBMaXN0IHBhcnROYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU3RyaW5nIHdyYXBwZXJ0eXBlID0gIiI7Ci0gICAgICAgIGJvb2xlYW4gbm9ucyA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmxlbmd0aCgpID09IDA7Ci0gICAgICAgIGJvb2xlYW4gZGZsdG5zID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gY29tcGxleCA9IGZhbHNlOwotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB7Ci0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjdHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSl0eXBlOwotICAgICAgICAgICAgaWYgKGN0eXBlLmdldEF0dHJpYnV0ZXMoKS5nZXRDb3VudCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKyAiOiBhdHRyaWJ1dGVzIG5vdCBhbGxvd2VkIG9uIHR5cGUgdG8gYmUgdW53cmFwcGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IGN0eXBlLmdldFBhcnRpY2xlKCk7Ci0gICAgICAgICAgICBpZiAocGFydGljbGUgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhIHBhcnRpY2xlIHByZXNlbnQsIGl0IG11c3QgYmUgYSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgIGlmICghKHBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hU2VxdWVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKyAiOiB0eXBlIHRvIGJlIHVud3JhcHBlZCBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmdldE1pbk9jY3VycygpICE9IDEgfHwgcGFydGljbGUuZ2V0TWF4T2NjdXJzKCkgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBjb250YWluZWQgc2VxdWVuY2UgbXVzdCBoYXZlIG1pbk9jY3Vycz0nMScgYW5kIG1heE9jY3Vycz0nMSciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UgPSAoWG1sU2NoZW1hU2VxdWVuY2UpcGFydGljbGU7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgY2hpbGQgcGFyYW0gZWxlbWVudCBtYXRjaGluZyBlYWNoIGNoaWxkIG9mIHdyYXBwZXIgZWxlbWVudAotICAgICAgICAgICAgICAgIFFOYW1lIG9wTmFtZSA9IG1zZy5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaXRlbXMgPSBzZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZW1zLmdldEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hpbGQgaXRlbSBvYmV5cyB0aGUgdW53cmFwcGluZyBydWxlcwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFQYXJ0aWNsZSBpdGVtID0gKFhtbFNjaGVtYVBhcnRpY2xlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgWG1sU2NoZW1hRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lICsgIjogb25seSBlbGVtZW50IGl0ZW1zIGFsbG93ZWQgaW4gc2VxdWVuY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGVsZW1lbnQgPSAoWG1sU2NoZW1hRWxlbWVudClpdGVtOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSByZWZuYW1lID0gZWxlbWVudC5nZXRSZWZOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHR5cGVuYW1lID0gZWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmbmFtZSA9PSBudWxsICYmIHR5cGVuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogYWxsIGVsZW1lbnRzIGluIGNvbnRhaW5lZCBzZXF1ZW5jZSBtdXN0IGJlIGVsZW1lbnQgcmVmZXJlbmNlcyBvciByZWZlcmVuY2UgYSBuYW1lZCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IG9ubHkgb25lIGNoaWxkIGVsZW1lbnQgYWxsb3dlZCBpbiBzZXF1ZW5jZSBmb3Igd3JhcHBlZCBvdXRwdXQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGFkZCBlbGVtZW50IHRvIG91dHB1dCB3aXRoIGRldGFpbHMgb2YgdGhpcyBlbGVtZW50IGhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcGFyYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy5jcmVhdGVFbGVtZW50KGlzb3V0ID8gInJldHVybi1lbGVtZW50IiA6ICJwYXJhbWV0ZXItZWxlbWVudCIpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBpdGVtbmFtZSA9IChyZWZuYW1lID09IG51bGwpID8gZWxlbWVudC5nZXRRTmFtZSgpIDogcmVmbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbm9ucyA9IG5vbnMgfHwgaXRlbW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMDsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJucyIsIGl0ZW1uYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJuYW1lIiwgaXRlbW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamF2YW5hbWUgPSB0b0phdmFOYW1lKGl0ZW1uYW1lLmdldExvY2FsUGFydCgpLCBuYW1lc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJqYXZhLW5hbWUiLCBqYXZhbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgibmlsbGFibGUiLCBCb29sZWFuLnRvU3RyaW5nKGVsZW1lbnQuaXNOaWxsYWJsZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwgPSBlbGVtZW50LmdldE1pbk9jY3VycygpID09IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgib3B0aW9uYWwiLCBCb29sZWFuLnRvU3RyaW5nKG9wdGlvbmFsKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNhcnJheSA9IGVsZW1lbnQuZ2V0TWF4T2NjdXJzKCkgPiAxOwotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImFycmF5IiwgQm9vbGVhbi50b1N0cmluZyhpc2FycmF5KSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZXR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRTY2hlbWFUeXBlKCkgaW5zdGFuY2VvZiBYbWxTY2hlbWFTaW1wbGVUeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbXBsZSB0eXBlIHRyYW5zbGF0ZXMgdG8gZm9ybWF0IGVsZW1lbnQgaW4gYmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0RWxlbWVudCBmb3JtYXQgPSAoRm9ybWF0RWxlbWVudClzaW1wbGVUeXBlTWFwLmdldCh0eXBlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgcmVzdHJpY3Rpb24gd2l0aCBzaW1wbGUgYmFzZSwgYW5kIHRyZWF0IGFzIGJhc2UgaWYgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTaW1wbGVUeXBlIHN0eXBlID0gKFhtbFNjaGVtYVNpbXBsZVR5cGUpZWxlbWVudC5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2ltcGxlVHlwZUNvbnRlbnQgY29udGVudCA9IHN0eXBlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGVSZXN0cmljdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSB0bmFtZSA9ICgoWG1sU2NoZW1hU2ltcGxlVHlwZVJlc3RyaWN0aW9uKWNvbnRlbnQpLmdldEJhc2VUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAoRm9ybWF0RWxlbWVudClzaW1wbGVUeXBlTWFwLmdldCh0bmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSA9IHRuYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUgKyAiOiBubyBmb3JtYXQgZGVmaW5pdGlvbiBmb3VuZCBmb3IgdHlwZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgKyAiICh1c2VkIGJ5IGVsZW1lbnQgIiArIGl0ZW1uYW1lICsgJyknKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmF0eXBlID0gZm9ybWF0LmdldFR5cGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImZvcm0iLCAic2ltcGxlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoInNlcmlhbGl6ZXIiLCBmb3JtYXQuZ2V0U2VyaWFsaXplck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImRlc2VyaWFsaXplciIsIGZvcm1hdC5nZXREZXNlcmlhbGl6ZXJOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0eXBlcyB0byB3cmFwcGVyIHR5cGVzIGZvciBuaWxsYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25hbCB8fCBlbGVtZW50LmlzTmlsbGFibGUoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc193cmFwcGVyTWFwLmNvbnRhaW5zS2V5KGphdmF0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgid3JhcHBlZC1wcmltaXRpdmUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgidmFsdWUtbWV0aG9kIiwgamF2YXR5cGUgKyAiVmFsdWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhdHlwZSA9IChTdHJpbmcpc193cmFwcGVyTWFwLmdldChqYXZhdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgid3JhcHBlZC1wcmltaXRpdmUiLCAiZmFsc2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGZsdCA9IGVsZW1lbnQuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRmbHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmx0ID0gZm9ybWF0LmdldERlZmF1bHRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhdHlwZS5lcXVhbHMoImZsb2F0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmbHQgPSBkZmx0ICsgJ0YnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZmx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJkZWZhdWx0IiwgZGZsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24gbXVzdCBiZSBkZWZpbmVkIGJ5IG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdFbGVtZW50QmFzZSBtYXBwaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZm5hbWUgPT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxleCB0eXBlIHJlZmVyZW5jZSB0cmFuc2xhdGVzIHRvIGFic3RyYWN0IG1hcHBpbmcgaW4gYmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSAoTWFwcGluZ0VsZW1lbnRCYXNlKWNvbXBsZXhUeXBlTWFwLmdldCh0eXBlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHVud3JhcCBlbGVtZW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lICsgIjogbm8gYWJzdHJhY3QgbWFwcGluZyBkZWZpbml0aW9uIGZvdW5kIGZvciB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lICsgIiAodXNlZCBieSBlbGVtZW50ICIgKyBpdGVtbmFtZSArICcpJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgdGluZGV4ID0gKEludGVnZXIpdHlwZU1hcHBlZENsYXNzTWFwLmdldCh0eXBlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbmRleCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbmRleCA9IG5ldyBJbnRlZ2VyKHR5cGVNYXBwZWRDbGFzc01hcC5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTWFwcGVkQ2xhc3NNYXAucHV0KHR5cGVuYW1lLCB0aW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoInR5cGUtaW5kZXgiLCB0aW5kZXgudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgcmVmZXJlbmNlIHRyYW5zbGF0ZXMgdG8gY29uY3JldGUgbWFwcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSAoTWFwcGluZ0VsZW1lbnRCYXNlKWVsZW1lbnRNYXAuZ2V0KHJlZm5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB1bndyYXAgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZSArICI6IG5vIGNvbmNyZXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBmb3VuZCBmb3IgZWxlbWVudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZuYW1lICsgIiAodXNlZCBieSBlbGVtZW50ICIgKyBpdGVtbmFtZSArICcpJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldEF0dHJpYnV0ZSgidHlwZS1pbmRleCIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJlIGJhc2VkIG9uIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImZvcm0iLCAiY29tcGxleCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhdHlwZSA9IG1hcHBpbmcuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGV0eXBlID0gbWFwcGluZy5nZXRDcmVhdGVUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRldHlwZSA9PSBudWxsICYmIG1hcHBpbmcuaXNBYnN0cmFjdCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5nZXRFeHRlbnNpb25UeXBlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFic3RyYWN0IG1hcHBpbmcgd2l0aCBubyBleHRlbnNpb25zIHJlcXVpcmVzIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRoaXMgYXNzdW1lcyB0aGUgbWFwcGVkIHR5cGUgY2FuIGJlIGNyZWF0ZWQsIGJ1dCBubyBlYXN5IHdheSB0byBjaGVjawotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZXR5cGUgPSBqYXZhdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgY29udGFpbmVkIG5hbWVzcGFjZSBkZWZpbml0aW9ucyBpbnRvIHNldCBmb3Igb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBjaXRlciA9IG1hcHBpbmcudG9wQ2hpbGRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRCYXNlIGNoaWxkID0gKEVsZW1lbnRCYXNlKWNpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQudHlwZSgpID09IEVsZW1lbnRCYXNlLk5BTUVTUEFDRV9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmbHRucyA9IG1hcE5hbWVzcGFjZSgoTmFtZXNwYWNlRWxlbWVudCljaGlsZCwgZGZsdG5zLCBuc21hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIG1lcmdlIG5hbWVzcGFjZSBkZWZpbml0aW9ucyBmcm9tIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdFbGVtZW50IGJpbmRpbmcgPSAoQmluZGluZ0VsZW1lbnQpYmluZGluZ01hcC5nZXQobWFwcGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaXRlciA9IGJpbmRpbmcudG9wQ2hpbGRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRCYXNlIGNoaWxkID0gKEVsZW1lbnRCYXNlKWNpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQudHlwZSgpID09IEVsZW1lbnRCYXNlLk5BTUVTUEFDRV9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmbHRucyA9IG1hcE5hbWVzcGFjZSgoTmFtZXNwYWNlRWxlbWVudCljaGlsZCwgZGZsdG5zLCBuc21hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC50eXBlKCkgIT0gRWxlbWVudEJhc2UuSU5DTFVERV9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXRBdHRyaWJ1dGUoImphdmEtdHlwZSIsIGphdmF0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZXR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJjcmVhdGUtdHlwZSIsIGNyZWF0ZXR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc29iaiA9ICFzX3ByaW1pdGl2ZVNldC5jb250YWlucyhqYXZhdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsdHlwZSA9IGphdmF0eXBlOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNhcnJheSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHR5cGUgKz0gIltdIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzb2JqID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0QXR0cmlidXRlKCJvYmplY3QiLCBCb29sZWFuLnRvU3RyaW5nKGlzb2JqKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc291dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnR5cGUgPSBmdWxsdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJ0eXBlID0gImphdmEubGFuZy5PYmplY3QiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdyYXBkZXRhaWwuYXBwZW5kQ2hpbGQocGFyYW0pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWFnaWMgY29kZSBjb21lcyBmcm9tIG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5TY2hlbWFVbndyYXBwZXJFeHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gIGl0J3MgdXNlZCBoZXJlIHRvIGZpdCBpbnRvIHRoZSBBREItYmFzZWQgY29kZSBnZW5lcmF0aW9uIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcnRxbmFtZSA9IFdTRExVdGlsLmdldFBhcnRRTmFtZShvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLklOUFVUX1BBUlRfUU5BTUVfU1VGRklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0TmFtZUxpc3QuYWRkKHBhcnRxbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHR5cGUgbWFwcGluZyBzbyB3ZSBsb29rIGxpa2UgQURCCi0gICAgICAgICAgICAgICAgICAgIGNvZGVHZW5Db25maWcuZ2V0VHlwZU1hcHBlcigpLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0cW5hbWUsIGZ1bGx0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayBuYW1lc3BhY2UgcHJlZml4IHVzYWdlCi0gICAgICAgICAgICAgICAgaWYgKG5vbnMgJiYgZGZsdG5zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArIHFuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiBuby1uYW1lc3BhY2UgZWxlbWVudChzKSBjb25mbGljdCB3aXRoIGRlZmF1bHQgbmFtZXNwYWNlIHVzZSBpbiBiaW5kaW5nIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyYXBkZXRhaWwuc2V0QXR0cmlidXRlKCJ1c2VzLWRlZmF1bHQiLCBCb29sZWFuLnRvU3RyaW5nKG5vbnMpKTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCBmbGFnIGZvciBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIG5lZWRlZCBvbiB3cmFwcGVyCi0gICAgICAgICAgICAgICAgd3JhcGRldGFpbC5zZXRBdHRyaWJ1dGUoIm5lZWQtbmFtZXNwYWNlcyIsIEJvb2xlYW4udG9TdHJpbmcoY29tcGxleCkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdW53cmFwIGVsZW1lbnQgIiArIHFuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIjogbm90IGEgY29tcGxleFR5cGUgZGVmaW5pdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cmFwZGV0YWlsLmdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3cmFwZGV0YWlsLnNldEF0dHJpYnV0ZSgiZW1wdHkiLCAidHJ1ZSIpOwotICAgICAgICAgICAgd3JhcGRldGFpbC5zZXRBdHRyaWJ1dGUoIm5lZWQtbmFtZXNwYWNlcyIsICJmYWxzZSIpOwotICAgICAgICAgICAgd3JhcHBlcnR5cGUgPSAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyYXBkZXRhaWwuc2V0QXR0cmlidXRlKCJlbXB0eSIsICJmYWxzZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBtYWdpYyBjb2RlIGNvbWVzIGZyb20gb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uZXh0ZW5zaW9uLlNjaGVtYVVud3JhcHBlckV4dGVuc2lvbgotICAgICAgICAvLyAgaXQncyB1c2VkIGhlcmUgdG8gZml0IGludG8gdGhlIEFEQi1iYXNlZCBjb2RlIGdlbmVyYXRpb24gbW9kZWwKLSAgICAgICAgTWVzc2FnZVBhcnRJbmZvcm1hdGlvbkhvbGRlciBpbmZvSG9sZGVyID0gbmV3IE1lc3NhZ2VQYXJ0SW5mb3JtYXRpb25Ib2xkZXIoKTsKLSAgICAgICAgaW5mb0hvbGRlci5zZXRPcGVyYXRpb25OYW1lKG1zZy5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW5mb0hvbGRlci5zZXRQYXJ0c0xpc3QocGFydE5hbWVMaXN0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1zZy5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihDb25zdGFudHMuVU5XUkFQUEVEX0RFVEFJTFMsIGluZm9Ib2xkZXIpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IGluZGljYXRpb24gZm9yIHVud3JhcHBlZCBtZXNzYWdlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtc2cuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVksIEJvb2xlYW4uVFJVRSkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgZmFrZSBtYXBwaW5nIGZvciB3cmFwcGVyIG5hbWUgKG5lY2Vzc2FyeSBmb3IgY3VycmVudCBYU0xUcykKLSAgICAgICAgY29kZUdlbkNvbmZpZy5nZXRUeXBlTWFwcGVyKCkuYWRkVHlwZU1hcHBpbmdOYW1lKHFuYW1lLCB3cmFwcGVydHlwZSk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIHRoZSB1bndyYXBwaW5nIGRldGFpbHMKLSAgICAgICAgcmV0dXJuIHdyYXBkZXRhaWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIG1hcHBpbmcgZnJvbSBuYW1lc3BhY2UgVVJJIHRvIHByZWZpeC4gSW4gdGhlIGNhc2Ugd2hlcmUgbXVsdGlwbGUgcHJlZml4ZXMgYXJlIHVzZWQgd2l0aCBhCi0gICAgICogc2luZ2xlIFVSSSwgdGhpcyB3aWxsIHByZXNlcnZlIHRoZSBsYXN0IG5vbi1lbXB0eSBwcmVmaXggZm9yIHRoYXQgVVJJLgotICAgICAqCi0gICAgICogQHBhcmFtIG5zICAgICBuYW1lc3BhY2UgZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBkZmx0bnMgZmxhZyBmb3IgZGVmYXVsdCBuYW1lc3BhY2UgdXNlZCBpbiBiaW5kaW5nCi0gICAgICogQHBhcmFtIG5zbWFwICBtYXAgZnJvbSBuYW1lc3BhY2UgVVJJcyB0byBwcmVmaXhlcwotICAgICAqIEByZXR1cm4gZmxhZyBmb3IgZGVmYXVsdCBuYW1lc3BhY2UgdXNlZCBpbiBiaW5kaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG1hcE5hbWVzcGFjZShOYW1lc3BhY2VFbGVtZW50IG5zLCBib29sZWFuIGRmbHRucywgTWFwIG5zbWFwKSB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBucy5nZXRQcmVmaXgoKTsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcHJpb3IgPSAoU3RyaW5nKW5zbWFwLmdldChucy5nZXRVcmkoKSk7Ci0gICAgICAgIGlmIChwcmlvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGZsdG5zOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwcmlvci5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGZsdG5zID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbnNtYXAucHV0KG5zLmdldFVyaSgpLCBwcmVmaXgpOwotICAgICAgICByZXR1cm4gZGZsdG5zIHx8IHByZWZpeC5sZW5ndGgoKSA9PSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0phdmFOYW1lKFN0cmluZyBuYW1lLCBTZXQgbmFtZXNldCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNociA9IG5hbWUuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKChpID09IDAgJiYgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjaHIpKSB8fAotICAgICAgICAgICAgICAgICAgICAoaSA+IDAgJiYgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGNocikpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoY2hyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hyID09ICc6JyB8fCBjaHIgPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoJyQnKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoJ18nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBTdHJpbmcgam5hbWUgPSBidWZmLnRvU3RyaW5nKCk7Ci0gICAgICAgIHdoaWxlICghbmFtZXNldC5hZGQoam5hbWUpKSB7Ci0gICAgICAgICAgICBqbmFtZSA9IGJ1ZmYudG9TdHJpbmcoKSArIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGpuYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIG1hcE1lc3NhZ2UoQXhpc01lc3NhZ2UgbXNnLCBNYXAgY29tcGxleFR5cGVNYXApIHsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBtc2cuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZWxlbWVudCByZWZlcmVuY2UgaW4gbWVzc2FnZSAiICsgbXNnLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcFFOYW1lKHFuYW1lLCBjb21wbGV4VHlwZU1hcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFwTWVzc2FnZShTT0FQSGVhZGVyTWVzc2FnZSBtc2csIE1hcCBjb21wbGV4VHlwZU1hcCkgewotICAgICAgICBRTmFtZSBxbmFtZSA9IG1zZy5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gZWxlbWVudCByZWZlcmVuY2UgaW4gaGVhZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcFFOYW1lKHFuYW1lLCBjb21wbGV4VHlwZU1hcCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFwUU5hbWUoUU5hbWUgcW5hbWUsIE1hcCBjb21wbGV4VHlwZU1hcCkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBPYmplY3Qgb2JqID0gY29tcGxleFR5cGVNYXAuZ2V0KHFuYW1lKTsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWFwcGluZyBkZWZpbmVkIGZvciBlbGVtZW50ICIgKyBxbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwcGluZ0VsZW1lbnRCYXNlIG1hcHBpbmcgPSAoTWFwcGluZ0VsZW1lbnRCYXNlKW9iajsKLSAgICAgICAgU3RyaW5nIGNuYW1lID0gbWFwcGluZy5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgY29kZUdlbkNvbmZpZy5nZXRUeXBlTWFwcGVyKCkuYWRkVHlwZU1hcHBpbmdOYW1lKHFuYW1lLCBjbmFtZSk7Ci0gICAgICAgIHJldHVybiBjbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0IG1hcHBpbmcgZnJvbSBxbmFtZXMgdG8gY2xhc3NlcyBmb3IgdG9wIGxldmVsIG1hcHBpbmdzIGluIEppQlggYmluZGluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5kaW5nCi0gICAgICogQHBhcmFtIGRucyAgICAgICAgICAgIGRlZmF1bHQgbmFtZXNwYWNlIHRvIGJlIHVzZWQgdW5sZXNzIG92ZXJyaWRkZW4gKGVtcHR5IHN0cmluZyBpZiBub25lKQotICAgICAqIEBwYXJhbSBlbGVtZW50TWFwICAgICBtYXAgZnJvbSBlbGVtZW50IG5hbWVzIHRvIGNvbmNyZXRlIG1hcHBpbmcgY29tcG9uZW50cyBvZiBiaW5kaW5nCi0gICAgICogQHBhcmFtIGNvbXBsZXhUeXBlTWFwIG1hcCBmcm9tIHR5cGUgbmFtZXMgdG8gYWJzdHJhY3QgbWFwcGluZyBjb21wb25lbnRzIG9mIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gc2ltcGxlVHlwZU1hcCAgbWFwIGZyb20gdHlwZSBuYW1lcyB0byBmb3JtYXQgZGVmaW5pdGlvbiBjb21wb25lbnRzIG9mIGJpbmRpbmcKLSAgICAgKiBAcGFyYW0gYmluZGluZ01hcCAgICAgbWFwIGZyb20gbWFwcGluZyBjb21wb25lbnRzIHRvIGNvbnRhaW5pbmcgYmluZGluZyBkZWZpbml0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0VG9wTGV2ZWxDb21wb25lbnRzKEJpbmRpbmdFbGVtZW50IGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkbnMsIE1hcCBlbGVtZW50TWFwLCBNYXAgY29tcGxleFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzaW1wbGVUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgYmluZGluZ01hcCkgewotCi0gICAgICAgIC8vIGNoZWNrIGRlZmF1bHQgbmFtZXNwYWNlIHNldCBhdCB0b3AgbGV2ZWwgb2YgYmluZGluZwotICAgICAgICBTdHJpbmcgZGVmYXVsdG5zID0gZmluZERlZmF1bHROUyhiaW5kaW5nLnRvcENoaWxkSXRlcmF0b3IoKSwgZG5zKTsKLQotICAgICAgICAvLyBhZGQgYWxsIHRvcCBsZXZlbCBtYXBwaW5nIGFuZCBmb3JtYXQgZGVmaW5pdGlvbnMgdG8gbWFwcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiaW5kaW5nLnRvcENoaWxkSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFbGVtZW50QmFzZSBjaGlsZCA9IChFbGVtZW50QmFzZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC50eXBlKCkgPT0gRWxlbWVudEJhc2UuSU5DTFVERV9FTEVNRU5UKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWN1cnNlIHRvIHByb2Nlc3MgaW5jbHVkZWQgYmluZGluZyBkZWZpbml0aW9ucwotICAgICAgICAgICAgICAgIEluY2x1ZGVFbGVtZW50IGluY2x1ZGUgPSAoSW5jbHVkZUVsZW1lbnQpY2hpbGQ7Ci0gICAgICAgICAgICAgICAgY29sbGVjdFRvcExldmVsQ29tcG9uZW50cyhpbmNsdWRlLmdldEJpbmRpbmcoKSwgZGVmYXVsdG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE1hcCwgY29tcGxleFR5cGVNYXAsIHNpbXBsZVR5cGVNYXAsIGJpbmRpbmdNYXApOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLnR5cGUoKSA9PSBFbGVtZW50QmFzZS5GT1JNQVRfRUxFTUVOVCkgewotCi0gICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmFtZWQgZm9ybWF0cyBhcyBzaW1wbGUgdHlwZSBjb252ZXJzaW9ucwotICAgICAgICAgICAgICAgIEZvcm1hdEVsZW1lbnQgZm9ybWF0ID0gKEZvcm1hdEVsZW1lbnQpY2hpbGQ7Ci0gICAgICAgICAgICAgICAgcmVnaXN0ZXJFbGVtZW50KGZvcm1hdC5nZXRRTmFtZSgpLCBmb3JtYXQsIHNpbXBsZVR5cGVNYXApOwotICAgICAgICAgICAgICAgIGJpbmRpbmdNYXAucHV0KGZvcm1hdCwgYmluZGluZyk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQudHlwZSgpID09IEVsZW1lbnRCYXNlLk1BUFBJTkdfRUxFTUVOVCkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHJlY29yZCBvbmx5IGFic3RyYWN0IG1hcHBpbmdzIHdpdGggdHlwZSBuYW1lcywgYW5kIG1hcHBpbmdzIHdpdGggbmFtZXMKLSAgICAgICAgICAgICAgICBNYXBwaW5nRWxlbWVudEJhc2UgbWFwcGluZyA9IChNYXBwaW5nRWxlbWVudEJhc2UpY2hpbGQ7Ci0gICAgICAgICAgICAgICAgYmluZGluZ01hcC5wdXQobWFwcGluZywgYmluZGluZyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcHBpbmcuaXNBYnN0cmFjdCgpICYmIG1hcHBpbmcuZ2V0VHlwZVFOYW1lKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5hbWVkIGFic3RyYWN0IG1hcHBpbmdzIGFzIGNvbXBsZXggdHlwZSBjb252ZXJzaW9ucwotICAgICAgICAgICAgICAgICAgICByZWdpc3RlckVsZW1lbnQobWFwcGluZy5nZXRUeXBlUU5hbWUoKSwgbWFwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlTWFwKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwcGluZy5nZXROYW1lKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGNvbmNyZXRlIG1hcHBpbmdzIGFzIGVsZW1lbnQgY29udmVyc2lvbnMKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG1hcHBpbmcuZ2V0VXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gZmluZERlZmF1bHROUyhtYXBwaW5nLnRvcENoaWxkSXRlcmF0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdG5zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50TWFwLnB1dChuZXcgUU5hbWUodXJpLCBtYXBwaW5nLmdldE5hbWUoKSksIG1hcHBpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGJpbmRpbmcgZWxlbWVudCBieSBxdWFsaWZpZWQgbmFtZS4gVGhpcyBjb252ZXJ0cyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9ybWF0IHVzZWQgYnkKLSAgICAgKiB0aGUgSmlCWCBiaW5kaW5nIG1vZGVsIHRvIHRoYXQgdXNlZCBieSBBeGlzMi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBxbmFtZSAgIHF1YWxpZmllZCBuYW1lIGluIEppQlggZm9ybWF0ICg8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lKQotICAgICAqIEBwYXJhbSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiBiaW5kaW5nIGRlZmluaXRpb24KLSAgICAgKiBAcGFyYW0gbWFwICAgICBxdWFsaWZpZWQgbmFtZSB0byBlbGVtZW50IG1hcAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXJFbGVtZW50KG9yZy5qaWJ4LnJ1bnRpbWUuUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudEJhc2UgZWxlbWVudCwgTWFwIG1hcCkgewotICAgICAgICBpZiAocW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFwLnB1dChuZXcgUU5hbWUocW5hbWUuZ2V0VXJpKCksIHFuYW1lLmdldE5hbWUoKSksIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgZGVmYXVsdCBuYW1lc3BhY2Ugd2l0aGluIGEgbGlzdCBvZiBKaUJYIGJpbmRpbmcgbW9kZWwgZWxlbWVudHMgcG9zc2libHkgaW5jbHVkaW5nCi0gICAgICogbmFtZXNwYWNlIGRlZmluaXRpb25zLiBPbmNlIGEgbm9uLW5hbWVzcGFjZSBkZWZpbml0aW9uIGVsZW1lbnQgaXMgc2VlbiBpbiB0aGUgbGlzdCwgdGhpcyBqdXN0Ci0gICAgICogcmV0dXJucyAoc2luY2UgdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9ucyBhbHdheXMgY29tZSBmaXJzdCBpbiBKaUJYJ3MgYmluZGluZyBmb3JtYXQpLgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZXIgaXRlcmF0b3IgZm9yIGVsZW1lbnRzIGluIGxpc3QKLSAgICAgKiBAcGFyYW0gZG5zICBkZWZhdWx0IG5hbWVzcGFjZSBpZiBub3Qgb3ZlcnJpZGRlbgotICAgICAqIEByZXR1cm4gZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZERlZmF1bHROUyhJdGVyYXRvciBpdGVyLCBTdHJpbmcgZG5zKSB7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgRWxlbWVudEJhc2UgY2hpbGQgPSAoRWxlbWVudEJhc2UpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQudHlwZSgpID09IEVsZW1lbnRCYXNlLk5BTUVTUEFDRV9FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgTmFtZXNwYWNlRWxlbWVudCBuYW1lc3BhY2UgPSAoTmFtZXNwYWNlRWxlbWVudCljaGlsZDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdE5hbWUgPSBuYW1lc3BhY2UuZ2V0RGVmYXVsdE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoImVsZW1lbnRzIi5lcXVhbHMoZGVmYXVsdE5hbWUpIHx8ICJhbGwiLmVxdWFscyhkZWZhdWx0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZS5nZXRVcmkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgZm9yIGhhbmRsaW5nIHByZXZhbGlkYXRpb24gb2YgaW5jbHVkZSBlbGVtZW50cyBvbmx5LiBVbmxpa2UgdGhlIG5vcm1hbCBKaUJYCi0gICAgICogYmluZGluZyBkZWZpbml0aW9uIHByZXZhbGlkYXRpb24gc3RlcCwgdGhpcyB2aXNpdG9yIGlnbm9yZXMgZXZlcnl0aGluZyBleGNlcHQgaW5jbHVkZQotICAgICAqIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSW5jbHVkZVByZXZhbGlkYXRpb25WaXNpdG9yIGV4dGVuZHMgTW9kZWxWaXNpdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uQ29udGV4dCBtX2NvbnRleHQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBJbmNsdWRlUHJldmFsaWRhdGlvblZpc2l0b3IoVmFsaWRhdGlvbkNvbnRleHQgdmN0eCkgewotICAgICAgICAgICAgbV9jb250ZXh0ID0gdmN0eDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgKiBAc2VlIG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuTW9kZWxWaXNpdG9yI3Zpc2l0KG9yZy5qaWJ4LmJpbmRpbmcubW9kZWwuRWxlbWVudEJhc2UpCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KEluY2x1ZGVFbGVtZW50IG5vZGUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yY2UgY3JlYXRpb24gb2YgZGVmaW50aW9ucyBjb250ZXh0IGZvciBjb250YWluaW5nIGJpbmRpbmcKLSAgICAgICAgICAgICAgICBtX2NvbnRleHQuZ2V0Rm9ybWF0RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBub2RlLnByZXZhbGlkYXRlKG1fY29udGV4dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIG1fY29udGV4dC5hZGRGYXRhbCgiRXJyb3IgZHVyaW5nIHZhbGlkYXRpb246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOYW1lZFBhcmFtZXRlclR5cGVNYXBwZXIgZXh0ZW5kcyBKYXZhVHlwZU1hcHBlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIHJlYWwgcGFyYW1ldGVyIG5hbWUsIG5vdCBhIGR1bW15LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgICAgICogQHJldHVybiBsb2NhbCBwYXJ0IG9mIG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyTmFtZShRTmFtZSBxbmFtZSkgewotICAgICAgICAgICAgcmV0dXJuIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvc3JjL29yZy9hcGFjaGUvYXhpczIvamlieC9KaUJYRGF0YVNvdXJjZS5qYXZhIGIvMV81L21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0ppQlhEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMjYwNDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0ppQlhEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYng7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5JQmluZGluZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxhYmxlOwotaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5qaWJ4LnJ1bnRpbWUuSVhNTFdyaXRlcjsKLWltcG9ydCBvcmcuamlieC5ydW50aW1lLkppQlhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmppYngucnVudGltZS5pbXBsLlN0QVhXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKiBEYXRhIHNvdXJjZSBmb3IgT00gZWxlbWVudCBiYWNrZWQgYnkgSmlCWCBkYXRhIGJvdW5kIG9iamVjdC4gKi8KLXB1YmxpYyBjbGFzcyBKaUJYRGF0YVNvdXJjZSBpbXBsZW1lbnRzIE9NRGF0YVNvdXJjZSB7Ci0gICAgCi0gICAgLyoqIE1hcHBpbmcgbmFtZSwgZm9yIHdoZW4gYWJzdHJhY3QgbWFwcGluZyBpcyB1c2VkIGRpcmVjdGx5OyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgdXNlZCkuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWFyc2hhbGxlck5hbWU7Ci0KLSAgICAvKiogRWxlbWVudCBuYW1lIChvbmx5IHVzZWQgd2l0aCB7QGxpbmsgI21hcnNoYWxsZXJOYW1lfSkuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWU7Ci0gICAgCi0gICAgLyoqIEVsZW1lbnQgbmFtZXNwYWNlIFVSSSAob25seSB1c2VkIHdpdGgge0BsaW5rICNtYXJzaGFsbGVyTmFtZX0pLiAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lc3BhY2U7Ci0KLSAgICAvKiogRWxlbWVudCBuYW1lc3BhY2UgcHJlZml4IChvbmx5IHVzZWQgd2l0aCB7QGxpbmsgI21hcnNoYWxsZXJOYW1lfSkuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZVByZWZpeDsKLSAgICAKLSAgICAvKiogRWxlbWVudCBuYW1lc3BhY2UgaW5kZXggKG9ubHkgdXNlZCB3aXRoIHtAbGluayAjbWFyc2hhbGxlck5hbWV9KS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBlbGVtZW50TmFtZXNwYWNlSW5kZXg7Ci0KLSAgICAvKiogSW5kZXhlcyBvZiBuYW1lc3BhY2VzIHRvIGJlIG9wZW5lZCAob25seSB1c2VkIHdpdGgge0BsaW5rICNtYXJzaGFsbGVyTmFtZX0pLiAqLwotICAgIHByaXZhdGUgZmluYWwgaW50W10gb3Blbk5hbWVzcGFjZUluZGV4ZXM7Ci0KLSAgICAvKiogUHJlZml4ZXMgb2YgbmFtZXNwYWNlcyB0byBiZSBvcGVuZWQgKG9ubHkgdXNlZCB3aXRoIHtAbGluayAjbWFyc2hhbGxlck5hbWV9KS4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG9wZW5OYW1lc3BhY2VQcmVmaXhlczsKLQotICAgIC8qKiBEYXRhIG9iamVjdCBmb3Igb3V0cHV0LiAqLwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGRhdGFPYmplY3Q7Ci0KLSAgICAvKiogQmluZGluZyBmYWN0b3J5IGZvciBjcmVhdGluZyBtYXJzaGFsbGVyLiAqLwotICAgIHByaXZhdGUgZmluYWwgSUJpbmRpbmdGYWN0b3J5IGJpbmRpbmdGYWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZnJvbSBtYXJzaGFsbGFibGUgb2JqZWN0IGFuZCBiaW5kaW5nIGZhY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSmlCWERhdGFTb3VyY2UoSU1hcnNoYWxsYWJsZSBvYmosIElCaW5kaW5nRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIG1hcnNoYWxsZXJOYW1lID0gbnVsbDsKLSAgICAgICAgZGF0YU9iamVjdCA9IG9iajsKLSAgICAgICAgYmluZGluZ0ZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICBlbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgZWxlbWVudE5hbWVzcGFjZUluZGV4ID0gLTE7Ci0gICAgICAgIG9wZW5OYW1lc3BhY2VJbmRleGVzID0gbnVsbDsKLSAgICAgICAgb3Blbk5hbWVzcGFjZVByZWZpeGVzID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmcm9tIG9iamVjdCB3aXRoIG1hcHBpbmcgaW5kZXggYW5kIGJpbmRpbmcgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmoKLSAgICAgKiBAcGFyYW0gbWFwcGluZwotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKiBAcGFyYW0gbnNpbmRleGVzCi0gICAgICogQHBhcmFtIG5zcHJlZml4ZXMKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqLwotICAgIHB1YmxpYyBKaUJYRGF0YVNvdXJjZShPYmplY3Qgb2JqLCBTdHJpbmcgbWFwcGluZywgU3RyaW5nIG5hbWUsIFN0cmluZyB1cmksIFN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIG5zaW5kZXhlcywgU3RyaW5nW10gbnNwcmVmaXhlcywgSUJpbmRpbmdGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKG1hcHBpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3Ci0gICAgICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWFwcGluZyBuYW1lIG11c3QgYmUgc3VwcGxpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBtYXJzaGFsbGVyTmFtZSA9IG1hcHBpbmc7Ci0gICAgICAgIGRhdGFPYmplY3QgPSBvYmo7Ci0gICAgICAgIGJpbmRpbmdGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmdbXSBuc3MgPSBmYWN0b3J5LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgaW50IG5zaWR4ID0gLTE7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNpbmRleGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyhuc3NbbnNpbmRleGVzW2ldXSkpIHsKLSAgICAgICAgICAgICAgICBuc2lkeCA9IG5zaW5kZXhlc1tpXTsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBuc3ByZWZpeGVzW2ldOwotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbGVtZW50TmFtZSA9IG5hbWU7Ci0gICAgICAgIGVsZW1lbnROYW1lc3BhY2UgPSB1cmk7Ci0gICAgICAgIGVsZW1lbnROYW1lc3BhY2VQcmVmaXggPSBwcmVmaXg7Ci0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnNzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMobnNzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICBuc2lkeCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuc2lkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50W10gaWNweSA9IG5ldyBpbnRbbnNpbmRleGVzLmxlbmd0aCsxXTsKLSAgICAgICAgICAgICAgICBpY3B5WzBdID0gbnNpZHg7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuc2luZGV4ZXMsIDAsIGljcHksIDEsIG5zaW5kZXhlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG5zaW5kZXhlcyA9IGljcHk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gc2NweSA9IG5ldyBTdHJpbmdbbnNwcmVmaXhlcy5sZW5ndGgrMV07Ci0gICAgICAgICAgICAgICAgc2NweVswXSA9IHByZWZpeDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG5zcHJlZml4ZXMsIDAsIHNjcHksIDEsIG5zcHJlZml4ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBuc3ByZWZpeGVzID0gc2NweTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmFtZXNwYWNlIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnROYW1lc3BhY2VJbmRleCA9IG5zaWR4OwotICAgICAgICBvcGVuTmFtZXNwYWNlSW5kZXhlcyA9IG5zaW5kZXhlczsKLSAgICAgICAgb3Blbk5hbWVzcGFjZVByZWZpeGVzID0gbnNwcmVmaXhlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gaGFuZGxlIHRoZSBhY3R1YWwgbWFyc2hhbGxpbmcuIElmIHRoZSBzb3VyY2Ugb2JqZWN0IGlzIG1hcnNoYWxsYWJsZSBpdCdzCi0gICAgICogaXQncyBqdXN0IG1hcnNoYWxsZWQgZGlyZWN0bHksIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgcmVkdW5kYW50IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYW5kCi0gICAgICogc3VjaC4gSWYgaXQgbmVlZHMgdG8gYmUgaGFuZGxlZCB3aXRoIGFuIGFic3RyYWN0IG1hcHBpbmcsIHRoZSBoYW5kbGluZyBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotICAgICAqICdmdWxsJyBmbGFnLiBXaGVuIHRoaXMgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYWxsIG5hbWVzcGFjZXMgYXJlIGRlY2xhcmVkIGRpcmVjdGx5LCB3aGlsZSBpZgotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGUgbmFtZXNwYWNlcyBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIGRlY2xhcmVkIG9uIHNvbWUgZW5jbG9zaW5nCi0gICAgICogZWxlbWVudCBvZiB0aGUgb3V0cHV0LiBUaGlzIGFsbG93cyB0aGUgbm9ybWFsIGNhc2Ugb2YgbWFyc2hhbGxpbmcgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEKLSAgICAgKiBTT0FQIG1lc3NhZ2UgdG8gYmUgaGFuZGxlZCBlZmZpY2llbnRseSwgd2hpbGUgc3RpbGwgZ2VuZXJhdGluZyBjb3JyZWN0IFhNTCBpZiB0aGUgZWxlbWVudCBpcwotICAgICAqIG1hcnNoYWxsZWQgZGlyZWN0bHkgKGFzIHdoZW4gYnVpbGRpbmcgdGhlIEFYSU9NIHJlcHJlc2VudGF0aW9uIGZvciB1c2UgYnkgV1MtU2VjdXJpdHkpLgotICAgICAqIAotICAgICAqIEBwYXJhbSBmdWxsCi0gICAgICogQHBhcmFtIGN0eAotICAgICAqIEB0aHJvd3MgSmlCWEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtYXJzaGFsKGJvb2xlYW4gZnVsbCwgSU1hcnNoYWxsaW5nQ29udGV4dCBjdHgpIHRocm93cyBKaUJYRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1hcnNoYWxsZXJOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdCBpbnN0YW5jZW9mIElNYXJzaGFsbGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKChJTWFyc2hhbGxhYmxlKWRhdGFPYmplY3QpLm1hcnNoYWwoY3R4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPYmplY3Qgb2YgY2xhc3MgIiArIGRhdGFPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBuZWVkcyBhIEppQlggPG1hcHBpbmc+IHRvIGJlIG1hcnNoYWxsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIElYTUxXcml0ZXIgd3J0ciA9IGN0eC5nZXRYbWxXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnROYW1lOwotICAgICAgICAgICAgICAgIGludCBuc2lkeCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGZ1bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmUgYWxsIG5hbWVzcGFjZXMgb24gc3RhcnQgdGFnCi0gICAgICAgICAgICAgICAgICAgIG5zaWR4ID0gZWxlbWVudE5hbWVzcGFjZUluZGV4OwotICAgICAgICAgICAgICAgICAgICB3cnRyLnN0YXJ0VGFnTmFtZXNwYWNlcyhuc2lkeCwgbmFtZSwgb3Blbk5hbWVzcGFjZUluZGV4ZXMsIG9wZW5OYW1lc3BhY2VQcmVmaXhlcyk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmUgd3JpdGVyIHdpdGggbmFtZXNwYWNlIGRlY2xhcmVkIGluIGVuY2xvc2luZyBzY29wZQotICAgICAgICAgICAgICAgICAgICB3cnRyLm9wZW5OYW1lc3BhY2VzKG9wZW5OYW1lc3BhY2VJbmRleGVzLCBvcGVuTmFtZXNwYWNlUHJlZml4ZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhlbGVtZW50TmFtZXNwYWNlUHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnROYW1lc3BhY2VQcmVmaXggKyAnOicgKyBuYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdydHIuc3RhcnRUYWdPcGVuKDAsIG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBtYXJzaGFsIG9iamVjdCByZXByZXNlbnRhdGlvbiAobWF5IGluY2x1ZGUgYXR0cmlidXRlcykgaW50byBlbGVtZW50Ci0gICAgICAgICAgICAgICAgSU1hcnNoYWxsZXIgbXJzaCA9IGN0eC5nZXRNYXJzaGFsbGVyKG1hcnNoYWxsZXJOYW1lKTsKLSAgICAgICAgICAgICAgICBtcnNoLm1hcnNoYWwoZGF0YU9iamVjdCwgY3R4KTsKLSAgICAgICAgICAgICAgICB3cnRyLmVuZFRhZyhuc2lkeCwgbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdHguZ2V0WG1sV3JpdGVyKCkuZmx1c2goKTsKLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSmlCWEV4Y2VwdGlvbigiRXJyb3IgbWFyc2hhbGxpbmcgWE1MIHJlcHJlc2VudGF0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ujc2VyaWFsaXplKGphdmEuaW8uT3V0cHV0U3RyZWFtLCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBtYXJzaGFsIHdpdGggYWxsIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIHNpbmNlIGV4dGVybmFsIHN0YXRlIHVua25vd24KLSAgICAgICAgICAgIElNYXJzaGFsbGluZ0NvbnRleHQgY3R4ID0gYmluZGluZ0ZhY3RvcnkuY3JlYXRlTWFyc2hhbGxpbmdDb250ZXh0KCk7Ci0gICAgICAgICAgICBjdHguc2V0T3V0cHV0KG91dHB1dCwgZm9ybWF0ID09IG51bGwgPyBudWxsIDogZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpKTsKLSAgICAgICAgICAgIG1hcnNoYWwodHJ1ZSwgY3R4KTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChKaUJYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkVycm9yIGluIEppQlggbWFyc2hhbGxpbmc6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YS5pby5Xcml0ZXIsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXIsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG1hcnNoYWwgd2l0aCBhbGwgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgc2luY2UgZXh0ZXJuYWwgc3RhdGUgdW5rbm93bgotICAgICAgICAgICAgSU1hcnNoYWxsaW5nQ29udGV4dCBjdHggPSBiaW5kaW5nRmFjdG9yeS5jcmVhdGVNYXJzaGFsbGluZ0NvbnRleHQoKTsKLSAgICAgICAgICAgIGN0eC5zZXRPdXRwdXQod3JpdGVyKTsKLSAgICAgICAgICAgIG1hcnNoYWwodHJ1ZSwgY3R4KTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChKaUJYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkVycm9yIGluIEppQlggbWFyc2hhbGxpbmc6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSNzZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjaGVjayBpZiBuYW1lc3BhY2VzIGFscmVhZHkgZGVjbGFyZWQgZm9yIGFic3RyYWN0IG1hcHBpbmcKLSAgICAgICAgICAgIGJvb2xlYW4gZnVsbCA9IHRydWU7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuc3MgPSBiaW5kaW5nRmFjdG9yeS5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBpZiAobWFyc2hhbGxlck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB4bWxXcml0ZXIuZ2V0UHJlZml4KGVsZW1lbnROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50TmFtZXNwYWNlUHJlZml4LmVxdWFscyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZ1bGwgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVuTmFtZXNwYWNlSW5kZXhlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG5zc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHhtbFdyaXRlci5nZXRQcmVmaXgodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3Blbk5hbWVzcGFjZVByZWZpeGVzW2ldLmVxdWFscyhwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIG1hcnNoYWwgd2l0aCBhbGwgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgc2luY2UgZXh0ZXJuYWwgc3RhdGUgdW5rbm93bgotICAgICAgICAgICAgSVhNTFdyaXRlciB3cml0ZXIgPSBuZXcgU3RBWFdyaXRlcihuc3MsIHhtbFdyaXRlcik7Ci0gICAgICAgICAgICBJTWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9IGJpbmRpbmdGYWN0b3J5LmNyZWF0ZU1hcnNoYWxsaW5nQ29udGV4dCgpOwotICAgICAgICAgICAgY3R4LnNldFhtbFdyaXRlcih3cml0ZXIpOwotICAgICAgICAgICAgbWFyc2hhbChmdWxsLCBjdHgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEppQlhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiRXJyb3IgaW4gSmlCWCBtYXJzaGFsbGluZzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlI2dldFJlYWRlcigpCi0gICAgICovCi0gICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgc2VyaWFsaXplKGJvcywgbnVsbCk7Ci0gICAgICAgIHJldHVybiBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib3MudG9CeXRlQXJyYXkoKSkpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvTnVsbEJpbmRpbmdGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9qaWJ4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2ppYngvTnVsbEJpbmRpbmdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjQzNWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L051bGxCaW5kaW5nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYng7Ci0KLWltcG9ydCBvcmcuamlieC5ydW50aW1lLklCaW5kaW5nRmFjdG9yeTsKLWltcG9ydCBvcmcuamlieC5ydW50aW1lLmltcGwuQmluZGluZ0ZhY3RvcnlCYXNlOwotCi0vKioKLSAqIER1bW15IGJpbmRpbmcgZmFjdG9yeSBmb3Igd2hlbiB0aGUgZ2VuZXJhdGVkIEF4aXMyIGxpbmthZ2UgY29kZSB1c2VzIG9ubHkgc2ltcGxlIHZhbHVlCi0gKiBjb252ZXJzaW9ucyAoYW5kIGhlbmNlIGRvZXNuJ3QgbmVlZCBhIHJlYWwgSmlCWCBiaW5kaW5nKS4KLSAqLwotcHVibGljIGNsYXNzIE51bGxCaW5kaW5nRmFjdG9yeSBleHRlbmRzIEJpbmRpbmdGYWN0b3J5QmFzZSBpbXBsZW1lbnRzIElCaW5kaW5nRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9BUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0gICAgCi0gICAgcHVibGljIE51bGxCaW5kaW5nRmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoIm51bGwiLCAwLCAwLCAiIiwgIiIsICIiLCAiIiwgRU1QVFlfQVJSQVksIEVNUFRZX0FSUkFZLCAiIiwgIiIsCi0gICAgICAgICAgICBFTVBUWV9BUlJBWSwgIiIsICIiLCAiIiwgIiIsICIiLCBFTVBUWV9BUlJBWSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlckRpc3RyaWJ1dGlvbigpIHsKLSAgICAgICAgLy8gbm9ybWFsbHkgb25seSB1c2VkIGJ5IEJpbmRpbmdEaXJlY3RvcnkgY29kZSwgc28gb2theSB0byBwdW50Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbXBpbGVyVmVyc2lvbigpIHsKLSAgICAgICAgLy8gbm9ybWFsbHkgb25seSB1c2VkIGJ5IEJpbmRpbmdEaXJlY3RvcnkgY29kZSwgc28gb2theSB0byBwdW50Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHlwZUluZGV4KFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3RlbXBsYXRlL0ppYlhEYXRhYmluZGluZ1RlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL2ppYngvc3JjL29yZy9hcGFjaGUvYXhpczIvamlieC90ZW1wbGF0ZS9KaWJYRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTJjMTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3RlbXBsYXRlL0ppYlhEYXRhYmluZGluZ1RlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDk2NSArMCwwIEBACi0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgotICA8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiLz4KLTwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBKaUJYIHRlbXBsYXRlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YWJpbmRlcnNbQGRidHlwZT0namlieCddIj4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbnRleHQiPnVua25vd248L3hzbDpwYXJhbT4KLSAgICAKLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImluaXRpYWxpemUtYmluZGluZyIvPgotCi0gICAgPCEtLSB3cmFwcGVkPSd0cnVlJyB1c2VzIG9yaWdpbmFsIGNvZGUsIHdyYXBwZWQ9J2ZhbHNlJyB1bndyYXBzIG1ldGhvZCBjYWxscyAtLT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAd3JhcHBlZCIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6aWYgdGVzdD0iJHdyYXBwZWQ9J3RydWUnIj4KLSAgICAgIAotICAgICAgPCEtLSBNVE9NIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IEppQlgsIGJ1dCBhcnJheSBtYXkgYmUgbmVlZGVkIC0tPgotICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlNjQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJiYXNlNjRFbGVtZW50cy9uYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgICA8eHNsOmlmIHRlc3Q9IiRiYXNlNjQiPgotICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcU5hbWVBcnJheSA9IHsKLSAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJhc2U2NEVsZW1lbnRzL25hbWUiPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSI+MSI+LDwveHNsOmlmPm5ldyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zLXVybCIvPiIsIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbG9jYWxOYW1lIi8+IikKLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgIH07Ci0gICAgICA8L3hzbDppZj4KLQotICAgICAgICAvKioKLSAgICAgICAgKiAgZ2V0IHRoZSBkZWZhdWx0IGVudmVsb3BlCi0gICAgICAgICovCi0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgfQotICAgICAgCi0gICAgPC94c2w6aWY+Ci0gICAgCi0gICAgPHhzbDppZiB0ZXN0PSIkd3JhcHBlZD0nZmFsc2UnIj4KLSAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGNvbnRleHQ9J21lc3NhZ2UtcmVjZWl2ZXInIj4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBtb2RlPSJtZXNzYWdlLXJlY2VpdmVyIiBzZWxlY3Q9ImRibWV0aG9kIi8+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkY29udGV4dD0naW50ZXJmYWNlLWltcGxlbWVudGF0aW9uJyI+Ci0gICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpc1N5bmMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvY2xhc3MvQGlzU3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzU3luYz0nMSciPgotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iaW50ZXJmYWNlLWltcGxlbWVudGF0aW9uIiBzZWxlY3Q9ImRibWV0aG9kIj48eHNsOndpdGgtcGFyYW0gbmFtZT0ic3luYyI+dHJ1ZTwveHNsOndpdGgtcGFyYW0+PC94c2w6YXBwbHktdGVtcGxhdGVzPgotICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaXNBc3luYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9jbGFzcy9AaXNBc3luYyIvPjwveHNsOnZhcmlhYmxlPgotICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJGlzQXN5bmM9JzEnIj4KLSAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9ImludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiIgc2VsZWN0PSJkYm1ldGhvZCI+PHhzbDp3aXRoLXBhcmFtIG5hbWU9InN5bmMiPmZhbHNlPC94c2w6d2l0aC1wYXJhbT48L3hzbDphcHBseS10ZW1wbGF0ZXM+Ci0gICAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgPC94c2w6aWY+Ci0gICAgCi0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iJGNvbnRleHQ9J21lc3NhZ2UtcmVjZWl2ZXInIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJvYmplY3Qtb3V0cHV0Ii8+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ib2JqZWN0LWZhdWx0Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRjb250ZXh0PSdpbnRlcmZhY2UtaW1wbGVtZW50YXRpb24nIj4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJvYmplY3QtaW5wdXQiLz4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0dWItdXRpbGl0eS1tZXRob2RzIi8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgIDwveHNsOmNob29zZT4KLSAgICAKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLQotICB0b09NIEFORCB0b0VudmVsb3BlIE1FVEhPRCBHRU5FUkFUSU9OCi0gIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJvYmplY3QtaW5wdXR8b2JqZWN0LW91dHB1dCI+Ci0KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB0b09NKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBwYXJhbSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnksIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KSB7Ci0gICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idG9PTS1tZXRob2QtYm9keSIvPgotICAgICAgICB9Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b0VudmVsb3BlLW1ldGhvZCIvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im9iamVjdC1mYXVsdCI+Ci0KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCB0b09NKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiBwYXJhbSwgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkgPSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRvT00tbWV0aG9kLWJvZHkiLz4KLSAgICAgICAgfQotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbmFtZT0idG9PTS1tZXRob2QtYm9keSI+Ci0gICAgICAgICAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBvcmcuamlieC5ydW50aW1lLklNYXJzaGFsbGFibGUpewotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJpbmRpbmdFcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKG1hcHBlZENoaWxkKHBhcmFtLCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGJpbmQgbnVsbCB2YWx1ZSBvZiB0eXBlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gSmlCWCAmbHQ7bWFwcGluZz4gZGVmaW5lZCBmb3IgY2xhc3MgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+Iik7Ci0gICAgICAgICAgICB9Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0b0VudmVsb3BlLW1ldGhvZCI+Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtLCBib29sZWFuIG9wdGltaXplQ29udGVudCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHRvT00ocGFyYW0sIGZhY3RvcnksIG9wdGltaXplQ29udGVudCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgICB9Ci0KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLQotICBNRVNTQUdFIFJFQ0VJVkVSIE1FVEhPRCBHRU5FUkFUSU9OCi0gIC0tPgotICAKLSAgPCEtLSBJbnZva2VkIGJ5IG1haW4gdGVtcGxhdGUgdG8gaGFuZGxlIHVud3JhcHBlZCBtZXRob2QgZ2VuZXJhdGlvbiBmb3IgbWVzc2FnZSByZWNlaXZlciAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGJtZXRob2QiIG1vZGU9Im1lc3NhZ2UtcmVjZWl2ZXIiPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibWV0aG9kLW5hbWUiIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+Ci0gICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJlY2VpdmVyLW5hbWUiLz4ob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZWxlbWVudCwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii8qL0Bza2VsZXRvbkludGVyZmFjZU5hbWUiLz4gc2tlbCwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3RvcnkpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdAotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9pbnRlcmZhY2UvbWV0aG9kW0BuYW1lPSRtZXRob2QtbmFtZV0vZmF1bHQvcGFyYW0iPiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC94c2w6Zm9yLWVhY2g+Ci0gICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0IHVjdHggPSBnZXROZXdVbm1hcnNoYWxDb250ZXh0KGVsZW1lbnQpOwotICAgICAgICAgICAgICB1Y3R4Lm5leHQoKTsKLSAgICAgICAgICAgICAgaW50IGluZGV4OwotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iaW4td3JhcHBlci9wYXJhbWV0ZXItZWxlbWVudCIgbW9kZT0ibWVzc2FnZS1yZWNlaXZlciIvPgotICAgIAotICAgIDwhLS0gYWN0dWFsIGNhbGwgaGFuZGxpbmcgZGVwZW5kcyBvbiB0eXBlIG9mIHJldHVybmVkIHJlc3VsdCAtLT4KLSAgICA8eHNsOmNob29zZT4KLSAgICAKLSAgICAgIDwhLS0gcmV0dXJuaW5nIGFuIGFycmF5IG9mIHZhbHVlcyAtLT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9AZW1wdHk9J2ZhbHNlJyBhbmQgb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGFycmF5PSd0cnVlJyI+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlci11cmkiIHNlbGVjdD0ib3V0LXdyYXBwZXIvQG5zIi8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0id3JhcHBlci1wcmVmaXgiIHNlbGVjdD0ib3V0LXdyYXBwZXIvQHByZWZpeCIvPgotICAgICAgICAgICAgICBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHdyYXBwZXIgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSckd3JhcHBlci11cmknLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXByZWZpeCcvPiIpOwotICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCR3cmFwcGVyLXByZWZpeCkpID0gMCI+Ci0gICAgICAgICAgICB3cmFwcGVyLmRlY2xhcmVEZWZhdWx0TmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItdXJpJy8+Iik7Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9Im91dC13cmFwcGVyL0BuZWVkLW5hbWVzcGFjZXM9J3RydWUnIj4KLSAgICAgICAgICAgICAgYWRkTWFwcGluZ05hbWVzcGFjZXMoZmFjdG9yeSwgd3JhcHBlciwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSckd3JhcHBlci11cmknLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXByZWZpeCcvPiIpOwotICAgICAgICA8L3hzbDppZj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChvdXQtd3JhcHBlci9leHRyYS1uYW1lc3BhY2UpICZndDsgMCI+Ci0gICAgICAgICAgICAgIHdyYXBwZXIuZGVjbGFyZU5hbWVzcGFjZShmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvZXh0cmEtbmFtZXNwYWNlL0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvZXh0cmEtbmFtZXNwYWNlL0BwcmVmaXgnLz4iKSk7Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQod3JhcHBlcik7Ci0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AamF2YS10eXBlIi8+W10gcmVzdWx0cyA9IHNrZWwuPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNhbGwtYXJnLWxpc3QiLz47Ci0gICAgICAgICAgICAgIGlmIChyZXN1bHRzID09IG51bGwgfHwgcmVzdWx0cy5sZW5ndGggPT0gMCkgewotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG9wdGlvbmFsPSd0cnVlJyIvPgotICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJNaXNzaW5nIHJlcXVpcmVkIHJlc3VsdCIpOwotICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGZvcm09J2NvbXBsZXgnIj4KLSAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgcmVzdWx0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AamF2YS10eXBlIi8+IHJlc3VsdCA9IHJlc3VsdHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BvcHRpb25hbD0ndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IHNraXAgb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5pbGxhYmxlPSd0cnVlJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AcHJlZml4Jy8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgeHNpbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZGVjbGFyZU5hbWVzcGFjZSh4c2lucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmFkZEF0dHJpYnV0ZSgibmlsIiwgInRydWUiLCB4c2lucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJOdWxsIHZhbHVlIGluIHJlc3VsdCBhcnJheSBub3QgYWxsb3dlZCB1bmxlc3MgZWxlbWVudCBoYXMgbmlsbGFibGU9J3RydWUnIik7Ci0gICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0ZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYmluZGluZ0Vycm9yTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGZvcm09J2NvbXBsZXgnIGFuZCBvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AdHlwZS1pbmRleD0nJyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQobWFwcGVkQ2hpbGQocmVzdWx0LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBzcmMgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LkppQlhEYXRhU291cmNlKHJlc3VsdCwgX3R5cGVfbmFtZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AdHlwZS1pbmRleCIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AcHJlZml4Jy8+IiwgYmluZGluZ05hbWVzcGFjZUluZGV4ZXMsIGJpbmRpbmdOYW1lc3BhY2VQcmVmaXhlcywgYmluZGluZ0ZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIGFwcG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BucycvPiIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChzcmMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5hbWUnLz4iLCBhcHBucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IHJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGphdmEtdHlwZSIvPiByZXN1bHQgPSByZXN1bHRzW2ldOwotICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AcHJlZml4Jy8+Iik7Ci0gICAgICAgICAgICA8eHNsOmNob29zZT4KLSAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BzZXJpYWxpemVyPScnIj4KLSAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zZXRUZXh0KHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc2V0VGV4dCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHNlcmlhbGl6ZXIiLz4ocmVzdWx0KSk7Ci0gICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgfQotICAgICAgPC94c2w6d2hlbj4KLSAgICAKLSAgICAgIDwhLS0gcmV0dXJuaW5nIGEgc2luZ2xlIHZhbHVlIC0tPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL0BlbXB0eT0nZmFsc2UnIj4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyLXVyaSIgc2VsZWN0PSJvdXQtd3JhcHBlci9AbnMiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ3cmFwcGVyLXByZWZpeCIgc2VsZWN0PSJvdXQtd3JhcHBlci9AcHJlZml4Ii8+Ci0gICAgICAgICAgICAgIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgd3JhcHBlciA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXVyaScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItcHJlZml4Jy8+Iik7Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJHdyYXBwZXItcHJlZml4KSkgPSAwIj4KLSAgICAgICAgICAgIHdyYXBwZXIuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSckd3JhcHBlci11cmknLz4iKTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0ib3V0LXdyYXBwZXIvQG5lZWQtbmFtZXNwYWNlcz0ndHJ1ZSciPgotICAgICAgICAgICAgICBhZGRNYXBwaW5nTmFtZXNwYWNlcyhmYWN0b3J5LCB3cmFwcGVyLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9JyR3cmFwcGVyLXVyaScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nJHdyYXBwZXItcHJlZml4Jy8+Iik7Ci0gICAgICAgIDwveHNsOmlmPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KG91dC13cmFwcGVyL2V4dHJhLW5hbWVzcGFjZSkgJmd0OyAwIj4KLSAgICAgICAgICAgICAgd3JhcHBlci5kZWNsYXJlTmFtZXNwYWNlKGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9leHRyYS1uYW1lc3BhY2UvQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9leHRyYS1uYW1lc3BhY2UvQHByZWZpeCcvPiIpKTsKLSAgICAgICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BqYXZhLXR5cGUiLz4gcmVzdWx0ID0gc2tlbC48eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY2FsbC1hcmctbGlzdCIvPjsKLSAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0Bmb3JtPSdjb21wbGV4JyI+Ci0gICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ab3B0aW9uYWw9J3RydWUnIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBza2lwIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuaWxsYWJsZT0ndHJ1ZSciPgotICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BwcmVmaXgnLz4iKTsKLSAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UgeHNpbnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKLSAgICAgICAgICAgICAgICAgIGNoaWxkLmRlY2xhcmVOYW1lc3BhY2UoeHNpbnMpOwotICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkQXR0cmlidXRlKCJuaWwiLCAidHJ1ZSIsIHhzaW5zKTsKLSAgICAgICAgICAgICAgICAgIHdyYXBwZXIuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTWlzc2luZyByZXF1aXJlZCByZXN1bHQiKTsKLSAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihiaW5kaW5nRXJyb3JNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGZvcm09J2NvbXBsZXgnIGFuZCBvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AdHlwZS1pbmRleD0nJyI+Ci0gICAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZENoaWxkKG1hcHBlZENoaWxkKHJlc3VsdCwgZmFjdG9yeSkpOwotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlIHNyYyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmppYnguSmlCWERhdGFTb3VyY2UocmVzdWx0LCBfdHlwZV9uYW1lPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0B0eXBlLWluZGV4Ii8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BwcmVmaXgnLz4iLCBiaW5kaW5nTmFtZXNwYWNlSW5kZXhlcywgYmluZGluZ05hbWVzcGFjZVByZWZpeGVzLCBiaW5kaW5nRmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIGFwcG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BucycvPiIsICIiKTsKLSAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoc3JjLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BuYW1lJy8+IiwgYXBwbnMpOwotICAgICAgICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGNoaWxkID0gZmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AbmFtZScvPiIsICAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHByZWZpeCcvPiIpOwotICAgICAgICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ab2JqZWN0PSd0cnVlJyI+Ci0gICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSB4c2lucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICAgICAgICAgICAgY2hpbGQuZGVjbGFyZU5hbWVzcGFjZSh4c2lucyk7Ci0gICAgICAgICAgICAgICAgICBjaGlsZC5hZGRBdHRyaWJ1dGUoIm5pbCIsICJ0cnVlIiwgeHNpbnMpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZXQtcmVzdWx0LXRleHQiLz4KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICA8L3hzbDp3aGVuPgotICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2V0LXJlc3VsdC10ZXh0Ii8+Ci0gICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgICAgICA8L3hzbDpjaG9vc2U+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgIAotICAgICAgPCEtLSBub3QgcmV0dXJuaW5nIGFueXRoaW5nIC0tPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICAgIHNrZWwuPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNhbGwtYXJnLWxpc3QiLz47Ci0gICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQob3V0LXdyYXBwZXIpJmd0OzAiPgotICAgICAgICAgICAgICBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbnMnLz4iLCAiIikpOwotICAgICAgICA8L3hzbDppZj4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIAotICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICB9IGNhdGNoIChvcmcuamlieC5ydW50aW1lLkppQlhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBlbnZlbG9wZTsKLSAgICAgIH0KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG5hbWU9InNldC1yZXN1bHQtdGV4dCI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHNlcmlhbGl6ZXI9JyciPgotICAgICAgICAgICAgICBjaGlsZC5zZXRUZXh0KHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgICAgY2hpbGQuc2V0VGV4dCg8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQHNlcmlhbGl6ZXIiLz4ocmVzdWx0PHhzbDppZiB0ZXN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9Ad3JhcHBlZC1wcmltaXRpdmU9J3RydWUnIj4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0B2YWx1ZS1tZXRob2QiLz4oKTwveHNsOmlmPikpOwotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIEdlbmVyYXRlIGFyZ3VtZW50IGxpc3QgZm9yIG1lc3NhZ2UgcmVjZWl2ZXIgY2FsbCB0byBhY3R1YWwgaW1wbGVtZW50YXRpb24gbWV0aG9kLiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjYWxsLWFyZy1saXN0Ij4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+KAotICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbi13cmFwcGVyL3BhcmFtZXRlci1lbGVtZW50Ij4KLSAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSZndDsxIj4sIDwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+Ci0gICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgKQotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIHBhcmFtZXRlciBlbGVtZW50IGluIGEgbWVzc2FnZSByZWNlaXZlciBtZXRob2QgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBhcmFtZXRlci1lbGVtZW50IiBtb2RlPSJtZXNzYWdlLXJlY2VpdmVyIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXk9J3RydWUnIj4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVubWFyc2hhbC1hcnJheSIvPgotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW5tYXJzaGFsLXZhbHVlIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIAotICA8IS0tIAotICBDTElFTlQgU1RVQiBVTldSQVBQRUQgTUVUSE9EIEdFTkVSQVRJT04KLSAgLS0+Ci0gIAotICA8IS0tIEludm9rZWQgYnkgbWFpbiB0ZW1wbGF0ZSB0byBoYW5kbGUgdW53cmFwcGVkIG1ldGhvZCBnZW5lcmF0aW9uIGZvciBzeW5jaHJvbm91cyBjbGllbnQgc3R1YiAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGJtZXRob2QiIG1vZGU9ImludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiI+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJzeW5jIj5lcnJvcjwveHNsOnBhcmFtPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW50ZXJmYWNlTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9jbGFzcy9AaW50ZXJmYWNlTmFtZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9jbGFzcy9AcGFja2FnZSIvPjwveHNsOnZhcmlhYmxlPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icmV0dXJuLWJhc2UtdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50L0BqYXZhLXR5cGUiLz48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InJldHVybi1mdWxsLXR5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmV0dXJuLWJhc2UtdHlwZSIvPjx4c2w6aWYgdGVzdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGFycmF5PSd0cnVlJyI+W108L3hzbDppZj48L3hzbDp2YXJpYWJsZT4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im1ldGhvZC1uYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0gICAgCi0gICAgICAgIC8qKgotICAgIDx4c2w6aWYgdGVzdD0iJHN5bmM9J3RydWUnIj4KLSAgICAgICAgICogQXV0byBnZW5lcmF0ZWQgc3luY2hyb25vdXMgY2FsbCBtZXRob2QKLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW50ZXJmYWNlTmFtZSIvPiM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbi13cmFwcGVyL3BhcmFtZXRlci1lbGVtZW50Ij4KLSAgICAgICAgICogQHBhcmFtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+PC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgPHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKCRyZXR1cm4tZnVsbC10eXBlKSkgJmd0OyAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldHVybi1mdWxsLXR5cGUiLz48L3hzbDp3aGVuPjx4c2w6b3RoZXJ3aXNlPnZvaWQ8L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1ldGhvZC1uYW1lIi8+KAotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iJHN5bmM9J2ZhbHNlJyI+Ci0gICAgICAgICAqIEF1dG8gZ2VuZXJhdGVkIGFzeW5jaHJvbm91cyBjYWxsIG1ldGhvZAotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnRlcmZhY2VOYW1lIi8+I3N0YXJ0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXRob2QtbmFtZSIvPgotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iaW4td3JhcHBlci9wYXJhbWV0ZXItZWxlbWVudCI+Ci0gICAgICAgICAqIEBwYXJhbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPjwveHNsOmZvci1lYWNoPgotICAgIDx4c2w6aWYgdGVzdD0iJHN5bmM9J3RydWUnIj4KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvY2xhc3MvbWV0aG9kW0BuYW1lPSRtZXRob2QtbmFtZV0vZmF1bHQvcGFyYW0iPgotICAgICAgICAgKiBAdGhyb3dzIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPC94c2w6aWY+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz4oCi0gICAgPC94c2w6aWY+Ci0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpbi13cmFwcGVyL3BhcmFtZXRlci1lbGVtZW50Ij4KLSAgICAgICAgICA8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkmZ3Q7MSI+LCA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPjx4c2w6aWYgdGVzdD0iQGFycmF5PSd0cnVlJyI+W108L3hzbDppZj48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4KLSAgICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgPHhzbDppZiB0ZXN0PSIkc3luYz0nZmFsc2UnIj4KLSAgICAgICAgPHhzbDppZiB0ZXN0PSJpbi13cmFwcGVyL0BlbXB0eT0nZmFsc2UnIj4sIDwveHNsOmlmPmZpbmFsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvY2xhc3MvQGNhbGxiYWNrbmFtZSIvPiBfY2FsbGJhY2sKLSAgICA8L3hzbDppZj4KLSAgICAgICAgICAgICkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbgotICAgIDx4c2w6aWYgdGVzdD0iJHN5bmM9J3RydWUnIj4KLSAgICAgIDwhLS1hZGQgdGhlIGZhdWx0cy0tPgotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9jbGFzcy9tZXRob2RbQG5hbWU9JG1ldGhvZC1uYW1lXS9mYXVsdC9wYXJhbSI+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDpmb3ItZWFjaD4KLSAgICA8L3hzbDppZj4KLSAgICAgICAgICAgIHsKLSAgICA8IS0tIFNpbXBsZSBwYXJhbWV0ZXIgdmFsdWVzICh0aG9zZSB3aXRoIHNlcmlhbGl6ZXJzKSBjYW4gYmUgaGFuZGxlZCBieQotICAgICAgZGlyZWN0IGNvbnZlcnNpb24gdG8gZWxlbWVudHMuIENvbXBsZXggcGFyYW1ldGVyIHZhbHVlcyBuZWVkIHRvIHVzZSBkYXRhCi0gICAgICBzb3VyY2VzLiBUaGlzIGNvZGUgaGFuZGxlcyBib3RoIHR5cGVzLiAtLT4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50IF9vcEluZGV4ID0gPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iZ2V0LWluZGV4IiBzZWxlY3Q9Ii9jbGFzcy9tZXRob2RbQG5hbWU9JG1ldGhvZC1uYW1lXSI+PC94c2w6YXBwbHktdGVtcGxhdGVzPjsKLSAgICAgICAgICAgICAgICBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIG9wbmFtZSA9IF9vcGVyYXRpb25zW19vcEluZGV4XS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50IF9vcGVyYXRpb25DbGllbnQgPSBfc2VydmljZUNsaWVudC5jcmVhdGVDbGllbnQob3BuYW1lKTsKLSAgICAgICAgICAgICAgICBfb3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oIjx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9ImdldC1hY3Rpb24iIHNlbGVjdD0iL2NsYXNzL21ldGhvZFtAbmFtZT0kbWV0aG9kLW5hbWVdIj48L3hzbDphcHBseS10ZW1wbGF0ZXM+Iik7Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0RXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KHRydWUpOwotICAgIAotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBTT0FQIGVudmVsb3BlIHdpdGggdGhlIHBheWxvYWQKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudiA9IGNyZWF0ZUVudmVsb3BlKF9vcGVyYXRpb25DbGllbnQuZ2V0T3B0aW9ucygpKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkoX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuZ2V0U29hcFZlcnNpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgd3JhcHBlciA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9AbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J2luLXdyYXBwZXIvQHByZWZpeCcvPiIpOwotICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoaW4td3JhcHBlci9AcHJlZml4KSkgPSAwIj4KLSAgICAgICAgICAgICAgICB3cmFwcGVyLmRlY2xhcmVEZWZhdWx0TmFtZXNwYWNlKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9AbnMnLz4iKTsKLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmlmIHRlc3Q9ImluLXdyYXBwZXIvQG5lZWQtbmFtZXNwYWNlcz0ndHJ1ZSciPgotICAgICAgICAgICAgICAgIGFkZE1hcHBpbmdOYW1lc3BhY2VzKGZhY3RvcnksIHdyYXBwZXIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0naW4td3JhcHBlci9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J2luLXdyYXBwZXIvQHByZWZpeCcvPiIpOwotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iY291bnQoaW4td3JhcHBlci9leHRyYS1uYW1lc3BhY2UpICZndDsgMCI+Ci0gICAgICAgICAgICAgICAgd3JhcHBlci5kZWNsYXJlTmFtZXNwYWNlKGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdpbi13cmFwcGVyL2V4dHJhLW5hbWVzcGFjZS9AbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J2luLXdyYXBwZXIvZXh0cmEtbmFtZXNwYWNlL0BwcmVmaXgnLz4iKSk7Ci0gICAgPC94c2w6aWY+Ci0gICAgICAgICAgICAgICAgZW52LmdldEJvZHkoKS5hZGRDaGlsZCh3cmFwcGVyKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBjaGlsZDsKLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImluLXdyYXBwZXIvcGFyYW1ldGVyLWVsZW1lbnQiIG1vZGU9ImludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiIvPgotICAgIAotICAgICAgICAgICAgICAgIC8vIGFkZCBTT0FQIGhlYWRlcnMKLSAgICAgICAgICAgICAgICBfc2VydmljZUNsaWVudC5hZGRIZWFkZXJzVG9FbnZlbG9wZShlbnYpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlIGNvbnRleHQgd2l0aCB0aGF0IGVudmVsb3BlCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IF9tZXNzYWdlQ29udGV4dCA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBfbWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52KTsKLSAgICAKLSAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIG1lc3NhZ2UgY29udGV4dCB0byB0aGUgb3BlcmF0aW9uIGNsaWVudAotICAgICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuYWRkTWVzc2FnZUNvbnRleHQoX21lc3NhZ2VDb250ZXh0KTsKLSAgICAKLSAgICA8eHNsOmlmIHRlc3Q9IiRzeW5jPSd0cnVlJyI+Ci0gICAgICAgICAgICAgICAvLyBleGVjdXRlIHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5leGVjdXRlKHRydWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgPHhzbDppZiB0ZXN0PSJvdXQtd3JhcHBlci9AZW1wdHk9J2ZhbHNlJyI+Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0IF9yZXR1cm5NZXNzYWdlQ29udGV4dCA9IF9vcGVyYXRpb25DbGllbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VDb250ZXh0KG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IF9yZXNwb25zZSA9IF9yZXR1cm5NZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoX3Jlc3BvbnNlICE9IG51bGwgJmFtcDsmYW1wOyAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BuYW1lJy8+Ii5lcXVhbHMoX3Jlc3BvbnNlLmdldExvY2FsTmFtZSgpKSAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5zJy8+Ii5lcXVhbHMoX3Jlc3BvbnNlLmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICBvcmcuamlieC5ydW50aW1lLmltcGwuVW5tYXJzaGFsbGluZ0NvbnRleHQgdWN0eCA9IGdldE5ld1VubWFyc2hhbENvbnRleHQoX3Jlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgdWN0eC5wYXJzZVBhc3RTdGFydFRhZygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OwotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im91dC13cmFwcGVyL3JldHVybi1lbGVtZW50IiBtb2RlPSJpbnRlcmZhY2UtaW1wbGVtZW50YXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudC9AamF2YS1uYW1lIi8+OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTWlzc2luZyBleHBlY3RlZCByZXR1cm4gd3JhcHBlciBlbGVtZW50IHs8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5zJy8+fTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbmFtZScvPiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgIDwveHNsOmlmPgotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBFeGNlcHRpb24gb3V0ZXggPSBjb252ZXJ0RXhjZXB0aW9uKGUpOwotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii9jbGFzcy9tZXRob2RbQG5hbWU9JG1ldGhvZC1uYW1lXS9mYXVsdC9wYXJhbSI+Ci0gICAgICAgICAgICAgICAgaWYgKG91dGV4IGluc3RhbmNlb2YgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4pb3V0ZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgb3V0ZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG91dGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iJHN5bmM9J2ZhbHNlJyI+Ci0gICAgICAgICAgICAgICAgX29wZXJhdGlvbkNsaWVudC5zZXRDYWxsYmFjayhuZXcgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUob3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQgYXN5bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcmVzdWx0ID0gYXN5bmMuZ2V0UmVzcG9uc2VFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJmFtcDsmYW1wOyAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BuYW1lJy8+Ii5lcXVhbHMocmVzdWx0LmdldExvY2FsTmFtZSgpKSAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5zJy8+Ii5lcXVhbHMocmVzdWx0LmdldE5hbWVzcGFjZSgpLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamlieC5ydW50aW1lLmltcGwuVW5tYXJzaGFsbGluZ0NvbnRleHQgdWN0eCA9IGdldE5ld1VubWFyc2hhbENvbnRleHQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWN0eC5wYXJzZVBhc3RTdGFydFRhZygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nb3V0LXdyYXBwZXIvQG5hbWUnLz4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4OwotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJvdXQtd3JhcHBlci9yZXR1cm4tZWxlbWVudCIgbW9kZT0iaW50ZXJmYWNlLWltcGxlbWVudGF0aW9uIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYWxsYmFjay5yZWNlaXZlUmVzdWx0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBtZXRob2QtbmFtZSIvPig8eHNsOnZhbHVlLW9mIHNlbGVjdD0ib3V0LXdyYXBwZXIvcmV0dXJuLWVsZW1lbnQvQGphdmEtbmFtZSIvPik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0KCJNaXNzaW5nIGV4cGVjdGVkIHJlc3VsdCB3cmFwcGVyIGVsZW1lbnQgezx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdvdXQtd3JhcHBlci9AbnMnLz59PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J291dC13cmFwcGVyL0BuYW1lJy8+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NhbGxiYWNrLnJlY2VpdmVFcnJvcjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWV0aG9kLW5hbWUiLz4oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXRpbC5DYWxsYmFja1JlY2VpdmVyIF9jYWxsYmFja1JlY2VpdmVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoIF9vcGVyYXRpb25zW19vcEluZGV4XS5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsICZhbXA7JmFtcDsgX29wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgX2NhbGxiYWNrUmVjZWl2ZXIgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNhbGxiYWNrUmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgX29wZXJhdGlvbnNbX29wSW5kZXhdLnNldE1lc3NhZ2VSZWNlaXZlcihfY2FsbGJhY2tSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIGNsaWVudAotICAgICAgICAgICAgICAgIF9vcGVyYXRpb25DbGllbnQuZXhlY3V0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBvdXRleCA9IGNvbnZlcnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGU6ICIgKwotICAgICAgICAgICAgICAgICAgICBvdXRleC5nZXRDbGFzcygpLmdldE5hbWUoKSwgb3V0ZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgPC94c2w6aWY+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSBJbnZva2VkIHRvIGdldCB0aGUgb3BlcmF0aW9uIGluZGV4IG51bWJlciBmb3IgYSBtZXRob2QuIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZXRob2QiIG1vZGU9ImdldC1pbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvdW50KHByZWNlZGluZy1zaWJsaW5nOjptZXRob2QpIi8+PC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIEludm9rZWQgdG8gZ2V0IHRoZSBvcGVyYXRpb24gYWN0aW9uIGZvciBhIG1ldGhvZC4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Im1ldGhvZCIgbW9kZT0iZ2V0LWFjdGlvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzb2FwYWN0aW9uIi8+PC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIEdlbmVyYXRlIGNvZGUgZm9yIGEgcGFydGljdWxhciBwYXJhbWV0ZXIgZWxlbWVudCBpbiBhIGNsaWVudCBzdHViIG1ldGhvZCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icGFyYW1ldGVyLWVsZW1lbnQiIG1vZGU9ImludGVyZmFjZS1pbXBsZW1lbnRhdGlvbiI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGFycmF5PSd0cnVlJyI+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXJzaGFsLWFycmF5Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXJzaGFsLXZhbHVlIi8+Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDwhLS0gTWFyc2hhbCBhbiBhcnJheSB0byBhIHJlcGVhdGVkIGVsZW1lbnQgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0ibWFyc2hhbC1hcnJheSI+Ci0gICAgaWYgKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+ID09IG51bGwgfHwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4ubGVuZ3RoID09IDApIHsKLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3B0aW9uYWw9J3RydWUnIj4KLSAgICAgICAgICAvLyBqdXN0IHNraXAgb3B0aW9uYWwgZWxlbWVudAotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BwcmVmaXgnLz4iKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSB4c2lucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICBjaGlsZC5kZWNsYXJlTmFtZXNwYWNlKHhzaW5zKTsKLSAgICAgICAgY2hpbGQuYWRkQXR0cmlidXRlKCJuaWwiLCAidHJ1ZSIsIHhzaW5zKTsKLSAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQGphdmEtbmFtZScvPiIpOwotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPiBfaXRlbSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+W2ldOwotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBvYmplY3Q9J3RydWUnIGFuZCBAbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgICAgIGlmIChfaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BwcmVmaXgnLz4iKTsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIHhzaW5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7Ci0gICAgICAgICAgICAgICAgY2hpbGQuZGVjbGFyZU5hbWVzcGFjZSh4c2lucyk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuYWRkQXR0cmlidXRlKCJuaWwiLCAidHJ1ZSIsIHhzaW5zKTsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZXJpYWxpemUtdmFsdWUtdG8tY2hpbGQiLz4KLSAgICAgICAgICAgIH0KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQG9iamVjdD0ndHJ1ZSciPgotICAgICAgICAgICAgaWYgKF9pdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk51bGwgdmFsdWUgaW4gYXJyYXkgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BqYXZhLW5hbWUnLz4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZXJpYWxpemUtdmFsdWUtdG8tY2hpbGQiLz4KLSAgICAgICAgICAgIH0KLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcmlhbGl6ZS12YWx1ZS10by1jaGlsZCIvPgotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgfQotICAgIH0KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIE1hcnNoYWwgYSBzaW1wbGUgdmFsdWUgdG8gYSBub24tcmVwZWF0ZWQgZWxlbWVudCAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtYXJzaGFsLXZhbHVlIj4KLSAgICA8eHNsOmNob29zZT4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb2JqZWN0PSd0cnVlJyI+Ci0gICAgICAgIGlmICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPiA9PSBudWxsKSB7Ci0gICAgICAgIDx4c2w6Y2hvb3NlPgotICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAb3B0aW9uYWw9J3RydWUnIj4KLSAgICAgICAgICAgIC8vIGp1c3Qgc2tpcCBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQG5pbGxhYmxlPSd0cnVlJyI+Ci0gICAgICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQHByZWZpeCcvPiIpOwotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSB4c2lucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOwotICAgICAgICAgICAgY2hpbGQuZGVjbGFyZU5hbWVzcGFjZSh4c2lucyk7Ci0gICAgICAgICAgICBjaGlsZC5hZGRBdHRyaWJ1dGUoIm5pbCIsICJ0cnVlIiwgeHNpbnMpOwotICAgICAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgPC94c2w6d2hlbj4KLSAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KLSAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTnVsbCB2YWx1ZSBmb3IgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BqYXZhLW5hbWUnLz4iKTsKLSAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InNlcmlhbGl6ZS12YWx1ZS10by1jaGlsZCIvPgotICAgICAgICB9Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzZXJpYWxpemUtdmFsdWUtdG8tY2hpbGQiLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSBDb252ZXJ0IHRoZSBjdXJyZW50IHZhbHVlIHRvIGFuIGVsZW1lbnQuIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9InNlcmlhbGl6ZS12YWx1ZS10by1jaGlsZCI+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGphdmEtdHlwZT0namF2YS5sYW5nLlN0cmluZycgYW5kIEBzZXJpYWxpemVyPScnIj4KLSAgICAgICAgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BwcmVmaXgnLz4iKTsKLSAgICAgICAgY2hpbGQuc2V0VGV4dCg8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFyYW1ldGVyLW9yLWFycmF5LWl0ZW0iLz4pOwotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZm9ybT0nc2ltcGxlJyBhbmQgQHNlcmlhbGl6ZXI9JyciPgotICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQHByZWZpeCcvPiIpOwotICAgICAgICBjaGlsZC5zZXRUZXh0KDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXJhbWV0ZXItb3ItYXJyYXktaXRlbSIvPi50b1N0cmluZygpKTsKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J3NpbXBsZSciPgotICAgICAgICBjaGlsZCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQHByZWZpeCcvPiIpOwotICAgICAgICBjaGlsZC5zZXRUZXh0KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2VyaWFsaXplciIvPig8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFyYW1ldGVyLW9yLWFycmF5LWl0ZW0iLz4pKTsKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J2NvbXBsZXgnIGFuZCBAdHlwZS1pbmRleD0nJyI+Ci0gICAgICAgIGlmIChiaW5kaW5nRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihiaW5kaW5nRXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZCA9IG1hcHBlZENoaWxkKDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXJhbWV0ZXItb3ItYXJyYXktaXRlbSIvPiwgZmFjdG9yeSk7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdjb21wbGV4JyI+Ci0gICAgICAgIGlmIChiaW5kaW5nRmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihiaW5kaW5nRXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZSBzcmMgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LkppQlhEYXRhU291cmNlKDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYXJhbWV0ZXItb3ItYXJyYXktaXRlbSIvPiwgX3R5cGVfbmFtZTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZS1pbmRleCIvPiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAcHJlZml4Jy8+IiwgYmluZGluZ05hbWVzcGFjZUluZGV4ZXMsIGJpbmRpbmdOYW1lc3BhY2VQcmVmaXhlcywgYmluZGluZ0ZhY3RvcnkpOwotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIGFwcG5zID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsICIiKTsKLSAgICAgICAgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChzcmMsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iLCBhcHBucyk7Ci0gICAgICA8L3hzbDp3aGVuPgotICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgd3JhcHBlci5hZGRDaGlsZChjaGlsZCk7Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSBSZWZlcmVuY2UgdG8gcGFyYW1ldGVyIG9yIGFycmF5IGl0ZW0gdmFsdWUsIGFzIGFwcHJvcHJpYXRlIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhcmFtZXRlci1vci1hcnJheS1pdGVtIj48eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iQGFycmF5PSd0cnVlJyI+X2l0ZW08L3hzbDp3aGVuPjx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAamF2YS1uYW1lJy8+PC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT48eHNsOmlmIHRlc3Q9IkB3cmFwcGVkLXByaW1pdGl2ZT0ndHJ1ZSciPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHZhbHVlLW1ldGhvZCIvPigpPC94c2w6aWY+PC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIEdlbmVyYXRlIGNvZGUgZm9yIHRoZSByZXN1bHQgaW4gYSBjbGllbnQgc3R1YiBtZXRob2QgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InJldHVybi1lbGVtZW50IiBtb2RlPSJpbnRlcmZhY2UtaW1wbGVtZW50YXRpb24iPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBhcnJheT0ndHJ1ZSciPgotICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW5tYXJzaGFsLWFycmF5Ii8+Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bm1hcnNoYWwtdmFsdWUiLz4KLSAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDwhLS0KLSAgQ0xJRU5UIFNUVUIgU0hBUkVEIE1FVEhPRCBHRU5FUkFUSU9OCi0gIC0tPgotICA8IS0tIENhbGxlZCBieSBtYWluIHRlbXBsYXRlIHRvIGNyZWF0ZSB1dGlsaXR5IG1ldGhvZHMgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0ic3R1Yi11dGlsaXR5LW1ldGhvZHMiPgotICAgIAotICAgIHByaXZhdGUgRXhjZXB0aW9uIGNvbnZlcnRFeGNlcHRpb24oRXhjZXB0aW9uIGV4KSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGV4IGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IGYgPSAob3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQpZXg7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBmYXVsdEVsdCA9IGYuZ2V0RGV0YWlsKCk7Ci0gICAgICAgICAgICBpZiAoZmF1bHRFbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChmYXVsdEV4Y2VwdGlvbk5hbWVNYXAuY29udGFpbnNLZXkoZmF1bHRFbHQuZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHRoZSBhY3R1YWwgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uQ2xhc3NOYW1lID0gKFN0cmluZylmYXVsdEV4Y2VwdGlvbkNsYXNzTmFtZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBleGNlcHRpb25DbGFzcyA9IENsYXNzLmZvck5hbWUoZXhjZXB0aW9uQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gKEV4Y2VwdGlvbilleGNlcHRpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCB0aGUgbWVzc2FnZSBvYmplY3QgZnJvbSB0aGUgZGV0YWlscwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VDbGFzc05hbWUgPSAoU3RyaW5nKWZhdWx0TWVzc2FnZU1hcC5nZXQoZmF1bHRFbHQuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBtZXNzYWdlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG1lc3NhZ2VDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG1lc3NhZ2VPYmplY3QgPSBmcm9tT00oZmF1bHRFbHQsIG1lc3NhZ2VDbGFzcywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbSA9IGV4Y2VwdGlvbkNsYXNzLmdldE1ldGhvZCgic2V0RmF1bHRNZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IG1lc3NhZ2VDbGFzcyB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKGUsIG5ldyBPYmplY3RbXSB7IG1lc3NhZ2VPYmplY3QgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgaW50YW50aWF0ZSB0aGUgY2xhc3MgLSB0aHJvdyB0aGUgb3JpZ2luYWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF4aXMgZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2Fubm90IGludGFudGlhdGUgdGhlIGNsYXNzIC0gdGhyb3cgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzIGZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBpbnRhbnRpYXRlIHRoZSBjbGFzcyAtIHRocm93IHRoZSBvcmlnaW5hbAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXhpcyBmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0gZWxzZSBpZiAoZXggaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilleDsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgdGhyb3cgKGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbilleDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Lm1ha2VGYXVsdChleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgCi0gIDwhLS0KLSAgU1RBVElDIENPREUgR0VORVJBVElPTgotICAtLT4KLSAgCi0gIDwhLS0gQ2FsbGVkIGJ5IG1haW4gdGVtcGxhdGUgdG8gaGFuZGxlIHN0YXRpYyBiaW5kaW5nIGRhdGEgYW5kIG1ldGhvZHMuIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJpbml0aWFsaXplLWJpbmRpbmciPgotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ibnNjb3VudCIgc2VsZWN0PSJjb3VudChiaW5kaW5nLW5hbWVzcGFjZSkiLz4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuamlieC5ydW50aW1lLklCaW5kaW5nRmFjdG9yeSBiaW5kaW5nRmFjdG9yeTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmluZGluZ0Vycm9yTWVzc2FnZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBiaW5kaW5nTmFtZXNwYWNlSW5kZXhlczsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBiaW5kaW5nTmFtZXNwYWNlUHJlZml4ZXM7Ci0gICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgbW9kZT0iZ2VuZXJhdGUtaW5kZXgtZmllbGRzIiBzZWxlY3Q9ImFic3RyYWN0LXR5cGUiLz4KLSAgICBzdGF0aWMgewotICAgICAgICBvcmcuamlieC5ydW50aW1lLklCaW5kaW5nRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICB0cnkgewotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKEBiaW5kaW5nLW5hbWUpKSA+IDAiPgotICAgICAgICAgICAgZmFjdG9yeSA9IG9yZy5qaWJ4LnJ1bnRpbWUuQmluZGluZ0RpcmVjdG9yeS5nZXRGYWN0b3J5KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJpbmRpbmctbmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJpbmRpbmctcGFja2FnZSIvPiIsIDx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZSgvY2xhc3MvQG5hbWUpKT4wIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2NsYXNzL0BuYW1lIi8+PC94c2w6d2hlbj48eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL2ludGVyZmFjZS9AbmFtZSIvPjwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdHJpbmctbGVuZ3RoKG5vcm1hbGl6ZS1zcGFjZShAYm91bmQtY2xhc3MpKSA+IDAiPgotICAgICAgICAgICAgZmFjdG9yeSA9IG9yZy5qaWJ4LnJ1bnRpbWUuQmluZGluZ0RpcmVjdG9yeS5nZXRGYWN0b3J5KDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAYm91bmQtY2xhc3MiLz4uY2xhc3MpOwotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLmppYnguTnVsbEJpbmRpbmdGYWN0b3J5KCk7Ci0gICAgICA8L3hzbDpvdGhlcndpc2U+Ci0gICAgPC94c2w6Y2hvb3NlPgotICAgICAgICAgICAgbWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsgfQotICAgICAgICBiaW5kaW5nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGJpbmRpbmdFcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIG1vZGU9InNldC1pbmRleC1maWVsZHMiIHNlbGVjdD0iYWJzdHJhY3QtdHlwZSIvPgotICAgICAgICBpbnRbXSBpbmRleGVzID0gbnVsbDsKLSAgICAgICAgU3RyaW5nW10gcHJlZml4ZXMgPSBudWxsOwotICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGNoZWNrIGZvciB4c2kgbmFtZXNwYWNlIGluY2x1ZGVkCi0gICAgICAgICAgICBTdHJpbmdbXSBuc3VyaXMgPSBmYWN0b3J5LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIGludCB4c2lpbmRleCA9IG5zdXJpcy5sZW5ndGg7Ci0gICAgICAgICAgICB3aGlsZSAoLS14c2lpbmRleCA+PSAwICZhbXA7JmFtcDsKLSAgICAgICAgICAgICAgICAhImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIi5lcXVhbHMobnN1cmlzW3hzaWluZGV4XSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZXQgYWN0dWFsIHNpemUgb2YgaW5kZXggYW5kIHByZWZpeCBhcnJheXMgdG8gYmUgYWxsb2NhdGVkCi0gICAgICAgICAgICBpbnQgbnNjb3VudCA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbnNjb3VudCIvPjsKLSAgICAgICAgICAgIGludCB1c2Vjb3VudCA9IG5zY291bnQ7Ci0gICAgICAgICAgICBpZiAoeHNpaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHVzZWNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBhcnJheXMKLSAgICAgICAgICAgIGluZGV4ZXMgPSBuZXcgaW50W3VzZWNvdW50XTsKLSAgICAgICAgICAgIHByZWZpeGVzID0gbmV3IFN0cmluZ1t1c2Vjb3VudF07Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iYmluZGluZy1uYW1lc3BhY2UiPgotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im5zaW5kZXgiIHNlbGVjdD0iY291bnQocHJlY2VkaW5nLXNpYmxpbmc6OmJpbmRpbmctbmFtZXNwYWNlKSIvPgotICAgICAgICAgICAgaW5kZXhlc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zaW5kZXgiLz5dID0gbnNJbmRleCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPiIsIG5zdXJpcyk7Ci0gICAgICAgICAgICBwcmVmaXhlc1s8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5zaW5kZXgiLz5dID0gIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAcHJlZml4Jy8+IjsKLSAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgICAgaWYgKHhzaWluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpbmRleGVzW25zY291bnRdID0geHNpaW5kZXg7Ci0gICAgICAgICAgICAgICAgcHJlZml4ZXNbbnNjb3VudF0gPSAieHNpIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGJpbmRpbmdOYW1lc3BhY2VJbmRleGVzID0gaW5kZXhlczsKLSAgICAgICAgYmluZGluZ05hbWVzcGFjZVByZWZpeGVzID0gcHJlZml4ZXM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBuc0luZGV4KFN0cmluZyB1cmksIFN0cmluZ1tdIHVyaXMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscyh1cmlzW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5hbWVzcGFjZSAiICsgdXJpICsgIiBub3QgZm91bmQgaW4gYmluZGluZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24iKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRNYXBwaW5nTmFtZXNwYWNlcyhvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgd3JhcHBlciwgU3RyaW5nIG5zdXJpLCBTdHJpbmcgbnNwcmVmKSB7Ci0gICAgICAgIFN0cmluZ1tdIG5zcyA9IGJpbmRpbmdGYWN0b3J5LmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBiaW5kaW5nTmFtZXNwYWNlSW5kZXhlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gYmluZGluZ05hbWVzcGFjZUluZGV4ZXNbaV07Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNzW2luZGV4XTsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBiaW5kaW5nTmFtZXNwYWNlUHJlZml4ZXNbaV07Ci0gICAgICAgICAgICBpZiAoIW5zdXJpLmVxdWFscyh1cmkpIHx8ICFuc3ByZWYuZXF1YWxzKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLmRlY2xhcmVOYW1lc3BhY2UoZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZSh1cmksIHByZWZpeCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dCBnZXROZXdVbm1hcnNoYWxDb250ZXh0KG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtKQotICAgICAgICB0aHJvd3Mgb3JnLmppYngucnVudGltZS5KaUJYRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJpbmRpbmdGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJpbmRpbmdFcnJvck1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dCBjdHggPQotICAgICAgICAgICAgKG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5Vbm1hcnNoYWxsaW5nQ29udGV4dCliaW5kaW5nRmFjdG9yeS5jcmVhdGVVbm1hcnNoYWxsaW5nQ29udGV4dCgpOwotICAgICAgICBvcmcuamlieC5ydW50aW1lLklYTUxSZWFkZXIgcmVhZGVyID0gbmV3IG9yZy5qaWJ4LnJ1bnRpbWUuaW1wbC5TdEFYUmVhZGVyV3JhcHBlcihwYXJhbS5nZXRYTUxTdHJlYW1SZWFkZXJXaXRob3V0Q2FjaGluZygpLCAiU09BUC1tZXNzYWdlIiwgdHJ1ZSk7Ci0gICAgICAgIGN0eC5zZXREb2N1bWVudChyZWFkZXIpOwotICAgICAgICBjdHgudG9UYWcoKTsKLSAgICAgICAgcmV0dXJuIGN0eDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBtYXBwZWRDaGlsZChPYmplY3QgdmFsdWUsIG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgb3JnLmppYngucnVudGltZS5JTWFyc2hhbGxhYmxlIG1yc2hhYmxlID0gKG9yZy5qaWJ4LnJ1bnRpbWUuSU1hcnNoYWxsYWJsZSl2YWx1ZTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ugc3JjID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuamlieC5KaUJYRGF0YVNvdXJjZShtcnNoYWJsZSwgYmluZGluZ0ZhY3RvcnkpOwotICAgICAgICBpbnQgaW5kZXggPSBiaW5kaW5nRmFjdG9yeS5nZXRDbGFzc0luZGV4TWFwKCkuZ2V0KG1yc2hhYmxlLkppQlhfZ2V0TmFtZSgpKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBhcHBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoYmluZGluZ0ZhY3RvcnkuZ2V0RWxlbWVudE5hbWVzcGFjZXMoKVtpbmRleF0sICIiKTsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KHNyYywgYmluZGluZ0ZhY3RvcnkuZ2V0RWxlbWVudE5hbWVzKClbaW5kZXhdLCBhcHBucyk7Ci0gICAgfQotICAgIAotICAgIDwhLS0gc2hvdWxkbid0IGJlIG5lZWRlZCB3aGVuIG5vIGFjdHVhbCBiaW5kaW5nLCBidXQgY2FsbGVkIGJ5IGZhdWx0IGNvbnZlcnNpb24gY29kZSBzbyBtdXN0IGJlIGxlZnQgaW4gZm9yIG5vdyAtLT4KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZnJvbU9NKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHBhcmFtLCBDbGFzcyB0eXBlLAotICAgICAgICBqYXZhLnV0aWwuTWFwIGV4dHJhTmFtZXNwYWNlcykgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3JnLmppYngucnVudGltZS5pbXBsLlVubWFyc2hhbGxpbmdDb250ZXh0IGN0eCA9IGdldE5ld1VubWFyc2hhbENvbnRleHQocGFyYW0pOwotICAgICAgICAgICAgcmV0dXJuIGN0eC51bm1hcnNoYWxFbGVtZW50KHR5cGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSBDYWxsZWQgYnkgImluaXRpYWxpemUtYmluZGluZyIgdGVtcGxhdGUgdG8gZ2VuZXJhdGUgbWFwcGVkIGNsYXNzIGluZGV4IGZpZWxkcy4gLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImFic3RyYWN0LXR5cGUiIG1vZGU9ImdlbmVyYXRlLWluZGV4LWZpZWxkcyI+Ci0gICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF90eXBlX25hbWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUtaW5kZXgiLz47Ci0gIDwveHNsOnRlbXBsYXRlPgotICAgIAotICA8IS0tIENhbGxlZCBieSAiaW5pdGlhbGl6ZS1iaW5kaW5nIiB0ZW1wbGF0ZSB0byBpbml0aWFsaXplIG1hcHBlZCBjbGFzcyBpbmRleCBmaWVsZHMuIC0tPgotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJhYnN0cmFjdC10eXBlIiBtb2RlPSJzZXQtaW5kZXgtZmllbGRzIj4KLSAgICAgICAgIF90eXBlX25hbWU8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUtaW5kZXgiLz4gPQotICAgICAgICAgICAgICJ7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucyIvPn06PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IjsKLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICAKLSAgPCEtLQotICBTSEFSRUQgVEVNUExBVEVTCi0gIC0tPgotICAKLSAgPCEtLSBVbm1hcnNoYWwgYSByZXBlYXRlZCBlbGVtZW50IGludG8gYW4gYXJyYXkgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0idW5tYXJzaGFsLWFycmF5Ij4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPltdIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+ID0gbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+WzRdOwotICAgICAgaW5kZXggPSAwOwotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdjb21wbGV4JyBhbmQgQHR5cGUtaW5kZXg9JyciPgotICAgICAgd2hpbGUgKHVjdHguZ2V0VW5tYXJzaGFsbGVyKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpLmlzUHJlc2VudCh1Y3R4KSkgewotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgd2hpbGUgKHVjdHguaXNBdCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKSkgewotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgICAgICAgICBpZiAoaW5kZXggPj0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4ubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+ID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+W10pb3JnLmppYngucnVudGltZS5VdGlsaXR5Lmdyb3dBcnJheSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPik7Ci0gICAgICAgICAgfQotICAgIDx4c2w6aWYgdGVzdD0iQG5pbGxhYmxlPSd0cnVlJyI+Ci0gICAgICAgICAgaWYgKHVjdHguYXR0cmlidXRlQm9vbGVhbigiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAibmlsIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgIHVjdHguc2tpcEVsZW1lbnQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgIDwveHNsOmlmPgotICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS1uYW1lIi8+W2luZGV4KytdID0gKDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+KTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNlcmlhbGl6ZS1lbGVtZW50LXZhbHVlIi8+OwotICAgIDx4c2w6aWYgdGVzdD0iQGZvcm09J2NvbXBsZXgnIGFuZCBAdHlwZS1pbmRleCE9JyciPgotICAgICAgICAgICAgICB1Y3R4LnBhcnNlUGFzdEN1cnJlbnRFbmRUYWcoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+Iik7Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgICB9Ci0gICAgPC94c2w6aWY+Ci0gICAgICB9Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPiA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPltdKW9yZy5qaWJ4LnJ1bnRpbWUuVXRpbGl0eS5yZXNpemVBcnJheShpbmRleCwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4pOwotICAgIDx4c2w6aWYgdGVzdD0iQG9wdGlvbmFsIT0ndHJ1ZSciPgotICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQoIk1pc3NpbmcgcmVxdWlyZWQgZWxlbWVudCB7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BucycvPn08eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnLz4iKTsKLSAgICAgIH0KLSAgICA8L3hzbDppZj4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIFVubWFyc2hhbCBhIG5vbi1yZXBlYXRlZCBlbGVtZW50IGludG8gYW4gc2ltcGxlIHZhbHVlIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9InVubWFyc2hhbC12YWx1ZSI+Ci0gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLXR5cGUiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLW5hbWUiLz4gPSA8eHNsOmNob29zZT48eHNsOndoZW4gdGVzdD0iYm9vbGVhbihAZGVmYXVsdCkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZGVmYXVsdCIvPjwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+bnVsbDwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+OwotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdjb21wbGV4JyBhbmQgQHR5cGUtaW5kZXg9JyciPgotICAgICAgICAgICAgaWYgKHVjdHguZ2V0VW5tYXJzaGFsbGVyKCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpLmlzUHJlc2VudCh1Y3R4KSkgewotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgICAgaWYgKHVjdHguaXNBdCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKSkgewotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgICA8eHNsOmlmIHRlc3Q9IkBuaWxsYWJsZT0ndHJ1ZSciPgotICAgICAgICAgICAgICAgIGlmICh1Y3R4LmF0dHJpYnV0ZUJvb2xlYW4oImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgIm5pbCIsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICB1Y3R4LnNraXBFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtbmFtZSIvPiA9ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGphdmEtdHlwZSIvPik8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzZXJpYWxpemUtZWxlbWVudC12YWx1ZSIvPjsKLSAgICA8eHNsOmlmIHRlc3Q9IkBmb3JtPSdjb21wbGV4JyBhbmQgQHR5cGUtaW5kZXghPScnIj4KLSAgICAgICAgICAgICAgICB1Y3R4LnBhcnNlUGFzdEN1cnJlbnRFbmRUYWcoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbnMnLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJy8+Iik7Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDppZiB0ZXN0PSJAbmlsbGFibGU9J3RydWUnIj4KLSAgICAgICAgICAgICAgICB9Ci0gICAgPC94c2w6aWY+Ci0gICAgPHhzbDpjaG9vc2U+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQG9wdGlvbmFsPSd0cnVlJyI+Ci0gICAgICAgICAgICB9Ci0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDpvdGhlcndpc2U+Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCgiTWlzc2luZyByZXF1aXJlZCBlbGVtZW50IHs8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5zJy8+fTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScvPiIpOwotICAgICAgICAgICAgfQotICAgICAgPC94c2w6b3RoZXJ3aXNlPgotICAgIDwveHNsOmNob29zZT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIENvbnZlcnQgdGhlIGN1cnJlbnQgZWxlbWVudCBpbnRvIGEgdmFsdWUuIC0tPgotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImRlc2VyaWFsaXplLWVsZW1lbnQtdmFsdWUiPgotICAgIDx4c2w6Y2hvb3NlPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBqYXZhLXR5cGU9J2phdmEubGFuZy5TdHJpbmcnIGFuZCBAZGVzZXJpYWxpemVyPScnIj4KLSAgICAgICAgdWN0eC5wYXJzZUVsZW1lbnRUZXh0KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpCi0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdzaW1wbGUnIGFuZCBAZGVzZXJpYWxpemVyPScnIj4KLSAgICAgICAgbmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAamF2YS10eXBlIi8+KHVjdHgucGFyc2VFbGVtZW50VGV4dCgiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBucyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4iKSkKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J3NpbXBsZScgYW5kIEB3cmFwcGVkLXByaW1pdGl2ZT0ndHJ1ZSciPgotICAgICAgICBuZXcgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqYXZhLXR5cGUiLz4oPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkZXNlcmlhbGl6ZXIiLz4odWN0eC5wYXJzZUVsZW1lbnRUZXh0KCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5zIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiIpKSkKLSAgICAgIDwveHNsOndoZW4+Ci0gICAgICA8eHNsOndoZW4gdGVzdD0iQGZvcm09J3NpbXBsZSciPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlc2VyaWFsaXplciIvPih1Y3R4LnBhcnNlRWxlbWVudFRleHQoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IikpCi0gICAgICA8L3hzbDp3aGVuPgotICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmb3JtPSdjb21wbGV4JyBhbmQgQHR5cGUtaW5kZXg9JyciPgotICAgICAgICB1Y3R4LnVubWFyc2hhbEVsZW1lbnQoKQotICAgICAgPC94c2w6d2hlbj4KLSAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAZm9ybT0nY29tcGxleCciPgotICAgICAgICB1Y3R4LmdldFVubWFyc2hhbGxlcihfdHlwZV9uYW1lPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlLWluZGV4Ii8+KS51bm1hcnNoYWwoPHhzbDpjaG9vc2U+PHhzbDp3aGVuIHRlc3Q9InN0cmluZy1sZW5ndGgobm9ybWFsaXplLXNwYWNlKEBjcmVhdGUtdHlwZSkpID0gMCI+bnVsbDwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+bmV3IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAY3JlYXRlLXR5cGUiLz4oKTwveHNsOm90aGVyd2lzZT48L3hzbDpjaG9vc2U+LCB1Y3R4KQotICAgICAgPC94c2w6d2hlbj4KLSAgICA8L3hzbDpjaG9vc2U+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9iaW5kaW5nL2N1c3RvbWVyLWJpbmRpbmcueG1sIGIvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy9iaW5kaW5nL2N1c3RvbWVyLWJpbmRpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFjYmFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvYmluZGluZy9jdXN0b21lci1iaW5kaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGJpbmRpbmc+Ci0gIDxuYW1lc3BhY2UgdXJpPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9qaWJ4L2N1c3RvbWVyL2RhdGEiIGRlZmF1bHQ9ImVsZW1lbnRzIi8+Ci0gIDxtYXBwaW5nIG5hbWU9ImN1c3RvbWVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LkN1c3RvbWVyIj4KLSAgICA8c3RydWN0dXJlIG5hbWU9InBlcnNvbiIgZmllbGQ9InBlcnNvbiI+Ci0gICAgICA8dmFsdWUgbmFtZT0iY3VzdC1udW0iIGZpZWxkPSJjdXN0b21lck51bWJlciIvPgotICAgICAgPHZhbHVlIG5hbWU9ImZpcnN0LW5hbWUiIGZpZWxkPSJmaXJzdE5hbWUiLz4KLSAgICAgIDx2YWx1ZSBuYW1lPSJsYXN0LW5hbWUiIGZpZWxkPSJsYXN0TmFtZSIvPgotICAgIDwvc3RydWN0dXJlPgotICAgIDx2YWx1ZSBuYW1lPSJzdHJlZXQiIGZpZWxkPSJzdHJlZXQiLz4KLSAgICA8dmFsdWUgbmFtZT0iY2l0eSIgZmllbGQ9ImNpdHkiLz4KLSAgICA8dmFsdWUgbmFtZT0ic3RhdGUiIGZpZWxkPSJzdGF0ZSIvPgotICAgIDx2YWx1ZSBuYW1lPSJ6aXAiIGZpZWxkPSJ6aXAiLz4KLSAgICA8dmFsdWUgbmFtZT0icGhvbmUiIGZpZWxkPSJwaG9uZSIvPgotICA8L21hcHBpbmc+Ci08L2JpbmRpbmc+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL2JpbmRpbmcvbGlicmFyeS1iaW5kaW5nLnhtbCBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvYmluZGluZy9saWJyYXJ5LWJpbmRpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhhOTIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvYmluZGluZy9saWJyYXJ5LWJpbmRpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGJpbmRpbmcgYWRkLWNvbnN0cnVjdG9ycz0idHJ1ZSIgZm9yY2UtY2xhc3Nlcz0idHJ1ZSIKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyI+Ci0KLSAgPG5hbWVzcGFjZSB1cmk9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyIgZGVmYXVsdD0iZWxlbWVudHMiLz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImdldEJvb2siCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXF1ZXN0Ij4KLSAgICA8dmFsdWUgbmFtZT0iaXNibiIgZmllbGQ9Im1faXNibiIvPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJnZXRCb29rUmVzcG9uc2UiCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkdldEJvb2tSZXNwb25zZSI+Ci0gICAgPHN0cnVjdHVyZSBuYW1lPSJnZXRCb29rUmV0dXJuIiBmaWVsZD0ibV9ib29rIiB1c2FnZT0ib3B0aW9uYWwiCi0gICAgICAgIG1hcC1hcz0idG5zOkJvb2tJbmZvcm1hdGlvbiIvPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJnZXRCb29rc0J5VHlwZSIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuR2V0Qm9va3NCeVR5cGVSZXF1ZXN0Ij4KLSAgICA8dmFsdWUgbmFtZT0idHlwZSIgZmllbGQ9Im1fdHlwZSIvPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJnZXRCb29rc0J5VHlwZVJlc3BvbnNlIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVycy5HZXRCb29rc0J5VHlwZVJlc3BvbnNlIj4KLSAgICA8Y29sbGVjdGlvbiBmaWVsZD0ibV9ib29rcyIgdXNhZ2U9Im9wdGlvbmFsIj4KLSAgICAgIDxzdHJ1Y3R1cmUgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXR1cm4iIG1hcC1hcz0idG5zOkJvb2tJbmZvcm1hdGlvbiIvPgotICAgIDwvY29sbGVjdGlvbj4KLSAgPC9tYXBwaW5nPgotICAKLSAgPG1hcHBpbmcgbmFtZT0iZ2V0VHlwZXMiCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkdldFR5cGVzUmVxdWVzdCIvPgotICAKLSAgPG1hcHBpbmcgbmFtZT0iZ2V0VHlwZXNSZXNwb25zZSIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuR2V0VHlwZXNSZXNwb25zZSI+Ci0gICAgPGNvbGxlY3Rpb24gZmllbGQ9Im1fdHlwZXMiIHVzYWdlPSJvcHRpb25hbCI+Ci0gICAgICA8c3RydWN0dXJlIG5hbWU9ImdldFR5cGVzUmV0dXJuIiBtYXAtYXM9InRuczpUeXBlSW5mb3JtYXRpb24iLz4KLSAgICA8L2NvbGxlY3Rpb24+Ci0gIDwvbWFwcGluZz4KLSAgCi0gIDxtYXBwaW5nIG5hbWU9ImFkZEJvb2siCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkFkZEJvb2tSZXF1ZXN0Ij4KLSAgICA8c3RydWN0dXJlIGZpZWxkPSJtX2Jvb2siPgotICAgICAgPHZhbHVlIG5hbWU9InR5cGUiIGZpZWxkPSJtX3R5cGUiLz4KLSAgICAgIDx2YWx1ZSBuYW1lPSJpc2JuIiBmaWVsZD0ibV9pc2JuIi8+Ci0gICAgICA8Y29sbGVjdGlvbiBmaWVsZD0ibV9hdXRob3JzIj4KLSAgICAgICAgPHZhbHVlIG5hbWU9ImF1dGhvciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIvPgotICAgICAgPC9jb2xsZWN0aW9uPgotICAgICAgPHZhbHVlIG5hbWU9InRpdGxlIiBmaWVsZD0ibV90aXRsZSIvPgotICAgIDwvc3RydWN0dXJlPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJhZGRCb29rUmVzcG9uc2UiCi0gICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzLkFkZEJvb2tSZXNwb25zZSI+Ci0gICAgPHZhbHVlIG5hbWU9ImFkZEJvb2tSZXR1cm4iIGZpZWxkPSJtX3N1Y2Nlc3MiLz4KLSAgPC9tYXBwaW5nPgotICAKLSAgPG1hcHBpbmcgbmFtZT0iYWRkQm9va0luc3RhbmNlIgotICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVycy5BZGRCb29rSW5zdGFuY2VSZXF1ZXN0Ij4KLSAgICA8c3RydWN0dXJlIG5hbWU9ImJvb2siIGZpZWxkPSJtX2Jvb2siIG1hcC1hcz0idG5zOkJvb2tJbmZvcm1hdGlvbiIvPgotICA8L21hcHBpbmc+Ci0gIAotICA8bWFwcGluZyBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXNwb25zZSIKLSAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnMuQWRkQm9va0luc3RhbmNlUmVzcG9uc2UiLz4KLSAgCi0gIDxtYXBwaW5nIGFic3RyYWN0PSJ0cnVlIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qaWJ4LmJlYW5zLkJvb2siCi0gICAgICB0eXBlLW5hbWU9InRuczpCb29rSW5mb3JtYXRpb24iPgotICAgIDxuYW1lc3BhY2UgcHJlZml4PSJ0eXBlcyIgdXJpPSJodHRwOi8vd3Muc29zbm9za2kuY29tL2xpYnJhcnkvdHlwZXMiLz4KLSAgICA8dmFsdWUgbmFtZT0idHlwZSIgc3R5bGU9ImF0dHJpYnV0ZSIgZmllbGQ9Im1fdHlwZSIvPgotICAgIDx2YWx1ZSBuYW1lPSJpc2JuIiBzdHlsZT0iYXR0cmlidXRlIiBmaWVsZD0ibV9pc2JuIi8+Ci0gICAgPGNvbGxlY3Rpb24gZmllbGQ9Im1fYXV0aG9ycyI+Ci0gICAgICA8dmFsdWUgbmFtZT0iYXV0aG9yIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgPC9jb2xsZWN0aW9uPgotICAgIDx2YWx1ZSBuYW1lPSJ0aXRsZSIgZmllbGQ9Im1fdGl0bGUiLz4KLSAgPC9tYXBwaW5nPgotICAKLSAgPG1hcHBpbmcgYWJzdHJhY3Q9InRydWUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuVHlwZSIKLSAgICAgIHR5cGUtbmFtZT0idG5zOlR5cGVJbmZvcm1hdGlvbiI+Ci0gICAgPHZhbHVlIG5hbWU9Im5hbWUiIHN0eWxlPSJhdHRyaWJ1dGUiIGZpZWxkPSJtX25hbWUiLz4KLSAgICA8dmFsdWUgbmFtZT0iY291bnQiIHN0eWxlPSJhdHRyaWJ1dGUiIGZpZWxkPSJtX2NvdW50Ii8+Ci0gICAgPHZhbHVlIHN0eWxlPSJ0ZXh0IiBmaWVsZD0ibV9kZXNjcmlwdGlvbiIvPgotICA8L21hcHBpbmc+Ci0KLTwvYmluZGluZz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvcmVwby9jb25mL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvcmVwby9jb25mL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZWE3ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3JlcG8vY29uZi9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBJZiB5b3UgaGF2ZSBhIGZyb250ZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPgotICAgICAgICA8IS0tdW5jb21tZXQgZm9sbG93aW5nIHBhcmFtdGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+Ci0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj5odHRwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4KLTwhLS0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4gIC0tPgotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQkgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvY3VzdG9tZXItZWNoby53c2RsIGIvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2N1c3RvbWVyLWVjaG8ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgzNWMxMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3dzZGwvY3VzdG9tZXItZWNoby53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6ZG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9qaWJ4L2N1c3RvbWVyL2RhdGEiCi0gICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgIHhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvamlieC9jdXN0b21lci93c2RsIgotICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9qaWJ4L2N1c3RvbWVyL3dzZGwiPgotICAKLSAgPHR5cGVzPgotICAgIDx4c2Q6c2NoZW1hPgotICAgICAgPHhzZDppbXBvcnQgc2NoZW1hTG9jYXRpb249ImN1c3RvbWVyLnhzZCIKLSAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ppYngvY3VzdG9tZXIvZGF0YSIvPgotICAgIDwveHNkOnNjaGVtYT4KLSAgPC90eXBlcz4KLQotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVxdWVzdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iZG5zOmN1c3RvbWVyIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1Jlc3BvbnNlIj4KLSAgICA8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9ImRuczpjdXN0b21lciIvPgotICA8L21lc3NhZ2U+Ci0gIAotICA8cG9ydFR5cGUgbmFtZT0iRWNob0N1c3RvbWVyIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpFY2hvUmVxdWVzdCIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6RWNob1Jlc3BvbnNlIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0N1c3RvbWVyQmluZGluZyIgdHlwZT0idG5zOkVjaG9DdXN0b21lciI+Ci0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJlY2hvIi8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotICA8L2JpbmRpbmc+Ci0KLSAgPHNlcnZpY2UgbmFtZT0iRWNob0N1c3RvbWVyU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob0N1c3RvbWVyUG9ydCIgYmluZGluZz0idG5zOkVjaG9DdXN0b21lckJpbmRpbmciPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEyNy4wLjAuMTo1NTU1L2F4aXMyL3NlcnZpY2VzL0VjaG9DdXN0b21lclNlcnZpY2UiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLSAgCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2N1c3RvbWVyLnhzZCBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvd3NkbC9jdXN0b21lci54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNjQ2NGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2N1c3RvbWVyLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ppYngvY3VzdG9tZXIvZGF0YSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2ppYngvY3VzdG9tZXIvZGF0YSIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLSAgPCEtLSBDcmVhdGVkIGZyb20gbWFwcGluZyBmb3IgY2xhc3Mgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LkN1c3RvbWVyIC0tPgotICA8ZWxlbWVudCBuYW1lPSJjdXN0b21lciI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICAgPHNlcXVlbmNlPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJwZXJzb24iPgotICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iY3VzdC1udW0iIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZmlyc3QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJsYXN0LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgPC9lbGVtZW50PgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJzdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8ZWxlbWVudCBuYW1lPSJ6aXAiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgPC9lbGVtZW50PgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2xpYnJhcnkud3NkbCBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC1yZXNvdXJjZXMvd3NkbC9saWJyYXJ5LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjIzN2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy93c2RsL2xpYnJhcnkud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLnNvc25vc2tpLmNvbS9saWJyYXJ5L3dzZGwiCi0gICAgeG1sbnM6d25zPSJodHRwOi8vd3Muc29zbm9za2kuY29tL2xpYnJhcnkvd3NkbCIKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyIKLSAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAKLSAgICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5zb3Nub3NraS5jb20vbGlicmFyeS90eXBlcyIKLSAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgICAgCi0gICAgICA8ZWxlbWVudCBuYW1lPSJnZXRCb29rIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImlzYm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgCi0gICAgICA8ZWxlbWVudCBuYW1lPSJnZXRCb29rUmVzcG9uc2UiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0Qm9va1JldHVybiIgbWluT2NjdXJzPSIwIiB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0Qm9va3NCeVR5cGUiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImdldEJvb2tzQnlUeXBlUmVzcG9uc2UiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXR1cm4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InRuczpCb29rSW5mb3JtYXRpb24iLz4KLSAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgCi0gICAgICA8ZWxlbWVudCBuYW1lPSJnZXRUeXBlcyI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2UvPgotICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPC9lbGVtZW50PgotICAgICAgCi0gICAgICA8ZWxlbWVudCBuYW1lPSJnZXRUeXBlc1Jlc3BvbnNlIj4KLSAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImdldFR5cGVzUmV0dXJuIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOlR5cGVJbmZvcm1hdGlvbiIvPgotICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZEJvb2siPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iaXNibiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYXV0aG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0aXRsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZEJvb2tSZXNwb25zZSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhZGRCb29rUmV0dXJuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8L2VsZW1lbnQ+Ci0gICAgICAKLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZEJvb2tJbnN0YW5jZSI+Ci0gICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJib29rIiB0eXBlPSJ0bnM6Qm9va0luZm9ybWF0aW9uIi8+Ci0gICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkQm9va0luc3RhbmNlUmVzcG9uc2UiPgotICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHNlcXVlbmNlLz4KLSAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDwvZWxlbWVudD4KLSAgICAgIAotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkJvb2tJbmZvcm1hdGlvbiI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhdXRob3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc2JuIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJzdHJpbmciLz4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAKLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJUeXBlSW5mb3JtYXRpb24iPgotICAgICAgICA8c2ltcGxlQ29udGVudD4KLSAgICAgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb3VudCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0iaW50Ii8+Ci0gICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgICA8L3NpbXBsZUNvbnRlbnQ+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgCi0gICAgPC9zY2hlbWE+Ci0KLSAgPC93c2RsOnR5cGVzPgotCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0Qm9va1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmdldEJvb2siIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmdldEJvb2tSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldEJvb2tzQnlUeXBlUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0Qm9va3NCeVR5cGUiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRCb29rc0J5VHlwZVJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpnZXRCb29rc0J5VHlwZVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICAKLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRUeXBlc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmdldFR5cGVzIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0VHlwZXNSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6Z2V0VHlwZXNSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZEJvb2tSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczphZGRCb29rIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICAKLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJhZGRCb29rUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmFkZEJvb2tSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImFkZEJvb2tJbnN0YW5jZVJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmFkZEJvb2tJbnN0YW5jZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iYWRkQm9va0luc3RhbmNlUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmFkZEJvb2tJbnN0YW5jZVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkxpYnJhcnkiPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldEJvb2siPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0id25zOmdldEJvb2tSZXF1ZXN0IiBuYW1lPSJnZXRCb29rUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InduczpnZXRCb29rUmVzcG9uc2UiIG5hbWU9ImdldEJvb2tSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va3NCeVR5cGUiPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0id25zOmdldEJvb2tzQnlUeXBlUmVxdWVzdCIgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0id25zOmdldEJvb2tzQnlUeXBlUmVzcG9uc2UiIG5hbWU9ImdldEJvb2tzQnlUeXBlUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFR5cGVzIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InduczpnZXRUeXBlc1JlcXVlc3QiIG5hbWU9ImdldFR5cGVzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InduczpnZXRUeXBlc1Jlc3BvbnNlIiBuYW1lPSJnZXRUeXBlc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRCb29rIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InduczphZGRCb29rUmVxdWVzdCIgbmFtZT0iYWRkQm9va1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3bnM6YWRkQm9va1Jlc3BvbnNlIiBuYW1lPSJhZGRCb29rUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZEJvb2tJbnN0YW5jZSI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ3bnM6YWRkQm9va0luc3RhbmNlUmVxdWVzdCIgbmFtZT0iYWRkQm9va0luc3RhbmNlUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InduczphZGRCb29rSW5zdGFuY2VSZXNwb25zZSIgbmFtZT0iYWRkQm9va0luc3RhbmNlUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gIDwvd3NkbDpwb3J0VHlwZT4KLQotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkxpYnJhcnlTb2FwQmluZGluZyIgdHlwZT0id25zOkxpYnJhcnkiPgotCi0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldEJvb2siPgotICAgIAotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIAotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZ2V0Qm9va1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIAotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImdldEJvb2tSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIAotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va3NCeVR5cGUiPgotICAgIAotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIAotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZ2V0Qm9va3NCeVR5cGVSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAKLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJnZXRCb29rc0J5VHlwZVJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgCi0gICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRUeXBlcyI+Ci0gICAgCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJnZXRUeXBlc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImdldFR5cGVzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImFkZEJvb2siPgotCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJhZGRCb29rUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotCi0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iYWRkQm9va1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhZGRCb29rSW5zdGFuY2UiPgotCi0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCi0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJhZGRCb29rSW5zdGFuY2VSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLQotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0KLSAgPC93c2RsOmJpbmRpbmc+Ci0KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJsaWJyYXJ5Ij4KLQotICAgIDx3c2RsOnBvcnQgYmluZGluZz0id25zOkxpYnJhcnlTb2FwQmluZGluZyIgbmFtZT0ibGlicmFyeSI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzEyNy4wLjAuMTo1NTU1L2F4aXMyL3NlcnZpY2VzL2xpYnJhcnkiLz4KLSAgICA8L3dzZGw6cG9ydD4KLQotICA8L3dzZGw6c2VydmljZT4KLQotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0LXJlc291cmNlcy94bWwvY3VzdG9tZXItZGF0YS54bWwgYi8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3htbC9jdXN0b21lci1kYXRhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjOTczNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3QtcmVzb3VyY2VzL3htbC9jdXN0b21lci1kYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGN1c3RvbWVyPgotICA8cGVyc29uPgotICAgIDxjdXN0LW51bT4xMjM0NTY3ODk8L2N1c3QtbnVtPgotICAgIDxmaXJzdC1uYW1lPkpvaG48L2ZpcnN0LW5hbWU+Ci0gICAgPGxhc3QtbmFtZT5TbWl0aDwvbGFzdC1uYW1lPgotICA8L3BlcnNvbj4KLSAgPHN0cmVldD4xMjM0NSBIYXBweSBMYW5lPC9zdHJlZXQ+Ci0gIDxjaXR5PlBsdW5rPC9jaXR5PgotICA8c3RhdGU+V0E8L3N0YXRlPgotICA8emlwPjk4MDU5PC96aXA+Ci0gIDxwaG9uZT44ODguNTU1LjEyMzQ8L3Bob25lPgotPC9jdXN0b21lcj4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvQ3VzdG9tZXIuamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvQ3VzdG9tZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkYmU4Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L0N1c3RvbWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieDsKLQotcHVibGljIGNsYXNzIEN1c3RvbWVyIHsKLSAgICBwdWJsaWMgUGVyc29uIHBlcnNvbjsKLSAgICBwdWJsaWMgU3RyaW5nIHN0cmVldDsKLSAgICBwdWJsaWMgU3RyaW5nIGNpdHk7Ci0gICAgcHVibGljIFN0cmluZyBzdGF0ZTsKLSAgICBwdWJsaWMgSW50ZWdlciB6aXA7Ci0gICAgcHVibGljIFN0cmluZyBwaG9uZTsKLQotICAgIHB1YmxpYyBDdXN0b21lcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3VzdG9tZXIoU3RyaW5nIGNpdHksIFBlcnNvbiBwZXJzb24sIFN0cmluZyBwaG9uZSwgU3RyaW5nIHN0YXRlLCBTdHJpbmcgc3RyZWV0LAotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHppcCkgewotICAgICAgICB0aGlzLmNpdHkgPSBjaXR5OwotICAgICAgICB0aGlzLnBlcnNvbiA9IHBlcnNvbjsKLSAgICAgICAgdGhpcy5waG9uZSA9IHBob25lOwotICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgICAgIHRoaXMuc3RyZWV0ID0gc3RyZWV0OwotICAgICAgICB0aGlzLnppcCA9IHppcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tZXIpIHsKLSAgICAgICAgICAgIEN1c3RvbWVyIGN1c3QgPSAoQ3VzdG9tZXIpb2JqOwotICAgICAgICAgICAgcmV0dXJuIHBlcnNvbi5lcXVhbHMoY3VzdC5wZXJzb24pICYmIHN0cmVldC5lcXVhbHMoY3VzdC5zdHJlZXQpICYmCi0gICAgICAgICAgICAgICAgICAgIGNpdHkuZXF1YWxzKGN1c3QuY2l0eSkgJiYgc3RhdGUuZXF1YWxzKGN1c3Quc3RhdGUpICYmCi0gICAgICAgICAgICAgICAgICAgIHppcC5lcXVhbHMoY3VzdC56aXApICYmIHBob25lLmVxdWFscyhjdXN0LnBob25lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvRWNoby5qYXZhIGIvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWZmZDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNobyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRWNoby5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgRWNobygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG8oT01FbGVtZW50IG9tRWxlKSB7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9QZXJzb24uamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvUGVyc29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNmI1OTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9QZXJzb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4OwotCi1wdWJsaWMgY2xhc3MgUGVyc29uIHsKLSAgICBwdWJsaWMgaW50IGN1c3RvbWVyTnVtYmVyOwotICAgIHB1YmxpYyBTdHJpbmcgZmlyc3ROYW1lOwotICAgIHB1YmxpYyBTdHJpbmcgbGFzdE5hbWU7Ci0KLSAgICBwdWJsaWMgUGVyc29uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBQZXJzb24oaW50IG51bWJlciwgU3RyaW5nIG5hbWUsIFN0cmluZyBuYW1lMikgewotICAgICAgICBjdXN0b21lck51bWJlciA9IG51bWJlcjsKLSAgICAgICAgZmlyc3ROYW1lID0gbmFtZTsKLSAgICAgICAgbGFzdE5hbWUgPSBuYW1lMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGVyc29uKSB7Ci0gICAgICAgICAgICBQZXJzb24gcGVyc29uID0gKFBlcnNvbilvYmo7Ci0gICAgICAgICAgICByZXR1cm4gY3VzdG9tZXJOdW1iZXIgPT0gcGVyc29uLmN1c3RvbWVyTnVtYmVyICYmCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0TmFtZS5lcXVhbHMocGVyc29uLmZpcnN0TmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbGFzdE5hbWUuZXF1YWxzKHBlcnNvbi5sYXN0TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDgyYTM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5KaUJYRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRnVsbCBjb2RlIGdlbmVyYXRpb24gYW5kIHJ1bnRpbWUgdGVzdCBmb3IgSmlCWCBkYXRhIGJpbmRpbmcgZXh0ZW5zaW9uLiBUaGlzIGlzIGJhc2VkIG9uIHRoZQotICogWE1MQmVhbnMgdGVzdCBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU0VTX0RJUiA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90YXJnZXQvdGVzdC1jbGFzc2VzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0xPQ0FUSU9OX0JBU0UgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGFyZ2V0L2dlbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9MT0NBVElPTl9QUkVGSVggPSAiL3Rlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0JBU0VfRElSID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzL3dzZGwvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19CQVNFX0RJUiA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90ZXN0LXJlc291cmNlcy9iaW5kaW5nLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfRElSID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzL3JlcG8vIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NFU19ESVIgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGFyZ2V0L2NsYXNzZXMvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtb2R1bGVOYW1lcyA9IHsgImtlcm5lbCIsICJjb3JlIiB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfUEFUSF9QUkVGSVggPSAiLi4vbW9kdWxlcy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX1RBUkdFVF9OQU1FID0gImNvbXBpbGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX0NMQVNTID0KLSAgICAgICAgICAgICJvcmcuYXBhY2hlLndzLmF4aXMyLmppYnguY3VzdG9tZXIud3NkbC5FY2hvQ3VzdG9tZXJTZXJ2aWNlU3R1YiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvQ3VzdG9tZXJTZXJ2aWNlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvIik7Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHRoZSByb290IG91dHB1dCBkaXJlY3RvcnkKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoT1VUUFVUX0xPQ0FUSU9OX0JBU0UpOwotICAgICAgICBpZiAob3V0cHV0RmlsZS5leGlzdHMoKSAmJiBvdXRwdXRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZURpcihvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIG91dHB1dEZpbGUubWtkaXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dHB1dEZpbGUubWtkaXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNoby5jbGFzcy5nZXROYW1lKCksIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBVdGlsU2VydmVyLnN0YXJ0KFJFUE9TSVRPUllfRElSKTsKLSAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyB1bmRlciBkaXIuIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGVsZXRpb25zIHdlcmUKLSAgICAgKiBzdWNjZXNzZnVsLiBJZiBhIGRlbGV0aW9uIGZhaWxzLCB0aGUgbWV0aG9kIHN0b3BzIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuZCByZXR1cm5zIGZhbHNlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZGVsZXRlRGlyKG5ldyBGaWxlKGRpciwgY2hpbGRyZW5baV0pKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZSBkaXJlY3RvcnkgaXMgbm93IGVtcHR5IHNvIGRlbGV0ZSBpdAotICAgICAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9wU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFV0aWxTZXJ2ZXIudW5EZXBsb3lTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgVXRpbFNlcnZlci5zdG9wKCk7Ci0vKiAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoT1VUUFVUX0xPQ0FUSU9OX0JBU0UpOwotICAgICAgICBpZiAob3V0cHV0RmlsZS5leGlzdHMoKSAmJiBvdXRwdXRGaWxlLmlzRGlyZWN0b3J5KCkpewotICAgICAgICAgICAgZGVsZXRlRGlyKG91dHB1dEZpbGUpOwotICAgICAgICB9ICAgKi8KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgbGlua2FnZSBjb2RlIGdlbmVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbAotICAgICAqIEBwYXJhbSBiaW5kaW5nCi0gICAgICogQHBhcmFtIG91dGRpcgotICAgICAqIEBwYXJhbSB1bndyYXAKLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvZGVHZW5lcmF0ZShTdHJpbmcgd3NkbCwgU3RyaW5nIGJpbmRpbmcsIFN0cmluZyBvdXRkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVud3JhcCkgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBjcmVhdGUgdGhlIG9wdGlvbiBtYXAKLSAgICAgICAgTWFwIG9wdGlvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgd3NkbCB9KSk7Ci0KLSAgICAgICAgLy91c2UgZGVmYXVsdCBzeW5jIG9wdGlvbiAtIE5vIG9wdGlvbiBpcyBnaXZlbgotICAgICAgICAvL3VzZSBkZWZhdWx0IGFzeW5jIG9wdGlvbiAtIE5vIG9wdGlvbiBpcyBnaXZlbgotICAgICAgICAvL3VzZSBkZWZhdWx0IGxhbmd1YWdlIG9wdGlvbiAtIE5vIG9wdGlvbiBpcyBnaXZlbgotCi0gICAgICAgIC8vIG91dHB1dCBsb2NhdGlvbgotICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgb3V0ZGlyIH0pKTsKLQotICAgICAgICAvLyBkYiBpcyBKaUJYCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgImppYngiIH0pKTsKLQotICAgICAgICAvLyB1bndyYXAgaWYgcmVxdWVzdGVkCi0gICAgICAgIGlmICh1bndyYXApIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGJpbmRpbmcgZGVmaW5pdGlvbiBpcyBzdXBwbGllZAotICAgICAgICBTdHJpbmcgb3B0aW9uID0gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYVFJBX09QVElPTlRZUEVfUFJFRklYICsKLSAgICAgICAgICAgICAgICBKaUJYRXh0ZW5zaW9uLkJJTkRJTkdfUEFUSF9PUFRJT047Ci0gICAgICAgIG9wdGlvbk1hcC5wdXQob3B0aW9uLCBuZXcgQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uLCBuZXcgU3RyaW5nW10geyBiaW5kaW5nIH0pKTsKLQotICAgICAgICAvL1RPRE86IE1ha2UgdGhpcyB3b3JrCi0gICAgICAgIC8vdGVzdCBjYXNlIG9wdGlvbiBpcyBvbgotLy8gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0vLyAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotLy8gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBDb21tYW5kTGluZU9wdGlvblBhcnNlcihvcHRpb25NYXApOwotICAgICAgICBuZXcgQ29kZUdlbmVyYXRpb25FbmdpbmUocGFyc2VyKS5nZW5lcmF0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBpbGUgZ2VuZXJhdGVkIGNvZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0ZGlyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXBpbGUoU3RyaW5nIG91dGRpcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGFyZ2V0L2NwLnR4dCIpKTsKLSAgICAgICAgICAgIGNwID0gYnIucmVhZExpbmUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIERvbid0IGNhcmUKLSAgICAgICAgfQotICAgICAgICBpZiAoY3AgPT0gbnVsbCkgewotICAgICAgICAgICAgY3AgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdXNpbmcgdGhlIGFudCBqYXZhYyB0YXNrIGZvciBjb21waWxhdGlvbgotICAgICAgICBKYXZhYyBqYXZhQ29tcGlsZXIgPSBuZXcgSmF2YWMoKTsKLSAgICAgICAgUHJvamVjdCBjb2RlR2VuUHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7Ci0gICAgICAgIFRhcmdldCBjb21waWxlVGFyZ2V0ID0gbmV3IFRhcmdldCgpOwotCi0gICAgICAgIGNvbXBpbGVUYXJnZXQuc2V0TmFtZShDT01QSUxFX1RBUkdFVF9OQU1FKTsKLSAgICAgICAgY29tcGlsZVRhcmdldC5hZGRUYXNrKGphdmFDb21waWxlcik7Ci0gICAgICAgIGNvZGVHZW5Qcm9qZWN0LmFkZFRhcmdldChjb21waWxlVGFyZ2V0KTsKLSAgICAgICAgY29kZUdlblByb2plY3Quc2V0U3lzdGVtUHJvcGVydGllcygpOwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0UHJvamVjdChjb2RlR2VuUHJvamVjdCk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRJbmNsdWRlamF2YXJ1bnRpbWUodHJ1ZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRJbmNsdWRlYW50cnVudGltZSh0cnVlKTsKLQotICAgICAgICAvKgotICAgICAgICAgIFRoaXMgaGFybWxlc3MgbG9va2luZyBzZXRGb3JrIGlzIGFjdHVhbGx5IHZlcnkgaW1wb3J0YW50LiB1bmxlc3MgdGhlIGNvbXBpbGVyIGlzCi0gICAgICAgICAgZm9ya2VkIGl0IHdvbnQgd29yayEKLSAgICAgICAgKi8KLSAgICAgICAgamF2YUNvbXBpbGVyLnNldEZvcmsodHJ1ZSk7Ci0KLSAgICAgICAgLy9DcmVhdGUgY2xhc3NwYXRoIC0gVGhlIGdlbmVyYXRlZCBvdXRwdXQgZGlyZWN0b3JpZXMgYWxzbyBiZWNvbWUgcGFydCBvZiB0aGUgY2xhc3NwYXRoCi0gICAgICAgIC8vcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgc29tZSBjb2RlZ2VuZXJhdG9ycyhYTUxCZWFucykgcHJvZHVjZSBjb21waWxlZCBjbGFzc2VzIGFzIHBhcnQgb2YKLSAgICAgICAgLy9nZW5lcmF0ZWQgYXJ0aWZhY3RzCi0gICAgICAgIFN0cmluZyBjbGFzc2RpciA9IG91dGRpciArICIvY2xhc3NlcyI7Ci0gICAgICAgIEZpbGUgb3V0cHV0TG9jYXRpb25GaWxlID0gbmV3IEZpbGUoY2xhc3NkaXIpOwotICAgICAgICBvdXRwdXRMb2NhdGlvbkZpbGUubWtkaXIoKTsKLSAgICAgICAgUGF0aCBjbGFzc1BhdGggPSBuZXcgUGF0aChjb2RlR2VuUHJvamVjdCwgY2xhc3NkaXIpOwotICAgICAgICBjbGFzc1BhdGguYWRkKG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LCBURVNUX0NMQVNTRVNfRElSKSk7Ci0gICAgICAgIGNsYXNzUGF0aC5hZGRFeGlzdGluZyhjbGFzc1BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCksIGZhbHNlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgY2xhc3NQYXRoLmFkZChuZXcgUGF0aChjb2RlR2VuUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX1BBVEhfUFJFRklYICsgbW9kdWxlTmFtZXNbaV0gKyBDTEFTU0VTX0RJUikpOwotICAgICAgICB9Ci0gICAgICAgIGNsYXNzUGF0aC5hZGQobmV3IFBhdGgoY29kZUdlblByb2plY3QsIGNwKSk7Ci0KLSAgICAgICAgamF2YUNvbXBpbGVyLnNldENsYXNzcGF0aChjbGFzc1BhdGgpOwotCi0gICAgICAgIC8vc2V0IHNvdXJjZVBhdGggLSBUaGUgZ2VuZXJhdGVkIG91dHB1dCBkaXJlY3RvcmllcyBhbHNvIGJlY29tZSBwYXJ0IG9mIHRoZSBzb3VyY2VwYXRoCi0gICAgICAgIFBhdGggc291cmNlUGF0aCA9IG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LCBvdXRkaXIpOwotICAgICAgICBzb3VyY2VQYXRoLnNldExvY2F0aW9uKG91dHB1dExvY2F0aW9uRmlsZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRTcmNkaXIoc291cmNlUGF0aCk7Ci0KLSAgICAgICAgLy9vdXRwdXQgdGhlIGNsYXNzZXMgaW50byB0aGUgb3V0cHV0IGRpciBhcyB3ZWxsCi0gICAgICAgIGphdmFDb21waWxlci5zZXREZXN0ZGlyKG91dHB1dExvY2F0aW9uRmlsZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXREZWJ1Zyh0cnVlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldFZlcmJvc2UodHJ1ZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5leGVjdXRlKCk7Ci0vLyAgICAgICAgY29kZUdlblByb2plY3QuZXhlY3V0ZVRhcmdldChDT01QSUxFX1RBUkdFVF9OQU1FKTsKLSAgICB9Ci0KLS8qICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEFuZFJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdGFydFNlcnZlcigpOwotCi0gICAgICAgIC8vIHN0YXJ0IGJ5IGdlbmVyYXRpbmcgYW5kIGNvbXBpbGluZyB0aGUgQXhpczIgaW50ZXJmYWNlIGNvZGUKLSAgICAgICAgU3RyaW5nIG91dGRpciA9Ci0gICAgICAgICAgICAgICAgT1VUUFVUX0xPQ0FUSU9OX0JBU0UgKyBPVVRQVVRfTE9DQVRJT05fUFJFRklYOwotICAgICAgICBjb2RlR2VuZXJhdGUoV1NETF9CQVNFX0RJUiArICJjdXN0b21lci1lY2hvLndzZGwiLAotICAgICAgICAgICAgICAgICAgICAgQklORElOR19CQVNFX0RJUiArICJjdXN0b21lci1iaW5kaW5nLnhtbCIsIG91dGRpciwgZmFsc2UpOwotICAgICAgICBjb21waWxlKG91dGRpcik7Ci0KLS8vICAgICAgICAgZmluaXNoIGJ5IHRlc3RpbmcgYSByb3VuZHRyaXAgY2FsbCB0byB0aGUgZWNobyBzZXJ2ZXIKLSAgICAgICAgRmlsZSBjbGFzc2VzZGlyID0gbmV3IEZpbGUob3V0ZGlyICsgIi9jbGFzc2VzLyIpOwotICAgICAgICBVUkxDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgY2xhc3Nlc2Rpci50b1VSTCgpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIENsYXNzIHN0dWIgPSBsb2FkZXIubG9hZENsYXNzKFNUVUJfQ0xBU1MpOwotICAgICAgICBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbig0MiwgIkpvaG4iLCAiU21pdGgiKTsKLSAgICAgICAgQ3VzdG9tZXIgY3VzdG9tZXIgPSBuZXcgQ3VzdG9tZXIoIlJlZG1vbmQiLCBwZXJzb24sICIrMTQyNTg4NTgwODAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0EiLCAiMTQ2MTkgTkUgODB0aCBQbC4iLCBuZXcgSW50ZWdlcig5ODA1MikpOwotICAgICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHN0dWIuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10gewotICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjU1NTUvYXhpczIvc2VydmljZXMvRWNob0N1c3RvbWVyU2VydmljZS9lY2hvIi5nZXRDbGFzcygpIH0pOwotICAgICAgICBPYmplY3QgaW5zdCA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJodHRwOi8vMTI3LjAuMC4xOjU1NTUvYXhpczIvc2VydmljZXMvRWNob0N1c3RvbWVyU2VydmljZS9lY2hvIiB9KTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IHN0dWIuZ2V0TWV0aG9kKCJlY2hvIiwgbmV3IENsYXNzW10geyBDdXN0b21lci5jbGFzcyB9KTsKLSAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1ldGhvZC5pbnZva2UoaW5zdCwgbmV3IE9iamVjdFtdIHsgY3VzdG9tZXIgfSk7Ci0gICAgICAgIHN0b3BTZXJ2ZXIoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2JqZWN0IGRvZXMgbm90IG1hdGNoIHJlcXVlc3Qgb2JqZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyLCByZXN1bHQpOwotICAgIH0gICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVXcmFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2VuZXJhdGUgYW5kIGNvbXBpbGUgdGhlIEF4aXMyIGludGVyZmFjZSBjb2RlCi0gICAgICAgIFN0cmluZyBvdXRkaXIgPSBPVVRQVVRfTE9DQVRJT05fQkFTRSArIE9VVFBVVF9MT0NBVElPTl9QUkVGSVg7Ci0gICAgICAgIGNvZGVHZW5lcmF0ZShXU0RMX0JBU0VfRElSICsgImxpYnJhcnkud3NkbCIsCi0gICAgICAgICAgICAgICAgICAgICBCSU5ESU5HX0JBU0VfRElSICsgImxpYnJhcnktYmluZGluZy54bWwiLCBvdXRkaXIsIGZhbHNlKTsKLSAgICAgICAgY29tcGlsZShvdXRkaXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21waWxlVW53cmFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2VuZXJhdGUgYW5kIGNvbXBpbGUgdGhlIEF4aXMyIGludGVyZmFjZSBjb2RlCi0gICAgICAgIFN0cmluZyBvdXRkaXIgPSBPVVRQVVRfTE9DQVRJT05fQkFTRSArIE9VVFBVVF9MT0NBVElPTl9QUkVGSVg7Ci0gICAgICAgIGNvZGVHZW5lcmF0ZShXU0RMX0JBU0VfRElSICsgImxpYnJhcnkud3NkbCIsCi0gICAgICAgICAgICAgICAgICAgICBCSU5ESU5HX0JBU0VfRElSICsgImxpYnJhcnktYmluZGluZy54bWwiLCBvdXRkaXIsIHRydWUpOwotICAgICAgICBjb21waWxlKG91dGRpcik7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvVXRpbFNlcnZlci5qYXZhIGIvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9VdGlsU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTc5NzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9VdGlsU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYng7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkxpc3RlbmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFV0aWxTZXJ2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTaW1wbGVIVFRQU2VydmVyIHJlY2VpdmVyOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEVTVElOR19QT1JUID0gNTU1NTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfTUVTU0FHRSA9ICJJbnRlbnRpb25hbCBGYWlsdXJlIjsKLQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZXBsb3lTZXJ2aWNlKEF4aXNTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2UoCi0gICAgICAgICAgICAgICAgc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bkRlcGxveVNlcnZpY2UoUU5hbWUgc2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAucmVtb3ZlU2VydmljZShzZXJ2aWNlLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KFN0cmluZyByZXBvc2l0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGVyID0gZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQocmVwb3NpdG9yeSk7Ci0KLSAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoZXIsIFRFU1RJTkdfUE9SVCk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgc3RhcnRlZCBvbiBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgVEVTVElOR19QT1JUICsgIi4uLi4uIik7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaHJlYWQgaW50ZXJ1cHR0ZWQiLCBlMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjb3VudCsrOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoU3RyaW5nIHJlcG9zaXRvcnksIFN0cmluZyBheGlzMnhtbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBlciA9IGdldE5ld0NvbmZpZ3VyYXRpb25Db250ZXh0KHJlcG9zaXRvcnksIGF4aXMyeG1sKTsKLQotICAgICAgICAgICAgcmVjZWl2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihlciwgVEVTVElOR19QT1JUKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWNlaXZlci5zdGFydCgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdGFydGVkIG9uIHBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBURVNUSU5HX1BPUlQgKyAiLi4uLi4iKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRocmVhZCBpbnRlcnVwdHRlZCIsIGUxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dCgKLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVwb3NpdG9yeSk7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigicmVwb3NpdG9yeSBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGRvZXMgbm90IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9jb25mL2F4aXMyLnhtbCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSwgU3RyaW5nIGF4aXMyeG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVwb3NpdG9yeSk7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigicmVwb3NpdG9yeSBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGRvZXMgbm90IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyeG1sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJlY2VpdmVyLnN0b3AoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWNlaXZlci5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIC8vIHRwLmRvU3RvcCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiU2VydmVyIHN0b3BwZWQgLi4uLi4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRMaXN0ZW5lck1hbmFnZXIoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIuc3RvcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L2JlYW5zL0Jvb2suamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvYmVhbnMvQm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzgyMGRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvYmVhbnMvQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBCb29rIHsKLSAgICBwcml2YXRlIFN0cmluZyBtX3R5cGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9pc2JuOwotICAgIHByaXZhdGUgU3RyaW5nIG1fdGl0bGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBtX2F1dGhvcnM7Ci0KLSAgICBwdWJsaWMgQm9vaygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vayhTdHJpbmcgdHlwZSwgU3RyaW5nIGlzYm4sIFN0cmluZyB0aXRsZSwgU3RyaW5nW10gYXV0aG9ycykgewotICAgICAgICBtX2lzYm4gPSBpc2JuOwotICAgICAgICBtX3RpdGxlID0gdGl0bGU7Ci0gICAgICAgIG1fdHlwZSA9IHR5cGU7Ci0gICAgICAgIG1fYXV0aG9ycyA9IGF1dGhvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gbV90eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNibigpIHsKLSAgICAgICAgcmV0dXJuIG1faXNibjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gbV90aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXV0aG9ycygpIHsKLSAgICAgICAgcmV0dXJuIG1fYXV0aG9yczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC9iZWFucy9UeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L2JlYW5zL1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZWVjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L2JlYW5zL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LmJlYW5zOwotCi1wdWJsaWMgY2xhc3MgVHlwZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV9uYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1fZGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBpbnQgbV9jb3VudDsKLQotICAgIHB1YmxpYyBUeXBlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgbV9uYW1lID0gbmFtZTsKLSAgICAgICAgbV9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbV9kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICByZXR1cm4gbV9jb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgY291bnQpIHsKLSAgICAgICAgbV9jb3VudCA9IGNvdW50OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tJbnN0YW5jZVJlcXVlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va0luc3RhbmNlUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjZjNzkyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va0luc3RhbmNlUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuQm9vazsKLQotcHVibGljIGNsYXNzIEFkZEJvb2tJbnN0YW5jZVJlcXVlc3QgewotICAgIHByaXZhdGUgQm9vayBtX2Jvb2s7Ci0KLSAgICBwdWJsaWMgQWRkQm9va0luc3RhbmNlUmVxdWVzdChCb29rIGJvb2spIHsKLSAgICAgICAgbV9ib29rID0gYm9vazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vayBnZXRCb29rKCkgewotICAgICAgICByZXR1cm4gbV9ib29rOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tJbnN0YW5jZVJlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tJbnN0YW5jZVJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjNmYTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rSW5zdGFuY2VSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRCb29rSW5zdGFuY2VSZXNwb25zZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rUmVxdWVzdC5qYXZhIGIvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjdhNzEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvQWRkQm9va1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LmJlYW5zLkJvb2s7Ci0KLXB1YmxpYyBjbGFzcyBBZGRCb29rUmVxdWVzdCB7Ci0gICAgcHJpdmF0ZSBCb29rIG1fYm9vazsKLQotICAgIHB1YmxpYyBBZGRCb29rUmVxdWVzdChCb29rIGJvb2spIHsKLSAgICAgICAgbV9ib29rID0gYm9vazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vayBnZXRCb29rKCkgewotICAgICAgICByZXR1cm4gbV9ib29rOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tSZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9BZGRCb29rUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNkOTA5MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0FkZEJvb2tSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRCb29rUmVzcG9uc2UgewotICAgIHByaXZhdGUgYm9vbGVhbiBtX3N1Y2Nlc3M7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWNjZXNzKGJvb2xlYW4gc3VjY2VzcykgewotICAgICAgICBtX3N1Y2Nlc3MgPSBzdWNjZXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VjY2VzcygpIHsKLSAgICAgICAgcmV0dXJuIG1fc3VjY2VzczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rUmVxdWVzdC5qYXZhIGIvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmJmZmVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzOwotCi1wdWJsaWMgY2xhc3MgR2V0Qm9va1JlcXVlc3QgewotICAgIHByaXZhdGUgU3RyaW5nIG1faXNibjsKLQotICAgIHB1YmxpYyBHZXRCb29rUmVxdWVzdChTdHJpbmcgaXNibikgewotICAgICAgICBtX2lzYm4gPSBpc2JuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXNibigpIHsKLSAgICAgICAgcmV0dXJuIG1faXNibjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rUmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5N2NiY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LmJlYW5zLkJvb2s7Ci0KLXB1YmxpYyBjbGFzcyBHZXRCb29rUmVzcG9uc2UgewotICAgIHByaXZhdGUgQm9vayBtX2Jvb2s7Ci0KLSAgICBwdWJsaWMgR2V0Qm9va1Jlc3BvbnNlKEJvb2sgYm9vaykgewotICAgICAgICBtX2Jvb2sgPSBib29rOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rIGdldEJvb2soKSB7Ci0gICAgICAgIHJldHVybiBtX2Jvb2s7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va3NCeVR5cGVSZXF1ZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tzQnlUeXBlUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjAyOTBkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0Qm9va3NCeVR5cGVSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamlieC53cmFwcGVyczsKLQotcHVibGljIGNsYXNzIEdldEJvb2tzQnlUeXBlUmVxdWVzdCB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbV90eXBlOwotCi0gICAgcHVibGljIEdldEJvb2tzQnlUeXBlUmVxdWVzdChTdHJpbmcgdHlwZSkgewotICAgICAgICBtX3R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1fdHlwZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRCb29rc0J5VHlwZVJlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tzQnlUeXBlUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxOWEyMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldEJvb2tzQnlUeXBlUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qaWJ4LmJlYW5zLkJvb2s7Ci0KLXB1YmxpYyBjbGFzcyBHZXRCb29rc0J5VHlwZVJlc3BvbnNlIHsKLSAgICBwcml2YXRlIEJvb2tbXSBtX2Jvb2tzOwotCi0gICAgcHVibGljIEdldEJvb2tzQnlUeXBlUmVzcG9uc2UoQm9va1tdIGJvb2tzKSB7Ci0gICAgICAgIG1fYm9va3MgPSBib29rczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9va1tdIGdldEJvb2tzKCkgewotICAgICAgICByZXR1cm4gbV9ib29rczsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRUeXBlc1JlcXVlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0VHlwZXNSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTVhZjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvamlieC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamlieC93cmFwcGVycy9HZXRUeXBlc1JlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qaWJ4LndyYXBwZXJzOwotCi1wdWJsaWMgY2xhc3MgR2V0VHlwZXNSZXF1ZXN0IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qaWJ4L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qaWJ4L3dyYXBwZXJzL0dldFR5cGVzUmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0VHlwZXNSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY4MTIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2ppYngvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2ppYngvd3JhcHBlcnMvR2V0VHlwZXNSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmppYngud3JhcHBlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmppYnguYmVhbnMuVHlwZTsKLQotcHVibGljIGNsYXNzIEdldFR5cGVzUmVzcG9uc2UgewotICAgIHByaXZhdGUgVHlwZVtdIG1fdHlwZXM7Ci0KLSAgICBwdWJsaWMgR2V0VHlwZXNSZXNwb25zZShUeXBlW10gdHlwZXMpIHsKLSAgICAgICAgbV90eXBlcyA9IHR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlW10gZ2V0VHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBtX3R5cGVzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qc29uL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9qc29uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjZjMTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvanNvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWpzb248L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSlNPTjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgSlNPTiBtb2R1bGU8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qZXR0aXNvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHRpc29uPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbHVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9qc29uPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvanNvbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvanNvbjwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzZTM1My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTkJhZGdlcmZpc2hEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmJhZGdlcmZpc2guQmFkZ2VyRmlzaFhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OVG9rZW5lcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogSlNPTkRhdGFTb3VyY2Uga2VlcHMgdGhlIEpTT04gU3RyaW5nIGluc2lkZSBhbmQgY29uc3VtZXMgaXQgd2hlbiBuZWVkZWQuIFRoaXMgaXMgdG8gYmUga2VwdCBpbgotICogdGhlIE9NU291cmNlZEVsZW1lbnRJbXBsIGFuZCBjYW4gYmUgdXNlZCBlaXRoZXIgdG8gZXhwYW5kIHRoZSB0cmVlIG9yIGdldCB0aGUgSlNPTiBTdHJpbmcKLSAqIGRpcmVjdGx5IHdpdGhvdXQgZXhwYW5kaW5nLiBUaGlzIHVzZXMgdGhlICJCYWRnZXJmaXNoIiBKU09OIGNvbnZlbnRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSBleHRlbmRzIEpTT05EYXRhU291cmNlIHsKLQotICAgIHB1YmxpYyBKU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UoSW5wdXRTdHJlYW0ganNvbklucHV0U3RyZWFtLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGpzb25JbnB1dFN0cmVhbSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlcyB0aGUgU3RBWCByZWFkZXIgdXNpbmcgdGhlICJCYWRnZXJmaXNoIiBmb3JtYXR0ZWQgaW5wdXQgSlNPTiBTdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBYTUxTdHJlYW1SZWFkZXIgYWNjb3JkaW5nIHRvIHRoZSBKU09OIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgbWFraW5nIHRoZSBTdEFYIHJlYWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICAvL2lucHV0IGZhY3RvcnkgZm9yICJCYWRnZXJmaXNoIgotICAgICAgICBCYWRnZXJGaXNoWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IG5ldyBCYWRnZXJGaXNoWE1MSW5wdXRGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBKU09OVG9rZW5lcigieyIgKyBsb2NhbE5hbWUgKyAiOiIgKyB0aGlzLmdldEpTT05TdHJpbmcoKSkpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoTWVzc2FnZUZvcm1hdHRlci5qYXZhIGIvMV81L21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoTWVzc2FnZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDJhMWNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaE1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmJhZGdlcmZpc2guQmFkZ2VyRmlzaFhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi0vKioKLSAqIFRoaXMgSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9ybWF0dGVyIGlzIHRoZSBmb3JtYXR0ZXIgZm9yICJCYWRnZXJmaXNoIiBmb3JtYXR0ZWQgSlNPTiBpbiBBeGlzMi4KLSAqIEVnOiAgJmx0O291dCZndDsmbHQ7aW4mZ3Q7bWFwcGVkIEpTT04mbHQ7L2luJmd0OyZsdDsvb3V0Jmd0OyBpcyBjb252ZXJ0ZWQgdG8uLi4KLSAqIHsib3V0Ijp7ImluIjp7IiQiOiJtYXBwZWQgSlNPTiJ9fX0gVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHlvdSB3YW50IHRvIHNlbmQgbWVzc2FnZXMgd2l0aAotICogbmFtZXNwYWNlcyB3aXRoIEpTT04KLSAqLwotCi1wdWJsaWMgY2xhc3MgSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9ybWF0dGVyIGV4dGVuZHMgSlNPTk1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgLy9yZXR1cm5zIHRoZSB3cml0ZXIgZm9yIHRoZSBiYWRnZXJmaXNoIGZvcm1hdAotICAgIHByb3RlY3RlZCBYTUxTdHJlYW1Xcml0ZXIgZ2V0SlNPTldyaXRlcihPdXRwdXRTdHJlYW0gb3V0U3RyZWFtKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmFkZ2VyRmlzaFhNTFN0cmVhbVdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBkYXRhIHNvdXJjZSBpcyBhICJCYWRnZXJmaXNoIiBmb3JtYXR0ZWQgZGF0YSBzb3VyY2UsIGdpdmVzIHRoZSBKU09OIHN0cmluZyBieSBkaXJlY3RseQotICAgICAqIHRha2luZyBmcm9tIHRoZSBkYXRhIHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhU291cmNlIGRhdGEgc291cmNlIHRvIGJlIGNoZWNrZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBKU09OIHN0cmluZyB0byB3cml0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nVG9Xcml0ZShPTURhdGFTb3VyY2UgZGF0YVNvdXJjZSkgewotICAgICAgICBpZiAoZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuICgoSlNPTkRhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0Q29tcGxldGVKT1NOU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OQmFkZ2VyZmlzaE9NQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoT01CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjJhZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05CYWRnZXJmaXNoT01CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogTWVzc2FnZSBidWlsZGVyIGZvciAiQmFkZ2VyZmlzaCIgY29udmVudGlvbi4gRGF0YVNvdXJjZSB1c2VkIGhlcmUgaXMKLSAqIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSB3aGljaCBpcyBzcGVjaWZpYyBmb3IgIkJhZGdlcmZpc2giCi0gKi8KLQotcHVibGljIGNsYXNzIEpTT05CYWRnZXJmaXNoT01CdWlsZGVyIGV4dGVuZHMgSlNPTk9NQnVpbGRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgSlNPTkRhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZShJbnB1dFN0cmVhbSBqc29uSW5wdXRTdHJlYW0sIFN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZShqc29uSW5wdXRTdHJlYW0sICJcIiIgKyBwcmVmaXggKyBsb2NhbE5hbWUgKyAiXCIiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTkRhdGFTb3VyY2UuamF2YSBiLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09ORGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMWM4NjlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09ORGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05Ub2tlbmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5tYXBwZWQuTWFwcGVkWE1MSW5wdXRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEpTT05EYXRhU291cmNlIGtlZXBzIHRoZSBKU09OIFN0cmluZyBpbnNpZGUgYW5kIGNvbnN1bWVzIGl0IHdoZW4gbmVlZGVkLiBUaGlzIGlzIHRvIGJlIGtlcHQgaW4KLSAqIHRoZSBPTVNvdXJjZWRFbGVtZW50SW1wbCBhbmQgY2FuIGJlIHVzZWQgZWl0aGVyIHRvIGV4cGFuZCB0aGUgdHJlZSBvciBnZXQgdGhlIEpTT04gU3RyaW5nCi0gKiBkaXJlY3RseSB3aXRob3V0IGV4cGFuZGluZy4gVGhpcyB1c2VzIHRoZSAiTWFwcGVkIiBKU09OIGNvbnZlbnRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEpTT05EYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0ganNvbklucHV0U3RyZWFtOwotICAgIHByaXZhdGUgU3RyaW5nIGpzb25TdHJpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOwotCi0gICAgcHVibGljIEpTT05EYXRhU291cmNlKElucHV0U3RyZWFtIGpzb25JbnB1dFN0cmVhbSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICB0aGlzLmpzb25JbnB1dFN0cmVhbSA9IGpzb25JbnB1dFN0cmVhbTsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIEpTT04gaW50byB0aGUgb3V0cHV0IHN0cmVhbS4gQXMgdGhpcyBzaG91bGQgd3JpdGUgSlNPTiwgaXQgZGlyZWN0bHkgZ2V0cyB0aGUgSlNPTgotICAgICAqIHN0cmluZyBhbmQgd3JpdGVzIGl0IHdpdGhvdXQgZXhwYW5kaW5nIHRoZSB0cmVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSAgIHRoZSBzdHJlYW0gdG8gYmUgd3JpdHRlbiBpbnRvCi0gICAgICogQHBhcmFtIG9tT3V0cHV0Rm9ybWF0IGZvcm1hdCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyBpZ25vcmVkLgotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSB3cml0aW5nIHRoZSBtZXNzYWdlIGluIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBPTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGdldENvbXBsZXRlSk9TTlN0cmluZygpLmdldEJ5dGVzKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBKU09OIHRocm91Z2ggdGhlIHdyaXRlci4gQXMgdGhpcyBzaG91bGQgd3JpdGUgSlNPTiwgaXQgZGlyZWN0bHkgZ2V0cyB0aGUgSlNPTiBzdHJpbmcKLSAgICAgKiBhbmQgd3JpdGVzIGl0IHdpdGhvdXQgZXhwYW5kaW5nIHRoZSB0cmVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlciAgICAgICAgIFdyaXRlciB0byBiZSB3cml0dGVuIGludG8KLSAgICAgKiBAcGFyYW0gb21PdXRwdXRGb3JtYXQgZm9ybWF0IG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIGlnbm9yZWQuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGhyb3VnaCB0aGUgd3JpdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgd3JpdGVyLCBPTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGdldENvbXBsZXRlSk9TTlN0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE9NRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgWE1MIHRocm91Z2ggdGhlIFhNTFN0cmVhbVdyaXRlci4gQXMgdGhlIGlucHV0IGRhdGEgc291cmNlIGlzIEpTT04sIHRoaXMgbWV0aG9kIG5lZWRzCi0gICAgICogdG8gZ2V0IGEgU3RBWCByZWFkZXIgZnJvbSB0aGF0IEpTT04gU3RyaW5nLiBUaGVyZWZvcmUgdGhpcyB1c2VzIHRoZSBnZXRSZWFkZXIoKSBtZXRob2QgdG8gZ2V0Ci0gICAgICogdGhlIFN0QVggcmVhZGVyIHdyaXRlcyB0aGUgZXZlbnRzIGludG8gdGhlIFhNTFN0cmVhbVdyaXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSB4bWxTdHJlYW1Xcml0ZXIgU3RBWCB3cml0ZXIgdG8gYmUgd3JpdHRlbiBpbnRvCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdGhyb3VnaCB0aGUgU3RBWCB3cml0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZ2V0UmVhZGVyKCk7Ci0gICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoKTsKLSAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGludCB4ID0gcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoeCkgewotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChyZWFkZXIuZ2V0UHJlZml4KCksIHJlYWRlci5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuYW1lc3BhY2VDb3VudCA9IHJlYWRlci5nZXROYW1lc3BhY2VDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbmFtZXNwYWNlQ291bnQgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlTmFtZXNwYWNlKHJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWVzcGFjZVVSSShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZUNvdW50ID0gcmVhZGVyLmdldEF0dHJpYnV0ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlQXR0cmlidXRlKHJlYWRlci5nZXRBdHRyaWJ1dGVQcmVmaXgoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNIQVJBQ1RFUlM6Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZUNoYXJhY3RlcnMocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLkNEQVRBOgotICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVDRGF0YShyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQ6Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UOgotICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFhNTFN0cmVhbUNvbnN0YW50cy5TUEFDRToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuQ09NTUVOVDoKLSAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlQ29tbWVudChyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRFREOgotICAgICAgICAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVEVEQocmVhZGVyLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgWE1MU3RyZWFtQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046Ci0gICAgICAgICAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihyZWFkZXIuZ2V0UElUYXJnZXQoKSwgcmVhZGVyLmdldFBJRGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBYTUxTdHJlYW1Db25zdGFudHMuRU5USVRZX1JFRkVSRU5DRToKLSAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLndyaXRlRW50aXR5UmVmKHJlYWRlci5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBTdEFYIHJlYWRlciB1c2luZyB0aGUgIk1hcHBlZCIgZm9ybWF0dGVkIGlucHV0IEpTT04gU3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgWE1MU3RyZWFtUmVhZGVyIGFjY29yZGluZyB0byB0aGUgSlNPTiBTdHJpbmcuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIG1ha2luZyB0aGUgU3RBWCByZWFkZXIuCi0gICAgICovCi0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIEhhc2hNYXAgWE1MVG9KU05OYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBYTUxUb0pTTk5hbWVzcGFjZU1hcC5wdXQoIiIsICIiKTsKLQotICAgICAgICAvL2lucHV0IGZhY3RvcnkgZm9yICJNYXBwZWQiIGNvbnZlbnRpb24KLSAgICAgICAgTWFwcGVkWE1MSW5wdXRGYWN0b3J5IGlucHV0RmFjdG9yeSA9IG5ldyBNYXBwZWRYTUxJbnB1dEZhY3RvcnkoWE1MVG9KU05OYW1lc3BhY2VNYXApOwotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9ICJ7IiArIGxvY2FsTmFtZSArICI6IiArIHRoaXMuZ2V0SlNPTlN0cmluZygpOwotICAgICAgICByZXR1cm4gaW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgSlNPTlRva2VuZXIoanNvblN0cmluZykpOwotICAgIH0KLQotICAgIC8vcmV0dXJucyB0aGUganNvbiBzdHJpbmcgYnkgY29uc3VtaW5nIHRoZSBKU09OIGlucHV0IHN0cmVhbS4KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEpTT05TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChpc1JlYWQpIHsKLSAgICAgICAgICAgIHJldHVybiBqc29uU3RyaW5nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjaGFyIHRlbXAgPSAoY2hhcilqc29uSW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGludCl0ZW1wICE9IDY1NTM1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgKz0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IChjaGFyKWpzb25JbnB1dFN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBPTUV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNSZWFkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBqc29uU3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wbGV0ZUpPU05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAieyIgKyBsb2NhbE5hbWUgKyAiOiIgKyBnZXRKU09OU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvanNvbi9zcmMvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05NZXNzYWdlRm9ybWF0dGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk1lc3NhZ2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5OGI3Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk1lc3NhZ2VGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSSUVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5tYXBwZWQuTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24ubWFwcGVkLk1hcHBlZFhNTFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFRoaXMgSlNPTk1lc3NhZ2VGb3JtYXR0ZXIgaXMgdGhlIGZvcm1hdHRlciBmb3IgIk1hcHBlZCIgZm9ybWF0dGVkIEpTT04gaW4gQXhpczIuIFRoaXMgdHlwZSBvZgotICogSlNPTiBzdHJpbmdzIGFyZSByZWFsbHkgZWFzeSB0byB1c2UgaW4gSmF2YXNjcmlwdC4gRWc6ICAmbHQ7b3V0Jmd0OyZsdDtpbiZndDttYXBwZWQKLSAqIEpTT04mbHQ7L2luJmd0OyZsdDsvb3V0Jmd0OyBpcyBjb252ZXJ0ZWQgdG8uLi4geyJvdXQiOnsiaW4iOiJtYXBwZWQgSlNPTiJ9fSBXQVJOSU5HOiBXZSBkbyBub3QKLSAqIHN1cHBvcnQgIk1hcHBlZCIgSlNPTiBTdHJpbmdzIHdpdGggKm5hbWVzcGFjZXMqIGluIEF4aXMyLiBUaGlzIGNvbnZlbnRpb24gaXMgc3VwcG9ydGVkIGluIEF4aXMyLAotICogd2l0aCB0aGUgYWltIG9mIG1ha2luZyBKYXZhc2NyaXB0IHVzZXJzJyBsaWZlIGVhc3kgKHNlcnZpY2VzIHdyaXR0ZW4gaW4gSmF2YXNjcmlwdCkuIFRoZXJlIGFyZQotICogbm8gbmFtZXNwYWNlcyB1c2VkIGluIEphdmFzY3JpcHQuIElmIHlvdSB3YW50IHRvIHVzZSBKU09OIHdpdGggbmFtZXNwYWNlcywgdXNlIHRoZQotICogSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9yYXR0ZXIgKGZvciAiQmFkZ2VyZmlzaCIgZm9ybWF0dGVkIEpTT04pIHdoaWNoIHN1cHBvcnRzIEpTT04gd2l0aAotICogbmFtZXNwYWNlcy4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBKU09OTWVzc2FnZUZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgewotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSAoU3RyaW5nKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgPSAoU3RyaW5nKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVzIHRoZSBKU09OIG1lc3NhZ2UgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuIElmIHRoZSBwYXlsb2FkIGlzIGFuIE9NU291cmNlZEVsZW1lbnRJbXBsIGFuZAotICAgICAqIGl0IGNvbnRhaW5zIGEgSlNPTkRhdGFTb3VyY2Ugd2l0aCBhIGNvcnJlY3RseSBmb3JtYXR0ZWQgSlNPTiBTdHJpbmcsIGdldHMgaXQgZGlyZWN0bHkgZnJvbQotICAgICAqIHRoZSBEYXRhU291cmNlIGFuZCByZXR1cm5zIGFzIGEgYnl0ZSBhcnJheS4gSWYgbm90LCB0aGUgT00gdHJlZSBpcyBleHBhbmRlZCBhbmQgaXQgaXMKLSAgICAgKiBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBzdHJlYW0gYW5kIGJ5dGUgYXJyYXkgaXMgcmV0dXJuZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ3R4dCBNZXNzYWdlIGNvbnRleHQgd2hpY2ggY29udGFpbnMgdGhlIHNvYXAgZW52ZWxvcGUgdG8gYmUgd3JpdHRlbgotICAgICAqIEBwYXJhbSBmb3JtYXQgIGZvcm1hdCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyBpZ25vcmVkCi0gICAgICogQHJldHVybiB0aGUgcGF5bG9hZCBhcyBhIGJ5dGUgYXJyYXkKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHVzaW5nIFN0QVggd3JpdGVyIG9yIElGIFRIRQotICAgICAqICAgICAgICAgICAgICAgICAgIFVTRVIgVFJJRVMgVE8gU0VORCBBIEpTT04gTUVTU0FHRSBXSVRIIE5BTUVTUEFDRVMgVVNJTkcgVEhFICJNQVBQRUQiCi0gICAgICogICAgICAgICAgICAgICAgICAgQ09OVkVOVElPTi4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBtc2dDdHh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAvL2lmIHRoZSBlbGVtZW50IGlzIGFuIE9NU291cmNlZEVsZW1lbnRJbXBsIGFuZCBpdCBjb250YWlucyBhIEpTT05EYXRhU291cmNlIHdpdGgKLSAgICAgICAgLy9jb3JyZWN0IGNvbnZlbnRpb24sIGRpcmVjdGx5IGdldCB0aGUgSlNPTiBzdHJpbmcuCi0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCAmJgotICAgICAgICAgICAgICAgIGdldFN0cmluZ1RvV3JpdGUoKChPTVNvdXJjZWRFbGVtZW50SW1wbCllbGVtZW50KS5nZXREYXRhU291cmNlKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBqc29uVG9Xcml0ZSA9IGdldFN0cmluZ1RvV3JpdGUoKChPTVNvdXJjZWRFbGVtZW50SW1wbCllbGVtZW50KS5nZXREYXRhU291cmNlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGpzb25Ub1dyaXRlLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAvL290aGVyd2lzZSBzZXJpYWxpemUgdGhlIE9NIGJ5IGV4cGFuZGluZyB0aGUgdHJlZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXNPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIGpzb25Xcml0ZXIgPSBnZXRKU09OV3JpdGVyKGJ5dGVzT3V0KTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoanNvbldyaXRlcik7Ci0gICAgICAgICAgICAgICAganNvbldyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNPdXQudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJNYXBwZWQgZm9ybWF0dGVkIEpTT04gd2l0aCBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEF4aXMyLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ha2Ugc3VyZSB0aGF0IHlvdXIgcmVxdWVzdCBkb2Vzbid0IGluY2x1ZGUgbmFtZXNwYWNlcyBvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgQmFkZ2VyZmlzaCBjb252ZW50aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvL3JldHVybnMgdGhlICJNYXBwZWQiIEpTT04gd3JpdGVyCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVdyaXRlciBnZXRKU09OV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRTdHJlYW0pIHsKLSAgICAgICAgTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbiBtbmMgPSBuZXcgTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbigpOwotICAgICAgICByZXR1cm4gbmV3IE1hcHBlZFhNTFN0cmVhbVdyaXRlcihtbmMsIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0U3RyZWFtKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGRhdGEgc291cmNlIGlzIGEgIk1hcHBlZCIgZm9ybWF0dGVkIGRhdGEgc291cmNlLCBnaXZlcyB0aGUgSlNPTiBzdHJpbmcgYnkgZGlyZWN0bHkKLSAgICAgKiB0YWtpbmcgZnJvbSB0aGUgZGF0YSBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBkYXRhIHNvdXJjZSB0byBiZSBjaGVja2VkCi0gICAgICogQHJldHVybiB0aGUgSlNPTiBzdHJpbmcgdG8gd3JpdGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ1RvV3JpdGUoT01EYXRhU291cmNlIGRhdGFTb3VyY2UpIHsKLSAgICAgICAgaWYgKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBKU09ORGF0YVNvdXJjZSkgewotICAgICAgICAgICAgcmV0dXJuICgoSlNPTkRhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0Q29tcGxldGVKT1NOU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgSlNPTiBtZXNzYWdlIHRvIHRoZSBvdXRwdXQgc3RyZWFtIHdpdGggdGhlIGNvcnJlY3QgY29udmVudGlvbi4gSWYgdGhlIHBheWxvYWQgaXMKLSAgICAgKiBhbiBPTVNvdXJjZWRFbGVtZW50SW1wbCBhbmQgaXQgY29udGFpbnMgYSBKU09ORGF0YVNvdXJjZSB3aXRoIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBKU09OCi0gICAgICogU3RyaW5nLCBnZXRzIGl0IGRpcmVjdGx5IGZyb20gdGhlIERhdGFTb3VyY2UgYW5kIHdyaXRlcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4gSWYgbm90LCB0aGUgT00KLSAgICAgKiB0cmVlIGlzIGV4cGFuZGVkIGFuZCBpdCBpcyBzZXJpYWxpemVkIGludG8gdGhlIG91dHB1dCBzdHJlYW0uICAgICAgICAgICAgICAqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ3R4dCAgTWVzc2FnZSBjb250ZXh0IHdoaWNoIGNvbnRhaW5zIHRoZSBzb2FwIGVudmVsb3BlIHRvIGJlIHdyaXR0ZW4KLSAgICAgKiBAcGFyYW0gZm9ybWF0ICAgZm9ybWF0IG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIGlnbm9yZWQKLSAgICAgKiBAcGFyYW0gb3V0ICAgICAgb3V0cHV0IHN0cmVhbSB0byBiZSB3cml0dGVuIGluIHRvCi0gICAgICogQHBhcmFtIHByZXNlcnZlIGlnbm9yZWQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB3cml0aW5nIHRoZSBtZXNzYWdlIHVzaW5nIFN0QVggd3JpdGVyIG9yIElGIFRIRQotICAgICAqICAgICAgICAgICAgICAgICAgIFVTRVIgVFJJRVMgVE8gU0VORCBBIEpTT04gTUVTU0FHRSBXSVRIIE5BTUVTUEFDRVMgVVNJTkcgVEhFICJNQVBQRUQiCi0gICAgICogICAgICAgICAgICAgICAgICAgQ09OVkVOVElPTi4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBwcmVzZXJ2ZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbXNnQ3R4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vTWFwcGVkIGZvcm1hdCBjYW5ub3QgaGFuZGxlIGVsZW1lbnQgd2l0aCBuYW1lc3BhY2VzLi4gU28gY2Fubm90IGhhbmRsZSBGYXVsdHMKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU09BUEZhdWx0ICYmIHRoaXMgaW5zdGFuY2VvZiBKU09OTWVzc2FnZUZvcm1hdHRlcikgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IChTT0FQRmF1bHQpZWxlbWVudDsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudDIgPSBuZXcgT01FbGVtZW50SW1wbCgiRmF1bHQiLCBudWxsLCBlbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50Mi5zZXRUZXh0KGZhdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBlbGVtZW50MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT01Tb3VyY2VkRWxlbWVudEltcGwgJiYKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nVG9Xcml0ZSgoKE9NU291cmNlZEVsZW1lbnRJbXBsKWVsZW1lbnQpLmdldERhdGFTb3VyY2UoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBqc29uVG9Xcml0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdUb1dyaXRlKCgoT01Tb3VyY2VkRWxlbWVudEltcGwpZWxlbWVudCkuZ2V0RGF0YVNvdXJjZSgpKTsKLQotICAgICAgICAgICAgICAgIG91dC53cml0ZShqc29uVG9Xcml0ZS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIGpzb25Xcml0ZXIgPSBnZXRKU09OV3JpdGVyKG91dCk7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGpzb25Xcml0ZXIpOwotICAgICAgICAgICAgICAgIGpzb25Xcml0ZXIud3JpdGVFbmREb2N1bWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICJNYXBwZWQgZm9ybWF0dGVkIEpTT04gd2l0aCBuYW1lc3BhY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEF4aXMyLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFrZSBzdXJlIHRoYXQgeW91ciByZXF1ZXN0IGRvZXNuJ3QgaW5jbHVkZSBuYW1lc3BhY2VzIG9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIEJhZGdlcmZpc2ggY29udmVudGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgVVJMIHRhcmdldFVSTCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QpOwotICAgICAgICBPTUVsZW1lbnQgZGF0YU91dCA9IG1zZ0N0eHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgLy9pZiB0aGUgaHR0cCBtZXRob2QgaXMgR0VULCBzZW5kIHRoZSBqc29uIHN0cmluZyBhcyBhIHBhcmFtZXRlcgotICAgICAgICBpZiAoZGF0YU91dCAhPSBudWxsICYmIChodHRwTWV0aG9kICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VULmVxdWFsc0lnbm9yZUNhc2UoaHR0cE1ldGhvZCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpzb25TdHJpbmc7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGFPdXQgaW5zdGFuY2VvZiBPTVNvdXJjZWRFbGVtZW50SW1wbCAmJiBnZXRTdHJpbmdUb1dyaXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgKChPTVNvdXJjZWRFbGVtZW50SW1wbCkgZGF0YU91dCkuZ2V0RGF0YVNvdXJjZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgPSBnZXRTdHJpbmdUb1dyaXRlKCgoT01Tb3VyY2VkRWxlbWVudEltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU91dCkuZ2V0RGF0YVNvdXJjZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIganNvbldyaXRlciA9IGdldEpTT05Xcml0ZXIob3V0KTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YU91dC5zZXJpYWxpemVBbmRDb25zdW1lKGpzb25Xcml0ZXIpOwotICAgICAgICAgICAgICAgICAgICBqc29uV3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAganNvblN0cmluZyA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBqc29uU3RyaW5nID0gVVJJRW5jb2RlckRlY29kZXIucXVvdGVJbGxlZ2FsKGpzb25TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5MRUdBTF9DSEFSQUNURVJTX0lOX1VSTCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtID0gInF1ZXJ5PSIgKyBqc29uU3RyaW5nOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXR1cm5VUkxGaWxlID0gdGFyZ2V0VVJMLmdldEZpbGUoKSArICI/IiArIHBhcmFtOwotCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh0YXJnZXRVUkwuZ2V0UHJvdG9jb2woKSwgdGFyZ2V0VVJMLmdldEhvc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFVSTC5nZXRQb3J0KCksIHJldHVyblVSTEZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXRVUkw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9qc29uL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk9NQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJlMGM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pzb24vc3JjL29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpzb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5VUklFbmNvZGVyRGVjb2RlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqIE1ha2VzIHRoZSBPTVNvdXJjZWRFbGVtZW50SW1wbCBvYmplY3Qgd2l0aCB0aGUgSlNPTkRhdGFTb3VyY2UgaW5zaWRlLiAqLwotCi1wdWJsaWMgY2xhc3MgSlNPTk9NQnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0KLSAgICBwdWJsaWMgSlNPTk9NQnVpbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnaXZlcyB0aGUgT01Tb3VyY2VkRWxlbWVudEltcGwgdXNpbmcgdGhlIGluY29taW5nIEpTT04gc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gLSBpbmNvbWluZyBtZXNzYWdlIGFzIGFuIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSAtIGNvbnRlbnQgdHlwZSBvZiB0aGUgbWVzc2FnZSAoZWc6IGFwcGxpY2F0aW9uL2pzb24pCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gaW5mbG93IG1lc3NhZ2UgY29udGV4dAotICAgICAqIEByZXR1cm4gT01Tb3VyY2VkRWxlbWVudEltcGwgd2l0aCBKU09ORGF0YVNvdXJjZSBpbnNpZGUKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiIjsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9ICIiOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoIiIsICIiKTsKLQotICAgICAgICAvL2lmIHRoZSBpbnB1dCBzdHJlYW0gaXMgbnVsbCwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZSBIVFRQIG1ldGhvZCBpcyBHRVQsIGlmIHNvIGdldCB0aGUKLSAgICAgICAgLy8gSlNPTiBTdHJpbmcgd2hpY2ggaXMgcmVjZWl2ZWQgYXMgYSBwYXJhbWV0ZXIsIGFuZCBtYWtlIGl0IGFuIGlucHV0IHN0cmVhbQotCi0gICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgICAgICBpZiAoZW5kcG9pbnRSZWZlcmVuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbm5vdCBjcmVhdGUgRG9jdW1lbnRFbGVtZW50IHdpdGhvdXQgZGVzdGluYXRpb24gRVBSIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJMOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0VVJMID0gVVJJRW5jb2RlckRlY29kZXIuZGVjb2RlKGVuZHBvaW50UmVmZXJlbmNlLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcganNvblN0cmluZzsKLSAgICAgICAgICAgIGludCBpbmRleDsKLSAgICAgICAgICAgIC8vQXMgdGhlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgdGhyb3VnaCBHRVQsIGNoZWNrIGZvciAiPSIgc2lnbiBhbmQgY29uc2lkZXIgdGhlIHNlY29uZAotICAgICAgICAgICAgLy9oYWxmIGFzIHRoZSBpbmNvbWluZyBKU09OIG1lc3NhZ2UKLSAgICAgICAgICAgIGlmICgoaW5kZXggPSByZXF1ZXN0VVJMLmluZGV4T2YoIj0iKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAganNvblN0cmluZyA9IHJlcXVlc3RVUkwuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oanNvblN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gSlNPTiBtZXNzYWdlIHJlY2VpdmVkIHRocm91Z2ggSFRUUCBHRVQgb3IgUE9TVCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgTm93IHdlIGhhdmUgdG8gcmVhZCB0aGUgbG9jYWxuYW1lIGFuZCBwcmVmaXggZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgIGlmIHRoZXJlIGlzIG5vdCBwcmVmaXgsIG1lc3NhZ2Ugc3RhcnRzIGxpa2UgeyJmb28iOgotICAgICAgICBpZiB0aGVyZSBpcyBhIHByZWZpeCwgbWVzc2FnZSBzdGFydHMgbGlrZSB7InByZWZpeDpmb28iOgotICAgICAgICAgKi8KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vcmVhZCB0aGUgc3RyZWFtIHVudGlsIHdlIGZpbmQgYSA6IHN5bWJvbAotICAgICAgICAgICAgY2hhciB0ZW1wID0gKGNoYXIpaW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgd2hpbGUgKHRlbXAgIT0gJzonKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gJyAnICYmIHRlbXAgIT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSArPSB0ZW1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ZW1wID0gKGNoYXIpaW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2lmIHRoZSBwYXJ0IHdlIHJlYWQgZW5kcyB3aXRoICIsIHRoZXJlIGlzIG5vIHByZWZpeCwgb3RoZXJ3aXNlIGl0IGhhcyBhIHByZWZpeAotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5jaGFyQXQoMCkgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5jaGFyQXQobG9jYWxOYW1lLmxlbmd0aCgpIC0gMSkgPT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IGxvY2FsTmFtZS5zdWJzdHJpbmcoMSwgbG9jYWxOYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbG9jYWxOYW1lLnN1YnN0cmluZygxLCBsb2NhbE5hbWUubGVuZ3RoKCkpICsgIjoiOwotICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgLy9zbyBmYXIgd2UgaGF2ZSByZWFkIG9ubHkgdGhlIHByZWZpeCwgbm93IGxldHMgcmVhZCB0aGUgbG9jYWxuYW1lCi0gICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoY2hhcilpbnB1dFN0cmVhbS5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wICE9ICc6JykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgIT0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lICs9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGNoYXIpaW5wdXRTdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IGxvY2FsTmFtZS5zdWJzdHJpbmcoMCwgbG9jYWxOYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgICAgIEpTT05EYXRhU291cmNlIGpzb25EYXRhU291cmNlID0gZ2V0RGF0YVNvdXJjZShpbnB1dFN0cmVhbSwgcHJlZml4LCBsb2NhbE5hbWUpOwotICAgICAgICByZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKGxvY2FsTmFtZSwgbnMsIGZhY3RvcnksIGpzb25EYXRhU291cmNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSlNPTkRhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZShJbnB1dFN0cmVhbQotICAgICAgICAgICAganNvbklucHV0U3RyZWFtLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSlNPTkRhdGFTb3VyY2UoanNvbklucHV0U3RyZWFtLCAiXCIiICsgcHJlZml4ICsgbG9jYWxOYW1lICsgIlwiIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvanNvbi90ZXN0LXJlc291cmNlcy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9qc29uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcxN2E4Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qc29uL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmlsZSBjYWNoaW5nIGZvciBhdHRhY2htZW50cyAtLT4KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2l6ZVRocmVzaG9sZCI+NDAwMDwvcGFyYW1ldGVyLS0+Ci0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIHNlY29uZHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhwY2V0aW9uLS0+Ci0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+Ci0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPgotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4KLQotCi0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ2l1c2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPgotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLVNldCB0aGUgZmxhZyB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0cmFuc3BvcnQgbGV2ZWwgc2Vzc2lvbiBtYW5nbWVudC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWFuYWdlVHJhbnNwb3J0U2Vzc2lvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1Gb2xsb3dpbmcgdHdvIHBhcmFtZXRlcnMgd2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBSRVNUIGluIEF4aXMyLiBUaGUgZGVmYXVsdCBzZXR0aW5ncyB3aWxsIG1ha2UgQXhpczIgdG8gaGF2ZSB0d28tLT4KLSAgICA8IS0tZGlmZmVyZW50IGVuZHBvaW50cywgb25lIGZvciBSRVNUIChBeGlzUkVTVFNlcnZsZXQpIG9uZSBmb3IgU09BUCBtZXNzYWdlIGhhbmRsaW5nIChBeGlzU2VydmxldCkuIEJ1dCBmb2xsb3dpbmctLT4KLSAgICA8IS0tcGFyYW1ldGVycyBoZWxwIHRvIHR3ZWFrIHRoZSBtZXNzYWdlIGhhbmRsaW5nIG9mIHR3byBtYWluIHNlcnZsZXRzLiAtLT4KLQotICAgIDwhLS0gSWYgdGhlIGVuYWJsZVJFU1RJbkF4aXMyTWFpblNlcnZsZXQgaXMgdHJ1ZSwgdGhlbiBBeGlzMk1haW5TZXJ2bGV0IHdpbGwgaGFuZGxlIGJvdGggU09BUCBhbmQgUkVTVCBtZXNzYWdlcyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVJFU1RJbkF4aXMyTWFpblNlcnZsZXQiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIGJvdGggdGhlIHNlcnZsZXRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBUaGlzIHdpbGwgZGlzYWJsZSB0aGUgc2VwYXJhdGUgc2VydmxldCB3ZSBoYXZlIGZvciBSRVNUIGhhbmRsaW5nLiAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVTZXBhcmF0ZUVuZHBvaW50Rm9yUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBJZiB5b3UgaGF2ZSBhIGZyb250ZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXRzICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9qc29uIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpzb24uSlNPTk1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24vYmFkZ2VyZmlzaCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qc29uLkpTT05CYWRnZXJmaXNoTWVzc2FnZUZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0idGV4dC9qYXZhc2NyaXB0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpzb24uSlNPTk1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VCdWlsZGVycz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9qc29uIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpzb24uSlNPTk9NQnVpbGRlciIvPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24vYmFkZ2VyZmlzaCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qc29uLkpTT05CYWRnZXJmaXNoT01CdWlsZGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0idGV4dC9qYXZhc2NyaXB0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpzb24uSlNPTk9NQnVpbGRlciIvPgotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPgotICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij44MDgwPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6Ci0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkKLSAgICAgICAgICAgIGhvc3RuYW1lOiAgaWYgbm9uLW51bGwsIHVybCBwcmVmaXggdXNlZCBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgbnVsbCkKLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikKLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApCi0gICAgICAgICAgICByZXF1ZXN0VGNwTm9EZWxheTogIHRydWUgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgYW5kIG1pbmltaXplIGxhdGVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMKLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpCi0gICAgICAgICAgICByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBpZiBxdWV1ZSBmaWxscyB1cyAgICAgICAgIChkZWZhdWx0IDE1MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5Ci0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgbm8gc3VjaCB0aHJlYWRzIGNhbiBleGlzdCB3aXRoIGRlZmF1bHQgdW5ib3VuZGVkIHJlcXVlc3QgcXVldWUKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgICAgICAgICAgICAgICAgID5odHRwOi8vd3d3Lm15QXBwLmNvbS93czwvcGFyYW1ldGVyPiAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpblNlcnZlciIgICAgICAgICAgICAgPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiICAgICAgICAgICA+MTAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGNwTm9EZWxheSIgICAgICAgID5mYWxzZTwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUiPjUwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIiA+MTAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lIiAgICAgID4yNDAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWVVbml0IiAgPk1JTExJU0VDT05EUzwvcGFyYW1ldGVyPiAgICAgICAgICAgIC0tPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDwhLS1tb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8tLT4KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+Ci0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2pzb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pzb24vRWNoby5qYXZhIGIvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTRmZWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9FY2hvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Tb3VyY2VkRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRWNobyB7Ci0KLSAgICBwdWJsaWMgRWNobygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG9PTShPTUVsZW1lbnQgb21FbGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNc2dDdHggPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKS5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvdXRNc2dDdHguZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VUeXBlID0gKFN0cmluZykgb2JqZWN0OwotCi0gICAgICAgIC8vaWYgdGhlIHJlcXVlc3QgaXMgdGhyb3VnaCBHRVQsIHRoZSBtZXNzYWdlIHR5cGUgaXMgYXBwbGljYXRpb24veG1sLiBvdGhlcndpc2UgZG9uJ3QgYWxsb3cKLSAgICAgICAgLy9hbnkgbm9uIGpzb24gc3BlY2lmaWMgbWVzc2FnZSB0eXBlcwotICAgICAgICBpZiAobWVzc2FnZVR5cGUuZXF1YWxzSWdub3JlQ2FzZShIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MKSkgewotICAgICAgICAgICAgb3V0TXNnQ3R4LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSwgImFwcGxpY2F0aW9uL2pzb24iKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlVHlwZS5pbmRleE9mKCJqc29uIikgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUeXBlIG9mIHRoZSBSZWNlaXZlZCBNZXNzYWdlIGlzIG5vdCBKU09OIik7Ci0gICAgICAgIH0KLSAgICAgICAgT01EYXRhU291cmNlIG9tZGF0YU9TdWNlID0gKChPTVNvdXJjZWRFbGVtZW50KSBvbUVsZSkuZ2V0RGF0YVNvdXJjZSgpOwotICAgICAgICBPTUVsZW1lbnQgbmV3T21FbGUgPSAoT01FbGVtZW50KSBvbUVsZS5kZXRhY2goKTsKLSAgICAgICAgKChPTVNvdXJjZWRFbGVtZW50KSBuZXdPbUVsZSkuc2V0RGF0YVNvdXJjZShvbWRhdGFPU3VjZSk7Ci0gICAgICAgIHJldHVybiBvbUVsZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05EYXRhU291cmNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09ORGF0YVNvdXJjZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlZTlhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05EYXRhU291cmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxUZXN0Q2FzZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgSlNPTkRhdGFTb3VyY2VUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hcHBlZFNlcmlhbGl6ZTEoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSBnZXRNYXBwZWRKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIEpTT05EYXRhU291cmNlIHNvdXJjZSA9IGdldE1hcHBlZERhdGFTb3VyY2UoanNvblN0cmluZyk7Ci0gICAgICAgIHNvdXJjZS5zZXJpYWxpemUob3V0U3RyZWFtLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGpzb25TdHJpbmcsIG5ldyBTdHJpbmcob3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU2VyaWFsaXplMigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSBnZXRNYXBwZWRKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSk7Ci0gICAgICAgIEpTT05EYXRhU291cmNlIHNvdXJjZSA9IGdldE1hcHBlZERhdGFTb3VyY2UoanNvblN0cmluZyk7Ci0gICAgICAgIHNvdXJjZS5zZXJpYWxpemUod3JpdGVyLCBudWxsKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqc29uU3RyaW5nLCBuZXcgU3RyaW5nKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU2VyaWFsaXplMygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGdldE1hcHBlZEpTT05TdHJpbmcoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0U3RyZWFtKTsKLSAgICAgICAgSlNPTkRhdGFTb3VyY2Ugc291cmNlID0gZ2V0TWFwcGVkRGF0YVNvdXJjZShqc29uU3RyaW5nKTsKLSAgICAgICAgc291cmNlLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PjxtYXBwaW5nPjxpbm5lcj48Zmlyc3Q+dGVzdCBzdHJpbmcgb25lPC9maXJzdD48L2lubmVyPjxpbm5lcj50ZXN0IHN0cmluZyB0d288L2lubmVyPjxuYW1lPmZvbzwvbmFtZT48L21hcHBpbmc+IiwKLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZGdlcmZpc2hTZXJpYWxpemUxKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBqc29uU3RyaW5nID0gZ2V0QmFkZ2VyZmlzaEpTT05TdHJpbmcoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgSlNPTkJhZGdlcmZpc2hEYXRhU291cmNlIHNvdXJjZSA9IGdldEJhZGdlcmZpc2hEYXRhU291cmNlKGpzb25TdHJpbmcpOwotICAgICAgICBzb3VyY2Uuc2VyaWFsaXplKG91dFN0cmVhbSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqc29uU3RyaW5nLCBuZXcgU3RyaW5nKG91dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZGdlcmZpc2hTZXJpYWxpemUyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGdldEJhZGdlcmZpc2hKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dFN0cmVhbSk7Ci0gICAgICAgIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSBzb3VyY2UgPSBnZXRCYWRnZXJmaXNoRGF0YVNvdXJjZShqc29uU3RyaW5nKTsKLSAgICAgICAgc291cmNlLnNlcmlhbGl6ZSh3cml0ZXIsIG51bGwpOwotICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGpzb25TdHJpbmcsIG5ldyBTdHJpbmcob3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkZ2VyZmlzaFNlcmlhbGl6ZTMoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBKU09ORXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBqc29uU3RyaW5nID0gZ2V0QmFkZ2VyZmlzaEpTT05TdHJpbmcoKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0U3RyZWFtKTsKLSAgICAgICAgSlNPTkJhZGdlcmZpc2hEYXRhU291cmNlIHNvdXJjZSA9IGdldEJhZGdlcmZpc2hEYXRhU291cmNlKGpzb25TdHJpbmcpOwotICAgICAgICBzb3VyY2Uuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICBhc3NlcnRYTUxFcXVhbCgKLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48cCB4bWxucz1cImh0dHA6Ly9kZWYubnNcIiB4bWxuczpiYj1cImh0dHA6Ly9vdGhlci5uc2JcIiB4bWxuczphYT1cImh0dHA6Ly9vdGhlci5uc1wiPjxzYW0gYXR0PVwibGV0c1wiPjU1NTwvc2FtPjwvcD4iLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcob3V0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpTT05CYWRnZXJmaXNoRGF0YVNvdXJjZSBnZXRCYWRnZXJmaXNoRGF0YVNvdXJjZShTdHJpbmcganNvblN0cmluZykgewotICAgICAgICBJbnB1dFN0cmVhbSBqc29uSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oanNvblN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBKU09OQmFkZ2VyZmlzaERhdGFTb3VyY2UocmVhZExvY2FsTmFtZShqc29uSW5wdXRTdHJlYW0pLCAiXCJwXCIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCYWRnZXJmaXNoSlNPTlN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJ7XCJwXCI6e1wiQHhtbG5zXCI6e1wiYmJcIjpcImh0dHA6Ly9vdGhlci5uc2JcIixcImFhXCI6XCJodHRwOi8vb3RoZXIubnNcIixcIiRcIjpcImh0dHA6Ly9kZWYubnNcIn0sXCJzYW1cIjp7XCIkXCI6XCI1NTVcIiwgXCJAYXR0XCI6XCJsZXRzXCJ9fX0iOwotICAgIH0KLQotICAgIHByaXZhdGUgSlNPTkRhdGFTb3VyY2UgZ2V0TWFwcGVkRGF0YVNvdXJjZShTdHJpbmcganNvblN0cmluZykgewotICAgICAgICBJbnB1dFN0cmVhbSBqc29uSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oanNvblN0cmluZy5nZXRCeXRlcygpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBKU09ORGF0YVNvdXJjZShyZWFkTG9jYWxOYW1lKGpzb25JbnB1dFN0cmVhbSksICJcIm1hcHBpbmdcIiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE1hcHBlZEpTT05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAie1wibWFwcGluZ1wiOntcImlubmVyXCI6W3tcImZpcnN0XCI6XCJ0ZXN0IHN0cmluZyBvbmVcIn0sXCJ0ZXN0IHN0cmluZyB0d29cIl0sXCJuYW1lXCI6XCJmb29cIn19IjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIHJlYWRMb2NhbE5hbWUoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICgoY2hhcilpbi5yZWFkKCkgIT0gJzonKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OSW50ZWdyYXRpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05JbnRlZ3JhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlYTQwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9qc29uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qc29uL0pTT05JbnRlZ3JhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotCi1wdWJsaWMgY2xhc3MgSlNPTkludGVncmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgSlNPTlRlc3RDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXhpc1NlcnZpY2Ugc2VydmljZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGV4cGVjdGVkU3RyaW5nOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlSFRUUFNlcnZlciBzZXJ2ZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUjsKLQotICAgIHB1YmxpYyBKU09OSW50ZWdyYXRpb25UZXN0KCkgewotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudCA9IDA7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAgICAgaW50IHRlc3RpbmdQb3J0ID0gZmluZEF2YWlsYWJsZVBvcnQoKTsKLSAgICAgICAgICAgIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6IiArICh0ZXN0aW5nUG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvYXhpczIvc2VydmljZXMvRWNob1hNTFNlcnZpY2UvZWNob09NIik7Ci0KLSAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCIpOwotICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgY29uZmlnRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihjb25maWd1cmF0aW9uQ29udGV4dCwgdGVzdGluZ1BvcnQpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2UgPSBVdGlscy5jcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qc29uLkVjaG8uY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgICBzZXJ2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaWYoY291bnQgPT0gMyl7Ci0gICAgCQlzZXJ2ZXIuc3RvcCgpOwotICAgIAl9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9NRWxlbWVudCBjcmVhdGVFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoIiIsICIiKTsKLSAgICAgICAgT01FbGVtZW50IHJwY1dyYXBFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvT00iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IGRhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJkYXRhIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCBkYXRhMSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRhdGEiLCBvbU5zKTsKLSAgICAgICAgZXhwZWN0ZWRTdHJpbmcgPSAibXkganNvbiBzdHJpbmciOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcxID0gIm15IHNlY29uZCBqc29uIHN0cmluZyI7Ci0gICAgICAgIGRhdGEuc2V0VGV4dChleHBlY3RlZFN0cmluZyk7Ci0gICAgICAgIGRhdGExLnNldFRleHQoZXhwZWN0ZWRTdHJpbmcxKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhKTsKLSAgICAgICAgcnBjV3JhcEVsZS5hZGRDaGlsZChkYXRhMSk7Ci0gICAgICAgIHJldHVybiBycGNXcmFwRWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0VjaG9PTShTdHJpbmcgbWVzc2FnZVR5cGUsIFN0cmluZyBodHRwTWV0aG9kKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlPTUVsZW1lbnQgcGF5bG9hZCA9IGNyZWF0ZUVudmVsb3BlKCk7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsIG1lc3NhZ2VUeXBlKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QsIGh0dHBNZXRob2QpOwotLy8gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZURlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBudWxsKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24obnVsbCk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgIE9NRWxlbWVudCBlbGUgPSAoT01FbGVtZW50KXJlc3VsdC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KGVsZS5nZXRUZXh0KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVjaG9PTVdpdGhKU09OQmFkZ2VyZmlzaCgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCWRvRWNob09NKCJhcHBsaWNhdGlvbi9qc29uL2JhZGdlcmZpc2giLCBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QT1NUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob09NV2l0aEpTT04oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJZG9FY2hvT00oImFwcGxpY2F0aW9uL2pzb24iLCBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QT1NUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob09NV2l0aEpTT05JbkdFVCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkb0VjaG9PTSgiYXBwbGljYXRpb24vanNvbiIsIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcGFyZVdpdGhDcmVhdGVkT01UZXh0KFN0cmluZyByZXNwb25zZSkgewotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRFcXVhbHMocmVzcG9uc2UsIGV4cGVjdGVkU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3MuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgICAgICBzcy5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiA1NTU1OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OT01CdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjk3MzdmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pzb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTk9NQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLypwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuanNvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKU09OT01CdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRnZXJmaXNoT01TZXJpYWxpemF0aW9uMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSBnZXRCYWRnZXJmaXNoSlNPTlN0cmluZygpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShqc29uU3RyaW5nLmdldEJ5dGVzKCkpOwotCi0gICAgICAgIEpTT05PTUJ1aWxkZXIgb21CdWlsZGVyID0gbmV3IEpTT05CYWRnZXJmaXNoT01CdWlsZGVyKCk7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtID0gb21CdWlsZGVyLnByb2Nlc3NEb2N1bWVudChpblN0cmVhbSwKLSAgICAgICAgICAgICAgICBKU09OVGVzdENvbnN0YW50cy5DT05URU5UX1RZUEVfQkFER0VSRklTSCwgbnVsbCk7Ci0KLSAgICAgICAgZWxlbS50b1N0cmluZygpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IFRyYW5zcG9ydFV0aWxzLmNyZWF0ZVNPQVBFbnZlbG9wZShlbGVtKTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDdHggPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbXNnQ3R4LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQotICAgICAgICBPTU91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgb3V0cHV0Rm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIFNPQVBNZXNzYWdlRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBTT0FQTWVzc2FnZUZvcm1hdHRlcigpOwotICAgICAgICBmb3JtYXR0ZXIud3JpdGVUbyhtc2dDdHgsIG91dHB1dEZvcm1hdCwgb3V0U3RyZWFtLCB0cnVlKTsKLQotICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhZGdlcmZpc2hPTVNlcmlhbGl6YXRpb24yKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSlNPTkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IGdldEJhZGdlcmZpc2hKU09OU3RyaW5nKCk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGpzb25TdHJpbmcuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICAgICAgSlNPTk9NQnVpbGRlciBvbUJ1aWxkZXIgPSBuZXcgSlNPTkJhZGdlcmZpc2hPTUJ1aWxkZXIoKTsKLSAgICAgICAgT01FbGVtZW50IGVsZW0gPSBvbUJ1aWxkZXIucHJvY2Vzc0RvY3VtZW50KGluU3RyZWFtLAotICAgICAgICAgICAgICAgIEpTT05UZXN0Q29uc3RhbnRzLkNPTlRFTlRfVFlQRV9CQURHRVJGSVNILCBudWxsKTsKLQotICAgICAgICBlbGVtLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgZWxlbS5zZXJpYWxpemUob3V0U3RyZWFtKTsKLSAgICAgICAgb3V0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFkZ2VyZmlzaEpTT05TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAie1wicFwiOntcIkB4bWxuc1wiOntcImJiXCI6XCJodHRwOi8vb3RoZXIubnNiXCIsXCJhYVwiOlwiaHR0cDovL290aGVyLm5zXCIsXCIkXCI6XCJodHRwOi8vZGVmLm5zXCJ9LFwic2FtXCI6e1wiJFwiOlwiNTU1XCIsIFwiQGF0dFwiOlwibGV0c1wifX19IjsKLSAgICB9Ci0KLX0KLSovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OVGVzdENvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvanNvbi90ZXN0L29yZy9hcGFjaGUvYXhpczIvanNvbi9KU09OVGVzdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIzYWE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2pzb24vdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pzb24vSlNPTlRlc3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qc29uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGludGVyZmFjZSBKU09OVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKCJFY2hvWE1MU2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKCJlY2hvT00iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgc3dhU2VydmljZU5hbWUgPSBuZXcgUU5hbWUoIkVjaG9Td0FTZXJ2aWNlIik7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0JBREdFUkZJU0ggPSAiYXBwbGljYXRpb24vanNvbi9iYWRnZXJmaXNoIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfTUFQUEVEID0gImFwcGxpY2F0aW9uL2pzb24iOwotICAgIAotICAgIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL2NvbmYvYXhpczIueG1sIGIvMV81L21vZHVsZXMva2VybmVsL2NvbmYvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjRjYjU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9jb25mL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0OCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gcGx1Z2luIHlvdXIgb3duIGF0dGFjaG1lbnRzIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbiAtLT4KLSAgICA8IS0tPGF0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5saWZlY3ljbGUuaW1wbC5MaWZlY3ljbGVNYW5hZ2VySW1wbCIvPi0tPgotCi0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgcmVkdWN0aW9uIG9mIHRoZSBpbi1tZW1vcnkgY2FjaGUgb2YgV1NETCBkZWZpbml0aW9ucyAtLT4KLSAgICA8IS0tSW4gc29tZSBzZXJ2ZXIgZW52aXJvbm1lbnRzLCB0aGUgYXZhaWxhYmxlIG1lbW9yeSBoZWFwIGlzIGxpbWl0ZWQgYW5kIGNhbiBmaWxsIHVwIHVuZGVyIGxvYWQgLS0+Ci0gICAgPCEtLVNpbmNlIGluLW1lbW9yeSBjb3BpZXMgb2YgV1NETCBkZWZpbml0aW9ucyBjYW4gYmUgbGFyZ2UsIHNvbWUgc3RlcHMgY2FuIGJlIHRha2VuLS0+Ci0gICAgPCEtLXRvIHJlZHVjZSB0aGUgbWVtb3J5IG5lZWRlZCBmb3IgdGhlIGNhY2hlZCBXU0RMIGRlZmluaXRpb25zLiAtLT4KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlDYWNoZSI+dHJ1ZTwvcGFyYW1ldGVyLS0+Ci0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIG1pbGxpc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzAwMDA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2sgdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCwgdGhlbiBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLVNlcnZpY2VzRGlyZWN0b3J5IG9ubHkgd29ya3Mgb24gdGhlIGZvbGxvd2luZyBjYXNlcy0tPgotICAgIDwhLS0tRmlsZSBiYXNlZCBjb25maWd1cmF0b3IgYW5kIGluIHRoYXQgY2FzZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgZmlsZSBVUkwgKGh0dHA6Ly8gbm90IGFsbG93ZWQpLS0+Ci0gICAgPCEtLS1XaGVuIGNyZWF0aW5nIFVSTCBCYXNlZCBjb25maWd1cmF0b3Igd2l0aCBVUkwgZmlsZTovLyAtLT4KLSAgICA8IS0tLSBXYXIgYmFzZWQgY29uZmlndXJhdG9yIHdpdGggZXhwYW5kZWQgY2FzZSAsIC0tPgotCi0gICAgPCEtLUFsbCB0aGUgb3RoZXIgc2NlbmFyaW9zIGl0IHdpbGwgYmUgaWdub3JlZC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWl1c2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPgotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJmYWxzZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIHN1cHByZXNzIGdlbmVyYXRpb24gb2YgU09BUCAxLjIgYmluZGluZ3MgaW4gYXV0by1nZW5lcmF0ZWQgV1NETCBmaWxlcyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVTT0FQMTIiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1QT0pPIGRlcGxveWVyICwgdGhpcyB3aWxsIGFsb3cgdXNlcnMgdG8gZHJvcCAuY2xhc3MgZmlsZSBhbmQgbWFrZSB0aGF0IGludG8gYSBzZXJ2aWNlLS0+Ci0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+Ci0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmphciIgZGlyZWN0b3J5PSJzZXJ2aWNlamFycyIKLSAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZnJhbWV3b3JrLkpBWFdTRGVwbG95ZXIiLz4KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuamFyIiBkaXJlY3Rvcnk9InRyYW5zcG9ydHMiCi0gICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuVHJhbnNwb3J0RGVwbG95ZXIiLz4KLQotICAgIDwhLS1DT1JCQSBkZXBsb3llciAsIHRoaXMgd2lsbCBhbG93IHVzZXJzIHRvIGludm9rZSByZW1vdGUgQ09SQkEgc2VydmljZXMgdGhyb3VnaCBBeGlzMi0tPgotICAgIDwhLS08ZGVwbG95ZXIgZXh0ZW5zaW9uPSIueG1sIiBkaXJlY3Rvcnk9ImNvcmJhIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jb3JiYS5kZXBsb3llci5Db3JiYURlcGxveWVyIi8+LS0+Ci0KLSAgICA8IS0tPGRlcGxveWVyIGV4dGVuc2lvbj0iLmpzYSIgZGlyZWN0b3J5PSJybWlzZXJ2aWNlcyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5STUlTZXJ2aWNlRGVwbG95ZXIiLz4tLT4KLQotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgbG9ja2VkPSJ0cnVlIj5teWhvc3QuY29tPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnQgZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8dGhyZWFkQ29udGV4dE1pZ3JhdG9ycz4KLSAgICAgICAgPHRocmVhZENvbnRleHRNaWdyYXRvciBsaXN0SWQ9IkpBWFdTLVRocmVhZENvbnRleHRNaWdyYXRvci1MaXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcubWlncmF0b3IuRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IiLz4KLSAgICA8L3RocmVhZENvbnRleHRNaWdyYXRvcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIGRlZmF1bHQgTWVzc2FnZVJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXQgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLk11bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TT0FQTWVzc2FnZUZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlQnVpbGRlcnM+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij44MDgwPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6Ci0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkKLSAgICAgICAgICAgIGhvc3RuYW1lOiAgaWYgbm9uLW51bGwsIHVybCBwcmVmaXggdXNlZCBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgbnVsbCkKLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikKLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApCi0gICAgICAgICAgICByZXF1ZXN0VGNwTm9EZWxheTogIHRydWUgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgYW5kIG1pbmltaXplIGxhdGVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMKLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpCi0gICAgICAgICAgICByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBpZiBxdWV1ZSBmaWxscyB1cCAgICAgICAgIChkZWZhdWx0IDE1MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5Ci0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgbm8gc3VjaCB0aHJlYWRzIGNhbiBleGlzdCB3aXRoIGRlZmF1bHQgdW5ib3VuZGVkIHJlcXVlc3QgcXVldWUKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+aHR0cDovL3d3dy5teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4gLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiPjEwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRjcE5vRGVsYXkiPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiPjEwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZSI+MjQwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCI+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tdHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyLS0+PgotICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4KLSAgICA8IS0tdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgcGFyYW10ZXIgLCBhbmQgc2V0IGl0IGFzIHlvdSByZXF1aXJlZC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+dGNwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAvdHJhbnNwb3J0UmVjZWl2ZXIgLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+Ci0gICAgPCEtLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0idGNwIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICAtLT4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0KLSAgICAgICAgPCEtLSBJZiBmb2xsb3dpbmcgaXMgc2V0IHRvICd0cnVlJywgb3B0aW9uYWwgYWN0aW9uIHBhcnQgb2YgdGhlIENvbnRlbnQtVHlwZSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgU09BUCAxLjIgbWVzc2FnZXMgLS0+Ci0gICAgICAgIDwhLS0gIDxwYXJhbWV0ZXIgbmFtZT0iT21pdFNPQVAxMkFjdGlvbiI+dHJ1ZTwvcGFyYW1ldGVyPiAgLS0+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tIFBsZWFzZSBlbmFibGUgdGhpcyBpZiB5b3UgbmVlZCB0aGUgamF2YSB0cmFuc3BvcnQgLS0+Ci0gICAgPCEtLSA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImphdmEiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuamF2YS5KYXZhVHJhbnNwb3J0U2VuZGVyIi8+IC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+Ci0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENsdXN0ZXJpbmcgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tCi0gICAgIFRvIGVuYWJsZSBjbHVzdGVyaW5nIGZvciB0aGlzIG5vZGUsIHNldCB0aGUgdmFsdWUgb2YgImVuYWJsZSIgYXR0cmlidXRlIG9mIHRoZSAiY2x1c3RlciIKLSAgICAgZWxlbWVudCB0byAidHJ1ZSIuIFRoZSBpbml0aWxpemF0aW9uIG9mIGEgbm9kZSBpbiB0aGUgY2x1c3RlciBpcyBoYW5kbGVkIGJ5IHRoZSBjbGFzcwotICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBvZiB0aGUgImNsdXN0ZXIiIGVsZW1lbnQuIEl0IGlzIGFsc28gcmVzcG9uc2libGUgZm9yCi0gICAgIGdldHRpbmcgdGhpcyBub2RlIHRvIGpvaW4gdGhlIGNsdXN0ZXIuCi0gICAgIC0tPgotICAgIDxjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIiBlbmFibGU9ImZhbHNlIj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB3aHRoZXIgdGhlIGNsdXN0ZXIgaGFzIHRvIGJlIGF1dG9tYXRpY2FsbHkgaW5pdGFsaXplZAotICAgICAgICAgICB3aGVuIHRoZSBBeGlzQ29uZmlndXJhdGlvbiBpcyBidWlsdC4gSWYgc2V0IHRvICJ0cnVlIiB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBub3QgYmUKLSAgICAgICAgICAgZG9uZSBhdCB0aGF0IHN0YWdlLCBhbmQgc29tZSBvdGhlciBwYXJ0eSB3aWxsIGhhdmUgdG8gZXhwbGljdGx5IGluaXRpYWxpemUgdGhlIGNsdXN0ZXIuCi0gICAgICAgIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IkF2b2lkSW5pdGlhdGlvbiI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBtZW1iZXIgaXMgYWN0aXZlIG9yIG5vdC4gVGhpcyB3aWxsIGJlIHVzZWZ1bCBpbiBhIHNldHVwIHdoZXJlCi0gICAgICAgICAgIG1lbWJlcnMgYXJlIGRlcGxveWVkIGluIEFDVElWRSBhbmQvb3IgUEFTU0lWRSBjb25maWd1cmF0aW9uIAotICAgICAgICAtLT4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJpc0FjdGl2ZSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgQW4gaW1wbGVtZW50YXRpb24gb2Ygb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLk1lbWJlcnNoaXBMaXN0ZW5lcgotICAgICAgICAgICB3aGljaCB3aWxsIGJlIGNhbGxlZCBvbiBtZW1iZXJzaGlwIGNoYW5nZXMKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZW1iZXJzaGlwTGlzdGVuZXIiPgotICAgICAgICAgICAgPGNsYXNzPm9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXJzaGlwTGlzdGVuZXJJbXBsPC9jbGFzcz4KLSAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb28iPmJhcjwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICAgIDwvcGFyYW1ldGVyPgotICAgICAgICAtLT4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgIFRoZSBtZW1iZXJzaGlwIHNjaGVtZSB1c2VkIGluIHRoaXMgc2V0dXAuIFRoZSBvbmx5IHZhbHVlcyBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCBhcmUKLSAgICAgICAgICAgIm11bHRpY2FzdCIgYW5kICJ3a2EiCi0KLSAgICAgICAgICAgMS4gbXVsdGljYXN0IC0gbWVtYmVyc2hpcCBpcyBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgdXNpbmcgbXVsdGljYXN0aW5nCi0gICAgICAgICAgIDIuIHdrYSAtIFdlbGwtS25vd24gQWRkcmVzcyBiYXNlZCBtdWx0aWNhc3RpbmcuIE1lbWJlcnNoaXAgaXMgZGlzY292ZXJlZCB3aXRoIHRoZSBoZWxwCi0gICAgICAgICAgICAgICAgICAgIG9mIG9uZSBvciBtb3JlIG5vZGVzIHJ1bm5pbmcgYXQgYSBXZWxsLUtub3duIEFkZHJlc3MuIE5ldyBtZW1iZXJzIGpvaW5pbmcgYQotICAgICAgICAgICAgICAgICAgICBjbHVzdGVyIHdpbGwgZmlyc3QgY29ubmVjdCB0byBhIHdlbGwta25vd24gbm9kZSwgcmVnaXN0ZXIgd2l0aCB0aGUgd2VsbC1rbm93biBub2RlCi0gICAgICAgICAgICAgICAgICAgIGFuZCBnZXQgdGhlIG1lbWJlcnNoaXAgbGlzdCBmcm9tIGl0LiBXaGVuIG5ldyBtZW1iZXJzIGpvaW4sIG9uZSBvZiB0aGUgd2VsbC1rbm93bgotICAgICAgICAgICAgICAgICAgICBub2RlcyB3aWxsIG5vdGlmeSB0aGUgb3RoZXJzIGluIHRoZSBncm91cC4gV2hlbiBhIG1lbWJlciBsZWF2ZXMgdGhlIGNsdXN0ZXIgb3IKLSAgICAgICAgICAgICAgICAgICAgaXMgZGVlbWVkIHRvIGhhdmUgbGVmdCB0aGUgY2x1c3RlciwgaXQgd2lsbCBiZSBkZXRlY3RlZCBieSB0aGUgR3JvdXAgTWVtYmVyc2hpcAotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIChHTVMpIHVzaW5nIGEgVENQIHBpbmcgbWVjaGFuaXNtLgotICAgICAgICAtLT4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtZW1iZXJzaGlwU2NoZW1lIj5tdWx0aWNhc3Q8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICBUaGUgY2x1c3RlcmluZyBkb21haW4vZ3JvdXAuIE5vZGVzIGluIHRoZSBzYW1lIGdyb3VwIHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lIG11bHRpY2FzdAotICAgICAgICAgZG9tYWluLiBUaGVyZSB3aWxsIG5vdCBiZSBpbnRlcmZlcmVuY2UgYmV0d2VlbiBub2RlcyBpbiBkaWZmZXJlbnQgZ3JvdXBzLgotICAgICAgICAtLT4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJkb21haW4iPmFwYWNoZS5heGlzMi5kb21haW48L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tCi0gICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgIm1vZGUiIHBhcmFtZXRlciBpcyBzZXQgdG8gYXBwbGljYXRpb24uIFRoaXMgaW5kaWNhdGVzCi0gICAgICAgIHRoZSBkb21haW4gaW4gd2hpY2ggdGhlIHRoZSBhcHBsaWNhdGlvbnMgYmVpbmcgbG9hZCBiYWxhbmNlZCBhcmUgZGVwbG95ZWQuCi0gICAgICAgIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImFwcGxpY2F0aW9uRG9tYWluIj5hcGFjaGUuYXhpczIuYXBwbGljYXRpb24uZG9tYWluPC9wYXJhbWV0ZXI+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICBXaGVuIGEgV2ViIHNlcnZpY2UgcmVxdWVzdCBpcyByZWNlaXZlZCwgYW5kIHByb2Nlc3NlZCwgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50IHRvIHRoZQotICAgICAgICAgICBjbGllbnQsIHNob3VsZCB3ZSB1cGRhdGUgdGhlIHN0YXRlcyBvZiBhbGwgbWVtYmVycyBpbiB0aGUgY2x1c3Rlcj8gSWYgdGhlIHZhbHVlIG9mCi0gICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byAidHJ1ZSIsIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50IHdpbGwgYmUgc2VudCBvbmx5IGFmdGVyCi0gICAgICAgICAgIGFsbCB0aGUgbWVtYmVycyBoYXZlIGJlZW4gdXBkYXRlZC4gT2J2aW91c2x5LCB0aGlzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4gSW4gc29tZSBjYXNlcywKLSAgICAgICAgICAgc3VjaCB0aGlzIG92ZXJoZWFkIG1heSBub3QgYmUgYWNjZXB0YWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAgICAgICAgICAgc2hvdWxkIGJlIHNldCB0byAiZmFsc2UiCi0gICAgICAgIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InN5bmNocm9uaXplQWxsIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB3ZSBuZWVkIHRvIHJldHJ5IHRvIHNlbmQgYSBtZXNzYWdlIHRvIGEgcGFydGljdWxhciBub2RlCi0gICAgICAgICAgYmVmb3JlIGdpdmluZyB1cCBhbmQgY29uc2lkZXJpbmcgdGhhdCBub2RlIHRvIGJlIGZhdWx0eQotICAgICAgICAtLT4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtYXhSZXRyaWVzIj4xMDwvcGFyYW1ldGVyPgotCi0gICAgICAgIDwhLS0gVGhlIG11bHRpY2FzdCBhZGRyZXNzIHRvIGJlIHVzZWQgLS0+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWNhc3RBZGRyZXNzIj4yMjguMC4wLjQ8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tIFRoZSBtdWx0aWNhc3QgcG9ydCB0byBiZSB1c2VkIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1jYXN0UG9ydCI+NDU1NjQ8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tIFRoZSBmcmVxdWVuY3kgb2Ygc2VuZGluZyBtZW1iZXJzaGlwIG11bHRpY2FzdCBtZXNzYWdlcyAoaW4gbXMpIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1jYXN0RnJlcXVlbmN5Ij41MDA8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tIFRoZSB0aW1lIGludGVydmFsIHdpdGhpbiB3aGljaCBpZiBhIG1lbWJlciBkb2VzIG5vdCByZXNwb25kLCB0aGUgbWVtYmVyIHdpbGwgYmUKLSAgICAgICAgIGRlZW1lZCB0byBoYXZlIGxlZnQgdGhlIGdyb3VwIChpbiBtcykKLSAgICAgICAgIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbWJlckRyb3BUaW1lIj4zMDAwPC9wYXJhbWV0ZXI+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgbmV0d29yayBpbnRlcmZhY2UgdG8gd2hpY2ggdGhlIG11bHRpY2FzdGluZyBoYXMgdG8gYmUgYm91bmQgdG8uCi0gICAgICAgICAgIE11bHRpY2FzdGluZyB3b3VsZCBiZSBkb25lIHVzaW5nIHRoaXMgaW50ZXJmYWNlLgotICAgICAgICAtLT4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtY2FzdEJpbmRBZGRyZXNzIj4xMjcuMC4wLjE8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tIFRoZSBob3N0IG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGlzIG1lbWJlciAtLT4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJsb2NhbE1lbWJlckhvc3QiPjEyNy4wLjAuMTwvcGFyYW1ldGVyPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgVGhlIFRDUCBwb3J0IHVzZWQgYnkgdGhpcyBtZW1iZXIuIFRoaXMgaXMgdGhlIHBvcnQgdGhyb3VnaCB3aGljaCBvdGhlciBub2RlcyB3aWxsCi0gICAgICAgIGNvbnRhY3QgdGhpcyBtZW1iZXIKLSAgICAgICAgIC0tPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImxvY2FsTWVtYmVyUG9ydCI+NDAwMDwvcGFyYW1ldGVyPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgUHJlc2VydmUgbWVzc2FnZSBvcmRlcmluZy4gVGhpcyB3aWxsIGJlIGRvbmUgYWNjb3JkaW5nIHRvIHNlbmRlciBvcmRlci4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icHJlc2VydmVNZXNzYWdlT3JkZXIiPnRydWU8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tCi0gICAgICAgIE1haW50YWluIGF0bW9zdC1vbmNlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzZW1hbnRpY3MKLSAgICAgICAgLS0+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MiPnRydWU8L3BhcmFtZXRlcj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgIFRoZSBsaXN0IG9mIHN0YXRpYyBvciB3ZWxsLWtub3duIG1lbWJlcnMuIFRoZXNlIGVudHJpZXMgd2lsbCBvbmx5IGJlIHZhbGlkIGlmIHRoZQotICAgICAgICAgICAibWVtYmVyc2hpcFNjaGVtZSIgYWJvdmUgaXMgc2V0IHRvICJ3a2EiCi0gICAgICAgIC0tPgotICAgICAgICA8bWVtYmVycz4KLSAgICAgICAgICAgIDxtZW1iZXI+Ci0gICAgICAgICAgICAgICAgPGhvc3ROYW1lPjEyNy4wLjAuMTwvaG9zdE5hbWU+Ci0gICAgICAgICAgICAgICAgPHBvcnQ+NDAwMDwvcG9ydD4KLSAgICAgICAgICAgIDwvbWVtYmVyPgotICAgICAgICAgICAgPG1lbWJlcj4KLSAgICAgICAgICAgICAgICA8aG9zdE5hbWU+MTI3LjAuMC4xPC9ob3N0TmFtZT4KLSAgICAgICAgICAgICAgICA8cG9ydD40MDAxPC9wb3J0PgotICAgICAgICAgICAgPC9tZW1iZXI+Ci0gICAgICAgIDwvbWVtYmVycz4KLQotICAgICAgICA8IS0tCi0gICAgICAgIEVuYWJsZSB0aGUgbG9hZCBiYWxhbmNlciBlbnRyeSBpZiB5b3UgbmVlZCB0byBydW4gdGhpcyBub2RlIGFzIGEgbG9hZCBiYWxhbmNlci4KLSAgICAgICAgTXVsdGlwbGUgYXBwbGljYXRpb24gZG9tYWlucyB3aXRoIGRpZmZlcmVudCBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBpbXBsZW1lbnRhdGlvbnMKLSAgICAgICAgY2FuIGJlIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLgotICAgICAgICAtLT4KLSAgICAgICAgPGxvYWRCYWxhbmNlciBlbmFibGU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxhcHBsaWNhdGlvbkRvbWFpbiBuYW1lPSJhcGFjaGUuYXhpczIuYXBwbGljYXRpb24uZG9tYWluIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5EZWZhdWx0TG9hZEJhbGFuY2VFdmVudEhhbmRsZXIiLz4KLSAgICAgICAgPC9sb2FkQmFsYW5jZXI+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICBUaGlzIGludGVyZmFjZSBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50LgotICAgICAgICAgICBDb25maWd1cmFpb24gY2hhbmdlcyBpbmNsdWRlOgotCi0gICAgICAgICAgICAxLiBSZWJvb3RpbmcgYW4gZW50aXJlIGNsdXN0ZXIsIGluIHdoaWNoIGNhc2UsIGFsbCBub2RlcyBoYXZlIHRvIGxvYWQgdGhlIG5ldwotICAgICAgICAgICAgICAgQXhpczIgY29uZmlndXJhdGlvbiBpbiBhIGNvbnNpc3RlbnQgbWFubmVyCi0gICAgICAgICAgICAyLiBEZXBsb3lpbmcgYSBuZXcgc2VydmljZSB0byBhIGNsdXN0ZXIgb3IgdW5kZXBsb3lpbmcgYSBzZXJ2aWNlIGZyb20gYSBjbHVzdGVyCi0gICAgICAgICAgICAzLiBDaGFuZ2luZyB0aGUgcG9saWNpZXMgb2YgYSBzZXJ2aWNlIGRlcGxveWVkIG9uIHRoZSBjbHVzdGVyCi0KLSAgICAgICAgICAgIFRoZSAiZW5hYmxlIiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoZXRoZXIgQ29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IGhhcyBiZWVuIGVuYWJsZWQKLSAgICAgICAgLS0+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uTWFuYWdlcgotICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXIiCi0gICAgICAgICAgICAgICAgZW5hYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxsaXN0ZW5lcgotICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIiLz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uTWFuYWdlcj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgIFRoaXMgaW50ZXJmYWNlIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBjb250ZXh0IHJlcGxpY2F0aW9uLiBUaGUgcHJvcGVydHkgY2hhbmdlcyBpbgotICAgICAgICAgICB0aGUgQXhpczIgY29udGV4dCBoaWVyYXJjaHkgaW4gdGhpcyBub2RlLCBhcmUgcHJvcGFnYXRlZCB0byBhbGwgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCi0KLSAgICAgICAgICAgVGhlICJleGNsdWRlcyIgcGF0dGVybnMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcHJlZml4ZXMgKGUuZy4gbG9jYWxfKikgb3IKLSAgICAgICAgICAgc3VmZml4ZXMgKGUuZy4gKl9sb2NhbCkgb2YgdGhlIHByb3BlcnRpZXMgdG8gYmUgZXhjbHVkZWQgZnJvbSByZXBsaWNhdGlvbi4gVGhlIHBhdHRlcm4KLSAgICAgICAgICAgIioiIGluZGljYXRlcyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGluIGEgcGFydGljdWxhciBjb250ZXh0IHNob3VsZCBub3QgYmUgcmVwbGljYXRlZC4KLQotICAgICAgICAgICAgVGhlICJlbmFibGUiIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgd2hldGhlciBjb250ZXh0IHJlcGxpY2F0aW9uIGhhcyBiZWVuIGVuYWJsZWQKLSAgICAgICAgLS0+Ci0gICAgICAgIDxjb250ZXh0TWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyIgotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlPSJ0cnVlIj4KLSAgICAgICAgICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIiLz4KLSAgICAgICAgICAgIDxyZXBsaWNhdGlvbj4KLSAgICAgICAgICAgICAgICA8ZGVmYXVsdHM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxvY2FsXyoiLz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iTE9DQUxfKiIvPgotICAgICAgICAgICAgICAgIDwvZGVmYXVsdHM+Ci0gICAgICAgICAgICAgICAgPGNvbnRleHQgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IlVzZUFzeW5jT3BlcmF0aW9ucyIvPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJTZXF1ZW5jZVByb3BlcnR5QmVhbk1hcCIvPgotICAgICAgICAgICAgICAgIDwvY29udGV4dD4KLSAgICAgICAgICAgICAgICA8Y29udGV4dCBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQiPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJteS5zYW5kZXNoYS4qIi8+Ci0gICAgICAgICAgICAgICAgPC9jb250ZXh0PgotICAgICAgICAgICAgICAgIDxjb250ZXh0IGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQiPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJteS5zYW5kZXNoYS4qIi8+Ci0gICAgICAgICAgICAgICAgPC9jb250ZXh0PgotICAgICAgICAgICAgPC9yZXBsaWNhdGlvbj4KLSAgICAgICAgPC9jb250ZXh0TWFuYWdlcj4KLSAgICA8L2NsdXN0ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iR2VuZXJpY1Byb3ZpZGVyRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRpc3BhdGNoZXJzLkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Ik11c3RVbmRlcnN0YW5kVmFsaWRhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5NdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iTXVzdFVuZGVyc3RhbmRDaGVja2VyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRDaGVja2VyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkdlbmVyaWNQcm92aWRlckRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kaXNwYXRjaGVycy5HZW5lcmljUHJvdmlkZXJEaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJNdXN0VW5kZXJzdGFuZFZhbGlkYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGlzcGF0Y2hlcnMuTXVzdFVuZGVyc3RhbmRWYWxpZGF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9jb25mL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMva2VybmVsL2NvbmYvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFlNTcwZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL2NvbmYvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSAKLSMgc3ZuLCBvbmUgZm9yIGRldmVsb3BlbWVudCAob25lIGF0IHNyYy90ZXN0LXJlc291cmNlcykgYW5kIG90aGVyIGZvciBwcm9kdWNhdGlvbgotIAotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLgotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLk5vT3BMb2cKLQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZwotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLlNpbXBsZUxvZwotCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL2NvbmYvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL2tlcm5lbC9jb25mL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmYTQ0MjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL2NvbmYvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLgotbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUKLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQotCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwKLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTAotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMCi0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJXBdICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3ZjA3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIEtlcm5lbDwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+Q29yZSBQYXJ0cyBvZiBBeGlzIDIuMC4gVGhpcyBpbmNsdWRlcyBBeGlzIDIuMCBlbmdpbmUsIENsaWVudCBBUEksIEFkZHJlc3Npbmcgc3VwcG9ydCwgZXRjLiwKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpb20tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpb20taW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWRvbTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby13cy1tZXRhZGF0YV8yLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCSAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tanRhXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1odHRwY2xpZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1maWxldXBsb2FkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1maWxldXBsb2FkPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3NkbDRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53b2RlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndvZGVuLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7d29kZW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3dvZGVuLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9rZXJuZWw8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9rZXJuZWw8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL2tlcm5lbDwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DbGFzc3BhdGhNb2R1bGU8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qQWJzdHJhY3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbCouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypNZXNzYWdlQ29udGV4dENoYW5nZVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL01lc3NhZ2VDb250ZXh0Q2hhbmdlVGVzdC5qYXZhPC9leGNsdWRlPiA8IS0tIFJlbW92ZWQgYmVjYXVzZSBvZiBwcm9ibGVtIG9uIEphdmE1LiBOZWVkcyByZWluc3RhdGVkIC0tPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wcm9jZXNzLXJlc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHN0YW1wPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iYnVpbGQudGltZSIgcGF0dGVybj0iTU1NIGRkLCB5eXl5IChoaDptbTpzcyB6KSIgbG9jYWxlPSJlbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90c3RhbXA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImF4aXNWZXJzaW9uIiB2YWx1ZT0iJHtwcm9qZWN0LnZlcnNpb259IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJUT0RBWSIgdmFsdWU9IiR7YnVpbGQudGltZX0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb3B5IHRvRGlyPSIke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvaTE4biIgb3ZlcndyaXRlPSJ0cnVlIiBmaWx0ZXJpbmc9Im9uIiBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnByb2Nlc3MtdGVzdC1yZXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtdGVzdC1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzIHVubGVzcz0ibWF2ZW4udGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIGluaGVyaXRhbGw9InRydWUiIGluaGVyaXRyZWZzPSJ0cnVlIiBkaXI9InRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2VjaG8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9ImJ1aWxkLnhtbCIgaW5oZXJpdGFsbD0idHJ1ZSIgaW5oZXJpdHJlZnM9InRydWUiIGRpcj0idGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlTW9kdWxlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczIueG1sIiB0b2ZpbGU9IiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczIueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dGVzdC1jb21waWxlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzIHVubGVzcz0ibWF2ZW4udGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLmJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGFyZ2V0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9Imoyc2VjYnVpbGQueG1sIiBpbmhlcml0YWxsPSJ0cnVlIiBpbmhlcml0cmVmcz0idHJ1ZSIgZGlyPSJ0ZXN0LXJlc291cmNlcy8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvcmVzb3VyY2VzL2F4aXMyLnhzZCBiLzFfNS9tb2R1bGVzL2tlcm5lbC9yZXNvdXJjZXMvYXhpczIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjBhOGYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9yZXNvdXJjZXMvYXhpczIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4NCi0gIDx4czplbGVtZW50IG5hbWU9ImF4aXNjb25maWciPg0KLSAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPg0KLSAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtb2R1bGUiLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImRlZmF1bHRNb2R1bGVWZXJzaW9ucyIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJkZXBsb3llciIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJob3N0Q29uZmlndXJhdGlvbiIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJsaXN0ZW5lciIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlQnVpbGRlcnMiLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZUZvcm1hdHRlcnMiLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVycyIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtb2R1bGVDb25maWciLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0icGhhc2VPcmRlciIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0YXJnZXRSZXNvbHZlcnMiLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0idHJhbnNwb3J0UmVjZWl2ZXIiLz4NCi0gICAgICAgIDx4czplbGVtZW50IHJlZj0idHJhbnNwb3J0U2VuZGVyIi8+DQotICAgICAgPC94czpjaG9pY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9ImRlZmF1bHRNb2R1bGVWZXJzaW9ucyI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJtb2R1bGUiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iZGVwbG95ZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0b3J5IiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImV4dGVuc2lvbiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6Tk1UT0tFTiIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaG9zdENvbmZpZ3VyYXRpb24iPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJpcCIvPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwb3J0Ii8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9ImlwIiB0eXBlPSJ4czpOTVRPS0VOIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJwb3J0IiB0eXBlPSJ4czppbnRlZ2VyIi8+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJsaXN0ZW5lciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZUJ1aWxkZXJzIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9Im1lc3NhZ2VCdWlsZGVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VCdWlsZGVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnRUeXBlIiB1c2U9InJlcXVpcmVkIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlRm9ybWF0dGVycyI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJtZXNzYWdlRm9ybWF0dGVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VGb3JtYXR0ZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGVudFR5cGUiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlcnMiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9Im1vZHVsZUNvbmZpZyI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9InBoYXNlT3JkZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0icGhhc2UiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJwaGFzZSI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9ImhhbmRsZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0iaGFuZGxlciI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0ib3JkZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ib3JkZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwaGFzZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwaGFzZUxhc3QiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9InRhcmdldFJlc29sdmVycyI+DQotICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRhcmdldFJlc29sdmVyIi8+DQotICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9InRhcmdldFJlc29sdmVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgPC94czpjb21wbGV4VHlwZT4NCi0gIDwveHM6ZWxlbWVudD4NCi0gIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydFJlY2VpdmVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotICA8eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnRTZW5kZXIiPg0KLSAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibW9kdWxlIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHM6ZGVjaW1hbCIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4NCi0gICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NrZWQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgPC94czplbGVtZW50Pg0KLSAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVyIj4NCi0gICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgIDwveHM6Y29tcGxleFR5cGU+DQotICA8L3hzOmVsZW1lbnQ+DQotPC94czpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Jlc291cmNlcy9zZXJ2aWNlcy54c2QgYi8xXzUvbW9kdWxlcy9rZXJuZWwvcmVzb3VyY2VzL3NlcnZpY2VzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOGY5Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvcmVzb3VyY2VzL3NlcnZpY2VzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2VHcm91cCI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJzZXJ2aWNlIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Im1vZHVsZSIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1vZHVsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvcGVyYXRpb24iLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImV4Y2x1ZGVPcGVyYXRpb25zIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VSZWNlaXZlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ic2NoZW1hIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydHMiLz4NCi0gICAgICAgICAgICAgICAgPC94czpjaG9pY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkYXRhTG9jYXRvciIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFjdGl2YXRlIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZXhjbHVkZU9wZXJhdGlvbnMiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iIHR5cGU9InhzOnN0cmluZyIgLz4gIA0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlcnMiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2NoZW1hIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYU5hbWVzcGFjZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydHMiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkYXRhTG9jYXRvciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZGlhbGVjdExvY2F0b3IiLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGlhbGVjdExvY2F0b3IiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRpYWxlY3QiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2tlZCIgdHlwZT0ieHM6Tk1UT0tFTiIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im1vZHVsZSI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG1peGVkPSJ0cnVlIj4NCi0gICAgICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1vZHVsZSIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImFjdGlvbk1hcHBpbmciLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJmYXVsdEFjdGlvbk1hcHBpbmciLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtZXNzYWdlIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ib3V0cHV0QWN0aW9uTWFwcGluZyIvPg0KLSAgICAgICAgICAgIDwveHM6Y2hvaWNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVwIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icW5hbWUiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhY3Rpb25NYXBwaW5nIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZmF1bHRBY3Rpb25NYXBwaW5nIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4NCi0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czphbnlVUkkiPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYXVsdE5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4NCi0gICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2UiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJvdXRwdXRBY3Rpb25NYXBwaW5nIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVyIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotPC94czpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL0F4aXNGYXVsdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL0F4aXNGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjljY2RkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9BeGlzRmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRTdWJDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiBleGNlcHRpb24gd2hpY2ggbWFwcyBjbGVhbmx5IHRvIGEgU09BUCBmYXVsdC4KLSAqIFRoaXMgaXMgYSBiYXNlIGNsYXNzIGZvciBleGNlcHRpb25zIHdoaWNoIGFyZSBtYXBwZWQgdG8gZmF1bHRzLgotICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9SRUMtc29hcDEyLXBhcnQxLTIwMDMwNjI0LyNzb2FwZmF1bHQiPgotICogICAgICBTT0FQMS4yIHNwZWNpZmljYXRpb248L2E+Ci0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvTk9URS1TT0FQLTIwMDAwNTA4LyNfVG9jNDc4MzgzNTA3Ij5TT0FQMS4xIEZhdWx0czwvYT4KLSAqICAgICAgPHAvPgotICogICAgICBTT0FQIGZhdWx0cyBjb250YWluCi0gKiAgICAgIDxvbD4KLSAqICAgICAgPGxpPkEgZmF1bHQgc3RyaW5nCi0gKiAgICAgIDxsaT5BIGZhdWx0IGNvZGUKLSAqICAgICAgPGxpPkEgZmF1bHQgYWN0b3IKLSAqICAgICAgPGxpPkZhdWx0IGRldGFpbHM7IGFuIHhtbCB0cmVlIG9mIGZhdWx0IHNwZWNpZmljIGVsZW1lbnRzCi0gKiAgICAgIDwvb2w+Ci0gKiAgICAgIDxwLz4KLSAqICAgICAgQXMgU09BUDEuMiBmYXVsdHMgYXJlIGEgc3VwZXJzZXQgb2YgU09BUDEuMSBmYXVsdHMsIHRoaXMgdHlwZSBob2xkcyBzb2FwMS4yIGZhdWx0IGluZm9ybWF0aW9uLiBXaGVuCi0gKiAgICAgIGEgU09BUDEuMSBmYXVsdCBpcyBjcmVhdGVkLCBzcHVyaW91cyBpbmZvcm1hdGlvbiBjYW4gYmUgZGlzY2FyZGVkLgotICogICAgICBNYXBwaW5nCi0gKiAgICAgIDxwcmU+Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQMS4yICAgICAgICAgICAgICBTT0FQMS4xCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlICAgICAgICAgICAgICAgICBmYXVsdGFjdG9yCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb24oMCkudGV4dCAgICAgICBmYXVsdHN0cmluZwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRjb2RlLnZhbHVlICAgICAgZmF1bHRjb2RlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdGNvZGUuc3ViY29kZSAgICAoZGlzY2FyZGVkKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsICAgICAgICAgICAgICAgZGV0YWlsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlICAgICAgICAgICAgICAgICAoZGlzY2FyZGVkKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wcmU+Ci0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQXhpc0ZhdWx0IGV4dGVuZHMgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzc0OTMzMDgyMDYyMTI0OTA3TDsKLQotICAgIC8qKgotICAgICAqIGFzc3VtZSBoZWFkZXJzIGFyZSBub3QgdXNlZCB2ZXJ5IG9mdGVuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQotICAgIHByaXZhdGUgTGlzdCBmYXVsdFJlYXNvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgIHByaXZhdGUgUU5hbWUgZmF1bHRDb2RlOwotICAgIHByaXZhdGUgTGlzdCBmYXVsdFN1YkNvZGVzOwotICAgIHByaXZhdGUgU3RyaW5nIGZhdWx0Tm9kZTsKLSAgICBwcml2YXRlIFN0cmluZyBmYXVsdFJvbGU7Ci0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgZGV0YWlsOwotCi0gICAgcHJpdmF0ZSBTT0FQRmF1bHRDb2RlIHNvYXBGYXVsdENvZGU7Ci0gICAgcHJpdmF0ZSBTT0FQRmF1bHRSZWFzb24gc29hcEZhdWx0UmVhc29uOwotICAgIHByaXZhdGUgU09BUEZhdWx0Tm9kZSBzb2FwRmF1bHROb2RlOwotICAgIHByaXZhdGUgU09BUEZhdWx0Um9sZSBzb2FwRmF1bHRSb2xlOwotICAgIHByaXZhdGUgU09BUEZhdWx0RGV0YWlsIHNvYXBGYXVsdERldGFpbDsKLQotICAgIC8qKgotICAgICAqIElmIG5vdCBudWxsLCB0aGlzIE1lc3NhZ2VDb250ZXh0IHJlcHJlc2VudHMgdGhlIGZhdWx0IGFzIGl0Ci0gICAgICogc2hvdWxkIGJlIHJldHVybmVkLiAgVGhpcyBpcyB1c2VkIGJ5IGhpZ2hlci1sZXZlbCBsYXllcnMKLSAgICAgKiB0aGF0IHdhbnQgdG8gZ2VuZXJhdGUgdGhlIG1lc3NhZ2UgdGhlbXNlbHZlcyBzbyB0aGF0Ci0gICAgICogcHJvY2Vzc2luZyBtYXkgdGFrZSBwbGFjZSBiZWZvcmUgdGhleSByZXR1cm4gY29udHJvbCAoZS5nLiBKQVgtV1MuKQotICAgICAqLwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgZmF1bHRNZXNzYWdlQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqIFNPQVAxLjI6IFVSSSBvZiBmYXVsdGluZyBub2RlLiBOdWxsIGZvciB1bmtub3duLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIE5vZGUgZWxlbWVudCBpbmZvcm1hdGlvbiBpdGVtIGlzIHRoZSBVUkkgdGhhdAotICAgICAqIGlkZW50aWZpZXMgdGhlIFNPQVAgbm9kZSB0aGF0IGdlbmVyYXRlZCB0aGUgZmF1bHQuCi0gICAgICogU09BUCBub2RlcyB0aGF0IGRvIG5vdCBhY3QgYXMgdGhlIHVsdGltYXRlIFNPQVAgcmVjZWl2ZXIgTVVTVCBpbmNsdWRlIHRoaXMgZWxlbWVudAotICAgICAqIGluZm9ybWF0aW9uIGl0ZW0uCi0gICAgICogQW4gdWx0aW1hdGUgU09BUCByZWNlaXZlciBNQVkgaW5jbHVkZSB0aGlzIGVsZW1lbnQgaW5mb3JtYXRpb24gaXRlbSB0bwotICAgICAqIGluZGljYXRlIGV4cGxpY2l0bHkgdGhhdCBpdCBnZW5lcmF0ZWQgdGhlIGZhdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5vZGVVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBmYXVsdEFjdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgaHVtYW4tcmVhZGFibGUgdGV4dCBkZXNjcmliaW5nIHRoZSBmYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgYWRkUmVhc29uKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgLSBmYXVsdCBjb2RlIG9mIHRoZSBtZXNzYWdlIGFzIGEgUU5hbWUKLSAgICAgKiBAcGFyYW0gZmF1bHRSZWFzb24gLSB0aGUgcmVhc29uIGZvciB0aGUgZmF1bHQuIFRoZSBsYW5ndWFnZSB3aWxsIGJlIGRlZmF1bHRlZCB0byAnZW4nCi0gICAgICogQHBhcmFtIGNhdXNlIGVtYmVkZGVkIGZhdWx0IHdoaWNoIGNhdXNlZCB0aGlzIG9uZQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoUU5hbWUgZmF1bHRDb2RlLCBTdHJpbmcgZmF1bHRSZWFzb24sIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICB0aGlzKGZhdWx0UmVhc29uLCBjYXVzZSk7Ci0gICAgICAgIHNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0Q29kZSAgICAgICAtIGZhdWx0IGNvZGUgb2YgdGhlIG1lc3NhZ2UgYXMgYSBRTmFtZQotICAgICAqIEBwYXJhbSBmYXVsdFN1YkNvZGVzICAgLSBsaXN0IHN1YiBmYXVsdCBjb2RlcyBhcyBhIGxpc3QgaWYgUU5hbWVzCi0gICAgICogQHBhcmFtIGZhdWx0UmVhc29uIC0gdGhlIHJlYXNvbiBmb3IgdGhlIGZhdWx0LiBUaGUgbGFuZ3VhZ2Ugd2lsbCBiZSBkZWZhdWx0ZWQgdG8gJ2VuJwotICAgICAqIEBwYXJhbSBjYXVzZSBlbWJlZGRlZCBmYXVsdCB3aGljaCBjYXVzZWQgdGhpcyBvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0KFFOYW1lIGZhdWx0Q29kZSxMaXN0IGZhdWx0U3ViQ29kZXMsIFN0cmluZyBmYXVsdFJlYXNvbiwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHRoaXMoZmF1bHRSZWFzb24sIGNhdXNlKTsKLSAgICAgICAgc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgICAgIHNldEZhdWx0U3ViQ29kZXMoZmF1bHRTdWJDb2Rlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgYSBRTmFtZSBmb3IgdGhlIGZhdWx0IGNvZGUKLSAgICAgKiBAcGFyYW0gZmF1bHRSZWFzb24gdGhlIHJlYXNvbiBmb3IgdGhlIGZhdWx0LiBUaGUgbGFuZ3VhZ2Ugd2lsbCBiZSBkZWZhdWx0ZWQgdG8gJ2VuJwotICAgICAqIEBwYXJhbSBmYXVsdE5vZGUgYSBVUkwgaWRlbnRpZnlpbmcgdGhlIFNPQVAgbm9kZSBnZW5lcmF0aW5nIHRoaXMgZmF1bHQsIG9yIG51bGwKLSAgICAgKiBAcGFyYW0gZmF1bHRSb2xlIGEgVVJMIGlkZW50aWZ5aW5nIHRoZSBTT0FQIHJvbGUgYWN0aXZlIHdoZW4gZ2VuZXJhdGluZyB0aGlzIGZhdWx0LCBvciBudWxsCi0gICAgICogQHBhcmFtIGZhdWx0RGV0YWlsIGFyYml0cmFyeSBYTUwgY29udGFpbmluZyBhcHBsaWNhdGlvbi1zcGVjaWZpYyBmYXVsdCBkYXRhCi0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChRTmFtZSBmYXVsdENvZGUsIFN0cmluZyBmYXVsdFJlYXNvbiwgU3RyaW5nIGZhdWx0Tm9kZSwgU3RyaW5nIGZhdWx0Um9sZSwKLSAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmYXVsdERldGFpbCkgewotICAgICAgICB0aGlzKGZhdWx0UmVhc29uLCBmYXVsdENvZGUpOwotICAgICAgICB0aGlzLmZhdWx0Tm9kZSA9IGZhdWx0Tm9kZTsKLSAgICAgICAgdGhpcy5mYXVsdFJvbGUgPSBmYXVsdFJvbGU7Ci0gICAgICAgIHNldERldGFpbChmYXVsdERldGFpbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB0aGUgdXNlci4gSWYgeW91IHNldCB0aGVzZSwgZG8gbm90IHVzZSBvdGhlciBtZXRob2RzCi0gICAgICogaW4gdGhpcyBjbGFzcyB0byBnZXQgYW5kIHNldCB0aGluZ3MuCi0gICAgICogQW55IG9mIHRoZSBwYXJhbWV0ZXJzIGNhbiBiZSBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcEZhdWx0Q29kZSB0aGUgZmF1bHQgY29kZQotICAgICAqIEBwYXJhbSBzb2FwRmF1bHRSZWFzb24gdGhlIGZhdWx0IHJlYXNvbgotICAgICAqIEBwYXJhbSBzb2FwRmF1bHROb2RlIHRoZSBTT0FQRmF1bHROb2RlIHJlcHJlc2VudGluZyB0aGUgc291cmNlIG5vZGUgZm9yIHRoaXMgZmF1bHQKLSAgICAgKiBAcGFyYW0gc29hcEZhdWx0Um9sZSB0aGUgU09BUEZhdWx0Um9sZSByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSByb2xlIGZvciB0aGlzIGZhdWx0Ci0gICAgICogQHBhcmFtIHNvYXBGYXVsdERldGFpbCB0aGUgU09BUEZhdWx0RGV0YWlsIGNvbnRhaW5pbmcgYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljIGluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0KFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZSwgU09BUEZhdWx0UmVhc29uIHNvYXBGYXVsdFJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdE5vZGUgc29hcEZhdWx0Tm9kZSwgU09BUEZhdWx0Um9sZSBzb2FwRmF1bHRSb2xlLAotICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0RGV0YWlsIHNvYXBGYXVsdERldGFpbCkgewotICAgICAgICBpbml0aWFsaXplVmFsdWVzKHNvYXBGYXVsdENvZGUsIHNvYXBGYXVsdFJlYXNvbiwgc29hcEZhdWx0Tm9kZSwgc29hcEZhdWx0Um9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRmF1bHREZXRhaWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzRmF1bHQoU09BUEZhdWx0IGZhdWx0KSB7Ci0gICAgICAgIGluaXRpYWxpemVWYWx1ZXMoZmF1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzRmF1bHQoU09BUEZhdWx0IGZhdWx0LCBNZXNzYWdlQ29udGV4dCBmYXVsdEN0eCkgewotICAgICAgICBpbml0aWFsaXplVmFsdWVzKGZhdWx0KTsKLSAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dCA9IGZhdWx0Q3R4OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKFNPQVBGYXVsdCBmYXVsdCkgewotICAgICAgICBpZiAoZmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZVZhbHVlcyhmYXVsdC5nZXRDb2RlKCksIGZhdWx0LmdldFJlYXNvbigpLCBmYXVsdC5nZXROb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0LmdldFJvbGUoKSwgZmF1bHQuZ2V0RGV0YWlsKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoU09BUEZhdWx0Q29kZSBzb2FwRmF1bHRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0Tm9kZSBzb2FwRmF1bHROb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJvbGUgc29hcEZhdWx0Um9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHREZXRhaWwgc29hcEZhdWx0RGV0YWlsKSB7Ci0gICAgICAgIHRoaXMuc29hcEZhdWx0Q29kZSA9IHNvYXBGYXVsdENvZGU7Ci0gICAgICAgIHRoaXMuc29hcEZhdWx0UmVhc29uID0gc29hcEZhdWx0UmVhc29uOwotICAgICAgICB0aGlzLnNvYXBGYXVsdE5vZGUgPSBzb2FwRmF1bHROb2RlOwotICAgICAgICB0aGlzLnNvYXBGYXVsdFJvbGUgPSBzb2FwRmF1bHRSb2xlOwotICAgICAgICB0aGlzLnNvYXBGYXVsdERldGFpbCA9IHNvYXBGYXVsdERldGFpbDsKLQotICAgICAgICBpZiAoc29hcEZhdWx0RGV0YWlsICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgT01FbGVtZW50IGV4Y2VwdGlvbkVsZW1lbnQgPSBzb2FwRmF1bHREZXRhaWwuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKAotLy8gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlNPQVBfRkFVTFRfREVUQUlMX0VYQ0VQVElPTl9FTlRSWSkpOwotLy8gICAgICAgICAgICBpZiAoZXhjZXB0aW9uRWxlbWVudCAhPSBudWxsICYmIGV4Y2VwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgICAgIGNhdXNlID0gbmV3IEV4Y2VwdGlvbihleGNlcHRpb25FbGVtZW50LmdldFRleHQoKSk7Ci0vLyAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVE9ETyAtIFdoYT8gRGV0YWlscyBjYW4gaGF2ZSBtdWx0aXBsZSBlbGVtZW50cywgd2h5IHRha2UgdGhlIGZpcnN0IGNoaWxkIGhlcmU/Ci0gICAgICAgICAgICAvLyBUT0RPIC0gUmV2aWV3IHRoZSBBUEkgZm9yIGRldGFpbHMKLSAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlIGZhdWx0IGRldGFpbCBhcyB0aGlzLmRldGFpbAotICAgICAgICAgICAgdGhpcy5kZXRhaWwgPSBzb2FwRmF1bHREZXRhaWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb2FwRmF1bHRSZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZSA9IHNvYXBGYXVsdFJlYXNvbi5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc29hcEZhdWx0Q29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2YgU09BUCB2ZXJzaW9uCi0gICAgICAgICAgICBmYXVsdENvZGUgPSBzb2FwRmF1bHRDb2RlLmdldFRleHRBc1FOYW1lKCk7Ci0KLSAgICAgICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc3ViQ29kZSA9IHNvYXBGYXVsdENvZGUuZ2V0U3ViQ29kZSgpOwotICAgICAgICAgICAgaWYgKHN1YkNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0U3ViQ29kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHN1YkNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdFN1YkNvZGVzLmFkZChzdWJDb2RlLmdldFZhbHVlKCkuZ2V0VGV4dEFzUU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN1YkNvZGUgPSBzdWJDb2RlLmdldFN1YkNvZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBmYXVsdCBmcm9tIGEgVGhyb3dhYmxlLiAgVGhpcyBpcyBhIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAtIGluIGdlbmVyYWwKLSAgICAgKiB0byBtYWtlIGFuIEF4aXNGYXVsdCBmcm9tIGFuIEV4Y2VwdGlvbiwgeW91IHNob3VsZCBiZSBjYWxsaW5nIEF4aXNGYXVsdC5tYWtlRmF1bHQoZSksCi0gICAgICogd2hpY2ggcHJldmVudHMgQXhpc0ZhdWx0cyB3aXRoaW4gQXhpc0ZhdWx0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEF4aXNGYXVsdChUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgdGhpcygoY2F1c2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IGNhdXNlLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgICAgIDogbnVsbCwgY2F1c2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VUZXh0IC0gdGhpcyB3aWxsIGFwcGVhciBhcyB0aGUgVGV4dCBpbiB0aGUgUmVhc29uIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgICAtIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFZhbHVlIGluIHRoZSBDb2RlIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU3RyaW5nIG1lc3NhZ2VUZXh0LCBTdHJpbmcgZmF1bHRDb2RlKSB7Ci0gICAgICAgIHRoaXMobWVzc2FnZVRleHQpOwotICAgICAgICBzZXRGYXVsdENvZGUoZmF1bHRDb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VUZXh0IHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFRleHQgaW4gdGhlIFJlYXNvbiBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFZhbHVlIGluIHRoZSBDb2RlIGluZm9ybWF0aW9uIGl0ZW0gb2YgU09BUCBGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU3RyaW5nIG1lc3NhZ2VUZXh0LCBRTmFtZSBmYXVsdENvZGUpIHsKLSAgICAgICAgdGhpcyhtZXNzYWdlVGV4dCk7Ci0gICAgICAgIHNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGlzIHdpbGwgYXBwZWFyIGFzIHRoZSBUZXh0IGluIHRoZSBSZWFzb24gaW5mb3JtYXRpb24gaXRlbSBvZiBTT0FQIEZhdWx0Ci0gICAgICogQHBhcmFtIGNhdXNlIHRoZSBlbWJlZGRlZCBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhpcyBmYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUmVhc29uKG1lc3NhZ2UpOwotICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlVGV4dCAtIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFRleHQgaW4gdGhlIFJlYXNvbiBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgLSB0aGlzIHdpbGwgYXBwZWFyIGFzIHRoZSBWYWx1ZSBpbiB0aGUgQ29kZSBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKiBAcGFyYW0gY2F1c2UgICAgICAgLSB0aGlzIHdpbGwgYXBwZWFyIHVuZGVyIHRoZSBEZXRhaWwgaW5mb3JtYXRpb24gaXRlbSBvZiBTT0FQIEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZVRleHQsIFFOYW1lIGZhdWx0Q29kZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHRoaXMobWVzc2FnZVRleHQsIGNhdXNlKTsKLSAgICAgICAgc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gZmF1bHRNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBjYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRmF1bHQoU3RyaW5nIG1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IGZhdWx0TWVzc2FnZUNvbnRleHQsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0KLSAgICAgICAgdGhpcy5mYXVsdE1lc3NhZ2VDb250ZXh0ID0gZmF1bHRNZXNzYWdlQ29udGV4dDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlVGV4dCAtIHRoaXMgd2lsbCBhcHBlYXIgYXMgdGhlIFRleHQgaW4gdGhlIFJlYXNvbiBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgLSB0aGlzIHdpbGwgYXBwZWFyIGFzIHRoZSBWYWx1ZSBpbiB0aGUgQ29kZSBpbmZvcm1hdGlvbiBpdGVtIG9mIFNPQVAgRmF1bHQKLSAgICAgKiBAcGFyYW0gY2F1c2UgICAgICAgLSB0aGlzIHdpbGwgYXBwZWFyIHVuZGVyIHRoZSBEZXRhaWwgaW5mb3JtYXRpb24gaXRlbSBvZiBTT0FQIEZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEF4aXNGYXVsdChTdHJpbmcgbWVzc2FnZVRleHQsIFN0cmluZyBmYXVsdENvZGUsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICB0aGlzKG1lc3NhZ2VUZXh0LCBjYXVzZSk7Ci0gICAgICAgIHNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBBeGlzRmF1bHQgYnkgcHJvdmlkaW5nIGEgdGV4dHVhbCBtZXNzYWdlIGFuZCBhIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogdGhhdCBjb250YWlucyB0aGUgYWN0dWFsIGZhdWx0IHJlcHJlc2VudGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgICAgICAgICAgICAgQSBzdHJpbmcgdGhhdCdzIHJlYWxseSBvbmx5IHVzZWZ1bCBmb3IgbG9nZ2luZy4KLSAgICAgKiBAcGFyYW0gZmF1bHRNZXNzYWdlQ29udGV4dCBBIE1lc3NhZ2VDb250ZXh0IHdoaWNoIG11c3QgY29udGFpbiBTT0FQIGZhdWx0IGluZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0ZhdWx0KFN0cmluZyBtZXNzYWdlLCBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMobWVzc2FnZSk7Ci0gICAgICAgIHRoaXMuZmF1bHRNZXNzYWdlQ29udGV4dCA9IGZhdWx0TWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgaGVhZGVyIHRvIHRoZSBsaXN0IG9mIGZhdWx0IGhlYWRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgdG8gYWRkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTT0FQSGVhZGVyQmxvY2sgaGVhZGVyKSB7Ci0gICAgICAgIGhlYWRlcnMuYWRkKGhlYWRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcmVhc29uIGZvciB0aGUgZmF1bHQgaW4gdGhlIGVtcHR5ICIiIGxhbmd1YWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCB0ZXh0IG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWFzb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgZmF1bHRSZWFzb25MaXN0LmFkZChuZXcgRmF1bHRSZWFzb24odGV4dCwgIiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSByZWFzb24gZm9yIHRoZSBmYXVsdAotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgICAgIHRleHQgbWVzc2FnZQotICAgICAqIEBwYXJhbSBsYW5ndWFnZSBsYW5ndWFnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlYXNvbihTdHJpbmcgdGV4dCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIGZhdWx0UmVhc29uTGlzdC5hZGQobmV3IEZhdWx0UmVhc29uKHRleHQsIGxhbmd1YWdlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgZmF1bHQgcmVhc29uLCBpZiBhdmFpbGFibGUuIElmIG5vdCBmb3VuZCwgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybiBmYXVsdFJlYXNvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uKCkgewotICAgICAgICBpZiAoZmF1bHRSZWFzb25MaXN0LnNpemUoKSA+PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGYXVsdFJlYXNvbikgZmF1bHRSZWFzb25MaXN0LmdldCgwKSkuZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgaWYgKHNvYXBGYXVsdFJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcEZhdWx0UmVhc29uLmdldFRleHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGhlYWRlcnMKLSAgICAgKgotICAgICAqIEByZXR1cm4gaXRlcmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdEl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gaGVhZGVycy5saXN0SXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYXQgdGhlIGhlYWRlcnMuIFVzZWZ1bCBmb3IgamF2YTEuNSBpdGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBoZWFkZXJzIGZvciB0aGlzIGZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIExpc3QgaGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIGhlYWRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFrZSBhbiBBeGlzRmF1bHQgYmFzZWQgb24gYSBwYXNzZWQgRXhjZXB0aW9uLiAgSWYgdGhlIEV4Y2VwdGlvbiBpcwotICAgICAqIGFscmVhZHkgYW4gQXhpc0ZhdWx0LCBzaW1wbHkgdXNlIHRoYXQuICBPdGhlcndpc2UsIHdyYXAgaXQgaW4gYW4KLSAgICAgKiBBeGlzRmF1bHQuICBJZiB0aGUgRXhjZXB0aW9uIGlzIGFuIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gKHdoaWNoCi0gICAgICogYWxyZWFkeSB3cmFwcyBhbm90aGVyIEV4Y2VwdGlvbiksIGdldCB0aGUgd3JhcHBlZCBFeGNlcHRpb24gb3V0IGZyb20KLSAgICAgKiB0aGVyZSBhbmQgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgcGFzc2VkIG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlIHRoZSA8Y29kZT5FeGNlcHRpb248L2NvZGU+IHRvIGJ1aWxkIGEgZmF1bHQgZm9yCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5BeGlzRmF1bHQ8L2NvZGU+IHJlcHJlc2VudGluZyA8Y29kZT5lPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0ZhdWx0IG1ha2VGYXVsdChUaHJvd2FibGUgZSkgewotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBtYWtlRmF1bHQoKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gKChVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9uKSBlKS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBlID0gKEV4Y2VwdGlvbikgdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgewotICAgICAgICAgICAgcmV0dXJuIChBeGlzRmF1bHQpIGU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEF4aXNGYXVsdChlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZmF1bHQgZGV0YWlsCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG9tIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldERldGFpbCgpIHsKLSAgICAgICAgcmV0dXJuIGRldGFpbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RmF1bHRDb2RlKCkgewotICAgICAgICByZXR1cm4gZmF1bHRDb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEZhdWx0U3ViQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdFN1YkNvZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU09BUEZhdWx0Q29kZSBpZiwgdXNlciBoYXMgc2V0IGEge0BsaW5rIFNPQVBGYXVsdENvZGV9IGVsZW1lbnQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICogICAgICAgICB7QGxpbmsgI0F4aXNGYXVsdChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbiwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsKSBBeGlzRmF1bHR9Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdENvZGUgZ2V0RmF1bHRDb2RlRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdENvZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTT0FQRmF1bHRDb2RlIGlmLCB1c2VyIGhhcyBzZXQgYSB7QGxpbmsgU09BUEZhdWx0UmVhc29ufSBlbGVtZW50IHdoZW4gY29uc3RydWN0aW5nIHRoZQotICAgICAqICAgICAgICAge0BsaW5rICNBeGlzRmF1bHQob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdENvZGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSZWFzb24sIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHROb2RlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Um9sZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdERldGFpbCkgQXhpc0ZhdWx0fQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHRSZWFzb24gZ2V0RmF1bHRSZWFzb25FbGVtZW50KCkgewotICAgICAgICByZXR1cm4gc29hcEZhdWx0UmVhc29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU09BUEZhdWx0Q29kZSBpZiwgdXNlciBoYXMgc2V0IGEge0BsaW5rIFNPQVBGYXVsdE5vZGV9IGVsZW1lbnQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICogICAgICAgICB7QGxpbmsgI0F4aXNGYXVsdChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbiwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsKSBBeGlzRmF1bHR9Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdE5vZGUgZ2V0RmF1bHROb2RlRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBGYXVsdE5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBTT0FQRmF1bHRDb2RlIGlmLCB1c2VyIGhhcyBzZXQgYSB7QGxpbmsgU09BUEZhdWx0Um9sZX0gZWxlbWVudCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgKiAgICAgICAgIHtAbGluayAjQXhpc0ZhdWx0KG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0UmVhc29uLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Tm9kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWwpIEF4aXNGYXVsdH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0Um9sZSBnZXRGYXVsdFJvbGVFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gc29hcEZhdWx0Um9sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFNPQVBGYXVsdENvZGUgaWYsIHVzZXIgaGFzIHNldCBhIHtAbGluayBTT0FQRmF1bHREZXRhaWx9IGVsZW1lbnQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICogICAgICAgICB7QGxpbmsgI0F4aXNGYXVsdChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZSwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbiwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGUsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSb2xlLCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsKSBBeGlzRmF1bHR9Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdERldGFpbCBnZXRGYXVsdERldGFpbEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwRmF1bHREZXRhaWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmYXVsdGluZyBub2RlIHVyaS4KLSAgICAgKiBTT0FQMS4yCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFVSSSBhcyBhIHN0cmluZyBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlVVJJKCkgewotICAgICAgICByZXR1cm4gbm9kZVVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGVudGlyZSBkZXRhaWwgZWxlbWVudCBvZiB0aGUgZmF1bHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXRhaWwgYW4gT01FbGVtZW50IHdoaWNoIE1VU1QgYmUgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGV0YWlsKE9NRWxlbWVudCBkZXRhaWwpIHsKLSAgICAgICAgdGhpcy5kZXRhaWwgPSBkZXRhaWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRDb2RlKFFOYW1lIHNvYXBGYXVsdENvZGUpIHsKLSAgICAgICAgdGhpcy5mYXVsdENvZGUgPSBzb2FwRmF1bHRDb2RlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdFN1YkNvZGVzKExpc3QgZmF1bHRTdWJDb2RlcykgewotICAgICAgICB0aGlzLmZhdWx0U3ViQ29kZXMgPSBmYXVsdFN1YkNvZGVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdENvZGUoU3RyaW5nIHNvYXBGYXVsdENvZGUpIHsKLSAgICAgICAgLy8gVE9ETzogaXMgaXQgcmVhbGx5IHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhlIHBhc3NlZCBzdHJpbmcgaXMgYWx3YXlzIHRoZSBsb2NhbHBhcnQ/Ci0gICAgICAgIC8vIFdoYXQgaWYgc29tZW9uZSBwYXNzZXMgc29hcGVudjpTZW5kZXI/Ci0gICAgICAgIGZhdWx0Q29kZSA9IG5ldyBRTmFtZShzb2FwRmF1bHRDb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZhdWx0aW5nIG5vZGUgdXJpLiAoU09BUDEuMikKLSAgICAgKgotICAgICAqIEBwYXJhbSBub2RlVVJJIGEgU3RyaW5nIGNvbnRhaW5pbmcgYSBVUkkgaW5kaWNhdGluZyB3aGljaCBTT0FQIE5vZGUgZmF1bHRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVVUkkoU3RyaW5nIG5vZGVVUkkpIHsKLSAgICAgICAgdGhpcy5ub2RlVVJJID0gbm9kZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0Tm9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0Tm9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0Um9sZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0Um9sZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNZXNzYWdlQ29udGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmF1bHQgaWYgdGhlIGZhdWx0Ci0gICAgICogd2FzIGNyZWF0ZWQgYnkgcHJvdmlkaW5nIHRoYXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBNZXNzYWdlQ29udGV4dCByZXByZXNlbnRpbmcgdGhlIGZhdWx0IG1lc3NhZ2Ugb3IgbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIGZhdWx0IHdhcyBub3QgY3JlYXRlZCB3aXRoIE1lc3NhZ2VDb250ZXh0IHJlcHJlc2VudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRGYXVsdE1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlQ29udGV4dDsKLSAgICB9Ci0KLSAgICBjbGFzcyBGYXVsdFJlYXNvbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZXsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MTI1OTkxNDIyNjE0NjA3MTY5TDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogTGFuZ3VhZ2Ugb2YgdGhlIHJlYXNvbi4KLSAgICAgICAgICogeG1sOmxhbmc9ImVuIiAiZW4tR0IiIG9yIGp1c3QgIiIKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlID0gIiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGVudjpyZWFzb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0gICAgICAgIHB1YmxpYyBGYXVsdFJlYXNvbigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGYXVsdFJlYXNvbihTdHJpbmcgdGV4dCwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiB0aGUgdGV4dCB2YWx1ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGFjdGlvbiB2YWx1ZSBzZXQgZm9yIHRoZSBmYXVsdCBtZXNzYWdlICAKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZhdWx0QWN0aW9uKCkgewotCQlyZXR1cm4gZmF1bHRBY3Rpb247Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSAoT1BUSU9OQUwpIGFjdGlvbiB2YWx1ZSBmb3IgdGhlIGZhdWx0IG1lc3NhZ2UKLSAgICAgKgotCSAqIEBwYXJhbSBmYXVsdEFjdGlvbiBhIFN0cmluZyBjb250YWluaW5nIGFuIGFjdGlvbiBVUkkgZm9yIHRoZSBmYXVsdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZhdWx0QWN0aW9uKFN0cmluZyBmYXVsdEFjdGlvbikgewotCQl0aGlzLmZhdWx0QWN0aW9uID0gZmF1bHRBY3Rpb247Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGV0YWlsIG1lc3NhZ2UsIGluY2x1ZGluZyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBjYXVzZSwgaWYgYW55LCBvZiB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGRldGFpbCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGF4aXMyIGZhdWx0IHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBmYXVsdFR5cGU7Ci0KLSAgICBwdWJsaWMgaW50IGdldEZhdWx0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdFR5cGUoaW50IGZhdWx0VHlwZSkgewotICAgICAgICB0aGlzLmZhdWx0VHlwZSA9IGZhdWx0VHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDEwZGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi0vKioKLSAqIENsYXNzIENvbnN0YW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNPQVBfU1RZTEVfUlBDX0VOQ09ERUQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX1NUWUxFX1JQQ19FTkNPREVEID0gMTAwMDsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNPQVBfU1RZTEVfUlBDX0xJVEVSQUwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX1NUWUxFX1JQQ19MSVRFUkFMID0gMTAwMTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNPQVBfU1RZTEVfRE9DX0xJVEVSQUxfV1JBUFBFRAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPQVBfU1RZTEVfRE9DX0xJVEVSQUxfV1JBUFBFRCA9IDEwMDI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBTRVNTSU9OX1NDT1BFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9TQ09QRSA9ICJzZXNzaW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNFU1NJT05fQ09OVEVYVF9QUk9QRVJUWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ09OVEVYVF9QUk9QRVJUWSA9ICJTZXNzaW9uQ29udGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQSEFTRV9UUkFOU1BPUlQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9UUkFOU1BPUlQgPSAidHJhbnNwb3J0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFBIQVNFX1NFUlZJQ0UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9TRVJWSUNFID0gInNlcnZpY2UiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUEhBU0VfR0xPQkFMCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfR0xPQkFMID0gImdsb2JhbCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNRVNTQUdFX1NDT1BFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9TQ09QRSA9ICJtZXNzYWdlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVNfQklORElOR19PUEVSQVRJT04gPSAiQXhpc0JpbmRpbmdPcGVyYXRpb24iOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVNfQklORElOR19NRVNTQUdFID0gIkF4aXNCaW5kaW5nTWVzc2FnZSI7Ci0KLQotICAgIC8qKgotICAgICAqIFRvIGNoZW5nZSB0aGUgY29uZXRleHQgcGF0aCBmcm9tIGF4aXMyL3NlcnZpY2UgdG8gc29tZXRoaW5nIGVsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DT05URVhUX1JPT1QgPSAiY29udGV4dFJvb3QiOwotICAgIC8qKgotICAgICAqIFRvIGNoZW5hZ2UgdGhlIHNlcnZpY2UgcGF0aCB0byBzb210aGluZyBlbHNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0VSVklDRV9QQVRIID0gInNlcnZpY2VQYXRoIjsKLSAgICAvL1BhcmFtZXRlciBuYW1lIGZvciB0cmFuc3BvcnQgc2Vzc2lvbiBtYW5hZ2VtbnR0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFX1RSQU5TUE9SVF9TRVNTSU9OID0gIm1hbmFnZVRyYW5zcG9ydFNlc3Npb24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9TVEFURSA9ICJheGlzMi5odHRwLnJlc3BvbnNlLnN0YXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0JBU0lDX0FVVEhfUkVBTE0gPSAiYXhpczIuYXV0aGVudGljYXRpb24ucmVhbG0iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQVBQTElDQVRJT05fU0NPUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfU09BUF9TRVNTSU9OID0gInNvYXBzZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9UUkFOU1BPUlRfU0VTU0lPTiA9ICJ0cmFuc3BvcnRzZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ09QRV9SRVFVRVNUID0gInJlcXVlc3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJfUkVQTyA9ICJheGlzMi5yZXBvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9DT05GID0gImF4aXMyLnhtbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FID0gInVzZXIuaG9tZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBUUkFOU1BPUlRfVENQCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX1RDUCA9ICJ0Y3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9NQUlMID0gIm1haWx0byI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0xPQ0FMID0gImxvY2FsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfSk1TID0gImptcyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBUUkFOU1BPUlRfSFRUUAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9IVFRQID0gImh0dHAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9IVFRQUyA9ICJodHRwcyI7Ci0KLSAgICAvL1BhcmFtZXRlciBuYW1lIG9mIFNlcnZpY2UgaW1wbCBjbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfQ0xBU1MgPSAiU2VydmljZUNsYXNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX09CSkVDVF9TVVBQTElFUiA9ICJTZXJ2aWNlT2JqZWN0U3VwcGxpZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfVENDTCA9ICJTZXJ2aWNlVENDTCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQ0NMX0RFRkFVTFQgPSAiZGVmYXVsdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVENDTF9DT01QT1NJVEUgPSAiY29tcG9zaXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQ0NMX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfTkFNRSA9ICJmYXVsdE5hbWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUkVRVUVTVF9VUkxfUFJFRklYCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9QSEFTRVMgPSAibGlzdFBoYXNlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9NT0RVTEVTID0gImxpc3RNb2R1bGVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0dMT0FCTExZX0VOR0FHRURfTU9EVUxFUyA9ICJnbG9iYWxNb2R1bGVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0NPTlRFWFRTID0gImxpc3RDb250ZXh0cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5HQUdFX01PRFVMRV9UT19TRVJWSUNFX0dST1VQID0gImVuZ2FnZVRvU2VydmljZUdyb3VwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0VfTU9EVUxFX1RPX1NFUlZJQ0UgPSAiZW5nYWdlVG9TZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0VfR0xPQkFMX01PRFVMRSA9ICJlbmdhZ2luZ2dsb2JhbGx5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9MT0dJTiA9ICJhZG1pbmxvZ2luIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX1dFQl9DT05URU5UX1JPT1QgPSAiL2F4aXMyLXdlYi8iOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBzZXJ2aWNlIGZvciBhZG1pbiBwYWdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX0xJU1RTRVJWSUNFUyA9ICJsaXN0U2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19HTE9CQUxfSEFORExFUlMgPSAidmlld0dsb2JhbEhhbmRsZXJzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfU0VSVklDRV9GT1JfUEFSQV9FRElUID0gInNlbGVjdFNlcnZpY2VQYXJhRWRpdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NFUlZJQ0UgPSAic2VsZWN0U2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9TRVJWSUNFX1BBUkEgPSAiZWRpdFNlcnZpY2VwYXJhIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1NFUlZJQ0VfSEFORExFUlMgPSAidmlld1NlcnZpY2VIYW5kbGVycyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9OQU1FID0gInVzZXJOYW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTl9TRUNVUklUWV9ESVNBQkxFRCA9ICJkaXNhYmxlQWRtaW5TZWN1cml0eSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBTSU5HTEVfU0VSVklDRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9TRVJWSUNFID0gInNpbmdsZXNlcnZpY2UiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUQ09OVEVYVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfQ09OVEVYVCA9ICJ0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0Q29udGV4dCI7Ci0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVRVUVTVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfU0VSVkxFVF9SRVFVRVNUID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRSZXF1ZXN0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTUFQID0gInNlcnZpY2VtYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUk9PVCA9ICJzZXJ2aWNlUm9vdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9QQVRIID0gInNlcnZpY2VQYXRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0hBTkRMRVJTID0gInNlcnZpY2VIYW5kbGVycyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9HUk9VUF9NQVAgPSAic2VydmljZUdyb3VwbWFwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFID0gInNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWSUNFX1RZUEUgPSAiU0VMRUNUX1NFUlZJQ0VfVFlQRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fQUNUSVZBVEVfU0VSVklDRSA9ICJpbkFjdGl2YXRlU2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZBVEVfU0VSVklDRSA9ICJhY3RpdmF0ZVNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX0xJU1QgPSAicGhhc2VMaXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJwYXNzd29yZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX01BUCA9ICJvcGVyYXRpb25tYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9NQVAgPSAibW9kdWxlbWFwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfQUREUkVTU0lORyA9ICJhZGRyZXNzaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1NFUlZJQ0VfR1JPVVBTID0gImxpc3RTZXJ2aWNlR3JvdXBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX09QRVJBVElPTlNfRk9SX1RIRV9TRVJWSUNFID0gImxpc3RPcGVyYXRpb25zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19GQVVMVFkgPSAiRmF1bHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTF9IQU5ETEVSUyA9ICJheGlzY29uZmlnIjsKLQotICAgIC8qKgotICAgICAqIEtleXMgZm9yIHNlcnZpY2UvbW9kdWxlIGVycm9yIG1hcHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TRVJWSUNFX01BUCA9ICJlcnJwcnNlcnZpY2VtYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01PRFVMRV9NQVAgPSAiZXJyb3Jtb2R1bGVzbWFwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0VfU1RBVFVTID0gImVuZ2FnZXN0YXR1cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NPTlRFWFQgPSAiY29uZmlnX2NvbnRleHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfQ09OVEVOVCA9ICJ3c2RsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTUFQUElORyA9ICJhY3Rpb25NYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQUNUSU9OX01BUFBJTkcgPSAib3V0cHV0QWN0aW9uTWFwcGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUNUSU9OX01BUFBJTkcgPSAiZmF1bHRBY3Rpb25NYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BQ1RJT05fTkFNRSA9ICJmYXVsdE5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RSVUUgPSAidHJ1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRkFMU0UgPSAiZmFsc2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09QVElPTkFMID0gIm9wdGlvbmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUSU5HX1BBVEggPSAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVElOR19SRVBPU0lUT1JZID0gVEVTVElOR19QQVRIICsgInNhbXBsZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTRVJWSUNFX05BTUVfU1BMSVRfQ0hBUiA9ICc6JzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0dST1VQX0lEID0gIlNlcnZpY2VHcm91cElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9XUklUVEVOID0gIlJFU1BPTlNFX1dSSVRURU4iOwotICAgIC8vVG8gaGF2ZSBhIGZsb2FnIGlmIHRoZSByZXBseVRvIGlzIG5vdCBhbm5vbiBvbmUKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUZGRVJFTlRfRVBSID0gIkRJRkZFUkVOVF9FUFIiOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjYW4gYmUgc2V0IGluIHRoZSBNZXNzYWdlQ29udGV4dCB0byBnaXZlIGFuIHJlc3BvbnNlIGNvZGUgdGhlIHRyYW5zcG9ydCBzaG91bGQgdXNlIHdoZW4gc2VuZGluZyBpdCBvdXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQ09ERSA9ICJSRVNQT05TRV9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIFRyYW5zcG9ydCBJbmZvCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUX1RSQU5TUE9SVF9JTkZPID0gIk91dFRyYW5zcG9ydEluZm8iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgTUVUSE9EX05BTUVfRVNDQVBFX0NIQVJBQ1RFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBNRVRIT0RfTkFNRV9FU0NBUEVfQ0hBUkFDVEVSID0gJz8nOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFRCA9ICJMb2dnZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9NQU5BR0VEID0gIkNvbnRhaW5lck1hbmFnZWQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMgPSAiRmF1bHRIZWFkZXJzIjsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT09LSUVfU1RSSU5HID0gIkNvb2tpZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DT09LSUUgPSAiYXhpc19zZXNzaW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NPT0tJRV9KU0VTU0lPTklEID0gIkpTRVNTSU9OSUQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DT09LSUVfSUQgPSAiY3VzdG9tQ29va2llSUQiOwotCi0gICAgLyoqCi0gICAgICogQWRkcmVzc2luZyBDb25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTSU5HX0FDVElPTiA9ICJXUy1BZGRyZXNzaW5nOkFjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9GUk9OVEVORF9IT1NUX1VSTCA9ICJodHRwRnJvbnRlbmRIb3N0VXJsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFU1RfUEFUSCA9ICJyZXN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFUlZJQ0VTX1BBVEggPSAic2VydmljZXMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTElDQVRJT05fRkFVTFQgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUE9SVF9GQVVMVCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09BUF9QUk9DRVNTSU5HX0ZBVUxUID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0ZBVUxUX1NUUklORyA9ICJhcHBsaWNhdGlvbkZhdWx0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfRkFVTFRfU1RSSU5HID0gInRyYW5zcG9ydEZhdWx0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1BST0NFU1NJTkdfRkFVTFRfU1RSSU5HID0gInNvYXBQcm9jZXNzaW5nRmF1bHQiOwotCi0gICAgLy8gdXNlZCB0byBoYW5kbGUgcGlnZ3kgYmFjayBtZXNzYWdlcyB3aXRoIG1haWwgdHJhbnNwb3J0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElHR1lCQUNLX01FU1NBR0UgPSAicGlnZ3liYWNrTWVzc2FnZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBCdWlsZGVyIFNlbGVjdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9TRUxFQ1RPUiA9ICJidWlsZGVyc2VsZWN0b3IiOwotCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgbmFtZSBmb3IgaW5ib3VuZCBmYXVsdCBwcm9jZXNzb3IgdG8gc2V0IGEgZmF1bHQgb24gdGhlIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IHRvIGJlIHRocm93biBieSB0aGUgY2xpZW50IGNvZGUgaW4gZmF2b3VyIG9mIGEgc2ltcGxlIHRyYW5zbGF0aW9uCi0gICAgICogZnJvbSBTT0FQRmF1bHQgdG8gQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5CT1VORF9GQVVMVF9PVkVSUklERSA9ICJpbmJvdW5kRmF1bHRPdmVycmlkZSI7Ci0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogT24gaW5ib3VuZCByZXF1ZXN0cywgdGhlIGRldGFjaGFibGUgaW5wdXQgc3RyZWFtIGNhbiBiZSBxdWVyaWVkIHRvIGdldAotICAgICAqIHRoZSBpbmJvdW5kIGxlbmd0aC4gIEl0IGNhbiBhbHNvIGJlICJkZXRhY2hlZCIgZnJvbSB0aGUgaW5ib3VuZCBodHRwIHN0cmVhbQotICAgICAqIHRvIGFsbG93IHJlc291cmNlcyB0byBiZSBmcmVlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBQ0hBQkxFX0lOUFVUX1NUUkVBTSA9IAotICAgICAgICAib3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbSI7Ci0KLSAgICAvKiogU09BUCBSb2xlIENvbmZpZ3VyYXRpb24gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1JPTEVfQ09ORklHVVJBVElPTl9FTEVNRU5UID0gIlNPQVBSb2xlQ29uZmlndXJhdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9ST0xFX0lTX1VMVElNQVRFX1JFQ0VJVkVSX0FUVFJJQlVURSA9ICJpc1VsdGltYXRlUmVjZWl2ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUk9MRV9FTEVNRU5UID0gInJvbGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUk9MRV9QTEFZRVJfUEFSQU1FVEVSID0gInJvbGVQbGF5ZXIiOwotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZCB0byBzdG9yZSBIZWFkZXIgUU5hbWVzIHRoYXQgZmFpbGVkIG11c3RVbmRlcnN0YW5kIGNoZWNrIGluIEF4aXNFbmdpbmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5QUk9DRVNTRURfSEVBREVSX1FOQU1FUyA9ICJ1bnByb2Nlc3NlZEhlYWRlclFOYW1lcyI7Ci0KLSAgICAvLyBLZXlzIHRvIGFjY2VzcyBKQVhXUyBSZXF1ZXN0IGFuZCBSZXNwb25zZSBTT0FQIEhlYWRlcnMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19PVVRCT1VORF9TT0FQX0hFQURFUlMgID0gImpheHdzLmJpbmRpbmcuc29hcC5oZWFkZXJzLm91dGJvdW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19JTkJPVU5EX1NPQVBfSEVBREVSUyA9ICJqYXh3cy5iaW5kaW5nLnNvYXAuaGVhZGVycy5pbmJvdW5kIjsKLSAgICAKLSAgICAvLyBJZiB0aGUgSkFYV1MgV2ViTWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciwgdGhlIGV4Y2VwdGlvbiBpcwotICAgIC8vIHN0b3JlZCBvbiB0aGUgc2VydmVyIG91dGJvdW5kIE1lc3NhZ2VDb250ZXh0LiAgVGhpcyBpcyB0aGUga2V5IHRvIGFjY2VzcyB0aGF0IFRocm93YWJsZSBvYmplY3QuCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfV0VCTUVUSE9EX0VYQ0VQVElPTiA9IAotICAgICAgICAiamF4d3Mub3V0Ym91bmQucmVzcG9uc2Uud2VibWV0aG9kLmV4Y2VwdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBBIE1lc3NhZ2VDb250ZXh0IHByb3BlcnR5IG9yIGNsaWVudCBPcHRpb24gc3RhdGluZyB0aGUgSk1TIGNvcnJlbGF0aW9uIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk1TX0NPT1JFTEFUSU9OX0lEID0gIkpNU19DT09SRUxBVElPTl9JRCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVkVSU0lPTiA9InZlcnNpb24iOwotCi0gICAgLyoqCi0gICAgICogRm9sbG93aW5nIGNvbnN0YW50IGFyZSB1c2VkIGZvciBKVEEgdHJhbnNhY3Rpb24gc3VwcG9yeXQgaW4gQXhpczIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RSQU5TQUNUSU9OID0gIlVzZXJUcmFuc2FjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05fTUFOQUdFUiA9ICJUcmFuc2FjdGlvbk1hbmFnZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVU1BFTkRFRF9UUkFOU0FDVElPTiA9ICJTdXNwZW5kZWRUcmFuc2FjdGlvbiI7Ci0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDb25maWd1cmF0aW9uIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX1JFU1QgPSAiZW5hYmxlUkVTVCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9IVFRQX0NPTlRFTlRfTkVHT1RJQVRJT04gPSAiaHR0cENvbnRlbnROZWdvdGlhdGlvbiI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9SRVNUX1RIUk9VR0hfR0VUID0gInJlc3RUaHJvdWdoR2V0IjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVFNfVEVNUF9ESVIgPSAiYXJ0aWZhY3RzRElSIjsKLQotICAgICAgICAvL0F0dGFjaG1lbnQgY29uZmlndXJhdGlvbnMKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX01UT00gPSAiZW5hYmxlTVRPTSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1UT01fVEhSRVNIT0xEID0gIm10b21UaHJlc2hvbGQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9BVFRBQ0hNRU5UUyA9ICJjYWNoZUF0dGFjaG1lbnRzIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNITUVOVF9URU1QX0RJUiA9ICJhdHRhY2htZW50RElSIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TSVpFX1RIUkVTSE9MRCA9ICJzaXplVGhyZXNob2xkIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX1NXQSA9ICJlbmFibGVTd0EiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0JPVU5EQVJZID0gIm1pbWVCb3VuZGFyeSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1NN19DT01QQVRJQkxFID0gIk1NN0NvbXBhdGlibGUiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNTTdfSU5ORVJfQk9VTkRBUlkgPSAiTU03SW5uZXJCb3VuZGFyeSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1NN19QQVJUX0NJRCA9ICJNTTdQYXJ0Q0lEIjsKLQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRFVDRV9XU0RMX01FTU9SWV9DQUNIRSA9ICJyZWR1Y2VXU0RMTWVtb3J5Q2FjaGUiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURVQ0VfV1NETF9NRU1PUllfVFlQRSAgPSAicmVkdWNlV1NETE1lbW9yeVR5cGUiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EX0dFVCA9ICJHRVQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9ERUxFVEUgPSAiREVMRVRFIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0RfUFVUID0gIlBVVCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EID0gIkhUVFBfTUVUSE9EIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0RfUE9TVCA9ICJQT1NUIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAiQ29udGVudFR5cGUiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DT05URVhUX1RJTUVPVVRfSU5URVJWQUwgPSAiQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI7Ci0KLSAgICAgICAgLyoqIEBkZXByZWNhdGVkIE1JU1NQRUxMSU5HICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19DT05URVhUX1RJTU9VVF9JTlRFUlZBTCA9ICJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfSU5fVVJMID0gIlRyYW5zcG9ydEluVVJMIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUEFSQU1FVEVSX0xJU1QgPSAiVVJMUGFyYW1ldGVyTGlzdCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9IVFRQX0xPQ0FUSU9OX1BBUkFNU19MSVNUID0gIkhUVFBMb2NhdGlvblBhcmFtc0xpc3QiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRfU1RBQ0tUUkFDRV9ERVRBSUxTX1dJVEhfRkFVTFRTID0KLSAgICAgICAgICAgICAgICAic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJTExfRE9XTl9UT19ST09UX0NBVVNFX0ZPUl9GQVVMVF9SRUFTT04gPQotICAgICAgICAgICAgICAgICJkcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1JFU1QgICA9ICJkaXNhYmxlUkVTVCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfU09BUDExICAgPSAiZGlzYWJsZVNPQVAxMSI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfU09BUDEyID0gImRpc2FibGVTT0FQMTIiOwotCi0gICAgICAgIC8vIHRoaXMgd2lsbCBjb250YWluIHRoZSBrZXlzIG9mIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgaW4gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVVJMID0gIlRyYW5zcG9ydFVSTCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTID0KLSAgICAgICAgICAgICAgICAiZGlzYWJsZUFkZHJlc3NpbmdGb3JPdXRNZXNzYWdlcyI7Ci0KLSAgICAgICAgLy8gaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gQm9vbGVhbi5UUlVFIHRoZW4gdGhlIFNPQVBBY3Rpb24gaGVhZGVyLCBpZiBwcmVzZW50LAotICAgICAgICAvLyB3aWxsIE5PVCBiZSBzZXQgdG8gdGhlIHZhbHVlIG9mIE9wdGlvbnMuZ2V0QWN0aW9uKCkuIFRoZSBlbXB0eSB2YWx1ZSwgIiIsIHdpbGwKLSAgICAgICAgLy8gYmUgdXNlZCBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfU09BUF9BQ1RJT04gPSAiZGlzYWJsZVNvYXBBY3Rpb24iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaWVsZCBDSEFSQUNURVJfU0VUX0VOQ09ESU5HCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfU0VUX0VOQ09ESU5HID0gIkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkciOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB0aGlzIGlzIHNldCB0byBhIEJvb2xlYW4gJ3RydWUnIHZhbHVlLCB0aGUgcmVwbHlUbyB2YWx1ZSB3aWxsIG5vdCBiZSByZXBsYWNlZCBpbgotICAgICAgICAgKiBhbiBPdXRJbiBpbnZvY2F0aW9uLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kdWxlcyB0aGF0IGhvcGUgdG8gZ2V0IHRoZSByZXBseSBtZXNzYWdlIGluCi0gICAgICAgICAqIGl0cyBvd24gbWFubmVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0NVU1RPTV9MSVNURU5FUiA9ICJVc2VDdXN0b21MaXN0ZW5lciI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIGEgQm9vbGVhbiAndHJ1ZScgdmFsdWUsIHRoZW4gT3V0SW4gb3BlcmF0aW9ucyB3aWxsIGFsd2F5cyBiZSB0cmVhdGVkCi0gICAgICAgICAqIGFzIGFzeW5jLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbW9kdWxlcyB0aGF0IGxheWVyIGFzeW5jIGJlaGF2aW91ciBvbiB0b3Agb2Ygc3luYyBjaGFubmVscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9BU1lOQ19PUEVSQVRJT05TID0gIlVzZUFzeW5jT3BlcmF0aW9ucyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtZXNzYWdlIGZvcm1hdCB3aGljaCB0aGUgbWVzc2FnZSBuZWVkcyB0byBiZSBzZXJpYWxpemVzLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfVFlQRSA9ICJtZXNzYWdlVHlwZSI7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0ZPUk1BVFRFUiA9ICJtZXNzYWdlRm9ybWF0dGVyIjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgQXhpczIgZGVmYXVsdCBmYWxsIGJhY2sgYnVpbGRlci4gV2hlbiBlbmFibGVkIEF4aXMyIAotICAgICAgICAgKiB3aWxsIGJ1aWxkIGFueSBtZXNzYWdlIHRoYXQgaGFzIGEgY29udGVudCB0eXBlIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbmZpZ3VyZWQKLSAgICAgICAgICogQXhpczIgYnVpbGRlciB3aWxsIGJlIGJ1aWx0IHVzaW5nIHRoaXMgYnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9ERUZBVUxUX0ZBTExCQUNLX0JVSUxERVIgPSAidXNlRGVmYXVsdEZhbGxiYWNrQnVpbGRlciI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9SRVNQT05TRV9NRVAgPSAic29hcFJlc3BvbnNlTUVQIjsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIHdpbGwgYmUgdXNlZCBhcyBhIGtleSBmb3Igc3RvcmluZyB0cmFuc3BvcnQgaW5mb3JtYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfSU5GT19NQVAgPSAiVHJhbnNwb3J0SW5mb01hcCI7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogSWYgdGhpcyBpcyBzZXQgdG8gYSBCb29sZWFuICd0cnVlJyB2YWx1ZSwgdGhlbiBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgaW5zdGFuY2VzIHdpbGwKLSAgICAgICAgICogbm90IGJlIHNpZ25hbGxlZCBieSB0aGUgRGlzcGF0Y2ggcGhhc2UuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2R1bGVzIHRoYXQgYWRkIHdpc2ggdG8KLSAgICAgICAgICogc2VuZCBleHRyYSBtZXNzYWdlcyBpbiB0aGUgYmFja2NoYW5uZWwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1JFU1BPTlNFX0FDSyA9ICJEaXNhYmxlUmVzcG9uc2VBY2siOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgdG8gYWRkIGFuIGRlcGxveW1lbnQgbGlmZSBjeWNsZSBsaXN0bmVyIHRvIEF4aXMyCi0gICAgICAgICAqLwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWU1FTlRfTElGRV9DWUNMRV9MSVNURU5FUiA9ICJkZXBsb3ltZW50TGlmZUN5Y2xlTGlzdGVuZXIiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0FCU09MVVRFX0xPQ0FUSU9OX1VSSVMgPSAiZ2VuZXJhdGVBYnNvbHV0ZUxvY2F0aW9uVVJJcyI7Ci0KLQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL1NlcnZpY2VPYmplY3RTdXBwbGllci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL1NlcnZpY2VPYmplY3RTdXBwbGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGU4NDlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9TZXJ2aWNlT2JqZWN0U3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0vKgotICogCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlT2JqZWN0U3VwcGxpZXIgewotICAgIC8qIERlcGxveW1lbnQgRW5naW5lIHVzZXMgdGhpcyBtZXRob2QgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VPYmplY3QoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQ7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvVmVyc2lvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1NWNiYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotCi0vKioKLSAqIExpdHRsZSB1dGlsaXR5IHRvIGdldCB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgZGF0ZSBvZiB0aGUgYXhpczIuamFyLgotICogPHAvPgotICogVGhlIG1lc3NhZ2VzIHJlZmVyZW5jZWQgaGVyZSBhcmUgYXV0b21hdGljYWxseSBrZXB0IHVwLXRvLWRhdGUgYnkgdGhlCi0gKiBidWlsZC54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhpcyBBWElTLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGlzIGF4aXMyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImF4aXNWZXJzaW9uIikgKyAiXG4iICsKLSAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJidWlsdE9uIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQXhpcyBWZXJzaW9uIG51bWJlciBhbmQgYnVpbGQgZGF0ZS4KLSAgICAgKiA8cC8+Ci0gICAgICogRXhhbXBsZSBvdXRwdXQ6IDEuMSBKdWwgMDgsIDIwMDMgKDA5OjAwOjEyIEVEVCkKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGZ1bGwgdmVyc2lvbiBvZiB0aGlzIGF4aXMyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvblRleHQoKSB7Ci0gICAgICAgIHJldHVybiBNZXNzYWdlcy5nZXRNZXNzYWdlKCJheGlzVmVyc2lvblJhdyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVudHJ5IHBvaW50LgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsaW5nIHRoaXMgd2l0aCBubyBhcmd1bWVudHMgcmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgY2xpZW50LXNpZGUKLSAgICAgKiBheGlzMi5qYXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0VmVyc2lvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZTVhMGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgQWRkcmVzc2luZ0NvbnN0YW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFkZHJlc3NpbmdDb25zdGFudHMgewotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb21tb24gTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnRpZXMgPT09PT09PT09PT09PT09PT09PQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX01FU1NBR0VfSUQgPSAiTWVzc2FnZUlEIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9SRUxBVEVTX1RPID0gIlJlbGF0ZXNUbyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfUkVMQVRFU19UT19SRUxBVElPTlNISVBfVFlQRSA9ICJSZWxhdGlvbnNoaXBUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9UTyA9ICJUbyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfUkVQTFlfVE8gPSAiUmVwbHlUbyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfRlJPTSA9ICJGcm9tIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9GQVVMVF9UTyA9ICJGYXVsdFRvIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9BQ1RJT04gPSAiQWN0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVQUl9TRVJWSUNFX05BTUUgPSAiU2VydmljZU5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBSX1JFRkVSRU5DRV9QQVJBTUVURVJTID0gIlJlZmVyZW5jZVBhcmFtZXRlcnMiOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBDb21tb24gRVBSIEVsZW1lbnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVQUl9BRERSRVNTID0gIkFkZHJlc3MiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NfQUREUkVTU0lOR19WRVJTSU9OID0gIldTQWRkcmVzc2luZ1ZlcnNpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0RFRkFVTFRfUFJFRklYID0gIndzYSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TRVJWSUNFX0dST1VQX0NPTlRFWFRfSUQgPQotICAgICAgICAgICAgIlNlcnZpY2VHcm91cENvbnRleHRJZEZyb21BZGRyZXNzaW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRCA9ICJJc0FkZHJlc3NpbmdQcm9jZXNzZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyA9ICJkaXNhYmxlQWRkcmVzc2luZ0ZvckluTWVzc2FnZXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUl9WQUxJREFURV9BQ1RJT04gPSAiYWRkcmVzc2luZy52YWxpZGF0ZUFjdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSX1ZBTElEQVRFX0lOVk9DQVRJT05fUEFUVEVSTiA9ICJhZGRyZXNzaW5nLnZhbGlkYXRlSW52b2NhdGlvblBhdHRlcm4iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfUkVGRVJFTkNFID0gIkVuZHBvaW50UmVmZXJlbmNlIjsKLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gV1NETCBCaW5kaW5nIENvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVTSU5HX0FERFJFU1NJTkcgPSAiVXNpbmdBZGRyZXNzaW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFOT05ZTU9VUyA9ICJBbm9ueW1vdXMiOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBBZGRyZXNzaW5nIFJlcXVpcmVtZW50IExldmVscyA9PT09PT09PT09PT09PT09PT0KLSAgICAvLyBUaGVzZSBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlIHJlcXVpcmVtZW50IGxldmVsIG9uIFdTLUFkZHJlc3NpbmcgaW5kaWNhdGVkCi0gICAgLy8gaW4gYSBzZXJ2aWNlcy54bWwgb3IgYSBXU0RMIGZpbGUuCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUiA9ICJhZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJhbWV0ZXIiOwotICAgIC8vIEFERFJFU1NJTkdfVU5TUEVDSUZJRUQgaXMgdGhlIGVxdWl2YWxlbnQgb2Ygbm8gVXNpbmdBZGRyZXNzaW5nIGZsYWcgaW4gYQotICAgIC8vIFdTREwgZmlsZSBhbmQgdGhlIGRlZmF1bHQgb2YgdGhlIFdTQWRkcmVzc2luZ1JlcXVyZWQgYXR0cmlidXRlIGluIHNlcnZpY2UueG1sCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTSU5HX1VOU1BFQ0lGSUVEID0gInVuc3BlY2lmaWVkIjsKLSAgICAvLyBBRERSRVNTSU5HX09QVElPTkFMIGlzIHRoZSBlcXVpdmFsZW50IG9mIDx3c2F3OlVzaW5nQWRkcmVzc2luZyByZXF1aXJlZD0iZmFsc2UiIC8+Ci0gICAgLy8gaW4gYSBXU0RMIGZpbGUKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFERFJFU1NJTkdfT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotICAgIC8vIEFERFJFU1NJTkdfUkVRVUlSRUQgaXMgdGhlIGVxdWl2YWxlbnQgb2YgPHdzYXc6VXNpbmdBZGRyZXNzaW5nIHJlcXVpcmVkPSJ0cnVlIiAvPgotICAgIC8vIGluIGEgV1NETCBmaWxlCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTSU5HX1JFUVVJUkVEID0gInJlcXVpcmVkIjsKLQotICAgIC8vIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0LCBhZGRyZXNzaW5nIGhlYWRlcnMgd2lsbCBiZSByZXBsYWNlZCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAvLyBtZXNzYWdlIGNvbnRleHQuICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0VfQUREUkVTU0lOR19IRUFERVJTID0gIlJlcGxhY2VBZGRyZXNzaW5nSGVhZGVycyI7Ci0KLSAgICAvLyB0aGlzIHByb3BlcnR5IG9uY2Ugc2V0IHRvIEJvb2xlYW4uVFJVRSB3aWxsIG1ha2UgdGhlIG1lc3NhZ2VzIHRvIHNraXAgQWRkcmVzc2luZyBIYW5kbGVyLgotICAgIC8vIFNvIHlvdSB3aWxsIG5vdCBzZWUgQWRkcmVzc2luZyBIZWFkZXJzIGluIHRoZSBPVVQgcGF0aC4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTID0KLSAgICAgICAgICAgICJkaXNhYmxlQWRkcmVzc2luZ0Zvck91dE1lc3NhZ2VzIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX01VU1RfVU5ERVJTVEFORF9UT19BRERSRVNTSU5HX0hFQURFUlMgPQotICAgICAgICAgICAgImFkZE11c3RVbmRlcnN0YW5kVG9BZGRyZXNzaW5nSGVhZGVycyI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUk9MRV9GT1JfQUREUkVTU0lOR19IRUFERVJTID0gIndzYWRkcmVzc2luZ1JvbGUiOwotICAgIAotICAgIC8qKgotICAgICAqIEEgcHJvcGVydHkgcG9pbnRpbmcgdG8gYW4gQXJyYXlMaXN0IG9mIE9NQXR0cmlidXRlIG9iamVjdHMgcmVwcmVzZW50aW5nIGFueSBhdHRyaWJ1dGVzCi0gICAgICogb2YgdGhlIHdzYTpBY3Rpb24gaGVhZGVyLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0FUVFJJQlVURVMgPSAiYWN0aW9uQXR0cmlidXRlcyI7Ci0gICAgLyoqCi0gICAgICogQSBwcm9wZXJ0eSBwb2ludGluZyB0byBhbiBBcnJheUxpc3Qgb2YgT01BdHRyaWJ1dGUgb2JqZWN0cyByZXByZXNlbnRpbmcgYW55IGF0dHJpYnV0ZXMKLSAgICAgKiBvZiB0aGUgd3NhOk1lc3NhZ2VJRCBoZWFkZXIuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFSURfQVRUUklCVVRFUyA9ICJtZXNzYWdlaWRBdHRyaWJ1dGVzIjsKLQotICAgIC8qKgotICAgICAqIFdoZW4gc2V0IHRvIEJvb2xlYW4uVFJVRSB0aGlzIHdpbGwgY2F1c2UgdGhlIGFkZHJlc3Npbmcgb3V0IGhhbmRsZXIgdG8gb3V0cHV0IGFsbAotICAgICAqIHBvcHVsYXRlZCBhZGRyZXNzaW5nIGhlYWRlcnMgaW4gYSBtZXNzYWdlLCBpbmNsdWRpbmcgYW55IG9wdGlvbmFsIG9uZXMuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX09QVElPTkFMX0hFQURFUlMgPSAiaW5jbHVkZU9wdGlvbmFsSGVhZGVycyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHByb3BlcnR5LCBpZiBzZXQgdG8gQm9vbGVhbi5UUlVFLCB3aWxsIG1lYW4gdGhhdCB0aGUgYWRkcmVzc2luZyBoYW5kbGVyIGFsbG93cyBwYXJ0aWFsbHkKLSAgICAgKiB3cy1hZGRyZXNzZWQgbWVzc2FnZXMgdG8gYmUgc2VudCBldmVuIGlmIHRoZXkgYXJlIHRoZW4gaW52YWxpZCByYXRoZXIgdGhhbiB0aHJvd2luZyBhIGZhdWx0LgotICAgICAqIDxwLz4KLSAgICAgKiBJdCBpcyBub3QgY2xlYXIgaG93IG5lY2Vzc2FyeSB0aGlzIHByb3BlcnR5IGlzIGFuZCBpdCBtYXkgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIG5leHQgcmVsZWFzZSBpZgotICAgICAqIGl0IGlzIG5vdCBzZWVuIHRvIGJlIG5lY2Vzc2FyeSAtIGRhdmlkaWxsc2xleUBhcGFjaGUub3JnCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX09VVEJPVU5EX0FERFJFU1NJTkdfVkFMSURBVElPTiA9Ci0gICAgICAgICAgICAiZGlzYWJsZUFkZHJlc3NpbmdPdXRib3VuZFZhbGlkYXRpb24iOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCB0byBhdHRhY2ggT01FbGVtZW50IFJlZmVyZW5jZVBhcmFtZXRlcnMgZm91bmQgaW4gYW4gRVBSIGVtYmVkZGVkIGluIGEKLSAgICAgKiBXU0RMIHRvIGFuIEF4aXNFbmRwb2ludCBvYmplY3QuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VfUEFSQU1FVEVSX1BBUkFNRVRFUiA9ICJyZWZlcmVuY2VQYXJhbWV0ZXJzIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIGluIGFuIGluYm91bmQgcmVxdWVzdAotICAgICAqIG1lc3NhZ2UgYXJlIHRvIGJlIHByb2Nlc3NlZCBvciBub3QuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFX1JFRl9QQVJBTUVURVJfRVhUUkFDVCA9ICJkaXNhYmxlUmVmUGFyYW1FeHRyYWN0IjsKLSAgICAKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQU1fSU5WT0NBVElPTl9QQVRURVJOX1BBUkFNRVRFUl9OQU1FID0gIndzYW1JbnZvY2F0aW9uUGF0dGVybiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FNX0lOVk9DQVRJT05fUEFUVEVSTl9TWU5DSFJPTk9VUyA9ICJzeW5jaHJvbm91cyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FNX0lOVk9DQVRJT05fUEFUVEVSTl9BU1lOQ0hST05PVVMgPSAiYXN5bmNocm9ub3VzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQU1fSU5WT0NBVElPTl9QQVRURVJOX0JPVEggPSAiYm90aCI7Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gQ29tbW9uIEZhdWx0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVEID0gIkFjdGlvbk5vdFN1cHBvcnRlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRF9SRUFTT04gPQotICAgICAgICAgICAgIlRoZSBbYWN0aW9uXSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGF0IHRoZSByZWNlaXZlci4iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRSA9Ci0gICAgICAgICAgICAiRGVzdGluYXRpb25VbnJlYWNoYWJsZSI7Ci0gICAgCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT0gV1MtQWRkcmVzc2luZ0FuZElkZW50aXR5ID09PT09PT09PT09PT09PT09PT09PT09PQotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU0lOR19JREVOVElUWV9QUkVGSVggPSAid3NpZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTSU5HX0lERU5USVRZX05TID0gCi0gICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA2LzAyL2FkZHJlc3NpbmdpZGVudGl0eSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0lHX1BSRUZJWCA9ICJkcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0lHX05TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFkgPSAiSWRlbnRpdHkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFlfS0VZX0lORk8gPSAiS2V5SW5mbyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9YNTA5X0RBVEEgPSAiWDUwOURhdGEiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFlfWDUwOV9DRVJUID0gIlg1MDlDZXJ0aWZpY2F0ZSI7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9QQVJBTUVURVIgPSAiV1NBZGRyZXNzaW5nQW5kSWRlbnRpdHkiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9JREVOVElUWSA9IG5ldyBRTmFtZShBRERSRVNTSU5HX0lERU5USVRZX05TLElERU5USVRZLEFERFJFU1NJTkdfSURFTlRJVFlfUFJFRklYKTsKLSAgICBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfSURFTlRJVFlfS0VZX0lORk8gPSBuZXcgUU5hbWUoWE1MX1NJR19OUyxJREVOVElUWV9LRVlfSU5GTyxYTUxfU0lHX1BSRUZJWCk7Ci0gICAgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0lERU5USVRZX1g1MDlfREFUQSA9IG5ldyBRTmFtZShYTUxfU0lHX05TLElERU5USVRZX1g1MDlfREFUQSxYTUxfU0lHX1BSRUZJWCk7Ci0gICAgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0lERU5USVRZX1g1MDlfQ0VSVCA9IG5ldyBRTmFtZShYTUxfU0lHX05TLElERU5USVRZX1g1MDlfQ0VSVCxYTUxfU0lHX1BSRUZJWCk7Ci0gICAgCi0gICAgaW50ZXJmYWNlIEZpbmFsIHsKLQotICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFkZHJlc3NpbmcgMS4wIEZpbmFsIFZlcnNpb24gQ29uc3RhbnRzID09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX05BTUVTUEFDRSA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBV19OQU1FU1BBQ0UgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FNX05BTUVTUEFDRSA9IAotICAgICAgICAJImh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDUvYWRkcmVzc2luZy9tZXRhZGF0YSI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNXU0FfREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRX0gaW5zdGVhZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1JFTEFURVNfVE9fUkVMQVRJT05TSElQX1RZUEVfREVGQVVMVF9WQUxVRSA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9yZXBseSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0lTX1JFRkVSRU5DRV9QQVJBTUVURVJfQVRUUklCVVRFID0gIklzUmVmZXJlbmNlUGFyYW1ldGVyIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfQU5PTllNT1VTX1VSTCA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXMiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9OT05FX1VSSSA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9ub25lIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfRkFVTFRfQUNUSU9OID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL2ZhdWx0IjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfU09BUF9GQVVMVF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3Npbmcvc29hcC9mYXVsdCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1RZUEVfQVRUUklCVVRFX1ZBTFVFID0gInRydWUiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9TRVJWSUNFX05BTUVfRU5EUE9JTlRfTkFNRSA9ICJFbmRwb2ludE5hbWUiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9QT0xJQ0lFUyA9ICJQb2xpY2llcyI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX01FVEFEQVRBID0gIk1ldGFkYXRhIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0FfREVGQVVMVF9NRVRBREFUQV9QUkVGSVggPSAid3NhbSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX09SSUdJTkFMX01FVEFEQVRBX1BSRUZJWCA9ICJ3c2F3IjsKLQotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9JTlRFUkZBQ0VfTkFNRSA9ICJJbnRlcmZhY2VOYW1lIjsKLQotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nL3JlcGx5IjsKLQotICAgICAgICAvLyBmYXVsdCBpbmZvcm1hdGlvbgotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSA9ICJQcm9ibGVtSGVhZGVyUU5hbWUiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0hFQURFUl9QUk9CX0hFQURFUiA9ICJQcm9ibGVtSGVhZGVyIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9IRUFERVJfUFJPQl9JUkkgPSAiUHJvYmxlbUlSSSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSEVBREVSX0RFVEFJTCA9ICJGYXVsdERldGFpbCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfSU5WQUxJRF9IRUFERVIgPSAiSW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiA9Ci0gICAgICAgICAgICAgICAgIkEgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVEID0KLSAgICAgICAgICAgICAgICAiTWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRURfUkVBU09OID0KLSAgICAgICAgICAgICAgICAiQSByZXF1aXJlZCBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCBwcmVzZW50IjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFX1JFQVNPTiA9Ci0gICAgICAgICAgICAgICAgIk5vIHJvdXRlIGNhbiBiZSBkZXRlcm1pbmVkIHRvIHJlYWNoIFtkZXN0aW5hdGlvbl0iOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0lOVkFMSURfQ0FSRElOQUxJVFkgPSAiSW52YWxpZENhcmRpbmFsaXR5IjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9PTkxZX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCA9Ci0gICAgICAgICAgICAgICAgIk9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkIjsKLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9PTkxZX05PTl9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQgPQotICAgICAgICAgICAgICAgICJPbmx5Tm9uQW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfUFJPQkxFTV9BQ1RJT05fTkFNRSA9ICJQcm9ibGVtQWN0aW9uIjsKLQotICAgICAgICBzdGF0aWMgZmluYWwgUU5hbWUgV1NBV19VU0lOR19BRERSRVNTSU5HID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoV1NBV19OQU1FU1BBQ0UsIFVTSU5HX0FERFJFU1NJTkcpOwotICAgICAgICBzdGF0aWMgZmluYWwgUU5hbWUgV1NBV19BTk9OWU1PVVMgPSBuZXcgUU5hbWUoV1NBV19OQU1FU1BBQ0UsIFVTSU5HX0FERFJFU1NJTkcpOwotICAgICAgICBzdGF0aWMgZmluYWwgUU5hbWUgV1NBX0VORFBPSU5UX1JFRkVSRU5DRSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBFTkRQT0lOVF9SRUZFUkVOQ0UsIFdTQV9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0FfQUREUkVTUyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBFUFJfQUREUkVTUyxXU0FfREVGQVVMVF9QUkVGSVgpOwotCi0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9UTyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfVE8pOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfRlJPTSA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfRlJPTSk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9SRVBMWV9UTyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfUkVQTFlfVE8pOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfUkVMQVRFU19UTyA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfUkVMQVRFU19UTyk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1dTQV9NRVNTQUdFX0lEID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIFdTQV9NRVNTQUdFX0lEKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfV1NBX0hFQURFUl9ERVRBSUwgPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgRkFVTFRfSEVBREVSX0RFVEFJTCk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX1BST0JMRU1fSEVBREVSID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIEZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSk7Ci0gICAgICAgIGZpbmFsIFFOYW1lIFFOQU1FX0lOVkFMSURfSEVBREVSID0gbmV3IFFOYW1lKFdTQV9OQU1FU1BBQ0UsIEZBVUxUX0lOVkFMSURfSEVBREVSKTsKLSAgICB9Ci0KLQotICAgIGludGVyZmFjZSBTdWJtaXNzaW9uIHsKLQotICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFkZHJlc3NpbmcgU3VibWlzc2lvbiBWZXJzaW9uIENvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX05BTUVTUEFDRSA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNXU0FfREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRX0gaW5zdGVhZC4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX1JFTEFURVNfVE9fUkVMQVRJT05TSElQX1RZUEVfREVGQVVMVF9WQUxVRSA9ICJ3c2E6UmVwbHkiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFID0gIndzYTpSZXBseSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0FOT05ZTU9VU19VUkwgPQotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXMiOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBSX1JFRkVSRU5DRV9QUk9QRVJUSUVTID0gIlJlZmVyZW5jZVByb3BlcnRpZXMiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9GQVVMVF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcvZmF1bHQiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTQV9TRVJWSUNFX05BTUVfRU5EUE9JTlRfTkFNRSA9ICJQb3J0TmFtZSI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NBX0lOVEVSRkFDRV9OQU1FID0gIlBvcnRUeXBlIjsKLQotICAgICAgICAvLyBmYXVsdCBpbmZvcm1hdGlvbgotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0lOVkFMSURfSEVBREVSID0gIkludmFsaWRNZXNzYWdlSW5mb3JtYXRpb25IZWFkZXIiOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiA9Ci0gICAgICAgICAgICAgICAgIkEgbWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXIgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkLiBUaGUgdmFsaWRpdHkgZmFpbHVyZSBjYW4gYmUgZWl0aGVyIHN0cnVjdHVyYWwgb3Igc2VtYW50aWMsIGUuZy4gYSBbZGVzdGluYXRpb25dIHRoYXQgaXMgbm90IGEgVVJJIG9yIGEgW3JlbGF0aW9uc2hpcF0gdG8gYSBbbWVzc2FnZSBpZF0gdGhhdCB3YXMgbmV2ZXIgaXNzdWVkLiI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRUQgPQotICAgICAgICAgICAgICAgICJNZXNzYWdlSW5mb3JtYXRpb25IZWFkZXJSZXF1aXJlZCI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRURfUkVBU09OID0KLSAgICAgICAgICAgICAgICAiQSByZXF1aXJlZCBtZXNzYWdlIGluZm9ybWF0aW9uIGhlYWRlciwgVG8sIE1lc3NhZ2VJRCwgb3IgQWN0aW9uLCBpcyBub3QgcHJlc2VudC4iOwotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUkVBU09OID0KLSAgICAgICAgICAgICAgICAiTm8gcm91dGUgY2FuIGJlIGRldGVybWluZWQgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIHJvbGUgZGVmaW5lZCBieSB0aGUgV1MtQWRkcmVzc2luZyBUby4iOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0FXX1VTSU5HX0FERFJFU1NJTkcgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBVU0lOR19BRERSRVNTSU5HKTsKLQotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfVE8gPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgV1NBX1RPKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfV1NBX0ZST00gPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgV1NBX0ZST00pOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfUkVQTFlfVE8gPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgV1NBX1JFUExZX1RPKTsKLSAgICAgICAgZmluYWwgUU5hbWUgUU5BTUVfV1NBX1JFTEFURVNfVE8gPSBuZXcgUU5hbWUoV1NBX05BTUVTUEFDRSwgV1NBX1JFTEFURVNfVE8pOwotICAgICAgICBmaW5hbCBRTmFtZSBRTkFNRV9XU0FfTUVTU0FHRV9JRCA9IG5ldyBRTmFtZShXU0FfTkFNRVNQQUNFLCBXU0FfTUVTU0FHRV9JRCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTViYjI5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGYXVsdHNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0U3ViQ29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuaTE4bi5BZGRyZXNzaW5nTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZCBhbiB1bmRlcnN0YW5uZGFibGUgZmF1bHQgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gZmF1bHRDb2RlIGFuZCB3c2E6RmF1bHREZXRhaWwgaW5mby4KLSAgICAgKiBTaG91bGQgcmVhbGx5IHVzZSBhIG1lc3NhZ2UgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0Q29kZUxvY2FsTmFtZQotICAgICAqIEBwYXJhbSBmYXVsdERldGFpbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRm9yQXhpc0ZhdWx0KFN0cmluZyBmYXVsdENvZGVMb2NhbE5hbWUsIFN0cmluZyBmYXVsdERldGFpbCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUi5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzcGVjaWZpY0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyIiwgZmF1bHREZXRhaWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUi5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzcGVjaWZpY0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyIiwgZmF1bHREZXRhaWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZEFkZHJlc3NpbmdIZWFkZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgiSW52YWxpZENhcmRpbmFsaXR5Ii5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgic3BlY2lmaWNJbnZhbGlkQ2FyZGluYWxpdHkiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkQ2FyZGluYWxpdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgiTWlzc2luZ0FkZHJlc3NJbkVQUiIuZXF1YWxzKGZhdWx0Q29kZUxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChmYXVsdERldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoInNwZWNpZmljTWlzc2luZ0FkZHJlc3NJbkVQUiIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoIm1pc3NpbmdBZGRyZXNzSW5FUFIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgiRHVwbGljYXRlTWVzc2FnZUlEIi5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoImR1cGxpY2F0ZU1lc3NhZ2VJRCIpOwotICAgICAgICB9IGVsc2UgaWYgKCJBY3Rpb25NaXNtYXRjaCIuZXF1YWxzKGZhdWx0Q29kZUxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJhY3Rpb25NaXNtYXRjaCIpOwotICAgICAgICB9IGVsc2UgaWYgKEZpbmFsLkZBVUxUX09OTFlfQU5PTllNT1VTX0FERFJFU1NfU1VQUE9SVEVELmVxdWFscyhmYXVsdENvZGVMb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHREZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNwZWNpZmljT25seUFub255bW91c1N1cHBvcnRlZCIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoIm9ubHlBbm9ueW1vdXNTdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChGaW5hbC5GQVVMVF9PTkxZX05PTl9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQuZXF1YWxzKGZhdWx0Q29kZUxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChmYXVsdERldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoInNwZWNpZmljT25seU5vbkFub25TdXBwb3J0ZWQiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJvbmx5Tm9uQW5vblN1cHBvcnRlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKFN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRUQuZXF1YWxzKGZhdWx0Q29kZUxvY2FsTmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChmYXVsdERldGFpbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgic3BlY2lmaWNBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJhZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChGaW5hbC5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRC5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzcGVjaWZpY0FkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCIsIGZhdWx0RGV0YWlsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoImFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRS5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzcGVjaWZpY0Rlc3RpbmF0aW9uVW5yZWFjaGFibGUiLCBmYXVsdERldGFpbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKCJkZXN0aW5hdGlvblVucmVhY2hhYmxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRC5lcXVhbHMoZmF1bHRDb2RlTG9jYWxOYW1lKSkgewotICAgICAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgic3BlY2lmaWNBY3Rpb25Ob3RSZWNvZ25pc2VkIiwgZmF1bHREZXRhaWwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYWN0aW9uTm90UmVjb2duaXNlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyAgICB3c2E6SW52YWxpZEFkZHJlc3NpbmdIZWFkZXIgW1JlYXNvbl0gdGhlIHN0cmluZzogIkEgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQiCi0gICAgLy8gICAgICB3c2E6SW52YWxpZEFkZHJlc3MKLSAgICAvLyAgICAgIHdzYTpJbnZhbGlkRVBSCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJJbnZhbGlkRVBSRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICBTdHJpbmcgaW5jb3JyZWN0SGVhZGVyTmFtZSkKLSAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLndhcm4oInRyaWdnZXJJbnZhbGlkRVBSRmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsgbWVzc2FnZUNvbnRleHQgKwotICAgICAgICAgICAgICAgICIgaW5jb3JyZWN0SGVhZGVyTmFtZTogIiArIGluY29ycmVjdEhlYWRlck5hbWUpOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgIChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0SGVhZGVyTmFtZSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICJzcGVjLnN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZEVQUiIsCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAic3BlYy5maW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAgICAgIHdzYTpJbnZhbGlkQ2FyZGluYWxpdHkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluY29ycmVjdEhlYWRlck5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cud2FybigidHJpZ2dlckludmFsaWRDYXJkaW5hbGl0eUZhdWx0OiBtZXNzYWdlQ29udGV4dDogIiArIG1lc3NhZ2VDb250ZXh0ICsKLSAgICAgICAgICAgICAgICAgIiBpbmNvcnJlY3RIZWFkZXJOYW1lOiAiICsgaW5jb3JyZWN0SGVhZGVyTmFtZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAic3BlYy5zdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkQ2FyZGluYWxpdHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuZmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gICAgICB3c2E6TWlzc2luZ0FkZHJlc3NJbkVQUgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyTWlzc2luZ0FkZHJlc3NJbkVQUkZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmNvcnJlY3RIZWFkZXJOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy53YXJuKCJ0cmlnZ2VyTWlzc2luZ0FkZHJlc3NJbkVQUkZhdWx0OiBtZXNzYWdlQ29udGV4dDogIiArIG1lc3NhZ2VDb250ZXh0ICsKLSAgICAgICAgICAgICAgICAgICAgIiBpbmNvcnJlY3RIZWFkZXJOYW1lOiAiICsgaW5jb3JyZWN0SGVhZGVyTmFtZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAic3BlYy5zdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdEhlYWRlck5hbWUsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nQWRkcmVzc0luRVBSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICAgICAgd3NhOkR1cGxpY2F0ZU1lc3NhZ2VJRAotICAgIC8vICAgICAgd3NhOkFjdGlvbk1pc21hdGNoCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBTdHJpbmcgc29hcEFjdGlvbiwgU3RyaW5nIHdzYUFjdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy53YXJuKCJ0cmlnZ2VyQWN0aW9uTWlzbWF0Y2hGYXVsdDogbWVzc2FnZUNvbnRleHQ6ICIgKyBtZXNzYWdlQ29udGV4dCsiIHNvYXBBY3Rpb249Iitzb2FwQWN0aW9uKyIgd3NhQWN0aW9uPSIrd3NhQWN0aW9uKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOkFjdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLnN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6QWN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIsICJBY3Rpb25NaXNtYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICAgICAgd3NhOk9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5jb3JyZWN0SGVhZGVyTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidHJpZ2dlck9ubHlBbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQgKyAiIGluY29ycmVjdEhlYWRlck5hbWU6ICIgKyBpbmNvcnJlY3RIZWFkZXJOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0SGVhZGVyTmFtZSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgInNwZWMuc3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9PTkxZX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vICAgICAgd3NhOk9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRyaWdnZXJPbmx5Tm9uQW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5jb3JyZWN0SGVhZGVyTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidHJpZ2dlck9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQgKyAiIGluY29ycmVjdEhlYWRlck5hbWU6ICIgKyBpbmNvcnJlY3RIZWFkZXJOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgaWYgKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb3JyZWN0SGVhZGVyTmFtZSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgInNwZWMuc3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvcnJlY3RIZWFkZXJOYW1lLCBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9PTkxZX05PTl9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlYy5maW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAgICB3c2E6TWVzc2FnZUFkZHJlc3NpbmdIZWFkZXJSZXF1aXJlZCBbUmVhc29uXSB0aGUgc3RyaW5nOiAiQSByZXF1aXJlZCBoZWFkZXIgcmVwcmVzZW50aW5nIGEgTWVzc2FnZSBBZGRyZXNzaW5nIFByb3BlcnR5IGlzIG5vdCBwcmVzZW50IgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyTWVzc2FnZUFkZHJlc3NpbmdSZXF1aXJlZEZhdWx0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtaXNzaW5nSGVhZGVyTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdDogbWVzc2FnZUNvbnRleHQ6ICIgKyBtZXNzYWdlQ29udGV4dCArCi0gICAgICAgICAgICAgICAgICAgICIgbWlzc2luZ0hlYWRlck5hbWU6ICIgKyBtaXNzaW5nSGVhZGVyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKyBtaXNzaW5nSGVhZGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ01lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuc3VibWlzc2lvbi5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT04iKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmlnZ2VyQWRkcmVzc2luZ0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsgbWlzc2luZ0hlYWRlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVELCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlYy5maW5hbC5GQVVMVF9BRERSRVNTSU5HX0hFQURFUl9SRVFVSVJFRF9SRUFTT04iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAgICB3c2E6RGVzdGluYXRpb25VbnJlYWNoYWJsZSBbUmVhc29uXSB0aGUgc3RyaW5nOiAiTm8gcm91dGUgY2FuIGJlIGRldGVybWluZWQgdG8gcmVhY2ggW2Rlc3RpbmF0aW9uXSIKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdHJpZ2dlckRlc3RpbmF0aW9uVW5yZWFjaGFibGVGYXVsdChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzcykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ0cmlnZ2VyRGVzdGluYXRpb25VbnJlYWNoYWJsZUZhdWx0OiBtZXNzYWdlQ29udGV4dDogIiArIG1lc3NhZ2VDb250ZXh0ICsKLSAgICAgICAgICAgICAgICAgICAgIiBhZGRyZXNzOiAiICsgYWRkcmVzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZyltZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIGlmIChTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQobWVzc2FnZUNvbnRleHQsIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0lSSSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BlYy5zdWJtaXNzaW9uLkZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUkVBU09OIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSVJJLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVjLmZpbmFsLkZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUkVBU09OIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gICAgd3NhOkFjdGlvbk5vdFN1cHBvcnRlZCBbUmVhc29uXSB0aGUgc3RyaW5nOiAiVGhlIFthY3Rpb25dIGNhbm5vdCBiZSBwcm9jZXNzZWQgYXQgdGhlIHJlY2VpdmVyIgotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cmlnZ2VyQWN0aW9uTm90U3VwcG9ydGVkRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvYmxlbUFjdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy53YXJuKCJ0cmlnZ2VyQWN0aW9uTm90U3VwcG9ydGVkRmF1bHQ6IG1lc3NhZ2VDb250ZXh0OiAiICsgbWVzc2FnZUNvbnRleHQgKwotICAgICAgICAgICAgICAgICAiIHByb2JsZW1BY3Rpb246ICIgKyBwcm9ibGVtQWN0aW9uKTsKLSAgICAgICAgdHJpZ2dlckFkZHJlc3NpbmdGYXVsdChtZXNzYWdlQ29udGV4dCwgRmluYWwuRkFVTFRfUFJPQkxFTV9BQ1RJT05fTkFNRSwgcHJvYmxlbUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVELCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWMuRkFVTFRfQUNUSU9OX05PVF9TVVBQT1JURURfUkVBU09OIikpOwotICAgIH0KLQotICAgIC8vICAgIHdzYTpFbmRwb2ludFVuYXZhaWxhYmxlIFtSZWFzb25dIHRoZSBzdHJpbmcgIlRoZSBlbmRwb2ludCBpcyB1bmFibGUgdG8gcHJvY2VzcyB0aGUgbWVzc2FnZSBhdCB0aGlzIHRpbWUiCi0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyaWdnZXJBZGRyZXNzaW5nRmF1bHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdEluZm9ybWF0aW9uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZmF1bHRJbmZvcm1hdGlvblZhbHVlLCBTdHJpbmcgZmF1bHRjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHRTdWJjb2RlLCBTdHJpbmcgZmF1bHRSZWFzb24pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWFwIGZhdWx0SW5mb3JtYXRpb24gPQotICAgICAgICAgICAgICAgIChNYXApbWVzc2FnZUNvbnRleHQuZ2V0TG9jYWxQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpOwotICAgICAgICBpZiAoZmF1bHRJbmZvcm1hdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEluZm9ybWF0aW9uID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUywgZmF1bHRJbmZvcm1hdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdEluZm9ybWF0aW9uLnB1dChmYXVsdEluZm9ybWF0aW9uS2V5LCBmYXVsdEluZm9ybWF0aW9uVmFsdWUpOwotCi0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBmYXVsdGNvZGUgPSAoZmF1bHRTdWJjb2RlICE9IG51bGwpID8gZmF1bHRTdWJjb2RlIDogZmF1bHRjb2RlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0RmF1bHRDb2RlKG1lc3NhZ2VDb250ZXh0LCBmYXVsdGNvZGUsIGZhdWx0U3ViY29kZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jID0gbWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBpZiAob2MgIT0gbnVsbCkgewotICAgICAgICAgICAgb2Muc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uU0VORF9TVEFDS1RSQUNFX0RFVEFJTFNfV0lUSF9GQVVMVFMsICJmYWxzZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGZhdWx0UmVhc29uLCBuZXcgUU5hbWUobmFtZXNwYWNlLCBmYXVsdGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmF1bHRDb2RlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBTdHJpbmcgZmF1bHRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdFN1YkNvZGUpIHsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgU09BUEZhdWx0Q29kZSBzb2FwRmF1bHRDb2RlID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRDb2RlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlLnNldFRleHQoZmF1bHRDb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFZhbHVlID0gc29hcEZhYy5jcmVhdGVTT0FQRmF1bHRWYWx1ZShzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdFZhbHVlLnNldFRleHQoU09BUDEyQ29uc3RhbnRzLlNPQVBfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VOREVSKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc29hcEZhdWx0U3ViQ29kZSA9IHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0U3ViQ29kZShzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFN1YmNvZGVWYWx1ZSA9IHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0VmFsdWUoc29hcEZhdWx0U3ViQ29kZSk7Ci0KLSAgICAgICAgICAgIGlmIChmYXVsdENvZGUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IEZpbmFsLldTQV9OQU1FU1BBQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzYU5TID0gc29hcEZhYy5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0U3ViY29kZVZhbHVlLmRlY2xhcmVOYW1lc3BhY2Uod3NhTlMpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdFN1YmNvZGVWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRleHQoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKyBmYXVsdENvZGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmF1bHRTdWJDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRTdWJDb2RlIHNvYXBGYXVsdFN1YkNvZGUyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0U3ViQ29kZShzb2FwRmF1bHRTdWJDb2RlKTsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzb2FwRmF1bHRTdWJjb2RlVmFsdWUyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWMuY3JlYXRlU09BUEZhdWx0VmFsdWUoc29hcEZhdWx0U3ViQ29kZTIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBGaW5hbC5XU0FfTkFNRVNQQUNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2FOUyA9IHNvYXBGYWMuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVgpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdFN1YmNvZGVWYWx1ZTIuZGVjbGFyZU5hbWVzcGFjZSh3c2FOUyk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0U3ViY29kZVZhbHVlMgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRleHQoQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVggKyAiOiIgKyBmYXVsdFN1YkNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0NPREVfTE9DQUxfTkFNRSwgc29hcEZhdWx0Q29kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0RGV0YWlsRWxlbWVudEZvckFkZHJlc3NpbmdGYXVsdChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QpIHsKLSAgICAgICAgTWFwIGZhdWx0SW5mbyA9IChNYXApbWVzc2FnZUNvbnRleHQuZ2V0TG9jYWxQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpOwotICAgICAgICBPTUVsZW1lbnQgcHJvYmxlbURldGFpbCA9IG51bGw7Ci0gICAgICAgIGlmIChmYXVsdEluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGZhdWx0eUhlYWRlclFOYW1lID0gKFN0cmluZylmYXVsdEluZm8uZ2V0KEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmF1bHR5QWN0aW9uID0gKFN0cmluZylmYXVsdEluZm8uZ2V0KEZpbmFsLkZBVUxUX1BST0JMRU1fQUNUSU9OX05BTUUpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0eUFkZHJlc3MgPSAoU3RyaW5nKWZhdWx0SW5mby5nZXQoRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSVJJKTsKLSAgICAgICAgICAgIGlmIChmYXVsdHlBZGRyZXNzICE9IG51bGwgJiYgISIiLmVxdWFscyhmYXVsdHlBZGRyZXNzKSkgewotICAgICAgICAgICAgICAgIHByb2JsZW1EZXRhaWwgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0lSSSwgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcHJvYmxlbURldGFpbC5zZXRUZXh0KGZhdWx0eUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZhdWx0eUFjdGlvbiAhPSBudWxsICYmICEiIi5lcXVhbHMoZmF1bHR5QWN0aW9uKSkgewotICAgICAgICAgICAgICAgIHByb2JsZW1EZXRhaWwgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX1BST0JMRU1fQUNUSU9OX05BTUUsIGFkZHJlc3NpbmdOYW1lc3BhY2VPYmplY3QpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBwcm9iSDIgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0FDVElPTiwgYWRkcmVzc2luZ05hbWVzcGFjZU9iamVjdCwgcHJvYmxlbURldGFpbCk7Ci0gICAgICAgICAgICAgICAgcHJvYkgyLnNldFRleHQoZmF1bHR5QWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmYXVsdHlIZWFkZXJRTmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMoZmF1bHR5SGVhZGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcHJvYmxlbURldGFpbCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FLCBhZGRyZXNzaW5nTmFtZXNwYWNlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBwcm9ibGVtRGV0YWlsLnNldFRleHQoZmF1bHR5SGVhZGVyUU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9ibGVtRGV0YWlsOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nSGVscGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTJkY2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdIZWxwZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NpbmdIZWxwZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBSZXBseVRvIGFkZHJlc3MgbWF0Y2hlcyBvbmUgb2YgdGhlIHN1cHBvcnRlZAotICAgICAqIGFub255bW91cyB1cmxzLiBJZiB0aGUgUmVwbHlUbyBpcyBub3Qgc2V0LCBhbm9ueW1vdXMgaXMgYXNzdW1lZCwgcGVyIHRoZSBGaW5hbAotICAgICAqIHNwZWMuIFRoZSBBZGRyZXNzaW5nSW5IYW5kbGVyIHNob3VsZCBoYXZlIHNldCB0aGUgUmVwbHlUbyB0byBub24tbnVsbCBpbiB0aGUKLSAgICAgKiAyMDA0LzA4IGNhc2UgdG8gZW5zdXJlIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzLiAocGVyIEFYSVMyLTg4NSkKLSAgICAgKiAKLSAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIFdTLUFkZHJlc3NpbmcgTWV0YWRhdGEgc3BlYyB0aGUgbm9uZSBVUkkgbXVzdCBub3QgYmUgcmVqZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jUmVwbHlBbGxvd2VkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8gPSBtZXNzYWdlQ29udGV4dC5nZXRSZXBseVRvKCk7Ci0gICAgICAgIGlmIChyZXBseVRvID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpc1N5bmNSZXBseUFsbG93ZWQ6IFJlcGx5VG8gaXMgbnVsbC4gUmV0dXJuaW5nIHRydWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlcGx5VG8uaGFzQW5vbnltb3VzQWRkcmVzcygpIHx8IHJlcGx5VG8uaGFzTm9uZUFkZHJlc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgRmF1bHRUbyBhZGRyZXNzIG1hdGNoZXMgb25lIG9mIHRoZSBzdXBwb3J0ZWQKLSAgICAgKiBhbm9ueW1vdXMgdXJscy4gSWYgdGhlIEZhdWx0VG8gaXMgbm90IHNldCwgdGhlIFJlcGx5VG8gaXMgY2hlY2tlZCBwZXIgdGhlCi0gICAgICogc3BlYy4KLSAgICAgKiAKLSAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIFdTLUFkZHJlc3NpbmcgTWV0YWRhdGEgc3BlYyB0aGUgbm9uZSBVUkkgbXVzdCBub3QgYmUgcmVqZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKiBAc2VlICNpc1N5bmNSZXBseUFsbG93ZWQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNGYXVsdEFsbG93ZWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRUbyA9IG1lc3NhZ2VDb250ZXh0LmdldEZhdWx0VG8oKTsKLSAgICAgICAgaWYgKGZhdWx0VG8gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGlzU3luY0ZhdWx0QWxsb3dlZDogRmF1bHRUbyBpcyBudWxsLiBSZXR1cm5pbmcgaXNTeW5jUmVwbHlBbGxvd2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNTeW5jUmVwbHlBbGxvd2VkKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYXVsdFRvLmhhc0Fub255bW91c0FkZHJlc3MoKSB8fCBmYXVsdFRvLmhhc05vbmVBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFJlcGx5VG8gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCBvbmUgb2YgdGhlIHN1cHBvcnRlZAotICAgICAqIGFub255bW91cyB1cmxzLiBJZiB0aGUgUmVwbHlUbyBpcyBub3Qgc2V0LCBhbm9ueW1vdXMgaXMgYXNzdW1lZCwgcGVyIHRoZSBGaW5hbAotICAgICAqIHNwZWMuIFRoZSBBZGRyZXNzaW5nSW5IYW5kbGVyIHNob3VsZCBoYXZlIHNldCB0aGUgUmVwbHlUbyB0byBub24tbnVsbCBpbiB0aGUKLSAgICAgKiAyMDA0LzA4IGNhc2UgdG8gZW5zdXJlIHRoZSBkaWZmZXJlbnQgc2VtYW50aWNzLiAocGVyIEFYSVMyLTg4NSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcGx5UmVkaXJlY3RlZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbWVzc2FnZUNvbnRleHQuZ2V0UmVwbHlUbygpOwotICAgICAgICBpZiAocmVwbHlUbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgaXNSZXBseVJlZGlyZWN0ZWQ6IFJlcGx5VG8gaXMgbnVsbC4gUmV0dXJuaW5nIGZhbHNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIXJlcGx5VG8uaGFzQW5vbnltb3VzQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBGYXVsdFRvIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggb25lIG9mIHRoZSBzdXBwb3J0ZWQKLSAgICAgKiBhbm9ueW1vdXMgdXJscy4gSWYgdGhlIEZhdWx0VG8gaXMgbm90IHNldCwgdGhlIFJlcGx5VG8gaXMgY2hlY2tlZCBwZXIgdGhlCi0gICAgICogc3BlYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEBzZWUgI2lzUmVwbHlSZWRpcmVjdGVkKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYXVsdFJlZGlyZWN0ZWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRUbyA9IG1lc3NhZ2VDb250ZXh0LmdldEZhdWx0VG8oKTsKLSAgICAgICAgaWYgKGZhdWx0VG8gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGlzRmF1bHRSZWRpcmVjdGVkOiBGYXVsdFRvIGlzIG51bGwuIFJldHVybmluZyBpc1JlcGx5UmVkaXJlY3RlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGlzUmVwbHlSZWRpcmVjdGVkKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAhZmF1bHRUby5oYXNBbm9ueW1vdXNBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgaW5ib3VuZCBGYXVsdFRvIGhlYWRlciB3YXMgaW52YWxpZCBhbmQgY2F1c2VkIGEgZmF1bHQsIHRoZSBmYXVsdCBzaG91bGQgbm90IGJlCi0gICAgICogc2VudCB0byBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmF1bHQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIEZhdWx0VG8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkU2VuZEZhdWx0VG9GYXVsdFRvKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIC8vIHRoZXJlIGFyZSBzb21lIGluZm9ybWF0aW9uICB0aGF0IHRoZSBmYXVsdCB0aHJvd2VyIHdhbnRzIHRvIHBhc3MgdG8gdGhlIGZhdWx0IHBhdGguCi0gICAgICAgIC8vIE1lYW5zIHRoYXQgdGhlIGZhdWx0IGlzIGEgd3MtYWRkcmVzc2luZyBvbmUgaGVuY2UgdXNlIHRoZSB3cy1hZGRyZXNzaW5nIGZhdWx0IGFjdGlvbi4KLSAgICAgICAgT2JqZWN0IGZhdWx0SW5mb0ZvckhlYWRlcnMgPQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldExvY2FsUHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKTsKLSAgICAgICAgLy8gaWYgdGhlIGV4Y2VwdGlvbiBpcyBkdWUgdG8gYSBwcm9ibGVtIGluIHRoZSBmYXVsdFRvIGhlYWRlciBpdHNlbGYsIHdlIGNhbiBub3QgdXNlIHRob3NlCi0gICAgICAgIC8vIGZhdWx0IGluZm9ybWF0aW8gdG8gc2VuZCB0aGUgZXJyb3IuIFRyeSB0byBzZW5kIHVzaW5nIHJlcGx5VG8sIGxlYXZlIGl0IHRvIHRyYW5zcG9ydAotICAgICAgICBib29sZWFuIGRvTm90U2VuZEZhdWx0VXNpbmdGYXVsdFRvID0gZmFsc2U7Ci0gICAgICAgIGlmIChmYXVsdEluZm9Gb3JIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHByb2JhYmx5IHN0b3JlIGEgUU5hbWUgaW5zdGVhZCBvZiBhIFN0cmluZy4uIGN1cnJlbnRseSB3ZSByZWx5IG9uIHByZWZpeCBzdHJpbmcgbWF0Y2hpbmchIQotICAgICAgICAgICAgU3RyaW5nIHByb2JsZW1IZWFkZXJOYW1lID0gKFN0cmluZykgKChNYXApIGZhdWx0SW5mb0ZvckhlYWRlcnMpCi0gICAgICAgICAgICAgICAgICAgIC5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpOwotICAgICAgICAgICAgZG9Ob3RTZW5kRmF1bHRVc2luZ0ZhdWx0VG8gPSAocHJvYmxlbUhlYWRlck5hbWUgIT0gbnVsbCAmJiAoQWRkcmVzc2luZ0NvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAuV1NBX0RFRkFVTFRfUFJFRklYICsgIjoiICsgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfRkFVTFRfVE8pCi0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocHJvYmxlbUhlYWRlck5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIWRvTm90U2VuZEZhdWx0VXNpbmdGYXVsdFRvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pewotICAgIAlTdHJpbmcgdmFsdWUgPSAiIjsKLSAgICAgICAgaWYgKGF4aXNEZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKAotICAgICAgICAgICAgCQlheGlzRGVzY3JpcHRpb24uZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpKTsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9bnVsbCl7Ci0gICAgICAgICAgICAJdmFsdWUgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWU6IHZhbHVlOiAnIiArIHZhbHVlICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8ICIiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHZhbHVlID0gQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1VOU1BFQ0lGSUVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudGluZyB0aGUgQW5vbnltb3VzIGZsYWcgZnJvbSB0aGUgQXhpc09wZXJhdGlvbgotICAgICAqIGFuZCByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZS4gUmV0dXJuIHRoZSBkZWZhdWx0IG9mICJvcHRpb25hbCIgaWYgbm90IHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZShBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gIiI7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fUEFSQU1FVEVSX05BTUUpKTsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9bnVsbCl7Ci0gICAgICAgICAgICAJdmFsdWUgPSB2YWx1ZS50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZTogdmFsdWU6ICciICsgdmFsdWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgdmFsdWUgPSBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQU1fSU5WT0NBVElPTl9QQVRURVJOX0JPVEg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgdW5sb2NrZWQgUGFyYW1ldGVyIHJlcHJlc2VudGluZyBBbm9ueW1vdXMgb3IgYWRkIGEgbmV3IG9uZSBpZiBvbmUKLSAgICAgKiBkb2VzIG5vdCBleGlzdC4gSWYgYSBsb2NrZWQgUGFyYW1ldGVyIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgdGhlIG1ldGhvZCB3aWxsIHRyYWNlIGFuZAotICAgICAqIHJldHVybi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEludm9jYXRpb25QYXR0ZXJuUGFyYW1ldGVyVmFsdWUoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlOiB2YWx1ZSBwYXNzZWQgaW4gaXMgbnVsbC4gcmV0dXJuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPQotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fUEFSQU1FVEVSX05BTUUpOwotICAgICAgICAvLyBJZiBhbiBleGlzdGluZyBwYXJhbWV0ZXIgZXhpc3RzCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZTogUGFyYW1ldGVyIGFscmVhZHkgZXhpc3RzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBhbmQgaXMgbm90IGxvY2tlZAotICAgICAgICAgICAgaWYgKCFwYXJhbS5pc0xvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXRJbnZvY2F0aW9uUGF0dGVyblBhcmFtZXRlclZhbHVlOiBQYXJhbWV0ZXIgbm90IGxvY2tlZC4gU2V0dGluZyB2YWx1ZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiBubyBQYXJhbWV0ZXIgZXhpc3RzCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZTogUGFyYW1ldGVyIGRvZXMgbm90IGV4aXN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDcmVhdGUgbmV3IFBhcmFtZXRlciB3aXRoIGNvcnJlY3QgbmFtZS92YWx1ZQotICAgICAgICAgICAgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhbS5zZXROYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuV1NBTV9JTlZPQ0FUSU9OX1BBVFRFUk5fUEFSQU1FVEVSX05BTUUpOwotICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEludm9jYXRpb25QYXR0ZXJuUGFyYW1ldGVyVmFsdWU6IEFkZGluZyBwYXJhbWV0ZXIgd2l0aCB2YWx1ZTogIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiBBeGlzRmF1bHQgaXMgb25seSBldmVyIHRocm93biB3aGVuIGEgbG9ja2VkIFBhcmFtZXRlcgotICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMgYW5kIHRoaXMgc2hvdWxkIGJlIGRlYWx0IHdpdGggYnkgdGhlIG91dGVyCi0gICAgICAgICAgICAgICAgLy8gaWYgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0SW52b2NhdGlvblBhdHRlcm5QYXJhbWV0ZXJWYWx1ZTogYWRkUGFyYW1ldGVyIGZhaWxlZDogIiArIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24sIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlOiB2YWx1ZSBwYXNzZWQgaW4gaXMgbnVsbC4gcmV0dXJuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPQotICAgICAgICAJYXhpc0Rlc2NyaXB0aW9uLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLSAgICAgICAgLy8gSWYgYW4gZXhpc3RpbmcgcGFyYW1ldGVyIGV4aXN0cwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlOiBQYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGFuZCBpcyBub3QgbG9ja2VkCi0gICAgICAgICAgICBpZiAoIXBhcmFtLmlzTG9ja2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlOiBQYXJhbWV0ZXIgbm90IGxvY2tlZC4gU2V0dGluZyB2YWx1ZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiBubyBQYXJhbWV0ZXIgZXhpc3RzCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWU6IFBhcmFtZXRlciBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBQYXJhbWV0ZXIgd2l0aCBjb3JyZWN0IG5hbWUvdmFsdWUKLSAgICAgICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYW0uc2V0TmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIHBhcmFtLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZTogQWRkaW5nIHBhcmFtZXRlciB3aXRoIHZhbHVlOiAiICsgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBBeGlzT3BlcmF0aW9uIG9iamVjdAotICAgICAgICAgICAgICAgIGF4aXNEZXNjcmlwdGlvbi5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4gQXhpc0ZhdWx0IGlzIG9ubHkgZXZlciB0aHJvd24gd2hlbiBhIGxvY2tlZCBQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAvLyBvZiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGFuZCB0aGlzIHNob3VsZCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBvdXRlcgotICAgICAgICAgICAgICAgIC8vIGlmIHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlOiBhZGRQYXJhbWV0ZXIgZmFpbGVkOiAiICsgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwMzBlMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ2xhc3MgRW5kcG9pbnRSZWZlcmVuY2UKLSAqIFRoaXMgY2xhc3MgbW9kZWxzIHRoZSBXUy1BIEVuZHBvaW50UmVmZXJlbmNlVHlwZS4gQnV0IHRoaXMgY2FuIGJlIHVzZWQgd2l0aG91dCBhbnkgV1MtQSBoYW5kbGVycyBhcyB3ZWxsCi0gKiBTaW5jZSB0aGUgbW9kZWxzIGZvciB0aGlzIGluIFN1Ym1pc3Npb24gYW5kIEZpbmFsIHZlcnNpb25zIGFyZSBkaWZmZXJlbnQsIGxldHMgbWFrZSB0aGlzIHRvIGNvbXBseSB3aXRoCi0gKiBXUy1BIEZpbmFsIHZlcnNpb24uIFNvIGFueSBpbmZvcm1hdGlvbiBmb3VuZCB3aXRoIFdTLUEgc3VibWlzc2lvbiB3aWxsIGJlICJwdW1wZWQiIGluIHRvIHRoaXMgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludFJlZmVyZW5jZSBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNzg4OTIxNzExNjIzNzI0MzlMOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVuZHBvaW50UmVmZXJlbmNlLmNsYXNzKTsKLSAgICAKLSAgICAvLyAgc3VwcG9ydGVkIHJldmlzaW9uIGxldmVscywgYWRkIGEgbmV3IGxldmVsIHRvIG1hbmFnZSBjb21wYXRpYmxlIGNoYW5nZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVWSVNJT05fMiA9IDI7Ci0gICAgLy8gY3VycmVudCByZXZpc2lvbiBsZXZlbCBvZiB0aGlzIG9iamVjdAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZXZpc2lvbklEID0gUkVWSVNJT05fMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBteUNsYXNzTmFtZSA9ICJFbmRwb2ludFJlZmVyZW5jZSI7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBJRCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb3JyZWxhdGUgb3BlcmF0aW9ucyBvbiBhbiBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgb2JqZWN0IGluIHRoZSBsb2cgZmlsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBsb2dDb3JyZWxhdGlvbklEU3RyaW5nOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBsaXN0IG9mIFVSSXMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IHRvIAotICAgICAqIHRoZSBXUy1BZGRyZXNzaW5nIGFub255bW91cyBVUkkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBMaXN0PFN0cmluZz4gYW5vbnltb3VzRXF1aXZhbGVudFVSSXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCi0gICAgLyoqCi0gICAgICogPEVuZHBvaW50UmVmZXJlbmNlPgotICAgICAqIDxBZGRyZXNzPnhzOmFueVVSSTwvQWRkcmVzcz4KLSAgICAgKiA8UmVmZXJlbmNlUGFyYW1ldGVycz54czphbnkqPC9SZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAqIDxNZXRhRGF0YT54czphbnkqPC9NZXRhRGF0YT4KLSAgICAgKiA8IS0tIEluIGFkZGl0aW9uIHRvIHRoaXMsIEVQUiBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIE9NRWxlbWVudHMgLS0+Ci0gICAgICogPC9FbmRwb2ludFJlZmVyZW5jZT4KLSAgICAgKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4gYWRkcmVzc0F0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8T01Ob2RlPiBtZXRhRGF0YTsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4gbWV0YURhdGFBdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgTWFwPFFOYW1lLCBPTUVsZW1lbnQ+IHJlZmVyZW5jZVBhcmFtZXRlcnM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8T01FbGVtZW50PiBleHRlbnNpYmxlRWxlbWVudHM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBOby1BcmcgQ29uc3RydWN0b3IKLSAgICAgKiBSZXF1aXJlZCBmb3IgRXh0ZXJuYWxpemFibGUgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSgpIHt9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBhcmFtZXRlciB0byB0aGUgbGlzdCBvZiBhbm9ueW1vdXMgZXF1aXZhbGVudCBVUklzLiAKLSAgICAgKiBAcGFyYW0gYW5vbnltb3VzRXF1aXZhbGVudFVSSSBhbnkgVVJJIHRoYXQgaGFzIGFuIGFkZHJlc3MgdGhhdAotICAgICAqIGJlZ2lucyB3aXRoIHRoaXMgdmFsdWUgd2lsbCBiZSBjb25zaWRlcmVkIHRvIGJlIGFub255bW91cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm9ueW1vdXNFcXVpdmFsZW50VVJJKFN0cmluZyBhbm9ueW1vdXNFcXVpdmFsZW50VVJJKXsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAJbG9nLnRyYWNlKCJhZGRBbm9ueW1vdXNFcXVpdmFsZW50VVJJOiAiICsgYW5vbnltb3VzRXF1aXZhbGVudFVSSSk7Ci0gICAgICAgIAotICAgICAgICAvLyBBdm9pZCBzeW5jaHJvbml6YXRpb24gaW4gaGFzQW5vbnltb3VzQWRkcmVzcyBieSB1c2luZyB0aGUKLSAgICAgICAgLy8gdGVjaG5pcXVlIG91dGxpbmVkIGF0IGh0dHA6Ly9pcy5nZC9ndjMKLSAgICAgICAgc3luY2hyb25pemVkIChhbm9ueW1vdXNFcXVpdmFsZW50VVJJcykgewotICAgICAgICAJQXJyYXlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhbm9ueW1vdXNFcXVpdmFsZW50VVJJcyk7Ci0gICAgICAgIAluZXdMaXN0LmFkZChhbm9ueW1vdXNFcXVpdmFsZW50VVJJKTsKLSAgICAgICAgICAgIGFub255bW91c0VxdWl2YWxlbnRVUklzID0gbmV3TGlzdDsKLSAgICAgICAgfQotICAgIH0KLSAKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9tRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZVBhcmFtZXRlcihPTUVsZW1lbnQgb21FbGVtZW50KSB7Ci0gICAgICAgIGlmIChvbUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWZlcmVuY2VQYXJhbWV0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgT01FbGVtZW50PigpOwotICAgICAgICB9Ci0gICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlcnMucHV0KG9tRWxlbWVudC5nZXRRTmFtZSgpLCBvbUVsZW1lbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBxbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZSAtIHRoZSB0ZXh0IG9mIHRoZSBPTUVsZW1lbnQuIFJlbWVtYmVyIHRoYXQgdGhpcyBpcyBhIGNvbnZlbmllbnQgbWV0aG9kIGZvciB0aGUgdXNlciwKLSAgICAgKiAgICAgICAgICAgICAgd2hpY2ggaGFzIGxpbWl0ZWQgY2FwYWJpbGl0eS4gSWYgeW91IHdhbnQgbW9yZSBwb3dlciB1c2UgQFNlZSBFbmRwb2ludFJlZmVyZW5jZSNhZGRSZWZlcmVuY2VQYXJhbWV0ZXIoT01FbGVtZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZVBhcmFtZXRlcihRTmFtZSBxbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChxbmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudChxbmFtZSwgbnVsbCk7Ci0gICAgICAgIG9tRWxlbWVudC5zZXRUZXh0KHZhbHVlKTsKLSAgICAgICAgYWRkUmVmZXJlbmNlUGFyYW1ldGVyKG9tRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiBhIE1hcCBvZiByZWZlcmVuY2UgcGFyYW1ldGVycyB3aXRoIFFOYW1lIGFzIHRoZSBrZXkgYW5kIGFuIE9NRWxlbWVudAotICAgICAqIGFzIHRoZSB2YWx1ZQotICAgICAqCi0gICAgICogQHJldHVybiAtIG1hcCBvZiB0aGUgcmVmZXJlbmNlIHBhcmFtZXRlcnMsIHdoZXJlIHRoZSBrZXkgaXMgdGhlIFFOYW1lIG9mIHRoZSByZWZlcmVuY2UgcGFyYW1ldGVyCi0gICAgICogICAgICAgICBhbmQgdGhlIHZhbHVlIGlzIGFuIE9NRWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8UU5hbWUsIE9NRWxlbWVudD4gZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHJlZmVyZW5jZVBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYWRkcmVzcyAtIHhzOmFueVVSSQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKLSAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBnZXRBZGRyZXNzQXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGFkZHJlc3NBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3NBdHRyaWJ1dGVzKEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4gYWwpIHsKLSAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMgPSBhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBnZXRNZXRhZGF0YUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YUF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGFBdHRyaWJ1dGVzKEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4gYWwpIHsKLSAgICAgICAgbWV0YURhdGFBdHRyaWJ1dGVzID0gYWw7Ci0gICAgfQotICAgIAotICAgIC8qKiAKLSAgICAgKiBUaGlzIG1ldGhvZCBpZGVudGlmaWVzIHdoZXRoZXIgdGhlIGFkZHJlc3MgaXMgYSBXUy1BZGRyZXNzaW5nIHNwZWMgZGVmaW5lZAotICAgICAqIGFub255bW91cyBVUkkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgV1MtQWRkcmVzc2luZyBzcGVjIGRlZmluZWQgYW5vbnltb3VzIFVSSS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNoYXNBbm9ueW1vdXNBZGRyZXNzKCkKLSAgICAgKi8gCi0gICAgcHVibGljIGJvb2xlYW4gaXNXU0FkZHJlc3NpbmdBbm9ueW1vdXMoKSB7Ci0gICAgICAgIHJldHVybiAoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTC5lcXVhbHMoYWRkcmVzcykgfHwKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX0FOT05ZTU9VU19VUkwuZXF1YWxzKGFkZHJlc3MpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpZGVudGlmeSB3aGVuIHJlc3BvbnNlIG1lc3NhZ2VzIHNob3VsZCBiZSBzZW50IHVzaW5nCi0gICAgICogdGhlIGJhY2sgY2hhbm5lbCBvZiBhIHR3by13YXkgdHJhbnNwb3J0LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgV1MtQWRkcmVzc2luZyBzcGVjIGRlZmluZWQgYW5vbnltb3VzIFVSSSwKLSAgICAgKiBvciBzdGFydHMgd2l0aCBhIHN0cmluZyB0aGF0IGlzIHNwZWNpZmllZCB0byBiZSBlcXVpdmFsZW50IHRvIGFuIGFub255bW91cwotICAgICAqIFVSSS4KLSAgICAgKiAKLSAgICAgKiBAc2VlICNhZGRBbm9ueW1vdXNFcXVpdmFsZW50VVJJKFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBbm9ueW1vdXNBZGRyZXNzKCkgewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGlzV1NBZGRyZXNzaW5nQW5vbnltb3VzKCk7Ci0gICAgICAgIAotICAgICAgICBpZighcmVzdWx0ICYmIGFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAJLy8gSWYgdGhlIGFkZHJlc3MgaXMgbm90IFdTLUEgYW5vbnltb3VzIGl0IG1pZ2h0IHN0aWxsIGJlIGNvbnNpZGVyZWQgYW5vbnltb3VzCi0gICAgICAgIAkvLyBBdm9pZCBzeW5jaHJvbml6YXRpb24gYnkgdXNpbmcgdGhlCi0gICAgICAgICAgICAvLyB0ZWNobmlxdWUgb3V0bGluZWQgYXQgaHR0cDovL2lzLmdkL2d2MwotICAgICAgICAJTGlzdDxTdHJpbmc+IGxvY2FsTGlzdCA9IGFub255bW91c0VxdWl2YWxlbnRVUklzOwotICAgICAgICAJaWYoIWxvY2FsTGlzdC5pc0VtcHR5KCkpewotICAgICAgICAJCUl0ZXJhdG9yPFN0cmluZz4gaXQgPSBsb2NhbExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgCQl3aGlsZShpdC5oYXNOZXh0KCkpewotICAgICAgICAJCQlyZXN1bHQgPSBhZGRyZXNzLnN0YXJ0c1dpdGgoKFN0cmluZylpdC5uZXh0KCkpOwotICAgICAgICAJCQlpZihyZXN1bHQpewotICAgICAgICAJCQkJYnJlYWs7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9CQotICAgICAgICAJfSAgICAJCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiaGFzQW5vbnltb3VzQWRkcmVzczogIiArIGFkZHJlc3MgKyAiIGlzIEFub255bW91czogIiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaGFzTm9uZUFkZHJlc3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB0aGUgJ05vbmUgVVJJJyBmcm9tIHRoZSBmaW5hbCBhZGRyZXNzaW5nIHNwZWMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTm9uZUFkZHJlc3MoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTk9ORV9VUkkuZXF1YWxzKGFkZHJlc3MpOwotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiaGFzTm9uZUFkZHJlc3M6ICIgKyBhZGRyZXNzICsgIiBpcyBOb25lOiAiICsgcmVzdWx0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUKLSAgICAgKiBAcGFyYW0gbnMKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nIGxvY2FsTmFtZSwgT01OYW1lc3BhY2UgbnMsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPTUF0dHJpYnV0ZT4oKTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzLmFkZChPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUF0dHJpYnV0ZShsb2NhbE5hbWUsIG5zLCB2YWx1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9tQXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKE9NQXR0cmlidXRlIG9tQXR0cmlidXRlKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9NQXR0cmlidXRlPigpOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG9tQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PE9NRWxlbWVudD4gZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaWJsZUVsZW1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHthbnl9Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0ZW5zaWJsZUVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaWJsZUVsZW1lbnRzKEFycmF5TGlzdDxPTUVsZW1lbnQ+IGV4dGVuc2libGVFbGVtZW50cykgewotICAgICAgICB0aGlzLmV4dGVuc2libGVFbGVtZW50cyA9IGV4dGVuc2libGVFbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpYmxlRWxlbWVudChPTUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGV4dGVuc2libGVFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmV4dGVuc2libGVFbGVtZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leHRlbnNpYmxlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE9NRWxlbWVudD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnRzLmFkZChleHRlbnNpYmxlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PE9NTm9kZT4gZ2V0TWV0YURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtZXRhRGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXRhRGF0YShPTU5vZGUgbWV0YURhdGEpIHsKLSAgICAgICAgaWYgKG1ldGFEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLm1ldGFEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLm1ldGFEYXRhID0gbmV3IEFycmF5TGlzdDxPTU5vZGU+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm1ldGFEYXRhLmFkZChtZXRhRGF0YSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBhIE1hcCB3aXRoIFFOYW1lIGFzIHRoZSBrZXkgYW5kIGFuIE9NRWxlbWVudAotICAgICAqIGFzIHRoZSB2YWx1ZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZVBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VQYXJhbWV0ZXJzKE1hcDxRTmFtZSwgT01FbGVtZW50PiByZWZlcmVuY2VQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMucmVmZXJlbmNlUGFyYW1ldGVycyA9IHJlZmVyZW5jZVBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqICAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIkFkZHJlc3M6ICIgKyBhZGRyZXNzKTsKLQotICAgICAgICBpZiAoYWRkcmVzc0F0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBBZGRyZXNzIEF0dHJpYnV0ZXM6ICIpLmFwcGVuZChhZGRyZXNzQXR0cmlidXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBNZXRhZGF0YTogIikuYXBwZW5kKG1ldGFEYXRhKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1ldGFEYXRhQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIE1ldGFkYXRhIEF0dHJpYnV0ZXM6ICIpLmFwcGVuZChtZXRhRGF0YUF0dHJpYnV0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZmVyZW5jZVBhcmFtZXRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBSZWZlcmVuY2UgUGFyYW1ldGVyczogIikuYXBwZW5kKHJlZmVyZW5jZVBhcmFtZXRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dGVuc2libGVFbGVtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsIEV4dGVuc2liaWxpdHkgZWxlbWVudHM6ICIpLmFwcGVuZChleHRlbnNpYmxlRWxlbWVudHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCBBdHRyaWJ1dGVzOiAiKS5hcHBlbmQoYXR0cmlidXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGVwck9NRWxlbWVudAotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIjZnJvbU9NKE9NRWxlbWVudCl9IGluc3RlYWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZnJvbU9NKE9NRWxlbWVudCBlcHJPTUVsZW1lbnQpIHsKLSAgICAgICAgT01FbGVtZW50IGFkZHJlc3NFbGVtZW50ID0gZXByT01FbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoIkFkZHJlc3MiKSk7Ci0gICAgICAgIHNldEFkZHJlc3MoYWRkcmVzc0VsZW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAgICAgSXRlcmF0b3IgYWxsQWRkckF0dHJpYnV0ZXMgPSBhZGRyZXNzRWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGlmIChhZGRyZXNzQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRyZXNzQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8T01BdHRyaWJ1dGU+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoYWxsQWRkckF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGFsbEFkZHJBdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICBPTUVsZW1lbnQgcmVmUGFyYW1FbGVtZW50ID0gZXByT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMpKTsKLQotICAgICAgICBpZiAocmVmUGFyYW1FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHJlZlBhcmFtcyA9IHJlZlBhcmFtRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAocmVmUGFyYW1zLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSByZWZQYXJhbXMubmV4dCgpOwotICAgICAgICAgICAgICAgIGFkZFJlZmVyZW5jZVBhcmFtZXRlcihvbUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBPTUVsZW1lbnQgbWV0YURhdGFFbGVtZW50ID0gZXByT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTUVUQURBVEEpKTsKLSAgICAgICAgaWYgKG1ldGFEYXRhRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZHJlbiA9IG1ldGFEYXRhRWxlbWVudC5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NTm9kZSBvbU5vZGUgPSAoT01Ob2RlKSBjaGlsZHJlbi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkTWV0YURhdGEob21Ob2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldE5hbWUoZXByT01FbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQotICAgICAgICBJdGVyYXRvciBhbGxBdHRyaWJ1dGVzID0gZXByT01FbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChhbGxBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhbGxBdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gZXByT01FbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkRWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZXByQ2hpbGRFbGVtZW50ID0gKE9NRWxlbWVudCkgY2hpbGRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gZXByQ2hpbGRFbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFsb2NhbE5hbWUuZXF1YWxzKCJBZGRyZXNzIikgJiYKLSAgICAgICAgICAgICAgICAgICAgIWxvY2FsTmFtZS5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMpICYmCi0gICAgICAgICAgICAgICAgICAgICFsb2NhbE5hbWUuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX01FVEFEQVRBKSkgewotICAgICAgICAgICAgICAgIGFkZEV4dGVuc2libGVFbGVtZW50KGVwckNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbnN1cmwKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAgICogQHBhcmFtIHByZWZpeAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBFbmRwb2ludFJlZmVyZW5jZUhlbHBlciN0b09NKEVuZHBvaW50UmVmZXJlbmNlLCBRTmFtZSwgU3RyaW5nKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHRvT00oU3RyaW5nIG5zdXJsLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdyYXBOcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShuc3VybCwgcHJlZml4KTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlcHIgPSBmYWMuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZSwgd3JhcE5zKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzYU5TID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBhZGRyZXNzRSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUywgd3NhTlMsIGVwcik7Ci0gICAgICAgICAgICBhZGRyZXNzRS5zZXRUZXh0KGFkZHJlc3MpOwotCi0gICAgICAgICAgICBpZiAoYWRkcmVzc0F0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJJdGVyID0gYWRkcmVzc0F0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYXR0ckl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlcyA9IChPTUF0dHJpYnV0ZSkgYXR0ckl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzRS5hZGRBdHRyaWJ1dGUob21BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLm1ldGFEYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbWV0YWRhdGFFID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTUVsZW1lbnQoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTUVUQURBVEEsIHdzYU5TLCBlcHIpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG1ldGFkYXRhID0gdGhpcy5tZXRhRGF0YS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChtZXRhZGF0YS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFFLmFkZENoaWxkKChPTU5vZGUpIG1ldGFkYXRhLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcmVmUGFyYW1ldGVyRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX1JFRkVSRU5DRV9QQVJBTUVURVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2FOUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXByKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciByZWZQYXJtcyA9IHJlZmVyZW5jZVBhcmFtZXRlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocmVmUGFybXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZlBhcmFtZXRlckVsZW1lbnQuYWRkQ2hpbGQoKE9NTm9kZSkgcmVmUGFybXMubmV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRySXRlciA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYXR0ckl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlcyA9IChPTUF0dHJpYnV0ZSkgYXR0ckl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBlcHIuYWRkQXR0cmlidXRlKG9tQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgeHM6YW55Ci0gICAgICAgICAgICBBcnJheUxpc3Qgb21FbGVtZW50cyA9IGV4dGVuc2libGVFbGVtZW50czsKLSAgICAgICAgICAgIGlmIChvbUVsZW1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9tRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZXByLmFkZENoaWxkKChPTUVsZW1lbnQpIG9tRWxlbWVudHMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJwcmVmaXggbXVzdCBiZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGtleSBwYXJ0cyBvZiB0aGUgc3RhdGUgZnJvbSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIGVxdWl2YWxlbnQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscygpIG1ldGhvZCBpbgotICAgICAqIHRoYXQgdGhlIGVxdWFscygpIG1ldGhvZCBnZW5lcmFsbHkgbG9va3MgYXQgYm90aCB0aGUKLSAgICAgKiBvYmplY3QgaWRlbnRpdHkgKGxvY2F0aW9uIGluIG1lbW9yeSkgYW5kIHRoZSBvYmplY3Qgc3RhdGUKLSAgICAgKiAoZGF0YSkuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGVwciBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGlzIG9iamVjdCBpcyBlcXVpdmFsZW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgKiAgICAgICAgIHRoYXQgaXMsIGtleSBmaWVsZHMgbWF0Y2gKLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoRW5kcG9pbnRSZWZlcmVuY2UgZXByKSB7Ci0gICAgICAgIC8vIE5PVEU6IHRoZSBpbnB1dCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gZXhpc3QgKGllLCBiZSBub24tbnVsbCkKLQotICAgICAgICBpZiAoKHRoaXMubmFtZSAhPSBudWxsKSAmJiAoZXByLmdldE5hbWUoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLm5hbWUuZXF1YWxzKGVwci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5hbWUgPT0gbnVsbCkgJiYgKGVwci5nZXROYW1lKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIC8vIGNvbnRpbnVlCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoKHRoaXMuYWRkcmVzcyAhPSBudWxsKSAmJiAoZXByLmdldEFkZHJlc3MoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3MuZXF1YWxzKGVwci5nZXRBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmFkZHJlc3MgPT0gbnVsbCkgJiYgKGVwci5nZXRBZGRyZXNzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIC8vIGNvbnRpbnVlCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBtaXNtYXRjaAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogaXMgYSBzdHJpY3QgdGVzdCBvayB0byB1c2U/Ci0KLSAgICAgICAgQXJyYXlMaXN0PE9NTm9kZT4gZXByTWV0YURhdGEgPSBlcHIuZ2V0TWV0YURhdGEoKTsKLQotICAgICAgICBpZiAoKHRoaXMubWV0YURhdGEgIT0gbnVsbCkgJiYgKGVwck1ldGFEYXRhICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMubWV0YURhdGEuZXF1YWxzKGVwck1ldGFEYXRhKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3QgdGVzdAotICAgICAgICAgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdAotICAgICAgICAgICAgICAgIC8vIGlzIGFsc28gYSBsaXN0LCBib3RoIGxpc3RzIGhhdmUgdGhlIHNhbWUgc2l6ZSwgYW5kCi0gICAgICAgICAgICAgICAgLy8gYWxsIGNvcnJlc3BvbmRpbmcgcGFpcnMgb2YgZWxlbWVudHMgaW4gdGhlIHR3byBsaXN0cwotICAgICAgICAgICAgICAgIC8vIGFyZSBlcXVhbCwgaWUsIHR3byBsaXN0cyBhcmUgZGVmaW5lZCB0byBiZSBlcXVhbCBpZgotICAgICAgICAgICAgICAgIC8vIHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4KLQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5tZXRhRGF0YSA9PSBudWxsKSAmJiAoZXByTWV0YURhdGEgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIC8vIGtlZXAgZ29pbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgbGlzdHMgaXMgbnVsbAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLQotICAgICAgICBBcnJheUxpc3Q8T01FbGVtZW50PiBlcHJFeHRlbnNpYmxlRWxlbWVudHMgPSBlcHIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0KLSAgICAgICAgaWYgKCh0aGlzLmV4dGVuc2libGVFbGVtZW50cyAhPSBudWxsKSAmJiAoZXByRXh0ZW5zaWJsZUVsZW1lbnRzICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZXh0ZW5zaWJsZUVsZW1lbnRzLmVxdWFscyhlcHJFeHRlbnNpYmxlRWxlbWVudHMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdCB0ZXN0Ci0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgLy8gaXMgYWxzbyBhIGxpc3QsIGJvdGggbGlzdHMgaGF2ZSB0aGUgc2FtZSBzaXplLCBhbmQKLSAgICAgICAgICAgICAgICAvLyBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvIGxpc3RzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGVxdWFsLCBpZSwgdHdvIGxpc3RzIGFyZSBkZWZpbmVkIHRvIGJlIGVxdWFsIGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmV4dGVuc2libGVFbGVtZW50cyA9PSBudWxsKSAmJiAoZXByRXh0ZW5zaWJsZUVsZW1lbnRzID09IG51bGwpKSB7Ci0gICAgICAgICAgICAvLyBrZWVwIGdvaW5nCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBvbmUgb2YgdGhlIGxpc3RzIGlzIG51bGwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgQXJyYXlMaXN0PE9NQXR0cmlidXRlPiBlcHJBdHRyaWJ1dGVzID0gZXByLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBpZiAoKHRoaXMuYXR0cmlidXRlcyAhPSBudWxsKSAmJiAoZXByQXR0cmlidXRlcyAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLmF0dHJpYnV0ZXMuZXF1YWxzKGVwckF0dHJpYnV0ZXMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdCB0ZXN0Ci0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgLy8gaXMgYWxzbyBhIGxpc3QsIGJvdGggbGlzdHMgaGF2ZSB0aGUgc2FtZSBzaXplLCBhbmQKLSAgICAgICAgICAgICAgICAvLyBhbGwgY29ycmVzcG9uZGluZyBwYWlycyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvIGxpc3RzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGVxdWFsLCBpZSwgdHdvIGxpc3RzIGFyZSBkZWZpbmVkIHRvIGJlIGVxdWFsIGlmCi0gICAgICAgICAgICAgICAgLy8gdGhleSBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIG9yZGVyLgotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmF0dHJpYnV0ZXMgPT0gbnVsbCkgJiYgKGVwckF0dHJpYnV0ZXMgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgIC8vIGtlZXAgZ29pbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgbGlzdHMgaXMgbnVsbAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhlIE1hcCByZWZlcmVuY2VQYXJhbWV0ZXJzIGZvciBlcXVpdmFsZW5jeQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vUkVWSUVXOiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgcmF0aGVyIGhlYXZ5d2VpZ2h0LCBiZWNhdXNlIHdlIGhhdmUgdG8gYnVpbGQgCi0gICAgLy8gICB0aGUgT00gdHJlZSAtLSBpdCB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgdG8gaGF2ZSB0d28gc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gCi0gICAgLy8gICBwYXRocyBhbmQgdGhlcmVmb3JlLCBmb3IgdHJpdmlhbCBFUFJzLCBzdG9yZSBhIHNtYWxsZXIgYW1vdW50IG9mIGluZm8gIAotCi0gICAgLyoqCi0gICAgICogV3JpdGUgdGhlIEVQUiB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbS4gIEJlY2F1c2Ugb2YgcG90ZW50aWFsCi0gICAgICogT01FbGVtZW50cy9BdHRyaWJ1dGVzLCB3ZSBuZWVkIHRvIGFjdHVhbGx5IHNlcmlhbGl6ZSB0aGUgT00gc3RydWN0dXJlcwotICAgICAqIChhdCBsZWFzdCBpbiBzb21lIGNhc2VzLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGVFeHRlcm5hbChqYXZhLmlvLk9iamVjdE91dHB1dCBvKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIAotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7Ci0gICAgICAgIAotICAgICAgICAvLyBDb3JyZWxhdGlvbiBJRAotICAgICAgICBTdHJpbmcgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKTsKLQotICAgICAgICAvLyBTdHJpbmcgb2JqZWN0IGlkCi0gICAgICAgIG91dC53cml0ZU9iamVjdChsb2dDb3JyZWxhdGlvbklEU3RyaW5nKTsKLQotICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnQgYXMgeG1sCi0gICAgICAgIG91dC53cml0ZVVURigic3RhcnQgeG1sIik7IC8vIHdyaXRlIG1hcmtlcgotICAgICAgICBPTUVsZW1lbnQgb20gPQotICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJ1cm46YXhpczIiLCAib21lcHIiLCAic2VyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvbS5zZXJpYWxpemUoYmFvcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBzZXJpYWxpemUgdGhlIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggbG9nQ29ycmVsYXRpb25JRCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdIik7IAotICAgICAgICAgICAgaW9lLmluaXRDYXVzZShlKTsKLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ3cml0ZU9iamVjdCgpOiBVbmFibGUgdG8gc2VyaWFsaXplIHRoZSBFUFIgd2l0aCBsb2dDb3JyZWxhdGlvbklEIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICtsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdICAgb3JpZ2luYWwgZXJyb3IgWyIrZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gIG1lc3NhZ2UgWyIrZS5nZXRNZXNzYWdlKCkrIl0iLGUpOyAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC53cml0ZUludChiYW9zLnNpemUoKSk7Ci0gICAgICAgIG91dC53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOyAgCi0gICAgICAgIG91dC53cml0ZVVURigiZW5kIHhtbCIpOyAvLyB3cml0ZSBtYXJrZXIKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYnVmZmVyKTsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKCJ3cml0ZU9iamVjdCgpOiBFUFIgbG9nQ29ycmVsYXRpb25JRCBbIitsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdICIgICAgCi0gICAgICAgICAgICAgICAgICAgICAgKyIgICAgRVBSIGNvbnRlbnQgc2l6ZSBbIitiYW9zLnNpemUoKSsiXSIKLSAgICAgICAgICAgICAgICAgICAgICArIiAgICBFUFIgY29udGVudCBbIitjb250ZW50KyJdIik7IAotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBFUFIgdG8gdGhlIHNwZWNpZmllZCBJbnB1dFN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoamF2YS5pby5PYmplY3RJbnB1dCBpbk9iamVjdCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSByZXZpc2lvbiBsZXZlbCB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChyZXZJRCAhPSBSRVZJU0lPTl8yKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9SRVZJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFN0cmluZyBvYmplY3QgaWQKLSAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBSZWFkIHhtbCBjb250ZW50Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgaW50IG51bUJ5dGVzID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgIGJ5dGVbXSBzZXJCeXRlcyA9IG5ldyBieXRlW251bUJ5dGVzXTsKLQotICAgICAgICAvLyByZWFkIHRoZSBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbQotCi0gICAgICAgIGludCBieXRlc1JlYWQgPSAwOwotICAgICAgICBpbnQgbnVtYmVyT2ZCeXRlc0xhc3RSZWFkOwotCi0gICAgICAgIHdoaWxlIChieXRlc1JlYWQgPCBudW1CeXRlcykgewotICAgICAgICAgICAgbnVtYmVyT2ZCeXRlc0xhc3RSZWFkID0gaW4ucmVhZChzZXJCeXRlcywgYnl0ZXNSZWFkLCBudW1CeXRlcyAtIGJ5dGVzUmVhZCk7Ci0KLSAgICAgICAgICAgIGlmIChudW1iZXJPZkJ5dGVzTGFzdFJlYWQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBXaGF0IHNob3VsZCB3ZSBkbyBpZiB0aGUgcmVjb25zdGl0dXRpb24gZmFpbHM/Ci0gICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgbG9nIHRoZSBldmVudCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVhZE9iamVjdCgpOiBFUFIgbG9nQ29ycmVsYXRpb25JRCBbIitsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdICIgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICoqKldBUk5JTkcqKiogdW5leHBlY3RlZCBlbmQgdG8gZGF0YTogICAgZGF0YSByZWFkIGZyb20gaW5wdXQgc3RyZWFtIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBieXRlc1JlYWQgKyAiXSAgICBleHBlY3RlZCBkYXRhIHNpemUgWyIgKyBudW1CeXRlcyArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gaW9lID0gbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVzZXJpYWxpemUgdGhlIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggbG9nQ29ycmVsYXRpb25JRCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbG9nQ29ycmVsYXRpb25JRFN0cmluZysiXSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgIENhdXNlOiBVbmV4cGVjdGVkIGVuZCB0byBkYXRhIGZyb20gaW5wdXQgc3RyZWFtIik7IAotCi0gICAgICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBieXRlc1JlYWQgKz0gbnVtYmVyT2ZCeXRlc0xhc3RSZWFkOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoYnl0ZXNSZWFkID09IDApIHsKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGRlc2VyaWFsaXplIHRoZSBFbmRwb2ludFJlZmVyZW5jZSB3aXRoIGxvZ0NvcnJlbGF0aW9uSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArbG9nQ29ycmVsYXRpb25JRFN0cmluZysiXSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiAgQ2F1c2U6IE5vIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0iKTsgCi0KLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotICAgICAgICBpbi5yZWFkVVRGKCk7IC8vIHJlYWQgbWFya2VyCi0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJCeXRlcyk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoc2VyQnl0ZXMpOwotCi0gICAgICAgICAgICBsb2cuZGVidWcoInJlYWRPYmplY3QoKTogRVBSIGxvZ0NvcnJlbGF0aW9uSUQgWyIrbG9nQ29ycmVsYXRpb25JRFN0cmluZysiXSAiICAgIAotICAgICAgICAgICAgICAgICAgICAgICsiICAgIGV4cGVjdGVkIGNvbnRlbnQgc2l6ZSBbIitudW1CeXRlcysiXSIKLSAgICAgICAgICAgICAgICAgICAgICArIiAgICBjb250ZW50IHNpemUgWyIrY29udGVudC5sZW5ndGgoKSsiXSIKLSAgICAgICAgICAgICAgICAgICAgICArIiAgICBFUFIgYnVmZmVyZWQgY29udGVudCBbIitjb250ZW50KyJdIik7IAotICAgICAgICB9Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoYmFpcyk7Ci0gICAgICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcih4bWxSZWFkZXIpOwotICAgICAgICAgICAgT01FbGVtZW50IG9tID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgLy8gZXhwYW5kIHRoZSBPTSBzbyB3ZSBjYW4gY2xvc2UgdGhlIHN0cmVhbSByZWFkZXIKLSAgICAgICAgICAgIG9tLmJ1aWxkKCk7Ci0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiOnJlYWRPYmplY3QoKTogICIgIAotICAgICAgICAgICAgICAgICAgICAgICAgICArICIgRVBSIFsiK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKyAiXSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEVQUiBPTSBjb250ZW50IFsiK29tLnRvU3RyaW5nKCkrICJdIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTSh0aGlzLCBvbSwgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBkZXNlcmlhbGl6ZSB0aGUgRW5kcG9pbnRSZWZlcmVuY2Ugd2l0aCBsb2dDb3JyZWxhdGlvbklEIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0iKTsgCi0gICAgICAgICAgICBpb2UuaW5pdENhdXNlKGUpOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlYWRPYmplY3QoKTogVW5hYmxlIHRvIGRlc2VyaWFsaXplIHRoZSBFUFIgd2l0aCBsb2dDb3JyZWxhdGlvbklEIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICtsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdICAgb3JpZ2luYWwgZXJyb3IgWyIrZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICArIl0gIG1lc3NhZ2UgWyIrZS5nZXRNZXNzYWdlKCkrIl0iLGUpOyAgCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IGlvZTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlYWRlciBpcyBwcm9wZXJseSBjbG9zZWQKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBjbG9zaW5nIGEgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaGFzIG5vIGVmZmVjdAotCi0gICAgICAgICAgICBpZiAoeG1sUmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB4bWxSZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gaW9lMiA9IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNsb3NlIHRoZSBYTUxTdHJlYW1SZWFkZXIgZm9yIHRoZSBFbmRwb2ludFJlZmVyZW5jZSB3aXRoIGxvZ0NvcnJlbGF0aW9uSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtsb2dDb3JyZWxhdGlvbklEU3RyaW5nKyJdIik7IAotICAgICAgICAgICAgICAgICAgICBpb2UyLmluaXRDYXVzZShlMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlYWRPYmplY3QoKTogVW5hYmxlIHRvIGNsb3NlIHRoZSBYTUxTdHJlYW1SZWFkZXIgZm9yIHRoZSBFUFIgd2l0aCBsb2dDb3JyZWxhdGlvbklEIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvZ0NvcnJlbGF0aW9uSURTdHJpbmcrIl0gICBvcmlnaW5hbCBlcnJvciBbIitlMi5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiXSAgbWVzc2FnZSBbIitlMi5nZXRNZXNzYWdlKCkrIl0iLGUyKTsgIAotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW9lMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBjYW4gYmUgb3V0cHV0IHRvIGEgbG9nIGZpbGUgYXMgYW4gaWRlbnRpZmllcgotICAgICAqICAgICAgICAgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLiAgSXQgaXMgc3VpdGFibGUgZm9yIG1hdGNoaW5nIHJlbGF0ZWQgbG9nCi0gICAgICogICAgICAgICBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpIHsKLSAgICAgICAgaWYgKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IG15Q2xhc3NOYW1lICsgIkAiICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZUhlbHBlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0MjllZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkF0dHJpYnV0ZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuRWxlbWVudEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLkludGVyZmFjZU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhLlNlcnZpY2VOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YS5XU0RMTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlIHVzZWQgdG8gcHJvY2VzcyB7QGxpbmsgRW5kcG9pbnRSZWZlcmVuY2V9IG9iamVjdHMKLSAqIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIDIwMDUvMDggKEZpbmFsKSBhbmQgMjAwNC8wOCAoc3VibWlzc2lvbikgV1MtQWRkcmVzc2luZwotICogc3BlY2lmaWNhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmRwb2ludFJlZmVyZW5jZUhlbHBlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwIGZpbmFsUU5hbWVzID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE1hcCBzdWJtaXNzaW9uUU5hbWVzID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGVzIGFuIGVuZHBvaW50IHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgPGNvZGU+T01FbGVtZW50PC9jb2RlPiBhbmQKLSAgICAgKiBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSB0aGF0IGlzIHBhc3NlZCBpbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcHIgICAgICAgICAgICAgICAgIGFuIGVuZHBvaW50IHJlZmVyZW5jZSBpbnN0YW5jZSB0byBob2xkIHRoZSBpbmZvLgotICAgICAqIEBwYXJhbSBlcHJPTUVsZW1lbnQgICAgICAgIGFuIGVsZW1lbnQgb2YgZW5kcG9pbnQgcmVmZXJlbmNlIHR5cGUKLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIG9mIHRoZSBXUy1BZGRyZXNzaW5nIHNwZWMgdG8gY29tcGx5IHdpdGguCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdW5hYmxlIHRvIGxvY2F0ZSBhbiBhZGRyZXNzIGVsZW1lbnQsIG9yIGlmIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlCi0gICAgICogaXMgZGlmZmVyZW50IHRvIHRoZSBhY3R1YWwgbmFtZXNwYWNlLgotICAgICAqIEBzZWUgI2Zyb21PTShPTUVsZW1lbnQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZyb21PTShFbmRwb2ludFJlZmVyZW5jZSBlcHIsIE9NRWxlbWVudCBlcHJPTUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBmcm9tT00oZXByLCBlcHJPTUVsZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGhlIGVuZHBvaW50IHJlZmVyZW5jZSBkb2VzIG5vdCBtYXRjaCB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+LiBSZXR1cm5zIHRoZQotICAgICAqIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIG9mIHRoZSBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVwciAgICAgICAgICBhbiBlbmRwb2ludCByZWZlcmVuY2UgaW5zdGFuY2UgdG8gaG9sZCB0aGUgaW5mby4gSWYgdGhlIGVuZHBvaW50Ci0gICAgICogcmVmZXJlbmNlIGlzIG51bGwgdGhlbiBqdXN0IHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSBpcyByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gZXByT01FbGVtZW50IGFuIGVsZW1lbnQgb2YgZW5kcG9pbnQgcmVmZXJlbmNlIHR5cGUKLSAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB1bmFibGUgdG8gbG9jYXRlIGFuIGFkZHJlc3MgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tT00oRW5kcG9pbnRSZWZlcmVuY2UgZXByLCBPTUVsZW1lbnQgZXByT01FbGVtZW50KQotICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBib29sZWFuIGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlID0gZmFsc2U7Ci0gICAgICAgIE1hcCBtYXAgPSBudWxsOwotCi0gICAgICAgIC8vRmlyc3QgcGFzcywgaWRlbnRpZnkgdGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlLgotICAgICAgICBPTUVsZW1lbnQgYWRkcmVzcyA9IGVwck9NRWxlbWVudAotICAgICAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkV2l0aE5hbWUoKFFOYW1lKSBmaW5hbFFOYW1lcy5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUykpOwotCi0gICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IGZpbmFsUU5hbWVzOwotICAgICAgICAgICAgaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgPSB0cnVlOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZyb21PTTogRm91bmQgYWRkcmVzcyBlbGVtZW50IGZvciBuYW1lc3BhY2UsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBlcHJPTUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKAotICAgICAgICAgICAgICAgICAgICAoUU5hbWUpIHN1Ym1pc3Npb25RTmFtZXMuZ2V0KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX0FERFJFU1MpKTsKLQotICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hcCA9IHN1Ym1pc3Npb25RTmFtZXM7Ci0gICAgICAgICAgICAgICAgaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZyb21PTTogRm91bmQgYWRkcmVzcyBlbGVtZW50IGZvciBuYW1lc3BhY2UsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGxvY2F0ZSBhbiBhZGRyZXNzIGVsZW1lbnQgZm9yIHRoZSBlbmRwb2ludCByZWZlcmVuY2UgdHlwZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vU2Vjb25kIHBhc3MsIGlkZW50aWZ5IHRoZSBwcm9wZXJ0aWVzLgotICAgICAgICBpZiAoZXByICE9IG51bGwpCi0gICAgICAgICAgICBmcm9tT00oZXByLCBlcHJPTUVsZW1lbnQsIG1hcCwgaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UpOwotCi0gICAgICAgIHJldHVybiAoKFFOYW1lKSBtYXAuZ2V0KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX0FERFJFU1MpKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgaXMKLSAgICAgKiBwYXNzZWQgaW4uIElmIHRoZSBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmcgbmFtZXNwYWNlCi0gICAgICogaXMgaW4gZWZmZWN0IHRoZW4gYW55IHJlZmVyZW5jZSBwcm9wZXJ0aWVzIHdpbGwgYmUgc2F2ZWQgYXMgcmVmZXJlbmNlIHBhcmFtZXRlcnMuCi0gICAgICogUmVnYXJkbGVzcyBvZiB0aGUgYWRkcmVzc2luZyBuYW1lc3BhY2UgaW4gZWZmZWN0LCBhbnkgZWxlbWVudHMgcHJlc2VudCBpbiB0aGUKLSAgICAgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgYXJlIG5vdCByZWNvZ25pc2VkIGFyZSBzYXZlZCBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGVwclN0cmluZyBzdHJpbmcgZnJvbSB0aGUgZWxlbWVudCBvZiBlbmRwb2ludCByZWZlcmVuY2UgdHlwZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHVuYWJsZSB0byBsb2NhdGUgYW4gYWRkcmVzcyBlbGVtZW50Ci0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZnJvbVN0cmluZyhTdHJpbmcpfSBpbnN0ZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgZnJvbU9NKFN0cmluZyBlcHJTdHJpbmcpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gZnJvbVN0cmluZyhlcHJTdHJpbmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBvcHVsYXRlcyBhbiBlbmRwb2ludCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBpcwotICAgICAqIHBhc3NlZCBpbi4gSWYgdGhlIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyBuYW1lc3BhY2UKLSAgICAgKiBpcyBpbiBlZmZlY3QgdGhlbiBhbnkgcmVmZXJlbmNlIHByb3BlcnRpZXMgd2lsbCBiZSBzYXZlZCBhcyByZWZlcmVuY2UgcGFyYW1ldGVycy4KLSAgICAgKiBSZWdhcmRsZXNzIG9mIHRoZSBhZGRyZXNzaW5nIG5hbWVzcGFjZSBpbiBlZmZlY3QsIGFueSBlbGVtZW50cyBwcmVzZW50IGluIHRoZQotICAgICAqIDxjb2RlPlN0cmluZzwvY29kZT4gdGhhdCBhcmUgbm90IHJlY29nbmlzZWQgYXJlIHNhdmVkIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXByU3RyaW5nIHN0cmluZyBmcm9tIHRoZSBlbGVtZW50IG9mIGVuZHBvaW50IHJlZmVyZW5jZSB0eXBlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdW5hYmxlIHRvIGxvY2F0ZSBhbiBhZGRyZXNzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIGZyb21TdHJpbmcoU3RyaW5nIGVwclN0cmluZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gZnJvbU9NKG5ldyBTdEFYT01CdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZXByU3RyaW5nLmdldEJ5dGVzKCkpKS5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGVzIGFuIGVuZHBvaW50IHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgPGNvZGU+T01FbGVtZW50PC9jb2RlPiB0aGF0IGlzCi0gICAgICogcGFzc2VkIGluLiBJZiB0aGUgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIG5hbWVzcGFjZQotICAgICAqIGlzIGluIGVmZmVjdCB0aGVuIGFueSByZWZlcmVuY2UgcHJvcGVydGllcyB3aWxsIGJlIHNhdmVkIGFzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgotICAgICAqIFJlZ2FyZGxlc3Mgb2YgdGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIGluIGVmZmVjdCwgYW55IGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlCi0gICAgICogPGNvZGU+T01FbGVtZW50PC9jb2RlPiB0aGF0IGFyZSBub3QgcmVjb2duaXNlZCBhcmUgc2F2ZWQgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlcHJPTUVsZW1lbnQgYW4gZWxlbWVudCBvZiBlbmRwb2ludCByZWZlcmVuY2UgdHlwZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHVuYWJsZSB0byBsb2NhdGUgYW4gYWRkcmVzcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSBmcm9tT00oT01FbGVtZW50IGVwck9NRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgIGZyb21PTShlcHIsIGVwck9NRWxlbWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGVwcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gYmFzZWQgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVuZHBvaW50Ci0gICAgICogcmVmZXJlbmNlLiBUaGUgb3V0cHV0IG1heSBkaWZmZXIgYmFzZWQgb24gdGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIHRoYXQgaXMKLSAgICAgKiBpbiBlZmZlY3Qgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoZSBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcKLSAgICAgKiBuYW1lc3BhY2UgaXMgaW4gZWZmZWN0LCBhbmQgYSBtZXRhZGF0YSBwcm9wZXJ0eSBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUKLSAgICAgKiBlbmRwb2ludCByZWZlcmVuY2UsIHRoZW4gdGhlcmUgd2lsbCBiZSBhIG1ldGFkYXRhIGVsZW1lbnQgdG8gY29udGFpbiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpbiB0aGUgb3V0cHV0LiBJZiB0aGUgaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nCi0gICAgICogbmFtZXNwYWNlIGlzIGluIGVmZmVjdCwgaG93ZXZlciwgdGhlbiBubyBtZXRhZGF0YSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQKLSAgICAgKiBpbiB0aGUgb3V0cHV0LCBldmVuIGlmIGEgbWV0YWRhdGEgcHJvcGVydHkgZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkKLSAgICAgKiBAcGFyYW0gZXByCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCB0b09NKE9NRmFjdG9yeSBmYWN0b3J5LCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsIFFOYW1lIHFuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPTUVsZW1lbnQgZXByRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInRvT006IEZhY3RvcnksICIgKyBmYWN0b3J5KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidG9PTTogRW5kcG9pbnQgcmVmZXJlbmNlLCAiICsgZXByKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidG9PTTogRWxlbWVudCBxbmFtZSwgIiArIHFuYW1lKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidG9PTTogQWRkcmVzc2luZyBuYW1lc3BhY2UsICIgKyBhZGRyZXNzaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhZGRyZXNzaW5nTmFtZXNwYWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkFkZHJlc3NpbmcgbmFtZXNwYWNlIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHFuYW1lLmdldFByZWZpeCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdyYXBOcyA9Ci0gICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGlmIChmYWN0b3J5IGluc3RhbmNlb2YgU09BUEZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBlcHJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoU09BUEZhY3RvcnkpIGZhY3RvcnkpLmNyZWF0ZVNPQVBIZWFkZXJCbG9jayhxbmFtZS5nZXRMb2NhbFBhcnQoKSwgd3JhcE5zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXByRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KHFuYW1lLmdldExvY2FsUGFydCgpLCB3cmFwTnMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2FOUyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9ERUZBVUxUX1BSRUZJWCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgYWRkcmVzc0UgPQotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTLCB3c2FOUywgZXByRWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzcyA9IGVwci5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICBhZGRyZXNzRS5zZXRUZXh0KGFkZHJlc3MpOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgYWRkcmVzc0F0dHJpYnV0ZXMgPSBlcHIuZ2V0QWRkcmVzc0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgYXR0ckl0ZXIgPSBhZGRyZXNzQXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRySXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGF0dHJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSGVscGVyLmltcG9ydE9NQXR0cmlidXRlKG9tQXR0cmlidXRlLCBhZGRyZXNzRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0IG1ldGFEYXRhID0gZXByLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgICAgICBpZiAobWV0YURhdGEgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG1ldGFkYXRhRSA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTUVUQURBVEEsIHdzYU5TLCBlcHJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IG1ldGFEYXRhLnNpemUoKTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgbWV0YURhdGEuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUUuYWRkQ2hpbGQoRWxlbWVudEhlbHBlci5pbXBvcnRPTUVsZW1lbnQob21FbGVtZW50LCBmYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhQXR0cmlidXRlcyA9IGVwci5nZXRNZXRhZGF0YUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFBdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgYXR0ckl0ZXIgPSBtZXRhZGF0YUF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGF0dHJJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb21BdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGF0dHJJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUhlbHBlci5pbXBvcnRPTUF0dHJpYnV0ZShvbUF0dHJpYnV0ZSwgbWV0YWRhdGFFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICBNYXAgcmVmZXJlbmNlUGFyYW1ldGVycyA9IGVwci5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHJlZlBhcmFtZXRlckVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX1JFRkVSRU5DRV9QQVJBTUVURVJTLCB3c2FOUywgZXByRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSByZWZlcmVuY2VQYXJhbWV0ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICByZWZQYXJhbWV0ZXJFbGVtZW50LmFkZENoaWxkKEVsZW1lbnRIZWxwZXIuaW1wb3J0T01FbGVtZW50KG9tRWxlbWVudCwgZmFjdG9yeSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZXByLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSGVscGVyLmltcG9ydE9NQXR0cmlidXRlKG9tQXR0cmlidXRlLCBlcHJFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB4czphbnkKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJsZUVsZW1lbnRzID0gZXByLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2libGVFbGVtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBleHRlbnNpYmxlRWxlbWVudHMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBleHRlbnNpYmxlRWxlbWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBlcHJFbGVtZW50LmFkZENoaWxkKEVsZW1lbnRIZWxwZXIuaW1wb3J0T01FbGVtZW50KG9tRWxlbWVudCwgZmFjdG9yeSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoInByZWZpeCBtdXN0IGJlIHNwZWNpZmllZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVwckVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9tT00oRW5kcG9pbnRSZWZlcmVuY2UgZXByLCBPTUVsZW1lbnQgZXByT01FbGVtZW50LCBNYXAgbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGaW5hbEFkZHJlc3NpbmdOYW1lc3BhY2UpIHsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRFbGVtZW50cyA9IGVwck9NRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgd2hpbGUgKGNoaWxkRWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZXByQ2hpbGRFbGVtZW50ID0gKE9NRWxlbWVudCkgY2hpbGRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IGVwckNoaWxkRWxlbWVudC5nZXRRTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAobWFwLmdldChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9BRERSRVNTKS5lcXVhbHMocW5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy9XZSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBhZGRyZXNzIGVsZW1lbnQgYWdhaW4gaW4gb3JkZXIgdG8gZW5zdXJlCi0gICAgICAgICAgICAgICAgLy90aGF0IGl0IGlzIG5vdCBpbmNsdWRlZCB3aXRoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIGVwci5zZXRBZGRyZXNzKGVwckNoaWxkRWxlbWVudC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGFsbEFkZHJBdHRyaWJ1dGVzID0gZXByQ2hpbGRFbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgYWRkcmVzc0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGFsbEFkZHJBdHRyaWJ1dGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGFsbEFkZHJBdHRyaWJ1dGVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzc0F0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVwci5zZXRBZGRyZXNzQXR0cmlidXRlcyhhZGRyZXNzQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1hcC5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMpLmVxdWFscyhxbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVwckNoaWxkRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmCi0gICAgICAgICAgICAgICAgICAgIG1hcC5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTUVUQURBVEEpLmVxdWFscyhxbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVwckNoaWxkRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPTU5vZGUgbm9kZSA9IChPTU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZXByLmFkZE1ldGFEYXRhKG5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhbGxNREF0dHJpYnV0ZXMgPSBlcHJDaGlsZEVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBtZXRhZGF0YUF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGFsbE1EQXR0cmlidXRlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgYXR0cmlidXRlID0gKE9NQXR0cmlidXRlKSBhbGxNREF0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVwci5zZXRNZXRhZGF0YUF0dHJpYnV0ZXMobWV0YWRhdGFBdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRmluYWxBZGRyZXNzaW5nTmFtZXNwYWNlICYmCi0gICAgICAgICAgICAgICAgICAgIG1hcC5nZXQoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLkVQUl9SRUZFUkVOQ0VfUFJPUEVSVElFUykuZXF1YWxzKHFuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBoYXZlIHRoZSBtb2RlbCBmb3IgV1MtRmluYWwsIHdlIGRvbid0IGhhdmUgYSBwbGFjZSB0byBrZWVwIHRoaXMgcmVmZXJlbmNlIHByb3BlcnRpZXMuCi0gICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgY29tcGF0aWJsZSBwbGFjZSBpcyByZWZlcmVuY2UgcHJvcGVydGllcwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXByQ2hpbGRFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXByLmFkZEV4dGVuc2libGVFbGVtZW50KGVwckNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzID0gZXByT01FbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgd2hpbGUgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIGF0dHJpYnV0ZXMubmV4dCgpOwotICAgICAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImZyb21PTTogRW5kcG9pbnQgcmVmZXJlbmNlLCAiICsgZXByKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFdTLUFkZHJlc3NpbmcgRVBSIFNlcnZpY2VOYW1lIGVsZW1lbnQgZnJvbSBhbiBFUFIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVwciB0aGUgRVBSIHRvIHJldHJpZXZlIHRoZSBlbGVtZW50IGZyb20KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSB0aGUgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhlIEVQUi4KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIDxjb2RlPlNlcnZpY2VOYW1lPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcwotICAgICAqIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlTmFtZSBnZXRTZXJ2aWNlTmFtZU1ldGFkYXRhKEVuZHBvaW50UmVmZXJlbmNlIGVwciwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTZXJ2aWNlTmFtZSBzZXJ2aWNlTmFtZSA9IG5ldyBTZXJ2aWNlTmFtZSgpOwotICAgICAgICBMaXN0IGVsZW1lbnRzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMoYWRkcmVzc2luZ05hbWVzcGFjZSkpCi0gICAgICAgICAgICBlbGVtZW50cyA9IGVwci5nZXRFeHRlbnNpYmxlRWxlbWVudHMoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWxlbWVudHMgPSBlcHIuZ2V0TWV0YURhdGEoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL1JldHJpZXZlIHRoZSBzZXJ2aWNlIG5hbWUgYW5kIGVuZHBvaW50IG5hbWUuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFNlcnZpY2VOYW1lLmlzU2VydmljZU5hbWVFbGVtZW50KG9tRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUuZnJvbU9NKG9tRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFdTLUFkZHJlc3NpbmcgRVBSIFBvcnRUeXBlLCBvciBJbnRlcmZhY2VOYW1lLCBlbGVtZW50IGZyb20gYW4gRVBSLAotICAgICAqIGFzIGFwcHJvcHJpYXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBlcHIgdGhlIEVQUiB0byByZXRyaWV2ZSB0aGUgZWxlbWVudCBmcm9tCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIHRoZSBFUFIuCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JbnRlcmZhY2VOYW1lPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcwotICAgICAqIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbnRlcmZhY2VOYW1lIGdldEludGVyZmFjZU5hbWVNZXRhZGF0YShFbmRwb2ludFJlZmVyZW5jZSBlcHIsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSW50ZXJmYWNlTmFtZSBpbnRlcmZhY2VOYW1lID0gbmV3IEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgTGlzdCBlbGVtZW50cyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKGFkZHJlc3NpbmdOYW1lc3BhY2UpKQotICAgICAgICAgICAgZWxlbWVudHMgPSBlcHIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVsZW1lbnRzID0gZXByLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9SZXRyaWV2ZSB0aGUgc2VydmljZSBuYW1lIGFuZCBlbmRwb2ludCBuYW1lLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBlbGVtZW50cy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChJbnRlcmZhY2VOYW1lLmlzSW50ZXJmYWNlTmFtZUVsZW1lbnQob21FbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lLmZyb21PTShvbUVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpbnRlcmZhY2VOYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHdzZGxpOndzZGxMb2NhdGlvbiBhdHRyaWJ1dGUgZnJvbSBhbiBFUFIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVwciB0aGUgRVBSIHRvIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgZnJvbQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiB0aGUgRVBSLgotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgPGNvZGU+V1NETExvY2F0aW9uPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcwotICAgICAqIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXU0RMTG9jYXRpb24gZ2V0V1NETExvY2F0aW9uTWV0YWRhdGEoRW5kcG9pbnRSZWZlcmVuY2UgZXByLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFdTRExMb2NhdGlvbiB3c2RsTG9jYXRpb24gPSBuZXcgV1NETExvY2F0aW9uKCk7Ci0gICAgICAgIExpc3QgYXR0cmlidXRlcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBlcHIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gZXByLmdldE1ldGFkYXRhQXR0cmlidXRlcygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9SZXRyaWV2ZSB0aGUgd3NkbCBsb2NhdGlvbi4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gYXR0cmlidXRlcy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBvbUF0dHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFdTRExMb2NhdGlvbi5pc1dTRExMb2NhdGlvbkF0dHJpYnV0ZShvbUF0dHJpYnV0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uLmZyb21PTShvbUF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGluc3RhbmNlIG9mIDxjb2RlPlNlcnZpY2VOYW1lPC9jb2RlPiBhcyBtZXRhZGF0YSB0byB0aGUgc3BlY2lmaWVkIEVQUi4KLSAgICAgKiBUaGUgbWV0YWRhdGEgaXMgbWFwcGVkIHRvIGEgV1MtQWRkcmVzc2luZyBFUFIgU2VydmljZU5hbWUgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmFjdG9yeSBhbiA8Y29kZT5PTUZhY3Rvcnk8L2NvZGU+Ci0gICAgICogQHBhcmFtIGVwciB0aGUgRVBSIHRvIHJldHJpZXZlIHRoZSBhdHRyaWJ1dGUgZnJvbQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nTmFtZXNwYWNlIHRoZSBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiB0aGUgRVBSLgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5TZXJ2aWNlTmFtZTwvY29kZT4gdGhhdCBjb250YWlucyB0aGUKLSAgICAgKiBtZXRhZGF0YQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZpY2VOYW1lTWV0YWRhdGEoT01GYWN0b3J5IGZhY3RvcnksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsIFNlcnZpY2VOYW1lIHNlcnZpY2VOYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IHNlcnZpY2VOYW1lLnRvT00oZmFjdG9yeSwgU2VydmljZU5hbWUuc3ViUU5hbWUpOwotICAgICAgICAgICAgZXByLmFkZEV4dGVuc2libGVFbGVtZW50KG9tRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gc2VydmljZU5hbWUudG9PTShmYWN0b3J5LCBTZXJ2aWNlTmFtZS53c2FtUU5hbWUpOwotICAgICAgICAgICAgZXByLmFkZE1ldGFEYXRhKG9tRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkludGVyZmFjZU5hbWU8L2NvZGU+IGFzIG1ldGFkYXRhIHRvIHRoZSBzcGVjaWZpZWQgRVBSLgotICAgICAqIFRoZSBtZXRhZGF0YSBpcyBtYXBwZWQgdG8gYSBXUy1BZGRyZXNzaW5nIEVQUiBQb3J0VHlwZSBvciBJbnRlcmZhY2VOYW1lIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGZhY3RvcnkgYW4gPGNvZGU+T01GYWN0b3J5PC9jb2RlPgotICAgICAqIEBwYXJhbSBlcHIgdGhlIEVQUiB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIGZyb20KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSB0aGUgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoCi0gICAgICogdGhlIEVQUi4KLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBhbiBpbnN0YW5jZSBvZiA8Y29kZT5JbnRlcmZhY2VOYW1lPC9jb2RlPiB0aGF0IGNvbnRhaW5zIHRoZQotICAgICAqIG1ldGFkYXRhCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEludGVyZmFjZU5hbWVNZXRhZGF0YShPTUZhY3RvcnkgZmFjdG9yeSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLCBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwgSW50ZXJmYWNlTmFtZSBpbnRlcmZhY2VOYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGludGVyZmFjZU5hbWUudG9PTShmYWN0b3J5LCBJbnRlcmZhY2VOYW1lLnN1YlFOYW1lKTsKLSAgICAgICAgICAgIGVwci5hZGRFeHRlbnNpYmxlRWxlbWVudChvbUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGludGVyZmFjZU5hbWUudG9PTShmYWN0b3J5LCBJbnRlcmZhY2VOYW1lLndzYW1RTmFtZSk7Ci0gICAgICAgICAgICBlcHIuYWRkTWV0YURhdGEob21FbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAgLyoqCi0gICAgICAqIEFkZHMgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+V1NETExvY2F0aW9uPC9jb2RlPiBhcyBtZXRhZGF0YSB0byB0aGUgc3BlY2lmaWVkIEVQUi4KLSAgICAgICogVGhlIG1ldGFkYXRhIGlzIG1hcHBlZCB0byBhIHdzZGxpOndzZGxMb2NhdGlvbiBhdHRyaWJ1dGUuCi0gICAgICAqIAotICAgICAgKiBAcGFyYW0gZmFjdG9yeSBhbiA8Y29kZT5PTUZhY3Rvcnk8L2NvZGU+Ci0gICAgICAqIEBwYXJhbSBlcHIgdGhlIEVQUiB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlIGZyb20KLSAgICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgdGhlIFdTLUFkZHJlc3NpbmcgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aAotICAgICAgKiB0aGUgRVBSLgotICAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uIGFuIGluc3RhbmNlIG9mIDxjb2RlPldTRExMb2NhdGlvbjwvY29kZT4gdGhhdCBjb250YWlucyB0aGUKLSAgICAgICogbWV0YWRhdGEKLSAgICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFdTRExMb2NhdGlvbk1ldGFkYXRhKE9NRmFjdG9yeSBmYWN0b3J5LCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLCBXU0RMTG9jYXRpb24gd3NkbExvY2F0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01BdHRyaWJ1dGUgYXR0cmlidXRlID0gd3NkbExvY2F0aW9uLnRvT00oZmFjdG9yeSk7Ci0KLSAgICAgICAgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLmVxdWFscyhhZGRyZXNzaW5nTmFtZXNwYWNlKSkgewotICAgICAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBsaXN0LmFkZChhdHRyaWJ1dGUpOwotICAgICAgICAgICAgZXByLnNldE1ldGFkYXRhQXR0cmlidXRlcyhsaXN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBmaW5hbFFOYW1lcy5wdXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUywgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUykpOwotICAgICAgICBmaW5hbFFOYW1lcy5wdXQoQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMsIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfUkVGRVJFTkNFX1BBUkFNRVRFUlMpKTsKLSAgICAgICAgZmluYWxRTmFtZXMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX01FVEFEQVRBLCBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9NRVRBREFUQSkpOwotCi0gICAgICAgIHN1Ym1pc3Npb25RTmFtZXMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX0FERFJFU1MsIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfQUREUkVTUykpOwotICAgICAgICBzdWJtaXNzaW9uUU5hbWVzLnB1dChBZGRyZXNzaW5nQ29uc3RhbnRzLkVQUl9SRUZFUkVOQ0VfUEFSQU1FVEVSUywgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLAotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX1JFRkVSRU5DRV9QQVJBTUVURVJTKSk7Ci0gICAgICAgIHN1Ym1pc3Npb25RTmFtZXMucHV0KEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5FUFJfUkVGRVJFTkNFX1BST1BFUlRJRVMsIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwKLSAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uRVBSX1JFRkVSRU5DRV9QUk9QRVJUSUVTKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvUmVsYXRlc1RvLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9SZWxhdGVzVG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0ZGM3Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9SZWxhdGVzVG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIENsYXNzIFJlbGF0ZXNUbwotICovCi1wdWJsaWMgY2xhc3MgUmVsYXRlc1RvIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUsIFNhZmVTZXJpYWxpemFibGUgewotCi0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWxhdGVzVG8uY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlJlbGF0ZXNUbyI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTExMjAzODQzMTUzMzM0MTQ5NjBMOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUcmFja3MgdGhlIHJldmlzaW9uIGxldmVsIG9mIGEgY2xhc3MgdG8gaWRlbnRpZnkgY2hhbmdlcyB0byB0aGUKLSAgICAgKiBjbGFzcyBkZWZpbml0aW9uIHRoYXQgYXJlIGNvbXBhdGlibGUgdG8gc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24uCi0gICAgICogSWYgYSBjbGFzcyBkZWZpbml0aW9uIGNoYW5nZXMsIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSB3cml0ZUV4dGVybmFsKCkgYW5kIHJlYWRFeHRlcm5hbCgpIG1ldGhvZHMuCi0gICAgICovCi0gICAgLy8gc3VwcG9ydGVkIHJldmlzaW9uIGxldmVscywgYWRkIGEgbmV3IGxldmVsIHRvIG1hbmFnZSBjb21wYXRpYmxlIGNoYW5nZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVWSVNJT05fMiA9IDI7Ci0gICAgLy8gY3VycmVudCByZXZpc2lvbiBsZXZlbCBvZiB0aGlzIG9iamVjdAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZXZpc2lvbklEID0gUkVWSVNJT05fMjsKLQotCi0gICAgLyoqCi0gICAgICogRmllbGQgcmVsYXRpb25zaGlwVHlwZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUmVsYXRlc1RvCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0ZXNUbygpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBSZWxhdGVzVG8KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBSZWxhdGVzVG8oU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBSZWxhdGVzVG8KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSByZWxhdGlvbnNoaXBUeXBlCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0ZXNUbyhTdHJpbmcgdmFsdWUsIFN0cmluZyByZWxhdGlvbnNoaXBUeXBlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRpb25zaGlwVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0UmVsYXRpb25zaGlwVHlwZS4gSWYgdGhlIHJlbGF0aW9uc2hpcCB0eXBlIGhhcyBub3QgYmVlbiBzZXQgaXQgcmV0dXJucwotICAgICAqIHRoZSBkZWZhdWx0IHZhbHVlIHtAbGluayBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9ERUZBVUxUX1JFTEFUSU9OU0hJUF9UWVBFfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpb25zaGlwVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChyZWxhdGlvbnNoaXBUeXBlICE9IG51bGwgJiYgISIiLmVxdWFscyhyZWxhdGlvbnNoaXBUeXBlKSA/Ci0gICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwVHlwZSA6Ci0gICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFZhbHVlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzZXRSZWxhdGlvbnNoaXBUeXBlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVsYXRpb25zaGlwVHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbGF0aW9uc2hpcFR5cGUoU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUpIHsKLSAgICAgICAgdGhpcy5yZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRpb25zaGlwVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0VmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRFeHRlbnNpYmlsaXR5QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzKEFycmF5TGlzdCBleHRlbnNpYmlsaXR5QXR0cmlidXRlcykgewotICAgICAgICB0aGlzLmV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzID0gZXh0ZW5zaWJpbGl0eUF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAqICAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJJZGVudGlmaWVyOiAiICsgdmFsdWUKLSAgICAgICAgICAgICAgICArICIsIFJlbGF0aW9uc2hpcCB0eXBlOiAiICsgcmVsYXRpb25zaGlwVHlwZTsKLSAgICB9Ci0KLSAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqIEV4dGVybmFsaXphYmxlIHN1cHBvcnQKLSAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vIHdyaXRlIG91dCBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCi0gICAgICAgIC8vIE5PVEVTOiBGb3IgZWFjaCBpdGVtLCB3aGVyZSBhcHByb3ByaWF0ZSwKLSAgICAgICAgLy8gICAgICAgIHdyaXRlIG91dCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLCBJTiBPUkRFUjoKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBjbGFzcyBuYW1lCi0gICAgICAgIC8vICAgICAgICAgICB0aGUgYWN0aXZlIG9yIGVtcHR5IGZsYWcKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBkYXRhIGxlbmd0aCwgaWYgYXBwcm9wcmlhdGUKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBkYXRhICAgCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QgCi0gICAgICAgIC8vIGRlZmluaXRpb24sIGJlIHN1cmUgdG8gbWFpbnRhaW4gdGhlIAotICAgICAgICAvLyBvYmplY3QgbGV2ZWwgaWRlbnRpZmllcnMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIG91dC53cml0ZUxvbmcoc2VyaWFsVmVyc2lvblVJRCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlSW50KHJldmlzaW9uSUQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc3RyaW5ncwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFN0cmluZyByZWxhdGlvbnNoaXBUeXBlCi0gICAgICAgIG91dC53cml0ZU9iamVjdChyZWxhdGlvbnNoaXBUeXBlKTsKLQotICAgICAgICAvLyBTdHJpbmcgdmFsdWUKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHZhbHVlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBjb2xsZWN0aW9ucyBhbmQgbGlzdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlTGlzdChleHRlbnNpYmlsaXR5QXR0cmlidXRlcyk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgdGhhdCB3YXMKLSAgICAgKiBwcmV2aW91c2x5IHNhdmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUaGUgZmllbGQgZGF0YSBtdXN0IHJlYWQgYmFjayBpbiB0aGUgc2FtZSBvcmRlciBhbmQgdHlwZQotICAgICAqIGFzIGl0IHdhcyB3cml0dGVuLiAgU29tZSBkYXRhIHdpbGwgbmVlZCB0byBiZSB2YWxpZGF0ZWQgd2hlbgotICAgICAqIHJlc3VycmVjdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIFRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgb2JqZWN0IGNvbnRlbnRzIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9iamVjdCk7Ci0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc3RyaW5ncwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFN0cmluZyByZWxhdGlvbnNoaXBUeXBlCi0gICAgICAgIHJlbGF0aW9uc2hpcFR5cGUgPSAoU3RyaW5nKWluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBTdHJpbmcgdmFsdWUKLSAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29sbGVjdGlvbnMgYW5kIGxpc3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gQXJyYXlMaXN0IGV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzCi0gICAgICAgIGV4dGVuc2liaWxpdHlBdHRyaWJ1dGVzID0gaW4ucmVhZEFycmF5TGlzdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvaTE4bi9BZGRyZXNzaW5nTWVzc2FnZXMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL2kxOG4vQWRkcmVzc2luZ01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODhjY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvaTE4bi9BZGRyZXNzaW5nTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5pMThuOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZUJ1bmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXNDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgc2FtZSBidXQganVzdCB0aGlzQ2xhc3Mgc3RhdGljCi0gKiAgICAgIHJlZmVyZW5jZSBoYXMgQWRkcmVzc2luZ01lc3NhZ2VzLmNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nTWVzc2FnZXMgewotCi0gICAgLy9Pbmx5IHRoaXMgY2hhbmdlcyBmcm9tIHRoZSBvcmlnaW5hbCBjbGFzcwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzPEFkZHJlc3NpbmdNZXNzYWdlcz4gdGhpc0NsYXNzID0gQWRkcmVzc2luZ01lc3NhZ2VzLmNsYXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gTWVzc2FnZXNDb25zdGFudHMucHJvamVjdE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gTWVzc2FnZXNDb25zdGFudHMucmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBNZXNzYWdlc0NvbnN0YW50cy5sb2NhbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlKHRoaXNDbGFzcy5nZXROYW1lKCkpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gdGhpc0NsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQgPQotICAgICAgICAgICAgKE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RQYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKQotICAgICAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICAgICAgOiBNZXNzYWdlc0NvbnN0YW50cy5yb290QnVuZGxlOwotCi0KLSAgICAvKiogKiBOTyBORUVEIFRPIENIQU5HRSBBTllUSElORyBCRUxPVyAqKioqICovCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPQotICAgICAgICAgICAgbmV3IE1lc3NhZ2VCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsIGNsYXNzTG9hZGVyLCBwYXJlbnQpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQnVuZGxlIGdldE1lc3NhZ2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpLmludGVybigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvaTE4bi9yZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjAzNjdlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUcmFuc2xhdGlvbiBpbnN0cnVjdGlvbnMuCi0jIDEuICBFYWNoIG1lc3NhZ2UgbGluZSBpcyBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuCi0jICAgICBUcmFuc2xhdGUgdGhlIHZhbHVlLCBETyBOT1QgdHJhbnNsYXRlIHRoZSBrZXkuCi0jIDIuICBUaGUgbWVzc2FnZXMgbWF5IGNvbnRhaW4gYXJndW1lbnRzIHRoYXQgd2lsbCBiZSBmaWxsZWQgaW4KLSMgICAgIGJ5IHRoZSBydW50aW1lLiAgVGhlc2UgYXJlIG9mIHRoZSBmb3JtOiB7MH0sIHsxfSwgZXRjLgotIyAgICAgVGhlc2UgbXVzdCBhcHBlYXIgYXMgaXMgaW4gdGhlIG1lc3NhZ2UsIHRob3VnaCB0aGUgb3JkZXIKLSMgICAgIG1heSBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQgcHJvcGVyIGxhbmd1YWdlIHN5bnRheC4KLSMgMy4gIElmIGEgc2luZ2xlIHF1b3RlIGNoYXJhY3RlciBpcyB0byBhcHBlYXIgaW4gdGhlIHJlc3VsdGluZwotIyAgICAgbWVzc2FnZSwgaXQgbXVzdCBhcHBlYXIgaW4gdGhpcyBmaWxlIGFzIHR3byBjb25zZWN1dGl2ZQotIyAgICAgc2luZ2xlIHF1b3RlIGNoYXJhY3RlcnMuCi0jIDQuICBMaW5lcyBiZWdpbm5pbmcgd2l0aCAiIyIgKGxpa2UgdGhpcyBvbmUpIGFyZSBjb21tZW50IGxpbmVzCi0jICAgICBhbmQgbWF5IGNvbnRhaW4gdHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLiAgVGhleSBuZWVkIG5vdCBiZQotIyAgICAgdHJhbnNsYXRlZCB1bmxlc3MgeW91ciB0cmFuc2xhdGVkIGZpbGUsIHJhdGhlciB0aGFuIHRoaXMgZmlsZSwKLSMgICAgIHdpbGwgc2VydmUgYXMgYSBiYXNlIGZvciBvdGhlciB0cmFuc2xhdG9ycy4KLQotb3V0Ym91bmROb0FjdGlvbj1VbmFibGUgdG8gZGV0ZXJtaW5lIHdzYTpBY3Rpb24gZm9yIG91dGJvdW5kIG1lc3NhZ2UKLXJlZmVyZW5jZVBhcmFtZXRlckVycm9yPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gYWRkIGEgcmVmZXJlbmNlIHBhcmFtZXRlciBhcyBhIFNPQVAgaGVhZGVyLgotCi1zcGVjaWZpY0ludmFsaWRBZGRyZXNzaW5nSGVhZGVyPVRoZSBzZXJ2ZXIgZmFpbGVkIHRvIHByb2Nlc3MgdGhlIFdTLUFkZHJlc3NpbmcgaGVhZGVyOiB7MH0gW1JlYXNvbl06IEEgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQKLWludmFsaWRBZGRyZXNzaW5nSGVhZGVyPVRoZSBzZXJ2ZXIgZmFpbGVkIHRvIHByb2Nlc3Mgb25lIG9mIHRoZSBXUy1BZGRyZXNzaW5nIGhlYWRlcnMuIFtSZWFzb25dOiBBIGhlYWRlciByZXByZXNlbnRpbmcgYSBNZXNzYWdlIEFkZHJlc3NpbmcgUHJvcGVydHkgaXMgbm90IHZhbGlkIGFuZCB0aGUgbWVzc2FnZSBjYW5ub3QgYmUgcHJvY2Vzc2VkCi1zcGVjaWZpY0ludmFsaWRDYXJkaW5hbGl0eT1UaGUgc2VydmVyIHJlY2VpdmVkIG1vcmUgdGhhbiBvbmUgezB9IFdTLUFkZHJlc3NpbmcgaGVhZGVyCi1pbnZhbGlkQ2FyZGluYWxpdHk9PVRoZSBzZXJ2ZXIgcmVjZWl2ZWQgbW9yZSBjb3BpZXMgb2YgYSBXUy1BZGRyZXNzaW5nIGhlYWRlciB0aGFuIGV4cGVjdGVkCi1zcGVjaWZpY01pc3NpbmdBZGRyZXNzSW5FUFI9QSB7MH0gaGVhZGVyIHdhcyBleHBlY3RlZCB0byBiZSBhbiBFUFIgYnV0IGRpZCBub3QgY29udGFpbiBhbiBbYWRkcmVzc10uCi1taXNzaW5nQWRkcmVzc0luRVBSPUEgV1MtQWRkcmVzc2luZyBoZWFkZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGFuIEVQUiBidXQgZGlkIG5vdCBjb250YWluIGFuIFthZGRyZXNzXS4KLWR1cGxpY2F0ZU1lc3NhZ2VJRD1UaGUgc2VydmVyIHJlamVjdGVkIHRoZSBtZXNzYWdlIGJlY2F1c2UgaXQgaGFkIGEgV1MtQWRkcmVzc2luZyBNZXNzYWdlSUQgd2hpY2ggaXQgaGFkIHByb2Nlc3NlZCBwcmV2aW91c2x5LgotYWN0aW9uTWlzbWF0Y2g9V1MtQWRkcmVzc2luZyBGYXVsdDogVGhlIFNPQVBBY3Rpb24gYW5kIHdzYTpBY3Rpb24gcmVjZWl2ZWQgYnkgdGhlIHNlcnZlciBkaWQgbm90IG1hdGNoLgotc3BlY2lmaWNPbmx5QW5vbnltb3VzU3VwcG9ydGVkPVRoZSB7MH0gaGVhZGVyIGNvbnRhaW5lZCBhIG5vbi1hbm9ueW1vdXMgW2FkZHJlc3NdIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KLW9ubHlBbm9ueW1vdXNTdXBwb3J0ZWQ9QSBXUy1BZGRyZXNzaW5nIGhlYWRlciBjb250YWluZWQgYSBub24tYW5vbnltb3VzIFthZGRyZXNzXSB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuCi1zcGVjaWZpY09ubHlOb25Bbm9uU3VwcG9ydGVkPVRoZSB7MH0gaGVhZGVyIGNvbnRhaW5lZCBhbiBhbm9ueW1vdXMgW2FkZHJlc3NdIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KLW9ubHlOb25Bbm9uU3VwcG9ydGVkPUEgV1MtQWRkcmVzc2luZyBoZWFkZXIgY29udGFpbmVkIGFuIGFub255bW91cyBbYWRkcmVzc10gd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgotc3BlY2lmaWNBZGRyZXNzaW5nSGVhZGVyUmVxdWlyZWQ9VGhlIHswfSBoZWFkZXIgaXMgcmVxdWlyZWQgd2hlbiBXUy1BZGRyZXNzaW5nIGlzIGluIHVzZSBidXQgd2FzIG5vdCBzZW50LgotYWRkcmVzc2luZ0hlYWRlclJlcXVpcmVkPUEgV1MtQWRkcmVzc2luZyBoZWFkZXIgd2hpY2ggaXMgcmVxdWlyZWQgd2hlbiBXUy1BZGRyZXNzaW5nIGlzIGluIHVzZSB3YXMgbm90IHNlbnQuCi1zcGVjaWZpY0Rlc3RpbmF0aW9uVW5yZWFjaGFibGU9VGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBXUy1BZGRyZXNzaW5nIFRvIEVQUiB3aXRoIGFkZHJlc3MgezB9IGNhbm5vdCBiZSByZWFjaGVkLgotZGVzdGluYXRpb25VbnJlYWNoYWJsZT1UaGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIFdTLUFkZHJlc3NpbmcgVG8gRVBSIGNhbm5vdCBiZSByZWFjaGVkLgotc3BlY2lmaWNBY3Rpb25Ob3RSZWNvZ25pc2VkPVRoZSBzZXJ2ZXIgZGlkIG5vdCByZWNvZ25pc2UgdGhlIGFjdGlvbiB3aGljaCBpdCByZWNlaXZlZDogezB9Ci1hY3Rpb25Ob3RSZWNvZ25pc2VkPVRoZSBzZXJ2ZXIgZGlkIG5vdCByZWNvZ25pc2UgdGhlIGFjdGlvbiB3aGljaCBpdCByZWNlaXZlZC4KLQotIyBTcGVjIEZhdWx0IFN0cmluZ3MgLSBETyBOT1QgTkxTIHdpdGhvdXQgY29udGFjdGluZyBkZXZlbG9wZXJzIGZvciBhZHZpY2UKLXNwZWMuRkFVTFRfQUNUSU9OX05PVF9TVVBQT1JURURfUkVBU09OPVRoZSBbYWN0aW9uXSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGF0IHRoZSByZWNlaXZlci4KLXNwZWMuZmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OPUEgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQKLXNwZWMuZmluYWwuRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRURfUkVBU09OPUEgcmVxdWlyZWQgaGVhZGVyIHJlcHJlc2VudGluZyBhIE1lc3NhZ2UgQWRkcmVzc2luZyBQcm9wZXJ0eSBpcyBub3QgcHJlc2VudAotc3BlYy5maW5hbC5GQVVMVF9BRERSRVNTSU5HX0RFU1RJTkFUSU9OX1VOUkVBQ0hBQkxFX1JFQVNPTj1ObyByb3V0ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0byByZWFjaCBbZGVzdGluYXRpb25dCi1zcGVjLnN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRV9SRUFTT049Tm8gcm91dGUgY2FuIGJlIGRldGVybWluZWQgdG8gcmVhY2ggdGhlIGRlc3RpbmF0aW9uIHJvbGUgZGVmaW5lZCBieSB0aGUgV1MtQWRkcmVzc2luZyBUby4KLXNwZWMuc3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT049QSBtZXNzYWdlIGluZm9ybWF0aW9uIGhlYWRlciBpcyBub3QgdmFsaWQgYW5kIHRoZSBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQuIFRoZSB2YWxpZGl0eSBmYWlsdXJlIGNhbiBiZSBlaXRoZXIgc3RydWN0dXJhbCBvciBzZW1hbnRpYywgZS5nLiBhIFtkZXN0aW5hdGlvbl0gdGhhdCBpcyBub3QgYSBVUkkgb3IgYSBbcmVsYXRpb25zaGlwXSB0byBhIFttZXNzYWdlIGlkXSB0aGF0IHdhcyBuZXZlciBpc3N1ZWQuCi1zcGVjLnN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRURfUkVBU09OPUEgcmVxdWlyZWQgbWVzc2FnZSBpbmZvcm1hdGlvbiBoZWFkZXIsIFRvLCBNZXNzYWdlSUQsIG9yIEFjdGlvbiwgaXMgbm90IHByZXNlbnQuCi0gICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL0ludGVyZmFjZU5hbWUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL0ludGVyZmFjZU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyNmIwNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9tZXRhZGF0YS9JbnRlcmZhY2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotcHVibGljIGNsYXNzIEludGVyZmFjZU5hbWUgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHN1YlFOYW1lID0gbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgU3VibWlzc2lvbi5XU0FfSU5URVJGQUNFX05BTUUsIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSB3c2FtUU5hbWUgPSBuZXcgUU5hbWUoRmluYWwuV1NBTV9OQU1FU1BBQ0UsIEZpbmFsLldTQV9JTlRFUkZBQ0VfTkFNRSwgRmluYWwuV1NBX0RFRkFVTFRfTUVUQURBVEFfUFJFRklYKTsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSB3c2F3UU5hbWUgPSBuZXcgUU5hbWUoRmluYWwuV1NBV19OQU1FU1BBQ0UsIEZpbmFsLldTQV9JTlRFUkZBQ0VfTkFNRSwgRmluYWwuV1NBX09SSUdJTkFMX01FVEFEQVRBX1BSRUZJWCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRmllbGQgbmFtZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBRTmFtZSBuYW1lOw0KLQ0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBwdWJsaWMgSW50ZXJmYWNlTmFtZSgpIHsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIG5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBJbnRlcmZhY2VOYW1lKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1ldGhvZCBnZXROYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXRob2Qgc2V0TmFtZQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKSB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgb2JqZWN0cyBvZiB0aGlzIHR5cGUgdG8gYW4ge0BsaW5rIE9NRWxlbWVudH0gc28gdGhhdCBpdA0KLSAgICAgKiBjYW4gYmUgYWRkZWQgdG8gYW4ge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZX0NCi0gICAgICogDQotICAgICAqIDxwPlVzZTo8L3A+DQotICAgICAqIDxwPg0KLSAgICAgKiBPTUVsZW1lbnQgb21FbGVtZW50ID0NCi0gICAgICogc2VydmljZU5hbWUudG9PTShuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIsICJQb3J0VHlwZSIsICJ3c2EiKSk7DQotICAgICAqIDwvcD4NCi0gICAgICogPHA+b3I8L3A+DQotICAgICAqIDxwPg0KLSAgICAgKiBPTUVsZW1lbnQgb21FbGVtZW50ID0NCi0gICAgICogc2VydmljZU5hbWUudG9PTShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDUvYWRkcmVzc2luZy9tZXRhZGF0YSIsICJJbnRlcmZhY2VOYW1lIiwgIndzYW0iKSk7DQotICAgICAqIDwvcD4NCi0gICAgICogPHA+DQotICAgICAqIHRoZSBkaWZmZXJlbmNlIGJlaW5nIHdoZXRoZXIgdGhlIEVuZHBvaW50UmVmZXJlbmNlIGlzIG1lYW50IHRvIHJlcHJlc2VudCBhIDIwMDQvMDgNCi0gICAgICogKFN1Ym1pc3Npb24pIG9yIDIwMDUvMDggKEZpbmFsKSBFbmRwb2ludFJlZmVyZW5jZSwgcmVzcGVjdGl2ZWx5Lg0KLSAgICAgKiA8L3A+DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcW5hbWUgdGhlIDxjb2RlPlFOYW1lPC9jb2RlPiB0aGF0IGNhcnJpZXMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgbWV0YWRhdGEgZWxlbWVudC4NCi0gICAgICogQHBhcmFtIGZhYyBUT0RPDQotICAgICAqIEByZXR1cm4gYW4gT01FbGVtZW50IHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBtZXRhZGF0YSBvZiBhbiBFbmRwb2ludFJlZmVyZW5jZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBPTUVsZW1lbnQgdG9PTShPTUZhY3RvcnkgZmFjLCBRTmFtZSBxbmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gcW5hbWUuZ2V0UHJlZml4KCk7DQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgcHJlZml4IGNhbm5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICBpZiAoIUZpbmFsLldTQV9JTlRFUkZBQ0VfTkFNRS5lcXVhbHMobG9jYWxOYW1lKSAmJiAhU3VibWlzc2lvbi5XU0FfSU5URVJGQUNFX05BTUUuZXF1YWxzKGxvY2FsTmFtZSkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgbG9jYWwgbmFtZSBtdXN0IGJlICdJbnRlcmZhY2VOYW1lJyBvciAnUG9ydFR5cGUnLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgbmFtZXNwYWNlIGNhbm90IGJlIG51bGwuIik7DQotICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICBPTU5hbWVzcGFjZSBtZXRhZGF0YU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgcHJlZml4KTsNCi0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUsIG1ldGFkYXRhTnMpOw0KLSAgICAgICAgZWxlbWVudC5zZXRUZXh0KG5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIGFuIGVsZW1lbnQuDQotICAgICAqIA0KLSAgICAgKiA8cD4NCi0gICAgICogJmx0O3dzYW06SW50ZXJmYWNlTmFtZSB4bWxuczp3c2FtPSJodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA1L2FkZHJlc3NpbmcvbWV0YWRhdGEiJmd0Oy4uLiZsdDsvd3NhbTpTZXJ2aWNlTmFtZSZndDsNCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD5vcjwvcD4NCi0gICAgICogPHA+DQotICAgICAqICZsdDt3c2E6UG9ydFR5cGUgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciJmd0Oy4uLiZsdDsvd3NhOlNlcnZpY2VOYW1lJmd0Ow0KLSAgICAgKiA8L3A+DQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb21FbGVtZW50IHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHRoYXQgaG9sZHMgdGhlIG1ldGFkYXRhLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZnJvbU9NKE9NRWxlbWVudCBvbUVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgew0KLSAgICAgICAgUU5hbWUgcW5hbWUgPSBvbUVsZW1lbnQuZ2V0UU5hbWUoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKCF3c2FtUU5hbWUuZXF1YWxzKHFuYW1lKSAmJiAhd3Nhd1FOYW1lLmVxdWFscyhxbmFtZSkgJiYgIXN1YlFOYW1lLmVxdWFscyhxbmFtZSkpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbnJlY29nbml6ZWQgZWxlbWVudC4iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIG5hbWUgPSBvbUVsZW1lbnQuZ2V0VGV4dEFzUU5hbWUoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFN0YXRpYyBtZXRob2QgdG8gdGVzdCB3aGV0aGVyIGFuIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gaXMgcmVjb2duaXplZA0KLSAgICAgKiBhcyBhIFNlcnZpY2VOYW1lIGVsZW1lbnQuIElmIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlbg0KLSAgICAgKiB7QGxpbmsgI2Zyb21PTShPTUVsZW1lbnQpfSBpcyBndWFyYW50ZWVkIG5vdCB0byBmYWlsLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9tRWxlbWVudCB0aGUgPGNvZGU+T01FbGVtZW50PC9jb2RlPiB0byB0ZXN0Lg0KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGlzIGEgU2VydmljZU5hbWUgZWxlbWVudCwNCi0gICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZU5hbWVFbGVtZW50KE9NRWxlbWVudCBvbUVsZW1lbnQpIHsNCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotICAgICAgICBRTmFtZSBxbmFtZSA9IG9tRWxlbWVudC5nZXRRTmFtZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAod3NhbVFOYW1lLmVxdWFscyhxbmFtZSkgfHwgd3Nhd1FOYW1lLmVxdWFscyhxbmFtZSkgfHwgc3ViUU5hbWUuZXF1YWxzKHFuYW1lKSkNCi0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL1NlcnZpY2VOYW1lLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9tZXRhZGF0YS9TZXJ2aWNlTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzUzYzBjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21ldGFkYXRhL1NlcnZpY2VOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLm1ldGFkYXRhOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb247DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotcHVibGljIGNsYXNzIFNlcnZpY2VOYW1lIHsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBzdWJRTmFtZSA9IG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIEFkZHJlc3NpbmdDb25zdGFudHMuRVBSX1NFUlZJQ0VfTkFNRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfREVGQVVMVF9QUkVGSVgpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHdzYW1RTmFtZSA9IG5ldyBRTmFtZShGaW5hbC5XU0FNX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfU0VSVklDRV9OQU1FLCBGaW5hbC5XU0FfREVGQVVMVF9NRVRBREFUQV9QUkVGSVgpOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIHdzYXdRTmFtZSA9IG5ldyBRTmFtZShGaW5hbC5XU0FXX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5FUFJfU0VSVklDRV9OQU1FLCBGaW5hbC5XU0FfT1JJR0lOQUxfTUVUQURBVEFfUFJFRklYKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaWVsZCBuYW1lDQotICAgICAqLw0KLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7DQotDQotICAgIC8qKg0KLSAgICAgKiBGaWVsZCBwb3J0TmFtZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnROYW1lOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIFNlcnZpY2VOYW1lKCkgew0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gbmFtZQ0KLSAgICAgKi8NCi0gICAgcHVibGljIFNlcnZpY2VOYW1lKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBuYW1lDQotICAgICAqIEBwYXJhbSBlbmRwb2ludE5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBTZXJ2aWNlTmFtZShRTmFtZSBuYW1lLCBTdHJpbmcgZW5kcG9pbnROYW1lKSB7DQotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOw0KLSAgICAgICAgdGhpcy5lbmRwb2ludE5hbWUgPSBlbmRwb2ludE5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIE1ldGhvZCBnZXROYW1lDQotICAgICAqLw0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBNZXRob2QgZ2V0UG9ydE5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGVuZHBvaW50TmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWV0aG9kIHNldE5hbWUNCi0gICAgICoNCi0gICAgICogQHBhcmFtIG5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogTWV0aG9kIHNldFBvcnROYW1lDQotICAgICAqDQotICAgICAqIEBwYXJhbSBlbmRwb2ludE5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50TmFtZShTdHJpbmcgZW5kcG9pbnROYW1lKSB7DQotICAgICAgICB0aGlzLmVuZHBvaW50TmFtZSA9IGVuZHBvaW50TmFtZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IG9iamVjdHMgb2YgdGhpcyB0eXBlIHRvIGFuIHtAbGluayBPTUVsZW1lbnR9IHNvIHRoYXQgaXQNCi0gICAgICogY2FuIGJlIGFkZGVkIHRvIGFuIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2V9DQotICAgICAqIA0KLSAgICAgKiA8cD5Vc2U6PC9wPg0KLSAgICAgKiA8cD4NCi0gICAgICogT01FbGVtZW50IG9tRWxlbWVudCA9DQotICAgICAqIHNlcnZpY2VOYW1lLnRvT00obmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciLCAiU2VydmljZU5hbWUiLCAid3NhIikpOw0KLSAgICAgKiA8L3A+DQotICAgICAqIDxwPm9yPC9wPg0KLSAgICAgKiA8cD4NCi0gICAgICogT01FbGVtZW50IG9tRWxlbWVudCA9DQotICAgICAqIHNlcnZpY2VOYW1lLnRvT00obmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA1L2FkZHJlc3NpbmcvbWV0YWRhdGEiLCAiU2VydmljZU5hbWUiLCAid3NhbSIpKTsNCi0gICAgICogPC9wPg0KLSAgICAgKiA8cD4NCi0gICAgICogdGhlIGRpZmZlcmVuY2UgYmVpbmcgd2hldGhlciB0aGUgRW5kcG9pbnRSZWZlcmVuY2UgaXMgbWVhbnQgdG8gcmVwcmVzZW50IGEgMjAwNC8wOA0KLSAgICAgKiAoU3VibWlzc2lvbikgb3IgMjAwNS8wOCAoRmluYWwpIEVuZHBvaW50UmVmZXJlbmNlLCByZXNwZWN0aXZlbHkuDQotICAgICAqIDwvcD4NCi0gICAgICogQHBhcmFtIGZhY3RvcnkgPGNvZGU+T01GYWN0b3J5PC9jb2RlPiB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIDxjb2RlPk9NRWxlbWVudDwvY29kZT5zDQotICAgICAqIEBwYXJhbSBxbmFtZSB0aGUgPGNvZGU+UU5hbWU8L2NvZGU+IHRoYXQgY2FycmllcyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtZXRhZGF0YSBlbGVtZW50Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBhbiBPTUVsZW1lbnQgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIG1ldGFkYXRhIG9mIGFuIEVuZHBvaW50UmVmZXJlbmNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9NRWxlbWVudCB0b09NKE9NRmFjdG9yeSBmYWN0b3J5LCBRTmFtZSBxbmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICBpZiAoIUFkZHJlc3NpbmdDb25zdGFudHMuRVBSX1NFUlZJQ0VfTkFNRS5lcXVhbHMobG9jYWxOYW1lKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoZSBsb2NhbCBuYW1lIG11c3QgYmUgJ1NlcnZpY2VOYW1lJy4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHFuYW1lLmdldFByZWZpeCgpOw0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGhlIHByZWZpeCBjYW5ub3QgYmUgbnVsbC4iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOw0KLSAgICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVGhlIG5hbWVzcGFjZSBjYW5vdCBiZSBudWxsLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgT01OYW1lc3BhY2UgbWV0YWRhdGFOcyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlLCBwcmVmaXgpOw0KLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUsIG1ldGFkYXRhTnMpOw0KLSAgICAgICAgZWxlbWVudC5zZXRUZXh0KG5hbWUpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoZW5kcG9pbnROYW1lICE9IG51bGwpIHsNCi0gICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9DQotICAgICAgICAgICAgICAgIFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHMobmFtZXNwYWNlKSA/DQotICAgICAgICAgICAgICAgICAgICAgICAgU3VibWlzc2lvbi5XU0FfU0VSVklDRV9OQU1FX0VORFBPSU5UX05BTUUgOiBGaW5hbC5XU0FfU0VSVklDRV9OQU1FX0VORFBPSU5UX05BTUU7DQotICAgICAgICAgICAgZWxlbWVudC5hZGRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgZW5kcG9pbnROYW1lLCBudWxsKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBlbGVtZW50Ow0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGV4dHJhY3QgbWV0YWRhdGEgZnJvbSB0aGUgU2VydmljZU5hbWUgZWxlbWVudC4NCi0gICAgICogDQotICAgICAqIDxwPg0KLSAgICAgKiAmbHQ7d3NhbTpTZXJ2aWNlTmFtZSB4bWxuczp3c2FtPSJodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA1L2FkZHJlc3NpbmcvbWV0YWRhdGEiIEVuZHBvaW50TmFtZT0iLi4uIiZndDsuLi4mbHQ7L3dzYW06U2VydmljZU5hbWUmZ3Q7DQotICAgICAqIDwvcD4NCi0gICAgICogPHA+b3I8L3A+DQotICAgICAqIDxwPg0KLSAgICAgKiAmbHQ7d3NhOlNlcnZpY2VOYW1lIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIiBQb3J0TmFtZT0iLi4uIiZndDsuLi4mbHQ7L3dzYTpTZXJ2aWNlTmFtZSZndDsNCi0gICAgICogPC9wPg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9tRWxlbWVudCB0aGUgPGNvZGU+T01FbGVtZW50PC9jb2RlPiB0aGF0IGhvbGRzIHRoZSBtZXRhZGF0YS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGZyb21PTShPTUVsZW1lbnQgb21FbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gb21FbGVtZW50LmdldFFOYW1lKCk7DQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7DQotICAgICAgICBpZiAod3NhbVFOYW1lLmVxdWFscyhxbmFtZSkgfHwgd3Nhd1FOYW1lLmVxdWFscyhxbmFtZSkpIHsNCi0gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gRmluYWwuV1NBX1NFUlZJQ0VfTkFNRV9FTkRQT0lOVF9OQU1FOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSBpZiAoc3ViUU5hbWUuZXF1YWxzKHFuYW1lKSkgew0KLSAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPSBTdWJtaXNzaW9uLldTQV9TRVJWSUNFX05BTUVfRU5EUE9JTlRfTkFNRTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlVucmVjb2duaXplZCBlbGVtZW50LiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgbmFtZSA9IG9tRWxlbWVudC5nZXRUZXh0QXNRTmFtZSgpOw0KLSAgICAgICAgZW5kcG9pbnROYW1lID0gb21FbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShhdHRyaWJ1dGVOYW1lKSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTdGF0aWMgbWV0aG9kIHRvIHRlc3Qgd2hldGhlciBhbiA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IGlzIHJlY29nbml6ZWQNCi0gICAgICogYXMgYSBTZXJ2aWNlTmFtZSBlbGVtZW50LiBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4NCi0gICAgICoge0BsaW5rICNmcm9tT00oT01FbGVtZW50KX0gaXMgZ3VhcmFudGVlZCBub3QgdG8gZmFpbC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBvbUVsZW1lbnQgdGhlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gdG8gdGVzdC4NCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBpcyBhIFNlcnZpY2VOYW1lIGVsZW1lbnQsDQotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2aWNlTmFtZUVsZW1lbnQoT01FbGVtZW50IG9tRWxlbWVudCkgew0KLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0gICAgICAgIFFOYW1lIHFuYW1lID0gb21FbGVtZW50LmdldFFOYW1lKCk7DQotICAgICAgICANCi0gICAgICAgIGlmICh3c2FtUU5hbWUuZXF1YWxzKHFuYW1lKSB8fCB3c2F3UU5hbWUuZXF1YWxzKHFuYW1lKSB8fCBzdWJRTmFtZS5lcXVhbHMocW5hbWUpKQ0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvbWV0YWRhdGEvV1NETExvY2F0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9tZXRhZGF0YS9XU0RMTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjZDJkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9tZXRhZGF0YS9XU0RMTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcubWV0YWRhdGE7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1wdWJsaWMgY2xhc3MgV1NETExvY2F0aW9uIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUU5hbWUgV1NETEkgPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC1pbnN0YW5jZSIsICJ3c2RsTG9jYXRpb24iLCAid3NkbGkiKTsNCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTDsNCi0gICAgDQotICAgIHB1YmxpYyBXU0RMTG9jYXRpb24oKSB7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBXU0RMTG9jYXRpb24oU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIHdzZGxVUkwpIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICAgICAgdGhpcy53c2RsVVJMID0gd3NkbFVSTDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7DQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7DQotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIHdzZGxVUkw7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIHdzZGxVUkwpIHsNCi0gICAgICAgIHRoaXMud3NkbFVSTCA9IHdzZGxVUkw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCBhbiBvYmplY3Qgb2YgdGhpcyB0eXBlIHRvIGFuIDxjb2RlPk9NQXR0cmlidXRlPC9jb2RlPg0KLSAgICAgKiBAcGFyYW0gZmFjdG9yeSA8Y29kZT5PTUZhY3Rvcnk8L2NvZGU+IHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgPGNvZGU+T01FbGVtZW50PC9jb2RlPnMNCi0gICAgICogDQotICAgICAqIEByZXR1cm4gYW4gPGNvZGU+T01BdHRyaWJ1dGU8L2NvZGU+IHRoYXQgY2FuIGJlIGFkZGVkIHRvIGFuIDxjb2RlPkVuZHBvaW50UmVmZXJlbmNlPC9jb2RlPg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9NQXR0cmlidXRlIHRvT00oT01GYWN0b3J5IGZhY3RvcnkpIHsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIodGFyZ2V0TmFtZXNwYWNlKS5hcHBlbmQoIiAiKS5hcHBlbmQod3NkbFVSTCkudG9TdHJpbmcoKTsNCi0gICAgICAgIE9NTmFtZXNwYWNlIHdzZGxpTnMgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKFdTRExJLmdldE5hbWVzcGFjZVVSSSgpLCBXU0RMSS5nZXRQcmVmaXgoKSk7DQotICAgICAgICBPTUF0dHJpYnV0ZSBvbUF0dHJpYnV0ZSA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETEkuZ2V0TG9jYWxQYXJ0KCksIHdzZGxpTnMsIHZhbHVlKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG9tQXR0cmlidXRlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb252ZXJ0aW5nIGFuIE9NQXR0cmlidXRlIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4NCi0gICAgICogPHA+DQotICAgICAqICZsdDsuLi4geG1sbnM6d3NkbGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC1pbnN0YW5jZSIgd3NkbGk6d3NkbExvY2F0aW9uPSJ0YXJnZXROYW1lc3BhY2Ugd3NkbFVSTCIgLi4uJmd0DQotICAgICAqIDwvcD4NCi0gICAgICogQHBhcmFtIG9tQXR0cmlidXRlIHRoZSA8Y29kZT5PTUF0dHJpYnV0ZTwvY29kZT4gdGhhdCBob2xkcyB0aGUgd3NkbCBsb2NhdGlvbi4NCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGZyb21PTShPTUF0dHJpYnV0ZSBvbUF0dHJpYnV0ZSkgdGhyb3dzIEF4aXNGYXVsdCB7DQotICAgICAgICBRTmFtZSBxbmFtZSA9IG9tQXR0cmlidXRlLmdldFFOYW1lKCk7DQotICAgICAgICBpZiAoV1NETEkuZXF1YWxzKHFuYW1lKSkgew0KLSAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gb21BdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKS50cmltKCk7DQotICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgiXFxzIiwgMik7DQotICAgICAgICAgICANCi0gICAgICAgICAgIC8vRG9uJ3Qgc2V0IGFueSB2YWx1ZXMgaWYgc3BsaXQgZG9lc24ndA0KLSAgICAgICAgICAgLy9naXZlIHVzIHRoZSBjb3JyZWN0IG51bWJlciBvZiBlbGVtZW50cy4NCi0gICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9IDIpDQotICAgICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgICAgDQotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSB2YWx1ZXNbMF07DQotICAgICAgICAgICB3c2RsVVJMID0gdmFsdWVzWzFdOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5yZWNvZ25pemVkIGVsZW1lbnQuIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogU3RhdGljIG1ldGhvZCB0byB0ZXN0IHdoZXRoZXIgYW4gPGNvZGU+T01FbGVtZW50PC9jb2RlPiBpcyByZWNvZ25pemVkDQotICAgICAqIGFzIGEgU2VydmljZU5hbWUgZWxlbWVudC4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuDQotICAgICAqIHtAbGluayAjZnJvbU9NKE9NQXR0cmlidXRlKX0gaXMgZ3VhcmFudGVlZCBub3QgdG8gdGhyb3cgYW4gZXhjZXB0aW9uLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG9tQXR0cmlidXRlIHRoZSA8Y29kZT5PTUVsZW1lbnQ8L2NvZGU+IHRvIHRlc3QuDQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGVsZW1lbnQgaXMgYSBTZXJ2aWNlTmFtZSBlbGVtZW50LA0KLSAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV1NETExvY2F0aW9uQXR0cmlidXRlKE9NQXR0cmlidXRlIG9tQXR0cmlidXRlKSB7DQotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOw0KLSAgICAgICAgUU5hbWUgcW5hbWUgPSBvbUF0dHJpYnV0ZS5nZXRRTmFtZSgpOw0KLSAgICAgICAgDQotICAgICAgICBpZiAoV1NETEkuZXF1YWxzKHFuYW1lKSkNCi0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOw0KLSAgICAgICAgDQotICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExQWN0aW9uSGVscGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy93c2RsL1dTREwxMUFjdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY5MDhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExQWN0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmcud3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5BdHRyaWJ1dGVFeHRlbnNpYmxlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIFdTREwxMUFjdGlvbkhlbHBlciBwcm92aWRlcyAzIHN0YXRpYyBtZXRob2RzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB3c2E6QWN0aW9uIHZhbHVlIGZyb20KLSAqIGEgd3NkbDRqIElucHV0L091dHB1dC9GYXVsdCBvYmplY3QuIEl0IGZpcnN0IGF0dGVtcHRzIHRvIGFjY2VzcyB0aGUgd3NhdzpBY3Rpb24gYXR0cmlidXRlIGFuZCBpZgotICogdGhhdCBpcyBub3QgZm91bmQgdXNlcyB0aGUgV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIgdG8gZ2VuZXJhdGUgYW5kIEFjdGlvbiBiYXNlZCBvbiB0aGUKLSAqIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4gZm9yIFdTREwxLjEgYXQgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9XRC13cy1hZGRyLXdzZGwtMjAwNjAyMTYvI2RlZmFjdGlvbndzZGwxMQotICovCi1wdWJsaWMgY2xhc3MgV1NETDExQWN0aW9uSGVscGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMMTFBY3Rpb25IZWxwZXIuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIHN1Ym1pc3Npb25XU0FXTlMgPQotICAgICAgICAgICAgbmV3IFFOYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIGZpbmFsV1NBTlMgPQotICAgICAgICAgICAgbmV3IFFOYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfQUNUSU9OKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBmaW5hbFdTQVdOUyA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FXX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5XU0FfQUNUSU9OKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBmaW5hbFdTQU1OUyA9Ci0gICAgICAgIG5ldyBRTmFtZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQU1fTkFNRVNQQUNFLCBBZGRyZXNzaW5nQ29uc3RhbnRzLldTQV9BQ1RJT04pOwotCi0gICAgLyoqCi0gICAgICogZ2V0QWN0aW9uRnJvbUlucHV0RWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRlZiAgICAgICAgICAgIHRoZSB3c2RsOmRlZmluaXRpb25zIHdoaWNoIGNvbnRhaW5zIHRoZSB3c2RsOnBvcnRUeXBlCi0gICAgICogQHBhcmFtIHdzZGw0alBvcnRUeXBlIHRoZSB3c2RsOnBvcnRUeXBlIHdoaWNoIGNvbnRhaW5zIHRoZSB3c2RsOm9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBvcCAgICAgICAgICAgICB0aGUgd3NkbDpvcGVyYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIGlucHV0IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQgdG8gYmUgZXhhbWluZWQgdG8gZ2VuZXJhdGUgdGhlIHdzYTpBY3Rpb24KLSAgICAgKiBAcmV0dXJuIGVpdGhlciB0aGUgd3NhdzpBY3Rpb24gZnJvbSB0aGUgaW5wdXQgZWxlbWVudCBvciBhbiBhY3Rpb24gZ2VuZXJhdGVkIHVzaW5nIHRoZSBEZWZhdWx0QWN0aW9uUGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkZyb21JbnB1dEVsZW1lbnQoRGVmaW5pdGlvbiBkZWYsIFBvcnRUeXBlIHdzZGw0alBvcnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLCBJbnB1dCBpbnB1dCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0V1NBV0FjdGlvbkV4dGVuc2lvbkF0dHJpYnV0ZShpbnB1dCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlQWN0aW9uRnJvbUlucHV0RWxlbWVudChkZWYsIHdzZGw0alBvcnRUeXBlLCBvcCwgaW5wdXQpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy50cmFjZShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldEFjdGlvbkZyb21PdXRwdXRFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmICAgICAgICAgICAgdGhlIHdzZGw6ZGVmaW5pdGlvbnMgd2hpY2ggY29udGFpbnMgdGhlIHdzZGw6cG9ydFR5cGUKLSAgICAgKiBAcGFyYW0gd3NkbDRqUG9ydFR5cGUgdGhlIHdzZGw6cG9ydFR5cGUgd2hpY2ggY29udGFpbnMgdGhlIHdzZGw6b3BlcmF0aW9uCi0gICAgICogQHBhcmFtIG9wICAgICAgICAgICAgIHRoZSB3c2RsOm9wZXJhdGlvbiB3aGljaCBjb250YWlucyB0aGUgb3V0cHV0IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb3V0cHV0ICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQgdG8gYmUgZXhhbWluZWQgdG8gZ2VuZXJhdGUgdGhlIHdzYTpBY3Rpb24KLSAgICAgKiBAcmV0dXJuIGVpdGhlciB0aGUgd3NhdzpBY3Rpb24gZnJvbSB0aGUgb3V0cHV0IGVsZW1lbnQgb3IgYW4gYWN0aW9uIGdlbmVyYXRlZCB1c2luZyB0aGUgRGVmYXVsdEFjdGlvblBhdHRlcm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudChEZWZpbml0aW9uIGRlZiwgUG9ydFR5cGUgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLCBPdXRwdXQgb3V0cHV0KSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRXU0FXQWN0aW9uRXh0ZW5zaW9uQXR0cmlidXRlKG91dHB1dCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlQWN0aW9uRnJvbU91dHB1dEVsZW1lbnQoZGVmLCB3c2RsNGpQb3J0VHlwZSwgb3AsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLnRyYWNlKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0QWN0aW9uRnJvbUZhdWx0RWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRlZiAgICAgICAgICAgIHRoZSB3c2RsOmRlZmluaXRpb25zIHdoaWNoIGNvbnRhaW5zIHRoZSB3c2RsOnBvcnRUeXBlCi0gICAgICogQHBhcmFtIHdzZGw0alBvcnRUeXBlIHRoZSB3c2RsOnBvcnRUeXBlIHdoaWNoIGNvbnRhaW5zIHRoZSB3c2RsOm9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBvcCAgICAgICAgICAgICB0aGUgd3NkbDpvcGVyYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIGZhdWx0IGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gZmF1bHQgICAgICAgICAgdGhlIGZhdWx0IGVsZW1lbnQgdG8gYmUgZXhhbWluZWQgdG8gZ2VuZXJhdGUgdGhlIHdzYTpBY3Rpb24KLSAgICAgKiBAcmV0dXJuIGVpdGhlciB0aGUgd3NhdzpBY3Rpb24gZnJvbSB0aGUgZmF1bHQgZWxlbWVudCBvciBhbiBhY3Rpb24gZ2VuZXJhdGVkIHVzaW5nIHRoZSBEZWZhdWx0QWN0aW9uUGF0dGVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkZyb21GYXVsdEVsZW1lbnQoRGVmaW5pdGlvbiBkZWYsIFBvcnRUeXBlIHdzZGw0alBvcnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLCBGYXVsdCBmYXVsdCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0V1NBV0FjdGlvbkV4dGVuc2lvbkF0dHJpYnV0ZShmYXVsdCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlQWN0aW9uRnJvbUZhdWx0RWxlbWVudChkZWYsIHdzZGw0alBvcnRUeXBlLCBvcCwgZmF1bHQpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy50cmFjZShyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRXU0FXQWN0aW9uRXh0ZW5zaW9uQXR0cmlidXRlKEF0dHJpYnV0ZUV4dGVuc2libGUgYWUpIHsKLSAgICAgICAgLy8gU2VhcmNoIGZpcnN0IGZvciBhIHdzYXc6QWN0aW9uIHVzaW5nIHRoZSBzdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBPYmplY3QgYXR0cmlidXRlID0gYWUuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKHN1Ym1pc3Npb25XU0FXTlMpOwotICAgICAgICAvLyBUaGVuIGlmIHRoYXQgZGlkIG5vdCBleGlzdCBvbmUgdXNpbmcgdGhlIHczYyBXU0FNIG5hbWVzcGFjZQotICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGFlLmdldEV4dGVuc2lvbkF0dHJpYnV0ZShmaW5hbFdTQU1OUyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlbiBpZiB0aGF0IGRpZCBub3QgZXhpc3Qgb25lIHVzaW5nIHRoZSB3M2MgV1NBVyBuYW1lc3BhY2UKLSAgICAgICAgLy8gKGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMpCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlID0gYWUuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGZpbmFsV1NBV05TKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGVuIGZpbmFsbHkgaWYgdGhhdCBkaWQgbm90IGV4aXN0LCB0cnkgdGhlIDIwMDUvMDggTlMKLSAgICAgICAgLy8gKEluY2x1ZGVkIGhlcmUgYmVjYXVzZSBpdCdzIG5lZWRlZCBmb3IgQXBhY2hlIE11c2UpCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYXR0cmlidXRlID0gYWUuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGZpbmFsV1NBTlMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd3NkbDRqIG1heSByZXR1cm4gYSBTdHJpbmcsIFFOYW1lIG9yIGEgTGlzdCBvZiBlaXRoZXIKLSAgICAgICAgLy8gSWYgaXQgaXMgYSBsaXN0LCBleHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBMaXN0KSB7Ci0gICAgICAgICAgICBMaXN0IGwgPSAoTGlzdCkgYXR0cmlidXRlOwotICAgICAgICAgICAgaWYgKGwuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9IGwuZ2V0KDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXR0cmlidXRlIG11c3Qgbm93IGJlIGEgUU5hbWUgb3IgU3RyaW5nIG9yIG51bGwKLSAgICAgICAgLy8gSWYgaXQgaXMgYSBRTmFtZSwgdGFrZSB0aGUgTG9jYWxQYXJ0IGFzIGEgU3RyaW5nCi0gICAgICAgIGlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgUU5hbWUgcW4gPSAoUU5hbWUpIGF0dHJpYnV0ZTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZSA9IHFuLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgYXR0cmlidXRlOwotICAgICAgICAgICAgbG9nLnRyYWNlKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJObyB3c2F3OkFjdGlvbiBhdHRyaWJ1dGUgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oU3RyaW5nIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFdTREwxMURlZmF1bHRBY3Rpb25QYXR0ZXJuSGVscGVyLmdldElucHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4sIHRhcmdldE5hbWVzcGFjZSwgcG9ydFR5cGVOYW1lLCBvcGVyYXRpb25OYW1lLCBpbnB1dE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXROYW1lKSB7Ci0gICAgICAgIHJldHVybiBXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlci5nZXRPdXRwdXRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oCi0gICAgICAgICAgICAgICAgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwgdGFyZ2V0TmFtZXNwYWNlLCBwb3J0VHlwZU5hbWUsIG9wZXJhdGlvbk5hbWUsIG91dHB1dE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZhdWx0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHROYW1lKSB7Ci0gICAgICAgIHJldHVybiBXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlci5nZXRGYXVsdEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbih0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHROYW1lKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExRGVmYXVsdEFjdGlvblBhdHRlcm5IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3MmQyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy93c2RsL1dTREwxMURlZmF1bHRBY3Rpb25QYXR0ZXJuSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmcud3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB3c2E6QWN0aW9uIHZhbHVlIHVzaW5nIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuIGRlZmluZWQgYXQKLSAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvV0Qtd3MtYWRkci13c2RsLTIwMDYwMjE2LyNkZWZhY3Rpb253c2RsMTEKLSAqLwotcHVibGljIGNsYXNzIFdTREwxMURlZmF1bHRBY3Rpb25QYXR0ZXJuSGVscGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMMTFEZWZhdWx0QWN0aW9uUGF0dGVybkhlbHBlci5jbGFzcyk7Ci0KLSAgICAvLyBTdHJpbmcgY29uc3RhbnRzIHVzZWQgZXh0ZW5zaXZlbHkgaW4gdGhpcyBjbGFzcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUk4gPSAidXJuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9OID0gIjoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUID0gIlJlcXVlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTElDSVQgPSAiU29saWNpdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUID0gIkZhdWx0IjsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIHRoZSBBY3Rpb24gZm9yIGFuIElucHV0IHVzaW5nIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICogPHAvPgotICAgICAqIFBhdHRlcm4gaXMgZGVmaW5lZCBhcyBbdGFyZ2V0IG5hbWVzcGFjZV1bZGVsaW1pdGVyXVtwb3J0IHR5cGUgbmFtZV1bZGVsaW1pdGVyXVtpbnB1dCBuYW1lXQotICAgICAqCi0gICAgICogQHBhcmFtIGRlZiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgdGFyZ2V0TmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzZGw0alBvcnRUeXBlIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgcG9ydFR5cGUgbmFtZQotICAgICAqIEBwYXJhbSBvcCAgICAgICAgICAgICBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgaW5wdXQgbmFtZSBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgICAgaXMgcmVxdWlyZWQgZm9yIGl0cyBuYW1lIGlmIHNwZWNpZmllZAotICAgICAqIEByZXR1cm4gYSB3c2E6QWN0aW9uIHZhbHVlIGJhc2VkIG9uIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuIGFuZCB0aGUgcHJvdmlkZWQgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlQWN0aW9uRnJvbUlucHV0RWxlbWVudChEZWZpbml0aW9uIGRlZiwgUG9ydFR5cGUgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwgSW5wdXQgaW5wdXQpIHsKLSAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIHdzZGw6ZGVmaW5pdGlvbnMKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGRlbGltaXRlci4gUGVyIHRoZSBzcGVjOiAnaXMgIjoiIHdoZW4gdGhlIFt0YXJnZXQgbmFtZXNwYWNlXSBpcyBhIFVSTiwgb3RoZXJ3aXNlICIvIi4gCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgSVJJIHNjaGVtZXMgb3RoZXIgdGhhbiBVUk5zIHdoaWNoIGFyZW4ndCBwYXRoLWJhc2VkIChpLmUuIHRob3NlIHRoYXQgb3V0bGF3IHRoZSAiLyIgCi0gICAgICAgIC8vIGNoYXJhY3RlciksIHRoZSBkZWZhdWx0IGFjdGlvbiB2YWx1ZSBtYXkgbm90IGNvbmZvcm0gdG8gdGhlIHJ1bGVzIG9mIHRoZSBJUkkgc2NoZW1lLiBBdXRob3JzCi0gICAgICAgIC8vIGFyZSBhZHZpc2VkIHRvIHNwZWNpZnkgZXhwbGljaXQgdmFsdWVzIGluIHRoZSBXU0RMIGluIHRoaXMgY2FzZS4nCi0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBTTEFTSDsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJOKSkgewotICAgICAgICAgICAgZGVsaW1pdGVyID0gQ09MT047Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIHBvcnRUeXBlIG5hbWUgKGFzIGEgc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhY3Rpb24pCi0gICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSB3c2RsNGpQb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQgKGFuZCBnZW5lcmF0ZSBvbmUgaWYgbm9uZSBleHBsaWNpdGx5IHNwZWNpZmllZCkKLSAgICAgICAgU3RyaW5nIGlucHV0TmFtZSA9IGdldE5hbWVGcm9tSW5wdXRFbGVtZW50KG9wLCBpbnB1dCk7Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBiaXRzIHRvZ2V0aGVyCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB0YXJnZXROYW1lc3BhY2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIGRlbGltaXRlcgotICAgICAgICBpZiAoIXRhcmdldE5hbWVzcGFjZS5lbmRzV2l0aChkZWxpbWl0ZXIpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChpbnB1dE5hbWUpOwotCi0gICAgICAgIC8vIFJlc29sdmUgdGhlIGFjdGlvbiBmcm9tIHRoZSBTdHJpbmdCdWZmZXIKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImdlbmVyYXRlQWN0aW9uRnJvbUlucHV0RWxlbWVudCByZXN1bHQ6ICIgKyByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBJbnB1dCBlbGVtZW50IHVzaW5nIHRoZSBydWxlcyBkZWZpbmVkIGluIFdTREwgMS4xCi0gICAgICogU2VjdGlvbiAyLjQuNSBodHRwOi8vd3d3LnczLm9yZy9UUi93c2RsI19uYW1lcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROYW1lRnJvbUlucHV0RWxlbWVudChPcGVyYXRpb24gb3AsIElucHV0IGlucHV0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgbmFtZSBmcm9tIHRoZSBpbnB1dCBlbGVtZW50IGlmIHNwZWNpZmllZC4KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGlucHV0LmdldE5hbWUoKTsKLQotICAgICAgICAvLyBJZiBub3Qgd2UnbGwgaGF2ZSB0byBnZW5lcmF0ZSBpdC4KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiBSZXF1ZXN0LVJlc3BvbnNlIG9yIFNvbGljaXQtUmVzcG9uc2UgZG8gc29tZXRoaW5nIHNwZWNpYWwgcGVyCi0gICAgICAgICAgICAvLyBXU0RMIDEuMSBTZWN0aW9uIDIuNC41Ci0gICAgICAgICAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBvcC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gb3BlcmF0aW9uVHlwZSkgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wLmdldE5hbWUoKSArIFJFUVVFU1Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wLmdldE5hbWUoKSArIFJFU1BPTlNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIHRoZSBPcGVyYXRpb25UeXBlIHdhcyBub3QgYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbiwgYXNzdW1lIG9uLXdheSBvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldElucHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKFN0cmluZyBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXROYW1lKSB7Ci0gICAgCWlmIChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuID09IG51bGwgJiYgaW5wdXROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJPbmUgb2YgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiBvciBpbnB1dE5hbWUgbXVzdCB0aGUgbm9uLW51bGwgdG8gZ2VuZXJhdGUgYW4gYWN0aW9uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkZWxpbWl0ZXIuIFBlciB0aGUgc3BlYzogJ2lzICI6IiB3aGVuIHRoZSBbdGFyZ2V0IG5hbWVzcGFjZV0gaXMgYSBVUk4sIG90aGVyd2lzZSAiLyIuIAotICAgICAgICAvLyBOb3RlIHRoYXQgZm9yIElSSSBzY2hlbWVzIG90aGVyIHRoYW4gVVJOcyB3aGljaCBhcmVuJ3QgcGF0aC1iYXNlZCAoaS5lLiB0aG9zZSB0aGF0IG91dGxhdyB0aGUgIi8iIAotICAgICAgICAvLyBjaGFyYWN0ZXIpLCB0aGUgZGVmYXVsdCBhY3Rpb24gdmFsdWUgbWF5IG5vdCBjb25mb3JtIHRvIHRoZSBydWxlcyBvZiB0aGUgSVJJIHNjaGVtZS4gQXV0aG9ycwotICAgICAgICAvLyBhcmUgYWR2aXNlZCB0byBzcGVjaWZ5IGV4cGxpY2l0IHZhbHVlcyBpbiB0aGUgV1NETCBpbiB0aGlzIGNhc2UuJwotICAgICAgICBTdHJpbmcgZGVsaW1pdGVyID0gU0xBU0g7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTikpIHsKLSAgICAgICAgICAgIGRlbGltaXRlciA9IENPTE9OOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTi5CLiBVbmxpa2UgY29yZSBBeGlzMiBwcm9jZXNzaW5nIFdTREwsIEpBWC1XUyBhY2NvdGF0aW9uIHByb2Nlc3NpbmcgcGFzc2VzIGluIHRoZQotICAgICAgICAvLyBvdXQtaW4gTUVQIHdoZW4gY29uc3RydWN0aW5nIHRoZSBjbGllbnQsIGhlbmNlIHdlIG5lZWQgdG8gdGFrZSBhY2NvdW50IG9mIGl0IGhlcmUKLSAgICAgICAgLy8gaW4gYWRkaXRpb24gdG8gdGhlIGV4cGVjdGVkIGluLW91dAotICAgICAgICBpZiAoaW5wdXROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlucHV0TmFtZSA9IG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUV4Y2hhbmdlUGF0dGVybi5pbmRleE9mKCJpbi1vdXQiKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXROYW1lICs9IFJFUVVFU1Q7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4uaW5kZXhPZigib3V0LWluIikgPj0gMCkgewotICAgICAgICAgICAgICAgIGlucHV0TmFtZSArPSBSRVNQT05TRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFwcGVuZCB0aGUgYml0cyB0b2dldGhlcgotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAvLyBEZWFsIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgdGFyZ2V0TmFtZXNwYWNlIG1heSBvciBtYXkgbm90IGhhdmUgYSB0cmFpbGluZyBkZWxpbWl0ZXIKLSAgICAgICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZW5kc1dpdGgoZGVsaW1pdGVyKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKHBvcnRUeXBlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICBzYi5hcHBlbmQoaW5wdXROYW1lKTsKLQotICAgICAgICAvLyBSZXNvbHZlIHRoZSBhY3Rpb24gZnJvbSB0aGUgU3RyaW5nQnVmZmVyCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzYi50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJnZXRJbnB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbiByZXN1bHQ6ICIgKyByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZSB0aGUgQWN0aW9uIGZvciBhbiBPdXRwdXQgdXNpbmcgdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4KLSAgICAgKiA8cC8+Ci0gICAgICogUGF0dGVybiBpcyBkZWZpbmVkIGFzIFt0YXJnZXQgbmFtZXNwYWNlXVtkZWxpbWl0ZXJdW3BvcnQgdHlwZSBuYW1lXVtkZWxpbWl0ZXJdW291dHB1dCBuYW1lXQotICAgICAqCi0gICAgICogQHBhcmFtIGRlZiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgdGFyZ2V0TmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzZGw0alBvcnRUeXBlIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgcG9ydFR5cGUgbmFtZQotICAgICAqIEBwYXJhbSBvcCAgICAgICAgICAgICBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgb3V0cHV0IG5hbWUgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkCi0gICAgICogQHBhcmFtIG91dHB1dCAgICAgICAgIGlzIHJlcXVpcmVkIGZvciBpdHMgbmFtZSBpZiBzcGVjaWZpZWQKLSAgICAgKiBAcmV0dXJuIGEgd3NhOkFjdGlvbiB2YWx1ZSBiYXNlZCBvbiB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybiBhbmQgdGhlIHByb3ZpZGVkIG9iamVjdHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUFjdGlvbkZyb21PdXRwdXRFbGVtZW50KERlZmluaXRpb24gZGVmLCBQb3J0VHlwZSB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwgT3V0cHV0IG91dHB1dCkgewotICAgICAgICAvLyBHZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgd3NkbDpkZWZpbml0aW9uCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkZWxpbWl0ZXIuIFBlciB0aGUgc3BlYzogJ2lzICI6IiB3aGVuIHRoZSBbdGFyZ2V0IG5hbWVzcGFjZV0gaXMgYSBVUk4sIG90aGVyd2lzZSAiLyIuIAotICAgICAgICAvLyBOb3RlIHRoYXQgZm9yIElSSSBzY2hlbWVzIG90aGVyIHRoYW4gVVJOcyB3aGljaCBhcmVuJ3QgcGF0aC1iYXNlZCAoaS5lLiB0aG9zZSB0aGF0IG91dGxhdyB0aGUgIi8iIAotICAgICAgICAvLyBjaGFyYWN0ZXIpLCB0aGUgZGVmYXVsdCBhY3Rpb24gdmFsdWUgbWF5IG5vdCBjb25mb3JtIHRvIHRoZSBydWxlcyBvZiB0aGUgSVJJIHNjaGVtZS4gQXV0aG9ycwotICAgICAgICAvLyBhcmUgYWR2aXNlZCB0byBzcGVjaWZ5IGV4cGxpY2l0IHZhbHVlcyBpbiB0aGUgV1NETCBpbiB0aGlzIGNhc2UuJwotICAgICAgICBTdHJpbmcgZGVsaW1pdGVyID0gU0xBU0g7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTikpIHsKLSAgICAgICAgICAgIGRlbGltaXRlciA9IENPTE9OOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBwb3J0VHlwZSBuYW1lIChhcyBhIHN0cmluZyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0aW9uKQotICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lID0gd3NkbDRqUG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZWxlbWVudCAoYW5kIGdlbmVyYXRlIG9uZSBpZiBub25lIGV4cGxpY2l0bHkgc3BlY2lmaWVkKQotICAgICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IGdldE5hbWVGcm9tT3V0cHV0RWxlbWVudChvcCwgb3V0cHV0KTsKLQotICAgICAgICAvLyBBcHBlbmQgdGhlIGJpdHMgdG9nZXRoZXIKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBzYi5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgLy8gRGVhbCB3aXRoIHRoZSBwcm9ibGVtIHRoYXQgdGhlIHRhcmdldE5hbWVzcGFjZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0gICAgICAgIGlmICghdGFyZ2V0TmFtZXNwYWNlLmVuZHNXaXRoKGRlbGltaXRlcikpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChwb3J0VHlwZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgc2IuYXBwZW5kKG91dHB1dE5hbWUpOwotCi0gICAgICAgIC8vIFJlc29sdmUgdGhlIGFjdGlvbiBmcm9tIHRoZSBTdHJpbmdCdWZmZXIKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHNiLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoImdlbmVyYXRlQWN0aW9uRnJvbU91dHB1dEVsZW1lbnQgcmVzdWx0OiAiICsgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgT3V0cHV0IGVsZW1lbnQgdXNpbmcgdGhlIHJ1bGVzIGRlZmluZWQgaW4gV1NETCAxLjEKLSAgICAgKiBTZWN0aW9uIDIuNC41IGh0dHA6Ly93d3cudzMub3JnL1RSL3dzZGwjX25hbWVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tT3V0cHV0RWxlbWVudChPcGVyYXRpb24gb3AsIE91dHB1dCBvdXRwdXQpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBuYW1lIGZyb20gdGhlIG91dHB1dCBlbGVtZW50IGlmIHNwZWNpZmllZC4KLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG91dHB1dC5nZXROYW1lKCk7Ci0KLSAgICAgICAgLy8gSWYgbm90IHdlJ2xsIGhhdmUgdG8gZ2VuZXJhdGUgaXQuCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gSWYgUmVxdWVzdC1SZXNwb25zZSBvciBTb2xpY2l0LVJlc3BvbnNlIGRvIHNvbWV0aGluZyBzcGVjaWFsIHBlcgotICAgICAgICAgICAgLy8gV1NETCAxLjEgU2VjdGlvbiAyLjQuNQotICAgICAgICAgICAgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlID0gb3AuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IG9wZXJhdGlvblR5cGUpIHsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AuZ2V0TmFtZSgpICsgUkVTUE9OU0U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcC5nZXROYW1lKCkgKyBTT0xJQ0lUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIHRoZSBPcGVyYXRpb25UeXBlIHdhcyBub3QgYXZhaWxhYmxlIGZvciBzb21lIHJlYXNvbiwgYXNzdW1lIG9uLXdheSBvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9wLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE91dHB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbihTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvdXRwdXROYW1lKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuID09IG51bGwgJiYgb3V0cHV0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiT25lIG9mIG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4gb3Igb3V0cHV0TmFtZSBtdXN0IHRoZSBub24tbnVsbCB0byBnZW5lcmF0ZSBhbiBhY3Rpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGRlbGltaXRlci4gUGVyIHRoZSBzcGVjOiAnaXMgIjoiIHdoZW4gdGhlIFt0YXJnZXQgbmFtZXNwYWNlXSBpcyBhIFVSTiwgb3RoZXJ3aXNlICIvIi4gCi0gICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgSVJJIHNjaGVtZXMgb3RoZXIgdGhhbiBVUk5zIHdoaWNoIGFyZW4ndCBwYXRoLWJhc2VkIChpLmUuIHRob3NlIHRoYXQgb3V0bGF3IHRoZSAiLyIgCi0gICAgICAgIC8vIGNoYXJhY3RlciksIHRoZSBkZWZhdWx0IGFjdGlvbiB2YWx1ZSBtYXkgbm90IGNvbmZvcm0gdG8gdGhlIHJ1bGVzIG9mIHRoZSBJUkkgc2NoZW1lLiBBdXRob3JzCi0gICAgICAgIC8vIGFyZSBhZHZpc2VkIHRvIHNwZWNpZnkgZXhwbGljaXQgdmFsdWVzIGluIHRoZSBXU0RMIGluIHRoaXMgY2FzZS4nCi0gICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSBTTEFTSDsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJOKSkgewotICAgICAgICAgICAgZGVsaW1pdGVyID0gQ09MT047Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOLkIuIFVubGlrZSBjb3JlIEF4aXMyIHByb2Nlc3NpbmcgV1NETCwgSkFYLVdTIGFubm90YXRpb24gcHJvY2Vzc2luZyBwYXNzZXMgaW4gdGhlCi0gICAgICAgIC8vIG91dC1pbiBNRVAgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNsaWVudCwgaGVuY2Ugd2UgbmVlZCB0byB0YWtlIGFjY291bnQgb2YgaXQgaGVyZQotICAgICAgICAvLyBpbiBhZGRpdGlvbiB0byB0aGUgZXhwZWN0ZWQgaW4tb3V0Ci0gICAgICAgIGlmIChvdXRwdXROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIG91dHB1dE5hbWUgPSBvcGVyYXRpb25OYW1lOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4uaW5kZXhPZigiaW4tb3V0IikgPj0gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWUgKz0gUkVTUE9OU0U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4uaW5kZXhPZigib3V0LWluIikgPj0gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWUgKz0gUkVRVUVTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFwcGVuZCB0aGUgYml0cyB0b2dldGhlcgotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAvLyBEZWFsIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgdGFyZ2V0TmFtZXNwYWNlIG1heSBvciBtYXkgbm90IGhhdmUgYSB0cmFpbGluZyBkZWxpbWl0ZXIKLSAgICAgICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZW5kc1dpdGgoZGVsaW1pdGVyKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKHBvcnRUeXBlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICBzYi5hcHBlbmQob3V0cHV0TmFtZSk7Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0aGUgYWN0aW9uIGZyb20gdGhlIFN0cmluZ0J1ZmZlcgotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZ2V0T3V0cHV0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uIHJlc3VsdDogIiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIHRoZSBBY3Rpb24gZm9yIGEgRmF1bHQgdXNpbmcgdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4KLSAgICAgKiA8cC8+Ci0gICAgICogUGF0dGVybiBpcyBkZWZpbmVkIGFzIFt0YXJnZXQgbmFtZXNwYWNlXVtkZWxpbWl0ZXJdW3BvcnQgdHlwZSBuYW1lXVtkZWxpbWl0ZXJdW29wZXJhdGlvbiBuYW1lXVtkZWxpbWl0ZXJdRmF1bHRbZGVsaW1pdGVyXVtmYXVsdCBuYW1lXQotICAgICAqCi0gICAgICogQHBhcmFtIGRlZiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgdGFyZ2V0TmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzZGw0alBvcnRUeXBlIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgcG9ydFR5cGUgbmFtZQotICAgICAqIEBwYXJhbSBvcCAgICAgICAgICAgICBpcyByZXF1aXJlZCB0byBvYnRhaW4gdGhlIG9wZXJhdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIGZhdWx0ICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIG9idGFpbiB0aGUgZmF1bHQgbmFtZQotICAgICAqIEByZXR1cm4gYSB3c2E6QWN0aW9uIHZhbHVlIGJhc2VkIG9uIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuIGFuZCB0aGUgcHJvdmlkZWQgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlQWN0aW9uRnJvbUZhdWx0RWxlbWVudChEZWZpbml0aW9uIGRlZiwgUG9ydFR5cGUgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwgRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgLy8gR2V0IHRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIHdzZGw6ZGVmaW5pdGlvbgotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAgIC8vIERldGVybWluZSB0aGUgZGVsaW1pdGVyLiBQZXIgdGhlIHNwZWM6ICdpcyAiOiIgd2hlbiB0aGUgW3RhcmdldCBuYW1lc3BhY2VdIGlzIGEgVVJOLCBvdGhlcndpc2UgIi8iLiAKLSAgICAgICAgLy8gTm90ZSB0aGF0IGZvciBJUkkgc2NoZW1lcyBvdGhlciB0aGFuIFVSTnMgd2hpY2ggYXJlbid0IHBhdGgtYmFzZWQgKGkuZS4gdGhvc2UgdGhhdCBvdXRsYXcgdGhlICIvIiAKLSAgICAgICAgLy8gY2hhcmFjdGVyKSwgdGhlIGRlZmF1bHQgYWN0aW9uIHZhbHVlIG1heSBub3QgY29uZm9ybSB0byB0aGUgcnVsZXMgb2YgdGhlIElSSSBzY2hlbWUuIEF1dGhvcnMKLSAgICAgICAgLy8gYXJlIGFkdmlzZWQgdG8gc3BlY2lmeSBleHBsaWNpdCB2YWx1ZXMgaW4gdGhlIFdTREwgaW4gdGhpcyBjYXNlLicKLSAgICAgICAgU3RyaW5nIGRlbGltaXRlciA9IFNMQVNIOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUk4pKSB7Ci0gICAgICAgICAgICBkZWxpbWl0ZXIgPSBDT0xPTjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgcG9ydFR5cGUgbmFtZSAoYXMgYSBzdHJpbmcgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFjdGlvbikKLSAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSA9IHdzZGw0alBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIC8vIEdldCB0aGUgb3BlcmF0aW9uIG5hbWUgKGFzIGEgc3RyaW5nIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhY3Rpb24pCi0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gb3AuZ2V0TmFtZSgpOwotCi0gICAgICAgIC8vIEdldCB0aGUgbmFtZSBvZiB0aGUgZmF1bHQgZWxlbWVudCAobmFtZSBpcyBtYW5kYXRvcnkgb24gZmF1bHQgZWxlbWVudHMpCi0gICAgICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBiaXRzIHRvZ2V0aGVyCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB0YXJnZXROYW1lc3BhY2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIGRlbGltaXRlcgotICAgICAgICBpZiAoIXRhcmdldE5hbWVzcGFjZS5lbmRzV2l0aChkZWxpbWl0ZXIpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChGQVVMVCk7Ci0gICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICBzYi5hcHBlbmQoZmF1bHROYW1lKTsKLQotICAgICAgICAvLyBSZXNvbHZlIHRoZSBhY3Rpb24gZnJvbSB0aGUgU3RyaW5nQnVmZmVyCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzYi50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJnZW5lcmF0ZUFjdGlvbkZyb21GYXVsdEVsZW1lbnQgcmVzdWx0OiAiICsgcmVzdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RmF1bHRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24oU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdE5hbWUpIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkZWxpbWl0ZXIuIFBlciB0aGUgc3BlYzogJ2lzICI6IiB3aGVuIHRoZSBbdGFyZ2V0IG5hbWVzcGFjZV0gaXMgYSBVUk4sIG90aGVyd2lzZSAiLyIuIAotICAgICAgICAvLyBOb3RlIHRoYXQgZm9yIElSSSBzY2hlbWVzIG90aGVyIHRoYW4gVVJOcyB3aGljaCBhcmVuJ3QgcGF0aC1iYXNlZCAoaS5lLiB0aG9zZSB0aGF0IG91dGxhdyB0aGUgIi8iIAotICAgICAgICAvLyBjaGFyYWN0ZXIpLCB0aGUgZGVmYXVsdCBhY3Rpb24gdmFsdWUgbWF5IG5vdCBjb25mb3JtIHRvIHRoZSBydWxlcyBvZiB0aGUgSVJJIHNjaGVtZS4gQXV0aG9ycwotICAgICAgICAvLyBhcmUgYWR2aXNlZCB0byBzcGVjaWZ5IGV4cGxpY2l0IHZhbHVlcyBpbiB0aGUgV1NETCBpbiB0aGlzIGNhc2UuJwotICAgICAgICBTdHJpbmcgZGVsaW1pdGVyID0gU0xBU0g7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTikpIHsKLSAgICAgICAgICAgIGRlbGltaXRlciA9IENPTE9OOwotICAgICAgICB9Ci0KLS8vICAgICAgQXBwZW5kIHRoZSBiaXRzIHRvZ2V0aGVyCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgcHJvYmxlbSB0aGF0IHRoZSB0YXJnZXROYW1lc3BhY2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHRyYWlsaW5nIGRlbGltaXRlcgotICAgICAgICBpZiAoIXRhcmdldE5hbWVzcGFjZS5lbmRzV2l0aChkZWxpbWl0ZXIpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQocG9ydFR5cGVOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0gICAgICAgIHNiLmFwcGVuZChGQVVMVCk7Ci0gICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOwotICAgICAgICBzYi5hcHBlbmQoZmF1bHROYW1lKTsKLQotICAgICAgICAvLyBSZXNvbHZlIHRoZSBhY3Rpb24gZnJvbSB0aGUgU3RyaW5nQnVmZmVyCi0gICAgICAgIFN0cmluZyByZXN1bHQgPSBzYi50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKCJnZXRGYXVsdEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbiByZXN1bHQ6ICIgKyByZXN1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9BcHBsaWNhdGlvblhNTEJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0FwcGxpY2F0aW9uWE1MQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODI4N2NmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0FwcGxpY2F0aW9uWE1MQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU5vZGVFeDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuRGV0YWNoYWJsZUlucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBpcyB1c2VkIHdoZW4gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIG1lc3NhZ2UgaXMgYXBwbGljYXRpb24veG1sLgotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25YTUxCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IHNvYXBGYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBBcHBseSBhIGRldGFjaGFibGUgaW5wdXRzdHJlYW0uICBUaGlzIGNhbiBiZSB1c2VkIGxhdGVyCi0gICAgICAgICAgICAgICAgLy8gdG8gKGEpIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmNvbWluZyBtZXNzYWdlIG9yIChiKQotICAgICAgICAgICAgICAgIC8vIGZyZWUgdHJhbnNwb3J0IHJlc291cmNlcy4KLSAgICAgICAgICAgICAgICBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRGV0YWNoYWJsZUlucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuREVUQUNIQUJMRV9JTlBVVF9TVFJFQU0sIGlzKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBQdXNoYmFja0lucHV0U3RyZWFtIHB1c2hiYWNrSW5wdXRTdHJlYW0gPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgICAgICAgICAgaW50IGI7Ci0gICAgICAgICAgICAgICAgaWYgKChiID0gcHVzaGJhY2tJbnB1dFN0cmVhbS5yZWFkKCkpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBwdXNoYmFja0lucHV0U3RyZWFtLnVucmVhZChiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlclV0aWwuZ2V0UE9YQnVpbGRlcihwdXNoYmFja0lucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpKTsKLSAgICAgICAgICAgICAgICAgICAgT01Ob2RlRXggZG9jdW1lbnRFbGVtZW50ID0gKE9NTm9kZUV4KSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc2V0UGFyZW50KG51bGwpOwotICAgICAgICAgICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gc29hcEVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgICAgICAgICAgYm9keS5hZGRDaGlsZChkb2N1bWVudEVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBFbnZlbG9wZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0J1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Mzk1Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQnVpbGRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdDsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0J1aWxkZXJVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9CdWlsZGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ2Njg1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0J1aWxkZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMubGlmZWN5Y2xlLkxpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5saWZlY3ljbGUuaW1wbC5MaWZlY3ljbGVNYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5YT1BBd2FyZVN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUFByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5NVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk11bHRpcGxlRW50cnlIYXNoTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQWxsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29tcGxleFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hR3JvdXBCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hUGFydGljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFTZXF1ZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEJ1aWxkZXJVdGlsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQnVpbGRlclV0aWwuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9NX1NJWkUgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBTT0FQRW52ZWxvcGUgYnVpbGRzb2FwTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlRW50cnlIYXNoTWFwIHJlcXVlc3RQYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IHNvYXBGYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gc29hcEVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50OwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gYXhpc01lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpOwotCi0gICAgICAgICAgICBpZiAoeG1sU2NoZW1hRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGJvZHlGaXJzdENoaWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVPTUVsZW1lbnQobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKSwgYm9keSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBzY2hlbWEgaXRzIHBpZWNlIG9mIGNha2UgISEgYWRkIHRoZXNlIHRvIHRoZSBzb2FwIGJvZHkgaW4gYW55IG9yZGVyIHlvdSBsaWtlLgotICAgICAgICAgICAgICAgIC8vIE5vdGUgOiBpZiB0aGVyZSBhcmUgcGFyYW1ldGVycyBpbiB0aGUgcGF0aCBvZiB0aGUgVVJMLCB0aGVyZSBpcyBubyB3YXkgdGhpcyBjYW4gYWRkIHRoZW0KLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICBjcmVhdGVTT0FQTWVzc2FnZVdpdGhvdXRTY2hlbWEoc29hcEZhY3RvcnksIGJvZHlGaXJzdENoaWxkLCByZXF1ZXN0UGFyYW1ldGVyTWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBnZXQgdGhlIHRhcmdldCBuYW1lc3BhY2UgZnJvbSB0aGUgc2NoZW1hIGFuZCB0aGUgd3JhcHBpbmcgZWxlbWVudC4KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gT01FbGVtZW50IG91dCBvZiB0aG9zZSBpbmZvcm1hdGlvbi4gV2UgYXJlIGdvaW5nIHRvIGV4dHJhY3QgcGFyYW1ldGVycyBmcm9tCi0gICAgICAgICAgICAgICAgLy8gdXJsLCBjcmVhdGUgT01FbGVtZW50cyBhbmQgYWRkIHRoZW0gYXMgY2hpbGRyZW4gdG8gdGhpcyB3cmFwcGluZyBlbGVtZW50LgotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB4bWxTY2hlbWFFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgYm9keUZpcnN0Q2hpbGRRTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgISIiLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvZHlGaXJzdENoaWxkUU5hbWUgPSBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWFFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYm9keUZpcnN0Q2hpbGRRTmFtZSA9IG5ldyBRTmFtZSh4bWxTY2hlbWFFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBib2R5Rmlyc3RDaGlsZCA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChib2R5Rmlyc3RDaGlsZFFOYW1lLCBib2R5KTsKLQotICAgICAgICAgICAgICAgIC8vIFNjaGVtYSBzaG91bGQgYWRoZXJlIHRvIHRoZSBJUkkgc3R5bGUgaW4gdGhpcy4gU28gYXNzdW1lIElSSSBzdHlsZSBhbmQgZGl2ZSBpbiB0bwotICAgICAgICAgICAgICAgIC8vIHNjaGVtYQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgc2NoZW1hVHlwZSA9IHhtbFNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChzY2hlbWFUeXBlIGluc3RhbmNlb2YgWG1sU2NoZW1hQ29tcGxleFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoKFhtbFNjaGVtYUNvbXBsZXhUeXBlKXNjaGVtYVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFQYXJ0aWNsZSBwYXJ0aWNsZSA9IGNvbXBsZXhUeXBlLmdldFBhcnRpY2xlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlIHx8IHBhcnRpY2xlIGluc3RhbmNlb2YgWG1sU2NoZW1hQWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFHcm91cEJhc2UgeG1sU2NoZW1hR3JvdXBCYXNlID0gKFhtbFNjaGVtYUdyb3VwQmFzZSlwYXJ0aWNsZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0geG1sU2NoZW1hR3JvdXBCYXNlLmdldEl0ZW1zKCkuZ2V0SXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8ga25vdyBzb21lIGluZm9ybWF0aW9uIGZyb20gdGhlIGJpbmRpbmcgb3BlcmF0aW9uLgotCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBpbm5lckVsZW1lbnQgPSAoWG1sU2NoZW1hRWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBpbm5lckVsZW1lbnQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCAmJiBpbm5lckVsZW1lbnQuZ2V0U2NoZW1hVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLmNvbnN0YW50cy5Db25zdGFudHMuWFNEX0FOWVRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNPQVBNZXNzYWdlV2l0aG91dFNjaGVtYShzb2FwRmFjdG9yeSwgYm9keUZpcnN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0UGFyYW1ldGVyTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWluT2NjdXJzID0gaW5uZXJFbGVtZW50LmdldE1pbk9jY3VycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmlsbGFibGUgPSBpbm5lckVsZW1lbnQuaXNOaWxsYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lICE9IG51bGwgPyBxTmFtZS5nZXRMb2NhbFBhcnQoKSA6IGlubmVyRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gKHFOYW1lID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkubGVuZ3RoKCkgPT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA6IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY2hhbmdlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodmFsdWUgPSByZXF1ZXN0UGFyYW1ldGVyTWFwLmdldChuYW1lKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXF1ZXN0UGFyYW1ldGVyKHNvYXBGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGaXJzdENoaWxkLCBucywgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnMtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbk9jY3VycyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5pbGxhYmxlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHhzaSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX0RFRkFVTFRfU0NIRU1BX1hTSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLk5TX1BSRUZJWF9TQ0hFTUFfWFNJKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIG9tQXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoIm5pbCIsIHhzaSwgInRydWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChuYW1lLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5Rmlyc3RDaGlsZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEF0dHJpYnV0ZShvbUF0dHJpYnV0ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlJlcXVpcmVkIGVsZW1lbnQgIiArIHFOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBkZWZpbmVkIGluIHRoZSBzY2hlbWEgY2FuIG5vdCBiZSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvdW5kIGluIHRoZSByZXF1ZXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBFbnZlbG9wZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZVNPQVBNZXNzYWdlV2l0aG91dFNjaGVtYShTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUZpcnN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGVFbnRyeUhhc2hNYXAgcmVxdWVzdFBhcmFtZXRlck1hcCkgewotCi0gICAgICAgIC8vIGZpcnN0IGFkZCB0aGUgcGFyYW1ldGVycyBpbiB0aGUgVVJMCi0gICAgICAgIGlmIChyZXF1ZXN0UGFyYW1ldGVyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHJlcXVlc3RQYXJhbU1hcEl0ZXIgPSByZXF1ZXN0UGFyYW1ldGVyTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocmVxdWVzdFBhcmFtTWFwSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylyZXF1ZXN0UGFyYW1NYXBJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSByZXF1ZXN0UGFyYW1ldGVyTWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJlcXVlc3RQYXJhbWV0ZXIoc29hcEZhY3RvcnksIGJvZHlGaXJzdENoaWxkLCBudWxsLCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSZXF1ZXN0UGFyYW1ldGVyKFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYm9keUZpcnN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBEYXRhSGFuZGxlcikgewotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSAoRGF0YUhhbmRsZXIpcGFyYW1ldGVyOwotICAgICAgICAgICAgT01UZXh0IGRhdGFUZXh0ID0gYm9keUZpcnN0Q2hpbGQuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01UZXh0KAotICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlciwgdHJ1ZSk7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoa2V5LCBucywgYm9keUZpcnN0Q2hpbGQpLmFkZENoaWxkKAotICAgICAgICAgICAgICAgICAgICBkYXRhVGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dFZhbHVlID0gcGFyYW1ldGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoa2V5LCBucywgYm9keUZpcnN0Q2hpbGQpLnNldFRleHQoCi0gICAgICAgICAgICAgICAgICAgIHRleHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldFBPWEJ1aWxkZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBjaGFyU2V0RW5jKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgICAgIC8vIFdlIHVzZSB0aGUgU3RBWFBhcnNlckNvbmZpZ3VyYXRpb24uU09BUCBoZXJlIGFzIHdlbGwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFsbG93Ci0gICAgICAgIC8vIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb25zICh0aGF0IHBvdGVudGlhbGx5IHJlZmVyZW5jZSBleHRlcm5hbCBlbnRpdGllcyksIGV2ZW4KLSAgICAgICAgLy8gaW4gcGxhaW4gWE1MIG1lc3NhZ2VzLgotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1scmVhZGVyID0KLSAgICAgICAgICAgICAgICBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKFN0QVhQYXJzZXJDb25maWd1cmF0aW9uLlNPQVAsIGluU3RyZWFtLCBjaGFyU2V0RW5jKTsKLSAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHhtbHJlYWRlcik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZSB0aGUgQk9NIE1hcmsgdG8gaWRlbnRpZnkgdGhlIGVuY29kaW5nIHRvIGJlIHVzZWQuIEZhbGwgYmFjayB0byBkZWZhdWx0IGVuY29kaW5nCi0gICAgICogc3BlY2lmaWVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMgICAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSBvZiBhIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2hhclNldEVuY29kaW5nIGRlZmF1bHQgY2hhcmFjdGVyIHNldCBlbmNvZGluZwotICAgICAqIEByZXR1cm4gYSBSZWFkZXIgd2l0aCB0aGUgY29ycmVjdCBlbmNvZGluZyBhbHJlYWR5IHNldAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVhZGVyIGdldFJlYWRlcihmaW5hbCBJbnB1dFN0cmVhbSBpcywgZmluYWwgU3RyaW5nIGNoYXJTZXRFbmNvZGluZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFB1c2hiYWNrSW5wdXRTdHJlYW0gaXMyID0gZ2V0UHVzaGJhY2tJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGluZyA9IGdldENoYXJTZXRFbmNvZGluZyhpczIsIGNoYXJTZXRFbmNvZGluZyk7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtUmVhZGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXRTdHJlYW1SZWFkZXIgPSAoSW5wdXRTdHJlYW1SZWFkZXIpQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpczIsIGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRTdHJlYW1SZWFkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgYSBQdXNoYmFja0lucHV0U3RyZWFtIHNvIHRoYXQgd2UgY2FuIHJlYWQgdGhlIEJPTQotICAgICAqCi0gICAgICogQHBhcmFtIGlzIGEgcmVndWxhciBJbnB1dFN0cmVhbQotICAgICAqIEByZXR1cm4gYSBQdXNoYmFja0lucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBwYXNzZWQgb25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQdXNoYmFja0lucHV0U3RyZWFtIGdldFB1c2hiYWNrSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGlzLCBCT01fU0laRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlIHRoZSBCT00gTWFyayB0byBpZGVudGlmeSB0aGUgZW5jb2RpbmcgdG8gYmUgdXNlZC4gRmFsbCBiYWNrIHRvIGRlZmF1bHQgZW5jb2RpbmcKLSAgICAgKiBzcGVjaWZpZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBpczIgICAgICAgICAgICAgUHVzaEJhY2tJbnB1dFN0cmVhbSAoaXQgbXVzdCBiZSBhIHB1c2hiYWNrIGlucHV0IHN0cmVhbSBzbyB0aGF0IHdlIGNhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWFkIHRoZSBCT00pCi0gICAgICogQHBhcmFtIGRlZmF1bHRFbmNvZGluZyBkZWZhdWx0IGVuY29kaW5nIHN0eWxlIGlmIG5vIEJPTQotICAgICAqIEByZXR1cm4gdGhlIHNlbGVjdGVkIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGFyU2V0RW5jb2RpbmcoUHVzaGJhY2tJbnB1dFN0cmVhbSBpczIsIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZW5jb2Rpbmc7Ci0gICAgICAgIGJ5dGUgYm9tW10gPSBuZXcgYnl0ZVtCT01fU0laRV07Ci0gICAgICAgIGludCBuLCB1bnJlYWQ7Ci0KLSAgICAgICAgbiA9IGlzMi5yZWFkKGJvbSwgMCwgYm9tLmxlbmd0aCk7Ci0KLSAgICAgICAgaWYgKChib21bMF0gPT0gKGJ5dGUpMHhFRikgJiYgKGJvbVsxXSA9PSAoYnl0ZSkweEJCKSAmJiAoYm9tWzJdID09IChieXRlKTB4QkYpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9ICJVVEYtOCI7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNoYXIgc2V0IGVuY29kaW5nIHNldCBmcm9tIEJPTSA9IiArIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVucmVhZCA9IG4gLSAzOwotICAgICAgICB9IGVsc2UgaWYgKChib21bMF0gPT0gKGJ5dGUpMHhGRSkgJiYgKGJvbVsxXSA9PSAoYnl0ZSkweEZGKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSAiVVRGLTE2QkUiOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFyIHNldCBlbmNvZGluZyBzZXQgZnJvbSBCT00gPSIgKyBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnJlYWQgPSBuIC0gMjsKLSAgICAgICAgfSBlbHNlIGlmICgoYm9tWzBdID09IChieXRlKTB4RkYpICYmIChib21bMV0gPT0gKGJ5dGUpMHhGRSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gIlVURi0xNkxFIjsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY2hhciBzZXQgZW5jb2Rpbmcgc2V0IGZyb20gQk9NID0iICsgZW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5yZWFkID0gbiAtIDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGJvbVswXSA9PSAoYnl0ZSkweDAwKSAmJiAoYm9tWzFdID09IChieXRlKTB4MDApICYmIChib21bMl0gPT0gKGJ5dGUpMHhGRSkKLSAgICAgICAgICAgICAgICAgICAmJiAoYm9tWzNdID09IChieXRlKTB4RkYpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9ICJVVEYtMzJCRSI7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNoYXIgc2V0IGVuY29kaW5nIHNldCBmcm9tIEJPTSA9IiArIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVucmVhZCA9IG4gLSA0OwotICAgICAgICB9IGVsc2UgaWYgKChib21bMF0gPT0gKGJ5dGUpMHhGRikgJiYgKGJvbVsxXSA9PSAoYnl0ZSkweEZFKSAmJiAoYm9tWzJdID09IChieXRlKTB4MDApCi0gICAgICAgICAgICAgICAgICAgJiYgKGJvbVszXSA9PSAoYnl0ZSkweDAwKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSAiVVRGLTMyTEUiOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFyIHNldCBlbmNvZGluZyBzZXQgZnJvbSBCT00gPSIgKyBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnJlYWQgPSBuIC0gNDsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gVW5pY29kZSBCT00gbWFyayBub3QgZm91bmQsIHVucmVhZCBhbGwgYnl0ZXMKLSAgICAgICAgICAgIGVuY29kaW5nID0gZGVmYXVsdEVuY29kaW5nOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFyIHNldCBlbmNvZGluZyBzZXQgZnJvbSBkZWZhdWx0ID0iICsgZW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5yZWFkID0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1bnJlYWQgPiAwKSB7Ci0gICAgICAgICAgICBpczIudW5yZWFkKGJvbSwgKG4gLSB1bnJlYWQpLCB1bnJlYWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudmVsb3BlTmFtZXNwYWNlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICBTdHJpbmcgc29hcE5TID0gU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKFNPQVAxMkNvbnN0YW50cy5TT0FQXzEyX0NPTlRFTlRfVFlQRSkgPiAtMSkgewotICAgICAgICAgICAgICAgIC8vIGl0IGlzIFNPQVAgMS4yCi0gICAgICAgICAgICAgICAgc29hcE5TID0gU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUuaW5kZXhPZihTT0FQMTFDb25zdGFudHMuU09BUF8xMV9DT05URU5UX1RZUEUpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMQotICAgICAgICAgICAgICAgIHNvYXBOUyA9IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBOUzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHNldCBlbmNvZGluZyBmcm9tIHRoZSBDb250ZW50LXR5cGUgaGVhZGVyCi0gICAgICogPHAvPgotICAgICAqIEV4YW1wbGU6ICJDb250ZW50LVR5cGU6IHRleHQveG1sOyBjaGFyc2V0PXV0Zi04IiB3b3VsZCByZXR1cm4gInV0Zi04IgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIGEgY29udGVudC10eXBlIChmcm9tIEhUVFAgb3IgTUlNRSwgZm9yIGluc3RhbmNlKQotICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcgaWYgZm91bmQsIG9yIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDaGFyU2V0RW5jb2RpbmcoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbnB1dCBjb250ZW50VHlwZSAoIiArIGNvbnRlbnRUeXBlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgVVRGLTgKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hhclNldEVuY29kaW5nIGRlZmF1bHRlZCAoIiArIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50VHlwZS5pbmRleE9mKEhUVFBDb25zdGFudHMuQ0hBUl9TRVRfRU5DT0RJTkcpOwotCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgeyAgICAvLyBDaGFyc2V0IGVuY29kaW5nIG5vdCBmb3VuZCBpbiB0aGUgY29udGVudC10eXBlIGhlYWRlcgotICAgICAgICAgICAgLy8gVXNpbmcgdGhlIGRlZmF1bHQgVVRGLTgKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hhclNldEVuY29kaW5nIGRlZmF1bHRlZCAoIiArIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc3BhY2VzIGFyb3VuZCB0aGUgJz0nIHNpZ24KLSAgICAgICAgaW50IGluZGV4T2ZFcSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoIj0iLCBpbmRleCk7Ci0KLSAgICAgICAgLy8gVGhlcmUgY2FuIGJlIHNpdHVhdGlvbnMgd2hlcmUgImNoYXJzZXQiIGlzIG5vdCB0aGUgbGFzdCBwYXJhbWV0ZXIgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIKLSAgICAgICAgaW50IGluZGV4T2ZTZW1pQ29sb24gPSBjb250ZW50VHlwZS5pbmRleE9mKCI7IiwgaW5kZXhPZkVxKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIGlmIChpbmRleE9mU2VtaUNvbG9uID4gMCkgewotICAgICAgICAgICAgdmFsdWUgPSAoY29udGVudFR5cGUuc3Vic3RyaW5nKGluZGV4T2ZFcSArIDEsIGluZGV4T2ZTZW1pQ29sb24pKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlID0gKGNvbnRlbnRUeXBlLnN1YnN0cmluZyhpbmRleE9mRXEgKyAxLCBjb250ZW50VHlwZS5sZW5ndGgoKSkpLnRyaW0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZXJlIG1pZ2h0IGJlICIiIGFyb3VuZCB0aGUgdmFsdWUgLSBpZiBzbyByZW1vdmUgdGhlbQotICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXCInKSAhPSAtMSkgewotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlQWxsKCJcIiIsICIiKTsKLSAgICAgICAgfQotICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNoYXJTZXRFbmNvZGluZyBmcm9tIGNvbnRlbnQtdHlwZSAoIiArIHZhbHVlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRBdHRhY2htZW50c0J1aWxkZXIoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTT0FQKQotICAgICAgICAgICAgdGhyb3dzIE9NRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlcjsKLQotICAgICAgICBBdHRhY2htZW50cyBhdHRhY2htZW50cyA9IGNyZWF0ZUF0dGFjaG1lbnRzTWFwKG1zZ0NvbnRleHQsIGluU3RyZWFtLCBjb250ZW50VHlwZVN0cmluZyk7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSBnZXRDaGFyU2V0RW5jb2RpbmcoYXR0YWNobWVudHMuZ2V0U09BUFBhcnRDb250ZW50VHlwZSgpKTsKLQotICAgICAgICBpZiAoKGNoYXJTZXRFbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICAgfHwgIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UoY2hhclNldEVuY29kaW5nKSkgewotICAgICAgICAgICAgY2hhclNldEVuY29kaW5nID0gTWVzc2FnZUNvbnRleHQuVVRGXzg7Ci0gICAgICAgIH0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFB1c2hiYWNrSW5wdXRTdHJlYW0gcGlzID0gZ2V0UHVzaGJhY2tJbnB1dFN0cmVhbShhdHRhY2htZW50cy5nZXRTT0FQUGFydElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgU3RyaW5nIGFjdHVhbENoYXJTZXRFbmNvZGluZyA9IGdldENoYXJTZXRFbmNvZGluZyhwaXMsIGNoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgICAgIHN0cmVhbVJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocGlzLCBhY3R1YWxDaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIFB1dCBhIHJlZmVyZW5jZSB0byBBdHRhY2htZW50cyBNYXAgaW4gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBGb3IKLSAgICAgICAgLy8gYmFja3dvcmQgY29tcGF0aWJpbGl0eSB3aXRoIEF4aXMyIDEuMCAKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNVE9NQ29uc3RhbnRzLkFUVEFDSE1FTlRTLCBhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgLy8gU2V0dGluZyB0aGUgQXR0YWNobWVudHMgbWFwIHRvIG5ldyBTd0EgQVBJCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0QXR0YWNobWVudE1hcChhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgU3RyaW5nIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSA9IGdldEVudmVsb3BlTmFtZXNwYWNlKGNvbnRlbnRUeXBlU3RyaW5nKTsKLQotICAgICAgICBpZiAoaXNTT0FQKSB7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHMuZ2V0QXR0YWNobWVudFNwZWNUeXBlKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBNVE9NQ29uc3RhbnRzLk1UT01fVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAvL0NyZWF0ZXMgdGhlIE1UT00gc3BlY2lmaWMgTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyCi0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBNVE9NU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzLCBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdNVE9NKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIE1UT01Db25zdGFudHMuU1dBX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIE1UT01Db25zdGFudHMuU1dBX1RZUEVfMTIpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgLy8gVG8gaGFuZGxlIFJFU1QgWE9QIGNhc2UKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHMuZ2V0QXR0YWNobWVudFNwZWNUeXBlKCkuZXF1YWxzKE1UT01Db25zdGFudHMuTVRPTV9UWVBFKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgWE9QQXdhcmVTdEFYT01CdWlsZGVyKHN0cmVhbVJlYWRlciwgYXR0YWNobWVudHMpOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnRzLmdldEF0dGFjaG1lbnRTcGVjVHlwZSgpLmVxdWFscyhNVE9NQ29uc3RhbnRzLlNXQV9UWVBFKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihzdHJlYW1SZWFkZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoTVRPTUNvbnN0YW50cy5TV0FfVFlQRV8xMikpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgQXR0YWNobWVudHMgY3JlYXRlQXR0YWNobWVudHNNYXAoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlU3RyaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gZmlsZUNhY2hlRm9yQXR0YWNobWVudHMgPSBpc0F0dGFjaG1lbnRzQ2FjaGVFbmFibGVkKG1zZ0NvbnRleHQpOwotCi0gICAgICAgIFN0cmluZyBhdHRhY2htZW50UmVwb0RpciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhdHRhY2htZW50U2l6ZVRocmVzaG9sZCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGZpbGVDYWNoZUZvckF0dGFjaG1lbnRzKSB7Ci0gICAgICAgICAgICBPYmplY3QgYXR0YWNobWVudFJlcG9EaXJQcm9wZXJ0eSA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFUVEFDSE1FTlRfVEVNUF9ESVIpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNobWVudFJlcG9EaXJQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudFJlcG9EaXIgPSAoU3RyaW5nKWF0dGFjaG1lbnRSZXBvRGlyUHJvcGVydHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBhdHRhY2htZW50UmVwb0RpclBhcmFtZXRlciA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVRUQUNITUVOVF9URU1QX0RJUik7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudFJlcG9EaXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGF0dGFjaG1lbnRSZXBvRGlyUGFyYW1ldGVyICE9IG51bGwpID8gKFN0cmluZylhdHRhY2htZW50UmVwb0RpclBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9iamVjdCBhdHRhY2htZW50U2l6ZVRocmVzaG9sZFByb3BlcnR5ID0gbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRklMRV9TSVpFX1RIUkVTSE9MRCk7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudFNpemVUaHJlc2hvbGRQcm9wZXJ0eSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgYXR0YWNobWVudFNpemVUaHJlc2hvbGRQcm9wZXJ0eSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRTaXplVGhyZXNob2xkID0gKFN0cmluZylhdHRhY2htZW50U2l6ZVRocmVzaG9sZFByb3BlcnR5OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgYXR0YWNobWVudFNpemVUaHJlc2hvbGRQYXJhbWV0ZXIgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkZJTEVfU0laRV9USFJFU0hPTEQpOwotICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRTaXplVGhyZXNob2xkID0gYXR0YWNobWVudFNpemVUaHJlc2hvbGRQYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlmIGl0IGlzIGF2YWlsYWJsZQotICAgICAgICBpbnQgY29udGVudExlbmd0aCA9IDA7Ci0gICAgICAgIE1hcCBoZWFkZXJzID0gKE1hcCltc2dDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9IRUFERVJTKTsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRMZW5ndGhWYWx1ZSA9IChTdHJpbmcpaGVhZGVycy5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9MRU5HVEgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGhWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudExlbmd0aCA9IG5ldyBJbnRlZ2VyKGNvbnRlbnRMZW5ndGhWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aCBpcyBub3QgYSB2YWxpZCBudW1iZXIuICBXaWxsIGFzc3VtZSBpdCBpcyBub3Qgc2V0OiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50TGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRpbmcgYW4gQXR0YWNobWVudHMgbWFwLiAgVGhlIGNvbnRlbnQtbGVuZ3RoIGlzIiArIGNvbnRlbnRMZW5ndGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGFuIEF0dGFjaG1lbnRzIG1hcC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlQXR0YWNobWVudHMobXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ2FjaGVGb3JBdHRhY2htZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRSZXBvRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFNpemVUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdHRhY2htZW50c0NhY2hlRW5hYmxlZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIE9iamVjdCBjYWNoZUF0dGFjaG1lbnRQcm9wZXJ0eSA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0FDSEVfQVRUQUNITUVOVFMpOwotICAgICAgICBTdHJpbmcgY2FjaGVBdHRhY2htZW50U3RyaW5nOwotICAgICAgICBib29sZWFuIGZpbGVDYWNoZUZvckF0dGFjaG1lbnRzOwotCi0gICAgICAgIGlmIChjYWNoZUF0dGFjaG1lbnRQcm9wZXJ0eSAhPSBudWxsICYmIGNhY2hlQXR0YWNobWVudFByb3BlcnR5IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICBjYWNoZUF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKWNhY2hlQXR0YWNobWVudFByb3BlcnR5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlcl9jYWNoZV9hdHRhY2htZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0FDSEVfQVRUQUNITUVOVFMpOwotICAgICAgICAgICAgY2FjaGVBdHRhY2htZW50U3RyaW5nID0gKHBhcmFtZXRlcl9jYWNoZV9hdHRhY2htZW50ICE9IG51bGwpID8KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZylwYXJhbWV0ZXJfY2FjaGVfYXR0YWNobWVudC5nZXRWYWx1ZSgpIDogbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaWxlQ2FjaGVGb3JBdHRhY2htZW50cyA9IChDb25zdGFudHMuVkFMVUVfVFJVRS5lcXVhbHMoY2FjaGVBdHRhY2htZW50U3RyaW5nKSk7Ci0gICAgICAgIHJldHVybiBmaWxlQ2FjaGVGb3JBdHRhY2htZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF0dGFjaG1lbnRzIGNyZWF0ZUF0dGFjaG1lbnRzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlsZUNhY2hlRm9yQXR0YWNobWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0YWNobWVudFJlcG9EaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0YWNobWVudFNpemVUaHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udGVudExlbmd0aCkgewotICAgICAgICBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG1zZ0NvbnRleHQuZ2V0Um9vdENvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgbWFuYWdlciA9IChMaWZlY3ljbGVNYW5hZ2VyKWNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlclZhbHVlKERlcGxveW1lbnRDb25zdGFudHMuQVRUQUNITUVOVFNfTElGRUNZQ0xFX01BTkFHRVIpOwotICAgICAgICAgICAgaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlckltcGwoKTsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmFkZFBhcmFtZXRlcihEZXBsb3ltZW50Q29uc3RhbnRzLkFUVEFDSE1FTlRTX0xJRkVDWUNMRV9NQU5BR0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gZ2V0dGluZyBBdHRhY2htZW50cyBMaWZlY3ljbGVNYW5hZ2VyIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBBdHRhY2htZW50cyhtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDYWNoZUZvckF0dGFjaG1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRSZXBvRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRTaXplVGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRMZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGdldCBhIFN0QVhCdWlsZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gYW4gSW5wdXRTdHJlYW0KLSAgICAgKiBAcmV0dXJuIGEgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgZm9yIHRoZSBnaXZlbiBJbnB1dFN0cmVhbQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQgSWYgc29tZSBvbmUgcmVhbGx5IG5lZWQgdGhpcyBtZXRob2QsIHBsZWFzZSBzaG91dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldEJ1aWxkZXIoUmVhZGVyIGluKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW4pOwotICAgICAgICByZXR1cm4gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHhtbHJlYWRlciwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBPTUJ1aWxkZXIgZm9yIGEgcGxhaW4gWE1MIG1lc3NhZ2UuIERlZmF1bHQgY2hhcmFjdGVyIHNldCBlbmNvcmRpbmcgaXMgdXNlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpblN0cmVhbSBJbnB1dFN0cmVhbSBmb3IgYSBYTUwgbWVzc2FnZQotICAgICAqIEByZXR1cm4gSGFuZGxlciB0byBhIE9NQnVpbGRlciBpbXBsZW1lbnRhdGlvbiBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRCdWlsZGVyKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW5TdHJlYW0pOwotICAgICAgICByZXR1cm4gbmV3IFN0QVhPTUJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIE9NQnVpbGRlciBmb3IgYSBwbGFpbiBYTUwgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpblN0cmVhbSAgIElucHV0U3RyZWFtIGZvciBhIFhNTCBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNoYXJTZXRFbmMgQ2hhcmFjdGVyIHNldCBlbmNvZGluZyB0byBiZSB1c2VkCi0gICAgICogQHJldHVybiBIYW5kbGVyIHRvIGEgT01CdWlsZGVyIGltcGxlbWVudGF0aW9uIGluc3RhbmNlCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldEJ1aWxkZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBjaGFyU2V0RW5jKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluU3RyZWFtLCBjaGFyU2V0RW5jKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIk9NRXhjZXB0aW9uIGluIGdldFNPQVBCdWlsZGVyIiwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1haW5pbmcgaW5wdXQgc3RyZWFtIDpbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KGluU3RyZWFtKSwgY2hhclNldEVuYykgKyAiXSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGhlcmU/Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBPTUJ1aWxkZXIgZm9yIGEgU09BUCBtZXNzYWdlLiBEZWZhdWx0IGNoYXJhY3RlciBzZXQgZW5jb3JkaW5nIGlzIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5TdHJlYW0gSW5wdXRTdHJlYW0gZm9yIGEgU09BUCBtZXNzYWdlCi0gICAgICogQHJldHVybiBIYW5kbGVyIHRvIGEgT01CdWlsZGVyIGltcGxlbWVudGF0aW9uIGluc3RhbmNlCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0QVhCdWlsZGVyIGdldFNPQVBCdWlsZGVyKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW5TdHJlYW0pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcih4bWxSZWFkZXIpOwotICAgICAgICB9IGNhdGNoIChPTUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiT01FeGNlcHRpb24gaW4gZ2V0U09BUEJ1aWxkZXIiLCBlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbWFpbmluZyBpbnB1dCBzdHJlYW0gOlsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkoaW5TdHJlYW0pKSArICJdIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgaGVyZT8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIE9NQnVpbGRlciBmb3IgYSBTT0FQIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5TdHJlYW0gICBJbnB1dFN0cmVhbSBmb3IgYSBTT0FQIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2hhclNldEVuYyBDaGFyYWN0ZXIgc2V0IGVuY29kaW5nIHRvIGJlIHVzZWQKLSAgICAgKiBAcmV0dXJuIEhhbmRsZXIgdG8gYSBPTUJ1aWxkZXIgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RBWEJ1aWxkZXIgZ2V0U09BUEJ1aWxkZXIoSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFN0cmluZyBjaGFyU2V0RW5jKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluU3RyZWFtLCBjaGFyU2V0RW5jKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoeG1sUmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoT01FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIk9NRXhjZXB0aW9uIGluIGdldFNPQVBCdWlsZGVyIiwgZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1haW5pbmcgaW5wdXQgc3RyZWFtIDpbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhJT1V0aWxzLmdldFN0cmVhbUFzQnl0ZUFycmF5KGluU3RyZWFtKSwgY2hhclNldEVuYykgKyAiXSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGhlcmU/Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdEFYQnVpbGRlciBnZXRCdWlsZGVyKFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5LCBJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGNoYXJTZXRFbmMpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlcjsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbHJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaW4sIGNoYXJTZXRFbmMpOwotICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoc29hcEZhY3RvcnksIHhtbHJlYWRlcik7Ci0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWwgd29yayBmb3IgYSBidWlsZGVyIHNlbGVjdG9yIHdoaWNoIHNlbGVjdHMgdGhlIGJ1aWxkZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBmb3JtYXQKLSAgICAgKiBiYXNlZCBvbiB0aGUgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVjaWV2ZWQgbWVzc2FnZS4gY29udGVudC10eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUKLSAgICAgKiBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgQXhpczIueG1sLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgICAgICAgY29udGVudC10eXBlCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIgcmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBnaXZlbiBjb250ZW50LXR5cGUKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBnZXRCdWlsZGVyRnJvbVNlbGVjdG9yKFN0cmluZyB0eXBlLCBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCWJvb2xlYW4gdXNlRmFsbGJhY2tCdWlsZGVyID0gZmFsc2U7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQYXJhbWV0ZXIgdXNlRmFsbGJhY2tQYXJhbWV0ZXIgPSBjb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfREVGQVVMVF9GQUxMQkFDS19CVUlMREVSKTsKLSAgICAgICAgaWYgKHVzZUZhbGxiYWNrUGFyYW1ldGVyICE9bnVsbCl7Ci0gICAgICAgIAl1c2VGYWxsYmFja0J1aWxkZXIgPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseSh1c2VGYWxsYmFja1BhcmFtZXRlci5nZXRWYWx1ZSgpLHVzZUZhbGxiYWNrQnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVpbGRlciBidWlsZGVyID0gY29uZmlndXJhdGlvbi5nZXRNZXNzYWdlQnVpbGRlcih0eXBlLHVzZUZhbGxiYWNrQnVpbGRlcik7Ci0gICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3QgaGFzIGEgQWNjZXB0IGhlYWRlciBpZiBzbyB1c2UgdGhhdCBhcyB0aGUgcmVzcG9uc2UKLSAgICAgICAgICAgIC8vIG1lc3NhZ2UgdHlwZS4KLSAgICAgICAgICAgIC8vIElmIHRoYXRzIG5vdCBwcmVzZW50LAotICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgcmVjZWl2ZWQgY29udGVudC10eXBlIGFzIHRoZSBtZXNzYWdlVHlwZSB0byBtYWtlCi0gICAgICAgICAgICAvLyBzdXJlIHRoYXQgd2UgcmVzcG9uZCB1c2luZyB0aGUgcmVjZWl2ZWQgbWVzc2FnZSBzZXJpYWxpemF0aW9uIGZvcm1hdC4KLQotICAgICAgICAgICAgT2JqZWN0IGNvbnRlbnROZWdvdGlhdGlvbiA9IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlclZhbHVlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9IVFRQX0NPTlRFTlRfTkVHT1RJQVRJT04pOwotICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGNvbnRlbnROZWdvdGlhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBNYXAgdHJhbnNwb3J0SGVhZGVycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoTWFwKW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnRIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjY2VwdEhlYWRlciA9IChTdHJpbmcpdHJhbnNwb3J0SGVhZGVycy5nZXQoSFRUUENvbnN0YW50cy5IRUFERVJfQUNDRVBUKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdEhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBhY2NlcHRIZWFkZXIuaW5kZXhPZigiOyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEhlYWRlciA9IGFjY2VwdEhlYWRlci5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IGFjY2VwdEhlYWRlci5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc3RyaW5nIDogc3RyaW5ncykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY2NlcHQgPSBzdHJpbmcudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbnQgd2FudCBkeW5hbWljIGNvbnRlbnQgbmVnb3RvYXRpbiB0byB3b3JrIG9uIHRleHQueG1sIGFzIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFtYmlndW9zIGFzIHRvIHdoZXRoZXIgdGhlIHVzZXIgcmVxdWVzdHMgU09BUCAxLjEgb3IgUE9YIHJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKGFjY2VwdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRNZXNzYWdlRm9ybWF0dGVyKGFjY2VwdCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gc3RyaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFLCB0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVTT0FQVmVyc2lvbihTdHJpbmcgc29hcE5hbWVzcGFjZVVSSUZyb21UcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlKSB7Ci0gICAgICAgIGlmIChzb2FwTmFtZXNwYWNlVVJJRnJvbVRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBlbnZlbG9wZU5hbWVzcGFjZSA9IGVudmVsb3BlLmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZU5hbWUgPSBlbnZlbG9wZU5hbWVzcGFjZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGlmICghKHNvYXBOYW1lc3BhY2VVUklGcm9tVHJhbnNwb3J0LmVxdWFscyhuYW1lc3BhY2VOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0IGxldmVsIGluZm9ybWF0aW9uIGRvZXMgbm90IG1hdGNoIHdpdGggU09BUCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBNZXNzYWdlIG5hbWVzcGFjZSBVUkkiLCBlbnZlbG9wZU5hbWVzcGFjZS5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuRkFVTFRfQ09ERV9WRVJTSU9OX01JU01BVENIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNoYXJTZXRFbmNvZGluZyhTdHJpbmcgY2hhcnNldEVuY29kaW5nRnJvbVRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXRFbmNvZGluZ0Zyb21YTUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwTmFtZXNwYWNlVVJJKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKChjaGFyc2V0RW5jb2RpbmdGcm9tWE1MICE9IG51bGwpCi0gICAgICAgICAgICAmJiAhIiIuZXF1YWxzKGNoYXJzZXRFbmNvZGluZ0Zyb21YTUwpCi0gICAgICAgICAgICAmJiAoY2hhcnNldEVuY29kaW5nRnJvbVRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICAgICAgJiYgIWNoYXJzZXRFbmNvZGluZ0Zyb21YTUwuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0RW5jb2RpbmdGcm9tVHJhbnNwb3J0KQotICAgICAgICAgICAgJiYgIWNvbXBhdGlibGVFbmNvZGluZ3MoY2hhcnNldEVuY29kaW5nRnJvbVhNTCwgY2hhcnNldEVuY29kaW5nRnJvbVRyYW5zcG9ydCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdENvZGU7Ci0KLSAgICAgICAgICAgIGlmIChTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhzb2FwTmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgIGZhdWx0Q29kZSA9IFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1NFTkRFUjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRDb2RlID0gU09BUDExQ29uc3RhbnRzLkZBVUxUX0NPREVfU0VOREVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDaGFyYWN0ZXIgU2V0IEVuY29kaW5nIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0cmFuc3BvcnQgaW5mb3JtYXRpb24gWyIgKyBjaGFyc2V0RW5jb2RpbmdGcm9tVHJhbnNwb3J0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gZG9lcyBub3QgbWF0Y2ggd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNoYXJhY3RlciBzZXQgZW5jb2RpbmcgaW4gdGhlIHJlY2VpdmVkIFNPQVAgbWVzc2FnZSBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRFbmNvZGluZ0Zyb21YTUwgKyAiXSIsIGZhdWx0Q29kZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjaGVjayBpZiB0aGUgcGFpciBpcyBbVVRGLTE2LFVURi0xNkxFXSBbVVRGLTMyLCBVVEYtMzJMRV0sW1VURi0xNixVVEYtMTZCRV0gW1VURi0zMiwKLSAgICAgKiBVVEYtMzJCRV0gZXRjLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYzEgZW5jb2Rpbmcgc3R5bGUKLSAgICAgKiBAcGFyYW0gZW5jMiBlbmNvZGluZyBzdHlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZW5jb2Rpbmcgc3R5bGVzIGFyZSBjb21wYXRpYmxlLCBvciBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhdGlibGVFbmNvZGluZ3MoU3RyaW5nIGVuYzEsIFN0cmluZyBlbmMyKSB7Ci0gICAgICAgIGVuYzEgPSBlbmMxLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGVuYzIgPSBlbmMyLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIGlmIChlbmMxLmVuZHNXaXRoKCJiZSIpIHx8IGVuYzEuZW5kc1dpdGgoImxlIikpIHsKLSAgICAgICAgICAgIGVuYzEgPSBlbmMxLnN1YnN0cmluZygwLCBlbmMxLmxlbmd0aCgpIC0gMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuYzIuZW5kc1dpdGgoImJlIikgfHwgZW5jMi5lbmRzV2l0aCgibGUiKSkgewotICAgICAgICAgICAgZW5jMiA9IGVuYzIuc3Vic3RyaW5nKDAsIGVuYzIubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jMS5lcXVhbHMoZW5jMik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGF0YVNvdXJjZUJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0RhdGFTb3VyY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODJlZmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGF0YVNvdXJjZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5pbXBsLkJ1ZmZlclV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgRGF0YVNvdXJjZUJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsNCi0NCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkNCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsNCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOw0KLSAgICAgICAgDQotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBPTU5hbWVzcGFjZUltcGwoIiIsICIiKTsNCi0gICAgICAgIE9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7DQotICAgICAgICBieXRlW10gYnl0ZXM7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOyANCi0gICAgICAgICAgICBCdWZmZXJVdGlscy5pbnB1dFN0cmVhbTJPdXRwdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGJhb3MpOw0KLSAgICAgICAgICAgIGJhb3MuZmx1c2goKTsNCi0gICAgICAgICAgICBieXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsNCi0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgQnl0ZUFycmF5RGF0YVNvdXJjZUV4IGRzID0gbmV3IEJ5dGVBcnJheURhdGFTb3VyY2VFeChieXRlcywgY29udGVudFR5cGUpOw0KLSAgICAgICAgcmV0dXJuIG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbCgiZHVtbXkiLCBucywgZmFjdG9yeSwgZHMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBjbGFzcyBCeXRlQXJyYXlEYXRhU291cmNlRXggZXh0ZW5kcyBqYXZheC5tYWlsLnV0aWwuQnl0ZUFycmF5RGF0YVNvdXJjZSBpbXBsZW1lbnRzIE9NRGF0YVNvdXJjZSB7DQotICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlczsNCi0gICAgDQotICAgICAgICBwdWJsaWMgQnl0ZUFycmF5RGF0YVNvdXJjZUV4KGJ5dGVbXSBieXRlcywgU3RyaW5nIHMpIHsNCi0gICAgICAgICAgICBzdXBlcihieXRlcywgcyk7DQotICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJ5dGVzKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICANCi0gICAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgew0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDb250ZW50VHlwZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFdyaXRlciB3cml0ZXIsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJGSVhNRSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiRklYTUUiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJGSVhNRSIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL0Rpc2tGaWxlRGF0YVNvdXJjZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGlza0ZpbGVEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzUyNzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvRGlza0ZpbGVEYXRhU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5kaXNrLkRpc2tGaWxlSXRlbTsKLQotcHVibGljIGNsYXNzIERpc2tGaWxlRGF0YVNvdXJjZSBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewotCi0gICAgcHJpdmF0ZSBEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtOwotCi0gICAgcHVibGljIERpc2tGaWxlRGF0YVNvdXJjZShEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtKSB7Ci0gICAgICAgIHRoaXMuZGlza0ZpbGVJdGVtID0gZGlza0ZpbGVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc2tGaWxlSXRlbS5nZXRDb250ZW50VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc2tGaWxlSXRlbS5nZXRJbnB1dFN0cmVhbSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGlza0ZpbGVJdGVtLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc2tGaWxlSXRlbS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0gICAgICAgIHRoaXMuZGlza0ZpbGVJdGVtLmRlbGV0ZSgpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL01JTUVCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9NSU1FQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU1NjZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL01JTUVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC5tYWlsLmludGVybmV0LkNvbnRlbnRUeXBlOwotaW1wb3J0IGphdmF4Lm1haWwuaW50ZXJuZXQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIE1JTUVCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPQotICAgICAgICAgICAgICAgIEJ1aWxkZXJVdGlsLmNyZWF0ZUF0dGFjaG1lbnRzTWFwKG1zZ0NvbnRleHQsIGlucHV0U3RyZWFtLCBjb250ZW50VHlwZSk7Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPQotICAgICAgICAgICAgICAgIEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhhdHRhY2htZW50cy5nZXRTT0FQUGFydENvbnRlbnRUeXBlKCkpOwotCi0gICAgICAgIGlmICgoY2hhclNldEVuY29kaW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgIm51bGwiLmVxdWFsc0lnbm9yZUNhc2UoY2hhclNldEVuY29kaW5nKSkgewotICAgICAgICAgICAgY2hhclNldEVuY29kaW5nID0gTWVzc2FnZUNvbnRleHQuVVRGXzg7Ci0gICAgICAgIH0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgLy8gIFB1dCBhIHJlZmVyZW5jZSB0byBBdHRhY2htZW50cyBNYXAgaW4gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBGb3IKLSAgICAgICAgLy8gYmFja3dvcmQgY29tcGF0aWJpbGl0eSB3aXRoIEF4aXMyIDEuMCAKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNVE9NQ29uc3RhbnRzLkFUVEFDSE1FTlRTLCBhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgLy8gU2V0dGluZyB0aGUgQXR0YWNobWVudHMgbWFwIHRvIG5ldyBTd0EgQVBJCi0gICAgICAgIG1zZ0NvbnRleHQuc2V0QXR0YWNobWVudE1hcChhdHRhY2htZW50cyk7Ci0gICAgICAgIC8vIFdlIHNldCB0aGUgZm9sbG93aW5nIGZvciBhbGwgdGhlIE1JTUUgbWVzc2FnZXMuLiBXaWxsIGJlIG92ZXJyaWRkZW4KLSAgICAgICAgLy8gYnkgc3Vic2VxdWVudCBidWlsZGVycyhlZzpNVE9NQnVpbGRlcikgaWYgbmVlZGVkLi4KLSAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1N3QSh0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRlbnRUeXBlIGN0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY3QgPSBuZXcgQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIENvbnRlbnQgVHlwZSBGaWVsZCBpbiB0aGUgTWltZSBNZXNzYWdlIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0eXBlID0gY3QuZ2V0UGFyYW1ldGVyKCJ0eXBlIik7Ci0gICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgQnVpbGRlclV0aWwuZ2V0QnVpbGRlckZyb21TZWxlY3Rvcih0eXBlLCBtc2dDb250ZXh0KTsKLSAgICAgICAgaWYoTVRPTUNvbnN0YW50cy5NVE9NX1RZUEUuZXF1YWxzKHR5cGUpKXsKLSAgICAgICAgICAgIFN0cmluZyBzdGFydEluZm8gPSBjdC5nZXRQYXJhbWV0ZXIoInN0YXJ0LWluZm8iKTsKLSAgICAgICAgICAgIGlmKHN0YXJ0SW5mbyAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICB0eXBlID0gc3RhcnRJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnByb2Nlc3NEb2N1bWVudChhdHRhY2htZW50cy5nZXRTT0FQUGFydElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgdHlwZSwgbXNnQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvTVRPTUJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL01UT01CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWZmODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvTVRPTUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5BdHRhY2htZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBNVE9NQnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPSBtZXNzYWdlQ29udGV4dC5nZXRBdHRhY2htZW50TWFwKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuY29kaW5nID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBhY3R1YWwgZW5jb2RpbmcgYnkgbG9va2luZyBhdCB0aGUgQk9NIG9mIHRoZSBJbnB1dFN0cmVhbQotICAgICAgICAgICAgUHVzaGJhY2tJbnB1dFN0cmVhbSBwaXMgPSBCdWlsZGVyVXRpbC5nZXRQdXNoYmFja0lucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIFN0cmluZyBhY3R1YWxDaGFyU2V0RW5jb2RpbmcgPSBCdWlsZGVyVXRpbC5nZXRDaGFyU2V0RW5jb2RpbmcocGlzLCBjaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHZXQgdGhlIFhNTFN0cmVhbVJlYWRlciBmb3IgdGhpcyBpbnB1dCBzdHJlYW0KLSAgICAgICAgICAgIHN0cmVhbVJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoU3RBWFBhcnNlckNvbmZpZ3VyYXRpb24uU09BUCwgcGlzLCBhY3R1YWxDaGFyU2V0RW5jb2RpbmcpOyAgICAgICAgCi0gICAgICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gbmV3IE1UT01TdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBCdWlsZGVyVXRpbAotICAgICAgICAgICAgICAgICAgICAudmFsaWRhdGVTT0FQVmVyc2lvbihCdWlsZGVyVXRpbC5nZXRFbnZlbG9wZU5hbWVzcGFjZShjb250ZW50VHlwZSksIGVudmVsb3BlKTsKLSAgICAgICAgICAgIEJ1aWxkZXJVdGlsLnZhbGlkYXRlQ2hhclNldEVuY29kaW5nKGNoYXJTZXRFbmNvZGluZywgYnVpbGRlci5nZXREb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDaGFyc2V0RW5jb2RpbmcoKSwgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgLy9PdmVycmlkaW5nIHRoZSBlYXJsaWVyIHNldHRpbmcgYnkgTUlNRUJ1aWxkZXIKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldERvaW5nU3dBKGZhbHNlKTsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldERvaW5nTVRPTSh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiBlbnZlbG9wZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL011bHRpcGFydEZvcm1EYXRhQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2IyOWY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL011bHRpcGFydEZvcm1EYXRhQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NdWx0aXBsZUVudHJ5SGFzaE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlSXRlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuRmlsZVVwbG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5kaXNrLkRpc2tGaWxlSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5kaXNrLkRpc2tGaWxlSXRlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuc2VydmxldC5TZXJ2bGV0RmlsZVVwbG9hZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0Q29udGV4dDsKLQotcHVibGljIGNsYXNzIE11bHRpcGFydEZvcm1EYXRhQnVpbGRlciBpbXBsZW1lbnRzIEJ1aWxkZXIgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTdHJpbmcgY29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTXVsdGlwbGVFbnRyeUhhc2hNYXAgcGFyYW1ldGVyTWFwOwotICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCk7Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbm5vdCBjcmVhdGUgRG9jdW1lbnRFbGVtZW50IHdpdGhvdXQgSHR0cFNlcnZsZXRSZXF1ZXN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBEbyBjaGVjayBDb250ZW50TGVuZ3RoIGZvciB0aGUgbWF4IHNpemUsCi0gICAgICAgIC8vICAgICAgIGJ1dCBpdCBjYW4ndCBiZSBjb25maWd1cmVkIGFueXdoZXJlLgotICAgICAgICAvLyAgICAgICBJIHRoaW5rIHRoYXQgaXQgY2FudCBiZSBjb25maWd1cmVkIGF0IHdlYi54bWwgb3IgYXhpczIueG1sLgotCi0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICBpZiAoY2hhclNldEVuY29kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoYXJTZXRFbmNvZGluZyA9IHJlcXVlc3QuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJNYXAgPSBnZXRQYXJhbWV0ZXJNYXAocmVxdWVzdCwgY2hhclNldEVuY29kaW5nKTsKLSAgICAgICAgICAgIHJldHVybiBCdWlsZGVyVXRpbC5idWlsZHNvYXBNZXNzYWdlKG1lc3NhZ2VDb250ZXh0LCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCkpOwotCi0gICAgICAgIH0gY2F0Y2ggKEZpbGVVcGxvYWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBNdWx0aXBsZUVudHJ5SGFzaE1hcCBnZXRQYXJhbWV0ZXJNYXAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmNvZGluZykKLSAgICAgICAgICAgIHRocm93cyBGaWxlVXBsb2FkRXhjZXB0aW9uIHsKLQotICAgICAgICBNdWx0aXBsZUVudHJ5SGFzaE1hcCBwYXJhbWV0ZXJNYXAgPSBuZXcgTXVsdGlwbGVFbnRyeUhhc2hNYXAoKTsKLQotICAgICAgICBMaXN0IGl0ZW1zID0gcGFyc2VSZXF1ZXN0KG5ldyBTZXJ2bGV0UmVxdWVzdENvbnRleHQocmVxdWVzdCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBEaXNrRmlsZUl0ZW0gZGlza0ZpbGVJdGVtID0gKERpc2tGaWxlSXRlbSlpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc0Zvcm1GaWVsZCA9IGRpc2tGaWxlSXRlbS5pc0Zvcm1GaWVsZCgpOwotCi0gICAgICAgICAgICBPYmplY3QgdmFsdWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpc0Zvcm1GaWVsZCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldFRleHRQYXJhbWV0ZXIoZGlza0ZpbGVJdGVtLCBjaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RmlsZVBhcmFtZXRlcihkaXNrRmlsZUl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlVXBsb2FkRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbWV0ZXJNYXAucHV0KGRpc2tGaWxlSXRlbS5nZXRGaWVsZE5hbWUoKSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlck1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0IHBhcnNlUmVxdWVzdChTZXJ2bGV0UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgRmlsZVVwbG9hZEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIGZhY3RvcnkgZm9yIGRpc2stYmFzZWQgZmlsZSBpdGVtcwotICAgICAgICBGaWxlSXRlbUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEaXNrRmlsZUl0ZW1GYWN0b3J5KCk7Ci0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBmaWxlIHVwbG9hZCBoYW5kbGVyCi0gICAgICAgIFNlcnZsZXRGaWxlVXBsb2FkIHVwbG9hZCA9IG5ldyBTZXJ2bGV0RmlsZVVwbG9hZChmYWN0b3J5KTsKLSAgICAgICAgLy8gUGFyc2UgdGhlIHJlcXVlc3QKLSAgICAgICAgcmV0dXJuIHVwbG9hZC5wYXJzZVJlcXVlc3QocmVxdWVzdENvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHRQYXJhbWV0ZXIoRGlza0ZpbGVJdGVtIGRpc2tGaWxlSXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyYWN0ZXJFbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZGlza0ZpbGVJdGVtLmdldENoYXJTZXQoKTsKLQotICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBjaGFyYWN0ZXJFbmNvZGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0ZXh0VmFsdWU7Ci0gICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0ZXh0VmFsdWUgPSBuZXcgU3RyaW5nKGRpc2tGaWxlSXRlbS5nZXQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZXh0VmFsdWUgPSBuZXcgU3RyaW5nKGRpc2tGaWxlSXRlbS5nZXQoKSwgZW5jb2RpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRleHRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIGdldEZpbGVQYXJhbWV0ZXIoRGlza0ZpbGVJdGVtIGRpc2tGaWxlSXRlbSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIERhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG5ldyBEaXNrRmlsZURhdGFTb3VyY2UoZGlza0ZpbGVJdGVtKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoZGF0YVNvdXJjZSk7Ci0KLSAgICAgICAgcmV0dXJuIGRhdGFIYW5kbGVyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvU09BUEJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1NPQVBCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTcxNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvU09BUEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhQYXJzZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFNPQVBCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IHByb2Nlc3NEb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEFwcGx5IGEgZGV0YWNoYWJsZSBpbnB1dHN0cmVhbS4gIFRoaXMgY2FuIGJlIHVzZWQgbGF0ZXIKLSAgICAgICAgICAgIC8vIHRvIChhKSBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZSBvciAoYikKLSAgICAgICAgICAgIC8vIGZyZWUgdHJhbnNwb3J0IHJlc291cmNlcy4KLSAgICAgICAgICAgIERldGFjaGFibGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBEZXRhY2hhYmxlSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkRFVEFDSEFCTEVfSU5QVVRfU1RSRUFNLCBpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCB0aGUgYWN0dWFsIGVuY29kaW5nIGJ5IGxvb2tpbmcgYXQgdGhlIEJPTSBvZiB0aGUgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIFB1c2hiYWNrSW5wdXRTdHJlYW0gcGlzID0gQnVpbGRlclV0aWwuZ2V0UHVzaGJhY2tJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsQ2hhclNldEVuY29kaW5nID0gQnVpbGRlclV0aWwuZ2V0Q2hhclNldEVuY29kaW5nKHBpcywgY2hhclNldEVuY29kaW5nKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gR2V0IHRoZSBYTUxTdHJlYW1SZWFkZXIgZm9yIHRoaXMgaW5wdXQgc3RyZWFtLgotICAgICAgICAgICAgLy8gTm90ZTogU3RBWFNPQVBNb2RlbEJ1aWxkZXIgd2lsbCB0cmlnZ2VyIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGVuY291bnRlcnMgYSBEVEQgZXZlbnQuCi0gICAgICAgICAgICAvLyAgICAgICBIb3dldmVyLCB3aXRoIFN0QVggaW1wbGVtZW50YXRpb25zIG90aGVyIHRoYW4gV29vZHN0b3gsIHRoaXMgbWF5IGFscmVhZHkgYmUKLSAgICAgICAgICAgIC8vICAgICAgIHRvbyBsYXRlLiBGb3IgdGhlc2UgcGFyc2VycywgYWRkaXRpb25hbCBzZXR0aW5ncyBtYXkgYmUgcmVxdWlyZWQuIFdlIGxldAotICAgICAgICAgICAgLy8gICAgICAgdGhlIFN0QVggZGlhbGVjdCBkZXRlY3RvciBpbiBBeGlvbSBhcHBseSB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAvLyAgICAgICBTZWUgYWxzbyBBWElTMi00NDUwLgotICAgICAgICAgICAgc3RyZWFtUmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihTdEFYUGFyc2VyQ29uZmlndXJhdGlvbi5TT0FQLCBwaXMsCi0gICAgICAgICAgICAgICAgICAgIGFjdHVhbENoYXJTZXRFbmNvZGluZyk7Ci0KLSAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBCdWlsZGVyVXRpbAotICAgICAgICAgICAgICAgICAgICAudmFsaWRhdGVTT0FQVmVyc2lvbihCdWlsZGVyVXRpbC5nZXRFbnZlbG9wZU5hbWVzcGFjZShjb250ZW50VHlwZSksIGVudmVsb3BlKTsKLSAgICAgICAgICAgIEJ1aWxkZXJVdGlsLnZhbGlkYXRlQ2hhclNldEVuY29kaW5nKGNoYXJTZXRFbmNvZGluZywgYnVpbGRlci5nZXREb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDaGFyc2V0RW5jb2RpbmcoKSwgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1hGb3JtVVJMRW5jb2RlZEJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1hGb3JtVVJMRW5jb2RlZEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjOGE5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci9YRm9ybVVSTEVuY29kZWRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSSUVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NdWx0aXBsZUVudHJ5SGFzaE1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYRm9ybVVSTEVuY29kZWRCdWlsZGVyIGltcGxlbWVudHMgQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coWEZvcm1VUkxFbmNvZGVkQnVpbGRlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBwcm9jZXNzRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIE11bHRpcGxlRW50cnlIYXNoTWFwIHBhcmFtZXRlck1hcCA9IG5ldyBNdWx0aXBsZUVudHJ5SGFzaE1hcCgpOwotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeTsKLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgIChBeGlzQmluZGluZ09wZXJhdGlvbikgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVhJU19CSU5ESU5HX09QRVJBVElPTik7Ci0gICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciA9IG51bGw7Ci0gICAgICAgIFN0cmluZyB0ZW1wbGF0ZWRQYXRoID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID0gKFN0cmluZykgYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICB0ZW1wbGF0ZWRQYXRoID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUl9ERUZBVUxUOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9Ci0gICAgICAgICAgICAgICAgKEF4aXNFbmRwb2ludCkgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgIGlmIChheGlzRW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgU3RyaW5nIHNvYXBWZXJzaW9uID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYXhpc0JpbmRpbmcuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gZ2V0U09BUEZhY3Rvcnkoc29hcFZlcnNpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBnZXRTT0FQRmFjdG9yeShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlbmRwb2ludFJlZmVyZW5jZSA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgIGlmIChlbmRwb2ludFJlZmVyZW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW5ub3QgY3JlYXRlIERvY3VtZW50RWxlbWVudCB3aXRob3V0IGRlc3RpbmF0aW9uIEVQUiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkwgPSBlbmRwb2ludFJlZmVyZW5jZS5nZXRBZGRyZXNzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXF1ZXN0VVJMID0gZXh0cmFjdFBhcmFtZXRlcnNVc2luZ0h0dHBMb2NhdGlvbih0ZW1wbGF0ZWRQYXRoLCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcXVlcnkgPSByZXF1ZXN0VVJMOwotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIGlmICgoaW5kZXggPSByZXF1ZXN0VVJMLmluZGV4T2YoIj8iKSkgPiAtMSkgewotICAgICAgICAgICAgcXVlcnkgPSByZXF1ZXN0VVJMLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXh0cmFjdFBhcmFtZXRlcnNGcm9tUmVxdWVzdChwYXJhbWV0ZXJNYXAsIHF1ZXJ5LCBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtKTsKLQotCi0gICAgICAgIHJldHVybiBCdWlsZGVyVXRpbC5idWlsZHNvYXBNZXNzYWdlKG1lc3NhZ2VDb250ZXh0LCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBleHRyYWN0UGFyYW1ldGVyc0Zyb21SZXF1ZXN0KE11bHRpcGxlRW50cnlIYXNoTWFwIHBhcmFtZXRlck1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtU2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJzZXRFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwgJiYgISIiLmVxdWFscyhxdWVyeSkpIHsKLQotICAgICAgICAgICAgU3RyaW5nIHBhcnRzW10gPSBxdWVyeS5zcGxpdChxdWVyeVBhcmFtU2VwYXJhdG9yKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc2VwYXJhdG9yID0gcGFydHNbaV0uaW5kZXhPZigiPSIpOwotICAgICAgICAgICAgICAgIGlmIChzZXBhcmF0b3IgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnRzW2ldLnN1YnN0cmluZyhzZXBhcmF0b3IgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gVVJJRW5jb2RlckRlY29kZXIuZGVjb2RlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChwYXJ0c1tpXS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1SZWFkZXIgPSAoSW5wdXRTdHJlYW1SZWFkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0sIGNoYXJzZXRFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFN0cmVhbVJlYWRlcik7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydHNbXSA9IGxpbmUuc3BsaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1JfREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcGFyYXRvciA9IHBhcnRzW2ldLmluZGV4T2YoIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJ0c1tpXS5zdWJzdHJpbmcoc2VwYXJhdG9yICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTWFwLnB1dChwYXJ0c1tpXS5zdWJzdHJpbmcoMCwgc2VwYXJhdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSUVuY29kZXJEZWNvZGVyLmRlY29kZSh2YWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlcmUgaXMgd2hhdCBJIHdpbGwgdHJ5IHRvIGRvIGhlcmUuIEkgd2lsbCBmaXJzdCB0cnkgdG8gaWRlbnRpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdAotICAgICAqIHRlbXBsYXRlIGVsZW1lbnQgaW4gdGhlIHJlcXVlc3QgVVJJLiBJIGFtIHRyeWluZyB0byBkZWR1Y2UgdGhlIGxvY2F0aW9uIG9mIHRoYXQgbG9jYXRpb24KLSAgICAgKiB1c2luZyB0aGUgaHR0cExvY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGJpbmRpbmcgKGl0IGlzIHBhc3NlZCBpbiB0byB0aGlzCi0gICAgICogbWV0aG9kKS4KLSAgICAgKiBJZiB0aGVyZSBpcyBhIGNvbnRhbnQgcGFydCBpbiB0aGUgaHR0cExvY2F0aW9uLCB0aGVuIEkgd2lsbCBpZGVudGlmeSBpdC4gRm9yIHRoaXMsIEkgZ2V0Ci0gICAgICogdGhlIGluZGV4IG9mIHssIGZyb20gaHR0cExvY2F0aW9uIHBhcmFtLCBhbmQgd2hhdGV2ZXIgdG8gdGhlIGxlZnQgb2YgaXQgaXMgdGhlIGNvbnRhbnQgcGFydC4KLSAgICAgKiBUaGVuIEkgc2VhcmNoIGZvciB0aGlzIGNvbnN0YW50IHBhcnQgaW5zaWRlIHRoZSB1cmwuIFRoaXMgd2lsbCBnaXZlIHVzIHRoZSBhY2Nlc3MgdG8gdGhlIGZpcnN0Ci0gICAgICogdGVtcGxhdGUgcGFyYW1ldGVyLgotICAgICAqIFRvIGZpbmQgdGhlIGVuZCBvZiB0aGlzIHBhcmFtZXRlciwgd2UgbmVlZCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNvbnN0YW50LCBmcm9tCi0gICAgICogaHR0cExvY2F0aW9uIGF0dHJpYnV0ZS4gTGlrZXdpc2Ugd2Uga2VlcCBvbiBkaXNjb3ZlcmluZyBwYXJhbWV0ZXJzLgotICAgICAqIDxwLz4KLSAgICAgKiBBc3N1bXB0aW9ucyA6Ci0gICAgICogMS4gVXNlciB3aWxsIGFsd2F5cyBhcHBlbmQgdGhlIHZhbHVlIG9mIGh0dHBMb2NhdGlvbiB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUKLSAgICAgKiBlbmRwb2ludC4KLSAgICAgKiAyLiBJIHdhcyB0YWxraW5nIGFib3V0IHRoZSBjb25zdGFudHMgaW4gdGhlIGh0dHBMb2NhdGlvbi4gVGhvc2UgY29uc3RhbnRzIHdpbGwgbm90IG9jY3VyLAotICAgICAqIHRvIGEgcmVhc29uYWJsZSBleHRlbmQsIGJlZm9yZSB0aGUgY29uc3RhbnQgd2UgYXJlIGxvb2tpbmcgZm9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHRlbXBsYXRlZFBhdGgKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTWFwCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBleHRyYWN0UGFyYW1ldGVyc1VzaW5nSHR0cExvY2F0aW9uKFN0cmluZyB0ZW1wbGF0ZWRQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZUVudHJ5SGFzaE1hcCBwYXJhbWV0ZXJNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0LCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIGlmICh0ZW1wbGF0ZWRQYXRoICE9IG51bGwgJiYgISIiLmVxdWFscyh0ZW1wbGF0ZWRQYXRoKSAmJiB0ZW1wbGF0ZWRQYXRoLmluZGV4T2YoInsiKSA+IC0xKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aFRlbXBsYXRlID0gbmV3IFN0cmluZ0J1ZmZlcih0ZW1wbGF0ZWRQYXRoKTsKLQotICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGhvbGQgdGhlIGluZGV4LCBmcm9tIHdoaWNoIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdCBVUkkKLSAgICAgICAgICAgIGludCBzdGFydEluZGV4ID0gMDsKLSAgICAgICAgICAgIGludCB0ZW1wbGF0ZVN0YXJ0SW5kZXggPSAwOwotICAgICAgICAgICAgaW50IHRlbXBsYXRlRW5kSW5kZXggPSAwOwotICAgICAgICAgICAgaW50IGluZGV4T2ZOZXh0Q29uc3RhbnQgPSAwOwotCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgcmVxdWVzdFVSSUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocmVxdWVzdFVSTCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzdGFydEluZGV4IDwgcmVxdWVzdFVSSUJ1ZmZlci5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBhbHdheXMgaG9sZCB0aGUgc3RhcnRpbmcgaW5kZXggb2YgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZVN0YXJ0SW5kZXggPSBwYXRoVGVtcGxhdGUuaW5kZXhPZigieyIsIHRlbXBsYXRlU3RhcnRJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVTdGFydEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHByZWNlZGluZyBjb25zdGFudCBwYXJ0IGZyb20gdGhlIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb25zdGFudFBhcnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhUZW1wbGF0ZS5zdWJzdHJpbmcodGVtcGxhdGVFbmRJbmRleCArIDEsIHRlbXBsYXRlU3RhcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9IGNvbnN0YW50UGFydC5yZXBsYWNlQWxsKCJcXHtcXHsiLCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9IGNvbnN0YW50UGFydC5yZXBsYWNlQWxsKCJ9fSIsIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGluZGV4IG9mIHRoZSBlbmQgb2YgdGhpcyB0ZW1wbGF0ZSBwYXJhbQotICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVuZEluZGV4ID0gcGF0aFRlbXBsYXRlLmluZGV4T2YoIn0iLCB0ZW1wbGF0ZVN0YXJ0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBhdGhUZW1wbGF0ZS5sZW5ndGgoKSAtMSkgPiB0ZW1wbGF0ZUVuZEluZGV4ICYmIHBhdGhUZW1wbGF0ZS5jaGFyQXQodGVtcGxhdGVFbmRJbmRleCArMSkgPT0gJ30nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVuZEluZGV4ID0gcGF0aFRlbXBsYXRlLmluZGV4T2YoIn0iLCB0ZW1wbGF0ZUVuZEluZGV4ICsyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVGVtcGxhdGUuc3Vic3RyaW5nKHRlbXBsYXRlU3RhcnRJbmRleCArIDEsIHRlbXBsYXRlRW5kSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHRyeSB0byBmaW5kIHRoZSBuZXh0IGNvbnN0YW50Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3RhcnRJbmRleCA9IHBhdGhUZW1wbGF0ZS5pbmRleE9mKCJ7IiwgdGVtcGxhdGVFbmRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRoVGVtcGxhdGUuY2hhckF0KHRlbXBsYXRlU3RhcnRJbmRleCArMSkgPT0gJ3snKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVN0YXJ0SW5kZXggPSBwYXRoVGVtcGxhdGUuaW5kZXhPZigieyIsIHRlbXBsYXRlU3RhcnRJbmRleCArMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpbnQgZW5kSW5kZXhPZkNvbnN0YW50ID0gcmVxdWVzdFVSSUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKGNvbnN0YW50UGFydCwgaW5kZXhPZk5leHRDb25zdGFudCkgKyBjb25zdGFudFBhcnQubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlU3RhcnRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlRW5kSW5kZXggPT0gcGF0aFRlbXBsYXRlLmxlbmd0aCgpIC0gMSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgb2NjYXRpb25zIHdoZXJlIHdlIGhhdmUgdGVtcGxhdGVzIG9mIHRoZSBmb3JtIGZvby97bmFtZX0uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSBuZXh0IGNvbm5zdGFudCB3aWxsIGJlID8gYW5kIG5vdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeVBhcmFtZXRlclNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZigiPyIsIGVuZEluZGV4T2ZDb25zdGFudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZOZXh0Q29uc3RhbnQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhPZk5leHRDb25zdGFudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YocXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleE9mQ29uc3RhbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhPZk5leHRDb25zdGFudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyVG9NYXAocGFyYW1ldGVyTWFwLCBwYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJQnVmZmVyLnN1YnN0cmluZyhlbmRJbmRleE9mQ29uc3RhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0Q29uc3RhbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RVUkwuc3Vic3RyaW5nKGluZGV4T2ZOZXh0Q29uc3RhbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyVG9NYXAocGFyYW1ldGVyTWFwLCBwYXJhbWV0ZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJQnVmZmVyLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleE9mQ29uc3RhbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVGVtcGxhdGUuc3Vic3RyaW5nKHRlbXBsYXRlRW5kSW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVGVtcGxhdGUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9IGNvbnN0YW50UGFydC5yZXBsYWNlQWxsKCJcXHtcXHsiLCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRQYXJ0ID0gY29uc3RhbnRQYXJ0LnJlcGxhY2VBbGwoIn19IiwifSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZOZXh0Q29uc3RhbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlci5pbmRleE9mKGNvbnN0YW50UGFydCwgZW5kSW5kZXhPZkNvbnN0YW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlclRvTWFwKHBhcmFtZXRlck1hcCwgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VVJJQnVmZmVyLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4T2ZDb25zdGFudCwgaW5kZXhPZk5leHRDb25zdGFudCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RVUklCdWZmZXIubGVuZ3RoKCkgPiBpbmRleE9mTmV4dENvbnN0YW50ICsgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFVSSUJ1ZmZlci5zdWJzdHJpbmcoaW5kZXhPZk5leHRDb25zdGFudCArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIG5leHQgY29uc3RhbnQgZnJvbSB0aGUgdGVtcGxhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50UGFydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhUZW1wbGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcodGVtcGxhdGVFbmRJbmRleCArIDEsIHRlbXBsYXRlU3RhcnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudFBhcnQgPSBjb25zdGFudFBhcnQucmVwbGFjZUFsbCgiXFx7XFx7IiwieyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRQYXJ0ID0gY29uc3RhbnRQYXJ0LnJlcGxhY2VBbGwoIn19IiwifSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mTmV4dENvbnN0YW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSUJ1ZmZlci5pbmRleE9mKGNvbnN0YW50UGFydCwgZW5kSW5kZXhPZkNvbnN0YW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlclRvTWFwKHBhcmFtZXRlck1hcCwgcGFyYW1ldGVyTmFtZSwgcmVxdWVzdFVSSUJ1ZmZlci5zdWJzdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEluZGV4T2ZDb25zdGFudCwgaW5kZXhPZk5leHRDb25zdGFudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4T2ZOZXh0Q29uc3RhbnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVxdWVzdFVSTDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUGFyYW1ldGVyVG9NYXAoTXVsdGlwbGVFbnRyeUhhc2hNYXAgcGFyYW1ldGVyTWFwLCBTdHJpbmcgcGFyYW1OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSkKLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyYW1WYWx1ZSA9IFVSSUVuY29kZXJEZWNvZGVyLmRlY29kZShwYXJhbVZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbU5hbWUuc3RhcnRzV2l0aChXU0RMMkNvbnN0YW50cy5URU1QTEFURV9FTkNPREVfRVNDQVBJTkdfQ0hBUkFDVEVSKSkgewotICAgICAgICAgICAgcGFyYW1ldGVyTWFwLnB1dChwYXJhbU5hbWUuc3Vic3RyaW5nKDEpLCBwYXJhbVZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlck1hcC5wdXQocGFyYW1OYW1lLCBwYXJhbVZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeShTdHJpbmcgbnNVUkkpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobnNVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuc1VSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMobnNVUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkU09BUHZlcnNpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvSW5wdXRTdHJlYW1EYXRhU291cmNlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9JbnB1dFN0cmVhbURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhYjFmOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9JbnB1dFN0cmVhbURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci51bmtub3duY29udGVudDsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTsNCi0NCi1wdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1EYXRhU291cmNlIGltcGxlbWVudHMgRGF0YVNvdXJjZSB7DQotDQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gaW5TdHJlYW07DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOw0KLQ0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW1EYXRhU291cmNlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdGhpcy5pblN0cmVhbSA9IGlucHV0U3RyZWFtOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsNCi0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsNCi0gICAgICAgIGlmICh0eXBlID09IG51bGwpDQotICAgICAgICAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHJldHVybiB0eXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW5TdHJlYW07DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuICJJbnB1dFN0cmVhbURhdGFTb3VyY2UiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm90IFN1cHBvcnRlZCIpOw0KLSAgICB9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL3Vua25vd25jb250ZW50L1Vua25vd25Db250ZW50QnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvVW5rbm93bkNvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOTEyMjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvVW5rbm93bkNvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci51bmtub3duY29udGVudDsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBVbmtub3duQ29udGVudEJ1aWxkZXIgaW1wbGVtZW50cyBCdWlsZGVyIHsKLQotCXB1YmxpYyBPTUVsZW1lbnQgcHJvY2Vzc0RvY3VtZW50KElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCQkJU3RyaW5nIGNvbnRlbnRUeXBlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJLy8gdXNpbmcgdGhpcyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHJlY2VpdmVkIGlzIGEgTUlNRSBtZXNzYWdlCi0JCWlmIChtZXNzYWdlQ29udGV4dC5pc0RvaW5nU3dBKCkpIHsKLQkJCVN0cmluZyByb290UGFydENvbnRlbnRJRCA9IG1lc3NhZ2VDb250ZXh0LmF0dGFjaG1lbnRzCi0JCQkJCS5nZXRTT0FQUGFydENvbnRlbnRJRCgpOwotCQkJRGF0YUhhbmRsZXIgcm9vdFBhcnREYXRhSGFuZGxlciA9IG1lc3NhZ2VDb250ZXh0LmF0dGFjaG1lbnRzCi0JCQkJCS5nZXREYXRhSGFuZGxlcihyb290UGFydENvbnRlbnRJRCk7Ci0JCQlVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZSB1bmtub3duQ29udGVudERhdGFTb3VyY2UgPSBuZXcgVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UoCi0JCQkJCXJvb3RQYXJ0RGF0YUhhbmRsZXIpOwotCQkJT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJCW1lc3NhZ2VDb250ZXh0LnNldERvaW5nU3dBKGZhbHNlKTsKLQkJCW1lc3NhZ2VDb250ZXh0LnNldERvaW5nTVRPTShmYWxzZSk7Ci0JCQlyZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKAotCQkJCQlVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZS51bmtub3duQ29udGVudFFOYW1lLCBmYWN0b3J5LAotCQkJCQl1bmtub3duQ29udGVudERhdGFTb3VyY2UpOwotCQl9Ci0JCUlucHV0U3RyZWFtRGF0YVNvdXJjZSBpblN0cmVhbURhdGFTb3VyY2UgPSBuZXcgSW5wdXRTdHJlYW1EYXRhU291cmNlKAotCQkJCWlucHV0U3RyZWFtKTsKLQkJaW5TdHJlYW1EYXRhU291cmNlLnNldFR5cGUoY29udGVudFR5cGUpOwotCQlEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihpblN0cmVhbURhdGFTb3VyY2UpOwotCQlVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZSB1bmtub3duQ29udGVudERhdGFTb3VyY2UgPSBuZXcgVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UoCi0JCQkJZGF0YUhhbmRsZXIpOwotCQlPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCQlyZXR1cm4gbmV3IE9NU291cmNlZEVsZW1lbnRJbXBsKAotCQkJCVVua25vd25Db250ZW50T01EYXRhU291cmNlLnVua25vd25Db250ZW50UU5hbWUsIGZhY3RvcnksCi0JCQkJdW5rbm93bkNvbnRlbnREYXRhU291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9Vbmtub3duQ29udGVudE9NRGF0YVNvdXJjZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvdW5rbm93bmNvbnRlbnQvVW5rbm93bkNvbnRlbnRPTURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMDdmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvYnVpbGRlci91bmtub3duY29udGVudC9Vbmtub3duQ29udGVudE9NRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIudW5rbm93bmNvbnRlbnQ7Ci0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLQotcHVibGljIGNsYXNzIFVua25vd25Db250ZW50T01EYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLQotCXB1YmxpYyBzdGF0aWMgUU5hbWUgdW5rbm93bkNvbnRlbnRRTmFtZSA9IG5ldyBRTmFtZSgKLQkJCSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIsICJVbmtub3duQ29udGVudCIpOwotCi0JRGF0YUhhbmRsZXIgZ2VuZXJpY0NvbnRlbnQ7Ci0JT01FbGVtZW50IHdyYXBwZXJFbGVtZW50OwotCQotCXB1YmxpYyBVbmtub3duQ29udGVudE9NRGF0YVNvdXJjZShEYXRhSGFuZGxlciByb290RGF0YUhhbmRsZXIpIHsKLQkJZ2VuZXJpY0NvbnRlbnQgPSByb290RGF0YUhhbmRsZXI7Ci0JCXdyYXBwZXJFbGVtZW50ID0gY3JlYXRlRWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyBYTUxTdHJlYW1SZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB3cmFwcGVyRWxlbWVudC5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotCQkJdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXdyYXBwZXJFbGVtZW50LnNlcmlhbGl6ZShvdXRwdXQsZm9ybWF0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlciwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotCQkJdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXdyYXBwZXJFbGVtZW50LnNlcmlhbGl6ZSh3cml0ZXIsZm9ybWF0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0JCXdyYXBwZXJFbGVtZW50LnNlcmlhbGl6ZSh4bWxXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBEYXRhSGFuZGxlciBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gZ2VuZXJpY0NvbnRlbnQ7Ci0JfQotCQotCXByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotCXsKLQkJT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJT01UZXh0IHRleHROb2RlID0gZmFjdG9yeS5jcmVhdGVPTVRleHQoZ2VuZXJpY0NvbnRlbnQsIHRydWUpOwotCQlPTUVsZW1lbnQgd3JhcHBlckVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCh1bmtub3duQ29udGVudFFOYW1lKTsKLQkJd3JhcHBlckVsZW1lbnQuYWRkQ2hpbGQodGV4dE5vZGUpOwotCQlyZXR1cm4gd3JhcHBlckVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0UmVzb3VyY2VIYW5kbGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9BYnN0cmFjdFJlc291cmNlSGFuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWRiNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0UmVzb3VyY2VIYW5kbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VIYW5kbGUgaW1wbGVtZW50cyBSZXNvdXJjZUhhbmRsZSB7Ci0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IElvVXRpbC5nZXRCeXRlcyhpbik7Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBJb1V0aWwuY2xvc2UoaW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE1hbmlmZXN0IGdldE1hbmlmZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENlcnRpZmljYXRlW10gZ2V0Q2VydGlmaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTWFuaWZlc3QgbSA9IGdldE1hbmlmZXN0KCk7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGVudHJ5ID0gZ2V0VXJsKCkuZ2V0RmlsZSgpOwotICAgICAgICByZXR1cm4gbS5nZXRBdHRyaWJ1dGVzKGVudHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiICsgZ2V0TmFtZSgpICsgIjogIiArIGdldFVybCgpICsgIjsgY29kZSBzb3VyY2U6ICIgKyBnZXRDb2RlU291cmNlVXJsKCkgKyAiXSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0Fic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGI1NjQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9BYnN0cmFjdFVybFJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVcmxSZXNvdXJjZUxvY2F0aW9uIGltcGxlbWVudHMgUmVzb3VyY2VMb2NhdGlvbiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgY29kZVNvdXJjZTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFVybFJlc291cmNlTG9jYXRpb24oVVJMIGNvZGVTb3VyY2UpIHsKLSAgICAgICAgdGhpcy5jb2RlU291cmNlID0gY29kZVNvdXJjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgVVJMIGdldENvZGVTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIEFic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbiB0aGF0ID0gKEFic3RyYWN0VXJsUmVzb3VyY2VMb2NhdGlvbikgbzsKLSAgICAgICAgcmV0dXJuIGNvZGVTb3VyY2UuZXF1YWxzKHRoYXQuY29kZVNvdXJjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvZGVTb3VyY2UuaGFzaENvZGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgY29kZVNvdXJjZSArICJdIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvRGlyZWN0b3J5UmVzb3VyY2VIYW5kbGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9EaXJlY3RvcnlSZXNvdXJjZUhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY1ZDRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9EaXJlY3RvcnlSZXNvdXJjZUhhbmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5UmVzb3VyY2VIYW5kbGUgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlSGFuZGxlIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotICAgIHByaXZhdGUgZmluYWwgTWFuaWZlc3QgbWFuaWZlc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgdXJsOwotICAgIHByaXZhdGUgZmluYWwgVVJMIGNvZGVTb3VyY2U7Ci0KLSAgICBwdWJsaWMgRGlyZWN0b3J5UmVzb3VyY2VIYW5kbGUoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSwgRmlsZSBjb2RlU291cmNlLCBNYW5pZmVzdCBtYW5pZmVzdCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICAgIHRoaXMuY29kZVNvdXJjZSA9IGNvZGVTb3VyY2UudG9VUkwoKTsKLSAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OwotICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldENvZGVTb3VyY2VVcmwoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gZmlsZS5pc0RpcmVjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW9VdGlsLkVtcHR5SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkgfHwgZmlsZS5sZW5ndGgoKSA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgZmlsZS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRBdHRyaWJ1dGVzKGdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWx3YXlzIHJldHVybiBudWxsLiAgVGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRkIGJ5IHZlcmlmaW5nIHRoZSBzaWduYXR1cmVzCi0gICAgICogaW4gdGhlIG1hbmlmZXN0IGZpbGUgYWdhaW5zdCB0aGUgYWN0dWFsIGZpbGUsIGJ1dCB3ZSBkb24ndCBuZWVkIHRoaXMgcmlnaHQgbm93LgotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0RpcmVjdG9yeVJlc291cmNlTG9jYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9EaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTJiNmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0RpcmVjdG9yeVJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RVcmxSZXNvdXJjZUxvY2F0aW9uIHsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgYmFzZURpcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbWFuaWZlc3RMb2FkZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIE1hbmlmZXN0IG1hbmlmZXN0OwotCi0gICAgcHVibGljIERpcmVjdG9yeVJlc291cmNlTG9jYXRpb24oRmlsZSBiYXNlRGlyKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYmFzZURpci50b1VSTCgpKTsKLSAgICAgICAgdGhpcy5iYXNlRGlyID0gYmFzZURpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2VIYW5kbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShiYXNlRGlyLCByZXNvdXJjZU5hbWUpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkgfHwgIWlzTG9jYWwoZmlsZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlc291cmNlSGFuZGxlIHJlc291cmNlSGFuZGxlID0gbmV3IERpcmVjdG9yeVJlc291cmNlSGFuZGxlKHJlc291cmNlTmFtZSwgZmlsZSwgYmFzZURpciwgZ2V0TWFuaWZlc3RTYWZlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlSGFuZGxlOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2NhbChGaWxlIGZpbGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlID0gYmFzZURpci5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmUgPSBmaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgIHJldHVybiAocmVsYXRpdmUuc3RhcnRzV2l0aChiYXNlKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIW1hbmlmZXN0TG9hZGVkKSB7Ci0gICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCi0gICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmlzRmlsZSgpICYmIG1hbmlmZXN0RmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOwotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbik7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgSW9VdGlsLmNsb3NlKGluKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYW5pZmVzdExvYWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hbmlmZXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgTWFuaWZlc3QgZ2V0TWFuaWZlc3RTYWZlKCkgewotICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSW9VdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSW9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzNhNTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0lvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIElvVXRpbCB7Ci0gICAgcHJpdmF0ZSBJb1V0aWwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcik7IGNvdW50ID49IDA7IGNvdW50ID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gb3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2goT3V0cHV0U3RyZWFtIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmx1c2goV3JpdGVyIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSmFyRmlsZSB0aGluZykgewotICAgICAgICBpZiAodGhpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGluZy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKElucHV0U3RyZWFtIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT3V0cHV0U3RyZWFtIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoUmVhZGVyIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoV3JpdGVyIHRoaW5nKSB7Ci0gICAgICAgIGlmICh0aGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaW5nLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVtcHR5SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSkgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJGaWxlQ2xhc3NMb2FkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJGaWxlQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0YjE2ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSmFyRmlsZUNsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNvdXJjZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIFRoZSBKYXJGaWxlQ2xhc3NMb2FkZXIgdGhhdCBsb2FkcyBjbGFzc2VzIGFuZCByZXNvdXJjZXMgZnJvbSBhIGxpc3Qgb2YgSmFyRmlsZXMuICBUaGlzIG1ldGhvZCBpcyBzaW1taWxhciB0byBVUkxDbGFzc0xvYWRlcgotICogZXhjZXB0IGl0IHByb3Blcmx5IGNsb3NlcyBKYXJGaWxlcyB3aGVuIHRoZSBjbGFzc2xvYWRlciBpcyBkZXN0cm95ZWQgc28gdGhhdCB0aGUgZmlsZSByZWFkIGxvY2sgd2lsbCBiZSByZWxlYXNlZCwgYW5kCi0gKiB0aGUgamFyIGZpbGUgY2FuIGJlIG1vZGlmaWVkIGFuZCBkZWxldGVkLgotICogPHA+Ci0gKgotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJGaWxlQ2xhc3NMb2FkZXIgZXh0ZW5kcyBNdWx0aVBhcmVudENsYXNzTG9hZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkxbXSBFTVBUWV9VUkxTID0gbmV3IFVSTFswXTsKLQotICAgIHByaXZhdGUgZmluYWwgVXJsUmVzb3VyY2VGaW5kZXIgcmVzb3VyY2VGaW5kZXIgPSBuZXcgVXJsUmVzb3VyY2VGaW5kZXIoKTsKLSAgICBwcml2YXRlIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBKYXJGaWxlQ2xhc3NMb2FkZXIgdGhhdCBpcyBhIGNoaWxkIG9mIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLgotICAgICAqIEBwYXJhbSB1cmxzIGEgbGlzdCBvZiBVUkxzIGZyb20gd2hpY2ggY2xhc3NlcyBhbmQgcmVzb3VyY2VzIHNob3VsZCBiZSBsb2FkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgSmFyRmlsZUNsYXNzTG9hZGVyKFVSTFtdIHVybHMpIHsKLSAgICAgICAgc3VwZXIoRU1QVFlfVVJMUyk7Ci0gICAgICAgIHRoaXMuYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIGFkZFVSTHModXJscyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIEphckZpbGVDbGFzc0xvYWRlciB0aGF0IGlzIGEgY2hpbGQgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0gICAgICogQHBhcmFtIHVybHMgYSBsaXN0IG9mIFVSTHMgZnJvbSB3aGljaCBjbGFzc2VzIGFuZCByZXNvdXJjZXMgc2hvdWxkIGJlIGxvYWRlZAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzIGxvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBKYXJGaWxlQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKEVNUFRZX1VSTFMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMuYWNjID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIGFkZFVSTHModXJscyk7Ci0gICAgfQotCi0gICAgcHVibGljIEphckZpbGVDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQsIGJvb2xlYW4gaW52ZXJzZUNsYXNzTG9hZGluZywgU3RyaW5nW10gaGlkZGVuQ2xhc3NlcywgU3RyaW5nW10gbm9uT3ZlcnJpZGFibGVDbGFzc2VzKSB7Ci0gICAgICAgIHN1cGVyKEVNUFRZX1VSTFMsIHBhcmVudCwgaW52ZXJzZUNsYXNzTG9hZGluZywgaGlkZGVuQ2xhc3Nlcywgbm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyh1cmxzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmFtZWQgY2xhc3MgbG9hZGVyIGFzIGEgY2hpbGQgb2YgdGhlIHNwZWNpZmllZCBwYXJlbnRzLgotICAgICAqIEBwYXJhbSB1cmxzIHRoZSB1cmxzIGZyb20gd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBjbGFzc2VzIGFuZCByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gcGFyZW50cyB0aGUgcGFyZW50cyBvZiB0aGlzIGNsYXNzIGxvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBKYXJGaWxlQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzKSB7Ci0gICAgICAgIHN1cGVyKEVNUFRZX1VSTFMsIHBhcmVudHMpOwotICAgICAgICB0aGlzLmFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBhZGRVUkxzKHVybHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBKYXJGaWxlQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzLCBib29sZWFuIGludmVyc2VDbGFzc0xvYWRpbmcsIENvbGxlY3Rpb24gaGlkZGVuQ2xhc3NlcywgQ29sbGVjdGlvbiBub25PdmVycmlkYWJsZUNsYXNzZXMpIHsKLSAgICAgICAgc3VwZXIoRU1QVFlfVVJMUywgcGFyZW50cywgaW52ZXJzZUNsYXNzTG9hZGluZywgaGlkZGVuQ2xhc3Nlcywgbm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyh1cmxzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFyRmlsZUNsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyW10gcGFyZW50cywgYm9vbGVhbiBpbnZlcnNlQ2xhc3NMb2FkaW5nLCBTdHJpbmdbXSBoaWRkZW5DbGFzc2VzLCBTdHJpbmdbXSBub25PdmVycmlkYWJsZUNsYXNzZXMpIHsKLSAgICAgICAgc3VwZXIoRU1QVFlfVVJMUywgcGFyZW50cywgaW52ZXJzZUNsYXNzTG9hZGluZywgaGlkZGVuQ2xhc3Nlcywgbm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyh1cmxzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFyRmlsZUNsYXNzTG9hZGVyKEphckZpbGVDbGFzc0xvYWRlciBzb3VyY2UpIHsKLSAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgdGhpcy5hY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICAgICAgYWRkVVJMcyhzb3VyY2UuZ2V0VVJMcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGNvcHkoQ2xhc3NMb2FkZXIgc291cmNlKSB7Ci0gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBKYXJGaWxlQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmFyRmlsZUNsYXNzTG9hZGVyKChKYXJGaWxlQ2xhc3NMb2FkZXIpIHNvdXJjZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKChNdWx0aVBhcmVudENsYXNzTG9hZGVyKSBzb3VyY2UpOwotICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTENsYXNzTG9hZGVyKCgoVVJMQ2xhc3NMb2FkZXIpc291cmNlKS5nZXRVUkxzKCksIHNvdXJjZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbMF0sIHNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBDbGFzc0xvYWRlciBjb3B5KCkgewotICAgICAgICByZXR1cm4gSmFyRmlsZUNsYXNzTG9hZGVyLmNvcHkodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBVUkxbXSBnZXRVUkxzKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VGaW5kZXIuZ2V0VXJscygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRVUkwoZmluYWwgVVJMIHVybCkgewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlRmluZGVyLmFkZFVybCh1cmwpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBhY2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXJyYXkgb2YgdXJscyB0byB0aGUgZW5kIG9mIHRoaXMgY2xhc3MgbG9hZGVyLgotICAgICAqIEBwYXJhbSB1cmxzIHRoZSBVUkxzIHRvIGFkZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFVSTHMoZmluYWwgVVJMW10gdXJscykgewotICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJlc291cmNlRmluZGVyLmFkZFVybHModXJscyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIGFjYyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIHJlc291cmNlRmluZGVyLmRlc3Ryb3koKTsKLSAgICAgICAgc3VwZXIuZGVzdHJveSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoVVJMKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZpbmRlci5maW5kUmVzb3VyY2UocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgYWNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uPFVSTD4gaW50ZXJuYWxmaW5kUmVzb3VyY2VzKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPEVudW1lcmF0aW9uPFVSTD4+KCkgewotICAgICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uPFVSTD4gcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUZpbmRlci5maW5kUmVzb3VyY2VzKG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBhY2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbmRMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TmFtZSkgewotICAgICAgICAvLyBpZiB0aGUgbGlicmFyeU5hbWUgaXMgYWN0dWFsbHkgYSBkaXJlY3RvcnkgaXQgaXMgaW52YWxpZAotICAgICAgICBpbnQgcGF0aEVuZCA9IGxpYnJhcnlOYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgIGlmIChwYXRoRW5kID09IGxpYnJhcnlOYW1lLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlicmFyeU5hbWUgZW5kcyB3aXRoIGEgJy8nIGNoYXJhY3RlcjogIiArIGxpYnJhcnlOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBpZiB0aGUgbGlicmFyeSBmaWxlCi0gICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0gICAgICAgIGlmIChwYXRoRW5kIDwgMCkgewotICAgICAgICAgICAgcmVzb3VyY2VOYW1lID0gU3lzdGVtLm1hcExpYnJhcnlOYW1lKGxpYnJhcnlOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbGlicmFyeU5hbWUuc3Vic3RyaW5nKDAsIHBhdGhFbmQgKyAxKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlID0gbGlicmFyeU5hbWUuc3Vic3RyaW5nKHBhdGhFbmQgKyAxKTsKLSAgICAgICAgICAgIHJlc291cmNlTmFtZSA9IHBhdGggKyBTeXN0ZW0ubWFwTGlicmFyeU5hbWUoZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgYSByZXNvdXJjZSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkKLSAgICAgICAgUmVzb3VyY2VIYW5kbGUgcmVzb3VyY2VIYW5kbGUgPSAoUmVzb3VyY2VIYW5kbGUpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlRmluZGVyLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIGFjYyk7Ci0KLSAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGxpYnJhcnkgbXVzdCBiZSBhY2Nlc3NhYmxlIG9uIHRoZSBmaWxlIHN5c3RlbQotICAgICAgICBVUkwgdXJsID0gcmVzb3VyY2VIYW5kbGUuZ2V0VXJsKCk7Ci0gICAgICAgIGlmICghImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKFVSSS5jcmVhdGUodXJsLnRvU3RyaW5nKCkpKS5nZXRQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBmaW5kQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHRoaW5rIGNoZWNrIGlmIHdlIGFyZSBhbGxvd2VkIHRvIGRlZmluZSB0aGUgcGFja2FnZQotICAgICAgICAgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWNrYWdlRW5kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUVuZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBhY2thZ2VFbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VEZWZpbml0aW9uKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0aGUgY2xhc3MgbmFtZSB0byBhIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyI7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgY2xhc3MgZmlsZSByZXNvdXJjZQotICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUhhbmRsZSByZXNvdXJjZUhhbmRsZSA9IHJlc291cmNlRmluZGVyLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUhhbmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzOwotICAgICAgICAgICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgYnl0ZXMgZnJvbSB0aGUgY2xhc3MgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSByZXNvdXJjZUhhbmRsZS5nZXRCeXRlcygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1hbmlmZXN0IGZvciBkZWZpbmluZyB0aGUgcGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gcmVzb3VyY2VIYW5kbGUuZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2VydGlmaWNhdGVzIGZvciB0aGUgY29kZSBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSByZXNvdXJjZUhhbmRsZS5nZXRDZXJ0aWZpY2F0ZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29kZSBzb3VyY2UgdXJsIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBwYWNrYWdlIGFuZCBhcyB0aGUgc2VjdXJpdHkgY29udGV4dCBmb3IgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIFVSTCBjb2RlU291cmNlVXJsID0gcmVzb3VyY2VIYW5kbGUuZ2V0Q29kZVNvdXJjZVVybCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgcGFja2FnZSAocmVxdWlyZWQgZm9yIHNlY3VyaXR5KQotICAgICAgICAgICAgICAgICAgICBkZWZpbmVQYWNrYWdlKGNsYXNzTmFtZSwgY29kZVNvdXJjZVVybCwgbWFuaWZlc3QpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIENvZGVTb3VyY2UgY29kZVNvdXJjZSA9IG5ldyBDb2RlU291cmNlKGNvZGVTb3VyY2VVcmwsIGNlcnRpZmljYXRlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgY2xhc3MgaW50byB0aGUgdm0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUNsYXNzKGNsYXNzTmFtZSwgYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCwgY29kZVNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgYWNjKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWZpbmVQYWNrYWdlKFN0cmluZyBjbGFzc05hbWUsIFVSTCBqYXJVcmwsIE1hbmlmZXN0IG1hbmlmZXN0KSB7Ci0gICAgICAgIGludCBwYWNrYWdlRW5kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIGlmIChwYWNrYWdlRW5kIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwYWNrYWdlRW5kKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VQYXRoID0gcGFja2FnZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLyI7Ci0KLSAgICAgICAgQXR0cmlidXRlcyBwYWNrYWdlQXR0cmlidXRlcyA9IG51bGw7Ci0gICAgICAgIEF0dHJpYnV0ZXMgbWFpbkF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFja2FnZUF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRBdHRyaWJ1dGVzKHBhY2thZ2VQYXRoKTsKLSAgICAgICAgICAgIG1haW5BdHRyaWJ1dGVzID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICBQYWNrYWdlIHBrZyA9IGdldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICBpZiAocGtnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwa2cuaXNTZWFsZWQoKSkgewotICAgICAgICAgICAgICAgIGlmICghcGtnLmlzU2VhbGVkKGphclVybCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJQYWNrYWdlIHdhcyBhbHJlYWR5IHNlYWxlZCB3aXRoIGFub3RoZXIgVVJMOiBwYWNrYWdlPSIgKyBwYWNrYWdlTmFtZSArICIsIHVybD0iICsgamFyVXJsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZChwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiUGFja2FnZSB3YXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBhbmQgbm90IHNlYWxlZDogcGFja2FnZT0iICsgcGFja2FnZU5hbWUgKyAiLCB1cmw9IiArIGphclVybCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHNwZWNUaXRsZSA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuU1BFQ0lGSUNBVElPTl9USVRMRSwgcGFja2FnZUF0dHJpYnV0ZXMsIG1haW5BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIFN0cmluZyBzcGVjVmVuZG9yID0gZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuTmFtZS5TUEVDSUZJQ0FUSU9OX1ZFTkRPUiwgcGFja2FnZUF0dHJpYnV0ZXMsIG1haW5BdHRyaWJ1dGVzKTsKLSAgICAgICAgICAgIFN0cmluZyBzcGVjVmVyc2lvbiA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuU1BFQ0lGSUNBVElPTl9WRVJTSU9OLCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgU3RyaW5nIGltcGxUaXRsZSA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVElUTEUsIHBhY2thZ2VBdHRyaWJ1dGVzLCBtYWluQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBTdHJpbmcgaW1wbFZlbmRvciA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVORE9SLCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgU3RyaW5nIGltcGxWZXJzaW9uID0gZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuTmFtZS5JTVBMRU1FTlRBVElPTl9WRVJTSU9OLCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotCi0gICAgICAgICAgICBVUkwgc2VhbEJhc2UgPSBudWxsOwotICAgICAgICAgICAgaWYgKGlzU2VhbGVkKHBhY2thZ2VBdHRyaWJ1dGVzLCBtYWluQXR0cmlidXRlcykpIHsKLSAgICAgICAgICAgICAgICBzZWFsQmFzZSA9IGphclVybDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmaW5lUGFja2FnZShwYWNrYWdlTmFtZSwgc3BlY1RpdGxlLCBzcGVjVmVyc2lvbiwgc3BlY1ZlbmRvciwgaW1wbFRpdGxlLCBpbXBsVmVyc2lvbiwgaW1wbFZlbmRvciwgc2VhbEJhc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZXMuTmFtZSBuYW1lLCBBdHRyaWJ1dGVzIHBhY2thZ2VBdHRyaWJ1dGVzLCBBdHRyaWJ1dGVzIG1haW5BdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChwYWNrYWdlQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYWNrYWdlQXR0cmlidXRlcy5nZXRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtYWluQXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VhbGVkKEF0dHJpYnV0ZXMgcGFja2FnZUF0dHJpYnV0ZXMsIEF0dHJpYnV0ZXMgbWFpbkF0dHJpYnV0ZXMpIHsKLSAgICAgICAgU3RyaW5nIHNlYWxlZCA9IGdldEF0dHJpYnV0ZShBdHRyaWJ1dGVzLk5hbWUuU0VBTEVELCBwYWNrYWdlQXR0cmlidXRlcywgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICByZXR1cm4gc2VhbGVkICE9IG51bGwgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc2VhbGVkKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phckZpbGVVcmxDb25uZWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSmFyRmlsZVVybENvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4NjRhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvSmFyRmlsZVVybENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2OiA0NzYwNDkgJCAkRGF0ZTogMjAwNi0xMS0xNiAyMzozNToxNyAtMDUwMCAoVGh1LCAxNiBOb3YgMjAwNikgJAotICovCi1wdWJsaWMgY2xhc3MgSmFyRmlsZVVybENvbm5lY3Rpb24gZXh0ZW5kcyBKYXJVUkxDb25uZWN0aW9uIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVSTCBEVU1NWV9KQVJfVVJMOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEVU1NWV9KQVJfVVJMID0gbmV3IFVSTCgiamFyIiwgIiIsIC0xLCAiZmlsZTpkdW1teSEvIiwgbmV3IFVSTFN0cmVhbUhhbmRsZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgdXJsOwotICAgIHByaXZhdGUgZmluYWwgSmFyRmlsZSBqYXJGaWxlOwotICAgIHByaXZhdGUgZmluYWwgSmFyRW50cnkgamFyRW50cnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgamFyRmlsZVVybDsKLQotICAgIHB1YmxpYyBKYXJGaWxlVXJsQ29ubmVjdGlvbihVUkwgdXJsLCBKYXJGaWxlIGphckZpbGUsIEphckVudHJ5IGphckVudHJ5KSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoRFVNTVlfSkFSX1VSTCk7Ci0KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVybCBpcyBudWxsIik7Ci0gICAgICAgIGlmIChqYXJGaWxlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamFyRmlsZSBpcyBudWxsIik7Ci0gICAgICAgIGlmIChqYXJFbnRyeSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphckVudHJ5IGlzIG51bGwiKTsKLQotICAgICAgICB0aGlzLnVybCA9IHVybDsKLSAgICAgICAgdGhpcy5qYXJGaWxlID0gamFyRmlsZTsKLSAgICAgICAgdGhpcy5qYXJFbnRyeSA9IGphckVudHJ5OwotICAgICAgICBqYXJGaWxlVXJsID0gbmV3IEZpbGUoamFyRmlsZS5nZXROYW1lKCkpLnRvVVJMKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEphckZpbGUgZ2V0SmFyRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBqYXJGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0SmFyRmlsZVVSTCgpIHsKLSAgICAgICAgcmV0dXJuIGphckZpbGVVcmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbnRyeU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXJFbnRyeSgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gamFyRmlsZS5nZXRNYW5pZmVzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBKYXJFbnRyeSBnZXRKYXJFbnRyeSgpIHsKLSAgICAgICAgcmV0dXJuIGphckVudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0SmFyRW50cnkoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0TWFpbkF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWFuaWZlc3QoKS5nZXRNYWluQXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRKYXJFbnRyeSgpLmdldENlcnRpZmljYXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0VVJMKCkgewotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgbG9uZyBzaXplID0gZ2V0SmFyRW50cnkoKS5nZXRTaXplKCk7Ci0gICAgICAgIGlmIChzaXplID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGludCkgc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXJFbnRyeSgpLmdldFRpbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGphckZpbGUuZ2V0SW5wdXRTdHJlYW0oamFyRW50cnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBVUkwgamFyRmlsZVVybCA9IG5ldyBGaWxlKGphckZpbGUuZ2V0TmFtZSgpKS50b1VSTCgpOwotICAgICAgICByZXR1cm4gamFyRmlsZVVybC5vcGVuQ29ubmVjdGlvbigpLmdldFBlcm1pc3Npb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gSmFyRmlsZVVybENvbm5lY3Rpb24uY2xhc3MuZ2V0TmFtZSgpICsgIjoiICsgdXJsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJGaWxlVXJsU3RyZWFtSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phckZpbGVVcmxTdHJlYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWVkZWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phckZpbGVVcmxTdHJlYW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLS8qKgotICogQHZlcnNpb24gJFJldjogNDc2MDQ5ICQgJERhdGU6IDIwMDYtMTEtMTYgMjM6MzU6MTcgLTA1MDAgKFRodSwgMTYgTm92IDIwMDYpICQKLSAqLwotcHVibGljIGNsYXNzIEphckZpbGVVcmxTdHJlYW1IYW5kbGVyIGV4dGVuZHMgVVJMU3RyZWFtSGFuZGxlciB7Ci0gICAgcHVibGljIHN0YXRpYyBVUkwgY3JlYXRlVXJsKEphckZpbGUgamFyRmlsZSwgSmFyRW50cnkgamFyRW50cnkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gY3JlYXRlVXJsKGphckZpbGUsIGphckVudHJ5LCBuZXcgRmlsZShqYXJGaWxlLmdldE5hbWUoKSkudG9VUkwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBVUkwgY3JlYXRlVXJsKEphckZpbGUgamFyRmlsZSwgSmFyRW50cnkgamFyRW50cnksIFVSTCBjb2RlU291cmNlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgSmFyRmlsZVVybFN0cmVhbUhhbmRsZXIgaGFuZGxlciA9IG5ldyBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlcihqYXJGaWxlLCBqYXJFbnRyeSk7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJqYXIiLCAiIiwgLTEsIGNvZGVTb3VyY2UgKyAiIS8iICsgamFyRW50cnkuZ2V0TmFtZSgpLCBoYW5kbGVyKTsKLSAgICAgICAgaGFuZGxlci5zZXRFeHBlY3RlZFVybCh1cmwpOwotICAgICAgICByZXR1cm4gdXJsOwotICAgIH0KLQotICAgIHByaXZhdGUgVVJMIGV4cGVjdGVkVXJsOwotICAgIHByaXZhdGUgSmFyRmlsZSBqYXJGaWxlID0gbnVsbDsKLSAgICBwcml2YXRlIEphckVudHJ5IGphckVudHJ5ID0gbnVsbDsKLQotICAgIHB1YmxpYyBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSmFyRmlsZVVybFN0cmVhbUhhbmRsZXIoSmFyRmlsZSBqYXJGaWxlLCBKYXJFbnRyeSBqYXJFbnRyeSkgewotICAgICAgICBpZiAoamFyRmlsZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphckZpbGUgaXMgbnVsbCIpOwotICAgICAgICBpZiAoamFyRW50cnkgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJqYXJFbnRyeSBpcyBudWxsIik7Ci0KLSAgICAgICAgdGhpcy5qYXJGaWxlID0gamFyRmlsZTsKLSAgICAgICAgdGhpcy5qYXJFbnRyeSA9IGphckVudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4cGVjdGVkVXJsKFVSTCBleHBlY3RlZFVybCkgewotICAgICAgICBpZiAoZXhwZWN0ZWRVcmwgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJleHBlY3RlZFVybCBpcyBudWxsIik7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWRVcmwgPSBleHBlY3RlZFVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGlmIChleHBlY3RlZFVybCA9PSBudWxsIHx8ICFleHBlY3RlZFVybC5lcXVhbHModXJsKSkgewotICAgICAgICAgICAgLy8gdGhlIG5ldyB1cmwgaXMgc3VwcG9zZWQgdG8gYmUgd2l0aGluIG91ciBjb250ZXh0LCBzbyBpdCBtdXN0IGhhdmUgYSBqYXIgcHJvdG9jb2wKLSAgICAgICAgICAgIGlmICghdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJqYXIiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHByb3RvY29sICIgKyB1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBwYXRoIGF0ICIhLyIgaW50byB0aGUgZmlsZSBwYXJ0IGFuZCBlbnRyeSBwYXJ0Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaHVua3MgPSBwYXRoLnNwbGl0KCIhLyIsIDIpOwotCi0gICAgICAgICAgICAvLyBpZiB3ZSBvbmx5IGdvdCBvbmx5IG9uZSBjaHVuaywgaXQgZGlkbid0IGNvbnRhaW4gdGhlIHJlcXVpcmVkICIhLyIgZGVsaW1pdGVyCi0gICAgICAgICAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigiVXJsIGRvZXMgbm90IGNvbnRhaW4gYSAnIScgY2hhcmFjdGVyOiAiICsgdXJsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSBjaHVua3NbMF07Ci0gICAgICAgICAgICBTdHJpbmcgZW50cnlQYXRoID0gY2h1bmtzWzFdOwotCi0gICAgICAgICAgICAvLyB0aGlzIGhhbmRsZXIgb25seSBzdXBwb3J0cyBqYXJzIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQotICAgICAgICAgICAgaWYgKCFmaWxlLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLSAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIHN5c3RlbSBoYW5kbGVyIGRlYWwgd2l0aCB0aGlzCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkpLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlID0gZmlsZS5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGUpOwotICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBqYXJGaWxlID0gbmV3IEphckZpbGUoZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChqYXJGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBKYXJGaWxlOiAiICsgZmlsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZW50cnkKLSAgICAgICAgICAgIGphckVudHJ5ID0gamFyRmlsZS5nZXRKYXJFbnRyeShlbnRyeVBhdGgpOwotICAgICAgICAgICAgaWYgKGphckVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJFbnRyeSBub3QgZm91bmQ6ICIgKyB1cmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhwZWN0ZWRVcmwgPSB1cmw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEphckZpbGVVcmxDb25uZWN0aW9uKHVybCwgamFyRmlsZSwgamFyRW50cnkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJSZXNvdXJjZUhhbmRsZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlSGFuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjQxNGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEphclJlc291cmNlSGFuZGxlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKYXJGaWxlIGphckZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBKYXJFbnRyeSBqYXJFbnRyeTsKLSAgICBwcml2YXRlIGZpbmFsIFVSTCB1cmw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVUkwgY29kZVNvdXJjZTsKLQotICAgIHB1YmxpYyBKYXJSZXNvdXJjZUhhbmRsZShKYXJGaWxlIGphckZpbGUsIEphckVudHJ5IGphckVudHJ5LCBVUkwgY29kZVNvdXJjZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuamFyRmlsZSA9IGphckZpbGU7Ci0gICAgICAgIHRoaXMuamFyRW50cnkgPSBqYXJFbnRyeTsKLSAgICAgICAgdGhpcy51cmwgPSBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlci5jcmVhdGVVcmwoamFyRmlsZSwgamFyRW50cnksIGNvZGVTb3VyY2UpOwotICAgICAgICB0aGlzLmNvZGVTb3VyY2UgPSBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGphckVudHJ5LmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldENvZGVTb3VyY2VVcmwoKSB7Ci0gICAgICAgIHJldHVybiBjb2RlU291cmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gamFyRW50cnkuaXNEaXJlY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gKGludCkgamFyRW50cnkuZ2V0U2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBqYXJGaWxlLmdldE1hbmlmZXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBqYXJFbnRyeS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlcnRpZmljYXRlW10gZ2V0Q2VydGlmaWNhdGVzKCkgewotICAgICAgICByZXR1cm4gamFyRW50cnkuZ2V0Q2VydGlmaWNhdGVzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlTG9jYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJSZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTZmYzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclJlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEphclJlc291cmNlTG9jYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFVybFJlc291cmNlTG9jYXRpb24gewotICAgIHByaXZhdGUgSmFyRmlsZSBqYXJGaWxlOwotICAgIHByaXZhdGUgYnl0ZSBjb250ZW50W107Ci0KLSAgICBwdWJsaWMgSmFyUmVzb3VyY2VMb2NhdGlvbihVUkwgY29kZVNvdXJjZSwgRmlsZSBjYWNoZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGNvZGVTb3VyY2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGNhY2hlRmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiB6ZSkgewotICAgICAgICAgICAgLy8gV2UgZ2V0IHRoaXMgZXhjZXB0aW9uIG9uIHdpbmRvd3Mgd2hlbiB0aGUKLSAgICAgICAgICAgIC8vIHBhdGggdG8gdGhlIGphciBmaWxlIGdldHMgdG9vIGxvbmcgKEJ1ZyBJRDogNjM3NDM3OSkKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGNhY2hlRmlsZSk7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzIwNDhdOwotICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSAtMTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IGlzLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2VIYW5kbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBpZiAoamFyRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IGphckZpbGUuZ2V0SmFyRW50cnkocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChqYXJFbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoZ2V0Q29kZVNvdXJjZSgpLCByZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphclJlc291cmNlSGFuZGxlKGphckZpbGUsIGphckVudHJ5LCBnZXRDb2RlU291cmNlKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBKYXJJbnB1dFN0cmVhbSBpcyA9IG5ldyBKYXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGhpcy5jb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgSmFyRW50cnkgamFyRW50cnkgPSBudWxsOwotICAgICAgICAgICAgICAgIHdoaWxlICgoamFyRW50cnkgPSBpcy5nZXROZXh0SmFyRW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoamFyRW50cnkuZ2V0TmFtZSgpLmVxdWFscyhyZXNvdXJjZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGdldENvZGVTb3VyY2UoKSwgcmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXJFbnRyeSBqYXJFbnRyeTIgPSBqYXJFbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphckVudHJ5UmVzb3VyY2VIYW5kbGUoamFyRW50cnkyLCBpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChqYXJGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXJGaWxlLmdldE1hbmlmZXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGlzID0gbmV3IEphcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0aGlzLmNvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXMuZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgaWYgKGphckZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgSW9VdGlsLmNsb3NlKGphckZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBKYXJFbnRyeVJlc291cmNlSGFuZGxlIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSmFyRW50cnkgamFyRW50cnkyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEphcklucHV0U3RyZWFtIGlzOwotCi0gICAgICAgIHB1YmxpYyBKYXJFbnRyeVJlc291cmNlSGFuZGxlKEphckVudHJ5IGphckVudHJ5MiwgSmFySW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgICAgIHRoaXMuamFyRW50cnkyID0gamFyRW50cnkyOwotICAgICAgICAgICAgdGhpcy5pcyA9IGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGphckVudHJ5Mi5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVVJMIGdldFVybCgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoImphciIsICIiLCAtMSwgZ2V0Q29kZVNvdXJjZSgpICsgIiEvIiArIGphckVudHJ5Mi5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewotICAgICAgICAgICAgcmV0dXJuIGphckVudHJ5Mi5pc0RpcmVjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVSTCBnZXRDb2RlU291cmNlVXJsKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENvZGVTb3VyY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgamFyRW50cnkyLmdldFNpemUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9KYXJTdHJlYW1IYW5kbGVyRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjgxM2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL0phclN0cmVhbUhhbmRsZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSmFyU3RyZWFtSGFuZGxlckZhY3RvcnkgaW1wbGVtZW50cyBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSB7Ci0gICAgcHVibGljIFVSTFN0cmVhbUhhbmRsZXIgY3JlYXRlVVJMU3RyZWFtSGFuZGxlcihTdHJpbmcgcHJvdG9jb2wpIHsKLSAgICAgICAgaWYoImphciIuZXF1YWxzSWdub3JlQ2FzZShwcm90b2NvbCkpewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXJGaWxlVXJsU3RyZWFtSGFuZGxlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9NdWx0aVBhcmVudENsYXNzTG9hZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvTXVsdGlQYXJlbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWVmNmE4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9NdWx0aVBhcmVudENsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIgaXMgYSBzaW1wbGUgZXh0ZW5zaW9uIG9mIHRoZSBVUkxDbGFzc0xvYWRlciB0aGF0IHNpbXBseSBjaGFuZ2VzIHRoZSBzaW5nbGUgcGFyZW50IGNsYXNzCi0gKiBsb2FkZXIgbW9kZWwgdG8gc3VwcG9ydCBhIGxpc3Qgb2YgcGFyZW50IGNsYXNzIGxvYWRlcnMuICBFYWNoIG9wZXJhdGlvbiB0aGF0IGFjY2Vzc2VzIGEgcGFyZW50LCBoYXMgYmVlbiByZXBsYWNlZAotICogd2l0aCBhIG9wZXJhdGlvbiB0aGF0IGNoZWNrcyBlYWNoIHBhcmVudCBpbiBvcmRlci4gIFRoaXMgZ2V0UGFyZW50IG1ldGhvZCBvZiB0aGlzIGNsYXNzIHdpbGwgYWx3YXlzIHJldHVybiBudWxsLAotICogd2hpY2ggbWF5IGJlIGludGVycHJldGVkIGJ5IHRoZSBjYWxsaW5nIGNvZGUgdG8gbWVhbiB0aGF0IHRoaXMgY2xhc3MgbG9hZGVyIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBzeXN0ZW0gY2xhc3MKLSAqIGxvYWRlci4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlcltdIHBhcmVudHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGludmVyc2VDbGFzc0xvYWRpbmc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBoaWRkZW5DbGFzc2VzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbm9uT3ZlcnJpZGFibGVDbGFzc2VzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gaGlkZGVuUmVzb3VyY2VzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbm9uT3ZlcnJpZGFibGVSZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlc3Ryb3llZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIGNsYXNzIGxvYWRlciB3aXRoIG5vIHBhcmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyB0aGUgdXJscyBmcm9tIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzCi0gICAgICovCi0gICAgcHVibGljIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscykgewotICAgICAgICBzdXBlcih1cmxzKTsKLSAgICAgICAgcGFyZW50cyA9IG5ldyBDbGFzc0xvYWRlcltde0NsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCl9OwotICAgICAgICBpbnZlcnNlQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGhpZGRlbkNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZUNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZVJlc291cmNlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmFtZWQgY2xhc3MgbG9hZGVyIGFzIGEgY2hpbGQgb2YgdGhlIHNwZWNpZmllZCBwYXJlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgIHRoZSB1cmxzIGZyb20gd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBjbGFzc2VzIGFuZCByZXNvdXJjZXMKLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgb2YgdGhpcyBjbGFzcyBsb2FkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyh1cmxzLCBuZXcgQ2xhc3NMb2FkZXJbXXtwYXJlbnR9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlciBwYXJlbnQsIGJvb2xlYW4gaW52ZXJzZUNsYXNzTG9hZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBoaWRkZW5DbGFzc2VzLCBTdHJpbmdbXSBub25PdmVycmlkYWJsZUNsYXNzZXMpIHsKLSAgICAgICAgdGhpcyh1cmxzLCBuZXcgQ2xhc3NMb2FkZXJbXXtwYXJlbnR9LCBpbnZlcnNlQ2xhc3NMb2FkaW5nLCBoaWRkZW5DbGFzc2VzLAotICAgICAgICAgICAgIG5vbk92ZXJyaWRhYmxlQ2xhc3Nlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIGNsYXNzIGxvYWRlciBhcyBhIGNoaWxkIG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50IGFuZCB1c2luZyB0aGUgc3BlY2lmaWVkIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5Ci0gICAgICogZm9yIGFjY2Vzc2luZyB0aGUgdXJscy4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgICB0aGUgdXJscyBmcm9tIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzCi0gICAgICogQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBmYWN0b3J5IHRoZSBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeSB1c2VkIHRvIGFjY2VzcyB0aGUgdXJscwotICAgICAqLwotICAgIHB1YmxpYyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCwgVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0aGlzKHVybHMsIG5ldyBDbGFzc0xvYWRlcltde3BhcmVudH0sIGZhY3RvcnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuYW1lZCBjbGFzcyBsb2FkZXIgYXMgYSBjaGlsZCBvZiB0aGUgc3BlY2lmaWVkIHBhcmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgICB0aGUgdXJscyBmcm9tIHdoaWNoIHRoaXMgY2xhc3MgbG9hZGVyIHdpbGwgY2xhc3NlcyBhbmQgcmVzb3VyY2VzCi0gICAgICogQHBhcmFtIHBhcmVudHMgdGhlIHBhcmVudHMgb2YgdGhpcyBjbGFzcyBsb2FkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlcltdIHBhcmVudHMpIHsKLSAgICAgICAgc3VwZXIodXJscyk7Ci0gICAgICAgIHRoaXMucGFyZW50cyA9IGNvcHlQYXJlbnRzKHBhcmVudHMpOwotICAgICAgICBpbnZlcnNlQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGhpZGRlbkNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZUNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZVJlc291cmNlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0gICAgcHVibGljIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzLCBib29sZWFuIGludmVyc2VDbGFzc0xvYWRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBoaWRkZW5DbGFzc2VzLCBDb2xsZWN0aW9uIG5vbk92ZXJyaWRhYmxlQ2xhc3NlcykgewotICAgICAgICB0aGlzKHVybHMsIHBhcmVudHMsIGludmVyc2VDbGFzc0xvYWRpbmcsCi0gICAgICAgICAgICAgKFN0cmluZ1tdKSBoaWRkZW5DbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1toaWRkZW5DbGFzc2VzLnNpemUoKV0pLAotICAgICAgICAgICAgIChTdHJpbmdbXSkgbm9uT3ZlcnJpZGFibGVDbGFzc2VzLnRvQXJyYXkobmV3IFN0cmluZ1tub25PdmVycmlkYWJsZUNsYXNzZXMuc2l6ZSgpXSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyW10gcGFyZW50cywgYm9vbGVhbiBpbnZlcnNlQ2xhc3NMb2FkaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGhpZGRlbkNsYXNzZXMsIFN0cmluZ1tdIG5vbk92ZXJyaWRhYmxlQ2xhc3NlcykgewotICAgICAgICBzdXBlcih1cmxzKTsKLSAgICAgICAgdGhpcy5wYXJlbnRzID0gY29weVBhcmVudHMocGFyZW50cyk7Ci0gICAgICAgIHRoaXMuaW52ZXJzZUNsYXNzTG9hZGluZyA9IGludmVyc2VDbGFzc0xvYWRpbmc7Ci0gICAgICAgIHRoaXMuaGlkZGVuQ2xhc3NlcyA9IGhpZGRlbkNsYXNzZXM7Ci0gICAgICAgIHRoaXMubm9uT3ZlcnJpZGFibGVDbGFzc2VzID0gbm9uT3ZlcnJpZGFibGVDbGFzc2VzOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSB0b1Jlc291cmNlcyhoaWRkZW5DbGFzc2VzKTsKLSAgICAgICAgbm9uT3ZlcnJpZGFibGVSZXNvdXJjZXMgPSB0b1Jlc291cmNlcyhub25PdmVycmlkYWJsZUNsYXNzZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBNdWx0aVBhcmVudENsYXNzTG9hZGVyKE11bHRpUGFyZW50Q2xhc3NMb2FkZXIgc291cmNlKSB7Ci0gICAgICAgIHRoaXMoc291cmNlLmdldFVSTHMoKSwgZGVlcENvcHlQYXJlbnRzKHNvdXJjZS5wYXJlbnRzKSwgc291cmNlLmludmVyc2VDbGFzc0xvYWRpbmcsIHNvdXJjZS5oaWRkZW5DbGFzc2VzLCBzb3VyY2Uubm9uT3ZlcnJpZGFibGVDbGFzc2VzKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQ2xhc3NMb2FkZXIgY29weShDbGFzc0xvYWRlciBzb3VyY2UpIHsKLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcigoTXVsdGlQYXJlbnRDbGFzc0xvYWRlcikgc291cmNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkxDbGFzc0xvYWRlcigoKFVSTENsYXNzTG9hZGVyKSBzb3VyY2UpLmdldFVSTHMoKSwgc291cmNlLmdldFBhcmVudCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFswXSwgc291cmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENsYXNzTG9hZGVyIGNvcHkoKSB7Ci0gICAgICAgIHJldHVybiBNdWx0aVBhcmVudENsYXNzTG9hZGVyLmNvcHkodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSB0b1Jlc291cmNlcyhTdHJpbmdbXSBjbGFzc2VzKSB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc291cmNlcyA9IG5ldyBTdHJpbmdbY2xhc3Nlcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc2VzW2ldOwotICAgICAgICAgICAgcmVzb3VyY2VzW2ldID0gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvdXJjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5hbWVkIGNsYXNzIGxvYWRlciBhcyBhIGNoaWxkIG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50cyBhbmQgdXNpbmcgdGhlIHNwZWNpZmllZCBVUkxTdHJlYW1IYW5kbGVyRmFjdG9yeQotICAgICAqIGZvciBhY2Nlc3NpbmcgdGhlIHVybHMuLgotICAgICAqCi0gICAgICogQHBhcmFtIHVybHMgICAgdGhlIHVybHMgZnJvbSB3aGljaCB0aGlzIGNsYXNzIGxvYWRlciB3aWxsIGNsYXNzZXMgYW5kIHJlc291cmNlcwotICAgICAqIEBwYXJhbSBwYXJlbnRzIHRoZSBwYXJlbnRzIG9mIHRoaXMgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGZhY3RvcnkgdGhlIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IHVzZWQgdG8gYWNjZXNzIHRoZSB1cmxzCi0gICAgICovCi0gICAgcHVibGljIE11bHRpUGFyZW50Q2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXJbXSBwYXJlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIodXJscywgbnVsbCwgZmFjdG9yeSk7Ci0gICAgICAgIHRoaXMucGFyZW50cyA9IGNvcHlQYXJlbnRzKHBhcmVudHMpOwotICAgICAgICBpbnZlcnNlQ2xhc3NMb2FkaW5nID0gZmFsc2U7Ci0gICAgICAgIGhpZGRlbkNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZUNsYXNzZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBoaWRkZW5SZXNvdXJjZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgICAgICBub25PdmVycmlkYWJsZVJlc291cmNlcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXJbXSBjb3B5UGFyZW50cyhDbGFzc0xvYWRlcltdIHBhcmVudHMpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXJbXSBuZXdQYXJlbnRzQXJyYXkgPSBuZXcgQ2xhc3NMb2FkZXJbcGFyZW50cy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIHBhcmVudCA9IHBhcmVudHNbaV07Ci0gICAgICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicGFyZW50WyIgKyBpICsgIl0gaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3UGFyZW50c0FycmF5W2ldID0gcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdQYXJlbnRzQXJyYXk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXJbXSBkZWVwQ29weVBhcmVudHMoQ2xhc3NMb2FkZXJbXSBwYXJlbnRzKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyW10gbmV3UGFyZW50c0FycmF5ID0gbmV3IENsYXNzTG9hZGVyW3BhcmVudHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBwYXJlbnRzW2ldOwotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBhcmVudFsiICsgaSArICJdIGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNdWx0aVBhcmVudENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50ID0gKChNdWx0aVBhcmVudENsYXNzTG9hZGVyKSBwYXJlbnQpLmNvcHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1BhcmVudHNBcnJheVtpXSA9IHBhcmVudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3UGFyZW50c0FycmF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBhcmVudHMgb2YgdGhpcyBjbGFzcyBsb2FkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBwYXJlbnRzIG9mIHRoaXMgY2xhc3MgbG9hZGVyCi0gICAgICovCi0gICAgcHVibGljIENsYXNzTG9hZGVyW10gZ2V0UGFyZW50cygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVVJMKFVSTCB1cmwpIHsKLSAgICAgICAgLy8gdG9kbyB0aGlzIG5lZWRzIGEgc2VjdXJpdHkgY2hlY2sKLSAgICAgICAgc3VwZXIuYWRkVVJMKHVybCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gQ2hlY2sgaWYgY2xhc3MgaXMgaW4gdGhlIGxvYWRlZCBjbGFzc2VzIGNhY2hlCi0gICAgICAgIC8vCi0gICAgICAgIENsYXNzIGNhY2hlZENsYXNzID0gZmluZExvYWRlZENsYXNzKG5hbWUpOwotICAgICAgICBpZiAoY2FjaGVkQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzcyhjYWNoZWRDbGFzcywgcmVzb2x2ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLwotICAgICAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBjaGVjayBsb2NhbCB1cmxzIGZpcnN0Ci0gICAgICAgIC8vCi0gICAgICAgIGlmIChpbnZlcnNlQ2xhc3NMb2FkaW5nICYmICFpc0Rlc3Ryb3llZCgpICYmICFpc05vbk92ZXJyaWRhYmxlQ2xhc3MobmFtZSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBmaW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzcyhjbGF6eiwgcmVzb2x2ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENoZWNrIHBhcmVudCBjbGFzcyBsb2FkZXJzCi0gICAgICAgIC8vCi0gICAgICAgIGlmICghaXNIaWRkZW5DbGFzcyhuYW1lKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gcGFyZW50c1tpXTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IHBhcmVudC5sb2FkQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhc3MoY2xhenosIHJlc29sdmUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBkaWRuJ3QgaGF2ZSB0aGUgY2xhc3M7IHRyeSB0aGUgbmV4dCBvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gIFRPRE8gUkVWSUVXIEZPUiBKQVZBIDYKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gSmF2YSA1LCBpZiB5b3UgcGFzc2VkIGFuIGFycmF5IHN0cmluZyBzdWNoIGFzICJbTGNvbS5teXBhY2thZ2UuTXlDbGFzczsiIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvYWRDbGFzcywgdGhlIGNsYXNzIHdvdWxkIGluZGVlZCBiZSBsb2FkZWQuICAKLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gSkRLNiwgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3b3JrLWFyb3VuZCBpcyB0byB1c2UgY29kZSBDbGFzcy5mb3JOYW1lIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAvLyAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBjaGVjayBsb2NhbCB1cmxzIG5vdwotICAgICAgICAvLwotICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBleGNsdWRpbmcgbm9uLW92ZXJyaWRhYmxlIGNsYXNzZXMgaGVyZS4uLiB3ZQotICAgICAgICAvLyBoYXZlIGFscmVkeSBjaGVja2VkIGhlIHBhcmVudCBhbmQgdGhlIHBhcmVudCBkaWRuJ3QgaGF2ZSB0aGUKLSAgICAgICAgLy8gY2xhc3MsIHNvIHdlIGNhbiBvdmVycmlkZSBub3cKLSAgICAgICAgaWYgKCFpc0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gZmluZENsYXNzKG5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhc3MoY2xhenosIHJlc29sdmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOb25PdmVycmlkYWJsZUNsYXNzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uT3ZlcnJpZGFibGVDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKG5vbk92ZXJyaWRhYmxlQ2xhc3Nlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGlkZGVuQ2xhc3MoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaWRkZW5DbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGhpZGRlbkNsYXNzZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xhc3MgcmVzb2x2ZUNsYXNzKENsYXNzIGNsYXp6LCBib29sZWFuIHJlc29sdmUpIHsKLSAgICAgICAgaWYgKHJlc29sdmUpIHsKLSAgICAgICAgICAgIHJlc29sdmVDbGFzcyhjbGF6eik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXp6OwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKGlzRGVzdHJveWVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gaWYgd2UgYXJlIHVzaW5nIGludmVyc2UgY2xhc3MgbG9hZGluZywgY2hlY2sgbG9jYWwgdXJscyBmaXJzdAotICAgICAgICAvLwotICAgICAgICBpZiAoaW52ZXJzZUNsYXNzTG9hZGluZyAmJiAhaXNEZXN0cm95ZWQoKSAmJiAhaXNOb25PdmVycmlkYWJsZVJlc291cmNlKG5hbWUpKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gZmluZFJlc291cmNlKG5hbWUpOwotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVybDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIENoZWNrIHBhcmVudCBjbGFzcyBsb2FkZXJzCi0gICAgICAgIC8vCi0gICAgICAgIGlmICghaXNIaWRkZW5SZXNvdXJjZShuYW1lKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gcGFyZW50c1tpXTsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gcGFyZW50LmdldFJlc291cmNlKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBjaGVjayBsb2NhbCB1cmxzIG5vdwotICAgICAgICAvLwotICAgICAgICAvLyBkb24ndCB3b3JyeSBhYm91dCBleGNsdWRpbmcgbm9uLW92ZXJyaWRhYmxlIHJlc291cmNlcyBoZXJlLi4uIHdlCi0gICAgICAgIC8vIGhhdmUgYWxyZWR5IGNoZWNrZWQgaGUgcGFyZW50IGFuZCB0aGUgcGFyZW50IGRpZG4ndCBoYXZlIHRoZQotICAgICAgICAvLyByZXNvdXJjZSwgc28gd2UgY2FuIG92ZXJyaWRlIG5vdwotICAgICAgICBpZiAoIWlzRGVzdHJveWVkKCkpIHsKLSAgICAgICAgICAgIC8vIHBhcmVudHMgZGlkbid0IGhhdmUgdGhlIHJlc291cmNlOyBhdHRlbXB0IHRvIGxvYWQgaXQgZnJvbSBteSB1cmxzCi0gICAgICAgICAgICByZXR1cm4gZmluZFJlc291cmNlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSB1c2luZyBpbnZlcnNlIGNsYXNzIGxvYWRpbmcsIGFkZCB0aGUgcmVzb3VyY2VzIGZyb20gbG9jYWwgdXJscyBmaXJzdAotICAgICAgICAvLwotICAgICAgICBpZiAoaW52ZXJzZUNsYXNzTG9hZGluZyAmJiAhaXNEZXN0cm95ZWQoKSkgewotICAgICAgICAgICAgTGlzdCBteVJlc291cmNlcyA9IENvbGxlY3Rpb25zLmxpc3Qoc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKSk7Ci0gICAgICAgICAgICByZXNvdXJjZXMuYWRkQWxsKG15UmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEFkZCBwYXJlbnQgcmVzb3VyY2VzCi0gICAgICAgIC8vCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gcGFyZW50c1tpXTsKLSAgICAgICAgICAgIExpc3QgcGFyZW50UmVzb3VyY2VzID0gQ29sbGVjdGlvbnMubGlzdChwYXJlbnQuZ2V0UmVzb3VyY2VzKG5hbWUpKTsKLSAgICAgICAgICAgIHJlc291cmNlcy5hZGRBbGwocGFyZW50UmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdXNpbmcgaW52ZXJzZSBjbGFzcyBsb2FkaW5nLCBhZGQgdGhlIHJlc291cmNlcyBmcm9tIGxvY2FsIHVybHMgbm93Ci0gICAgICAgIC8vCi0gICAgICAgIGlmICghaW52ZXJzZUNsYXNzTG9hZGluZyAmJiAhaXNEZXN0cm95ZWQoKSkgewotICAgICAgICAgICAgTGlzdCBteVJlc291cmNlcyA9IENvbGxlY3Rpb25zLmxpc3Qoc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKSk7Ci0gICAgICAgICAgICByZXNvdXJjZXMuYWRkQWxsKG15UmVzb3VyY2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihyZXNvdXJjZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc05vbk92ZXJyaWRhYmxlUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25PdmVycmlkYWJsZVJlc291cmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChub25PdmVycmlkYWJsZVJlc291cmNlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGlkZGVuUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaWRkZW5SZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoaGlkZGVuUmVzb3VyY2VzW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlsiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSI7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRGVzdHJveWVkKCkgewotICAgICAgICByZXR1cm4gZGVzdHJveWVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKGRlc3Ryb3llZCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3Ryb3llZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2dGYWN0b3J5LnJlbGVhc2UodGhpcyk7Ci0vLyAgICAgICAgY2xlYXJTb2Z0Q2FjaGUoT2JqZWN0SW5wdXRTdHJlYW0uY2xhc3MsICJzdWJjbGFzc0F1ZGl0cyIpOwotLy8gICAgICAgIGNsZWFyU29mdENhY2hlKE9iamVjdE91dHB1dFN0cmVhbS5jbGFzcywgInN1YmNsYXNzQXVkaXRzIik7Ci0vLyAgICAgICAgY2xlYXJTb2Z0Q2FjaGUoT2JqZWN0U3RyZWFtQ2xhc3MuY2xhc3MsICJsb2NhbERlc2NzIik7Ci0vLyAgICAgICAgY2xlYXJTb2Z0Q2FjaGUoT2JqZWN0U3RyZWFtQ2xhc3MuY2xhc3MsICJyZWZsZWN0b3JzIik7Ci0KLSAgICAgICAgLy8gVGhlIGJlYW5JbmZvQ2FjaGUgaW4gamF2YS5iZWFucy5JbnRyb3NwZWN0b3Igd2lsbCBob2xkIG9uIHRvIENsYXNzZXMgd2hpY2gKLSAgICAgICAgLy8gaXQgaGFzIGludHJvc3BlY3RlZC4gSWYgd2UgZG9uJ3QgZmx1c2ggdGhlIGNhY2hlLCB3ZSBtYXkgcnVuIG91dCBvZgotICAgICAgICAvLyBQZXJtYW5lbnQgR2VuZXJhdGlvbiBzcGFjZS4KLSAgICAgICAgSW50cm9zcGVjdG9yLmZsdXNoQ2FjaGVzKCk7Ci0gICAgfQotCi0vLyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLS8vICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2xlYXJTb2Z0Q2FjaGVGYWlsZWQgPSBmYWxzZTsKLS8vCi0vLyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFyU29mdENhY2hlKENsYXNzIGNsYXp6LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0vLyAgICAgICAgTWFwIGNhY2hlID0gbnVsbDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBGaWVsZCBmID0gY2xhenouZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWUpOwotLy8gICAgICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0vLyAgICAgICAgICAgIGNhY2hlID0gKE1hcCkgZi5nZXQobnVsbCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIWNsZWFyU29mdENhY2hlRmFpbGVkKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgY2xlYXJTb2Z0Q2FjaGVGYWlsZWQgPSB0cnVlOwotLy8gICAgICAgICAgICAgICAgICAgIExvZ0ZhY3RvcnkuZ2V0TG9nKENvbmZpZ3VyYXRpb25DbGFzc0xvYWRlci5jbGFzcykuZXJyb3IoIlVuYWJsZSB0byBjbGVhciBTb2Z0Q2FjaGUgZmllbGQgIiArIGZpZWxkTmFtZSArICIgaW4gY2xhc3MgIiArIGNsYXp6KTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgc3luY2hyb25pemVkIChjYWNoZSkgewotLy8gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlRW51bWVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjYzNTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlRW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBPYmplY3QgbmV4dDsKLQotICAgIHB1YmxpYyBSZXNvdXJjZUVudW1lcmF0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VMb2NhdGlvbnMsIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLSAgICAgICAgdGhpcy5pdGVyYXRvciA9IHJlc291cmNlTG9jYXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLSAgICAgICAgZmV0Y2hOZXh0KCk7Ci0gICAgICAgIHJldHVybiAobmV4dCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICBmZXRjaE5leHQoKTsKLQotICAgICAgICAvLyBzYXZlIG5leHQgaW50byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjbGVhciB0aGUgbmV4dCBmaWVsZAotICAgICAgICBPYmplY3QgbmV4dCA9IHRoaXMubmV4dDsKLSAgICAgICAgdGhpcy5uZXh0ID0gbnVsbDsKLQotICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgaGF2ZSBhIG5leHQgdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZldGNoTmV4dCgpIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbiA9IChSZXNvdXJjZUxvY2F0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VIYW5kbGUgcmVzb3VyY2VIYW5kbGUgPSByZXNvdXJjZUxvY2F0aW9uLmdldFJlc291cmNlSGFuZGxlKHJlc291cmNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlSGFuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlc291cmNlSGFuZGxlLmdldFVybCgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gbm8gbW9yZSBlbGVtZW50cwotICAgICAgICAgICAgLy8gY2xlYXIgdGhlIGl0ZXJhdG9yIHNvIGl0IGNhbiBiZSBHQ2VkCi0gICAgICAgICAgICBpdGVyYXRvciA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBKYXIgZmlsZSB3YXMgY2xvc2VkLi4uIHRoaXMgbWVhbnMgdGhlIHJlc291cmNlIGZpbmRlciB3YXMgZGVzdHJveWVkCi0gICAgICAgICAgICAvLyBjbGVhciB0aGUgaXRlcmF0b3Igc28gaXQgY2FuIGJlIEdDZWQKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvUmVzb3VyY2VGaW5kZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2M2NWM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0aW9uIG9mIHJlc291cmNlIHNlYXJjaGluZyBwb2xpY3kuIEdpdmVuIHJlc291cmNlIG5hbWUsIHRoZSByZXNvdXJjZQotICogZmluZGVyIHBlcmZvcm1zIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGxvb2t1cCwgYW5kLCBpZiBpdCBpcyBhYmxlIHRvIGxvY2F0ZQotICogdGhlIHJlc291cmNlLCByZXR1cm5zIHRoZSB7QGxpbmsgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSBoYW5kbGUocyl9IG9yIFVSTChzKSBvZiBpdC4KLSAqCi0gKiBAdmVyc2lvbiAkUmV2JCAkRGF0ZSQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUZpbmRlciB7Ci0gICAgLyoqCi0gICAgICogRmluZCB0aGUgcmVzb3VyY2UgYnkgbmFtZSBhbmQgcmV0dXJuIFVSTCBvZiBpdCBpZiBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSByZXNvdXJjZSBuYW1lCi0gICAgICogQHJldHVybiByZXNvdXJjZSBVUkwgb3IgbnVsbCBpZiByZXNvdXJjZSB3YXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogRmluZCBhbGwgcmVzb3VyY2VzIHdpdGggZ2l2ZW4gbmFtZSBhbmQgcmV0dXJuIGVudW1lcmF0aW9uIG9mIHRoZWlyIFVSTHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEByZXR1cm4gZW51bWVyYXRpb24gb2YgcmVzb3VyY2UgVVJMcyAocG9zc2libHkgZW1wdHkpLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcmVzb3VyY2UgYnkgbmFtZSBhbmQsIGlmIGZvdW5kLCBvcGVuIGNvbm5lY3Rpb24gdG8gaXQgYW5kIHJldHVybgotICAgICAqIHRoZSB7QGxpbmsgQWJzdHJhY3RSZXNvdXJjZUhhbmRsZSBoYW5kbGV9IG9mIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIHJlc291cmNlIG5hbWUKLSAgICAgKiBAcmV0dXJuIHJlc291cmNlIGhhbmRsZSBvciBudWxsIGlmIHJlc291cmNlIHdhcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2UoU3RyaW5nIG5hbWUpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvUmVzb3VyY2VIYW5kbGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjYWYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUhhbmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgaGFuZGxlIChhIGNvbm5lY3Rpb24pIHRvIHNvbWUgcmVzb3VyY2UsIHdoaWNoIG1heQotICogYmUgYSBjbGFzcywgbmF0aXZlIGxpYnJhcnksIHRleHQgZmlsZSwgaW1hZ2UsIGV0Yy4gSGFuZGxlcyBhcmUgcmV0dXJuZWQKLSAqIGJ5IGEgUmVzb3VyY2VGaW5kZXIuIEEgcmVzb3VyY2UgaGFuZGxlIGFsbG93cyBlYXN5IGFjY2VzcyB0byB0aGUgcmVzb3VyY2UgZGF0YQotICogKHVzaW5nIG1ldGhvZHMge0BsaW5rICNnZXRJbnB1dFN0cmVhbX0gb3Ige0BsaW5rICNnZXRCeXRlc30pIGFzIHdlbGwgYXMKLSAqIGFjY2VzcyByZXNvdXJjZSBtZXRhZGF0YSwgc3VjaCBhcyBhdHRyaWJ1dGVzLCBjZXJ0aWZpY2F0ZXMsIGV0Yy4KLSAqIDxwLz4KLSAqIEFzIHNvb24gYXMgdGhlIGhhbmRsZSBpcyBubyBsb25nZXIgaW4gdXNlLCBpdCBzaG91bGQgYmUgZXhwbGljaXRseQotICoge0BsaW5rICNjbG9zZX1kLCBzaW1pbGFybHkgdG8gSS9PIHN0cmVhbXMuCi0gKgotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VIYW5kbGUgewotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuIFRoZSBuYW1lIGlzIGEgIi8iLXNlcGFyYXRlZCBwYXRoCi0gICAgICogbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHJlc291cmNlLgotICAgICAqLwotICAgIFVSTCBnZXRVcmwoKTsKLQotICAgIC8qKgotICAgICAqIERvZXMgdGhpcyByZXNvdXJjZSByZWZlciB0byBhIGRpcmVjdG9yeS4gIERpcmVjdG9yeSByZXNvdXJjZXMgYXJlIGNvbW1seSB1c2VkCi0gICAgICogYXMgdGhlIGJhc2lzIGZvciBhIFVSTCBpbiBjbGllbnQgYXBwbGljYXRpb24uICBBIGRpcmVjdG9yeSByZXNvdXJjZSBoYXMgMCBieXRlcyBmb3IgaXQncyBjb250ZW50LiAKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBDb2RlU291cmNlIFVSTCBmb3IgdGhlIGNsYXNzIG9yIHJlc291cmNlLgotICAgICAqLwotICAgIFVSTCBnZXRDb2RlU291cmNlVXJsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuZCBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyB0aGlzIHJlc291cmNlIGRhdGEuCi0gICAgICovCi0gICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyByZXNvdXJjZSBkYXRhLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIGludCBnZXRDb250ZW50TGVuZ3RoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoaXMgcmVzb3VyY2UgZGF0YSBhcyBhbiBhcnJheSBvZiBieXRlcy4KLSAgICAgKi8KLSAgICBieXRlW10gZ2V0Qnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBNYW5pZmVzdCBvZiB0aGUgSkFSIGZpbGUgZnJvbSB3aGljaCB0aGlzIHJlc291cmNlCi0gICAgICogd2FzIGxvYWRlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIE1hbmlmZXN0IGdldE1hbmlmZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBDZXJ0aWZpY2F0ZXMgb2YgdGhlIHJlc291cmNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgQ2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQXR0cmlidXRlcyBvZiB0aGUgcmVzb3VyY2UsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgYSBjb25uZWN0aW9uIHRvIHRoZSByZXNvdXJjZSBpbmRlbnRpZmllZCBieSB0aGlzIGhhbmRsZS4gUmVsZWFzZXMKLSAgICAgKiBhbnkgSS9PIG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYW5kbGUuCi0gICAgICovCi0gICAgdm9pZCBjbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlTG9jYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGFzc2xvYWRlci9SZXNvdXJjZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3M2YyYmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1Jlc291cmNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgbG9jYXRpb24gd2hpY2ggaXMgc2VhcmNoZWQgYnkKLSAqIAotICogQHZlcnNpb24gJFJldiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VMb2NhdGlvbiB7Ci0gICAgVVJMIGdldENvZGVTb3VyY2UoKTsgICAgCi0gICAgUmVzb3VyY2VIYW5kbGUgZ2V0UmVzb3VyY2VIYW5kbGUoU3RyaW5nIHJlc291cmNlTmFtZSk7Ci0gICAgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgdm9pZCBjbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsYXNzbG9hZGVyL1VybFJlc291cmNlRmluZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvVXJsUmVzb3VyY2VGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmODBhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xhc3Nsb2FkZXIvVXJsUmVzb3VyY2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVXJsUmVzb3VyY2VGaW5kZXIgaW1wbGVtZW50cyBSZXNvdXJjZUZpbmRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hTZXQ8VVJMPiB1cmxzID0gbmV3IExpbmtlZEhhc2hTZXQ8VVJMPigpOwotICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxVUkwsUmVzb3VyY2VMb2NhdGlvbj4gY2xhc3NQYXRoID0gbmV3IExpbmtlZEhhc2hNYXA8VVJMLFJlc291cmNlTG9jYXRpb24+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoU2V0PEZpbGU+IHdhdGNoZWRGaWxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PEZpbGU+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVzdHJveWVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVXJsUmVzb3VyY2VGaW5kZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFVybFJlc291cmNlRmluZGVyKFVSTFtdIHVybHMpIHsKLSAgICAgICAgYWRkVXJscyh1cmxzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGlmIChkZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0cm95ZWQgPSB0cnVlOwotICAgICAgICAgICAgdXJscy5jbGVhcigpOwotICAgICAgICAgICAgZm9yIChSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24gOiBjbGFzc1BhdGgudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGFzc1BhdGguY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSZXNvdXJjZUhhbmRsZSBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgaWYgKGRlc3Ryb3llZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VVJMLCBSZXNvdXJjZUxvY2F0aW9uPiBlbnRyeSA6IGdldENsYXNzUGF0aCgpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFJlc291cmNlSGFuZGxlIHJlc291cmNlSGFuZGxlID0gcmVzb3VyY2VMb2NhdGlvbi5nZXRSZXNvdXJjZUhhbmRsZShyZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUhhbmRsZSAhPSBudWxsICYmICFyZXNvdXJjZUhhbmRsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIHJlc291cmNlTmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGlmIChkZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFVSTCwgUmVzb3VyY2VMb2NhdGlvbj4gZW50cnkgOiBnZXRDbGFzc1BhdGgoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZUhhbmRsZSByZXNvdXJjZUhhbmRsZSA9IHJlc291cmNlTG9jYXRpb24uZ2V0UmVzb3VyY2VIYW5kbGUocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VIYW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VIYW5kbGUuZ2V0VXJsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyByZXNvdXJjZU5hbWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlRW51bWVyYXRpb24obmV3IEFycmF5TGlzdDxSZXNvdXJjZUxvY2F0aW9uPihnZXRDbGFzc1BhdGgoKS52YWx1ZXMoKSksIHJlc291cmNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRVcmwoVVJMIHVybCkgewotICAgICAgICBhZGRVcmxzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXJsKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTFtdIGdldFVybHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgcmV0dXJuIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGFycmF5IG9mIHVybHMgdG8gdGhlIGVuZCBvZiB0aGlzIGNsYXNzIGxvYWRlci4KLSAgICAgKiBAcGFyYW0gdXJscyB0aGUgVVJMcyB0byBhZGQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRVcmxzKFVSTFtdIHVybHMpIHsKLSAgICAgICAgYWRkVXJscyhBcnJheXMuYXNMaXN0KHVybHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbGlzdCBvZiB1cmxzIHRvIHRoZSBlbmQgb2YgdGhpcyBjbGFzcyBsb2FkZXIuCi0gICAgICogQHBhcmFtIHVybHMgdGhlIFVSTHMgdG8gYWRkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVXJscyhMaXN0PFVSTD4gdXJscykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKLSAgICAgICAgICAgIGlmIChkZXN0cm95ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVcmxSZXNvdXJjZUZpbmRlciBoYXMgYmVlbiBkZXN0cm95ZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRSZWJ1aWxkID0gdGhpcy51cmxzLmFkZEFsbCh1cmxzKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRSZWJ1aWxkKSB7Ci0gICAgICAgICAgICAgICAgcmVidWlsZENsYXNzUGF0aCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaW5rZWRIYXNoTWFwPFVSTCwgUmVzb3VyY2VMb2NhdGlvbj4gZ2V0Q2xhc3NQYXRoKCkgewotICAgICAgICBhc3NlcnQgVGhyZWFkLmhvbGRzTG9jayhsb2NrKTogIlRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrIjsKLQotICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IHdhdGNoZWRGaWxlcykgewotICAgICAgICAgICAgaWYgKGZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVidWlsZENsYXNzUGF0aCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsYXNzUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWJ1aWxkcyB0aGUgZW50aXJlIGNsYXNzIHBhdGguICBUaGlzIGNsYXNzIGlzIGNhbGxlZCB3aGVuIG5ldyBVUkxzIGFyZSBhZGRlZCBvciBvbmUgb2YgdGhlIHdhdGNoZWQgZmlsZXMKLSAgICAgKiBiZWNvbWVzIHJlYWRhYmxlLiAgVGhpcyBtZXRob2Qgd2lsbCBub3Qgb3BlbiBqYXIgZmlsZXMgYWdhaW4sIGJ1dCB3aWxsIGFkZCBhbnkgbmV3IGVudHJpZXMgbm90IGFscmVkeSBvcGVuCi0gICAgICogdG8gdGhlIGNsYXNzIHBhdGguICBJZiBhbnkgZmlsZSBiYXNlZCB1cmwgaXMgZG9lcyBub3QgZXhpc3QsIHdlIHdpbGwgd2F0Y2ggZm9yIHRoYXQgZmlsZSB0byBhcHBlYXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlYnVpbGRDbGFzc1BhdGgoKSB7Ci0gICAgICAgIGFzc2VydCBUaHJlYWQuaG9sZHNMb2NrKGxvY2spOiAiVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2siOwotCi0gICAgICAgIC8vIGNvcHkgYWxsIG9mIHRoZSBleGlzdGluZyBsb2NhdGlvbnMgaW50byBhIHRlbXAgbWFwIGFuZCBjbGVhciB0aGUgY2xhc3MgcGF0aAotICAgICAgICBNYXA8VVJMLFJlc291cmNlTG9jYXRpb24+IGV4aXN0aW5nSmFyRmlsZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxVUkwsUmVzb3VyY2VMb2NhdGlvbj4oY2xhc3NQYXRoKTsKLSAgICAgICAgY2xhc3NQYXRoLmNsZWFyKCk7Ci0KLSAgICAgICAgTGlua2VkTGlzdDxVUkw+IGxvY2F0aW9uU3RhY2sgPSBuZXcgTGlua2VkTGlzdDxVUkw+KHVybHMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCFsb2NhdGlvblN0YWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBsb2NhdGlvblN0YWNrLnJlbW92ZUZpcnN0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTa2lwIGFueSBkdXBsaWNhdGUgdXJscyBpbiB0aGUgY2xhc3NwYXRoCi0gICAgICAgICAgICAgICAgaWYgKGNsYXNzUGF0aC5jb250YWluc0tleSh1cmwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlzIHRoaXMgVVJMIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkCi0gICAgICAgICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uID0gZXhpc3RpbmdKYXJGaWxlcy5yZW1vdmUodXJsKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIG5vdCBvcGVuZWQsIGNhY2hlIHRoZSB1cmwgYW5kIHdyYXAgaXQgd2l0aCBhIHJlc291cmNlIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gY2FjaGVVcmwodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTG9jYXRpb24gPSBjcmVhdGVSZXNvdXJjZUxvY2F0aW9uKHVybCwgZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZmlsZSBVUkwsIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgeWV0Li4uIHdhdGNoIHRvIHNlZSBpZiBpdCBhcHBlYXJzIGxhdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVkRmlsZXMuYWRkKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IHNlZW0gdG8gb3BlbiB0aGUgZmlsZS4uLiB0aGlzIGlzIG1vc3QgbGlrZWx5IGEgYmFkIGphciBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBkb24ndCBrZWVwIGEgd2F0Y2ggb3V0IGZvciBpdCBiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSBsb3RzIG9mIGNoZWNraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEYWluOiBXZSBtYXkgd2FudCB0byByZXZpZXcgdGhpcyBkZWNpc2lvbiBsYXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvdG9jb2wgZm9yIHRoZSBKQVIgZmlsZSdzIFVSTCBpcyBub3Qgc3VwcG9ydGVkLiAgVGhpcyBjYW4gb2NjdXIgd2hlbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGphciBmaWxlIGlzIGVtYmVkZGVkIGluIGFuIEVBUiBvciBDQVIgZmlsZS4gIFByb2NlZWQgYnV0IGxvZyB0aGUgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHByb3RvY29sIGZvciB0aGUgSkFSIGZpbGUncyBVUkwgaXMgbm90IHN1cHBvcnRlZCIgKyBleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgamFyIHRvIG91ciBjbGFzcyBwYXRoCi0gICAgICAgICAgICAgICAgY2xhc3NQYXRoLnB1dChyZXNvdXJjZUxvY2F0aW9uLmdldENvZGVTb3VyY2UoKSwgcmVzb3VyY2VMb2NhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBwdXNoIHRoZSBtYW5pZmVzdCBjbGFzc3BhdGggb24gdGhlIHN0YWNrIChtYWtlIHN1cmUgdG8gbWFpbnRhaW4gdGhlIG9yZGVyKQotICAgICAgICAgICAgICAgIExpc3Q8VVJMPiBtYW5pZmVzdENsYXNzUGF0aCA9IGdldE1hbmlmZXN0Q2xhc3NQYXRoKHJlc291cmNlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIGxvY2F0aW9uU3RhY2suYWRkQWxsKDAsIG1hbmlmZXN0Q2xhc3NQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXJyb3IgZSkgewotICAgICAgICAgICAgZGVzdHJveSgpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoUmVzb3VyY2VMb2NhdGlvbiByZXNvdXJjZUxvY2F0aW9uIDogZXhpc3RpbmdKYXJGaWxlcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEZpbGUgY2FjaGVVcmwoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgewotICAgICAgICAgICAgLy8gZG93bmxvYWQgdGhlIGphcgotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJPbmx5IGxvY2FsIGZpbGUgamFycyBhcmUgc3VwcG9ydGVkICIgKyB1cmwpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldFBhdGgoKSk7Ci0gICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgaXMgbm90IHJlYWRhYmxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFJlc291cmNlTG9jYXRpb24gY3JlYXRlUmVzb3VyY2VMb2NhdGlvbihVUkwgY29kZVNvdXJjZSwgRmlsZSBjYWNoZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghY2FjaGVGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGNhY2hlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjYWNoZUZpbGUuY2FuUmVhZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZpbGUgaXMgbm90IHJlYWRhYmxlOiAiICsgY2FjaGVGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlTG9jYXRpb24gcmVzb3VyY2VMb2NhdGlvbjsKLSAgICAgICAgaWYgKGNhY2hlRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAvLyBEaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uIHdpbGwgb25seSByZXR1cm4gImZpbGUiIFVSTHMgd2l0aGluIHRoaXMgZGlyZWN0b3J5Ci0gICAgICAgICAgICAvLyBkbyBub3QgdXNlciB0aGUgRGlyZWN0b3J5UmVzb3VyY2VMb2NhdGlvbiBmb3Igbm9uIGZpbGUgYmFzZWQgdXJscwotICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbiA9IG5ldyBEaXJlY3RvcnlSZXNvdXJjZUxvY2F0aW9uKGNhY2hlRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uID0gbmV3IEphclJlc291cmNlTG9jYXRpb24oY29kZVNvdXJjZSwgY2FjaGVGaWxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzb3VyY2VMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8VVJMPiBnZXRNYW5pZmVzdENsYXNzUGF0aChSZXNvdXJjZUxvY2F0aW9uIHJlc291cmNlTG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUgbWFuaWZlc3QsIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IHJlc291cmNlTG9jYXRpb24uZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gc29tZSBsb2NhdGlvbnMgZG9uJ3QgaGF2ZSBhIG1hbmlmZXN0Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2xhc3MtcGF0aCBhdHRyaWJ1dGUsIGlmIHBvc3NpYmxlCi0gICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RDbGFzc1BhdGggPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLSAgICAgICAgICAgIGlmIChtYW5pZmVzdENsYXNzUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSB1cmxzLi4uCi0gICAgICAgICAgICAvLyB0aGUgY2xhc3MtcGF0aCBhdHRyaWJ1dGUgaXMgc3BhY2UgZGVsaW1pdGVkCi0gICAgICAgICAgICBVUkwgY29kZVNvdXJjZSA9IHJlc291cmNlTG9jYXRpb24uZ2V0Q29kZVNvdXJjZSgpOwotICAgICAgICAgICAgTGlua2VkTGlzdDxVUkw+IGNsYXNzUGF0aFVybHMgPSBuZXcgTGlua2VkTGlzdDxVUkw+KCk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG1hbmlmZXN0Q2xhc3NQYXRoLCAiICIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2xhc3MgcGF0aCBlbnRyeSBpcyByZWxhdGl2ZSB0byB0aGUgcmVzb3VyY2UgbG9jYXRpb24gY29kZSBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgVVJMIGVudHJ5VXJsID0gbmV3IFVSTChjb2RlU291cmNlLCBlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzUGF0aFVybHMuYWRkTGFzdChlbnRyeVVybCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCBsaWtlbHkgYSBwb29ybHkgbmFtZWQgZW50cnkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NQYXRoVXJsczsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotICAgICAgICAgICAgLy8gZXJyb3Igb3BlbmluZyB0aGUgbWFuaWZlc3QKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcGVyYXRpb25DbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvT3BlcmF0aW9uQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZDVkMmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcGVyYXRpb25DbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5DbGllbnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGFyZ2V0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogQW4gb3BlcmF0aW9uIGNsaWVudCBpcyB0aGUgd2F5IGFuIGFkdmFuY2VkIHVzZXIgaW50ZXJhY3RzIHdpdGggQXhpczIuIEFjdHVhbAotICogb3BlcmF0aW9uIGNsaWVudHMgdW5kZXJzdGFuZCBhIHNwZWNpZmljIE1FUCBhbmQgaGVuY2UgdGhlaXIgYmVoYXZpb3IgaXMKLSAqIGRlZmluZWQgYnkgdGhlaXIgTUVQLiBUbyBpbnRlcmFjdCB3aXRoIGFuIG9wZXJhdGlvbiBjbGllbnQsIHlvdSBmaXJzdCBnZXQgb25lCi0gKiBmcm9tIGEgc3BlY2lmaWMgQXhpc09wZXJhdGlvbi4gVGhlbiB5b3Ugc2V0IHRoZSBtZXNzYWdlcyBpbnRvIGl0IG9uZSBieSBvbmUKLSAqICh3aGF0ZXZlciBpcyBhdmFpbGFibGUpLiBUaGVuLCB3aGVuIHlvdSBjYWxsIGV4ZWN1dGUoKSB0aGUgY2xpZW50IHdpbGwKLSAqIGV4ZWN1dGUgd2hhdCBpdCBjYW4gYXQgdGhhdCBwb2ludC4gSWYgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24gY2xpZW50IHJlc3VsdHMKLSAqIGluIGEgbmV3IG1lc3NhZ2UgYmVpbmcgY3JlYXRlZCwgdGhlbiBpZiBhIG1lc3NhZ2UgcmVjZWl2ZXIgaXMgcmVnaXN0ZXJlZCB3aXRoCi0gKiB0aGUgY2xpZW50IHRoZW4gdGhlIG1lc3NhZ2Ugd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhhdCBjbGllbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb25DbGllbnQgewotCi0gICAgcHJvdGVjdGVkIEF4aXNPcGVyYXRpb24gYXhpc09wOwotCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VDb250ZXh0IHNjOwotCi0gICAgcHJvdGVjdGVkIE9wdGlvbnMgb3B0aW9uczsKLQotICAgIHByb3RlY3RlZCBPcGVyYXRpb25Db250ZXh0IG9jOwotCi0gICAgcHJvdGVjdGVkIENhbGxiYWNrIGNhbGxiYWNrOwotCi0gICAgcHJvdGVjdGVkIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2s7Ci0KLSAgICAvKgotICAgICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIE1FUCBleGVjdXRpb24gaGFzIGNvbXBsZXRlZCAoYW5kIGhlbmNlIHJlYWR5IGZvcgotICAgICogcmVzZXR0aW5nKQotICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY29tcGxldGVkOwotCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbkNsaWVudChBeGlzT3BlcmF0aW9uIGF4aXNPcCwgU2VydmljZUNvbnRleHQgc2MsIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICB0aGlzLmF4aXNPcCA9IGF4aXNPcDsKLSAgICAgICAgdGhpcy5zYyA9IHNjOwotICAgICAgICB0aGlzLm9wdGlvbnMgPSBuZXcgT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgY29tcGxldGVkID0gZmFsc2U7Ci0gICAgICAgIG9jID0gc2MuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3ApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGNsaWVudC4gVGhpcwotICAgICAqIHJlc2V0cyB0aGUgZW50aXJlIHNldCBvZiBvcHRpb25zIHRvIHVzZSB0aGUgbmV3IG9wdGlvbnMgLSBzbyB5b3UnZCBsb3NlCi0gICAgICogYW55IG9wdGlvbiBjYXNjYWRpbmcgdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCB1cC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG9wdGlvbnMgdXNlZCBieSB0aGlzIGNsaWVudC4gSWYgeW91IHdhbnQgdG8gc2V0IGEgc2luZ2xlCi0gICAgICogb3B0aW9uLCB0aGVuIHRoZSByaWdodCB3YXkgaXMgdG8gZG8gZ2V0T3B0aW9ucygpIGFuZCBzZXQgc3BlY2lmaWMKLSAgICAgKiBvcHRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb3B0aW9ucywgd2hpY2ggd2lsbCBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIG1lc3NhZ2UgY29udGV4dCB0byB0aGUgY2xpZW50IGZvciBwcm9jZXNzaW5nLiBUaGlzIG1ldGhvZCBtdXN0IG5vdAotICAgICAqIHByb2Nlc3MgdGhlIG1lc3NhZ2UgLSBpdCBvbmx5IHJlY29yZHMgaXQgaW4gdGhlIG9wZXJhdGlvbiBjbGllbnQuCi0gICAgICogUHJvY2Vzc2luZyBvbmx5IG9jY3VycyB3aGVuIGV4ZWN1dGUoKSBpcyBjYWxsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoaXMgaXMgY2FsbGVkIGluYXBwcm9wcmlhdGVseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIG1lc3NhZ2UgZnJvbSB0aGUgY2xpZW50IC0gd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgcmVxdWVzdGVkCi0gICAgICogbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VMYWJlbCB0aGUgbWVzc2FnZSBsYWJlbCBvZiB0aGUgZGVzaXJlZCBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBkZXNpcmVkIG1lc3NhZ2UgY29udGV4dCBvciBudWxsIGlmIGl0cyBub3QgYXZhaWxhYmxlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBtZXNzYWdlIGxhYmVsIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIHdoZW4gYSBtZXNzYWdlIGNvbWVzIGludG8gdGhlIE1FUCBhbmQgdGhlCi0gICAgICogb3BlcmF0aW9uIGNsaWVudCBpcyBleGVjdXRlZC4gVGhpcyBpcyB0aGUgd2F5IHRoZSBvcGVyYXRpb24gY2xpZW50Ci0gICAgICogcHJvdmlkZXMgbm90aWZpY2F0aW9uIHRoYXQgYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IGl0LiBFeGFjdGx5Ci0gICAgICogd2hlbiBpdHMgZXhlY3V0ZWQgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYwotICAgICAqIG9wZXJhdGlvbiBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGJlIHVzZWQgd2hlbiB0aGUgY2xpZW50IGRlY2lkZXMgaXRzIHRpbWUgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgdXNlIGl0Ci0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgQXhpc0NhbGxiYWNrIGludGVyZmFjZSByYXRoZXIgdGhhbiBDYWxsYmFjaywgd2hpY2ggaGFzIGJlZW4gZGVwcmVjYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2FsbGJhY2sgdG8gYmUgZXhlY3V0ZWQgd2hlbiBhIG1lc3NhZ2UgY29tZXMgaW50byB0aGUgTUVQIGFuZCB0aGUKLSAgICAgKiBvcGVyYXRpb24gY2xpZW50IGlzIGV4ZWN1dGVkLiBUaGlzIGlzIHRoZSB3YXkgdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgKiBwcm92aWRlcyBub3RpZmljYXRpb24gdGhhdCBhIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgaXQuIEV4YWN0bHkKLSAgICAgKiB3aGVuIGl0cyBleGVjdXRlZCBhbmQgdW5kZXIgd2hhdCBjb25kaXRpb25zIGlzIGEgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmljCi0gICAgICogb3BlcmF0aW9uIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gYmUgdXNlZCB3aGVuIHRoZSBjbGllbnQgZGVjaWRlcyBpdHMgdGltZSB0bwotICAgICAqICAgICAgICAgICAgICAgICB1c2UgaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYWxsYmFjayhBeGlzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgYXhpc0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgTUVQLiAgVGhpcyBtZXRob2QgaXMgZmluYWwgYW5kIG9ubHkgc2VydmVzIHRvIHNldCAoaWYgYXBwcm9wcmlhdGUpCi0gICAgICogdGhlIGxhc3RPcGVyYXRpb25Db250ZXh0IG9uIHRoZSBTZXJ2aWNlQ29udGV4dCwgYW5kIHRoZW4gaXQgY2FsbHMKLSAgICAgKiBleGVjdXRlSW1wbCgpLCB3aGljaCBkb2VzIHRoZSBhY3R1YWwgd29yay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBibG9jayBJbmRpY2F0ZXMgd2hldGhlciBleGVjdXRpb24gc2hvdWxkIGJsb2NrIG9yIHJldHVybiBBU0FQLiBXaGF0Ci0gICAgICogICAgICAgICAgICAgIGJsb2NrIG1lYW5zIGlzIG9mIGNvdXJzZSBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpb24KLSAgICAgKiAgICAgICAgICAgICAgY2xpZW50LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBvcGVyYXRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZShib29sZWFuIGJsb2NrKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2Muc2V0TGFzdE9wZXJhdGlvbkNvbnRleHQob2MpOwotICAgICAgICBleGVjdXRlSW1wbChibG9jayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgTUVQLiBXaGF0IHRoaXMgZG9lcyBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBvcGVyYXRpb24gY2xpZW50LgotICAgICAqIFRoZSBiYXNpYyBpZGVhIGlzIHRvIGhhdmUgdGhlIG9wZXJhdGlvbiBjbGllbnQgZXhlY3V0ZSBhbmQgZG8gc29tZXRoaW5nCi0gICAgICogd2l0aCB0aGUgbWVzc2FnZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gaXQgc28gZmFyLiBGb3IgZXhhbXBsZSwgaWYgaXRzCi0gICAgICogYW4gT3V0LUluIE1FUCwgdGhlbiBpZiB0aGUgT3V0IG1lc3NhZ2UgaGFzIGJlZW4gc2V0LCB0aGVuIGV4ZWN1dGluZyB0aGUKLSAgICAgKiBjbGllbnQgYXNrcyBpdCB0byBzZW5kIHRoZSBtZXNzYWdlIGFuZCBnZXQgdGhlIEluIG1lc3NhZ2UsIHBvc3NpYmx5IHVzaW5nCi0gICAgICogYSBkaWZmZXJlbnQgdGhyZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtIGJsb2NrIEluZGljYXRlcyB3aGV0aGVyIGV4ZWN1dGlvbiBzaG91bGQgYmxvY2sgb3IgcmV0dXJuIEFTQVAuIFdoYXQKLSAgICAgKiAgICAgICAgICAgICAgYmxvY2sgbWVhbnMgaXMgb2YgY291cnNlIGEgZnVuY3Rpb24gb2YgdGhlIHNwZWNpZmljIG9wZXJhdGlvbgotICAgICAqICAgICAgICAgICAgICBjbGllbnQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIG9wZXJhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlSW1wbChib29sZWFuIGJsb2NrKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIG9wZXJhdGlvbiBjbGllbnQgdG8gYSBjbGVhbiBzdGF0dXMgYWZ0ZXIgdGhlIE1FUCBoYXMgY29tcGxldGVkLgotICAgICAqIFRoaXMgaXMgaG93IHlvdSBjYW4gcmV1c2UgYW4gb3BlcmF0aW9uIGNsaWVudC4gTk9URTogdGhpcyBkb2VzIG5vdCByZXNldAotICAgICAqIHRoZSBvcHRpb25zOyBvbmx5IHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGUgY2xpZW50IGNhbiBiZSB1c2VkIGFnYWluLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgcmVzZXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgTUVQIGNsaWVudCBoYXMgY29tcGxldGVkIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90cmVzZXQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb2MgPSBudWxsOwotICAgICAgICBjb21wbGV0ZWQgPSBmYWxzZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRvIGNsb3NlIHRoZSB0cmFuc3BvcnQgaWYgbmVjZXNzYXJ5ICwgY2FuIGNhbGwgdGhpcyBtZXRob2QuIFRoZSBtYWluCi0gICAgICogdXNhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgd2hlbiBjbGllbnQgdXNlcyB0d28gdGFybnNwb3J0cyBmb3Igc2VuZGluZyBhbmQKLSAgICAgKiByZWNlaXZpbmcgLCBhbmQgd2UgbmVlZCB0byByZW1vdmUgZW50cmllcyBmb3Igd2FpdGluZyBjYWxscyBpbiB0aGUKLSAgICAgKiB0cmFuc3BvcnQgbGlzdGVuZXIgcXVldWUuCi0gICAgICogTm90ZSA6IERPIE5PVCBjYWxsIHRoaXMgbWV0aG9kIGlmIHlvdSBhcmUgbm90IHVzaW5nIHR3byB0cmFuc3BvcnRzIHRvCi0gICAgICogc2VuZCBhbmQgcmVjZWl2ZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0N0eHQgOiBNZXNzYWdlQ29udGV4dCMgd2hpY2ggaGFzIGFsbCB0aGUgdHJhbnNwb3J0IGluZm9ybWF0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgOiB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29tcGxldGUoTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyc291dCA9IG1zZ0N0eHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgIGlmICh0cnNvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJzb3V0LmdldFNlbmRlcigpLmNsZWFudXAobXNnQ3R4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCB0aGUgb3BlcmF0aW9uIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGdldE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBvYzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBtZXNzYWdlIElEIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSBjb250ZXh0IGlmIG5lZWRlZC4gSWYgdXNlciBnaXZlcyBhbiBvcHRpb24gd2l0aAotICAgICAqIE1lc3NhZ2VJRCB0aGVuIGp1c3QgY29weSB0aGF0IGludG8gTWVzc2FnZUNvbnRleHQgLCBhbmQgd2l0aCB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZQotICAgICAqIG1lc3NhZ2Ugd2l0aCBzYW1lIE1lc3NhZ2VJRCB1bmxlc3MgdXNlciBjYWxsIHNldE9wdGlvbiBmb3IgZWFjaCBpbnZvY2F0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB1c2VyIHdhbnQgdG8gZ2l2ZSBtZXNzYWdlIElEIHRoZW4gdGhlIGJldHRlciB3YXkgaXMgdG8gc2V0IHRoZSBtZXNzYWdlIElEIGluIHRoZSBvcHRpb24gYW5kCi0gICAgICogY2FsbCBzZXRPcHRpb24gZm9yIGVhY2ggaW52b2NhdGlvbiB0aGVuIHRoZSByaWdodCB0aGluZyB3aWxsIGhhcHBlbi4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdXNlciBkb2VzIG5vdCBnaXZlIGEgbWVzc2FnZSBJRCB0aGVuIHRoZSBuZXcgb25lIHdpbGwgYmUgY3JlYXRlZCBhbmQgc2V0IHRoYXQgaW50byBNZXNzYWdlCi0gICAgICogQ29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYyB0aGUgbWVzc2FnZSBjb250ZXh0IHdob3NlIGlkIGlzIHRvIGJlIHNldAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2VJRChNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICAvLyBub3cgaXRzIHRoZSB0aW1lIHRvIHB1dCB0aGUgcGFyYW1ldGVycyBzZXQgYnkgdGhlIHVzZXIgaW4gdG8gdGhlCi0gICAgICAgIC8vIGNvcnJlY3QgcGxhY2VzIGFuZCB0byB0aGUKLSAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gbWVzc2FnZSBpZCBzdGlsbCwgc2V0IGEgbmV3IG9uZS4KLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VJZCA9IG9wdGlvbnMuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlSWQgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWVzc2FnZUlkKSkgewotICAgICAgICAgICAgbWVzc2FnZUlkID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWMuc2V0TWVzc2FnZUlEKG1lc3NhZ2VJZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlUGFyYW1ldGVycyhNZXNzYWdlQ29udGV4dCBtc2djdHgpIHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdG8gPSBtc2djdHguZ2V0VG8oKTsKLSAgICAgICAgaWYgKG9wdGlvbnMuaXNNYW5hZ2VTZXNzaW9uKCkgfHwgKG9wdGlvbnMuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0UGFyZW50KCkuaXNNYW5hZ2VTZXNzaW9uKCkpKSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0ZXByID0gc2MuZ2V0VGFyZ2V0RVBSKCk7Ci0gICAgICAgICAgICBpZiAodGVwciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWFwPFFOYW1lLCBPTUVsZW1lbnQ+IG1hcCA9IHRlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxPTUVsZW1lbnQ+IHZhbHVzZSA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodmFsdXNlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlZnBhcmFlbGVtZW50ID0gdmFsdXNlLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZwYXJhZWxlbWVudCBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvLmFkZFJlZmVyZW5jZVBhcmFtZXRlcigoT01FbGVtZW50KSByZWZwYXJhZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcmVwYXJlTWVzc2FnZUNvbnRleHQgZ2V0cyBhIGZyZXNoIG5ldyBNZXNzYWdlQ29udGV4dCByZWFkeSB0byBiZSBzZW50LgotICAgICAqIEl0IHNldHMgdXAgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzLCB0cmFuc3BvcnQgaW5mb3JtYXRpb24sIGV0Yy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dCB0aGUgYWN0aXZlIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogQHBhcmFtIG1jIHRoZSBNZXNzYWdlQ29udGV4dCB0byBiZSBjb25maWd1cmVkCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZU1lc3NhZ2VDb250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBzZXQgb3B0aW9ucyBvbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGlmIChtYy5nZXRTb2FwQWN0aW9uKCkgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWMuZ2V0U29hcEFjdGlvbigpKSkgewotICAgICAgICAgICAgbWMuc2V0U29hcEFjdGlvbihvcHRpb25zLmdldEFjdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1jLnNldE9wdGlvbnMobmV3IE9wdGlvbnMob3B0aW9ucykpOwotICAgICAgICBtYy5zZXRBeGlzTWVzc2FnZShheGlzT3AuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSk7Ci0KLSAgICAgICAgLy8gZG8gVGFyZ2V0IFJlc29sdXRpb24KLSAgICAgICAgVGFyZ2V0UmVzb2x2ZXIgdGFyZ2V0UmVzb2x2ZXIgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VGFyZ2V0UmVzb2x2ZXJDaGFpbigpOwotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0UmVzb2x2ZXIucmVzb2x2ZVRhcmdldChtYyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgdGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIHNlbmRpbmcgaXMgbm90IHNwZWNpZmllZCwgdHJ5IHRvIGZpbmQgaXQKLSAgICAgICAgLy8gZnJvbSB0aGUgVVJMCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHNlbmRlclRyYW5zcG9ydCA9IG9wdGlvbnMuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgIGlmIChzZW5kZXJUcmFuc3BvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdG9FUFIgPSAob3B0aW9ucy5nZXRUbygpICE9IG51bGwpID8gb3B0aW9ucwotICAgICAgICAgICAgICAgICAgICAuZ2V0VG8oKSA6IG1jLmdldFRvKCk7Ci0gICAgICAgICAgICBzZW5kZXJUcmFuc3BvcnQgPSBDbGllbnRVdGlscy5pbmZlck91dFRyYW5zcG9ydChjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSwgdG9FUFIsIG1jKTsKLSAgICAgICAgfQotICAgICAgICBtYy5zZXRUcmFuc3BvcnRPdXQoc2VuZGVyVHJhbnNwb3J0KTsKLSAgICAgICAgaWYgKG9wdGlvbnMuZ2V0UGFyZW50KCkgIT1udWxsICYmIG9wdGlvbnMuZ2V0UGFyZW50KCkuaXNNYW5hZ2VTZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIG1jLmdldE9wdGlvbnMoKS5zZXRNYW5hZ2VTZXNzaW9uKHRydWUpOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaXNNYW5hZ2VTZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIG1jLmdldE9wdGlvbnMoKS5zZXRNYW5hZ2VTZXNzaW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGFkZFJlZmVyZW5jZVBhcmFtZXRlcnMobWMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvT3B0aW9ucy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0N2ZiNDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuRXh0ZXJuYWxpemVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZVNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotCi0vKioKLSAqIEhvbGRlciBmb3Igb3BlcmF0aW9uIGNsaWVudCBvcHRpb25zLiBUaGlzIGlzIHVzZWQgYnkgdGhlIG90aGVyIGNsYXNzZXMgaW4KLSAqIHRoaXMgcGFja2FnZSB0byBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyBhIGNsaWVudCBjb21tdW5pY2F0ZXMgd2l0aCBhCi0gKiBzZXJ2aWNlLiBJdCBleHBvc2VzIGEgbnVtYmVyIG9mIHByZWRlZmluZWQgcHJvcGVydGllcyBhcyBwYXJ0IG9mIHRoZSBBUEkKLSAqICh3aXRoIHNwZWNpZmljIGdldFhYWCBhbmQgc2V0WFhYIG1ldGhvZHMpLCBhbmQgYWxzbyBhbGxvd3MgZm9yIGFyYml0cmFyeQotICogbmFtZWQgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgdXNpbmcgYSBwcm9wZXJ0aWVzIG1hcCB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lCi0gKiBhcyB0aGUga2V5IHZhbHVlLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgY2hhaW5lZCB0b2dldGhlciBmb3IKLSAqIHByb3BlcnR5IGluaGVyaXRhbmNlLCBzbyB0aGF0IGlmIGEgcHJvcGVydHkgaXMgbm90IHNldCBpbiBvbmUgaW5zdGFuY2UgaXQKLSAqIHdpbGwgY2hlY2sgaXRzIHBhcmVudCBmb3IgYSBzZXR0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9ucyBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qCi0gICAgICogc2V0dXAgZm9yIGxvZ2dpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coT3B0aW9ucy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVR19FTkFCTEVEID0gbG9nLmlzVHJhY2VFbmFibGVkKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVR19QUk9QRVJUWV9TRVQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBteUNsYXNzTmFtZSA9ICJPcHRpb25zIjsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUaGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHRyYWNrcyB0aGUgdmVyc2lvbiBvZiB0aGUgY2xhc3MuCi0gICAgICogSWYgYSBjbGFzcyBkZWZpbml0aW9uIGNoYW5nZXMsIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLiBJZiBhIGNoYW5nZSB0byB0aGUgY2xhc3MgaXMgbWFkZSB3aGljaCBpcwotICAgICAqIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uIG9mIHRoZSBjbGFzcywKLSAgICAgKiB0aGVuIHRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlICJzZXJpYWxWZXIiIHV0aWxpdHkgdG8gY29tcHV0ZSBhIHNlcmlhbGl6YXRpb24KLSAgICAgKiB2ZXJzaW9uIElELgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MzE4NzUxODkwODQ1MTgxNTA3TDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVHJhY2tzIHRoZSByZXZpc2lvbiBsZXZlbCBvZiBhIGNsYXNzIHRvIGlkZW50aWZ5IGNoYW5nZXMgdG8gdGhlCi0gICAgICogY2xhc3MgZGVmaW5pdGlvbiB0aGF0IGFyZSBjb21wYXRpYmxlIHRvIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgd3JpdGVFeHRlcm5hbCgpIGFuZCByZWFkRXh0ZXJuYWwoKSBtZXRob2RzLgotICAgICAqLwotICAgIC8vIHN1cHBvcnRlZCByZXZpc2lvbiBsZXZlbHMsIGFkZCBhIG5ldyBsZXZlbCB0byBtYW5hZ2UgY29tcGF0aWJsZSBjaGFuZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOwotICAgIC8vIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBvYmplY3QKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmV2aXNpb25JRCA9IFJFVklTSU9OXzI7Ci0KLSAgICAvL0kgYW0gZ29pbmcgdG8gc2V0IGEgcmVwbHkgdG8gYXMgY3VzdG9tZXIgcmVwbHkgVG8gYWRkcmVzcyAsCi0gICAgLy8gc28gdGhhdCBBeGlzMiBkb2VzIG5vdCBuZWVkIHRvIHdhaXQgZm9yIHRoZSByZXBseQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICBDVVNUT01fUkVQTFlUT19BRERSRVNTID0gIkNVU1RPTV9SRVBMWVRPX0FERFJFU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICBDVVNUT01fUkVQTFlUT19BRERSRVNTX1RSVUUgPSAidHJ1ZSI7Ci0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgYmxvY2tpbmcgdGltZW91dCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVPVVRfTUlMTElTRUNPTkRTID0gMzAgKiAxMDAwOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIHBhcmVudAotICAgICAqLwotICAgIHByaXZhdGUgT3B0aW9ucyBwYXJlbnQ7Ci0KLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgcHJvcGVydGllcwotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgc2V0IHZpYSBPcHRpb25zCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHByaXZhdGUgU3RyaW5nIHNvYXBWZXJzaW9uVVJJOyAvLyBkZWZhdWx0cyB0bwotICAgIC8vIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0KLSAgICBwcml2YXRlIEJvb2xlYW4gaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQ7IC8vIGRlZmF1bHRzIHRvIHRydWU7Ci0KLSAgICBwcml2YXRlIGxvbmcgdGltZU91dEluTWlsbGlTZWNvbmRzID0gLTE7IC8vID0KLSAgICAvLyBERUZBVUxUX1RJTUVPVVRfTUlMTElTRUNPTkRTOwotCi0gICAgcHJpdmF0ZSBCb29sZWFuIHVzZVNlcGFyYXRlTGlzdGVuZXI7IC8vIGRlZmF1bHRzIHRvIGZhbHNlCi0KLSAgICAvLyBBZGRyZXNzaW5nIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICBwcml2YXRlIFN0cmluZyBhY3Rpb247Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG87Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIGZyb207Ci0KLSAgICBwcml2YXRlIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNwb3J0SW5Qcm90b2NvbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VJZDsKLQotICAgIC8vIEFycmF5IG9mIFJlbGF0ZXNUbyBvYmplY3RzCi0gICAgcHJpdmF0ZSBMaXN0PFJlbGF0ZXNUbz4gcmVsYXRpb25zaGlwczsKLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbzsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9NRWxlbWVudD4gcmVmZXJlbmNlUGFyYW1ldGVyczsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZCBmb3Igc2VuZGluZyBhbmQgcmVjZWl2aW5nIG1lc3NhZ2VzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQ7Ci0KLSAgICBwcml2YXRlIEVuZHBvaW50UmVmZXJlbmNlIHRvOwotCi0gICAgLy9UbyBjb250cm9sICwgc2Vzc2lvbiBtYW5hZ2VtZW50ICwgZGVmYXVsdCBpcyBzZXQgdG8gdHJ1ZSAsIGlmIHVzZXIgd2FudHMgaGUgY2FuIHNldCB0aGF0IHRvIHRydWUKLSAgICAvLyBUaGUgb3BlcmF0aW9uIGNsaWVudCB3aWxsIG1hbmFnZSBzZXNzaW9uIHVzaW5nIFNlcnZpY2VHcm91cElEIGlmIGl0IGlzIHRoZXJlIGluIHRoZSByZXNwb25zZQotICAgIHByaXZhdGUgYm9vbGVhbiBtYW5hZ2VTZXNzaW9uID0gZmFsc2U7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSBhZnRlciByZWFkRXh0ZXJuYWwKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgb2JqZWN0IGhhcyBiZWVuIHJlY29uc3RpdHV0ZWQKLSAgICAgKiBhbmQgbmVlZHMgdG8gaGF2ZSBpdHMgb2JqZWN0IHJlZmVyZW5jZXMgcmVjb25jaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbmVlZHNUb0JlUmVjb25jaWxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIG1ldGFkYXRhIHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBtYXRjaCB1cCB3aXRoIGFuIGV4aXN0aW5nIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGFEYXRhRW50cnkgbWV0YVRyYW5zcG9ydE91dCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgZHVyaW5nCi0gICAgICogYWN0aXZhdGUgdG8gbWF0Y2ggdXAgd2l0aCBhbiBleGlzdGluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhRGF0YUVudHJ5IG1ldGFUcmFuc3BvcnRJbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgVHJhbnNwb3J0TGlzdGVuZXIgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0LCBpZiBwb3NzaWJsZQotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGFEYXRhRW50cnkgbWV0YUxpc3RlbmVyID0gbnVsbDsKLQotICAgIC8vVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRvIGNhbGwgdGhlIGF1dG8gdHJhbnNwb3J0IGNsZWFuIHVwCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBjYWxsVHJhbnNwb3J0Q2xlYW51cCA7Ci0KLQotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyB1c2VyTmFtZTsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgcGFzc3dvcmQ7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBlbmQgTWV0YURhdGEgc2VjdGlvbgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIE9wdGlvbnMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW4gbm9ybWFsIG1vZGUgb3BlcmF0aW9uLCB0aGlzIG9wdGlvbnMgd2lsbCB0cnkgdG8gZnVsZmlsIHRoZSByZXF1ZXN0Ci0gICAgICogZnJvbSBpdHMgdmFsdWVzLiBJZiB0aGF0IGlzIG5vdCBwb3NzaWJsZSwgdGhpcyBvcHRpb25zIHdpbGwgcmVxdWVzdCB0aG9zZQotICAgICAqIGluZm9ybWF0aW9uIGZyb20gaXRzIHBhcmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3B0aW9ucyhPcHRpb25zIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgV1MtQWRkcmVzc2luZyBBY3Rpb24gLyBTT0FQIEFjdGlvbiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uKCkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0QWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgV1MtQWRkcmVzc2luZyBGYXVsdFRvIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RmF1bHRUbygpIHsKLSAgICAgICAgaWYgKGZhdWx0VG8gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRGYXVsdFRvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhdWx0VG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFdTLUFkZHJlc3NpbmcgRnJvbSBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGVuZHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEZyb20oKSB7Ci0gICAgICAgIGlmIChmcm9tID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0RnJvbSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmcm9tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsaXN0ZW5lciB1c2VkIGZvciBpbmNvbWluZyBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBsaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyBUcmFuc3BvcnRMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLSAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldExpc3RlbmVyIik7Ci0gICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldExpc3RlbmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0cmFuc3BvcnQgdXNlZCBmb3IgaW5jb21pbmcgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJhbnNwb3J0IGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gZ2V0VHJhbnNwb3J0SW4oKSB7Ci0gICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRUcmFuc3BvcnRJbiIpOwotICAgICAgICBpZiAodHJhbnNwb3J0SW4gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRUcmFuc3BvcnRJbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRJbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdHJhbnNwb3J0IHByb3RvY29sIHVzZWQgZm9yIGluY29taW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5hbWUgcHJvdG9jb2wgbmFtZSAoImh0dHAiLCAidGNwIiwgZXRjLikKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zcG9ydEluUHJvdG9jb2woKSB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRJblByb3RvY29sID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VHJhbnNwb3J0SW5Qcm90b2NvbCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRJblByb3RvY29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBXUy1BZGRyZXNzaW5nIE1lc3NhZ2VJZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdXJpIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKCkgewotICAgICAgICBpZiAobWVzc2FnZUlkID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGNvcHkgb2YgdGhlIGdlbmVyYWwgb3B0aW9uIHByb3BlcnRpZXMuIEJlY2F1c2Ugb2YgdGhlIHdheSBvcHRpb25zCi0gICAgICogYXJlIHN0b3JlZCB0aGlzIGRvZXMgbm90IGluY2x1ZGUgcHJvcGVydGllcyB3aXRoIHNwZWNpZmljIGdldC9zZXQKLSAgICAgKiBtZXRob2RzLCBvbmx5IHRoZSBnZW5lcmFsIHByb3BlcnRpZXMgaWRlbnRpZmllZCBieSBhIHRleHQgc3RyaW5nLiBUaGUKLSAgICAgKiByZXR1cm5lZCBtYXAgbWVyZ2VzIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb20gcGFyZW50IG9wdGlvbnMsIGlmIGFueSwgdG8KLSAgICAgKiBnaXZlIGEgY29tcGxldGUgc2V0IG9mIHByb3BlcnR5IGRlZmluaXRpb25zIGFzIHNlZW4gYnkgdXNlcnMgb2YgdGhpcwotICAgICAqIG9wdGlvbnMgaW5zdGFuY2UuIFRoZSByZXR1cm5lZCBjb3B5IGlzIG5vdCAibGl2ZSIsIHNvIGNoYW5nZXMgeW91IG1ha2UgdG8KLSAgICAgKiB0aGUgY29weSBhcmUgbm90IHJlZmxlY3RlZCBpbiB0aGUgYWN0dWFsIG9wdGlvbiBzZXR0aW5ncy4gSG93ZXZlciwgeW91Ci0gICAgICogY2FuIG1ha2UgdGhlIG1vZGlmaWVkIHZhbHVlcyB0YWtlIGVmZmVjdCB3aXRoIGEgY2FsbCB0byB7QGxpbmsKLSAgICAgKiAjc2V0UHJvcGVydGllcyhNYXApfSwKLSAgICAgKgotICAgICAqIEByZXR1cm4gY29weSBvZiBnZW5lcmFsIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgT3B0aW9ucyBwcm9wZXJ0aWVzIGV4aXN0cwotICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHByb3BlcnRpZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IHBhcmVudC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBwcm9wcy5wdXRBbGwocHJvcGVydGllcyk7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgbmFtZWQgcHJvcGVydHkgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgcmVsYXRlZCB0byB0aGlzIGtleS4gPGNvZGU+bnVsbDwvY29kZT4sIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgT2JqZWN0IG15UHJvcFZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBteVByb3BWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG15UHJvcFZhbHVlID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbXlQcm9wVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IFdTLUFkZHJlc3NpbmcgUmVsYXRlc1RvIGl0ZW0gd2l0aCBhIHNwZWNpZmllZCB0eXBlLiBJZiB0aGVyZSBhcmUKLSAgICAgKiBtdWx0aXBsZSBSZWxhdGVzVG8gaXRlbXMgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHR5cGUsIHRoZSBvbmUgcmV0dXJuZWQKLSAgICAgKiBieSB0aGlzIG1ldGhvZCBpcyBhcmJpdHJhcnkgLSBpZiB5b3UgbmVlZCB0byBoYW5kbGUgdGhpcyBjYXNlLCB5b3UgY2FuCi0gICAgICogaW5zdGVhZCB1c2UgdGhlIHtAbGluayAjZ2V0UmVsYXRpb25zaGlwcygpfSB0byByZXRyaWV2ZSBhbGwgdGhlIGl0ZW1zCi0gICAgICogYW5kIGNoZWNrIGZvciBtdWx0aXBsZSBtYXRjaGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgcmVsYXRpb25zaGlwIHR5cGUgKFVSSSkKLSAgICAgKiBAcmV0dXJuIGl0ZW0gb2Ygc3BlY2lmaWVkIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRlc1RvIGdldFJlbGF0ZXNUbyhTdHJpbmcgdHlwZSkgewotICAgICAgICBpZiAocmVsYXRpb25zaGlwcyA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldFJlbGF0ZXNUbyh0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVsYXRpb25zaGlwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IHJlbGF0aW9uc2hpcHMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBSZWxhdGVzVG8gcmVsYXRlc1RvID0gKFJlbGF0ZXNUbykgcmVsYXRpb25zaGlwcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0ZXNUby5nZXRSZWxhdGlvbnNoaXBUeXBlKCk7Ci0gICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRlc1RvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIHNpbmdsZSBpbnN0YW5jZSBvZiBXUy1BZGRyZXNzaW5nIFJlbGF0ZXNUbyB0aGF0IGhhcyBhIHJlbGF0aW9uc2hpcAotICAgICAqIHR5cGUgb2YgZWl0aGVyICJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmcvcmVwbHkiIG9yICJ3c2E6UmVwbHkiLgotICAgICAqIElmIG5vIHN1Y2ggaW5zdGFuY2Ugb2YgUmVsYXRlc1RvIGNhbiBiZSBmb3VuZCB0aGVuIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlbGF0ZXNUb30KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRlc1RvIGdldFJlbGF0ZXNUbygpIHsKLSAgICAgICAgaWYgKHJlbGF0aW9uc2hpcHMgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRSZWxhdGVzVG8oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVsYXRpb25zaGlwcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IHJlbGF0aW9uc2hpcHMuc2l6ZSgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBSZWxhdGVzVG8gcmVsYXRlc1RvID0gKFJlbGF0ZXNUbykgcmVsYXRpb25zaGlwcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0ZXNUby5nZXRSZWxhdGlvbnNoaXBUeXBlKCk7Ci0gICAgICAgICAgICBpZiAocmVsYXRpb25zaGlwVHlwZS5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgcmVsYXRpb25zaGlwVHlwZQotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfREVGQVVMVF9SRUxBVElPTlNISVBfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRlc1RvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgV1MtQWRkcmVzc2luZyBSZWxhdGVzVG8gaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFycmF5IG9mIGl0ZW1zCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0ZXNUb1tdIGdldFJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIGlmIChyZWxhdGlvbnNoaXBzID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UmVsYXRpb25zaGlwcygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWxhdGlvbnNoaXBzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoUmVsYXRlc1RvW10pIHJlbGF0aW9uc2hpcHMudG9BcnJheShuZXcgUmVsYXRlc1RvW3JlbGF0aW9uc2hpcHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFdTLUFkZHJlc3NpbmcgUmVsYXRlc1RvIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBzKFJlbGF0ZXNUb1tdIGxpc3QpIHsKLSAgICAgICAgaWYobGlzdCA9PSBudWxsKXsKLSAgICAgICAgcmVsYXRpb25zaGlwcyA9IG51bGw7Ci0gICAgfQotICAgICAgICBlbHNlewotICAgICAgICAgICAgQXJyYXlMaXN0PFJlbGF0ZXNUbz4gYXJyYXlsaXN0ID0gbmV3IEFycmF5TGlzdDxSZWxhdGVzVG8+KGxpc3QubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDAgOyBpIDwgbGlzdC5sZW5ndGggOyBpKyspewotICAgICAgICAgICAgICAgICAgIGFycmF5bGlzdC5hZGQobGlzdFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWxhdGlvbnNoaXBzID0gYXJyYXlsaXN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IFdTLUFkZHJlc3NpbmcgUmVwbHlUbyBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGVuZHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldFJlcGx5VG8oKSB7Ci0gICAgICAgIGlmIChyZXBseVRvID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UmVwbHlUbygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBseVRvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBvdXRib3VuZCB0cmFuc3BvcnQgZGVzY3JpcHRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGdldFRyYW5zcG9ydE91dCgpIHsKLSAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldFRyYW5zcG9ydE91dCIpOwotICAgICAgICBpZiAodHJhbnNwb3J0T3V0ID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJhbnNwb3J0T3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBTT0FQIHZlcnNpb24gYmVpbmcgdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29hcFZlcnNpb25VUkkoKSB7Ci0gICAgICAgIGlmIChzb2FwVmVyc2lvblVSSSA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldFNvYXBWZXJzaW9uVVJJKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcFZlcnNpb25VUkkgPT0gbnVsbCA/IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkKLSAgICAgICAgICAgICAgICA6IHNvYXBWZXJzaW9uVVJJOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHdhaXQgdGltZSBhZnRlciB3aGljaCBhIGNsaWVudCB0aW1lcyBvdXQgaW4gYSBibG9ja2luZyBzY2VuYXJpby4KLSAgICAgKiBUaGUgZGVmYXVsdCBpcyBPcHRpb25zI0RFRkFVTFRfVElNRU9VVF9NSUxMSVNFQ09ORFMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGltZU91dEluTWlsbGlTZWNvbmRzCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0VGltZU91dEluTWlsbGlTZWNvbmRzKCkgewotICAgICAgICBpZiAodGltZU91dEluTWlsbGlTZWNvbmRzID09IC0xICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldFRpbWVPdXRJbk1pbGxpU2Vjb25kcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRpbWVPdXRJbk1pbGxpU2Vjb25kcyA9PSAtMSA/IERFRkFVTFRfVElNRU9VVF9NSUxMSVNFQ09ORFMKLSAgICAgICAgICAgICAgICA6IHRpbWVPdXRJbk1pbGxpU2Vjb25kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgV1MtQWRkcmVzc2luZyBUbyBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGVuZHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldFRvKCkgewotICAgICAgICBpZiAodG8gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRUbygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZXJlIGlzIGEgU09BUCBGYXVsdCBpbiB0aGUgYm9keSBvZiB0aGUgaW5jb21pbmcgU09BUCBNZXNzYWdlLCBzeXN0ZW0KLSAgICAgKiBjYW4gYmUgY29uZmlndXJlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZGV0YWlscyBleHRyYWN0ZWQgZnJvbQotICAgICAqIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGlzIGJvb2xlYW4gdmFyaWFibGUgd2lsbCBlbmFibGUKLSAgICAgKiB0aGF0IGZhY2lsaXR5LiBJZiB0aGlzIGlzIGZhbHNlLCB0aGUgcmVzcG9uc2UgbWVzc2FnZSB3aWxsIGp1c3QgYmUKLSAgICAgKiByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24sIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIGl0IGhhcyBhIEZhdWx0IG9yCi0gICAgICogbm90LgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBleGNlcHRpb24gdG8gYmUgdGhyb3duCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoKSB7Ci0gICAgICAgIGlmIChpc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCA9IHBhcmVudC5pc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciB0aGUgdHdvIFNPQVAgTWVzc2FnZXMgYXJlIGJlIHNlbnQgb3ZlciBzYW1lIGNoYW5uZWwgb3Igb3ZlcgotICAgICAqIHNlcGFyYXRlIGNoYW5uZWxzLiBPbmx5IGR1cGxleCB0cmFuc3BvcnRzIHN1Y2ggYXMgaHR0cCBhbmQgdGNwIHN1cHBvcnQgYQotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VwYXJhdGUgY2hhbm5lbCBmbGFnCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkgewotICAgICAgICBpZiAodXNlU2VwYXJhdGVMaXN0ZW5lciA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VTZXBhcmF0ZUxpc3RlbmVyID0gbmV3IEJvb2xlYW4ocGFyZW50LmlzVXNlU2VwYXJhdGVMaXN0ZW5lcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1c2VTZXBhcmF0ZUxpc3RlbmVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiB1c2VTZXBhcmF0ZUxpc3RlbmVyLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBwYXJlbnQgaW5zdGFuY2UgcHJvdmlkaW5nIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgotICAgICAqCi0gICAgICogQHJldHVybiBwYXJlbnQgKDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUpCi0gICAgICovCi0gICAgcHVibGljIE9wdGlvbnMgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBwYXJlbnQgaW5zdGFuY2UgcHJvdmlkaW5nIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmVudCAoPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT3B0aW9ucyBwYXJlbnQpIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gcGFyZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHBhcmVudCBPcHRpb25zOiB0aGV5IGNhbm5vdCBiZSB0aGUgc2FtZSBvYmplY3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBXUy1BZGRyZXNzaW5nIEFjdGlvbiAvIFNPQVAgQWN0aW9uIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGVyZSBpcyBhIFNPQVAgRmF1bHQgaW4gdGhlIGJvZHkgb2YgdGhlIGluY29taW5nIFNPQVAgTWVzc2FnZSwgc3lzdGVtCi0gICAgICogY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGRldGFpbHMgZXh0cmFjdGVkIGZyb20KLSAgICAgKiB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmF1bHQgbWVzc2FnZS4gVGhpcyBib29sZWFuIHZhcmlhYmxlIHdpbGwgZW5hYmxlCi0gICAgICogdGhhdCBmYWNpbGl0eS4gSWYgdGhpcyBpcyBmYWxzZSwgdGhlIHJlc3BvbnNlIG1lc3NhZ2Ugd2lsbCBqdXN0IGJlCi0gICAgICogcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uLCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBpdCBoYXMgYSBGYXVsdCBvcgotICAgICAqIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoCi0gICAgICAgICAgICBib29sZWFuIGV4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCkgewotICAgICAgICBpc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCA9IEJvb2xlYW4KLSAgICAgICAgICAgICAgICAudmFsdWVPZihleGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBXUy1BZGRyZXNzaW5nIEZhdWx0VG8gZW5kcG9pbnQgcmVmZXJlbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0VG8gZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdFRvKEVuZHBvaW50UmVmZXJlbmNlIGZhdWx0VG8pIHsKLSAgICAgICAgdGhpcy5mYXVsdFRvID0gZmF1bHRUbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgV1MtQWRkcmVzc2luZyBGcm9tIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcm9tIGVuZHBvaW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbShFbmRwb2ludFJlZmVyZW5jZSBmcm9tKSB7Ci0gICAgICAgIHRoaXMuZnJvbSA9IGZyb207Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGxpc3RlbmVyIHVzZWQgZm9yIGluY29taW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihUcmFuc3BvcnRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRyYW5zcG9ydCB1c2VkIGZvciBpbmNvbWluZyBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRyYW5zcG9ydEluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0SW4oVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbikgewotICAgICAgICB0aGlzLnRyYW5zcG9ydEluID0gdHJhbnNwb3J0SW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRyYW5zcG9ydCBwcm90b2NvbCB1c2VkIGZvciBpbmNvbWluZyBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRyYW5zcG9ydEluUHJvdG9jb2wgKCJodHRwIiwgInRjcCIsIGV0Yy4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChTdHJpbmcgdHJhbnNwb3J0SW5Qcm90b2NvbCkgewotICAgICAgICB0aGlzLnRyYW5zcG9ydEluUHJvdG9jb2wgPSB0cmFuc3BvcnRJblByb3RvY29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBXUy1BZGRyZXNzaW5nIE1lc3NhZ2VJZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgVVJJIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VJZChTdHJpbmcgbWVzc2FnZUlkKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUlkID0gbWVzc2FnZUlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZ2VuZXJhbCBwcm9wZXJ0eSBkZWZpbml0aW9ucy4gRHVlIHRvIHRoZSB3YXkgcHJvcGVydGllcyBhcmUKLSAgICAgKiBzdG9yZWQsIHRoaXMgd2lsbCBub3QgZWZmZWN0IHRoZSB2YWx1ZXMgb2YgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzIHdpdGgKLSAgICAgKiBzcGVjaWZpYyBnZXQvc2V0IG1ldGhvZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzICE9IHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBFbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlYnVnUHJvcGVydHlTZXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhbCBwcm9wZXJ0aWVzIHlvdSBuZWVkIHRvIHBhc3MgaW4gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBtdXN0IGJlIHNldAotICAgICAqIHZpYSB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgdXNlZCBmb3IgcHJvcGVydGllcyB3aGljaCBkbyBub3QKLSAgICAgKiBoYXZlIHNwZWNpZmljIGdldC9zZXQgbWV0aG9kcy4KLSAgICAgKiA8cC8+Ci0gICAgICogSGVyZSBhcmUgc29tZSBvZiB0aGUgcHJvcGVydGllcyBzdXBwb3J0ZWQgaW4gQXhpczIuCi0gICAgICogPHAvPgotICAgICAqIDxhIG5hbWU9IkdlbkNvbnN0Ij48L2E+PC9wPgotICAgICAqIDxoMz5HZW5lcmljIENvbnN0YW50czwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxhIG5hbWU9IlRSQU5TUE9SVF9VUkwiPjwvYT48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxsaT48c3Ryb25nPm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uVFJBTlNQT1JUX1VSTDwvc3Ryb25nPgotICAgICAqIDxwPlNvbWV0aW1lcyB5b3Ugd2FudCB0byBzZW5kIHlvdXIgU09BUCBtZXNzYWdlIHRocm91Z2ggYSBub2RlLCBiZWZvcmUgaXQgcmVhY2hlcyB0byBpdHMgZGVzdGluYXRpb24uIFRoaXMgbWVhbnMgeW91IHdhbnQgdG8gZ2l2ZSB0cmFuc3BvcnQgVVJMIGRpZmZlcmVudCBmcm9tIHRoZSBVUkwgb2YgdGhlIHVsdGltYXRlIGRlc3RpbmF0aW9uLiBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSB3YW50aW5nIHRvIHNlbmQgdGhpcyBTT0FQIChvciBSRVNUKW1lc3NhZ2UgdGhyb3VnaCBhIHRyYW5zcGFyZW50IHByb3h5IG9yIHRocm91Z2ggYSBtZXNzYWdlIG1vbml0b3JpbmcgYXBwbGV0LiBIb3cgY2FuIHRoYXQgYmUgZG9uZSB1c2luZyB0aGUgU2VydmljZUNsaWVudCBBUEk/PC9wPgotICAgICAqIDxwcmU+Ci0gICAgICogb3B0aW9ucy5zZXRUbygiaHR0cDovL2Rlc3RpbmF0aW9uLm9yZyIpOwotICAgICAqIG9wdGlvbnMuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHRDb25zdGFudHMuVFJBTlNQT1JUX1VSTCwgImh0dHA6Ly9teVByb3h5Lm9yZyIpOwotICAgICAqIDwvcHJlPjxwPlRoaXMgd2lsbCBzZW5kIHlvdXIgU09BUCBtZXNzYWdlIHRvICJodHRwOi8vbXlQcm94eS5vcmciLCBidXQgaWYgV1MtQWRkcmVzc2luZyBpcyBlbmFibGVkLCB3c2E6VG8gd2lsbCBjb250YWluICJodHRwOi8vZGVzdGluYXRpb24ub3JnIiBhcyBUbyBhZGRyZXNzLjwvcD4KLSAgICAgKiA8L2xpPgotICAgICAqIDxwPiAgPGEgbmFtZT0iQ0hBUkFDVEVSX1NFVF9FTkNPRElORyI+PC9hPjwvcD4KLSAgICAgKiA8bGk+PGI+b3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HPC9iPgotICAgICAqIDxwPlRoaXMgd2lsbCBlbmFibGUgdXNlciB0byBzZXQgdGhlIGNoYXJhY3RlciBzZXQgZW5jb2Rpbmcgc2NoZW1lIHRvIGJlIHVzZWQgd2hlbiBzZW5kaW5nIHRoZSBtZXNzYWdlLiBEZWZhdWx0IGlzIHNldCB0byAiVVRGLTgiPC9wPjwvbGk+Ci0gICAgICogPHAvPgotICAgICAqIDxwPjxhIG5hbWU9IkVOQUJMRV9NVE9NIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NPC9iPgotICAgICAqIDxwPlRoaXMgd2lsbCBlbmFibGUvZGlzYWJsZSBNVE9NIHN1cHBvcnQgZm9yIG91dGdvaW5nIG1lc3NhZ2VzLjwvcD4KLSAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlOiA8L3A+Ci0gICAgICogPHByZT4idHJ1ZSIvImZhbHNlIiBvciBCb29sZWFuLlRSVUUvQm9vbGVhbi5GQUxTRTwvcHJlPgotICAgICAqIDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiA8cD48YSBuYW1lPSJBZGRyZXNzaW5nIj48L2E+PC9wPgotICAgICAqIDxoMz5XUy1BZGRyZXNzaW5nIE1vZHVsZSBTcGVjaWZpYyBDb25zdGFudHM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8cC8+Ci0gICAgICogPGEgbmFtZT0iV1NfQUREUkVTU0lOR19WRVJTSU9OIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT048L2I+Ci0gICAgICogPHA+VGhpcyB3aWxsIGVuYWJsZSB0byBzZWxlY3Qgb25lIG9mIHRoZSB0d28gV1MtQWRkcmVzc2luZyB2ZXJzaW9ucyBhdmFpbGFibGUsIGlmIFdTLUFkZHJlc3NpbmcgaXMgZW5nYWdlZC48L3A+Ci0gICAgICogPHA+UG9zc2libGUgdmFsdWVzIGFyZTo8L3A+Ci0gICAgICogPHByZT4KLSAgICAgKiBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFCi0gICAgICogYW5kCi0gICAgICogb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFPC9wcmU+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD4gIDxhIG5hbWU9IlJFUExBQ0VfQUREUkVTU0lOR19IRUFERVJTIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50cy5SRVBMQUNFX0FERFJFU1NJTkdfSEVBREVSUzwvYj4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+QWRkcmVzc2luZ091dEhhbmRsZXIgcGlja3MgdXAgdGhlIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWVzc2FnZSBjb250ZXh0IGFuZCBzZXQgdGhlbSB0byB0aGUgb3V0Z29pbmcgbWVzc2FnZS4gQnV0IHNvbWVvbmUgbWF5IGhhdmUgYWxyZWFkeSBwdXQgc29tZSBhZGRyZXNzaW5nIGhlYWRlcnMsIGJlZm9yZSB0aGUgQWRkcmVzc2luZ091dEhhbmRsZXIuIFRoaXMgZmxhZyB3aWxsIG5vdGlmeSB0aGUgaGFuZGxlciB3aGV0aGVyIHRvIG92ZXJyaWRlIHRoZW0gb3Igbm90LjwvcD4KLSAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlOiA8L3A+Ci0gICAgICogPHByZT4idHJ1ZSIvImZhbHNlIiBvciBCb29sZWFuLlRSVUUvQm9vbGVhbi5GQUxTRTwvcHJlPgotICAgICAqIDwvbGk+Ci0gICAgICogPHA+ICA8YSBuYW1lPSJESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUyI+PC9hPjwvcD4KLSAgICAgKiA8bGk+PGI+b3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuPGJyIC8+Ci0gICAgICogRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVM8L2I+Ci0gICAgICogPHA+SWYgV1MtQWRkcmVzc2luZyBpcyBlbmdhZ2VkIGdsb2JhbGx5IG9yIHNvbWUgaG93IGluIGVmZmVjdCBmb3IgdGhpcyBwYXJ0aWN1bGFyIGludm9jYXRpb24sIHRoaXMgd2lsbCBkaXNhYmxlIEF4aXMyIGZyb20gcHV0dGluZyBXUy1BZGRyZXNzaW5nIGhlYWRlcnMgaW4gdG8gdGhlIG91dCBnb2luZyBTT0FQIG1lc3NhZ2UuIChOb3RlIHRoYXQgQXhpczIgd2lsbCBub3QgcHV0IGFkZHJlc3NpbmcgaGVhZGVycyB0byB0aGUgb3V0Z29pbmcgbWVzc2FnZSwgaXJyZXNwZWN0aXZlIG9mIHRoZSBhYm92ZSBmbGFnLCBpZiB0aGUgaW5jb21pbmcgbWVzc2FnZSBkaWQgbm90IGNvbnRhaW4gYWRkcmVzc2luZyBoZWFkZXJzKS48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxwPlBvc3NpYmxlIHZhbHVlcyBhcmU6PC9wPgotICAgICAqIDxwcmU+InRydWUiLyJmYWxzZSIgb3IgQm9vbGVhbi5UUlVFL0Jvb2xlYW4uRkFMU0U8L3ByZT4KLSAgICAgKiA8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPHA+PGEgbmFtZT0iSFRUUENvbnN0YW50cyI+PC9hPjwvcD4KLSAgICAgKiA8aDM+SFRUUCBDb25zdGFudHM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8YSBuYW1lPSJDSFVOS0VEIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuQ0hVTktFRDwvYj4KLSAgICAgKiA8cD5UaGlzIHdpbGwgZW5hYmxlL2Rpc2FibGUgY2h1bmtpbmcgc3VwcG9ydC4gPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlOjwvcD4KLSAgICAgKiA8cHJlPiJ0cnVlIi8iZmFsc2UiIG9yIEJvb2xlYW4uVFJVRS9Cb29sZWFuLkZBTFNFPC9wcmU+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJOVExNIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTlRMTV9BVVRIRU5USUNBVElPTjwvYj4KLSAgICAgKiA8cD5UaGlzIGVuYWJsZXMgdGhlIHVzZXIgdG8gcGFzcyBpbiBOVExNIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLCBzdWNoIGFzIGhvc3QsIHBvcnQsIHJlYWxtLCB1c2VybmFtZSwgcGFzc3dvcmQgdG8gYmUgdXNlZCB3aXRoIEhUVFAgdHJhbnNwb3J0IHNlbmRlci4gPC9wPgotICAgICAqIDxwPlRoZSB2YWx1ZSBzaG91bGQgYWx3YXlzIGJlIGFuIGluc3RhbmNlIG9mOiAgPC9wPgotICAgICAqIDxwcmU+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IdHRwVHJhbnNwb3J0UHJvcGVydGllcy4KLSAgICAgKiBOVExNQXV0aGVudGljYXRpb248L3ByZT4KLSAgICAgKiA8L2xpPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD48YSBuYW1lPSJQUk9YWSI+PC9hPjwvcD4KLSAgICAgKiA8bGk+PGI+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLlBST1hZPC9iPgotICAgICAqIDxwPlRoaXMgZW5hYmxlcyB0aGUgdXNlciB0byBwYXNzIGluIHByb3h5IGluZm9ybWF0aW9uLCBzdWNoIGFzIHByb3h5IGhvc3QgbmFtZSwgcG9ydCwgZG9tYWluLCB1c2VybmFtZSwgcGFzc3dvcmQgdG8gYmUgdXNlZCB3aXRoIEhUVFAgdHJhbnNwb3J0IHNlbmRlci4gPC9wPgotICAgICAqIDxwPlRoZSB2YWx1ZSBzaG91bGQgYWx3YXlzIGJlIGFuIGluc3RhbmNlIG9mOjwvcD4KLSAgICAgKiA8cHJlPm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuUHJveHlQcm9wZXJ0aWVzPC9wcmU+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD5UaGUgdmFsdWUgc2hvdWxkIGFsd2F5cyBiZSBhbiBpbnN0YW5jZSBvZjogPC9wPgotICAgICAqIDxwcmU+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IdHRwVHJhbnNwb3J0UHJvcGVydGllcy5CYXNpY0F1dGhlbnRpY2F0aW9uPC9wcmU+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJTT19USU1FT1VUIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuU09fVElNRU9VVDwvYj4KLSAgICAgKiA8cD5UaGlzIGVuYWJsZXMgdGhlIHVzZXIgdG8gcGFzcyBpbiBzb2NrZXQgdGltZW91dCB2YWx1ZSBhcyBhbiBJbnRlZ2VyLiBJZiBub3RoaW5nIGlzIHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgNjAwMDAgbWlsbGlzZWNvbmRzLjwvcD4KLSAgICAgKiA8L2xpPgotICAgICAqIDxwPjxhIG5hbWU9IkNPTl9USU1FT1VUIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VUPC9iPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD5UaGlzIGVuYWJsZXMgdGhlIHVzZXIgdG8gcGFzcyBpbiBjb25uZWN0aW9uIHRpbWVvdXQgdmFsdWUgYXMgYW4gSW50ZWdlci4gSWYgbm90aGluZyBpcyBzZXQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDYwMDAwIG1pbGxpc2Vjb25kcy48L3A+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJVU0VSX0FHRU5UIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuVVNFUl9BR0VOVDwvYj4KLSAgICAgKiA8cD5UaGlzIGVuYWJsZXMgdGhlIHVzZXIgdG8gc2V0IHRoZSB1c2VyIGFnZW50IGhlYWRlciBpbiB0aGUgb3V0Z29pbmcgSFRUUCByZXF1ZXN0LiBEZWZhdWx0IHZhbHVlIGlzICJBeGlzMiI8L3A+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJHWklQIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUNfR1pJUF9SRVFVRVNUPC9iPgotICAgICAqIDxwPklmIHNldCB0aGlzIHdpbGwgR1ppcCB5b3VyIHJlcXVlc3QgYW5kIHNlbmQgb3ZlciB0byB0aGUgZGVzdGluYXRpb24uIEJlZm9yZSBkb2luZyB0aGlzLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgcmVjZWl2aW5nIGVuZCBzdXBwb3J0cyBHWmlwIGNvbXByZXNzZWQgc3RyZWFtcy4gPGJyPjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+UG9zc2libGUgdmFsdWVzIGFyZTogPC9wPgotICAgICAqIDxwcmU+InRydWUiLyJmYWxzZSIgb3IgQm9vbGVhbi5UUlVFL0Jvb2xlYW4uRkFMU0U8L3ByZT4KLSAgICAgKiA8L2xpPgotICAgICAqIDxwPjxhIG5hbWU9IkFDQ0VQVF9HWklQIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUNfQUNDRVBUX0daSVA8L2I+Ci0gICAgICogPHA+V2hldGhlciBvciBub3QgeW91IHNlbmQgYSBnemlwLXBlZCByZXF1ZXN0LCB5b3UgY2FuIGNob29zZSB0byByZWNlaXZlIEdaSVAgYmFjayBmcm9tIHRoZSBzZXJ2ZXIgdXNpbmcgdGhpcyBmbGFnLjwvcD4KLSAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlOiA8L3A+Ci0gICAgICogPHByZT4idHJ1ZSIvImZhbHNlIiBvciBCb29sZWFuLlRSVUUvQm9vbGVhbi5GQUxTRTwvcHJlPgotICAgICAqIDwvbGk+Ci0gICAgICogPHAvPgotICAgICAqIDxwPjxhIG5hbWU9IkNPT0tJRSI+PC9hPjwvcD4KLSAgICAgKiA8bGk+PGI+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkc8L2I+Ci0gICAgICogPHA+VGhpcyBlbmFibGVzIHRoZSB1c2VyIHRvIHNldCB0aGUgY29va2llIHN0cmluZyBoZWFkZXIgaW4gdGhlIG91dGdvaW5nIEhUVFAgcmVxdWVzdC48L3A+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJIVFRQX1BST1RPQ09MX1ZFUlNJT04iPjwvYT48L3A+Ci0gICAgICogPGxpPjxiPm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5IVFRQX1BST1RPQ09MX1ZFUlNJT048L2I+Ci0gICAgICogPHA+VGhpcyB3aWxsIHNldCB0aGUgSFRUUCBwcm90b2NvbCB2ZXJzaW9uIHRvIGJlIHVzZWQgaW4gc2VuZGluZyB0aGUgU09BUCByZXF1ZXN0cy4gPC9wPgotICAgICAqIDxwPlBvc3NpYmxlIHZhbHVlcyBhcmUgOjwvcD4KLSAgICAgKiA8cHJlPgotICAgICAqIDxwLz4KLSAgICAgKiBIVFRQLzEuMSAtIEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExCi0gICAgICogSFRUUC8xLjAgLSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMAotICAgICAqIDwvcHJlPjxwPiAgICBEZWZhdWx0IGlzIHRvIHVzZSBIVFRQLzEuMS48L2xpPgotICAgICAqIDxwPjxhIG5hbWU9IkhUVFBfSEVBREVSUyI+PC9hPjwvcD4KLSAgICAgKiA8bGk+PGI+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUzwvYj4KLSAgICAgKiA8cD5Zb3UgbWlnaHQgc29tZXRpbWVzIHdhbnQgdG8gc2VuZCB5b3VyIG93biBjdXN0b20gSFRUUCBoZWFkZXJzLiBZb3UgY2FuIHNldCBhbiBBcnJheUxpc3QgZmlsbGVkIHdpdGggPC9wPgotICAgICAqIDxwcmU+b3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSGVhZGVyPC9wcmU+PHA+IG9iamVjdHMgdXNpbmcgdGhlIGFib3ZlIHByb3BlcnR5LiBZb3UgbXVzdCBub3QgdHJ5IHRvIG92ZXJyaWRlIHRoZSBIZWFkZXJzIHRoZSBBeGlzMiBlbmdpbmUgaXMgc2V0dGluZyB0byB0aGUgb3V0Z29pbmcgbWVzc2FnZS48L3A+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJSRVVTRV9IVFRQX0NMSUVOVCI+PC9hPjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPGxpPjxiPm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5SRVVTRV9IVFRQX0NMSUVOVDwvYj4KLSAgICAgKiA8cD5Zb3UgbWlnaHQgd2FudCB0byB1c2UgdGhlIHNhbWUgSFRUUENsaWVudCBpbnN0YW5jZSBmb3IgbXVsdGlwbGUgaW52b2NhdGlvbnMuIFRoaXMgZmxhZyB3aWxsIG5vdGlmeSB0aGUgZW5naW5lIHRvIHVzZSB0aGUgc2FtZSBIVFRQQ2xpZW50IGJldHdlZW4gaW52b2NhdGlvbnMuPC9wPgotICAgICAqIDwvbGk+Ci0gICAgICogPHA+PGEgbmFtZT0iQ0FDSEVEX0hUVFBfQ0xJRU5UIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuQ0FDSEVEX0hUVFBfQ0xJRU5UPC9iPgotICAgICAqIDxwPklmIHVzZXIgaGFkIHJlcXVlc3RlZCB0byByZS11c2UgYW4gSFRUUENsaWVudCB1c2luZyB0aGUgYWJvdmUgcHJvcGVydHksIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gc2V0IGEgY3VzdG9tIEhUVFBDbGllbnQgdG8gYmUgcmUtdXNlZC48L3A+Ci0gICAgICogPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDxwPjxhIG5hbWU9IlJFU1QiPjwvYT48L3A+Ci0gICAgICogPHAvPgotICAgICAqIDxoMz5Db25zdGFudHMgdG8gYmUgdXNlZCBpbiBhIFJFU1QgSW52b2NhdGlvbjwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxhIG5hbWU9IkVOQUJMRV9SRVNUIj48L2E+PC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9SRVNUPC9iPgotICAgICAqIDxwPkVuYWJsaW5nIFJFU1QgdXNpbmcgdGhlIGFib3ZlIGZsYWcgd2lsbCBzZW5kIHlvdXIgcmVxdWVzdCBhcyBhIFJFU1QgaW52b2NhdGlvbi4gPC9wPgotICAgICAqIDxwPlBvc3NpYmxlIHZhbHVlcyBhcmU6IDwvcD4KLSAgICAgKiA8cHJlPiJ0cnVlIi8iZmFsc2UiIG9yIEJvb2xlYW4uVFJVRS9Cb29sZWFuLkZBTFNFPC9wcmU+Ci0gICAgICogPC9saT4KLSAgICAgKiA8cD48YSBuYW1lPSJIVFRQX01FVEhPRCI+PC9hPjwvcD4KLSAgICAgKiA8bGk+PGI+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRDwvYj4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+VGhpcyB3aWxsIGhlbHAgdGhlIHVzZXIgdG8gcGljayB0aGUgSFRUUCBtZXRob2QgdG8gYmUgdXNlZCBkdXJpbmcgYSBSRVNUIGludm9jYXRpb24uIDwvcD4KLSAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlIDo8L3A+Ci0gICAgICogPHByZT4KLSAgICAgKiBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVAotICAgICAqIGFuZAotICAgICAqIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfUE9TVAotICAgICAqIDwvcHJlPjxwPiAgICBEZWZhdWx0IGlzIHRvIHVzZSBQT1NUIG1ldGhvZC48L2xpPgotICAgICAqIDxwPjxhIG5hbWU9IkNPTlRFTlRfVFlQRSI+PC9hPiAgPC9wPgotICAgICAqIDxsaT48Yj5vcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRTwvYj4KLSAgICAgKiA8cD5UaGlzIHdpbGwgaGVscCB0aGUgdXNlciB0byBwaWNrIHRoZSBjb250ZW50IHR5cGUgdG8gYmUgdXNlZCBkdXJpbmcgYSBSRVNUPGJyIC8+Ci0gICAgICogPHAvPgotICAgICAqIGludm9jYXRpb24uIDwvcD4KLSAgICAgKiA8cD5Qb3NzaWJsZSB2YWx1ZXMgYXJlIDo8L3A+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5hcHBsaWNhdGlvbi94bWwgICAgICAgICAgICAgICAgICAgLTxiciAvPgotICAgICAqIDxwcmU+SFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDwvcHJlPjwvbGk+Ci0gICAgICogPGxpPmFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCAtPGJyIC8+Ci0gICAgICogPHByZT5IVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfWF9XV1dfRk9STTwvcHJlPjwvbGk+Ci0gICAgICogPGxpPnRleHQveG1sICAgICAgICAgICAgICAgICAgICAgICAgICAtPGJyIC8+Ci0gICAgICogPHByZT5NRURJQV9UWVBFX1RFWFRfWE1MPC9wcmU+PC9saT4KLSAgICAgKiA8cC8+Ci0gICAgICogPGxpPm11bHRpcGFydC9yZWxhdGVkICAgICAgICAgICAgICAgICAtPGJyIC8+Ci0gICAgICogPHByZT5NRURJQV9UWVBFX01VTFRJUEFSVF9SRUxBVEVEPC9wcmU+PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleQotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUtleSwgT2JqZWN0IHByb3BlcnR5KSB7Ci0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBPcHRpb25zIHByb3BlcnRpZXMgZXhpc3RzCi0gICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcGVydHlLZXksIHByb3BlcnR5KTsKLSAgICAgICAgaWYgKERFQlVHX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIGRlYnVnUHJvcGVydHlTZXQocHJvcGVydHlLZXksIHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBXUy1BZGRyZXNzaW5nIFJlbGF0ZXNUbyBpdGVtLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbGF0ZXNUbwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlbGF0ZXNUbyhSZWxhdGVzVG8gcmVsYXRlc1RvKSB7Ci0gICAgICAgIGlmIChyZWxhdGlvbnNoaXBzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlbGF0aW9uc2hpcHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0ZXNUbz4oNSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVsYXRpb25zaGlwcy5hZGQocmVsYXRlc1RvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgV1MtQWRkcmVzc2luZyBSZXBseVRvIGVuZHBvaW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcGx5VG8gZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8pIHsKLSAgICAgICAgdGhpcy5yZXBseVRvID0gcmVwbHlUbzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdHJhbnNwb3J0IHVzZWQgZm9yIG91dGdvaW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHJhbnNwb3J0T3V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0T3V0KFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCkgewotICAgICAgICB0aGlzLnRyYW5zcG9ydE91dCA9IHRyYW5zcG9ydE91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdHJhbnNwb3J0IHVzZWQgZm9yIG91dGdvaW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VuZGVyVHJhbnNwb3J0ICAgdHJhbnNwb3J0IG5hbWUgaW4gQXhpczIgY29uZmlndXJhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAoImh0dHAiLCAidGNwIiwgZXRjLikKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGUgdHJhbnNwb3J0IGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbmRlclRyYW5zcG9ydChTdHJpbmcgc2VuZGVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMudHJhbnNwb3J0T3V0ID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0VHJhbnNwb3J0T3V0KHNlbmRlclRyYW5zcG9ydCk7Ci0KLSAgICAgICAgaWYgKHNlbmRlclRyYW5zcG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVua25vd25UcmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlclRyYW5zcG9ydCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgU09BUCB2ZXJzaW9uIHRvIGJlIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcFZlcnNpb25VUkkKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cyNVUklfU09BUDExX0VOVgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzI1VSSV9TT0FQMTJfRU5WCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U29hcFZlcnNpb25VUkkoU3RyaW5nIHNvYXBWZXJzaW9uVVJJKSB7Ci0gICAgICAgIHRoaXMuc29hcFZlcnNpb25VUkkgPSBzb2FwVmVyc2lvblVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWQgaW4gYmxvY2tpbmcgc2NlbmFyaW8uIENsaWVudCB3aWxsIHRpbWUgb3V0IGFmdGVyIHdhaXRpbmcKLSAgICAgKiB0aGlzIGFtb3VudCBvZiB0aW1lLiBUaGUgZGVmYXVsdCBpcyAyMDAwIGFuZCBtdXN0IGJlIHByb3ZpZGVkIGluCi0gICAgICogbXVsdGlwbGVzIG9mIDEwMC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lT3V0SW5NaWxsaVNlY29uZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMobG9uZyB0aW1lT3V0SW5NaWxsaVNlY29uZHMpIHsKLSAgICAgICAgdGhpcy50aW1lT3V0SW5NaWxsaVNlY29uZHMgPSB0aW1lT3V0SW5NaWxsaVNlY29uZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFdTLUFkZHJlc3NpbmcgVG8gZW5kcG9pbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdG8gZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUbyhFbmRwb2ludFJlZmVyZW5jZSB0bykgewotICAgICAgICB0aGlzLnRvID0gdG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0cmFuc3BvcnQgaW5mb3JtYXRpb24gdG8gdGhlIGNhbGwuIFRoZSBzY2VuYXJpb3Mgc3VwcG9ydGVkIGFyZSBhcwotICAgICAqIGZvbGxvd3M6IDxibG9ja3F1b3RlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cHJlPgotICAgICAqICBbc2VuZGVyVHJhbnNwb3J0LCBsaXN0ZW5lclRyYW5zcG9ydCwgdXNlU2VwYXJhdGVMaXN0ZW5lcl0KLSAgICAgKiAgaHR0cCwgaHR0cCwgdHJ1ZQotICAgICAqICBodHRwLCBodHRwLCBmYWxzZQotICAgICAqICBodHRwLCBzbXRwLCB0cnVlCi0gICAgICogIHNtdHAsIGh0dHAsIHRydWUKLSAgICAgKiAgc210cCwgc210cCwgdHJ1ZQotICAgICAqICB0Y3AsICB0Y3AsICB0cnVlCi0gICAgICogIHRjcCwgIHRjcCwgIGZhbHNlCi0gICAgICogIGV0Yy4KLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPC9ibG9ja3F1b3RlPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbmRlclRyYW5zcG9ydAotICAgICAqIEBwYXJhbSBsaXN0ZW5lclRyYW5zcG9ydAotICAgICAqIEBwYXJhbSB1c2VTZXBhcmF0ZUxpc3RlbmVyCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChTdHJpbmcpIGFuZAotICAgICAqICAgICAgICAgICAgIHVzZVNlcGFyYXRlTGlzdGVuZXIoYm9vbGVhbikgaW5zdGVhZC4gWW91IGRvIG5vdCBuZWVkIHRvCi0gICAgICogICAgICAgICAgICAgc2V0U2VuZGVyVHJhbnNwb3J0UHJvdG9jb2woU3RyaW5nKSBhcyBzZW5kZXIgdHJhbnNwb3J0IGNhbiBiZQotICAgICAqICAgICAgICAgICAgIGluZmVycmVkIGZyb20gdGhlIHRvIEVQUi4gQnV0IHN0aWxsIHlvdSBjYW4KLSAgICAgKiAgICAgICAgICAgICBzZXRUcmFuc3BvcnRPdXQoVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24pLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydEluZm8oU3RyaW5nIHNlbmRlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaXN0ZW5lclRyYW5zcG9ydCwgYm9vbGVhbiB1c2VTZXBhcmF0ZUxpc3RlbmVyKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gaGVyZSB3ZSBjaGVjayBmb3IgYSBsZWdhbCBjb21iaW5hdGlvbiwgZm9yIGFuZCBleGFtcGxlIGlmIHRoZQotICAgICAgICAvLyBzZW5kZXJ0cmFuc3BvcnQgaXMgaHR0cCBhbmQgbGlzdGVuZXIKLSAgICAgICAgLy8gdHJhbnNwb3J0IGlzIHNtdHAgdGhlIGludm9jYXRpb24gbXVzdCB1c2luZyBzZXBhcmF0ZSB0cmFuc3BvcnQKLSAgICAgICAgaWYgKCF1c2VTZXBhcmF0ZUxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzVHJhbnNwb3J0c0VxdWFsID0gc2VuZGVyVHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobGlzdGVuZXJUcmFuc3BvcnQpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0FUd29XYXl0cmFuc3BvcnQgPSBDb25zdGFudHMuVFJBTlNQT1JUX0hUVFAKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzZW5kZXJUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnN0YW50cy5UUkFOU1BPUlRfVENQLmVxdWFscyhzZW5kZXJUcmFuc3BvcnQpOwotCi0gICAgICAgICAgICBpZiAoKCFpc1RyYW5zcG9ydHNFcXVhbCB8fCAhaXNBVHdvV2F5dHJhbnNwb3J0KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJ1c2VTZXBhcmF0ZUxpc3RlbmVyTGltaXRlZCIsIHNlbmRlclRyYW5zcG9ydCwgbGlzdGVuZXJUcmFuc3BvcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFVzZVNlcGFyYXRlTGlzdGVuZXIodXNlU2VwYXJhdGVMaXN0ZW5lcik7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRUcmFuc3BvcnRJblByb3RvY29sKGxpc3RlbmVyVHJhbnNwb3J0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgdHdvIFNPQVAgTWVzc2FnZXMgYXJlIGJlIHNlbnQgb3ZlciBzYW1lCi0gICAgICogY2hhbm5lbCBvciBvdmVyIHNlcGFyYXRlIGNoYW5uZWxzLiBUaGUgdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBkZXBlbmRzIG9uCi0gICAgICogdGhlIHRyYW5zcG9ydCBzcGVjaWZpZWQuIEZvciBlLmcuLCBpZiB0aGUgdHJhbnNwb3J0cyBhcmUgZGlmZmVyZW50IHRoaXMKLSAgICAgKiBpcyB0cnVlIGJ5IGRlZmF1bHQuIEhUVFAgdHJhbnNwb3J0IHN1cHBvcnRzIGJvdGggY2FzZXMgd2hpbGUgU01UUAotICAgICAqIHRyYW5zcG9ydCBzdXBwb3J0cyBvbmx5IHR3byBjaGFubmVsIGNhc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXNlU2VwYXJhdGVMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZVNlcGFyYXRlTGlzdGVuZXIoYm9vbGVhbiB1c2VTZXBhcmF0ZUxpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMudXNlU2VwYXJhdGVMaXN0ZW5lciA9IEJvb2xlYW4udmFsdWVPZih1c2VTZXBhcmF0ZUxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgV1MtQWRkcmVzc2luZyBSZWZlcmVuY2VQYXJhbWV0ZXIgY2hpbGQgZWxlbWVudC4gTXVsdGlwbGUgY2hpbGQKLSAgICAgKiBtYXkgYmUgdXNlZC4KLSAgICAgKiBUT0RPIEFkZCBnZXQgbWV0aG9kLCBpbXBsZW1lbnQgaGFuZGxpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUGFyYW1ldGVyCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VQYXJhbWV0ZXIoT01FbGVtZW50IHJlZmVyZW5jZVBhcmFtZXRlcikgewotICAgICAgICBpZiAocmVmZXJlbmNlUGFyYW1ldGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZWZlcmVuY2VQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxPTUVsZW1lbnQ+KDUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVmZXJlbmNlUGFyYW1ldGVycy5hZGQocmVmZXJlbmNlUGFyYW1ldGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW5hYmxlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWFuYWdlU2Vzc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIG1hbmFnZVNlc3Npb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHNlc3Npb24gbWFuYWdlbWVudCBlbmFibGVkIHN0YXRlLiBXaGVuIHNlc3Npb24gbWFuYWdlbWVudCBpcyBlbmFibGVkLAotICAgICAqIHRoZSBlbmdpbmUgd2lsbCBhdXRvbWF0aWNhbGx5IHNlbmQgc2Vzc2lvbiBkYXRhIChzdWNoIGFzIHRoZSBzZXJ2aWNlCi0gICAgICogZ3JvdXAgaWQsIG9yIEhUVFAgY29va2llcykgYXMgcGFydCBvZiByZXF1ZXN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYW5hZ2VTZXNzaW9uIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsaW5nIHNlc3Npb25zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFuYWdlU2Vzc2lvbihib29sZWFuIG1hbmFnZVNlc3Npb24pIHsKLSAgICAgICAgdGhpcy5tYW5hZ2VTZXNzaW9uID0gbWFuYWdlU2Vzc2lvbjsKLSAgICB9Ci0KLSAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqIEV4dGVybmFsaXphYmxlIHN1cHBvcnQKLSAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIFN0cmluZyBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpOwotCi0gICAgICAgIC8vIHdyaXRlIG91dCBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCi0gICAgICAgIC8vIE5PVEVTOiBGb3IgZWFjaCBpdGVtLCB3aGVyZSBhcHByb3ByaWF0ZSwKLSAgICAgICAgLy8gICAgICAgIHdyaXRlIG91dCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLCBJTiBPUkRFUjoKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBjbGFzcyBuYW1lCi0gICAgICAgIC8vICAgICAgICAgICB0aGUgYWN0aXZlIG9yIGVtcHR5IGZsYWcKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBkYXRhIGxlbmd0aCwgaWYgYXBwcm9wcmlhdGUKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBkYXRhCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlTG9uZyh0aW1lT3V0SW5NaWxsaVNlY29uZHMpOwotCi0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obWFuYWdlU2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBvYmplY3RzIGNvdWxkIGJlIG51bGwKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGlzRXhjZXB0aW9uVG9CZVRocm93bk9uU09BUEZhdWx0KTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHVzZVNlcGFyYXRlTGlzdGVuZXIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc3RyaW5ncwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFN0cmluZyBzb2FwVmVyc2lvblVSSQotICAgICAgICBvdXQud3JpdGVPYmplY3Qoc29hcFZlcnNpb25VUkkpOwotCi0gICAgICAgIC8vIFN0cmluZyBhY3Rpb24KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGFjdGlvbik7Ci0KLSAgICAgICAgLy8gU3RyaW5nIHRyYW5zcG9ydEluUHJvdG9jb2wKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHRyYW5zcG9ydEluUHJvdG9jb2wpOwotCi0gICAgICAgIC8vIFN0cmluZyBtZXNzYWdlSWQKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1lc3NhZ2VJZCk7Ci0KLSAgICAgICAgLy8gU3RyaW5nIG9iamVjdCBpZAotICAgICAgICBvdXQud3JpdGVPYmplY3QobG9nQ29ycmVsYXRpb25JRFN0cmluZyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBvYmplY3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIEVuZHBvaW50UmVmZXJlbmNlIHZhbHVlcwotICAgICAgICBvdXQud3JpdGVPYmplY3QoZmF1bHRUbyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChmcm9tKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHJlcGx5VG8pOwotICAgICAgICBvdXQud3JpdGVPYmplY3QodG8pOwotICAgICAgICAKLQotICAgICAgICAvLyBUcmFuc3BvcnRMaXN0ZW5lciBsaXN0ZW5lcgotICAgICAgICBtZXRhTGlzdGVuZXIgPSBudWxsOwotICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YUxpc3RlbmVyID0gbmV3IE1ldGFEYXRhRW50cnkobGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtZXRhTGlzdGVuZXIpOwotCi0gICAgICAgIC8vIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4KLSAgICAgICAgbWV0YVRyYW5zcG9ydEluID0gbnVsbDsKLSAgICAgICAgaWYgKHRyYW5zcG9ydEluICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFUcmFuc3BvcnRJbiA9IG5ldyBNZXRhRGF0YUVudHJ5KG51bGwsIHRyYW5zcG9ydEluLmdldE5hbWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfSAKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1ldGFUcmFuc3BvcnRJbik7Ci0KLSAgICAgICAgLy8gVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0Ci0gICAgICAgIG1ldGFUcmFuc3BvcnRPdXQgPSBudWxsOwotICAgICAgICBpZiAodHJhbnNwb3J0T3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFUcmFuc3BvcnRPdXQgPSBuZXcgTWV0YURhdGFFbnRyeShudWxsLCB0cmFuc3BvcnRPdXQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtZXRhVHJhbnNwb3J0T3V0KTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBjb2xsZWN0aW9ucyBhbmQgbGlzdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgCi0gICAgICAgIC8vIExpc3QgcmVsYXRpb25zaGlwcywgd2hpY2ggaXMgYW4gYXJyYXkgb2YgUmVsYXRlc1RvIG9iamVjdHMKLSAgICAgICAgb3V0LndyaXRlTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAKLQotICAgICAgICAvLyBBcnJheUxpc3QgcmVmZXJlbmNlUGFyYW1ldGVycwotICAgICAgICBvdXQud3JpdGVMaXN0KHJlZmVyZW5jZVBhcmFtZXRlcnMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBIYXNoTWFwIHByb3BlcnRpZXMKLSAgICAgICAgb3V0LndyaXRlTWFwKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vICJuZXN0ZWQiCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZVVURigicGFyZW50Iik7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChwYXJlbnQpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIE1lc3NhZ2VDb250ZXh0IHRoYXQgd2FzCi0gICAgICogcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4gIFNvbWUgZGF0YSB3aWxsIG5lZWQgdG8gYmUgdmFsaWRhdGVkIHdoZW4KLSAgICAgKiByZXN1cnJlY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgbG9uZyBzdWlkID0gaW4ucmVhZExvbmcoKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBpbnQgcmV2SUQgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHZlcnNpb24gd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAoc3VpZCAhPSBzZXJpYWxWZXJzaW9uVUlEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9TVUlEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSByZXZpc2lvbiBsZXZlbCB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChyZXZJRCAhPSBSRVZJU0lPTl8yKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9SRVZJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgdGltZU91dEluTWlsbGlTZWNvbmRzID0gaW4ucmVhZExvbmcoKTsKLQotICAgICAgICBtYW5hZ2VTZXNzaW9uID0gaW4ucmVhZEJvb2xlYW4oKTsKLQotICAgICAgICBpc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCA9IChCb29sZWFuKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgIHVzZVNlcGFyYXRlTGlzdGVuZXIgPSAoQm9vbGVhbikgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc3RyaW5ncwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFN0cmluZyBzb2FwVmVyc2lvblVSSQotICAgICAgICBzb2FwVmVyc2lvblVSSSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBTdHJpbmcgYWN0aW9uCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBTdHJpbmcgdHJhbnNwb3J0SW5Qcm90b2NvbAotICAgICAgICB0cmFuc3BvcnRJblByb3RvY29sID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIFN0cmluZyBtZXNzYWdlSWQKLSAgICAgICAgbWVzc2FnZUlkID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIFN0cmluZyBvYmplY3QgaWQKLSAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICI6cmVhZEV4dGVybmFsKCk6ICByZWFkaW5nIHRoZSBpbnB1dCBzdHJlYW0gZm9yICBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIG9iamVjdHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBFbmRwb2ludFJlZmVyZW5jZSBmYXVsdFRvCi0gICAgICAgIGZhdWx0VG8gPSAoRW5kcG9pbnRSZWZlcmVuY2UpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBFbmRwb2ludFJlZmVyZW5jZSBmcm9tCi0gICAgICAgIGZyb20gPSAoRW5kcG9pbnRSZWZlcmVuY2UpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvCi0gICAgICAgIHJlcGx5VG8gPSAoRW5kcG9pbnRSZWZlcmVuY2UpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBFbmRwb2ludFJlZmVyZW5jZSB0bwotICAgICAgICB0byA9IChFbmRwb2ludFJlZmVyZW5jZSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyCi0gICAgICAgIC8vIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIGxpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgbWV0YUxpc3RlbmVyID0gKE1ldGFEYXRhRW50cnkpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluCi0gICAgICAgIC8vIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIHRyYW5zcG9ydEluID0gbnVsbDsKLSAgICAgICAgbWV0YVRyYW5zcG9ydEluID0gKE1ldGFEYXRhRW50cnkpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQKLSAgICAgICAgLy8gaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgdHJhbnNwb3J0T3V0ID0gbnVsbDsKLSAgICAgICAgbWV0YVRyYW5zcG9ydE91dCA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29sbGVjdGlvbnMgYW5kIGxpc3RzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gTGlzdCByZWxhdGlvbnNoaXBzLCB3aGljaCBpcyBhbiBhcnJheSBvZiBSZWxhdGVzVG8gb2JqZWN0cwotICAgICAgICByZWxhdGlvbnNoaXBzID0gaW4ucmVhZEFycmF5TGlzdCgpOwotCi0gICAgICAgIC8vIEFycmF5TGlzdCByZWZlcmVuY2VQYXJhbWV0ZXJzCi0gICAgICAgIHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBpbi5yZWFkQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcHJvcGVydGllcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIEhhc2hNYXAgcHJvcGVydGllcwotICAgICAgICBwcm9wZXJ0aWVzID0gaW4ucmVhZEhhc2hNYXAoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyAibmVzdGVkIgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIE9wdGlvbnMgcGFyZW50Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgcGFyZW50ID0gKE9wdGlvbnMpIGluLnJlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIGlmIGFkZGl0aW9uYWwgd29yayBuZWVkcyB0byBiZQotICAgICAqIGRvbmUgaW4gb3JkZXIgdG8gY29tcGxldGUgdGhlIG9iamVjdCByZWNvbnN0aXR1dGlvbi4KLSAgICAgKiBTb21lIHBhcnRzIG9mIHRoZSBvYmplY3QgcmVzdG9yZWQgZnJvbSB0aGUgcmVhZEV4dGVybmFsKCkKLSAgICAgKiBjYW5ub3QgYmUgY29tcGxldGVkIHVudGlsIHdlIGhhdmUgYSBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIGZyb20gdGhlIGFjdGl2ZSBlbmdpbmUuIFRoZSBjb25maWd1cmF0aW9uQ29udGV4dCBpcyB1c2VkCi0gICAgICogdG8gaGVscCB0aGlzIG9iamVjdCB0byBwbHVnIGJhY2sgaW50byB0aGUgZW5naW5lJ3MKLSAgICAgKiBjb25maWd1cmF0aW9uIGFuZCBkZXBsb3ltZW50IG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2MgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhY3RpdmUgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNjKSB7Ci0gICAgICAgIC8vIHNlZSBpZiB0aGVyZSdzIGFueSB3b3JrIHRvIGRvCi0gICAgICAgIGlmICghbmVlZHNUb0JlUmVjb25jaWxlZCkgewotICAgICAgICAgICAgLy8gcmV0dXJuIHF1aWNrCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKTsKLSAgICAgICAgLy8gdXNlIHRoZSBzdXBwbGllZCBjb25maWd1cmF0aW9uIGNvbnRleHQKLQotICAgICAgICAvLyBnZXQgdGhlIGF4aXMgY29uZmlndXJhdGlvbgotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFUcmFuc3BvcnRJbjsgcmVzdG9yZSBpdAotICAgICAgICBpZiAobWV0YVRyYW5zcG9ydEluICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFpbiA9IG1ldGFUcmFuc3BvcnRJbi5nZXRRTmFtZSgpOwotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0bXBJbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcEluID0gYXhpc0NvbmZpZy5nZXRUcmFuc3BvcnRJbihxaW4uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGluKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgYSBmYXVsdCBpcyB0aHJvd24sIGxvZyBpdCBhbmQgY29udGludWUKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWN0aXZhdGUoKTogIGV4Y2VwdGlvbiBjYXVnaHQgd2hlbiBnZXR0aW5nIHRoZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFpbi50b1N0cmluZygpICsgIl0gIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4aW4uZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRtcEluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbiA9IHRtcEluOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWN0aXZhdGUoKTogIE5vIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gZm91bmQgZm9yIFsiICsgcWluLnRvU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIl0iKTsKLQotICAgICAgICAgICAgICAgIHRyYW5zcG9ydEluID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgImFjdGl2YXRlKCk6ICBObyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uICIpOwotCi0gICAgICAgICAgICB0cmFuc3BvcnRJbiA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFUcmFuc3BvcnRPdXQ7IHJlc3RvcmUgaXQKLSAgICAgICAgaWYgKG1ldGFUcmFuc3BvcnRPdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgUU5hbWUgcW91dCA9IG1ldGFUcmFuc3BvcnRPdXQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRtcE91dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcE91dCA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0T3V0KHFvdXQuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleG91dCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGEgZmF1bHQgaXMgdGhyb3duLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgImFjdGl2YXRlKCk6ICBleGNlcHRpb24gY2F1Z2h0IHdoZW4gZ2V0dGluZyB0aGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcW91dC50b1N0cmluZygpICsgIl0gIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4b3V0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleG91dC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodG1wT3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRPdXQgPSB0bXBPdXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhY3RpdmF0ZSgpOiAgTm8gVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gZm91bmQgZm9yIFsiICsgcW91dC50b1N0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdIik7Ci0KLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKyAiYWN0aXZhdGUoKTogIE5vIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uICIpOwotCi0gICAgICAgICAgICB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhTGlzdGVuZXI7IHJlc3RvcmUgaXQKLSAgICAgICAgaWYgKG1ldGFMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIGZpbmQgYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICAgICAgICBTdHJpbmcgbGlzdGVuZXJDbGFzcyA9IG1ldGFMaXN0ZW5lci5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgImFjdGl2YXRlKCk6ICBUcmFuc3BvcnRMaXN0ZW5lciBmb3VuZCBmb3IgWyIgKwotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lckNsYXNzICsgIl0gIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsaXN0ZW5lciA9IG51bGw7Ci0KLSAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgImFjdGl2YXRlKCk6ICBObyBUcmFuc3BvcnRMaXN0ZW5lciAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lLCByZXNldCB0aGUgZmxhZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgbmVlZHNUb0JlUmVjb25jaWxlZCA9IGZhbHNlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMga2V5IHBhcnRzIG9mIHRoZSBzdGF0ZSBmcm9tIHRoZSBjdXJyZW50IGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5zdGFuY2UgdG8gc2VlIGlmIHRoZXkgYXJlCi0gICAgICogZXF1aXZhbGVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKCkgbWV0aG9kIGluCi0gICAgICogdGhhdCB0aGUgZXF1YWxzKCkgbWV0aG9kIGdlbmVyYWxseSBsb29rcyBhdCBib3RoIHRoZQotICAgICAqIG9iamVjdCBpZGVudGl0eSAobG9jYXRpb24gaW4gbWVtb3J5KSBhbmQgdGhlIG9iamVjdCBzdGF0ZQotICAgICAqIChkYXRhKS4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoaXMgb2JqZWN0IGlzIGVxdWl2YWxlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdAotICAgICAqICAgICAgICAgdGhhdCBpcywga2V5IGZpZWxkcyBtYXRjaAotICAgICAqICAgICAgICAgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudChPcHRpb25zIG9iaikgewotICAgICAgICAvLyBOT1RFOiB0aGUgaW5wdXQgb2JqZWN0IGlzIGV4cGVjdGVkIHRvIGV4aXN0IChpZSwgYmUgbm9uLW51bGwpCi0KLSAgICAgICAgaWYgKHRoaXMudGltZU91dEluTWlsbGlTZWNvbmRzICE9IG9iai5nZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMuaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQuYm9vbGVhblZhbHVlKCkgIT0KLSAgICAgICAgICAgICAgICBvYmouaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMudXNlU2VwYXJhdGVMaXN0ZW5lci5ib29sZWFuVmFsdWUoKSAhPSBvYmouaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLm1hbmFnZVNlc3Npb24gIT0gb2JqLmlzTWFuYWdlU2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5zb2FwVmVyc2lvblVSSSAhPSBudWxsKSAmJiAob2JqLmdldFNvYXBWZXJzaW9uVVJJKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy5zb2FwVmVyc2lvblVSSS5lcXVhbHMob2JqLmdldFNvYXBWZXJzaW9uVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnNvYXBWZXJzaW9uVVJJID09IG51bGwpICYmIChvYmouZ2V0U29hcFZlcnNpb25VUkkoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5hY3Rpb24gIT0gbnVsbCkgJiYgKG9iai5nZXRBY3Rpb24oKSAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGlvbi5lcXVhbHMob2JqLmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5hY3Rpb24gPT0gbnVsbCkgJiYgKG9iai5nZXRBY3Rpb24oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy50cmFuc3BvcnRJblByb3RvY29sICE9IG51bGwpICYmIChvYmouZ2V0VHJhbnNwb3J0SW5Qcm90b2NvbCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0SW5Qcm90b2NvbC5lcXVhbHMob2JqLmdldFRyYW5zcG9ydEluUHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMudHJhbnNwb3J0SW5Qcm90b2NvbCA9PSBudWxsKSAmJiAob2JqLmdldFRyYW5zcG9ydEluUHJvdG9jb2woKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5tZXNzYWdlSWQgIT0gbnVsbCkgJiYgKG9iai5nZXRNZXNzYWdlSWQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VJZC5lcXVhbHMob2JqLmdldE1lc3NhZ2VJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5tZXNzYWdlSWQgPT0gbnVsbCkgJiYgKG9iai5nZXRNZXNzYWdlSWQoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5mYXVsdFRvICE9IG51bGwpICYmIChvYmouZ2V0RmF1bHRUbygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZmF1bHRUby5pc0VxdWl2YWxlbnQob2JqLmdldEZhdWx0VG8oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuZmF1bHRUbyA9PSBudWxsKSAmJiAob2JqLmdldEZhdWx0VG8oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5mcm9tICE9IG51bGwpICYmIChvYmouZ2V0RnJvbSgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuZnJvbS5pc0VxdWl2YWxlbnQob2JqLmdldEZyb20oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuZnJvbSA9PSBudWxsKSAmJiAob2JqLmdldEZyb20oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5yZXBseVRvICE9IG51bGwpICYmIChvYmouZ2V0UmVwbHlUbygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucmVwbHlUby5pc0VxdWl2YWxlbnQob2JqLmdldFJlcGx5VG8oKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMucmVwbHlUbyA9PSBudWxsKSAmJiAob2JqLmdldFJlcGx5VG8oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy50byAhPSBudWxsKSAmJiAob2JqLmdldFRvKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy50by5pc0VxdWl2YWxlbnQob2JqLmdldFRvKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnRvID09IG51bGwpICYmIChvYmouZ2V0VG8oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8gY29udGludWUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1pc21hdGNoCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmICgodGhpcy5wcm9wZXJ0aWVzICE9IG51bGwpICYmIChvYmouZ2V0UHJvcGVydGllcygpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMucHJvcGVydGllcy5lcXVhbHMob2JqLmdldFByb3BlcnRpZXMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RyaWN0IHRlc3QuCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYWxzbyBhIG1hcAotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgdHdvIG1hcHMgcmVwcmVzZW50IHRoZSBzYW1lIG1hcHBpbmdzLgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgodGhpcy5wcm9wZXJ0aWVzID09IG51bGwpICYmIChvYmouZ2V0UHJvcGVydGllcygpID09IG51bGwpKSB7Ci0gICAgICAgICAgICAvLyBjb250aW51ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgY2hlY2tpbmcgdGhlIGZvbGxvd2luZyBvYmplY3RzIGZvciBlcXVpdmFsZW5jeQotICAgICAgICAvLyAgICAgICAgTGlzdCByZWxhdGlvbnNoaXBzOwotICAgICAgICAvLyAgICAgICAgQXJyYXlMaXN0IHJlZmVyZW5jZVBhcmFtZXRlcnM7Ci0gICAgICAgIC8vICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICAgICAgLy8gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW47Ci0gICAgICAgIC8vICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQ7Ci0KLSAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgY2hlY2tpbmcgdGhlIHBhcmVudCBvYmplY3RzIGZvciBlcXVpdmFsZW5jeQotCi0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBjYW4gYmUgb3V0cHV0IHRvIGEgbG9nIGZpbGUgYXMgYW4gaWRlbnRpZmllcgotICAgICAqICAgICAgICAgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLiAgSXQgaXMgc3VpdGFibGUgZm9yIG1hdGNoaW5nIHJlbGF0ZWQgbG9nCi0gICAgICogICAgICAgICBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpIHsKLSAgICAgICAgaWYgKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IG15Q2xhc3NOYW1lICsgIkAiICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgbmVlZGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhpcwotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYmVmb3JlIGFjY2Vzc2luZyBjZXJ0YWluIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RuYW1lIFRoZSBtZXRob2Qgd2hlcmUgdGhlIHdhcm5pbmcgb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZhdGVXYXJuaW5nKFN0cmluZyBtZXRob2RuYW1lKSB7Ci0gICAgICAgIGlmIChuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICBsb2cud2FybihnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKyAiOiIgKyBtZXRob2RuYW1lICsgIigpOiAqKioqV0FSTklORyoqKiogIiArCi0gICAgICAgICAgICAgICAgICAgIG15Q2xhc3NOYW1lICsgIi5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCkgbmVlZHMgdG8gYmUgaW52b2tlZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYWxsVHJhbnNwb3J0Q2xlYW51cCgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxUcmFuc3BvcnRDbGVhbnVwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbGxUcmFuc3BvcnRDbGVhbnVwKGJvb2xlYW4gY2FsbFRyYW5zcG9ydENsZWFudXApIHsKLSAgICAgICAgdGhpcy5jYWxsVHJhbnNwb3J0Q2xlYW51cCA9IGNhbGxUcmFuc3BvcnRDbGVhbnVwOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLSAgICAgICAgaWYgKHVzZXJOYW1lID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VXNlck5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRQYXNzd29yZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXNzd29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWJ1ZyBmb3IgZm9yIHByb3BlcnR5IGtleSBhbmQgdmFsdWUuCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkZWJ1Z1Byb3BlcnR5U2V0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoREVCVUdfUFJPUEVSVFlfU0VUKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKHZhbHVlID09IG51bGwpID8gIm51bGwiIDogdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3Nsb2FkZXIgPSAibnVsbCI7Ci0gICAgICAgICAgICBpZih2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBVdGlscy5nZXRPYmplY3RDbGFzc0xvYWRlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYoY2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc2xvYWRlciA9IGNsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlVGV4dCA9ICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyAKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFByb3BlcnR5IHNldCBvbiBvYmplY3QgIiArIGlkZW50aXR5KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBLZXkgPSIgKyBrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlID0iICsgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSBDbGFzcyA9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlIENsYXNzbG9hZGVyID0gIiArIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggICJDYWxsIFN0YWNrID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiPT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1NlcnZpY2VDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE4ZDlkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXhpc0NhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ291bnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQ2xpZW50IGFjY2VzcyB0byBhIHNlcnZpY2UuIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHtAbGluawotICogb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZX0sIGFuZCB0aGUgbWV0aG9kcyBzdXBwb3J0IG9wZXJhdGlvbnMgdXNpbmcgdGhhdCBzZXJ2aWNlLgotICoge0BsaW5rIE9wdGlvbnN9IGluc3RhbmNlcyBhcmUgdXNlZCB0byBjb25maWd1cmUgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBzZXJ2aWNlIGFjY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VDbGllbnQgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZpY2VDbGllbnQuY2xhc3MpOwotCi0gICAgLyoqIEJhc2UgbmFtZSB1c2VkIGZvciBhIHNlcnZpY2UgY3JlYXRlZCB3aXRob3V0IGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PTl9TRVJWSUNFID0gImFub25TZXJ2aWNlIjsKLQotICAgIC8qKiBPcHRpb24gcHJvcGVydHkgbmFtZSBmb3IgYXV0b21hdGljYWxseSBjbGVhbmluZyB1cCBvbGQgT3BlcmF0aW9uQ29udGV4dHMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX09QRVJBVElPTl9DTEVBTlVQID0gIlNlcnZpY2VDbGllbnQuYXV0b09wZXJhdGlvbkNsZWFudXAiOwotCi0gICAgLyoqIENvdW50ZXIgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYW5vbnltb3VzIHNlcnZpY2UgbmFtZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBDb3VudGVyIGFub25TZXJ2aWNlQ291bnRlciA9IG5ldyBDb3VudGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVyYXRpb24gbmFtZSB1c2VkIGZvciBhbiBhbm9ueW1vdXMgb3V0LW9ubHkgb3BlcmF0aW9uIChtZWFuaW5nIHdlIHNlbmQgYSBtZXNzYWdlIHdpdGggbm8KLSAgICAgKiByZXNwb25zZSBhbGxvd2VkIGZyb20gdGhlIHNlcnZpY2UsIGVxdWl2YWxlbnQgdG8gYSBXU0RMIEluLU9ubHkgb3BlcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFOT05fT1VUX09OTFlfT1AgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICBDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1VSSSwgImFub25PdXRvbmx5T3AiLCBDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCk7Ci0KLSAgICAvKioKLSAgICAgKiBPcGVyYXRpb24gbmFtZSB1c2VkIGZvciBhbiBhbm9ueW1vdXMgcm9idXN0LW91dC1vbmx5IG9wZXJhdGlvbiAobWVhbmluZyB3ZSBzZW5kIGEgbWVzc2FnZSwKLSAgICAgKiB3aXRoIHRoZSBvbmx5IHBvc3NpYmxlIHJlc3BvbnNlIGEgZmF1bHQsIGVxdWl2YWxlbnQgdG8gYSBXU0RMIFJvYnVzdC1Jbi1Pbmx5IG9wZXJhdGlvbikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBBTk9OX1JPQlVTVF9PVVRfT05MWV9PUCA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJLCAiYW5vblJvYnVzdE9wIiwgQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9QUkVGSVgpOwotCi0gICAgLyoqCi0gICAgICogT3BlcmF0aW9uIG5hbWUgdXNlZCBmb3IgYW4gYW5vbnltb3VzIGluLW91dCBvcGVyYXRpb24gKG1lYW5pbmcgd2Ugc2VudCBhIG1lc3NhZ2UgYW5kIHJlY2VpdmUKLSAgICAgKiBhIHJlc3BvbnNlLCBlcXVpdmFsZW50IHRvIGEgV1NETCBJbi1PdXQgb3BlcmF0aW9uKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFOT05fT1VUX0lOX09QID0gbmV3IFFOYW1lKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFub25PdXRJbk9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYKTsKLQotICAgIC8vIHRoZSBtZXRhLWRhdGEgb2YgdGhlIHNlcnZpY2UgdGhhdCB0aGlzIGNsaWVudCBhY2Nlc3MKLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgLy8gdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggbXkgbWV0YS1kYXRhIGxpdmVzCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOwotCi0gICAgLy8gdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCBpbiB3aGljaCBJIGxpdmUKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICAvLyBzZXJ2aWNlIGNvbnRleHQgZm9yIHRoaXMgc3BlY2lmaWMgc2VydmljZSBpbnN0YW5jZQotICAgIHByaXZhdGUgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQ7Ci0KLSAgICAvLyBjbGllbnQgb3B0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIGludGVyYWN0aW9uCi0gICAgcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotCi0gICAgLy8gb3B0aW9ucyB0aGF0IG11c3Qgb3ZlcnJpZGUgdGhvc2Ugb2YgdGhlIGNoaWxkIG9wZXJhdGlvbiBjbGllbnQgYWxzbwotICAgIHByaXZhdGUgT3B0aW9ucyBvdmVycmlkZU9wdGlvbnM7Ci0KLSAgICAvLyBsaXN0IG9mIGhlYWRlcnMgdG8gYmUgc2VudCB3aXRoIHRoZSBzaW1wbGUgQVBJcwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE9NRWxlbWVudD4gaGVhZGVyczsKLQotICAgIC8vd2hldGhlciB3ZSBjcmVhdGUgY29uZmlnY3R4IG9yIG5vdAotICAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVDb25maWdDdHg7Ci0KLSAgICBwcml2YXRlIGludCBoYXNoQ29kZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVBeGlzU2VydmljZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlcnZpY2UgY2xpZW50IGNvbmZpZ3VyZWQgdG8gd29yayB3aXRoIGEgc3BlY2lmaWMgQXhpc1NlcnZpY2UuIElmIHRoaXMgc2VydmljZSBpcwotICAgICAqIGFscmVhZHkgaW4gdGhlIHdvcmxkIHRoYXQncyBoYW5kZWQgaW4gKGluIHRoZSBmb3JtIG9mIGEgQ29uZmlndXJhdGlvbkNvbnRleHQpIHRoZW4gSSB3aWxsCi0gICAgICogaGFwcGlseSB3b3JrIGluIGl0LiBJZiBub3QgSSB3aWxsIGNyZWF0ZSBhIHNtYWxsIGxpdHRsZSB2aXJ0dWFsIHdvcmxkIGFuZCBsaXZlIHRoZXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCB1bmRlciB3aGljaCB0aGlzIHNlcnZpY2UgbGl2ZXMgKG1heSBiZSBudWxsLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgYSBuZXcgbG9jYWwgb25lIHdpbGwgYmUgY3JlYXRlZCkKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UgICBUaGUgc2VydmljZSBmb3Igd2hpY2ggdGhpcyBpcyB0aGUgY2xpZW50IChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2FzZSBhbiBhbm9ueW1vdXMgc2VydmljZSB3aWxsIGJlIGNyZWF0ZWQpCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hpbGUgY3JlYXRpbmcgYSBjb25maWcgY29udGV4dCAoaWYgbmVlZGVkKQotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBjb25maWd1cmVTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBBeGlzU2VydmljZSBheGlzU2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoY29uZmlnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgICAgICAgICAgICAgY3JlYXRlQ29uZmlnQ3R4ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IExpc3RlbmVyTWFuYWdlci5kZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAgICAgaGFzaENvZGUgPSAoaW50KWFub25TZXJ2aWNlQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIHRyYW5zcG9ydHMKLSAgICAgICAgLy8gVE9ETyA6IGRvIHdlIG5lZWQgdGhpcz8KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRMaXN0ZW5lck1hbmFnZXIoKTsKLQotICAgICAgICAvLyBzYXZlIHRoZSBheGlzQ29uZmlnIGFuZCBzZXJ2aWNlCi0gICAgICAgIGF4aXNDb25maWcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gY3JlYXRlQW5vbnltb3VzU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgLy8gYXhpcyBzZXJ2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIC8vIG9ubHkgaWYgdXNlciBoYXMgbm90IGFkZGVkIGl0IHRvIGNvbmZpZ3VyYXRpb24gY29udGV4dC4KLSAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0U2VydmljZShheGlzU2VydmljZS5nZXROYW1lKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldENsaWVudFNpZGUodHJ1ZSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgcmVtb3ZlQXhpc1NlcnZpY2UgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xpZW50U2lkZSh0cnVlKTsKLSAgICAgICAgICAgIHJlbW92ZUF4aXNTZXJ2aWNlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNvbmZpZ0NvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgc2VydmljZUNvbnRleHQgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBXU0RMNEogYmFzZWQgY29uc3RydWN0b3IgdG8gY29uZmlndXJlIHRoZSBTZXJ2aWNlIENsaWVudC8gVE9ETzogbWFrZSB0aGlzIHBvbGljeQotICAgICAqIGF3YXJlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCAgICBhY3RpdmUgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcGFyYW0gd3NkbDRqRGVmaW5pdGlvbiB0aGUgV1NETCB3ZSdyZSBnb2luZyB0byBiZSB1c2luZyB0byBjb25maWd1cmUgb3Vyc2VsdmVzCi0gICAgICogQHBhcmFtIHdzZGxTZXJ2aWNlTmFtZSAgUU5hbWUgb2YgdGhlIFdTREwgc2VydmljZSB3ZSdkIGxpa2UgdG8gYWNjZXNzCi0gICAgICogQHBhcmFtIHBvcnROYW1lICAgICAgICAgbmFtZSBvZiB0aGUgV1NETCBwb3J0IHdlJ2QgbGlrZSB0byBhY2Nlc3MKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBEZWZpbml0aW9uIHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgd3NkbFNlcnZpY2VOYW1lLCBTdHJpbmcgcG9ydE5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBjb25maWd1cmVTZXJ2aWNlQ2xpZW50KGNvbmZpZ0NvbnRleHQsIEF4aXNTZXJ2aWNlLmNyZWF0ZUNsaWVudFNpZGVBeGlzU2VydmljZSgKLSAgICAgICAgICAgICAgICB3c2RsNGpEZWZpbml0aW9uLCB3c2RsU2VydmljZU5hbWUsIHBvcnROYW1lLCBvcHRpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2VydmljZSBjbGllbnQgZm9yIFdTREwgc2VydmljZSBpZGVudGlmaWVkIGJ5IHRoZSBRTmFtZSBvZiB0aGUgd3NkbDpzZXJ2aWNlIGVsZW1lbnQKLSAgICAgKiBpbiBhIFdTREwgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCAgIFRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgdW5kZXIgd2hpY2ggdGhpcyBzZXJ2aWNlIGxpdmVzIChtYXkgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LCBpbiB3aGljaCBjYXNlIGEgbmV3IGxvY2FsIG9uZSB3aWxsIGJlIGNyZWF0ZWQpICoKLSAgICAgKiBAcGFyYW0gd3NkbFVSTCAgICAgICAgIFRoZSBVUkwgb2YgdGhlIFdTREwgZG9jdW1lbnQgdG8gcmVhZAotICAgICAqIEBwYXJhbSB3c2RsU2VydmljZU5hbWUgVGhlIFFOYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQgdG8gY3JlYXRlIGEgY2xpZW50Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICBmb3IKLSAgICAgKiBAcGFyYW0gcG9ydE5hbWUgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBXU0RMIDEuMSBwb3J0IHRvIGNyZWF0ZSBhIGNsaWVudCBmb3IuIE1heSBiZSBudWxsIChpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgV1NETCAyLjAgaXMgdXNlZCBvciBpZiBvbmx5IG9uZSBwb3J0IGlzIHRoZXJlKS4gLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdoaWxlIGNyZWF0aW5nIGEgY29uZmlnIGNvbnRleHQgKGlmIG5lZWRlZCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBVUkwgd3NkbFVSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSB3c2RsU2VydmljZU5hbWUsIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGNvbmZpZ3VyZVNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgQXhpc1NlcnZpY2UuY3JlYXRlQ2xpZW50U2lkZUF4aXNTZXJ2aWNlKHdzZGxVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpKTsKLSAgICAgICAgUGFyYW1ldGVyIHRyYW5zcG9ydE5hbWUgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoIlRSQU5TUE9SVF9OQU1FIik7Ci0gICAgICAgIGlmICh0cmFuc3BvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRPdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0TmFtZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbG9hZCB0cmFuc3BvcnQgZnJvbSBiaW5kaW5nLCBlaXRoZXIgZGVmaW4gaW4gQXhpczIuY29uZmlnICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm9yIHNldCBpdCBleHBsaWNpdGVseSBpbiBTZXJ2aWNlQ2xpbmV0Lk9wdGlvbnMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNlcnZpY2UgY2xpZW50IGJ5IGFzc3VtaW5nIGFuIGFub255bW91cyBzZXJ2aWNlIGFuZCBhbnkgb3RoZXIgbmVjZXNzYXJ5Ci0gICAgICogaW5mb3JtYXRpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcyhudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gYW5vbnltb3VzIGF4aXNTZXJ2aWNlIHdpdGggb25lIChhbm9ueW1vdXMpIG9wZXJhdGlvbiBmb3IgZWFjaCBNRVAgdGhhdCB3ZSBzdXBwb3J0Ci0gICAgICogZGVhbGluZyB3aXRoIGFub255bW91c2x5IHVzaW5nIHRoZSBjb252ZW5pZW5jZSBBUElzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbWludGVkIGFub255bW91cyBzZXJ2aWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBjcmVhdGVBbm9ueW1vdXNTZXJ2aWNlKCkgewotICAgICAgICAvLyBub3cgYWRkIGFub255bW91cyBvcGVyYXRpb25zIHRvIHRoZSBheGlzMiBzZXJ2aWNlIGZvciB1c2Ugd2l0aCB0aGUKLSAgICAgICAgLy8gc2hvcnRjdXQgY2xpZW50IEFQSS4gTk9URTogV2Ugb25seSBhZGQgdGhlIG9uZXMgd2Uga25vdyB3ZSdsbCB1c2UKLSAgICAgICAgLy8gbGF0ZXIgaW4gdGhlIGNvbnZlbmllbmNlIEFQSTsgaWYgeW91IHVzZQotICAgICAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIHRoZW4geW91IGNhbid0IGV4cGVjdCBhbnkgbWFnaWMhCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICBuZXcgQXhpc1NlcnZpY2UoQU5PTl9TRVJWSUNFICsgYW5vblNlcnZpY2VDb3VudGVyLmluY3JlbWVudEFuZEdldCgpKTsKLSAgICAgICAgUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24gcm9idXN0b3V0b29ubHlPcGVyYXRpb24gPSBuZXcgUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQU5PTl9ST0JVU1RfT1VUX09OTFlfT1ApOwotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24ocm9idXN0b3V0b29ubHlPcGVyYXRpb24pOwotCi0gICAgICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uIG91dE9ubHlPcGVyYXRpb24gPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgQU5PTl9PVVRfT05MWV9PUCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihvdXRPbmx5T3BlcmF0aW9uKTsKLQotICAgICAgICBPdXRJbkF4aXNPcGVyYXRpb24gb3V0SW5PcGVyYXRpb24gPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIEFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG91dEluT3BlcmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIEF4aXNDb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzQ29uZmlndXJhdGlvbiBnZXRBeGlzQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzLmF4aXNDb25maWcpIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzQ29uZmlnOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBBeGlzU2VydmljZSB0aGlzIGlzIGEgY2xpZW50IGZvci4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIHdoZW4gdGhlIEF4aXNTZXJ2aWNlIGlzCi0gICAgICogY3JlYXRlZCBhbm9ueW1vdXNseSBvciBmcm9tIFdTREwgYXMgb3RoZXJ3aXNlIHRoZSB1c2VyIGhhZCB0aGUgQXhpc1NlcnZpY2UgdG8gc3RhcnQgd2l0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGF4aXNTZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBiYXNpYyBjbGllbnQgY29uZmlndXJhdGlvbiByZWxhdGVkIHRvIHRoaXMgc2VydmljZSBpbnRlcmFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb25zIChub24tPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGJhc2ljIGNsaWVudCBjb25maWd1cmF0aW9uIGZyb20gdGhpcyBzZXJ2aWNlIGludGVyYWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBvcHRpb25zCi0gICAgICovCi0gICAgcHVibGljIE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gdG8gb3ZlcnJpZGUgdGhlIG5vcm1hbCBvcHRpb25zIHVzZWQgYnkgYW4gb3BlcmF0aW9uIGNsaWVudC4gQW55Ci0gICAgICogdmFsdWVzIHNldCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkIGZvciBlYWNoIGNsaWVudCwgd2l0aCB0aGUgc3RhbmRhcmQgdmFsdWVzIGZvcgotICAgICAqIHRoZSBjbGllbnQgc3RpbGwgdXNlZCBmb3IgYW55IHZhbHVlcyBub3Qgc2V0IGluIHRoZSBvdmVycmlkZSBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG92ZXJyaWRlT3B0aW9ucyB0aGUgT3B0aW9ucyB0byB1c2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZU9wdGlvbnMoT3B0aW9ucyBvdmVycmlkZU9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vdmVycmlkZU9wdGlvbnMgPSBvdmVycmlkZU9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiB1c2VkIHRvIG92ZXJyaWRlIHRoZSBub3JtYWwgb3B0aW9ucyBzZXQgYnkgYW4gb3BlcmF0aW9uIGNsaWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gb3ZlcnJpZGUgb3B0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zIGdldE92ZXJyaWRlT3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG92ZXJyaWRlT3B0aW9uczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2UgYSBtb2R1bGUgZm9yIHRoaXMgc2VydmljZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gZW5nYWdlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIFN0cmluZyB2ZXJzaW9uIGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoUU5hbWUgbW9kdWxlTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGVuZ2FnZU1vZHVsZShtb2R1bGVOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2UgYSBtb2R1bGUgZm9yIHRoaXMgc2VydmljZSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gZW5nYWdlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoU3RyaW5nIG1vZHVsZU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXhpc0NvbmZpZykgewotICAgICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBheGlzQ29uZmlnLmdldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbmFibGUgdG8gZW5nYWdlIG1vZHVsZSA6ICIgKyBtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2VuZ2FnZSBhIG1vZHVsZSBmb3IgdGhpcyBzZXJ2aWNlIGNsaWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZU5hbWUgbmFtZSBvZiBNb2R1bGUgdG8gZGlzZW5nYWdlCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBTdHJpbmcgdmVyc2lvbiBpbnN0ZWFkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlKFFOYW1lIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgZGlzZW5nYWdlTW9kdWxlKG1vZHVsZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2VuZ2FnZSBhIG1vZHVsZSBmb3IgdGhpcyBzZXJ2aWNlIGNsaWVudAotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZU5hbWUgbmFtZSBvZiBNb2R1bGUgdG8gZGlzZW5nYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcy5heGlzQ29uZmlnKSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYW4gYXJiaXRyYXJ5IFhNTCBlbGVtZW50IGFzIGEgaGVhZGVyIHRvIGJlIHNlbnQgd2l0aCBvdXRnb2luZyBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIHRvIGJlIHNlbnQgKG5vbi08Y29kZT5udWxsPC9jb2RlPikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoT01FbGVtZW50IGhlYWRlcikgewotICAgICAgICBpZiAoaGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXJzID0gbmV3IEFycmF5TGlzdDxPTUVsZW1lbnQ+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVhZGVycy5hZGQoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgU09BUCBIZWFkZXIgdG8gYmUgc2VudCB3aXRoIG91dGdvaW5nIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlciBoZWFkZXIgdG8gYmUgc2VudCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTT0FQSGVhZGVyQmxvY2sgaGVhZGVyKSB7Ci0gICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PE9NRWxlbWVudD4oKTsKLSAgICAgICAgfQotICAgICAgICBoZWFkZXJzLmFkZChoZWFkZXIpOwotICAgIH0KLQotICAgIC8qKiBSZW1vdmUgYWxsIGhlYWRlcnMgZm9yIG91dGdvaW5nIG1lc3NhZ2UuICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlSGVhZGVycygpIHsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgaGVhZGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBzaW1wbGUgaGVhZGVyIGNvbnRhaW5pbmcgc29tZSB0ZXh0IHRvIGJlIHNlbnQgd2l0aCBpbnRlcmFjdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZSBuYW1lIG9mIGhlYWRlciB0byBhZGQKLSAgICAgKiBAcGFyYW0gaGVhZGVyVGV4dCB0ZXh0IGNvbnRlbnQgZm9yIGhlYWRlcgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTdHJpbmdIZWFkZXIoUU5hbWUgaGVhZGVyTmFtZSwgU3RyaW5nIGhlYWRlclRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoaGVhZGVyTmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8ICIiLmVxdWFscyhoZWFkZXJOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhZGQgc3RyaW5nIGhlYWRlciwgeW91IGhhdmUgdG8gaGF2ZSBuYW1lc3BhY2VVUkkgZm9yIHRoZSBRTmFtZSIpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQoaGVhZGVyTmFtZSwgbnVsbCk7Ci0gICAgICAgIG9tRWxlbWVudC5zZXRUZXh0KGhlYWRlclRleHQpOwotICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYW4gYW5vbnltb3VzIG9wZXJhdGlvbiB3aXRoIGEgUm9idXN0IEluLU9ubHkgTUVQLiBUaGlzIG1ldGhvZCBqdXN0IHNlbmRzIHlvdXIKLSAgICAgKiBzdXBwbGllZCBYTUwgYW5kIHBvc3NpYmx5IHJlY2VpdmVzIGEgZmF1bHQuIEZvciBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZCBjcmVhdGUgYSBjbGllbnQKLSAgICAgKiBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgdXNlIHRoYXQgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIHNlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbSBYTUwgdG8gc2VuZAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdoaWxlIHNlbmRpbmcsIG9yIGlmIGEgZmF1bHQgaXMgcmVjZWl2ZWQgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICByZXNwb25zZSAocGVyIHRoZSBSb2J1c3QgSW4tT25seSBNRVApLgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUm9idXN0KE9NRWxlbWVudCBlbGVtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2VuZFJvYnVzdChBTk9OX1JPQlVTVF9PVVRfT05MWV9PUCwgZWxlbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlyZWN0bHkgaW52b2tlIGEgbmFtZWQgb3BlcmF0aW9uIHdpdGggYSBSb2J1c3QgSW4tT25seSBNRVAuIFRoaXMgbWV0aG9kIGp1c3Qgc2VuZHMgeW91cgotICAgICAqIHN1cHBsaWVkIFhNTCBhbmQgcG9zc2libHkgcmVjZWl2ZXMgYSBmYXVsdC4gRm9yIG1vcmUgY29udHJvbCwgeW91IGNhbiBpbnN0ZWFkIGNyZWF0ZSBhIGNsaWVudAotICAgICAqIGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgc2VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gbmFtZSBvZiBvcGVyYXRpb24gdG8gYmUgaW52b2tlZCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBlbGVtICAgICAgWE1MIHRvIHNlbmQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aGlsZSBzZW5kaW5nIGl0IG9yIGlmIGEgZmF1bHQgaXMgcmVjZWl2ZWQgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICByZXNwb25zZSAocGVyIHRoZSBSb2J1c3QgSW4tT25seSBNRVApLgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUm9idXN0KFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaWxsU09BUEVudmVsb3BlKG1jLCBlbGVtKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG1lcENsaWVudCA9IGNyZWF0ZUNsaWVudChvcGVyYXRpb24pOwotICAgICAgICBtZXBDbGllbnQuYWRkTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICBtZXBDbGllbnQuZXhlY3V0ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYW4gYW5vbnltb3VzIG9wZXJhdGlvbiB3aXRoIGFuIEluLU9ubHkgTUVQLiBUaGlzIG1ldGhvZCBqdXN0IHNlbmRzIHlvdXIKLSAgICAgKiBzdXBwbGllZCBYTUwgd2l0aG91dCB0aGUgcG9zc2liaWxpdHkgb2YgYW55IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZpY2UgKGV2ZW4gYW4gZXJyb3IgLSB0aG91Z2gKLSAgICAgKiB5b3UgY2FuIHN0aWxsIGdldCBjbGllbnQtc2lkZSBlcnJvcnMgc3VjaCBhcyAiSG9zdCBub3QgZm91bmQiKS4gRm9yIG1vcmUgY29udHJvbCwgeW91IGNhbgotICAgICAqIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgc2VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtIFhNTCB0byBzZW5kCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgZmYgc29tZXRoaW5nIGdvZXMgd3JvbmcgdHJ5aW5nIHRvIHNlbmQgdGhlIFhNTAotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaXJlQW5kRm9yZ2V0KE9NRWxlbWVudCBlbGVtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZmlyZUFuZEZvcmdldChBTk9OX09VVF9PTkxZX09QLCBlbGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYSBuYW1lZCBvcGVyYXRpb24gd2l0aCBhbiBJbi1Pbmx5IE1FUC4gVGhpcyBtZXRob2QganVzdCBzZW5kcyB5b3VyIHN1cHBsaWVkCi0gICAgICogWE1MIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IG9mIGFueSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2aWNlIChldmVuIGFuIGVycm9yIC0gdGhvdWdoIHlvdSBjYW4KLSAgICAgKiBzdGlsbCBnZXQgY2xpZW50LXNpZGUgZXJyb3JzIHN1Y2ggYXMgIkhvc3Qgbm90IGZvdW5kIikuIEZvciBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZAotICAgICAqIGNyZWF0ZSBhIGNsaWVudCBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgdXNlIHRoYXQgY2xpZW50IHRvIGV4ZWN1dGUgdGhlIHNlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIG5hbWUgb2Ygb3BlcmF0aW9uIHRvIGJlIGludm9rZWQgKG5vbi08Y29kZT5udWxsPC9jb2RlPikKLSAgICAgKiBAcGFyYW0gZWxlbSAgICAgIFhNTCB0byBzZW5kCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgdHJ5aW5nIHRvIHNlbmQgdGhlIFhNTAotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmaXJlQW5kRm9yZ2V0KFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBsb29rIHVwIHRoZSBhcHByb3ByaWF0ZSBheGlzb3AgYW5kIGNyZWF0ZSB0aGUgY2xpZW50Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBtZXBDbGllbnQgPSBjcmVhdGVDbGllbnQob3BlcmF0aW9uKTsKLSAgICAgICAgLy8gY3JlYXRlIGEgbWVzc2FnZSBjb250ZXh0IGFuZCBwdXQgdGhlIHBheWxvYWQgaW4gdGhlcmUgYWxvbmcgd2l0aCBhbnkKLSAgICAgICAgLy8gaGVhZGVycwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaWxsU09BUEVudmVsb3BlKG1jLCBlbGVtKTsKLSAgICAgICAgLy8gYWRkIHRoZSBtZXNzYWdlIGNvbnRleHQgdGhlcmUgYW5kIGhhdmUgaXQgZ28KLSAgICAgICAgbWVwQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgbWVwQ2xpZW50LmV4ZWN1dGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhbiBhbm9ueW1vdXMgb3BlcmF0aW9uIHdpdGggYW4gSW4tT3V0IE1FUC4gVGhpcyBtZXRob2Qgc2VuZHMgeW91ciBzdXBwbGllZAotICAgICAqIFhNTCBhbmQgcmVjZWl2ZXMgYSByZXNwb25zZS4gRm9yIG1vcmUgY29udHJvbCwgeW91IGNhbiBpbnN0ZWFkIGNyZWF0ZSBhIGNsaWVudCBmb3IgdGhlCi0gICAgICogb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgZXhjaGFuZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbSB0aGUgZGF0YSB0byBzZW5kIChiZWNvbWVzIHRoZSBjb250ZW50IG9mIFNPQVAgYm9keSkKLSAgICAgKiBAcmV0dXJuIHJlc3BvbnNlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHNlbmRSZWNlaXZlKE9NRWxlbWVudCBlbGVtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIHNlbmRSZWNlaXZlKEFOT05fT1VUX0lOX09QLCBlbGVtKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYSBuYW1lZCBvcGVyYXRpb25RTmFtZSB3aXRoIGFuIEluLU91dCBNRVAuIFRoaXMgbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQKLSAgICAgKiBYTUwgYW5kIHJlY2VpdmVzIGEgcmVzcG9uc2UuIEZvciBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZCBjcmVhdGUgYSBjbGllbnQgZm9yIHRoZQotICAgICAqIG9wZXJhdGlvblFOYW1lIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUgZXhjaGFuZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUgbmFtZSBvZiBvcGVyYXRpb25RTmFtZSB0byBiZSBpbnZva2VkIChub24tPGNvZGU+bnVsbDwvY29kZT4pCi0gICAgICogQHBhcmFtIHhtbFBheWxvYWQgICAgIHRoZSBkYXRhIHRvIHNlbmQgKGJlY29tZXMgdGhlIGNvbnRlbnQgb2YgU09BUCBib2R5KQotICAgICAqIEByZXR1cm4gcmVzcG9uc2UgT01FbGVtZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2VuZFJlY2VpdmUoUU5hbWUgb3BlcmF0aW9uUU5hbWUsIE9NRWxlbWVudCB4bWxQYXlsb2FkKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGZpbGxTT0FQRW52ZWxvcGUobWVzc2FnZUNvbnRleHQsIHhtbFBheWxvYWQpOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgb3BlcmF0aW9uQ2xpZW50ID0gY3JlYXRlQ2xpZW50KG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgb3BlcmF0aW9uQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgb3BlcmF0aW9uQ2xpZW50LmV4ZWN1dGUodHJ1ZSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlID0gb3BlcmF0aW9uQ2xpZW50Ci0gICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIGlmIChvcHRpb25zLmlzQ2FsbFRyYW5zcG9ydENsZWFudXAoKSkgewotICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RW52ZWxvcGUoKS5idWlsZCgpOwotICAgICAgICAgICAgY2xlYW51cFRyYW5zcG9ydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RseSBpbnZva2UgYW4gYW5vbnltb3VzIG9wZXJhdGlvbiB3aXRoIGFuIEluLU91dCBNRVAgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLgotICAgICAqIFRoaXMgbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQgWE1MIHdpdGggcmVzcG9uc2Ugbm90aWZpY2F0aW9uIHRvIHlvdXIgY2FsbGJhY2sgaGFuZGxlci4gRm9yCi0gICAgICogbW9yZSBjb250cm9sLCB5b3UgY2FuIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8KLSAgICAgKiBleGVjdXRlIHRoZSBleGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtICAgICB0aGUgZGF0YSB0byBzZW5kIChiZWNvbWVzIHRoZSBjb250ZW50IG9mIFNPQVAgYm9keSkKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgYSBDYWxsYmFjayB3aGljaCB3aWxsIGJlIG5vdGlmaWVkIHVwb24gY29tcGxldGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKiBAc2VlICNjcmVhdGVDbGllbnQoUU5hbWUpCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgQXhpc0NhbGxiYWNrIGludGVyZmFjZSByYXRoZXIgdGhhbiBDYWxsYmFjaywgd2hpY2ggaGFzIGJlZW4KLSAgICAgKiAgICAgICAgICAgICBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZFJlY2VpdmVOb25CbG9ja2luZyhPTUVsZW1lbnQgZWxlbSwgQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2VuZFJlY2VpdmVOb25CbG9ja2luZyhBTk9OX09VVF9JTl9PUCwgZWxlbSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhbiBhbm9ueW1vdXMgb3BlcmF0aW9uIHdpdGggYW4gSW4tT3V0IE1FUCB3aXRob3V0IHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UuCi0gICAgICogVGhpcyBtZXRob2Qgc2VuZHMgeW91ciBzdXBwbGllZCBYTUwgd2l0aCByZXNwb25zZSBub3RpZmljYXRpb24gdG8geW91ciBjYWxsYmFjayBoYW5kbGVyLiBGb3IKLSAgICAgKiBtb3JlIGNvbnRyb2wsIHlvdSBjYW4gaW5zdGVhZCBjcmVhdGUgYSBjbGllbnQgZm9yIHRoZSBvcGVyYXRpb24gYW5kIHVzZSB0aGF0IGNsaWVudCB0bwotICAgICAqIGV4ZWN1dGUgdGhlIGV4Y2hhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVsZW0gICAgIHRoZSBkYXRhIHRvIHNlbmQgKGJlY29tZXMgdGhlIGNvbnRlbnQgb2YgU09BUCBib2R5KQotICAgICAqIEBwYXJhbSBjYWxsYmFjayBhIENhbGxiYWNrIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgdXBvbiBjb21wbGV0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVjZWl2ZU5vbkJsb2NraW5nKE9NRWxlbWVudCBlbGVtLCBBeGlzQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc2VuZFJlY2VpdmVOb25CbG9ja2luZyhBTk9OX09VVF9JTl9PUCwgZWxlbSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhIG5hbWVkIG9wZXJhdGlvbiB3aXRoIGFuIEluLU91dCBNRVAgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLiBUaGlzCi0gICAgICogbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQgWE1MIHdpdGggcmVzcG9uc2Ugbm90aWZpY2F0aW9uIHRvIHlvdXIgY2FsbGJhY2sgaGFuZGxlci4gRm9yIG1vcmUKLSAgICAgKiBjb250cm9sLCB5b3UgY2FuIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUKLSAgICAgKiBleGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gbmFtZSBvZiBvcGVyYXRpb24gdG8gYmUgaW52b2tlZCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBlbGVtICAgICAgdGhlIGRhdGEgdG8gc2VuZCAoYmVjb21lcyB0aGUgY29udGVudCBvZiBTT0FQIGJvZHkpCi0gICAgICogQHBhcmFtIGNhbGxiYWNrICBhIENhbGxiYWNrIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgdXBvbiBjb21wbGV0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIHRoZSBBeGlzQ2FsbGJhY2sgaW50ZXJmYWNlIHJhdGhlciB0aGFuIENhbGxiYWNrLCB3aGljaCBoYXMgYmVlbgotICAgICAqICAgICAgICAgICAgIGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVjZWl2ZU5vbkJsb2NraW5nKFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0sIENhbGxiYWNrIGNhbGxiYWNrKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGZpbGxTT0FQRW52ZWxvcGUobWMsIGVsZW0pOwotICAgICAgICBPcGVyYXRpb25DbGllbnQgbWVwQ2xpZW50ID0gY3JlYXRlQ2xpZW50KG9wZXJhdGlvbik7Ci0gICAgICAgIC8vIGhlcmUgYSBibG9ja2luZyBpbnZvY2F0aW9uIGhhcHBlbnMgaW4gYSBuZXcgdGhyZWFkLCBzbyB0aGUKLSAgICAgICAgLy8gcHJvZ2FtbWluZyBtb2RlbCBpcyBub24gYmxvY2tpbmcKLSAgICAgICAgbWVwQ2xpZW50LnNldENhbGxiYWNrKGNhbGxiYWNrKTsKLSAgICAgICAgbWVwQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KG1jKTsKLSAgICAgICAgbWVwQ2xpZW50LmV4ZWN1dGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpcmVjdGx5IGludm9rZSBhIG5hbWVkIG9wZXJhdGlvbiB3aXRoIGFuIEluLU91dCBNRVAgd2l0aG91dCB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLiBUaGlzCi0gICAgICogbWV0aG9kIHNlbmRzIHlvdXIgc3VwcGxpZWQgWE1MIHdpdGggcmVzcG9uc2Ugbm90aWZpY2F0aW9uIHRvIHlvdXIgY2FsbGJhY2sgaGFuZGxlci4gRm9yIG1vcmUKLSAgICAgKiBjb250cm9sLCB5b3UgY2FuIGluc3RlYWQgY3JlYXRlIGEgY2xpZW50IGZvciB0aGUgb3BlcmF0aW9uIGFuZCB1c2UgdGhhdCBjbGllbnQgdG8gZXhlY3V0ZSB0aGUKLSAgICAgKiBleGNoYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gbmFtZSBvZiBvcGVyYXRpb24gdG8gYmUgaW52b2tlZCAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEBwYXJhbSBlbGVtICAgICAgdGhlIGRhdGEgdG8gc2VuZCAoYmVjb21lcyB0aGUgY29udGVudCBvZiBTT0FQIGJvZHkpCi0gICAgICogQHBhcmFtIGNhbGxiYWNrICBhIENhbGxiYWNrIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgdXBvbiBjb21wbGV0aW9uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqIEBzZWUgI2NyZWF0ZUNsaWVudChRTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVjZWl2ZU5vbkJsb2NraW5nKFFOYW1lIG9wZXJhdGlvbiwgT01FbGVtZW50IGVsZW0sIEF4aXNDYWxsYmFjayBjYWxsYmFjaykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBmaWxsU09BUEVudmVsb3BlKG1jLCBlbGVtKTsKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG1lcENsaWVudCA9IGNyZWF0ZUNsaWVudChvcGVyYXRpb24pOwotICAgICAgICAvLyBoZXJlIGEgYmxvY2tpbmcgaW52b2NhdGlvbiBoYXBwZW5zIGluIGEgbmV3IHRocmVhZCwgc28gdGhlCi0gICAgICAgIC8vIHByb2dhbW1pbmcgbW9kZWwgaXMgbm9uIGJsb2NraW5nCi0gICAgICAgIG1lcENsaWVudC5zZXRDYWxsYmFjayhjYWxsYmFjayk7Ci0gICAgICAgIG1lcENsaWVudC5hZGRNZXNzYWdlQ29udGV4dChtYyk7Ci0gICAgICAgIG1lcENsaWVudC5leGVjdXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gb3BlcmF0aW9uIGNsaWVudCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkuIFRoaXMgbWV0aG9kCi0gICAgICogY3JlYXRlcyBhIGZ1bGwtZnVuY3Rpb24gTUVQIGNsaWVudCB3aGljaCBjYW4gYmUgdXNlZCB0byBleGNoYW5nZSBtZXNzYWdlcyBmb3IgYSBzcGVjaWZpYwotICAgICAqIG9wZXJhdGlvbi4gSXQgY29uZmlndXJlcyB0aGUgY29uc3RydWN0ZWQgb3BlcmF0aW9uIGNsaWVudCB0byB1c2UgdGhlIGN1cnJlbnQgbm9ybWFsIGFuZAotICAgICAqIG92ZXJyaWRlIG9wdGlvbnMuIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW50ZXJuYWxseSwgYW5kIGFsc28gYnkgZ2VuZXJhdGVkIGNsaWVudCBzdHViIGNvZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUgcXVhbGlmaWVkIG5hbWUgb2Ygb3BlcmF0aW9uIChsb2NhbCBuYW1lIGlzIG9wZXJhdGlvbiBuYW1lLCBuYW1lc3BhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVVJJIGlzIGp1c3QgdGhlIGVtcHR5IHN0cmluZykKLSAgICAgKiBAcmV0dXJuIGNsaWVudCBjb25maWd1cmVkIHRvIHRhbGsgdG8gdGhlIGdpdmVuIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBvcGVyYXRpb24gaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNsaWVudCBjcmVhdGVDbGllbnQoUU5hbWUgb3BlcmF0aW9uUU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBJZiB3ZSdyZSBjb25maWd1cmVkIHRvIGRvIHNvLCBjbGVhbiB1cCB0aGUgbGFzdCBPcGVyYXRpb25Db250ZXh0ICh0aHVzCi0gICAgICAgIC8vIHJlbGVhc2luZyBpdHMgcmVzb3VyY2VzKSBlYWNoIHRpbWUgd2UgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWUoZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KEFVVE9fT1BFUkFUSU9OX0NMRUFOVVApLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICFnZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpIHsKLSAgICAgICAgICAgIGNsZWFudXBUcmFuc3BvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoIm9wZXJhdGlvbm5vdGZvdW5kIiwgb3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCB0aGUgb3B0aW9uIHByb3BlcnRpZXMgdG8gdGhlIHNlcnZpY2UgY29udGV4dAotICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICBmb3IgKE9iamVjdCBvIDogb3B0aW9ucy5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpbzsKLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KGtleSwgb3B0aW9ucy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgICAgIE9wZXJhdGlvbkNsaWVudCBvcGVyYXRpb25DbGllbnQgPSBheGlzT3BlcmF0aW9uLmNyZWF0ZUNsaWVudChzZXJ2aWNlQ29udGV4dCwgb3B0aW9ucyk7Ci0KLSAgICAgICAgLy8gaWYgb3ZlcmlkZSBvcHRpb25zIGhhdmUgYmVlbiBzZXQsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBtYWtlIHN1cmUKLSAgICAgICAgLy8gdGhvc2Ugb3B0aW9ucyBvdmVycmlkZSB0aGUgb3B0aW9ucyBvZiBldmVuIHRoZSBvcGVyYXRpb24gY2xpZW50LiBTbywKLSAgICAgICAgLy8gd2hhdCB3ZSBkbyBpcyBzd2l0Y2ggdGhlIHBhcmVudHMgYXJvdW5kIHRvIG1ha2UgdGhhdCB3b3JrLgotICAgICAgICBpZiAob3ZlcnJpZGVPcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIG92ZXJyaWRlT3B0aW9ucy5zZXRQYXJlbnQob3BlcmF0aW9uQ2xpZW50LmdldE9wdGlvbnMoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25DbGllbnQuc2V0T3B0aW9ucyhvdmVycmlkZU9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25DbGllbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBTT0FQIGZhY3RvcnkgdG8gdXNlIGRlcGVuZGluZyBvbiB3aGF0IG9wdGlvbnMgaGF2ZSBiZWVuIHNldC4gSWYgdGhlIFNPQVAgdmVyc2lvbgotICAgICAqIGNhbiBub3QgYmUgc2VlbiBpbiB0aGUgb3B0aW9ucywgdmVyc2lvbiAxLjEgaXMgdGhlIGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBTT0FQIGZhY3RvcnkKLSAgICAgKiBAc2VlIE9wdGlvbnMjc2V0U29hcFZlcnNpb25VUkkoU3RyaW5nKQotICAgICAqLwotICAgIHByaXZhdGUgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoKSB7Ci0gICAgICAgIFN0cmluZyBzb2FwVmVyc2lvblVSSSA9IG9wdGlvbnMuZ2V0U29hcFZlcnNpb25VUkkoKTsKLSAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBWZXJzaW9uVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1ha2UgdGhlIFNPQVAgMS4xIHRoZSBkZWZhdWx0IFNPQVAgdmVyc2lvbgotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByZXBhcmUgYSBTT0FQIGVudmVsb3BlIHdpdGggdGhlIHN0dWZmIHRvIGJlIHNlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIG1lc3NhZ2UgY29udGV4dCB0byBiZSBmaWxsZWQKLSAgICAgKiBAcGFyYW0geG1sUGF5bG9hZCAgICAgdGhlIHBheWxvYWQgY29udGVudAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxTT0FQRW52ZWxvcGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NRWxlbWVudCB4bWxQYXlsb2FkKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBnZXRTT0FQRmFjdG9yeSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKHhtbFBheWxvYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgZW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHhtbFBheWxvYWQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEhlYWRlcnNUb0VudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkIGFsbCBjb25maWd1cmVkIGhlYWRlcnMgdG8gYSBTT0FQIGVudmVsb3BlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudmVsb3BlIHRoZSBTT0FQRW52ZWxvcGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGhlYWRlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXJzVG9FbnZlbG9wZShTT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBoZWFkZXIgOiBoZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlci5hZGRDaGlsZCgoT01FbGVtZW50KWhlYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIGZvciB0aGlzIGNsaWVudCB1c2luZyBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRyYW5zcG9ydCB0cmFuc3BvcnQgbmFtZSAobm9uLTxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIEByZXR1cm4gbG9jYWwgZW5kcG9pbnQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldE15RVBSKFN0cmluZyB0cmFuc3BvcnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHQuZ2V0TXlFUFIodHJhbnNwb3J0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGVuZHBvaW50IHJlZmVyZW5jZSBmb3IgdGhlIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlcnZpY2UgZW5kcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0VGFyZ2V0RVBSKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHQuZ2V0VGFyZ2V0RVBSKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBlbmRwb2ludCByZWZlcmVuY2UgZm9yIHRoZSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldEVwciB0aGUgRVBSIHRoaXMgU2VydmljZUNsaWVudCBzaG91bGQgdGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0RVBSKEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVwcikgewotICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRUYXJnZXRFUFIodGFyZ2V0RXByKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFcHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbGFzdCBPcGVyYXRpb25Db250ZXh0IHRoYXQgd2FzIGludm9rZWQgYnkgdGhpcyBTZXJ2aWNlQ2xpZW50Ci0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgZ2V0TGFzdE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dC5nZXRMYXN0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBvciBub3QgdG8gY2FjaGUgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIGNhY2hpbmdPcENvbnRleHQgdHJ1ZSBpZiB3ZSBzaG91bGQgaG9sZCBvbnRvIHRoZSBsYXN0IGFjdGl2ZSBPcGVyYXRpb25Db250ZXh0Ci0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dChib29sZWFuIGNhY2hpbmdPcENvbnRleHQpIHsKLSAgICAgICAgc2VydmljZUNvbnRleHQuc2V0Q2FjaGluZ09wZXJhdGlvbkNvbnRleHQoY2FjaGluZ09wQ29udGV4dCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlcnZpY2UgY29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBnZXRTZXJ2aWNlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbGVhbnVwKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYW4gdXAgY29uZmlndXJhdGlvbiBjcmVhdGVkIHdpdGggdGhpcyBjbGllbnQuIENhbGwgdGhpcyBtZXRob2Qgd2hlbiB5b3UncmUgZG9uZSB1c2luZyB0aGUKLSAgICAgKiBjbGllbnQsIGluIG9yZGVyIHRvIGRpc2NhcmQgYW55IGFzc29jaWF0ZWQgcmVzb3VyY2VzLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gaWYgYSBjb25maWd1cmF0aW9uIGNvbnRleHQgd2FzIGNyZWF0ZWQgZm9yIHRoaXMgY2xpZW50IHRoZXJlJ2xsIGFsc28KLSAgICAgICAgLy8gIGJlIGEgc2VydmljZSBncm91cCwgc28gZGlzY2FyZCB0aGF0Ci0gICAgICAgIGlmICghY3JlYXRlQ29uZmlnQ3R4KSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXNnID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0U2VydmljZUdyb3VwKHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgaWYgKChhc2cgIT0gbnVsbCkgJiYgcmVtb3ZlQXhpc1NlcnZpY2UpIHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5yZW1vdmVTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cFRyYW5zcG9ydCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBmaW5hbCBPcGVyYXRpb25Db250ZXh0IGxhc3RPcGVyYXRpb25Db250ZXh0ID0gZ2V0TGFzdE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgaWYgKGxhc3RPcGVyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2VDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgbGFzdE9wZXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAob3V0TWVzc2FnZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2VDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpLmdldFNlbmRlcigpLmNsZWFudXAob3V0TWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoZSBTZXJ2aWNlQ2xpZW50IHRvIGludGVyYWN0IHdpdGggdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaWJlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogQXhpc1NlcnZpY2Ugb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIHRoZSBBeGlzU2VydmljZSB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBXZWIgc2VydmljZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29uZmlndXJpbmcgdGhlIFNlcnZpY2VDbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBeGlzRmF1bHQ/Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBeGlzU2VydmljZSBpcyBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMuYXhpc0NvbmZpZykgewotICAgICAgICAgICAgYXhpc0NvbmZpZy5yZW1vdmVTZXJ2aWNlKHRoaXMuYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xpZW50U2lkZSh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIC8qKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKSAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhhc2hDb2RlOwotICAgIH0KLQotICAgIC8qKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpICovCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2VydmljZUNsaWVudCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZpbmFsIFNlcnZpY2VDbGllbnQgb3RoZXIgPSAoU2VydmljZUNsaWVudClvYmo7Ci0gICAgICAgIHJldHVybiBoYXNoQ29kZSA9PSBvdGhlci5oYXNoQ29kZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvU3R1Yi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9TdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTJiYzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9TdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dEluQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IZWFkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBnZW5lcmF0ZWQgY2xpZW50IHN0dWJzLiBUaGlzIGRlZmluZXMgc2V2ZXJhbCBjbGllbnQgQVBJCi0gKiAoPGNvZGU+cHVibGljPC9jb2RlPikgbWV0aG9kcyBzaGFyZWQgYmV0d2VlbiBhbGwgdHlwZXMgb2Ygc3R1YnMsIGFsb25nIHdpdGgKLSAqIHNvbWUgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiBtZXRob2RzIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIGFjdHVhbCBzdHViCi0gKiBpbXBsZW1lbnRhdGlvbiBjb2RlLiBUaGUgY2xpZW50IEFQSSBtZXRob2QgbmFtZXMgc3RhcnQgd2l0aCBhIGxlYWRpbmcKLSAqIHVuZGVyc2NvcmUgY2hhcmFjdGVyIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3R1YiB7Ci0KLSAgICBwcm90ZWN0ZWQgQXhpc1NlcnZpY2UgX3NlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBtb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLSAgICBwcm90ZWN0ZWQgU2VydmljZUNsaWVudCBfc2VydmljZUNsaWVudDsKLQotICAgIC8qKgotICAgICAqIEdldCBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoaXMgc3R1Yi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VydmljZSBjbGllbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUNsaWVudCBfZ2V0U2VydmljZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIF9zZXJ2aWNlQ2xpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoaXMgc3R1Yi4gT25jZSBzZXQsIHRoZQotICAgICAqIHNlcnZpY2UgY2xpZW50IGlzIG93bmVkIGJ5IHRoaXMgc3R1YiBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHdoZW4gdXNlIG9mIHRoZSBzdHViIGlzIGRvbmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gX3NlcnZpY2VDbGllbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBfc2V0U2VydmljZUNsaWVudChTZXJ2aWNlQ2xpZW50IF9zZXJ2aWNlQ2xpZW50KSB7Ci0gICAgICAgIHRoaXMuX3NlcnZpY2VDbGllbnQgPSBfc2VydmljZUNsaWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTT0FQIG1lc3NhZ2UgZW52ZWxvcGUgdXNpbmcgdGhlIHN1cHBsaWVkIG9wdGlvbnMuCi0gICAgICogVE9ETyBnZW5lcmF0ZWQgc3R1YiBjb2RlIHNob3VsZCB1c2UgdGhpcyBtZXRob2QsIG9yIHNpbWlsYXIgbWV0aG9kIHRha2luZwotICAgICAqIGFuIG9wZXJhdGlvbiBjbGllbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcHRpb25zCi0gICAgICogQHJldHVybiBnZW5lcmF0ZWQKLSAgICAgKiBAdGhyb3dzIFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTT0FQRW52ZWxvcGUgY3JlYXRlRW52ZWxvcGUoT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0RmFjdG9yeShvcHRpb25zLmdldFNvYXBWZXJzaW9uVVJJKCkpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBBeGlvbSBmYWN0b3J5IGFwcHJvcHJpYXRlIHRvIHNlbGVjdGVkIFNPQVAgdmVyc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwVmVyc2lvblVSSQotICAgICAqIEByZXR1cm4gZmFjdG9yeQotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU09BUEZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgc29hcFZlcnNpb25VUkkpIHsKLQotICAgICAgICBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMoc29hcFZlcnNpb25VUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBWZXJzaW9uVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJ1bmtub3duc29hcHZlcnNpb24iKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5hbGl6ZSBtZXRob2QgY2FsbGVkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4gVGhpcyBpcyBvdmVycmlkZGVuIHRvCi0gICAgICogc3VwcG9ydCBjbGVhbnVwIG9mIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKLSAgICAgICAgY2xlYW51cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFudXAgYXNzb2NpYXRlZCByZXNvdXJjZXMuIFRoaXMgcmVtb3ZlcyB0aGUgYXhpcyBzZXJ2aWNlIGZyb20gdGhlCi0gICAgICogY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBzZXJ2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgc2VydmljZSBjbGllbnQgaXQgc2VsZi4KLSAgICAgICAgX3NlcnZpY2VDbGllbnQuY2xlYW51cCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIGVwciBvZiB0aGUgc2VydmljZSBjbGllbnQgdG8gZ2l2ZW4gdmFsdWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGRyZXNzCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTZXJ2aWNlQ2xpZW50RVBSKFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSRnJvbVNlcnZpY2VDbGllbnQgPSBfc2VydmljZUNsaWVudC5nZXRPcHRpb25zKCkuZ2V0VG8oKTsKLSAgICAgICAgdG9FUFJGcm9tU2VydmljZUNsaWVudC5zZXRBZGRyZXNzKGFkZHJlc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGFkZCBhbiBodHRwIGhlYWRlciB3aXRoIG5hbWUgYW5kIHZhbHVlIHRvIG1lc3NhZ2UgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRIdHRwSGVhZGVyKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgamF2YS5sYW5nLk9iamVjdCBoZWFkZXJzT2JqID0gbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMpOwotICAgICAgICBpZiAoaGVhZGVyc09iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoZWFkZXJzT2JqID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICBqYXZhLnV0aWwuTGlzdCBoZWFkZXJzID0gKGphdmEudXRpbC5MaXN0KSBoZWFkZXJzT2JqOwotICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOwotICAgICAgICBoZWFkZXIuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgaGVhZGVyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgaGVhZGVycy5hZGQoaGVhZGVyKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMsIGhlYWRlcnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldHMgdGhlIHByb3BlcnR5a2V5IGFuZCBwcm9wZXJ0eVZhbHVlIGFzIGEgcGFpciB0byBvcGVyYXRpb24gY2xpZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uQ2xpZW50Ci0gICAgICogQHBhcmFtIHByb3BlcnR5S2V5Ci0gICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoT3BlcmF0aW9uQ2xpZW50IG9wZXJhdGlvbkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0gICAgICAgIG9wZXJhdGlvbkNsaWVudC5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHByb3BlcnR5VmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoT3BlcmF0aW9uQ2xpZW50IG9wZXJhdGlvbkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgYWRkUHJvcGVydHlUb09wZXJhdGlvbkNsaWVudChvcGVyYXRpb25DbGllbnQsIHByb3BlcnR5S2V5LCBuZXcgQm9vbGVhbih2YWx1ZSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5VG9PcGVyYXRpb25DbGllbnQoT3BlcmF0aW9uQ2xpZW50IG9wZXJhdGlvbkNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgewotICAgICAgICBhZGRQcm9wZXJ0eVRvT3BlcmF0aW9uQ2xpZW50KG9wZXJhdGlvbkNsaWVudCwgcHJvcGVydHlLZXksIG5ldyBJbnRlZ2VyKHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0TXVzdFVuZGVyc3RhbmQoT01FbGVtZW50IGhlYWRlckVsZW1lbnQsIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01BdHRyaWJ1dGUgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGUgPQotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShTT0FQMTJDb25zdGFudHMuQVRUUl9NVVNUVU5ERVJTVEFORCwgb21OYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIik7Ci0gICAgICAgIGhlYWRlckVsZW1lbnQuYWRkQXR0cmlidXRlKG11c3RVbmRlcnN0YW5kQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRIZWFkZXIoT01FbGVtZW50IG9tRWxlbWVudFRvYWRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtdXN0VW5kZXJzdGFuZCl7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2sgPQotICAgICAgICAgICAgICAgIGVudmVsb3AuZ2V0SGVhZGVyKCkuYWRkSGVhZGVyQmxvY2sob21FbGVtZW50VG9hZGQuZ2V0TG9jYWxOYW1lKCksb21FbGVtZW50VG9hZGQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBzb2FwSGVhZGVyQmxvY2suc2V0TXVzdFVuZGVyc3RhbmQobXVzdFVuZGVyc3RhbmQpOwotICAgICAgICBPTU5vZGUgb21Ob2RlID0gbnVsbDsKLQotICAgICAgICAvLyBhZGQgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gb21FbGVtZW50VG9hZGQuZ2V0Q2hpbGRyZW4oKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICBvbU5vZGUgPSAoT01Ob2RlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICBzb2FwSGVhZGVyQmxvY2suYWRkQ2hpbGQob21Ob2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9NQXR0cmlidXRlIG9tYXRyaWJ1dGUgPSBudWxsOwotICAgICAgICAvLyBhZGQgYXR0cmlidXRlcwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbUVsZW1lbnRUb2FkZC5nZXRBbGxBdHRyaWJ1dGVzKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICAgb21hdHJpYnV0ZSA9IChPTUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgc29hcEhlYWRlckJsb2NrLmFkZEF0dHJpYnV0ZShvbWF0cmlidXRlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkSGVhZGVyKE9NRWxlbWVudCBvbUVsZW1lbnRUb2FkZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3ApewotICAgICAgICBhZGRIZWFkZXIob21FbGVtZW50VG9hZGQsZW52ZWxvcCxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQW5vbnltb3VzT3BlcmF0aW9ucygpewotICAgICAgICBSb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbiByb2J1c3RvdXRvb25seU9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IFJvYnVzdE91dE9ubHlBeGlzT3BlcmF0aW9uKFNlcnZpY2VDbGllbnQuQU5PTl9ST0JVU1RfT1VUX09OTFlfT1ApOwotICAgICAgICBfc2VydmljZS5hZGRPcGVyYXRpb24ocm9idXN0b3V0b29ubHlPcGVyYXRpb24pOwotCi0gICAgICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uIG91dE9ubHlPcGVyYXRpb24gPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9PTkxZX09QKTsKLSAgICAgICAgX3NlcnZpY2UuYWRkT3BlcmF0aW9uKG91dE9ubHlPcGVyYXRpb24pOwotCi0gICAgICAgIE91dEluQXhpc09wZXJhdGlvbiBvdXRJbk9wZXJhdGlvbiA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9JTl9PUCk7Ci0gICAgICAgIF9zZXJ2aWNlLmFkZE9wZXJhdGlvbihvdXRJbk9wZXJhdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1dTRExCYXNlZFBvbGljeVByb2Nlc3Nvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9XU0RMQmFzZWRQb2xpY3lQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1YzlkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L1dTRExCYXNlZFBvbGljeVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFdTRExCYXNlZFBvbGljeVByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIG5zMm1vZHVsZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIFdTRExCYXNlZFBvbGljeVByb2Nlc3NvcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgpIHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNDb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKS52YWx1ZXMoKQotICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nW10gbmFtZXNwYWNlcyA9IGF4aXNNb2R1bGUuZ2V0U3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcygpOwotCi0gICAgICAgICAgICBpZiAobmFtZXNwYWNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBtb2R1bGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gbnMybW9kdWxlcy5nZXQobmFtZXNwYWNlc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwotICAgICAgICAgICAgICAgICAgICBuczJtb2R1bGVzLnB1dChuYW1lc3BhY2VzW2ldLCBtb2R1bGVMaXN0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGVMaXN0ID0gKEFycmF5TGlzdCkgb2JqOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2R1bGVMaXN0LmFkZChheGlzTW9kdWxlKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJ2aWNlUG9saWNlcyhBeGlzU2VydmljZSBheGlzU2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgLy8gVE9ETyB3ZSBzdXBwb3J0IG9ubHkgb3BlcmF0aW9uIGxldmVsIFBvbGljeSBub3cKLSAgICAgICAgICAgIGNvbmZpZ3VyZU9wZXJhdGlvblBvbGljZXMoYXhpc09wKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZU9wZXJhdGlvblBvbGljZXMoQXhpc09wZXJhdGlvbiBvcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSA9IG9wLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IHBvbGljeUluY2x1ZGUuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0gICAgICAgIGlmIChwb2xpY3kgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBwb2xpY3kgPSAoUG9saWN5KSBwb2xpY3kubm9ybWFsaXplKHBvbGljeUluY2x1ZGUKLSAgICAgICAgICAgICAgICAgICAgLmdldFBvbGljeVJlZ2lzdHJ5KCksIGZhbHNlKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvbGljeS5nZXRBbHRlcm5hdGl2ZXMoKTsgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIExpc3QgbmFtZXNwYWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb24gYXNzZXJ0aW9uOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGaXN0IHdlIGNvbXB1dGUgdGhlIHNldCBvZiBkaXN0aW5jdCBuYW1lc3BhY2VzIG9mIGFzc2VydGlvbnMKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGlzIHBhcnRpY3VsYXIgcG9saWN5IGFsdGVybmF0aXZlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXNzZXJ0aW9ucyA9ICgoTGlzdCkgaXRlcmF0b3IubmV4dCgpKS5pdGVyYXRvcigpOyBhc3NlcnRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbiA9IChBc3NlcnRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgbmFtZSA9IGFzc2VydGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlTGlzdC5jb250YWlucyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VMaXN0LmFkZChuYW1lc3BhY2VVUkkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBOb3cgd2UgY29tcHV0ZSBhbGwgdGhlIG1vZHVsZXMgdGhhdCBhcmUgYXJlIGludm9sdmVkIGluCi0gICAgICAgICAgICAgICAgICogcHJvY2VzcyBhc3NlcnRpb25zIHRoYXQgYmVsb25ncyB0byBhbnkgb2YgdGhlIG5hbWVzcGFjZXMgb2YKLSAgICAgICAgICAgICAgICAgKiBsaXN0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExpc3QgbW9kdWxlc1RvRW5nYWdlOwotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBuYW1lc3BhY2VzID0gbmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIG5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzVG9FbmdhZ2UgPSAoTGlzdCkgbnMybW9kdWxlcy5nZXQobmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlc1RvRW5nYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGVyZSBpc24ndCBhIHNpbmdsZSBtb2R1bGUgdGhhdCBpcyBub3QgaW50ZXJlc3RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgYXNzZXJ0aW9ucyB0aGF0IGJlbG9uZ3MgdG8gYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHdlIHNpbXBseSBpZ25vcmUgaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oImNhbm5vdCBmaW5kIGFueSBtb2R1bGVzIHRvIHByb2Nlc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZXNwYWNlICsgInR5cGUgYXNzZXJ0aW9ucyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTG9nIHRoaXMgLi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmdhZ2VNb2R1bGVzVG9BeGlzRGVzY3JpcHRpb24obW9kdWxlc1RvRW5nYWdlLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICogV2Ugb25seSBwaWNrIHRoZSBmaXJzdCBwb2xpY3kgYWx0ZXJuYXRpdmUuIE90aGVyIHBvbGljeQotICAgICAgICAgICAgICAgICogYWx0ZXJuYXRpdmVzIGFyZSBpZ25vcmVkLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2VzIHRoZSBsaXN0IG9mIE1vZHVsZXMgdG8gdGhlIHNwZWNpZmllZCBBeGlzRGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGVuZ2FnZU1vZHVsZXNUb0F4aXNEZXNjcmlwdGlvbihMaXN0IG1vZHVsZXNUb0VuZ2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGU7Ci0gICAgICAgIFN0cmluZyBtb2R1bGVOYW1lOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVzVG9FbmdhZ2UuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXhpc01vZHVsZSA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBtb2R1bGVOYW1lID0gYXhpc01vZHVsZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIGlmICghYXhpc0Rlc2NyaXB0aW9uLmlzRW5nYWdlZChtb2R1bGVOYW1lKSkgewotICAgICAgICAgICAgICAgIGF4aXNEZXNjcmlwdGlvbi5lbmdhZ2VNb2R1bGUoYXhpc01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgKGF4aXNNb2R1bGUuZ2V0TW9kdWxlKCkpLmVuZ2FnZU5vdGlmeShheGlzRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9hc3luYy9Bc3luY1Jlc3VsdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsaWVudC9hc3luYy9Bc3luY1Jlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlhNzJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQXN5bmNSZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIGludm9jYXRpb24uIFRoZSBBeGlzMgotICogZW5naW5lIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHtAbGluawotICogQ2FsbGJhY2sjb25Db21wbGV0ZShBc3luY1Jlc3VsdCl9IG1ldGhvZCB3aGVuIHRoZSBvcGVyYXRpb24gY29tcGxldGVzCi0gKiBzdWNjZXNzZnVsbHkuCi0gKgotICogQGRlcHJlY2F0ZWQgcGxlYXNlIHNlZSBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2suCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY1Jlc3VsdCB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIGNvbnRleHQgdGhhdCBzdXBwbGllcyB0aGUgcmVzdWx0IGluZm9ybWF0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcmVzdWx0OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdWx0IG1lc3NhZ2UgY29udGV4dCBwcm92aWRpbmcgcmVzdWx0IGluZm9ybWF0aW9uCi0gICAgICogICAgICAgICAgICAgICAoPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcmVzcG9uc2UpCi0gICAgICovCi0gICAgcHVibGljIEFzeW5jUmVzdWx0KE1lc3NhZ2VDb250ZXh0IHJlc3VsdCkgewotICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNPQVAgRW52ZWxvcGUgZm9yIHRoZSByZXNwb25zZSBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiBFbnZlbG9wZSAoPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldFJlc3BvbnNlRW52ZWxvcGUoKSB7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXRFbnZlbG9wZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbXBsZXRlIG1lc3NhZ2UgY29udGV4dCBmb3IgdGhlIHJlc3BvbnNlLgotICAgICAqCi0gICAgICogQHJldHVybiBjb250ZXh0ICg8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lKQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRSZXNwb25zZU1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQXhpc0NhbGxiYWNrLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L2FzeW5jL0F4aXNDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY0NWQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQXhpc0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXNDYWxsYmFjayB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSAocmVzcG9uc2UpIE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBvbk1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gYSBmYXVsdCBtZXNzYWdlIGlzIHJlY2VpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIE1lc3NhZ2VDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZhdWx0LgotICAgICAqLwotICAgIHZvaWQgb25GYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgT05MWSB3aGVuIGFuIGludGVybmFsIHByb2Nlc3NpbmcgZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlIHRoZSBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtCi0gICAgICovCi0gICAgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIE1FUCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCBxdWl0ZSBsaWtlIGEgZmluYWxseSBibG9jay4KLSAgICAgKi8KLSAgICB2b2lkIG9uQ29tcGxldGUoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQ2FsbGJhY2suamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbGllbnQvYXN5bmMvQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3ZGRmYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2xpZW50L2FzeW5jL0NhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFzeW5jaHJvbm91cyBjbGllbnQgY2FsbGJhY2sgaGFuZGxlci4gVGhlIGFwcGxpY2F0aW9uIGNvZGUKLSAqIG5lZWRzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIChhY3R1YWxseSBhbiBpbnN0YW5jZSBvZiBhCi0gKiBzdWJjbGFzcywgc2luY2UgdGhpcyBiYXNlIGNsYXNzIGNhbm5vdCBiZSB1c2VkIGRpcmVjdGx5KSBhbmQgcGFzcyBpdCB0byB0aGUKLSAqIGdlbmVyYXRlZCBzdGFydFhYWCBjbGllbnQgc3R1YiBtZXRob2Qgd2hlbiBpbml0aWF0aW5nIGFuIGFzeW5jaHJvbm91cwotICogb3BlcmF0aW9uLiBUaGUgQXhpczIgY29kZSB0aGVuIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MKLSAqIHtAbGluayAjc2V0Q29tcGxldGUoYm9vbGVhbil9LCBhbmQgZWl0aGVyIHtAbGluayAjb25Db21wbGV0ZShBc3luY1Jlc3VsdCl9Ci0gKiBvciB7QGxpbmsgI29uRXJyb3IoRXhjZXB0aW9uKX0gd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4KLSAqCi0gKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIEF4aXNDYWxsYmFjayBpbnN0ZWFkLCB0aGlzIGNsYXNzIGlzIGRlcHJlY2F0ZWQgYXMgb2YgMS4zCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBjb21wbGV0ZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZTsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpcyBpbnZva2VkIGJ5IEF4aXMyIG9uY2UgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZAotICAgICAqIHN1Y2Nlc3NmdWxseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW52b2tlZCBieSBBeGlzMiBpZiB0aGUgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBmYWlscy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLiBUeXBpY2FsbHkgdGhpcyBpcwotICAgICAqIHVzZWQgZm9yIHBvbGxpbmcuIGUuZy4KLSAgICAgKiA8Y29kZT4KLSAgICAgKiA8cHJlPgotICAgICAqICAgICAgICAgIHdoaWxlKCFjYWxsYmFjay5pc0NvbXBsZXRlKCkpewotICAgICAqICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgKiAgICAgICAgICB9Ci0gICAgICogICAgICAgICAgZG8gd2hhdGV2ZXIgdSBuZWVkIHRvIGRvCi0gICAgICogICAgICA8L3ByZT4KLSAgICAgKiA8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpbnZva2VkIGJ5IEF4aXMyIHRvIHNldCB0aGUgY29tcGxldGlvbiBzdGF0ZSBvZiB0aGUgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBsZXRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldENvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLSAgICAgICAgdGhpcy5jb21wbGV0ZSA9IGNvbXBsZXRlOwotICAgICAgICBub3RpZnkoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyTWFuYWdlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3Rlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2Njc5ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSBpbiB0aGUgQXhpczIgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbi4KLSAqIEluIG9yZGVyIHRvIHBsdWctaW4gYSBuZXcgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbiwgdGhpcyBpbnRlcmZhY2UgaGFzIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGluaXRpbGl6YXRpb24gb2YgYSBub2RlIGluIHRoZSBjbHVzdGVyIGlzIGhhbmRsZWQgaGVyZS4gSXQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZwotICogdGhpcyBub2RlIHRvIGpvaW4gdGhlIGNsdXN0ZXIuIFRoaXMgbm9kZSBzaG91bGQgbm90IHByb2Nlc3MgYW55IFdlYiBzZXJ2aWNlcyByZXF1ZXN0cyB1bnRpbCBpdAotICogc3VjY2Vzc2Z1bGx5IGpvaW5zIHRoZSBjbHVzdGVyLiBHZW5lcmFsbHksIHRoaXMgbm9kZSB3aWxsIGFsc28gbmVlZCB0byBvYnRhaW4gdGhlIHN0YXRlCi0gKiBpbmZvcm1hdGlvbiBhbmQvb3IgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIGEgbmVpZ2hib3Jpbmcgbm9kZS4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yCi0gKiBwcm9wZXJseSBpbnN0YW50aWF0aW5nIGEge0BsaW5rIENvbnRleHRNYW5hZ2VyfSAmIHtAbGluayBDb25maWd1cmF0aW9uTWFuYWdlcn0uIEluIHRoZSBjYXNlIG9mCi0gKiBhIHN0YXRpYyA8YSBocmVmPSJodHRwOi8vYWZraGFtLm9yZy8yMDA4LzA1L2dyb3VwLW1lbWJlcnNoaXAtbWFuYWdlbWVudC1zY2hlbWVzLmh0bWwiPgotICogbWVtYmVyc2hpcCBzY2hlbWU8L2E+LAotICogdGhpcyBtZW1iZXJzIGFyZSByZWFkIGZyb20gdGhlIGF4aXMyLnhtbCBmaWxlIGFuZCBhZGRlZCB0byB0aGUgQ2x1c3Rlck1hbmFnZXIuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEluIHRoZSBheGlzMi54bWwsIHRoZSBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlICJjbHVzdGVyIiBjbGFzcyBhdHRyaWJ1dGUuCi0gKiBlLmcuCi0gKiA8Y29kZT48Yj4KLSAqIDxub2JyPiZsdDtjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIiZndDs8L25vYnI+Ci0gKiA8L2I+Ci0gKiA8L2NvZGU+Ci0gKiBzcGVjaWZpZXMgdGhhdCB0aGUgVHJpYmVzQ2x1c3Rlck1hbmFnZXIgY2xhc3MgaXMgdGhlIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIHRoYXQKLSAqIG5lZWRzIHRvIGJlIHVzZWQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZXJlIGNhbiBhbHNvIGJlIHNldmVyYWwgInBhcmFtZXRlciIgZWxlbWVudHMsIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB0aGUgImNsdXN0ZXIiIGVsZW1lbnQKLSAqIGluIHRoZSBheGlzMi54bWwgZmlsZS4gR2VuZXJhbGx5LCB0aGVzZSBwYXJhbWV0ZXJzIHdpbGwgYmUgc3BlY2lmaWMgdG8gdGhlIENsdXN0ZXJNYW5hZ2VyCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBDbHVzdGVyTWFuYWdlciBleHRlbmRzIFBhcmFtZXRlckluY2x1ZGUgewotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGlzIG5vZGUsIGFuZCBqb2luIHRoZSBjbHVzdGVyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaW5pdGlhbGl6aW5nIHRoaXMgbm9kZSBvciBqb2luaW5nIHRoZSBjbHVzdGVyCi0gICAgICovCi0gICAgdm9pZCBpbml0KCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIENvbnRleHRNYW5hZ2VyCi0gICAgICovCi0gICAgQ29udGV4dE1hbmFnZXIgZ2V0Q29udGV4dE1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIENvbmZpZ3VyYXRpb25NYW5hZ2VyCi0gICAgICovCi0gICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ29udGV4dE1hbmFnZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIENsdXN0ZXJNYW5hZ2VyLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZS4KLSAgICAgKiBXZSBjYW4gaGF2ZSBhIGNsdXN0ZXIgd2l0aCBubyBjb250ZXh0IHJlcGxpY2F0aW9uLCBpbiB3aGljaCBjYXNlIHRoZSBjb250ZXh0TWFuYWdlciB3aWxsIGJlCi0gICAgICogbnVsbC4gVGhpcyB2YWx1ZSBpcyBzZXQgYnkgdGhlIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuQ2x1c3RlckJ1aWxkZXJ9LCBieQotICAgICAqIHJlYWRpbmcgdGhlICAiY29udGV4dE1hbmFnZXIiIGVsZW1lbnQgaW4gdGhlIGF4aXMyLnhtbAotICAgICAqIDxwLz4KLSAgICAgKiBlLmcuCi0gICAgICogPGNvZGU+Ci0gICAgICogPGI+Ci0gICAgICogPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5UcmliZXNDb250ZXh0TWFuYWdlciI+Ci0gICAgICogPC9iPgotICAgICAqIDwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0TWFuYWdlciBUaGUgQ29udGV4dE1hbmFnZXIgaW5zdGFuY2UKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbnRleHRNYW5hZ2VyKENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29ycmVzcG9uZGluZyB0byB0aGlzIENsdXN0ZXJNYW5hZ2VyLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGF0dHJpYnV0ZS4KLSAgICAgKiBXZSBjYW4gaGF2ZSBhIGNsdXN0ZXIgd2l0aCBubyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQsIGluIHdoaWNoIGNhc2UgdGhlIGNvbmZpZ3VyYXRpb25NYW5hZ2VyCi0gICAgICogd2lsbCBiZSBudWxsLiBUaGlzIHZhbHVlIGlzIHNldCBieSB0aGUge0BsaW5rIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5DbHVzdGVyQnVpbGRlcn0sIGJ5Ci0gICAgICogcmVhZGluZyB0aGUgICJjb25maWd1cmF0aW9uTWFuYWdlciIgZWxlbWVudCBpbiB0aGUgYXhpczIueG1sCi0gICAgICogPHAvPgotICAgICAqIGUuZy4KLSAgICAgKiA8Y29kZT4KLSAgICAgKiA8Yj4KLSAgICAgKiA8Y29uZmlndXJhdGlvbk1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLlRyaWJlc0NvbmZpZ3VyYXRpb25NYW5hZ2VyIj4KLSAgICAgKiA8L2I+Ci0gICAgICogPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25NYW5hZ2VyIFRoZSBDb25maWd1cmF0aW9uTWFuYWdlciBpbnN0YW5jZQotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlndXJhdGlvbk1hbmFnZXIpOwotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdCB0aGlzIG5vZGUgZnJvbSB0aGUgY2x1c3Rlci4gVGhpcyBub2RlIHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgbWVtYmVyc2hpcCBjaGFuZ2UKLSAgICAgKiBub3RpZmljYXRpb25zLCBzdGF0ZSBjaGFuZ2UgbWVzc2FnZXMgb3IgY29uZmlndXJhdGlvbiBjaGFuZ2UgbWVzc2FnZXMuIFRoZSBub2RlIHdpbGwgYmUgIgotICAgICAqICJzdGFuZGluZyBhbG9uZSIgb25jZSBpdCBpcyBzaHV0ZG93bi4gSG93ZXZlciwgaXQgaGFzIHRvIGNvbnRpbnVlIHRvIHByb2Nlc3MgV2ViIHNlcnZpY2UKLSAgICAgKiByZXF1ZXN0cy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsZWF2aW5nIHRoZSBjbHVzdGVyCi0gICAgICovCi0gICAgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHN5c3RlbSdzIGNvbmZpZ3VyYXRpb24gY29udGV4dC4gVGhpcyB3aWxsIGJlIHVzZWQgYnkgdGhlIGNsdXN0ZXJpbmcgaW1wbGVtZW50YXRpb25zCi0gICAgICogdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBBeGlzMiBlbnZpcm9ubWVudCBhbmQgdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBBeGlzMiBlbnZpcm9ubWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Db250ZXh0IFRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RhdGljIG1lbWJlcnMgb2YgdGhlIGNsdXN0ZXIuIFRoaXMgaXMgdXNlZCBvbmx5IHdpdGgKLSAgICAgKiA8YSBocmVmPSJodHRwOi8vYWZraGFtLm9yZy8yMDA4LzA1L2dyb3VwLW1lbWJlcnNoaXAtbWFuYWdlbWVudC1zY2hlbWVzLmh0bWwiPgotICAgICAqIHN0YXRpYyBncm91cCBtZW1iZXJzaGlwIDwvYT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZW1iZXJzIE1lbWJlcnMgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldE1lbWJlcnMoTGlzdDxNZW1iZXI+IG1lbWJlcnMpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0IG9mIG1lbWJlcnMgaW4gYQotICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9hZmtoYW0ub3JnLzIwMDgvMDUvZ3JvdXAtbWVtYmVyc2hpcC1tYW5hZ2VtZW50LXNjaGVtZXMuaHRtbCI+Ci0gICAgICogc3RhdGljIGdyb3VwCi0gICAgICogPC9hPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVtYmVycyBpZiBzdGF0aWMgZ3JvdXAgbWVtYmVyc2hpcCBpcyB1c2VkLiBJZiBhbnkgb3RoZXIgbWVtYmVyc2hpcCBzY2hlbWUgaXMgdXNlZCwKLSAgICAgKiAgICAgICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgbWF5IG5vdCBiZSB2YWxpZAotICAgICAqLwotICAgIExpc3Q8TWVtYmVyPiBnZXRNZW1iZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvYWQgYmFsYW5jZSBldmVudCBoYW5kbGVyIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBsb2FkIGJhbGFuY2UgZXZlbnRzIG9jY3VyLgotICAgICAqIFRoaXMgd2lsbCBiZSB2YWxpZCBvbmx5IHdoZW4gdGhpcyBub2RlIGlzIHJ1bm5pbmcgaW4gbG9hZEJhbGFuY2UgbW9kZQotICAgICAqCi0gICAgICogQHBhcmFtIGV2ZW50SGFuZGxlciAgICAgIFRoZSBsb2FkIGJhbGFuY2UgZXZlbnQgaGFuZGxlcgotICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbkRvbWFpbiBUaGUgYXBwbGljYXRpb24gZG9tYWluIHdoaWNoIGlzIGhhbmRsZWQgYnkgdGhlIGV2ZW50SGFuZGxlcgotICAgICAqLwotICAgIHZvaWQgYWRkTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIoTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyLCBTdHJpbmcgYXBwbGljYXRpb25Eb21haW4pOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+YXBwbGljYXRpb25Eb21haW48L2NvZGU+Ci0gICAgICogVGhpcyB3aWxsIGJlIHZhbGlkIG9ubHkgd2hlbiB0aGlzIG5vZGUgaXMgcnVubmluZyBpbiBsb2FkQmFsYW5jZSBtb2RlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25Eb21haW4gVGhlIGFwcGxpY2F0aW9uIGRvbWFpbiB0byB3aGljaCB0aGUgYXBwbGljYXRpb24gbm9kZXMgYmVpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBiYWxhbmNlZCBiZWxvbmcgdG8KLSAgICAgKiBAcmV0dXJuIExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5hcHBsaWNhdGlvbkRvbWFpbjwvY29kZT4KLSAgICAgKi8KLSAgICBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBnZXRMb2FkQmFsYW5jZUV2ZW50SGFuZGxlcihTdHJpbmcgYXBwbGljYXRpb25Eb21haW4pOwotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHRoZSBkb21haW5zIHRoYXQgdGhpcyBDbHVzdGVyTWFuYWdlciBiZWxvbmdzIHRvCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBkb21haW5zIG9mIHRoaXMgQ2x1c3Rlck1hbmFnZXIKLSAgICAgKi8KLSAgICBTZXQ8U3RyaW5nPiBnZXREb21haW5zKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3RlcmluZ0NvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGE1ZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvQ2x1c3RlcmluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbHVzdGVyaW5nQ29tbWFuZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlMWI2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyaW5nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotLyoqCi0gKiBBbGwgY29uc3RhbnRzIHVzZWQgYnkgdGhlIEF4aXMyIGNsdXN0ZXJpbmcgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsdXN0ZXJpbmdDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nQ29uc3RhbnRzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IGRvbWFpbiB0byB3aGljaCB0aGlzIG1lbWJlciBiZWxvbmdzIHRvLiBUaGlzIG5vZGUgbWF5IGJlIHJ1bm5pbmcgaW4gYXBwbGljYXRpb24KLSAgICAgKiBvciBsb2FkQmFsYW5jZSBtb2RlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ET01BSU4gPSAiYXBhY2hlLmF4aXMyLmRvbWFpbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX01BTkFHRVJfU0VSVklDRSA9ICJBeGlzMk5vZGVNYW5hZ2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0JMT0NLSU5HX0hBTkRMRVIgPSAiUmVxdWVzdEJsb2NraW5nSGFuZGxlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xVU1RFUl9JTklUSUFMSVpFRCA9ICJsb2NhbF9jbHVzdGVyLmluaXRpYWxpemVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNEX0NPTkZJR19JTklUX01TRyA9ICJsb2NhbF9yZWNkLmNvbmZpZy5pbml0Lm1ldGhvZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDRF9TVEFURV9JTklUX01TRyA9ICJsb2NhbF9yZWNkLnN0YXRlLmluaXQubWV0aG9kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS19BTExfUkVRVUVTVFMgPSAibG9jYWxfd3NvMndzYXMuYmxvY2sucmVxdWVzdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0lQX0FERFJFU1MgPSAiYXhpczIubG9jYWwuaXAuYWRkcmVzcyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWFpbiBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFyYW1ldGVycyB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZW1iZXJzaGlwIHNjaGVtZSB1c2VkIGluIHRoaXMgc2V0dXAuIFRoZSBvbmx5IHZhbHVlcyBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCBhcmUKLSAgICAgICAgICogIm11bHRpY2FzdCIgYW5kICJ3a2EiCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTSElQX1NDSEVNRSA9ICJtZW1iZXJzaGlwU2NoZW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNsdXN0ZXJpbmcgZG9tYWluL2dyb3VwLiBOb2RlcyBpbiB0aGUgc2FtZSBncm91cCB3aWxsIGJlbG9uZyB0byB0aGUgc2FtZSBtdWx0aWNhc3QKLSAgICAgICAgICogZG9tYWluLiBUaGVyZSB3aWxsIG5vdCBiZSBpbnRlcmZlcmVuY2UgYmV0d2VlbiBub2RlcyBpbiBkaWZmZXJlbnQgZ3JvdXBzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOID0gImRvbWFpbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEluZGljYXRlcyB0aGUgbW9kZSBpbiB3aGljaCB0aGlzIG1lbWJlciBpcyBydW5uaW5nLiBWYWxpZCB2YWx1ZXMgYXJlICJhcHBsaWNhdGlvbiIgYW5kCi0gICAgICAgICAqICJsb2FkQmFsYW5jZSIKLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBhcHBsaWNhdGlvbiAtIFRoaXMgbWVtYmVyIGhvc3RzIGVuZCB1c2VyIGFwcGxpY2F0aW9ucwotICAgICAgICAgKiBsb2FkQmFsYW5jZSAtIFRoaXMgbWVtYmVyIGlzIGEgcGFydCBvZiB0aGUgbG9hZCBiYWxhbmNlciBjbHVzdGVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFID0gIm1vZGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIHRoZSBldmVuIGhhbmRsZXIgd2hpY2ggd2lsbCBiZSBub3RpZmllZCBpbiB0aGUgY2FzZSBvZiBsb2FkIGJhbGFuY2luZyBldmVudHMgb2NjdXJyaW5nLgotICAgICAgICAgKiBUaGlzIGNsYXNzIGhhcyB0byBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIKLSAgICAgICAgICogPHAvPgotICAgICAgICAgKiBUaGlzIGVudHJ5IGlzIG9ubHkgdmFsaWQgaWYgdGhlICJtb2RlIiBwYXJhbWV0ZXIgaXMgc2V0IHRvIGxvYWRCYWxhbmNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0JBTEFOQ0VfRVZFTlRfSEFORExFUiA9ICJsb2FkQmFsYW5jZUV2ZW50SGFuZGxlciI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGUgIm1vZGUiIHBhcmFtZXRlciBpcyBzZXQgdG8gImFwcGxpY2F0aW9uIgotICAgICAgICAgKiA8cC8+Ci0gICAgICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBkb21haW4gaW4gd2hpY2ggdGhlIHRoZSBhcHBsaWNhdGlvbnMgYmVpbmcgbG9hZCBiYWxhbmNlZCBhcmUgZGVwbG95ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9ET01BSU4gPSAiYXBwbGljYXRpb25Eb21haW4iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGVuIGEgV2ViIHNlcnZpY2UgcmVxdWVzdCBpcyByZWNlaXZlZCwgYW5kIHByb2Nlc3NlZCwgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50IHRvIHRoZQotICAgICAgICAgKiBjbGllbnQsIHNob3VsZCB3ZSB1cGRhdGUgdGhlIHN0YXRlcyBvZiBhbGwgbWVtYmVycyBpbiB0aGUgY2x1c3Rlcj8gSWYgdGhlIHZhbHVlIG9mCi0gICAgICAgICAqIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byAidHJ1ZSIsIHRoZSByZXNwb25zZSB0byB0aGUgY2xpZW50IHdpbGwgYmUgc2VudCBvbmx5IGFmdGVyCi0gICAgICAgICAqIGFsbCB0aGUgbWVtYmVycyBoYXZlIGJlZW4gdXBkYXRlZC4gT2J2aW91c2x5LCB0aGlzIGNhbiBiZSB0aW1lIGNvbnN1bWluZy4gSW4gc29tZSBjYXNlcywKLSAgICAgICAgICogc3VjaCB0aGlzIG92ZXJoZWFkIG1heSBub3QgYmUgYWNjZXB0YWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIKLSAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byAiZmFsc2UiCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DSFJPTklaRV9BTExfTUVNQkVSUyA9ICJzeW5jaHJvbml6ZUFsbCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvIG5vdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgdGhlIGNsdXN0ZXIuIFRoZSBwcm9ncmFtbWVyIGhhcyB0byBleHBsaWNpdGx5IGluaXRpYWxpemUKLSAgICAgICAgICogdGhlIGNsdXN0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVk9JRF9JTklUSUFUSU9OID0gIkF2b2lkSW5pdGlhdGlvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZXNlcnZlIG1lc3NhZ2Ugb3JkZXJpbmcuIFRoaXMgd2lsbCBiZSBkb25lIGFjY29yZGluZyB0byBzZW5kZXIgb3JkZXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFUlZFX01TR19PUkRFUiA9ICJwcmVzZXJ2ZU1lc3NhZ2VPcmRlciI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1haW50YWluIGF0bW9zdC1vbmNlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzZW1hbnRpY3MKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUTU9TVF9PTkNFX01TR19TRU1BTlRJQ1MgPSAiYXRtb3N0T25jZU1lc3NhZ2VTZW1hbnRpY3MiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1lbWJlciBpcyBBQ1RJVkUgb3IgUEFTU0lWRQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfQUNUSVZFID0gImlzQWN0aXZlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGltcGxlbWVudGFpb24gb2YKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUJFUlNISVBfTElTVEVORVIgPSAibWVtYmVyc2hpcExpc3RlbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1lbWJlcnNoaXBTY2hlbWUgewotICAgICAgICAvKioKLSAgICAgICAgICogTXVsdGljYXN0IGJhc2VkIG1lbWJlcnNoaXAgZGlzY292ZXJ5IHNjaGVtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElDQVNUX0JBU0VEID0gIm11bHRpY2FzdCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdlbGwtS25vd24gQWRkcmVzcyBiYXNlZCBtZW1iZXJzaGlwIG1hbmFnZW1lbnQgc2NoZW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXS0FfQkFTRUQgPSAid2thIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9DbHVzdGVyaW5nRmF1bHQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRjOTBkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL0NsdXN0ZXJpbmdGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotcHVibGljIGNsYXNzIENsdXN0ZXJpbmdGYXVsdCBleHRlbmRzIEF4aXNGYXVsdCB7Ci0KLQlwdWJsaWMgQ2x1c3RlcmluZ0ZhdWx0IChTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlciAobWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyBDbHVzdGVyaW5nRmF1bHQgKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSkgewotCQlzdXBlciAobWVzc2FnZSwgZSk7Ci0JfQotCQotCXB1YmxpYyBDbHVzdGVyaW5nRmF1bHQgKEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyIChlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Mb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTG9hZEJhbGFuY2VFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyZGVhMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9Mb2FkQmFsYW5jZUV2ZW50SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7ICAgICAgICAgICAgIAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAgICAgICAgICAgIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgICAgICAgIAotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgICAgICAgICAgIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICAgIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAgICAgICAgIAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0aHJvdWdoIHdoaWNoIHRoZSBsb2FkIGJhbGFuY2luZyBldmVudCBhcmUgbm90aWZpZWQuCi0gKiBUaGlzIHdpbGwgb25seSBiZSB1c2VkIHdoZW4gdGhpcyBtZW1iZXIgaXMgcnVubmluZyBpbiBsb2FkQmFsYW5jZSBtb2RlLiBJbiBvcmRlciB0byBkbyB0aGlzLAotICogaW4gdGhlIGF4aXMyLnhtbCBmaWxlLCBzZXQgdGhlIHZhbHVlIG9mIHRoZSAibW9kZSIgcGFyYW1ldGVyIHRvICJsb2FkQmFsYW5jZSIgYW5kIHRoZW4gcHJvdmlkZQotICogdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSB1c2luZyB0aGUgImxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyIiBlbnRyeS4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciB7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhcHBsaWNhdGlvbiBtZW1iZXIgam9pbmVkIHRoZSBhcHBsaWNhdGlvbiBncm91cAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBSZXByZXNlbnRzIHRoZSBtZW1iZXIgd2hvIGpvaW5lZAotICAgICAqLwotICAgIHZvaWQgYXBwbGljYXRpb25NZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyKTsKLQotICAgIC8qKgotICAgICAqIEFuIGFwcGxpY2F0aW9uIG1lbWJlciBsZWZ0IHRoZSBhcHBsaWNhdGlvbiBncm91cAotICAgICAqCi0gICAgICogQHBhcmFtIG1lbWJlciBSZXByZXNlbnRzIHRoZSBtZW1iZXIgd2hvIGxlZnQKLSAgICAgKi8KLSAgICB2b2lkIGFwcGxpY2F0aW9uTWVtYmVyUmVtb3ZlZChNZW1iZXIgbWVtYmVyKTsKLQotICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgY3VycmVudCBtZW1iZXJzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgY3VycmVudCBtZW1iZXJzCi0gICAgICovCi0gICAgTGlzdDxNZW1iZXI+IGdldE1lbWJlcnMoKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL01lbWJlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTNjZDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbWVtYmVyIGluIHRoZSBjbHVzdGVyLiBUaGlzIGlzIHVzZWQgd2l0aCBzdGF0aWMgbWVtYmVyc2hpcAotICovCi1wdWJsaWMgY2xhc3MgTWVtYmVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBob3N0IG5hbWUgb2YgdGhpcyBtZW1iZXIuIENhbiBiZSB0aGUgbmFtZSBvciB0aGUgSVAgYWRkcmVzcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGhvc3ROYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRDUCBwb3J0IHVzZWQgYnkgdGhpcyBtZW1iZXIgZm9yIGNvbW11bmljYXRpbmcgY2x1c3RlcmluZyBtZXNzYWdlcwotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBvcnQgPSAtMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBIVFRQIHBvcnQgdXNlZCBieSB0aGlzIG1lbWJlciBmb3Igc2VydmljaW5nIFdlYiBzZXJ2aWNlIHJlcXVlc3RzLiBVc2VkIGZvciBsb2FkIGJhbGFuY2luZwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGh0dHBQb3J0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSFRUUFMgcG9ydCB1c2VkIGJ5IHRoaXMgbWVtYmVyIGZvciBzZXJ2aWNpbmcgV2ViIHNlcnZpY2UgcmVxdWVzdHMuIFVzZWQgZm9yIGxvYWQgYmFsYW5jaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaHR0cHNQb3J0ID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIG1lbWJlciBpcyBBQ1RJVkUgb3IgUEFTU0lWRQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FjdGl2ZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZG9tYWluIG9mIHRoaXMgbWVtYmVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZG9tYWluOwotCi0gICAgLyoqCi0gICAgICogT3RoZXIgbWVtYmVyIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICBwdWJsaWMgTWVtYmVyKFN0cmluZyBob3N0TmFtZSwgaW50IHBvcnQpIHsKLSAgICAgICAgdGhpcy5ob3N0TmFtZSA9IGhvc3ROYW1lOwotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBob3N0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SHR0cHNQb3J0KCkgewotICAgICAgICByZXR1cm4gaHR0cHNQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEh0dHBzUG9ydChpbnQgaHR0cHNQb3J0KSB7Ci0gICAgICAgIHRoaXMuaHR0cHNQb3J0ID0gaHR0cHNQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SHR0cFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBodHRwUG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIdHRwUG9ydChpbnQgaHR0cFBvcnQpIHsKLSAgICAgICAgdGhpcy5odHRwUG9ydCA9IGh0dHBQb3J0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotICAgICAgICByZXR1cm4gaXNBY3RpdmU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7Ci0gICAgICAgIGlzQWN0aXZlID0gYWN0aXZlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgewotICAgICAgICByZXR1cm4gZG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0gICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmICh0aGlzID09IG8pIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lbWJlciBtZW1iZXIgPSAoTWVtYmVyKSBvOwotICAgICAgICByZXR1cm4gcG9ydCA9PSBtZW1iZXIuZ2V0UG9ydCgpICYmCi0gICAgICAgICAgICAgICBodHRwUG9ydCA9PSBtZW1iZXIuZ2V0SHR0cFBvcnQoKSAmJgotICAgICAgICAgICAgICAgaHR0cHNQb3J0ID09IG1lbWJlci5nZXRIdHRwc1BvcnQoKSAmJgotICAgICAgICAgICAgICAgIShob3N0TmFtZSAhPSBudWxsID8gIWhvc3ROYW1lLmVxdWFscyhtZW1iZXIuZ2V0SG9zdE5hbWUoKSkgOgotICAgICAgICAgICAgICAgICBtZW1iZXIuZ2V0SG9zdE5hbWUoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAoaG9zdE5hbWUgIT0gbnVsbCA/IGhvc3ROYW1lLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBwb3J0OwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiSG9zdDoiICsgaG9zdE5hbWUgKyAiLCBQb3J0OiAiICsgcG9ydCArCi0gICAgICAgICAgICAgICAiLCBIVFRQOiIgKyBodHRwUG9ydCArICIsIEhUVFBTOiIgKyBodHRwc1BvcnQgKyIsIEFDVElWRToiICsgaXNBY3RpdmU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVtYmVyc2hpcExpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ZDZmNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZW1iZXJzaGlwTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAgICAgICAgICAgICAKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gICAgICAgICAgICAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgICAgICAgICAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgICAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICAgICAgICAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHdoaWNoIHdpbGwgYmUgbm90aWZpZWQgd2hlbiBtZW1lcnNoaXAgY2hhbmdlcy4KLSAqIElmIHNvbWUgc3BlY2lmaWMgYWN0aXZpdGllcyBuZWVkIHRvIGJlIHBlcmZvcm1lZCB3aGVuIG1lbWJlcnNoaXAgY2hhbmdlcyBvY2N1ciwKLSAqIHlvdSBjYW4gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpbiB0aGUgYXhpczIueG1sCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVtYmVyc2hpcExpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgbWVtYmVyIGlzIGFkZGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgd2hpY2ggd2FzIGFkZGVkCi0gICAgICogQHBhcmFtIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvciB0cnVlIC0gaWYgdGhlIGxvY2FsIG1lbWJlciBpcyB0aGUgY29vcmRpbmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZW1iZXJBZGRlZChNZW1iZXIgbWVtYmVyLCBib29sZWFuIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIG1lbWJlciBkaXNzYXBlYXJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVtYmVyIFRoZSBtZW1iZXIgd2hpY2ggZGlzYXBwZWFyZWQKLSAgICAgKiBAcGFyYW0gaXNMb2NhbE1lbWJlckNvb3JkaW5hdG9yIHRydWUgLSBpZiB0aGUgbG9jYWwgbWVtYmVyIGlzIHRoZSBjb29yZGluYXRvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lbWJlckRpc2FwcGVhcmVkKE1lbWJlciBtZW1iZXIsICBib29sZWFuIGlzTG9jYWxNZW1iZXJDb29yZGluYXRvcik7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZXNzYWdlU2VuZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9NZXNzYWdlU2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2UxMTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvTWVzc2FnZVNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmc7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVNlbmRlciB7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kVG9Hcm91cChDbHVzdGVyaW5nQ29tbWFuZCBtc2cpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kVG9TZWxmKENsdXN0ZXJpbmdDb21tYW5kIG1zZykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvUmVxdWVzdEJsb2NraW5nSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvUmVxdWVzdEJsb2NraW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmYwOGU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL1JlcXVlc3RCbG9ja2luZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIEhhbmRsZSBibG9ja2luZyBhdCBnb2JhbCBsZXZlbAotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIEJvb2xlYW4gaXNCbG9ja2luZ0FsbFJlcXVlc3RzID0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbikgY2ZnQ3R4LmdldFByb3BlcnR5KENsdXN0ZXJpbmdDb25zdGFudHMuQkxPQ0tfQUxMX1JFUVVFU1RTKTsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLQotICAgICAgICAvLyBIYW5kbGUgYmxvY2tpbmcgYXQgc2VydmljZSBncm91cCBsZXZlbAotICAgICAgICBCb29sZWFuIGlzQmxvY2tpbmdTZXJ2aWNlR3JvdXBSZXF1ZXN0cyA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIGJsb2NraW5nUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuQkxPQ0tfQUxMX1JFUVVFU1RTKTsKLSAgICAgICAgICAgIGlmIChibG9ja2luZ1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpc0Jsb2NraW5nU2VydmljZUdyb3VwUmVxdWVzdHMgPSAoQm9vbGVhbikgYmxvY2tpbmdQYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIGJsb2NraW5nIGF0IHNlcnZpY2UgbGV2ZWwKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgQm9vbGVhbiBpc0Jsb2NraW5nU2VydmljZVJlcXVlc3RzID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIGJsb2NraW5nUGFyYW0gPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFBhcmFtZXRlcihDbHVzdGVyaW5nQ29uc3RhbnRzLkJMT0NLX0FMTF9SRVFVRVNUUyk7Ci0gICAgICAgICAgICBpZiAoYmxvY2tpbmdQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXNCbG9ja2luZ1NlcnZpY2VSZXF1ZXN0cyA9IChCb29sZWFuKSBibG9ja2luZ1BhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNCbG9ja2luZ0FsbFJlcXVlc3RzICE9IG51bGwgJiYgaXNCbG9ja2luZ0FsbFJlcXVlc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0KLSAgICAgICAgICAgIC8vIEFsbG93IG9ubHkgTm9kZU1hbmFnZXIgc2VydmljZSBjb21taXQgcmVxdWVzdHMgdG8gcGFzcyB0aHJvdWdoLiBCbG9jayBhbGwgb3RoZXJzCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGlmICghYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLmVxdWFscyhDbHVzdGVyaW5nQ29uc3RhbnRzLk5PREVfTUFOQUdFUl9TRVJWSUNFKSkgewotICAgICAgICAgICAgICAgIGlmICghbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscygiY29tbWl0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU3lzdGVtIGlzIGJlaW5nIHJlaW5pdGlhbGl6ZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGFnYWluIGluIGEgZmV3IHNlY29uZHMuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm9kZU1hbmFnZXIgc2VydmljZSBjYW5ub3QgY2FsbCBhbnkgb3RoZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiBhZnRlciBjYWxsaW5nIHByZXBhcmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNCbG9ja2luZ1NlcnZpY2VHcm91cFJlcXVlc3RzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGlzIHNlcnZpY2UgZ3JvdXAgaXMgYmVpbmcgaW5pdGlhbGl6ZWQgb3IgdW5sb2FkZWQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIGZldyBzZWNvbmRzLiIpOwotICAgICAgICB9IGVsc2UgaWYgKGlzQmxvY2tpbmdTZXJ2aWNlUmVxdWVzdHMuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoaXMgc2VydmljZSBpcyBiZWluZyBpbml0aWFsaXplZC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGFnYWluIGluIGEgZmV3IHNlY29uZHMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpewotICAgICAgICAgICAgUmVxdWVzdEJsb2NraW5nSGFuZGxlciB0aGF0ID0gKFJlcXVlc3RCbG9ja2luZ0hhbmRsZXIpIG9iajsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiB0aGlzRGVzYyA9IHRoaXMuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiB0aGF0RGVzYyA9IHRoYXQuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgIGlmKHRoaXNEZXNjICE9IG51bGwgJiYgdGhhdERlc2MgIT0gbnVsbCAmJiB0aGlzRGVzYy5nZXROYW1lKCkuZXF1YWxzKHRoYXREZXNjLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmKHRoaXMuaGFuZGxlckRlc2MgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyRGVzYy5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2M2MzhjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDItcGhhc2UgY29tbWl0IHByb3RvY29sLCB3aGVyZSBhbiBldmVudCBpcyBwcm9jZXNzZWQsCi0gKiB0aGUgc3lzdGVtIGlzIHByZXBhcmVkIHRvIHN3aXRjaCB0byBhIG5ldyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBwcm9jZXNzZWQgZXZlbnQsCi0gKiBhbmQgZmluYWxseSBjb21taXRzIHRoZSBuZXcgY29uZmlndXJhdGlvbiAoaS5lLiB0aGUgc3lzdGVtIHN3aXRjaGVzIHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbikuCi0gKiBBcyBjYW4gYmUgc2VlbiwgdGhpcyBpcyBhIDMtc3RlcCBwcm9jZXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGV4dGVuZHMgQ2x1c3RlcmluZ0NvbW1hbmQgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMT0FEX0NPTkZJR1VSQVRJT04gPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQURfU0VSVklDRV9HUk9VUFMgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOTE9BRF9TRVJWSUNFX0dST1VQUyA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQTFlfU0VSVklDRV9QT0xJQ1kgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVBBUkUgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1JVCA9IDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OID0gNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST0xMQkFDSyA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNvbW1hbmQgdHlwZQotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIGNvbW1hbmQgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0Q29tbWFuZFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIDxjb2RlPmV2ZW50PC9ldmVudD4uIFRoZSBpbXBsZW1lbnRlciBvZiB0aGlzIGludGVyZmFjZSB3aWxsCi0gICAgICogbmVlZCB0byBjYWNoZSB0aGUgb3V0Y29tZSBvZiB0aGlzIHByb2Nlc3NpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJvY2VzcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUHJlcGFyZSB0byBzd2l0Y2ggdG8gdGhlIG5ldyBjb25maWd1cmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByZXBhcmUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb21taXQgdGhlIG5ldyBjb25maWd1cmF0aW9uLiBpLmUuIHN3aXRjaCB0aGUgc3lzdGVtIHRvIHRoZSBuZXcgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNvbW1pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUm9sbGJhY2sgYW55IGNoYW5nZXMgY2FycmllZCBvdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByb2xsYmFjayhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc0NTJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudC4gQ29uZmlndXJhaW9uIGNoYW5nZXMgaW5jbHVkZQotICogPHAvPgotICogPHVsPgotICogPGxpPlJlYm9vdGluZyBhbiBlbnRpcmUgY2x1c3RlciwgaW4gd2hpY2ggY2FzZSwgYWxsIG5vZGVzIGhhdmUgdG8gbG9hZCB0aGUgbmV3IEF4aXMyIGNvbmZpZ3VyYXRpb24KLSAqIGluIGEgY29uc2lzdGVudCBtYW5uZXIKLSAqIDwvbGk+Ci0gKiA8bGk+Ci0gKiBEZXBsb3lpbmcgYSBuZXcgc2VydmljZSB0byBhIGNsdXN0ZXIgb3IgdW5kZXBsb3lpbmcgYSBzZXJ2aWNlIGZyb20gYSBjbHVzdGVyCi0gKiA8L2xpPgotICogPGxpPgotICogQ2hhbmdpbmcgdGhlIHBvbGljaWVzIG9mIGEgc2VydmljZSBkZXBsb3llZCBvbiB0aGUgY2x1c3RlcgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIEl0IGlzIG5vdCBtYW5kYXRvcnkgdG8gaGF2ZSBhIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGluIGEgbm9kZS4gSW4gd2hpY2ggY2FzZSB0aGUgY2x1c3RlciBtYXkgYmUKLSAqIHVzZWQgb25seSBmb3IgPGEgaHJlZj0iaHR0cDovL2Fma2hhbS5vcmcvMjAwOC8wNS9kZWZpbml0aW9uLW9mLWhpZ2gtYXZhaWxhYmlsaXR5Lmh0bWwiPgotICogSGlnaCBBdmFpbGFiaWxpdHk8L2E+IHRocm91Z2ggY29udGV4dCByZXBsaWNhdGlvbi4gSG93ZXZlciwgaXQgaXMgZGlmZmljdWx0IHRvIGltYWdpbmUgdGhhdAotICogYSBjbHVzdGVyIHdpbGwgYmUgZGVwbG95ZWQgaW4gcHJvZHVjdGlvbiB3aXRoIG9ubHkgY29udGV4dCByZXBsaWNhdGlvbiBidXQgd2l0aG91dCBjbHVzdGVyCi0gKiBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpcyBzZXQgYnkgdGhlCi0gKiB7QGxpbmsgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkNsdXN0ZXJCdWlsZGVyfSwgYnkKLSAqIHJlYWRpbmcgdGhlICAiY29uZmlndXJhdGlvbk1hbmFnZXIiIGVsZW1lbnQgaW4gdGhlIGF4aXMyLnhtbAotICogPHAvPgotICogZS5nLgotICogPGNvZGU+Ci0gKiA8Yj4KLSAqIDxjb25maWd1cmF0aW9uTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uVHJpYmVzQ29uZmlndXJhdGlvbk1hbmFnZXIiPgotICogPC9iPgotICogPC9jb2RlPgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25NYW5hZ2VyIGV4dGVuZHMgUGFyYW1ldGVySW5jbHVkZSB7Ci0KLSAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgLyoqCi0gICAgICogTG9hZCBhIHNldCBvZiBzZXJ2aWNlIGdyb3VwcwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cE5hbWVzIFRoZSBzZXQgb2Ygc2VydmljZSBncm91cHMgdG8gYmUgbG9hZGVkCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGxvYWRpbmcgc2VydmljZSBncm91cHMKLSAgICAgKi8KLSAgICB2b2lkIGxvYWRTZXJ2aWNlR3JvdXBzKFN0cmluZ1tdIHNlcnZpY2VHcm91cE5hbWVzKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVW5sb2FkIGEgc2V0IG9mIHNlcnZpY2UgZ3JvdXBzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUdyb3VwTmFtZXMgVGhlIHNldCBvZiBzZXJ2aWNlIGdyb3VwcyB0byBiZSB1bmxvYWRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB1bmxvYWRpbmcgc2VydmljZSBncm91cHMKLSAgICAgKi8KLSAgICB2b2lkIHVubG9hZFNlcnZpY2VHcm91cHMoU3RyaW5nW10gc2VydmljZUdyb3VwTmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBBcHBseSBhIHBvbGljeSB0byBhIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSB0byB3aGljaCB0aGlzIHBvbGljeSBuZWVkcyB0byBiZSBhcHBsaWVkCi0gICAgICogQHBhcmFtIHBvbGljeSAgICAgIFRoZSBzZXJpYWxpemVkIHBvbGljeSB0byBiZSBhcHBsaWVkIHRvIHRoZSBzZXJ2aWNlCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGFwcGx5aW5nIHNlcnZpY2UgcG9saWNpZXMKLSAgICAgKi8KLSAgICB2b2lkIGFwcGx5UG9saWN5KFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIHBvbGljeSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFJlbG9hZCB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gb2YgYW4gQXhpczIgTm9kZQotICAgICAqCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHJlaW5pdGlhbGl6aW5nIEF4aXMyCi0gICAgICovCi0gICAgdm9pZCByZWxvYWRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgVHJhbnNhY3Rpb24gbWFuYWdlbWVudCBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSAgICAvKioKLSAgICAgKiBGaXJzdCBwaGFzZSBvZiB0aGUgMi1waGFzZSBjb21taXQgcHJvdG9jb2wuCi0gICAgICogTm90aWZpZXMgYSBub2RlIHRoYXQgaXQgbmVlZHMgdG8gcHJlcGFyZSB0byBzd2l0Y2ggdG8gYSBuZXcgY29uZmlndXJhdGlvbi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcmVwYXJpbmcgdG8gY29tbWl0Ci0gICAgICovCi0gICAgdm9pZCBwcmVwYXJlKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFJvbGxiYWNrIHdoYXRldmVyIHdhcyBkb25lCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcm9sbGluZyBiYWNrIGEgY2x1c3RlciBjb25maWd1cmF0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24KLSAgICAgKi8KLSAgICB2b2lkIHJvbGxiYWNrKCkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFNlY29uZCBwaGFzZSBvZiB0aGUgMi1waGFzZSBjb21taXQgcHJvdG9jb2wuCi0gICAgICogTm90aWZpZXMgYSBub2RlIHRoYXQgaXQgbmVlZHMgdG8gc3dpdGNoIHRvIGEgbmV3IGNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY29tbWl0dGluZyBhIGNsdXN0ZXIgY29uZmlndXJhdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uCi0gICAgICovCi0gICAgdm9pZCBjb21taXQoKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEdlbmVyYWwgbWFuYWdlbWVudCBtZXRob2RzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvKioKLSAgICAgKiBUbyBub3RpZnkgb3RoZXIgbm9kZXMgdGhhdCBhbiBFeGNlcHRpb24gb2NjdXJyZWQsIGR1cmluZyB0aGUgcHJvY2Vzc2luZwotICAgICAqIG9mIGEge0BsaW5rIENvbmZpZ3VyYXRpb25DbHVzdGVyaW5nQ29tbWFuZH0KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aHJvd2FibGUgVGhlIHRocm93YWJsZSB3aGljaCBoYXMgdG8gYmUgcHJvcG9nYXRlZCB0byBvdGhlciBub2RlcwotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdAotICAgICAqICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nIHRoZQotICAgICAqICAgICAgICAgIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICovCi0gICAgdm9pZCBleGNlcHRpb25PY2N1cnJlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogRm9yIHJlZ2lzdGVyaW5nIGEgY29uZmlndXJhdGlvbiBldmVudCBsaXN0ZW5lci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciBpbnN0YW5jZQotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lcihDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgYmUgdXNlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuZCB0byBjb3JyZXNwb25kIHdpdGggdGhlIEF4aXMyIGVudmlyb25tZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzY5NjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBDb25maWd1cmF0aW9uTWFuYWdlcn0uIE9uIHRoZSBtZXNzYWdlIHNlbmRpbmcgc2lkZSwKLSAqIHRoZSBDb25maWd1cmF0aW9uTWFuYWdlciB3aWxsIHNlbmQgYSBjb250ZXh0IHJlcGxpY2F0aW9uIG1lc3NhZ2UsIHdoaWNoIG9uIHRoZSByZWNlaXZpbmcKLSAqIHNpZGUgd2lsbCBiZSBoYW5kZWQgb3ZlciB0byB0aGUgaW1wbGVtZW50ZXIgb2YgdGhpcyBpbnRlcmZhY2UuIFNvIHdoZW4gYSBub2RlIHNlbmRzIGEgbWVzc2FnZQotICogdGhyb3VnaCB1c2luZyBpdHMgQ29uZmlndXJhdGlvbk1hbmFnZXIsIGFsbCByZWNlaXZlcnMgd2lsbCBiZSBub3RpZmllZCB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUKLSAqIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIgewotCi0gICAgLyoqCi0gICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSBsb2FkIHNlcnZpY2UgZ3JvdXBzIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWFuZCBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHZvaWQgc2VydmljZUdyb3Vwc0xvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhbiB1bmxvYWQgc2VlcnZpY2UgZ3JvdXBzIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tbWFuZCAgVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIHNlcnZpY2VHcm91cHNVbmxvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCk7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhbiBhcHBseSBwb2xpY3kgdG8gc2VydmljZSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIHBvbGljeUFwcGxpZWQoQ29uZmlndXJhdGlvbkNsdXN0ZXJpbmdDb21tYW5kIGNvbW1hbmQpOwotCi0gICAgLyoqCi0gICAgICogTm90aWZpY2F0aW9uIHRoYXQgYSByZWxvYWQgY29uZmlndXJhdGlvbiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbW1hbmQgVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICB2b2lkIGNvbmZpZ3VyYXRpb25SZWxvYWRlZChDb25maWd1cmF0aW9uQ2x1c3RlcmluZ0NvbW1hbmQgY29tbWFuZCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmVwYXJlIHRvIGNvbW1pdCBjcG1maWd1cmF0aW9uIGNoYW5nZXMKLSAgICAgKi8KLSAgICB2b2lkIHByZXBhcmVDYWxsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJvbGxiYWNrIGNvbmZpZ3VyYXRpb24gY2hhbmdlcwotICAgICAqLwotICAgIHZvaWQgcm9sbGJhY2tDYWxsZWQoKTsKLQotICAgIC8qKgotICAgICAqIENvbW1pdCBjb25maWd1cmF0aW9uIGNoYW5nZXMKLSAgICAgKi8KLSAgICB2b2lkIGNvbW1pdENhbGxlZCgpOwotCi0gICAgLyoqCi0gICAgICogQW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBvbiBhIHJlbW90ZSBub2RlIHdoaWxlIHByb2Nlc3NpbmcgYSBjb25maWd1cmF0aW9uIGNoYW5nZSBjb21tYW5kCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBleGNlcHRpb24gdGhhdCBvY2N1cnJlZCBvbiB0aGUgcmVtb3RlIG5vZGUKLSAgICAgKi8KLSAgICB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgYmUgdXNlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuZCB0byBjb3JyZXNwb25kIHdpdGggdGhlIEF4aXMyIGVudmlyb25tZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqLwotICAgIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dENsdXN0ZXJpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTkyNGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgZXh0ZW5kcyBDbHVzdGVyaW5nQ29tbWFuZCB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dE1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0ODVjMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY2x1c3RlcmluZy9jb250ZXh0L0NvbnRleHRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkFic3RyYWN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBjb250ZXh0IHJlcGxpY2F0aW9uLiBUaGUgcHJvcGVydHkgY2hhbmdlcyBpbiB0aGUKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy93ZWJzZXJ2aWNlcy9saWJyYXJ5L3dzLWFwYWNoZWF4aXMyLyI+Ci0gKiBBeGlzMiBjb250ZXh0IGhpZXJhcmNoeQotICogPC9hPiBpbiB0aGlzIG5vZGUsIGFyZSBwcm9wYWdhdGVkIHRvIGFsbCBvdGhlciBub2RlcyBpbiB0aGUgY2x1c3Rlci4KLSAqIDwvcD4KLSAqIDxwPgotICogSXQgaXMgbm90IG1hbmRhdG9yeSB0byBoYXZlIGEgQ29udGV4dE1hbmFnZXIgaW4gYSBub2RlLiBJZiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4KLSAqIDxhIGhyZWY9Imh0dHA6Ly9hZmtoYW0ub3JnLzIwMDgvMDUvZGVmaW5pdGlvbi1vZi1oaWdoLWF2YWlsYWJpbGl0eS5odG1sIj4KLSAqIEhpZ2ggQXZhaWxhYmlsaXR5PC9hPiwgd2UgbWF5IGRpc2FibGUgY29udGV4dCByZXBsaWNhdGlvbiBieSBjb21tZW50aW5nIG91dCB0aGUgImNvbnRleHRNYW5hZ2VyIgotICogc2VjdGlvbiBpbiB0aGUgYXhpczIueG1sIGNsdXN0ZXIgY29uZmlndXJhdGlvbiBzZWN0aW9uLiBJbiBzdWNoIGEgc2NlbmF0aW8sIHRoZSBjbHVzdGVyIHdpbGwgYmUKLSAqIHVzZWQgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YKLSAqIDxhIGhyZWY9Imh0dHA6Ly9hZmtoYW0ub3JnLzIwMDgvMDUvZGVmaW5pdGlvbi1vZi1zY2FsYWJpbGl0eS5odG1sIj5TY2FsYWJpbGl0eTwvYT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGlzIHNldCBieSB0aGUKLSAqIHtAbGluayBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuQ2x1c3RlckJ1aWxkZXJ9LCBieQotICogcmVhZGluZyB0aGUgICJjb250ZXh0TWFuYWdlciIgZWxlbWVudCBpbiB0aGUgYXhpczIueG1sCi0gKiA8cC8+Ci0gKiBlLmcuCi0gKiA8Y29kZT4KLSAqIDxiPgotICogPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5UcmliZXNDb250ZXh0TWFuYWdlciI+Ci0gKiA8L2I+Ci0gKiA8L2NvZGU+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dE1hbmFnZXIgZXh0ZW5kcyBQYXJhbWV0ZXJJbmNsdWRlIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHByb3BlcnRpZXMgaW4gYW4ge0BsaW5rIEFic3RyYWN0Q29udGV4dH0gYXJlIHVwZGF0ZWQuCi0gICAgICogVGhpcyBjb3VsZCBiZSBhZGRpdGlvbiBvZiBuZXcgcHJvcGVydGllcywgbW9kaWZpY2F0aW9ucyBvZiBleGlzdGluZyBwcm9wZXJ0aWVzIG9yCi0gICAgICogcmVtb3ZhbCBvZiBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVDb250ZXh0KEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gb25lIG5lZWQgdG8gdXBkYXRlL3JlcGxpY2F0ZSBvbmx5IGNlcnRhaW5zIHByb3BlcnRpZXMgaW4gdGhlCi0gICAgICogc3BlY2lmaWVkIDxjb2RlPmNvbnRleHQ8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICBUaGUgQWJzdHJhY3RDb250ZXh0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSByZXBsaWNhdGVkCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgcmVwbGljYXRpb24gZmFpbHMKLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQsIFN0cmluZ1tdIHByb3BlcnR5TmFtZXMpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBwcm9wZXJ0aWVzIGluIGEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQWJzdHJhY3RDb250ZXh0fXMgYXJlIHVwZGF0ZWQuCi0gICAgICogVGhpcyBjb3VsZCBiZSBhZGRpdGlvbiBvZiBuZXcgcHJvcGVydGllcywgbW9kaWZpY2F0aW9ucyBvZiBleGlzdGluZyBwcm9wZXJ0aWVzIG9yCi0gICAgICogcmVtb3ZhbCBvZiBwcm9wZXJ0aWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRzIFRoZSBBYnN0cmFjdENvbnRleHRzIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVDb250ZXh0cyhBYnN0cmFjdENvbnRleHRbXSBjb250ZXh0cykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHtAbGluayBBYnN0cmFjdENvbnRleHR9IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3lzdGVtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgQWJzdHJhY3RDb250ZXh0IHRvIGJlIHJlbW92ZWQKLSAgICAgKiBAdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCBJZiBjb250ZXh0IHJlbW92YWwgZmFpbHMKLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZUNvbnRleHQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBDbHVzdGVyaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHByb3BlcnRpZXMgaW4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFic3RyYWN0Q29udGV4dH0KLSAgICAgKiBzaG91bGQgYmUgcmVwbGljYXRlZC4gVGhpcyBhbGxvd3MgYW4gaW1wbGVtZW50ZXIgdG8gZGlzc2FsbG93IHRoZSByZXBsaWNhdGlvbiBvZiBwcm9wZXJ0aWVzCi0gICAgICogc3RvcmVkIGluIGEgY2VydGFpbiB0eXBlIG9mIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBpbnN0YW5jZSBvZiBBYnN0cmFjdENvbnRleHQgdW5kZXIgY29uc2lkZXJhdGlvbgotICAgICAqIEByZXR1cm4gVHJ1ZSAtIGlmIHRoZSBwcm92aWRlZCB7QGxpbmsgQWJzdHJhY3RDb250ZXh0fSAgaXMgY2x1c3RlcmFibGUKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ29udGV4dENsdXN0ZXJhYmxlKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBDb250ZXh0TWFuYWdlckxpc3RlbmVyCi0gICAgICovCi0gICAgdm9pZCBzZXRDb250ZXh0TWFuYWdlckxpc3RlbmVyKENvbnRleHRNYW5hZ2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzeXN0ZW0ncyBjb25maWd1cmF0aW9uIGNvbnRleHQuIFRoaXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjbHVzdGVyaW5nIGltcGxlbWVudGF0aW9ucwotICAgICAqIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQXhpczIgZW52aXJvbm1lbnQgYW5kIHRvIGNvcnJlc3BvbmQgd2l0aCB0aGUgQXhpczIgZW52aXJvbm1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dCBUaGUgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBzZXRDb25maWd1cmF0aW9uQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0KLSAgICAvKioKLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgcHJvcGVydGllcyBpbiB0aGUgY29udGV4dCB3aXRoIHR5cGUgPGNvZGU+Y29udGV4dFR5cGU8L2NvZGU+IHdoaWNoIGhhdmUKLSAgICAgKiBuYW1lcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20gcmVwbGljYXRpb24uCi0gICAgICogPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD4KLSAgICAgKiBPbmx5IHByZWZpeGVzIGFuZCBzdWZmaXhlcyBhcmUgYWxsb3dlZC4gZS5nLiB0aGUgbG9jYWxfKiBwYXR0ZXJuIGluZGljYXRlcyB0aGF0Ci0gICAgICogYWxsIHByb3BlcnR5IG5hbWVzIHN0YXJ0aW5nIHdpdGggbG9jYWxfIHNob3VsZCBiZSBvbWl0dGVkIGZyb20gcmVwbGljYXRpb24uICpfbG9jYWwgcGF0dGVybgotICAgICAqIGluZGljYXRlZCB0aGF0IGFsbCBwcm9wZXJ0eSBuYW1lcyBlbmRpbmcgd2l0aCBfbG9jYWwgc2hvdWxkIGJlIG9taXR0ZWQgZnJvbSByZXBsaWNhdGlvbi4KLSAgICAgKiAqIHBhdHRlcm4gaW5kaWNhdGVzIHRoYXQgYWxsIHByb3BlcnRpZXMgc2hvdWxkIGJlIGV4Y2x1ZGVkLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBHZW5lcmFsbHksIHdlIGNhbiB1c2UgdGhlIGNvbnRleHQgY2xhc3MgbmFtZSBhcyB0aGUgY29udGV4dCB0eXBlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUgdHlwZSBvZiB0aGUgY29udGV4dCBzdWNoIGFzCi0gICAgICogICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQgJgotICAgICAqICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQuCi0gICAgICogICAgICAgICAgICAgICAgICAgIEFsc28gImRlZmF1bHRzIiBpcyBhIHNwZWNpYWwgdHlwZSwgd2hpY2ggd2lsbCBhcHBseSB0byBhbGwgY29udGV4dHMKLSAgICAgKiBAcGFyYW0gcGF0dGVybnMgICAgVGhlIHBhdHRlcm5zCi0gICAgICovCi0gICAgdm9pZCBzZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhTdHJpbmcgY29udGV4dFR5cGUsIExpc3QgcGF0dGVybnMpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCB0aGUgZXhjbHVkZWQgY29udGV4dCBwcm9wZXJ0eSBuYW1lIHBhdHRlcm5zCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEFsbCB0aGUgZXhjbHVkZWQgcGF0dGVybiBvZiBhbGwgdGhlIGNvbnRleHRzLiBUaGUga2V5IG9mIHRoZSBNYXAgaXMgdGhlCi0gICAgICogICAgICAgICB0aGUgPGNvZGU+Y29udGV4dFR5cGU8L2NvZGU+LiBTZWUge0BsaW5rICNzZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhTdHJpbmcsTGlzdCl9LgotICAgICAqICAgICAgICAgVGhlIHZhbHVlcyBhcmUgb2YgdHlwZSB7QGxpbmsgTGlzdH0gb2Yge0BsaW5rIFN0cmluZ30gT2JqZWN0cywKLSAgICAgKiAgICAgICAgIHdoaWNoIGFyZSBhIGNvbGxlY3Rpb24gb2YgcGF0dGVybnMgdG8gYmUgZXhjbHVkZWQuCi0gICAgICogQHNlZSAjc2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLSAgICAgKi8KLSAgICBNYXAgZ2V0UmVwbGljYXRpb25FeGNsdWRlUGF0dGVybnMoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvQ29udGV4dE1hbmFnZXJMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0TWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzYyOGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9Db250ZXh0TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY291bnRlcGFydCBvZiB0aGUge0BsaW5rIENvbnRleHRNYW5hZ2VyfSBpbXBsZW1lbnRhdGlvbi4gT24gdGhlIG1lc3NhZ2Ugc2VuZGluZyBzaWRlLAotICogdGhlIENvbnRleHRNYW5hZ2VyIHdpbGwgc2VuZCBhIGNvbnRleHQgcmVwbGljYXRpb24gbWVzc2FnZSwgd2hpY2ggb24gdGhlIHJlY2VpdmluZwotICogc2lkZSB3aWxsIGJlIGhhbmRlZCBvdmVyIHRvIHRoZSBpbXBsZW1lbnRlciBvZiB0aGlzIGludGVyZmFjZS4gU28gd2hlbiBhIG5vZGUgc2VuZHMgYSBtZXNzYWdlCi0gKiB0aHJvdWdoIHVzaW5nIGl0cyBDb250ZXh0TWFuYWdlciwgYWxsIHJlY2VpdmVycyB3aWxsIGJlIG5vdGlmaWVkIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZQotICogQ29udGV4dE1hbmFnZXJMaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dE1hbmFnZXJMaXN0ZW5lciB7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdGhhdCBhIGNvbnRleHQgcmVwbGljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZC4gVGhlIHJlY2VpdmVyIHdpbGwgaGF2ZSB0bwotICAgICAqIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHRvIHByb2Nlc3MgdGhpcyBtZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgY29udGV4dCByZXBsaWNhdGlvbiBtZXNzYWdlCi0gICAgICogQHRocm93cyBDbHVzdGVyaW5nRmF1bHQgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlY2VpdmVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb250ZXh0VXBkYXRlZChDb250ZXh0Q2x1c3RlcmluZ0NvbW1hbmQgbWVzc2FnZSkgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3lzdGVtJ3MgY29uZmlndXJhdGlvbiBjb250ZXh0LiBUaGlzIHdpbGwgYmUgdXNlZCBieSB0aGUgY2x1c3RlcmluZyBpbXBsZW1lbnRhdGlvbnMKLSAgICAgKiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF4aXMyIGVudmlyb25tZW50IGFuZCB0byBjb3JyZXNwb25kIHdpdGggdGhlIEF4aXMyIGVudmlyb25tZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbkNvbnRleHQgVGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jbHVzdGVyaW5nL2NvbnRleHQvUmVwbGljYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9SZXBsaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDg1YTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NsdXN0ZXJpbmcvY29udGV4dC9SZXBsaWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5BYnN0cmFjdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcGxpY2F0ZXMgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlcGxpY2F0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlcGxpY2F0b3IuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogUmVwbGljYXRlcyBhbGwgc2VyaWFsaXphYmxlIHByb3BlcnRpZXMgaW4gdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0LCBTZXJ2aWNlR3JvdXBDb250ZXh0ICYKLSAgICAgKiBTZXJ2aWNlQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgVGhlIE1lc3NhZ2VDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZUNvbnRleHQsCi0gICAgICogICAgICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBhbmQgQ29uZmlndXJhdGlvbkNvbnRleHQgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxpY2F0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKCFjYW5SZXBsaWNhdGUobXNnQ29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIkdvaW5nIHRvIHJlcGxpY2F0ZSBzdGF0ZSBzdG9yZWQgaW4gQ29uZmlndXJhdGlvbkNvbnRleHQsIiArCi0gICAgICAgICAgICAgICAgICAiIFNlcnZpY2VHcm91cENvbnRleHQsIFNlcnZpY2VDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCAiICsgbXNnQ29udGV4dCArICIuLi4iKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gZ2V0Q29udGV4dE1hbmFnZXIobXNnQ29udGV4dCk7Ci0gICAgICAgIExpc3QgY29udGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgLy8gRG8gd2UgbmVlZCB0byByZXBsaWNhdGUgc3RhdGUgc3RvcmVkIGluIENvbmZpZ3VyYXRpb25Db250ZXh0PwotICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFByb3BlcnR5RGlmZmVyZW5jZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGNvbnRleHRzLmFkZChjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIHJlcGxpY2F0ZSBzdGF0ZSBzdG9yZWQgaW4gU2VydmljZUdyb3VwQ29udGV4dD8KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0NvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgaWYgKHNnQ29udGV4dCAhPSBudWxsICYmICFzZ0NvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29udGV4dHMuYWRkKHNnQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIHJlcGxpY2F0ZSBzdGF0ZSBzdG9yZWQgaW4gU2VydmljZUNvbnRleHQ/Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCAmJiAhc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29udGV4dHMuYWRkKHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvIHRoZSBhY3R1YWwgcmVwbGljYXRpb24gaGVyZQotICAgICAgICBpZiAoIWNvbnRleHRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQWJzdHJhY3RDb250ZXh0W10gY29udGV4dEFycmF5ID0KLSAgICAgICAgICAgICAgICAgICAgKEFic3RyYWN0Q29udGV4dFtdKSBjb250ZXh0cy50b0FycmF5KG5ldyBBYnN0cmFjdENvbnRleHRbY29udGV4dHMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBjb250ZXh0TWFuYWdlci51cGRhdGVDb250ZXh0cyhjb250ZXh0QXJyYXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGljYXRlIGFsbCBzZXJpYWxpemFibGUgcHJvcGVydGllcyBzdG9yZWQgaW4gdGhlIGdpdmVuIDxjb2RlPmFic3RyYWN0Q29udGV4dDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWJzdHJhY3RDb250ZXh0IFRoZSBBYnN0cmFjdENvbnRleHQgd2hpY2ggaG9sZHMgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElmIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxpY2F0ZShBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgaWYgKCFjYW5SZXBsaWNhdGUoYWJzdHJhY3RDb250ZXh0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZygiR29pbmcgdG8gcmVwbGljYXRlIHN0YXRlIGluICIgKyBhYnN0cmFjdENvbnRleHQgKyAiLi4uIik7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gZ2V0Q29udGV4dE1hbmFnZXIoYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgaWYgKCFhYnN0cmFjdENvbnRleHQuZ2V0UHJvcGVydHlEaWZmZXJlbmNlcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY29udGV4dE1hbmFnZXIudXBkYXRlQ29udGV4dChhYnN0cmFjdENvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGljYXRlIGFsbCB0aGUgcHJvcGVydGllcyBnaXZlbiBpbiA8Y29kZT5wcm9wZXJ0eU5hbWVzPC9jb2RlPgotICAgICAqIGluIHRoZSBzcGVjaWZpZWQgPGNvZGU+YWJzdHJhY3RDb250ZXh0PC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGFic3RyYWN0Q29udGV4dCBUaGUgY29udGV4dCB0byBiZSByZXBsaWNhdGVkCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZXMgICBUaGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdG8gYmUgcmVwbGljYXRlZAotICAgICAqIEB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IElGIHJlcGxpY2F0aW9uIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxpY2F0ZShBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJvcGVydHlOYW1lcykgdGhyb3dzIENsdXN0ZXJpbmdGYXVsdCB7Ci0gICAgICAgIGlmICghY2FuUmVwbGljYXRlKGFic3RyYWN0Q29udGV4dCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcoIkdvaW5nIHRvIHJlcGxpY2F0ZSBzZWxlY3RlZCBwcm9wZXJ0aWVzIGluICIgKyBhYnN0cmFjdENvbnRleHQgKyAiLi4uIik7Ci0gICAgICAgIENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyID0gZ2V0Q29udGV4dE1hbmFnZXIoYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgY29udGV4dE1hbmFnZXIudXBkYXRlQ29udGV4dChhYnN0cmFjdENvbnRleHQsIHByb3BlcnR5TmFtZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsdXN0ZXJNYW5hZ2VyIGdldENsdXN0ZXJNYW5hZ2VyKEFic3RyYWN0Q29udGV4dCBhYnN0cmFjdENvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGFic3RyYWN0Q29udGV4dC5nZXRSb290Q29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0Q2x1c3Rlck1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0TWFuYWdlciBnZXRDb250ZXh0TWFuYWdlcihBYnN0cmFjdENvbnRleHQgYWJzdHJhY3RDb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRDbHVzdGVyTWFuYWdlcihhYnN0cmFjdENvbnRleHQpLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgd2hldGhlciB0aGUgc3RhdGUgc3RvcmUgaW4gdGhlIHNwZWNpZmllZCA8Y29kZT5hYnN0cmFjdENvbnRleHQ8L2NvZGU+IGNhbiBiZSByZXBsaWNhdGVkLgotICAgICAqIEFsc28gbm90ZSB0aGF0IGlmIHRoZXJlIGFyZSBubyBtZW1iZXJzLCB3ZSBuZWVkIG5vdCBkbyBhbnkgcmVwbGljYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBhYnN0cmFjdENvbnRleHQgVGhlIGNvbnRleHQgdG8gYmUgc3ViamVjdGVkIHRvIHRoaXMgdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSAtIFN0YXRlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQKLSAgICAgKiAgICAgICAgIGZhbHNlIC0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZXBsaWNhdGUoQWJzdHJhY3RDb250ZXh0IGFic3RyYWN0Q29udGV4dCkgewotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgYWJzdHJhY3RDb250ZXh0LmdldFJvb3RDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICBib29sZWFuIGNhblJlcGxpY2F0ZSA9IGZhbHNlOwotICAgICAgICBpZiAoY2x1c3Rlck1hbmFnZXIgIT0gbnVsbCAmJiBjbHVzdGVyTWFuYWdlci5nZXRDb250ZXh0TWFuYWdlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhblJlcGxpY2F0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmdldENvbnRleHRNYW5hZ2VyKCkuaXNDb250ZXh0Q2x1c3RlcmFibGUoYWJzdHJhY3RDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuUmVwbGljYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0YXRlIHN0b3JlIGluIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWVzc2FnZUNvbnRleHQ8L2NvZGU+IGNhbiBiZSByZXBsaWNhdGVkLgotICAgICAqIEFsc28gbm90ZSB0aGF0IGlmIHRoZXJlIGFyZSBubyBtZW1iZXJzLCB3ZSBuZWVkIG5vdCBkbyBhbnkgcmVwbGljYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCBUaGUgTWVzc2FnZUNvbnRleHQgdG8gYmUgc3ViamVjdGVkIHRvIHRoaXMgdGVzdAotICAgICAqIEByZXR1cm4gdHJ1ZSAtIFN0YXRlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQKLSAgICAgKiAgICAgICAgIGZhbHNlIC0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZXBsaWNhdGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIgPQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldFJvb3RDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICByZXR1cm4gY2x1c3Rlck1hbmFnZXIgIT0gbnVsbCAmJiBjbHVzdGVyTWFuYWdlci5nZXRDb250ZXh0TWFuYWdlcigpICE9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQWJzdHJhY3RDb250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9BYnN0cmFjdENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0Mzc4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9BYnN0cmFjdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5SZXBsaWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHRvcCBtb3N0IGxldmVsIG9mIHRoZSBDb250ZXh0IGhpZXJhcmNoeSBhbmQgaXMgYSBiYWcgb2YgcHJvcGVydGllcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGV4dCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RDb250ZXh0LmNsYXNzKTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVBfU0laRSA9IDY0OwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUdfRU5BQkxFRCA9IGxvZy5pc1RyYWNlRW5hYmxlZCgpOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUdfUFJPUEVSVFlfU0VUID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJvcGVydHkgdXNlZCB0byBpbmRpY2F0ZSBjb3B5aW5nIG9mIHByb3BlcnRpZXMgaXMgbmVlZGVkIGJ5IGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWV9QUk9QRVJUSUVTID0gIkNvcHlQcm9wZXJ0aWVzIjsKLQotICAgIHByb3RlY3RlZCBsb25nIGxhc3RUb3VjaGVkVGltZTsKLQotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQWJzdHJhY3RDb250ZXh0IHBhcmVudDsKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnR5RGlmZmVyZW5jZXM7Ci0KLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDb250ZXh0KEFic3RyYWN0Q29udGV4dCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0Q29udGV4dCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIEFic3RyYWN0Q29udGV4dCBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRleHQgaXMgYW4gYW5jZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FuY2VzdG9yKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEFic3RyYWN0Q29udGV4dCBhbmNlc3RvciA9IGdldFBhcmVudCgpOwotICAgICAgICAgICAgYW5jZXN0b3IgIT0gbnVsbDsKLSAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50KCkpIHsKLSAgICAgICAgICAgIGlmIChhbmNlc3RvciA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0aWVzCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UHJvcGVydHlOYW1lcygpfSwge0BsaW5rICNnZXRQcm9wZXJ0eShTdHJpbmcpfSwKLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KX0gJiB7QGxpbmsgI3JlbW92ZVByb3BlcnR5KFN0cmluZyl9aW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBpbml0UHJvcGVydGllc01hcCgpOwotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpdGVyYXRvciBvdmVyIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMsIHdoaWNoIGFyZSB0aGUKLSAgICAgKiBrZXlzIGluIHRoZSBwcm9wZXJ0aWVzIG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gSXRlcmF0b3Igb3ZlciBhIGNvbGxlY3Rpb24gb2Yga2V5cwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0gICAgICAgIGluaXRQcm9wZXJ0aWVzTWFwKCk7Ci0gICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBjb3B5S2V5U2V0ID0gbnVsbDsKLSAgICAgICAgLy8gTG9jayB0aGUgdGFibGUgaW4gYSB0cnkvY2F0Y2ggc28gaXQgd2lsbCBhbHdheXMgYmUgdW5sb2NrZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICgoSGFzaE1hcFVwZGF0ZUxvY2thYmxlPFN0cmluZywgT2JqZWN0PikgcHJvcGVydGllcykubG9ja0ZvclVwZGF0ZSgpOwotICAgICAgICAgICAgY29weUtleVNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocHJvcGVydGllcy5rZXlTZXQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAoKEhhc2hNYXBVcGRhdGVMb2NrYWJsZTxTdHJpbmcsIE9iamVjdD4pIHByb3BlcnRpZXMpLnVubG9ja0ZvclVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoY29weUtleVNldCAhPSBudWxsKSA/IGNvcHlLZXlTZXQuaXRlcmF0b3IoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdCBnaXZlbiBhIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgLSBpZiBub3QgZm91bmQsIHdpbGwgcmV0dXJuIG51bGwKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBPYmplY3Qgb2JqID0gcHJvcGVydGllcyA9PSBudWxsID8gbnVsbCA6IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChvYmohPW51bGwpIHsKLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGEgcHJvcGVydHkgd2hpY2ggaXMgcmVhZCBtYXkgYmUgdXBkYXRlZC4KLSAgICAgICAgICAgIC8vIGkuZS4gVGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICd2YWx1ZScgbWF5IGJlIG1vZGlmaWVkIGFmdGVyIGl0IGlzIHJlYWQKLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIG9iaiwgZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCE9bnVsbCkgewotICAgICAgICAgICAgb2JqID0gcGFyZW50LmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuIG9iamVjdCBnaXZlbiBhIGtleS4gT25seSBzZWFyY2hlcyBhdCB0aGlzIGxldmVsCi0gICAgICogaS5lLiBnZXRMb2NhbFByb3BlcnR5IG9uIE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IGxvb2sgaW4KLSAgICAgKiB0aGUgT3BlcmF0aW9uQ29udGV4dCBwcm9wZXJ0aWVzIG1hcCBpZiBhIGxvY2FsIHJlc3VsdCBpcyBub3QKLSAgICAgKiBmb3VuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgLSBpZiBub3QgZm91bmQsIHdpbGwgcmV0dXJuIG51bGwKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TG9jYWxQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKChvYmogPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBnZXRMb2NhbFByb3BlcnR5KCkgZG9uJ3Qgc2VhcmNoIHRoZSBoaWVyYXJjaHkuCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGEgcHJvcGVydHkgaXMgd2hpY2ggaXMgcmVhZCBtYXkgYmUgdXBkYXRlZC4KLSAgICAgICAgICAgIC8vIGkuZS4gVGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICd2YWx1ZScgbWF5IGJlIG1vZGlmaWVkIGFmdGVyIGl0IGlzIHJlYWQKLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIG9iaiwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbiBvYmplY3QgZ2l2ZW4gYSBrZXkuIFRoZSByZXRyaWV2ZWQgcHJvcGVydHkgd2lsbCBub3QgYmUgcmVwbGljYXRlZCB0bwotICAgICAqIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyZWQgc2NlbmFyaW8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IC0gaWYgbm90IGZvdW5kLCB3aWxsIHJldHVybiBudWxsCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBwcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKChvYmogPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotICAgICAgICAgICAgb2JqID0gcGFyZW50LmdldFByb3BlcnR5Tm9uUmVwbGljYWJsZShrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmUgYSBwcm9wZXJ0eSBpbiB0aGlzIGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW5pdFByb3BlcnRpZXNNYXAoKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIGlmIChERUJVR19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBkZWJ1Z1Byb3BlcnR5U2V0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5RGlmZmVyZW5jZShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUsICBib29sZWFuIGlzUmVtb3ZlZCkgewotICAgICAgICAKLSAgICAgICAgaWYgKCFuZWVkUHJvcGVydHlEaWZmZXJlbmNlcygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTmFycm93ZWQgdGhlIHN5bmNocm9uaXphdGlvbiBzbyB0aGF0IHdlIG9ubHkgd2FpdAotICAgICAgICAvLyBpZiBhIHByb3BlcnR5IGRpZmZlcmVuY2UgaXMgYWRkZWQuCi0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAvLyBMYXppemx5IGNyZWF0ZSBwcm9wZXJ0eURpZmZlcmVuY2VzIG1hcAotICAgICAgICAgICAgaWYgKHByb3BlcnR5RGlmZmVyZW5jZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BlcnR5RGlmZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oREVGQVVMVF9NQVBfU0laRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wZXJ0eURpZmZlcmVuY2VzLnB1dChrZXksIG5ldyBQcm9wZXJ0eURpZmZlcmVuY2Uoa2V5LCB2YWx1ZSwgaXNSZW1vdmVkKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG8gc3RvcmUgcHJvcGVydHkgZGlmZmVyZW5jZXMgZm9yIHRoaXMgCi0gICAgICogY29udGV4dCBpbiB0aGlzIHNjZW5hcmlvLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkUHJvcGVydHlEaWZmZXJlbmNlcygpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIERvbid0IHN0b3JlIHByb3BlcnR5IGRpZmZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyAKLSAgICAgICAgLy8gY2x1c3RlciBtZW1iZXJzLgotICAgICAgICAKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBnZXRSb290Q29udGV4dCgpOwotICAgICAgICBpZiAoY2MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFkZCB0aGUgcHJvcGVydHkgZGlmZmVyZW5jZXMgb25seSBpZiBDb250ZXh0IHJlcGxpY2F0aW9uIGlzIGVuYWJsZWQsCi0gICAgICAgIC8vIGFuZCB0aGVyZSBhcmUgbWVtYmVycyBpbiB0aGUgY2x1c3RlcgotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0Q2x1c3Rlck1hbmFnZXIoKTsKLSAgICAgICAgaWYgKGNsdXN0ZXJNYW5hZ2VyID09IG51bGwgfHwKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmdldENvbnRleHRNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3JlIGEgcHJvcGVydHkgaW4gdGhpcyBjb250ZXh0LgotICAgICAqIEJ1dCB0aGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBub3QgYmUgcmVwbGljYXRlZCB3aGVuIEF4aXMyIGlzIGNsdXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb25SZXBsaWNhYmxlUHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGluaXRQcm9wZXJ0aWVzTWFwKCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHByb3BlcnR5LiBPbmx5IHByb3BlcnRpZXMgYXQgdGhpcyBsZXZlbCB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogUHJvcGVydGllcyBvZiB0aGUgcGFyZW50cyBjYW5ub3QgYmUgcmVtb3ZlZCB1c2luZyB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIGtleSkgewotICAgICAgICBpZihwcm9wZXJ0aWVzID09IG51bGwpewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZFByb3BlcnR5RGlmZmVyZW5jZShrZXksIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHByb3BlcnR5LiBPbmx5IHByb3BlcnRpZXMgYXQgdGhpcyBsZXZlbCB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogUHJvcGVydGllcyBvZiB0aGUgcGFyZW50cyBjYW5ub3QgYmUgcmVtb3ZlZCB1c2luZyB0aGlzIG1ldGhvZC4KLSAgICAgKiBUaGUgcmVtb3ZhbCBvZiB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmUgcmVwbGljYXRlZCB3aGVuIEF4aXMyIGlzIGNsdXN0ZXJlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlOb25SZXBsaWNhYmxlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvcGVydHkgZGlmZmVyZW5jZXMgc2luY2UgdGhlIGxhc3QgdHJhbnNtaXNzaW9uIGJ5IHRoZSBjbHVzdGVyaW5nCi0gICAgICogbWVjaGFuaXNtCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSBkaWZmZXJlbmNlcwotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0eURpZmZlcmVuY2VzKCkgewotICAgICAgICBpZiAocHJvcGVydHlEaWZmZXJlbmNlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eURpZmZlcmVuY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KERFRkFVTFRfTUFQX1NJWkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eURpZmZlcmVuY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9uY2UgdGhlIGNsdXN0ZXJpbmcgbWVjaGFuaXNtIHRyYW5zbWl0cyB0aGUgcHJvcGVydHkgZGlmZmVyZW5jZXMsCi0gICAgICogaXQgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgdG8gYXZvaWQgcmV0cmFuc21pdHRpbmcgc3R1ZmYgdGhhdCBoYXMgYWxyZWFkeQotICAgICAqIGJlZW4gc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJQcm9wZXJ0eURpZmZlcmVuY2VzKCkgewotICAgICAgICBpZiAocHJvcGVydHlEaWZmZXJlbmNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eURpZmZlcmVuY2VzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgICAgICBwYXJlbnQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBzZXQgdGhlIHByb3BlcnRpZXMgdG8gdGhlIGNvbnRleHQuIEJ1dCBpbiBzZXR0aW5nIHRoYXQgb25lIG1heSBuZWVkIHRvICJjb3B5IiBhbGwKLSAgICAgKiB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2UgcHJvcGVydGllcyB0byB0aGUgdGFyZ2V0IHByb3BlcnRpZXMuIFRvIGVuYWJsZSB0aGlzIHdlIGludHJvZHVjZWQKLSAgICAgKiBhIHByb3BlcnR5ICh7QGxpbmsgI0NPUFlfUFJPUEVSVElFU30pIHNvIHRoYXQgaWYgc2V0IHRvIHRydWUsIHRoaXMgY29kZQotICAgICAqIHdpbGwgY29weSB0aGUgd2hvbGUgdGhpbmcsIHdpdGhvdXQganVzdCByZWZlcmVuY2luZyB0byB0aGUgc291cmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgewotICAgICAgICBpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQm9vbGVhbiBjb3B5UHJvcGVydGllcyA9ICgoQm9vbGVhbikgcHJvcGVydGllcy5nZXQoQ09QWV9QUk9QRVJUSUVTKSk7Ci0KLSAgICAgICAgICAgIGlmICgoY29weVByb3BlcnRpZXMgIT0gbnVsbCkgJiYgY29weVByb3BlcnRpZXMuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBtZXJnZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMgIT0gcHJvcGVydGllcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnUHJvcGVydHlTZXQoKFN0cmluZykgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVGhlIE1hcCB3ZSBnb3QgYXJndW1lbnQgaXMgcHJvYmFibHkgTk9UIGFuIGluc3RhbmNlIG9mIHRoZSBDb25jdXJyZW50IAotICAgICAgICAgICAgICAgIC8vIG1hcCB3ZSB1c2UgdG8gc3RvcmUgcHJvcGVydGllcywgc28gY3JlYXRlIGEgbmV3IG9uZSB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgLy8gYXJndW1lbnQgbWFwLgotICAgICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGU8U3RyaW5nLCBPYmplY3Q+KHByb3BlcnRpZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGRvIGEgY29weSBvZiB0aGUgZ2l2ZW4gcHJvcGVydGllcyB0byB0aGUgY3VycmVudCBwcm9wZXJ0aWVzCi0gICAgICogdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcHMgVGhlIHRhYmxlIG9mIHByb3BlcnRpZXMgdG8gY29weQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lcmdlUHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzKSB7Ci0gICAgICAgIGlmIChwcm9wcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0UHJvcGVydGllc01hcCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gcHJvcHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgICAgICBkZWJ1Z1Byb3BlcnR5U2V0KChTdHJpbmcpIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcnZpY2VDb250ZXh0IGFuZCBTZXJ2aWNlR3JvdXBDb250ZXh0IGFyZSBub3QgZ2V0dGluZyBhdXRvbWF0aWNhbGx5IGdhcmJhZ2UgY29sbGVjdGVkLiBBbmQgdGhlcmUKLSAgICAgKiBpcyBubyBzcGVjaWZpYyB3YXkgZm9yIHNvbWUgb25lIHRvIGdvIGFuZCBtYWtlIGl0IGdhcmJhZ2UgY29sbGVjdGlibGUuCi0gICAgICogU28gdGhlIGN1cnJlbnQgc29sdXRpb24gaXMgdG8gbWFrZSB0aGVtIHRpbWUgb3V0LiBTbyB0aGUgbG9naWMgaXMgdGhhdCwgdGhlcmUgaXMgYSB0aW1lciB0YXNrCi0gICAgICogaW4gZWFjaCBhbmQgZXZlcnkgc2VydmljZSBncm91cCB3aGljaCB3aWxsIGNoZWNrIGZvciB0aGUgbGFzdCB0b3VjaGVkIHRpbWUuIEFuZCBpZiBpdCBoYXMgbm90Ci0gICAgICogYmVlbiB0b3VjaGVkIGZvciBzb21lIHRpbWUsIHRoZSB0aW1lciB0YXNrIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIG1lbW9yeS4KLSAgICAgKiBUaGUgdG91Y2hpbmcgbG9naWMgaGFwcGVucyBsaWtlIHRoaXMuIFdoZW5ldmVyIHRoZXJlIGlzIGEgY2FsbCB0byBhZGRNZXNzYWdlQ29udGV4dCBpbiB0aGUgb3BlcmF0aW9uQ29udGV4dAotICAgICAqIGl0IHdpbGwgZ28gYW5kIHVwZGF0ZSBvcGVyYXRpb25DT250ZXh0IC0+IHNlcnZpY2VDb250ZXh0IC0+IHNlcnZpY2VHcm91cENvbnRleHQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdG91Y2goKSB7Ci0gICAgICAgIGxhc3RUb3VjaGVkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudC50b3VjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdFRvdWNoZWRUaW1lKCkgewotICAgICAgICByZXR1cm4gbGFzdFRvdWNoZWRUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RUb3VjaGVkVGltZShsb25nIHQpIHsKLSAgICAgICAgbGFzdFRvdWNoZWRUaW1lID0gdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSZXBsaWNhdG9yLnJlcGxpY2F0ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Um9vdENvbnRleHQoKTsKLQotICAgIC8qKgotICAgICAqIERlYnVnIGZvciBmb3IgcHJvcGVydHkga2V5IGFuZCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYnVnUHJvcGVydHlTZXQoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChERUJVR19QUk9QRVJUWV9TRVQpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAodmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2xvYWRlciA9ICJudWxsIjsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFV0aWxzLmdldE9iamVjdENsYXNzTG9hZGVyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZihjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyID0gY2wudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWVUZXh0ID0gKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyAKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFByb3BlcnR5IHNldCBvbiBvYmplY3QgIiArIGlkZW50aXR5KTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBLZXkgPSIgKyBrZXkpOwotICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlID0iICsgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSBDbGFzcyA9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIFZhbHVlIENsYXNzbG9hZGVyID0gIiArIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggICJDYWxsIFN0YWNrID0gIiArIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiPT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgdGhlICdwcm9wZXJ0aWVzJyBtYXAgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQsIHRoZW4gYWxsb2NhdGUgaXQuIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0UHJvcGVydGllc01hcCgpIHsKLSAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBhIGNvbmN1cnJlbnQgY29sbGVjdGlvbiB0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNwZXRpb25zCi0gICAgICAgICAgICAvLyBmb3IgYXN5bmMtb24tdGhlLXdpcmUuICBJdCB3YXMgb3JpZ2luYWxseTogCi0vLyAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcChERUZBVUxUX01BUF9TSVpFKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlPFN0cmluZywgT2JqZWN0PihERUZBVUxUX01BUF9TSVpFKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBIYXNoTWFwIHRoYXQgc3VwcG9ydHMgYW4gdXBkYXRlIGxvY2suICBIYXNoTWFwIG1ldGhvZHMgdGhhdCB3b3VsZCBkaXJlY3RseSB1cGRhdGUgdGhlIGNvbGxlY3Rpb24KLSAqIHdpbGwgYmxvY2sgaWYgdGhlIGNvbGxlY3Rpb24gaXMgbG9ja2VkLiAgVGhleSB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gdGhlIGNvbGxlY3Rpb24gaXMgdW5sb2NrZWQuCi0gKiBNZXRob2RzIHRoYXQgZG8gbm90IHVwZGF0ZSB0aGUgY29sbGVjdGlvbiB3aWxsIG5vdCBiZSBibG9ja2VkLgotICovCi1jbGFzcyBIYXNoTWFwVXBkYXRlTG9ja2FibGU8SywgVj4gZXh0ZW5kcyBIYXNoTWFwPEssIFY+IHsKLQotICAgIC8vIFVzZWQgZm9yIHN5bmNocm9uaXphdGlvbiBkdXJpbmcgdXBkYXRlIGxvY2tpbmcuICBBbHNvIGluZGljYXRlcyBpZiB0aGUgdGFibGUgaXMgbG9ja2VkLgotICAgIC8vIEluaXRpYWxseSwgaXQgaXMgbm90IGxvY2tlZC4KLSAgICBwcml2YXRlIFVwZGF0ZUxvY2sgdXBkYXRlTG9jayA9IG5ldyBVcGRhdGVMb2NrKGZhbHNlKTsKLQotICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKGludCBzaXplKSB7Ci0gICAgICAgIHN1cGVyKHNpemUpOwotICAgIH0KLQotICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZShNYXA8SywgVj4gbWFwKSB7Ci0gICAgICAgIHN1cGVyKG1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2ltaWxhciB0byBzdXBlciBtZXRob2QgYnV0IHdpbGwgYmxvY2sgaWYgY29sbGVjdGlvbiBpcyBsb2NrZWQuCi0gICAgICogQHNlZSBqYXZhLnV0aWwuSGFzaE1hcCNwdXQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsKLSAgICAgICAgY2hlY2tVcGRhdGVMb2NrKHRydWUpOwotICAgICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8gc3VwZXIgbWV0aG9kIGJ1dCB3aWxsIGJsb2NrIGlmIGNvbGxlY3Rpb24gaXMgbG9ja2VkLgotICAgICAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjcHV0QWxsKGphdmEudXRpbC5NYXApCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgewotICAgICAgICBjaGVja1VwZGF0ZUxvY2sodHJ1ZSk7Ci0gICAgICAgIHN1cGVyLnB1dEFsbChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8gc3VwZXIgbWV0aG9kIGJ1dCB3aWxsIGJsb2NrIGlmIGNvbGxlY3Rpb24gaXMgbG9ja2VkLgotICAgICAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjcmVtb3ZlKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgY2hlY2tVcGRhdGVMb2NrKHRydWUpOwotICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9jayB0aGUgY29sbGVjdGlvbiBmb3IgdXBkYXRlLiAgTk9URTogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGluc2lkZSBhIHRyeSBibG9jayBhbmQgdGhlIAotICAgICAqIHVubG9jayBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgYSBmaW5hbGx5IGJsb2NrIHRvIGVuc3VyZSB0aGUgbG9jayBpcyBhbHdheXMKLSAgICAgKiByZWxlYXNlZCEgIElmIHRoZSBjb2xsZWN0aW9uIGlzIGxvY2tlZCwgbWV0aG9kcyB0aGF0IGRpcmVjdGx5IHVwZGF0ZSB0aGUgdGFibGUgd2lsbCAKLSAgICAgKiBibG9jayB1bnRpbCByZWxlYXNlZCBieSB0aGUgdW5sb2NrLgotICAgICAqIEBzZWUgI3VubG9ja0ZvclVwZGF0ZSgpCi0gICAgICovCi0gICAgdm9pZCBsb2NrRm9yVXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodXBkYXRlTG9jaykgewotICAgICAgICAgICAgdXBkYXRlTG9jay5zZXRMb2NrKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5vY2sgdGhlIGNvbGxlY3Rpb24gZm9yIHVwZGF0ZS4gIE5PVEU6IFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgYSBmaW5hbGx5IGJsb2NrIGFuZCB0aGUgCi0gICAgICogbG9jayBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbnNpZGUgYSB0cnkgYmxvY2sgdG8gZW5zdXJlIHRoZSBsb2NrIGlzIGFsd2F5cwotICAgICAqIHJlbGVhc2VkISAgSWYgdGhlIGNvbGxlY3Rpb24gaXMgbG9ja2VkLCBtZXRob2RzIHRoYXQgZGlyZWN0bHkgdXBkYXRlIHRoZSB0YWJsZSB3aWxsIAotICAgICAqIGJsb2NrIHVudGlsIHJlbGVhc2VkIGJ5IHRoaXMgdW5sb2NrLgotICAgICAqIEBzZWUgI2xvY2tGb3JVcGRhdGUoKQotICAgICAqLwotICAgIHZvaWQgdW5sb2NrRm9yVXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodXBkYXRlTG9jaykgewotICAgICAgICAgICAgdXBkYXRlTG9jay5zZXRMb2NrKGZhbHNlKTsKLSAgICAgICAgICAgIHVwZGF0ZUxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgdXBkYXRlIGxvY2sgaXMgY3VycmVudGx5IGhlbGQuICBPcHRpb25hbGx5IGJsb2NrIHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLgotICAgICAqIEBwYXJhbSB3YWl0IElmIHRydWUsIHdpbGwgYmxvY2sgdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbGxlY3Rpb24gaXMgY3VycmVudGx5IGxvY2tlZCBmb3IgdXBkYXRlLCBmYWxzZSBpZiBpdCBpcyBub3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBjaGVja1VwZGF0ZUxvY2soYm9vbGVhbiB3YWl0KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNMb2NrZWQgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkKHVwZGF0ZUxvY2spIHsKLSAgICAgICAgICAgIGlmICh3YWl0KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHVwZGF0ZUxvY2suaXNMb2NrZWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTG9jay53YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgaW50ZXJydXB0OyByZWNoZWNrIHRoZSBsb2NrIGFuZCB3YWl0IGlmIGFwcHJvcHJpYXRlLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXNMb2NrZWQgPSB1cGRhdGVMb2NrLmlzTG9ja2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaXNMb2NrZWQ7Ci0gICAgfQotCi0gICAgY2xhc3MgVXBkYXRlTG9jayB7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvY2tlZCA9IGZhbHNlOwotCi0gICAgICAgIFVwZGF0ZUxvY2soYm9vbGVhbiBpc0xvY2tlZCkgewotICAgICAgICAgICAgdGhpcy5pc0xvY2tlZCA9IGlzTG9ja2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRMb2NrKGJvb2xlYW4gbG9ja1ZhbHVlKSB7Ci0gICAgICAgICAgICB0aGlzLmlzTG9ja2VkID0gbG9ja1ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0xvY2tlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc0xvY2tlZDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db25maWd1cmF0aW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzZhNzI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuQ2x1c3RlcmluZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5Db250ZXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLnRocmVhZHBvb2wuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwudGhyZWFkcG9vbC5UaHJlYWRQb29sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotLyoqCi0gKiA8cD5BeGlzMiBzdGF0ZXMgYXJlIGhlbGQgaW4gdHdvIGluZm9ybWF0aW9uIG1vZGVscywgY2FsbGVkIGRlc2NyaXB0aW9uIGhpZXJhcmNoeSBhbmQgY29udGV4dAotICogaGllcmFyY2h5LiBEZXNjcmlwdGlvbiBoaWVyYXJjaHkgaG9sZCBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gYW5kIGl0J3MgdmFsdWVzIGRvZXMgbm90IGNoYW5nZQotICogdW5sZXNzIGRlcGxveW1lbnQgY29uZmlndXJhdGlvbiBjaGFuZ2Ugb2NjdXJzIHdoZXJlIENvbnRleHQgaGllcmFyY2h5IGhvbGQgcnVuIHRpbWUgaW5mb3JtYXRpb24uCi0gKiBCb3RoIGhpZXJhcmNoaWVzIGNvbnNpc3RzIGZvdXIgbGV2ZWxzLCBHbG9iYWwsIFNlcnZpY2UgR3JvdXAsIE9wZXJhdGlvbiBhbmQgTWVzc2FnZS4gUGxlYXNlIGxvb2sKLSAqIGF0ICJJbmZvcm1hdGlvbiBNb2RlbCIgc2VjdGlvbiAgb2YgIkF4aXMyIEFyY2hpdGVjdHVyZSBHdWlkZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotICogPHAvPgotICogPHA+Q29uZmlndXJhdGlvbiBDb250ZXh0IGhvbGQgR2xvYmFsIGxldmVsIHJ1bi10aW1lIGluZm9ybWF0aW9uLiBUaGlzIGFsbG93cyBzYW1lIGNvbmZpZ3VyYXRpb25zCi0gKiB0byBiZSB1c2VkIGJ5IHR3byBBeGlzMiBpbnN0YW5jZXMgYW5kIG1vc3QgQXhpczIgd2lkZSBjb25maWd1cmF0aW9ucyBjYW4gY2hhbmdlZCBieSBzZXR0aW5nIG5hbWUKLSAqIHZhbHVlIHBhaXJzIG9mIHRoZSBjb25maWd1cmF0aW9uQ29udGV4dC4gVGhpcyBob2xkIGFsbCBPcGVyYXRpb25Db250ZXh0cywgU2VydmljZUdyb3VwcywKLSAqIFNlc3Npb25zLCBhbmQgTGlzdGVuZXJNYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRleHQgZXh0ZW5kcyBBYnN0cmFjdENvbnRleHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbmZpZ3VyYXRpb25Db250ZXh0LmNsYXNzKTsKLSAgICAvKiogTWFwIGNvbnRhaW5pbmcgPGNvZGU+TWVzc2FnZUlEPC9jb2RlPiB0byA8Y29kZT5PcGVyYXRpb25Db250ZXh0PC9jb2RlPiBtYXBwaW5nLiAqLwotICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBPcGVyYXRpb25Db250ZXh0PiBvcGVyYXRpb25Db250ZXh0TWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgT3BlcmF0aW9uQ29udGV4dD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IHNlcnZpY2VHcm91cENvbnRleHRNYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU2VydmljZUdyb3VwQ29udGV4dD4oKTsKLSAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+KCk7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLSAgICBwcml2YXRlIFRocmVhZEZhY3RvcnkgdGhyZWFkUG9vbDsKLSAgICAvL1RvIGtlZXAgVHJhbnNwb3J0TWFuYWdlciBpbnN0YW5jZQotICAgIHByaXZhdGUgTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlcjsKLQotICAgIC8vIGN1cnJlbnQgdGltZSBvdXQgaW50ZXJ2YWwgaXMgMzAgc2Vjcy4gTmVlZCB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlCi0gICAgcHJpdmF0ZSBsb25nIHNlcnZpY2VHcm91cENvbnRleHRUaW1lb3V0SW50ZXJ2YWwgPSAzMCAqIDEwMDA7Ci0KLSAgICAvL1RvIHNwZWNpZnkgdXJsIG1hcHBpbmcgZm9yIHNlcnZpY2VzCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFJvb3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVBhdGg7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjYWNoZWRTZXJ2aWNlUGF0aCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpc3Q8Q29udGV4dExpc3RlbmVyPiBjb250ZXh0TGlzdGVuZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzQ29uZmlndXJhdGlvbiAtIEF4aXNDb25maWd1cmF0aW9uIGZvciB3aGljaCB0byBjcmVhdGUgYSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICB0aGlzLmF4aXNDb25maWd1cmF0aW9uID0gYXhpc0NvbmZpZ3VyYXRpb247Ci0gICAgICAgIGluaXRDb25maWdDb250ZXh0VGltZW91dChheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDb25maWdDb250ZXh0VGltZW91dChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gYXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTkZJR19DT05URVhUX1RJTUVPVVRfSU5URVJWQUwpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBDbHVzdGVyTWFuYWdlciBmb3IgdGhpcyBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0Q2x1c3RlcigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9IGF4aXNDb25maWd1cmF0aW9uLmdldENsdXN0ZXJNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChjbHVzdGVyTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IGNsdXN0ZXJNYW5hZ2VyLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dE1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IGNsdXN0ZXJNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dCh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaG91bGRDbHVzdGVyQmVJbml0aWF0ZWQoY2x1c3Rlck1hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuc2V0Q29uZmlndXJhdGlvbkNvbnRleHQodGhpcyk7Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuaW5pdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsdXN0ZXJNYW5hZ2VyIFRoZSBDbHVzdGVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbgotICAgICAqIEByZXR1cm4gdHJ1ZSwgaWYgdGhlIGNsdXN0ZXIgbmVlZHMgdG8gYmUgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCBieSB0aGUgZnJhbWV3b3JrOyBmYWxzZSwKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkQ2x1c3RlckJlSW5pdGlhdGVkKENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuZ2V0UGFyYW1ldGVyKENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5BVk9JRF9JTklUSUFUSU9OKTsKLSAgICAgICAgcmV0dXJuICEocGFyYW0gIT0gbnVsbCAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShwYXJhbS5nZXRWYWx1ZSgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtIGFueSBsaXN0ZW5lcnMgb2YgYSBuZXcgY29udGV4dCBiZWluZyBjcmVhdGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUganVzdC1jcmVhdGVkIHN1YmNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIGNvbnRleHRDcmVhdGVkKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb250ZXh0TGlzdGVuZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9iamVjdCBjb250ZXh0TGlzdGVuZXIgOiBjb250ZXh0TGlzdGVuZXJzKSB7Ci0gICAgICAgICAgICBDb250ZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoQ29udGV4dExpc3RlbmVyKWNvbnRleHRMaXN0ZW5lcjsKLSAgICAgICAgICAgIGxpc3RlbmVyLmNvbnRleHRDcmVhdGVkKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtIGFueSBsaXN0ZW5lcnMgb2YgYSBjb250ZXh0IGJlaW5nIHJlbW92ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBqdXN0LWNyZWF0ZWQgc3ViY29udGV4dAotICAgICAqLwotICAgIHZvaWQgY29udGV4dFJlbW92ZWQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHRMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IGNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgIENvbnRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChDb250ZXh0TGlzdGVuZXIpY29udGV4dExpc3RlbmVyOwotICAgICAgICAgICAgbGlzdGVuZXIuY29udGV4dFJlbW92ZWQoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIHtAbGluayBDb250ZXh0TGlzdGVuZXJ9IHRvIGJlIG5vdGlmaWVkIG9mIGFsbCBzdWItY29udGV4dCBldmVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dExpc3RlbmVyIEEgQ29udGV4dExpc3RlbmVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ29udGV4dExpc3RlbmVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29udGV4dExpc3RlbmVyKENvbnRleHRMaXN0ZW5lciBjb250ZXh0TGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKGNvbnRleHRMaXN0ZW5lcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGV4dExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8Q29udGV4dExpc3RlbmVyPigpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHRMaXN0ZW5lcnMuYWRkKGNvbnRleHRMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ29udGV4dExpc3RlbmVyfQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRMaXN0ZW5lciBBIENvbnRleHRMaXN0ZW5lcgotICAgICAqIEBzZWUgI2FkZENvbnRleHRMaXN0ZW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRMaXN0ZW5lcihDb250ZXh0TGlzdGVuZXIgY29udGV4dExpc3RlbmVyKSB7Ci0gICAgICAgIGlmIChjb250ZXh0TGlzdGVuZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRleHRMaXN0ZW5lcnMucmVtb3ZlKGNvbnRleHRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgYSBTZXJ2aWNlR3JvdXBDb250ZXh0IGluIHRoZSBtYXAgd2l0aCBnaXZlbiBpZCBhcyB0aGUga2V5LgotICAgICAqIDxwcmU+Ci0gICAgICogSWYoa2V5ICE9IG51bGwgJiYgZm91bmQpCi0gICAgICogY2hlY2sgZm9yIGEgc2VydmljZSBjb250ZXh0IGZvciB0aGUgaW50ZW5kZWQgc2VydmljZS4KLSAgICAgKiBpZiAoIWZvdW5kKQotICAgICAqIGNyZWF0ZSBvbmUgYW5kIGhvb2sgdXAgdG8gU2VydmljZUdyb3VwQ29udGV4dAotICAgICAqIGVsc2UKLSAgICAgKiBjcmVhdGUgbmV3IFNlcnZpY2VHcm91cENvbnRleHQgd2l0aCB0aGUgZ2l2ZW4ga2V5IG9yIGlmIGtleSBpcyBudWxsIHdpdGggYSBuZXcga2V5Ci0gICAgICogY3JlYXRlIGEgbmV3IHNlcnZpY2UgY29udGV4dCBmb3IgdGhlIHNlcnZpY2UKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCA6IE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgOiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxTZXJ2aWNlQ29udGV4dEFuZFNlcnZpY2VHcm91cENvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gYnkgdGhpcyB0aW1lIHNlcnZpY2UgZ3JvdXAgY29udGV4dCBpZCBtdXN0IGhhdmUgYSB2YWx1ZS4gRWl0aGVyIGZyb20gdHJhbnNwb3J0IG9yIGZyb20gYWRkcmVzc2luZwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQ7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKTsKLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzY29wZSA9IGF4aXNTZXJ2aWNlLmdldFNjb3BlKCk7Ci0gICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNDT1BFX0FQUExJQ0FUSU9OLmVxdWFscyhzY29wZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5nZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gbWVzc2FnZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2VHcm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjZmdDdHggPSBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gY2ZnQ3R4LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dChzZXJ2aWNlR3JvdXBOYW1lLCBzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTi5lcXVhbHMoc2NvcGUpKSB7Ci0gICAgICAgICAgICAgICAgLy9jbGVhbmluZyB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlR3JvdXBDb250ZXh0cygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQgPSBtZXNzYWdlQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZUdyb3VwQ29udGV4dEZyb21Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZGluZyB0aGlzIGNvZGUgc28gdGhhdCByZXF1ZXN0cyB0byBzZXJ2aWNlcyBkZXBsb3llZCBpbiBzb2Fwc2Vzc2lvbiBzY29wZSB3aWxsIHdvcmsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEhvd2V2ZXIsIHNvYXBzZXNzaW9uIGZ1bmN0aW9uYWxpdHkgaXMgc3RpbGwgYnJva2VuCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VHcm91cENvbnRleHQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZpY2VHcm91cENvbnRleHRJbnRvU29hcFNlc3Npb25UYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGZpbmQgY29ycmVzcG9uZGluZyBjb250ZXh0IiArCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgdGhlIHNlcnZpY2VHcm91cElkOiAiICsgc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IGNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0ID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmljZUdyb3VwQ29udGV4dElECi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHRJZCA9IFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0LnNldElkKHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VHcm91cENvbnRleHRJZChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5TQ09QRV9SRVFVRVNULmVxdWFscyhzY29wZSkpIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSBheGlzU2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IGNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQYXJlbnQoc2VydmljZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgT3BlcmF0aW9uQ29udGV4dCB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBJRC4gSWYgdGhlIGdpdmVuIG1lc3NhZ2UgaWQgYWxyZWFkeSBoYXMgYQotICAgICAqIHJlZ2lzdGVyZWQgb3BlcmF0aW9uIGNvbnRleHQsIG5vIGNoYW5nZSBpcyBtYWRlIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgZmFsc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUlEICAgICAgICB0aGUgbWVzc2FnZSBJRCBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGluIHRoZSBNRVAKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uQ29udGV4dCB0aGUgT3BlcmF0aW9uQ29udGV4dAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSByZWdpc3RlcmVkIHRoaXMgY29udGV4dCwgZmFsc2UgaWYgdGhlcmUgd2FzIGFscmVhZHkgb25lIGZvciB0aGF0IElECi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KFN0cmluZyBtZXNzYWdlSUQsIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCkgewotICAgICAgICByZXR1cm4gcmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1lc3NhZ2VJRCwgb3BlcmF0aW9uQ29udGV4dCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIE9wZXJhdGlvbkNvbnRleHQgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgSUQuIElmIHRoZSBnaXZlbiBtZXNzYWdlIGlkIGFscmVhZHkgaGFzIGEKLSAgICAgKiByZWdpc3RlcmVkIG9wZXJhdGlvbiBjb250ZXh0LCBubyBjaGFuZ2UgaXMgbWFkZSB1bmxlc3MgdGhlIG92ZXJyaWRlIGZsYWcgaXMgc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VJRCAgdGhlIG1lc3NhZ2UgSUQgb2YgdGhlIHJlcXVlc3QgbWVzc2FnZSBpbiB0aGUgTUVQCi0gICAgICogQHBhcmFtIG1lcENvbnRleHQgdGhlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcGFyYW0gb3ZlcnJpZGUgICB0cnVlIGlmIHdlIHNob3VsZCBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgd2UgcmVnaXN0ZXJlZCB0aGUgcGFzc2VkIE9wZXJhdGlvbkNvbnRleHQsIGZhbHNlIGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChTdHJpbmcgbWVzc2FnZUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG1lcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcnJpZGUpIHsKLQotICAgICAgICBpZiAobWVzc2FnZUlEID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibWVzc2FnZUlEIGlzIG51bGwuIFJldHVybmluZyBmYWxzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBhbHJlYWR5SW5NYXAgPSBmYWxzZTsKLSAgICAgICAgbWVwQ29udGV4dC5zZXRLZXkobWVzc2FnZUlEKTsKLQotICAgICAgICBpZiAob3ZlcnJpZGUpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHRNYXAucHV0KG1lc3NhZ2VJRCwgbWVwQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBPYmplY3QgcHJldmlvdXMgPSBvcGVyYXRpb25Db250ZXh0TWFwLnB1dElmQWJzZW50KG1lc3NhZ2VJRCwgbWVwQ29udGV4dCk7Ci0gICAgICAgICAgICBhbHJlYWR5SW5NYXAgPSAocHJldmlvdXMgIT0gbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dCAoIiArIG92ZXJyaWRlICsgIik6ICIgKwotICAgICAgICAgICAgICAgICAgICAgIG1lcENvbnRleHQgKyAiIHdpdGgga2V5OiAiICsgbWVzc2FnZUlEKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gbXNnQ29udGV4dE1hcCA9IG1lcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxNZXNzYWdlQ29udGV4dD4gbXNnQ29udGV4dEl0ZXJhdG9yID0gbXNnQ29udGV4dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1zZ0NvbnRleHRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gKE1lc3NhZ2VDb250ZXh0KW1zZ0NvbnRleHRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtc2dDb250ZXh0OiAiICsgbXNnQ29udGV4dCArICIgYWN0aW9uOiAiICsgbXNnQ29udGV4dC5nZXRXU0FBY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICghYWxyZWFkeUluTWFwIHx8IG92ZXJyaWRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyB0aGUgb3BlcmF0aW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlSUQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlSUQgdGhlIG1lc3NhZ2VJRCB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChTdHJpbmcgbWVzc2FnZUlEKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlSUQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJtZXNzYWdlSUQgaXMgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDdHggPSAoT3BlcmF0aW9uQ29udGV4dClvcGVyYXRpb25Db250ZXh0TWFwLnJlbW92ZShtZXNzYWdlSUQpOwotICAgICAgICAgICAgY29udGV4dFJlbW92ZWQob3BDdHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbnlPcGVyYXRpb25Db250ZXh0UmVnaXN0ZXJlZCgpIHsKLSAgICAgICAgcmV0dXJuICFvcGVyYXRpb25Db250ZXh0TWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiBTZXJ2aWNlR3JvdXBDb250ZXh0IGludG8gdGhlIFNPQVAgc2Vzc2lvbiB0YWJsZQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cENvbnRleHQgU2VydmljZUdyb3VwIENvbnRleHQgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKAotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBpZCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0SWQoKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dE1hcC5wdXQoaWQsIHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0LnRvdWNoKCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICAvLyB0aGlzIGlzIHRoZSBiZXN0IHRpbWUgdG8gY2xlYW4gdXAgdGhlIFNHQ3R4dHMgc2luY2UgYXJlIG5vdCBiZWluZyB1c2VkIGFueW1vcmUKLSAgICAgICAgY2xlYW51cFNlcnZpY2VHcm91cENvbnRleHRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gU2VydmljZUdyb3VwQ29udGV4dCBpbnRvIHRoZSBBcHBsaWNhdGlvbiBTY29wZSB0YWJsZQotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cENvbnRleHQgVGhlIFNlcnZpY2UgR3JvdXAgQ29udGV4dCB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZQotICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICBpZiAoYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMgPT0gbnVsbCkgewotICAgICAgICAgICAgYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU2VydmljZUdyb3VwQ29udGV4dD4oKTsKLSAgICAgICAgfQotICAgICAgICBhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5wdXQoCi0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpLmdldFNlcnZpY2VHcm91cE5hbWUoKSwgc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVwbG95IGEgc2VydmljZSB0byB0aGUgZW1iZWRkZWQgQXhpc0NvbmZpZ3VyYXRpb24sIGFuZCBpbml0aWFsaXplIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2Ugc2VydmljZSB0byBkZXBsb3kKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlcGxveVNlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIGlmIChDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04uZXF1YWxzKHNlcnZpY2UuZ2V0U2NvcGUoKSkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgICAgICBEZXBlbmRlbmN5TWFuYWdlci5pbml0U2VydmljZShzZ2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzQ29uZmlndXJhdGlvbiBnZXRBeGlzQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWd1cmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBPcGVyYXRpb25Db250ZXh0IGdpdmVuIGEgTWVzc2FnZSBJRC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlSUQgdGhlIG1lc3NhZ2UgSUQgb2YgYW4gYWN0aXZlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGFuIGFjdGl2ZSBPcGVyYXRpb25Db250ZXh0LCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgZ2V0T3BlcmF0aW9uQ29udGV4dChTdHJpbmcgbWVzc2FnZUlEKSB7Ci0gICAgICAgIHJldHVybiAoT3BlcmF0aW9uQ29udGV4dCl0aGlzLm9wZXJhdGlvbkNvbnRleHRNYXAuZ2V0KG1lc3NhZ2VJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIE9wZXJhdGlvbkNvbnRleHQgZ2l2ZW4gdGhlIE9wZXJhdGlvbiBuYW1lLCBTZXJ2aWNlIE5hbWUsIGFuZCBTZXJ2aWNlR3JvdXBOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZSAgICAtIE9wZXJhdGlvbk5hbWUgdG8gZmluZAotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAgICAgIC0gU2VydmljZU5hbWUgdG8gZmluZAotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBOYW1lIC0gU2VydmljZUdyb3VwTmFtZSB0byBmaW5kCi0gICAgICogQHJldHVybiBSZXR1cm5zIE9wZXJhdGlvbkNvbnRleHQgPGNvZGU+T3BlcmF0aW9uQ29udGV4dDxjb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGZpbmRPcGVyYXRpb25Db250ZXh0KFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHsKLSAgICAgICAgaWYgKG9wZXJhdGlvbk5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBncm91cCBuYW1lIGlzIG5vdCBuZWNlc3NhcmlseSBhIHByZXJlcQotICAgICAgICAvLyBidXQgaWYgdGhlIGdyb3VwIG5hbWUgaXMgbm9uLW51bGwsIHRoZW4gaXQgaGFzIHRvIG1hdGNoCi0KLSAgICAgICAgSXRlcmF0b3I8T3BlcmF0aW9uQ29udGV4dD4gaXQgPSBvcGVyYXRpb25Db250ZXh0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCB2YWx1ZSA9IChPcGVyYXRpb25Db250ZXh0KWl0Lm5leHQoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlT3BlcmF0aW9uTmFtZTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZVNlcnZpY2VOYW1lOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlU2VydmljZUdyb3VwTmFtZTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZU9wZXJhdGlvbk5hbWUgPSB2YWx1ZS5nZXRPcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVTZXJ2aWNlTmFtZSA9IHZhbHVlLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVTZXJ2aWNlR3JvdXBOYW1lID0gdmFsdWUuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZU9wZXJhdGlvbk5hbWUgIT0gbnVsbCkgJiYgKHZhbHVlT3BlcmF0aW9uTmFtZS5lcXVhbHMob3BlcmF0aW9uTmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWVTZXJ2aWNlTmFtZSAhPSBudWxsKSAmJiAodmFsdWVTZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZVNlcnZpY2VHcm91cE5hbWUgIT0gbnVsbCkgJiYgKHNlcnZpY2VHcm91cE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodmFsdWVTZXJ2aWNlR3JvdXBOYW1lLmVxdWFscyhzZXJ2aWNlR3JvdXBOYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IsIGJvdGggbmVlZCB0byBiZSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlU2VydmljZUdyb3VwTmFtZSA9PSBudWxsKSAmJiAoc2VydmljZUdyb3VwTmFtZSA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIHdlIGRpZCBub3QgZmluZCBhbiBvcGVyYXRpb24gY29udGV4dAotICAgICAgICAvLyB0aGF0IGZpdHMgdGhlIGNyaXRlcmlhCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lc3NhZ2VDb250ZXh0LCBhbmQgbm90aWZ5IGFueSByZWdpc3RlcmVkIENvbnRleHRMaXN0ZW5lci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCh0aGlzKTsKLSAgICAgICAgY29udGV4dENyZWF0ZWQobXNnQ3R4KTsKLSAgICAgICAgcmV0dXJuIG1zZ0N0eDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBTZXJ2aWNlR3JvdXBDb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZ3JvdXAsIGFuZCBub3RpZnkgYW55IHJlZ2lzdGVyZWQKLSAgICAgKiBDb250ZXh0TGlzdGVuZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUdyb3VwIGFuIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dCBjcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDdHggPSBuZXcgU2VydmljZUdyb3VwQ29udGV4dCh0aGlzLCBzZXJ2aWNlR3JvdXApOwotICAgICAgICBjb250ZXh0Q3JlYXRlZChzZ0N0eCk7Ci0gICAgICAgIHJldHVybiBzZ0N0eDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgdXNlcnMgdG8gcmVzb2x2ZSB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCBhIHJlbGF0aXZlIHBhdGgKLSAgICAgKiBAcmV0dXJuIGEgRmlsZSBmb3IgdGhlIGdpdmVuIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSwgb3IgbnVsbCBpZiBubyByZXBvCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0UmVhbFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgVVJMIHJlcG9zaXRvcnkgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRSZXBvc2l0b3J5KCk7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgcmVwbyA9IG5ldyBGaWxlKHJlcG9zaXRvcnkuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShyZXBvLCBwYXRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgU2VydmljZUdyb3VwQ29udGV4dCBmcm9tIHRoZSBTT0FQIHNlc3Npb24gdGFibGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBDb250ZXh0SWQgU2VydmljZSBHcm91cCBDb250ZXh0IElEIHRvIHNlYXJjaCBvbgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgICAgICAgICAgTWVzc2FnZSBDb250ZXh0IHRvIHNlYXJjaCBvbgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBTZXJ2aWNlR3JvdXBDb250ZXh0IGNhbm5vdCBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBDb250ZXh0IGdldFNlcnZpY2VHcm91cENvbnRleHRGcm9tU29hcFNlc3Npb25UYWJsZSgKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQsCi0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLmdldChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotCi0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQudG91Y2goKTsKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGZpbmQgY29ycmVzcG9uZGluZyBjb250ZXh0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHRoZSBzZXJ2aWNlR3JvdXBJZDogIiArIHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTZXJ2aWNlR3JvdXBDb250ZXh0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBpbnRlcm5hbAotICAgICAqIHRhYmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cEN0eElkIFRoZSBJRCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IG9iamVjdAotICAgICAqIEByZXR1cm4gVGhlIFNlcnZpY2VHcm91cENvbnRleHQgb2JqZWN0LCBvciBudWxsIGlmIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBDb250ZXh0IGdldFNlcnZpY2VHcm91cENvbnRleHQoU3RyaW5nIHNlcnZpY2VHcm91cEN0eElkKSB7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cEN0eElkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEhhc2h0YWJsZXMgcmVxdWlyZSBub24tbnVsbCBrZXktdmFsdWUgcGFpcnMKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gbnVsbDsKLQotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQpc2VydmljZUdyb3VwQ29udGV4dE1hcC5nZXQoc2VydmljZUdyb3VwQ3R4SWQpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQudG91Y2goKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KHNlcnZpY2VHcm91cEN0eElkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQudG91Y2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIHNlcnZpY2UgZ3JvdXBzIGluIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgaGFzaG1hcCBvZiBTZXJ2aWNlR3JvdXBDb250ZXh0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmljZUdyb3VwQ29udGV4dElEcygpIHsKLSAgICAgICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnNpemUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMuc2l6ZSgpXTsKLSAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IHNlcnZpY2VHcm91cENvbnRleHRNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlkc1tpbmRleF0gPSAoU3RyaW5nKW87Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5rZXlTZXQoKSkgewotICAgICAgICAgICAgaWRzW2luZGV4XSA9IChTdHJpbmcpbzsKLSAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0cwotICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFNlcnZpY2VHcm91cENvbnRleHRJRHN9ICYge0BsaW5rICNnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KFN0cmluZyl9Ci0gICAgICovCi0gICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IGdldFNlcnZpY2VHcm91cENvbnRleHRzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aHJlYWQgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRocmVhZCBwb29sCi0gICAgICovCi0gICAgcHVibGljIFRocmVhZEZhY3RvcnkgZ2V0VGhyZWFkUG9vbCgpIHsKLSAgICAgICAgaWYgKHRocmVhZFBvb2wgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyZWFkUG9vbCA9IG5ldyBUaHJlYWRQb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGhyZWFkUG9vbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIEF4aXNDb25maWd1cmF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gYW4gQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzQ29uZmlndXJhdGlvbihBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB0aHJlYWQgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb29sIFRoZSB0aHJlYWQgcG9vbAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IElmIGEgdGhyZWFkIHBvb2wgaGFzIGFscmVhZHkgYmVlbiBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRQb29sKFRocmVhZEZhY3RvcnkgcG9vbCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh0aHJlYWRQb29sID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocmVhZFBvb2wgPSBwb29sOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0aHJlYWRwb29sc2V0IikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgU2VydmljZUdyb3VwQ29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cENvbnRleHRJZCBUaGUgSUQgb2YgdGhlIFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgKFNlcnZpY2VHcm91cENvbnRleHQpc2VydmljZUdyb3VwQ29udGV4dE1hcC5nZXQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dE1hcC5yZW1vdmUoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xlYW51cFNlcnZpY2VHcm91cENvbnRleHRzKCkgewotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZUdyb3VwQ29udGV4dE1hcCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IHNnQ3R4dE1hcEtleUl0ZXIgPSBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIHNnQ3R4dE1hcEtleUl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZ0N0eHRJZCA9IChTdHJpbmcpc2dDdHh0TWFwS2V5SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlR3JvdXBDb250ZXh0KXNlcnZpY2VHcm91cENvbnRleHRNYXAuZ2V0KHNnQ3R4dElkKTsKLSAgICAgICAgICAgICAgICBpZiAoKGN1cnJlbnRUaW1lIC0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRMYXN0VG91Y2hlZFRpbWUoKSkgPgotICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2dDdHh0TWFwS2V5SXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dFJlbW92ZWQoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgdGhlIExpc3RlbmVyTWFuYWdlcgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBMaXN0ZW5lck1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdGVuZXJNYW5hZ2VyIGdldExpc3RlbmVyTWFuYWdlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAobGlzdGVuZXJNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIgPSBuZXcgTGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLmluaXQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyTWFuYWdlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFRyYW5zcG9ydE1hbmFnZXIgdG8gdGhlIGdpdmVuIExpc3RlbmVyTWFuYWdlcgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyTWFuYWdlciBUaGUgTGlzdGVuZXJNYW5hZ2VyIGZvciB3aGljaCB0byBzZXQgdGhlIFRyYW5zcG9ydE1hbmFnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRNYW5hZ2VyKExpc3RlbmVyTWFuYWdlciBsaXN0ZW5lck1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5saXN0ZW5lck1hbmFnZXIgPSBsaXN0ZW5lck1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZXJ2aWNlQ29udGV4dHMoU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvcjxTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRleHRJdGVyID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dHMoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0SXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHNlcnZpY2VDb250ZXh0SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gKFNlcnZpY2VDb250ZXh0KXNlcnZpY2VDb250ZXh0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBEZXBlbmRlbmN5TWFuYWdlci5kZXN0cm95U2VydmljZU9iamVjdChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIGR1cmluZyBzaHV0ZG93biB0byBjbGVhbiB1cCBhbGwgQ29udGV4dHMgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwQ29udGV4dHMoKSB7Ci0gICAgICAgIGlmICgoYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgIChhcHBsaWNhdGlvblNlc3Npb25TZXJ2aWNlR3JvdXBDb250ZXh0cy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlR3JvdXBDb250ZXh0KW87Ci0gICAgICAgICAgICAgICAgY2xlYW51cFNlcnZpY2VDb250ZXh0cyhzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwcGxpY2F0aW9uU2Vzc2lvblNlcnZpY2VHcm91cENvbnRleHRzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChzZXJ2aWNlR3JvdXBDb250ZXh0TWFwICE9IG51bGwpICYmIChzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogc2VydmljZUdyb3VwQ29udGV4dE1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClvOwotICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlQ29udGV4dHMoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2VkIGR1cmluZyBzaHV0ZG93biB0byBzdG9wIHRoZSBMaXN0ZW5lck1hbmFnZXIgYW5kIHBlcmZvcm0gY29uZmlndXJhdGlvbiBjbGVhbnVwCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobGlzdGVuZXJNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5zdG9wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uY2xlYW51cCgpOwotICAgICAgICBjbGVhbnVwVGVtcCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaW5jbHVkZSBhbGwgdGhlIG1ham9yIGNoYW5nZXMgd2UgaGF2ZSBkb25lIGZyb20gMS4yIHJlbGVhc2UgdG8gMS4zIHJlbGVhc2UuIFRoaXMgd2lsbAotICAgICAqIGluY2x1ZGUgQVBJIGNoYW5nZXMgLCBjbGFzcyBkZXByZWNhdGluZyBldGMgZXRjLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwVGVtcCgpIHsKLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IChGaWxlKWF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlclZhbHVlKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUik7Ci0gICAgICAgIGlmICh0ZW1wRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHRlbXBGaWxlID0gbmV3IEZpbGUocHJvcGVydHksICJfYXhpczIiKTsKLSAgICAgICAgfQotICAgICAgICBkZWxldGVUZW1wRmlsZXModGVtcEZpbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZWxldGVUZW1wRmlsZXMoZmluYWwgRmlsZSBkaXIpIHsKLSAgICAgICAgQm9vbGVhbiBpc0RpciA9IChCb29sZWFuKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPEJvb2xlYW4+KCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGlmIChpc0RpcikgewotICAgICAgICAgICAgU3RyaW5nW10gY2hpbGRyZW4gPSAoU3RyaW5nW10pQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZ1tdPigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpci5saXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgY2hpbGRyZW4gIT0gbnVsbCAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZWxldGVUZW1wRmlsZXMobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlyLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBTZXJ2aWNlQ29udGV4dCBwYXRoCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBhdGggdG8gdGhlIFNlcnZpY2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSB7Ci0gICAgICAgIGlmIChjYWNoZWRTZXJ2aWNlUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWRTZXJ2aWNlUGF0aCA9IGludGVybmFsR2V0U2VydmljZUNvbnRleHRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZFNlcnZpY2VQYXRoOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGludGVybmFsR2V0U2VydmljZUNvbnRleHRQYXRoKCkgewotICAgICAgICBTdHJpbmcgY3R4Um9vdCA9IGdldENvbnRleHRSb290KCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gIi8iOwotICAgICAgICBpZiAoY3R4Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWN0eFJvb3QuZXF1YWxzKCIvIikpIHsKLSAgICAgICAgICAgICAgICBwYXRoID0gY3R4Um9vdCArICIvIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlUGF0aCA9PSBudWxsIHx8IHNlcnZpY2VQYXRoLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBwYXRoIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhdGggKz0gc2VydmljZVBhdGgudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB0aGUgU2VydmljZVBhdGgKLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBhdGggdG8gdGhlIFNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VQYXRoKCkgewotICAgICAgICBpZiAoc2VydmljZVBhdGggPT0gbnVsbCB8fCBzZXJ2aWNlUGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBwYXRoIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VQYXRoLnRyaW0oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTZXJ2aWNlUGF0aCB0byB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZVBhdGggVGhlIHNlcnZpY2UgcGF0aCBmb3Igd2hpY2ggdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVBhdGgoU3RyaW5nIHNlcnZpY2VQYXRoKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZVBhdGggPSBzZXJ2aWNlUGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIENvbnRleHRSb290Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBDb250ZXh0Um9vdAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0Um9vdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZXh0IHJvb3QgdG8gdGhlIGdpdmVuIHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRSb290IFRoZSBjb250ZXh0IHJvb3QgZm9yIHdoaWNoIHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotICAgICAgICBpZiAoY29udGV4dFJvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IGNvbnRleHRSb290LnRyaW0oKTsgIC8vIFRyaW0gYmVmb3JlIHN0b3JpbmcgYXdheSBmb3IgZ29vZCBoeWdpZW5lCi0gICAgICAgICAgICBjYWNoZWRTZXJ2aWNlUGF0aCA9IGludGVybmFsR2V0U2VydmljZUNvbnRleHRQYXRoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBNSVNTUEVMTElORyAtIFBsZWFzZSB1c2UgZ2V0U2VydmljZUdyb3VwQ29udGV4dFRpbWVvdXRJbnRlcnZhbCgpCi0gICAgICogQHJldHVybiB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IHRpbWVvdXQgaW50ZXJ2YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0VGltb3V0SW50ZXJ2YWwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggdGhlIHNlcnZpY2VHcm91cENvbnRleHRUaW1vdXRJbnRlcnZhbCBmcm9tIGFueSBwbGFjZSBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQgdGltZW91dCBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFNlcnZpY2VHcm91cENvbnRleHRUaW1lb3V0SW50ZXJ2YWwoKSB7Ci0gICAgICAgIEludGVnZXIgc2VydmljZUdyb3VwQ29udGV4dFRpbW91dEludGVydmFsUGFyYW0gPQotICAgICAgICAgICAgICAgIChJbnRlZ2VyKWdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTkZJR19DT05URVhUX1RJTUVPVVRfSU5URVJWQUwpOwotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dFRpbW91dEludGVydmFsUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBzZWVtcyB3cm9uZyAtIHNldHRpbmcgYSBmaWVsZCBpbnNpZGUgYSBnZXR0ZXI/PwotICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dFRpbWVvdXRJbnRlcnZhbCA9IHNlcnZpY2VHcm91cENvbnRleHRUaW1vdXRJbnRlcnZhbFBhcmFtOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0VGltZW91dEludGVydmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGdpdmVuIFNlcnZpY2VHcm91cCBmcm9tIHRoZSBTZXJ2aWNlR3JvdXAgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cCB0aGUgQXhpc1NlcnZpY2VHcm91cCB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXAgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICBPYmplY3Qgb2JqID0gYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMuZ2V0KGdyb3VwTmFtZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dHMucmVtb3ZlKHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdG9CZVJlbW92ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIEl0ZXJhdG9yPFNlcnZpY2VHcm91cENvbnRleHQ+IHNlcnZpY2VHcm91cENvbnRleHRzID0gc2VydmljZUdyb3VwQ29udGV4dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoc2VydmljZUdyb3VwQ29udGV4dHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dClzZXJ2aWNlR3JvdXBDb250ZXh0cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhzZXJ2aWNlR3JvdXApKSB7Ci0gICAgICAgICAgICAgICAgdG9CZVJlbW92ZWRMaXN0LmFkZChzZXJ2aWNlR3JvdXBDb250ZXh0LmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoT2JqZWN0IGFUb0JlUmVtb3ZlZExpc3QgOiB0b0JlUmVtb3ZlZExpc3QpIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZylhVG9CZVJlbW92ZWRMaXN0OwotICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dE1hcC5yZW1vdmUocyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQWJzdHJhY3RDb250ZXh0I2dldFJvb3RDb250ZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Um9vdENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGJhZDBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlNlc3Npb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgQXhpc0NvbmZpZ3VyYXRpb24gZGVwZW5kaW5nIG9uIHRoZSB1c2VyIHJlcXVpcmVtZW50LgotICAgICAqIEZpcnN0IGNyZWF0ZXMgYW4gQXhpc0NvbmZpZ3VyYXRvciBvYmplY3Qgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzLgotICAgICAqIERlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSwgZ2V0cwotICAgICAqIHRoZSBBeGlzQ29uZmlndXJhdGlvbiBhbmQgdXNlcyBpdCB0byBjcmVhdGUgdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNDb25maWd1cmF0b3IgOiBBeGlzQ29uZmlndXJhdG9yCi0gICAgICogQHJldHVybiBSZXR1cm5zIENvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IDogSWYgc29tdGhpbmcgZ29lcyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHQoCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdG9yIGF4aXNDb25maWd1cmF0b3IpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gYXhpc0NvbmZpZ3VyYXRvci5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAvLyBjYWxsIHRvIHRoZSBkZXBsb3ltZW50IGxpc3RuZXJzCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRFUExPWU1FTlRfTElGRV9DWUNMRV9MSVNURU5FUik7Ci0gICAgICAgIERlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciBkZXBsb3ltZW50TGlmZUN5Y2xlTGlzdGVuZXIgPSBudWxsOwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyID0gKERlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lcikgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbiBub3QgaW5zdGFudGlhdGUgZGVwbG95bWVudCBMaXN0ZW5lciAiICsgY2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW4gbm90IGluc3RhbnRpYXRlIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIklsbGVnYWwgQWNjZXNzIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSWxsZWdhbCBBY2Nlc3MgZGVwbG95bWVudCBMaXN0ZW5lciAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiQ2xhc3Mgbm90IGZvdW5kIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSwgZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2xhc3Mgbm90IGZvdW5kIGRlcGxveW1lbnQgTGlzdGVuZXIgIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciAhPSBudWxsKXsKLSAgICAgICAgICAgIGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lci5wcmVEZXBsb3koYXhpc0NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlnKTsKLQotICAgICAgICBpZiAoYXhpc0NvbmZpZ3VyYXRvciBpbnN0YW5jZW9mIERlcGxveW1lbnRFbmdpbmUpIHsKLSAgICAgICAgICAgICgoRGVwbG95bWVudEVuZ2luZSkgYXhpc0NvbmZpZ3VyYXRvcikuc2V0Q29uZmlnQ29udGV4dChjb25maWdDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICAvL1RvIG92ZXJyaWRlIGNvbnRleHQgcGF0aAotICAgICAgICBzZXRDb250ZXh0UGF0aHMoYXhpc0NvbmZpZywgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGluaXQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0b3IuZW5nYWdlR2xvYmFsTW9kdWxlcygpOwotICAgICAgICBheGlzQ29uZmlndXJhdG9yLmxvYWRTZXJ2aWNlcygpOwotICAgICAgICBhZGRNb2R1bGVTZXJ2aWNlKGNvbmZpZ0NvbnRleHQpOwotCi0gICAgICAgIC8vIFRPRE86IFRISVMgTkVFRFMgQSBURVNUIENBU0UhCi0gICAgICAgIGluaXRBcHBsaWNhdGlvblNjb3BlU2VydmljZXMoY29uZmlnQ29udGV4dCk7Ci0KLSAgICAgICAgYXhpc0NvbmZpZy5zZXRTdGFydCh0cnVlKTsKLSAgICAgICAgaWYgKGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lciAhPSBudWxsKXsKLSAgICAgICAgICAgIGRlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lci5wb3N0RGVwbG95KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluYWxseSBpbml0aWFsaXplIHRoZSBjbHVzdGVyCi0gICAgICAgIGlmIChheGlzQ29uZmlnLmdldENsdXN0ZXJNYW5hZ2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5pbml0Q2x1c3RlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRBcHBsaWNhdGlvblNjb3BlU2VydmljZXMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VHcm91cHMgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlR3JvdXBzKCk7Ci0gICAgICAgIHdoaWxlIChzZXJ2aWNlR3JvdXBzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIHNlcnZpY2VHcm91cHMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG1heFNjb3BlID0gU2Vzc2lvblV0aWxzLmNhbGN1bGF0ZU1heFNjb3BlRm9yU2VydmljZUdyb3VwKGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5TQ09QRV9BUFBMSUNBVElPTi5lcXVhbHMobWF4U2NvcGUpKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b0FwcGxpY2F0aW9uU2NvcGVUYWJsZShzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBEZXBlbmRlbmN5TWFuYWdlci5pbml0U2VydmljZShzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkTW9kdWxlU2VydmljZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEhhc2hNYXAgbW9kdWxlcyA9IGF4aXNDb25maWcuZ2V0TW9kdWxlcygpOwotICAgICAgICBpZiAobW9kdWxlcyAhPSBudWxsICYmIG1vZHVsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3IgbXBkdWxlSXRyID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1wZHVsZUl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSkgbXBkdWxlSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBVdGlscy5kZXBsb3lNb2R1bGVTZXJ2aWNlcyhheGlzTW9kdWxlLCBjb25maWdDdHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDb250ZXh0UGF0aHMoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIENoZWNraW5nIGZvciBjb250ZXh0IHBhdGgKLSAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VQYXRoID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlBBUkFNX1NFUlZJQ0VfUEFUSCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3BhdGggPSAoKFN0cmluZykgc2VydmljZVBhdGguZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgaWYgKHNwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0U2VydmljZVBhdGgoc3BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5zZXRTZXJ2aWNlUGF0aChDb25zdGFudHMuREVGQVVMVF9TRVJWSUNFU19QQVRIKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBjb250ZXh0UGF0aCA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5QQVJBTV9DT05URVhUX1JPT1QpOwotICAgICAgICBpZiAoY29udGV4dFBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNwYXRoID0gKChTdHJpbmcpIGNvbnRleHRQYXRoLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChjcGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LnNldENvbnRleHRSb290KGNwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0Q29udGV4dFJvb3QoImF4aXMyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBnZXQgYSBDb25maWd1cmF0aW9uQ29udGV4dCBmb3IgIGdpdmVuIGRhdGEgLCBhbmQgdW5kZXJsaW5lIGltcGxlbWVudGF0aW9uCi0gICAgICogaXMgQXhpczIgZGVmYXVsdCBpbXBsIHdoaWNoIGlzIGZpbGUgc3lzdGVtIGJhc2VkIGRlcGxveW1lbnQgbW9kZWwgdG8gY3JlYXRlCi0gICAgICogYW4gQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICogPHAvPgotICAgICAqIEhlcmUgZWl0aGVyIG9yIGJvdGggcGFyYW1ldGVyIGNhbiBiZSBudWxsLiBTbyB0aGF0IGJvaWwgZG93biB0byBmb2xsb3dpbmcKLSAgICAgKiBzY2VuYXJpb3MgYW5kIGl0IHNob3VsZCBub3RlIHRoYXQgcGFyYW1ldGVyIHZhbHVlIHNob3VsZCBiZSBmdWxsIHBhdGggLAotICAgICAqIHlvdSBhcmUgbm90IGFsbG93ZWQgdG8gZ2l2ZSBvbmUgcmVsYXRpdmUgdG8gb3RoZXIuIEFuZCB0aGVzZSB0d28gY2FuIGJlIGxvY2F0ZWQKLSAgICAgKiBpbiBjb21wbGV0ZWx5IGRpZmZlcmVudCBsb2NhdGlvbnMuCi0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiBub25lIG9mIHRoZW0gYXJlIG51bGwgLCB0aGVuIEF4aXNDb25maWd1cmF0aW9uIHdpbGwgYmUgYmFzZWQgb24gdGhlCi0gICAgICogdmFsdWUgb2YgYXhpczJ4bWwgLCBhbmQgdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZQotICAgICAqIHBhdGggcGFyYW1ldGVyIGFuZCB0aGVyZSB3aWxsIG5vdCBiZSBhbnkgYXNzdW1wdGlvbnMuPC9saT4KLSAgICAgKiA8bGk+SWYgYXhpczJ4bWwgaXMgbnVsbCAsIHRoZW4gdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSB0aGUgdmFsdWUgc3BlY2ZpZWQgYnkKLSAgICAgKiBwYXRoIHBhcmFtZXRlciBhbmQgQXhpc0NvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkIHVzaW5nIGRlZmF1bHRfYXhpczIueG1sPC9saT4KLSAgICAgKiA8bGk+SWYgcGF0aCBwYXJhbWV0ZXIgaXMgbnVsbCAsIHRoZW4gQXhpc0NvbmZpZ3VyYXRpb24gd2lsbCBiZSBjcmVhdGVkIHVzaW5nCi0gICAgICogdGhhdCBheGlzMi54bWwuIEFuZCBhZnRlciBjcmVhdGluZyBBeGlzQ29uZmlndXJhdGlvbiBzeXN0ZW0gd2lsbCB0cnkgdG8KLSAgICAgKiBmaW5kIHVzZXIgaGFzIHNwZWNpZmllZCByZXBvc2l0b3J5IHBhcmFtZXRlciBpbiBheGlzMi54bWwKLSAgICAgKiAoJmx0O3BhcmFtZXRlciBuYW1lPSJyZXBvc2l0b3J5IiZndDtsb2NhdGlvbiBvZiB0aGUgcmVwbyZsdDsvcGFyYW1ldGVyJmd0OykgLCBpZiBpdAotICAgICAqIGZpbmQgdGhhdCB0aGVuIHJlcG9zaXRvcnkgd2lsbCBiZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoYXQgcGFyYW1ldGVyLjwvbGk+Ci0gICAgICogPGxpPklmIGJvdGggYXJlIG51bGwgLCB0aGVuIGl0IGlzIHNpbXBsZSAsIEFpeHNDb25maWd1cmF0aW9uIHdpbGwgYmUgY3JlYXRlZAotICAgICAqIHVzaW5nIGRlZmF1bHRfYXhpczIueG1sIGFuZCB0aGF0cyBpdC48L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICogPHAvPgotICAgICAqIE5vdGUgOiByYXRoZXIgdGhhbiBwYXNzaW5nIGFueSBwYXJhbWV0ZXJzIHlvdSBjYW4gZ2l2ZSB0aGVtIGFzIFN5c3RlbQotICAgICAqIHByb3BlcnRpZXMuIFNpbXBsZSB5b3UgY2FuIGFkZCBmb2xsb3dpbmcgc3lzdGVtIHByb3BlcnRpZXMgYmVmb3JlCi0gICAgICogeW91IGNhbGwgdGhpcy4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPmF4aXMyLnJlcG8gOiBzYW1lIGFzIHBhdGggcGFyYW1ldGVyPC9saT4KLSAgICAgKiA8bGk+YXhpczIueG1sICA6IHNhbWUgYXMgYXhpczJ4bWw8L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCAgICAgOiBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeQotICAgICAqIEBwYXJhbSBheGlzMnhtbCA6IGxvY2F0aW9uIG9mIHRoZSBheGlzMi54bWwgKGNvbmZpZ3VyYXRpb24pICwgeW91IGNhbiBub3QgZ2l2ZQotICAgICAqICAgICAgICAgICAgICAgICBheGlzMnhtbCByZWxhdGl2ZSB0byByZXBvc2l0b3J5LgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYnVpbHQgQ29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaW4gY2FzZSBvZiBwcm9ibGVtcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbSgKLSAgICAgICAgICAgIFN0cmluZyBwYXRoLAotICAgICAgICAgICAgU3RyaW5nIGF4aXMyeG1sKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0KG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKHBhdGgsIGF4aXMyeG1sKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKFN0cmluZyBwYXRoKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKHBhdGgsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tVVJJcygKLSAgICAgICAgICAgIFVSTCBheGlzMnhtbCwgVVJMIHJlcG9zaXRveSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChuZXcgVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yKGF4aXMyeG1sLCByZXBvc2l0b3kpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplcyBtb2R1bGVzIGFuZCBjcmVhdGVzIFRyYW5zcG9ydHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgaW5pdE1vZHVsZXMoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIGluaXRUcmFuc3BvcnRTZW5kZXJzKGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBtb2R1bGVzLiBJZiB0aGUgbW9kdWxlIG5lZWRzIHRvIHBlcmZvcm0gc29tZSByZWNvdmVyeSBwcm9jZXNzCi0gICAgICogaXQgY2FuIGRvIHNvIGluIGluaXQgYW5kIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gbW9kdWxlLmVuZ2FnZSgpLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgOiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdE1vZHVsZXMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSBjb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBjb2wgPSBtb2R1bGVzLnZhbHVlcygpOwotICAgICAgICBNYXAgZmF1bHR5TW9kdWxlID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc21vZHVsZSA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBNb2R1bGUgbW9kdWxlID0gYXhpc21vZHVsZS5nZXRNb2R1bGUoKTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmluaXQoY29udGV4dCwgYXhpc21vZHVsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHR5TW9kdWxlLnB1dChheGlzbW9kdWxlLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vQ2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIGZvdW5kIGFueSBmYXVsdHkgc2VydmljZXMgZHVyaW5nIHRoZSBtb2R1bGUgaW5pdGlsaXphdGlvbiAsCi0gICAgICAgIC8vIGlmIHNvIHdlIG5lZWQgdG8gbWFyayB0aGVtIGFzIGZhdXR5TW9kdWxlIGFuZCBuZWVkIHRvIHJlbW92ZSBmcm9tIHRoZSBtb2R1bGVzIGxpc3QKLSAgICAgICAgaWYgKGZhdWx0eU1vZHVsZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBheGlzTW9kdWxlcyA9IGZhdWx0eU1vZHVsZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGF4aXNNb2R1bGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc01vZHVsZSA9IChBeGlzTW9kdWxlKSBheGlzTW9kdWxlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lOwotICAgICAgICAgICAgICAgIGlmIChheGlzTW9kdWxlLmdldEZpbGVOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGF4aXNNb2R1bGUuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gYXhpc01vZHVsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0RmF1bHR5TW9kdWxlcygpLnB1dChmaWxlTmFtZSwgZmF1bHR5TW9kdWxlLmdldChheGlzTW9kdWxlKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAvL3JlbW92aW5nIGZyb20gb3JpZ2luYWwgbGlzdAotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucmVtb3ZlTW9kdWxlKGF4aXNNb2R1bGUuZ2V0TmFtZSgpLCBheGlzTW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgVHJhbnNwb3J0U2VuZGVycyBhbmQgVHJhbnNwb3J0TGlzdGVuZXJzIHdpdGggYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0NvbnRleHQgOiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdFRyYW5zcG9ydFNlbmRlcnMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZiA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIFRyYW5zcG9ydCBPdXRzCi0gICAgICAgIEhhc2hNYXAgdHJhbnNwb3J0T3V0cyA9IGF4aXNDb25mLmdldFRyYW5zcG9ydHNPdXQoKTsKLQotICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSB0cmFuc3BvcnRPdXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IChUcmFuc3BvcnRPdXREZXNjcmlwdGlvbikgdmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSB0cmFuc3BvcnRPdXQuZ2V0U2VuZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChzZW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5pbml0KGNvbmZpZ0NvbnRleHQsIHRyYW5zcG9ydE91dCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0cmFuc3BvcnRpbml0ZXJyb3IiLCB0cmFuc3BvcnRPdXQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY3JlYXRlcyBhbiBlbXB0eSBjb25maWd1cmF0aW9uIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQ29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBjcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBpZiAoYXhpc0NvbmZpZ3VyYXRpb24uZ2V0Q2x1c3Rlck1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LmluaXRDbHVzdGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250ZXh0UGF0aHMoYXhpc0NvbmZpZ3VyYXRpb24sIGNvbmZpZ0NvbnRleHQpOwotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gY29udGV4dCBieSB1c2luZyBBeGlzMi54bWwgaW4gdGhlIGNsYXNzcGF0aAotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIENvbmZpZ3VyYXRpb25Db250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCYXNpY0NvbmZpZ3VyYXRpb25Db250ZXh0KERlcGxveW1lbnRDb25zdGFudHMuQVhJUzJfQ09ORklHVVJBVElPTl9SRVNPVVJDRSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgY29uZmlndXJhdGlvbiBjb250ZXh0IHVzaW5nIHJlc291cmNlIGZpbGUgZm91bmQgaW4gdGhlIGNsYXNzcGF0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBDb25maWd1cmF0aW9uQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGNyZWF0ZUJhc2ljQ29uZmlndXJhdGlvbkNvbnRleHQoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNDb25maWdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoaW4sIGF4aXNDb25maWcsIG51bGwpOwotICAgICAgICBidWlsZGVyLnBvcHVsYXRlQ29uZmlnKCk7Ci0gICAgICAgIGF4aXNDb25maWcudmFsaWRhdGVTeXN0ZW1QcmVkZWZpbmVkUGhhc2VzKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZyk7Ci0KLSAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0Q2x1c3Rlck1hbmFnZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb25maWdDb250ZXh0LmluaXRDbHVzdGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250ZXh0UGF0aHMoYXhpc0NvbmZpZywgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTZlNTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotLyoqCi0gKiBBIENvbnRleHRMaXN0ZW5lciBnZXRzIGluZm9ybWVkIGFib3V0IG5ldyBjb250ZXh0IGNyZWF0aW9ucyAmIHJlbW92YWwgb2YgZXhpc3RpbmcgY29udGV4dHMuCi0gKiBSZWdpc3RlciBvbmUgd2l0aCBhIENvbmZpZ3VyYXRpb25Db250ZXh0IGFuZCB5b3UnbGwgZ2V0IG5vdGlmaWNhdGlvbnMgZm9yIGV2ZXJ5Ci0gKiBzdWItY29udGV4dCBjcmVhdGlvbiAmIHJlbW92YWwgZXZlbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dExpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIEEgY29udGV4dCBoYXMgYmVlbiBhZGRlZAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIGNvbnRleHRDcmVhdGVkKEFic3RyYWN0Q29udGV4dCBjb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEEgY29udGV4dCBoYXMgYmVlbiByZW1vdmVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqLwotICAgIHZvaWQgY29udGV4dFJlbW92ZWQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L01lc3NhZ2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjc0NjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5NZXNzYWdlRXh0ZXJuYWxpemVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Nb2R1bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXRhRGF0YUVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TZWxmTWFuYWdlZERhdGFIb2xkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIDxwPkF4aXMyIHN0YXRlcyBhcmUgaGVsZCBpbiB0d28gaW5mb3JtYXRpb24gbW9kZWxzLCBjYWxsZWQgZGVzY3JpcHRpb24gaGllcmFyY2h5Ci0gKiAgYW5kIGNvbnRleHQgaGllcmFyY2h5LiBEZXNjcmlwdGlvbiBoaWVyYXJjaHkgaG9sZCBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gCi0gKiAgYW5kIGl0J3MgdmFsdWVzIGRvZXMgbm90IGNoYW5nZSB1bmxlc3MgZGVwbG95bWVudCBjb25maWd1cmF0aW9uIGNoYW5nZSAKLSAqICBvY2N1cnMgd2hlcmUgQ29udGV4dCBoaWVyYXJjaHkgaG9sZCBydW4gdGltZSBpbmZvcm1hdGlvbi4gQm90aCBoaWVyYXJjaGllcyAKLSAqICBjb25zaXN0cyBmb3VyIGxldmVscywgR2xvYmFsLCBTZXJ2aWNlIEdyb3VwLCBPcGVyYXRpb24gYW5kIE1lc3NhZ2UuIFBsZWFzZSAKLSAqICBsb29rIGF0ICJJbmZvcm1hdGlvbiBNb2RlbCIgc2VjdGlvbiAgb2YgIkF4aXMyIEFyY2hpdGVjdHVyZSBHdWlkZSIgZm9yIG1vcmUgCi0gKiAgaW5mb3JtYXRpb24uPC9wPgotICogIDxwPk1lc3NhZ2VDb250ZXh0IGhvbGQgcnVuIHRpbWUgaW5mb3JtYXRpb24gYWJvdXQgb25lIE1lc3NhZ2UgaW52b2NhdGlvbi4gSXQgCi0gKiAgaG9sZCByZWZlcmVuY2UgdG8gT3BlcmF0aW9uQ29udGV4dCwgU2VydmljZUdyb3VwQ29udGV4dCwgYW5kIENvbmZpZ3VyYXRpb24gCi0gKiAgQ29udGV4dCB0aWVkIHdpdGggY3VycmVudCBtZXNzYWdlLiBGb3IgYW4gZXhhbXBsZSBpZiB5b3UgbmVlZCBhY2Nlc3NlcyB0byBvdGhlciAKLSAqICBtZXNzYWdlcyBvZiB0aGUgY3VycmVudCBpbnZvY2F0aW9uLCB5b3UgY2FuIGdldCB0byB0aGVtIHZpYSBPcGVyYXRpb25Db250ZXh0LiAKLSAqICBBZGRpdGlvbiB0byBjbGFzcyBhdHRyaWJ1dGVzIGRlZmluZSBpbiBNZXNzYWdlIGNvbnRleHQsIG1lc3NhZ2UgY29udGV4dCBzdG9yZXMgCi0gKiAgdGhlIGluZm9ybWF0aW9uIGFzIG5hbWUgdmFsdWUgcGFpcnMuIFRob3NlIG5hbWUgdmFsdWUgcGFpcnMsYW5kIGNsYXNzIGF0dHJpYnV0ZXMgCi0gKiAgdHdlYWsgdGhlIGV4ZWN1dGlvbiBiZWhhdmlvciBvZiBtZXNzYWdlIGNvbnRleHQgYW5kIHNvbWUgb2YgdGhlbSBjYW4gYmUgZmluZCBpbiAKLSAqICBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyBjbGFzcy4gKFRPRE8gd2Ugc2hvdWxkIHByb3ZpZGUgbGlzdCBvZiBzdXBwb3J0ZWQgCi0gKiAgb3B0aW9ucykuIFlvdSBtYXkgc2V0IHRoZW0gYXQgYW55IGxldmVsIG9mIGNvbnRleHQgaGllcmFyY2h5IGFuZCB0aGV5IHdpbGwgCi0gKiAgYWZmZWN0IGludm9jYXRpb25zIHJlbGF0ZWQgdG8gdGhlaXIgY2hpbGQgZWxlbWVudHMuIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RDb250ZXh0IAotICAgIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUsIFNhZmVTZXJpYWxpemFibGUgewotCi0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNZXNzYWdlQ29udGV4dC5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGEgc2luZ2xlCi0gICAgICogbWVzc2FnZSBpbiB0aGUgbG9nIGZpbGVzLCBpcnJlc3BlY3RpdmUgb2YgdGhyZWFkIHN3aXRjaGVzLCBwZXJzaXN0ZW5jZSwKLSAgICAgKiBldGMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9nQ29ycmVsYXRpb25JRCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHN0cmluZyB3aWxsIGJlIHVzZWQgdG8gaG9sZCBhIGZvcm0gb2YgdGhlIGxvZ0NvcnJlbGF0aW9uSUQgdGhhdAotICAgICAqIGlzIG1vcmUgc3VpdGFibGUgZm9yIG91dHB1dCB0aGFuIGl0cyBnZW5lcmljIGZvcm0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIk1lc3NhZ2VDb250ZXh0IjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzc1MzYzNzA4ODI1NzM5MTg1OEw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvKioKLSAgICAgKiBBIHBsYWNlIHRvIHN0b3JlIHRoZSBjdXJyZW50IE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUaHJlYWRMb2NhbDxNZXNzYWdlQ29udGV4dD4gY3VycmVudE1lc3NhZ2VDb250ZXh0ID0gbmV3IFRocmVhZExvY2FsPE1lc3NhZ2VDb250ZXh0PigpOwotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBnZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiAoTWVzc2FnZUNvbnRleHQpIGN1cnJlbnRNZXNzYWdlQ29udGV4dC5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IGN0eCkgewotICAgICAgICBjdXJyZW50TWVzc2FnZUNvbnRleHQuc2V0KGN0eCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIE9wdGlvbnMgb24gdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgT3B0aW9ucyBvcHRpb25zOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5fRkxPVyA9IDE7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSU5fRkFVTFRfRkxPVyA9IDM7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBPVVRfRkxPVyA9IDI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT1VUX0ZBVUxUX0ZMT1cgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0FERFIgPSAiUkVNT1RFX0FERFIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9BRERSID0gIlRSQU5TUE9SVF9BRERSIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfSEVBREVSUyA9ICJUUkFOU1BPUlRfSEVBREVSUyI7Ci0KLQotICAgIC8qKgotICAgICAqIG1lc3NhZ2UgYXR0YWNobWVudHMKLSAgICAgKiBOT1RFOiBTZXJpYWxpemF0aW9uIG9mIG1lc3NhZ2UgYXR0YWNobWVudHMgaXMgaGFuZGxlZCBhcyBwYXJ0IG9mIHRoZQotICAgICAqIG92ZXJhbGwgbWVzc2FnZSBzZXJpYWxpemF0aW9uLiAgSWYgdGhpcyBuZWVkcyB0byBjaGFuZ2UsIHRoZW4KLSAgICAgKiBpbnZlc3RpZ2F0ZSBoYXZpbmcgdGhlIEF0dGFjaG1lbnQgY2xhc3MgaW1wbGVtZW50IHRoZQotICAgICAqIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB0cmFuc2llbnQgQXR0YWNobWVudHMgYXR0YWNobWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBUUkFOU1BPUlRfT1VUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX09VVCA9ICJUUkFOU1BPUlRfT1VUIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFRSQU5TUE9SVF9JTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9JTiA9ICJUUkFOU1BPUlRfSU4iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ0hBUkFDVEVSX1NFVF9FTkNPRElORwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9TRVRfRU5DT0RJTkcgPSAiQ0hBUkFDVEVSX1NFVF9FTkNPRElORyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBVVEZfOC4gVGhpcyBpcyB0aGUgJ3V0Zi04JyB2YWx1ZSBmb3IgQ0hBUkFDVEVSX1NFVF9FTkNPRElORwotICAgICAqIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFVURl8xNi4gVGhpcyBpcyB0aGUgJ3V0Zi0xNicgdmFsdWUgZm9yIENIQVJBQ1RFUl9TRVRfRU5DT0RJTkcKLSAgICAgKiBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTYgPSAidXRmLTE2IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFRSQU5TUE9SVF9TVUNDRUVECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX1NVQ0NFRUQgPSAiVFJBTlNQT1JUX1NVQ0NFRUQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORy4gVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IKLSAgICAgKiBDSEFSQUNURVJfU0VUX0VOQ09ESU5HIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkcgPSBVVEZfODsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIGRpcmVjdGlvbiBmbG93IGluIHVzZSB0byBmaWd1cmUgb3V0IHdoaWNoIHBhdGggdGhlIG1lc3NhZ2UgaXMgaW4KLSAgICAgKiAoc2VuZCBvciByZWNlaXZlKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgRkxPVyA9IElOX0ZMT1c7Ci0KLSAgICAvKioKLSAgICAgKiBUbyBpbnZva2UgZmlyZUFuZGZvcmdldCBtZXRob2Qgd2UgaGF2ZSB0byBoYW5kIG92ZXIgdHJhbnNwb3J0IHNlbmRpbmcgbG9naWMgdG8gYSB0aHJlYWQKLSAgICAgKiBvdGhlciB3aXNlIHVzZXIgaGFzIHRvIHdhaXQgdGlsbCBpdCBnZXQgdHJhbnNwb3J0IHJlc3BvbnNlIChpbiB0aGUgY2FzZSBvZiBIVFRQIGl0cyBIVFRQCi0gICAgICogMjAyKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9OT05fQkxPQ0tJTkcgPSAidHJhbnNwb3J0Tm9uQmxvY2tpbmciOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm9wZXJ0eSBhbGxvd3Mgc29tZW9uZSAoZS5nLiBSTSkgdG8gZGlzYWJsZSBhbiBhc3luYyBjYWxsYmFjayBmcm9tCi0gICAgICogYmVpbmcgaW52b2tlZCBpZiBhIGZhdWx0IG9jY3VycyBkdXJpbmcgbWVzc2FnZSB0cmFuc21pc3Npb24uICBJZiB0aGlzIGlzCi0gICAgICogbm90IHNldCwgaXQgY2FuIGJlIGFzc3VtZWQgdGhhdCB0aGUgZmF1bHQgd2lsbCBiZSBkZWxpdmVyZWQgdmlhCi0gICAgICogQ2FsbGJhY2sub25FcnJvciguLi4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQVNZTkNfQ0FMTEJBQ0tfT05fVFJBTlNQT1JUX0VSUk9SID0KLSAgICAgICAgICAgICJkaXNhYmxlVHJhbnNtaXNzaW9uRXJyb3JDYWxsYmFjayI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIHByb2Nlc3NpbmdGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzaW5nRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIHBhdXNlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBwYXVzZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIG91dHB1dFdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBvdXRwdXRXcml0dGVuOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBuZXdUaHJlYWRSZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBuZXdUaHJlYWRSZXF1aXJlZDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgaXNTT0FQMTEKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQMTEgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUaGUgY2hhaW4gb2YgSGFuZGxlcnMvUGhhc2VzIGZvciBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEhhbmRsZXI+IGV4ZWN1dGlvbkNoYWluOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUaGUgY2hhaW4gb2YgZXhlY3V0ZWQgSGFuZGxlcnMvUGhhc2VzIGZyb20gcHJvY2Vzc2luZwotICAgICAqLwotICAgIHByaXZhdGUgTGlua2VkTGlzdDxIYW5kbGVyPiBleGVjdXRlZFBoYXNlczsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgRmxhZyB0byBpbmRpY2F0ZSBpZiB3ZSBhcmUgZG9pbmcgUkVTVAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBkb2luZ1JFU1Q7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIEZsYWcgdG8gaW5kaWNhdGUgaWYgd2UgYXJlIGRvaW5nIE1UT00KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9pbmdNVE9NOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBGbGFnIHRvIGluZGljYXRlIGlmIHdlIGFyZSBkb2luZyBTV0EKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9pbmdTd0E7Ci0KLSAgICAvKioKLSAgICAgKiBBeGlzTWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlIGNvbnRleHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZTsKLQotICAgIC8qKgotICAgICAqIEF4aXNPcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZSBjb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogQXhpc1NlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIC8qKgotICAgICAqIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGUgc2VydmljZSBncm91cCBjYW4gYmUgc2V0IGluZGVwZW5kZW50bHkgb2YgdGhlIHNlcnZpY2UKLSAgICAgKiBzbyB0aGUgc2VydmljZSBtaWdodCBub3QgbWF0Y2ggdXAgd2l0aCB0aGlzIHNlcnZpY2VHcm91cAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cDsKLQotICAgIC8qKgotICAgICAqIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIEluZGV4IGludG8gdGhlIGV4ZWN1dHVpb24gY2hhaW4gb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlcgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRIYW5kbGVySW5kZXg7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIEluZGV4IGludG8gdGhlIGN1cnJlbnQgUGhhc2Ugb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlciAoaWYgYW55KQotICAgICAqLwotICAgIHByaXZhdGUgaW50IGN1cnJlbnRQaGFzZUluZGV4OwotCi0gICAgLyoqCi0gICAgICogSWYgd2UncmUgcHJvY2Vzc2luZyB0aGlzIE1DIGR1ZSB0byBmbG93Q29tcGxldGUoKSBiZWluZyBjYWxsZWQgaW4gdGhlIGNhc2UKLSAgICAgKiBvZiBhbiBFeGNlcHRpb24sIHRoaXMgd2lsbCBob2xkIHRoZSBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSBwcm9ibGVtLgotICAgICAqLwotICAgIHByaXZhdGUgRXhjZXB0aW9uIGZhaWx1cmVSZWFzb247Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFNPQVAgZW52ZWxvcGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBlbnZlbG9wZTsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0OwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCByZXNwb25zZVdyaXR0ZW4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBzZXJ2ZXJTaWRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNlcnZlclNpZGU7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFNlcnZpY2VDb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgc2VydmljZSBjb250ZXh0IElECi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNvbnRleHRJRDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgc2VydmljZSBncm91cCBjb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIEhvbGRzIGEga2V5IHRvIHJldHJpZXZlIHRoZSBjb3JyZWN0IFNlcnZpY2VHcm91cENvbnRleHQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBzZXNzaW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQ7Ci0KLQotICAgIC8qKgotICAgICAqIHRyYW5zcG9ydCBvdXQgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQ7Ci0KLSAgICAvKioKLSAgICAgKiB0cmFuc3BvcnQgaW4gZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIGluY29taW5nIHRyYW5zcG9ydCBuYW1lCi0gICAgICovCi0gICAgLy9UaGUgdmFsdWUgd2lsbCBiZSBzZXQgYnkgdGhlIHRyYW5zcG9ydCByZWNlaXZlciBhbmQgdGhlcmUgd2lsbCBiZSB2YWxpZGF0aW9uIGZvciB0aGUgdHJhbnNwb3J0Ci0gICAgLy9hdCB0aGUgZGlzcGF0Y2ggcGhhc2UgKGl0cyBwb3N0IGNvbmRpdGlvbikKLSAgICBwcml2YXRlIFN0cmluZyBpbmNvbWluZ1RyYW5zcG9ydE5hbWU7Ci0KLQotICAgIC8qCi0gICAgICogU2VsZk1hbmFnZWREYXRhIHdpbGwgaG9sZCBtZXNzYWdlLXNwZWNpZmljIGRhdGEgc2V0IGJ5IGhhbmRsZXJzCi0gICAgICogTm90ZSB0aGF0IHRoaXMgbGlzdCBpcyBub3QgZXhwbGljaXRseSBzYXZlZCBieSB0aGUgTWVzc2FnZUNvbnRleHQsIGJ1dAotICAgICAqIHJhdGhlciB0aHJvdWdoIHRoZSBTZWxmTWFuYWdlZERhdGFNYW5hZ2VyIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBoYW5kbGVycwotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHNlbGZNYW5hZ2VkRGF0YU1hcCA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSgpIGFmdGVyIHJlYWRFeHRlcm5hbCgpCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVzc2FnZSBjb250ZXh0IGhhcyBiZWVuIHJlY29uc3RpdHV0ZWQKLSAgICAgKiBhbmQgbmVlZHMgdG8gaGF2ZSBpdHMgb2JqZWN0IHJlZmVyZW5jZXMgcmVjb25jaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbmVlZHNUb0JlUmVjb25jaWxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogc2VsZk1hbmFnZWREYXRhSGFuZGxlckNvdW50IGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBoYW5kbGVycwotICAgICAqIHRoYXQgYWN0dWFsbHkgc2F2ZWQgZGF0YSBkdXJpbmcgc2VyaWFsaXphdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBzZWxmTWFuYWdlZERhdGFIYW5kbGVyQ291bnQgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2VsZk1hbmFnZWREYXRhIGNhbm5vdCBiZSByZXN0b3JlZCB1bnRpbCB0aGUgY29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBpcyBhdmFpbGFibGUsIHNvIHdlIGhhdmUgdG8gaG9sZCB0aGUgZGF0YSBmcm9tIHJlYWRFeHRlcm5hbCB1bnRpbAotICAgICAqIGFjdGl2YXRlIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBcnJheUxpc3Q8U2VsZk1hbmFnZWREYXRhSG9sZGVyPiBzZWxmTWFuYWdlZERhdGFMaXN0SG9sZGVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBvcmRlcmVkIGxpc3Qgb2YgbWV0YWRhdGEgZm9yIGhhbmRsZXJzL3BoYXNlcwotICAgICAqIHVzZWQgZHVyaW5nIHJlLWNvbnN0aXR1dGlvbiBvZiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQXJyYXlMaXN0PE1ldGFEYXRhRW50cnk+IG1ldGFFeGVjdXRpb25DaGFpbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb3JkZXJlZCBsaXN0IG9mIG1ldGFkYXRhIGZvciBleGVjdXRlZCBwaGFzZXMKLSAgICAgKiB1c2VkIGR1cmluZyByZS1jb25zdGl0dXRpb24gb2YgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IExpbmtlZExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YUV4ZWN1dGVkID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEluZGV4IGludG8gdGhlIGV4ZWN1dHVpb24gY2hhaW4gb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlcgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBtZXRhSGFuZGxlckluZGV4ID0gMDsKLQotICAgIC8qKgotICAgICAqIEluZGV4IGludG8gdGhlIGN1cnJlbnQgUGhhc2Ugb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaGFuZGxlciAoaWYgYW55KQotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBtZXRhUGhhc2VJbmRleCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXhpc09wZXJhdGlvbiBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgZHVyaW5nCi0gICAgICogYWN0aXZhdGUgdG8gbWF0Y2ggdXAgd2l0aCBhbiBleGlzdGluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhRGF0YUVudHJ5IG1ldGFBeGlzT3BlcmF0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBBeGlzU2VydmljZSBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgZHVyaW5nCi0gICAgICogYWN0aXZhdGUgdG8gbWF0Y2ggdXAgd2l0aCBhbiBleGlzdGluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhRGF0YUVudHJ5IG1ldGFBeGlzU2VydmljZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXhpc1NlcnZpY2VHcm91cCBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgZHVyaW5nCi0gICAgICogYWN0aXZhdGUgdG8gbWF0Y2ggdXAgd2l0aCBhbiBleGlzdGluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhRGF0YUVudHJ5IG1ldGFBeGlzU2VydmljZUdyb3VwID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgZHVyaW5nCi0gICAgICogYWN0aXZhdGUgdG8gbWF0Y2ggdXAgd2l0aCBhbiBleGlzdGluZyBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBNZXRhRGF0YUVudHJ5IG1ldGFUcmFuc3BvcnRPdXQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhVHJhbnNwb3J0SW4gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIEF4aXNNZXNzYWdlIG1ldGFkYXRhIHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBtYXRjaCB1cCB3aXRoIGFuIGV4aXN0aW5nIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGFEYXRhRW50cnkgbWV0YUF4aXNNZXNzYWdlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgbWVzc2FnZSBjb250ZXh0IGhhcyBhbgotICAgICAqIEF4aXNNZXNzYWdlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBuZWVkcyB0bwotICAgICAqIGJlIHJlY29uY2lsZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIHJlY29uY2lsZUF4aXNNZXNzYWdlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhlY3V0ZWQgcGhhc2UgbGlzdAotICAgICAqIHdhcyByZXNldCBiZWZvcmUgdGhlIHJlc3RvcmVkIGxpc3QgaGFzIGJlZW4gcmVjb25jaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gZXhlY3V0ZWRQaGFzZXNSZXNldCA9IGZhbHNlOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZW5kIE1ldGFEYXRhIHNlY3Rpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBoYXMgcGFja2FnZSBhY2Nlc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0IHRoZSBhc3NvY2lhdGVkIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgTWVzc2FnZUNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRMb2dJRFN0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhICJyYXciIHZlcnNpb24gb2YgdGhlIGxvZ0NvcnJlbGF0aW9uSUQuICBUaGUgbG9nQ29ycmVsYXRpb25JRAotICAgICAqIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGFuZCBtYXkgYmUgcGVyc2lzdGVkIGFsb25nIHdpdGggdGhlIHJlc3QKLSAgICAgKiBvZiB0aGUgbWVzc2FnZSBjb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0IGNhbiBiZSBvdXRwdXQgdG8gYSBsb2cgZmlsZSBhcyBhbiBpZGVudGlmaWVyCi0gICAgICogICAgICAgICBmb3IgdGhpcyBNZXNzYWdlQ29udGV4dC4gIEl0IGlzIHN1aXRhYmxlIGZvciBtYXRjaGluZyByZWxhdGVkIGxvZwotICAgICAqICAgICAgICAgZW50cmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ0NvcnJlbGF0aW9uSUQoKSB7Ci0gICAgICAgIGlmIChsb2dDb3JyZWxhdGlvbklEID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0NvcnJlbGF0aW9uSUQgPSBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbG9nQ29ycmVsYXRpb25JRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiB0aGUgbG9nQ29ycmVsYXRpb25JRC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBjYW4gYmUgb3V0cHV0IHRvIGEgbG9nIGZpbGUgYXMgYW4gaWRlbnRpZmllcgotICAgICAqICAgICAgICAgZm9yIHRoaXMgTWVzc2FnZUNvbnRleHQuICBJdCBpcyBzdWl0YWJsZSBmb3IgbWF0Y2hpbmcgcmVsYXRlZCBsb2cKLSAgICAgKiAgICAgICAgIGVudHJpZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2dJRFN0cmluZygpIHsKLSAgICAgICAgaWYgKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9ICJbTWVzc2FnZUNvbnRleHQ6IGxvZ0lEPSIgKyBnZXRMb2dDb3JyZWxhdGlvbklEKCkgKyAiXSI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQYXVzZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IGhhbmRsZXIgY2hhaW4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLSAgICAgICAgcGF1c2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBnZXRBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCkgewotICAgICAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldEF4aXNPcGVyYXRpb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkKSB7Ci0gICAgICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0QXhpc1NlcnZpY2UiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiA8UD4KLSAgICAgKiBOb3RlIHRoZSBzZXJ2aWNlIGdyb3VwIGNhbiBiZSBzZXQgaW5kZXBlbmRlbnRseSBvZiB0aGUgc2VydmljZQotICAgICAqIHNvIHRoZSBzZXJ2aWNlIG1pZ2h0IG5vdCBtYXRjaCB1cCB3aXRoIHRoaXMgc2VydmljZUdyb3VwCi0gICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCBnZXRBeGlzU2VydmljZUdyb3VwKCkgewotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCkgewotICAgICAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldEF4aXNTZXJ2aWNlR3JvdXAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2VHcm91cDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkKSB7Ci0gICAgICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50SGFuZGxlckluZGV4KCkgewotICAgICAgICByZXR1cm4gY3VycmVudEhhbmRsZXJJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRQaGFzZUluZGV4KCkgewotICAgICAgICByZXR1cm4gY3VycmVudFBoYXNlSW5kZXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFNPQVBFbnZlbG9wZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldEVudmVsb3BlKCkgewotICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxIYW5kbGVyPiBnZXRFeGVjdXRpb25DaGFpbigpIHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQpIHsKLSAgICAgICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRFeGVjdXRpb25DaGFpbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleGVjdXRpb25DaGFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBQaGFzZSB0byB0aGUgY29sbGVjdGlvbiBvZiBleGVjdXRlZCBwaGFzZXMgZm9yIHRoZSBwYXRoLgotICAgICAqIFBoYXNlcyB3aWxsIGJlIGluc2VydGVkIGluIGEgTElGTyBkYXRhIHN0cnVjdHVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZSBUaGUgcGhhc2UgdG8gYWRkIHRvIHRoZSBsaXN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEV4ZWN1dGVkUGhhc2UoSGFuZGxlciBwaGFzZSkgewotICAgICAgICBpZiAoZXhlY3V0ZWRQaGFzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXhlY3V0ZWRQaGFzZXMgPSBuZXcgTGlua2VkTGlzdDxIYW5kbGVyPigpOwotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVkUGhhc2VzLmFkZEZpcnN0KHBoYXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGZpcnN0IFBoYXNlIGluIHRoZSBjb2xsZWN0aW9uIG9mIGV4ZWN1dGVkIHBoYXNlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZpcnN0RXhlY3V0ZWRQaGFzZSgpIHsKLSAgICAgICAgaWYgKGV4ZWN1dGVkUGhhc2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWN1dGVkUGhhc2VzLnJlbW92ZUZpcnN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZXhlY3V0ZWQgcGhhc2UgbGlzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4gSXRlcmF0b3Igb3ZlciB0aGUgTElGTyBkYXRhIHN0cnVjdHVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3I8SGFuZGxlcj4gZ2V0RXhlY3V0ZWRQaGFzZXMoKSB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkKSB7Ci0gICAgICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0RXhlY3V0ZWRQaGFzZXMiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0ZWRQaGFzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXhlY3V0ZWRQaGFzZXMgPSBuZXcgTGlua2VkTGlzdDxIYW5kbGVyPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleGVjdXRlZFBoYXNlcy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlc2V0IHRoZSBsaXN0IG9mIGV4ZWN1dGVkIHBoYXNlcy4KLSAgICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBPdXRJbkF4aXNPcGVyYXRpb24gY3VycmVudGx5IGludm9rZXMKLSAgICAgKiByZWNlaXZlKCkgZXZlbiB3aGVuIGEgZmF1bHQgb2NjdXJzLCBhbmQgd2Ugd2lsbCBoYXZlIGFscmVhZHkgZXhlY3V0ZWQKLSAgICAgKiB0aGUgZmxvd0NvbXBsZXRlIG9uIHRob3NlIGJlZm9yZSByZWNlaXZlRmF1bHQoKSBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXRFeGVjdXRlZFBoYXNlcygpIHsKLSAgICAgICAgZXhlY3V0ZWRQaGFzZXNSZXNldCA9IHRydWU7Ci0gICAgICAgIGV4ZWN1dGVkUGhhc2VzID0gbmV3IExpbmtlZExpc3Q8SGFuZGxlcj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRW5kcG9pbnRSZWZlcmVuY2UuCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEZhdWx0VG8oKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zLmdldEZhdWx0VG8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRW5kcG9pbnRSZWZlcmVuY2UuCi0gICAgICovCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEZyb20oKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zLmdldEZyb20oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgbWVzc2FnZSBpZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJRCgpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0TWVzc2FnZUlkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGJvdGggbW9kdWxlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcyB3ZWxsIGFzIG90aGVyCi0gICAgICogcGFyYW1ldGVycy4gVGhlIG9yZGVyIG9mIHNlYXJjaCBpcyBhcyBmb2xsb3dzOgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+IFNlYXJjaCBpbiBtb2R1bGUgY29uZmlndXJhdGlvbnMgaW5zaWRlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uCi0gICAgICogZGVzY3JpcHRpb24gaWYgaXRzIHRoZXJlIDwvbGk+Ci0gICAgICogPGxpPiBTZWFyY2ggaW4gY29ycmVzcG9uZGluZyBvcGVyYXRpb24gaWYgaXRzIHRoZXJlIDwvbGk+Ci0gICAgICogPGxpPiBTZWFyY2ggaW4gbW9kdWxlIGNvbmZpZ3VyYXRpb25zIGluc2lkZSBjb3JyZXNwb25kaW5nIHNlcnZpY2UKLSAgICAgKiBkZXNjcmlwdGlvbiBpZiBpdHMgdGhlcmUgPC9saT4KLSAgICAgKiA8bGk+IE5leHQgc2VhcmNoIGluIENvcnJlc3BvbmRpbmcgU2VydmljZSBkZXNjcmlwdGlvbiBpZiBpdHMgdGhlcmUgPC9saT4KLSAgICAgKiA8bGk+IE5leHQgc2VhcmNoIGluIG1vZHVsZSBjb25maWd1cmF0aW9ucyBpbnNpZGUgYXhpc0NvbmZpZ3VyYXRpb24gPC9saT4KLSAgICAgKiA8bGk+IFNlYXJjaCBpbiBBeGlzQ29uZmlndXJhdGlvbiBmb3IgcGFyYW1ldGVycyA8L2xpPgotICAgICAqIDxsaT4gTmV4dCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGFuZCBzZWFyY2ggZm9yIHRoZSBwYXJhbWV0ZXJzCi0gICAgICogPC9saT4KLSAgICAgKiA8bGk+IFNlYXJjaCBpbiBIYW5kbGVyRGVzY3JpcHRpb24gZm9yIHRoZSBwYXJhbWV0ZXIgPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDxwLz4gYW5kIHRoZSB3YXkgb2Ygc3BlY2lmeWluZyBtb2R1bGUgY29uZmlndXJhdGlvbiBpcyBhcyBmb2xsb3dzCi0gICAgICogPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4gPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSIKLSAgICAgKiA+Ti9BPC9wYXJhbWV0ZXI+IDwvbW9kdWxlQ29uZmlnPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgOgotICAgICAqICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBOYW1lCi0gICAgICogQHBhcmFtIG1vZHVsZU5hbWUgOgotICAgICAqICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIG1vZHVsZQotICAgICAqIEBwYXJhbSBoYW5kbGVyICAgIDxjb2RlPkhhbmRsZXJEZXNjcmlwdGlvbjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIFBhcmFtZXRlciA8Y29kZT5QYXJhbWV0ZXI8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRNb2R1bGVQYXJhbWV0ZXIoU3RyaW5nIGtleSwgU3RyaW5nIG1vZHVsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICBNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZzsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wRGVzYyA9IGdldEF4aXNPcGVyYXRpb24oKTsKLQotICAgICAgICBpZiAob3BEZXNjICE9IG51bGwpIHsKLQotICAgICAgICAgICAgbW9kdWxlQ29uZmlnID0gb3BEZXNjLmdldE1vZHVsZUNvbmZpZyhtb2R1bGVOYW1lKTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0gPSBtb2R1bGVDb25maWcuZ2V0UGFyYW1ldGVyKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBvcERlc2MuZ2V0UGFyYW1ldGVyKGtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZ2V0QXhpc1NlcnZpY2UoKTsKLQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBtb2R1bGVDb25maWcgPSBheGlzU2VydmljZS5nZXRNb2R1bGVDb25maWcobW9kdWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVDb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmFtID0gbW9kdWxlQ29uZmlnLmdldFBhcmFtZXRlcihrZXkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKGtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VEZXNjID0gZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotCi0gICAgICAgIGlmIChheGlzU2VydmljZURlc2MgIT0gbnVsbCkgewotCi0gICAgICAgICAgICBtb2R1bGVDb25maWcgPSBheGlzU2VydmljZURlc2MuZ2V0TW9kdWxlQ29uZmlnKG1vZHVsZU5hbWUpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJhbSA9IG1vZHVsZUNvbmZpZy5nZXRQYXJhbWV0ZXIoa2V5KTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IGF4aXNTZXJ2aWNlRGVzYy5nZXRQYXJhbWV0ZXIoa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgbW9kdWxlQ29uZmlnID0gYmFzZUNvbmZpZy5nZXRNb2R1bGVDb25maWcobW9kdWxlTmFtZSk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbSA9IG1vZHVsZUNvbmZpZy5nZXRQYXJhbWV0ZXIoa2V5KTsKLQotICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhcmFtID0gYmFzZUNvbmZpZy5nZXRQYXJhbWV0ZXIoa2V5KTsKLQotICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGJhc2VDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotCi0gICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW0gPSBtb2R1bGUuZ2V0UGFyYW1ldGVyKGtleSk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW0gPSBoYW5kbGVyLmdldFBhcmFtZXRlcihrZXkpOwotCi0gICAgICAgIHJldHVybiBwYXJhbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dCBnZXRPcGVyYXRpb25Db250ZXh0KCkgewotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCkgewotICAgICAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldE9wZXJhdGlvbkNvbnRleHQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIHBhcmFtZXRlcnMgYXQgYW55IGxldmVsLiBUaGUgb3JkZXIgb2YKLSAgICAgKiBzZWFyY2ggaXMgYXMgZm9sbG93czoKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPiBTZWFyY2ggaW4gbWVzc2FnZSBkZXNjcmlwdGlvbiBpZiBpdCBleGlzdHMgPC9saT4KLSAgICAgKiA8bGk+IElmIHBhcmFtZXRlciBpcyBub3QgZm91bmQgb3IgaWYgYXhpc01lc3NhZ2UgaXMgbnVsbCwgc2VhcmNoIGluCi0gICAgICogQXhpc09wZXJhdGlvbiA8L2xpPgotICAgICAqIDxsaT4gSWYgcGFyYW1ldGVyIGlzIG5vdCBmb3VuZCBvciBpZiBvcGVyYXRpb25Db250ZXh0IGlzIG51bGwsIHNlYXJjaCBpbgotICAgICAqIEF4aXNTZXJ2aWNlIDwvbGk+Ci0gICAgICogPGxpPiBJZiBwYXJhbWV0ZXIgaXMgbm90IGZvdW5kIG9yIGlmIGF4aXNTZXJ2aWNlIGlzIG51bGwsIHNlYXJjaCBpbgotICAgICAqIEF4aXNDb25maWd1cmF0aW9uIDwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgbmFtZSBvZiBkZXNpcmVkIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gUGFyYW1ldGVyIDxjb2RlPlBhcmFtZXRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcga2V5KSB7Ci0gICAgICAgIAotICAgICAgICBpZiggYXhpc01lc3NhZ2UgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzTWVzc2FnZS5nZXRQYXJhbWV0ZXIoa2V5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VDb25maWcuZ2V0UGFyYW1ldGVyKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGEgcHJvcGVydHkgdmFsdWUuIFRoZSBvcmRlciBvZiBzZWFyY2ggaXMgYXMgZm9sbG93czogc2VhcmNoIGluCi0gICAgICogbXkgb3duIG1hcCBhbmQgdGhlbiBsb29rIGF0IG15IG9wdGlvbnMuIERvZXMgbm90IHNlYXJjaCB1cCB0aGUgaGllcmFyY2h5LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRMb2NhbFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRMb2NhbFByb3BlcnR5KG5hbWUsIHRydWUpOwotICAgIH0KLSAgICBwdWJsaWMgT2JqZWN0IGdldExvY2FsUHJvcGVydHkoU3RyaW5nIG5hbWUsIGJvb2xlYW4gc2VhcmNoT3B0aW9ucykgewotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCkgewotICAgICAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldFByb3BlcnR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZWFyY2ggaW4gbXkgb3duIG9wdGlvbnMKLSAgICAgICAgT2JqZWN0IG9iaiA9IHN1cGVyLmdldExvY2FsUHJvcGVydHkobmFtZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZWFyY2hPcHRpb25zKSB7Ci0gICAgICAgICAgICBvYmogPSBvcHRpb25zLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRvdWdoCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYSBwcm9wZXJ0eSB2YWx1ZS4gVGhlIG9yZGVyIG9mIHNlYXJjaCBpcyBhcyBmb2xsb3dzOiBzZWFyY2ggaW4KLSAgICAgKiBteSBvd24gbWFwIGFuZCB0aGVuIGxvb2sgaW4gbXkgY29udGV4dCBoaWVyYXJjaHksIGFuZCB0aGVuIGluIG9wdGlvbnMuIAotICAgICAqIFNpbmNlIGl0cyBwb3NzaWJsZQotICAgICAqIHRoYXQgdGhlIGVudGlyZSBoaWVyYXJjaHkgaXMgbm90IHByZXNlbnQsIEkgd2lsbCBzdGFydCBhdCB3aGF0ZXZlciBsZXZlbAotICAgICAqIGhhcyBiZWVuIHNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQpIHsKLSAgICAgICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRQcm9wZXJ0eSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VhcmNoIGluIG15IG93biBvcHRpb25zCi0gICAgICAgIE9iamVjdCBvYmogPSBzdXBlci5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgb2JqID0gb3B0aW9ucy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTXkgb3duIGNvbnRleHQgaGllcmFyY2h5IG1heSBub3QgYWxsIGJlIHByZXNlbnQuIFNvIGxvb2sgZm9yIHdoYXRldmVyCi0gICAgICAgIC8vIG5lYXJlc3QgbGV2ZWwgaXMgcHJlc2VudCBhbmQgYXNrIHRoYXQgdG8gZmluZCB0aGUgcHJvcGVydHkuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIElmIHRoZSBjb250ZXh0IGlzIGFscmVhZHkgYW4gYW5jZXN0b3IsIGl0IHdhcyBjaGVja2VkIGR1cmluZwotICAgICAgICAvLyB0aGUgc3VwZXIuZ2V0UHJvcGVydHkgY2FsbC4gIEluIHN1Y2ggY2FzZXMsIHRoZSBzZWNvbmQgY2hlY2sgCi0gICAgICAgIC8vIGlzIG5vdCBwZXJmb3JtZWQuCi0gICAgICAgIGlmIChvcGVyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaXNBbmNlc3RvcihvcGVyYXRpb25Db250ZXh0KSkgewotICAgICAgICAgICAgICAgIG9iaiA9IG9wZXJhdGlvbkNvbnRleHQuZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0FuY2VzdG9yKHNlcnZpY2VDb250ZXh0KSkgewotICAgICAgICAgICAgICAgIG9iaiA9IHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0FuY2VzdG9yKHNlcnZpY2VHcm91cENvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgb2JqID0gIHNlcnZpY2VHcm91cENvbnRleHQuZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0FuY2VzdG9yKGNvbmZpZ3VyYXRpb25Db250ZXh0KSkgewotICAgICAgICAgICAgICAgIG9iaiA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIGdpdmVuIHByb3BlcnR5IGlzIHRydWUuICBXaWxsIHJldHVybiBmYWxzZSBpZiB0aGUgcHJvcGVydHkKLSAgICAgKiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYW4gZXhwbGljaXQgInRydWUiIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgaXMgQm9vbGVhbi5UUlVFLCAidHJ1ZSIsIDEsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5VHJ1ZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gaXNQcm9wZXJ0eVRydWUobmFtZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIGEgZ2l2ZW4gcHJvcGVydHkgaXMgdHJ1ZS4gIFdpbGwgcmV0dXJuIHRoZSBwYXNzZWQgZGVmYXVsdCBpZiB0aGUgcHJvcGVydHkKLSAgICAgKiBkb2VzIG5vdCBleGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNoZWNrCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWwgdGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHByb3BlcnR5IGRvZXNuJ3QgZXhpc3QKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgaXMgQm9vbGVhbi5UUlVFLCAidHJ1ZSIsIDEsIGV0Yy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5VHJ1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsKSB7Ci0gICAgICAgIHJldHVybiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShnZXRQcm9wZXJ0eShuYW1lKSwgZGVmYXVsdFZhbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgcHJvcGVydHkgdmFsdWVzLiBUaGUgb3JkZXIgb2Ygc2VhcmNoIGlzIGFzIGZvbGxvd3M6IHNlYXJjaCBpbgotICAgICAqIG15IG93biBvcHRpb25zIGFuZCB0aGVuIGxvb2sgaW4gbXkgY29udGV4dCBoaWVyYXJjaHkuIFNpbmNlIGl0cyBwb3NzaWJsZQotICAgICAqIHRoYXQgdGhlIGVudGlyZSBoaWVyYXJjaHkgaXMgbm90IHByZXNlbnQsIGl0IHdpbGwgc3RhcnQgYXQgd2hhdGV2ZXIgbGV2ZWwKLSAgICAgKiBoYXMgYmVlbiBzZXQgYW5kIHN0YXJ0IHRoZXJlLgotICAgICAqIFRoZSByZXR1cm5lZCBtYXAgaXMgdW5tb2RpZmlhYmxlLCBzbyBhbnkgY2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyBoYXZlCi0gICAgICogdG8gYmUgZG9uZSBieSBjYWxsaW5nIHtAbGluayAjc2V0UHJvcGVydHkoU3RyaW5nLE9iamVjdCl9LiBJbiBhZGRpdGlvbiwKLSAgICAgKiBhbnkgY2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyBhcmUgbm90IHJlZmxlY3RlZCBvbiB0aGlzIG1hcC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4gdW5tb2RpZmlhYmxlIG1hcCBjb250YWluaW5nIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgYXZhaWxhYmxlCi0gICAgICogICAgICAgICBwcm9wZXJ0aWVzIG9yIGFuIGVtcHR5IG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCi0gICAgICAgIC8vIE15IG93biBjb250ZXh0IGhpZXJhcmNoeSBtYXkgbm90IGFsbCBiZSBwcmVzZW50LiBTbyBsb29rIGZvciB3aGF0ZXZlcgotICAgICAgICAvLyBuZWFyZXN0IGxldmVsIGlzIHByZXNlbnQgYW5kIGFkZCB0aGUgcHJvcGVydGllcwotICAgICAgICAvLyBXZSBoYXZlIHRvIGFjY2VzcyB0aGUgY29udGV4dHMgaW4gcmV2ZXJzZSBvcmRlciwgaW4gb3JkZXIgdG8gYWxsb3cKLSAgICAgICAgLy8gYSBuZWFyZXIgY29udGV4dCB0byBvdmVyd3JpdGUgdmFsdWVzIGZyb20gYSBtb3JlIGRpc3RhbnQgY29udGV4dAotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0TWFwLnB1dEFsbChjb25maWd1cmF0aW9uQ29udGV4dC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdE1hcC5wdXRBbGwoc2VydmljZUdyb3VwQ29udGV4dC5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHRNYXAucHV0QWxsKHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0TWFwLnB1dEFsbChvcGVyYXRpb25Db250ZXh0LmdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYW5kIG5vdyBhZGQgb3B0aW9ucwotICAgICAgICByZXN1bHRNYXAucHV0QWxsKG9wdGlvbnMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHRNYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBSZWxhdGVzVG8gYXJyYXkuCi0gICAgICovCi0gICAgcHVibGljIFJlbGF0ZXNUb1tdIGdldFJlbGF0aW9uc2hpcHMoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25zLmdldFJlbGF0aW9uc2hpcHMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYW55IFJlbGF0ZXNUb3Mgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBUT0RPOiBTaG91bGRuJ3QgdGhpcyByZXR1cm4gYSBMaXN0PwotICAgICAqCi0gICAgICogQHBhcmFtIHR5cGUgdGhlIHJlbGF0aW9uc2hpcCB0eXBlCi0gICAgICogQHJldHVybiBSZXR1cm5zIFJlbGF0ZXNUby4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRlc1RvIGdldFJlbGF0ZXNUbyhTdHJpbmcgdHlwZSkgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5nZXRSZWxhdGVzVG8odHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFJlbGF0ZXNUby4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVsYXRlc1RvIGdldFJlbGF0ZXNUbygpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0UmVsYXRlc1RvKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEVuZHBvaW50UmVmZXJlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRSZXBseVRvKCkgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5nZXRSZXBseVRvKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFNlcnZpY2VDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBnZXRTZXJ2aWNlQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQpIHsKLSAgICAgICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRTZXJ2aWNlQ29udGV4dCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VDb250ZXh0SUQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlQ29udGV4dElEKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNvbnRleHRJRDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dCBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCkgewotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCkgewotICAgICAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldFNlcnZpY2VHcm91cENvbnRleHQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VHcm91cENvbnRleHRJZCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cENvbnRleHRJZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU2Vzc2lvbkNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gc2Vzc2lvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNvbnRleHQoU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5zZXNzaW9uQ29udGV4dCA9IHNlc3Npb25Db250ZXh0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHNvYXAgYWN0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29hcEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0QWN0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEVuZHBvaW50UmVmZXJlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRUbygpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0VG8oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBnZXRUcmFuc3BvcnRJbigpIHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQpIHsKLSAgICAgICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRUcmFuc3BvcnRJbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRJbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGdldFRyYW5zcG9ydE91dCgpIHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQpIHsKLSAgICAgICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRUcmFuc3BvcnRPdXQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhbnNwb3J0T3V0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NBQWN0aW9uKCkgewotICAgICAgICByZXR1cm4gb3B0aW9ucy5nZXRBY3Rpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvaW5nTVRPTSgpIHsKLSAgICAgICAgcmV0dXJuIGRvaW5nTVRPTTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvaW5nUkVTVCgpIHsKLSAgICAgICAgcmV0dXJuIGRvaW5nUkVTVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RvaW5nU3dBKCkgewotICAgICAgICByZXR1cm4gZG9pbmdTd0E7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOZXdUaHJlYWRSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ld1RocmVhZFJlcXVpcmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzT3V0cHV0V3JpdHRlbigpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dFdyaXR0ZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXVzZWQoKSB7Ci0gICAgICAgIHJldHVybiBwYXVzZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGF1c2VkKGJvb2xlYW4gcGF1c2VkKSB7Ci0gICAgICAgIHRoaXMucGF1c2VkID0gcGF1c2VkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2luZ0ZhdWx0KCkgewotICAgICAgICByZXR1cm4gcHJvY2Vzc2luZ0ZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VXcml0dGVuKCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcml0dGVuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU09BUDExKCkgewotICAgICAgICByZXR1cm4gaXNTT0FQMTE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBpbmJvdW5kIGNvbnRlbnQgbGVuZ3RoIG9mIDAKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRJbmJvdW5kQ29udGVudExlbmd0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGF0dGFjaG1lbnQgbWFwLCB0aGUgQXR0YWNobWVudHMga2VlcCB0cmFjawotICAgICAgICAvLyBvZiB0aGUgaW5ib3VuZCBjb250ZW50IGxlbmd0aC4KLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzLmdldENvbnRlbnRMZW5ndGgoKTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIC8vIE90aGVyd2lzZSB0aGUgbGVuZ3RoIGlzIGFjY3VtdWxhdGVkIGJ5IHRoZSBEZXRhY2hhYmxlSW5wdXRTdHJlYW0uCi0gICAgICAgIERldGFjaGFibGVJbnB1dFN0cmVhbSBkaXMgPSAKLSAgICAgICAgICAgIChEZXRhY2hhYmxlSW5wdXRTdHJlYW0pIGdldFByb3BlcnR5KENvbnN0YW50cy5ERVRBQ0hBQkxFX0lOUFVUX1NUUkVBTSk7Ci0gICAgICAgIGlmIChkaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRpcy5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlKCkgewotICAgICAgICByZXR1cm4gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc01lc3NhZ2UgZ2V0QXhpc01lc3NhZ2UoKSB7Ci0gICAgICAgIGlmIChyZWNvbmNpbGVBeGlzTWVzc2FnZSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzV2FybkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKHRoaXMuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICI6Z2V0QXhpc01lc3NhZ2UoKTogKioqKldBUk5JTkcqKioqIE1lc3NhZ2VDb250ZXh0LmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KSBuZWVkcyB0byBiZSBpbnZva2VkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF4aXNNZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF4aXNNZXNzYWdlKEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMuYXhpc01lc3NhZ2UgPSBheGlzTWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBeGlzT3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgewotICAgICAgICB0aGlzLmF4aXNPcGVyYXRpb24gPSBheGlzT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF4aXNTZXJ2aWNlKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgaWYgKHRoaXMuYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZUdyb3VwID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogbm90ZSBzZXRBeGlzU2VydmljZUdyb3VwKCkgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIGdyb3VwIQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF4aXNTZXJ2aWNlR3JvdXAoQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwKSB7Ci0gICAgICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBheGlzIHNlcnZpY2UgZ3JvdXAgb2JqZWN0IHRvIG51bGwgd2hlbiBuZWNlc3NhcnkKLSAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHdoZW4gZXh0cmFjdGluZyB0aGUgbWVzc2FnZSBjb250ZXh0IG9iamVjdCBmcm9tCi0gICAgICAgIC8vIHRoZSBvYmplY3QgZ3JhcGgKLSAgICAgICAgdGhpcy5heGlzU2VydmljZUdyb3VwID0gYXhpc1NlcnZpY2VHcm91cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25Db250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRIYW5kbGVySW5kZXgoaW50IGN1cnJlbnRIYW5kbGVySW5kZXgpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50SGFuZGxlckluZGV4ID0gY3VycmVudEhhbmRsZXJJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UGhhc2VJbmRleChpbnQgY3VycmVudFBoYXNlSW5kZXgpIHsKLSAgICAgICAgdGhpcy5jdXJyZW50UGhhc2VJbmRleCA9IGN1cnJlbnRQaGFzZUluZGV4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9pbmdNVE9NKGJvb2xlYW4gYikgewotICAgICAgICBkb2luZ01UT00gPSBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9pbmdSRVNUKGJvb2xlYW4gYikgewotICAgICAgICBkb2luZ1JFU1QgPSBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9pbmdTd0EoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGRvaW5nU3dBID0gYjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZW52ZWxvcGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnZlbG9wZShTT0FQRW52ZWxvcGUgZW52ZWxvcGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLmVudmVsb3BlID0gZW52ZWxvcGU7Ci0KLSAgICAgICAgaWYgKHRoaXMuZW52ZWxvcGUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHNvYXBOYW1lc3BhY2VVUkkgPSBlbnZlbG9wZS5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzb2FwTmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgIGlzU09BUDExID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzb2FwTmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgIGlzU09BUDExID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFNPQVAgVmVyc2lvbi4gQ3VycmVudCBBeGlzIGhhbmRsZXMgb25seSBTT0FQIDEuMSBhbmQgU09BUCAxLjIgbWVzc2FnZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEluZm9ybSB0aGUgbGlzdGVuZXJzIG9mIGFuIGF0dGFjaCBlbnZlbG9wZSBldmVudAotICAgICAgICAgICAgaWYgKGdldEF4aXNTZXJ2aWNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdldEF4aXNTZXJ2aWNlKCkuYXR0YWNoRW52ZWxvcGVFdmVudCh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXhlY3V0aW9uIGNoYWluIG9mIEhhbmRsZXIgaW4gdGhpcyBNZXNzYWdlQ29udGV4dC4gRG9pbmcgdGhpcwotICAgICAqIGNhdXNlcyB0aGUgY3VycmVudCBoYW5kbGVyL3BoYXNlIGluZGV4ZXMgdG8gcmVzZXQgdG8gMCwgc2luY2Ugd2UgaGF2ZSBuZXcKLSAgICAgKiBIYW5kbGVycyB0byBleGVjdXRlICh0aGlzIHVzdWFsbHkgb25seSBoYXBwZW5zIGF0IGluaXRpYWxpemF0aW9uIGFuZCB3aGVuCi0gICAgICogYSBmYXVsdCBvY2N1cnMpLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4ZWN1dGlvbkNoYWluCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhlY3V0aW9uQ2hhaW4oQXJyYXlMaXN0PEhhbmRsZXI+IGV4ZWN1dGlvbkNoYWluKSB7Ci0gICAgICAgIHRoaXMuZXhlY3V0aW9uQ2hhaW4gPSBleGVjdXRpb25DaGFpbjsKLSAgICAgICAgY3VycmVudEhhbmRsZXJJbmRleCA9IC0xOwotICAgICAgICBjdXJyZW50UGhhc2VJbmRleCA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0VG8oRW5kcG9pbnRSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0RmF1bHRUbyhyZWZlcmVuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKEVuZHBvaW50UmVmZXJlbmNlIHJlZmVyZW5jZSkgewotICAgICAgICBvcHRpb25zLnNldEZyb20ocmVmZXJlbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUlkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUlEKFN0cmluZyBtZXNzYWdlSWQpIHsKLSAgICAgICAgb3B0aW9ucy5zZXRNZXNzYWdlSWQobWVzc2FnZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5ld1RocmVhZFJlcXVpcmVkKGJvb2xlYW4gYikgewotICAgICAgICBuZXdUaHJlYWRSZXF1aXJlZCA9IGI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcGVyYXRpb25Db250ZXh0KE9wZXJhdGlvbkNvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBhbGxvdyBzZXR0aW5nIHRoZSBmaWVsZHMgdG8gbnVsbAotICAgICAgICAvLyB1c2VmdWwgd2hlbiBleHRyYWN0aW5nIHRoZSBtZXNzZ2UgY29udGV4dCBmcm9tIHRoZSBvYmplY3QgZ3JhcGgKLSAgICAgICAgb3BlcmF0aW9uQ29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgICAgICAgdGhpcy5zZXRQYXJlbnQob3BlcmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlQ29udGV4dChvcGVyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uQ29udGV4dC5nZXRQYXJlbnQoKSAhPSBzZXJ2aWNlQ29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0Vycm9yKCJTZXJ2aWNlQ29udGV4dCBpbiBPcGVyYXRpb25Db250ZXh0IGRvZXMgbm90IG1hdGNoICEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMuc2V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25Db250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFdyaXR0ZW4oYm9vbGVhbiBiKSB7Ci0gICAgICAgIG91dHB1dFdyaXR0ZW4gPSBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc2luZ0ZhdWx0KGJvb2xlYW4gYikgewotICAgICAgICBwcm9jZXNzaW5nRmF1bHQgPSBiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIFJlbGF0ZXNUbwotICAgICAqCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZSBSZWxhdGVzVG8gZGVzY3JpYmluZyBob3cgd2UgcmVsYXRlIHRvIGFub3RoZXIgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFJlbGF0ZXNUbyhSZWxhdGVzVG8gcmVmZXJlbmNlKSB7Ci0gICAgICAgIG9wdGlvbnMuYWRkUmVsYXRlc1RvKHJlZmVyZW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFJlcGx5VG8gZGVzdGluYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWZlcmVuY2UgdGhlIFJlcGx5VG8gRVBSCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVwbHlUbyhFbmRwb2ludFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLSAgICAgICAgb3B0aW9ucy5zZXRSZXBseVRvKHJlZmVyZW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVdyaXR0ZW4oYm9vbGVhbiBiKSB7Ci0gICAgICAgIHJlc3BvbnNlV3JpdHRlbiA9IGI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTaWRlKGJvb2xlYW4gYikgewotICAgICAgICBzZXJ2ZXJTaWRlID0gYjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VDb250ZXh0KFNlcnZpY2VDb250ZXh0IGNvbnRleHQpIHsKLQotICAgICAgICAvLyBhbGxvdyB0aGUgc2VydmljZSBjb250ZXh0IHRvIGJlIHNldCB0byBudWxsCi0gICAgICAgIC8vIHRoaXMgYWxsb3dzIHRoZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0IHRvIGJlIGV4dHJhY2VkIGZyb20KLSAgICAgICAgLy8gdGhlIG9iamVjdCBncmFwaAotCi0gICAgICAgIHNlcnZpY2VDb250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKChvcGVyYXRpb25Db250ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICYmIChvcGVyYXRpb25Db250ZXh0LmdldFBhcmVudCgpICE9IGNvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNFcnJvcigiU2VydmljZUNvbnRleHQgYW5kIE9wZXJhdGlvbkNvbnRleHQucGFyZW50IGRvIG5vdCBtYXRjaCEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNldHRpbmcgY29uZmlnY29udGV4dCB1c2luZyBjb25maWd1cmF0aW9uIGNvbnRleHQgaW4gc2VydmljZSBjb250ZXh0Ci0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgY29uZmlnY29udGV4dAotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgc2VydmljZSBncm91cCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IGNvbnRleHQuZ2V0U2VydmljZUdyb3VwQ29udGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBjb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICB0aGlzLnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSW5mb3JtIHRoZSBsaXN0ZW5lcnMgb2YgYW4gYXR0YWNoIGV2ZW50Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmF0dGFjaFNlcnZpY2VDb250ZXh0RXZlbnQoc2VydmljZUNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc2VydmljZSBjb250ZXh0IGlkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0SUQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ29udGV4dElEKFN0cmluZyBzZXJ2aWNlQ29udGV4dElEKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUNvbnRleHRJRCA9IHNlcnZpY2VDb250ZXh0SUQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ29udGV4dChTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQpIHsKLSAgICAgICAgLy8gYWxsb3cgdGhlIHNlcnZpY2UgZ3JvdXAgY29udGV4dCB0byBiZSBzZXQgdG8gbnVsbAotICAgICAgICAvLyB0aGlzIGFsbG93cyB0aGUgbWVzc2FnZSBjb250ZXh0IG9iamVjdCB0byBiZSBleHRyYWNlZCBmcm9tCi0gICAgICAgIC8vIHRoZSBvYmplY3QgZ3JhcGgKLQotICAgICAgICB0aGlzLnNlcnZpY2VHcm91cENvbnRleHQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0OwotCi0gICAgICAgIGlmICh0aGlzLnNlcnZpY2VHcm91cENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZUdyb3VwID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ29udGV4dElkKFN0cmluZyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBDb250ZXh0SWQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0SWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNvYXBBY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwQWN0aW9uKFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKHNvYXBBY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvKEVuZHBvaW50UmVmZXJlbmNlIHRvKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8odG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRyYW5zcG9ydEluKFRyYW5zcG9ydEluRGVzY3JpcHRpb24gaW4pIHsKLSAgICAgICAgdGhpcy50cmFuc3BvcnRJbiA9IGluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRPdXQoVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gb3V0KSB7Ci0gICAgICAgIHRyYW5zcG9ydE91dCA9IG91dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXRXU0FBY3Rpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0FBY3Rpb24oU3RyaW5nIGFjdGlvblVSSSkgewotICAgICAgICBvcHRpb25zLnNldEFjdGlvbihhY3Rpb25VUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTQU1lc3NhZ2VJZChTdHJpbmcgbWVzc2FnZUlEKSB7Ci0gICAgICAgIG9wdGlvbnMuc2V0TWVzc2FnZUlkKG1lc3NhZ2VJRCk7Ci0gICAgfQotCi0gICAgLy8gdG8gZ2V0IHRoZSBmbG93IGlud2hpY2ggdGhlIGV4ZWN1dGlvbiBjaGFpbiBiZWxvdwotICAgIHB1YmxpYyBpbnQgZ2V0RkxPVygpIHsKLSAgICAgICAgcmV0dXJuIEZMT1c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RkxPVyhpbnQgRkxPVykgewotICAgICAgICB0aGlzLkZMT1cgPSBGTE9XOwotICAgIH0KLQotICAgIHB1YmxpYyBPcHRpb25zIGdldE9wdGlvbnMoKSB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkKSB7Ci0gICAgICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0T3B0aW9ucyIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcHRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgb3B0aW9ucyBmb3IgbXlzZWxmLiBJIG1ha2UgdGhlIGdpdmVuIG9wdGlvbnMgbXkgb3duIG9wdGlvbnMnCi0gICAgICogcGFyZW50IHNvIHRoYXQgdGhhdCBiZWNvbWVzIHRoZSBkZWZhdWx0LiBUaGF0IGFsbG93cyB0aGUgdXNlciB0byBvdmVycmlkZQotICAgICAqIHNwZWNpZmljIG9wdGlvbnMgb24gYSBnaXZlbiBtZXNzYWdlIGNvbnRleHQgYW5kIG5vdCBhZmZlY3QgdGhlIG92ZXJhbGwKLSAgICAgKiBvcHRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gc2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcHRpb25zLnNldFBhcmVudChvcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluY29taW5nVHJhbnNwb3J0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGluY29taW5nVHJhbnNwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUoU3RyaW5nIGluY29taW5nVHJhbnNwb3J0TmFtZSkgewotICAgICAgICB0aGlzLmluY29taW5nVHJhbnNwb3J0TmFtZSA9IGluY29taW5nVHJhbnNwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWxhdGlvbnNoaXBzKFJlbGF0ZXNUb1tdIGxpc3QpIHsKLSAgICAgICAgb3B0aW9ucy5zZXRSZWxhdGlvbnNoaXBzKGxpc3QpOwotICAgIH0KLQotCi0gICAgcHVibGljIFBvbGljeSBnZXRFZmZlY3RpdmVQb2xpY3koKSB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkKSB7Ci0gICAgICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0RWZmZWN0aXZlUG9saWN5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nTWVzc2FnZSA9IAotICAgICAgICAJKEF4aXNCaW5kaW5nTWVzc2FnZSkgZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19NRVNTQUdFKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIEF4aXNCaW5kaW5nTWVzc2FnZSBpcyBub3Qgc2V0LCB0cnkgdG8gZmluZCB0aGUgYmluZGluZyBtZXNzYWdlIGZyb20gdGhlIEF4aXNTZXJ2aWNlCi0gICAgICAgIGlmIChiaW5kaW5nTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgIAliaW5kaW5nTWVzc2FnZSA9IGZpbmRCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoYmluZGluZ01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdNZXNzYWdlLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotICAgICAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIHRoZSBBeGlzQmluZGluZ01lc3NhZ2UsIHRoZW4gdHJ5IHRoZSBBeGlzTWVzc2FnZSAgIAotICAgICAgICB9IGVsc2UgaWYgKGF4aXNNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgCQlyZXR1cm4gYXhpc01lc3NhZ2UuZ2V0RWZmZWN0aXZlUG9saWN5KCk7ICAgICAgICAJCQotICAgICAgICB9IGVsc2UgewotICAgICAgICAJCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotIAotICAgIHByaXZhdGUgQXhpc0JpbmRpbmdNZXNzYWdlIGZpbmRCaW5kaW5nTWVzc2FnZSgpIHsKLSAgICAJaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwgJiYgYXhpc09wZXJhdGlvbiAhPSBudWxsICkgewotCQkJaWYgKGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwpIHsKLQkJCQlBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gYXhpc1NlcnZpY2UKLQkJCQkJCS5nZXRFbmRwb2ludChheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0JCQkJaWYgKGF4aXNFbmRwb2ludCAhPSBudWxsKSB7Ci0JCQkJCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGF4aXNCaW5kaW5nCi0JCQkJCQkJLmdldENoaWxkKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvL0lmIEJpbmRpbmcgT3BlcmF0aW9uIGlzIG5vdCBmb3VuZCwganVzdCByZXR1cm4gbnVsbAotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0JpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXJlY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBheGlzTWVzc2FnZS5nZXREaXJlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoRkxPVyA9PSBJTl9GTE9XKSB8fCAoRkxPVyA9PSBJTl9GQVVMVF9GTE9XKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX09VVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdNZXNzYWdlOwotCQkJCQlpZiAoV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOCi0JCQkJCQkJLmVxdWFscyhkaXJlY3Rpb24pCi0JCQkJCQkJJiYgV1NETFV0aWwKLQkJCQkJCQkJCS5pc0lucHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uCi0JCQkJCQkJCQkJCS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0JCQkJCQlheGlzQmluZGluZ01lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKSBheGlzQmluZGluZ09wZXJhdGlvbgotCQkJCQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQkJCQkJCXJldHVybiBheGlzQmluZGluZ01lc3NhZ2U7Ci0JCQkJCQkKLQkJCQkJfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUCi0JCQkJCQkJLmVxdWFscyhkaXJlY3Rpb24pCi0JCQkJCQkJJiYgV1NETFV0aWwKLQkJCQkJCQkJCS5pc091dHB1dFByZXNlbnRGb3JNRVAoYXhpc09wZXJhdGlvbgotCQkJCQkJCQkJCQkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotCQkJCQkJYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCQkJLmdldENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCQkJCQkJcmV0dXJuIGF4aXNCaW5kaW5nTWVzc2FnZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmdhZ2VkKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkKSB7Ci0gICAgICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiaXNFbmdhZ2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBlbmVnYWdlOwotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5lZ2FnZSA9IGF4aXNDb25maWcuaXNFbmdhZ2VkKG1vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoZW5lZ2FnZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVuZWdhZ2UgPSBheGlzU2VydmljZUdyb3VwLmlzRW5nYWdlZChtb2R1bGUpOwotICAgICAgICAgICAgICAgIGlmIChlbmVnYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW5lZ2FnZSA9IGF4aXNTZXJ2aWNlLmlzRW5nYWdlZChtb2R1bGUpOwotICAgICAgICAgICAgICAgIGlmIChlbmVnYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmVnYWdlID0gYXhpc09wZXJhdGlvbi5pc0VuZ2FnZWQobW9kdWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5lZ2FnZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBlbnZlbG9wZSwgY2hlY2sgaWYgaXQgaXMgYSBzb2FwOkJvZHksIHdoaWNoIG1lYW5zIHRoZXJlIGlzIG5vIGhlYWRlci4KLSAgICAgKiBXZSBkbyB0aGlzIGJhc2ljYWxseSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgcGFyc2UgYW5kIGJ1aWxkIHRoZSBvbSB0cmVlIG9mIHRoZSB3aG9sZSBlbnZlbG9wZQotICAgICAqIGxvb2tpbmcgZm9yIHRoZSBzb2FwIGhlYWRlci4gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCB0aGVyZSBzdGlsbCBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcwotICAgICAqIGEgc29hcDpIZWFkZXIgcHJlc2VudCwgdXNlIGdldEhlYWRlcigpIGFuZCBhbHNvIGNoZWNrIGZvciBudWxsIG9uIGdldEhlYWRlcigpIHRvIGJlIGFic29sdXRlbHkgc3VyZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqIEBkZXByZWNhdGVkIFRoZSBib251cyB5b3UgdXNlZCB0byBnZXQgZnJvbSB0aGlzIGlzIG5vdyBidWlsdCBpbiB0byBTT0FQRW52ZWxvcGUuZ2V0SGVhZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRlclByZXNlbnQoKSB7Ci0gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gZW52ZWxvcGUgdGhlcmUgY2FuJ3QgYmUgYSBoZWFkZXIuCi0gICAgICAgIGlmICh0aGlzLmVudmVsb3BlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHRoaXMuZW52ZWxvcGUuZ2V0SGVhZGVyKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGluZyBvZiB0aGUgYXR0YWNobWVudHMgbWFwIHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgdGhlIHJlY2VpcHQgb2YgYQotICAgICAqIG1lc3NhZ2Ugb25seS4gVGhpcyBtZXRob2QgaXMgb25seSBtZWFudCB0byBiZSB1c2VkIGJ5IHRoZSBBeGlzMgotICAgICAqIGludGVybmFscy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhdHRhY2htZW50cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnRNYXAoQXR0YWNobWVudHMgYXR0YWNobWVudHMpIHsKLSAgICAgICAgdGhpcy5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFlvdSBjYW4gZGlyZWN0bHkgYWNjZXNzIHRoZSBhdHRhY2htZW50IG1hcCBvZiB0aGUgbWVzc2FnZSBjb250ZXh0IGZyb20KLSAgICAgKiBoZXJlLiBSZXR1cm5lZCBhdHRhY2htZW50IG1hcCBjYW4gYmUgZW1wdHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGF0dGFjaG1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0YWNobWVudHMgZ2V0QXR0YWNobWVudE1hcCgpIHsKLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dGFjaG1lbnRzID0gbmV3IEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXR0YWNobWVudCB0byB0aGUgYXR0YWNobWVudCBNYXAgb2YgdGhpcyBtZXNzYWdlIGNvbnRleHQuIFRoaXMKLSAgICAgKiBhdHRhY2htZW50IGdldHMgc2VyaWFsaXNlZCBhcyBhIE1JTUUgYXR0YWNobWVudCB3aGVuIHNlbmRpbmcgdGhlIG1lc3NhZ2UKLSAgICAgKiBpZiBTT0FQIHdpdGggQXR0YWNobWVudHMgaXMgZW5hYmxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50SUQgICA6Ci0gICAgICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdGhlIGNvbnRlbnQgSUQgb2YgdGhlIE1JTUUgcGFydCAod2l0aG91dCB0aGUgImNpZDoiIHByZWZpeCkKLSAgICAgKiBAcGFyYW0gZGF0YUhhbmRsZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRhY2htZW50KFN0cmluZyBjb250ZW50SUQsIERhdGFIYW5kbGVyIGRhdGFIYW5kbGVyKSB7Ci0gICAgICAgIGlmIChhdHRhY2htZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRhY2htZW50cyA9IG5ldyBBdHRhY2htZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIGF0dGFjaG1lbnRzLmFkZERhdGFIYW5kbGVyKGNvbnRlbnRJRCwgZGF0YUhhbmRsZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXR0YWNobWVudCB0byB0aGUgYXR0YWNobWVudCBNYXAgb2YgdGhpcyBtZXNzYWdlIGNvbnRleHQuIFRoaXMKLSAgICAgKiBhdHRhY2htZW50IGdldHMgc2VyaWFsaXNlZCBhcyBhIE1JTUUgYXR0YWNobWVudCB3aGVuIHNlbmRpbmcgdGhlIG1lc3NhZ2UKLSAgICAgKiBpZiBTT0FQIHdpdGggQXR0YWNobWVudHMgaXMgZW5hYmxlZC4gQ29udGVudCBJRCBvZiB0aGUgTUlNRSBwYXJ0IHdpbGwgYmUKLSAgICAgKiBhdXRvIGdlbmVyYXRlZCBieSBBeGlzMi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhSGFuZGxlcgotICAgICAqIEByZXR1cm4gdGhlIGF1dG8gZ2VuZXJhdGVkIGNvbnRlbnQgSUQgb2YgdGhlIE1JTUUgYXR0YWNobWVudAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYWRkQXR0YWNobWVudChEYXRhSGFuZGxlciBkYXRhSGFuZGxlcikgewotICAgICAgICBTdHJpbmcgY29udGVudElEID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIGFkZEF0dGFjaG1lbnQoY29udGVudElELCBkYXRhSGFuZGxlcik7Ci0gICAgICAgIHJldHVybiBjb250ZW50SUQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWNjZXNzIHRoZSBEYXRhSGFuZGxlciBvZiB0aGUgYXR0YWNobWVudCBjb250YWluZWQgaW4gdGhlIG1hcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotICAgICAqIGNvbnRlbnQgSUQuIFJldHVybnMgIk5VTEwiIGlmIGEgYXR0YWNobWVudCBjYW5ub3QgYmUgZm91bmQgYnkgdGhlIGdpdmVuIGNvbnRlbnQgSUQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudElEIDoKLSAgICAgKiAgICAgICAgICAgICAgICAgIENvbnRlbnQgSUQgb2YgdGhlIE1JTUUgYXR0YWNobWVudCAod2l0aG91dCB0aGUgImNpZDoiIHByZWZpeCkKLSAgICAgKiBAcmV0dXJuIERhdGEgaGFuZGxlciBvZiB0aGUgYXR0YWNobWVudAotICAgICAqLwotICAgIHB1YmxpYyBEYXRhSGFuZGxlciBnZXRBdHRhY2htZW50KFN0cmluZyBjb250ZW50SUQpIHsKLSAgICAgICAgaWYgKGF0dGFjaG1lbnRzID09IG51bGwpIHsKLSAgICAgICAgICAgIGF0dGFjaG1lbnRzID0gbmV3IEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzLmdldERhdGFIYW5kbGVyKGNvbnRlbnRJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgYXR0YWNobWVudCB3aXRoIHRoZSBnaXZlbiBjb250ZW50IElEIGZyb20gdGhlIEF0dGFjaG1lbnRzIE1hcAotICAgICAqIERvIG5vdGhpbmcgaWYgYSBhdHRhY2htZW50IGNhbm5vdCBiZSBmb3VuZCBieSB0aGUgZ2l2ZW4gY29udGVudCBJRC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50SUQgb2YgdGhlIGF0dGFjaG1lbnQgKHdpdGhvdXQgdGhlICJjaWQ6IiBwcmVmaXgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0YWNobWVudChTdHJpbmcgY29udGVudElEKSB7Ci0gICAgICAgIGlmIChhdHRhY2htZW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdHRhY2htZW50cy5yZW1vdmVEYXRhSGFuZGxlcihjb250ZW50SUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBTZWxmTWFuYWdlZERhdGEgU2VjdGlvbgotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotCi0gICAgLyoKLSAgICAqIGNoYXJhY3RlciB0byBkZWxpbWl0IHN0cmluZ3MKLSAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlbGZNYW5hZ2VkRGF0YURlbGltaXRlciA9ICIqIjsKLQotCi0gICAgLyoqCi0gICAgICogU2V0IHVwIGEgdW5pcXVlIGtleSBpbiB0aGUgZm9ybSBvZgotICAgICAqIDxPTD4KLSAgICAgKiA8TEk+dGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBjbGFzcyB0aGF0IG93bnMgdGhlIGtleQotICAgICAqIDxMST5kZWxpbWl0b3IKLSAgICAgKiA8TEk+dGhlIGtleSBhcyBhIHN0cmluZwotICAgICAqIDxMST5kZWxpbWl0b3IKLSAgICAgKiA8TEk+dGhlIGtleSdzIGhhc2ggY29kZSBhcyBhIHN0cmluZwotICAgICAqIDwvT0w+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRoYXQgb3ducyB0aGUgc3VwcGxpZWQga2V5Ci0gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIGtleQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRlU2VsZk1hbmFnZWREYXRhS2V5KENsYXNzIGNsYXp6LCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiBjbGF6ei5nZXROYW1lKCkgKyBzZWxmTWFuYWdlZERhdGFEZWxpbWl0ZXIgKyBrZXkudG9TdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgc2VsZk1hbmFnZWREYXRhRGVsaW1pdGVyICsgSW50ZWdlci50b1N0cmluZyhrZXkuaGFzaENvZGUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgb2Ygc2VsZiBtYW5hZ2VkIGRhdGEgdG8gdGhlIHNldCBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiB0aGlzIG1lc3NhZ2UgY29udGV4dC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYWxsb3cgaGFuZGxlcnMgdG8gbWFuYWdlIHRoZWlyIG93bgotICAgICAqIG1lc3NhZ2Utc3BlY2lmaWMgZGF0YSB3aGVuIHRoZSBtZXNzYWdlIGNvbnRleHQgaXMgc2F2ZWQvcmVzdG9yZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIG9mIHRoZSBjYWxsZXIgdGhhdCBvd25zIHRoZSBrZXktdmFsdWUgcGFpcgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUga2V5IGZvciB0aGlzIGRhdGEgb2JqZWN0Ci0gICAgICogQHBhcmFtIHZhbHVlIFRoZSBkYXRhIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGZNYW5hZ2VkRGF0YShDbGFzcyBjbGF6eiwgT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChzZWxmTWFuYWdlZERhdGFNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc2VsZk1hbmFnZWREYXRhTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHVuaXF1ZSBrZXkgYW5kIGEgZGVsaW1pdGVyIHNvIHdlIGNhbgotICAgICAgICAvLyBnZXQgdGhlIGNsYXNzbmFtZSBhbmQgaGFzaGNvZGUgZm9yIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uCi0gICAgICAgIHNlbGZNYW5hZ2VkRGF0YU1hcC5wdXQoZ2VuZXJhdGVTZWxmTWFuYWdlZERhdGFLZXkoY2xhenosIGtleSksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBhIHZhbHVlIG9mIHNlbGYgbWFuYWdlZCBkYXRhIHByZXZpb3VzbHkgc2F2ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3Mgb2YgdGhlIGNhbGxlciB0aGF0IG93bnMgdGhlIGtleS12YWx1ZSBwYWlyCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgZm9yIHRoZSBkYXRhCi0gICAgICogQHJldHVybiBUaGUgZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIE5VTEwgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRTZWxmTWFuYWdlZERhdGEoQ2xhc3MgY2xhenosIE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKHNlbGZNYW5hZ2VkRGF0YU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZk1hbmFnZWREYXRhTWFwLmdldChnZW5lcmF0ZVNlbGZNYW5hZ2VkRGF0YUtleShjbGF6eiwga2V5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBrZXkgZm9yIHRoZSBzZWxmIG1hbmFnZWQgZGF0YSBpcyBhdmFpbGFibGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3Mgb2YgdGhlIGNhbGxlciB0aGF0IG93bnMgdGhlIGtleS12YWx1ZSBwYWlyCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgdG8gbG9vayBmb3IKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIGtleSBleGlzdHMsIEZBTFNFIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zU2VsZk1hbmFnZWREYXRhS2V5KENsYXNzIGNsYXp6LCBPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChzZWxmTWFuYWdlZERhdGFNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZWxmTWFuYWdlZERhdGFNYXAuY29udGFpbnNLZXkoZ2VuZXJhdGVTZWxmTWFuYWdlZERhdGFLZXkoY2xhenosIGtleSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcgb2YgdGhlIHNwZWNpZmllZCBrZXkgaWYgdGhlIHNwZWNpZmllZCBrZXkKLSAgICAgKiBoYXMgYmVlbiBzZXQgZm9yIHNlbGYgbWFuYWdlZCBkYXRhCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIG9mIHRoZSBjYWxsZXIgdGhhdCBvd25zIHRoZSBrZXktdmFsdWUgcGFpcgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUga2V5IG9mIHRoZSBvYmplY3QgdG8gYmUgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGZNYW5hZ2VkRGF0YShDbGFzcyBjbGF6eiwgT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoc2VsZk1hbmFnZWREYXRhTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGZNYW5hZ2VkRGF0YU1hcC5yZW1vdmUoZ2VuZXJhdGVTZWxmTWFuYWdlZERhdGFLZXkoY2xhenosIGtleSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmxhdHRlbiB0aGUgcGhhc2UgbGlzdCBpbnRvIGEgbGlzdCBvZiBqdXN0IHVuaXF1ZSBoYW5kbGVyIGluc3RhbmNlcwotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QgdGhlIGxpc3Qgb2YgaGFuZGxlcnMKLSAgICAgKiBAcGFyYW0gbWFwICB1c2VycyBzaG91bGQgcGFzcyBudWxsIGFzIHRoaXMgaXMganVzdCBhIGhvbGRlciBmb3IgdGhlIHJlY3Vyc2lvbgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHVuaWd1ZSBvYmplY3QgaW5zdGFuY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SGFuZGxlcj4gZmxhdHRlblBoYXNlTGlzdFRvSGFuZGxlcnMoQXJyYXlMaXN0PEhhbmRsZXI+IGxpc3QsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBIYW5kbGVyPiBtYXApIHsKLQotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgSGFuZGxlcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yPEhhbmRsZXI+IGl0ID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaXQubmV4dCgpOwotCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIkAiICsgaGFuZGxlci5oYXNoQ29kZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGl0cyBoYW5kbGVycyB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgIGZsYXR0ZW5IYW5kbGVyTGlzdCgoKFBoYXNlKSBoYW5kbGVyKS5nZXRIYW5kbGVycygpLCBtYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2FtZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdCwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIGl0IHdvbid0IGJlIGluIHRoZSBsaXN0IG11bHRpcGxlIHRpbWVzCi0gICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIGhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXQyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBpdDIubmV4dCgpOwotICAgICAgICAgICAgICAgIEhhbmRsZXIgdmFsdWUgPSAoSGFuZGxlcikgbWFwLmdldChrZXkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdmFsdWUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgIjpmbGF0dGVuUGhhc2VMaXN0VG9IYW5kbGVycygpOiAga2V5IFsiICsga2V5ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJdICAgIGhhbmRsZXIgbmFtZSBbIiArIG5hbWUgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxIYW5kbGVyPihtYXAudmFsdWVzKCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmxhdHRlbiB0aGUgaGFuZGxlciBsaXN0IGludG8ganVzdCB1bmlxdWUgaGFuZGxlciBpbnN0YW5jZXMKLSAgICAgKiBpbmNsdWRpbmcgcGhhc2UgaW5zdGFuY2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QgdGhlIGxpc3Qgb2YgaGFuZGxlcnMvcGhhc2VzCi0gICAgICogQHBhcmFtIG1hcCAgdXNlcnMgc2hvdWxkIHBhc3MgbnVsbCBhcyB0aGlzIGlzIGp1c3QgYSBob2xkZXIgZm9yIHRoZSByZWN1cnNpb24KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB1bmlndWUgb2JqZWN0IGluc3RhbmNlcwotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEhhbmRsZXI+IGZsYXR0ZW5IYW5kbGVyTGlzdChMaXN0PEhhbmRsZXI+IGxpc3QsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBIYW5kbGVyPiBtYXApIHsKLQotICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgSGFuZGxlcj4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yPEhhbmRsZXI+IGl0ID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaXQubmV4dCgpOwotCi0gICAgICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIkAiICsgaGFuZGxlci5oYXNoQ29kZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlciBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgLy8gcHV0IHRoZSBwaGFzZSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCBoYW5kbGVyKTsKLQotICAgICAgICAgICAgICAgIC8vIGFkZCBpdHMgaGFuZGxlcnMgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBmbGF0dGVuSGFuZGxlckxpc3QoKChQaGFzZSkgaGFuZGxlcikuZ2V0SGFuZGxlcnMoKSwgbWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNhbWUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhlIGxpc3QsCi0gICAgICAgICAgICAgICAgLy8gdGhlbiBpdCB3b24ndCBiZSBpbiB0aGUgbGlzdCBtdWx0aXBsZSB0aW1lcwotICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCBoYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KG1hcC52YWx1ZXMoKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDYWxscyB0aGUgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgbWV0aG9kIG9mIGVhY2ggaGFuZGxlciB0aGF0Ci0gICAgICogaW1wbGVtZW50cyB0aGUgPGJvbGQ+U2VsZk1hbmFnZWREYXRhTWFuYWdlcjwvYm9sZD4gaW50ZXJmYWNlLgotICAgICAqIEhhbmRsZXJzIGZvciB0aGlzIG1lc3NhZ2UgY29udGV4dCBhcmUgaWRlbnRpZmllZCB2aWEgdGhlCi0gICAgICogZXhlY3V0aW9uQ2hhaW4gbGlzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgVGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKE9iamVjdE91dHB1dCBvdXQpIHsKLSAgICAgICAgc2VsZk1hbmFnZWREYXRhSGFuZGxlckNvdW50ID0gMDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKChzZWxmTWFuYWdlZERhdGFNYXAgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgfHwgKGV4ZWN1dGlvbkNoYWluID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHx8IChzZWxmTWFuYWdlZERhdGFNYXAuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHx8IChleGVjdXRpb25DaGFpbi5zaXplKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEV4dGVybmFsaXplQ29uc3RhbnRzLkVNUFRZX09CSkVDVCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArICI6c2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCk6IE5vIGRhdGEgOiBFTkQiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxldCdzIGNyZWF0ZSBhIHRlbXBvcmFyeSBsaXN0IHdpdGggdGhlIGhhbmRsZXJzCi0gICAgICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gZmxhdEV4ZWNDaGFpbiA9IGZsYXR0ZW5QaGFzZUxpc3RUb0hhbmRsZXJzKGV4ZWN1dGlvbkNoYWluLCBudWxsKTsKLQotICAgICAgICAgICAgLy9BcnJheUxpc3Qgc2VsZk1hbmFnZWREYXRhSG9sZGVyTGlzdCA9IHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YUhlbHBlcihmbGF0RXhlY0NoYWluLml0ZXJhdG9yKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U2VsZk1hbmFnZWREYXRhSG9sZGVyPiBzZWxmTWFuYWdlZERhdGFIb2xkZXJMaXN0ID0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhSGVscGVyKGZsYXRFeGVjQ2hhaW4pOwotCi0gICAgICAgICAgICBpZiAoc2VsZk1hbmFnZWREYXRhSG9sZGVyTGlzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRXh0ZXJuYWxpemVDb25zdGFudHMuRU1QVFlfT0JKRUNUKTsKLQotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgIjpzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKTogTm8gZGF0YSA6IEVORCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5BQ1RJVkVfT0JKRUNUKTsKLQotICAgICAgICAgICAgLy8gU2VsZk1hbmFnZWREYXRhIGNhbiBiZSBiaW5hcnkgc28gd29uJ3QgYmUgYWJsZSB0byB0cmVhdCBpdCBhcyBhCi0gICAgICAgICAgICAvLyBzdHJpbmcgLSBuZWVkIHRvIHRyZWF0IGl0IGFzIGEgYnl0ZSBbXQotCi0gICAgICAgICAgICAvLyBob3cgbWFueSBoYW5kbGVycyBhY3R1YWxseQotICAgICAgICAgICAgLy8gcmV0dXJuZWQgc2VyaWFsaXplZCBTZWxmTWFuYWdlZERhdGEKLSAgICAgICAgICAgIG91dC53cml0ZUludChzZWxmTWFuYWdlZERhdGFIb2xkZXJMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZk1hbmFnZWREYXRhSG9sZGVyTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChzZWxmTWFuYWdlZERhdGFIb2xkZXJMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk1lc3NhZ2VDb250ZXh0OnNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpOiBFeGNlcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIGRlc2NyaXB0aW9uIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGhlbHBlciBtZXRob2QgdG8gZG8gdGhlIHJlY3Vyc2lvbiBmb3Igc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVycwotICAgICAqIEByZXR1cm4gQXJyYXlMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8U2VsZk1hbmFnZWREYXRhSG9sZGVyPiBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGFIZWxwZXIoQXJyYXlMaXN0PEhhbmRsZXI+IGhhbmRsZXJzKSB7Ci0gICAgICAgIEFycmF5TGlzdDxTZWxmTWFuYWdlZERhdGFIb2xkZXI+IHNlbGZNYW5hZ2VkRGF0YUhvbGRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlbGZNYW5hZ2VkRGF0YUhvbGRlcj4oKTsKLSAgICAgICAgSXRlcmF0b3I8SGFuZGxlcj4gaXQgPSBoYW5kbGVycy5pdGVyYXRvcigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBQaGFzZSkKLSAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAvLyAgICBzZWxmTWFuYWdlZERhdGFIb2xkZXJMaXN0ID0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhSGVscGVyKCgoUGhhc2UpaGFuZGxlcikuZ2V0SGFuZGxlcnMoKS5pdGVyYXRvcigpLCBzZWxmTWFuYWdlZERhdGFIb2xkZXJMaXN0KTsKLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAvL2Vsc2UgaWYgKFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShoYW5kbGVyLmdldENsYXNzKCkpKQotICAgICAgICAgICAgICAgIGlmIChTZWxmTWFuYWdlZERhdGFNYW5hZ2VyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaGFuZGxlci5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNhbGwgdGhlIGhhbmRsZXIncyBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgaWYgaXQgaW1wbGVtZW50cyBTZWxmTWFuYWdlZERhdGFNYW5hZ2VyCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0OnNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YUhlbHBlcigpOiBjYWxsaW5nIGhhbmRsZXIgIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIG5hbWUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZ2V0TmFtZSgpICsgIl0gICBzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgbWV0aG9kIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvc19mcm9tSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTZWxmTWFuYWdlZERhdGFNYW5hZ2VyKSBoYW5kbGVyKS5zZXJpYWxpemVTZWxmTWFuYWdlZERhdGEodGhpcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJhb3NfZnJvbUhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmFvc19mcm9tSGFuZGxlci5jbG9zZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGZNYW5hZ2VkRGF0YUhvbGRlciBzZWxmTWFuYWdlZERhdGFIb2xkZXIgPSBuZXcgU2VsZk1hbmFnZWREYXRhSG9sZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgaGFuZGxlci5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW9zX2Zyb21IYW5kbGVyLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZNYW5hZ2VkRGF0YUhvbGRlckxpc3QuYWRkKHNlbGZNYW5hZ2VkRGF0YUhvbGRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZk1hbmFnZWREYXRhSGFuZGxlckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiTWVzc2FnZUNvbnRleHQ6c2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCk6IGV4Y2VwdGlvbiBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXVsiICsgZXhjLmdldE1lc3NhZ2UoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgaW4gc2V0dGluZyB1cCBTZWxmTWFuYWdlZERhdGFIb2xkZXIgb2JqZWN0IGZvciBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiAvICIgKyBoYW5kbGVyLmdldE5hbWUoKSArICJdICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2VsZk1hbmFnZWREYXRhSG9sZGVyTGlzdDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiTWVzc2FnZUNvbnRleHQ6c2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCk6IGV4Y2VwdGlvbiBbIiArCi0gICAgICAgICAgICAgICAgICAgIGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl1bIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIER1cmluZyBkZXNlcmlhbGl6YXRpb24sIHRoZSBleGVjdXRpb25DaGFpbiB3aWxsIGJlCi0gICAgICogcmUtY29uc3RpdHV0ZWQgYmVmb3JlIHRoZSBTZWxmTWFuYWdlZERhdGEgaXMgcmVzdG9yZWQuCi0gICAgICogVGhpcyBtZWFucyB0aGUgaGFuZGxlciBpbnN0YW5jZXMgYXJlIGFscmVhZHkgYXZhaWxhYmxlLgotICAgICAqIFRoaXMgbWV0aG9kIGxldHMgdXMgZmluZCB0aGUgaGFuZGxlciBpbnN0YW5jZSBmcm9tIHRoZQotICAgICAqIGV4ZWN1dGlvbkNoYWluIHNvIHdlIGNhbiBjYWxsIGVhY2ggb25lJ3MKLSAgICAgKiBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXQgICAgICAgICAgICBUaGUgaXRlcmF0b3IgZnJvbSB0aGUgZXhlY3V0aW9uQ2hhaW4gb2JqZWN0Ci0gICAgICogQHBhcmFtIGNsYXNzbmFtZSAgICAgVGhlIGNsYXNzIG5hbWUKLSAgICAgKiBAcGFyYW0gcU5hbWVBc1N0cmluZyBUaGUgUU5hbWUgaW4gc3RyaW5nIGZvcm0KLSAgICAgKiBAcmV0dXJuIFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIgaGFuZGxlcgotICAgICAqLwotICAgIHByaXZhdGUgU2VsZk1hbmFnZWREYXRhTWFuYWdlciBkZXNlcmlhbGl6ZV9nZXRIYW5kbGVyRnJvbUV4ZWN1dGlvbkNoYWluKEl0ZXJhdG9yPEhhbmRsZXI+IGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lQXNTdHJpbmcpIHsKLSAgICAgICAgU2VsZk1hbmFnZWREYXRhTWFuYWdlciBoYW5kbGVyX3RvcmV0dXJuID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKChpdC5oYXNOZXh0KCkpICYmIChoYW5kbGVyX3RvcmV0dXJuID09IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGl0Lm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgUGhhc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl90b3JldHVybiA9IGRlc2VyaWFsaXplX2dldEhhbmRsZXJGcm9tRXhlY3V0aW9uQ2hhaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQaGFzZSkgaGFuZGxlcikuZ2V0SGFuZGxlcnMoKS5pdGVyYXRvcigpLCBjbGFzc25hbWUsIHFOYW1lQXNTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGNsYXNzbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoaGFuZGxlci5nZXROYW1lKCkuZXF1YWxzKHFOYW1lQXNTdHJpbmcpKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX3RvcmV0dXJuID0gKFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIpIGhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJfdG9yZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBEb2Vzbid0IHNlZW0gbGlrZWx5IHRvIGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZS4uLgotICAgICAgICAgICAgLy8gQSBoYW5kbGVyIGNsYXNzbmFtZSBpbiB0aGUgZXhlY3V0aW9uQ2hhaW4gbWF0Y2hlZCB1cCB3aXRoIG91ciBwYXJhbWV0ZXIKLSAgICAgICAgICAgIC8vIGNsYXNzbmFtZSwgYnV0IHRoZSBleGlzdGluZyBjbGFzcyBpbiB0aGUgZXhlY3V0aW9uQ2hhaW4gaXMgYSBkaWZmZXJlbnQKLSAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIHRoYW4gdGhlIG9uZSB3ZSBzYXZlZCBkdXJpbmcgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhLgotICAgICAgICAgICAgLy8gTk9URTogdGhlIGV4Y2VwdGlvbiBnZXRzIGFic29yYmVkIQotCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VDb250ZXh0OmRlc2VyaWFsaXplX2dldEhhbmRsZXJGcm9tRXhlY3V0aW9uQ2hhaW4oKTogQ2xhc3NDYXN0RXhjZXB0aW9uIHRocm93bjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgKiBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHRoZSBoYW5kbGVycwotICAgICogc2luY2UgdGhlIGV4ZWN1dGlvbkNoYWluIGlzIHJlYnVpbHQgYWZ0ZXIgcmVhZEV4dGVybmFsKCkuCi0gICAgKiBXZSBqdXN0IGhhdmUgdG8gZmluZCB0aGVtIGluIHRoZSBleGVjdXRpb25DaGFpbiBhbmQKLSAgICAqIGNhbGwgZWFjaCBoYW5kbGVyJ3MgZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgbWV0aG9kLgotICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAoc2VsZk1hbmFnZWREYXRhTGlzdEhvbGRlciAhPSBudWxsKSAmJiAoaSA8IHNlbGZNYW5hZ2VkRGF0YUxpc3RIb2xkZXIuc2l6ZSgpKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNlbGZNYW5hZ2VkRGF0YUhvbGRlciBzZWxmTWFuYWdlZERhdGFIb2xkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKFNlbGZNYW5hZ2VkRGF0YUhvbGRlcikgc2VsZk1hbmFnZWREYXRhTGlzdEhvbGRlci5nZXQoaSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gc2VsZk1hbmFnZWREYXRhSG9sZGVyLmdldENsYXNzbmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZUFzU3RyaW5nID0gc2VsZk1hbmFnZWREYXRhSG9sZGVyLmdldElkKCk7Ci0KLSAgICAgICAgICAgICAgICBTZWxmTWFuYWdlZERhdGFNYW5hZ2VyIGhhbmRsZXIgPSBkZXNlcmlhbGl6ZV9nZXRIYW5kbGVyRnJvbUV4ZWN1dGlvbkNoYWluKAotICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ2hhaW4uaXRlcmF0b3IoKSwgY2xhc3NuYW1lLCBxTmFtZUFzU3RyaW5nKTsKLQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgIjpkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpOiAgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSAgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZXhlY3V0aW9uQ2hhaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIGNvbnRleHQuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBjbGFzcyBbIiArIGNsYXNzbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gd2FzIG5vdCBmb3VuZCBpbiB0aGUgZXhlY3V0aW9uQ2hhaW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIGNvbnRleHQuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaGFuZGxlckRhdGEgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlbGZNYW5hZ2VkRGF0YUhvbGRlci5nZXREYXRhKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gdGhlIGhhbmRsZXIgaW1wbGVtZW50aW5nIFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlcG9wdWxhdGluZwotICAgICAgICAgICAgICAgIC8vIHRoZSBTZWxmTWFuYWdlZERhdGEgaW4gdGhlIE1lc3NhZ2VDb250ZXh0ICh0aGlzKQotCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6ZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEoKTogY2FsbGluZyBoYW5kbGVyIFsiICsgY2xhc3NuYW1lICsgIl0gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lQXNTdHJpbmcgKyAiXSAgZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgbWV0aG9kIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaGFuZGxlci5kZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShoYW5kbGVyRGF0YSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5yZXN0b3JlVHJhbnNpZW50RGF0YSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgIjpkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpOiBJT0V4Y2VwdGlvbiB0aHJvd246ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgaW9lLmdldE1lc3NhZ2UoKSwgaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIE1lc3NhZ2VDb250ZXh0IGluc3RhbmNlLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUcmFuc2llbnQgZmllbGRzIGFuZCBzdGF0aWMgZmllbGRzIGFyZSBub3Qgc2F2ZWQuCi0gICAgICogQWxzbywgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCAic3RhdGljIiBkYXRhIGFyZQotICAgICAqIG5vdCBzYXZlZCwgZXhjZXB0IGZvciBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYmUKLSAgICAgKiBhYmxlIHRvIGZpbmQgbWF0Y2hpbmcgb2JqZWN0cyB3aGVuIHRoZSBtZXNzYWdlCi0gICAgICogY29udGV4dCBpcyByZS1jb25zdGl0dXRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBnZXRMb2dJRFN0cmluZygpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArICI6d3JpdGVFeHRlcm5hbCgpOiB3cml0aW5nIHRvIG91dHB1dCBzdHJlYW0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZQotICAgICAgICAvLyBjb250ZXh0IGRlZmluaXRpb24sIGJlIHN1cmUgdG8gbWFpbnRhaW4gdGhlCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlTG9uZyhzZXJpYWxWZXJzaW9uVUlEKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gdGhlIHR5cGUgb2YgZXhlY3V0aW9uIGZsb3cgZm9yIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgb3V0LndyaXRlSW50KEZMT1cpOwotCi0gICAgICAgIC8vIHZhcmlvdXMgZmxhZ3MKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihwcm9jZXNzaW5nRmF1bHQpOwotICAgICAgICBvdXQud3JpdGVCb29sZWFuKHBhdXNlZCk7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4ob3V0cHV0V3JpdHRlbik7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4obmV3VGhyZWFkUmVxdWlyZWQpOwotICAgICAgICBvdXQud3JpdGVCb29sZWFuKGlzU09BUDExKTsKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihkb2luZ1JFU1QpOwotICAgICAgICBvdXQud3JpdGVCb29sZWFuKGRvaW5nTVRPTSk7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4oZG9pbmdTd0EpOwotICAgICAgICBvdXQud3JpdGVCb29sZWFuKHJlc3BvbnNlV3JpdHRlbik7Ci0gICAgICAgIG91dC53cml0ZUJvb2xlYW4oc2VydmVyU2lkZSk7Ci0KLSAgICAgICAgb3V0LndyaXRlTG9uZyhnZXRMYXN0VG91Y2hlZFRpbWUoKSk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChnZXRMb2dDb3JyZWxhdGlvbklEKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBPTU91dHB1dEZvcm1hdCBmb3IgTWVzc2FnZSBFeHRlcm5hbGl6YXRpb24KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAKLSAgICAgICAgT01PdXRwdXRGb3JtYXQgb3V0cHV0Rm9ybWF0PSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgb3V0cHV0Rm9ybWF0LnNldFNPQVAxMShpc1NPQVAxMSk7Ci0gICAgICAgIGJvb2xlYW4gcGVyc2lzdE9wdGltaXplZCA9IGdldFBlcnNpc3RPcHRpbWl6ZWQoKTsKLSAgICAgICAgaWYgKHBlcnNpc3RPcHRpbWl6ZWQpIHsKLSAgICAgICAgICAgIG91dHB1dEZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjaGFyU2V0RW5jID0gKFN0cmluZykgZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgIGlmIChjaGFyU2V0RW5jID09IG51bGwpIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0ID0gZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG9wQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2hhclNldEVuYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBvcENvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgY2hhclNldEVuYyA9IE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0Rm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhjaGFyU2V0RW5jKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEV4dGVybmFsaXplIHRoZSBNZXNzYWdlCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgTWVzc2FnZUV4dGVybmFsaXplVXRpbHMud3JpdGVFeHRlcm5hbChvdXQsIHRoaXMsIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcsIG91dHB1dEZvcm1hdCk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEFycmF5TGlzdCBleGVjdXRpb25DaGFpbgotICAgICAgICAvLyAgICAgaGFuZGxlciBhbmQgcGhhc2UgcmVsYXRlZCBkYXRhCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIFRoZSBzdHJhdGVneSBpcyB0byBzYXZlIHNvbWUgbWV0YWRhdGEgYWJvdXQgZWFjaAotICAgICAgICAvLyBtZW1iZXIgb2YgdGhlIGxpc3QgYW5kIHRoZSBvcmRlciBvZiB0aGUgbGlzdC4KLSAgICAgICAgLy8gVGhlbiB3aGVuIHRoZSBtZXNzYWdlIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQsCi0gICAgICAgIC8vIHRyeSB0byBtYXRjaCB1cCB3aXRoIHBoYXNlcyBhbmQgaGFuZGxlcnMgb24gdGhlCi0gICAgICAgIC8vIGVuZ2luZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm9uLW51bGwgbGlzdDoKLSAgICAgICAgLy8gICAgVVRGICAgICAgICAgIC0gZGVzY3JpcHRpb24gc3RyaW5nCi0gICAgICAgIC8vICAgIGJvb2xlYW4gICAgICAtIGFjdGl2ZSBmbGFnCi0gICAgICAgIC8vICAgIGludCAgICAgICAgICAtIGN1cnJlbnQgaGFuZGxlciBpbmRleAotICAgICAgICAvLyAgICBpbnQgICAgICAgICAgLSBjdXJyZW50IHBoYXNlIGluZGV4Ci0gICAgICAgIC8vICAgIGludCAgICAgICAgICAtIGV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsaXN0Ci0gICAgICAgIC8vICAgIG9iamVjdHMgICAgICAtIE1ldGFEYXRhRW50cnkgb2JqZWN0IHBlciBsaXN0IGVudHJ5Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBlbnRyeSB3aWxsIGJlIGVtcHR5IE1ldGFEYXRhRW50cnkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE1ldGFEYXRhRW50cnkuTEFTVF9FTlRSWSBtYXJrZXIKLSAgICAgICAgLy8gICAgaW50ICAgICAgICAgIC0gYWRqdXN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyB0aGUgbGFzdCBlbXB0eSBlbnRyeQotICAgICAgICAvLwotICAgICAgICAvLyBFbXB0eSBsaXN0OgotICAgICAgICAvLyAgICBVVEYgICAgICAgICAgLSBkZXNjcmlwdGlvbiBzdHJpbmcKLSAgICAgICAgLy8gICAgYm9vbGVhbiAgICAgIC0gZW1wdHkgZmxhZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVVVEYoImV4ZWN1dGlvbkNoYWluIik7Ci0gICAgICAgIGlmIChleGVjdXRpb25DaGFpbiAhPSBudWxsICYmIGV4ZWN1dGlvbkNoYWluLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIHN0YXJ0IHdyaXRpbmcgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5BQ1RJVkVfT0JKRUNUKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChjdXJyZW50SGFuZGxlckluZGV4KTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChjdXJyZW50UGhhc2VJbmRleCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQoZXhlY3V0aW9uQ2hhaW4uc2l6ZSgpKTsKLQotICAgICAgICAgICAgLy8gcHV0IHRoZSBtZXRhZGF0YSBvbiBlYWNoIG1lbWJlciBvZiB0aGUgbGlzdCBpbnRvIGEgYnVmZmVyCi0KLSAgICAgICAgICAgIC8vIG1hdGNoIHRoZSBjdXJyZW50IGluZGV4IHdpdGggdGhlIGFjdHVhbCBzYXZlZCBsaXN0Ci0gICAgICAgICAgICBpbnQgbmV4dEluZGV4ID0gMDsKLQotICAgICAgICAgICAgSXRlcmF0b3I8SGFuZGxlcj4gaSA9IGV4ZWN1dGlvbkNoYWluLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb2JqQ2xhc3MgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgLy8gc3RhcnQgdGhlIG1ldGEgZGF0YSBlbnRyeSBmb3IgdGhpcyBvYmplY3QKLSAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1kRW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOwotICAgICAgICAgICAgICAgIG1kRW50cnkuc2V0Q2xhc3NOYW1lKG9iakNsYXNzKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY29ycmVjdCBvYmplY3Qtc3BlY2lmaWMgbmFtZQotICAgICAgICAgICAgICAgIFN0cmluZyBxbmFtZUFzU3RyaW5nOwotCi0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlT2JqID0gKFBoYXNlKSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIHFuYW1lQXNTdHJpbmcgPSBwaGFzZU9iai5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBsaXN0IG9mIGhhbmRsZXJzIHRvIHRoZSBtZXRhIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgc2V0dXBQaGFzZUxpc3QocGhhc2VPYmosIG1kRW50cnkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXJPYmogPSAoSGFuZGxlcikgb2JqOwotICAgICAgICAgICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gaGFuZGxlck9iai5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2lsbCB0aGVyZSBiZSBhbnkgb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBpbiB0aGUgZXhlY3V0aW9uIENoYWluPwotICAgICAgICAgICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gIk5VTEwiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1kRW50cnkuc2V0UU5hbWUocW5hbWVBc1N0cmluZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGluZGV4IGZvciB0aGUgZW50cnkgaW4gdGhlIGNoYWluCi0KLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjp3cml0ZUV4dGVybmFsKCk6ICoqKkJFRk9SRSBPQkogV1JJVEUqKiogZXhlY3V0aW9uQ2hhaW4gZW50cnkgY2xhc3MgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakNsYXNzICsgIl0gcW5hbWUgWyIgKyBxbmFtZUFzU3RyaW5nICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QobWRFbnRyeSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGluZGV4IHNvIHRoYXQgdGhlIGluZGV4Ci0gICAgICAgICAgICAgICAgLy8gbm93IGluZGljYXRlcyB0aGUgbmV4dCBlbnRyeSB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBhdHRlbXB0ZWQKLSAgICAgICAgICAgICAgICBuZXh0SW5kZXgrKzsKLQotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOndyaXRlRXh0ZXJuYWwoKTogKioqQUZURVIgT0JKIFdSSVRFKioqIGV4ZWN1dGlvbkNoYWluIGVudHJ5IGNsYXNzIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpDbGFzcyArICJdIHFuYW1lIFsiICsgcW5hbWVBc1N0cmluZyArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8vIGVuZCB3aGlsZSBlbnRyaWVzIGluIGV4ZWN1dGlvbiBjaGFpbgotCi0gICAgICAgICAgICAvLyBkb25lIHdpdGggdGhlIGVudHJpZXMgaW4gdGhlIGV4ZWN1dGlvbiBjaGFpbgotICAgICAgICAgICAgLy8gYWRkIHRoZSBlbmQtb2YtbGlzdCBtYXJrZXIKLSAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbGFzdEVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLSAgICAgICAgICAgIGxhc3RFbnRyeS5zZXRDbGFzc05hbWUoTWV0YURhdGFFbnRyeS5FTkRfT0ZfTElTVCk7Ci0KLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChsYXN0RW50cnkpOwotICAgICAgICAgICAgbmV4dEluZGV4Kys7Ci0KLSAgICAgICAgICAgIC8vIG5leHRJbmRleCBhbHNvIGdpdmVzIHVzIHRoZSBudW1iZXIgb2YgZW50cmllcwotICAgICAgICAgICAgLy8gdGhhdCB3ZXJlIGFjdHVhbGx5IHNhdmVkIGFzIG9wcG9zZWQgdG8gdGhlCi0gICAgICAgICAgICAvLyBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZXhlY3V0aW9uQ2hhaW4KLSAgICAgICAgICAgIG91dC53cml0ZUludChuZXh0SW5kZXgpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBnZW5lcmFsIGNhc2U6IGhhbmRsZSAibnVsbCIgb3IgImVtcHR5IgotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5FTVBUWV9PQkpFQ1QpOwotCi0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgIjp3cml0ZUV4dGVybmFsKCk6IGV4ZWN1dGlvbkNoYWluIGlzIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIExpbmtlZExpc3QgZXhlY3V0ZWRQaGFzZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gVGhlIHN0cmF0ZWd5IGlzIHRvIHNhdmUgc29tZSBtZXRhZGF0YSBhYm91dCBlYWNoCi0gICAgICAgIC8vIG1lbWJlciBvZiB0aGUgbGlzdCBhbmQgdGhlIG9yZGVyIG9mIHRoZSBsaXN0LgotICAgICAgICAvLyBUaGVuIHdoZW4gdGhlIG1lc3NhZ2UgY29udGV4dCBpcyByZS1jb25zdGl0dXRlZCwKLSAgICAgICAgLy8gdHJ5IHRvIG1hdGNoIHVwIHdpdGggcGhhc2VzIGFuZCBoYW5kbGVycyBvbiB0aGUKLSAgICAgICAgLy8gZW5naW5lLgotICAgICAgICAvLwotICAgICAgICAvLyBOb24tbnVsbCBsaXN0OgotICAgICAgICAvLyAgICBVVEYgICAgICAgICAgLSBkZXNjcmlwdGlvbiBzdHJpbmcKLSAgICAgICAgLy8gICAgYm9vbGVhbiAgICAgIC0gYWN0aXZlIGZsYWcKLSAgICAgICAgLy8gICAgaW50ICAgICAgICAgIC0gZXhwZWN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QKLSAgICAgICAgLy8gICAgb2JqZWN0cyAgICAgIC0gTWV0YURhdGFFbnRyeSBvYmplY3QgcGVyIGxpc3QgZW50cnkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBsYXN0IGVudHJ5IHdpbGwgYmUgZW1wdHkgTWV0YURhdGFFbnRyeQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggTWV0YURhdGFFbnRyeS5MQVNUX0VOVFJZIG1hcmtlcgotICAgICAgICAvLyAgICBpbnQgICAgICAgICAgLSBhZGp1c3RlZCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGlzdAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHRoZSBsYXN0IGVtcHR5IGVudHJ5Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIEVtcHR5IGxpc3Q6Ci0gICAgICAgIC8vICAgIFVURiAgICAgICAgICAtIGRlc2NyaXB0aW9uIHN0cmluZwotICAgICAgICAvLyAgICBib29sZWFuICAgICAgLSBlbXB0eSBmbGFnCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZVVURigiZXhlY3V0ZWRQaGFzZXMiKTsKLSAgICAgICAgaWYgKGV4ZWN1dGVkUGhhc2VzICE9IG51bGwgJiYgZXhlY3V0ZWRQaGFzZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAKLSAgICAgICAgICAgIC8vIHN0YXJ0IHdyaXRpbmcgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5BQ1RJVkVfT0JKRUNUKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChleGVjdXRlZFBoYXNlcy5zaXplKCkpOwotCi0gICAgICAgICAgICAvLyBwdXQgdGhlIG1ldGFkYXRhIG9uIGVhY2ggbWVtYmVyIG9mIHRoZSBsaXN0IGludG8gYSBidWZmZXIKLQotICAgICAgICAgICAgaW50IGV4ZWNOZXh0SW5kZXggPSAwOwotCi0gICAgICAgICAgICBJdGVyYXRvcjxIYW5kbGVyPiBpdGVyYXRvciA9IGV4ZWN1dGVkUGhhc2VzLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvYmpDbGFzcyA9IG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgbWV0YSBkYXRhIGVudHJ5IGZvciB0aGlzIG9iamVjdAotICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgbWRFbnRyeSA9IG5ldyBNZXRhRGF0YUVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgbWRFbnRyeS5zZXRDbGFzc05hbWUob2JqQ2xhc3MpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjb3JyZWN0IG9iamVjdC1zcGVjaWZpYyBuYW1lCi0gICAgICAgICAgICAgICAgU3RyaW5nIHFuYW1lQXNTdHJpbmc7Ci0KLSAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGhhc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgUGhhc2UgaW5QaGFzZU9iaiA9IChQaGFzZSkgb2JqOwotICAgICAgICAgICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gaW5QaGFzZU9iai5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBsaXN0IG9mIGhhbmRsZXJzIHRvIHRoZSBtZXRhIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgc2V0dXBQaGFzZUxpc3QoaW5QaGFzZU9iaiwgbWRFbnRyeSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBIYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaW5IYW5kbGVyT2JqID0gKEhhbmRsZXIpIG9iajsKLSAgICAgICAgICAgICAgICAgICAgcW5hbWVBc1N0cmluZyA9IGluSGFuZGxlck9iai5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2lsbCB0aGVyZSBiZSBhbnkgb3RoZXIga2luZHMgb2Ygb2JqZWN0cyBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gIk5VTEwiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1kRW50cnkuc2V0UU5hbWUocW5hbWVBc1N0cmluZyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjp3cml0ZUV4dGVybmFsKCk6ICoqKkJFRk9SRSBFeGVjdXRlZCBMaXN0IE9CSiBXUklURSoqKiBleGVjdXRlZFBoYXNlcyBlbnRyeSBjbGFzcyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqQ2xhc3MgKyAiXSBxbmFtZSBbIiArIHFuYW1lQXNTdHJpbmcgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChtZEVudHJ5KTsKLQotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW5kZXggc28gdGhhdCB0aGUgaW5kZXgKLSAgICAgICAgICAgICAgICAvLyBub3cgaW5kaWNhdGVzIHRoZSBuZXh0IGVudHJ5IHRoYXQKLSAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGF0dGVtcHRlZAotICAgICAgICAgICAgICAgIGV4ZWNOZXh0SW5kZXgrKzsKLQotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgIjp3cml0ZUV4dGVybmFsKCk6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqKipBRlRFUiBFeGVjdXRlZCBMaXN0IE9CSiBXUklURSoqKiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhlY3V0ZWRQaGFzZXMgZW50cnkgY2xhc3MgWyIgKyBvYmpDbGFzcyArICJdICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxbmFtZSBbIiArIHFuYW1lQXNTdHJpbmcgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlIGVudHJpZXMgaW4gZXhlY3V0aW9uIGNoYWluCi0KLSAgICAgICAgICAgIC8vIGRvbmUgd2l0aCB0aGUgZW50cmllcyBpbiB0aGUgZXhlY3V0aW9uIGNoYWluCi0gICAgICAgICAgICAvLyBhZGQgdGhlIGVuZC1vZi1saXN0IG1hcmtlcgotICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBsYXN0RW50cnkgPSBuZXcgTWV0YURhdGFFbnRyeSgpOwotICAgICAgICAgICAgbGFzdEVudHJ5LnNldENsYXNzTmFtZShNZXRhRGF0YUVudHJ5LkVORF9PRl9MSVNUKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KGxhc3RFbnRyeSk7Ci0gICAgICAgICAgICBleGVjTmV4dEluZGV4Kys7Ci0KLSAgICAgICAgICAgIC8vIGV4ZWNOZXh0SW5kZXggYWxzbyBnaXZlcyB1cyB0aGUgbnVtYmVyIG9mIGVudHJpZXMKLSAgICAgICAgICAgIC8vIHRoYXQgd2VyZSBhY3R1YWxseSBzYXZlZCBhcyBvcHBvc2VkIHRvIHRoZQotICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGV4ZWN1dGVkUGhhc2VzCi0gICAgICAgICAgICBvdXQud3JpdGVJbnQoZXhlY05leHRJbmRleCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGdlbmVyYWwgY2FzZTogaGFuZGxlICJudWxsIiBvciAiZW1wdHkiCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEV4dGVybmFsaXplQ29uc3RhbnRzLkVNUFRZX09CSkVDVCk7Ci0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyArICI6d3JpdGVFeHRlcm5hbCgpOiBleGVjdXRlZFBoYXNlcyBpcyBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvcHRpb25zCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGJlZm9yZSBzYXZpbmcgdGhlIE9wdGlvbnMsIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIG1lc3NhZ2UgSUQKLSAgICAgICAgU3RyaW5nIHRtcElEID0gZ2V0TWVzc2FnZUlEKCk7Ci0gICAgICAgIGlmICh0bXBJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgYW4gaWQgdG8gdXNlIHdoZW4gcmVzdG9yaW5nIHRoaXMgb2JqZWN0Ci0gICAgICAgICAgICB0bXBJRCA9IFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOwotICAgICAgICAgICAgc2V0TWVzc2FnZUlEKHRtcElEKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArICI6d3JpdGVFeHRlcm5hbCgpOiAgIG1lc3NhZ2UgSUQgWyIgKyB0bXBJRCArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQud3JpdGVVVEYoIm9wdGlvbnMiKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9wdGlvbnMpOwotICAgICAgICAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb3BlcmF0aW9uCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgb3BlcmF0aW9uCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZVVURigiYXhpc09wZXJhdGlvbiIpOwotICAgICAgICBtZXRhQXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IG1heSBuZWVkIHRvIGluY2x1ZGUgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGF4aXMgc2VydmljZSB0aGF0IGlzCi0gICAgICAgICAgICAvLyAgICAgICB0aGUgcGFyZW50IG9mIHRoZSBheGlzIG9wZXJhdGlvbgotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBheGlzIG9wZXJhdGlvbiBoYXMgYSBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdAotICAgICAgICAgICAgUU5hbWUgYW9UbXBRTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoYW9UbXBRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYW9UbXBRTmFtZSA9IG5ldyBRTmFtZShFeHRlcm5hbGl6ZUNvbnN0YW50cy5FTVBUWV9NQVJLRVIpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TmFtZShhb1RtcFFOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24gPSBuZXcgTWV0YURhdGFFbnRyeShheGlzT3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG9wZXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIFRoZSBPcGVyYXRpb25Db250ZXh0IGhhcyBwb2ludGVycyB0byBNZXNzYWdlQ29udGV4dCBvYmplY3RzLgotICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBoYXZpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBvYmplY3QgZ3JhcGgKLSAgICAgICAgLy8gYmVpbmcgc2F2ZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aGUgc2VyaWFsaXphdGlvbiwKLSAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGlzb2xhdGUgdGhpcyBtZXNzYWdlIGNvbnRleHQgb2JqZWN0LgotICAgICAgICBvdXQud3JpdGVVVEYoIm9wZXJhdGlvbkNvbnRleHQiKTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5pc29sYXRlTWVzc2FnZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQud3JpdGVPYmplY3Qob3BlcmF0aW9uQ29udGV4dCk7Ci0gICAKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgc2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdGhpcyBpcyBleHBlY3RlZCB0byBiZSB0aGUgcGFyZW50IG9mIHRoZSBheGlzIG9wZXJhdGlvbiBvYmplY3QKLSAgICAgICAgb3V0LndyaXRlVVRGKCJheGlzU2VydmljZSIpOwotICAgICAgICBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlID0gbmV3IE1ldGFEYXRhRW50cnkoYXhpc1NlcnZpY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNTZXJ2aWNlKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZUNvbnRleHRJRCBzdHJpbmcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZU9iamVjdChzZXJ2aWNlQ29udGV4dElEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZUNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGlzIHRoaXMgdGhlIHNhbWUgYXMgdGhlIHBhcmVudCBvZiB0aGUgT3BlcmF0aW9uQ29udGV4dD8KLSAgICAgICAgYm9vbGVhbiBpc1BhcmVudCA9IGZhbHNlOwotICAgICAgICBvdXQud3JpdGVVVEYoInNlcnZpY2VDb250ZXh0Iik7Ci0KLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgb3BjdHhQYXJlbnQgPSBvcGVyYXRpb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0LmVxdWFscyhvcGN0eFBhcmVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFNlcnZpY2VDb250ZXh0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgaXNQYXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEV4dGVybmFsaXplQ29uc3RhbnRzLkVNUFRZX09CSkVDVCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEV4dGVybmFsaXplQ29uc3RhbnRzLkFDVElWRV9PQkpFQ1QpOwotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihpc1BhcmVudCk7Ci0KLSAgICAgICAgICAgIC8vIG9ubHkgd3JpdGUgb3V0IHRoZSBvYmplY3QgaWYgaXQgaXMgbm90IHRoZSBwYXJlbnQKLSAgICAgICAgICAgIGlmICghaXNQYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3Qoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gYXhpc1NlcnZpY2VHcm91cAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVVVEYoImF4aXNTZXJ2aWNlR3JvdXAiKTsKLSAgICAgICAgbWV0YUF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2VHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IG5ldyBNZXRhRGF0YUVudHJ5KGF4aXNTZXJ2aWNlR3JvdXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZUdyb3VwQ29udGV4dElkIHN0cmluZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZU9iamVjdChzZXJ2aWNlR3JvdXBDb250ZXh0SWQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlR3JvdXBDb250ZXh0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBpcyB0aGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJlbnQgb2YgdGhlIFNlcnZpY2VDb250ZXh0PwotICAgICAgICBpc1BhcmVudCA9IGZhbHNlOwotICAgICAgICBvdXQud3JpdGVVVEYoInNlcnZpY2VHcm91cENvbnRleHQiKTsKLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzcnZncnBjdHhQYXJlbnQgPSAoU2VydmljZUdyb3VwQ29udGV4dCkgc2VydmljZUNvbnRleHQuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dC5lcXVhbHMoc3J2Z3JwY3R4UGFyZW50KSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgU2VydmljZUdyb3VwQ29udGV4dCBpcyB0aGUgcGFyZW50IG9mIHRoZSBTZXJ2aWNlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICBpc1BhcmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5FTVBUWV9PQkpFQ1QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5BQ1RJVkVfT0JKRUNUKTsKLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oaXNQYXJlbnQpOwotCi0gICAgICAgICAgICAvLyBvbmx5IHdyaXRlIG91dCB0aGUgb2JqZWN0IGlmIGl0IGlzIG5vdCB0aGUgcGFyZW50Ci0gICAgICAgICAgICBpZiAoIWlzUGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gYXhpcyBtZXNzYWdlCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZVVURigiYXhpc01lc3NhZ2UiKTsKLSAgICAgICAgbWV0YUF4aXNNZXNzYWdlID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgQXhpc01lc3NhZ2UgaXMgZXhwZWN0ZWQgdG8gYmVsb25nIHRvIHRoZSBBeGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAvLyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVjb3JkZWQgZm9yIHRoaXMgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICAvLyBJZiBhbiBBeGlzTWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBNZXNzYWdlY29udGV4dCBpcwotICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGEgZGlmZmVyZW50IEF4aXNPcGVyYXRpb24sIHRoZW4gbW9yZQotICAgICAgICAgICAgLy8gbWV0YSBpbmZvcm1hdGlvbiB3b3VsZCBuZWVkIHRvIGJlIHNhdmVkCi0KLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYXhpcyBtZXNzYWdlIGhhcyBhIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0Ci0gICAgICAgICAgICBTdHJpbmcgYW1UbXBOYW1lID0gYXhpc01lc3NhZ2UuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoYW1UbXBOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbVRtcE5hbWUgPSBFeHRlcm5hbGl6ZUNvbnN0YW50cy5FTVBUWV9NQVJLRVI7Ci0gICAgICAgICAgICAgICAgYXhpc01lc3NhZ2Uuc2V0TmFtZShhbVRtcE5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIGVsZW1lbnQgbmFtZSBpZiB0aGVyZSBpcyBvbmUKLSAgICAgICAgICAgIFFOYW1lIGFtVG1wRWxlbWVudFFOYW1lID0gYXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgYW1UbXBFbGVtUU5hbWVTdHJpbmcgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAoYW1UbXBFbGVtZW50UU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFtVG1wRWxlbVFOYW1lU3RyaW5nID0gYW1UbXBFbGVtZW50UU5hbWUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWV0YUF4aXNNZXNzYWdlID0gbmV3IE1ldGFEYXRhRW50cnkoYXhpc01lc3NhZ2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTWVzc2FnZS5nZXROYW1lKCksIGFtVG1wRWxlbVFOYW1lU3RyaW5nKTsKLQotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtZXRhQXhpc01lc3NhZ2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIE5PVEU6IEN1cnJlbnRseSwgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhbnkKLSAgICAgICAgLy8gICAgICAgcnVudGltZSBkYXRhIGltcG9ydGFudCB0byB0aGlzIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAvLyAgICAgICBpbiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0LgotICAgICAgICAvLyAgICAgICBpZiBzbywgdGhlbiBuZWVkIHRvIHNhdmUgdGhhdCBydW50aW1lIGRhdGEgYW5kIHJlY29uY2lsZQotICAgICAgICAvLyAgICAgICBpdCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgb24gdGhlIHN5c3RlbSB3aGVuCi0gICAgICAgIC8vICAgICAgIHRoaXMgbWVzc2FnZSBjb250ZXh0IG9iamVjdCBpcyByZXN0b3JlZAotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlc3Npb24gY29udGV4dAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVPYmplY3Qoc2Vzc2lvbkNvbnRleHQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHRyYW5zcG9ydAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluY29taW5nVHJhbnNwb3J0TmFtZSBzdHJpbmcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGluY29taW5nVHJhbnNwb3J0TmFtZSk7Ci0KLSAgICAgICAgLy8gVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbgotICAgICAgICBtZXRhVHJhbnNwb3J0SW4gPSBudWxsOwotICAgICAgICBpZiAodHJhbnNwb3J0SW4gIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YVRyYW5zcG9ydEluID0gbmV3IE1ldGFEYXRhRW50cnkobnVsbCwgdHJhbnNwb3J0SW4uZ2V0TmFtZSgpKTsKLSAgICAgICAgfSAKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1ldGFUcmFuc3BvcnRJbik7Ci0KLSAgICAgICAgLy8gVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0Ci0gICAgICAgIG1ldGFUcmFuc3BvcnRPdXQgPSBudWxsOwotICAgICAgICBpZiAodHJhbnNwb3J0T3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFUcmFuc3BvcnRPdXQgPSBuZXcgTWV0YURhdGFFbnRyeShudWxsLCB0cmFuc3BvcnRPdXQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YVRyYW5zcG9ydE91dCk7Ci0gICAgICAgIAotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBsb2NhbCBwcm9wZXJ0aWVzIG9uIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAgICAvLyBEb24ndCB3cml0ZSBvdXQgdGhlIHByb3BlcnRpZXMgZnJvbSBvdGhlciBoaWVyYXJjaGljYWwgbGF5ZXJzLgotICAgICAgICAvLyAoaS5lLiBkb24ndCB1c2UgZ2V0UHJvcGVydGllcygpKQotICAgICAgICBvdXQud3JpdGVVVEYoInByb3BlcnRpZXMiKTsgLy8gd3JpdGUgbWFya2VyCi0gICAgICAgIG91dC53cml0ZU1hcChwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzcGVjaWFsIGRhdGEKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlVVRGKCJzZWxmTWFuYWdlZERhdGEiKTsKLSAgICAgICAgc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKG91dCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICI6d3JpdGVFeHRlcm5hbCgpOiBjb21wbGV0ZWQgd3JpdGluZyB0byBvdXRwdXQgc3RyZWFtIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIHBlcnNpc3RlZCBhcyBvcHRpbWl6ZWQgYXR0YWNobWVudHMKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2V0UGVyc2lzdE9wdGltaXplZCgpIHsKLSAgICAgICAgYm9vbGVhbiBwZXJzaXN0T3B0aW1pemVkID0gZmFsc2U7Ci0gICAgICAgIGlmIChhdHRhY2htZW50cyAhPSBudWxsICYmIGF0dGFjaG1lbnRzLmdldENvbnRlbnRJRExpc3QoKS5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBwZXJzaXN0T3B0aW1pemVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICArICI6Z2V0UGVyc2lzdE9wdGltaXplZCgpOiBhdHRhY2htZW50cyBwcmVzZW50OyBwZXJzaXN0IG9wdGltaXplZCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcGVyc2lzdE9wdGltaXplZCkgewotICAgICAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gZ2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShwcm9wZXJ0eSkpIHsKLSAgICAgICAgICAgICAgICBwZXJzaXN0T3B0aW1pemVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6Z2V0UGVyc2lzdE9wdGltaXplZCgpOiBFTkJBQkxFX01UT00gaXMgc2V0OyBwZXJzaXN0IG9wdGltaXplZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghcGVyc2lzdE9wdGltaXplZCkgewotICAgICAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gZ2V0UHJvcGVydHkoQ29uZmlndXJhdGlvbi5FTkFCTEVfU1dBKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgIHBlcnNpc3RPcHRpbWl6ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjpnZXRQZXJzaXN0T3B0aW1pemVkKCk6IEVOQkFCTEVfU1dBIGlzIHNldDsgcGVyc2lzdCBvcHRpbWl6ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXBlcnNpc3RPcHRpbWl6ZWQgJiYgTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICsgIjpnZXRQZXJzaXN0T3B0aW1pemVkKCk6IE5vIGF0dGFjaG1lbnRzIG9yIGF0dGFjaG1lbnQgc2V0dGluZ3M7IHBlcnNpc3Qgbm9uLW9wdGltaXplZCIpOwotICAgICAgICByZXR1cm4gcGVyc2lzdE9wdGltaXplZDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNZXNzYWdlQ29udGV4dCB0aGF0IHdhcwotICAgICAqIHByZXZpb3VzbHkgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRoZSBmaWVsZCBkYXRhIG11c3QgcmVhZCBiYWNrIGluIHRoZSBzYW1lIG9yZGVyIGFuZCB0eXBlCi0gICAgICogYXMgaXQgd2FzIHdyaXR0ZW4uICBTb21lIGRhdGEgd2lsbCBuZWVkIHRvIGJlIHZhbGlkYXRlZCB3aGVuCi0gICAgICogcmVzdXJyZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5PYmplY3QKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geyAgICAgICAgCi0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgLy8gc2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2UgY29udGV4dCBpcyBiZWluZwotICAgICAgICAvLyByZWNvbnN0aXR1dGVkIGFuZCB3aWxsIG5lZWQgdG8gaGF2ZSBjZXJ0YWluIG9iamVjdCByZWZlcmVuY2VzCi0gICAgICAgIC8vIHRvIGJlIHJlY29uY2lsZWQgd2l0aCB0aGUgY3VycmVudCBlbmdpbmUgc2V0dXAKLSAgICAgICAgbmVlZHNUb0JlUmVjb25jaWxlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICI6cmVhZEV4dGVybmFsKCk6ICBCRUdJTiAgYnl0ZXMgYXZhaWxhYmxlIGluIHN0cmVhbSBbIiArCi0gICAgICAgICAgICAgICAgICAgIGluLmF2YWlsYWJsZSgpICsgIl0gICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIGxvbmcgc3VpZCA9IGluLnJlYWRMb25nKCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgaW50IHJldklEID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSB2ZXJzaW9uIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHN1aWQgIT0gc2VyaWFsVmVyc2lvblVJRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfU1VJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgcmV2aXNpb24gbGV2ZWwgd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAocmV2SUQgIT0gUkVWSVNJT05fMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfUkVWSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gdGhlIHR5cGUgb2YgZXhlY3V0aW9uIGZsb3cgZm9yIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgRkxPVyA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyB2YXJpb3VzIGZsYWdzCi0gICAgICAgIHByb2Nlc3NpbmdGYXVsdCA9IGluLnJlYWRCb29sZWFuKCk7Ci0gICAgICAgIHBhdXNlZCA9IGluLnJlYWRCb29sZWFuKCk7Ci0gICAgICAgIG91dHB1dFdyaXR0ZW4gPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICBuZXdUaHJlYWRSZXF1aXJlZCA9IGluLnJlYWRCb29sZWFuKCk7Ci0gICAgICAgIGlzU09BUDExID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgZG9pbmdSRVNUID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgZG9pbmdNVE9NID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgZG9pbmdTd0EgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICByZXNwb25zZVdyaXR0ZW4gPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICBzZXJ2ZXJTaWRlID0gaW4ucmVhZEJvb2xlYW4oKTsKLQotICAgICAgICBsb25nIHRpbWUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICBzZXRMYXN0VG91Y2hlZFRpbWUodGltZSk7Ci0gICAgICAgIGxvZ0NvcnJlbGF0aW9uSUQgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSAiW01lc3NhZ2VDb250ZXh0OiBsb2dJRD0iICsgZ2V0TG9nQ29ycmVsYXRpb25JRCgpICsgIl0iOwotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIHJlYWRpbmcgdGhlIGlucHV0IHN0cmVhbSBmb3IgICIgKwotICAgICAgICAgICAgICAgICAgICAgIGdldExvZ0lEU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gTWVzc2FnZQotICAgICAgICAvLyBSZWFkIHRoZSBtZXNzYWdlIGFuZCBhdHRhY2htZW50cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBlbnZlbG9wZSA9IE1lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzLnJlYWRFeHRlcm5hbChpbiwgdGhpcywgZ2V0TG9nSURTdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQXJyYXlMaXN0IGV4ZWN1dGlvbkNoYWluCi0gICAgICAgIC8vICAgICBoYW5kbGVyIGFuZCBwaGFzZSByZWxhdGVkIGRhdGEKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gUmVzdG9yZSB0aGUgbWV0YWRhdGEgYWJvdXQgZWFjaCBtZW1iZXIgb2YgdGhlIGxpc3QKLSAgICAgICAgLy8gYW5kIHRoZSBvcmRlciBvZiB0aGUgbGlzdC4KLSAgICAgICAgLy8gVGhpcyBtZXRhZGF0YSB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggdXAgd2l0aCBwaGFzZXMKLSAgICAgICAgLy8gYW5kIGhhbmRsZXJzIG9uIHRoZSBlbmdpbmUuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vbi1udWxsIGxpc3Q6Ci0gICAgICAgIC8vICAgIFVURiAgICAgICAgICAtIGRlc2NyaXB0aW9uIHN0cmluZwotICAgICAgICAvLyAgICBib29sZWFuICAgICAgLSBhY3RpdmUgZmxhZwotICAgICAgICAvLyAgICBpbnQgICAgICAgICAgLSBjdXJyZW50IGhhbmRsZXIgaW5kZXgKLSAgICAgICAgLy8gICAgaW50ICAgICAgICAgIC0gY3VycmVudCBwaGFzZSBpbmRleAotICAgICAgICAvLyAgICBpbnQgICAgICAgICAgLSBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGlzdAotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRpbmcgdGhlIGxhc3QgZW50cnkgbWFya2VyCi0gICAgICAgIC8vICAgIG9iamVjdHMgICAgICAtIE1ldGFEYXRhRW50cnkgb2JqZWN0IHBlciBsaXN0IGVudHJ5Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBlbnRyeSB3aWxsIGJlIGVtcHR5IE1ldGFEYXRhRW50cnkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE1ldGFEYXRhRW50cnkuTEFTVF9FTlRSWSBtYXJrZXIKLSAgICAgICAgLy8gICAgaW50ICAgICAgICAgIC0gYWRqdXN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyB0aGUgbGFzdCBlbXB0eSBlbnRyeQotICAgICAgICAvLwotICAgICAgICAvLyBFbXB0eSBsaXN0OgotICAgICAgICAvLyAgICBVVEYgICAgICAgICAgLSBkZXNjcmlwdGlvbiBzdHJpbmcKLSAgICAgICAgLy8gICAgYm9vbGVhbiAgICAgIC0gZW1wdHkgZmxhZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHRoZSBsb2NhbCBjaGFpbiBpcyBub3QgZW5hYmxlZCB1bnRpbCB0aGUKLSAgICAgICAgLy8gbGlzdCBoYXMgYmVlbiByZWNvbnN0aXR1dGVkCi0gICAgICAgIGV4ZWN1dGlvbkNoYWluID0gbnVsbDsKLSAgICAgICAgY3VycmVudEhhbmRsZXJJbmRleCA9IC0xOwotICAgICAgICBjdXJyZW50UGhhc2VJbmRleCA9IDA7Ci0gICAgICAgIG1ldGFFeGVjdXRpb25DaGFpbiA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIG1hcmtlciA9IGluLnJlYWRVVEYoKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgCi0gICAgICAgICAgICAgICAgICAgICAgIjogcmVhZEV4dGVybmFsKCk6IEFib3V0IHRvIHJlYWQgZXhlY3V0aW9uQ2hhaW4sIG1hcmtlciBpczogIiArIG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBnb3RDaGFpbiA9IGluLnJlYWRCb29sZWFuKCk7Ci0KLSAgICAgICAgaWYgKGdvdENoYWluID09IEV4dGVybmFsaXplQ29uc3RhbnRzLkFDVElWRV9PQkpFQ1QpIHsKLSAgICAgICAgICAgIG1ldGFIYW5kbGVySW5kZXggPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBtZXRhUGhhc2VJbmRleCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAgICAgaW50IGV4cGVjdGVkTnVtYmVyRW50cmllcyA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOnJlYWRFeHRlcm5hbCgpOiBleGVjdXRpb24gY2hhaW46ICBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE51bWJlckVudHJpZXMgKyAiXSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXR1cCB0aGUgbGlzdAotICAgICAgICAgICAgbWV0YUV4ZWN1dGlvbkNoYWluID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PigpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIHRoZSBvYmplY3RzCi0gICAgICAgICAgICBib29sZWFuIGtlZXBHb2luZyA9IHRydWU7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoa2VlcEdvaW5nKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RvcCB3aGVuIHdlIGdldCB0byB0aGUgZW5kLW9mLWxpc3QgbWFya2VyCi0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG9iamVjdAotICAgICAgICAgICAgICAgIE9iamVjdCB0bXBPYmogPSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgICAgICAgICBjb3VudCsrOwotCi0gICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZE9iaiA9IChNZXRhRGF0YUVudHJ5KSB0bXBPYmo7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNsYXNzIG5hbWUsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRtcENsYXNzTmFtZVN0cjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wUU5hbWVBc1N0cjsKLQotICAgICAgICAgICAgICAgIGlmIChtZE9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcENsYXNzTmFtZVN0ciA9IG1kT2JqLmdldENsYXNzTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh0bXBDbGFzc05hbWVTdHIuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YUVudHJ5LkVORF9PRl9MSVNUKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgbGFzdCBlbnRyeQotICAgICAgICAgICAgICAgICAgICAgICAga2VlcEdvaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGVudHJ5IHRvIHRoZSBtZXRhIGRhdGEgbGlzdAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUV4ZWN1dGlvbkNoYWluLmFkZChtZE9iaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcFFOYW1lQXNTdHIgPSBtZE9iai5nZXRRTmFtZUFzU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRtcEhhc0xpc3QgPSBtZE9iai5pc0xpc3RFbXB0eSgpID8gIm5vIGNoaWxkcmVuIiA6ICJoYXMgY2hpbGRyZW4iOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6cmVhZEV4dGVybmFsKCk6IG1ldGEgZGF0YSBjbGFzcyBbIiArIHRtcENsYXNzTmFtZVN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXSBxbmFtZSBbIiArIHRtcFFOYW1lQXNTdHIgKyAiXSAgaW5kZXggWyIgKyBjb3VudCArICJdICAgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wSGFzTGlzdCArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBlcnJvciBvY2N1cnJlZAotICAgICAgICAgICAgICAgICAgICBrZWVwR29pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlIGtlZXAgZ29pbmcKLQotICAgICAgICAgICAgaW50IGFkanVzdGVkTnVtYmVyRW50cmllcyA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOnJlYWRFeHRlcm5hbCgpOiBhZGp1c3RlZCBudW1iZXIgb2YgZW50cmllcyBFeGVjdXRpb25DaGFpbiBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZE51bWJlckVudHJpZXMgKyAiXSAgICAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobWV0YUV4ZWN1dGlvbkNoYWluID09IG51bGwpIHx8IChtZXRhRXhlY3V0aW9uQ2hhaW4uaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOnJlYWRFeHRlcm5hbCgpOiBtZXRhIGRhdGEgZm9yIEV4ZWN1dGlvbiBDaGFpbiBpcyBOVUxMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBMaW5rZWRMaXN0IGV4ZWN1dGVkUGhhc2VzCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGUgdGhhdCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBBeGlzMiwgdGhpcyB3YXMKLSAgICAgICAgLy8gcmVwcmVzZW50ZWQgYnkgdHdvIGxpc3RzOiAiaW5ib3VuZEV4ZWN1dGVkUGhhc2VzIiwgIm91dGJvdW5kRXhlY3V0ZWRQaGFzZXMiLAotICAgICAgICAvLyBob3dldmVyIHNpbmNlIHRoZSBtZXNzYWdlIGNvbnRleHQgaXRzZWxmIHJlcHJlc2VudHMgYSBmbG93Ci0gICAgICAgIC8vIGRpcmVjdGlvbiwgb25lIG9mIHRoZXNlIGxpc3RzIHdhcyBhbHdheXMgbnVsbC4gIFRoaXMgd2FzIGNoYW5nZWQKLSAgICAgICAgLy8gYXJvdW5kIDIwMDctMDYtMDggcmV2aXNpb24gcjU0NTYxNS4gIEZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5Ci0gICAgICAgIC8vIHdpdGggc3RyZWFtcyBzYXZlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBBeGlzMiwgd2UgbmVlZAotICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHByb2Nlc3MgYm90aCB0aGUgb2xkIHN0eWxlIGFuZCBuZXcgc3R5bGUuCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIFJlc3RvcmUgdGhlIG1ldGFkYXRhIGFib3V0IGVhY2ggbWVtYmVyIG9mIHRoZSBsaXN0Ci0gICAgICAgIC8vIGFuZCB0aGUgb3JkZXIgb2YgdGhlIGxpc3QuCi0gICAgICAgIC8vIFRoaXMgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIHRvIG1hdGNoIHVwIHdpdGggcGhhc2VzCi0gICAgICAgIC8vIGFuZCBoYW5kbGVycyBvbiB0aGUgZW5naW5lLgotICAgICAgICAvLwotICAgICAgICAvLyBOb24tbnVsbCBsaXN0OgotICAgICAgICAvLyAgICBVVEYgICAgICAgICAgLSBkZXNjcmlwdGlvbiBzdHJpbmcKLSAgICAgICAgLy8gICAgYm9vbGVhbiAgICAgIC0gYWN0aXZlIGZsYWcKLSAgICAgICAgLy8gICAgaW50ICAgICAgICAgIC0gZXhwZWN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxpc3QKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBub3QgaW5jbHVkaW5nIHRoZSBsYXN0IGVudHJ5IG1hcmtlcgotICAgICAgICAvLyAgICBvYmplY3RzICAgICAgLSBNZXRhRGF0YUVudHJ5IG9iamVjdCBwZXIgbGlzdCBlbnRyeQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgZW50cnkgd2lsbCBiZSBlbXB0eSBNZXRhRGF0YUVudHJ5Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBNZXRhRGF0YUVudHJ5LkxBU1RfRU5UUlkgbWFya2VyCi0gICAgICAgIC8vICAgIGludCAgICAgICAgICAtIGFkanVzdGVkIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBsaXN0Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgdGhlIGxhc3QgZW1wdHkgZW50cnkKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRW1wdHkgbGlzdDoKLSAgICAgICAgLy8gICAgVVRGICAgICAgICAgIC0gZGVzY3JpcHRpb24gc3RyaW5nCi0gICAgICAgIC8vICAgIGJvb2xlYW4gICAgICAtIGVtcHR5IGZsYWcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyB0aGUgbG9jYWwgY2hhaW4gaXMgbm90IGVuYWJsZWQgdW50aWwgdGhlCi0gICAgICAgIC8vIGxpc3QgaGFzIGJlZW4gcmVjb25zdGl0dXRlZAotICAgICAgICBleGVjdXRlZFBoYXNlcyA9IG51bGw7Ci0gICAgICAgIG1ldGFFeGVjdXRlZCA9IG51bGw7Ci0KLSAgICAgICAgbWFya2VyID0gaW4ucmVhZFVURigpOwotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogQWJvdXQgdG8gcmVhZCBleGVjdXRlZFBoYXNlcywgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gUHJldmlvdXMgdmVyc2lvbnMgb2YgQXhpczIgc2F2ZWQgdHdvIHBoYXNlcyBpbiB0aGUgc3RyZWFtLCBhbHRob3VnaCBvbmUgc2hvdWxkIAotICAgICAgICAvLyBhbHdheXMgaGF2ZSBiZWVuIG51bGwuICBUaGUgdHdvIHBoYXNlcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBtYXJrZXJzIGFyZSwgaW4gdGhpcyBvcmRlcjoKLSAgICAgICAgLy8gImluYm91bmRFeGVjdXRlZFBoYXNlcyIsICJvdXRib3VuZEV4ZWN1dGVkUGhhc2VzIi4KLSAgICAgICAgYm9vbGVhbiBnb3RJbkV4ZWNMaXN0ID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgYm9vbGVhbiBvbGRTdHlsZUV4ZWN1dGVkUGhhc2VzID0gZmFsc2U7Ci0gICAgICAgIGlmIChtYXJrZXIuZXF1YWxzKCJpbmJvdW5kRXhlY3V0ZWRQaGFzZXMiKSkgewotICAgICAgICAgICAgb2xkU3R5bGVFeGVjdXRlZFBoYXNlcyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChvbGRTdHlsZUV4ZWN1dGVkUGhhc2VzICYmIChnb3RJbkV4ZWNMaXN0ID09IEV4dGVybmFsaXplQ29uc3RhbnRzLkVNUFRZX09CSkVDVCkpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBhbiBpbmJvdW5kRXhlY3V0ZWRQaGFzZXMgYW5kIGFuIG91dGJvdW5kRXhlY3V0ZWRQaGFzZXMgYW5kIHRoaXMgb25lCi0gICAgICAgICAgICAvLyBpcyBlbXB0eSwgc28gc2tpcCBvdmVyIGl0IGFuZCByZWFkIHRoZSBuZXh0IG9uZQotICAgICAgICAgICAgbWFya2VyID0gaW4ucmVhZFVURigpOwotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogU2tpcHBpbmcgb3ZlciBvbGRTdHlsZSBlbXB0eSBpbmJvdW5kRXhlY3V0ZWRQaGFzZXMiKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogQWJvdXQgdG8gcmVhZCBleGVjdXRlZFBoYXNlcywgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdEluRXhlY0xpc3QgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBBdCB0aGlzIHBvaW50LCB0aGUgc3RyZWFtIHNob3VsZCBwb2ludCB0byBlaXRoZXIgImV4ZWN1dGVkUGhhc2VzIiBpZiB0aGlzIGlzIHRoZSAKLSAgICAgICAgICogbmV3IHN0eWxlIG9mIHNlcmlhbGl6YXRpb24uICBJZiBpdCBpcyB0aGUgb2xkU3R5bGUsIGl0IHNob3VsZCBwb2ludCB0byB3aGljaGV2ZXIgCi0gICAgICAgICAqIG9mICJpbmJvdW5kIiBvciAib3V0Ym91bmQiIGV4ZWN1dGVkIHBoYXNlcyBjb250YWlucyBhbiBhY3RpdmUgb2JqZWN0LCBzaW5jZSBvbmx5IG9uZQotICAgICAgICAgKiBzaG91bGQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChnb3RJbkV4ZWNMaXN0ID09IEV4dGVybmFsaXplQ29uc3RhbnRzLkFDVElWRV9PQkpFQ1QpIHsKLSAgICAgICAgICAgIGludCBleHBlY3RlZE51bWJlckluRXhlY0xpc3QgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjpyZWFkRXh0ZXJuYWwoKTogZXhlY3V0ZWQgcGhhc2VzOiAgZXhwZWN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWROdW1iZXJJbkV4ZWNMaXN0ICsgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2V0dXAgdGhlIGxpc3QKLSAgICAgICAgICAgIG1ldGFFeGVjdXRlZCA9IG5ldyBMaW5rZWRMaXN0PE1ldGFEYXRhRW50cnk+KCk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG9iamVjdHMKLSAgICAgICAgICAgIGJvb2xlYW4ga2VlcEdvaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChrZWVwR29pbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9wIHdoZW4gd2UgZ2V0IHRvIHRoZSBlbmQtb2YtbGlzdCBtYXJrZXIKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgb2JqZWN0Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHRtcE9iaiA9IGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1kT2JqID0gKE1ldGFEYXRhRW50cnkpIHRtcE9iajsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2xhc3MgbmFtZSwgdGhlbiBhZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wQ2xhc3NOYW1lU3RyOwotICAgICAgICAgICAgICAgIFN0cmluZyB0bXBRTmFtZUFzU3RyOwotICAgICAgICAgICAgICAgIFN0cmluZyB0bXBIYXNMaXN0ID0gIm5vIGxpc3QiOwotCi0gICAgICAgICAgICAgICAgaWYgKG1kT2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wQ2xhc3NOYW1lU3RyID0gbWRPYmouZ2V0Q2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRtcENsYXNzTmFtZVN0ci5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhRW50cnkuRU5EX09GX0xJU1QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBsYXN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwR29pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgZW50cnkgdG8gdGhlIG1ldGEgZGF0YSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhRXhlY3V0ZWQuYWRkKG1kT2JqKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdG1wUU5hbWVBc1N0ciA9IG1kT2JqLmdldFFOYW1lQXNTdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZE9iai5pc0xpc3RFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wSGFzTGlzdCA9ICJoYXMgbGlzdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjpyZWFkRXh0ZXJuYWwoKTogbWV0YSBkYXRhIGNsYXNzIFsiICsgdG1wQ2xhc3NOYW1lU3RyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIHFuYW1lIFsiICsgdG1wUU5hbWVBc1N0ciArICJdICBpbmRleCBbIiArIGNvdW50ICsgIl0gICBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBIYXNMaXN0ICsgIl0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgZXJyb3Igb2NjdXJyZWQKLSAgICAgICAgICAgICAgICAgICAga2VlcEdvaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8vIGVuZCB3aGlsZSBrZWVwIGdvaW5nCi0KLSAgICAgICAgICAgIGludCBhZGp1c3RlZE51bWJlckluRXhlY0xpc3QgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjpyZWFkRXh0ZXJuYWwoKTogYWRqdXN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgZXhlY3V0ZWRQaGFzZXMgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWROdW1iZXJJbkV4ZWNMaXN0ICsgIl0gICAgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgobWV0YUV4ZWN1dGVkID09IG51bGwpIHx8IChtZXRhRXhlY3V0ZWQuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOnJlYWRFeHRlcm5hbCgpOiBtZXRhIGRhdGEgZm9yIGV4ZWN1dGVkUGhhc2VzIGxpc3QgaXMgTlVMTCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBtYXJrZXIgPSBpbi5yZWFkVVRGKCk7IC8vIFJlYWQgbWFya2VyCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArIAotICAgICAgICAgICAgICAgICAgICAgICI6IHJlYWRFeHRlcm5hbCgpOiBBZnRlciByZWFkaW5nIGV4ZWN1dGVkUGhhc2VzLCBtYXJrZXIgaXM6ICIgKyBtYXJrZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBvbGRTdHlsZSB0aGF0IGNvbnRhaW5lZCBib3RoIGFuIGluYm91bmQgYW5kIG91dGJvdW5kIGV4ZWN1dGVkIHBoYXNlcywgCi0gICAgICAgIC8vIGFuZCB0aGUgb3V0Ym91bmQgcGhhc2VzIHdhc24ndCByZWFkIGFib3ZlLCB0aGVuIHdlIG5lZWQgdG8gc2tpcCBvdmVyIGl0Ci0gICAgICAgIGlmIChtYXJrZXIuZXF1YWxzKCJvdXRib3VuZEV4ZWN1dGVkUGhhc2VzIikpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gZ290T3V0RXhlY0xpc3QgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogU2tpcHBpbmcgb3ZlciBvdXRib3VuZEV4ZWN1dGVkUGhhc2VzLCBtYXJrZXIgaXM6ICIgKyBtYXJrZXIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaXMgbGlzdCBhbiBhY3RpdmUgb2JqZWN0OiAiICsgZ290T3V0RXhlY0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdvdE91dEV4ZWNMaXN0ICE9IEV4dGVybmFsaXplQ29uc3RhbnRzLkVNUFRZX09CSkVDVCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQm90aCBpbmJvdW5kRXhlY3V0ZWRQaGFzZXMgYW5kIG91dGJvdW5kRXhlY3V0ZWRQaGFzZXMgaGFkIGFjdGl2ZSBvYmplY3RzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1hcmtlciA9IGluLnJlYWRVVEYoKTsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjogcmVhZEV4dGVybmFsKCk6IEFmdGVyIHNraXBwaW5nIG9vdXRib3VuZEV4ZWN1dGVQaGFzZXMsIG1hcmtlciBpczogIiArIG1hcmtlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvcHRpb25zCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIAotICAgICAgICBvcHRpb25zID0gKE9wdGlvbnMpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgIjpyZWFkRXh0ZXJuYWwoKTogcmVzdG9yZWQgT3B0aW9ucyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSArICJdIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvcGVyYXRpb24KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBheGlzT3BlcmF0aW9uIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIGF4aXNPcGVyYXRpb24gPSBudWxsOwotICAgICAgICBtYXJrZXIgPSBpbi5yZWFkVVRGKCk7ICAvLyBSZWFkIE1hcmtlcgotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogQWJvdXQgdG8gcmVhZCBheGlzT3BlcmF0aW9uLCBtYXJrZXIgaXM6ICIgKyBtYXJrZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uID0gKE1ldGFEYXRhRW50cnkpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBvcGVyYXRpb24gY29udGV4dCBpcyBub3QgdXNhYmxlIHVudGlsIGl0IGhhcyBiZWVuIGFjdGl2YXRlZAotICAgICAgICAvLyBOT1RFOiBleHBlY3QgdGhpcyB0byBiZSB0aGUgcGFyZW50Ci0gICAgICAgIG1hcmtlciA9IGluLnJlYWRVVEYoKTsgIC8vIFJlYWQgbWFya2VyCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArIAotICAgICAgICAgICAgICAgICAgICAgICI6IHJlYWRFeHRlcm5hbCgpOiBBYm91dCB0byByZWFkIG9wZXJhdGlvbkNvbnRleHQsIG1hcmtlciBpczogIiArIG1hcmtlcik7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlcmF0aW9uQ29udGV4dCA9IChPcGVyYXRpb25Db250ZXh0KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nSURTdHJpbmcoKSArICI6cmVhZEV4dGVybmFsKCk6IHJlc3RvcmVkIE9wZXJhdGlvbkNvbnRleHQgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5nZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKyAiXSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIGF4aXNTZXJ2aWNlIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgbWFya2VyID0gaW4ucmVhZFVURigpOyAvLyBSZWFkIG1hcmtlcgotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogQWJvdXQgdG8gcmVhZCBheGlzU2VydmljZSwgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotICAgICAgICBtZXRhQXhpc1NlcnZpY2UgPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlQ29udGV4dElEIHN0cmluZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgc2VydmljZUNvbnRleHRJRCA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlQ29udGV4dAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgbWFya2VyID0gaW4ucmVhZFVURigpOyAvLyBSZWFkIG1hcmtlcgotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogQWJvdXQgdG8gcmVhZCBzZXJ2aWNlQ29udGV4dCwgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2VydkN0eEFjdGl2ZSA9IGluLnJlYWRCb29sZWFuKCk7Ci0KLSAgICAgICAgaWYgKHNlcnZDdHhBY3RpdmUgPT0gRXh0ZXJuYWxpemVDb25zdGFudHMuRU1QVFlfT0JKRUNUKSB7Ci0gICAgICAgICAgICAvLyBlbXB0eSBvYmplY3QKLQotICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYWN0aXZlIG9iamVjdAotCi0gICAgICAgICAgICBib29sZWFuIGlzUGFyZW50ID0gaW4ucmVhZEJvb2xlYW4oKTsKLQotICAgICAgICAgICAgLy8gdGhlcmUncyBhbiBvYmplY3QgdG8gcmVhZCBpbiBpZiBpdCBpcyBub3QgdGhlIHBhcmVudCBvZiB0aGUgb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgICAgIGlmICghaXNQYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IChTZXJ2aWNlQ29udGV4dCkgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmljZSBjb250ZXh0IGlzIHRoZSBwYXJlbnQgb2YgdGhlIG9wZXJhdGlvbiBjb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gc28gZ2V0IGl0IGZyb20gdGhlIG9wZXJhdGlvbiBjb250ZXh0IGR1cmluZyBhY3RpdmF0ZQotICAgICAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcnZpY2VHcm91cAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIGF4aXNTZXJ2aWNlR3JvdXAgaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cCA9IG51bGw7Ci0gICAgICAgIG1hcmtlciA9IGluLnJlYWRVVEYoKTsgLy8gUmVhZCBtYXJrZXIKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgCi0gICAgICAgICAgICAgICAgICAgICAgIjogcmVhZEV4dGVybmFsKCk6IEFib3V0IHRvIHJlYWQgQXhpc1NlcnZpY2VHcm91cCwgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlR3JvdXBDb250ZXh0SWQgc3RyaW5nCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dElkID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZUdyb3VwQ29udGV4dAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG1hcmtlciA9IGluLnJlYWRVVEYoKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgCi0gICAgICAgICAgICAgICAgICAgICAgIjogcmVhZEV4dGVybmFsKCk6IEFib3V0IHRvIHJlYWQgU2VydmljZUdyb3VwQ29udGV4dCwgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gc2VydkdycEN0eEFjdGl2ZSA9IGluLnJlYWRCb29sZWFuKCk7Ci0KLSAgICAgICAgaWYgKHNlcnZHcnBDdHhBY3RpdmUgPT0gRXh0ZXJuYWxpemVDb25zdGFudHMuRU1QVFlfT0JKRUNUKSB7Ci0gICAgICAgICAgICAvLyBlbXB0eSBvYmplY3QKLQotICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhY3RpdmUgb2JqZWN0Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNQYXJlbnRTR0MgPSBpbi5yZWFkQm9vbGVhbigpOwotCi0gICAgICAgICAgICAvLyB0aGVyZSdzIGFuIG9iamVjdCB0byByZWFkIGluIGlmIGl0IGlzIG5vdCB0aGUgcGFyZW50IG9mIHRoZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQKLSAgICAgICAgICAgIGlmICghaXNQYXJlbnRTR0MpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gKFNlcnZpY2VHcm91cENvbnRleHQpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZpY2UgZ3JvdXAgY29udGV4dCBpcyB0aGUgcGFyZW50IG9mIHRoZSBzZXJ2aWNlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAvLyBzbyBnZXQgaXQgZnJvbSB0aGUgc2VydmljZSBjb250ZXh0IGR1cmluZyBhY3RpdmF0ZQotICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gYXhpcyBtZXNzYWdlCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gYXhpc01lc3NhZ2UgaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgYXhpc01lc3NhZ2UgPSBudWxsOwotICAgICAgICBtYXJrZXIgPSBpbi5yZWFkVVRGKCk7ICAvLyBSZWFkIG1hcmtlcgotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiOiByZWFkRXh0ZXJuYWwoKTogQWJvdXQgdG8gcmVhZCBBeGlzTWVzc2FnZSwgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotICAgICAgICBtZXRhQXhpc01lc3NhZ2UgPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICByZWNvbmNpbGVBeGlzTWVzc2FnZSA9IChtZXRhQXhpc01lc3NhZ2UgIT0gbnVsbCk7Ci0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBjb25maWd1cmF0aW9uIGNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBUT0RPOiBjaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYW55IHJ1bnRpbWUgZGF0YSBpbXBvcnRhbnQgdG8gdGhpcwotICAgICAgICAvLyAgICAgICBtZXNzYWdlIGNvbnRleHQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAgICAvLyAgICAgICBpZiBzbywgdGhlbiBuZWVkIHRvIHJlc3RvcmUgdGhlIHNhdmVkIHJ1bnRpbWUgZGF0YSBhbmQgcmVjb25jaWxlCi0gICAgICAgIC8vICAgICAgIGl0IHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dCBvbiB0aGUgc3lzdGVtIHdoZW4KLSAgICAgICAgLy8gICAgICAgdGhpcyBtZXNzYWdlIGNvbnRleHQgb2JqZWN0IGlzIHJlc3RvcmVkCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2Vzc2lvbiBjb250ZXh0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHNlc3Npb25Db250ZXh0ID0gKFNlc3Npb25Db250ZXh0KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdHJhbnNwb3J0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW5jb21pbmdUcmFuc3BvcnROYW1lIHN0cmluZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBpbmNvbWluZ1RyYW5zcG9ydE5hbWUgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbgotICAgICAgICAvLyBpcyBub3QgdXNhYmxlIHVudGlsIHRoZSBtZXRhIGRhdGEgaGFzIGJlZW4gcmVjb25jaWxlZAotICAgICAgICB0cmFuc3BvcnRJbiA9IG51bGw7Ci0gICAgICAgIG1ldGFUcmFuc3BvcnRJbiA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0Ci0gICAgICAgIC8vIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIHRyYW5zcG9ydE91dCA9IG51bGw7Ci0gICAgICAgIG1ldGFUcmFuc3BvcnRPdXQgPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcmVhZCBsb2NhbCBwcm9wZXJ0aWVzCi0gICAgICAgIG1hcmtlciA9IGluLnJlYWRVVEYoKTsgLy8gUmVhZCBtYXJrZXIKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgCi0gICAgICAgICAgICAgICAgICAgICAgIjogcmVhZEV4dGVybmFsKCk6IEFib3V0IHRvIHJlYWQgcHJvcGVydGllcywgbWFya2VyIGlzOiAiICsgbWFya2VyKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzID0gaW4ucmVhZE1hcChuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCkpOwotCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc3BlY2lhbCBkYXRhCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG1hcmtlciA9IGluLnJlYWRVVEYoKTsgLy8gUmVhZCBtYXJrZXIKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsgCi0gICAgICAgICAgICAgICAgICAgICAgIjogcmVhZEV4dGVybmFsKCk6IEFib3V0IHRvIHJlYWQgU3BlY2lhbERhdGEsIG1hcmtlciBpczogIiArIG1hcmtlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGdvdFNlbGZNYW5hZ2VkRGF0YSA9IGluLnJlYWRCb29sZWFuKCk7Ci0KLSAgICAgICAgaWYgKGdvdFNlbGZNYW5hZ2VkRGF0YSA9PSBFeHRlcm5hbGl6ZUNvbnN0YW50cy5BQ1RJVkVfT0JKRUNUKSB7Ci0gICAgICAgICAgICBzZWxmTWFuYWdlZERhdGFIYW5kbGVyQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIGlmIChzZWxmTWFuYWdlZERhdGFMaXN0SG9sZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWxmTWFuYWdlZERhdGFMaXN0SG9sZGVyID0gbmV3IEFycmF5TGlzdDxTZWxmTWFuYWdlZERhdGFIb2xkZXI+KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlbGZNYW5hZ2VkRGF0YUxpc3RIb2xkZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxmTWFuYWdlZERhdGFIYW5kbGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIHNlbGZNYW5hZ2VkRGF0YUxpc3RIb2xkZXIuYWRkKChTZWxmTWFuYWdlZERhdGFIb2xkZXIpIGluLnJlYWRPYmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIjpyZWFkRXh0ZXJuYWwoKTogIG1lc3NhZ2UgY29udGV4dCBvYmplY3QgY3JlYXRlZCBmb3IgICIgKwotICAgICAgICAgICAgICAgICAgICBnZXRMb2dJRFN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRvIHNlZSBpZiBhZGRpdGlvbmFsIHdvcmsgbmVlZHMgdG8gYmUKLSAgICAgKiBkb25lIGluIG9yZGVyIHRvIGNvbXBsZXRlIHRoZSBvYmplY3QgcmVjb25zdGl0dXRpb24uCi0gICAgICogU29tZSBwYXJ0cyBvZiB0aGUgb2JqZWN0IHJlc3RvcmVkIGZyb20gdGhlIHJlYWRFeHRlcm5hbCgpCi0gICAgICogY2Fubm90IGJlIGNvbXBsZXRlZCB1bnRpbCB3ZSBoYXZlIGEgY29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBmcm9tIHRoZSBhY3RpdmUgZW5naW5lLiBUaGUgY29uZmlndXJhdGlvbkNvbnRleHQgaXMgdXNlZAotICAgICAqIHRvIGhlbHAgdGhpcyBvYmplY3QgdG8gcGx1ZyBiYWNrIGludG8gdGhlIGVuZ2luZSdzCi0gICAgICogY29uZmlndXJhdGlvbiBhbmQgZGVwbG95bWVudCBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNjIFRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjYykgewotICAgICAgICAvLyBzZWUgaWYgdGhlcmUncyBhbnkgd29yayB0byBkbwotICAgICAgICBpZiAoIW5lZWRzVG9CZVJlY29uY2lsZWQpIHsKLSAgICAgICAgICAgIC8vIHJldHVybiBxdWljawotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXNlIHRoZSBzdXBwbGllZCBjb25maWd1cmF0aW9uIGNvbnRleHQKLSAgICAgICAgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoY2MpOwotCi0gICAgICAgIC8vIGdldCB0aGUgYXhpcyBjb25maWd1cmF0aW9uCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIFdlIHByZXZpb3VzbHkgc2F2ZWQgbWV0YUF4aXNTZXJ2aWNlOyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhQXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5zZXRBeGlzU2VydmljZShBY3RpdmF0ZVV0aWxzLmZpbmRTZXJ2aWNlKGF4aXNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2UuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2UuZ2V0UU5hbWVBc1N0cmluZygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFBeGlzU2VydmljZUdyb3VwOyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhQXhpc1NlcnZpY2VHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnNldEF4aXNTZXJ2aWNlR3JvdXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZhdGVVdGlscy5maW5kU2VydmljZUdyb3VwKGF4aXNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cC5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzU2VydmljZUdyb3VwLmdldFFOYW1lQXNTdHJpbmcoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhQXhpc09wZXJhdGlvbjsgcmVzdG9yZSBpdAotICAgICAgICBpZiAobWV0YUF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydiA9IGF4aXNTZXJ2aWNlOwotCi0gICAgICAgICAgICBpZiAoc2VydiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIHRoZSBlbXB0eSBuYW1lCi0gICAgICAgICAgICAgICAgdGhpcy5zZXRBeGlzT3BlcmF0aW9uKEFjdGl2YXRlVXRpbHMuZmluZE9wZXJhdGlvbihzZXJ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24uZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc09wZXJhdGlvbi5nZXRRTmFtZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuc2V0QXhpc09wZXJhdGlvbihBY3RpdmF0ZVV0aWxzLmZpbmRPcGVyYXRpb24oYXhpc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24uZ2V0UU5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhQXhpc01lc3NhZ2U7IHJlc3RvcmUgaXQKLSAgICAgICAgaWYgKG1ldGFBeGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gYXhpc09wZXJhdGlvbjsKLQotICAgICAgICAgICAgaWYgKG9wICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3IgdGhlIGVtcHR5IG5hbWUKLSAgICAgICAgICAgICAgICB0aGlzLnNldEF4aXNNZXNzYWdlKEFjdGl2YXRlVXRpbHMuZmluZE1lc3NhZ2Uob3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzTWVzc2FnZS5nZXRRTmFtZUFzU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzTWVzc2FnZS5nZXRFeHRyYU5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdGhpcyB3aWxsIGRvIGEgZnVsbCBoaWVyYXJjaHksIHNvIGRvIGl0IGZpcnN0Ci0gICAgICAgIC8vIHRoZW4gd2UgY2FuIHJlLXVzZSBpdHMgb2JqZWN0cwotCi0gICAgICAgIGlmIChvcGVyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQuYWN0aXZhdGUoY2MpOwotCi0gICAgICAgICAgICAvLyB0aGlzIHdpbGwgYmUgc2V0IGFzIHRoZSBwYXJlbnQgb2YgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIG90aGVyIGNvbnRleHQgb2JqZWN0cyBoYXZlIGJlZW4gYWN0aXZhdGVkCi0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlIGNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgc2VydmljZUNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IG9wZXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzZXJ2aWNlIGNvbnRleHQsIG1ha2Ugc3VyZSBpdCBpcyB1c2FibGUKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZvciBzb21lIHJlYXNvbiwgdGhlIHNlcnZpY2UgY29udGV4dCBtaWdodCBiZSBzZXQgZGlmZmVyZW50bHkgZnJvbQotICAgICAgICAgICAgLy8gdGhlIG9wZXJhdGlvbiBjb250ZXh0IHBhcmVudAotICAgICAgICAgICAgc2VydmljZUNvbnRleHQuYWN0aXZhdGUoY2MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZSBncm91cCBjb250ZXh0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJlbnQgc2VydmljZUdyb3VwQ29udGV4dCBvZiB0aGUgc2VydmljZUNvbnRleHQKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dCA9IChTZXJ2aWNlR3JvdXBDb250ZXh0KSBzZXJ2aWNlQ29udGV4dC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQsIG1ha2Ugc3VyZSBpdCBpcyB1c2FibGUKLSAgICAgICAgaWYgKHNlcnZpY2VHcm91cENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uLCB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IG1pZ2h0IGJlIHNldCBkaWZmZXJlbnRseSBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgc2VydmljZSBjb250ZXh0IHBhcmVudAotICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dC5hY3RpdmF0ZShjYyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvdGhlciBjb250ZXh0LXJlbGF0ZWQgcmVjb25jaWxpYXRpb24KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICB0aGlzLnNldFBhcmVudChvcGVyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvcHRpb25zCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbnMuYWN0aXZhdGUoY2MpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRtcElEID0gZ2V0TWVzc2FnZUlEKCk7Ci0gICAgICAgIFN0cmluZyBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gZ2V0TG9nSURTdHJpbmcoKTsKLQotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKyAiOmFjdGl2YXRlKCk6ICAgbWVzc2FnZSBJRCBbIiArIHRtcElEICsgIl0gZm9yICIgKwotICAgICAgICAgICAgICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHRyYW5zcG9ydHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFUcmFuc3BvcnRJbjsgcmVzdG9yZSBpdAotICAgICAgICBpZiAobWV0YVRyYW5zcG9ydEluICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFpbiA9IG1ldGFUcmFuc3BvcnRJbi5nZXRRTmFtZSgpOwotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0bXBJbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcEluID0gYXhpc0NvbmZpZy5nZXRUcmFuc3BvcnRJbihxaW4uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGluKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgYSBmYXVsdCBpcyB0aHJvd24sIGxvZyBpdCBhbmQgY29udGludWUKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWN0aXZhdGUoKTogIGV4Y2VwdGlvbiBjYXVnaHQgd2hlbiBnZXR0aW5nIHRoZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFpbi50b1N0cmluZygpICsgIl0gIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aW4uZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4aW4uZ2V0TWVzc2FnZSgpICsgIl0iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRtcEluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbiA9IHRtcEluOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmFuc3BvcnRJbiA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFUcmFuc3BvcnRPdXQ7IHJlc3RvcmUgaXQKLSAgICAgICAgaWYgKG1ldGFUcmFuc3BvcnRPdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyA6IENoZWNrIGlmIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIFFOYW1lPwotICAgICAgICAgICAgUU5hbWUgcW91dCA9IG1ldGFUcmFuc3BvcnRPdXQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRtcE91dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcE91dCA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0T3V0KHFvdXQuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleG91dCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGEgZmF1bHQgaXMgdGhyb3duLCBsb2cgaXQgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgImFjdGl2YXRlKCk6ICBleGNlcHRpb24gY2F1Z2h0IHdoZW4gZ2V0dGluZyB0aGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcW91dC50b1N0cmluZygpICsgIl0gIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4b3V0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleG91dC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRtcE91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0T3V0ID0gdG1wT3V0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhbnNwb3J0T3V0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyByZWNvbmNpbGUgdGhlIGV4ZWN1dGlvbiBjaGFpbgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgaWYgKG1ldGFFeGVjdXRpb25DaGFpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKyAiOmFjdGl2YXRlKCk6IHJlY29uY2lsaW5nIHRoZSBleGVjdXRpb24gY2hhaW4uLi4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VycmVudEhhbmRsZXJJbmRleCA9IG1ldGFIYW5kbGVySW5kZXg7Ci0gICAgICAgICAgICBjdXJyZW50UGhhc2VJbmRleCA9IG1ldGFQaGFzZUluZGV4OwotCi0gICAgICAgICAgICBleGVjdXRpb25DaGFpbiA9IHJlc3RvcmVIYW5kbGVyTGlzdChtZXRhRXhlY3V0aW9uQ2hhaW4pOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9nIHRoZSBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOmFjdGl2YXRlKCk6ICoqKiBXQVJOSU5HICoqKiBkZXNlcmlhbGl6aW5nIHRoZSBzZWxmIG1hbmFnZWQgZGF0YSBlbmNvdW50ZXJlZCBFeGNlcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyByZWNvbmNpbGUgdGhlIGxpc3RzIGZvciB0aGUgZXhlY3V0ZWQgcGhhc2VzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBpZiAobWV0YUV4ZWN1dGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjphY3RpdmF0ZSgpOiByZWNvbmNpbGluZyB0aGUgZXhlY3V0ZWQgY2hhaW4uLi4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCEoZXhlY3V0ZWRQaGFzZXNSZXNldCkpIHsKLSAgICAgICAgICAgICAgICBleGVjdXRlZFBoYXNlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlRXhlY3V0ZWRMaXN0KGV4ZWN1dGVkUGhhc2VzLCBtZXRhRXhlY3V0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4ZWN1dGVkUGhhc2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIGV4ZWN1dGVkUGhhc2VzID0gbmV3IExpbmtlZExpc3Q8SGFuZGxlcj4oKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGZpbmlzaCB1cCByZW1haW5pbmcgbGlua3MKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGlmIChvcGVyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQucmVzdG9yZU1lc3NhZ2VDb250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUsIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgYWRkaXRpb25hbCB3b3JrIG5lZWRzIHRvIGJlCi0gICAgICogZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgb2JqZWN0IHJlY29uc3RpdHV0aW9uLgotICAgICAqIFNvbWUgcGFydHMgb2YgdGhlIG9iamVjdCByZXN0b3JlZCBmcm9tIHRoZSByZWFkRXh0ZXJuYWwoKQotICAgICAqIGNhbm5vdCBiZSBjb21wbGV0ZWQgdW50aWwgd2UgaGF2ZSBhbiBvYmplY3QgdGhhdCBnaXZlcyB1cwotICAgICAqIGEgdmlldyBvZiB0aGUgYWN0aXZlIG9iamVjdCBncmFwaCBmcm9tIHRoZSBhY3RpdmUgZW5naW5lLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiB3aGVuIGFjdGl2YXRpbmcgYW4gb2JqZWN0LCB5b3Ugb25seSBuZWVkIHRvIGNhbGwKLSAgICAgKiBvbmUgb2YgdGhlIGFjdGl2YXRlIG1ldGhvZHMgKGFjdGl2YXRlKCkgb3IgYWN0aXZhdGVXaXRoT3BlcmF0aW9uQ29udGV4dCgpKQotICAgICAqIGJ1dCBub3QgYm90aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25DdHggVGhlIG9wZXJhdGlvbiBjb250ZXh0IG9iamVjdCB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBhY3RpdmUgb2JqZWN0IGdyYXBoCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGVXaXRoT3BlcmF0aW9uQ29udGV4dChPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkN0eCkgewotICAgICAgICAvLyBzZWUgaWYgdGhlcmUncyBhbnkgd29yayB0byBkbwotICAgICAgICBpZiAoIShuZWVkc1RvQmVSZWNvbmNpbGVkKSkgewotICAgICAgICAgICAgLy8gcmV0dXJuIHF1aWNrCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IGdldExvZ0lEU3RyaW5nKCk7Ci0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArICI6YWN0aXZhdGVXaXRoT3BlcmF0aW9uQ29udGV4dCgpOiAgQkVHSU4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvcGVyYXRpb25DdHggPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gd29uJ3QgYmUgYWJsZSB0byBmaW5pc2gKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAiOmFjdGl2YXRlV2l0aE9wZXJhdGlvbkNvbnRleHQoKTogICoqKiBXQVJOSU5HICoqKiAgTm8gYWN0aXZlIE9wZXJhdGlvbkNvbnRleHQgb2JqZWN0IGlzIGF2YWlsYWJsZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGxvY2F0ZSB0aGUgb2JqZWN0cyBpbiB0aGUgb2JqZWN0IGdyYXBoCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IG9wZXJhdGlvbkN0eC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIGlmIChjb25maWdDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gd29uJ3QgYmUgYWJsZSB0byBmaW5pc2gKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAiOmFjdGl2YXRlV2l0aE9wZXJhdGlvbkNvbnRleHQoKTogICoqKiBXQVJOSU5HICoqKiAgTm8gYWN0aXZlIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCBpcyBhdmFpbGFibGUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ2ZnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3AgPSBvcGVyYXRpb25DdHguZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ3R4ID0gb3BlcmF0aW9uQ3R4LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDdHggPSBudWxsOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU3J2ID0gbnVsbDsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU0cgPSBudWxsOwotCi0gICAgICAgIGlmIChzZXJ2aWNlQ3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cEN0eCA9IHNlcnZpY2VDdHguZ2V0U2VydmljZUdyb3VwQ29udGV4dCgpOwotICAgICAgICAgICAgYXhpc1NydiA9IHNlcnZpY2VDdHguZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDdHggIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NHID0gc2VydmljZUdyb3VwQ3R4LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBsaW5rIHRvIHRoZSBvYmplY3RzIGluIHRoZSBvYmplY3QgZ3JhcGgKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBzZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotCi0gICAgICAgIHNldEF4aXNPcGVyYXRpb24oYXhpc09wKTsKLSAgICAgICAgc2V0QXhpc1NlcnZpY2UoYXhpc1Nydik7Ci0gICAgICAgIHNldEF4aXNTZXJ2aWNlR3JvdXAoYXhpc1NHKTsKLQotICAgICAgICBzZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cEN0eCk7Ci0gICAgICAgIHNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VDdHgpOwotICAgICAgICBzZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkN0eCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcmVjb25jaWxlIHRoZSByZW1haW5pbmcgb2JqZWN0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFdlIHByZXZpb3VzbHkgc2F2ZWQgbWV0YUF4aXNNZXNzYWdlOyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhQXhpc01lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNPcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZm9yIHRoZSBlbXB0eSBuYW1lCi0gICAgICAgICAgICAgICAgdGhpcy5zZXRBeGlzTWVzc2FnZShBY3RpdmF0ZVV0aWxzLmZpbmRNZXNzYWdlKGF4aXNPcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc01lc3NhZ2UuZ2V0UU5hbWVBc1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzTWVzc2FnZS5nZXRFeHRyYU5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb3B0aW9ucwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25zLmFjdGl2YXRlKGNvbmZpZ0N0eCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdG1wSUQgPSBnZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKyAiOmFjdGl2YXRlV2l0aE9wZXJhdGlvbkNvbnRleHQoKTogICBtZXNzYWdlIElEIFsiICsKLSAgICAgICAgICAgICAgICAgICAgdG1wSUQgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdHJhbnNwb3J0cwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFdlIHByZXZpb3VzbHkgc2F2ZWQgbWV0YVRyYW5zcG9ydEluOyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhVHJhbnNwb3J0SW4gIT0gbnVsbCkgewotICAgICAgICAgICAgUU5hbWUgcWluID0gbWV0YVRyYW5zcG9ydEluLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRtcEluID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1wSW4gPSBheGlzQ2ZnLmdldFRyYW5zcG9ydEluKHFpbi5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4aW4pIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBhIGZhdWx0IGlzIHRocm93biwgbG9nIGl0IGFuZCBjb250aW51ZQotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KCk6ICBleGNlcHRpb24gY2F1Z2h0IHdoZW4gZ2V0dGluZyB0aGUgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBxaW4udG9TdHJpbmcoKSArICJdICBmcm9tIHRoZSBBeGlzQ29uZmlndXJhdGlvbiBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBleGluLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleGluLmdldE1lc3NhZ2UoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0bXBJbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0SW4gPSB0bXBJbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0SW4gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhbnNwb3J0SW4gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhVHJhbnNwb3J0T3V0OyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhVHJhbnNwb3J0T3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFvdXQgPSBtZXRhVHJhbnNwb3J0T3V0LmdldFFOYW1lKCk7Ci0gICAgICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0bXBPdXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBPdXQgPSBheGlzQ2ZnLmdldFRyYW5zcG9ydE91dChxb3V0LmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhvdXQpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiBhIGZhdWx0IGlzIHRocm93biwgbG9nIGl0IGFuZCBjb250aW51ZQotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJhY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KCk6ICBleGNlcHRpb24gY2F1Z2h0IHdoZW4gZ2V0dGluZyB0aGUgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcW91dC50b1N0cmluZygpICsgIl0gIGZyb20gdGhlIEF4aXNDb25maWd1cmF0aW9uIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4b3V0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleG91dC5nZXRNZXNzYWdlKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRtcE91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0T3V0ID0gdG1wT3V0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRPdXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhbnNwb3J0T3V0ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyByZWNvbmNpbGUgdGhlIGV4ZWN1dGlvbiBjaGFpbgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgaWYgKG1ldGFFeGVjdXRpb25DaGFpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI6YWN0aXZhdGVXaXRoT3BlcmF0aW9uQ29udGV4dCgpOiByZWNvbmNpbGluZyB0aGUgZXhlY3V0aW9uIGNoYWluLi4uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVySW5kZXggPSBtZXRhSGFuZGxlckluZGV4OwotICAgICAgICAgICAgY3VycmVudFBoYXNlSW5kZXggPSBtZXRhUGhhc2VJbmRleDsKLQotICAgICAgICAgICAgZXhlY3V0aW9uQ2hhaW4gPSByZXN0b3JlSGFuZGxlckxpc3QobWV0YUV4ZWN1dGlvbkNoYWluKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIGxvZyB0aGUgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjphY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KCk6ICoqKiBXQVJOSU5HICoqKiBkZXNlcmlhbGl6aW5nIHRoZSBzZWxmIG1hbmFnZWQgZGF0YSBlbmNvdW50ZXJlZCBFeGNlcHRpb24gWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4LmdldE1lc3NhZ2UoKSArICJdIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyByZWNvbmNpbGUgdGhlIGxpc3RzIGZvciB0aGUgZXhlY3V0ZWQgcGhhc2VzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBpZiAobWV0YUV4ZWN1dGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjphY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KCk6IHJlY29uY2lsaW5nIHRoZSBleGVjdXRlZCBjaGFpbi4uLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIShleGVjdXRlZFBoYXNlc1Jlc2V0KSkgewotICAgICAgICAgICAgICAgIGV4ZWN1dGVkUGhhc2VzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVFeGVjdXRlZExpc3QoZXhlY3V0ZWRQaGFzZXMsIG1ldGFFeGVjdXRlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhlY3V0ZWRQaGFzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXhlY3V0ZWRQaGFzZXMgPSBuZXcgTGlua2VkTGlzdDxIYW5kbGVyPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUsIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgIjphY3RpdmF0ZVdpdGhPcGVyYXRpb25Db250ZXh0KCk6ICBFTkQiKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1ldGFEYXRhRW50cmllcyBBcnJheUxpc3Qgb2YgTWV0YURhdGFFbnRyeSBvYmplY3RzCi0gICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgSGFuZGxlcnMgYmFzZWQgb24gb3VyIGxpc3Qgb2YgaGFuZGxlcnMgZnJvbSB0aGUgcmVjb25zdGl0dXRlZCBkZXNlcmlhbGl6ZWQgbGlzdCwgYW5kIHRoZSBleGlzdGluZyBoYW5kbGVycyBpbiB0aGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0LiAgTWF5IHJldHVybiBudWxsLgotICAgICAqLwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEhhbmRsZXI+IHJlc3RvcmVIYW5kbGVyTGlzdChBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFFbnRyaWVzKSB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIExpc3Q8SGFuZGxlcj4gZXhpc3RpbmdIYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlcj4oKTsKLQotICAgICAgICAvLyBUT0RPOiBJJ20gdXNpbmcgY2xvbmUgZm9yIHRoZSBBcnJheUxpc3QgcmV0dXJuZWQgZnJvbSBheGlzQ29uZmlnIG9iamVjdC4KLSAgICAgICAgLy8gICAgIERvZXMgaXQgZG8gYSBkZWVwIGNsb25lIG9mIHRoZSBIYW5kbGVycyBoZWxkIHRoZXJlPyAgRG9lcyBpdCBtYXR0ZXI/Ci0gICAgICAgIHN3aXRjaCAoRkxPVykgewotICAgICAgICAgICAgY2FzZSBJTl9GTE9XOgotICAgICAgICAgICAgICAgIGV4aXN0aW5nSGFuZGxlcnMuYWRkQWxsKGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE9VVF9GTE9XOgotICAgICAgICAgICAgCWV4aXN0aW5nSGFuZGxlcnMuYWRkQWxsKGF4aXNDb25maWcuZ2V0T3V0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBJTl9GQVVMVF9GTE9XOgotICAgICAgICAgICAgCWV4aXN0aW5nSGFuZGxlcnMuYWRkQWxsKGF4aXNDb25maWcuZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgT1VUX0ZBVUxUX0ZMT1c6Ci0gICAgICAgICAgICAJZXhpc3RpbmdIYW5kbGVycy5hZGRBbGwoYXhpc0NvbmZpZy5nZXRPdXRGYXVsdEZsb3dQaGFzZXMoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBleGlzdGluZ0hhbmRsZXJzID0gZmxhdHRlbkhhbmRsZXJMaXN0KGV4aXN0aW5nSGFuZGxlcnMsIG51bGwpOwotCi0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVyTGlzdFRvUmV0dXJuID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YURhdGFFbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgQWN0aXZhdGVVdGlscwotICAgICAgICAgICAgICAgICAgICAuZmluZEhhbmRsZXIoZXhpc3RpbmdIYW5kbGVycywgKE1ldGFEYXRhRW50cnkpIG1ldGFEYXRhRW50cmllcy5nZXQoaSkpOwotCi0gICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckxpc3RUb1JldHVybi5hZGQoaGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGFuZGxlckxpc3RUb1JldHVybjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFVzaW5nIG1ldGEgZGF0YSBmb3IgcGhhc2VzL2hhbmRsZXJzLCBjcmVhdGUgYSBsaW5rZWQgbGlzdCBvZiBhY3R1YWwKLSAgICAgKiBwaGFzZS9oYW5kbGVyIG9iamVjdHMuICBUaGUgY3JlYXRlZCBsaXN0IGlzIGNvbXBvc2VkIG9mIHRoZSBvYmplY3RzCi0gICAgICogZnJvbSB0aGUgYmFzZSBsaXN0IGF0IHRoZSB0b3Agb2YgdGhlIGNyZWF0ZWQgbGlzdCBmb2xsb3dlZCBieSB0aGUKLSAgICAgKiByZXN0b3JlZCBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGJhc2UgICAgICAgICAgICBMaW5rZWQgbGlzdCBvZiBwaGFzZS9oYW5kbGVyIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gbWV0YURhdGFFbnRyaWVzIExpbmtlZCBsaXN0IG9mIE1ldGFEYXRhRW50cnkgb2JqZWN0cwotICAgICAqIEByZXR1cm4gTGlua2VkTGlzdCBvZiBvYmplY3RzIG9yIE5VTEwgaWYgbm9uZSBhdmFpbGFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIExpbmtlZExpc3Q8SGFuZGxlcj4gcmVzdG9yZUV4ZWN1dGVkTGlzdChMaW5rZWRMaXN0PEhhbmRsZXI+IGJhc2UsIExpbmtlZExpc3Q8TWV0YURhdGFFbnRyeT4gbWV0YURhdGFFbnRyaWVzKSB7Ci0gICAgICAgIGlmIChtZXRhRGF0YUVudHJpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGJhc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgYSBsaXN0IG9mIGV4aXN0aW5nIGhhbmRsZXIvcGhhc2Ugb2JqZWN0cyBmb3IgdGhlIHJlc3RvcmVkIG9iamVjdHMKLQotICAgICAgICBBcnJheUxpc3Q8TWV0YURhdGFFbnRyeT4gdG1wTWV0YURhdGFMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRhRGF0YUVudHJ5PihtZXRhRGF0YUVudHJpZXMpOwotCi0gICAgICAgIEFycmF5TGlzdDxIYW5kbGVyPiBleGlzdGluZ0xpc3QgPSByZXN0b3JlSGFuZGxlckxpc3QodG1wTWV0YURhdGFMaXN0KTsKLQotICAgICAgICBpZiAoKGV4aXN0aW5nTGlzdCA9PSBudWxsKSB8fCAoZXhpc3RpbmdMaXN0LmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBiYXNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHVwIGEgbGlzdCB0byByZXR1cm4KLQotICAgICAgICBMaW5rZWRMaXN0PEhhbmRsZXI+IHJldHVybmVkTGlzdCA9IG5ldyBMaW5rZWRMaXN0PEhhbmRsZXI+KCk7Ci0KLSAgICAgICAgaWYgKGJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuZWRMaXN0LmFkZEFsbChiYXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybmVkTGlzdC5hZGRBbGwoZXhpc3RpbmdMaXN0KTsKLQotICAgICAgICByZXR1cm4gcmV0dXJuZWRMaXN0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyB0aGUgbGlzdCBvZiBoYW5kbGVycyBmcm9tIHRoZSBQaGFzZSBvYmplY3QKLSAgICAgKiBpbnRvIHRoZSBhcHByb3ByaWF0ZSBtZXRhIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGhhc2UgICBUaGUgUGhhc2Ugb2JqZWN0IGNvbnRhaW5pbmcgYSBsaXN0IG9mIGhhbmRsZXJzCi0gICAgICogQHBhcmFtIG1kUGhhc2UgVGhlIG1ldGEgZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgUGhhc2Ugb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwUGhhc2VMaXN0KFBoYXNlIHBoYXNlLCBNZXRhRGF0YUVudHJ5IG1kUGhhc2UpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IGZyb20gdGhlIHBoYXNlIG9iamVjdAotICAgICAgICBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsKLQotICAgICAgICBpZiAoaGFuZGxlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBkb25lLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gbGlzdCBpbiB0aGUgZ2l2ZW4gbWV0YSBkYXRhCi0gICAgICAgICAgICBtZFBoYXNlLnJlbW92ZUxpc3QoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgbWV0YWRhdGEgb24gZWFjaCBtZW1iZXIgb2YgdGhlIGxpc3QKLQotICAgICAgICBpbnQgbGlzdFNpemUgPSBoYW5kbGVycy5zaXplKCk7Ci0KLSAgICAgICAgaWYgKGxpc3RTaXplID4gMCkgewotCi0gICAgICAgICAgICBJdGVyYXRvcjxIYW5kbGVyPiBpID0gaGFuZGxlcnMuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvYmpDbGFzcyA9IG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBtZXRhIGRhdGEgZW50cnkgZm9yIHRoaXMgb2JqZWN0Ci0gICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZEVudHJ5ID0gbmV3IE1ldGFEYXRhRW50cnkoKTsKLSAgICAgICAgICAgICAgICBtZEVudHJ5LnNldENsYXNzTmFtZShvYmpDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNvcnJlY3Qgb2JqZWN0LXNwZWNpZmljIG5hbWUKLSAgICAgICAgICAgICAgICBTdHJpbmcgcW5hbWVBc1N0cmluZzsKLQotICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgY29uZGl0aW9uLCB0aGUgcGhhc2Ugb2JqZWN0IGNvbnRhaW5zIGFub3RoZXIgcGhhc2UhCi0gICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlT2JqID0gKFBoYXNlKSBvYmo7Ci0gICAgICAgICAgICAgICAgICAgIHFuYW1lQXNTdHJpbmcgPSBwaGFzZU9iai5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBsaXN0IG9mIGhhbmRsZXJzIHRvIHRoZSBtZXRhIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgc2V0dXBQaGFzZUxpc3QocGhhc2VPYmosIG1kRW50cnkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXJPYmogPSAoSGFuZGxlcikgb2JqOwotICAgICAgICAgICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gaGFuZGxlck9iai5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2lsbCB0aGVyZSBiZSBhbnkgb3RoZXIga2luZHMgb2Ygb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbGlzdD8KLSAgICAgICAgICAgICAgICAgICAgcW5hbWVBc1N0cmluZyA9ICJOVUxMIjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZEVudHJ5LnNldFFOYW1lKHFuYW1lQXNTdHJpbmcpOwotCi0gICAgICAgICAgICAgICAgLy8gZG9uZSB3aXRoIHNldHRpbmcgdXAgdGhlIG1ldGEgZGF0YSBmb3IgdGhlIGxpc3QgZW50cnkKLSAgICAgICAgICAgICAgICAvLyBzbyBhZGQgaXQgdG8gdGhlIHBhcmVudAotICAgICAgICAgICAgICAgIG1kUGhhc2UuYWRkVG9MaXN0KG1kRW50cnkpOwotCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKGdldExvZ0lEU3RyaW5nKCkgKyAiOnNldHVwUGhhc2VMaXN0KCk6IGxpc3QgZW50cnkgY2xhc3MgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iakNsYXNzICsgIl0gcW5hbWUgWyIgKyBxbmFtZUFzU3RyaW5nICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlIGVudHJpZXMgaW4gbGlzdAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYSBsaXN0IHdpdGggbm8gZW50cmllcwotICAgICAgICAgICAgLy8gZG9uZSwgbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGxpc3QgaW4gdGhlIGdpdmVuIG1ldGEgZGF0YQotICAgICAgICAgICAgbWRQaGFzZS5yZW1vdmVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIFJlYWQtT25seSBjb3B5IG9mIHRoaXMgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogdGhhdCBoYXMgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0Ci0gICAgICogaGllcmFjaHkuICBJbiBvdGhlciB3b3JkcywgdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqIGNvcHkgZG9lcyBub3QgaGF2ZSBsaW5rcyB0byB0aGUgb2JqZWN0IGdyYXBoLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUaGUgY29weSBzaGFyZXMgY2VydGFpbiBvYmplY3RzIHdpdGggdGhlIG9yaWdpbmFsLgotICAgICAqIFRoZSBpbnRlbnQgaXMgdG8gdXNlIHRoZSBjb3B5IHRvIHJlYWQgdmFsdWVzIGJ1dCBub3QKLSAgICAgKiBtb2RpZnkgdGhlbSwgZXNwZWNpYWxseSBzaW5jZSB0aGUgY29weSBpcyBub3QgcGFydAotICAgICAqIG9mIHRoZSBub3JtYWwgKkNvbnRleHQgYW5kIEF4aXMqIG9iamVjdCBncmFwaC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBjb3B5IG9mIHRoZSBtZXNzYWdlIGNvbnRleHQgdGhhdCBpcyBub3QgaW4gdGhlIG9iamVjdCBncmFwaAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBleHRyYWN0Q29weU1lc3NhZ2VDb250ZXh0KCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBjb3B5ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gZ2V0TG9nSURTdHJpbmcoKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShsb2dDb3JyZWxhdGlvbklEU3RyaW5nICsgIjpleHRyYWN0Q29weU1lc3NhZ2VDb250ZXh0KCk6ICBiYXNlZCBvbiAiICsKLSAgICAgICAgICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyArICIgICBpbnRvIGNvcHkgIiArIGNvcHkuZ2V0TG9nSURTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBjb3B5LnNldEZMT1coRkxPVyk7Ci0KLSAgICAgICAgY29weS5zZXRQcm9jZXNzaW5nRmF1bHQocHJvY2Vzc2luZ0ZhdWx0KTsKLSAgICAgICAgY29weS5zZXRQYXVzZWQocGF1c2VkKTsKLSAgICAgICAgY29weS5zZXRPdXRwdXRXcml0dGVuKG91dHB1dFdyaXR0ZW4pOwotICAgICAgICBjb3B5LnNldE5ld1RocmVhZFJlcXVpcmVkKG5ld1RocmVhZFJlcXVpcmVkKTsKLSAgICAgICAgY29weS5zZXREb2luZ1JFU1QoZG9pbmdSRVNUKTsKLSAgICAgICAgY29weS5zZXREb2luZ01UT00oZG9pbmdNVE9NKTsKLSAgICAgICAgY29weS5zZXREb2luZ1N3QShkb2luZ1N3QSk7Ci0gICAgICAgIGNvcHkuc2V0UmVzcG9uc2VXcml0dGVuKHJlc3BvbnNlV3JpdHRlbik7Ci0gICAgICAgIGNvcHkuc2V0U2VydmVyU2lkZShzZXJ2ZXJTaWRlKTsKLQotICAgICAgICBjb3B5LnNldExhc3RUb3VjaGVkVGltZShnZXRMYXN0VG91Y2hlZFRpbWUoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbWVzc2FnZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29weS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UobG9nQ29ycmVsYXRpb25JRFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICI6ZXh0cmFjdENvcHlNZXNzYWdlQ29udGV4dCgpOiAgRXhjZXB0aW9uIGNhdWdodCB3aGVuIHNldHRpbmcgdGhlIGNvcHkgd2l0aCB0aGUgZW52ZWxvcGUiLAotICAgICAgICAgICAgICAgICAgICAgIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvcHkuc2V0QXR0YWNobWVudE1hcChhdHRhY2htZW50cyk7Ci0KLSAgICAgICAgY29weS5zZXRJc1NPQVAxMUV4cGxpY2l0KGlzU09BUDExKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBcnJheUxpc3QgZXhlY3V0aW9uQ2hhaW4KLSAgICAgICAgLy8gICAgIGhhbmRsZXIgYW5kIHBoYXNlIHJlbGF0ZWQgZGF0YQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBjb3B5LnNldEV4ZWN1dGlvbkNoYWluKGV4ZWN1dGlvbkNoYWluKTsKLQotICAgICAgICAvLyB0aGUgc2V0dGluZyBvZiB0aGUgZXhlY3V0aW9uIGNoYWluIGlzIGFjdHVhbGx5IGEgcmVzZXQKLSAgICAgICAgLy8gc28gY29weSB0aGUgaW5kaWNlcyBhZnRlciBwdXR0aW5nIGluIHRoZSBleGVjdXRpb24gY2hhaW4KLSAgICAgICAgY29weS5zZXRDdXJyZW50SGFuZGxlckluZGV4KGN1cnJlbnRIYW5kbGVySW5kZXgpOwotICAgICAgICBjb3B5LnNldEN1cnJlbnRQaGFzZUluZGV4KGN1cnJlbnRQaGFzZUluZGV4KTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBMaW5rZWRMaXN0IGV4ZWN1dGVkUGhhc2VzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGNvcHkuc2V0RXhlY3V0ZWRQaGFzZXNFeHBsaWNpdChleGVjdXRlZFBoYXNlcyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb3B0aW9ucwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBjb3B5LnNldE9wdGlvbnNFeHBsaWNpdChvcHRpb25zKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBheGlzIG9wZXJhdGlvbgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBjb3B5LnNldEF4aXNPcGVyYXRpb24obnVsbCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gb3BlcmF0aW9uIGNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgY29weS5zZXRPcGVyYXRpb25Db250ZXh0KG51bGwpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgc2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBjb3B5LnNldEF4aXNTZXJ2aWNlKG51bGwpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlQ29udGV4dElEIHN0cmluZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgY29weS5zZXRTZXJ2aWNlQ29udGV4dElEKHNlcnZpY2VDb250ZXh0SUQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlQ29udGV4dAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgY29weS5zZXRTZXJ2aWNlQ29udGV4dChudWxsKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJ2aWNlR3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgY29weS5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0KG51bGwpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VydmljZUdyb3VwQ29udGV4dElkIHN0cmluZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGNvcHkuc2V0U2VydmljZUdyb3VwQ29udGV4dElkKHNlcnZpY2VHcm91cENvbnRleHRJZCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gYXhpcyBtZXNzYWdlCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGNvcHkuc2V0QXhpc01lc3NhZ2UoYXhpc01lc3NhZ2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBjb3B5LnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ3VyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXNzaW9uIGNvbnRleHQKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgY29weS5zZXRTZXNzaW9uQ29udGV4dChzZXNzaW9uQ29udGV4dCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdHJhbnNwb3J0Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW5jb21pbmdUcmFuc3BvcnROYW1lIHN0cmluZwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBjb3B5LnNldEluY29taW5nVHJhbnNwb3J0TmFtZShpbmNvbWluZ1RyYW5zcG9ydE5hbWUpOwotCi0gICAgICAgIGNvcHkuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICBjb3B5LnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gT25seSBzZXQgdGhlIGxvY2FsIHByb3BlcnRpZXMgKGkuZS4gZG9uJ3QgdXNlIGdldFByb3BlcnRpZXMoKSkKLSAgICAgICAgY29weS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNwZWNpYWwgZGF0YQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGNvcHkuc2V0U2VsZk1hbmFnZWREYXRhTWFwRXhwbGljaXQoc2VsZk1hbmFnZWREYXRhTWFwKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgcmV0dXJuIGNvcHk7Ci0gICAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBhZGRpdGlvbmFsIHNldHRlciBtZXRob2RzIG5lZWRlZCB0byBjb3B5IHRoZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0Ci0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzU09BUDExRXhwbGljaXQoYm9vbGVhbiB0KSB7Ci0gICAgICAgIGlzU09BUDExID0gdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRlZFBoYXNlc0V4cGxpY2l0KExpbmtlZExpc3Q8SGFuZGxlcj4gaW5iKSB7Ci0gICAgICAgIGV4ZWN1dGVkUGhhc2VzID0gaW5iOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGZNYW5hZ2VkRGF0YU1hcEV4cGxpY2l0KExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotICAgICAgICBzZWxmTWFuYWdlZERhdGFNYXAgPSBtYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9uc0V4cGxpY2l0KE9wdGlvbnMgb3ApIHsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3A7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgbmVlZGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhpcwotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYmVmb3JlIGFjY2Vzc2luZyBjZXJ0YWluIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RuYW1lIFRoZSBtZXRob2Qgd2hlcmUgdGhlIHdhcm5pbmcgb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZhdGVXYXJuaW5nKFN0cmluZyBtZXRob2RuYW1lKSB7Ci0gICAgICAgIGlmIChuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oZ2V0TG9nSURTdHJpbmcoKSArICI6IiArIG1ldGhvZG5hbWUgKyAiKCk6ICoqKipXQVJOSU5HKioqKiAiICsgbXlDbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgICAiLmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KSBuZWVkcyB0byBiZSBpbnZva2VkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldFJvb3RDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRFbnZlbG9wZSgpLmhhc0ZhdWx0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBXaGF0IHNob3VsZCB3ZSBiZSBkb2luZyBoZXJlPyAgTm8gZW52ZWxvcGUgY2VydGFpbmx5IHNlZW1zIGJhZC4uLi4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogT2J0YWluIHRoZSBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHRoZSBwcm9jZXNzaW5nIGNoYWluIHRvIGhhbHQuCi0gICAgICogQHJldHVybiBudWxsLCBvciBhbiBFeGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEV4Y2VwdGlvbiBnZXRGYWlsdXJlUmVhc29uKCkgewotICAgICAgICByZXR1cm4gZmFpbHVyZVJlYXNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZhaWx1cmUgcmVhc29uLiAgT25seSBBeGlzRW5naW5lIHNob3VsZCBldmVyIGRvIHRoaXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmFpbHVyZVJlYXNvbiBhbiBFeGNlcHRpb24gd2hpY2ggY2F1c2VkIHByb2Nlc3NpbmcgdG8gaGFsdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlUmVhc29uKEV4Y2VwdGlvbiBmYWlsdXJlUmVhc29uKSB7Ci0gICAgICAgIHRoaXMuZmFpbHVyZVJlYXNvbiA9IGZhaWx1cmVSZWFzb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHRDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L01lc3NhZ2VDb250ZXh0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNmI2MTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvTWVzc2FnZUNvbnRleHRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VDb250ZXh0Q29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfVVJMICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVVJMID0gIlRyYW5zcG9ydFVSTCI7Ci0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzLkNIVU5LRUQgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRUQgPSAiX19DSFVOS0VEX18iOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuSFRUUF9QUk9UT0NPTF9WRVJTSU9OICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MX1ZFUlNJT04gPSAiX19IVFRQX1BST1RPQ09MX1ZFUlNJT05fXyI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZTE2OWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvT3BlcmF0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBBbiBPcGVyYXRpb25Db250ZXh0IHJlcHJlc2VudHMgYSBydW5uaW5nICJpbnN0YW5jZSIgb2YgYW4gb3BlcmF0aW9uLCB3aGljaCBpcwotICogcmVwcmVzZW50ZWQgYnkgYW4gQXhpc09wZXJhdGlvbiBvYmplY3QuIFRoaXMgY29uY2VwdCBpcyBuZWVkZWQgdG8gYWxsb3cKLSAqIG1lc3NhZ2VzIHRvIGJlIGdyb3VwZWQgaW50byBvcGVyYXRpb25zIGFzIGluIFdTREwgMi4wLXNwZWFrIG9wZXJhdGlvbnMgYXJlCi0gKiBlc3NlbnRpYWxseSBhcmJpdHJhcnkgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJucy4gU28gYXMgbWVzc2FnZXMgYXJlIGJlaW5nCi0gKiBleGNoYW5nZWQgdGhlIE9wZXJhdGlvbkNvbnRleHQgcmVtZW1iZXJzIHRoZSBzdGF0ZSBvZiB3aGVyZSBpbiB0aGUgbWVzc2FnZQotICogZXhjaGFuZ2UgcGF0dGVybiBpdCBpcyBpbi4KLSAqIDxwLz4KLSAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIE9wZXJhdGlvbkNvbnRleHQKLSAqIHN1cHBvcnRzIE1FUHMgd2hpY2ggaGF2ZSBvbmUgaW5wdXQgbWVzc2FnZSBhbmQvb3Igb25lIG91dHB1dCBtZXNzYWdlLiBUaGF0Ci0gKiBpcywgaXQgc3VwcG9ydHMgdGhlIGFsbCB0aGUgTUVQcyB0aGF0IGFyZSBpbiB0aGUgV1NETCAyLjAgc3BlY2lmaWNhdGlvbi4gSW4KLSAqIG9yZGVyIHRvIHN1cHBvcnQgYW5vdGhlciBNRVAgb25lIG11c3QgZXh0ZW5kIHRoaXMgY2xhc3MgYW5kIHJlZ2lzdGVyIGl0cwotICogY3JlYXRpb24gaW4gdGhlIE9wZXJhdGlvbkNvbnRleEZhY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25Db250ZXh0IGV4dGVuZHMgQWJzdHJhY3RDb250ZXh0IAotICAgIGltcGxlbWVudHMgRXh0ZXJuYWxpemFibGUsIFNhZmVTZXJpYWxpemFibGUgewotCi0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPcGVyYXRpb25Db250ZXh0LmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBteUNsYXNzTmFtZSA9ICJPcGVyYXRpb25Db250ZXh0IjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z0VuYWJsZWQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTcyNjQ3ODI3NzgzMzM1NTQzNTBMOwotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBUcmFja3MgdGhlIHJldmlzaW9uIGxldmVsIG9mIGEgY2xhc3MgdG8gaWRlbnRpZnkgY2hhbmdlcyB0byB0aGUKLSAgICAgKiBjbGFzcyBkZWZpbml0aW9uIHRoYXQgYXJlIGNvbXBhdGlibGUgdG8gc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24uCi0gICAgICogSWYgYSBjbGFzcyBkZWZpbml0aW9uIGNoYW5nZXMsIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSB3cml0ZUV4dGVybmFsKCkgYW5kIHJlYWRFeHRlcm5hbCgpIG1ldGhvZHMuCi0gICAgICovCi0gICAgLy8gc3VwcG9ydGVkIHJldmlzaW9uIGxldmVscywgYWRkIGEgbmV3IGxldmVsIHRvIG1hbmFnZSBjb21wYXRpYmxlIGNoYW5nZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVWSVNJT05fMiA9IDI7Ci0gICAgLy8gY3VycmVudCByZXZpc2lvbiBsZXZlbCBvZiB0aGlzIG9iamVjdAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZXZpc2lvbklEID0gUkVWSVNJT05fMjsKLQotCi0gICAgLyoqCi0gICAgICogQHNlcmlhbCBpc0NvbXBsZXRlIGZsYWcKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV0ZTsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwga2V5IHN0cmluZwotICAgICAqLwotICAgIC8vVGhlIGtleSB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uQ29udGV4dE1hcDsKLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0KLSAgICAvLyB0aGUgQXhpc09wZXJhdGlvbiBvZiB3aGljaCB0aGlzIGlzIGEgcnVubmluZyBpbnN0YW5jZS4gVGhlIE1FUCBvZiB0aGlzCi0gICAgLy8gQXhpc09wZXJhdGlvbiBtdXN0IGJlIG9uZSBvZiB0aGUgOCBwcmVkZWZpbmVkIG9uZXMgaW4gV1NETCAyLjAuCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotCi0gICAgLyoqCi0gICAgICogdGhlIHNldCBvZiBtZXNzYWdlIGNvbnRleHRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gbWVzc2FnZUNvbnRleHRzOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gTWV0YURhdGEgZm9yIGRhdGEgdG8gYmUgcmVzdG9yZWQgaW4gYWN0aXZhdGUgYWZ0ZXIgcmVhZEV4dGVybmFsCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVzc2FnZSBjb250ZXh0IGhhcyBiZWVuIHJlY29uc3RpdHV0ZWQKLSAgICAgKiBhbmQgbmVlZHMgdG8gaGF2ZSBpdHMgb2JqZWN0IHJlZmVyZW5jZXMgcmVjb25jaWxlZAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gbmVlZHNUb0JlUmVjb25jaWxlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogU3VwcHJlc3NlcyB3YXJuaW5nIG1lc3NhZ2VzIGZvciBhY3RpdmF0aW9uCi0gICAgICogd2hlbiBkb2luZyBpbnRlcm5hbCByZWNvbmNpbGlhdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gc3VwcHJlc3NXYXJuaW5ncyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIEF4aXNPcGVyYXRpb24gbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc09wZXJhdGlvbiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXhpc1NlcnZpY2UgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIFNlcnZpY2VDb250ZXh0IG1ldGFkYXRhIHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBtYXRjaCB1cCB3aXRoIGFuIGV4aXN0aW5nIG9iamVjdAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IFNlcnZpY2VDb250ZXh0IG1ldGFQYXJlbnQgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBtZXNzYWdlIGNvbnRleHQgb2JqZWN0cwotICAgICAqIHRoYXQgYXJlIGluIHRoZSBtZXNzYWdlQ29udGV4dHMgbWFwLiAgVGhpcyBhbGxvd3MgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogb2JqZWN0cyB0byBiZSBpc29sYXRlZCBmcm9tIHRoZSBvYmplY3QgZ3JhcGggc28gdGhhdCBkdXBsaWNhdGUKLSAgICAgKiBjb3BpZXMgb2Ygb2JqZWN0cyBhcmUgbm90IHNhdmVkL3Jlc3RvcmVkLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBtZXRhTWVzc2FnZUNvbnRleHRNYXAgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIGhvbGQgdGVtcG9yYXJpbHkgYW55IG1lc3NhZ2UgY29udGV4dCBvYmplY3RzCi0gICAgICogdGhhdCB3ZXJlIGlzb2xhdGVkIGZyb20gdGhlIG1lc3NhZ2VDb250ZXh0cyBtYXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgSGFzaE1hcCBpc29sYXRlZE1lc3NhZ2VDb250ZXh0cyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIHVzZWQgdG8gaG9sZCB0ZW1wb3JhcmlseSBhbnkgbWVzc2FnZSBjb250ZXh0IG9iamVjdHMKLSAgICAgKiBmcm9tIHRoZSBtZXNzYWdlQ29udGV4dHMgbWFwIGZvciBzYXZlL3Jlc3RvcmUgYWN0aXZpdGllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHRyYW5zaWVudCBIYXNoTWFwIHdvcmtpbmdTZXQgPSBudWxsOwotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gZW5kIE1ldGFEYXRhIHNlY3Rpb24KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNpbXBsZSBjb25zdHJ1Y3RvciAobmVlZGVkIGZvciBkZXNlcmlhbGl6YXRpb24sIHNob3VsZG4ndCBiZSB1c2VkIG90aGVyd2lzZSEpCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUNvbnRleHQ+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyBPcGVyYXRpb25Db250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNPcGVyYXRpb24gIHRoZSBBeGlzT3BlcmF0aW9uIHdob3NlIHJ1bm5pbmcgaW5zdGFuY2VzJyBzdGF0ZSB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgcmVwcmVzZW50cy4KLSAgICAgKiBAcGFyYW0gc2VydmljZUNvbnRleHQgdGhlIHBhcmVudCBTZXJ2aWNlQ29udGV4dCByZXByZXNlbnRpbmcgYW55IHN0YXRlIHJlbGF0ZWQgdG8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNldCBvZiBhbGwgb3BlcmF0aW9ucyBvZiB0aGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dChBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoc2VydmljZUNvbnRleHQpOwotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUNvbnRleHQ+KCk7Ci0gICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbiA9IGF4aXNPcGVyYXRpb247Ci0gICAgICAgIHRoaXMuc2V0UGFyZW50KHNlcnZpY2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIGEgbmV3IG1lc3NhZ2UgaXMgYWRkZWQgdG8gdGhlIDxjb2RlPk1FUENvbnRleHQ8L2NvZGU+IHRoZSBsb2dpYwotICAgICAqIHNob3VsZCBiZSBpbmNsdWRlZCByZW1vdmUgdGhlIE1FUENvbnRleHQgZnJvbSB0aGUgdGFibGUgaW4gdGhlCi0gICAgICogPGNvZGU+RW5naW5lQ29udGV4dDwvY29kZT4uIEV4YW1wbGU6IElOX0lOX09VVCBBdCB0aGUgc2Vjb25kIElOCi0gICAgICogbWVzc2FnZSB0aGUgTUVQQ29udGV4dCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBBeGlzT3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCB0aGlzKTsKLSAgICAgICAgICAgIHRvdWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHBvaW50ZXJzIHRvIHRoaXMgPGNvZGU+T3BlcmF0aW9uQ29udGV4dDwvY29kZT4gaW4gdGhlCi0gICAgICogPGNvZGU+Q29uZmlndXJhdGlvbkNvbnRleHQ8L2NvZGU+J3MgT3BlcmF0aW9uQ29udGV4dE1hcCBzbyB0aGF0IHRoaXMKLSAgICAgKiA8Y29kZT5PcGVyYXRpb25Db250ZXh0PC9jb2RlPiB3aWxsIGV2ZW50dWFsbHkgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkCi0gICAgICogYWxvbmcgd2l0aCB0aGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+J3MgaXQgY29udGFpbnMuIE5vdGUgdGhhdCBpZgotICAgICAqIHRoZSBjYWxsZXIgd2FudHMgdG8gbWFrZSBzdXJlIGl0cyBzYWZlIHRvIGNsZWFuIHVwIHRoaXMgT3BlcmF0aW9uQ29udGV4dAotICAgICAqIGhlIHNob3VsZCBjYWxsIGlzQ29tcGxldGUoKSBmaXJzdC4gSG93ZXZlciwgaW4gY2FzZXMgbGlrZSBJTl9PUFRJT05BTF9PVVQKLSAgICAgKiBhbmQgT1VUX09QVElPTkFMX0lOLCBpdCBpcyBwb3NzaWJlIHRoaXMgd2lsbCBnZXQgY2FsbGVkIHdpdGhvdXQgdGhlIE1FUAotICAgICAqIGJlaW5nIGNvbXBsZXRlIGR1ZSB0byB0aGUgb3B0aW9uYWwgbmF0dXJlIG9mIHRoZSBNRVAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydiA9IGdldFNlcnZpY2VDb250ZXh0KCk7Ci0KLSAgICAgICAgaWYgKHNlcnYgIT0gbnVsbCkgewotICAgICAgICAgICAgc2Vydi5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLnVucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KGtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGF4aXNPcGVyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0QXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgaWYgKG5lZWRzVG9CZVJlY29uY2lsZWQgJiYgIXN1cHByZXNzV2FybmluZ3MgJiYgZGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIjpnZXRBeGlzT3BlcmF0aW9uKCk6ICoqKipXQVJOSU5HKioqKiBPcGVyYXRpb25Db250ZXh0LmFjdGl2YXRlKGNvbmZpZ3VyYXRpb25Db250ZXh0KSBuZWVkcyB0byBiZSBpbnZva2VkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRW5naW5lQ29udGV4dCBpbiB3aGljaCB0aGUgcGFyZW50IFNlcnZpY2VDb250ZXh0IGxpdmVzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHBhcmVudCBTZXJ2aWNlQ29udGV4dCdzIHBhcmVudCBFbmdpbmVDb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTZXJ2aWNlQ29udGV4dCkgcGFyZW50KS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlTGFiZWwKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWVzc2FnZUNvbnRleHQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChNZXNzYWdlQ29udGV4dCkgbWVzc2FnZUNvbnRleHRzLmdldChtZXNzYWdlTGFiZWwpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBpbmRpY2F0ZWQgbWVzc2FnZSBjb250ZXh0LgotICAgICAqIEV4YW1wbGUgVXNhZ2U6IFRoZSBleGNoYW5nZSBpcyBhYm9ydGVkIGFuZCB3ZSBuZWVkIHRvIAotICAgICAqIHVuZG8gdGhlIHdvcmsgYW5kIGZyZWUgcmVzb3VyY2VzLgotICAgICAqIEBwYXJhbSBsYWJlbAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZUNvbnRleHQoU3RyaW5nIGxhYmVsKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IGdldE1lc3NhZ2VDb250ZXh0KGxhYmVsKTsKLSAgICAgICAgaWYgKG1jICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cy5yZW1vdmUobWMpOwotICAgICAgICAgICAgc2V0Q29tcGxldGUoZmFsc2UpOyAKLSAgICAgICAgICAgIHRvdWNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIAotCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gZ2V0TWVzc2FnZUNvbnRleHRzKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFNlcnZpY2VDb250ZXh0IGluIHdoaWNoIHRoaXMgT3BlcmF0aW9uQ29udGV4dCBsaXZlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBwYXJlbnQgU2VydmljZUNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0IGdldFNlcnZpY2VDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gKFNlcnZpY2VDb250ZXh0KSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgTUVQIGlzIGNvbXBsZXRlLiBpLmUuIHdoZXRoZXIgYWxsIHRoZSBtZXNzYWdlcyB0aGF0Ci0gICAgICogYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUVQIGhhcyBhcnJpdmVkIGFuZCBNRVAgaXMgY29tcGxldGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQ29tcGxldGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGxldGUoYm9vbGVhbiBjb21wbGV0ZSkgewotICAgICAgICBpc0NvbXBsZXRlID0gY29tcGxldGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqIEFsc28sIG9iamVjdHMgdGhhdCByZXByZXNlbnQgInN0YXRpYyIgZGF0YSBhcmUKLSAgICAgKiBub3Qgc2F2ZWQsIGV4Y2VwdCBmb3IgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICogYWJsZSB0byBmaW5kIG1hdGNoaW5nIG9iamVjdHMgd2hlbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBvdXQud3JpdGVMb25nKGdldExhc3RUb3VjaGVkVGltZSgpKTsKLQotICAgICAgICBvdXQud3JpdGVCb29sZWFuKGlzQ29tcGxldGUpOwotICAgICAgICBvdXQud3JpdGVPYmplY3Qoa2V5KTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlVVRGKCJwcm9wZXJ0aWVzIik7ICAvLyB3cml0ZSBtYXJrZXIKLSAgICAgICAgb3V0LndyaXRlTWFwKGdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZVVURigibWV0YUF4aXNPcGVyYXRpb24iKTsgLy8gd3JpdGUgbWFya2VyCi0gICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24gPSBuZXcgTWV0YURhdGFFbnRyeShheGlzT3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24gYXhpc1NlcnZpY2UKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2F2ZSB0aGUgbWV0YSBkYXRhIGZvciB0aGUgY29ycmVzcG9uZGluZyBheGlzIHNlcnZpY2UgdG8gYmV0dGVyCi0gICAgICAgIC8vIG1hdGNoIHVwIHRoZSBheGlzIG9wZXJhdGlvbgotICAgICAgICBvdXQud3JpdGVVVEYoIm1ldGFBeGlzU2VydmljZSIpOyAvLyB3cml0ZSBtYXJrZXIKLSAgICAgICAgbWV0YUF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzT3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGFBeGlzU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZXRhRGF0YUVudHJ5KGF4aXNTZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChtZXRhQXhpc1NlcnZpY2UpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBhcmVudAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVVVEYoInBhcmVudCIpOyAvLyB3cml0ZSBtYXJrZXIKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHRoaXMuZ2V0U2VydmljZUNvbnRleHQoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gSGFzaE1hcCBtZXNzYWdlQ29udGV4dHMgdGFibGUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBOT1RFUzogVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgdGFibGUgY29udGFpbnMgbWVzc2FnZSBjb250ZXh0cwotICAgICAgICAvLyB0aGF0IGFyZSBpbiB0aGUgT3BlcmF0aW9uQ29udGV4dCBoaWVyYXJjaHkuICBUbyByZWR1Y2Ugb3ZlcmxhcAotICAgICAgICAvLyBvZiBvYmplY3QgaW5mb3JtYXRpb24gdGhhdCBpcyBiZWluZyBzYXZlZCwgZXh0cmFjdCB0aGUKLSAgICAgICAgLy8gbWVzc2FnZSBjb250ZXh0IG9iamVjdHMgZnJvbSB0aGUgaGllcmFjaHkgYmVmb3JlIHNhdmluZy4KLSAgICAgICAgLy8gV2hlbiB0aGUgT3BlcmF0aW9uQ29udGV4dCBpcyByZXN0b3JlZCwgdGhlICJzbGltbWVkIGRvd24iCi0gICAgICAgIC8vIG1lc3NhZ2UgY29udGV4dCBvYmplY3RzIGFyZSBwbHVnZ2VkIGJhY2sgaW50byB0aGUgaGllcmFjaHkKLSAgICAgICAgLy8gdXNpbmcgdGhlIHJlc3RvcmVkIE9wZXJhdGlvbkNvbnRleHQgYXMgYSBiYXNpcy4KLQotICAgICAgICAvLyBmaXJzdCBkZWFsIHdpdGggdGhlIG9yaWdpbmFsIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICBIYXNoTWFwIHRtcE1zZ0N0eE1hcCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKChtZXNzYWdlQ29udGV4dHMgIT0gbnVsbCkgJiYgKCFtZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGFibGUgb2YgdGhlIG5vbi1pc29sYXRlZCBtZXNzYWdlIGNvbnRleHRzCi0gICAgICAgICAgICB3b3JraW5nU2V0ID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIHRtcE1zZ0N0eE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgICAgIFNldCBrZXlTZXQgPSBtZXNzYWdlQ29udGV4dHMua2V5U2V0KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdEtleXMgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGl0S2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBleHBlY3QgdGhlIGtleSB0byBiZSBhIHN0cmluZwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXlPYmogPSAoU3RyaW5nKSBpdEtleXMubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBtZXNzYWdlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbGFiZWwKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCB2YWx1ZSA9IChNZXNzYWdlQ29udGV4dCkgbWVzc2FnZUNvbnRleHRzLmdldChrZXlPYmopOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRUb1dvcmtpbmdTZXQgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgbWVzc2FnZSBjb250ZXh0IHdhcyBpc29sYXRlZAotICAgICAgICAgICAgICAgIGlmIChpc29sYXRlZE1lc3NhZ2VDb250ZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgdGhlIG1lc3NhZ2UgY29udGV4dCB3YXMgcHJldmlvdXNseSBpc29sYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWVJc29sYXRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlQ29udGV4dCkgaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMuZ2V0KGtleU9iaik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUlzb2xhdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRJc29sID0gdmFsdWVJc29sYXRlZC5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZElzb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWRJc29sLmVxdWFscyh2YWx1ZS5nZXRNZXNzYWdlSUQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCB0byB3b3JraW5nIHNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9Xb3JraW5nU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWRkVG9Xb3JraW5nU2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHB1dCB0aGUgbWV0YSBkYXRhIGVudHJ5IGluIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtpbmdTZXQucHV0KGtleU9iaiwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBub3cgd2UgaGF2ZSBhIHdvcmtpbmcgc2V0Ci0KLSAgICAgICAgICAgIFNldCBrZXlTZXQyID0gd29ya2luZ1NldC5rZXlTZXQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0S2V5czIgPSBrZXlTZXQyLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdEtleXMyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0aGUga2V5IHRvIGJlIGEgc3RyaW5nCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleU9iajIgPSAoU3RyaW5nKSBpdEtleXMyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbWVzc2FnZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IGxhYmVsCi0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSAoTWVzc2FnZUNvbnRleHQpIHdvcmtpbmdTZXQuZ2V0KGtleU9iajIpOwotCi0gICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IGEgY29weSBvZiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgYmVlbiBleHRyYWN0ZWQgZnJvbSB0aGUgb2JqZWN0IGhpZXJhcmNoeQotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGNvcHlNQyA9IG1jLmV4dHJhY3RDb3B5TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBwZXJzaXN0IHRoZSBtZXNzYWdlIG9mIHRoZSBvdGhlciBtZXNzYWdlIGNvbnRleHRzCi0gICAgICAgICAgICAgICAgY29weU1DLnNldEVudmVsb3BlKG51bGwpOwotCi0gICAgICAgICAgICAgICAgLy8gcHV0IHRoZSBtb2RpZmllZCBlbnRyeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgIHRtcE1zZ0N0eE1hcC5wdXQoa2V5T2JqMiwgY29weU1DKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjp3cml0ZUV4dGVybmFsKCk6ICBnZXR0aW5nIHdvcmtpbmcgc2V0IGVudHJ5ICBrZXkgWyIgKyBrZXlPYmoyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICAgbWVzc2FnZSBjb250ZXh0IElEWyIgKyBjb3B5TUMuZ2V0TWVzc2FnZUlEKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LndyaXRlVVRGKCJtZXNzYWdlY29udGV4dHMiKTsgLy8gd3JpdGUgbWFya2VyCi0gICAgICAgIG91dC53cml0ZU1hcCh0bXBNc2dDdHhNYXApOwotICAgICAgICBvdXQud3JpdGVVVEYoIm1ldGFNZXNzYWdlQ29udGV4dE1hcCIpOwotICAgICAgICBvdXQud3JpdGVNYXAobWV0YU1lc3NhZ2VDb250ZXh0TWFwKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4gIFNvbWUgZGF0YSB3aWxsIG5lZWQgdG8gYmUgdmFsaWRhdGVkIHdoZW4KLSAgICAgKiByZXN1cnJlY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotICAgICAgICAvLyBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVzc2FnZSBjb250ZXh0IGlzIGJlaW5nCi0gICAgICAgIC8vIHJlY29uc3RpdHV0ZWQgYW5kIHdpbGwgbmVlZCB0byBoYXZlIGNlcnRhaW4gb2JqZWN0IHJlZmVyZW5jZXMKLSAgICAgICAgLy8gdG8gYmUgcmVjb25jaWxlZCB3aXRoIHRoZSBjdXJyZW50IGVuZ2luZSBzZXR1cAotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiOnJlYWRFeHRlcm5hbCgpOiAgQkVHSU4gIGJ5dGVzIGF2YWlsYWJsZSBpbiBzdHJlYW0gWyIgKwotICAgICAgICAgICAgICAgIGluLmF2YWlsYWJsZSgpICsgIl0gICIpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGxvbmcgdGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIHNldExhc3RUb3VjaGVkVGltZSh0aW1lKTsKLQotICAgICAgICBpc0NvbXBsZXRlID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAga2V5ID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgIAotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICI6cmVhZEV4dGVybmFsKCk6ICByZWFkaW5nIGlucHV0IHN0cmVhbSBmb3IgWyIgKwotICAgICAgICAgICAgICAgICAgICAgIGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgaW4ucmVhZFVURigpOyAvLyByZWFkIG1hcmtlcgotICAgICAgICBwcm9wZXJ0aWVzID0gaW4ucmVhZE1hcChuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgb3BlcmF0aW9uIG1ldGEgZGF0YQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIGF4aXNPcGVyYXRpb24gaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24gPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGF4aXMgc2VydmljZSBtZXRhIGRhdGEKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gYXhpc1NlcnZpY2UgaXMgbm90IHVzYWJsZSB1bnRpbCB0aGUgbWV0YSBkYXRhIGhhcyBiZWVuIHJlY29uY2lsZWQKLSAgICAgICAgaW4ucmVhZFVURigpOyAvLyByZWFkIG1hcmtlcgotICAgICAgICBtZXRhQXhpc1NlcnZpY2UgPSAoTWV0YURhdGFFbnRyeSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBhcmVudAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBTZXJ2aWNlQ29udGV4dCBpcyBub3QgdXNhYmxlIHVudGlsIGl0IGhhcyBiZWVuIGFjdGl2YXRlZAotICAgICAgICBpbi5yZWFkVVRGKCk7IC8vIHJlYWQgbWFya2VyCi0gICAgICAgIG1ldGFQYXJlbnQgPSAoU2VydmljZUNvbnRleHQpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBIYXNoTWFwIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHNldCB0byBlbXB0eSB1bnRpbCB0aGlzIGNhbiBiZSBhY3RpdmlhdGVkCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgd29ya2luZ1NldCA9IGluLnJlYWRIYXNoTWFwKCk7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsgLy8gcmVhZCBtYXJrZXIKLSAgICAgICAgbWV0YU1lc3NhZ2VDb250ZXh0TWFwID0gaW4ucmVhZEhhc2hNYXAoKTsKLSAgICAgICAgCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgYWRkaXRpb25hbCB3b3JrIG5lZWRzIHRvIGJlCi0gICAgICogZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgb2JqZWN0IHJlY29uc3RpdHV0aW9uLgotICAgICAqIFNvbWUgcGFydHMgb2YgdGhlIG9iamVjdCByZXN0b3JlZCBmcm9tIHRoZSByZWFkRXh0ZXJuYWwoKQotICAgICAqIGNhbm5vdCBiZSBjb21wbGV0ZWQgdW50aWwgd2UgaGF2ZSBhIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogZnJvbSB0aGUgYWN0aXZlIGVuZ2luZS4gVGhlIGNvbmZpZ3VyYXRpb25Db250ZXh0IGlzIHVzZWQKLSAgICAgKiB0byBoZWxwIHRoaXMgb2JqZWN0IHRvIHBsdWcgYmFjayBpbnRvIHRoZSBlbmdpbmUncwotICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGxveW1lbnQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYyBUaGUgY29uZmlndXJhdGlvbiBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY2MpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYW55IHdvcmsgdG8gZG8KLSAgICAgICAgaWYgKCFuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm4gcXVpY2sKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGdldCB0aGUgYXhpcyBjb25maWd1cmF0aW9uCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIFdlIHByZXZpb3VzbHkgc2F2ZWQgbWV0YUF4aXNTZXJ2aWNlOyByZXN0b3JlIGl0Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLQotICAgICAgICBpZiAobWV0YUF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gQWN0aXZhdGVVdGlscy5maW5kU2VydmljZShheGlzQ29uZmlnLCBtZXRhQXhpc1NlcnZpY2UuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlLmdldFFOYW1lQXNTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNhdmVkIG1ldGFBeGlzT3BlcmF0aW9uOyByZXN0b3JlIGl0Ci0gICAgICAgIGlmIChtZXRhQXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbiA9IEFjdGl2YXRlVXRpbHMuZmluZE9wZXJhdGlvbihheGlzU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24uZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmF4aXNPcGVyYXRpb24gPSBBY3RpdmF0ZVV0aWxzLmZpbmRPcGVyYXRpb24oYXhpc0NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNPcGVyYXRpb24uZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFBeGlzT3BlcmF0aW9uLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIHBhcmVudCBTZXJ2aWNlQ29udGV4dCBvYmplY3Qgd2FzIHNhdmVkCi0gICAgICAgIC8vIGVpdGhlciB1c2UgdGhlIHJlc3RvcmVkIG9iamVjdCBvciBzeW5jIHVwIHdpdGgKLSAgICAgICAgLy8gYW4gZXhpc3RpbmcgU2VydmljZUNvbnRleHQgb2JqZWN0Ci0gICAgICAgIGlmIChtZXRhUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIGEgY29weSBvZiB0aGUgU2VydmljZUNvbnRleHQgb2JqZWN0IGV4aXN0cyBvbiB0aGlzCi0gICAgICAgICAgICAvLyBlbmdpbmUgd2hlcmUgdGhpcyBPcGVyYXRpb25Db250ZXh0IGlzIGJlaW5nIHJlc3RvcmVkL2FjdGl2YXRlZAotICAgICAgICAgICAgLy8gaWYgc28sIHVzZSB0aGF0IG9iamVjdCBpbnN0ZWFkIG9mIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHRvIHNlcnZpY2UtbGV2ZWwKLSAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYXJlIHByZXNlcnZlZCBmb3IgZnV0dXJlIG9wZXJhdGlvbnMKLSAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBtZXRhUGFyZW50LmdldEdyb3VwTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbWV0YVBhcmVudC5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IGV4aXN0aW5nU0MgPSBudWxsOwotCi0gICAgICAgICAgICAvLyBmaXJzdCBsb29rIGZvciB0aGUgU2VydmljZUNvbnRleHQgdmlhIHRoZSBTZXJ2aWNlQ29udGV4dEdyb3VwCi0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNjLmdldFNlcnZpY2VHcm91cENvbnRleHQoZ3JvdXBOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHNnYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhpc3RpbmdTQyA9IHNnYy5maW5kU2VydmljZUNvbnRleHQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXhpc3RpbmdTQyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgY291bGRuJ3QgZmluZCB0aGUgU2VydmljZUNvbnRleHQgdmlhIHRoZSBTZXJ2aWNlQ29udGV4dEdyb3VwCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHZpYSB0aGUgc2V0IG9mIGV4aXN0aW5nIG9wZXJhdGlvbiBjb250ZXh0cwotICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgZXhpc3RpbmdPQyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYy5maW5kT3BlcmF0aW9uQ29udGV4dChnZXRPcGVyYXRpb25OYW1lKCksIHNlcnZpY2VOYW1lLCBncm91cE5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nT0MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1NDID0gKFNlcnZpY2VDb250ZXh0KSBleGlzdGluZ09DLmdldFBhcmVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nU0MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBmaW5kIGFuIGV4aXN0aW5nIFNlcnZpY2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LmFjdGl2YXRlKGNjKTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCBwYXJlbnQKLSAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmVudChtZXRhUGFyZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc3dpdGNoIG92ZXIgdG8gdGhlIGV4aXN0aW5nIG9iamVjdAotICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50KGV4aXN0aW5nU0MpOwotCi0gICAgICAgICAgICAgICAgLy8gZG8gYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlc3RvcmVkIG9iamVjdAotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBleGlzdGluZyBTZXJ2aWNlQ29udGV4dAotICAgICAgICAgICAgICAgIC8vIFNob3VsZCB0aGUgY29weSBiZSBhIG5vbi1kZXN0cnVjdGl2ZSBvbmU/ICBUaGF0IGlzLAotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHByb3BlcnRpZXMgdGFibGUgb2YgdGhlCi0gICAgICAgICAgICAgICAgLy8gZXhpc3Rpbmcgb2JqZWN0LCBzaG91bGQgdGhlIHZhbHVlIGJlIG92ZXJ3cml0dGVuIGZyb20gdGhlCi0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgb2piZWN0PyBGb3Igbm93LCB0aGUgZGVjaXNpb24gaXMgdGhhdCB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIHByZXNlcnZlZCBmb3IgYSBzYXZlZCBjb250ZXh0IG9iamVjdCBpcwotICAgICAgICAgICAgICAgIC8vIGlzIGltcG9ydGFudCB0byBiZSByZXN0b3JlZC4KLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LnB1dENvbnRleHRQcm9wZXJ0aWVzKGV4aXN0aW5nU0MsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2V0IHBhcmVudCAgdG8gbnVsbAotICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQobWV0YVBhcmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNlZWQgdGhlIG9wZXJhdGlvbiBjb250ZXh0IG1hcAotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnYgPSBnZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBhY3RpdmVDQzsKLSAgICAgICAgaWYgKHNlcnYgIT0gbnVsbCkgewotICAgICAgICAgICAgYWN0aXZlQ0MgPSBzZXJ2LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhY3RpdmVDQyA9IGNjOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gKHJlKXJlZ2lzdGVyIHRoaXMgaWYgaXQncyBhbiBvdXRib3VuZCBtZXNzYWdlCi0gICAgICAgICAgICBTdHJpbmcgbWVwU3RyaW5nID0gZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChtZXBTdHJpbmcuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkpCi0gICAgICAgICAgICAgICAgfHwgbWVwU3RyaW5nLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSkKLSAgICAgICAgICAgICAgICB8fCAoKG1lcFN0cmluZy5lcXVhbHMoV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pCi0gICAgICAgICAgICAgICAgICAgIHx8IG1lcFN0cmluZy5lcXVhbHMoV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgIWlzQ29tcGxldGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGlzIE9wZXJhdGlvbkNvbnRleHQgb2JqZWN0IGlzIHJlZ2lzdGVyZWQgaW4gdGhlIAotICAgICAgICAgICAgICAgIC8vIGxpc3QgbWFpbnRhaW5lZCBieSB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiByZWdpc3RyYXRpb25TdWNlZWRlZCA9IGFjdGl2ZUNDLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChrZXksIHRoaXMsIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cmF0aW9uU3VjZWVkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpKyAiOmFjdGl2YXRlKCk6ICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uQ29udGV4dCBrZXkgWyIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gYWxyZWFkeSBleGlzdHMgaW4gQ29uZmlndXJhdGlvbkNvbnRleHQgbWFwLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgT3BlcmF0aW9uQ29udGV4dCBbIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnRvU3RyaW5nKCkgKyAiXSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB1cGRhdGUgdGhlIG1vZGlmaWVkIGVudHJpZXMgaW4gdGhlIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gTk9URTogYW4gZW50cnkgaW4gdGhlIG1ldGFNZXNzYWdlQ29udGV4dE1hcCBtdXN0IHdhaXQKLSAgICAgICAgLy8gZm9yIGl0cyBjb3JyZXNwb25kaW5nIGFjdGl2ZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0Ci0gICAgICAgIC8vIHRvIGNhbGwgdGhpcyBvcGVyYXRpb24gY29udGV4dCBvYmplY3Qgc28gd2UgZG9uJ3QKLSAgICAgICAgLy8gbmVlZCB0byBoYW5kbGUgdGhlIG1ldGFNZXNzYWdlY29udGV4dE1hcCB0YWJsZSBoZXJlCi0KLSAgICAgICAgaWYgKCh3b3JraW5nU2V0ICE9IG51bGwpICYmICghd29ya2luZ1NldC5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICBTZXQga2V5U2V0ID0gd29ya2luZ1NldC5rZXlTZXQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0S2V5cyA9IGtleVNldC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRLZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIC8vIGV4cGVjdCB0aGUga2V5IHRvIGJlIGEgc3RyaW5nCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleU9iaiA9IChTdHJpbmcpIGl0S2V5cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG1lc3NhZ2UgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhhdCBsYWJlbAotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IHZhbHVlID0gKE1lc3NhZ2VDb250ZXh0KSB3b3JraW5nU2V0LmdldCgoT2JqZWN0KSBrZXlPYmopOwotCi0gICAgICAgICAgICAgICAgLy8gYWN0aXZhdGUgdGhhdCBvYmplY3QKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKyAiOmFjdGl2YXRlKCk6ICBrZXkgWyIgKyBrZXlPYmogKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdICBtZXNzYWdlIGlkIFsiICsgdmFsdWUuZ2V0TWVzc2FnZUlEKCkgKyAiXSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NXYXJuaW5ncyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlLmFjdGl2YXRlV2l0aE9wZXJhdGlvbkNvbnRleHQodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3MgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIGVudHJ5IGluIHRoZSAicmVhbCIgdGFibGUKLSAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgdGhlIGtleSBvciB0aGUgdmFsdWUgY291bGQgYmUgbnVsbAotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cy5wdXQoa2V5T2JqLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZSwgcmVzZXQgdGhlIGZsYWcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG5lZWRzVG9CZVJlY29uY2lsZWQgPSBmYWxzZTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElzb2xhdGUgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGNvbnRleHQgb2JqZWN0Ci0gICAgICogdG8gcHJlcGFyZSBmb3Igc2VyaWFsaXphdGlvbi4gIEluc3RlYWQgb2YKLSAgICAgKiBzYXZpbmcgdGhlIGVudGlyZSBtZXNzYWdlIGNvbnRleHQgb2JqZWN0LAotICAgICAqIGp1c3Qgc2V0dXAgc29tZSBtZXRhZGF0YSBhYm91dCB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGU6IHRoaXMgd2lsbCByZW1vdmUgdGhlIHNwZWNpZmllZAotICAgICAqIG1lc3NhZ2UgY29udGV4dCBvYmplY3QgZnJvbSB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWMgVGhlIG1lc3NhZ2UgY29udGV4dCBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpc29sYXRlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgaWYgKG1jID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHx8IChtZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBtZXNzYWdlIElEIGZyb20gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAgICBTdHJpbmcgbWVzc2FnZUlEID0gbWMuZ2V0TWVzc2FnZUlEKCk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2VJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBsb2NhdGUgaXQgd2l0aG91dCBpZGVudGlmaWNhdGlvbgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLQotICAgICAgICBJdGVyYXRvciBpdCA9IG1lc3NhZ2VDb250ZXh0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIGdldCB0aGUga2V5Ci0gICAgICAgICAgICBPYmplY3Qga2V5T2JqID0gaXQubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGtleQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWUgPSAoTWVzc2FnZUNvbnRleHQpIG1lc3NhZ2VDb250ZXh0cy5nZXQoa2V5T2JqKTsKLQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVJRCA9IHZhbHVlLmdldE1lc3NhZ2VJRCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZUlEICE9IG51bGwpICYmIHZhbHVlSUQuZXF1YWxzKG1lc3NhZ2VJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIGlucHV0IG1lc3NhZ2UgY29udGV4dCBpbiBvdXIgdGFibGUKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0YU1lc3NhZ2VDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCBhIG1ldGEgZGF0YSBlbnRyeQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUlECi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICBrZXkgdXNlZCBpbiB0aGUgb3JpZ2luYWwgaGFzaG1hcCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBub3RlOiB0aGlzIGlzIHR5cGljYWxseSBzb21ldGhpbmcgbGlrZSAiSW4iLCAiT3V0IiwgIkZhdWx0IgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhID0gbmV3IE1ldGFEYXRhRW50cnkodmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRNZXNzYWdlSUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleU9iai50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG1ldGEgZGF0YSBlbnRyeSBpbiB0aGUgbGlzdAotICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgaWYgdGhlIGVudHJ5IHdhcyBhbHJlYWR5IGluIHRoZSBsaXN0LAotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmVwbGFjZSB0aGF0IGVudHJ5Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlQ29udGV4dE1hcC5wdXQoa2V5T2JqLCBtZXRhRGF0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgY2hhbmdlIHRoZSBvcmlnaW5hbCB0YWJsZSAtIHRoZXJlJ3MgcG90ZW50aWFsbHkgbG90cyBvZiBhcmVhcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdyYWIgdGhlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgIC8vICAvLyBub3cgcmVtb3ZlIHRoZSBvcmlnaW5hbCBlbnRyeSBmcm9tIHRoZSBtZXNzYWdlQ29udGV4dHMgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgLy8gIG1lc3NhZ2VDb250ZXh0cy5yZW1vdmUoa2V5T2JqKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG9yaWdpbmFsIGVudHJ5IGluIHRoZSB0ZW1wb3JhcnkgbGlzdAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWRNZXNzYWdlQ29udGV4dHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IGlmIHRoZSBlbnRyeSB3YXMgYWxyZWFkeSBpbiB0aGUgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHJlcGxhY2UgdGhhdCBlbnRyeQotICAgICAgICAgICAgICAgICAgICBpc29sYXRlZE1lc3NhZ2VDb250ZXh0cy5wdXQoa2V5T2JqLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOmlzb2xhdGVNZXNzYWdlQ29udGV4dCgpOiAgc2V0IHVwIG1lc3NhZ2UgY29udGV4dCBpZFsiICsgdmFsdWVJRCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gIHdpdGgga2V5IFsiICsga2V5T2JqLnRvU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJdIGZyb20gbWVzc2FnZUNvbnRleHRzIHRhYmxlIHRvIHByZXBhcmUgZm9yIHNlcmlhbGl6YXRpb24uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIHNwZWNpZmllZCBNZXNzYWdlQ29udGV4dCBvYmplY3QgaW4gdGhlCi0gICAgICogdGFibGUgdXNlZCB0byBob2xkIHRoZSBtZXNzYWdlIGNvbnRleHRzIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoaXMgb3BlcmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSBjb250ZXh0IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2cpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZSBhY3RpdmF0aW9uIGhhcyBiZWVuIGRvbmUKLSAgICAgICAgaWYgKG5lZWRzVG9CZVJlY29uY2lsZWQpIHsKLSAgICAgICAgICAgIC8vIG5vcGUsIG5lZWQgdG8gZG8gdGhlIGFjdGl2YXRpb24gZmlyc3QKLSAgICAgICAgICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjpyZXN0b3JlTWVzc2FnZUNvbnRleHQoKTogKioqIFdBUk5JTkcgOiBuZWVkIHRvIGludm9rZSBhY3RpdmF0ZSgpIHByaW9yIHRvIHJlc3RvcmluZyB0aGUgTWVzc2FnZUNvbnRleHQgdG8gdGhlIGxpc3QuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG1zZ0lEID0gbXNnLmdldE1lc3NhZ2VJRCgpOwotCi0gICAgICAgIGlmIChtc2dJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2FuJ3QgaWRlbnRpZnkgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiOnJlc3RvcmVNZXNzYWdlQ29udGV4dCgpOiAqKiogV0FSTklORyA6IE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IGhhdmUgYSBtZXNzYWdlIElELiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZmlyc3QgY2hlY2sgdGhlIG1ldGFNZXNzYWdlQ29udGV4dE1hcCB0byBzZWUgaWYKLSAgICAgICAgLy8gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGNvbnRleHQgb2JqZWN0IG1hdGNoZXMgYW55Ci0gICAgICAgIC8vIG9mIHRoZSBtZXRhZGF0YSBlbnRyaWVzLgotCi0gICAgICAgIGlmICgobWV0YU1lc3NhZ2VDb250ZXh0TWFwICE9IG51bGwpICYmICghbWV0YU1lc3NhZ2VDb250ZXh0TWFwLmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0TWV0YSA9IG1ldGFNZXNzYWdlQ29udGV4dE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRNZXRhLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXlNID0gKFN0cmluZykgaXRNZXRhLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIE1ldGFEYXRhRW50cnkgdmFsdWVNID0gKE1ldGFEYXRhRW50cnkpIG1ldGFNZXNzYWdlQ29udGV4dE1hcC5nZXQoa2V5TSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlTV9JRDsKLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZU0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZU1fSUQgPSB2YWx1ZU0uZ2V0UU5hbWVBc1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtc2dJRC5lcXVhbHModmFsdWVNX0lEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gdmFsdWVNLmdldEV4dHJhTmFtZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXQgdGhlIG1lc3NhZ2UgY29udGV4dCBpbnRvIHRoZSBtZXNzYWdlQ29udGV4dHMgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0cy5wdXQobGFiZWwsIG1zZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgbWV0YWRhdGEgZnJvbSB0aGUgbWV0YWRhdGEgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlQ29udGV4dE1hcC5yZW1vdmUoa2V5TSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZShnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOnJlc3RvcmVNZXNzYWdlQ29udGV4dCgpOiAgcmVzdG9yZWQgICBsYWJlbCBbIiArIGxhYmVsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gICAgbWVzc2FnZSBJRCBbIiArIG1zZy5nZXRNZXNzYWdlSUQoKSArICJdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gcHV0IHRoZSBtc2cgZGlyZWN0bHkgaW4gdGhlIG1lc3NhZ2VDb250ZXh0cyB0YWJsZQotICAgICAgICAgICAgaWYgKChtZXNzYWdlQ29udGV4dHMgIT0gbnVsbCkgJiYgKCFtZXNzYWdlQ29udGV4dHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0TGlzdCA9IG1lc3NhZ2VDb250ZXh0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGl0TGlzdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0TGlzdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgdmFsdWUgPSAoTWVzc2FnZUNvbnRleHQpIG1lc3NhZ2VDb250ZXh0cy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlSUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSUQgPSB2YWx1ZS5nZXRNZXNzYWdlSUQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ0lELmVxdWFscyh2YWx1ZUlEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dHMucHV0KGtleSwgbXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotICAgICAgICBTdHJpbmcgb3BOYW1lID0gbnVsbDsKLQotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKHFuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcE5hbWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHNydk5hbWUgPSBudWxsOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gKFNlcnZpY2VDb250ZXh0KSBnZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgc2MgPSBtZXRhUGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNydk5hbWUgPSBzYy5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3J2TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIGdyb3VwLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmFtZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VHcm91cE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBzcnZHcm91cE5hbWUgPSBudWxsOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gKFNlcnZpY2VDb250ZXh0KSBnZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgc2MgPSBtZXRhUGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNydkdyb3VwTmFtZSA9IHNjLmdldEdyb3VwTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNydkdyb3VwTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGtleSBwYXJ0cyBvZiB0aGUgc3RhdGUgZnJvbSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIGVxdWl2YWxlbnQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscygpIG1ldGhvZCBpbgotICAgICAqIHRoYXQgdGhlIGVxdWFscygpIG1ldGhvZCBnZW5lcmFsbHkgbG9va3MgYXQgYm90aCB0aGUKLSAgICAgKiBvYmplY3QgaWRlbnRpdHkgKGxvY2F0aW9uIGluIG1lbW9yeSkgYW5kIHRoZSBvYmplY3Qgc3RhdGUKLSAgICAgKiAoZGF0YSkuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGN0eCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGlzIG9iamVjdCBpcyBlcXVpdmFsZW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgKiAgICAgICAgIHRoYXQgaXMsIGtleSBmaWVsZHMgbWF0Y2gKLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoT3BlcmF0aW9uQ29udGV4dCBjdHgpIHsKLSAgICAgICAgLy8gTk9URTogdGhlIGlucHV0IG9iamVjdCBpcyBleHBlY3RlZCB0byBleGlzdCAoaWUsIGJlIG5vbi1udWxsKQotCi0gICAgICAgIGlmICh0aGlzLmlzQ29tcGxldGUgIT0gY3R4LmlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF0aGlzLmF4aXNPcGVyYXRpb24uZXF1YWxzKGN0eC5nZXRBeGlzT3BlcmF0aW9uKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBjaGVja2luZyB0aGUgcGFyZW50IG9iamVjdHMgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgY2hlY2tpbmcgZmllbGRzIGZyb20gdGhlIHN1cGVyIGNsYXNzIGZvciBlcXVpdmFsZW5jeQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgY2FuIGJlIG91dHB1dCB0byBhIGxvZyBmaWxlIGFzIGFuIGlkZW50aWZpZXIKLSAgICAgKiAgICAgICAgIGZvciB0aGlzIG9iamVjdCBpbnN0YW5jZS4gIEl0IGlzIHN1aXRhYmxlIGZvciBtYXRjaGluZyByZWxhdGVkIGxvZwotICAgICAqICAgICAgICAgZW50cmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ0NvcnJlbGF0aW9uSURTdHJpbmcoKSB7Ci0gICAgICAgIGlmIChsb2dDb3JyZWxhdGlvbklEU3RyaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBteUNsYXNzTmFtZSArICJAIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2dDb3JyZWxhdGlvbklEU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRSb290Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L09wZXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9PcGVyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjE1Njc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L09wZXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IGZvciBPcGVyYXRpb25Db250ZXh0LgotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBXU0RMQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uQ29udGV4dCBjcmVhdGVPcGVyYXRpb25Db250ZXh0KGludCBtZXBVUkksIEF4aXNPcGVyYXRpb24gYXhpc09wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICgoV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUID09IG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICAoV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT05MWSA9PSBtZXBVUkkpCi0gICAgICAgICAgICAgICAgfHwgKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09QVElPTkFMX09VVCA9PSBtZXBVUkkpCi0gICAgICAgICAgICAgICAgfHwgKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZID09IG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICAoV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX09OTFkgPT0gbWVwVVJJKQotICAgICAgICAgICAgICAgIHx8IChXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfSU4gPT0gbWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIChXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT1BUSU9OQUxfSU4gPT0gbWVwVVJJKQotICAgICAgICAgICAgICAgIHx8IChXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfT1VUX09OTFkgPT0gbWVwVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0LmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoYXhpc09wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgidW5TdXBwb3J0ZWRNRVAiLCAiSUQgaXMgIiArIG1lcFVSSSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvUHJvcGVydHlEaWZmZXJlbmNlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Qcm9wZXJ0eURpZmZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3ZWJjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Qcm9wZXJ0eURpZmZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlCi0gKiBBYnN0cmFjdENvbnRleHQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5RGlmZmVyZW5jZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBrZXk7Ci0gICAgcHJpdmF0ZSBPYmplY3QgdmFsdWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3ZlZDsKLQotICAgIHB1YmxpYyBQcm9wZXJ0eURpZmZlcmVuY2UoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGlzUmVtb3ZlZCkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLmlzUmVtb3ZlZCA9IGlzUmVtb3ZlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlbW92ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVtb3ZlZChib29sZWFuIHJlbW92ZWQpIHsKLSAgICAgICAgaXNSZW1vdmVkID0gcmVtb3ZlZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZWxmTWFuYWdlZERhdGFNYW5hZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZWxmTWFuYWdlZERhdGFNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Mjc5MDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvU2VsZk1hbmFnZWREYXRhTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB1c2UgYnkgYSBtZXNzYWdlIGhhbmRsZXIgdG8gYWxsb3cKLSAqIGl0IHRvIHNhdmUgYW5kIHJlc3RvcmUgYW55IG1lc3NhZ2Utc3BlY2lmaWMgZGF0YS4KLSAqIDxwLz4KLSAqIEEgaGFuZGxlciBjYW4gaGF2ZSBtZXNzYWdlLXNwZWNpZmljIGRhdGEgdGhhdAotICogbmVlZHMgdG8gYmUgYXNzb2NpYXRlZCB0aGUgbWVzc2FnZSBiZWluZyBwcm9jZXNzZWQuCi0gKiBUaGUgaGFuZGxlciBjYW4ga2VlcCB0aGlzIG1lc3NhZ2Utc3BlY2lmaWMgZGF0YQotICogaW4gdGhlIE1lc3NhZ2Vjb250ZXh0IG9iamVjdCBieSBhZGRpbmcgdGhlCi0gKiBkYXRhIHRvIHRoZSB1c2VyIGRhdGEgdGFibGUgdmlhIHRoZQotICogTWVzc2FnZUNvbnRleHQgbWV0aG9kLiAgV2hlbiB0aGUgTWVzc2FnZUNvbnRleHQKLSAqIG9iamVjdCBpcyBzYXZlZCAoZm9yIGV4YW1wbGUsIHRvIHBlcnNpc3RlbnQgc3RvcmFnZSksCi0gKiBhbmQgcmVzdG9yZWQsIHRoaXMgaW50ZXJmYWNlIDxCPlNlbGZNYW5hZ2VkRGF0YU1hbmFnZXI8L0I+Ci0gKiBwcm92aWRlcyBhIHdheSBmb3IgdGhlIGhhbmRsZXIgdG8gc2F2ZSBhbmQgcmVzdG9yZQotICogdGhlIGhhbmRsZXIncyBtZXNzYWdlLXNwZWNpZmljIGRhdGEuCi0gKgotICogQHNlZSBNZXNzYWdlQ29udGV4dAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlbGZNYW5hZ2VkRGF0YU1hbmFnZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgaXMgYmVpbmcgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIEltcGxlbWVudG9ycyBhcmUgZXhwZWN0ZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBkYXRhIG9iamVjdHMgdGhleSB3aXNoCi0gICAgICogdG8gc2F2ZSBhbmQgcmV0dXJuIGl0IGluIGEgQnl0ZUFycmF5T3V0cHV0U3RyZWFtLiAgVGhpcyBkYXRhIHdpbGwKLSAgICAgKiBsYXRlciBiZSBwYXNzZWQgdG8gdGhlIGltcGxlbWVudG9yJ3MgZGVzZXJpYWxpemVTZWxmTWFuYWdlZERhdGEgbWV0aG9kIHdoZW4KLSAgICAgKiB0aGUgZGF0YSBvYmplY3QgaXMgdG8gYmUgcmVzdG9yZWQuCi0gICAgICogPHAvPgotICAgICAqIFRoZSBkYXRhIGJlaW5nIHNhdmVkIG1heSBiZSB0aGUgZGF0YSBzdG9yZWQgYnkgdGhlIGltcGxlbWVudG9yCi0gICAgICogaW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCdzIFNlbGZNYW5hZ2VkRGF0YSBsaXN0IGFuZCBtYXkgaW5jbHVkZQotICAgICAqIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgaW1wbGVtZW50b3IncyBmaWVsZHMuCi0gICAgICogTm90ZSB0aGF0IGRhdGEgc3RvcmVkIGJ5IHRoZSBpbXBsZW1lbnRvciBpbiB0aGUgTWVzc2FnZUNvbnRleHQgb2JqZWN0J3MgU2VsZk1hbmFnZWREYXRhCi0gICAgICogbGlzdCBpcyByZXRyaWV2YWJsZSBieSBjYWxsaW5nIHRoZSBNZXNzYWdlQ29udGV4dC5nZXRTZWxmTWFuYWdlZERhdGEoKSBtZXRob2QKLSAgICAgKiBmb3IgRUFDSCBrZXkvdmFsdWUgcGFpci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtYyB0aGUgTWVzc2FnZUNvbnRleHQgdGhhdCBpcyBiZWluZyBzYXZlZAotICAgICAqIEByZXR1cm4gVGhlIHNhdmVkIGRhdGEgaW4gdGhlIG91dHB1dCBzdHJlYW0uIE5vdGUgdGhhdCB0aGUKLSAgICAgKiAgICAgICAgIGZvcm1hdCBvZiB0aGUgZGF0YSBpbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBkZWZpbmVkCi0gICAgICogICAgICAgICBieSB0aGUgaW1wbGVtZW50b3IuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKE1lc3NhZ2VDb250ZXh0IG1jKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHdoZW4gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCBpcyBiZWluZyByZXN0b3JlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogSW1wbGVtZW50b3JzIHdpbGwgcmVjZWl2ZSB0aGUgZGF0YSB0aGV5IGhhZCBwcmV2aW91c2x5IHNhdmVkIGluIHRoZQotICAgICAqIHNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YSgpIG1ldGhvZC4gSW1wbGVtZW50b3JzIGFyZSByZXNwb25zaWJsZSBmb3IKLSAgICAgKiByZWNvbnN0aXR1dGluZyB0aGVpciBtZXNzYWdlLXNwZWNpZmljIGRhdGEuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBCeXRlQXJyYXlJbnB1dFN0cmVhbSBjb25zaXN0aW5nIG9mIHRoZSBkYXRhIHRoYXQgdGhpcyBoYW5kbGVyIGhhZCBwcmV2aW91c2x5IHNhdmVkCi0gICAgICogQHBhcmFtIG1jICAgdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdCBiZWluZyByZXN0b3JlZAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVNlbGZNYW5hZ2VkRGF0YShCeXRlQXJyYXlJbnB1dFN0cmVhbSBkYXRhLCBNZXNzYWdlQ29udGV4dCBtYykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgaXMgYmVpbmcgcmVzdG9yZWQgYW5kCi0gICAgICogYWZ0ZXIgdGhlIGRlc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgbWV0aG9kLgotICAgICAqIDxwLz4KLSAgICAgKiBJbXBsZW1lbnRvcnMgdXNlIHRoaXMgbWV0aG9kIHRvIHJlLWVzdGFibGlzaCB0cmFuc2llbnQgbWVzc2FnZS1zcGVjaWZpYyBkYXRhLAotICAgICAqIHBhcnRpY3VsYXJseSBpZiB0aGUgaW1wbGVtZW50b3IgZGlkIG5vdCBzYXZlIGFueSB1c2VyIGRhdGEgaW4gdGhlCi0gICAgICogc2VyaWFsaXplU2VsZk1hbmFnZWREYXRhKCkgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIG1jIHRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgYmVpbmcgcmVzdG9yZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlVHJhbnNpZW50RGF0YShNZXNzYWdlQ29udGV4dCBtYyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VDb250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZXJ2aWNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2E2ZWE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuQWN0aXZhdGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuRXh0ZXJuYWxpemVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZVNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogV2VsbCB0aGlzIGlzIG5ldmVyIGNsZWFybHkgZGVmaW5lZCwgd2hhdCBpdCBkb2VzIG9yIHRoZSBsaWZlLWN5Y2xlLgotICogU28gZG8gTk9UIHVzZSB0aGlzIGFzIGl0IG1pZ2h0IG5vdCBsaXZlIHVwIHRvIHlvdXIgZXhwZWN0YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQ29udGV4dCBleHRlbmRzIEFic3RyYWN0Q29udGV4dCAKLSAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qCi0gICAgICogc2V0dXAgZm9yIGxvZ2dpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2VydmljZUNvbnRleHQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlNlcnZpY2VDb250ZXh0IjsKLQotICAgIC8qKgotICAgICAqIEFuIElEIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvcnJlbGF0ZSBvcGVyYXRpb25zIG9uIGFuIGluc3RhbmNlIG9mCi0gICAgICogdGhpcyBvYmplY3QgaW4gdGhlIGxvZyBmaWxlcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPSBudWxsOwotCi0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI2NTYyNTI3NTAxNTczODk1N0w7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX09CSkVDVCA9ICJzZXJ2aWNlT2JqZWN0IjsKLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSOwotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgbXlFUFI7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIC8vIHRoZSBzZXJ2aWNlIGdyb3VwIGNvbnRleHQgaXMgdGhlIHNhbWUgYXMgdGhlIHBhcmVudAotICAgIHByaXZhdGUgdHJhbnNpZW50IFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dDsKLQotICAgIHByaXZhdGUgdHJhbnNpZW50IENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTaG91bGQgd2UgY2FjaGUgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dD8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGluZ09wZXJhdGlvbkNvbnRleHQ7Ci0gICAgLyoqCi0gICAgICogQSBjYWNoZSBmb3IgdGhlIGxhc3QgT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHByaXZhdGUgdHJhbnNpZW50IE9wZXJhdGlvbkNvbnRleHQgbGFzdE9wZXJhdGlvbkNvbnRleHQ7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSBhZnRlciByZWFkRXh0ZXJuYWwKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGNvbnRleHQgaGFzIGJlZW4gcmVjb25zdGl0dXRlZAotICAgICAqIGFuZCBuZWVkcyB0byBoYXZlIGl0cyBvYmplY3QgcmVmZXJlbmNlcyByZWNvbmNpbGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQXhpc1NlcnZpY2UgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIFNlcnZpY2VHcm91cENvbnRleHQgb2JqZWN0IHdpbGwgYmUgdXNlZCBkdXJpbmcKLSAgICAgKiBhY3RpdmF0ZSB0byBmaW5pc2ggaXRzIHJlc3RvcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU2VydmljZUdyb3VwQ29udGV4dCBtZXRhUGFyZW50ID0gbnVsbDsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIGVuZCBNZXRhRGF0YSBzZWN0aW9uCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBQdWJsaWMgY29uc3RydWN0b3IgKG9ubHkgaGVyZSBiZWNhdXNlIHRoaXMgY2xhc3MgaXMgRXh0ZXJuYWxpemFibGUpCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIChwYWNrYWdlIGFjY2Vzcywgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBTZXJ2aWNlR3JvdXBDb250ZXh0KQotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIHRoZSBBeGlzU2VydmljZSBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgY29udGV4dAotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBDb250ZXh0IHRoZSBwYXJlbnQgU2VydmljZUdyb3VwQ29udGV4dAotICAgICAqLwotICAgIFNlcnZpY2VDb250ZXh0KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoc2VydmljZUdyb3VwQ29udGV4dCk7Ci0gICAgICAgIHRoaXMuc2VydmljZUdyb3VwQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQ7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gKENvbmZpZ3VyYXRpb25Db250ZXh0KSBwYXJlbnQuZ2V0UGFyZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNvbnRleHQgY3JlYXRlT3BlcmF0aW9uQ29udGV4dChRTmFtZSBuYW1lKSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5hbWUpOwotICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3ApOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoQXhpc09wZXJhdGlvbiBheGlzT3ApIHsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBjdHggPSBuZXcgT3BlcmF0aW9uQ29udGV4dChheGlzT3AsIHRoaXMpOwotICAgICAgICBjb25maWdDb250ZXh0LmNvbnRleHRDcmVhdGVkKGN0eCk7Ci0gICAgICAgIHJldHVybiBjdHg7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0QXhpc1NlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgY2hlY2tBY3RpdmF0ZVdhcm5pbmcoImdldENvbmZpZ3VyYXRpb25Db250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBjb25maWdDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBDb250ZXh0IGdldFNlcnZpY2VHcm91cENvbnRleHQoKSB7Ci0gICAgICAgIGNoZWNrQWN0aXZhdGVXYXJuaW5nKCJnZXRTZXJ2aWNlR3JvdXBDb250ZXh0Iik7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCB0aGUgRVJQIGZvciBhIGdpdmVuIHNlcnZpY2UgLCBpZiB0aGUgdHJhbnNwb3J0IGlzIHByZXNlbnQgYW5kIG5vdAotICAgICAqIHJ1bm5pbmcgdGhlbiBpdCB3aWxsIGFkZCBhcyBhIGxpc3RlbmVyIHRvIExpc3RlbmVyTWFuYWdlciAsIHRoZXJlIGl0IHdpbGwKLSAgICAgKiBpbml0IHRoYXQgYW5kIHN0YXJ0IHRoZSBsaXN0ZW5lciAsIGFuZCBmaW5hbGx5IGFzayB0aGUgRVBSIGZyb20gdHJhbnNwb3J0Ci0gICAgICogZm9yIGEgZ2l2ZW4gc2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYW5zcG9ydCA6IE5hbWUgb2YgdGhlIHRyYW5zcG9ydAotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRNeUVQUihTdHJpbmcgdHJhbnNwb3J0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgYXhpc1NlcnZpY2UuaXNFbmFibGVBbGxUcmFuc3BvcnRzKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2N0eCA9IHRoaXMuY29uZmlnQ29udGV4dDsKLSAgICAgICAgaWYgKGNvbmZpZ2N0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbG0gPSBjb25maWdjdHguZ2V0TGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoIWxtLmlzTGlzdGVuZXJSdW5uaW5nKHRyYW5zcG9ydCkpIHsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyc2luID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydEluKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyc2luICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG0uYWRkTGlzdGVuZXIodHJzaW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInRyYW5zcG9ydG5vdGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbG0uaXNTdG9wcGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbG0uZ2V0RVBSZm9yU2VydmljZShheGlzU2VydmljZS5nZXROYW1lKCksIG51bGwsIHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldFRhcmdldEVQUigpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldEVQUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXRFUFIoRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0RVBSID0gdGFyZ2V0RVBSOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZSBnZXRNeUVQUigpIHsKLSAgICAgICAgaWYgKG15RVBSID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKExpc3RlbmVyTWFuYWdlci5kZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIuZGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0LmdldExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICBteUVQUiA9IGxpc3RlbmVyTWFuYWdlci5nZXRFUFJmb3JTZXJ2aWNlKGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIC8vIHdoYXQgZWxzZSBJIGNhbiBkbyAKLSAgICAgICAgICAgICAgICBteUVQUiA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG15RVBSOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE15RVBSKEVuZHBvaW50UmVmZXJlbmNlIG15RVBSKSB7Ci0gICAgICAgIHRoaXMubXlFUFIgPSBteUVQUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dCBnZXRMYXN0T3BlcmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RPcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RPcGVyYXRpb25Db250ZXh0KE9wZXJhdGlvbkNvbnRleHQgbGFzdE9wZXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5sYXN0T3BlcmF0aW9uQ29udGV4dCA9IGxhc3RPcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FjaGluZ09wZXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjYWNoaW5nT3BlcmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWNoaW5nT3BlcmF0aW9uQ29udGV4dChib29sZWFuIGNhY2hlTGFzdE9wZXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jYWNoaW5nT3BlcmF0aW9uQ29udGV4dCA9IGNhY2hlTGFzdE9wZXJhdGlvbkNvbnRleHQ7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlQ29udGV4dC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZTogdGhpcyBuYW1lIGlzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgKiBBeGlzU2VydmljZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIHN0cmluZywgb3IgbnVsbCBpZiBubyBuYW1lIGNhbiBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YUF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtZXRhQXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNlcnZpY2VHcm91cENvbnRleHQKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBTZXJ2aWNlQ29udGV4dC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgc3RyaW5nLCBvciBudWxsIGlmIG5vIG5hbWUgY2FuIGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldElkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWV0YVBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0YVBhcmVudC5nZXRJZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICogRXh0ZXJuYWxpemFibGUgc3VwcG9ydCAKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKi8KLQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRyYW5zaWVudCBmaWVsZHMgYW5kIHN0YXRpYyBmaWVsZHMgYXJlIG5vdCBzYXZlZC4KLSAgICAgKiBBbHNvLCBvYmplY3RzIHRoYXQgcmVwcmVzZW50ICJzdGF0aWMiIGRhdGEgYXJlCi0gICAgICogbm90IHNhdmVkLCBleGNlcHQgZm9yIGVub3VnaCBpbmZvcm1hdGlvbiB0byBiZQotICAgICAqIGFibGUgdG8gZmluZCBtYXRjaGluZyBvYmplY3RzIHdoZW4gdGhlIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IGlzIHJlLWNvbnN0aXR1dGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZSAKLSAgICAgICAgLy8gY29udGV4dCBkZWZpbml0aW9uLCBiZSBzdXJlIHRvIG1haW50YWluIHRoZSAKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBvdXQud3JpdGVMb25nKGdldExhc3RUb3VjaGVkVGltZSgpKTsKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihjYWNoaW5nT3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUgotICAgICAgICBvdXQud3JpdGVPYmplY3QodGFyZ2V0RVBSKTsKLSAgICAgICAKLSAgICAgICAgLy8gRW5kcG9pbnRSZWZlcmVuY2UgbXlFUFIKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG15RVBSKTsKLSAgICAgICAgCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlTWFwKGdldFByb3BlcnRpZXMoKSk7Ci0gICAgICAgIAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBeGlzU2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBtZXRhQXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGFEYXRhRW50cnkoYXhpc1NlcnZpY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1ldGFBeGlzU2VydmljZSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGFyZW50IAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVPYmplY3QoZ2V0UGFyZW50KCkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IHNhdmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUaGUgZmllbGQgZGF0YSBtdXN0IHJlYWQgYmFjayBpbiB0aGUgc2FtZSBvcmRlciBhbmQgdHlwZQotICAgICAqIGFzIGl0IHdhcyB3cml0dGVuLiAgU29tZSBkYXRhIHdpbGwgbmVlZCB0byBiZSB2YWxpZGF0ZWQgd2hlbgotICAgICAqIHJlc3VycmVjdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIFRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgb2JqZWN0IGNvbnRlbnRzIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9iamVjdCk7Ci0gICAgICAgIC8vIHNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZXNzYWdlIGNvbnRleHQgaXMgYmVpbmcKLSAgICAgICAgLy8gcmVjb25zdGl0dXRlZCBhbmQgd2lsbCBuZWVkIHRvIGhhdmUgY2VydGFpbiBvYmplY3QgcmVmZXJlbmNlcyAKLSAgICAgICAgLy8gdG8gYmUgcmVjb25jaWxlZCB3aXRoIHRoZSBjdXJyZW50IGVuZ2luZSBzZXR1cAotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIEJFR0lOICBieXRlcyBhdmFpbGFibGUgaW4gc3RyZWFtIFsiICsKLSAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGxvbmcgdGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIHNldExhc3RUb3VjaGVkVGltZSh0aW1lKTsKLSAgICAgICAgY2FjaGluZ09wZXJhdGlvbkNvbnRleHQgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICBsb2dDb3JyZWxhdGlvbklEU3RyaW5nID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiOnJlYWRFeHRlcm5hbCgpOiAgcmVhZGluZyBpbnB1dCBzdHJlYW0gZm9yIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkrICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUgotICAgICAgICB0YXJnZXRFUFIgPSAoRW5kcG9pbnRSZWZlcmVuY2UpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLyBFbmRwb2ludFJlZmVyZW5jZSBteUVQUgotICAgICAgICBteUVQUiA9IChFbmRwb2ludFJlZmVyZW5jZSkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgcHJvcGVydGllcyA9IGluLnJlYWRNYXAobmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBBeGlzU2VydmljZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIGF4aXNTZXJ2aWNlIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIG1ldGFBeGlzU2VydmljZSA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGFyZW50IAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFNlcnZpY2VHcm91cENvbnRleHQgaXMgbm90IHVzYWJsZSB1bnRpbCBpdCBoYXMgYmVlbiBhY3RpdmF0ZWQgCi0gICAgICAgIG1ldGFQYXJlbnQgPSAoU2VydmljZUdyb3VwQ29udGV4dCkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG90aGVyCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gY3VycmVudGx5IG5vdCBzYXZpbmcgdGhpcyBvYmplY3QKLSAgICAgICAgbGFzdE9wZXJhdGlvbkNvbnRleHQgPSBudWxsOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgaWYgYWRkaXRpb25hbCB3b3JrIG5lZWRzIHRvIGJlCi0gICAgICogZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgb2JqZWN0IHJlY29uc3RpdHV0aW9uLgotICAgICAqIFNvbWUgcGFydHMgb2YgdGhlIG9iamVjdCByZXN0b3JlZCBmcm9tIHRoZSByZWFkRXh0ZXJuYWwoKQotICAgICAqIGNhbm5vdCBiZSBjb21wbGV0ZWQgdW50aWwgd2UgaGF2ZSBhIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogZnJvbSB0aGUgYWN0aXZlIGVuZ2luZS4gVGhlIGNvbmZpZ3VyYXRpb25Db250ZXh0IGlzIHVzZWQKLSAgICAgKiB0byBoZWxwIHRoaXMgb2JqZWN0IHRvIHBsdWcgYmFjayBpbnRvIHRoZSBlbmdpbmUncwotICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGxveW1lbnQgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYyBUaGUgY29uZmlndXJhdGlvbiBjb250ZXh0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY2MpIHsKLSAgICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYW55IHdvcmsgdG8gZG8KLSAgICAgICAgaWYgKCFuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm4gcXVpY2sKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVzZSB0aGUgc3VwcGxpZWQgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBjYzsKLQotICAgICAgICAvLyBnZXQgdGhlIGF4aXMgY29uZmlndXJhdGlvbiAKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhQXhpc1NlcnZpY2U7IHJlc3RvcmUgaXQKLSAgICAgICAgYXhpc1NlcnZpY2UgPSBudWxsOwotCi0gICAgICAgIGlmIChtZXRhQXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBBY3RpdmF0ZVV0aWxzLmZpbmRTZXJ2aWNlKGF4aXNDb25maWcsIG1ldGFBeGlzU2VydmljZS5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2UuZ2V0UU5hbWVBc1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZSBwYXJlbnQgU2VydmljZUdyb3VwQ29udGV4dCBvYmplY3Qgd2FzIHNhdmVkCi0gICAgICAgIC8vIGVpdGhlciB1c2UgdGhlIHJlc3RvcmVkIG9iamVjdCBvciBzeW5jIHVwIHdpdGggCi0gICAgICAgIC8vIGFuIGV4aXN0aW5nIFNlcnZpY2VHcm91cENvbnRleHQgb2JqZWN0Ci0gICAgICAgIGlmIChtZXRhUGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZpbmQgb3V0IGlmIGEgY29weSBvZiB0aGUgU2VydmljZUdyb3VwQ29udGV4dCBvYmplY3QgZXhpc3RzIG9uIHRoaXMKLSAgICAgICAgICAgIC8vIGVuZ2luZSB3aGVyZSB0aGlzIFNlcnZpY2VDb250ZXh0IGlzIGJlaW5nIHJlc3RvcmVkL2FjdGl2YXRlZAotICAgICAgICAgICAgLy8gaWYgc28sIHVzZSB0aGF0IG9iamVjdCBpbnN0ZWFkIG9mIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGF0IGZ1dHVyZSBjaGFuZ2VzIHRvIGdyb3VwLWxldmVsIAotICAgICAgICAgICAgLy8gcHJvcGVydGllcyBhcmUgcHJlc2VydmVkIGZvciBmdXR1cmUgb3BlcmF0aW9ucwotICAgICAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IG1ldGFQYXJlbnQuZ2V0SWQoKTsKLQotICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBleGlzdGluZ1NHQyA9IGNjLmdldFNlcnZpY2VHcm91cENvbnRleHQoZ3JvdXBOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nU0dDID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBjb3VsZCBub3QgZmluZCBhbiBleGlzdGluZyBTZXJ2aWNlR3JvdXBDb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSByZXN0b3JlZCBvYmplY3QKLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LmFjdGl2YXRlKGNjKTsKLQotICAgICAgICAgICAgICAgIC8vIHNldCBwYXJlbnQgCi0gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJlbnQobWV0YVBhcmVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN3aXRjaCBvdmVyIHRvIHRoZSBleGlzdGluZyBvYmplY3QKLSAgICAgICAgICAgICAgICB0aGlzLnNldFBhcmVudChleGlzdGluZ1NHQyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBkbyBhIGNvcHkgb2YgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgcmVzdG9yZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGV4aXN0aW5nIFNlcnZpY2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIHRoZSBjb3B5IGJlIGEgbm9uLWRlc3RydWN0aXZlIG9uZT8gIFRoYXQgaXMsCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcHJvcGVydGllcyB0YWJsZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBvYmplY3QsIHNob3VsZCB0aGUgdmFsdWUgYmUgb3ZlcndyaXR0ZW4gZnJvbSB0aGUgCi0gICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgb2piZWN0PyBGb3Igbm93LCB0aGUgZGVjaXNpb24gaXMgdGhhdCB0aGUgc3RhdGUKLSAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBiZWVuIHByZXNlcnZlZCBmb3IgYSBzYXZlZCBjb250ZXh0IG9iamVjdCBpcwotICAgICAgICAgICAgICAgIC8vIGlzIGltcG9ydGFudCB0byBiZSByZXN0b3JlZC4KLSAgICAgICAgICAgICAgICBtZXRhUGFyZW50LnB1dENvbnRleHRQcm9wZXJ0aWVzKGV4aXN0aW5nU0dDKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2V0IHBhcmVudCB0byBudWxsCi0gICAgICAgICAgICB0aGlzLnNldFBhcmVudChtZXRhUGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoaXMgaXMgYW5vdGhlciBwb2ludGVyIHRvIG91ciBwYXJlbnQgb2JqZWN0Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQgPSAoU2VydmljZUdyb3VwQ29udGV4dCkgdGhpcy5nZXRQYXJlbnQoKTsKLQotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBhZGQgdGhlIHNlcnZpY2UgY29udGV4dCB0byB0aGUgdGFibGUKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuYWRkU2VydmljZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZSwgcmVzZXQgdGhlIGZsYWcKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG5lZWRzVG9CZVJlY29uY2lsZWQgPSBmYWxzZTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhpcyByZXN0b3JlZCBvYmplY3QgaXMgaW4gdGhlIHBhcmVudCdzIGxpc3QKLSAgICAgICAgaWYgKG1ldGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoaXMgcmVzdG9yZWQgb2JqZWN0IGlzIGluIHRoZSBwYXJlbnQncyBsaXN0Ci0gICAgICAgICAgICBtZXRhUGFyZW50LmFkZFNlcnZpY2VDb250ZXh0KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZG8gYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhpcyBjb250ZXh0IG9iamVjdAotICAgICAqIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgICAgICAgIFRoZSBTZXJ2aWNlQ29udGV4dCBvYmplY3QgdG8gaG9sZCB0aGUgbWVyZ2VkIHByb3BlcnRpZXMKLSAgICAgKiBAcGFyYW0gZG9QYXJlbnRQcm9wZXJ0aWVzIEluZGljYXRlcyB3aGV0aGVyIHRvIGdvIHVwIHRoZSBjb250ZXh0IGhpZXJhY2h5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IHRoZSBwcm9wZXJ0aWVzIGF0IGVhY2ggbGV2ZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0UHJvcGVydGllcyhTZXJ2aWNlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGRvUGFyZW50UHJvcGVydGllcykgewotICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyBvbiB0aGlzIGNvbnRleHQgb2JqZWN0Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gZ2V0UHJvcGVydGllcygpOwotCi0gICAgICAgICAgICAvLyBjb3B5IHRoZW0gdG8gdGhlIHNwZWNpZmllZCBjb250ZXh0IG9iamVjdAotICAgICAgICAgICAgY29udGV4dC5tZXJnZVByb3BlcnRpZXMocHJvcHMpOwotCi0gICAgICAgICAgICBpZiAoZG9QYXJlbnRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBteVNHQyA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG15U0dDID0gc2VydmljZUdyb3VwQ29udGV4dDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGFQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBteVNHQyA9IG1ldGFQYXJlbnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG15U0dDICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBjb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgbXlTR0MucHV0Q29udGV4dFByb3BlcnRpZXMoc2djKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIGtleSBwYXJ0cyBvZiB0aGUgc3RhdGUgZnJvbSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZgotICAgICAqIHRoaXMgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHRvIHNlZSBpZiB0aGV5IGFyZQotICAgICAqIGVxdWl2YWxlbnQuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBqYXZhLmxhbmcuT2JqZWN0LmVxdWFscygpIG1ldGhvZCBpbgotICAgICAqIHRoYXQgdGhlIGVxdWFscygpIG1ldGhvZCBnZW5lcmFsbHkgbG9va3MgYXQgYm90aCB0aGUKLSAgICAgKiBvYmplY3QgaWRlbnRpdHkgKGxvY2F0aW9uIGluIG1lbW9yeSkgYW5kIHRoZSBvYmplY3Qgc3RhdGUKLSAgICAgKiAoZGF0YSkuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGN0eAotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGlzIG9iamVjdCBpcyBlcXVpdmFsZW50IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QKLSAgICAgKiAgICAgICAgIHRoYXQgaXMsIGtleSBmaWVsZHMgbWF0Y2gKLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoU2VydmljZUNvbnRleHQgY3R4KSB7Ci0gICAgICAgIC8vIE5PVEU6IHRoZSBpbnB1dCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gZXhpc3QgKGllLCBiZSBub24tbnVsbCkKLQotICAgICAgICBpZiAoIXRoaXMuYXhpc1NlcnZpY2UuZXF1YWxzKGN0eC5nZXRBeGlzU2VydmljZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIyID0gY3R4LmdldFRhcmdldEVQUigpOwotCi0gICAgICAgIGlmICgodGhpcy50YXJnZXRFUFIgIT0gbnVsbCkgJiYgKHRhcmdldEVQUjIgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIGlmICghdGhpcy50YXJnZXRFUFIuaXNFcXVpdmFsZW50KHRhcmdldEVQUjIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLnRhcmdldEVQUiA9PSBudWxsKSAmJiAodGFyZ2V0RVBSMiA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBvYmplY3RzIGlzIG51bGwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIG15RVBSMiA9IGN0eC5nZXRNeUVQUigpOwotCi0gICAgICAgIGlmICgodGhpcy5teUVQUiAhPSBudWxsKSAmJiAobXlFUFIyICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMubXlFUFIuaXNFcXVpdmFsZW50KG15RVBSMikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubXlFUFIgPT0gbnVsbCkgJiYgKG15RVBSMiA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBvYmplY3RzIGlzIG51bGwKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoZWNraW5nIHRoZSBwYXJlbnQgb2JqZWN0cyBmb3IgZXF1aXZhbGVuY3kKLQotICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBjaGVja2luZyBmaWVsZHMgZnJvbSB0aGUgc3VwZXIgY2xhc3MgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgdGhhdCBjYW4gYmUgb3V0cHV0IHRvIGEgbG9nIGZpbGUgYXMgYW4gaWRlbnRpZmllcgotICAgICAqICAgICAgICAgZm9yIHRoaXMgb2JqZWN0IGluc3RhbmNlLiAgSXQgaXMgc3VpdGFibGUgZm9yIG1hdGNoaW5nIHJlbGF0ZWQgbG9nCi0gICAgICogICAgICAgICBlbnRyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nQ29ycmVsYXRpb25JRFN0cmluZygpIHsKLSAgICAgICAgaWYgKGxvZ0NvcnJlbGF0aW9uSURTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nQ29ycmVsYXRpb25JRFN0cmluZyA9IG15Q2xhc3NOYW1lICsgIkAiICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvZ0NvcnJlbGF0aW9uSURTdHJpbmc7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUcmFjZSBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgbmVlZGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhpcwotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgYmVmb3JlIGFjY2Vzc2luZyBjZXJ0YWluIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2RuYW1lIFRoZSBtZXRob2Qgd2hlcmUgdGhlIHdhcm5pbmcgb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWN0aXZhdGVXYXJuaW5nKFN0cmluZyBtZXRob2RuYW1lKSB7Ci0gICAgICAgIGlmIChuZWVkc1RvQmVSZWNvbmNpbGVkKSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhnZXRMb2dDb3JyZWxhdGlvbklEU3RyaW5nKCkrICI6IiArIG1ldGhvZG5hbWUgKyAiKCk6ICoqKipXQVJOSU5HKioqKiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG15Q2xhc3NOYW1lICsgIi5hY3RpdmF0ZShjb25maWd1cmF0aW9uQ29udGV4dCkgbmVlZHMgdG8gYmUgaW52b2tlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRSb290Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VHcm91cENvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1NlcnZpY2VHcm91cENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4MjMyMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZXJ2aWNlR3JvdXBDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5BY3RpdmF0ZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5FeHRlcm5hbGl6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTWV0YURhdGFFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUdyb3VwQ29udGV4dCBleHRlbmRzIEFic3RyYWN0Q29udGV4dCAKLSAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qCi0gICAgICogc2V0dXAgZm9yIGxvZ2dpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2VydmljZUdyb3VwQ29udGV4dC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiU2VydmljZUdyb3VwQ29udGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRoZSBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQgdHJhY2tzIHRoZSB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuIElmIGEgY2hhbmdlIHRvIHRoZSBjbGFzcyBpcyBtYWRlIHdoaWNoIGlzCi0gICAgICogbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24gb2YgdGhlIGNsYXNzLAotICAgICAqIHRoZW4gdGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgInNlcmlhbFZlciIgdXRpbGl0eSB0byBjb21wdXRlIGEgc2VyaWFsaXphdGlvbgotICAgICAqIHZlcnNpb24gSUQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gOTAxNDQ3MTE0NDQ3OTkyODg4NUw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRleHRNYXA7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBNZXRhRGF0YSBmb3IgZGF0YSB0byBiZSByZXN0b3JlZCBpbiBhY3RpdmF0ZSBhZnRlciByZWFkRXh0ZXJuYWwKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBtZXNzYWdlIGNvbnRleHQgaGFzIGJlZW4gcmVjb25zdGl0dXRlZAotICAgICAqIGFuZCBuZWVkcyB0byBoYXZlIGl0cyBvYmplY3QgcmVmZXJlbmNlcyByZWNvbmNpbGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBBeGlzU2VydmljZUNvbnRleHQgbWV0YWRhdGEgd2lsbCBiZSB1c2VkIGR1cmluZwotICAgICAqIGFjdGl2YXRlIHRvIG1hdGNoIHVwIHdpdGggYW4gZXhpc3Rpbmcgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgTWV0YURhdGFFbnRyeSBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IG51bGw7Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyBlbmQgTWV0YURhdGEgc2VjdGlvbgotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gc2ltcGxlIGNvbnN0cnVjdG9yCi0gICAgcHVibGljIFNlcnZpY2VHcm91cENvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBwYXJlbnQsIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlR3JvdXAgPSBheGlzU2VydmljZUdyb3VwOwotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgICAgIC8vIGluaXRpYWxseSBzZXQgdGhlIGlkIHRvIHRoZSBheGlzU2VydmljZUdyb3VwCi0gICAgICAgIGlmIChheGlzU2VydmljZUdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldElkKGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZUdyb3VwIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBjaGVja0FjdGl2YXRlV2FybmluZygiZ2V0RGVzY3JpcHRpb24iKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlR3JvdXA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzZXJ2aWNlIGNvbnRleHQuIENyZWF0ZXMgYSBuZXcgb25lIGZyb20gQXhpc1NlcnZpY2UuCi0gICAgICogVGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSBzZXJ2aWNlIGNvbnRleHQgaW5zaWRlIHNlcnZpY2VHcm91cAotICAgICAqIGNvbnRleHQgYXMgd2VsbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBBeGlzU2VydmljZSBmb3Igd2hpY2ggdG8gZ2V0IGEgY29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBTZXJ2aWNlQ29udGV4dC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBnZXRTZXJ2aWNlQ29udGV4dChBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2Uoc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkc2VydmljZWluYWdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dE1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSAoU2VydmljZUNvbnRleHQpIHNlcnZpY2VDb250ZXh0TWFwLmdldChzZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dCA9IG5ldyBTZXJ2aWNlQ29udGV4dChzZXJ2aWNlLCB0aGlzKTsKLSAgICAgICAgICAgIGdldFJvb3RDb250ZXh0KCkuY29udGV4dENyZWF0ZWQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgc2VydmljZUNvbnRleHRNYXAucHV0KHNlcnZpY2UuZ2V0TmFtZSgpLCBzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTZXJ2aWNlQ29udGV4dD4gZ2V0U2VydmljZUNvbnRleHRzKCkgewotICAgICAgICBpZiAoc2VydmljZUNvbnRleHRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZUNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VDb250ZXh0PigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dE1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ29udGV4dE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgY29udGV4dCBvYmplY3QgdG8gdGhlCi0gICAgICogbGlzdHMgb2Ygc2VydmljZSBjb250ZXh0cyBmb3IgdGhpcyBzZXJ2aWNlIGdyb3VwCi0gICAgICogY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcnZjdHggVGhlIFNlcnZpY2VDb250ZXh0IG9iamVjdCB0byBhZGQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlQ29udGV4dChTZXJ2aWNlQ29udGV4dCBzcnZjdHgpIHsKLSAgICAgICAgaWYgKHNydmN0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IHNydmN0eC5nZXRBeGlzU2VydmljZSgpOwotCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUNvbnRleHRNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZUNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VDb250ZXh0PigpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VydmljZUNvbnRleHRNYXAucHV0KGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwgc3J2Y3R4KTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHNlcnZpY2UgY29udGV4dCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBsaXN0Ci0gICAgICogb2Ygc2VydmljZSBjb250ZXh0cyBmb3IgdGhpcyBzZXJ2aWNlIGdyb3VwCi0gICAgICogY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgU2VydmljZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIFRoZSBTZXJ2aWNlQ29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUsCi0gICAgICogICAgICAgICBvciBudWxsLCBpZiBub25lIGNhbiBiZSBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ29udGV4dCBmaW5kU2VydmljZUNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRleHRNYXAuZ2V0KG5hbWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogRmluZHMgdGhlIHNlcnZpY2UgY29udGV4dCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcwotICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgQXhpc1NlcnZpY2UgZnJvbSB0aGUgbGlzdAotICAgICAqIG9mIHNlcnZpY2UgY29udGV4dHMgZm9yIHRoaXMgc2VydmljZSBncm91cAotICAgICAqIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc1NydiB0aGUgQXhpc1NlcnZpY2Ugd2hvc2UgY29udGV4dCB3ZSdyZSBsb29raW5nIGZvcgotICAgICAqIEByZXR1cm4gVGhlIFNlcnZpY2VDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgQXhpc1NlcnZpY2UKLSAgICAgKiAgICAgICAgIG9yIG51bGwsIGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0IGZpbmRTZXJ2aWNlQ29udGV4dChBeGlzU2VydmljZSBheGlzU3J2KSB7Ci0gICAgICAgIGlmIChheGlzU3J2ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VDb250ZXh0TWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRleHRNYXAuZ2V0KGF4aXNTcnYuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZG8gYSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhpcyBjb250ZXh0IG9iamVjdAotICAgICAqIHRvIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgU2VydmljZUdyb3VwQ29udGV4dCBvYmplY3QgdG8gaG9sZCB0aGUgbWVyZ2VkIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwdXRDb250ZXh0UHJvcGVydGllcyhTZXJ2aWNlR3JvdXBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgb24gdGhpcyBjb250ZXh0IG9iamVjdAotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IGdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gY29weSB0aGVtIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dCBvYmplY3QKLSAgICAgICAgICAgIGNvbnRleHQubWVyZ2VQcm9wZXJ0aWVzKHByb3BzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICogRXh0ZXJuYWxpemFibGUgc3VwcG9ydAotICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKi8KLQotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRyYW5zaWVudCBmaWVsZHMgYW5kIHN0YXRpYyBmaWVsZHMgYXJlIG5vdCBzYXZlZC4KLSAgICAgKiBBbHNvLCBvYmplY3RzIHRoYXQgcmVwcmVzZW50ICJzdGF0aWMiIGRhdGEgYXJlCi0gICAgICogbm90IHNhdmVkLCBleGNlcHQgZm9yIGVub3VnaCBpbmZvcm1hdGlvbiB0byBiZQotICAgICAqIGFibGUgdG8gZmluZCBtYXRjaGluZyBvYmplY3RzIHdoZW4gdGhlIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IGlzIHJlLWNvbnN0aXR1dGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vIHdyaXRlIG91dCBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZSAKLSAgICAgICAgLy8gY29udGV4dCBkZWZpbml0aW9uLCBiZSBzdXJlIHRvIG1haW50YWluIHRoZSAKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBvdXQud3JpdGVMb25nKGdldExhc3RUb3VjaGVkVGltZSgpKTsKLQotICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2VuZXJhdGUgYW4gSUQgdG8gdXNlIHdoZW4gdGhpcyBvYmplY3QgaXMgcmVzdG9yZWQKLSAgICAgICAgICAgIGlkID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGlkKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZU1hcChnZXRQcm9wZXJ0aWVzKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgbWV0YUF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2VHcm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IG5ldyBNZXRhRGF0YUVudHJ5KGF4aXNTZXJ2aWNlR3JvdXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QobWV0YUF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHBhcmVudCAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyB0aGUgcGFyZW50IGlzIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dCBvYmplY3QsIHdoaWNoCi0gICAgICAgIC8vIGF0IHRoaXMgdGltZSwgaXMgbm90IGJlaW5nIHNhdmVkLgotICAgICAgICAvLyBpbnN0ZWFkLCB3ZSB3aWxsIG5lZWQgdG8gcmVnaXN0ZXIgdGhpcyBTZXJ2aWNlR3JvdXBPYmplY3QKLSAgICAgICAgLy8gd2l0aCB0aGUgZXhpc3RpbmcgQ29uZmlndXJhdGlvbkNvbnRleHQgb2JqZWN0IHdoZW4KLSAgICAgICAgLy8gdGhpcyBvYmplY3QgaXMgcmVjb25zdGl0dXRlZAotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRoZSBmaWVsZCBkYXRhIG11c3QgcmVhZCBiYWNrIGluIHRoZSBzYW1lIG9yZGVyIGFuZCB0eXBlCi0gICAgICogYXMgaXQgd2FzIHdyaXR0ZW4uICBTb21lIGRhdGEgd2lsbCBuZWVkIHRvIGJlIHZhbGlkYXRlZCB3aGVuCi0gICAgICogcmVzdXJyZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gVGhlIHN0cmVhbSB0byByZWFkIHRoZSBvYmplY3QgY29udGVudHMgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW5PYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgLy8gc2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1lc3NhZ2UgY29udGV4dCBpcyBiZWluZwotICAgICAgICAvLyByZWNvbnN0aXR1dGVkIGFuZCB3aWxsIG5lZWQgdG8gaGF2ZSBjZXJ0YWluIG9iamVjdCByZWZlcmVuY2VzIAotICAgICAgICAvLyB0byBiZSByZWNvbmNpbGVkIHdpdGggdGhlIGN1cnJlbnQgZW5naW5lIHNldHVwCi0gICAgICAgIG5lZWRzVG9CZVJlY29uY2lsZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIEJFR0lOICBieXRlcyBhdmFpbGFibGUgaW4gc3RyZWFtIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGxvbmcgdGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIHNldExhc3RUb3VjaGVkVGltZSh0aW1lKTsKLSAgICAgICAgaWQgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcHJvcGVydGllcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBwcm9wZXJ0aWVzID0gaW4ucmVhZE1hcChuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCkpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIEF4aXNTZXJ2aWNlR3JvdXAKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBheGlzU2VydmljZUdyb3VwIGlzIG5vdCB1c2FibGUgdW50aWwgdGhlIG1ldGEgZGF0YSBoYXMgYmVlbiByZWNvbmNpbGVkCi0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cCA9IChNZXRhRGF0YUVudHJ5KSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gcGFyZW50IAotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIHRoZSBwYXJlbnQgaXMgdGhlIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCwgd2hpYwotICAgICAgICAvLyBhdCB0aGlzIHRpbWUsIGlzIG5vdCBiZWluZyBzYXZlZC4KLSAgICAgICAgLy8gaW5zdGVhZCwgd2Ugd2lsbCBuZWVkIHRvIHJlZ2lzdGVyIHRoaXMgU2VydmljZUdyb3VwT2JqZWN0Ci0gICAgICAgIC8vIHdpdGggdGhlIGV4aXN0aW5nIENvbmZpZ3VyYXRpb25Db250ZXh0IG9iamVjdCB3aGVuCi0gICAgICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlY29uc3RpdHV0ZWQKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvdGhlcgotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTb21lIHBhcnRzIG9mIHRoZSBvYmplY3QgcmVzdG9yZWQgZnJvbSB0aGUKLSAgICAgKiByZWFkRXh0ZXJuYWwgZGVzZXJpYWxpemF0aW9uIHdvcmsgY2Fubm90IGJlIGNvbXBsZXRlZCB1bnRpbAotICAgICAqIHdlIGhhdmUgYSBjb25maWd1cmF0aW9uQ29udGV4dC4gIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUKLSAgICAgKiBpZiBhZGRpdGlvbmFsIHdvcmsgbmVlZHMgdG8gYmUgZG9uZSBpbiBvcmRlciB0byBjb21wbGV0ZQotICAgICAqIHRoZSBvYmplY3QgcmVjb25zdGl0dXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2MgdGhlIGFjdGl2ZSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlKENvbmZpZ3VyYXRpb25Db250ZXh0IGNjKSB7Ci0gICAgICAgIC8vIHNlZSBpZiB0aGVyZSdzIGFueSB3b3JrIHRvIGRvCi0gICAgICAgIGlmICghbmVlZHNUb0JlUmVjb25jaWxlZCkgewotICAgICAgICAgICAgLy8gcmV0dXJuIHF1aWNrCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnZXQgdGhlIGF4aXMgY29uZmlndXJhdGlvbiAKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gV2UgcHJldmlvdXNseSBzYXZlZCBtZXRhQXhpc1NlcnZpY2VHcm91cDsgcmVzdG9yZSBpdAotICAgICAgICBpZiAobWV0YUF4aXNTZXJ2aWNlR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cCA9IAotICAgICAgICAgICAgICAgIEFjdGl2YXRlVXRpbHMuZmluZFNlcnZpY2VHcm91cChheGlzQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhQXhpc1NlcnZpY2VHcm91cC5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUF4aXNTZXJ2aWNlR3JvdXAuZ2V0UU5hbWVBc1N0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHBhcmVudCAKLSAgICAgICAgdGhpcy5zZXRQYXJlbnQoY2MpOwotCi0gICAgICAgIC8vIHJlZ2lzdGVyIHdpdGggdGhlIHBhcmVudAotICAgICAgICBjYy5hZGRTZXJ2aWNlR3JvdXBDb250ZXh0SW50b1NvYXBTZXNzaW9uVGFibGUodGhpcyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUsIHJlc2V0IHRoZSBmbGFnCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBuZWVkc1RvQmVSZWNvbmNpbGVkID0gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyBrZXkgcGFydHMgb2YgdGhlIHN0YXRlIGZyb20gdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YKLSAgICAgKiB0aGlzIGNsYXNzIHdpdGggdGhlIHNwZWNpZmllZCBpbnN0YW5jZSB0byBzZWUgaWYgdGhleSBhcmUKLSAgICAgKiBlcXVpdmFsZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoKSBtZXRob2QgaW4KLSAgICAgKiB0aGF0IHRoZSBlcXVhbHMoKSBtZXRob2QgZ2VuZXJhbGx5IGxvb2tzIGF0IGJvdGggdGhlCi0gICAgICogb2JqZWN0IGlkZW50aXR5IChsb2NhdGlvbiBpbiBtZW1vcnkpIGFuZCB0aGUgb2JqZWN0IHN0YXRlCi0gICAgICogKGRhdGEpLgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjdHggVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGgKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhpcyBvYmplY3QgaXMgZXF1aXZhbGVudCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0gICAgICogICAgICAgICB0aGF0IGlzLCBrZXkgZmllbGRzIG1hdGNoCi0gICAgICogICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KFNlcnZpY2VHcm91cENvbnRleHQgY3R4KSB7Ci0gICAgICAgIC8vIE5PVEU6IHRoZSBpbnB1dCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gZXhpc3QgKGllLCBiZSBub24tbnVsbCkKLQotICAgICAgICBpZiAoIXRoaXMuYXhpc1NlcnZpY2VHcm91cC5lcXVhbHMoY3R4LmdldERlc2NyaXB0aW9uKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgY3R4aWQgPSBjdHguZ2V0SWQoKTsKLQotICAgICAgICBpZiAoKHRoaXMuaWQgIT0gbnVsbCkgJiYgKGN0eGlkICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuaWQuZXF1YWxzKGN0eGlkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmlkID09IG51bGwpICYmIChjdHhpZCA9PSBudWxsKSkgewotICAgICAgICAgICAgLy8ga2VlcCBnb2luZwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbWlzbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGNoZWNraW5nIHRoZSBwYXJlbnQgb2JqZWN0cyBmb3IgZXF1aXZhbGVuY3kKLQotICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBjaGVja2luZyBmaWVsZHMgZnJvbSB0aGUgc3VwZXIgY2xhc3MgZm9yIGVxdWl2YWxlbmN5Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhY2UgYSB3YXJuaW5nIG1lc3NhZ2UsIGlmIG5lZWRlZCwgaW5kaWNhdGluZyB0aGF0IHRoaXMKLSAgICAgKiBvYmplY3QgbmVlZHMgdG8gYmUgYWN0aXZhdGVkIGJlZm9yZSBhY2Nlc3NpbmcgY2VydGFpbiBmaWVsZHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kbmFtZSBUaGUgbWV0aG9kIHdoZXJlIHRoZSB3YXJuaW5nIG9jY3VycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja0FjdGl2YXRlV2FybmluZyhTdHJpbmcgbWV0aG9kbmFtZSkgewotICAgICAgICBpZiAobmVlZHNUb0JlUmVjb25jaWxlZCkgewotICAgICAgICAgICAgbG9nLndhcm4obXlDbGFzc05hbWUgKyAiOiIgKyBtZXRob2RuYW1lICsgIigpOiAqKioqV0FSTklORyoqKiogIiArIG15Q2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICIuYWN0aXZhdGUoY29uZmlndXJhdGlvbkNvbnRleHQpIG5lZWRzIHRvIGJlIGludm9rZWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Um9vdENvbnRleHQoKSB7Ci0gICAgICAgIC8vcGFyZW50IG9mIHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IGlzIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAgICByZXR1cm4gKENvbmZpZ3VyYXRpb25Db250ZXh0KSB0aGlzLmdldFBhcmVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1Nlc3Npb25Db250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9TZXNzaW9uQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY5OGY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L1Nlc3Npb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5FeHRlcm5hbGl6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBbGwgdGhlIGVuZ2luZSBjb21wb25lbnRzIGFyZSBzdGF0ZWxlc3MgYWNyb3NzIHRoZSBleGVjdXRpb25zIGFuZCBhbGwgdGhlIHN0YXRlcyBzaG91bGQgYmUga2VwdCBpbiB0aGUKLSAqIENvbnRleHRzLCB0aGVyZSBhcmUgdGhyZWUgY29udGV4dCBHbG9iYWwsIFNlc3Npb24gYW5kIE1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uQ29udGV4dCBleHRlbmRzIEFic3RyYWN0Q29udGV4dCAKLSAgICBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTEwMDYxMDY3MzA2NzU2ODU1Nkw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRoZXNlIGNvbGxlY3Rpb25zIG5lZWQgdG8gYmUgc2F2ZWQKLSAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VDb250ZXh0PigpOwotICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+IHNlcnZpY2VHcm91cENvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+KCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjb29raWVJRDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXNzaW9uQ29udGV4dC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlNlc3Npb25Db250ZXh0IjsKLQotICAgIC8vIGN1cnJlbnQgdGltZSBvdXQgaW50ZXJ2YWwgaXMgMzAgc2Vjcy4gTmVlZCB0byBtYWtlIHRoaXMgY29uZmlndXJhYmxlCi0gICAgcHVibGljIGxvbmcgc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwgPSAzMCAqIDEwMDA7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Db250ZXh0KEFic3RyYWN0Q29udGV4dCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbkNvbnRleHQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VDb250ZXh0IGdldFNlcnZpY2VDb250ZXh0KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIHJldHVybiAoU2VydmljZUNvbnRleHQpIHNlcnZpY2VDb250ZXh0TWFwLmdldChheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2VDb250ZXh0KFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgIHNlcnZpY2VDb250ZXh0TWFwLnB1dChzZXJ2aWNlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldE5hbWUoKSwgc2VydmljZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2VHcm91cENvbnRleHQoU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBJRCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlR3JvdXBOYW1lKCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHRNYXAucHV0KHNlcnZpY2VHcm91cElELCBzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZUdyb3VwQ29udGV4dCBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KFN0cmluZyBzZXJ2aWNlR3JvdXBJRCkgewotICAgICAgICByZXR1cm4gKFNlcnZpY2VHcm91cENvbnRleHQpIHNlcnZpY2VHcm91cENvbnRleHRNYXAuZ2V0KHNlcnZpY2VHcm91cElEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZUlEKCkgewotICAgICAgICByZXR1cm4gY29va2llSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29va2llSUQoU3RyaW5nIGNvb2tpZUlEKSB7Ci0gICAgICAgIHRoaXMuY29va2llSUQgPSBjb29raWVJRDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlQ29udGV4dCBhbmQgU2VydmljZUdyb3VwQ29udGV4dCBhcmUgbm90IGdldHRpbmcgYXV0b21hdGljYWxseSBnYXJiYWdlIGNvbGxlY3RpYmxlLiBBbmQgdGhlcmUKLSAgICAgKiBpcyBubyBzcGVjaWZpYyB3YXkgZm9yIHNvbWUgb25lIHRvIGdvIGFuZCBtYWtlIGl0IGdhcmJhZ2UgY29sbGVjdGFibGUuCi0gICAgICogU28gdGhlIGN1cnJlbnQgc29sdXRpb24gaXMgdG8gbWFrZSB0aGVtIHRpbWUgb3V0LiBTbyB0aGUgbG9naWMgaXMgdGhhdCwgdGhlcmUgaXMgYSB0aW1lciB0YXNrCi0gICAgICogaW4gZWFjaCBhbmQgZXZlcnkgc2VydmljZSBncm91cCB3aGljaCB3aWxsIGNoZWNrIGZvciB0aGUgbGFzdCB0b3VjaGVkIHRpbWUuIEFuZCBpZiBpdCBoYXMgbm90Ci0gICAgICogYmVlbiB0b3VjaGVkIGZvciBzb21lIHRpbWUsIHRoZSB0aW1lciB0YXNrIHdpbGwgcmVtb3ZlIGl0IGZyb20gdGhlIG1lbW9yeS4KLSAgICAgKiBUaGUgdG91Y2hpbmcgbG9naWMgaGFwcGVucyBsaWtlIHRoaXMuIFdoZW5ldmVyIHRoZXJlIGlzIGEgY2FsbCB0byBhZGRNZXNzYWdlQ29udGV4dCBpbiB0aGUgb3BlcmF0aW9uQ29udGV4dAotICAgICAqIGl0IHdpbGwgZ28gYW5kIHVwZGF0ZSBvcGVyYXRpb25DT250ZXh0IC0+IHNlcnZpY2VDb250ZXh0IC0+IHNlcnZpY2VHcm91cENvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdG91Y2goKSB7Ci0gICAgICAgIGxhc3RUb3VjaGVkVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhcmVudC50b3VjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdFRvdWNoZWRUaW1lKCkgewotICAgICAgICByZXR1cm4gbGFzdFRvdWNoZWRUaW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvcjxTZXJ2aWNlR3JvdXBDb250ZXh0PiBnZXRTZXJ2aWNlR3JvdXBDb250ZXh0KCkgewotICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwQ29udGV4dE1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0TWFwICE9IG51bGwgJiYgIXNlcnZpY2VHcm91cENvbnRleHRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxTZXJ2aWNlR3JvdXBDb250ZXh0PiB2YWx1c2UgPSBzZXJ2aWNlR3JvdXBDb250ZXh0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodmFsdXNlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9IChTZXJ2aWNlR3JvdXBDb250ZXh0KSB2YWx1c2UubmV4dCgpOwotICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlQ29udGV4dGVzKHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFudXBTZXJ2aWNlQ29udGV4dGVzKFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICBJdGVyYXRvcjxTZXJ2aWNlQ29udGV4dD4gc2VydmljZUNvbnRlY3h0ZXMgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0cygpOwotICAgICAgICB3aGlsZSAoc2VydmljZUNvbnRlY3h0ZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IChTZXJ2aWNlQ29udGV4dCkgc2VydmljZUNvbnRlY3h0ZXMubmV4dCgpOwotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZXIuZGVzdHJveVNlcnZpY2VPYmplY3Qoc2VydmljZUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0gICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY29udGVudHMgb2YgdGhpcyBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRyYW5zaWVudCBmaWVsZHMgYW5kIHN0YXRpYyBmaWVsZHMgYXJlIG5vdCBzYXZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvIFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8gTk9URVM6IEZvciBlYWNoIGl0ZW0sIHdoZXJlIGFwcHJvcHJpYXRlLAotICAgICAgICAvLyAgICAgICAgd3JpdGUgb3V0IHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24sIElOIE9SREVSOgotICAgICAgICAvLyAgICAgICAgICAgdGhlIGNsYXNzIG5hbWUKLSAgICAgICAgLy8gICAgICAgICAgIHRoZSBhY3RpdmUgb3IgZW1wdHkgZmxhZwotICAgICAgICAvLyAgICAgICAgICAgdGhlIGRhdGEgbGVuZ3RoLCBpZiBhcHByb3ByaWF0ZQotICAgICAgICAvLyAgICAgICAgICAgdGhlIGRhdGEgICAKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIG1lc3NhZ2UgCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUgCi0gICAgICAgIC8vIG9iamVjdCBsZXZlbCBpZGVudGlmaWVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlTG9uZyhzZXJpYWxWZXJzaW9uVUlEKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gdmFyaW91cyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIG91dC53cml0ZUxvbmcoZ2V0TGFzdFRvdWNoZWRUaW1lKCkpOwotCi0gICAgICAgIG91dC53cml0ZUxvbmcoc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwpOwotICAgICAgICBvdXQud3JpdGVPYmplY3QoY29va2llSUQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlTWFwKGdldFByb3BlcnRpZXMoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gIm5lc3RlZCIKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KHBhcmVudCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNZXNzYWdlQ29udGV4dCB0aGF0IHdhcwotICAgICAqIHByZXZpb3VzbHkgc2F2ZWQuCi0gICAgICogPHAvPgotICAgICAqIE5PVEU6IFRoZSBmaWVsZCBkYXRhIG11c3QgcmVhZCBiYWNrIGluIHRoZSBzYW1lIG9yZGVyIGFuZCB0eXBlCi0gICAgICogYXMgaXQgd2FzIHdyaXR0ZW4uICBTb21lIGRhdGEgd2lsbCBuZWVkIHRvIGJlIHZhbGlkYXRlZCB3aGVuCi0gICAgICogcmVzdXJyZWN0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gVGhlIHN0cmVhbSB0byByZWFkIHRoZSBvYmplY3QgY29udGVudHMgZnJvbQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW5PYmplY3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGluT2JqZWN0KTsKLSAgICAgICAgLy8gdHJhY2UgcG9pbnQKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiOnJlYWRFeHRlcm5hbCgpOiAgQkVHSU4gIGJ5dGVzIGF2YWlsYWJsZSBpbiBzdHJlYW0gWyIgKwotICAgICAgICAgICAgICAgICAgICBpbi5hdmFpbGFibGUoKSArICJdICAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBsb25nIHRpbWUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICBzZXRMYXN0VG91Y2hlZFRpbWUodGltZSk7Ci0KLSAgICAgICAgc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICBjb29raWVJRCA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIHByb3BlcnRpZXMgPSBpbi5yZWFkTWFwKG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGUoKSk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gIm5lc3RlZCIKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBwYXJlbnQKLSAgICAgICAgcGFyZW50ID0gKEFic3RyYWN0Q29udGV4dCkgaW4ucmVhZE9iamVjdCgpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGRvbmUKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBzZXJ2aWNlQ29udGV4dE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmljZUNvbnRleHQ+KCk7Ci0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZpY2VHcm91cENvbnRleHQ+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldFJvb3RDb250ZXh0KCkgewotICAgICAgICAvLyBTZXNzaW9uIENvbnRleHQgZG9lcyBub3QgbGl2ZSB3aXRoaW4gdGhlIGhpZXJhcmNoeQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvQWN0aXZhdGVVdGlscy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvQWN0aXZhdGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VkY2ZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL0FjdGl2YXRlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemU7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1ldGFEYXRhRW50cnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotDQotLyoqDQotICogU29tZSBFeHRlcm5hbGl6ZSBvYmplY3RzIG11c3QgYmUgImFjdGl2YXRlZCIgYWZ0ZXIgdGhleSBhcmUgcmVhZC4NCi0gKiBBY3RpdmF0aW9uIG5vcm1hbGx5IGludm9sdmVzIGFzc29jaWF0aW5nIHRoZSBvYmplY3Qgd2l0aCBvYmplY3RzIGluIHRoZSBjdXJyZW50DQotICogcnVudGltZS4NCi0gKiANCi0gKiBBY3RpdmF0ZVV0aWxzIHByb3ZpZGVzIGFjdGl2YXRpb24gcmVsYXRlZCB1dGlsaXRpZXMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWN0aXZhdGVVdGlscyB7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWN0aXZhdGVVdGlscy5jbGFzcyk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUHJpdmF0ZSBDb25zdHJ1Y3Rvcg0KLSAgICAgKiBBbGwgbWV0aG9kcyBpbiBBY3RpdmF0ZVV0aWxzIGFyZSBzdGF0aWMuDQotICAgICAqLw0KLSAgICBwcml2YXRlIEFjdGl2YXRlVXRpbHMoKSB7fQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgQXhpc1NlcnZpY2VHcm91cCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKiA8cC8+DQotICAgICAqIDxCPk5vdGU8Qj4gdGhlIHNhdmVkIHNlcnZpY2UgZ3JvdXAgbWV0YSBpbmZvcm1hdGlvbiBtYXkgbm90DQotICAgICAqIG1hdGNoIHVwIHdpdGggYW55IG9mIHRoZSBzZXJ2aWNlR3JvdXBzIHRoYXQNCi0gICAgICogYXJlIGluIHRoZSBjdXJyZW50IEF4aXNDb25maWd1cmF0aW9uIG9iamVjdC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBheGlzQ29uZmlnIFRoZSBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QNCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcnBDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQ0KLSAgICAgKiBAcGFyYW0gc2VydmljZUdycE5hbWUgICAgICB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlcnZpY2UgZ3JvdXANCi0gICAgICogQHJldHVybiB0aGUgQXhpc1NlcnZpY2VHcm91cCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZUdyb3VwIGZpbmRTZXJ2aWNlR3JvdXAoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VHcnBDbGFzc05hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JwTmFtZSkgew0KLSAgICAgICAgSXRlcmF0b3IgaXRzID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlR3JvdXBzKCk7DQotDQotICAgICAgICB3aGlsZSAoaXRzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIGl0cy5uZXh0KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHRtcFNHQ2xhc3NOYW1lID0gc2VydmljZUdyb3VwLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyB0bXBTR05hbWUgPSBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOw0KLQ0KLSAgICAgICAgICAgIGlmICh0bXBTR0NsYXNzTmFtZS5lcXVhbHMoc2VydmljZUdycENsYXNzTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyB0aGUgc2VydmljZUdyb3VwTmFtZSBjYW4gYmUgbnVsbCwgc28gZWl0aGVyIGJvdGggdGhlIA0KLSAgICAgICAgICAgICAgICAvLyBzZXJ2aWNlIGdyb3VwIG5hbWVzIGFyZSBudWxsIG9yIHRoZXkgbWF0Y2gNCi0gICAgICAgICAgICAgICAgaWYgKCh0bXBTR05hbWUgPT0gbnVsbCkgJiYgKHNlcnZpY2VHcnBOYW1lID09IG51bGwpKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRtcFNHTmFtZSAhPSBudWxsKSAmJiAodG1wU0dOYW1lLmVxdWFscyhzZXJ2aWNlR3JwTmFtZSkpKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRTZXJ2aWNlR3JvdXAoKTogcmV0dXJuaW5nICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlR3JwQ2xhc3NOYW1lICsgIl0gICBbIiArIHNlcnZpY2VHcnBOYW1lICsgIl0iKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlR3JvdXA7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRTZXJ2aWNlR3JvdXAoKTogWyIgKyBzZXJ2aWNlR3JwQ2xhc3NOYW1lICsgIl0gICBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlR3JwTmFtZSArICJdICByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaW5kIHRoZSBBeGlzU2VydmljZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgVGhlIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb2JqZWN0DQotICAgICAqICAgICAgICAgICAgICAgICAgIChjb3VsZCBiZSBhIGRlcml2ZWQgY2xhc3MpDQotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAgICAgIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQ0KLSAgICAgKiBAcmV0dXJuIHRoZSBBeGlzU2VydmljZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBheGlzQ29uZmlnLmdldFNlcnZpY2VzKCk7DQotDQotICAgICAgICBJdGVyYXRvciBpdHMgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgd2hpbGUgKGl0cy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpdHMubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIFN0cmluZyB0bXBTZXJ2Q2xhc3NOYW1lID0gc2VydmljZS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBTdHJpbmcgdG1wU2Vydk5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAoKHRtcFNlcnZDbGFzc05hbWUuZXF1YWxzKHNlcnZpY2VDbGFzc05hbWUpKSAmJiAodG1wU2Vydk5hbWUuZXF1YWxzKHNlcnZpY2VOYW1lKSkpIHsNCi0gICAgICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZFNlcnZpY2UoKTogcmV0dXJuaW5nICBbIiArIHNlcnZpY2VDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgIFsiICsgc2VydmljZU5hbWUgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZFNlcnZpY2UoKTogWyIgKyBzZXJ2aWNlQ2xhc3NOYW1lICsgIl0gICBbIg0KLSAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlTmFtZSArICJdICByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaW5kIHRoZSBBeGlzT3BlcmF0aW9uIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0DQotICAgICAqIEBwYXJhbSBvcENsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb2JqZWN0DQotICAgICAqICAgICAgICAgICAgICAgICAgIChjb3VsZCBiZSBhIGRlcml2ZWQgY2xhc3MpDQotICAgICAqIEBwYXJhbSBvcFFOYW1lICAgIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uDQotICAgICAqIEByZXR1cm4gdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaWENCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsIFN0cmluZyBvcENsYXNzTmFtZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BRTmFtZSkgew0KLSAgICAgICAgSGFzaE1hcCBzZXJ2aWNlcyA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsNCi0NCi0gICAgICAgIEl0ZXJhdG9yIGl0cyA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZSAoaXRzLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0cy5uZXh0KCk7DQotDQotICAgICAgICAgICAgSXRlcmF0b3IgaXRvID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotDQotICAgICAgICAgICAgd2hpbGUgKGl0by5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRvLm5leHQoKTsNCi0NCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRtcE9wTmFtZSA9IG9wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgUU5hbWUgdG1wT3BRTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgICAgIGlmICgodG1wT3BOYW1lLmVxdWFscyhvcENsYXNzTmFtZSkpICYmICh0bXBPcFFOYW1lLmVxdWFscyhvcFFOYW1lKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZE9wZXJhdGlvbihheGlzQ2ZnKTogcmV0dXJuaW5nICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcENsYXNzTmFtZSArICJdICAgWyIgKyBvcFFOYW1lLnRvU3RyaW5nKCkgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZE9wZXJhdGlvbihheGlzQ2ZnKTogWyIgKyBvcENsYXNzTmFtZSArICJdICAgWyINCi0gICAgICAgICAgICAgICAgICAgICsgb3BRTmFtZS50b1N0cmluZygpICsgIl0gIHJldHVybmluZyAgW251bGxdIik7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIHNlcnZpY2UgICAgVGhlIEF4aXNTZXJ2aWNlIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gb3BDbGFzc05hbWUgVGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQ0KLSAgICAgKiBAcGFyYW0gb3BRTmFtZSAgICB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZXJhdGlvbg0KLSAgICAgKiBAcmV0dXJuIHRoZSBBeGlzT3BlcmF0aW9uIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGNyaXRlcmlhDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgb3BDbGFzc05hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wUU5hbWUpIHsNCi0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIEl0ZXJhdG9yIGl0byA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLQ0KLSAgICAgICAgLy8gUHJldmlvdXMgdmVyc2lvbnMgb2YgQXhpczIgZGlkbid0IHVzZSBhIG5hbWVzcGFjZSBvbiB0aGUgb3BlcmF0aW9uIG5hbWUsIHNvIHRoZXkgd291bGRuJ3QNCi0gICAgICAgIC8vIGhhdmUgZXh0ZXJuYWxpemVkIGEgbmFtZXNwYWNlLiAgSWYgdGhhdCdzIHRoZSBjYXNlLCBvbmx5IGNvbXBhcmUgdGhlIGxvY2FsUGFydCBvZiB0aGUNCi0gICAgICAgIC8vIG9wZXJhdGlvbiBuYW1lDQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gb3BRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsNCi0gICAgICAgIGJvb2xlYW4gaWdub3JlTmFtZXNwYWNlID0gZmFsc2U7DQotICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgfHwgIiIuZXF1YWxzKG5hbWVzcGFjZSkpIHsNCi0gICAgICAgICAgICBpZ25vcmVOYW1lc3BhY2UgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoaXRvLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGl0by5uZXh0KCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIHRtcE9wTmFtZSA9IG9wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgICAgICBRTmFtZSB0bXBPcFFOYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAoKHRtcE9wTmFtZS5lcXVhbHMob3BDbGFzc05hbWUpKSAmJiANCi0gICAgICAgICAgICAgICAgKChpZ25vcmVOYW1lc3BhY2UgJiYgKHRtcE9wUU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKG9wUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKSB8fCAodG1wT3BRTmFtZS5lcXVhbHMob3BRTmFtZSkpKSkpIHsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk9iamVjdFN0YXRlVXRpbHM6ZmluZE9wZXJhdGlvbihzZXJ2aWNlKTogaWdub3JlTmFtZXNwYWNlIFsiICsgaWdub3JlTmFtZXNwYWNlDQotICAgICAgICAgICAgICAgICAgICAJCSsgIl0gcmV0dXJuaW5nICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9wQ2xhc3NOYW1lICsgIl0gICBbIiArIG9wUU5hbWUudG9TdHJpbmcoKSArICJdIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRPcGVyYXRpb24oc2VydmljZSk6IGlnbm9yZU5hbWVzcGFjZSBbIiArIGlnbm9yZU5hbWVzcGFjZQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiIGNsYXNzbmFtZSBbIiArIG9wQ2xhc3NOYW1lICsgIl0gIFFOYW1lIFsiDQotICAgICAgICAgICAgICAgICAgICArIG9wUU5hbWUudG9TdHJpbmcoKSArICJdICByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEZpbmQgdGhlIEF4aXNNZXNzYWdlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gb3AgICAgICAgICAgICAgVGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0DQotICAgICAqIEBwYXJhbSBtc2dOYW1lICAgICAgICBUaGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIG1zZ0VsZW1lbnROYW1lIFRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZSBlbGVtZW50DQotICAgICAqIEByZXR1cm4gdGhlIEF4aXNNZXNzYWdlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGNyaXRlcmlhDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNNZXNzYWdlIGZpbmRNZXNzYWdlKEF4aXNPcGVyYXRpb24gb3AsIFN0cmluZyBtc2dOYW1lLCBTdHJpbmcgbXNnRWxlbWVudE5hbWUpIHsNCi0gICAgICAgIC8vIFNldmVyYWwga2luZHMgb2YgQXhpc01lc3NhZ2VzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIA0KLSAgICAgICAgLy8gQXhpc09wZXJhdGlvbi4gIFRoZSBraW5kcyBvZiBBeGlzTWVzc2FnZXMgdGhhdCBhcmUgdHlwaWNhbGx5DQotICAgICAgICAvLyBhY2Nlc3NpYmxlIGFyZSBhc3NvY2lhdGVkIHdpdGggImluIiBhbmQgIm91dCIuICANCi0gICAgICAgIC8vIFRoZXJlIGFyZSBhbHNvIGRpZmZlcmVudCBraW5kcyBvZiBBeGlzT3BlcmF0aW9ucywgYW5kIGVhY2gNCi0gICAgICAgIC8vIHR5cGUgb2YgQXhpc09wZXJhdGlvbiBjYW4gaGF2ZSBpdHMgb3duIG1peCBvZiBBeGlzTWVzc2FnZXMNCi0gICAgICAgIC8vIGRlcGVuZGluZyBvbiB0aGUgc3R5bGUgb2YgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChtZXApDQotDQotICAgICAgICBpZiAob3AgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiBbIiArIG1zZ05hbWUgKyAiXSAgWyIgKyBtc2dFbGVtZW50TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gcmV0dXJuaW5nICBbbnVsbF0gLSBubyBBeGlzT3BlcmF0aW9uIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG1zZ05hbWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gbWF0Y2ggd2l0aCwgZXhwZWN0IHRvIG1hdGNoIGFnYWluc3QgYSBuYW1lDQotICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmZpbmRNZXNzYWdlKCk6IFsiICsgbXNnTmFtZSArICJdICBbIiArIG1zZ0VsZW1lbnROYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSByZXR1cm5pbmcgIFtudWxsXSAtIG1lc3NhZ2UgbmFtZSBpcyBub3Qgc2V0Iik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLQ0KLSAgICAgICAgU3RyaW5nIHRtcE5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHRtcEVsZW1lbnROYW1lID0gbnVsbDsNCi0NCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgLy8gZmlyc3QgdHJ5IHRoZSAib3V0IiBtZXNzYWdlDQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIEF4aXNNZXNzYWdlIG91dCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG91dCA9IG9wLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAvLyBqdXN0IGFic29yYiB0aGUgZXhjZXB0aW9uDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0bXBOYW1lID0gb3V0LmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBRTmFtZSB0bXBRb3V0ID0gb3V0LmdldEVsZW1lbnRRTmFtZSgpOw0KLSAgICAgICAgICAgIGlmICh0bXBRb3V0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdG1wRWxlbWVudE5hbWUgPSB0bXBRb3V0LnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gY2hlY2sgdGhlIGNyaXRlcmlhIGZvciBhIG1hdGNoDQotDQotICAgICAgICBib29sZWFuIG1hdGNoaW5nID0gbWF0Y2hNZXNzYWdlTmFtZXModG1wTmFtZSwgdG1wRWxlbWVudE5hbWUsIG1zZ05hbWUsIG1zZ0VsZW1lbnROYW1lKTsNCi0NCi0gICAgICAgIGlmIChtYXRjaGluZykgew0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiByZXR1cm5pbmcgT1VUIG1lc3NhZ2UgIFsiICsgbXNnTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgIl0gIFsiICsgbXNnRWxlbWVudE5hbWUgKyAiXSAiKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgcmV0dXJuIG91dDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgLy8gbmV4dCwgdHJ5IHRoZSAiaW4iIG1lc3NhZ2UgDQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgIEF4aXNNZXNzYWdlIGluID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgaW4gPSBvcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAvLyBqdXN0IGFic29yYiB0aGUgZXhjZXB0aW9uDQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoaW4gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRtcE5hbWUgPSBpbi5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgUU5hbWUgdG1wUWluID0gaW4uZ2V0RWxlbWVudFFOYW1lKCk7DQotICAgICAgICAgICAgaWYgKHRtcFFpbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRtcEVsZW1lbnROYW1lID0gdG1wUWluLnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICB0bXBOYW1lID0gbnVsbDsNCi0gICAgICAgICAgICB0bXBFbGVtZW50TmFtZSA9IG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBjaGVjayB0aGUgY3JpdGVyaWEgZm9yIGEgbWF0Y2gNCi0NCi0gICAgICAgIG1hdGNoaW5nID0gbWF0Y2hNZXNzYWdlTmFtZXModG1wTmFtZSwgdG1wRWxlbWVudE5hbWUsIG1zZ05hbWUsIG1zZ0VsZW1lbnROYW1lKTsNCi0NCi0gICAgICAgIGlmIChtYXRjaGluZykgew0KLSAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiByZXR1cm5pbmcgSU4gbWVzc2FnZSBbIiArIG1zZ05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICJdICBbIiArIG1zZ0VsZW1lbnROYW1lICsgIl0gIik7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBpbjsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIGlmIHdlIGdvdCBoZXJlLCB0aGVuIG5vIG1hdGNoIHdhcyBmb3VuZA0KLQ0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kTWVzc2FnZSgpOiBbIiArIG1zZ05hbWUgKyAiXSAgWyIgKyBtc2dFbGVtZW50TmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiXSByZXR1cm5pbmcgIFtudWxsXSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBGaW5kIHRoZSBIYW5kbGVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZXhpc3RpbmdIYW5kbGVycyBUaGUgbGlzdCBvZiBleGlzdGluZyBoYW5kbGVycyBhbmQgcGhhc2VzDQotICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvYmplY3QNCi0gICAgICogICAgICAgICAgICAgICAgICAgKGNvdWxkIGJlIGEgZGVyaXZlZCBjbGFzcykNCi0gICAgICogQHJldHVybiB0aGUgSGFuZGxlciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZmluZEhhbmRsZXIoTGlzdDxIYW5kbGVyPiBleGlzdGluZ0hhbmRsZXJzLCBNZXRhRGF0YUVudHJ5IG1ldGFEYXRhRW50cnkpIC8vU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUpDQotICAgIHsNCi0NCi0gICAgICAgIFN0cmluZyB0aXRsZSA9ICJPYmplY3RTdGF0ZVV0aWxzOmZpbmRIYW5kbGVyKCk6ICI7DQotDQotICAgICAgICBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSA9IG1ldGFEYXRhRW50cnkuZ2V0Q2xhc3NOYW1lKCk7DQotICAgICAgICBTdHJpbmcgcU5hbWVBc1N0cmluZyA9IG1ldGFEYXRhRW50cnkuZ2V0UU5hbWVBc1N0cmluZygpOw0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0hhbmRsZXJzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgaWYgKGV4aXN0aW5nSGFuZGxlcnMuZ2V0KGkpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRtcENsYXNzTmFtZSA9IGV4aXN0aW5nSGFuZGxlcnMuZ2V0KGkpLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdG1wTmFtZSA9ICgoSGFuZGxlcikgZXhpc3RpbmdIYW5kbGVycy5nZXQoaSkpLmdldE5hbWUoKS50b1N0cmluZygpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoKHRtcENsYXNzTmFtZS5lcXVhbHMoaGFuZGxlckNsYXNzTmFtZSkpICYmICh0bXBOYW1lLmVxdWFscyhxTmFtZUFzU3RyaW5nKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UodGl0bGUgKyAiIFsiICsgaGFuZGxlckNsYXNzTmFtZSArICJdICBuYW1lIFsiICsgcU5hbWVBc1N0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgcmV0dXJuZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoSGFuZGxlcikgKGV4aXN0aW5nSGFuZGxlcnMuZ2V0KGkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UodGl0bGUgKyAiIFsiICsgaGFuZGxlckNsYXNzTmFtZSArICJdICBuYW1lIFsiICsgcU5hbWVBc1N0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgKyAiXSB3YXMgbm90IGZvdW5kIGluIHRoZSBleGlzdGluZ0hhbmRsZXJzIGxpc3QiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgVHJhbnNwb3J0TGlzdGVuZXIgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWENCi0gICAgICogPHAvPg0KLSAgICAgKiA8Qj5Ob3RlPEI+IHRoZSBzYXZlZCBtZXRhIGluZm9ybWF0aW9uIG1heSBub3QNCi0gICAgICogbWF0Y2ggdXAgd2l0aCBhbnkgb2YgdGhlIG9iamVjdHMgdGhhdA0KLSAgICAgKiBhcmUgaW4gdGhlIGN1cnJlbnQgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgVGhlIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdA0KLSAgICAgKiBAcGFyYW0gbGlzdGVuZXJDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdA0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQ0KLSAgICAgKiBAcmV0dXJuIHRoZSBUcmFuc3BvcnRMaXN0ZW5lciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBUcmFuc3BvcnRMaXN0ZW5lciBmaW5kVHJhbnNwb3J0TGlzdGVuZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lKSB7DQotICAgICAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSBhIGJldHRlciB0ZWNobmlxdWUgdG8gbWF0Y2ggdXAgd2l0aCBhIFRyYW5zcG9ydExpc3RlbmVyDQotDQotICAgICAgICBIYXNoTWFwIHRyYW5zcG9ydHNJbiA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0c0luKCk7DQotDQotICAgICAgICAvLyBnZXQgYSBjb2xsZWN0aW9uIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIG1hcA0KLSAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSB0cmFuc3BvcnRzSW4udmFsdWVzKCk7DQotDQotICAgICAgICBJdGVyYXRvciBpID0gdmFsdWVzLml0ZXJhdG9yKCk7DQotDQotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRpID0gKFRyYW5zcG9ydEluRGVzY3JpcHRpb24pIGkubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHRsID0gdGkuZ2V0UmVjZWl2ZXIoKTsNCi0gICAgICAgICAgICBTdHJpbmcgdGxDbGFzc05hbWUgPSB0bC5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0NCi0gICAgICAgICAgICBpZiAodGxDbGFzc05hbWUuZXF1YWxzKGxpc3RlbmVyQ2xhc3NOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAvLyB0cmFjZSBwb2ludA0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kVHJhbnNwb3J0TGlzdGVuZXIoKTogIFsiICsgbGlzdGVuZXJDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSAgcmV0dXJuZWQiKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczpmaW5kVHJhbnNwb3J0TGlzdGVuZXIoKTogcmV0dXJuaW5nICBbbnVsbF0iKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb21wYXJlcyB0aGUgdHdvIGNvbGxlY3Rpb25zIHRvIHNlZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGExICBUaGUgZmlyc3QgY29sbGVjdGlvbg0KLSAgICAgKiBAcGFyYW0gYTIgIFRoZSBzZWNvbmQgY29sbGVjdGlvbg0KLSAgICAgKiBAcGFyYW0gc3RyaWN0ICBJbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgY2hlY2tpbmcgaXMgcmVxdWlyZWQuICBTdHJpY3QNCi0gICAgICogICAgICAgICAgICAgICAgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUNCi0gICAgICogICAgICAgICAgICAgICAgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4gIE5vbi1zdHJpY3QgY2hlY2tpbmcNCi0gICAgICogICAgICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSANCi0gICAgICogICAgICAgICAgICAgICAgZWxlbWVudHMsIGJ1dCB0aGUgb3JkZXIgaXMgbm90IHNpZ25pZmljYW50Lg0KLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1aXZhbGVudA0KLSAgICAgKiAgICAgICAgIEZBTFNFLCBvdGhlcndpc2UNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoQXJyYXlMaXN0IGExLCBBcnJheUxpc3QgYTIsIGJvb2xlYW4gc3RyaWN0KSB7DQotICAgICAgICBpZiAoKGExICE9IG51bGwpICYmIChhMiAhPSBudWxsKSkgew0KLSAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiBlbGVtZW50cyBpbiBsaXN0cw0KLSAgICAgICAgICAgIGludCBzaXplMSA9IGExLnNpemUoKTsNCi0gICAgICAgICAgICBpbnQgc2l6ZTIgPSBhMi5zaXplKCk7DQotDQotICAgICAgICAgICAgaWYgKHNpemUxICE9IHNpemUyKSB7DQotICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmlzRXF1aXZhbGVudChBcnJheUxpc3QsQXJyYXlMaXN0KTogRkFMU0UgLSBzaXplIG1pc21hdGNoIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZTEgKyAiXSAhPSBbIiArIHNpemUyICsgIl0iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChzdHJpY3QpIHsNCi0gICAgICAgICAgICAgICAgLy8gU3RyaWN0IGNoZWNraW5nDQotICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0cyBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuDQotICAgICAgICAgICAgICAgIHJldHVybiAoYTEuZXF1YWxzKGEyKSk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gTm9uLXN0cmljdCBjaGVja2luZw0KLSAgICAgICAgICAgICAgICAvLyBUaGUgbGlzdHMgbXVzdCBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzIGJ1dCB0aGUgb3JkZXIgaXMgbm90IHJlcXVpcmVkLg0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpMSA9IGExLml0ZXJhdG9yKCk7DQotDQotICAgICAgICAgICAgICAgIHdoaWxlIChpMS5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmoxID0gaTEubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhMi5jb250YWlucyhvYmoxKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNlIHBvaW50DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiT2JqZWN0U3RhdGVVdGlsczppc0VxdWl2YWxlbnQoQXJyYXlMaXN0LEFycmF5TGlzdCk6IEZBTFNFIC0gbWlzbWF0Y2ggd2l0aCBlbGVtZW50IFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvYmoxLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGVsc2UgaWYgKChhMSA9PSBudWxsKSAmJiAoYTIgPT0gbnVsbCkpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0gZWxzZSBpZiAoKGExICE9IG51bGwpICYmIChhMiA9PSBudWxsKSkgew0KLSAgICAgICAgICAgIGlmIChhMS5zaXplKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfSBlbHNlIGlmICgoYTEgPT0gbnVsbCkgJiYgKGEyICE9IG51bGwpKSB7DQotICAgICAgICAgICAgaWYgKGEyLnNpemUoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIG1pc21hdGNoDQotDQotICAgICAgICAgICAgLy8gdHJhY2UgcG9pbnQNCi0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPYmplY3RTdGF0ZVV0aWxzOmlzRXF1aXZhbGVudChBcnJheUxpc3QsQXJyYXlMaXN0KTogRkFMU0UgLSBtaXNtYXRjaCBpbiBsaXN0cyIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbXBhcmVzIHRoZSB0d28gY29sbGVjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gbTEgIFRoZSBmaXJzdCBjb2xsZWN0aW9uDQotICAgICAqIEBwYXJhbSBtMiAgVGhlIHNlY29uZCBjb2xsZWN0aW9uDQotICAgICAqIEBwYXJhbSBzdHJpY3QgIEluZGljYXRlcyB3aGV0aGVyIHN0cmljdCBjaGVja2luZyBpcyByZXF1aXJlZC4gIFN0cmljdA0KLSAgICAgKiAgICAgICAgICAgICAgICBjaGVja2luZyBtZWFucyB0aGF0IHRoZSB0d28gY29sbGVjdGlvbnMgbXVzdCBoYXZlIHRoZQ0KLSAgICAgKiAgICAgICAgICAgICAgICBzYW1lIG1hcHBpbmdzLiAgTm9uLXN0cmljdCBjaGVja2luZyBtZWFucyB0aGF0IHRoZSANCi0gICAgICogICAgICAgICAgICAgICAgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLiAgSW4gYm90aA0KLSAgICAgKiAgICAgICAgICAgICAgICBjYXNlcywgdGhlIG9yZGVyIGlzIG5vdCBzaWduaWZpY2FudC4NCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQNCi0gICAgICogICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KE1hcCBtMSwgTWFwIG0yLCBib29sZWFuIHN0cmljdCkgew0KLSAgICAgICAgaWYgKChtMSAhPSBudWxsKSAmJiAobTIgIT0gbnVsbCkpIHsNCi0gICAgICAgICAgICBpZiAoc3RyaWN0KSB7DQotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdHJpY3QgdGVzdC4NCi0gICAgICAgICAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYWxzbyBhIG1hcCBhbmQgdGhlIHR3byBNYXBzIA0KLSAgICAgICAgICAgICAgICAvLyByZXByZXNlbnQgdGhlIHNhbWUgbWFwcGluZ3MuIA0KLSAgICAgICAgICAgICAgICByZXR1cm4gKG0xLmVxdWFscyhtMikpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGludCBzaXplMSA9IG0xLnNpemUoKTsNCi0gICAgICAgICAgICAgICAgaW50IHNpemUyID0gbTIuc2l6ZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZTEgIT0gc2l6ZTIpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUga2V5cywgb3JkZXJpbmcgaXMgbm90IGltcG9ydGFudCBiZXR3ZWVuIHRoZSB0d28gbWFwcw0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdDEgPSBtMS5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleTEgPSBpdDEubmV4dCgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG0yLmNvbnRhaW5zS2V5KGtleTEpID09IGZhbHNlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSBpZiAoKG0xID09IG51bGwpICYmIChtMiA9PSBudWxsKSkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBtaXNtYXRjaA0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4NCi0gICAgICogDQotICAgICAqIEBwYXJhbSBsMSAgVGhlIGZpcnN0IGNvbGxlY3Rpb24NCi0gICAgICogQHBhcmFtIGwyICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24NCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQNCi0gICAgICogICAgICAgICBGQUxTRSwgb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFcXVpdmFsZW50KExpbmtlZExpc3QgbDEsIExpbmtlZExpc3QgbDIpIHsNCi0gICAgICAgIGlmICgobDEgIT0gbnVsbCkgJiYgKGwyICE9IG51bGwpKSB7DQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0cmljdCB0ZXN0Lg0KLSAgICAgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgbGlzdCwgDQotICAgICAgICAgICAgLy8gYm90aCBsaXN0cyBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBhbGwgY29ycmVzcG9uZGluZyBwYWlycyANCi0gICAgICAgICAgICAvLyBvZiBlbGVtZW50cyBpbiB0aGUgdHdvIGxpc3RzIGFyZSBlcXVhbCB3aGVyZQ0KLSAgICAgICAgICAgIC8vIHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4NCi0gICAgICAgICAgICByZXR1cm4gKGwxLmVxdWFscyhsMikpOw0KLSAgICAgICAgfSBlbHNlIGlmICgobDEgPT0gbnVsbCkgJiYgKGwyID09IG51bGwpKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIG1pc21hdGNoDQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ2hlY2sgdGhlIGZpcnN0IHNldCBvZiBuYW1lcyBmb3IgYSBtYXRjaCBhZ2FpbnN0DQotICAgICAqIHRoZSBzZWNvbmQgc2V0IG9mIG5hbWVzLiAgVGhlc2UgbmFtZXMgYXJlIA0KLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggQXhpc01lc3NhZ2Ugb2JqZWN0cy4gTWVzc2FnZSBuYW1lcw0KLSAgICAgKiBhcmUgZXhwZWN0ZWQgdG8gYmUgbm9uLW51bGwuICBFbGVtZW50IG5hbWVzIGNvdWxkDQotICAgICAqIGJlIGVpdGhlciBudWxsIG9yIG5vbi1udWxsLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIG5hbWUxICBUaGUgbmFtZSBmb3IgdGhlIGZpcnN0IG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lMSBUaGUgZWxlbWVudCBuYW1lIGZvciB0aGUgZmlyc3QgbWVzc2FnZQ0KLSAgICAgKiBAcGFyYW0gbmFtZTIgIFRoZSBuYW1lIGZvciB0aGUgc2Vjb25kIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lMiBUaGUgZWxlbWVudCBuYW1lIGZvciB0aGUgc2Vjb25kIG1lc3NhZ2UNCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZXJlJ3MgYSBtYXRjaCwNCi0gICAgICogICAgICAgICBGQUxTRSBvdGhlcndpc2UNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hNZXNzYWdlTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgZWxlbWVudE5hbWUxLCBTdHJpbmcgbmFtZTIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lMikgew0KLSAgICAgICAgLy8gdGhlIG5hbWUgZm9yIHRoZSBtZXNzYWdlIG11c3QgZXhpc3QNCi0gICAgICAgIGlmICgobmFtZTEgIT0gbnVsbCkgJiYgKG5hbWUyICE9IG51bGwpICYmIChuYW1lMS5lcXVhbHMobmFtZTIpKSkgew0KLSAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBtYXRjaCBvbiB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2Ugb2JqZWN0DQotDQotICAgICAgICAgICAgLy8gZWxlbWVudCBuYW1lcyBuZWVkIHRvIG1hdGNoLCBpbmNsdWRpbmcgYmVpbmcgbnVsbA0KLSAgICAgICAgICAgIGlmICgoZWxlbWVudE5hbWUxID09IG51bGwpICYmIChlbGVtZW50TmFtZTIgPT0gbnVsbCkpIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhIG1hdGNoIGZvciB0aGUgbnVsbHMNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfSBlbHNlIGlmICgoZWxlbWVudE5hbWUxICE9IG51bGwpICYmIChlbGVtZW50TmFtZTIgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgICAgICYmIChlbGVtZW50TmFtZTEuZXF1YWxzKGVsZW1lbnROYW1lMikpKSB7DQotICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBtYXRjaCBmb3IgdGhlIGVsZW1lbnQgbmFtZXMNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUncyBzb21lIG1pc21hdGNoDQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8vIGVpdGhlciBhIG1lc3NhZ2UgbmFtZSBpcyBudWxsIG9yIHRoZSBuYW1lcyBkb24ndCBtYXRjaA0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdElucHV0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdElucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2QyMGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvRGVidWdPYmplY3RJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0Ow0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNvbnN0YW50czsNCi0NCi0vKioNCi0gKiBEZWJ1Z09iamVjdElucHV0IGRlbGVnYXRlcyB0byBhbiBPYmplY3RJbnB1dCBvYmplY3QuDQotICogRWFjaCBtZXRob2QgbG9ncyBpbi9vdXQgdHJhY2UgaW5mb3JtYXRpb24uDQotICovDQotcHVibGljIGNsYXNzIERlYnVnT2JqZWN0SW5wdXQgaW1wbGVtZW50cyBPYmplY3RJbnB1dCwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWJ1Z09iamVjdElucHV0LmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7DQotICAgIE9iamVjdElucHV0IG9pOyAvLyBkZWxlZ2F0ZQ0KLQ0KLSAgICBwdWJsaWMgRGVidWdPYmplY3RJbnB1dChPYmplY3RJbnB1dCBvaSkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgICAgIHRoaXMub2kgPSBvaTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgYXZhaWxhYmxlKCkiKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLmF2YWlsYWJsZSgpOw0KLSAgICAgICAgdHJhY2UoImVuZCBhdmFpbGFibGUoKSA9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgY2xvc2UoKSIpOw0KLSAgICAgICAgb2kuY2xvc2UoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgY2xvc2UoKSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZCgpIik7DQotICAgICAgICBpbnQgdmFsdWUgPSBvaS5yZWFkKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWQoKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkKGIsIG9mZiwgbGVuKSBvZmY9IiArIG9mZiArICIgbGVuPSIrbGVuKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLnJlYWQoYiwgb2ZmLCBsZW4pOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkKGIsb2ZmLGxlbik9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZChiKSBiLmxlbmd0aD0iICsgYi5sZW5ndGgpOw0KLSAgICAgICAgaW50IHZhbHVlID0gb2kucmVhZChiKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZChiKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkQm9vbGVhbigpIik7DQotICAgICAgICBib29sZWFuIHZhbHVlID0gb2kucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZEJvb2xlYW4oKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkQnl0ZSIpOw0KLSAgICAgICAgYnl0ZSB2YWx1ZSA9IG9pLnJlYWRCeXRlKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRCeXRlKCk9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZENoYXIiKTsNCi0gICAgICAgIGNoYXIgdmFsdWUgPSBvaS5yZWFkQ2hhcigpOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkQ2hhcigpPSIgKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkRG91YmxlIik7DQotICAgICAgICBkb3VibGUgdmFsdWUgPSBvaS5yZWFkRG91YmxlKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWREb3VibGUoKT0iICsgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRGbG9hdCIpOw0KLSAgICAgICAgZmxvYXQgdmFsdWUgPSBvaS5yZWFkRmxvYXQoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZEZsb2F0KCk9IiArIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZEZ1bGx5KGIsb2ZmLGxlbikgb2ZmPSIgKyBvZmYgKyAiIGxlbj0iK2xlbik7DQotICAgICAgICBvaS5yZWFkRnVsbHkoYiwgb2ZmLCBsZW4pOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkRnVsbHkoYixvZmYsbGVuKSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkRnVsbHkoYikgYi5sZW5ndGg9IisgYi5sZW5ndGgpOw0KLSAgICAgICAgb2kucmVhZEZ1bGx5KGIpOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkRnVsbHkoYikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRJbnQoKSIpOw0KLSAgICAgICAgaW50IHZhbHVlID0gb2kucmVhZEludCgpOw0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkSW50KCk9IisgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRMaW5lKCkiKTsNCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG9pLnJlYWRMaW5lKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRMaW5lKCk9IisgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkTG9uZygpIik7DQotICAgICAgICBsb25nIHZhbHVlID0gb2kucmVhZExvbmcoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZExvbmcoKT0iKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCByZWFkT2JqZWN0KCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkT2JqZWN0KCkiKTsNCi0gICAgICAgIE9iamVjdCB2YWx1ZSA9IG9pLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdHJhY2UoImVuZCByZWFkT2JqZWN0KCk9IisgdmFsdWVOYW1lKHZhbHVlKSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHNob3J0IHJlYWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZFNob3J0KCkiKTsNCi0gICAgICAgIHNob3J0IHZhbHVlID0gb2kucmVhZFNob3J0KCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRTaG9ydCgpPSIrIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoInN0YXJ0IHJlYWRMb25nKCkiKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLnJlYWRVbnNpZ25lZEJ5dGUoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZFVuc2lnbmVkQnl0ZSgpPSIrIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlKCJzdGFydCByZWFkU2hvcnQoKSIpOw0KLSAgICAgICAgaW50IHZhbHVlID0gb2kucmVhZFVuc2lnbmVkU2hvcnQoKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgcmVhZFNob3J0KCk9IisgdmFsdWUpOw0KLSAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgcmVhZFVURigpIik7DQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBvaS5yZWFkVVRGKCk7DQotICAgICAgICB0cmFjZSgiZW5kIHJlYWRVVEYoKT0iKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgc2tpcChuKSBuPSIrbik7DQotICAgICAgICBsb25nIHZhbHVlID0gb2kuc2tpcChuKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgc2tpcChuKT0iKyB2YWx1ZSk7DQotICAgICAgICByZXR1cm4gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSgic3RhcnQgc2tpcEJ5dGVzKG4pIG49IituKTsNCi0gICAgICAgIGludCB2YWx1ZSA9IG9pLnNraXBCeXRlcyhuKTsNCi0gICAgICAgIHRyYWNlKCJlbmQgc2tpcEJ5dGVzKG4pPSIrIHZhbHVlKTsNCi0gICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIHN0cikgew0KLSAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoc3RyKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVOYW1lKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7DQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBvYmo7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IG9mIGNsYXNzID0gIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdE91dHB1dFN0cmVhbS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvRGVidWdPYmplY3RPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I3Y2ZiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9EZWJ1Z09iamVjdE91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHM7DQotDQotLyoqDQotICogRGVidWdPYmplY3RPdXRwdXRTdHJlYW0gZGVsZWdhdGVzIHRvIGFuIE9iamVjdE91dHB1dCBvYmplY3QuDQotICogRWFjaCBtZXRob2QgbG9ncyBpbi9vdXQgdHJhY2UgaW5mb3JtYXRpb24NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVidWdPYmplY3RPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBPYmplY3RTdHJlYW1Db25zdGFudHMsIE9iamVjdE91dHB1dA0KLSAgICAgICAgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVidWdPYmplY3RPdXRwdXRTdHJlYW0uY2xhc3MpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgT2JqZWN0T3V0cHV0IG91dDsNCi0gICAgDQotICAgIERlYnVnT2JqZWN0T3V0cHV0U3RyZWFtKE9iamVjdE91dHB1dCBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICAgICAgdHJhY2UoIi0tU1RBUlQgRGVidWdPdXRwdXRTdHJlYW0tLSIpOw0KLSAgICAgICAgdGhpcy5vdXQgPSBvdXQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UoIi0tQ0xPU0UgRGVidWdPdXRwdXRTdHJlYW0tLSIpOw0KLSAgICAgICAgb3V0LmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCBmbHVzaCgpIik7DQotICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgIHRyYWNlICgiZW5kIGZsdXNoKCkiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGUoYiwgb2ZmLCBsZW4pIG9mZj0iICsgb2ZmICsgIiBsZW49IiArIGxlbik7DQotICAgICAgICBpZiAobGVuID4gNCkgew0KLSAgICAgICAgICAgIHRyYWNlICgiIGZpcnN0IGZvdXIgYnl0ZXMgPSAnIiArIA0KLSAgICAgICAgICAgICAgICAgICBiW29mZl0gKyAiJyAnIiArIA0KLSAgICAgICAgICAgICAgICAgICBiW29mZisxXSArICInICciICsNCi0gICAgICAgICAgICAgICAgICAgYltvZmYrMl0gKyAiJyAnIiArDQotICAgICAgICAgICAgICAgICAgIGJbb2ZmKzNdICsgIiciKTsNCi0gICAgICAgIH0NCi0gICAgICAgIG91dC53cml0ZShiLCBvZmYsIGxlbik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZShiLCBvZmYsIGxlbikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGUoYnl0ZSkgYnl0ZT0iICsgYik7DQotICAgICAgICBvdXQud3JpdGUoYik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZShiKSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZShpbnQpIGludD0iICsgYik7DQotICAgICAgICBvdXQud3JpdGUoYik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZShpbnQpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVCb29sZWFuKGJvb2xlYW4gdikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGVCb29sZWFuKHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbih2KTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlQm9vbGVhbih2KSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGVCeXRlKHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlQnl0ZSh2KTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlQnl0ZSh2KSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlQnl0ZXMocykgcz0iICsgcyk7DQotICAgICAgICBvdXQud3JpdGVCeXRlcyhzKTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlQnl0ZXMocykiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXIoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlQ2hhcih2KSB2PSIgKyB2KTsNCi0gICAgICAgIG91dC53cml0ZUNoYXIodik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZUNoYXIodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUNoYXJzKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZUNoYXJzKHMpIHM9IiArIHMpOw0KLSAgICAgICAgb3V0LndyaXRlQ2hhcnMocyk7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZUNoYXJzKHMpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlRG91YmxlKHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlRG91YmxlKHYpOw0KLSAgICAgICAgdHJhY2UgKCJlbmQgd3JpdGVEb3VibGUodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZsb2F0KGZsb2F0IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlRmxvYXQodikgdj0iICsgdik7DQotICAgICAgICBvdXQud3JpdGVGbG9hdCh2KTsgDQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZUZsb2F0KHYpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVJbnQoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlSW50KHYpIHY9IiArIHYpOw0KLSAgICAgICAgb3V0LndyaXRlSW50KHYpOw0KLSAgICAgICAgdHJhY2UgKCJlbmQgd3JpdGVJbnQodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxvbmcobG9uZyB2KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZUxvbmcodikgdj0iICsgdik7DQotICAgICAgICBvdXQud3JpdGVMb25nKHYpOw0KLSAgICAgICAgdHJhY2UgKCJlbmQgd3JpdGVMb25nKHYpIik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRyYWNlICgic3RhcnQgd3JpdGVPYmplY3Qodikgdj0iICsgdmFsdWVOYW1lKG9iaikpOw0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iaik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZU9iamVjdCh2KSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU2hvcnQoaW50IHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICB0cmFjZSAoInN0YXJ0IHdyaXRlU2hvcnQodikgdj0iICsgdik7DQotICAgICAgICBvdXQud3JpdGVTaG9ydCh2KTsNCi0gICAgICAgIHRyYWNlICgiZW5kIHdyaXRlU2hvcnQodikiKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVVURihTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgdHJhY2UgKCJzdGFydCB3cml0ZVVURih2KSB2PSIgKyBzdHIpOw0KLSAgICAgICAgb3V0LndyaXRlVVRGKHN0cik7DQotICAgICAgICB0cmFjZSAoImVuZCB3cml0ZVVURih2KSIpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgc3RyKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhzdHIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZU5hbWUoT2JqZWN0IG9iaikgew0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICJudWxsIjsNCi0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG9iajsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuICJPYmplY3Qgb2YgY2xhc3MgPSAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL0V4dGVybmFsaXplQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9FeHRlcm5hbGl6ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc0M2Q0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL0V4dGVybmFsaXplQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemU7DQotDQotLyoqDQotICogQ29tbW9uIEV4dGVybmFsaXplIENvbnN0YW50cw0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxpemVDb25zdGFudHMgew0KLSAgICANCi0gICAgLy8gT2JqZWN0cyBhcmUgcHJlY2VlZGVkIGJ5IGEgYml0IGluZGljYXRpbmcgaWYgdGhlIG9iamVjdCBpcyBlbXB0eSBvciBhY3RpdmUNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEVNUFRZX09CSkVDVCA9IGZhbHNlOyAgLy8gbnVsbCBvYmplY3Qgb3IgZW1wdHkgb2JqZWN0DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBBQ1RJVkVfT0JKRUNUID0gdHJ1ZTsgIC8vIG90aGVyd2lzZSBpdCBpcyBhbiBhY3RpdmUgb2JqZWN0DQotICAgIA0KLSAgICAvLyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBsaXN0DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBU1RfRU5UUlkgPSAiTEFTVF9PQkoiOw0KLQ0KLSAgICAvLyB1c2VkIHRvIGluZGljYXRlIGFuICJlbXB0eSIgb2JqZWN0DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVNUFRZX01BUktFUiA9ICJFTVBUWV9PQkoiOw0KLSAgICANCi0gICAgLy8gIG1lc3NhZ2UvdHJhY2UvbG9nZ2luZyBzdHJpbmdzDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU1VQUE9SVEVEX1NVSUQgPSAiU2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIGlzIG5vdCBzdXBwb3J0ZWQuIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfUkVWSUQgPSAiUmV2aXNpb24gSUQgaXMgbm90IHN1cHBvcnRlZC4iOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpfU0FWRV9QUk9CTEVNID0NCi0gICAgICAgICAgICAiVGhlIG9iamVjdCBjb3VsZCBub3QgYmUgc2F2ZWQgdG8gdGhlIG91dHB1dCBzdHJlYW0uICBUaGUgb2JqZWN0IG1heSBvciBtYXkgbm90IGJlIGltcG9ydGFudCBmb3IgcHJvY2Vzc2luZyB0aGUgbWVzc2FnZSB3aGVuIGl0IGlzIHJlc3RvcmVkLiBMb29rIGF0IGhvdyB0aGUgb2JqZWN0IGlzIHRvIGJlIHVzZWQgZHVyaW5nIG1lc3NhZ2UgcHJvY2Vzc2luZy4iOw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpfUkVTVE9SRV9QUk9CTEVNID0NCi0gICAgICAgICAgICAiVGhlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVzdG9yZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgVGhlIG9iamVjdCBtYXkgb3IgbWF5IG5vdCBiZSBpbXBvcnRhbnQgZm9yIHByb2Nlc3NpbmcgdGhlIG1lc3NhZ2Ugd2hlbiBpdCBpcyByZXN0b3JlZC4gTG9vayBhdCBob3cgdGhlIG9iamVjdCBpcyB0byBiZSB1c2VkIGR1cmluZyBtZXNzYWdlIHByb2Nlc3NpbmcuIjsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvTWVzc2FnZUV4dGVybmFsaXplVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL01lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjRlNjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvTWVzc2FnZUV4dGVybmFsaXplVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5idWlsZGVyLlN0QVhTT0FQTW9kZWxCdWlsZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkJ1aWxkZXJVdGlsOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0Ow0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsNCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQotDQotLyoqDQotICogVXRpbGl0eSB0byByZWFkL3dyaXRlIHRoZSBNZXNzYWdlIG9mIGEgTWVzc2FnZUNvbnRleHQNCi0gKiBNZXNzYWdlIE9iamVjdCBGb3JtYXQuDQotICogDQotICogPHR0Pg0KLSAqIEZvcm1hdCA6PSBQcm9sb2cge0RhdGFCbG9ja3N9IEVuZEJsb2Nrcw0KLSAqIA0KLSAqIFByb2xvZyA6PQ0KLSAqICAgTkFNRSAgICAgIChVVEYpIA0KLSAqICAgUkVWSVNJT04gIChJTlQpDQotICogICBBQ1RJVkUgICAgKEJPT0wpDQotICogICAgIFtPUFRJTUlaRUQgKEJPT0wpXSAgDQotICogICAgICAgIFtPUFRJTUlaRURfQ09OVEVOVF9UWVBFIChVVEYpXSAgICA8LS0tIElmIE9QVElNSVpFRD1UUlVFDQotICogICAgIFtDSEFSU0VUICAgKFVURildIA0KLSAqICAgICBbTkFNRVNQQUNFIChVVEYpXQ0KLSAqICAgDQotICogRGF0YUJsb2NrIDo9DQotICogICBTSVpFIChJTlQgPjApDQotICogICBEQVRBIChCWVRFUykNCi0gKiAgIA0KLSAqIEVuZEJsb2Nrcw0KLSAqICAgU0laRSAoSU5UKSAgIHswIGluZGljYXRlcyBlbmQgLTEgaW5kaWNhdGVzIGZhaWx1cmV9DQotICogICAgIA0KLSAqICAgDQotICogPC90dD4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUV4dGVybmFsaXplVXRpbHMgIGltcGxlbWVudHMgRXh0ZXJuYWxpemVDb25zdGFudHMgew0KLSAgICBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzLmNsYXNzKTsNCi0NCi0gICAgLyoNCi0gICAgICogQHNlcmlhbCBUcmFja3MgdGhlIHJldmlzaW9uIGxldmVsIG9mIGEgY2xhc3MgdG8gaWRlbnRpZnkgY2hhbmdlcyB0byB0aGUNCi0gICAgICogY2xhc3MgZGVmaW5pdGlvbiB0aGF0IGFyZSBjb21wYXRpYmxlIHRvIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uLg0KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24NCi0gICAgICogb2YgdGhlIGNsYXNzIGlzIGFmZmVjdGVkLg0KLSAgICAgKiBSZWZlciB0byB0aGUgd3JpdGVFeHRlcm5hbCgpIGFuZCByZWFkRXh0ZXJuYWwoKSBtZXRob2RzLg0KLSAgICAgKi8NCi0gICAgLy8gc3VwcG9ydGVkIHJldmlzaW9uIGxldmVscywgYWRkIGEgbmV3IGxldmVsIHRvIG1hbmFnZSBjb21wYXRpYmxlIGNoYW5nZXMNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOw0KLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCByZXZpc2lvbklEID0gUkVWSVNJT05fMjsNCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogUHJpdmF0ZSBDb25zdHJ1Y3Rvci4NCi0gICAgICogVGhpcyBjbGFzcyBvbmx5IHN1cHBvcnRzIHN0YXRpYyBtZXRob2RzDQotICAgICAqLw0KLSAgICBwcml2YXRlIE1lc3NhZ2VFeHRlcm5hbGl6ZVV0aWxzKCkge30NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSBvdXQgdGhlIE1lc3NhZ2UNCi0gICAgICogQHBhcmFtIG91dA0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSURTdHJpbmcNCi0gICAgICogQHBhcmFtIG91dHB1dEZvcm1hdA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0LCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb3JyZWxhdGlvbklEU3RyaW5nLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoY29ycmVsYXRpb25JRFN0cmluZyArICI6d3JpdGVFeHRlcm5hbCgpOiBzdGFydCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWMuZ2V0RW52ZWxvcGUoKTsNCi0gICAgICAgIGlmIChlbnZlbG9wZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gQ2FzZTogTm8gZW52ZWxvcGUNCi0gICAgICAgICAgICBvdXQud3JpdGVVVEYoIk5VTExfRU5WRUxPUEUiKTsNCi0gICAgICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOyAvLyBOb3QgQWN0aXZlDQotICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOyAgLy8gRW5kQmxvY2tzDQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhjb3JyZWxhdGlvbklEU3RyaW5nICsgIjp3cml0ZUV4dGVybmFsKCk6IGVuZDogbXNnIGlzIEVtcHR5Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gV3JpdGUgUHJvbG9nDQotICAgICAgICBTdHJpbmcgbXNnQ2xhc3MgPSBlbnZlbG9wZS5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIG91dC53cml0ZVVURihtc2dDbGFzcyk7DQotICAgICAgICBvdXQud3JpdGVJbnQocmV2aXNpb25JRCk7DQotICAgICAgICBvdXQud3JpdGVCb29sZWFuKEFDVElWRV9PQkpFQ1QpOw0KLSAgICAgICAgaWYgKG91dHB1dEZvcm1hdC5pc09wdGltaXplZCgpKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbih0cnVlKTsNCi0gICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRUeXBlLg0KLSAgICAgICAgICAgIG91dC53cml0ZVVURihvdXRwdXRGb3JtYXQuZ2V0Q29udGVudFR5cGUoKSk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oZmFsc2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgb3V0LndyaXRlVVRGKG91dHB1dEZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKSk7DQotICAgICAgICBvdXQud3JpdGVVVEYoZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOndyaXRlRXh0ZXJuYWwoKTogIiArIA0KLSAgICAgICAgICAgICAgICAgICAgICAib3B0aW1pemVkPVsiICsgb3V0cHV0Rm9ybWF0LmlzT3B0aW1pemVkKCkgKyAiXSAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICJvcHRpbWl6ZWRDb250ZW50VHlwZSAiICsgb3V0cHV0Rm9ybWF0LmdldENvbnRlbnRUeXBlKCkgKyAiXSAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICJjaGFyU2V0RW5jPVsiICsgb3V0cHV0Rm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpICsgIl0gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlVVJJPVsiICsgZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBXcml0ZSBEYXRhQmxvY2tzDQotICAgICAgICAvLyBNZXNzYWdlT3V0cHV0U3RyZWFtIHdyaXRlcyBvdXQgdGhlIERhdGFCbG9ja3MgaW4gY2h1bmtzDQotICAgICAgICAvLyBCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZmZXJzIHRoZSBkYXRhIHRvIHByZXZlbnQgbnVtZXJvdXMsIHNtYWxsIGJsb2Nrcw0KLSAgICAgICAgTWVzc2FnZU91dHB1dFN0cmVhbSBtb3MgPSBuZXcgTWVzc2FnZU91dHB1dFN0cmVhbShvdXQpOyAgDQotICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obW9zKTsgICANCi0gICAgICAgIGJvb2xlYW4gZXJyb3JPY2N1cnJlZCA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsgDQotICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBtZXNzYWdlIHVzaW5nIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSANCi0gICAgICAgICAgICAvLyB0cmFuc3BvcnQgbGF5ZXIuDQotICAgICAgICAgICAgTWVzc2FnZUZvcm1hdHRlciBtc2dGb3JtYXR0ZXIgPSBUcmFuc3BvcnRVdGlscy5nZXRNZXNzYWdlRm9ybWF0dGVyKG1jKTsNCi0gICAgICAgICAgICBtc2dGb3JtYXR0ZXIud3JpdGVUbyhtYywgb3V0cHV0Rm9ybWF0LCBib3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgbWVzc2FnZQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQodCk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIGJvcy5mbHVzaCgpOw0KLSAgICAgICAgICAgIGJvcy5jbG9zZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvLyBXcml0ZSBFbmQgb2YgRGF0YSBCbG9ja3MNCi0gICAgICAgIGlmIChlcnJvck9jY3VycmVkKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlSW50KC0xKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOndyaXRlRXh0ZXJuYWwoKTogZW5kIik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkIHRoZSBNZXNzYWdlDQotICAgICAqIEBwYXJhbSBpbg0KLSAgICAgKiBAcGFyYW0gbWMNCi0gICAgICogQHBhcmFtIGNvcnJlbGF0aW9uSURTdHJpbmcNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSByZWFkRXh0ZXJuYWwoT2JqZWN0SW5wdXQgaW4sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtYywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb3JyZWxhdGlvbklEU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOnJlYWRFeHRlcm5hbCgpOiBzdGFydCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbnVsbDsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVhZCBQcm9sb2cNCi0gICAgICAgIC8vIFJlYWQgdGhlIGNsYXNzIG5hbWUgYW5kIG9iamVjdCBzdGF0ZQ0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkVVRGKCk7DQotICAgICAgICBpbnQgcmV2aXNpb24gPSBpbi5yZWFkSW50KCk7DQotICAgICAgICANCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1Zyhjb3JyZWxhdGlvbklEU3RyaW5nICsgIjpyZWFkRXh0ZXJuYWwoKTogbmFtZT0gIiArIG5hbWUgICsNCi0gICAgICAgICAgICAgICAgICAgICAgIiByZXZpc2lvbj0gIiArIHJldmlzaW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSByZXZpc2lvbiBsZXZlbCB3ZSBjYW4gaGFuZGxlDQotICAgICAgICBpZiAocmV2aXNpb24gIT0gUkVWSVNJT05fMikgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKEV4dGVybmFsaXplQ29uc3RhbnRzLlVOU1VQUE9SVEVEX1JFVklEKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBib29sZWFuIGdvdE1zZyA9IGluLnJlYWRCb29sZWFuKCk7DQotICAgICAgICBpZiAoZ290TXNnICE9IEFDVElWRV9PQkpFQ1QpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGNvcnJlbGF0aW9uSURTdHJpbmcgKyAiOnJlYWRFeHRlcm5hbCgpOiBlbmQ6IiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbWVzc2FnZSBwcmVzZW50Iik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGluLnJlYWRJbnQoKTsgLy8gUmVhZCBlbmQgb2YgZGF0YSBibG9ja3MNCi0gICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vIFJlYWQgb3B0aW1pemVkLCBvcHRpbWl6ZWQgY29udGVudC10eXBlLCBjaGFyc2V0IGVuY29kaW5nIGFuZCBuYW1lc3BhY2UgdXJpDQotICAgICAgICBib29sZWFuIG9wdGltaXplZD0gaW4ucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIFN0cmluZyBvcHRpbWl6ZWRDb250ZW50VHlwZSA9IG51bGw7DQotICAgICAgICBpZiAob3B0aW1pemVkKSB7DQotICAgICAgICAgICAgb3B0aW1pemVkQ29udGVudFR5cGUgPSBpbi5yZWFkVVRGKCk7DQotICAgICAgICB9DQotICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IGluLnJlYWRVVEYoKTsNCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBpbi5yZWFkVVRGKCk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoY29ycmVsYXRpb25JRFN0cmluZyArICI6cmVhZEV4dGVybmFsKCk6ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAib3B0aW1pemVkPVsiICsgb3B0aW1pemVkICsgIl0gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAib3B0aW1pemVkQ29udGVudFR5cGU9WyIgKyBvcHRpbWl6ZWRDb250ZW50VHlwZSArICJdICAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgImNoYXJTZXRFbmM9WyIgKyBjaGFyU2V0RW5jICsgIl0gICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAibmFtZXNwYWNlVVJJPVsiICsgbmFtZXNwYWNlVVJJICsgIl0iKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgTWVzc2FnZUlucHV0U3RyZWFtIG1pcyA9IG5ldyBNZXNzYWdlSW5wdXRTdHJlYW0oaW4pOw0KLSAgICAgICAgU3RBWEJ1aWxkZXIgIGJ1aWxkZXIgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBpZiAob3B0aW1pemVkKSB7DQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTT0FQID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgYnVpbGRlciA9DQotICAgICAgICAgICAgICAgICAgICBCdWlsZGVyVXRpbC5nZXRBdHRhY2htZW50c0J1aWxkZXIobWMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZENvbnRlbnRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU09BUCk7DQotICAgICAgICAgICAgICAgIGVudmVsb3BlID0gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgZW52ZWxvcGUuYnVpbGRXaXRoQXR0YWNobWVudHMoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1scmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihtaXMsIGNoYXJTZXRFbmMpOw0KLSAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHhtbHJlYWRlciwgbmFtZXNwYWNlVVJJKTsNCi0gICAgICAgICAgICAgICAgZW52ZWxvcGUgPSAoU09BUEVudmVsb3BlKSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5idWlsZCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gaWYgY2FuJ3QgZ2V0IHRoZSBYTUwgc3RyZWFtIHJlYWRlcg0KLSAgICAgICAgICAgIC8vIEZvciBub3csIGxvZyB0aGUgZXZlbnQNCi0gICAgICAgICAgICBsb2cuZXJyb3IoY29ycmVsYXRpb25JRFN0cmluZw0KLSAgICAgICAgICAgICAgICAgICAgICArICI6cmVhZEV4dGVybmFsKCk6IEVycm9yIHdoZW4gZGVzZXJpYWxpemluZyBwZXJzaXN0ZWQgZW52ZWxvcGU6IFsiDQotICAgICAgICAgICAgICAgICAgICAgICsgZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSArICJdIiwgZXgpOw0KLSAgICAgICAgICAgIGVudmVsb3BlID0gbnVsbDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBtZXNzYWdlIGlucHV0IHN0cmVhbS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUNCi0gICAgICAgICAgICAvLyB1bmRlcmx5aW5nIHN0cmVhbSBpcyBhZHZhbmNlZCBwYXN0IHRoZSBtZXNzYWdlLg0KLSAgICAgICAgICAgIG1pcy5jbG9zZSgpOw0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoY29ycmVsYXRpb25JRFN0cmluZyArICI6cmVhZEV4dGVybmFsKCk6IGVuZCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBlbnZlbG9wZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE1lc3NhZ2VPdXRwdXRTdHJlYW0gd3JpdGVzIERhdGFCbG9jayBjaHVua3MgdG8gdGhlIE9iamVjdE91dHB1dC4NCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gew0KLSAgICAgICAgT2JqZWN0T3V0cHV0IG91dDsNCi0gICAgICAgIGJvb2xlYW4gaXNEZWJ1ZzsNCi0gICAgICAgIE1lc3NhZ2VPdXRwdXRTdHJlYW0oT2JqZWN0T3V0cHV0IG91dCkgew0KLSAgICAgICAgICAgIHRoaXMub3V0ID0gb3V0Ow0KLSAgICAgICAgICAgIGlzRGVidWcgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgIA0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgIC8vIE5PT1A6IE9iamVjdE91dHB1dCB3aWxsIGJlIGNsb3NlZCBleHRlcm5hbGx5DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiANCi0gICAgICAgICAqIFdyaXRlcyBhIGNodW5rIG9mIGRhdGEgdG8gdGhlIE9iamVjdE91dHB1dA0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBpZiAobGVuID4gMCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0ZSBkYXRhIGNodW5rIHdpdGggbGVuPSIgKyBsZW4pOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgbGVuZ3RoIGFuZCB0aGUgZGF0YSBjaHVuaw0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQobGVuKTsNCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGIsIG9mZiwgbGVuKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICAvKiogDQotICAgICAgICAgKiBXcml0ZXMgYSBjaHVuayBvZiBkYXRhIHRvIHRoZSBPYmplY3RPdXRwdXQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGIgIT0gbnVsbCAmJiAgYi5sZW5ndGggPiAwKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldyaXRlIGRhdGEgY2h1bmsgd2l0aCBzaXplPSIgKyBiLmxlbmd0aCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBsZW5ndGggYW5kIHRoZSBkYXRhIGNodW5rDQotICAgICAgICAgICAgICAgIG91dC53cml0ZUludChiLmxlbmd0aCk7DQotICAgICAgICAgICAgICAgIG91dC53cml0ZShiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICAvKiogDQotICAgICAgICAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSBjaHVuayBvZiBkYXRhIHRvIHRoZSBPYmplY3RPdXRwdXQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0ZSBvbmUgYnl0ZSBkYXRhIGNodW5rIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgbGVuZ3RoIGFuZCB0aGUgZGF0YSBjaHVuaw0KLSAgICAgICAgICAgIG91dC53cml0ZUludCgxKTsNCi0gICAgICAgICAgICBvdXQud3JpdGUoYik7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgICAgDQotICAgIC8qKg0KLSAgICAgKiBQcm92aWRlcyBhIElucHV0U3RyZWFtIGludGVyZmFjZSBvdmVyIE9iamVjdElucHV0Lg0KLSAgICAgKiBNZXNzYWdlSW5wdXRTdHJlYW0gY29udHJvbHMgdGhlIHJlYWRpbmcgb2YgdGhlIERhdGFCbG9jayBjaHVua3MNCi0gICAgICoNCi0gICAgICovDQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsNCi0gICAgICAgIA0KLSAgICAgICAgT2JqZWN0SW5wdXQgaW47DQotICAgICAgICBib29sZWFuIGlzRGVidWc7DQotICAgICAgICBpbnQgY2h1bmtBdmFpbCA9IDA7DQotICAgICAgICBib29sZWFuIGlzRU9EID0gZmFsc2U7DQotICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogQ29uc3RydWN0b3INCi0gICAgICAgICAqIEBwYXJhbSBpbg0KLSAgICAgICAgICovDQotICAgICAgICBNZXNzYWdlSW5wdXRTdHJlYW0oT2JqZWN0SW5wdXQgaW4pIHsNCi0gICAgICAgICAgICB0aGlzLmluID0gaW47DQotICAgICAgICAgICAgaXNEZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZWFkIGEgc2luZ2xlIGxvZ2ljYWwgYnl0ZQ0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiaW52b2tpbmcgcmVhZCgpIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgY3VycmVudCBkYXRhIGNodW5rDQotICAgICAgICAgICAgdXBkYXRlQ2h1bmtBdmFpbCgpOw0KLSAgICAgICAgICAgIGludCByZXQgPSAwOw0KLSAgICAgICAgICAgIGlmIChpc0VPRCkgew0KLSAgICAgICAgICAgICAgICByZXQgPSAtMTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBjaHVua0F2YWlsLS07DQotICAgICAgICAgICAgICAgIHJldCA9IGluLnJlYWRCeXRlKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicmV0dXJuaW5nICIgKyByZXQpOw0KLSAgICAgICAgICAgIHJldHVybiByZXQ7DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFJlYWQgYW4gYXJyYXkgb2YgbG9naWNhbCBieXRlcw0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJpbnZva2luZyByZWFkIHdpdGggb2ZmPSIgKyBvZmYgKyAiIGFuZCBsZW49IiArIGxlbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChpc0VPRCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFT0QgcmV0dXJuaW5nIC0xIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gMDsNCi0gICAgICAgICAgICB3aGlsZSAoKGxlbiA+MCAmJiAhaXNFT0QpKSB7DQotICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgY3VycmVudCBkYXRhIGNodW5rDQotICAgICAgICAgICAgICAgIHVwZGF0ZUNodW5rQXZhaWwoKTsNCi0gICAgICAgICAgICAgICAgaWYgKCFpc0VPRCkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIGJ5dGVzIHJlcXVlc3RlZCBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBjaHVuaw0KLSAgICAgICAgICAgICAgICAgICAgaW50IHJlYWRMZW5ndGggPSBsZW4gPCBjaHVua0F2YWlsID8gbGVuIDogY2h1bmtBdmFpbDsNCi0gICAgICAgICAgICAgICAgICAgIGludCBiciA9IGluLnJlYWQoYiwgb2ZmLCByZWFkTGVuZ3RoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuZCBvZiBGaWxlIGVuY291bnRlcmVkIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGUgd2l0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQNCi0gICAgICAgICAgICAgICAgICAgIG9mZiArPSBicjsNCi0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBicjsNCi0gICAgICAgICAgICAgICAgICAgIGNodW5rQXZhaWwgLT0gYnI7DQotICAgICAgICAgICAgICAgICAgICBieXRlc1JlYWQgKz0gYnI7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJieXRlcyByZWFkID0gIiArIGJ5dGVzUmVhZCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBieXRlc1JlYWQ7DQotICAgICAgICB9DQotDQotICAgICAgICAgDQotICAgICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgcmV0dXJuIHJlYWQoYiwgMCwgYi5sZW5ndGgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFydCBjbG9zZSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAvLyBLZWVwIHJlYWRpbmcgY2h1bmtzIHVudGlsIEVPRA0KLSAgICAgICAgICAgIGlmICghaXNFT0QpIHsNCi0gICAgICAgICAgICAgICAgYnl0ZVtdIHRlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0ICogMTAyNF07DQotICAgICAgICAgICAgICAgIHdoaWxlICghaXNFT0QpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJlYWQodGVtcEJ1ZmZlcik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgY2xvc2UiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogdXBkYXRlQ2h1bmtBdmFpbCB1cGRhdGVzIHRoZSBjaHVua0F2YWlsIGZpZWxkIHdpdGggdGhlDQotICAgICAgICAgKiBhbW91bnQgb2YgZGF0YSBpbiB0aGUgY2h1bmsuDQotICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDaHVua0F2YWlsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbW9yZSBieXRlcyBpbiB0aGUgY3VycmVudCBjaHVuaywNCi0gICAgICAgICAgICAvLyByZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGRhdGFibG9jaw0KLSAgICAgICAgICAgIGlmIChjaHVua0F2YWlsID09IDAgJiYgIWlzRU9EKSB7DQotICAgICAgICAgICAgICAgIGNodW5rQXZhaWwgPSBpbi5yZWFkSW50KCk7DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk5ldyBEYXRhQmxvY2sgd2l0aCBzaXplPSIgKyBjaHVua0F2YWlsKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpZiAoY2h1bmtBdmFpbCA8PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kIG9mIGRhdGEiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlzRU9EID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgIGNodW5rQXZhaWwgPSAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL09iamVjdElucHV0U3RyZWFtV2l0aENMLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9PYmplY3RJbnB1dFN0cmVhbVdpdGhDTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODUwMTM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL09iamVjdElucHV0U3RyZWFtV2l0aENMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLk9iamVjdFN0cmVhbUNsYXNzOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotDQotLyoqDQotICogQW4gT2JqZWN0SW5wdXRTdHJlYW0gdGhhdCBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgQ2xhc3NMb2FkZXIgb3IgQ2xhc3NSZXNvbHZlci4NCi0gKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byB1c2UgdGhlIENvbnRleHRDbGFzc0xvYWRlcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBPYmplY3RJbnB1dFN0cmVhbVdpdGhDTCBleHRlbmRzIGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0NCi17DQotDQotICAgIC8qKg0KLSAgICAgKiA8cD4NCi0gICAgICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byByZXNvbHZlIE9TR2kgZGVjbGFyZWQgc2VyaWFsaXphYmxlIGNsYXNzZXMuDQotICAgICAqIDwvcD4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NSZXNvbHZlcg0KLSAgICB7DQotICAgICAgICAvKioNCi0gICAgICAgICAqIEF0dGVtcHQgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzLg0KLSAgICAgICAgICogDQotICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lDQotICAgICAgICAgKiAgICAgICAgICAgIFRoZSBjbGFzc25hbWUuDQotICAgICAgICAgKiBAcmV0dXJuIFRoZSBjbGFzcywgb3IgbnVsbCBpZiBub3QgZm91bmQuDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBDbGFzcyByZXNvbHZlQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBwcmltQ2xhc3NlcyA9IG5ldyBIYXNoTWFwKDgsIDEuMEYpOw0KLQ0KLSAgICAvKiogVGhlIGNsYXNzIHJlc29sdmVyICovDQotDQotICAgIHByb3RlY3RlZCBDbGFzc1Jlc29sdmVyIHJlc29sdmVyOw0KLSAgICBzdGF0aWMNCi0gICAgew0KLSAgICAgICAgcHJpbUNsYXNzZXMucHV0KCJib29sZWFuIiwgYm9vbGVhbi5jbGFzcyk7DQotICAgICAgICBwcmltQ2xhc3Nlcy5wdXQoImJ5dGUiLCBieXRlLmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgiY2hhciIsIGNoYXIuY2xhc3MpOw0KLSAgICAgICAgcHJpbUNsYXNzZXMucHV0KCJzaG9ydCIsIHNob3J0LmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgiaW50IiwgaW50LmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgibG9uZyIsIGxvbmcuY2xhc3MpOw0KLSAgICAgICAgcHJpbUNsYXNzZXMucHV0KCJmbG9hdCIsIGZsb2F0LmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgiZG91YmxlIiwgZG91YmxlLmNsYXNzKTsNCi0gICAgICAgIHByaW1DbGFzc2VzLnB1dCgidm9pZCIsIHZvaWQuY2xhc3MpOw0KLQ0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcjsNCi0NCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IHVzaW5nIENvbnRleHRDbGFzc0xvYWRlcg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdElucHV0U3RyZWFtV2l0aENMKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgc3VwZXIoaXMpOw0KLSAgICAgICAgDQotICAgICAgICBjbGFzc2xvYWRlciA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOyAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB9ICAgICAgICAgIA0KLSAgICAgICAgfSk7ICAgICAgICAgICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgYSBDbGFzc0xvYWRlcg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHBhcmFtIGNsDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3RJbnB1dFN0cmVhbVdpdGhDTChJbnB1dFN0cmVhbSBpcywgQ2xhc3NMb2FkZXIgY2wpIHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBzdXBlcihpcyk7DQotICAgICAgICBjbGFzc2xvYWRlciA9IGNsOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIGEgQ2xhc3NSZXNvbHZlcg0KLSAgICAgKiBAcGFyYW0gaXMNCi0gICAgICogQHBhcmFtIHIgQ2xhc3NSZXNvbHZlcg0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgT2JqZWN0SW5wdXRTdHJlYW1XaXRoQ0woSW5wdXRTdHJlYW0gaXMsIENsYXNzUmVzb2x2ZXIgcikgdGhyb3dzIElPRXhjZXB0aW9uDQotICAgIHsNCi0gICAgICAgIHN1cGVyKGlzKTsNCi0gICAgICAgIHJlc29sdmVyID0gcjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogT3ZlcnJpZGUgcmVzb2x2ZUNsYXNzIHNvIHRoYXQgd2UgY2FuIHVzZSBvdXIgb3duIENsYXNzTG9hZGVyDQotICAgICAqLw0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIG9ialN0cm1DbGFzcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzcyhvYmpTdHJtQ2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIENsYXNzIHJlc29sdmVDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgew0KLSAgICAgICAgdHJ5DQotICAgICAgICB7DQotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgICAgICAgICByZXR1cm4gKENsYXNzKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChsb2FkQWN0aW9uKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIEV4Y2VwdGlvbiB3cmFwcGVkID0gcGFlLmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgICAgIGlmICh3cmFwcGVkIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHdyYXBwZWQ7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGxvYWRBY3Rpb24gPSANCi0gICAgICAgIG5ldyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKQ0KLSAgICB7DQotICAgICAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IG51bGw7DQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNvbHZlciBpcyBzZXQNCi0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgcmVzb2x2ZXIgdG8gbG9hZCB0aGUgY2xhc3MuDQotICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IHJlc29sdmVyLnJlc29sdmVDbGFzcyhuYW1lKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2xhc3MgaXMgbm90IGxvYWRhYmxlDQotICAgICAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IGxvYWRDbGFzcyhuYW1lLCBjbGFzc2xvYWRlcik7IC8vIGQyOTY0MTYNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gY2xheno7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZikNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIENsYXNzIGMgPSAoQ2xhc3MpIHByaW1DbGFzc2VzLmdldChuYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgdGhyb3cgY25mOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICB9IA0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLQ0KLSAgICAvLyBkMjk2NDE2OiBVc2UgcnVudGltZSBidW5kbGUgY2xhc3Nsb2FkZXIgKGN1cnJlbnQpIHRvIHJlc29sdmUgYSBjbGFzcyB3aGVuDQotICAgIC8vIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzc2xvYWRlci4NCi0gICAgLy8gQSBzZXJpYWxpemFibGUgY2xhc3MgaW4gYSBidW5kbGUgc2hvdWxkIHNwZWNpZnkgdmlhDQotICAgIC8vIDxjb20uaWJtLndzLnJ1bnRpbWUuc2VyaWFsaXphYmxlPiBidW5kbGUgZXh0ZW5zaW9uIHBvaW50DQotICAgIC8vIHRoYXQgaXQgaXMgZGVzZXJpYWxpemFibGUgb3V0c2lkZSB0aGUgY3VycmVudCBidW5kbGUuDQotICAgIC8vIE5PVEU6IExvb2tpbmcgdXAgY3VycmVudCBjbGFzc2xvYWRlciBpcyBvbmx5IGEgdGFjdGljYWwgc29sdXRpb24sDQotICAgIC8vIGFuZCBjb3VsZCBiZSBkZXByZWNhdGVkIGluIGZ1dHVyZS4NCi0gICAgLy8gDQotICAgIHByaXZhdGUgamF2YS5sYW5nLkNsYXNzIGxvYWRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobmFtZSwgdHJ1ZSwgbG9hZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShuYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIA0KLSAgICAvKioNCi0gICAgICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBvdXIgb3duIHJlc29sdXRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCBDbGFzcyByZXNvbHZlUHJveHlDbGFzcyhTdHJpbmdbXSBpbnRlcmZhY2VzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbg0KLSAgICB7DQotICAgICAgICBpZiAoaW50ZXJmYWNlcy5sZW5ndGggPT0gMCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiemVyby1sZW5ndGggaW50ZXJmYWNlcyBhcnJheSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQ2xhc3Mgbm9uUHVibGljQ2xhc3MgPSBudWxsOw0KLQ0KLSAgICAgICAgZmluYWwgQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzW2ludGVyZmFjZXMubGVuZ3RoXTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBjbGFzc2VzW2ldID0gcmVzb2x2ZUNsYXNzKGludGVyZmFjZXNbaV0pOw0KLQ0KLSAgICAgICAgICAgIGlmICgoY2xhc3Nlc1tpXS5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlBVQkxJQykgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vICJpZiBtb3JlIHRoYW4gb25lIG5vbi1wdWJsaWMgaW50ZXJmYWNlIGNsYXNzIGxvYWRlciBpcw0KLSAgICAgICAgICAgICAgICAvLyBlbmNvdW50ZXJlZCwgYW4gSWxsZWdhbEFjY2Vzc0Vycm9yIGlzIHRocm93biINCi0gICAgICAgICAgICAgICAgaWYgKG5vblB1YmxpY0NsYXNzICE9IG51bGwpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQWNjZXNzRXJyb3Iobm9uUHVibGljQ2xhc3MgKyAiIGFuZCAiICsgY2xhc3Nlc1tpXSArICIgYm90aCBkZWNsYXJlZCBub24tcHVibGljIik7DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgbm9uUHVibGljQ2xhc3MgPSBjbGFzc2VzW2ldOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFRoZSBqYXZhZG9jcyBmb3IgdGhpcyBtZXRob2Qgc2F5Og0KLSAgICAgICAgLy8NCi0gICAgICAgIC8vICJVbmxlc3MgYW55IG9mIHRoZSByZXNvbHZlZCBpbnRlcmZhY2VzIGFyZSBub24tcHVibGljLCB0aGlzIHNhbWUNCi0gICAgICAgIC8vIHZhbHVlIG9mIGxvYWRlciBpcyBhbHNvIHRoZSBjbGFzcyBsb2FkZXIgcGFzc2VkIHRvDQotICAgICAgICAvLyBQcm94eS5nZXRQcm94eUNsYXNzOyBpZiBub24tcHVibGljIGludGVyZmFjZXMgYXJlIHByZXNlbnQsIHRoZWlyDQotICAgICAgICAvLyBjbGFzcyBsb2FkZXIgaXMgcGFzc2VkIGluc3RlYWQiDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3QgaGF2ZSBhIHNpbmdsZSBjbGFzc2xvYWRlciB0aGF0IHdlIGNhbiB1c2UuDQotICAgICAgICAvLyBDYWxsIGdldENsYXNzTG9hZGVyKCkgb24gZWl0aGVyIHRoZSBub24tcHVibGljIGNsYXNzIChpZiBhbnkpIG9yIHRoZQ0KLSAgICAgICAgLy8gZmlyc3QgY2xhc3MuDQotICAgICAgICBwcm94eUNsYXNzID0gbm9uUHVibGljQ2xhc3MgIT0gbnVsbCA/IG5vblB1YmxpY0NsYXNzIDogY2xhc3Nlc1swXTsNCi0gICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQocHJveHlDbGFzc0xvYWRlckFjdGlvbik7DQotDQotICAgICAgICAvLyAiSWYgUHJveHkuZ2V0UHJveHlDbGFzcyB0aHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLA0KLSAgICAgICAgLy8gcmVzb2x2ZVByb3h5Q2xhc3Mgd2lsbCB0aHJvdyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gY29udGFpbmluZyB0aGUNCi0gICAgICAgIC8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iDQotICAgICAgICB0cnkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gKENsYXNzKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb3h5LmdldFByb3h5Q2xhc3MobG9hZGVyLCBjbGFzc2VzKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBDbGFzcyBwcm94eUNsYXNzOw0KLSAgICBQcml2aWxlZ2VkQWN0aW9uIHByb3h5Q2xhc3NMb2FkZXJBY3Rpb24gPSBuZXcgUHJpdmlsZWdlZEFjdGlvbigpDQotICAgIHsNCi0gICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gcHJveHlDbGFzcy5nZXRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgfQ0KLSAgICB9Ow0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlT2JqZWN0SW5wdXRTdHJlYW0uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL1NhZmVPYmplY3RJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmFkMzg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L2V4dGVybmFsaXplL1NhZmVPYmplY3RJbnB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1Db25zdGFudHM7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogQSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gcmVhZHMgZGF0YSB0aGF0IHdhcyB3cml0dGVuIGJ5IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0NCi0gKiANCi0gKiBAc2VlIFNhZmVPYmplY3RJbnB1dA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW1wbGVtZW50cyBPYmplY3RJbnB1dCwgT2JqZWN0U3RyZWFtQ29uc3RhbnRzIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNhZmVPYmplY3RJbnB1dFN0cmVhbS5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1ZyA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICANCi0gICAgLy8gQWxsIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBkZWxlZ2F0ZWQgT2JqZWN0SW5wdXQNCi0gICAgT2JqZWN0SW5wdXQgaW4gPSBudWxsOw0KLSAgICBmaW5hbCBPYmplY3RJbnB1dCBvcmlnaW5hbDsNCi0gICAgDQotICAgIC8vIEEgYnVmZmVyIGlzIHVzZWQgd2hlbiBPYmplY3QgaXMgcGVyc2lzdGVkIGFzIGJ5dGVzDQotICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlciA9IG51bGw7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTUlOX1NJWkUgPSA0MDk2Ow0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgU2FmZU9iamVjdElucHV0U3RyZWFtIGlmIG5lY2Vzc2FyeQ0KLSAgICAgKiBAcGFyYW0gaW4NCi0gICAgICogQHJldHVybg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW5zdGFsbChPYmplY3RJbnB1dCBpbikgew0KLSAgICAgICAgaWYgKGluIGluc3RhbmNlb2YgU2FmZU9iamVjdElucHV0U3RyZWFtKSB7DQotICAgICAgICAgICAgcmV0dXJuIChTYWZlT2JqZWN0SW5wdXRTdHJlYW0pIGluOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG5ldyBTYWZlT2JqZWN0SW5wdXRTdHJlYW0oaW4pOw0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEludGVudGlvbmFsbHkgcHJpdmF0ZS4gIENhbGxlcnMgc2hvdWxkIHVzZSB0aGUgaW5zdGFsbCBtZXRob2QgdG8gYWRkIHRoZSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0NCi0gICAgICogaW50byB0aGUgc3RyZWFtLg0KLSAgICAgKiBAcGFyYW0gaW4NCi0gICAgICovDQotICAgIHByaXZhdGUgU2FmZU9iamVjdElucHV0U3RyZWFtKE9iamVjdElucHV0IGluKSB7DQotICAgICAgICBvcmlnaW5hbCA9IGluOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgdGhpcy5pbiA9IG5ldyBEZWJ1Z09iamVjdElucHV0KG9yaWdpbmFsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhpcy5pbiA9IG9yaWdpbmFsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvLyAgRGVsZWdhdGVkIE1ldGhvZHMNCi0gICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLmF2YWlsYWJsZSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGluLmNsb3NlKCk7DQotICAgIH0NCi0gICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkKCk7DQotICAgIH0NCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWQoYiwgb2ZmLCBsZW4pOw0KLSAgICB9DQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkKGIpOw0KLSAgICB9DQotICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkQnl0ZSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBjaGFyIHJlYWRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkQ2hhcigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4ucmVhZERvdWJsZSgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRGbG9hdCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHJlYWRGdWxseShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGluLnJlYWRGdWxseShiLCBvZmYsIGxlbik7DQotICAgIH0NCi0gICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaW4ucmVhZEZ1bGx5KGIpOw0KLSAgICB9DQotICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4ucmVhZEludCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZExpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRMaW5lKCk7DQotICAgIH0NCi0gICAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRMb25nKCk7DQotICAgIH0NCi0gICAgcHVibGljIE9iamVjdCByZWFkT2JqZWN0KCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiByZWFkT2JqZWN0T3ZlcnJpZGUoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgc2hvcnQgcmVhZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkU2hvcnQoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnJlYWRVbnNpZ25lZEJ5dGUoKTsNCi0gICAgfQ0KLSAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRTaG9ydCgpOw0KLSAgICB9DQotICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4ucmVhZFVURigpOw0KLSAgICB9DQotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGluLnNraXAobik7DQotICAgIH0NCi0gICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gaW4uc2tpcEJ5dGVzKG4pOw0KLSAgICB9DQotICAgIA0KLSAgICAvLyBWYWx1ZSBBZGQgTWV0aG9kcw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlYWQgdGhlIGlucHV0IHN0cmVhbSBhbmQgcGxhY2UgdGhlIGtleS92YWx1ZSBwYWlycyBpbiBhIGhhc2htYXANCi0gICAgICogQHJldHVybiBIYXNoTWFwIG9yIG51bGwNCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAc2VlIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0ud3JpdGVNYXAoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIEhhc2hNYXAgcmVhZEhhc2hNYXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gIHsNCi0gICAgICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7DQotICAgICAgICByZXR1cm4gKEhhc2hNYXApIHJlYWRNYXAoaGFzaE1hcCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHBsYWNlIHRoZSBrZXkvdmFsdWUgcGFpcnMgaW4gdGhlDQotICAgICAqIGluZGljYXRlZCBNYXANCi0gICAgICogQHBhcmFtIG1hcCBpbnB1dCBtYXANCi0gICAgICogQHJldHVybiBtYXAgb3IgbnVsbA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqIEBzZWUgU2FmZU9iamVjdE91dHB1dFN0cmVhbS53cml0ZU1hcCgpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTWFwIHJlYWRNYXAoTWFwIG1hcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGJvb2xlYW4gaXNBY3RpdmUgPSBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICAgICAgaWYgKCFpc0FjdGl2ZSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoaW4ucmVhZEJvb2xlYW4oKSkgew0KLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBudWxsOw0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG51bGw7DQotDQotICAgICAgICAgICAgYm9vbGVhbiBpc09iamVjdEZvcm0gPSBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGlmIChpc09iamVjdEZvcm0pIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgcmVhZGluZyB1c2luZyBvYmplY3QgZm9ybSIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUga2V5IGFuZCB2YWx1ZSBkaXJlY3RseQ0KLSAgICAgICAgICAgICAgICAgICAga2V5ID0gaW4ucmVhZE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbi5yZWFkT2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIHJlYWRpbmcgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJ5dGUgc3RyZWFtDQotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gZ2V0Qnl0ZVN0cmVhbShpbik7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBOb3cgZ2V0IHRoZSByZWFsIGtleSBhbmQgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIHRlbXBPSVMgPSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsNCi0gICAgICAgICAgICAgICAgICAgIGtleSA9IHRlbXBPSVMucmVhZE9iamVjdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wT0lTLnJlYWRPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIHRlbXBPSVMuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgICAgIGJhaXMuY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIGtleSBhbmQgdmFsdWUgaW4gdGhlIG1hcA0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkIGtleT0iICsgdmFsdWVOYW1lKGtleSkgKyAiIHZhbHVlPSIrdmFsdWVOYW1lKHZhbHVlKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gU3dhbGxvdyB0aGUgZXJyb3IgYW5kIHRyeSB0byBjb250aW51ZQ0KLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG1hcDsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFJlYWQgdGhlIGlucHV0IHN0cmVhbSBhbmQgcGxhY2Ugb2JqZWN0cyBpbiBhbiBBcnJheUxpc3QNCi0gICAgICogQHJldHVybiBBcnJheUxpc3Qgb3IgbnVsbA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqIEBzZWUgU2FmZU9iamVjdElucHV0U3RyZWFtLndyaXRlTGlzdCgpDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IHJlYWRBcnJheUxpc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgTGlzdCBsbCA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgIHJldHVybiAoQXJyYXlMaXN0KSByZWFkTGlzdChsbCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHBsYWNlIG9iamVjdHMgaW4gYSBMaW5rZWRMaXN0DQotICAgICAqIEByZXR1cm4gTGlua2VkTGlzdCBvciBudWxsDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICogQHNlZSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0ud3JpdGVMaXN0KCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaW5rZWRMaXN0IHJlYWRMaW5rZWRMaXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgTGlzdCBsbCA9IG5ldyBMaW5rZWRMaXN0KCk7DQotICAgICAgIHJldHVybiAoTGlua2VkTGlzdCkgcmVhZExpc3QobGwpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmVhZCBodGUgaW5wdXQgc3RyZWFtIGFuZCBwbGFjZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgTGlzdA0KLSAgICAgKiBAcGFyYW0gbGlzdCBMaXN0DQotICAgICAqIEByZXR1cm4gTGlzdCBvciBudWxsDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICogQHNlZSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0ud3JpdGVMaXN0KCkNCi0gICAgICovDQotICAgIHB1YmxpYyBMaXN0IHJlYWRMaXN0KExpc3QgbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGJvb2xlYW4gaXNBY3RpdmUgPSBpbi5yZWFkQm9vbGVhbigpOw0KLSAgICAgICAgaWYgKCFpc0FjdGl2ZSkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICB3aGlsZSAoaW4ucmVhZEJvb2xlYW4oKSkgew0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsNCi0gICAgICAgICAgICBib29sZWFuIGlzT2JqZWN0Rm9ybSA9IGluLnJlYWRCb29sZWFuKCk7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0Rm9ybSkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiByZWFkaW5nIHVzaW5nIG9iamVjdCBmb3JtIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSB2YWx1ZSBkaXJlY3RseQ0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbi5yZWFkT2JqZWN0KCk7DQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiIHJlYWRpbmcgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGJ5dGUgc3RyZWFtDQotICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gZ2V0Qnl0ZVN0cmVhbShpbik7DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBOb3cgZ2V0IHRoZSByZWFsIGtleSBhbmQgdmFsdWUNCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIHRlbXBPSVMgPSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsNCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcE9JUy5yZWFkT2JqZWN0KCk7DQotICAgICAgICAgICAgICAgICAgICB0ZW1wT0lTLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgICAgICBiYWlzLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBrZXkgYW5kIHZhbHVlIGluIHRoZSBsaXN0DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWQgdmFsdWU9Iit2YWx1ZU5hbWUodmFsdWUpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGxpc3Q7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBSZWFkcyB0aGUgb2JqZWN0IHVzaW5nIHRoZSBzYW1lIGZvcm1hdCB0aGF0IHdhcyB3cml0dGVuLg0KLSAgICAgKiANCi0gICAgICogRVhQRUNURUQgRk9STUFUUw0KLSAgICAgKiAgIGJvb2xlYW49ZmFsc2UNCi0gICAgICogICByZXR1cm4gbnVsbCBPYmplY3QNCi0gICAgICogICANCi0gICAgICogICANCi0gICAgICogICBib29sZWFuPXRydWUNCi0gICAgICogICBib29sZWFuPXRydWUNCi0gICAgICogICByZXR1cm4gT2JqZWN0IHJlYWQgZnJvbSBpbnB1dFN0cmVhbQ0KLSAgICAgKiAgIA0KLSAgICAgKiAgIA0KLSAgICAgKiAgIGJvb2xlYW49dHJ1ZQ0KLSAgICAgKiAgIGJvb2xlYW49ZmFsc2UNCi0gICAgICogICBpbnQ9bnViZXIgb2YgYnl0ZXMNCi0gICAgICogICBieXRlcw0KLSAgICAgKiAgIHJldHVybiBPYmplY3QgcmVhZCBmcm9tIGJ5dGVzDQotICAgICAqICAgDQotICAgICAqIEByZXR1cm4gT2JqZWN0IG9yIG51bGwNCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgT2JqZWN0IHJlYWRPYmplY3RPdmVycmlkZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7DQotICAgICAgICBib29sZWFuIGlzQWN0aXZlID0gaW4ucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIGlmICghaXNBY3RpdmUpIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlYWQgb2JqZWN0PW51bGwiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsNCi0gICAgICAgIGJvb2xlYW4gaXNPYmplY3RGb3JtID0gaW4ucmVhZEJvb2xlYW4oKTsNCi0gICAgICAgIGlmIChpc09iamVjdEZvcm0pIHsNCi0gICAgICAgICAgICAvLyBSZWFkIHRoZSBvYmplY3QgZGlyZWN0bHkNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiByZWFkaW5nIHVzaW5nIG9iamVjdCBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG9iaiA9IGluLnJlYWRPYmplY3QoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgcmVhZGluZyB1c2luZyBieXRlIGZvcm0iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gR2V0IHRoZSBieXRlIHN0cmVhbQ0KLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBnZXRCeXRlU3RyZWFtKGluKTsNCi0NCi0gICAgICAgICAgICAvLyBOb3cgZ2V0IHRoZSByZWFsIG9iamVjdA0KLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIHRlbXBPSVMgPSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsNCi0gICAgICAgICAgICBvYmogPSB0ZW1wT0lTLnJlYWRPYmplY3QoKTsNCi0gICAgICAgICAgICB0ZW1wT0lTLmNsb3NlKCk7DQotICAgICAgICAgICAgYmFpcy5jbG9zZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZCBvYmplY3Q9IiArIHZhbHVlTmFtZShvYmopKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBvYmo7ICAgDQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVOYW1lKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmIChvYmogPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiAibnVsbCI7DQotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgew0KLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBvYmo7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiAiT2JqZWN0IG9mIGNsYXNzID0gIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgYnl0ZSBzdHJlYW0gZm9yIGFuIG9iamVjdCB0aGF0IGlzIHdyaXR0ZW4gdXNpbmcgdGhlIA0KLSAgICAgKiBieXRlIGZvcm1hdC4gIA0KLSAgICAgKiBFWFBFQ1RFRCBmb3JtYXQNCi0gICAgICogICAgIGludCAobnVtYmVyIG9mIGJ5dGVzKQ0KLSAgICAgKiAgICAgYnl0ZXMgDQotICAgICAqICAgICANCi0gICAgICogQHBhcmFtIGluDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZ2V0Qnl0ZVN0cmVhbShPYmplY3RJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoDQotICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRmlsbCBvdXIgdGVtcG9yYXJ5IGJ1ZmZlcg0KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlci5sZW5ndGggPCBzaXplKSB7DQotICAgICAgICAgICAgaW50IGFsbG9jU2l6ZSA9IChzaXplID4gQlVGRkVSX01JTl9TSVpFKSA/IHNpemUgOiBCVUZGRVJfTUlOX1NJWkU7DQotICAgICAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbYWxsb2NTaXplXTsNCi0gICAgICAgIH0NCi0gICAgICAgIGluLnJlYWRGdWxseShidWZmZXIsIDAsIHNpemUpOw0KLSAgICAgICAgDQotICAgICAgICAvLyBSZXR1cm4gYSBzdHJlYW0gYmFja2VkIGJ5IHRoZSBidWZmZXINCi0gICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCAwLCBzaXplKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBPYmplY3RJbnB1dFN0cmVhbSBjcmVhdGVPYmplY3RJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIFRoZSBjcmVhdGVkIE9iamVjdElucHV0U3RyZWFtIG11c3QgdXNlIHRoZSBzYW1lIGNsYXNzL29iamVjdCByZXNvbHV0aW9uIA0KLSAgICAgICAgLy8gY29kZSB0aGF0IGlzIHVzZWQgYnkgdGhlIG9yaWdpbmFsIE9iamVjdElucHV0DQotICAgICAgICByZXR1cm4gbmV3IE9iamVjdElucHV0U3RyZWFtV2l0aENMKGlzKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWQ5NWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvU2FmZU9iamVjdE91dHB1dFN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY2ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5Ob3RTZXJpYWxpemFibGVFeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0Ow0KLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0uUHV0RmllbGQ7DQotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtQ29uc3RhbnRzOw0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsNCi0NCi0vKioNCi0gKiBBIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gcHJvdmlkZXMgZXh0cmEgbWVjaGFuaXNtcyB0byBlbnN1cmUgdGhhdCANCi0gKiBvYmplY3RzIGNhbiBiZSBzYWZlbHkgc2VyaWFsaXplZCB0byB0aGUgT2JqZWN0T3V0cHV0Lg0KLSAqIA0KLSAqIElmIGFuIE9iamVjdCBpcyB3cml0dGVuIHRvIGEgbm9ybWFsIE9iamVjdE91dHB1dCwgdGhlIE9iamVjdE91dHB1dCBpcyBsZWZ0IGluIA0KLSAqIGFuIHVua25vd24gc3RhdGUgaWYgYSBOb3RTZXJpYWxpemFibGVFeGNlcHRpb24gb2NjdXJzLg0KLSAqIA0KLSAqIFRoZSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIGRvZXMgc29tZSBhZGRpdG9uYWwgY2hlY2tpbmcgdG8gZW5zdXJlIHRoYXQgdGhlIE9iamVjdCBjYW4NCi0gKiBiZSBzYWZlbHkgd3JpdHRlbi4gIElmIHRoZSBPYmplY3QgaXMgc3VzcGljaW91cywgaXQgaXMgZmlyc3Qgd3JpdHRlbiB0byBhIGJ1ZmZlciB0byBlbnN1cmUNCi0gKiB0aGF0IHRoZSB1bmRlcmx5aW5nIE9iamVjdE91dHB1dCBpcyBub3QgY29ycnVwdGVkLg0KLSAqIA0KLSAqIEluIGFkZGl0aW9uLCBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIHByb3ZpZGVzIGV4dHJhIG1ldGhvZHMgdG8gd3JpdGUgY29udGFpbmVycyBvZiBPYmplY3RzLg0KLSAqIEZvciBleGFtcGxlIHRoZSB3cml0ZU1hcCBvYmplY3Qgd2lsbCB3cml0ZSB0aGUga2V5IGFuZCB2YWx1ZSBwYWlycyB0aGF0IGFyZSBjYW4gYmUgc2VyaWFsaXplZC4NCi0gKiANCi0gKiBAc2VlIFNhZmVPYmplY3RJbnB1dFN0cmVhbQ0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBPYmplY3RPdXRwdXQsDQotICAgICAgICBPYmplY3RTdHJlYW1Db25zdGFudHMsIEV4dGVybmFsaXplQ29uc3RhbnRzIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnID0gbG9nLmlzRGVidWdFbmFibGVkKCk7DQotICAgIA0KLSAgICAvLyBBY3R1YWwgU3RyZWFtIA0KLSAgICBwcml2YXRlIE9iamVjdE91dHB1dCBvdXQgPSBudWxsOw0KLSAgICANCi0gICAgLy8gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHdyaXRlIG91dCBhbiBvYmplY3QsIGEgc2VyaWVzIG9mIGJ5dGVzIG9yIGFuIE9iamVjdC4gIA0KLSAgICAvLyBUaGVzZSBmbGFncyBhcmUgZW1iZWRkZWQgaW4gdGhlIHN0cmVhbSBzbyB0aGF0IHRoZSByZWFkZXIga25vd3Mgd2hpY2ggZm9ybSB3YXMgdXNlZC4NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGT1JNX0JZVEUgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBGT1JNX09CSkVDVCA9IHRydWU7DQotICAgIA0KLSAgICAvLyBUZW1wb3JhcnkgT2JqZWN0T3V0cHV0U3RyZWFtIGZvcg0KLSAgICBNeU9PUyB0ZW1wT09TID0gbnVsbDsNCi0gICAgDQotICAgIC8vIEFzIGEgd2F5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kIHJlZHVjZSB0cmFjZSBsb2dnaW5nIHdpdGgNCi0gICAgLy8gZXh0cmEgZXhjZXB0aW9ucywga2VlcCBhIHRhYmxlIG9mIGNsYXNzZXMgdGhhdCBhcmUgbm90IHNlcmlhbGl6YWJsZQ0KLSAgICAvLyBhbmQgb25seSBsb2cgdGhlIGZpcnN0IHRpbWUgaXQgdGhhdCB0aGUgY2xhc3MgaXMgZW5jb3VudGVyZWQgaW4NCi0gICAgLy8gYW4gTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uDQotICAgIC8vIG5vdGUgdGhhdCB0aGUgSGFzaHRhYmxlIGlzIHN5bmNocm9uaXplZCBieSBKYXZhIHNvIHdlIHNob3VsZG4ndCBuZWVkIHRvIA0KLSAgICAvLyBkbyBleHRyYSBjb250cm9sIG92ZXIgYWNjZXNzIHRvIHRoZSB0YWJsZQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhhc2h0YWJsZSBub3RTZXJpYWxpemFibGVMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEFkZCB0aGUgU2FmZU91dHB1dFN0cmVhbSBpZiBuZWNlc3NhcnkuDQotICAgICAqIEBwYXJhbSBvdXQgQ3VycmVudCBPYmplY3RPdXRwdXQNCi0gICAgICogQHJldHVybg0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gaW5zdGFsbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKG91dCBpbnN0YW5jZW9mIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICByZXR1cm4gKFNhZmVPYmplY3RPdXRwdXRTdHJlYW0pIG91dDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBuZXcgU2FmZU9iamVjdE91dHB1dFN0cmVhbShvdXQpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSW50ZW50aW9uYWxseSBwcml2YXRlLiAgDQotICAgICAqIENhbGxlcnMgc2hvdWxkIHVzZSB0aGUgaW5zdGFsbCBtZXRob2QgdG8gYWRkIHRoZSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtDQotICAgICAqIGludG8gdGhlIHN0cmVhbS4NCi0gICAgICogQHBhcmFtIG9vDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgU2FmZU9iamVjdE91dHB1dFN0cmVhbShPYmplY3RPdXRwdXQgb28pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICB0aGlzLm91dCA9IG5ldyBEZWJ1Z09iamVjdE91dHB1dFN0cmVhbShvbyk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRoaXMub3V0ID0gb287DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8gU1RBUlQgREVMRUdBVEUgTUVUSE9EUw0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAodGVtcE9PUyAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGVtcE9PUy5jbG9zZSgpOw0KLSAgICAgICAgICAgIHRlbXBPT1MgPSBudWxsOw0KLSAgICAgICAgfQ0KLSAgICAgICAgb3V0LmNsb3NlKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVmYXVsdFdyaXRlT2JqZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICAoKE9iamVjdE91dHB1dFN0cmVhbSlvdXQpLmRlZmF1bHRXcml0ZU9iamVjdCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbykgew0KLSAgICAgICAgcmV0dXJuIG91dC5lcXVhbHMobyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgb3V0LmZsdXNoKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCi0gICAgICAgIHJldHVybiBvdXQuaGFzaENvZGUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUHV0RmllbGQgcHV0RmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICByZXR1cm4gKChPYmplY3RPdXRwdXRTdHJlYW0pb3V0KS5wdXRGaWVsZHMoKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkLiIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgICAgIA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICAoKE9iamVjdE91dHB1dFN0cmVhbSlvdXQpLnJlc2V0KCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIHJldHVybiBvdXQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB1c2VQcm90b2NvbFZlcnNpb24oaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAob3V0IGluc3RhbmNlb2YgT2JqZWN0T3V0cHV0U3RyZWFtKSB7DQotICAgICAgICAgICAgKChPYmplY3RPdXRwdXRTdHJlYW0pb3V0KS51c2VQcm90b2NvbFZlcnNpb24odmVyc2lvbik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZShidWYsIG9mZiwgbGVuKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgb3V0LndyaXRlKGJ1Zik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGUoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZSh2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbGVhbihib29sZWFuIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZUJvb2xlYW4odmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZUJ5dGUodmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVCeXRlcyhzdHIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcihpbnQgdmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgb3V0LndyaXRlQ2hhcih2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQ2hhcnMoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZUNoYXJzKHN0cik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZURvdWJsZSh2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIGlmIChvdXQgaW5zdGFuY2VvZiBPYmplY3RPdXRwdXRTdHJlYW0pIHsNCi0gICAgICAgICAgICAoKE9iamVjdE91dHB1dFN0cmVhbSlvdXQpLndyaXRlRmllbGRzKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVGbG9hdChmbG9hdCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVGbG9hdCh2YWwpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSW50KGludCB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVJbnQodmFsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxvbmcobG9uZyB2YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGVMb25nKHZhbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0IG9iaikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHdyaXRlT2JqZWN0KG9iaiwgZmFsc2UpOyAgLy8gQXNzdW1lIG9iamVjdCBpcyBub3Qgc2FmZQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU2hvcnQoaW50IHZhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZVNob3J0KHZhbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgd3JpdGVVVEYoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIG91dC53cml0ZVVURihzdHIpOw0KLSAgICB9DQotDQotICAgIC8vIEVORCBERUxFR0FURSBNRVRIT0RTDQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGUgYSBtYXANCi0gICAgICogDQotICAgICAqIEZPUk1BVCBmb3IgbnVsbCBtYXANCi0gICAgICogICAgIEVNUFRZX09CSkVDVA0KLSAgICAgKiAgICAgDQotICAgICAqIEZPUk1BVCBmb3Igbm9uLWVtcHR5IG1hcA0KLSAgICAgKiAgICAgQUNUSVZFX09CSkVDVA0KLSAgICAgKiAgICAgZm9yIGVhY2ggY29udGFpbmVkIGtleSB2YWx1ZSBwYWlyDQotICAgICAqICAgICAgICB3cml0ZVBhaXINCi0gICAgICogICAgIEVNUFRZX09CSkVDVCAoaW5kaWNhdGVzIGVuZCBvZiB0aGUgbGlzdA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGxsDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gd3JpdGVNYXAoTWFwIG1hcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihBQ1RJVkVfT0JKRUNUKTsNCi0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7DQotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIAlmaW5hbCBNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsNCi0gICAgICAgICAgICAJd3JpdGVQYWlyKGVudHJ5LmdldEtleSgpLCBmYWxzZSwgZW50cnkuZ2V0VmFsdWUoKSwgZmFsc2UpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAvLyBFbXB0eSBvYmplY3QgaW5kaWNhdGVzIGVuZCBvZiBsaXN0DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSBhIGxpc3QuDQotICAgICAqIA0KLSAgICAgKiBGT1JNQVQgZm9yIG51bGwgbGlzdA0KLSAgICAgKiAgICAgRU1QVFlfT0JKRUNUDQotICAgICAqICAgICANCi0gICAgICogRk9STUFUIGZvciBub24tZW1wdHkgbGlzdA0KLSAgICAgKiAgICAgQUNUSVZFX09CSkVDVA0KLSAgICAgKiAgICAgZm9yIGVhY2ggY29udGFpbmVkIG9iamVjdA0KLSAgICAgKiAgICAgICAgQUNUT1ZFX09CSkVDVA0KLSAgICAgKiAgICAgICAgd3JpdGVPYmplY3QNCi0gICAgICogICAgIEVNUFRZX09CSkVDVCAoaW5kaWNhdGVzIGVuZCBvZiB0aGUgbGlzdA0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGxsDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIGJvb2xlYW4gd3JpdGVMaXN0KExpc3QgYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAoYWwgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oQUNUSVZFX09CSkVDVCk7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBhbC5pdGVyYXRvcigpOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gaXQubmV4dCgpOw0KLSAgICAgICAgICAgICAgICB3cml0ZUl0ZW0odmFsdWUsIGZhbHNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gRW1wdHkgb2JqZWN0IGluZGljYXRlcyBlbmQgb2YgbGlzdA0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIGFuIG9iamVjdCB0byB0aGUgc3RyZWFtLg0KLSAgICAgKiBJZiB0aGUgb2JqZWN0IGlzIGtub3duIChhcHJpb3JpKSB0byBiZSBjb21wbGV0ZWx5IHNlcmlhbGl6YWJsZSBpdA0KLSAgICAgKiBpcyAic2FmZSIuICBTYWZlIG9iamVjdHMgYXJlIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIHN0cmVhbS4NCi0gICAgICogT2JqZWN0cyB0aGF0IGFyZSBub3Qga25vd24gYXJlIHRvIGJlIHNhZmUgYXJlIHRlc3RlZCBmb3Igc2FmZXR5IGFuZCANCi0gICAgICogb25seSB3cml0dGVuIGlmIHRoZXkgYXJlIGRlZW1lZCBzYWZlLiAgVW5zYWZlIG9iamVjdHMgYXJlIG5vdCB3cml0dGVuLg0KLSAgICAgKiBOb3RlOiBUaGUgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gaXMgbGVmdCBpbiBhbiB1bnJlY292ZXJhYmxlIHN0YXRlDQotICAgICAqIGlmIGFueSBvYmplY3Qgd3JpdHRlbiB0byBpdCBjYXVzZXMgYSBzZXJpYWxpemF0aW9uIGVycm9yLiAgU28gcGxlYXNlDQotICAgICAqIHVzZSB0aGUgaXNTYWZlIHBhcmFtZXRlciB3aXNlbHkNCi0gICAgICogDQotICAgICAqIEZPUk1BVCBmb3IgTlVMTCBPYmplY3QNCi0gICAgICogICAgRU1QVFlfT0JKRUNUDQotICAgICAqICAgDQotICAgICAqIEZPUk1BVCBmb3Igbm9uLXNlcmlhbGl6YWJsZSBPYmplY3QNCi0gICAgICogICAgRU1QVFlfT0JKRUNUDQotICAgICAqICAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIHNhZmUgc2VyaWFsaXphYmxlIE9iamVjdA0KLSAgICAgKiAgICBBQ1RJVkVfT0JKRUNUDQotICAgICAqICAgIEZPUk1fT0JKRUNUDQotICAgICAqICAgIE9iamVjdA0KLSAgICAgKiAgICANCi0gICAgICogRk9STUFUIGZvciBvdGhlciBzZXJpYWxpemFibGUgT2JqZWN0DQotICAgICAqICAgIEFDVElWRV9PQkpFQ1QNCi0gICAgICogICAgRk9STV9CWVRFDQotICAgICAqICAgIGxlbmd0aCBvZiBieXRlcw0KLSAgICAgKiAgICBieXRlcyByZXByZXNlbnRpbmcgdGhlIG9iamVjdA0KLSAgICAgKiAgIA0KLSAgICAgKiBAcGFyYW0gb2JqDQotICAgICAqIEBwYXJhbSBpc1NhZmUgdHJ1ZSBpZiB5b3Uga25vdyB0aGF0IG9iamVjdCBjYW4gYmUgc2FmZWx5IHNlcmlhbGl6ZWQuIGZhbHNlIGlmIHRoZSANCi0gICAgICogb2JqZWN0IG5lZWRzIHRvIGJlIHRlc3RlZCBmb3Igc2VyaWFsaXphdGlvbi4NCi0gICAgICogQHJldHVybnMgdHJ1ZSBpZiB3cml0dGVuDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZU9iamVjdChPYmplY3Qgb2JqLCANCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTYWZlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgDQotICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV3JpdGluZyBvYmplY3Q6IiArIHZhbHVlTmFtZShvYmopKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIG51bGwgb2JqZWN0cw0KLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihFTVBUWV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0gICAgICAgIC8vIFNob3J0Y3V0IGZvciBub24tc2VyaWFsaXphYmxlIG9iamVjdHMNCi0gICAgICAgIGlmICghaXNTYWZlKSB7DQotICAgICAgICAgICAgaWYgKCFpc1NlcmlhbGl6YWJsZShvYmopKSB7DQotICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gSWYgbm90IHNhZmUsIHNlZSBpZiB0aGVyZSBhcmUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBPYmplY3QNCi0gICAgICAgIC8vIHRoYXQgZ3VhcmFudGVlIHRoYXQgaXQgY2FuIGJlIHNhZmVseSBzZXJpYWxpemVkIA0KLSAgICAgICAgLy8gKGZvciBleGFtcGxlIFN0cmluZ3MgYXJlIGFsd2F5cyBzZXJpYWxpemFibGUpDQotICAgICAgICBpZiAoIWlzU2FmZSkgew0KLSAgICAgICAgICAgIGlzU2FmZSA9IGlzU2FmZVNlcmlhbGl6YWJsZShvYmopOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGlzU2FmZSkgew0KLSAgICAgICAgICAgIC8vIFVzZSBvYmplY3QgZm9ybQ0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICB3cml0ZSB1c2luZyBvYmplY3QgZm9ybSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEFDVElWRV9PQkpFQ1QpOyAgDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihGT1JNX09CSkVDVCk7DQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iaik7DQotICAgICAgICB9IGVsc2Ugew0KLQ0KLSAgICAgICAgICAgIC8vIEZhbGwtYmFjayB0byBieXRlIGZvcm0NCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgd3JpdGUgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE15T09TIHRlbXBPT1M7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgdGVtcE9PUyA9IHdyaXRlVGVtcE9PUyhvYmopOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgLy8gUHV0IGEgRU1QVFkgb2JqZWN0IGluIHRoZSBmaWxlDQotICAgICAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRU1QVFlfT0JKRUNUKTsNCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKHRlbXBPT1MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEVNUFRZX09CSkVDVCk7DQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgICAgICB9IA0KLQ0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oQUNUSVZFX09CSkVDVCk7ICAgDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihGT1JNX0JZVEUpOw0KLSAgICAgICAgICAgIHRlbXBPT1Mud3JpdGUob3V0KTsNCi0gICAgICAgICAgICByZXNldE9uU3VjY2VzcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIHBhaXIgb2Ygb2JqZWN0cyB0byB0aGUgc3RyZWFtLg0KLSAgICAgKiANCi0gICAgICogSWYgdGhlIG9iamVjdHMgYXJlIGtub3duIChhcHJpb3JpKSB0byBiZSBjb21wbGV0ZWx5IHNlcmlhbGl6YWJsZSB0aGV5IA0KLSAgICAgKiBhcmUgInNhZmUiLiAgU2FmZSBvYmplY3RzIGFyZSB3cml0dGVuIGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0uDQotICAgICAqIE9iamVjdHMgdGhhdCBhcmUgbm90IGtub3duIGFyZSB0byBiZSBzYWZlIGFyZSB0ZXN0ZWQgZm9yIHNhZmV0eSBhbmQgDQotICAgICAqIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZSBkZWVtZWQgc2FmZS4gIFVuc2FmZSBvYmplY3RzIGFyZSBub3Qgd3JpdHRlbi4NCi0gICAgICogTm90ZTogVGhlIGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIGlzIGxlZnQgaW4gYW4gdW5yZWNvdmVyYWJsZSBzdGF0ZQ0KLSAgICAgKiBpZiBhbnkgb2JqZWN0IHdyaXR0ZW4gdG8gaXQgY2F1c2VzIGEgc2VyaWFsaXphdGlvbiBlcnJvci4gIFNvIHBsZWFzZQ0KLSAgICAgKiB1c2UgdGhlIGlzU2FmZSBwYXJhbWV0ZXIgd2lzZWx5DQotICAgICAqIA0KLSAgICAgKiAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIG5vbi1zZXJpYWxpemFibGUga2V5L3ZhbHVlIHBhaXINCi0gICAgICogICAgbm90aGluZyBpcyB3cml0dGVuDQotICAgICAqICAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIHNhZmUgc2VyaWFsaXphYmxlIGtleS92YWx1ZSBwYWlyDQotICAgICAqICAgIEFDVElWRV9PQkpFQ1QNCi0gICAgICogICAgRk9STV9PQkpFQ1QNCi0gICAgICogICAgT2JqZWN0DQotICAgICAqICAgIA0KLSAgICAgKiBGT1JNQVQgZm9yIG90aGVyIHNlcmlhbGl6YWJsZSBrZXkvdmFsdWUgcGFpcg0KLSAgICAgKiAgICBBQ1RJVkVfT0JKRUNUDQotICAgICAqICAgIEZPUk1fQllURQ0KLSAgICAgKiAgICBsZW5ndGggb2YgYnl0ZXMNCi0gICAgICogICAgYnl0ZXMgcmVwcmVzZW50aW5nIHRoZSBvYmplY3QNCi0gICAgICogICAgDQotICAgICAqIEBwYXJhbSBvYmoxDQotICAgICAqIEBwYXJhbSBpc1NhZmUxIHRydWUgaWYgeW91IGtub3cgdGhhdCBvYmplY3QgY2FuIGJlIHNhZmVseSBzZXJpYWxpemVkLiBmYWxzZSBpZiB0aGUgDQotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSB0ZXN0ZWQgZm9yIHNlcmlhbGl6YXRpb24uDQotICAgICAqIEBwYXJhbSBvYmoyDQotICAgICAqIEBwYXJhbSBpc1NhZmUyIHRydWUgaWYgeW91IGtub3cgdGhhdCBvYmplY3QgY2FuIGJlIHNhZmVseSBzZXJpYWxpemVkLiBmYWxzZSBpZiB0aGUgDQotICAgICAqIG9iamVjdCBuZWVkcyB0byBiZSB0ZXN0ZWQgZm9yIHNlcmlhbGl6YXRpb24uDQotICAgICAqIEByZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHdyaXRlUGFpcihPYmplY3Qgb2JqMSwgDQotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2FmZTEsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iajIsDQotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2FmZTIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICANCi0gICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXcml0aW5nIGtleT0iICsgdmFsdWVOYW1lKG9iajEpICsgDQotICAgICAgICAgICAgICAgICAgICAgICIgdmFsdWU9Iit2YWx1ZU5hbWUob2JqMikpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gU2hvcnRjdXQgZm9yIG5vbi1zZXJpYWxpemFibGUgb2JqZWN0cw0KLSAgICAgICAgaWYgKCghaXNTYWZlMSAmJiAhaXNTZXJpYWxpemFibGUob2JqMSkpIHx8DQotICAgICAgICAgICAgICghaXNTYWZlMiAmJiAhaXNTZXJpYWxpemFibGUob2JqMikpKSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgYm9vbGVhbiBpc1NhZmUgPSAoaXNTYWZlMSB8fCBpc1NhZmVTZXJpYWxpemFibGUob2JqMSkpICYmIA0KLSAgICAgICAgICAgIChpc1NhZmUyIHx8IGlzU2FmZVNlcmlhbGl6YWJsZShvYmoyKSk7DQotDQotICAgICAgICBpZiAoaXNTYWZlKSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHdyaXRlIHVzaW5nIG9iamVjdCBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oQUNUSVZFX09CSkVDVCk7DQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihGT1JNX09CSkVDVCk7DQotICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG9iajEpOw0KLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChvYmoyKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCIgIHdyaXRlIHVzaW5nIGJ5dGUgZm9ybSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBNeU9PUyB0ZW1wT09TID0gd3JpdGVUZW1wT09TKG9iajEsIG9iajIpOw0KLSAgICAgICAgICAgIGlmICh0ZW1wT09TID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihBQ1RJVkVfT0JKRUNUKTsNCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEZPUk1fQllURSk7DQotICAgICAgICAgICAgdGVtcE9PUy53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIHJlc2V0T25TdWNjZXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFdyaXRlcyBwYWlyIG9mIG9iamVjdHMgdG8gdGhlIHN0cmVhbS4NCi0gICAgICogDQotICAgICAqIElmIHRoZSBvYmplY3RzIGFyZSBrbm93biAoYXByaW9yaSkgdG8gYmUgY29tcGxldGVseSBzZXJpYWxpemFibGUgdGhleSANCi0gICAgICogYXJlICJzYWZlIi4gIFNhZmUgb2JqZWN0cyBhcmUgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgc3RyZWFtLg0KLSAgICAgKiBPYmplY3RzIHRoYXQgYXJlIG5vdCBrbm93biBhcmUgdG8gYmUgc2FmZSBhcmUgdGVzdGVkIGZvciBzYWZldHkgYW5kIA0KLSAgICAgKiBvbmx5IHdyaXR0ZW4gaWYgdGhleSBhcmUgZGVlbWVkIHNhZmUuICBVbnNhZmUgb2JqZWN0cyBhcmUgbm90IHdyaXR0ZW4uDQotICAgICAqIE5vdGU6IFRoZSBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBpcyBsZWZ0IGluIGFuIHVucmVjb3ZlcmFibGUgc3RhdGUNCi0gICAgICogaWYgYW55IG9iamVjdCB3cml0dGVuIHRvIGl0IGNhdXNlcyBhIHNlcmlhbGl6YXRpb24gZXJyb3IuICBTbyBwbGVhc2UNCi0gICAgICogdXNlIHRoZSBpc1NhZmUgcGFyYW1ldGVyIHdpc2VseQ0KLSAgICAgKiANCi0gICAgICogICANCi0gICAgICogRk9STUFUIGZvciBub24tc2VyaWFsaXphYmxlIGtleS92YWx1ZSBwYWlyDQotICAgICAqICAgIG5vdGhpbmcgaXMgd3JpdHRlbg0KLSAgICAgKiAgICANCi0gICAgICogRk9STUFUIGZvciBzYWZlIHNlcmlhbGl6YWJsZSBrZXkvdmFsdWUgcGFpcg0KLSAgICAgKiAgICBBQ1RJVkVfT0JKRUNUDQotICAgICAqICAgIEZPUk1fT0JKRUNUDQotICAgICAqICAgIE9iamVjdA0KLSAgICAgKiAgICANCi0gICAgICogRk9STUFUIGZvciBvdGhlciBzZXJpYWxpemFibGUga2V5L3ZhbHVlIHBhaXINCi0gICAgICogICAgQUNUSVZFX09CSkVDVA0KLSAgICAgKiAgICBGT1JNX0JZVEUNCi0gICAgICogICAgbGVuZ3RoIG9mIGJ5dGVzDQotICAgICAqICAgIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0DQotICAgICAqICAgIA0KLSAgICAgKiBAcGFyYW0gb2JqMQ0KLSAgICAgKiBAcGFyYW0gaXNTYWZlMSB0cnVlIGlmIHlvdSBrbm93IHRoYXQgb2JqZWN0IGNhbiBiZSBzYWZlbHkgc2VyaWFsaXplZC4gZmFsc2UgaWYgdGhlIA0KLSAgICAgKiBvYmplY3QgbmVlZHMgdG8gYmUgdGVzdGVkIGZvciBzZXJpYWxpemF0aW9uLg0KLSAgICAgKiBAcGFyYW0gb2JqMg0KLSAgICAgKiBAcGFyYW0gaXNTYWZlMiB0cnVlIGlmIHlvdSBrbm93IHRoYXQgb2JqZWN0IGNhbiBiZSBzYWZlbHkgc2VyaWFsaXplZC4gZmFsc2UgaWYgdGhlIA0KLSAgICAgKiBvYmplY3QgbmVlZHMgdG8gYmUgdGVzdGVkIGZvciBzZXJpYWxpemF0aW9uLg0KLSAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGJvdGggYXJlIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbQ0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZUl0ZW0oT2JqZWN0IG9iaiwgDQotICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzU2FmZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGlzRGVidWcpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldyaXRpbmcgb2JqPSIgKyB2YWx1ZU5hbWUob2JqKSk7DQotICAgICAgICB9DQotICAgICAgICAvLyBTaG9ydGN1dCBmb3Igbm9uLXNlcmlhbGl6YWJsZSBvYmplY3RzDQotICAgICAgICBpZiAoIWlzU2FmZSAmJiAhaXNTZXJpYWxpemFibGUob2JqKSkgew0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlzU2FmZSA9IChpc1NhZmUgfHwgaXNTYWZlU2VyaWFsaXphYmxlKG9iaikpOw0KLQ0KLSAgICAgICAgaWYgKGlzU2FmZSkgew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICB3cml0ZSB1c2luZyBvYmplY3QgZm9ybSIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEFDVElWRV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4oRk9STV9PQkpFQ1QpOw0KLSAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChvYmopOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Zykgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgd3JpdGUgdXNpbmcgYnl0ZSBmb3JtIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIE15T09TIHRlbXBPT1M7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgdGVtcE9PUyA9IHdyaXRlVGVtcE9PUyhvYmopOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmICh0ZW1wT09TID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihBQ1RJVkVfT0JKRUNUKTsNCi0gICAgICAgICAgICBvdXQud3JpdGVCb29sZWFuKEZPUk1fQllURSk7DQotICAgICAgICAgICAgdGVtcE9PUy53cml0ZShvdXQpOw0KLSAgICAgICAgICAgIHJlc2V0T25TdWNjZXNzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERvZXMgYSBxdWljayBjaGVjayBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyB0byBlbnN1cmUgdGhhdCB0aGlzIA0KLSAgICAgKiBvYmplY3QgaXMgc2VyaWFsaXphYmxlDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG1hcmtlZCBhcyBTZXJpYWxpemFibGUgDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VyaWFsaXphYmxlKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGJvb2xlYW4gaXNTZXJpYWxpemFibGUgPSAob2JqID09IG51bGwpIHx8IG9iaiBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZTsNCi0gICAgICAgIGlmICghaXNTZXJpYWxpemFibGUpIHsNCi0gICAgICAgICAgICBtYXJrTm90U2VyaWFsaXphYmxlKG9iaik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gaXNTZXJpYWxpemFibGU7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBEb2VzIGEgcXVpY2sgY2hlY2sgb2YgdGhlIGltcGxlbWVudGVkIGNsYXNzIGlzIHNhZmUgdG8gc2VyaWFsaXplIHdpdGhvdXQgDQotICAgICAqIGJ1ZmZlcmluZy4NCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgbWFya2VkIGFzIHNhZmUuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FmZVNlcmlhbGl6YWJsZShPYmplY3Qgb2JqKSB7DQotICAgICAgICANCi0gICAgICAgIGJvb2xlYW4gaXNTYWZlU2VyaWFsaXphYmxlID0gKG9iaiA9PSBudWxsKSB8fCANCi0gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBTYWZlU2VyaWFsaXphYmxlIHx8DQotICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgU3RyaW5nIHx8DQotICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgSW50ZWdlciB8fA0KLSAgICAgICAgICAgIG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4gfHwNCi0gICAgICAgICAgICBvYmogaW5zdGFuY2VvZiBMb25nOw0KLSAgICAgICAgcmV0dXJuIGlzU2FmZVNlcmlhbGl6YWJsZTsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBXcml0ZSB0aGUgb2JqZWN0IHRvIGEgdGVtcG9yYXJ5IE9iamVjdE91dHB1dA0KLSAgICAgKiBAcGFyYW0gb2JqDQotICAgICAqIEByZXR1cm4gT2JqZWN0T3V0cHV0IGlmIHN1Y2Nlc3NmdWwNCi0gICAgICovDQotICAgIHByaXZhdGUgTXlPT1Mgd3JpdGVUZW1wT09TKE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBNeU9PUyBvb3MgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG9vcyA9IGdldFRlbXBPT1MoKTsNCi0gICAgICAgICAgICBvb3Mud3JpdGVPYmplY3Qob2JqKTsNCi0gICAgICAgICAgICBvb3MuZmx1c2goKTsNCi0gICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBuc2UyKSB7DQotICAgICAgICAgICAgbWFya05vdFNlcmlhbGl6YWJsZShvYmopOw0KLSAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXNldE9uRmFpbHVyZSgpOw0KLSAgICAgICAgICAgICAgICBvb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBuc2UyOw0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXNldE9uRmFpbHVyZSgpOw0KLSAgICAgICAgICAgICAgICBvb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlc2V0T25GYWlsdXJlKCk7DQotICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb29zOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogV3JpdGUgdGhlIG9iamVjdHMgdG8gYSB0ZW1wb3JhcnkgT2JqZWN0T3V0cHV0DQotICAgICAqIEBwYXJhbSBvYmoxDQotICAgICAqIEBwYXJhbSBvYmoyDQotICAgICAqIEByZXR1cm4gT2JqZWN0T3V0cHV0IGlmIHN1Y2Nlc3NmdWwNCi0gICAgICovDQotICAgIHByaXZhdGUgTXlPT1Mgd3JpdGVUZW1wT09TKE9iamVjdCBvYmoxLCBPYmplY3Qgb2JqMikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIE15T09TIG9vcyA9IG51bGw7DQotICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgb29zID0gZ2V0VGVtcE9PUygpOw0KLSAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChvYmoxKTsNCi0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOw0KLSAgICAgICAgICAgIG9vcy53cml0ZU9iamVjdChvYmoyKTsNCi0gICAgICAgICAgICBvb3MuZmx1c2goKTsNCi0gICAgICAgIH0gY2F0Y2ggKE5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbiBuc2UyKSB7DQotICAgICAgICAgICAgLy8gVGhpcyBpcyBva2F5IGFuZCBleHBlY3RlZCBpbiBzb21lIGNhc2VzLg0KLSAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlDQotICAgICAgICAgICAgbWFya05vdFNlcmlhbGl6YWJsZSgoZmlyc3QpID8gb2JqMSA6b2JqMik7DQotICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlc2V0T25GYWlsdXJlKCk7DQotICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChvb3MgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICByZXNldE9uRmFpbHVyZSgpOw0KLSAgICAgICAgICAgICAgICBvb3MgPSBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJvdyBlOw0KLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgaWYgKG9vcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJlc2V0T25GYWlsdXJlKCk7DQotICAgICAgICAgICAgICAgIG9vcyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRocm93IGU7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb29zOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IG9yIGNyZWF0ZSBhIHRlbXBvcmFyeSBPYmplY3RPdXRwdXRTdHJlYW0NCi0gICAgICogQHJldHVybiBNeU9PUw0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIE15T09TIGdldFRlbXBPT1MoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHRlbXBPT1MgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRlbXBPT1MgPSBuZXcgTXlPT1MobmV3IE15QkFPUygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0ZW1wT09TOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogSWYgYSBmYWlsdXJlIG9jY3VycywgcmVzZXQgdGhlIHRlbXBvcmFyeSBPYmplY3RPdXRwdXRTdHJlYW0NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCByZXNldE9uRmFpbHVyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBpZiAodGVtcE9PUyAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGVtcE9PUy5jbG9zZSgpOw0KLSAgICAgICAgICAgIHRlbXBPT1MgPSBudWxsOyAgLy8gVGhlIE9iamVjdE91dHB1dCBpcyBpbiBhbiB1bmtub3duIHN0YXRlIGFuZCB0aHVzIGRpc2NhcmRlZA0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogUmVzZXQgdGhlIHRlbXBvcmFyeSBPYmplY3RPdXRwdXRTdHJlYW0NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0T25TdWNjZXNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIHRlbXBPT1MucmVzZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJrTm90U2VyaWFsaXphYmxlKE9iamVjdCBvYmopIHsNCi0gICAgICAgIGlmICghaXNEZWJ1Zykgew0KLSAgICAgICAgICAgIHJldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG5vdFNlcmlhbGl6YWJsZUxpc3QuZ2V0KG5hbWUpOw0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIG5vdFNlcmlhbGl6YWJsZUxpc3QucHV0KG5hbWUsIG5hbWUpOw0KLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiKioqTm90U2VyaWFsaXphYmxlRXhjZXB0aW9uKioqIFsiICsgbmFtZSArICJdIik7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlTmFtZShPYmplY3Qgb2JqKSB7DQotICAgICAgICBpZiAob2JqID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gIm51bGwiOw0KLSAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgb2JqOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gIk9iamVjdCBvZiBjbGFzcyA9ICIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIE15QkFPUyBpcyBhIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB3aXRoIGEgZmV3IGFkZGl0aW9ucy4NCi0gICAgICoNCi0gICAgICovDQotICAgIHN0YXRpYyBjbGFzcyBNeUJBT1MgZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gew0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBSZXR1cm4gZGlyZWN0IGFjY2VzcyB0byB0aGUgYnVmZmVyIHdpdGhvdXQgY3JlYXRpbmcgYSBjb3B5IG9mIHRoZSBieXRlW10NCi0gICAgICAgICAqIEByZXR1cm4gYnVmDQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJ1ZjsNCi0gICAgICAgIH0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmVzZXQgdG8gYSBzcGVjaWZpYyBpbmRleCBpbiB0aGUgYnVmZmVyDQotICAgICAgICAgKiBAcGFyYW0gY291bnQNCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoaW50IGNvdW50KSB7DQotICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50Ow0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICANCi0gICAgLyoqDQotICAgICAqIE15T09TIGlzIGFuIE9iamVjdE91dHB1dFN0cmVhbSB3aXRoIGEgZmV3IHBlcmZvcm1hbnQgYWRkaXRpb25zLg0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgc3RhdGljIGNsYXNzIE15T09TIGV4dGVuZHMgT2JqZWN0T3V0cHV0U3RyZWFtIHsNCi0gICAgICAgIE15QkFPUyBiYW9zOw0KLSAgICAgICAgaW50IGRhdGFPZmZzZXQ7DQotICAgICAgICBNeU9PUyhNeUJBT1MgYmFvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBzdXBlcihiYW9zKTsNCi0gICAgICAgICAgICBzdXBlci5mbHVzaCgpOw0KLSAgICAgICAgICAgIHRoaXMuYmFvcyA9IGJhb3M7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgZGF0YSBvZmZzZXQgDQotICAgICAgICAgICAgLy8gKHRoZSBsb2NhdGlvbiB3aGVyZSBkYXRhIHN0YXJ0cy4ud2hpY2ggaXMgYWZ0ZXIgaGVhZGVyIGluZm9ybWF0aW9uKQ0KLSAgICAgICAgICAgIGRhdGFPZmZzZXQgPSBiYW9zLnNpemUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLyoqDQotICAgICAgICAgKiBPdmVycmlkZSB0aGUgcmVzZXQgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdG8gdGhlIGRhdGEgb2Zmc2V0Lg0KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsNCi0gICAgICAgICAgICAvLyBSZXNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gdGhlIHBvc2l0aW9uIHBhc3QgdGhlIGhlYWRlcnMNCi0gICAgICAgICAgICBiYW9zLnJlc2V0KGRhdGFPZmZzZXQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAvKioNCi0gICAgICAgICAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiBNeU9PUyB0byB0aGUgaW5kaWNhdGVkIE9iamVjdE91dHB1dC4NCi0gICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGRpcmVjdCB3cml0ZSBhdm9pZHMgYW55IGJ5dGVbXSBidWZmZXIgY3JlYXRpb24NCi0gICAgICAgICAqIEBwYXJhbSBvdXQNCi0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0T3V0cHV0IG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBvdXQuZmx1c2goKTsNCi0gICAgICAgICAgICAvLyBvdXQud3JpdGVPYmplY3Qob3V0LnRvQnl0ZUFycmF5KCkpOw0KLSAgICAgICAgICAgIG91dC53cml0ZUludChiYW9zLnNpemUoKSk7DQotICAgICAgICAgICAgb3V0LndyaXRlKGJhb3MuZ2V0Qnl0ZXMoKSwwLGJhb3Muc2l6ZSgpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlU2VyaWFsaXphYmxlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9leHRlcm5hbGl6ZS9TYWZlU2VyaWFsaXphYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NDU5N2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvZXh0ZXJuYWxpemUvU2FmZVNlcmlhbGl6YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplOw0KLQ0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIGEgbWFya2VyIGludGVyZmFjZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBPYmplY3QNCi0gKiBhbmQgYWxsIGNvbnRlbnRzIG9mIHRoZSBPYmplY3QgY2FuIGJlIHNlcmlhbGl6ZWQgc2FmZWx5IHdpdGhvdXQNCi0gKiBidWZmZXJpbmcuIA0KLSAqIA0KLSAqIEBTZWUgU2FmZU9iamVjdE91dHB1dFN0cmVhbQ0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBTYWZlU2VyaWFsaXphYmxlIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvQXhpc0RhdGFMb2NhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3MmQxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIDxwPkF4aXNEYXRhTG9jYXRvciBpbnRlcmZhY2UgZGVmaW5lcyBnZXREYXRhIEFQSSBmb3IgcmV0cmlldmluZyBkYXRhIHBhcnRpY3VsYXJseQotICogbWV0YWRhdGEgbGlrZSBXU0RMLCBQb2xpY3ksIFNjaGVtYS4gV2ViIFNlcnZpY2UgZW5naW5lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG1ldGhvZHMgaW4KLSAqIHN0b3JpbmcgbWV0YWRhdGEgb3IgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgdG8gcmV0cmlldmUgbWF5IGNvZGUgdGhlaXIgdmVyc2lvbiBvZgotICogRGF0YSBMb2NhdG9yKHMpYnkgaW1wbGVtZW50aW5nIHRoZSBBeGlzRGF0YUxvY2F0b3IgaW50ZXJmYWNlLiBBeGlzIDIgc3VwcG9ydAotICogRGF0YSBMb2NhdG9yIHBsdWdpbiBieSBjb25maWd1cmluZyBpbiBBeGlzMi54bWwgb3Igc2VydmljZXMueG1sLiA8L3A+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBBeGlzRGF0YUxvY2F0b3IgewotCi0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYW5kIHJldHVybnMgZGF0YSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCAgICBUaGUge0BsaW5rIERhdGFSZXRyaWV2YWxSZXF1ZXN0fSBhbGxvdyB0byBzcGVjaWZ5IHBhcmFtZXRlcnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICBhYm91dCB0aGUgcmVxdWVzdCwgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gcHJvY2VzcyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IFRoZSB7QGxpbmsgTWVzc2FnZUNvbnRleHR9IGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QuCi0gICAgICogQHJldHVybiB7QGxpbmsgRGF0YX1bXSBmb3IgdGhlIHJlcXVlc3QuCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgRGF0YVtdIGdldERhdGEoRGF0YVJldHJpZXZhbFJlcXVlc3QgcmVxdWVzdCwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3JJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9BeGlzRGF0YUxvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjIzM2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvQXhpc0RhdGFMb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBEZWZhdWx0IEF4aXMyIERhdGEgTG9jYXRvciBpbXBsZW1lbnRhdGlvbgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzRGF0YUxvY2F0b3JJbXBsIGltcGxlbWVudHMgQXhpc0RhdGFMb2NhdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0RhdGFMb2NhdG9ySW1wbC5jbGFzcyk7Ci0KLSAgICAvLyBIYXNoTWFwIHRvIGNhY2hlIERhdGEgZWxlbWVudHMgZGVmaW5lZCBpbiBTZXJ2aWNlRGF0YS4gCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGRhdGFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRGF0YUxvY2F0b3JJbXBsKEF4aXNTZXJ2aWNlIGluX2F4aXNTZXJ2aWNlKSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlID0gaW5fYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFuZCByZXR1cm5zIGRhdGEgYmFzZWQgb24gdGhlIHNwZWNpZmllZCByZXF1ZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIERhdGFbXSBkYXRhID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGRpYWxlY3QgPSByZXF1ZXN0LmdldERpYWxlY3QoKTsKLSAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSByZXF1ZXN0LmdldElkZW50aWZpZXIoKTsKLSAgICAgICAgU3RyaW5nIGtleSA9IGRpYWxlY3Q7Ci0gICAgICAgIEFycmF5TGlzdCBkYXRhTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAga2V5ID0ga2V5ICsgaWRlbnRpZmllcjsKLSAgICAgICAgICAgIGlmIChkYXRhTWFwLmdldChrZXkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkYXRhTGlzdC5hZGQoZGF0YU1hcC5nZXQoa2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhTGlzdCA9IGdldERhdGFMaXN0KGRpYWxlY3QpOwotICAgICAgICB9Ci0KLQotICAgICAgICBBeGlzRGF0YUxvY2F0b3IgZGF0YUxvY2F0b3IgPSBEYXRhTG9jYXRvckZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlRGF0YUxvY2F0b3IoZGlhbGVjdCwgKFNlcnZpY2VEYXRhW10pIGRhdGFMaXN0LnRvQXJyYXkobmV3IFNlcnZpY2VEYXRhWzBdKSk7Ci0KLSAgICAgICAgaWYgKGRhdGFMb2NhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFMb2NhdG9yLmdldERhdGEocmVxdWVzdCwgbXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiZ2V0RGF0YSByZXF1ZXN0IGZhaWxlZCBmb3IgZGlhbGVjdCwgIiArIGRpYWxlY3QsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIGluc3RhbnRpYXRlIERhdGEgTG9jYXRvciBmb3IgZGlhbGVjdCwgIiArIGRpYWxlY3Q7Ci0gICAgICAgICAgICBsb2cuaW5mbyhtZXNzYWdlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBGb3IgQXhpc1NlcnZpY2UgdXNlIG9ubHkhCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsb2FkU2VydmljZURhdGEoKSB7Ci0gICAgICAgIERhdGFSZXRyaWV2YWxVdGlsIHV0aWwgPSBEYXRhUmV0cmlldmFsVXRpbC5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIE9NRWxlbWVudCBzZXJ2aWNlRGF0YSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmaWxlID0gIk1FVEEtSU5GLyIgKyBEUkNvbnN0YW50cy5TRVJWSUNFX0RBVEEuRklMRV9OQU1FOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZURhdGEgPSB1dGlsLmJ1aWxkT00oYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVRBLUlORi8iICsgRFJDb25zdGFudHMuU0VSVklDRV9EQVRBLkZJTEVfTkFNRSk7Ci0gICAgICAgIH0gY2F0Y2ggKERhdGFSZXRyaWV2YWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gSXQgaXMgbm90IHJlcXVpcmVkIHRvIGRlZmluZSBTZXJ2aWNlRGF0YSBmb3IgYSBTZXJ2aWNlLCBqdXN0IGxvZyBhIHdhcm5pbmcgbWVzc2FnZQotCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJDaGVjayBsb2FkaW5nIGZhaWx1cmUgZm9yIGZpbGUsICIgKyBmaWxlOwotICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UgKyAiLk1lc3NhZ2UgPSAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXJ2aWNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoaW5nU2VydmljZURhdGEoc2VydmljZURhdGEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIGNhY2hpbmcgU2VydmljZURhdGEgZm9yIEF4aXMyIERhdGEgTG9jYXRvcnMKLSAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjYWNoaW5nU2VydmljZURhdGEoT01FbGVtZW50IGUpIHsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGUuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgRFJDb25zdGFudHMuU0VSVklDRV9EQVRBLkRBVEEpKTsKLSAgICAgICAgU3RyaW5nIHNhdmVLZXkgPSAiIjsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlRGF0YSBkYXRhID0gbmV3IFNlcnZpY2VEYXRhKChPTUVsZW1lbnQpIGkubmV4dCgpKTsKLSAgICAgICAgICAgIHNhdmVLZXkgPSBkYXRhLmdldERpYWxlY3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSBkYXRhLmdldElkZW50aWZpZXIoKTsKLSAgICAgICAgICAgIGlmIChpZGVudGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYXZlS2V5ID0gc2F2ZUtleSArIGlkZW50aWZpZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhTWFwLnB1dChzYXZlS2V5LCBkYXRhKTsKLQotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qCi0gICAgKiBSZXR1cm4gU2VydmljZURhdGEgZm9yIHNwZWNpZmllZCBkaWFsZWN0Ci0gICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCBnZXREYXRhTGlzdChTdHJpbmcgZGlhbGVjdCkgewotICAgICAgICBBcnJheUxpc3QgZGF0YUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBkYXRhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5U3RyID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBnZXQgYWxsIERhdGEgZWxlbWVudCB0aGF0IG1hdGNoaW5nIHRoZSBkaWFsZWN0Ci0gICAgICAgICAgICBpZiAoa2V5U3RyLmluZGV4T2YoZGlhbGVjdCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGRhdGFMaXN0LmFkZChkYXRhTWFwLmdldChrZXlTdHIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGF0YUxpc3Q7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0Jhc2VBeGlzRGF0YUxvY2F0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0Jhc2VBeGlzRGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxZDFiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9CYXNlQXhpc0RhdGFMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBjb21tb24gY29kZSBhbmQgc2VydmVzIGFzIGEgYmFzZSBjbGFzcwotICogZm9yIHRoZSBzdXBwb3J0ZWQgZGVmYXVsdCBBeGlzMiBkaWFsZWN0IGRhdGEgbG9jYXRvcnMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VBeGlzRGF0YUxvY2F0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlQXhpc0RhdGFMb2NhdG9yLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlRGF0YVtdIGRhdGFMaXN0ID0gbnVsbDsKLSAgICBwcml2YXRlIE91dHB1dEZvcm0gb3V0cHV0Zm9ybSA9IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk07Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBBeGlzMiBEYXRhIGxvY2F0b3IgZ2V0RGF0YSBBUEkKLSAgICAgKiBDaGVja3MgZGF0YSBpbmZvcm1hdGlvbiBjb25maWd1cmVkIGluIFNlcnZpY2VEYXRhLnhtbCBmb3IgdGhlIHN1cHBvcnRlZAotICAgICAqIG91dHB1dCBmb3JtczogaW5saW5lLCB1cmwsIEVuZHBvaW50UmVmZXJlbmNlLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlOiBTdWJjbGFzcyB0aGF0IGhhcyBpdHMgaW1wbGVtZW50YXRpb24gb2Ygb3V0SW5saW5lRm9ybSwgb3V0cHV0TG9jYXRpb25Gb3JtLAotICAgICAqIGFuZCBvdXRwdXRSZWZlcmVuY2VGb3JtIGxvZ2ljIG11c3QgaW1wbGVtZW50IHRoZSBnZXREYXRhIEFQSS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvZy50cmFjZSgiRGVmYXVsdCBCYXNlIERhdGFMb2NhdG9yIGdldERhdGEgc3RhcnRzIik7Ci0KLSAgICAgICAgT3V0cHV0Rm9ybSBvdXRwdXRmb3JtID0gKE91dHB1dEZvcm0pIHJlcXVlc3QuZ2V0T3V0cHV0Rm9ybSgpOwotCi0gICAgICAgIGlmIChvdXRwdXRmb3JtID09IG51bGwpIHsgLy8gbm90IGRlZmluZWQsIGRlZnVhbHQgdG8gaW5saW5lCi0gICAgICAgICAgICBvdXRwdXRmb3JtID0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STTsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFbXSBvdXRwdXQgPSBudWxsOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXRGb3JtU3RyaW5nID0gb3V0cHV0Zm9ybS5nZXRUeXBlKCk7Ci0KLSAgICAgICAgaWYgKG91dHB1dGZvcm0gPT0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STSkgewotICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0SW5saW5lRm9ybShtc2dDb250ZXh0LCBkYXRhTGlzdCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0Zm9ybSA9PSBPdXRwdXRGb3JtLkxPQ0FUSU9OX0ZPUk0pIHsKLSAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dExvY2F0aW9uRm9ybShkYXRhTGlzdCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRmb3JtID09IE91dHB1dEZvcm0uUkVGRVJFTkNFX0ZPUk0pIHsKLSAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dFJlZmVyZW5jZUZvcm0obXNnQ29udGV4dCwgZGF0YUxpc3QpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygKLSAgICAgICAgICAgICAgICAgICAgIk51bGwgZGF0YSByZXR1cm4hIERhdGEgTG9jYXRvciBkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgcmVxdWVzdCBmb3IgZGlhbGVjdD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdC5nZXREaWFsZWN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW4gdGhlIGZvcm0gb2YgIiArIG91dHB1dEZvcm1TdHJpbmcpOwotICAgICAgICB9Ci0KLQotICAgICAgICBsb2cudHJhY2UoIkRlZmF1bHQgQmFzZSBEYXRhTG9jYXRvciBnZXREYXRhIGVuZHMiKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogV1NETCBvciBhIHBvbGljeSBkb2N1bWVudAotICAgICAqLwotICAgIHByb3RlY3RlZCBEYXRhW10gb3V0cHV0SW5saW5lRm9ybShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGF0YVtdIHNlcnZpY2VEYXRhKSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRhRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IHNlcnZpY2VEYXRhLmxlbmd0aDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWV0YUVsZW1lbnQgPSBzZXJ2aWNlRGF0YVtpXS5nZXRGaWxlQ29udGVudChtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc1NlcnZpY2UoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0YUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBEYXRhKG1ldGFFbGVtZW50LCBzZXJ2aWNlRGF0YVtpXS5nZXRJZGVudGlmaWVyKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEYXRhW10pIHJlc3VsdC50b0FycmF5KG5ldyBEYXRhWzBdKTsKLQotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRMb2NhdGlvbkZvcm0oU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLQotICAgICAgICBBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoc2VydmljZURhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlRGF0YS5sZW5ndGg7IGkrKykgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVybFZhbHVlID0gc2VydmljZURhdGFbaV0uZ2V0VVJMKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgRGF0YSh1cmxWYWx1ZSwgc2VydmljZURhdGFbaV0uZ2V0SWRlbnRpZmllcigpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRGF0YVtdKSByZXN1bHQudG9BcnJheShuZXcgRGF0YVswXSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRSZWZlcmVuY2VGb3JtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEYXRhW10gc2VydmljZURhdGEpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGVwciA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VEYXRhLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBlcHIgPSBzZXJ2aWNlRGF0YVtpXS5nZXRFbmRwb2ludFJlZmVyZW5jZSgpOwotICAgICAgICAgICAgICAgIGlmIChlcHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBEYXRhKChlcHIpLCBzZXJ2aWNlRGF0YVtpXS5nZXRJZGVudGlmaWVyKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChEYXRhW10pIHJlc3VsdC50b0FycmF5KG5ldyBEYXRhWzBdKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFNlcnZpY2VEYXRhKFNlcnZpY2VEYXRhW10gaW5TZXJ2aWNlRGF0YSkgewotICAgICAgICB0aGlzLmRhdGFMaXN0ID0gaW5TZXJ2aWNlRGF0YTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBPdXRwdXRGb3JtIGdldE91dHB1dEZvcm0oKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRmb3JtOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRFJDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RSQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NjAzY2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRFJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotLyoqCi0gKiBEZWZpbmVzIGNvbnN0YW50cyByZWZlcmVuY2VkIGluIGRhdGEgcmV0cmlldmFsIGNsYXNzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFJDb25zdGFudHMgewotICAgIHB1YmxpYyBpbnRlcmZhY2UgU1BFQ19WRVJTSU9OUyB7Ci0gICAgICAgIFN0cmluZyB2MV8wID0gIlNwZWNfMjAwNF8wOSI7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNPQVBWZXJzaW9uIHsKLSAgICAgICAgaW50IHYxXzEgPSAxOwotCi0gICAgICAgIGludCB2MV8yID0gMjsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmluZXMgY29udGFudHMgcmVmZXJlbmNlcyBpbiBXUy1NZXggc3BlY2lmaWNhdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIGludGVyZmFjZSBTUEVDIHsKLSAgICAgICAgU3RyaW5nIE5TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leCI7Ci0KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBBY3Rpb25zIHsKLSAgICAgICAgICAgIFN0cmluZyBHRVRfTUVUQURBVEFfUkVRVUVTVCA9Ci0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leC9HZXRNZXRhZGF0YS9SZXF1ZXN0IjsKLSAgICAgICAgICAgIFN0cmluZyBHRVRfTUVUQURBVEFfUkVTUE9OU0UgPQotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9tZXgvR2V0TWV0YWRhdGEvUmVzcG9uc2UiOwotCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgTlNfUFJFRklYID0gIm1leCI7Ci0gICAgICAgIFN0cmluZyBHRVRfTUVUQURBVEEgPSAiR2V0TWV0YWRhdGEiOwotCi0gICAgICAgIC8qKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIERJQUxFQ1QgaW5zdGVhZC4gIHRvZG86IGRlbGV0ZSBtZSBhZnRlciAxLjUgKi8KLSAgICAgICAgU3RyaW5nIERJQUxFVCA9ICJEaWFsZWN0IjsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBESUFMRUNUID0gIkRpYWxlY3QiOwotICAgICAgICBTdHJpbmcgSURFTlRJRklFUiA9ICJJZGVudGlmaWVyIjsKLSAgICAgICAgU3RyaW5nIE1FVEFEQVRBID0gIk1ldGFkYXRhIjsKLSAgICAgICAgU3RyaW5nIE1FVEFEQVRBX1NFQ1RJT04gPSAiTWV0YWRhdGFTZWN0aW9uIjsKLSAgICAgICAgU3RyaW5nIE1FVEFEQVRBX1JFRkVSRU5DRSA9ICJNZXRhZGF0YVJlZmVyZW5jZSI7Ci0gICAgICAgIFN0cmluZyBMT0NBVElPTiA9ICJMb2NhdGlvbiI7Ci0gICAgICAgIFN0cmluZyBUWVBFID0gInR5cGUiOwotICAgICAgICBTdHJpbmcgRElBTEVDVF9UWVBFX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICAgICAgICBTdHJpbmcgRElBTEVDVF9UWVBFX1BPTElDWSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI7Ci0gICAgICAgIFN0cmluZyBESUFMRUNUX1RZUEVfU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIH0KLQotCi0gICAgLy8gRm9sbG93aW5nIGNvbnN0YW50cyB1c2VkIGZvciBjb25maWd1cmluZyBEYXRhIExvY2F0b3IgaW4gYXhpcy54bWwgYW5kIHNlcnZpY2VzLnhtbAotICAgIFN0cmluZyBEQVRBX0xPQ0FUT1JfRUxFTUVOVCA9ICJkYXRhTG9jYXRvciI7Ci0gICAgU3RyaW5nIERJQUxFQ1RfTE9DQVRPUl9FTEVNRU5UID0gImRpYWxlY3RMb2NhdG9yIjsKLSAgICBTdHJpbmcgRElBTEVDVF9BVFRSSUJVVEUgPSAiZGlhbGVjdCI7Ci0gICAgU3RyaW5nIENMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7Ci0KLSAgICAvLyBTZXJ2aWNlIGxldmVsIGFuZCBHbG9iYWwgbGV2ZWwgdHlwZSBEYXRhIExvY2F0b3IKLSAgICBTdHJpbmcgU0VSVklDRV9MRVZFTCA9ICJTZXJ2aWNlTGV2ZWwiOwotICAgIFN0cmluZyBHTE9CQUxfTEVWRUwgPSAiR2xvYmFsTGV2ZWwiOwotCi0gICAgLyoqCi0gICAgICogRGVmaW5lcyBjb250YW50cyByZWZlcmVuY2VzIGluIFNlcnZpY2UgRGF0YQotICAgICAqLwotCi0gICAgcHVibGljIGludGVyZmFjZSBTRVJWSUNFX0RBVEEgewotICAgICAgICBTdHJpbmcgRklMRV9OQU1FID0gIlNlcnZpY2VEYXRhLnhtbCI7Ci0gICAgICAgIFN0cmluZyBGSUxFX1RZUEUgPSAic3ZjRGF0YSI7Ci0KLSAgICAgICAgU3RyaW5nIERBVEEgPSAiRGF0YSI7Ci0gICAgICAgIFN0cmluZyBFTkRQT0lOVF9SRUZFUkVOQ0UgPSAiRW5kcG9pbnRSZWZlcmVuY2UiOwotICAgICAgICBTdHJpbmcgVVJMID0gIlVSTCI7Ci0gICAgICAgIFN0cmluZyBGSUxFID0gImZpbGUiOwotICAgICAgICBTdHJpbmcgRElBTEVDVCA9ICJkaWFsZWN0IjsKLSAgICAgICAgU3RyaW5nIElERU5USUZJRVIgPSAiaWRlbnRpZmllciI7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RhdGEuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZmM4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotLyoqCi0gKiBEYXRhIGNvbnRhaW5zIGluc3RhbmNlIG9mIHRoZSBkYXRhIE9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGlmIGFwcGxpY2FibGUuCi0gKi8KLQotcHVibGljIGNsYXNzIERhdGEgewotICAgIE9iamVjdCBkYXRhOwotICAgIFN0cmluZyBpZGVudGlmaWVyOwotCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGluX2RhdGEgICAgICAgaW5zdGFuY2Ugb2YgT2JqZWN0IGFib3V0IHRoZSBkYXRhCi0gICAgICogQHBhcmFtIGluX2lkZW50aWZpZXIgaWRlbnRpZmllciBvZiB0aGUgZGF0YSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YShPYmplY3QgaW5fZGF0YSwgU3RyaW5nIGluX2lkZW50aWZpZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZGF0YSA9IGluX2RhdGE7Ci0gICAgICAgIGlkZW50aWZpZXIgPSBpbl9pZGVudGlmaWVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZGF0YQotICAgICAqCi0gICAgICogQHJldHVybiBkYXRhIE9iamVjdAotICAgICAqLwotCi0gICAgcHVibGljIE9iamVjdCBnZXREYXRhKCkgewotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgaWRlbnRpZmllciBvZiB0aGlzIGRhdGEgb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YUxvY2F0b3JGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhTG9jYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhMzdiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhTG9jYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY29uc3RydWN0b3IgQXhpczIgRGF0YSBMb2NhdG9ycyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0gKiBEaWFsZWN0LgotICovCi0KLXB1YmxpYyBjbGFzcyBEYXRhTG9jYXRvckZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5XU0RMRGF0YUxvY2F0b3Igd3NkbERhdGFMb2NhdG9yID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuUG9saWN5RGF0YUxvY2F0b3IgcG9saWN5RGF0YUxvY2F0b3IgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5TY2hlbWFEYXRhTG9jYXRvciBzY2hlbWFEYXRhTG9jYXRvciA9IG51bGw7Ci0KLSAgICAvKgotICAgICogUmV0dXJuIGluc3RhbmNlIG9mIGRlZmF1bHQgRGF0YSBMb2NhdG9yIGZvciB0aGUgZGlhbGVjdC4KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0RhdGFMb2NhdG9yIGNyZWF0ZURhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0KSB7Ci0gICAgICAgIHJldHVybiAoY3JlYXRlRGF0YUxvY2F0b3IoZGlhbGVjdCwgbnVsbCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0RhdGFMb2NhdG9yIGNyZWF0ZURhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEYXRhW10gc2VydmljZURhdGFBcnJheSkgewotICAgICAgICBBeGlzRGF0YUxvY2F0b3IgZGF0YUxvY2F0b3I7Ci0KLSAgICAgICAgaWYgKGRpYWxlY3QuZXF1YWxzKERSQ29uc3RhbnRzLlNQRUMuRElBTEVDVF9UWVBFX1dTREwpKSB7Ci0gICAgICAgICAgICBkYXRhTG9jYXRvciA9IGdldFdzZGxEYXRhTG9jYXRvcihzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgfSBlbHNlIGlmIChkaWFsZWN0LnRyaW0oKS5lcXVhbHMoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfUE9MSUNZKSkgewotICAgICAgICAgICAgaWYgKHBvbGljeURhdGFMb2NhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9jYXRvciA9IG5ldyBQb2xpY3lEYXRhTG9jYXRvcihzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YUxvY2F0b3IgPSBwb2xpY3lEYXRhTG9jYXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkaWFsZWN0LmVxdWFscyhEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9TQ0hFTUEpKSB7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hRGF0YUxvY2F0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRhdGFMb2NhdG9yID0gbmV3IFNjaGVtYURhdGFMb2NhdG9yKHNlcnZpY2VEYXRhQXJyYXkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhTG9jYXRvciA9IHNjaGVtYURhdGFMb2NhdG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YUxvY2F0b3IgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYXRhTG9jYXRvcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEF4aXNEYXRhTG9jYXRvciBnZXRXc2RsRGF0YUxvY2F0b3IoU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YUFycmF5KSB7Ci0KLSAgICAgICAgaWYgKHdzZGxEYXRhTG9jYXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsRGF0YUxvY2F0b3IgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLldTRExEYXRhTG9jYXRvcihzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzZGxEYXRhTG9jYXRvci5zZXRTZXJ2aWNlRGF0YShzZXJ2aWNlRGF0YUFycmF5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbERhdGFMb2NhdG9yOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MmE2NjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotLyoqCi0gKiBFeGNlcHRpb24gY2xhc3MgZm9yIHJlcG9ydGluZyBEYXRhIFJldHJpZXZhbCBwcm9ibGVtcwotICovCi0KLXB1YmxpYyBjbGFzcyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIGV4dGVuZHMgQXhpc0ZhdWx0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzc0OTMzMDgyMDYyMTI0OTA4TDsKLQotICAgIHB1YmxpYyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIHN1cGVyKGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsUmVxdWVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxNmVjNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9EYXRhUmV0cmlldmFsUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQWxsb3cgdG8gc3BlY2lmeSBvcHRpb25zL3BhcmFtZXRlcnMgZm9yIGdldERhdGEgcmVxdWVzdC4gVGhlIGxpc3QgaXMgZXh0ZW5zaWJsZQotICogYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgdGhlIERhdGEgTG9jYXRvciB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgotICovCi0KLXB1YmxpYyBjbGFzcyBEYXRhUmV0cmlldmFsUmVxdWVzdCBleHRlbmRzIEhhc2hNYXAgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTM3NDkzMzA4MjA2MjEyNDkwOEw7Ci0KLSAgICAvKioKLSAgICAgKiBLZXkgdXNlZCB0byBkZWZpbmUgRGlhbGVjdCBvZiBkYXRhIHRvIGJlIHJldHJpZXZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESUFMRVQgPSAiRGlhbGVjdCI7Ci0gICAgLyoqCi0gICAgICogS2V5IHVzZWQgdG8gZGVmaW5lZCBJZGVudGlmeSBvZiBkYXRhIHRvIGJlIHJldHJpZXZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJREVOVElGSUVSID0gIklkZW50aWZpZXIiOwotICAgIC8qKgotICAgICAqIEtleSB1c2VkIHRvIGRlZmluZSB0aGUgb3V0cHV0IGZvcm1hdCBvZiByZXRyaWV2ZWQgZGF0YSB0byBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPVVRQVVRfRk9STSA9ICJPdXRwdXRGb3JtIjsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgRGlhbGVjdCB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIHRoYXQgaGFzIGRpYWxlY3QgaW5mby4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlhbGVjdCgpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGRpYWxlY3QgPSAoU3RyaW5nKSAoZ2V0KERJQUxFVCkpOwotICAgICAgICBpZiAoZGlhbGVjdCA9PSBudWxsIHx8IGRpYWxlY3QubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFSZXRyaWV2YWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFbXB0eSBkaWFsZWN0IHdhcyBkZXRlY3RlZC4gRGlhbGVjdCBtdXN0IGhhdmUgdmFsdWUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGRpYWxlY3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIElkZW50aWZpZXIgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIFN0cmluZyB0aGF0IGhhcyBJZGVudGlmaWVyIGluZm8uCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSAoZ2V0KElERU5USUZJRVIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gb3V0cHV0IGZvcm1hdCBvZiBkYXRhIHJldHJpZXZlZC4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBPdXRwdXRGb3JtIGdldE91dHB1dEZvcm0oKSB7Ci0gICAgICAgIHJldHVybiAoT3V0cHV0Rm9ybSkgKGdldChPVVRQVVRfRk9STSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsbG93IHRvIHNldCB0aGUgZGlhbGVjdCBvZiBkYXRhIHRvIHJldHJpZXZlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGlhbGVjdCAtIFZhbGlkIGRpYWxlY3QgdmFsdWUgc3VwcG9ydGVkIGJ5IHRoZSBEYXRhIExvY2F0b3IuCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBwdXREaWFsZWN0KFN0cmluZyBkaWFsZWN0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkaWFsZWN0ID09IG51bGwgfHwgZGlhbGVjdC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGRpYWxlY3Qgd2FzIGRldGVjdGVkLiBEaWFsZWN0IG11c3QgaGF2ZSB2YWx1ZS4iKTsKLSAgICAgICAgfQotICAgICAgICBwdXQoRElBTEVULCBkaWFsZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvdyB0byBzZXQgdGhlIGlkZW50aWZpZXIgb2YgZGF0YSB0byByZXRyaWV2ZQotICAgICAqCi0gICAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBpZGVudGlmaWVyIHZhbHVlCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBwdXRJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0gICAgICAgIHB1dChJREVOVElGSUVSLCBpZGVudGlmaWVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvdyB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQgb2YgdGhlIGRhdGEgcmV0cmlldmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm0gLSBWYWxpZCBvdXRwdXQgZm9ybWF0IHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgRGF0YSBMb2NhdG9yLgotICAgICAqIEB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgcHV0T3V0cHV0Rm9ybShPdXRwdXRGb3JtIGZvcm0pIHsKLSAgICAgICAgcHV0KE9VVFBVVF9GT1JNLCBmb3JtKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbFV0aWwuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0RhdGFSZXRyaWV2YWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjExMmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvRGF0YVJldHJpZXZhbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGF0YVJldHJpZXZhbFV0aWwgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEYXRhUmV0cmlldmFsVXRpbC5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEYXRhUmV0cmlldmFsVXRpbCBpbnN0YW5jZSA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIERhdGFSZXRyaWV2YWxVdGlsIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgRGF0YVJldHJpZXZhbFV0aWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZGluZyB4bWwgZmlsZSBjb250ZW50IGFuZCBjb252ZXJ0IHRvIE9NRWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlIC0gZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBTZXJ2aWNlIFJlcG9zaXRvcnkKLSAgICAgKiBAcmV0dXJuIE9NRWxlbWVudCBmb3JtYXQgb2YgdGhlIHhtbCBmaWxlIGNvbnRlbnQgCi0gICAgICogQHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIAotICAgICAqLwotCi0gICAgcHVibGljIE9NRWxlbWVudCBidWlsZE9NKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgZmlsZSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBzZXJ2aWNleG1sU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2V4bWxTdHJlYW0gPSBnZXRJbnB1dFN0cmVhbShjbGFzc0xvYWRlciwgZmlsZSk7Ci0KLSAgICAgICAgICAgIGVsZW1lbnQgPSBjb252ZXJ0VG9PTUVsZW1lbnQoc2VydmljZXhtbFN0cmVhbSk7Ci0gICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFSZXRyaWV2YWxFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGZyb20gZmlsZSwgIiArIGZpbGUsIGUpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHNlcnZpY2V4bWxTdHJlYW0gdG8gT01FbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZXhtbFN0cmVhbSBJbnB1dFN0cmVhbSBjb250YWluIHhtbCBjb250ZW50Ci0gICAgICogQHJldHVybiBPTUVsZW1lbnQgZm9ybWF0IG9mIHRoZSB4bWwgY29udGVudAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBjb252ZXJ0VG9PTUVsZW1lbnQoSW5wdXRTdHJlYW0gc2VydmljZXhtbFN0cmVhbSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIE9NRXhjZXB0aW9uewotICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscwotICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc2VydmljZXhtbFN0cmVhbSk7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBzdGF4T01CdWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmFjLCB4bWxSZWFkZXIpOwotICAgICAgICBlbGVtZW50ID0gc3RheE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gc2VydmljZXhtbFN0cmVhbSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2V4bWxTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgU2VydmljZSBSZXBvc2l0b3J5ISBGaWxlPSIKLSAgICAgICAgICAgICAgICAgICAgKyBmaWxlOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZXhtbFN0cmVhbTsKLQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0xvY2F0b3JUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9Mb2NhdG9yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk0ZDg0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL0xvY2F0b3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsKLQotLyoqCi0gKiBEZWZpbmVzIERhdGEgTG9jYXRvciB0eXBlcyBhcyBkZXNjcmliZWQgYmVsb3c6Ci0gKiBERUZBVUxUX0FYSVMgLSBEZWZhdWx0IEF4aXMyIGRhdGEgbG9jYXRvcgotICogR0xPQkFMX0xFVkVMIC0gR2xvYmFsIGxldmVsIGRhdGEgbG9jYXRvciBpLmUuLHBsdWctaW4gZGF0YSBsb2NhdG9yIHJlZ2lzdGVyZWQKLSAqIHVzaW5nIDxkYXRhTG9jYXRvcj4gZWxlbWVudCBpbiBheGlzMi54bWwuCi0gKiBHTE9CQUxfRElBTEVDVCAtIEdsb2JhbCBsZXZlbCBkaWFsZWN0IHNwZWNmaWMgZGF0YSBsb2NhdG9yIGkuZS4scGx1Zy1pbgotICogZGF0YSBsb2NhdG9yIHJlZ2lzdGVyZWQgdXNpbmcgPGRpYWxlY3RMb2NhdG9yPiBlbGVtZW50IGluIGF4aXMyLnhtbC4KLSAqIFNFUlZJQ0VfTEVWRUwgLSBTZXJ2aWNlIGxldmVsIGRhdGEgbG9jYXRvciBpLmUuIHBsdWctaW4gZGF0YSBsb2NhdG9yIHJlZ2lzdGVyZWQKLSAqIHVzaW5nIDxkYXRhTG9jYXRvcj4gZWxlbWVudCBpbiBzZXJ2aWNlcy54bWwuCi0gKiBTRVJWSUNFX0RJQUxFQ1QgLSBTZXJ2aWNlIGxldmVsIGRpYWxlY3Qgc3BlY2lmaWMgZGF0YSBsb2NhdG9yIGkuZS4gcGx1Zy1pbiBkYXRhIGxvY2F0b3IgcmVnaXN0ZXJlZAotICogdXNpbmcgPGRpYWxlY3RMb2NhdG9yPiBlbGVtZW50IGluIHNlcnZpY2VzLnhtbC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTG9jYXRvclR5cGUgewotICAgIGludCB0eXBlOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgREVGQVVMVF9BWElTID0gbmV3IExvY2F0b3JUeXBlKDApOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgR0xPQkFMX0xFVkVMID0gbmV3IExvY2F0b3JUeXBlKDEpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgR0xPQkFMX0RJQUxFQ1QgPSBuZXcgTG9jYXRvclR5cGUoMik7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBMb2NhdG9yVHlwZSBTRVJWSUNFX0xFVkVMID0gbmV3IExvY2F0b3JUeXBlKDMpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgTG9jYXRvclR5cGUgU0VSVklDRV9ESUFMRUNUID0gbmV3IExvY2F0b3JUeXBlKDQpOwotCi0KLSAgICBwcm90ZWN0ZWQgTG9jYXRvclR5cGUoaW50IGludHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSBpbnR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvT3V0cHV0Rm9ybS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvT3V0cHV0Rm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg1ZTM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL091dHB1dEZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1wdWJsaWMgY2xhc3MgT3V0cHV0Rm9ybSB7Ci0gICAgU3RyaW5nIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBQb3NzaWJsZSBPdXRwdXQgZm9ybWF0cyBhcyBzdGF0ZWQgaW4gPHhzOmNob2ljZT4gb2YgPE1ldGFkYXRhU2VjdGlvbj4KLSAgICAgKiBpbiB0aGUgV1MtTUVYIHNwZWNpZmljYXRpb24uCi0gICAgICovCi0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIE91dHB1dEZvcm0gSU5MSU5FX0ZPUk0gPSBuZXcgT3V0cHV0Rm9ybSgiSU5MSU5FX0ZPUk0iKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIE91dHB1dEZvcm0gTE9DQVRJT05fRk9STSA9IG5ldyBPdXRwdXRGb3JtKCJMT0NBVElPTl9GT1JNIik7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBPdXRwdXRGb3JtIFJFRkVSRU5DRV9GT1JNID0gbmV3IE91dHB1dEZvcm0oIlJFRkVSRU5DRV9GT1JNIik7Ci0KLSAgICBwcm90ZWN0ZWQgT3V0cHV0Rm9ybShTdHJpbmcgaW50eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IGludHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9Qb2xpY3lEYXRhTG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvUG9saWN5RGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5MThlOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9Qb2xpY3lEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLQotLyoqCi0gKiBBeGlzIDIgRGF0YSBMb2NhdG9yIHJlc3BvbnNpYmxlcyBmb3IgcmV0cmlldmluZyBQb2xpY3kgbWV0YWRhdGEuIFRoZSBjbGFzcyBpcwotICogY3JlYXRlZCBhcyBtb2RlbCBmb3IgcG9saWN5IHNwZWNpZmljIGRhdGEgbG9jYXRvcjsgYW5kIGFsc28gZWFzaWVyIGZvciBhbnkKLSAqIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBwb2xpY3kgc3BlY2lmaWMgZGF0YSByZXRyaWV2YWwgbG9naWMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQb2xpY3lEYXRhTG9jYXRvciBleHRlbmRzIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cwotCQlBeGlzRGF0YUxvY2F0b3IgewotCi0JcHJvdGVjdGVkIFBvbGljeURhdGFMb2NhdG9yKCkgewotCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUG9saWN5RGF0YUxvY2F0b3IoU2VydmljZURhdGFbXSBkYXRhKSB7Ci0JCWRhdGFMaXN0ID0gZGF0YTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9TY2hlbWFEYXRhTG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvU2NoZW1hRGF0YUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwM2FjNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9TY2hlbWFEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQXhpcyAyIERhdGEgTG9jYXRvciByZXNwb25zaWJsZXMgZm9yIHJldHJpZXZpbmcgU2NoZW1hIG1ldGFkYXRhLiBUaGUgY2xhc3MgaXMKLSAqIGNyZWF0ZWQgYXMgbW9kZWwgZm9yIHNjaGVtYSBzcGVjaWZpYyBkYXRhIGxvY2F0b3I7IGFuZCBhbHNvIGVhc2llciBmb3IgYW55Ci0gKiBmdXR1cmUgaW1wbGVtZW50YXRpb24gc2NoZW1hIHNwZWNpZmljIGRhdGEgcmV0cmlldmFsIGxvZ2ljLgotICovCi0KLXB1YmxpYyBjbGFzcyBTY2hlbWFEYXRhTG9jYXRvciBleHRlbmRzIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cwotICAgICAgICBBeGlzRGF0YUxvY2F0b3IgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdElkZW50aWZpZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUVQUiA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU2NoZW1hRGF0YUxvY2F0b3IuY2xhc3MKLSAgICAgICAgICAgIC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0KLSAgICBwcm90ZWN0ZWQgU2NoZW1hRGF0YUxvY2F0b3IoKSB7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHByb3RlY3RlZCBTY2hlbWFEYXRhTG9jYXRvcihTZXJ2aWNlRGF0YVtdIGRhdGEpIHsKLSAgICAgICAgZGF0YUxpc3QgPSBkYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCi0gICAgICAgIHJlcXVlc3RJZGVudGlmaWVyID0gcmVxdWVzdC5nZXRJZGVudGlmaWVyKCk7Ci0gICAgICAgIHNlcnZpY2VFUFIgPSBtc2dDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpOwotCi0gICAgICAgIE91dHB1dEZvcm0gb3V0cHV0Rm9ybSA9IHJlcXVlc3QuZ2V0T3V0cHV0Rm9ybSgpOwotICAgICAgICBpZiAob3V0cHV0Rm9ybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRwdXRGb3JtID0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STTsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFbXSBkYXRhOwotCi0gICAgICAgIGlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pIHsKLSAgICAgICAgICAgIGRhdGEgPSBvdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEZvcm0gPT0gT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKSB7Ci0gICAgICAgICAgICBkYXRhID0gb3V0cHV0TG9jYXRpb25Gb3JtKGRhdGFMaXN0KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YSA9IG91dHB1dFJlZmVyZW5jZUZvcm0obXNnQ29udGV4dCwgZGF0YUxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRJbmxpbmVGb3JtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICBTZXJ2aWNlRGF0YVtdIHNlcnZpY2VEYXRhKSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgRGF0YVtdIGRhdGEgPSBzdXBlci5vdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIHNlcnZpY2VEYXRhKTsKLQotICAgICAgICBpZiAoZGF0YS5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgQXJyYXlMaXN0IHNjaGVtYUxpc3QgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLQotICAgICAgICBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWRlbnRpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZGVudGlmaWVyLmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKG5ldyBEYXRhKGNvbnZlcnRUb09NKHNjaGVtYSksIHJlcXVlc3RJZGVudGlmaWVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgRGF0YShjb252ZXJ0VG9PTShzY2hlbWEpLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKERhdGFbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBEYXRhW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRMb2NhdGlvbkZvcm0oU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YSkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLQotICAgICAgICBEYXRhW10gZGF0YSA9IHN1cGVyLm91dHB1dExvY2F0aW9uRm9ybShzZXJ2aWNlRGF0YSk7Ci0KLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IERhdGFbXSB7IG5ldyBEYXRhKHNlcnZpY2VFUFIgKyAiP3hzZCIsIHJlcXVlc3RJZGVudGlmaWVyKSB9OwotICAgIH0KLQotICAgIHByaXZhdGUgT01Ob2RlIGNvbnZlcnRUb09NKFhtbFNjaGVtYSBzY2hlbWEpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgc2NoZW1hLndyaXRlKHdyaXRlcik7Ci0KLSAgICAgICAgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIod3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIFhNTFV0aWxzLnRvT00ocmVhZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY29udmVydCBYbWxTY2hlbWEgb2JqZWN0IHRvIGFuIE9NRWxlbWVudCIsIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvU2NoZW1hU3VwcGxpZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1NjaGVtYVN1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWE2ZTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvU2NoZW1hU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOw0KLQ0KLS8qKg0KLSAqIFJldHVybiBhIFhNTFNjaGVtYSBhcyBhbiBPTUVsZW1lbnQuICBUaGlzIGlzIHVzZWQgYnkgYW55IEF4aXNTZXJ2aWNlIHRoYXQgd2lzaGVzDQotICogdG8gb3ZlcnJpZGUgdGhlIHN0YW5kYXJkIEF4aXNTZXJ2aWNlMldTREwgKHNlZSB0aGUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbg0KLSAqIHBhY2thZ2UpIG1ldGhvZCBvZiBnZXR0aW5nIFhTRC4gIElmIG9uZSBvZiB0aGVzZSBpcyBwcmVzZW50IGluIHRoZSBBeGlzU2VydmljZQ0KLSAqIFBhcmFtZXRlcnMgdW5kZXIgdGhlIG5hbWUgIlNjaGVtYVN1cHBsaWVyIiwgaXQgd2lsbCBiZSBxdWVyaWVkLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hU3VwcGxpZXIgew0KLSAgICBYbWxTY2hlbWEgZ2V0U2NoZW1hKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyB4c2QpIHRocm93cyBBeGlzRmF1bHQ7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1NlcnZpY2VEYXRhLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9TZXJ2aWNlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTczMzJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1NlcnZpY2VEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBUaGlzIHJlcHJlc2VudHMgdGhlIHNlcnZpY2UgZGF0YSBmb3IgYSBkaWFsZWN0IGFuZCBpZGVudGlmaWVyIGlmIHNwZWNpZmllZC4KLSAqIEJhc2ljYWxseSwgdGhlIERhdGEgZWxlbWVudCBkZWZpbmVkIGluIHRoZSBTZXJ2aWNlRGF0YS54bWwgcGFja2FnZWQgaW4KLSAqIGEgV2ViIFNlcnZpY2UncyBhY2hpZXZlIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIFNlcnZpY2VEYXRhIHsKLSAgICBPTUVsZW1lbnQgZGF0YTsKLQotICAgIFN0cmluZyBpZGVudGlmaWVyOwotCi0gICAgU3RyaW5nIGRpYWxlY3Q7Ci0KLSAgICBTdHJpbmcgZmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqCi0gICAgICogQHBhcmFtIGluX2RhdGEgYW4gRGF0YSBlbGVtZW50IGluIHRoZSBTZXJ2aWNlRGF0YS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyBTZXJ2aWNlRGF0YShPTUVsZW1lbnQgaW5fZGF0YSkgewotICAgICAgICBkYXRhID0gaW5fZGF0YTsKLSAgICAgICAgaWRlbnRpZmllciA9IGdldEF0dHJpYnV0ZVZhbHVlKERSQ29uc3RhbnRzLlNFUlZJQ0VfREFUQS5JREVOVElGSUVSKTsKLSAgICAgICAgZGlhbGVjdCA9IGdldEF0dHJpYnV0ZVZhbHVlKERSQ29uc3RhbnRzLlNFUlZJQ0VfREFUQS5ESUFMRUNUKTsKLSAgICAgICAgZmlsZU5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShEUkNvbnN0YW50cy5TRVJWSUNFX0RBVEEuRklMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgcU5hbWUpIHsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBkYXRhLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUocU5hbWUpKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgfQotCi0gICAgLy8gcmV0dXJuIGlkZW50aWZpZXIgZm9yIHRoaXMgRGF0YSBlbGVtZW50Ci0gICAgcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotICAgICAgICByZXR1cm4gaWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICAvLyByZXR1cm4gZGlhbGVjdCBmb3IgdGhpcyBEYXRhIGVsZW1lbnQKLSAgICBwdWJsaWMgU3RyaW5nIGdldERpYWxlY3QoKSB7Ci0gICAgICAgIHJldHVybiBkaWFsZWN0OwotICAgIH0KLQotICAgIC8vIHJldHVybiB0aGUgRGF0YSBFTGVtZW50Ci0gICAgcHVibGljIE9NRWxlbWVudCBnZXRPTURhdGEoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotCi0gICAgLy8gR2V0IFVSTCBmcm9tIGRhdGEgRWxlbWVudAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCi0gICAgICAgIFN0cmluZyB1cmxWYWx1ZSA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCB1cmwgPSBkYXRhLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgRFJDb25zdGFudHMuU0VSVklDRV9EQVRBLlVSTCkpOwotICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVybFZhbHVlID0gdXJsLmdldFRleHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB1cmxWYWx1ZTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgRU5EUE9JTlRfUkVGRVJFTkNFIGZyb20gRGF0YSBFbGVtZW50Ci0gICAgcHVibGljIE9NRWxlbWVudCBnZXRFbmRwb2ludFJlZmVyZW5jZSgpIHsKLSAgICAgICAgT01FbGVtZW50IGVwciA9IGRhdGEuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBEUkNvbnN0YW50cy5TRVJWSUNFX0RBVEEuRU5EUE9JTlRfUkVGRVJFTkNFKSk7Ci0gICAgICAgIHJldHVybiBlcHI7Ci0gICAgfQotCi0gICAgLy8gTG9hZCB0aGUgZmlsZSBjb250ZW50IG9mIHRoZSBmaWxlIHNwZWNpZmllZCBpbiB0aGUgZmlsZSBhdHRyaWJ1dGUKLSAgICAvLyBpbiB0aGUgZGF0YSBlbGVtZW50LgotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0RmlsZUNvbnRlbnQoQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpCi0gICAgICAgICAgICB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIERhdGFSZXRyaWV2YWxVdGlsIHV0aWwgPSBEYXRhUmV0cmlldmFsVXRpbC5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBtZXRhRWxlbWVudCA9IHV0aWwuYnVpbGRPTShjbGFzc2xvYWRlciwgZmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRhRWxlbWVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9XU0RMRGF0YUxvY2F0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1dTRExEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE1ZTcyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kYXRhcmV0cmlldmFsL1dTRExEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTJXU0RMMTE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQXhpcyAyIERhdGEgTG9jYXRvciByZXNwb25zaWJsZXMgZm9yIHJldHJpZXZpbmcgV1NETCBtZXRhZGF0YS4KLSAqLwotcHVibGljIGNsYXNzIFdTRExEYXRhTG9jYXRvciBleHRlbmRzIEJhc2VBeGlzRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBBeGlzRGF0YUxvY2F0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMRGF0YUxvY2F0b3IuY2xhc3MpOwotICAgIFN0cmluZyBzZXJ2aWNlVVJMID0gbnVsbDsKLSAgICBBeGlzU2VydmljZSB0aGVTZXJ2aWNlID0gbnVsbDsKLSAgICBTdHJpbmcgcmVxdWVzdF9JZGVudGlmaWVyID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBXU0RMRGF0YUxvY2F0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIGFuIGFycmF5IG9mIFNlcnZpY2VEYXRhIGluc3RhbmNlIGRlZmluZWQgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgU2VydmljZURhdGEueG1sIGZvciB0aGUgV1NETCBkaWFsZWN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBXU0RMRGF0YUxvY2F0b3IoU2VydmljZURhdGFbXSBkYXRhKSB7Ci0gICAgICAgIGRhdGFMaXN0ID0gZGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXREYXRhIEFQSQotICAgICAqIEltcGxlbWVudCBkYXRhIHJldHJpZXZhbCBsb2dpYyBmb3IgV1NETCBkaWFsZWN0Ci0gICAgICovCi0gICAgcHVibGljIERhdGFbXSBnZXREYXRhKERhdGFSZXRyaWV2YWxSZXF1ZXN0IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLnRyYWNlKCJEZWZhdWx0IFdTREwgRGF0YUxvY2F0b3IgZ2V0RGF0YSBzdGFydHMiKTsKLQotICAgICAgICByZXF1ZXN0X0lkZW50aWZpZXIgPSByZXF1ZXN0LmdldElkZW50aWZpZXIoKTsKLSAgICAgICAgc2VydmljZVVSTCA9IG1zZ0NvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCk7Ci0KLSAgICAgICAgT3V0cHV0Rm9ybSBvdXRwdXRmb3JtID0gcmVxdWVzdC5nZXRPdXRwdXRGb3JtKCk7Ci0KLSAgICAgICAgaWYgKG91dHB1dGZvcm0gPT0gbnVsbCkgeyAvLyBub3QgZGVmaW5lZCwgZGVmdWFsdCB0byBpbmxpbmUKLSAgICAgICAgICAgIG91dHB1dGZvcm0gPSBPdXRwdXRGb3JtLklOTElORV9GT1JNOwotICAgICAgICB9Ci0KLSAgICAgICAgRGF0YVtdIG91dHB1dDsKLQotICAgICAgICBTdHJpbmcgb3V0cHV0Rm9ybVN0cmluZyA9IG91dHB1dGZvcm0uZ2V0VHlwZSgpOwotCi0gICAgICAgIGlmIChvdXRwdXRmb3JtID09IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pIHsKLSAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dElubGluZUZvcm0obXNnQ29udGV4dCwgZGF0YUxpc3QpOwotICAgICAgICB9IGVsc2UgaWYgKG91dHB1dGZvcm0gPT0gT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRMb2NhdGlvbkZvcm0oZGF0YUxpc3QpOwotCi0gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0Zm9ybSA9PSBPdXRwdXRGb3JtLlJFRkVSRU5DRV9GT1JNKSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRSZWZlcmVuY2VGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0SW5saW5lRm9ybShtc2dDb250ZXh0LCBkYXRhTGlzdCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgIk51bGwgZGF0YSByZXR1cm4hIERhdGEgTG9jYXRvciBkb2VzIG5vdCBrbm93IGhvdyB0byBoYW5kbGUgcmVxdWVzdCBmb3IgZGlhbGVjdD0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0RGlhbGVjdCgpICsgIiBpbiB0aGUgZm9ybSBvZiAiICsgb3V0cHV0Rm9ybVN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGxvZy50cmFjZSgiRGVmYXVsdCBXU0RMIERhdGFMb2NhdG9yIGdldERhdGEgZW5kcyIpOwotCi0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5CYXNlQXhpc0RhdGFMb2NhdG9yI291dHB1dElubGluZUZvcm0ob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuU2VydmljZURhdGFbXSkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGF0YVtdIG91dHB1dElubGluZUZvcm0oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgU2VydmljZURhdGFbXSBkYXRhTGlzdCkKLSAgICAgICAgICAgIHRocm93cyBEYXRhUmV0cmlldmFsRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YVtdICByZXN1bHQgPSBzdXBlci5vdXRwdXRJbmxpbmVGb3JtKG1zZ0NvbnRleHQsIGRhdGFMaXN0KTsKLQotICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgV1NETCBpZiBJZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgYXMKLSAgICAgICAgLy8gKDEpIHRoaXMgaXMgdG8gc3VwcG9ydCA/d3NkbCByZXF1ZXN0OyAKLSAgICAgICAgLy8gKDIpIERhdGEgZm9yIHNwZWNpZmllZCBJZGVudGlmaWVyIG11c3QgYmUgYXZhaWxhYmxlIHRvIHNhdGlzZnkgdGhlIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0KLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBsb2cudHJhY2UoIkRlZmF1bHQgV1NETCBEYXRhTG9jYXRvciBhdHRlbXB0IHRvIGdlbmVyYXRlcyBXU0RMLiIpOwotCi0gICAgICAgICAgICBpZiAobXNnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhlU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlVVJMID0gbXNnQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICB0aGVTZXJ2aWNlLnNldEVuZHBvaW50VVJMKHNlcnZpY2VVUkwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbigiTWVzc2FnZUNvbnRleHQgd2FzIG5vdCBzZXQhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0X0lkZW50aWZpZXIgPT0gbnVsbCB8fCByZXF1ZXN0X0lkZW50aWZpZXIuZXF1YWxzKHRoZVNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZTJXU0RMMTEgYXhpc1NlcnZpY2UyV09NOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCB3c2RsRWxlbWVudDsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlMldPTSA9IG5ldyBBeGlzU2VydmljZTJXU0RMMTEodGhlU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxFbGVtZW50ID0gYXhpc1NlcnZpY2UyV09NLmdlbmVyYXRlT00oKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAod3NkbEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIkRlZmF1bHQgV1NETCBEYXRhTG9jYXRvciBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIFdTREwuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEYXRhWzFdOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSBuZXcgRGF0YSh3c2RsRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERhdGFbXSBvdXRwdXRMb2NhdGlvbkZvcm0oU2VydmljZURhdGFbXSBzZXJ2aWNlRGF0YSkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotICAgICAgICBEYXRhW10gcmVzdWx0ID0gc3VwZXIub3V0cHV0TG9jYXRpb25Gb3JtKHNlcnZpY2VEYXRhKTsKLQotICAgICAgICAvLyBEbyBub3QgZ2VuZXJhdGUgVVJMIGlmIElkZW50aWZpZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCBhcwotICAgICAgICAvLyAoMSkgQXhpczIgP3dzZGwgVVJMIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRpbmcgSWRlbnRpZmllcjsgCi0gICAgICAgIC8vICgyKSBVUkwgZGF0YSBmb3Igc3BlY2lmaWVkIElkZW50aWZpZXIgbXVzdCBiZSBhdmFpbGFibGUgdG8gc2F0aXNmeQotICAgICAgICAvLyAgICAgdGhlIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0KLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT0gMCAmJiByZXF1ZXN0X0lkZW50aWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IERhdGFbMV07Ci0gICAgICAgICAgICByZXN1bHRbMF0gPSBuZXcgRGF0YShzZXJ2aWNlVVJMICsgIj93c2RsIiwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvV1NETFN1cHBsaWVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9XU0RMU3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkZWVhZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9XU0RMU3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotDQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi0NCi0vKioNCi0gKiBSZXR1cm4gYSBXU0RMIGFzIGFuIE9NRWxlbWVudC4gIFRoaXMgaXMgdXNlZCBieSBhbnkgQXhpc1NlcnZpY2UgdGhhdCB3aXNoZXMNCi0gKiB0byBvdmVycmlkZSB0aGUgc3RhbmRhcmQgQXhpc1NlcnZpY2UyV1NETCAoc2VlIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uDQotICogcGFja2FnZSkgbWV0aG9kIG9mIGdldHRpbmcgV1NETC4gIElmIG9uZSBvZiB0aGVzZSBpcyBwcmVzZW50IGluIHRoZSBBeGlzU2VydmljZQ0KLSAqIFBhcmFtZXRlcnMgdW5kZXIgdGhlIG5hbWUgIldTRExTdXBwbGllciIsIGl0IHdpbGwgYmUgcXVlcmllZC4NCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExTdXBwbGllciB7DQotICAgIERlZmluaXRpb24gZ2V0V1NETChBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0Ow0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9jbGllbnQvTWV4Q2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGF0YXJldHJpZXZhbC9jbGllbnQvTWV4Q2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTllNWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RhdGFyZXRyaWV2YWwvY2xpZW50L01leENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgTWV4Q2xpZW50IGV4dGVuZHMgU2VydmljZUNsaWVudCB7Ci0KLSAgICBwdWJsaWMgTWV4Q2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV4Q2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHdzZGw0akRlZmluaXRpb24sIFFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwgU3RyaW5nIHBvcnROYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGw0akRlZmluaXRpb24sIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXhDbGllbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgVVJMIHdzZGxVUkwsCi0gICAgICAgICAgICAgICAgICAgICBRTmFtZSB3c2RsU2VydmljZU5hbWUsIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGxVUkwsIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXhDbGllbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgT01FbGVtZW50IHRoYXQgbWFrZXMgdXAgb2YgU09BUCBib2R5LgotICAgICAqLwotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2V0dXBHZXRNZXRhZGF0YVJlcXVlc3QoU3RyaW5nIGRpYWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQXR0ZW1wdCB0byBlbmdhZ2UgTUVYIG1vZHVsZQotICAgICAgICAvKiAgICB0cnl7Ci0gICAgICAgICAgc3VwZXIuZW5nYWdlTW9kdWxlKCJtZXRhZGF0YUV4Y2hhbmdlIik7Ci0gICAgICAgfQotICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSl7Ci0gICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0ICgiVW5hYmxlIHRvIHByb2NlZWQgd2l0aCBHZXRNZXRhZGF0YSBSZXF1ZXN0ISIsIGUpOwotICAgICAgIH0gKi8KLQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShEUkNvbnN0YW50cy5TUEVDLk5TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkNvbnN0YW50cy5TUEVDLk5TX1BSRUZJWCk7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoRFJDb25zdGFudHMuU1BFQy5HRVRfTUVUQURBVEEsIG9tTnMpOwotICAgICAgICBpZiAoZGlhbGVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZGlhbGVjdEVsZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KERSQ29uc3RhbnRzLlNQRUMuRElBTEVDVCwgb21Ocyk7Ci0KLSAgICAgICAgICAgIGRpYWxlY3RFbGVtLnNldFRleHQoZGlhbGVjdCk7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQoZGlhbGVjdEVsZW0pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNyZWF0ZSBJZGVudGlmaWVyIGVsZW1lbnQKLSAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgT01FbGVtZW50IGlkX0VsZW0gPSBmYWMuY3JlYXRlT01FbGVtZW50KERSQ29uc3RhbnRzLlNQRUMuSURFTlRJRklFUiwgb21Ocyk7Ci0gICAgICAgICAgICBpZF9FbGVtLnNldFRleHQoaWRlbnRpZmllcik7Ci0gICAgICAgICAgICBtZXRob2QuYWRkQ2hpbGQoaWRfRWxlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BeGlzQ29uZmlnQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQXhpc0NvbmZpZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkOGIwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BeGlzQ29uZmlnQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLmxpZmVjeWNsZS5MaWZlY3ljbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTUlNRUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk1UT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5TT0FQQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRFJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc09ic2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGFyZ2V0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlRocmVhZENvbnRleHRNaWdyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQXhpc0NvbmZpZ0J1aWxkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkJ1aWxkZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0NvbmZpZ0J1aWxkZXIuY2xhc3MpOwotICAgIHByaXZhdGUgRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lOwotCi0gICAgcHVibGljIEF4aXNDb25maWdCdWlsZGVyKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFbmdpbmUgZGVwbG95bWVudEVuZ2luZSkgewotICAgICAgICBzdXBlcihzZXJ2aWNlSW5wdXRTdHJlYW0sIGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgdGhpcy5kZXBsb3ltZW50RW5naW5lID0gZGVwbG95bWVudEVuZ2luZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBBeGlzQ29uZmlnQnVpbGRlcihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUNvbmZpZygpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBjb25maWdfZWxlbWVudCA9IGJ1aWxkT00oKTsKLQotICAgICAgICAgICAgaWYgKCFUQUdfQVhJU0NPTkZJRy5lcXVhbHMoY29uZmlnX2VsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmFkZWxlbWVudGZvdW5kIiwgVEFHX0FYSVNDT05GSUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBQYXJhbWV0ZXJzCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGV2ZWwgcGFyYW1ldGVycwotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gY29uZmlnX2VsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIGF4aXNDb25maWcsIGF4aXNDb25maWcpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzIE1lc3NhZ2VSZWNlaXZlcgotICAgICAgICAgICAgT01FbGVtZW50IG1lc3NhZ2VSZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfUkVDRUlWRVJTKSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZVJlY2VpdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIG1ycyA9IHByb2Nlc3NNZXNzYWdlUmVjZWl2ZXJzKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Iga2V5cyA9IG1ycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZVJlY2VpdmVyKGtleSwgKE1lc3NhZ2VSZWNlaXZlcikgbXJzLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQcm9jZXNzIE1vZHVsZSByZWZzCi0gICAgICAgICAgICBJdGVyYXRvciBtb2R1bGVpdHIgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19NT0RVTEUpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc01vZHVsZVJlZnMobW9kdWxlaXRyLCBheGlzQ29uZmlnKTsKLQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBUcmFuc3BvcnQgU2VuZGVycwotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX3NlbmRlcnMgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfVFJBTlNQT1JUX1NFTkRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzVHJhbnNwb3J0U2VuZGVycyh0cnNfc2VuZGVycyk7Ci0KLSAgICAgICAgICAgIC8vIFByb2Nlc3NpbmcgVHJhbnNwb3J0IFJlY2VpdmVycwotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX1JlaXZlcnMgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfVFJBTlNQT1JUX1JFQ0VJVkVSKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NUcmFuc3BvcnRSZWNlaXZlcnModHJzX1JlaXZlcnMpOwotCi0gICAgICAgICAgICAvLyBQcm9jZXNzIFRhcmdldFJlc29sdmVycwotICAgICAgICAgICAgT01FbGVtZW50IHRhcmdldFJlc29sdmVycyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RBUkdFVF9SRVNPTFZFUlMpKTsKLSAgICAgICAgICAgIHByb2Nlc3NUYXJnZXRSZXNvbHZlcnMoYXhpc0NvbmZpZywgdGFyZ2V0UmVzb2x2ZXJzKTsKLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBUaHJlYWRDb250ZXh0TWlncmF0b3JzCi0gICAgICAgICAgICBPTUVsZW1lbnQgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RIUkVBRF9DT05URVhUX01JR1JBVE9SUykpOwotICAgICAgICAgICAgcHJvY2Vzc1RocmVhZENvbnRleHRNaWdyYXRvcnMoYXhpc0NvbmZpZywgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycyk7Ci0KLSAgICAgICAgICAgIC8vIFByb2Nlc3MgT2JzZXJ2ZXJzCi0gICAgICAgICAgICBJdGVyYXRvciBvYnNfaXR0ciA9IGNvbmZpZ19lbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19MSVNURU5FUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzT2JzZXJ2ZXJzKG9ic19pdHRyKTsKLQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBQaGFzZSBvcmRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBoYXNlb3JkZXJzID0gY29uZmlnX2VsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BIQVNFX09SREVSKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NQaGFzZU9yZGVycyhwaGFzZW9yZGVycyk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTU9EVUxFX0NPTkZJRykpOwotCi0gICAgICAgICAgICBwcm9jZXNzTW9kdWxlQ29uZmlnKG1vZHVsZUNvbmZpZ3MsIGF4aXNDb25maWcsIGF4aXNDb25maWcpOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5PiAuLiA8Ly4uPiBlbGVtZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgcG9saWN5RWxlbWVudHMgPSBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfUE9MSUNZKSk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeUVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NQb2xpY3lFbGVtZW50cyhwb2xpY3lFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRQb2xpY3lTdWJqZWN0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5UmVmZXJlbmNlPiAuLiA8Ly4uPiBlbGVtZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgcG9saWN5UmVmRWxlbWVudHMgPSBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfUE9MSUNZX1JFRikpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5UmVmRWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lSZWZFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUG9saWN5UmVmRWxlbWVudHMocG9saWN5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0UG9saWN5U3ViamVjdCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy90byBwcm9jZXNzIGRlZmF1bHQgbW9kdWxlIHZlcnNpb25zCi0gICAgICAgICAgICBPTUVsZW1lbnQgZGVmYXVsdE1vZHVsZVZlcmlvbkVsZW1lbnQgPSBjb25maWdfZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBUQUdfREVGQVVMVF9NT0RVTEVfVkVSU0lPTikpOwotICAgICAgICAgICAgaWYgKGRlZmF1bHRNb2R1bGVWZXJpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVmYXVsdE1vZHVsZVZlcnNpb25zKGRlZmF1bHRNb2R1bGVWZXJpb25FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IGNsdXN0ZXJFbGVtZW50ID0gY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0NMVVNURVIpKTsKLSAgICAgICAgICAgIGlmIChjbHVzdGVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2x1c3RlckJ1aWxkZXIgY2x1c3RlckJ1aWxkZXIgPSBuZXcgQ2x1c3RlckJ1aWxkZXIoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgY2x1c3RlckJ1aWxkZXIuYnVpbGRDbHVzdGVyKGNsdXN0ZXJFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9BZGQganRhIHRyYW5zYWN0aW9uICBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBPTUVsZW1lbnQgdHJhbnNhY3Rpb25FbGVtZW50ID0gY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RSQU5TQUNUSU9OKSk7Ci0gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJJbmNsdWRlIHRyYW5zYWN0aW9uUGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcmFtZXRlcnMgPSB0cmFuc2FjdGlvbkVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIHRyYW5zYWN0aW9uUGFyYW1ldGVycywgbnVsbCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uIHR4Y2ZnID0gbmV3IFRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbih0cmFuc2FjdGlvblBhcmFtZXRlcnMpOwotCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdGltZW91dEF0dHJpYnV0ZSA9IHRyYW5zYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19USU1FT1VUKSk7Ci0gICAgICAgICAgICAgICAgaWYodGltZW91dEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR4Y2ZnLnNldFRyYW5zYWN0aW9uVGltZW91dChJbnRlZ2VyLnBhcnNlSW50KHRpbWVvdXRBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuc2V0VHJhbnNhY3Rpb25Db25maWcodHhjZmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogQWRkIEF4aXMyIGRlZmF1bHQgYnVpbGRlcnMgaWYgdGhleSBhcmUgbm90IG92ZXJpZGRlbiBieSB0aGUgY29uZmlnCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigibXVsdGlwYXJ0L3JlbGF0ZWQiLCBuZXcgTUlNRUJ1aWxkZXIoKSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi9zb2FwK3htbCIsIG5ldyBTT0FQQnVpbGRlcigpKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoInRleHQveG1sIiwgbmV3IFNPQVBCdWlsZGVyKCkpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlQnVpbGRlcigiYXBwbGljYXRpb24veG9wK3htbCIsIG5ldyBNVE9NQnVpbGRlcigpKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3htbCIsIG5ldyBBcHBsaWNhdGlvblhNTEJ1aWxkZXIoKSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEZvcm1VUkxFbmNvZGVkQnVpbGRlcigpKTsKLSAgICAgICAgICAgIC8vIHByb2Nlc3MgTWVzc2FnZUJ1aWxkZXJzCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWVzc2FnZUJ1aWxkZXJzRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfQlVJTERFUlMpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlQnVpbGRlcnNFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBIYXNoTWFwIGJ1aWxkZXJTZWxlY3RvciA9IHByb2Nlc3NNZXNzYWdlQnVpbGRlcnMobWVzc2FnZUJ1aWxkZXJzRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Iga2V5cyA9IGJ1aWxkZXJTZWxlY3Rvci5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkTWVzc2FnZUJ1aWxkZXIoa2V5LCAoQnVpbGRlcikgYnVpbGRlclNlbGVjdG9yLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLy9wcm9jZXNzIGRhdGFMb2NhdG9yIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIE9NRWxlbWVudCBkYXRhTG9jYXRvckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKERSQ29uc3RhbnRzLkRBVEFfTE9DQVRPUl9FTEVNRU5UKSk7Ci0KLSAgICAgICAgICAgIGlmIChkYXRhTG9jYXRvckVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhTG9jYXRvckNvbmZpZyhkYXRhTG9jYXRvckVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBwcm9jZXNzIHJvbGVwbGF5ZXIgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgT01FbGVtZW50IHJvbGVQbGF5ZXJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShDb25zdGFudHMuU09BUF9ST0xFX0NPTkZJR1VSQVRJT05fRUxFTUVOVCkpOwotCi0gICAgICAgICAgICBpZiAocm9sZVBsYXllckVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTT0FQUm9sZUNvbmZpZyhheGlzQ29uZmlnLCByb2xlUGxheWVyRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgTWVzc2FnZUZvcm1hdHRlcnMKLSAgICAgICAgICAgIE9NRWxlbWVudCBtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdfZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NRVNTQUdFX0ZPUk1BVFRFUlMpKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEhhc2hNYXAgbWVzc2FnZUZvcm1hdHRlcnMgPSBwcm9jZXNzTWVzc2FnZUZvcm1hdHRlcnMobWVzc2FnZUZvcm1hdHRlcnNFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBrZXlzID0gbWVzc2FnZUZvcm1hdHRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VGb3JtYXR0ZXIoa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VGb3JtYXR0ZXIpIG1lc3NhZ2VGb3JtYXR0ZXJzLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1Byb2Nlc3NpbmcgZGVwbG95ZXJzLgotICAgICAgICAgICAgSXRlcmF0b3IgZGVwbG95ZXJJdHIgPSBjb25maWdfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShERVBMT1lFUikpOwotICAgICAgICAgICAgaWYgKGRlcGxveWVySXRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVwbG95ZXJzKGRlcGxveWVySXRyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9wcm9jZXNzIEF0dGFjaG1lbnRzIExpZmVjeWNsZSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIE9NRWxlbWVudCBhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShBVFRBQ0hNRU5UU19MSUZFQ1lDTEVfTUFOQUdFUikpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNobWVudHNMaWZlY3ljbGVNYW5hZ2VyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlcihheGlzQ29uZmlnLCBhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXJFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYXJnZXRSZXNvbHZlcnMoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywgT01FbGVtZW50IHRhcmdldFJlc29sdmVycykgewotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFyZ2V0UmVzb2x2ZXJzLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19UQVJHRVRfUkVTT0xWRVIpKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgdGFyZ2V0UmVzb2x2ZXIgPSAoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgY2xhc3NOYW1lQXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFJlc29sdmVyLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NOYW1lQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhc3NJbnN0YW5jZSA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgVGFyZ2V0UmVzb2x2ZXIgdHIgPSAoVGFyZ2V0UmVzb2x2ZXIpIGNsYXNzSW5zdGFuY2UubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRUYXJnZXRSZXNvbHZlcih0cik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzVGFyZ2V0UmVzb2x2ZXJzOiBFeGNlcHRpb24gdGhyb3duIGluaXRpYWxpc2luZyBUYXJnZXRSZXNvbHZlcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUaHJlYWRDb250ZXh0TWlncmF0b3JzKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsIE9NRWxlbWVudCB0YXJnZXRSZXNvbHZlcnMpIHsKLSAgICAgICAgaWYgKHRhcmdldFJlc29sdmVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRhcmdldFJlc29sdmVycy5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1IpKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgdGhyZWFkQ29udGV4dE1pZ3JhdG9yID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGxpc3RJZEF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHRNaWdyYXRvci5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19MSVNUX0lEKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RJZCA9IGxpc3RJZEF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGNsYXNzTmFtZUF0dHJpYnV0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZENvbnRleHRNaWdyYXRvci5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzTmFtZUF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3IgbWlncmF0b3IgPSAoVGhyZWFkQ29udGV4dE1pZ3JhdG9yKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLmFkZFRocmVhZENvbnRleHRNaWdyYXRvcihheGlzQ29uZmlnLCBsaXN0SWQsIG1pZ3JhdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGlzYWJsZWQgLSAiICsgY2xhc3NOYW1lICsgIiAtICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzVGhyZWFkQ29udGV4dE1pZ3JhdG9yczogRXhjZXB0aW9uIHRocm93biBpbml0aWFsaXNpbmcgVGhyZWFkQ29udGV4dE1pZ3JhdG9yOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0F0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlcihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXNzSW5zdGFuY2UgPSBMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSAoTGlmZWN5Y2xlTWFuYWdlcikgY2xhc3NJbnN0YW5jZS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIoRGVwbG95bWVudENvbnN0YW50cy5BVFRBQ0hNRU5UU19MSUZFQ1lDTEVfTUFOQUdFUiwgbWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc0F0dGFjaG1lbnRzTGlmZWN5Y2xlTWFuYWdlcjogRXhjZXB0aW9uIHRocm93biBpbml0aWFsaXNpbmcgTGlmZWN5Y2xlTWFuYWdlcjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzU09BUFJvbGVDb25maWcoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZywgT01FbGVtZW50IHNvYXByb2xlY29uZmlnRWxlbWVudCkgewotICAgIAlpZiAoc29hcHJvbGVjb25maWdFbGVtZW50ICE9IG51bGwpIHsKLSAgICAJCWZpbmFsIGJvb2xlYW4gaXNVbHRpbWF0ZVJlY2VpZXZlciA9IEphdmFVdGlscy5pc1RydWUoc29hcHJvbGVjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShDb25zdGFudHMuU09BUF9ST0xFX0lTX1VMVElNQVRFX1JFQ0VJVkVSX0FUVFJJQlVURSkpLCB0cnVlKTsKLSAgICAJCUFycmF5TGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc29hcHJvbGVjb25maWdFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKENvbnN0YW50cy5TT0FQX1JPTEVfRUxFTUVOVCkpOwotICAgIAkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgIAkJCU9NRWxlbWVudCByb2xlRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAJCQlyb2xlcy5hZGQocm9sZUVsZW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAJCX0KLSAgICAJCWZpbmFsIExpc3QgdW5tb2RpZmlhYmxlUm9sZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJvbGVzKTsKLSAgICAJCXRyeXsKLSAgICAJCQlSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSBuZXcgUm9sZVBsYXllcigpewotICAgIAkJCQlwdWJsaWMgTGlzdCBnZXRSb2xlcygpIHsKLSAgICAJCQkJCXJldHVybiB1bm1vZGlmaWFibGVSb2xlczsKLSAgICAJCQkJfQotICAgIAkJCQlwdWJsaWMgYm9vbGVhbiBpc1VsdGltYXRlRGVzdGluYXRpb24oKSB7Ci0gICAgCQkJCQlyZXR1cm4gaXNVbHRpbWF0ZVJlY2VpZXZlcjsKLSAgICAJCQkJfQotICAgIAkJCX07Ci0gICAgCQkJYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIoInJvbGVQbGF5ZXIiLCByb2xlUGxheWVyKTsKLSAgICAJCX0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgCQkJaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgCQkJCWxvZy50cmFjZSgKLSAgICAJCQkJCQkicHJvY2Vzc1RhcmdldFJlc29sdmVyczogRXhjZXB0aW9uIHRocm93biBpbml0aWFsaXNpbmcgVGFyZ2V0UmVzb2x2ZXI6ICIgKwotICAgIAkJCQkJCWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZXBsb3llcnMoSXRlcmF0b3IgZGVwbG95ZXJJdHIpIHsKLSAgICAgICAgSGFzaE1hcCBleHRlbnNpb25Ub0RlcGxveWVyTWFwcGluZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIERlcGxveWVyPj4gZGVwbG95ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+KCk7Ci0gICAgICAgIHdoaWxlIChkZXBsb3llckl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgZGVwbG95ZXJJdHIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKERJUkVDVE9SWSkpOwotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKCJEZXBsb3llciBtaXNzaW5nICdkaXJlY3RvcnknIGF0dHJpYnV0ZSA6ICIgKyBlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoRVhURU5TSU9OKSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkRlcGxveWVyIG1pc3NpbmcgJ2V4dGVuc2lvbicgYXR0cmlidXRlIDogIiArIGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEEgbGVhZGluZyBkb3QgaXMgcmVkdW5kYW50LCBzbyBzdHJpcCBpdC4gIFNvIHdlIGFsbG93IGVpdGhlciAiLmZvbyIgb3IgImZvbyIsIGVpdGhlcgotICAgICAgICAgICAgLy8gb2Ygd2hpY2ggd2lsbCByZXN1bHQgaW4gZXh0ZW5zaW9uPSJmb28iCi0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmNoYXJBdCgwKSA9PSAnLicpIGV4dGVuc2lvbiA9IGV4dGVuc2lvbi5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBkZXBsb3llckNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgICAgICBEZXBsb3llciBkZXBsb3llcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZGVwbG95ZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoZGVwbG95ZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGRlcGxveWVyID0gKERlcGxveWVyKSBkZXBsb3llckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkRpc2FibGVkIC0gIiArIGRlcGxveWVyQ2xhc3NOYW1lICsgIiAtICIgKyBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGRlcGxveWVyICIgKyBkZXBsb3llckNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlcGxveWVyLnNldERpcmVjdG9yeShkaXJlY3RvcnkpOwotICAgICAgICAgICAgZGVwbG95ZXIuc2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIERlcGxveWVyPiBleHRlbnNpb25NYXAgPSBkZXBsb3llcnMuZ2V0KGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERlcGxveWVyPigpOwotICAgICAgICAgICAgICAgIGRlcGxveWVycy5wdXQoZGlyZWN0b3J5LCBleHRlbnNpb25NYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0ZW5zaW9uTWFwLnB1dChleHRlbnNpb24sIGRlcGxveWVyKTsKLSAgICAgICAgICAgIGV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwLnB1dChleHRlbnNpb24sIGRlcGxveWVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVwbG95bWVudEVuZ2luZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLnNldEV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwKGV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwKTsKLSAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUuc2V0RGVwbG95ZXJzKGRlcGxveWVycyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAobW9kdWxlQ29uZmlncy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVDb25maWcgPSAoT01FbGVtZW50KSBtb2R1bGVDb25maWdzLm5leHQoKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIG1vZHVsZU5hbWVfYXR0ID0gbW9kdWxlQ29uZmlnLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX05BTUUpKTsKLQotICAgICAgICAgICAgaWYgKG1vZHVsZU5hbWVfYXR0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRV9DT05GSUcpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZSA9IG1vZHVsZU5hbWVfYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2R1bGVDb25maWd1cmF0aW9uKG1vZHVsZSwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBwYXJhbWV0ZXJzID0gbW9kdWxlQ29uZmlnLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLQotICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIG1vZHVsZUNvbmZpZ3VyYXRpb24sIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmFkZE1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBtb2R1bGVzIHRoYXQgaXMgcmVxdWlyZWQgdG8gYmUgZW5nYWdlZCBnbG9iYWxseS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kdWxlUmVmcyhJdGVyYXRvciBtb2R1bGVSZWZzLCBBeGlzQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVmTmFtZSA9IG1vZHVsZVJlZkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRHbG9iYWxNb2R1bGVSZWYocmVmTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgQXhpc09ic2VydmVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvc2VydmVycwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT2JzZXJ2ZXJzKEl0ZXJhdG9yIG9zZXJ2ZXJzKSB7Ci0gICAgICAgIHdoaWxlIChvc2VydmVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IG9ic2VydmVyZWxlbWVudCA9IChPTUVsZW1lbnQpIG9zZXJ2ZXJzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBeGlzT2JzZXJ2ZXIgb2JzZXJ2ZXI7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdHJzQ2xhcyA9IG9ic2VydmVyZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyc0NsYXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuT0JTRVJWRVJfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc05hbWUgPSB0cnNDbGFzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBDbGFzcyBvYnNlcnZlcmNsYXNzOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyY2xhc3MgPSAoQ2xhc3MpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9hZGVyLmxvYWRDbGFzcyhjbGFzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9ic2VydmVyID0gKEF4aXNPYnNlcnZlcikgb2JzZXJ2ZXJjbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgUGFyYW1ldGVycwotICAgICAgICAgICAgICAgIC8vIFByb2Nlc3Npbmcgc2VydmljZSBsZXZlbCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gb2JzZXJ2ZXJlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIG9ic2VydmVyLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmluaXQoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9PYnNlcnZlciBpbml0IG1heSB0aHJvdyBydW50aW1lIGV4Y2VwdGlvbiAsIGJ1dCB3ZSBjYW4gc3RpbAotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBBeGlzMgotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkT2JzZXJ2ZXJzKG9ic2VydmVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc1BoYXNlTGlzdChPTUVsZW1lbnQgcGhhc2VPcmRlcnMpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgcGhhc2VzID0gcGhhc2VPcmRlcnMuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BIQVNFKSk7Ci0KLSAgICAgICAgd2hpbGUgKHBoYXNlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwaGFzZWVsZW1lbnQgPSAoT01FbGVtZW50KSBwaGFzZXMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBoYXNlZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSkuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZUNsYXNzID0gcGhhc2VlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOwotICAgICAgICAgICAgUGhhc2UgcGhhc2U7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGhhc2UgPSBnZXRQaGFzZShwaGFzZUNsYXNzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJwaGFzZWNsYXNzbm90Zm91bmQiLCBwaGFzZUNsYXNzLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwaGFzZS5zZXROYW1lKHBoYXNlTmFtZSk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGhhbmRsZXJzID0gcGhhc2VlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19IQU5ETEVSKSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChoYW5kbGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgaGFuZGxlcnMubmV4dCgpOwotICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyID0gcHJvY2Vzc0hhbmRsZXIob21FbGVtZW50LCBheGlzQ29uZmlnLCBwaGFzZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlci5nZXRSdWxlcygpLnNldFBoYXNlTmFtZShwaGFzZU5hbWUpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChVdGlscy5sb2FkSGFuZGxlcihheGlzQ29uZmlnLmdldFN5c3RlbUNsYXNzTG9hZGVyKCksIGhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQaGFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkRpc2FibGVkIC0gIiArIGhhbmRsZXIgKyAiIC0gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBoYXNlbGlzdC5hZGQocGhhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBoYXNlbGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYWxsIHRoZSBwaGFzZSBvcmRlcnMgd2hpY2ggYXJlIGRlZmluZWQgaW4gYXhpczIueG1sLgotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlcmRlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BoYXNlT3JkZXJzKEl0ZXJhdG9yIHBoYXNlcmRlcnMpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgUGhhc2VzSW5mbyBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0KLSAgICAgICAgd2hpbGUgKHBoYXNlcmRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGhhc2VPcmRlcnMgPSAoT01FbGVtZW50KSBwaGFzZXJkZXJzLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBmbG93VHlwZSA9IHBoYXNlT3JkZXJzLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX1RZUEUpKS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoVEFHX0ZMT1dfSU4uZXF1YWxzKGZsb3dUeXBlKSkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0SU5QaGFzZXMocHJvY2Vzc1BoYXNlTGlzdChwaGFzZU9yZGVycykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfRkxPV19JTl9GQVVMVC5lcXVhbHMoZmxvd1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRJTl9GYXVsdFBoYXNlcyhwcm9jZXNzUGhhc2VMaXN0KHBoYXNlT3JkZXJzKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19GTE9XX09VVC5lcXVhbHMoZmxvd1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5zZXRPVVRQaGFzZXMocHJvY2Vzc1BoYXNlTGlzdChwaGFzZU9yZGVycykpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfRkxPV19PVVRfRkFVTFQuZXF1YWxzKGZsb3dUeXBlKSkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0T1VUX0ZhdWx0UGhhc2VzKHByb2Nlc3NQaGFzZUxpc3QocGhhc2VPcmRlcnMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRGVmYXVsdE1vZHVsZVZlcnNpb25zKE9NRWxlbWVudCBkZWZhdWx0VmVyc2lvbnMpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yIG1vZHVsZVZlcnNpb25zID0gZGVmYXVsdFZlcnNpb25zLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEUpKTsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVZlcnNpb25zLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIG1vZHVsZVZlcnNpb25zLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gb21FbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1vZHVsZW5hbWVjYW5ub3RiZW51bGwiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoQVRUUklCVVRFX0RFRkFVTFRfVkVSU0lPTikpOwotICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1vZHVsZXZlcnNpb25jYW5ub3RiZW51bGwiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZERlZmF1bHRNb2R1bGVWZXJzaW9uKG5hbWUsIHZlcnNpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCAgcHJvY2Vzc1RyYW5zcG9ydFJlY2VpdmVycyhJdGVyYXRvciB0cnNfc2VuZGVycykgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgdHJhbnNwb3J0UmVjZWl2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAodHJzX3NlbmRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydElOOwotICAgICAgICAgICAgT01FbGVtZW50IHRyYW5zcG9ydCA9IChPTUVsZW1lbnQpIHRyc19zZW5kZXJzLm5leHQoKTsKLSAgICAgICAgICAgIC8vIGdldHRpbmcgdHJhbnNwb3J0IE5hbWUKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHRyc05hbWUgPSB0cmFuc3BvcnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotICAgICAgICAgICAgaWYgKHRyc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdHJzTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRyYW5zcG9ydElOID0gbmV3IFRyYW5zcG9ydEluRGVzY3JpcHRpb24obmFtZSk7Ci0gICAgICAgICAgICAgICAgLy8gdHJhbnNwb3J0IGltcGwgY2xhc3MKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSB0cnNDbGFzID0gdHJhbnNwb3J0LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJzQ2xhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc05hbWUgPSB0cnNDbGFzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyByZWNlaXZlckNsYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lciByZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUcmFuc3BvcnRMaXN0ZW5lcikgcmVjZWl2ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0SU4uc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihkZXBsb3ltZW50RW5naW5lICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgZnJvbSBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgaW4gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGxlYXNlIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xhc3Nub3Rmb3VuZCIsIHRyc0NsYXMuZ2V0QXR0cmlidXRlVmFsdWUoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHRyYW5zcG9ydC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGl0ciwgdHJhbnNwb3J0SU4sIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdG8gYXhpczIgY29uZmlnCi0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkVHJhbnNwb3J0SW4odHJhbnNwb3J0SU4pOwotICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRSZWNlaXZlcnMuYWRkKHRyYW5zcG9ydElOKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRSZWNlaXZlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1RyYW5zcG9ydFNlbmRlcnMoSXRlcmF0b3IgdHJzX3NlbmRlcnMpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHRyc19zZW5kZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0b3V0OwotICAgICAgICAgICAgT01FbGVtZW50IHRyYW5zcG9ydCA9IChPTUVsZW1lbnQpIHRyc19zZW5kZXJzLm5leHQoKTsKLQotICAgICAgICAgICAgLy8gZ2V0dGluZyB0cmFuc3BvcnQgTmFtZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgdHJzTmFtZSA9IHRyYW5zcG9ydC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0KLSAgICAgICAgICAgIGlmICh0cnNOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHRyc05hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIHRyYW5zcG9ydG91dCA9IG5ldyBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbihuYW1lKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyYW5zcG9ydCBpbXBsIGNsYXNzCi0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgdHJzQ2xhcyA9IHRyYW5zcG9ydC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodHJzQ2xhcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5UUkFOU1BPUlRfU0VOREVSX0VSUk9SLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNOYW1lID0gdHJzQ2xhcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIENsYXNzIHNlbmRlcjsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRlciA9IExvYWRlci5sb2FkQ2xhc3MoY2xhc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciB0cmFuc3BvcnRTZW5kZXIgPSAoVHJhbnNwb3J0U2VuZGVyKSBzZW5kZXIubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRvdXQuc2V0U2VuZGVyKHRyYW5zcG9ydFNlbmRlcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBQYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgUGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGV2ZWwgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdHIgPSB0cmFuc3BvcnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGl0ciwgdHJhbnNwb3J0b3V0LCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRvIGF4aXMyIGNvbmZpZwotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZFRyYW5zcG9ydE91dCh0cmFuc3BvcnRvdXQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoZGVwbG95bWVudEVuZ2luZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJlcnJvcmlubG9hZGluZ3RzIiwgY2xhc05hbWUpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGZyb20gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0IGluIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGxlYXNlIGRvbid0IHRocm93IGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGFzc25vdGZvdW5kIiwgdHJzQ2xhcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5sb2FkaW5ndHMiLCBjbGFzTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5sb2FkaW5ndHMiLCBjbGFzTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5sb2FkaW5ndHMiLCBjbGFzTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJlcnJvcmlubG9hZGluZ3RzIiwgY2xhc05hbWUpLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogcHJvY2VzcyBkYXRhIGxvY2F0b3IgY29uZmlndXJhdGlvbiBmb3IgZGF0YSByZXRyaWV2YWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhTG9jYXRvckNvbmZpZyhPTUVsZW1lbnQgZGF0YUxvY2F0b3JFbGVtZW50KSB7Ci0gICAgICAgIE9NQXR0cmlidXRlIHNlcnZpY2VPdmVyYWxsRGF0YUxvY2F0b3JjbGFzcyA9IGRhdGFMb2NhdG9yRWxlbWVudAotICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKERSQ29uc3RhbnRzLkNMQVNTX0FUVFJJQlVURSkpOwotICAgICAgICBpZiAoc2VydmljZU92ZXJhbGxEYXRhTG9jYXRvcmNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBzZXJ2aWNlT3ZlcmFsbERhdGFMb2NhdG9yY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLmFkZERhdGFMb2NhdG9yQ2xhc3NOYW1lcyhEUkNvbnN0YW50cy5HTE9CQUxfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGF0YUxvY2F0b3JFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIERSQ29uc3RhbnRzLkRJQUxFQ1RfTE9DQVRPUl9FTEVNRU5UKSk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGxvY2F0b3JFbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgZGlhbGVjdCA9IGxvY2F0b3JFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgIERSQ29uc3RhbnRzLkRJQUxFQ1RfQVRUUklCVVRFKSk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBkaWFsZWN0Y2xhc3MgPSBsb2NhdG9yRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBEUkNvbnN0YW50cy5DTEFTU19BVFRSSUJVVEUpKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkRGF0YUxvY2F0b3JDbGFzc05hbWVzKGRpYWxlY3QuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxlY3RjbGFzcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcHJvY2Vzc01lc3NhZ2VGb3JtYXR0ZXJzKE9NRWxlbWVudCBtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucHJvY2Vzc01lc3NhZ2VGb3JtYXR0ZXJzKG1lc3NhZ2VGb3JtYXR0ZXJzRWxlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RW5naW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGZyb20gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0IGluIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9jZXNzTWVzc2FnZUJ1aWxkZXJzKE9NRWxlbWVudCBtZXNzYWdlQnVpbGRlcnNFbGVtZW50KQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnByb2Nlc3NNZXNzYWdlQnVpbGRlcnMobWVzc2FnZUJ1aWxkZXJzRWxlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RW5naW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FsbGVkIGZyb20gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0IGluIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBoYXNlIGdldFBoYXNlKFN0cmluZyBjbGFzc05hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQaGFzZSgpOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzIHBoYXNlQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgcmV0dXJuIChQaGFzZSkgcGhhc2VDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0NsdXN0ZXJCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9DbHVzdGVyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Y0ZDk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0NsdXN0ZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5NZW1iZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkxvYWRCYWxhbmNlRXZlbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLmNvbnRleHQuQ29udGV4dE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQnVpbGRzIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgYXhpczIueG1sIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIENsdXN0ZXJCdWlsZGVyIGV4dGVuZHMgRGVzY3JpcHRpb25CdWlsZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbHVzdGVyQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQ2x1c3RlckJ1aWxkZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHVzdGVyRWxlbWVudCBDbHVzdGVyIGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGJ1aWxkaW5nIHRoZSBjbHVzdGVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBidWlsZENsdXN0ZXIoT01FbGVtZW50IGNsdXN0ZXJFbGVtZW50KSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCFpc0VuYWJsZWQoY2x1c3RlckVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlcmluZyBoYXMgYmVlbiBkaXNhYmxlZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyaW5nIGhhcyBiZWVuIGVuYWJsZWQiKTsKLQotICAgICAgICBPTUF0dHJpYnV0ZSBjbGFzc05hbWVBdHRyID0gY2x1c3RlckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOwotICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGFzc0F0dHJpYnV0ZU5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0NMVVNURVIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xheno7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2x1c3RlckltcGxOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyID0gKENsdXN0ZXJNYW5hZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBjbHVzdGVyTWFuYWdlci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotCi0gICAgICAgICAgICAvL2xvYWRpbmcgdGhlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhjbHVzdGVyRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotCi0gICAgICAgICAgICAvLyBsb2FkaW5nIHRoZSBhcHBsaWNhdGlvbiBkb21haW5zCi0gICAgICAgICAgICBsb2FkQXBwbGljYXRpb25Eb21haW5zKGNsdXN0ZXJNYW5hZ2VyLCBjbHVzdGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vIGxvYWRpbmcgdGhlIG1lbWJlcnMKLSAgICAgICAgICAgIGxvYWRXZWxsS25vd25NZW1iZXJzKGNsdXN0ZXJNYW5hZ2VyLCBjbHVzdGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vbG9hZGluZyB0aGUgQ29uZmlndXJhdGlvbk1hbmFnZXIKLSAgICAgICAgICAgIGxvYWRDb25maWdNYW5hZ2VyKGNsdXN0ZXJFbGVtZW50LCBjbHVzdGVyTWFuYWdlcik7Ci0KLSAgICAgICAgICAgIC8vIGxvYWRpbmcgdGhlIENvbnRleHRNYW5hZ2VyCi0gICAgICAgICAgICBsb2FkQ29udGV4dE1hbmFnZXIoY2x1c3RlckVsZW1lbnQsIGNsdXN0ZXJNYW5hZ2VyKTsKLQotICAgICAgICAgICAgYXhpc0NvbmZpZy5zZXRDbHVzdGVyTWFuYWdlcihjbHVzdGVyTWFuYWdlcik7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90TG9hZENsdXN0ZXJJbXBsIikpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZChPTUVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotICAgICAgICBPTUF0dHJpYnV0ZSBlbmFibGVBdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJlbmFibGUiKSk7Ci0gICAgICAgIGlmIChlbmFibGVBdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZWQgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihlbmFibGVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCkudHJpbSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5hYmxlZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZEFwcGxpY2F0aW9uRG9tYWlucyhDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgY2x1c3RlckVsZW1lbnQpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGxiRWxlID0gY2x1c3RlckVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgibG9hZEJhbGFuY2VyIikpOwotICAgICAgICBpZiAobGJFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzRW5hYmxlZChsYkVsZSkpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUnVubmluZyBpbiBsb2FkIGJhbGFuY2UgbW9kZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUnVubmluZyBpbiBhcHBsaWNhdGlvbiBtb2RlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsYkVsZS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgiYXBwbGljYXRpb25Eb21haW4iKSk7Ci0gICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZG9tYWluTmFtZSA9IG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoIm5hbWUiKSkudHJpbSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyQ2xhc3MgPSBvbUVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKCJoYW5kbGVyIikpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciBldmVudEhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVyID0gKExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKSBDbGFzcy5mb3JOYW1lKGhhbmRsZXJDbGFzcykubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBMb2FkQmFsYW5jZUV2ZW50SGFuZGxlciAiICsgaGFuZGxlckNsYXNzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIGRvbWFpbiAiICsgZG9tYWluTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmFkZExvYWRCYWxhbmNlRXZlbnRIYW5kbGVyKGV2ZW50SGFuZGxlciwgZG9tYWluTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFdlbGxLbm93bk1lbWJlcnMoQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIsIE9NRWxlbWVudCBjbHVzdGVyRWxlbWVudCkgewotICAgICAgICBjbHVzdGVyTWFuYWdlci5zZXRNZW1iZXJzKG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpKTsKLSAgICAgICAgUGFyYW1ldGVyIG1lbWJlcnNoaXBTY2hlbWVQYXJhbSA9IGNsdXN0ZXJNYW5hZ2VyLmdldFBhcmFtZXRlcigibWVtYmVyc2hpcFNjaGVtZSIpOwotICAgICAgICBpZiAobWVtYmVyc2hpcFNjaGVtZVBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJzaGlwU2NoZW1lID0gKChTdHJpbmcpIG1lbWJlcnNoaXBTY2hlbWVQYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAobWVtYmVyc2hpcFNjaGVtZS5lcXVhbHMoQ2x1c3RlcmluZ0NvbnN0YW50cy5NZW1iZXJzaGlwU2NoZW1lLldLQV9CQVNFRCkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PE1lbWJlcj4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyPigpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtZW1iZXJzRWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoIm1lbWJlcnMiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlcnNFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZW1iZXJzRWxlLmdldENoaWxkcmVuV2l0aExvY2FsTmFtZSgibWVtYmVyIik7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG1lbWJlckVsZSA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3ROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoImhvc3ROYW1lIikpLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlckVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKCJwb3J0IikpLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJzLmFkZChuZXcgTWVtYmVyKHJlcGxhY2VWYXJpYWJsZXMoaG9zdE5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHJlcGxhY2VWYXJpYWJsZXMocG9ydCkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2x1c3Rlck1hbmFnZXIuc2V0TWVtYmVycyhtZW1iZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VWYXJpYWJsZXMoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaW50IGluZGV4T2ZTdGFydGluZ0NoYXJzOwotICAgICAgICBpbnQgaW5kZXhPZkNsb3NpbmdCcmFjZTsKLQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbiBkZWFscyB3aXRoIHByb3BlcnRpZXMuCi0gICAgICAgIC8vIFByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBhcyAke3N5c3RlbS5wcm9wZXJ0eX0sCi0gICAgICAgIC8vIGFuZCBhcmUgYXNzdW1lZCB0byBiZSBTeXN0ZW0gcHJvcGVydGllcwotICAgICAgICBpZiAoKGluZGV4T2ZTdGFydGluZ0NoYXJzID0gdGV4dC5pbmRleE9mKCIkeyIpKSAhPSAtMSAmJgotICAgICAgICAgICAgKGluZGV4T2ZDbG9zaW5nQnJhY2UgPSB0ZXh0LmluZGV4T2YoIn0iKSkgIT0gLTEpIHsgLy8gSXMgYSBwcm9wZXJ0eSB1c2VkPwotICAgICAgICAgICAgU3RyaW5nIHZhciA9IHRleHQuc3Vic3RyaW5nKGluZGV4T2ZTdGFydGluZ0NoYXJzICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mQ2xvc2luZ0JyYWNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSh2YXIpOwotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcFZhbHVlID0gU3lzdGVtLmdldGVudih2YXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGluZGV4T2ZTdGFydGluZ0NoYXJzKSArIHByb3BWYWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKGluZGV4T2ZDbG9zaW5nQnJhY2UgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZENvbnRleHRNYW5hZ2VyKE9NRWxlbWVudCBjbHVzdGVyRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJNYW5hZ2VyIGNsdXN0ZXJNYW5hZ2VyKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBjb250ZXh0TWFuYWdlckVsZSA9Ci0gICAgICAgICAgICAgICAgY2x1c3RlckVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfQ09OVEVYVF9NQU5BR0VSKSk7Ci0gICAgICAgIGlmIChjb250ZXh0TWFuYWdlckVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzRW5hYmxlZChjb250ZXh0TWFuYWdlckVsZSkpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlcmluZyBjb250ZXh0IG1hbmFnZW1lbnQgaGFzIGJlZW4gZGlzYWJsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuaW5mbygiQ2x1c3RlcmluZyBjb250ZXh0IG1hbmFnZW1lbnQgaGFzIGJlZW4gZW5hYmxlZCIpOwotCi0gICAgICAgICAgICAvLyBMb2FkICYgc2V0IHRoZSBDb250ZXh0TWFuYWdlciBjbGFzcwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgY2xhc3NOYW1lQXR0ciA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX0NMQVNTKSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xhc3NBdHRyaWJ1dGVOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ09OVEVYVF9NQU5BR0VSKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsdXN0ZXJJbXBsTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250ZXh0TWFuYWdlciBjb250ZXh0TWFuYWdlciA9IChDb250ZXh0TWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbnRleHRNYW5hZ2VyKGNvbnRleHRNYW5hZ2VyKTsKLQotICAgICAgICAgICAgLy8gTG9hZCAmIHNldCB0aGUgQ29udGV4dE1hbmFnZXJMaXN0ZW5lcgotICAgICAgICAgICAgT01FbGVtZW50IGxpc3RlbmVyRWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dE1hbmFnZXJFbGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfTElTVEVORVIpKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lckVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lQXR0ciA9IGxpc3RlbmVyRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsYXNzQXR0cmlidXRlTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR19MSVNURU5FUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsdXN0ZXJJbXBsTm90Rm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb250ZXh0TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENvbnRleHRNYW5hZ2VyTGlzdGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dE1hbmFnZXIuc2V0Q29udGV4dE1hbmFnZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNvbnRleHRNYW5hZ2VyTGlzdGVuZXJJc051bGwiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vbG9hZGluZyB0aGUgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGNvbnRleHRNYW5hZ2VyRWxlLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRNYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlcGxpY2F0aW9uIHBhdHRlcm5zIHRvIGJlIGV4Y2x1ZGVkLiBXZSBsb2FkIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgotICAgICAgICAgICAgLyo8cmVwbGljYXRpb24+Ci0gICAgICAgICAgICAgICAgPGRlZmF1bHRzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJmb28uYmFyLioiLz4KLSAgICAgICAgICAgICAgICA8L2RlZmF1bHRzPgotICAgICAgICAgICAgICAgIDxjb250ZXh0IGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJteS5zYW5kZXNoYS4qIi8+Ci0gICAgICAgICAgICAgICAgPC9jb250ZXh0PgotICAgICAgICAgICAgICAgIDxjb250ZXh0IGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im15LnNhbmRlc2hhLioiLz4KLSAgICAgICAgICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICAgICAgICAgICAgPGNvbnRleHQgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCI+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im15LnNhbmRlc2hhLioiLz4KLSAgICAgICAgICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICAgICAgICA8L3JlcGxpY2F0aW9uPiovCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVwbGljYXRpb25FbGUgPQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0TWFuYWdlckVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19SRVBMSUNBVElPTikpOwotICAgICAgICAgICAgaWYgKHJlcGxpY2F0aW9uRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGRlZmF1bHRzCi0gICAgICAgICAgICAgICAgT01FbGVtZW50IGRlZmF1bHRzRWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxpY2F0aW9uRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0RFRkFVTFRTKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBkZWZhdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGVmYXVsdHNFbGUuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX0VYQ0xVREUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBleGNsdWRlRWxlID0gKE9NRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lQXR0ID0gZXhjbHVkZUVsZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cy5hZGQobmFtZUF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhUQUdfREVGQVVMVFMsIGRlZmF1bHRzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHNwZWNpZmljcwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlcGxpY2F0aW9uRWxlLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19DT05URVhUKSk7Ci0gICAgICAgICAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGNvbnRleHRFbGUgPSAoT01FbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN0eENsYXNzTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dEVsZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9DTEFTUykpLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZXhjbHVkZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcjIgPSBjb250ZXh0RWxlLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19FWENMVURFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGV4Y2x1ZGVFbGUgPSAoT01FbGVtZW50KSBpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lQXR0ID0gZXhjbHVkZUVsZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlcy5hZGQobmFtZUF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0TWFuYWdlci5zZXRSZXBsaWNhdGlvbkV4Y2x1ZGVQYXR0ZXJucyhjdHhDbGFzc05hbWUsIGV4Y2x1ZGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZENvbmZpZ01hbmFnZXIoT01FbGVtZW50IGNsdXN0ZXJFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcikgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgT01FbGVtZW50IGNvbmZpZ01hbmFnZXJFbGUgPQotICAgICAgICAgICAgICAgIGNsdXN0ZXJFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0NPTkZJR1VSQVRJT05fTUFOQUdFUikpOwotICAgICAgICBpZiAoY29uZmlnTWFuYWdlckVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzRW5hYmxlZChjb25maWdNYW5hZ2VyRWxlKSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBoYXMgYmVlbiBkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJDbHVzdGVyaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBoYXMgYmVlbiBlbmFibGVkIik7Ci0KLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGNsYXNzTmFtZUF0dHIgPSBjb25maWdNYW5hZ2VyRWxlLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoQVRUUklCVVRFX0NMQVNTKSk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NOYW1lQXR0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xhc3NBdHRyaWJ1dGVOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUdfQ09ORklHVVJBVElPTl9NQU5BR0VSKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVBdHRyLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6ejsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbHVzdGVySW1wbE5vdEZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0aW9uTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgIChDb25maWd1cmF0aW9uTWFuYWdlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3VyYXRpb25NYW5hZ2VyKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IGxpc3RlbmVyRWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnTWFuYWdlckVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19MSVNURU5FUikpOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVyRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWVBdHRyID0gbGlzdGVuZXJFbGUuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfQ0xBU1NfTkFNRSkpOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWVBdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2x1c3RlckltcGxOb3RGb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHX0xJU1RFTkVSKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lQXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVySXNOdWxsIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIpIGNsYXp6Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZXRDb25maWd1cmF0aW9uQ29udGV4dChjb25maWdDdHgpOwotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVySXNOdWxsIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3VwZGF0aW5nIHRoZSBDb25maWd1cmF0aW9uTWFuYWdlciB3aXRoIHRoZSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25NYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0N0eCk7Ci0KLSAgICAgICAgICAgIC8vbG9hZGluZyB0aGUgcGFyYW1ldGVycy4KLSAgICAgICAgICAgIHByb2Nlc3NQYXJhbWV0ZXJzKGNvbmZpZ01hbmFnZXJFbGUuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbk1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveWVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRiNzQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGN1c3RvbSBkZXBsb3ltZW50IG1lY2hhbmlzbSAsIHdoZXJlIHlvdQotICogY2FuIHdyaXRlIHlvdXIgb3duIERlcGxveWVyIHRvIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHR5cGUgYW5kIG1ha2UgdGhhdCB0bwotICogYSBzZXJ2aWNlIG9yIGEgbW9kdWxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveWVyIHsKLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBEZXBsb3llcgotICAgICAqIEBwYXJhbSBjb25maWdDdHggb3VyIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGEgZmlsZSBhbmQgYWRkIGl0IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGRlcGxveW1lbnRGaWxlRGF0YSB0aGUgRGVwbG95bWVudEZpbGVEYXRhIG9iamVjdCB0byBkZXBsb3kKLSAgICAgKiBAdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAgICovCi0gICAgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeQotICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgZGlyZWN0b3J5IG5hbWUKLSAgICAgKi8KLSAgICB2b2lkIHNldERpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5KTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZXh0ZW5zaW9uIHRvIGxvb2sgZm9yCi0gICAgICogVE9ETzogU3VwcG9ydCBtdWx0aXBsZSBleHRlbnNpb25zPwotICAgICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERlcGxveWVyCi0gICAgICovCi0gICAgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbik7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBnaXZlbiBmaWxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgbmFtZSBvZiBpdGVtIHRvIHJlbW92ZQotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50Q2xhc3NMb2FkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRlNmFlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy51dGlscy5JT1V0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudENsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotICAgIC8vIExpc3Qgb2YgVVJMJ3MKLSAgICBwcml2YXRlIFVSTFtdIHVybHMgPSBudWxsOwotCi0gICAgLy8gTGlzdCBvZiBqYXIgZmlsZXMgaW5zaWRlIHRoZSBqYXJzIGluIHRoZSBvcmlnaW5hbCB1cmwKLSAgICBwcml2YXRlIExpc3QgZW1iZWRkZWRfamFyczsKLQotICAgIC8qKgotICAgICAqIERlcGxveW1lbnRDbGFzc0xvYWRlciBpcyBleHRlbmRlZCBmcm9tIFVSTENsYXNzTG9hZGVyLiBUaGUgY29uc3RydWN0b3IKLSAgICAgKiBkb2VzIG5vdCBvdmVycmlkZSB0aGUgc3VwZXIgY29uc3RydWN0b3IsIGJ1dCB0YWtlcyBpbiBhbiBhZGRpdGlvbiBsaXN0IG9mCi0gICAgICogamFyIGZpbGVzIGluc2lkZSAvbGliIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmxzICAgPGNvZGU+VVJMPC9jb2RlPnMKLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjbGFzc2xvYWRlciA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVwbG95bWVudENsYXNzTG9hZGVyKFVSTFtdIHVybHMsIExpc3QgZW1iZWRkZWRfamFycywgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMudXJscyA9IHVybHM7Ci0gICAgICAgIHRoaXMuZW1iZWRkZWRfamFycyA9IGVtYmVkZGVkX2phcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYW5kIGxvYWRzIHRoZSBjbGFzcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBVUkwgc2VhcmNoCi0gICAgICogcGF0aC4gQW55IFVSTHMgcmVmZXJyaW5nIHRvIEpBUiBmaWxlcyBhcmUgbG9hZGVkIGFuZCBvcGVuZWQgYXMgbmVlZGVkCi0gICAgICogdW50aWwgdGhlIGNsYXNzIGlzIGZvdW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIGNsYXNzCi0gICAgICogQGV4Y2VwdGlvbiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xhenogPSBzdXBlci5maW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYnl0ZSByYXdbXSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV0ZUZpbGVOYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBSZXBsYWNpbmcgb3JnLmFwYWNoZS4gLT4gb3JnL2FwYWNoZS8uLi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBjb21wbGV0ZUZpbGVOYW1lID0gY29tcGxldGVGaWxlTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoIi5jbGFzcyIpOwotICAgICAgICAgICAgICAgIHJhdyA9IGdldEJ5dGVzKGNvbXBsZXRlRmlsZU5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmF3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQ2xhc3MgTm90IGZvdW5kIDogIiArIG5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xhenogPSBkZWZpbmVDbGFzcyhuYW1lLCByYXcsIDAsIHJhdy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvbiB0aGUgVVJMIHNlYXJjaCBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc291cmNlIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5VUkw8L2NvZGU+IGZvciB0aGUgcmVzb3VyY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGZpbmRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgVVJMIHVybCA9IHN1cGVyLmZpbmRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGVtYmVkZGVkX2phcnMgIT0gbnVsbCAmJiBpIDwgZW1iZWRkZWRfamFycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBsaWJqYXJfbmFtZSA9IChTdHJpbmcpIGVtYmVkZGVkX2phcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SmFyQXNTdHJlYW0obGliamFyX25hbWUpOwotICAgICAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5lbmRzV2l0aChyZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmF3ID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheSh6aW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKCJqYXIiLCAiIiwgLTEsIHVybHNbMF0gKyAiIS8iICsgbGliamFyX25hbWUgKyAiIS8iICsgZW50cnlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVVcmxTdHJlYW1IYW5kbGVyKHJhdykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBvZiBVUkxzIHJlcHJlc2VudGluZyBhbGwgb2YgdGhlIHJlc291cmNlcwotICAgICAqIG9uIHRoZSBVUkwgc2VhcmNoIHBhdGggaGF2aW5nIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgbmFtZQotICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiA8Y29kZT5VUkw8L2NvZGU+cwotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHN1cGVyLmZpbmRSZXNvdXJjZXMocmVzb3VyY2UpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBlbWJlZGRlZF9qYXJzICE9IG51bGwgJiYgaSA8IGVtYmVkZGVkX2phcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBsaWJqYXJfbmFtZSA9IChTdHJpbmcpIGVtYmVkZGVkX2phcnMuZ2V0KGkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SmFyQXNTdHJlYW0obGliamFyX25hbWUpOwotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKGluKTsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lLmVuZHNXaXRoKHJlc291cmNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHJhdyA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkoemluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGQobmV3IFVSTCgiamFyIiwgIiIsIC0xLCB1cmxzWzBdICsgIiEvIiArIGxpYmphcl9uYW1lICsgIiEvIiArIGVudHJ5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVVcmxTdHJlYW1IYW5kbGVyKHJhdykpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24ocmVzb3VyY2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2Nlc3MgdGhlIGphcnMgZmlsZSAoL2xpYikgb25lIGJ5IG9uZSAsIHRoZW4gZm9yIGVhY2ggb25lIGNyZWF0ZSBhIDxjb2RlPlppcElucHV0U3RyZWFtPC9jb2RlPgotICAgICAqIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciB0aGVyZSBpcyBhbnkgZW50cnkgZWl0aCBnaXZlbiBuYW1lLiBpZiBpdCBpcyBmb3VuZCB0aGVuCi0gICAgICogcmV0dXJuIHRoZSBieXRlIGFycmF5IGZvciB0aGF0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UgPGNvZGU+U3RyaW5nPC9jb2RlPiAgTmFtZSBvZiB0aGUgZmlsZSB0byBiZSBmb3VuZAotICAgICAqIEByZXR1cm4gYnl0ZVtdCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgZW1iZWRkZWRfamFycyAhPSBudWxsICYmIGkgPCBlbWJlZGRlZF9qYXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGliamFyX25hbWUgPSAoU3RyaW5nKSBlbWJlZGRlZF9qYXJzLmdldChpKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZ2V0SmFyQXNTdHJlYW0obGliamFyX25hbWUpOwotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZ2V0Qnl0ZXMoaW4sIHJlc291cmNlKTsKLSAgICAgICAgICAgIGlmKGJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3BlY2lmaWMgZW50cnkncyBjb250ZW50IGFzIGEgYnl0ZSBhcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSBpbgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVzKElucHV0U3RyZWFtIGluLCBTdHJpbmcgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGVudHJ5TmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5lbmRzV2l0aChyZXNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmF3ID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheSh6aW4pOwotICAgICAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiByYXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzcGVjaWZpZWQgZW1iZWRkZWQgamFyIGZyb20gdGhlIG1haW4gamFyIAotICAgICAqCi0gICAgICogQHBhcmFtIGxpYmphcl9uYW1lCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRKYXJBc1N0cmVhbShTdHJpbmcgbGliamFyX25hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldEJ5dGVzKHVybHNbMF0ub3BlblN0cmVhbSgpLCBsaWJqYXJfbmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZVVybFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBVUkxTdHJlYW1IYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gYnl0ZXM7Ci0KLSAgICAgICAgcHVibGljIEJ5dGVVcmxTdHJlYW1IYW5kbGVyKGJ5dGVbXSBieXRlcykgewotICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVVUkxDb25uZWN0aW9uKHUsIGJ5dGVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZVVSTENvbm5lY3Rpb24gZXh0ZW5kcyBVUkxDb25uZWN0aW9uIHsKLSAgICAgICAgcHJvdGVjdGVkIGJ5dGVbXSBieXRlczsKLQotICAgICAgICBwdWJsaWMgQnl0ZVVSTENvbm5lY3Rpb24oVVJMIHVybCwgYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgICAgICBzdXBlcih1cmwpOwotICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgVVJMIHVybCA9IGZpbmRSZXNvdXJjZShuYW1lKTsKLSAgICAgICAgaWYodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIHVybCA9IGdldFJlc291cmNlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHVybCE9bnVsbCl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5N2FkMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGR1cmluZyBzZXJ2aWNlL21vZHVsZSBkZXBsb3ltZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGxveW1lbnRDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWSUNFU19YTUwgPSAiTUVUQS1JTkYvc2VydmljZXMueG1sIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNT0RVTEVfWE1MID0gIk1FVEEtSU5GL21vZHVsZS54bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfUEFUSCA9ICJzZXJ2aWNlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9ESVJfUEFUSCA9ICJTZXJ2aWNlc0RpcmVjdG9yeSI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX1BBVEggPSAibW9kdWxlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX0RSSV9QQVRIID0gIk1vZHVsZXNEaXJlY3RvcnkiOwotCi0gICAgU3RyaW5nIFRBR19BWElTQ09ORklHID0gImF4aXNjb25maWciOwotICAgIFN0cmluZyBUQUdfUEhBU0VfT1JERVIgPSAicGhhc2VPcmRlciI7Ci0gICAgU3RyaW5nIFRBR19QQVJBTUVURVIgPSAicGFyYW1ldGVyIjsKLSAgICBTdHJpbmcgVEFHX01BUFBJTkcgPSAibWFwcGluZyI7Ci0gICAgU3RyaW5nIFRBR19QQUNLQUdFX05BTUUgPSAicGFja2FnZU5hbWUiOwotICAgIFN0cmluZyBUQUdfUU5BTUUgPSAicU5hbWUiOwotICAgIFN0cmluZyBUQUdfUEFDS0FHRTJRTkFNRSA9ICJwYWNrYWdlTWFwcGluZyI7Ci0gICAgU3RyaW5nIFRBR19NT0RVTEUgPSAibW9kdWxlIjsKLSAgICBTdHJpbmcgVEFHX01PRFVMRV9DT05GSUcgPSAibW9kdWxlQ29uZmlnIjsKLSAgICBTdHJpbmcgVEFHX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgU3RyaW5nIFRBR19MSVNURU5FUiA9ICJsaXN0ZW5lciI7Ci0gICAgU3RyaW5nIFRBR19MQUJFTCA9ICJsYWJlbCI7Ci0gICAgU3RyaW5nIFRBR19IQU5ETEVSID0gImhhbmRsZXIiOwotICAgIFN0cmluZyBUQUdfVFlQRSA9ICJ0eXBlIjsKLSAgICBTdHJpbmcgVEFHX1RBUkdFVF9SRVNPTFZFUlMgPSAidGFyZ2V0UmVzb2x2ZXJzIjsKLSAgICBTdHJpbmcgVEFHX1RBUkdFVF9SRVNPTFZFUiA9ICJ0YXJnZXRSZXNvbHZlciI7Ci0gICAgU3RyaW5nIFRBR19USFJFQURfQ09OVEVYVF9NSUdSQVRPUlMgPSAidGhyZWFkQ29udGV4dE1pZ3JhdG9ycyI7Ci0gICAgU3RyaW5nIFRBR19USFJFQURfQ09OVEVYVF9NSUdSQVRPUiA9ICJ0aHJlYWRDb250ZXh0TWlncmF0b3IiOwotICAgIFN0cmluZyBUQUdfVFJBTlNQT1JUX1NFTkRFUiA9ICJ0cmFuc3BvcnRTZW5kZXIiOwotICAgIFN0cmluZyBUQUdfVFJBTlNQT1JUX1JFQ0VJVkVSID0gInRyYW5zcG9ydFJlY2VpdmVyIjsKLSAgICBTdHJpbmcgVEFHX1NFUlZJQ0VfR1JPVVAgPSAic2VydmljZUdyb3VwIjsKLSAgICBTdHJpbmcgVEFHX1NFUlZJQ0UgPSAic2VydmljZSI7Ci0gICAgU3RyaW5nIFRBR19SRUZFUkVOQ0UgPSAicmVmIjsKLSAgICBTdHJpbmcgVEFHX1BIQVNFX0xBU1QgPSAicGhhc2VMYXN0IjsKLSAgICBTdHJpbmcgVEFHX1BIQVNFX0ZJUlNUID0gInBoYXNlRmlyc3QiOwotICAgIFN0cmluZyBUQUdfT1JERVIgPSAib3JkZXIiOyAgICAgICAgICAgLy8gdG8gcmVzb2x2ZSB0aGUgb3JkZXIgdGFnCi0gICAgU3RyaW5nIFRBR19PUEVSQVRJT04gPSAib3BlcmF0aW9uIjsgICAgICAgLy8gb3BlcmF0aW9uIHN0YXJ0IHRhZwotICAgIFN0cmluZyBUQUdfUEhBU0UgPSAicGhhc2UiOyAgICAgICAvLyBvcGVyYXRpb24gc3RhcnQgdGFnCi0gICAgU3RyaW5nIFRBR19PQkpFQ1RfU1VQUExJRVIgPSAiT2JqZWN0U3VwcGxpZXIiOyAgICAgICAvLyBvcGVyYXRpb24gc3RhcnQgdGFnCi0gICAgU3RyaW5nIFRBR19FWENMVURFX09QRVJBVElPTlMgPSAiZXhjbHVkZU9wZXJhdGlvbnMiOwotICAgIFN0cmluZyBUQUdfTUVTU0FHRV9SRUNFSVZFUiA9ICJtZXNzYWdlUmVjZWl2ZXIiOwotICAgIFN0cmluZyBUQUdfTUVTU0FHRV9SRUNFSVZFUlMgPSAibWVzc2FnZVJlY2VpdmVycyI7Ci0gICAgU3RyaW5nIFRBR19UUkFOU1BPUlRTID0gInRyYW5zcG9ydHMiOwotICAgIFN0cmluZyBUQUdfVFJBTlNQT1JUID0gInRyYW5zcG9ydCI7Ci0gICAgU3RyaW5nIFRBR19NRVAgPSAibWVwIjsKLSAgICBTdHJpbmcgVEFHX0RFRkFVTFRfTU9EVUxFX1ZFUlNJT04gPSAiZGVmYXVsdE1vZHVsZVZlcnNpb25zIjsKLSAgICBTdHJpbmcgVEFHX0NMVVNURVIgPSAiY2x1c3RlciI7Ci0gICAgU3RyaW5nIFRBR19UUkFOU0FDVElPTiA9ICJ0cmFuc2FjdGlvbiI7Ci0gICAgU3RyaW5nIFRBR19USU1FT1VUID0gInRpbWVvdXQiOwotICAgIFN0cmluZyBUQUdfTUVTU0FHRV9CVUlMREVSUyA9Ci0gICAgICAgICAgICAibWVzc2FnZUJ1aWxkZXJzIjsgLy91c2VkIHRvIGFkZCBwbHVnZ2FibGUgc3VwcG9ydCBmb3IgZGlmZnJlbnQgd2lyZSBmb3JtYXRzCi0gICAgU3RyaW5nIFRBR19NRVNTQUdFX0JVSUxERVIgPSAibWVzc2FnZUJ1aWxkZXIiOwotICAgIFN0cmluZyBUQUdfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsKLSAgICBTdHJpbmcgVEFHX01FU1NBR0VfRk9STUFUVEVSUyA9Ci0gICAgICAgICAgICAibWVzc2FnZUZvcm1hdHRlcnMiOyAvL3VzZWQgdG8gYWRkIHBsdWdnYWJsZSBzdXBwb3J0IGZvciBkaWZmcmVudCB3aXJlIGZvcm1hdHMKLSAgICBTdHJpbmcgVEFHX01FU1NBR0VfRk9STUFUVEVSID0gIm1lc3NhZ2VGb3JtYXR0ZXIiOwotCi0gICAgU3RyaW5nIFRBR19GTE9XX0lOID0gIkluRmxvdyI7ICAgICAgICAgLy8gaW5mbG93IHN0YXJ0IHRhZwotICAgIFN0cmluZyBUQUdfRkxPV19PVVQgPSAiT3V0RmxvdyI7ICAgICAgICAgLy8gb3V0ZmxvdyBzdGFydCB0YWcKLSAgICBTdHJpbmcgVEFHX0ZMT1dfT1VUX0ZBVUxUID0gIk91dEZhdWx0RmxvdyI7ICAgIC8vIGZhdWx0ZmxvdyBzdGFydCB0YWcKLSAgICBTdHJpbmcgVEFHX0ZMT1dfSU5fRkFVTFQgPSAiSW5GYXVsdEZsb3ciOyAgICAvLyBmYXVsdGZsb3cgc3RhcnQgdGFnCi0KLSAgICBTdHJpbmcgVEFHX0hPVF9VUERBVEUgPSAiaG90dXBkYXRlIjsKLSAgICBTdHJpbmcgVEFHX0FOVElfSkFSX0xPQ0tJTkcgPSAiYW50aUpBUkxvY2tpbmciOwotICAgIFN0cmluZyBUQUdfSE9UX0RFUExPWU1FTlQgPSAiaG90ZGVwbG95bWVudCI7Ci0gICAgU3RyaW5nIFRBR19FWFBPU0UgPSAiZXhwb3NlIjsKLSAgICBTdHJpbmcgVEFHX0VYVFJBQ1RfU0VSVklDRV9BUkNISVZFID0gImV4dHJhY3RTZXJ2aWNlQXJjaGl2ZSI7Ci0gICAgU3RyaW5nIFRBR19ESVNQQVRDSF9PUkRFUiA9ICJkaXNwYXRjaE9yZGVyIjsKLSAgICBTdHJpbmcgVEFHX0RJU1BBVENIRVIgPSAiZGlzcGF0Y2hlciI7Ci0gICAgU3RyaW5nIFRBR19ERVNDUklQVElPTiA9ICJEZXNjcmlwdGlvbiI7Ci0gICAgU3RyaW5nIFRBR19DTEFTU19OQU1FID0gImNsYXNzIjsKLSAgICBTdHJpbmcgVEFHX0xJU1RfSUQgPSAibGlzdElkIjsKLSAgICBTdHJpbmcgVEFHX0VYQ0xVREVfUFJPUEVSVElFUz0gImV4Y2x1ZGVQcm9wZXJ0aWVzIjsKLSAgICBTdHJpbmcgVEFHX0lOQ0xVREVfUFJPUEVSVElFUz0gImluY2x1ZGVQcm9wZXJ0aWVzIjsKLSAgICBTdHJpbmcgVEFHX0FGVEVSID0gImFmdGVyIjsKLSAgICBTdHJpbmcgVEFHX0JFRk9SRSA9ICJiZWZvcmUiOwotICAgIFN0cmluZyBUQUdfU1VQUE9SVEVEX1BPTElDWV9OQU1FU1BBQ0VTID0gInN1cHBvcnRlZC1wb2xpY3ktbmFtZXNwYWNlcyI7Ci0gICAgU3RyaW5nIFRBR19OQU1FU1BBQ0VTID0gIm5hbWVzcGFjZXMiOwotCi0gICAgLy9DbHVzdGVyQnVpbGRlcgotICAgIFN0cmluZyBUQUdfQ09ORklHVVJBVElPTl9NQU5BR0VSID0gImNvbmZpZ3VyYXRpb25NYW5hZ2VyIjsKLSAgICBTdHJpbmcgVEFHX0NPTlRFWFRfTUFOQUdFUiA9ICJjb250ZXh0TWFuYWdlciI7Ci0gICAgU3RyaW5nIFRBR19SRVBMSUNBVElPTiA9ICJyZXBsaWNhdGlvbiI7Ci0gICAgU3RyaW5nIFRBR19ERUZBVUxUUyA9ICJkZWZhdWx0cyI7Ci0gICAgU3RyaW5nIFRBR19DT05URVhUID0gImNvbnRleHQiOwotICAgIFN0cmluZyBUQUdfRVhDTFVERSA9ICJleGNsdWRlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0NMQVNTID0gImNsYXNzIjsKLQotICAgIC8vRGVwbG95ZXIgcmVsYXRlZCBjb25zCi0gICAgU3RyaW5nIERJUkVDVE9SWSA9ICJkaXJlY3RvcnkiOwotICAgIFN0cmluZyBFWFRFTlNJT04gPSAiZXh0ZW5zaW9uIjsKLSAgICBTdHJpbmcgREVQTE9ZRVIgPSAiZGVwbG95ZXIiOwotCi0gICAgLy9BdHRhY2htZW50cyBMaWZlY3ljbGVNYW5hZ2VyIAotICAgIFN0cmluZyBBVFRBQ0hNRU5UU19MSUZFQ1lDTEVfTUFOQUdFUiA9ICJhdHRhY2htZW50c0xpZmVjeWNsZU1hbmFnZXIiOwotCi0gICAgLy8gZm9yIHBhcmFtZXRlcnMKLSAgICBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9XU0FERFJFU1NJTkcgPSAid3NhZGRyZXNzaW5nIjsKLSAgICBTdHJpbmcgVEFSR0VUX05BTUVfU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgU0NIRU1BX05BTUVfU1BBQ0UgPSAic2NoZW1hTmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgU0NIRU1BX0VMRU1FTlRfUVVBTElGSUVEID0gImVsZW1lbnRGb3JtRGVmYXVsdFF1YWxpZmllZCI7Ci0gICAgU3RyaW5nIFNDSEVNQSA9ICJzY2hlbWEiOwotICAgIFN0cmluZyBNQVBQSU5HID0gIm1hcHBpbmciOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9QQUNLQUdFID0gInBhY2thZ2UiOwotCi0gICAgU3RyaW5nIEFUVFJJQlVURV9ERUZBVUxUX1ZFUlNJT04gPSAidmVyc2lvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9TQ09QRSA9ICJzY29wZSI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9MT0NLRUQgPSAibG9ja2VkIjsKLQotICAgIC8vIFdoZXRoZXIgdG8gYWN0aXZhdGUgYSBkZXBsb3llZCBzZXJ2aWNlLgotICAgIFN0cmluZyBBVFRSSUJVVEVfQUNUSVZBVEUgPSAiYWN0aXZhdGUiOwotCi0gICAgU3RyaW5nIFBST1BFUlRZX1RFTVBfRElSID0gImphdmEuaW8udG1wZGlyIjsKLSAgICBTdHJpbmcgRElSRUNUT1JZX0NPTkYgPSAiY29uZiI7Ci0gICAgU3RyaW5nIERJUkVDVE9SWV9BWElTMl9IT01FID0gIi5heGlzMiI7Ci0gICAgU3RyaW5nIFJFU09VUkNFX01PRFVMRVMgPSAibW9kdWxlcy8iOwotICAgIFN0cmluZyBTVUZGSVhfTUFSID0gIi5tYXIiOwotICAgIFN0cmluZyBTVUZGSVhfSkFSID0gIi5qYXIiOwotICAgIFN0cmluZyBTVUZGSVhfV1NETCA9ICIud3NkbCI7Ci0gICAgLyoqCi0gICAgICogUmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBTdHJpbmcgQVhJUzJfQ09ORklHVVJBVElPTl9SRVNPVVJDRSA9Ci0gICAgICAgICAgICAib3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L2F4aXMyX2RlZmF1bHQueG1sIjsKLSAgICBTdHJpbmcgQVhJUzJfUkVQTyA9ICJyZXBvc2l0b3J5IjsKLSAgICBTdHJpbmcgQVhJUzJfQ09ORklHVVJBVElPTl9YTUwgPSAiYXhpczIueG1sIjsKLSAgICBTdHJpbmcgQk9PTEVBTl9UUlVFID0gInRydWUiOwotICAgIFN0cmluZyBCT09MRUFOX0ZBTFNFID0gImZhbHNlIjsKLSAgICBjaGFyIFNFUEFSQVRPUl9ET1QgPSAnLic7Ci0gICAgY2hhciBTRVBBUkFUT1JfQ09MT04gPSAnOic7Ci0KLSAgICBTdHJpbmcgUE9MSUNZX05TX1VSSSA9IENvbnN0YW50cy5VUklfUE9MSUNZOwotICAgIFN0cmluZyBUQUdfUE9MSUNZID0gIlBvbGljeSI7Ci0gICAgU3RyaW5nIFRBR19QT0xJQ1lfUkVGID0gIlBvbGljeVJlZmVyZW5jZSI7Ci0gICAgCi0gICAgU3RyaW5nIFRBR19QT0xJQ1lfQVRUQUNITUVOVCA9ICJQb2xpY3lBdHRhY2htZW50IjsKLSAgICBTdHJpbmcgVEFHX0FQUExJRVNfVE8gPSAiQXBwbGllc1RvIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFbmdpbmUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhOTNjNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXBsb3ltZW50RW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyLkphckZpbGVDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLldTSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuQUFSQmFzZWRXU0RMTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlci5EZXBsb3ltZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlci5TY2hlZHVsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlci5TY2hlZHVsZXJUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERlcGxveW1lbnRFbmdpbmUgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVwbG95bWVudEVuZ2luZS5jbGFzcyk7Ci0KLSAgICAvL3RvIGtlZXAgdGhlIHdlYiByZXNvdXJjZSBsb2NhdGlvbiBpZiBhbnkKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB3ZWJMb2NhdGlvblN0cmluZyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFNjaGVkdWxlciBzY2hlZHVsZXI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViTG9jYXRpb25TdHJpbmcoU3RyaW5nIHdlYkxvY2F0aW9uU3RyaW5nKSB7Ci0gICAgICAgIERlcGxveW1lbnRFbmdpbmUud2ViTG9jYXRpb25TdHJpbmcgPSB3ZWJMb2NhdGlvblN0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFN1cHBvcnQgZm9yIGhvdCB1cGRhdGUgaXMgY29udHJvbGxlZCBieSB0aGlzIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBob3RVcGRhdGUgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogU3VwcG9ydCBmb3IgaG90IGRlcGxveW1lbnQgaXMgY29udHJvbGxlZCBieSB0aGlzIGZsYWcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBob3REZXBsb3ltZW50ID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBhbGwgdGhlIHdlYiBTZXJ2aWNlcyB0byBkZXBsb3kuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3Qgd3NUb0RlcGxveSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIFN0b3JlcyBhbGwgdGhlIHdlYiBTZXJ2aWNlcyB0byB1bmRlcGxveS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCB3c1RvVW5EZXBsb3kgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiB0byBrZWVwIGEgcmVmIHRvIGVuZ2luZSByZWdpc3RlcgotICAgICAqIHRoaXMgcmVmIHdpbGwgcGFzcyB0byBlbmdpbmUgd2hlbiBpdCBjYWxsIHN0YXJ0KCkKLSAgICAgKiBtZXRob2QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIFJlcG9zaXRvcnlMaXN0ZW5lciByZXBvTGlzdGVuZXI7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VzUGF0aCA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEZpbGUgc2VydmljZXNEaXIgPSBudWxsOwotICAgIHByb3RlY3RlZCBTdHJpbmcgbW9kdWxlc1BhdGggPSBudWxsOwotICAgIHByb3RlY3RlZCBGaWxlIG1vZHVsZXNEaXIgPSBudWxsOwotICAgIHByaXZhdGUgRmlsZSByZXBvc2l0b3J5RGlyID0gbnVsbDsKLQotICAgIC8vdG8gZGVwbG95IHNlcnZpY2UgKGJvdGggYWFyIGFuZCBleHBhbmRlZCkKLSAgICBwcm90ZWN0ZWQgU2VydmljZURlcGxveWVyIHNlcnZpY2VEZXBsb3llcjsKLSAgICAvL1RvIGRlcGxveSBtb2R1bGVzIChib3RoIG1hciBhbmQgZXhwYW5kZWQpCi0gICAgcHJvdGVjdGVkIE1vZHVsZURlcGxveWVyIG1vZHVsZURlcGxveWVyOwotCi0gICAgLy90byBrZWVwIG1hcCBvZiB3aGljaCBkZXBsb3llciBjYW4gcHJvY2VzcyB3aGljaCBmaWxlIGV4dGVuc2lvbiAsCi0gICAgLy8gZm9yIGV4YW1wbGUgU2VydmljZURlcGxveWVyIHdpbGwgcHJvY2VzcyAuYWFyIGZpbGUKLSAgICBwcml2YXRlIEhhc2hNYXAgZXh0ZW5zaW9uVG9EZXBsb3llck1hcHBpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgRGVwbG95ZXI+PiBkZXBsb3llck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgRGVwbG95ZXI+PigpOwotCi0gICAgcHVibGljIHZvaWQgbG9hZFNlcnZpY2VzKCkgewotICAgICAgICByZXBvTGlzdGVuZXIuY2hlY2tTZXJ2aWNlcygpOwotICAgICAgICBpZiAoaG90RGVwbG95bWVudCkgewotICAgICAgICAgICAgc3RhcnRTZWFyY2gocmVwb0xpc3RlbmVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRSZXBvc2l0b3J5KFN0cmluZyByZXBvRGlyKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgYXhpc1JlcG8gPSBuZXcgRmlsZShyZXBvRGlyKTsKLSAgICAgICAgaWYgKCFheGlzUmVwby5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdGZpbmRyZXBvIiwgcmVwb0RpcikpOwotICAgICAgICB9Ci0gICAgICAgIHNldERlcGxveW1lbnRGZWF0dXJlcygpOwotICAgICAgICBwcmVwYXJlUmVwb3NpdG9yeShyZXBvRGlyKTsKLSAgICAgICAgLy8gc2V0dGluZyB0aGUgQ0xzCi0gICAgICAgIHNldENsYXNzTG9hZGVycyhyZXBvRGlyKTsKLSAgICAgICAgcmVwb0xpc3RlbmVyID0gbmV3IFJlcG9zaXRvcnlMaXN0ZW5lcih0aGlzLCBmYWxzZSk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlscwotICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlnLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuc2V0UmVwb3NpdG9yeShheGlzUmVwby50b1VSTCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc0NvbmZpZy52YWxpZGF0ZVN5c3RlbVByZWRlZmluZWRQaGFzZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRGcm9tQ2xhc3NQYXRoKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAvL2xvYWRpbmcgbW9kdWxlcyBmcm9tIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgbmV3IFJlcG9zaXRvcnlMaXN0ZW5lcih0aGlzLCB0cnVlKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzLmNhbGN1bGF0ZURlZmF1bHRNb2R1bGVWZXJzaW9uKAotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0TW9kdWxlcygpLCBheGlzQ29uZmlnKTsKLSAgICAgICAgYXhpc0NvbmZpZy52YWxpZGF0ZVN5c3RlbVByZWRlZmluZWRQaGFzZXMoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9WQUxJREFUSU9OX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkQ3VzdG9tU2VydmljZXMoVVJMIHJlcG9VUkwpewotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsIERlcGxveWVyPj4gZW50cnkgOiBnZXREZXBsb3llcnMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZXBsb3llcj4gZXh0ZW5zaW9uTWFwID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3ROYW1lOwotICAgICAgICAgICAgICAgIGlmICghZGlyZWN0b3J5LmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdE5hbWUgPSBkaXJlY3RvcnkgKyAiLmxpc3QiOwotICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgKz0gIi8iOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3ROYW1lID0gZGlyZWN0b3J5LnJlcGxhY2VBbGwoIi8iLCIiKSArICIubGlzdCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyByZXBvUGF0aCA9IHJlcG9VUkwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgIGlmICghcmVwb1BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICByZXBvUGF0aCArPSAiLyI7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9VUkwgPSBuZXcgVVJMKHJlcG9VUkwuZ2V0UHJvdG9jb2woKSArICI6Ly8iICsgcmVwb1BhdGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlc0RpciA9IG5ldyBVUkwocmVwb1VSTCwgZGlyZWN0b3J5KTsKLSAgICAgICAgICAgICAgICBVUkwgZmlsZWxpc3R1cmwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCBsaXN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gZ2V0RmlsZUxpc3QoZmlsZWxpc3R1cmwpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgZmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgRGVwbG95ZXIgZGVwbG95ZXIgPSBleHRlbnNpb25NYXAuZ2V0KGV4dGVuc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXBsb3llciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZXNVUkwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCBmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGNhbGxpbmcgcmVmbGVjdGlvbiBjb2RlIGhlcmUgLCB0byBhdm9pZCBjaGFuZ2VzIHRvIHRoZSBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2xhc3NUb0xvYWQgPSBkZXBsb3llci5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbm90IGNhbGwgY2xhc3NUb0xvYWQuZ2V0RGVjbGFyZWRNZXRoZWQoKSAsIHNpbmNlIHRoZXJlCi0gICAgICAgICAgICAgICAgICAgIC8vICBjYW4gYmUgaW5zYXRuY2Ugd2hlcmUgbXV0aXBsZSBzZXJ2aWNlcyBleHRlbmRzIHVzaW5nIG9uZSBjbGFzcwotICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGZvciBpbml0IGFuZCBvdGhlciByZWZsZWN0aW9uIG1ldGhvZHMKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBjbGFzc1RvTG9hZC5nZXRNZXRob2QoImRlcGxveUZyb21VUkwiLCBuZXcgQ2xhc3NbXXtVUkwuY2xhc3N9KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vV2UgZG8gbm90IG5lZWQgdG8gaW5mb3JtIHRoaXMgdG8gdXNlciAsIHNpbmNlIHRoaXMgc29tZXRoaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBeGlzMiBpcyBjaGVja2luZyB0byBzdXBwb3J0IFNlc3Npb24uIFNvIGlmIHRoZSBtZXRob2QgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0aGVyZSB3ZSBzaG91bGQgaWdub3JlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShkZXBsb3llciwgbmV3IE9iamVjdFtde3NlcnZpY2VzVVJMfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGNhbGwgIiArICJkZXBsb3lGcm9tVVJMIGZvciB0aGUgZGVwbG95ZXIiICsgZGVwbG95ZXIuZ2V0Q2xhc3MoKSAsIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vSSBhbSBqdXN0IGlnbm9yaW5nIHRoZSBlcnJvciBhdCB0aGUgbW9tZW50ICwgYnV0IG5lZWQgdG8gdGhpbmsgaG93IHRvIGhhbmRsZSB0aGlzCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpewotICAgICAgICBpbnQgbGFzdEluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhsYXN0SW5kZXggKzEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlc0Zyb21VcmwoVVJMIHJlcG9VUkwpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gc2VydmljZXNQYXRoID09IG51bGwgPyBEZXBsb3ltZW50Q29uc3RhbnRzLlNFUlZJQ0VfUEFUSCA6IHNlcnZpY2VzUGF0aDsKLSAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCArPSAiLyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb1BhdGggPSByZXBvVVJMLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmICghcmVwb1BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIHJlcG9QYXRoICs9ICIvIjsKLSAgICAgICAgICAgICAgICByZXBvVVJMID0gbmV3IFVSTChyZXBvVVJMLmdldFByb3RvY29sKCkgKyAiOi8vIiArIHJlcG9QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVSTCBzZXJ2aWNlc0RpciA9IG5ldyBVUkwocmVwb1VSTCwgcGF0aCk7Ci0gICAgICAgICAgICBVUkwgZmlsZWxpc3R1cmwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCAic2VydmljZXMubGlzdCIpOwotICAgICAgICAgICAgQXJyYXlMaXN0IGZpbGVzID0gZ2V0RmlsZUxpc3QoZmlsZWxpc3R1cmwpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZpbGVJdGVyYXRvciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGZpbGVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVVcmwgPSAoU3RyaW5nKSBmaWxlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlVXJsLmVuZHNXaXRoKCIuYWFyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cCgpOwotICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZXNVUkwgPSBuZXcgVVJMKHNlcnZpY2VzRGlyLCBmaWxlVXJsKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZVNlcnZpY2Uoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVybC5zdWJzdHJpbmcoMCwgZmlsZVVybC5pbmRleE9mKCIuYWFyIikpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwgc2VydmljZWxpc3QsIHNlcnZpY2VzVVJMLCBudWxsLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRFUExPWUlOR19XUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzVVJMLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0xvYWRpbmcgb3RoZXIgdHlwZSBvZiBzZXJ2aWNlcyBzdWNoIGFzIGN1c3RvbSBkZXBsb3llcnMKLSAgICAgICAgICAgIGxvYWRDdXN0b21TZXJ2aWNlcyhyZXBvVVJMKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkUmVwb3NpdG9yeUZyb21VUkwoVVJMIHJlcG9VUkwpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwYXRoID0gbW9kdWxlc1BhdGggPT0gbnVsbCA/IERlcGxveW1lbnRDb25zdGFudHMuTU9EVUxFX1BBVEggOiBtb2R1bGVzUGF0aDsKLSAgICAgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAiLyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb1BhdGggPSByZXBvVVJMLmdldFBhdGgoKTsKLSAgICAgICAgICAgIGlmICghcmVwb1BhdGguZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgIHJlcG9QYXRoICs9ICIvIjsKLSAgICAgICAgICAgICAgICByZXBvVVJMID0gbmV3IFVSTChyZXBvVVJMLmdldFByb3RvY29sKCkgKyAiOi8vIiArIHJlcG9QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVSTCBtb2R1bGVEaXIgPSBuZXcgVVJMKHJlcG9VUkwsIHBhdGgpOwotICAgICAgICAgICAgVVJMIGZpbGVsaXN0dXJsID0gbmV3IFVSTChtb2R1bGVEaXIsICJtb2R1bGVzLmxpc3QiKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBmaWxlcyA9IGdldEZpbGVMaXN0KGZpbGVsaXN0dXJsKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGZpbGVJdGVyYXRvciA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZmlsZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlVXJsID0gKFN0cmluZykgZmlsZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZVVybC5lbmRzV2l0aCgiLm1hciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCBtb2R1bGV1cmwgPSBuZXcgVVJMKG1vZHVsZURpciwgZmlsZVVybCk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGRlcGxveW1lbnRDbGFzc0xvYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJMW117bW9kdWxldXJsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRmlsZSkgYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsKLSAgICAgICAgICAgICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0TW9kdWxlQ2xhc3NMb2FkZXIoZGVwbG95bWVudENsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnNldFBhcmVudChheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUZpbGUgPSBmaWxlVXJsLnN1YnN0cmluZygwLCBmaWxlVXJsLmluZGV4T2YoIi5tYXIiKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRBcmNoaXZlTmFtZShtb2R1bGVGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVNb2R1bGUobW9kdWxlLCBtb2R1bGV1cmwpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0RmlsZU5hbWUobW9kdWxldXJsKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkTmV3TW9kdWxlKG1vZHVsZSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5ERVBMT1lJTkdfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXRBcmNoaXZlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXVybC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzLgotICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlnLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLnZhbGlkYXRlU3lzdGVtUHJlZGVmaW5lZFBoYXNlcygpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTW9kdWxlKEF4aXNNb2R1bGUgbW9kdWxlLCBVUkwgbW9kdWxlVXJsKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG1vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gbW9kdWxlU3RyZWFtID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiTUVUQS1JTkYvbW9kdWxlLnhtbCIpOwotICAgICAgICAgICAgaWYgKG1vZHVsZVN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlU3RyZWFtID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibWV0YS1pbmYvbW9kdWxlLnhtbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZHVsZVN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9YTUxfTUlTU0lORywgbW9kdWxlVXJsLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1vZHVsZUJ1aWxkZXIgbW9kdWxlQnVpbGRlciA9IG5ldyBNb2R1bGVCdWlsZGVyKG1vZHVsZVN0cmVhbSwgbW9kdWxlLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIG1vZHVsZUJ1aWxkZXIucG9wdWxhdGVNb2R1bGUoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IHBvcHVsYXRlU2VydmljZShBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgc2VydmljZXNVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBzZXJ2aWNlQ2xhc3NMb2FkZXIgPSBVdGlscy5jcmVhdGVDbGFzc0xvYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVSTFtde3NlcnZpY2VzVVJMfSwKLSAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRTZXJ2aWNlQ2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgKEZpbGUpIGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0YWluZiA9ICJtZXRhLWluZiI7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoc2VydmljZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIC8vcHJvY2Vzc2luZyB3c2RsLmxpc3QKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHdzZGxmaWxlc1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtZXRhLWluZi93c2RsLmxpc3QiKTsKLSAgICAgICAgICAgIGlmICh3c2RsZmlsZXNTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdzZGxmaWxlc1N0cmVhbSA9IHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi93c2RsLmxpc3QiKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbGZpbGVzU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YWluZiA9ICJNRVRBLUlORiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgSGFzaE1hcCBzZXJ2aWNlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBpZiAod3NkbGZpbGVzU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBcmNoaXZlUmVhZGVyIHJlYWRlciA9IG5ldyBBcmNoaXZlUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHdzZGxmaWxlc1N0cmVhbSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkhPScjJykgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IG1ldGFpbmYgKyAiLyIgKyBsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHNlcnZpY2VzID0gcmVhZGVyLmdldEF4aXNTZXJ2aWNlRnJvbVdzZGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShsaW5lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlciwgbGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzTWFwLnB1dChheGlzU2VydmljZS5nZXROYW1lKCksIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNlcnZpY2V4bWxTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiTUVUQS1JTkYvc2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXhtbFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZXhtbFN0cmVhbSA9IHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtZXRhLWluZi9zZXJ2aWNlcy54bWwiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWV0YWluZiA9ICJNRVRBLUlORiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZXhtbFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9YTUxfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc1VSTC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXIoc2VydmljZXhtbFN0cmVhbSwgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBidWlsZGVyLmJ1aWxkT00oKTsKLSAgICAgICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHJvb3RFbGVtZW50LmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgICAgICBpZiAoVEFHX1NFUlZJQ0UuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gICJNRVRBLUlORi9zZXJ2aWNlLndzZGwiOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHdzZGxTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBVUkwgd3NkbFVSTCA9IHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZShtZXRhaW5mICsgIi9zZXJ2aWNlLndzZGwiKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbFN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICAiTUVUQS1JTkYvIiArIHNlcnZpY2VOYW1lICsgIi53c2RsIjsKLSAgICAgICAgICAgICAgICAgICAgd3NkbFN0cmVhbSA9IHNlcnZpY2VDbGFzc0xvYWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxVUkwgPSBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKHdzZGxTdHJlYW0sIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBVdGlscy50b0ZpbGUoc2VydmljZXNVUkwpOwotICAgICAgICAgICAgICAgICAgICBpZihmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21XU0xENEpSZXNvbHZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKHdzZGxMb2NhdGlvbiwgZmlsZSwgd3NkbFN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDJBeGlzU2VydmljZUJ1aWxkZXIuc2V0Q3VzdG9tUmVzb2x2ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJGaWxlQmFzZWRVUklSZXNvbHZlcihmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzZGxVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDJBeGlzU2VydmljZUJ1aWxkZXIuc2V0RG9jdW1lbnRCYXNlVXJpKHdzZGxVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0V3NkbEZvdW5kKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXROYW1lKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFBhcmVudChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldENsYXNzTG9hZGVyKHNlcnZpY2VDbGFzc0xvYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzZXJ2aWNlQnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihjb25maWdDb250ZXh0LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZShyb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBBcnJheUxpc3Qgc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTGlzdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1NFUlZJQ0VfR1JPVVAuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cEJ1aWxkZXIgZ3JvdXBCdWlsZGVyID0gbmV3IFNlcnZpY2VHcm91cEJ1aWxkZXIocm9vdEVsZW1lbnQsIHNlcnZpY2VzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY0xpc3QgPSBncm91cEJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlSXRlcmF0b3IgPSBzZXJ2aWNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSAgIk1FVEEtSU5GL3NlcnZpY2Uud3NkbCI7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHdzZGxTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB3c2RsVVJMID0gc2VydmljZUNsYXNzTG9hZGVyLmdldFJlc291cmNlKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2RsU3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICAiTUVUQS1JTkYvIiArIHNlcnZpY2VOYW1lICsgIi53c2RsIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTdHJlYW0gPSBzZXJ2aWNlQ2xhc3NMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0od3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxVUkwgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAod3NkbFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcih3c2RsU3RyZWFtLCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBVdGlscy50b0ZpbGUoc2VydmljZXNVUkwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwyQXhpc1NlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVdTTEQ0SlJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKHdzZGxMb2NhdGlvbiwgZmlsZSwgd3NkbFN0cmVhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwyQXhpc1NlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFBUkZpbGVCYXNlZFVSSVJlc29sdmVyKGZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3c2RsVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsMkF4aXNTZXJ2aWNlQnVpbGRlci5zZXREb2N1bWVudEJhc2VVcmkod3NkbFVSTC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gd3NkbDJBeGlzU2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRXc2RsRm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIgZm9yIHRoZSBvcGVyYXRpb25zIHRoYXQgd2VyZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGxpc3RlZCBpbiB0aGUgc2VydmljZXMueG1sCi0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobG9hZERlZmF1bHRNZXNzYWdlUmVjZWl2ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSwgYXhpc1NlcnZpY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY0xpc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VSZWNlaXZlciBsb2FkRGVmYXVsdE1lc3NhZ2VSZWNlaXZlcihTdHJpbmcgbWVwVVJMLCBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXI7Ci0gICAgICAgIGlmIChtZXBVUkwgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVwVVJMID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyID0gc2VydmljZS5nZXRNZXNzYWdlUmVjZWl2ZXIobWVwVVJMKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlUmVjZWl2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlUmVjZWl2ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWcuZ2V0TWVzc2FnZVJlY2VpdmVyKG1lcFVSTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE5ld01vZHVsZShBeGlzTW9kdWxlIG1vZHVsZW1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIEZsb3cgaW5mbG93ID0gbW9kdWxlbWV0YWRhdGEuZ2V0SW5GbG93KCk7Ci0gICAgICAgIENsYXNzTG9hZGVyIG1vZHVsZUNsYXNzTG9hZGVyID0gbW9kdWxlbWV0YWRhdGEuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBpZiAoaW5mbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFkZEZsb3dIYW5kbGVycyhpbmZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZsb3cgb3V0RmxvdyA9IG1vZHVsZW1ldGFkYXRhLmdldE91dEZsb3coKTsKLQotICAgICAgICBpZiAob3V0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMob3V0RmxvdywgbW9kdWxlQ2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmxvdyBmYXVsdEluRmxvdyA9IG1vZHVsZW1ldGFkYXRhLmdldEZhdWx0SW5GbG93KCk7Ci0KLSAgICAgICAgaWYgKGZhdWx0SW5GbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFkZEZsb3dIYW5kbGVycyhmYXVsdEluRmxvdywgbW9kdWxlQ2xhc3NMb2FkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmxvdyBmYXVsdE91dEZsb3cgPSBtb2R1bGVtZXRhZGF0YS5nZXRGYXVsdE91dEZsb3coKTsKLQotICAgICAgICBpZiAoZmF1bHRPdXRGbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFV0aWxzLmFkZEZsb3dIYW5kbGVycyhmYXVsdE91dEZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGVtZXRhZGF0YSk7Ci0gICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuQURESU5HX05FV19NT0RVTEUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU2VydmljZUdyb3VwKEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHNlcnZpY2VMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRGaWxlRGF0YSBjdXJyZW50RGVwbG95bWVudEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGZpbGxTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLCBzZXJ2aWNlTGlzdCwgc2VydmljZUxvY2F0aW9uLCBheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXApOwotICAgICAgICBpZiAoY3VycmVudERlcGxveW1lbnRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZEFzV2ViUmVzb3VyY2VzKGN1cnJlbnREZXBsb3ltZW50RmlsZS5nZXRGaWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpLCBzZXJ2aWNlR3JvdXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpbGxTZXJ2aWNlR3JvdXAoQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vLyAgICAgICAgc2VydmljZUdyb3VwLnNldFBhcmVudChheGlzQ29uZmlnKTsKLSAgICAgICAgLy8gbW9kdWxlIGZyb20gc2VydmljZXMueG1sIGF0IHNlcnZpY2VHcm91cCBsZXZlbAotICAgICAgICBBcnJheUxpc3QgZ3JvdXBNb2R1bGVzID0gc2VydmljZUdyb3VwLmdldE1vZHVsZVJlZnMoKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFBhcmVudChheGlzQ29uZmlnKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZykgZ3JvdXBNb2R1bGVzLmdldChpKTsKLSAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gYXhpc0NvbmZpZy5nZXRNb2R1bGUobW9kdWxlTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5lbmdhZ2VNb2R1bGUoYXhpc0NvbmZpZy5nZXRNb2R1bGUobW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQkFEX01PRFVMRV9GUk9NX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCksIG1vZHVsZU5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzID0gc2VydmljZUxpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoc2VydmljZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXMubmV4dCgpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0VXNlRGVmYXVsdENoYWlucyhmYWxzZSk7Ci0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEZpbGVOYW1lKHNlcnZpY2VMb2NhdGlvbik7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0KLSAgICAgICAgICAgIC8vIG1vZHVsZXMgZnJvbSA8c2VydmljZT4KLSAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gYXhpc1NlcnZpY2UuZ2V0TW9kdWxlcygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKChTdHJpbmcpIGxpc3QuZ2V0KGkpKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5CQURfTU9EVUxFX0ZST01fU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoUU5hbWUpIGxpc3QuZ2V0KGkpKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcERlc2MgPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBtb2R1bGVzID0gb3BEZXNjLmdldE1vZHVsZVJlZnMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IChTdHJpbmcpIG1vZHVsZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5CQURfTU9EVUxFX0ZST01fT1BFUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wRGVzYy5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbGUgQXJjaGl2ZUZpbGVEYXRhCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkV1NUb0RlcGxveShEZXBsb3ltZW50RmlsZURhdGEgZmlsZSkgewotICAgICAgICB3c1RvRGVwbG95LmFkZChmaWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmlsZSBXU0luZm8KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRXU1RvVW5kZXBsb3koV1NJbmZvIGZpbGUpIHsKLSAgICAgICAgd3NUb1VuRGVwbG95LmFkZChmaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkb0RlcGxveSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3c1RvRGVwbG95LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzVG9EZXBsb3kuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGZpbGVUb0RlcGxveSA9IChEZXBsb3ltZW50RmlsZURhdGEpIHdzVG9EZXBsb3kuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRvRGVwbG95LmRlcGxveSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBUaGlzIHByb2JhYmx5IGlzbid0IHN1ZmZpY2llbnQuICBNYXliZSBwcm92aWRlIGFuIG9wdGlvbiB0byBzdG9wPwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB3c1RvRGVwbG95LmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZXMsIHJlZmVycmVkIGJ5IHNlcnZlci54bWwsIGV4aXN0IG9yIHRoYXQgdGhleSBhcmUgZGVwbG95ZWQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IDogSWYgc210IGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGF4aXNDb25maWcuZW5nYWdlR2xvYmFsTW9kdWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGdldCBBeGlzQ29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBpbnB1dFN0cmVhbSB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZC4KLSAgICAgKiBUaGUgaW5wdXRzdHJlYW0gc2hvdWxkIGJlIGEgdmFsaWQgYXhpczIueG1sICwgZWxzZSB5b3Ugd2lsbCBiZSBnZXR0aW5nCi0gICAgICogRGVwbG95bWVudEV4Y2VwdGlvbnMuCi0gICAgICogPHAvPgotICAgICAqIEZpcnN0IGNyZWF0IGEgQXhpc0NvbmZpZ3VyYXRpb24gdXNpbmcgZ2l2ZW4gaW5wdXRTcmVhbSAsIGFuZCB0aGVuIGl0IHdpbGwKLSAgICAgKiB0cnkgdG8gZmluZCB0aGUgcmVwb3NpdG9yeSBsb2NhdGlvbiBwYXJhbWV0ZXIgZnJvbSBBeGlzQ29uZmlndXJhdGlvbiwgc28KLSAgICAgKiBpZiB1c2VyIGhhcyBhZGQgYSBwYXJhbWV0ZXIgd2l0aCB0aGUgbmFtZSAicmVwb3NpdG9yeSIgLCB0aGVuIHRoZSB2YWx1ZQotICAgICAqIHNwZWNpZmllZCBieSB0aGF0IHBhcmFtZXRlciB3aWxsIGJlIHRoZSByZXBvc2l0b3J5IGFuZCBzeXN0ZW0gd2lsbCB0cnkgdG8KLSAgICAgKiBsb2FkIG1vZHVsZXMgYW5kIHNlcnZpY2VzIGZyb20gdGhhdCByZXBvc2l0b3J5IGxvY2F0aW9uIGlmIGl0IGEgdmFsaWQKLSAgICAgKiBsb2NhdGlvbi4gaG90IGRlcGxveW1lbnQgYW5kIGhvdCB1cGRhdGUgd2lsbCB3b3JrIGFzIHVzdWFsIGluIHRoaXMgY2FzZS4KLSAgICAgKiA8cC8+Ci0gICAgICogWW91IHdpbGwgYmUgZ2V0dGluZyBBeGlzQ29uZmlndXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGdpdmVuIGlucHV0c3RyZWFtCi0gICAgICogaWYgaXQgaXMgdmFsaWQgLCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB5b3Ugd2lsbCBiZSBnZXR0aW5nCi0gICAgICogRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGluIDogSW5wdXRTdHJlYW0gdG8gYXhpczIueG1sCi0gICAgICogQHJldHVybiBhIHBvcHVsYXRlZCBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiA6IElmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzQ29uZmlnQnVpbGRlciBidWlsZGVyID0gbmV3IEF4aXNDb25maWdCdWlsZGVyKGluLCBheGlzQ29uZmlnLCB0aGlzKTsKLSAgICAgICAgYnVpbGRlci5wb3B1bGF0ZUNvbmZpZygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiZXJyb3IgaW4gY2xvc2luZyBpbnB1dCBzdHJlYW0iKTsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGVEZXBsb3llciA9IG5ldyBNb2R1bGVEZXBsb3llcihheGlzQ29uZmlnKTsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBEZXBsb3ltZW50IGVuZ2luZSB0byBwZXJmb3JtIEhvdCBkZXBsb3ltZW50IGFuZCBzbyBvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciA6IFJlcG9zaXRvcnlMaXN0ZW5lcgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0U2VhcmNoKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBzY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKCk7Ci0KLSAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlKG5ldyBTY2hlZHVsZXJUYXNrKGxpc3RlbmVyKSwgbmV3IERlcGxveW1lbnRJdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bkRlcGxveSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3c1RvVW5EZXBsb3kuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NUb1VuRGVwbG95LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFdTSW5mbyB3c0luZm8gPSAoV1NJbmZvKSB3c1RvVW5EZXBsb3kuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAod3NJbmZvLmdldFR5cGUoKSA9PSBXU0luZm8uVFlQRV9TRVJWSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL05vIG1hdHRlciB3aGF0IHdlIG5lZWQgdG8gdW5kZXBsb3kgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgaGFzIGRlbGV0ZWQgdGhlIGZpbGUgZnJvbSB0aGUgcmVwb3NpdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlcGxveWVyLnVuRGVwbG95KHdzSW5mby5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vV2UgbmVlZCB0byB1bmRlcGxveSB0aGUgc2VydmljZSB3aGV0aGVyIHdlIGhhdmUgZW5hYmxlIGhvdFVwZGF0ZSBvciBub3QgLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gby53IHdoYXQgaGFwcGVuIGlmIHNvbWVvbmUgZGVsZXRlIHRoZSBzZXJ2aWNlIGZyb20gdGhlIHJlcG8KLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveWVyIGRlcGxveWVyID0gd3NJbmZvLmdldERlcGxveWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwbG95ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVyLnVuRGVwbG95KHdzSW5mby5nZXRGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICB9Ci0gICAgICAgIHdzVG9VbkRlcGxveS5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEF4aXNDb25maWd1cmF0aW9uIDxjb2RlPkF4aXNDb25maWd1cmF0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzQ29uZmlndXJhdGlvbiBnZXRBeGlzQ29uZmlnKCkgewotICAgICAgICByZXR1cm4gYXhpc0NvbmZpZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgc2VydmljZSBuYW1lIGZyb20gdGhlIGFyY2hpdmUgZmlsZSBuYW1lLgotICAgICAqIElmIHRoZSBhcmNoaXZlIGZpbGUgbmFtZSBpcyBzZXJ2aWNlMS5hYXIgLCB0aGVuIGF4aXMyIHNlcnZpY2UgbmFtZSB3b3VsZCBiZSBzZXJ2aWNlMQotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBhcmNoaXZlIGZpbGUgbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXhpc1NlcnZpY2VOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBjaGFyIHNlcGVyYXRvciA9ICcuJzsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZihzZXBlcmF0b3IpOwotCi0gICAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgICAgIHZhbHVlID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBheGlzQ29uZmlnLmdldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hvdFVwZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGhvdFVwZGF0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFzV2ViUmVzb3VyY2VzKEZpbGUgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXApIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3ZWJMb2NhdGlvblN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIHdlYkxvY2F0aW9uID0gbmV3IEZpbGUod2ViTG9jYXRpb25TdHJpbmcpOwotICAgICAgICAgICAgRmlsZSBvdXQgPSBuZXcgRmlsZSh3ZWJMb2NhdGlvbiwgc2VydmljZUZpbGVOYW1lKTsKLSAgICAgICAgICAgIGludCBCVUZGRVIgPSAxMDI0OwotICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBuZXcgYnl0ZVtCVUZGRVJdOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW4pOwotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBmaW4pOwotICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgemlwID0gbmV3IFppcEVudHJ5KGVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZiAoemlwLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIldXVyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IHppcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKCJXV1cvIi5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoemlwLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG91dCwgZmlsZU5hbWUpLm1rZGlycygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSB0ZW1wT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUob3V0LCBmaWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IHppbi5yZWFkKGRhdGEsIDAsIEJVRkZFUikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE91dC53cml0ZShkYXRhLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwLnNldEZvdW5kV2ViUmVzb3VyY2VzKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICAgICAgZmluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkxvY2F0aW9uU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gd2ViTG9jYXRpb25TdHJpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gc2V0IHRoZSBhbGwgdGhlIGNsYXNzTG9hZGVyIGhpZXJhcmNoeSB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCAsIHRoZSB0b3AgbW9zdCBwYXJlbnQgaXMKLSAgICAgKiBDQ0wgdGhlbiBTQ0woc3lzdGVtIENsYXNzIExvYWRlcikKLSAgICAgKiBDQ0wKLSAgICAgKiA6Ci0gICAgICogU0NMCi0gICAgICogOiAgOgotICAgICAqIE1DQ0wgIFNDQ0wKLSAgICAgKiA6ICAgICAgOgotICAgICAqIE1DTCAgICBTQ0wKLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE1DQ0wgOiAgbW9kdWxlIGNvbW1vbiBjbGFzcyBsb2FkZXIKLSAgICAgKiBTQ0NMIDogU2VydmljZSBjb21tb24gY2xhc3MgbG9hZGVyCi0gICAgICogTUNMIDogbW9kdWxlIGNsYXNzIGxvYWRlcgotICAgICAqIFNDTCAgOiBTZXJ2aWNlIGNsYXNzIGxvYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXMycmVwb1VSSSA6IFRoZSByZXBvc2l0b3J5IGZvbGRlciBvZiBBeGlzMgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldENsYXNzTG9hZGVycyhTdHJpbmcgYXhpczJyZXBvVVJJKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzTG9hZGVyIHN5c0NsYXNzTG9hZGVyID0KLSAgICAgICAgICAgICAgICBVdGlscy5nZXRDbGFzc0xvYWRlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLCBheGlzMnJlcG9VUkkpOwotCi0gICAgICAgIGF4aXNDb25maWcuc2V0U3lzdGVtQ2xhc3NMb2FkZXIoc3lzQ2xhc3NMb2FkZXIpOwotICAgICAgICBpZiAoc2VydmljZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGF4aXNDb25maWcuc2V0U2VydmljZUNsYXNzTG9hZGVyKAotICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRDbGFzc0xvYWRlcihheGlzQ29uZmlnLmdldFN5c3RlbUNsYXNzTG9hZGVyKCksIHNlcnZpY2VzRGlyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLnNldFNlcnZpY2VDbGFzc0xvYWRlcihheGlzQ29uZmlnLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZHVsZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGF4aXNDb25maWcuc2V0TW9kdWxlQ2xhc3NMb2FkZXIoVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzRGlyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzQ29uZmlnLnNldE1vZHVsZUNsYXNzTG9hZGVyKGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGhvdERlcGxveW1lbnQgYW5kIGhvdCB1cGRhdGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGVwbG95bWVudEZlYXR1cmVzKCkgewotICAgICAgICBQYXJhbWV0ZXIgaG90RGVwbG95bWVudCA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKFRBR19IT1RfREVQTE9ZTUVOVCk7Ci0gICAgICAgIFBhcmFtZXRlciBob3RVcGRhdGUgPSBheGlzQ29uZmlnLmdldFBhcmFtZXRlcihUQUdfSE9UX1VQREFURSk7Ci0KLSAgICAgICAgaWYgKGhvdERlcGxveW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5ob3REZXBsb3ltZW50ID0gSmF2YVV0aWxzLmlzVHJ1ZShob3REZXBsb3ltZW50LmdldFZhbHVlKCksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhvdFVwZGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmhvdFVwZGF0ZSA9IEphdmFVdGlscy5pc1RydWUoaG90VXBkYXRlLmdldFZhbHVlKCksIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VEaXJQYXJhID0gKFN0cmluZykKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKERlcGxveW1lbnRDb25zdGFudHMuU0VSVklDRV9ESVJfUEFUSCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlRGlyUGFyYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlc1BhdGggPSBzZXJ2aWNlRGlyUGFyYTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtb2R1bGVEaXJQYXJhID0gKFN0cmluZykKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKERlcGxveW1lbnRDb25zdGFudHMuTU9EVUxFX0RSSV9QQVRIKTsKLSAgICAgICAgaWYgKG1vZHVsZURpclBhcmEgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlc1BhdGggPSBtb2R1bGVEaXJQYXJhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBkaXJlY3RvcmllcyBmb3IgbW9kdWxlcy9zZXJ2aWNlcywgY29waWVzIGNvbmZpZ3VyYXRpb24geG1sIGZyb20gY2xhc3MgbG9hZGVyIGlmIG5lY2Vzc2FyeQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIHRoZSBwYXRobmFtZSBvZiB0aGUgcmVwb3NpdG9yeQotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0gICAgICAgIHJlcG9zaXRvcnlEaXIgPSBuZXcgRmlsZShyZXBvc2l0b3J5TmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlc1BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZXNEaXIgPSBuZXcgRmlsZShzZXJ2aWNlc1BhdGgpOwotICAgICAgICAgICAgaWYgKCFzZXJ2aWNlc0Rpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VzRGlyID0gbmV3IEZpbGUocmVwb3NpdG9yeURpciwgc2VydmljZXNQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlcnZpY2VzRGlyID0gbmV3IEZpbGUocmVwb3NpdG9yeURpciwgRGVwbG95bWVudENvbnN0YW50cy5TRVJWSUNFX1BBVEgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc2VydmljZXNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm5vc2VydmljZWRpcmZvdW5kIiwgZ2V0UmVwb3NpdG9yeVBhdGgocmVwb3NpdG9yeURpcikpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kdWxlc1BhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlc0RpciA9IG5ldyBGaWxlKG1vZHVsZXNQYXRoKTsKLSAgICAgICAgICAgIGlmICghbW9kdWxlc0Rpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIG1vZHVsZXNEaXIgPSBuZXcgRmlsZShyZXBvc2l0b3J5RGlyLCBtb2R1bGVzUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb2R1bGVzRGlyID0gbmV3IEZpbGUocmVwb3NpdG9yeURpciwgRGVwbG95bWVudENvbnN0YW50cy5NT0RVTEVfUEFUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtb2R1bGVzRGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJub21vZHVsZWRpcmZvdW5kIiwgZ2V0UmVwb3NpdG9yeVBhdGgocmVwb3NpdG9yeURpcikpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVwb3NpdG9yeVBhdGgoRmlsZSByZXBvc2l0b3J5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwb3NpdG9yeS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBvc2l0b3J5LmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBnZXRGaWxlTGlzdChVUkwgZmlsZUxpc3RVcmwpIHsKLSAgICAgICAgQXJyYXlMaXN0IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gZmlsZUxpc3RVcmwub3BlblN0cmVhbSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZUxpc3Q7Ci0gICAgICAgIH0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5wdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmIGxpbmUuY2hhckF0KDApIT0nIycpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWxlTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdDb250ZXh0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAgICAgaW5pdGlhbGl6ZURlcGxveWVycyh0aGlzLmNvbmZpZ0NvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVwbG95ZXJzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgc2VydmljZURlcGxveWVyID0gbmV3IFNlcnZpY2VEZXBsb3llcigpOwotICAgICAgICBzZXJ2aWNlRGVwbG95ZXIuaW5pdChjb25maWdDb250ZXh0KTsgICAgICAgIAotICAgICAgICBmb3IgKE1hcDxTdHJpbmcsIERlcGxveWVyPiBleHRlbnNpb25NYXAgOiBkZXBsb3llck1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgZm9yIChEZXBsb3llciBkZXBsb3llciA6IGV4dGVuc2lvbk1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGRlcGxveWVyLmluaXQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuIEF4aXNNb2R1bGUgZm9yIGEgZ2l2ZW4gbW9kdWxlIGFyY2hpdmUgZmlsZS4gVGhpcyBkb2VzIG5vdAotICAgICAqIGNhbGxlZCB0aGUgaW5pdCBtZXRob2Qgc2luY2UgdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHRvIGNvbmZpZ3VyYXRpb24gY29udGV4dAotICAgICAqIHNvIHdobyBldmVyIGNyZWF0ZSBtb2R1bGUgdXNpbmcgdGhpcyBoYXMgdG8gY2FsbGVkIG1vZHVsZS5pbml0IGlmIGl0IGlzCi0gICAgICogcmVxdWlyZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVhcmNoaXZlIDogQWN0dWFsIG1vZHVsZSBhcmNoaXZlIGZpbGUKLSAgICAgKiBAcGFyYW0gY29uZmlnICAgICAgICA6IEF4aXNDb25maWd1cmF0aW9uIDogZm9yIGdldCBjbGFzc2xvYWRlcnMgZXRjLi4KLSAgICAgKiBAcmV0dXJuIGEgY29tcGxldGUgQXhpc01vZHVsZSByZWFkIGZyb20gdGhlIGZpbGUuCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzTW9kdWxlIGJ1aWxkTW9kdWxlKEZpbGUgbW9kdWxlYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlnKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgTU9EVUxFX0RFUExPWUVSID0gIm1vZHVsZURlcGxveWVyIjsKLSAgICAgICAgQXhpc01vZHVsZSBheGlzbW9kdWxlOwotICAgICAgICBNb2R1bGVEZXBsb3llciBkZXBsb3llciA9IChNb2R1bGVEZXBsb3llcikgY29uZmlnLmdldFBhcmFtZXRlclZhbHVlKE1PRFVMRV9ERVBMT1lFUik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZGVwbG95ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlcGxveWVyID0gbmV3IE1vZHVsZURlcGxveWVyKGNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmFkZFBhcmFtZXRlcihNT0RVTEVfREVQTE9ZRVIsIGRlcGxveWVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGN1cnJlbnREZXBsb3ltZW50RmlsZSA9IG5ldyBEZXBsb3ltZW50RmlsZURhdGEobW9kdWxlYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveWVyKTsKLSAgICAgICAgICAgIGF4aXNtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLQotICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRGaWxlLnNldENsYXNzTG9hZGVyKGZhbHNlLCBjb25maWcuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSwgbnVsbCk7Ci0gICAgICAgICAgICBheGlzbW9kdWxlLnNldE1vZHVsZUNsYXNzTG9hZGVyKGN1cnJlbnREZXBsb3ltZW50RmlsZS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGFyY2hpdmVSZWFkZXIucmVhZE1vZHVsZUFyY2hpdmUoY3VycmVudERlcGxveW1lbnRGaWxlLCBheGlzbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgY29uZmlnKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIG1vZHVsZUNsYXNzTG9hZGVyID0gYXhpc21vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgRmxvdyBpbmZsb3cgPSBheGlzbW9kdWxlLmdldEluRmxvdygpOwotCi0gICAgICAgICAgICBpZiAoaW5mbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMoaW5mbG93LCBtb2R1bGVDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZsb3cgb3V0RmxvdyA9IGF4aXNtb2R1bGUuZ2V0T3V0RmxvdygpOwotCi0gICAgICAgICAgICBpZiAob3V0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuYWRkRmxvd0hhbmRsZXJzKG91dEZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmxvdyBmYXVsdEluRmxvdyA9IGF4aXNtb2R1bGUuZ2V0RmF1bHRJbkZsb3coKTsKLQotICAgICAgICAgICAgaWYgKGZhdWx0SW5GbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMoZmF1bHRJbkZsb3csIG1vZHVsZUNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmxvdyBmYXVsdE91dEZsb3cgPSBheGlzbW9kdWxlLmdldEZhdWx0T3V0RmxvdygpOwotCi0gICAgICAgICAgICBpZiAoZmF1bHRPdXRGbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5hZGRGbG93SGFuZGxlcnMoZmF1bHRPdXRGbG93LCBtb2R1bGVDbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNtb2R1bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgYW4gYXhpc3NlcnZpY2Ugb2JqZWN0IHVzaW5nIHNlcnZpY2VzLnhtbC4gRmlyc3QgY3JlYXRlcwotICAgICAqIGFuIGF4aXNzZXJ2aWNlIG9iamVjdCB1c2luZyBXU0RMIGFuZCB0aGVuIGZpbGxzIGl0IHVzaW5nIHRoZSBnaXZlbiBzZXJ2aWNlcy54bWwuCi0gICAgICogTG9hZHMgYWxsIHRoZSByZXF1aXJlZCBjbGFzcyBhbmQgYnVpbGRzIHRoZSBjaGFpbnMsIGZpbmFsbHkgYWRkcyB0aGUKLSAgICAgKiBzZXJ2aWNlY29udGV4dCB0byBFbmdpbmVDb250ZXh0IGFuZCBheGlzc2VydmljZSBpbnRvIEVuZ2luZUNvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUlucHV0U3RyZWFtIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBkYXRhCi0gICAgICogQHBhcmFtIGNvbmZpZ0N0eCAgICAgICAgICB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQgaW4gd2hpY2ggd2UncmUgZGVwbG95aW5nCi0gICAgICogQHJldHVybiBSZXR1cm5zIEF4aXNTZXJ2aWNlLgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgYnVpbGRTZXJ2aWNlKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBidWlsZGVyID0gbmV3IFNlcnZpY2VCdWlsZGVyKHNlcnZpY2VJbnB1dFN0cmVhbSwgY29uZmlnQ3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlU2VydmljZShidWlsZGVyLmJ1aWxkT00oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBidWlsZCBhIEF4aXNTZXJ2aWNlR3JvdXAgZm9yIGEgZ2l2ZW4gc2VydmljZXMueG1sCi0gICAgICogWW91IGhhdmUgdG8gYWRkIHRoZSBjcmVhdGVkIGdyb3VwIGludG8gQXhpc0NvbmZpZwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VzeG1sICAgICAgSW5wdXRTdHJlYW0gY3JlYXRlZCBmcm9tIHNlcnZpY2VzLnhtbCBvciBlcXVpdmFsZW50Ci0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyICAgICAgQ2xhc3NMb2FkZXIgdG8gdXNlCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcm91cE5hbWUgbmFtZSBvZiB0aGUgc2VydmljZSBncm91cAotICAgICAqIEBwYXJhbSBjb25maWdDdHggICAgICAgIHRoZSBDb25maWd1cmF0aW9uQ29udGV4dCBpbiB3aGljaCB3ZSdyZSBkZXBsb3lpbmcKLSAgICAgKiBAcGFyYW0gYXJjaGl2ZVJlYWRlciAgICB0aGUgQXJjaGl2ZVJlYWRlciB3ZSdyZSB3b3JraW5nIHdpdGgKLSAgICAgKiBAcGFyYW0gd3NkbFNlcnZpY2VzICAgICBNYXAgb2YgZXhpc3RpbmcgV1NETCBzZXJ2aWNlcwotICAgICAqIEByZXR1cm4gYSBmbGVzaGVkLW91dCBBeGlzU2VydmljZUdyb3VwCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlR3JvdXAgYnVpbGRTZXJ2aWNlR3JvdXAoSW5wdXRTdHJlYW0gc2VydmljZXN4bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmNoaXZlUmVhZGVyIGFyY2hpdmVSZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgd3NkbFNlcnZpY2VzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGN1cnJlbnREZXBsb3ltZW50RmlsZSA9IG5ldyBEZXBsb3ltZW50RmlsZURhdGEobnVsbCwgbnVsbCk7Ci0gICAgICAgIGN1cnJlbnREZXBsb3ltZW50RmlsZS5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIuYnVpbGRTZXJ2aWNlR3JvdXAoc2VydmljZXN4bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXBsb3ltZW50RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsU2VydmljZXMsIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICBmaWxsU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCwgc2VydmljZUxpc3QsIG51bGwsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cDsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlR3JvdXAgbG9hZFNlcnZpY2VHcm91cChGaWxlIHNlcnZpY2VGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGN1cnJlbnREZXBsb3ltZW50RmlsZSA9IG5ldyBEZXBsb3ltZW50RmlsZURhdGEoc2VydmljZUZpbGUsIG51bGwpOwotICAgICAgICAgICAgRGVwbG95bWVudENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIoc2VydmljZUZpbGUpOwotICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRGaWxlLnNldENsYXNzTG9hZGVyKGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7Ci0KLSAgICAgICAgICAgIC8vIERyb3AgdGhlIGV4dGVuc2lvbiBhbmQgdGFrZSB0aGUgbmFtZQotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gc2VydmljZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKSk7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShzZXJ2aWNlR3JvdXBOYW1lKTsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLSAgICAgICAgICAgIEhhc2hNYXAgd3NkbFNlcnZpY2VzID0gYXJjaGl2ZVJlYWRlci5wcm9jZXNzV1NETHMoY3VycmVudERlcGxveW1lbnRGaWxlKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNlcnZpY2VYbWwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi9zZXJ2aWNlcy54bWwiKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIuYnVpbGRTZXJ2aWNlR3JvdXAoc2VydmljZVhtbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERlcGxveW1lbnRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTZXJ2aWNlcywgY29uZmlnQ3R4KTsKLSAgICAgICAgICAgIGZpbGxTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLCBzZXJ2aWNlTGlzdCwgbnVsbCwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRTZXJ2aWNlc0RpcigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VzRGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE1vZHVsZXNEaXIoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVzRGlyOwotICAgIH0KLQotCi0gICAgcHVibGljIEZpbGUgZ2V0UmVwb3NpdG9yeURpcigpIHsKLSAgICAgICAgcmV0dXJuIHJlcG9zaXRvcnlEaXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uVG9EZXBsb3llck1hcHBpbmdNYXAoSGFzaE1hcCBleHRlbnNpb25Ub0RlcGxveWVyTWFwcGluZ01hcCkgewotICAgICAgICB0aGlzLmV4dGVuc2lvblRvRGVwbG95ZXJNYXBwaW5nTWFwID0gZXh0ZW5zaW9uVG9EZXBsb3llck1hcHBpbmdNYXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlcGxveWVycyhNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+IGRlcGxveWVyTWFwKSB7Ci0gICAgICAgIHRoaXMuZGVwbG95ZXJNYXAgPSBkZXBsb3llck1hcDsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+IGdldERlcGxveWVycygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVwbG95ZXJNYXA7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBSZXBvc2l0b3J5TGlzdGVuZXIgZ2V0UmVwb0xpc3RlbmVyKCkgewotICAgICAgICByZXR1cm4gcmVwb0xpc3RlbmVyOwotICAgIH0KLQotCi0gICAgcHVibGljIFNlcnZpY2VEZXBsb3llciBnZXRTZXJ2aWNlRGVwbG95ZXIoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRGVwbG95ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZURlcGxveWVyIGdldE1vZHVsZURlcGxveWVyKCkgewotICAgICAgICByZXR1cm4gbW9kdWxlRGVwbG95ZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXBsb3llciBnZXREZXBsb3llcihTdHJpbmcgZGlyZWN0b3J5LCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIERlcGxveWVyPiBleHRlbnNpb25NYXAgPSBkZXBsb3llck1hcC5nZXQoZGlyZWN0b3J5KTsKLSAgICAgICAgcmV0dXJuIChleHRlbnNpb25NYXAgIT0gbnVsbCkgPyBleHRlbnNpb25NYXAuZ2V0KGV4dGVuc2lvbikgOiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRGVwbG95ZXIgZ2V0RGVwbG95ZXJGb3JFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICByZXR1cm4gKERlcGxveWVyKSBleHRlbnNpb25Ub0RlcGxveWVyTWFwcGluZ01hcC5nZXQoZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbiB1cCB0aGUgbWVzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGlmIChheGlzQ29uZmlnLmdldE1vZHVsZUNsYXNzTG9hZGVyKCkgaW5zdGFuY2VvZiBKYXJGaWxlQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgICgoSmFyRmlsZUNsYXNzTG9hZGVyKWF4aXNDb25maWcuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKSkuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChheGlzQ29uZmlnLmdldFNlcnZpY2VDbGFzc0xvYWRlcigpIGluc3RhbmNlb2YgSmFyRmlsZUNsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAoKEphckZpbGVDbGFzc0xvYWRlcilheGlzQ29uZmlnLmdldFNlcnZpY2VDbGFzc0xvYWRlcigpKS5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSBpbnN0YW5jZW9mIEphckZpbGVDbGFzc0xvYWRlcikgewotICAgICAgICAgICAgKChKYXJGaWxlQ2xhc3NMb2FkZXIpYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKS5kZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNjaGVkdWxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZXIuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEVycm9yTXNncy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEVycm9yTXNncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGM4MTk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFcnJvck1zZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEZXBsb3ltZW50RXJyb3JNc2dzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJTkdfTkVXX01PRFVMRSA9ICJhZGRpbmduZXdtb2R1bGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9NT0RVTEVfRlJPTV9PUEVSQVRJT04gPSAiYmFkTW9kdWxlRnJvbU9wZXJhdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEX01PRFVMRV9GUk9NX1NFUlZJQ0UgPSAiYmFkTW9kdWxlRnJvbVNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9QQVJBTUVURVJfQVJHVU1FTlQgPSAiYmFkcGFyYWFndSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX05PVF9GT1VORCA9ICJjb25maWdub3Rmb3VuZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTk9UX0ZPVU5EID0gImNsYXNzbm90Zm91bmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUlOR19NT0RVTEUgPSAiZGVwbG95aW5nbW9kdWxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lJTkdfV1MgPSAiZGVwbG95aW5nd3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUlOR19QT0pPID0gImRlcGxveWluZ3Bvam8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfSVNfTk9UX0FMTE9XRUQgPSAiZWxlbWVudGlzbm90YWxsb3ciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOX0xPQURJTkdfTUVTU0FHRV9SRUNFSVZFUiA9ICJlcnJvcmlubG9hZGluZ21yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9XVFlQRV9JU19SRVFVSVJFRCA9ICJmbG93dHlwZWlzcmVxdWlyZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OT1RfRk9VTkQgPSAiZmlsZU5vdEZvdW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZMT1dfTk9UX0FMTE9XRURfSU5fVFJTX09VVCA9ICJpbmZsb3dub3RhbGxvd2VkaW50cm91dCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9IQU5ETEVSID0gImludmFsaWRoYW5kbGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX01PRFVMRSA9ICJpbnZhbGlkbW9kdWxlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX01PRFVMRV9DT05GSUcgPSAiaW52YWxpZG1vZHVsZWNvbmZpZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9NT0RVTEVfUkVGID0gImludmFsaWRtb2R1bGVyZWZieWNvbmZpZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9PUCA9ICJpbnZhbGlkX29wIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1BIQVNFID0gImludmFsaWRwaGFzZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9TRVJWSUNFID0gImludmFsaWRzZXJ2aWNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX1NUT1JBR0VfQ0xBU1MgPSAiaW52YWxpZF9zdG9yYWdlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfQ0FOTk9UX0hBVkVfQk9USF9OQU1FX0FORF9SRUZFUkVOQ0UgPQotICAgICAgICAgICAgIm1vZHVsZWNhbm5vdGhhdnJib3RobmFtZWFuZHJlZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTUEFUQ0hfUEhBU0VfTk9UX0ZPVU5EID0gImRpc3BhdGNoUGhhc2VOb3RGb3VuZE9uSW5mbG93IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTk9UX0ZPVU5EID0gIm1vZHVsZW5vdGZvdW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVkFMSURBVElPTl9GQUlMRUQgPSAibW9kdWxldmFsZmFpbGVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfWE1MX01JU1NJTkcgPSAibW9kdWxleG1sbm90Zm91bmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GX01JU1NJTkcgPSAibm9NZXRhSW5mIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQlNFUlZFUl9FUlJPUiA9ICJvYnNlcmVycm9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fUFJPQ0VTU19FUlJPUiA9ICJvcF9lcnJvciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VURkxPV19OT1RfQUxMT1dFRF9JTl9UUlNfSU4gPQotICAgICAgICAgICAgIm91dGZsb3dub3RhbGxvd2VkaW50cmluIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTE9DS0VEID0gInBhcmFtZXRlcmxvY2tlZGVycm9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1RPX0NPTkZJR19DQU5OT1RfQkVfTlVMTCA9ICJwYXRodG9jb25maWdjYW5vdG51bGwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfQ0FOTk9UX0JFX05VTEwgPSAicmVwb2Nhbm5vdGJlYnVsbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9NT0RVTEVfQ0FOTk9UX1JFRkVSX0dMT0JBTF9QSEFTRSA9Ci0gICAgICAgICAgICAic2VydmljZW1vZHVsZWNhbm5vdGhhdmVnbG9iYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9FUlJPUiA9ICJzZXJ2aWNlbmFtZWVyb3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUkVNT1ZFRCA9ICJzZXJ2aWNlcmVtb3ZlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9YTUxfTk9UX0ZPVU5EID0gInNlcnZpY2V4bWxub3Rmb3VuZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0VUVElOR19DTElFTlRfSE9NRSA9ICJzZXR0aW5nY2wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9TRU5ERVJfRVJST1IgPSAidHJhbnNwb3J0U2VuZGVyRXJyb3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TVFJFQU1fRVhDRVBUSU9OID0gIlN0cmVhbUV4Y2VwdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9BRElOR19NRVNTQUdFX0JVSUxERVIgPSAiZXJyb3Jsb2FkaW5nYnVpbGRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9BRElOR19NRVNTQUdFX0ZPUk1BVFRFUiA9ICJlcnJvcmxvYWRpbmdmb3JtYXR0ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWUlOR19FWENFUFRJT04gPSAiZGVwbG95aW5nZXhjZXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SSU5HX0ZBVUxUWV9TRVJWSUNFID0gInN0cm9yaW5nZmF1bHR5c2VydmljZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfSkFSU19NSVNTSU5HID0gImpheHdzamFyc21pc3NpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUWV9TRVJWSUNFX1JFTU9WQUwgPSAiZmF1bHR5c2VydmljZXJlbW92YWwiOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY2MmQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBBeGlzRmF1bHQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIwNjIxNTYxMjIwODU4MDY4NEw7Ci0KLSAgICBwdWJsaWMgRGVwbG95bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVwbG95bWVudEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXBsb3ltZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRMaWZlQ3ljbGVMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmQxNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotLyoqCi0gKiB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGluZm9ybSBkZXBsb3ltZW50IGxpZmVjeWNsZSByZWFsYXRlZCBldmVudHMgdG8KLSAqIGxpc3RuZXJzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVwbG95bWVudExpZmVDeWNsZUxpc3RlbmVyIHsKLQotICAgIC8qKgotICAgICAqIGNhbGxzIGJlZm9yZSBjcmVhdGluZyB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IHRvIGRvIGFueSBpbml0aWFsaXppbmcgd29yay4KLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlRGVwbG95KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBjYWxscyBhZnRlciBzdGFydGluZyB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IHRvIHJlc3VtZSBhbnkgYWN0aXZpdHkuCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0RGVwbG95KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0Rlc2NyaXB0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWU3MzUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0Rlc2NyaXB0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBoYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lTdWJqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5UmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkb2VzIHRoZSBjb21tb24gdGFza3MgZm9yIGFsbCAqQnVpbGRlciBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uQnVpbGRlciBpbXBsZW1lbnRzIERlcGxveW1lbnRDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0aW9uQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4OwotCi0gICAgcHJvdGVjdGVkIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZGVzY3JpcHRpb25TdHJlYW07Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXIoSW5wdXRTdHJlYW0gc2VydmljZUlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIHRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4OwotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RyZWFtID0gc2VydmljZUlucHV0U3RyZWFtOwotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSB0aGlzLmNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXIoSW5wdXRTdHJlYW0gc2VydmljZUlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uU3RyZWFtID0gc2VydmljZUlucHV0U3RyZWFtOwotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzQ29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgT01FbGVtZW50IGZvciBhIGdpdmVuIGRlc2NyaXB0aW9uIGRvY3VtZW50IChheGlzMi54bWwgLAotICAgICAqIHNlcnZpY2VzLnhtbCBhbmQgbW9kdWxlLnhtbCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgPGNvZGU+T01FbGVtZW50PC9jb2RlPiAuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIE9NRWxlbWVudCBidWlsZE9NKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gKE9NRWxlbWVudCkgWE1MVXRpbHMudG9PTShkZXNjcmlwdGlvblN0cmVhbSk7Ci0gICAgICAgIGVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycy4gRmlyc3Qgc2VhcmNoZXMgaW4gQXhpc2VydmljZSBmb3IgdGhlCi0gICAgICogZ2l2ZW4gbWVwVVJMLCBpZiBub3QgZm91bmQgc2VhcmNoZXMgaW4gQXhpc0NvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBtZXBVUkwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVwVVJMICA6Ci0gICAgICogICAgICAgICAgICAgICAgY2FuIGJlIG51bGwKLSAgICAgKiBAcGFyYW0gc2VydmljZSA6Ci0gICAgICogICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgbnVsbCA8Y29kZT5BeGlzU2VydmljZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWVzc2FnZVJlY2VpdmVyIGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKFN0cmluZyBtZXBVUkwsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlcjsKLSAgICAgICAgaWYgKG1lcFVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXBVUkwgPSBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXIgPSBzZXJ2aWNlLmdldE1lc3NhZ2VSZWNlaXZlcihtZXBVUkwpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZWNlaXZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VSZWNlaXZlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc0NvbmZpZy5nZXRNZXNzYWdlUmVjZWl2ZXIobWVwVVJMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycyBzcGVjaWZpZWQgZWl0aGVyIGluIGF4aXMyLnhtbCBvcgotICAgICAqIHNlcnZpY2VzLnhtbC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb2Nlc3NNZXNzYWdlUmVjZWl2ZXJzKE9NRWxlbWVudCBtZXNzYWdlUmVjZWl2ZXJzKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1yX21lcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEl0ZXJhdG9yIG1zZ1JlY2VpdmVycyA9IG1lc3NhZ2VSZWNlaXZlcnMuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgVEFHX01FU1NBR0VfUkVDRUlWRVIpKTsKLSAgICAgICAgd2hpbGUgKG1zZ1JlY2VpdmVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtc2dSZWNlaXZlciA9IChPTUVsZW1lbnQpIG1zZ1JlY2VpdmVycy5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBPTUVsZW1lbnQgdGVtcE1zZ1JlY2VpdmVyID0gbXNnUmVjZWl2ZXI7Ci0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWNlaXZlciA9IChNZXNzYWdlUmVjZWl2ZXIpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkTWVzc2FnZVJlY2VpdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcE1zZ1JlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IChEZXBsb3ltZW50RXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbWVwQXR0ID0gbXNnUmVjZWl2ZXIuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfTUVQKSk7Ci0gICAgICAgICAgICBtcl9tZXAucHV0KG1lcEF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLCByZWNlaXZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1yX21lcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycyBzcGVjaWZpZWQgZWl0aGVyIGluIGF4aXMyLnhtbCBvcgotICAgICAqIHNlcnZpY2VzLnhtbC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBIYXNoTWFwIHByb2Nlc3NNZXNzYWdlUmVjZWl2ZXJzKENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1lcHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgVEFHX01FU1NBR0VfUkVDRUlWRVIpKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IHJlY2VpdmVyRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IGxvYWRNZXNzYWdlUmVjZWl2ZXIobG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlckVsZW1lbnQpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbWVwQXR0ID0gcmVjZWl2ZXJFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19NRVApKTsKLSAgICAgICAgICAgIG1lcHMucHV0KG1lcEF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpLCByZWNlaXZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lcHM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VSZWNlaXZlciBsb2FkTWVzc2FnZVJlY2VpdmVyKENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgT01BdHRyaWJ1dGUgcmVjZWl2ZXJOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIFRBR19DTEFTU19OQU1FKSk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSByZWNlaXZlck5hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgTWVzc2FnZVJlY2VpdmVyIHJlY2VpdmVyID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgbWVzc2FnZVJlY2VpdmVyOwotCi0gICAgICAgICAgICBpZiAoKGNsYXNzTmFtZSAhPSBudWxsKSAmJiAhIiIuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlUmVjZWl2ZXIgPSBMb2FkZXIubG9hZENsYXNzKGxvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICByZWNlaXZlciA9IChNZXNzYWdlUmVjZWl2ZXIpIG1lc3NhZ2VSZWNlaXZlci5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgICAgICAiQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuRVJST1JfSU5fTE9BRElOR19NRVNTQUdFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgICAgICAiSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiIsIGNsYXNzTmFtZSksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBidWlsZGVycyBzcGVjaWZpZWQgaW4gYXhpczIueG1sIG9yIHNlcnZpY2VzLnhtbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVpbGRlcnNFbGVtZW50Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcHJvY2Vzc01lc3NhZ2VCdWlsZGVycyhPTUVsZW1lbnQgbWVzc2FnZUJ1aWxkZXJzRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBidWlsZGVyU2VsZWN0b3IgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBJdGVyYXRvciBtc2dCdWlsZGVycyA9IG1lc3NhZ2VCdWlsZGVyc0VsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfQlVJTERFUikpOwotICAgICAgICB3aGlsZSAobXNnQnVpbGRlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbXNnQnVpbGRlckVsZW1lbnQgPSAoT01FbGVtZW50KSBtc2dCdWlsZGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBidWlsZGVyTmFtZSA9IG1zZ0J1aWxkZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBidWlsZGVyTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgQ2xhc3MgYnVpbGRlckNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlck9iamVjdDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlckNsYXNzID0gZmluZEFuZFZhbGlkYXRlU2VsZWN0b3JDbGFzcyhjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLkVSUk9SX0xPQURJTkdfTUVTU0FHRV9CVUlMREVSKTsKLSAgICAgICAgICAgICAgICBidWlsZGVyT2JqZWN0ID0gKEJ1aWxkZXIpIGJ1aWxkZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKERlcGxveW1lbnRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5zdGFudGlhdGUgdGhlIHNwZWNpZmllZCBCdWlsZGVyIENsYXNzICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWlsZGVyQ2xhc3MuZ2V0TmFtZSgpICsgIi4iLCBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbnN0YW50aWF0ZSB0aGUgc3BlY2lmaWVkIEJ1aWxkZXIgQ2xhc3MgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVpbGRlckNsYXNzLmdldE5hbWUoKSArICIuIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBjb250ZW50VHlwZUF0dCA9IG1zZ0J1aWxkZXJFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DT05URU5UX1RZUEUpKTsKLSAgICAgICAgICAgIGJ1aWxkZXJTZWxlY3Rvci5wdXQoY29udGVudFR5cGVBdHQuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlck9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXJTZWxlY3RvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyB0aGUgbWVzc2FnZSBidWlsZGVycyBzcGVjaWZpZWQgaW4gYXhpczIueG1sIG9yIHNlcnZpY2VzLnhtbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9jZXNzTWVzc2FnZUZvcm1hdHRlcnMoT01FbGVtZW50IG1lc3NhZ2VGb3JtYXR0ZXJzRWxlbWVudCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBtZXNzYWdlRm9ybWF0dGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEl0ZXJhdG9yIG1zZ0Zvcm1hdHRlcnMgPSBtZXNzYWdlRm9ybWF0dGVyc0VsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfRk9STUFUVEVSKSk7Ci0gICAgICAgIHdoaWxlIChtc2dGb3JtYXR0ZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG1zZ0Zvcm1hdHRlckVsZW1lbnQgPSAoT01FbGVtZW50KSBtc2dGb3JtYXR0ZXJzLm5leHQoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCB0ZW1wTXNnRm9ybWF0dGVyID0gbXNnRm9ybWF0dGVyRWxlbWVudDsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGZvcm1hdHRlck5hbWUgPSB0ZW1wTXNnRm9ybWF0dGVyLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmb3JtYXR0ZXJOYW1lLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIGZvcm1hdHRlck9iamVjdDsKLSAgICAgICAgICAgIENsYXNzIGZvcm1hdHRlckNsYXNzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0dGVyQ2xhc3MgPSBmaW5kQW5kVmFsaWRhdGVTZWxlY3RvckNsYXNzKGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5FUlJPUl9MT0FESU5HX01FU1NBR0VfRk9STUFUVEVSKTsKLSAgICAgICAgICAgICAgICBmb3JtYXR0ZXJPYmplY3QgPSAoTWVzc2FnZUZvcm1hdHRlcikgZm9ybWF0dGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IChEZXBsb3ltZW50RXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSBzcGVjaWZpZWQgRm9ybWF0dGVyIENsYXNzICA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmb3JtYXR0ZXJDbGFzcy5nZXROYW1lKCkgKyAiLiIsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGluc3RhbnRpYXRlIHRoZSBzcGVjaWZpZWQgRm9ybWF0dGVyIENsYXNzIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZvcm1hdHRlckNsYXNzLmdldE5hbWUoKSArICIuIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBjb250ZW50VHlwZUF0dCA9IG1zZ0Zvcm1hdHRlckVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NPTlRFTlRfVFlQRSkpOwotICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlcnMucHV0KGNvbnRlbnRUeXBlQXR0LmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZUZvcm1hdHRlcnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRBbmRWYWxpZGF0ZVNlbGVjdG9yQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIGVycm9yTXNnKQotICAgICAgICAgICAgdGhyb3dzIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKENsYXNzKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VsZWN0b3JDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjbGFzc05hbWUgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKFRocmVhZC5jdXJyZW50VGhyZWFkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZShlcnJvck1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBDbGFzcyBOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKGVycm9yTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3JDbGFzczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NlcyBmbG93IGVsZW1lbnRzIGluIHNlcnZpY2VzLnhtbCAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvd2VsZW1lbnQgPGNvZGU+T01FbGVtZW50PC9jb2RlPgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCBGbG93IHByb2Nlc3NGbG93KE9NRWxlbWVudCBmbG93ZWxlbWVudCwgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZsb3cgZmxvdyA9IG5ldyBGbG93KCk7Ci0KLSAgICAgICAgaWYgKGZsb3dlbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmbG93OwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgaGFuZGxlcnMgPSBmbG93ZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBUQUdfSEFORExFUikpOwotCi0gICAgICAgIHdoaWxlIChoYW5kbGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBoYW5kbGVyRWxlbWVudCA9IChPTUVsZW1lbnQpIGhhbmRsZXJzLm5leHQoKTsKLQotICAgICAgICAgICAgZmxvdy5hZGRIYW5kbGVyKHByb2Nlc3NIYW5kbGVyKGhhbmRsZXJFbGVtZW50LCBwYXJlbnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmbG93OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcm9jZXNzU3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcygKLSAgICAgICAgICAgIE9NRWxlbWVudCBzdXBwb3J0ZWRQb2xpY3lFbGVtZW50cykgewotICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lc3BhY2VzID0gc3VwcG9ydGVkUG9saWN5RWxlbWVudHMKLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfTkFNRVNQQUNFUykpOwotICAgICAgICBpZiAobmFtZXNwYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuYW1lc3BhY2VzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUU5hbWVbXSBnZXRMb2NhbFBvbGljeUFzc2VydGlvbk5hbWVzKE9NRWxlbWVudCBsb2NhbFBvbGljeUFzc2VydGlvbnNFbGVtZW50KSB7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBsb2NhbFBvbGljeUFzc2VydGlvbnNFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaWYgKCEgaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBxbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE9NRWxlbWVudCBjaGlsZEVsZW1lbnQ7Ci0KLSAgICAgICAgZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHFuYW1lcy5hZGQoY2hpbGRFbGVtZW50LmdldFFOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUU5hbWVbXSBidWZmZXIgPSBuZXcgUU5hbWVbcW5hbWVzLnNpemUoKV07Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkocW5hbWVzLnRvQXJyYXkoKSwgMCwgYnVmZmVyLCAwLCBxbmFtZXMuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBIYW5kbGVyRGVzY3JpcHRpb24gcHJvY2Vzc0hhbmRsZXIoT01FbGVtZW50IGhhbmRsZXJfZWxlbWVudCwgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NIYW5kbGVyKGhhbmRsZXJfZWxlbWVudCwgcGFyZW50LCBudWxsKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIEhhbmRsZXIgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyX2VsZW1lbnQgPGNvZGU+T01FbGVtZW50PC9jb2RlPgotICAgICAqIEByZXR1cm4gUmV0dXJucyBIYW5kbGVyRGVzY3JpcHRpb24uCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIEhhbmRsZXJEZXNjcmlwdGlvbiBwcm9jZXNzSGFuZGxlcihPTUVsZW1lbnQgaGFuZGxlcl9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGFpbmluZ1BoYXNlKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFNldHRpbmcgaGFuZGxlciBuYW1lCi0gICAgICAgIE9NQXR0cmlidXRlIG5hbWVfYXR0cmlidXRlID0gaGFuZGxlcl9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQVRUUklCVVRFX05BTUUpKTsKLQotICAgICAgICBpZiAobmFtZV9hdHRyaWJ1dGUgPT0gbnVsbCB8fCBuYW1lX2F0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9IQU5ETEVSLCAiVW5rbm93biIsICJOYW1lIG1pc3NpbmciKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlciA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24obmFtZV9hdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0KLSAgICAgICAgLy8gU2V0dGluZyBoYW5kbGVyIGNsYXNzIG5hbWUKLSAgICAgICAgT01BdHRyaWJ1dGUgY2xhc3NfYXR0cmlidXRlID0gaGFuZGxlcl9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgVEFHX0NMQVNTX05BTUUpKTsKLQotICAgICAgICBpZiAoY2xhc3NfYXR0cmlidXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKChNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfSEFORExFUiwgbmFtZV9hdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzIG5hbWUgaXMgbWlzc2luZyIpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYW5kbGVyLnNldENsYXNzTmFtZShjbGFzc19hdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9jZXNzaW5nIHBoYXNlIHJ1bGVzIChvcmRlcikKLSAgICAgICAgT01FbGVtZW50IG9yZGVyX2VsZW1lbnQgPSBoYW5kbGVyX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfT1JERVIpKTsKLQotICAgICAgICBQaGFzZVJ1bGUgcnVsZXMgPSBoYW5kbGVyLmdldFJ1bGVzKCk7Ci0gICAgICAgIGlmIChvcmRlcl9lbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250YWluaW5nUGhhc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBJbmNsdWRlIG1vcmUgaW5mb3JtYXRpb24gKHdoaWNoIGhhbmRsZXI/KSBpbiBtZXNzYWdlIQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKChNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX0hBTkRMRVIsIG5hbWVfYXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAicGhhc2UgcnVsZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bGVzLnNldFBoYXNlTmFtZShjb250YWluaW5nUGhhc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSXRlcmF0b3Igb3JkZXJfaXRyID0gb3JkZXJfZWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChvcmRlcl9pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgb3JkZXJBdHRyaWJ1dGUgPSAoT01BdHRyaWJ1dGUpIG9yZGVyX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBvcmRlckF0dHJpYnV0ZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG9yZGVyQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoVEFHX0FGVEVSLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRBZnRlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfQkVGT1JFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRCZWZvcmUodmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BIQVNFLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRQaGFzZU5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX1BIQVNFX0ZJUlNULmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9vbHZhbCA9IGdldFZhbHVlKHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbHZhbC5lcXVhbHMoQk9PTEVBTl9UUlVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChib29sdmFsLmVxdWFscyhCT09MRUFOX0ZBTFNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc2V0UGhhc2VGaXJzdChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19QSEFTRV9MQVNULmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9vbHZhbCA9IGdldFZhbHVlKHZhbHVlKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbHZhbC5lcXVhbHMoQk9PTEVBTl9UUlVFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXMuc2V0UGhhc2VMYXN0KHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvb2x2YWwuZXF1YWxzKEJPT0xFQU5fRkFMU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydWxlcy5zZXRQaGFzZUxhc3QoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJdGVyYXRvciBwYXJhbWV0ZXJzID0gaGFuZGxlcl9lbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgaGFuZGxlciwgcGFyZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlci5zZXRQYXJlbnQocGFyZW50KTsKLQotICAgICAgICByZXR1cm4gaGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3BlcmF0aW9uTW9kdWxlUmVmcyhJdGVyYXRvciBtb2R1bGVSZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAobW9kdWxlUmVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT01BdHRyaWJ1dGUgbW9kdWxlUmVmQXR0cmlidXRlID0gbW9kdWxlcmVmCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlUmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZk5hbWUgPSBtb2R1bGVSZWZBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5NT0RVTEVfTk9UX0ZPVU5ELCByZWZOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWRkTW9kdWxlKHJlZk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9OT1RfRk9VTkQsIGF4aXNGYXVsdAotICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFBhcmFtZXRlciBvYmplY3QgZnJvbSB0aGUgT00uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyAgICAgICA8Y29kZT5QYXJhbWV0ZXI8L2NvZGU+Ci0gICAgICogQHBhcmFtIHBhcmFtZXRlckluY2x1ZGUgPGNvZGU+UGFyYW1ldGVySW5jbHVkZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICA8Y29kZT5QYXJhbWV0ZXJJbmNsdWRlPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYXJhbWV0ZXJzKEl0ZXJhdG9yIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVySW5jbHVkZSBwYXJhbWV0ZXJJbmNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50KQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAocGFyYW1ldGVycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gY2hlY2sgd2hldGhlciBzb21lIG9uZSBoYXMgbG9ja2VkIHRoZSBwYXJtZXRlciBhdCB0aGUKLSAgICAgICAgICAgIC8vIHRvcCBsZXZlbAotICAgICAgICAgICAgT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSAoT01FbGVtZW50KSBwYXJhbWV0ZXJzLm5leHQoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHBhcmFtZXRlckVsZW1lbnQKLSAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJFbGVtZW50KHBhcmFtZXRlckVsZW1lbnQpOwotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgTmFtZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgcGFyYW1OYW1lID0gcGFyYW1ldGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5CQURfUEFSQU1FVEVSX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudC50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZShwYXJhbU5hbWUuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHBhcmFtZXRlciBWYWx1ZSAodGhlIGNoaWxkIGVsZW1lbnQgb2YgdGhlIHBhcmFtZXRlcikKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbVZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlclR5cGUoUGFyYW1ldGVyLk9NX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhdGV4dFZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUocGFyYXRleHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFBhcmFtZXRlclR5cGUoUGFyYW1ldGVyLlRFWFRfUEFSQU1FVEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNldHRpbmcgbG9ja2luZyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFtTG9ja2VkID0gcGFyYW1ldGVyRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBBVFRSSUJVVEVfTE9DS0VEKSk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyZW50UGFyYW0gPSBudWxsOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50UGFyYW0gPSBwYXJlbnQuZ2V0UGFyYW1ldGVyKHBhcmFtZXRlci5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtTG9ja2VkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9ja2VkVmFsdWUgPSBwYXJhbUxvY2tlZC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChCT09MRUFOX1RSVUUuZXF1YWxzKGxvY2tlZFZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGFyYW1ldGVyIGlzIGxvY2tlZCBhdCBzb21lIGxldmVsIHBhcmFtZXRlciB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGJ5IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuQ09ORklHX05PVF9GT1VORCwgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TG9ja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmVudFBhcmFtID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXBhcmVudC5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgQXhpc09wZXJhdGlvbiB3aXRoIGRldGFpbHMgZnJvbSB0aGUgYWN0aW9uTWFwcGluZywKLSAgICAgKiBvdXRwdXRBY3Rpb25NYXBwaW5nIGFuZCBmYXVsdEFjdGlvbk1hcHBpbmcgZWxlbWVudHMgZnJvbSB0aGUgb3BlcmF0aW9uCi0gICAgICogZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKiBAcGFyYW0gb3BfZGVzY3JpcAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBY3Rpb25NYXBwaW5ncyhPTUVsZW1lbnQgb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wX2Rlc2NyaXApIHsKLSAgICAgICAgSXRlcmF0b3IgbWFwcGluZ0l0ZXJhdG9yID0gb3BlcmF0aW9uLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5BQ1RJT05fTUFQUElORykpOwotICAgICAgICBBcnJheUxpc3QgbWFwcGluZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChtYXBwaW5nSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBtYXBwaW5nSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGlucHV0QWN0aW9uU3RyaW5nID0gbWFwcGluZ0VsZW1lbnQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiSW5wdXQgQWN0aW9uIE1hcHBpbmcgZm91bmQ6ICIgKyBpbnB1dEFjdGlvblN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoISIiLmVxdWFscyhpbnB1dEFjdGlvblN0cmluZykpIHsKLSAgICAgICAgICAgICAgICBtYXBwaW5nTGlzdC5hZGQoaW5wdXRBY3Rpb25TdHJpbmcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJaZXJvIGxlbmd0aCBpbnB1dCBhY3Rpb24gc3RyaW5nIGZvdW5kLiBOb3QgYWRkZWQgdG8gbWFwcGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvcF9kZXNjcmlwLnNldFdzYW1hcHBpbmdMaXN0KG1hcHBpbmdMaXN0KTsKLQotICAgICAgICBPTUVsZW1lbnQgb3V0cHV0QWN0aW9uID0gb3BlcmF0aW9uLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLk9VVFBVVF9BQ1RJT05fTUFQUElORykpOwotICAgICAgICBpZiAoKG91dHB1dEFjdGlvbiAhPSBudWxsKSAmJiAob3V0cHV0QWN0aW9uLmdldFRleHQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgU3RyaW5nIG91dHB1dEFjdGlvblN0cmluZyA9IG91dHB1dEFjdGlvbi5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJPdXRwdXQgQWN0aW9uIE1hcHBpbmcgZm91bmQ6ICIgKyBvdXRwdXRBY3Rpb25TdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BfZGVzY3JpcC5zZXRPdXRwdXRBY3Rpb24ob3V0cHV0QWN0aW9uU3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBmYXVsdEFjdGlvbnNJdGVyYXRvciA9IG9wZXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShDb25zdGFudHMuRkFVTFRfQUNUSU9OX01BUFBJTkcpKTsKLSAgICAgICAgd2hpbGUgKGZhdWx0QWN0aW9uc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGZhdWx0TWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBmYXVsdEFjdGlvbnNJdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0QWN0aW9uU3RyaW5nID0gZmF1bHRNYXBwaW5nRWxlbWVudC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgU3RyaW5nIGZhdWx0QWN0aW9uTmFtZSA9IGZhdWx0TWFwcGluZ0VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShDb25zdGFudHMuRkFVTFRfQUNUSU9OX05BTUUpKTsKLSAgICAgICAgICAgIGlmIChmYXVsdEFjdGlvbk5hbWUgIT0gbnVsbCAmJiBmYXVsdEFjdGlvblN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiRmF1bHQgQWN0aW9uIE1hcHBpbmcgZm91bmQ6ICIgKyBmYXVsdEFjdGlvbk5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsICIgKyBmYXVsdEFjdGlvblN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wX2Rlc2NyaXAuYWRkRmF1bHRBY3Rpb24oZmF1bHRBY3Rpb25OYW1lLCBmYXVsdEFjdGlvblN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUG9saWN5RWxlbWVudHMoSXRlcmF0b3IgcG9saWN5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCkgewotICAgICAgICB3aGlsZSAocG9saWN5RWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQb2xpY3kgcCA9IFBvbGljeUVuZ2luZQotICAgICAgICAgICAgICAgICAgICAuZ2V0UG9saWN5KChPTUVsZW1lbnQpIHBvbGljeUVsZW1lbnRzLm5leHQoKSk7Ci0gICAgICAgICAgICBwb2xpY3lTdWJqZWN0LmF0dGFjaFBvbGljeShwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhJdGVyYXRvciBwb2xpY3lSZWZFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0KSB7Ci0gICAgICAgIHdoaWxlIChwb2xpY3lSZWZFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSBQb2xpY3lFbmdpbmUKLSAgICAgICAgICAgICAgICAgICAgLmdldFBvbGljeVJlZmVyZW5jZSgoT01FbGVtZW50KSBwb2xpY3lSZWZFbGVtZW50cy5uZXh0KCkpOwotICAgICAgICAgICAgcG9saWN5U3ViamVjdC5hdHRhY2hQb2xpY3lSZWZlcmVuY2UocG9saWN5UmVmZXJlbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNob3J0IGZpbGUgbmFtZS4gU2hvcnQgZmlsZSBuYW1lIGlzIHRoZSBuYW1lIGJlZm9yZSB0aGUgZG90LgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaG9ydEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBjaGFyIHNlcGVyYXRvciA9IFNFUEFSQVRPUl9ET1Q7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2Yoc2VwZXJhdG9yKTsKLQotICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuIGVnIHhzZDphbnlWYWwgLS0+IGFueVZhbAotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBpbikgewotICAgICAgICBjaGFyIHNlcGVyYXRvciA9IFNFUEFSQVRPUl9DT0xPTjsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBpbnQgaW5kZXggPSBpbi5pbmRleE9mKHNlcGVyYXRvcik7Ci0KLSAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgdmFsdWUgPSBpbi5zdWJzdHJpbmcoaW5kZXggKyAxLCBpbi5sZW5ndGgoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9GaWxlU3lzdGVtQ29uZmlndXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9GaWxlU3lzdGVtQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMmEyMmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRmlsZVN5c3RlbUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZXh0ZW5kcyBEZXBsb3ltZW50RW5naW5lIGltcGxlbWVudHMgQXhpc0NvbmZpZ3VyYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRmlsZVN5c3RlbUNvbmZpZ3VyYXRvci5jbGFzcyk7Ci0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2hldGhlciBuZWVkIHRvIGNyZWF0ZSBhIHNlcnZpY2Ugc2lkZSBvciBjbGllbnQgc2lkZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF4aXMyeG1sID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyByZXBvTG9jYXRpb24gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTG9hZCBhbiBBeGlzQ29uZmlndXJhdGlvbiBmcm9tIHRoZSByZXBvc2l0b3J5IGRpcmVjdG9yeSBzcGVjaWZpZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXBvTG9jYXRpb24KLSAgICAgKiBAcGFyYW0gYXhpczJ4bWwKLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihTdHJpbmcgcmVwb0xvY2F0aW9uLCBTdHJpbmcgYXhpczJ4bWwpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAocmVwb0xvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vY2hlY2tpbmcgd2V0aGVyIHVzZXIgaGFzIHNldCB0aGUgc3lzdGVtIHByb3BlcnR5Ci0gICAgICAgICAgICByZXBvTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVMyX1JFUE8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT0ssIHdlJ3ZlIGdvdCBhIHJlcG9zaXRvcnkgbG9jYXRpb24gaW4gbWluZC4gIExldCdzIG1ha2UKLSAgICAgICAgLy8gc3VyZSBpdCBleGlzdHMuCi0gICAgICAgIGlmIChyZXBvTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSByZXBvID0gbmV3IEZpbGUocmVwb0xvY2F0aW9uKTsKLSAgICAgICAgICAgIGlmIChyZXBvLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgLy8gb2ssIHNhdmUgaXQgaWYgc28KLSAgICAgICAgICAgICAgICB0aGlzLnJlcG9Mb2NhdGlvbiA9IHJlcG8uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJDb3VsZG4ndCBmaW5kIHJlcG9zaXRvcnkgbG9jYXRpb24gJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb0xvY2F0aW9uICsgIiciKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDb3VsZG4ndCBmaW5kIHJlcG9zaXRvcnkgbG9jYXRpb24gJyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb0xvY2F0aW9uICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERlYWwgd2l0aCB0aGUgY29uZmlnIGZpbGUuICBJZiBhIGZpbGVuYW1lIHdhcyBzcGVjaWZpZWQgYXMgYW4KLSAgICAgICAgLy8gYXJnIHRvIHRoaXMgY29uc3RydWN0b3IsIGp1c3QgcmVzcGVjdCBpdC4KLSAgICAgICAgaWYgKGF4aXMyeG1sID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIG5vdCwgY2hlY2sgZm9yIGEgc3lzdGVtIHByb3BlcnR5IHNldHRpbmcKLSAgICAgICAgICAgIGF4aXMyeG1sID0gU3lzdGVtLmdldFByb3BlcnR5KENvbnN0YW50cy5BWElTMl9DT05GKTsKLQotICAgICAgICAgICAgLy8gQW5kIGlmIG5vdCB0aGF0LCB0cnkgYXQgdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkgaWYgd2UgaGF2ZSBvbmUuCi0gICAgICAgICAgICAvLyBJdCBtaWdodCBiZSBuaWNlIHRvIGRlZmF1bHQgdGhlIHJlcG9zaXRvcnkgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBidXQgd2UgZG9uJ3QgeWV0Ci0gICAgICAgICAgICBpZiAoYXhpczJ4bWwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXBvTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzMnhtbCA9IHJlcG9Mb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgQ29uc3RhbnRzLkFYSVMyX0NPTkY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJbiBlaXRoZXIgY2FzZSwgY2hlY2sgdGhhdCB0aGUgZmlsZSBleGlzdHMuLi4gaWYgbm90Ci0gICAgICAgICAgICAvLyB3ZSdsbCB1c2UgdGhlIGRlZmF1bHQgYXhpczIueG1sIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgICAgICBpZiAoYXhpczJ4bWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGF4aXMyeG1sKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb25maWcgZmlsZSAnIiArIGF4aXMyeG1sICsgIicgZG9lc24ndCBleGlzdCwgaWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXMyeG1sID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLmF4aXMyeG1sID0gYXhpczJ4bWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlyc3QgY3JlYXRlIGEgRGVwbG95bWVudCBlbmdpbmUsIHVzZSB0aGF0IHRvIGNyZWF0ZSBhbiBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBBeGlzIENvbmZpZ3VyYXRpb24KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQXhpc0NvbmZpZ3VyYXRpb24gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSW5wdXRTdHJlYW0gY29uZmlnU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChheGlzMnhtbCAhPSBudWxsICYmICEiIi5lcXVhbHMoYXhpczJ4bWwpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShheGlzMnhtbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbmZpZ1N0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShEZXBsb3ltZW50Q29uc3RhbnRzLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc0NvbmZpZyA9IHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oY29uZmlnU3RyZWFtKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlN5c3RlbSBjYW4gbm90IGZpbmQgdGhlIGdpdmVuIGF4aXMyLnhtbCAiICsgYXhpczJ4bWwpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYoY29uZmlnU3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjb25maWdTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFBhcmFtZXRlciBheGlzMnJlcG9QYXJhID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoRGVwbG95bWVudENvbnN0YW50cy5BWElTMl9SRVBPKTsKLSAgICAgICAgaWYgKGF4aXMycmVwb1BhcmEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVwb0xvY2F0aW9uID0gKFN0cmluZykgYXhpczJyZXBvUGFyYS5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKHJlcG9Mb2NhdGlvbiA9PSBudWxsIHx8ICIiLmVxdWFscyhyZXBvTG9jYXRpb24pKSkgewotICAgICAgICAgICAgbG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvYWRGcm9tQ2xhc3NQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc0NvbmZpZy5zZXRDb25maWd1cmF0b3IodGhpcyk7Ci0gICAgICAgIHJldHVybiBheGlzQ29uZmlnOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZUdsb2JhbE1vZHVsZXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZW5nYWdlTW9kdWxlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlcygpIHsKLSAgICAgICAgaWYgKCEocmVwb0xvY2F0aW9uID09IG51bGwgfHwgIiIuZXF1YWxzKHJlcG9Mb2NhdGlvbikpKSB7Ci0gICAgICAgICAgICBzdXBlci5sb2FkU2VydmljZXMoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZUJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YTM5Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlcGxveWFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBCdWlsZHMgYSBtb2R1bGUgZGVzY3JpcHRpb24gZnJvbSBPTQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlQnVpbGRlciBleHRlbmRzIERlc2NyaXB0aW9uQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBBeGlzTW9kdWxlIG1vZHVsZTsKLQotICAgIHB1YmxpYyBNb2R1bGVCdWlsZGVyKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwgQXhpc01vZHVsZSBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICBzdXBlcihzZXJ2aWNlSW5wdXRTdHJlYW0sIGF4aXNDb25maWcpOwotICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE1vZHVsZUNsYXNzKEF4aXNNb2R1bGUgbW9kdWxlLCBTdHJpbmcgbW9kdWxlQ2xhc3NOYW1lKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBtb2R1bGVDbGFzczsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKChtb2R1bGVDbGFzc05hbWUgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhtb2R1bGVDbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKG1vZHVsZS5nZXRNb2R1bGVDbGFzc0xvYWRlcigpLCBtb2R1bGVDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGZtb2R1bGVDbGFzcyA9IG1vZHVsZUNsYXNzOwotICAgICAgICAgICAgICAgIGZpbmFsIEF4aXNNb2R1bGUgZm1vZHVsZSA9IG1vZHVsZTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZSBuZXdfbW9kdWxlID0gKE1vZHVsZSkgZm1vZHVsZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1vZHVsZS5zZXRNb2R1bGUobmV3X21vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbGwgaW4gdGhlIEF4aXNNb2R1bGUgSSdtIGhvbGRpbmcgZnJvbSB0aGUgbW9kdWxlLnhtbCBjb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtIHdpdGggdGhlIG1vZHVsZS54bWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZU1vZHVsZSgpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVFbGVtZW50ID0gYnVpbGRPTSgpOwotICAgICAgICAgICAgLy8gU2V0dGluZyBNb2R1bGUgQ2xhc3MgLCBpZiBpdCBpcyB0aGVyZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbW9kdWxlQ2xhc3NBdHQgPSBtb2R1bGVFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgUGFyYW1ldGVycwotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBzZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IG1vZHVsZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIG1vZHVsZSwgbW9kdWxlLmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGVDbGFzc0F0dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1vZHVsZUNsYXNzID0gbW9kdWxlQ2xhc3NBdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmICgobW9kdWxlQ2xhc3MgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhtb2R1bGVDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZE1vZHVsZUNsYXNzKG1vZHVsZSwgbW9kdWxlQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IG91ciBuYW1lIGFuZCB2ZXJzaW9uLiAgSWYgdGhpcyBpcyBOT1QgcHJlc2VudCwgd2UnbGwgdHJ5IHRvIGZpZ3VyZSBpdCBvdXQKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIGZpbGUgbmFtZSAoZS5nLiAiYWRkcmVzc2luZy0xLjAubWFyIikuICBJZiB0aGUgYXR0cmlidXRlIGlzIHRoZXJlLCB3ZQotICAgICAgICAgICAgLy8gYWx3YXlzIHJlc3BlY3QgaXQuCi0gICAgICAgICAgICAvL1RPRE86IE5lZWQgdG8gY2hlY2sgd2hldGhlciB0aHMgbmFtZSBpcyBnZXR0aW5nIG92ZXJyaWRkZW4gYnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgTUFSCi0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBuYW1lQXR0ID0gbW9kdWxlRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKCJuYW1lIikpOwotICAgICAgICAgICAgaWYgKG5hbWVBdHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gbmFtZUF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhtb2R1bGVOYW1lKSl7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5zZXROYW1lKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBzZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICBPTUVsZW1lbnQgZGVzY3JpcHRpb25FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19ERVNDUklQVElPTikpOwotCi0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZGVzY3JpcHRpb25WYWx1ZSA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblZhbHVlLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uVmFsdWUuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0TW9kdWxlRGVzY3JpcHRpb24od3JpdGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRNb2R1bGVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRNb2R1bGVEZXNjcmlwdGlvbigibW9kdWxlIGRlc2NyaXB0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIER5bmFtaWMgUGhhc2UKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBoYXNlSXRyID0gbW9kdWxlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEhBU0UpKTsKLSAgICAgICAgICAgIHByb2Nlc3NNb2R1bGVQaGFzZShwaGFzZUl0cik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNldHRpbmcgdGhlIFBvbGljeUluY2x1ZGUKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyA8d3NwOlBvbGljeT4gLi4gPC8uLj4gZWxlbWVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBvbGljeUVsZW1lbnRzID0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLCBUQUdfUE9MSUNZKSk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeUVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NQb2xpY3lFbGVtZW50cyhwb2xpY3lFbGVtZW50cywgbW9kdWxlLmdldFBvbGljeVN1YmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IC4uIDwvLi4+IGVsZW1lbnRzCi0gICAgICAgICAgICBJdGVyYXRvciBwb2xpY3lSZWZFbGVtZW50cyA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWV9SRUYpKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeVJlZkVsZW1lbnRzICE9IG51bGwgJiYgcG9saWN5RWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljeVJlZkVsZW1lbnRzKHBvbGljeVJlZkVsZW1lbnRzLCBtb2R1bGUuZ2V0UG9saWN5U3ViamVjdCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvY2VzcyBJTkZMT1cKLSAgICAgICAgICAgIE9NRWxlbWVudCBpbkZsb3cgPSBtb2R1bGVFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0ZMT1dfSU4pKTsKLSAgICAgICAgICAgIGlmIChpbkZsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1vZHVsZS5zZXRJbkZsb3cocHJvY2Vzc0Zsb3coaW5GbG93LCBtb2R1bGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IG91dEZsb3cgPSBtb2R1bGVFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0ZMT1dfT1VUKSk7Ci0gICAgICAgICAgICBpZiAob3V0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldE91dEZsb3cocHJvY2Vzc0Zsb3cob3V0RmxvdywgbW9kdWxlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBpbkZhdWx0RmxvdyA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfRkxPV19JTl9GQVVMVCkpOwotICAgICAgICAgICAgaWYgKGluRmF1bHRGbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtb2R1bGUuc2V0RmF1bHRJbkZsb3cocHJvY2Vzc0Zsb3coaW5GYXVsdEZsb3csIG1vZHVsZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgb3V0RmF1bHRGbG93ID0KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRBR19GTE9XX09VVF9GQVVMVCkpOwotICAgICAgICAgICAgaWYgKG91dEZhdWx0RmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldEZhdWx0T3V0Rmxvdyhwcm9jZXNzRmxvdyhvdXRGYXVsdEZsb3csIG1vZHVsZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgc3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfU1VQUE9SVEVEX1BPTElDWV9OQU1FU1BBQ0VTKSk7Ci0gICAgICAgICAgICBpZiAoc3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldFN1cHBvcnRlZFBvbGljeU5hbWVzcGFjZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzU3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyhzdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIE1vZHVsZSBkZXNjcmlwdGlvbiBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgUU5hbWUgb2YgdGhlIGFzc2VydGlvbnMgdGhhdCBhcmUgbG9jYWwgdG8gdGhlIHN5c3RlbS4KLSAgICAgICAgICAgICogVGhlc2UgYXNzZXJ0aW9ucyBhcmUgbm90IGV4cG9zZWQgdG8gdGhlIG91dHNpZGUuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgT01FbGVtZW50IGxvY2FsUG9saWN5QXNzZXJ0aW9uRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgibG9jYWwtcG9saWN5LWFzc2VydGlvbnMiKSk7Ci0gICAgICAgICAgICBpZiAobG9jYWxQb2xpY3lBc3NlcnRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtb2R1bGUuc2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25OYW1lcyhsb2NhbFBvbGljeUFzc2VydGlvbkVsZW1lbnQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBPcGVyYXRpb25zCi0gICAgICAgICAgICBJdGVyYXRvciBvcF9pdHIgPSBtb2R1bGVFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gcHJvY2Vzc09wZXJhdGlvbnMob3BfaXRyKTsKLQotICAgICAgICAgICAgZm9yIChBeGlzT3BlcmF0aW9uIG9wIDogb3BlcmF0aW9ucykgewotICAgICAgICAgICAgICAgIG1vZHVsZS5hZGRPcGVyYXRpb24ob3ApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPiBwcm9jZXNzT3BlcmF0aW9ucyhJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHdoaWxlIChvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb3BlcmF0aW9uID0gKE9NRWxlbWVudCkgb3BlcmF0aW9uc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BfZGVzY3JpcDsKLQotICAgICAgICAgICAgLy9nZXR0aW5nIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgICAgICBTdHJpbmcgb3BuYW1lID0gb3BlcmF0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotCi0gICAgICAgICAgICBpZiAob3BuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX09QLCAib3BlcmF0aW9uIG5hbWUgbWlzc2luZyIpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBtZXBVUkwgPSBvcGVyYXRpb24uZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19NRVApKTsKLQotICAgICAgICAgICAgaWYgKG1lcFVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BfZGVzY3JpcCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wX2Rlc2NyaXAgPSBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihtZXBVUkwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuT1BFUkFUSU9OX1BST0NFU1NfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNGYXVsdC5nZXRNZXNzYWdlKCkpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcF9kZXNjcmlwLnNldE5hbWUobmV3IFFOYW1lKG9wbmFtZSkpOwotCi0gICAgICAgICAgICAvLyBPcGVyYXRpb24gUGFyYW1ldGVycwotICAgICAgICAgICAgSXRlcmF0b3IgcGFyYW1ldGVycyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFSQU1FVEVSKSk7Ci0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBvcF9kZXNjcmlwLCBtb2R1bGUpOwotCi0gICAgICAgICAgICAvL1RvIHByb2Nlc3Mgd3NhbWFwcGluZzsKLSAgICAgICAgICAgIHByb2Nlc3NBY3Rpb25NYXBwaW5ncyhvcGVyYXRpb24sIG9wX2Rlc2NyaXApOwotCi0gICAgICAgICAgICAvLyBzZXR0aW5nIHRoZSBNRVAgb2YgdGhlIG9wZXJhdGlvbgotICAgICAgICAgICAgLy8gbG9hZGluZyB0aGUgbWVzc2FnZSByZWNlaXZlcnMKLSAgICAgICAgICAgIE9NRWxlbWVudCByZWNlaXZlckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfTUVTU0FHRV9SRUNFSVZFUikpOwotCi0gICAgICAgICAgICBpZiAocmVjZWl2ZXJFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRNZXNzYWdlUmVjZWl2ZXIobW9kdWxlLmdldE1vZHVsZUNsYXNzTG9hZGVyKCksIHJlY2VpdmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb3BfZGVzY3JpcC5zZXRNZXNzYWdlUmVjZWl2ZXIobWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXNnUmVjZWl2ZXIgPSBsb2FkRGVmYXVsdE1lc3NhZ2VSZWNlaXZlcihtZXBVUkwsIG51bGwpOwotICAgICAgICAgICAgICAgIG9wX2Rlc2NyaXAuc2V0TWVzc2FnZVJlY2VpdmVyKG1zZ1JlY2VpdmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJvY2VzcyBNb2R1bGUgUmVmcwotICAgICAgICAgICAgSXRlcmF0b3IgbW9kdWxlcyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTU9EVUxFKSk7Ci0gICAgICAgICAgICBwcm9jZXNzT3BlcmF0aW9uTW9kdWxlUmVmcyhtb2R1bGVzLCBvcF9kZXNjcmlwKTsKLSAgICAgICAgICAgIAotLy8gICAgICAgICAgcHJvY2Vzc2luZyA8d3NwOlBvbGljeT4gLi4gPC8uLj4gZWxlbWVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBvbGljeUVsZW1lbnRzID0KLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFBPTElDWV9OU19VUkksIFRBR19QT0xJQ1kpKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeUVsZW1lbnRzICE9IG51bGwgJiYgcG9saWN5RWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljeUVsZW1lbnRzKHBvbGljeUVsZW1lbnRzLCBvcF9kZXNjcmlwLmdldFBvbGljeVN1YmplY3QoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IC4uIDwvLi4+IGVsZW1lbnRzCi0gICAgICAgICAgICBJdGVyYXRvciBwb2xpY3lSZWZFbGVtZW50cyA9Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLCBUQUdfUE9MSUNZX1JFRikpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5UmVmRWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lSZWZFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzUG9saWN5UmVmRWxlbWVudHMocG9saWN5UmVmRWxlbWVudHMsIG1vZHVsZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXR0aW5nIE9wZXJhdGlvbiBwaGFzZQotICAgICAgICAgICAgUGhhc2VzSW5mbyBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluZm8uc2V0T3BlcmF0aW9uUGhhc2VzKG9wX2Rlc2NyaXApOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLQotICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICAgIG9wZXJhdGlvbnMuYWRkKG9wX2Rlc2NyaXApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHByb2Nlc3MgdGhlIHBoYXNlIGxpc3QgYW5kIHRoZW4gYWRkIHRoZSBzcGVjaWZpZWQgcGhhc2VzIHRvCi0gICAgICogb3VyIEF4aXNDb25maWd1cmF0aW9uLiAgVGhlIGZvcm1hdCBvZiBhIHBoYXNlIGVsZW1lbnQgbG9va3MgbGlrZSB0aGlzOgotICAgICAqCi0gICAgICogICZsdDtwaGFzZSBuYW1lPSJGb28iIGFmdGVyPSJBZnRlcl9waGFzZV9OYW1lIiBiZWZvcmU9IkJlZm9yZV9QaGFzZV9OYW1lIgotICAgICAqICBmbG93PSJbSW5GbG93LE91dEZsb3csT3V0RmF1bHRGbG93LEluRmF1bHRGbG93XSIvJmd0OwotICAgICAqCi0gICAgICogIEhlcmUgYmVmCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGhhc2VzIDogT01FbGVtZW50IGl0ZXJhdG9yCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgOiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTW9kdWxlUGhhc2UoSXRlcmF0b3IgcGhhc2VzKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHBoYXNlcyA9PSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChwaGFzZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IChPTUVsZW1lbnQpIHBoYXNlcy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGhhc2VOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoQVRUUklCVVRFX05BTUUpKTsKLQotICAgICAgICAgICAgRGVwbG95YWJsZSBkID0gbmV3IERlcGxveWFibGUocGhhc2VOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBhZnRlciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19BRlRFUikpOwotICAgICAgICAgICAgaWYgKGFmdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgW10gYWZ0ZXJzID0gYWZ0ZXIuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogYWZ0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGQuYWRkUHJlZGVjZXNzb3Iocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGJlZm9yZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKFRBR19CRUZPUkUpKTsKLSAgICAgICAgICAgIGlmIChiZWZvcmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBbXSBiZWZvcmVzID0gYmVmb3JlLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IGJlZm9yZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZC5hZGRTdWNjZXNzb3Iocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGZsb3dOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoImZsb3ciKSk7Ci0gICAgICAgICAgICBpZiAoZmxvd05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJGbG93IGNhbiBub3QgYmUgbnVsbCBmb3IgdGhlIHBoYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGZsb3dzID0gZmxvd05hbWUuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGZsb3cgOiBmbG93cykgewotICAgICAgICAgICAgICAgIGludCBmbG93SW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKFRBR19GTE9XX0lOLmVxdWFsc0lnbm9yZUNhc2UoZmxvdykpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0luZGV4ID0gUGhhc2VNZXRhZGF0YS5JTl9GTE9XOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVEFHX0ZMT1dfT1VULmVxdWFsc0lnbm9yZUNhc2UoZmxvdykpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0luZGV4ID0gUGhhc2VNZXRhZGF0YS5PVVRfRkxPVzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19GTE9XX09VVF9GQVVMVC5lcXVhbHNJZ25vcmVDYXNlKGZsb3cpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb3dJbmRleCA9IFBoYXNlTWV0YWRhdGEuRkFVTFRfT1VUX0ZMT1c7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUQUdfRkxPV19JTl9GQVVMVC5lcXVhbHNJZ25vcmVDYXNlKGZsb3cpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb3dJbmRleCA9IFBoYXNlTWV0YWRhdGEuRkFVTFRfSU5fRkxPVzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigiVW5rbm93biBmbG93IG5hbWUgJyIgKyBmbG93ICsgIiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5pbnNlcnRQaGFzZShkLCBmbG93SW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlRGVwbG95ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZURlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZmFjYTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkFyY2hpdmVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlRGVwbG95ZXIgaW1wbGVtZW50cyBEZXBsb3llciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTW9kdWxlRGVwbG95ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotCi0gICAgcHVibGljIE1vZHVsZURlcGxveWVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBNb2R1bGVEZXBsb3llcihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnKSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLy9UbyBpbml0aWFsaXplIHRoZSBkZXBsb3llcgotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIH0KLSAgICAvL1dpbGwgcHJvY2VzcyB0aGUgZmlsZSBhbmQgYWRkIHRoYXQgdG8gYXhpc0NvbmZpZwotCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHsKLSAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZVN0YXR1cyA9ICIiOwotICAgICAgICBTdHJpbmdXcml0ZXIgZXJyb3JXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuc2V0Q2xhc3NMb2FkZXIoaXNEaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRNb2R1bGVDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAoRmlsZSlheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUikpOwotICAgICAgICAgICAgQXhpc01vZHVsZSBtZXRhRGF0YSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgICAgICBtZXRhRGF0YS5zZXRNb2R1bGVDbGFzc0xvYWRlcihkZXBsb3ltZW50RmlsZURhdGEuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICBtZXRhRGF0YS5zZXRQYXJlbnQoYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICBhcmNoaXZlUmVhZGVyLnJlYWRNb2R1bGVBcmNoaXZlKGRlcGxveW1lbnRGaWxlRGF0YSwgbWV0YURhdGEsIGlzRGlyZWN0b3J5LCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLnRvVVJMKCk7Ci0gICAgICAgICAgICBtZXRhRGF0YS5zZXRGaWxlTmFtZSh1cmwpOwotICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5hZGROZXdNb2R1bGUobWV0YURhdGEsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRFUExPWUlOR19NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhLmdldEFyY2hpdmVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybC50b1N0cmluZygpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcl9wdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBtb2R1bGVTdGF0dXMgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBheGlzRmF1bHQpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBtb2R1bGVTdGF0dXMgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpLAotICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoZXJyb3JfcHRpbnRXcml0ZXIpOwotICAgICAgICAgICAgbW9kdWxlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoZXJyb3JfcHRpbnRXcml0ZXIpOwotICAgICAgICAgICAgbW9kdWxlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobW9kdWxlU3RhdHVzLnN0YXJ0c1dpdGgoIkVycm9yOiIpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5nZXRGYXVsdHlNb2R1bGVzKCkucHV0KERlcGxveW1lbnRFbmdpbmUuZ2V0QXhpc1NlcnZpY2VOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSksIG1vZHVsZVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5EZXBsb3koU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvUE9KT0RlcGxveWVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9QT0pPRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlM2ZlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9QT0pPRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFBPSk9EZXBsb3llciBpbXBsZW1lbnRzIERlcGxveWVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQT0pPRGVwbG95ZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7Ci0KLSAgICAvL1RvIGluaXRpYWxpemUgdGhlIGRlcGxveWVyCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHsKLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7Ci0gICAgfS8vV2lsbCBwcm9jZXNzIHRoZSBmaWxlIGFuZCBhZGQgdGhhdCB0byBheGlzQ29uZmlnCi0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgewotICAgICAgICBDbGFzc0xvYWRlciB0aHJlYWRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gRGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGVFeHRlbnNpb24oZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoImNsYXNzIi5lcXVhbHMoZXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBwYXJlbnRGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0Q2xhc3NMb2FkZXIoY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbUNsYXNzTG9hZGVyKCksIHBhcmVudEZpbGUpOwotCi0gICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiLmNsYXNzIiwgIiIpOwotICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5ERVBMT1lJTkdfUE9KTywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogU2NoZW1hIGdlbmVydGFpb24gZG9uZSBpbiB0d28gc3RhZ2UgMS4gTG9hZCBhbGwgdGhlIG1ldGhvZHMgYW5kCi0gICAgICAgICAgICAgICAgICogY3JlYXRlIHR5cGUgZm9yIG1ldGhvZHMgcGFyYW1ldGVycyAoaWYgdGhlIHBhcmFtZXRlcnMgYXJlIEJlYW4KLSAgICAgICAgICAgICAgICAgKiB0aGVuIGl0IHdpbGwgY3JlYXRlIENvbXBsZXggdHlwZXMgZm9yIHRob3NlICwgYW5kIGlmIHRoZQotICAgICAgICAgICAgICAgICAqIHBhcmFtZXRlcnMgYXJlIHNpbXBsZSB0eXBlIHdoaWNoIGRlY3JpYmUgaW4gU2ltcGxlVHlwZVRhYmxlCi0gICAgICAgICAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcwotICAgICAgICAgICAgICAgICAqIG1lc3NhZ2VzIGFuZCBwb3J0IHR5cGVzIHdpbGwgYmUgY3JldGVhdGVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZSBhbm5vdGF0aW9uID0gKFdlYlNlcnZpY2UpIGNsYXp6LmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc2VlIHdoZXRoZXIgSkFYLVdTIGphcnMgaW4gdGhlIGNsYXNzIHBhdGggLCBpZiBzbyB1c2UgdGhlbQotICAgICAgICAgICAgICAgICAgICAvLyB0byBwcm9jZXNzIGFubm90YXRlZCBwb2pvIGVsc2UgdXNlIGFubm9nZW4gdG8gcHJvY2VzcyB0aGUgcG9qbyBjbGFzcwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlKGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlVXNpbmdBbm5vZ2VuKGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCJqYXIiLmVxdWFscyhleHRlbnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGNsYXNzTGlzdDsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbnVsbDsKLSAgICAgICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVwbG95bWVudEZpbGVEYXRhLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgemluID0gbmV3IFppcElucHV0U3RyZWFtKGZpbik7Ci0gICAgICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgICAgICBjbGFzc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMaXN0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5ERVBMT1lJTkdfRVhDRVBUSU9OLGUuZ2V0TWVzc2FnZSgpKSxlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZmluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBheGlzU2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYUNsYXNzTGlzdCA6IGNsYXNzTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZylhQ2xhc3NMaXN0OwotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQoY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UmVwb3NpdG9yeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdlYkxvY2F0aW9uID0gRGVwbG95bWVudEVuZ2luZS5nZXRXZWJMb2NhdGlvblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5hZGQobmV3IEZpbGUod2ViTG9jYXRpb24pLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZpbGUpY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiLmNsYXNzIiwgIiIpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZUFsbCgiLyIsICIuIik7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBTY2hlbWEgZ2VuZXJhdGlvbiBkb25lIGluIHR3byBzdGFnZSAxLiBMb2FkIGFsbCB0aGUgbWV0aG9kcyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICogY3JlYXRlIHR5cGUgZm9yIG1ldGhvZHMgcGFyYW1ldGVycyAoaWYgdGhlIHBhcmFtZXRlcnMgYXJlIEJlYW4KLSAgICAgICAgICAgICAgICAgICAgICogdGhlbiBpdCB3aWxsIGNyZWF0ZSBDb21wbGV4IHR5cGVzIGZvciB0aG9zZSAsIGFuZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogcGFyYW1ldGVycyBhcmUgc2ltcGxlIHR5cGUgd2hpY2ggZGVjcmliZSBpbiBTaW1wbGVUeXBlVGFibGUKLSAgICAgICAgICAgICAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcwotICAgICAgICAgICAgICAgICAgICAgKiBtZXNzYWdlcyBhbmQgcG9ydCB0eXBlcyB3aWxsIGJlIGNyZXRlYXRlZAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZSBhbm5vdGF0aW9uID0gKFdlYlNlcnZpY2UpY2xhenouZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUF4aXNTZXJ2aWNlKGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUxpc3QuYWRkKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZUxpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBhbkF4aXNTZXJ2aWNlTGlzdCA6IGF4aXNTZXJ2aWNlTGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpYW5BeGlzU2VydmljZUxpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvcjpcbiBObyBhbm5vdGF0ZWQgY2xhc3NlcyBmb3VuZCBpbiB0aGUgamFyOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4gU2VydmljZSBkZXBsb3ltZW50IGZhaWxlZC4iOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0RmF1bHR5U2VydmljZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwgbXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNUT1JJTkdfRkFVTFRZX1NFUlZJQ0UsZS5nZXRNZXNzYWdlKCkpLGUpOwotICAgICAgICAgICAgc3RvcmVGYXVsdHlTZXJ2aWNlKGRlcGxveW1lbnRGaWxlRGF0YSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNUT1JJTkdfRkFVTFRZX1NFUlZJQ0UsdC5nZXRNZXNzYWdlKCkpLHQpOwotICAgICAgICAgICAgc3RvcmVGYXVsdHlTZXJ2aWNlKGRlcGxveW1lbnRGaWxlRGF0YSwgdCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodGhyZWFkQ2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZENsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9yZUZhdWx0eVNlcnZpY2UoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIGVycm9yV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBQcmludFdyaXRlciBwdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB0aW50V3JpdGVyKTsKLSAgICAgICAgU3RyaW5nIGVycm9yID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEZhdWx0eVNlcnZpY2VzKCkuCi0gICAgICAgICAgICAgICAgcHV0KGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIGVycm9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24pIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgICAgICAgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXh4ID0gQ2xhc3MuZm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Iik7Ci0gICAgICAgICAgICBNZXRob2QgbXRob2QgPSBjbGF4eC5nZXRNZXRob2QoImNyZWF0ZUF4aXNTZXJ2aWNlIiwgQ2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgQ2xhc3MgcG9qb0NsYXNzID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBtdGhvZC5pbnZva2UoY2xheHgsIHBvam9DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBqYXh3c01SID0gTG9hZGVyLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5KQVhXU01lc3NhZ2VSZWNlaXZlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBqYXh3c01SSW5zdGFuY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgamF4d3NNUi5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKGpheHdzTVJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXJyb3Igb2NjdXJkZSB3aGlsZSBsb2FkaW5nIEpBWFdTTWVzc2FnZVJlY2VpdmVyIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzTmFtZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RWxlbWVudEZvcm1EZWZhdWx0KGZhbHNlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEZpbGVOYW1lKHNlcnZpY2VMb2NhdGlvbik7Ci0gICAgICAgICAgICBVdGlscy5maWxsQXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0KCksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgICAgICAvL05vdCBuZWVkZWQgYXQgdGhpcyBjYXNlLCB0aGUgbWVzc2FnZSByZWNlaXZlcnMgYWx3YXlzIHNldCB0byBSUEMgaWYgdGhpcyBleGVjdXRlcwotICAgICAgICAgICAgLy9zZXRNZXNzYWdlUmVjZWl2ZXJzKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gU2VlbXMgbGlrZSB0aGUgamF4LXdzIGphcnMgbWlzc2luZyBpbiB0aGUgY2xhc3MgcGF0aCAuCi0gICAgICAgICAgICAvLyBsZXRzIHRyeSB3aXRoIGFubm9nZW4KLSAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5KQVhXU19KQVJTX01JU1NJTkcsZS5nZXRNZXNzYWdlKCkpLGUpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBjcmVhdGVBeGlzU2VydmljZVVzaW5nQW5ub2dlbihjbGFzc05hbWUsIGNsYXNzTG9hZGVyLCBzZXJ2aWNlTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlVXNpbmdBbm5vZ2VuKFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBzZXJ2aWNlTG9jYXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFzaE1hcCBtZXNzYWdlUmVjaXZlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIENsYXNzIGluT25seU1lc3NhZ2VSZWNlaXZlciA9IExvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiKTsKLSAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgaW5Pbmx5TWVzc2FnZVJlY2VpdmVyLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgQ2xhc3MgaW5vdXRNZXNzYWdlUmVjZWl2ZXIgPSBMb2FkZXIubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciBpbk91dG1lc3NhZ2VSZWNlaXZlciA9Ci0gICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgaW5vdXRNZXNzYWdlUmVjZWl2ZXIubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgIGluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0gICAgICAgICAgICAgICAgaW5PdXRtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UuY3JlYXRlU2VydmljZShjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RmlsZU5hbWUoc2VydmljZUxvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VSZWNlaXZlcnMoQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgTUVQID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIGlmIChNRVAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKE1FUCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGluT25seU1lc3NhZ2VSZWNlaXZlciA9IExvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VSZWNlaXZlcikgaW5Pbmx5TWVzc2FnZVJlY2VpdmVyLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbm91dE1lc3NhZ2VSZWNlaXZlciA9IExvYWRlci5sb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgaW5PdXRtZXNzYWdlUmVjZWl2ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZVJlY2VpdmVyKSBpbm91dE1lc3NhZ2VSZWNlaXZlci5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihpbk91dG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdW5EZXBsb3koU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIGZpbGVOYW1lID0gVXRpbHMuZ2V0U2hvcnRGaWxlTmFtZShmaWxlTmFtZSk7Ci0gICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBmaWxlTmFtZS5yZXBsYWNlQWxsKCIuY2xhc3MiLCAiIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnJlbW92ZVNlcnZpY2VHcm91cChjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5yZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNFUlZJQ0VfUkVNT1ZFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy9NYXkgYmUgYSBmYXVsdHkgc2VydmljZQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRkFVTFRZX1NFUlZJQ0VfUkVNT1ZBTCxheGlzRmF1bHQuZ2V0TWVzc2FnZSgpKSxheGlzRmF1bHQpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLnJlbW92ZUZhdWx0eVNlcnZpY2UoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkucmVtb3ZlU2VydmljZUdyb3VwKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHgucmVtb3ZlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX1JFTU9WRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgZmF1bHR5IHNlcnZpY2UKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkZBVUxUWV9TRVJWSUNFX1JFTU9WQUwsYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSksYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5yZW1vdmVGYXVsdHlTZXJ2aWNlKGZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNGVmNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5XU0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5XU0luZm9MaXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5TGlzdGVuZXIgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZXBvc2l0b3J5TGlzdGVuZXIuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIERlcGxveW1lbnRFbmdpbmUgZGVwbG95bWVudEVuZ2luZTsKLQotICAgIC8qKiBSZWZlcmVuY2UgdG8gYSBXU0luZm9MaXN0ICovCi0gICAgcHJvdGVjdGVkIFdTSW5mb0xpc3Qgd3NJbmZvTGlzdDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY29uc3RydWN0b3IgdGFrZXMgdHdvIGFyZ3VtZW50cywgYSBmb2xkZXIgbmFtZSBhbmQgYSByZWZlcmVuY2UgdG8gRGVwbG95bWVudCBFbmdpbmUKLSAgICAgKiBGaXJzdCwgaXQgaW5pdGlhbGl6ZXMgdGhlIHN5c3RlbSwgYnkgbG9hZGluZyBhbGwgdGhlIG1vZHVsZXMgaW4gdGhlIC9tb2R1bGVzIGRpcmVjdG9yeSBhbmQKLSAgICAgKiB0aGVuIGNyZWF0ZXMgYSBXU0luZm9MaXN0IHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBtb2R1bGVzIGFuZCBzZXJ2aWNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXBsb3ltZW50RW5naW5lIHJlZmVyZW5jZSB0byBlbmdpbmUgcmVnaXN0cnkgZm9yIHVwZGF0ZXMKLSAgICAgKiBAcGFyYW0gaXNDbGFzc3BhdGggICAgICB0cnVlIGlmIHRoaXMgUmVwb3NpdG9yeUxpc3RlbmVyIHNob3VsZCBzY2FuIHRoZSBjbGFzc3BhdGggZm9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlcwotICAgICAqLwotICAgIHB1YmxpYyBSZXBvc2l0b3J5TGlzdGVuZXIoRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lLCBib29sZWFuIGlzQ2xhc3NwYXRoKSB7Ci0gICAgICAgIHRoaXMuZGVwbG95bWVudEVuZ2luZSA9IGRlcGxveW1lbnRFbmdpbmU7Ci0gICAgICAgIHdzSW5mb0xpc3QgPSBuZXcgV1NJbmZvTGlzdChkZXBsb3ltZW50RW5naW5lKTsKLSAgICAgICAgaW5pdDIoaXNDbGFzc3BhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQyKGJvb2xlYW4gaXNDbGFzc3BhdGgpIHsKLSAgICAgICAgaWYgKCFpc0NsYXNzcGF0aCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGxvYWRDbGFzc1BhdGhNb2R1bGVzKCk7Ci0gICAgfQotCi0gICAgLyoqIEZpbmRzIGEgbGlzdCBvZiBtb2R1bGVzIGluIHRoZSBmb2xkZXIgYW5kIGFkZHMgdG8gd3NJbmZvTGlzdC4gKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja01vZHVsZXMoKSB7Ci0gICAgICAgIEZpbGUgcm9vdCA9IGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlc0RpcigpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotCi0gICAgICAgIGlmIChmaWxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGlzU291cmNlQ29udHJvbERpcihmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlcGxveW1lbnRGaWxlRGF0YS5pc01vZHVsZUFyY2hpdmVGaWxlKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvRGVwbG95KGZpbGUsIGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlRGVwbG95ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0luZm8uVFlQRV9NT0RVTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEibGliIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvRGVwbG95KGZpbGUsIGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlRGVwbG95ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0luZm8uVFlQRV9NT0RVTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NvdXJjZUNvbnRyb2xEaXIoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDVlMiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIi5zdm4iKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkQ2xhc3NQYXRoTW9kdWxlcygpIHsKLSAgICAgICAgTW9kdWxlRGVwbG95ZXIgZGVwbG95ZXIgPSBkZXBsb3ltZW50RW5naW5lLmdldE1vZHVsZURlcGxveWVyKCk7Ci0KLSAgICAgICAgLy8gRmluZCBNb2R1bGVzIG9uIHRoZSBjbGFzcyBwYXRoIChpLmUuIGlmIGNsYXNzcGF0aCBpbmNsdWRlcyAiYWRkcmVzc2luZy5tYXIiIHRoZW4KLSAgICAgICAgLy8gYWRkcmVzc2luZyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgZW5nYWdpbmcpCi0KLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIG1vZHVsZVVSTHMgPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKCJNRVRBLUlORi9tb2R1bGUueG1sIik7Ci0gICAgICAgICAgICB3aGlsZSAobW9kdWxlVVJMcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKW1vZHVsZVVSTHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgVVJJIG1vZHVsZVVSSTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsU3RyaW5nID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVVUkkgPSBuZXcgVVJJKHVybFN0cmluZy5zdWJzdHJpbmcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3RyaW5nLmxhc3RJbmRleE9mKCIvTUVUQS1JTkYvbW9kdWxlLnhtbCIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgVVJMIHJlZmVycyB0byBhbiBhcmNoaXZlIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXI6ZmlsZTovZGlyL3NvbWUuamFyIS9NRVRBLUlORi9tb2R1bGUueG1sKSBhbmQgZXh0cmFjdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVSTCBvZiB0aGUgYXJjaGl2ZS4gSW4gZ2VuZXJhbCB0aGUgcHJvdG9jb2wgd2lsbCBiZSAiamFyIiwgYnV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21lIGNvbnRhaW5lcnMgbWF5IHVzZSBvdGhlciBwcm90b2NvbHMsIGUuZy4gV2ViU3BoZXJlIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICJ3c2phciIgKEFYSVMyLTQyNTgpLgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHBhdGgubGFzdEluZGV4T2YoIiEvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IC0xICYmIHBhdGguc3Vic3RyaW5nKGlkeCsyKS5lcXVhbHMoIk1FVEEtSU5GL21vZHVsZS54bWwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVVSSSA9IG5ldyBVUkkocGF0aC5zdWJzdHJpbmcoMCwgaWR4KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2R1bGVVUkkuZ2V0U2NoZW1lKCkuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlcGxveWluZyBtb2R1bGUgZnJvbSBjbGFzc3BhdGggYXQgJyIgKyBtb2R1bGVVUkkgKyAiJyIpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShtb2R1bGVVUkkpOwotICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9EZXBsb3koZiwgZGVwbG95ZXIsIFdTSW5mby5UWVBFX01PRFVMRSk7Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBPaCB3ZWxsLCBsb2cgdGhlIHByb2JsZW0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBjbGFzc1BhdGggPSBnZXRMb2NhdGlvbigpOwotCi0gICAgICAgIGlmIChjbGFzc1BhdGggPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGludCBsc3RpbmRleCA9IGNsYXNzUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICBpZiAobHN0aW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBjbGFzc1BhdGggPSBjbGFzc1BhdGguc3Vic3RyaW5nKDAsIGxzdGluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzUGF0aCA9ICIuIjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHJvb3QgPSBuZXcgRmlsZShjbGFzc1BhdGgpOwotICAgICAgICBGaWxlW10gZmlsZXMgPSByb290Lmxpc3RGaWxlcygpOwotICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEZXBsb3ltZW50RmlsZURhdGEuaXNNb2R1bGVBcmNoaXZlRmlsZShmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkaW5nIG1vZHVsZXMgaW4gdGhlIGNsYXNzIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0RlcGxveShmaWxlLCBkZXBsb3llciwgV1NJbmZvLlRZUEVfTU9EVUxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gZGVwbG95bWVudEVuZ2luZS5nZXRBeGlzQ29uZmlnKCkuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgd2hpbGUgKGNsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbCBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7Ci0gICAgICAgICAgICAgICAgVVJMW10gdXJscyA9ICgoVVJMQ2xhc3NMb2FkZXIpY2wpLmdldFVSTHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgKHVybHMgIT0gbnVsbCkgJiYgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmxzW2ldLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9JZiBpdCBpcyBhIGRyaXZlIGxldHRlciwgYWRqdXN0IGFjY29yZGluZ2x5LgotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+PSAzICYmIHBhdGguY2hhckF0KDApID09ICcvJyAmJiBwYXRoLmNoYXJBdCgyKSA9PSAnOicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKHBhdGgsIFV0aWxzLmRlZmF1bHRFbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIHRoaXM/Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCd8JywgJzonKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGVwbG95bWVudEZpbGVEYXRhLmlzTW9kdWxlQXJjaGl2ZUZpbGUoZmlsZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hZGRpbmcgbW9kdWxlcyBpbiB0aGUgY2xhc3MgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0RlcGxveShmaWxlLCBkZXBsb3llciwgV1NJbmZvLlRZUEVfTU9EVUxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsID0gY2wuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXBsb3ltZW50RW5naW5lLmRvRGVwbG95KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQXhpczIuamFyIGZyb20gdGhhdCBJIGNhbiBkcml2ZSB0aGUgbG9jYXRpb24gb2YgY2xhc3MgcGF0aAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgKGxvY2F0aW9uIG9mIHRoZSBheGlzMiBqYXIpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gTG9hZGVyLmxvYWRDbGFzcygib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZSIpOwotICAgICAgICAgICAgamF2YS5uZXQuVVJMIHVybCA9IGNsYXp6LmdldFByb3RlY3Rpb25Eb21haW4oKS5nZXRDb2RlU291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoImphciIpKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gKChqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uKXVybC5vcGVuQ29ubmVjdGlvbigpKS5nZXRKYXJGaWxlVVJMKCk7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBVdGlscy50b0ZpbGUodXJsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRmluZHMgYSBsaXN0IG9mIHNlcnZpY2VzIGluIHRoZSBmb2xkZXIgYW5kIGFkZHMgdG8gd3NJbmZvTGlzdC4gKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1NlcnZpY2VzKCkgewotICAgICAgICBmaW5kU2VydmljZXNJbkRpcmVjdG9yeSgpOwotICAgICAgICBsb2FkT3RoZXJEaXJlY3RvcmllcygpOwotICAgICAgICB1cGRhdGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaXJzdCBpbml0aWFsaXplcyB0aGUgV1NJbmZvTGlzdCwgdGhlbiBjYWxscyBjaGVja01vZHVsZSB0byBsb2FkIGFsbCB0aGUgbW9kdWxlcyBhbmQgY2FsbHMKLSAgICAgKiB1cGRhdGUoKSB0byB1cGRhdGUgdGhlIERlcGxveW1lbnQgZW5naW5lIGFuZCBlbmdpbmUgcmVnaXN0cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgd3NJbmZvTGlzdC5pbml0KCk7Ci0gICAgICAgIGNoZWNrTW9kdWxlcygpOwotICAgICAgICBkZXBsb3ltZW50RW5naW5lLmRvRGVwbG95KCk7Ci0gICAgfQotCi0gICAgLy9UaGlzIHdpbGwgbG9hZCB0aGUgZmlsZXMgZnJvbSB0aGUgZGlyZWN0b3JpZXMKLSAgICAvLyBzcGVjaWZpZWQgYnkgYXhpczIueG1sIChBcyA8ZGVwbG95ZXI+KQotICAgIHByaXZhdGUgdm9pZCBsb2FkT3RoZXJEaXJlY3RvcmllcygpIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLCBEZXBsb3llcj4+IGVudHJ5IDogZGVwbG95bWVudEVuZ2luZS5nZXREZXBsb3llcnMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZGlyZWN0b3J5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBEZXBsb3llcj4gZXh0ZW5zaW9uTWFwID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4dGVuc2lvbiA6IGV4dGVuc2lvbk1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIGZpbmRGaWxlRm9yR2l2ZW5EaXJlY3RvcnkoZGlyZWN0b3J5LCBleHRlbnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRGaWxlRm9yR2l2ZW5EaXJlY3RvcnkoU3RyaW5nIGRpciwgU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBkZXBsb3ltZW50RW5naW5lLmdldFJlcG9zaXRvcnlEaXIoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBkaXIuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgc3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkaXJlY3RvcnkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NvdXJjZUNvbnRyb2xEaXIoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24uZXF1YWxzKERlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlRXh0ZW5zaW9uKGZpbGUuZ2V0TmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9EZXBsb3koZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEVuZ2luZS5nZXREZXBsb3llcihkaXIsIGV4dGVuc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTSW5mby5UWVBFX0NVU1RPTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL25lZWQgdG8gbG9nIHRoZSBleGNlcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZWFyY2hlcyBhIGdpdmVuIGZvbGRlciBmb3IgamFyIGZpbGVzIGFuZCBhZGRzIHRoZW0gdG8gYSBsaXN0IGluIHRoZSBXU0luZm9saXN0IGNsYXNzLiAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmRTZXJ2aWNlc0luRGlyZWN0b3J5KCkgewotICAgICAgICBGaWxlIHJvb3QgPSBkZXBsb3ltZW50RW5naW5lLmdldFNlcnZpY2VzRGlyKCk7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChpc1NvdXJjZUNvbnRyb2xEaXIoZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEZXBsb3ltZW50RmlsZURhdGEuaXNTZXJ2aWNlQXJjaGl2ZUZpbGUoZmlsZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9EZXBsb3koZmlsZSwgZGVwbG95bWVudEVuZ2luZS5nZXRTZXJ2aWNlRGVwbG95ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0luZm8uVFlQRV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSBEZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZUV4dGVuc2lvbihmaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3llciBkZXBsb3llciA9IGRlcGxveW1lbnRFbmdpbmUuZ2V0RGVwbG95ZXJGb3JFeHRlbnNpb24oZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgZGVwbG95ZXIgZm9yIHRoaXMgdHlwZSBvZiBmaWxlLCB1c2UgaXQuICBPdGhlcndpc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBsb3llciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmlsZVRvRGVwbG95KGZpbGUsIGRlcGxveWVyLCBXU0luZm8uVFlQRV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghImxpYiIuZXF1YWxzSWdub3JlQ2FzZShmaWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0RlcGxveShmaWxlLCBkZXBsb3ltZW50RW5naW5lLmdldFNlcnZpY2VEZXBsb3llcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTSW5mby5UWVBFX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIE1ldGhvZCBpbnZva2VkIGZyb20gdGhlIHNjaGVkdWxlciB0byBzdGFydCB0aGUgbGlzdGVuZXIuICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5lcigpIHsKLSAgICAgICAgY2hlY2tTZXJ2aWNlcygpOwotLy8gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIC8qKiBVcGRhdGVzIFdTSW5mb0xpc3Qgb2JqZWN0LiAqLwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgd3NJbmZvTGlzdC51cGRhdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVSZW1vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluZFNlcnZpY2VzSW5EaXJlY3RvcnkoKTsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZVRvRGVwbG95KEZpbGUgZmlsZSwgRGVwbG95ZXIgZGVwbG95ZXIsIGludCB0eXBlKSB7Ci0gICAgICAgIHdzSW5mb0xpc3QuYWRkV1NJbmZvSXRlbShmaWxlLCBkZXBsb3llciwgdHlwZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZWI5NWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5QaGFzZXNJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk1vZHVsZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5UeXBlVGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlNlcnZpY2VMaWZlQ3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEJ1aWxkcyBhIHNlcnZpY2UgZGVzY3JpcHRpb24gZnJvbSBPTQotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUJ1aWxkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkJ1aWxkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlQnVpbGRlci5jbGFzcyk7Ci0JcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCXByaXZhdGUgSGFzaE1hcCB3c2RsU2VydmljZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgU2VydmljZUJ1aWxkZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4OwotCQl0aGlzLmF4aXNDb25maWcgPSB0aGlzLmNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBTZXJ2aWNlQnVpbGRlcihJbnB1dFN0cmVhbSBzZXJ2aWNlSW5wdXRTdHJlYW0sCi0JCQlDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoc2VydmljZUlucHV0U3RyZWFtLCBjb25maWdDdHgpOwotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBzZXJ2aWNlIGZyb20gY29ycmVzcG9uZGluZyBPTS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmljZV9lbGVtZW50Ci0JICogICAgICAgICAgICBhbiBPTUVsZW1lbnQgZm9yIHRoZSAmbHQ7c2VydmljZSZndDsgdGFnCi0JICogQHJldHVybiBhIGZpbGxlZC1pbiBBeGlzU2VydmljZSwgY29uZmlndXJlZCBmcm9tIHRoZSBwYXNzZWQgWE1MCi0JICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0JICovCi0JcHVibGljIEF4aXNTZXJ2aWNlIHBvcHVsYXRlU2VydmljZShPTUVsZW1lbnQgc2VydmljZV9lbGVtZW50KQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gRGV0ZXJtaW5lIHdoZXRoZXIgc2VydmljZSBzaG91bGQgYmUgYWN0aXZhdGVkLgotCQkJU3RyaW5nIHNlcnZpY2VBY3RpdmF0ZSA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKEFUVFJJQlVURV9BQ1RJVkFURSkpOwotCQkJaWYgKHNlcnZpY2VBY3RpdmF0ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKCJ0cnVlIi5lcXVhbHMoc2VydmljZUFjdGl2YXRlKSkgewotCQkJCQlzZXJ2aWNlLnNldEFjdGl2ZSh0cnVlKTsKLQkJCQl9IGVsc2UgaWYgKCJmYWxzZSIuZXF1YWxzKHNlcnZpY2VBY3RpdmF0ZSkpIHsKLQkJCQkJc2VydmljZS5zZXRBY3RpdmUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUHJvY2Vzc2luZyBzZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnMKLQkJCU9NQXR0cmlidXRlIHNlcnZpY2VOYW1lYXR0ID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0KLQkJCS8vIElmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gdGhlIHNlcnZpY2VzLnhtbAotCQkJLy8gdGhlbiB1c2UgdGhhdCBhcyB0aGUgc2VydmljZSBuYW1lCi0JCQlpZiAoc2VydmljZU5hbWVhdHQgIT0gbnVsbCkgewotCQkJCWlmICghIiIuZXF1YWxzKHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkudHJpbSgpKSkgewotCQkJCQlBeGlzU2VydmljZSB3c2RsU2VydmljZSA9IChBeGlzU2VydmljZSkgd3NkbFNlcnZpY2VNYXAKLQkJCQkJCQkuZ2V0KHNlcnZpY2VOYW1lYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCkpOwotCQkJCQlpZiAod3NkbFNlcnZpY2UgIT0gbnVsbCkgewotCQkJCQkJd3NkbFNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoc2VydmljZS5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCQkJCXdzZGxTZXJ2aWNlLnNldFBhcmVudChzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0JCQkJCQlzZXJ2aWNlID0gd3NkbFNlcnZpY2U7Ci0JCQkJCQlzZXJ2aWNlLnNldFdzZGxGb3VuZCh0cnVlKTsKLQkJCQkJCXNlcnZpY2Uuc2V0Q3VzdG9tV3NkbCh0cnVlKTsKLQkJCQkJfQotCQkJCQlzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQkJCS8vIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUKLQkJCQkJaWYgKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbigpID09IG51bGwpIHsKLQkJCQkJCXNlcnZpY2Uuc2V0RG9jdW1lbnRhdGlvbihzZXJ2aWNlTmFtZWF0dAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUl0ZXJhdG9yIGl0ciA9IHNlcnZpY2VfZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBUkFNRVRFUikpOwotCQkJcHJvY2Vzc1BhcmFtZXRlcnMoaXRyLCBzZXJ2aWNlLCBzZXJ2aWNlLmdldFBhcmVudCgpKTsKLQotCQkJLy8gSWYgbXVsdGlwbGUgc2VydmljZXMgaW4gb25lIHNlcnZpY2UgZ3JvdXAgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzCi0JCQkvLyBmb3IgdGhlIFBBUkVOVF9GSVJTVAotCQkJLy8gcGFyYW1ldGVyIHRoZW4gdGhlIGZpbmFsIHZhbHVlIGJlY29tZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZQotCQkJLy8gbGFzdCBzZXJ2aWNlIGluIHRoZSBncm91cAotCQkJLy8gUGFyYW1ldGVyIHBhcmFtZXRlciA9Ci0JCQkvLyBzZXJ2aWNlLmdldFBhcmFtZXRlcihEZXBsb3ltZW50Q2xhc3NMb2FkZXIuUEFSRU5UX0ZJUlNUKTsKLQkJCS8vIGlmIChwYXJhbWV0ZXIgIT1udWxsICYmICJmYWxzZSIuZXF1YWxzKHBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotCQkJLy8gQ2xhc3NMb2FkZXIgc2VydmljZUNsYXNzTG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotCQkJLy8gKChEZXBsb3ltZW50Q2xhc3NMb2FkZXIpc2VydmljZUNsYXNzTG9hZGVyKS5zZXRQYXJlbnRGaXJzdChmYWxzZSk7Ci0JCQkvLyB9Ci0JCQkvLyBwcm9jZXNzIHNlcnZpY2UgZGVzY3JpcHRpb24KLQkJCU9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0RFU0NSSVBUSU9OKSk7Ci0JCQlpZiAoZGVzY3JpcHRpb25FbGVtZW50ICE9IG51bGwpIHsKLQkJCQlPTUVsZW1lbnQgZGVzY3JpcHRpb25WYWx1ZSA9IGRlc2NyaXB0aW9uRWxlbWVudAotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChkZXNjcmlwdGlvblZhbHVlICE9IG51bGwpIHsKLQkJCQkJc2VydmljZS5zZXREb2N1bWVudGF0aW9uKGRlc2NyaXB0aW9uVmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlcnZpY2Uuc2V0RG9jdW1lbnRhdGlvbihkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNlcnZpY2VOYW1lYXR0ID0gc2VydmljZV9lbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoCi0JCQkJCQlBVFRSSUJVVEVfTkFNRSkpOwotCi0JCQkJaWYgKHNlcnZpY2VOYW1lYXR0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCEiIi5lcXVhbHMoc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKS50cmltKCkpCi0JCQkJCQkJJiYgc2VydmljZS5nZXREb2N1bWVudGF0aW9uKCkgPT0gbnVsbCkgewotCQkJCQkJc2VydmljZS5zZXREb2N1bWVudGF0aW9uKHNlcnZpY2VOYW1lYXR0Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHNlcnZpY2UuZ2V0UGFyYW1ldGVyKCJTZXJ2aWNlQ2xhc3MiKSA9PSBudWxsKSB7Ci0JCQkJbG9nLmRlYnVnKCJUaGUgU2VydmljZSAiICsgc2VydmljZS5nZXROYW1lKCkKLQkJCQkJCSsgIiBkb2VzIG5vdCBzcGVjaWZ5IGEgU2VydmljZSBDbGFzcyIpOwotCQkJfQotCi0JCQkvLyBQcm9jZXNzIFdTLUFkZHJlc3NpbmcgZmxhZyBhdHRyaWJ1dGUKLQkJCU9NQXR0cmlidXRlIGFkZHJlc3NpbmdSZXF1aXJlZGF0dCA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfV1NBRERSRVNTSU5HKSk7Ci0JCQlpZiAoYWRkcmVzc2luZ1JlcXVpcmVkYXR0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nID0gYWRkcmVzc2luZ1JlcXVpcmVkYXR0Ci0JCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQlBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKAotCQkJCQkJc2VydmljZSwgYWRkcmVzc2luZ1JlcXVpcmVkU3RyaW5nKTsKLQkJCX0KLQotCQkJLy8gU2V0dGluZyBzZXJ2aWNlIHRhcmdldCBuYW1lc3BhY2UgaWYgYW55Ci0JCQlPTUF0dHJpYnV0ZSB0YXJnZXROYW1lU3BhY2UgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFSR0VUX05BTUVfU1BBQ0UpKTsKLQotCQkJaWYgKHRhcmdldE5hbWVTcGFjZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWVTcGVjZVZhbGUgPSB0YXJnZXROYW1lU3BhY2UuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQlpZiAobmFtZVNwZWNlVmFsZSAhPSBudWxsICYmICEiIi5lcXVhbHMobmFtZVNwZWNlVmFsZSkpIHsKLQkJCQkJc2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2UobmFtZVNwZWNlVmFsZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsCi0JCQkJCQl8fCAiIi5lcXVhbHMoc2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJc2VydmljZQotCQkJCQkJCS5zZXRUYXJnZXROYW1lc3BhY2UoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGlmZWN5Y2xlIGF0dHJpYnV0ZQotCQkJT01BdHRyaWJ1dGUgc2VydmljZUxpZmVDeWNsZUNsYXNzID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19DTEFTU19OQU1FKSk7Ci0JCQlpZiAoc2VydmljZUxpZmVDeWNsZUNsYXNzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VydmljZUxpZmVDeWNsZUNsYXNzLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJbG9hZFNlcnZpY2VMaWZlQ3ljbGVDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQkJLy8gU2V0dGluZyBzY2hlbWEgbmFtZXNwZWNlIGlmIGFueQotCQkJT01FbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoU0NIRU1BKSk7Ci0JCQlpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJT01BdHRyaWJ1dGUgc2NoZW1hTmFtZVNwYWNlID0gc2NoZW1hRWxlbWVudAotCQkJCQkJLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoU0NIRU1BX05BTUVfU1BBQ0UpKTsKLQkJCQlpZiAoc2NoZW1hTmFtZVNwYWNlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWVTcGVjZVZhbGUgPSBzY2hlbWFOYW1lU3BhY2UuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQkJaWYgKG5hbWVTcGVjZVZhbGUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKG5hbWVTcGVjZVZhbGUpKSB7Ci0JCQkJCQlzZXJ2aWNlLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShuYW1lU3BlY2VWYWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlPTUF0dHJpYnV0ZSBlbGVtZW50Rm9ybURlZmF1bHQgPSBzY2hlbWFFbGVtZW50Ci0JCQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShTQ0hFTUFfRUxFTUVOVF9RVUFMSUZJRUQpKTsKLQkJCQlpZiAoZWxlbWVudEZvcm1EZWZhdWx0ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudEZvcm1EZWZhdWx0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJCWlmICgidHJ1ZSIuZXF1YWxzKHZhbHVlKSkgewotCQkJCQkJc2VydmljZS5zZXRFbGVtZW50Rm9ybURlZmF1bHQodHJ1ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoImZhbHNlIi5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQlzZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nLiBUaGlzIHdpbGwgYmUgYW4gZWxlbWVudCB0aGF0Ci0JCQkJLy8gbWFwcyBwa2cgbmFtZXMgdG8gYSBuYW1lc3BhY2UKLQkJCQkvLyB3aGVuIHRoaXMgaXMgZG9pbmcgQXhpc1NlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlIHdpbGwKLQkJCQkvLyBiZSBvdmVycmlkZGVuCi0JCQkJLy8gVGhpcyB3aWxsIGJlIDxtYXBwaW5nLz4gd2l0aCBAbmFtZXNwYWNlIGFuZCBAcGFja2FnZQotCQkJCUl0ZXJhdG9yIG1hcHBpbmdJdGVyYXRvciA9IHNjaGVtYUVsZW1lbnQKLQkJCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShNQVBQSU5HKSk7Ci0JCQkJaWYgKG1hcHBpbmdJdGVyYXRvciAhPSBudWxsKSB7Ci0JCQkJCU1hcCBwa2cybnNNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQkJCXdoaWxlIChtYXBwaW5nSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPTUVsZW1lbnQgbWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBtYXBwaW5nSXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCU9NQXR0cmlidXRlIG5hbWVzcGFjZUF0dHJpYnV0ZSA9IG1hcHBpbmdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FU1BBQ0UpKTsKLQkJCQkJCU9NQXR0cmlidXRlIHBhY2thZ2VBdHRyaWJ1dGUgPSBtYXBwaW5nRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfUEFDS0FHRSkpOwotCQkJCQkJaWYgKG5hbWVzcGFjZUF0dHJpYnV0ZSAhPSBudWxsCi0JCQkJCQkJCSYmIHBhY2thZ2VBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBuYW1lc3BhY2VBdHRyaWJ1dGVWYWx1ZSA9IG5hbWVzcGFjZUF0dHJpYnV0ZQotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJCQkJU3RyaW5nIHBhY2thZ2VBdHRyaWJ1dGVWYWx1ZSA9IHBhY2thZ2VBdHRyaWJ1dGUKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCQkJCQkJCWlmIChuYW1lc3BhY2VBdHRyaWJ1dGVWYWx1ZSAhPSBudWxsCi0JCQkJCQkJCQkmJiBwYWNrYWdlQXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQlwa2cybnNNYXAucHV0KHBhY2thZ2VBdHRyaWJ1dGVWYWx1ZS50cmltKCksCi0JCQkJCQkJCQkJbmFtZXNwYWNlQXR0cmlidXRlVmFsdWUudHJpbSgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlsb2cKLQkJCQkJCQkJCQkud2FybigiRWl0aGVyIHZhbHVlIG9mIEBuYW1lc3BjZSBvciBAcGFja2FnZW5hbWUgbm90IGF2YWlsYWJsZS4gVGh1cywgZ2VuZXJhdGVkIHdpbGwgYmUgc2VsZWN0ZWQuIik7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlsb2cKLQkJCQkJCQkJCS53YXJuKCJFaXRoZXIgQG5hbWVzcGNlIG9yIEBwYWNrYWdlbmFtZSBub3QgYXZhaWxhYmxlLiBUaHVzLCBnZW5lcmF0ZWQgd2lsbCBiZSBzZWxlY3RlZC4iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzZXJ2aWNlLnNldFAybk1hcChwa2cybnNNYXApOwotCi0JCQkJfQotCi0JCQl9Ci0KLQkJCS8vIHByb2Nlc3NpbmcgRGVmYXVsdCBNZXNzYWdlIHJlY2VpdmVycwotCQkJT01FbGVtZW50IG1lc3NhZ2VSZWNlaXZlciA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfTUVTU0FHRV9SRUNFSVZFUlMpKTsKLQkJCWlmIChtZXNzYWdlUmVjZWl2ZXIgIT0gbnVsbCkgewotCQkJCUhhc2hNYXAgbXJzID0gcHJvY2Vzc01lc3NhZ2VSZWNlaXZlcnMoc2VydmljZS5nZXRDbGFzc0xvYWRlcigpLAotCQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJCQlJdGVyYXRvciBrZXlzID0gbXJzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLQkJCQkJc2VydmljZS5hZGRNZXNzYWdlUmVjZWl2ZXIoa2V5LCAoTWVzc2FnZVJlY2VpdmVyKSBtcnMKLQkJCQkJCQkuZ2V0KGtleSkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmVtb3ZpbmcgZXhjbHVkZSBvcGVyYXRpb25zCi0JCQlPTUVsZW1lbnQgZXhjbHVkZU9wZXJhdGlvbnMgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX0VYQ0xVREVfT1BFUkFUSU9OUykpOwotCQkJQXJyYXlMaXN0IGV4Y2x1ZGVvcHMgPSBudWxsOwotCQkJaWYgKGV4Y2x1ZGVPcGVyYXRpb25zICE9IG51bGwpIHsKLQkJCQlleGNsdWRlb3BzID0gcHJvY2Vzc0V4Y2x1ZGVPcGVyYXRpb25zKGV4Y2x1ZGVPcGVyYXRpb25zKTsKLQkJCX0KLQkJCWlmIChleGNsdWRlb3BzID09IG51bGwpIHsKLQkJCQlleGNsdWRlb3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJfQotCQkJVXRpbHMuYWRkRXhjbHVkZU1ldGhvZHMoZXhjbHVkZW9wcyk7Ci0KLQkJCS8vIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veC55LnoiLz4KLQkJCS8vIHNldHRpbmcgdGhlIFBvbGljeUluY2x1ZGUKLQkJCS8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3k+IC4uIDwvLi4+IGVsZW1lbnRzCi0JCQlJdGVyYXRvciBwb2xpY3lFbGVtZW50cyA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWSkpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lFbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlwcm9jZXNzUG9saWN5RWxlbWVudHMocG9saWN5RWxlbWVudHMsIHNlcnZpY2UuZ2V0UG9saWN5U3ViamVjdCgpKTsKLQkJCX0KLQotCQkJLy8gcHJvY2Vzc2luZyA8d3NwOlBvbGljeVJlZmVyZW5jZT4gLi4gPC8uLj4gZWxlbWVudHMKLQkJCUl0ZXJhdG9yIHBvbGljeVJlZkVsZW1lbnRzID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotCQkJCQkJCVRBR19QT0xJQ1lfUkVGKSk7Ci0KLQkJCWlmIChwb2xpY3lSZWZFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeVJlZkVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCXByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhwb2xpY3lSZWZFbGVtZW50cywgc2VydmljZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQkvLyBwcm9jZXNzaW5nIHNlcnZpY2Ugc2NvcGUKLQkJCVN0cmluZyBzZXNzaW9uU2NvcGUgPSBzZXJ2aWNlX2VsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKAotCQkJCQlBVFRSSUJVVEVfU0NPUEUpKTsKLQkJCWlmIChzZXNzaW9uU2NvcGUgIT0gbnVsbCkgewotCQkJCXNlcnZpY2Uuc2V0U2NvcGUoc2Vzc2lvblNjb3BlKTsKLQkJCX0KLQotCQkJLy8gcHJvY2Vzc2luZyBzZXJ2aWNlLXdpZGUgbW9kdWxlcyB3aGljaCByZXF1aXJlZCB0byBlbmdhZ2UgZ2xvYmFsbHkKLQkJCUl0ZXJhdG9yIG1vZHVsZVJlZnMgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEUpKTsKLQotCQkJcHJvY2Vzc01vZHVsZVJlZnMobW9kdWxlUmVmcyk7Ci0KLQkJCS8vIHByb2Nlc3NpbmcgdHJhbnNwb3J0cwotCQkJT01FbGVtZW50IHRyYW5zcG9ydHMgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX1RSQU5TUE9SVFMpKTsKLQkJCWlmICh0cmFuc3BvcnRzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciB0cmFuc3BvcnRfaXRyID0gdHJhbnNwb3J0cwotCQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19UUkFOU1BPUlQpKTsKLQkJCQlBcnJheUxpc3QgdHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXdoaWxlICh0cmFuc3BvcnRfaXRyLmhhc05leHQoKSkgewotCQkJCQlPTUVsZW1lbnQgdHJzRWxlID0gKE9NRWxlbWVudCkgdHJhbnNwb3J0X2l0ci5uZXh0KCk7Ci0JCQkJCVN0cmluZyB0cmFuc3BvcnROYW1lID0gdHJzRWxlLmdldFRleHQoKS50cmltKCk7Ci0JCQkJCXRycy5hZGQodHJhbnNwb3J0TmFtZSk7Ci0JCQkJCWlmIChheGlzQ29uZmlnLmdldFRyYW5zcG9ydEluKHRyYW5zcG9ydE5hbWUpID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBBeGlzRmF1bHQoIlNlcnZpY2UgWyAiICsgc2VydmljZS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiXSBpcyB0cnlpbmcgdG8gZXhwb3NlIGluIGEgdHJhbnNwb3J0IDogIgotCQkJCQkJCQkrIHRyYW5zcG9ydHMKLQkJCQkJCQkJKyAiIGFuZCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIEF4aXMyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2VydmljZS5zZXRFeHBvc2VkVHJhbnNwb3J0cyh0cnMpOwotCQkJfQotCQkJLy8gcHJvY2Vzc2luZyBvcGVyYXRpb25zCi0JCQlJdGVyYXRvciBvcGVyYXRpb25zSXRlcmF0b3IgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19PUEVSQVRJT04pKTsKLQkJCUFycmF5TGlzdCBvcHMgPSBwcm9jZXNzT3BlcmF0aW9ucyhvcGVyYXRpb25zSXRlcmF0b3IpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykgewotCQkJCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uRGVzYyA9IChBeGlzT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCQkJCUFycmF5TGlzdCB3c2FtYXBwaW5ncyA9IG9wZXJhdGlvbkRlc2MuZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLQkJCQlpZiAod3NhbWFwcGluZ3MgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvbkRlc2MuZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQkJCXNlcnZpY2UuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbkRlc2MpOwotCQkJCX0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHdzYW1hcHBpbmdzLnNpemUoKTsgaisrKSB7Ci0JCQkJCVN0cmluZyBtYXBwaW5nID0gKFN0cmluZykgd3NhbWFwcGluZ3MuZ2V0KGopOwotCQkJCQlpZiAobWFwcGluZy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24obWFwcGluZywgb3BlcmF0aW9uRGVzYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgb2JqZWN0U3VwcGxpZXJWYWx1ZSA9IChTdHJpbmcpIHNlcnZpY2UKLQkJCQkJLmdldFBhcmFtZXRlclZhbHVlKFRBR19PQkpFQ1RfU1VQUExJRVIpOwotCQkJaWYgKG9iamVjdFN1cHBsaWVyVmFsdWUgIT0gbnVsbCkgewotCQkJCWxvYWRPYmplY3RTdXBwbGllckNsYXNzKG9iamVjdFN1cHBsaWVyVmFsdWUpOwotCQkJfQotCQkJLy8gU2V0IHRoZSBkZWZhdWx0IG1lc3NhZ2UgcmVjZWl2ZXIgZm9yIHRoZSBvcGVyYXRpb25zIHRoYXQgd2VyZQotCQkJLy8gbm90IGxpc3RlZCBpbiB0aGUgc2VydmljZXMueG1sCi0JCQlzZXREZWZhdWx0TWVzc2FnZVJlY2VpdmVycygpOwotCQkJVXRpbHMucHJvY2Vzc0JlYW5Qcm9wZXJ0eUV4Y2x1ZGUoc2VydmljZSk7Ci0JCQlpZiAoIXNlcnZpY2UuaXNVc2VVc2VyV1NETCgpKSB7Ci0JCQkJLy8gR2VuZXJhdGluZyBzY2hlbWEgZm9yIHRoZSBzZXJ2aWNlIGlmIHRoZSBpbXBsIGNsYXNzIGlzIEphdmEKLQkJCQlpZiAoIXNlcnZpY2UuaXNXc2RsRm91bmQoKSkgewotCQkJCQkvLyB0cnlpbmcgdG8gZ2VuZXJhdGUgV1NETCBmb3IgdGhlIHNlcnZpY2UgdXNpbmcgSkFNIGFuZAotCQkJCQkvLyBKYXZhIHJlZmxlY3Rpb24KLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChnZW5lcmF0ZVdzZGwoc2VydmljZSkpIHsKLQkJCQkJCQlVdGlscy5maWxsQXhpc1NlcnZpY2Uoc2VydmljZSwgYXhpc0NvbmZpZywKLQkJCQkJCQkJCWV4Y2x1ZGVvcHMsIG51bGwpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBcnJheUxpc3Qgbm9uUnBjT3BlcmF0aW9ucyA9IGdldE5vblJQQ01ldGhvZHMoc2VydmljZSk7Ci0JCQkJCQkJVXRpbHMuZmlsbEF4aXNTZXJ2aWNlKHNlcnZpY2UsIGF4aXNDb25maWcsCi0JCQkJCQkJCQlleGNsdWRlb3BzLCBub25ScGNPcGVyYXRpb25zKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0JCQkJCQkJCSJlcnJvcmluc2NoZW1hZ2VuIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChzZXJ2aWNlLmlzQ3VzdG9tV3NkbCgpKSB7Ci0JCQkJT01FbGVtZW50IG1hcHBpbmdFbGVtZW50ID0gc2VydmljZV9lbGVtZW50Ci0JCQkJCQkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUQUdfUEFDS0FHRTJRTkFNRSkpOwotCQkJCWlmIChtYXBwaW5nRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXByb2Nlc3NUeXBlTWFwcGluZ3MobWFwcGluZ0VsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlb3BzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG9wTmFtZSA9IChTdHJpbmcpIGV4Y2x1ZGVvcHMuZ2V0KGkpOwotCQkJCXNlcnZpY2UucmVtb3ZlT3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsKLQkJCX0KLQotCQkJLy8gTmVlZCB0byBjYWxsIHRoZSBzYW1lIGxvZ2ljIHRvd2ljZQotCQkJc2V0RGVmYXVsdE1lc3NhZ2VSZWNlaXZlcnMoKTsKLQkJCUl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MgPSBzZXJ2aWNlX2VsZW1lbnQKLQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEVfQ09ORklHKSk7Ci0JCQlwcm9jZXNzU2VydmljZU1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWdzLCBzZXJ2aWNlLCBzZXJ2aWNlKTsKLQotCQkJLy8gTG9hZGluZyBEYXRhIExvY2F0b3IocykgY29uZmlndXJlZAotCQkJT01FbGVtZW50IGRhdGFMb2NhdG9yRWxlbWVudCA9IHNlcnZpY2VfZWxlbWVudAotCQkJCQkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJCQlEUkNvbnN0YW50cy5EQVRBX0xPQ0FUT1JfRUxFTUVOVCkpOwotCQkJaWYgKGRhdGFMb2NhdG9yRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc0RhdGFMb2NhdG9yQ29uZmlnKGRhdGFMb2NhdG9yRWxlbWVudCwgc2VydmljZSk7Ci0JCQl9Ci0KLQkJCXByb2Nlc3NFbmRwb2ludHMoc2VydmljZSk7Ci0JCQlwcm9jZXNzUG9saWN5QXR0YWNobWVudHMoc2VydmljZV9lbGVtZW50LCBzZXJ2aWNlKTsKLQkJCQotCi0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE1lc3NhZ2VSZWNlaXZlcnMoKSB7Ci0JCUl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBzZXJ2aWNlLmdldFB1Ymxpc2hlZE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0JCQkJTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9IGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKAotCQkJCQkJb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSwgc2VydmljZSk7Ci0JCQkJaWYgKG1lc3NhZ2VSZWNlaXZlciA9PSBudWxsICYmCi0JCQkJLy8gd2UgYXNzdW1lIHRoYXQgaWYgdGhlIE1FUCBpcyBST0JVU1RfSU5fT05MWSB0aGVuIHRoZSBpbi1vdXQKLQkJCQkJCS8vIE1SIGNhbiBoYW5kbGUgdGhhdAotCQkJCQkJV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMob3BlcmF0aW9uCi0JCQkJCQkJCS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0JCQkJCW1lc3NhZ2VSZWNlaXZlciA9IGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKAotCQkJCQkJCVdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULCBzZXJ2aWNlKTsKLQotCQkJCX0KLQkJCQlvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZE9iamVjdFN1cHBsaWVyQ2xhc3MoU3RyaW5nIG9iamVjdFN1cHBsaWVyVmFsdWUpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJdHJ5IHsKLQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJCUNsYXNzIG9iamVjdFN1cHBsaWVySW1wbCA9IExvYWRlci5sb2FkQ2xhc3MobG9hZGVyLAotCQkJCQlvYmplY3RTdXBwbGllclZhbHVlLnRyaW0oKSk7Ci0JCQlPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllciA9IChPYmplY3RTdXBwbGllcikgb2JqZWN0U3VwcGxpZXJJbXBsCi0JCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJc2VydmljZS5zZXRPYmplY3RTdXBwbGllcihvYmplY3RTdXBwbGllcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgcGFja2FnZSBuYW1lIHRvIFFOYW1lIG1hcHBpbmc6Ci0JICogCi0JICogJmx0O3BhY2thZ2VNYXBwaW5nJmd0OyAmbHQ7bWFwcGluZyBwYWNrYWdlTmFtZT0iZm9vLmJhciIKLQkgKiBxbmFtZT0iaHR0cDovL2Zvby9iYXIveHNkIiVndDsgLi4uLi4uIC4uLi4uLiAmbHQ7L3BhY2thZ2VNYXBwaW5nJmd0OwotCSAqIAotCSAqIEBwYXJhbSBwYWNrYWdlTWFwcGluZ0VsZW1lbnQKLQkgKiAgICAgICAgICAgIE9NRWxlbWVudCBmb3IgdGhlIHBhY2thZ2VNYXBwaW5nRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZU1hcHBpbmdzKE9NRWxlbWVudCBwYWNrYWdlTWFwcGluZ0VsZW1lbnQpIHsKLQkJSXRlcmF0b3IgZWxlbWVudEl0ciA9IHBhY2thZ2VNYXBwaW5nRWxlbWVudAotCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTUFQUElORykpOwotCQlUeXBlVGFibGUgdHlwZVRhYmxlID0gc2VydmljZS5nZXRUeXBlVGFibGUoKTsKLQkJaWYgKHR5cGVUYWJsZSA9PSBudWxsKSB7Ci0JCQl0eXBlVGFibGUgPSBuZXcgVHlwZVRhYmxlKCk7Ci0JCX0KLQkJd2hpbGUgKGVsZW1lbnRJdHIuaGFzTmV4dCgpKSB7Ci0JCQlPTUVsZW1lbnQgbWFwcGluZ0VsZW1lbnQgPSAoT01FbGVtZW50KSBlbGVtZW50SXRyLm5leHQoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IG1hcHBpbmdFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBQ0tBR0VfTkFNRSkpOwotCQkJU3RyaW5nIHFOYW1lID0gbWFwcGluZ0VsZW1lbnQKLQkJCQkJLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZShUQUdfUU5BTUUpKTsKLQkJCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHFOYW1lID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUl0ZXJhdG9yIGtleXMgPSBzZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJaWYgKHFOYW1lLmVxdWFscyhzZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpLmdldChrZXkpKSkgewotCQkJCQl0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShwYWNrYWdlTmFtZSwgbmV3IFFOYW1lKHFOYW1lLAotCQkJCQkJCXBhY2thZ2VOYW1lLCBrZXkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2VydmljZS5zZXRUeXBlVGFibGUodHlwZVRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFNlcnZpY2VMaWZlQ3ljbGVDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotCQkJCUNsYXNzIHNlcnZpY2VMaWZlQ3ljbGVDbGFzc0ltcGwgPSBMb2FkZXIubG9hZENsYXNzKGxvYWRlciwKLQkJCQkJCWNsYXNzTmFtZSk7Ci0JCQkJU2VydmljZUxpZmVDeWNsZSBzZXJ2aWNlTGlmZUN5Y2xlID0gKFNlcnZpY2VMaWZlQ3ljbGUpIHNlcnZpY2VMaWZlQ3ljbGVDbGFzc0ltcGwKLQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCXNlcnZpY2VMaWZlQ3ljbGUuc3RhcnRVcChjb25maWdDdHgsIHNlcnZpY2UpOwotCQkJCXNlcnZpY2Uuc2V0U2VydmljZUxpZmVDeWNsZShzZXJ2aWNlTGlmZUN5Y2xlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlV3NkbChBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotCQlJdGVyYXRvciBvcGVyYXRpbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0JCWlmIChvcGVyYXRpbnMuaGFzTmV4dCgpKSB7Ci0JCQl3aGlsZSAob3BlcmF0aW5zLmhhc05leHQoKSkgewotCQkJCUF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpbnMubmV4dCgpOwotCi0JCQkJaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1lc3NhZ2VSZWNlaXZlckNsYXNzID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2VSZWNlaXZlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJLmVxdWFscyhtZXNzYWdlUmVjZWl2ZXJDbGFzcykKLQkJCQkJCXx8ICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKQotCQkJCQkJfHwgIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSB8fCAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiCi0JCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBnZXQgdGhlIG1ldGhvZHMgd2hpY2ggZG8gbm90IHVzZSBSUEMqIE1lc3NhZ2VSZWNlaXZlcnMKLQkgKiAKLQkgKiBAcGFyYW0gYXhpc1NlcnZpY2UKLQkgKiAgICAgICAgICAgIHRoZSBBeGlzU2VydmljZSB0byBzZWFyY2gKLQkgKiBAcmV0dXJuIGFuIEFycmF5TGlzdCBvZiB0aGUgTE9DQUwgUEFSVFMgb2YgdGhlIFFOYW1lcyBvZiBhbnkgbm9uLVJQQwotCSAqICAgICAgICAgb3BlcmF0aW9ucyBUT0RPOiBXaHkgbm90IGp1c3QgcmV0dXJuIHRoZSBBeGlzT3BlcmF0aW9ucwotCSAqICAgICAgICAgdGhlbXNlbHZlcz8/Ci0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgZ2V0Tm9uUlBDTWV0aG9kcyhBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotCQlBcnJheUxpc3QgZXhjbHVkZU9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIG9wZXJhdGlucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLQkJaWYgKG9wZXJhdGlucy5oYXNOZXh0KCkpIHsKLQkJCXdoaWxlIChvcGVyYXRpbnMuaGFzTmV4dCgpKSB7Ci0JCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlucy5uZXh0KCk7Ci0JCQkJaWYgKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIG1lc3NhZ2VSZWNlaXZlckNsYXNzID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2VSZWNlaXZlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJLmVxdWFscyhtZXNzYWdlUmVjZWl2ZXJDbGFzcykKLQkJCQkJCXx8ICJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKQotCQkJCQkJfHwgIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIgotCQkJCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSB8fCAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuSkFYV1NNZXNzYWdlUmVjZWl2ZXIiCi0JCQkJCQkuZXF1YWxzKG1lc3NhZ2VSZWNlaXZlckNsYXNzKSkpIHsKLQkJCQkJZXhjbHVkZU9wZXJhdGlvbnMuYWRkKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpCi0JCQkJCQkJLmdldExvY2FsUGFydCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGV4Y2x1ZGVPcGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgJmx0O2V4Y2x1ZGVPcGVyYXRpb24mZ3Q7IGVsZW1lbnQgaW4gc2VydmljZXMueG1sLiBFYWNoIG9wZXJhdGlvbgotCSAqIHJlZmVyZW5jZWQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEF4aXNTZXJ2aWNlLgotCSAqIAotCSAqIEBwYXJhbSBleGNsdWRlT3BlcmF0aW9ucwotCSAqICAgICAgICAgICAgdGhlICZsdDtleGNsdWRlT3BlcmF0aW9ucyZndDsgZWxlbWVudCBmcm9tIHNlcnZpY2VzLnhtbAotCSAqIEByZXR1cm4gYW4gQXJyYXlMaXN0IG9mIHRoZSBTdHJpbmcgY29udGVudHMgb2YgdGhlICZsdDtvcGVyYXRpb24mZ3Q7Ci0JICogICAgICAgICBlbGVtZW50cwotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NFeGNsdWRlT3BlcmF0aW9ucyhPTUVsZW1lbnQgZXhjbHVkZU9wZXJhdGlvbnMpIHsKLQkJQXJyYXlMaXN0IGV4T3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBleGNsdWRlT3BfaXRyID0gZXhjbHVkZU9wZXJhdGlvbnMKLQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX09QRVJBVElPTikpOwotCQl3aGlsZSAoZXhjbHVkZU9wX2l0ci5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBvcE5hbWUgPSAoT01FbGVtZW50KSBleGNsdWRlT3BfaXRyLm5leHQoKTsKLQkJCWV4T3BzLmFkZChvcE5hbWUuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCX0KLQkJcmV0dXJuIGV4T3BzOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTWVzc2FnZXMoSXRlcmF0b3IgbWVzc2FnZXMsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQl3aGlsZSAobWVzc2FnZXMuaGFzTmV4dCgpKSB7Ci0JCQlPTUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSAoT01FbGVtZW50KSBtZXNzYWdlcy5uZXh0KCk7Ci0JCQlPTUF0dHJpYnV0ZSBsYWJlbCA9IG1lc3NhZ2VFbGVtZW50Ci0JCQkJCS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFRBR19MQUJFTCkpOwotCi0JCQlpZiAobGFiZWwgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzCi0JCQkJCQkuZ2V0TWVzc2FnZSgibWVzc2FnZWxhYmVsY2Fubm90Zm91bmQiKSk7Ci0JCQl9Ci0KLQkJCUF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZShsYWJlbAotCQkJCQkuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0KLQkJCUl0ZXJhdG9yIHBhcmFtZXRlcnMgPSBtZXNzYWdlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBUkFNRVRFUikpOwotCi0JCQkvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5PiAuLiA8Ly4uPiBlbGVtZW50cwotCQkJSXRlcmF0b3IgcG9saWN5RWxlbWVudHMgPSBtZXNzYWdlRWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWSkpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudHMgIT0gbnVsbCkgewotCQkJCXByb2Nlc3NQb2xpY3lFbGVtZW50cyhwb2xpY3lFbGVtZW50cywgbWVzc2FnZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQkvLyBwcm9jZXNzaW5nIDx3c3A6UG9saWN5UmVmZXJlbmNlPiAuLiA8Ly4uPiBlbGVtZW50cwotCQkJSXRlcmF0b3IgcG9saWN5UmVmRWxlbWVudHMgPSBtZXNzYWdlRWxlbWVudAotCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwKLQkJCQkJCQlUQUdfUE9MSUNZX1JFRikpOwotCi0JCQlpZiAocG9saWN5UmVmRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCXByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhwb2xpY3lSZWZFbGVtZW50cywgbWVzc2FnZS5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQlwcm9jZXNzUGFyYW1ldGVycyhwYXJhbWV0ZXJzLCBtZXNzYWdlLCBvcGVyYXRpb24pOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBpcyByZXF1aXJlZCB0byBiZSBlbmdhZ2VkIGdsb2JhbGx5LgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGVSZWZzCi0JICogICAgICAgICAgICA8Y29kZT5qYXZhLnV0aWwuSXRlcmF0b3I8L2NvZGU+Ci0JICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgPGNvZGU+RGVwbG95bWVudEV4Y2VwdGlvbjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9kdWxlUmVmcyhJdGVyYXRvciBtb2R1bGVSZWZzKQotCQkJdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotCQl0cnkgewotCQkJd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0JCQkJT01FbGVtZW50IG1vZHVsZXJlZiA9IChPTUVsZW1lbnQpIG1vZHVsZVJlZnMubmV4dCgpOwotCQkJCU9NQXR0cmlidXRlIG1vZHVsZVJlZkF0dHJpYnV0ZSA9IG1vZHVsZXJlZgotCQkJCQkJLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX1JFRkVSRU5DRSkpOwotCi0JCQkJaWYgKG1vZHVsZVJlZkF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyByZWZOYW1lID0gbW9kdWxlUmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQkJCQkJaWYgKGF4aXNDb25maWcuZ2V0TW9kdWxlKHJlZk5hbWUpID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0JCQkJCQkJCURlcGxveW1lbnRFcnJvck1zZ3MuTU9EVUxFX05PVF9GT1VORCwgcmVmTmFtZSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2VydmljZS5hZGRNb2R1bGVyZWYocmVmTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGF4aXNGYXVsdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzT3BlcmF0aW9uTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsCi0JCQlQYXJhbWV0ZXJJbmNsdWRlIHBhcmVudCwgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24pCi0JCQl0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChtb2R1bGVDb25maWdzLmhhc05leHQoKSkgewotCQkJT01FbGVtZW50IG1vZHVsZUNvbmZpZyA9IChPTUVsZW1lbnQpIG1vZHVsZUNvbmZpZ3MubmV4dCgpOwotCQkJT01BdHRyaWJ1dGUgbW9kdWxlTmFtZV9hdHQgPSBtb2R1bGVDb25maWcuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgKLQkJCQkJQVRUUklCVVRFX05BTUUpKTsKLQotCQkJaWYgKG1vZHVsZU5hbWVfYXR0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNZXNzYWdlcwotCQkJCQkJLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX01PRFVMRV9DT05GSUcpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIG1vZHVsZSA9IG1vZHVsZU5hbWVfYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uID0gbmV3IE1vZHVsZUNvbmZpZ3VyYXRpb24oCi0JCQkJCQltb2R1bGUsIHBhcmVudCk7Ci0JCQkJSXRlcmF0b3IgcGFyYW1ldGVycyA9IG1vZHVsZUNvbmZpZwotCQkJCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLQotCQkJCXByb2Nlc3NQYXJhbWV0ZXJzKHBhcmFtZXRlcnMsIG1vZHVsZUNvbmZpZ3VyYXRpb24sIHBhcmVudCk7Ci0JCQkJb3BlcmF0aW9uLmFkZE1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWd1cmF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IHByb2Nlc3NPcGVyYXRpb25zKEl0ZXJhdG9yIG9wZXJhdGlvbnNJdGVyYXRvcikKLQkJCXRocm93cyBBeGlzRmF1bHQgewotCQlBcnJheUxpc3Qgb3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKG9wZXJhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBvcGVyYXRpb24gPSAoT01FbGVtZW50KSBvcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotCQkJLy8gZ2V0dGluZyBvcGVyYXRpb24gbmFtZQotCQkJT01BdHRyaWJ1dGUgb3BfbmFtZV9hdHQgPSBvcGVyYXRpb24uZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgKLQkJCQkJQVRUUklCVVRFX05BTUUpKTsKLQkJCWlmIChvcF9uYW1lX2F0dCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZShNZXNzYWdlcwotCQkJCQkJLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX09QLAotCQkJCQkJCQkib3BlcmF0aW9uIG5hbWUgbWlzc2luZyIpKSk7Ci0JCQl9Ci0KLQkJCS8vIHNldHRpbmcgdGhlIE1FUCBvZiB0aGUgb3BlcmF0aW9uCi0JCQlPTUF0dHJpYnV0ZSBvcF9tZXBfYXR0ID0gb3BlcmF0aW9uLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX01FUCkpOwotCQkJU3RyaW5nIG1lcHVybCA9IG51bGw7Ci0KLQkJCWlmIChvcF9tZXBfYXR0ICE9IG51bGwpIHsKLQkJCQltZXB1cmwgPSBvcF9tZXBfYXR0LmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBvcG5hbWUgPSBvcF9uYW1lX2F0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCQkJQXhpc09wZXJhdGlvbiBvcF9kZXNjcmlwID0gbnVsbDsKLQotCQkJLy8gZ2V0dGluZyB0aGUgbmFtZXNhcGNlIGZyb20gdGhlIGF0dHJpYnV0ZS4KLQkJCU9NQXR0cmlidXRlIG9wZXJhdGlvbk5hbWVzcGFjZSA9IG9wZXJhdGlvbi5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotCQkJCQlBVFRSSUJVVEVfTkFNRVNQQUNFKSk7Ci0JCQlpZiAob3BlcmF0aW9uTmFtZXNwYWNlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gb3BlcmF0aW9uTmFtZXNwYWNlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0JCQkJb3BfZGVzY3JpcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShuYW1lc3BhY2UsIG9wbmFtZSkpOwotCQkJfQotCQkJaWYgKG9wX2Rlc2NyaXAgPT0gbnVsbCkgewotCQkJCW9wX2Rlc2NyaXAgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUob3BuYW1lKSk7Ci0JCQl9Ci0KLQkJCWlmIChvcF9kZXNjcmlwID09IG51bGwpIHsKLQkJCQlvcF9kZXNjcmlwID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKHNlcnZpY2UKLQkJCQkJCS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgb3BuYW1lKSk7Ci0JCQl9Ci0JCQlpZiAob3BfZGVzY3JpcCA9PSBudWxsKSB7Ci0JCQkJaWYgKG1lcHVybCA9PSBudWxsKSB7Ci0JCQkJCS8vIGFzc3VtZWQgTUVQIGlzIGluLW91dAotCQkJCQlvcF9kZXNjcmlwID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotCQkJCQlvcF9kZXNjcmlwLnNldFBhcmVudChzZXJ2aWNlKTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCW9wX2Rlc2NyaXAgPSBBeGlzT3BlcmF0aW9uRmFjdG9yeQotCQkJCQkJCS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihtZXB1cmwpOwotCQkJCX0KLQkJCQlvcF9kZXNjcmlwLnNldE5hbWUobmV3IFFOYW1lKG9wbmFtZSkpOwotCQkJCVN0cmluZyBNRVAgPSBvcF9kZXNjcmlwLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQkJCQlpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotCQkJCQlBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlID0gb3BfZGVzY3JpcAotCQkJCQkJCS5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0JCQkJCWlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCWluYXhpc01lc3NhZ2Uuc2V0TmFtZShvcG5hbWUKLQkJCQkJCQkJKyBKYXZhMldTRExDb25zdGFudHMuTUVTU0FHRV9TVUZGSVgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0JCQkJCUF4aXNNZXNzYWdlIG91dEF4aXNNZXNzYWdlID0gb3BfZGVzY3JpcAotCQkJCQkJCS5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCQkJCQlpZiAob3V0QXhpc01lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQkJb3V0QXhpc01lc3NhZ2Uuc2V0TmFtZShvcG5hbWUKLQkJCQkJCQkJKyBKYXZhMldTRExDb25zdGFudHMuUkVTUE9OU0UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZXR0aW5nIHRoZSBQb2xpY3lJbmNsdWRlCi0KLQkJCS8vIHByb2Nlc3NpbmcgPHdzcDpQb2xpY3k+IC4uIDwvLi4+IGVsZW1lbnRzCi0JCQlJdGVyYXRvciBwb2xpY3lFbGVtZW50cyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWSkpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudHMgIT0gbnVsbCAmJiBwb2xpY3lFbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlwcm9jZXNzUG9saWN5RWxlbWVudHMocG9saWN5RWxlbWVudHMsIG9wX2Rlc2NyaXAuZ2V0UG9saWN5U3ViamVjdCgpKTsKLQkJCX0KLQotCQkJLy8gcHJvY2Vzc2luZyA8d3NwOlBvbGljeVJlZmVyZW5jZT4gLi4gPC8uLj4gZWxlbWVudHMKLQkJCUl0ZXJhdG9yIHBvbGljeVJlZkVsZW1lbnRzID0gb3BlcmF0aW9uCi0JCQkJCS5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShQT0xJQ1lfTlNfVVJJLAotCQkJCQkJCVRBR19QT0xJQ1lfUkVGKSk7Ci0KLQkJCWlmIChwb2xpY3lSZWZFbGVtZW50cyAhPSBudWxsICYmIHBvbGljeVJlZkVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCXByb2Nlc3NQb2xpY3lSZWZFbGVtZW50cyhwb2xpY3lSZWZFbGVtZW50cywgb3BfZGVzY3JpcC5nZXRQb2xpY3lTdWJqZWN0KCkpOwotCQkJfQotCi0JCQkvLyBPcGVyYXRpb24gUGFyYW1ldGVycwotCQkJSXRlcmF0b3IgcGFyYW1ldGVycyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX1BBUkFNRVRFUikpOwotCQkJcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgb3BfZGVzY3JpcCwgc2VydmljZSk7Ci0JCQkvLyBUbyBwcm9jZXNzIHdzYW1hcHBpbmc7Ci0JCQlwcm9jZXNzQWN0aW9uTWFwcGluZ3Mob3BlcmF0aW9uLCBvcF9kZXNjcmlwKTsKLQotCQkJLy8gbG9hZGluZyB0aGUgbWVzc2FnZSByZWNlaXZlcnMKLQkJCU9NRWxlbWVudCByZWNlaXZlckVsZW1lbnQgPSBvcGVyYXRpb24KLQkJCQkJLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX01FU1NBR0VfUkVDRUlWRVIpKTsKLQotCQkJaWYgKHJlY2VpdmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9IGxvYWRNZXNzYWdlUmVjZWl2ZXIoc2VydmljZQotCQkJCQkJLmdldENsYXNzTG9hZGVyKCksIHJlY2VpdmVyRWxlbWVudCk7Ci0KLQkJCQlvcF9kZXNjcmlwLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjZWl2ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzZXR0aW5nIGRlZmF1bHQgbWVzc2FnZSByZWNlaXZlcgotCQkJCU1lc3NhZ2VSZWNlaXZlciBtc2dSZWNlaXZlciA9IGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKAotCQkJCQkJb3BfZGVzY3JpcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCksIHNlcnZpY2UpOwotCQkJCW9wX2Rlc2NyaXAuc2V0TWVzc2FnZVJlY2VpdmVyKG1zZ1JlY2VpdmVyKTsKLQkJCX0KLQotCQkJLy8gUHJvY2VzcyBNb2R1bGUgUmVmcwotCQkJSXRlcmF0b3IgbW9kdWxlcyA9IG9wZXJhdGlvbi5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQkJVEFHX01PRFVMRSkpOwotCi0JCQlwcm9jZXNzT3BlcmF0aW9uTW9kdWxlUmVmcyhtb2R1bGVzLCBvcF9kZXNjcmlwKTsKLQotCQkJLy8gcHJvY2Vzc2luZyBNZXNzYWdlcwotCQkJSXRlcmF0b3IgbWVzc2FnZXMgPSBvcGVyYXRpb24uZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0JCQkJCVRBR19NRVNTQUdFKSk7Ci0KLQkJCXByb2Nlc3NNZXNzYWdlcyhtZXNzYWdlcywgb3BfZGVzY3JpcCk7Ci0KLQkJCS8vIHNldHRpbmcgT3BlcmF0aW9uIHBoYXNlCi0JCQlpZiAoYXhpc0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJUGhhc2VzSW5mbyBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0KLQkJCQlpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcF9kZXNjcmlwKTsKLQkJCX0KLQkJCUl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MgPSBvcGVyYXRpb24uZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0JCQkJCVRBR19NT0RVTEVfQ09ORklHKSk7Ci0JCQlwcm9jZXNzT3BlcmF0aW9uTW9kdWxlQ29uZmlnKG1vZHVsZUNvbmZpZ3MsIG9wX2Rlc2NyaXAsIG9wX2Rlc2NyaXApOwotCQkJLy8gYWRkaW5nIHRoZSBvcGVyYXRpb24KLQkJCW9wZXJhdGlvbnMuYWRkKG9wX2Rlc2NyaXApOwotCQl9Ci0JCXJldHVybiBvcGVyYXRpb25zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXJ2aWNlTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsCi0JCQlQYXJhbWV0ZXJJbmNsdWRlIHBhcmVudCwgQXhpc1NlcnZpY2Ugc2VydmljZSkKLQkJCXRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLQkJd2hpbGUgKG1vZHVsZUNvbmZpZ3MuaGFzTmV4dCgpKSB7Ci0JCQlPTUVsZW1lbnQgbW9kdWxlQ29uZmlnID0gKE9NRWxlbWVudCkgbW9kdWxlQ29uZmlncy5uZXh0KCk7Ci0JCQlPTUF0dHJpYnV0ZSBtb2R1bGVOYW1lX2F0dCA9IG1vZHVsZUNvbmZpZy5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotCQkJCQlBVFRSSUJVVEVfTkFNRSkpOwotCi0JCQlpZiAobW9kdWxlTmFtZV9hdHQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzCi0JCQkJCQkuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfTU9EVUxFX0NPTkZJRykpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgbW9kdWxlID0gbW9kdWxlTmFtZV9hdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQkJCQlNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24gPSBuZXcgTW9kdWxlQ29uZmlndXJhdGlvbigKLQkJCQkJCW1vZHVsZSwgcGFyZW50KTsKLQkJCQlJdGVyYXRvciBwYXJhbWV0ZXJzID0gbW9kdWxlQ29uZmlnCi0JCQkJCQkuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0JCQkJcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgbW9kdWxlQ29uZmlndXJhdGlvbiwgcGFyZW50KTsKLQkJCQlzZXJ2aWNlLmFkZE1vZHVsZUNvbmZpZyhtb2R1bGVDb25maWd1cmF0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogcHJvY2VzcyBkYXRhIGxvY2F0b3IgY29uZmlndXJhdGlvbiBmb3IgZGF0YSByZXRyaWV2YWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEYXRhTG9jYXRvckNvbmZpZyhPTUVsZW1lbnQgZGF0YUxvY2F0b3JFbGVtZW50LAotCQkJQXhpc1NlcnZpY2Ugc2VydmljZSkgewotCQlPTUF0dHJpYnV0ZSBzZXJ2aWNlT3ZlcmFsbERhdGFMb2NhdG9yY2xhc3MgPSBkYXRhTG9jYXRvckVsZW1lbnQKLQkJCQkuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShEUkNvbnN0YW50cy5DTEFTU19BVFRSSUJVVEUpKTsKLQkJaWYgKHNlcnZpY2VPdmVyYWxsRGF0YUxvY2F0b3JjbGFzcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gc2VydmljZU92ZXJhbGxEYXRhTG9jYXRvcmNsYXNzCi0JCQkJCS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCQkJc2VydmljZS5hZGREYXRhTG9jYXRvckNsYXNzTmFtZXMoRFJDb25zdGFudHMuU0VSVklDRV9MRVZFTCwKLQkJCQkJY2xhc3NOYW1lKTsKLQkJfQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGRhdGFMb2NhdG9yRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQlEUkNvbnN0YW50cy5ESUFMRUNUX0xPQ0FUT1JfRUxFTUVOVCkpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9NRWxlbWVudCBsb2NhdG9yRWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCU9NQXR0cmlidXRlIGRpYWxlY3QgPSBsb2NhdG9yRWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKAotCQkJCQlEUkNvbnN0YW50cy5ESUFMRUNUX0FUVFJJQlVURSkpOwotCQkJT01BdHRyaWJ1dGUgZGlhbGVjdGNsYXNzID0gbG9jYXRvckVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgKLQkJCQkJRFJDb25zdGFudHMuQ0xBU1NfQVRUUklCVVRFKSk7Ci0JCQlzZXJ2aWNlLmFkZERhdGFMb2NhdG9yQ2xhc3NOYW1lcyhkaWFsZWN0LmdldEF0dHJpYnV0ZVZhbHVlKCksCi0JCQkJCWRpYWxlY3RjbGFzcy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZU1hcChIYXNoTWFwIHdzZGxTZXJ2aWNlTWFwKSB7Ci0JCXRoaXMud3NkbFNlcnZpY2VNYXAgPSB3c2RsU2VydmljZU1hcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0VuZHBvaW50cyhBeGlzU2VydmljZSBheGlzU2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCVN0cmluZyBlbmRwb2ludE5hbWUgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKTsKLQkJaWYgKGVuZHBvaW50TmFtZSA9PSBudWxsIHx8IGVuZHBvaW50TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlVdGlscy5hZGRFbmRwb2ludHNUb1NlcnZpY2UoYXhpc1NlcnZpY2UsIHNlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY3lBdHRhY2htZW50cyhPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgYXR0YWNobWVudEVsZW1lbnRzID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoUE9MSUNZX05TX1VSSSwgVEFHX1BPTElDWV9BVFRBQ0hNRU5UKSk7Ci0JCXRyeSB7Ci0JCQlVdGlscy5wcm9jZXNzUG9saWN5QXR0YWNobWVudHMoYXR0YWNobWVudEVsZW1lbnRzLCBzZXJ2aWNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TZXJ2aWNlRGVwbG95ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VEZXBsb3llci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNkZTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VEZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZURlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlRGVwbG95ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsKLQotICAgIC8vVG8gaW5pdGlhbGl6ZSB0aGUgZGVwbG95ZXIKLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsKLSAgICAgICAgdGhpcy5heGlzQ29uZmlnID0gdGhpcy5jb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvL1dpbGwgcHJvY2VzcyB0aGUgZmlsZSBhbmQgYWRkIHRoYXQgdG8gYXhpc0NvbmZpZwotCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBpc0RpcmVjdG9yeSA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyOwotICAgICAgICBTdHJpbmdXcml0ZXIgZXJyb3JXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGFyY2hpdmVSZWFkZXIgPSBuZXcgQXJjaGl2ZVJlYWRlcigpOwotICAgICAgICBTdHJpbmcgc2VydmljZVN0YXR1cyA9ICIiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLnNldENsYXNzTG9hZGVyKGlzRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0U2VydmljZUNsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgIChGaWxlKWF4aXNDb25maWcuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0gICAgICAgICAgICBIYXNoTWFwIHdzZGxzZXJ2aWNlID0gYXJjaGl2ZVJlYWRlci5wcm9jZXNzV1NETHMoZGVwbG95bWVudEZpbGVEYXRhKTsKLSAgICAgICAgICAgIGlmICh3c2Rsc2VydmljZSAhPSBudWxsICYmIHdzZGxzZXJ2aWNlLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlcyA9IHdzZGxzZXJ2aWNlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBoYXNlc0luZm8oKS5zZXRPcGVyYXRpb25QaGFzZXMoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWcpOwotICAgICAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cENsYXNzTG9hZGVyKGRlcGxveW1lbnRGaWxlRGF0YS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIucHJvY2Vzc1NlcnZpY2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldEFic29sdXRlUGF0aCgpLCBkZXBsb3ltZW50RmlsZURhdGEsCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cCwgaXNEaXJlY3RvcnksIHdzZGxzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICBjb25maWdDdHgpOwotICAgICAgICAgICAgVVJMIGxvY2F0aW9uID0gZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS50b1VSTCgpOwotICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcpOwotICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRFUExPWUlOR19XUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24udG9TdHJpbmcoKSkpOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGRlKSB7Ci0gICAgICAgICAgICBkZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlLmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgZGUpOwotICAgICAgICAgICAgUHJpbnRXcml0ZXIgZXJyb3JfcHRpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZXJyb3JXcml0ZXIpOwotICAgICAgICAgICAgZGUucHJpbnRTdGFja1RyYWNlKGVycm9yX3B0aW50V3JpdGVyKTsKLSAgICAgICAgICAgIHNlcnZpY2VTdGF0dXMgPSAiRXJyb3I6XG4iICsgZXJyb3JXcml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgdGhyb3cgZGU7Ci0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5JTlZBTElEX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSksCi0gICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIGVycm9yX3B0aW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGVycm9yV3JpdGVyKTsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoZXJyb3JfcHRpbnRXcml0ZXIpOwotICAgICAgICAgICAgc2VydmljZVN0YXR1cyA9ICJFcnJvcjpcbiIgKyBlcnJvcldyaXRlci50b1N0cmluZygpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcl9wdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzSW5mb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcmludFdyaXRlciBlcnJvcl9wdGludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihlcnJvcldyaXRlcik7Ci0gICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZShlcnJvcl9wdGludFdyaXRlcik7Ci0gICAgICAgICAgICBzZXJ2aWNlU3RhdHVzID0gIkVycm9yOlxuIiArIGVycm9yV3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKG5ldyBFeGNlcHRpb24odCkpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZVN0YXR1cy5zdGFydHNXaXRoKCJFcnJvcjoiKSkgewotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0RmF1bHR5U2VydmljZXMoKS5wdXQoZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VTdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZU5hbWUgPSBVdGlscy5nZXRTaG9ydEZpbGVOYW1lKGZpbGVOYW1lKTsKLSAgICAgICAgICAgIGZpbGVOYW1lID0gRGVwbG95bWVudEVuZ2luZS5nZXRBeGlzU2VydmljZU5hbWUoZmlsZU5hbWUpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBheGlzQ29uZmlnLnJlbW92ZVNlcnZpY2VHcm91cChmaWxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdDdHgucmVtb3ZlU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX1JFTU9WRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZUZhdWx0eVNlcnZpY2UoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvL01heSBiZSBhIGZhdWx0eSBzZXJ2aWNlCi0gICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZUZhdWx0eVNlcnZpY2UoZmlsZU5hbWUpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUdyb3VwQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2VydmljZUdyb3VwQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjYwZTE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VHcm91cEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Nb2R1bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUdyb3VwQnVpbGRlciBleHRlbmRzIERlc2NyaXB0aW9uQnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIHdzZGxTZXJ2aWNlczsKLQotICAgIHB1YmxpYyBTZXJ2aWNlR3JvdXBCdWlsZGVyKE9NRWxlbWVudCBzZXJ2aWNlLCBIYXNoTWFwIHdzZGxTZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRWxlbWVudCA9IHNlcnZpY2U7Ci0gICAgICAgIHRoaXMud3NkbFNlcnZpY2VzID0gd3NkbFNlcnZpY2VzOwotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsKLSAgICAgICAgdGhpcy5heGlzQ29uZmlnID0gdGhpcy5jb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBwb3B1bGF0ZVNlcnZpY2VHcm91cChBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXApCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIHNlcnZpY2UgbGV2ZWwgcGFyYW1ldGVycwotICAgICAgICAgICAgSXRlcmF0b3IgaXRyID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICBwcm9jZXNzUGFyYW1ldGVycyhpdHIsIGF4aXNTZXJ2aWNlR3JvdXAsIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyZW50KCkpOwotCi0gICAgICAgICAgICBJdGVyYXRvciBtb2R1bGVDb25maWdzID0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX01PRFVMRV9DT05GSUcpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc1NlcnZpY2VNb2R1bGVDb25maWcobW9kdWxlQ29uZmlncywgYXhpc1NlcnZpY2VHcm91cC5nZXRQYXJlbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHNlcnZpY2Utd2lkZSBtb2R1bGVzIHdoaWNoIHJlcXVpcmVkIHRvIGVuZ2FnZSBnbG9iYWxseQotICAgICAgICAgICAgSXRlcmF0b3IgbW9kdWxlUmVmcyA9IHNlcnZpY2VFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEUpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc01vZHVsZVJlZnMobW9kdWxlUmVmcywgYXhpc1NlcnZpY2VHcm91cCk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VpdHIgPSBzZXJ2aWNlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfU0VSVklDRSkpOwotCi0gICAgICAgICAgICB3aGlsZSAoc2VydmljZWl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgc2VydmljZSA9IChPTUVsZW1lbnQpIHNlcnZpY2VpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIHNlcnZpY2VOYW1lYXR0ID0gc2VydmljZS5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKEFUVFJJQlVURV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lYXR0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNFUlZJQ0VfTkFNRV9FUlJPUikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZWF0dC5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9OQU1FX0VSUk9SKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHdzZGxTZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRXc2RsRm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlcnZpY2UgdGhhdCBoYXMgdG8gYmUgZGVwbG95ZWQKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0UGFyZW50KGF4aXNTZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VCdWlsZGVyIHNlcnZpY2VCdWlsZGVyID0gbmV3IFNlcnZpY2VCdWlsZGVyKGNvbmZpZ0N0eCwgYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBhcyA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKGFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZXJ2aWNlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBpcyByZXF1aXJlZCB0byBiZSBlbmdhZ2VkIGdsb2JhbGx5LgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZVJlZnMgPGNvZGU+amF2YS51dGlsLkl0ZXJhdG9yPC9jb2RlPgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb2R1bGVSZWZzKEl0ZXJhdG9yIG1vZHVsZVJlZnMsIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlIChtb2R1bGVSZWZzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVyZWYgPSAoT01FbGVtZW50KSBtb2R1bGVSZWZzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlUmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZk5hbWUgPSBtb2R1bGVSZWZBdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5NT0RVTEVfTk9UX0ZPVU5ELCByZWZOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwLmFkZE1vZHVsZXJlZihyZWZOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTZXJ2aWNlTW9kdWxlQ29uZmlnKEl0ZXJhdG9yIG1vZHVsZUNvbmZpZ3MsIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChtb2R1bGVDb25maWdzLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IG1vZHVsZUNvbmZpZyA9IChPTUVsZW1lbnQpIG1vZHVsZUNvbmZpZ3MubmV4dCgpOwotICAgICAgICAgICAgT01BdHRyaWJ1dGUgbW9kdWxlTmFtZV9hdHQgPSBtb2R1bGVDb25maWcuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlTmFtZV9hdHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLklOVkFMSURfTU9EVUxFX0NPTkZJRykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlID0gbW9kdWxlTmFtZV9hdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1vZHVsZUNvbmZpZ3VyYXRpb24obW9kdWxlLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHBhcmFtZXRlcnMgPSBtb2R1bGVDb25maWcuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlcnMocGFyYW1ldGVycywgbW9kdWxlQ29uZmlndXJhdGlvbiwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRNb2R1bGVDb25maWcobW9kdWxlQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UcmFuc3BvcnREZXBsb3llci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVHJhbnNwb3J0RGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwYTFiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9UcmFuc3BvcnREZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Ow0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotcHVibGljIGNsYXNzIFRyYW5zcG9ydERlcGxveWVyIGltcGxlbWVudHMgRGVwbG95ZXIgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVHJhbnNwb3J0RGVwbG95ZXIuY2xhc3MpOw0KLQ0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsNCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgew0KLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7DQotICAgICAgICBheGlzQ29uZmlnID0gY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsNCi0gICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0RmlsZSgpLmlzRGlyZWN0b3J5KCk7DQotICAgICAgICBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZXBsb3ltZW50RmlsZURhdGEuc2V0Q2xhc3NMb2FkZXIoaXNEaXJlY3RvcnksDQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldE1vZHVsZUNsYXNzTG9hZGVyKCksDQotICAgICAgICAgICAgICAgICAgICAoRmlsZSkgYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXJWYWx1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BUlRJRkFDVFNfVEVNUF9ESVIpKTsNCi0NCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBkZXBsb3ltZW50RmlsZURhdGEuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihsb2FkZXIpOw0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHhtbFN0cmVhbSA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi90cmFuc3BvcnQueG1sIik7DQotICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBYTUxVdGlscy50b09NKHhtbFN0cmVhbSk7DQotICAgICAgICAgICAgZWxlbWVudC5idWlsZCgpOw0KLSAgICAgICAgICAgIEF4aXNDb25maWdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoYXhpc0NvbmZpZyk7DQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBUcmFuc3BvcnQgUmVjZWl2ZXJzDQotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX1JlaXZlcnMgPQ0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19UUkFOU1BPUlRfUkVDRUlWRVIpKTsNCi0gICAgICAgICAgICBBcnJheUxpc3QgdHJhbnNwb3J0UmVjZWl2ZXJzID0gYnVpbGRlci5wcm9jZXNzVHJhbnNwb3J0UmVjZWl2ZXJzKHRyc19SZWl2ZXJzKTsNCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zcG9ydFJlY2VpdmVycy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluRGVzY3JpcHRpb24gPSAoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbikgdHJhbnNwb3J0UmVjZWl2ZXJzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtdGVyID0gdHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5nZXRQYXJhbWV0ZXIoIkF1dG9TdGFydCIpOw0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW10ZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldExpc3RlbmVyTWFuYWdlcigpLmFkZExpc3RlbmVyKHRyYW5zcG9ydEluRGVzY3JpcHRpb24sIGZhbHNlKTsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJzdGFydGluZyB0aGUgdHJhbnNwb3J0IDogIiArIHRyYW5zcG9ydEluRGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIFRyYW5zcG9ydCBTZW5kZXJzDQotICAgICAgICAgICAgSXRlcmF0b3IgdHJzX3NlbmRlcnMgPQ0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19UUkFOU1BPUlRfU0VOREVSKSk7DQotDQotICAgICAgICAgICAgYnVpbGRlci5wcm9jZXNzVHJhbnNwb3J0U2VuZGVycyh0cnNfc2VuZGVycyk7DQotDQotDQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSk7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbnRleHRDbGFzc0xvYWRlcik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpIHsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgew0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gew0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1VSTEJhc2VkQXhpc0NvbmZpZ3VyYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZDI2MTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFVSTEJhc2VkQXhpc0NvbmZpZ3VyYXRvciBleHRlbmRzIERlcGxveW1lbnRFbmdpbmUgaW1wbGVtZW50cyBBeGlzQ29uZmlndXJhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhVUkxCYXNlZEF4aXNDb25maWd1cmF0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgVVJMIGF4aXMyeG1sOwotICAgIHByaXZhdGUgVVJMIHJlcG9zaXRvcnk7Ci0KLSAgICBwdWJsaWMgVVJMQmFzZWRBeGlzQ29uZmlndXJhdG9yKFVSTCBheGlzMnhtbCwgVVJMIHJlcG9zaXRvcnkpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLmF4aXMyeG1sID0gYXhpczJ4bWw7Ci0gICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIElucHV0U3RyZWFtIGF4aXMyeG1sU3RyZWFtOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGF4aXMyeG1sID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzMnhtbFN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShEZXBsb3ltZW50Q29uc3RhbnRzLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBheGlzMnhtbFN0cmVhbSA9IGF4aXMyeG1sLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNDb25maWcgPSBwb3B1bGF0ZUF4aXNDb25maWd1cmF0aW9uKGF4aXMyeG1sU3RyZWFtKTsKLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgYXhpczJyZXBvUGFyYSA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKERlcGxveW1lbnRDb25zdGFudHMuQVhJUzJfUkVQTyk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXMycmVwb1BhcmEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVwb1ZhbHVlID0gKFN0cmluZykgYXhpczJyZXBvUGFyYS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVwb1ZhbHVlICE9IG51bGwgJiYgISIiLmVxdWFscyhyZXBvVmFsdWUudHJpbSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcG9WYWx1ZS5zdGFydHNXaXRoKCJmaWxlOi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRyZWF0IHRoaXMgY2FzZSBzcGVjaWFsbHkgLCBieSBhc3N1bWluZyBmaWxlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRlZCBpbiB0aGUgbG9jYWwgbWFjaGluZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5KHJlcG9WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5RnJvbVVSTChuZXcgVVJMKHJlcG9WYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk5vIHJlcG9zaXRvcnkgZm91bmQgLCBtb2R1bGUgd2lsbCBiZSBsb2FkZWQgZnJvbSBjbGFzc3BhdGgiKTsKLSAgICAgICAgICAgICAgICAgICAgbG9hZEZyb21DbGFzc1BhdGgoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5RnJvbVVSTChyZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICBheGlzQ29uZmlnLnNldENvbmZpZ3VyYXRvcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLy90byBsb2FkIHNlcnZpY2VzCi0gICAgcHVibGljIHZvaWQgbG9hZFNlcnZpY2VzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBheGlzMnJlcG9QYXJhID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoRGVwbG95bWVudENvbnN0YW50cy5BWElTMl9SRVBPKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpczJyZXBvUGFyYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXBvVmFsdWUgPSAoU3RyaW5nKSBheGlzMnJlcG9QYXJhLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXBvVmFsdWUgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJlcG9WYWx1ZS50cmltKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb1ZhbHVlLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRyZWF0IHRoaXMgY2FzZSBzcGVjaWFsbHkgLCBieSBhc3N1bWluZyBmaWxlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRlIGluIHRoZSBsb2NhbCBtYWNoaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIubG9hZFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRTZXJ2aWNlc0Zyb21VcmwobmV3IFVSTChyZXBvVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9hZFNlcnZpY2VzRnJvbVVybChyZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9UbyBlbmdhZ2UgZ2xvYmFsbHkgbGlzdGVkIG1vZHVsZXMKLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VHbG9iYWxNb2R1bGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGVuZ2FnZU1vZHVsZXMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9XYXJCYXNlZEF4aXNDb25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dhckJhc2VkQXhpc0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNiNmYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1dhckJhc2VkQXhpc0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogUHJvY2Vzc2VzIHRoZSBpbml0IHBhcmFtZXRlcnMgZm9yIHRoZSBBeGlzU2VydmxldC4KLSAqIFRoaXMgYWxsb3dzIHRoZSBsb2NhdGlvbiBvZiB0aGUgYXhpczIueG1sIGFuZCB0aGUgbW9kdWxlIHJlcG9zaXRvcnkgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgbG9jYXRpb25zLgotICogVGhlIGluaXQgcGFyYW1ldGVycyBzdXBwb3J0IGFsdGVybmF0ZSBmaWxlLCBvciBVUkwgdmFsdWVzIGZvciBib3RoIG9mIHRoZXNlLgotICovCi1wdWJsaWMgY2xhc3MgV2FyQmFzZWRBeGlzQ29uZmlndXJhdG9yIGV4dGVuZHMgRGVwbG95bWVudEVuZ2luZSBpbXBsZW1lbnRzIEF4aXNDb25maWd1cmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdhckJhc2VkQXhpc0NvbmZpZ3VyYXRvci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbml0IHBhcmFtZXRlciAoYXhpczIueG1sLnBhdGgpIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbG9jYXRpb24gZm9yIHRoZSBheGlzMi54bWwgZmlsZS4gV2hlbiBib3RoIHRoaXMgaW5pdCBwYXJhbWV0ZXIsIGFuZCB0aGUgYXhpczIueG1sLnVybCBpbml0IHBhcmFtZXRlcnMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGF4aXMgc2VydmxldCBpbml0LXBhcmFtZXRlciwgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgJHthcHB9L1dFQi1JTkYvY29uZi9heGlzMi54bWwgaXMgdXNlZC4KLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBwYXRoIGlzIGludGVycHJldGVkIGFzIGEgZmlsZSBzeXN0ZW0gYWJzb2x1dGUgcGF0aC4KLSAgICAgKiBUaGlzIHBhcmFtZXRlciB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGF4aXMyLnhtbC51cmwgaW5pdCBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVhJUzJfWE1MX1BBVEggPSAiYXhpczIueG1sLnBhdGgiOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5pdCBwYXJhbWV0ZXIgKGF4aXMyLnhtbC51cmwpIHRoYXQgd2hlbiBzcGVjaWZpZWQgaW5kaWNhdGVzIHRoZSBheGlzMi54bWwgc2hvdWxkIGJlIGxvYWRlZCB1c2luZyB0aGUgVVJMIHNwZWNpZmllZCBhcyB0aGUgdmFsdWUgb2YgdGhpcyBpbml0IHBhcmFtZXRlci4gSWYgdGhlIGF4aXMyLnhtbC5wYXRoIGluaXQgcGFyYW1ldGVyIGlzIHByZXNlbnQsIHRoaXMgaW5pdCBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9BWElTMl9YTUxfVVJMID0gImF4aXMyLnhtbC51cmwiOwotCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5pdCBwYXJhbWV0ZXIgKGF4aXMyLnJlcG9zaXRvcnkucGF0aCkgdGhhdCB3aGVuIHNwZWNpZmllZCBpbmRpY2F0ZXMgdGhlIHBhdGggdG8gdGhlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVhJUzJfUkVQT1NJVE9SWV9QQVRIID0gImF4aXMyLnJlcG9zaXRvcnkucGF0aCI7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbml0IHBhcmFtZXRlciAoYXhpczIucmVwb3NpdG9yeS51cmwpIHRoYXQgd2hlbiBzcGVjaWZpZWQgaW5kaWNhdGVzIHRoZSB1cmwgdG8gYmUgdXNlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0FYSVMyX1JFUE9TSVRPUllfVVJMID0gImF4aXMyLnJlcG9zaXRvcnkudXJsIjsKLQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgY29uZmlndXJhdG9yLgotICAgICAqIFRoaXMgZGV0ZXJtaW5lcyB0aGUgYXhpczIueG1sIGZpbGUgdG8gYmUgdXNlZCBmcm9tIHRoZSBpbml0IHBhcmFtZXRlcnMgZm9yIHRoZSBBeGlzU2VydmxldCBpbiB0aGUgd2ViLnhtbC4KLSAgICAgKiBUaGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMgYWNjb3JkaW5nIHRoZSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiB0aGUgcGFyYW1ldGVyIGF4aXMyLnhtbC5wYXRoIGlzIHByZXNlbnQsIHRoZSB2YWx1ZSBpcyB3ZWJhcHAgcmVsYXRpdmUgcGF0aCB0byBiZSB1c2VkIGFzIHRoZSBsb2NhdGlvbiB0byB0aGUgYXhpczIueG1sIGZpbGUuCi0gICAgICogPGxpPk90aGVyd2lzZSwgaWYgdGhlIHBhcmFtZXRlciBheGlzMi54bWwudXJsIGlzIHByZXNlbnQsIHRoZSBVUkwgaXMgdXNlZCBhcyB0aGUgbG9jYXRpb24gdG8gdGhlIGF4aXMyLnhtbCBmaWxlLgotICAgICAqIDxsaT5PdGhlcndpc2UsIHdoZW4gYm90aCBvZiB0aGUgYWJvdmUgaW5pdCBwYXJhbWV0ZXJzIGFyZSBub3QgcHJlc2VudCwgZmlsZSBpcyBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkIGZyb20gJmx0O3JlcG8mZ3Q7L1dFQi1JTkYvYXhpczIueG1sLgotICAgICAqIDxsaT4gV2hlbiBub25lIG9mIHRoZSBhYm92ZSBjb3VsZCBiZSBmb3VuZCwgdGhlIGF4aXMyLnhtbCBpcyBsb2FkZWQgZnJvbSB0aGUgY2xhc3NwYXRoIHJlc291cmNlLCB0aGUgdmFsdWUgb2YgRGVwbG95bWVuQ29uc3RhbnRzLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29uZmlnIHRoZSBTZXJ2bGV0Q29uZmlnIG9iamVjdCBmcm9tIHRoZSBBeGlzU2VydmxldC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIGluaXQoKSBvZiB0aGUgQXhpc1NlcnZsZXQuCi0gICAgICovCi0gICAgcHVibGljIFdhckJhc2VkQXhpc0NvbmZpZ3VyYXRvcihTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWcpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlnID0gc2VydmxldENvbmZpZzsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGF4aXMyU3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgbW9kdWxlIGlzIGFuIHVucGFja2VkIHdhciBmaWxlLAotICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBzZXQgdGhlIHdlYiBsb2NhdGlvbiBwYXRoIGluIHRoZSBkZXBsb3ltZW50IGVuZ2luZS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgbGV0IHVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdlYnBhdGggPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYnBhdGggPT0gbnVsbCB8fCB3ZWJwYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgd2VicGF0aCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3ZWJwYXRoICE9IG51bGwgJiYgISIiLmVxdWFscyh3ZWJwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInNldHRpbmcgd2ViIGxvY2F0aW9uIHN0cmluZzogIiArIHdlYnBhdGgpOwotICAgICAgICAgICAgICAgICAgICBGaWxlIHdlYmxvY2F0aW9uID0gbmV3IEZpbGUod2VicGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdlYkxvY2F0aW9uU3RyaW5nKHdlYmxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9IC8vIGlmIHdlYnBhdGggbm90IG51bGwKLQotICAgICAgICAgICAgICAgIFN0cmluZyBheGlzMnhtbHBhdGggPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9BWElTMl9YTUxfUEFUSCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXMyeG1scGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gaW5pdCBwYXJhbWV0ZXIgd2FzIHByZXNlbnQuCi0gICAgICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShheGlzMnhtbHBhdGgpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoInVzaW5nIGF4aXMyLnhtbCBmcm9tIHBhdGg6ICIgKyBheGlzMnhtbHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChheGlzMlN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBheGlzdXJsID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoUEFSQU1fQVhJUzJfWE1MX1VSTCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzdXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtID0gbmV3IFVSTChheGlzdXJsKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnID0gcG9wdWxhdGVBeGlzQ29uZmlndXJhdGlvbihheGlzMlN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRpbmcgYXhpczIueG1sIGZyb20gVVJMOiAiICsgYXhpc3VybCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpczJTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBib3RoIHRoZSBheGlzMi54bWwucGF0aCBhbmQgYXhpczIueG1sLnVybCBpbml0IHBhcmFtZXRlcnMgd2VyZSBub3QgcHJlc2VudAotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmluZCB0aGUgZGVmYXVsdCAvV0VCLUlORi9jb25mL2F4aXMyLnhtbAotICAgICAgICAgICAgICAgICAgICBheGlzMlN0cmVhbSA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oIi9XRUItSU5GL2NvbmYvYXhpczIueG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygidHJ5aW5nIHRvIGxvYWQgYXhpczIueG1sIGZyb20gbW9kdWxlOiAvV0VCLUlORi9jb25mL2F4aXMyLnhtbCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChheGlzMlN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBkZXBsb3ltZW50LCBubyBuZWVkIGZvciBjb25mIGRpcmVjdG9yeSBlaXRoZXIKLSAgICAgICAgICAgICAgICAgICAgYXhpczJTdHJlYW0gPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvV0VCLUlORi9heGlzMi54bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ0cnlpbmcgdG8gbG9hZCBheGlzMi54bWwgZnJvbSBtb2R1bGU6IC9XRUItSU5GL2NvbmYvYXhpczIueG1sIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvLyB0cnkKLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLCBlKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiVXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uOiAiICsgRGVwbG95bWVudENvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgLkFYSVMyX0NPTkZJR1VSQVRJT05fUkVTT1VSQ0UpOwotICAgICAgICAgICAgICAgIC8vIG5vdCB0aGVyZSwgdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmcm9tIGNsYXNzIHBhdGggcmVzb3VyY2UuCi0gICAgICAgICAgICB9IC8vIGNhdGNoCi0KLSAgICAgICAgICAgIGlmIChheGlzMlN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkNvdWxkIG5vdCBmaW5kIGF4aXMyLnhtbCwgbG9hZGluZyBkZWZhdWx0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgRGVwbG95bWVudENvbnN0YW50cy5BWElTMl9DT05GSUdVUkFUSU9OX1JFU09VUkNFICsgIiBmcm9tIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKERlcGxveW1lbnRDb25zdGFudHMuQVhJUzJfQ09ORklHVVJBVElPTl9SRVNPVVJDRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQ29uZmlnID0gcG9wdWxhdGVBeGlzQ29uZmlndXJhdGlvbihheGlzMlN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGlmKGF4aXMyU3RyZWFtICE9IG51bGwpewotICAgICAgICAgICAgICAgIGF4aXMyU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICBwYXJhbS5zZXROYW1lKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUik7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgoRmlsZSkgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmNvbnRleHQudGVtcGRpciIpLCAiX2F4aXMyIik7Ci0gICAgICAgICAgICBpZiAoZi5leGlzdHMoKSB8fCBmLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUoZik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGYgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJfYXhpczIiKTsKLSAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSB8fCBmLm1rZGlycygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFZhbHVlKGYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGF4aXNGYXVsdC5nZXRNZXNzYWdlKCksIGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGF4aXMgY29uZmlndXJhdGlvbiBvYmplY3QgYnkgbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKiBUaGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMgYWNjb3JkaW5nIHRoZSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2U6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5JZiB0aGUgcGFyYW1ldGVyIGF4aXMyLnJlcG9zaXRvcnkucGF0aCBpcyBwcmVzZW50LCB0aGlzIGZvbGRlciBpcyB1c2VkIGFzIHRoZSBsb2NhdGlvbiB0byB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKiA8bGk+T3RoZXJ3aXNlLCBpZiB0aGUgcGFyYW1ldGVyIGF4aXMyLnJlcG9zaXRvcnkudXJsIGlzIHByZXNlbnQsIHRoZSBVUkwgaXMgdXNlZCBhcyB0aGUgbG9jYXRpb24gdG8gdGhlIHJlcG9zaXRvcnkuCi0gICAgICogPGxpPk90aGVyd2lzZSwgd2hlbiBib3RoIG9mIHRoZSBhYm92ZSBpbml0IHBhcmFtZXRlcnMgYXJlIG5vdCBwcmVzZW50LCB0aGUgd2ViIGFwcGxpY2F0aW9ucyBXRUItSU5GIGZvbGRlciBpcyB1c2VkIGFzIHRoZSBmb2xkZXIgZm9yIHRoZSByZXBvc2l0b3J5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0IHRoYXQgcmVmbGVjdHMgdGhlIHJlcG9zaXRvcnkgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBhYm92ZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCB3aGVuIGFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeSA9IGNvbmZpZy5nZXRJbml0UGFyYW1ldGVyKFBBUkFNX0FYSVMyX1JFUE9TSVRPUllfUEFUSCk7Ci0gICAgICAgICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgcmVwb3NpdG9yeSBmcm9tIHBhdGg6ICIgKyByZXBvc2l0b3J5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9BWElTMl9SRVBPU0lUT1JZX1VSTCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkUmVwb3NpdG9yeUZyb21VUkwobmV3IFVSTChyZXBvc2l0b3J5KSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9hZGVkIHJlcG9zaXRvcnkgZnJvbSB1cmw6ICIgKyByZXBvc2l0b3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIiIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiB1bnBhY2tlZCB3YXIgZmlsZQotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi9XRUItSU5GIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiB1bnBhY2tlZCB3YXIgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKCIvV0VCLUlORiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibG9hZGVkIHJlcG9zaXRvcnkgZnJvbSAvV0VCLUlORiBmb2xkZXIgKHVucGFja2VkIHdhcikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2UoIi9XRUItSU5GLyIpOwotICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRSZXBvc2l0b3J5RnJvbVVSTCh1cmwpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRlZCByZXBvc2l0b3J5IGZyb20gL1dFQi1JTkYvIGZvbGRlciAoVVJMKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlcG9zaXRvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvYWRGcm9tQ2xhc3NQYXRoKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgcmVwb3NpdG9yeSBmcm9tIGNsYXNzcGF0aCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmVycm9yKGV4ICsgIjogbG9hZGluZyByZXBvc2l0b3J5IGZyb20gY2xhc3NwYXRoIiwgZXgpOwotICAgICAgICAgICAgbG9hZEZyb21DbGFzc1BhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBheGlzQ29uZmlnLnNldENvbmZpZ3VyYXRvcih0aGlzKTsKLSAgICAgICAgcmV0dXJuIGF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgLy90byBsb2FkIHNlcnZpY2VzCi0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgc2VydmljZXMgd2l0aGluIHRoZSByZXBvc2l0b3J5LgotICAgICAqIFdoZW4gdGhlIGF4aXMyLnJlcG9zaXRvcnkucGF0aCBpbml0IHBhcmFtZXRlciB3YXMgcHJlc2VudCwgd2UganVzdCBjYWxsIGxvYWRTZXJ2aWNlcygpIGluIHRoZSBkZXBsb3ltZW50IGVuZ2luZS48YnIvPgotICAgICAqIFdoZW4gdGhlIGF4aXMyLnJlcG9zaXRvcnkudXJsIGluaXQgcGFyYW1ldGVyIHdhcyBwcmVzZW50IHdlIGxvYWQgc2VydmljZXMgZnJvbSB0aGUgcmVzcGVjdGl2ZSBVUkwgdmFsdWUgb2YgdGhlIGluaXQgcGFyYW1ldGVyLjxici8+Ci0gICAgICogT3RoZXJ3aXNlLCB0cnkgdG8gbG9hZCB0aGUgc2VydmljZXMgZnJvbSB0aGUgL1dFQi1JTkYgZm9sZGVyIHdpdGhpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxvYWRTZXJ2aWNlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyByZXBvc2l0b3J5OwotCi0gICAgICAgICAgICByZXBvc2l0b3J5ID0gY29uZmlnLmdldEluaXRQYXJhbWV0ZXIoUEFSQU1fQVhJUzJfUkVQT1NJVE9SWV9QQVRIKTsKLSAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdXBlci5sb2FkU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRlZCBzZXJ2aWNlcyBmcm9tIHBhdGg6ICIgKyByZXBvc2l0b3J5KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihQQVJBTV9BWElTMl9SRVBPU0lUT1JZX1VSTCk7Ci0gICAgICAgICAgICBpZiAocmVwb3NpdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZFNlcnZpY2VzRnJvbVVybChuZXcgVVJMKHJlcG9zaXRvcnkpKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRlZCBzZXJ2aWNlcyBmcm9tIFVSTDogIiArIHJlcG9zaXRvcnkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvYWRTZXJ2aWNlc0Zyb21XZWJJbmYoKTsKLSAgICAgICAgICAgIGlmIChjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiIikgIT0gbnVsbCB8fCAKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0UmVhbFBhdGgoIi8iKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIubG9hZFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgc2VydmljZXMgZnJvbSB3ZWJhcHAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVSTCB1cmwgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZSgiL1dFQi1JTkYvIik7Ci0gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2FkU2VydmljZXNGcm9tVXJsKHVybCk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkZWQgc2VydmljZXMgZnJvbSAvV0VCLUlORi8gZm9sZGVyIChVUkwpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RvIGVuZ2FnZSBnbG9iYWxseSBsaXN0ZWQgbW9kdWxlcwotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZUdsb2JhbE1vZHVsZXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZW5nYWdlTW9kdWxlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbG9vayBpbnNpZGUgdGhlIHdlYi1pbmYgZGlyZWN0b3J5IHRvIGZpbmQgc2VydmljZXMueG1sCi0gICAgICogaW5zaWRlIHRoYXQgLCBpZiBpdCBpcyB0aGVyZSB3aWxsIGxvYWQgdGhhdCBhbmQgY3JlYXQgc2VydmljZSBncm91cCBvdXQKLSAgICAgKiBvZiB0aGF0IGFuZCBhZGQgaW50byBheGlzQ29uZmlnLiBVc2VyIGNhbiBkcm9wIGNvcnJlc3BvbmRpbmcgY2xhc3MgZmlsZXMKLSAgICAgKiBpbnRvIGNsYXNzIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFNlcnZpY2VzRnJvbVdlYkluZigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNlcnZpY2V4bWwgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VBc1N0cmVhbSgiL1dFQi1JTkYvc2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXhtbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSGFzaE1hcCB3c2RsU2VydmljZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIEFyY2hpdmVSZWFkZXIgYXJjaGl2ZVJlYWRlciA9IG5ldyBBcmNoaXZlUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiL1dFQi1JTkYiKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFyY2hpdmVSZWFkZXIucHJvY2Vzc0ZpbGVzSW5Gb2xkZXIobmV3IEZpbGUocGF0aCksIHdzZGxTZXJ2aWNlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gRGVwbG95bWVudEVuZ2luZS5idWlsZFNlcnZpY2VHcm91cChzZXJ2aWNleG1sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5ub25TZXJ2aWNlR3JvdXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsU2VydmljZXMpOwotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIC8vIHNldHRpbmcgU2VydmxldENvbnRleHQgaW50byBjb25maWdjdHgKLSAgICAgICAgY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVENPTlRFWFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkpOwotICAgICAgICBQYXJhbWV0ZXIgc2VydmxldENvbmZpZ1BhcmFtID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBzZXJ2bGV0Q29uZmlnUGFyYW0uc2V0TmFtZShIVFRQQ29uc3RhbnRzLkhUVFBfU0VSVkxFVENPTkZJRyk7Ci0gICAgICAgIHNlcnZsZXRDb25maWdQYXJhbS5zZXRWYWx1ZShjb25maWcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFBhcmFtZXRlcihzZXJ2bGV0Q29uZmlnUGFyYW0pOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSwgYXhpc0ZhdWx0KTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5zZXRDb25maWdDb250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L2F4aXMyX2RlZmF1bHQueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvYXhpczJfZGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYmQzY2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvYXhpczJfZGVmYXVsdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUlmIHR1cm5lZCBvbiB3aXRoIHVzZSB0aGUgQWNjZXB0IGhlYWRlciBvZiB0aGUgcmVxdWVzdCB0byBkZXRlcm1pbmUgdGhlIGNvbnRlbnRUeXBlIG9mIHRoZQotICAgIHJlc3BvbnNlLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJodHRwQ29udGVudE5lZ290aWF0aW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLS0+Ci0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+Ci0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPgotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1UaGlzIGlzIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIG9mIGFkbWluIGNvbnNvbGUtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4KLSAgICA8IS0tU2VydmljZXNEaXJlY3Rvcnkgb25seSB3b3JrcyBvbiB0aGUgZm9sbG93aW5nIGNhc2VzLS0+Ci0gICAgPCEtLS1GaWxlIGJhc2VkIGNvbmZpZ3VyYXRvciBhbmQgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBmaWxlIFVSTCAoaHR0cDovLyBub3QgYWxsb3dlZCktLT4KLSAgICA8IS0tLVdoZW4gY3JlYXRpbmcgVVJMIEJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIFVSTCDigJxmaWxlOi8v4oCdICAtLT4KLSAgICA8IS0tLSBXYXIgYmFzZWQgY29uZmlndXJhdG9yIHdpdGggZXhwYW5kZWQgY2FzZSAsIC0tPgotCi0gICAgPCEtLUFsbCB0aGUgb3RoZXIgc2NlbmFyaW9zIGl0IHdpbGwgYmUgaWdub3JlZC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJmYWxzZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1QT0pPIGRlcGxveWVyICwgdGhpcyB3aWxsIGFsb3cgdXNlcnMgdG8gZHJvcCAuY2xhc3MgZmlsZSBhbmQgbWFrZSB0aGF0IGludG8gYSBzZXJ2aWNlLS0+Ci0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+Ci0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmphciIgZGlyZWN0b3J5PSJ0cmFuc3BvcnRzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlRyYW5zcG9ydERlcGxveWVyIi8+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIGhvc3QgbmFtZSBmb3IgdGhlIGVwci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiBsb2NrZWQ9InRydWUiPm15aG9zdC5jb208L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVmYXVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0idGV4dC94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+Ci0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VCdWlsZGVycz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+Ci0gICAgICAgIDwhLS1MZWZ0IGNvbW1lbnRlZCBiZWNhdXNlIGl0IGFkZHMgdGhlIGRlcGFuZGFuY3kgb2Ygc2VydmxldC1hcGkgdG8gb3RoZXIgbW9kdWxlcy4KLSAgICAgICAgUGxlYXNlIHVuY29tbWVudCB0byBSZWNlaXZlIG1lc3NhZ2VzIGluIG11bHRpcGFydC9mb3JtLWRhdGEgZm9ybWF0LS0+Ci0gICAgICAgIDwhLS08bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+LS0+Ci0gICAgPC9tZXNzYWdlQnVpbGRlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUYXJnZXQgUmVzb2x2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGFuZCBzcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIGZvciB5b3VyIFRhcmdldFJlc29sdmVyIHRvIGFkZCAtLT4KLSAgICA8IS0tIGEgVGFyZ2V0UmVzb2x2ZXIuIFRhcmdldFJlc29sdmVycyBhcmUgdXNlZCB0byBwcm9jZXNzIHRoZSBUbyBFUFIgZm9yIGV4YW1wbGUgdG8gLS0+Ci0gICAgPCEtLSBjaG9vc2UgYSBzZXJ2ZXIgaW4gYSBjbHVzdGVyIC0tPgotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXJzPi0tPgotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXIgY2xhc3M9IiIgLz4tLT4KLSAgICA8IS0tPC90YXJnZXRSZXNvbHZlcnM+LS0+Ci0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4KLSAgICAgICAgPCEtLXVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+Ci0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj5odHRwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjE8L3BhcmFtZXRlcj4tLT4KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPgotICAgICAgICA8IS0tdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L3RyYW5zcG9ydFJlY2VpdmVyPi0tPgotICAgIDwhLS08dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCItLT4KLSAgICAgICAgICAgICAgICAgICA8IS0tY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BUcmFuc3BvcnRTZW5kZXIiLz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPCEtLTx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iamF2YSItLT4KLSAgICAgICAgICAgICAgICAgICAgIDwhLS1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuamF2YS5KYXZhVHJhbnNwb3J0U2VuZGVyIi8+LS0+Ci0KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tICBTT0FQIFJvbGUgQ29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVXNlIHRoZSBmb2xsb3dpbmcgcGF0dGVybiB0byBjb25maWd1cmUgdGhpcyBheGlzMgotICAgICAgICAgaW5zdGFuY2UgdG8gYWN0IGluIHBhcnRpY3VsYXIgcm9sZXMuIE5vdGUgdGhhdCBpbgotICAgICAgICAgdGhlIGFic2VuY2Ugb2YgYW55IGNvbmZpZ3VyYXRpb24sIEF4aXMyIHdpbGwgYWN0IAotICAgICAgICAgb25seSBpbiB0aGUgdWx0aW1hdGUgcmVjZWl2ZXIgcm9sZSAtLT4KLSAgICA8IS0tCi0gICAgPFNPQVBSb2xlQ29uZmlndXJhdGlvbiBpc1VsdGltYXRlUmVjZWl2ZXI9InRydWUiPgotICAgIAk8cm9sZT5odHRwOi8vbXkvY3VzdG9tL3JvbGU8L3JvbGU+Ci0gICAgPC9TT0FQUm9sZUNvbmZpZ3VyYXRpb24+Ci0JLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlLWRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0FyY2hpdmVSZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9BcmNoaXZlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MmMxOGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0FyY2hpdmVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXJyb3JNc2dzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50Lk1vZHVsZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TZXJ2aWNlR3JvdXBCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlci5BQVJCYXNlZFdTRExMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlci5BQVJGaWxlQmFzZWRVUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuV2FyQmFzZWRXU0RMTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVzb2x2ZXIuV2FyRmlsZUJhc2VkVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTRExUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVSZWFkZXIgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXJjaGl2ZVJlYWRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBidWlsZFNlcnZpY2VHcm91cChJbnB1dFN0cmVhbSB6aW4sIERlcGxveW1lbnRGaWxlRGF0YSBjdXJyZW50RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCwgSGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiB3c2RsU2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlcih6aW4sIGNvbmZpZ0N0eCk7Ci0gICAgICAgIE9NRWxlbWVudCByb290RWxlbWVudCA9IGJ1aWxkZXIuYnVpbGRPTSgpOwotICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSByb290RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICBpZiAoVEFHX1NFUlZJQ0UuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gRGVzY3JpcHRpb25CdWlsZGVyLmdldFNob3J0RmlsZU5hbWUoY3VycmVudEZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHdzZGxTZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgd3NkbFNlcnZpY2VzLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlci5nZXRTaG9ydEZpbGVOYW1lKGN1cnJlbnRGaWxlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFdzZGxGb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRDdXN0b21Xc2RsKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRQYXJlbnQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRDbGFzc0xvYWRlcihjdXJyZW50RmlsZS5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAgICAgU2VydmljZUJ1aWxkZXIgc2VydmljZUJ1aWxkZXIgPSBuZXcgU2VydmljZUJ1aWxkZXIoY29uZmlnQ3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQnVpbGRlci5zZXRXc2RsU2VydmljZU1hcCh3c2RsU2VydmljZXMpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZShyb290RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIEFycmF5TGlzdDxBeGlzU2VydmljZT4gc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOwotICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VMaXN0OwotICAgICAgICB9IGVsc2UgaWYgKFRBR19TRVJWSUNFX0dST1VQLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VHcm91cEJ1aWxkZXIgZ3JvdXBCdWlsZGVyID0gbmV3IFNlcnZpY2VHcm91cEJ1aWxkZXIocm9vdEVsZW1lbnQsIHdzZGxTZXJ2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4KTsKLSAgICAgICAgICAgIHJldHVybiBncm91cEJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlR3JvdXAoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW52YWxpZCBzZXJ2aWNlcy54bWwgZm91bmQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBTZXJ2aWNlIFhNTCBmaWxlcyBhbmQgYnVpbGRzIHRoZSBzZXJ2aWNlIGdyb3Vwcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEBwYXJhbSBheGlzU2VydmljZUdyb3VwCi0gICAgICogQHBhcmFtIGV4dHJhY3RTZXJ2aWNlCi0gICAgICogQHBhcmFtIHdzZGxTZXJ2aWNlcwotICAgICAqIEBwYXJhbSBjb25maWdDdHgKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXJyYXlMaXN0LgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+IHByb2Nlc3NTZXJ2aWNlR3JvdXAoU3RyaW5nIGZpbGVuYW1lLCBEZXBsb3ltZW50RmlsZURhdGEgY3VycmVudEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHRyYWN0U2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiB3c2RsU2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBnZXQgYXR0cmlidXRlIHZhbHVlcwotICAgICAgICBpZiAoIWV4dHJhY3RTZXJ2aWNlKSB7Ci0gICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKFNFUlZJQ0VTX1hNTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyLmdldFNob3J0RmlsZU5hbWUoY3VycmVudEZpbGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRTZXJ2aWNlR3JvdXAoemluLCBjdXJyZW50RmlsZSwgYXhpc1NlcnZpY2VHcm91cCwgd3NkbFNlcnZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9YTUxfTk9UX0ZPVU5ELCBmaWxlbmFtZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXJyb3JpbmlucHV0c3RyZWFtY2xvc2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXJyb3JpbmlucHV0c3RyZWFtY2xvc2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSwgU0VSVklDRVNfWE1MKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIC8vIHRyeSBmb3IgbWV0YS1pbmYKLSAgICAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUsIFNFUlZJQ0VTX1hNTC50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFNlcnZpY2VHcm91cChpbiwgY3VycmVudEZpbGUsIGF4aXNTZXJ2aWNlR3JvdXAsIHdzZGxTZXJ2aWNlcywgY29uZmlnQ3R4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRklMRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5YTUxfU1RSRUFNX0VYQ0VQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJlcnJvcmluaW5wdXRzdHJlYW1jbG9zZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuU0VSVklDRV9YTUxfTk9UX0ZPVU5EKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdHMgQXhpc1NlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXhpc1NlcnZpY2UuCi0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEF4aXNTZXJ2aWNlPiBwcm9jZXNzV1NETEZpbGUoV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIGF4aXNTZXJ2aWNlQnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgc2VydmljZUFyY2hpdmVGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FyY2hpdmUsIElucHV0U3RyZWFtIGluLCBTdHJpbmcgYmFzZVVSSSkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VBcmNoaXZlRmlsZSAhPSBudWxsICYmIGlzQXJjaGl2ZSkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21SZXNvbHZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJGaWxlQmFzZWRVUklSZXNvbHZlcihzZXJ2aWNlQXJjaGl2ZUZpbGUpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2VCdWlsZGVyIGluc3RhbmNlb2YgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgKChXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIGF4aXNTZXJ2aWNlQnVpbGRlcikuc2V0Q3VzdG9tV1NETFJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKGJhc2VVUkksIHNlcnZpY2VBcmNoaXZlRmlsZSwgaW4pKTsKLQotICAgICAgICAgICAgICAgICAgICAoKFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgYXhpc1NlcnZpY2VCdWlsZGVyKS5zZXREb2N1bWVudEJhc2VVcmkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUFyY2hpdmVGaWxlLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzU2VydmljZUJ1aWxkZXIgaW5zdGFuY2VvZiBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgKChXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIGF4aXNTZXJ2aWNlQnVpbGRlcikuc2V0Q3VzdG9tV1NETFJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQVJCYXNlZFdTRExMb2NhdG9yKGJhc2VVUkksIHNlcnZpY2VBcmNoaXZlRmlsZSwgaW4pKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJ5aW5nIHRvIHVzZSB0aGUgamFyIHNjaGVtZSBhcyB0aGUgYmFzZSBVUkkuIEkgdGhpbmsgdGhpcyBjYW4gYmUgdXNlZCB0byBoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gd3NkbCAxLjEgYXMgd2VsbCB3aXRob3V0IHVzaW5nIGEgY3VzdG9tIFVSSSByZXNvbHZlci4gTmVlZCB0byBsb29rIGF0IGl0IGxhdGVyLgotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUJ1aWxkZXIuc2V0QmFzZVVyaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFyOmZpbGU6Ly8iICsgc2VydmljZUFyY2hpdmVGaWxlLnRvVVJJKCkgKyAiIS8iICsgYmFzZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUFyY2hpdmVGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VCdWlsZGVyLnNldEJhc2VVcmkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUFyY2hpdmVGaWxlLmdldFBhcmVudEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChheGlzU2VydmljZUJ1aWxkZXIgaW5zdGFuY2VvZiBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKSBheGlzU2VydmljZUJ1aWxkZXIpLnNldERvY3VtZW50QmFzZVVyaSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUFyY2hpdmVGaWxlLmdldENhbm9uaWNhbEZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlQnVpbGRlciBpbnN0YW5jZW9mIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgYXhpc1NlcnZpY2VCdWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF4aXNTZXJ2aWNlQnVpbGRlciBpbnN0YW5jZW9mIFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcikgYXhpc1NlcnZpY2VCdWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJUcm91YmxlIHByb2Nlc3Npbmcgd3NkbCBmaWxlIDoiICsgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9leCkgewotICAgICAgICAgICAgbG9nLmluZm8oIlRyb3VibGUgcHJvY2Vzc2luZyB3c2RsIGZpbGUgOiIgKyBpb2V4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoaW9leCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBzZXJ2aWNlIG9iamVjdHMgZnJvbSB3c2RsIGZpbGUgaW5zaWRlIGEgc2VydmljZSBhcmNoaXZlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSA8Y29kZT5BcmNoaXZlRmlsZURhdGE8L2NvZGU+Ci0gICAgICogQHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBBeGlzU2VydmljZT4gcHJvY2Vzc1dTRExzKERlcGxveW1lbnRGaWxlRGF0YSBmaWxlKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBGaWxlIHNlcnZpY2VGaWxlID0gZmlsZS5nZXRGaWxlKCk7Ci0gICAgICAgIC8vIHRvIHN0b3JlIHNlcnZpY2UgY29tZSBmcm9tIHdzZGwgZmlsZXMKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiBzZXJ2aWNlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc1NlcnZpY2U+KCk7Ci0gICAgICAgIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBzZXJ2aWNlRmlsZS5pc0RpcmVjdG9yeSgpOwotICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBtZXRhSW5mRm9sZGVyID0gbmV3IEZpbGUoc2VydmljZUZpbGUsIE1FVEFfSU5GKTsKLQotICAgICAgICAgICAgICAgIGlmICghbWV0YUluZkZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhSW5mRm9sZGVyID0gbmV3IEZpbGUoc2VydmljZUZpbGUsIE1FVEFfSU5GLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1ldGFJbmZGb2xkZXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuTUVUQV9JTkZfTUlTU0lORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRmlsZS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlc0luRm9sZGVyKG1ldGFJbmZGb2xkZXIsIHNlcnZpY2VzTWFwKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW47Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNlcnZpY2VGaWxlKTsKLSAgICAgICAgICAgICAgICB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0oZmluKTsKLQotICAgICAgICAgICAgICAgIC8vVE9ETyBDaGVjayB3aGV0aGVyIHRoaXMgV1NETCBpcyBlbXB0eQotCi0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgIGludCByZWFkOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aChNRVRBX0lORi50b0xvd2VyQ2FzZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZW50cnlOYW1lLmVuZHNXaXRoKFNVRkZJWF9XU0RMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBub3Qgd2FudCB0byBnZW5lcmF0ZSB0aGUgc2VydmljZXMgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wb3J0ZWQgd3NkbCBvZiBvbmUgZmlsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZW50cnlOYW1lLmluZGV4T2YoIi8iKSAhPSBlbnRyeU5hbWUubGFzdEluZGV4T2YoIi8iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZW50cnlOYW1lLmluZGV4T2YoIndzZGxfIikgIT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbmx5IGNhcmUgYWJ0IHRoZSB0b3BsZXZlbCB3c2RsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IHppbi5yZWFkKGJ1ZikpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyB0aGUgcXVlc3Rpb24gaXMgd2hpY2ggdmVyc2lvbiBvZiBXU0RMIGZpbGUgdGhpcyBhcmNoaXZlIGNvbnRhaW5zLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0cyBjaGVjayB0aGUgbmFtZXNwYWNlIG9mIHRoZSByb290IGVsZW1lbnQgYW5kIGRlY2lkZS4gQnV0IHNpbmNlIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNpbmcgYXhpb20gKGR1ZGUsIHlvdSBhcmUgYmVjb21pbmcgaGFuZHkgaGVyZSA6KSksIHdlIHdpbGwgbm90IGJ1aWxkIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hvbGUgdGhpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBkb2N1bWVudEVsZW1lbnROUyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoT01FbGVtZW50KSBYTUxVdGlscy50b09NKGluKSkuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50TlMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExUb0F4aXNTZXJ2aWNlQnVpbGRlciB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRvY3VtZW50RWxlbWVudE5TLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgV1NETCAyLjAgZG9jdW1lbnQgaGVyZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyID0gbmV3IFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyLnNldEJhc2VVcmkoZW50cnlOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5OU19VUklfV1NETDExLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWxzKGRvY3VtZW50RWxlbWVudE5TLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIgPSBuZXcgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKSB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIpLnNldERvY3VtZW50QmFzZVVyaShlbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRXU0RMRm91bmQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QXhpc1NlcnZpY2U+IHNlcnZpY2VzID0gcHJvY2Vzc1dTRExGaWxlKHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VGaWxlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQudG9CeXRlQXJyYXkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzTWFwLnB1dChheGlzU2VydmljZS5nZXROYW1lKCksIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlc01hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxBeGlzU2VydmljZT4gZ2V0QXhpc1NlcnZpY2VGcm9tV3NkbChJbnB1dFN0cmVhbSBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciwgU3RyaW5nIHdzZGxVcmwpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSBxdWVzdGlvbiBpcyB3aGljaCB2ZXJzaW9uIG9mIFdTREwgZmlsZSB0aGlzIGFyY2hpdmUgY29udGFpbnMuCi0gICAgICAgIC8vIGxldHMgY2hlY2sgdGhlIG5hbWVzcGFjZSBvZiB0aGUgcm9vdCBlbGVtZW50IGFuZCBkZWNpZGUuIEJ1dCBzaW5jZSB3ZSBhcmUKLSAgICAgICAgLy8gdXNpbmcgYXhpb20gKGR1ZGUsIHlvdSBhcmUgYmVjb21pbmcgaGFuZHkgaGVyZSA6KSksIHdlIHdpbGwgbm90IGJ1aWxkIHRoZQotICAgICAgICAvLyB3aG9sZSB0aGluZy4KLSAgICAgICAgT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBYTUxVdGlscy50b09NKGluKTsKLSAgICAgICAgT01OYW1lc3BhY2UgZG9jdW1lbnRFbGVtZW50TlMgPSBlbGVtZW50LmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50TlMgIT0gbnVsbCkgewotICAgICAgICAgICAgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZShvdXQpOwotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5OU19VUklfV1NETDExLgotICAgICAgICAgICAgICAgICAgICBlcXVhbHMoZG9jdW1lbnRFbGVtZW50TlMuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyID0gbmV3IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgICAgICgoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKXdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlcikuc2V0Q3VzdG9tV1NETFJlc29sdmVyKG5ldyBXYXJCYXNlZFdTRExMb2NhdG9yKHdzZGxVcmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC50b0J5dGVBcnJheSgpKSkpOwotICAgICAgICAgICAgICAgIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21SZXNvbHZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXYXJGaWxlQmFzZWRVUklSZXNvbHZlcihsb2FkZXIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyKS5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFLgotICAgICAgICAgICAgICAgICAgICBlcXVhbHMoZG9jdW1lbnRFbGVtZW50TlMuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICB3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIgPSBuZXcgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAgICAgKChXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIpd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyKS5zZXRDdXN0b21XU0RMUmVzb2x2ZXIobmV3IFdhckJhc2VkV1NETExvY2F0b3Iod3NkbFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnRvQnl0ZUFycmF5KCkpKSk7Ci0gICAgICAgICAgICAgICAgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyLnNldEN1c3RvbVJlc29sdmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdhckZpbGVCYXNlZFVSSVJlc29sdmVyKGxvYWRlcikpOwotICAgICAgICAgICAgICAgIHJldHVybiAoKFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlcil3c2RsVG9BeGlzU2VydmljZUJ1aWxkZXIpLnBvcHVsYXRlQWxsU2VydmljZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRXU0RMRm91bmQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0ZpbGVzSW5Gb2xkZXIoRmlsZSBmb2xkZXIsIEhhc2hNYXA8U3RyaW5nLCBBeGlzU2VydmljZT4gc2VydmljZXNNYXApCi0gICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24sIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBGaWxlIGZpbGVzW10gPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZTEgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIGlmIChmaWxlMS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChTVUZGSVhfV1NETCkpIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOwotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbjI7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3cgdGhlIHF1ZXN0aW9uIGlzIHdoaWNoIHZlcnNpb24gb2YgV1NETCBmaWxlIHRoaXMgYXJjaGl2ZSBjb250YWlucy4KLSAgICAgICAgICAgICAgICAvLyBsZXRzIGNoZWNrIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHJvb3QgZWxlbWVudCBhbmQgZGVjaWRlLiBCdXQgc2luY2Ugd2UgYXJlCi0gICAgICAgICAgICAgICAgLy8gdXNpbmcgYXhpb20gKGR1ZGUsIHlvdSBhcmUgYmVjb21pbmcgaGFuZHkgaGVyZSA6KSksIHdlIHdpbGwgbm90IGJ1aWxkIHRoZQotICAgICAgICAgICAgICAgIC8vIHdob2xlIHRoaW5nLgotICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIGRvY3VtZW50RWxlbWVudE5TID0gKChPTUVsZW1lbnQpIFhNTFV0aWxzLnRvT00oaW4pKS5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50TlMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgd3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyOwotICAgICAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRvY3VtZW50RWxlbWVudE5TLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIFdTREwgMi4wIGRvY3VtZW50IGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBpbjIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlciA9IG5ldyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoaW4yKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuTlNfVVJJX1dTREwxMS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHMoZG9jdW1lbnRFbGVtZW50TlMuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbjIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlciA9IG5ldyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoaW4yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIpIHdzZGxUb0F4aXNTZXJ2aWNlQnVpbGRlcikuc2V0RG9jdW1lbnRCYXNlVXJpKGZpbGUxLnRvVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZFdTRExGb3VuZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbjMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxBeGlzU2VydmljZT4gc2VydmljZXMgPSBwcm9jZXNzV1NETEZpbGUod3NkbFRvQXhpc1NlcnZpY2VCdWlsZGVyLCBmaWxlMSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4yLCBmaWxlMS50b1VSSSgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNlcnZpY2VzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlc01hcC5wdXQoYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbjIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluMy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbyhlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVhZE1vZHVsZUFyY2hpdmUoRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlLCBib29sZWFuIGV4cGxvZGVkRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMKLSAgICAgICAgYm9vbGVhbiBtb2R1bGVYTUxGb3VuZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgc2hvcnRGaWxlTmFtZSA9IERlc2NyaXB0aW9uQnVpbGRlci5nZXRTaG9ydEZpbGVOYW1lKGRlcGxveW1lbnRGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICghZXhwbG9kZWREaXIpIHsKLSAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppbjsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaW47Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVwbG95bWVudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1PRFVMRV9YTUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVYTUxGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTW9kdWxlQnVpbGRlcih6aW4sIG1vZHVsZSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIG1vZHVsZSBuYW1lIGFuZCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2V0QXJjaGl2ZU5hbWUoc2hvcnRGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1vZHVsZVhNTEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RXJyb3JNc2dzLk1PRFVMRV9YTUxfTUlTU0lORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlcGxveW1lbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBNT0RVTEVfWE1MKTsKLQotICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkgfHwKLSAgICAgICAgICAgICAgICAoZmlsZSA9IG5ldyBGaWxlKGRlcGxveW1lbnRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBNT0RVTEVfWE1MLnRvTG93ZXJDYXNlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgTW9kdWxlQnVpbGRlciBidWlsZGVyID0gbmV3IE1vZHVsZUJ1aWxkZXIoaW4sIG1vZHVsZSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgbW9kdWxlIG5hbWUgYW5kIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnNldEFyY2hpdmVOYW1lKHNob3J0RmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkZJTEVfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yaW5pbnB1dHN0cmVhbWNsb3NlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRFcnJvck1zZ3MuTU9EVUxFX1hNTF9NSVNTSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0RlcGxveW1lbnRGaWxlRGF0YS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL0RlcGxveW1lbnRGaWxlRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM0N2FlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9EZXBsb3ltZW50RmlsZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIERlcGxveW1lbnRGaWxlRGF0YSByZXByZXNlbnRzIGEgInRoaW5nIHRvIGRlcGxveSIgaW4gQXhpczIuICBJdCBjb25zaXN0cyBvZiBhIGZpbGUsCi0gKiBhIGRlcGxveW1lbnQgQ2xhc3NMb2FkZXIsIGFuZCBhIERlcGxveWVyLgotICovCi1wdWJsaWMgY2xhc3MgRGVwbG95bWVudEZpbGVEYXRhIHsKLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgRGVwbG95ZXIgZGVwbG95ZXI7Ci0KLSAgICBwdWJsaWMgRGVwbG95bWVudEZpbGVEYXRhKEZpbGUgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXBsb3ltZW50RmlsZURhdGEoRmlsZSBmaWxlLCBEZXBsb3llciBkZXBsb3llcikgewotICAgICAgICB0aGlzKGZpbGUpOwotICAgICAgICB0aGlzLmRlcGxveWVyID0gZGVwbG95ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0TmFtZSgpOyAvLyBObyBuZWVkIHRvIGNoZWNrIGZvciBudWxsIGR1ZSB0byBjb25zdHJ1Y3RvciBjaGVjawotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgZmlsZQotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgZ2V0TmFtZSgpIGluc3RlYWQgLSB0aGlzIHdpbGwgZGlzYXBwZWFyIGFmdGVyIDEuMy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01vZHVsZUFyY2hpdmVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gKGZpbGVuYW1lLmVuZHNXaXRoKCIubWFyIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gZmlsZSBpcyBhIGphciBvciBhbiBhYXIgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlIHRvIGNoZWNrCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VydmljZUFyY2hpdmVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICByZXR1cm4gKChmaWxlbmFtZS5lbmRzV2l0aCgiLmphciIpKSB8IChmaWxlbmFtZS5lbmRzV2l0aCgiLmFhciIpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihib29sZWFuIGlzRGlyZWN0b3J5LCBDbGFzc0xvYWRlciBwYXJlbnQsIEZpbGUgZmlsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICghaXNEaXJlY3RvcnkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFVSTFtdIHVybHNUb0xvYWRGcm9tOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5maWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5GSUxFX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cmxzVG9Mb2FkRnJvbSA9IG5ldyBVUkxbXXt0aGlzLmZpbGUudG9VUkwoKX07Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gVXRpbHMuY3JlYXRlQ2xhc3NMb2FkZXIodXJsc1RvTG9hZEZyb20sIHBhcmVudCwgdHJ1ZSwgZmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5maWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IFV0aWxzLmdldENsYXNzTG9hZGVyKHBhcmVudCwgdGhpcy5maWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBEZXBsb3llciBnZXREZXBsb3llcigpIHsKLSAgICAgICAgcmV0dXJuIGRlcGxveWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlcGxveWVyKERlcGxveWVyIGRlcGxveWVyKSB7Ci0gICAgICAgIHRoaXMuZGVwbG95ZXIgPSBkZXBsb3llcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRlcGxveWVyLmRlcGxveSh0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXBvc2l0b3J5L3V0aWwvV1NJbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXBvc2l0b3J5L3V0aWwvV1NJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTA0ZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVwb3NpdG9yeS91dGlsL1dTSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0luZm8gewotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWREYXRlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRVJWSUNFID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01PRFVMRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DVVNUT00gPSAyOwotCi0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhIG1vZHVsZSBvciBhIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB0eXBlID0gVFlQRV9TRVJWSUNFOwotCi0gICAgcHJpdmF0ZSBEZXBsb3llciBkZXBsb3llcjsKLQotICAgIHB1YmxpYyBXU0luZm8oU3RyaW5nIGZpbGVOYW1lLCBsb25nIGxhc3RNb2RpZmllZERhdGUsIERlcGxveWVyIGRlcGxveWVyICxpbnQgdHlwZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IGxhc3RNb2RpZmllZERhdGU7Ci0gICAgICAgIHRoaXMuZGVwbG95ZXIgPSBkZXBsb3llcjsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGxhc3RNb2RpZmllZERhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZERhdGUobG9uZyBsYXN0bW9kaWZpZWRkYXRlKSB7Ci0gICAgICAgIHRoaXMubGFzdE1vZGlmaWVkRGF0ZSA9IGxhc3Rtb2RpZmllZGRhdGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXBsb3llciBnZXREZXBsb3llcigpIHsKLSAgICAgICAgcmV0dXJuIGRlcGxveWVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9XU0luZm9MaXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXBvc2l0b3J5L3V0aWwvV1NJbmZvTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTllMDFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3JlcG9zaXRvcnkvdXRpbC9XU0luZm9MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFdTSW5mb0xpc3QgaW1wbGVtZW50cyBEZXBsb3ltZW50Q29uc3RhbnRzIHsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdG8gc3RvcmUgYWxsIHRoZSBqYXIgZmlsZXMgaW4gYSBzcGVjaWZpZWQgZm9sZGVyIChXRUJfSU5GKQotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBqYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQWxsIHRoZSBjdXJyZW50bHkgdXBkYXRlZCBqYXJzCi0gICAgICovCi0gICAgcHVibGljIE1hcCBjdXJyZW50SmFycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWZlcmVuY2UgdG8gRGVwbG95bWVudEVuZ2luZSB0byBtYWtlIHVwZGF0ZQotICAgICAqLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotICAgIHByaXZhdGUgZmluYWwgRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lOwotCi0gICAgcHVibGljIFdTSW5mb0xpc3QoRGVwbG95bWVudEVuZ2luZSBkZXBsb3lfZW5naW5lKSB7Ci0gICAgICAgIGRlcGxveW1lbnRFbmdpbmUgPSBkZXBsb3lfZW5naW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcnN0IGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIGlzIGFscmVhZHkgYXZhaWxhYmxlIGJ5IHRoZQotICAgICAqIHN5c3RlbSBjYWxsIGZpbGVFeGlzdHMuIElmIGl0IGlzIG5vdCBkZXBsb3llZCB5ZXQgdGhlbiBhZGRzIHRvIHRoZSBqYXJMaXN0Ci0gICAgICogYW5kIHRvIHRoZSBkZXBsb3ltZW50IGVuZ2luZSBhcyBhIG5ldyBzZXJ2aWNlIG9yIG1vZHVsZS4KLSAgICAgKiBXaGlsZSBhZGRpbmcgbmV3IGl0ZW0gdG8gamFyTGlzdCwgZmlyc3QgY3JlYXRlcyB0aGUgV1NJbmZvIG9iamVjdCBhbmQKLSAgICAgKiB0aGVuIGFkZHMgdG8gdGhlIGphcmxpc3QgYW5kIGFjdHVhbCBqYXIgZmlsZSBpcyBhZGRlZCB0byBEZXBsb3ltZW50RW5naW5lLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgZmlsZXMgYWxyZWFkeSBleGlzdHMsIHRoZW4gY2hlY2tzIHdoZXRoZXIgaXQgaGFzIGJlZW4gdXBkYXRlZAotICAgICAqIHRoZW4gY2hhbmdlcyB0aGUgbGFzdCB1cGRhdGUgZGF0ZSBvZiB0aGUgd3NJbmZvIGFuZCBhZGRzIHR3byBlbnRyaWVzIHRvCi0gICAgICogRGVwbG95bWVudEVuZ2luZSAtIG9uZSBmb3IgbmV3IGRlcGxveW1lbnQgYW5kIG90aGVyIGZvciB1bmRlcGxveW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZSBhY3R1YWwgamFyIGZpbGVzIGZvciBlaXRoZXIgTW9kdWxlIG9yIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkV1NJbmZvSXRlbShGaWxlIGZpbGUsIERlcGxveWVyIGRlcGxveWVyICwgaW50IHR5cGUpIHsKLSAgICAgICAgV1NJbmZvIGluZm8gPSAoV1NJbmZvKSBjdXJyZW50SmFycy5nZXQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZXBsb3ltZW50RW5naW5lLmlzSG90VXBkYXRlKCkgJiYgaXNNb2RpZmllZChmaWxlLCBpbmZvKSkgewotICAgICAgICAgICAgICAgIFdTSW5mbyB3c0luZm8gPSBuZXcgV1NJbmZvKGluZm8uZ2V0RmlsZU5hbWUoKSwgaW5mby5nZXRMYXN0TW9kaWZpZWREYXRlKCksIGRlcGxveWVyLHR5cGUpOwotICAgICAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUuYWRkV1NUb1VuZGVwbG95KHdzSW5mbyk7ICAgICAgICAgICAvLyBhZGQgZW50cnkgdG8gdW5kZXBsb3kgbGlzdAotICAgICAgICAgICAgICAgIERlcGxveW1lbnRGaWxlRGF0YSBkZXBsb3ltZW50RmlsZURhdGEgPSBuZXcgRGVwbG95bWVudEZpbGVEYXRhKGZpbGUsIGRlcGxveWVyKTsKLSAgICAgICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmFkZFdTVG9EZXBsb3koZGVwbG95bWVudEZpbGVEYXRhKTsgICAgLy8gYWRkIGVudHJ5IHRvIGRlcGxveWxpc3QKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluZm8gPSBnZXRGaWxlSXRlbShmaWxlLCBkZXBsb3llciwgdHlwZSk7Ci0gICAgICAgICAgICBzZXRMYXN0TW9kaWZpZWREYXRlKGZpbGUsIGluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgamFyTGlzdC5hZGQoaW5mby5nZXRGaWxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdW5kZXBsb3llZCBTZXJ2aWNlcy4gQ2hlY2tzIG9sZCBqYXJzIGZpbGVzIGFuZCBjdXJyZW50IGphcnMuCi0gICAgICogSWYgbmFtZSBvZiB0aGUgb2xkIGphciBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IGphcgotICAgICAqIGxpc3QgdGhlbiBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGphciBmaWxlIGhhcyBiZWVuIHJlbW92ZWQKLSAgICAgKiBhbmQgdGhhdCBpcyBob3QgdW5kZXBsb3ltZW50LgotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tGb3JVbmRlcGxveWVkU2VydmljZXMoKSB7Ci0gICAgICAgIGlmKCFsb2NrZWQpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJdGVyYXRvciBpbmZvSXRlbXMgPSBjdXJyZW50SmFycy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICBMaXN0IHRvYmVSZW1vdmVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoaW5mb0l0ZW1zLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nICBmaWxlTmFtZSA9IChTdHJpbmcpIGluZm9JdGVtcy5uZXh0KCk7Ci0gICAgICAgICAgICBXU0luZm8gaW5mb0l0ZW0gPSAoV1NJbmZvKSBjdXJyZW50SmFycy5nZXQoZmlsZU5hbWUpOwotICAgICAgICAgICAgaWYgKGluZm9JdGVtLmdldFR5cGUoKSA9PSBXU0luZm8uVFlQRV9NT0RVTEUpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vc2VlbXMgbGlrZSBzb21lb25lIGhhcyBkZWxldGVkIHRoZSBmaWxlICwgc28gbmVlZCB0byB1bmRlcGxveQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBqYXJMaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZihmaWxlTmFtZS5lcXVhbHMocykpewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIWZvdW5kKXsKLSAgICAgICAgICAgICAgICB0b2JlUmVtb3ZlZC5hZGQoZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIGRlcGxveW1lbnRFbmdpbmUuYWRkV1NUb1VuZGVwbG95KGluZm9JdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9iZVJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IChTdHJpbmcpIHRvYmVSZW1vdmVkLmdldChpKTsKLSAgICAgICAgICAgIGN1cnJlbnRKYXJzLnJlbW92ZShmaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdG9iZVJlbW92ZWQuY2xlYXIoKTsKLSAgICAgICAgamFyTGlzdC5jbGVhcigpOwotICAgICAgICBsb2NrZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGphcmxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamFyTGlzdC5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGRlcGxveW1lbnRFbmdpbmUpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yVW5kZXBsb3llZFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLnVuRGVwbG95KCk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmRvRGVwbG95KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBXU0luZm8gb2JqZWN0IHJlbGF0ZWQgdG8gYSBmaWxlIGlmIGl0IGV4aXN0cywgbnVsbCBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIFdTSW5mbyBnZXRGaWxlSXRlbShGaWxlIGZpbGUgLCBEZXBsb3llciBkZXBsb3llciAsIGludCB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBXU0luZm8gaW5mbyA9IChXU0luZm8pIGN1cnJlbnRKYXJzLmdldChmaWxlTmFtZSk7Ci0gICAgICAgIGlmKGluZm89PW51bGwpewotICAgICAgICAgICAgaW5mbyA9IG5ldyBXU0luZm8oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZmlsZS5sYXN0TW9kaWZpZWQoKSwgZGVwbG95ZXIgLHR5cGUpOwotICAgICAgICAgICAgY3VycmVudEphcnMucHV0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGluZm8pOwotICAgICAgICAgICAgRGVwbG95bWVudEZpbGVEYXRhIGZpbGVEYXRhID0gbmV3IERlcGxveW1lbnRGaWxlRGF0YShmaWxlLCBkZXBsb3llcik7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmFkZFdTVG9EZXBsb3koZmlsZURhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiBhIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgY29tcGFyaW5nIHRoZSBsYXN0IHVwZGF0ZSBkYXRlIG9mCi0gICAgICogYm90aCBmaWxlcyBhbmQgV1NJbmZvLiBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHRoZSBmaWxlIGlzIGFzc3VtZWQgdG8gaGF2ZQotICAgICAqIGJlZW4gbW9kaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqIEBwYXJhbSB3c0luZm8KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllZChGaWxlIGZpbGUsIFdTSW5mbyB3c0luZm8pIHsKLSAgICAgICAgbG9uZyBjdXJyZW50VGltZVN0YW1wID0gd3NJbmZvLmdldExhc3RNb2RpZmllZERhdGUoKTsKLSAgICAgICAgCi0gICAgICAgIHNldExhc3RNb2RpZmllZERhdGUoZmlsZSwgd3NJbmZvKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoY3VycmVudFRpbWVTdGFtcCAhPSB3c0luZm8uZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPYnRhaW5zIHRoZSBuZXdlc3QgKGFzIGNvbXBhcmVkIHdpdGggdGltZXN0YW1wIHN0b3JlZCBpbiB3c0luZm8pCi0gICAgICogdGltZXN0YW1wIGFuZCBzdG9yZXMgaXQgaW4gV1NJbmZvLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TGFzdE1vZGlmaWVkRGF0ZShGaWxlIGZpbGUsIFdTSW5mbyB3c0luZm8pIHsKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZSBmaWxlcyBbXSA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlSXRlbSA9IGZpbGVzW2ldOwotICAgICAgICAgICAgICAgIGlmIChmaWxlSXRlbS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldExhc3RNb2RpZmllZERhdGUoZmlsZUl0ZW0sIHdzSW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYod3NJbmZvLmdldExhc3RNb2RpZmllZERhdGUoKSA8IGZpbGVJdGVtLmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzSW5mby5zZXRMYXN0TW9kaWZpZWREYXRlKGZpbGVJdGVtLmxhc3RNb2RpZmllZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih3c0luZm8uZ2V0TGFzdE1vZGlmaWVkRGF0ZSgpIDwgZmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgd3NJbmZvLnNldExhc3RNb2RpZmllZERhdGUoZmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXNvbHZlci9BQVJCYXNlZFdTRExMb2NhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXNvbHZlci9BQVJCYXNlZFdTRExMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDMyYWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvQUFSQmFzZWRXU0RMTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlc29sdmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5yZXNvbHZlci5EZWZhdWx0VVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQ3VzdG9tIFdTREwgbG9jYXRvciB0byBsb2FkIHNjaGVtYXMgZnJvbSB6aXAgYXJjaGl2ZXMKLSAqIE5lZWQgdG8gcHJvdmlkZSB0aGUgYWFyRmlsZSBhbmQgdGhlIGJhc2VJbnB1dFN0cmVhbSBmb3IKLSAqIHRoZSBiYXNlIFdTREwgZmlsZQotICogPHAvPgotICogVGhlIGxvZ2ljIGhlcmUgaXMgdGhhdCB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGltcG9ydCBsb2NhdGlvbgotICogYWxsIGltcG9ydHMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgTUVUQS1JTkYgZm9sZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBQVJCYXNlZFdTRExMb2NhdG9yIGV4dGVuZHMgRGVmYXVsdFVSSVJlc29sdmVyIGltcGxlbWVudHMgV1NETExvY2F0b3IsIFVSSVJlc29sdmVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkKLSAgICAgICAgICAgIC5nZXRMb2coQUFSQmFzZWRXU0RMTG9jYXRvci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEZpbGUgYWFyRmlsZTsKLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGJhc2VJbnB1dFN0cmVhbTsKLSAgICBwcml2YXRlIFVSSSBsYXN0SW1wb3J0TG9jYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVSSTsKLQotICAgIHB1YmxpYyBBQVJCYXNlZFdTRExMb2NhdG9yKFN0cmluZyBiYXNlVVJJLCBGaWxlIHppcEZpbGUsIElucHV0U3RyZWFtIGJhc2VJbnB1dFN0cmVhbSkgewotICAgICAgICB0aGlzLmJhc2VVUkkgPSBiYXNlVVJJOwotICAgICAgICB0aGlzLmJhc2VJbnB1dFN0cmVhbSA9IGJhc2VJbnB1dFN0cmVhbTsKLSAgICAgICAgdGhpcy5hYXJGaWxlID0gemlwRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgZ2V0QmFzZUlucHV0U291cmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGJhc2VJbnB1dFN0cmVhbSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmVudExvY2F0aW9uCi0gICAgICogQHBhcmFtIGltcG9ydExvY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIElucHV0U291cmNlIGdldEltcG9ydElucHV0U291cmNlKFN0cmluZyBwYXJlbnRMb2NhdGlvbiwgU3RyaW5nIGltcG9ydExvY2F0aW9uKSB7Ci0gICAgICAgIGxhc3RJbXBvcnRMb2NhdGlvbiA9IFVSSS5jcmVhdGUocGFyZW50TG9jYXRpb24pLnJlc29sdmUoaW1wb3J0TG9jYXRpb24pOwotCi0gICAgICAgIGlmIChpc0Fic29sdXRlKGltcG9ydExvY2F0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIGltcG9ydExvY2F0aW9uLCBwYXJlbnRMb2NhdGlvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3dlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHBhcmVudCBsb2NhdGlvbgotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhYXJGaWxlKSk7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgIGludCByZWFkOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlYXJjaGluZ1N0ciA9IGxhc3RJbXBvcnRMb2NhdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlOYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VhcmNoaW5nU3RyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gemluLnJlYWQoYnVmKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGluKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHppbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCJBQVJCYXNlZFdTRExMb2NhdG9yOiBVbmFibGUgdG8gcmVzb2x2ZSAiICsgbGFzdEltcG9ydExvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXMgZm9yIHRoZSB6aXAgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmV0dXJuaW5nCi0gICAgICogYSBiYXNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZQotICAgICAgICByZXR1cm4gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBsYXRlc3QgaW1wb3J0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXRlc3RJbXBvcnRVUkkoKSB7Ci0gICAgICAgIC8vd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGVpdGhlcgotICAgICAgICByZXR1cm4gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIC8vVE9ETzogRklYTUU6ICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBVUkkgcmVzb2x2ZVVSSShVUkkgdXJpKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBsYXN0SW1wb3J0TG9jYXRpb24gPSBVUkkuY3JlYXRlKGJhc2VVUkkpLnJlc29sdmUodXJpKTsKLQotICAgICAgICBpZiAoaXNBYnNvbHV0ZSh1cmkudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgYWJzb2x1dGVQYXRoID0gYWFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoImphcjpmaWxlOi8vIiArIGFic29sdXRlUGF0aCArICIhLyIgKyBsYXN0SW1wb3J0TG9jYXRpb24pOwotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmluZm8oIkFBUkJhc2VkV1NETExvY2F0b3I6IFVuYWJsZSB0byByZXNvbHZlICIgKyBsYXN0SW1wb3J0TG9jYXRpb24pOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL0FBUkZpbGVCYXNlZFVSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjAxYmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuRGVmYXVsdFVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgY3VzdG9tIFVSSSByZXNvbHZlciB0aGF0IGNhbgotICovCi1wdWJsaWMgY2xhc3MgQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIgZXh0ZW5kcyBEZWZhdWx0VVJJUmVzb2x2ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeQotICAgICAgICAgICAgLmdldExvZyhBQVJGaWxlQmFzZWRVUklSZXNvbHZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIEZpbGUgYWFyRmlsZTsKLSAgICBwcml2YXRlIFVSSSBsYXN0SW1wb3J0TG9jYXRpb247Ci0KLSAgICBwdWJsaWMgQUFSRmlsZUJhc2VkVVJJUmVzb2x2ZXIoRmlsZSBhYXJGaWxlKSB7Ci0gICAgICAgIHRoaXMuYWFyRmlsZSA9IGFhckZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uLAotICAgICAgICAgICAgU3RyaW5nIGJhc2VVcmkpIHsKLSAgICAgICAgLy9ubyBpc3N1ZSB3aXRoCi0gICAgICAgIGlmIChpc0Fic29sdXRlKHNjaGVtYUxvY2F0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkoCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hTG9jYXRpb24sIGJhc2VVcmkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICAgICAgaWYgKChiYXNlVXJpID09IG51bGwgfHwgIiIuZXF1YWxzKGJhc2VVcmkpKSAmJiBzY2hlbWFMb2NhdGlvbi5zdGFydHNXaXRoKCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgc2NoZW1hIGxvY2F0aW9uICIgKyBzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxhc3RJbXBvcnRMb2NhdGlvbiA9IFVSSS5jcmVhdGUoYmFzZVVyaSkucmVzb2x2ZShzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB6aW4gPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhYXJGaWxlKSk7Ci0KLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICAgICAgaW50IHJlYWQ7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VhcmNoaW5nU3RyID0gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuZXF1YWxzSWdub3JlQ2FzZShzZWFyY2hpbmdTdHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSB6aW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U29ydWNlID0gbmV3IElucHV0U291cmNlKGluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U29ydWNlLnNldFN5c3RlbUlkKGxhc3RJbXBvcnRMb2NhdGlvbi5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3J1Y2Uuc2V0UHVibGljSWQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFNvcnVjZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh6aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgemluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGxvZy5pbmZvKCJBQVJGaWxlQmFzZWRVUklSZXNvbHZlcjogVW5hYmxlIHRvIHJlc29sdmUiICsgbGFzdEltcG9ydExvY2F0aW9uKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvV2FyQmFzZWRXU0RMTG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvcmVzb2x2ZXIvV2FyQmFzZWRXU0RMTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDIzZTgzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL1dhckJhc2VkV1NETExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuRGVmYXVsdFVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETExvY2F0b3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgV2FyQmFzZWRXU0RMTG9jYXRvciBleHRlbmRzIERlZmF1bHRVUklSZXNvbHZlciBpbXBsZW1lbnRzIFdTRExMb2NhdG9yLCBVUklSZXNvbHZlciB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeQotICAgICAgICAgICAgLmdldExvZyhXYXJCYXNlZFdTRExMb2NhdG9yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gYmFzZUlucHV0U3RyZWFtOwotICAgIHByaXZhdGUgVVJJIGxhc3RJbXBvcnRMb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlVVJJOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgICBwdWJsaWMgV2FyQmFzZWRXU0RMTG9jYXRvcihTdHJpbmcgYmFzZVVSSSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gYmFzZUlucHV0U3RyZWFtKSB7Ci0gICAgICAgIHRoaXMuYmFzZVVSSSA9IGJhc2VVUkk7Ci0gICAgICAgIHRoaXMuYmFzZUlucHV0U3RyZWFtID0gYmFzZUlucHV0U3RyZWFtOwotICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U291cmNlIGdldEJhc2VJbnB1dFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShiYXNlSW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJlbnRMb2NhdGlvbgotICAgICAqIEBwYXJhbSBpbXBvcnRMb2NhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSBnZXRJbXBvcnRJbnB1dFNvdXJjZShTdHJpbmcgcGFyZW50TG9jYXRpb24sIFN0cmluZyBpbXBvcnRMb2NhdGlvbikgewotICAgICAgICBsYXN0SW1wb3J0TG9jYXRpb24gPSBVUkkuY3JlYXRlKHBhcmVudExvY2F0aW9uKS5yZXNvbHZlKGltcG9ydExvY2F0aW9uKTsKLQotICAgICAgICBpZiAoaXNBYnNvbHV0ZShpbXBvcnRMb2NhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXNvbHZlRW50aXR5KAotICAgICAgICAgICAgICAgICAgICBudWxsLCBpbXBvcnRMb2NhdGlvbiwgcGFyZW50TG9jYXRpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHNlYXJjaGluZ1N0ciA9IGxhc3RJbXBvcnRMb2NhdGlvbi50b1N0cmluZygpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHNlYXJjaGluZ1N0cikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXMgZm9yIHRoZSB6aXAgdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmV0dXJuaW5nCi0gICAgICogYSBiYXNlIFVSSQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZQotICAgICAgICByZXR1cm4gYmFzZVVSSTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHRoZSBsYXRlc3QgaW1wb3J0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXRlc3RJbXBvcnRVUkkoKSB7Ci0gICAgICAgIC8vd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGVpdGhlcgotICAgICAgICByZXR1cm4gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIC8vVE9ETzogRklYTUU6Ci0gICAgfQotCi0gICAgcHVibGljIFVSSSByZXNvbHZlVVJJKFVSSSB1cmkpIHRocm93cyBXU0RMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGlzQWJzb2x1dGUodXJpLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXJpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGFzdEltcG9ydExvY2F0aW9uID0gVVJJLmNyZWF0ZShiYXNlVVJJKS5yZXNvbHZlKHVyaS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZyBzZWFyY2hpbmdTdHIgPSBsYXN0SW1wb3J0TG9jYXRpb24udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFVSTCByZXNvdXJjZSA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlKHNlYXJjaGluZ1N0cik7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHJlc291cmNlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJBQVJCYXNlZFdTRExMb2NhdG9yOiBVbmFibGUgdG8gcmVzb2x2ZSAiICsgbGFzdEltcG9ydExvY2F0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL1dhckZpbGVCYXNlZFVSSVJlc29sdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9yZXNvbHZlci9XYXJGaWxlQmFzZWRVUklSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY2ZmY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3Jlc29sdmVyL1dhckZpbGVCYXNlZFVSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEucmVzb2x2ZXIuRGVmYXVsdFVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1wdWJsaWMgY2xhc3MgV2FyRmlsZUJhc2VkVVJJUmVzb2x2ZXIgZXh0ZW5kcyBEZWZhdWx0VVJJUmVzb2x2ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeQotICAgICAgICAgICAgLmdldExvZyhXYXJGaWxlQmFzZWRVUklSZXNvbHZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgcHVibGljIFdhckZpbGVCYXNlZFVSSVJlc29sdmVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgYmFzZVVyaSkgewotICAgICAgICAvL25vIGlzc3VlIHdpdGgKLSAgICAgICAgaWYgKGlzQWJzb2x1dGUoc2NoZW1hTG9jYXRpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbiwgYmFzZVVyaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgICAgICBpZiAoKGJhc2VVcmkgPT0gbnVsbCB8fCAiIi5lcXVhbHMoYmFzZVVyaSkpICYmIHNjaGVtYUxvY2F0aW9uLnN0YXJ0c1dpdGgoIi4uIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBzY2hlbWEgbG9jYXRpb24gIiArIHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVVJJIGxhc3RJbXBvcnRMb2NhdGlvbiA9IFVSSS5jcmVhdGUoYmFzZVVyaSkucmVzb2x2ZShzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICBTdHJpbmcgc2VhcmNoaW5nU3RyID0gbGFzdEltcG9ydExvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oc2VhcmNoaW5nU3RyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3NjaGVkdWxlci9EZXBsb3ltZW50SXRlcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3NjaGVkdWxlci9EZXBsb3ltZW50SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyZmFjMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9zY2hlZHVsZXIvRGVwbG95bWVudEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnNjaGVkdWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRJdGVyYXRvciB7Ci0gICAgcHJpdmF0ZSBDYWxlbmRhciBjYWxlbmRhciA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0KLSAgICBwdWJsaWMgRGF0ZSBuZXh0KCkgewotICAgICAgICBjYWxlbmRhci5hZGQoQ2FsZW5kYXIuU0VDT05ELCAxMCk7Ci0KLSAgICAgICAgcmV0dXJuIGNhbGVuZGFyLmdldFRpbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9zY2hlZHVsZXIvU2NoZWR1bGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9zY2hlZHVsZXIvU2NoZWR1bGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjhjM2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvc2NoZWR1bGVyL1NjaGVkdWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFNjaGVkdWxlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaW1lciB0aW1lciA9IChUaW1lcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVyKHRydWUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzY2hlZHVsZShTY2hlZHVsZXJUYXNrIHNjaGVkdWxlclRhc2ssIERlcGxveW1lbnRJdGVyYXRvciBpdGVyYXRvcikgewotICAgICAgICBEYXRlIHRpbWUgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKHRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZWR1bGVyVGFzay5jYW5jZWwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2NoZWR1bGVyVGFzay5sb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlclRhc2suc3RhdGUgIT0gU2NoZWR1bGVyVGFzay5DQU5DRUxMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyVGFzay50aW1lclRhc2sgPSBuZXcgU2NoZWR1bGVyVGltZXJUYXNrKHNjaGVkdWxlclRhc2ssIGl0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZXIuc2NoZWR1bGUoc2NoZWR1bGVyVGFzay50aW1lclRhc2ssIHRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNjaGVkdWxlcyB0aGUgc3BlY2lmaWVkIHRhc2sgZm9yIGV4ZWN1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzY2hlZHVsZS4KLSAgICAgKiBJZiB0aW1lcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPlNjaGVkdWxlSXRlcmF0b3I8L2NvZGU+IGFyZSBpbiB0aGUgcGFzdCB0aGV5IGFyZQotICAgICAqIHNjaGVkdWxlZCBmb3IgaW1tZWRpYXRlIGV4ZWN1dGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlZHVsZXJUYXNrIHRhc2sgdG8gYmUgc2NoZWR1bGVkCi0gICAgICogQHBhcmFtIGl0ZXJhdG9yICAgICAgaXRlcmF0b3IgdGhhdCBkZXNjcmliZXMgdGhlIHNjaGVkdWxlCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQgb3IgY2FuY2VsbGVkLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlciB3YXMgY2FuY2VsbGVkLCBvciBzY2hlZHVsZXIgdGhyZWFkIHRlcm1pbmF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGUoU2NoZWR1bGVyVGFzayBzY2hlZHVsZXJUYXNrLCBEZXBsb3ltZW50SXRlcmF0b3IgaXRlcmF0b3IpIHsKLSAgICAgICAgRGF0ZSB0aW1lID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIGlmICh0aW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVkdWxlclRhc2suY2FuY2VsKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNjaGVkdWxlclRhc2subG9jaykgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlclRhc2suc3RhdGUgPSBTY2hlZHVsZXJUYXNrLlNDSEVEVUxFRDsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZXJUYXNrLnRpbWVyVGFzayA9IG5ldyBTY2hlZHVsZXJUaW1lclRhc2soc2NoZWR1bGVyVGFzaywgaXRlcmF0b3IpOwotICAgICAgICAgICAgICAgIHRpbWVyLnNjaGVkdWxlKHNjaGVkdWxlclRhc2sudGltZXJUYXNrLCB0aW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKXsKLSAgICAgICAgdGltZXIuY2FuY2VsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFNjaGVkdWxlclRpbWVyVGFzayBleHRlbmRzIFRpbWVyVGFzayB7Ci0gICAgICAgIHByaXZhdGUgRGVwbG95bWVudEl0ZXJhdG9yIGl0ZXJhdG9yOwotICAgICAgICBwcml2YXRlIFNjaGVkdWxlclRhc2sgc2NoZWR1bGVyVGFzazsKLQotICAgICAgICBwdWJsaWMgU2NoZWR1bGVyVGltZXJUYXNrKFNjaGVkdWxlclRhc2sgc2NoZWR1bGVyVGFzaywgRGVwbG95bWVudEl0ZXJhdG9yIGl0ZXJhdG9yKSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVkdWxlclRhc2sgPSBzY2hlZHVsZXJUYXNrOwotICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc2NoZWR1bGVyVGFzay5ydW4oKTsKLSAgICAgICAgICAgIHJlc2NoZWR1bGUoc2NoZWR1bGVyVGFzaywgaXRlcmF0b3IpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvc2NoZWR1bGVyL1NjaGVkdWxlclRhc2suamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3NjaGVkdWxlci9TY2hlZHVsZXJUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzU1YTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvc2NoZWR1bGVyL1NjaGVkdWxlclRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlJlcG9zaXRvcnlMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlZHVsZXJUYXNrIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NIRURVTEVEID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBTkNFTExFRCA9IDI7Ci0gICAgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgaW50IHN0YXRlID0gMDsKLSAgICBUaW1lclRhc2sgdGltZXJUYXNrOwotICAgIHByaXZhdGUgUmVwb3NpdG9yeUxpc3RlbmVyIHdzTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHNjaGVkdWxlciB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyBTY2hlZHVsZXJUYXNrKFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICB0aGlzLndzTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIHRoaXMgc2NoZWR1bGVyIHRhc2suCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgcmVwZWF0ZWRseTsgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjYWxscyBoYXZlIG5vIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoaXMgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQgdG8gcnVuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICBpZiAodGltZXJUYXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aW1lclRhc2suY2FuY2VsKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gKHN0YXRlID09IFNDSEVEVUxFRCk7Ci0KLSAgICAgICAgICAgIHN0YXRlID0gQ0FOQ0VMTEVEOwotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVwb3NpdG9yeSgpIHsKLSAgICAgICAgd3NMaXN0ZW5lci5zdGFydExpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgYnkgdGhpcyBzY2hlZHVsZXIgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGNoZWNrUmVwb3NpdG9yeSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvQmVhbkV4Y2x1ZGVJbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0JlYW5FeGNsdWRlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk1ODI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvQmVhbkV4Y2x1ZGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBrZWVwIHRoZSBleGNsdWRlUHJvcGVydGllcyBhbmQgaW5jbHVkZVByb3BlcnRlcwotICogb2YgdGhlIGdpdmVuIGJlYW4gd2hlbiBnZW5lcmF0aW5nIHRoZSB3c2RsLCBhbmQgc2VyaWFsaXppbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuRXhjbHVkZUluZm8gewotCi0gICAgLy8gZXhjbHVkZSBwcm9wZXJ0eSBsaXN0IGdpdmVuIGFzIGEgcmVndWFsYXIgZXhwcmVzc2lvbgotICAgIC8vIGJ1dCB3ZSBleGNsdWRlIHRoaXMgcHJvcGVydHkgb25seSBpZiBpdCBpcyBub3QgYXZhaWxhYmxlCi0gICAgLy8gaW4gdGhlIGluY2x1ZGUgcHJvcGVydGllcyBsaXN0Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZXhjbHVkZVByb3BlcnRpZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5jbHVkZVByb3BlcnRpZXM7Ci0KLSAgICBwdWJsaWMgQmVhbkV4Y2x1ZGVJbmZvKFN0cmluZyBleGNsdWRlUHJvcGVydGllcywgU3RyaW5nIGluY2x1ZGVQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZVByb3BlcnRpZXMgPSBleGNsdWRlUHJvcGVydGllczsKLSAgICAgICAgdGhpcy5pbmNsdWRlUHJvcGVydGllcyA9IGluY2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjbHVkZVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBleGNsdWRlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlUHJvcGVydGllcyhTdHJpbmcgZXhjbHVkZVByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5leGNsdWRlUHJvcGVydGllcyA9IGV4Y2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZVByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlUHJvcGVydGllcyhTdHJpbmcgaW5jbHVkZVByb3BlcnRpZXMpIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlUHJvcGVydGllcyA9IGluY2x1ZGVQcm9wZXJ0aWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGEgcHJvcGVydHkgaXMgZXhjbHVkZWQgaWYgaXQgdGhzIGdpdmVuIGluIHRoZSBleGNsdWRlIGxpc3QKLSAgICAgKiBidXQgbm90IGluIGluY2x1ZGUgbGlzdAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gaXMgZXhjbHVkZSB0aGUgcHJvcGVydHkgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSl7Ci0gICAgICAgYm9vbGVhbiBpc0V4Y2x1ZGUgPSBmYWxzZTsKLSAgICAgICBpZiAoKGV4Y2x1ZGVQcm9wZXJ0aWVzICE9IG51bGwpICYmIChleGNsdWRlUHJvcGVydGllcy50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgIGlmIChwcm9wZXJ0eS5tYXRjaGVzKGV4Y2x1ZGVQcm9wZXJ0aWVzKSl7Ci0gICAgICAgICAgICAgICBpc0V4Y2x1ZGUgPSB0cnVlOwotICAgICAgICAgICAgICAgaWYgKChpbmNsdWRlUHJvcGVydGllcyAhPSBudWxsKSAmJiAoaW5jbHVkZVByb3BlcnRpZXMudHJpbSgpLmxlbmd0aCgpID4gMCkpewotICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5tYXRjaGVzKGluY2x1ZGVQcm9wZXJ0aWVzKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlzRXhjbHVkZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gaXNFeGNsdWRlOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0V4Y2x1ZGVJbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL0V4Y2x1ZGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWM2OWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9FeGNsdWRlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBrZWVwIHRoZSBleGNsdWRlIHByb3BlcnR5IGRldGFpbHMgb2YgYWxsIHRoZSBjbGFzc2VzLgotICogQSBtYXAgb2JqZWN0IGlzIHVzZWQgdG8gbWFwIHRoZSBjbGFzcyBuYW1lIHRvIGFuIGJlYW5JbmZvIG9iamVjdC4gaGVyZSB0aGUgY2xhc3MgbmFtZSBpcwotICogYWNjdHVhbGx5IGEgcmVndWxhciBleHByZXNzaW9uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhjbHVkZUluZm8gewotCi0gICAgcHJpdmF0ZSBNYXAgY2xhc3NOYW1lVG9CZWFuSW5mb01hcDsKLQotICAgIHB1YmxpYyBFeGNsdWRlSW5mbygpIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUb0JlYW5JbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRCZWFuSW5mbyhTdHJpbmcgY2xhc3NOYW1lUmVneCxCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvKXsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUb0JlYW5JbmZvTWFwLnB1dChjbGFzc05hbWVSZWd4LGJlYW5FeGNsdWRlSW5mbyk7Ci0gICAgfQotCi0gICAgcHVibGljIEJlYW5FeGNsdWRlSW5mbyBnZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKXsKLSAgICAgICAgLy8gaGVyZSBtYXAga2V5cyByZXByZXNlbnRzIHRoZSByZWd1YWxyIGV4cHJlc3Npb25zIGZvciBjbGFzcyBuYW1lcwotICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUga2V5cyBhbmQgZmluZCB0aGUgYmVhbkluZm8gb2JqZWN0Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWVSZWd4ID0gbnVsbDsKLSAgICAgICAgQmVhbkV4Y2x1ZGVJbmZvIGJlYW5FeGNsdWRlSW5mbyA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuY2xhc3NOYW1lVG9CZWFuSW5mb01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgIGNsYXNzTmFtZVJlZ3ggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lLm1hdGNoZXMoY2xhc3NOYW1lUmVneCkpewotICAgICAgICAgICAgICAgICBiZWFuRXhjbHVkZUluZm8gPSAoQmVhbkV4Y2x1ZGVJbmZvKSB0aGlzLmNsYXNzTmFtZVRvQmVhbkluZm9NYXAuZ2V0KGNsYXNzTmFtZVJlZ3gpOwotICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGhhdmUgZmluZCB0aGUgcmVxdWlyZWQgb2JqZWN0Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmVhbkV4Y2x1ZGVJbmZvOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9QaGFzZXNJbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL1BoYXNlc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNjVkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC91dGlsL1BoYXNlc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVycm9yTXNnczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotCi1wdWJsaWMgY2xhc3MgUGhhc2VzSW5mbyB7Ci0gICAgcHJpdmF0ZSBMaXN0PFBoYXNlPiBJTlBoYXNlczsKLSAgICBwcml2YXRlIExpc3Q8UGhhc2U+IElOX0ZhdWx0UGhhc2VzOwotICAgIHByaXZhdGUgTGlzdDxQaGFzZT4gT1VUUGhhc2VzOwotICAgIHByaXZhdGUgTGlzdDxQaGFzZT4gT1VUX0ZhdWx0UGhhc2VzOwotCi0gICAgcHVibGljIFBoYXNlc0luZm8oKSB7Ci0gICAgICAgIElOUGhhc2VzID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgSU5fRmF1bHRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBPVVRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBPVVRfRmF1bHRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGNvcHkgcGhhc2UgaW5mb3JtYXRpb24gZnJvbSBvbmUgdG8gYW5vdGhlcgotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBQaGFzZSBjb3B5UGhhc2UoUGhhc2UgcGhhc2UpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgUGhhc2UgbmV3UGhhc2UgPSBuZXcgUGhhc2UocGhhc2UuZ2V0UGhhc2VOYW1lKCkpOwotICAgICAgICBJdGVyYXRvcjxIYW5kbGVyPiBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaGFuZGxlcnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlckRlc2NyaXB0aW9uID0gKEhhbmRsZXIpIGhhbmRsZXJzLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIG5ld1BoYXNlLmFkZEhhbmRsZXIoaGFuZGxlckRlc2NyaXB0aW9uLmdldEhhbmRsZXJEZXNjKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld1BoYXNlOwotICAgIH0KLQotICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBtYWtlSGFuZGxlcihPTUVsZW1lbnQgaGFuZGxlckVsZW1lbnQpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBoYW5kbGVyRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoIm5hbWUiKSk7Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gaGFuZGxlckVsZW1lbnQucmVzb2x2ZVFOYW1lKG5hbWUpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gZGVzYyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24ocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gaGFuZGxlckVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKCJjbGFzcyIpKTsKLQotICAgICAgICBkZXNjLnNldENsYXNzTmFtZShjbGFzc05hbWUpOwotCi0gICAgICAgIHJldHVybiBkZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZSBtYWtlUGhhc2UoT01FbGVtZW50IHBoYXNlRWxlbWVudCkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoIm5hbWUiKSk7Ci0gICAgICAgIFBoYXNlIHBoYXNlID0gbmV3IFBoYXNlKHBoYXNlTmFtZSk7Ci0gICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuID0gcGhhc2VFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLQotICAgICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgaGFuZGxlckVsZW1lbnQgPSAoT01FbGVtZW50KSBjaGlsZHJlbi5uZXh0KCk7Ci0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlckRlc2MgPSBtYWtlSGFuZGxlcihoYW5kbGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGFuZGxlckRlc2MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBoYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRHbG9iYWxJbmZsb3coKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gZ2xvYmFscGhhc2UgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBib29sZWFuIGZvdW5kRGlzcGF0Y2hQaGFzZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgSU5QaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFmb3VuZERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9ESVNQQVRDSC5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZERpc3BhdGNoUGhhc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbG9iYWxwaGFzZS5hZGQocGhhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmREaXNwYXRjaFBoYXNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLkRJU1BBVENIX1BIQVNFX05PVF9GT1VORCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnbG9iYWxwaGFzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQaGFzZT4gZ2V0R2xvYmFsT3V0UGhhc2VMaXN0KCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICAvKioKLSAgICAgICAgICogSSBoYXZlIGFzc3VtZWQgdGhhdCAgICAgUG9saWN5RGV0ZXJtaW5hdGlvbiBhbmQgIE1lc3NhZ2VQcm9jZXNzaW5nIGFyZSBnbG9iYWwgb3V0IHBoYXNlCi0gICAgICAgICAqLwotICAgICAgICBBcnJheUxpc3Q8UGhhc2U+IGdsb2JhbFBoYXNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGhhc2U+KCk7Ci0KLSAgICAgICAgYm9vbGVhbiBtZXNzYWdlT3V0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1VUUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgT1VUUGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZU5hbWUgPSBwaGFzZS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICghbWVzc2FnZU91dCkgewotICAgICAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX01FU1NBR0VfT1VULmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VPdXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBnbG9iYWxQaGFzZUxpc3QuYWRkKGNvcHlQaGFzZShwaGFzZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2xvYmFsUGhhc2VMaXN0LmFkZChjb3B5UGhhc2UocGhhc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2xvYmFsUGhhc2VMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRJTlBoYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIElOUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRJTl9GYXVsdFBoYXNlcygpIHsKLSAgICAgICAgcmV0dXJuIElOX0ZhdWx0UGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRPVVRQaGFzZXMoKSB7Ci0gICAgICAgIHJldHVybiBPVVRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldE91dEZhdWx0UGhhc2VMaXN0KCl7Ci0gICAgICAgIHJldHVybiBPVVRfRmF1bHRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldE9VVF9GYXVsdFBoYXNlcygpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgQXJyYXlMaXN0PFBoYXNlPiBnbG9iYWxQaGFzZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBib29sZWFuIG1lc3NhZ2VPdXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPVVRfRmF1bHRQaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBPVVRfRmF1bHRQaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKCFtZXNzYWdlT3V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfTUVTU0FHRV9PVVQuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZU91dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbFBoYXNlTGlzdC5hZGQoY29weVBoYXNlKHBoYXNlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnbG9iYWxQaGFzZUxpc3QuYWRkKGNvcHlQaGFzZShwaGFzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnbG9iYWxQaGFzZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldE9wZXJhdGlvbkluRmF1bHRQaGFzZXMoKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gb3BlcmF0aW9uSU5QaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBib29sZWFuIGZvdW5kRGlzcGF0aFBoYXNlID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5fRmF1bHRQaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBJTl9GYXVsdFBoYXNlcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGhhc2VOYW1lID0gcGhhc2UuZ2V0UGhhc2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZm91bmREaXNwYXRoUGhhc2UpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25JTlBoYXNlcy5hZGQoY29weVBoYXNlKHBoYXNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUGhhc2VNZXRhZGF0YS5QSEFTRV9ESVNQQVRDSC5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGZvdW5kRGlzcGF0aFBoYXNlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3BlcmF0aW9uSU5QaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UGhhc2U+IGdldEdsb2JhbEluRmF1bHRQaGFzZXMoKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gZ2xvYmFsSW5mYXVsdHBoYXNlID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZERpc3BhdGNoUGhhc2UgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTl9GYXVsdFBoYXNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIElOX0ZhdWx0UGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZU5hbWUgPSBwaGFzZS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICghZm91bmREaXNwYXRjaFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfRElTUEFUQ0guZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmREaXNwYXRjaFBoYXNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xvYmFsSW5mYXVsdHBoYXNlLmFkZChwaGFzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZERpc3BhdGNoUGhhc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuRElTUEFUQ0hfUEhBU0VfTk9UX0ZPVU5EKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdsb2JhbEluZmF1bHRwaGFzZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGhhc2U+IGdldE9wZXJhdGlvbkluUGhhc2VzKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8UGhhc2U+IG9wZXJhdGlvbklOUGhhc2VzID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZERpc3BhdGhQaGFzZSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgSU5QaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKGZvdW5kRGlzcGF0aFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uSU5QaGFzZXMuYWRkKGNvcHlQaGFzZShwaGFzZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfRElTUEFUQ0guZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBmb3VuZERpc3BhdGhQaGFzZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbklOUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGhhc2U+IGdldE9wZXJhdGlvbk91dEZhdWx0UGhhc2VzKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Q8UGhhc2U+IG9wZXJhdGlvbkZhdWx0T3V0UGhhc2VzID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPVVRfRmF1bHRQaGFzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBPVVRfRmF1bHRQaGFzZXMuZ2V0KGkpOwotICAgICAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHBoYXNlLmdldFBoYXNlTmFtZSgpOwotICAgICAgICAgICAgaWYgKFBoYXNlTWV0YWRhdGEuUEhBU0VfTUVTU0FHRV9PVVQuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wZXJhdGlvbkZhdWx0T3V0UGhhc2VzLmFkZChjb3B5UGhhc2UocGhhc2UpKTsKLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25GYXVsdE91dFBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFBoYXNlPiBnZXRPcGVyYXRpb25PdXRQaGFzZXMoKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdDxQaGFzZT4gb3ByYXRpb25PVVRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1VUUGhhc2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgT1VUUGhhc2VzLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwaGFzZU5hbWUgPSBwaGFzZS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChQaGFzZU1ldGFkYXRhLlBIQVNFX01FU1NBR0VfT1VULmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcHJhdGlvbk9VVFBoYXNlcy5hZGQoY29weVBoYXNlKHBoYXNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gb3ByYXRpb25PVVRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SU5QaGFzZXMoTGlzdDxQaGFzZT4gSU5QaGFzZXMpIHsKLSAgICAgICAgdGhpcy5JTlBoYXNlcyA9IElOUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElOX0ZhdWx0UGhhc2VzKExpc3Q8UGhhc2U+IElOX0ZhdWx0UGhhc2VzKSB7Ci0gICAgICAgIHRoaXMuSU5fRmF1bHRQaGFzZXMgPSBJTl9GYXVsdFBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPVVRQaGFzZXMoTGlzdDxQaGFzZT4gT1VUUGhhc2VzKSB7Ci0gICAgICAgIHRoaXMuT1VUUGhhc2VzID0gT1VUUGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9VVF9GYXVsdFBoYXNlcyhMaXN0PFBoYXNlPiBPVVRfRmF1bHRQaGFzZXMpIHsKLSAgICAgICAgdGhpcy5PVVRfRmF1bHRQaGFzZXMgPSBPVVRfRmF1bHRQaGFzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uUGhhc2VzKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coZ2V0T3BlcmF0aW9uSW5QaGFzZXMoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRQaGFzZXNPdXRGbG93KGdldE9wZXJhdGlvbk91dFBoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFBoYXNlc0luRmF1bHRGbG93KG5ldyBBcnJheUxpc3QoZ2V0T3BlcmF0aW9uSW5GYXVsdFBoYXNlcygpKSk7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRQaGFzZXNPdXRGYXVsdEZsb3coZ2V0T3BlcmF0aW9uT3V0RmF1bHRQaGFzZXMoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9UZW1wRmlsZU1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvVGVtcEZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2ZlZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9UZW1wRmlsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLS8qKg0KLSAqIEdlbmVyYXRlcyBhbmQgcHJvcGVybHkgY2xlYW5zIHVwIHRlbXBvcmFyeSBmaWxlcy4gU2ltaWxhciB0byB7QGxpbmsNCi0gKiBGaWxlI2NyZWF0ZVRlbXBGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpfSwgdGhpcyBjbGFzcyBwcm92aWRlcyBhIHN0YXRpYyBtZXRob2QgdG8NCi0gKiBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzLiBUaGUgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgY3JlYXRlZCBpbiBhIHNwZWNpYWwgZGlyZWN0b3J5IHRvIGJlIGNsZWFuZWQNCi0gKiB1cCB0aGUgbmV4dCB0aW1lIHRoaXMgY2xhc3MgaXMgbG9hZGVkIGJ5IHRoZSBKVk0uIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyByZXF1aXJlZCBiZWNhdXNlIFdpbjMyDQotICogcGxhdGZvcm1zIHdpbGwgbm90IGFsbG93IHRoZSBKVk0gdG8gZGVsZXRlIGZpbGVzIHRoYXQgYXJlIG9wZW4uIFRoaXMgY2F1c2VzIHByb2JsZW1zIHdpdGggaXRlbXMNCi0gKiBzdWNoIGFzIEpBUnMgdGhhdCBnZXQgb3BlbmVkIGJ5IGEgVVJMQ2xhc3NMb2FkZXIgYW5kIGNhbiB0aGVyZWZvcmUgbm90IGJlIGRlbGV0ZWQgYnkgdGhlIEpWTQ0KLSAqIChpbmNsdWRpbmcgZGVsZXRlT25FeGl0KS4NCi0gKiA8cC8+DQotICogVGhlIGNhbGxlciBzaG91bGQgbm90IG5lZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlLiBTaW1wbHkNCi0gKiB1c2UgdGhlIHN0YXRpYyBtZXRob2RzIHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIG9wZXJhdGlvbnMuIE5vdGUgdGhhdCBhbGwgZmlsZXMgY3JlYXRlZCBieSB0aGlzDQotICogY2xhc3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgZGVsZXRlZCBhdCBKVk0gZXhpdCAoYWx0aG91Z2ggdGhlIGFjdHVhbCBkZWxldGlvbiBtYXkgYmUgZGVsYXllZCkuDQotICogSWYgcGVyc2lzdGVudCB0ZW1wb3JhcnkgZmlsZXMgYXJlIHJlcXVpcmVkLCB1c2Uge0BsaW5rIGphdmEuaW8uRmlsZX0gaW5zdGVhZC4NCi0gKiA8cC8+DQotICogUmVmZXIgdG8gU3VuIGJ1Z3MgNDE3MTIzOSBhbmQgNDk1MDE0OCBmb3IgbW9yZSBkZXRhaWxzLg0KLSAqIDxwLz4NCi0gKiBUaGFua3MgdG8gTWlrZSBQaWxvbmUgZm9yIHRoaXMgY29kZSwgd2hpY2ggd2FzIHNvdXJjZWQgZnJvbQ0KLSAqIGh0dHA6Ly93d3cuZGV2eC5jb20vSmF2YS9BcnRpY2xlLzIyMDE4LyBhbmQgY29udHJpYnV0ZWQgdG8gQXBhY2hlLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBUZW1wRmlsZU1hbmFnZXIgew0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5IHRvIGFsbG93IGZvciBjbGVhbnVwIGFmdGVyIGV4ZWN1dGlvbi4gVGhpcw0KLSAgICAgKiBtZXRob2QgZGVsZWdhdGVzIHRvIHtAbGluayBGaWxlI2NyZWF0ZVRlbXBGaWxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsDQotICAgICAqIGphdmEuaW8uRmlsZSl9IHNvIHJlZmVyIHRvIGl0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uIEFueSBmaWxlIGNyZWF0ZWQgdXNpbmcgdGhpcyBtZXRob2Qgc2hvdWxkDQotICAgICAqIGJlIGNvbnNpZGVyZWQgYXMgZGVsZXRlZCBhdCBKVk0gZXhpdDsgdGhlcmVmb3JlLCBkbyBub3QgdXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBmaWxlcyB0aGF0DQotICAgICAqIG5lZWQgdG8gYmUgcGVyc2lzdGVudCBiZXR3ZWVuIGFwcGxpY2F0aW9uIHJ1bnMuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBzdHJpbmcgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBmaWxlIG5hbWU7IG11c3QgYmUgYXQgbGVhc3QgdGhyZWUNCi0gICAgICogICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGxvbmcNCi0gICAgICogQHBhcmFtIHN1ZmZpeCB0aGUgc3VmZml4IHN0cmluZyB0byBiZSB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIGZpbGUncyBuYW1lOyBtYXkgYmUgbnVsbCwgaW4gd2hpY2gNCi0gICAgICogICAgICAgICAgICAgICBjYXNlIHRoZSBzdWZmaXggIi50bXAiIHdpbGwgYmUgdXNlZA0KLSAgICAgKiBAcmV0dXJuIGFuIGFic3RyYWN0IHBhdGhuYW1lIGRlbm90aW5nIGEgbmV3bHkgY3JlYXRlZCBlbXB0eSBmaWxlDQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkDQotICAgICAqLw0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQifSkNCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBGaWxlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgpDQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB5b3UgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkIGEgdGVtcCBkaXJlY3RvcnkNCi0gICAgICAgIC8vIGZvciB0aGlzIGNsYXNzLg0KLSAgICAgICAgaWYgKHNUbXBEaXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vIEluaXRpYWxpemUgeW91ciB0ZW1wIGRpcmVjdG9yeS4gWW91IHVzZSB0aGUgamF2YSB0ZW1wIGRpcmVjdG9yeQ0KLSAgICAgICAgICAgIC8vIHByb3BlcnR5LCBzbyB5b3UgYXJlIHN1cmUgdG8gZmluZCB0aGUgZmlsZXMgb24gdGhlIG5leHQgcnVuLg0KLSAgICAgICAgICAgIFN0cmluZyB0bXBEaXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOw0KLSAgICAgICAgICAgIEZpbGUgdG1wRGlyID0gRmlsZS5jcmVhdGVUZW1wRmlsZShURU1QX0RJUl9QUkVGSVgsICIudG1wIiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodG1wRGlyTmFtZSkpOw0KLQ0KLSAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgZmlsZSBpZiBvbmUgd2FzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0aGUgSlZNLg0KLSAgICAgICAgICAgIC8vIFlvdSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGFzIGEgZGlyZWN0b3J5IG5hbWUsDQotICAgICAgICAgICAgLy8gc28geW91IGRvIG5vdCB3YW50IHRoZSBmaWxlIGxheWluZyBhcm91bmQuDQotICAgICAgICAgICAgdG1wRGlyLmRlbGV0ZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGxvY2sgYmVmb3JlIGNyZWF0aW5nIHRoZSBkaXJlY3Rvcnkgc28NCi0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbiB3aXRoIGFub3RoZXIgYXBwbGljYXRpb24gdHJ5aW5nDQotICAgICAgICAgICAgLy8gdG8gY2xlYW4geW91ciB0ZW1wIGRpci4NCi0gICAgICAgICAgICBGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUodG1wRGlyTmFtZSwgdG1wRGlyLmdldE5hbWUoKSArICIubGNrIik7DQotICAgICAgICAgICAgbG9ja0ZpbGUuY3JlYXRlTmV3RmlsZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIFNldCB0aGUgbG9jayBmaWxlIHRvIGRlbGV0ZSBvbiBleGl0IHNvIGl0IGlzIHByb3Blcmx5IGNsZWFuZWQNCi0gICAgICAgICAgICAvLyBieSB0aGUgSlZNLiBUaGlzIHdpbGwgYWxsb3cgdGhlIFRlbXBGaWxlTWFuYWdlciB0byBjbGVhbg0KLSAgICAgICAgICAgIC8vIHRoZSBvdmVyYWxsIHRlbXAgZGlyZWN0b3J5IG5leHQgdGltZS4NCi0gICAgICAgICAgICBsb2NrRmlsZS5kZWxldGVPbkV4aXQoKTsNCi0NCi0gICAgICAgICAgICAvLyBNYWtlIGEgdGVtcCBkaXJlY3RvcnkgdGhhdCB5b3Ugd2lsbCB1c2UgZm9yIGFsbCBmdXR1cmUgcmVxdWVzdHMuDQotICAgICAgICAgICAgaWYgKCF0bXBEaXIubWtkaXJzKCkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3Rvcnk6Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0bXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzVG1wRGlyID0gdG1wRGlyOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gR2VuZXJhdGUgYSB0ZW1wIGZpbGUgZm9yIHRoZSB1c2VyIGluIHlvdXIgdGVtcCBkaXJlY3RvcnkNCi0gICAgICAgIC8vIGFuZCByZXR1cm4gaXQuDQotICAgICAgICByZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCwgc1RtcERpcik7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGxvYWQgdGhlIFRlbXBGaWxlTWFuYWdlciBhdCBhbnkgdGltZSBhbmQgYWxsb3cgaXQgdG8gY2xlYW4gdGhlIHRlbXBvcmFyeQ0KLSAgICAgKiBmaWxlcyB0aGF0IG1heSBiZSBsZWZ0IGZyb20gcHJldmlvdXMgaW5zdGFuY2VzDQotICAgICAqDQotICAgICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotICAgICAgICAvLyBBbHRob3VnaCB0aGUgSlZNIHdpbGwgbG9hZCB0aGUgY2xhc3MgaW4gb3JkZXIgdG8NCi0gICAgICAgIC8vIHJ1biB0aGUgbWFpbiBtZXRob2QsIHRoaXMgZ2l2ZXMgYSBsaXR0bGUgY2xhcml0eSB0bw0KLSAgICAgICAgLy8gd2hhdCBpcyBoYXBwZW5pbmcgYW5kIHdoeSB3ZSB3YW50IHRoZSBtYWluIG1ldGhvZC4NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGxvYWQgdGhlIFRlbXBGaWxlTWFuYWdlciwgd2hpY2ggd2lsbA0KLSAgICAgICAgICAgIC8vIGNhdXNlIHRoZSBzdGF0aWMgYmxvY2sgdG8gZXhlY3V0ZSwgY2xlYW5pbmcNCi0gICAgICAgICAgICAvLyBhbnkgb2xkIHRlbXAgZmlsZXMuDQotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShUZW1wRmlsZU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIERlbGV0ZXMgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBhbnkgc3ViIGRpcmVjdG9yaWVzIGZvdW5kLiBBbHNvDQotICAgICAqIGRlbGV0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5Lg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcm9vdERpciB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gYmUgcmVjdXJzaXZlbHkgZGVsZXRlZA0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBmaWxlIG9yIGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgZGVsZXRlZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWN1cnNpdmVEZWxldGUoRmlsZSByb290RGlyKQ0KLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICAvLyBTZWxlY3QgYWxsIHRoZSBmaWxlcw0KLSAgICAgICAgRmlsZVtdIGZpbGVzID0gcm9vdERpci5saXN0RmlsZXMoKTsNCi0gICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpIHsNCi0gICAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgd2Ugd2lsbA0KLSAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGNhbGwgZGVsZXRlIG9uIGl0Lg0KLSAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsNCi0gICAgICAgICAgICAgICAgcmVjdXJzaXZlRGVsZXRlKGZpbGUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIEl0IGlzIGp1c3QgYSBmaWxlIHNvIHdlIGFyZSBzYWZlIHRvDQotICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBpdA0KLSAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZGVsZXRlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gRmluYWxseSwgZGVsZXRlIHRoZSByb290IGRpcmVjdG9yeSBub3cNCi0gICAgICAgIC8vIHRoYXQgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IGhhdmUNCi0gICAgICAgIC8vIGJlZW4gcHJvcGVybHkgZGVsZXRlZC4NCi0gICAgICAgIGlmICghcm9vdERpci5kZWxldGUoKSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGRlbGV0ZTogIiArIHJvb3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qKiBUaGUgcHJlZml4IGZvciB0aGUgdGVtcCBkaXJlY3RvcnkgaW4gdGhlIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeSAqLw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVNUF9ESVJfUFJFRklYID0gImF4aXMyLXRtcC0iOw0KLQ0KLSAgICAvKiogVGhlIHRlbXAgZGlyZWN0b3J5IHRvIGdlbmVyYXRlIGFsbCBmaWxlcyBpbiAqLw0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHNUbXBEaXIgPSBudWxsOw0KLQ0KLSAgICAvKioNCi0gICAgICogIFN0YXRpYyBibG9jayB1c2VkIHRvIGNsZWFuIHVwIGFueSBvbGQgdGVtcCBkaXJlY3RvcmllcyBmb3VuZCAtLSB0aGUgSlZNDQotICAgICAqICB3aWxsIHJ1biB0aGlzIGJsb2NrIHdoZW4gYSBjbGFzcyBsb2FkZXIgbG9hZHMgdGhlIGNsYXNzLg0KLSAgICAgKi8NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIC8vIENsZWFuIHVwIGFueSBvbGQgdGVtcCBkaXJlY3RvcmllcyBieSBsaXN0aW5nDQotICAgICAgICAvLyBhbGwgb2YgdGhlIGZpbGVzLCB1c2luZyBhIGZpbHRlciB0aGF0IHdpbGwNCi0gICAgICAgIC8vIHJldHVybiBvbmx5IGRpcmVjdG9yaWVzIHRoYXQgc3RhcnQgd2l0aCB5b3VyDQotICAgICAgICAvLyBwcmVmaXguDQotICAgICAgICBGaWxlRmlsdGVyIHRtcERpckZpbHRlciA9DQotICAgICAgICAgICAgICAgIG5ldyBGaWxlRmlsdGVyKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBhdGhuYW1lLmlzRGlyZWN0b3J5KCkgJiYNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLmdldE5hbWUoKS5zdGFydHNXaXRoKFRFTVBfRElSX1BSRUZJWCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9Ow0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0gdGVtcCBkaXJlY3RvcnkgYW5kIGZpbHRlciB0aGUgZmlsZXMuDQotICAgICAgICBTdHJpbmcgdG1wRGlyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsNCi0gICAgICAgIEZpbGUgdG1wRGlyID0gbmV3IEZpbGUodG1wRGlyTmFtZSk7DQotICAgICAgICBGaWxlW10gdG1wRmlsZXMgPSB0bXBEaXIubGlzdEZpbGVzKHRtcERpckZpbHRlcik7DQotDQotICAgICAgICAvLyBGaW5kIGFsbCB0aGUgZmlsZXMgdGhhdCBkbyBub3QgaGF2ZSBhIGxvY2sgYnkNCi0gICAgICAgIC8vIGNoZWNraW5nIGlmIHRoZSBsb2NrIGZpbGUgZXhpc3RzLg0KLSAgICAgICAgZm9yIChGaWxlIHRtcEZpbGUgOiB0bXBGaWxlcykgew0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIGZpbGUgdG8gcmVwcmVzZW50IHRoZSBsb2NrIGFuZCB0ZXN0Lg0KLSAgICAgICAgICAgIEZpbGUgbG9ja0ZpbGUgPSBuZXcgRmlsZSh0bXBGaWxlLmdldFBhcmVudCgpLCB0bXBGaWxlLmdldE5hbWUoKSArICIubGNrIik7DQotICAgICAgICAgICAgaWYgKCFsb2NrRmlsZS5leGlzdHMoKSkgew0KLSAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3Rvcnkgc2luY2UNCi0gICAgICAgICAgICAgICAgLy8gaXQgaXMgbm8gbG9uZ2VyIGxvY2tlZC4NCi0gICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigiZGVmYXVsdCIpLmxvZyhMZXZlbC5GSU5FLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wRmlsZU1hbmFnZXI6OmRlbGV0aW5nIG9sZCB0ZW1wIGRpcmVjdG9yeSAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBGaWxlKTsNCi0NCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZURlbGV0ZSh0bXBGaWxlKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFlvdSBsb2cgYXQgYSBmaW5lIGxldmVsIHNpbmNlIG5vdCBiZWluZyBhYmxlIHRvIGRlbGV0ZQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRlbXAgZGlyZWN0b3J5IHNob3VsZCBub3Qgc3RvcCB0aGUgYXBwbGljYXRpb24NCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gcGVyZm9ybWluZyBjb3JyZWN0bHkuIEhvd2V2ZXIsIGlmIHRoZSBhcHBsaWNhdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGVzIGEgbG90IG9mIHRlbXAgZmlsZXMsIHRoaXMgY291bGQgYmVjb21lDQotICAgICAgICAgICAgICAgICAgICAvLyBhIGRpc2sgc3BhY2UgcHJvYmxlbSBhbmQgdGhlIGxldmVsIHNob3VsZCBiZSByYWlzZWQuDQotICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCJkZWZhdWx0IikubG9nKExldmVsLklORk8sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZW1wRmlsZU1hbmFnZXI6OnVuYWJsZSB0byBkZWxldGUgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gUHJpbnQgdGhlIGV4Y2VwdGlvbi4NCi0gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFN0cmVhbShvc3RyZWFtKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCJkZWZhdWx0IikubG9nKExldmVsLkZJTkUsIG9zdHJlYW0udG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9VdGlscy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJmMzk4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXIuSmFyRmlsZUNsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuQXJjaGl2ZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuRGVmYXVsdFNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5TY2hlbWFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VNYXA7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFV0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRFbmNvZGluZyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkuZ2V0RW5jb2RpbmcoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhVdGlscy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmxvd0hhbmRsZXJzKEZsb3cgZmxvdywgQ2xhc3NMb2FkZXIgY2xzTG9hZGVyKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGludCBjb3VudCA9IGZsb3cuZ2V0SGFuZGxlckNvdW50KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcm1kID0gZmxvdy5nZXRIYW5kbGVyKGopOwotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyOwotCi0gICAgICAgICAgICBmaW5hbCBDbGFzcyBoYW5kbGVyQ2xhc3MgPSBnZXRIYW5kbGVyQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJtZC5nZXRDbGFzc05hbWUoKSwgY2xzTG9hZGVyKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyID0gKEhhbmRsZXIpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlci5pbml0KGhhbmRsZXJtZCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlcm1kLnNldEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxvYWRIYW5kbGVyKENsYXNzTG9hZGVyIGxvYWRlcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBkZXNjKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBoYW5kbGVybmFtZSA9IGRlc2MuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIEhhbmRsZXIgaGFuZGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGhhbmRsZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MobG9hZGVyMSwgaGFuZGxlcm5hbWUpOwotICAgICAgICAgICAgUGFja2FnZSBhUGFja2FnZSA9IChQYWNrYWdlKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzLmdldFBhY2thZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZiAoYVBhY2thZ2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGFQYWNrYWdlLmdldE5hbWUoKS5lcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuZW5naW5lIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGhhbmRsZXJDbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIkRpc3BhdGNoZXIgIiArIG5hbWUgKyAiIGlzIG5vdyBkZXByZWNhdGVkLiIpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIkluc3RhbmNlRGlzcGF0Y2hlciIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJQbGVhc2UgcmVtb3ZlIHRoZSBlbnRyeSBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJDbGFzcy5nZXROYW1lKCkgKyAiZnJvbSBheGlzMi54bWwiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGVkaXQgYXhpczIueG1sIGFuZCByZXBsYWNlIHdpdGggdGhlIHNhbWUgY2xhc3MgaW4gb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycyBwYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlciA9IChIYW5kbGVyKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaGFuZGxlci5pbml0KGRlc2MpOwotICAgICAgICAgICAgZGVzYy5zZXRIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVybmFtZS5pbmRleE9mKCJqYXh3cyIpID4gMCkgewotICAgICAgICAgICAgICAgIGxvZy53YXJuKCJbSkFYV1NdIC0gdW5hYmxlIHRvIGxvYWQgIiArIGhhbmRsZXJuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0VVJMc0ZvckFsbEphcnMoVVJMIHVybCwgRmlsZSB0bXBEaXIpIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbiA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBhcnJheSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IHVybC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IGNyZWF0ZVRlbXBGaWxlKGZpbGVOYW1lLCBpbiwgdG1wRGlyKTsKLQotICAgICAgICAgICAgZmluID0gKEZpbGVJbnB1dFN0cmVhbSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBhcnJheS5hZGQoZi50b1VSTCgpKTsKLSAgICAgICAgICAgIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaW4pOwotCi0gICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGlkIHRoZSBlbnRyeSBuYW1lIHN0YXJ0IHdpdGggL2xpYiBhbmQgZW5kIHdpdGggLmphciB0aGVuCi0gICAgICAgICAgICAgICAgICogdGhvc2UgZW50cnkgbmFtZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcnJheWxpc3QKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGVudHJ5TmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAmJiBlbnRyeU5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJsaWIvIikKLSAgICAgICAgICAgICAgICAgICAgJiYgZW50cnlOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3VmZml4ID0gZW50cnlOYW1lLnN1YnN0cmluZyg0KTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IGNyZWF0ZVRlbXBGaWxlKHN1ZmZpeCwgemluLCB0bXBEaXIpOwotICAgICAgICAgICAgICAgICAgICBhcnJheS5hZGQoZjIudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChVUkxbXSlhcnJheS50b0FycmF5KG5ldyBVUkxbYXJyYXkuc2l6ZSgpXSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh6aW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoZmluYWwgU3RyaW5nIHN1ZmZpeCwgSW5wdXRTdHJlYW0gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdG1wRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBieXRlIGRhdGFbXSA9IG5ldyBieXRlWzIwNDhdOwotICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgIEZpbGUgZiA9IFRlbXBGaWxlTWFuYWdlci5jcmVhdGVUZW1wRmlsZSgiYXhpczIiLCBzdWZmaXgpOwotICAgICAgICAKLS8vICAgICAgICBpZiAodG1wRGlyID09IG51bGwpIHsKLS8vICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeSA9IChTdHJpbmcpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLS8vICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICB9KTsKLS8vICAgICAgICAgICAgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgIl9heGlzMiIpOwotLy8gICAgICAgICAgICBCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0vLyAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcEZpbGUuZXhpc3RzKCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICB9KTsKLS8vICAgICAgICAgICAgaWYgKCFleGlzdHMpIHsKLS8vICAgICAgICAgICAgICAgIEJvb2xlYW4gbWtkaXJzID0gKEJvb2xlYW4pb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wRmlsZS5ta2RpcnMoKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIW1rZGlycykgewotLy8gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5Iik7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgIGYgPSAoRmlsZSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotLy8gICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJheGlzMiIsIHN1ZmZpeCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wRmlsZSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotLy8gICAgICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pZS5nZXRFeGNlcHRpb24oKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBmID0gKEZpbGUpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLS8vICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYXhpczIiLCBzdWZmaXgsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGlyKTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0vLyAgICAgICAgICAgICAgICBmLmRlbGV0ZU9uRXhpdCgpOwotLy8gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbillLmdldEV4Y2VwdGlvbigpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotLy8gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZWQgdGVtcG9yYXJ5IGZpbGUgOiAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ly8gJE5PTi1TRUMtNAotLy8gICAgICAgIH0KLS8vICAgICAgICBmaW5hbCBGaWxlIGYyID0gZjsKLS8vICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotLy8gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLS8vICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZjIuZGVsZXRlT25FeGl0KCk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dDsKLSAgICAgICAgZmluYWwgRmlsZSBmMiA9IGY7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSAoRmlsZU91dHB1dFN0cmVhbSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZjIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQoZGF0YSwgMCwgMjA0OCkpICE9IC0xKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoZGF0YSwgMCwgY291bnQpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCwgU3RyaW5nIHBhdGgpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRDbGFzc0xvYWRlcihwYXJlbnQsIG5ldyBGaWxlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBDbGFzc0xvYWRlciB3aGljaCBjb250YWlucyBhIGNsYXNzcGF0aCBvZiBhKSB0aGUgcGFzc2VkIGRpcmVjdG9yeSBhbmQgYikgYW55IGphciBmaWxlcwotICAgICAqIGluc2lkZSB0aGUgImxpYi8iIG9yICJMaWIvIiBzdWJkaXJlY3Rvcnkgb2YgdGhlIHBhc3NlZCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBDbGFzc0xvYWRlciB3aGljaCB3aWxsIGJlIHRoZSBwYXJlbnQgb2YgdGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZAotICAgICAqIEBwYXJhbSBmaWxlICAgYSBGaWxlIHdoaWNoIG11c3QgYmUgYSBkaXJlY3RvcnkgZm9yIHRoaXMgdG8gYmUgdXNlZnVsCi0gICAgICogQHJldHVybiBhIG5ldyBDbGFzc0xvYWRlciBwb2ludGluZyB0byBib3RoIHRoZSBwYXNzZWQgZGlyIGFuZCBqYXIgZmlsZXMgdW5kZXIgbGliLwotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgcGFyZW50LCBGaWxlIGZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotCi0gICAgICAgIGlmIChmaWxlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gU2hvdWxkbid0IHRoaXMganVzdCByZXR1cm4gdGhlIHBhcmVudD8KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB1cmxzLmFkZChmaWxlLnRvVVJMKCkpOwotCi0gICAgICAgICAgICAvLyBsb3dlciBjYXNlIGRpcmVjdG9yeSBuYW1lCi0gICAgICAgICAgICBGaWxlIGxpYmZpbGVzID0gbmV3IEZpbGUoZmlsZSwgImxpYiIpOwotICAgICAgICAgICAgaWYgKCFhZGRGaWxlcyh1cmxzLCBsaWJmaWxlcykpIHsKLSAgICAgICAgICAgICAgICAvLyB1cHBlciBjYXNlIGRpcmVjdG9yeSBuYW1lCi0gICAgICAgICAgICAgICAgbGliZmlsZXMgPSBuZXcgRmlsZShmaWxlLCAiTGliIik7Ci0gICAgICAgICAgICAgICAgYWRkRmlsZXModXJscywgbGliZmlsZXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBVUkwgdXJsbGlzdFtdID0gbmV3IFVSTFt1cmxzLnNpemUoKV07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVybHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB1cmxsaXN0W2ldID0gKFVSTCl1cmxzLmdldChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKUFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VKYXJGaWxlQ2xhc3NMb2FkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphckZpbGVDbGFzc0xvYWRlcih1cmxsaXN0LCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJMQ2xhc3NMb2FkZXIodXJsbGlzdCwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHVzZUphckZpbGVDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgLy8gVGhlIEphckZpbGVDbGFzc0xvYWRlciB3YXMgY3JlYXRlZCB0byBhZGRyZXNzIGEgbG9ja2luZyBwcm9ibGVtIHNlZW4gb25seSBvbiBXaW5kb3dzIHBsYXRmb3Jtcy4KLSAgICAgICAgLy8gSXQgY2FycmllcyB3aXRoIGl0IGEgc2xpZ2h0IHBlcmZvcm1hbmNlIHBlbmFsdHkgdGhhdCBuZWVkcyB0byBiZSBhZGRyZXNzZWQuICBSYXRoZXIgdGhhbiBtYWtlCi0gICAgICAgIC8vICpuaXggT1NlcyBjYXJyeSB0aGlzIGJ1cmRlbiB3ZSdsbCBlbmdhZ2UgdGhlIEphckZpbGVDbGFzc0xvYWRlciBmb3IgV2luZG93cyBvciBpZiB0aGUgdXNlciAKLSAgICAgICAgLy8gc3BlY2lmaWNhbGx5IHJlcXVlc3RzIGl0LgotICAgICAgICBib29sZWFuIHVzZUphckZpbGVDbGFzc0xvYWRlcjsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmFwYWNoZS5heGlzMi5jbGFzc2xvYWRlci5KYXJGaWxlQ2xhc3NMb2FkZXIiKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1c2VKYXJGaWxlQ2xhc3NMb2FkZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW5kb3dzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2VKYXJGaWxlQ2xhc3NMb2FkZXIgPSBCb29sZWFuLmdldEJvb2xlYW4oIm9yZy5hcGFjaGUuYXhpczIuY2xhc3Nsb2FkZXIuSmFyRmlsZUNsYXNzTG9hZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVzZUphckZpbGVDbGFzc0xvYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhZGRGaWxlcyhBcnJheUxpc3QgdXJscywgZmluYWwgRmlsZSBsaWJmaWxlcykKLSAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICBCb29sZWFuIGV4aXN0cyA9IChCb29sZWFuKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZXMuZXhpc3RzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgaWYgKGV4aXN0cykgewotICAgICAgICAgICAgdXJscy5hZGQobGliZmlsZXMudG9VUkwoKSk7Ci0gICAgICAgICAgICBGaWxlIGphcmZpbGVzW10gPSAoRmlsZVtdKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZXMubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGkgPCBqYXJmaWxlcy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGphcmZpbGUgPSBqYXJmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoamFyZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICB1cmxzLmFkZChqYXJmaWxlLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGV4aXN0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzcyBnZXRIYW5kbGVyQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyMSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBDbGFzcyBoYW5kbGVyQ2xhc3M7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhhbmRsZXJDbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MobG9hZGVyMSwgY2xhc3NOYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGd1eSB3aWxsIGNyZWF0ZSBhIEF4aXNTZXJ2aWNlIHVzaW5nIGphdmEgcmVmbGVjdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlICAgICAgIHRoZSB0YXJnZXQgQXhpc1NlcnZpY2UKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyAgICAgICAgdGhlIGluLXNjb3BlIEF4aXNDb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVPcGVyYXRpb25zIGEgTGlzdCBvZiBTdHJpbmdzIChvciBudWxsKSwgZWFjaCBjb250YWluaW5nIGEgbWV0aG9kIHRvIGV4Y2x1ZGUKLSAgICAgKiBAcGFyYW0gbm9uUnBjTWV0aG9kcyAgICAgYSBMaXN0IG9mIFN0cmluZ3MgKG9yIG51bGwpLCBlYWNoIGNvbnRhaW5pbmcgYSBub24tcnBjIG1ldGhvZCBuYW1lCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsQXhpc1NlcnZpY2UoZmluYWwgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBBcnJheUxpc3QgZXhjbHVkZU9wZXJhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Qgbm9uUnBjTWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBpbXBsSW5mb1BhcmFtID0gYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgc2VydmljZUNsYXNzTG9hZGVyID0gYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgICAgICBpZiAoaW1wbEluZm9QYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlQ2xhc3MgPSAoU3RyaW5nKWltcGxJbmZvUGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIFNlcnZpY2VfQ2xhc3MgaXMgbnVsbCwgZXZlcnkgQWJzdHJhY3RNUiB3aWxsIGxvb2sgZm9yCi0gICAgICAgICAgICAvLyBTZXJ2aWNlT2JqZWN0U3VwcGxpZXIuIFRoaXMgaXMgdXNlciBzcGVjaWZpYyBhbmQgbWF5IGNvbnRhaW4KLSAgICAgICAgICAgIC8vIG90aGVyIGxvb2tzLgotICAgICAgICAgICAgaW1wbEluZm9QYXJhbSA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfT0JKRUNUX1NVUFBMSUVSKTsKLSAgICAgICAgICAgIGlmIChpbXBsSW5mb1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKChTdHJpbmcpaW1wbEluZm9QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgc2VydmljZU9iamVjdE1ha2VyID0gTG9hZGVyLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzc0xvYWRlciwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU9iamVjdE1ha2VyLmdldE1vZGlmaWVycygpICE9IE1vZGlmaWVyLlBVQkxJQykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTZXJ2aWNlIGNsYXNzICIgKyBjbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbXVzdCBoYXZlIHB1YmxpYyBhcyBhY2Nlc3MgTW9kaWZpZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGaW5kIHN0YXRpYyBnZXRTZXJ2aWNlT2JqZWN0KCkgbWV0aG9kLCBjYWxsIGl0IGlmIHRoZXJlCi0gICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IChNZXRob2Qpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VPYmplY3RNYWtlci5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFNlcnZpY2VPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqID0gb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKHNlcnZpY2VPYmplY3RNYWtlci5uZXdJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiU2VydmljZU9iamVjdFN1cHBsaWVyIGltcGxtZW50YXRpb24gT2JqZWN0IGNvdWxkIG5vdCBiZSBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZUNsYXNzIG9yIFNlcnZpY2VPYmplY3RTdXBwbGllciBpbXBsbWVudGF0aW9uIE9iamVjdCBjb3VsZCBub3QgYmUgZm91bmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VydmljZUNsYXNzID0gb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkaW5nIG5hbWUgc3BhY2VzCi0gICAgICAgIE5hbWVzcGFjZU1hcCBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIG1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFYSVMyX1hTRCk7Ci0gICAgICAgIG1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfU0NIRU1BX05BTUVTUEFDRV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpOwotICAgICAgICBheGlzU2VydmljZS5zZXROYW1lc3BhY2VNYXAobWFwKTsKLSAgICAgICAgU2NoZW1hR2VuZXJhdG9yIHNjaGVtYUdlbmVyYXRvcjsKLSAgICAgICAgUGFyYW1ldGVyIGdlbmVyYXRlQmFyZSA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihKYXZhMldTRExDb25zdGFudHMuRE9DX0xJVF9CQVJFX1BBUkFNRVRFUik7Ci0gICAgICAgIGlmIChnZW5lcmF0ZUJhcmUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGdlbmVyYXRlQmFyZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgc2NoZW1hR2VuZXJhdG9yID0gbmV3IERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3Ioc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NoZW1hR2VuZXJhdG9yID0gbmV3IERlZmF1bHRTY2hlbWFHZW5lcmF0b3Ioc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzLnRyaW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5zZXRFeGNsdWRlTWV0aG9kcyhleGNsdWRlT3BlcmF0aW9ucyk7Ci0gICAgICAgIHNjaGVtYUdlbmVyYXRvci5zZXROb25ScGNNZXRob2RzKG5vblJwY01ldGhvZHMpOwotICAgICAgICBpZiAoIWF4aXNTZXJ2aWNlLmlzRWxlbWVudEZvcm1EZWZhdWx0KCkpIHsKLSAgICAgICAgICAgIHNjaGVtYUdlbmVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEphdmEyV1NETENvbnN0YW50cy5GT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhY2thZ2UgdG8gbmFtZXNwYWNlIG1hcAotICAgICAgICBzY2hlbWFHZW5lcmF0b3Iuc2V0UGtnMm5zbWFwKGF4aXNTZXJ2aWNlLmdldFAybk1hcCgpKTsKLSAgICAgICAgQ29sbGVjdGlvbiBzY2hlbWFzID0gc2NoZW1hR2VuZXJhdG9yLmdlbmVyYXRlU2NoZW1hKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYShzY2hlbWFzKTsKLSAgICAgICAgYXhpc1NlcnZpY2Uuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvcgotICAgICAgICAgICAgICAgIC5nZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLnNldFR5cGVUYWJsZShzY2hlbWFHZW5lcmF0b3IuZ2V0VHlwZVRhYmxlKCkpOwotICAgICAgICBpZiAoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRS5lcXVhbHMoYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAuc2V0VGFyZ2V0TmFtZXNwYWNlKHNjaGVtYUdlbmVyYXRvci5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXRob2RbXSBtZXRob2QgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TWV0aG9kcygpOwotICAgICAgICBQaGFzZXNJbmZvIHBpbmZvID0gYXhpc0NvbmZpZy5nZXRQaGFzZXNJbmZvKCk7Ci0KLSAgICAgICAgZm9yIChNZXRob2Qgam1ldGhvZCA6IG1ldGhvZCkgewotICAgICAgICAgICAgU3RyaW5nIG9wTmFtZSA9IGptZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBvcGVyYXRpb24gdGhlcmUgaW4gc2VydmljZXMueG1sIHRoZW4gdHJ5IHRvIHNldCBpdCBzY2hlbWEKLSAgICAgICAgICAgIC8vIGVsZW1lbnQgbmFtZQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGptZXRob2QuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXIgPQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRNZXNzYWdlUmVjZWl2ZXIob3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSk7Ci0gICAgICAgICAgICBpZiAobXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1yID0gYXhpc0NvbmZpZy5nZXRNZXNzYWdlUmVjZWl2ZXIob3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldE1lc3NhZ2VSZWNlaXZlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldFNvYXBBY3Rpb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNldFNvYXBBY3Rpb24oInVybjoiICsgb3BOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc09wZXJhdGlvbiBnZXRBeGlzT3BlcmF0aW9uRm9ySm1ldGhvZChNZXRob2QgbWV0aG9kKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBpZiAoInZvaWQiLmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzT3BlcmF0aW9uKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzT3BlcmF0aW9uKFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09OTFkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gQXhpc09wZXJhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNPcGVyYXRpb24oV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1VUKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgb3BOYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgb3BlcmF0aW9uLnNldE5hbWUobmV3IFFOYW1lKG9wTmFtZSkpOwotICAgICAgICBXZWJNZXRob2QgbWV0aG9kQW5ub24gPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICBpZiAobWV0aG9kQW5ub24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IG1ldGhvZEFubm9uLmFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsICYmICEiIi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBsb2NrZWQpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgcGFyYW1ldGVyID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicGFyYW1ldGVyIiwgbnVsbCk7Ci0gICAgICAgIHBhcmFtZXRlci5hZGRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lLCBudWxsKTsKLSAgICAgICAgcGFyYW1ldGVyLmFkZEF0dHJpYnV0ZSgibG9ja2VkIiwgQm9vbGVhbi50b1N0cmluZyhsb2NrZWQpLCBudWxsKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldFRleHQodmFsdWUpOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1vZHVsZXMgY2FuIGNvbnRhaW4gc2VydmljZXMgaW4gc29tZSBjYXNlcy4gIFRoaXMgbWV0aG9kIHdpbGwgZGVwbG95IGFsbCB0aGUgc2VydmljZXMKLSAgICAgKiBmb3IgYSBnaXZlbiBBeGlzTW9kdWxlIGludG8gdGhlIGN1cnJlbnQgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvZGUgbG9va3MgZm9yIGFuICJhYXJzLyIgZGlyZWN0b3J5IGluc2lkZSB0aGUgbW9kdWxlIChlaXRoZXIgLm1hciBvciBleHBsb2RlZCksCi0gICAgICogYW5kIGFuICJhYXJzLmxpc3QiIGZpbGUgaW5zaWRlIHRoYXQgdG8gZmlndXJlIG91dCB3aGljaCBzZXJ2aWNlcyB0byBkZXBsb3kuICBOb3RlIHRoYXQgYWxsCi0gICAgICogc2VydmljZXMgZGVwbG95ZWQgdGhpcyB3YXkgd2lsbCBoYXZlIGFjY2VzcyB0byB0aGUgTW9kdWxlJ3MgY2xhc3Nlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlIHRoZSBBeGlzTW9kdWxlIHRvIHNlYXJjaCBmb3Igc2VydmljZXMKLSAgICAgKiBAcGFyYW0gY29uZmlnQ3R4IENvbmZpZ3VyYXRpb25Db250ZXh0IGluIHdoaWNoIHRvIGRlcGxveQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlcGxveU1vZHVsZVNlcnZpY2VzKEF4aXNNb2R1bGUgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgQXJjaGl2ZVJlYWRlciBhcmNoaXZlUmVhZGVyID0gbmV3IEFyY2hpdmVSZWFkZXIoKTsKLSAgICAgICAgICAgIFBoYXNlc0luZm8gcGhhc2VzSW5mbyA9IGF4aXNDb25maWcuZ2V0UGhhc2VzSW5mbygpOwotICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbW9kdWxlQ2xhc3NMb2FkZXIgPSBtb2R1bGUuZ2V0TW9kdWxlQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluID0gKElucHV0U3RyZWFtKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlQ2xhc3NMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJhYXJzL2FhcnMubGlzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQ7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKElucHV0U3RyZWFtUmVhZGVyKW9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbnB1dC5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkgIT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuYWRkKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBzZXJ2aWNlMSA6IHNlcnZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlbmFtZSA9IChTdHJpbmcpc2VydmljZTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlbmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGZpbiA9IChJbnB1dFN0cmVhbSlvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKCJhYXJzLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBzZXJ2aWNlIGFyY2hpdmUgZm91bmQgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlVGVtcEZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGaWxlKWF4aXNDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlclZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFSVElGQUNUU19URU1QX0RJUikpOwotICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RmlsZURhdGEgZmlsZWRhdGEgPSBuZXcgRGVwbG95bWVudEZpbGVEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmlsZWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZpbGUpYXhpc0NvbmZpZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgd3NkbHNlcnZpY2UgPSBhcmNoaXZlUmVhZGVyLnByb2Nlc3NXU0RMcyhmaWxlZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2Rsc2VydmljZSAhPSBudWxsICYmIHdzZGxzZXJ2aWNlLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzaXRyID0gd3NkbHNlcnZpY2UudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZXJ2aWNlc2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXNlcnZpY2VzaXRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pb3BlcmF0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlc0luZm8uc2V0T3BlcmF0aW9uUGhhc2VzKGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoZmlsZWRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlTGlzdCA9IGFyY2hpdmVSZWFkZXIucHJvY2Vzc1NlcnZpY2VHcm91cCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlZGF0YS5nZXRBYnNvbHV0ZVBhdGgoKSwgZmlsZWRhdGEsIHNlcnZpY2VHcm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgd3NkbHNlcnZpY2UsIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGFTZXJ2aWNlTGlzdCA6IHNlcnZpY2VMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlhU2VydmljZUxpc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgbW9kdWxlU2VydmljZSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNlcnZpY2Uuc2V0VmFsdWUoInRydWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNlcnZpY2Uuc2V0TmFtZShBeGlzTW9kdWxlLk1PRFVMRV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihtb2R1bGVTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICBmaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOb3JtYWxpemUgYSB1cmkgY29udGFpbmluZyAuLi8gYW5kIC4vIHBhdGhzLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIHBhdGggdG8gbm9ybWFsaXplCi0gICAgICogQHJldHVybiBUaGUgbm9ybWFsaXplZCB1cmkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHVyaSkgewotICAgICAgICBpZiAoIiIuZXF1YWxzKHVyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiB1cmk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxlYWRpbmdTbGFzaGVzOwotICAgICAgICBmb3IgKGxlYWRpbmdTbGFzaGVzID0gMDsgbGVhZGluZ1NsYXNoZXMgPCB1cmkubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVyaS5jaGFyQXQobGVhZGluZ1NsYXNoZXMpID09ICcvJzsgKytsZWFkaW5nU2xhc2hlcykgewotICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgYmxvY2sgaXMgZW1wdHkhIQotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gaXNEaXIgPSAodXJpLmNoYXJBdCh1cmkubGVuZ3RoKCkgLSAxKSA9PSAnLycpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVyaSwgIi8iKTsKLSAgICAgICAgTGlua2VkTGlzdCBjbGVhbiA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKCIuLiIuZXF1YWxzKHRva2VuKSkgewotICAgICAgICAgICAgICAgIGlmICghY2xlYW4uaXNFbXB0eSgpICYmICEiLi4iLmVxdWFscyhjbGVhbi5nZXRMYXN0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuLnJlbW92ZUxhc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuLmFkZCgiLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEiLiIuZXF1YWxzKHRva2VuKSAmJiAhIiIuZXF1YWxzKHRva2VuKSkgewotICAgICAgICAgICAgICAgIGNsZWFuLmFkZCh0b2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAobGVhZGluZ1NsYXNoZXMtLSA+IDApIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnLycpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjbGVhbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaXQubmV4dCgpKTsKLSAgICAgICAgICAgIGlmIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNEaXIgJiYgc2IubGVuZ3RoKCkgPiAwICYmIHNiLmNoYXJBdChzYi5sZW5ndGgoKSAtIDEpICE9ICcvJykgewotICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGRQYXRoKSB7Ci0gICAgICAgIFN0YWNrIHBhcmVudFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0gICAgICAgIFN0YWNrIGNoaWxkU3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBwYXJlbnQuc3BsaXQoIi8iKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YWNrLnB1c2godmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBjaGlsZFBhdGguc3BsaXQoIi8iKTsKLSAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgIGNoaWxkU3RhY2sucHVzaCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGZpbGVwYXRoID0gIiI7Ci0gICAgICAgIHdoaWxlICghY2hpbGRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpY2hpbGRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgIGlmICgiLi4iLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnRTdGFjay5wb3AoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoISIiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGZpbGVwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gdmFsdWUgKyAiLyIgKyBmaWxlcGF0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKCFwYXJlbnRTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpcGFyZW50U3RhY2sucG9wKCk7Ci0gICAgICAgICAgICBpZiAoISIiLmVxdWFscyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IHZhbHVlICsgIi8iICsgZmlsZXBhdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBuYW1lcyBvZiBhbGwgKi5qYXIgZmlsZXMgaW5zaWRlIHRoZSBsaWIvIGRpcmVjdG9yeSBvZiBhIGdpdmVuIGphciBVUkwKLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwgYmFzZSBVUkwgb2YgYSBKQVIgdG8gc2VhcmNoCi0gICAgICogQHJldHVybiBhIExpc3QgY29udGFpbmluZyBmaWxlIG5hbWVzIChTdHJpbmdzKSBvZiBhbGwgZmlsZXMgbWF0Y2hpbmcgIltsTF1pYi8qLmphciIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZmluZExpYkphcnMoVVJMIHVybCkgewotICAgICAgICBBcnJheUxpc3QgZW1iZWRkZWRfamFycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppbiA9IG5ldyBaaXBJbnB1dFN0cmVhbSh1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZTsKLSAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB6aW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogaWYgdGhlIGVudHJ5IG5hbWUgc3RhcnQgd2l0aCAvbGliIGFuZCBlbmRzIHdpdGggLmphciBhZGQgaXQKLSAgICAgICAgICAgICAgICAgKiB0byB0aGUgdGhlIGFycmF5bGlzdAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoZW50cnlOYW1lLnN0YXJ0c1dpdGgoImxpYi8iKSB8fCBlbnRyeU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydHNXaXRoKCJMaWIvIikpCi0gICAgICAgICAgICAgICAgICAgICYmIGVudHJ5TmFtZS5lbmRzV2l0aCgiLmphciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkX2phcnMuYWRkKGVudHJ5TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgemluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW1iZWRkZWRfamFyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIEF4aXMyIGxpZmVjeWNsZSAvIHNlc3Npb24gbWV0aG9kcyB0byBhIHByZS1leGlzdGluZyBsaXN0IG9mIG5hbWVzIHRoYXQgd2lsbCBiZQotICAgICAqIGV4Y2x1ZGVkIHdoZW4gZ2VuZXJhdGluZyBzY2hlbWFzLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2x1ZGVMaXN0IGFuIEFycmF5TGlzdCBjb250YWluaW5nIG1ldGhvZCBuYW1lcyAtIHdlJ2xsIGFkZCBvdXJzIHRvIHRoaXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4Y2x1ZGVNZXRob2RzKEFycmF5TGlzdCBleGNsdWRlTGlzdCkgewotICAgICAgICBleGNsdWRlTGlzdC5hZGQoImluaXQiKTsKLSAgICAgICAgZXhjbHVkZUxpc3QuYWRkKCJzZXRPcGVyYXRpb25Db250ZXh0Iik7Ci0gICAgICAgIGV4Y2x1ZGVMaXN0LmFkZCgic3RhcnRVcCIpOwotICAgICAgICBleGNsdWRlTGlzdC5hZGQoImRlc3Ryb3kiKTsKLSAgICAgICAgZXhjbHVkZUxpc3QuYWRkKCJzaHV0RG93biIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgRGVwbG95bWVudENsYXNzTG9hZGVyIGNyZWF0ZUNsYXNzTG9hZGVyKEZpbGUgc2VydmljZUZpbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY29udGV4dENsYXNzTG9hZGVyID0KLSAgICAgICAgICAgICAgICAoQ2xhc3NMb2FkZXIpb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gY3JlYXRlRGVwbG95bWVudENsYXNzTG9hZGVyKG5ldyBVUkxbXXtzZXJ2aWNlRmlsZS50b1VSTCgpfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Q2xhc3NMb2FkZXIsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihBcnJheUxpc3QgdXJscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHNlcnZpY2VDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXh0cmFjdEphcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHRtcERpcikgewotICAgICAgICBVUkwgdXJsID0gKFVSTCl1cmxzLmdldCgwKTsKLSAgICAgICAgaWYgKGV4dHJhY3RKYXJzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFVSTFtdIHVybHMxID0gVXRpbHMuZ2V0VVJMc0ZvckFsbEphcnModXJsLCB0bXBEaXIpOwotICAgICAgICAgICAgICAgIHVybHMucmVtb3ZlKDApOwotICAgICAgICAgICAgICAgIHVybHMuYWRkQWxsKDAsIEFycmF5cy5hc0xpc3QodXJsczEpKTsKLSAgICAgICAgICAgICAgICBVUkxbXSB1cmxzMiA9IChVUkxbXSl1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOwotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIodXJsczIsIHNlcnZpY2VDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cKLSAgICAgICAgICAgICAgICAgICAgICAgIC53YXJuKCJFeGNlcHRpb24gZXh0cmFjdGluZyBqYXJzIGludG8gdGVtcG9yYXJ5IGRpcmVjdG9yeSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA6IHN3aXRjaGluZyB0byBhbHRlcm5hdGUgY2xhc3MgbG9hZGluZyBtZWNoYW5pc20iKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExpc3QgZW1iZWRkZWRfamFycyA9IFV0aWxzLmZpbmRMaWJKYXJzKHVybCk7Ci0gICAgICAgIFVSTFtdIHVybHMyID0gKFVSTFtdKXVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIodXJsczIsIHNlcnZpY2VDbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZF9qYXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEZpbGUgdG9GaWxlKFVSTCB1cmwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0UGF0aCgpLCBkZWZhdWx0RW5jb2RpbmcpOwotICAgICAgICByZXR1cm4gbmV3IEZpbGUocGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCd8JywgJzonKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihVUkxbXSB1cmxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHRyYWN0SmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdG1wRGlyKSB7Ci0gICAgICAgIGlmIChleHRyYWN0SmFycykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkxbXSB1cmxzMSA9IFV0aWxzLmdldFVSTHNGb3JBbGxKYXJzKHVybHNbMF0sIHRtcERpcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURlcGxveW1lbnRDbGFzc0xvYWRlcih1cmxzMSwgc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZwotICAgICAgICAgICAgICAgICAgICAgICAgLndhcm4oIkV4Y2VwdGlvbiBleHRyYWN0aW5nIGphcnMgaW50byB0ZW1wb3JhcnkgZGlyZWN0b3J5IDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIDogc3dpdGNoaW5nIHRvIGFsdGVybmF0ZSBjbGFzcyBsb2FkaW5nIG1lY2hhbmlzbSIpOwotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBlbWJlZGRlZF9qYXJzID0gVXRpbHMuZmluZExpYkphcnModXJsc1swXSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIodXJscywgc2VydmljZUNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkX2phcnMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIERlcGxveW1lbnRDbGFzc0xvYWRlciBjcmVhdGVEZXBsb3ltZW50Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICBmaW5hbCBVUkxbXSB1cmxzLCBmaW5hbCBDbGFzc0xvYWRlciBzZXJ2aWNlQ2xhc3NMb2FkZXIsCi0gICAgICAgICAgICBmaW5hbCBMaXN0IGVtYmVkZGVkSmFycykgewotICAgICAgICByZXR1cm4gKERlcGxveW1lbnRDbGFzc0xvYWRlcilBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlcGxveW1lbnRDbGFzc0xvYWRlcih1cmxzLCBlbWJlZGRlZEphcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gcHJvY2VzcyBiZWFuIGV4Y2x1ZGUgcGFyYW1ldGVyIGFuZCB0aGUgWE1MIGZvcm1hdCBvZiB0aGF0IHdvdWxkIGJlCi0gICAgICogPHBhcmFtZXRlciBuYW1lPSJiZWFuUHJvcGVydHlSdWxlcyI+IDxiZWFuIGNsYXNzPSJmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lIgotICAgICAqIGV4Y2x1ZGVQcm9wZXJ0aWVzPSJuYW1lLGFnZSIvPisgPC9wYXJhbWV0ZXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZSAsIEF4aXNTZXJ2aWNlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzQmVhblByb3BlcnR5RXhjbHVkZShBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIFBhcmFtZXRlciBleGNsdWRlQmVhblByb3BlcnR5ID0gc2VydmljZQotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoImJlYW5Qcm9wZXJ0eVJ1bGVzIik7Ci0gICAgICAgIGlmIChleGNsdWRlQmVhblByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gZXhjbHVkZUJlYW5Qcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyRWxlbWVudCgpOwotICAgICAgICAgICAgSXRlcmF0b3IgYm5lYXNJdHIgPSBwYXJhbWV0ZXJFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAiYmVhbiIpKTsKLSAgICAgICAgICAgIEV4Y2x1ZGVJbmZvIGV4Y2x1ZGVJbmZvID0gbmV3IEV4Y2x1ZGVJbmZvKCk7Ci0gICAgICAgICAgICB3aGlsZSAoYm5lYXNJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGJlYW4gPSAoT01FbGVtZW50KWJuZWFzSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2xhenogPSBiZWFuLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuVEFHX0NMQVNTX05BTUUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXhjbHVkZVByb3BlcnRlZXMgPSBiZWFuLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuVEFHX0VYQ0xVREVfUFJPUEVSVElFUykpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbmNsdWRlUHJvcGVydGllcyA9IGJlYW4uZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudENvbnN0YW50cy5UQUdfSU5DTFVERV9QUk9QRVJUSUVTKSk7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZUluZm8ucHV0QmVhbkluZm8oY2xhenosIG5ldyBCZWFuRXhjbHVkZUluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlUHJvcGVydGVlcywgaW5jbHVkZVByb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0RXhjbHVkZUluZm8oZXhjbHVkZUluZm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2hvcnRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHV0aWwgbWV0aG9kIHRvIHByZXBhcmUgdGhlIEpTUiAxODEgYW5ub3RhdGVkIHNlcnZpY2UgbmFtZSBmcm9tIGdpdmVuIGFubm90YXRpb24gb3IgZm9yCi0gICAgICogZGVmYXVsdHMgSlNSIDE4MSBzcGVjaWZpZXMgdGhhdCB0aGUgaW4gamF2YXguandzLldlYlNlcnZpY2UgdGhlIHBhcmFtZXRlciBzZXJ2aWNlTmFtZQotICAgICAqIGNvbnRhaW5zIHRoZSB3c2RsOnNlcnZpY2UgbmFtZSB0byBtYXBwLiBJZiBpdHMgbm90IGF2YWlsYWJsZSB0aGVuIHRoZSBkZWZhdWx0IHdpbGwgYmUgU2ltcGxlCi0gICAgICogbmFtZSBvZiB0aGUgY2xhc3MgKyAiU2VydmljZSIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlQ2xhc3MgdGhlIHNlcnZpY2UgQ2xhc3MKLSAgICAgKiBAcGFyYW0gc2VydmljZUFubm90YXRpb24gYSBXZWJTZXJ2aWNlIGFubm90YXRpb24sIG9yIG51bGwKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSBTZXJ2aWNlTmFtZSBhY2NvcmRpbmcgdG8gdGhlIEpTUiAxODEgc3BlYwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRlZFNlcnZpY2VOYW1lKENsYXNzIHNlcnZpY2VDbGFzcywgV2ViU2VydmljZSBzZXJ2aWNlQW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAiIjsKLSAgICAgICAgaWYgKHNlcnZpY2VBbm5vdGF0aW9uICE9IG51bGwgJiYgc2VydmljZUFubm90YXRpb24uc2VydmljZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2VBbm5vdGF0aW9uLnNlcnZpY2VOYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZUNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGludCBmaXJzdENoYXIgPSBzZXJ2aWNlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMTsKLSAgICAgICAgICAgIGlmIChmaXJzdENoYXIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZS5zdWJzdHJpbmcoZmlyc3RDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lICs9ICJTZXJ2aWNlIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEVuZHBvaW50c1RvU2VydmljZShBeGlzU2VydmljZSBheGlzU2VydmljZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgSXRlcmF0b3IgdHJhbnNwb3J0SW5WYWx1ZXMgPSBudWxsOwotCi0gICAgICAgIGlmIChheGlzU2VydmljZS5pc0VuYWJsZUFsbFRyYW5zcG9ydHMoKSkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBheGlzU2VydmljZQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IHRyYW5zcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydHNJbigpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW5EZXNjcmlwdGlvbiA9IChUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKW87Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydHMuYWRkKHRyYW5zcG9ydEluRGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0SW5WYWx1ZXMgPSB0cmFuc3BvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cmFuc3BvcnRJblZhbHVlcyA9IGF4aXNTZXJ2aWNlLmdldEV4cG9zZWRUcmFuc3BvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hNYXAgYmluZGluZ0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAodHJhbnNwb3J0SW5WYWx1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yICg7IHRyYW5zcG9ydEluVmFsdWVzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHJhbnNwb3J0TmFtZSA9IChTdHJpbmcpdHJhbnNwb3J0SW5WYWx1ZXMubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHRyYW5zcG9ydE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRyYW5zcG9ydE5hbWUuc3Vic3RyaW5nKDEsIHRyYW5zcG9ydE5hbWUubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICAgICAgICAgIC8vVE9ETyBkbyB3ZSB1c2UgdGhpcyBtZXRob2QgLCB3ZSBuZWVkIHRvIGRpc2FibGUgSHR0cCwgU09BUDExLFNPQVAxMgotICAgICAgICAgICAgICAgIC8vIEJpbmRpbmdzIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIGlmIHdlIGFyZSB1c2luZyB0aGlzCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogcG9wdWxhdGVzIHNvYXAxMSBlbmRwb2ludAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcDExRW5kcG9pbnROYW1lID0gc2VydmljZU5hbWUgKyBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTb2FwMTFFbmRwb2ludCI7Ci0KLSAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cFNvYXAxMUVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXROYW1lKHNvYXAxMUVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVTb2FwMTFFbmRwb2ludChheGlzU2VydmljZSwgaHR0cFNvYXAxMUVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwU29hcDExRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgLy8gc2V0dGluZyBzb2FwMTEgZW5kcG9pbnQgYXMgdGhlIGRlZmF1bHQgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIGdlbmVyYXRpbmcgU29hcDEyIGVuZHBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwMTJFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlNvYXAxMkVuZHBvaW50IjsKLSAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cFNvYXAxMkVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludC5zZXROYW1lKHNvYXAxMkVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgcG9wdWxhdGVTb2FwMTJFbmRwb2ludChheGlzU2VydmljZSwgaHR0cFNvYXAxMkVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwU29hcDEyRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludCk7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBnZW5lcmF0aW5nIEh0dHAgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCJodHRwIi5lcXVhbHModHJhbnNwb3J0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRW5kcG9pbnQiOwotICAgICAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cEVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnQuc2V0TmFtZShodHRwRW5kcG9pbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHRyYW5zcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUh0dHBFbmRwb2ludChheGlzU2VydmljZSwgaHR0cEVuZHBvaW50LCBiaW5kaW5nQ2FjaGUpOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbmRwb2ludHNUb1NlcnZpY2UoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBJdGVyYXRvciB0cmFuc3BvcnRJblZhbHVlcyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCB0cmFuc3BvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydHNJbigpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbkRlc2NyaXB0aW9uID0gKFRyYW5zcG9ydEluRGVzY3JpcHRpb24pbzsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRzLmFkZCh0cmFuc3BvcnRJbkRlc2NyaXB0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFuc3BvcnRJblZhbHVlcyA9IHRyYW5zcG9ydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hNYXAgYmluZGluZ0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYgKHRyYW5zcG9ydEluVmFsdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoOyB0cmFuc3BvcnRJblZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zcG9ydE5hbWUgPSAoU3RyaW5nKXRyYW5zcG9ydEluVmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdG9jb2wgPSB0cmFuc3BvcnROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0cmFuc3BvcnROYW1lLnN1YnN0cmluZygxLCB0cmFuc3BvcnROYW1lLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBheGlzMi54bWwgaW5kaWNhdGVkIG5vIEhUVFAgYmluZGluZz8KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVSRVNUID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVSRVNUUGFyYW1ldGVyID0gYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1JFU1QpOwotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlUkVTVFBhcmFtZXRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVSRVNUUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVSRVNUID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMVBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTEpOwotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlU09BUDExUGFyYW1ldGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVNPQVAxMVBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBkaXNhYmxlU09BUDExID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMlBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTIpOwotICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlU09BUDEyUGFyYW1ldGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgSmF2YVV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDEyUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVTT0FQMTIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIHBvcHVsYXRlcyBzb2FwMTEgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwMTFFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTb2FwMTFFbmRwb2ludCI7Ci0KLSAgICAgICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGh0dHBTb2FwMTFFbmRwb2ludCA9IG5ldyBBeGlzRW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHRyYW5zcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZVNvYXAxMUVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwU29hcDExRW5kcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkRW5kcG9pbnQoaHR0cFNvYXAxMUVuZHBvaW50LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyBzb2FwMTEgZW5kcG9pbnQgYXMgdGhlIGRlZmF1bHQgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0RW5kcG9pbnROYW1lKHNvYXAxMUVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogZ2VuZXJhdGluZyBTb2FwMTIgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDEyKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwMTJFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTb2FwMTJFbmRwb2ludCI7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBodHRwU29hcDEyRW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludC5zZXROYW1lKHNvYXAxMkVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludC5zZXRQYXJlbnQoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBodHRwU29hcDEyRW5kcG9pbnQuc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbih0cmFuc3BvcnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVTb2FwMTJFbmRwb2ludChheGlzU2VydmljZSwgaHR0cFNvYXAxMkVuZHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDYWNoZSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZEVuZHBvaW50KGh0dHBTb2FwMTJFbmRwb2ludC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogZ2VuZXJhdGluZyBIdHRwIGVuZHBvaW50Ci0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICgoImh0dHAiLmVxdWFscyh0cmFuc3BvcnROYW1lKQotICAgICAgICAgICAgICAgICAgICAgfHwgImh0dHBzIi5lcXVhbHModHJhbnNwb3J0TmFtZSkpICYmICFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaHR0cEVuZHBvaW50TmFtZSA9IHNlcnZpY2VOYW1lICsgcHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJFbmRwb2ludCI7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBodHRwRW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludC5zZXROYW1lKGh0dHBFbmRwb2ludE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlSHR0cEVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwRW5kcG9pbnQsIGJpbmRpbmdDYWNoZSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZEVuZHBvaW50KGh0dHBFbmRwb2ludC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNvYXAxMUVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBVUkwgdXJsKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgKyBwcm90b2NvbC5zdWJzdHJpbmcoMSwgcHJvdG9jb2wubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgc29hcDExRW5kcG9pbnROYW1lID0gc2VydmljZU5hbWUgKyBwcm90b2NvbCArICJTb2FwMTFFbmRwb2ludCI7Ci0KLSAgICAgICAgQXhpc0VuZHBvaW50IGh0dHBTb2FwMTFFbmRwb2ludCA9IG5ldyBBeGlzRW5kcG9pbnQoKTsKLSAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLSAgICAgICAgaHR0cFNvYXAxMUVuZHBvaW50LnNldFBhcmVudChheGlzU2VydmljZSk7Ci0gICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXRFbmRwb2ludFVSTCh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgIGh0dHBTb2FwMTFFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHVybC5nZXRQcm90b2NvbCgpKTsKLQotICAgICAgICBwb3B1bGF0ZVNvYXAxMUVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwU29hcDExRW5kcG9pbnQsIG51bGwpOwotICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwU29hcDExRW5kcG9pbnQuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwU29hcDExRW5kcG9pbnQpOwotICAgICAgICAvLyBzZXR0aW5nIHNvYXAxMSBlbmRwb2ludCBhcyB0aGUgZGVmYXVsdCBlbmRwb2ludAotICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoc29hcDExRW5kcG9pbnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU29hcDEyRW5kcG9pbnQoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsIFVSTCB1cmwpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7Ci0gICAgICAgIHByb3RvY29sID0gcHJvdG9jb2wuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICArIHByb3RvY29sLnN1YnN0cmluZygxLCBwcm90b2NvbC5sZW5ndGgoKSkudG9Mb3dlckNhc2UoKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBzb2FwMTJFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sICsgIlNvYXAxMkVuZHBvaW50IjsKLQotICAgICAgICBBeGlzRW5kcG9pbnQgaHR0cFNvYXAxMkVuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICBodHRwU29hcDEyRW5kcG9pbnQuc2V0TmFtZShzb2FwMTJFbmRwb2ludE5hbWUpOwotICAgICAgICBodHRwU29hcDEyRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldEVuZHBvaW50VVJMKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgaHR0cFNvYXAxMkVuZHBvaW50LnNldFRyYW5zcG9ydEluRGVzY3JpcHRpb24odXJsLmdldFByb3RvY29sKCkpOwotCi0gICAgICAgIHBvcHVsYXRlU29hcDEyRW5kcG9pbnQoYXhpc1NlcnZpY2UsIGh0dHBTb2FwMTJFbmRwb2ludCwgbnVsbCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZEVuZHBvaW50KGh0dHBTb2FwMTJFbmRwb2ludC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBTb2FwMTJFbmRwb2ludCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEh0dHBFbmRwb2ludChBeGlzU2VydmljZSBheGlzU2VydmljZSwgVVJMIHVybCkgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpOwotICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgKyBwcm90b2NvbC5zdWJzdHJpbmcoMSwgcHJvdG9jb2wubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGh0dHBFbmRwb2ludE5hbWUgPSBzZXJ2aWNlTmFtZSArIHByb3RvY29sICsgIkVuZHBvaW50IjsKLSAgICAgICAgQXhpc0VuZHBvaW50IGh0dHBFbmRwb2ludCA9IG5ldyBBeGlzRW5kcG9pbnQoKTsKLSAgICAgICAgaHR0cEVuZHBvaW50LnNldE5hbWUoaHR0cEVuZHBvaW50TmFtZSk7Ci0gICAgICAgIGh0dHBFbmRwb2ludC5zZXRQYXJlbnQoYXhpc1NlcnZpY2UpOwotICAgICAgICBodHRwRW5kcG9pbnQuc2V0RW5kcG9pbnRVUkwodXJsLnRvU3RyaW5nKCkpOwotICAgICAgICBodHRwRW5kcG9pbnQuc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbih1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgIHBvcHVsYXRlSHR0cEVuZHBvaW50KGF4aXNTZXJ2aWNlLCBodHRwRW5kcG9pbnQsIG51bGwpOwotICAgICAgICBheGlzU2VydmljZS5hZGRFbmRwb2ludChodHRwRW5kcG9pbnQuZ2V0TmFtZSgpLCBodHRwRW5kcG9pbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcm9jZXNzUG9saWN5QXR0YWNobWVudHMoSXRlcmF0b3IgYXR0YWNobWVudEVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotICAgICAgICBPTUVsZW1lbnQgYXR0YWNobWVudEVsZW1lbnQ7Ci0gICAgICAgIEhhc2hNYXAgYXR0YWNobWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGZvciAoOyBhdHRhY2htZW50RWxlbWVudHMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXR0YWNobWVudEVsZW1lbnQgPSAoT01FbGVtZW50KWF0dGFjaG1lbnRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgYXBwbGllc1RvRWxlbSA9IGF0dGFjaG1lbnRFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuUE9MSUNZX05TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19BUFBMSUVTX1RPKSk7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcG9saWN5Q29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgLy8gcHJvY2VzcyA8d3NwOlBvbGljeT4gZWxlbWVudHMgLi4KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcG9saWN5RWxlbWVudHMgPSBhdHRhY2htZW50RWxlbWVudAotICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudENvbnN0YW50cy5QT0xJQ1lfTlNfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuVEFHX1BPTElDWSkpOyBwb2xpY3lFbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFBvbGljeUNvbXBvbmVudCBwb2xpY3kgPSBQb2xpY3lVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UG9saWN5RnJvbU9NRWxlbWVudCgoT01FbGVtZW50KXBvbGljeUVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkpOwotICAgICAgICAgICAgICAgIHBvbGljeUNvbXBvbmVudHMuYWRkKHBvbGljeSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IGVsZW1lbnRzIC4uCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHBvbGljeVJlZkVsZW1lbnRzID0gYXR0YWNobWVudEVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGxveW1lbnRDb25zdGFudHMuUE9MSUNZX05TX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19QT0xJQ1lfUkVGKSk7IHBvbGljeVJlZkVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgUG9saWN5Q29tcG9uZW50IHBvbGljeVJlZiA9IFBvbGljeVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb2xpY3lSZWZlcmVuY2VGcm9tT01FbGVtZW50KChPTUVsZW1lbnQpcG9saWN5UmVmRWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgcG9saWN5Q29tcG9uZW50cy5hZGQocG9saWN5UmVmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBwb2xpY3lTdWJqZWN0cyA9IGFwcGxpZXNUb0VsZW0KLSAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKCJwb2xpY3ktc3ViamVjdCIpKTsgcG9saWN5U3ViamVjdHMKLSAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgcG9saWN5U3ViamVjdCA9IChPTUVsZW1lbnQpcG9saWN5U3ViamVjdHMubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gcG9saWN5U3ViamVjdC5nZXRBdHRyaWJ1dGVWYWx1ZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpZmllciIpKTsKLQotICAgICAgICAgICAgICAgIEFycmF5TGlzdCB2YWx1ZXMgPSAoQXJyYXlMaXN0KWF0dGFjaG1lbnRzTWFwLmdldChpZGVudGlmaWVyKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50c01hcC5wdXQoaWRlbnRpZmllciwgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWVzLmFkZEFsbChwb2xpY3lDb21wb25lbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBhdHRhY2htZW50c01hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSAoU3RyaW5nKW87Ci0gICAgICAgICAgICBpZiAoaWRlbnRpZmllci5zdGFydHNXaXRoKCJiaW5kaW5nOnNvYXAiKSkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NTb2FwQXR0YWNobWVudHMoaWRlbnRpZmllciwgKExpc3QpYXR0YWNobWVudHNNYXAKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaWRlbnRpZmllciksIHNlcnZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNvYXAxMUVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50LCBIYXNoTWFwIGJpbmRpbmdDYWNoZSkgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gc2VydmljZU5hbWUgKyAiU29hcDExQmluZGluZyI7Ci0KLSAgICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBuZXcgUU5hbWUobmFtZSk7Ci0KLSAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSAoYmluZGluZ0NhY2hlICE9IG51bGwpID8gKEF4aXNCaW5kaW5nKWJpbmRpbmdDYWNoZQotICAgICAgICAgICAgICAgIC5nZXQobmFtZSkKLSAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZyA9IG5ldyBBeGlzQmluZGluZygpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0TmFtZShiaW5kaW5nTmFtZSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETENvbnN0YW50cy5XU0RMXzFfMV9TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU1RZTEVfRE9DKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRDaGlsZHJlbigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gb3BlcmF0aW9uLmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLCBzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUJpbmRpbmdPcGVyYXRpb24oYXhpc0JpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJpbmRpbmdDYWNoZS5wdXQobmFtZSwgYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFBhcmVudChheGlzRW5kcG9pbnQpOwotICAgICAgICBheGlzRW5kcG9pbnQuc2V0QmluZGluZyhheGlzQmluZGluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNvYXAxMkVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50LCBIYXNoTWFwIGJpbmRpbmdDYWNoZSkgewotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gc2VydmljZU5hbWUgKyAiU29hcDEyQmluZGluZyI7Ci0KLSAgICAgICAgUU5hbWUgYmluZGluZ05hbWUgPSBuZXcgUU5hbWUobmFtZSk7Ci0KLSAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSAoYmluZGluZ0NhY2hlICE9IG51bGwpID8gKEF4aXNCaW5kaW5nKWJpbmRpbmdDYWNoZQotICAgICAgICAgICAgICAgIC5nZXQobmFtZSkKLSAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIGlmIChheGlzQmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZyA9IG5ldyBBeGlzQmluZGluZygpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0TmFtZShiaW5kaW5nTmFtZSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETENvbnN0YW50cy5XU0RMXzFfMV9TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuU1RZTEVfRE9DKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRDaGlsZHJlbigpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uID0gb3BlcmF0aW9uLmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLCBzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQmluZGluZ09wZXJhdGlvbihheGlzQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJpbmRpbmdDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0NhY2hlLnB1dChuYW1lLCBheGlzQmluZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc0JpbmRpbmcuc2V0UGFyZW50KGF4aXNFbmRwb2ludCk7Ci0gICAgICAgIGF4aXNFbmRwb2ludC5zZXRCaW5kaW5nKGF4aXNCaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlSHR0cEVuZHBvaW50KEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwgSGFzaE1hcCBiaW5kaW5nQ2FjaGUpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IHNlcnZpY2VOYW1lICsgIkh0dHBCaW5kaW5nIjsKLQotICAgICAgICBRTmFtZSBiaW5kaW5nTmFtZSA9IG5ldyBRTmFtZShuYW1lKTsKLQotICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZyA9IChiaW5kaW5nQ2FjaGUgIT0gbnVsbCkgPyAoQXhpc0JpbmRpbmcpYmluZGluZ0NhY2hlCi0gICAgICAgICAgICAgICAgLmdldChuYW1lKQotICAgICAgICAgICAgICAgIDogbnVsbDsKLQotICAgICAgICBpZiAoYXhpc0JpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldE5hbWUoYmluZGluZ05hbWUpOwotCi0gICAgICAgICAgICBheGlzQmluZGluZy5zZXRUeXBlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTUVUSE9ELCAiUE9TVCIpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0Q2hpbGRyZW4oKTsgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG5ldyBBeGlzQmluZGluZ09wZXJhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaHR0cExvY2F0aW9uID0gb3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTiwgaHR0cExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZy5hZGRDaGlsZChheGlzQmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVCaW5kaW5nT3BlcmF0aW9uKGF4aXNCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYmluZGluZ0NhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nQ2FjaGUucHV0KG5hbWUsIGF4aXNCaW5kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBheGlzQmluZGluZy5zZXRQYXJlbnQoYXhpc0VuZHBvaW50KTsKLSAgICAgICAgYXhpc0VuZHBvaW50LnNldEJpbmRpbmcoYXhpc0JpbmRpbmcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVCaW5kaW5nT3BlcmF0aW9uKEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uKSB7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgICAgIGlmIChXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNJbk1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdJbk1lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nSW5NZXNzYWdlLnNldE5hbWUoYXhpc0luTWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0RGlyZWN0aW9uKGF4aXNJbk1lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc0luTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nSW5NZXNzYWdlLnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5hZGRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ0luTWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoV1NETFV0aWwuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgQXhpc01lc3NhZ2UgYXhpc091dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nT3V0TWVzc2FnZSA9IG5ldyBBeGlzQmluZGluZ01lc3NhZ2UoKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldE5hbWUoYXhpc091dE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3V0TWVzc2FnZS5zZXREaXJlY3Rpb24oYXhpc091dE1lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldEF4aXNNZXNzYWdlKGF4aXNPdXRNZXNzYWdlKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdCBmYXVsdE1lc3NhZ2VzTGlzdCA9IGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpOwotICAgICAgICBmb3IgKE9iamVjdCBhRmF1bHRNZXNzYWdlc0xpc3QgOiBmYXVsdE1lc3NhZ2VzTGlzdCkgewotICAgICAgICAgICAgQXhpc01lc3NhZ2UgYXhpc0ZhdWx0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSlhRmF1bHRNZXNzYWdlc0xpc3Q7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXROYW1lKGF4aXNGYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHRNZXNzYWdlLnNldEZhdWx0KHRydWUpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc0ZhdWx0TWVzc2FnZSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXRQYXJlbnQoYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkRmF1bHQoYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkRmF1bHQoYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UGFyZW50KGF4aXNCaW5kaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NTb2FwQXR0YWNobWVudHMoU3RyaW5nIGlkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgcG9saWN5Q29tcG9uZW50cywgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBNYXAgbWFwID0gc2VydmljZS5nZXRFbmRwb2ludHMoKTsKLSAgICAgICAgU3RyaW5nIHNvYXBWZXJzaW9uID0KLSAgICAgICAgICAgICAgICAoaWRlbnRpZmllci5pbmRleE9mKCJzb2FwMTIiKSA+IC0xKSA/IFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLQotICAgICAgICBmb3IgKE9iamVjdCBvIDogbWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gKEF4aXNFbmRwb2ludClvOwotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgU3RyaW5nIHdzb2FwID0gKFN0cmluZylheGlzQmluZGluZwotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMod3NvYXApKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gaWRlbnRpZmllcnMgPSBpZGVudGlmaWVyLnNwbGl0KCIvIik7Ci0gICAgICAgICAgICAgICAgaW50IGtleSA9IGlkZW50aWZpZXJzLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBpZiAoa2V5ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeUNvbXBvbmVudHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gMiB8fCBrZXkgPT0gMykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BOYW1lID0gaWRlbnRpZmllcnNbMV07Ci0gICAgICAgICAgICAgICAgICAgIG9wTmFtZSA9IG9wTmFtZS5zdWJzdHJpbmcob3BOYW1lLmluZGV4T2YoIjoiKSArIDEsIG9wTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcE5hbWUuZXF1YWxzKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYmluZGluZyBvcGVyYXRpb24gIiArIG9wTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRhY2hQb2xpY3lDb21wb25lbnRzKHBvbGljeUNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJpbiIuZXF1YWxzKGlkZW50aWZpZXJzWzJdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nSW5NZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBeGlzQmluZGluZ01lc3NhZ2UpYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nSW5NZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dGFjaFBvbGljeUNvbXBvbmVudHMocG9saWN5Q29tcG9uZW50cyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm91dCIuZXF1YWxzKGlkZW50aWZpZXJzWzJdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nT3V0TWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXhpc0JpbmRpbmdNZXNzYWdlKWJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPdXRNZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dGFjaFBvbGljeUNvbXBvbmVudHMocG9saWN5Q29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZhdWx0cwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU29hcDExQmluZGluZyhBeGlzQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gYmluZGluZy5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuVFJBTlNQT1JUX1VSSS5lcXVhbHModHlwZSkKLSAgICAgICAgICAgIHx8IFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgU3RyaW5nIHYgPSAoU3RyaW5nKWJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTik7Ci0gICAgICAgICAgICBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU29hcDEyQmluZGluZyhBeGlzQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gYmluZGluZy5nZXRUeXBlKCk7Ci0gICAgICAgIGlmIChKYXZhMldTRExDb25zdGFudHMuVFJBTlNQT1JUX1VSSS5lcXVhbHModHlwZSkKLSAgICAgICAgICAgIHx8IFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgU3RyaW5nIHYgPSAoU3RyaW5nKWJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTik7Ci0gICAgICAgICAgICBpZiAoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHModikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSHR0cEJpbmRpbmcoQXhpc0JpbmRpbmcgYmluZGluZykgewotICAgICAgICBTdHJpbmcgdHlwZSA9IGJpbmRpbmcuZ2V0VHlwZSgpOwotICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFAuZXF1YWxzKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc0JpbmRpbmcgZ2V0U29hcDExQmluZGluZyhBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBzZXJ2aWNlLmdldEVuZHBvaW50cygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzRW5kcG9pbnQgZW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KW87Ci0gICAgICAgICAgICBBeGlzQmluZGluZyBiaW5kaW5nID0gZW5kcG9pbnQuZ2V0QmluZGluZygpOwotCi0gICAgICAgICAgICBpZiAoaXNTb2FwMTFCaW5kaW5nKGJpbmRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzQmluZGluZyBnZXRTb2FwMTJCaW5kaW5nKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IHNlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIEF4aXNFbmRwb2ludCBlbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpbzsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nIGJpbmRpbmcgPSBlbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc1NvYXAxMkJpbmRpbmcoYmluZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNCaW5kaW5nIGdldEh0dHBCaW5kaW5nKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IHNlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIEF4aXNFbmRwb2ludCBlbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpbzsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nIGJpbmRpbmcgPSBlbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0h0dHBCaW5kaW5nKGJpbmRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKEF4aXNCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIFFOYW1lIG9wTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgYmluZGluZ09wcyA9IGJpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsgYmluZGluZ09wcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pYmluZGluZ09wcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob3BOYW1lLmVxdWFscyhiaW5kaW5nT3AuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nT3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzQmluZGluZ01lc3NhZ2UgZ2V0QmluZGluZ01lc3NhZ2UoQXhpc0JpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIFN0cmluZyBtc2dOYW1lID0gbWVzc2FnZS5nZXROYW1lKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgYmluZGluZ01lc3NhZ2VzID0gYmluZGluZ09wZXJhdGlvbi5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgIGJpbmRpbmdNZXNzYWdlcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYmluZGluZ01lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKWJpbmRpbmdNZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobXNnTmFtZS5lcXVhbHMoYmluZGluZ01lc3NhZ2UuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nTWVzc2FnZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmcuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEwMzMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlBvbGljeVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLldTRExTZXJpYWxpemF0aW9uVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotCi0vKioKLSAqIEFuIEF4aXNCaW5kaW5nIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcsIGFuZCBjb250YWlucyBBeGlzQmluZGluZ09wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzQmluZGluZyBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIFFOYW1lIG5hbWU7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnM7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF4aXNCaW5kaW5nTWVzc2FnZT4gZmF1bHRzOwotCi0gICAgcHVibGljIEF4aXNCaW5kaW5nTWVzc2FnZSBnZXRGYXVsdChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKEF4aXNCaW5kaW5nTWVzc2FnZSkgZmF1bHRzLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdChBeGlzQmluZGluZ01lc3NhZ2UgZmF1bHQpIHsKLSAgICAgICAgdGhpcy5mYXVsdHMucHV0KGZhdWx0LmdldE5hbWUoKSwgZmF1bHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzQmluZGluZygpIHsKLSAgICAgICAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBmYXVsdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF4aXNCaW5kaW5nTWVzc2FnZT4oKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgb3B0aW9ucy5wdXQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNlYXJjaCBmb3IKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIG51bGwgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IG9wdGlvbnMuZ2V0KG5hbWUpOwotICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBuZWVkIHRoaXMgaGVyZSB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb250IHJldHVybiBhIFNPQVAgdmVyc2lvbiBmb3IgSFRUUCBCaW5kaW5ncwotICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLmVxdWFscyhuYW1lKSAmJgotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBvYmogPSBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuZ2V0RGVmYXVsdFZhbHVlKG5hbWUpOwotCi0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoQXhpc01vZHVsZSBheGlzTW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTb3JyeSB3ZSBkbyBub3Qgc3VwcG9ydCB0aGlzIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmdhZ2VkKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiYXhpc01lc3NhZ2UuaXNFbmdhZ2VkKCkgaXMgbm90IHN1cHBvcnRlZCIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgdGhlICZsdDtiaW5kaW5nJmd0OyBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzb2FwIHRoZSBTT0FQIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB3aHR0cCB0aGUgSFRUUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICAgICogQHBhcmFtIG5hbWVTcGFjZU1hcCB0aGUgbmFtZXNwYWNlTWFwIChwcmVmaXggLT4gbmFtZXNwYWNlVVJJKSBvZiB0aGUgc2VydmljZQotICAgICAqIEBwYXJhbSBhZGRyZXNzaW5nRmxhZyBhZGRyZXNzaW5nIHVzYWdlIGZsYWcgKHNlZSBBZGRyZXNzaW5nQ29uc3RhbnRzKQotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotICAgICAqIEByZXR1cm4gdGhlIGdlbmVyYXRlZCBiaW5kaW5nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IHRvV1NETDIwKE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywgT01OYW1lc3BhY2Ugd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3aHR0cCwgU3RyaW5nIGludGVyZmFjZU5hbWUsIE1hcCBuYW1lU3BhY2VNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2F3KSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgYmluZGluZ0VsZW1lbnQ7Ci0gICAgICAgIGJpbmRpbmdFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSkpOwotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHModHlwZSkgfHwgQ29uc3RhbnRzLlVSSV9TT0FQMTFfSFRUUC5lcXVhbHModHlwZSkgfHwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1NPQVAxMl9IVFRQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgLy8gU09BUCBCaW5kaW5nIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQKSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHByb3BlcnR5KSkgewotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9WRVJTSU9OLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5TT0FQX1ZFUlNJT05fMV8xKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfVkVSU0lPTiwgd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuU09BUF9WRVJTSU9OXzFfMikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvcHRpb25zLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1BST1RPQ09MKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9QUk9UT0NPTCwgd3NvYXAsIHByb3BlcnR5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NRVApOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX01FUF9ERUZBVUxULCB3c29hcCwgcHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdCBzb2FwTW9kdWxlcyA9IChBcnJheUxpc3Qpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUpOwotICAgICAgICAgICAgaWYgKHNvYXBNb2R1bGVzICE9IG51bGwgJiYgc29hcE1vZHVsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFNPQVBNb2R1bGVFbGVtZW50cyhvbUZhY3RvcnksIHNvYXBNb2R1bGVzLCB3c29hcCwgYmluZGluZ0VsZW1lbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwKLSAgICAgICAgICAgICAgICAgICAgLmFkZFdTQWRkcmVzc2luZ1RvQmluZGluZyhhZGRyZXNzaW5nRmxhZywgb21GYWN0b3J5LCBiaW5kaW5nRWxlbWVudCwgd3Nhdyk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUC5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIC8vIEhUVFAgQmluZGluZyBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9NRVRIT0QpOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX01FVEhPRF9ERUZBVUxULCB3aHR0cCwgcHJvcGVydHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb21tb24gUHJvcGVydGllcwotICAgICAgICBwcm9wZXJ0eSA9IChTdHJpbmcpb3B0aW9ucy5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9DT05URU5UX0VOQ09ESU5HX0RFRkFVTFQsIHdodHRwLCBwcm9wZXJ0eSkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5ID0gKFN0cmluZylvcHRpb25zLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IpOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1FVRVJZX1BBUkFNRVRFUl9TRVBFUkFUT1JfREVGQVVMVCwgd2h0dHAsIHByb3BlcnR5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQb3B1bGF0ZSBCaW5kaW5nIGZhdWx0cwotICAgICAgICBpZiAoZmF1bHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPEF4aXNCaW5kaW5nTWVzc2FnZT4gaXRlcmF0b3IgPSBmYXVsdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdGYXVsdCA9IChBeGlzQmluZGluZ01lc3NhZ2UpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC50b1dTREwyMCh3c2RsLCB0bnMsIHdzb2FwLCB3aHR0cCwgbmFtZVNwYWNlTWFwKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2V0TG9jYWxOYW1lKFdTREwyQ29uc3RhbnRzLkZBVUxUX0xPQ0FMX05BTUUpOwotICAgICAgICAgICAgICAgIGJpbmRpbmdFbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2hpbGQob21FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFBvcHVsYXRlIEJpbmRpbmcgT3BlcmF0aW9ucwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgYXhpc09wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaXMgYSBjb250cm9sIG9wZXJhdGlvbiB3ZSBkbyBub3Qgd2FudCB0bwotICAgICAgICAgICAgLy8gaGF2ZSBpdCBsaXN0ZWQgaW4gdGhlIFdTREwKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwgJiYgYXhpc09wZXJhdGlvbi5pc0NvbnRyb2xPcGVyYXRpb24oKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGluZ0VsZW1lbnQuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24udG9XU0RMMjAod3NkbCwgdG5zLCB3c29hcCwgd2h0dHAsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VNYXAsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudCh0aGlzLCBiaW5kaW5nRWxlbWVudCwgb21GYWN0b3J5LCB3c2RsKTsKLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFBvbGljaWVzQXNFeHRlbnNpYmxlRWxlbWVudCh0aGlzLAotCQkJCWJpbmRpbmdFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdFbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgUG9saWN5IGdldEVmZmVjdGl2ZVBvbGljeSgpIHsKLSAgICAgICAgQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4gcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PigpOwotICAgICAgICBwb2xpY3lMaXN0LmFkZEFsbChnZXRQb2xpY3lJbmNsdWRlKCkuZ2V0QXR0YWNoZWRQb2xpY2llcygpKTsKLSAgICAgCi0gICAgICAgIC8vIEF4aXNFbmRwb2ludAotICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gZ2V0QXhpc0VuZHBvaW50KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvbGljeUxpc3QuYWRkQWxsKGF4aXNFbmRwb2ludC5nZXRQb2xpY3lJbmNsdWRlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dGFjaGVkUG9saWNpZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGF4aXNFbmRwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlID0gYXhpc0VuZHBvaW50LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBvbGljeSBlZmZlY3RpdmVQb2xpY3kgPSBzZXJ2aWNlLmdldFBvbGljeUluY2x1ZGUoKS5nZXRFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVQb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvbGljeUxpc3QuYWRkKGVmZmVjdGl2ZVBvbGljeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBQb2xpY3lVdGlsLmdldE1lcmdlZFBvbGljeShwb2xpY3lMaXN0LCAgdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNFbmRwb2ludCBnZXRBeGlzRW5kcG9pbnQoKSB7Ci0gICAgICAgIHJldHVybiAoQXhpc0VuZHBvaW50KXBhcmVudDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEl0ZXJhdG9yPEF4aXNCaW5kaW5nT3BlcmF0aW9uPiBnZXRDaGlsZHJlbigpewotICAgIAlyZXR1cm4gKEl0ZXJhdG9yPEF4aXNCaW5kaW5nT3BlcmF0aW9uPikgc3VwZXIuZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmdNZXNzYWdlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmdNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDBmZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNCaW5kaW5nTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETDIwVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETFNlcmlhbGl6YXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotcHVibGljIGNsYXNzIEF4aXNCaW5kaW5nTWVzc2FnZSBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGlyZWN0aW9uOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnM7Ci0KLQlwcml2YXRlIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlOwotCi0JLy8gVXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoaXMgbWVzc2FnZSBpcyBhIGZhdWx0IG9yIG5vdC4gTmVlZGVkIGZvciB0aGUKLQkvLyBXU0RMIDIuMCBzZXJpYWxpemVyCi0JcHJpdmF0ZSBib29sZWFuIGZhdWx0ID0gZmFsc2U7Ci0KLQlwcml2YXRlIFBvbGljeSBlZmZlY3RpdmVQb2xpY3kgPSBudWxsOwotCXByaXZhdGUgRGF0ZSBsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSA9IG51bGw7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KCkgewotCQlyZXR1cm4gZmF1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmF1bHQoYm9vbGVhbiBmYXVsdCkgewotCQl0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIEF4aXNNZXNzYWdlIGdldEF4aXNNZXNzYWdlKCkgewotCQlyZXR1cm4gYXhpc01lc3NhZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXhpc01lc3NhZ2UoQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UpIHsKLQkJdGhpcy5heGlzTWVzc2FnZSA9IGF4aXNNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gZGlyZWN0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpcmVjdGlvbihTdHJpbmcgZGlyZWN0aW9uKSB7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCX0KLQotCXB1YmxpYyBBeGlzQmluZGluZ01lc3NhZ2UoKSB7Ci0JCW9wdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCW9wdGlvbnMucHV0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlPYmplY3Qgb2JqID0gb3B0aW9ucy5nZXQobmFtZSk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsgLy8gVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8Ci0JCS8vIFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0JfQotCi0JcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU29ycnkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChTdHJpbmcgbW9kdWxlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJImF4aXNNZXNzYWdlLmlzRW5nYWdlZCgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgYmluZGluZ01lc3NhZ2UgZWxlbWVudCAoY2FuIGJlIGlucHV0LCBvdXRwdXQsIGluZmF1bHQgb3IKLQkgKiBvdXRmYXVsdCkKLQkgKiAKLQkgKiBAcGFyYW0gdG5zIC0KLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXRuYW1lc3BhY2UKLQkgKiBAcGFyYW0gd3NvYXAgLQotCSAqICAgICAgICAgICAgVGhlIFNPQVAgbmFtZXNwYWNlIChXU0RMIDIuMCkKLQkgKiBAcGFyYW0gd2h0dHAgLQotCSAqICAgICAgICAgICAgVGhlIEhUVFAgbmFtZXNwYWNlIChXU0RMIDIuMCkKLQkgKiBAcGFyYW0gbmFtZVNwYWNlTWFwIC0KLQkgKiAgICAgICAgICAgIFRoZSBuYW1lc3BhY2VtYXAgb2YgdGhlIHNlcnZpY2UKLQkgKiBAcmV0dXJuIFRoZSBnZW5lcmF0ZWQgYmluZGluZ01lc3NhZ2UgZWxlbWVudAotCSAqLwotCXB1YmxpYyBPTUVsZW1lbnQgdG9XU0RMMjAoT01OYW1lc3BhY2Ugd3NkbCwgT01OYW1lc3BhY2UgdG5zLAotCQkJT01OYW1lc3BhY2Ugd3NvYXAsIE9NTmFtZXNwYWNlIHdodHRwLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVTcGFjZU1hcCkgewotCQlTdHJpbmcgcHJvcGVydHk7Ci0JCUFycmF5TGlzdCBsaXN0OwotCQlPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0JCU9NRWxlbWVudCBiaW5kaW5nTWVzc2FnZUVsZW1lbnQ7Ci0KLQkJLy8gSWYgdGhpcyBpcyBhIGZhdWx0LCBjcmVhdGUgYSBmYXVsdCBlbGVtZW50IGFuZCBhZGQgZmF1bHQgc3BlY2lmaWMKLQkJLy8gcHJvcGVydGllcwotCQlpZiAodGhpcy5pc0ZhdWx0KCkpIHsKLQkJCWlmICh0aGlzLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQXhpc0JpbmRpbmcpIHsKLQkJCQliaW5kaW5nTWVzc2FnZUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJV1NETDJDb25zdGFudHMuRkFVTFRfTE9DQUxfTkFNRSwgd3NkbCk7Ci0JCQl9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTi5lcXVhbHModGhpcwotCQkJCQkuZ2V0RGlyZWN0aW9uKCkpKSB7Ci0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLklOX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJfSBlbHNlIHsKLQkJCQliaW5kaW5nTWVzc2FnZUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJV1NETDJDb25zdGFudHMuT1VUX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJfQotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRUYsIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IgotCQkJCQkJCSsgdGhpcy5uYW1lKSk7Ci0KLQkJCVdTREwyMFV0aWwuZXh0cmFjdFdTREwyMFNvYXBGYXVsdEluZm8ob3B0aW9ucywKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBvbUZhY3RvcnksIHdzb2FwKTsKLQotCQkJSW50ZWdlciBjb2RlID0gKEludGVnZXIpIHRoaXMub3B0aW9ucwotCQkJCQkuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09ERSk7Ci0JCQlpZiAoY29kZSAhPSBudWxsKSB7Ci0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQ09ERSwgd2h0dHAsIGNvZGUudG9TdHJpbmcoKSkpOwotCQkJfQotCi0JCQkvLyBDaGVja3Mgd2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBpbnB1dCBtZXNzYWdlCi0JCX0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOLmVxdWFscyh0aGlzCi0JCQkJLmdldERpcmVjdGlvbigpKSkgewotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJV1NETDJDb25zdGFudHMuSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCi0JCQkvLyBNZXNzYWdlIHNob3VsZCBiZSBhbiBvdXRwdXQgbWVzc2FnZQotCQl9IGVsc2UgewotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJV1NETDJDb25zdGFudHMuT1VUX1BVVF9MT0NBTF9OQU1FLCB3c2RsKTsKLQkJfQotCi0JCS8vIFBvcHVsYXRlIGNvbW1vbiBwcm9wZXJ0aWVzCi0JCXByb3BlcnR5ID0gKFN0cmluZykgdGhpcy5vcHRpb25zCi0JCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50Ci0JCQkJCS5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9DT05URU5UX0VOQ09ESU5HLCB3aHR0cCwKLQkJCQkJCQlwcm9wZXJ0eSkpOwotCQl9Ci0JCWxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRIVFRQSGVhZGVyRWxlbWVudHMob21GYWN0b3J5LCBsaXN0LCB3aHR0cCwKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBuYW1lU3BhY2VNYXApOwotCQl9Ci0JCWxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRTT0FQSGVhZGVyRWxlbWVudHMob21GYWN0b3J5LCBsaXN0LCB3c29hcCwKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBuYW1lU3BhY2VNYXApOwotCQl9Ci0JCWxpc3QgPSAoQXJyYXlMaXN0KSB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTU9EVUxFKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRTT0FQTW9kdWxlRWxlbWVudHMob21GYWN0b3J5LCBsaXN0LCB3c29hcCwKLQkJCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50KTsKLQkJfQotCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KHRoaXMsCi0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkUG9saWNpZXNBc0V4dGVuc2libGVFbGVtZW50KHRoaXMsCi0JCQkJYmluZGluZ01lc3NhZ2VFbGVtZW50KTsKLQkJcmV0dXJuIGJpbmRpbmdNZXNzYWdlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgQXhpc0JpbmRpbmdPcGVyYXRpb24gZ2V0QXhpc0JpbmRpbmdPcGVyYXRpb24oKSB7Ci0JCXJldHVybiAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGdldEVmZmVjdGl2ZVBvbGljeSgpIHsKLQkgICAgICAgaWYgKGxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lID09IG51bGwgfHwgaXNQb2xpY3lVcGRhdGVkKCkpIHsKLQkJCWVmZmVjdGl2ZVBvbGljeSA9IGNhbGN1bGF0ZUVmZmVjdGl2ZVBvbGljeSgpOwotCQl9Ci0JCXJldHVybiBlZmZlY3RpdmVQb2xpY3k7Ci0JfQotCi0JcHVibGljIFBvbGljeSBjYWxjdWxhdGVFZmZlY3RpdmVQb2xpY3koKSB7Ci0JCVBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCA9IG51bGw7Ci0JCUFycmF5TGlzdCBwb2xpY3lMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIEF4aXNCaW5kaW5nTWVzc2FnZQotCQlwb2xpY3lTdWJqZWN0ID0gZ2V0UG9saWN5U3ViamVjdCgpOwotCQlwb2xpY3lMaXN0LmFkZEFsbChwb2xpY3lTdWJqZWN0LmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQotCQkvLyBBeGlzQmluZGluZ09wZXJhdGlvbiBwb2xpY2llcwotCQlBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IGdldEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0JCWlmIChheGlzQmluZGluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlwb2xpY3lMaXN0LmFkZEFsbChheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQkJfQotCi0JCS8vIEF4aXNCaW5kaW5nCi0JCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gKGF4aXNCaW5kaW5nT3BlcmF0aW9uID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc0JpbmRpbmcoKTsKLQkJaWYgKGF4aXNCaW5kaW5nICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNCaW5kaW5nLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc0VuZHBvaW50Ci0JCUF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPSAoYXhpc0JpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogYXhpc0JpbmRpbmcKLQkJCQkuZ2V0QXhpc0VuZHBvaW50KCk7Ci0JCWlmIChheGlzRW5kcG9pbnQgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc0VuZHBvaW50LmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc01lc3NhZ2UKLQkJaWYgKGF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNNZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc09wZXJhdGlvbgotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoYXhpc01lc3NhZ2UgPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzTWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0JCWlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLQotCQkvLyBBeGlzU2VydmljZQotCQlBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChheGlzT3BlcmF0aW9uID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc09wZXJhdGlvbi5nZXRBeGlzU2VydmljZSgpOwotCQlpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc1NlcnZpY2UuZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLQotCQkvLyBBeGlzQ29uZmlndXJhdGlvbgotCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IChheGlzU2VydmljZSA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlwb2xpY3lMaXN0LmFkZEFsbChheGlzQ29uZmlndXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpKTsKLQkJfQotCi0JCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lID0gbmV3IERhdGUoKTsKLQkJcmV0dXJuIFBvbGljeVV0aWwuZ2V0TWVyZ2VkUG9saWN5KHBvbGljeUxpc3QsIGF4aXNTZXJ2aWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzUG9saWN5VXBkYXRlZCgpIHsKLQkJaWYgKGdldFBvbGljeVN1YmplY3QoKS5nZXRMYXN0VXBkYXRlZFRpbWUoKS5hZnRlcigKLQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCUF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gZ2V0QXhpc0JpbmRpbmdPcGVyYXRpb24oKTsKLQkJaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwKLQkJCQkmJiBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkKLQkJCQkJCS5hZnRlcihsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNCaW5kaW5nCi0JCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gKGF4aXNCaW5kaW5nT3BlcmF0aW9uID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc0JpbmRpbmcoKTsKLQkJaWYgKGF4aXNCaW5kaW5nICE9IG51bGwKLQkJCQkmJiBheGlzQmluZGluZy5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkuYWZ0ZXIoCi0JCQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNFbmRwb2ludAotCQlBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gKGF4aXNCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGF4aXNCaW5kaW5nCi0JCQkJLmdldEF4aXNFbmRwb2ludCgpOwotCQlpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwKLQkJCQkmJiBheGlzRW5kcG9pbnQuZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpLmFmdGVyKAotCQkJCQkJbGFzdFBvbGljeUNhbGN1YXRlZFRpbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBBeGlzTWVzc2FnZQotCQlpZiAoYXhpc01lc3NhZ2UgIT0gbnVsbAotCQkJCSYmIGF4aXNNZXNzYWdlLmdldFBvbGljeVN1YmplY3QoKS5nZXRMYXN0VXBkYXRlZFRpbWUoKS5hZnRlcigKLQkJCQkJCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gQXhpc09wZXJhdGlvbgotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoYXhpc01lc3NhZ2UgPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzTWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0JCWlmIChheGlzT3BlcmF0aW9uICE9IG51bGwKLQkJCQkmJiBheGlzT3BlcmF0aW9uLmdldFBvbGljeVN1YmplY3QoKS5nZXRMYXN0VXBkYXRlZFRpbWUoKS5hZnRlcigKLQkJCQkJCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gQXhpc1NlcnZpY2UKLQkJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNPcGVyYXRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLQkJaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwKLQkJCQkmJiBheGlzU2VydmljZS5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkuYWZ0ZXIoCi0JCQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNDb25maWd1cmF0aW9uCi0JCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gKGF4aXNTZXJ2aWNlID09IG51bGwpID8gbnVsbAotCQkJCTogYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwKLQkJCQkmJiBheGlzQ29uZmlndXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkKLQkJCQkJCS5hZnRlcihsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0JpbmRpbmdPcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGFlZDU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5XU0RMU2VyaWFsaXphdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLQotLyoqCi0gKiBBbiBBeGlzQmluZGluZ09wZXJhdGlvbiByZXByZXNlbnRzIGEgV1NETCAmbHQ7YmluZGluZ09wZXJhdGlvbiZndDsKLSAqLwotcHVibGljIGNsYXNzIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGV4dGVuZHMgQXhpc0Rlc2NyaXB0aW9uIHsKLQotCXByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotCi0JcHJpdmF0ZSBRTmFtZSBuYW1lOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBBeGlzQmluZGluZ01lc3NhZ2U+IGZhdWx0czsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zOwotCi0JcHVibGljIEF4aXNCaW5kaW5nT3BlcmF0aW9uKCkgewotCQlvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWZhdWx0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc0JpbmRpbmdNZXNzYWdlPigpOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3Q8QXhpc0JpbmRpbmdNZXNzYWdlPiBnZXRGYXVsdHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PEF4aXNCaW5kaW5nTWVzc2FnZT4oZmF1bHRzLnZhbHVlcygpKTsKLQl9Ci0KLQlwdWJsaWMgQXhpc0JpbmRpbmdNZXNzYWdlIGdldEZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoQXhpc0JpbmRpbmdNZXNzYWdlKSBmYXVsdHMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZhdWx0KEF4aXNCaW5kaW5nTWVzc2FnZSBmYXVsdCkgewotCQl0aGlzLmZhdWx0cy5wdXQoZmF1bHQuZ2V0TmFtZSgpLCBmYXVsdCk7Ci0JfQotCi0JcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoUU5hbWUgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBheGlzT3BlcmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF4aXNPcGVyYXRpb24oQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB7Ci0JCXRoaXMuYXhpc09wZXJhdGlvbiA9IGF4aXNPcGVyYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlvcHRpb25zLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlPYmplY3QgcHJvcGVydHkgPSB0aGlzLm9wdGlvbnMuZ2V0KG5hbWUpOwotCi0JCUF4aXNCaW5kaW5nIHBhcmVudDsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwgJiYgKHBhcmVudCA9IGdldEF4aXNCaW5kaW5nKCkpICE9IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gcGFyZW50LmdldFByb3BlcnR5KG5hbWUpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShuYW1lKTsKLQkJfQotCi0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU29ycnkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChTdHJpbmcgbW9kdWxlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0JCQkJImF4aXNNZXNzYWdlLmlzRW5nYWdlZCgpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgYmluZGluZ09wZXJhdGlvbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHdzZGwKLQkgKiAgICAgICAgICAgIFRoZSBXU0RMIG5hbWVzcGFjZQotCSAqIEBwYXJhbSB0bnMKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXRuYW1lc3BhY2UKLQkgKiBAcGFyYW0gd3NvYXAKLQkgKiAgICAgICAgICAgIFRoZSBTT0FQIG5hbWVzcGFjZSAoV1NETCAyLjApCi0JICogQHBhcmFtIHdodHRwCi0JICogICAgICAgICAgICBUaGUgSFRUUCBuYW1lc3BhY2UgKFdTREwgMi4wKQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYmluZGluZyBpcyBTT0FQIG9yIEhUVFAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlTWFwCi0JICogICAgICAgICAgICB0aGUgc2VydmljZSdzIG5hbWVzcGFjZSBtYXAgKHByZWZpeCAtPiBuYW1lc3BhY2UpCi0JICogQHBhcmFtIHNlcnZpY2VOYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotCSAqIEByZXR1cm4gVGhlIGdlbmVyYXRlZCBiaW5kaW5nIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgT01FbGVtZW50IHRvV1NETDIwKE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywKLQkJCU9NTmFtZXNwYWNlIHdzb2FwLCBPTU5hbWVzcGFjZSB3aHR0cCwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVzcGFjZU1hcCwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCVN0cmluZyBwcm9wZXJ0eTsKLQkJT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCQlPTUVsZW1lbnQgYmluZGluZ09wRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoCi0JCQkJV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX0xPQ0FMX05BTUUsIHdzZGwpOwotCQliaW5kaW5nT3BFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1JFRiwgbnVsbCwgdG5zLmdldFByZWZpeCgpICsgIjoiCi0JCQkJCQkrIHRoaXMubmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotCi0JCWlmIChXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHModHlwZSkKLQkJCQl8fCBDb25zdGFudHMuVVJJX1NPQVAxMV9IVFRQLmVxdWFscyh0eXBlKQotCQkJCXx8IENvbnN0YW50cy5VUklfU09BUDEyX0hUVFAuZXF1YWxzKHR5cGUpKSB7Ci0JCQkvLyBTT0FQIEJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0FDVElPTik7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BQ1RJT04sIHdzb2FwLCBwcm9wZXJ0eSkpOwotCQkJfQotCQkJQXJyYXlMaXN0IHNvYXBNb2R1bGVzID0gKEFycmF5TGlzdCkgdGhpcy5vcHRpb25zCi0JCQkJCS5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUpOwotCQkJaWYgKHNvYXBNb2R1bGVzICE9IG51bGwgJiYgc29hcE1vZHVsZXMuc2l6ZSgpID4gMCkgewotCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRTT0FQTW9kdWxlRWxlbWVudHMob21GYWN0b3J5LAotCQkJCQkJc29hcE1vZHVsZXMsIHdzb2FwLCBiaW5kaW5nT3BFbGVtZW50KTsKLQkJCX0KLQkJCXByb3BlcnR5ID0gKFN0cmluZykgdGhpcy5vcHRpb25zLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCk7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9NRVAsIHdzb2FwLCBwcm9wZXJ0eSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotCi0JCQkvLyBIVFRQIEJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lOUFVUX1NFUklBTElaQVRJT04pOwotCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQliaW5kaW5nT3BFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0JCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfSU5QVVRfU0VSSUFMSVpBVElPTiwgd2h0dHAsCi0JCQkJCQlwcm9wZXJ0eSkpOwotCQkJfQotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX09VVFBVVF9TRVJJQUxJWkFUSU9OKTsKLQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJYmluZGluZ09wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX09VVFBVVF9TRVJJQUxJWkFUSU9OLCB3aHR0cCwKLQkJCQkJCXByb3BlcnR5KSk7Ci0JCQl9Ci0JCQlwcm9wZXJ0eSA9IChTdHJpbmcpIHRoaXMub3B0aW9ucwotCQkJCQkuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfRkFVTFRfU0VSSUFMSVpBVElPTik7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9GQVVMVF9TRVJJQUxJWkFUSU9OLCB3aHR0cCwKLQkJCQkJCXByb3BlcnR5KSk7Ci0JCQl9Ci0JCQlCb29sZWFuIGlnbm9yZVVuY2l0ZWQgPSAoQm9vbGVhbikgdGhpcy5vcHRpb25zCi0JCQkJCS5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JR05PUkVfVU5DSVRFRCk7Ci0JCQlpZiAoaWdub3JlVW5jaXRlZCAhPSBudWxsKSB7Ci0JCQkJYmluZGluZ09wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0lHTk9SRV9VTkNJVEVELCB3aHR0cCwKLQkJCQkJCWlnbm9yZVVuY2l0ZWQudG9TdHJpbmcoKSkpOwotCQkJfQotCQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCk7Ci0JCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCVdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9NRVRIT0QsIHdodHRwLCBwcm9wZXJ0eSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gQ29tbW9uIHByb3BlcnRpZXMKLQkJcHJvcGVydHkgPSAoU3RyaW5nKSB0aGlzLm9wdGlvbnMKLQkJCQkuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04pOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJYmluZGluZ09wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTE9DQVRJT04sIHdodHRwLCBwcm9wZXJ0eSkpOwotCQl9Ci0JCXByb3BlcnR5ID0gKFN0cmluZykgdGhpcy5vcHRpb25zCi0JCQkJLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJYmluZGluZ09wRWxlbWVudAotCQkJCQkuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQ09OVEVOVF9FTkNPRElORywgd2h0dHAsCi0JCQkJCQkJcHJvcGVydHkpKTsKLQkJfQotCQlwcm9wZXJ0eSA9IChTdHJpbmcpIHRoaXMub3B0aW9ucwotCQkJCS5nZXQoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCWJpbmRpbmdPcEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQkJV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1FVRVJZX1BBUkFNRVRFUl9TRVBFUkFUT1IsIHdodHRwLAotCQkJCQlwcm9wZXJ0eSkpOwotCQl9Ci0JCQotCQkvLyBBZGQgdGhlIGlucHV0IGVsZW1lbnQKLQkJQXhpc0JpbmRpbmdNZXNzYWdlIGluTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIHRoaXMKLQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKTsKLQkJaWYgKGluTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQliaW5kaW5nT3BFbGVtZW50LmFkZENoaWxkKGluTWVzc2FnZS50b1dTREwyMCh3c2RsLCB0bnMsIHdzb2FwLAotCQkJCQl3aHR0cCwgbmFtZXNwYWNlTWFwKSk7Ci0JCX0KLQotCQkvLyBBZGQgdGhlIG91dHB1dCBlbGVtZW50Ci0JCUF4aXNCaW5kaW5nTWVzc2FnZSBvdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgdGhpcwotCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUKTsKLQkJaWYgKG91dE1lc3NhZ2UgIT0gbnVsbCkgewotCQkJYmluZGluZ09wRWxlbWVudC5hZGRDaGlsZChvdXRNZXNzYWdlLnRvV1NETDIwKHdzZGwsIHRucywgd3NvYXAsCi0JCQkJCXdodHRwLCBuYW1lc3BhY2VNYXApKTsKLQkJfQotCi0JCS8vIEFkZCBhbnkgZmF1bHQgZWxlbWVudHMKLQkJaWYgKGZhdWx0cyAhPSBudWxsICYmIGZhdWx0cy5zaXplKCkgPiAwKSB7Ci0JCQlDb2xsZWN0aW9uPEF4aXNCaW5kaW5nTWVzc2FnZT4gZmF1bHRWYWx1ZXMgPSBmYXVsdHMudmFsdWVzKCk7Ci0JCQlJdGVyYXRvcjxBeGlzQmluZGluZ01lc3NhZ2U+IGl0ZXJhdG9yID0gZmF1bHRWYWx1ZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgZmF1bHRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgaXRlcmF0b3IKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJYmluZGluZ09wRWxlbWVudC5hZGRDaGlsZChmYXVsdE1lc3NhZ2UudG9XU0RMMjAod3NkbCwgdG5zLAotCQkJCQkJd3NvYXAsIHdodHRwLCBuYW1lc3BhY2VNYXApKTsKLQkJCX0KLQkJfQotCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KHRoaXMsCi0JCQkJYmluZGluZ09wRWxlbWVudCwgb21GYWN0b3J5LCB3c2RsKTsKLQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFBvbGljaWVzQXNFeHRlbnNpYmxlRWxlbWVudCh0aGlzLAotCQkJCWJpbmRpbmdPcEVsZW1lbnQpOwotCQlyZXR1cm4gYmluZGluZ09wRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGdldEVmZmVjdGl2ZVBvbGljeSgpIHsKLQkJQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4gcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PigpOwotCi0JCVBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZTsKLQotCQkvLyBBeGlzQmluZGluZ09wZXJhdGlvbiBwb2xpY2llcwotCQlwb2xpY3lJbmNsdWRlID0gZ2V0UG9saWN5SW5jbHVkZSgpOwotCQlwb2xpY3lMaXN0LmFkZEFsbChwb2xpY3lJbmNsdWRlLmdldEF0dGFjaGVkUG9saWNpZXMoKSk7Ci0KLQkJLy8gQXhpc0JpbmRpbmcKLQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBnZXRBeGlzQmluZGluZygpOwotCQlpZiAoYXhpc0JpbmRpbmcgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc0JpbmRpbmcuZ2V0UG9saWN5SW5jbHVkZSgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljaWVzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc0VuZHBvaW50Ci0JCUF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPSBudWxsOwotCQlpZiAoYXhpc0JpbmRpbmcgIT0gbnVsbCkgewotCQkJYXhpc0VuZHBvaW50ID0gYXhpc0JpbmRpbmcuZ2V0QXhpc0VuZHBvaW50KCk7Ci0JCX0KLQotCQlpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNFbmRwb2ludC5nZXRQb2xpY3lJbmNsdWRlKCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWNpZXMoKSk7Ci0JCX0KLQotCQkvLyBBeGlzT3BlcmF0aW9uCi0JCVBvbGljeSBheGlzT3BlcmF0aW9uUG9saWN5ID0gYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCkKLQkJCQkuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0KLQkJaWYgKGF4aXNPcGVyYXRpb25Qb2xpY3kgIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGQoYXhpc09wZXJhdGlvblBvbGljeSk7Ci0JCX0KLQotCQlyZXR1cm4gUG9saWN5VXRpbC5nZXRNZXJnZWRQb2xpY3kocG9saWN5TGlzdCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIEF4aXNCaW5kaW5nIGdldEF4aXNCaW5kaW5nKCkgewotCQlyZXR1cm4gKEF4aXNCaW5kaW5nKSBwYXJlbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNEZXNjcmlwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFiNTk4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01UZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEF4aXNEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmFtZXRlckluY2x1ZGUsIERlc2NyaXB0aW9uQ29uc3RhbnRzIHsKLQotICAgIHByb3RlY3RlZCBBeGlzRGVzY3JpcHRpb24gcGFyZW50ID0gbnVsbDsKLQotICAgIHByaXZhdGUgUGFyYW1ldGVySW5jbHVkZSBwYXJhbWV0ZXJJbmNsdWRlOwotCi0gICAgcHJpdmF0ZSBQb2xpY3lJbmNsdWRlIHBvbGljeUluY2x1ZGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBQb2xpY3lTdWJqZWN0IHBvbGljeVN1YmplY3QgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBBeGlzRGVzY3JpcHRpb24+IGNoaWxkcmVuOwotCi0gICAgLyoqCi0gICAgICogTWFwIG9mIG1vZHVsZXMgZW5nYWdlZCBvbiB0aGlzIG9iamVjdC4gVGhlIGtleSBpcyB0aGUgYXJjaGl2ZSBuYW1lIGFzIGRlZmluZWQgYnkKLSAgICAgKiB7QGxpbmsgQXhpc01vZHVsZSNnZXRBcmNoaXZlTmFtZSgpfS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgQXhpc01vZHVsZT4gZW5nYWdlZE1vZHVsZXM7Ci0KLSAgICAvKiogTGlzdCBvZiBQYXJhbWV0ZXJPYnNlcnZlcnMgd2hvIHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgY2hhbmdlcyAqLwotICAgIHByb3RlY3RlZCBMaXN0PFBhcmFtZXRlck9ic2VydmVyPiBwYXJhbWV0ZXJPYnNlcnZlcnMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0KLSAgICAvLyBIb2xkcyB0aGUgZG9jdW1lbnRhdGlvbiBkZXRhaWxzIGZvciBlYWNoIGVsZW1lbnQKLSAgICBwcml2YXRlIE9NTm9kZSBkb2N1bWVudGF0aW9uOwotCi0gICAgLy8gY3JlYXRpbmcgYSBsb2dnZXIgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0Rlc2NyaXB0aW9uLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBeGlzRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHBhcmFtZXRlckluY2x1ZGUgPSBuZXcgUGFyYW1ldGVySW5jbHVkZUltcGwoKTsKLSAgICAgICAgY2hpbGRyZW4gPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8T2JqZWN0LCBBeGlzRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgIHBvbGljeVN1YmplY3QgPSBuZXcgUG9saWN5U3ViamVjdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlck9ic2VydmVyKFBhcmFtZXRlck9ic2VydmVyIG9ic2VydmVyKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJPYnNlcnZlcnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHBhcmFtZXRlck9ic2VydmVycyA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyT2JzZXJ2ZXI+KCk7Ci0gICAgICAgIHBhcmFtZXRlck9ic2VydmVycy5hZGQob2JzZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlck9ic2VydmVyKFBhcmFtZXRlck9ic2VydmVyIG9ic2VydmVyKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJPYnNlcnZlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVyT2JzZXJ2ZXJzLnJlbW92ZShvYnNlcnZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW0pOwotCi0gICAgICAgIC8vIFRlbGwgYW55b25lIHdobyB3YW50cyB0byBrbm93Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJPYnNlcnZlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgcGFyYW1ldGVyT2JzZXJ2ZXIgOiBwYXJhbWV0ZXJPYnNlcnZlcnMpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJPYnNlcnZlciBvYnNlcnZlciA9IChQYXJhbWV0ZXJPYnNlcnZlcilwYXJhbWV0ZXJPYnNlcnZlcjsKLSAgICAgICAgICAgICAgICBvYnNlcnZlci5wYXJhbWV0ZXJDaGFuZ2VkKHBhcmFtLmdldE5hbWUoKSwgcGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKG5hbWUsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlckluY2x1ZGUucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlLmRlc2VyaWFsaXplUGFyYW1ldGVycyhwYXJhbWV0ZXJFbGVtZW50KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGVzY3JpcHRpb24gdGhlbiB0aGUgUGFyYW1ldGVyIHdpbGwgYmUgd3JpdGFibGUgZWxzZQotICAgICAqIGl0IHdpbGwgYmUgcmVhZCBvbmx5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIFBhcmFtZXRlciB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIFBhcmFtZXRlciwgaWYgZm91bmQgYW55d2hlcmUgaW4gdGhlIHN0YWNrLCBvciBudWxsIGlmIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJJbmNsdWRlLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVyID0gcGFyZW50LmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtLmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJUcnVlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtICE9IG51bGwgJiYgSmF2YVV0aWxzLmlzVHJ1ZShwYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckluY2x1ZGUuZ2V0UGFyYW1ldGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IG51bGwgJiYgdGhpcy5wYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlciAhPSBudWxsICYmIHBhcmFtZXRlci5pc0xvY2tlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRhdGlvbigpIHsKLSAgICAgICAgaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRvY3VtZW50YXRpb24uZ2V0VHlwZSgpID09IE9NTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChPTVRleHQpZG9jdW1lbnRhdGlvbikuZ2V0VGV4dCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24uYnVpbGQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uLnNlcmlhbGl6ZSh3cml0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBPTU5vZGUgZ2V0RG9jdW1lbnRhdGlvbk5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50YXRpb24oT01Ob2RlIGRvY3VtZW50YXRpb24pIHsKLSAgICAgICAgdGhpcy5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uKFN0cmluZyBkb2N1bWVudGF0aW9uKSB7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKGRvY3VtZW50YXRpb24pKSB7Ci0gICAgICAgICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBvbUZhY3RvcnkuY3JlYXRlT01UZXh0KGRvY3VtZW50YXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50KEF4aXNEZXNjcmlwdGlvbiBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNEZXNjcmlwdGlvbiBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBvbGljeUluY2x1ZGUgUG9saWN5SW5jbHVkZSB2YWx1ZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb24jc2V0UG9saWN5SW5jbHVkZShQb2xpY3lJbmNsdWRlKQotICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIHJlbGVhc2UgMS40LCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIHBvbGljeSBjYWNoZSBvZiBhIHBhcnRpY3VsYXIKLSAgICAgKiAgICAgICAgICAgICBBeGlzRGVzY3JpcHRpb24gb2JqZWN0IHVzZSB7QGxpbmsgI2dldFBvbGljeVN1YmplY3QoKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb2xpY3lJbmNsdWRlKFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSkgewotICAgICAgICB0aGlzLnBvbGljeUluY2x1ZGUgPSBwb2xpY3lJbmNsdWRlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYWN0aXZlIFBvbGljeUluY2x1ZQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb24jZ2V0UG9saWN5U3ViamVjdCgpCi0gICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgcmVsZWFzZSAxLjQsIHJlcGxhY2VkIGJ5IHtAbGluayAjZ2V0UG9saWN5U3ViamVjdCgpfQotICAgICAqLwotICAgIHB1YmxpYyBQb2xpY3lJbmNsdWRlIGdldFBvbGljeUluY2x1ZGUoKSB7Ci0gICAgICAgIGlmIChwb2xpY3lJbmNsdWRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvbGljeUluY2x1ZGUgPSBuZXcgUG9saWN5SW5jbHVkZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9saWN5SW5jbHVkZTsKLSAgICB9Ci0KLQotICAgIC8vIE5PVEUgLSBUaGVzZSBhcmUgTk9UIHR5cGVzYWZlIQotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKEF4aXNEZXNjcmlwdGlvbiBjaGlsZCkgewotICAgICAgICBpZiAoY2hpbGQuZ2V0S2V5KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRklYTUU6IFNldmVyYWwgY2xhc3NlcyB0aGF0IGV4dGVuZCBBeGlzRGVzY3JpcHRpb24gcGFzcyBudWxsIGluIHRoZWlyIGdldEtleSBtZXRob2QuCi0vLyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IGEga2V5IGluIHRoZSBjaGlsZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGRyZW4ucHV0KGNoaWxkLmdldEtleSgpLCBjaGlsZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKE9iamVjdCBrZXksIEF4aXNEZXNjcmlwdGlvbiBjaGlsZCkgewotICAgICAgICBjaGlsZHJlbi5wdXQoa2V5LCBjaGlsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPD8gZXh0ZW5kcyBBeGlzRGVzY3JpcHRpb24+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gY2hpbGRyZW4udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0Rlc2NyaXB0aW9uIGdldENoaWxkKE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2h5IGFyZSBmb2xrcyBzZW5kaW5nIGluIG51bGw/Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEF4aXNEZXNjcmlwdGlvbiljaGlsZHJlbi5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChPYmplY3Qga2V5KSB7Ci0gICAgICAgIGNoaWxkcmVuLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHBvbGljeSBhcyB0aGUgZGVmYXVsdCBvZiB0aGlzIEF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZS4gRnVydGhlciBtb3JlCi0gICAgICogdGhpcyBtZXRob2QgZG9lcyB0aGUgZm9sbG93aW5ncy4gPHAvPiAoMSkgRW5nYWdlIHdoYXRldmVyIG1vZHVsZXMgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgbmV3Ci0gICAgICogdGhlIGVmZmVjdGl2ZSBwb2xpY3kgb2YgdGhpcyBBeGlzRGVzY3JpcHRpb24gaW5zdGFuY2UuICgyKSBEaXNlbmdhZ2Ugd2hhdGV2ZXIgbW9kdWxlcyB0aGF0Ci0gICAgICogYXJlIG5vdCBuZWNlc3NhcnkgdG8gZXhlY3V0ZSB0aGUgbmV3IGVmZmVjdGl2ZSBwb2xpY3kgb2YgdGhpcyBBeGlzRGVzY3JpcHRpb24gaW5zdGFuY2UuICgzKQotICAgICAqIENoZWNrIHdoZXRoZXIgZWFjaCBtb2R1bGUgY2FuIGV4ZWN1dGUgdGhlIG5ldyBlZmZlY3RpdmUgcG9saWN5IG9mIHRoaXMgQXhpc0Rlc2NyaXB0aW9uCi0gICAgICogaW5zdGFuY2UuICg0KSBJZiBub3QgdGhyb3cgYW4gQXhpc0ZhdWx0IHRvIG5vdGlmeSB0aGUgdXNlci4gKDUpIEVsc2Ugbm90aWZ5IGVhY2ggbW9kdWxlIGFib3V0Ci0gICAgICogdGhlIG5ldyBlZmZlY3RpdmUgcG9saWN5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBvbGljeSB0aGUgbmV3IHBvbGljeSBvZiB0aGlzIEF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZS4gVGhlIGVmZmVjdGl2ZSBwb2xpY3kgaXMgdGhlCi0gICAgICogICAgICAgICAgICAgICBtZXJnZSBvZiB0aGlzIGFyZ3VtZW50IHdpdGggZWZmZWN0aXZlIHBvbGljeSBvZiBwYXJlbnQgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICAgQXhpc0Rlc2NyaXB0aW9uLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGFueSBtb2R1bGUgaXMgdW5hYmxlIHRvIGV4ZWN1dGUgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgIEF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZSBzdWNjZXNzZnVsbHkgb3Igbm8gbW9kdWxlIHRvIGV4ZWN1dGUgc29tZSBwb3J0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgKG9uZSBvciBtb3JlIFByaW10aXZlQXNzZXJ0aW9ucyApIG9mIHRoYXQgZWZmZWN0aXZlIHBvbGljeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShQb2xpY3kgcG9saWN5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gc2V0cyBBeGlzRGVzY3JpcHRpb24gcG9saWN5Ci0gICAgICAgIGdldFBvbGljeVN1YmplY3QoKS5jbGVhcigpOwotICAgICAgICBnZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KHBvbGljeSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICAgKiBub3cgd2UgdHJ5IHRvIGVuZ2FnZSBhcHByb3ByaWF0ZSBtb2R1bGVzIGJhc2VkIG9uIHRoZSBtZXJnZWQgcG9saWN5Ci0gICAgICAgICAgICogb2YgYXhpcyBkZXNjcmlwdGlvbiBvYmplY3QgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGF4aXMgYmluZGluZwotICAgICAgICAgICAqIGRlc2NyaXB0aW9uIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgYXBwbHlQb2xpY3koKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBsaWVzIHRoZSBwb2xpY2llcyBvbiB0aGUgRGVzY3JpcHRpb24gSGllcmFyY2h5IHJlY3Vyc2l2ZWx5LgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgYW4gZXJyb3Igb2NjdXJyZWQgYXBwbHlpbmcgdGhlIHBvbGljeQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBQb2xpY3kgYXBwbGljYWJsZVBvbGljeSA9IGdldEFwcGxpY2FibGVQb2xpY3kodGhpcyk7Ci0gICAgICAgIGlmIChhcHBsaWNhYmxlUG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZXNGb3JQb2xpY3koYXBwbGljYWJsZVBvbGljeSwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBBeGlzRGVzY3JpcHRpb24+IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsgY2hpbGRyZW4uaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXhpc0Rlc2NyaXB0aW9uIGNoaWxkID0gY2hpbGRyZW4ubmV4dCgpOwotICAgICAgICAgICAgY2hpbGQuYXBwbHlQb2xpY3koKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TdXBwb3J0QXNzZXJ0aW9uKEFzc2VydGlvbiBhc3NlcnRpb24sIExpc3Q8QXhpc01vZHVsZT4gbW9kdWxlTGlzdCkgewotCi0gICAgICAgIE1vZHVsZSBtb2R1bGU7Ci0KLSAgICAgICAgZm9yIChBeGlzTW9kdWxlIGF4aXNNb2R1bGUgOiBtb2R1bGVMaXN0KSB7Ci0gICAgICAgICAgICAvLyBGSVhNRSBpcyB0aGlzIHN0ZXAgcmVhbGx5IG5lZWRlZCA/PwotICAgICAgICAgICAgLy8gU2hvdWxkbid0IGF4aXNNb3VkbGUuZ2V0TW9kdWxlIGFsd2F5cyByZXR1cm4gbm90LW51bGwgdmFsdWUgPz8KLSAgICAgICAgICAgIG1vZHVsZSA9IGF4aXNNb2R1bGUuZ2V0TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICghKG1vZHVsZSA9PSBudWxsIHx8IG1vZHVsZS5jYW5TdXBwb3J0QXNzZXJ0aW9uKGFzc2VydGlvbikpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGF4aXNNb2R1bGUuZ2V0TmFtZSgpICsgIiBzYXlzIGl0IGNhbid0IHN1cHBvcnQgIiArIGFzc2VydGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmdhZ2VNb2R1bGVzRm9yUG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8qCi0gICAgICAgICAgICogZm9yIHRoZSBtb21lbnQgd2UgY29uc2lkZXIgcG9saWNpZXMgd2l0aCBvbmx5IG9uZSBhbHRlcm5hdGl2ZS4gSWYgdGhlCi0gICAgICAgICAgICogcG9saWN5IGNvbnRhaW5zIG11bHRpcGxlIGFsdGVybmF0aXZlcyBvbmx5IHRoZSBmaXJzdCBhbHRlcm5hdGl2ZSB3aWxsCi0gICAgICAgICAgICogYmUgY29uc2lkZXJlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwb2xpY3kuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0gICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJQb2xpY3kgZG9lc24ndCBjb250YWluIGFueSBwb2xpY3kgYWx0ZXJuYXRpdmVzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0IGFzc2VydGlvbkxpc3QgPSAoTGlzdClpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgQXNzZXJ0aW9uIGFzc2VydGlvbjsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotICAgICAgICBMaXN0IG1vZHVsZUxpc3Q7Ci0KLSAgICAgICAgTGlzdCBuYW1lc3BhY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IG1vZHVsZXNUb0VuZ2FnZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBhbkFzc2VydGlvbkxpc3QgOiBhc3NlcnRpb25MaXN0KSB7Ci0gICAgICAgICAgICBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWFuQXNzZXJ0aW9uTGlzdDsKLSAgICAgICAgICAgIG5hbWVzcGFjZVVSSSA9IGFzc2VydGlvbi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICAgIG1vZHVsZUxpc3QgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVzRm9yUG9saWN5TmFtZXNhcGNlKG5hbWVzcGFjZVVSSSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNhbid0IGZpbmQgYW55IG1vZHVsZSB0byBwcm9jZXNzICIgKyBhc3NlcnRpb24uZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0eXBlIGFzc2VydGlvbnMiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYW5TdXBwb3J0QXNzZXJ0aW9uKGFzc2VydGlvbiwgbW9kdWxlTGlzdCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJhdGxlYXN0IG9uZSBtb2R1bGUgY2FuJ3Qgc3VwcG9ydCAiICsgYXNzZXJ0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbmFtZXNwYWNlTGlzdC5jb250YWlucyhuYW1lc3BhY2VVUkkpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlTGlzdC5hZGQobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgICBtb2R1bGVzVG9FbmdhZ2UuYWRkQWxsKG1vZHVsZUxpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuZ2FnZU1vZHVsZXNUb0F4aXNEZXNjcmlwdGlvbihtb2R1bGVzVG9FbmdhZ2UsIHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmdhZ2VNb2R1bGVzVG9BeGlzRGVzY3JpcHRpb24oTGlzdDxBeGlzTW9kdWxlPiBtb2R1bGVMaXN0LCBBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGU7Ci0gICAgICAgIE1vZHVsZSBtb2R1bGU7Ci0KLSAgICAgICAgZm9yIChPYmplY3QgYU1vZHVsZUxpc3QgOiBtb2R1bGVMaXN0KSB7Ci0gICAgICAgICAgICBheGlzTW9kdWxlID0gKEF4aXNNb2R1bGUpYU1vZHVsZUxpc3Q7Ci0gICAgICAgICAgICAvLyBGSVhNRSBpcyB0aGlzIHN0ZXAgcmVhbGx5IG5lZWRlZCA/PwotICAgICAgICAgICAgLy8gU2hvdWxkbid0IGF4aXNNb3VkbGUuZ2V0TW9kdWxlIGFsd2F5cyByZXR1cm4gbm90LW51bGwgdmFsdWUgPz8KLSAgICAgICAgICAgIG1vZHVsZSA9IGF4aXNNb2R1bGUuZ2V0TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICghKG1vZHVsZSA9PSBudWxsIHx8IGRlc2NyaXB0aW9uLmlzRW5nYWdlZChheGlzTW9kdWxlLmdldE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5nYWdlcyB0aGUgbW9kdWxlIHRvIEF4aXNEZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmVuZ2FnZU1vZHVsZShheGlzTW9kdWxlKTsKLSAgICAgICAgICAgICAgICAvLyBub3RpZmllcyB0aGUgbW9kdWxlIGFib3V0IHRoZSBlbmdhZ2VtZW50Ci0gICAgICAgICAgICAgICAgYXhpc01vZHVsZS5nZXRNb2R1bGUoKS5lbmdhZ2VOb3RpZnkoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgewotCi0gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQXhpc0NvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiAoQXhpc0NvbmZpZ3VyYXRpb24pdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLQotICAgIC8qKgotICAgICAqIEVuZ2FnZSBhIE1vZHVsZSBhdCB0aGlzIGxldmVsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc01vZHVsZSB0aGUgTW9kdWxlIHRvIGVuZ2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZXJlJ3MgYSBwcm9ibGVtIGVuZ2FnaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGVuZ2FnZU1vZHVsZShheGlzTW9kdWxlLCB0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2UgYSBNb2R1bGUgYXQgdGhpcyBsZXZlbCwga2VlcGluZyB0cmFjayBvZiB3aGljaCBsZXZlbCB0aGUgZW5nYWdlIHdhcyBvcmlnaW5hbGx5IGNhbGxlZAotICAgICAqIGZyb20uICBUaGlzIGlzIG1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzTW9kdWxlIG1vZHVsZSB0byBlbmdhZ2UKLSAgICAgKiBAcGFyYW0gc291cmNlICAgICB0aGUgQXhpc0Rlc2NyaXB0aW9uIHdoaWNoIG9yaWdpbmFsbHkgY2FsbGVkIGVuZ2FnZU1vZHVsZSgpCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0gZW5nYWdpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VNb2R1bGUoQXhpc01vZHVsZSBheGlzTW9kdWxlLCBBeGlzRGVzY3JpcHRpb24gc291cmNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGVuZ2FnZWRNb2R1bGVzID09IG51bGwpIGVuZ2FnZWRNb2R1bGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQXhpc01vZHVsZT4oKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBheGlzTW9kdWxlLmdldE5hbWUoKTsKLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGVuZ2FnZWRNb2R1bGVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIHRlbXBBeGlzTW9kdWxlID0gKChBeGlzTW9kdWxlKW8pOwotICAgICAgICAgICAgU3RyaW5nIHRlbXBNb2R1bGVOYW1lID0gdGVtcEF4aXNNb2R1bGUuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlTmFtZS5lcXVhbHModGVtcE1vZHVsZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbiBleGlzdGluZyA9IHRlbXBBeGlzTW9kdWxlLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIVV0aWxzLmNoZWNrVmVyc2lvbihheGlzTW9kdWxlLmdldFZlcnNpb24oKSwgZXhpc3RpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWlzbWF0Y2hlZE1vZHVsZVZlcnNpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGV4aXN0aW5nKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTGV0IHRoZSBNb2R1bGUga25vdyBpdCdzIGJlaW5nIGVuZ2FnZWQuICBJZiBpdCdzIG5vdCBoYXBweSBhYm91dCBpdCwgaXQgY2FuIHRocm93LgotICAgICAgICBNb2R1bGUgbW9kdWxlID0gYXhpc01vZHVsZS5nZXRNb2R1bGUoKTsKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGUuZW5nYWdlTm90aWZ5KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbnl0aGluZyBzcGVjaWZpYyB0byBkbywgbGV0IHRoYXQgaGFwcGVuCi0gICAgICAgIG9uRW5nYWdlKGF4aXNNb2R1bGUsIHNvdXJjZSk7Ci0KLSAgICAgICAgZW5nYWdlZE1vZHVsZXMucHV0KGF4aXNNb2R1bGUuZ2V0QXJjaGl2ZU5hbWUoKSwgYXhpc01vZHVsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgb25FbmdhZ2UoQXhpc01vZHVsZSBtb2R1bGUsIEF4aXNEZXNjcmlwdGlvbiBlbmdhZ2VyKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIERlZmF1bHQgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIGZlZWwgZnJlZSB0byBvdmVycmlkZQotICAgIH0KLQotICAgIHN0YXRpYyBDb2xsZWN0aW9uPEF4aXNNb2R1bGU+IE5VTExfTU9EVUxFUyA9IG5ldyBBcnJheUxpc3Q8QXhpc01vZHVsZT4oMCk7Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxBeGlzTW9kdWxlPiBnZXRFbmdhZ2VkTW9kdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGVuZ2FnZWRNb2R1bGVzID09IG51bGwgPyBOVUxMX01PRFVMRVMgOiBlbmdhZ2VkTW9kdWxlcy52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIGdpdmVuIG1vZHVsZSBpcyBlbmdhZ2VkIGF0IHRoaXMgbGV2ZWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBtb2R1bGUgdG8gaW52ZXN0aWdhdGUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGVuZ2FnZWQsIGZhbHNlIGlmIG5vdC4gVE9ETzogSGFuZGxlIHZlcnNpb25zPyBpc0VuZ2FnZWQoImFkZHJlc3NpbmciKSBzaG91bGQKLSAgICAgKiAgICAgICAgIGJlIHRydWUgZXZlbiBmb3IgdmVyc2lvbmVkIG1vZHVsZW5hbWUuLi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZ2FnZWQoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVuZ2FnZWRNb2R1bGVzICE9IG51bGwKLSAgICAgICAgICAgICAgICYmIGVuZ2FnZWRNb2R1bGVzLmtleVNldCgpLmNvbnRhaW5zKG1vZHVsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChBeGlzTW9kdWxlIGF4aXNNb2R1bGUpIHsKLSAgICAgICAgU3RyaW5nIGlkID0gYXhpc01vZHVsZS5nZXRBcmNoaXZlTmFtZSgpOwotICAgICAgICByZXR1cm4gZW5nYWdlZE1vZHVsZXMgIT0gbnVsbCAmJiBlbmdhZ2VkTW9kdWxlcy5rZXlTZXQoKS5jb250YWlucyhpZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsIHx8IGVuZ2FnZWRNb2R1bGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIC8vIFN0cmluZyBpZCA9IFV0aWxzLmdldE1vZHVsZU5hbWUobW9kdWxlLmdldE5hbWUoKSwKLSAgICAgICAgLy8gbW9kdWxlLmdldFZlcnNpb24oKSk7Ci0gICAgICAgIGlmIChpc0VuZ2FnZWQobW9kdWxlKSkgewotICAgICAgICAgICAgb25EaXNlbmdhZ2UobW9kdWxlKTsKLSAgICAgICAgICAgIGVuZ2FnZWRNb2R1bGVzLnJlbW92ZShtb2R1bGUuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRpc2VuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIEJhc2UgdmVyc2lvbiBkb2VzIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBvbGljeSBnZXRBcHBsaWNhYmxlUG9saWN5KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHsKLSAgICAgICAgaWYgKGF4aXNEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNNZXNzYWdlKSB7Ci0gICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9IChBeGlzTWVzc2FnZSlheGlzRGVzY3JpcHRpb247Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzTWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzT3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRFbmRwb2ludChheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZyA9IGF4aXNFbmRwb2ludC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF4aXNCaW5kaW5nT3BlcmF0aW9uKWF4aXNCaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZChheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpcmVjdGlvbiA9IGF4aXNNZXNzYWdlLmdldERpcmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTi5lcXVhbHMoZGlyZWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBXU0RMVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzSW5wdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSlheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXhpc0JpbmRpbmdNZXNzYWdlLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGRpcmVjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFdTRExVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNPdXRwdXRQcmVzZW50Rm9yTUVQKGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSlheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aXNCaW5kaW5nTWVzc2FnZS5nZXRFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoKEF4aXNNZXNzYWdlKWF4aXNEZXNjcmlwdGlvbikuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeVN1YmplY3QgZ2V0UG9saWN5U3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeVN1YmplY3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0VuZHBvaW50LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc0VuZHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDRjM2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNFbmRwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5XU0RMU2VyaWFsaXphdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEF4aXNFbmRwb2ludCBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc0VuZHBvaW50LmNsYXNzKTsKLQotICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBlbmRwb2ludAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvLyBUaGUgYmluZGluZyByZWZmZXJlZCB0byBieSB0aGUgZW5kcG9pbnQKLSAgICBwcml2YXRlIEF4aXNCaW5kaW5nIGJpbmRpbmc7Ci0KLSAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgZW5kcG9pbnQKLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludFVSTDsKLQotICAgIC8vIFRoZSBhbGlhcyB1c2VkIGZvciB0aGUgZW5kcG9pbnQKLSAgICBwcml2YXRlIFN0cmluZyBhbGlhczsKLQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHJhbnNwb3J0SW5EZXNjTmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRVUkwoKSB7Ci0vLyAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZjZSA9IChBeGlzU2VydmljZSkgdGhpcy5nZXRQYXJlbnQoKTsKLS8vICAgICAgICBpZiAoKGF4aXNTZXJ2Y2UhPSBudWxsICYmIGF4aXNTZXJ2Y2UuaXNNb2RpZnlVc2VyV1NETFBvcnRBZGRyZXNzKCkpIHx8IGVuZHBvaW50VVJMID09IG51bGwpIHsKLSAgICAgICAgaWYgKGVuZHBvaW50VVJMID09IG51bGwpIHsKLSAgICAgICAgICAgIGVuZHBvaW50VVJMID0gY2FsY3VsYXRlRW5kcG9pbnRVUkwoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gZW5kcG9pbnRVUkw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRVUkwoU3RyaW5nIGVuZHBvaW50VVJMKSB7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnRVUkwgPSBlbmRwb2ludFVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0VuZHBvaW50KCkgewotICAgICAgICBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBvcHRpb25zLnB1dChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotICAgICAgICBPYmplY3Qgb2JqID0gb3B0aW9ucy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxpYXMoKSB7Ci0gICAgICAgIHJldHVybiBhbGlhczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGlhcyhTdHJpbmcgYWxpYXMpIHsKLSAgICAgICAgdGhpcy5hbGlhcyA9IGFsaWFzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEF4aXNCaW5kaW5nIGJpbmRpbmcpIHsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgLy8gVG9ETwotICAgICAgICByZXR1cm4gbnVsbDsgLy8gVG8gY2hhbmdlIGJvZHkgb2YgaW1wbGVtZW50ZWQgbWV0aG9kcyB1c2UgRmlsZSB8Ci0gICAgICAgIC8vIFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIFRPRE8gLSBXZSB0b3RhbGx5IHNob3VsZCBzdXBwb3J0IHRoaXMuICBFbmRwb2ludCBQb2xpY3kgU3ViamVjdCwgYW55b25lPwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlNvcnJ5IHdlIGRvIG5vdCBzdXBwb3J0IHRoaXMiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZ2FnZWQoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJheGlzTWVzc2FnZS5pc0VuZ2FnZWQoKSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudCB0b1dTREwyMChPTU5hbWVzcGFjZSB3c2RsLCBPTU5hbWVzcGFjZSB0bnMsIE9NTmFtZXNwYWNlIHdodHRwKSB7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eTsKLSAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgZW5kcG9pbnRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkVORFBPSU5UX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBlbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwgbmFtZSkpOwotICAgICAgICBlbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpbmRpbmcoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgZW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FERFJFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIGdldEVuZHBvaW50VVJMKCkpKTsKLSAgICAgICAgT2JqZWN0IGF1dGhlbnRpY2F0aW9uU2NoZW1lID0KLSAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQVVUSEVOVElDQVRJT05fVFlQRSk7Ci0gICAgICAgIGlmIChhdXRoZW50aWNhdGlvblNjaGVtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0FVVEhFTlRJQ0FUSU9OX1RZUEUsIHdodHRwLAotICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvblNjaGVtZS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydHkgPSAoU3RyaW5nKW9wdGlvbnMuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQVVUSEVOVElDQVRJT05fUkVBTE0pOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BVVRIRU5USUNBVElPTl9SRUFMTSwgd2h0dHAsIHByb3BlcnR5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudCh0aGlzLCBlbmRwb2ludEVsZW1lbnQsIG9tRmFjdG9yeSwgd3NkbCk7Ci0gICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRQb2xpY2llc0FzRXh0ZW5zaWJsZUVsZW1lbnQodGhpcywgZW5kcG9pbnRFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGVuZHBvaW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiAoQXhpc1NlcnZpY2UpcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHBhcmVudCA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbihTdHJpbmcgdHJhbnNwb3J0SW5EZXNjTmFtZSkgewotICAgICAgICB0aGlzLnRyYW5zcG9ydEluRGVzY05hbWUgPSB0cmFuc3BvcnRJbkRlc2NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRW5kcG9pbnRVUkwoKSB7Ci0gICAgICAgIHJldHVybiBjYWxjdWxhdGVFbmRwb2ludFVSTChudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUVuZHBvaW50VVJMKFN0cmluZyBob3N0SVApIHsKLSAgICAgICAgaWYgKHRyYW5zcG9ydEluRGVzY05hbWUgIT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAoKEF4aXNTZXJ2aWNlKXBhcmVudCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGluID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5nZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbkRlc2NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgbGlzdGVuZXIgPSBpbi5nZXRSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RJUCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcCA9IGhvc3RJUDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gVXRpbHMuZ2V0SXBBZGRyZXNzKGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIFtzZXJ2aWNlTmFtZV0uW2VuZHBvaW50TmFtZV0gaW5zdGVhZCBvZgotICAgICAgICAgICAgICAgICAgICAvLyBbZW5kcG9pbnROYW1lXQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc0RPVGUgPSBzZXJ2aWNlTmFtZSArICIuIiArIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlW10gZXByc0ZvclNlcnZpY2UgPSBsaXN0ZW5lci5nZXRFUFJzRm9yU2VydmljZShzRE9UZSwgaXApOwotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25zaWRlciBvbmx5IHRoZSBmaXJzdCBhZGRyZXNzIHJldHVybiBieSB0aGUgbGlzdGVuZXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVwcnNGb3JTZXJ2aWNlICE9IG51bGwgJiYgZXByc0ZvclNlcnZpY2UubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwcnNGb3JTZXJ2aWNlWzBdLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRJbkRlc2NOYW1lICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IChBeGlzU2VydmljZSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuaXNFbmFibGVBbGxUcmFuc3BvcnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aXNDb25maWd1cmF0aW9uLmdldFRyYW5zcG9ydHNJbigpLmNvbnRhaW5zS2V5KHRyYW5zcG9ydEluRGVzY05hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldEV4cG9zZWRUcmFuc3BvcnRzKCkuY29udGFpbnModHJhbnNwb3J0SW5EZXNjTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc01lc3NhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNkMzIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUltcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUluY2x1ZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBtZXNzYWdlcyBpbiBXU0RMLiBUaGVyZSBjYW4gYmUgbWVzc2FnZSBlbGVtZW50IGluIHNlcnZpY2VzLnhtbAotICogd2hpY2ggYXJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzTWVzc2FnZSBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxIYW5kbGVyPiBoYW5kbGVyQ2hhaW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBzb2FwSGVhZGVyczsKLQotICAgIC8vdG8ga2VlcCBkYXRhIGluIFdTREwgbWVzc2FnZSByZWZlcmVuY2UgYW5kIHRvIGtlZXAgdGhlIEphdmEyV1NETCBkYXRhCi0gICAgLy8gc3VjaCBhcyBTY2hlbWFFbGVtZW50TmFtZSAsIGRpcmVjdGlvbiBldGMuCi0gICAgcHJpdmF0ZSBRTmFtZSBlbGVtZW50UW5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlyZWN0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VQYXJ0TmFtZTsKLQotICAgIC8vIFRvIHN0b3JlIGRlcGxveS10aW1lIG1vZHVsZSByZWZzCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtb2R1bGVyZWZzOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcnROYW1lID0gSmF2YTJXU0RMQ29uc3RhbnRzLlBBUkFNRVRFUlM7Ci0KLSAgICAvLyBwcml2YXRlIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZTsKLQotICAgIC8vVG8gY2hjZWsgd2hldGhlciB0aGUgbWVzc2FnZSBpcyB3cmFwcGVkIG9yIHVud3JhcHBlZAotICAgIHByaXZhdGUgYm9vbGVhbiB3cmFwcGVkID0gdHJ1ZTsKLSAgICAKLSAgICBwcml2YXRlIFBvbGljeSBlZmZlY3RpdmVQb2xpY3kgPSBudWxsOwotICAgIHByaXZhdGUgRGF0ZSBsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlUGFydE5hbWUoKSB7Ci0JCXJldHVybiBtZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZVBhcnROYW1lKFN0cmluZyBtZXNzYWdlUGFydE5hbWUpIHsKLQkJdGhpcy5tZXNzYWdlUGFydE5hbWUgPSBtZXNzYWdlUGFydE5hbWU7Ci0JfQotCi0JcHVibGljIEF4aXNNZXNzYWdlKCkgewotICAgICAgICBzb2FwSGVhZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaGFuZGxlckNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICBtb2R1bGVyZWZzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxIYW5kbGVyPiBnZXRNZXNzYWdlRmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckxvY2tlZChTdHJpbmcgcGFyYW1ldGVyTmFtZSkgewotCi0gICAgICAgIC8vIGNoZWNraW5nIHRoZSBsb2NrZWQgdmFsdWUgb2YgcGFyZW50Ci0gICAgICAgIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IGdldFBhcmVudCgpLmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlck5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgICAgICByZXR1cm4gKHBhcmFtZXRlciAhPSBudWxsKSAmJiBwYXJhbWV0ZXIuaXNMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VGbG93KEFycmF5TGlzdDxIYW5kbGVyPiBvcGVyYXRpb25GbG93KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluID0gb3BlcmF0aW9uRmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpcmVjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oU3RyaW5nIGRpcmVjdGlvbikgewotICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudFFOYW1lKFFOYW1lIGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50UW5hbWUgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFNjaGVtYUVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudCgpIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGdldEF4aXNPcGVyYXRpb24oKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBBcnJheUxpc3Qgc2NoZW1hcyA9IHNlcnZpY2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3Igc2NoZW1hSXRlciA9IHNjaGVtYXMuaXRlcmF0b3IoKTsgc2NoZW1hSXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBnZXRTY2hlbWFFbGVtZW50KChYbWxTY2hlbWEpIHNjaGVtYUl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgIGlmICh4bWxTY2hlbWFFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWFFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hRWxlbWVudCBnZXRTY2hlbWFFbGVtZW50KFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnRCeU5hbWUodGhpcy5lbGVtZW50UW5hbWUpOwotICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGluIGFuIGltcG9ydCBvciBhbiBpbmNsdWRlCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlcygpOwotICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGluY2x1ZGVzSXRlciA9IGluY2x1ZGVzLmdldEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbmNsdWRlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBpbmNsdWRlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhtbFNjaGVtYUltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbXBvcnQpIG9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudCA9IGdldFNjaGVtYUVsZW1lbnQoc2NoZW1hMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWExID0gKChYbWxTY2hlbWFJbmNsdWRlKSBvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQgPSBnZXRTY2hlbWFFbGVtZW50KHNjaGVtYTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYUVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhtbFNjaGVtYUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHJldHVybiBhIGxpc3Qgb2YgV1NETEV4dGVuc2liaWxpdHlBdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5QXR0cmlidXRlcygpIHsKLSAgICAgICAgLy8gVE9ETyA6IERlZXBhbCBpbXBsZW1lbnQgdGhpcyBwcm9wZXJseS4KLQotICAgICAgICAvLyB0aGUgbGlzdCBzaG91bGQgY29udGFpbiBsaXN0IG9mIFdTRExFeHRlbnNpYmlsaXR5QXR0cmlidXRlCi0gICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFNvYXBIZWFkZXIoU09BUEhlYWRlck1lc3NhZ2Ugc29hcEhlYWRlck1lc3NhZ2UpIHsKLSAgICAgICAgc29hcEhlYWRlcnMuYWRkKHNvYXBIZWFkZXJNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFNvYXBIZWFkZXJzCi0gICAgICAgICAgICAoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwSGVhZGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXZSBkbyBub3Qgc3VwcG9ydCBhZGRpbmcgbW9kdWxlIG9wZXJhdGlvbnMgd2hlbiBlbmdhZ2luZyBhIG1vZHVsZSB0byBhbiBBeGlzTWVzc2FnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBheGlzTW9kdWxlIEF4aXNNb2R1bGUgdG8gZW5nYWdlCi0gICAgICogQHBhcmFtIGVuZ2FnZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uRW5nYWdlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSwgQXhpc0Rlc2NyaXB0aW9uIGVuZ2FnZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBQaGFzZVJlc29sdmVyIHBoYXNlUmVzb2x2ZXIgPSBuZXcgUGhhc2VSZXNvbHZlcihnZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgcGhhc2VSZXNvbHZlci5lbmdhZ2VNb2R1bGVUb01lc3NhZ2UodGhpcywgYXhpc01vZHVsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldE1vZHVsZXJlZnMoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVyZWZzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZVJlZnMoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgbW9kdWxlcmVmcy5hZGQobW9kdWxlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0QXhpc09wZXJhdGlvbigpewotICAgICAgICByZXR1cm4gKEF4aXNPcGVyYXRpb24pcGFyZW50OwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBwYXJ0TmFtZSkgewotICAgICAgICB0aGlzLnBhcnROYW1lID0gcGFydE5hbWU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dyYXBwZWQoKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWQoYm9vbGVhbiB3cmFwcGVkKSB7Ci0gICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQb2xpY3kgZ2V0RWZmZWN0aXZlUG9saWN5KCkgewotCQlpZiAobGFzdFBvbGljeUNhbGN1YXRlZFRpbWUgPT0gbnVsbCB8fCBpc1BvbGljeVVwZGF0ZWQoKSkgewotCQkJZWZmZWN0aXZlUG9saWN5ID0gY2FsY3VsYXRlRWZmZWN0aXZlUG9saWN5KCk7Ci0JCX0KLQkJcmV0dXJuIGVmZmVjdGl2ZVBvbGljeTsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGNhbGN1bGF0ZUVmZmVjdGl2ZVBvbGljeSgpIHsKLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gbnVsbDsKLQkJQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4gcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PigpOwotCi0JCS8vIEF4aXNNZXNzYWdlCi0JCXBvbGljeVN1YmplY3QgPSBnZXRQb2xpY3lTdWJqZWN0KCk7Ci0JCXBvbGljeUxpc3QuYWRkQWxsKHBvbGljeVN1YmplY3QuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCi0JCS8vIEF4aXNPcGVyYXRpb24KLQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gZ2V0QXhpc09wZXJhdGlvbigpOwotCQlpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlwb2xpY3lMaXN0LmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc1NlcnZpY2UKLQkJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNPcGVyYXRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLQkJaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLQkJCXBvbGljeUxpc3QuYWRkQWxsKGF4aXNTZXJ2aWNlLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0KLQkJLy8gQXhpc0NvbmZpZ3VyYXRpb24KLQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCQlpZiAoYXhpc0NvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJcG9saWN5TGlzdC5hZGRBbGwoYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLQotCQlQb2xpY3kgcmVzdWx0ID0gUG9saWN5VXRpbC5nZXRNZXJnZWRQb2xpY3kocG9saWN5TGlzdCwgYXhpc1NlcnZpY2UpOwotCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSA9IG5ldyBEYXRlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb2xpY3lVcGRhdGVkKCkgewotCQkvLyBBeGlzTWVzc2FnZQotCQlpZiAoZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpLmFmdGVyKAotCQkJCWxhc3RQb2xpY3lDYWxjdWF0ZWRUaW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gQXhpc09wZXJhdGlvbgotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgcGFyZW50OwotCQlpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsCi0JCQkJJiYgYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuZ2V0TGFzdFVwZGF0ZWRUaW1lKCkuYWZ0ZXIoCi0JCQkJCQlsYXN0UG9saWN5Q2FsY3VhdGVkVGltZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEF4aXNTZXJ2aWNlCi0JCUF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgPyBudWxsCi0JCQkJOiBheGlzT3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0JCWlmIChheGlzU2VydmljZSAhPSBudWxsCi0JCQkJJiYgYXhpc1NlcnZpY2UuZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpLmFmdGVyKAotCQkJCQkJbGFzdFBvbGljeUNhbGN1YXRlZFRpbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBBeGlzQ29uZmlndXJhdGlvbgotCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IChheGlzU2VydmljZSA9PSBudWxsKSA/IG51bGwKLQkJCQk6IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsCi0JCQkJJiYgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmdldExhc3RVcGRhdGVkVGltZSgpCi0JCQkJCQkuYWZ0ZXIobGFzdFBvbGljeUNhbGN1YXRlZFRpbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNNb2R1bGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYThmMGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIDxwPlRoaXMgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgTW9kdWxlLiA8L3A+Ci0gKiA8b2w+Ci0gKiA8bGk+cGFyYW1ldGVyczxsaT4KLSAqIDxsaT5oYW5kbGVyczxsaT4KLSAqIDxvbD4KLSAqIDxwPkhhbmRsZXIgYXJlIHJlZ2lzdGVyZWQgb25jZSB0aGV5IGFyZSBhdmFpbGFibGUuIFRoZXkgYXJlIGF2YWlsYWJsZSB0byBhbGwgc2VydmljZXMgaWYgYXhpczIueG1sCi0gKiBoYXMgYSBtb2R1bGUgcmVmPSIuIiBvciBhdmFpbGFibGUgdG8gYSBzaW5nbGUgc2VydmljZSBpZiBzZXJ2aWNlcy54bWwgaGF2ZSBtb2R1bGUgcmVmPSIuLiI8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzTW9kdWxlIGltcGxlbWVudHMgUGFyYW1ldGVySW5jbHVkZSB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBmbG93SW5jbHVkZQotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgRmxvd0luY2x1ZGUgZmxvd0luY2x1ZGUgPSBuZXcgRmxvd0luY2x1ZGUoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVycyA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgIHByaXZhdGUgTW9kdWxlIG1vZHVsZTsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIG1vZHVsZUNsYXNzTG9hZGVyOwotICAgIC8vIFRvIGtlZXAgdGhlIEZpbGUgdGhhdCBtb2R1bGUgY2FtZSBmcm9tCi0gICAgcHJpdmF0ZSBVUkwgZmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8vVGhpcyBpcyB0byBrZWVwIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbW9kdWxlLCBpZiB0aGUgbW9kdWxlIG5hbWUgaXMgYS1iLWMtMS4zLm1hciAsCi0gICAgLy8gdGhlbiB0aGUgbW9kdWxlIHZlcnNpb24gd291bGQgYmUgMS4zCi0gICAgcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247Ci0KLSAgICAvLyB0byBzdG9yZSBtb2R1bGUgb3BlcmF0aW9ucyAsIHdoaWNoIGFyZSBzdXBwb3NlIHRvIGJlIGFkZGVkIHRvIGEgc2VydmljZSBpZiBpdCBpcyBlbmdhZ2VkIHRvIGEgc2VydmljZQotICAgIHByaXZhdGUgSGFzaE1hcDxRTmFtZSwgQXhpc09wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBBeGlzT3BlcmF0aW9uPigpOwotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcGFyZW50OwotCi0gICAgLyoKLSAgICAqIHRvIHN0b3JlIHBvbGljaWVzIHdoaWNoIGFyZSB2YWxpZCBmb3IgYW55IHNlcnZpY2UgZm9yIHdoaWNoIHRoZSBtb2R1bGUgaXMgZW5nYWdlZAotICAgICovCi0gICAgcHJpdmF0ZSBQb2xpY3lJbmNsdWRlIHBvbGljeUluY2x1ZGUgPSBudWxsOwotCi0gICAgLy8gU21hbGwgZGVzY3JpcHRpb24gYWJvdXQgdGhlIG1vZHVsZQotICAgIHByaXZhdGUgU3RyaW5nIG1vZHVsZURlc2NyaXB0aW9uOwotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzdXBwb3J0ZWRQb2xpY3lOYW1lczsKLQotICAgIHByaXZhdGUgUU5hbWVbXSBsb2NhbFBvbGljeUFzc2VydGlvbnM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9TTkFQU0hPVCA9ICJTTkFQU0hPVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1NFUlZJQ0UgPSAibW9kdWxlU2VydmljZSI7Ci0KLSAgICBwcml2YXRlIFBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCA9IG5ldyBQb2xpY3lTdWJqZWN0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBNb2R1bGVEZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc01vZHVsZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBNb2R1bGVEZXNjcmlwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIDogTmFtZSBvZiB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNNb2R1bGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBtb2R1bGUuCi0gICAgICogTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGRlcGxveSBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSBzYW1lIG1vZHVsZS4gVGhlcmVmb3JlLAotICAgICAqIHRoZSBuYW1lIG9mIGEgbW9kdWxlIGlzIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIGEgZ2l2ZW4ge0BsaW5rIEF4aXNDb25maWd1cmF0aW9ufS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYXJjaGl2ZSBuYW1lIG9mIHRoaXMgbW9kdWxlLiBUaGUgYXJjaGl2ZSBuYW1lIGlzIHRoZSBjb21iaW5hdGlvbgotICAgICAqIG9mIHRoZSBtb2R1bGUgbmFtZSBhbmQgdmVyc2lvbiAoaWYgYXZhaWxhYmxlKS4gSW4gZ2VuZXJhbCBpdCBpcyBlcXVhbCB0byB0aGUKLSAgICAgKiBuYW1lIG9mIHRoZSBtb2R1bGUgYXJjaGl2ZSBmaWxlIHdpdGhvdXQgdGhlIHN1ZmZpeC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBhcmNoaXZlIG5hbWUgb2YgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uID09IG51bGwgPyBuYW1lIDogKG5hbWUgKyAiLSIgKyB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGFyY2hpdmUgbmFtZSBvZiB0aGlzIG1vZHVsZS4gVGhpcyBtZXRob2Qgd2lsbCBzcGxpdCB0aGUgYXJjaGl2ZSBuYW1lCi0gICAgICogdG8gZXh0cmFjdCB0aGUgbW9kdWxlIG5hbWUgYW5kIHZlcnNpb24gKHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcKLSAgICAgKiB7QGxpbmsgI2dldE5hbWUoKX0gYW5kIHtAbGluayAjZ2V0VmVyc2lvbigpfSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFyY2hpdmVOYW1lIHRoZSBhcmNoaXZlIG5hbWUgb2YgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFyY2hpdmVOYW1lKFN0cmluZyBhcmNoaXZlTmFtZSkgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAvLyBGaXJzdCBsb29rIGZvciBhIHBhcnQgdGhhdCBzdGFydHMgd2l0aCBhIGRpZ2l0Ci0gICAgICAgIHdoaWxlICgoaW5kZXggPSBhcmNoaXZlTmFtZS5pbmRleE9mKCctJywgaW5kZXgpKSAhPSAtMSkgewotICAgICAgICAgICAgY2hhciBjID0gYXJjaGl2ZU5hbWUuY2hhckF0KCsraW5kZXgpOwotICAgICAgICAgICAgaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWxzbyBzdXBwb3J0IFNOQVBTSE9UCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiBhcmNoaXZlTmFtZS5lbmRzV2l0aCgiLVNOQVBTSE9UIikpIHsKLSAgICAgICAgICAgIGluZGV4ID0gYXJjaGl2ZU5hbWUubGVuZ3RoKCktODsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBuYW1lID0gYXJjaGl2ZU5hbWU7Ci0gICAgICAgICAgICB2ZXJzaW9uID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGFyY2hpdmVOYW1lLnN1YnN0cmluZyhpbmRleCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gYXJjaGl2ZU5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5hbWUgPSBhcmNoaXZlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbW9kdWxlIGRvZXNuJ3QgaGF2ZSBhCi0gICAgICogICAgICAgICB2ZXJzaW9uIG51bWJlcgotICAgICAqLwotICAgIHB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihWZXJzaW9uIHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb24oQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB7Ci0gICAgICAgIG9wZXJhdGlvbnMucHV0KGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLCBheGlzT3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW0gOiBQYXJhbWV0ZXIgdG8gYmUgYWRkZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW10ZXJsb2NrZWRieXBhcmVudCIsIHBhcmFtLmdldE5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyYW1ldGVycy5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLCBwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVycy5kZXNlcmlhbGl6ZVBhcmFtZXRlcnMocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEZsb3cuCi0gICAgICovCi0gICAgcHVibGljIEZsb3cgZ2V0RmF1bHRJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBmbG93SW5jbHVkZS5nZXRGYXVsdEluRmxvdygpOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZsb3dJbmNsdWRlLmdldEZhdWx0T3V0RmxvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqLwotICAgIHB1YmxpYyBGbG93IGdldEluRmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZsb3dJbmNsdWRlLmdldEluRmxvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNb2R1bGUuCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGU7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldE1vZHVsZUNsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gbW9kdWxlQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2hNYXA8UU5hbWUsIEF4aXNPcGVyYXRpb24+IGdldE9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqLwotICAgIHB1YmxpYyBGbG93IGdldE91dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBmbG93SW5jbHVkZS5nZXRPdXRGbG93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmdldFBhcmFtZXRlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0NvbmZpZ3VyYXRpb24gZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBwYXJhbWV0ZXIgaXMgbG9ja2VkCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQotICAgICAgICAvLyBjaGVja2luZyB0aGUgbG9ja2VkIHZhbHVlIG9mIHBhcmVudAotICAgICAgICBib29sZWFuIGxvc2NrZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9zY2tlZCA9IHRoaXMucGFyZW50LmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlck5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvc2NrZWQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLQotICAgICAgICAgICAgcmV0dXJuIChwYXJhbWV0ZXIgIT0gbnVsbCkgJiYgcGFyYW1ldGVyLmlzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmF1bHRGbG93IDogQXJyeWFsaXN0IG9mIGhhbmRsZXJEZXNjcmlwdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEluRmxvdyhGbG93IGZhdWx0RmxvdykgewotICAgICAgICBmbG93SW5jbHVkZS5zZXRGYXVsdEluRmxvdyhmYXVsdEZsb3cpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmYXVsdEZsb3cgOiBBcnJ5YWxpc3Qgb2YgSGFuZGxlckRlc2NyaXB0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0T3V0RmxvdyhGbG93IGZhdWx0RmxvdykgewotICAgICAgICBmbG93SW5jbHVkZS5zZXRGYXVsdE91dEZsb3coZmF1bHRGbG93KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbkZsb3coRmxvdyBpbkZsb3cpIHsKLSAgICAgICAgZmxvd0luY2x1ZGUuc2V0SW5GbG93KGluRmxvdyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZHVsZSA6IEF4aXNNb2R1bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoTW9kdWxlIG1vZHVsZSkgewotICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBtb2R1bGVDbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLm1vZHVsZUNsYXNzTG9hZGVyID0gbW9kdWxlQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0RmxvdyhGbG93IG91dEZsb3cpIHsKLSAgICAgICAgZmxvd0luY2x1ZGUuc2V0T3V0RmxvdyhvdXRGbG93KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQXhpc0NvbmZpZ3VyYXRpb24gcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeUluY2x1ZGUoUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlKSB7Ci0gICAgICAgIHRoaXMucG9saWN5SW5jbHVkZSA9IHBvbGljeUluY2x1ZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeUluY2x1ZGUgZ2V0UG9saWN5SW5jbHVkZSgpIHsKLSAgICAgICAgaWYgKHBvbGljeUluY2x1ZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5SW5jbHVkZSA9IG5ldyBQb2xpY3lJbmNsdWRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvbGljeUluY2x1ZGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQb2xpY3lTdWJqZWN0IGdldFBvbGljeVN1YmplY3QoKSB7Ci0gICAgCXJldHVybiBwb2xpY3lTdWJqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVEZXNjcmlwdGlvbihTdHJpbmcgbW9kdWxlRGVzY3JpcHRpb24pIHsKLSAgICAgICAgdGhpcy5tb2R1bGVEZXNjcmlwdGlvbiA9IG1vZHVsZURlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gc3VwcG9ydGVkUG9saWN5TmFtZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcG9ydGVkUG9saWN5TmFtZXNwYWNlcyhTdHJpbmdbXSBzdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKSB7Ci0gICAgICAgIHRoaXMuc3VwcG9ydGVkUG9saWN5TmFtZXMgPSBzdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZVtdIGdldExvY2FsUG9saWN5QXNzZXJ0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUG9saWN5QXNzZXJ0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFBvbGljeUFzc2VydGlvbnMoUU5hbWVbXSBsb2NhbFBvbGljeUFzc2VydGlvbnMpIHsKLSAgICAgICAgdGhpcy5sb2NhbFBvbGljeUFzc2VydGlvbnMgPSBsb2NhbFBvbGljeUFzc2VydGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFVSTCBmaWxlTmFtZSkgewotICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNPcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjk2NjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXhpc09wZXJhdGlvbiBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbgotICAgICAgICBpbXBsZW1lbnRzIFdTRExDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfUlBDID0gInJwYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfTVNHID0gIm1zZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRE9DID0gImRvYyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc09wZXJhdGlvbi5jbGFzcyk7Ci0gICAgLyoqIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiAqLwotICAgIHByaXZhdGUgaW50IG1lcCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOVkFMSUQ7Ci0KLSAgICAvLyB0byBoaWRlIGNvbnRyb2wgb3BlcmF0aW9uICwgb3BlcmF0aW9uIHdoaWNoIGFkZGVkIGJ5IFJNIGxpa2UgbW9kdWxlCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRyb2xPcGVyYXRpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBzdHlsZSA9IFNUWUxFX0RPQzsKLQotICAgIC8vIHRvIHN0b3JlIG1lcFVSTAotICAgIHByb3RlY3RlZCBTdHJpbmcgbWVwVVJJOwotCi0gICAgcHJpdmF0ZSBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyOwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgTW9kdWxlQ29uZmlndXJhdGlvbj4gbW9kdWxlQ29uZmlnbWFwOwotCi0gICAgLy8gVG8gc3RvcmUgZGVwbG95LXRpbWUgbW9kdWxlIHJlZnMKLSAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1vZHVsZXJlZnM7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxBeGlzTWVzc2FnZT4gZmF1bHRNZXNzYWdlczsKLQotICAgIHByaXZhdGUgUU5hbWUgbmFtZTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gd3NhbWFwcGluZ0xpc3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0QWN0aW9uOwotICAgIHByaXZhdGUgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gZmF1bHRBY3Rpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzb2FwQWN0aW9uOwotCi0KLSAgICAvKiogRGVmYXVsdCBjb25zdHJ1Y3RvciAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBtZXBVUkkgPSBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVDsKLSAgICAgICAgbW9kdWxlcmVmcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtb2R1bGVDb25maWdtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZHVsZUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIGZhdWx0TWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PEF4aXNNZXNzYWdlPigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRNZXNzYWdlKEF4aXNNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBsYWJlbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgbWVzc2FnZSBjb250ZXh0IGludG8gYW4gb3BlcmF0aW9uIGNvbnRleHQuIERlcGVuZGluZyBvbiBNRVBzLCB0aGlzIG1ldGhvZCBoYXMgdG8gYmUKLSAgICAgKiBvdmVycmlkZGVuLiBEZXBlbmRpbmcgb24gdGhlIE1FUCBvcGVyYXRpb24gZGVzY3JpcHRpb24ga25vdyBob3cgdG8gZmlsbCB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogbWFwIGluIG9wZXJhdGlvbkNvbnRleHQuIEFzIGFuIGV4YW1wbGUsIGlmIHRoZSBNRVAgaXMgSU4tT1VUIHRoZW4gZGVwZW5kaW5nIG9uIG1lc3NhZ2FibGUKLSAgICAgKiBvcGVyYXRpb24gZGVzY3JpcHRpb24gc2hvdWxkIGtub3cgaG93IHRvIGtlZXAgdGhlbSBpbiBjb3JyZWN0IGxvY2F0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPgotICAgICAqIEBwYXJhbSBvcENvbnRleHQgIDxjb2RlPk9wZXJhdGlvbkNvbnRleHQ8L2NvZGU+Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgPGNvZGU+QXhpc0ZhdWx0PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgewotICAgICAgICBtb2R1bGVyZWZzLmFkZChtb2R1bGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG1vZHVsZSBjb25maWd1cmF0aW9uLCBpZiB0aGVyZSBpcyBtb2R1bGVDb25maWcgdGFnIGluIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVDb25maWd1cmF0aW9uIGEgTW9kdWxlQ29uZmlndXJhdGlvbiB3aGljaCB3aWxsIGJlIGFkZGVkIChieSBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZUNvbmZpZyhNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgbW9kdWxlQ29uZmlnbWFwLnB1dChtb2R1bGVDb25maWd1cmF0aW9uLmdldE1vZHVsZU5hbWUoKSwgbW9kdWxlQ29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIG1vZHVsZSBpcyBlbmdhZ2VkIG9uIHRoaXMgb3BlcmF0aW9uLiAgSGFuZGxlIG9wZXJhdGlvbi1zcGVjaWZpYyB0YXNrcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzTW9kdWxlIEF4aXNNb2R1bGUgYmVpbmcgZW5nYWdlZAotICAgICAqIEBwYXJhbSBlbmdhZ2VyICAgIHRoZSBBeGlzRGVzY3JpcHRpb24gd2hlcmUgdGhlIGVuZ2FnZSBvY2N1cnJlZCAtIGNvdWxkIGJlIHVzIG9yIGEgcGFyZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBvbkVuZ2FnZShBeGlzTW9kdWxlIGF4aXNNb2R1bGUsIEF4aXNEZXNjcmlwdGlvbiBlbmdhZ2VyKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gQW0gSSB0aGUgc291cmNlIG9mIHRoaXMgZW5nYWdlbWVudD8KLSAgICAgICAgYm9vbGVhbiBzZWxmRW5nYWdlZCA9IChlbmdhZ2VyID09IHRoaXMpOwotCi0gICAgICAgIC8vIElmIEknbSBub3QsIHRoZSBvcGVyYXRpb25zIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gYWRkZWQgYnkgc29tZW9uZSBhYm92ZSwgc28gZG9uJ3QKLSAgICAgICAgLy8gZG8gaXQgYWdhaW4uCi0gICAgICAgIGlmIChzZWxmRW5nYWdlZCkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZS5hZGRNb2R1bGVPcGVyYXRpb25zKGF4aXNNb2R1bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQaGFzZVJlc29sdmVyIHBoYXNlUmVzb2x2ZXIgPSBuZXcgUGhhc2VSZXNvbHZlcihheGlzQ29uZmlnKTsKLSAgICAgICAgcGhhc2VSZXNvbHZlci5lbmdhZ2VNb2R1bGVUb09wZXJhdGlvbih0aGlzLCBheGlzTW9kdWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRpc2VuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSkgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gc2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQaGFzZVJlc29sdmVyIHBoYXNlUmVzb2x2ZXIgPSBuZXcgUGhhc2VSZXNvbHZlcihheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGlmICghc2VydmljZS5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkgJiYKLSAgICAgICAgICAgIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsICYmICFheGlzQ29uZmlndXJhdGlvbi5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICBwaGFzZVJlc29sdmVyLmRpc2VuZ2FnZU1vZHVsZUZyb21HbG9iYWxDaGFpbnMobW9kdWxlKTsKLSAgICAgICAgfQotICAgICAgICBwaGFzZVJlc29sdmVyLmRpc2VuZ2FnZU1vZHVsZUZyb21PcGVyYXRpb25DaGFpbihtb2R1bGUsIHRoaXMpOwotCi0gICAgICAgIC8vcmVtb3Zpbmcgb3BlcmF0aW9ucyBhZGRlZCBhdCB0aGUgdGltZSBvZiBtb2R1bGUgZW5nYWdlbW50Ci0gICAgICAgIEhhc2hNYXA8UU5hbWUsIEF4aXNPcGVyYXRpb24+IG1vZHVsZU9wZXJhdGlvbnMgPSBtb2R1bGUuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBpZiAobW9kdWxlT3BlcmF0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxBeGlzT3BlcmF0aW9uPiBtb2R1bGVPcGVyYXRpb25zX2l0ciA9IG1vZHVsZU9wZXJhdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChtb2R1bGVPcGVyYXRpb25zX2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKW1vZHVsZU9wZXJhdGlvbnNfaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLnJlbW92ZU9wZXJhdGlvbihvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIHJlbW92ZSBtb2R1bGUgZnJvbSBlbmdhZ2UgIG1vZHVsZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlIG1vZHVsZSB0byByZW1vdmUKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIGRpc2VuZ2FnZU1vZHVsZSgpLCB0aGlzIG1ldGhvZCB3aWxsIGRpc2FwcGVhciBhZnRlciAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tRW5nYWdlZE1vZHVsZUxpc3QoQXhpc01vZHVsZSBtb2R1bGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBkbyBtdWNoIGhlcmUuLi4KLSAgICAgICAgICAgIGxvZy5lcnJvcihheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLCBheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0vLyAgTm90ZSAtIHJlbW92ZWQgdGhpcyBtZXRob2Qgd2hpY2ggd2FzIGRlYWQgY29kZS4KLS8vICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBjb3B5T3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFzIGV4aXN0aW5nIE9wZXJhdGlvbkNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG1lc3NhZ2UgaWYgb25lIGV4aXN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogVE9ETyAtIHdoeSBib3RoIHRoaXMgYW5kIGZpbmRPcGVyYXRpb25Db250ZXh0KCk/IChHRCkKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCBmb3Igd2hpY2ggd2UnZCBsaWtlIGFuIE9wZXJhdGlvbkNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBPcGVyYXRpb25Db250ZXh0LCBvciBudWxsCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ29udGV4dCBmaW5kRm9yRXhpc3RpbmdPcGVyYXRpb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0OwotCi0gICAgICAgIGlmICgob3BlcmF0aW9uQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uQ29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoaXMgbWVzc2FnZSBpcyBub3QgcmVsYXRlZCB0byBhbm90aGVyIG9uZSwgb3IgaXQgaXMgYnV0IG5vdCBvbmUgZW1pdHRlZAotICAgICAgICAvLyBmcm9tIHRoZSBzYW1lIG9wZXJhdGlvbiwgZG9uJ3QgZnVydGhlciBsb29rIGZvciBhbiBvcGVyYXRpb24gY29udGV4dCBvciBmYXVsdC4KLSAgICAgICAgaWYgKG51bGwgIT0gbXNnQ29udGV4dC5nZXRSZWxhdGVzVG8oKSkgewotICAgICAgICAgICAgLy8gU28gdGhpcyBtZXNzYWdlIG1heSBiZSBwYXJ0IG9mIGFuIG9uZ29pbmcgTUVQCi0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KG1zZ0NvbnRleHQuZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsID09IG9wZXJhdGlvbkNvbnRleHQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDYW5ub3QgY29ycmVsYXRlIGluYm91bmQgbWVzc2FnZSBSZWxhdGVzVG8gdmFsdWUgWyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldFJlbGF0ZXNUbygpICsgIl0gdG8gaW4tcHJvZ3JlZSBNRVAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBvcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGFuIE9wZXJhdGlvbkNvbnRleHQgZm9yIGFuIGluY29taW5nIG1lc3NhZ2UuIEFuIGluY29taW5nIG1lc3NhZ2UgY2FuIGJlIG9mIHR3byBzdGF0ZXMuCi0gICAgICogPHAvPgotICAgICAqIDEpVGhpcyBpcyBhIG5ldyBpbmNvbWluZyBtZXNzYWdlIG9mIGEgZ2l2ZW4gTUVQLiAyKVRoaXMgbWVzc2FnZSBpcyBhIHBhcnQgb2YgYW4gTUVQIHdoaWNoIGhhcwotICAgICAqIGFscmVhZHkgYmVndW4uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBtZXRob2QgaXMgc3BlY2lhbCBjYXNlZCBmb3IgdGhlIHR3byBNRVBzCi0gICAgICogPHAvPgotICAgICAqICNJTl9PTkxZICNJTl9PVVQKLSAgICAgKiA8cC8+Ci0gICAgICogZm9yIHR3byByZWFzb25zLiBGaXJzdCByZWFzb24gaXMgdGhlIHdpZGUgdXNhZ2UgYW5kIHRoZSBzZWNvbmQgYmVpbmcgdGhhdCB0aGUgbmVlZCBmb3IgdGhlCi0gICAgICogTUVQQ29udGV4dCB0byBiZSBzYXZlZCBmb3IgZnVydGhlciBpbmNvbWluZyBtZXNzYWdlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogSW4gdGhlIGV2ZW50IHRoYXQgTUVQIG9mIHRoaXMgb3BlcmF0aW9uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0d28gTUVQcyBkZWZhdWx0ZWQgYWJvdmUgdGhlCi0gICAgICogZGVjaXNpb24gb2YgY3JlYXRpbmcgYSBuZXcgb3IgdGhpcyBtZXNzYWdlIHJlbGF0ZXMgdG8gYSBNRVAgd2hpY2ggYWxyZWFkeSBpbiBidXNpbmVzcyBpcwotICAgICAqIGRlY2lkZWQgYnkgbG9va2luZyBhdCB0aGUgV1NBIFJlbGF0ZXMgVE8gb2YgdGhlIGluY29taW5nIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICAgTWVzc2FnZUNvbnRleHQgdG8gc2VhcmNoCi0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0IFNlcnZpY2VDb250ZXh0IChUT0RPIC0gd2h5IHBhc3MgdGhpcz8gKEdEKSkKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3RpdmUgT3BlcmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0IGZpbmRPcGVyYXRpb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0OwotCi0gICAgICAgIGlmIChudWxsID09IG1zZ0NvbnRleHQuZ2V0UmVsYXRlc1RvKCkpIHsKLQotICAgICAgICAgICAgLy8gSXRzIGEgbmV3IGluY29taW5nIG1lc3NhZ2Ugc28gZ2V0IHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSBhIG5ldwotICAgICAgICAgICAgLy8gb25lCi0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dCh0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgLy8gU28gdGhpcyBtZXNzYWdlIGlzIHBhcnQgb2YgYW4gb25nb2luZyBNRVAKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQobXNnQ29udGV4dC5nZXRSZWxhdGVzVG8oKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgPT0gb3BlcmF0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90Q29ycmVsYXRlTXNnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRBeGlzT3BlcmF0aW9uKHRoaXMpOwotICAgICAgICBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIG9wZXJhdGlvbkNvbnRleHQuYWRkTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0T3BlcmF0aW9uQ29udGV4dChvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQuaXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0LmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0QXhpc09wZXJhdGlvbih0aGlzKTsKLSAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5hZGRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICBpZiAob3BlcmF0aW9uQ29udGV4dC5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbkNvbnRleHQuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWFwcyB0aGUgU3RyaW5nIFVSSSBvZiB0aGUgTWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIHRvIGFuIGludGVnZXIuIEZ1cnRoZXIsIGluIHRoZSBmaXJzdAotICAgICAqIGxvb2t1cCwgaXQgd2lsbCBjYWNoZSB0aGUgbG9va2VkIHVwIHZhbHVlIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzIGFyZSBleHRyZW1lbHkKLSAgICAgKiBlZmZpY2llbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIE1FUCBjb25zdGFudCBmcm9tIFdTRExDb25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEF4aXNTcGVjaWZpY01FUENvbnN0YW50KCkgewotICAgICAgICBpZiAodGhpcy5tZXAgIT0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5WQUxJRCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTlZBTElEOwotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMobWVwVVJJKSkgewotICAgICAgICAgICAgdGVtcCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVDsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PTkxZOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICB0ZW1wID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1BUSU9OQUxfT1VUOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICB0ZW1wID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX0lOOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT05MWTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMobWVwVVJJKSkgewotICAgICAgICAgICAgdGVtcCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX09VVF9PUFRJT05BTF9JTjsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICB0ZW1wID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfUk9CVVNUX0lOX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIHRlbXAgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfT1VUX09OTFk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGVtcCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0Vycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG1hcHBpbmdlcnJvciIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWVwID0gdGVtcDsKLQotICAgICAgICByZXR1cm4gdGhpcy5tZXA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UjZ2V0RW5nYWRnZWRNb2R1bGVzKCkKLSAgICAgKi8KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBBeGlzTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBsYWJlbCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBtZXBVUkk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VSZWNlaXZlciBnZXRNZXNzYWdlUmVjZWl2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZUNvbmZpZ3VyYXRpb24gZ2V0TW9kdWxlQ29uZmlnKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoTW9kdWxlQ29uZmlndXJhdGlvbiltb2R1bGVDb25maWdtYXAuZ2V0KG1vZHVsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiBnZXRNb2R1bGVSZWZzKCkgewotICAgICAgICByZXR1cm4gbW9kdWxlcmVmczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBBcnJheUxpc3QgZ2V0UGhhc2VzT3V0RmxvdygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEFycmF5TGlzdCBnZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBzdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFN0cmluZz4gZ2V0V1NBTWFwcGluZ0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiB3c2FtYXBwaW5nTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRyb2xPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sT3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBwYXJhbWV0ZXIgaXMgbG9ja2VkCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQotICAgICAgICAvLyBjaGVja2luZyB0aGUgbG9ja2VkIHZhbHVlIG9mIHBhcmVudAotICAgICAgICBib29sZWFuIGxvY2tlZCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSBnZXRQYXJlbnQoKS5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXJOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTsKLQotICAgICAgICAgICAgcmV0dXJuIChwYXJhbWV0ZXIgIT0gbnVsbCkgJiYgcGFyYW1ldGVyLmlzTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sT3BlcmF0aW9uKGJvb2xlYW4gY29udHJvbE9wZXJhdGlvbikgewotICAgICAgICB0aGlzLmNvbnRyb2xPcGVyYXRpb24gPSBjb250cm9sT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oU3RyaW5nIG1lcFVSSSkgewotICAgICAgICB0aGlzLm1lcFVSSSA9IG1lcFVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICB0aGlzLm1lc3NhZ2VSZWNlaXZlciA9IG1lc3NhZ2VSZWNlaXZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UGhhc2VzT3V0RmxvdyhBcnJheUxpc3QgbGlzdCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coQXJyYXlMaXN0IGxpc3QpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKHN0eWxlKSkgewotICAgICAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NhbWFwcGluZ0xpc3QoQXJyYXlMaXN0PFN0cmluZz4gd3NhbWFwcGluZ0xpc3QpIHsKLSAgICAgICAgdGhpcy53c2FtYXBwaW5nTGlzdCA9IHdzYW1hcHBpbmdMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBPcGVyYXRpb25DbGllbnQgc3VpdGFibGUgZm9yIHRoaXMgQXhpc09wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYyAgICAgIGFjdGl2ZSBTZXJ2aWNlQ29udGV4dAotICAgICAqIEBwYXJhbSBvcHRpb25zIGFjdGl2ZSBPcHRpb25zCi0gICAgICogQHJldHVybiBhbiBPcGVyYXRpb25DbGllbnQgc2V0IHVwIGFwcHJvcHJpYXRlbHkgZm9yIHRoaXMgb3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkNsaWVudCBjcmVhdGVDbGllbnQoU2VydmljZUNvbnRleHQgc2MsIE9wdGlvbnMgb3B0aW9ucyk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEF4aXNNZXNzYWdlPiBnZXRGYXVsdE1lc3NhZ2VzKCkgewotICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdE1lc3NhZ2VzKEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSkgewotICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICBmYXVsdE1lc3NhZ2VzLmFkZChmYXVsdE1lc3NhZ2UpOwotICAgICAgICBpZiAoZ2V0RmF1bHRBY3Rpb24oZmF1bHRNZXNzYWdlLmdldE5hbWUoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkRmF1bHRBY3Rpb24oZmF1bHRNZXNzYWdlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cm46IiArIG5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvYXBBY3Rpb24oU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgdGhpcy5zb2FwQWN0aW9uID0gc29hcEFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKgotICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFjY2VzcyB0aGUgV1MtQSBJbnB1dCBBY3Rpb24gcGVyIHRoZQotICAgICogV1MtQSBzcGVjLiBFZmZlY3RpdmVseSB1c2UgdGhlIHNvYXBBY3Rpb24gaWYgYXZhaWxhYmxlIGVsc2UKLSAgICAqIHVzZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIFdTQSBNYXBwaW5nIGxpc3QuCi0gICAgKgotICAgICogVXNlIGdldFNvYXBBY3Rpb24gd2hlbiB5b3Ugd2FudCB0byBnZXQgdGhlIHNvYXAgYWN0aW9uIGFuZCB0aGlzCi0gICAgKiB3aGVuIHlvdSB3YW50IHRvIGdldCB0aGUgd3NhIGlucHV0IGFjdGlvbi4KLSAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRBY3Rpb24oKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoc29hcEFjdGlvbiAhPSBudWxsICYmICEiIi5lcXVhbHMoc29hcEFjdGlvbikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNvYXBBY3Rpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAod3NhbWFwcGluZ0xpc3QgIT0gbnVsbCAmJiAhd3NhbWFwcGluZ0xpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gKFN0cmluZyl3c2FtYXBwaW5nTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRBY3Rpb24oU3RyaW5nIGFjdCkgewotICAgICAgICBvdXRwdXRBY3Rpb24gPSBhY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmF1bHRBY3Rpb24oU3RyaW5nIGZhdWx0TmFtZSwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBmYXVsdEFjdGlvbnMucHV0KGZhdWx0TmFtZSwgYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGYXVsdEFjdGlvbihTdHJpbmcgZmF1bHROYW1lKSB7Ci0gICAgICAgIGZhdWx0QWN0aW9ucy5yZW1vdmUoZmF1bHROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QWN0aW9uKFN0cmluZyBmYXVsdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpZmF1bHRBY3Rpb25zLmdldChmYXVsdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGYXVsdEFjdGlvbk5hbWVzKCkgewotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gZmF1bHRBY3Rpb25zLmtleVNldCgpOwotICAgICAgICBTdHJpbmdbXSBmYXVsdEFjdGlvbk5hbWVzID0gbmV3IFN0cmluZ1trZXlzLnNpemUoKV07Ci0gICAgICAgIGZhdWx0QWN0aW9uTmFtZXMgPSAoU3RyaW5nW10pa2V5cy50b0FycmF5KGZhdWx0QWN0aW9uTmFtZXMpOwotICAgICAgICByZXR1cm4gZmF1bHRBY3Rpb25OYW1lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZmF1bHRBY3Rpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWVzc2FnZXMgcmVmZXJlbmNlZCBieSB0aGlzIG9wZXJhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBhbGwgdGhlIEF4aXNNZXNzYWdlcyB3ZSBkZWFsIHdpdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3I8QXhpc01lc3NhZ2U+IGdldE1lc3NhZ2VzKCkgewotICAgICAgICByZXR1cm4gKEl0ZXJhdG9yPEF4aXNNZXNzYWdlPilnZXRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFR5cGVzYWZlIGFjY2VzcyB0byBwYXJlbnQgc2VydmljZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQXhpc1NlcnZpY2Ugd2hpY2ggY29udGFpbnMgdGhpcyBBeGlzT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gKEF4aXNTZXJ2aWNlKWdldFBhcmVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29hcEFjdGlvbigpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhpcyBBeGlzT3BlcmF0aW9uIGluc3RhbmNlIG1heSBiZSB1c2VkIGZvciB0aGUgY2xpZW50IE9VVC1JTiBvciBmb3IKLSAgICAgICAgICogdGhlIHNlcnZlciBJTi1PVVQuICBJZiB0aGUgYmVsb3cgY29kZSB3ZXJlIGNoYW5nZWQgdG8gZ2V0SW5wdXRBY3Rpb25zLCBhbmQgdGhlCi0gICAgICAgICAqIHJlc3VsdCBvZiBnZXRJbnB1dEFjdGlvbiB3ZXJlIHB1dCBpbiB0aGUgU09BUCBhY3Rpb24gaGVhZGVyIG9uIGEgY2xpZW50IG91dGJvdW5kCi0gICAgICAgICAqIG1lc3NhZ2UsIHRoZSBzZXJ2ZXIgd291bGQgcmVjZWl2ZSBhbiBJTkNPUlJFQ1QgU09BUCBhY3Rpb24gaGVhZGVyLiAgV2Ugc2hvdWxkIGxlYXZlCi0gICAgICAgICAqIHRoaXMgYXMgJ3JldHVybiBzb2FwQWN0aW9uOycgT1IgbWFrZSBpdCBjbGllbnQvc2VydmVyIGF3YXJlLgotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNPcGVyYXRpb25GYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc09wZXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMjgxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc09wZXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzT3BlcmF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIFdTRExDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb24oaW50IG1lcFVSSSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYWJPcGRlc2M7Ci0KLSAgICAgICAgc3dpdGNoIChtZXBVUkkpIHsKLSAgICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2Muc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVCA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYy5zZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5fT1BUSU9OQUxfT1VUIDogewotICAgICAgICAgICAgICAgIGFiT3BkZXNjID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9ST0JVU1RfSU5fT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2Muc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX0lOIDogewotICAgICAgICAgICAgICAgIGFiT3BkZXNjID0gbmV3IE91dEluQXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfT1BUSU9OQUxfSU4gOiB7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2MgPSBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYWJPcGRlc2Muc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9PVVRfT05MWSA6IHsKLSAgICAgICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBSb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdCA6IHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVuU3VwcG9ydGVkTUVQIiwgIklEIGlzICIgKyBtZXBVUkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWJPcGRlc2M7Ci0gICAgfQotCi0gICAgLy9GSVhNRSBhZGQgaW4gdGhlIGxhdGVzdCBNRVAgVVJJcyBBTkQgbmVlZHMgdG8gZG91YmxlIGNoZWNrIG9uIGFib3V0IHRoZSBtZXAgd2UgaGFkIGluIDIwMDQKLSAgICBwdWJsaWMgc3RhdGljIEF4aXNPcGVyYXRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oU3RyaW5nIG1lcFVSSSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYWJPcGRlc2M7Ci0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVwVVJJKSkgewotICAgICAgICAgICAgYWJPcGRlc2MgPSBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMobWVwVVJJKSB8fAotICAgICAgICAgICAgICAgIFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXBVUkkpKSB7Ci0gICAgICAgICAgICBhYk9wZGVzYyA9IG5ldyBPdXRJbkF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkpOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXBVUkkpIHx8Ci0gICAgICAgICAgICAgICAgV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkpIHsKLSAgICAgICAgICAgIGFiT3BkZXNjID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIGFiT3BkZXNjLnNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVuU3VwcG9ydGVkTUVQIiwgIklEIGlzICIgKyBtZXBVUkkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWJPcGRlc2M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwNTNhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLkV4Y2x1ZGVJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlBoYXNlc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUV4dGVybmFsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZVByZWZpeExpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC53c2RsLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgQXhpc1NlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIEF4aXNTZXJ2aWNlIGV4dGVuZHMgQXhpc0Rlc2NyaXB0aW9uIHsKLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBTdGFuZGFyZCBQYXJhbWV0ZXIgbmFtZXMKLQotCS8qKgotCSAqIElmIHRoaXMgcGFyYW0gaXMgdHJ1ZSwgYW5kIHRoZSBzZXJ2aWNlIGhhcyBleGFjdGx5IG9uZSBBeGlzT3BlcmF0aW9uLAotCSAqIG5vcm1hbCBvcGVyYXRpb24gZGlzcGF0Y2ggKHZpYSBVUkkvc29hcEFjdGlvbi9ldGMpIHdpbGwgbm90IGJlIG5lY2Vzc2FyeSwKLQkgKiBhbmQgd2UnbGwganVzdCBkZWZhdWx0IHRvIGZ1bm5lbGluZyBhbGwgbWVzc2FnZXMgdG8gdGhhdCBvcC4gVGhpcyBpcwotCSAqIHVzZWZ1bCBmb3IgcGFzc3Rocm91Z2gvRVNCL2VtYmVkZGVkIGFwcGxpY2F0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUX1NJTkdMRV9PUCA9ICJzdXBwb3J0U2luZ2xlT3BlcmF0aW9uIjsKLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVEFHID0gImltcG9ydCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9UQUcgPSAiaW5jbHVkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PiBlbmRwb2ludE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PigpOwotCi0JLyoKLQkgKiBUaGlzIGlzIGEgbWFwIGJldHdlZW4gdGhlIFFOYW1lIG9mIHRoZSBlbGVtZW50IG9mIGEgbWVzc2FnZSBzcGVjaWZpZWQgaW4KLQkgKiB0aGUgV1NETCBhbmQgYW4gT3BlcmF0aW9uLiBJdCBlbmFibGVzIFNPQVAgQm9keS1iYXNlZCBkaXNwYXRjaGluZyBmb3IKLQkgKiBkb2MtbGl0ZXJhbCBiaW5kaW5ncy4KLQkgKi8KLQlwcml2YXRlIE1hcDxRTmFtZSwgQXhpc09wZXJhdGlvbj4gbWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIEF4aXNPcGVyYXRpb24+KCk7Ci0KLQlwcml2YXRlIGludCBuc0NvdW50ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQXhpc1NlcnZpY2UuY2xhc3MpOwotCXByaXZhdGUgVVJMIGZpbGVOYW1lOwotCi0JLy8gTWFwcyBodHRwTG9jYXRpb25zIHRvIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9ucy4gVXNlZCB0byBkaXNwYXRjaCByZXN0Ci0JLy8gbWVzc2FnZXMuCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQXhpc09wZXJhdGlvbj4gaHR0cExvY2F0aW9uRGlzcGF0Y2hlck1hcCA9IG51bGw7Ci0KLQkvLyBBIG1hcCBvZiAoU3RyaW5nIGFsaWFzLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikuIFRoZSBhbGlhc2VzIG1pZ2h0Ci0JLy8gaW5jbHVkZTogU09BUEFjdGlvbiwKLQkvLyBXUy1BZGRyZXNzaW5nIGFjdGlvbiwgdGhlIG9wZXJhdGlvbiBuYW1lLCB0aGUgQXhpc0lucHV0TWVzc2FnZSBuYW1lLiBTZWU6Ci0JLy8gLSBpbnZhbGlkT3BlcmF0aW9uc0FsaWFzZXMKLQkvLyAtIG1hcEFjdGlvblRvT3BlcmF0b2luKCkKLQkvLyAtIGdldE9wZXJhdGlvbkJ5QWN0aW9uKCkKLQkvLyBSRVZJRVc6IFRoaXMgcmVhbGx5IHNob3VsZCBiZSBzZXBlcmF0ZSBtYXBzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mCi0JLy8gYWxpYXNlcyBzbyB0aGV5IGRvbid0Ci0JLy8gY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyLiBGb3IgZXhhbXBsZSwgc28gdGhhdCBhbiBpZGVudGljYWwgb3BlcmF0aW9uCi0JLy8gbmFtZSBhbmQgc29hcCBhY3Rpb24KLQkvLyBvbiBkaWZmZXJlbnQgb3BlcmF0b2lucyBkb24ndCBjYXVzZSBhIGNvbGxpc2lvbjsgdGhlIGZvbGxvd2luZyBjYW4ndCBiZQotCS8vIHJvdXRlZCBiZWNhdXNlCi0JLy8gImZvbyIgaXMgbm90IHVuaXF1ZSBhY3Jvc3MgZGlmZmVyZW50IG9wZXJhdGlvbnM6Ci0JLy8gb3BlcmF0aW9uIDE6IGFjdGlvbiA9IGZvbywgbmFtZSA9IGJhcgotCS8vIG9wZXJhdGlvbiAyOiBhY3Rpb24gPSBiYXIsIG5hbWUgPSBmb28KLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBBeGlzT3BlcmF0aW9uPiBvcGVyYXRpb25zQWxpYXNlc01hcCA9IG51bGw7Ci0KLQkvLyBDb2xsZWN0aW9uIG9mIGFsaWFzZXMgdGhhdCBhcmUgaW52YWxpZCBmb3IgdGhpcyBzZXJ2aWNlIGJlY2F1c2UgdGhleSBhcmUKLQkvLyBkdXBsaWNhdGVkIGFjcm9zcwotCS8vIG11bHRpcGxlIG9wZXJhdGlvbnMgdW5kZXIgdGhpcyBzZXJ2aWNlLgotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGludmFsaWRPcGVyYXRpb25zQWxpYXNlcyA9IG51bGw7Ci0JLy8gcHJpdmF0ZSBIYXNoTWFwIG9wZXJhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gdG8gc3RvcmUgbW9kdWxlIHJlZiBhdCBkZXBsb3kgdGltZSBwYXJzaW5nCi0JcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtb2R1bGVSZWZzID0gbnVsbDsKLQotCS8vIHRvIGtlZXAgdGhlIHRpbWUgdGhhdCBsYXN0IHVwZGF0ZSB0aW1lIG9mIHRoZSBzZXJ2aWNlCi0JcHJpdmF0ZSBsb25nIGxhc3R1cGRhdGU7Ci0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgTW9kdWxlQ29uZmlndXJhdGlvbj4gbW9kdWxlQ29uZmlnbWFwOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBDbGFzc0xvYWRlciBzZXJ2aWNlQ2xhc3NMb2FkZXI7Ci0KLQkvLyB0byBrZWVwIHRoZSBYTUxTY2hlYW0gZ2V0dGluZyBlaXRoZXIgZnJvbSBXU0RMIG9yIGphdmEyd3NkbAotCXByaXZhdGUgQXJyYXlMaXN0PFhtbFNjaGVtYT4gc2NoZW1hTGlzdDsKLQkvLyBwcml2YXRlIFhtbFNjaGVtYSBzY2hlbWE7Ci0KLQkvLyB3c2RsIGlzIHRoZXJlIGZvciB0aGlzIHNlcnZpY2Ugb3Igbm90IChpbiBzaWRlIE1FVEEtSU5GKQotCXByaXZhdGUgYm9vbGVhbiB3c2RsRm91bmQgPSBmYWxzZTsKLQotCS8vIHRvIHN0b3JlIHRoZSBzY29wZSBvZiB0aGUgc2VydmljZQotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCi0JLy8gdG8gc3RvcmUgZGVmYXVsdCBtZXNzYWdlIHJlY2VpdmVycwotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VSZWNlaXZlcj4gbWVzc2FnZVJlY2VpdmVyczsKLQotCS8vIHRvIHNldCB0aGUgaGFuZGxlciBjaGFpbiBhdmFpbGFibGUgaW4gcGhhc2UgaW5mbwotCXByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0Q2hhaW5zID0gdHJ1ZTsKLQotCS8vIHRvIGtlZXAgdGhlIHN0YXR1cyBvZiB0aGUgc2VydmljZSAsIHNpbmNlIHNlcnZpY2UgY2FuIHN0b3AgYXQgdGhlIHJ1bgotCS8vIHRpbWUKLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZlID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBlbGVtZW50Rm9ybURlZmF1bHQgPSB0cnVlOwotCi0JLy8gdG8ga2VlcCB0aGUgc2VydmljZSB0YXJnZXQgbmFtZSBzcGFjZQotCXByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEphdmEyV1NETENvbnN0YW50cy5ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0U7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gSmF2YTJXU0RMQ29uc3RhbnRzLlRBUkdFVE5BTUVTUEFDRV9QUkVGSVg7Ci0KLQkvLyB0byBzdG9yZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYQotCXByaXZhdGUgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZTsvLyA9IEphdmEyV1NETENvbnN0YW50cy5BWElTMl9YU0Q7Ci0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9OQU1FU1BBQ0VfUFJGSVg7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlQWxsVHJhbnNwb3J0cyA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhwb3NlZFRyYW5zcG9ydHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCS8vIFRvIGtlZXAgcmVmZXJlbmNlIHRvIFNlcnZpY2VMaWZlQ3ljbGUgaW5zdGFuY2UgLCBpZiB0aGUgdXNlciBoYXMKLQkvLyBzcGVjaWZpZWQgaW4gc2VydmljZXMueG1sCi0JcHJpdmF0ZSBTZXJ2aWNlTGlmZUN5Y2xlIHNlcnZpY2VMaWZlQ3ljbGU7Ci0KLQkvKioKLQkgKiBLZWVwcyB0cmFjayB3aGV0aGVyIHRoZSBzY2hlbWEgbG9jYXRpb25zIGFyZSBhZGp1c3RlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzY2hlbWFMb2NhdGlvbnNBZGp1c3RlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIHdzZGxJbXBvcnRMb2NhdGlvbkFkanVzdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBIHRhYmxlIHRoYXQga2VlcHMgYSBtYXBwaW5nIG9mIHVuaXF1ZSB4c2QgbmFtZXMgKFN0cmluZ3MpIGFnYWluc3QgdGhlCi0JICogc2NoZW1hIG9iamVjdHMuIFRoaXMgaXMgcG9wdWxhdGVkIGluIHRoZSBmaXJzdCBpbnN0YW5jZSB0aGUgc2NoZW1hcyBhcmUKLQkgKiBhc2tlZCBmb3IgYW5kIHRoZW4gdXNlZCB0byBzZXJ2ZSB0aGUgc3Vic2VxdWVudCByZXF1ZXN0cwotCSAqLwotCXByaXZhdGUgTWFwIHNjaGVtYU1hcHBpbmdUYWJsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBjb3VudGVyIHZhcmlhYmxlIGZvciBuYW1pbmcgdGhlIHNjaGVtYXMKLQkgKi8KLQlwcml2YXRlIGludCBjb3VudCA9IDA7Ci0JLyoqCi0JICogQSBjdXN0b20gc2NoZW1hIE5hbWUgcHJlZml4LiBpZiBzZXQgdGhpcyB3aWxsIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZQotCSAqIHNjaGVtYSBuYW1lcwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGN1c3RvbVNjaGVtYU5hbWVQcmVmaXggPSBudWxsOwotCi0JLyoqCi0JICogQSBjdXN0b20gc2NoZW1hIG5hbWUgc3VmZml4LiB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBzY2hlbWEgZmlsZSBuYW1lCi0JICogd2hlbiB0aGUgZmlsZXMgYXJlIHVuaXF1ZWx5IG5hbWVkLiBBIGdvb2QgcGxhY2UgdG8gYWRkIGEgZmlsZSBleHRlbnNpb24KLQkgKiBpZiBuZWVkZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjdXN0b21TY2hlbWFOYW1lU3VmZml4ID0gbnVsbDsKLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIFdTREwgcmVsYXRlZCBzdHVmZiAvLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkvKiogTWFwIG9mIHByZWZpeCAtPiBuYW1lc3BhY2VVUkkgKi8KLQlwcml2YXRlIE5hbWVzcGFjZU1hcCBuYW1lc3BhY2VNYXA7Ci0KLQlwcml2YXRlIFN0cmluZyBzb2FwTnNVcmk7Ci0JcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnROYW1lOwotCXByaXZhdGUgU3RyaW5nIGVuZHBvaW50VVJMOwotICAgIAotICAgIHByaXZhdGUgTGlzdCBpbXBvcnRlZE5hbWVzcGFjZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2xpZW50U2lkZSA9IGZhbHNlOwotCi0JLy8gVG8ga2VlcCBhIHJlZiB0byBPYmplY3RTdXBwbGllciBpbnN0YW5jZQotCXByaXZhdGUgT2JqZWN0U3VwcGxpZXIgb2JqZWN0U3VwcGxpZXI7Ci0KLQkvLyBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nCi0JcHJpdmF0ZSBNYXAgcDJuTWFwOwotCi0JLy8gdG8ga2VlcCB0aGUgZXhjbHVkZSBwcm9wZXJ0eSBkZXRhaWxzCi0JcHJpdmF0ZSBFeGNsdWRlSW5mbyBleGNsdWRlSW5mbzsKLQotCXByaXZhdGUgVHlwZVRhYmxlIHR5cGVUYWJsZTsKLQotCS8vIERhdGEgTG9jYXRvcnMgZm9yIFdTLU1leCBTdXBwb3J0Ci0JcHJpdmF0ZSBIYXNoTWFwIGRhdGFMb2NhdG9yczsKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRhdGFMb2NhdG9yQ2xhc3NOYW1lczsKLQlwcml2YXRlIEF4aXNEYXRhTG9jYXRvckltcGwgZGVmYXVsdERhdGFMb2NhdG9yOwotCS8vIERlZmluZSBzZWFyY2ggc2VxdWVuY2UgZm9yIGRhdGFsb2NhdG9yIGJhc2VkIG9uIERhdGEgTG9jYXRvciB0eXBlcy4KLQlMb2NhdG9yVHlwZVtdIGF2YWlsYWJsZURhdGFMb2NhdG9yVHlwZXMgPSBuZXcgTG9jYXRvclR5cGVbXSB7Ci0JCQlMb2NhdG9yVHlwZS5TRVJWSUNFX0RJQUxFQ1QsIExvY2F0b3JUeXBlLlNFUlZJQ0VfTEVWRUwsCi0JCQlMb2NhdG9yVHlwZS5HTE9CQUxfRElBTEVDVCwgTG9jYXRvclR5cGUuR0xPQkFMX0xFVkVMLAotCQkJTG9jYXRvclR5cGUuREVGQVVMVF9BWElTIH07Ci0KLQkvLyBuYW1lIG9mIHRoZSBiaW5kaW5nIHVzZWQgOiB1c2UgaW4gY29kZWdlbmVyYXRpb24KLQlwcml2YXRlIFN0cmluZyBiaW5kaW5nTmFtZTsKLSAgICAgICAgCi0JLy8gTGlzdCBvZiBNZXNzYWdlQ29udGV4dExpc3RlbmVycyB0aGF0IGxpc3RlbiBmb3IgZXZlbnRzIG9uIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAgICBwcml2YXRlIENvcHlPbldyaXRlQXJyYXlMaXN0PE1lc3NhZ2VDb250ZXh0TGlzdGVuZXI+IG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzID0gCi0gICAgICAgICAgICBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8TWVzc2FnZUNvbnRleHRMaXN0ZW5lcj4oKTsKLQotICAgICAgICAvLyBuYW1lcyBsaXN0IGtlZXAgdG8gcHJlc2VydmUgdGhlIHBhcmFtZXRlciBvcmRlcgotICAgICAgICBwcml2YXRlIExpc3Qgb3BlcmF0aW9uc05hbWVMaXN0OwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBlcHJzOwotCXByaXZhdGUgYm9vbGVhbiBjdXN0b21Xc2RsID0gZmFsc2U7Ci0KLQlwcml2YXRlIEhhc2hNYXAgcG9saWN5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBBeGlzRW5kcG9pbnQgZ2V0RW5kcG9pbnQoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKEF4aXNFbmRwb2ludCkgZW5kcG9pbnRNYXAuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW5kcG9pbnQoU3RyaW5nIGtleSwgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgewotCQl0aGlzLmVuZHBvaW50TWFwLnB1dChrZXksIGF4aXNFbmRwb2ludCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgVXNlIEFkZHJlc3NpbmdIZWxwZXIuZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdTQWRkcmVzc2luZ0ZsYWcoKSB7Ci0JCXJldHVybiBBZGRyZXNzaW5nSGVscGVyLmdldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0V1NBZGRyZXNzaW5nRmxhZyhTdHJpbmcgYXIpIHsKLQkJQWRkcmVzc2luZ0hlbHBlci5zZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZSh0aGlzLCBhcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTY2hlbWFMb2NhdGlvbnNBZGp1c3RlZCgpIHsKLQkJcmV0dXJuIHNjaGVtYUxvY2F0aW9uc0FkanVzdGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9uc0FkanVzdGVkKGJvb2xlYW4gc2NoZW1hTG9jYXRpb25zQWRqdXN0ZWQpIHsKLQkJdGhpcy5zY2hlbWFMb2NhdGlvbnNBZGp1c3RlZCA9IHNjaGVtYUxvY2F0aW9uc0FkanVzdGVkOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0U2NoZW1hTWFwcGluZ1RhYmxlKCkgewotCQlyZXR1cm4gc2NoZW1hTWFwcGluZ1RhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYU1hcHBpbmdUYWJsZShNYXAgc2NoZW1hTWFwcGluZ1RhYmxlKSB7Ci0JCXRoaXMuc2NoZW1hTWFwcGluZ1RhYmxlID0gc2NoZW1hTWFwcGluZ1RhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tU2NoZW1hTmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIGN1c3RvbVNjaGVtYU5hbWVQcmVmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tU2NoZW1hTmFtZVByZWZpeChTdHJpbmcgY3VzdG9tU2NoZW1hTmFtZVByZWZpeCkgewotCQl0aGlzLmN1c3RvbVNjaGVtYU5hbWVQcmVmaXggPSBjdXN0b21TY2hlbWFOYW1lUHJlZml4OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tU2NoZW1hTmFtZVN1ZmZpeCgpIHsKLQkJcmV0dXJuIGN1c3RvbVNjaGVtYU5hbWVTdWZmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tU2NoZW1hTmFtZVN1ZmZpeChTdHJpbmcgY3VzdG9tU2NoZW1hTmFtZVN1ZmZpeCkgewotCQl0aGlzLmN1c3RvbVNjaGVtYU5hbWVTdWZmaXggPSBjdXN0b21TY2hlbWFOYW1lU3VmZml4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEF4aXNTZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBBeGlzU2VydmljZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcGVyYXRpb25zQWxpYXNlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMuaW52YWxpZE9wZXJhdGlvbnNBbGlhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQltb2R1bGVDb25maWdtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyBieSBkZWZhdWx0IHNlcnZpY2Ugc2NvcGUgaXMgZm9yIHRoZSByZXF1ZXN0Ci0JCXNjb3BlID0gQ29uc3RhbnRzLlNDT1BFX1JFUVVFU1Q7Ci0JCWh0dHBMb2NhdGlvbkRpc3BhdGNoZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQltZXNzYWdlUmVjZWl2ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJbW9kdWxlUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2NoZW1hTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2VydmljZUNsYXNzTG9hZGVyID0gKENsYXNzTG9hZGVyKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcgotCQkJCS5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXI+KCkgewotCQkJCQlwdWJsaWMgQ2xhc3NMb2FkZXIgcnVuKCkgewotCQkJCQkJcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJb2JqZWN0U3VwcGxpZXIgPSBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCk7Ci0JCWRhdGFMb2NhdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWRhdGFMb2NhdG9yQ2xhc3NOYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBuYW1lIG9mIHRoZSBwb3J0IHR5cGUKLQkgKiBAZGVwcmVjYXRlZCB1c2UgQXhpc1NlcnZpY2UjZ2V0RW5kcG9pbnROYW1lKCkgaW5zdGVhZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGVuZHBvaW50TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcG9ydFR5cGVOYW1lCi0JICogQGRlcHJlY2F0ZWQgdXNlIEF4aXNTZXJ2aWNlI3NldEVuZHBvaW50TmFtZSgpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3J0VHlwZU5hbWUoU3RyaW5nIHBvcnRUeXBlTmFtZSkgewotCQl0aGlzLmVuZHBvaW50TmFtZSA9IHBvcnRUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdOYW1lKCkgewotCQlyZXR1cm4gYmluZGluZ05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmluZGluZ05hbWUoU3RyaW5nIGJpbmRpbmdOYW1lKSB7Ci0JCXRoaXMuYmluZGluZ05hbWUgPSBiaW5kaW5nTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIFNPQVBWZXJzaW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb2FwTnNVcmkoKSB7Ci0JCXJldHVybiBzb2FwTnNVcmk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U29hcE5zVXJpKFN0cmluZyBzb2FwTnNVcmkpIHsKLQkJdGhpcy5zb2FwTnNVcmkgPSBzb2FwTnNVcmk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbmRwb2ludE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50TmFtZSgpIHsKLQkJcmV0dXJuIGVuZHBvaW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRwb2ludE5hbWUoU3RyaW5nIGVuZHBvaW50KSB7Ci0JCXRoaXMuZW5kcG9pbnROYW1lID0gZW5kcG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgQXhpc1NlcnZpY2UuCi0JICovCi0JcHVibGljIEF4aXNTZXJ2aWNlKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlUmVjZWl2ZXIoU3RyaW5nIG1lcFVSSSwKLQkJCU1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIpIHsKLQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMobWVwVVJJKQotCQkJCXx8IFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZCi0JCQkJCQkuZXF1YWxzKG1lcFVSSSkKLQkJCQl8fCBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkKLQkJCQkJCS5lcXVhbHMobWVwVVJJKSkgewotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoCi0JCQkJCVdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLAotCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoCi0JCQkJCVdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhtZXBVUkkpCi0JCQkJfHwgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZCi0JCQkJCQkuZXF1YWxzKG1lcFVSSSkKLQkJCQl8fCBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZCi0JCQkJCQkuZXF1YWxzKG1lcFVSSSkpIHsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFksCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzLnB1dCgKLQkJCQkJV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLAotCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoCi0JCQkJCVdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFksCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCX0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKG1lcFVSSSkKLQkJCQl8fCBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VUCi0JCQkJCQkuZXF1YWxzKG1lcFVSSSkKLQkJCQl8fCBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09VVAotCQkJCQkJLmVxdWFscyhtZXBVUkkpKSB7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzCi0JCQkJCS5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQsIG1lc3NhZ2VSZWNlaXZlcik7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzLnB1dCgKLQkJCQkJV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMucHV0KAotCQkJCQlXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMobWVwVVJJKQotCQkJCXx8IFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQKLQkJCQkJCS5lcXVhbHMobWVwVVJJKQotCQkJCXx8IFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VUCi0JCQkJCQkuZXF1YWxzKG1lcFVSSSkpIHsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULAotCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoCi0JCQkJCVdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQsCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzCi0JCQkJCS5wdXQoCi0JCQkJCQkJV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQsCi0JCQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJfSBlbHNlIGlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVwVVJJKQotCQkJCXx8IFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4KLQkJCQkJCS5lcXVhbHMobWVwVVJJKQotCQkJCXx8IFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOCi0JCQkJCQkuZXF1YWxzKG1lcFVSSSkpIHsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMKLQkJCQkJLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTiwgbWVzc2FnZVJlY2VpdmVyKTsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMucHV0KAotCQkJCQlXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLAotCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoCi0JCQkJCVdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLAotCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQl9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhtZXBVUkkpCi0JCQkJfHwgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTgotCQkJCQkJLmVxdWFscyhtZXBVUkkpCi0JCQkJfHwgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4KLQkJCQkJCS5lcXVhbHMobWVwVVJJKSkgewotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4sCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzLnB1dCgKLQkJCQkJV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTiwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMKLQkJCQkJLnB1dCgKLQkJCQkJCQlXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTiwKLQkJCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQl9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXBVUkkpCi0JCQkJfHwgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWQotCQkJCQkJLmVxdWFscyhtZXBVUkkpCi0JCQkJfHwgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkKLQkJCQkJCS5lcXVhbHMobWVwVVJJKSkgewotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFksCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzLnB1dCgKLQkJCQkJV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWSwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMKLQkJCQkJLnB1dCgKLQkJCQkJCQlXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWSwKLQkJCQkJCQltZXNzYWdlUmVjZWl2ZXIpOwotCQl9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lcFVSSSkKLQkJCQl8fCBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkKLQkJCQkJCS5lcXVhbHMobWVwVVJJKQotCQkJCXx8IFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkKLQkJCQkJCS5lcXVhbHMobWVwVVJJKSkgewotCQkJbWVzc2FnZVJlY2VpdmVycy5wdXQoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMucHV0KAotCQkJCQlXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCQltZXNzYWdlUmVjZWl2ZXJzLnB1dCgKLQkJCQkJV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWSwKLQkJCQkJbWVzc2FnZVJlY2VpdmVyKTsKLQkJfSBlbHNlIHsKLQkJCW1lc3NhZ2VSZWNlaXZlcnMucHV0KG1lcFVSSSwgbWVzc2FnZVJlY2VpdmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBNZXNzYWdlUmVjZWl2ZXIgZ2V0TWVzc2FnZVJlY2VpdmVyKFN0cmluZyBtZXBVUkwpIHsKLQkJcmV0dXJuIChNZXNzYWdlUmVjZWl2ZXIpIG1lc3NhZ2VSZWNlaXZlcnMuZ2V0KG1lcFVSTCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBtb2R1bGUgY29uZmlndXJhdGlvbiAsIGlmIHRoZXJlIGlzIG1vZHVsZUNvbmZpZyB0YWcgaW4gc2VydmljZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1vZHVsZUNvbmZpZyhNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24pIHsKLQkJbW9kdWxlQ29uZmlnbWFwLnB1dChtb2R1bGVDb25maWd1cmF0aW9uLmdldE1vZHVsZU5hbWUoKSwKLQkJCQltb2R1bGVDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW55IGNvbnRyb2wgb3BlcmF0aW9ucyBkZWZpbmVkIGJ5IGEgTW9kdWxlIHRvIHRoaXMgc2VydmljZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogICAgICAgICAgICB0aGUgQXhpc01vZHVsZSB3aGljaCBoYXMganVzdCBiZWVuIGVuZ2FnZWQKLQkgKiBAdGhyb3dzIEF4aXNGYXVsdAotCSAqICAgICAgICAgICAgIGlmIGEgcHJvYmxlbSBvY2N1cnMKLQkgKi8KLQl2b2lkIGFkZE1vZHVsZU9wZXJhdGlvbnMoQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotCQlIYXNoTWFwPFFOYW1lLCBBeGlzT3BlcmF0aW9uPiBtYXAgPSBtb2R1bGUuZ2V0T3BlcmF0aW9ucygpOwotCQlDb2xsZWN0aW9uPEF4aXNPcGVyYXRpb24+IGNvbCA9IG1hcC52YWx1ZXMoKTsKLQkJUGhhc2VSZXNvbHZlciBwaGFzZVJlc29sdmVyID0gbmV3IFBoYXNlUmVzb2x2ZXIoZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0JCWZvciAoSXRlcmF0b3I8QXhpc09wZXJhdGlvbj4gaXRlcmF0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gY29weU9wZXJhdGlvbigoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IKLQkJCQkJLm5leHQoKSk7Ci0JCQlpZiAodGhpcy5nZXRPcGVyYXRpb24oYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpID09IG51bGwpIHsKLQkJCQlBcnJheUxpc3Q8U3RyaW5nPiB3c2FtYXBwaW5ncyA9IGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLQkJCQlpZiAod3NhbWFwcGluZ3MgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMCwgc2l6ZSA9IHdzYW1hcHBpbmdzLnNpemUoKTsgaiA8IHNpemU7IGorKykgewotCQkJCQkJU3RyaW5nIG1hcHBpbmcgPSAoU3RyaW5nKSB3c2FtYXBwaW5ncy5nZXQoaik7Ci0JCQkJCQltYXBBY3Rpb25Ub09wZXJhdGlvbihtYXBwaW5nLCBheGlzT3BlcmF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJZiB3ZSd2ZSBzZXQgdGhlICJleHBvc2UiIHBhcmFtZXRlciBmb3IgdGhpcyBvcGVyYXRpb24sIGl0J3MKLQkJCQkvLyBub3JtYWwgKG5vbi0KLQkJCQkvLyBjb250cm9sKSBhbmQgdGhlcmVmb3JlIGl0IHdpbGwgYXBwZWFyIGluIGdlbmVyYXRlZCBXU0RMLiBJZgotCQkJCS8vIHdlIGhhdmVuJ3QsCi0JCQkJLy8gaXQncyBhIGNvbnRyb2wgb3BlcmF0aW9uIGFuZCB3aWxsIGJlIGlnbm9yZWQgYXQgV1NETC1nZW4KLQkJCQkvLyB0aW1lLgotCQkJCWlmIChheGlzT3BlcmF0aW9uCi0JCQkJCQkuaXNQYXJhbWV0ZXJUcnVlKERlcGxveW1lbnRDb25zdGFudHMuVEFHX0VYUE9TRSkpIHsKLQkJCQkJYXhpc09wZXJhdGlvbi5zZXRDb250cm9sT3BlcmF0aW9uKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlheGlzT3BlcmF0aW9uLnNldENvbnRyb2xPcGVyYXRpb24odHJ1ZSk7Ci0JCQkJfQotCi0JCQkJcGhhc2VSZXNvbHZlci5lbmdhZ2VNb2R1bGVUb09wZXJhdGlvbihheGlzT3BlcmF0aW9uLCBtb2R1bGUpOwotCi0JCQkJdGhpcy5hZGRPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2R1bGVyZWYoU3RyaW5nIG1vZHVsZXJlZikgewotCQltb2R1bGVSZWZzLmFkZChtb2R1bGVyZWYpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSNhZGRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uKQotCSAqLwotCi0JLyoqCi0JICogTWV0aG9kIGFkZE9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXhpc09wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvbihBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsKLQkJYXhpc09wZXJhdGlvbi5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5lcXVhbHMoU2VydmljZUNsaWVudC5BTk9OX09VVF9PTkxZX09QKQotICAgICAgICAgICAgICAgICAgICB8fCAoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZXF1YWxzKFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfT05MWV9PUCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IChheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5lcXVhbHMoU2VydmljZUNsaWVudC5BTk9OX09VVF9PTkxZX09QKSkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNsaWVudC1kZWZpbmVkIG9wZXJhdGlvbiBuYW1lIG1hdGNoZXMgZGVmYXVsdCBvcGVyYXRpb24gbmFtZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAidGhpcyBtYXkgY2F1c2UgaW50ZXJvcGVyYWJpbGl0eSBpc3N1ZXMuICBOYW1lIGlzOiAiICsgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCQlJdGVyYXRvcjxBeGlzTW9kdWxlPiBtb2R1bGVzID0gZ2V0RW5nYWdlZE1vZHVsZXMoKS5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChtb2R1bGVzLmhhc05leHQoKSkgewotCQkJQXhpc01vZHVsZSBtb2R1bGUgPSAoQXhpc01vZHVsZSkgbW9kdWxlcy5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWF4aXNPcGVyYXRpb24uZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0JCQl9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0JCQkJbG9nLmluZm8oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibW9kdWxlYWxyZWR5ZW5nYWdldG9zZXJ2aWNlIiwKLQkJCQkJCW1vZHVsZS5nZXROYW1lKCkpKTsKLQkJCX0KLQkJfQotCQlpZiAoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0JCQlheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihsb2FkRGVmYXVsdE1lc3NhZ2VSZWNlaXZlcigKLQkJCQkJYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCksIHRoaXMpKTsKLQkJfQotCQlpZiAoYXhpc09wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpID09IG51bGwpIHsKLQkJCWF4aXNPcGVyYXRpb24uc2V0U29hcEFjdGlvbigidXJuOiIKLQkJCQkJKyBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0JCX0KLQotCQlpZiAoYXhpc09wZXJhdGlvbi5nZXRPdXRwdXRBY3Rpb24oKSA9PSBudWxsKSB7Ci0JCQlheGlzT3BlcmF0aW9uLnNldE91dHB1dEFjdGlvbigidXJuOiIKLQkJCQkJKyBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKQotCQkJCQkrIEphdmEyV1NETENvbnN0YW50cy5SRVNQT05TRSk7Ci0JCX0KLQkJYWRkQ2hpbGQoYXhpc09wZXJhdGlvbik7Ci0KLQkJU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQotCQkvKgotCQkgKiBTb21lIHRpbWVzIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIG5hbWUgb2YKLQkJICogdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBTT0FQQm9keS4gVGhpcyB3aWxsIHB1dCB0aGUgY29ycmVjdCBtYXBwaW5nCi0JCSAqIGFzc29jaWF0aW5nIHRoYXQgbmFtZSB3aXRoIHRoZSBvcGVyYXRpb24uIFRoaXMgd2lsbCBiZSB1c2VmdWwKLQkJICogZXNwZWNpYWxseSBmb3IgdGhlIFNPQVBCb2R5QmFzZWREaXNwYXRjaGVyCi0JCSAqLwotCi0JCUl0ZXJhdG9yIGF4aXNNZXNzYWdlSXRlciA9IGF4aXNPcGVyYXRpb24uZ2V0Q2hpbGRyZW4oKTsKLQotCQl3aGlsZSAoYXhpc01lc3NhZ2VJdGVyLmhhc05leHQoKSkgewotCQkJQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIGF4aXNNZXNzYWdlSXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbWVzc2FnZU5hbWUgPSBheGlzTWVzc2FnZS5nZXROYW1lKCk7Ci0JCQlpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCAmJiAhbWVzc2FnZU5hbWUuZXF1YWxzKG9wZXJhdGlvbk5hbWUpKSB7Ci0JCQkJbWFwQWN0aW9uVG9PcGVyYXRpb24obWVzc2FnZU5hbWUsIGF4aXNPcGVyYXRpb24pOwotCQkJfQotCQl9Ci0KLQkJbWFwQWN0aW9uVG9PcGVyYXRpb24ob3BlcmF0aW9uTmFtZSwgYXhpc09wZXJhdGlvbik7Ci0KLQkJU3RyaW5nIGFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0SW5wdXRBY3Rpb24oKTsKLQkJaWYgKGFjdGlvbi5sZW5ndGgoKSA+IDApIHsKLQkJCW1hcEFjdGlvblRvT3BlcmF0aW9uKGFjdGlvbiwgYXhpc09wZXJhdGlvbik7Ci0JCX0KLQotCQlBcnJheUxpc3Q8U3RyaW5nPiB3c2FtYXBwaW5ncyA9IGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLQkJaWYgKHdzYW1hcHBpbmdzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGogPSAwLCBzaXplID0gd3NhbWFwcGluZ3Muc2l6ZSgpOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmcgPSAoU3RyaW5nKSB3c2FtYXBwaW5ncy5nZXQoaik7Ci0JCQkJbWFwQWN0aW9uVG9PcGVyYXRpb24obWFwcGluZywgYXhpc09wZXJhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0JCQlheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihsb2FkRGVmYXVsdE1lc3NhZ2VSZWNlaXZlcigKLQkJCQkJYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCksIHRoaXMpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTWVzc2FnZVJlY2VpdmVyIGxvYWREZWZhdWx0TWVzc2FnZVJlY2VpdmVyKFN0cmluZyBtZXBVUkwsCi0JCQlBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0JCU1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXI7Ci0JCWlmIChtZXBVUkwgPT0gbnVsbCkgewotCQkJbWVwVVJMID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQ7Ci0JCX0KLQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZVJlY2VpdmVyID0gc2VydmljZS5nZXRNZXNzYWdlUmVjZWl2ZXIobWVwVVJMKTsKLQkJCWlmIChtZXNzYWdlUmVjZWl2ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBtZXNzYWdlUmVjZWl2ZXI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TWVzc2FnZVJlY2VpdmVyKG1lcFVSTCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGNvcHkgZnJvbSBtb2R1bGUgb3BlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBheGlzT3BlcmF0aW9uCi0JICogQHJldHVybiBSZXR1cm5zIEF4aXNPcGVyYXRpb24uCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQlwcml2YXRlIEF4aXNPcGVyYXRpb24gY29weU9wZXJhdGlvbihBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBBeGlzT3BlcmF0aW9uRmFjdG9yeQotCQkJCS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihheGlzT3BlcmF0aW9uCi0JCQkJCQkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsKLQotCQlvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCkpOwotCQlvcGVyYXRpb24uc2V0TmFtZShheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJSXRlcmF0b3I8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAocGFyYW1ldGVycy5oYXNOZXh0KCkpIHsKLQkJCVBhcmFtZXRlciBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBwYXJhbWV0ZXJzLm5leHQoKTsKLQotCQkJb3BlcmF0aW9uLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotCQl9Ci0KLQkJUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlID0gbmV3IFBvbGljeUluY2x1ZGUob3BlcmF0aW9uKTsKLQkJUG9saWN5SW5jbHVkZSBheGlzT3BlcmF0aW9uUG9saWN5SW5jbHVkZSA9IGF4aXNPcGVyYXRpb24KLQkJCQkuZ2V0UG9saWN5SW5jbHVkZSgpOwotCi0JCWlmIChheGlzT3BlcmF0aW9uUG9saWN5SW5jbHVkZSAhPSBudWxsKSB7Ci0JCQlQb2xpY3kgcG9saWN5ID0gYXhpc09wZXJhdGlvblBvbGljeUluY2x1ZGUuZ2V0UG9saWN5KCk7Ci0JCQlpZiAocG9saWN5ICE9IG51bGwpIHsKLQkJCQlwb2xpY3lJbmNsdWRlLnNldFBvbGljeShheGlzT3BlcmF0aW9uUG9saWN5SW5jbHVkZS5nZXRQb2xpY3koKSk7Ci0JCQl9Ci0JCX0KLQkJb3BlcmF0aW9uLnNldFBvbGljeUluY2x1ZGUocG9saWN5SW5jbHVkZSk7Ci0KLQkJb3BlcmF0aW9uLnNldFdzYW1hcHBpbmdMaXN0KGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKSk7Ci0JCW9wZXJhdGlvbi5zZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coYXhpc09wZXJhdGlvbgotCQkJCS5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKSk7Ci0JCW9wZXJhdGlvbi5zZXRQaGFzZXNJbkZhdWx0RmxvdyhheGlzT3BlcmF0aW9uLmdldFBoYXNlc0luRmF1bHRGbG93KCkpOwotCQlvcGVyYXRpb24uc2V0UGhhc2VzT3V0RmF1bHRGbG93KGF4aXNPcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmF1bHRGbG93KCkpOwotCQlvcGVyYXRpb24uc2V0UGhhc2VzT3V0RmxvdyhheGlzT3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKSk7Ci0KLQkJb3BlcmF0aW9uLnNldE91dHB1dEFjdGlvbihheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpKTsKLQkJU3RyaW5nW10gZmF1bHRBY3Rpb25OYW1lcyA9IGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb25OYW1lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0QWN0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCW9wZXJhdGlvbi5hZGRGYXVsdEFjdGlvbihmYXVsdEFjdGlvbk5hbWVzW2ldLCBheGlzT3BlcmF0aW9uCi0JCQkJCS5nZXRGYXVsdEFjdGlvbihmYXVsdEFjdGlvbk5hbWVzW2ldKSk7Ci0JCX0KLQotCQlyZXR1cm4gb3BlcmF0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSNhZGRUb2VuZ2FnZWRNb2R1bGVzKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0JICovCi0KLQkvKioKLQkgKiBFbmdhZ2VzIGEgbW9kdWxlLiBJdCBpcyByZXF1aXJlZCB0byB1c2UgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIGF4aXNNb2R1bGUKLQkgKiBAcGFyYW0gZW5nYWdlcgotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW5nYWdlKEF4aXNNb2R1bGUgYXhpc01vZHVsZSwgQXhpc0Rlc2NyaXB0aW9uIGVuZ2FnZXIpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJLy8gYWRkaW5nIG1vZHVsZSBvcGVyYXRpb25zCi0JCWFkZE1vZHVsZU9wZXJhdGlvbnMoYXhpc01vZHVsZSk7Ci0KLQkJSXRlcmF0b3I8QXhpc09wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IGdldE9wZXJhdGlvbnMoKTsKLQkJd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0JCQlheGlzT3BlcmF0aW9uLmVuZ2FnZU1vZHVsZShheGlzTW9kdWxlLCBlbmdhZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcHMgYW4gYWxpYXMgKHN1Y2ggYXMgYSBTT0FQQWN0aW9uLCBXU0EgYWN0aW9uLCBvciBhbiBvcGVyYXRpb24gbmFtZSkgdG8KLQkgKiB0aGUgZ2l2ZW4gQXhpc09wZXJhdGlvbi4gVGhpcyBpcyB1c2VkIGJ5IGRpc3BhdGNoaW5nIChib3RoIFNPQVBBY3Rpb24tCi0JICogYW5kIFdTQWRkcmVzc2luZy0gYmFzZWQgZGlzcGF0Y2hpbmcpIHRvIGZpZ3VyZSBvdXQgd2hpY2ggb3BlcmF0aW9uIGEKLQkgKiBnaXZlbiBtZXNzYWdlIGlzIGZvci4gU29tZSBub3RlcyBvbiByZXN0cmljdGlvbnMgb2YgImFjdGlvbiIgLSBBIG51bGwgb3IKLQkgKiBlbXB0eSBhY3Rpb24gd2lsbCBiZSBpZ25vcmVkIC0gQW4gYWN0aW9uIHRoYXQgaXMgYSBkdXBsaWNhdGUgYW5kCi0JICogcmVmZXJlbmNlcyBhbiBpZGVudGlhbCBvcGVyYXRpb24gaXMgYWxsb3dlZCAtIEFuIGFjdG9uIHRoYXQgaXMgYQotCSAqIGR1cGxpY2F0ZSBhbmQgcmVmZXJlbmNlcyBhIGRpZmZlcmVudCBvcGVyYXRpb24gaXMgTk9UIGFsbG93ZWQuIEluIHRoaXMKLQkgKiBjYXNlLCB0aGUgYWN0aW9uIGZvciB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIGlzIHJlbW92ZWQgZnJvbSB0aGUgYWxpYXMKLQkgKiB0YWJsZSwgdGh1cyByZW1vdmluZyB0aGUgYWJpbGl0eSB0byByb3V0ZSBiYXNlZCBvbiB0aGlzIGFjdGlvbi4gVGhpcyBpcwotCSAqIG5lY2Vzc2FyeSB0byBwcmV2ZW50IG1pcy1kaXJlY3RpbmcgaW5jb21pbmcgbWVzc2FnZSB0byB0aGUgd3JvbmcKLQkgKiBvcGVyYXRpb24gYmFzZWQgb24gU09BUEFjdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgYW4gYWxpYXMgY291bGQgYmUgYSBTT0FQQWN0aW9uLCBXUy1BZGRyZXNzaW5nIEFjdGlvbiwgdGhlCi0JICogb3BlcmF0aW9uIG5hbWUsIG9yIHNvbWUgb3RoZXIgYWxpYXMuCi0JICogCi0JICogQHNlZSAjZ2V0T3BlcmF0aW9uQnlBY3Rpb24oU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhbGlhcyBrZXkKLQkgKiBAcGFyYW0gYXhpc09wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBtYXAgdG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXBBY3Rpb25Ub09wZXJhdGlvbihTdHJpbmcgYWN0aW9uLCBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsKLQkJaWYgKGFjdGlvbiA9PSBudWxsIHx8ICIiLmVxdWFscyhhY3Rpb24pKSB7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlsb2cKLQkJCQkJCS5kZWJ1ZygibWFwQWN0aW9uVG9PcGVyYXRpb246IEEgbnVsbCBvciBlbXB0eSBhY3Rpb24gY2Fubm90IGJlIHVzZWQgdG8gbWFwIHRvIGFuIG9wZXJhdGlvbi4iKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCWxvZwotCQkJCQkuZGVidWcoIm1hcEFjdGlvblRvT3BlcmF0aW9uOiBNYXBwaW5nIEFjdGlvbiB0byBPcGVyYXRpb246IGFjdGlvbjogIgotCQkJCQkJCSsgYWN0aW9uCi0JCQkJCQkJKyAiOyBvcGVyYXRpb246ICIKLQkJCQkJCQkrIGF4aXNPcGVyYXRpb24KLQkJCQkJCQkrICJuYW1lZDogIiArIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZmxhZ2dlZCBhcyBpbnZhbGlkCi0JCS8vIGJlY2F1c2UgaXQgaXMgYSBkdXBsaWNhdGUuCi0JCWlmIChpbnZhbGlkT3BlcmF0aW9uc0FsaWFzZXMuY29udGFpbnMoYWN0aW9uKSkgewotCQkJLy8gVGhpcyBTT0FQQWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBiZSBpbnZhbGlkOyBsb2cgYQotCQkJLy8gbWVzc2FnZQotCQkJLy8gYW5kIGRvIG5vdCBhZGQgaXQgdG8gdGhlIG9wZXJhdGlvbiBhbGlhcyBtYXAuCi0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlsb2cKLQkJCQkJCS5kZWJ1ZygibWFwQWN0aW9uVG9PcGVyYXRpb246IFRoZSBhY3Rpb246ICIKLQkJCQkJCQkJKyBhY3Rpb24KLQkJCQkJCQkJKyAiIGNhbiBub3QgYmUgdXNlZCBmb3Igb3BlcmF0aW9uOiAiCi0JCQkJCQkJCSsgYXhpc09wZXJhdGlvbgotCQkJCQkJCQkrICIgd2l0aCBvcGVyYXRpb24gbmFtZTogIgotCQkJCQkJCQkrIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpCi0JCQkJCQkJCSsgIiBiZWNhdXNlIHRoYXQgU09BUEFjdGlvbiBpcyBub3QgdW5pcXVlIGZvciB0aGlzIHNlcnZpY2UuIik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGN1cnJlbnRseSBtYXBwaW5nIHRvIGFuIG9wZXJhdGlvbi4KLQkJQXhpc09wZXJhdGlvbiBjdXJyZW50bHlNYXBwZWRPcGVyYXRpb24gPSBnZXRPcGVyYXRpb25CeUFjdGlvbihhY3Rpb24pOwotCQlpZiAoY3VycmVudGx5TWFwcGVkT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCWlmIChjdXJyZW50bHlNYXBwZWRPcGVyYXRpb24gPT0gYXhpc09wZXJhdGlvbikgewotCQkJCS8vIFRoaXMgbWFwcyB0byB0aGUgc2FtZSBvcGVyYXRpb24sIHRoZW4gaXQgaXMgYWxyZWFkeSBpbiB0aGUKLQkJCQkvLyBhbGlhcyB0YWJsZSwgc28KLQkJCQkvLyBqdXN0IHNpbGVudGx5IGlnbm9yZSB0aGlzIG1hcHBpbmcgcmVxdWVzdC4KLQkJCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJbG9nCi0JCQkJCQkJLmRlYnVnKCJtYXBBY3Rpb25Ub09wZXJhdGlvbjogVGhpcyBvcGVyYXRpb24gaXMgYWxyZWFkeSBtYXBwZWQgdG8gdGhpcyBhY3Rpb246ICIKLQkJCQkJCQkJCSsgYWN0aW9uCi0JCQkJCQkJCQkrICI7IEF4aXNPcGVyYXRpb246ICIKLQkJCQkJCQkJCSsgY3VycmVudGx5TWFwcGVkT3BlcmF0aW9uCi0JCQkJCQkJCQkrICIgbmFtZWQ6ICIKLQkJCQkJCQkJCSsgY3VycmVudGx5TWFwcGVkT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGlzIGFjdGlvbiBpcyBhbHJlYWR5IG1hcHBlZCwgYnV0IGl0IGlzIHRvIGEgZGlmZmVyZW50Ci0JCQkJLy8gb3BlcmF0aW9uLiBSZW1vdmUKLQkJCQkvLyB0aGUgYWN0aW9uIG1hcHBpbmcgZnJvbSB0aGUgYWxpYXMgdGFibGUgYW5kIGFkZCBpdCB0byB0aGUKLQkJCQkvLyBsaXN0IG9mIGludmFsaWQgbWFwcGluZ3MKLQkJCQlvcGVyYXRpb25zQWxpYXNlc01hcC5yZW1vdmUoYWN0aW9uKTsKLQkJCQlpbnZhbGlkT3BlcmF0aW9uc0FsaWFzZXMuYWRkKGFjdGlvbik7Ci0JCQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJCWxvZwotCQkJCQkJCS5kZWJ1ZygibWFwQWN0aW9uVG9PcGVyYXRpb246IFRoZSBhY3Rpb24gaXMgYWxyZWFkeSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgIgotCQkJCQkJCQkJKyAib3BlcmF0aW9uLiAgVGhlIG1hcHBpbmcgb2YgdGhlIGFjdGlvbiB0byBhbnkgb3BlcmF0aW9ucyB3aWxsIGJlICIKLQkJCQkJCQkJCSsgInJlbW92ZWQuICBBY3Rpb246ICIKLQkJCQkJCQkJCSsgYWN0aW9uCi0JCQkJCQkJCQkrICI7IG9yaWdpbmFsIG9wZXJhdGlvbjogIgotCQkJCQkJCQkJKyBjdXJyZW50bHlNYXBwZWRPcGVyYXRpb24KLQkJCQkJCQkJCSsgIiBuYW1lZCAiCi0JCQkJCQkJCQkrIGN1cnJlbnRseU1hcHBlZE9wZXJhdGlvbi5nZXROYW1lKCkKLQkJCQkJCQkJCSsgIjsgbmV3IG9wZXJhdGlvbjogIgotCQkJCQkJCQkJKyBheGlzT3BlcmF0aW9uCi0JCQkJCQkJCQkrICIgbmFtZWQgIiArIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvcGVyYXRpb25zQWxpYXNlc01hcC5wdXQoYWN0aW9uLCBheGlzT3BlcmF0aW9uKTsKLQkJCS8vIEFkZGluZyBvcGVyYXRpb24gbmFtZSB0byB0aGUgbWFwcGluZyB0YWJsZQotCQkJLy8gb3BlcmF0aW9uc0FsaWFzZXNNYXAucHV0KGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLAotCQkJLy8gYXhpc09wZXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNYXBzIGFuIGNvbnN0YW50IHN0cmluZyBpbiB0aGUgd2h0dHA6bG9jYXRpb24gdG8gdGhlIGdpdmVuIG9wZXJhdGlvbi4KLQkgKiBUaGlzIGlzIHVzZWQgYnkgUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIgYmFzZWQgZGlzcGF0Y2hpbmcgdG8gZmlndXJlCi0JICogb3V0IHdoaWNoIG9wZXJhdGlvbiBpdCBpcyB0aGF0IGEgZ2l2ZW4gbWVzc2FnZSBpcyBmb3IuCi0JICogCi0JICogQHBhcmFtIHN0cmluZwotCSAqICAgICAgICAgICAgdGhlIGNvbnN0YW50IGRyYXduIGZyb20gd2h0dHA6bG9jYXRpb24KLQkgKiBAcGFyYW0gYXhpc09wZXJhdGlvbgotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBtYXAgdG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIdHRwTG9jYXRpb25EaXNwYXRjaGVyU3RyaW5nKFN0cmluZyBzdHJpbmcsCi0JCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24pIHsKLQkJaHR0cExvY2F0aW9uRGlzcGF0Y2hlck1hcC5wdXQoc3RyaW5nLCBheGlzT3BlcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFNjaGVtYShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlYbWxTY2hlbWEgc2NoZW1hID0gYWRkTmFtZVNwYWNlcyhpKTsKLQkJCXNjaGVtYS53cml0ZShvdXQpOwotCQl9Ci0JfQotCi0JcHVibGljIFhtbFNjaGVtYSBnZXRTY2hlbWEoaW50IGluZGV4KSB7Ci0JCXJldHVybiBhZGROYW1lU3BhY2VzKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxlYXNlIHRoZSBsaXN0IG9mIHNjaGVtYSBvYmplY3RzLiA8cC8+IEluIHNvbWUgZW52aXJvbm1lbnRzLCB0aGlzIGNhbgotCSAqIHByb3ZpZGUgc2lnbmlmaWNhbnQgcmVsaWVmIG9mIG1lbW9yeSBjb25zdW1wdGlvbiBpbiB0aGUgamF2YSBoZWFwLCBhcwotCSAqIGxvbmcgYXMgdGhlIG5lZWQgZm9yIHRoZSBzY2hlbWEgbGlzdCBoYXMgY29tcGxldGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VTY2hlbWFMaXN0KCkgewotCQlpZiAoc2NoZW1hTGlzdCAhPSBudWxsKSB7Ci0JCQkvLyByZWxlYXNlIHRoZSBzY2hlbWEgbGlzdAotCQkJc2NoZW1hTGlzdC5jbGVhcigpOwotCQl9Ci0KLQkJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQlsb2cuZGVidWcoInJlbGVhc2VTY2hlbWFMaXN0OiBzY2hlbWEgbGlzdCBoYXMgYmVlbiByZWxlYXNlZC4iKTsKLQkJfQotCX0KLQotCXByaXZhdGUgWG1sU2NoZW1hIGFkZE5hbWVTcGFjZXMoaW50IGkpIHsKLQkJWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYUxpc3QuZ2V0KGkpOwotCQlOYW1lc3BhY2VNYXAgbWFwID0gKE5hbWVzcGFjZU1hcCkgbmFtZXNwYWNlTWFwLmNsb25lKCk7Ci0JCU5hbWVzcGFjZVByZWZpeExpc3QgbmFtZXNwYWNlQ29udGV4dCA9IHNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0JCVN0cmluZyBwcmVmaXhlc1tdID0gbmFtZXNwYWNlQ29udGV4dC5nZXREZWNsYXJlZFByZWZpeGVzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHJlZml4ZXMubGVuZ3RoOyBqKyspIHsKLQkJCVN0cmluZyBwcmVmaXggPSBwcmVmaXhlc1tqXTsKLQkJCW1hcC5hZGQocHJlZml4LCBuYW1lc3BhY2VDb250ZXh0LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKTsKLQkJfQotCQlzY2hlbWEuc2V0TmFtZXNwYWNlQ29udGV4dChtYXApOwotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVQUnMoU3RyaW5nW10gZXBycykgewotCQl0aGlzLmVwcnMgPSBlcHJzOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRFUFJzKCkgewotCQlpZiAoZXBycyAhPSBudWxsICYmIGVwcnMubGVuZ3RoICE9IDApIHsKLQkJCXJldHVybiBlcHJzOwotCQl9Ci0JCWVwcnMgPSBjYWxjdWxhdGVFUFJzKCk7Ci0JCXJldHVybiBlcHJzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gY2FsY3VsYXRlRVBScygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyByZXF1ZXN0SVAgPSBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHMuZ2V0SXBBZGRyZXNzKGdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotCQkJcmV0dXJuIGNhbGN1bGF0ZUVQUnMocmVxdWVzdElQKTsKLQkJfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGUpIHsKLQkJCWxvZy5lcnJvcigiQ2Fubm90IGdldCBsb2NhbCBJUCBhZGRyZXNzIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYWxjdWxhdGVFUFJzKFN0cmluZyByZXF1ZXN0SVApIHsKLQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChheGlzQ29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGVwckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKGVuYWJsZUFsbFRyYW5zcG9ydHMpIHsKLQkJCWZvciAoSXRlcmF0b3I8VHJhbnNwb3J0SW5EZXNjcmlwdGlvbj4gdHJhbnNwb3J0cyA9IGF4aXNDb25maWcuZ2V0VHJhbnNwb3J0c0luKCkudmFsdWVzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IHRyYW5zcG9ydHMuaGFzTmV4dCgpOykgewotCQkJCVRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSAoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbikgdHJhbnNwb3J0cwotCQkJCQkJLm5leHQoKTsKLQkJCQlUcmFuc3BvcnRMaXN0ZW5lciBsaXN0ZW5lciA9IHRyYW5zcG9ydEluLmdldFJlY2VpdmVyKCk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUVuZHBvaW50UmVmZXJlbmNlW10gZXByc0ZvclNlcnZpY2UgPSBsaXN0ZW5lcgotCQkJCQkJCQkuZ2V0RVBSc0ZvclNlcnZpY2UodGhpcy5uYW1lLCByZXF1ZXN0SVApOwotCQkJCQkJaWYgKGVwcnNGb3JTZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVwcnNGb3JTZXJ2aWNlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlID0gZXByc0ZvclNlcnZpY2VbaV07Ci0JCQkJCQkJCWlmIChlbmRwb2ludFJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgYWRkcmVzcyA9IGVuZHBvaW50UmVmZXJlbmNlCi0JCQkJCQkJCQkJCS5nZXRBZGRyZXNzKCk7Ci0JCQkJCQkJCQlpZiAoYWRkcmVzcyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJZXByTGlzdC5hZGQoYWRkcmVzcyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQkJCQkJCWxvZy53YXJuKGF4aXNGYXVsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTGlzdDxTdHJpbmc+IHRycyA9IHRoaXMuZXhwb3NlZFRyYW5zcG9ydHM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRycy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyB0cnNOYW1lID0gKFN0cmluZykgdHJzLmdldChpKTsKLQkJCQlUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluID0gYXhpc0NvbmZpZwotCQkJCQkJLmdldFRyYW5zcG9ydEluKHRyc05hbWUpOwotCQkJCWlmICh0cmFuc3BvcnRJbiAhPSBudWxsKSB7Ci0JCQkJCVRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gdHJhbnNwb3J0SW4uZ2V0UmVjZWl2ZXIoKTsKLQkJCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJRW5kcG9pbnRSZWZlcmVuY2VbXSBlcHJzRm9yU2VydmljZSA9IGxpc3RlbmVyCi0JCQkJCQkJCQkuZ2V0RVBSc0ZvclNlcnZpY2UodGhpcy5uYW1lLCByZXF1ZXN0SVApOwotCQkJCQkJCWlmIChlcHJzRm9yU2VydmljZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXByc0ZvclNlcnZpY2UubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJCUVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlID0gZXByc0ZvclNlcnZpY2Vbal07Ci0JCQkJCQkJCQlpZiAoZW5kcG9pbnRSZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJCVN0cmluZyBhZGRyZXNzID0gZW5kcG9pbnRSZWZlcmVuY2UKLQkJCQkJCQkJCQkJCS5nZXRBZGRyZXNzKCk7Ci0JCQkJCQkJCQkJaWYgKGFkZHJlc3MgIT0gbnVsbCkgewotCQkJCQkJCQkJCQllcHJMaXN0LmFkZChhZGRyZXNzKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0JCQkJCQkJbG9nLndhcm4oYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZXBycyA9IChTdHJpbmdbXSkgZXByTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbZXByTGlzdC5zaXplKCldKTsKLQkJcmV0dXJuIGVwcnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50RGVmaW5pdGlvbk9iamVjdChEZWZpbml0aW9uIGRlZmluaXRpb24sIE91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcmVxdWVzdElQKSB0aHJvd3MgQXhpc0ZhdWx0LCBXU0RMRXhjZXB0aW9uIHsKLQkJaWYgKGlzTW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcygpKSB7Ci0JCQlzZXRQb3J0QWRkcmVzcyhkZWZpbml0aW9uLCByZXF1ZXN0SVApOwotCQl9Ci0JCWlmICghd3NkbEltcG9ydExvY2F0aW9uQWRqdXN0ZWQpIHsKLQkJCWNoYW5nZUltcG9ydEFuZEluY2x1ZGVMb2NhdGlvbnMoZGVmaW5pdGlvbik7Ci0JCQl3c2RsSW1wb3J0TG9jYXRpb25BZGp1c3RlZCA9IHRydWU7Ci0JCX0KLQkJV1NETFdyaXRlciB3cml0ZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExXcml0ZXIoKTsKLQkJd3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBvdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50VXNlcldTREwoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHdzZGxOYW1lKQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCS8vIGZpcnN0IGZpbmQgdGhlIGNvcnJlY3Qgd3NkbCBkZWZpbml0aW9uCi0JCVBhcmFtZXRlciB3c2RsUGFyYW1ldGVyID0gZ2V0UGFyYW1ldGVyKFdTRExDb25zdGFudHMuV1NETF80X0pfREVGSU5JVElPTik7Ci0JCWlmICh3c2RsUGFyYW1ldGVyICE9IG51bGwpIHsKLQkJCWRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgd3NkbFBhcmFtZXRlci5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwcmludERlZmluaXRpb25PYmplY3QoZ2V0V1NETERlZmluaXRpb24oZGVmaW5pdGlvbiwgd3NkbE5hbWUpLAotCQkJCQkJb3V0LCBudWxsKTsKLQkJCX0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotCQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlwcmludFdTRExFcnJvcihvdXQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBmaW5kIHRoZSBkZWZpbnRpb24gb2JqZWN0IGZvciBnaXZlbiBuYW1lCi0JICogCi0JICogQHBhcmFtIHBhcmVudERlZmluaXRpb24KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gd3NkbCBkZWZpbml0aW9uCi0JICovCi0JcHJpdmF0ZSBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKERlZmluaXRpb24gcGFyZW50RGVmaW5pdGlvbiwKLQkJCVN0cmluZyBuYW1lKSB7Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnREZWZpbml0aW9uOwotCi0JCURlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlciA9IHBhcmVudERlZmluaXRpb24uZ2V0SW1wb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCVZlY3RvciB2YWx1ZXMgPSBudWxsOwotCQlJbXBvcnQgd3NkbEltcG9ydCA9IG51bGw7Ci0JCWZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXZhbHVlcyA9IChWZWN0b3IpIGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXNJdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IHZhbHVlc0l0ZXIuaGFzTmV4dCgpOykgewotCQkJCXdzZGxJbXBvcnQgPSAoSW1wb3J0KSB2YWx1ZXNJdGVyLm5leHQoKTsKLQkJCQlpZiAod3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpLmVuZHNXaXRoKG5hbWUpKSB7Ci0JCQkJCWltcG9ydGVkRGVmaW5pdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpbXBvcnRlZERlZmluaXRpb24gPSBnZXRXU0RMRGVmaW5pdGlvbih3c2RsSW1wb3J0Ci0JCQkJCQkJLmdldERlZmluaXRpb24oKSwgbmFtZSk7Ci0JCQkJfQotCQkJCWlmIChpbXBvcnRlZERlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaW1wb3J0ZWREZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0ZWREZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIHRoaXMgcHJvY2VzZHVlIHJlY3Vyc2l2ZWx5IGFkanVzdCB0aGUgd3NkbCBpbXBvcnRzIGxvY2F0aW9ucyBhbmQgdGhlCi0JICogc2NobWVhIGltcG9ydCBhbmQgaW5jbHVkZSBsb2NhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGRlZmluaXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlSW1wb3J0QW5kSW5jbHVkZUxvY2F0aW9ucyhEZWZpbml0aW9uIGRlZmluaXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIGFkanVzdCB0aGUgc2NoZW1hIGxvY2F0aW9ucyBpbiB0eXBlcyBzZWN0aW9uCi0gICAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIE9iamVjdCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNjaGVtYSkgewotICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSAoU2NoZW1hKSBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlTG9jYXRpb25zKHNjaGVtYS5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBWZWN0b3IgdmFsdWVzID0gbnVsbDsKLSAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3JpZ2luYWxJbXByb3RTdHJpbmcgPSBudWxsOwotICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSAoVmVjdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdmFsdWVzSXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyB2YWx1ZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB3c2RsSW1wb3J0ID0gKEltcG9ydCkgdmFsdWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgb3JpZ2luYWxJbXByb3RTdHJpbmcgPSB3c2RsSW1wb3J0LmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW1wcm90U3RyaW5nLmluZGV4T2YoIjovLyIpID09IC0xICYmIG9yaWdpbmFsSW1wcm90U3RyaW5nLmluZGV4T2YoIj93c2RsPSIpID09IC0xKXsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEltcG9ydC5zZXRMb2NhdGlvblVSSSh0aGlzLmdldFNlcnZpY2VFUFIoKSArICI/d3NkbD0iICsgb3JpZ2luYWxJbXByb3RTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGFuZ2VJbXBvcnRBbmRJbmNsdWRlTG9jYXRpb25zKHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0JLyoqCi0JICogY2hhbmdlIHRoZSBzY2hlbWEgTG9jYXRpb24gaW4gdGhlIGVsZW1tZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VMb2NhdGlvbnMoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgU3RyaW5nIHRhZ05hbWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgdGFnTmFtZSA9IG5vZGVMaXN0Lml0ZW0oaSkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoSU1QT1JUX1RBRy5lcXVhbHModGFnTmFtZSkgfHwgSU5DTFVERV9UQUcuZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0ltcG9ydChub2RlTGlzdC5pdGVtKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTY2hlbWFMb2NhdGlvbihYbWxTY2hlbWEgc2NoZW1hKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbiBpbmNsdWRlcyA9IHNjaGVtYS5nZXRJbmNsdWRlcygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGluY2x1ZGVzLmdldENvdW50KCk7IGorKykgewotICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBpbmNsdWRlcy5nZXRJdGVtKGopOwotICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFFeHRlcm5hbCkgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUV4dGVybmFsIHhtbFNjaGVtYUV4dGVybmFsID0gKFhtbFNjaGVtYUV4dGVybmFsKSBpdGVtOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzID0geG1sU2NoZW1hRXh0ZXJuYWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2NoZW1hTG9jYXRpb24ocywgeG1sU2NoZW1hRXh0ZXJuYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCSAgIAotCXByaXZhdGUgdm9pZCB1cGRhdGVTY2hlbWFMb2NhdGlvbihYbWxTY2hlbWEgcywgWG1sU2NoZW1hRXh0ZXJuYWwgeG1sU2NoZW1hRXh0ZXJuYWwpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSB4bWxTY2hlbWFFeHRlcm5hbC5nZXRTY2hlbWFMb2NhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24uaW5kZXhPZigiOi8vIikgPT0gLTEgJiYgc2NoZW1hTG9jYXRpb24uaW5kZXhPZigiP3hzZD0iKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdzY2hlYW1sb2NhdGlvbiA9IHRoaXMuZ2V0U2VydmljZUVQUigpICsgIj94c2Q9IiArIHNjaGVtYUxvY2F0aW9uOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUV4dGVybmFsLnNldFNjaGVtYUxvY2F0aW9uKG5ld3NjaGVhbWxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQkgICAKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ltcG9ydChOb2RlIGltcG9ydE5vZGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBOb2RlIGF0dHJpYnV0ZTsKLSAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZU1hcC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpLmVxdWFscygic2NoZW1hTG9jYXRpb24iKSkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI6Ly8iKSA9PSAtMSAmJiBhdHRyaWJ1dGVWYWx1ZS5pbmRleE9mKCI/eHNkPSIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5zZXROb2RlVmFsdWUodGhpcy5nZXRTZXJ2aWNlRVBSKCkgKyAiP3hzZD0iICsgYXR0cmlidXRlVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFNlcnZpY2VFUFIoKSB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlRVBSID0gbnVsbDsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHRoaXMuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkdFTkVSQVRFX0FCU09MVVRFX0xPQ0FUSU9OX1VSSVMpOwotICAgICAgICBpZiAoKHBhcmFtZXRlciAhPSBudWxsKSAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShwYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGVwcnMgPSB0aGlzLmdldEVQUnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXBycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICgoZXByc1tpXSAhPSBudWxsKSAmJiAoZXByc1tpXS5zdGFydHNXaXRoKCJodHRwOiIpKSl7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VFUFIgPSBlcHJzW2ldOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZUVQUiA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRVBSID0gZXByc1swXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlcnZpY2VFUFIgPSB0aGlzLm5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlcnZpY2VFUFIuZW5kc1dpdGgoIi8iKSl7Ci0gICAgICAgICAgICBzZXJ2aWNlRVBSID0gc2VydmljZUVQUi5zdWJzdHJpbmcoMCwgc2VydmljZUVQUi5sYXN0SW5kZXhPZigiLyIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZUVQUjsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBQcm9kdWNlcyBhIFhTRCBmb3IgdGhpcyBBeGlzU2VydmljZSBhbmQgcHJpbnRzIGl0IHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBPdXRwdXRTdHJlYW0uCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgZGVzdGluYXRpb24gc3RyZWFtLgotCSAqIEBwYXJhbSB4c2QKLQkgKiAgICAgICAgICAgIHNjaGVtYSBuYW1lCi0JICogQHJldHVybiAtMSBpbXBsaWVzIG5vdCBmb3VuZCwgMCBpbXBsaWVzIHJlZGlyZWN0IHRvIHJvb3QsIDEgaW1wbGllcwotCSAqICAgICAgICAgZm91bmQvcHJpbnRlZCBhIHNjaGVtYQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgaW50IHByaW50WFNEKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyB4c2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJLy8gSWYgd2UgZmluZCBhIFNjaGVtYVN1cHBsaWVyLCB1c2UgdGhhdAotCQlTY2hlbWFTdXBwbGllciBzdXBwbGllciA9IChTY2hlbWFTdXBwbGllcikgZ2V0UGFyYW1ldGVyVmFsdWUoIlNjaGVtYVN1cHBsaWVyIik7Ci0JCWlmIChzdXBwbGllciAhPSBudWxsKSB7Ci0JCQlYbWxTY2hlbWEgc2NoZW1hID0gc3VwcGxpZXIuZ2V0U2NoZW1hKHRoaXMsIHhzZCk7Ci0JCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCSAgICB1cGRhdGVTY2hlbWFMb2NhdGlvbihzY2hlbWEpOwotCQkJCXNjaGVtYS53cml0ZShuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKSk7Ci0JCQkJb3V0LmZsdXNoKCk7Ci0JCQkJb3V0LmNsb3NlKCk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjYWxsIHRoZSBwb3B1bGF0b3IKLQkJcG9wdWxhdGVTY2hlbWFNYXBwaW5ncygpOwotCQlNYXAgc2NoZW1hTWFwcGluZ3RhYmxlID0gZ2V0U2NoZW1hTWFwcGluZ1RhYmxlKCk7Ci0JCUFycmF5TGlzdDxYbWxTY2hlbWE+IHNjaGVtYXMgPSBnZXRTY2hlbWEoKTsKLQotCQkvLyBhIG5hbWUgaXMgcHJlc2VudCAtIHRyeSB0byBwdW1wIHRoZSByZXF1ZXN0ZWQgc2NoZW1hCi0JCWlmICghIiIuZXF1YWxzKHhzZCkpIHsKLQkJCVhtbFNjaGVtYSBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXBwaW5ndGFibGUuZ2V0KHhzZCk7Ci0JCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCQlpbnQgZG90SW5kZXggPSB4c2QuaW5kZXhPZignLicpOwotCQkJCWlmIChkb3RJbmRleCA+IDApIHsKLQkJCQkJU3RyaW5nIHNjaGVtYUtleSA9IHhzZC5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwotCQkJCQlzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXBwaW5ndGFibGUuZ2V0KHNjaGVtYUtleSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJLy8gc2NoZW1hIGlzIHRoZXJlIC0gcHVtcCBpdCBvdXRzCi0JCQkJc2NoZW1hLndyaXRlKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGOCIpKTsKLQkJCQlvdXQuZmx1c2goKTsKLQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBvbmx5IHNlcnZpbmcgLnhzZCBmaWxlcyBhbmQgaWdub3JlIHJlcXVlc3RzIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiLi4iIGluIHRoZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4c2QuZW5kc1dpdGgoIi54c2QiKSAmJiB4c2QuaW5kZXhPZigiLi4iKSA9PSAtMSkgewotCQkJCUlucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAotCQkJCQkJRGVwbG95bWVudENvbnN0YW50cy5NRVRBX0lORiArICIvIiArIHhzZCk7Ci0JCQkJaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPVXRpbHMuY29weShpbiwgb3V0LCB0cnVlKTsKLQkJCQl9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZmluZCB0aGUgc2NoZW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCBzY2hlbWEgcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJfQotCQl9IGVsc2UgaWYgKHNjaGVtYXMuc2l6ZSgpID4gMSkgewotCQkJLy8gbXVsdGlwbGUgc2NoZW1hcyBhcmUgcHJlc2VudCBhbmQgdGhlIHVzZXIgc3BlY2lmaWVkCi0JCQkvLyBubyBuYW1lIC0gaW4gdGhpcyBjYXNlIHdlIGNhbm5vdCBwb3NzaWJseSBwdW1wIGEgc2NoZW1hCi0JCQkvLyBzbyByZWRpcmVjdCB0byB0aGUgc2VydmljZSByb290Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCS8vIHVzZXIgc3BlY2lmaWVkIG5vIG5hbWUgYW5kIHRoZXJlIGlzIG9ubHkgb25lIHNjaGVtYQotCQkJLy8gc28gcHVtcCB0aGF0IG91dAotCQkJQXJyYXlMaXN0PFhtbFNjaGVtYT4gbGlzdCA9IGdldFNjaGVtYSgpOwotCQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJCVhtbFNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoMCk7Ci0JCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJCXNjaGVtYS53cml0ZShuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKSk7Ci0JCQkJCW91dC5mbHVzaCgpOwotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyB4c2ROb3RGb3VuZCA9ICI8ZXJyb3I+IgotCQkJCQkJKyAiPGRlc2NyaXB0aW9uPlVuYWJsZSB0byBhY2Nlc3Mgc2NoZW1hIGZvciB0aGlzIHNlcnZpY2U8L2Rlc2NyaXB0aW9uPiIKLQkJCQkJCSsgIjwvZXJyb3I+IjsKLQkJCQlvdXQud3JpdGUoeHNkTm90Rm91bmQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJb3V0LmZsdXNoKCk7Ci0JCQkJb3V0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogUHJvZHVjZXMgYSBXU0RMIGZvciB0aGlzIEF4aXNTZXJ2aWNlIGFuZCBwcmludHMgaXQgdG8gdGhlIHNwZWNpZmllZAotCSAqIE91dHB1dFN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBkZXN0aW5hdGlvbiBzdHJlYW0uIFRoZSBXU0RMIHdpbGwgYmUgc2VudCBoZXJlLgotCSAqIEBwYXJhbSByZXF1ZXN0SVAKLQkgKiAgICAgICAgICAgIHRoZSBob3N0bmFtZSB0aGUgV1NETCByZXF1ZXN0IHdhcyBkaXJlY3RlZCBhdC4gVGhpcyBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIHRoZSBhZGRyZXNzIHRoYXQgYXBwZWFycyBpbiB0aGUgZ2VuZXJhdGVkIFdTREwuCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFdTREwoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHJlcXVlc3RJUCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCS8vIElmIHdlJ3JlIGxvb2tpbmcgZm9yIHByZS1leGlzdGluZyBXU0RMLCB1c2UgdGhhdC4KLQkJaWYgKGlzVXNlVXNlcldTREwoKSkgewotCQkJcHJpbnRVc2VyV1NETChvdXQsIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gSWYgd2UgZmluZCBhIFdTRExTdXBwbGllciwgdXNlIHRoYXQKLQkJV1NETFN1cHBsaWVyIHN1cHBsaWVyID0gKFdTRExTdXBwbGllcikgZ2V0UGFyYW1ldGVyVmFsdWUoIldTRExTdXBwbGllciIpOwotCQlpZiAoc3VwcGxpZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBzdXBwbGllci5nZXRXU0RMKHRoaXMpOwotCQkJCWlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCQkgICAgY2hhbmdlSW1wb3J0QW5kSW5jbHVkZUxvY2F0aW9ucyhkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnREZWZpbml0aW9uT2JqZWN0KGdldFdTRExEZWZpbml0aW9uKGRlZmluaXRpb24sIG51bGwpLAotCQkJCQkJCW91dCwgcmVxdWVzdElQKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXByaW50V1NETEVycm9yKG91dCwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UsIGdlbmVyYXRlIFdTREwgb3Vyc2VsdmVzCi0JCVN0cmluZ1tdIGVwckFycmF5ID0gcmVxdWVzdElQID09IG51bGwgPyBuZXcgU3RyaW5nW10geyB0aGlzLmVuZHBvaW50TmFtZSB9Ci0JCQkJOiBjYWxjdWxhdGVFUFJzKHJlcXVlc3RJUCk7Ci0JCWdldFdTREwob3V0LCBlcHJBcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIFdTREwgd2l0aCBhIGRlZmF1bHQgVVJMLiBUaGlzIHdpbGwgYmUgY2FsbGVkIG9ubHkgZHVyaW5nCi0JICogY29kZWdlbiB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBvdXQKLQkgKiBAdGhyb3dzIEF4aXNGYXVsdAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50V1NETChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJcHJpbnRXU0RMKG91dCwgbnVsbCk7Ci0JfQotCi0gICAgICAgIHByaXZhdGUgQXhpc0VuZHBvaW50IGdldEF4aXNFbmRwb2ludChTdHJpbmcgcG9ydCkgewotICAgICAgICAgICAgLy8gaWYgc2VydmljZSBoYXMgYSBzaW5nbGUgZW5kcG9pbnQsIHRoaXMgd2lsbCBjYXVzZSB0aGUgW3NlcnZpY2VOYW1lXSBhZGRyZXNzCi0gICAgICAgICAgICAvLyB0byBiZSB1c2VkIGluIHdzZGwgaW5zdGVhZCBvZiB0aGUgW3NlcnZpY2VOYW1lXS5bZW5kcG9pbnROYW1lXQotICAgICAgICAgICAgaWYgKGVuZHBvaW50TWFwLnNpemUoKSA9PSAxICYmIGVuZHBvaW50TWFwLmNvbnRhaW5zS2V5KGdldEVuZHBvaW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEF4aXNFbmRwb2ludCllbmRwb2ludE1hcC5nZXQocG9ydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCXByaXZhdGUgdm9pZCBzZXRQb3J0QWRkcmVzcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyByZXF1ZXN0SVApCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJSXRlcmF0b3Igc2VydmljZUl0ciA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoc2VydmljZUl0ci5oYXNOZXh0KCkpIHsKLQkJCVNlcnZpY2Ugc2VydmljZUVsZW1lbnQgPSAoU2VydmljZSkgc2VydmljZUl0ci5uZXh0KCk7Ci0JCQlJdGVyYXRvciBwb3J0SXRyID0gc2VydmljZUVsZW1lbnQuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHBvcnRJdHIuaGFzTmV4dCgpKSB7Ci0JCQkJUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRJdHIubmV4dCgpOwotCQkJCUF4aXNFbmRwb2ludCBlbmRwb2ludCA9IGdldEF4aXNFbmRwb2ludChwb3J0LmdldE5hbWUoKSk7Ci0JCQkJTGlzdCBsaXN0ID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IGV4dGVuc2liaWxpdHlFbGUgPSBsaXN0LmdldChpKTsKLQkJCQkJaWYgKGV4dGVuc2liaWxpdHlFbGUgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotCQkJCQkJU09BUEFkZHJlc3Mgc29hcEFkZHJlc3MgPSAoU09BUEFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGU7Ci0JCQkJCQlTdHJpbmcgZXhpc3RpbmdBZGRyZXNzID0gc29hcEFkZHJlc3MuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCWlmIChleGlzdGluZ0FkZHJlc3MgPT0gbnVsbAotCQkJCQkJCQl8fCBleGlzdGluZ0FkZHJlc3MKLQkJCQkJCQkJCQkuZXF1YWxzKCJSRVBMQUNFX1dJVEhfQUNUVUFMX1VSTCIpKSB7Ci0JCQkJCQkJaWYgKGVuZHBvaW50ICE9IG51bGwpIHsKLQkJCQkJCQkJKChTT0FQQWRkcmVzcykgZXh0ZW5zaWJpbGl0eUVsZSkKLQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZW5kcG9pbnQKLQkJCQkJCQkJCQkJCS5jYWxjdWxhdGVFbmRwb2ludFVSTCgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCS5zZXRMb2NhdGlvblVSSShnZXRFUFJzKClbMF0pOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKHJlcXVlc3RJUCA9PSBudWxsKSB7Ci0JCQkJCQkJCWlmIChlbmRwb2ludCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZW5kcG9pbnQKLQkJCQkJCQkJCQkJCQkuY2FsY3VsYXRlRW5kcG9pbnRVUkwoKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZ2V0TG9jYXRpb25VUkkoCi0JCQkJCQkJCQkJCQkJZ2V0RVBScygpLCBleGlzdGluZ0FkZHJlc3MpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChlbmRwb2ludCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZW5kcG9pbnQKLQkJCQkJCQkJCQkJCQkuY2FsY3VsYXRlRW5kcG9pbnRVUkwoKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZ2V0TG9jYXRpb25VUkkoCi0JCQkJCQkJCQkJCQkJY2FsY3VsYXRlRVBScyhyZXF1ZXN0SVApLAotCQkJCQkJCQkJCQkJCWV4aXN0aW5nQWRkcmVzcykpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGUgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0JCQkJCQlTT0FQMTJBZGRyZXNzIHNvYXBBZGRyZXNzID0gKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGU7Ci0JCQkJCQlTdHJpbmcgZXhzaXN0aW5nQWRkcmVzcyA9IHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCk7Ci0JCQkJCQlpZiAocmVxdWVzdElQID09IG51bGwpIHsKLQkJCQkJCQlpZiAoZW5kcG9pbnQgIT0gbnVsbCkgewotCQkJCQkJCQkoKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGUpCi0JCQkJCQkJCQkJLnNldExvY2F0aW9uVVJJKGVuZHBvaW50Ci0JCQkJCQkJCQkJCQkuY2FsY3VsYXRlRW5kcG9pbnRVUkwoKSk7Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkoKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGUpCi0JCQkJCQkJCQkJLnNldExvY2F0aW9uVVJJKGdldExvY2F0aW9uVVJJKAotCQkJCQkJCQkJCQkJZ2V0RVBScygpLCBleHNpc3RpbmdBZGRyZXNzKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoZW5kcG9pbnQgIT0gbnVsbCkgewotCQkJCQkJCQkoKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGUpCi0JCQkJCQkJCQkJLnNldExvY2F0aW9uVVJJKGVuZHBvaW50Ci0JCQkJCQkJCQkJCQkuY2FsY3VsYXRlRW5kcG9pbnRVUkwoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCS5zZXRMb2NhdGlvblVSSShnZXRMb2NhdGlvblVSSSgKLQkJCQkJCQkJCQkJCWNhbGN1bGF0ZUVQUnMocmVxdWVzdElQKSwKLQkJCQkJCQkJCQkJCWV4c2lzdGluZ0FkZHJlc3MpKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlIGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLQkJCQkJCUhUVFBBZGRyZXNzIGh0dHBBZGRyZXNzID0gKEhUVFBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlOwotCQkJCQkJU3RyaW5nIGV4c2lzdGluZ0FkZHJlc3MgPSBodHRwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpOwotCQkJCQkJaWYgKHJlcXVlc3RJUCA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKGVuZHBvaW50ICE9IG51bGwpIHsKLQkJCQkJCQkJKChIVFRQQWRkcmVzcykgZXh0ZW5zaWJpbGl0eUVsZSkKLQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZW5kcG9pbnQKLQkJCQkJCQkJCQkJCS5jYWxjdWxhdGVFbmRwb2ludFVSTCgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkoKEhUVFBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCS5zZXRMb2NhdGlvblVSSShnZXRMb2NhdGlvblVSSSgKLQkJCQkJCQkJCQkJCWdldEVQUnMoKSwgZXhzaXN0aW5nQWRkcmVzcykpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKGVuZHBvaW50ICE9IG51bGwpIHsKLQkJCQkJCQkJKChIVFRQQWRkcmVzcykgZXh0ZW5zaWJpbGl0eUVsZSkKLQkJCQkJCQkJCQkuc2V0TG9jYXRpb25VUkkoZW5kcG9pbnQKLQkJCQkJCQkJCQkJCS5jYWxjdWxhdGVFbmRwb2ludFVSTCgpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkoKEhUVFBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlKQotCQkJCQkJCQkJCS5zZXRMb2NhdGlvblVSSShnZXRMb2NhdGlvblVSSSgKLQkJCQkJCQkJCQkJCWNhbGN1bGF0ZUVQUnMocmVxdWVzdElQKSwKLQkJCQkJCQkJCQkJCWV4c2lzdGluZ0FkZHJlc3MpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gVE9ETyA6IGNoYW5nZSB0aGUgRW5kcG9pbnQgcmVmcmVuY2UgYWRkZXNzIGFzIHdlbGwuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3IElQIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUgYWxyZWFkeQotCSAqIGV4aXN0aW5nIGlwCi0JICogCi0JICogQHBhcmFtIGVwcnMKLQkgKiBAcGFyYW0gZXByCi0JICogQHJldHVybiBjb3JyZXNwb25kaW5nIElwIGFkZHJlc3MKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvblVSSShTdHJpbmdbXSBlcHJzLCBTdHJpbmcgZXByKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJU3RyaW5nIHJldHVybklQID0gbnVsbDsKLQkJaWYgKGVwciAhPSBudWxsKSB7Ci0JCQlpZiAoZXByLmluZGV4T2YoIjoiKSA+IC0xKSB7Ci0JCQkJU3RyaW5nIGV4aXN0aW5nUHJvdG9jb2wgPSBlcHIuc3Vic3RyaW5nKDAsIGVwci5pbmRleE9mKCI6IikpCi0JCQkJCQkudHJpbSgpOwotCQkJCVN0cmluZyBlcHJQcm90b2NvbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVwcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZXByUHJvdG9jb2wgPSBlcHJzW2ldLnN1YnN0cmluZygwLCBlcHJzW2ldLmluZGV4T2YoIjoiKSkKLQkJCQkJCQkudHJpbSgpOwotCQkJCQlpZiAoZXByUHJvdG9jb2wuZXF1YWxzKGV4aXN0aW5nUHJvdG9jb2wpKSB7Ci0JCQkJCQlyZXR1cm5JUCA9IGVwcnNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmV0dXJuSVAgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcmV0dXJuSVA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IEF4aXNGYXVsdCgKLQkJCQkJCQkiU2VydmVyIGRvZXMgbm90IGhhdmUgYW4gZXByIGZvciB0aGUgd3NkbCBlcHI9PT4iCi0JCQkJCQkJCQkrIGVwcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgQXhpc0ZhdWx0KCJpbnZhbGlkIGVwciBpcyBnaXZlbiBlcHIgPT0+ICIgKyBlcHIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gZXByIGlzIGdpdmVuIGluIHRoZSB3c2RsIHBvcnQiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRXU0RMKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZ1tdIHNlcnZpY2VVUkwpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJLy8gUmV0cmlldmUgV1NETCB1c2luZyB0aGUgc2FtZSBkYXRhIHJldHJpZXZhbCBwYXRoIGZvciBHZXRNZXRhZGF0YQotCQkvLyByZXF1ZXN0LgotCQlEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0ID0gbmV3IERhdGFSZXRyaWV2YWxSZXF1ZXN0KCk7Ci0JCXJlcXVlc3QucHV0RGlhbGVjdChEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9XU0RMKTsKLQkJcmVxdWVzdC5wdXRPdXRwdXRGb3JtKE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pOwotCi0JCU1lc3NhZ2VDb250ZXh0IGNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLQkJY29udGV4dC5zZXRBeGlzU2VydmljZSh0aGlzKTsKLQkJY29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2Uoc2VydmljZVVSTFswXSkpOwotCi0JCURhdGFbXSByZXN1bHQgPSBnZXREYXRhKHJlcXVlc3QsIGNvbnRleHQpOwotCQlPTUVsZW1lbnQgd3NkbEVsZW1lbnQ7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkgewotCQkJd3NkbEVsZW1lbnQgPSAoT01FbGVtZW50KSAocmVzdWx0WzBdLmdldERhdGEoKSk7Ci0JCQl0cnkgewotCQkJCVhNTFByZXR0eVByaW50ZXIucHJldHRpZnkod3NkbEVsZW1lbnQsIG91dCk7Ci0JCQkJb3V0LmZsdXNoKCk7Ci0JCQkJb3V0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRXU0RMRXJyb3IoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXByaW50V1NETEVycm9yKG91dCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50V1NETEVycm9yKE91dHB1dFN0cmVhbSBvdXQsIEV4Y2VwdGlvbiBlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB3c2RsbnRmb3VuZCA9ICI8ZXJyb3I+IgotCQkJCQkrICI8ZGVzY3JpcHRpb24+VW5hYmxlIHRvIGdlbmVyYXRlIFdTREwgMS4xIGZvciB0aGlzIHNlcnZpY2U8L2Rlc2NyaXB0aW9uPiIKLQkJCQkJKyAiPHJlYXNvbj5JZiB5b3Ugd2lzaCBBeGlzMiB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBXU0RMIDEuMSwgdGhlbiBwbGVhc2UgIgotCQkJCQkrICJzZXQgdXNlT3JpZ2luYWx3c2RsIGFzIGZhbHNlIGluIHlvdXIgc2VydmljZXMueG1sPC9yZWFzb24+IjsKLQkJCW91dC53cml0ZSh3c2RsbnRmb3VuZC5nZXRCeXRlcygpKTsKLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihvdXQpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKHB3KTsKLQkJCQlwdy5mbHVzaCgpOwotCQkJfQotCQkJb3V0LndyaXRlKCI8L2Vycm9yPiIuZ2V0Qnl0ZXMoKSk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgV1NETDIuMCB3aXRoIGEgZGVmYXVsdCBVUkwuIFRoaXMgd2lsbCBiZSBjYWxsZWQgb25seSBkdXJpbmcKLQkgKiBjb2RlZ2VuIHRpbWUuCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0JICovCi0JcHVibGljIHZvaWQgcHJpbnRXU0RMMihPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJcHJpbnRXU0RMMihvdXQsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50V1NETDIoT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIHJlcXVlc3RJUCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUF4aXNTZXJ2aWNlMldTREwyMCBheGlzU2VydmljZTJXU0RMMiA9IG5ldyBBeGlzU2VydmljZTJXU0RMMjAodGhpcyk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVxdWVzdElQICE9IG51bGwpIHsKLQkJCQlheGlzU2VydmljZTJXU0RMMi5zZXRFUFJzKGNhbGN1bGF0ZUVQUnMocmVxdWVzdElQKSk7Ci0JCQl9Ci0JCQlPTUVsZW1lbnQgd3NkbEVsZW1lbnQgPSBheGlzU2VydmljZTJXU0RMMi5nZW5lcmF0ZU9NKCk7Ci0JCQl3c2RsRWxlbWVudC5zZXJpYWxpemUob3V0KTsKLQkJCW91dC5mbHVzaCgpOwotCQkJb3V0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCQl9Ci0JfQotCi0gICAgLyoqCi0gICAgICogUHJvZHVjZXMgYSBXU0RMMiBmb3IgdGhpcyBBeGlzU2VydmljZSBhbmQgcHJpbnRzIGl0IHRvIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBPdXRwdXRTdHJlYW0uCi0gICAgICogCi0gICAgICogQHBhcmFtIG91dAotICAgICAqICAgICAgICAgICAgZGVzdGluYXRpb24gc3RyZWFtLgotICAgICAqIEBwYXJhbSB3c2RsCi0gICAgICogICAgICAgICAgICB3c2RsIG5hbWUKLSAgICAgKiBAcmV0dXJuIC0xIGltcGxpZXMgbm90IGZvdW5kLCAwIGltcGxpZXMgcmVkaXJlY3QgdG8gcm9vdCwgMSBpbXBsaWVzCi0gICAgICogICAgICAgICBmb3VuZC9wcmludGVkIHdzZGwKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIGludCBwcmludFdTREwyKE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyByZXF1ZXN0SVAsIFN0cmluZyB3c2RsKSAKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBeGlzRmF1bHQgeyAgICAKLSAgICAgICAgLy8gYSBuYW1lIGlzIHByZXNlbnQgLSB0cnkgdG8gcHVtcCB0aGUgcmVxdWVzdGVkIHdzZGwgZmlsZQotICAgICAgICBpZiAoISIiLmVxdWFscyh3c2RsKSkgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGFyZSBvbmx5IHNlcnZpbmcgLndzZGwgZmlsZXMgYW5kIGlnbm9yZSByZXF1ZXN0cyB3aXRoCi0gICAgICAgICAgICAvLyAiLi4iIGluIHRoZSBuYW1lLgotICAgICAgICAgICAgaWYgKHdzZGwuZW5kc1dpdGgoIi53c2RsIikgJiYgd3NkbC5pbmRleE9mKCIuLiIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50Q29uc3RhbnRzLk1FVEFfSU5GICsgIi8iICsgd3NkbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KGluLCBvdXQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGZpbmQgdGhlIHdzZGwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gYmFkIHdzZGwyIHJlcXVlc3QKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludFdTREwyKG91dCwgcmVxdWVzdElQKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIEdldHMgdGhlIGRlc2NyaXB0aW9uIGFib3V0IHRoZSBzZXJ2aWNlIHdoaWNoIGlzIHNwZWNpZmllZCBpbgotCSAqIHNlcnZpY2VzLnhtbC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXREb2N1bWVudGF0aW9uKCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRDbGFzc0xvYWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgQ2xhc3NMb2FkZXIuCi0JICovCi0JcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gdGhpcy5zZXJ2aWNlQ2xhc3NMb2FkZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udHJvbCBvcGVyYXRpb24gd2hpY2ggYXJlIGFkZGVkIGJ5IG1vZHVsZSBsaWtlIFJNLgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3Q8QXhpc09wZXJhdGlvbj4gZ2V0Q29udHJvbE9wZXJhdGlvbnMoKSB7Ci0JCUl0ZXJhdG9yPEF4aXNPcGVyYXRpb24+IG9wX2l0ciA9IGdldE9wZXJhdGlvbnMoKTsKLQkJQXJyYXlMaXN0PEF4aXNPcGVyYXRpb24+IG9wZXJhdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNPcGVyYXRpb24+KCk7Ci0KLQkJd2hpbGUgKG9wX2l0ci5oYXNOZXh0KCkpIHsKLQkJCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wX2l0ci5uZXh0KCk7Ci0KLQkJCWlmIChvcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLQkJCQlvcGVyYXRpb25MaXN0LmFkZChvcGVyYXRpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9wZXJhdGlvbkxpc3Q7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgZ2V0TGFzdFVwZGF0ZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRMYXN0dXBkYXRlKCkgewotCQlyZXR1cm4gbGFzdHVwZGF0ZTsKLQl9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRMYXN0VXBkYXRlKCkgewotICAgICAgICByZXR1cm4gbGFzdHVwZGF0ZTsKLSAgICB9Ci0KLQlwdWJsaWMgTW9kdWxlQ29uZmlndXJhdGlvbiBnZXRNb2R1bGVDb25maWcoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLQkJcmV0dXJuIChNb2R1bGVDb25maWd1cmF0aW9uKSBtb2R1bGVDb25maWdtYXAuZ2V0KG1vZHVsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiBnZXRNb2R1bGVzKCkgewotCQlyZXR1cm4gbW9kdWxlUmVmczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRPcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbk5hbWUKLQkgKiBAcmV0dXJuIFJldHVybnMgQXhpc09wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQXhpc09wZXJhdGlvbiBnZXRPcGVyYXRpb24oUU5hbWUgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2V0IG9wZXJhdGlvbiBmb3IgIiArIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgIAotCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgZ2V0Q2hpbGQob3BlcmF0aW9uTmFtZSk7Ci0JCQotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGdldENoaWxkKG5ldyBRTmFtZSgKLQkJCQkJZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG9wZXJhdGlvbk5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUYXJnZXQgbmFtZXNwYWNlOiAiICsgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQl9Ci0gICAgICAgIAotCQlpZiAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnNBbGlhc2VzTWFwCi0JCQkJCS5nZXQob3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3BlcmF0aW9ucyBhbGlhc2VzIG1hcDogIiArIG9wZXJhdGlvbnNBbGlhc2VzTWFwKTsKLQkJfQotICAgICAgICAKLSAgICAgICAgLy9UaGUgb3BlcmF0aW9uIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lc3BhY2Ugb3RoZXIgdGhhbiB0aGUKLSAgICAgICAgLy90YXJnZXQgbmFtZXNwYWNlLCBlLmcuIGlmIHRoZSBvcGVyYXRpb24gaXMgZnJvbSBhbiBpbXBvcnRlZCB3c2RsLgotICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0IG5hbWVzcGFjZXMgPSBnZXRJbXBvcnRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJbXBvcnRlZCBuYW1lc3BhY2VzOiAiICsgbmFtZXNwYWNlcyk7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgZ2V0Q2hpbGQobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgb3BlcmF0aW9uTmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBheGlzIG9wZXJhdGlvbjogICIgKyBheGlzT3BlcmF0aW9uKTsKLQotCQlyZXR1cm4gYXhpc09wZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBBeGlzT3BlcmF0aW9uIHdoaWNoIGhhcyBiZWVuIG1hcHBlZCB0byB0aGUgZ2l2ZW4gYWxpYXMuCi0JICogCi0JICogQHNlZSAjbWFwQWN0aW9uVG9PcGVyYXRpb24oU3RyaW5nLCBBeGlzT3BlcmF0aW9uKQotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBhbGlhcyBrZXkKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgQXhpc09wZXJhdGlvbiBvciBudWxsIGlmIGl0IGlzbid0Ci0JICogICAgICAgICBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgQXhpc09wZXJhdGlvbiBnZXRPcGVyYXRpb25CeUFjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0JCXJldHVybiAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9uc0FsaWFzZXNNYXAuZ2V0KGFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3BlcmF0aW9uIGdpdmVuIGEgU09BUCBBY3Rpb24uIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQKLQkgKiBpZiBvbmx5IG9uZSBFbmRwb2ludCBpcyBkZWZpbmVkIGZvciB0aGlzIFNlcnZpY2UuIElmIG1vcmUgdGhhbiBvbmUKLQkgKiBFbmRwb2ludCBleGlzdHMsIG9uZSBvZiB0aGVtIHdpbGwgYmUgcGlja2VkLiBJZiBtb3JlIHRoYW4gb25lIE9wZXJhdGlvbgotCSAqIGlzIGZvdW5kIHdpdGggdGhlIGdpdmVuIFNPQVAgQWN0aW9uOyBudWxsIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vCi0JICogcGFydGljdWxhciBPcGVyYXRpb24gaXMgZm91bmQgd2l0aCB0aGUgZ2l2ZW4gU09BUCBBY3Rpb247IG51bGwgd2lsbCBiZQotCSAqIHJldHVybmVkLiBJZiB0aGUgYWN0aW9uIGlzIGluIHRoZSBsaXN0IG9mIGludmFsaWFkIGFsaWFzZXMsIHdoaWNoIG1lYW5zCi0JICogaXQgZGlkIG5vdCB1bmlxdWVseSBpZGVudGlmeSBhbiBvcGVyYXRpb24sIGEgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBzb2FwQWN0aW9uCi0JICogICAgICAgICAgICBTT0FQIEFjdGlvbiBkZWZpbmVkIGZvciB0aGUgcGFydGljdWxhciBPcGVyYXRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgYW4gQXhpc09wZXJhdGlvbiBpZiBhIHVuaXF1ZSBPcGVyYXRpb24gY2FuIGJlIGZvdW5kIHdpdGgKLQkgKiAgICAgICAgIHRoZSBnaXZlbiBTT0FQIEFjdGlvbiBvdGhlcndpc2Ugd2lsbCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgQXhpc09wZXJhdGlvbiBnZXRPcGVyYXRpb25CeVNPQVBBY3Rpb24oU3RyaW5nIHNvYXBBY3Rpb24pIHsKLQotCQkvLyBDaGVjayBmb3IgaWxsZWdhbCBzb2FwQWN0aW9ucwotCQlpZiAoKHNvYXBBY3Rpb24gPT0gbnVsbCkgfHwgc29hcEFjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlsb2cuZGVidWcoImdldE9wZXJhdGlvbkJ5U09BUEFjdGlvbjogIiArIHNvYXBBY3Rpb24KLQkJCQkJCSsgIiBpcyBudWxsIG9yICcnLiBSZXR1cm5pbmcgbnVsbC4iKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gSWYgdGhlIGFjdGlvbiBtYXBzIHRvIGFuIGFsYWlzIHRoYXQgaXMgbm90IHVuaXF1ZSwgdGhlbiBpdCBjYW4ndCBiZQotCQkvLyB1c2VkIHRvIG1hcCB0bwotCQkvLyBhbiBvcGVyYXRpb24uCi0JCWlmIChpbnZhbGlkT3BlcmF0aW9uc0FsaWFzZXMuY29udGFpbnMoc29hcEFjdGlvbikpIHsKLQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCWxvZy5kZWJ1ZygiZ2V0T3BlcmF0aW9uQnlTT0FQQWN0aW9uOiAiICsgc29hcEFjdGlvbgotCQkJCQkJKyAiIGlzIGFuIGludmFsaWQgb3BlcmF0aW9uIGFsaWFzLiBSZXR1cm5pbmcgbnVsbC4iKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSBvcGVyYXRpb24gZnJvbSB0aGUgYWN0aW9uLT5vcGVyYXRpb24gbWFwCi0JCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnNBbGlhc2VzTWFwCi0JCQkJLmdldChzb2FwQWN0aW9uKTsKLQotCQlpZiAob3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJCWxvZy5kZWJ1ZygiZ2V0T3BlcmF0aW9uQnlTT0FQQWN0aW9uOiBPcGVyYXRpb24gKCIgKyBvcGVyYXRpb24KLQkJCQkJCSsgIiwiICsgb3BlcmF0aW9uLmdldE5hbWUoKSArICIpIGZvciBzb2FwQWN0aW9uOiAiCi0JCQkJCQkrIHNvYXBBY3Rpb24gKyAiIGZvdW5kIGluIGFjdGlvbiBtYXAuIik7Ci0JCQl9Ci0JCQlyZXR1cm4gb3BlcmF0aW9uOwotCQl9Ci0KLQkJLy8gVGhlIGZpbmFsIGZhbGxiYWNrIGlzIHRvIGNoZWNrIHRoZSBvcGVyYXRpb25zIGZvciBhIG1hdGNoaW5nIG5hbWUuCi0KLQkJSXRlcmF0b3IgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkvLyBJIGNvdWxkIG5vdCBmaW5kIGFueSBzcGVjIHN0YXRlbWVudCB0aGF0IGV4cGxpY2l0bHkgZm9yYmlkcyB1c2luZyBhCi0JCS8vIHNob3J0IG5hbWUgaW4gdGhlIFNPQVBBY3Rpb24gaGVhZGVyIG9yIHdzYTpBY3Rpb24gZWxlbWVudCwKLQkJLy8gc28gSSBiZWxpZXZlIHRoaXMgdG8gYmUgdmFsaWQuIFRoZXJlIG1heSBiZSBjdXN0b21lcnMgdXNpbmcgdGhlCi0JCS8vIHNob3J0bmFtZSBhcyB0aGUgU09BUEFjdGlvbiBpbiB0aGVpciBjbGllbnQgY29kZSB0aGF0IHdvdWxkCi0JCS8vIGFsc28gcmVxdWlyZSB0aGlzIHN1cHBvcnQuCi0JCXdoaWxlIChjaGlsZHJlbi5oYXNOZXh0KCkgJiYgKG9wZXJhdGlvbiA9PSBudWxsKSkgewotCQkJQXhpc09wZXJhdGlvbiBvcCA9IChBeGlzT3BlcmF0aW9uKSBjaGlsZHJlbi5uZXh0KCk7Ci0JCQlpZiAob3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLmVxdWFscyhzb2FwQWN0aW9uKSkgewotCQkJCW9wZXJhdGlvbiA9IG9wOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlsb2cuZGVidWcoImdldE9wZXJhdGlvbkJ5U09BUEFjdGlvbjogT3BlcmF0aW9uICgiICsgb3BlcmF0aW9uCi0JCQkJCQkrICIsIiArIG9wZXJhdGlvbi5nZXROYW1lKCkgKyAiKSBmb3Igc29hcEFjdGlvbjogIgotCQkJCQkJKyBzb2FwQWN0aW9uICsgIiBmb3VuZCBhcyBjaGlsZC4iKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldE9wZXJhdGlvbnMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIEhhc2hNYXAKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8QXhpc09wZXJhdGlvbj4gZ2V0T3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChJdGVyYXRvcjxBeGlzT3BlcmF0aW9uPikgZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZSNnZXRQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQotCS8qKgotCSAqIEdldHMgb25seSB0aGUgcHVibGlzaGVkIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIEFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPiBnZXRQdWJsaXNoZWRPcGVyYXRpb25zKCkgewotCQlJdGVyYXRvcjxBeGlzT3BlcmF0aW9uPiBvcF9pdHIgPSBnZXRPcGVyYXRpb25zKCk7Ci0JCUFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPiBvcGVyYXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxBeGlzT3BlcmF0aW9uPigpOwotCi0JCXdoaWxlIChvcF9pdHIuaGFzTmV4dCgpKSB7Ci0JCQlBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcF9pdHIubmV4dCgpOwotCi0JCQlpZiAoIW9wZXJhdGlvbi5pc0NvbnRyb2xPcGVyYXRpb24oKSkgewotCQkJCW9wZXJhdGlvbkxpc3QuYWRkKG9wZXJhdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3BlcmF0aW9uTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBhYm91dCB0aGUgc2VydmljZSB3aGljaCBpcyBzcGVjaWZpZWQgaW4gc2VydmljZXMueG1sCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50YXRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2Ugc2V0RG9jdW1lbnRhdGlvbigpIGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRGVzY3JpcHRpb24oU3RyaW5nIGRvY3VtZW50YXRpb24pIHsKLQkJc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2Qgc2V0Q2xhc3NMb2FkZXIuCi0JICogCi0JICogQHBhcmFtIGNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdGhpcy5zZXJ2aWNlQ2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShVUkwgZmlsZU5hbWUpIHsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgdGltZSBhcyBsYXN0IHVwZGF0ZSB0aW1lIG9mIHRoZSBzZXJ2aWNlLgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2Ugc2V0TGFzdFVwZGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhc3R1cGRhdGUoKSB7Ci0JCWxhc3R1cGRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHRpbWUgYXMgbGFzdCB1cGRhdGUgdGltZSBvZiB0aGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlKCkgewotICAgICAgICBsYXN0dXBkYXRlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3Q8WG1sU2NoZW1hPiBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiBzY2hlbWFMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNjaGVtYShYbWxTY2hlbWEgc2NoZW1hKSB7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJc2NoZW1hTGlzdC5hZGQoc2NoZW1hKTsKLQkJCWlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkgewotCQkJCWFkZFNjaGVtYU5hbWVTcGFjZShzY2hlbWEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU2NoZW1hKENvbGxlY3Rpb248WG1sU2NoZW1hPiBzY2hlbWFzKSB7Ci0JCUl0ZXJhdG9yPFhtbFNjaGVtYT4gaXRlcmF0b3IgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVhtbFNjaGVtYSBzY2hlbWEgPSAoWG1sU2NoZW1hKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlzY2hlbWFMaXN0LmFkZChzY2hlbWEpOwotCQkJYWRkU2NoZW1hTmFtZVNwYWNlKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1dzZGxGb3VuZCgpIHsKLQkJcmV0dXJuIHdzZGxGb3VuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsRm91bmQoYm9vbGVhbiB3c2RsRm91bmQpIHsKLQkJdGhpcy53c2RsRm91bmQgPSB3c2RsRm91bmQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzY29wZSAtCi0JICogICAgICAgICAgICBBdmFpbGFibGUgc2NvcGVzIDogQ29uc3RhbnRzLlNDT1BFX0FQUExJQ0FUSU9OCi0JICogICAgICAgICAgICBDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT04gQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTgotCSAqICAgICAgICAgICAgQ29uc3RhbnRzLlNDT1BFX1JFUVVFU1QuZXF1YWxzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCWlmIChDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04uZXF1YWxzKHNjb3BlKQotCQkJCXx8IENvbnN0YW50cy5TQ09QRV9UUkFOU1BPUlRfU0VTU0lPTi5lcXVhbHMoc2NvcGUpCi0JCQkJfHwgQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTi5lcXVhbHMoc2NvcGUpCi0JCQkJfHwgQ29uc3RhbnRzLlNDT1BFX1JFUVVFU1QuZXF1YWxzKHNjb3BlKSkgewotCQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVc2VEZWZhdWx0Q2hhaW5zKCkgewotCQlyZXR1cm4gdXNlRGVmYXVsdENoYWluczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0Q2hhaW5zKGJvb2xlYW4gdXNlRGVmYXVsdENoYWlucykgewotCQl0aGlzLnVzZURlZmF1bHRDaGFpbnMgPSB1c2VEZWZhdWx0Q2hhaW5zOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gYWN0aXZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQl0aGlzLmFjdGl2ZSA9IGFjdGl2ZTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtYXRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYXRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHNjaGVtYXRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnNjaGVtYXRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYXRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpIHsKLQkJcmV0dXJuIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIHNldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeAotICAgICAqIEBwYXJhbSBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgoCi0gICAgICAgICAgICBTdHJpbmcgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4KSB7Ci0gICAgICAgIHRoaXMuc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgKLQkJCVN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgpIHsKLQkJdGhpcy5zY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0JCXJldHVybiB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXgpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2VQcmVmaXggPSB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0JfQotCi0JcHVibGljIFhtbFNjaGVtYUVsZW1lbnQgZ2V0U2NoZW1hRWxlbWVudChRTmFtZSBlbGVtZW50UU5hbWUpIHsKLQkJWG1sU2NoZW1hRWxlbWVudCBlbGVtZW50OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVhtbFNjaGVtYSBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFMaXN0LmdldChpKTsKLQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCWVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudEJ5TmFtZShlbGVtZW50UU5hbWUpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlQWxsVHJhbnNwb3J0cygpIHsKLQkJcmV0dXJuIGVuYWJsZUFsbFRyYW5zcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogVG8gZW5lYmxlIHNlcnZpY2UgdG8gYmUgZXhwb3NlIGluIGFsbCB0aGUgdHJhbnNwb3J0Ci0JICogCi0JICogQHBhcmFtIGVuYWJsZUFsbFRyYW5zcG9ydHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVBbGxUcmFuc3BvcnRzKGJvb2xlYW4gZW5hYmxlQWxsVHJhbnNwb3J0cykgewotCQl0aGlzLmVuYWJsZUFsbFRyYW5zcG9ydHMgPSBlbmFibGVBbGxUcmFuc3BvcnRzOwotCQllcHJzID0gY2FsY3VsYXRlRVBScygpOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RXhwb3NlZFRyYW5zcG9ydHMoKSB7Ci0JCXJldHVybiB0aGlzLmV4cG9zZWRUcmFuc3BvcnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cG9zZWRUcmFuc3BvcnRzKExpc3QgdHJhbnNwb3J0cykgewotCQllbmFibGVBbGxUcmFuc3BvcnRzID0gZmFsc2U7Ci0JCXRoaXMuZXhwb3NlZFRyYW5zcG9ydHMgPSB0cmFuc3BvcnRzOwotCQllcHJzID0gbnVsbDsgLy8gRG8gbm90IHJlbW92ZSB0aGlzLiBXZSBuZWVkIHRvIGZvcmNlIEVQUgotCQkJCQkJLy8gcmVjYWxjdWxhdGlvbi4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFeHBvc2VkVHJhbnNwb3J0KFN0cmluZyB0cmFuc3BvcnQpIHsKLQkJZW5hYmxlQWxsVHJhbnNwb3J0cyA9IGZhbHNlOwotCQlpZiAoIXRoaXMuZXhwb3NlZFRyYW5zcG9ydHMuY29udGFpbnModHJhbnNwb3J0KSkgewotCQkJdGhpcy5leHBvc2VkVHJhbnNwb3J0cy5hZGQodHJhbnNwb3J0KTsKLQkJCXRyeSB7Ci0JCQkJZXBycyA9IGNhbGN1bGF0ZUVQUnMoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZXBycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBvc2VkVHJhbnNwb3J0KFN0cmluZyB0cmFuc3BvcnQpIHsKLQkJZW5hYmxlQWxsVHJhbnNwb3J0cyA9IGZhbHNlOwotCQl0aGlzLmV4cG9zZWRUcmFuc3BvcnRzLnJlbW92ZSh0cmFuc3BvcnQpOwotCQl0cnkgewotCQkJZXBycyA9IGNhbGN1bGF0ZUVQUnMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVwcnMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFeHBvc2VkVHJhbnNwb3J0KFN0cmluZyB0cmFuc3BvcnQpIHsKLQkJcmV0dXJuIGV4cG9zZWRUcmFuc3BvcnRzLmNvbnRhaW5zKHRyYW5zcG9ydCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb25EaXNlbmdhZ2UoQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotCQlyZW1vdmVNb2R1bGVPcGVyYXRpb25zKG1vZHVsZSk7Ci0JCWZvciAoSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGdldENoaWxkcmVuKCk7IG9wZXJhdGlvbnMuaGFzTmV4dCgpOykgewotCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotCQkJYXhpc09wZXJhdGlvbi5kaXNlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLQkJfQotCQlBeGlzQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCQlpZiAoIWNvbmZpZy5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkpIHsKLQkJCVBoYXNlUmVzb2x2ZXIgcGhhc2VSZXNvbHZlciA9IG5ldyBQaGFzZVJlc29sdmVyKGNvbmZpZyk7Ci0JCQlwaGFzZVJlc29sdmVyLmRpc2VuZ2FnZU1vZHVsZUZyb21HbG9iYWxDaGFpbnMobW9kdWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgb3BlcmF0aW9ucyB3aGljaCB3ZXJlIGFkZGVkIGJ5IGEgZ2l2ZW4gbW9kdWxlLgotCSAqIAotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiAgICAgICAgICAgIHRoZSBtb2R1bGUgaW4gcXVlc3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTW9kdWxlT3BlcmF0aW9ucyhBeGlzTW9kdWxlIG1vZHVsZSkgewotCQlIYXNoTWFwPFFOYW1lLCBBeGlzT3BlcmF0aW9uPiBtb2R1bGVPcGVyYXRpb25zID0gbW9kdWxlLmdldE9wZXJhdGlvbnMoKTsKLQkJaWYgKG1vZHVsZU9wZXJhdGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvcjxBeGlzT3BlcmF0aW9uPiBtb2RPcHNJdGVyID0gbW9kdWxlT3BlcmF0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOyBtb2RPcHNJdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgbW9kT3BzSXRlci5uZXh0KCk7Ci0JCQkJcmVtb3ZlT3BlcmF0aW9uKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0JLy8gQVBJcyB0byBjcmVhdGUgQXhpc1NlcnZpY2UKLQotCS8vCi0KLQkvKioKLQkgKiBUbyBjcmVhdGUgYSBBeGlzU2VydmljZSBmb3IgYSBnaXZlbiBXU0RMIGFuZCB0aGUgY3JlYXRlZCBjbGllbnQgaXMgbW9zdAotCSAqIHN1aXRhYmxlIGZvciBjbGllbnQgc2lkZSBpbnZvY2F0aW9uIG5vdCBmb3Igc2VydmVyIHNpZGUgaW52b2NhdGlvbi4gU2luY2UKLQkgKiBhbGwgdGhlIHNvYXAgYWN0aW9uIGFuZCB3c2EgYWN0aW9uIGlzIGFkZGVkIHRvIG9wZXJhdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gd3NkbFVSTAotCSAqICAgICAgICAgICAgbG9jYXRpb24gb2YgdGhlIFdTREwKLQkgKiBAcGFyYW0gd3NkbFNlcnZpY2VOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGJlIGludm9rZSAsIGlmIGl0IGlzIG51bGwgdGhlbiB0aGUKLQkgKiAgICAgICAgICAgIGZpcnN0IG9uZSB3aWxsIGJlIHNlbGVjdGVkIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lCi0JICogQHBhcmFtIHBvcnROYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBwb3J0ICwgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgLCBpZiBpdCBpcyBudWxsCi0JICogICAgICAgICAgICB0aGVuIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGl0ZXJhdG9yIHdpbGwgYmUgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgU2VydmljZSBjbGllbnQgb3B0aW9ucywgdG8gc2V0IHRoZSB0YXJnZXQgRVBSCi0JICogQHJldHVybiBBeGlzU2VydmljZSAsIHRoZSBjcmVhdGVkIHNlcnZpY2Ugd2lsbCBiZSByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZUNsaWVudFNpZGVBeGlzU2VydmljZShVUkwgd3NkbFVSTCwKLQkJCVFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwgU3RyaW5nIHBvcnROYW1lLCBPcHRpb25zIG9wdGlvbnMpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGluID0gd3NkbFVSTC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5uZXdEb2N1bWVudChpbik7Ci0JCQlXU0RMUmVhZGVyIHJlYWRlciA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFJlYWRlcigpOwotCQkJcmVhZGVyLnNldEZlYXR1cmUoImphdmF4LndzZGwuaW1wb3J0RG9jdW1lbnRzIiwgdHJ1ZSk7Ci0JCQlEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKGdldEJhc2VVUkkod3NkbFVSTAotCQkJCQkudG9TdHJpbmcoKSksIGRvYyk7Ci0JCQlpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCXdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShnZXREb2N1bWVudFVSSSh3c2RsVVJMCi0JCQkJCQkudG9TdHJpbmcoKSkpOwotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZUNsaWVudFNpZGVBeGlzU2VydmljZSh3c2RsRGVmaW5pdGlvbiwgd3NkbFNlcnZpY2VOYW1lLAotCQkJCQlwb3J0TmFtZSwgb3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCX0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotCQkJbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZVVSSShTdHJpbmcgY3VycmVudFVSSSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY3VycmVudFVSSSk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBmaWxlLmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkudG9VUkkoKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgdXJpRnJhZ21lbnQgPSBjdXJyZW50VVJJLnN1YnN0cmluZygwLCBjdXJyZW50VVJJCi0JCQkJCS5sYXN0SW5kZXhPZigiLyIpKTsKLQkJCXJldHVybiB1cmlGcmFnbWVudCArICh1cmlGcmFnbWVudC5lbmRzV2l0aCgiLyIpID8gIiIgOiAiLyIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXREb2N1bWVudFVSSShTdHJpbmcgY3VycmVudFVSSSkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY3VycmVudFVSSSk7Ci0JCQlyZXR1cm4gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlQ2xpZW50U2lkZUF4aXNTZXJ2aWNlKAotCQkJRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgUU5hbWUgd3NkbFNlcnZpY2VOYW1lLCBTdHJpbmcgcG9ydE5hbWUsCi0JCQlPcHRpb25zIG9wdGlvbnMpIHRocm93cyBBeGlzRmF1bHQgewotCQlXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBzZXJ2aWNlQnVpbGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcigKLQkJCQl3c2RsRGVmaW5pdGlvbiwgd3NkbFNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7Ci0JCXNlcnZpY2VCdWlsZGVyLnNldFNlcnZlclNpZGUoZmFsc2UpOwotCQlBeGlzU2VydmljZSBheGlzU2VydmljZSA9IHNlcnZpY2VCdWlsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotCQlBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gKEF4aXNFbmRwb2ludCkgYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkKLQkJCQkuZ2V0KGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50TmFtZSgpKTsKLQkJb3B0aW9ucy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoYXhpc0VuZHBvaW50LmdldEVuZHBvaW50VVJMKCkpKTsKLQkJaWYgKGF4aXNFbmRwb2ludCAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnNldFNvYXBWZXJzaW9uVVJJKChTdHJpbmcpIGF4aXNFbmRwb2ludC5nZXRCaW5kaW5nKCkKLQkJCQkJLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTikpOwotCQl9Ci0JCXJldHVybiBheGlzU2VydmljZTsKLQl9Ci0KLQkvKioKLQkgKiBUbyBjcmVhdGUgYW4gQXhpc1NlcnZpY2UgdXNpbmcgZ2l2ZW4gc2VydmljZSBpbXBsIGNsYXNzIG5hbWUgZmlyc3QKLQkgKiBnZW5lcmF0ZSBzY2hlbWEgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gamF2YSBjbGFzcyAsIG5leHQgZm9yIGVhY2gKLQkgKiBtZXRob2RzIEF4aXNPcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkLiBJZiB0aGUgbWV0aG9kIGlzIGluLW91dCBpdCB3aWxsCi0JICogdXNlcyBSUENNZXNzYWdlUmVjZWl2ZXIgZWxzZSBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIgPHAvPiBOb3RlIDogSW5vcmRlcgotCSAqIHRvIHdvcmsgdGhpcyBwcm9wZXJseSBSUENNZXNzYWdlUmVjZWl2ZXIgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgY2xhc3MKLQkgKiBwYXRoIG90aGVyZXdpc2Ugb3BlcmF0aW9uIGNhbiBub3QgY29udGludWUKLQkgKiAKLQkgKiBAcGFyYW0gaW1wbENsYXNzCi0JICogICAgICAgICAgICBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0JICogQHBhcmFtIGF4aXNDb25maWcKLQkgKiAgICAgICAgICAgIEN1cnJlbnQgQXhpc0NvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHJldHVybiBjcmVhdGVkIEF4aXNTcmV2aWNlIHRoZSBjcmV0ZWQgc2VydmljZSAsIGl0IGNhbiBlaXRoZXIgYmUKLQkgKiAgICAgICAgIG51bGwgb3IgdmFsaWQgc2VydmljZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlU2VydmljZShTdHJpbmcgaW1wbENsYXNzLAotCQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJdHJ5IHsKLQkJCUhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlUmVjZWl2ZXI+IG1lc3NhZ2VSZWNpdmVyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlUmVjZWl2ZXI+KCk7Ci0JCQlDbGFzcyBpbk9ubHlNZXNzYWdlUmVjZWl2ZXIgPSBMb2FkZXIKLQkJCQkJLmxvYWRDbGFzcygib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIpOwotCQkJTWVzc2FnZVJlY2VpdmVyIG1lc3NhZ2VSZWNlaXZlciA9IChNZXNzYWdlUmVjZWl2ZXIpIGluT25seU1lc3NhZ2VSZWNlaXZlcgotCQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJCW1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0JCQkJCW1lc3NhZ2VSZWNlaXZlcik7Ci0JCQlDbGFzcyBpbm91dE1lc3NhZ2VSZWNlaXZlciA9IExvYWRlcgotCQkJCQkubG9hZENsYXNzKCJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIik7Ci0JCQlNZXNzYWdlUmVjZWl2ZXIgaW5PdXRtZXNzYWdlUmVjZWl2ZXIgPSAoTWVzc2FnZVJlY2VpdmVyKSBpbm91dE1lc3NhZ2VSZWNlaXZlcgotCQkJCQkubmV3SW5zdGFuY2UoKTsKLQkJCW1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCwKLQkJCQkJaW5PdXRtZXNzYWdlUmVjZWl2ZXIpOwotCQkJbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFksCi0JCQkJCWluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLQotCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2UoaW1wbENsYXNzLCBheGlzQ29uZmlnLCBtZXNzYWdlUmVjaXZlck1hcCwKLQkJCQkJbnVsbCwgbnVsbCwgYXhpc0NvbmZpZy5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBtZXNzYWdlUmVjZWl2ZXJDbGFzc01hcCB3aWxsIGhvbGQgdGhlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIGdpdmVuIG1lcHMuCi0JICogS2V5IHdpbGwgYmUgdGhlIG1lcCBhbmQgdmFsdWUgd2lsbCBiZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIE1lc3NhZ2VSZWNlaXZlcgotCSAqIGNsYXNzLiBFeDogTWFwIG1yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkgKiBtck1hcC5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiwKLQkgKiBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuY2xhc3MubmV3SW5zdGFuY2UoKSk7Ci0JICogbXJNYXAucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IiwKLQkgKiBSUENNZXNzYWdlUmVjZWl2ZXIuY2xhc3MubmV3SW5zdGFuY2UoKSk7Ci0JICogCi0JICogQHBhcmFtIGltcGxDbGFzcwotCSAqIEBwYXJhbSBheGlzQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBtZXNzYWdlUmVjZWl2ZXJDbGFzc01hcAotCSAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UKLQkgKiBAcGFyYW0gc2NoZW1hTmFtZXNwYWNlCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoU3RyaW5nIGltcGxDbGFzcywKLQkJCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uLCBNYXAgbWVzc2FnZVJlY2VpdmVyQ2xhc3NNYXAsCi0JCQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hTmFtZXNwYWNlLCBDbGFzc0xvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJaW50IGluZGV4ID0gaW1wbENsYXNzLmxhc3RJbmRleE9mKCIuIik7Ci0JCVN0cmluZyBzZXJ2aWNlTmFtZTsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJc2VydmljZU5hbWUgPSBpbXBsQ2xhc3Muc3Vic3RyaW5nKGluZGV4ICsgMSwgaW1wbENsYXNzLmxlbmd0aCgpKTsKLQkJfSBlbHNlIHsKLQkJCXNlcnZpY2VOYW1lID0gaW1wbENsYXNzOwotCQl9Ci0KLQkJU2NoZW1hR2VuZXJhdG9yIHNjaGVtYUdlbmVyYXRvcjsKLQkJQXJyYXlMaXN0IGV4Y2x1ZGVPcGVhcnRpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLQkJc2VydmljZS5zZXRQYXJlbnQoYXhpc0NvbmZpZ3VyYXRpb24pOwotCQlzZXJ2aWNlLnNldE5hbWUoc2VydmljZU5hbWUpOwotCi0JCXRyeSB7Ci0JCQlQYXJhbWV0ZXIgZ2VuZXJhdGVCYXJlID0gc2VydmljZQotCQkJCQkuZ2V0UGFyYW1ldGVyKEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkVfUEFSQU1FVEVSKTsKLQkJCWlmIChnZW5lcmF0ZUJhcmUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGdlbmVyYXRlQmFyZS5nZXRWYWx1ZSgpKSkgewotCQkJCXNjaGVtYUdlbmVyYXRvciA9IG5ldyBEb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yKGxvYWRlciwKLQkJCQkJCWltcGxDbGFzcywgc2NoZW1hTmFtZXNwYWNlLAotCQkJCQkJSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9OQU1FU1BBQ0VfUFJGSVgsIHNlcnZpY2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzY2hlbWFHZW5lcmF0b3IgPSBuZXcgRGVmYXVsdFNjaGVtYUdlbmVyYXRvcihsb2FkZXIsIGltcGxDbGFzcywKLQkJCQkJCXNjaGVtYU5hbWVzcGFjZSwKLQkJCQkJCUphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfTkFNRVNQQUNFX1BSRklYLCBzZXJ2aWNlKTsKLQkJCX0KLQkJCXNjaGVtYUdlbmVyYXRvcgotCQkJCQkuc2V0RWxlbWVudEZvcm1EZWZhdWx0KEphdmEyV1NETENvbnN0YW50cy5GT1JNX0RFRkFVTFRfVU5RVUFMSUZJRUQpOwotCQkJVXRpbHMuYWRkRXhjbHVkZU1ldGhvZHMoZXhjbHVkZU9wZWFydGlvbik7Ci0JCQlzY2hlbWFHZW5lcmF0b3Iuc2V0RXhjbHVkZU1ldGhvZHMoZXhjbHVkZU9wZWFydGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCQl9Ci0KLQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2UoaW1wbENsYXNzLCBzZXJ2aWNlTmFtZSwgYXhpc0NvbmZpZ3VyYXRpb24sCi0JCQkJbWVzc2FnZVJlY2VpdmVyQ2xhc3NNYXAsIHRhcmdldE5hbWVzcGFjZSwgbG9hZGVyLAotCQkJCXNjaGVtYUdlbmVyYXRvciwgc2VydmljZSk7Ci0JfQotCi0JLyoqCi0JICogbWVzc2FnZVJlY2VpdmVyQ2xhc3NNYXAgd2lsbCBob2xkIHRoZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciBnaXZlbiBtZXBzLgotCSAqIEtleSB3aWxsIGJlIHRoZSBtZXAgYW5kIHZhbHVlIHdpbGwgYmUgdGhlIGluc3RhbmNlIG9mIHRoZSBNZXNzYWdlUmVjZWl2ZXIKLQkgKiBjbGFzcy4gRXg6IE1hcCBtck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JICogbXJNYXAucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIsCi0JICogUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyLmNsYXNzLm5ld0luc3RhbmNlKCkpOwotCSAqIG1yTWFwLnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsCi0JICogUlBDTWVzc2FnZVJlY2VpdmVyLmNsYXNzLm5ld0luc3RhbmNlKCkpOwotCSAqIAotCSAqIEBwYXJhbSBpbXBsQ2xhc3MKLQkgKiBAcGFyYW0gYXhpc0NvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbWVzc2FnZVJlY2VpdmVyQ2xhc3NNYXAKLQkgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoU3RyaW5nIGltcGxDbGFzcywKLQkJCVN0cmluZyBzZXJ2aWNlTmFtZSwgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24sCi0JCQlNYXA8U3RyaW5nLCBNZXNzYWdlUmVjZWl2ZXI+IG1lc3NhZ2VSZWNlaXZlckNsYXNzTWFwLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotCQkJQ2xhc3NMb2FkZXIgbG9hZGVyLCBTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yLAotCQkJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotCQlQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUywgaW1wbENsYXNzKTsKLQkJT01FbGVtZW50IHBhcmFFbGVtZW50ID0gVXRpbHMuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLAotCQkJCWltcGxDbGFzcywgZmFsc2UpOwotCQlwYXJhbWV0ZXIuc2V0UGFyYW1ldGVyRWxlbWVudChwYXJhRWxlbWVudCk7Ci0JCWF4aXNTZXJ2aWNlLnNldFVzZURlZmF1bHRDaGFpbnMoZmFsc2UpOwotCQlheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsKLQkJYXhpc1NlcnZpY2Uuc2V0TmFtZShzZXJ2aWNlTmFtZSk7Ci0JCWF4aXNTZXJ2aWNlLnNldENsYXNzTG9hZGVyKGxvYWRlcik7Ci0KLQkJTmFtZXNwYWNlTWFwIG1hcCA9IG5ldyBOYW1lc3BhY2VNYXAoKTsKLQkJbWFwLnB1dChKYXZhMldTRExDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCwKLQkJCQlKYXZhMldTRExDb25zdGFudHMuQVhJUzJfWFNEKTsKLQkJbWFwLnB1dChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9TQ0hFTUFfTkFNRVNQQUNFX1BSRUZJWCwKLQkJCQlKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0JCWF4aXNTZXJ2aWNlLnNldE5hbWVzcGFjZU1hcChtYXApOwotCQlVdGlscy5wcm9jZXNzQmVhblByb3BlcnR5RXhjbHVkZShheGlzU2VydmljZSk7Ci0JCWF4aXNTZXJ2aWNlLnNldEVsZW1lbnRGb3JtRGVmYXVsdChmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlheGlzU2VydmljZS5hZGRTY2hlbWEoc2NoZW1hR2VuZXJhdG9yLmdlbmVyYXRlU2NoZW1hKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLQkJfQotCQlheGlzU2VydmljZS5zZXRTY2hlbWFUYXJnZXROYW1lc3BhY2Uoc2NoZW1hR2VuZXJhdG9yCi0JCQkJLmdldFNjaGVtYVRhcmdldE5hbWVTcGFjZSgpKTsKLQkJYXhpc1NlcnZpY2Uuc2V0VHlwZVRhYmxlKHNjaGVtYUdlbmVyYXRvci5nZXRUeXBlVGFibGUoKSk7Ci0JCWlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotCQkJdGFyZ2V0TmFtZXNwYWNlID0gc2NoZW1hR2VuZXJhdG9yLmdldFNjaGVtYVRhcmdldE5hbWVTcGFjZSgpOwotCQl9Ci0JCWlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpIHsKLQkJCWF4aXNTZXJ2aWNlLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotCQl9Ci0JCU1ldGhvZFtdIG1ldGhvZCA9IHNjaGVtYUdlbmVyYXRvci5nZXRNZXRob2RzKCk7Ci0JCVBoYXNlc0luZm8gcGluZm8gPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQaGFzZXNJbmZvKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2Qgam1ldGhvZCA9IG1ldGhvZFtpXTsKLQkJCUF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgKLQkJCQkJam1ldGhvZC5nZXROYW1lKCkpKTsKLQkJCVN0cmluZyBtZXAgPSBvcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotCQkJTWVzc2FnZVJlY2VpdmVyIG1yOwotCQkJaWYgKG1lc3NhZ2VSZWNlaXZlckNsYXNzTWFwICE9IG51bGwpIHsKLQotCQkJCWlmIChtZXNzYWdlUmVjZWl2ZXJDbGFzc01hcC5nZXQobWVwKSAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdCBvYmogPSBtZXNzYWdlUmVjZWl2ZXJDbGFzc01hcC5nZXQobWVwKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VSZWNlaXZlcikgewotCQkJCQkJbXIgPSAoTWVzc2FnZVJlY2VpdmVyKSBvYmo7Ci0JCQkJCQlvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1yKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxvZwotCQkJCQkJCQkuZXJyb3IoIk9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVJlY2VpdmVyLCB0aHVzLCBkZWZhdWx0IE1lc3NhZ2VSZWNlaXZlciBoYXMgYmVlbiBzZXQiKTsKLQkJCQkJCW1yID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKG9wZXJhdGlvbgotCQkJCQkJCQkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsKLQkJCQkJCW9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobXIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nCi0JCQkJCQkJLmVycm9yKCJSZXF1aXJlZCBNZXNzYWdlUmVjZWl2ZXIgY291bGRuJ3QgYmUgZm91bmQsIHRodXMsIGRlZmF1bHQgTWVzc2FnZVJlY2VpdmVyIGhhcyBiZWVuIHVzZWQiKTsKLQkJCQkJbXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIob3BlcmF0aW9uCi0JCQkJCQkJLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSk7Ci0JCQkJCW9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIobXIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbG9nCi0JCQkJCQkuZXJyb3IoIk1lc3NhZ2VSZWNldmllckNsYXNzTWFwIGNvdWxkbid0IGJlIGZvdW5kLCB0aHVzLCBkZWZhdWx0IE1lc3NhZ2VSZWNlaXZlciBoYXMgYmVlbiB1c2VkIik7Ci0JCQkJbXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRNZXNzYWdlUmVjZWl2ZXIob3BlcmF0aW9uCi0JCQkJCQkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKTsKLQkJCQlvcGVyYXRpb24uc2V0TWVzc2FnZVJlY2VpdmVyKG1yKTsKLQkJCX0KLQkJCXBpbmZvLnNldE9wZXJhdGlvblBoYXNlcyhvcGVyYXRpb24pOwotCQkJYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0JCX0KLQotCQlTdHJpbmcgZW5kcG9pbnROYW1lID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCk7Ci0JCWlmICgoZW5kcG9pbnROYW1lID09IG51bGwgfHwgZW5kcG9pbnROYW1lLmxlbmd0aCgpID09IDApCi0JCQkJJiYgYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlVdGlscy5hZGRFbmRwb2ludHNUb1NlcnZpY2UoYXhpc1NlcnZpY2UsIGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotCQl9Ci0KLQkJcmV0dXJuIGF4aXNTZXJ2aWNlOwotCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlT3BlcmF0aW9uKFFOYW1lIG9wTmFtZSkgewotCQlBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldE9wZXJhdGlvbihvcE5hbWUpOwotCQlpZiAob3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCXJlbW92ZUNoaWxkKG9wTmFtZSk7Ci0JCQlBcnJheUxpc3Q8U3RyaW5nPiBtYXBwaW5nTGlzdCA9IG9wZXJhdGlvbi5nZXRXU0FNYXBwaW5nTGlzdCgpOwotCQkJaWYgKG1hcHBpbmdMaXN0ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcHBpbmdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBhY3Rpb25NYXBwaW5nID0gKFN0cmluZykgbWFwcGluZ0xpc3QuZ2V0KGkpOwotCQkJCQlvcGVyYXRpb25zQWxpYXNlc01hcC5yZW1vdmUoYWN0aW9uTWFwcGluZyk7Ci0JCQkJfQotCQkJfQotCQkJb3BlcmF0aW9uc0FsaWFzZXNNYXAucmVtb3ZlKG9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuYW1lc3BhY2UgbWFwIGZvciB0aGlzIHNlcnZpY2UuCi0JICogCi0JICogQHJldHVybiBhIE1hcCBvZiBwcmVmaXggKFN0cmluZykgdG8gbmFtZXNwYWNlIFVSSSAoU3RyaW5nKQotCSAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgZ2V0TmFtZXNwYWNlTWFwKCkKLQkgKi8KLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXROYW1lU3BhY2VzTWFwKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmFtZXNwYWNlIG1hcCBmb3IgdGhpcyBzZXJ2aWNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBNYXAgb2YgcHJlZml4IChTdHJpbmcpIHRvIG5hbWVzcGFjZSBVUkkgKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgTWFwIGdldE5hbWVzcGFjZU1hcCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZU1hcDsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBuYW1lc3BhY2VzIGFzc29jaWF0ZWQgd2l0aCBpbXBvcnRlZCBXU0RMcwotICAgICAqIAotICAgICAqIEByZXR1cm4gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZiBuYW1lc3BhY2UgVVJJcyAoU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldEltcG9ydGVkTmFtZXNwYWNlcygpIHsKLSAgICAgICAgcmV0dXJuIGltcG9ydGVkTmFtZXNwYWNlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZXMgYXNzb2NpYXRlZCB3aXRoIGltcG9ydGVkIFdTRExzCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcG9ydGVkTmFtZXNwYWNlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydGVkTmFtZXNwYWNlcyhMaXN0IGltcG9ydGVkTmFtZXNwYWNlcykgewotICAgICAgICB0aGlzLmltcG9ydGVkTmFtZXNwYWNlcyA9IGltcG9ydGVkTmFtZXNwYWNlczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBzZXROYW1lc3BhY2VNYXAKLSAgICAgKiBAcGFyYW0gbmFtZVNwYWNlc01hcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVTcGFjZXNNYXAoTmFtZXNwYWNlTWFwIG5hbWVTcGFjZXNNYXApIHsKLQkJdGhpcy5uYW1lc3BhY2VNYXAgPSBuYW1lU3BhY2VzTWFwOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZU1hcChOYW1lc3BhY2VNYXAgbmFtZXNwYWNlTWFwKSB7Ci0JCXRoaXMubmFtZXNwYWNlTWFwID0gbmFtZXNwYWNlTWFwOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTY2hlbWFOYW1lU3BhY2UoWG1sU2NoZW1hIHNjaGVtYSkgewotCQlTdHJpbmcgdGFyZ2V0TmFtZVNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCQlTdHJpbmcgcHJlZml4ID0gc2NoZW1hLmdldE5hbWVzcGFjZUNvbnRleHQoKS5nZXRQcmVmaXgodGFyZ2V0TmFtZVNwYWNlKTsKLQotCQlpZiAobmFtZXNwYWNlTWFwID09IG51bGwpIHsKLQkJCW5hbWVzcGFjZU1hcCA9IG5ldyBOYW1lc3BhY2VNYXAoKTsKLQkJfQotCi0JCWlmICghbmFtZXNwYWNlTWFwLnZhbHVlcygpLmNvbnRhaW5zKHRhcmdldE5hbWVTcGFjZSkpIHsKLQkJCS8vIGkuZSB0aGlzIHRhcmdldCBuYW1lc3BhY2Ugbm90IGV4aXN0cyBpbiB0aGUgbmFtZXNhcGNlIG1hcAotCQkJLy8gZmluZCBhIG5vbiBleGlzdHMgcHJlZml4IHRvIGFkZCB0aGlzIHRhcmdldCBuYW1lc2FwY2UKLQkJCXdoaWxlICgocHJlZml4ID09IG51bGwpIHx8IG5hbWVzcGFjZU1hcC5rZXlTZXQoKS5jb250YWlucyhwcmVmaXgpKSB7Ci0JCQkJcHJlZml4ID0gIm5zIiArIG5zQ291bnQrKzsKLQkJCX0KLQkJCW5hbWVzcGFjZU1hcC5wdXQocHJlZml4LCB0YXJnZXROYW1lU3BhY2UpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTWFwIHBvcHVsYXRlU2NoZW1hTWFwcGluZ3MoKSB7Ci0JCS8vIHdoZW4gY2FsbGluZyBmcm9tIG90aGVyIHRoYW4gY29kZWdlbi4gaS5lIGZyb20gZGVwbG95bWVudAotCQkvLyBlbmdpbmUgd2UgZG9uJ3QgaGF2ZSB0byBvdmVycmlkZSB0aGUgYWJzb2x1dGUgaHR0cCBsb2NhdGlvbnMuCi0JCXJldHVybiBwb3B1bGF0ZVNjaGVtYU1hcHBpbmdzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBydW5zIHRoZSBzY2hlbWEgbWFwcGluZ3MgaWYgaXQgaGFzIG5vdCBiZWVuIHJ1biBwcmV2aW91c2x5IGl0IGlzIGJlc3QKLQkgKiB0aGF0IHRoaXMgbG9naWMgYmUgaW4gdGhlIGF4aXMgc2VydmljZSBzaW5jZSBvbmUgY2FuIGNhbGwgdGhlIGF4aXMKLQkgKiBzZXJ2aWNlIHRvIHBvcHVsYXRlIHRoZSBzY2hlbWEgbWFwcGluZ3MKLQkgKi8KLQlwdWJsaWMgTWFwIHBvcHVsYXRlU2NoZW1hTWFwcGluZ3MoYm9vbGVhbiBvdmVycmlkZUFic29sdXRlQWRkcmVzcykgewotCi0JCS8vIHBvcHVsYXRlIHRoZSBheGlzIHNlcnZpY2Ugd2l0aCB0aGUgbmVjZXNzYXJ5IHNjaGVtYSByZWZlcmVuY2VzCi0JCUFycmF5TGlzdCBzY2hlbWEgPSB0aGlzLnNjaGVtYUxpc3Q7Ci0JCU1hcCBjaGFuZ2VkU2NoZW1hTG9jYXRpb25zID0gbnVsbDsKLQkJaWYgKCF0aGlzLnNjaGVtYUxvY2F0aW9uc0FkanVzdGVkKSB7Ci0JCQlIYXNodGFibGUgbmFtZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJSGFzaHRhYmxlIHNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQkvLyBjYWxjdWxhdGUgdW5pcXVlIG5hbWVzIGZvciB0aGUgc2NoZW1hcwotCQkJY2FsY3VsYXRlU2NoZW1hTmFtZXMoc2NoZW1hLCBuYW1lVGFibGUsIHNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXAsCi0JCQkJCW92ZXJyaWRlQWJzb2x1dGVBZGRyZXNzKTsKLQkJCS8vIGFkanVzdCB0aGUgc2NoZW1hIGxvY2F0aW9ucyBhcyBwZXIgdGhlIGNhbGN1bGF0ZWQgbmFtZXMKLQkJCWNoYW5nZWRTY2hlbWFMb2NhdGlvbnMgPSBhZGp1c3RTY2hlbWFOYW1lcyhzY2hlbWEsIG5hbWVUYWJsZSwKLQkJCQkJc291cmNlVVJJVG9OZXdMb2NhdGlvbk1hcCk7Ci0JCQkvLyByZXZlcnNlIHRoZSBuYW1ldGFibGUgc28gdGhhdCB0aGVyZSBpcyBhIG1hcHBpbmcgZnJvbSB0aGUKLQkJCS8vIG5hbWUgdG8gdGhlIHNjaGVtYU9iamVjdAotCQkJc2V0U2NoZW1hTWFwcGluZ1RhYmxlKHN3YXBNYXBwaW5nVGFibGUobmFtZVRhYmxlKSk7Ci0JCQlzZXRTY2hlbWFMb2NhdGlvbnNBZGp1c3RlZCh0cnVlKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZFNjaGVtYUxvY2F0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBydW4gMSAtY2FsY3VhbHRlIHVuaXF1ZSBuYW1lcwotCSAqIAotCSAqIEBwYXJhbSBzY2hlbWFzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVNjaGVtYU5hbWVzKExpc3Qgc2NoZW1hcywgSGFzaHRhYmxlIG5hbWVUYWJsZSwKLQkJCUhhc2h0YWJsZSBzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwLCBib29sZWFuIG92ZXJyaWRlQWJzb2x1dGVBZGRyZXNzKSB7Ci0JCS8vIGZpcnN0IHRyYXZlcnNhbCAtIGZpbGwgdGhlIGhhc2h0YWJsZQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMuc2l6ZSgpOyBpKyspIHsKLQkJCVhtbFNjaGVtYSBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFzLmdldChpKTsKLQkJCVhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb24gaW5jbHVkZXMgPSBzY2hlbWEuZ2V0SW5jbHVkZXMoKTsKLQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpbmNsdWRlcy5nZXRDb3VudCgpOyBqKyspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGluY2x1ZGVzLmdldEl0ZW0oaik7Ci0JCQkJWG1sU2NoZW1hIHM7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBYbWxTY2hlbWFFeHRlcm5hbCkgewotCQkJCQlYbWxTY2hlbWFFeHRlcm5hbCBleHRlcm5hbFNjaGVtYSA9IChYbWxTY2hlbWFFeHRlcm5hbCkgaXRlbTsKLQkJCQkJcyA9IGV4dGVybmFsU2NoZW1hLmdldFNjaGVtYSgpOwotCi0JCQkJCWlmIChzICE9IG51bGwKLQkJCQkJCQkmJiBnZXRTY2hlYW1Mb2NhdGlvbldpdGhEb3QoCi0JCQkJCQkJCQlzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwLCBzKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBpbnNlcnQgdGhlIG5hbWUgaW50byB0aGUgdGFibGUKLQkJCQkJCWluc2VydEludG9OYW1lVGFibGUobmFtZVRhYmxlLCBzLAotCQkJCQkJCQlzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwLAotCQkJCQkJCQlvdmVycmlkZUFic29sdXRlQWRkcmVzcyk7Ci0JCQkJCQkvLyByZWN1cnNpdmVseSBjYWxsIHRoZSBzYW1lIHByb2NlZHVyZQotCQkJCQkJY2FsY3VsYXRlU2NoZW1hTmFtZXMoQXJyYXlzCi0JCQkJCQkJCS5hc0xpc3QobmV3IFhtbFNjaGVtYVtdIHsgcyB9KSwgbmFtZVRhYmxlLAotCQkJCQkJCQlzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwLAotCQkJCQkJCQlvdmVycmlkZUFic29sdXRlQWRkcmVzcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIHF1aWNrIHByaXZhdGUgc3ViIHJvdXRpbmUgdG8gaW5zZXJ0IHRoZSBuYW1lcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lVGFibGUKLQkgKiBAcGFyYW0gcwotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRJbnRvTmFtZVRhYmxlKEhhc2h0YWJsZSBuYW1lVGFibGUsIFhtbFNjaGVtYSBzLAotCQkJSGFzaHRhYmxlIHNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXAsIGJvb2xlYW4gb3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MpIHsKLQkJU3RyaW5nIHNvdXJjZVVSSSA9IHMuZ2V0U291cmNlVVJJKCk7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIHNvdXJlY2UgdXJpIGlzIGFuIGFic29sdXRlIG9uZSBhbmQgYXJlCi0JCS8vIHdlIGFsbG93ZWQgdG8gb3ZlcnJpZGUgaXQuCi0JCS8vIGlmIHRoZSBhYnNvbHV0ZSB1cmkgb3ZlcnJpZGluZyBpcyBub3QgYWxsb3dlZCB0aGUgdXNlIHRoZQotCQkvLyBvcmlnaW5hbCBzb3VyY2VVUkkgYXMgbmV3IG9uZQotCQlpZiAoc291cmNlVVJJLnN0YXJ0c1dpdGgoImh0dHAiKSAmJiAhb3ZlcnJpZGVBYnNvbHV0ZUFkZHJlc3MpIHsKLQkJCW5hbWVUYWJsZS5wdXQocywgc291cmNlVVJJKTsKLQkJCXNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXAucHV0KHNvdXJjZVVSSSwgc291cmNlVVJJKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBuZXdVUkkgPSBzb3VyY2VVUkkuc3Vic3RyaW5nKHNvdXJjZVVSSS5sYXN0SW5kZXhPZignLycpICsgMSk7Ci0JCQlpZiAobmV3VVJJLmVuZHNXaXRoKCIueHNkIikpIHsKLQkJCQkvLyByZW1vdmUgdGhlIC54c2QgZXh0ZW50aW9uCi0JCQkJbmV3VVJJID0gbmV3VVJJLnN1YnN0cmluZygwLCBuZXdVUkkubGFzdEluZGV4T2YoIi4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCW5ld1VSSSA9ICJ4c2QiICsgY291bnQrKzsKLQkJCX0KLQotCQkJbmV3VVJJID0gY3VzdG9tU2NoZW1hTmFtZVN1ZmZpeCAhPSBudWxsID8gbmV3VVJJCi0JCQkJCSsgY3VzdG9tU2NoZW1hTmFtZVN1ZmZpeCA6IG5ld1VSSTsKLQkJCS8vIG1ha2UgaXQgdW5pcXVlCi0JCQl3aGlsZSAobmFtZVRhYmxlLmNvbnRhaW5zVmFsdWUobmV3VVJJKSkgewotCQkJCW5ld1VSSSA9IG5ld1VSSSArIGNvdW50Kys7Ci0JCQl9Ci0KLQkJCW5hbWVUYWJsZS5wdXQocywgbmV3VVJJKTsKLQkJCXNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXAucHV0KHNvdXJjZVVSSSwgbmV3VVJJKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUnVuIDIgLSBhZGp1c3QgdGhlIG5hbWVzCi0JICovCi0JcHJpdmF0ZSBNYXAgYWRqdXN0U2NoZW1hTmFtZXMoTGlzdCBzY2hlbWFzLCBIYXNodGFibGUgbmFtZVRhYmxlLAotCQkJSGFzaHRhYmxlIHNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXApIHsKLQkJSGFzaHRhYmxlIGltcG9ydGVkU2NoZW1hcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJLy8gcHJvY2VzcyB0aGUgc2NoZW1hcyBpbiB0aGUgbWFpbiBzY2hlbWEgbGlzdAotCQlmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkanVzdFNjaGVtYU5hbWUoKFhtbFNjaGVtYSkgc2NoZW1hcy5nZXQoaSksIG5hbWVUYWJsZSwKLQkJCQkJaW1wb3J0ZWRTY2hlbWFzLCBzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwKTsKLQkJfQotCQkvLyBwcm9jZXNzIGFsbCB0aGUgcmVzdCBpbiB0aGUgbmFtZSB0YWJsZQotCQlFbnVtZXJhdGlvbiBuYW1lVGFibGVLZXlzID0gbmFtZVRhYmxlLmtleXMoKTsKLQkJd2hpbGUgKG5hbWVUYWJsZUtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWFkanVzdFNjaGVtYU5hbWUoKFhtbFNjaGVtYSkgbmFtZVRhYmxlS2V5cy5uZXh0RWxlbWVudCgpLAotCQkJCQluYW1lVGFibGUsIGltcG9ydGVkU2NoZW1hcywgc291cmNlVVJJVG9OZXdMb2NhdGlvbk1hcCk7Ci0KLQkJfQotCQlyZXR1cm4gaW1wb3J0ZWRTY2hlbWFzOwotCX0KLQotCS8qKgotCSAqIEFkanVzdCBhIHNpbmdsZSBzY2hlbWEKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2NoZW1hCi0JICogQHBhcmFtIG5hbWVUYWJsZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTY2hlbWFOYW1lKFhtbFNjaGVtYSBwYXJlbnRTY2hlbWEsIEhhc2h0YWJsZSBuYW1lVGFibGUsCi0JCQlIYXNodGFibGUgaW1wb3J0ZWRTY2hlYW1zLCBIYXNodGFibGUgc291cmNlVVJJVG9OZXdMb2NhdGlvbk1hcCkgewotCQlYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gcGFyZW50U2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgaW5jbHVkZXMuZ2V0Q291bnQoKTsgaisrKSB7Ci0JCQlPYmplY3QgaXRlbSA9IGluY2x1ZGVzLmdldEl0ZW0oaik7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFhtbFNjaGVtYUV4dGVybmFsKSB7Ci0JCQkJWG1sU2NoZW1hRXh0ZXJuYWwgeG1sU2NoZW1hRXh0ZXJuYWwgPSAoWG1sU2NoZW1hRXh0ZXJuYWwpIGl0ZW07Ci0JCQkJWG1sU2NoZW1hIHMgPSB4bWxTY2hlbWFFeHRlcm5hbC5nZXRTY2hlbWEoKTsKLQkJCQlhZGp1c3RTY2hlbWFMb2NhdGlvbihzLCB4bWxTY2hlbWFFeHRlcm5hbCwgbmFtZVRhYmxlLAotCQkJCQkJaW1wb3J0ZWRTY2hlYW1zLCBzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwKTsKLQkJCX0KLQkJfQotCi0JfQotCQkKLQkvKioKLQkgKiBBZGp1c3RzIGEgZ2l2ZW4gc2NoZW1hIGxvY2F0aW9uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiBAcGFyYW0geG1sU2NoZW1hRXh0ZXJuYWwKLQkgKiBAcGFyYW0gbmFtZVRhYmxlCi0JICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkanVzdFNjaGVtYUxvY2F0aW9uKFhtbFNjaGVtYSBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFeHRlcm5hbCB4bWxTY2hlbWFFeHRlcm5hbCwgSGFzaHRhYmxlIG5hbWVUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGltcG9ydGVkU2NoZWFtcywgSGFzaHRhYmxlIHNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXApIHsKLSAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0geG1sU2NoZW1hRXh0ZXJuYWwuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLQotICAgICAgICAgICAgU3RyaW5nIG5ld3NjaGVhbWxvY2F0aW9uID0gY3VzdG9tU2NoZW1hTmFtZVByZWZpeCA9PSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IG1vZGUKLSAgICAgICAgICAgICAgICAgICAgKHRoaXMuZ2V0U2VydmljZUVQUigpICsgIj94c2Q9IiArIGdldFNjaGVhbUxvY2F0aW9uV2l0aERvdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VVUklUb05ld0xvY2F0aW9uTWFwLCBzKSkKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b20gcHJlZml4IGlzIHByZXNlbnQgLSBhZGQgdGhlIGN1c3RvbSBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgKGN1c3RvbVNjaGVtYU5hbWVQcmVmaXggKyBnZXRTY2hlYW1Mb2NhdGlvbldpdGhEb3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVVJJVG9OZXdMb2NhdGlvbk1hcCwgcykpOwotICAgICAgICAgICAgeG1sU2NoZW1hRXh0ZXJuYWwuc2V0U2NoZW1hTG9jYXRpb24obmV3c2NoZWFtbG9jYXRpb24pOwotICAgICAgICAgICAgaW1wb3J0ZWRTY2hlYW1zLnB1dChzY2hlbWFMb2NhdGlvbiwgbmV3c2NoZWFtbG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0U2NoZWFtTG9jYXRpb25XaXRoRG90KAotCQkJSGFzaHRhYmxlIHNvdXJjZVVSSVRvTmV3TG9jYXRpb25NYXAsIFhtbFNjaGVtYSBzKSB7Ci0JCVN0cmluZyBvID0gKFN0cmluZykgc291cmNlVVJJVG9OZXdMb2NhdGlvbk1hcC5nZXQocy5nZXRTb3VyY2VVUkkoKSk7Ci0JCWlmIChvICE9IG51bGwgJiYgby5pbmRleE9mKCIuIikgPCAwKSB7Ci0JCQlyZXR1cm4gbyArICIueHNkIjsKLQkJfQotCQlyZXR1cm4gbzsKLQl9Ci0KLQkvKioKLQkgKiBTd2FwIHRoZSBrZXksdmFsdWUgcGFpcnMKLQkgKiAKLQkgKiBAcGFyYW0gb3JpZ2luYWxUYWJsZQotCSAqLwotCXByaXZhdGUgTWFwIHN3YXBNYXBwaW5nVGFibGUoTWFwIG9yaWdpbmFsVGFibGUpIHsKLQkJSGFzaE1hcCBzd2FwcGVkVGFibGUgPSBuZXcgSGFzaE1hcChvcmlnaW5hbFRhYmxlLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGtleXMgPSBvcmlnaW5hbFRhYmxlLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBrZXk7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJa2V5ID0ga2V5cy5uZXh0KCk7Ci0JCQlzd2FwcGVkVGFibGUucHV0KG9yaWdpbmFsVGFibGUuZ2V0KGtleSksIGtleSk7Ci0JCX0KLQotCQlyZXR1cm4gc3dhcHBlZFRhYmxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50U2lkZSgpIHsKLQkJcmV0dXJuIGNsaWVudFNpZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50U2lkZShib29sZWFuIGNsaWVudFNpZGUpIHsKLQkJdGhpcy5jbGllbnRTaWRlID0gY2xpZW50U2lkZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoYm9vbGVhbiBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gc2V0IGEgcGFyYW1ldGVyIGluIHNlcnZpY2VzLnhtbCBzYXlpbmcgaGUgd2FudCB0byBzaG93IHRoZQotCSAqIG9yaWdpbmFsIHdzZGwgdGhhdCBoZSBwdXQgaW50byBNRVRBLUlORiBvbmNlIHNvbWVvbmUgYXNrIGZvciA/d3NkbCBzbyBpZgotCSAqIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biB3c2RsIHRoZW4gYWRkIGZvbGxvd2luZyBwYXJhbWV0ZXIgaW50bwotCSAqIHNlcnZpY2VzLnhtbCA8cGFyYW1ldGVyIG5hbWU9InVzZU9yaWdpbmFsd3NkbCI+dHJ1ZTwvcGFyYW1ldGVyPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXNlVXNlcldTREwoKSB7Ci0JCVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIoInVzZU9yaWdpbmFsd3NkbCIpOwotCQlpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotCQkJaWYgKCJ0cnVlIi5lcXVhbHModmFsdWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgdGhlIHBvcnQgYWRkcmVzcyBpbiB1c2VyIFdTRExzIGlzIG1vZGlmaWVkLCBzZXQgdGhlIGZvbGxvd2luZwotCSAqIHBhcmFtZXRlciB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW91ciA8cGFyYW1ldGVyCi0JICogbmFtZT0ibW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcyI+ZmFsc2U8L3BhcmFtZXRlcj4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MoKSB7Ci0JCVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBnZXRQYXJhbWV0ZXIoIm1vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MiKTsKLQkJaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLQkJCWlmICgiZmFsc2UiLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFNlcnZpY2VMaWZlQ3ljbGUgZ2V0U2VydmljZUxpZmVDeWNsZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VMaWZlQ3ljbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUxpZmVDeWNsZShTZXJ2aWNlTGlmZUN5Y2xlIHNlcnZpY2VMaWZlQ3ljbGUpIHsKLQkJdGhpcy5zZXJ2aWNlTGlmZUN5Y2xlID0gc2VydmljZUxpZmVDeWNsZTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldFAybk1hcCgpIHsKLQkJcmV0dXJuIHAybk1hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQMm5NYXAoTWFwIHAybk1hcCkgewotCQl0aGlzLnAybk1hcCA9IHAybk1hcDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0U3VwcGxpZXIgZ2V0T2JqZWN0U3VwcGxpZXIoKSB7Ci0JCXJldHVybiBvYmplY3RTdXBwbGllcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RTdXBwbGllcihPYmplY3RTdXBwbGllciBvYmplY3RTdXBwbGllcikgewotCQl0aGlzLm9iamVjdFN1cHBsaWVyID0gb2JqZWN0U3VwcGxpZXI7Ci0JfQotCi0JcHVibGljIFR5cGVUYWJsZSBnZXRUeXBlVGFibGUoKSB7Ci0JCXJldHVybiB0eXBlVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZVRhYmxlKFR5cGVUYWJsZSB0eXBlVGFibGUpIHsKLQkJdGhpcy50eXBlVGFibGUgPSB0eXBlVGFibGU7Ci0JfQotCi0JLyoqCi0JICogRmluZCBhIGRhdGEgbG9jYXRvciBmcm9tIHRoZSBhdmFpbGFibGUgZGF0YSBsb2NhdG9ycyAoYm90aCBjb25maWd1cmVkIGFuZAotCSAqIGRlZmF1bHQgb25lcykgdG8gcmV0cmlldmUgTWV0YWRhdGEgb3IgZGF0YSBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiAgICAgICAgICAgIGFuIHtAbGluayBEYXRhUmV0cmlldmFsUmVxdWVzdH0gb2JqZWN0Ci0JICogQHBhcmFtIG1zZ0NvbnRleHQKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgY29udGV4dAotCSAqIEByZXR1cm4gYXJyYXkgb2Yge0BsaW5rIERhdGF9IG9iamVjdCBmb3IgdGhlIHJlcXVlc3QuCi0JICogQHRocm93cyBBeGlzRmF1bHQKLQkgKi8KLQotCXB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJRGF0YVtdIGRhdGE7Ci0JCVN0cmluZyBkaWFsZWN0ID0gcmVxdWVzdC5nZXREaWFsZWN0KCk7Ci0JCUF4aXNEYXRhTG9jYXRvciBkYXRhTG9jYXRvciA9IG51bGw7Ci0JCWludCBuZXh0RGF0YUxvY2F0b3JJbmRleCA9IDA7Ci0JCWludCB0b3RhbExvY2F0b3JzID0gYXZhaWxhYmxlRGF0YUxvY2F0b3JUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxMb2NhdG9yczsgaSsrKSB7Ci0JCQlkYXRhTG9jYXRvciA9IGdldERhdGFMb2NhdG9yKGF2YWlsYWJsZURhdGFMb2NhdG9yVHlwZXNbaV0sIGRpYWxlY3QpOwotCQkJaWYgKGRhdGFMb2NhdG9yICE9IG51bGwpIHsKLQkJCQluZXh0RGF0YUxvY2F0b3JJbmRleCA9IGkgKyAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRhdGFMb2NhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZGF0YSA9IGRhdGFMb2NhdG9yLmdldERhdGEocmVxdWVzdCwgbXNnQ29udGV4dCk7Ci0JCS8vIE51bGwgbWVhbnMgRGF0YSBMb2NhdG9yIG5vdCB1bmRlcnN0b29kIHJlcXVlc3QuIEF1dG9tYXRpY2FsbHkgZmluZAotCQkvLyBEYXRhIExvY2F0b3IgaW4gdGhlIGhpZXJhcmNoeSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LgotCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQlpZiAobmV4dERhdGFMb2NhdG9ySW5kZXggPCB0b3RhbExvY2F0b3JzKSB7Ci0JCQkJZGF0YSA9IGJ1YmJsZXVwRGF0YUxvY2F0b3JzKG5leHREYXRhTG9jYXRvckluZGV4LCByZXF1ZXN0LAotCQkJCQkJbXNnQ29udGV4dCk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKgotCSAqIFRvIHNlYXJjaCB0aGUgbmV4dCBEYXRhIExvY2F0b3IgZnJvbSB0aGUgYXZhaWxhYmxlIERhdGEgTG9jYXRvcnMgdGhhdAotCSAqIHVuZGVyc3Rvb2QgdGhlIGRhdGEgcmV0cmlldmFsIHJlcXVlc3QuCi0JICovCi0JcHJpdmF0ZSBEYXRhW10gYnViYmxldXBEYXRhTG9jYXRvcnMoaW50IG5leHRJbmRleCwKLQkJCURhdGFSZXRyaWV2YWxSZXF1ZXN0IHJlcXVlc3QsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJRGF0YVtdIGRhdGEgPSBudWxsOwotCQlpZiAobmV4dEluZGV4IDwgYXZhaWxhYmxlRGF0YUxvY2F0b3JUeXBlcy5sZW5ndGgpIHsKLQkJCUF4aXNEYXRhTG9jYXRvciBkYXRhTG9jYXRvciA9IGdldERhdGFMb2NhdG9yKAotCQkJCQlhdmFpbGFibGVEYXRhTG9jYXRvclR5cGVzW25leHRJbmRleF0sIHJlcXVlc3QuZ2V0RGlhbGVjdCgpKTsKLQkJCW5leHRJbmRleCsrOwotCQkJaWYgKGRhdGFMb2NhdG9yICE9IG51bGwpIHsKLQkJCQlkYXRhID0gZGF0YUxvY2F0b3IuZ2V0RGF0YShyZXF1ZXN0LCBtc2dDb250ZXh0KTsKLQkJCQlpZiAoZGF0YSA9PSBudWxsKSB7Ci0JCQkJCWRhdGEgPSBidWJibGV1cERhdGFMb2NhdG9ycyhuZXh0SW5kZXgsIHJlcXVlc3QsIG1zZ0NvbnRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBkYXRhOwotCQkJCX0KLQotCQkJfSBlbHNlIHsKLQkJCQlkYXRhID0gYnViYmxldXBEYXRhTG9jYXRvcnMobmV4dEluZGV4LCByZXF1ZXN0LCBtc2dDb250ZXh0KTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqIFNhdmUgZGF0YSBMb2NhdG9yIGNvbmZpZ3VyZWQgYXQgc2VydmljZSBsZXZlbCBmb3IgdGhpcyBBeGlzIFNlcnZpY2UKLQkgKiAKLQkgKiBAcGFyYW0gZGlhbGVjdC0KLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIFVSSSByZXByZXNlbnRzIHRoZSBEaWFsZWN0IGkuZS4gV1NETCwgUG9saWN5LAotCSAqICAgICAgICAgICAgU2NoZW1hIG9yICJTZXJ2aWNlTGV2ZWwiIGZvciBub24tZGlhbGVjdCBzZXJ2aWNlIGxldmVsIGRhdGEKLQkgKiAgICAgICAgICAgIGxvY2F0b3IuCi0JICogQHBhcmFtIGRhdGFMb2NhdG9yQ2xhc3NOYW1lIC0KLQkgKiAgICAgICAgICAgIGNsYXNzIG5hbWUgb2YgdGhlIERhdGEgTG9jYXRvciBjb25maWd1cmVkIHRvIHN1cHBvcnQgZGF0YQotCSAqICAgICAgICAgICAgcmV0cmlldmFsIGZvciB0aGUgc3BlY2lmaWVkIGRpYWxlY3QuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGF0YUxvY2F0b3JDbGFzc05hbWVzKFN0cmluZyBkaWFsZWN0LAotCQkJU3RyaW5nIGRhdGFMb2NhdG9yQ2xhc3NOYW1lKSB7Ci0JCWRhdGFMb2NhdG9yQ2xhc3NOYW1lcy5wdXQoZGlhbGVjdCwgZGF0YUxvY2F0b3JDbGFzc05hbWUpOwotCX0KLQotCS8qCi0JICogR2V0IGRhdGEgbG9jYXRvciBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgTG9jYXRvclR5cGUgYW5kIGRpYWxlY3QuCi0JICovCi0JcHVibGljIEF4aXNEYXRhTG9jYXRvciBnZXREYXRhTG9jYXRvcihMb2NhdG9yVHlwZSBsb2NhdG9yVHlwZSwKLQkJCVN0cmluZyBkaWFsZWN0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJQXhpc0RhdGFMb2NhdG9yIGxvY2F0b3I7Ci0JCWlmIChsb2NhdG9yVHlwZSA9PSBMb2NhdG9yVHlwZS5TRVJWSUNFX0RJQUxFQ1QpIHsKLQkJCWxvY2F0b3IgPSBnZXRTZXJ2aWNlRGF0YUxvY2F0b3IoZGlhbGVjdCk7Ci0JCX0gZWxzZSBpZiAobG9jYXRvclR5cGUgPT0gTG9jYXRvclR5cGUuU0VSVklDRV9MRVZFTCkgewotCQkJbG9jYXRvciA9IGdldFNlcnZpY2VEYXRhTG9jYXRvcihEUkNvbnN0YW50cy5TRVJWSUNFX0xFVkVMKTsKLQkJfSBlbHNlIGlmIChsb2NhdG9yVHlwZSA9PSBMb2NhdG9yVHlwZS5HTE9CQUxfRElBTEVDVCkgewotCQkJbG9jYXRvciA9IGdldEdsb2JhbERhdGFMb2NhdG9yKGRpYWxlY3QpOwotCQl9IGVsc2UgaWYgKGxvY2F0b3JUeXBlID09IExvY2F0b3JUeXBlLkdMT0JBTF9MRVZFTCkgewotCQkJbG9jYXRvciA9IGdldEdsb2JhbERhdGFMb2NhdG9yKERSQ29uc3RhbnRzLkdMT0JBTF9MRVZFTCk7Ci0JCX0gZWxzZSBpZiAobG9jYXRvclR5cGUgPT0gTG9jYXRvclR5cGUuREVGQVVMVF9BWElTKSB7Ci0JCQlsb2NhdG9yID0gZ2V0RGVmYXVsdERhdGFMb2NhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2NhdG9yID0gZ2V0RGVmYXVsdERhdGFMb2NhdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQkvLyBSZXR1cm4gZGVmYXVsdCBBeGlzMiBEYXRhIExvY2F0b3IKLQlwcml2YXRlIEF4aXNEYXRhTG9jYXRvciBnZXREZWZhdWx0RGF0YUxvY2F0b3IoKQotCQkJdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCi0JCWlmIChkZWZhdWx0RGF0YUxvY2F0b3IgPT0gbnVsbCkgewotCQkJZGVmYXVsdERhdGFMb2NhdG9yID0gbmV3IEF4aXNEYXRhTG9jYXRvckltcGwodGhpcyk7Ci0JCX0KLQotCQlkZWZhdWx0RGF0YUxvY2F0b3IubG9hZFNlcnZpY2VEYXRhKCk7Ci0KLQkJcmV0dXJuIGRlZmF1bHREYXRhTG9jYXRvcjsKLQl9Ci0KLQkvKgotCSAqIENoZWNrcyBpZiBzZXJ2aWNlIGxldmVsIGRhdGEgbG9jYXRvciBjb25maWd1cmVkIGZvciBzcGVjaWZpZWQgZGlhbGVjdC4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIGxvY2F0b3IgaWYgZXhpc3RzLCBhbmQgbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBBeGlzRGF0YUxvY2F0b3IgZ2V0U2VydmljZURhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0KQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUF4aXNEYXRhTG9jYXRvciBsb2NhdG9yOwotCQlsb2NhdG9yID0gKEF4aXNEYXRhTG9jYXRvcikgZGF0YUxvY2F0b3JzLmdldChkaWFsZWN0KTsKLQkJaWYgKGxvY2F0b3IgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGRhdGFMb2NhdG9yQ2xhc3NOYW1lcy5nZXQoZGlhbGVjdCk7Ci0JCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQlsb2NhdG9yID0gbG9hZERhdGFMb2NhdG9yKGNsYXNzTmFtZSk7Ci0JCQkJZGF0YUxvY2F0b3JzLnB1dChkaWFsZWN0LCBsb2NhdG9yKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGxvY2F0b3I7Ci0KLQl9Ci0KLQkvKgotCSAqIENoZWNrcyBpZiBnbG9iYWwgbGV2ZWwgZGF0YSBsb2NhdG9yIGNvbmZpZ3VyZWQgZm9yIHNwZWNpZmllZCBkaWFsZWN0LgotCSAqIEBwYXJhbSBkaWFsZWN0LSBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50cyB0aGUgRGlhbGVjdCBpLmUuIFdTREwsIFBvbGljeSwKLQkgKiBTY2hlbWEgb3IgIkdsb2JhbExldmVsIiBmb3Igbm9uLWRpYWxlY3QgR2xvYmFsIGxldmVsIGRhdGEgbG9jYXRvci4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIGxvY2F0b3IgaWYgZXhpc3RzLCBhbmQgbnVsbCBvdGhlcndpc2UuCi0JICovCi0KLQlwdWJsaWMgQXhpc0RhdGFMb2NhdG9yIGdldEdsb2JhbERhdGFMb2NhdG9yKFN0cmluZyBkaWFsZWN0KQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCQlBeGlzRGF0YUxvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0JCWlmIChheGlzQ29uZmlnICE9IG51bGwpIHsKLQkJCWxvY2F0b3IgPSBheGlzQ29uZmlnLmdldERhdGFMb2NhdG9yKGRpYWxlY3QpOwotCQkJaWYgKGxvY2F0b3IgPT0gbnVsbCkgewotCQkJCVN0cmluZyBjbGFzc05hbWUgPSBheGlzQ29uZmlnLmdldERhdGFMb2NhdG9yQ2xhc3NOYW1lKGRpYWxlY3QpOwotCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQlsb2NhdG9yID0gbG9hZERhdGFMb2NhdG9yKGNsYXNzTmFtZSk7Ci0JCQkJCWF4aXNDb25maWcuYWRkRGF0YUxvY2F0b3IoZGlhbGVjdCwgbG9jYXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxvY2F0b3I7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgQXhpc0RhdGFMb2NhdG9yIGxvYWREYXRhTG9jYXRvcihTdHJpbmcgY2xhc3NOYW1lKQotCQkJdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQkJQXhpc0RhdGFMb2NhdG9yIGxvY2F0b3I7Ci0KLQkJdHJ5IHsKLQkJCUNsYXNzIGRhdGFMb2NhdG9yOwotCQkJZGF0YUxvY2F0b3IgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgc2VydmljZUNsYXNzTG9hZGVyKTsKLQkJCWxvY2F0b3IgPSAoQXhpc0RhdGFMb2NhdG9yKSBkYXRhTG9jYXRvci5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotCi0JCX0KLQotCQlyZXR1cm4gbG9jYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG1hcCBvZiBXU0RMIG1lc3NhZ2UgZWxlbWVudCBRTmFtZXMgdG8gQXhpc09wZXJhdGlvbnMgZm9yIHRoaXMKLQkgKiBzZXJ2aWNlLiBUaGlzIG1hcCBpcyB1c2VkIGR1cmluZyBTT0FQIEJvZHktYmFzZWQgcm91dGluZyBmb3IKLQkgKiBkb2N1bWVudC9saXRlcmFsIGJhcmUgc2VydmljZXMgdG8gbWF0Y2ggdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQgb2YgdGhlCi0JICogU09BUCBCb2R5IGVsZW1lbnQgdG8gYW4gb3BlcmF0aW9uLiAoUm91dGluZyBmb3IgUlBDIGFuZCBkb2N1bWVudC9saXRlcmFsCi0JICogd3JhcHBlZCBzZXJ2aWNlcyBvY2N1cnMgdmlhIHRoZSBvcGVyYXRpb25zQWxpYXNlc01hcC4pIDxwLz4gRnJvbSBzZWN0aW9uCi0JICogNC43LjYgb2YgdGhlIFdTLUkgQlAgMS4xOiB0aGUgIm9wZXJhdGlvbiBzaWduYXR1cmUiIGlzICJ0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2hpbGQgZWxlbWVudCBvZiBTT0FQIGJvZHkgb2YgdGhlIFNPQVAgaW5wdXQKLQkgKiBtZXNzYWdlIGRlc2NyaWJlZCBieSBhbiBvcGVyYXRpb24gaW4gYSBXU0RMIGJpbmRpbmcsIiBhbmQgdGh1cyB0aGlzIG1hcAotCSAqIG11c3QgYmUgZnJvbSBhIFFOYW1lIHRvIGFuIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwCi0JICogICAgICAgICAgICBUaGUgbWFwIGZyb20gV1NETCBtZXNzYWdlIGVsZW1lbnQgUU5hbWVzIHRvIEF4aXNPcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcCgKLQkJCU1hcCBtZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXApIHsKLQkJdGhpcy5tZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXAgPSBtZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXA7Ci0JfQotCi0JLyoqCi0JICogTG9vayB1cCBhbiBBeGlzT3BlcmF0aW9uIGZvciB0aGlzIHNlcnZpY2UgYmFzZWQgb2ZmIG9mIGFuIGVsZW1lbnQgUU5hbWUKLQkgKiBmcm9tIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VFbGVtZW50UU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBRTmFtZSB0byBzZWFyY2ggZm9yLgotCSAqIEByZXR1cm4gVGhlIEF4aXNPcGVyYXRpb24gcmVnaXN0ZXJlZCB0byB0aGUgUU5hbWUgb3IgbnVsbCBpZiBubyBtYXRjaCB3YXMKLQkgKiAgICAgICAgIGZvdW5kLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcChNYXApCi0JICovCi0JcHVibGljIEF4aXNPcGVyYXRpb24gZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKAotCQkJUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSkgewotCQlyZXR1cm4gKEF4aXNPcGVyYXRpb24pIG1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcAotCQkJCS5nZXQobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGVudHJ5IHRvIHRoZSBtYXAgYmV0d2VlbiBlbGVtZW50IFFOYW1lcyBpbiBXU0RMIG1lc3NhZ2VzIGFuZAotCSAqIEF4aXNPcGVyYXRpb25zIGZvciB0aGlzIHNlcnZpY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VFbGVtZW50UU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBRTmFtZSBvZiB0aGUgZWxlbWVudCBvbiB0aGUgaW5wdXQgbWVzc2FnZSB0aGF0IG1hcHMgdG8gdGhlCi0JICogICAgICAgICAgICBnaXZlbiBvcGVyYXRpb24uCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqICAgICAgICAgICAgVGhlIEF4aXNPcGVyYXRpb24gdG8gYmUgbWFwcGVkIHRvLgotCSAqIEBzZWUgI3NldE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcChNYXApCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZygKLQkJCVFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUsIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCS8vIHdoZW4gc2V0dGluZyBhbiBvcGVyYXRpb24gd2UgaGF2ZSB0byBzZXQgaXQgb25seSBpZiB0aGUKLQkJLy8gbWVzc2VnZUVsZW1lbnRRTmFtZSBkb2VzIG5vdAotCQkvLyBleGlzdHMgaW4gdGhlIG1hcC4KLQkJLy8gZG9lcyBleGlzdHMgbWVhbnMgdGhlcmUgYXJlIHR3byBvciBtb3JlIG9wZXJhdGlvbnMgd2hpY2ggaGFzIHRoZSBzYW1lCi0JCS8vIGlucHV0IGVsZW1lbnQgKGluIGRvYy9saXRlcmFsCi0JCS8vIHRoaXMgaXMgcG9zc2libGUuIEluIHRoaXMgY2FzZSBiZXR0ZXIgdG8gc2V0IGl0IGFzIG51bGwgd2l0aG91dAotCQkvLyBnaXZpbmcKLQkJLy8gYSByYW5kb20gb3BlcmF0aW9uLgotCQlpZiAobWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwLmNvbnRhaW5zS2V5KG1lc3NhZ2VFbGVtZW50UU5hbWUpCi0JCQkJJiYgbWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwLmdldChtZXNzYWdlRWxlbWVudFFOYW1lKSAhPSBvcGVyYXRpb24pIHsKLQkJCW1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcC5wdXQobWVzc2FnZUVsZW1lbnRRTmFtZSwgbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQltZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXAucHV0KG1lc3NhZ2VFbGVtZW50UU5hbWUsCi0JCQkJCW9wZXJhdGlvbik7Ci0JCX0KLQotCX0KLQotCS8vIEBkZXByZWNhdGVkIC0gdXNlIGdldEVuZHBvaW50VVJMIGluIGF4aXNFbmRwb2ludAotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRVUkwoKSB7Ci0JCXJldHVybiBlbmRwb2ludFVSTDsKLQl9Ci0KLQkvLyBAZGVwcmVjYXRlZCAtIHVzZSBzZXRFbmRwb2ludFVSTCBpbiBheGlzRW5kcG9pbnQKLQlwdWJsaWMgdm9pZCBzZXRFbmRwb2ludFVSTChTdHJpbmcgZW5kcG9pbnRVUkwpIHsKLQkJdGhpcy5lbmRwb2ludFVSTCA9IGVuZHBvaW50VVJMOwotCX0KLQotCS8vIFRPRE8gOiBFeHBsYWluIHdoYXQgZ29lcyBpbiB0aGlzIG1hcCEKLQlwdWJsaWMgTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PiBnZXRFbmRwb2ludHMoKSB7Ci0JCXJldHVybiBlbmRwb2ludE1hcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbVdzZGwoKSB7Ci0JCXJldHVybiBjdXN0b21Xc2RsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbVdzZGwoYm9vbGVhbiBjdXN0b21Xc2RsKSB7Ci0JCXRoaXMuY3VzdG9tV3NkbCA9IGN1c3RvbVdzZGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0T3BlcmF0aW9uc05hbWVMaXN0KCkgewotCQlyZXR1cm4gb3BlcmF0aW9uc05hbWVMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbnNOYW1lTGlzdChMaXN0IG9wZXJhdGlvbnNOYW1lTGlzdCkgewotCQl0aGlzLm9wZXJhdGlvbnNOYW1lTGlzdCA9IG9wZXJhdGlvbnNOYW1lTGlzdDsKLQl9Ci0KLQlwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCBnZXRBeGlzU2VydmljZUdyb3VwKCkgewotCQlyZXR1cm4gKEF4aXNTZXJ2aWNlR3JvdXApIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQXhpc1NlcnZpY2VHcm91cCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRXhjbHVkZUluZm8gZ2V0RXhjbHVkZUluZm8oKSB7Ci0JCXJldHVybiBleGNsdWRlSW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlSW5mbyhFeGNsdWRlSW5mbyBleGNsdWRlSW5mbykgewotCQl0aGlzLmV4Y2x1ZGVJbmZvID0gZXhjbHVkZUluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJQb2xpY3koU3RyaW5nIGtleSwgUG9saWN5IHBvbGljeSkgewotCQlwb2xpY3lNYXAucHV0KGtleSwgcG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgUG9saWN5IGxvb2t1cFBvbGljeShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoUG9saWN5KSBwb2xpY3lNYXAuZ2V0KGtleSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZCBhIFNlcnZpY2VDb250ZXh0TGlzdGVuZXIKLSAgICAgKiBAcGFyYW0gc2NsCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHRMaXN0ZW5lcihNZXNzYWdlQ29udGV4dExpc3RlbmVyIHNjbCkgewotICAgICAgICBtZXNzYWdlQ29udGV4dExpc3RlbmVycy5hZGQoc2NsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgU2VydmljZUNvbnRleHRMaXN0ZW5lcgotICAgICAqIEBwYXJhbSBzY2wKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlQ29udGV4dExpc3RlbmVyKE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgc2NsKSB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzLnJlbW92ZShzY2wpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2xzIENsYXNzIG9mIFNlcnZpY2VDb250ZXh0TGlzdGVuZXIKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgU2VydmljZUNvbnRleHRMaXN0ZXIgaXMgaW4gdGhlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlQ29udGV4dExpc3RlbmVyKENsYXNzIGNscykgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVzc2FnZUNvbnRleHRMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dExpc3RlbmVycy5nZXQoaSkuZ2V0Q2xhc3MoKSA9PSBjbHMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNpZ25hbCBhbiBBdHRhY2ggU2VydmljZUNvbnRleHQgRXZlbnQKLSAgICAgKiBAcGFyYW0gc2MgU2VydmljZUNvbnRleHQKLSAgICAgKiBAcGFyYW0gbWMgTWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhdHRhY2hTZXJ2aWNlQ29udGV4dEV2ZW50KFNlcnZpY2VDb250ZXh0IHNjLCBNZXNzYWdlQ29udGV4dCBtYykgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVzc2FnZUNvbnRleHRMaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzLmdldChpKS5hdHRhY2hTZXJ2aWNlQ29udGV4dEV2ZW50KHNjLCBtYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2lnbmFsIGFuIEF0dGFjaCBFbnZlbG9wZSBFdmVudAotICAgICAqIEBwYXJhbSBtYyBNZXNzYWdlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dGFjaEVudmVsb3BlRXZlbnQoTWVzc2FnZUNvbnRleHQgbWMpIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1lc3NhZ2VDb250ZXh0TGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtZXNzYWdlQ29udGV4dExpc3RlbmVycy5nZXQoaSkuYXR0YWNoRW52ZWxvcGVFdmVudChtYyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UyV1NETDExLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2UyV1NETDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjlkZWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlMldTREwxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQSGVhZGVyTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmljZTJXU0RMMTEgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMgewotCi0JcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBPTUVsZW1lbnQgZGVmaW5pdGlvbjsKLQotCXByaXZhdGUgT01OYW1lc3BhY2Ugc29hcDsKLQotCXByaXZhdGUgT01OYW1lc3BhY2Ugc29hcDEyOwotCi0JcHJpdmF0ZSBPTU5hbWVzcGFjZSBodHRwOwotCi0JcHJpdmF0ZSBPTU5hbWVzcGFjZSBtaW1lOwotCi0JcHJpdmF0ZSBPTU5hbWVzcGFjZSB0bnM7Ci0KLQlwcml2YXRlIE9NTmFtZXNwYWNlIHdzZGw7Ci0KLQlwcml2YXRlIE9NTmFtZXNwYWNlIHdzYXc7Ci0KLQlwcml2YXRlIFN0cmluZyBzdHlsZSA9IERPQ1VNRU5UOwotCi0JcHJpdmF0ZSBTdHJpbmcgdXNlID0gTElURVJBTDsKLQotCXByaXZhdGUgSGFzaE1hcCBwb2xpY2llc0luRGVmaW5pdGlvbnM7Ci0KLQlwcml2YXRlIEV4dGVybmFsUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1lc3NhZ2VzTWFwOwotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlMldTREwxMShBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vKgotCQkvLyB0aGUgRVBSIGxpc3Qgb2YgQXhpc1NlcnZpY2UgY29udGFpbnMgUkVTVCBFUFJzIGFzIHdlbGwuIFRob3NlIFJFU1QKLQkJLy8gRVBScyB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGVkIEhUVFBCaW5kaW5nCi0JCS8vIGFuZCByZXN0IG9mIHRoZSBFUFJzIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBTT0FQIDEuMSBhbmQgMS4yCi0JCS8vIGJpbmRpbmdzLiBMZXQncyBmaXJzdCBpbml0aWFsaXplIHRob3NlIHNldCBvZgotCQkvLyBFUFJzIG5vdyB0byBiZSB1c2VkIGxhdGVyLCBlc3BlY2lhbGx5IHdoZW4gd2UgZ2VuZXJhdGUgdGhlIFdTREwuCi0gICAgICAgIFN0cmluZ1tdIHNlcnZpY2VFbmRwb2ludFVSTHMgPSBheGlzU2VydmljZS5nZXRFUFJzKCk7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRVUkxzID09IG51bGwpIHsKLQkJCU1hcCBlbmRwb2ludE1hcCA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpOwotCQkJaWYgKGVuZHBvaW50TWFwLnNpemUoKSA+IDApIHsKLQkJCQlJdGVyYXRvciBlbmRwb2ludEl0ciA9IGVuZHBvaW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJaWYgKGVuZHBvaW50SXRyLmhhc05leHQoKSkgewotCQkJCQlBeGlzRW5kcG9pbnQgZW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBlbmRwb2ludEl0ci5uZXh0KCk7Ci0JCQkJCXNlcnZpY2VFbmRwb2ludFVSTHMgPSBuZXcgU3RyaW5nW10geyBlbmRwb2ludAotCQkJCQkJCS5nZXRFbmRwb2ludFVSTCgpIH07Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCXNlcnZpY2VFbmRwb2ludFVSTHMgPSBuZXcgU3RyaW5nW10geyBheGlzU2VydmljZQotCQkJCQkJLmdldEVuZHBvaW50TmFtZSgpIH07Ci0JCQl9Ci0JCX0KLSovCi0JCXRoaXMudGFyZ2V0TmFtZXNwYWNlID0gYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLQkJc2VyaWFsaXplciA9IG5ldyBFeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIoKTsKLQkJLy8gQ0hFQ0tNRSBjaGVjayB3aGV0aGVyIHNlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSByZXR1cm4gbnVsbCA/Pz8KLQotCQlBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJc2VyaWFsaXplci5zZXRBc3NlcnRpb25zVG9GaWx0ZXIoY29uZmlndXJhdGlvbgotCQkJCQkuZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIEF4aXNTZXJ2aWNlMldTREwxMShBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgc2VydmljZU5hbWUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLQkJaW5pdCgpOwotCX0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIHRoZSBPTSBzdHJ1Y3R1cmUgb2YgdGhlIFdTREwgZG9jdW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gT01FbGVtZW50IGNvbnRhaW5pbmcgYSBXU0RMIGRvY3VtZW50Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdlbmVyYXRlT00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0JCXdzZGwgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoV1NETF9OQU1FU1BBQ0UsIERFRkFVTFRfV1NETF9OQU1FU1BBQ0VfUFJFRklYKTsKLQkJT01FbGVtZW50IGVsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImRlZmluaXRpb25zIiwgd3NkbCk7Ci0JCXNldERlZmluaXRpb25FbGVtZW50KGVsZSk7Ci0KLQkJcG9saWNpZXNJbkRlZmluaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQlNYXAgbmFtZXNwYWNlTWFwID0gYXhpc1NlcnZpY2UuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0JCWlmIChuYW1lc3BhY2VNYXAgPT0gbnVsbCkKLQkJCW5hbWVzcGFjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLnBvcHVsYXRlTmFtZXNwYWNlcyhlbGUsIG5hbWVzcGFjZU1hcCk7Ci0JCXNvYXAgPSBlbGUuZGVjbGFyZU5hbWVzcGFjZShVUklfV1NETDExX1NPQVAsIFNPQVAxMV9QUkVGSVgpOwotCQlzb2FwMTIgPSBlbGUuZGVjbGFyZU5hbWVzcGFjZShVUklfV1NETDEyX1NPQVAsIFNPQVAxMl9QUkVGSVgpOwotCQlodHRwID0gZWxlLmRlY2xhcmVOYW1lc3BhY2UoSFRUUF9OQU1FU1BBQ0UsIEhUVFBfUFJFRklYKTsKLQkJbWltZSA9IGVsZS5kZWNsYXJlTmFtZXNwYWNlKE1JTUVfTkFNRVNQQUNFLCBNSU1FX1BSRUZJWCk7Ci0JCXdzYXcgPSBlbGUuZGVjbGFyZU5hbWVzcGFjZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQVdfTkFNRVNQQUNFLCAid3NhdyIpOwotCQlTdHJpbmcgcHJlZml4ID0gV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeChheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFwKTsKLQkJaWYgKHByZWZpeCA9PSBudWxsIHx8ICIiLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQlwcmVmaXggPSBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYOwotCQl9Ci0KLQkJbmFtZXNwYWNlTWFwLnB1dChwcmVmaXgsIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJdG5zID0gZWxlLmRlY2xhcmVOYW1lc3BhY2UoYXhpc1NlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHByZWZpeCk7Ci0KLQkJLy8gYXhpczIueG1sIGluZGljYXRlZCBubyBIVFRQIGJpbmRpbmc/Ci0JCWJvb2xlYW4gZGlzYWJsZVJFU1QgPSBmYWxzZTsKLQkJUGFyYW1ldGVyIGRpc2FibGVSRVNUUGFyYW1ldGVyID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsKLQkJaWYgKGRpc2FibGVSRVNUUGFyYW1ldGVyICE9IG51bGwKLQkJCQkmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlUkVTVFBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotCQkJZGlzYWJsZVJFU1QgPSB0cnVlOwotCQl9Ci0KLSAgICAgICAgYm9vbGVhbiBkaXNhYmxlU09BUDExID0gZmFsc2U7Ci0JCVBhcmFtZXRlciBkaXNhYmxlU09BUDExUGFyYW1ldGVyID0gYXhpc1NlcnZpY2UKLQkJCQkuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTEpOwotCQlpZiAoZGlzYWJsZVNPQVAxMVBhcmFtZXRlciAhPSBudWxsCi0JCQkJJiYgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVNPQVAxMVBhcmFtZXRlci5nZXRWYWx1ZSgpKSkgewotCQkJZGlzYWJsZVNPQVAxMSA9IHRydWU7Ci0JCX0KLQotICAgICAgICAvLyBheGlzMi54bWwgaW5kaWNhdGVkIG5vIFNPQVAgMS4yIGJpbmRpbmc/Ci0JCWJvb2xlYW4gZGlzYWJsZVNPQVAxMiA9IGZhbHNlOwotCQlQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMlBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0JCQkJLmdldFBhcmFtZXRlcihvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUDEyKTsKLQkJaWYgKGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIgIT0gbnVsbAotCQkJCSYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCWRpc2FibGVTT0FQMTIgPSB0cnVlOwotCQl9Ci0KLQkJLy8gYWRkaW5nIGRvY3VtZW50YXRpb24gZWxlbWVudAotCQkvLyA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtORVchJmx0Oy9iJmd0OyBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4KLQkJLy8gc3RyaW5nIGFuZCByZXR1cm5zICZsdDtiJmd0O0FtYXpvbi5jby51ayZsdDsvYiZndDsgU2FsZXMgUmFuayBmb3IKLQkJLy8gdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudChheGlzU2VydmljZSwgZWxlLAlmYWMsIHdzZGwpOwotCi0JCWVsZS5hZGRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLCBudWxsKTsKLQkJT01FbGVtZW50IHdzZGxUeXBlcyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInR5cGVzIiwgd3NkbCk7Ci0JCWVsZS5hZGRDaGlsZCh3c2RsVHlwZXMpOwotCi0JCS8vIHBvcHVsYXRlIHRoZSBzY2hlbWEgbWFwcGluZ3MKLQkJYXhpc1NlcnZpY2UucG9wdWxhdGVTY2hlbWFNYXBwaW5ncygpOwotCi0JCUFycmF5TGlzdCBzY2hlbWFzID0gYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotCQkJLy8gWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYXMuZ2V0KGkpOwotCQkJWG1sU2NoZW1hIHNjaGVtYSA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYShpKTsKLQotCQkJU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkJCWlmICghQ29uc3RhbnRzLk5TX1VSSV9YTUwuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpIHsKLQkJCQlzY2hlbWEud3JpdGUod3JpdGVyKTsKLQkJCQlTdHJpbmcgc2NoZW1hU3RyaW5nID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKCEiIi5lcXVhbHMoc2NoZW1hU3RyaW5nKSkgewotCQkJCQl3c2RsVHlwZXMuYWRkQ2hpbGQoWE1MVXRpbHMudG9PTShuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYVN0cmluZykpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ2VuZXJhdGVNZXNzYWdlcyhmYWMsIGVsZSk7Ci0JCWdlbmVyYXRlUG9ydFR5cGUoZmFjLCBlbGUpOwotCi0JCS8vIGdlbmVyYXRlU09BUDExQmluZGluZyhmYWMsIGVsZSk7Ci0JCS8vIGlmICghZGlzYWJsZVNPQVAxMikgewotCQkvLyBnZW5lcmF0ZVNPQVAxMkJpbmRpbmcoZmFjLCBlbGUpOwotCQkvLyB9Ci0JCS8vIGlmICghZGlzYWJsZVJFU1QpIHsKLQkJLy8gZ2VuZXJhdGVIVFRQQmluZGluZyhmYWMsIGVsZSk7Ci0JCS8vIH0KLQotCQlnZW5lcmF0ZVNlcnZpY2UoZmFjLCBlbGUsIGRpc2FibGVSRVNULCBkaXNhYmxlU09BUDEyICwgZGlzYWJsZVNPQVAxMSk7Ci0JCWFkZFBvbGljaWVzVG9EZWZpbml0aW9uRWxlbWVudChwb2xpY2llc0luRGVmaW5pdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKSwgZGVmaW5pdGlvbik7Ci0KLQkJcmV0dXJuIGVsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVNZXNzYWdlcyhPTUZhY3RvcnkgZmFjLCBPTUVsZW1lbnQgZGVmaW50aW9ucykgewotCQlIYXNoU2V0IGZhdWx0TWVzc2FnZU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJbWVzc2FnZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0JCXdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgewotCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotCQkJaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0JCQkJaWYgKGluYXhpc01lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQl3cml0ZU1lc3NhZ2UoaW5heGlzTWVzc2FnZSwgZmFjLCBkZWZpbnRpb25zKTsKLQkJCQkJZ2VuZXJhdGVIZWFkZXJNZXNzYWdlcyhpbmF4aXNNZXNzYWdlLCBmYWMsIGRlZmludGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKE1FUCkpIHsKLQkJCQlBeGlzTWVzc2FnZSBvdXRBeGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLQkJCQkJCS5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCQkJCWlmIChvdXRBeGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlTWVzc2FnZShvdXRBeGlzTWVzc2FnZSwgZmFjLCBkZWZpbnRpb25zKTsKLQkJCQkJZ2VuZXJhdGVIZWFkZXJNZXNzYWdlcyhvdXRBeGlzTWVzc2FnZSwgZmFjLCBkZWZpbnRpb25zKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdlbmVyYXRlIGZhdWx0IE1lc3NhZ2VzCi0JCQlBcnJheUxpc3QgZmF1bHR5TWVzc2FnZXMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLQkJCWlmIChmYXVsdHlNZXNzYWdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmF1bHR5TWVzc2FnZSA6IGZhdWx0eU1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0gKEF4aXNNZXNzYWdlKWZhdWx0eU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXhpc01lc3NhZ2UuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmF1bHRNZXNzYWdlTmFtZXMuYWRkKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZU1lc3NhZ2UoYXhpc01lc3NhZ2UsIGZhYywgZGVmaW50aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUhlYWRlck1lc3NhZ2VzKGF4aXNNZXNzYWdlLCBmYWMsIGRlZmludGlvbnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSGVhZGVyTWVzc2FnZXMoQXhpc01lc3NhZ2UgYXhpc21lc3NhZ2UsIE9NRmFjdG9yeSBmYWMsCi0JCQlPTUVsZW1lbnQgZGVmaW50aW9ucykgewotCQlBcnJheUxpc3QgZXh0TGlzdCA9IGF4aXNtZXNzYWdlLmdldFNvYXBIZWFkZXJzKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IGFuRXh0TGlzdCA6IGV4dExpc3QpIHsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlciA9IChTT0FQSGVhZGVyTWVzc2FnZSlhbkV4dExpc3Q7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KE1FU1NBR0VfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICBtZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGhlYWRlci5nZXRNZXNzYWdlKCkuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotICAgICAgICAgICAgZGVmaW50aW9ucy5hZGRDaGlsZChtZXNzYWdlRWxlbWVudCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbWVzc2FnZVBhcnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFBBUlRfQVRUUklCVVRFX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgbWVzc2FnZUVsZW1lbnQuYWRkQ2hpbGQobWVzc2FnZVBhcnQpOwotICAgICAgICAgICAgbWVzc2FnZVBhcnQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBoZWFkZXIucGFydCgpLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFTEVNRU5UX0FUVFJJQlVURV9OQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG51bGwgZm9yICIgKyBoZWFkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lc3NhZ2VQYXJ0LmFkZEF0dHJpYnV0ZShFTEVNRU5UX0FUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoaGVhZGVyLmdldEVsZW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWVzcGFjZVVSSSgpLCBheGlzU2VydmljZS5nZXROYW1lc3BhY2VNYXAoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IiArIGhlYWRlci5nZXRFbGVtZW50KCkuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotICAgICAgICB9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTWVzc2FnZShBeGlzTWVzc2FnZSBheGlzbWVzc2FnZSwgT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmludGlvbnMpIHsKLQkJaWYgKG1lc3NhZ2VzTWFwLmdldChheGlzbWVzc2FnZS5nZXROYW1lKCkpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzTWFwLnB1dChheGlzbWVzc2FnZS5nZXROYW1lKCksIGF4aXNtZXNzYWdlKTsKLQkJCVFOYW1lIHNjaGVtYUVsZW1lbnROYW1lID0gYXhpc21lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0JCQlPTUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KE1FU1NBR0VfTE9DQUxfTkFNRSwgd3NkbCk7Ci0JCQltZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGF4aXNtZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQlkZWZpbnRpb25zLmFkZENoaWxkKG1lc3NhZ2VFbGVtZW50KTsKLQkJCWlmIChzY2hlbWFFbGVtZW50TmFtZSAhPSBudWxsKSB7Ci0JCQkJT01FbGVtZW50IG1lc3NhZ2VQYXJ0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChQQVJUX0FUVFJJQlVURV9OQU1FLCB3c2RsKTsKLQkJCQltZXNzYWdlRWxlbWVudC5hZGRDaGlsZChtZXNzYWdlUGFydCk7Ci0JCQkJaWYgKGF4aXNtZXNzYWdlLmdldE1lc3NhZ2VQYXJ0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJbWVzc2FnZVBhcnQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc21lc3NhZ2UuZ2V0TWVzc2FnZVBhcnROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZXNzYWdlUGFydC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGF4aXNtZXNzYWdlLmdldFBhcnROYW1lKCksIG51bGwpOwotCQkJCX0KLQkJCQltZXNzYWdlUGFydC5hZGRBdHRyaWJ1dGUoRUxFTUVOVF9BVFRSSUJVVEVfTkFNRSwKLQkJCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoc2NoZW1hRWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpKQotCQkJCQkJCQkrICI6IiArIHNjaGVtYUVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQnVpbGRzIHRoZSAmbHQ7cG9ydFR5cGUmZ3Q7IGVsZW1lbnQgaW4gdGhlIHBhc3NlZCBXU0RMIGRlZmluaXRpb24uIFdoZW4KLQkgKiB0aGlzIHJldHVybnMgc3VjY2Vzc2Z1bGx5LCB0aGVyZSB3aWxsIGJlIGEgbmV3IGNoaWxkIGVsZW1lbnQgdW5kZXIKLQkgKiBkZWZpbml0b25zIGZvciB0aGUgcG9ydFR5cGUuCi0JICogCi0JICogQHBhcmFtIGZhYwotCSAqICAgICAgICAgICAgdGhlIGFjdGl2ZSBPTUZhY3RvcnkKLQkgKiBAcGFyYW0gZGVmaW50aW9ucwotCSAqICAgICAgICAgICAgdGhlIFdTREwgJmx0O2RlZmluaXRpb25zJmd0OyBlbGVtZW50Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGVyZSdzIGEgcHJvYmxlbQotCSAqLwotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVBvcnRUeXBlKE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBkZWZpbnRpb25zKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9NRWxlbWVudCBwb3J0VHlwZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUE9SVF9UWVBFX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlkZWZpbnRpb25zLmFkZENoaWxkKHBvcnRUeXBlKTsKLQotCQlwb3J0VHlwZS5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIHNlcnZpY2VOYW1lICsgUE9SVF9UWVBFX1NVRkZJWCwKLQkJCQludWxsKTsKLQotCQlhZGRQb2xpY3lBc0V4dEF0dHJpYnV0ZShheGlzU2VydmljZSwgcG9ydFR5cGUsIGZhYyk7Ci0KLQkJZm9yIChJdGVyYXRvciBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBvcGVyYXRpb25zCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLQkJCWlmIChheGlzT3BlcmF0aW9uLmlzQ29udHJvbE9wZXJhdGlvbigpCi0JCQkJCXx8IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBvcGVyYXRpb25OYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQlPTUVsZW1lbnQgb3BlcmF0aW9uID0gZmFjLmNyZWF0ZU9NRWxlbWVudChPUEVSQVRJT05fTE9DQUxfTkFNRSwKLQkJCQkJd3NkbCk7Ci0JCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGF4aXNPcGVyYXRpb24sCi0JCQkJCW9wZXJhdGlvbiwgZmFjLCB3c2RsKTsKLQkJCXBvcnRUeXBlLmFkZENoaWxkKG9wZXJhdGlvbik7Ci0JCQlvcGVyYXRpb24uYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBvcGVyYXRpb25OYW1lLCBudWxsKTsKLQkJCWFkZFBvbGljeUFzRXh0QXR0cmlidXRlKGF4aXNPcGVyYXRpb24sIG9wZXJhdGlvbixmYWMpOwotCi0JCQlTdHJpbmcgTUVQID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0JCQlpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKE1FUCkpIHsKLQkJCQlBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQkJCQlpZiAoaW5heGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCU9NRWxlbWVudCBpbnB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoSU5fUFVUX0xPQ0FMX05BTUUsCi0JCQkJCQkJd3NkbCk7Ci0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRXU0RMRG9jdW1lbnRhdGlvbkVsZW1lbnQoCi0JCQkJCQkJaW5heGlzTWVzc2FnZSwgaW5wdXQsIGZhYywgd3NkbCk7Ci0JCQkJCWlucHV0LmFkZEF0dHJpYnV0ZShNRVNTQUdFX0xPQ0FMX05BTUUsIHRucy5nZXRQcmVmaXgoKQotCQkJCQkJCSsgIjoiICsgaW5heGlzTWVzc2FnZS5nZXROYW1lKCksIG51bGwpOwotCQkJCQlhZGRQb2xpY3lBc0V4dEF0dHJpYnV0ZShpbmF4aXNNZXNzYWdlLCBpbnB1dCxmYWMpOwotCi0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRXU0FXQWN0aW9uQXR0cmlidXRlKGlucHV0LAotCQkJCQkJCWF4aXNPcGVyYXRpb24uZ2V0SW5wdXRBY3Rpb24oKSwgd3Nhdyk7Ci0JCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotCQkJCUF4aXNNZXNzYWdlIG91dEF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbgotCQkJCQkJLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0JCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJT01FbGVtZW50IG91dHB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoT1VUX1BVVF9MT0NBTF9OQU1FLAotCQkJCQkJCXdzZGwpOwotCQkJCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KAotCQkJCQkJCW91dEF4aXNNZXNzYWdlLCBvdXRwdXQsIGZhYywgd3NkbCk7Ci0JCQkJCW91dHB1dC5hZGRBdHRyaWJ1dGUoTUVTU0FHRV9MT0NBTF9OQU1FLCB0bnMuZ2V0UHJlZml4KCkKLQkJCQkJCQkrICI6IiArIG91dEF4aXNNZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQkJCWFkZFBvbGljeUFzRXh0QXR0cmlidXRlKG91dEF4aXNNZXNzYWdlLCBvdXRwdXQsIGZhYyk7Ci0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRXU0FXQWN0aW9uQXR0cmlidXRlKG91dHB1dCwKLQkJCQkJCQlheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpLCB3c2F3KTsKLQkJCQkJb3BlcmF0aW9uLmFkZENoaWxkKG91dHB1dCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZW5lcmF0ZSBmYXVsdCBNZXNzYWdlcwotCQkJQXJyYXlMaXN0IGZhdWx0TWVzc2FnZXMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLQkJCWlmIChmYXVsdE1lc3NhZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBmYXVsdE1lc3NhZ2UgOiBmYXVsdE1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0eU1lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpZmF1bHRNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZmF1bHQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0eU1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBmYXVsdC5hZGRBdHRyaWJ1dGUoTUVTU0FHRV9MT0NBTF9OQU1FLCB0bnMuZ2V0UHJlZml4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBmYXVsdHlNZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0LmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgZmF1bHR5TWVzc2FnZS5nZXROYW1lKCksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NBV0FjdGlvbkF0dHJpYnV0ZShmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5nZXRGYXVsdEFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdHlNZXNzYWdlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXcpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGFkZCBwb2xpY2llcyBmb3IgZmF1bHQgbWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZENoaWxkKGZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIHRoZSBXU0RMICZsdDtzZXJ2aWNlJmd0OyBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGZhYwotCSAqICAgICAgICAgICAgdGhlIGFjdGl2ZSBPTUZhY3RvcnkKLQkgKiBAcGFyYW0gZGVmaW50aW9ucwotCSAqICAgICAgICAgICAgdGhlIFdTREwgJmx0O2RlZmluaXRpb25zJmd0OyBlbGVtZW50IHVuZGVyIHdoaWNoIHRvIHB1dCB0aGUKLQkgKiAgICAgICAgICAgIHNlcnZpY2UKLQkgKiBAcGFyYW0gZGlzYWJsZVJFU1QKLQkgKiAgICAgICAgICAgIGlmIGZhbHNlLCBnZW5lcmF0ZSBSRVNUIGJpbmRpbmcsIGlmIHRydWUsIGRvbid0Ci0JICogQHBhcmFtIGRpc2FibGVTT0FQMTIKLQkgKiAgICAgICAgICAgIGlmIGZhbHNlLCBnZW5lcmF0ZSBTT0FQIDEuMiBiaW5kaW5nLCBpZiB0cnVlLCBkb24ndAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlcmUncyBhIHByb2JsZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVNlcnZpY2UoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmludGlvbnMsIGJvb2xlYW4gZGlzYWJsZVJFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZVNPQVAxMiwgYm9vbGVhbiBkaXNhYmxlU09BUDExKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9NRWxlbWVudCBzZXJ2aWNlID0gZmFjLmNyZWF0ZU9NRWxlbWVudChTRVJWSUNFX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlkZWZpbnRpb25zLmFkZENoaWxkKHNlcnZpY2UpOwotCQlzZXJ2aWNlLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgc2VydmljZU5hbWUsIG51bGwpOwotCi0gICAgICAgIGlmICghZGlzYWJsZVNPQVAxMSkgewotCQkJZ2VuZXJhdGVTb2FwMTFQb3J0KGZhYywgZGVmaW50aW9ucywgc2VydmljZSk7Ci0JCX0KLQotICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLQkJCS8vIGdlbmVyYXRlU09BUDEyUG9ydHMoZmFjLCBzZXJ2aWNlKTsKLQkJCWdlbmVyYXRlU29hcDEyUG9ydChmYWMsIGRlZmludGlvbnMsIHNlcnZpY2UpOwotCQl9Ci0KLQotICAgICAgICBhZGRQb2xpY3lBc0V4dEVsZW1lbnQoUG9saWN5SW5jbHVkZS5TRVJWSUNFX1BPTElDWSwgYXhpc1NlcnZpY2UuZ2V0UG9saWN5SW5jbHVkZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSk7Ci0JCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkFYSVNfU0VSVklDRV9QT0xJQ1ksIGF4aXNTZXJ2aWNlLgotCQkvLyBnZXRQb2xpY3lJbmNsdWRlKCksIHNlcnZpY2UpOwotCi0JCWlmICghZGlzYWJsZVJFU1QpIHsKLQkJCS8vIGdlbmVyYXRlSFRUUFBvcnRzKGZhYywgc2VydmljZSk7Ci0JCQlnZW5lcmF0ZUh0dHBQb3J0KGZhYywgZGVmaW5pdGlvbiwgc2VydmljZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVTb2FwSGVhZGVycyhBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlLCBPTUZhY3RvcnkgZmFjLAotCQkJT01FbGVtZW50IGlucHV0LCBPTU5hbWVzcGFjZSBzb2FwTmFtZVNwYWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IGV4dEVsZW1lbnRMaXN0OwotCQlleHRFbGVtZW50TGlzdCA9IGluYXhpc01lc3NhZ2UuZ2V0U29hcEhlYWRlcnMoKTsKLQkJaWYgKGV4dEVsZW1lbnRMaXN0ICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gZXh0RWxlbWVudExpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlTT0FQSGVhZGVyTWVzc2FnZSBzb2FwaGVhZGVyID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBlbGVtZW50cwotCQkJCQkJLm5leHQoKTsKLQkJCQlhZGRTT0FQSGVhZGVyKGZhYywgaW5wdXQsIHNvYXBoZWFkZXIsIHNvYXBOYW1lU3BhY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEV4dGVuc2lvbkVsZW1lbnQoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGVsZW1lbnQsCi0JCQlTdHJpbmcgbmFtZSwgU3RyaW5nIGF0dDFOYW1lLCBTdHJpbmcgYXR0MVZhbHVlLCBTdHJpbmcgYXR0Mk5hbWUsCi0JCQlTdHJpbmcgYXR0MlZhbHVlLCBPTU5hbWVzcGFjZSBzb2FwTmFtZVNwYWNlKSB7Ci0JCU9NRWxlbWVudCBzb2FwYmluZGluZyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQobmFtZSwgc29hcE5hbWVTcGFjZSk7Ci0JCWVsZW1lbnQuYWRkQ2hpbGQoc29hcGJpbmRpbmcpOwotCQlzb2FwYmluZGluZy5hZGRBdHRyaWJ1dGUoYXR0MU5hbWUsIGF0dDFWYWx1ZSwgbnVsbCk7Ci0JCWlmIChhdHQyTmFtZSAhPSBudWxsKSB7Ci0JCQlzb2FwYmluZGluZy5hZGRBdHRyaWJ1dGUoYXR0Mk5hbWUsIGF0dDJWYWx1ZSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmaW5pdGlvbkVsZW1lbnQoT01FbGVtZW50IGRlZmludGlvbikgewotCQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbnRpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNPQVBIZWFkZXIoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGVsZW1lbnQsCi0JCQlTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXIsIE9NTmFtZXNwYWNlIHNvYXBOYW1lU3BhY2UpIHsKLQkJT01FbGVtZW50IGV4dEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJoZWFkZXIiLCBzb2FwTmFtZVNwYWNlKTsKLQkJZWxlbWVudC5hZGRDaGlsZChleHRFbGVtZW50KTsKLQkJU3RyaW5nIHVzZSA9IGhlYWRlci5nZXRVc2UoKTsKLQkJaWYgKHVzZSAhPSBudWxsKSB7Ci0JCQlleHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgidXNlIiwgdXNlLCBudWxsKTsKLQkJfQotCQlpZiAoaGVhZGVyLnBhcnQoKSAhPSBudWxsKSB7Ci0JCQlleHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgicGFydCIsIGhlYWRlci5wYXJ0KCksIG51bGwpOwotCQl9Ci0JCWlmIChoZWFkZXIuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWV4dEVsZW1lbnQuYWRkQXR0cmlidXRlKCJtZXNzYWdlIiwgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeCgKLQkJCQkJdGFyZ2V0TmFtZXNwYWNlLCBheGlzU2VydmljZS5nZXROYW1lc3BhY2VNYXAoKSkKLQkJCQkJKyAiOiIgKyBoZWFkZXIuZ2V0TWVzc2FnZSgpLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQb2xpY3lBc0V4dEVsZW1lbnQoaW50IHR5cGUsIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSwKLQkJCU9NRWxlbWVudCBwYXJlbnRFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gcG9saWN5SW5jbHVkZS5nZXRQb2xpY3lFbGVtZW50cyh0eXBlKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBwb2xpY3lFbGVtZW50IDogZWxlbWVudExpc3QpIHsKLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGNoaWxkID0gUG9saWN5VXRpbC5nZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChQb2xpY3lDb21wb25lbnQpcG9saWN5RWxlbWVudCwgc2VyaWFsaXplcik7Ci0KLS8vICAgICAgICAgICAgICAgIE9NTm9kZSBmaXJzdENoaWxkRWxlbSA9IHBhcmVudEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiAoZmlyc3RDaGlsZEVsZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHBhcmVudEVsZW1lbnQuYWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlyc3RDaGlsZEVsZW0uaW5zZXJ0U2libGluZ0JlZm9yZShjaGlsZCk7Ci0gICAgICAgICAgICAgICAgLy8gfQotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBPTSBpbnNlcnRTaWJsaW5nQmVmb3JlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAvLyB3aXRoCi0gICAgICAgICAgICAgICAgLy8gZHJvcHMgdGhlIGFscmVhZHkgZXhpc3RzIGVsZW1lbnRzLgotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZXJlIGlzIG5vIGFueSB0ZWNoaWNhbCBwcm9ibGVtIG9mIGFkZGluZyBwb2xpY3kKLSAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBhZnRlciBvdGhlcgotICAgICAgICAgICAgICAgIC8vIGNoaWxkcmVuIHRlbXBvcmFsaXkgZml4IHRoaXMgYXMgaXQgaXMuCi0gICAgICAgICAgICAgICAgLy8gb25lIE9NIGZpeCB0aGlzIGlzc3VlIHdlIGNhbiByZXZlcnQgdGhpcyBjaGFuZ2UuCi0gICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hZGRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeVJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IFBvbGljeVV0aWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgoUG9saWN5Q29tcG9uZW50KXBvbGljeUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmaXJzdENoaWxkRWxlbSA9IHBhcmVudEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDaGlsZEVsZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LmFkZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaXJzdENoaWxkRWxlbS5pbnNlcnRTaWJsaW5nQmVmb3JlKGNoaWxkKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQb2xpY3lSZWdpc3RyeSByZWcgPSBwb2xpY3lJbmNsdWRlLmdldFBvbGljeVJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICgoUG9saWN5UmVmZXJlbmNlKXBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCIjIikpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZigiIyIpICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUG9saWN5IHAgPSByZWcubG9va3VwKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFkZFBvbGljeVRvRGVmaW5pdGlvbkVsZW1lbnQoa2V5LCBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQb2xpY2llc1RvRGVmaW5pdGlvbkVsZW1lbnQoSXRlcmF0b3IgaXRlcmF0b3IsCi0JCQlPTUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlQb2xpY3kgcG9saWN5OwotCQlPTUVsZW1lbnQgcG9saWN5RWxlbWVudDsKLQkJT01Ob2RlIGZpcnN0Q2hpbGQ7Ci0KLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCXBvbGljeSA9IChQb2xpY3kpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCXBvbGljeUVsZW1lbnQgPSBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KHBvbGljeSwKLQkJCQkJc2VyaWFsaXplcik7Ci0JCQlmaXJzdENoaWxkID0gZGVmaW5pdGlvbi5nZXRGaXJzdE9NQ2hpbGQoKTsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQlmaXJzdENoaWxkLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5RWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmluaXRpb25FbGVtZW50LmFkZENoaWxkKHBvbGljeUVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljeVRvRGVmaW5pdGlvbkVsZW1lbnQoU3RyaW5nIGtleSwgUG9saWN5IHBvbGljeSkgewotCQlwb2xpY2llc0luRGVmaW5pdGlvbnMucHV0KGtleSwgcG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgewotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7Ci0JCXRoaXMuc3R5bGUgPSBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZSgpIHsKLQkJcmV0dXJuIHVzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIHVzZSkgewotCQl0aGlzLnVzZSA9IHVzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVTb2FwMTFQb3J0KE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBkZWZpbml0aW9uLAotCQkJT01FbGVtZW50IHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCUF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQ7Ci0JCUF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nOwotCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJYXhpc0VuZHBvaW50ID0gKEF4aXNFbmRwb2ludCkgaXRlcmF0b3IubmV4dCgpOwotCQkJLyoKLQkJCSAqIFNvbWUgdHJhbnNwb3J0cyBtaWdodCBub3QgYmUgYWN0aXZlIGF0IHJ1bnRpbWUuCi0JCQkgKi8KLQkJCWlmICghYXhpc0VuZHBvaW50LmlzQWN0aXZlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLQkJCVN0cmluZyB0eXBlID0gYXhpc0JpbmRpbmcuZ2V0VHlwZSgpOwotCQkJaWYgKEphdmEyV1NETENvbnN0YW50cy5UUkFOU1BPUlRfVVJJLmVxdWFscyh0eXBlKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUC5lcXVhbHModHlwZSkpIHsKLQkJCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIGF4aXNCaW5kaW5nCi0JCQkJCQkuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLQkJCQlpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHModmVyc2lvbikpIHsKLQkJCQkJT01FbGVtZW50IHBvcnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KFBPUlQsIHdzZGwpOwotCQkJCQlzZXJ2aWNlLmFkZENoaWxkKHBvcnQpOwotCQkJCQlwb3J0LmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgYXhpc0VuZHBvaW50LmdldE5hbWUoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJUU5hbWUgcW5hbWUgPSBheGlzQmluZGluZy5nZXROYW1lKCk7Ci0JCQkJCXBvcnQuYWRkQXR0cmlidXRlKEJJTkRJTkdfTE9DQUxfTkFNRSwgdG5zLmdldFByZWZpeCgpICsgIjoiCi0JCQkJCQkJKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0JCQkJCVN0cmluZyBlbmRwb2ludFVSTCA9IGdldEVuZHBvaW50VVJMKGF4aXNFbmRwb2ludCk7Ci0JCQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KGZhYywgcG9ydCwKLQkJCQkJCQlTT0FQX0FERFJFU1MsIExPQ0FUSU9OLCAoZW5kcG9pbnRVUkwgPT0gbnVsbCkgPyAiIgotCQkJCQkJCQkJOiBlbmRwb2ludFVSTCwgc29hcCk7Ci0JCQkJCWdlbmVyYXRlRVBSRWxlbWVudChmYWMsIHBvcnQsIGVuZHBvaW50VVJMKTsKLQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNFbmRwb2ludCwgcG9ydCk7Ci0JCQkJCWdlbmVyYXRlU29hcDExQmluZGluZyhmYWMsIGRlZmluaXRpb24sIGF4aXNFbmRwb2ludAotCQkJCQkJCS5nZXRCaW5kaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvYXAxMlBvcnQoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmluaXRpb24sCi0JCQlPTUVsZW1lbnQgc2VydmljZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLyBGSVhNRSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50OwotCQlBeGlzQmluZGluZyBheGlzQmluZGluZzsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWF4aXNFbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCS8qCi0JCQkgKiAKLQkJCSAqLwotCQkJaWYgKCFheGlzRW5kcG9pbnQuaXNBY3RpdmUoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotCQkJU3RyaW5nIHR5cGUgPSBheGlzQmluZGluZy5nZXRUeXBlKCk7Ci0JCQlpZiAoSmF2YTJXU0RMQ29uc3RhbnRzLlRSQU5TUE9SVF9VUkkuZXF1YWxzKHR5cGUpCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLmVxdWFscyh0eXBlKSkgewotCQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgYXhpc0JpbmRpbmcKLQkJCQkJCS5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04pOwotCQkJCWlmIChTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyh2ZXJzaW9uKSkgewotCi0JCQkJCU9NRWxlbWVudCBwb3J0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChQT1JULCB3c2RsKTsKLQkJCQkJc2VydmljZS5hZGRDaGlsZChwb3J0KTsKLQkJCQkJcG9ydC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGF4aXNFbmRwb2ludC5nZXROYW1lKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQkJCQlwb3J0LmFkZEF0dHJpYnV0ZShCSU5ESU5HX0xPQ0FMX05BTUUsIHRucy5nZXRQcmVmaXgoKSArICI6IgotCQkJCQkJCSsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQkJCQlTdHJpbmcgZW5kcG9pbnRVUkwgPSBnZXRFbmRwb2ludFVSTChheGlzRW5kcG9pbnQpOwotCQkJCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIHBvcnQsCi0JCQkJCQkJU09BUF9BRERSRVNTLCBMT0NBVElPTiwgKGVuZHBvaW50VVJMID09IG51bGwpID8gIiIKLQkJCQkJCQkJCTogZW5kcG9pbnRVUkwsIHNvYXAxMik7Ci0JCQkJCWdlbmVyYXRlRVBSRWxlbWVudChmYWMsIHBvcnQsIGVuZHBvaW50VVJMKTsKLQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNFbmRwb2ludCwgcG9ydCk7Ci0JCQkJCWdlbmVyYXRlU29hcDEyQmluZGluZyhmYWMsIGRlZmluaXRpb24sIGF4aXNFbmRwb2ludAotCQkJCQkJCS5nZXRCaW5kaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUh0dHBQb3J0KE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBkZWZpbml0aW9uLAotCQkJT01FbGVtZW50IHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8gRklYTUUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludDsKLQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmc7Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlheGlzRW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvKgotCQkJICogCi0JCQkgKi8KLQkJCWlmICghYXhpc0VuZHBvaW50LmlzQWN0aXZlKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLQkJCVN0cmluZyB0eXBlID0gYXhpc0JpbmRpbmcuZ2V0VHlwZSgpOwotCQkJaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotCQkJCU9NRWxlbWVudCBwb3J0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChQT1JULCB3c2RsKTsKLQkJCQlzZXJ2aWNlLmFkZENoaWxkKHBvcnQpOwotCQkJCXBvcnQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBheGlzRW5kcG9pbnQuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCQlRTmFtZSBxbmFtZSA9IGF4aXNCaW5kaW5nLmdldE5hbWUoKTsKLQkJCQlwb3J0LmFkZEF0dHJpYnV0ZShCSU5ESU5HX0xPQ0FMX05BTUUsIHRucy5nZXRQcmVmaXgoKSArICI6IgotCQkJCQkJKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0JCQkJT01FbGVtZW50IGV4dEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhZGRyZXNzIiwgaHR0cCk7Ci0JCQkJU3RyaW5nIGVuZHBvaW50VVJMID0gZ2V0RW5kcG9pbnRVUkwoYXhpc0VuZHBvaW50KTsKLQkJCQlleHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgibG9jYXRpb24iLCAoZW5kcG9pbnRVUkwgPT0gbnVsbCkgPyAiIgotCQkJCQkJOiBlbmRwb2ludFVSTCwgbnVsbCk7Ci0JCQkJcG9ydC5hZGRDaGlsZChleHRFbGVtZW50KTsKLQotCQkJCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzRW5kcG9pbnQsIHBvcnQpOwotCQkJCWdlbmVyYXRlSHR0cEJpbmRpbmcoZmFjLCBkZWZpbml0aW9uLCBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvYXAxMUJpbmRpbmcoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmludGlvbnMsCi0JCQlBeGlzQmluZGluZyBheGlzQmluZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChpc0FscmVhZHlBZGRlZChheGlzQmluZGluZywgZGVmaW50aW9ucykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlPTUVsZW1lbnQgYmluZGluZyA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoQklORElOR19MT0NBTF9OQU1FLCB3c2RsKTsKLQkJT01FbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gZGVmaW50aW9ucy5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotCQkJCXdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksIFNFUlZJQ0VfTE9DQUxfTkFNRSkpOwotCQlzZXJ2aWNlRWxlbWVudC5pbnNlcnRTaWJsaW5nQmVmb3JlKGJpbmRpbmcpOwotCi0JCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZSgidHlwZSIsIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lCi0JCQkJKyBQT1JUX1RZUEVfU1VGRklYLCBudWxsKTsKLQotCQkvLyBBZGRpbmcgZXh0IGVsZW1lbnRzCi0JCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZywgYmluZGluZyk7Ci0JCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBiaW5kaW5nLCBCSU5ESU5HX0xPQ0FMX05BTUUsIFRSQU5TUE9SVCwKLQkJCQlUUkFOU1BPUlRfVVJJLCBTVFlMRSwgc3R5bGUsIHNvYXApOwotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBBZGQgV1MtQWRkcmVzc2luZyBVc2luZ0FkZHJlc3NpbmcgZWxlbWVudCBpZiBhcHByb3ByaWF0ZQotCQkvLyBTSE9VTEQgYmUgb24gdGhlIGJpbmRpbmcgZWxlbWVudCBwZXIgdGhlIHNwZWNpZmljYXRpb24KLQkJaWYgKEFkZHJlc3NpbmdIZWxwZXIKLQkJCQkuZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoYXhpc1NlcnZpY2UpLmVxdWFscygKLQkJCQkJCUFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19PUFRJT05BTCkpIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KGZhYywgYmluZGluZywKLQkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5VU0lOR19BRERSRVNTSU5HLAotCQkJCQlERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCArICI6cmVxdWlyZWQiLCAidHJ1ZSIsIHdzYXcpOwotCQl9IGVsc2UgaWYgKEFkZHJlc3NpbmdIZWxwZXIuZ2V0QWRkcmVzc2luZ1JlcXVpcmVtZW50UGFyZW1ldGVyVmFsdWUoCi0JCQkJYXhpc1NlcnZpY2UpLmVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpKSB7Ci0JCQlXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIGJpbmRpbmcsCi0JCQkJCUFkZHJlc3NpbmdDb25zdGFudHMuVVNJTkdfQUREUkVTU0lORywKLQkJCQkJREVGQVVMVF9XU0RMX05BTUVTUEFDRV9QUkVGSVggKyAiOnJlcXVpcmVkIiwgInRydWUiLCB3c2F3KTsKLQkJfQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkJZm9yIChJdGVyYXRvciBheGlzQmluZGluZ09wZXJhdGlvbnMgPSBheGlzQmluZGluZy5nZXRDaGlsZHJlbigpOyBheGlzQmluZGluZ09wZXJhdGlvbnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGF4aXNCaW5kaW5nT3BlcmF0aW9ucwotCQkJCQkubmV4dCgpOwotCQkJQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJLmdldEF4aXNPcGVyYXRpb24oKTsKLQkJCWlmIChheGlzT3BlcmF0aW9uLmlzQ29udHJvbE9wZXJhdGlvbigpCi0JCQkJCXx8IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyBvcGVhcnRpb25OYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQlPTUVsZW1lbnQgb3BlcmF0aW9uID0gZmFjLmNyZWF0ZU9NRWxlbWVudChPUEVSQVRJT05fTE9DQUxfTkFNRSwKLQkJCQkJd3NkbCk7Ci0JCQliaW5kaW5nLmFkZENoaWxkKG9wZXJhdGlvbik7Ci0JCQlTdHJpbmcgc29hcEFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0U29hcEFjdGlvbigpOwotCQkJaWYgKHNvYXBBY3Rpb24gPT0gbnVsbCkgewotCQkJCXNvYXBBY3Rpb24gPSAiIjsKLQkJCX0KLQkJCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZ09wZXJhdGlvbiwgb3BlcmF0aW9uKTsKLQkJCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBvcGVyYXRpb24sIE9QRVJBVElPTl9MT0NBTF9OQU1FLAotCQkJCQlTT0FQX0FDVElPTiwgc29hcEFjdGlvbiwgU1RZTEUsIHN0eWxlLCBzb2FwKTsKLQotCQkJLy8gYWRkUG9saWN5QXNFeHRFbGVtZW50KFBvbGljeUluY2x1ZGUuQklORElOR19PUEVSQVRJT05fUE9MSUNZLAotCQkJLy8gYXhpc09wZXJhdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCksIG9wZXJhdGlvbik7Ci0KLQkJCVN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0JCQkJQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nSW5NZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCQkJCWlmIChheGlzQmluZGluZ0luTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCUF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ0luTWVzc2FnZQotCQkJCQkJCS5nZXRBeGlzTWVzc2FnZSgpOwotCi0JCQkJCWlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCW9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIG9wZWFydGlvbk5hbWUsCi0JCQkJCQkJCW51bGwpOwotCQkJCQkJT01FbGVtZW50IGlucHV0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJCQkJSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nSW5NZXNzYWdlLCBpbnB1dCk7Ci0JCQkJCQlhZGRFeHRlbnNpb25FbGVtZW50KGZhYywgaW5wdXQsIFNPQVBfQk9EWSwgU09BUF9VU0UsCi0JCQkJCQkJCXVzZSwgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBzb2FwKTsKLQkJCQkJCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkJJTkRJTkdfSU5QVVRfUE9MSUNZLAotCQkJCQkJLy8gaW5heGlzTWVzc2FnZS5nZXRQb2xpY3lJbmNsdWRlKCksIGlucHV0KTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJCQl3cml0ZVNvYXBIZWFkZXJzKGluYXhpc01lc3NhZ2UsIGZhYywgaW5wdXQsIHNvYXAxMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0KLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdPdXRNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJQXhpc01lc3NhZ2Ugb3V0QXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ091dE1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQkJCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCU9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJCQlPVVRfUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nT3V0TWVzc2FnZSwgb3V0cHV0KTsKLQkJCQkJCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBvdXRwdXQsIFNPQVBfQk9EWSwgU09BUF9VU0UsCi0JCQkJCQkJCXVzZSwgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBzb2FwKTsKLQkJCQkJCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkJJTkRJTkdfT1VUUFVUX1BPTElDWSwKLQkJCQkJCS8vIG91dEF4aXNNZXNzYWdlLmdldFBvbGljeUluY2x1ZGUoKSwgb3V0cHV0KTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChvdXRwdXQpOwotCQkJCQkJd3JpdGVTb2FwSGVhZGVycyhvdXRBeGlzTWVzc2FnZSwgZmFjLCBvdXRwdXQsIHNvYXAxMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdlbmVyYXRlIGZhdWx0IE1lc3NhZ2VzCi0JCQlBcnJheUxpc3QgZmF1bHR5TWVzc2FnZXMgPSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRGYXVsdHMoKTsKLQkJCWlmIChmYXVsdHlNZXNzYWdlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmF1bHR5TWVzc2FnZTEgOiBmYXVsdHlNZXNzYWdlcykgewotICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYmluZGluZ0ZhdWx0eU1lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKWZhdWx0eU1lc3NhZ2UxOwotICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ0ZhdWx0eU1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHR5TWVzc2FnZSA9IGJpbmRpbmdGYXVsdHlNZXNzYWdlLmdldEF4aXNNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmYXVsdCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoRkFVTFRfTE9DQUxfTkFNRSwgd3NkbCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBvbGljeUFzRXh0RWxlbWVudChiaW5kaW5nRmF1bHR5TWVzc2FnZSwgZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIGZhdWx0LCBGQVVMVF9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQX1VTRSwgdXNlLCBBVFRSSUJVVEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHR5TWVzc2FnZS5nZXROYW1lKCksIHNvYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBmYXVsdHlNZXNzYWdlLmdldE5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgcG9saWNpZXMgZm9yIGZhdWx0IG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWRkQ2hpbGQoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTb2FwSGVhZGVycyhmYXVsdHlNZXNzYWdlLCBmYWMsIGZhdWx0LCBzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNvYXAxMkJpbmRpbmcoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmluaXRpb25zLAotCQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaXNBbHJlYWR5QWRkZWQoYXhpc0JpbmRpbmcsIGRlZmluaXRpb25zKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9NRWxlbWVudCBiaW5kaW5nID0gZmFjLmNyZWF0ZU9NRWxlbWVudChCSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBkZWZpbml0aW9ucy5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotCQkJCXdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksIFNFUlZJQ0VfTE9DQUxfTkFNRSkpOwotCQlzZXJ2aWNlRWxlbWVudC5pbnNlcnRTaWJsaW5nQmVmb3JlKGJpbmRpbmcpOwotCi0JCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZSgidHlwZSIsIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lCi0JCQkJKyBQT1JUX1RZUEVfU1VGRklYLCBudWxsKTsKLQotCQkvLyBBZGRpbmcgZXh0IGVsZW1lbnRzCi0JCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZywgYmluZGluZyk7Ci0JCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBiaW5kaW5nLCBCSU5ESU5HX0xPQ0FMX05BTUUsIFRSQU5TUE9SVCwKLQkJCQlUUkFOU1BPUlRfVVJJLCBTVFlMRSwgc3R5bGUsIHNvYXAxMik7Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCS8vIEFkZCBXUy1BZGRyZXNzaW5nIFVzaW5nQWRkcmVzc2luZyBlbGVtZW50IGlmIGFwcHJvcHJpYXRlCi0JCS8vIFNIT1VMRCBiZSBvbiB0aGUgYmluZGluZyBlbGVtZW50IHBlciB0aGUgc3BlY2lmaWNhdGlvbgotCQlpZiAoQWRkcmVzc2luZ0hlbHBlcgotCQkJCS5nZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZShheGlzU2VydmljZSkuZXF1YWxzKAotCQkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX09QVElPTkFMKSkgewotCQkJV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBiaW5kaW5nLAotCQkJCQlBZGRyZXNzaW5nQ29uc3RhbnRzLlVTSU5HX0FERFJFU1NJTkcsCi0JCQkJCURFRkFVTFRfV1NETF9OQU1FU1BBQ0VfUFJFRklYICsgIjpyZXF1aXJlZCIsICJ0cnVlIiwgd3Nhdyk7Ci0JCX0gZWxzZSBpZiAoQWRkcmVzc2luZ0hlbHBlci5nZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZSgKLQkJCQlheGlzU2VydmljZSkuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCkpIHsKLQkJCVdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KGZhYywgYmluZGluZywKLQkJCQkJQWRkcmVzc2luZ0NvbnN0YW50cy5VU0lOR19BRERSRVNTSU5HLAotCQkJCQlERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCArICI6cmVxdWlyZWQiLCAidHJ1ZSIsIHdzYXcpOwotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCQlmb3IgKEl0ZXJhdG9yIGF4aXNCaW5kaW5nT3BlcmF0aW9ucyA9IGF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7IGF4aXNCaW5kaW5nT3BlcmF0aW9ucwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmdPcGVyYXRpb25zCi0JCQkJCS5uZXh0KCk7Ci0JCQlBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzQmluZGluZ09wZXJhdGlvbgotCQkJCQkuZ2V0QXhpc09wZXJhdGlvbigpOwotCQkJaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkKLQkJCQkJfHwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIG9wZWFydGlvbk5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCU9NRWxlbWVudCBvcGVyYXRpb24gPSBmYWMuY3JlYXRlT01FbGVtZW50KE9QRVJBVElPTl9MT0NBTF9OQU1FLAotCQkJCQl3c2RsKTsKLQkJCWJpbmRpbmcuYWRkQ2hpbGQob3BlcmF0aW9uKTsKLQkJCVN0cmluZyBzb2FwQWN0aW9uID0gYXhpc09wZXJhdGlvbi5nZXRTb2FwQWN0aW9uKCk7Ci0JCQlpZiAoc29hcEFjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc29hcEFjdGlvbiA9ICIiOwotCQkJfQotCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBvcGVyYXRpb24pOwotCQkJYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIG9wZXJhdGlvbiwgT1BFUkFUSU9OX0xPQ0FMX05BTUUsCi0JCQkJCVNPQVBfQUNUSU9OLCBzb2FwQWN0aW9uLCBTVFlMRSwgc3R5bGUsIHNvYXAxMik7Ci0KLQkJCS8vIGFkZFBvbGljeUFzRXh0RWxlbWVudChQb2xpY3lJbmNsdWRlLkJJTkRJTkdfT1BFUkFUSU9OX1BPTElDWSwKLQkJCS8vIGF4aXNPcGVyYXRpb24uZ2V0UG9saWN5SW5jbHVkZSgpLCBvcGVyYXRpb24pOwotCi0JCQlTdHJpbmcgTUVQID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCkKLQkJCQkJfHwgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSkgewotCQkJCUF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0luTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIGF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdJbk1lc3NhZ2UgIT0gbnVsbCkgewotCQkJCQlBeGlzTWVzc2FnZSBpbmF4aXNNZXNzYWdlID0gYXhpc0JpbmRpbmdJbk1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQotCQkJCQlpZiAoaW5heGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlvcGVyYXRpb24uYWRkQXR0cmlidXRlKEFUVFJJQlVURV9OQU1FLCBvcGVhcnRpb25OYW1lLAotCQkJCQkJCQludWxsKTsKLQkJCQkJCU9NRWxlbWVudCBpbnB1dCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoCi0JCQkJCQkJCUlOX1BVVF9MT0NBTF9OQU1FLCB3c2RsKTsKLQkJCQkJCWFkZFBvbGljeUFzRXh0RWxlbWVudChheGlzQmluZGluZ0luTWVzc2FnZSwgaW5wdXQpOwotCQkJCQkJYWRkRXh0ZW5zaW9uRWxlbWVudChmYWMsIGlucHV0LCBTT0FQX0JPRFksIFNPQVBfVVNFLAotCQkJCQkJCQl1c2UsIG51bGwsIHRhcmdldE5hbWVzcGFjZSwgc29hcDEyKTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJCQl3cml0ZVNvYXBIZWFkZXJzKGluYXhpc01lc3NhZ2UsIGZhYywgaW5wdXQsIHNvYXAxMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0KLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdPdXRNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJQXhpc01lc3NhZ2Ugb3V0QXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ091dE1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQkJCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCU9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJCQlPVVRfUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJYWRkUG9saWN5QXNFeHRFbGVtZW50KGF4aXNCaW5kaW5nT3V0TWVzc2FnZSwgb3V0cHV0KTsKLQkJCQkJCWFkZEV4dGVuc2lvbkVsZW1lbnQoZmFjLCBvdXRwdXQsIFNPQVBfQk9EWSwgU09BUF9VU0UsCi0JCQkJCQkJCXVzZSwgbnVsbCwgdGFyZ2V0TmFtZXNwYWNlLCBzb2FwMTIpOwotCQkJCQkJLy8gYWRkUG9saWN5QXNFeHRFbGVtZW50KFBvbGljeUluY2x1ZGUuQklORElOR19PVVRQVVRfUE9MSUNZLAotCQkJCQkJLy8gb3V0QXhpc01lc3NhZ2UuZ2V0UG9saWN5SW5jbHVkZSgpLCBvdXRwdXQpOwotCQkJCQkJb3BlcmF0aW9uLmFkZENoaWxkKG91dHB1dCk7Ci0JCQkJCQl3cml0ZVNvYXBIZWFkZXJzKG91dEF4aXNNZXNzYWdlLCBmYWMsIG91dHB1dCwgc29hcDEyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2VuZXJhdGUgZmF1bHQgTWVzc2FnZXMKLQkJCUFycmF5TGlzdCBmYXVsdHlNZXNzYWdlcyA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEZhdWx0cygpOwotCQkJaWYgKGZhdWx0eU1lc3NhZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBmYXVsdHlNZXNzYWdlMSA6IGZhdWx0eU1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nRmF1bHR5TWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpZmF1bHR5TWVzc2FnZTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHR5TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdHlNZXNzYWdlID0gYmluZGluZ0ZhdWx0eU1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZmF1bHQgPSBmYWMuY3JlYXRlT01FbGVtZW50KEZBVUxUX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUG9saWN5QXNFeHRFbGVtZW50KGJpbmRpbmdGYXVsdHlNZXNzYWdlLCBmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHRlbnNpb25FbGVtZW50KGZhYywgZmF1bHQsIEZBVUxUX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBfVVNFLCB1c2UsIEFUVFJJQlVURV9OQU1FLCBmYXVsdHlNZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCksIHNvYXAxMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdC5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIGZhdWx0eU1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgcG9saWNpZXMgZm9yIGZhdWx0IG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWRkQ2hpbGQoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVTb2FwSGVhZGVycyhmYXVsdHlNZXNzYWdlLCBmYWMsIGZhdWx0LCBzb2FwMTIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHR0cEJpbmRpbmcoT01GYWN0b3J5IGZhYywgT01FbGVtZW50IGRlZmluaXRpb25zLAotCQkJQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoaXNBbHJlYWR5QWRkZWQoYXhpc0JpbmRpbmcsIGRlZmluaXRpb25zKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU9NRWxlbWVudCBiaW5kaW5nID0gZmFjLmNyZWF0ZU9NRWxlbWVudChCSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotCQlPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBkZWZpbml0aW9ucy5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotCQkJCXdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksIFNFUlZJQ0VfTE9DQUxfTkFNRSkpOwotCQlzZXJ2aWNlRWxlbWVudC5pbnNlcnRTaWJsaW5nQmVmb3JlKGJpbmRpbmcpOwotCi0JCVFOYW1lIHFuYW1lID0gYXhpc0JpbmRpbmcuZ2V0TmFtZSgpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgcW5hbWUuZ2V0TG9jYWxQYXJ0KCksIG51bGwpOwotCQliaW5kaW5nLmFkZEF0dHJpYnV0ZSgidHlwZSIsIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lCi0JCQkJKyBQT1JUX1RZUEVfU1VGRklYLCBudWxsKTsKLQotCQlPTUVsZW1lbnQgaHR0cEJpbmRpbmcgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJiaW5kaW5nIiwgaHR0cCk7Ci0JCWJpbmRpbmcuYWRkQ2hpbGQoaHR0cEJpbmRpbmcpOwotCQlodHRwQmluZGluZy5hZGRBdHRyaWJ1dGUoInZlcmIiLCAiUE9TVCIsIG51bGwpOwotCi0JCWZvciAoSXRlcmF0b3IgYXhpc0JpbmRpbmdPcGVyYXRpb25zID0gYXhpc0JpbmRpbmcuZ2V0Q2hpbGRyZW4oKTsgYXhpc0JpbmRpbmdPcGVyYXRpb25zCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBheGlzQmluZGluZ09wZXJhdGlvbnMKLQkJCQkJLm5leHQoKTsKLQkJCUF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCQkJCS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0JCQlpZiAoYXhpc09wZXJhdGlvbi5pc0NvbnRyb2xPcGVyYXRpb24oKQotCQkJCQl8fCBheGlzT3BlcmF0aW9uLmdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgb3BlYXJ0aW9uTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJT01FbGVtZW50IG9wZXJhdGlvbiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoT1BFUkFUSU9OX0xPQ0FMX05BTUUsCi0JCQkJCXdzZGwpOwotCQkJYmluZGluZy5hZGRDaGlsZChvcGVyYXRpb24pOwotCi0JCQlPTUVsZW1lbnQgaHR0cE9wZXJhdGlvbiA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIm9wZXJhdGlvbiIsIGh0dHApOwotCQkJb3BlcmF0aW9uLmFkZENoaWxkKGh0dHBPcGVyYXRpb24pOwotCQkJaHR0cE9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgc2VydmljZU5hbWUgKyAiLyIKLQkJCQkJKyBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0KLQkJCVN0cmluZyBNRVAgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLQotCQkJaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVC5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTi5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWS5lcXVhbHMoTUVQKQotCQkJCQl8fCBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0JCQkJQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nSW5NZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCQkJCWlmIChheGlzQmluZGluZ0luTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCUF4aXNNZXNzYWdlIGluYXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ0luTWVzc2FnZQotCQkJCQkJCS5nZXRBeGlzTWVzc2FnZSgpOwotCi0JCQkJCWlmIChpbmF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCW9wZXJhdGlvbi5hZGRBdHRyaWJ1dGUoQVRUUklCVVRFX05BTUUsIG9wZWFydGlvbk5hbWUsCi0JCQkJCQkJCW51bGwpOwotCQkJCQkJT01FbGVtZW50IGlucHV0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgKLQkJCQkJCQkJSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJT01FbGVtZW50IGlucHV0ZWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImNvbnRlbnQiLAotCQkJCQkJCQltaW1lKTsKLQkJCQkJCWlucHV0LmFkZENoaWxkKGlucHV0ZWxlbWVudCk7Ci0JCQkJCQlpbnB1dGVsZW1lbnQuYWRkQXR0cmlidXRlKCJ0eXBlIiwgInRleHQveG1sIiwgbnVsbCk7Ci0JCQkJCQlpbnB1dGVsZW1lbnQuYWRkQXR0cmlidXRlKCJwYXJ0IiwgYXhpc09wZXJhdGlvbgotCQkJCQkJCQkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChpbnB1dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhNRVApCi0JCQkJCXx8IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKSB7Ci0KLQkJCQlBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gKEF4aXNCaW5kaW5nTWVzc2FnZSkgYXhpc0JpbmRpbmdPcGVyYXRpb24KLQkJCQkJCS5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQkJCQlpZiAoYXhpc0JpbmRpbmdPdXRNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJQXhpc01lc3NhZ2Ugb3V0QXhpc01lc3NhZ2UgPSBheGlzQmluZGluZ091dE1lc3NhZ2UKLQkJCQkJCQkuZ2V0QXhpc01lc3NhZ2UoKTsKLQkJCQkJaWYgKG91dEF4aXNNZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCU9NRWxlbWVudCBvdXRwdXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KAotCQkJCQkJCQlPVVRfUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotCQkJCQkJT01FbGVtZW50IG91dEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJjb250ZW50IiwKLQkJCQkJCQkJbWltZSk7Ci0JCQkJCQlvdXRFbGVtZW50LmFkZENoaWxkKG91dEVsZW1lbnQpOwotCQkJCQkJb3V0RWxlbWVudC5hZGRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC94bWwiLCBudWxsKTsKLQkJCQkJCW91dEVsZW1lbnQuYWRkQXR0cmlidXRlKCJwYXJ0IiwgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkKLQkJCQkJCQkJLmdldExvY2FsUGFydCgpLCBudWxsKTsKLQkJCQkJCW91dHB1dC5hZGRDaGlsZChvdXRFbGVtZW50KTsKLQkJCQkJCW9wZXJhdGlvbi5hZGRDaGlsZChvdXRwdXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljeUFzRXh0RWxlbWVudChBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uLAotCQkJT01FbGVtZW50IHdzZGxFbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKTsKLQkJQ29sbGVjdGlvbiBhdHRhY2hQb2xpY3lDb21wb25lbnRzID0gcG9saWN5U3ViamVjdAotCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKTsKLQotICAgICAgICBmb3IgKE9iamVjdCBwb2xpY3lFbGVtZW50IDogYXR0YWNoUG9saWN5Q29tcG9uZW50cykgewotICAgICAgICAgICAgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3kpIHsKLSAgICAgICAgICAgICAgICBQb2xpY3lSZWZlcmVuY2UgcG9saWN5UmVmZXJlbmNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeVV0aWwuY3JlYXRlUG9saWN5UmVmZXJlbmNlKChQb2xpY3kpcG9saWN5RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHBvbGljeVJlZkVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgUG9saWN5VXRpbC5nZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudChwb2xpY3lSZWZlcmVuY2UsIHNlcmlhbGl6ZXIpOwotCi0gICAgICAgICAgICAgICAgT01Ob2RlIGZpcnN0Q2hpbGRFbGVtID0gd3NkbEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGRFbGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbEVsZW1lbnQuYWRkQ2hpbGQocG9saWN5UmVmRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGlsZEVsZW0uaW5zZXJ0U2libGluZ0JlZm9yZShwb2xpY3lSZWZFbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBvbGljeVJlZmVyZW5jZS5nZXRVUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoIiMiKSkgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKGtleS5pbmRleE9mKCIjIikgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUG9saWN5VG9EZWZpbml0aW9uRWxlbWVudChrZXksIChQb2xpY3kpcG9saWN5RWxlbWVudCk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeVJlZmVyZW5jZSkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBjaGlsZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KChQb2xpY3lDb21wb25lbnQpcG9saWN5RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplcik7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGZpcnN0Q2hpbGRFbGVtID0gd3NkbEVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDaGlsZEVsZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB3c2RsRWxlbWVudC5hZGRDaGlsZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RDaGlsZEVsZW0uaW5zZXJ0U2libGluZ0JlZm9yZShjaGlsZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9ICgoUG9saWN5UmVmZXJlbmNlKXBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoIiMiKSArIDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFBvbGljeUxvY2F0b3IgbG9jYXRvciA9IG5ldyBQb2xpY3lMb2NhdG9yKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBQb2xpY3kgcCA9IGxvY2F0b3IubG9va3VwKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIgKyBrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRQb2xpY3lUb0RlZmluaXRpb25FbGVtZW50KGtleSwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUG9saWN5QXNFeHRBdHRyaWJ1dGUoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwKLQkJCU9NRWxlbWVudCBlbGVtZW50LCBPTUZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKTsKLQkJQXJyYXlMaXN0IHBvbGljeVVSSXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgZm9yIChPYmplY3QgcG9saWN5RWxlbWVudCA6IHBvbGljeVN1YmplY3QuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0KLSAgICAgICAgICAgIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgUG9saWN5IHAgPSAoUG9saWN5KXBvbGljeUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAocC5nZXRJZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gIiMiICsgcC5nZXRJZCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocC5nZXROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBwLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgYWRkIHRoZSBQb2xpY3kgYXMgYW4gZXh0ZW5zaWJpbGl0eSBhdHRyaWJ1dGUgc2luY2UgaXQgZG9lc24ndCBoYXZlIGEgaWQgb3IgYSBuYW1lIGF0dHJpYnV0ZSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBvbGljeVVSSXMuYWRkKGtleSk7Ci0gICAgICAgICAgICAgICAgYWRkUG9saWN5VG9EZWZpbml0aW9uRWxlbWVudChrZXksIHApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gKChQb2xpY3lSZWZlcmVuY2UpcG9saWN5RWxlbWVudCkuZ2V0VVJJKCk7Ci0gICAgICAgICAgICAgICAgUG9saWN5TG9jYXRvciBsb2NhdG9yID0gbmV3IFBvbGljeUxvY2F0b3IoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IHVyaS5zdWJzdHJpbmcodXJpLmluZGV4T2YoJyMnKSArIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGtleSA9IHVyaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQb2xpY3kgcCA9IGxvY2F0b3IubG9va3VwKGtleSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgcmVzb2x2ZSAiICsgdXJpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBhIFBvbGljeSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb2xpY3lVUklzLmFkZCh1cmkpOwotICAgICAgICAgICAgICAgIGFkZFBvbGljeVRvRGVmaW5pdGlvbkVsZW1lbnQoa2V5LCBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JCWlmICghcG9saWN5VVJJcy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0KLQkJCS8qCi0JCQkgKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIFN0cmluZyB0aGF0IGlzIGxpa2UgJ3VyaTEgdXJpMiAuLiIgdG8gc2V0IGFzCi0JCQkgKiB0aGUgdmFsdWUgb2YgdGhlIHdzcDpQb2xpY3lVUklzIGF0dHJpYnV0ZS4KLQkJCSAqLwotICAgICAgICAgICAgZm9yIChPYmplY3QgcG9saWN5VVJJIDogcG9saWN5VVJJcykgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSAoU3RyaW5nKXBvbGljeVVSSTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA9PSBudWxsKSA/IHVyaSA6IHZhbHVlICsgIiAiICsgdXJpOwotICAgICAgICAgICAgfQotCi0JCQlPTU5hbWVzcGFjZSBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoCi0JCQkJCW9yZy5hcGFjaGUubmVldGhpLkNvbnN0YW50cy5VUklfUE9MSUNZX05TLAotCQkJCQlvcmcuYXBhY2hlLm5lZXRoaS5Db25zdGFudHMuQVRUUl9XU1ApOwotCQkJT01BdHRyaWJ1dGUgVVJJcyA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoIlBvbGljeVVSSXMiLCBucywKLQkJCQkJdmFsdWUpOwotCQkJZWxlbWVudC5hZGRBdHRyaWJ1dGUoVVJJcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBbHJlYWR5QWRkZWQoQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcsCi0JCQlPTUVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQpIHsKLQkJUU5hbWUgYmluZGluZ05hbWUgPSBheGlzQmluZGluZy5nZXROYW1lKCk7Ci0JCVFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoIm5hbWUiKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlZmluaXRpb25FbGVtZW50Ci0JCQkJLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKHdzZGwuZ2V0TmFtZXNwYWNlVVJJKCksCi0JCQkJCQlCSU5ESU5HX0xPQ0FMX05BTUUpKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpOwotCQkJaWYgKGJpbmRpbmdOYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVuZHBvaW50VVJMKEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQpIHsKLQkJUGFyYW1ldGVyIG1vZGlmeUFkZHJlc3NQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcigibW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcyIpOwotICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50VVJMID0gYXhpc0VuZHBvaW50LmdldEVuZHBvaW50VVJMKCk7Ci0gICAgICAgICAgICBpZiAobW9kaWZ5QWRkcmVzc1BhcmFtICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIUJvb2xlYW4ucGFyc2VCb29sZWFuKChTdHJpbmcpbW9kaWZ5QWRkcmVzc1BhcmFtLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJMOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgaG9zdElQOwotICAgIAotICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciAKLSAgICAgICAgICAgIGhvc3RJUCA9IFV0aWxzLmdldEhvc3RuYW1lKGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgICAgIC8vSWYgaXQgaXMgbm90IHNldCBleHRyYWN0IHRoZSBob3N0SVAgZnJvbSB0aGUgVVJMCi0gICAgICAgICAgICBpZiAoaG9zdElQID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBob3N0SVAgPSBXU0RMU2VyaWFsaXphdGlvblV0aWwuZXh0cmFjdEhvc3RJUChheGlzU2VydmljZS5nZXRFbmRwb2ludFVSTCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAvL1RPRE8gVGhpcyBpcyB0byBwcmV2ZW50IHByb2JsZW1zIHdoZW4gSkFWQTJXU0RMIHRvb2wgaXMgdXNlZCB3aGVyZSB0aGVyZSBpcyBubwotICAgICAgICAgICAgLy9BeGlzIHNlcnZlciBydW5uaW5nLiBjYWxjdWxhdGVFbmRwb2ludFVSTCBmYWlscyBpbiB0aGlzIHNjZW5hcmlvLCByZWZlciB0byAKLSAgICAgICAgICAgIC8vIFNpbXBsZUhUVFBTZXJ2ZXIjZ2V0RVBSc0ZvclNlcnZpY2UoKQotICAKLSAgICAgICAgICAgIGlmIChob3N0SVAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBheGlzRW5kcG9pbnQuY2FsY3VsYXRlRW5kcG9pbnRVUkwoaG9zdElQKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZHBvaW50VVJMOwotICAgICAgICAgICAgfQotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZSB0aGUgSWRlbnRpdHkgZWxlbWVudCBhY2NvcmRpbmcgdG8gdGhlIFdTLUFkZHJlc3NpbmdBbmRJZGVudGl0eSBpZiB0aGUgCi0JICogQWRkcmVzc2luZ0NvbnN0YW50cy5JREVOVElUWV9QQVJBTUVURVIgcGFyYW1ldGVyIGlzIHNldC4gCi0JICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNi8wMi9hZGRyZXNzaW5naWRlbnRpdHkvIAotCSAqLwotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUlkZW50aXR5RWxlbWVudChPTUZhY3RvcnkgZmFjLE9NRWxlbWVudCBlcHIsIFBhcmFtZXRlciB3c2FJZFBhcmFtKSB7Ci0JICAgIAotCSAgICAvLyBDcmVhdGUgdGhlIElkZW50aXR5IGVsZW1lbnQKLQkgICAgT01FbGVtZW50IGlkZW50aXR5ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLlFOQU1FX0lERU5USVRZKTsKLQkgICAgT01FbGVtZW50IGtleUluZm8gPSBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuUU5BTUVfSURFTlRJVFlfS0VZX0lORk8pOwotCSAgICBPTUVsZW1lbnQgeDUwOURhdGEgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuUU5BTUVfSURFTlRJVFlfWDUwOV9EQVRBKTsKLQkgICAgT01FbGVtZW50IHg1MDljZXJ0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLlFOQU1FX0lERU5USVRZX1g1MDlfQ0VSVCk7Ci0JICAgIHg1MDljZXJ0LnNldFRleHQoKFN0cmluZyl3c2FJZFBhcmFtLmdldFZhbHVlKCkpOwotCSAgICAKLQkgICAgeDUwOURhdGEuYWRkQ2hpbGQoeDUwOWNlcnQpOwotCSAgICBrZXlJbmZvLmFkZENoaWxkKHg1MDlEYXRhKTsKLQkgICAgaWRlbnRpdHkuYWRkQ2hpbGQoa2V5SW5mbyk7Ci0JICAgIAotCSAgICBlcHIuYWRkQ2hpbGQoaWRlbnRpdHkpOwotCSAgICAKLQl9Ci0JCi0JCi0JLyoKLQkgKiBHZW5lcmF0ZSB0aGUgRW5kcG9pbnRSZWZlcmVuY2UgZWxlbWVudAotCSAqIDx3c2E6RW5kcG9pbnRSZWZlcmVuY2U+Ci0gICAgICAgICAqICAgIDx3c2E6QWRkcmVzcz4KLSAgICAgICAgICogICAgICAgIGh0dHA6Ly9zb21lLnNlcnZpY2UuZXByLwotICAgICAgICAgKiAgICAgPC93c2E6QWRkcmVzcz4KLSAgICAgICAgICogPC93c2E6RW5kcG9pbnRSZWZlcmVuY2U+Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRVBSRWxlbWVudChPTUZhY3RvcnkgZmFjLCBPTUVsZW1lbnQgcG9ydCwgU3RyaW5nIGVuZHBvaW50VVJMKXsKLQkgICAgCi0JICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5JREVOVElUWV9QQVJBTUVURVIpOwotCSAgICAgICAgICAgIAotCSAgICAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzZXQsIHJldHVybgotCSAgICBpZiAocGFyYW1ldGVyID09IG51bGwgfHwgcGFyYW1ldGVyLmdldFZhbHVlKCkgPT0gbnVsbCkgewotCSAgICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICAgIAotCSAgICBPTUVsZW1lbnQgd3NhRXByID0gZmFjLmNyZWF0ZU9NRWxlbWVudChBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9FTkRQT0lOVF9SRUZFUkVOQ0UpOwotCSAgICAKLQkgICAgT01FbGVtZW50IGFkZHJlc3MgPSBmYWMuY3JlYXRlT01FbGVtZW50KEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FERFJFU1MpOwotCSAgICBhZGRyZXNzLnNldFRleHQoKGVuZHBvaW50VVJMID09IG51bGwpID8gIiI6IGVuZHBvaW50VVJMKTsKLQkgICAgCi0JICAgIHdzYUVwci5hZGRDaGlsZChhZGRyZXNzKTsKLQkgICAgCi0JICAgIC8vIFRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgaWRlbnRpdHkgZWxlbWVudCBpZiB0aGUgc2VydmljZSBwYXJhbWV0ZXIgaXMgc2V0Ci0JICAgIGdlbmVyYXRlSWRlbnRpdHlFbGVtZW50KGZhYywgd3NhRXByLCBwYXJhbWV0ZXIpOwotCSAgICAKLQkgICAgcG9ydC5hZGRDaGlsZCh3c2FFcHIpOyAgIAotCSAgICAKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlMldTREwyMC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlMldTREwyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzk3ZjhkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzU2VydmljZTJXU0RMMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5FeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETFNlcmlhbGl6YXRpb25VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYU9iamVjdENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFQYXJ0aWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2UyV1NETDIwIGltcGxlbWVudHMgV1NETDJDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGVwcnMgPSBudWxsOwotICAgIHByaXZhdGUgT01OYW1lc3BhY2Ugd3NhdzsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBwb2xpY2llc0luRGVzY3JpcHRpb24gPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyIGZpbHRlciA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlMldTREwyMChBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBzZXJ2aWNlOwotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlMldTREwyMChBeGlzU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IHNlcnZpY2U7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBXU0RMIDIuMCBkb2N1bWVudCBmb3IgdGhpcyB3ZWIgc2VydmljZQotICAgICAqIEByZXR1cm4gVGhlIFdTREwyIGRvY3VtZW50IGVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdlbmVyYXRlT00oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBNYXAgbmFtZVNwYWNlc01hcCA9IGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpOwotICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIHdzZGw7Ci0gICAgICAgIAotICAgICAgICAvLwotICAgICAgICBmaWx0ZXIgPSBuZXcgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyKCk7Ci0JCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UKLQkJCQkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKGF4aXNDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCWZpbHRlci5zZXRBc3NlcnRpb25zVG9GaWx0ZXIoYXhpc0NvbmZpZ3VyYXRpb24KLQkJCQkJLmdldExvY2FsUG9saWN5QXNzZXJ0aW9ucygpKTsKLQkJfQotCQkvLwotCi0gICAgICAgIGlmIChuYW1lU3BhY2VzTWFwICE9IG51bGwgJiYgbmFtZVNwYWNlc01hcC5jb250YWluc1ZhbHVlKFdTREwyQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFKSkgewotICAgICAgICAgICAgd3NkbCA9IG9tRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoV1NETDJDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2V0UHJlZml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5XU0RMX05BTUVTUEFDRSwgbmFtZVNwYWNlc01hcCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NkbCA9IG9tRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoV1NETDJDb25zdGFudHMuV1NETF9OQU1FU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5ERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCk7Ci0gICAgICAgIH0KLQotICAgICAgICBPTUVsZW1lbnQgZGVzY3JpcHRpb25FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ERVNDUklQVElPTiwgd3NkbCk7Ci0KLSAgICAgICAgLy8gRGVjbGFyZSBhbGwgdGhlIGRlZmluZWQgbmFtZXNwYWNlcyBpbiB0aGUgZG9jdW1lbnQKLSAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLnBvcHVsYXRlTmFtZXNwYWNlcyhkZXNjcmlwdGlvbkVsZW1lbnQsIG5hbWVTcGFjZXNNYXApOwotCi0gICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIHdzYXcgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQVdfTkFNRVNQQUNFLCAid3NhdyIpOwotICAgICAgICAvLyBOZWVkIHRvIGFkZCB0aGUgdGFyZ2V0bmFtZXNwYWNlIGFzIGFuIGF0dHJpYnV0ZSBhY2NvcmRpbmcgdG8gdGhlIHdzZGwgMi4wIHNwZWMKLSAgICAgICAgT01BdHRyaWJ1dGUgdGFyZ2V0TmFtZXNwYWNlID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLlRBUkdFVF9OQU1FU1BBQ0UsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50LmFkZEF0dHJpYnV0ZSh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVkIG5hbWVzcGFjZXMgYXJlIGFscmVhZHkgaW4gbmFtZXNwYWNlTWFwLCBpZiB0aGV5IGFyZSBub3QKLSAgICAgICAgLy8gcHJlc2VudCBkZWNsYXJlIHRoZW0uCi0gICAgICAgIE9NTmFtZXNwYWNlIHdzb2FwOwotICAgICAgICBPTU5hbWVzcGFjZSB3aHR0cDsKLSAgICAgICAgT01OYW1lc3BhY2Ugd3NkbHg7Ci0gICAgICAgIE9NTmFtZXNwYWNlIHdycGM7Ci0KLSAgICAgICAgT01OYW1lc3BhY2UgdG5zID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZU9NTmFtZXNwYWNlKGF4aXNTZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIGlmIChuYW1lU3BhY2VzTWFwICE9IG51bGwgJiYgbmFtZVNwYWNlc01hcC5jb250YWluc1ZhbHVlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQKSkgewotICAgICAgICAgICAgd3NvYXAgPSBvbUZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZU9NTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVAsIG5hbWVTcGFjZXNNYXApKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzb2FwID0gZGVzY3JpcHRpb25FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5kZWNsYXJlTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQLCBXU0RMMkNvbnN0YW50cy5TT0FQX1BSRUZJWCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWVTcGFjZXNNYXAgIT0gbnVsbCAmJiBuYW1lU3BhY2VzTWFwLmNvbnRhaW5zVmFsdWUoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKSB7Ci0gICAgICAgICAgICB3aHR0cCA9IG9tRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlT01OYW1lc3BhY2UoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2V0UHJlZml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCwgbmFtZVNwYWNlc01hcCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2h0dHAgPSBkZXNjcmlwdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmRlY2xhcmVOYW1lc3BhY2UoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFAsIFdTREwyQ29uc3RhbnRzLkhUVFBfUFJFRklYKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZVNwYWNlc01hcCAhPSBudWxsICYmIG5hbWVTcGFjZXNNYXAuY29udGFpbnNWYWx1ZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfRVhURU5TSU9OUykpIHsKLSAgICAgICAgICAgIHdzZGx4ID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVPTU5hbWVzcGFjZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfRVhURU5TSU9OUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9FWFRFTlNJT05TLCBuYW1lU3BhY2VzTWFwKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3c2RseCA9IGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9FWFRFTlNJT05TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5XU0RMX0VYVEVOVElPTl9QUkVGSVgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lU3BhY2VzTWFwICE9IG51bGwgJiYgbmFtZVNwYWNlc01hcC5jb250YWluc1ZhbHVlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9SUEMpKSB7Ci0gICAgICAgICAgICB3cnBjID0gb21GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVPTU5hbWVzcGFjZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfUlBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldFByZWZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1JQQywgbmFtZVNwYWNlc01hcCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JwYyA9IGRlc2NyaXB0aW9uRWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9SUEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLldTRExfUlBDX1BSRUZJWCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudAotICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwKLSAgICAgICAgICAgICAgICAuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGF4aXNTZXJ2aWNlLCBkZXNjcmlwdGlvbkVsZW1lbnQsIG9tRmFjdG9yeSwgd3NkbCk7Ci0KLSAgICAgICAgLy8gQWRkIHR5cGVzIGVsZW1lbnQKLSAgICAgICAgT01FbGVtZW50IHR5cGVzRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuVFlQRVNfTE9DQUxfTkFMRSwgd3NkbCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLnBvcHVsYXRlU2NoZW1hTWFwcGluZ3MoKTsKLSAgICAgICAgQXJyYXlMaXN0IHNjaGVtYXMgPSBheGlzU2VydmljZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IGF4aXNTZXJ2aWNlLmdldFNjaGVtYShpKTsKLQotICAgICAgICAgICAgaWYgKCFvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRAotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICBzY2hlbWEud3JpdGUod3JpdGVyKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hU3RyaW5nID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhzY2hlbWFTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlc0VsZW1lbnQuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLnRvT00obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNjaGVtYVN0cmluZy5nZXRCeXRlcygpKSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQodHlwZXNFbGVtZW50KTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWU7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSA9IFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSU5URVJGQUNFX05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgdGhlIGludGVyZmFjZSBlbGVtZW50Ci0gICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChnZXRJbnRlcmZhY2VFbGVtZW50KHdzZGwsIHRucywgd3NkbHgsIHdycGMsIG9tRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSkpOwotCi0gICAgICAgIC8vIGF4aXMyLnhtbCBpbmRpY2F0ZWQgbm8gSFRUUCBiaW5kaW5nPwotICAgICAgICBib29sZWFuIGRpc2FibGVSRVNUID0gZmFsc2U7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlUkVTVFBhcmFtZXRlciA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTVCk7Ci0gICAgICAgIGlmIChkaXNhYmxlUkVTVFBhcmFtZXRlciAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVJFU1RQYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGRpc2FibGVSRVNUID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gZGlzYWJsZVNPQVAxMSA9IGZhbHNlOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVNPQVAxMVBhcmFtZXRlciA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUDExKTsKLSAgICAgICAgaWYgKGRpc2FibGVTT0FQMTFQYXJhbWV0ZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVTT0FQMTFQYXJhbWV0ZXIuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIGRpc2FibGVTT0FQMTEgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXhpczIueG1sIGluZGljYXRlZCBubyBTT0FQIDEuMiBiaW5kaW5nPwotICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTIgPSBmYWxzZTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIgPQotICAgICAgICBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVAxMik7Ci0gICAgICAgIGlmIChkaXNhYmxlU09BUDEyUGFyYW1ldGVyICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDEyUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBkaXNhYmxlU09BUDEyID0gdHJ1ZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBheGlzU2VydmljZSBoYXMgYW55IGVuZHBvaW50cy4gSWYgdGhleSBleGlzdHMgc2VyaWFsaXplIHRoZW0gZWxzZQotICAgICAgICAvLyBnZW5lcmF0ZSBkZWZhdWx0IGVuZHBvaW50IGVsZW1lbnRzLgotICAgICAgICBTZXQgYmluZGluZ3MgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBNYXAgZW5kcG9pbnRNYXAgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoImlzQ29kZWdlbiIpOwotICAgICAgICBib29sZWFuIGlzQ29kZWdlbiA9IGZhbHNlOwotICAgICAgICBpZiAoSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkodmFsdWUpKSB7Ci0gICAgICAgICAgIGlzQ29kZWdlbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZHBvaW50TWFwICE9IG51bGwgJiYgZW5kcG9pbnRNYXAuc2l6ZSgpID4gMCkgewotCi0gICAgICAgICAgICBPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBnZXRTZXJ2aWNlRWxlbWVudCh3c2RsLCB0bnMsIG9tRmFjdG9yeSwgaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVuZHBvaW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGUgbmV3IGJpbmRpbmcgaGllcmFjaHkgaW4gcGxhY2Ugd2UgbmVlZCB0byBkbyBzb21lIGV4dHJhIGNoZWNraW5nIGhlcmUuCi0gICAgICAgICAgICAgICAgLy8gSWYgYSBzZXJ2aWNlIGhhcyBib3RoIGh0dHAgYW5kIGh0dHBzIGxpc3RuZXJzIHVwIHdlIHNob3VsZCBzaG93IHR3byBzZXBhcmF0ZSBlcHJzCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlcnZpY2Ugd2FzIGRlcGxveWVkIHdpdGggYSBXU0RMIGFuZCBpdCBoYWQgdHdvIGVuZHBvaW50cyBmb3IgaHR0cCBhbmQKLSAgICAgICAgICAgICAgICAvLyBodHRwcyB0aGVuIHdlIGhhdmUgdHdvIGVuZHBvaW50cyBwb3B1bGF0ZWQgc28gd2Ugc2hvdWxkIHNlcmlhbGl6ZSB0aGVtIGluc3RlYWQKLSAgICAgICAgICAgICAgICAvLyBvZiB1cGRhdGluZyB0aGUgZW5kcG9pbnRzLgotICAgICAgICAgICAgICAgIEF4aXNFbmRwb2ludCBheGlzRW5kcG9pbnQgPSAoQXhpc0VuZHBvaW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgLyoKLQkJCSAgICAqIFNvbWUgdHJhbnNwb3J0cyBtaWdodCBub3QgYmUgYWN0aXZlIGF0IHJ1bnRpbWUuCi0JCQkgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWlzQ29kZWdlbiAmJiAhYXhpc0VuZHBvaW50LmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gYXhpc0VuZHBvaW50LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGF4aXNCaW5kaW5nLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBJZiBIVFRQIGJpbmRpbmcgaXMgZGlzYWJsZWQsIGRvIG5vdCBhZGQuCi0gICAgICAgICAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZVJFU1QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIFNPQVAgMS4yIGJpbmRpbmcgaXMgZGlzYWJsZWQsIGRvIG5vdCBhZGQuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5U09BUFZlcnNpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgYXhpc0JpbmRpbmcuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMocHJvcGVydHlTT0FQVmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHByb3BlcnR5U09BUFZlcnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0KLSAgICAgICAgICAgICAgICBiaW5kaW5ncy5hZGQoYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbmRwb2ludEVsZW1lbnQgPSBheGlzRW5kcG9pbnQudG9XU0RMMjAod3NkbCwgdG5zLCB3aHR0cCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBlbmRwb2ludEFscmVhZHlBZGRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVuZHBvaW50c0FkZGVkID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZW5kcG9pbnRzQWRkZWQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbmRwb2ludCA9IChPTUVsZW1lbnQpIGVuZHBvaW50c0FkZGVkLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgd2hldGhlciBhIGVuZHBvaW50IHdpdGggdGhlIHNhbWUgYmluZGluZyBhbmQgYWRkcmVzcyBleGlzdHMuCi0gICAgICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKCkuZXF1YWxzKGVuZHBvaW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSkpLmdldEF0dHJpYnV0ZVZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQUREUkVTUykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKCkuZXF1YWxzKGVuZHBvaW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BRERSRVNTKSkuZ2V0QXR0cmlidXRlVmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50QWxyZWFkeUFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZW5kcG9pbnRBbHJlYWR5QWRkZWQpIHsKLS8vICAgICAgICAgICAgICAgIAlhZGRQb2xpY3lBc0V4dGVuc2libGVFbGVtZW50KGF4aXNFbmRwb2ludCwgZW5kcG9pbnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAJUGFyYW1ldGVyIG1vZGlmeUFkZHJlc3NQYXJhbSA9IGF4aXNTZXJ2aWNlCi0JCQkJCQkJLmdldFBhcmFtZXRlcigibW9kaWZ5VXNlcldTRExQb3J0QWRkcmVzcyIpOwotCQkJCQlpZiAobW9kaWZ5QWRkcmVzc1BhcmFtICE9IG51bGwpIHsKLQkJCQkJCWlmIChCb29sZWFuLnBhcnNlQm9vbGVhbigoU3RyaW5nKSBtb2RpZnlBZGRyZXNzUGFyYW0KLQkJCQkJCQkJLmdldFZhbHVlKCkpKSB7Ci0JCQkJCQkJU3RyaW5nIGVuZHBvaW50VVJMID0gYXhpc0VuZHBvaW50Ci0JCQkJCQkJCQkuY2FsY3VsYXRlRW5kcG9pbnRVUkwoKTsKLQkJCQkJCQllbmRwb2ludEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkJCW5ldyBRTmFtZSgKLQkJCQkJCQkJCQkJCQlXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQUREUkVTUykpCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlVmFsdWUoZW5kcG9pbnRVUkwpOwotCQkJCQkJfQotCQkJCQl9Ci0gICAgICAgICAgICAgICAgCXNlcnZpY2VFbGVtZW50LmFkZENoaWxkKGVuZHBvaW50RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZyBiaW5kaW5nID0gKEF4aXNCaW5kaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBiaW5kaW5nLnRvV1NETDIwKHdzZGwsIHRucywgd3NvYXAsIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0hlbHBlci5nZXRBZGRyZXNzaW5nUmVxdWlyZW1lbnRQYXJlbWV0ZXJWYWx1ZShheGlzU2VydmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSx3c2F3KTsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChiaW5kaW5nRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChzZXJ2aWNlRWxlbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBubyBhbmRwb2ludHMgZGVmaW5lZCBoZW5jZSBnZW5lcmF0ZSBkZWZhdWx0IGJpbmRpbmdzIGFuZCBlbmRwb2ludHMKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdlbmVyYXRlU09BUDExQmluZGluZyhvbUZhY3RvcnksIGF4aXNTZXJ2aWNlLCB3c2RsLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2VuZXJhdGVTT0FQMTJCaW5kaW5nKG9tRmFjdG9yeSwgYXhpc1NlcnZpY2UsIHdzZGwsIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTEpIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2VuZXJhdGVTT0FQMTFCaW5kaW5nKG9tRmFjdG9yeSwgYXhpc1NlcnZpY2UsIHdzZGwsIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50LmFkZENoaWxkKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdlbmVyYXRlSFRUUEJpbmRpbmcob21GYWN0b3J5LCBheGlzU2VydmljZSwgd3NkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgIC5hZGRDaGlsZChXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2VuZXJhdGVTZXJ2aWNlRWxlbWVudChvbUZhY3RvcnksIHdzZGwsIHRucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLCBkaXNhYmxlUkVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVTT0FQMTIsZGlzYWJsZVNPQVAxMSwgZXBycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IHBvbGljaWVzID0gbmV3IEFycmF5TGlzdChwb2xpY2llc0luRGVzY3JpcHRpb24udmFsdWVzKCkpOwotICAgICAgICBhZGRQb2xpY2llc1RvRGVzY3JpcHRpb25FbGVtZW50KHBvbGljaWVzLCBkZXNjcmlwdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbkVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIHRoZSBpbnRlcmZhY2UgZWxlbWVudCBmb3IgdGhlIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsIFRoZSBXU0RMIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB0bnMgVGhlIHRhcmdldCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gd3NkbHggVGhlIFdTREwgZXh0ZW5zaW9ucyBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gZmFjIFRoZSBhY3RpdmUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZQotICAgICAqIEByZXR1cm4gVGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgZWxlbWVudAotICAgICAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciAKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRJbnRlcmZhY2VFbGVtZW50KE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywgT01OYW1lc3BhY2Ugd3NkbHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3cnBjLCBPTUZhY3RvcnkgZmFjLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIEF4aXNGYXVsdCwgWE1MU3RyZWFtRXhjZXB0aW9uLCBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLQotICAgICAgICBPTUVsZW1lbnQgaW50ZXJmYWNlRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBpbnRlcmZhY2VFbGVtZW50LmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBhZGRQb2xpY3lBc0V4dGVuc2libGVFbGVtZW50KGF4aXNTZXJ2aWNlLCBpbnRlcmZhY2VFbGVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBBcnJheUxpc3QgaW50ZXJmYWNlT3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgQXJyYXlMaXN0IGludGVyZmFjZUZhdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24uaXNDb250cm9sT3BlcmF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVyZmFjZU9wZXJhdGlvbnMuYWRkKGksIGdlbmVyYXRlSW50ZXJmYWNlT3BlcmF0aW9uRWxlbWVudChheGlzT3BlcmF0aW9uLCB3c2RsLCB0bnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbHgsIHdycGMpKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGZhdWx0c0l0ZXJhdG9yID0gYXhpc09wZXJhdGlvbi5nZXRGYXVsdE1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChmYXVsdHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSAoQXhpc01lc3NhZ2UpIGZhdWx0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZhdWx0TWVzc2FnZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnRlcmZhY2VGYXVsdHMuY29udGFpbnMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGZhdWx0RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjLmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5GQVVMVF9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50LmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRFbGVtZW50LmFkZEF0dHJpYnV0ZShmYWMuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlQsIG51bGwsIFdTRExTZXJpYWxpemF0aW9uVXRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50TmFtZShmYXVsdE1lc3NhZ2UsIGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpKSkpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VGYXVsdHMuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VFbGVtZW50LmFkZENoaWxkKGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGludGVyZmFjZU9wZXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGludGVyZmFjZUVsZW1lbnQuYWRkQ2hpbGQoKE9NTm9kZSkgaW50ZXJmYWNlT3BlcmF0aW9ucy5nZXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgc2VydmljZSBlbGVtZW50IGZvciB0aGUgc2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBvbUZhY3RvcnkgdGhlIGFjdGl2ZSBPTUZhY3RvcnkKLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlCi0gICAgICogQHJldHVybiB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgT01FbGVtZW50IGdldFNlcnZpY2VFbGVtZW50KE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywgT01GYWN0b3J5IG9tRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotICAgICAgICBPTUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuU0VSVklDRV9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpKTsKLSAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5JTlRFUkZBQ0VfTE9DQUxfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKwotICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWUpKTsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VFbGVtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgaW50ZXJmYWNlIE9wZXJhdGlvbiBlbGVtZW50LiBBcyB3aXRoIHRoZSBiaW5kaW5nIG9wZXJhdGlvbnMgd2UgZG9udCBuZWVkIHRvCi0gICAgICogYXNrIEF4aXNNZXNzYWdlIHRvIHNlcmlhbGl6ZSBpdHMgbWVzc2FnZSBjYXVzZSBBeGlzTWVzc2FnZSBkb2VzIG5vdCBoYXZlIHNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgKiBhcyBiaW5kaW5ncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uIHRoZSBvcGVyYXRpb24gdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gd3NkbCB0aGUgV1NETCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdG5zIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzZGx4IHRoZSBXU0RMIGV4dGVudGlvbnMgbmFtZXNwYWNlIChXU0RMIDIuMCkKLSAgICAgKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQgJmx0O29wZXJhdGlvbiZndDsgZWxlbWVudAotICAgICAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciAKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiAKLSAgICAgKi8KLSAgICBwdWJsaWMgT01FbGVtZW50IGdlbmVyYXRlSW50ZXJmYWNlT3BlcmF0aW9uRWxlbWVudChBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB0bnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NkbHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3JwYykgdGhyb3dzCi0gICAgICAgICAgICBVUklTeW50YXhFeGNlcHRpb24sIEF4aXNGYXVsdCwgWE1MU3RyZWFtRXhjZXB0aW9uLCBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLSAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgYXhpc09wZXJhdGlvbkVsZW1lbnQgPQotICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwKLSAgICAgICAgICAgICAgICAuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGF4aXNPcGVyYXRpb24sIGF4aXNPcGVyYXRpb25FbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotICAgICAgICBheGlzT3BlcmF0aW9uRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICBhZGRQb2xpY3lBc0V4dGVuc2libGVFbGVtZW50KGF4aXNPcGVyYXRpb24sIGF4aXNPcGVyYXRpb25FbGVtZW50KTsKLSAgICAgICAgCi0gICAgICAgIFVSSVtdIG9wU3R5bGUgPSAoVVJJW10pIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX1NUWUxFKTsKLSAgICAgICAgaWYgKG9wU3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgb3BTdHlsZSA9IGNoZWNrU3R5bGUoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgb3BTdHlsZVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIG9wU3R5bGVQYXJhbWV0ZXIuc2V0TmFtZShXU0RMMkNvbnN0YW50cy5PUEVSQVRJT05fU1RZTEUpOwotICAgICAgICAgICAgb3BTdHlsZVBhcmFtZXRlci5zZXRWYWx1ZShvcFN0eWxlKTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG9wU3R5bGVQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvcFN0eWxlICE9IG51bGwgJiYgb3BTdHlsZS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBvcFN0eWxlWzBdLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG9wU3R5bGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gb3BTdHlsZVtpXTsKLSAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlICsgIiAiICsgdXJpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NUWUxFLCBudWxsLCBzdHlsZSkpOwotICAgICAgICAgICAgaWYgKHN0eWxlLmluZGV4T2YoV1NETDJDb25zdGFudHMuU1RZTEVfUlBDKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NJR05BVFVSRSwgd3JwYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1JQQ19TSUdOQVRVUkUpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRV9QQVRURVJOLCBudWxsLCBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihXU0RMMkNvbnN0YW50cy5BVFRSX1dTRExYX1NBRkUpOwotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX1NBRkUsIHdzZGx4LCAocGFyYW0uZ2V0VmFsdWUoKSkudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gYXhpc09wZXJhdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBNYXAgbmFtZVNwYWNlTWFwID0gYXhpc1NlcnZpY2UuZ2V0TmFtZXNwYWNlTWFwKCk7Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBpbnB1dCBlbGVtZW50Ci0gICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgYXhpc09wZXJhdGlvbi5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9JTl9NRVNTQUdFKTsKLSAgICAgICAgaWYgKGluTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgaW5NZXNzYWdlRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuSU5fUFVUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgaW5NZXNzYWdlRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmdldEVsZW1lbnROYW1lKGluTWVzc2FnZSwgbmFtZVNwYWNlTWFwKSkpOwotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUoaW5NZXNzYWdlRWxlbWVudCwgYXhpc09wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpLHdzYXcpOwotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudChpbk1lc3NhZ2UsIGluTWVzc2FnZUVsZW1lbnQsIG9tRmFjdG9yeSwgd3NkbCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uRWxlbWVudC5hZGRDaGlsZChpbk1lc3NhZ2VFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCB0aGUgb3V0cHV0IGVsZW1lbnQKLSAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgYXhpc09wZXJhdGlvbi5nZXRDaGlsZChXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9PVVRfTUVTU0FHRSk7Ci0gICAgICAgIGlmIChvdXRNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvdXRNZXNzYWdlRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1VUX1BVVF9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgIG91dE1lc3NhZ2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5ULCBudWxsLAotICAgICAgICAgICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuZ2V0RWxlbWVudE5hbWUob3V0TWVzc2FnZSwgbmFtZVNwYWNlTWFwKSkpOwotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUob3V0TWVzc2FnZUVsZW1lbnQsIGF4aXNPcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCksd3Nhdyk7Ci0gICAgICAgICAgICBXU0RMU2VyaWFsaXphdGlvblV0aWwuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KG91dE1lc3NhZ2UsIG91dE1lc3NhZ2VFbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbkVsZW1lbnQuYWRkQ2hpbGQob3V0TWVzc2FnZUVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWRkIHRoZSBmYXVsdCBlbGVtZW50Ci0gICAgICAgIEFycmF5TGlzdCBmYXVsdHMgPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0TWVzc2FnZXMoKTsKLSAgICAgICAgaWYgKGZhdWx0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZhdWx0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBmYXVsdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuV1NETF9NRVNTQUdFX0RJUkVDVElPTl9JTi5lcXVhbHMoZmF1bHRNZXNzYWdlLmdldERpcmVjdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLklOX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0RWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1VUX0ZBVUxUX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmYXVsdEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfUkVGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRucy5nZXRQcmVmaXgoKSArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUoZmF1bHRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKSwgd3Nhdyk7Ci0gICAgICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkV1NETERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0TWVzc2FnZSwgZmF1bHRFbGVtZW50LCBvbUZhY3RvcnksIHdzZGwpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb25FbGVtZW50LmFkZENoaWxkKGZhdWx0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb25FbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVQUnMoU3RyaW5nW10gZXBycykgewotICAgICAgICB0aGlzLmVwcnMgPSBlcHJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBzY2hlbWEgYW5kIHJldHVybnMgdGhlIFdTREwgMi4wIHN0eWxlcyB0aGF0IGl0IGNvbmZvcm0gdG8uCi0gICAgICogSXQgY2hlY2tzIGZvciBSUEMsIElSSSBhbmQgTXVsdGlwYXJ0IHN0eWxlcy4KLSAgICAgKiBGb3IgZnVsbCBkZXRhaWxzIG9uIHRoZSBydWxlcyBwbGVhc2UgcmVmZXIgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNy9SRUMtd3NkbDIwLWFkanVuY3RzLTIwMDcwNjI2LyNzdHlsZXMKLSAgICAgKiBAcGFyYW0gYXhpc09wZXJhdGlvbiAtIFRoZSBheGlzT3BlcmF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgY2hlY2tlZAotICAgICAqIEByZXR1cm4gU3RyaW5nIFtdIC0gQW4gYXJyYXkgb2Ygc3R5bGVzIHRoYXQgdGhlIG9wZXJhdGlvbiBhZGhlcmVzIHRvLgotICAgICAqLwotICAgIHByaXZhdGUgVVJJIFtdIGNoZWNrU3R5bGUoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBBeGlzRmF1bHQgewotICAgICAgICBib29sZWFuIGlzUlBDID0gdHJ1ZTsKLSAgICAgICAgYm9vbGVhbiBpc011bHRpcGFydCA9IHRydWU7Ci0gICAgICAgIGJvb2xlYW4gaXNJUkkgPSB0cnVlOwotICAgICAgICBBcnJheUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgzKTsKLQotICAgICAgICBTdHJpbmcgbWVwID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgIGlmICghKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMobWVwKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXApKSkgewotICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFFOYW1lIGluTWVzc2FnZUVsZW1lbnRRbmFtZTsKLSAgICAgICAgTWFwIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgICAgICAgQXhpc01lc3NhZ2UgaW5NZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTREwyQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU4pOwotICAgICAgICBpZiAoaW5NZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gaW5NZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKHFOYW1lID09IG51bGwgfHwgQ29uc3RhbnRzLlhTRF9BTlkuZXF1YWxzKHFOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGluTWVzc2FnZS5nZXRTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoc2NoZW1hRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlRWxlbWVudFFuYW1lID0gc2NoZW1hRWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYVR5cGUgdHlwZSA9IHNjaGVtYUVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYUNvbXBsZXhUeXBlKXsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVBhcnRpY2xlIHBhcnRpY2xlID0gY29tcGxleFR5cGUuZ2V0UGFydGljbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpY2xlICE9IG51bGwgJiYgcGFydGljbGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFTZXF1ZW5jZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgcGFydGljbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIHNjaGVtYU9iamVjdENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYU9iamVjdENvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hT2JqZWN0Q29sbGVjdGlvbi5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkgWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgaW5uZXJFbGVtZW50ID0gKFhtbFNjaGVtYUVsZW1lbnQpIG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckVsZW1lbnQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJFbGVtZW50LmdldE1pbk9jY3VycygpICE9IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckVsZW1lbnQuZ2V0TWF4T2NjdXJzKCkgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNdWx0aXBhcnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgPSBpbm5lckVsZW1lbnQuZ2V0U2NoZW1hVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBpbm5lckVsZW1lbnRRTmFtZSA9IGlubmVyRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNpbXBsZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25zdGFudHMuWFNEX1FOQU1FLmVxdWFscyhpbm5lckVsZW1lbnRRTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlhTRF9OT1RBVElPTi5lcXVhbHMoaW5uZXJFbGVtZW50UU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5YU0RfSEVYQklOLmVxdWFscyhpbm5lckVsZW1lbnRRTmFtZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlhTRF9CQVNFNjQuZXF1YWxzKGlubmVyRWxlbWVudFFOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lSSSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJUkkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlhTRF9BTlkuZXF1YWxzKGlubmVyRWxlbWVudFFOYW1lKSAmJiBpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbm5lckVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5NZXNzYWdlRWxlbWVudERldGFpbHMuZ2V0KG5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc011bHRpcGFydCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzLnB1dChuYW1lLCBpbm5lckVsZW1lbnRRTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkgWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJIFswXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSSSBbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVSSSBbMF07Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIE1hcCBvdXRNZXNzYWdlRWxlbWVudERldGFpbHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotICAgICAgICBpZiAoaXNSUEMgJiYgIVdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMobWVwKSkgewotICAgICAgICAgICAgb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMMkNvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVCk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG91dE1lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBpZiAocU5hbWUgPT0gbnVsbCAmJiBDb25zdGFudHMuWFNEX0FOWS5lcXVhbHMocU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IG91dE1lc3NhZ2UuZ2V0U2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgSmF2YTJXU0RMQ29uc3RhbnRzLlJFU1BPTlNFKQotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhzY2hlbWFFbGVtZW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWFFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoaW5NZXNzYWdlRWxlbWVudFFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpc1JQQyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFUeXBlIHR5cGUgPSBzY2hlbWFFbGVtZW50LmdldFNjaGVtYVR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUgaW5zdGFuY2VvZiBYbWxTY2hlbWFDb21wbGV4VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hUGFydGljbGUgcGFydGljbGUgPSBjb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFydGljbGUgIT0gbnVsbCAmJiBwYXJ0aWNsZSBpbnN0YW5jZW9mIFhtbFNjaGVtYVNlcXVlbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IChYbWxTY2hlbWFTZXF1ZW5jZSkgcGFydGljbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIHNjaGVtYU9iamVjdENvbGxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFTZXF1ZW5jZS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYU9iamVjdENvbGxlY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hT2JqZWN0Q29sbGVjdGlvbi5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG5leHQgaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGlubmVyRWxlbWVudCA9IChYbWxTY2hlbWFFbGVtZW50KSBuZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IGlubmVyRWxlbWVudC5nZXRTY2hlbWFUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGlubmVyRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckVsZW1lbnQuZ2V0UmVmTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dE1lc3NhZ2VFbGVtZW50RGV0YWlscy5nZXQobmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBpbk1lc3NhZ2VFbGVtZW50VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFOYW1lKSBpbk1lc3NhZ2VFbGVtZW50RGV0YWlscy5nZXQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbk1lc3NhZ2VFbGVtZW50VHlwZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlRWxlbWVudFR5cGUgIT0gc2NoZW1hVHlwZU5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWVzc2FnZUVsZW1lbnREZXRhaWxzLnB1dChuYW1lLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNSUEMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzUlBDID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc1JQQyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGlmIChpc1JQQykgewotICAgICAgICAgICAgc3R5bGVzLmFkZChuZXcgVVJJKFdTREwyQ29uc3RhbnRzLlNUWUxFX1JQQykpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRQYXJhbWV0ZXIoV1NETDJDb25zdGFudHMuQVRUUl9XUlBDX1NJR05BVFVSRSwgZ2VuZXJhdGVSUENTaWduYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzLCBvdXRNZXNzYWdlRWxlbWVudERldGFpbHMpKTsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0lSSSkgewotICAgICAgICAgICAgc3R5bGVzLmFkZChuZXcgVVJJKFdTREwyQ29uc3RhbnRzLlNUWUxFX0lSSSkpOwotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzTXVsdGlwYXJ0KSB7Ci0gICAgICAgICAgICBzdHlsZXMuYWRkKG5ldyBVUkkoV1NETDJDb25zdGFudHMuU1RZTEVfTVVMVElQQVJUKSk7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFVSSVtdKSBzdHlsZXMudG9BcnJheShuZXcgVVJJW2NvdW50XSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVSUENTaWduYXR1cmUoTWFwIGluTWVzc2FnZUVsZW1lbnREZXRhaWxzLCBNYXAgb3V0TWVzc2FnZUVsZW1lbnREZXRhaWxzKSB7Ci0gICAgICAgIFN0cmluZyBpbiA9ICIiOwotICAgICAgICBTdHJpbmcgb3V0ID0gIiI7Ci0gICAgICAgIFN0cmluZyBpbk91dCA9ICIiOwotICAgICAgICBTZXQgaW5FbGVtZW50U2V0ID0gaW5NZXNzYWdlRWxlbWVudERldGFpbHMua2V5U2V0KCk7Ci0gICAgICAgIFNldCBvdXRFbGVtZW50U2V0ID0gb3V0TWVzc2FnZUVsZW1lbnREZXRhaWxzLmtleVNldCgpOwotCi0gICAgICAgIEl0ZXJhdG9yIGluRWxlbWVudEl0ZXJhdG9yID0gaW5FbGVtZW50U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbkVsZW1lbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBpbkVsZW1lbnROYW1lID0gKFN0cmluZykgaW5FbGVtZW50SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKG91dEVsZW1lbnRTZXQuY29udGFpbnMoaW5FbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpbk91dCA9IGluT3V0ICsgaW5FbGVtZW50TmFtZSArICIgIiArIFdTREwyQ29uc3RhbnRzLlJQQ19JTk9VVCArICIgIjsKLSAgICAgICAgICAgICAgICBvdXRFbGVtZW50U2V0LnJlbW92ZShpbkVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBpbiArIGluRWxlbWVudE5hbWUgKyAiICIgKyBXU0RMMkNvbnN0YW50cy5SUENfSU4gKyAiICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3Igb3V0RWxlbWVudEl0ZXJhdG9yID0gb3V0RWxlbWVudFNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAob3V0RWxlbWVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIG91dEVsZW1lbnROYW1lID0gKFN0cmluZykgb3V0RWxlbWVudEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIG91dCA9IG91dCArIG91dEVsZW1lbnROYW1lICsgIiAiICsgV1NETDJDb25zdGFudHMuUlBDX1JFVFVSTiArICIgIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW4gKyBvdXQgKyBpbk91dDsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljeUFzRXh0ZW5zaWJsZUVsZW1lbnQoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwKLQkJCU9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0JCQlGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLCBBeGlzRmF1bHQgewotCQlQb2xpY3lTdWJqZWN0IHBvbGljeVN1YmplY3QgPSBheGlzRGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpOwotCQlDb2xsZWN0aW9uIGF0dGFjaFBvbGljeUNvbXBvbmVudHMgPSBwb2xpY3lTdWJqZWN0Ci0JCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRhY2hQb2xpY3lDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwb2xpY3lFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJCVBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSBQb2xpY3lVdGlsCi0JCQkJCQkuY3JlYXRlUG9saWN5UmVmZXJlbmNlKChQb2xpY3kpIHBvbGljeUVsZW1lbnQpOwotCQkJCU9NRWxlbWVudCBwb2xpY3lSZWZFbGVtZW50ID0gUG9saWN5VXRpbAotCQkJCQkJLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KAotCQkJCQkJCQkoUG9saWN5Q29tcG9uZW50KSBwb2xpY3lSZWZlcmVuY2UsIGZpbHRlcik7Ci0KLQkJCQlPTU5vZGUgZmlyc3RDaGlsZEVsZW0gPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGZpcnN0Q2hpbGRFbGVtID09IG51bGwpIHsKLQkJCQkJZGVzY3JpcHRpb25FbGVtZW50LmFkZENoaWxkKHBvbGljeVJlZkVsZW1lbnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpcnN0Q2hpbGRFbGVtLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5UmVmRWxlbWVudCk7Ci0JCQkJfQotCQkJCVN0cmluZyBrZXkgPSAoKFBvbGljeVJlZmVyZW5jZSkgcG9saWN5UmVmZXJlbmNlKS5nZXRVUkkoKTsKLQkJCQlpZiAoa2V5LnN0YXJ0c1dpdGgoIiMiKSkgewotCQkJCQlrZXkgPSBrZXkuc3Vic3RyaW5nKGtleS5pbmRleE9mKCIjIikgKyAxKTsKLQkJCQl9Ci0JCQkJcG9saWNpZXNJbkRlc2NyaXB0aW9uLnB1dChrZXksIChQb2xpY3kpIHBvbGljeUVsZW1lbnQpOwotCi0JCQl9IGVsc2UgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLQkJCQlPTUVsZW1lbnQgY2hpbGQgPSBQb2xpY3lVdGlsCi0JCQkJCQkuZ2V0UG9saWN5Q29tcG9uZW50QXNPTUVsZW1lbnQoKFBvbGljeUNvbXBvbmVudCkgcG9saWN5RWxlbWVudCk7Ci0JCQkJT01FbGVtZW50IGZpcnN0Q2hpbGRFbGVtID0gZGVzY3JpcHRpb25FbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJaWYgKGZpcnN0Q2hpbGRFbGVtID09IG51bGwpIHsKLQkJCQkJZGVzY3JpcHRpb25FbGVtZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaXJzdENoaWxkRWxlbS5pbnNlcnRTaWJsaW5nQmVmb3JlKGNoaWxkKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcga2V5ID0gKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQpLmdldFVSSSgpOwotCQkJCWlmIChrZXkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0JCQkJCWtleSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoIiMiKSArIDEpOwotCQkJCX0KLQotCQkJCVBvbGljeUxvY2F0b3IgbG9jYXRvciA9IG5ldyBQb2xpY3lMb2NhdG9yKGF4aXNTZXJ2aWNlKTsKLQkJCQlQb2xpY3kgcCA9IGxvY2F0b3IubG9va3VwKGtleSk7Ci0KLQkJCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBBeGlzRmF1bHQoIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIgKyBrZXkpOwotCQkJCX0KLQkJCQlwb2xpY2llc0luRGVzY3JpcHRpb24ucHV0KGtleSwgcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFBvbGljaWVzVG9EZXNjcmlwdGlvbkVsZW1lbnQoTGlzdCBwb2xpY2llcywKLQkJCU9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0JCQlGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvbGljaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlQb2xpY3kgcG9saWN5ID0gKFBvbGljeSkgcG9saWNpZXMuZ2V0KGkpOwotCQkJT01FbGVtZW50IHBvbGljeUVsZW1lbnQgPSBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KAotCQkJCQlwb2xpY3ksIGZpbHRlcik7Ci0JCQlPTU5vZGUgZmlyc3RDaGlsZCA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLQkJCWlmIChmaXJzdENoaWxkICE9IG51bGwpIHsKLQkJCQlmaXJzdENoaWxkLmluc2VydFNpYmxpbmdCZWZvcmUocG9saWN5RWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWRlc2NyaXB0aW9uRWxlbWVudC5hZGRDaGlsZChwb2xpY3lFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2VHcm91cC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0F4aXNTZXJ2aWNlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0ZDFlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2VHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0V2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2VHcm91cCBleHRlbmRzIEF4aXNEZXNjcmlwdGlvbiB7Ci0KLSAgICAvL3RvIGNoZWNrIHdoZXRoZXIgdXNlciBoYXMgcHV0IFdXVyBkaXIgb3Igbm90Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZvdW5kV2ViUmVzb3VyY2VzOwotICAgIC8vIHRvIHN0b3JlIG1vZHVsZSByZWYgYXQgZGVwbG95IHRpbWUgcGFyc2luZwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbW9kdWxlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgIC8vIHRvIHN0b3JlIG1vZGV1bGUgY29uZmlndXJhdGlvbiBpbmZvCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgTW9kdWxlQ29uZmlndXJhdGlvbj4gbW9kdWxlQ29uZmlnbWFwOwotCi0gICAgLy8gY2xhc3MgbG9hZGVyCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBzZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcjsKLQotICAgIC8vIHRvIGtlZXAgbmFtZSBvZiB0aGUgc2VydmljZSBncm91cAotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VHcm91cE5hbWU7Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCgpIHsKLSAgICAgICAgbW9kdWxlQ29uZmlnbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNb2R1bGVDb25maWd1cmF0aW9uPigpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZUdyb3VwKEF4aXNDb25maWd1cmF0aW9uIGF4aXNEZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHNldFBhcmVudChheGlzRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgbW9kdWxlIGNvbmZpZ3VyYXRpb24sIGlmIHRoZXJlIGlzIG1vZHVsZUNvbmZpZyB0YWcgaW4gc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVDb25maWd1cmF0aW9uIHRoZSBNb2R1bGVDb25maWd1cmF0aW9uIHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZUNvbmZpZyhNb2R1bGVDb25maWd1cmF0aW9uIG1vZHVsZUNvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgaWYgKG1vZHVsZUNvbmZpZ21hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb2R1bGVDb25maWdtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1vZHVsZUNvbmZpZ3VyYXRpb24+KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2R1bGVDb25maWdtYXAucHV0KG1vZHVsZUNvbmZpZ3VyYXRpb24uZ2V0TW9kdWxlTmFtZSgpLCBtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2R1bGVyZWYoU3RyaW5nIG1vZHVsZXJlZikgewotICAgICAgICBtb2R1bGVzTGlzdC5hZGQobW9kdWxlcmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmljZUdyb3VwTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzZXR1cCBhIHRlbXBvcmFyeSBuYW1lIGJhc2VkIG9uIHRoZSBmaXJzdCBzZXJ2aWNlIHVuZGVyIHRoaXMgZ3JvdXAKLSAgICAgICAgICAgIHNlcnZpY2VHcm91cE5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZpY2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBnZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIGlmIChheGlzQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8QXhpc01vZHVsZT4gaXRlcmF0b3IgPSBnZXRFbmdhZ2VkTW9kdWxlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGU7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBeGlzTW9kdWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNNb2R1bGUgPSAoQXhpc01vZHVsZSkgbzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsgLy9TaG91bGQgdGhpcyBiZSBjaGVja2VkCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZykgbzsKLSAgICAgICAgICAgICAgICAgICAgYXhpc01vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc01vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1vZHVsZW5vdGF2YWlsYmxlIiwgbW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtb2R1bGVub3RhdmFpbGJsZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VydmljZS5lbmdhZ2VNb2R1bGUoYXhpc01vZHVsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlLnNldExhc3RVcGRhdGUoKTsKLSAgICAgICAgYWRkQ2hpbGQoc2VydmljZSk7Ci0gICAgICAgIGlmIChheGlzQ29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkVG9BbGxTZXJ2aWNlc01hcChzZXJ2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2UKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgYWRkU2VydmljZSgpIGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUb0dyb3VwKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gYSBtb2R1bGUgZ2V0cyBlbmdhZ2VkIG9uIGEgU2VydmljZUdyb3VwLCB3ZSBoYXZlIHRvIGVuZ2FnZSBpdCBmb3IgZWFjaCBTZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZSB0aGUgbmV3bHktZW5nYWdlZCBBeGlzTW9kdWxlCi0gICAgICogQHBhcmFtIGVuZ2FnZXIKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkVuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSwgQXhpc0Rlc2NyaXB0aW9uIGVuZ2FnZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBmb3IgKEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPiBzZXJ2aWNlSXRlciA9IGdldFNlcnZpY2VzKCk7IHNlcnZpY2VJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5lbmdhZ2VNb2R1bGUobW9kdWxlLCBlbmdhZ2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRGlzZW5nYWdlKEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxBeGlzU2VydmljZT4gc2VydmljZUl0ZXIgPSBnZXRTZXJ2aWNlcygpOyBzZXJ2aWNlSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVTZXJ2aWNlKFN0cmluZyBuYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UobmFtZSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5ub3RpZnlPYnNlcnZlcnMoQXhpc0V2ZW50LlNFUlZJQ0VfUkVNT1ZFLCBzZXJ2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbW92ZUNoaWxkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2R1bGVDb25maWd1cmF0aW9uIGdldE1vZHVsZUNvbmZpZyhTdHJpbmcgbW9kdWxlTmFtZSkgewotICAgICAgICByZXR1cm4gKE1vZHVsZUNvbmZpZ3VyYXRpb24pIG1vZHVsZUNvbmZpZ21hcC5nZXQobW9kdWxlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxTdHJpbmc+IGdldE1vZHVsZVJlZnMoKSB7Ci0gICAgICAgIHJldHVybiBtb2R1bGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0U2VydmljZShTdHJpbmcgbmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiAoQXhpc1NlcnZpY2UpIGdldENoaWxkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VHcm91cENsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUdyb3VwTmFtZSgpIHsKLSAgICAgICAgLy8gTm90ZTogaWYgdGhlIHNlcnZpY2VHcm91cE5hbWUgaXMgbm90IHNldCwgdGhlbiB0aGlzIGNvdWxkIGJlIG51bGwuCi0gICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIGhhcyBub3QgYmVlbiBzZXQgYW5kIGEgc2VydmljZSBpcyBhZGRlZCB0byB0aGlzIGdyb3VwLAotICAgICAgICAvLyB0aGVuIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIHdpbGwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZmlyc3Qgc2VydmljZQotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8QXhpc1NlcnZpY2U+IGdldFNlcnZpY2VzKCkgewotICAgICAgICByZXR1cm4gKEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPilnZXRDaGlsZHJlbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF4aXNEZXNjcmlwdGlvbihBeGlzQ29uZmlndXJhdGlvbiBheGlzRGVzY3JpcHRpb24pIHsKLSAgICAgICAgc2V0UGFyZW50KGF4aXNEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgc2VydmljZUdyb3VwQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBDbGFzc0xvYWRlciA9IHNlcnZpY2VHcm91cENsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VHcm91cE5hbWUoU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlR3JvdXBOYW1lID0gc2VydmljZUdyb3VwTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgLy8gTm90ZTogaWYgdGhlIHNlcnZpY2VHcm91cE5hbWUgaXMgbm90IHNldCwgdGhlbiB0aGlzIGNvdWxkIGJlIG51bGwuCi0gICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIGhhcyBub3QgYmVlbiBzZXQgYW5kIGEgc2VydmljZSBpcyBhZGRlZCB0byB0aGlzIGdyb3VwLAotICAgICAgICAvLyB0aGVuIHRoZSBzZXJ2aWNlR3JvdXBOYW1lIHdpbGwgZGVmYXVsdCB0byB0aGUgbmFtZSBvZiB0aGUgZmlyc3Qgc2VydmljZQotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlR3JvdXBOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRm91bmRXZWJSZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiBmb3VuZFdlYlJlc291cmNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3VuZFdlYlJlc291cmNlcyhib29sZWFuIGZvdW5kV2ViUmVzb3VyY2VzKSB7Ci0gICAgICAgIHRoaXMuZm91bmRXZWJSZXNvdXJjZXMgPSBmb3VuZFdlYlJlc291cmNlczsKLSAgICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0NsaWVudFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2xpZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExMTEyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQ2xpZW50VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIGZvciB2YXJpb3VzIGNsaWVudHMgdG8gdXNlLgotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50VXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsaWVudFV0aWxzLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGluZmVyT3V0VHJhbnNwb3J0KEF4aXNDb25maWd1cmF0aW9uIGFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2djdHgpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IChTdHJpbmcpIG1zZ2N0eC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfVVJMKTsKLSAgICAgICAgaWYgKHRyYW5zcG9ydFVSSSAhPSBudWxsICYmICEiIi5lcXVhbHModHJhbnNwb3J0VVJJKSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gdHJhbnNwb3J0VVJJLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc3BvcnQgPSAoaW5kZXggPiAwKSA/IHRyYW5zcG9ydFVSSS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbnVsbDsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IGFjLmdldFRyYW5zcG9ydE91dCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnRPdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIk5vIFRyYW5wb3J0IFNlbmRlciBmb3VuZCBmb3IgOiAiICsgdHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gVHJhbnBvcnQgU2VuZGVyIGZvdW5kIGZvciA6ICIgKyB0cmFuc3BvcnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhYy5nZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjYW5ub3RJbmZlclRyYW5zcG9ydCIsIHRyYW5zcG9ydFVSSSkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90SW5mZXJUcmFuc3BvcnQiLCB0cmFuc3BvcnRVUkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtc2djdHguZ2V0T3B0aW9ucygpLmdldFRyYW5zcG9ydE91dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobXNnY3R4LmdldE9wdGlvbnMoKS5nZXRUcmFuc3BvcnRPdXQoKS5nZXRTZW5kZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJJbmNvbXBsZXRlIHRyYW5zcG9ydCBzZW5kZXI6IG1pc3Npbmcgc2VuZGVyISIpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW5jb21wbGV0ZSB0cmFuc3BvcnQgc2VuZGVyOiBtaXNzaW5nIHNlbmRlciEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1zZ2N0eC5nZXRPcHRpb25zKCkuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXByID09IG51bGwgfHwgKGVwci5nZXRBZGRyZXNzKCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90SW5mZXJUcmFuc3BvcnROb0FkZHIiKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJjYW5ub3RJbmZlclRyYW5zcG9ydE5vQWRkciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBlcHIuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc3BvcnQgPSAoaW5kZXggPiAwKSA/IHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogbnVsbDsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCAmJiBhYy5nZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjLmdldFRyYW5zcG9ydE91dCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90SW5mZXJUcmFuc3BvcnQiLCB1cmkpKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdEluZmVyVHJhbnNwb3J0IiwgdXJpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGluZmVySW5UcmFuc3BvcnQoQXhpc0NvbmZpZ3VyYXRpb24gYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgbGlzdGVuZXJUcmFuc3BvcnRQcm90b2NvbCA9IG9wdGlvbnMuZ2V0VHJhbnNwb3J0SW5Qcm90b2NvbCgpOwotICAgICAgICBpZiAobGlzdGVuZXJUcmFuc3BvcnRQcm90b2NvbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbXNnQ3R4dC5nZXRSZXBseVRvKCk7Ci0gICAgICAgICAgICBpZiAocmVwbHlUbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkocmVwbHlUby5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vbmVlZCB0byBpZ25vcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vYXNzdW1lIGxpc3RlbmVyIHRyYW5zcG9ydCBhcyBzZW5kZXIgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgaWYgKG1zZ0N0eHQuZ2V0VHJhbnNwb3J0T3V0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sID0gbXNnQ3R4dC5nZXRUcmFuc3BvcnRPdXQoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSBudWxsOwotICAgICAgICBpZiAob3B0aW9ucy5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSB8fCBtc2dDdHh0LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgaWYgKChsaXN0ZW5lclRyYW5zcG9ydFByb3RvY29sICE9IG51bGwpICYmICEiIi5lcXVhbHMobGlzdGVuZXJUcmFuc3BvcnRQcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbiA9IGFjLmdldFRyYW5zcG9ydEluKGxpc3RlbmVyVHJhbnNwb3J0UHJvdG9jb2wpOwotICAgICAgICAgICAgICAgIExpc3RlbmVyTWFuYWdlciBsaXN0ZW5lck1hbmFnZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ3R4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnRJbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBVc2VyIHNob3VsZCBub3QgYmUgbWFuZGF0ZWQgdG8gZ2l2ZSBhbiBJTiB0cmFuc3BvcnQuIElmIGl0IGlzIG5vdCBnaXZlbiwgd2Ugc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgIC8vIGFzayBmcm9tIHRoZSBMaXN0ZW5lck1hbmFnZXIgdG8gZ2l2ZSBhbnkgYXZhaWxhYmxlIHRyYW5zcG9ydCBmb3IgdGhpcyBjbGllbnQuCi0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmtub3duVHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHJhbnNwb3J0UHJvdG9jb2wpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmtub3duVHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyVHJhbnNwb3J0UHJvdG9jb2wpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lck1hbmFnZXIuaXNMaXN0ZW5lclJ1bm5pbmcodHJhbnNwb3J0SW4uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIuYWRkTGlzdGVuZXIodHJhbnNwb3J0SW4sIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXNnQ3R4dC5nZXRBeGlzU2VydmljZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1zZ0N0eHQuaXNFbmdhZ2VkKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORykpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIjJjaGFubmVsTmVlZEFkZHJlc3NpbmciKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiMmNoYW5uZWxOZWVkQWRkcmVzc2luZyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghYWMuaXNFbmdhZ2VkKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORykpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIjJjaGFubmVsTmVlZEFkZHJlc3NpbmciKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiMmNoYW5uZWxOZWVkQWRkcmVzc2luZyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJhbnNwb3J0SW47Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiOGVhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdGlvbkNvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBFWEVDVVRJT05fQ0hBSU5fS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUSU9OX0NIQUlOX0tFWSA9ICJFWEVDVVRJT05fQ0hBSU5fS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEVYRUNVVElPTl9PVVRfQ0hBSU5fS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhFQ1VUSU9OX09VVF9DSEFJTl9LRVkgPSAiRVhFQ1VUSU9OX09VVF9DSEFJTl9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgRVhFQ1VUSU9OX0ZBVUxUX0NIQUlOX0tFWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVElPTl9GQVVMVF9DSEFJTl9LRVkgPSAiRVhFQ1VUSU9OX0ZBVUxUX0NIQUlOX0tFWSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNT0RVTEVSRUZfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFUkVGX0tFWSA9ICJNT0RVTEVSRUZfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE9QRVJBVElPTl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fS0VZID0gIk9QRVJBVElPTl9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgTUVTU0FHRV9SRUNFSVZFUl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX1JFQ0VJVkVSX0tFWSA9ICJQUk9WSURFUl9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ09OVEVYVFBBVEhfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVFBBVEhfS0VZID0gIkNPTlRFWFRQQVRIX0tFWSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBDTEFTU0xPQURFUl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0xPQURFUl9LRVkgPSAiQ0xBU1NMT0FERVJfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFNUWUxFX0tFWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX0tFWSA9ICJTVFlMRV9LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU0VSVklDRV9DTEFTU19OQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9DTEFTU19OQU1FID0gIlNFUlZJQ0VfQ0xBU1NfTkFNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQSEFTRVNfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VTX0tFWSA9ICJQSEFTRVNfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFBBUkFNRVRFUl9LRVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfS0VZID0gIlBBUkFNRVRFUl9LRVkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVF9GQVVMVEZMT1dfS0VZID0gIk9VVF9GQVVMVEZMT1dfS0VZIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE9VVEZMT1dfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VURkxPV19LRVkgPSAiT1VURkxPV19LRVkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSU5fRkFVTFRGTE9XX0tFWQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOX0ZBVUxURkxPV19LRVkgPSAiSU5fRkFVTFRGTE9XX0tFWSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBJTkZMT1dfS0VZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GTE9XX0tFWSA9ICJJTkZMT1dfS0VZIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9GbG93LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk0OTQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9GbG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgRmxvd0ltcGwKLSAqLwotcHVibGljIGNsYXNzIEZsb3cgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgbGlzdAotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PEhhbmRsZXJEZXNjcmlwdGlvbj4gbGlzdDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIEZsb3dJbXBsCi0gICAgICovCi0gICAgcHVibGljIEZsb3coKSB7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXJEZXNjcmlwdGlvbj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkSGFuZGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcikgewotICAgICAgICBsaXN0LmFkZChoYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0SGFuZGxlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleAotICAgICAqIEByZXR1cm4gUmV0dXJucyBIYW5kbGVyRGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIEhhbmRsZXJEZXNjcmlwdGlvbiBnZXRIYW5kbGVyKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKEhhbmRsZXJEZXNjcmlwdGlvbikgbGlzdC5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRIYW5kbGVyQ291bnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgaW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlckNvdW50KCkgewotICAgICAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0Zsb3dJbmNsdWRlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRmxvd0luY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYmNlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vRmxvd0luY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotLyoqCi0gKiBDbGFzcyBGbG93SW5jbHVkZUltcGwKLSAqLwotcHVibGljIGNsYXNzIEZsb3dJbmNsdWRlIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBGbG93IEluX2ZhdWx0OwotICAgIHByaXZhdGUgRmxvdyBPdXRfZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBpbgotICAgICAqLwotICAgIHByaXZhdGUgRmxvdyBpbjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIG91dAotICAgICAqLwotICAgIHByaXZhdGUgRmxvdyBvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0RmF1bHRJbkZsb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRmxvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvdyBnZXRGYXVsdEluRmxvdygpIHsKLSAgICAgICAgcmV0dXJuIEluX2ZhdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuT3V0X2ZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRJbkZsb3cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRmxvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmxvdyBnZXRJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0T3V0Rmxvdy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBGbG93LgotICAgICAqLwotICAgIHB1YmxpYyBGbG93IGdldE91dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldEZhdWx0SW5GbG93LgotICAgICAqCi0gICAgICogQHBhcmFtIGZsb3cKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEluRmxvdyhGbG93IGZsb3cpIHsKLSAgICAgICAgdGhpcy5Jbl9mYXVsdCA9IGZsb3c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRPdXRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRoaXMuT3V0X2ZhdWx0ID0gZmF1bHRGbG93OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzZXRJbkZsb3cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluRmxvdyhGbG93IGZsb3cpIHsKLSAgICAgICAgdGhpcy5pbiA9IGZsb3c7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldE91dEZsb3cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmxvdwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE91dEZsb3coRmxvdyBmbG93KSB7Ci0gICAgICAgIHRoaXMub3V0ID0gZmxvdzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSGFuZGxlckRlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSGFuZGxlckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZWQ0MmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0hhbmRsZXJEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIGRlcGxveW1lbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhbmRsZXIKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJEZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmFtZXRlckluY2x1ZGUgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgY2xhc3NOYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIGhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVySW5jbHVkZTsKLSAgICBwcml2YXRlIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50OwotICAgIHByaXZhdGUgUGhhc2VSdWxlIHJ1bGVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgSGFuZGxlckRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVySW5jbHVkZSA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgICAgICB0aGlzLnJ1bGVzID0gbmV3IFBoYXNlUnVsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIEhhbmRsZXJEZXNjcmlwdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgaGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIFBhcmFtZXRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBQYXJhbWV0ZXIgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBIYW5kbGVyRGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW10ZXJsb2NrZWRieXBhcmVudCIsIHBhcmFtLmdldE5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyYW1ldGVySW5jbHVkZS5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLCBwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckluY2x1ZGUucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVySW5jbHVkZS5kZXNlcmlhbGl6ZVBhcmFtZXRlcnMocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldENsYXNzTmFtZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEhhbmRsZXIuCi0gICAgICovCi0gICAgcHVibGljIEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbmFtZWQgUGFyYW1ldGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIFBhcmFtZXRlciB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGEgUGFyYW1ldGVyLCB3aGljaCBtYXkgY29tZSBmcm9tIHVzIG9yIGZyb20gc29tZSBwYXJlbnQgdXAgdGhlIHRyZWUsIG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlckluY2x1ZGUuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICBpZiAocGFyYW1ldGVyID09IG51bGwgJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVySW5jbHVkZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlckluY2x1ZGUgZ2V0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRSdWxlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBQaGFzZVJ1bGUuCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlUnVsZSBnZXRSdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIHJ1bGVzOwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgYXQgYW55IGxldmVsCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmlzUGFyYW1ldGVyTG9ja2VkKHBhcmFtZXRlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW1ldGVySW5jbHVkZS5pc1BhcmFtZXRlckxvY2tlZChwYXJhbWV0ZXJOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0Q2xhc3NOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgSGFuZGxlciBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4cGxpY2l0bHkgc2V0IHRoZSBIYW5kbGVyIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIgYSBIYW5kbGVyIGluc3RhbmNlLCB3aGljaCB3aWxsIGJlIGRlcGxveWVkIHdoZXJldmVyIHRoaXMgSGFuZGxlckRlc2NyaXB0aW9uIGlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBoYW5kbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIGRlc2lyZWQgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoUGFyYW1ldGVySW5jbHVkZSBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXBsb3ltZW50IHJ1bGVzIGZvciB0aGlzIEhhbmRsZXJEZXNjcmlwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHJ1bGVzIGEgUGhhc2VSdWxlIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bGVzKFBoYXNlUnVsZSBydWxlcykgewotICAgICAgICB0aGlzLnJ1bGVzID0gcnVsZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0luT25seUF4aXNPcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Jbk9ubHlBeGlzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWI5NTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL0luT25seUF4aXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIEluT25seUF4aXNPcGVyYXRpb24gZXh0ZW5kcyBBeGlzT3BlcmF0aW9uIHsKLQotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgaW5GYXVsdE1lc3NhZ2U7Ci0vLyAgICBwcml2YXRlIEF4aXNNZXNzYWdlIGluTWVzc2FnZTsKLSAgICBwcml2YXRlIEF4aXNNZXNzYWdlIG91dEZhdWx0TWVzc2FnZTsKLQotICAgIC8vIHRoaXMgaXMganVzdCB0byBzdG9yZSB0aGUgY2hhaW4gLCB3ZSBkb24ndCB1c2UgaXQKLSAgICBwcml2YXRlIEFycmF5TGlzdCBvdXRQaGFzZTsKLQotICAgIHB1YmxpYyBJbk9ubHlBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgICAgIGNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbk9ubHlBeGlzT3BlcmF0aW9uKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIGNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25DbGllbnQgY3JlYXRlQ2xpZW50KFNlcnZpY2VDb250ZXh0IHNjLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG5vdHlldGltcGxlbWVudGVkIiwgbWVwVVJJKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShBeGlzTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0vLyAgICAgICAgICAgIGluTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgICAgICBhZGRDaGlsZCgiaW5NZXNzYWdlIiwgbWVzc2FnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICghb3BDb250ZXh0LmlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0cygpLnB1dChNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWVwY29tcGxldGVkIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmF1bHRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUNvbnRleHQ+IG1lcCA9IG9wQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dHMoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRNZXNzYWdlQ3R4dCA9IChNZXNzYWdlQ29udGV4dCkgbWVwLmdldChNRVNTQUdFX0xBQkVMX0ZBVUxUX1ZBTFVFKTsKLSAgICAgICAgaWYgKGZhdWx0TWVzc2FnZUN0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBjb21wbGV0ZWQiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXAucHV0KE1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgb3BDb250ZXh0LnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgb3BDb250ZXh0LmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNZXNzYWdlKCkgewotICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgaW5NZXNzYWdlLnNldERpcmVjdGlvbihXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4pOwotICAgICAgICBpbk1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIGluRmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIGluRmF1bHRNZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLQotICAgICAgICBvdXRGYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLQotICAgICAgICBvdXRQaGFzZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBhZGRDaGlsZCgiaW5NZXNzYWdlIiwgaW5NZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc01lc3NhZ2UgZ2V0TWVzc2FnZShTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgiaW5NZXNzYWdlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZGFjZXNzIikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGluRmF1bHRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdE1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBoYXNlc091dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRQaGFzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpIHsKLSAgICAgICAgcmV0dXJuICgoQXhpc01lc3NhZ2UpIGdldENoaWxkKCJpbk1lc3NhZ2UiKSkuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICBpbkZhdWx0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlc091dEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0UGhhc2UgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1BoYXNlc0luRmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICAoKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgiaW5NZXNzYWdlIikpLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Jbk91dEF4aXNPcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Jbk91dEF4aXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk5OGYyYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vSW5PdXRBeGlzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcGVyYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBJbk91dEF4aXNPcGVyYXRpb24gZXh0ZW5kcyBUd29DaGFubmVsQXhpc09wZXJhdGlvbiB7Ci0KLSAgICBwdWJsaWMgSW5PdXRBeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEluT3V0QXhpc09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25DbGllbnQgY3JlYXRlQ2xpZW50KFNlcnZpY2VDb250ZXh0IHNjLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG5vdHlldGltcGxlbWVudGVkIiwgbWVwVVJJKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFzaE1hcCBtZXAgPSBvcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTXNnQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dCkgbWVwLmdldChNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgb3V0bXNnQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dCkgbWVwLmdldChNRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0KLSAgICAgICAgaWYgKChpbk1zZ0NvbnRleHQgIT0gbnVsbCkgJiYgKG91dG1zZ0NvbnRleHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWVwY29tcGxldGVkIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluTXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXAucHV0KE1FU1NBR0VfTEFCRUxfSU5fVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVwLnB1dChNRVNTQUdFX0xBQkVMX09VVF9WQUxVRSwgbXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBvcENvbnRleHQuc2V0Q29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICBvcENvbnRleHQuY2xlYW51cCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01lc3NhZ2VDb250ZXh0TGlzdGVuZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9NZXNzYWdlQ29udGV4dExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWQyMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01lc3NhZ2VDb250ZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIEEgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciBpcyByZWdpc3RlcmVkIG9uIHRoZSBBeGlzU2VydmljZS4NCi0gKiBXaGVuIGEgU2VydmljZUNvbnRleHQgaXMgYXR0YWNoZWQgdG8gdGhlIE1lc3NhZ2VDb250ZXh0LCANCi0gKiB0aGUgYXR0YWNoU2VydmljZUNvbnRleHRFdmVudCBpcyB0cmlnZ2VyZWQuDQotICogV2hlbiBhbiBFbnZlbG9wZSBpcyBhdHRhY2hlZCB0byB0aGUgTWVzc2FnZUNvbnRleHQsIA0KLSAqIHRoZSBhdHRhY2hFbnZlbG9wZUV2ZW50IGlzIHRyaWdnZXJlZC4NCi0gKiANCi0gKiBUaGVzZSB0d28gZXZlbnRzIG9jY3VyIGF0IGNyaXRpY2FsIHBvaW50cyBpbiB0aGUgbWVzc2FnZSBzZW5kaW5nDQotICogb3IgcmVjZWl2aW5nLiAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXINCi0gKiBtYXkgbG9nIGluZm9ybWF0aW9uLCBzZXQgc3BlY2lhbCBwcm9wZXJ0aWVzIG9yIHRyaWdnZXIgZXZlbnRzLg0KLSAqIA0KLSAqIEZvciBleGFtcGxlIHRoZSBKQVhXUyBtb2R1bGUgdXNlcyBhIE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIgdG8gDQotICogcmVnaXN0ZXIgYSBKQVhCQ3VzdG9tQnVpbGRlciBvbiB0aGUgZW52ZWxvcGUncyBTdEFYT01CdWlsZGVyLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciB7DQotDQotICAgIHB1YmxpYyB2b2lkIGF0dGFjaFNlcnZpY2VDb250ZXh0RXZlbnQoU2VydmljZUNvbnRleHQgc2MsIE1lc3NhZ2VDb250ZXh0IG1jKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGF0dGFjaEVudmVsb3BlRXZlbnQoTWVzc2FnZUNvbnRleHQgbWMpOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL01vZHVsZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmNzlhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vTW9kdWxlQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIFRoaXMgaXMgdG8gc3RvcmUgZGVwbG95bWVudCB0aW1lIGRhdGEgLCBkZXNjcmliZWQgYnkKLSAqIDxtb2R1bGVDb25maWcgbW9kdWxlPSJtb2R1bGVuYW1lIj4KLSAqIDxwYXJhbWV0ZXI+IC4uLi48L3BhcmFtZXRlcj4KLSAqIDwvbW9kdWxlQ29uZmlnPgotICogPHAvPgotICogUmlnaHQgbm93IHRoaXMganVzdCBrZWVwcyBzdG9yZXMgdGhlIHNldCBvZiBwYXJhbWV0ZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVDb25maWd1cmF0aW9uIGltcGxlbWVudHMgUGFyYW1ldGVySW5jbHVkZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZTsKLSAgICBwcml2YXRlIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1ldGVySW5jbHVkZTsKLQotICAgIC8vIHRvIGtlZXAgdGhlIHBvaW50ZXIgdG8gaXRzIHBhcmVudCAsIG9ubHkgdG8gYWNjZXNzIHBhcmFtZXRlcnMKLSAgICBwcml2YXRlIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50OwotCi0gICAgcHVibGljIE1vZHVsZUNvbmZpZ3VyYXRpb24oU3RyaW5nIG1vZHVsZU5hbWUsIFBhcmFtZXRlckluY2x1ZGUgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlID0gbmV3IFBhcmFtZXRlckluY2x1ZGVJbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc1BhcmFtZXRlckxvY2tlZChwYXJhbS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBhcmFtdGVybG9ja2VkYnlwYXJlbnQiLCBwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJwYXJhbXRlcmxvY2tlZGJ5cGFyZW50IiwgcGFyYW0uZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJJbmNsdWRlLnJlbW92ZVBhcmFtZXRlcihwYXJhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLnBhcmFtZXRlckluY2x1ZGUuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1vZHVsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckluY2x1ZGUuZ2V0UGFyYW1ldGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVySW5jbHVkZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQotICAgICAgICAvLyBjaGVja2luZyB0aGUgbG9ja2VkIHZhbHVlIG9mIHBhcmVudAotICAgICAgICBib29sZWFuIGxvc2NrZWQgPSBmYWxzZTsKLQotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvc2NrZWQgPSBwYXJlbnQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9zY2tlZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gZ2V0UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUpOwotCi0gICAgICAgICAgICByZXR1cm4gKHBhcmFtZXRlciAhPSBudWxsKSAmJiBwYXJhbWV0ZXIuaXNMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9PdXRJbkF4aXNPcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9PdXRJbkF4aXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxZmE2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vT3V0SW5BeGlzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNhbGxiYWNrUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgT3V0SW5BeGlzT3BlcmF0aW9uIGV4dGVuZHMgVHdvQ2hhbm5lbEF4aXNPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE91dEluQXhpc09wZXJhdGlvbi5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgT3V0SW5BeGlzT3BlcmF0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICAvL3NldHVwIGEgdGVtcG9yYXJ5IG5hbWUKLSAgICAgICAgUU5hbWUgdG1wTmFtZSA9IG5ldyBRTmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl8iICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICB0aGlzLnNldE5hbWUodG1wTmFtZSk7Ci0gICAgICAgIHNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRJbkF4aXNPcGVyYXRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlQ29udGV4dD4gbWVwID0gb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0cygpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBpbW1zZ0NvbnRleHQgPSAoTWVzc2FnZUNvbnRleHQpIG1lcAotICAgICAgICAgICAgICAgIC5nZXQoTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG91dG1zZ0NvbnRleHQgPSAoTWVzc2FnZUNvbnRleHQpIG1lcAotICAgICAgICAgICAgICAgIC5nZXQoTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotCi0gICAgICAgIGlmICgoaW1tc2dDb250ZXh0ICE9IG51bGwpICYmIChvdXRtc2dDb250ZXh0ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcGNvbXBsZXRlZCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdXRtc2dDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG1lcC5wdXQoTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVwLnB1dChNRVNTQUdFX0xBQkVMX0lOX1ZBTFVFLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgTUVQIGNsaWVudCBmb3IgYW4gT3V0LUlOIG9wZXJhdGlvbi4gVGhpcyBjbGllbnQgY2FuIGJlIHVzZWQgdG8KLSAgICAgKiBpbnRlcmFjdCB3aXRoIGEgc2VydmVyIHdoaWNoIGlzIG9mZmVyaW5nIGFuIEluLU91dCBvcGVyYXRpb24uIFRvIHVzZSB0aGUKLSAgICAgKiBjbGllbnQsIHlvdSBtdXN0IGNhbGwgYWRkTWVzc2FnZUNvbnRleHQoKSB3aXRoIGEgbWVzc2FnZSBjb250ZXh0IGFuZCB0aGVuCi0gICAgICogY2FsbCBleGVjdXRlKCkgdG8gZXhlY3V0ZSB0aGUgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNjICAgICAgVGhlIHNlcnZpY2UgY29udGV4dCBmb3IgdGhpcyBjbGllbnQgdG8gbGl2ZSB3aXRoaW4uIENhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgIG51bGwuCi0gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byB1c2UgYXMgZGVmYXVsdHMgZm9yIHRoaXMgY2xpZW50LiBJZiBhbnkgb3B0aW9ucyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgICBzZXQgc3BlY2lmaWNhbGx5IG9uIHRoZSBjbGllbnQgdGhlbiB0aG9zZSBvdmVycmlkZSBvcHRpb25zCi0gICAgICogICAgICAgICAgICAgICAgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uQ2xpZW50IGNyZWF0ZUNsaWVudChTZXJ2aWNlQ29udGV4dCBzYywgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50KHRoaXMsIHNjLCBvcHRpb25zKTsKLSAgICB9Ci19Ci0KLS8qKgotICogTUVQIGNsaWVudCBmb3IgbW9pLgotICovCi1jbGFzcyBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQgZXh0ZW5kcyBPcGVyYXRpb25DbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE91dEluQXhpc09wZXJhdGlvbkNsaWVudC5jbGFzcyk7Ci0KLSAgICBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQoT3V0SW5BeGlzT3BlcmF0aW9uIGF4aXNPcCwgU2VydmljZUNvbnRleHQgc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICBzdXBlcihheGlzT3AsIHNjLCBvcHRpb25zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIG1lc3NhZ2UgY29udGV4dCB0byBvcGVyYXRpb24gY29udGV4dCwgc28gdGhhdCBpdCB3aWxsIGhhbmRsZSB0aGUKLSAgICAgKiBsb2dpYyBjb3JyZWN0bHkgaWYgdGhlIE9wZXJhdGlvbkNvbnRleHQgaXMgbnVsbCB0aGVuIG5ldyBvbmUgd2lsbCBiZQotICAgICAqIGNyZWF0ZWQsIGFuZCBPcGVyYXRpb24gQ29udGV4dCB3aWxsIGJlY29tZSBudWxsIHdoZW4gc29tZSBvbmUgY2FsbHMgcmVzZXQoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCB0byBhZGQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNjKTsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0TWVzc2FnZUlEKG1zZ0NvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNPcC5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobXNnQ29udGV4dCwgb2MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgY29udGV4dCBmb3IgYSBnaXZlbiBtZXNzYWdlIGxhYmVsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VMYWJlbCA6Ci0gICAgICogICAgICAgICAgICAgICAgICAgICBsYWJlbCBvZiB0aGUgbWVzc2FnZSBhbmQgdGhhdCBjYW4gYmUgZWl0aGVyICJPdXQiIG9yICJJbiIgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICBub3RoaW5nIGVsc2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTWVzc2FnZUNvbnRleHQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gb2MuZ2V0TWVzc2FnZUNvbnRleHQobWVzc2FnZUxhYmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIE1FUC4gV2hhdCB0aGlzIGRvZXMgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgTUVQIGNsaWVudC4gVGhlCi0gICAgICogYmFzaWMgaWRlYSBpcyB0byBoYXZlIHRoZSBNRVAgY2xpZW50IGV4ZWN1dGUgYW5kIGRvIHNvbWV0aGluZyB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2VzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIGl0IHNvIGZhci4gRm9yIGV4YW1wbGUsIGlmIGl0cyBhbiBPdXQtSW4KLSAgICAgKiBNRVAsIHRoZW4gaWYgdGhlIE91dCBtZXNzYWdlIGhhcyBiZWVuIHNldCwgdGhlbiBleGVjdXRpbmcgdGhlIGNsaWVudCBhc2tzCi0gICAgICogaXQgdG8gc2VuZCB0aGUgbWVzc2FnZSBhbmQgZ2V0IHRoZSBJbiBtZXNzYWdlLCBwb3NzaWJseSB1c2luZyBhIGRpZmZlcmVudAotICAgICAqIHRocmVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBibG9jayBJbmRpY2F0ZXMgd2hldGhlciBleGVjdXRpb24gc2hvdWxkIGJsb2NrIG9yIHJldHVybiBBU0FQLiBXaGF0Ci0gICAgICogICAgICAgICAgICAgIGJsb2NrIG1lYW5zIGlzIG9mIGNvdXJzZSBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYyBNRVAKLSAgICAgKiAgICAgICAgICAgICAgY2xpZW50LiBJR05PUkVEIEJZIFRISVMgTUVQIENMSUVOVC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgTUVQLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVJbXBsKGJvb2xlYW4gYmxvY2spIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50cnk6IE91dEluQXhpc09wZXJhdGlvbkNsaWVudDo6ZXhlY3V0ZSwgIiArIGJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tcGxldGVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcGlzY29tcGx0ZWQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBzYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIC8vIGNvcHkgaW50ZXJlc3RpbmcgaW5mbyBmcm9tIG9wdGlvbnMgdG8gbWVzc2FnZSBjb250ZXh0LgotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG9jLmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICBpZiAobWMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJvdXRtc2djdHhudWxsIikpOwotICAgICAgICB9Ci0gICAgICAgIHByZXBhcmVNZXNzYWdlQ29udGV4dChjYywgbWMpOwotCi0gICAgICAgIGlmIChvcHRpb25zLmdldFRyYW5zcG9ydEluKCkgPT0gbnVsbCAmJiBtYy5nZXRUcmFuc3BvcnRJbigpID09IG51bGwpIHsKLSAgICAgICAgICAgIG1jLnNldFRyYW5zcG9ydEluKENsaWVudFV0aWxzLmluZmVySW5UcmFuc3BvcnQoY2MKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCksIG9wdGlvbnMsIG1jKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWMuZ2V0VHJhbnNwb3J0SW4oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYy5zZXRUcmFuc3BvcnRJbihvcHRpb25zLmdldFRyYW5zcG9ydEluKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIGEgbW9kdWxlIGhhcyBzZXQgdGhlIFVTRV9BU1lOQ19PUEVSQVRJT05TIG9wdGlvbiB0aGVuIHdlIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIKLSAgICAgICAgICogZm9yIHN5bmMgY2FsbHMsIGFuZCBlZmZlY3RpdmVseSBVU0VfQ1VTVE9NX0xJU1RFTkVSIHRvby4gSG93ZXZlciB3ZSBsZWF2ZSByZWFsCi0gICAgICAgICAqIGFzeW5jIGNhbGxzIGFsb25lLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiB1c2VBc3luYyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1jLmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgQm9vbGVhbiB1c2VBc3luY09wdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBtYy5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfQVNZTkNfT1BFUkFUSU9OUyk7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiB1c2VBc3luY09wdGlvbiAiICsgdXNlQXN5bmNPcHRpb24pOwotICAgICAgICAgICAgaWYgKHVzZUFzeW5jT3B0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VBc3luYyA9IHVzZUFzeW5jT3B0aW9uLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgcmVwbHlUbyA9IG1jLmdldFJlcGx5VG8oKTsKLSAgICAgICAgaWYgKHJlcGx5VG8gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJlcGx5VG8uaGFzTm9uZUFkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIHJlcGx5VG8uZ2V0QWRkcmVzcygpICsgIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBjYW4gbm90IGJlIHVzZWQgd2l0aCBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQgLCB1c2VyIGVpdGhlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmaXJlQW5kRm9yZ2V0IG9yIHNlbmRSb2J1c3QpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXBseVRvLmlzV1NBZGRyZXNzaW5nQW5vbnltb3VzKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIHJlcGx5VG8uZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYy5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLklOQ0xVREVfT1BUSU9OQUxfSEVBREVSUywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGN1c3RvbVJlcGx5VG8gPSAoU3RyaW5nKW9wdGlvbnMuZ2V0UHJvcGVydHkoT3B0aW9ucy5DVVNUT01fUkVQTFlUT19BRERSRVNTKTsKLSAgICAgICAgICAgIGlmICggISAoT3B0aW9ucy5DVVNUT01fUkVQTFlUT19BRERSRVNTX1RSVUUuZXF1YWxzKGN1c3RvbVJlcGx5VG8pKSkgewotICAgICAgICAgICAgICAgIGlmICghcmVwbHlUby5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpewotICAgICAgICAgICAgICAgICAgICB1c2VBc3luYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZUFzeW5jIHx8IG1jLmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgc2VuZEFzeW5jKHVzZUFzeW5jLCBtYyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYmxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBTT0FQIE1lc3NhZ2UgYW5kIHJlY2VpdmUgYSByZXNwb25zZQotICAgICAgICAgICAgICAgIHNlbmQobWMpOwotICAgICAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNjLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0VGhyZWFkUG9vbCgpLmV4ZWN1dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyKGNhbGxiYWNrLCBtYywgYXhpc0NhbGxiYWNrKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZEFzeW5jKGJvb2xlYW4gdXNlQXN5bmMsIE1lc3NhZ2VDb250ZXh0IG1jKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJ1c2VBc3luYz0iICsgdXNlQXN5bmMgKyAiLCBzZXBlcmF0ZUxpc3RlbmVyPSIgKwotICAgICAgICAgICAgICAgICAgICBtYy5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBXZSBhcmUgZm9sbG93aW5nIHRoZSBhc3luYyBwYXRoLiBJZiB0aGUgdXNlciBoYXNuJ3Qgc2V0IGEgY2FsbGJhY2sgb2JqZWN0IHRoZW4gd2UgbXVzdAotICAgICAgICAgKiBibG9jayB1bnRpbCB0aGUgd2hvbGUgTUVQIGlzIGNvbXBsZXRlLCBhcyB0aGV5IGhhdmUgbm8gb3RoZXIgd2F5IHRvIGdldCB0aGVpciByZXBseSBtZXNzYWdlLgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVEhSRUFEU0FGRSBpc3N1ZTogTXVsdGlwbGUgdGhyZWFkcyBjb3VsZCBiZSB0cnlpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIKLSAgICAgICAgLy8gc28gaXQgaXMgc3luY2hyb25pemVkLiAgSXQgaXMgbm90IGRvbmUgd2l0aGluIHRoZSBlbHNlIGNsYXVzZSB0byBhdm9pZCB0aGUgCi0gICAgICAgIC8vIGRvdWJsZS1jaGVja2VkIGxvY2sgYW50aXBhdHRlcm4uCi0gICAgICAgIENhbGxiYWNrUmVjZWl2ZXIgY2FsbGJhY2tSZWNlaXZlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChheGlzT3ApIHsKLSAgICAgICAgICAgIGlmIChheGlzT3AuZ2V0TWVzc2FnZVJlY2VpdmVyKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICBheGlzT3AuZ2V0TWVzc2FnZVJlY2VpdmVyKCkgaW5zdGFuY2VvZiBDYWxsYmFja1JlY2VpdmVyKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2tSZWNlaXZlciA9IChDYWxsYmFja1JlY2VpdmVyKSBheGlzT3AuZ2V0TWVzc2FnZVJlY2VpdmVyKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIG5ldyBjYWxsYmFjayByZWNlaXZlciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYWxsYmFja1JlY2VpdmVyID0gbmV3IENhbGxiYWNrUmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKGNhbGxiYWNrUmVjZWl2ZXIpOwotCQkJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJPdXRJbkF4aXNPcGVyYXRpb246IGNhbGxiYWNrUmVjZWl2ZXIgIiArIGNhbGxiYWNrUmVjZWl2ZXIgKyAiIDogIiArIGF4aXNPcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTeW5jQ2FsbEJhY2sgaW50ZXJuYWxDYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWxsYmFja1JlY2VpdmVyLmFkZENhbGxiYWNrKG1jLmdldE1lc3NhZ2VJRCgpLCBjYWxsYmFjayk7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiBDcmVhdGluZyBjYWxsYmFjayIpOwotICAgICAgICB9IGVsc2UgaWYgKGF4aXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYWxsYmFja1JlY2VpdmVyLmFkZENhbGxiYWNrKG1jLmdldE1lc3NhZ2VJRCgpLCBheGlzQ2FsbGJhY2spOyAgCi0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiBDcmVhdGluZyBheGlzIGNhbGxiYWNrIik7CQkJCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIGludGVybmFsIGNhbGxiYWNrIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbENhbGxiYWNrID0gbmV3IFN5bmNDYWxsQmFjaygpOwotICAgICAgICAgICAgY2FsbGJhY2tSZWNlaXZlci5hZGRDYWxsYmFjayhtYy5nZXRNZXNzYWdlSUQoKSwgaW50ZXJuYWxDYWxsYmFjayk7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50OiBDcmVhdGluZyBpbnRlcm5hbCBjYWxsYmFjayIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIFVTRV9DVVNUT01fTElTVEVORVIgaXMgc2V0IHRvICd0cnVlJyB0aGUgcmVwbHlUbyB2YWx1ZSB3aWxsIG5vdCBiZSByZXBsYWNlZCBhbmQgQXhpczIgd2lsbCBub3QKLSAgICAgICAgICogc3RhcnQgaXRzIGludGVybmFsIGxpc3RuZXIuIFNvbWUgb3RoZXIgZW5udGl0eSAoZS5nLiBhIG1vZHVsZSkgc2hvdWxkIHRha2UgY2FyZSBvZiBvYnRhaW5pbmcgdGhlCi0gICAgICAgICAqIHJlc3BvbnNlIG1lc3NhZ2UuCi0gICAgICAgICAqLwotICAgICAgICBCb29sZWFuIHVzZUN1c3RvbUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICAoQm9vbGVhbikgb3B0aW9ucy5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5VU0VfQ1VTVE9NX0xJU1RFTkVSKTsKLSAgICAgICAgaWYgKHVzZUFzeW5jKSB7Ci0gICAgICAgICAgICB1c2VDdXN0b21MaXN0ZW5lciA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXNlQ3VzdG9tTGlzdGVuZXIgPT0gbnVsbCB8fCAhdXNlQ3VzdG9tTGlzdGVuZXIuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlcGx5VG8gPSBtYy5nZXRSZXBseVRvKCk7Ci0gICAgICAgICAgICBpZiAocmVwbHlUbyA9PSBudWxsIHx8IHJlcGx5VG8uaGFzQW5vbnltb3VzQWRkcmVzcygpKXsKLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvRnJvbVRyYW5zcG9ydCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYy5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldExpc3RlbmVyTWFuYWdlcigpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFUFJmb3JTZXJ2aWNlKHNjLmdldEF4aXNTZXJ2aWNlKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIG1jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydEluKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZXBseVRvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbWMuc2V0UmVwbHlUbyhyZXBseVRvRnJvbVRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHlUby5zZXRBZGRyZXNzKHJlcGx5VG9Gcm9tVHJhbnNwb3J0LmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9pZiB3ZSBkb24ndCBkbyB0aGlzICwgdGhpcyBndXkgd2lsbCB3YWl0IHRpbGwgaXQgZ2V0cyBIVFRQIDIwMiBpbiB0aGUgSFRUUCBjYXNlCi0gICAgICAgIG1jLnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9OT05fQkxPQ0tJTkcsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIG1jLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KG1jLmdldE1lc3NhZ2VJRCgpLCBvYyk7Ci0gICAgICAgIEF4aXNFbmdpbmUuc2VuZChtYyk7Ci0gICAgICAgIGlmIChpbnRlcm5hbENhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVybmFsQ2FsbGJhY2sud2FpdEZvckNvbXBsZXRpb24ob3B0aW9ucy5nZXRUaW1lT3V0SW5NaWxsaVNlY29uZHMoKSk7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbgotICAgICAgICAgICAgaWYgKGludGVybmFsQ2FsbGJhY2suZW52ZWxvcGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbENhbGxiYWNrLmVycm9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYWxsYmFjayBoYWQgbmVpdGhlciBlcnJvciBub3IgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNFeGNlcHRpb25Ub0JlVGhyb3duT25TT0FQRmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGludGVybmFsQ2FsbGJhY2suZXJyb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gc3luY2hyb25vdXMgc2VuZCgpIGdldHMgYmFjayBhIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0LCB0aGlzIGlzIHRoZSB3b3JraG9yc2UKLSAgICAgKiBtZXRob2Qgd2hpY2ggcHJvY2Vzc2VzIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgdGhlIGFjdGl2ZSByZXNwb25zZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdHsKLSAgICAgICAgLy8gT3B0aW9ucyBvYmplY3QgcmV1c2VkIGFib3ZlIHNvIHNvYXBBY3Rpb24gbmVlZHMgdG8gYmUgcmVtb3ZlZCBzbwotICAgICAgICAvLyB0aGF0IHNvYXBBY3Rpb24rd3NhOkFjdGlvbiBvbiByZXNwb25zZSBkb24ndCBjb25mbGljdAotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24obnVsbCk7Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiByZXF1ZXN0IGlzIFJFU1Qgd2UgYXNzdW1lIHRoZSByZXNwb25zZU1lc3NhZ2VDb250ZXh0IGlzIFJFU1QsIHNvCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHZhcmlhYmxlCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogb2xkIGNvZGUgaGVyZSB3YXMgdXNpbmcgdGhlIG91dGJvdW5kIG1lc3NhZ2UgY29udGV4dCB0byBzZXQgdGhlIGluYm91bmQgU09BUCBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgKiBhcyBzdWNoIGFuZCBwYXNzaW5nIGl0IHRvIFRyYW5zcG9ydFV0aWxzLmNyZWF0ZVNPQVBNZXNzYWdlCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogbXNnY3R4LmdldEVudmVsb3BlKCkuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBIb3dldmVyLCB0aGUgU09BUDEuMiBzcGVjLCBhcHBlbmRpeCBBIGluZGljYXRlcyB0aGF0IGlmIGEgU09BUDEuMiBtZXNzYWdlIGlzIHNlbnQgdG8gYSBTT0FQMS4xCi0gICAgICAgICAgICAgKiBlbmRwb2ludCwgd2Ugd2lsbCBnZXQgYSBTT0FQMS4xIChmYXVsdCkgbWVzc2FnZSByZXNwb25zZS4gIFdlIG5lZWQgYW5vdGhlciB3YXkgdG8gc2V0Ci0gICAgICAgICAgICAgKiB0aGUgaW5ib3VuZCBTT0FQIHZlcnNpb24uICBCZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIHRydXN0IHRoZSBjb250ZW50IHR5cGUgYW5kIGxldAotICAgICAgICAgICAgICogY3JlYXRlU09BUE1lc3NhZ2UgdGFrZSBjYXJlIG9mIGZpZ3VyaW5nIG91dCB3aGF0IHRoZSBTT0FQIG5hbWVzcGFjZSBpcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHJlc2VudmVsb3BlID0gVHJhbnNwb3J0VXRpbHMuY3JlYXRlU09BUE1lc3NhZ2UocmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAocmVzZW52ZWxvcGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUocmVzZW52ZWxvcGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiYmxvY2tpbmdJbnZvY2F0aW9uRXhwZWN0c1Jlc3BvbnNlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFNPQVBFbnZlbG9wZSByZXNlbnZlbG9wZSA9IHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaWYgKHJlc2VudmVsb3BlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2VDb250ZXh0LmdldFJlcGx5VG8oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2Muc2V0VGFyZ2V0RVBSKHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuZ2V0UmVwbHlUbygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNlbnZlbG9wZS5oYXNGYXVsdCgpfHxyZXNwb25zZU1lc3NhZ2VDb250ZXh0LmlzUHJvY2Vzc2luZ0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pc0V4Y2VwdGlvblRvQmVUaHJvd25PblNPQVBGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgdGhlIFNPQVBGYXVsdCBoYXMgYSBkZXRhaWwgZWxlbWVudCBmb3IgRXhjcGV0aW9uCi0gICAgICAgICAgICAgICAgICAgIHRocm93IFV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTeW5jaHJvbm91c2x5IHNlbmQgdGhlIHJlcXVlc3QgYW5kIHJlY2VpdmUgYSByZXNwb25zZS4gIFRoaXMgcmVsaWVzIG9uIHRoZSB0cmFuc3BvcnQKLSAgICAgKiBjb3JyZWN0bHkgY29ubmVjdGluZyB0aGUgcmVzcG9uc2UgSW5wdXRTdHJlYW0hCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dCB0byBzZW5kLgotICAgICAqIEByZXR1cm4gUmV0dXJucyBNZXNzYWdlQ29udGV4dC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBTZW5kcyB0aGUgbWVzc2FnZSB1c2luZyBhIHR3byB3YXkgdHJhbnNwb3J0IGFuZCB3YWl0cyBmb3IgYSByZXNwb25zZQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBzZW5kKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgcmVzcG9uc2VNZXNzYWdlQ29udGV4dAotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgPQotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0U2VydmVyU2lkZShmYWxzZSk7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0T3BlcmF0aW9uQ29udGV4dChtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0T3B0aW9ucyhuZXcgT3B0aW9ucyhvcHRpb25zKSk7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0TWVzc2FnZUlEKG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICBhZGRNZXNzYWdlQ29udGV4dChyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXRTZXJ2aWNlQ29udGV4dChtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCkpOwotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldEF4aXNNZXNzYWdlKAotICAgICAgICAgICAgICAgIGF4aXNPcC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSkpOwotCi0gICAgICAgIC8vc2VuZGluZyB0aGUgbWVzc2FnZQotICAgICAgICBBeGlzRW5naW5lLnNlbmQobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXREb2luZ1JFU1QobXNnQ29udGV4dC5pc0RvaW5nUkVTVCgpKTsKLQotICAgICAgICAvLyBDb3B5IFJFU1BPTlNFIHByb3BlcnRpZXMgd2hpY2ggdGhlIHRyYW5zcG9ydCBzZXQgb250byB0aGUgcmVxdWVzdCBtZXNzYWdlIGNvbnRleHQgd2hlbiBpdCBwcm9jZXNzZWQKLSAgICAgICAgLy8gdGhlIGluY29taW5nIHJlc3BvbnNlIHJlY2lldmVkIGluIHJlcGx5IHRvIGFuIG91dGdvaW5nIHJlcXVlc3QuCi0gICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpKTsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU1RBVFVTX0NPREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU1RBVFVTX0NPREUpKTsKLQotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9JTiwgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSU4pKTsKLSAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dC5zZXRUcmFuc3BvcnRJbihtc2dDb250ZXh0LmdldFRyYW5zcG9ydEluKCkpOwotICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldFRyYW5zcG9ydE91dChtc2dDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpKTsKLSAgICAgICAgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIHJldHVybiByZXNwb25zZU1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIHdvcmtob3JzZSBmb3IgYSBub24tYmxvY2tpbmcgaW52b2NhdGlvbiB0aGF0IHVzZXMgYSB0d28KLSAgICAgKiB3YXkgdHJhbnNwb3J0LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgTm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIENhbGxiYWNrIGNhbGxiYWNrOwotCi0gICAgICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnY3R4OwotICAgICAgICBwcml2YXRlIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIE5vbkJsb2NraW5nSW52b2NhdGlvbldvcmtlcihDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2djdHggLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIHRoaXMubXNnY3R4ID0gbXNnY3R4OwotICAgICAgICAgICAgdGhpcy5heGlzQ2FsbGJhY2sgPWF4aXNDYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgcmVxdWVzdCBhbmQgd2FpdCBmb3IgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IHNlbmQobXNnY3R4KTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBjYWxsYmFjawotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSByZXNlbnZlbG9wZSA9IHJlc3BvbnNlLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAocmVzZW52ZWxvcGUuaGFzRmF1bHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IHJlc2VudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZmF1bHQgd2FzIGZvdW5kLCBjcmVhdGUgYW4gQXhpc0ZhdWx0IHdpdGggYSBNZXNzYWdlQ29udGV4dCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBwcm9ncmFtbWluZyBtb2RlbHMgY2FuIGRlc2VyaWFsaXplIHRoZSBmYXVsdCB0byBhbiBhbHRlcm5hdGl2ZSBmb3JtLgotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0ZhdWx0IGZhdWx0ID0gbmV3IEF4aXNGYXVsdChib2R5LmdldEZhdWx0KCksIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihmYXVsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF4aXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NhbGxiYWNrLm9uRXJyb3IoZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0ID0gbmV3IEFzeW5jUmVzdWx0KHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkNvbXBsZXRlKGFzeW5jUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXhpc0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQ2FsbGJhY2sub25NZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzQ2FsbGJhY2sub25FcnJvcihlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0Q29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfWVsc2UgaWYgKGF4aXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNDYWxsYmFjay5vbkNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBhY3RzIGFzIGEgY2FsbGJhY2sgdGhhdCBhbGxvd3MgdXNlcnMgdG8gd2FpdCBvbiB0aGUgcmVzdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU3luY0NhbGxCYWNrIGltcGxlbWVudHMgQXhpc0NhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBjb21wbGV0ZTsKLSAgICAgICAgYm9vbGVhbiByZWNlaXZlZEZhdWx0OwotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JDb21wbGV0aW9uKGxvbmcgdGltZW91dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGUpIHJldHVybiAhcmVjZWl2ZWRGYXVsdDsKLSAgICAgICAgICAgICAgICAgICAgd2FpdCh0aW1lb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdGltZWQgb3V0IQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCggTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVzcG9uc2VUaW1lT3V0IikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgaW50ZXJydXB0ZWQgb3VyIHdhaXQhCi0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGVycm9yKTsKLQotICAgICAgICAgICAgcmV0dXJuICFyZWNlaXZlZEZhdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG1lc3NhZ2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSAocmVzcG9uc2UpIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICAgLy8gVHJhbnNwb3J0IGlucHV0IHN0cmVhbSBnZXRzIGNsb3NlZCBhZnRlciBjYWxsaW5nIHNldENvbXBsZXRlCi0gICAgICAgICAgICAvLyBtZXRob2QuIEhhdmUgdG8gYnVpbGQgdGhlIHdob2xlIGVudmVsb3BlIGluY2x1ZGluZyB0aGUKLSAgICAgICAgICAgIC8vIGF0dGFjaG1lbnRzIGF0IHRoaXMgc3RhZ2UuIERhdGEgbWlnaHQgZ2V0IGxvc3QgaWYgdGhlIGlucHV0Ci0gICAgICAgICAgICAvLyBzdHJlYW0gZ2V0cyBjbG9zZWQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB3aG9sZSBlbnZlbG9wZS4KLQotICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IG5lZWQgdG8gZG8gdGhpcyAtIG5lZWQgdG8gaG9vayB1cCBzdHJlYW0gY2xvc3VyZSB0byBBeGlvbSBjb21wbGV0aW9uCi0gICAgICAgICAgICB0aGlzLmVudmVsb3BlID0gbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgdGhpcy5lbnZlbG9wZS5idWlsZFdpdGhBdHRhY2htZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiBhIGZhdWx0IG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBNZXNzYWdlQ29udGV4dCBjb250YWluaW5nIHRoZSBmYXVsdC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAgICBlcnJvciA9IFV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBNRVAgbm8gbWF0dGVyIHdoYXQgaGFwcGVucywgcXVpdGUgbGlrZSBhCi0gICAgICAgICAqIGZpbmFsbHkgYmxvY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25Db21wbGV0ZSgpIHsKLSAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZW52ZWxvcGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBFeGNlcHRpb24gZXJyb3I7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRyeTogT3V0SW5BeGlzT3BlcmF0aW9uQ2xpZW50JFN5bmNDYWxsQmFjazo6b25FcnJvciwgIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyb3IgPSBlOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQkU3luY0NhbGxCYWNrOjpvbkVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9PdXRPbmx5QXhpc09wZXJhdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL091dE9ubHlBeGlzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTgzMjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL091dE9ubHlBeGlzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wZXJhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgT3V0T25seUF4aXNPcGVyYXRpb24gZXh0ZW5kcyBBeGlzT3BlcmF0aW9uIHsKLQotICAgIHByaXZhdGUgQXhpc01lc3NhZ2UgaW5GYXVsdE1lc3NhZ2U7Ci0KLSAgICAvLyBqdXN0IHRvIGtlZXAgdGhlIGluZmxvdyAsIHRoZXJlIHdvbid0IGJlIGFueSB1c2FnZQotICAgIHByaXZhdGUgQXJyYXlMaXN0IGluUGhhc2VzOwotCi0gICAgcHJpdmF0ZSBBeGlzTWVzc2FnZSBvdXRGYXVsdE1lc3NhZ2U7Ci0KLSAgICBwcml2YXRlIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgT3V0T25seUF4aXNPcGVyYXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vc2V0dXAgYSB0ZW1wb3JhcnkgbmFtZQotICAgICAgICBRTmFtZSB0bXBOYW1lID0gbmV3IFFOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXyIgKyBVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0gICAgICAgIHRoaXMuc2V0TmFtZSh0bXBOYW1lKTsKLSAgICAgICAgY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBzZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRPbmx5QXhpc09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBjcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShBeGlzTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICAgICAgb3V0TWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoIW9wQ29udGV4dC5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIG9wQ29udGV4dC5nZXRNZXNzYWdlQ29udGV4dHMoKS5wdXQoTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgb3BDb250ZXh0LnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBjb21wbGV0ZWQiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYXVsdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhhc2hNYXAgbWVwID0gb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0cygpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDdHh0ID0gKE1lc3NhZ2VDb250ZXh0KSBtZXAuZ2V0KE1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUpOwotCi0gICAgICAgIGlmIChmYXVsdE1lc3NhZ2VDdHh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWVwY29tcGxldGVkIikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVwLnB1dChNRVNTQUdFX0xBQkVMX0ZBVUxUX1ZBTFVFLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5zZXRDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIG9wQ29udGV4dC5jbGVhbnVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlTWVzc2FnZSgpIHsKLSAgICAgICAgb3V0TWVzc2FnZSA9IG5ldyBBeGlzTWVzc2FnZSgpOwotICAgICAgICBvdXRNZXNzYWdlLnNldERpcmVjdGlvbihXU0RMQ29uc3RhbnRzLldTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUKTsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGluRmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIGluRmF1bHRNZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIG91dEZhdWx0TWVzc2FnZS5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGluUGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBsYWJlbCkgewotICAgICAgICBpZiAoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3V0TWVzc2FnZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGluRmF1bHRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdE1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBoYXNlc091dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBpblBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICBpbkZhdWx0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlc091dEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgaW5QaGFzZXMgPSBsaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBNRVAgY2xpZW50IGZvciBhbiBPdXQtb25seSBvcGVyYXRpb24uIFRoaXMgY2xpZW50IGNhbiBiZSB1c2VkIHRvCi0gICAgICogaW50ZXJhY3Qgd2l0aCBhIHNlcnZlciB3aGljaCBpcyBvZmZlcmluZyBhbiBJbi1vbmx5IG9wZXJhdGlvbi4gVG8gdXNlIHRoZQotICAgICAqIGNsaWVudCwgeW91IG11c3QgY2FsbCBhZGRNZXNzYWdlQ29udGV4dCgpIHdpdGggYSBtZXNzYWdlIGNvbnRleHQgYW5kIHRoZW4KLSAgICAgKiBjYWxsIGV4ZWN1dGUoKSB0byBleGVjdXRlIHRoZSBjbGllbnQuIE5vdGUgdGhhdCB0aGUgZXhlY3V0ZSBtZXRob2QncwotICAgICAqIGJsb2NrIHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IHRoaXMgY2xpZW50IGFuZCBhbHNvIHRoZSBzZXRNZXNzYWdlUmVjZWl2ZXIKLSAgICAgKiBtZXRob2QgY2Fubm90IGJlIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2MgICAgICBUaGUgc2VydmljZSBjb250ZXh0IGZvciB0aGlzIGNsaWVudCB0byBsaXZlIHdpdGhpbi4gQ2Fubm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHVzZSBhcyBkZWZhdWx0cyBmb3IgdGhpcyBjbGllbnQuIElmIGFueSBvcHRpb25zIGFyZQotICAgICAqICAgICAgICAgICAgICAgIHNldCBzcGVjaWZpY2FsbHkgb24gdGhlIGNsaWVudCB0aGVuIHRob3NlIG92ZXJyaWRlIG9wdGlvbnMKLSAgICAgKiAgICAgICAgICAgICAgICBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25DbGllbnQgY3JlYXRlQ2xpZW50KFNlcnZpY2VDb250ZXh0IHNjLCBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbkNsaWVudCh0aGlzLCBzYywgb3B0aW9ucyk7Ci0gICAgfQotfQotCi0vKioKLSAqIE1FUCBjbGllbnQgZm9yIG1vaS4KLSAqLwotY2xhc3MgT3V0T25seUF4aXNPcGVyYXRpb25DbGllbnQgZXh0ZW5kcyBPcGVyYXRpb25DbGllbnQgewotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYzsKLQotICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uQ2xpZW50KE91dE9ubHlBeGlzT3BlcmF0aW9uIGF4aXNPcCwgU2VydmljZUNvbnRleHQgc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgICAgIHN1cGVyKGF4aXNPcCwgc2MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBtZXNzYWdlIGNvbnRleHQgdG8gdGhlIGNsaWVudCBmb3IgcHJvY2Vzc2luZy4gVGhpcyBtZXRob2QgbXVzdCBub3QKLSAgICAgKiBwcm9jZXNzIHRoZSBtZXNzYWdlIC0gaXQgb25seSByZWNvcmRzIGl0IGluIHRoZSBNRVAgY2xpZW50LiBQcm9jZXNzaW5nCi0gICAgICogb25seSBvY2N1cnMgd2hlbiBleGVjdXRlKCkgaXMgY2FsbGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1jIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGlzIGlzIGNhbGxlZCBpbmFwcHJvcHJpYXRlbHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAodGhpcy5tYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdGFkZG1zZ2N0eCIpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm1jID0gbWM7Ci0gICAgICAgIGlmIChtYy5nZXRNZXNzYWdlSUQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRNZXNzYWdlSUQobWMpOwotICAgICAgICB9Ci0gICAgICAgIG1jLnNldFNlcnZpY2VDb250ZXh0KHNjKTsKLSAgICAgICAgYXhpc09wLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtYywgb2MpOwotICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtZXNzYWdlIGZyb20gdGhlIGNsaWVudCAtIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHJlcXVlc3RlZAotICAgICAqIG1lc3NhZ2UgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlTGFiZWwgdGhlIG1lc3NhZ2UgbGFiZWwgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNpcmVkIG1lc3NhZ2UgY29udGV4dCBvciBudWxsIGlmIGl0cyBub3QgYXZhaWxhYmxlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBtZXNzYWdlIGxhYmVsIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRleHQgZ2V0TWVzc2FnZUNvbnRleHQoU3RyaW5nIG1lc3NhZ2VMYWJlbCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobWVzc2FnZUxhYmVsLmVxdWFscyhXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSkgewotICAgICAgICAgICAgcmV0dXJuIG1jOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgidW5rbm93bk1zZ0xhYmVsIiwgbWVzc2FnZUxhYmVsKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVzc2FnZSByZWNlaXZlciB0byBiZSBleGVjdXRlZCB3aGVuIGEgbWVzc2FnZSBjb21lcyBpbnRvIHRoZSBNRVAKLSAgICAgKiBhbmQgdGhlIE1FUCBpcyBleGVjdXRlZC4gVGhpcyBpcyB0aGUgd2F5IHRoZSBNRVAgY2xpZW50IHByb3ZpZGVzCi0gICAgICogbm90aWZpY2F0aW9uIHRoYXQgYSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IGl0LiBFeGFjdGx5IHdoZW4gaXRzCi0gICAgICogZXhlY3V0ZWQgYW5kIHVuZGVyIHdoYXQgY29uZGl0aW9ucyBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBzcGVjaWZpYyBNRVAKLSAgICAgKiBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIE1FUCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBNRVAuIFdoYXQgdGhpcyBkb2VzIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIE1FUCBjbGllbnQuIFRoZQotICAgICAqIGJhc2ljIGlkZWEgaXMgdG8gaGF2ZSB0aGUgTUVQIGNsaWVudCBleGVjdXRlIGFuZCBkbyBzb21ldGhpbmcgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBpdCBzbyBmYXIuIEZvciBleGFtcGxlLCBpZiBpdHMgYW4gT3V0LUluCi0gICAgICogTUVQLCB0aGVuIGlmIHRoZSBPdXQgbWVzc2FnZSBoYXMgYmVlbiBzZXQsIHRoZW4gZXhlY3V0aW5nIHRoZSBjbGllbnQgYXNrcwotICAgICAqIGl0IHRvIHNlbmQgdGhlIG1lc3NhZ2UgYW5kIGdldCB0aGUgSW4gbWVzc2FnZSwgcG9zc2libHkgdXNpbmcgYSBkaWZmZXJlbnQKLSAgICAgKiB0aHJlYWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmxvY2sgSW5kaWNhdGVzIHdoZXRoZXIgZXhlY3V0aW9uIHNob3VsZCBibG9jayBvciByZXR1cm4gQVNBUC4gV2hhdAotICAgICAqICAgICAgICAgICAgICBibG9jayBtZWFucyBpcyBvZiBjb3Vyc2UgYSBmdW5jdGlvbiBvZiB0aGUgc3BlY2lmaWMgTUVQCi0gICAgICogICAgICAgICAgICAgIGNsaWVudC4gSUdOT1JFRCBCWSBUSElTIE1FUCBDTElFTlQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIE1FUC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlSW1wbChib29sZWFuIGJsb2NrKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGNvbXBsZXRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBpc2NvbXBsdGVkIikpOwotICAgICAgICB9Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gc2MuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgcHJlcGFyZU1lc3NhZ2VDb250ZXh0KGNjLCBtYyk7Ci0KLSAgICAgICAgLy9BcyB0aGlzIGlzIGFuIG91dC1vbmx5IE1FUCB3ZSBleHBsaWNpdGx5IGFkZCBhIG1vcmUgc2Vuc2libGUgZGVmYXVsdCBmb3IKLSAgICAgICAgLy90aGUgcmVwbHlUbywgaWYgcmVxdWlyZWQuIFdlIGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCBpZiB0aGUgcmVwbHlUbyBFUFIKLSAgICAgICAgLy9oYXMgYW4gYW5vbnltb3VzIGFkZHJlc3MgYW5kIHJlZmVyZW5jZSBwYXJhbWV0ZXJzIHRoYXQgaXQgZ2V0cyBmbG93ZWQKLSAgICAgICAgLy9hY3Jvc3MgdGhlIHdpcmUuCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG1jLmdldFJlcGx5VG8oKTsKLSAgICAgICAgaWYgKGVwciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShGaW5hbC5XU0FfTk9ORV9VUkkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlcHIuaXNXU0FkZHJlc3NpbmdBbm9ueW1vdXMoKSAmJiBlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1jLnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuSU5DTFVERV9PUFRJT05BTF9IRUFERVJTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBjcmVhdGUgdGhlIG9wZXJhdGlvbiBjb250ZXh0IGZvciBteXNlbGYKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYyA9IHNjLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQoYXhpc09wKTsKLSAgICAgICAgb2MuYWRkTWVzc2FnZUNvbnRleHQobWMpOwotICAgICAgICAKLSAgICAgICAgLy8gaGVyZSB3ZSBzaG91bGQgbm90IHNldCBpdCBhcyBOT04gYmxva2luZy4gaWYgbmVlZGVkIHRoZW4gdXNlciBjYW4gZG8KLSAgICAgICAgLy8gaXQuIGlmIGFsbCB0aGUgc2VuZGVycyBpbnZva2UgaW4gYSBkaWZmZXJlbnQgdGhyZWFkcyB0aGVuIGl0IGNhdXNlcwotICAgICAgICAvLyBhIHBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiB1c2luZyBhIE11bHRpVGhyZWFkZWRIdHRwQ29ubmVjdGlvbk1hbmFnZXIKLSAgICAgICAgCi0gICAgICAgIEF4aXNFbmdpbmUuc2VuZChtYyk7Ci0gICAgICAgIC8vIGFsbCBkb25lCi0gICAgICAgIGNvbXBsZXRlZCA9IHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGI1ZDIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotCi0KLS8qKgotICogQ2xhc3MgUGFyYW1ldGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSwgU2FmZVNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKgotICAgICAqIHNldHVwIGZvciBsb2dnaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtZXRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiUGFyYW1ldGVyIjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjYwMTY2NDIwMDY3MzA2MzUzMUw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VyaWFsIFRyYWNrcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgYSBjbGFzcyB0byBpZGVudGlmeSBjaGFuZ2VzIHRvIHRoZQotICAgICAqIGNsYXNzIGRlZmluaXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB0byBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbi4KLSAgICAgKiBJZiBhIGNsYXNzIGRlZmluaXRpb24gY2hhbmdlcywgdGhlbiB0aGUgc2VyaWFsaXphdGlvbi9leHRlcm5hbGl6YXRpb24KLSAgICAgKiBvZiB0aGUgY2xhc3MgaXMgYWZmZWN0ZWQuCi0gICAgICogUmVmZXIgdG8gdGhlIHdyaXRlRXh0ZXJuYWwoKSBhbmQgcmVhZEV4dGVybmFsKCkgbWV0aG9kcy4KLSAgICAgKi8KLSAgICAvLyBzdXBwb3J0ZWQgcmV2aXNpb24gbGV2ZWxzLCBhZGQgYSBuZXcgbGV2ZWwgdG8gbWFuYWdlIGNvbXBhdGlibGUgY2hhbmdlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVZJU0lPTl8yID0gMjsKLSAgICAvLyBjdXJyZW50IHJldmlzaW9uIGxldmVsIG9mIHRoaXMgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHJldmlzaW9uSUQgPSBSRVZJU0lPTl8yOwotCi0KLSAgICAvKioKLSAgICAgKiBGaWVsZCAgQU5ZX1BBUkFNRVRFUgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFOWV9QQVJBTUVURVIgPSAwOwotICAgIC8qKgotICAgICAqIEZpZWxkIFRFWFRfUEFSQU1FVEVSCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVYVF9QQVJBTUVURVIgPSAxOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgT01fUEFSQU1FVEVSCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgT01fUEFSQU1FVEVSID0gMjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIGludCB0eXBlID0gVEVYVF9QQVJBTUVURVI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBsb2NrZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiB0byBzdG9yZSB0aGUgcGFyYW1ldGVyIGVsZW1lbnQKLSAgICAgKiA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzczEiPgotICAgICAqIG9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogRmllbGQgdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gX3RyYW5zaWVudDsgIC8vIEluZGljYXRlcyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgdHJhbnNpZW50IChub3QgcGVyc2lzdGVkKQotCi0gICAgLy9UbyBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgZWRpdGFibGUgb3Igbm90ICwKLSAgICAvLyBpZiB0aGUgdmFsdWUgaXMgZmFsc2UgdGhlbiBubyBvbmUgY2FuIGNhbGwgc2V0dmFsdWUKLSAgICAvLyBUT0RPCi0gICAgLy8gQ3VycmVudGx5IHRoZSBlZGl0YWJsZSBmaWVsZCBpcyBub3QgcGVyc2lzdGVkLiBUaGlzIHNlZW1zIGxpa2UgYSBwcm9ibGVtLgotICAgIHByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZyb20gbmFtZSBhbmQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHBhcnNlVmFsdWVGb3JUeXBlKHRoaXMudmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXROYW1lLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0UGFyYW1ldGVyRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0UGFyYW1ldGVyVHlwZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBpbnQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQYXJhbWV0ZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0VmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgT2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNMb2NrZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2tlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0TG9ja2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgbG9ja2VkID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldE5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbGVtZW50KE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVHlwZShpbnQgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBzZXRWYWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZighZWRpdGFibGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyYW1ldGVyICIgICsgZ2V0TmFtZSgpICsgIiAgY2FuIG5vdCBiZSBlZGl0Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VWYWx1ZUZvclR5cGUodmFsdWUpOwotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gcGFycyB0aGUgaW5qZWN0ZWQgdmFsdWUgZm9yIGl0cyB0eXBlLgotICAgICAqIFR5cGUgd2lsbCBiZSBzZXQgdXNpbmcgc2V0UGFyYW1ldGVyVHlwZS4KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VWYWx1ZUZvclR5cGUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgc2V0UGFyYW1ldGVyVHlwZShURVhUX1BBUkFNRVRFUik7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlclR5cGUoT01fUEFSQU1FVEVSKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFBhcmFtZXRlclR5cGUoQU5ZX1BBUkFNRVRFUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlBhcmFtZXRlciA6ICIgKyBuYW1lICsgIj0iICsgdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXIpIG9iaikubmFtZS5lcXVhbHMobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0Ci0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqIEFsc28sIG9iamVjdHMgdGhhdCByZXByZXNlbnQgInN0YXRpYyIgZGF0YSBhcmUKLSAgICAgKiBub3Qgc2F2ZWQsIGV4Y2VwdCBmb3IgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICogYWJsZSB0byBmaW5kIG1hdGNoaW5nIG9iamVjdHMgd2hlbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERvbid0IHdyaXRlIG91dCB0cmFuc2llbnQgcGFyYW1ldGVycwotICAgICAgICBpZiAodGhpcy5pc1RyYW5zaWVudCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47ICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIC8vIGNvbnRleHQgZGVmaW5pdGlvbiwgYmUgc3VyZSB0byBtYWludGFpbiB0aGUKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgb3V0LndyaXRlSW50KHR5cGUpOwotICAgICAgICBvdXQud3JpdGVCb29sZWFuKGxvY2tlZCk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChuYW1lKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvYmplY3QgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgc2VyaWFsaXppbmcgdGhlIE9NRWxlbWVudCBtb3JlIGVmZmljaWVudGx5Ci0gICAgICAgIC8vIFRoaXMgY3VycmVudGx5IHdpbGwgYmFzaWNhbGx5IHNlcmlhbGl6ZSB0aGUgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICAgIC8vIHRvIGEgU3RyaW5nIGJ1dCB3aWxsIGJ1aWxkIHRoZSBPTVRyZWUgaW4gdGhlIG1lbW9yeQotCi0gICAgICAgIFN0cmluZyB0bXAgPSBudWxsOwotCi0gICAgICAgIGlmIChwYXJhbWV0ZXJFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRtcCA9IHBhcmFtZXRlckVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVPYmplY3QodG1wKTsgLy8gcGFyYW1ldGVyRWxlbWVudAotICAgICAgICBvdXQud3JpdGVPYmplY3QodmFsdWUpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IHNhdmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOT1RFOiBUaGUgZmllbGQgZGF0YSBtdXN0IHJlYWQgYmFjayBpbiB0aGUgc2FtZSBvcmRlciBhbmQgdHlwZQotICAgICAqIGFzIGl0IHdhcyB3cml0dGVuLiAgU29tZSBkYXRhIHdpbGwgbmVlZCB0byBiZSB2YWxpZGF0ZWQgd2hlbgotICAgICAqIHJlc3VycmVjdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGluIFRoZSBzdHJlYW0gdG8gcmVhZCB0aGUgb2JqZWN0IGNvbnRlbnRzIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluT2JqZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpbk9iamVjdCk7Ci0gICAgICAgIC8vIHRyYWNlIHBvaW50Ci0gICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIjpyZWFkRXh0ZXJuYWwoKTogIEJFR0lOICBieXRlcyBhdmFpbGFibGUgaW4gc3RyZWFtIFsiICsKLSAgICAgICAgICAgICAgICAgICAgaW4uYXZhaWxhYmxlKCkgKyAiXSAgIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXJpYWxpemF0aW9uIHZlcnNpb24gSUQKLSAgICAgICAgbG9uZyBzdWlkID0gaW4ucmVhZExvbmcoKTsKLQotICAgICAgICAvLyByZXZpc2lvbiBJRAotICAgICAgICBpbnQgcmV2SUQgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHZlcnNpb24gd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAoc3VpZCAhPSBzZXJpYWxWZXJzaW9uVUlEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9TVUlEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSByZXZpc2lvbiBsZXZlbCB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChyZXZJRCAhPSBSRVZJU0lPTl8yKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihFeHRlcm5hbGl6ZUNvbnN0YW50cy5VTlNVUFBPUlRFRF9SRVZJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBzaW1wbGUgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgdHlwZSA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgbG9ja2VkID0gaW4ucmVhZEJvb2xlYW4oKTsKLSAgICAgICAgbmFtZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBvYmplY3QgZmllbGRzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgc2VyaWFsaXppbmcgdGhlIE9NRWxlbWVudCBtb3JlIGVmZmljaWVudGx5Ci0gICAgICAgIC8vIFRoaXMgY3VycmVudGx5IHdpbGwgYmFzaWNhbGx5IHNlcmlhbGl6ZSB0aGUgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICAgIC8vIHRvIGEgU3RyaW5nIGJ1dCB3aWxsIGJ1aWxkIHRoZSBPTVRyZWUgaW4gdGhlIG1lbW9yeQotCi0gICAgICAgIC8vIHRyZWF0IGFzIGFuIG9iamVjdCwgZG9uJ3QgZG8gVVRGCi0gICAgICAgIFN0cmluZyB0bXAgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0KLSAgICAgICAgLy8gY29udmVydCB0byBhbiBPTUVsZW1lbnQKLSAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odG1wLmdldEJ5dGVzKCkpOwotCi0gICAgICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHBhcnNlciA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihiYWlzKTsKLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoZSBTdEFYT01CdWlsZGVyIGlzIGFuIGltcGwgY2xhc3MgLSBpcyB0aGVyZSBhIGJldHRlciBtZWNoYW5pc20gcmF0aGVyIHRoYW4gYW4gaW1wbCBjbGFzcyA/Ci0gICAgICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksIHBhcnNlcik7Ci0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZG9jRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZG9jRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckVsZW1lbnQgPSBkb2NFbGVtZW50OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIGlmIGNhbid0IGNyZWF0ZSBhbiBPTUVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyBpZiBjYW4ndCBjcmVhdGUgYW4gT01FbGVtZW50Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIGlmIHRoaXMgY2FuJ3QgYmUgc2VyaWFsaXplZAotICAgICAgICB2YWx1ZSA9IGluLnJlYWRPYmplY3QoKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyBkb25lCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLSAgICAgICAgdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotICAgICAgICByZXR1cm4gX3RyYW5zaWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiBfdHJhbnNpZW50KSB7Ci0gICAgICAgIHRoaXMuX3RyYW5zaWVudCA9IF90cmFuc2llbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2M3YWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEludGVyZmFjZSBQYXJhbWV0ZXJJbmNsdWRlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVySW5jbHVkZSB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkUGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0UGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUGFyYW1ldGVyLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIHRoZSBwYXJhbWV0ZXJzIGluIGEgZ2l2ZW4gZGVzY3JpcHRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXJyYXlMaXN0LgotICAgICAqLwotICAgIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJJbmNsdWRlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTc1ZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckluY2x1ZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5FeHRlcm5hbGl6ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuZXh0ZXJuYWxpemUuU2FmZU9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkV4dGVybmFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBDbGFzcyBQYXJhbWV0ZXJJbmNsdWRlSW1wbAotICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVySW5jbHVkZUltcGwgCi0gICAgaW1wbGVtZW50cyBQYXJhbWV0ZXJJbmNsdWRlLCBFeHRlcm5hbGl6YWJsZSwgU2FmZVNlcmlhbGl6YWJsZSB7Ci0KLSAgICAvKgotICAgICAqIHNldHVwIGZvciBsb2dnaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtZXRlckluY2x1ZGVJbXBsLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHX0VOQUJMRUQgPSBsb2cuaXNUcmFjZUVuYWJsZWQoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHX1BST1BFUlRZX1NFVCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIlBhcmFtZXRlckluY2x1ZGVJbXBsIjsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVGhlIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCB0cmFja3MgdGhlIHZlcnNpb24gb2YgdGhlIGNsYXNzLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4gSWYgYSBjaGFuZ2UgdG8gdGhlIGNsYXNzIGlzIG1hZGUgd2hpY2ggaXMKLSAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbiBvZiB0aGUgY2xhc3MsCi0gICAgICogdGhlbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIHNob3VsZCBiZSB1cGRhdGVkLgotICAgICAqIFJlZmVyIHRvIHRoZSAic2VyaWFsVmVyIiB1dGlsaXR5IHRvIGNvbXB1dGUgYSBzZXJpYWxpemF0aW9uCi0gICAgICogdmVyc2lvbiBJRC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTUzNzM2NzE5MDkwMTI2ODkxTDsKLQotICAgIC8qKgotICAgICAqIEBzZXJpYWwgVHJhY2tzIHRoZSByZXZpc2lvbiBsZXZlbCBvZiBhIGNsYXNzIHRvIGlkZW50aWZ5IGNoYW5nZXMgdG8gdGhlCi0gICAgICogY2xhc3MgZGVmaW5pdGlvbiB0aGF0IGFyZSBjb21wYXRpYmxlIHRvIHNlcmlhbGl6YXRpb24vZXh0ZXJuYWxpemF0aW9uLgotICAgICAqIElmIGEgY2xhc3MgZGVmaW5pdGlvbiBjaGFuZ2VzLCB0aGVuIHRoZSBzZXJpYWxpemF0aW9uL2V4dGVybmFsaXphdGlvbgotICAgICAqIG9mIHRoZSBjbGFzcyBpcyBhZmZlY3RlZC4KLSAgICAgKiBSZWZlciB0byB0aGUgd3JpdGVFeHRlcm5hbCgpIGFuZCByZWFkRXh0ZXJuYWwoKSBtZXRob2RzLgotICAgICAqLwotICAgIC8vIHN1cHBvcnRlZCByZXZpc2lvbiBsZXZlbHMsIGFkZCBhIG5ldyBsZXZlbCB0byBtYW5hZ2UgY29tcGF0aWJsZSBjaGFuZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOwotICAgIC8vIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBvYmplY3QKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmV2aXNpb25JRCA9IFJFVklTSU9OXzI7Ci0KLQotICAgIC8qKgotICAgICAqIEZpZWxkIHBhcm1ldGVycwotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFN0cmluZywgUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUGFyYW1ldGVySW5jbHVkZUltcGwuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlckluY2x1ZGVJbXBsKCkgewotICAgICAgICBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYXJhbWV0ZXI+KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFBhcmFtZXRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgewotICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQocGFyYW0uZ2V0TmFtZSgpLCBwYXJhbSk7Ci0gICAgICAgICAgICBpZiAoREVCVUdfRU5BQkxFRCkgewotICAgICAgICAgICAgICAgIHRoaXMuZGVidWdQYXJhbWV0ZXJBZGQocGFyYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHBhcmFtZXRlcnMucmVtb3ZlKHBhcmFtLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2luY2UgYXQgcnVudGltZSBpdCBwYXJhbWV0ZXJzIG1heSBiZSBtb2RpZmllZAotICAgICAqIHRvIGdldCB0aGUgb3JpZ2luYWwgc3RhdGUgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIDxjb2RlPk9NRWxlbWVudDwvY29kZT4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplUGFyYW1ldGVycyhPTUVsZW1lbnQgcGFyYW1ldGVycykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKERlcGxveW1lbnRDb25zdGFudHMuVEFHX1BBUkFNRVRFUikpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQotICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBjaGVjayB3aGV0aGVyIHNvbWUgb25lIGhhcyBsb2NrZWQgdGhlIHBhcm1ldGVyIGF0IHRoZSB0b3AgbGV2ZWwKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gKE9NRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXJFbGVtZW50Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0UGFyYW1ldGVyRWxlbWVudChwYXJhbWV0ZXJFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgTmFtZQotICAgICAgICAgICAgT01BdHRyaWJ1dGUgcGFyYU5hbWUgPQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoRGVwbG95bWVudENvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSkpOwotCi0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZShwYXJhTmFtZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyBwYXJhbWV0ZXIgVmFsdWUgKHRoZSBjaGlsZCBlbGVtZW50IG9mIHRoZSBwYXJhbWV0ZXIpCi0gICAgICAgICAgICBPTUVsZW1lbnQgcGFyYVZhbHVlID0gcGFyYW1ldGVyRWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgaWYgKHBhcmFWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFZhbHVlKHBhcmFtZXRlckVsZW1lbnQpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJUeXBlKFBhcmFtZXRlci5PTV9QQVJBTUVURVIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYXRleHRWYWx1ZSA9IHBhcmFtZXRlckVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldFZhbHVlKHBhcmF0ZXh0VmFsdWUpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXRQYXJhbWV0ZXJUeXBlKFBhcmFtZXRlci5URVhUX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHNldHRpbmcgbG9ja2luZyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIHBhcmFMb2NrZWQgPQotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJFbGVtZW50LmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoRGVwbG95bWVudENvbnN0YW50cy5BVFRSSUJVVEVfTE9DS0VEKSk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJhTG9ja2VkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9ja2VkVmFsdWUgPSBwYXJhTG9ja2VkLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhsb2NrZWRWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldExvY2tlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0TG9ja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIHBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFBhcmFtZXRlcikgcGFyYW1ldGVycy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyPiBjb2wgPSBwYXJhbWV0ZXJzLnZhbHVlcygpOwotICAgICAgICBBcnJheUxpc3Q8UGFyYW1ldGVyPiBwYXJhX2xpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcj4oKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yPFBhcmFtZXRlcj4gaXRlcmF0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgcGFyYV9saXN0LmFkZChwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBhcmFfbGlzdDsKLSAgICB9Ci0KLSAgICAvLyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBFeHRlcm5hbGl6YWJsZSBzdXBwb3J0IAotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqLwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVHJhbnNpZW50IGZpZWxkcyBhbmQgc3RhdGljIGZpZWxkcyBhcmUgbm90IHNhdmVkLgotICAgICAqIEFsc28sIG9iamVjdHMgdGhhdCByZXByZXNlbnQgInN0YXRpYyIgZGF0YSBhcmUKLSAgICAgKiBub3Qgc2F2ZWQsIGV4Y2VwdCBmb3IgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGJlCi0gICAgICogYWJsZSB0byBmaW5kIG1hdGNoaW5nIG9iamVjdHMgd2hlbiB0aGUgbWVzc2FnZQotICAgICAqIGNvbnRleHQgaXMgcmUtY29uc3RpdHV0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IFRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIG9iamVjdCBjb250ZW50cyB0bwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZUV4dGVybmFsKE9iamVjdE91dHB1dCBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IFNhZmVPYmplY3RPdXRwdXRTdHJlYW0uaW5zdGFsbChvKTsKLSAgICAgICAgLy8gd3JpdGUgb3V0IGNvbnRlbnRzIG9mIHRoaXMgb2JqZWN0Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXNzYWdlIAotICAgICAgICAvLyBjb250ZXh0IGRlZmluaXRpb24sIGJlIHN1cmUgdG8gbWFpbnRhaW4gdGhlIAotICAgICAgICAvLyBvYmplY3QgbGV2ZWwgaWRlbnRpZmllcnMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIG91dC53cml0ZUxvbmcoc2VyaWFsVmVyc2lvblVJRCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgb3V0LndyaXRlSW50KHJldmlzaW9uSUQpOwotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGNvbGxlY3Rpb24gb2YgcGFyYW1ldGVycwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICBvdXQud3JpdGVNYXAocGFyYW1ldGVycyk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4gIFNvbWUgZGF0YSB3aWxsIG5lZWQgdG8gYmUgdmFsaWRhdGVkIHdoZW4KLSAgICAgKiByZXN1cnJlY3RlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotICAgICAgICAvLyB0cmFjZSBwb2ludAotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShteUNsYXNzTmFtZSArICI6cmVhZEV4dGVybmFsKCk6ICBCRUdJTiAgYnl0ZXMgYXZhaWxhYmxlIGluIHN0cmVhbSBbIiArCi0gICAgICAgICAgICAgICAgICAgIGluLmF2YWlsYWJsZSgpICsgIl0gICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiB2ZXJzaW9uIElECi0gICAgICAgIGxvbmcgc3VpZCA9IGluLnJlYWRMb25nKCk7Ci0KLSAgICAgICAgLy8gcmV2aXNpb24gSUQKLSAgICAgICAgaW50IHJldklEID0gaW4ucmVhZEludCgpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGRhdGEgaXMgaW4gYSB2ZXJzaW9uIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHN1aWQgIT0gc2VyaWFsVmVyc2lvblVJRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfU1VJRCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgcmV2aXNpb24gbGV2ZWwgd2UgY2FuIGhhbmRsZQotICAgICAgICBpZiAocmV2SUQgIT0gUkVWSVNJT05fMikgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oRXh0ZXJuYWxpemVDb25zdGFudHMuVU5TVVBQT1JURURfUkVWSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gY29sbGVjdGlvbiBvZiBwYXJhbWV0ZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGluLnJlYWRNYXAocGFyYW1ldGVycyk7Ci0KLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gZG9uZQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlYnVnIGZvciBmb3IgcHJvcGVydHkga2V5IGFuZCB2YWx1ZS4KLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlYnVnUGFyYW1ldGVyQWRkKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKLSAgICAgICAgaWYgKERFQlVHX1BST1BFUlRZX1NFVCkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IHBhcmFtZXRlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAodmFsdWUgPT0gbnVsbCkgPyAibnVsbCIgOiB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc2xvYWRlciA9ICJudWxsIjsKLSAgICAgICAgICAgIGlmKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFV0aWxzLmdldE9iamVjdENsYXNzTG9hZGVyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZihjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyID0gY2wudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWVUZXh0ID0gKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAnQCcgKyAKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbG9nLmRlYnVnKCI9PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiIFBhcmFtZXRlciBhZGQgb24gb2JqZWN0ICIgKyBpZGVudGl0eSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgS2V5ID0iICsga2V5KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSA9IiArIHZhbHVlVGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgVmFsdWUgQ2xhc3MgPSAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBWYWx1ZSBDbGFzc2xvYWRlciA9ICIgKyBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICAiQ2FsbCBTdGFjayA9ICIgKyBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIj09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlck9ic2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNzdhMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyT2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotcHVibGljIGludGVyZmFjZSBQYXJhbWV0ZXJPYnNlcnZlciB7DQotICAgIHZvaWQgcGFyYW1ldGVyQ2hhbmdlZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BoYXNlUnVsZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BoYXNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTkyYTljLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9QaGFzZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIENsYXNzIFBoYXNlUnVsZQotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VSdWxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGFmdGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWZ0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBiZWZvcmUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBiZWZvcmU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUZpcnN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBoYXNlRmlyc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUxhc3QKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGhhc2VMYXN0OwotCi0gICAgLyoqCi0gICAgICogRmllbGQgcGhhc2VOYW1lCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGhhc2VOYW1lOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUGhhc2VSdWxlLgotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZVJ1bGUoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlUnVsZShTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIHRoaXMucGhhc2VOYW1lID0gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRBZnRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBZnRlcigpIHsKLSAgICAgICAgcmV0dXJuIGFmdGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRCZWZvcmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmVmb3JlKCkgewotICAgICAgICByZXR1cm4gYmVmb3JlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQaGFzZU5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgU3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhhc2VOYW1lKCkgewotICAgICAgICByZXR1cm4gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1BoYXNlRmlyc3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgYm9vbGVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BoYXNlRmlyc3QoKSB7Ci0gICAgICAgIHJldHVybiBwaGFzZUZpcnN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1BoYXNlTGFzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGhhc2VMYXN0KCkgewotICAgICAgICByZXR1cm4gcGhhc2VMYXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgImFmdGVyIiBuYW1lIGZvciB0aGlzIHJ1bGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgdGhlIG5hbWUgb2YgdGhlICJhZnRlciIgaGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFmdGVyKFN0cmluZyBhZnRlcikgewotICAgICAgICBpZiAoIiIuZXF1YWxzKGFmdGVyKSkgYWZ0ZXIgPSBudWxsOwotICAgICAgICB0aGlzLmFmdGVyID0gYWZ0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSAiYmVmb3JlIiBuYW1lIGZvciB0aGlzIHJ1bGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSAiYmVmb3JlIiBoYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QmVmb3JlKFN0cmluZyBiZWZvcmUpIHsKLSAgICAgICAgaWYgKCIiLmVxdWFscyhiZWZvcmUpKSBiZWZvcmUgPSBudWxsOwotICAgICAgICB0aGlzLmJlZm9yZSA9IGJlZm9yZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc2V0UGhhc2VGaXJzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZUZpcnN0IHRydWUgaWYgdGhpcyBydWxlIGRlZmluZXMgdGhlIGZpcnN0IEhhbmRsZXIgaW4gYSBQaGFzZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlRmlyc3QoYm9vbGVhbiBwaGFzZUZpcnN0KSB7Ci0gICAgICAgIHRoaXMucGhhc2VGaXJzdCA9IHBoYXNlRmlyc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldFBoYXNlTGFzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZUxhc3QgdHJ1ZSBpZiB0aGlzIHJ1bGUgZGVmaW5lcyB0aGUgbGFzdCBIYW5kbGVyIGluIGEgUGhhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZUxhc3QoYm9vbGVhbiBwaGFzZUxhc3QpIHsKLSAgICAgICAgdGhpcy5waGFzZUxhc3QgPSBwaGFzZUxhc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHNldFBoYXNlTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZU5hbWUgdGhlIG5hbWUgb2YgdGhlIFBoYXNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGhhc2VOYW1lKFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgdGhpcy5waGFzZU5hbWUgPSBwaGFzZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgInNhbmUiIHJ1bGVzIC0gY2Fubm90IGhhdmUgYm90aCBwaGFzZUZpcnN0L3BoYXNlTGFzdCBhbmQgYmVmb3JlL2FmdGVyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIHBoYXNlRmlyc3QvcGhhc2VMYXN0IGlzIHNldCBhbG9uZyB3aXRoIGJlZm9yZS9hZnRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJlZm9yZSAhPSBudWxsIHx8IGFmdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChwaGFzZUZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBoYXNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgUGhhc2VSdWxlIChwaGFzZUZpcnN0IGlzIHNldCBhbG9uZyB3aXRoIGJlZm9yZS9hZnRlcikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwaGFzZUxhc3QpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBQaGFzZVJ1bGUgKHBoYXNlTGFzdCBpcyBzZXQgYWxvbmcgd2l0aCBiZWZvcmUvYWZ0ZXIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUG9saWN5SW5jbHVkZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BvbGljeUluY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5OWYzNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUG9saWN5SW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5BeGlzUG9saWN5TG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Q29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeUltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUG9saWN5SW5jbHVkZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTk9OX1BPTElDWSA9IDEwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfUE9MSUNZID0gMTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfTU9EVUxFX1BPTElDWSA9IDI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19NT0RVTEVfT1BFUkFUSU9OX1BPTElDWSA9IDE3OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19TRVJWSUNFX1BPTElDWSA9IDM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBWElTX09QRVJBVElPTl9QT0xJQ1kgPSA0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVhJU19NRVNTQUdFX1BPTElDWSA9IDU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1BPTElDWSA9IDY7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1BPTElDWSA9IDc7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1RZUEVfUE9MSUNZID0gODsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkdfUE9MSUNZID0gOTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9QT0xJQ1kgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJTkRJTkdfT1BFUkFUSU9OX1BPTElDWSA9IDExOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfUE9MSUNZID0gMTI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVRfUE9MSUNZID0gMTM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HX0lOUFVUX1BPTElDWSA9IDE0OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORElOR19PVVRQVVRfUE9MSUNZID0gMTU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1BPTElDWSA9IDE2OwotCi0gICAgcHJpdmF0ZSBQb2xpY3kgcG9saWN5ID0gbnVsbDsKLQotICAgIHByaXZhdGUgUG9saWN5IGVmZmVjdGl2ZVBvbGljeSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFBvbGljeVJlZ2lzdHJ5IHJlZzsKLQotICAgIHByaXZhdGUgQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotCi0gICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBXcmFwcGVyPiB3cmFwcGVyRWxlbWVudHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgV3JhcHBlcj4oKTsKLQotICAgIHB1YmxpYyBQb2xpY3lJbmNsdWRlKCkgewotICAgICAgICByZWcgPSBuZXcgUG9saWN5UmVnaXN0cnlJbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBvbGljeUluY2x1ZGUoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgewotCi0gICAgICAgIGlmIChheGlzRGVzY3JpcHRpb24uZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUG9saWN5SW5jbHVkZSBwYXJlbnRQb2xpY3lJbmNsdWRlID0gYXhpc0Rlc2NyaXB0aW9uLmdldFBhcmVudCgpLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgICAgIHJlZyA9IG5ldyBQb2xpY3lSZWdpc3RyeUltcGwocGFyZW50UG9saWN5SW5jbHVkZS5nZXRQb2xpY3lSZWdpc3RyeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlZyA9IG5ldyBQb2xpY3lSZWdpc3RyeUltcGwoKTsKLSAgICAgICAgfQotICAgICAgICBzZXREZXNjcmlwdGlvbihheGlzRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeVJlZ2lzdHJ5KFBvbGljeVJlZ2lzdHJ5IHJlZykgewotICAgICAgICB0aGlzLnJlZyA9IHJlZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5UmVnaXN0cnkgZ2V0UG9saWN5UmVnaXN0cnkoKSB7Ci0gICAgICAgIHJldHVybiByZWc7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHBhcmFtIHBvbGljeQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lTdWJqZWN0I2F0dGFjaFBvbGljeShQb2xpY3kpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeVN1YmplY3QjY2xlYXIoKQotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLCByZXBsYWNlZCBieQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNhdHRhY2hQb2xpY3koUG9saWN5KX0gVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI2NsZWFyKCl9IGJlZm9yZWhhbmQgZWZmZWN0aXZlIHBvbGljeSBvZgotCSAqICAgICAgICAgICAgIHtAbGluayBBeGlzRGVzY3JpcHRpb259IGhhcyB0byBiZSBzZXQgYXMgdGhlIGFyZ3VtZW50LgotCSAqIAotCSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvbGljeShQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIHdyYXBwZXJFbGVtZW50cy5jbGVhcigpOwotCi0gICAgICAgIGlmIChwb2xpY3kuZ2V0TmFtZSgpID09IG51bGwgJiYgcG9saWN5LmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5LnNldElkKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IG5ldyBXcmFwcGVyKFBvbGljeUluY2x1ZGUuQU5PTl9QT0xJQ1ksIHBvbGljeSk7Ci0gICAgICAgIGlmIChwb2xpY3kuZ2V0TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdyYXBwZXJFbGVtZW50cy5wdXQocG9saWN5LmdldE5hbWUoKSwgd3JhcHBlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cmFwcGVyRWxlbWVudHMucHV0KHBvbGljeS5nZXRJZCgpLCB3cmFwcGVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKS5jbGVhcigpOwotCQkJZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShwb2xpY3kpOwotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UsIHJlcGxhY2VkIGJ5Ci0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI3VwZGF0ZVBvbGljeShQb2xpY3kpfS4KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQb2xpY3koUG9saWN5IHBvbGljeSkgewotICAgICAgICBTdHJpbmcga2V5OwotCi0gICAgICAgIGlmICgoa2V5ID0gcG9saWN5LmdldE5hbWUoKSkgPT0gbnVsbCAmJiAoa2V5ID0gcG9saWN5LmdldElkKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gdGhyb3cgbW9yZSBtZWFuaW5nZnVsIGV4Y2VwdGlvbiAuLgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBvbGljeSBkb2Vzbid0IGhhdmUgYSBuYW1lIG9yIGFuIGlkICIpOwotICAgICAgICB9Ci0KLSAgICAgICAgV3JhcHBlciB3cmFwcGVyID0gKFdyYXBwZXIpIHdyYXBwZXJFbGVtZW50cy5nZXQoa2V5KTsKLSAgICAgICAgd3JhcHBlci52YWx1ZSA9IHBvbGljeTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkudXBkYXRlUG9saWN5KHBvbGljeSk7Ci0JCX0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZS4gWW91IGNhbid0IG92ZXJyaWRlIGEgcG9saWNpZXMgdGhhdAotCSAqICAgICAgICAgICAgIGFwcGxpY2FibGUgZm9yIHRoZSBjdXJyZW50IHBvbGljeSBzY29wZSB2aWEKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5SW5jbHVkZSAjc2V0RWZmZWN0aXZlUG9saWN5KFBvbGljeSl9LiBJbiBjYXNlCi0JICogICAgICAgICAgICAgeW91IG5lZWQgdG8gbWFrZSBhIHBvbGljeSB0aGUgb25seSBwb2xpY3kgdGhhdCBpcyB3aXRoaW4gdGhlCi0JICogICAgICAgICAgICAgcG9saWN5IGNhY2hlIG9mIGFuIHtAbGluayBBeGlzRGVzY3JpcHRpb259IHBsZWFzZSB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjY2xlYXIoKX0gYW5kCi0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI2F0dGFjaFBvbGljeShQb2xpY3kpfSBhY2NvcmRpbmdseS4KLQkgKiAKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFZmZlY3RpdmVQb2xpY3koUG9saWN5IGVmZmVjdGl2ZVBvbGljeSkgewotICAgICAgICB0aGlzLmVmZmVjdGl2ZVBvbGljeSA9IGVmZmVjdGl2ZVBvbGljeTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGVmZmVjdGl2ZVBvbGljeSAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuY2xlYXIoKTsKLQkJCWRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKS5hdHRhY2hQb2xpY3koZWZmZWN0aXZlUG9saWN5KTsKLQkJfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKEF4aXNEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEF4aXNEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9saWN5SW5jbHVkZSBnZXRQYXJlbnQoKSB7Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgZGVzY3JpcHRpb24uZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLmdldFBhcmVudCgpLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlUG9saWN5KCkgewotCi0gICAgICAgIFBvbGljeSByZXN1bHQgPSBudWxsOwotICAgICAgICBJdGVyYXRvcjxXcmFwcGVyPiBpdGVyYXRvciA9IHdyYXBwZXJFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBwb2xpY3lFbGVtZW50ID0gKChXcmFwcGVyKSBpdGVyYXRvci5uZXh0KCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBQb2xpY3kgcDsKLQotICAgICAgICAgICAgaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBBeGlzUG9saWN5TG9jYXRvciBsb2NhdG9yID0gbmV3IEF4aXNQb2xpY3lMb2NhdG9yKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICBwID0gKFBvbGljeSkgKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKGxvY2F0b3IsIGZhbHNlKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgcCA9IChQb2xpY3kpIHBvbGljeUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBBeGlzRmF1bHQ/Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA9PSBudWxsKSA/IChQb2xpY3kpIHAgOiAoUG9saWN5KSByZXN1bHQubWVyZ2UocCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnBvbGljeSA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlRWZmZWN0aXZlUG9saWN5KCkgewotICAgICAgICBQb2xpY3kgcmVzdWx0OwotCi0gICAgICAgIGlmIChnZXRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQb2xpY3kgcGFyZW50UG9saWN5ID0gZ2V0UGFyZW50KCkuZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXJlbnRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdldFBvbGljeSgpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgaWYgKGdldFBvbGljeSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFBvbGljeSkgcGFyZW50UG9saWN5Lm1lcmdlKGdldFBvbGljeSgpKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBhcmVudFBvbGljeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFBvbGljeSgpOwotICAgICAgICB9Ci0gICAgICAgIHNldEVmZmVjdGl2ZVBvbGljeShyZXN1bHQpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLiBJZiB5b3UgbmVlZCB0byBjYWxjdWxhdGUgbWVyZ2VkIHBvbGljeSBvZgotCSAqICAgICAgICAgICAgIGFsbCBwb2xpY2llcyB0aGF0IGFyZSBpbiB0aGUgcG9saWN5IGNhY2hlIG9mCi0JICogICAgICAgICAgICAge0BsaW5rIEF4aXNEZXNjcmlwdGlvbn0sIHVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNnZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSBhbmQge0BsaW5rIG9yZy5Qb2xpY3lVdGlsICNnZXRNZXJnZWRQb2xpY3koTGlzdCwgQXhpc0Rlc2NyaXB0aW9uKX19Ci0JICovCi0gICAgcHVibGljIFBvbGljeSBnZXRQb2xpY3koKSB7Ci0gICAgCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3Q8UG9saWN5Q29tcG9uZW50PiBwb2xpY3lMaXN0ID0gbmV3IEFycmF5TGlzdDxQb2xpY3lDb21wb25lbnQ+KGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQkJcmV0dXJuIFBvbGljeVV0aWwuZ2V0TWVyZ2VkUG9saWN5KHBvbGljeUxpc3QsIGRlc2NyaXB0aW9uKTsKLQkJfQotICAgIAkKLSAgICAgICAgY2FsY3VsYXRlUG9saWN5KCk7Ci0gICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UuIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBBeGlzTWVzc2FnZSAjZ2V0RWZmZWN0aXZlUG9saWN5KCl9IG9yCi0JICogICAgICAgICAgICAge0BsaW5rIEF4aXNCaW5kaW5nTWVzc2FnZSAjZ2V0RWZmZWN0aXZlUG9saWN5KCl9IHdoZW4KLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlLgotCSAqLwotICAgIHB1YmxpYyBQb2xpY3kgZ2V0RWZmZWN0aXZlUG9saWN5KCkgewotICAgIAlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc01lc3NhZ2UpIHsKLQkJCQlyZXR1cm4gKChBeGlzTWVzc2FnZSkgZGVzY3JpcHRpb24pLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCQkJfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nTWVzc2FnZSkgewotCQkJCXJldHVybiAoKEF4aXNCaW5kaW5nTWVzc2FnZSkgZGVzY3JpcHRpb24pLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCQkJfQotCQl9Ci0gICAgCQotICAgICAgICBjYWxjdWxhdGVFZmZlY3RpdmVQb2xpY3koKTsKLSAgICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBvbGljeTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCl9Ci0JICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQb2xpY3lFbGVtZW50cygpIHsKLSAgICAJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PFBvbGljeUNvbXBvbmVudD4oZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpCi0JCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0JCX0KLSAgICAJCi0gICAgICAgIEFycmF5TGlzdCBwb2xpY3lFbGVtZW50c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yPFdyYXBwZXI+IHBvbGljeUVsZW1lbnRJdGVyYXRvciA9IHdyYXBwZXJFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChwb2xpY3lFbGVtZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBwb2xpY3lFbGVtZW50c0xpc3QKLSAgICAgICAgICAgICAgICAgICAgLmFkZChwb2xpY3lFbGVtZW50SXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2xpY3lFbGVtZW50c0xpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UuIFRoZSBwb2xpY3kgZWxlbWVudCB0eXBlIGlzIG5vIGxvbmdlcgotCSAqICAgICAgICAgICAgIHJlcXVpcmVkIHNpbmNlIHdlIG1haW50YWluIGEgY29tcGxldGUgYmluZGluZyBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgIGhpZXJhcmNoeSBmb3IgdGhlIHN0YXRpYyBkZXNjcmlwdGlvbiB0aGUgc2VydmljZS4gSGVuY2UgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rIFBvbGljeVN1YmplY3QgI2dldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50cygpfSBvbgotCSAqICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIG9iamVjdC4KLQkgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBvbGljeUVsZW1lbnRzKGludCB0eXBlKSB7Ci0gICAgICAgIEFycmF5TGlzdCBwb2xpY3lFbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3I8V3JhcHBlcj4gd3JhcHBlckVsZW1lbnRJdGVyYXRvciA9IHdyYXBwZXJFbGVtZW50cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBXcmFwcGVyIHdyYXBwZXI7Ci0KLSAgICAgICAgd2hpbGUgKHdyYXBwZXJFbGVtZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB3cmFwcGVyID0gKFdyYXBwZXIpIHdyYXBwZXJFbGVtZW50SXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAod3JhcHBlci5nZXRUeXBlKCkgPT0gdHlwZSkgewotICAgICAgICAgICAgICAgIHBvbGljeUVsZW1lbnRMaXN0LmFkZCh3cmFwcGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb2xpY3lFbGVtZW50TGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZS4gVXNlIFNlcnZpY2VEYXRhLnhtbCBvciBBeGlzMiBEYXRhTG9jYXRvcnMKLQkgKiAgICAgICAgICAgICB0byBjb25maWd1cmUgcG9saWNpZXMgdGhhdCBhcmUgc3RvcmVkIHNlcGFyYXRlbHkuCi0JICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQb2xpY3koU3RyaW5nIGtleSwgUG9saWN5IHBvbGljeSkgewotICAgICAgICByZWcucmVnaXN0ZXIoa2V5LCBwb2xpY3kpOwotICAgIH0KLQotICAgIC8qKgotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLCByZXBsYWNlZCBieQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNnZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudChTdHJpbmcpfQotCSAqLwotICAgIHB1YmxpYyBQb2xpY3kgZ2V0UG9saWN5KFN0cmluZyBrZXkpIHsKLSAgICAJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCVBvbGljeUNvbXBvbmVudCByZXN1bHQgPSBkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkKLQkJCQkJLmdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50KGtleSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQkJcmV0dXJuIChQb2xpY3kpIHJlc3VsdDsKLQkJCX0KLQkJfQotICAgIAkKLSAgICAgICAgcmV0dXJuIHJlZy5sb29rdXAoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjYXR0YWNoUG9saWN5KFBvbGljeSl9Ci0JICovCi0gICAgcHVibGljIHZvaWQgYWRkUG9saWN5RWxlbWVudChpbnQgdHlwZSwgUG9saWN5IHBvbGljeSkgewotCi0gICAgICAgIFN0cmluZyBrZXk7Ci0KLSAgICAgICAgaWYgKChrZXkgPSBwb2xpY3kuZ2V0TmFtZSgpKSA9PSBudWxsICYmIChrZXkgPSBwb2xpY3kuZ2V0SWQoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5LnNldElkKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGtleSA9IChwb2xpY3kuZ2V0TmFtZSgpICE9IG51bGwpID8gcG9saWN5LmdldE5hbWUoKSA6IHBvbGljeS5nZXRJZCgpOwotCi0gICAgICAgIFdyYXBwZXIgd3JhcHBlciA9IG5ldyBXcmFwcGVyKHR5cGUsIHBvbGljeSk7Ci0gICAgICAgIHdyYXBwZXJFbGVtZW50cy5wdXQoa2V5LCB3cmFwcGVyKTsKLSAgICAgICAgcmVnLnJlZ2lzdGVyKGtleSwgcG9saWN5KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuYXR0YWNoUG9saWN5KHBvbGljeSk7Ci0JCX0KLSAgICB9Ci0KLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjYXR0YWNoUG9saWN5UmVmZXJlbmNlKFBvbGljeVJlZmVyZW5jZSl9Ci0JICovCi0gICAgcHVibGljIHZvaWQgYWRkUG9saWN5UmVmRWxlbWVudChpbnQgdHlwZSwgUG9saWN5UmVmZXJlbmNlIHBvbGljeVJlZmVyZW5jZSkgewotICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSBuZXcgV3JhcHBlcih0eXBlLCBwb2xpY3lSZWZlcmVuY2UpOwotICAgICAgICB3cmFwcGVyRWxlbWVudHMucHV0KHBvbGljeVJlZmVyZW5jZS5nZXRVUkkoKSwgd3JhcHBlcik7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeVJlZmVyZW5jZSgKLQkJCQkJcG9saWN5UmVmZXJlbmNlKTsKLQkJfQotICAgIH0KLQotICAgIGNsYXNzIFdyYXBwZXIgewotICAgICAgICBwcml2YXRlIGludCB0eXBlOwotICAgICAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLQotICAgICAgICBXcmFwcGVyKGludCB0eXBlLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHNldFR5cGUodHlwZSk7Ci0gICAgICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDEuNCByZWxlYXNlLCByZXBsYWNlZCBieQotCSAqICAgICAgICAgICAgIHtAbGluayBQb2xpY3lTdWJqZWN0ICNkZXRhY2hQb2xpY3lDb21wb25lbnQoU3RyaW5nKX0KLQkgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQb2xpY3lFbGVtZW50KFN0cmluZyBwb2xpY3lVUkkpIHsKLSAgICAgICAgd3JhcHBlckVsZW1lbnRzLnJlbW92ZShwb2xpY3lVUkkpOwotICAgICAgICByZWcucmVtb3ZlKHBvbGljeVVSSSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmRldGFjaFBvbGljeUNvbXBvbmVudChwb2xpY3lVUkkpOwotCQl9Ci0gICAgfQotCi0gICAgLyoqCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMS40IHJlbGVhc2UsIHJlcGxhY2VkIGJ5IHtAbGluayBQb2xpY3lTdWJqZWN0ICNjbGVhcigpfQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFBvbGljeUVsZW1lbnRzKCkgewotICAgICAgICB3cmFwcGVyRWxlbWVudHMuY2xlYXIoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbi5nZXRQb2xpY3lTdWJqZWN0KCkuY2xlYXIoKTsKLQkJfQotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjQgcmVsZWFzZSwgcmVwbGFjZWQgYnkKLQkgKiAgICAgICAgICAgICB7QGxpbmsgUG9saWN5U3ViamVjdCAjZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCl9Ci0JICovCi0gICAgcHVibGljIExpc3QgZ2V0QXR0YWNoZWRQb2xpY2llcygpIHsKLSAgICAJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKQotCQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkpOwotCQl9Ci0gICAgCQotICAgICAgICBBcnJheUxpc3QgIGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cmFwcGVyRWxlbWVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYXJyYXlMaXN0LmFkZCgoKFdyYXBwZXIpIGl0ZXJhdG9yLm5leHQoKSkudmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYXJyYXlMaXN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Qb2xpY3lTdWJqZWN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUG9saWN5U3ViamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRkM2U2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Qb2xpY3lTdWJqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lTdWJqZWN0IHsKLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBEYXRlIGxhc3RVcGRhdGVkVGltZSA9IG5ldyBEYXRlKCk7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgUG9saWN5Q29tcG9uZW50PiBhdHRhY2hlZFBvbGljeUNvbXBvbmVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBvbGljeUNvbXBvbmVudD4oKTsKLQotCXB1YmxpYyB2b2lkIGF0dGFjaFBvbGljeShQb2xpY3kgcG9saWN5KSB7Ci0JCVN0cmluZyBrZXkgPSBwb2xpY3kuZ2V0TmFtZSgpOwotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCWtleSA9IHBvbGljeS5nZXRJZCgpOwotCQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQkJa2V5ID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0JCQkJcG9saWN5LnNldElkKGtleSk7Ci0JCQl9Ci0JCX0KLQkJYXR0YWNoUG9saWN5Q29tcG9uZW50KGtleSwgcG9saWN5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lSZWZlcmVuY2UoUG9saWN5UmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQlhdHRhY2hlZFBvbGljeUNvbXBvbmVudHMucHV0KHJlZmVyZW5jZS5nZXRVUkkoKSwgcmVmZXJlbmNlKTsKLQkJc2V0TGFzdFVwZGF0ZWRUaW1lKG5ldyBEYXRlKCkpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lDb21wb25lbnRzKExpc3Q8UG9saWN5Q29tcG9uZW50PiBwb2xpY3lDb21wb25lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3I8UG9saWN5Q29tcG9uZW50PiBpdGVyYXRvciA9IHBvbGljeUNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJYXR0YWNoUG9saWN5Q29tcG9uZW50KChQb2xpY3lDb21wb25lbnQpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lDb21wb25lbnQoUG9saWN5Q29tcG9uZW50IHBvbGljeUNvbXBvbmVudCkgewotCQlpZiAocG9saWN5Q29tcG9uZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQlhdHRhY2hQb2xpY3koKFBvbGljeSkgcG9saWN5Q29tcG9uZW50KTsKLQkJfSBlbHNlIGlmIChwb2xpY3lDb21wb25lbnQgaW5zdGFuY2VvZiBQb2xpY3lSZWZlcmVuY2UpIHsKLQkJCWF0dGFjaFBvbGljeVJlZmVyZW5jZSgoUG9saWN5UmVmZXJlbmNlKSBwb2xpY3lDb21wb25lbnQpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkludmFsaWQgdG9wIGxldmVsIHBvbGljeSBjb21wb25lbnQgdHlwZSIpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRhY2hQb2xpY3lDb21wb25lbnQoU3RyaW5nIGtleSwKLQkJCVBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQpIHsKLQkJYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLnB1dChrZXksIHBvbGljeUNvbXBvbmVudCk7Ci0JCXNldExhc3RVcGRhdGVkVGltZShuZXcgRGF0ZSgpKTsKLQkJCi0JCWlmICghaXNVcGRhdGVkKCkpIHsKLQkJCXNldFVwZGF0ZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUG9saWN5Q29tcG9uZW50IGdldEF0dGFjaGVkUG9saWN5Q29tcG9uZW50KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChQb2xpY3lDb21wb25lbnQpIGF0dGFjaGVkUG9saWN5Q29tcG9uZW50cy5nZXQoa2V5KTsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFBvbGljeUNvbXBvbmVudD4gZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnRzKCkgewotCQlyZXR1cm4gYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLnZhbHVlcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlZCgpIHsKLQkJcmV0dXJuIHVwZGF0ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlZChib29sZWFuIHVwZGF0ZWQpIHsKLQkJdGhpcy51cGRhdGVkID0gdXBkYXRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVQb2xpY3koUG9saWN5IHBvbGljeSkgewotCQlTdHJpbmcga2V5ID0gKHBvbGljeS5nZXROYW1lKCkgIT0gbnVsbCkgPyBwb2xpY3kuZ2V0TmFtZSgpIDogcG9saWN5Ci0JCQkJLmdldElkKCk7Ci0JCWlmIChrZXkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJInBvbGljeSBkb2Vzbid0IGhhdmUgYSBuYW1lIG9yIGFuIGlkICIpOwotCQl9Ci0JCWF0dGFjaGVkUG9saWN5Q29tcG9uZW50cy5wdXQoa2V5LCBwb2xpY3kpOwotCQlzZXRMYXN0VXBkYXRlZFRpbWUobmV3IERhdGUoKSk7Ci0JCQotCQlpZiAoIWlzVXBkYXRlZCgpKSB7Ci0JCQlzZXRVcGRhdGVkKHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGV0YWNoUG9saWN5Q29tcG9uZW50KFN0cmluZyBrZXkpIHsKLQkJYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLnJlbW92ZShrZXkpOwotCQlzZXRMYXN0VXBkYXRlZFRpbWUobmV3IERhdGUoKSk7Ci0JCWlmICghaXNVcGRhdGVkKCkpIHsKLQkJCXNldFVwZGF0ZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJYXR0YWNoZWRQb2xpY3lDb21wb25lbnRzLmNsZWFyKCk7Ci0JCXNldExhc3RVcGRhdGVkVGltZShuZXcgRGF0ZSgpKTsKLQkJaWYgKCFpc1VwZGF0ZWQoKSkgewotCQkJc2V0VXBkYXRlZCh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEYXRlIGdldExhc3RVcGRhdGVkVGltZSgpIHsKLQkJcmV0dXJuIGxhc3RVcGRhdGVkVGltZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlZFRpbWUoRGF0ZSBsYXN0VXBkYXRlZFRpbWUpIHsKLQkJdGhpcy5sYXN0VXBkYXRlZFRpbWUgPSBsYXN0VXBkYXRlZFRpbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1JvYnVzdE91dE9ubHlBeGlzT3BlcmF0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2YzAzNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFJvYnVzdE91dE9ubHlBeGlzT3BlcmF0aW9uIGV4dGVuZHMgT3V0SW5BeGlzT3BlcmF0aW9uIHsKLQotICAgIHB1YmxpYyBSb2J1c3RPdXRPbmx5QXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy9zZXR1cCBhIHRlbXBvcmFyeSBuYW1lCi0gICAgICAgIFFOYW1lIHRtcE5hbWUgPSBuZXcgUU5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgdGhpcy5zZXROYW1lKHRtcE5hbWUpOwotICAgICAgICBzZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUm9idXN0T3V0T25seUF4aXNPcGVyYXRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgc2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybihXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkNsaWVudCBjcmVhdGVDbGllbnQoU2VydmljZUNvbnRleHQgc2MsIE9wdGlvbnMgb3B0aW9ucykgewotICAgICAgICByZXR1cm4gbmV3IFJvYnVzdE91dE9ubHlPcGVyYXRpb25DbGllbnQodGhpcywgc2MsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIGNsYXNzIFJvYnVzdE91dE9ubHlPcGVyYXRpb25DbGllbnQgZXh0ZW5kcyBPdXRJbkF4aXNPcGVyYXRpb25DbGllbnQgewotCi0gICAgICAgIHB1YmxpYyBSb2J1c3RPdXRPbmx5T3BlcmF0aW9uQ2xpZW50KE91dEluQXhpc09wZXJhdGlvbiBheGlzT3AsIFNlcnZpY2VDb250ZXh0IHNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMpIHsKLSAgICAgICAgICAgIHN1cGVyKGF4aXNPcCwgc2MsIG9wdGlvbnMpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB0aW1lT3V0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgIC8vTm90aGluZyB0byB3b3JyeQotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgdGhlcmUgaXMgYSBmYXVsdCB0aGVuIG5lZWQgdG8gaGFuZGxlIHRoYXQKLSAgICAgICAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udGV4dAotICAgICAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgcmVzcG9uc2VNZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSByZXNwb25zZU1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBpZiAoZW52ZWxvcGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIElmIHJlcXVlc3QgaXMgUkVTVCB3ZSBhc3N1bWUgdGhlIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQgaXMgUkVTVCwgc28KLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSAoSW5wdXRTdHJlYW0pIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSU4pOwotICAgICAgICAgICAgICAgIGlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlID0gVHJhbnNwb3J0VXRpbHMuY3JlYXRlU09BUE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZU1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbnZlbG9wZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVudmVsb3BlLmhhc0ZhdWx0KCl8fCByZXNwb25zZU1lc3NhZ2VDb250ZXh0LmlzUHJvY2Vzc2luZ0ZhdWx0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9yZWNlaXZpbmcgYSBmYXVsdAotICAgICAgICAgICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUocmVzcG9uc2VNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IFV0aWxzLmdldEluYm91bmRGYXVsdEZyb21NZXNzYWdlQ29udGV4dChyZXNwb25zZU1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1RyYW5zcG9ydEluRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyYjk4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0SW5EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gaW5jb21pbmcgdHJhbnNwb3J0IGRlcGxveWVkIGluIEF4aXMyLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFBhcmFtZXRlckluY2x1ZGUgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgZmxvd0luY2x1ZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEZsb3cgZmF1bHRGbG93OwotCi0gICAgLy8gU3RvcmVzIGhhbmRsZXIgRmF1bHQgaW4gaW5GbG93Ci0gICAgcHJpdmF0ZSBQaGFzZSBmYXVsdFBoYXNlOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgZmxvd0luY2x1ZGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEZsb3cgaW5GbG93OwotCi0gICAgLy8gdG8gc3RvcmUgaGFuZGxlciBpbiBpbkZsb3cKLSAgICBwcml2YXRlIFBoYXNlIGluUGhhc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgcGFyYW1JbmNsdWRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFBhcmFtZXRlckluY2x1ZGUgcGFyYW1JbmNsdWRlOwotICAgIHByb3RlY3RlZCBUcmFuc3BvcnRMaXN0ZW5lciByZWNlaXZlcjsKLQotICAgIHB1YmxpYyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHBhcmFtSW5jbHVkZSA9IG5ldyBQYXJhbWV0ZXJJbmNsdWRlSW1wbCgpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICBpblBoYXNlID0gbmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuVFJBTlNQT1JUX1BIQVNFKTsKLSAgICAgICAgZmF1bHRQaGFzZSA9IG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlRSQU5TUE9SVF9QSEFTRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbUluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcGFyYW1JbmNsdWRlLnJlbW92ZVBhcmFtZXRlcihwYXJhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVQYXJhbWV0ZXJzKE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5wYXJhbUluY2x1ZGUuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0RmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2UgZ2V0RmF1bHRQaGFzZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0UGhhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIEZsb3cgZ2V0SW5GbG93KCkgewotICAgICAgICByZXR1cm4gaW5GbG93OwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZSBnZXRJblBoYXNlKCkgewotICAgICAgICByZXR1cm4gaW5QaGFzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgVHJhbnNwb3J0IG5hbWUgYXMgYSBRTmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBRTmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBQYXJhbWV0ZXIuCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtSW5jbHVkZS5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbUluY2x1ZGUuZ2V0UGFyYW1ldGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBUcmFuc3BvcnRMaXN0ZW5lci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0TGlzdGVuZXIgZ2V0UmVjZWl2ZXIoKSB7Ci0gICAgICAgIHJldHVybiByZWNlaXZlcjsKLSAgICB9Ci0KLSAgICAvLyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbUluY2x1ZGUuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRoaXMuZmF1bHRGbG93ID0gZmF1bHRGbG93OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0UGhhc2UoUGhhc2UgZmF1bHRQaGFzZSkgewotICAgICAgICB0aGlzLmZhdWx0UGhhc2UgPSBmYXVsdFBoYXNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluRmxvdyhGbG93IGluRmxvdykgewotICAgICAgICB0aGlzLmluRmxvdyA9IGluRmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJblBoYXNlKFBoYXNlIGluUGhhc2UpIHsKLSAgICAgICAgdGhpcy5pblBoYXNlID0gaW5QaGFzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVjZWl2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlcihUcmFuc3BvcnRMaXN0ZW5lciByZWNlaXZlcikgewotICAgICAgICB0aGlzLnJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1RyYW5zcG9ydE91dERlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwYmI1MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHRyYW5zcG9ydCBkZXBsb3llZCBpbiBBWGlzMgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gaW1wbGVtZW50cyBQYXJhbWV0ZXJJbmNsdWRlIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGZsb3dJbmNsdWRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBGbG93IGZhdWx0RmxvdzsKLSAgICBwcml2YXRlIFBoYXNlIGZhdWx0UGhhc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgb3V0RmxvdwotICAgICAqLwotICAgIHByaXZhdGUgRmxvdyBvdXRGbG93OwotICAgIHByaXZhdGUgUGhhc2Ugb3V0UGhhc2U7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwYXJhbUluY2x1ZGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgUGFyYW1ldGVySW5jbHVkZSBwYXJhbUluY2x1ZGU7Ci0gICAgcHJvdGVjdGVkIFRyYW5zcG9ydFNlbmRlciBzZW5kZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBBeGlzVHJhbnNwb3J0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcGFyYW1JbmNsdWRlID0gbmV3IFBhcmFtZXRlckluY2x1ZGVJbXBsKCk7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIG91dFBoYXNlID0gbmV3IFBoYXNlKFBoYXNlTWV0YWRhdGEuVFJBTlNQT1JUX1BIQVNFKTsKLSAgICAgICAgZmF1bHRQaGFzZSA9IG5ldyBQaGFzZShQaGFzZU1ldGFkYXRhLlRSQU5TUE9SVF9QSEFTRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGFkZFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBwYXJhbUluY2x1ZGUuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQYXJhbWV0ZXIoUGFyYW1ldGVyIHBhcmFtKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcGFyYW1JbmNsdWRlLnJlbW92ZVBhcmFtZXRlcihwYXJhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVQYXJhbWV0ZXJzKE9NRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5wYXJhbUluY2x1ZGUuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG93IGdldEZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0RmxvdzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2UgZ2V0RmF1bHRQaGFzZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0UGhhc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEZsb3cgZ2V0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIG91dEZsb3c7Ci0gICAgfQotCi0gICAgcHVibGljIFBoYXNlIGdldE91dFBoYXNlKCkgewotICAgICAgICByZXR1cm4gb3V0UGhhc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gcGFyYW1JbmNsdWRlLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtSW5jbHVkZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFRyYW5zcG9ydFNlbmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0U2VuZGVyIGdldFNlbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIHNlbmRlcjsKLSAgICB9Ci0KLSAgICAvLyB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZlbAotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbUluY2x1ZGUuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRoaXMuZmF1bHRGbG93ID0gZmF1bHRGbG93OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0UGhhc2UoUGhhc2UgZmF1bHRQaGFzZSkgewotICAgICAgICB0aGlzLmZhdWx0UGhhc2UgPSBmYXVsdFBoYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dEZsb3coRmxvdyBvdXRGbG93KSB7Ci0gICAgICAgIHRoaXMub3V0RmxvdyA9IG91dEZsb3c7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0UGhhc2UoUGhhc2Ugb3V0UGhhc2UpIHsKLSAgICAgICAgdGhpcy5vdXRQaGFzZSA9IG91dFBoYXNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZW5kZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoVHJhbnNwb3J0U2VuZGVyIHNlbmRlcikgewotICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVHdvQ2hhbm5lbEF4aXNPcGVyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Ud29DaGFubmVsQXhpc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzE5YTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Ud29DaGFubmVsQXhpc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBrZWVwIGNvbW1vbiBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGluIEluT3V0IGFuZCBPdXRJbiBheGlzT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUd29DaGFubmVsQXhpc09wZXJhdGlvbiBleHRlbmRzIEF4aXNPcGVyYXRpb24gewotCi0gICAgcHJvdGVjdGVkIEF4aXNNZXNzYWdlIGluRmF1bHRNZXNzYWdlOwotICAgIHByb3RlY3RlZCBBeGlzTWVzc2FnZSBvdXRGYXVsdE1lc3NhZ2U7Ci0gICAgcHJvdGVjdGVkIEF4aXNNZXNzYWdlIGluTWVzc2FnZTsKLSAgICBwcm90ZWN0ZWQgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZTsKLQotICAgIHB1YmxpYyBUd29DaGFubmVsQXhpc09wZXJhdGlvbigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgLy9zZXR1cCBhIHRlbXBvcmFyeSBuYW1lCi0gICAgICAgIFFOYW1lIHRtcE5hbWUgPSBuZXcgUU5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICJfIiArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgdGhpcy5zZXROYW1lKHRtcE5hbWUpOwotICAgICAgICBjcmVhdGVNZXNzYWdlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBUd29DaGFubmVsQXhpc09wZXJhdGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgICAgICBjcmVhdGVNZXNzYWdlcygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNZXNzYWdlcygpIHsKLSAgICAgICAgaW5NZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgIGluTWVzc2FnZS5zZXREaXJlY3Rpb24oV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOKTsKLSAgICAgICAgaW5NZXNzYWdlLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgYWRkQ2hpbGQoImluTWVzc2FnZSIsIGluTWVzc2FnZSk7Ci0KLSAgICAgICAgaW5GYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgaW5GYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIG91dEZhdWx0TWVzc2FnZSA9IG5ldyBBeGlzTWVzc2FnZSgpOwotICAgICAgICBvdXRGYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotCi0gICAgICAgIG91dE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXREaXJlY3Rpb24oV1NETENvbnN0YW50cy5XU0RMX01FU1NBR0VfRElSRUNUSU9OX09VVCk7Ci0gICAgICAgIG91dE1lc3NhZ2Uuc2V0UGFyZW50KHRoaXMpOwotICAgICAgICBhZGRDaGlsZCgib3V0TWVzc2FnZSIsIG91dE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoQXhpc01lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgICAgIGFkZENoaWxkKCJvdXRNZXNzYWdlIiwgbWVzc2FnZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgICAgIGFkZENoaWxkKCJpbk1lc3NhZ2UiLCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUuZXF1YWxzKGxhYmVsKSkgewotICAgICAgICAgICAgYWRkQ2hpbGQoImZhdWx0TWVzc2FnZSIsIG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3QgeWV0IGltcGxlbWVudGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBBeGlzTWVzc2FnZSBnZXRNZXNzYWdlKFN0cmluZyBsYWJlbCkgewotICAgICAgICBpZiAoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgib3V0TWVzc2FnZSIpOwotICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobGFiZWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNZXNzYWdlKSBnZXRDaGlsZCgiaW5NZXNzYWdlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VDb250ZXh0PiBtZXAgPSBvcENvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHRzKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0TWVzc2FnZUN0eHQgPSAoTWVzc2FnZUNvbnRleHQpIG1lcC5nZXQoTUVTU0FHRV9MQUJFTF9GQVVMVF9WQUxVRSk7Ci0KLSAgICAgICAgaWYgKGZhdWx0TWVzc2FnZUN0eHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXBjb21wbGV0ZWQiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXAucHV0KE1FU1NBR0VfTEFCRUxfRkFVTFRfVkFMVUUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgb3BDb250ZXh0LnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgb3BDb250ZXh0LmNsZWFudXAoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNJbkZhdWx0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIGluRmF1bHRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQaGFzZXNPdXRGYXVsdEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdE1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFBoYXNlc091dEZsb3coKSB7Ci0gICAgICAgIHJldHVybiBvdXRNZXNzYWdlLmdldE1lc3NhZ2VGbG93KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKSB7Ci0gICAgICAgIHJldHVybiBpbk1lc3NhZ2UuZ2V0TWVzc2FnZUZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbkZhdWx0RmxvdyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICBpbkZhdWx0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNPdXRGYXVsdEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0RmF1bHRNZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBoYXNlc091dEZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgb3V0TWVzc2FnZS5zZXRNZXNzYWdlRmxvdyhsaXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgICAgaW5NZXNzYWdlLnNldE1lc3NhZ2VGbG93KGxpc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjkwNGFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgdmVyc2lvbiBudW1iZXIgYW5kIGltcGxlbWVudGluZyBhIGNvbXBhcmlzb24gYWxnb3JpdGhtIGNvbXBhdGlibGUKLSAqIHdpdGggTWF2ZW4uIFRoaXMgY2xhc3MgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG1vZHVsZSB2ZXJzaW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb24gaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIENvbXBhcmFibGU8VmVyc2lvbj4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTX1NOQVBTSE9UID0gIlNOQVBTSE9UIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb24gU05BUFNIT1QgPSBuZXcgVmVyc2lvbihudWxsLCBTX1NOQVBTSE9UKTsKLSAgICAKLSAgICBwcml2YXRlIGZpbmFsIGludFtdIGNvbXBvbmVudHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcXVhbGlmaWVyOwotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb25lbnRzIHRoZSBudW1lcmljIGNvbXBvbmVudHMgb2YgdGhlIHZlcnNpb247IG1heSBiZSBudWxsIGZvciBTTkFQU0hPVCB2ZXJzaW9uCi0gICAgICogQHBhcmFtIHF1YWxpZmllciB0aGUgcXVhbGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIFZlcnNpb24oaW50W10gY29tcG9uZW50cywgU3RyaW5nIHF1YWxpZmllcikgewotICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzID09IG51bGwgPyBudWxsIDogY29tcG9uZW50cy5jbG9uZSgpOwotICAgICAgICB0aGlzLnF1YWxpZmllciA9IHF1YWxpZmllcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBwYXJzZXMgdGhlIHZlcnNpb24gZnJvbSBhIHN0cmluZy4gVGhlIHZlcnNpb24gbXVzdCBoYXZlIHRoZQotICAgICAqIGZvbGxvd2luZyBmb3JtYXQ6Ci0gICAgICogPHByZT4KLSAgICAgKiBpbnRlZ2VyICggIi4iIGludGVnZXIgKSogKCAiLSIgcXVhbGlmaWVyICk/Ci0gICAgICogPC9wcmU+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHZlcnNpb25TdHJpbmcgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbgotICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgdGhlIHZlcnNpb24gaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdAotICAgICAqLwotICAgIHB1YmxpYyBWZXJzaW9uKFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBpZiAodmVyc2lvblN0cmluZy5lcXVhbHMoU19TTkFQU0hPVCkpIHsKLSAgICAgICAgICAgIGNvbXBvbmVudHMgPSBudWxsOwotICAgICAgICAgICAgcXVhbGlmaWVyID0gU19TTkFQU0hPVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBkYXNoSW5kZXggPSB2ZXJzaW9uU3RyaW5nLmluZGV4T2YoJy0nKTsKLSAgICAgICAgICAgIGlmIChkYXNoSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBxdWFsaWZpZXIgPSB2ZXJzaW9uU3RyaW5nLnN1YnN0cmluZyhkYXNoSW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblN0cmluZy5zdWJzdHJpbmcoMCwgZGFzaEluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcXVhbGlmaWVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbXBvbmVudFN0cmluZ3MgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgIGludCBsID0gY29tcG9uZW50U3RyaW5ncy5sZW5ndGg7Ci0gICAgICAgICAgICBjb21wb25lbnRzID0gbmV3IGludFtsXTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxsOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gSW50ZWdlci5wYXJzZUludChjb21wb25lbnRTdHJpbmdzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gMzEqQXJyYXlzLmhhc2hDb2RlKGNvbXBvbmVudHMpICsgKChxdWFsaWZpZXIgPT0gbnVsbCkgPyAwIDogcXVhbGlmaWVyLmhhc2hDb2RlKCkpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBWZXJzaW9uKSB7Ci0gICAgICAgICAgICBWZXJzaW9uIG90aGVyID0gKFZlcnNpb24pb2JqOwotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoY29tcG9uZW50cywgb3RoZXIuY29tcG9uZW50cykKLSAgICAgICAgICAgICAgICAmJiAocXVhbGlmaWVyID09IG90aGVyLnF1YWxpZmllciB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyICE9IG51bGwgJiYgcXVhbGlmaWVyLmVxdWFscyhvdGhlci5xdWFsaWZpZXIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaWYgKGNvbXBvbmVudHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaT4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjb21wb25lbnRzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocXVhbGlmaWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCctJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHF1YWxpZmllcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFZlcnNpb24gbykgewotICAgICAgICAvLyBjb21wb25lbnRzID09IG51bGwgbWVhbnMgU05BUFNIT1QgYW5kIFNOQVBTSE9UIGlzIGFsd2F5cwotICAgICAgICAvLyBhc3N1bWVkIHRvIGJlIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uCi0gICAgICAgIGlmIChjb21wb25lbnRzID09IG51bGwgJiYgby5jb21wb25lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudHMgIT0gbnVsbCAmJiBvLmNvbXBvbmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudHMgPT0gbnVsbCAmJiBvLmNvbXBvbmVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm93IGNvbXBhcmUgdmVyc2lvbiBjb21wb25lbnRzCi0gICAgICAgIGludCBsID0gTWF0aC5taW4oY29tcG9uZW50cy5sZW5ndGgsIG8uY29tcG9uZW50cy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8bDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgYyA9IGNvbXBvbmVudHNbaV0gLSBvLmNvbXBvbmVudHNbaV07Ci0gICAgICAgICAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8geC55IGFsd2F5cyBjb21lcyBiZWZvcmUgeC55LnoKLSAgICAgICAgaW50IGMgPSBjb21wb25lbnRzLmxlbmd0aCAtIG8uY29tcG9uZW50cy5sZW5ndGg7Ci0gICAgICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0gICAgICAgIC8vIHgueSBhbHdheXMgY29tZXMgYWZ0ZXIgeC55LXFxcXFxcQotICAgICAgICBpZiAocXVhbGlmaWVyID09IG51bGwgJiYgby5xdWFsaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAocXVhbGlmaWVyICE9IG51bGwgJiYgby5xdWFsaWZpZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgaWYgKHF1YWxpZmllciA9PSBudWxsICYmIG8ucXVhbGlmaWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIHgueS1TTkFQU0hPVCBjb21lcyBhZnRlciBhbnkgeC55LXFxcXFxcQotICAgICAgICBib29sZWFuIHRoaXNJc1NuYXBzaG90ID0gcXVhbGlmaWVyLmVxdWFscyhTX1NOQVBTSE9UKTsKLSAgICAgICAgYm9vbGVhbiBvdGhlcklzU25hcHNob3QgPSBvLnF1YWxpZmllci5lcXVhbHMoU19TTkFQU0hPVCk7Ci0gICAgICAgIGlmICh0aGlzSXNTbmFwc2hvdCAmJiAhb3RoZXJJc1NuYXBzaG90KSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIGlmICghdGhpc0lzU25hcHNob3QgJiYgdGhpc0lzU25hcHNob3QpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzSXNTbmFwc2hvdCAmJiBvdGhlcklzU25hcHNob3QpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZpbmFsbHkgY29tcGFyZSB0aGUgcXVhbGlmaWVycyB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uLgotICAgICAgICByZXR1cm4gcXVhbGlmaWVyLmNvbXBhcmVUb0lnbm9yZUNhc2Uoby5xdWFsaWZpZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmYWJjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgY2xhc3MgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IHRvIHJldHVybgotICogbXVsdGlwbGUgQXhpc1NlcnZpY2Ugb2JqZWN0czsgb25lIGZvciBlYWNoIHBvcnQgb24gZWFjaCBzZXJ2aWNlIGluIHRoZSBXU0RMIDEuMSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyIGV4dGVuZHMgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9Ci0gICAgICAgICAgICBMb2dGYWN0b3J5LmdldExvZyhXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TRVJWSUNFX1FOQU1FID0gIldTRExfU0VSVklDRV9RTkFNRSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1BPUlQgPSAiV1NETF9QT1JUIjsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBheGlzU2VydmljZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3MgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gLSBDb250YWlucyB0aGUgd3NkbCAxLjEgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgICAgICBheGlzU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOyAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBBcnJheUxpc3QKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKERlZmluaXRpb24gZGVmKSB7Ci0gICAgICAgIHN1cGVyKGRlZiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7ICAgLy8gY3JlYXRlIGFuIGVtcHR5IEFycmF5TGlzdAotICAgIH0KLQotICAgICBwdWJsaWMgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKERlZmluaXRpb24gZGVmLCBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgc3VwZXIoZGVmLCBudWxsLCBwb3J0TmFtZSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7ICAgLy8gY3JlYXRlIGFuIGVtcHR5IEFycmF5TGlzdAotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUHVibGljIG1ldGhvZCB0byBhY2Nlc3MgdGhlIHdzZGwgMS4xIGZpbGUgYW5kIGNyZWF0ZSBhIExpc3Qgb2YgQXhpc1NlcnZpY2Ugb2JqZWN0cy4KLSAgICAgKiBGb3IgZWFjaCBwb3J0IG9uIGVhY2ggc2VydmljZSBpbiB0aGUgd3NkbCwgYW4gQXhpc1NlcnZpY2Ugb2JqZWN0IGlzIGNyZWF0ZWQgYW5kCi0gICAgICogYWRkZWQgdG8gdGhlIExpc3QuICBUaGUgbmFtZSBvZiB0aGUgQXhpc1NlcnZpY2UgaXMgY2hhbmdlZCBmcm9tIHRoZSBzZXJ2aWNlIG5hbWUKLSAgICAgKiB0byB0aGUgcG9ydCBuYW1lLCBzaW5jZSBwb3J0IG5hbWVzIGFyZSB1bmlxdWUgdG8gdGhlIHdzZGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBjb250YWluaW5nIG9uZSBBeGlzU2VydmljZSBvYmplY3QgZm9yIGVhY2ggcG9ydCBpbiB0aGUgd3NkbCBmaWxlLgotICAgICAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEF4aXNTZXJ2aWNlIGlzIG1vZGlmaWVkIGZyb20gdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgcG9ydCBuYW1lLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8QXhpc1NlcnZpY2U+IHBvcHVsYXRlQWxsU2VydmljZXMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW50cnk6IHBvcHVsYXRlQWxsU2VydmljZXMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0dXAoKTsgIC8vIHNldHVwIGNvbnRhaW5zIGNvZGUgd2l0aCBnYXRoZXJzIG5vbi1zZXJ2aWNlIHNwZWNpZmljIGluZm8KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIFdTREwuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlIHBlciBXU0RMLgotICAgICAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IHBvcHVsYXRlQWxsU2VydmljZXMuICB3c2RsIGRlZmluaXRpb24gaXMgbnVsbCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgLy8gY2FuJ3QgZ28gYW55IGZ1cnRoZXIgd2l0aG91dCB0aGUgd3NkbAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod3NkbDRqRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciB3c2RsU2Vydkl0ZXIgPSB3c2RsNGpEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbDRqRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnNpemUoKSA+IDEpewotICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSB3c2RsVG9zZXJ2aWNlIGJ1aWxkZXIgdG8gZGVjaWRlIHRoZSBwb3J0IHRvIGdlbmVyYXRlIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IAotCi0gICAgICAgICAgICAgICAgd2hpbGUgKHdzZGxTZXJ2SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHdzZGxTZXJ2SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmljZU5hbWUgb24gdGhlIHBhcmVudCB0byBzZXR1cCBjYWxsIHRvIHBvcHVsYXRlU2VydmljZQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAvLyBub3cgdGhhdCBzZXJ2aWNlTmFtZSBhbmQgcG9ydE5hbWUgYXJlIHNldCwgY2FsbCB1cCB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcGFyZW50IGNsYXNzIHRvIHBvcHVsYXRlIHRoaXMgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgcmV0QXhpc1NlcnZpY2UgPSBwb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldEF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlcy5hZGQocmV0QXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwb3J0IG5hbWUgaWYgaXQgaGFkIHNldCB3aGVuIG1vdmluZyB0byBuZXh0IHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gc2VydmljZSB3YXMgbm90IGZvdW5kIGluIHRoZSBXU0RMIGF0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggdGFyZ2V0bmFtZXNwYWNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbDRqRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBwb3B1bGF0ZUFsbFNlcnZpY2VzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlczsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7ICAvLyBqdXN0IHJldGhyb3cgYW55IEF4aXNGYXVsdHMKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygicG9wdWxhdGVBbGxTZXJ2aWNlcyBjYXVnaHQgRXhjZXB0aW9uLiAgQ29udmVydGluZyB0byBBeGlzRmF1bHQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDVkYjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuQWRkcmVzc2luZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsLldTREwxMUFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Qb2xpY3lVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuU09BUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLldTRExEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEySGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgZXh0ZW5kcyBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX1BPUlRfVFlQRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX01FU1NBR0UgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9CSU5ESU5HID0gMzsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkKLSAgICAgICAgICAgIC5nZXRMb2coV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNUcmFjZUVuYWJsZWQgPSBsb2cuaXNUcmFjZUVuYWJsZWQoKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElORyA9ICJCaW5kaW5nIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFID0gIlNlcnZpY2UiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAiUG9ydCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFID0gIlBvcnRUeXBlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1RZUEVfT1BFUkFUSU9OID0gIlBvcnRUeXBlLk9wZXJhdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX09QRVJBVElPTl9JTlBVVCA9ICJQb3J0VHlwZS5PcGVyYXRpb24uSW5wdXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9PUEVSQVRJT05fT1VUUFVUID0gIlBvcnRUeXBlLk9wZXJhdGlvbi5PdXRwdXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfVFlQRV9PUEVSQVRJT05fRkFVTFQgPSAiUG9ydFR5cGUuT3BlcmF0aW9uLkZhdWx0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX09QRVJBVElPTiA9ICJCaW5kaW5nLk9wZXJhdGlvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19PUEVSQVRJT05fSU5QVVQgPSAiQmluZGluZy5PcGVyYXRpb24uSW5wdXQiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfT1BFUkFUSU9OX09VVFBVVCA9ICJCaW5kaW5nLk9wZXJhdGlvbi5PdXRwdXQiOwotCi0gICAgcHJvdGVjdGVkIERlZmluaXRpb24gd3NkbDRqRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyAgICAgd3NkbEJhc2VEb2N1bWVudFVSSSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFdTRExMb2NhdG9yIGN1c3RvbVdTRExSZXNvbHZlcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJQQ19TVFlMRSA9ICJycGMiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVU1FTlRfU1RZTEUgPSAiZG9jdW1lbnQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFRF9VU0UgPSAiZW5jb2RlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBvYmplY3RzLgotICAgICAqIEVhY2ggb2JqZWN0IGluIHRoZSBsaXN0IG1heSByZXF1aXJlIGEgd3JhcHBlZCBzY2hlbWEgZWxlbWVudCBmb3IgCi0gICAgICogdGhlIGlucHV0L291dHB1dCBvciBib3RoLgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCB3cmFwcGFibGVCT0VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIC8vIHVzZWQgdG8ga2VlcCB0aGUgYmluZGluZyB0eXBlIG9mIHRoZSBzZWxlY3RlZCBiaW5kaW5nCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmluZGluZ1R5cGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVEX09VVFBVVE5BTUVfU1VGRklYID0gIlJlc3BvbnNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9ERUNMQVJBVElPTl9QUkVGSVggPSAieG1sbnM6IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwcmVmaXhDb3VudGVyID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUkkgPSAibmFtZXNwYWNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUdFVF9OQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfVFlQRV9TT0FQID0gInNvYXAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfVFlQRV9IVFRQID0gImh0dHAiOwotCi0gICAgLyoqCi0gICAgICoga2VlcCB0cmFjayBvZiB3aGV0aGVyIHNldHVwIGNvZGUgcmVsYXRlZCB0byB0aGUgZW50aXJlIHdzZGwgaXMgY29tcGxldGUuCi0gICAgICogTm90ZSB0aGF0IFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzIHdpbGwgY2FsbCBzZXR1cCBtdWx0aXBsZSB0aW1lcywgc28gdGhpcwotICAgICAqIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBzdWJzZXF1ZW50IGNhbGxzIG5vLW9wcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBDb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBNYXAgc2NoZW1hTWFwID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9XU0RMX1ZFUkJPU0VfTU9ERV9LRVkgPSAiamF2YXgud3NkbC52ZXJib3NlIjsKLQotICAgIC8vIEFzIGJpbmRpbmdzIGFyZSBwcm9jZXNzZWQgYWRkIGl0IHRvIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBkb250IHByb2Nlc3MgdGhlIHNhbWUgYmluZGluZyB0d2ljZQotICAgIHByaXZhdGUgTWFwIHByb2Nlc3NlZEJpbmRpbmdzOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsUG9ydHM7Ci0KLSAgICAvKioKLSAgICAgKiBjb25zdHJ1Y3RvciB0YWtpbmcgaW4gdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIHBvcnQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGluIC0gSW5wdXRTdHJlYW0gZm9yIHRoZSBXU0RMCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gVGhlIHNlcnZpY2UgTmFtZQotICAgICAqIEBwYXJhbSBwb3J0TmFtZSAtIFRoZSBwb3J0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoSW5wdXRTdHJlYW0gaW4sIFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgc3VwZXIoaW4sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkZWYgLSBUaGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gVGhlIHNlcnZpY2UgTmFtZQotICAgICAqIEBwYXJhbSBwb3J0TmFtZSAtIFRoZSBwb3J0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoRGVmaW5pdGlvbiBkZWYsIFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgc3VwZXIobnVsbCwgc2VydmljZU5hbWUpOwotICAgICAgICB0aGlzLndzZGw0akRlZmluaXRpb24gPSBkZWY7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICAgICAgdGhpcy5pc0FsbFBvcnRzID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRlZiAtIFRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBUaGUgc2VydmljZSBOYW1lCi0gICAgICogQHBhcmFtIHBvcnROYW1lIC0gVGhlIHBvcnQgbmFtZQotICAgICAqIEBwYXJhbSBpc0FsbFBvcnRzIC0gYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciB0byBnZW5lcmF0ZSBjb2RlIGZvciBhbGwgcG9ydHMgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKERlZmluaXRpb24gZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQWxsUG9ydHMpIHsKLSAgICAgICAgdGhpcyhkZWYsIHNlcnZpY2VOYW1lLCBwb3J0TmFtZSk7Ci0gICAgICAgIHRoaXMuaXNBbGxQb3J0cyA9IGlzQWxsUG9ydHM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAcGFyYW0gc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihJbnB1dFN0cmVhbSBpbiwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihpbiwgc2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGluCi0gICAgICovCi0gICAgcHVibGljIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIGluKSB7Ci0gICAgICAgIHRoaXMoaW4sIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICogQHNlZSBzZXRDdXN0b21XU0RMUmVzb2x2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21XU0xENEpSZXNvbHZlcihXU0RMTG9jYXRvciBjdXN0b21SZXNvbHZlcikgewotICAgICAgICBzZXRDdXN0b21XU0RMUmVzb2x2ZXIoY3VzdG9tUmVzb2x2ZXIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogc2V0cyBhIGN1c3RvbSBXU0RMIGxvY2F0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdXN0b21SZXNvbHZlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVdTRExSZXNvbHZlcihXU0RMTG9jYXRvciBjdXN0b21SZXNvbHZlcikgewotICAgICAgICB0aGlzLmN1c3RvbVdTRExSZXNvbHZlciA9IGN1c3RvbVJlc29sdmVyOwotICAgICAgICBzZXREb2N1bWVudEJhc2VVcmkodGhpcy5jdXN0b21XU0RMUmVzb2x2ZXIuZ2V0QmFzZVVSSSgpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIFVSSSB0byB0aGUgYmFzZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgICAgKiBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbiBhbmQgYWxsb3dzIHRoZQotICAgICAqIERlZmluaXRpb24gdG8gYmUgcmVsb2FkZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlCi0gICAgICogZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiYXNlVXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVXJpKFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIGlmICh3c2RsNGpEZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGJhc2VVcmkpOwotICAgICAgICB9Ci0gICAgICAgIHdzZGxCYXNlRG9jdW1lbnRVUkkgPSBiYXNlVXJpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFVSSSB0byB0aGUgYmFzZSBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgICAgKiBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbiBhbmQgYWxsb3dzIHRoZQotICAgICAqIERlZmluaXRpb24gdG8gYmUgcmVsb2FkZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlCi0gICAgICogZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVXJpKCkgewotICAgICAgICByZXR1cm4gd3NkbEJhc2VEb2N1bWVudFVSSTsKLSAgICB9Ci0KLQotCi0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMgYSBnaXZlbiBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgcG9wdWxhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXR1cCgpOwotCi0gICAgICAgICAgICAvLyBOT1RFOiBzZXQgdGhlIGF4aXNTZXJ2aWNlIHdpdGggdGhlIFBhcmFtZXRlciBmb3IgdGhlIFdTREwKLSAgICAgICAgICAgIC8vIERlZmluaXRpb24gYWZ0ZXIgdGhlIHJlc3Qgb2YgdGhlIHdvcmsKLQotICAgICAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXR0aW5nIHRhcmdldCBuYW1lIHNwYWNlCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRUYXJnZXROYW1lc3BhY2Uod3NkbDRqRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXROYW1lc3BhY2VNYXAobmV3IE5hbWVzcGFjZU1hcCh3c2RsNGpEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBNYXAgaW1wb3J0c01hcCA9IHdzZGw0akRlZmluaXRpb24uZ2V0SW1wb3J0cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW1wb3J0c01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdChpbXBvcnRzTWFwLmtleVNldCgpKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRJbXBvcnRlZE5hbWVzcGFjZXMoaW1wb3J0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vVE9ETyA6IGZpbmQgdGhlIHNlcnZpY2UgYWxzbyBpbiBpbXBvcnRlZCB3c2RscwotICAgICAgICAgICAgU2VydmljZSB3c2RsNGpTZXJ2aWNlID0gZmluZFNlcnZpY2Uod3NkbDRqRGVmaW5pdGlvbik7Ci0KLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGZpbmRCaW5kaW5nKHdzZGw0akRlZmluaXRpb24sIHdzZGw0alNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBiaW5kaW5nV1NETCA9IGdldFBhcmVudERlZmluaXRpb24od3NkbDRqRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXRRTmFtZSgpLCBDT01QT05FTlRfQklORElORywgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIHBvcnRUeXBlV1NETCA9IGdldFBhcmVudERlZmluaXRpb24oYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpLCBDT01QT05FTlRfUE9SVF9UWVBFLCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gcG9ydFR5cGVXU0RMLmdldFBvcnRUeXBlKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpKTsKLQotCi0gICAgICAgICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRoZXJlIGlzIG5vIHBvcnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIG5ldyBTY2hlbWEgZXh0ZW5zaW9ucyBlbGVtZW50IGZvciB3cmFwcGluZwotICAgICAgICAgICAgLy8gKGlmIGl0cyBwcmVzZW50KQotICAgICAgICAgICAgRWxlbWVudFtdIHNjaGVtYUVsZW1lbnRzID0gZ2VuZXJhdGVXcmFwcGVyU2NoZW1hKHNjaGVtYU1hcCwgYmluZGluZywgcG9ydFR5cGUpOwotCi0gICAgICAgICAgICBwcm9jZXNzVHlwZXMod3NkbDRqRGVmaW5pdGlvbiwgYXhpc1NlcnZpY2UpOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgc2NoZW1hcwotICAgICAgICAgICAgaWYgKHNjaGVtYUVsZW1lbnRzICE9IG51bGwgJiYgc2NoZW1hRWxlbWVudHMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gc2NoZW1hRWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYShnZXRYTUxTY2hlbWEoc2NoZW1hRWxlbWVudCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY29weSB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGNvbnRlbnQgdG8gdGhlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICBFbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50ID0gd3NkbDRqRGVmaW5pdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzU2VydmljZSwgZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotCi0gICAgICAgICAgICBheGlzU2VydmljZS5zZXROYW1lKHdzZGw0alNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBwb3B1bGF0ZUVuZHBvaW50cyhiaW5kaW5nLCBiaW5kaW5nV1NETCx3c2RsNGpTZXJ2aWNlLCBwb3J0VHlwZSwgcG9ydFR5cGVXU0RMKTsKLSAgICAgICAgICAgIHByb2Nlc3NQb2xpY2llc0luRGVmaW50aW9uKHdzZGw0akRlZmluaXRpb24pOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0UG9saWN5SW5jbHVkZSgpLnNldFBvbGljeVJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQotCi0gICAgICAgICAgICAvLyBTZXR0aW5nIHdzZGw0amRlZmludGlvbiB0byB0aGUgYXhpc1NlcnZpY2UgcGFyYW1ldGVyIGluY2x1ZGUgbGlzdCwKLSAgICAgICAgICAgIC8vIHNvIGlmIHNvbWVvbmUgbmVlZHMgdG8gdXNlIHRoZSBkZWZpbml0aW9uIGRpcmVjdGx5LAotICAgICAgICAgICAgLy8gaGUgY2FuIGRvIHRoYXQgYnkgZ2V0dGluZyB0aGUgcGFyYW1ldGVyCi0gICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbERlZmluaXRpb25QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvblBhcmFtZXRlci5zZXROYW1lKFdTRExDb25zdGFudHMuV1NETF80X0pfREVGSU5JVElPTik7Ci0KLSAgICAgICAgICAgIGlmICghKHdzZGw0akRlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjID0gdGhpcy5heGlzQ29uZmlnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcHBlciA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIod3NkbDRqRGVmaW5pdGlvbiwgYWMpOwotICAgICAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uUGFyYW1ldGVyLnNldFZhbHVlKHdyYXBwZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvblBhcmFtZXRlci5zZXRWYWx1ZSh3c2RsNGpEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHdzZGxEZWZpbml0aW9uUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFdzZGxGb3VuZCh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldEN1c3RvbVdzZGwodHJ1ZSk7Ci0KLQotICAgICAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcHJvY2Vzc1R5cGVzKHdzZGxEZWZpbml0aW9uLCBheGlzU2VydmljZSwgbmV3IEhhc2hTZXQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUeXBlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdmlzaXRlZFdTRExzKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHZpc2l0ZWRXU0RMcy5hZGQod3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgICAgICAvLyBwcm9jZXNzIGFsbCB0aGUgdHlwZXMgaW4gYWxsIHRoZSB3c2RscwotICAgICAgICBUeXBlcyB0eXBlcyA9IHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVTKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb2Nlc3MgdGhlIHR5cGVzIGluIG90aGVyIHdzZGxzCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVmVjdG9yIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gbnVsbDsKLSAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgdmFsdWVzID0gKFZlY3RvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHZhbHVlc0l0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgdmFsdWVzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgd3NkbEltcG9ydCA9IChJbXBvcnQpIHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIHR5cGVzIHJlY3VyZXNpdmVpbHQKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGlubmVyRGVmaW5pdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmKCF2aXNpdGVkV1NETHMuY29udGFpbnMoaW5uZXJEZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUeXBlcyhpbm5lckRlZmluaXRpb24sIGF4aXNTZXJ2aWNlLCB2aXNpdGVkV1NETHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGREb2N1bWVudGF0aW9uKEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24sIEVsZW1lbnQgZG9jdW1lbnRhdGlvbkVsZW1lbnQpIHsKLSAgICAgICAgaWYgKChkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsKSAmJiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBOb2RlIGZpcnN0Q2hpbGQgPSBkb2N1bWVudGF0aW9uRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKGZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoZG9jdW1lbnRhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBheGlzRGVzY3JpcHRpb24uc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBiaW5kaW5nCi0gICAgICogQHBhcmFtIHdzZGw0alNlcnZpY2UgbXVzdCBoYXZlIGF0bGVhc2Ugb25lIHBvcnQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZUVuZHBvaW50cyhCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugd3NkbDRqU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gcG9ydFR5cGVXU0RMKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBNYXAgd3NkbDRqUG9ydHMgPSB3c2RsNGpTZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgIFFOYW1lIGJpbmRpbmdOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotCi0gICAgICAgIFBvcnQgcG9ydDsKLSAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9IG51bGw7Ci0KLSAgICAgICAgcHJvY2Vzc2VkQmluZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIHByb2Nlc3MgdGhlIHBvcnQgdHlwZSBmb3IgdGhpcyBiaW5kaW5nCi0gICAgICAgIC8vIGFsdGhvdWdoIHdlIHN1cHBvcnQgbXVsdGlwb3J0cyB0aGV5IG11c3QgYmUgYmVsb25ncyB0byBzYW1lIHBvcnQgdHlwZSBhbmQgc2hvdWxkIGhhdmUgdGhlCi0gICAgICAgIC8vIHNhbWUgc29hcCBzdHlsZQotICAgICAgICBwb3B1bGF0ZVBvcnRUeXBlKHBvcnRUeXBlLCBwb3J0VHlwZVdTREwpOwotCi0gICAgICAgIEJpbmRpbmcgY3VycmVudEJpbmRpbmc7Ci0gICAgICAgIERlZmluaXRpb24gY3VycmVudEJpbmRpbmdXU0RMID0gbnVsbDsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbDRqUG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBoYXMgcGlja2VkIGEgcG9ydCB0aGVuIHdlIGhhdmUgdG8gcHJvY2VzcyBvbmx5IHRoYXQgcG9ydAotICAgICAgICAgICAgaWYgKCh0aGlzLnBvcnROYW1lID09IG51bGwpIHx8ICh0aGlzLnBvcnROYW1lLmVxdWFscyhwb3J0LmdldE5hbWUoKSkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyB0aGUgcG9ydCBvbmx5IGlmIGl0IGhhcyB0aGUgc2FtZSBwb3J0IHR5cGUgYXMgdGhlIHNlbGVjdGVkIGJpbmRpbmcKLSAgICAgICAgICAgICAgICBjdXJyZW50QmluZGluZ1dTREwgPSBnZXRQYXJlbnREZWZpbml0aW9uKHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLCBDT01QT05FTlRfQklORElORywgbmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmcgPSBjdXJyZW50QmluZGluZ1dTREwuZ2V0QmluZGluZyhwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmluZGluZy5nZXRQb3J0VHlwZSgpLmdldFFOYW1lKCkuZXF1YWxzKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQgPSBuZXcgQXhpc0VuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNFbmRwb2ludC5zZXROYW1lKHBvcnQuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnROYW1lKCkgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdOYW1lLmVxdWFscyhwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVFbmRwb2ludChheGlzRW5kcG9pbnQsIHBvcnQsIGN1cnJlbnRCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nV1NETCwgcG9ydFR5cGUsIHBvcnRUeXBlV1NETCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoYXhpc0VuZHBvaW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5zZXRCaW5kaW5nTmFtZShheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUVuZHBvaW50KGF4aXNFbmRwb2ludCwgcG9ydCwgY3VycmVudEJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdXU0RMLCBwb3J0VHlwZSwgcG9ydFR5cGVXU0RMLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBheGlzRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkRW5kcG9pbnQocG9ydC5nZXROYW1lKCksIGF4aXNFbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0dGluZyBtZXNzYWdlIHFuYW1lIGlzIGEgYmluZGluZyBkZXBlbmRlbnQgcHJvY2VzcyBmb3IgYW4gZXhhbXBsZSBtZXNzYWdlIGVsZW1lbnQgZGVwZW5kcyBvbiB0aGUKLSAgICAgKiBzb2FwIHN0eWxlIChycGMgb3IgZG9jdW1lbnQpIGFuZCBwYXJ0cyBlbGVtZW1ldCBvZiB0aGUgc29hcCBib2R5Ci0gICAgICogT24gdGhlIG90aGVyaGFuZCB3ZSBrZWVwIG9ubHkgb25lIHNldCBvZiBheGlzIG9wZXJhdGlvbnMgYmVsb25ncyB0byBhIHNlbGVjdGVkIHBvcnQgdHlwZSBpbiBheGlzIHNlcnZpY2UKLSAgICAgKiBTbyBzZXR0aW5nIHFuYW1lIHJlZmV0ZW5jZXMgZG9uZSBvbmx5IHdpdGggdGhlIHNlbGVjdGVkIGJpbmRpbmcgcHJvY2Vzc2luZwotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNFbmRwb2ludAotICAgICAqIEBwYXJhbSB3c2RsNGpQb3J0Ci0gICAgICogQHBhcmFtIGlzU2V0TWVzc2FnZVFOYW1lcwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRW5kcG9pbnQoQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHdzZGw0alBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZyB3c2RsNGpCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBwb3J0VHlwZVdTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NldE1lc3NhZ2VRTmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHdzZGw0alBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0VuZHBvaW50LCBCSU5ESU5HKTsKLSAgICAgICAgcHJvY2Vzc0VtYmVkZGVkRVBSKHdzZGw0alBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGF4aXNFbmRwb2ludCk7Ci0gICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0VuZHBvaW50LCB3c2RsNGpQb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICBpZiAocHJvY2Vzc2VkQmluZGluZ3MuY29udGFpbnNLZXkod3NkbDRqQmluZGluZy5nZXRRTmFtZSgpKSkgewotICAgICAgICAgICAgYXhpc0VuZHBvaW50LnNldEJpbmRpbmcoCi0gICAgICAgICAgICAgICAgICAgIChBeGlzQmluZGluZykgcHJvY2Vzc2VkQmluZGluZ3MuZ2V0KHdzZGw0akJpbmRpbmcuZ2V0UU5hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldE5hbWUod3NkbDRqQmluZGluZy5nZXRRTmFtZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFBhcmVudChheGlzRW5kcG9pbnQpOwotICAgICAgICAgICAgYXhpc0VuZHBvaW50LnNldEJpbmRpbmcoYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UGFyZW50KGF4aXNFbmRwb2ludCk7Ci0gICAgICAgICAgICBwb3B1bGF0ZUJpbmRpbmcoYXhpc0JpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIHdzZGw0akJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdXU0RMLAotICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVXU0RMLAotICAgICAgICAgICAgICAgICAgICBpc1NldE1lc3NhZ2VRTmFtZXMpOwotICAgICAgICAgICAgcHJvY2Vzc2VkQmluZGluZ3MucHV0KHdzZGw0akJpbmRpbmcuZ2V0UU5hbWUoKSwgYXhpc0JpbmRpbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbWJlZGRlZEVQUihMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgewotICAgIAlJdGVyYXRvciBlZWx0cyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIAl3aGlsZShlZWx0cy5oYXNOZXh0KCkpewotICAgIAkJRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWVsdHMubmV4dCgpOwotICAgIAkJaWYoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfRU5EUE9JTlRfUkVGRVJFTkNFLmVxdWFscyhlZS5nZXRFbGVtZW50VHlwZSgpKSl7Ci0gICAgCQkJdHJ5IHsKLSAgICAJCQkJRWxlbWVudCBlbHQgPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCllZSkuZ2V0RWxlbWVudCgpOwotICAgIAkJCQlPTUVsZW1lbnQgZXByT01FbGVtZW50ID0gWE1MVXRpbHMudG9PTShlbHQpOwotICAgIAkJCQlFbmRwb2ludFJlZmVyZW5jZSBlcHIgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZXByT01FbGVtZW50KTsKLSAgICAJCQkJTWFwIHJlZmVyZW5jZVBhcmFtZXRlcnMgPSBlcHIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgIAkJCQlpZihyZWZlcmVuY2VQYXJhbWV0ZXJzICE9IG51bGwpewotICAgIAkJCQkJYXhpc0VuZHBvaW50LmFkZFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLlJFRkVSRU5DRV9QQVJBTUVURVJfUEFSQU1FVEVSLCBuZXcgQXJyYXlMaXN0KHJlZmVyZW5jZVBhcmFtZXRlcnMudmFsdWVzKCkpKTsKLSAgICAJCQkJfQotICAgIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAJCQkJCWxvZy5kZWJ1ZygiRXhjZXB0aW9uIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZW1iZWRkZWQgd3NhOkVuZHBvaW50UmVmZXJlbmNlIiwgZSk7Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVQb3J0VHlwZShQb3J0VHlwZSB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHBvcnRUeXBlV1NETCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCWNvcHlFeHRlbnNpb25BdHRyaWJ1dGVzKHdzZGw0alBvcnRUeXBlLmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKSwKLQkJCQlheGlzU2VydmljZSwgUE9SVF9UWVBFKTsKLSAgICAgICAgTGlzdCB3c2RsNGpPcGVyYXRpb25zID0gd3NkbDRqUG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotCi0gICAgICAgIC8vIEFkZGVkIHRvIHVzZSBpbiA/d3NkbDIgYXMgdGhlIGludGVyZmFjZSBuYW1lCi0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpQb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIGlmICh3c2RsNGpPcGVyYXRpb25zLnNpemUoKSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIk5vIG9wZXJhdGlvbiBmb3VuZCBpbiB0aGUgcG9ydFR5cGUgZWxlbWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgICAgICBMaXN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIFFOYW1lIG9wTmFtZTsKLSAgICAgICAgT3BlcmF0aW9uIHdzZGw0ak9wZXJhdGlvbjsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbDRqT3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBwb3B1bGF0ZU9wZXJhdGlvbnMod3NkbDRqT3BlcmF0aW9uLCB3c2RsNGpQb3J0VHlwZSwgcG9ydFR5cGVXU0RMKTsKLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc09wZXJhdGlvbiwgd3NkbDRqT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRQYXJlbnQoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkQ2hpbGQoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lcy5hZGQoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhpcyBpcyB1c2VkIG9ubHkgaW4gY29kZWdlbiB0byBwcmVzZXJ2ZSBvcGVyYXRpb24gb3JkZXIKLSAgICAgICAgaWYgKGlzQ29kZWdlbikgewotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0T3BlcmF0aW9uc05hbWVMaXN0KG9wZXJhdGlvbk5hbWVzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQmluZGluZyhBeGlzQmluZGluZyBheGlzQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmcgd3NkbDRqQmluZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gYmluZGluZ1dTREwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gcG9ydFR5cGVXU0RMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NldE1lc3NhZ2VRTmFtZXMpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHdzZGw0akJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGJpbmRpbmdXU0RMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLCBCSU5ESU5HKTsKLQotICAgICAgICBMaXN0IHdzZGw0akJpZGluZ09wZXJhdGlvbnMgPSB3c2RsNGpCaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgaWYgKHdzZGw0akJpZGluZ09wZXJhdGlvbnMuc2l6ZSgpIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gb3BlcmF0aW9uIGZvdW5kIGZvciB0aGUgYmluZGluZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZywgd3NkbDRqQmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb247Ci0gICAgICAgIE9wZXJhdGlvbiB3c2RsNGpPcGVyYXRpb247Ci0KLSAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb247Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gd3NkbDRqQmluZGluZ09wZXJhdGlvbjsKLQotICAgICAgICBNYXAgaHR0cExvY2F0aW9uTWFwID0gbmV3IFRyZWVNYXAoKTsKLSAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdzZGw0akJpZGluZ09wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbiA9IG5ldyBBeGlzQmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICAgICAgd3NkbDRqQmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uKHBvcnRUeXBlLCB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShuZXcgUU5hbWUoYmluZGluZ1dTREwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHdzZGw0akJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nT3BlcmF0aW9uLCB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCi0gICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShwb3J0VHlwZVdTREwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHdzZGw0ak9wZXJhdGlvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIG9mIHRoZSB3c2RsNGpCaW5kaW5nCi0gICAgICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHdzZGw0akJpbmRpbmdPcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24sIGF4aXNCaW5kaW5nT3BlcmF0aW9uLCBCSU5ESU5HX09QRVJBVElPTik7Ci0KLSAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04pOwotICAgICAgICAgICAgU3RyaW5nIGh0dHBNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCk7Ci0gICAgICAgICAgICBpZiAoaHR0cE1ldGhvZCA9PSBudWxsIHx8ICIiLmVxdWFscyhodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgICAgIGh0dHBNZXRob2QgPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QT1NUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGh0dHBMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaHR0cExvY2F0aW9uTWFwLnB1dChXU0RMVXRpbC5nZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uLCBodHRwTWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJpbmRpbmdJbnB1dCB3c2RsNGpCaW5kaW5nSW5wdXQgPSB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotCi0gICAgICAgICAgICBpZiAod3NkbDRqQmluZGluZ0lucHV0ICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBXU0RMVXRpbC5pc0lucHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdJbk1lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZ0luTWVzc2FnZSwgd3NkbDRqQmluZGluZ0lucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGNvcHlFeHRlbnNpYmxlRWxlbWVudHMod3NkbDRqQmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nSW5NZXNzYWdlLCBCSU5ESU5HX09QRVJBVElPTl9JTlBVVCk7Ci0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzSW5NZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIC8vVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IEFYSVMyLTI3NzEgd29ya2luZyAsIEkgaGFkIHRvIGNvcHkgc29hcCBoZWFkZXJzCi0gICAgICAgICAgICAgICAgLy8gIGZyb20gYmluZGluZyBtZXNzYWdlIHRvIEF4aXNNZXNzYWdlCi0gICAgICAgICAgICAgICAgTGlzdCBzb2FwSGVhZGVycyA9IChMaXN0KSBheGlzQmluZGluZ0luTWVzc2FnZS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvYXBIZWFkZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBoZWFkZXJNZXNzYWdlID0gKFNPQVBIZWFkZXJNZXNzYWdlKSBzb2FwSGVhZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzSW5NZXNzYWdlLmFkZFNvYXBIZWFkZXIoaGVhZGVyTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNTZXRNZXNzYWdlUU5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBib2UgPSBmaW5kKHdyYXBwYWJsZUJPRXMsIHdzZGw0akJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JhcHBlZCA9IChib2UgPT0gbnVsbCkgPyBmYWxzZSA6IGJvZS5pc1dyYXBwZWRJbnB1dCgpOwotICAgICAgICAgICAgICAgICAgICBheGlzSW5NZXNzYWdlLnNldFdyYXBwZWQoaXNXcmFwcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUU5hbWVSZWZlcmVuY2UoYXhpc0luTWVzc2FnZSwgd3NkbDRqT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpCaW5kaW5nSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc0luTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0TmFtZShheGlzSW5NZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0RGlyZWN0aW9uKGF4aXNJbk1lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdJbk1lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSwgYXhpc0JpbmRpbmdJbk1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaW5kaW5nT3V0cHV0IHdzZGw0akJpbmRpbmdPdXRwdXQgPSB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAgICAgaWYgKHdzZGw0akJpbmRpbmdPdXRwdXQgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIFdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYXhpc0JpbmRpbmdPdXRNZXNzYWdlID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdPdXRNZXNzYWdlLCB3c2RsNGpCaW5kaW5nT3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNPdXRNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLQotICAgICAgICAgICAgICAgIGNvcHlFeHRlbnNpYmxlRWxlbWVudHMod3NkbDRqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ091dE1lc3NhZ2UsIEJJTkRJTkdfT1BFUkFUSU9OX09VVFBVVCk7Ci0KLSAgICAgICAgICAgICAgICAvL1RoaXMgaXMgYSBoYWNrIHRvIGdldCBBWElTMi0yNzcxIHdvcmtpbmcgLCBJIGhhZCB0byBjb3B5IHNvYXAgaGVhZGVycwotICAgICAgICAgICAgICAgIC8vICBmcm9tIGJpbmRpbmcgbWVzc2FnZSB0byBBeGlzTWVzc2FnZQotICAgICAgICAgICAgICAgIExpc3Qgc29hcEhlYWRlcnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpIGF4aXNCaW5kaW5nT3V0TWVzc2FnZS5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0hFQURFUik7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwSGVhZGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyTWVzc2FnZSA9IChTT0FQSGVhZGVyTWVzc2FnZSkgc29hcEhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc091dE1lc3NhZ2UuYWRkU29hcEhlYWRlcihoZWFkZXJNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1NldE1lc3NhZ2VRTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkVudHJ5IGJvZSA9IGZpbmQod3JhcHBhYmxlQk9Fcywgd3NkbDRqQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNXcmFwcGVkID0gKGJvZSA9PSBudWxsKSA/IGZhbHNlIDogYm9lLmlzV3JhcHBlZE91dHB1dCgpOwotICAgICAgICAgICAgICAgICAgICBheGlzT3V0TWVzc2FnZS5zZXRXcmFwcGVkKGlzV3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFFOYW1lUmVmZXJlbmNlKGF4aXNPdXRNZXNzYWdlLCB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akJpbmRpbmdPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV3JhcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ091dE1lc3NhZ2Uuc2V0QXhpc01lc3NhZ2UoYXhpc091dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3V0TWVzc2FnZS5zZXROYW1lKGF4aXNPdXRNZXNzYWdlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPdXRNZXNzYWdlLnNldERpcmVjdGlvbihheGlzT3V0TWVzc2FnZS5nZXREaXJlY3Rpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ091dE1lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUsIGF4aXNCaW5kaW5nT3V0TWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1hcCBiaW5kaW5nRmF1bHRzTWFwID0gd3NkbDRqQmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCk7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgdGhlIGJpbmRpbmcgZmF1bHRzICovCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGJpbmRpbmdGYXVsdHMgPSBiaW5kaW5nRmF1bHRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGJpbmRpbmdGYXVsdHMuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGJpbmRpbmdGYXVsdHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQmluZGluZyBuYW1lIGlzIG51bGwgZm9yIHRoZSBiaW5kaW5nIGZhdWx0IGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmluZGluZyBvcGVyYXRpb24gPT0+ICIgKyB3c2RsNGpCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgRmF1bHQgd3NkbDRqRmF1bHQgPSB3c2RsNGpPcGVyYXRpb24uZ2V0RmF1bHQoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3c2RsNGpGYXVsdCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbiBub3QgZmluZCB0aGUgY29ycmVzcG9uZGluZyBmYXVsdCBlbGVtZW50IGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3NkbCBvcGVyYXRpb24gIiArIHdzZGw0ak9wZXJhdGlvbi5nZXROYW1lKCkgKyAiIGZvciB0aGUgZmF1bHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuYW1lICIgKyBiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2Ugd3NkbDRqRmF1bHRNZXNzZ2UgPSB3c2RsNGpGYXVsdC5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGZhdWx0TWVzc2FnZSA9IGZpbmRGYXVsdE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akZhdWx0TWVzc2dlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRNZXNzYWdlcygpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nRmF1bHRNZXNzYWdlID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZ0ZhdWx0TWVzc2FnZSwgd3NkbDRqRmF1bHRNZXNzZ2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHRNZXNzYWdlLnNldEF4aXNNZXNzYWdlKGZhdWx0TWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0TWVzc2FnZS5zZXROYW1lKGZhdWx0TWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkRmF1bHQoYXhpc0JpbmRpbmdGYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0TWVzc2FnZVFOYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFFOYW1lUmVmZXJlbmNlKGZhdWx0TWVzc2FnZSwgd3NkbDRqRmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UGFyZW50KGF4aXNCaW5kaW5nKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLmFkZENoaWxkKGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkhUVFBfTE9DQVRJT05fVEFCTEUsIGh0dHBMb2NhdGlvbk1hcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udGFpbnMgYWxsIGNvZGUgd2hpY2ggZ2F0aGVycyBub24tc2VydmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotICAgICAqIHdzZGwuIDxwLz4gQWZ0ZXIgYWxsIHRoZSBzZXR1cCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB0aGUgc2V0dXBDb21wbGV0ZQotICAgICAqIGZpZWxkIGlzIHNldCBzbyB0aGF0IGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHNldHVwKCkgd2lsbCByZXN1bHQgaW4gYQotICAgICAqIG5vLW9wLiBOb3RlIHRoYXQgc3ViY2xhc3MgV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyIHdpbGwgY2FsbAotICAgICAqIHBvcHVsYXRlU2VydmljZSBmb3IgZWFjaCBwb3J0IGluIHRoZSBXU0RMLiBTZXBhcmF0aW5nIHRoZSBub24tc2VydmljZQotICAgICAqIHNwZWNpZmljIGluZm9ybWF0aW9uIGhlcmUgYWxsb3dzIFdTREwxMVRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciB0byBvbmx5Ci0gICAgICogZG8gdGhpcyB3b3JrIDEgdGltZSBwZXIgV1NETCwgaW5zdGVhZCBvZiBmb3IgZWFjaCBwb3J0IG9uIGVhY2ggc2VydmljZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbiBpZiByZWFkSW5UaGVXU0RMRmlsZSBmYWlscwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICBpZiAoc2V0dXBDb21wbGV0ZSkgeyAvLyBhbHJlYWR5IHNldHVwLCBqdXN0IGRvIG5vdGhpbmcgYW5kIHJldHVybgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3c2RsNGpEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGw0akRlZmluaXRpb24gPSByZWFkSW5UaGVXU0RMRmlsZShpbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOyAvLyBjYW4ndCBjb250aW51ZSB3aXRob3V0IHdzZGwKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gc2V0dXAgdGhlIHNjaGVtYU1hcAotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHBvcHVsYXRlU2NoZW1hTWFwKHdzZGw0akRlZmluaXRpb24sIG5ldyBIYXNoU2V0KCkpOwotCi0gICAgICAgIHNldFBvbGljeVJlZ2lzdHJ5RnJvbVNlcnZpY2UoYXhpc1NlcnZpY2UpOwotCi0gICAgICAgIHNldHVwQ29tcGxldGUgPSB0cnVlOyAvLyBpZiBhbnkgcGFydCBvZiBzZXR1cCBmYWlscywgZG9uJ3QgbWFyawotICAgICAgICAvLyBzZXR1cENvbXBsZXRlCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSBhIG1hcCBvZiB0YXJnZXROYW1lc3BhY2UgdnMgRE9NIHNjaGVtYSBlbGVtZW50IFRoaXMgaXMgdXNlZCB0bwotICAgICAqIGdyYWIgdGhlIGNvcnJlY3Qgc2NoZW1hIGVsZW1lbnQgd2hlbiBhZGRpbmcgYSBuZXcgZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICAgKi8KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVNjaGVtYU1hcChEZWZpbml0aW9uIGRlZmluaXRpb24sIFNldCB2aXNpdGVkV1NETHMpIHsKLSAgICAgICAgdmlzaXRlZFdTRExzLmFkZChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgICAgLy8gZmlyc3QgcHJvY2VzcyB0aGUgdHlwZXMgaW4gdGhlIGdpdmVuIHdzZGwKLSAgICAgICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgICAgIE9iamVjdCBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgICAgICAgaWYgKHR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNjaGVtYSkgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSAoKFNjaGVtYSkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hTWFwLnB1dChzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZShYU0RfVEFSR0VUTkFNRVNQQUNFKSwgc2NoZW1hRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9wdWFsdGUgdGhlIGltcG9ydHMgYXMgd2VsbAotICAgICAgICBJdGVyYXRvciBpdGVyID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgVmVjdG9yIHZhbHVlcyA9IG51bGw7Ci0gICAgICAgIEltcG9ydCB3c2RsSW1wb3J0ID0gbnVsbDsKLSAgICAgICAgZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgdmFsdWVzID0gKFZlY3RvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIHZhbHVlc0l0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgdmFsdWVzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgd3NkbEltcG9ydCA9IChJbXBvcnQpIHZhbHVlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW5uZXJEZWZpbml0aW9uID0gd3NkbEltcG9ydC5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYoIXZpc2l0ZWRXU0RMcy5jb250YWlucyhpbm5lckRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlU2NoZW1hTWFwKGlubmVyRGVmaW5pdGlvbiwgdmlzaXRlZFdTRExzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHJldHVybiB0aGUgc2VydmljZSB0byBwcm9jZXNzCi0gICAgICogaWYgdXNlciBoYXMgc3BlY2lmaWVkIHdlIGNoZWNrIHdoZXRoZXIgaXQgZXhpc3RzCi0gICAgICogZWxzZSBwaWNrIGEgcmFuZG9tIHNlcnZpY2UgYW5kIHRocm93cyBhbiBleGNlcHRpb24gaWYgbm90IGZvdW5kIGFueSB0aGluZwotICAgICAqCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24KLSAgICAgKiBAcmV0dXJuIHNlcnZpY2UgdG8gcHJvY2VzcwotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0KLSAgICBwcml2YXRlIFNlcnZpY2UgZmluZFNlcnZpY2UoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaS5lIGlmIGEgdXNlciBoYXMgc3BlY2lmaWVkIGEgcGlydGljdWxhciBwb3J0Ci0gICAgICAgICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU2VydmljZSAiICsgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3YXMgbm90IGZvdW5kIGluIHRoZSBXU0RMIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gKFNlcnZpY2UpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZS5nZXRQb3J0cygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaS5lIHdlIGhhdmUgZm91bmQgYSBzZXJ2aWNlIHdpdGggcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoc2VydmljZSA9PSBudWxsKSB8fCAoc2VydmljZS5nZXRQb3J0cygpLnNpemUoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJ0aGVyZSBpcyBubyBzZXJ2aWNlIHdpdGggcG9ydHMgdG8gcGljayIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBzZXJ2aWNlIHdhcyBub3QgZm91bmQgaW4gdGhlIFdTREwgYXQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCB0YXJnZXRuYW1lc3BhY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb29rIGZvciB0aGUgcmVsZXZhbnQgYmluZGluZyEKLSAgICAgKiBpZiB1c2VyIGhhcyBzcGNpZmVkIGEgcG9ydCBnZXQgaXQKLSAgICAgKiBvdGhlcndpc2UgZmluZCBmaXJzdCBzb2FwIHBvcnQgb3IgcGljayByYW5kb20gb25lIGlmIHRoZXJlIGlzIG5vIHNvYXAgcG9ydAotICAgICAqCi0gICAgICogQHBhcmFtIGRpZgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgY2FuIG5vdCBiZSBudWxsCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIEJpbmRpbmcgZmluZEJpbmRpbmcoRGVmaW5pdGlvbiBkaWYsIFNlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICAgICAgUG9ydCBwb3J0ID0gbnVsbDsKLSAgICAgICAgY29weUV4dGVuc2libGVFbGVtZW50cyhzZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCBkaWYsIGF4aXNTZXJ2aWNlLCBTRVJWSUNFKTsKLSAgICAgICAgaWYgKHBvcnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGkuZSBpZiB1c2VyIGhhcyBzcGVjaWZpZWQgYSBzZXJ2aWNlCi0gICAgICAgICAgICBwb3J0ID0gc2VydmljZS5nZXRQb3J0KHBvcnROYW1lKTsKLSAgICAgICAgICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyBwb3J0IGZvdW5kIGZvciB0aGUgZ2l2ZW4gbmFtZSA6IiArIHBvcnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgIGlmIChwb3J0cyAhPSBudWxsICYmIHBvcnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBwaWNrIHRoZSBwb3J0IHdpdGggdGhlIFNPQVAgYWRkcmVzcyBhcyB0aGUgZGVmYXVsdCBwb3J0Ci0gICAgICAgICAgICAgICAgcG9ydCA9IGZpbmRQb3J0KHBvcnRzKTsKLSAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGEgU09BUCBwb3J0IHdhcyBub3QgZm91bmQgLSBsb2cgYSB3YXJuaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB1c2UgdGhlIGZpcnN0IHBvcnQgaW4gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkEgU09BUCBwb3J0IHdhcyBub3QgZm91bmQgLSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBpY2tpbmcgYSByYW5kb20gcG9ydCEiKTsKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBwb3J0cy52YWx1ZXMoKS50b0FycmF5KClbMF07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgd2UgaGF2ZSBmaW5kIGEgY29ycmVjdCBwb3J0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgb25seSB1c2UgZnVsbCBpbiBjb2RlZ2VuIHRpbWUuCi0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29kZWdlbiAmJiAhdGhpcy5pc0FsbFBvcnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIGhhcyBub3Qgc2V0IGFsbCBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZ2VuZXJhdGUgY29kZSBvbmx5IGZvciB0aGF0IG9wdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGRpZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UsIFBPUlQpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBwYXJlbnREZWZpbml0aW9uID0gZ2V0UGFyZW50RGVmaW5pdGlvbihkaWYsCi0gICAgICAgICAgICAgICAgICAgIHBvcnQuZ2V0QmluZGluZygpLmdldFFOYW1lKCksIENPTVBPTkVOVF9CSU5ESU5HLCBuZXcgSGFzaFNldCgpKTsKLSAgICAgICAgICAgIGJpbmRpbmcgPSBwYXJlbnREZWZpbml0aW9uLmdldEJpbmRpbmcocG9ydC5nZXRCaW5kaW5nKCkuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBTT0FQIHBvcnQgZ2l2ZW4gdGhlIHBvcnQgbWFwCi0gICAgICovCi0gICAgcHJpdmF0ZSBQb3J0IGZpbmRQb3J0KE1hcCBwb3J0cykgewotICAgICAgICBQb3J0IHBvcnQ7Ci0gICAgICAgIFBvcnQgcmV0dXJuUG9ydCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgcG9ydHNJdGVyYXRvciA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHBvcnRzSXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBwb3J0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGV4dEVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMiBhZGRyZXNzIGZvdW5kIC0ga2VlcCB0aGlzIGFuZCBsb29wIHVudGlsIGh0dHAgYWRkcmVzcyBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZXR1cm5Qb3J0ID0gcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChTT0FQMTJBZGRyZXNzKWV4dEVsZW1lbnQpLmdldExvY2F0aW9uVVJJKCkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGxvY2F0aW9uICE9IG51bGwpICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgoImh0dHA6IikpewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHdlIGhhdmUgZm91bmQgYW4gaHR0cCBwb3J0IHNvIHJldHVybiBmcm9tIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuUG9ydCAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiByZXR1cm5Qb3J0OwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBwb3J0c0l0ZXJhdG9yID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgcG9ydHNJdGVyYXRvcgotICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwb3J0ID0gKFBvcnQpIHBvcnRzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpYmlsaXR5RWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZXh0RWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQIDEuMSBhZGRyZXNzIGZvdW5kIC0ga2VlcCB0aGlzIGFuZCBsb29wIHVudGlsIGh0dHAgYWRkcmVzcyBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZXR1cm5Qb3J0ID0gcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChTT0FQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiAhPSBudWxsKSAmJiBsb2NhdGlvbi5zdGFydHNXaXRoKCJodHRwOiIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB3ZSBoYXZlIGZvdW5kIGFuIGh0dHAgcG9ydCBzbyByZXR1cm4gZnJvbSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblBvcnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gcmV0dXJuUG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgcG9ydHNJdGVyYXRvciA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHBvcnRzSXRlcmF0b3IKLSAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9ydCA9IChQb3J0KSBwb3J0c0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGV4dEVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSFRUUCBhZGRyZXNzIGZvdW5kIC0ga2VlcCB0aGlzIGFuZCBsb29wIHVudGlsIGh0dHAgYWRkcmVzcyBpcyBmb3VuZAotICAgICAgICAgICAgICAgICAgICByZXR1cm5Qb3J0ID0gcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gKChIVFRQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiAhPSBudWxsKSAmJiBsb2NhdGlvbi5zdGFydHNXaXRoKCJodHRwOiIpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB3ZSBoYXZlIGZvdW5kIGFuIGh0dHAgcG9ydCBzbyByZXR1cm4gZnJvbSBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Qb3J0OwotICAgIH0KLQotICAgIHByaXZhdGUgT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIHdzZGw0akJpbmRpbmdPcGVyYXRpb24pIHsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gd3NkbDRqQmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIGlucHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3AuZ2V0SW5wdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnB1dCA9IG9wLmdldElucHV0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCI6bm9uZSIuZXF1YWxzKGlucHV0KSkgewotICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3AuZ2V0T3V0cHV0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0cHV0ID0gb3AuZ2V0T3V0cHV0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCI6bm9uZSIuZXF1YWxzKG91dHB1dCkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE9wZXJhdGlvbiBvcDIgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb24ob3AuZ2V0TmFtZSgpLCBpbnB1dCwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuICgob3AyID09IG51bGwpID8gb3AgOiBvcDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIGZhdWx0IG1lc3NhZ2UgcmVsZXZhbnQgdG8gYSBnaXZlbiBuYW1lIGZyb20gdGhlIGZhdWx0IG1lc3NhZ2UKLSAgICAgKiBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzTWVzc2FnZSBmaW5kRmF1bHRNZXNzYWdlKFN0cmluZyBuYW1lLCBBcnJheUxpc3QgZmF1bHRNZXNzYWdlcykgewotICAgICAgICBBeGlzTWVzc2FnZSB0ZW1wTWVzc2FnZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdE1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICB0ZW1wTWVzc2FnZSA9IChBeGlzTWVzc2FnZSkgZmF1bHRNZXNzYWdlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHModGVtcE1lc3NhZ2UuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wTWVzc2FnZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgUU5hbWUgZm9yIHRoZSBiaW5kaW5nIGlucHV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5NZXNzYWdlCi0gICAgICogQHBhcmFtIHdzZGw0ak9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBiaW5kaW5nSW5wdXQKLSAgICAgKiBAcGFyYW0gaXNXcmFwcGVkICAgICAgIC0gYmFzaWNhbGx5IHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBpcyBzb2FwL3JwYyBvciBub3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUU5hbWVSZWZlcmVuY2UoQXhpc01lc3NhZ2UgaW5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gd3NkbDRqT3BlcmF0aW9uLCBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JhcHBlZCkgewotCi0gICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBNZXNzYWdlIHdzZGw0ak1lc3NhZ2UgPSB3c2RsNGpPcGVyYXRpb24uZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgYWRkUU5hbWVSZWZlcmVuY2UoaW5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlzV3JhcHBlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIFFOYW1lIGZvciB0aGUgYmluZGluZyBvdXRwdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXRNZXNzYWdlCi0gICAgICogQHBhcmFtIHdzZGw0ak9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBpc1dyYXBwZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUU5hbWVSZWZlcmVuY2UoQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIHdzZGw0ak9wZXJhdGlvbiwgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzV3JhcHBlZCkgewotCi0gICAgICAgIGlmIChiaW5kaW5nT3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmICh3c2RsNGpPcGVyYXRpb24uZ2V0T3V0cHV0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lc3NhZ2Ugd3NkbDRqTWVzc2FnZSA9IHdzZGw0ak9wZXJhdGlvbi5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGFkZFFOYW1lUmVmZXJlbmNlKG91dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dyYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLmdldE5hbWUoKSArIFdSQVBQRURfT1VUUFVUTkFNRV9TVUZGSVgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFFOYW1lUmVmZXJlbmNlKEF4aXNNZXNzYWdlIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNXcmFwcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSB3c2RsNGpNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcnBjT3BlcmF0aW9uTmFtZSkgewotICAgICAgICBpZiAoaXNXcmFwcGVkKSB7Ci0gICAgICAgICAgICAvLyB3ZSBoYXZlIGFscmVhZHkgdmFsaWRhdGVkIGFuZCBwcm9jZXNzIHRoZSBxbmFtZSByZWZlcmVuY2VzCi0gICAgICAgICAgICAvLyBzbyBzZXQgaXQgaGVyZQotICAgICAgICAgICAgLy8gVGhlIHNjaGVtYSBmb3IgdGhpcyBzaG91bGQgYmUgYWxyZWFkeSBtYWRlICEgRmluZCB0aGUKLSAgICAgICAgICAgIC8vIFFOYW1lIGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBsaXN0IGFuZCBhZGQgaXQgLSB0aGUgbmFtZSBmb3IgdGhpcyBpcyBqdXN0IHRoZQotICAgICAgICAgICAgbWVzc2FnZS5zZXRFbGVtZW50UU5hbWUoKFFOYW1lKSByZXNvbHZlZFJwY1dyYXBwZWRFbGVtZW50TWFwCi0gICAgICAgICAgICAgICAgICAgIC5nZXQocnBjT3BlcmF0aW9uTmFtZSkpOwotICAgICAgICAgICAgbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKAotICAgICAgICAgICAgICAgICAgICAoUU5hbWUpIHJlc29sdmVkUnBjV3JhcHBlZEVsZW1lbnRNYXAuZ2V0KHJwY09wZXJhdGlvbk5hbWUpLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBub3cgd2UgYXJlIHN1cmUgdGhpcyBpcyBhbiBkb2N1bWVudCBsaXRlcmFsIHR5cGUgZWxlbWVudAotICAgICAgICAgICAgTGlzdCBiaW5kaW5nUGFydHNMaXN0ID0gZ2V0UGFydHNMaXN0RnJvbVNvYXBCb2R5KGV4dGVuc2liaWxpdHlFbGVtZW50cyk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ1BhcnRzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHVzZXIgaGFzIG5vdCBnaXZlbiBhbnkgcGFydCBsaXN0IHNvIHdlIGdvIHRvIG1lc3NhZ2UgYW5kIHBpY2sgdGhlIGZpcmVzdCBwYXJ0IGlmCi0gICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgaWYgKCh3c2RsNGpNZXNzYWdlLmdldFBhcnRzKCkgIT0gbnVsbCkgJiYgKHdzZGw0ak1lc3NhZ2UuZ2V0UGFydHMoKS5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAod3NkbDRqTWVzc2FnZS5nZXRQYXJ0cygpLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgd3NkbDRqTWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSBwYXJ0LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKGVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldE1lc3NhZ2VQYXJ0TmFtZShwYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBtZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gb3BlcmF0aW9uLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKGVsZW1lbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZWxlbWVudCB0eXBlIGlzIGRlZmluZWQgZm9yIG1lc3NhZ2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlciBoYXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmUgcGFydHMgd2l0aCBvdXQgc3BlY2lmaW5nIGEgcGFydCBpbgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29hcCBib2R5Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oIk1vcmUgdGhhbiBvbmUgcGFydCBmb3IgbWVzc2FnZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbGxvd2VkIGluIHRoZSBzcGVjIGluIHRoaXMgY2FzZSBlbGVtZW50IHFuYW1lIGlzIG51bGwgYW5kIG5vdGhpbmcgaXMgc2VuZAotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgc29hcCBib2R5Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdQYXJ0c0xpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9ub3QgaGF2ZSB0byBzZXQgdGhlIGVsZW1lbnQgcW5hbWUKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRFbGVtZW50UU5hbWUobnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiaW5kaW5nUGFydHNMaXN0LnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcnQgcGFydCA9IHdzZGw0ak1lc3NhZ2UuZ2V0UGFydCgoU3RyaW5nKSBiaW5kaW5nUGFydHNMaXN0LmdldCgwKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gcGFydC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEVsZW1lbnRRTmFtZShlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRNZXNzYWdlUGFydE5hbWUocGFydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gbWVzc2FnZS5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG9wZXJhdGlvbi5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhlbGVtZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGVsZW1lbnQgdHlwZSBpcyBkZWZpbmVkIGZvciBtZXNzYWdlIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKCJNaXNzaW5nIHBhcnQgbmFtZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmluZGluZ1BhcnRzTGlzdC5nZXQoMCkgKyAiICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgbW9yZSB0aGFuIG9uZSBwYXJ0IHNwZWNpZmllZCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAvLyB0byBzZW5kIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcmUgdGhhbiBvbmUgZWxlbWVudCBwYXJ0IGlzIG5vdCBhbGx3ZWQgaW4gZG9jdW1lbnQgbGl0ZXJhbCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHR5cGUgYmluZGluZyBvcGVyYXRpb24gIiArIHdzZGw0ak9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIFFOYW1lIGZvciB0aGUgYmluZGluZyBvdXRwdXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUU5hbWVSZWZlcmVuY2UoQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIHdzZGw0ak1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIC8vIGZvciBhIGZhdWx0IHRoaXMgaXMgdHJpdmlhbCAtIEFsbCBmYXVsdHMgYXJlIHJlbGF0ZWQgZGlyZWN0bHkgdG8gYQotICAgICAgICAvLyBtZXNzYWdlIGJ5IHRoZSBuYW1lIGFuZCBhcmUgc3VwcG9zZWQgdG8gaGF2ZSBhIHNpbmdsZSBwYXJ0LiBTbyBpdCBpcwotICAgICAgICAvLyBhIG1hdHRlciBvZiBjb3B5aW5nIHRoZSByaWdodCBRTmFtZSBmcm9tIHRoZSBtZXNzYWdlIHBhcnQKLQotICAgICAgICAvLyBnZXQgdGhlIHBhcnQKLSAgICAgICAgTWFwIHBhcnRzID0gd3NkbDRqTWVzc2FnZS5nZXRQYXJ0cygpOwotICAgICAgICBpZiAocGFydHMgPT0gbnVsbCB8fCBwYXJ0cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhlcmUgYXJlIG5vIHBhcnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZhdWx0IG1lc3NhZ2UgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbDRqTWVzc2FnZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgbG9nLmVycm9yKG1lc3NhZ2UpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIFBhcnQgd3NkbDRqTWVzc2FnZVBhcnQgPSAoUGFydCkgcGFydHMudmFsdWVzKCkKLSAgICAgICAgICAgICAgICAudG9BcnJheSgpWzBdOwotICAgICAgICBpZiAod3NkbDRqTWVzc2FnZVBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgbmFtZSA9IHdzZGw0ak1lc3NhZ2VQYXJ0LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlBhcnQgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB3c2RsNGpNZXNzYWdlUGFydC5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBvZiBmYXVsdCBtZXNzYWdlICciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbDRqTWVzc2FnZS5nZXRRTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgbXVzdCBiZSBkZWZpbmVkIHdpdGggJ2VsZW1lbnQ9UU5hbWUnIGFuZCBub3QgJ3R5cGU9UU5hbWUnIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtZXNzYWdlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0TWVzc2FnZVBhcnROYW1lKHdzZGw0ak1lc3NhZ2VQYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgIGZhdWx0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSB1dGlsIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIFNPQVAgc3R5bGUgaW5jbHVkZWQgaW4gdGhlIGJpbmRpbmcKLSAgICAgKiBvcGVyYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBiaW5kaW5nT3AKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTT0FQU3R5bGUoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3ApIHsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBiaW5kaW5nT3AuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgZXh0RWxlbWVudCA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTT0FQT3BlcmF0aW9uKSBleHRFbGVtZW50KS5nZXRTdHlsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUDEyT3BlcmF0aW9uKSBleHRFbGVtZW50KS5nZXRTdHlsZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSB0aGUgY29tcG9uZW50IGZyb20gdGhlIG9wZXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGw0ak9wZXJhdGlvbgotICAgICAqIEBwYXJhbSBkaWYKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBwb3B1bGF0ZU9wZXJhdGlvbnMoT3BlcmF0aW9uIHdzZGw0ak9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcnRUeXBlIHdzZGw0alBvcnRUeXBlLCBEZWZpbml0aW9uIGRpZikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBRTmFtZSBvcE5hbWUgPSBuZXcgUU5hbWUoZGlmLmdldFRhcmdldE5hbWVzcGFjZSgpLCB3c2RsNGpPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgLy8gQ29weSBOYW1lIEF0dHJpYnV0ZQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BOYW1lKTsKLSAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIE1FUCA9IGdldE1FUCh3c2RsNGpPcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKE1FUCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldE5hbWUob3BOYW1lKTsKLQotICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgUG9saWN5SW5jbHVkZSBwcm9wZXJ0eSBvZiB0aGUgQXhpc09wZXJhdGlvbgotICAgICAgICAgICAgUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlID0gbmV3IFBvbGljeUluY2x1ZGUoYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFBvbGljeUluY2x1ZGUocG9saWN5SW5jbHVkZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpPcGVyYXRpb24uZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLCBQT1JUX1RZUEVfT1BFUkFUSU9OKTsKLQotICAgICAgICBJbnB1dCB3c2RsNGpJbnB1dE1lc3NhZ2UgPSB3c2RsNGpPcGVyYXRpb24uZ2V0SW5wdXQoKTsKLQotICAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB3c2RsNGpJbnB1dE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBpbk1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHdzZGw0aklucHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0TmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpJbnB1dE1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZSwgUE9SVF9UWVBFX09QRVJBVElPTl9JTlBVVCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhbHJlYWR5IHNldCBhcyB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaXQKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGlucHV0QWN0aW9ucyA9IGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRBY3Rpb25zID09IG51bGwgfHwgaW5wdXRBY3Rpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRpZiwgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLCB3c2RsNGpJbnB1dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFdzYW1hcHBpbmdMaXN0KGlucHV0QWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRBY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihhY3Rpb24sIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBvdXRwdXQgbWVzc2FnZSBhbmQgYWRkCi0gICAgICAgICAgICBPdXRwdXQgd3NkbDRqT3V0cHV0TWVzc2FnZSA9IHdzZGw0ak9wZXJhdGlvbi5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHdzZGw0ak91dHB1dE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gYXhpc09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gd3NkbDRqT3V0cHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotCi0gICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpJbnB1dE1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UsIFBPUlRfVFlQRV9PUEVSQVRJT05fT1VUUFVUKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyB3c2RsOnBvcnRUeXBlIC0+IHdzZGw6b3BlcmF0aW9uIC0+IHdzZGw6b3V0cHV0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgYWxyZWFkeSBzZXQgYXMgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIGl0Ci0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybgotICAgICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbU91dHB1dEVsZW1lbnQoZGlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpPdXRwdXRNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0T3V0cHV0QWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAvLyBmb3IgdGhlIGNsaWVudCBzaWRlIHdlIGhhdmUgdG8gZG8gc29tZXRoaW5nIHRoYXQgaXMgYSBiaXQKLSAgICAgICAgICAgIC8vIHdlaXJkLiBUaGUgaW4gbWVzc2FnZSBpcyBhY3R1YWxseSB0YWtlbiBmcm9tIHRoZSBvdXRwdXQKLSAgICAgICAgICAgIC8vIGFuZCB0aGUgb3V0cHV0IGlzIHRha2VuIGZyb20gdGhlIGluCi0KLSAgICAgICAgICAgIGlmIChudWxsICE9IHdzZGw0aklucHV0TWVzc2FnZSkgewotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHdzZGw0aklucHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5zZXROYW1lKG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlFeHRlbnNpb25BdHRyaWJ1dGVzKHdzZGw0aklucHV0TWVzc2FnZS5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLCBQT1JUX1RZUEVfT1BFUkFUSU9OX09VVFBVVCk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhbHJlYWR5IHNldCBhcyB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaXQKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0T3V0cHV0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRpZiwgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLCB3c2RsNGpJbnB1dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbi5zZXRPdXRwdXRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDcmVhdGUgYW4gb3V0cHV0IG1lc3NhZ2UgYW5kIGFkZAotICAgICAgICAgICAgT3V0cHV0IHdzZGw0ak91dHB1dE1lc3NhZ2UgPSB3c2RsNGpPcGVyYXRpb24uZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSB3c2RsNGpPdXRwdXRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gd3NkbDRqT3V0cHV0TWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVzc2FnZSkgewotCi0gICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBjb3B5RXh0ZW5zaW9uQXR0cmlidXRlcyh3c2RsNGpJbnB1dE1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2UsIFBPUlRfVFlQRV9PUEVSQVRJT05fSU5QVVQpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdzZGw6cG9ydFR5cGUgLT4gd3NkbDpvcGVyYXRpb24gLT4gd3NkbDpvdXRwdXQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyBhbHJlYWR5IHNldCBhcyB3ZSBkb24ndCB3YW50IHRvCi0gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaXQKLSAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuCi0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGlucHV0QWN0aW9ucyA9IGF4aXNPcGVyYXRpb24uZ2V0V1NBTWFwcGluZ0xpc3QoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRBY3Rpb25zID09IG51bGwgfHwgaW5wdXRBY3Rpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudChkaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNGpQb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0ak9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0ak91dHB1dE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldFdzYW1hcHBpbmdMaXN0KGlucHV0QWN0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRBY3Rpb25zLmFkZChhY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE1hcCBmYXVsdHMgPSB3c2RsNGpPcGVyYXRpb24uZ2V0RmF1bHRzKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGZhdWx0S2V5SXRlcmF0b3IgPSBmYXVsdHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoZmF1bHRLZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBmYXVsdHMuZ2V0KGZhdWx0S2V5SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNGYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0ZhdWx0TWVzc2FnZSxmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgICAgIE1lc3NhZ2UgZmF1bHRNZXNzYWdlID0gZmF1bHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZmF1bHRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0ZhdWx0TWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoZmF1bHRNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgY29weUV4dGVuc2libGVFbGVtZW50cyhmYXVsdE1lc3NhZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWYsIGF4aXNGYXVsdE1lc3NhZ2UsIFBPUlRfVFlQRV9PUEVSQVRJT05fRkFVTFQpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgYWxyZWFkeSBzZXQgYXMgd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZQotICAgICAgICAgICAgLy8gaXQKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIERlZmF1bHQgQWN0aW9uIFBhdHRlcm4KLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBheGlzT3BlcmF0aW9uLmdldEZhdWx0QWN0aW9uKGZhdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhY3Rpb24gPSBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbUZhdWx0RWxlbWVudChkaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqUG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqT3BlcmF0aW9uLCBmYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZEZhdWx0QWN0aW9uKGZhdWx0LmdldE5hbWUoKSwgYWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhheGlzRmF1bHRNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIHdyYXBwZXIgc2NoZW1hcwotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGw0akJpbmRpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnRbXSBnZW5lcmF0ZVdyYXBwZXJTY2hlbWEoTWFwIHNjaGVtYU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZyB3c2RsNGpCaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSkgewotCi0gICAgICAgIExpc3Qgc2NoZW1hRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vIHRhcmdldCBuYW1lc3BhY2UgZm9yIHRoaXMgc2hvdWxkIGJlIHRoZSBuYW1lc3BhY2UgVVJJIGZvcgotICAgICAgICAvLyB0aGUgcG9ydHR5cGUKLSAgICAgICAgU3RyaW5nIHBvcnR0eXBlTmFtZXNwYWNlVVJJID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgYmluZGluZ3MgcHJlc2VudCB0aGVuIHdlIGhhdmUgdG8gcHJvY2VzcyB0aGVtLiB3ZQotICAgICAgICAvLyBoYXZlIHRvIGdlbmVyYXRlIGEgc2NoZW1hIHBlciB3c2RsNGpCaW5kaW5nICh0aGF0IGlzIHRoZSBzYWZlc3QKLSAgICAgICAgLy8gb3B0aW9uKS4KLSAgICAgICAgLy8gaWYgbm90IHdlIGp1c3QgcmVzb2x2ZSB0bwotICAgICAgICAvLyB0aGUgZ29vZCBvbGQgcG9ydCB0eXBlCi0gICAgICAgIC8vIGxpc3QsIGluIHdoaWNoIGNhc2Ugd2UnbGwgZ2VuZXJhdGUgYSBzY2hlbWEgcGVyIHBvcnR0eXBlCi0gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAvLyBmaW5kd3JhcHBhYmxlIG9wZXJhdGlvbnMgcmV0dXJuIGVpdGhlciB0aGUgcnBjIHNvYXAgb3BlcmF0aW9ucyBvcgotICAgICAgICAvLyBIdHRwIGJpbmRpbmcgb3BlcmF0aW9ucwotCi0gICAgICAgIExpc3Qgd3JhcHBhYmxlQk9FTGlzdCA9IGZpbmRXcmFwcGFibGVCaW5kaW5nT3BlcmF0aW9ucyh3c2RsNGpCaW5kaW5nKTsKLQotICAgICAgICAvLyB0aGlzIG1ldGhvZCByZXR1cm5zIGFsbCB0aGUgbmV3IHNjaGVtYXMgY3JlYXRlZCB3aGVuIHByb2Nlc3NpbmcgdGhlIHJwYyBtZXNzYWdlcwotICAgICAgICBNYXAgbmV3U2NoZW1hTWFwID0gY3JlYXRlU2NoZW1hRm9yUG9ydHR5cGUocG9ydHR5cGVOYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGFibGVCT0VMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTWFwKTsKLQotICAgICAgICBzY2hlbWFFbGVtZW50TGlzdC5hZGRBbGwobmV3U2NoZW1hTWFwLnZhbHVlcygpKTsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50W10pIHNjaGVtYUVsZW1lbnRMaXN0Ci0gICAgICAgICAgICAgICAgLnRvQXJyYXkobmV3IEVsZW1lbnRbc2NoZW1hRWxlbWVudExpc3Quc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2NoZW1hIGJ5IGxvb2tpbmcgYXQgdGhlIHBvcnQgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSSAtIG5hbWVzcGFjZSBvZiB0aGUgcG9ydHR5cGUgdXJpLgotICAgICAqICB3ZSB1c2UgdGhpcyBvbmx5IGlmIGEgdXNlciBoYXMgbm90IHNwZWNpZmllZCBhIG5hbWVzcGFjZSBpbiBzb2FwOmJvZHkKLSAgICAgKiBAcGFyYW0gYm9lTGlzdFRvUHJvY2VzcyAtIExpc3Qgb2YgQmluZGluZ09wZXJhdGlvbkVudHJ5IG9iamVjdHMgd2hpY2ggcmVxdWlyZSB3cmFwcGVyaW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNyZWF0ZVNjaGVtYUZvclBvcnR0eXBlKFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBib2VMaXN0VG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGlzdGluZ1NjaGVtYU1hcCkgewotCi0gICAgICAgIC8vIHRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUgbmV3bHkgYWRkZWQgc2NoZW1hcwotICAgICAgICBNYXAgbmV3U2NoZW1hTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgLy8gZmlyc3Qgb2YgYWxsIGxvb2sgYXQgdGhlIG9wZXJhdGlvbnMgbGlzdAotICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHdlIGdldCB0aGUgb3BlcmF0aW9ucyBsaXN0Ci0gICAgICAgIC8vIGFzIGVtcHR5Ci0gICAgICAgIGlmIChib2VMaXN0VG9Qcm9jZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ld1NjaGVtYU1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgbWVzc2FnZXMuIFdlJ2xsIHBvcHVsYXRlIHRoaW5zIG1hcCB3aXRoIHRoZSByZWxldmFudAotICAgICAgICAvLyBtZXNzYWdlcwotICAgICAgICAvLyBmcm9tIHRoZSBvcGVyYXRpb25zCi0gICAgICAgIE1hcCBtZXNzYWdlUW5hbWVUb01lc3NhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBNYXAgYm9lVG9JbnB1dE1lc3NhZ2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBNYXAgYm9lVG9PdXRwdXRNZXNzYWdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAvLyB0aGlzIGNvbnRhaW5zIHRoZSByZXF1aXJlZCBuYW1lc3BhY2UgaW1wb3J0cy4gdGhlIGtleSBpbiB0aGlzCi0gICAgICAgIC8vIG1hcCB3b3VsZCBiZSB0aGUgbmFtYXNwYWNlIFVSSQotICAgICAgICBNYXAgbmFtZXNwYWNlSW1wb3J0c01hcCA9IG51bGw7Ci0gICAgICAgIC8vIGxpc3QgbmFtZXNwYWNlIHByZWZpeCBtYXAuIFRoaXMgbWFwIHdpbGwgaW5jbHVkZSB1cmkgLT4gcHJlZml4Ci0gICAgICAgIE1hcCBuYW1lc3BhY2VQcmVmaXhNYXAgPSBudWxsOwotCi0gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIEZpcnN0IHRoaW5nIGlzIHRvIHBvcHVsYXRlIHRoZSBtZXNzYWdlIG1hcCB3aXRoIHRoZSBtZXNzYWdlcyB0bwotICAgICAgICAvLyBwcm9jZXNzLgotICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIC8vIHdlIHJlYWxseSBuZWVkIHRvIGRvIHRoaXMgZm9yIGEgc2luZ2xlIHBvcnR0eXBlIQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGJvZUxpc3RUb1Byb2Nlc3Muc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGJvZSA9IChCaW5kaW5nT3BlcmF0aW9uRW50cnkpIGJvZUxpc3RUb1Byb2Nlc3MuZ2V0KGspOwotICAgICAgICAgICAgSW5wdXQgaW5wdXQgPSBib2UuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpLmdldElucHV0KCk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2U7Ci0gICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVFuYW1lVG9NZXNzYWdlTWFwLnB1dChtZXNzYWdlLmdldFFOYW1lKCksIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGJvZVRvSW5wdXRNZXNzYWdlTWFwLnB1dChib2UsIG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPdXRwdXQgb3V0cHV0ID0gYm9lLmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2VRbmFtZVRvTWVzc2FnZU1hcC5wdXQobWVzc2FnZS5nZXRRTmFtZSgpLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBib2VUb091dHB1dE1lc3NhZ2VNYXAucHV0KGJvZSwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdlIGRvIG5vdCB3YW50IHRvIHByb2Nlc3MgZmF1bHQgbWVzc2FnZXMgc2luY2UgdGhleSBjYW4gb25seSBiZSB1c2VkIGFzIGRvY3VtZW50IHR5cGUKLSAgICAgICAgICAgIC8vIHNlZSBiYXNpYyBwcm9maWxlIDQuNC4yCi0gICAgICAgIH0KLQotICAgICAgICAvLyBmaW5kIHRoZSB4c2QgcHJlZml4Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSBmaW5kU2NoZW1hUHJlZml4KCk7Ci0gICAgICAgIC8vIERPTSBkb2N1bWVudCB0aGF0IHdpbGwgYmUgdGhlIHVsdGltYXRlIGNyZWF0b3IKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRET01Eb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCi0gICAgICAgIEVsZW1lbnQgZWxlbWVudERlY2xhcmF0aW9uOwotCi0gICAgICAgIC8vbG9vcCB0aHJvdWdoIHRoZSBpbnB1dCBvcCBtYXAgYW5kIGdlbmVyYXRlIHRoZSBlbGVtZW50cwotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9FbnRyeTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBib2VJdGVyID0gYm9lVG9JbnB1dE1lc3NhZ2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICBib2VJdGVyLmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgYm9FbnRyeSA9IChCaW5kaW5nT3BlcmF0aW9uRW50cnkpIGJvZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZWxlbWVudERlY2xhcmF0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgICAgICBYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSSwgeHNkUHJlZml4ICsgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFhNTF9TQ0hFTUFfRUxFTUVOVF9MT0NBTF9OQU1FKTsKLSAgICAgICAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5zZXRBdHRyaWJ1dGUoWFNEX05BTUUsIGJvRW50cnkuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIC8vd2hlbiBjcmVhdGluZyB0aGUgaW5uZXIgY29tcGxleCB0eXBlIHdlIGhhdmUgdG8gZmluZCB0aGUgcGFydHMgbGlzdCBmcm9tIHRoZSBiaW5kaW5nIGlucHV0Ci0gICAgICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgYm9lVG9JbnB1dE1lc3NhZ2VNYXAuZ2V0KGJvRW50cnkpOwotCi0gICAgICAgICAgICBpZiAoYmluZGluZ0lucHV0ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gcGFydHNDb2xsZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoQklORElOR19UWVBFX1NPQVAuZXF1YWxzKHRoaXMuYmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IHNlZSB0aGUgYm9keSBwYXJ0cyBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgYm9keVBhcnRzTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJ0c0xpc3RGcm9tU29hcEJvZHkoYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydHNDb2xsZWN0aW9uID0gbWVzc2FnZS5nZXRPcmRlcmVkUGFydHMoYm9keVBhcnRzTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIGh0dHAgYmluZGluZwotICAgICAgICAgICAgICAgICAgICBwYXJ0c0NvbGxlY3Rpb24gPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTGlzdCBwYXJhbWV0ZXJPcmRlciA9IAotICAgICAgICAgICAgICAgICAgIGJvRW50cnkuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpLmdldFBhcmFtZXRlck9yZGVyaW5nKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICAgICAgICAgIE5vZGUgbmV3Q29tcGxleFR5cGUgPSBnZXROZXdDb21wbGV4dFR5cGUoZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0NvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0c01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib0VudHJ5KTsKLQotICAgICAgICAgICAgICAgIGVsZW1lbnREZWNsYXJhdGlvbi5hcHBlbmRDaGlsZChuZXdDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVRvVXNlID0gbmFtZXNwYWNlVVJJOwotCi0gICAgICAgICAgICAgICAgaWYgKEJJTkRJTkdfVFlQRV9TT0FQLmVxdWFscyh0aGlzLmJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keU5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlRnJvbVNvYXBCb2R5KGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRvVXNlID0gYm9keU5hbWVzcGFjZSAhPSBudWxsID8gYm9keU5hbWVzcGFjZSA6IG5hbWVzcGFjZVVSSTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdTY2hlbWFNYXAuY29udGFpbnNLZXkobmFtZXNwYWNlVG9Vc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIG5hbWVzcGFjZSBpcyBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBvcmlnaW5hbCB3c2RsIHNjaGVtYXMKLSAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudFRvQW5FeGlzdGluZ1NjaGVtYSgoRWxlbWVudCkgZXhpc3RpbmdTY2hlbWFNYXAuZ2V0KG5hbWVzcGFjZVRvVXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3U2NoZW1hTWFwLmNvbnRhaW5zS2V5KG5hbWVzcGFjZVRvVXNlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBuYW1lc3BhY2UgaXMgd2l0aCBhIG5ld2x5IGNyZWF0ZWQgc2NoZW1hCi0gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnRUb0FuRXhpc3RpbmdTY2hlbWEoKEVsZW1lbnQpIG5ld1NjaGVtYU1hcC5nZXQobmFtZXNwYWNlVG9Vc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnREZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0c01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1VzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgZWxlbWVudCBuYW1lc3BhY2UgaGFzIG5vdCBmb3VuZCB5ZXQgc28KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBjcmVhdGUgbmV3IHNjaGVtYSBmb3IgaXQKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBuZXdTY2hlbWEgPSBjcmVhdGVOZXdTY2hlbWFXaXRoRWxlbWVudChlbGVtZW50RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgbmV3U2NoZW1hTWFwLnB1dChuYW1lc3BhY2VUb1VzZSwgbmV3U2NoZW1hKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRScGNXcmFwcGVkRWxlbWVudE1hcC5wdXQoYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLCBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1VzZSwgYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLCBBWElTMldSQVBQRUQpKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm8gYmluZGluZyBpbnB1dCBpcyBkZWZpZW5kIGZvciBiaW5kaW5nIG9wZXJhdGlvbiA9PT4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBib0VudHJ5LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIG91dHB1dCB0byBtYXAgYW5kIGdlbmVyYXRlIHRoZSBlbGVtZW50cwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGJvZUl0ZXJhdG9yID0gYm9lVG9PdXRwdXRNZXNzYWdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgYm9lSXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgYm9FbnRyeSA9IChCaW5kaW5nT3BlcmF0aW9uRW50cnkpIGJvZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBiYXNlb3V0cHV0T3BOYW1lID0gYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy8gc2VlIGJhc2ljIHByb2ZpbGUgNC43LjE5Ci0gICAgICAgICAgICBTdHJpbmcgb3V0cHV0T3BOYW1lID0gYmFzZW91dHB1dE9wTmFtZSArIFdSQVBQRURfT1VUUFVUTkFNRV9TVUZGSVg7Ci0gICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoCi0gICAgICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgWE1MX1NDSEVNQV9FTEVNRU5UX0xPQ0FMX05BTUUpOwotICAgICAgICAgICAgZWxlbWVudERlY2xhcmF0aW9uLnNldEF0dHJpYnV0ZShYU0RfTkFNRSwgb3V0cHV0T3BOYW1lKTsKLQotICAgICAgICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0QmluZGluZ091dHB1dCgpOwotICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGJvZVRvT3V0cHV0TWVzc2FnZU1hcC5nZXQoYm9FbnRyeSk7Ci0KLSAgICAgICAgICAgIGlmIChiaW5kaW5nT3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIHBhcnRzQ29sbGVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKEJJTkRJTkdfVFlQRV9TT0FQLmVxdWFscyh0aGlzLmJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBzZWUgdGhlIGJvZHkgcGFydHMgbGlzdAotICAgICAgICAgICAgICAgICAgICBMaXN0IGJvZHlQYXJ0c0xpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFydHNMaXN0RnJvbVNvYXBCb2R5KGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBwYXJ0c0NvbGxlY3Rpb24gPSBtZXNzYWdlLmdldE9yZGVyZWRQYXJ0cyhib2R5UGFydHNMaXN0KTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSBpZiBodHRwIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgcGFydHNDb2xsZWN0aW9uID0gbWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIExpc3QgcGFyYW1ldGVyT3JkZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgYm9FbnRyeS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCkuZ2V0UGFyYW1ldGVyT3JkZXJpbmcoKTsKLQotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUgaGFzaCBtYXBzIGFsd2F5cyBzaW5jZSB3ZSBhZGQgdGhlIGVsZW1lbnRzIG9uZWNlIHdlCi0gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgaXQKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgICAgICAgICAgTm9kZSBuZXdDb21wbGV4VHlwZSA9IGdldE5ld0NvbXBsZXh0VHlwZShkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzQ29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib0VudHJ5KTsKLSAgICAgICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24uYXBwZW5kQ2hpbGQobmV3Q29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVRvVXNlID0gbmFtZXNwYWNlVVJJOwotCi0gICAgICAgICAgICAgICAgaWYgKEJJTkRJTkdfVFlQRV9TT0FQLmVxdWFscyh0aGlzLmJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYm9keU5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZXNwYWNlRnJvbVNvYXBCb2R5KGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1VzZSA9IGJvZHlOYW1lc3BhY2UgIT0gbnVsbCA/IGJvZHlOYW1lc3BhY2UgOiBuYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nU2NoZW1hTWFwLmNvbnRhaW5zS2V5KG5hbWVzcGFjZVRvVXNlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBuYW1lc3BhY2UgaXMgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgb3JpZ2luYWwgd3NkbCBzY2hlbWFzCi0gICAgICAgICAgICAgICAgICAgIGFkZEVsZW1lbnRUb0FuRXhpc3RpbmdTY2hlbWEoKEVsZW1lbnQpIGV4aXN0aW5nU2NoZW1hTWFwLmdldChuYW1lc3BhY2VUb1VzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRvVXNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1NjaGVtYU1hcC5jb250YWluc0tleShuYW1lc3BhY2VUb1VzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIHRoaXMgbmFtZXNwYWNlIGlzIHdpdGggYSBuZXdseSBjcmVhdGVkIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50VG9BbkV4aXN0aW5nU2NoZW1hKChFbGVtZW50KSBuZXdTY2hlbWFNYXAuZ2V0KG5hbWVzcGFjZVRvVXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGVsZW1lbnQgbmFtZXNwYWNlIGhhcyBub3QgZm91bmQgeWV0IHNvCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY3JlYXRlIG5ldyBzY2hlbWEgZm9yIGl0Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbmV3U2NoZW1hID0gY3JlYXRlTmV3U2NoZW1hV2l0aEVsZW1lbnQoZWxlbWVudERlY2xhcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVRvVXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1NjaGVtYU1hcC5wdXQobmFtZXNwYWNlVG9Vc2UsIG5ld1NjaGVtYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc29sdmVkUnBjV3JhcHBlZEVsZW1lbnRNYXAucHV0KG91dHB1dE9wTmFtZSwgbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVG9Vc2UsIG91dHB1dE9wTmFtZSwgQVhJUzJXUkFQUEVEKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGJpbmRpbmcgb3V0IHB1dCBpcyBkZWZpbmVkIGZvciBiaW5kaW5nIG9wZXJhdGlvbiA9PT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvRW50cnkuZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3U2NoZW1hTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRFbGVtZW50VG9BbkV4aXN0aW5nU2NoZW1hKEVsZW1lbnQgc2NoZW1hRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG5ld0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbmFtZXNwYWNlSW1wb3J0c01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0KLSAgICAgICAgRG9jdW1lbnQgb3duZXJEb2N1bWVudCA9IHNjaGVtYUVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBmaXJzdCBhbmQgYWRkIHRoZW0KLSAgICAgICAgU3RyaW5nW10gbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheSA9IChTdHJpbmdbXSkgbmFtZXNwYWNlUHJlZml4TWFwCi0gICAgICAgICAgICAgICAgLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lc3BhY2VQcmVmaXhNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBuYW1lU3BhY2VEZWNsYXJhdGlvbkFycmF5W2ldOwotICAgICAgICAgICAgY2hlY2tBbmRBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMocywgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgaW1wb3J0cyAtIGNoZWNrIHdoZXRoZXIgaXQgaXMgdGhlIHRhcmdldG5hbWVzcGFjZSBiZWZvcmUKLSAgICAgICAgLy8gYWRkaW5nCi0gICAgICAgIEVsZW1lbnRbXSBuYW1lc3BhY2VJbXBvcnRzID0gKEVsZW1lbnRbXSkgbmFtZXNwYWNlSW1wb3J0c01hcAotICAgICAgICAgICAgICAgIC52YWx1ZXMoKS50b0FycmF5KG5ldyBFbGVtZW50W25hbWVzcGFjZUltcG9ydHNNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlSW1wb3J0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZUltcG9ydHNbaV0KLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VfVVJJKSkpIHsKLSAgICAgICAgICAgICAgICBzY2hlbWFFbGVtZW50LmFwcGVuZENoaWxkKG93bmVyRG9jdW1lbnQuaW1wb3J0Tm9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNbaV0sIHRydWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQob3duZXJEb2N1bWVudC5pbXBvcnROb2RlKG5ld0VsZW1lbnQsIHRydWUpKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgRWxlbWVudCBjcmVhdGVOZXdTY2hlbWFXaXRoRWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhzZFByZWZpeCkgewotCi0gICAgICAgIEVsZW1lbnQgc2NoZW1hRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygKLSAgICAgICAgICAgICAgICBYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSSwgeHNkUHJlZml4ICsgIjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgWE1MX1NDSEVNQV9MT0NBTF9OQU1FKTsKLQotICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgZmlyc3QKLSAgICAgICAgU3RyaW5nW10gbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheSA9IChTdHJpbmdbXSkgbmFtZXNwYWNlUHJlZml4TWFwCi0gICAgICAgICAgICAgICAgLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lc3BhY2VQcmVmaXhNYXAuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZVNwYWNlRGVjbGFyYXRpb25BcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBuYW1lU3BhY2VEZWNsYXJhdGlvbkFycmF5W2ldOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1BSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWVzcGFjZVByZWZpeE1hcC5nZXQocykudG9TdHJpbmcoKSwgcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hRWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwgeHNkUHJlZml4KS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTF9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FU1BBQ0VfREVDTEFSQVRJT05fUFJFRklYICsgeHNkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgdGhlIHRhcmdldE5hbWVzcGFjZQotICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhNTF9OQU1FU1BBQ0VfVVJJLCBYTUxOU19BWElTMldSQVBQRUQsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRF9UQVJHRVROQU1FU1BBQ0UsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlKFhTRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCwgWFNEX1VOUVVBTElGSUVEKTsKLQotICAgICAgICAvLyBhZGQgaW1wb3J0cwotICAgICAgICBFbGVtZW50W10gbmFtZXNwYWNlSW1wb3J0cyA9IChFbGVtZW50W10pIG5hbWVzcGFjZUltcG9ydHNNYXAKLSAgICAgICAgICAgICAgICAudmFsdWVzKCkudG9BcnJheShuZXcgRWxlbWVudFtuYW1lc3BhY2VJbXBvcnRzTWFwLnNpemUoKV0pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZUltcG9ydHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQobmFtZXNwYWNlSW1wb3J0c1tpXSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdCBnZXRQYXJ0c0xpc3RGcm9tU29hcEJvZHkoTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBudWxsOwotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50OwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXh0ZW5zaWJpbGl0eSBFbGVtZW50IHR5cGUgaXM6IiArIGV4dEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeHRlbnNpYmlsaXR5IEVsZW1lbnQgY2xhc3MgaXM6IiArIGV4dEVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU09BUCAxLjEgYm9keSBlbGVtZW50IGZvdW5kIQotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkgewotICAgICAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIHBhcnRzTGlzdCA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJCb2R5KSB7Ci0gICAgICAgICAgICAgICAgU09BUDEyQm9keSBzb2FwQm9keSA9IChTT0FQMTJCb2R5KSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIHBhcnRzTGlzdCA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgewotICAgICAgICAgICAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG1pbk1pbWVNdWx0aXBhcnRSZWxhdGVkID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIExpc3QgbWltZVBhcnRzTGlzdCA9IG1pbk1pbWVNdWx0aXBhcnRSZWxhdGVkLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgICAgICAgIE1JTUVQYXJ0IG1pbWVQYXJ0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0OwotICAgICAgICAgICAgICAgIExpc3QgbWltZVBhcnRFbGVtZW50czsKLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBtaW1lUGFydEV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbWltZVBhcnRzSXRlciA9IG1pbWVQYXJ0c0xpc3QuaXRlcmF0b3IoKTsgbWltZVBhcnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IG1pbWVQYXJ0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTUlNRVBhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVQYXJ0ID0gKE1JTUVQYXJ0KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaW1lUGFydEVsZW1lbnRzID0gbWltZVBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1pbWVQYXJ0RWxlbWVudHNJdGVyID0gbWltZVBhcnRFbGVtZW50cy5pdGVyYXRvcigpOyBtaW1lUGFydEVsZW1lbnRzSXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVQYXJ0RXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIG1pbWVQYXJ0RWxlbWVudHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZVBhcnRFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBtaW1lUGFydEV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0xpc3QgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZVBhcnRFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkJvZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQm9keSBzb2FwQm9keSA9IChTT0FQMTJCb2R5KSBtaW1lUGFydEV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0c0xpc3QgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcnRzTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNPQVAgYm9keSBwYXJ0cyBoYXZlIG5vdCBiZWVuIHNldC4gQWxsIHRoZSBwYXJ0cyBpbiB0aGUgbWVzc2FnZSB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJ0c0xpc3Q7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlRnJvbVNvYXBCb2R5KExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSB7Ci0KLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudDsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgLy8gU09BUCAxLjEgYm9keSBlbGVtZW50IGZvdW5kIQotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkgewotICAgICAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRFbGVtZW50OwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IHNvYXBCb2R5LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUDEyQm9keSkgewotICAgICAgICAgICAgICAgIFNPQVAxMkJvZHkgc29hcEJvZHkgPSAoU09BUDEyQm9keSkgZXh0RWxlbWVudDsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBzb2FwQm9keS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgYSBuZXcgc2hlbWEgY29tcGxleCBlbGVtZW50IGFjY29yZGluZyB0byB0aGUgZWxlbWVudHMgc2VxdWVuY2UgZGlmaW5lZAotICAgICAqIHRoaXMgcGFydHMgbGlzdCBpcyBhbHdheXMgZm9yIGEgbWVzc2FnZSByZWZlcmluZyBmcm9tIHRoZQotICAgICAqIHNvYXAgcnBjIHR5cGUgb3BlcmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0geHNkUHJlZml4Ci0gICAgICogQHBhcmFtIHBhcnRzQ29sbGVjdGlvbiAgICAgLSBwYXJ0cyB0byBiZSBhZGRlZAotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJPcmRlciAgICAgIC0gcGFyYW0gT3JkZXIgbGlzdCBpZiBpdCBpcyBnaXZlbgotICAgICAqIEBwYXJhbSBpc091dE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlSW1wb3J0c01hcAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXhNYXAKLSAgICAgKiBAcGFyYW0gYm9lIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBmb3IgdGhpcyBwYXJ0Q29sbGVjdGlvbgotICAgICAqIEByZXR1cm4gbmV3IGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0TmV3Q29tcGxleHRUeXBlKERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gcGFydHNDb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwYXJhbWV0ZXJPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbmFtZXNwYWNlUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkVudHJ5IGJvZSkgewotICAgICAgICAvLyBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICBFbGVtZW50IG5ld0NvbXBsZXhUeXBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfU0NIRU1BX0NPTVBMRVhfVFlQRV9MT0NBTF9OQU1FKTsKLQotICAgICAgICBFbGVtZW50IGNtcGx4VHlwZVNlcXVlbmNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfU0NIRU1BX1NFUVVFTkNFX0xPQ0FMX05BTUUpOwotCi0gICAgICAgIFBhcnQgcGFydDsKLSAgICAgICAgaWYgKChwYXJhbWV0ZXJPcmRlciA9PSBudWxsKSB8fCAocGFyYW1ldGVyT3JkZXIuc2l6ZSgpID09IDApKSB7Ci0gICAgICAgICAgICAvLyBubyBwYXJhbWV0ZXIgb3JkZXIgdGhlbiBqdXN0IGFkZCB0aGUgZWxlbWVudHMgaW4gdGhlIHBhcnRzIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcGFydHNJdGVyID0gcGFydHNDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IHBhcnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChQYXJ0KSBwYXJ0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJ0IG5hbWUKLSAgICAgICAgICAgICAgICBhZGRQYXJ0VG9FbGVtZW50KHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBseFR5cGVTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGkuZSBhbiBwYXJ0cyBvcmRlciBpcyBnaXZlbgotICAgICAgICAgICAgLy8gZmlyc3QgcG9wdWxhdGUgYWxsIHRoZSBwYXJ0cyB0byBhIG1hcAotICAgICAgICAgICAgTWFwIHBhcnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcGFydHNJdGVyID0gcGFydHNDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IHBhcnRzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChQYXJ0KSBwYXJ0c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHBhcnRzTWFwLnB1dChwYXJ0LmdldE5hbWUoKSwgcGFydCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgcGFyYW1PcmRlckl0ZXIgPSBwYXJhbWV0ZXJPcmRlci5pdGVyYXRvcigpOyBwYXJhbU9yZGVySXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcGFydE5hbWUgPSAoU3RyaW5nKSBwYXJhbU9yZGVySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChQYXJ0KSBwYXJ0c01hcC5nZXQocGFydE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUGFydFRvRWxlbWVudChwYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBseFR5cGVTZXF1ZW5jZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnRzTWFwLnJlbW92ZShwYXJ0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhbiBvdXRwdXQgbWVzc2FnZSB0aGVuIHdlIGhhdmUgdG8gc2V0IHRoZQotICAgICAgICAgICAgLy8gcmV0dXJuIHR5cGUgaWYgZXhpc3RzCi0gICAgICAgICAgICBpZiAoaXNPdXRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnRzTWFwLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzTWFwLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gKFBhcnQpIHBhcnRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgcmV0dXJuIHR5cGUgYW5kIGl0cyBuYW1lIHNob3VsZCBiZSByZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnQuc2V0TmFtZSgicmVzdWx0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXJ0VG9FbGVtZW50KHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wbHhUeXBlU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMUHJvY2Vzc2luZ0V4Y2VwdGlvbigidGhlIHBhcmFtZXRlciBvcmRlciBjYW4gbGVmdCBhdG1vc3QiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9uZSBwYXJ0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBuZXdDb21wbGV4VHlwZS5hcHBlbmRDaGlsZChjbXBseFR5cGVTZXF1ZW5jZSk7Ci0gICAgICAgIHJldHVybiBuZXdDb21wbGV4VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFydAotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSB4c2RQcmVmaXgKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlSW1wb3J0c01hcAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXhNYXAKLSAgICAgKiBAcGFyYW0gY21wbHhUeXBlU2VxdWVuY2UKLSAgICAgKiBAcGFyYW0gaXNPdXRNZXNzYWdlICh0cnVlIGlzIHBhcnQgaXMgcmVmZXJlbmNlZCBieSB0aGUgb3V0cHV0IGNsYXVzZSkKLSAgICAgKiBAcGFyYW0gYm9lIEJpbmRpbmdPcGVyYXRpb25FbnRyeSB0aGF0IGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhpcyBwYXJ0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRQYXJ0VG9FbGVtZW50KFBhcnQgcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeHNkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VJbXBvcnRzTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VQcmVmaXhNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBjbXBseFR5cGVTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzT3V0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lKSB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQ7Ci0gICAgICAgIFN0cmluZyBlbGVtZW50TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCi0gICAgICAgIC8vIHRoZSB0eXBlIG5hbWUKLSAgICAgICAgUU5hbWUgc2NoZW1hVHlwZU5hbWUgPSBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0KLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lICE9IG51bGwpIHsKLQotICAgICAgICAgICAgY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoWE1MU0NIRU1BX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXggKyAiOiIgKyBYTUxfU0NIRU1BX0VMRU1FTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgICAgICAvLyBhbHdheXMgY2hpbGQgYXR0cmlidXRlIHNob3VsZCBiZSBpbiBubyBuYW1lc3BhY2UKLSAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZm9ybSIsICJ1bnF1YWxpZmllZCIpOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4OwotICAgICAgICAgICAgaWYgKFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhzY2hlbWFUeXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSB4c2RQcmVmaXg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgc2NoZW1hIGlzIGEgdGhpcmQgcGFydHkgb25lLiBTbyB3ZSBuZWVkIHRvIGhhdmUKLSAgICAgICAgICAgICAgICAvLyBhbiBpbXBvcnQgc3RhdGVtZW50IGluIG91ciBnZW5lcmF0ZWQgc2NoZW1hCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHNjaGVtYVR5cGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlSW1wb3J0c01hcC5jb250YWluc0tleSh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBFbGVtZW50IGZvciBuYW1lc3BhY2UgaW1wb3J0Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbmFtZXNwYWNlSW1wb3J0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNDSEVNQV9OQU1FU1BBQ0VfVVJJLCB4c2RQcmVmaXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfU0NIRU1BX0lNUE9SVF9MT0NBTF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlSW1wb3J0LnNldEF0dHJpYnV0ZShOQU1FU1BBQ0VfVVJJLCB1cmkpOwotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhpcyB0byB0aGUgbWFwCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUltcG9ydHNNYXAucHV0KHVyaSwgbmFtZXNwYWNlSW1wb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIGFzc29jaWF0ZSB0aGlzIHVyaSB3aXRoIGEgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpbmNsdWRlIHRoYXQgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzY2hlbWEncyBuYW1zcGFjZSBkZWNsYXJhdGlvbnMuIFNvIGFkZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVpcyBwYXJ0aWN1bGFyIG5hbWVzcGFjZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJlZml4IG1hcCBhcyB3ZWxsCi0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGdldFRlbXBvcmFyeU5hbWVzcGFjZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXAucHV0KHVyaSwgcHJlZml4KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIFVSSSBzaG91bGQgYmUgYWxyZWFkeSBpbiB0aGUgbmFtc3BhY2UgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgIC8vIG1hcAotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHVyaSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShYU0RfTkFNRSwgZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKFhTRF9UWVBFLCBwcmVmaXggKyAiOiIgKyBzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBjbXBseFR5cGVTZXF1ZW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nT3BlcmF0aW9uTmFtZSA9IGJvZS5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gcGFydC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoYm9lLmlzUlBDKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBzZWUgdGhlIGJhc2ljIHByb2ZpbGUgNC40LjEgZm9yIHJwYy1saXRlcmFsLgotICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VzIHBhcnRzIGNhbiBoYXZlIG9ubHkgdHlwZXMKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIlRoZSBiaW5kaW5nIG9wZXJhdGlvbiAiICsgYmluZGluZ09wZXJhdGlvbk5hbWUgKyAiIGlzIFJQQy9saXRlcmFsLiAiICsKLSAgICAgICAgICAgICAgICAgICAiVGhlIG1lc3NhZ2UgcGFydHMgZm9yIHRoaXMgb3BlcmF0aW9uIG11c3QgdXNlIHRoZSB0eXBlICIgKwotICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgYXMgc3BlY2lmaWNlZCBieSAiICsKLSAgICAgICAgICAgICAgICAgICAiV1MtSSBCYXNpYyBQcm9maWxlIHNwZWNpZmljYXRpb24gKDQuNC4xKS4gIE1lc3NhZ2UgcGFydCwgIiArIAotICAgICAgICAgICAgICAgICAgIHBhcnROYW1lICsgIiwgdmlvbGF0ZXMiICsKLSAgICAgICAgICAgICAgICAgICAidGhpcyBydWxlLiAgUGxlYXNlIHJlbW92ZSB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgIiArCi0gICAgICAgICAgICAgICAgICAgImFuZCB1c2UgdGhlIHR5cGUgYXR0cmlidXRlLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgcHJlc2Vuc2Ugb2YgYW4gZWxlbWVudCBtZWFucyB0aGF0IGEgd3JhcHBlciB4c2QgZWxlbWVudCBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgIGJvZS5zZXRXcmFwcGVkT3V0cHV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgYmluZGluZyBvcGVyYXRpb24gIiArIGJpbmRpbmdPcGVyYXRpb25OYW1lICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlZmVyZW5jZXMgbWVzc2FnZSBwYXJ0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUgKyAiLiAgVGhpcyBwYXJ0IGRvZXMgbm90IHVzZSB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSBhdHRyaWJ1dGUsIHNvIGEgd3JhcHBlcmluZyBlbGVtZW50IGlzIG5vdCBhZGRlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcmVmaXhNYXAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmRBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByZWZpeE1hcCwgRWxlbWVudCBzY2hlbWFFbGVtZW50KSB7Ci0gICAgICAgIC8vIGdldCB0aGUgYXR0cmlidXRlIGZvciB0aGUgY3VycmVudCBuYW1lc3BhY2UKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIHByZWZpeE1hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgLy8gQSBwcmVmaXggbXVzdCBiZSBmb3VuZCBhdCB0aGlzIHBvaW50IQotICAgICAgICBTdHJpbmcgZXhpc3RpbmdVUkwgPSBzY2hlbWFFbGVtZW50LmdldEF0dHJpYnV0ZU5TKFhNTF9OQU1FU1BBQ0VfVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9ERUNMQVJBVElPTl9QUkVGSVggKyBwcmVmaXgpOwotICAgICAgICBpZiAoZXhpc3RpbmdVUkwgPT0gbnVsbCB8fCBleGlzdGluZ1VSTC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBleGlzdGluZyBVUkwgYnkgdGhhdCBwcmVmaXggLSBkZWNsYXJlIGEgbmV3IG5hbWVzcGFjZQotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1BSRUZJWCArIHByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChleGlzdGluZ1VSTC5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgLy8gdGhpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgYWxyZWFkeSB0aGVyZSB3aXRoIHRoZSBzYW1lIHByZWZpeAotICAgICAgICAgICAgLy8gaWdub3JlIGl0Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgZGVjbGFyZWQgaW4gdGhlIGdpdmVuIHByZWZpeAotICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBwcmVmaXggaW4gdGhlIHByZWZpeCBtYXAgdG8gYSBuZXcgb25lIGFuZCBkZWNsYXJlIGl0Ci0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHByZWZpeAotICAgICAgICAgICAgU3RyaW5nIGdlbmVyYXRlZFByZWZpeCA9ICJucyIgKyBwcmVmaXhDb3VudGVyKys7Ci0gICAgICAgICAgICB3aGlsZSAocHJlZml4TWFwLmNvbnRhaW5zS2V5KGdlbmVyYXRlZFByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICBnZW5lcmF0ZWRQcmVmaXggPSAibnMiICsgcHJlZml4Q291bnRlcisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYTUxfTkFNRVNQQUNFX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1BSRUZJWCArIGdlbmVyYXRlZFByZWZpeCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgbWFwCi0gICAgICAgICAgICBwcmVmaXhNYXAucHV0KG5hbWVzcGFjZSwgZ2VuZXJhdGVkUHJlZml4KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgV1NETCBmaWxlIGdpdmVuIHRoZSBpbnB1dHN0cmVhbSBmb3IgdGhlIFdTREwgc291cmNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4KLSAgICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIERlZmluaXRpb24gcmVhZEluVGhlV1NETEZpbGUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLQotICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFJlYWRlcigpOwotCi0gICAgICAgIC8vIHN3aXRjaCBvZmYgdGhlIHZlcmJvc2UgbW9kZSBmb3IgYWxsIHVzZWNhc2VzCi0gICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKEpBVkFYX1dTRExfVkVSQk9TRV9NT0RFX0tFWSwgZmFsc2UpOwotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiamF2YXgud3NkbC5pbXBvcnREb2N1bWVudHMiLCB0cnVlKTsKLQotICAgICAgICBEZWZpbml0aW9uIGRlZjsKLSAgICAgICAgLy8gaWYgdGhlIGN1c3RlbSByZXNvbHZlciBpcyBwcmVzZW50IHRoZW4gdXNlIGl0Ci0gICAgICAgIGlmIChjdXN0b21XU0RMUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB3c2RsIGRlZmluaXRpb24gaGFzIHRoZSBVUkkgZm9yIHRoZSBiYXNlIGRvY3VtZW50IHNldAotICAgICAgICAgICAgZGVmID0gcmVhZGVyLnJlYWRXU0RMKGN1c3RvbVdTRExSZXNvbHZlcik7Ci0gICAgICAgICAgICBkZWYuc2V0RG9jdW1lbnRCYXNlVVJJKGN1c3RvbVdTRExSZXNvbHZlci5nZXRCYXNlVVJJKCkpOwotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYzsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZG9jID0gWE1MVXRpbHMubmV3RG9jdW1lbnQoaW4pOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5QQVJTRVJfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlciBDb25maWd1cmF0aW9uIEVycm9yIiwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uUEFSU0VSX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZXIgU0FYIEVycm9yIiwgZSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLklOVkFMSURfV1NETCwgIklPIEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTG9nIHdoZW4gYW5kIGZyb20gd2hlcmUgdGhlIFdTREwgaXMgbG9hZGVkLgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWFkaW5nIDEuMSBXU0RMIHdpdGggYmFzZSB1cmkgPSAiICsgZ2V0QmFzZVVyaSgpKTsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgdGhlIGRvY3VtZW50IGJhc2UgdXJpID0gIiArIGdldERvY3VtZW50QmFzZVVyaSgpKTsKLSAgICAgICAgICAgICAgICBsb2cudHJhY2UoIiAgdGhlIHN0YWNrIGF0IHRoaXMgcG9pbnQgaXM6ICIgKyBzdGFja1RvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmID0gcmVhZGVyLnJlYWRXU0RMKGdldEJhc2VVcmkoKSwgZG9jKTsKLSAgICAgICAgICAgIGRlZi5zZXREb2N1bWVudEJhc2VVUkkoZ2V0RG9jdW1lbnRCYXNlVXJpKCkpOwotICAgICAgICAgICAgcmV0dXJuIGRlZjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRXh0ZW5zaWJsZSBlbGVtZW50cyBmb3JtIHdzZGw0akV4dGVuc2libGVFbGVtZW50cwotICAgICAqIDxjb2RlPlZlY3RvcjwvY29kZT4gaWYgYW55IGFuZCBjb3B5IHRoZW0gdG8gPGNvZGU+Q29tcG9uZW50PC9jb2RlPgotICAgICAqIDxwLz4gTm90ZSAtIFNPQVAgYm9keSBleHRlbnNpYmxlIGVsZW1lbnQgd2lsbCBiZSBwcm9jZXNzZWQgZGlmZmVyZW50bHkKLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsNGpFeHRlbnNpYmxlRWxlbWVudHMKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgd2hlcmUgaXMgdGhlIGV4dCBlbGVtZW50IChwb3J0ICwgcG9ydHlwZSAsIGJpZGluZykKLSAgICAgKiBAcGFyYW0gd3NkbDRqRGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cyAtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2lsbCBpbmRpY2F0ZSB0aGUgcGxhY2UgdGhpcyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgY2FtZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzKExpc3Qgd3NkbDRqRXh0ZW5zaWJsZUVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbDRqRGVmaW5pdGlvbiwgQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdzZGw0akV4dGVuc2libGVFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0KLSAgICAgICAgICAgIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgewotCi0gICAgICAgICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVua25vd24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICAgICAgICBRTmFtZSB0eXBlID0gdW5rbm93bi5nZXRFbGVtZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIDx3c3A6UG9saWN5PgotICAgICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLldTREwxMUNvbnN0YW50cy5QT0xJQ1kuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNlRW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJjb3B5RXh0ZW5zaWJsZUVsZW1lbnRzOjogUG9saWN5RWxlbWVudCBmb3VuZCAiICsgdW5rbm93bik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUG9saWN5IHBvbGljeSA9IChQb2xpY3kpIFBvbGljeVV0aWwuZ2V0UG9saWN5Q29tcG9uZW50KHVua25vd24uZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShwb2xpY3kpOwotICAgICAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgICAgICAgICAgICBpbnQgYXR0YWNobWVudFNjb3BlID0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBvbGljeUF0dGFjaG1lbnRQb2ludChkZXNjcmlwdGlvbiwgb3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpOwotLy8gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50U2NvcGUgPiAtMSkgewotLy8gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5nZXRQb2xpY3lJbmNsdWRlKCkuYWRkUG9saWN5RWxlbWVudCgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50U2NvcGUsIHBvbGljeSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyA8d3NwOlBvbGljeVJlZmVyZW5jZT4KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuV1NETDExQ29uc3RhbnRzLlBPTElDWV9SRUZFUkVOQ0UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2VFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNvcHlFeHRlbnNpYmxlRWxlbWVudHM6OiBQb2xpY3lSZWZlcmVuY2UgZm91bmQgIiArIHVua25vd24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSAoUG9saWN5UmVmZXJlbmNlKSBQb2xpY3lVdGlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBvbGljeUNvbXBvbmVudCh1bmtub3duLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKS5hdHRhY2hQb2xpY3lSZWZlcmVuY2UocG9saWN5UmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgICAgaW50IGF0dGFjaG1lbnRTY29wZSA9Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2xpY3lBdHRhY2htZW50UG9pbnQoZGVzY3JpcHRpb24sIG9yaWdpbk9mRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudFNjb3BlID4gLTEpIHsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uZ2V0UG9saWN5SW5jbHVkZSgpLmFkZFBvbGljeVJlZkVsZW1lbnQoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudFNjb3BlLCBwb2xpY3lSZWZlcmVuY2UpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBV19VU0lOR19BRERSRVNTSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBV19VU0lOR19BRERSRVNTSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHVua25vd24uZ2V0RWxlbWVudFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2VFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNvcHlFeHRlbnNpYmxlRWxlbWVudHM6OiB3c2F3OlVzaW5nQWRkcmVzc2luZyBmb3VuZCAiICsgdW5rbm93bik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgV2UgbmVlZCB0byBzZXQgdGhpcyB0aGUgYXBwcm9wcmlhdGUgQXhpcyBEZXNjcmlwdGlvbiBBeGlzRW5kcG9pbnQgb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gQXhpc0JpbmRpbmcgLgotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMuZXF1YWxzKFBPUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cy5lcXVhbHMoQklORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLlRSVUUuZXF1YWxzKHVua25vd24uZ2V0UmVxdWlyZWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKGF4aXNTZXJ2aWNlLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAlBZGRyZXNzaW5nSGVscGVyLnNldEFkZHJlc3NpbmdSZXF1aXJlbWVudFBhcmVtZXRlclZhbHVlKGF4aXNTZXJ2aWNlLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfT1BUSU9OQUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9ICAgIGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5GT1JNQVRfQklORElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB0eXBlTWFwcGluZyA9IHVua25vd24uZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCB0eXBlTWFwcyA9IHR5cGVNYXBwaW5nLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzLkZPUk1BVF9CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlTWFwIik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHR5cGVNYXBzLmdldExlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIHR5cGVNYXBwZXIgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IHR5cGVNYXBzLml0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdHlwZU5hbWUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgidHlwZU5hbWUiKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KHR5cGVOYW1lLmdldE5vZGVWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSB3c2RsNGpEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKS5nZXQocHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgZm9ybWF0VHlwZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJmb3JtYXRUeXBlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTWFwcGVyLnB1dChuZXcgUU5hbWUobnMsIGdldFR5cGVOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5nZXROb2RlVmFsdWUoKSkpLCBmb3JtYXRUeXBlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHMuSkFWQV9OUykpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB1bmtub3dKYXZhRWxlbWVudCA9IHVua25vd24uZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5rbm93SmF2YUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJhZGRyZXNzIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgbmFtZUF0dHJpYnV0ZXMgPSB1bmtub3dKYXZhRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSBuYW1lQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oImNsYXNzTmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHNlcnZpY2VDbGFzcyA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzcy5zZXROYW1lKCJjbGFzc05hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDbGFzcy5zZXRWYWx1ZShub2RlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihzZXJ2aWNlQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHRyYW5zcG9ydE5hbWUgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnROYW1lLnNldE5hbWUoIlRSQU5TUE9SVF9OQU1FIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnROYW1lLnNldFZhbHVlKCJqYXZhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIodHJhbnNwb3J0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoaXMgZWxlbWVudCAtIGl0IGlzIGEgdG90YWxseSB1bmtub3duIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2VFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoImNvcHlFeHRlbnNpYmxlRWxlbWVudHM6OiBVbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudCBmb3VuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJBZGRyZXNzIHNvYXBBZGRyZXNzID0gKFNPQVAxMkFkZHJlc3MpIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNFbmRwb2ludCkgewotICAgICAgICAgICAgICAgIAlzZXRFbmRwb2ludFVSTCgoQXhpc0VuZHBvaW50KSBkZXNjcmlwdGlvbiwgc29hcEFkZHJlc3MuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcykgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0VuZHBvaW50KSB7Ci0gICAgICAgICAgICAgICAgCXNldEVuZHBvaW50VVJMKChBeGlzRW5kcG9pbnQpIGRlc2NyaXB0aW9uLCBzb2FwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBIVFRQQWRkcmVzcyBodHRwQWRkcmVzcyA9IChIVFRQQWRkcmVzcykgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0VuZHBvaW50KSB7Ci0gICAgICAgICAgICAgICAgCXNldEVuZHBvaW50VVJMKChBeGlzRW5kcG9pbnQpIGRlc2NyaXB0aW9uLCBodHRwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTY2hlbWEpIHsKLSAgICAgICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSkgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBhZGQgdGhpcyBzY2hlbWEgLSBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBpbXBvcnRlZAotICAgICAgICAgICAgICAgIC8vIG9uZXMKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRTY2hlbWEoZ2V0WE1MU2NoZW1hKHNjaGVtYS5nZXRFbGVtZW50KCksIHNjaGVtYQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50QmFzZVVSSSgpKSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQMTJPcGVyYXRpb24pIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBkZXNjcmlwdGlvbjsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IHNvYXBPcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25VUkkgPSBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvZGVnZW4gJiYgKChzb2FwQWN0aW9uVVJJID09IG51bGwpIHx8IChzb2FwQWN0aW9uVVJJLmVxdWFscygiIikpKSkgewotICAgICAgICAgICAgICAgICAgICBzb2FwQWN0aW9uVVJJID0gYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpLmdldElucHV0QWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldTREwgQmluZGluZyBPcGVyYXRpb246ICIgKyBheGlzQmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIFNPQVBBY3Rpb246ICIgKyBzb2FwQWN0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc29hcEFjdGlvblVSSSAhPSBudWxsICYmICFzb2FwQWN0aW9uVVJJLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9BQ1RJT04sIHNvYXBBY3Rpb25VUkkpOwotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCkuc2V0U29hcEFjdGlvbihzb2FwQWN0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZlclNpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKS5zZXRPdXRwdXRBY3Rpb24oc29hcEFjdGlvblVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5tYXBBY3Rpb25Ub09wZXJhdGlvbihzb2FwQWN0aW9uVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbikgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGRlc2NyaXB0aW9uOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTRExDb25zdGFudHMuV1NETF8xXzFfU1RZTEUsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29kZWdlbiAmJiAoKHNvYXBBY3Rpb24gPT0gbnVsbCkgfHwgKHNvYXBBY3Rpb24uZXF1YWxzKCIiKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24gPSBheGlzQmluZGluZ09wZXJhdGlvbi5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0SW5wdXRBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETCBCaW5kaW5nIE9wZXJhdGlvbjogIiArIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgU09BUEFjdGlvbjogIiArIHNvYXBBY3Rpb24pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgIXNvYXBBY3Rpb24uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0FDVElPTiwgc29hcEFjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKS5zZXRTb2FwQWN0aW9uKHNvYXBBY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmVyU2lkZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0QXhpc09wZXJhdGlvbigpLnNldE91dHB1dEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKHNvYXBBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBIVFRQT3BlcmF0aW9uIGh0dHBPcGVyYXRpb24gPSAoSFRUUE9wZXJhdGlvbikgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdPcGVyYXRpb24gYXhpc0JpbmRpbmdPcGVyYXRpb24gPSAoQXhpc0JpbmRpbmdPcGVyYXRpb24pIGRlc2NyaXB0aW9uOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvbiA9IGh0dHBPcGVyYXRpb24uZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgICAgICBpZiAoaHR0cExvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IHNhbWUgYXMgV1NETCAyIHRlbXBsYXRlCi0gICAgICAgICAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9IGh0dHBMb2NhdGlvbi5yZXBsYWNlQWxsKCJcXCgiLCAieyIpOwotICAgICAgICAgICAgICAgICAgICBodHRwTG9jYXRpb24gPSBodHRwTG9jYXRpb24ucmVwbGFjZUFsbCgiXFwpIiwgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTiwgaHR0cExvY2F0aW9uKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lOUFVUX1NFUklBTElaQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1hfV1dXX0ZPUk0pOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJIZWFkZXIpIHsKLQotICAgICAgICAgICAgICAgIFNPQVAxMkhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVAxMkhlYWRlcikgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgU09BUEhlYWRlck1lc3NhZ2UgaGVhZGVyTWVzc2FnZSA9IG5ldyBTT0FQSGVhZGVyTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXROYW1lc3BhY2VVUkkoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRVc2Uoc29hcEhlYWRlci5nZXRVc2UoKSk7Ci0KLSAgICAgICAgICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gc29hcEhlYWRlci5nZXRSZXF1aXJlZCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRSZXF1aXJlZChyZXF1aXJlZC5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHdzZGw0akRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSByZWxldmFudCBzY2hlbWEgcGFydCBmcm9tIHRoZSBtZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IHdzZGw0akRlZmluaXRpb24uZ2V0TWVzc2FnZShzb2FwSGVhZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGkxOG4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibWVzc2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29hcEhlYWRlci5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCBpbiB0aGUgV1NETCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQYXJ0IG1zZ1BhcnQgPSBtc2cuZ2V0UGFydChzb2FwSGVhZGVyLmdldFBhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ1BhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBpMThuIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIm1lc3NhZ2UgcGFydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29hcEhlYWRlci5nZXRQYXJ0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCBpbiB0aGUgV1NETCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBzZWUgYmFzaWMgcHJvZmlsZSA0LjQuMiBCaW5kaW5ncyBhbmQgRmF1bHRzIGhlYWRlciwgZmF1bHQgYW5kIGhlYWRlcmZhdWx0cwotICAgICAgICAgICAgICAgICAgICAvLyBjYW4gb25seSBoYXZlIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0RWxlbWVudChtc2dQYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0TWVzc2FnZShzb2FwSGVhZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRQYXJ0KHNvYXBIZWFkZXIuZ2V0UGFydCgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nTWVzc2FnZSkgewotICAgICAgICAgICAgICAgICAgICBBeGlzQmluZGluZ01lc3NhZ2UgYmluZGluZ01lc3NhZ2UgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKSBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBzb2FwSGVhZGVycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExpc3QpIGJpbmRpbmdNZXNzYWdlLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvYXBIZWFkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ01lc3NhZ2Uuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9IRUFERVIsIHNvYXBIZWFkZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzb2FwSGVhZGVycy5hZGQoaGVhZGVyTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEhlYWRlcikgewotCi0gICAgICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJNZXNzYWdlIGhlYWRlck1lc3NhZ2UgPSBuZXcgU09BUEhlYWRlck1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJNZXNzYWdlLnNldE5hbWVzcGFjZVVSSShzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJNZXNzYWdlLnNldFVzZShzb2FwSGVhZGVyLmdldFVzZSgpKTsKLSAgICAgICAgICAgICAgICBCb29sZWFuIHJlcXVpcmVkID0gc29hcEhlYWRlci5nZXRSZXF1aXJlZCgpOwotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlcXVpcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0UmVxdWlyZWQocmVxdWlyZWQuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB3c2RsNGpEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIHJlbGV2YW50IHNjaGVtYSBwYXJ0IGZyb20gdGhlIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gd3NkbDRqRGVmaW5pdGlvbi5nZXRNZXNzYWdlKHNvYXBIZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvIGkxOG4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgibWVzc2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc29hcEhlYWRlci5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCBpbiB0aGUgV1NETCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQYXJ0IG1zZ1BhcnQgPSBtc2cuZ2V0UGFydChzb2FwSGVhZGVyLmdldFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtc2dQYXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG8gaTE4biB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJtZXNzYWdlIHBhcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNvYXBIZWFkZXIuZ2V0UGFydCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgZm91bmQgaW4gdGhlIFdTREwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyTWVzc2FnZS5zZXRFbGVtZW50KG1zZ1BhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhlYWRlck1lc3NhZ2Uuc2V0TWVzc2FnZShzb2FwSGVhZGVyLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgICAgICBoZWFkZXJNZXNzYWdlLnNldFBhcnQoc29hcEhlYWRlci5nZXRQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0JpbmRpbmdNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBiaW5kaW5nTWVzc2FnZSA9IChBeGlzQmluZGluZ01lc3NhZ2UpIGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgICAgICBMaXN0IHNvYXBIZWFkZXJzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTGlzdCkgYmluZGluZ01lc3NhZ2UuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9IRUFERVIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc29hcEhlYWRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nTWVzc2FnZS5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX0hFQURFUiwgc29hcEhlYWRlcnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJzLmFkZChoZWFkZXJNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpIHsKLQotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKSB3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgICAgICAgICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZyA9IChBeGlzQmluZGluZykgZGVzY3JpcHRpb247Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZy5zZXRUeXBlKHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpKTsKLQotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IHNvYXBCaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETENvbnN0YW50cy5XU0RMXzFfMV9TVFlMRSwgc3R5bGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVAxMkJpbmRpbmcpIHsKLQotICAgICAgICAgICAgICAgIFNPQVAxMkJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUDEyQmluZGluZykgd3NkbDRqRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSAoQXhpc0JpbmRpbmcpIGRlc2NyaXB0aW9uOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gc29hcEJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUodHJhbnNwb3J0VVJJKTsKLQotICAgICAgICAgICAgfSBlbHNlIGlmICh3c2RsNGpFeHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgSFRUUEJpbmRpbmcgaHR0cEJpbmRpbmcgPSAoSFRUUEJpbmRpbmcpIHdzZGw0akV4dGVuc2liaWxpdHlFbGVtZW50OwotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nIGF4aXNCaW5kaW5nID0gKEF4aXNCaW5kaW5nKSBkZXNjcmlwdGlvbjsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGJpbmRpbmcgc3R5bGUgc2FtZSBhcyB0aGUgd3NkMiB0byBwcm9jZXNzIHNtb290aGx5Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0VHlwZShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9NRVRIT0QsIGh0dHBCaW5kaW5nLmdldFZlcmIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQb2xpY3lBdHRhY2htZW50UG9pbnQoQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IC0xOyAvLyBBdHRhY2htZW50IFBvaW50IE5vdCBJZGVudGlmaWVkCi0KLSAgICAgICAgaWYgKFNFUlZJQ0UuZXF1YWxzKG9yaWdpbk9mRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gUG9saWN5SW5jbHVkZS5TRVJWSUNFX1BPTElDWTsKLSAgICAgICAgfSBlbHNlIGlmIChQT1JULmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuUE9SVF9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoQklORElORy5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLkJJTkRJTkdfUE9MSUNZOwotICAgICAgICB9IGVsc2UgaWYgKEJJTkRJTkdfT1BFUkFUSU9OLmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuQklORElOR19PUEVSQVRJT05fUE9MSUNZOwotICAgICAgICB9IGVsc2UgaWYgKEJJTkRJTkdfT1BFUkFUSU9OX0lOUFVULmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuQklORElOR19JTlBVVF9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoQklORElOR19PUEVSQVRJT05fT1VUUFVULmVxdWFscyhvcmlnaW5PZkV4dGVuc2liaWxpdHlFbGVtZW50cykpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFBvbGljeUluY2x1ZGUuQklORElOR19PVVRQVVRfUE9MSUNZOwotICAgICAgICB9IGVsc2UgaWYgKFBPUlRfVFlQRS5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLlBPUlRfVFlQRV9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoUE9SVF9UWVBFX09QRVJBVElPTi5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLk9QRVJBVElPTl9QT0xJQ1k7Ci0gICAgICAgIH0gZWxzZSBpZiAoUE9SVF9UWVBFX09QRVJBVElPTl9JTlBVVC5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLklOUFVUX1BPTElDWTsKLSAgICAgICAgfSBlbHNlIGlmIChQT1JUX1RZUEVfT1BFUkFUSU9OX09VVFBVVC5lcXVhbHMob3JpZ2luT2ZFeHRlbnNpYmlsaXR5RWxlbWVudHMpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQb2xpY3lJbmNsdWRlLk9VVFBVVF9QT0xJQ1k7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNUcmFjZUVuYWJsZWQpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgiZ2V0UG9saWN5QXR0YWNobWVudFBvaW50OjogYXhpc0Rlc2NyaXB0aW9uPSIgKyBkZXNjcmlwdGlvbiArCi0gICAgICAgICAgICAgICAgICAgICAgIiBleHRlbnNpYmlsaXR5UG9pbnQ9IiArIG9yaWdpbk9mRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICsgIiByZXN1bHQ9IiArIHJlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgZm9yIHRoZSB3cmFwcGFibGUgb3BlcmF0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHN0eWxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmluZGluZwotICAgICAqIEByZXR1cm4gTGlzdCBvZiBCaW5kaW5nT3BlcmF0aW9uRW50cnkgb2JqZWN0cwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBmaW5kV3JhcHBhYmxlQmluZGluZ09wZXJhdGlvbnMoQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIC8vIGZpcnN0IGZpbmQgdGhlIGdsb2JhbCBzdHlsZSBkZWNsYXJhdGlvbi4KLSAgICAgICAgLy8gZm9yIGEgU09BUCBiaW5kaW5nIHRoaXMgY2FuIGJlIG9ubHkgcnBjIG9yIGRvY3VtZW50Ci0gICAgICAgIC8vIGFzIHBlciB0aGUgV1NETCBzcGVjIChzZWN0aW9uIDMuNCkgdGhlIGRlZmF1bHQgc3R5bGUgaXMgZG9jdW1lbnQKLQotICAgICAgICAvLyBub3cgd2UgaGF2ZSB0byBoYW5kbGUgdGhlIGh0dHAgYmluZGluZ3MgY2FzZSBhcyB3ZWxsCi0gICAgICAgIC8vCi0KLSAgICAgICAgYm9vbGVhbiBpc1JQQyA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGlzU09BUEJpbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpc0h0dHBCaW5kaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChleHRFbGVtZW50cy5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQmluZGluZykgewotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBnbG9iYWwgU09BUCBiaW5kaW5nIQotICAgICAgICAgICAgICAgIGlzU09BUEJpbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gKFNPQVBCaW5kaW5nKSBleHRFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFJQQ19TVFlMRS5lcXVhbHMoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBnbG9iYWwgc3R5bGUgdG8gcnBjCi0gICAgICAgICAgICAgICAgICAgIGlzUlBDID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nVHlwZSA9IEJJTkRJTkdfVFlQRV9TT0FQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50cy5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQMTJCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGdsb2JhbCBTT0FQIGJpbmRpbmchCi0gICAgICAgICAgICAgICAgaXNTT0FQQmluZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgU09BUDEyQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQMTJCaW5kaW5nKSBleHRFbGVtZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKFJQQ19TVFlMRS5lcXVhbHMoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBnbG9iYWwgc3R5bGUgdG8gcnBjCi0gICAgICAgICAgICAgICAgICAgIGlzUlBDID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhpcy5iaW5kaW5nVHlwZSA9IEJJTkRJTkdfVFlQRV9TT0FQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleHRFbGVtZW50cy5nZXQoaSkgaW5zdGFuY2VvZiBIVFRQQmluZGluZykgewotICAgICAgICAgICAgICAgIGlzSHR0cEJpbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXMuYmluZGluZ1R5cGUgPSBCSU5ESU5HX1RZUEVfSFRUUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkJpbmRpbmcgTmFtZSAgICA9IiArIGJpbmRpbmcuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgaXNTT0FQQmluZGluZyA9IiArIGlzU09BUEJpbmRpbmcgKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpc0h0dHBCaW5kaW5nID0iICsgaXNIdHRwQmluZGluZyApOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlzUlBDICAgICAgICAgPSIgKyBpc1JQQyApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ28gdGhyb3VnaCBldmVyeSBvcGVyYXRpb24gYW5kIGdldCB0aGVpciBzdHlsZXMuCi0gICAgICAgIC8vIGVhY2ggb25lIGNhbiBoYXZlIGEgc3R5bGUgb3ZlcnJpZGUgZnJvbSB0aGUgZ2xvYmFsCi0gICAgICAgIC8vIHN0eWxlcy4gRGVwZW5kaW5nIG9uIHRoZSBzdHlsZSBhZGQgdGhlIHJlbGV2YW50IG9wZXJhdGlvbnMKLSAgICAgICAgLy8gdG8gdGhlIHJldHVybiBsaXN0Ci0gICAgICAgIExpc3QgcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBpZiAoaXNIdHRwQmluZGluZyB8fCBpc1NPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYmluZGluZ09wZXJhdGlvbnNJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBiaW5kaW5nT3BlcmF0aW9uc0l0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ09wID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgQmluZGluZyBPcGVyYXRpb24gID0iICsgYmluZGluZ09wLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc1NPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZSA9IGdldFNPQVBTdHlsZShiaW5kaW5nT3ApOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIFNPQVBTdHlsZSAgPSIgKyBzdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0eWxlIHNwZWNpZmllZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBnbG9iYWwgc3R5bGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcHV0IHRoaXMgb25lIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JQQykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiAgICBzY2hlbWEgd3JhcHBlcmluZyByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCaW5kaW5nT3BlcmF0aW9uRW50cnkoYmluZGluZ09wLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChib2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJQQ19TVFlMRS5lcXVhbHMoc3R5bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIHNjaGVtYSB3cmFwcGVyaW5nIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uRW50cnkgYm9lID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25FbnRyeShiaW5kaW5nT3AsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5MaXN0LmFkZChib2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBSUEMgd2UganVzdCBsZWF2ZSBpdCAtIGRlZmF1bHQgaXMgZG9jCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaS5lIGFuIGh0dHAgYmluZGluZyB0aGVuIHdlIGhhdmUgdG8gYWRkIHRoZSBvcGVyYXRpb24gYW55IHdheQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiICAgIHNjaGVtYSB3cmFwcGVyaW5nIHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkVudHJ5IGJvZSA9IAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25FbnRyeShiaW5kaW5nT3AsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQoYm9lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgYmluZGluZyBpcyBub3QgZWl0aGVyIHNvYXAgb3IgaHR0cCBiaW5kaW5nIHRoZW4gd2UgcmV0dXJuIGFuZCBlbXB0eSBsaXN0Ci0KLSAgICAgICAgLy8gc2V0IHRoaXMgdG8gdGhlIGdsb2JhbCBsaXN0Ci0gICAgICAgIHdyYXBwYWJsZUJPRXMgPSByZXR1cm5MaXN0OwotICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHdWVzcyB0aGUgTUVQIGJhc2VkIG9uIHRoZSBvcmRlciBvZiBtZXNzYWdlcwotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TUVQKE9wZXJhdGlvbiBvcGVyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICAgICAgaWYgKGlzU2VydmVyU2lkZSkgewotICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldEZhdWx0cygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuTk9USUZJQ0FUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbm5vdCBEZXRlcm1pbmUgdGhlIE1FUCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW5ub3QgRGV0ZXJtaW5lIHRoZSBNRVAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJDYW5ub3QgRGV0ZXJtaW5lIHRoZSBNRVAiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIGV4dGVuc2lvbiBhdHRyaWJ1dGVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0QXR0cmlidXRlcwotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBvcmlnaW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weUV4dGVuc2lvbkF0dHJpYnV0ZXMoTWFwIGV4dEF0dHJpYnV0ZXMsCi0JCQlBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIFN0cmluZyBvcmlnaW4pIHsKLQotCQlRTmFtZSBrZXk7Ci0JCVFOYW1lIHZhbHVlOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRBdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWtleSA9IChRTmFtZSkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAoQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMuZXF1YWxzKGtleS5nZXROYW1lc3BhY2VVUkkoKSkKLQkJCQkJJiYgIlBvbGljeVVSSXMiLmVxdWFscyhrZXkuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0KLQkJCQl2YWx1ZSA9IChRTmFtZSkgZXh0QXR0cmlidXRlcy5nZXQoa2V5KTsKLQkJCQlTdHJpbmcgcG9saWN5VVJJcyA9IHZhbHVlLmdldExvY2FsUGFydCgpOwotCi0JCQkJaWYgKHBvbGljeVVSSXMubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlTdHJpbmdbXSB1cmlzID0gcG9saWN5VVJJcy5zcGxpdCgiICIpOwotCi0JCQkJCVBvbGljeVJlZmVyZW5jZSByZWY7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpcy5sZW5ndGg7IGkrKykgewotCQkJCQkJcmVmID0gbmV3IFBvbGljeVJlZmVyZW5jZSgpOwotCQkJCQkJcmVmLnNldFVSSSh1cmlzW2ldKTsKLQotCQkJCQkJaWYgKFBPUlRfVFlQRS5lcXVhbHMob3JpZ2luKQotCQkJCQkJICAgICAgICB8fCBQT1JUX1RZUEVfT1BFUkFUSU9OLmVxdWFscyhvcmlnaW4pCi0JCQkJCQkgICAgICAgIHx8IFBPUlRfVFlQRV9PUEVSQVRJT05fSU5QVVQuZXF1YWxzKG9yaWdpbikgCi0JCQkJCQkgICAgICAgIHx8IFBPUlRfVFlQRV9PUEVSQVRJT05fT1VUUFVULmVxdWFscyhvcmlnaW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0JCQkJCQkgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCSAgICAgICAgUG9saWN5U3ViamVjdCBzdWJqZWN0ID0gZGVzY3JpcHRpb24uZ2V0UG9saWN5U3ViamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCSAgICAgICAgaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJCQkJICAgICAgICAgICAgc3ViamVjdC5hdHRhY2hQb2xpY3lSZWZlcmVuY2UocmVmKTsKLQkJCQkJCSAgICAgICAgfQotCQkJCQkJICAgIH0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotICAgIC8qKgotCSAqIFByb2Nlc3MgdGhlIHBvbGljeSBkZWZpbml0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBkZWZpbml0aW9uCi0JICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY2llc0luRGVmaW50aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBwcm9jZXNzUG9saWNpZXNJbkRlZmludGlvbihkZWZpbml0aW9uLCBuZXcgSGFzaFNldCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBQcm9jZXNzIHRoZSBwb2xpY3kgZGVmaW5pdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gZGVmaW5pdGlvbgotCSAqLwotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUG9saWNpZXNJbkRlZmludGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFNldCB2aXNpdGVkV1NETHMpIHsKLSAgICAgICAgdmlzaXRlZFdTRExzLmFkZChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGRlZmluaXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQ7Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1bmtub3duID0gbnVsbDsKLSAgICAgICAgUG9saWN5IHBvbGljeSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB1bmtub3duID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5XU0RMMTFDb25zdGFudHMuUE9MSUNZLmVxdWFscyh1bmtub3duLmdldEVsZW1lbnRUeXBlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gKFBvbGljeSkgUG9saWN5VXRpbC5nZXRQb2xpY3lDb21wb25lbnQodW5rbm93bi5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGtleSA9IHBvbGljeS5nZXROYW1lKCkpICE9IG51bGwgfHwgKGtleSA9IHBvbGljeS5nZXRJZCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAlheGlzU2VydmljZS5yZWdpc3RlclBvbGljeShrZXksIHBvbGljeSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyKGtleSwgcG9saWN5KTsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoIiMiICsga2V5LCBwb2xpY3kpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaW5jbHVkZSBwb2xpY2ljZXMgaW4gb3RoZXIgaW1wb3J0ZWQgd3NkbHMKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGRlZmluaXRpb24uZ2V0SW1wb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIFZlY3RvciB2YWx1ZXMgPSBudWxsOwotICAgICAgICBJbXBvcnQgd3NkbEltcG9ydCA9IG51bGw7Ci0gICAgICAgIGZvciAoOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHZhbHVlcyA9IChWZWN0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciB2YWx1ZXNJdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IHZhbHVlc0l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIHdzZGxJbXBvcnQgPSAoSW1wb3J0KSB2YWx1ZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGlubmVyRGVmaW5pdGlvbiA9IHdzZGxJbXBvcnQuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGJpbmRpbmcgcmVjdXJzaXZlbHkKLSAgICAgICAgICAgICAgICBpZighdmlzaXRlZFdTRExzLmNvbnRhaW5zKGlubmVyRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1BvbGljaWVzSW5EZWZpbnRpb24oaW5uZXJEZWZpbml0aW9uLCB2aXNpdGVkV1NETHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0RW5kcG9pbnRVUkwoQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwgU3RyaW5nIGVuZHBvaW50VVJMKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJYXhpc0VuZHBvaW50LnNldEVuZHBvaW50VVJMKGVuZHBvaW50VVJMKTsKLSAgICAJdHJ5IHsKLSAgICAJCVVSTCB1cmwgPSBuZXcgVVJMKGVuZHBvaW50VVJMKTsKLSAgICAJCWF4aXNFbmRwb2ludC5zZXRUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHVybC5nZXRQcm90b2NvbCgpKTsKLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCWxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSxlKTsKLQkJfSAgICAJCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbm5lciBjbGFzcyBkZWNsYXJhdGlvbiBmb3IgdGhlIHByb2Nlc3NpbmcgZXhjZXB0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV1NETFByb2Nlc3NpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgcHVibGljIFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdTRExQcm9jZXNzaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXU0RMUHJvY2Vzc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXU0RMUHJvY2Vzc2luZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWxsUG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBpc0FsbFBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbFBvcnRzKGJvb2xlYW4gYWxsUG9ydHMpIHsKLSAgICAgICAgaXNBbGxQb3J0cyA9IGFsbFBvcnRzOwotICAgIH0KLQotLy8gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb2xpY2llc0luRGVmaW5pdGlvbigpIHsKLS8vCi0vLyAgICAgICAgT2JqZWN0IG9iajsKLS8vICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd3NkbDRqRGVmaW5pdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0vLyAgICAgICAgICAgIG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLS8vCi0vLyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLS8vICAgICAgICAgICAgICAgIEVsZW1lbnQgZSA9ICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBvYmopLmdldEVsZW1lbnQoKTsKLS8vICAgICAgICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLldTREwxMUNvbnN0YW50cy5QT0xJQ1kuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKGUuZ2V0TmFtZXNwYWNlVVJJKCkpICYmCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETDExQ29uc3RhbnRzLlBPTElDWS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoZS5nZXRMb2NhbE5hbWUoKSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICBQb2xpY3kgcCA9IChQb2xpY3kpIFBvbGljeVV0aWwuZ2V0UG9saWN5Q29tcG9uZW50KGUpOwotLy8gICAgICAgICAgICAgICAgICAgIHJlZy5yZWdpc3RlcihwLmdldElkKCksIHApOwotLy8gICAgICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gc3BsaXQgYXR0cmlidXRlIGxpa2UgYWJjOmNkZSBhbmQgZ2V0IHRoZSBwcmVmaXggcGFydCBvZiBpdAotICAgICAqIHNvIHRoZSBtZXRob2Qgd2lsbCByZXR1ZW4gYWJjIGlmIHRoZSAiOiIgaXMgcHJlc2VudCBpbiB0aGUgdGhlIHN0cmluZyBlbHNlIGl0Ci0gICAgICogd2lsbCByZXR1cm4gbnVsbAotICAgICAqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlICA6IFN0cmluZwotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNwbGl0SWRleCA9IGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChzcGxpdElkZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZygwLCBzcGxpdElkZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkgewotICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHNwbGl0SWRleCA9IGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChzcGxpdElkZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlLnN1YnN0cmluZyhzcGxpdElkZXggKyAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgdGhlIHdzbGQgZGVmaW50aW9uIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUKLSAgICAgKiBAcGFyYW0gdmlzaXRlZFdTRExzCi0gICAgICogQHJldHVybiBkZWZpbml0aW9uIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwcml2YXRlIERlZmluaXRpb24gZ2V0UGFyZW50RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHZpc2l0ZWRXU0RMcyl7Ci0gICAgICAgIHZpc2l0ZWRXU0RMcy5hZGQoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICAgIERlZmluaXRpb24gbmV3UGFyZW50RGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vIGZpcnN0IGZpbmQgdGhyb3VnaCBpbXBvcnRzCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBWZWN0b3IgdmFsdWVzID0gbnVsbDsKLSAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSBudWxsOwotICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICB2YWx1ZXMgPSAoVmVjdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgdmFsdWVzSXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyB2YWx1ZXNJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB3c2RsSW1wb3J0ID0gKEltcG9ydCkgdmFsdWVzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBpbm5lckRlZmluaXRpb24gPSB3c2RsSW1wb3J0LmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRXU0RMcy5jb250YWlucyhpbm5lckRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50RGVmaW5pdGlvbiA9IGdldFBhcmVudERlZmluaXRpb24oaW5uZXJEZWZpbml0aW9uLHFuYW1lLGNvbXBvbmVudFR5cGUsdmlzaXRlZFdTRExzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmVudERlZmluaXRpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdQYXJlbnREZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGl0IG5vdCBhdmFpbGFibGUgaW4gaW1wb3J0cyB3ZSBjaGVjayBmb3IgdGhlIGN1cnJlbnQgZGVmaW5pdGlvbi4KLSAgICAgICAgaWYgKG5ld1BhcmVudERlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gdGhpcyBjYW4gYmUgaW4gYSBpbXBvcnRlZCB3c2RsCi0gICAgICAgICAgICBpZiAoaXNDb21wb25ldEF2YWlsYWJsZShkZWZpbml0aW9uLCBxbmFtZSwgY29tcG9uZW50VHlwZSkpIHsKLSAgICAgICAgICAgICAgICBuZXdQYXJlbnREZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXdQYXJlbnREZWZpbml0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBvbmV0QXZhaWxhYmxlKERlZmluaXRpb24gZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBxbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50VHlwZSl7Ci0gICAgICAgIGJvb2xlYW4gaXNBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgc3dpdGNoIChjb21wb25lbnRUeXBlKXsKLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX0JJTkRJTkcgOiB7Ci0gICAgICAgICAgICAgICAgaXNBdmFpbGFibGUgPSAoZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluaXRpb24uZ2V0QmluZGluZyhxbmFtZSkuZ2V0UG9ydFR5cGUoKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX1BPUlRfVFlQRSA6IHsKLSAgICAgICAgICAgICAgICBpc0F2YWlsYWJsZSA9IChkZWZpbml0aW9uLmdldFBvcnRUeXBlKHFuYW1lKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ09NUE9ORU5UX01FU1NBR0UgOiB7Ci0gICAgICAgICAgICAgICAgaXNBdmFpbGFibGUgPSAoZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHFuYW1lKSAhPSBudWxsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNBdmFpbGFibGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpbmQgQmluZGluZ09wZXJhdGlvbkVudHJ5Ci0gICAgICogQHBhcmFtIGJvZXMgTGlzdCBvZiBCaW5kaW5nT3BlcmF0aW9uRW50cnkKLSAgICAgKiBAcGFyYW0gYm8gQmluZGluZ09wZXJhdGlvbiAKLSAgICAgKiBAcmV0dXJuIEJpbmRpbmdPcGVyYXRpb24gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbkVudHJ5IGZpbmQoTGlzdCBib2VzLCBCaW5kaW5nT3BlcmF0aW9uIGJvKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJvZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25FbnRyeSBib2UgPSAoQmluZGluZ09wZXJhdGlvbkVudHJ5KSBib2VzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChib2UuZ2V0QmluZGluZ09wZXJhdGlvbigpID09IGJvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJvZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQmluZGluZ09wZXJhdGlvbiBwbHVzIHN0YXRlIGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgY2xhc3MgQmluZGluZ09wZXJhdGlvbkVudHJ5IHsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTT0FQQmluZGluZzsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzSFRUUEJpbmRpbmc7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNvYXBTdHlsZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUlBDOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gd3JhcHBlZElucHV0ID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHdyYXBwZWRPdXRwdXQgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb25FbnRyeShCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIGJvb2xlYW4gaXNTT0FQQmluZGluZywgYm9vbGVhbiBpc0hUVFBCaW5kaW5nLCBTdHJpbmcgc29hcFN0eWxlLCBib29sZWFuIGlzUlBDKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5iaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgICAgIHRoaXMuaXNTT0FQQmluZGluZyA9IGlzU09BUEJpbmRpbmc7Ci0gICAgICAgICAgICB0aGlzLmlzSFRUUEJpbmRpbmcgPSBpc0hUVFBCaW5kaW5nOwotICAgICAgICAgICAgdGhpcy5zb2FwU3R5bGUgPSBzb2FwU3R5bGU7Ci0gICAgICAgICAgICB0aGlzLmlzUlBDID0gaXNSUEM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzSFRUUEJpbmRpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNIVFRQQmluZGluZzsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NPQVBCaW5kaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzU09BUEJpbmRpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTb2FwU3R5bGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcFN0eWxlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JQQygpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1JQQzsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHdyYXBwZXIgeHNkIGlzIHVzZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JhcHBlZElucHV0KCkgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRJbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gd3JhcHBlZElucHV0IGluZGljYXRlIGlmIHdyYXBwZXIgeHNkIGlzIG5lZWRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0V3JhcHBlZElucHV0KGJvb2xlYW4gd3JhcHBlZElucHV0KSB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWRJbnB1dCA9IHdyYXBwZWRJbnB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgd3JhcHBlciB4c2QgaXMgbmVlZGVkIGZvciB0aGUgb3V0cHV0IG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JhcHBlZE91dHB1dCgpIHsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkT3V0cHV0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSB3cmFwcGVkT3V0cHV0IGluZGljYXRlIGlmIHdyYXBwZXIgeHNkIGlzIG5lZWRlZCBvbiB0aGUgb3V0cHV0IG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFdyYXBwZWRPdXRwdXQoYm9vbGVhbiB3cmFwcGVkT3V0cHV0KSB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWRPdXRwdXQgPSB3cmFwcGVkT3V0cHV0OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwyMERlZmF1bHRWYWx1ZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFkMTRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBkZWZhdWx0VmFsdWVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdIVFRQX01FVEhPRF9XU0RMWF9TQUZFID0gIndodHRwOm1ldGhvZFdTRExzYWZlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSFRUUF9NRVRIT0RfV1NETFhfTk9UU0FGRSA9ICJ3aHR0cDptZXRob2RXU0RMTm90c2FmZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SX0RFRkFVTFQgPSAiJiI7Ci0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLCAiXFxcIlxcXCIiKTsKLSAgICAgICAgZGVmYXVsdFZhbHVlc01hcC5wdXQoV0hUVFBfTUVUSE9EX1dTRExYX1NBRkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfR0VUKTsKLSAgICAgICAgZGVmYXVsdFZhbHVlc01hcC5wdXQoV0hUVFBfTUVUSE9EX1dTRExYX1NBRkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfUE9TVCk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SX0RFRkFVTFQpOwotICAgICAgICBkZWZhdWx0VmFsdWVzTWFwLnB1dChXU0RMQ29uc3RhbnRzLldTRExfMV8xX1NUWUxFLCBXU0RMQ29uc3RhbnRzLlNUWUxFX0RPQyk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZXNNYXAucHV0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTUVQLFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGRlZmF1bHRWYWx1ZXNNYXAuZ2V0KG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhMDJjMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLlNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIgY2xhc3MgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5IHRvIHJldHVybgotICogbXVsdGlwbGUgQXhpc1NlcnZpY2Ugb2JqZWN0czsgb25lIGZvciBlYWNoIGVuZHBvaW50IG9uIGVhY2ggc2VydmljZSBpbiB0aGUgV1NETCAyLjAgZmlsZS4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMFRvQWxsQXhpc1NlcnZpY2VzQnVpbGRlciBleHRlbmRzIFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPQotICAgICAgICAgICAgTG9nRmFjdG9yeS5nZXRMb2coV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBheGlzU2VydmljZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3MgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gLSBDb250YWlucyB0aGUgd3NkbCAyLjAgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoSW5wdXRTdHJlYW0gaW4pIHsKLSAgICAgICAgc3VwZXIoaW4sIG51bGwsIG51bGwpOwotICAgICAgICBheGlzU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOyAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBBcnJheUxpc3QKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKFN0cmluZyB3c2RsVXJpLCBTdHJpbmcgZW5kcG9pbnROYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHdzZGxVcmksIG51bGwsIGVuZHBvaW50TmFtZSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlcyA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7ICAgLy8gY3JlYXRlIGFuIGVtcHR5IEFycmF5TGlzdAotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1YmxpYyBtZXRob2QgdG8gYWNjZXNzIHRoZSB3c2RsIDIuMCBmaWxlIGFuZCBjcmVhdGUgYSBMaXN0IG9mIEF4aXNTZXJ2aWNlIG9iamVjdHMuCi0gICAgICogRm9yIGVhY2ggZW5kcG9pbnQgb24gZWFjaCBzZXJ2aWNlIGluIHRoZSB3c2RsLCBhbiBBeGlzU2VydmljZSBvYmplY3QgaXMgY3JlYXRlZCBhbmQKLSAgICAgKiBhZGRlZCB0byB0aGUgTGlzdC4gIFRoZSBuYW1lIG9mIHRoZSBBeGlzU2VydmljZSBpcyBjaGFuZ2VkIGZyb20gdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIHRvIHRoZSB0aGUgZm9sbG93aW5nOiA8c2VydmljZSBuYW1lPiM8ZW5kcG9pbnQgbmFtZT4uICBOb3RlIHRoYXQgdGhlIGVuZHBvaW50IG5hbWUKLSAgICAgKiBpcyBub3QgdW5pcXVlIHRvIGEgd3NkbCAyLjAgZmlsZS4gIE11bHRpcGxlIHNlcnZpY2VzIGluIHRoZSBmaWxlIG1heSBoYXZlIGVuZHBvaW50cwotICAgICAqIHdpdGggdGhlIHNhbWUgbmFtZS4gIFRoZXJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgQXhpc1NlcnZpY2UgbmVlZHMgdG8gYmUgYSBjb21iaW5hdGlvbgotICAgICAqIG9mIHNlcnZpY2UvZW5kcG9pbnQgbmFtZSB0byBiZSB1bmlxdWUgdG8gdGhlIHdzZGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgTGlzdCBjb250YWluaW5nIG9uZSBBeGlzU2VydmljZSBvYmplY3QgZm9yIGVhY2ggcG9ydCBpbiB0aGUgd3NkbCBmaWxlLgotICAgICAqICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEF4aXNTZXJ2aWNlIGlzIG1vZGlmaWVkIHRvIHVuaXF1ZWx5IHJlcHJlc2VudCB0aGUgc2VydmljZS9lbmRwb2ludAotICAgICAqICAgICAgICAgcGFpci4gIFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgaXMgIjx3c2RsIHNlcnZpY2UgbmFtZT4jPHdzZGwgZW5kcG9pbnQgbmFtZT4iCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxBeGlzU2VydmljZT4gcG9wdWxhdGVBbGxTZXJ2aWNlcygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbnRyeTogcG9wdWxhdGVBbGxTZXJ2aWNlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0dXAoKTsgIC8vIHNldHVwIGNvbnRhaW5zIGNvZGUgd2l0aCBnYXRoZXJzIG5vbi1zZXJ2aWNlIHNwZWNpZmljIGluZm8KLSAgICAgICAgICAgIC8vIGZyb20gdGhlIFdTREwuICBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBvbmNlIHBlciBXU0RMLgotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGl0OiBwb3B1bGF0ZUFsbFNlcnZpY2VzLiAgd3NkbCBkZXNjcmlwdGlvbiBpcyBudWxsISIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAvLyBjYW4ndCBnbyBhbnkgZnVydGhlciB3aXRob3V0IHRoZSB3c2RsCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBkZXNjcmlwdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzW2ldOwotICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmljZU5hbWUgb24gdGhlIHBhcmVudCB0byBzZXR1cCBjYWxsIHRvIHBvcHVsYXRlU2VydmljZQotICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSByZXRBeGlzU2VydmljZSA9IHBvcHVsYXRlU2VydmljZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0QXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VzLmFkZChyZXRBeGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmIGF4aXNTZXJ2aWNlIHdhcyByZXR1cm5lZAotICAgICAgICAgICAgICAgIH0gLy8gZW5kIGZvciBhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4aXQ6IHBvcHVsYXRlQWxsU2VydmljZXMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2VzOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgZTsgIC8vIGp1c3QgcmV0aHJvdyBhbnkgQXhpc0ZhdWx0cwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJwb3B1bGF0ZUFsbFNlcnZpY2VzIGNhdWdodCBFeGNlcHRpb24uICBDb252ZXJ0aW5nIHRvIEF4aXNGYXVsdC4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzNjY1YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uV1NETFJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLldTRExTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5YTUxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uaW50ZXJuYWwuRE9NV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi5pbnRlcm5hbC53c2RsMjAuQmluZGluZ0ZhdWx0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLmludGVybmFsLndzZGwyMC5CaW5kaW5nT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLmludGVybmFsLndzZGwyMC5leHRlbnNpb25zLkludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uaW50ZXJuYWwud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ0V4dGVuc2lvbnNJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uaW50ZXJuYWwud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQSGVhZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLmludGVybmFsLndzZGwyMC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmdFeHRlbnNpb25zSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4uc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLnR5cGVzLk5hbWVzcGFjZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkJpbmRpbmdGYXVsdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5CaW5kaW5nTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLkVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5FbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5JbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuSW50ZXJmYWNlRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuSW50ZXJmYWNlRmF1bHRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuSW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5JbnRlcmZhY2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5lbnVtZXJhdGlvbi5NZXNzYWdlTGFiZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBFbmRwb2ludEV4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnJwYy5Bcmd1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnJwYy5SUENJbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZ0V4dGVuc2lvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZ0ZhdWx0UmVmZXJlbmNlRXh0ZW5zaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQRW5kcG9pbnRFeHRlbnNpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5zb2FwLlNPQVBNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAueG1sLkRlc2NyaXB0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC54bWwuRG9jdW1lbnRhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndvZGVuLndzZGwyMC54bWwuRG9jdW1lbnRhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAueG1sLkludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLnhtbC5UeXBlc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi54bWwuWE1MQXR0cjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnV0aWxzLk5hbWVzcGFjZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotcHVibGljIGNsYXNzIFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyIGV4dGVuZHMgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTREwyMFRvQXhpc1NlcnZpY2VCdWlsZGVyLmNsYXNzKTsKLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpbnRlcmZhY2VOYW1lOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRUYXJnZXROYW1lc3BhY2U7Ci0KLSAgICBwcml2YXRlIE5hbWVzcGFjZURlY2xhcmF0aW9uW10gbmFtZXNwYWNlbWFwOwotCi0gICAgcHJpdmF0ZSBMaXN0IG9wZXJhdGlvbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBOYW1lc3BhY2VNYXAgc3RyaW5nQmFzZWROYW1lc3BhY2VNYXA7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0dXBDb21wbGV0ZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlIHdzZGxTZXJ2aWNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWxsUG9ydHM7Ci0KLSAgICBwcml2YXRlIFVSSVJlc29sdmVyIGN1c3RvbVdTRExSZXNvbHZlcjsKLQotLy8gICAgQXMgYmluZGluZ3MgYXJlIHByb2Nlc3NlZCBhZGQgaXQgdG8gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGRvbnQgcHJvY2VzcyB0aGUgc2FtZSBiaW5kaW5nIHR3aWNlCi0gICAgcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkQmluZGluZ3M7Ci0KLQotICAgIHB1YmxpYyBXU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcihJbnB1dFN0cmVhbSBpbiwgUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuaW4gPSBpbjsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICB0aGlzLmludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNldFBvbGljeVJlZ2lzdHJ5RnJvbVNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcihTdHJpbmcgd3NkbFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmdWxsUGF0aCA9IHdzZGxVcmk7Ci0gICAgICAgIGlmICghd3NkbFVyaS5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHdzZGxVcmkpOwotICAgICAgICAgICAgZnVsbFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJhc2VVcmkoZnVsbFBhdGgpOwotICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVhZEluVGhlV1NETEZpbGUoZnVsbFBhdGgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigiRVJST1IiLCAiRXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgcmVhZGluZyBXU0RMIDIuMCBkb2MiLCBheGlzRmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVzY3JpcHRpb25FbGVtZW50IGRlc2NyaXB0aW9uRWxlbWVudCA9IGRlc2NyaXB0aW9uLnRvRWxlbWVudCgpOwotICAgICAgICBzYXZlZFRhcmdldE5hbWVzcGFjZSA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgICAgICBuYW1lc3BhY2VtYXAgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0RGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gbmV3IFFOYW1lKGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKS50b1N0cmluZygpLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICB0aGlzLmF4aXNTZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNldFBvbGljeVJlZ2lzdHJ5RnJvbVNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMMjBUb0F4aXNTZXJ2aWNlQnVpbGRlcihTdHJpbmcgd3NkbFVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lLCBib29sZWFuIGlzQWxsUG9ydHMpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyh3c2RsVXJpLCBuYW1lLCBpbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgdGhpcy5pc0FsbFBvcnRzID0gaXNBbGxQb3J0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIoU3RyaW5nIHdzZGxVcmksIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKG51bGwsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgdGhpcy53c2RsVVJJID0gd3NkbFVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDIwVG9BeGlzU2VydmljZUJ1aWxkZXIoU3RyaW5nIHdzZGxVcmksIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgc3VwZXIobnVsbCwgc2VydmljZSk7Ci0gICAgICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVcmk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbGxQb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIGlzQWxsUG9ydHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsUG9ydHMoYm9vbGVhbiBhbGxQb3J0cykgewotICAgICAgICBpc0FsbFBvcnRzID0gYWxsUG9ydHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0cyBhIGN1c3RvbSBXU0RMIGxvY2F0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBjdXN0b21SZXNvbHZlciAtIEEgY3VzdG9tIFJlc29sdmVyIHRoYXQgY2FuIHJlc29sdmUgaW1wb3J0cyBhbmQgaW5jbHVkZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21XU0RMUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgY3VzdG9tUmVzb2x2ZXIpIHsKLSAgICAgICAgdGhpcy5jdXN0b21XU0RMUmVzb2x2ZXIgPSBjdXN0b21SZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgcG9wdWxhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNldHVwKCk7Ci0gICAgICAgICAgICAvLyBTZXR0aW5nIHdzZGw0amRlZmludGlvbiB0byBheGlzU2VydmljZSAsIHNvIGlmIHNvbWUgb25lIHdhbnQKLSAgICAgICAgICAgIC8vIHRvIHBsYXkgd2l0aCBpdCBoZSBjYW4gZG8gdGhhdCBieSBnZXR0aW5nIHRoZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsRGVzY3JpcHRpb25QYXJhbXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxEZXNjcmlwdGlvblBhcmFtdGVyLnNldE5hbWUoV1NETENvbnN0YW50cy5XU0RMXzIwX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgICAgIHdzZGxEZXNjcmlwdGlvblBhcmFtdGVyLnNldFZhbHVlKGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcih3c2RsRGVzY3JpcHRpb25QYXJhbXRlcik7Ci0KLSAgICAgICAgICAgIGlmIChpc0NvZGVnZW4pIHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoImlzQ29kZWdlbiIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2V0dGluZyB0YXJnZXQgbmFtZSBzcGFjZQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0VGFyZ2V0TmFtZXNwYWNlKHNhdmVkVGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGRvY3VtZW50YXRpb24gZWxlbWVudHMgaW4gdGhlIHJvb3QuIExldHMgYWRkIHRoZW0gYXMgdGhlIHdzZGxTZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAvLyBidXQgc2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGRvY3VtZW50YXRpb24gZWxlbWVudHMsIGxldHMgb25seSBhZGQgdGhlIGZpcnN0IG9uZQotICAgICAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzU2VydmljZSwgZGVzY3JpcHRpb24udG9FbGVtZW50KCkpOwotLy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uRWxlbWVudFtdIGRvY3VtZW50YXRpb25FbGVtZW50cyA9IGRlc2NyaXB0aW9uLnRvRWxlbWVudCgpLmdldERvY3VtZW50YXRpb25FbGVtZW50cygpOwotLy8gICAgICAgICAgICBpZiAoZG9jdW1lbnRhdGlvbkVsZW1lbnRzICE9IG51bGwgJiYgZG9jdW1lbnRhdGlvbkVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLS8vICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFNlcnZpY2VEZXNjcmlwdGlvbihkb2N1bWVudGF0aW9uRWxlbWVudHNbMF0uZ2V0Q29udGVudCgpLnRvU3RyaW5nKCkpOwotLy8gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZGluZyBucyBpbiB0aGUgb3JpZ2luYWwgV1NETAotICAgICAgICAgICAgLy8gcHJvY2Vzc1BvbGljaWVzSW5EZWZpbnRpb24od3NkbDRqRGVmaW5pdGlvbik7IFRPRE8gOiBEZWZlcmluZyBwb2xpY3kgaGFuZGxpbmcgZm9yIG5vdyAtIENoaW50aGFrYQotICAgICAgICAgICAgLy8gcG9saWN5IHN1cHBvcnQKLQotICAgICAgICAgICAgLy8gc2NoZW1hIGdlbmVyYXRpb24KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBuYW1lc3BhY2VtYXAKLQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0TmFtZXNwYWNlTWFwKHN0cmluZ0Jhc2VkTmFtZXNwYWNlTWFwKTsKLSAgICAgICAgICAgIC8vIFR5cGVEZWZpbml0aW9uW10gdHlwZURlZmluaXRpb25zID0KLSAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uLmdldFR5cGVEZWZpbml0aW9ucygpOwotICAgICAgICAgICAgLy8gZm9yKGludCBpPTA7IGk8dHlwZURlZmluaXRpb25zLmxlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgIC8vIGlmKCJvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hIi5lcXVhbHModHlwZURlZmluaXRpb25zW2ldLmdldENvbnRlbnRNb2RlbCgpKSl7Ci0gICAgICAgICAgICAvLyBheGlzU2VydmljZS5hZGRTY2hlbWEoKFhtbFNjaGVtYSl0eXBlRGVmaW5pdGlvbnNbaV0uZ2V0Q29udGVudCgpKTsKLSAgICAgICAgICAgIC8vIH1lbHNlCi0gICAgICAgICAgICAvLyBpZigib3JnLnczYy5kb20iLmVxdWFscyh0eXBlRGVmaW5pdGlvbnNbaV0uZ2V0Q29udGVudE1vZGVsKCkpKXsKLSAgICAgICAgICAgIC8vIGF4aXNTZXJ2aWNlLmFkZFNjaGVtYShnZXRYTUxTY2hlbWEoKEVsZW1lbnQpdHlwZURlZmluaXRpb25zW2ldLmdldENvbnRlbnQoKSwKLSAgICAgICAgICAgIC8vIG51bGwpKTsKLSAgICAgICAgICAgIC8vIH0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyB9Ci0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQgPSBkZXNjcmlwdGlvbi50b0VsZW1lbnQoKTsKLSAgICAgICAgICAgIFR5cGVzRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBkZXNjcmlwdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldFR5cGVzRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHR5cGVzRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU2NoZW1hW10gc2NoZW1hcyA9IHR5cGVzRWxlbWVudC5nZXRTY2hlbWFzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWFEZWZpbml0aW9uID0gc2NoZW1hc1tpXS5nZXRTY2hlbWFEZWZpbml0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV1NETCAyLjAgc3BlYyByZXF1aXJlcyB0aGF0IGV2ZW4gdGhlIGJ1aWx0LWluIHNjaGVtYSBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhc2tlZCBmb3Igc2NoZW1hIGRlZmluaXRpb25zLiBCdXQgZm9yIGRhdGEgYmluZGluZyBwdXJwb3NlcyB3ZSBjYW4gaWdub3JlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYURlZmluaXRpb24gIT0gbnVsbCAmJiAhQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNjaGVtYURlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRTY2hlbWEoc2NoZW1hRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2Nlc3NTZXJ2aWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbmRwb2ludHMoSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBFbmRwb2ludFtdIGVuZHBvaW50cyA9IHdzZGxTZXJ2aWNlLmdldEVuZHBvaW50cygpOwotCi0gICAgICAgIGlmIChlbmRwb2ludHMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIk5vIGVuZHBvaW50cyBmb3VuZCBpbiB0aGUgV1NETCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc2VkQmluZGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBFbmRwb2ludCBlbmRwb2ludCA9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGludGVyZmFjZSBuYW1lIGlzIG5vdCBudWxsIHRoYXRzIG1lYW5zIHRoYXQgdGhpcyBpcyBhIGNhbGwgZnJvbSB0aGUgY29kZWdlbiBlbmdpbmUKLSAgICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcG9wdWxhdGUgYSBzaW5nbGUgZW5kcG9pbnQuIEhlbmNlIGZpbmQgdGhlIGVuZHBvaW50IGFuZCBwb3B1bGF0ZSBpdC4KLSAgICAgICAgLy8gSWYgdGhhdCB3YXMgbm90IHRoZSBjYXNlIHRoZW4gd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjYWxsIGlzIGZyb20gdGhlIGNvZGVnZW4KLSAgICAgICAgLy8gZW5naW5lIHdpdGggdGh3IGFsbHBvcnRzIGNoZWNrIGZhbHNlLiBJZiBpdHMgc28gbm8gbmVlZCB0byBwb3B1bGF0ZSBhbGwgZW5kcG9pbnRzLCB3ZQotICAgICAgICAvLyBzZWxlY3QgYW4gZW5zcG9pbnQgYWNjcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBjcml0ZXJpYS4KLSAgICAgICAgLy8gMS4gRmluZCB0aGUgZmlyc3QgU09BUCAxLjIgZW5kcG9pbnQKLSAgICAgICAgLy8gMi4gRmluZCB0aGUgZmlyc3QgU09BUCAxLjEgZW5kcG9pbnQKLSAgICAgICAgLy8gMy4gVXNlIHRoZSBmaXJzdCBlbmRwb2ludAotICAgICAgICBpZiAodGhpcy5pbnRlcmZhY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kcG9pbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJmYWNlTmFtZS5lcXVhbHMoZW5kcG9pbnRzW2ldLmdldE5hbWUoKS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBmb3VuZCBpdC4gIFN0b3AgbG9va2luZwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gZW5kcG9pbnQgZm91bmQgZm9yIHRoZSBnaXZlbiBuYW1lIDoiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC5hZGRFbmRwb2ludChlbmRwb2ludC5nZXROYW1lKCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbmRwb2ludChlbmRwb2ludCwgc2VydmljZUludGVyZmFjZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDb2RlZ2VuICYmICF0aGlzLmlzQWxsUG9ydHMpIHsKLSAgICAgICAgICAgIEVuZHBvaW50IHNvYXAxMUVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kcG9pbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZW5kcG9pbnRzW2ldLmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVAuZXF1YWxzKGJpbmRpbmcuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nRXh0ZW5zaW9ucyBzb2FwQmluZGluZ0V4dGVuc2lvbnM7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0V4dGVuc2lvbnMgPSAoU09BUEJpbmRpbmdFeHRlbnNpb25zSW1wbCkgYmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50RXh0ZW5zaW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJJKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9TT0FQKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTb2FwIEJpbmRpbmcgRXh0ZW50aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghV1NETDJDb25zdGFudHMuU09BUF9WRVJTSU9OXzFfMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZm91bmQgaXQuICBTdG9wIGxvb2tpbmcKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb2FwMTFFbmRwb2ludCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAxMUVuZHBvaW50ID0gZW5kcG9pbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZHBvaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLmFkZEVuZHBvaW50KGVuZHBvaW50LmdldE5hbWUoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0VuZHBvaW50KGVuZHBvaW50LCBzZXJ2aWNlSW50ZXJmYWNlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkRW5kcG9pbnQoZW5kcG9pbnRzW2ldLmdldE5hbWUoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFbmRwb2ludChlbmRwb2ludHNbaV0sIHNlcnZpY2VJbnRlcmZhY2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsICYmIGVuZHBvaW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBlbmRwb2ludCA9IGVuZHBvaW50c1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmRwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludE5hbWUoZW5kcG9pbnQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0QmluZGluZ05hbWUoZW5kcG9pbnQuZ2V0QmluZGluZygpLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5zZXRFbmRwb2ludFVSTChlbmRwb2ludC5nZXRBZGRyZXNzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZVtdIHNlcnZpY2VzID0gZGVzY3JpcHRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyB3c2RsU2VydmljZSBmb3VuZCBpbiB0aGUgV1NETCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUuZXF1YWxzKHNlcnZpY2VzW2ldLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbFNlcnZpY2UgPSBzZXJ2aWNlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBmb3VuZCBpdC4gU3RvcCBsb29raW5nLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3c2RsU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU2VydmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBub3QgZm91bmQgaW4gdGhlIFdTREwgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgd3NkbFNlcnZpY2UgPSBzZXJ2aWNlc1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUod3NkbFNlcnZpY2UuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UgPSB3c2RsU2VydmljZS5nZXRJbnRlcmZhY2UoKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoV1NETDJDb25zdGFudHMuSU5URVJGQUNFX0xPQ0FMX05BTUUsIHNlcnZpY2VJbnRlcmZhY2UuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIHByb2Nlc3NJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSk7Ci0gICAgICAgIGlmIChpc0NvZGVnZW4pIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldE9wZXJhdGlvbnNOYW1lTGlzdChvcGVyYXRpb25OYW1lcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc0VuZHBvaW50cyhzZXJ2aWNlSW50ZXJmYWNlKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgQXhpc0VuZHBvaW50IHByb2Nlc3NFbmRwb2ludChFbmRwb2ludCBlbmRwb2ludCwgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0gbmV3IEF4aXNFbmRwb2ludCgpOwotICAgICAgICBheGlzRW5kcG9pbnQuc2V0UGFyZW50KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgYXhpc0VuZHBvaW50LnNldE5hbWUoZW5kcG9pbnQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICBzZXRFbmRwb2ludFVSTChheGlzRW5kcG9pbnQsIGVuZHBvaW50LmdldEFkZHJlc3MoKS50b1N0cmluZygpKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZW5kcG9pbnQuZ2V0QmluZGluZygpOwotICAgICAgICBBeGlzQmluZGluZyBheGlzQmluZGluZzsKLSAgICAgICAgaWYgKHByb2Nlc3NlZEJpbmRpbmdzLmNvbnRhaW5zS2V5KGJpbmRpbmcuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmcgPSAoQXhpc0JpbmRpbmcpIHByb2Nlc3NlZEJpbmRpbmdzLmdldChiaW5kaW5nLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZyA9IHByb2Nlc3NCaW5kaW5nKGJpbmRpbmcsIHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNFbmRwb2ludC5zZXRCaW5kaW5nKGF4aXNCaW5kaW5nKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGJpbmRpbmcuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZS5lcXVhbHMoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKSB7Ci0gICAgICAgICAgICBwcm9jZXNzU09BUEJpbmRpbmdFbmRwb2ludEV4dGVuc2lvbnMoZW5kcG9pbnQsIGF4aXNFbmRwb2ludCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKFdTREwyQ29uc3RhbnRzLlVSSV9XU0RMMl9IVFRQKSkgewotICAgICAgICAgICAgcHJvY2Vzc0hUVFBCaW5kaW5nRW5kcG9pbnRFeHRlbnNpb25zKGVuZHBvaW50LCBheGlzRW5kcG9pbnQpOwotICAgICAgICB9Ci0gICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0VuZHBvaW50LCBlbmRwb2ludC50b0VsZW1lbnQoKSk7Ci0gICAgICAgIHJldHVybiBheGlzRW5kcG9pbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTT0FQQmluZGluZ0VuZHBvaW50RXh0ZW5zaW9ucyhFbmRwb2ludCBlbmRwb2ludCwgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNPQVBFbmRwb2ludEV4dGVuc2lvbnMgc29hcEVuZHBvaW50RXh0ZW5zaW9uczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBFbmRwb2ludEV4dGVuc2lvbnMgPSAoU09BUEVuZHBvaW50RXh0ZW5zaW9ucykgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQobmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU09BUCBCaW5kaW5nIEVuZHBvaW50IEV4dGVuc2lvbiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb2FwRW5kcG9pbnRFeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNFbmRwb2ludC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0FVVEhFTlRJQ0FUSU9OX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEVuZHBvaW50RXh0ZW5zaW9ucy5nZXRIdHRwQXV0aGVudGljYXRpb25TY2hlbWUoKSk7Ci0gICAgICAgICAgICBheGlzRW5kcG9pbnQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9BVVRIRU5USUNBVElPTl9SRUFMTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRW5kcG9pbnRFeHRlbnNpb25zLmdldEh0dHBBdXRoZW50aWNhdGlvblJlYWxtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NIVFRQQmluZGluZ0VuZHBvaW50RXh0ZW5zaW9ucyhFbmRwb2ludCBlbmRwb2ludCwgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhUVFBFbmRwb2ludEV4dGVuc2lvbnMgaHR0cEVuZHBvaW50RXh0ZW5zaW9uczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGh0dHBFbmRwb2ludEV4dGVuc2lvbnMgPSAoSFRUUEVuZHBvaW50RXh0ZW5zaW9ucykgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQobmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSFRUUCBCaW5kaW5nIEVuZHBvaW50IEV4dGVuc2lvbiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChodHRwRW5kcG9pbnRFeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNFbmRwb2ludC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0FVVEhFTlRJQ0FUSU9OX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RXh0ZW5zaW9ucy5nZXRIdHRwQXV0aGVudGljYXRpb25TY2hlbWUoKSk7Ci0gICAgICAgICAgICBheGlzRW5kcG9pbnQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9BVVRIRU5USUNBVElPTl9SRUFMTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwRW5kcG9pbnRFeHRlbnNpb25zLmdldEh0dHBBdXRoZW50aWNhdGlvblJlYWxtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29udGFpbnMgYWxsIGNvZGUgd2hpY2ggZ2F0aGVycyBub24td3NkbFNlcnZpY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAgKiB3c2RsLgotICAgICAqIDxwLz4KLSAgICAgKiBBZnRlciBhbGwgdGhlIHNldHVwIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRoZSBzZXR1cENvbXBsZXRlIGZpZWxkIGlzCi0gICAgICogc2V0IHNvIHRoYXQgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gc2V0dXAoKSB3aWxsIHJlc3VsdCBpbiBhIG5vLW9wLiBOb3RlCi0gICAgICogdGhhdCBzdWJjbGFzcyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgd2lsbCBjYWxsIHBvcHVsYXRlU2VydmljZQotICAgICAqIGZvciBlYWNoIGVuZHBvaW50IGluIHRoZSBXU0RMLiBTZXBhcmF0aW5nIHRoZSBub24td3NkbFNlcnZpY2Ugc3BlY2lmaWMKLSAgICAgKiBpbmZvcm1hdGlvbiBoZXJlIGFsbG93cyBXU0RMMjBUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgdG8gb25seSBkbyB0aGlzCi0gICAgICogd29yayAxIHRpbWUgcGVyIFdTREwsIGluc3RlYWQgb2YgZm9yIGVhY2ggZW5kcG9pbnQgb24gZWFjaCB3c2RsU2VydmljZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IC0gVGhyb3duIGluIGNhc2UgdGhlIG5lY2Vzc2FyeSByZXNvdXJjZXMgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIFdTREwKLSAgICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24gLSBUaHJvd24gaW4gY2FzZSBXb2RlbiB0aHJvd3MgYW4gZXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXAoKSB0aHJvd3MgQXhpc0ZhdWx0LCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNldHVwQ29tcGxldGUpIHsgLy8gYWxyZWFkeSBzZXR1cCwganVzdCBkbyBub3RoaW5nIGFuZCByZXR1cm4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxVUkkgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHdzZGxVUkkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcmVhZEluVGhlV1NETEZpbGUod3NkbFVSSSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uRWxlbWVudCA9IGRlc2NyaXB0aW9uLnRvRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlYWRJblRoZVdTRExGaWxlKGluKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50ID0gZGVzY3JpcHRpb24udG9FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gcmVzb3VyY2VzIGZvdW5kIHRvIHJlYWQgdGhlIHdzZGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzYXZlZFRhcmdldE5hbWVzcGFjZSA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXRUYXJnZXROYW1lc3BhY2UoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZW1hcCA9IGRlc2NyaXB0aW9uRWxlbWVudC5nZXREZWNsYXJlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbmFtZXNwYWNlbWFwCi0KLSAgICAgICAgICAgIHN0cmluZ0Jhc2VkTmFtZXNwYWNlTWFwID0gbmV3IE5hbWVzcGFjZU1hcCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VtYXAubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VEZWNsYXJhdGlvbiBuYW1lc3BhY2VEZWNsYXJhdGlvbiA9IG5hbWVzcGFjZW1hcFtpXTsKLSAgICAgICAgICAgICAgICBzdHJpbmdCYXNlZE5hbWVzcGFjZU1hcC5wdXQobmFtZXNwYWNlRGVjbGFyYXRpb24uZ2V0UHJlZml4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZURlY2xhcmF0aW9uLmdldE5hbWVzcGFjZVVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXR1cENvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7IC8vIGp1c3QgcmV0aHJvdyBBeGlzRmF1bHRzCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIFdTRExFeGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNCaW5kaW5nIHByb2Nlc3NCaW5kaW5nKEJpbmRpbmcgYmluZGluZywgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBuZXcgQXhpc0JpbmRpbmcoKTsKLSAgICAgICAgYXhpc0JpbmRpbmcuc2V0TmFtZShiaW5kaW5nLmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGJpbmRpbmcuZ2V0VHlwZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFR5cGUoYmluZGluZ1R5cGUpOwotCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZS5lcXVhbHMoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKSB7Ci0gICAgICAgICAgICBwcm9jZXNzU09BUEJpbmRpbmdFeHRlbnRpb24oYmluZGluZywgYXhpc0JpbmRpbmcsIHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlLmVxdWFscyhXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NIVFRQQmluZGluZ0V4dGVudGlvbihiaW5kaW5nLCBheGlzQmluZGluZywgc2VydmljZUludGVyZmFjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBzaG91bGQgcHJvY2VzcyB0aGUgaW50ZXJmYWNlIGJhc2VkIG9uIHRoZSBzZXJ2aWNlIG5vdCBvbiBhIGJpbmRpbmcKLQotICAgICAgICBwcm9jZXNzZWRCaW5kaW5ncy5wdXQoYmluZGluZy5nZXROYW1lKCksIGF4aXNCaW5kaW5nKTsKLSAgICAgICAgYWRkRG9jdW1lbnRhdGlvbihheGlzQmluZGluZywgYmluZGluZy50b0VsZW1lbnQoKSk7Ci0gICAgICAgIHJldHVybiBheGlzQmluZGluZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NPQVBCaW5kaW5nRXh0ZW50aW9uKEJpbmRpbmcgYmluZGluZywgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcsIEludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ2FwdHVyZSBhbGwgdGhlIGJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIC8vIFNldCBhIGNvbXBhcmF0b3Igc28gdGhhIGh0dHBMb2NhdGlvbnMgYXJlIHN0b3JlZCBpbiBkZWNlbmRpbmcgb3JkZXIKLSAgICAgICAgTWFwIGh0dHBMb2NhdGlvblRhYmxlID0gbmV3IFRyZWVNYXAobmV3IENvbXBhcmF0b3IoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoLTEgKiAoKENvbXBhcmFibGUpbzEpLmNvbXBhcmVUbyhvMikpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgU09BUEJpbmRpbmdFeHRlbnNpb25zIHNvYXBCaW5kaW5nRXh0ZW5zaW9uczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nRXh0ZW5zaW9ucyA9IChTT0FQQmluZGluZ0V4dGVuc2lvbnNJbXBsKSBiaW5kaW5nCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRFeHRlbnNpb25Db250ZXh0KG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc29hcFZlcnNpb247Ci0gICAgICAgIGlmICgoc29hcFZlcnNpb24gPSBzb2FwQmluZGluZ0V4dGVuc2lvbnMuZ2V0U29hcFZlcnNpb24oKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhXU0RMMkNvbnN0YW50cy5TT0FQX1ZFUlNJT05fMV8xKSkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRvIHNvYXAgMS4yCi0gICAgICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXIuZ2V0RGVmYXVsdFZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1ZFUlNJT04pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSSSBzb2FwVW5kZXJseWluZ1Byb3RvY29sID0gc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBVbmRlcmx5aW5nUHJvdG9jb2woKTsKLSAgICAgICAgaWYgKHNvYXBVbmRlcmx5aW5nUHJvdG9jb2wgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9QUk9UT0NPTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBVbmRlcmx5aW5nUHJvdG9jb2wudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgVVJJIHNvYXBNZXBEZWZhdWx0ID0gc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBNZXBEZWZhdWx0KCk7Ci0gICAgICAgIGlmIChzb2FwTWVwRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXBEZWZhdWx0LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmdEZWZhdWx0KCkpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU29hcE1vZHVsZXMoc29hcEJpbmRpbmdFeHRlbnNpb25zLmdldFNvYXBNb2R1bGVzKCkpKTsKLSAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0V4dGVuc2lvbnMuZ2V0SHR0cFF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yRGVmYXVsdCgpKTsKLQotICAgICAgICAvLyBDYXB0dXJlIGFsbCB0aGUgZmF1bHQgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEJpbmRpbmdGYXVsdFtdIGJpbmRpbmdGYXVsdHMgPSBiaW5kaW5nLmdldEJpbmRpbmdGYXVsdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nRmF1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBCaW5kaW5nRmF1bHRJbXBsIGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHRJbXBsKSBiaW5kaW5nRmF1bHRzW2ldOwotICAgICAgICAgICAgSW50ZXJmYWNlRmF1bHQgaW50ZXJmYWNlRmF1bHQgPSBzZXJ2aWNlSW50ZXJmYWNlLmdldEZyb21BbGxJbnRlcmZhY2VGYXVsdHMoYmluZGluZ0ZhdWx0LmdldFJlZigpKTsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0ZhdWx0ID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQuc2V0TmFtZShpbnRlcmZhY2VGYXVsdC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQYXJlbnQoYXhpc0JpbmRpbmcpOwotCi0gICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nRmF1bHQsIGludGVyZmFjZUZhdWx0LnRvRWxlbWVudCgpKTsKLSAgICAgICAgICAgIFNPQVBCaW5kaW5nRmF1bHRFeHRlbnNpb25zIHNvYXBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nRmF1bHRFeHRlbnNpb25zID0gKFNPQVBCaW5kaW5nRmF1bHRFeHRlbnNpb25zKSBiaW5kaW5nRmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRFeHRlbnNpb25Db250ZXh0KG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU29hcCBCaW5kaW5nIEV4dGVudGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSHR0cEhlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0SHR0cEhlYWRlcnMoKSkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nRmF1bHRFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQ09ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0U29hcEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9TVUJDT0RFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0U29hcEZhdWx0U3ViY29kZXMoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb2FwSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0ZhdWx0RXh0ZW5zaW9ucy5nZXRTb2FwSGVhZGVycygpKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ0ZhdWx0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTU9EVUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb2FwTW9kdWxlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0ZhdWx0RXh0ZW5zaW9ucy5nZXRTb2FwTW9kdWxlcygpKSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLmFkZEZhdWx0KGF4aXNCaW5kaW5nRmF1bHQpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvLyBDYXB0dXJlIGFsbCB0aGUgYmluZGluZyBvcGVyYXRpb24gc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBiaW5kaW5nT3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbkltcGwgYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uSW1wbCkgYmluZGluZ09wZXJhdGlvbnNbaV07Ci0KLSAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gbmV3IEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBJbnRlcmZhY2VPcGVyYXRpb24gaW50ZXJmYWNlT3BlcmF0aW9uID0gc2VydmljZUludGVyZmFjZS5nZXRGcm9tQWxsSW50ZXJmYWNlT3BlcmF0aW9ucyhiaW5kaW5nT3BlcmF0aW9uLmdldFJlZigpKTsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihpbnRlcmZhY2VPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFBhcmVudChheGlzQmluZGluZyk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXROYW1lKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24udG9FbGVtZW50KCkpOwotICAgICAgICAgICAgU09BUEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zIHNvYXBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9uczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zID0gKChTT0FQQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVSSSBzb2FwQWN0aW9uID0gc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwgJiYgISJcIlwiIi5lcXVhbHMoc29hcEFjdGlvbi50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01PRFVMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNvYXBNb2R1bGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMuZ2V0U29hcE1vZHVsZXMoKSkpOwotICAgICAgICAgICAgVVJJIHNvYXBNZXAgPSBzb2FwQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMuZ2V0U29hcE1lcCgpOwotICAgICAgICAgICAgaWYgKHNvYXBNZXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfTUVQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXAudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBIVFRQTG9jYXRpb24gaHR0cExvY2F0aW9uID0gc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBMb2NhdGlvbigpOwotICAgICAgICAgICAgLy8gSWYgaHR0cExvY2F0aW9uIGlzIG5vdCBudWxsIHdlIHNob3VsZCBleHRyYWN0IGEgY29uc3RhbnQgcGFydCBmcm9tIGl0IGFuZCBhZGQgaXRzIHZhbHVlIGFuZCB0aGUKLSAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgQXhpc09wZXJhdGlvbiB0byBhIG1hcCBpbiBvcmRlciB0byBkaXNwYXRjaCByZXN0IG1lc3NhZ2VzLiBJZiBodHRwTG9jYXRpb24gaXMgbnVsbCB3ZSBhZGQKLSAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gbmFtZSBpbnRvIHRoaXMgbWFwLgotICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblN0cmluZyA9ICIiOwotICAgICAgICAgICAgaWYgKGh0dHBMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblRlbXBsZXRlID0gaHR0cExvY2F0aW9uLmdldE9yaWdpbmFsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIGh0dHBMb2NhdGlvblRlbXBsZXRlKTsKLSAgICAgICAgICAgICAgICBodHRwTG9jYXRpb25TdHJpbmcgPSBXU0RMVXRpbC5nZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uVGVtcGxldGUsIEhUVFBDb25zdGFudHMuSEVBREVSX1BPU1QpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGh0dHBMb2NhdGlvblRhYmxlLnB1dChodHRwTG9jYXRpb25TdHJpbmcsIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmdEZWZhdWx0KCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBRdWVyeVBhcmFtZXRlclNlcGFyYXRvcigpKTsKLQotCi0gICAgICAgICAgICBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZVtdIGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ01lc3NhZ2VSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlIGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlID0gYmluZGluZ01lc3NhZ2VSZWZlcmVuY2VzW2pdOwotCi0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZSA9IG5ldyBBeGlzQmluZGluZ01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nTWVzc2FnZSwgYmluZGluZ01lc3NhZ2VSZWZlcmVuY2UudG9FbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZSgpLmdldE1lc3NhZ2VMYWJlbCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldEF4aXNNZXNzYWdlKGF4aXNNZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0TmFtZShheGlzTWVzc2FnZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZS5zZXREaXJlY3Rpb24oYXhpc01lc3NhZ2UuZ2V0RGlyZWN0aW9uKCkpOwotCi0KLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zIHNvYXBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnMpIGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50RXh0ZW5zaW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVIdHRwSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zLmdldEh0dHBIZWFkZXJzKCkpKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfSEVBREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTb2FwSGVhZGVycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zLmdldFNvYXBIZWFkZXJzKCkpKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNvYXBNb2R1bGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnMuZ2V0U29hcE1vZHVsZXMoKSkpOwotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkQ2hpbGQoYXhpc01lc3NhZ2UuZ2V0RGlyZWN0aW9uKCksIGF4aXNCaW5kaW5nTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQmluZGluZ0ZhdWx0UmVmZXJlbmNlIFtdIGJpbmRpbmdGYXVsdFJlZmVyZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdFJlZmVyZW5jZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYmluZGluZ0ZhdWx0UmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIEJpbmRpbmdGYXVsdFJlZmVyZW5jZSBiaW5kaW5nRmF1bHRSZWZlcmVuY2UgPSBiaW5kaW5nRmF1bHRSZWZlcmVuY2VzW2pdOwotCi0gICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0ID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQsIGJpbmRpbmdGYXVsdFJlZmVyZW5jZS50b0VsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQuc2V0UGFyZW50KGF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXROYW1lKGJpbmRpbmdGYXVsdFJlZmVyZW5jZS5nZXRJbnRlcmZhY2VGYXVsdFJlZmVyZW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlRmF1bHQoKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmdGYXVsdFJlZmVyZW5jZUV4dGVuc2lvbnMgc29hcEJpbmRpbmdGYXVsdFJlZmVyZW5jZUV4dGVuc2lvbnM7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmdGYXVsdFJlZmVyZW5jZUV4dGVuc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQQmluZGluZ0ZhdWx0UmVmZXJlbmNlRXh0ZW5zaW9ucykgYmluZGluZ0ZhdWx0UmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29tcG9uZW50RXh0ZW5zaW9uQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfU09BUCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvYXAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XU09BUF9NT0RVTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU29hcE1vZHVsZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwQmluZGluZ0ZhdWx0UmVmZXJlbmNlRXh0ZW5zaW9ucy5nZXRTb2FwTW9kdWxlcygpKSk7Ci0KLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5hZGRGYXVsdChheGlzQmluZGluZ01lc3NhZ2VGYXVsdCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkhUVFBfTE9DQVRJT05fVEFCTEUsIGh0dHBMb2NhdGlvblRhYmxlKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nLmFkZENoaWxkKGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotCi0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSFRUUEJpbmRpbmdFeHRlbnRpb24oQmluZGluZyBiaW5kaW5nLCBBeGlzQmluZGluZyBheGlzQmluZGluZywgSW50ZXJmYWNlIHNlcnZpY2VJbnRlcmZhY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotCi0gICAgICAgIC8vIFNldCBhIGNvbXBhcmF0b3Igc28gdGhhIGh0dHBMb2NhdGlvbnMgYXJlIHN0b3JlZCBpbiBkZWNlbmRpbmcgb3JkZXIKLSAgICAgICAgTWFwIGh0dHBMb2NhdGlvblRhYmxlID0gbmV3IFRyZWVNYXAobmV3IENvbXBhcmF0b3IoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgIHJldHVybiAoLTEgKiAoKENvbXBhcmFibGUpbzEpLmNvbXBhcmVUbyhvMikpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gQ2FwdHVyZSBhbGwgdGhlIGJpbmRpbmcgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEhUVFBCaW5kaW5nRXh0ZW5zaW9uc0ltcGwgaHR0cEJpbmRpbmdFeHRlbnNpb25zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaHR0cEJpbmRpbmdFeHRlbnNpb25zID0gKEhUVFBCaW5kaW5nRXh0ZW5zaW9uc0ltcGwpIGJpbmRpbmcKLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQobmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfSFRUUCkpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSFRUUCBCaW5kaW5nIEV4dGVudGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBodHRwTWV0aG9kRGVmYXVsdCA9IGh0dHBCaW5kaW5nRXh0ZW5zaW9ucy5nZXRIdHRwTWV0aG9kRGVmYXVsdCgpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZERlZmF1bHQpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRXh0ZW5zaW9ucy5nZXRIdHRwUXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3JEZWZhdWx0KCkpOwotICAgICAgICBheGlzQmluZGluZy5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRXh0ZW5zaW9ucy5nZXRIdHRwQ29udGVudEVuY29kaW5nRGVmYXVsdCgpKTsKLQotICAgICAgICAvLyBDYXB0dXJlIGFsbCB0aGUgZmF1bHQgc3BlY2lmaWMgcHJvcGVydGllcwotCi0gICAgICAgIEJpbmRpbmdGYXVsdFtdIGJpbmRpbmdGYXVsdHMgPSBiaW5kaW5nLmdldEJpbmRpbmdGYXVsdHMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nRmF1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBCaW5kaW5nRmF1bHRJbXBsIGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHRJbXBsKSBiaW5kaW5nRmF1bHRzW2ldOwotICAgICAgICAgICAgSW50ZXJmYWNlRmF1bHQgaW50ZXJmYWNlRmF1bHQgPQotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlLmdldEZyb21BbGxJbnRlcmZhY2VGYXVsdHMoYmluZGluZ0ZhdWx0LmdldFJlZigpKTsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ0ZhdWx0ID0gbmV3IEF4aXNCaW5kaW5nTWVzc2FnZSgpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nRmF1bHQuc2V0TmFtZShpbnRlcmZhY2VGYXVsdC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQYXJlbnQoYXhpc0JpbmRpbmcpOwotCi0gICAgICAgICAgICBhZGREb2N1bWVudGF0aW9uKGF4aXNCaW5kaW5nRmF1bHQsIGludGVyZmFjZUZhdWx0LnRvRWxlbWVudCgpKTsKLSAgICAgICAgICAgIEhUVFBCaW5kaW5nRmF1bHRFeHRlbnNpb25zIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zID0gKEhUVFBCaW5kaW5nRmF1bHRFeHRlbnNpb25zKSBiaW5kaW5nRmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb21wb25lbnRFeHRlbnNpb25Db250ZXh0KG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSFRUUCBCaW5kaW5nIEV4dGVudGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEh0dHBFcnJvclN0YXR1c0NvZGUoKS5nZXRDb2RlKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSHR0cEhlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdGYXVsdEV4dGVuc2lvbnMuZ2V0SHR0cEhlYWRlcnMoKSkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdGYXVsdC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPTlRFTlRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nRmF1bHRFeHRlbnNpb25zLmdldEh0dHBDb250ZW50RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZy5hZGRGYXVsdChheGlzQmluZGluZ0ZhdWx0KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ2FwdHVyZSBhbGwgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMKLQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uW10gYmluZGluZ09wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25JbXBsIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbkltcGwpIGJpbmRpbmdPcGVyYXRpb25zW2ldOwotCi0gICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IG5ldyBBeGlzQmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICAgICAgSW50ZXJmYWNlT3BlcmF0aW9uIGludGVyZmFjZU9wZXJhdGlvbiA9IHNlcnZpY2VJbnRlcmZhY2UuZ2V0RnJvbUFsbEludGVyZmFjZU9wZXJhdGlvbnMoYmluZGluZ09wZXJhdGlvbi5nZXRSZWYoKSk7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb24oaW50ZXJmYWNlT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQYXJlbnQoYXhpc0JpbmRpbmcpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShheGlzT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24udG9FbGVtZW50KCkpOwotICAgICAgICAgICAgSFRUUEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zIGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9uczsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zID0gKChIVFRQQmluZGluZ09wZXJhdGlvbkV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkhUVFAgQmluZGluZyBFeHRlbnRpb24gbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfRkFVTFRfU0VSSUFMSVpBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRIdHRwRmF1bHRTZXJpYWxpemF0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9JTlBVVF9TRVJJQUxJWkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBJbnB1dFNlcmlhbGl6YXRpb24oKSk7Ci0gICAgICAgICAgICBTdHJpbmcgaHR0cE1ldGhvZCA9IGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy4KLSAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cE1ldGhvZCgpOwotICAgICAgICAgICAgaWYgKGh0dHBNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChodHRwTWV0aG9kRGVmYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBNZXRob2QgPSBodHRwTWV0aG9kRGVmYXVsdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBCb29sZWFuIHNhZmVQYXJhbWV0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlclZhbHVlKFdTREwyQ29uc3RhbnRzLkFUVFJfV1NETFhfU0FGRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYWZlUGFyYW1ldGVyICE9IG51bGwgJiYgc2FmZVBhcmFtZXRlci5ib29sZWFuVmFsdWUoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwTWV0aG9kID0gSFRUUENvbnN0YW50cy5IRUFERVJfR0VUOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BPU1Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9NRVRIT0QsIGh0dHBNZXRob2QpOwotICAgICAgICAgICAgSFRUUExvY2F0aW9uIGh0dHBMb2NhdGlvbiA9IGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRIdHRwTG9jYXRpb24oKTsKLQotICAgICAgICAgICAgLy8gSWYgaHR0cExvY2F0aW9uIGlzIG5vdCBudWxsIHdlIHNob3VsZCBleHRyYWN0IGEgY29uc3RhbnQgcGFydCBmcm9tIGl0IGFuZCBhZGQgaXRzIHZhbHVlIGFuZCB0aGUKLSAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgQXhpc09wZXJhdGlvbiB0byBhIG1hcCBpbiBvcmRlciB0byBkaXNwYXRjaCByZXN0IG1lc3NhZ2VzLiBJZiBodHRwTG9jYXRpb24gaXMgbnVsbCB3ZSBhZGQKLSAgICAgICAgICAgIC8vIHRoZSBvcGVyYXRpb24gbmFtZSBpbnRvIHRoaXMgbWFwLgotICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblN0cmluZyA9ICIiOwotICAgICAgICAgICAgaWYgKGh0dHBMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvblRlbXBsZXRlID0gaHR0cExvY2F0aW9uLmdldE9yaWdpbmFsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sIGh0dHBMb2NhdGlvblRlbXBsZXRlKTsKLSAgICAgICAgICAgICAgICBodHRwTG9jYXRpb25TdHJpbmcgPSBXU0RMVXRpbC5nZXRDb25zdGFudEZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uVGVtcGxldGUsIGh0dHBNZXRob2QpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGh0dHBMb2NhdGlvblRhYmxlLnB1dChodHRwTG9jYXRpb25TdHJpbmcsIGF4aXNPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lHTk9SRV9VTkNJVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0h0dHBMb2NhdGlvbklnbm9yZVVuY2l0ZWQoKSk7Ci0gICAgICAgICAgICBheGlzQmluZGluZ09wZXJhdGlvbi5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX09VVFBVVF9TRVJJQUxJWkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBPdXRwdXRTZXJpYWxpemF0aW9uKCkpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdPcGVyYXRpb25FeHRlbnNpb25zLmdldEh0dHBRdWVyeVBhcmFtZXRlclNlcGFyYXRvcigpKTsKLSAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRIdHRwQ29udGVudEVuY29kaW5nRGVmYXVsdCgpKTsKLQotICAgICAgICAgICAgQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VbXSBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZXMgPQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZSA9IGJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlc1tqXTsKLQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2UgPSBuZXcgQXhpc0JpbmRpbmdNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2UoKS5nZXRNZXNzYWdlTGFiZWwoKS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZS5zZXRBeGlzTWVzc2FnZShheGlzTWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldE5hbWUoYXhpc01lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2Uuc2V0RGlyZWN0aW9uKGF4aXNNZXNzYWdlLmdldERpcmVjdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdNZXNzYWdlLCBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZS50b0VsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgSFRUUEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucyBodHRwQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBCaW5kaW5nTWVzc2FnZVJlZmVyZW5jZUV4dGVuc2lvbnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIVFRQQmluZGluZ01lc3NhZ2VSZWZlcmVuY2VFeHRlbnNpb25zKSBiaW5kaW5nTWVzc2FnZVJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkkoV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJIVFRQIEJpbmRpbmcgRXh0ZW50aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZS5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0hFQURFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSHR0cEhlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucy5nZXRIdHRwSGVhZGVycygpKSk7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdNZXNzYWdlLnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEJpbmRpbmdNZXNzYWdlUmVmZXJlbmNlRXh0ZW5zaW9ucy5nZXRIdHRwQ29udGVudEVuY29kaW5nKCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmFkZENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSwgYXhpc0JpbmRpbmdNZXNzYWdlKTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCaW5kaW5nRmF1bHRSZWZlcmVuY2VbXSBiaW5kaW5nRmF1bHRSZWZlcmVuY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRSZWZlcmVuY2VzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJpbmRpbmdGYXVsdFJlZmVyZW5jZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nRmF1bHRSZWZlcmVuY2UgYmluZGluZ0ZhdWx0UmVmZXJlbmNlID0gYmluZGluZ0ZhdWx0UmVmZXJlbmNlc1tqXTsKLQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBheGlzQmluZGluZ01lc3NhZ2VGYXVsdCA9IG5ldyBBeGlzQmluZGluZ01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXRGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICBheGlzQmluZGluZ01lc3NhZ2VGYXVsdC5zZXROYW1lKGJpbmRpbmdGYXVsdFJlZmVyZW5jZS5nZXRJbnRlcmZhY2VGYXVsdFJlZmVyZW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW50ZXJmYWNlRmF1bHQoKS5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nTWVzc2FnZUZhdWx0LnNldFBhcmVudChheGlzQmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgYXhpc0JpbmRpbmdPcGVyYXRpb24uYWRkRmF1bHQoYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQpOwotICAgICAgICAgICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc0JpbmRpbmdNZXNzYWdlRmF1bHQsIGJpbmRpbmdGYXVsdFJlZmVyZW5jZS50b0VsZW1lbnQoKSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXhpc0JpbmRpbmcuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuSFRUUF9MT0NBVElPTl9UQUJMRSwgaHR0cExvY2F0aW9uVGFibGUpOwotICAgICAgICAgICAgYXhpc0JpbmRpbmcuYWRkQ2hpbGQoYXhpc0JpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpLCBheGlzQmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzSW50ZXJmYWNlKEludGVyZmFjZSBzZXJ2aWNlSW50ZXJmYWNlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gVE9ETyBjb3B5IHRoZSBwb2xpY3kgZWxlbWVudHMKLSAgICAgICAgLy8gY29weUV4dGVuc2lvbkF0dHJpYnV0ZXMod3NkbDRqUG9ydFR5cGUuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpLAotICAgICAgICAvLyBheGlzU2VydmljZSwgUE9SVF9UWVBFKTsKLQotICAgICAgICBJbnRlcmZhY2VPcGVyYXRpb25bXSBpbnRlcmZhY2VPcGVyYXRpb25zID0gc2VydmljZUludGVyZmFjZQotICAgICAgICAgICAgICAgIC5nZXRJbnRlcmZhY2VPcGVyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKHBvcHVsYXRlT3BlcmF0aW9ucyhpbnRlcmZhY2VPcGVyYXRpb25zW2ldKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lcy5hZGQoaW50ZXJmYWNlT3BlcmF0aW9uc1tpXS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmYWNlW10gZXh0ZW5kZWRJbnRlcmZhY2VzID0gc2VydmljZUludGVyZmFjZS5nZXRFeHRlbmRlZEludGVyZmFjZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbmRlZEludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEludGVyZmFjZSBleHRlbmRlZEludGVyZmFjZSA9IGV4dGVuZGVkSW50ZXJmYWNlc1tpXTsKLSAgICAgICAgICAgIHByb2Nlc3NJbnRlcmZhY2UoZXh0ZW5kZWRJbnRlcmZhY2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gcG9wdWxhdGVPcGVyYXRpb25zKEludGVyZmFjZU9wZXJhdGlvbiBvcGVyYXRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBRTmFtZSBvcE5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAvLyBDb3B5IE5hbWUgQXR0cmlidXRlCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSSSBwYXR0ZXJuID0gb3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKTsKLSAgICAgICAgICAgIFN0cmluZyBNRVA7Ci0gICAgICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTUVQID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLmdldERlZmF1bHRWYWx1ZShXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX01FUCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE1FUCA9IHBhdHRlcm4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFpc1NlcnZlclNpZGUpewotICAgICAgICAgICAgCS8vIElmIGluIHRoZSBjbGllbnQsIG5lZWQgdG8gdG9nZ2xlIGluLW91dCB0byBvdXQtaW4gZXRjLgotICAgICAgICAgICAgCWlmKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhNRVApKXsKLSAgICAgICAgICAgIAkJTUVQID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWlmKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWS5lcXVhbHMoTUVQKSl7Ci0gICAgICAgICAgICAJCU1FUCA9IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWlmKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhNRVApKXsKLSAgICAgICAgICAgIAkJTUVQID0gV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IEF4aXNPcGVyYXRpb25GYWN0b3J5LmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKE1FUCk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldE5hbWUob3BOYW1lKTsKLQotICAgICAgICB9Ci0gICAgICAgIFVSSVtdIG9wZXJhdGlvblN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25TdHlsZSAhPSBudWxsICYmIG9wZXJhdGlvblN0eWxlLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBvcFN0eWxlUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgb3BTdHlsZVBhcmFtZXRlci5zZXROYW1lKFdTREwyQ29uc3RhbnRzLk9QRVJBVElPTl9TVFlMRSk7Ci0gICAgICAgICAgICBvcFN0eWxlUGFyYW1ldGVyLnNldFZhbHVlKG9wZXJhdGlvblN0eWxlKTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG9wU3R5bGVQYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGFkZERvY3VtZW50YXRpb24oYXhpc09wZXJhdGlvbiwgb3BlcmF0aW9uLnRvRWxlbWVudCgpKTsKLQotICAgICAgICAvLyBhc3N1bWluZyB0aGUgc3R5bGUgb2YgdGhlIG9wZXJhdGlvbnMgb2YgV1NETCAyLjAgaXMgYWx3YXlzIGRvY3VtZW50LCBmb3IgdGhlIHRpbWUgYmVpbmcgOikKLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjYW4gYmUgdXNlZCB0byBjYXB0dXJlIHRoZSB3c2RseDpzYWZlIGF0dHJpYnV0ZQotCi0gICAgICAgIEludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnNJbXBsIGludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zID0gKEludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnNJbXBsKSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfRVhURU5TSU9OUykpOwotICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiV1NETDIgZXh0ZW5zaW9ucyBub3QgZGVmaW5lZCBmb3IgdGhpcyBvcGVyYXRpb24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLkFUVFJfV1NETFhfU0FGRSwgQm9vbGVhbi52YWx1ZU9mKAotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zLmlzU2FmZSgpKSk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgUlBDSW50ZXJmYWNlT3BlcmF0aW9uRXh0ZW5zaW9ucyBycGNJbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnBjSW50ZXJmYWNlT3BlcmF0aW9uRXh0ZW5zaW9ucyA9IChSUENJbnRlcmZhY2VPcGVyYXRpb25FeHRlbnNpb25zKSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldENvbXBvbmVudEV4dGVuc2lvbkNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVSSShXU0RMMkNvbnN0YW50cy5VUklfV1NETDJfUlBDKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJXU0RMMiBleHRlbnNpb25zIG5vdCBkZWZpbmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJwY0ludGVyZmFjZU9wZXJhdGlvbkV4dGVuc2lvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHJwY3NpZyA9ICIiOwotICAgICAgICAgICAgQXJndW1lbnRbXSBzaWduYXR1cmVzID0gcnBjSW50ZXJmYWNlT3BlcmF0aW9uRXh0ZW5zaW9ucy5nZXRSUENTaWduYXR1cmUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmF0dXJlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEFyZ3VtZW50IHNpZ0FyZ3VtZW50ID0gc2lnbmF0dXJlc1tpXTsKLSAgICAgICAgICAgICAgICBycGNzaWcgPSBycGNzaWcgKyBzaWdBcmd1bWVudC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiICIgKyBzaWdBcmd1bWVudC5nZXREaXJlY3Rpb24oKSArICIgIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKFdTREwyQ29uc3RhbnRzLkFUVFJfV1JQQ19TSUdOQVRVUkUsIHJwY3NpZyk7Ci0gICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZVtdIGludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VzID0gb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldEludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlTWVzc2FnZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IGludGVyZmFjZU1lc3NhZ2VSZWZlcmVuY2VzW2ldOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0TWVzc2FnZUxhYmVsKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGFiZWwuSU4pKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXRzIGFuIGlucHV0IG1lc3NhZ2UKLQotICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlclNpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbiwgbWVzc2FnZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjcmVhdGVBeGlzTWVzc2FnZShheGlzT3BlcmF0aW9uLCBtZXNzYWdlUmVmZXJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VSZWZlcmVuY2UuZ2V0TWVzc2FnZUxhYmVsKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGFiZWwuT1VUKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlclNpZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbiwgbWVzc2FnZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlQXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbiwgbWVzc2FnZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBvcGVyYXRpb24gbGV2ZWwgZmF1bHRzCi0KLSAgICAgICAgSW50ZXJmYWNlRmF1bHRSZWZlcmVuY2VbXSBmYXVsdHMgPSBvcGVyYXRpb24uZ2V0SW50ZXJmYWNlRmF1bHRSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLQotICAgICAgICAgICAgSW50ZXJmYWNlRmF1bHRSZWZlcmVuY2UgaW50ZXJmYWNlRmF1bHRSZWZlcmVuY2UgPSBmYXVsdHNbaV07Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0RGlyZWN0aW9uKGludGVyZmFjZUZhdWx0UmVmZXJlbmNlLmdldERpcmVjdGlvbigpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBJbnRlcmZhY2VGYXVsdCBpbnRlcmZhY2VGYXVsdCA9IGludGVyZmFjZUZhdWx0UmVmZXJlbmNlLmdldEludGVyZmFjZUZhdWx0KCk7Ci0KLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VGYXVsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSW50ZXJmYWNlIEZhdWx0IHJlZmVyZW5jZSBkZWZpbmVkIGluIG9wZXJhdGlvbiAiICsgb3BOYW1lICsgIiBjYW5ub3QgYmUgZm91bmQgaW4gaW50ZXJmYWNlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXRFbGVtZW50UU5hbWUoaW50ZXJmYWNlRmF1bHQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXROYW1lKGludGVyZmFjZUZhdWx0LmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOwotICAgICAgICB9Ci0KLQotICAgICAgICByZXR1cm4gYXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXhpc01lc3NhZ2UoQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UsIFN0cmluZyBtZXNzYWdlTGFiZWwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZShtZXNzYWdlTGFiZWwpOwotCi0gICAgICAgIFN0cmluZyBtZXNzYWdlQ29udGVudE1vZGVsTmFtZSA9IG1lc3NhZ2VSZWZlcmVuY2UuZ2V0TWVzc2FnZUNvbnRlbnRNb2RlbCgpOwotICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUgPSBudWxsOwotCi0gICAgICAgIGlmIChXU0RMMkNvbnN0YW50cy5OTVRPS0VOX0VMRU1FTlQuZXF1YWxzKG1lc3NhZ2VDb250ZW50TW9kZWxOYW1lKSkgewotICAgICAgICAgICAgRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IG1lc3NhZ2VSZWZlcmVuY2UuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnRlcmZhY2VNZXNzYWdlUmVmZXJlbmNlRWxlbWVudCBtZXNzYWdlUmVmZXJlbmNlRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUmVmZXJlbmNlLnRvRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbWVzc2FnZVJlZmVyZW5jZUVsZW1lbnQuZ2V0RWxlbWVudCgpLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGZpbmQgZWxlbWVudCAiICsgcU5hbWUudG9TdHJpbmcoKSArICIgcmVmZmVyZWQgdG8gYnkgb3BlcmF0aW9uICIgKyBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50UU5hbWUgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk5NVE9LRU5fQU5ZLmVxdWFscyhtZXNzYWdlQ29udGVudE1vZGVsTmFtZSkpIHsKLSAgICAgICAgICAgIGVsZW1lbnRRTmFtZSA9IENvbnN0YW50cy5YU0RfQU5ZOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgaWYgKFdTREwyQ29uc3RhbnRzLk5NVE9LRU5fTk9ORS5lcXVhbHMobWVzc2FnZUNvbnRlbnRNb2RlbE5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUga2VlcCB0aGUgbWVzc2FnZSBlbGVtZW50IGFzIG51bGwKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlNvcnJ5IHdlIGRvIG5vdCBzdXBwb3J0ICIgKyBtZXNzYWdlQ29udGVudE1vZGVsTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICIuIFdlIGRvIG9ubHkgc3VwcG9ydCAjYW55LCAjbm9uZSBhbmQgI2VsZW1lbnQgYXMgbWVzc2FnZSBjb250ZW50IG1vZGVscy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKGVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0TmFtZShlbGVtZW50UU5hbWUgIT0gbnVsbCA/IGVsZW1lbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSA6IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5hZGRNZXNzYWdlKG1lc3NhZ2UsIG1lc3NhZ2VMYWJlbCk7Ci0KLSAgICAgICAgCi0gICAgICAgIGlmKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRS5lcXVhbHMobWVzc2FnZUxhYmVsKSl7Ci0gICAgICAgIAlYTUxBdHRyIHhhID0gbWVzc2FnZVJlZmVyZW5jZS50b0VsZW1lbnQoKS5nZXRFeHRlbnNpb25BdHRyaWJ1dGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIsIkFjdGlvbiIpKTsKLSAgICAgICAgCWlmKHhhIT1udWxsKXsKLSAgICAgICAgCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKXhhLmdldENvbnRlbnQoKTsKLSAgICAgICAgCQlpZih2YWx1ZSAhPSBudWxsKXsKLSAgICAgICAgCQkJQXJyYXlMaXN0IGFsID0gYXhpc09wZXJhdGlvbi5nZXRXU0FNYXBwaW5nTGlzdCgpOwotICAgICAgICAJCQlpZihhbCA9PSBudWxsKXsKLSAgICAgICAgCQkJCWFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAJCQkJYXhpc09wZXJhdGlvbi5zZXRXc2FtYXBwaW5nTGlzdChhbCk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQkJYWwuYWRkKHZhbHVlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH1lbHNlewotICAgICAgICAJWE1MQXR0ciB4YSA9IG1lc3NhZ2VSZWZlcmVuY2UudG9FbGVtZW50KCkuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiLCJBY3Rpb24iKSk7Ci0gICAgICAgIAlpZih4YSE9bnVsbCl7Ci0gICAgICAgIAkJU3RyaW5nIHZhbHVlID0gKFN0cmluZyl4YS5nZXRDb250ZW50KCk7Ci0gICAgICAgIAkJaWYodmFsdWUgIT0gbnVsbCl7Ci0gICAgICAgIAkJCWF4aXNPcGVyYXRpb24uc2V0T3V0cHV0QWN0aW9uKHZhbHVlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHBvcHVsYXRlIHRoaXMgbWFwIHNvIHRoYXQgdGhpcyBjYW4gYmUgdXNlZCBpbiBTT0FQQm9keSBiYXNlZCBkaXNwYXRjaGluZwotICAgICAgICBpZiAoZWxlbWVudFFOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKGVsZW1lbnRRTmFtZSwgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uIHJlYWRJblRoZVdTRExGaWxlKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiwgQXhpc0ZhdWx0IHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZSh3c2RsVVJJKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZEluVGhlV1NETEZpbGUoZG9jdW1lbnQpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVzY3JpcHRpb24gcmVhZEluVGhlV1NETEZpbGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBXU0RMRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotCi0gICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlYWRJblRoZVdTRExGaWxlKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uIHJlYWRJblRoZVdTRExGaWxlKERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gRE9NV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgIGlmIChjdXN0b21XU0RMUmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVhZGVyLnNldFVSSVJlc29sdmVyKGN1c3RvbVdTRExSZXNvbHZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyB0dXJucyBvbiBXU0RMIHZhbGlkYXRpb24gd2hpY2ggaXMgc2V0IG9mZiBieSBkZWZhdWx0LgotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZShXU0RMUmVhZGVyLkZFQVRVUkVfVkFMSURBVElPTiwgdHJ1ZSk7Ci0gICAgICAgIFdTRExTb3VyY2Ugd3NkbFNvdXJjZSA9IHJlYWRlci5jcmVhdGVXU0RMU291cmNlKCk7Ci0gICAgICAgIHdzZGxTb3VyY2Uuc2V0U291cmNlKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGdldEJhc2VVcmkoKTsKLSAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmICEiIi5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsU291cmNlLnNldEJhc2VVUkkobmV3IFVSSSh1cmkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodXJpKTsKLSAgICAgICAgICAgICAgICBpZihmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxTb3VyY2Uuc2V0QmFzZVVSSShmLnRvVVJJKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLnRvU3RyaW5nKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZGluZyAyLjAgV1NETCB3aXRoIHdzZGwgdXJpID0gIiArIHdzZGxVUkkpOwotICAgICAgICAgICAgbG9nLnRyYWNlKCIgIHRoZSBzdGFjayBhdCB0aGlzIHBvaW50IGlzOiAiICsgc3RhY2tUb1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKHdzZGxTb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgd29kZW4gZGVwZW5kZW50IFNPQVBIZWFkZXJCbG9jayBvYmplY3RzIHRvIFNPQVBIZWFkZXJNZXNzYWdlIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzb2FwSGVhZGVyQmxvY2tzIC0gQW4gYXJyYXkgb2YgU09BUEhlYWRlckJsb2NrIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCAtIEFuIEFycmF5TGlzdCBvZiBTT0FQSGVhZGVyTWVzc2FnZSBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY3JlYXRlU29hcEhlYWRlcnMoU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9ja3NbXSkgewotCi0gICAgICAgIGlmIChzb2FwSGVhZGVyQmxvY2tzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Qgc29hcEhlYWRlck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEhlYWRlckJsb2Nrcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIHNvYXBIZWFkZXJCbG9jayA9IHNvYXBIZWFkZXJCbG9ja3NbaV07Ci0gICAgICAgICAgICBFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gc29hcEhlYWRlckJsb2NrLmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgICAgICAgICBpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBzb2FwSGVhZGVyTWVzc2FnZSA9IG5ldyBTT0FQSGVhZGVyTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHNvYXBIZWFkZXJNZXNzYWdlLnNldEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2Uuc2V0UmVxdWlyZWQoc29hcEhlYWRlckJsb2NrLmlzUmVxdWlyZWQoKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNdXN0VW5kZXJzdGFuZChzb2FwSGVhZGVyQmxvY2subXVzdFVuZGVyc3RhbmQoKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlck1lc3NhZ2VzLmFkZChzb2FwSGVhZGVyTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJNZXNzYWdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHdvZGVuIGRlcGVuZGVudCBTT0FQSGVhZGVyQmxvY2sgb2JqZWN0cyB0byBTT0FQSGVhZGVyTWVzc2FnZSBvYmplY3RzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc29hcE1vZHVsZXMgLSBBbiBhcnJheSBvZiBTT0FQTW9kdWxlIG9iamVjdHMKLSAgICAgKiBAcmV0dXJuIEFycmF5TGlzdCAtIEFuIEFycmF5TGlzdCBvZiBTT0FQSGVhZGVyTWVzc2FnZSBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY3JlYXRlU29hcE1vZHVsZXMoU09BUE1vZHVsZSBzb2FwTW9kdWxlc1tdKSB7Ci0KLSAgICAgICAgaWYgKHNvYXBNb2R1bGVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Qgc29hcE1vZHVsZU1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcE1vZHVsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFNPQVBNb2R1bGUgc29hcE1vZHVsZSA9IHNvYXBNb2R1bGVzW2ldOwotICAgICAgICAgICAgU09BUE1vZHVsZU1lc3NhZ2Ugc29hcE1vZHVsZU1lc3NhZ2UgPSBuZXcgU09BUE1vZHVsZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHNvYXBNb2R1bGVNZXNzYWdlLnNldFVyaShzb2FwTW9kdWxlLmdldFJlZigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc29hcE1vZHVsZU1lc3NhZ2VzLmFkZChzb2FwTW9kdWxlTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBNb2R1bGVNZXNzYWdlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHdvZGVuIGRlcGVuZGVudCBIVFRQSGVhZGVyIG9iamVjdHMgdG8gSGVhZGVyIG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBodHRwSGVhZGVycyAtIEFuIGFycmF5IG9mIEhUVFBIZWFkZXIgb2JqZWN0cwotICAgICAqIEByZXR1cm4gQXJyYXlMaXN0IC0gQW4gQXJyYXlMaXN0IG9mIEhlYWRlciBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY3JlYXRlSHR0cEhlYWRlcnMoSFRUUEhlYWRlciBodHRwSGVhZGVyc1tdKSB7Ci0KLSAgICAgICAgaWYgKGh0dHBIZWFkZXJzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3QgaHR0cEhlYWRlck1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaHR0cEhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEhUVFBIZWFkZXJJbXBsIGh0dHBIZWFkZXIgPSAoSFRUUEhlYWRlckltcGwpIGh0dHBIZWFkZXJzW2ldOwotICAgICAgICAgICAgSFRUUEhlYWRlck1lc3NhZ2UgaHR0cEhlYWRlck1lc3NhZ2UgPSBuZXcgSFRUUEhlYWRlck1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJNZXNzYWdlLnNldHFOYW1lKGh0dHBIZWFkZXIuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgICAgICAgICBodHRwSGVhZGVyTWVzc2FnZS5zZXROYW1lKGh0dHBIZWFkZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJNZXNzYWdlLnNldFJlcXVpcmVkKGh0dHBIZWFkZXIuaXNSZXF1aXJlZCgpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJNZXNzYWdlcy5hZGQoaHR0cEhlYWRlck1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBodHRwSGVhZGVyTWVzc2FnZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBkb2N1bWVudGF0aW9uIGRldGFpbHMgdG8gYSBnaXZlbiBBeGlzRGVzY3JpcHRpb24uCi0gICAgICogVGhlIGRvY3VtZW50YXRpb24gZGV0YWlscyBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgV1NETCBlbGVtZW50IGdpdmVuLgotICAgICAqIEBwYXJhbSBheGlzRGVzY3JpcHRpb24gLSBUaGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoaXMKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRoYXQgdGhlIGRvY3VtZW50YXRpb24gaXMgZXh0cmFjdGVkIGZyb20uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZERvY3VtZW50YXRpb24oQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbiwgRG9jdW1lbnRhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIERvY3VtZW50YXRpb25FbGVtZW50W10gZG9jdW1lbnRhdGlvbkVsZW1lbnRzID0gZWxlbWVudC5nZXREb2N1bWVudGF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgU3RyaW5nIGRvY3VtZW50YXRpb24gPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkb2N1bWVudGF0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIERvY3VtZW50YXRpb25FbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50ID0gZG9jdW1lbnRhdGlvbkVsZW1lbnRzW2ldOwotICAgICAgICAgICAgWE1MRWxlbWVudCBjb250ZW50RWxlbWVudCA9IGRvY3VtZW50YXRpb25FbGVtZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgY29udGVudCA9IChFbGVtZW50KWNvbnRlbnRFbGVtZW50LmdldFNvdXJjZSgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uICsgRE9NMldyaXRlci5ub2RlVG9TdHJpbmcoY29udGVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKGRvY3VtZW50YXRpb24pKSB7Ci0gICAgICAgICAgICBheGlzRGVzY3JpcHRpb24uc2V0RG9jdW1lbnRhdGlvbihkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0RW5kcG9pbnRVUkwoQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCwgU3RyaW5nIGVuZHBvaW50VVJMKSB7Ci0gICAgCWF4aXNFbmRwb2ludC5zZXRFbmRwb2ludFVSTChlbmRwb2ludFVSTCk7Ci0gICAgCXRyeSB7Ci0gICAgCQlVUkwgdXJsID0gbmV3IFVSTChlbmRwb2ludFVSTCk7Ci0gICAgCQlheGlzRW5kcG9pbnQuc2V0VHJhbnNwb3J0SW5EZXNjcmlwdGlvbih1cmwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQlsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9ICAgIAkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDJDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzMwY2Q5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMMkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBXU0RMMkNvbnN0YW50cyB7Ci0KLSAgICBTdHJpbmcgV1NETF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfV1NETF9OQU1FU1BBQ0VfUFJFRklYID0gIndzZGwyIjsKLSAgICBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIFN0cmluZyBVUklfV1NETDJfU09BUCA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL3NvYXAiOwotICAgIFN0cmluZyBVUklfV1NETDJfSFRUUCA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL2h0dHAiOwotICAgIFN0cmluZyBVUklfV1NETDJfRVhURU5TSU9OUyA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsLWV4dGVuc2lvbnMiOwotICAgIFN0cmluZyBVUklfV1NETDJfUlBDID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvcnBjIjsKLSAgICBTdHJpbmcgU09BUF9QUkVGSVggPSAid3NvYXAiOwotICAgIFN0cmluZyBIVFRQX1BSRUZJWCA9ICJ3aHR0cCI7Ci0gICAgU3RyaW5nIFdTRExfRVhURU5USU9OX1BSRUZJWCA9ICJ3c2RseCI7Ci0gICAgU3RyaW5nIFdTRExfUlBDX1BSRUZJWCA9ICJ3cnBjIjsKLSAgICBTdHJpbmcgU09BUF9FTlZfUFJFRklYID0gInNvYXAiOwotICAgIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYID0gImF4aXMyIjsKLSAgICBTdHJpbmcgRE9DVU1FTlRBVElPTiA9ICJkb2N1bWVudGF0aW9uIjsKLQotICAgIFN0cmluZyBERUZBVUxUX1NPQVAxMV9FTkRQT0lOVF9OQU1FID0gIlNPQVAxMUVuZHBvaW50IjsKLSAgICBTdHJpbmcgREVGQVVMVF9TT0FQMTJfRU5EUE9JTlRfTkFNRSA9ICJTT0FQMTJFbmRwb2ludCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfSFRUUF9FTkRQT0lOVF9OQU1FID0gIkhUVFBFbmRwb2ludCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfSFRUUFNfUFJFRklYID0gIlNlY3VyZSI7Ci0gICAgU3RyaW5nIERFRkFVTFRfSU5URVJGQUNFX05BTUUgPSAiU2VydmljZUludGVyZmFjZSI7Ci0gICAgU3RyaW5nIFRZUEVTX0xPQ0FMX05BTEUgPSAidHlwZXMiOwotICAgIFN0cmluZyBJTlRFUkZBQ0VfTE9DQUxfTkFNRSA9ICJpbnRlcmZhY2UiOwotICAgIFN0cmluZyBJTlRFUkZBQ0VfUFJFRklYID0gIkludGVyZmFjZSI7Ci0gICAgU3RyaW5nIE9QRVJBVElPTl9MT0NBTF9OQU1FID0gIm9wZXJhdGlvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0gIm5hbWUiOwotICAgIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX1JFRiA9ICJyZWYiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTE9DQVRJT04gPSAibG9jYXRpb24iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfQ09OVEVOVF9FTkNPRElOR19ERUZBVUxUID0gImNvbnRlbnRFbmNvZGluZ0RlZmF1bHQiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfQ09OVEVOVF9FTkNPRElORyA9ICJjb250ZW50RW5jb2RpbmciOwotICAgIFN0cmluZyBBVFRSSUJVVEVfUVVFUllfUEFSQU1FVEVSX1NFUEVSQVRPUiA9ICJxdWVyeVBhcmFtZXRlclNlcGFyYXRvciI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9RVUVSWV9QQVJBTUVURVJfU0VQRVJBVE9SX0RFRkFVTFQgPSAicXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3JEZWZhdWx0IjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0FDVElPTiA9ICJhY3Rpb24iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTUVQID0gIm1lcCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9NRVBfREVGQVVMVCA9ICJtZXBEZWZhdWx0IjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX01FVEhPRCA9ICJtZXRob2QiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTUVUSE9EX0RFRkFVTFQgPSAibWV0aG9kRGVmYXVsdCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9NT0RVTEUgPSAibW9kdWxlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0lHTk9SRV9VTkNJVEVEID0gImlnbm9yZVVuY2l0ZWQiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfSU5QVVRfU0VSSUFMSVpBVElPTiA9ICJpbnB1dFNlcmlhbGl6YXRpb24iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfT1VUUFVUX1NFUklBTElaQVRJT04gPSAib3V0cHV0U2VyaWFsaXphdGlvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9GQVVMVF9TRVJJQUxJWkFUSU9OID0gImZhdWx0U2VyaWFsaXphdGlvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9DT0RFID0gImNvZGUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfU1VCQ09ERVMgPSAic3ViY29kZXMiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfSEVBREVSID0gImhlYWRlciI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9UWVBFID0gInR5cGUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfUkVRVUlSRUQgPSAicmVxdWlyZWQiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTVVTVF9VTkRFUlNUQU5EID0gIm11c3RVbmRlcnN0YW5kIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX1ZFUlNJT04gPSAidmVyc2lvbiI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9QUk9UT0NPTCA9ICJwcm90b2NvbCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9TQUZFID0gInNhZmUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfQUREUkVTUyA9ICJhZGRyZXNzIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0FVVEhFTlRJQ0FUSU9OX1RZUEUgPSAiYXV0aGVudGljYXRpb25UeXBlIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0FVVEhFTlRJQ0FUSU9OX1JFQUxNID0gImF1dGhlbnRpY2F0aW9uUmVhbG0iOwotICAgIFN0cmluZyBBVFRSSUJVVEVfU1RZTEUgPSAic3R5bGUiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfU0lHTkFUVVJFID0gInNpZ25hdHVyZSI7Ci0gICAgU3RyaW5nIE9QRVJBVElPTl9TVFlMRSA9ICJvcGVyYXRpb25TdHlsZSI7Ci0gICAgU3RyaW5nIElOX1BVVF9MT0NBTF9OQU1FID0gImlucHV0IjsKLSAgICBTdHJpbmcgT1VUX1BVVF9MT0NBTF9OQU1FID0gIm91dHB1dCI7Ci0gICAgU3RyaW5nIE9VVF9GQVVMVF9MT0NBTF9OQU1FID0gIm91dGZhdWx0IjsKLSAgICBTdHJpbmcgSU5fRkFVTFRfTE9DQUxfTkFNRSA9ICJpbmZhdWx0IjsKLSAgICBTdHJpbmcgRkFVTFRfTE9DQUxfTkFNRSA9ICJmYXVsdCI7Ci0gICAgU3RyaW5nIEFUVFJJQlVURV9OQU1FX1BBVFRFUk4gPSAicGF0dGVybiI7Ci0gICAgU3RyaW5nIE1FU1NBR0VfTEFCRUwgPSAibWVzc2FnZUxhYmVsIjsKLSAgICBTdHJpbmcgQVRUUklCVVRFX0VMRU1FTlQgPSAiZWxlbWVudCI7Ci0KLSAgICBTdHJpbmcgQklORElOR19MT0NBTF9OQU1FID0gImJpbmRpbmciOwotICAgIFN0cmluZyBFTkRQT0lOVF9MT0NBTF9OQU1FID0gImVuZHBvaW50IjsKLSAgICBTdHJpbmcgU09BUF9CSU5ESU5HX1BSRUZJWCA9ICJTT0FQQmluZGluZyI7Ci0gICAgU3RyaW5nIEhUVFBfUFJPVE9DQUwgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAiOwotICAgIFN0cmluZyBTRVJWSUNFX0xPQ0FMX05BTUUgPSAic2VydmljZSI7Ci0KLSAgICBTdHJpbmcgVVJJX1dTT0FQX01FUCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvbWVwL3NvYXAtcmVzcG9uc2UvIjsKLQotICAgIFN0cmluZyBBVFRSX1dTT0FQX1BST1RPQ09MID0gIndzb2FwOnByb3RvY29sIjsKLSAgICBTdHJpbmcgQVRUUl9XU09BUF9WRVJTSU9OID0gIndzb2FwOnZlcnNpb24iOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0NPREUgPSAid3NvYXA6Y29kZSI7Ci0gICAgU3RyaW5nIEFUVFJfV1NPQVBfTUVQID0gIndzb2FwOm1lcCI7Ci0gICAgU3RyaW5nIEFUVFJfV1NPQVBfTU9EVUxFID0gIndzb2FwOm1vZHVsZSI7Ci0gICAgU3RyaW5nIEFUVFJfV1NPQVBfU1VCQ09ERVMgPSAid3NvYXA6c3ViY29kZXMiOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0hFQURFUiA9ICJ3c29hcDpoZWFkZXIiOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0FDVElPTiA9ICJ3c29hcDphY3Rpb24iOwotICAgIFN0cmluZyBBVFRSX1dTT0FQX0FERFJFU1MgPSAid3NvYXA6YWRkcmVzcyI7Ci0KLSAgICBTdHJpbmcgQVRUUl9XSFRUUF9DT05URU5UX0VOQ09ESU5HID0gIndodHRwOmNvbnRlbnRFbmNvZGluZyI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfTE9DQVRJT04gPSAid2h0dHA6bG9jYXRpb24iOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX0hFQURFUiA9ICJ3aHR0cDpoZWFkZXIiOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX01FVEhPRCA9ICJ3aHR0cDptZXRob2QiOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX0NPREUgPSAid2h0dHA6Y29kZSI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUiA9ICJ3aHR0cDpxdWVyeVBhcmFtZXRlclNlcGFyYXRvciI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQgPSAid2h0dHA6aWdub3JlVW5jaXRlZCI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfSU5QVVRfU0VSSUFMSVpBVElPTiA9ICJ3aHR0cDppbnB1dFNlcmlhbGl6YXRpb24iOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX09VVFBVVF9TRVJJQUxJWkFUSU9OID0gIndodHRwOm91dHB1dFNlcmlhbGl6YXRpb24iOwotICAgIFN0cmluZyBBVFRSX1dIVFRQX0ZBVUxUX1NFUklBTElaQVRJT04gPSAid2h0dHA6ZmF1bHRTZXJpYWxpemF0aW9uIjsKLSAgICBTdHJpbmcgQVRUUl9XSFRUUF9BVVRIRU5USUNBVElPTl9UWVBFID0gIndodHRwOmF1dGhlbnRpY2F0aW9uVHlwZSI7Ci0gICAgU3RyaW5nIEFUVFJfV0hUVFBfQVVUSEVOVElDQVRJT05fUkVBTE0gPSAid2h0dHA6YXV0aGVudGljYXRpb25SZWFsbSI7Ci0KLSAgICBTdHJpbmcgQVRUUl9XU0RMWF9TQUZFID0gIndzZGx4OnNhZmUiOwotCi0gICAgU3RyaW5nIEFUVFJfV1JQQ19TSUdOQVRVUkUgPSAid3JwYzpzaWduYXR1cmUiOwotCi0gICAgU3RyaW5nIFNPQVBfVkVSU0lPTl8xXzEgPSAiMS4xIjsKLSAgICBTdHJpbmcgU09BUF9WRVJTSU9OXzFfMiA9ICIxLjIiOwotCi0gICAgU3RyaW5nIE1FU1NBR0VfTEFCRUxfSU4gPSAiSW4iOwotICAgIFN0cmluZyBNRVNTQUdFX0xBQkVMX09VVCA9ICJPdXQiOwotCi0gICAgU3RyaW5nIFJQQ19JTiA9ICIjaW4iOwotICAgIFN0cmluZyBSUENfUkVUVVJOID0gIiNyZXR1cm4iOwotICAgIFN0cmluZyBSUENfSU5PVVQgPSAiI2lub3V0IjsKLQotICAgIFN0cmluZyBIVFRQX0xPQ0FUSU9OX1RBQkxFID0gIkhUVFBMb2NhdGlvblRhYmxlIjsKLQotICAgIC8vIFRoaXMgd2FzIHRha2VuIGZyb20gdGh5ZSByZXNvbHV0aW9uIG9mIENSMTE3IChXU0RMIDIuMCB3b3JraW5nIGdyb3VwKQotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnLzIwMDIvd3MvZGVzYy81L2NyLWlzc3Vlcy9pc3N1ZXMuaHRtbD92aWV3PW5vcm1hbCNDUjExNwotICAgIC8vIGh0dHA6Ly9saXN0cy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy13cy1kZXNjLzIwMDdGZWIvMDAzOS5odG1sCi0gICAgU3RyaW5nIExFR0FMX0NIQVJBQ1RFUlNfSU5fVVJMID0gIi0uX34hJCYoKSorLDs9OkA/LyUiOwotICAgIFN0cmluZyBMRUdBTF9DSEFSQUNURVJTX0lOX1BBVEggPSAiLS5ffiEkJygpKissOz06QCI7Ci0gICAgU3RyaW5nIExFR0FMX0NIQVJBQ1RFUlNfSU5fUVVFUlkgPSAiLS5ffiEkJygpKissOz06QC8/IjsKLSAgICBTdHJpbmcgVEVNUExBVEVfRU5DT0RFX0VTQ0FQSU5HX0NIQVJBQ1RFUiA9ICIhIjsKLQotICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvaW4tb25seSI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9JTl9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvcm9idXN0LWluLW9ubHkiOwotICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vdXQiOwotICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vcHQtb3V0IjsKLSAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9vdXQtb25seSI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9PVVRfT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL3JvYnVzdC1vdXQtb25seSI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9JTiA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL291dC1pbiI7Ci0gICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9PUFRJT05BTF9JTiA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL291dC1vcHQtaW4iOwotCi0gICAgcHVibGljIFN0cmluZyBTVFlMRV9JUkkgPSAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9zdHlsZS9pcmkiOwotICAgIHB1YmxpYyBTdHJpbmcgU1RZTEVfUlBDID0gImh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvc3R5bGUvcnBjIjsKLSAgICBwdWJsaWMgU3RyaW5nIFNUWUxFX01VTFRJUEFSVCA9ICJodHRwOi8vd3d3LnczLm9yZy9ucy93c2RsL3N0eWxlL211bHRpcGFydCI7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIE5NVE9LRU5fQU5ZID0gIiNhbnkiOwotICAgIHB1YmxpYyBTdHJpbmcgTk1UT0tFTl9OT05FID0gIiNub25lIjsKLSAgICBwdWJsaWMgU3RyaW5nIE5NVE9LRU5fT1RIRVIgPSAiI290aGVyIjsKLSAgICBwdWJsaWMgU3RyaW5nIE5NVE9LRU5fRUxFTUVOVCA9ICIjZWxlbWVudCI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDU5YjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExUb0F4aXNTZXJ2aWNlQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5yZXNvbHZlci5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MU0NIRU1BX05BTUVTUEFDRV9VUkkgPSBDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRDsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTFNDSEVNQV9OQU1FU1BBQ0VfUFJFRklYID0gInhzIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TQ0hFTUFfTE9DQUxfTkFNRSA9ICJzY2hlbWEiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQV9TRVFVRU5DRV9MT0NBTF9OQU1FID0gInNlcXVlbmNlIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TQ0hFTUFfQ09NUExFWF9UWVBFX0xPQ0FMX05BTUUgPSAiY29tcGxleFR5cGUiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQV9FTEVNRU5UX0xPQ0FMX05BTUUgPSAiZWxlbWVudCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0NIRU1BX0lNUE9SVF9MT0NBTF9OQU1FID0gImltcG9ydCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfTkFNRSA9ICJuYW1lIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9UQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TX0FYSVMyV1JBUFBFRCA9ICJ4bWxuczpheGlzMndyYXBwZWQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJXUkFQUEVEID0gImF4aXMyd3JhcHBlZCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfVFlQRSA9ICJ0eXBlIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9SRUYgPSAicmVmIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IG5zQ291bnQgPSAwOwotCi0gICAgcHJvdGVjdGVkIE1hcCByZXNvbHZlZFJwY1dyYXBwZWRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCA9ICJlbGVtZW50Rm9ybURlZmF1bHQiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX1VOUVVBTElGSUVEID0gInVucXVhbGlmaWVkIjsKLQotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbjsKLQotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLQotICAgIHByb3RlY3RlZCBQb2xpY3lSZWdpc3RyeSByZWdpc3RyeTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgIHByb3RlY3RlZCBRTmFtZSBzZXJ2aWNlTmFtZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlcnZlclNpZGUgPSB0cnVlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc3R5bGUgPSBudWxsOwotICAgIHByaXZhdGUgVVJJUmVzb2x2ZXIgY3VzdG9tUmVzb2x2ZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVyaSA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRVMgPSAiVHlwZXMiOwotCi0gICAgLy8ga2VlcGluZyB3aGV0aGVyIGJ1aWxkZXIgaXMgdXNlZCBpbiBjb2RlZ2VuIG9yIG5vdAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29kZWdlbjsKLQotICAgIHByb3RlY3RlZCBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIGluLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLmluID0gaW47Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXRQb2xpY3lSZWdpc3RyeUZyb21TZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIGluLCBBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICB0aGlzLmluID0gaW47Ci0gICAgICAgIHRoaXMuYXhpc1NlcnZpY2UgPSBheGlzU2VydmljZTsKLSAgICAgICAgc2V0UG9saWN5UmVnaXN0cnlGcm9tU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGN1c3RvbSB4bWxzY2hlbWEgVVJJIHJlc29sdmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY3VzdG9tUmVzb2x2ZXIgYSBVUklSZXNvbHZlciB0byB1c2Ugd2hlbiB3b3JraW5nIHdpdGggc2NoZW1hcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVJlc29sdmVyKFVSSVJlc29sdmVyIGN1c3RvbVJlc29sdmVyKSB7Ci0gICAgICAgIHRoaXMuY3VzdG9tUmVzb2x2ZXIgPSBjdXN0b21SZXNvbHZlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclNpZGUoKSB7Ci0gICAgICAgIHJldHVybiBpc1NlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZShib29sZWFuIHNlcnZlclNpZGUpIHsKLSAgICAgICAgaXNTZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQb2xpY3lSZWdpc3RyeUZyb21TZXJ2aWNlKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIFBvbGljeUluY2x1ZGUgcG9saWN5SW5jbHVkZSA9IGF4aXNTZXJ2aWNlLmdldFBvbGljeUluY2x1ZGUoKTsKLSAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHBvbGljeUluY2x1ZGUuZ2V0UG9saWN5UmVnaXN0cnkoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hIGdldFhNTFNjaGVtYShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gc2NoZW1hQ29sbGVjdGlvbiA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0KLSAgICAgICAgaWYgKGJhc2VVcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgc2NoZW1hQ29sbGVjdGlvbi5zZXRCYXNlVXJpKGJhc2VVcmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1c3RvbVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtYUNvbGxlY3Rpb24uc2V0U2NoZW1hUmVzb2x2ZXIoY3VzdG9tUmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNjaGVtYUNvbGxlY3Rpb24ucmVhZChlbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBYTUwgc2NoZW1hIHByZWZpeAotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYWN0aXZlIHNjaGVtYSBwcmVmaXgsIG9yIHRoZSBkZWZhdWx0IHNjaGVtYSBwcmVmaXggaWYgbm90IGRlY2xhcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kU2NoZW1hUHJlZml4KCkgewotICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gbnVsbDsKLSAgICAgICAgTWFwIGRlY2xhcmVkTmFtZVNwYWNlcyA9IGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpOwotICAgICAgICBpZiAoZGVjbGFyZWROYW1lU3BhY2VzLmNvbnRhaW5zVmFsdWUoWE1MU0NIRU1BX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICAvL2xvb3AgYW5kIGZpbmQgdGhlIHByZWZpeAotICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBkZWNsYXJlZE5hbWVTcGFjZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChYTUxTQ0hFTUFfTkFNRVNQQUNFX1VSSS5lcXVhbHMoZGVjbGFyZWROYW1lU3BhY2VzLmdldChrZXkpKSkgewotICAgICAgICAgICAgICAgICAgICB4c2RQcmVmaXggPSBrZXk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhzZFByZWZpeCA9IFhNTFNDSEVNQV9OQU1FU1BBQ0VfUFJFRklYOyAvL2RlZmF1bHQgcHJlZml4Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhzZFByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgQXhpc1NlcnZpY2UgcG9wdWxhdGVTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgcmV0dXJucyBhIERPTSBCdWlsZGVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmFtZXNwYWNlLWF3YXJlIERPTSBEb2N1bWVudEJ1aWxkZXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRG9jdW1lbnRCdWlsZGVyIGdldERPTURvY3VtZW50QnVpbGRlcigpIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIHRlbXBvcmFyeSBuYW1lc3BhY2UgcHJlZml4LiAgTk9UIHRocmVhZHNhZmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IG5hbWVzcGFjZSBwcmVmaXggb2YgdGhlIGZvcm0gIm5zWCIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBvcmFyeU5hbWVzcGFjZVByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuICJucyIgKyBuc0NvdW50Kys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFzZSBkb2N1bWVudAotICAgICAqIGZvciB0aGUgV1NETCBkZWZpbml0aW9uLiAgTm90ZSB0aGF0IHRoaXMgVVJJCi0gICAgICogaXMgZm9yIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgVVJJIGFzIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKCkgewotICAgICAgICByZXR1cm4gYmFzZVVyaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYXNlIGRvY3VtZW50Ci0gICAgICogZm9yIHRoZSBXU0RMIGRlZmluaXRpb24uICBOb3RlIHRoYXQgdGhpcyBVUkkKLSAgICAgKiBpcyBmb3IgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZVVyaSAgVGhlIFVSSSBhcyBhIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoU3RyaW5nIGJhc2VVcmkpIHsKLSAgICAgICAgdGhpcy5iYXNlVXJpID0gYmFzZVVyaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvZGVnZW4oKSB7Ci0gICAgICAgIHJldHVybiBpc0NvZGVnZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29kZWdlbihib29sZWFuIGNvZGVnZW4pIHsKLSAgICAgICAgaXNDb2RlZ2VuID0gY29kZWdlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBzdGFja1RvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gc3RhY2tUb1N0cmluZyhuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc3RhY2sgb2YgdGhlIHNwZWNpZmllZCBleGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgamF2YS5pby5TdHJpbmdXcml0ZXIgc3cgPSBuZXcgamF2YS5pby5TdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgamF2YS5pby5CdWZmZXJlZFdyaXRlciBidyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKHN3KTsKLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdyA9IG5ldyBqYXZhLmlvLlByaW50V3JpdGVyKGJ3KTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIC8vIEp1bXAgcGFzdCB0aGUgdGhyb3dhYmxlCi0gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0LmluZGV4T2YoImF0IikpOwotICAgICAgICB0ZXh0ID0gcmVwbGFjZSh0ZXh0LCAiYXQgIiwgIkRFQlVHX0ZSQU1FID0gIik7Ci0gICAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiByZXBsYWNlOiBMaWtlIFN0cmluZy5yZXBsYWNlIGV4Y2VwdCB0aGF0IHRoZSBvbGQgbmV3IGl0ZW1zIGFyZSBzdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgc3RyaW5nCi0gICAgICogQHBhcmFtIG9sZFQgb2xkIHRleHQgdG8gcmVwbGFjZQotICAgICAqIEBwYXJhbSBuZXdUIG5ldyB0ZXh0IHRvIHVzZQotICAgICAqIEByZXR1cm4gcmVwbGFjZW1lbnQgc3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVwbGFjZShTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvbGRULCBTdHJpbmcgbmV3VCkgewotCi0gICAgICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiAiIjsKLQotICAgICAgICAvLyBDcmVhdGUgYSBzdHJpbmcgYnVmZmVyIHRoYXQgaXMgdHdpY2UgaW5pdGlhbCBsZW5ndGguCi0gICAgICAgIC8vIFRoaXMgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LgotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKiAyKTsKLQotICAgICAgICBpbnQgbGVuID0gb2xkVC5sZW5ndGgoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgICBpbnQgaSA9IG5hbWUuaW5kZXhPZihvbGRULCBzdGFydCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpID49IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmV3VCk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgbGVuOwotICAgICAgICAgICAgICAgIGkgPSBuYW1lLmluZGV4T2Yob2xkVCwgc3RhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXJ0IDwgbmFtZS5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoc3RhcnQpKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc2IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB1c2VBeGlzQ29uZmlndXJhdGlvbihBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnKSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGF4aXNDb25maWc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9Bbm5vdGF0aW9uQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0Fubm90YXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5OTQ0Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0Fubm90YXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkNvbnN0YW50cyB7Ci0gICAgU3RyaW5nIFdFQl9TRVJWSUNFID0gImphdmF4Lmp3cy5XZWJTZXJ2aWNlIjsKLSAgICBTdHJpbmcgV0VCX01FVEhPRCA9ICJqYXZheC5qd3MuV2ViTWV0aG9kIjsKLSAgICBTdHJpbmcgV0VCX1BBUkFNID0gImphdmF4Lmp3cy5XZWJQYXJhbSI7Ci0gICAgU3RyaW5nIFdFQl9SRVNVTFQgPSAiamF2YXguandzLldlYlJlc3VsdCI7Ci0gICAgU3RyaW5nIFdFQl9TRVJWSUNFX1BST1ZJREVSID0gImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiOwotICAgIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKLSAgICBTdHJpbmcgU0VSVklDRV9OQU1FID0gInNlcnZpY2VOYW1lIjsKLSAgICBTdHJpbmcgRVhDTFVERSA9ICJleGNsdWRlIjsKLSAgICBTdHJpbmcgQUNUSU9OID0gImFjdGlvbiI7Ci0gICAgU3RyaW5nIFdTRExfTE9DQVRJT04gPSAid3NkbExvY2F0aW9uIjsKLSAgICBTdHJpbmcgT1BFUkFUSU9OX05BTUUgPSJvcGVyYXRpb25OYW1lIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvRGVmYXVsdE5hbWVzcGFjZUdlbmVyYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzdjN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9EZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRvaW4gZm9yIG1hcHBpbmcgamF2YSBjbGFzc2VzIHRvIG5hbWVzcGFjZXMKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TmFtZXNwYWNlR2VuZXJhdG9yIGltcGxlbWVudHMgTmFtZXNwYWNlR2VuZXJhdG9yIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQID0gImh0dHA6Ly8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBQQUNLQUdFX0NMQVNTX0RFTElNSVRFUiA9ICcuJzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFX0VYVE4gPSAiL3hzZCI7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5OYW1lc3BhY2VHZW5lcmF0b3IjbmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgaW50IHByZXZJbmRleCA9IHBhY2thZ2VOYW1lLmxlbmd0aCgpOwotICAgICAgICBpbnQgY3VycmVudEluZGV4ID0gcGFja2FnZU5hbWUubGFzdEluZGV4T2YoUEFDS0FHRV9DTEFTU19ERUxJTUlURVIpOwotICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkgewotICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChIVFRQKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcmV2SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKEhUVFApOwotICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RyQnVmOwotICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSAtMSkgewotLy8gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKEhUVFApOwotLy8gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJCdWY7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCAhPSAtMSkgewotICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChwYWNrYWdlTmFtZS5zdWJzdHJpbmcoY3VycmVudEluZGV4ICsgMSwgcHJldkluZGV4KSk7Ci0gICAgICAgICAgICBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXg7Ci0gICAgICAgICAgICBjdXJyZW50SW5kZXggPSBwYWNrYWdlTmFtZS5sYXN0SW5kZXhPZihQQUNLQUdFX0NMQVNTX0RFTElNSVRFUiwgcHJldkluZGV4IC0gMSk7Ci0gICAgICAgICAgICBzdHJCdWYuYXBwZW5kKFBBQ0tBR0VfQ0xBU1NfREVMSU1JVEVSKTsKLQotICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHN0ckJ1Zi5hcHBlbmQocGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIHByZXZJbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJCdWY7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuTmFtZXNwYWNlR2VuZXJhdG9yI3NjaGVtYU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgc2NoZW1hTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKS5hcHBlbmQoU0NIRU1BX05BTUVTUEFDRV9FWFROKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKEphdmEyV1NETENvbnN0YW50cy5ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChTQ0hFTUFfTkFNRVNQQUNFX0VYVE4pOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9EZWZhdWx0U2NoZW1hR2VuZXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0RlZmF1bHRTY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiNmM5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0RlZmF1bHRTY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuQmVhbkV4Y2x1ZGVJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uKjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZS5NZXRob2RUYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS51dGlscy5OYW1lc3BhY2VQcmVmaXhMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5CZWFuSW5mbzsKLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRTY2hlbWFHZW5lcmF0b3IgaW1wbGVtZW50cyBKYXZhMldTRExDb25zdGFudHMsIFNjaGVtYUdlbmVyYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdFNjaGVtYUdlbmVyYXRvci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NQQUNFX1BSRUZJWCA9ICJheDIiOy8vIGF4aXMyIG5hbWUgc3BhY2UKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwcmVmaXhDb3VudCA9IDE7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHByb3RlY3RlZCBNYXAgc2NoZW1hTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUNvbGxlY3Rpb24geG1sU2NoZW1hQ29sbGVjdGlvbiA9IG5ldyBYbWxTY2hlbWFDb2xsZWN0aW9uKCk7Ci0KLQotICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NOYW1lOwotCi0gICAgcHJvdGVjdGVkIFR5cGVUYWJsZSB0eXBlVGFibGUgPSBuZXcgVHlwZVRhYmxlKCk7Ci0KLSAgICAvLyB0byBrZWVwIGxvYWRkZWQgbWV0aG9kIHVzaW5nIEpBTQotICAgIHByb3RlY3RlZCBNZXRob2QgbWV0aG9kc1tdOwotCi0gICAgLy90byBzdG9yZSBieXRlIGNvZGUgbWV0aG9kIHVzaW5nIEF4aXMgMS54IGNvZGVzCi0gICAgcHJvdGVjdGVkIE1ldGhvZFRhYmxlIG1ldGhvZFRhYmxlOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzY2hlbWFUYXJnZXROYW1lU3BhY2U7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYV9uYW1lc3BhY2VfcHJlZml4OwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBhdHRyRm9ybURlZmF1bHQgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBleGNsdWRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHByb3RlY3RlZCBBcnJheUxpc3QgZXh0cmFDbGFzc2VzID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCBib29sZWFuIHVzZVdTRExUeXBlc05hbWVzcGFjZSA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIE1hcCBwa2cybnNtYXAgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbiA9IG51bGw7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgLy90byBrZWVwIHRoZSBsaXN0IG9mIG9wZXJhdGlvbiB3aGljaCB1c2VzIE1SIG90aGVyIHRoYW4gUlBDIE1SCi0gICAgcHJvdGVjdGVkIEFycmF5TGlzdCBub25ScGNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJvdGVjdGVkIENsYXNzIHNlcnZpY2VDbGFzcyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIEF4aXNTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgLy8gbG9jYXRpb24gb2YgdGhlIGN1c3RvbSBzY2hlbWEgLCBpZiBhbnkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbVNjaGVtYUxvY2F0aW9uOwotICAgIC8vIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIHRvIHBhY2thZ2UgbWFwcGluZyBmaWxlCi0gICAgLy8gRmlsZSBpcyBzaW1wbGUgZmlsZSB3aXRoIHF1YWxpZmllZENsYXNzTmFtZTpTY2hlbWFRTmFtZQotICAgIHByb3RlY3RlZCBTdHJpbmcgbWFwcGluZ0ZpbGVMb2NhdGlvbjsKLQotICAgIC8vVG8gY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGdlbmVyYXRlIFNjaGVtYSBlbGVtZW50IGZvciBFeGNlcHRpb24KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZUJhc2VFeGNlcHRpb247Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0QXR0cmlidXRlcyA9IHRydWU7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBOYW1lc3BhY2VHZW5lcmF0b3IgZ2V0TnNHZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5zR2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIG5zR2VuID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnNHZW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TnNHZW4oTmFtZXNwYWNlR2VuZXJhdG9yIG5zR2VuKSB7Ci0gICAgICAgIHRoaXMubnNHZW4gPSBuc0dlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFNjaGVtYUdlbmVyYXRvcihDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGxvYWRlcjsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0KLSAgICAgICAgc2VydmljZUNsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGxvYWRlcik7Ci0gICAgICAgIG1ldGhvZFRhYmxlID0gbmV3IE1ldGhvZFRhYmxlKHNlcnZpY2VDbGFzcyk7Ci0KLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSBKYXZhMldTRExVdGlscy50YXJnZXROYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwgbG9hZGVyLCBnZXROc0dlbigpKS50b1N0cmluZygpOwotCi0gICAgICAgIGlmIChzY2hlbWF0YXJnZXROYW1lc3BhY2UgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHNjaGVtYXRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgdGhpcy5zY2hlbWFUYXJnZXROYW1lU3BhY2UgPSBzY2hlbWF0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYVRhcmdldE5hbWVTcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETFV0aWxzLnNjaGVtYU5hbWVzcGFjZUZyb21DbGFzc05hbWUoY2xhc3NOYW1lLCBsb2FkZXIsIGdldE5zR2VuKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2NoZW1hdGFyZ2V0TmFtZXNwYWNlUHJlZml4ICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXggPSBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNjaGVtYV9uYW1lc3BhY2VfcHJlZml4ID0gU0NIRU1BX05BTUVTUEFDRV9QUkZJWDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmljZSAhPW51bGwgKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgc29ydEF0dCA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKCJTb3J0QXR0cmlidXRlcyIpOwotICAgICAgICAgICAgaWYgKHNvcnRBdHQgIT1udWxsICYmICJmYWxzZSIuZXF1YWxzKHNvcnRBdHQuZ2V0VmFsdWUoKSkpewotICAgICAgICAgICAgICAgIHNvcnRBdHRyaWJ1dGVzID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBnZW5lcmF0ZVdyYXBwZWRBcnJheVR5cGVzID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoImdlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMiKTsKLSAgICAgICAgICAgIGlmICgoZ2VuZXJhdGVXcmFwcGVkQXJyYXlUeXBlcyAhPSBudWxsKSAmJiBKYXZhVXRpbHMuaXNUcnVlKGdlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMuZ2V0VmFsdWUoKSkpewotICAgICAgICAgICAgICAgaXNHZW5lcmF0ZVdyYXBwZWRBcnJheVR5cGVzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICAvL1RoaXMgd2lsbCBsb2NhZCB0aGUgY3VzdG9tIHNjaGVtYSBmaWxlIGFuZCBhZGQgdGhhdCBpbnRvIHRoZSBzY2hlbWEgbWFwCi0gICAgcHJpdmF0ZSB2b2lkIGxvYWRDdXN0b21TY2hlbWFGaWxlKCkgewotICAgICAgICBpZiAoY3VzdG9tU2NoZW1hTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBGaWxlKGN1c3RvbVNjaGVtYUxvY2F0aW9uKSk7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IHhtbFNjaGVtYUNvbGxlY3Rpb24ucmVhZChkb2MsIG51bGwpOwotICAgICAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzY2hlbWEpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgbG9hZCB0aGUgbWFwcGluZyBmaWxlIGFuZCB1cGRhdGUgdGhlIFR5cGV0YWJsZSB3aXRoIHRoZSBDbGFzcyBuYW1lIGFuZCB0aGUgUW5hbWUKLSAgICAgKiBNYXBwaW5nIGZpbGUgbG9vayBsaWtlCi0gICAgICogb3JnLmZvby5iYXIuRm9vRXhjZXB0aW9ufGh0dHA6Ly93d3cuYWJjLmNvbS9zb2FmcmFtZXdvcmsvY29tbW9uL3R5cGVzfEVycm9yTWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBsb2FkTWFwcGluZ0ZpbGUoKSB7Ci0gICAgICAgIGlmIChtYXBwaW5nRmlsZUxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG1hcHBpbmdGaWxlTG9jYXRpb24pOwotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA+IDAgJiYgbGluZS5jaGFyQXQoMCkgIT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBsaW5lLnNwbGl0KCJcXHwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5hZGRDb21wbGV4U2NoZW1hKHZhbHVlc1swXSwgbmV3IFFOYW1lKHZhbHVlc1sxXSwgdmFsdWVzWzJdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgdGhlIHBhcmFtZXRlcnMgaW4gbWV0aG9kLiBGaXJzdCBnZW5lcmF0ZXMgc2NoZW1hIGZvciBhbGwgZGlmZmVyZW50Ci0gICAgICogcGFyYW1ldGVyIHR5cGUgYW5kIGxhdGVyIHJlZmVycyB0byB0aGVtLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFhtbFNjaGVtYS4KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdlbmVyYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGxvYWRDdXN0b21TY2hlbWFGaWxlKCk7Ci0gICAgICAgIGxvYWRNYXBwaW5nRmlsZSgpOwotICAgICAgICAvL2FsbCBtb3N0IGFsbCB0aGUgdGltZSB0aGUgaXR0ciB3aWxsIGhhdmUgb25seSBvbmUgY2xhc3MgaW4gaXQKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNjaGVtYSBnZW5lcnRhaW9uIGRvbmUgaW4gdHdvIHN0YWdlIDEuIExvYWQgYWxsIHRoZSBtZXRob2RzIGFuZAotICAgICAgICAgKiBjcmVhdGUgdHlwZSBmb3IgbWV0aG9kcyBwYXJhbWV0ZXJzIChpZiB0aGUgcGFyYW1ldGVycyBhcmUgQmVhbgotICAgICAgICAgKiB0aGVuIGl0IHdpbGwgY3JlYXRlIENvbXBsZXggdHlwZXMgZm9lciB0aG9zZSAsIGFuZCBpZiB0aGUKLSAgICAgICAgICogcGFyYW1ldGVycyBhcmUgc2ltcGxlIHR5cGUgd2hpY2ggZGVjcmliZSBpbiBTaW1wbGVUeXBlVGFibGUKLSAgICAgICAgICogbm90aGluZyB3aWxsIGhhcHBlbikgMi4gSW4gdGhlIG5leHQgc3RhZ2UgZm9yIGFsbCB0aGUgbWV0aG9kcwotICAgICAgICAgKiBtZXNzYWdlcyBhbmQgcG9ydCB0eXBlcyB3aWxsIGJlIGNyZXRlYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgV2ViU2VydmljZSB3ZWJlcnZpY2UgPSAoV2ViU2VydmljZSkgc2VydmljZUNsYXNzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRucyA9IHdlYmVydmljZS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIGlmICh0bnMgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHRucykpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSB0bnM7Ci0gICAgICAgICAgICAgICAgc2NoZW1hVGFyZ2V0TmFtZVNwYWNlID0gdG5zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VydmljZS5zZXROYW1lKFV0aWxzLmdldEFubm90YXRlZFNlcnZpY2VOYW1lKHNlcnZpY2VDbGFzcywgd2ViZXJ2aWNlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWV0aG9kcyA9IHByb2Nlc3NNZXRob2RzKHNlcnZpY2VDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKSk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFNYXAudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1ldGhvZFtdIHByb2Nlc3NNZXRob2RzKE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAvL3Nob3J0IHRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkKLSAgICAgICAgQXJyYXlzLnNvcnQoZGVjbGFyZWRNZXRob2RzLCBuZXcgTWF0aG9kQ29tcGFyYXRvcigpKTsKLQotCi0gICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG92ZXJsb2FkCi0gICAgICAgIEhhc2hNYXAgdW5pcXVlTWV0aG9kcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIG1ldGhvZFNjaGVtYVR5cGU7Ci0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2xhcmVkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgTWV0aG9kIGpNZXRob2QgPSBkZWNsYXJlZE1ldGhvZHNbaV07Ci0gICAgICAgICAgICBXZWJNZXRob2QgbWV0aG9kQW5ub24gPSBqTWV0aG9kLmdldEFubm90YXRpb24oV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm9uLmV4Y2x1ZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IGpNZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgLy8gbm8gbmVlZCB0byB0aGluayBhYnQgdGhpcyBtZXRob2QgLCBzaW5jZSB0aGF0IGlzIHN5c3RlbQotICAgICAgICAgICAgLy8gY29uZmlnIG1ldGhvZAotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVNZXRob2RzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh1bmlxdWVNZXRob2RzLmdldChtZXRob2ROYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oIldlIGRvbid0IHN1cHBvcnQgbWV0aG9kIG92ZXJsb2FkaW5nLiBJZ25vcmluZyBbIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lICsgIl0iKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMoak1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGdlbmVyYXRlIFNjaGVtYSBmb3Igbm9uIHB1YmxpYyBtZXRob2RzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIGFkZFRvU2VydmljZSA9IGZhbHNlOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gVXRpbHMuZ2V0QXhpc09wZXJhdGlvbkZvckptZXRob2Qoak1ldGhvZCk7Ci0vLyAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotLy8gICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLS8vICAgICAgICAgICAgICAgICAgICBpZiAob3V0TWVzc2FnZSAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXRob2ROYW1lICsgUkVTUE9OU0UpOwotLy8gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRUb1NlcnZpY2UgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTWFpbnRhaW4gYSBsaXN0IG9mIG1ldGhvZHMgd2UgYWN0dWFsbHkgd29yayB3aXRoCi0gICAgICAgICAgICBsaXN0LmFkZChqTWV0aG9kKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbihqTWV0aG9kLCBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIHVuaXF1ZU1ldGhvZHMucHV0KG1ldGhvZE5hbWUsIGpNZXRob2QpOwotICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJzID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWVzW10gPSBudWxsOwotICAgICAgICAgICAgQXhpc01lc3NhZ2UgaW5NZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICBpZiAoaW5NZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0TmFtZShtZXRob2ROYW1lICsgSmF2YTJXU0RMQ29uc3RhbnRzLk1FU1NBR0VfU1VGRklYKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lcyA9IG1ldGhvZFRhYmxlLmdldFBhcmFtZXRlck5hbWVzKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0KLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvck1ldGhvZFBhcnQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZS5zZXRQYXJ0aWNsZShzZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcobWV0aG9kU2NoZW1hVHlwZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9uID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgbWV0aG9kUGFyYW1ldGVyID0gcGFyYW1ldGVyc1tqXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IGdldFBhcmFtZXRlck5hbWUocGFyYW1ldGVyQW5ub3RhdGlvbiwgaiwgcGFyYW1ldGVyTmFtZXMpOwotICAgICAgICAgICAgICAgIGlmIChub25ScGNNZXRob2RzLmNvbnRhaW5zKGpNZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG51bGwsIGpNZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBtZXRob2RQYXJhbWV0ZXIsIHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZvciBpdHMgcmV0dXJuIHR5cGUKLSAgICAgICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBqTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIGlmICghInZvaWQiLmVxdWFscyhqTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRRbmFtZSA9IG1ldGhvZE5hbWUgKyBSRVNQT05TRTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KHBhcnRRbmFtZSk7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICBXZWJSZXN1bHQgcmV0dXJuQW5ub24gPSBqTWV0aG9kLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmV0dXJuTmFtZSA9ICJyZXR1cm4iOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5Bbm5vbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybk5hbWUgPSByZXR1cm5Bbm5vbi5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5OYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhyZXR1cm5OYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuTmFtZSA9ICJyZXR1cm4iOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChub25ScGNNZXRob2RzLmNvbnRhaW5zKGpNZXRob2QuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG51bGwsIHJldHVybk5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgcmV0dXJuVHlwZSwgcmV0dXJuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG91dE1lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKHBhcnRRbmFtZSkpOwotICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShwYXJ0UW5hbWUpOwotICAgICAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhtZXRob2RTY2hlbWFUeXBlLmdldFFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhZGRUb1NlcnZpY2UpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1ldGhvZFtdKSBsaXN0LnRvQXJyYXkobmV3IE1ldGhvZFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZ2VuZXJhdGUgU2NoZW1hIGVsZW1lbnQgZm9yIGFsbCB0aGUgZXhjZXRpb24gdHlwZXMgaW4gYSBnaXZlbiBKTWV0aG9kCi0gICAgICogLSBObyBtYXR0ZXIgd2hhdCBpdCB3aWxsIGdlbmVyYXRlIFNjaGVtYSBlbGVtZW50IGZvciBqYXZhLmxhbmcuRXhjZXB0aW9uIHNvIHRoYXQgZm9yIG90aGVyCi0gICAgICogZXhjZXB0aW9uIHdoaWNoIGV4dGVuZCBqYXZhLmxhbmcuRXhjZXRpb24gY2FuIHVzZSBhcyB0aGUgYmFzZSBjbGFzcyB0eXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0V4Y2VwdGlvbihNZXRob2Qgak1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIG1ldGhvZFNjaGVtYVR5cGU7Ci0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlOwotICAgICAgICBpZiAoak1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGlmICghZ2VuZXJhdGVCYXNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0gbmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldE5hbWUoIkV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoY29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoZWxlbWVudE5hbWUsIGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEoRXhjZXB0aW9uLmNsYXNzLmdldE5hbWUoKSwgZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IFR5cGVUYWJsZS5BTllfVFlQRTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVCYXNlRXhjZXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsYXNzW10gZXh0eXBlcyA9IGpNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0eXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIENsYXNzIGV4dHlwZSA9IGV4dHlwZXNbal07Ci0gICAgICAgICAgICAgICAgaWYgKEF4aXNGYXVsdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGV4dHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydFFuYW1lID0gZXh0eXBlLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvckZhdWx0KHBhcnRRbmFtZSk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHRoaXMuc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCBwYXJ0UW5hbWUsIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKGV4dHlwZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lID0gdHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShFeGNlcHRpb24uY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLmdldFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKEV4Y2VwdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHNlcXVlbmNlLCBleHR5cGUsIGV4dHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShwYXJ0UW5hbWUsIGVsZW1lbnROYW1lKTsKLQotICAgICAgICAgICAgICAgIGlmIChBeGlzRmF1bHQuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhleHR5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2UgZmF1bHRNZXNzYWdlID0gbmV3IEF4aXNNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldE5hbWUoZXh0eXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKHBhcnRRbmFtZSkpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyhmYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgc2NoZW1hIGNvbnN0cnVjdCBmb3IgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFUeXBlIDogQ2xhc3MgdG8gd2hjaWggbmVlZCB0byBnZW5lcmF0ZSBTY2hlbWEKLSAgICAgKiBAcmV0dXJuIDogR2VuZXJhdGVkIFFOYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFFOYW1lIGdlbmVyYXRlU2NoZW1hKENsYXNzIGphdmFUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRDbGFzc05hbWUoamF2YVR5cGUpOwotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShuYW1lKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lID0gamF2YVR5cGUuZ2V0U2ltcGxlTmFtZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRRdWFsaWZpZWROYW1lKGphdmFUeXBlLmdldFBhY2thZ2UoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZVNwYWNlID0gcmVzb2x2ZVNjaGVtYU5hbWVzcGFjZShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEodGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSAoU3RyaW5nKSB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBnZW5lcmF0ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcC5wdXQodGFyZ2V0TmFtZVNwYWNlLCB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50RXh0ZW5zaW9uIGNvbXBsZXhFeHRlbnNpb24gPQotICAgICAgICAgICAgICAgICAgICBuZXcgWG1sU2NoZW1hQ29tcGxleENvbnRlbnRFeHRlbnNpb24oKTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHRPdXRlciA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lU3BhY2UsIHNpbXBsZU5hbWUsIHRhcmdldE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICBlbHRPdXRlci5zZXROYW1lKHNpbXBsZU5hbWUpOwotICAgICAgICAgICAgZWx0T3V0ZXIuc2V0UU5hbWUoc2NoZW1hVHlwZU5hbWUpOwotCi0gICAgICAgICAgICBDbGFzcyBzdXAgPSBqYXZhVHlwZS5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoKHN1cCAhPSBudWxsKSAmJiAhKCJqYXZhLmxhbmcuT2JqZWN0Ii5jb21wYXJlVG8oc3VwLmdldE5hbWUoKSkgPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgIShnZXRRdWFsaWZpZWROYW1lKHN1cC5nZXRQYWNrYWdlKCkpLmluZGV4T2YoIm9yZy5hcGFjaGUuYXhpczIiKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICYmICEoZ2V0UXVhbGlmaWVkTmFtZShzdXAuZ2V0UGFja2FnZSgpKS5pbmRleE9mKCJqYXZhLnV0aWwiKSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlckNsYXNzTmFtZSA9IHN1cC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NuYW1lID0gc3VwLmdldFNpbXBsZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGd0TmFtZXNwYWNlOwotICAgICAgICAgICAgICAgIFN0cmluZyB0Z3ROYW1lc3BhY2VwZng7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUoc3VwZXJDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRndE5hbWVzcGFjZSA9IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2VwZnggPSBxTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2UgPSByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKGdldFF1YWxpZmllZE5hbWUoc3VwLmdldFBhY2thZ2UoKSkpOwotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2VwZnggPSAoU3RyaW5nKSB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAuZ2V0KHRndE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHN1cGVyQ2xhc3NRbmFtZSA9IGdlbmVyYXRlU2NoZW1hKHN1cCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdXBlckNsYXNzUW5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGd0TmFtZXNwYWNlcGZ4ID0gc3VwZXJDbGFzc1FuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGd0TmFtZXNwYWNlID0gc3VwZXJDbGFzc1FuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0Z3ROYW1lc3BhY2VwZnggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0Z3ROYW1lc3BhY2VwZnggPSBnZW5lcmF0ZVByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAucHV0KHRndE5hbWVzcGFjZSwgdGd0TmFtZXNwYWNlcGZ4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9pZiB0aGUgcGFyZW50IGNsYXNzIHBhY2thZ2UgbmFtZSBpcyBkaWZmZXIgZnJvbSB0aGUgY2hpbGQKLSAgICAgICAgICAgICAgICBpZiAoISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zKHRndE5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0TmFtZXNwYWNlKHRndE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChpbXBvcnRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgKChOYW1lc3BhY2VNYXApIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dChnZW5lcmF0ZVByZWZpeCgpLCB0Z3ROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFFOYW1lIGJhc2V0eXBlID0gbmV3IFFOYW1lKHRndE5hbWVzcGFjZSwgc3VwZXJjbGFzc25hbWUsIHRndE5hbWVzcGFjZXBmeCk7Ci0gICAgICAgICAgICAgICAgY29tcGxleEV4dGVuc2lvbi5zZXRCYXNlVHlwZU5hbWUoYmFzZXR5cGUpOwotICAgICAgICAgICAgICAgIGNvbXBsZXhFeHRlbnNpb24uc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhDb250ZW50IGNvbnRlbnRNb2RlbCA9IG5ldyBYbWxTY2hlbWFDb21wbGV4Q29udGVudCgpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRNb2RlbC5zZXRDb250ZW50KGNvbXBsZXhFeHRlbnNpb24pOwotICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldENvbnRlbnRNb2RlbChjb250ZW50TW9kZWwpOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHNlcXVlbmNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29tcGxleFR5cGUuc2V0TmFtZShzaW1wbGVOYW1lKTsKLQotLy8gICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZWx0T3V0ZXIpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKHNjaGVtYVR5cGVOYW1lLCBlbHRPdXRlcik7Ci0gICAgICAgICAgICBlbHRPdXRlci5zZXRTY2hlbWFUeXBlTmFtZShjb21wbGV4VHlwZS5nZXRRTmFtZSgpKTsKLQotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZChzY2hlbWFUeXBlTmFtZSwgY29tcGxleFR5cGUpOwotCi0gICAgICAgICAgICAvLyBhZGRpbmcgdGhpcyB0eXBlIHRvIHRoZSB0YWJsZQotICAgICAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobmFtZSwgZWx0T3V0ZXIuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICAvLyBhZGRpbmcgdGhpcyB0eXBlJ3MgcGFja2FnZSB0byB0aGUgdGFibGUsIHRvIHN1cHBvcnQgaW5oZXJpdGFuY2UuCi0gICAgICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShnZXRRdWFsaWZpZWROYW1lKGphdmFUeXBlLmdldFBhY2thZ2UoKSksIGVsdE91dGVyLmdldFFOYW1lKCkpOwotCi0gICAgICAgICAgICBCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldEV4Y2x1ZGVJbmZvKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJlYW5FeGNsdWRlSW5mbyA9IHNlcnZpY2UuZ2V0RXhjbHVkZUluZm8oKS5nZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcyhnZXRDbGFzc05hbWUoamF2YVR5cGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgcHJvcGVydGllcyBvbmx5IGZvciB0aGlzIGJlYW4uIGhlbmNlIGlnbm9yZSB0aGUgc3VwZXIKLSAgICAgICAgICAgIC8vIGNsYXNzIHByb3BlcnRpZXMKLSAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGphdmFUeXBlLCBqYXZhVHlwZS5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICAgICAgUHJvcGVydHlEZXNjcmlwdG9yW10gcHJvcGVydGllcyA9IGJlYW5JbmZvLmdldFByb3BlcnR5RGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKCJjbGFzcyIpICYmIChwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGJlYW5FeGNsdWRlSW5mbyA9PSBudWxsKSB8fCAhYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsKLSAgICB9Ci0KLQotICAgIC8vIG1vdmVkIGNvZGUgY29tbW9uIHRvIEZpZWxkcyAmIHByb3BlcnRpZXMgb3V0IG9mIGFib3ZlIG1ldGhvZAotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyhYbWxTY2hlbWEgeG1sU2NoZW1hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwgQ2xhc3MgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBcnJheVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZTsKLSAgICAgICAgaWYgKGlzQXJyYXlUeXBlKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAodHlwZS5nZXRDb21wb25lbnRUeXBlKCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGRvYmxlIGFycmF5IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBDbGFzcyBzaW1wbGVUeXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZVR5cGVOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNpbXBsZVR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGVOYW1lICs9ICJBcnJheU9mIjsKLSAgICAgICAgICAgICAgICAgICAgc2ltcGxlVHlwZSA9IHNpbXBsZVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTmFtZSArPSBzaW1wbGVUeXBlLmdldFNpbXBsZU5hbWUoKTsKLQotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShzaW1wbGVUeXBlTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXRQYXJ0aWNsZSh4bWxTY2hlbWFTZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hZm9yRmllbGRzYW5kUHJvcGVydGllcyh4bWxTY2hlbWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hU2VxdWVuY2UsIHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLCAiYXJyYXkiLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKHNpbXBsZVR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNpbXBsZVR5cGVOYW1lKSwgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCB4bWxTY2hlbWFFbGVtZW50ID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKCBuYW1lICsgIldyYXBwZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROaWxsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhUeXBlTmFtZSA9IHNpbXBsZVR5cGVOYW1lICsgIldyYXBwZXIiOwotCi0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHhtbFNjaGVtYVNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0TmFtZShjb21wbGV4VHlwZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCB4bWxTY2hlbWFDb21wbGV4VHlwZS5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZSh4bWxTY2hlbWFTZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoeG1sU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCBzaW1wbGVUeXBlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGUoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGVOYW1lKG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNpbXBsZVR5cGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0FycmF5VHlwZSAmJiAiYnl0ZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLSAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0RhdGFIYW5kbGVyKHR5cGUpKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSAiYmFzZTY0QmluYXJ5IjsKLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZVRhYmxlLmlzU2ltcGxlVHlwZShwcm9wZXJ0eU5hbWUpKSB7Ci0KLSAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgJiYgaXNBcnJheVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKCBuYW1lICsgIldyYXBwZXIiKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldE5pbGxhYmxlKHRydWUpOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhUeXBlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUocHJvcGVydHlOYW1lKS5nZXRMb2NhbFBhcnQoKSArICJXcmFwcGVyIjsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoeG1sU2NoZW1hLmdldFR5cGVCeU5hbWUoY29tcGxleFR5cGVOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHhtbFNjaGVtYVNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0TmFtZShjb21wbGV4VHlwZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRTY2hlbWFUeXBlcygpLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCB4bWxTY2hlbWFDb21wbGV4VHlwZS5nZXROYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudFRvU2VxdWVuY2UoImFycmF5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUuZXF1YWxzKCJiYXNlNjRCaW5hcnkiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gKFhtbFNjaGVtYUNvbXBsZXhUeXBlKSB4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShjb21wbGV4VHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZSh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlTmFtZShuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCB4bWxTY2hlbWFDb21wbGV4VHlwZS5nZXROYW1lKCkpKTsKLQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZEVsZW1lbnRUb1NlcXVlbmNlKG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0U2ltcGxlU2NoZW1hVHlwZU5hbWUocHJvcGVydHlOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLmVxdWFscygiYmFzZTY0QmluYXJ5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuaXNQcmltaXRpdmUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0FycmF5VHlwZSkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWEodHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgJiYgaXNBcnJheVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKG5hbWUgKyAiV3JhcHBlciIpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxleFR5cGVOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eU5hbWUpLmdldExvY2FsUGFydCgpICsgIldyYXBwZXIiOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShjb21wbGV4VHlwZU5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0UGFydGljbGUoeG1sU2NoZW1hU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRFbGVtZW50VG9TZXF1ZW5jZSgiYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZS5lcXVhbHMoImJhc2U2NEJpbmFyeSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuaXNQcmltaXRpdmUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGVOYW1lKG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSkpOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRWxlbWVudFRvU2VxdWVuY2UobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5pc1ByaW1pdGl2ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHR5cGVUYWJsZS5nZXRDb21wbGV4U2NoZW1hVHlwZShwcm9wZXJ0eU5hbWUpICE9IG51bGwgJiYgISgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS52YWx1ZXMoKS4KLSAgICAgICAgICAgICAgICAgICAgY29udGFpbnModHlwZVRhYmxlLmdldENvbXBsZXhTY2hlbWFUeXBlKHByb3BlcnR5TmFtZSkuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hSW1wb3J0IGltcG9ydEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hSW1wb3J0KCk7Ci0gICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudC5zZXROYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUocHJvcGVydHlOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGltcG9ydEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICgoTmFtZXNwYWNlTWFwKSB4bWxTY2hlbWEuZ2V0TmFtZXNwYWNlQ29udGV4dCgpKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dChnZW5lcmF0ZVByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGUuZ2V0Q29tcGxleFNjaGVtYVR5cGUocHJvcGVydHlOYW1lKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEVsZW1lbnRUb1NlcXVlbmNlKFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwcm9wZXJ0eVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Jhc2U2NEJpbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycnlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJpbWl0aXZlKSB7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWx0MSA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgIGVsdDEuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZShwcm9wZXJ0eVFOYW1lKTsKLSAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoZWx0MSk7Ci0gICAgICAgIGlmIChpc0FycnlUeXBlICYmICFpc0Jhc2U2NEJpbmFyeSkgewotICAgICAgICAgICAgZWx0MS5zZXRNYXhPY2N1cnMoTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsdDEuc2V0TWluT2NjdXJzKDApOwotICAgICAgICBpZiAoIWlzUHJpbWl0aXZlKSB7Ci0gICAgICAgICAgICBlbHQxLnNldE5pbGxhYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFFOYW1lIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwgQ2xhc3MgdHlwZSwgU3RyaW5nIHBhcnROYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgYm9vbGVhbiBpc0FycmF5VHlwZSA9IGZhbHNlOwotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0FycmF5VHlwZSA9IHR5cGUuaXNBcnJheSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0FycmF5VHlwZSkgewotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBkb2JsZSBhcnJheSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgQ2xhc3Mgc2ltcGxlVHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVUeXBlTmFtZSA9ICIiOwotICAgICAgICAgICAgICAgIHdoaWxlIChzaW1wbGVUeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBzaW1wbGVUeXBlTmFtZSArPSAiQXJyYXlPZiI7Ci0gICAgICAgICAgICAgICAgICAgIHNpbXBsZVR5cGUgPSBzaW1wbGVUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2ltcGxlVHlwZU5hbWUgKz0gc2ltcGxlVHlwZS5nZXRTaW1wbGVOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKHNpbXBsZVR5cGVOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIHhtbFNjaGVtYUNvbXBsZXhUeXBlID0gbmV3IFhtbFNjaGVtYUNvbXBsZXhUeXBlKHhtbFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHhtbFNjaGVtYVNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldFBhcnRpY2xlKHhtbFNjaGVtYVNlcXVlbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKHhtbFNjaGVtYVNlcXVlbmNlLCB0eXBlLmdldENvbXBvbmVudFR5cGUoKSwgImFycmF5Iik7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldE5hbWUoc2ltcGxlVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0U2NoZW1hVHlwZXMoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHhtbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2ltcGxlVHlwZU5hbWUpLCB4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzR2VuZXJhdGVXcmFwcGVkQXJyYXlUeXBlcykgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldE5hbWUocGFydE5hbWUgKyAiV3JhcHBlciIpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldE5pbGxhYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxleFR5cGVOYW1lID0gc2ltcGxlVHlwZU5hbWUgKyAiV3JhcHBlciI7Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0UGFydGljbGUoeG1sU2NoZW1hU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHhtbFNjaGVtYVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh4bWxTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHNpbXBsZVR5cGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZSh4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZU5hbWUobmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoeG1sU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wbGV4VHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRlbnRUb01ldGhvZFNjaGVtYVR5cGUoc2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHhtbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2ltcGxlVHlwZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKHhtbFNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgc2ltcGxlVHlwZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQXhpc0ZhdWx0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjbGFzc1R5cGVOYW1lOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gImphdmEubGFuZy5PYmplY3QiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0FycmF5VHlwZSAmJiAiYnl0ZSIuZXF1YWxzKGNsYXNzVHlwZU5hbWUpKSB7Ci0gICAgICAgICAgICBjbGFzc1R5cGVOYW1lID0gImJhc2U2NEJpbmFyeSI7Ci0gICAgICAgICAgICBpc0FycmF5VHlwZSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGF0YUhhbmRsZXIodHlwZSkpIHsKLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSAiYmFzZTY0QmluYXJ5IjsKLSAgICAgICAgfQotICAgICAgICBRTmFtZSBzY2hlbWFUeXBlTmFtZSA9IHR5cGVUYWJsZS5nZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShjbGFzc1R5cGVOYW1lKTsKLSAgICAgICAgaWYgKHNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID0gZ2VuZXJhdGVTY2hlbWEodHlwZSk7Ci0gICAgICAgICAgICBpZiAoaXNHZW5lcmF0ZVdyYXBwZWRBcnJheVR5cGVzICYmIGlzQXJyYXlUeXBlKSB7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IHhtbFNjaGVtYUVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0TmFtZShwYXJ0TmFtZSArICJXcmFwcGVyIik7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROaWxsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZCh4bWxTY2hlbWFFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV4VHlwZU5hbWUgPSBzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSArICJXcmFwcGVyIjsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0KLSAgICAgICAgICAgICAgICBYbWxTY2hlbWFDb21wbGV4VHlwZSB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBsZXhUeXBlTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWFTZXF1ZW5jZSB4bWxTY2hlbWFTZXF1ZW5jZSA9IG5ldyBYbWxTY2hlbWFTZXF1ZW5jZSgpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXRQYXJ0aWNsZSh4bWxTY2hlbWFTZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYUNvbXBsZXhUeXBlLnNldE5hbWUoY29tcGxleFR5cGVOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuZ2V0U2NoZW1hVHlwZXMoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRlbnRUb01ldGhvZFNjaGVtYVR5cGUoeG1sU2NoZW1hU2VxdWVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZSA9IChYbWxTY2hlbWFDb21wbGV4VHlwZSkgeG1sU2NoZW1hLmdldFR5cGVCeU5hbWUoY29tcGxleFR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGUoeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0U2NoZW1hVHlwZU5hbWUobmV3IFFOYW1lKHNjaGVtYVRhcmdldE5hbWVTcGFjZSwgeG1sU2NoZW1hQ29tcGxleFR5cGUuZ2V0TmFtZSgpKSk7Ci0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWVzcGFjZTsKLSAgICAgICAgICAgIHNjaGVtYU5hbWVzcGFjZSA9IHJlc29sdmVTY2hlbWFOYW1lc3BhY2UoZ2V0UXVhbGlmaWVkTmFtZSh0eXBlLmdldFBhY2thZ2UoKSkpOwotICAgICAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFOYW1lc3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpc0dlbmVyYXRlV3JhcHBlZEFycmF5VHlwZXMgJiYgaXNBcnJheVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgeG1sU2NoZW1hRWxlbWVudCA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXROYW1lKHBhcnROYW1lICsiV3JhcHBlciIpOwotICAgICAgICAgICAgICAgIHhtbFNjaGVtYUVsZW1lbnQuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UuZ2V0SXRlbXMoKS5hZGQoeG1sU2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY29tcGxleFR5cGVOYW1lID0gc2NoZW1hVHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiV3JhcHBlciI7Ci0gICAgICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpOwotCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh4bWxTY2hlbWEuZ2V0VHlwZUJ5TmFtZShjb21wbGV4VHlwZU5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2UgeG1sU2NoZW1hU2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUuc2V0UGFydGljbGUoeG1sU2NoZW1hU2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWFDb21wbGV4VHlwZS5zZXROYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmdldFNjaGVtYVR5cGVzKCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHhtbFNjaGVtYVNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheVR5cGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hQ29tcGxleFR5cGUgPSAoWG1sU2NoZW1hQ29tcGxleFR5cGUpIHhtbFNjaGVtYS5nZXRUeXBlQnlOYW1lKGNvbXBsZXhUeXBlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgeG1sU2NoZW1hRWxlbWVudC5zZXRTY2hlbWFUeXBlKHhtbFNjaGVtYUNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgICAgICB4bWxTY2hlbWFFbGVtZW50LnNldFNjaGVtYVR5cGVOYW1lKG5ldyBRTmFtZShzY2hlbWFUYXJnZXROYW1lU3BhY2UsIHhtbFNjaGVtYUNvbXBsZXhUeXBlLmdldE5hbWUoKSkpOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBhZGRJbXBvcnQoZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSksIHNjaGVtYVR5cGVOYW1lKTsKLSAgICAgICAgcmV0dXJuIHNjaGVtYVR5cGVOYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YUhhbmRsZXIoQ2xhc3MgY2xhenopIHsKLSAgICAgICAgcmV0dXJuIGNsYXp6ICE9IG51bGwgJiYgRGF0YUhhbmRsZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShYbWxTY2hlbWFTZXF1ZW5jZSBzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5KSB7Ci0gICAgICAgIFhtbFNjaGVtYUVsZW1lbnQgZWx0MSA9IG5ldyBYbWxTY2hlbWFFbGVtZW50KCk7Ci0gICAgICAgIGVsdDEuc2V0TmFtZShwYXJhTmFtZSk7Ci0KLSAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZShzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIGlmIChzZXF1ZW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXF1ZW5jZS5nZXRJdGVtcygpLmFkZChlbHQxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc0FycmF5KSB7Ci0gICAgICAgICAgICBlbHQxLnNldE1heE9jY3VycyhMb25nLk1BWF9WQUxVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWx0MS5zZXRNaW5PY2N1cnMoMCk7Ci0gICAgICAgIGlmICghKCJpbnQiLmVxdWFscyhzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSkgfHwKLSAgICAgICAgICAgICAgICAiZG91YmxlIi5lcXVhbHMoc2NoZW1hVHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCkpIHx8Ci0gICAgICAgICAgICAgICAgImxvbmciLmVxdWFscyhzY2hlbWFUeXBlTmFtZS5nZXRMb2NhbFBhcnQoKSkgfHwKLSAgICAgICAgICAgICAgICAiYm9vbGVhbiIuZXF1YWxzKHNjaGVtYVR5cGVOYW1lLmdldExvY2FsUGFydCgpKSB8fAotICAgICAgICAgICAgICAgICJzaG9ydCIuZXF1YWxzKHNjaGVtYVR5cGVOYW1lLmdldExvY2FsUGFydCgpKSB8fAotICAgICAgICAgICAgICAgICJmbG9hdCIuZXF1YWxzKHNjaGVtYVR5cGVOYW1lLmdldExvY2FsUGFydCgpKSkpIHsKLSAgICAgICAgICAgIGVsdDEuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNyZWF0ZVNjaGVtYVR5cGVGb3JNZXRob2RQYXJ0KFN0cmluZyBsb2NhbFBhcnROYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh0aGlzLnNjaGVtYVRhcmdldE5hbWVTcGFjZSwgbG9jYWxQYXJ0TmFtZSwgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSBnZXRDb21wbGV4VHlwZUZvckVsZW1lbnQoeG1sU2NoZW1hLCBlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChjb21wbGV4VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotCi0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGdsb2JhbEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXRTY2hlbWFUeXBlKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0TmFtZShsb2NhbFBhcnROYW1lKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0UU5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGdsb2JhbEVsZW1lbnQpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKGVsZW1lbnROYW1lLCBnbG9iYWxFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICB0eXBlVGFibGUuYWRkQ29tcGxleFNjaGVtYShsb2NhbFBhcnROYW1lLCBlbGVtZW50TmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlOwotICAgIH0KLQotICAgIHByaXZhdGUgWG1sU2NoZW1hQ29tcGxleFR5cGUgY3JlYXRlU2NoZW1hVHlwZUZvckZhdWx0KFN0cmluZyBsb2NhbFBhcnROYW1lKSB7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSBnZXRYbWxTY2hlbWEoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlKTsKLSAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSh0aGlzLnNjaGVtYVRhcmdldE5hbWVTcGFjZSwgbG9jYWxQYXJ0TmFtZSwgdGhpcy5zY2hlbWFfbmFtZXNwYWNlX3ByZWZpeCk7Ci0KLSAgICAgICAgWG1sU2NoZW1hQ29tcGxleFR5cGUgY29tcGxleFR5cGUgPSBnZXRDb21wbGV4VHlwZUZvckVsZW1lbnQoeG1sU2NoZW1hLCBlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmIChjb21wbGV4VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wbGV4VHlwZSA9IG5ldyBYbWxTY2hlbWFDb21wbGV4VHlwZSh4bWxTY2hlbWEpOwotCi0gICAgICAgICAgICBYbWxTY2hlbWFFbGVtZW50IGdsb2JhbEVsZW1lbnQgPSBuZXcgWG1sU2NoZW1hRWxlbWVudCgpOwotICAgICAgICAgICAgZ2xvYmFsRWxlbWVudC5zZXRTY2hlbWFUeXBlKGNvbXBsZXhUeXBlKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0TmFtZShsb2NhbFBhcnROYW1lKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0UU5hbWUoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGdsb2JhbEVsZW1lbnQpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEVsZW1lbnRzKCkuYWRkKGVsZW1lbnROYW1lLCBnbG9iYWxFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxleFR5cGU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGdldENvbXBsZXhUeXBlRm9yRWxlbWVudChYbWxTY2hlbWEgeG1sU2NoZW1hLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0geG1sU2NoZW1hLmdldEl0ZW1zKCkuZ2V0SXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgWG1sU2NoZW1hT2JqZWN0IG9iamVjdCA9IChYbWxTY2hlbWFPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYbWxTY2hlbWFFbGVtZW50ICYmICgoWG1sU2NoZW1hRWxlbWVudCkgb2JqZWN0KS5nZXRRTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoWG1sU2NoZW1hQ29tcGxleFR5cGUpICgoWG1sU2NoZW1hRWxlbWVudCkgb2JqZWN0KS5nZXRTY2hlbWFUeXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYSBnZXRYbWxTY2hlbWEoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hOwotCi0gICAgICAgIGlmICgoeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hTWFwLmdldCh0YXJnZXROYW1lc3BhY2UpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhzY2hlbWFUYXJnZXROYW1lU3BhY2UpICYmCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYV9uYW1lc3BhY2VfcHJlZml4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWFfbmFtZXNwYWNlX3ByZWZpeDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gZ2VuZXJhdGVQcmVmaXgoKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB4bWxTY2hlbWEgPSBuZXcgWG1sU2NoZW1hKHRhcmdldE5hbWVzcGFjZSwgeG1sU2NoZW1hQ29sbGVjdGlvbik7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuc2V0QXR0cmlidXRlRm9ybURlZmF1bHQoZ2V0QXR0ckZvcm1EZWZhdWx0U2V0dGluZygpKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5zZXRFbGVtZW50Rm9ybURlZmF1bHQoZ2V0RWxlbWVudEZvcm1EZWZhdWx0U2V0dGluZygpKTsKLQotCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXhNYXAucHV0KHRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWEpOwotCi0gICAgICAgICAgICBOYW1lc3BhY2VNYXAgcHJlZml4bWFwID0gbmV3IE5hbWVzcGFjZU1hcCgpOwotICAgICAgICAgICAgcHJlZml4bWFwLnB1dChERUZBVUxUX1NDSEVNQV9OQU1FU1BBQ0VfUFJFRklYLCBVUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgICAgIHByZWZpeG1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlUHJlZml4LCB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgeG1sU2NoZW1hLnNldE5hbWVzcGFjZUNvbnRleHQocHJlZml4bWFwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4geG1sU2NoZW1hOwotICAgIH0KLQotCi0gICAgcHVibGljIFR5cGVUYWJsZSBnZXRUeXBlVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZFtdIGdldE1ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBOQU1FX1NQQUNFX1BSRUZJWCArIHByZWZpeENvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZU1ldGhvZHMoQXJyYXlMaXN0IGV4Y2x1ZGVNZXRob2RzKSB7Ci0gICAgICAgIGlmIChleGNsdWRlTWV0aG9kcyA9PSBudWxsKSBleGNsdWRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5leGNsdWRlTWV0aG9kcyA9IGV4Y2x1ZGVNZXRob2RzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZVNwYWNlKCkgewotICAgICAgICByZXR1cm4gc2NoZW1hVGFyZ2V0TmFtZVNwYWNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZEltcG9ydChYbWxTY2hlbWEgeG1sU2NoZW1hLCBRTmFtZSBzY2hlbWFUeXBlTmFtZSkgewotICAgICAgICBOYW1lc3BhY2VQcmVmaXhMaXN0IG1hcCA9IHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICgobWFwIGluc3RhbmNlb2YgTmFtZXNwYWNlTWFwKSAmJiAoKE5hbWVzcGFjZU1hcCkgbWFwKS52YWx1ZXMoKSA9PSBudWxsKSB8fAotICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTmFtZXNwYWNlTWFwICYmICEoKE5hbWVzcGFjZU1hcCkgbWFwKS52YWx1ZXMoKS4KLSAgICAgICAgICAgICAgICBjb250YWlucyhzY2hlbWFUeXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgIFhtbFNjaGVtYUltcG9ydCBpbXBvcnRFbGVtZW50ID0gbmV3IFhtbFNjaGVtYUltcG9ydCgpOwotICAgICAgICAgICAgaW1wb3J0RWxlbWVudC5zZXROYW1lc3BhY2Uoc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmdldEl0ZW1zKCkuYWRkKGltcG9ydEVsZW1lbnQpOwotICAgICAgICAgICAgKChOYW1lc3BhY2VNYXApIHhtbFNjaGVtYS5nZXROYW1lc3BhY2VDb250ZXh0KCkpLgotICAgICAgICAgICAgICAgICAgICBwdXQoZ2VuZXJhdGVQcmVmaXgoKSwgc2NoZW1hVHlwZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyRm9ybURlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyRm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0ckZvcm1EZWZhdWx0KFN0cmluZyBhdHRyRm9ybURlZmF1bHQpIHsKLSAgICAgICAgdGhpcy5hdHRyRm9ybURlZmF1bHQgPSBhdHRyRm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEZvcm1EZWZhdWx0KFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUZvcm0gZ2V0QXR0ckZvcm1EZWZhdWx0U2V0dGluZygpIHsKLSAgICAgICAgaWYgKEZPUk1fREVGQVVMVF9VTlFVQUxJRklFRC5lcXVhbHMoZ2V0QXR0ckZvcm1EZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5VTlFVQUxJRklFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5RVUFMSUZJRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFhtbFNjaGVtYUZvcm0gZ2V0RWxlbWVudEZvcm1EZWZhdWx0U2V0dGluZygpIHsKLSAgICAgICAgaWYgKEZPUk1fREVGQVVMVF9VTlFVQUxJRklFRC5lcXVhbHMoZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5VTlFVQUxJRklFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbFNjaGVtYUZvcm0oWG1sU2NoZW1hRm9ybS5RVUFMSUZJRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRFeHRyYUNsYXNzZXMoKSB7Ci0gICAgICAgIGlmIChleHRyYUNsYXNzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZXh0cmFDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHRyYUNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFDbGFzc2VzKEFycmF5TGlzdCBleHRyYUNsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5leHRyYUNsYXNzZXMgPSBleHRyYUNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vaWYgYWxsIHR5cGVzIG11c3QgZ28gaW50byB0aGUgd3NkbCB0eXBlcyBzY2hlbWEgbmFtZXNwYWNlCi0gICAgICAgIGlmICh1c2VXU0RMVHlwZXNOYW1lc3BhY2UpIHsKLSAgICAgICAgICAgIC8vcmV0dXJuIHNjaGVtYVRhcmdldE5hbWVTcGFjZTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBwa2cybnNtYXAuZ2V0KCJhbGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwa2cybnNtYXAgIT0gbnVsbCAmJiAhcGtnMm5zbWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIC8vaWYgdHlwZXMgc2hvdWxkIGdvIGludG8gbmFtZXNwYWNlcyB0aGF0IGFyZSBtYXBwZWQgYWdhaW5zdCB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGUgdHlwZQotICAgICAgICAgICAgICAgIGlmIChwa2cybnNtYXAuZ2V0KHBhY2thZ2VOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRoYXQgbWFwcGluZwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcGtnMm5zbWFwLmdldChwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE5zR2VuKCkuc2NoZW1hTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgIHBrZzJuc21hcCBpcyBudWxsIGFuZCBpZiBub3QgZGVmYXVsdCBzY2hlbWEgbnMgZm91bmQgZm9yIHRoZSBjdXN0b20gYmVhbgotICAgICAgICAgICAgICAgIHJldHVybiBnZXROc0dlbigpLnNjaGVtYU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlV1NETFR5cGVzTmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdXNlV1NETFR5cGVzTmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZVdTRExUeXBlc05hbWVzcGFjZShib29sZWFuIHVzZVdTRExUeXBlc05hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnVzZVdTRExUeXBlc05hbWVzcGFjZSA9IHVzZVdTRExUeXBlc05hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFBrZzJuc21hcCgpIHsKLSAgICAgICAgcmV0dXJuIHBrZzJuc21hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQa2cybnNtYXAoTWFwIHBrZzJuc21hcCkgewotICAgICAgICB0aGlzLnBrZzJuc21hcCA9IHBrZzJuc21hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShDbGFzcyB0eXBlKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lLmluZGV4T2YoIiQiKSA+IDApIHsKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyQnLCAnXycpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShQYWNrYWdlIHBhY2thZ2V6KSB7Ci0gICAgICAgIGlmIChwYWNrYWdleiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZXouZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Tm9uUnBjTWV0aG9kcyhBcnJheUxpc3Qgbm9uUnBjTWV0aG9kcykgewotICAgICAgICBpZiAobm9uUnBjTWV0aG9kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm5vblJwY01ldGhvZHMgPSBub25ScGNNZXRob2RzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDdXN0b21TY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbVNjaGVtYUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVNjaGVtYUxvY2F0aW9uKFN0cmluZyBjdXN0b21TY2hlbWFMb2NhdGlvbikgewotICAgICAgICB0aGlzLmN1c3RvbVNjaGVtYUxvY2F0aW9uID0gY3VzdG9tU2NoZW1hTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNYXBwaW5nRmlsZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gbWFwcGluZ0ZpbGVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwaW5nRmlsZUxvY2F0aW9uKFN0cmluZyBtYXBwaW5nRmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMubWFwcGluZ0ZpbGVMb2NhdGlvbiA9IG1hcHBpbmdGaWxlTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKEFubm90YXRpb25bXVtdIHBhcmFtZXRlckFubm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJOYW1lcykgewotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJBbm5vdGF0aW9uLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIEFubm90YXRpb25bXSB0ZW1wQW5ub24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9uW2pdOwotICAgICAgICAgICAgaWYgKHRlbXBBbm5vbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgV2ViUGFyYW0gcGFyYSA9IChXZWJQYXJhbSkgdGVtcEFubm9uWzBdOwotICAgICAgICAgICAgICAgIGlmIChwYXJhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IHBhcmEubmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXJhbWV0ZXJOYW1lKSkgewotICAgICAgICAgICAgaWYocGFyYW1ldGVyTmFtZXMgIT0gbnVsbCAmJiBwYXJhbWV0ZXJOYW1lcy5sZW5ndGggPiBqKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlck5hbWVzW2pdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMocGFyYW1ldGVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJOYW1lID0gImFyZ3MiICsgajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTWF0aG9kQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QxID0gKE1ldGhvZCkgbzE7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kMiA9IChNZXRob2QpIG8yOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIHZhbHVlc1swXSA9IG1ldGhvZDEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgdmFsdWVzWzFdID0gbWV0aG9kMi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydCh2YWx1ZXMpOwotICAgICAgICAgICAgaWYgKHZhbHVlc1swXS5lcXVhbHMobWV0aG9kMS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIFByb3BlcnR5Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IxID0gKFByb3BlcnR5RGVzY3JpcHRvcikgbzE7Ci0gICAgICAgICAgICBQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yMiA9IChQcm9wZXJ0eURlc2NyaXB0b3IpIG8yOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgICAgIHZhbHVlc1swXSA9IHByb3BlcnR5RGVzY3JpcHRvcjEuZ2V0TmFtZSgpOwotICAgICAgICAgICAgdmFsdWVzWzFdID0gcHJvcGVydHlEZXNjcmlwdG9yMi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBBcnJheXMuc29ydCh2YWx1ZXMpOwotICAgICAgICAgICAgaWYgKHZhbHVlc1swXS5lcXVhbHMocHJvcGVydHlEZXNjcmlwdG9yMS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvRG9jTGl0QmFyZVNjaGVtYUdlbmVyYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTkxMDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9Eb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbXBsZXhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYVNlcXVlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEudXRpbHMuTmFtZXNwYWNlTWFwOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgRG9jTGl0QmFyZVNjaGVtYUdlbmVyYXRvciBleHRlbmRzIERlZmF1bHRTY2hlbWFHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERvY0xpdEJhcmVTY2hlbWFHZW5lcmF0b3IuY2xhc3MpOwotICAgIHByaXZhdGUgSGFzaE1hcCBwcm9jZXNzZWRQYXJhbWV0ZXJzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBEb2NMaXRCYXJlU2NoZW1hR2VuZXJhdG9yKENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWF0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYXRhcmdldE5hbWVzcGFjZVByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIobG9hZGVyLCBjbGFzc05hbWUsIHNjaGVtYXRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICBzY2hlbWF0YXJnZXROYW1lc3BhY2VQcmVmaXgsIHNlcnZpY2UpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBNZXRob2RbXSBwcm9jZXNzTWV0aG9kcyhNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgLy9zaG9ydCB0aGUgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gICAgICAgIEFycmF5cy5zb3J0KGRlY2xhcmVkTWV0aG9kcyAsIG5ldyBNYXRob2RDb21wYXJhdG9yKCkpOwotCi0gICAgICAgIC8vIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG92ZXJsb2FkCi0gICAgICAgIEhhc2hNYXAgdW5pcXVlTWV0aG9kcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIG1ldGhvZFNjaGVtYVR5cGU7Ci0gICAgICAgIFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2Qgak1ldGhvZCA9IGRlY2xhcmVkTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIFdlYk1ldGhvZCBtZXRob2RBbm5vbiA9IGpNZXRob2QuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub24uZXhjbHVkZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gak1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHRoaW5rIGFidCB0aGlzIG1ldGhvZCAsIHNpbmNlIHRoYXQgaXMgc3lzdGVtCi0gICAgICAgICAgICAvLyBjb25maWcgbWV0aG9kCi0gICAgICAgICAgICBpZiAoZXhjbHVkZU1ldGhvZHMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVuaXF1ZU1ldGhvZHMuZ2V0KG1ldGhvZE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiV2UgZG9uJ3Qgc3VwcG9ydCBtZXRob2Qgb3ZlcmxvYWRpbmcuIElnbm9yaW5nIFsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgKyAiXSIpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgIGlmICghTW9kaWZpZXIuaXNQdWJsaWMoak1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGdlbmVyYXRlIFNjaGVtYSBmb3Igbm9uIHB1YmxpYyBtZXRob2RzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gYWRkVG9TZXJ2aWNlID0gZmFsc2U7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUobWV0aG9kTmFtZSkpOwotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBVdGlscy5nZXRBeGlzT3BlcmF0aW9uRm9ySm1ldGhvZChqTWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpewotICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBvdXRNZXNzYWdlID0gYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0TWVzc2FnZSAhPW51bGwgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lc3NhZ2Uuc2V0TmFtZShtZXRob2ROYW1lICsgUkVTVUxUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRUb1NlcnZpY2UgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBNYWludGFpbiBhIGxpc3Qgb2YgbWV0aG9kcyB3ZSBhY3R1YWxseSB3b3JrIHdpdGgKLSAgICAgICAgICAgIGxpc3QuYWRkKGpNZXRob2QpOwotICAgICAgICAgICAgcHJvY2Vzc0V4Y2VwdGlvbihqTWV0aG9kLGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgdW5pcXVlTWV0aG9kcy5wdXQobWV0aG9kTmFtZSwgak1ldGhvZCk7Ci0gICAgICAgICAgICAvL2NyZWF0ZSB0aGUgc2NoZW1hIHR5cGUgZm9yIHRoZSBtZXRob2Qgd3JhcHBlcgotCi0gICAgICAgICAgICB1bmlxdWVNZXRob2RzLnB1dChtZXRob2ROYW1lLCBqTWV0aG9kKTsKLSAgICAgICAgICAgIENsYXNzIFtdIHBhcmFzID0gak1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWVzW10gPSBtZXRob2RUYWJsZS5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2ROYW1lKTsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGluTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICAgICAgaWYgKGluTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldE5hbWUobWV0aG9kTmFtZSArICJSZXF1ZXN0TWVzc2FnZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQW5ub3RhdGlvbltdW10gcGFyYW1ldGVyQW5ub3RhdGlvbiA9IGpNZXRob2QuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhcy5sZW5ndGggPiAxKSB7Ci0gICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLSAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvck1ldGhvZFBhcnQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgbWV0aG9kU2NoZW1hVHlwZS5zZXRQYXJ0aWNsZShzZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcobWV0aG9kU2NoZW1hVHlwZS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFBhcnROYW1lKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFyYXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbWV0aG9kUGFyYW1ldGVyID0gcGFyYXNbal07Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZ2V0UGFyYW1ldGVyTmFtZShwYXJhbWV0ZXJBbm5vdGF0aW9uLCBqLCBwYXJhbWV0ZXJOYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0ZVJlcXVlc3RTY2hlbWEobWV0aG9kUGFyYW1ldGVyICwgcGFyYW1ldGVyTmFtZSxqTWV0aG9kLCBzZXF1ZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIGlmIChwYXJhc1swXS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgPSBuZXcgWG1sU2NoZW1hU2VxdWVuY2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0gY3JlYXRlU2NoZW1hVHlwZUZvck1ldGhvZFBhcnQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICBDbGFzcyBtZXRob2RQYXJhbWV0ZXIgPSBwYXJhc1swXTsKLSAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG1ldGhvZFNjaGVtYVR5cGUuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFBhcnROYW1lKG1ldGhvZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IGdldFBhcmFtZXRlck5hbWUocGFyYW1ldGVyQW5ub3RhdGlvbiwgMCwgcGFyYW1ldGVyTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdGVSZXF1ZXN0U2NoZW1hKG1ldGhvZFBhcmFtZXRlciAsIHBhcmFtZXRlck5hbWUsak1ldGhvZCwgc2VxdWVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXJOYW1lID0gZ2V0UGFyYW1ldGVyTmFtZShwYXJhbWV0ZXJBbm5vdGF0aW9uLCAwLCBwYXJhbWV0ZXJOYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIG1ldGhvZFBhcmFtZXRlciA9IHBhcmFzWzBdOwotICAgICAgICAgICAgICAgICAgICBNZXRob2QgcHJvY2Vzc01ldGhvZCA9IChNZXRob2QpIHByb2Nlc3NlZFBhcmFtZXRlcnMuZ2V0KHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc01ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbmF2YWxpZCBKYXZhIGNsYXNzLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZXJlIGFyZSB0d28gbWV0aG9kcyBbIiArIHByb2Nlc3NNZXRob2QuZ2V0TmFtZSgpICsgIiBhbmQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpNZXRob2QuZ2V0TmFtZSgpICsgIiBdd2hpY2ggaGF2ZSB0aGUgc2FtZSBwYXJhbWV0ZXIgbmFtZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFBhcmFtZXRlcnMucHV0KHBhcmFtZXRlck5hbWUsIGpNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKG51bGwsIG1ldGhvZFBhcmFtZXRlciwgcGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2Uuc2V0RWxlbWVudFFOYW1lKHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUocGFyYW1ldGVyTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFBhcnROYW1lKHBhcmFtZXRlck5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLnNldFdyYXBwZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUocGFyYW1ldGVyTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmb3IgaXRzIHJldHVybiB0eXBlCi0gICAgICAgICAgICBDbGFzcyByZXR1cm5UeXBlID0gak1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICghInZvaWQiLmVxdWFscyhqTWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc01lc3NhZ2Ugb3V0TWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRob2RTY2hlbWFUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChqTWV0aG9kLmdldE5hbWUoKSArIFJFU1VMVCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlID0gbmV3IFhtbFNjaGVtYVNlcXVlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZFNjaGVtYVR5cGUuc2V0UGFydGljbGUoc2VxdWVuY2UpOwotICAgICAgICAgICAgICAgICAgICBXZWJSZXN1bHQgcmV0dXJuQW5ub24gPSBqTWV0aG9kLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldHVybk5hbWUgPSAicmV0dXJuIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVybkFubm9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk5hbWUgPSByZXR1cm5Bbm5vbi5uYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuTmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMocmV0dXJuTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5OYW1lID0gInJldHVybiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vblJwY01ldGhvZHMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgbnVsbCwgcmV0dXJuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIHJldHVyblR5cGUsIHJldHVybk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKG51bGwsIHJldHVyblR5cGUsIG1ldGhvZE5hbWUgKyBSRVNVTFQpOwotICAgICAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldFdyYXBwZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldEVsZW1lbnRRTmFtZSh0eXBlVGFibGUuZ2V0UU5hbWVmb3J0aGVUeXBlKG1ldGhvZE5hbWUgKyBSRVNVTFQpKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldE5hbWUobWV0aG9kTmFtZSArICJSZXNwb25zZU1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgICBvdXRNZXNzYWdlLnNldFBhcnROYW1lKG1ldGhvZE5hbWUgKyBSRVNVTFQpOwotICAgICAgICAgICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZS5nZXRRTmFtZWZvcnRoZVR5cGUobWV0aG9kTmFtZSArIFJFU1VMVCksCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhZGRUb1NlcnZpY2UpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1ldGhvZFtdKSBsaXN0LnRvQXJyYXkobmV3IE1ldGhvZFtsaXN0LnNpemUoKV0pOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUmVxdWVzdFNjaGVtYShDbGFzcyBtZXRob2RQYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBqTWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hU2VxdWVuY2Ugc2VxdWVuY2UpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobm9uUnBjTWV0aG9kcy5jb250YWlucyhqTWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yVHlwZShzZXF1ZW5jZSwgbnVsbCwgak1ldGhvZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclR5cGUoc2VxdWVuY2UsIG1ldGhvZFBhcmFtZXRlciwgcGFyYW1ldGVyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2VuZXJhdGVTY2hlbWFGb3JUeXBlKFhtbFNjaGVtYVNlcXVlbmNlIHNlcXVlbmNlLCBDbGFzcyB0eXBlLCBTdHJpbmcgcGFydE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIGlzQXJyYXlUeXBlID0gZmFsc2U7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlzQXJyYXlUeXBlID0gdHlwZS5pc0FycmF5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzQXJyYXlUeXBlKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEF4aXNGYXVsdC5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY2xhc3NUeXBlTmFtZTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzVHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBcnJheVR5cGUgJiYgImJ5dGUiLmVxdWFscyhjbGFzc1R5cGVOYW1lKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICAgICAgaXNBcnJheVR5cGUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNEYXRhSGFuZGxlcih0eXBlKSkgewotICAgICAgICAgICAgY2xhc3NUeXBlTmFtZSA9ICJiYXNlNjRCaW5hcnkiOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHNjaGVtYVR5cGVOYW1lID0gdHlwZVRhYmxlLmdldFNpbXBsZVNjaGVtYVR5cGVOYW1lKGNsYXNzVHlwZU5hbWUpOwotICAgICAgICBpZiAoc2NoZW1hVHlwZU5hbWUgPT0gbnVsbCAmJiB0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lID0gZ2VuZXJhdGVTY2hlbWEodHlwZSk7Ci0gICAgICAgICAgICBhZGRDb250ZW50VG9NZXRob2RTY2hlbWFUeXBlKHNlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGlzQXJyYXlUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWFOYW1lc3BhY2UgPSByZXNvbHZlU2NoZW1hTmFtZXNwYWNlKGdldFF1YWxpZmllZE5hbWUodHlwZS5nZXRQYWNrYWdlKCkpKTsKLSAgICAgICAgICAgIGFkZEltcG9ydChnZXRYbWxTY2hlbWEoc2NoZW1hTmFtZXNwYWNlKSwgc2NoZW1hVHlwZU5hbWUpOwotICAgICAgICAgICAgaWYoc2VxdWVuY2U9PW51bGwpewotICAgICAgICAgICAgICAgICBnZW5lcmF0ZVNjaGVtYUZvclNpbmdsZUVsZW1lbnQoc2NoZW1hVHlwZU5hbWUsIHBhcnROYW1lLCBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VxdWVuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yU2luZ2xlRWxlbWVudChzY2hlbWFUeXBlTmFtZSwgcGFydE5hbWUsIGlzQXJyYXlUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkQ29udGVudFRvTWV0aG9kU2NoZW1hVHlwZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYVR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFydE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkSW1wb3J0KGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpLCBzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIHJldHVybiBzY2hlbWFUeXBlTmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNjaGVtYUZvclNpbmdsZUVsZW1lbnQoUU5hbWUgc2NoZW1hVHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0FycmF5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBlbHQxID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgZWx0MS5zZXROYW1lKHBhcmFOYW1lKTsKLSAgICAgICAgZWx0MS5zZXRTY2hlbWFUeXBlTmFtZShzY2hlbWFUeXBlTmFtZSk7Ci0gICAgICAgIGVsdDEuc2V0TmlsbGFibGUodHJ1ZSk7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoc2NoZW1hVGFyZ2V0TmFtZVNwYWNlLCBwYXJhTmFtZSwgc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOwotICAgICAgICBlbHQxLnNldFFOYW1lKGVsZW1lbnROYW1lKTsKLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IGdldFhtbFNjaGVtYShzY2hlbWFUYXJnZXROYW1lU3BhY2UpOwotICAgICAgICB4bWxTY2hlbWEuZ2V0RWxlbWVudHMoKS5hZGQoZWxlbWVudE5hbWUsIGVsdDEpOwotICAgICAgICB4bWxTY2hlbWEuZ2V0SXRlbXMoKS5hZGQoZWx0MSk7Ci0gICAgICAgIHR5cGVUYWJsZS5hZGRDb21wbGV4U2NoZW1hKHBhcmFOYW1lLCBlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGUgc2NoZW1hIGNvbnN0cnVjdCBmb3IgZ2l2ZW4gdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxTY2hlbWFDb21wbGV4VHlwZSBjcmVhdGVTY2hlbWFUeXBlRm9yTWV0aG9kUGFydChTdHJpbmcgbG9jYWxQYXJ0TmFtZSkgewotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gZ2V0WG1sU2NoZW1hKHNjaGVtYVRhcmdldE5hbWVTcGFjZSk7Ci0gICAgICAgIFFOYW1lIGVsZW1lbnROYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUodGhpcy5zY2hlbWFUYXJnZXROYW1lU3BhY2UsIGxvY2FsUGFydE5hbWUsIHRoaXMuc2NoZW1hX25hbWVzcGFjZV9wcmVmaXgpOwotCi0gICAgICAgIFhtbFNjaGVtYUNvbXBsZXhUeXBlIGNvbXBsZXhUeXBlID0gZ2V0Q29tcGxleFR5cGVGb3JFbGVtZW50KHhtbFNjaGVtYSwgZWxlbWVudE5hbWUpOwotICAgICAgICBpZiAoY29tcGxleFR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29tcGxleFR5cGUgPSBuZXcgWG1sU2NoZW1hQ29tcGxleFR5cGUoeG1sU2NoZW1hKTsKLQotICAgICAgICAgICAgWG1sU2NoZW1hRWxlbWVudCBnbG9iYWxFbGVtZW50ID0gbmV3IFhtbFNjaGVtYUVsZW1lbnQoKTsKLSAgICAgICAgICAgIGdsb2JhbEVsZW1lbnQuc2V0U2NoZW1hVHlwZShjb21wbGV4VHlwZSk7Ci0gICAgICAgICAgICBnbG9iYWxFbGVtZW50LnNldE5hbWUobG9jYWxQYXJ0TmFtZSk7Ci0gICAgICAgICAgICBnbG9iYWxFbGVtZW50LnNldFFOYW1lKGVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRJdGVtcygpLmFkZChnbG9iYWxFbGVtZW50KTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5nZXRFbGVtZW50cygpLmFkZChlbGVtZW50TmFtZSwgZ2xvYmFsRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHlwZVRhYmxlLmFkZENvbXBsZXhTY2hlbWEobG9jYWxQYXJ0TmFtZSwgZWxlbWVudE5hbWUpOwotCi0gICAgICAgIHJldHVybiBjb21wbGV4VHlwZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgWG1sU2NoZW1hIGdldFhtbFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWE7Ci0KLSAgICAgICAgaWYgKCh4bWxTY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KHRhcmdldE5hbWVzcGFjZSkpID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0KLSAgICAgICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHNjaGVtYVRhcmdldE5hbWVTcGFjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgc2NoZW1hX25hbWVzcGFjZV9wcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeCA9IHNjaGVtYV9uYW1lc3BhY2VfcHJlZml4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VQcmVmaXggPSBnZW5lcmF0ZVByZWZpeCgpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIHhtbFNjaGVtYSA9IG5ldyBYbWxTY2hlbWEodGFyZ2V0TmFtZXNwYWNlLCB4bWxTY2hlbWFDb2xsZWN0aW9uKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChnZXRBdHRyRm9ybURlZmF1bHRTZXR0aW5nKCkpOwotICAgICAgICAgICAgeG1sU2NoZW1hLnNldEVsZW1lbnRGb3JtRGVmYXVsdChnZXRFbGVtZW50Rm9ybURlZmF1bHRTZXR0aW5nKCkpOwotCi0KLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeE1hcC5wdXQodGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh0YXJnZXROYW1lc3BhY2UsIHhtbFNjaGVtYSk7Ci0KLSAgICAgICAgICAgIE5hbWVzcGFjZU1hcCBwcmVmaXhtYXAgPSBuZXcgTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgICAgICBwcmVmaXhtYXAucHV0KERFRkFVTFRfU0NIRU1BX05BTUVTUEFDRV9QUkVGSVgsIFVSSV8yMDAxX1NDSEVNQV9YU0QpOwotICAgICAgICAgICAgcHJlZml4bWFwLnB1dCh0YXJnZXROYW1lc3BhY2VQcmVmaXgsIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuc2V0TmFtZXNwYWNlQ29udGV4dChwcmVmaXhtYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB4bWxTY2hlbWE7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0ZpZWxkQ29tcGFyYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9GaWVsZENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlYmZmYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0ZpZWxkQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsNCi0NCi1wdWJsaWMgY2xhc3MgRmllbGRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7DQotICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgew0KLSAgICAgICAgRmllbGQgZmllbGQxID0gKEZpZWxkKSBvMTsNCi0gICAgICAgIEZpZWxkIGZpZWxkMiA9IChGaWVsZCkgbzI7DQotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzJdOw0KLSAgICAgICAgdmFsdWVzWzBdID0gZmllbGQxLmdldE5hbWUoKTsNCi0gICAgICAgIHZhbHVlc1sxXSA9IGZpZWxkMi5nZXROYW1lKCk7DQotICAgICAgICBBcnJheXMuc29ydCh2YWx1ZXMpOw0KLSAgICAgICAgaWYgKHZhbHVlc1swXS5lcXVhbHMoZmllbGQxLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gMDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIDE7DQotICAgICAgICB9DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9KYXZhMldTRExDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvSmF2YTJXU0RMQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjU1NTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9KYXZhMldTRExDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmEyV1NETENvbnN0YW50cyB7Ci0KLSAgICBTdHJpbmcgU09BUDExX1BSRUZJWCA9ICJzb2FwIjsKLSAgICBTdHJpbmcgU09BUDEyX1BSRUZJWCA9ICJzb2FwMTIiOwotICAgIFN0cmluZyBERUZBVUxUX1dTRExfTkFNRVNQQUNFX1BSRUZJWCA9ICJ3c2RsIjsKLSAgICBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfTkFNRVNQQUNFX1BSRUZJWCA9ICJ4cyI7Ci0gICAgU3RyaW5nIERFRkFVTFRfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVggPSAiYXhpczIiOwotICAgIFN0cmluZyBUQVJHRVROQU1FU1BBQ0VfUFJFRklYID0gInRucyI7Ci0gICAgU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0VfUFJGSVggPSAibnMiOwotICAgIFN0cmluZyBGT1JNX0RFRkFVTFRfUVVBTElGSUVEID0gInF1YWxpZmllZCI7Ci0gICAgU3RyaW5nIEZPUk1fREVGQVVMVF9VTlFVQUxJRklFRCA9ICJ1bnF1YWxpZmllZCI7Ci0gICAgU3RyaW5nIERPQ19MSVRfQkFSRV9QQVJBTUVURVIgPSJkb2NsaXRCYXJlIjsKLSAgICAKLQotICAgIFN0cmluZyBERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiOwotICAgIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7Ci0gICAgU3RyaW5nIEFYSVMyX1hTRCA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi94c2QiOwotICAgIFN0cmluZyBVUklfV1NETDEyX1NPQVAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIjsKLSAgICBTdHJpbmcgVVJJX1dTREwxMV9TT0FQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotICAgIFN0cmluZyBUUkFOU1BPUlRfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCI7Ci0gICAgU3RyaW5nIERFRkFVTFRfTE9DQVRJT05fVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy8iOwotICAgIFN0cmluZyBXU0FEX05TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIjsKLQotCi0gICAgU3RyaW5nIEhUVFBfTkFNRVNQQUNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOwotICAgIFN0cmluZyBNSU1FX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsKLSAgICBTdHJpbmcgSFRUUF9QUkVGSVggPSAiaHR0cCI7Ci0gICAgU3RyaW5nIE1JTUVfUFJFRklYID0gIm1pbWUiOwotICAgIFN0cmluZyBVUk5fUFJFRklYID0gInVybiI7Ci0gICAgU3RyaW5nIENPTE9OX1NFUEFSQVRPUiA9ICI6IjsKLQotICAgIFN0cmluZyBCSU5ESU5HX05BTUVfU1VGRklYID0gIlNPQVAxMUJpbmRpbmciOwotICAgIFN0cmluZyBTT0FQMTJCSU5ESU5HX05BTUVfU1VGRklYID0gIlNPQVAxMkJpbmRpbmciOwotICAgIFN0cmluZyBIVFRQX0JJTkRJTkcgPSAiSHR0cEJpbmRpbmciOwotICAgIFN0cmluZyBQT1JUX1RZUEVfU1VGRklYID0gIlBvcnRUeXBlIjsKLSAgICBTdHJpbmcgUE9SVF9OQU1FX1NVRkZJWCA9ICJQb3J0IjsKLSAgICBTdHJpbmcgTUVTU0FHRV9MT0NBTF9OQU1FID0gIm1lc3NhZ2UiOwotICAgIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9ICJuYW1lIjsKLSAgICBTdHJpbmcgUkVRVUVTVF9NRVNTQUdFID0gIlJlcXVlc3RNZXNzYWdlIjsKLSAgICBTdHJpbmcgUkVTUE9OU0VfTUVTU0FHRSA9ICJSZXNwb25zZU1lc3NhZ2UiOwotICAgIFN0cmluZyBGQVVMVF9NRVNTQUdFID0gIk1lc3NhZ2UiOwotICAgIFN0cmluZyBNRVNTQUdFX1NVRkZJWCA9ICJSZXF1ZXN0IjsKLSAgICBTdHJpbmcgUkVRVUVTVCA9ICJSZXF1ZXN0IjsKLSAgICBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOwotICAgIFN0cmluZyBSRVNVTFQgPSAiUmVzdWx0IjsKLSAgICBTdHJpbmcgUE9SVF9UWVBFX0xPQ0FMX05BTUUgPSAicG9ydFR5cGUiOwotICAgIFN0cmluZyBPUEVSQVRJT05fTE9DQUxfTkFNRSA9ICJvcGVyYXRpb24iOwotICAgIFN0cmluZyBJTl9QVVRfTE9DQUxfTkFNRSA9ICJpbnB1dCI7Ci0gICAgU3RyaW5nIE9VVF9QVVRfTE9DQUxfTkFNRSA9ICJvdXRwdXQiOwotICAgIFN0cmluZyBTRVJWSUNFX0xPQ0FMX05BTUUgPSAic2VydmljZSI7Ci0gICAgU3RyaW5nIEJJTkRJTkdfTE9DQUxfTkFNRSA9ICJiaW5kaW5nIjsKLSAgICBTdHJpbmcgUE9SVCA9ICJwb3J0IjsKLSAgICBTdHJpbmcgU09BUDEyUE9SVCA9ICJTT0FQMTJwb3J0IjsKLSAgICBTdHJpbmcgU09BUDExUE9SVCA9ICJTT0FQMTFwb3J0IjsKLSAgICBTdHJpbmcgSFRUUF9QT1JUID0gIkh0dHBwb3J0IjsKLSAgICBTdHJpbmcgUEFSVF9BVFRSSUJVVEVfTkFNRSA9ICJwYXJ0IjsKLSAgICBTdHJpbmcgRUxFTUVOVF9BVFRSSUJVVEVfTkFNRSA9ICJlbGVtZW50IjsKLSAgICBTdHJpbmcgRkFVTFRfTE9DQUxfTkFNRSA9ICJmYXVsdCI7Ci0KLSAgICBTdHJpbmcgU09BUF9BRERSRVNTID0gImFkZHJlc3MiOwotICAgIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0gICAgU3RyaW5nIFRSQU5TUE9SVCA9ICJ0cmFuc3BvcnQiOwotICAgIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7Ci0gICAgU3RyaW5nIFNPQVBfQUNUSU9OID0gInNvYXBBY3Rpb24iOwotICAgIFN0cmluZyBTT0FQX0JPRFkgPSAiYm9keSI7Ci0gICAgU3RyaW5nIFNPQVBfVVNFID0gInVzZSI7Ci0gICAgU3RyaW5nIERPQ1VNRU5UID0gImRvY3VtZW50IjsKLSAgICBTdHJpbmcgTElURVJBTCA9ICJsaXRlcmFsIjsKLSAgICAvLwotICAgIC8vIFNjaGVtYSBYU0QgTmFtZXNwYWNlcwotICAgIC8vCi0gICAgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotCi0KLSAgICBTdHJpbmcgQVRUUl9GT1JNX0RFRkFVTFRfT1BUSU9OID0gImFmZCI7Ci0gICAgU3RyaW5nIEFUVFJfRk9STV9ERUZBVUxUX09QVElPTl9MT05HID0gImF0dHJpYnV0ZUZvcm1EZWZhdWx0IjsKLSAgICBTdHJpbmcgQ0xBU1NOQU1FX09QVElPTiA9ICJjbiI7Ci0gICAgU3RyaW5nIENMQVNTTkFNRV9PUFRJT05fTE9ORyA9ICJjbGFzc05hbWUiOwotICAgIFN0cmluZyBDTEFTU1BBVEhfT1BUSU9OID0gImNwIjsKLSAgICBTdHJpbmcgQ0xBU1NQQVRIX09QVElPTl9MT05HID0gImNsYXNzUGF0aCI7Ci0gICAgU3RyaW5nIERPQ19MSVRfQkFSRSA9ICJkbGIiOwotICAgIFN0cmluZyBET0NfTElUX0JBUkVfTE9ORyA9ICJkb2NsaXRiYXJlIjsKLSAgICBTdHJpbmcgRUxFTUVOVF9GT1JNX0RFRkFVTFRfT1BUSU9OID0gImVmZCI7Ci0gICAgU3RyaW5nIEVMRU1FTlRfRk9STV9ERUZBVUxUX09QVElPTl9MT05HID0gImVsZW1lbnRGb3JtRGVmYXVsdCI7Ci0gICAgU3RyaW5nIEVYVFJBX0NMQVNTRVNfREVGQVVMVF9PUFRJT04gPSAieGMiOwotICAgIFN0cmluZyBFWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OX0xPTkcgPSAiZXh0cmFDbGFzc2VzIjsKLSAgICBTdHJpbmcgSkFWQV9QS0dfMl9OU01BUF9PUFRJT04gPSAicDJuIjsKLSAgICBTdHJpbmcgSkFWQV9QS0dfMl9OU01BUF9PUFRJT05fTE9ORyA9ICJwYWNrYWdlMk5hbWVzcGFjZSI7Ci0gICAgU3RyaW5nIExPQ0FUSU9OX09QVElPTiA9ICJsIjsKLSAgICBTdHJpbmcgTE9DQVRJT05fT1BUSU9OX0xPTkcgPSAibG9jYXRpb24iOwotICAgIFN0cmluZyBOQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTiA9ICJuc2ciOwotICAgIFN0cmluZyBOQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTl9MT05HID0gIm5hbWVzcGFjZUdlbmVyYXRvciI7Ci0gICAgU3RyaW5nIE9VVFBVVF9GSUxFTkFNRV9PUFRJT04gPSAib2YiOwotICAgIFN0cmluZyBPVVRQVVRfRklMRU5BTUVfT1BUSU9OX0xPTkcgPSAib3V0cHV0RmlsZW5hbWUiOwotICAgIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fT1BUSU9OID0gIm8iOwotICAgIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fT1BUSU9OX0xPTkcgPSAib3V0cHV0IjsKLSAgICBTdHJpbmcgU0NIRU1BX0dFTkVSQVRPUl9PUFRJT04gPSAic2ciOwotICAgIFN0cmluZyBTQ0hFTUFfR0VORVJBVE9SX09QVElPTl9MT05HID0gInNjaGVtYUdlbmVyYXRvciI7Ci0gICAgU3RyaW5nIFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTiA9ICJzdG4iOwotICAgIFN0cmluZyBTQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT05fTE9ORyA9ICJzY2hlbWFUYXJnZXRuYW1lc3BhY2UiOwotICAgIFN0cmluZyBTQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OID0gInN0cCI7Ci0gICAgU3RyaW5nIFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT05fTE9ORyA9ICJzY2hlbWFUYXJnZXRuYW1lc3BhY2VQcmVmaXgiOwotICAgIFN0cmluZyBTRVJWSUNFX05BTUVfT1BUSU9OID0gInNuIjsKLSAgICBTdHJpbmcgU0VSVklDRV9OQU1FX09QVElPTl9MT05HID0gInNlcnZpY2VOYW1lIjsKLSAgICBTdHJpbmcgU1RZTEVfT1BUSU9OID0gInN0IjsKLSAgICBTdHJpbmcgU1RZTEVfT1BUSU9OX0xPTkcgPSAic3R5bGUiOwotICAgIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX09QVElPTiA9ICJ0biI7Ci0gICAgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OX0xPTkcgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OID0gInRwIjsKLSAgICBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OX0xPTkcgPSAidGFyZ2V0TmFtZXNwYWNlUHJlZml4IjsKLSAgICBTdHJpbmcgVVNFX09QVElPTiA9ICJ1IjsKLSAgICBTdHJpbmcgVVNFX09QVElPTl9MT05HID0gInVzZSI7Ci0gICAgU3RyaW5nIFdTRExfVkVSU0lPTl9PUFRJT04gPSAid3YiOwotICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fT1BUSU9OX0xPTkcgPSAid3NkbC12ZXJzaW9uIjsKLSAgICBTdHJpbmcgQ1VTVE9NX1NDSEVNQV9MT0NBVElPTiA9ICJjc2wiOwotICAgIFN0cmluZyBDVVNUT01fU0NIRU1BX0xPQ0FUSU9OX0xPTkcgPSAiY3VzdG9tLXNjaGVtYS1sb2NhdGlvbiI7Ci0gICAgU3RyaW5nIFNDSEVNQV9NQVBQSU5HX0ZJTEVfTE9DQVRJT04gPSAibWZsIjsKLSAgICBTdHJpbmcgU0NIRU1BX01BUFBJTkdfRklMRV9MT0NBVElPTl9MT05HID0gIm1hcHBpbmctZmlsZS1sb2NhdGlvbiI7Ci0KLSAgICBTdHJpbmcgQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCA9ICJuczEiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MRV9JTlBVVCA9ICJTT0xFX0lOUFVUIjsKLQotICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fMiA9ICIyLjAiOwotICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fMl9PUFRJT05BTCA9ICIyIjsKLSAgICBTdHJpbmcgV1NETF9WRVJTSU9OXzEgPSAiMS4xIjsKLSAgICBTdHJpbmcgUEFSQU1FVEVSUyA9ICJwYXJhbWV0ZXJzIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvSmF2YTJXU0RMVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvSmF2YTJXU0RMVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiYzc0NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL0phdmEyV1NETFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotcHVibGljIGNsYXNzIEphdmEyV1NETFV0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUEFDS0FHRV9DTEFTU19ERUxJTUlURVIgPSAnLic7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFX0VYVE4gPSAiL3hzZCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBOYW1lc3BhY2VHZW5lcmF0b3IgZGVmYXVsdE5zR2VuZXJhdG9yID0gbmV3IERlZmF1bHROYW1lc3BhY2VHZW5lcmF0b3IoKTsKLQotICAgIC8qKgotICAgICAqIGNoZWNrIHRoZSBlbnRyeSBmb3IgYSBVUkwuIFRoaXMgaXMgYSBzaW1wbGUgY2hlY2sgYW5kIG5lZWQgdG8gYmUgaW1wcm92ZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRyeQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVVJMKFN0cmluZyBlbnRyeSkgewotICAgICAgICByZXR1cm4gZW50cnkuc3RhcnRzV2l0aCgiaHR0cDovLyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbWV0aG9kIHRvIHN0cmlwIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NOYW1lIHRvIGEgc2ltcGxlIGNsYXNzbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVDbGFzc05hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gcXVhbGlmaWVkTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcXVhbGlmaWVkTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIsIGRlZmF1bHROc0dlbmVyYXRvcik7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcik7Ci0gICAgICAgIFBhY2thZ2UgcGtnID0gY2xhenouZ2V0UGFja2FnZSgpOwotICAgICAgICBTdHJpbmcgbmFtZTsKLQotICAgICAgICBpZiAocGtnICE9IG51bGwpCi0gICAgICAgICAgICBuYW1lID0gcGtnLmdldE5hbWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbmFtZSA9IHBhY2thZ2VOYW1lRnJvbUNsYXNzKGNsYXNzTmFtZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5zR2VuLm5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBzY2hlbWFOYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYU5hbWVzcGFjZUZyb21DbGFzc05hbWUocGFja2FnZU5hbWUsIGxvYWRlciwgZGVmYXVsdE5zR2VuZXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBzY2hlbWFOYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBOYW1lc3BhY2VHZW5lcmF0b3IgbnNHZW4pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmFtZXNwYWNlRnJvbUNsYXNzTmFtZShwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgbnNHZW4pOwotICAgICAgICBpZiAoc3RyaW5nQnVmZmVyLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSmF2YTJXU0RMQ29uc3RhbnRzLkRFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIH0KLS8vICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFNDSEVNQV9OQU1FU1BBQ0VfRVhUTik7Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWZmZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgdGFyZ2V0TmFtZXNwYWNlRnJvbUNsYXNzTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuYW1lc3BhY2VGcm9tQ2xhc3NOYW1lKHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICBuc0dlbik7Ci0gICAgICAgIGlmIChzdHJpbmdCdWZmZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChKYXZhMldTRExDb25zdGFudHMuREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIpOwotICAgICAgICBQYWNrYWdlIHBrZyA9IGNsYXp6LmdldFBhY2thZ2UoKTsKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0KLSAgICAgICAgaWYgKHBrZyAhPSBudWxsKQotICAgICAgICAgICAgbmFtZSA9IHBrZy5nZXROYW1lKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5hbWUgPSBwYWNrYWdlTmFtZUZyb21DbGFzcyhjbGFzc05hbWUpOwotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZyb21DbGFzcyhTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgcmV0ID0gIiI7Ci0gICAgICAgIGludCBsYXN0RG90ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChsYXN0RG90ICE9IC0xKQotICAgICAgICAgICAgcmV0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9OYW1lc3BhY2VHZW5lcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvTmFtZXNwYWNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzlkN2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9OYW1lc3BhY2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGw7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBwcm92aWRlIGN1c3RvbSBpbXBsZW10YXRpb25zIGZvciwgCi0gKiBqYXZhIHBhY2thZ2UgbmFtZSB0byBuYW1lc3BhY2UgbWFwcGluZy4gIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgc2NoZW1hIGdlbmVyYXRvcgotICogZm9yIGdlbmVyYXRpb24gbmFtZXNwYWNlcwotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2VHZW5lcmF0b3IgewotICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgbmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0gICAgcHVibGljIFN0cmluZ0J1ZmZlciBzY2hlbWFOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvU2NoZW1hR2VuZXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL1NjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgzMTI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hR2VuZXJhdG9yIHsKLSAgICB2b2lkIHNldE5zR2VuKE5hbWVzcGFjZUdlbmVyYXRvciBuc0dlbik7Ci0KLSAgICBDb2xsZWN0aW9uIGdlbmVyYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIFR5cGVUYWJsZSBnZXRUeXBlVGFibGUoKTsKLQotICAgIE1ldGhvZFtdIGdldE1ldGhvZHMoKTsKLQotICAgIHZvaWQgc2V0RXhjbHVkZU1ldGhvZHMoQXJyYXlMaXN0IGV4Y2x1ZGVNZXRob2RzKTsKLQotICAgIFN0cmluZyBnZXRTY2hlbWFUYXJnZXROYW1lU3BhY2UoKTsKLQotICAgIHZvaWQgc2V0QXR0ckZvcm1EZWZhdWx0KFN0cmluZyBhdHRyRm9ybURlZmF1bHQpOwotCi0gICAgdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoU3RyaW5nIGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0KLSAgICB2b2lkIHNldEV4dHJhQ2xhc3NlcyhBcnJheUxpc3QgZXh0cmFDbGFzc2VzKTsKLQotICAgIHZvaWQgc2V0VXNlV1NETFR5cGVzTmFtZXNwYWNlKGJvb2xlYW4gdXNlV1NETFR5cGVzTmFtZXNwYWNlKTsKLQotICAgIHZvaWQgc2V0UGtnMm5zbWFwKE1hcCBwa2cybnNtYXApOwotCi0gICAgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgdm9pZCBzZXROb25ScGNNZXRob2RzKEFycmF5TGlzdCBub25ScGNNZXRob2RzKTsKLQotICAgIHZvaWQgc2V0QXhpc1NlcnZpY2UoQXhpc1NlcnZpY2Ugc2VydmljZSk7Ci0KLSAgICBTdHJpbmcgZ2V0Q3VzdG9tU2NoZW1hTG9jYXRpb24oKTsKLQotCi0gICAgdm9pZCBzZXRDdXN0b21TY2hlbWFMb2NhdGlvbihTdHJpbmcgY3VzdG9tU2NoZW1hTG9jYXRpb24pOwotCi0gICAgU3RyaW5nIGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSA7Ci0KLSAgICB2b2lkIHNldE1hcHBpbmdGaWxlTG9jYXRpb24oU3RyaW5nIG1hcHBpbmdGaWxlTG9jYXRpb24pIDsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvVHlwZVRhYmxlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL1R5cGVUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ3ODA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvVHlwZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgVHlwZVRhYmxlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwICBzaW1wbGVUeXBldG94c2Q7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBBTllfVFlQRSA9IG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImFueVR5cGUiLCAieHMiKTsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBjb21wbGV4VHlwZU1hcDsKLQotICAgIHB1YmxpYyBUeXBlVGFibGUoKSB7Ci0gICAgICAgIC8vY29tcGxleCB0eXBlIHRhYmxlIGlzIHJlc2V0dGVkIGV2ZXJ5IHRpbWUgdGhpcyBpcwotICAgICAgICAvL2luc3RhbnRpYXRlZAotICAgICAgICBjb21wbGV4VHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyogc3RhdGljYWxseSBwb3B1bGF0ZSB0aGUgc2ltcGxlIHR5cGUgbWFwICAtIHRoaXMgaXMgbm90IGxpa2VseSB0bwotICAgICogY2hhbmdlIGFuZCB3ZSBuZWVkIG5vdCBwb3B1bGF0ZSBpdCBvdmVyIGFuZCBvdmVyICovCi0gICAgc3RhdGljewotICAgICAgICAgIHBvcHVsYXRlU2ltcGxlVHlwZXMoKTsKLSAgICB9Ci0KLSAgICAvKiBwb3B1bGF0ZSB0aGUgc2ltcGxldHlwZSBoYXNobWFwICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZVNpbXBsZVR5cGVzKCkgewotICAgICAgICBzaW1wbGVUeXBldG94c2QgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL3RvZG8gcGxzIHVzZSB0aGUgdHlwZXMgZnJvbSBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLmNvbnN0YW50cy5Db25zdGFudHMKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiaW50IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJpbnQiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5TdHJpbmciLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInN0cmluZyIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiYm9vbGVhbiIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiYm9vbGVhbiIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiZmxvYXQiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImZsb2F0IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJkb3VibGUiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImRvdWJsZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgic2hvcnQiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNob3J0IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJsb25nIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJsb25nIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJieXRlIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJieXRlIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJjaGFyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJzdHJpbmciLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJpbnQiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5Eb3VibGUiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImRvdWJsZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5sYW5nLkZsb2F0IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJmbG9hdCIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5sYW5nLkxvbmciLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImxvbmciLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5DaGFyYWN0ZXIiLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5sYW5nLkJvb2xlYW4iLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImJvb2xlYW4iLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5CeXRlIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJieXRlIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLmxhbmcuU2hvcnQiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNob3J0IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLnV0aWwuRGF0ZSIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZGF0ZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS51dGlsLkNhbGVuZGFyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkYXRlVGltZSIsICJ4cyIpKTsKLQotICAgICAgICAvLyBTUUwgZGF0ZSB0aW1lCi0gICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLnNxbC5EYXRlIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkYXRlIiwgInhzIikpOwotICAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5zcWwuVGltZSIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAidGltZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5zcWwuVGltZXN0YW1wIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkYXRlVGltZSIsICJ4cyIpKTsKLQotICAgICAgICAgLy9jb25zaWRlciBCaWdEZWNpbWFsLCBCaWdJbnRlZ2VyLCBEYXksIER1cmF0aW9uLCBNb250aCwgTW9udGhEYXksCi0gICAgICAgIC8vVGltZSwgWWVhciwgWWVhck1vbnRoIGFzIFNpbXBsZVR5cGUgYXMgd2VsbAotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJqYXZhLm1hdGguQmlnRGVjaW1hbCIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZGVjaW1hbCIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiamF2YS5tYXRoLkJpZ0ludGVnZXIiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImludGVnZXIiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuRGF5IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJnRGF5IiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLkR1cmF0aW9uIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJkdXJhdGlvbiIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5Nb250aCIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZ01vbnRoIiwgInhzIikpOwotICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KCJvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnR5cGVzLk1vbnRoRGF5IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJnTW9udGhEYXkiLCAieHMiKSk7Ci0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoIm9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudHlwZXMuVGltZSIsCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKEphdmEyV1NETENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAidGltZSIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyIiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJnWWVhciIsICJ4cyIpKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgib3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy50eXBlcy5ZZWFyTW9udGgiLAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZShKYXZhMldTRExDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImdZZWFyTW9udGgiLCAieHMiKSk7ICAgICAgIAotCi0gICAgICAgIHNpbXBsZVR5cGV0b3hzZC5wdXQoImphdmEubGFuZy5PYmplY3QiLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLQotICAgICAgICAvLyBBbnkgdHlwZXMKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChPTUVsZW1lbnQuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChBcnJheUxpc3QuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChWZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dChMaXN0LmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBBTllfVFlQRSk7Ci0gICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KEhhc2hNYXAuY2xhc3MuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICBBTllfVFlQRSk7Ci0gICAgICAgICBzaW1wbGVUeXBldG94c2QucHV0KEhhc2h0YWJsZS5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgIEFOWV9UWVBFKTsKLSAgICAgICAgLy9ieXRlQXJyYXQKLSAgICAgICAgc2ltcGxlVHlwZXRveHNkLnB1dCgiYmFzZTY0QmluYXJ5IiwKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoSmF2YTJXU0RMQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiLCAieHMiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBzY2hlbWEgdHlwZSBRTmFtZSBnaXZlbiB0aGUgdHlwZSBjbGFzcyBuYW1lCi0gICAgICogQHBhcmFtIHR5cGVOYW1lICB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAgICAqIEByZXR1cm4gICB0aGUgbmFtZSBvZiB0aGUgc2ltcGxlIHR5cGUgb3IgbnVsbCBpZiBpdCBpcyBub3QgYSBzaW1wbGUgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRTaW1wbGVTY2hlbWFUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSAoUU5hbWUpIHNpbXBsZVR5cGV0b3hzZC5nZXQodHlwZU5hbWUpOwotICAgICAgICBpZihxTmFtZSA9PSBudWxsKXsKLSAgICAgICAgICAgIGlmKCh0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKXx8dHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YXguIikpICYmCi0gICAgICAgICAgICAgICAgICAgICFFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpewotICAgICAgICAgICAgICAgIHJldHVybiBBTllfVFlQRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgYSBzaW1wbGUgdHlwZSBvciBub3QKLSAgICAgKiBAcGFyYW0gdHlwZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgc2ltcGxlIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2ltcGxlVHlwZXRveHNkLmtleVNldCgpLmNvbnRhaW5zKHR5cGVOYW1lKSl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfWVsc2UgaWYodHlwZU5hbWUuc3RhcnRzV2l0aCgiamF2YS5sYW5nIil8fHR5cGVOYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpKXsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNvbXBsZXggdHlwZSBtYXAKLSAgICAgKiBAcmV0dXJuICB0aGUgbWFwIHdpdGggY29tcGxleCB0eXBlcwotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZ2V0Q29tcGxleFNjaGVtYU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBsZXhTY2hlbWEoU3RyaW5nIG5hbWUsIFFOYW1lIHNjaGVtYVR5cGUpIHsKLSAgICAgICAgY29tcGxleFR5cGVNYXAucHV0KG5hbWUsIHNjaGVtYVR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRDb21wbGV4U2NoZW1hVHlwZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gKFFOYW1lKSBjb21wbGV4VHlwZU1hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBxbmFtZSBmb3IgYSB0eXBlCi0gICAgICogZmlyc3QgdHJ5IHRoZSBzaW1wbGUgdHlwZXMgaWYgbm90IHRyeSB0aGUgY29tcGxleCB0eXBlcwotICAgICAqIEBwYXJhbSB0eXBlTmFtZSAgbmFtZSBvZiB0aGUgdHlwZQotICAgICAqIEByZXR1cm4gIHRoZSBRbmFtZSBmb3IgdGhpcyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lZm9ydGhlVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAgICAgUU5hbWUgdHlwZSA9IGdldFNpbXBsZVNjaGVtYVR5cGVOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IGdldENvbXBsZXhTY2hlbWFUeXBlKHR5cGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9ieXRlY29kZS9DaGFpbmVkUGFyYW1SZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvQ2hhaW5lZFBhcmFtUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGY0YzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9ieXRlY29kZS9DaGFpbmVkUGFyYW1SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLmJ5dGVjb2RlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEZXNjcmlwdGlvbjogSW4gUGFyYW1SZWFkZXIgY2xhc3MsIHVzZXIgY2Fubm90IGdldCBpbmhlcml0ZWQgbWV0aG9kIHBhcmFtZXRlcgotICogZnJvbSB0aGUgY2xhc3MgdGhleSBwYXNzZWQgaW4gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgVGhpcyBjbGFzcwotICogaXMgd2Fsa3MgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluLiBJZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZCBpbgotICogdGhlIGRlcml2ZWQgY2xhc3MsIHNlYXJjaCBpbiBzdXBlciBjbGFzcy4gSWYgbm90IGZvdW5kIGluIHRoZSBpbW1lZGlkYXRlIHN1cGVyCi0gKiBjbGFzcywgc2VhcmNoIHN1cGVyIGNsYXNzJ3Mgc3VwZXIgY2xhc3MsIHVudGlsIHRoZSByb290LCB3aGljaCBpcyBqYXZhLmxhbmcuT2JqZWN0LAotICogaXMgcmVhY2hlZC4gVGhpcyBpcyBub3QgYW4gZWFnZXIgbG9hZCBzaW5jZSBpdCBvbmx5IHN0YXJ0IHNlYXJjaGluZyB0aGUgc3VwZXIgY2xhc3MKLSAqIHdoZW4gaXQgaXMgYXNrZWQgdG8uCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbmVkUGFyYW1SZWFkZXIgewotICAgIHByaXZhdGUgTGlzdCBjaGFpbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIExpc3QgY2xzQ2hhaW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBNYXAgbWV0aG9kVG9QYXJhbU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzZXMgYSBnaXZlbiBjbGFzcydzIHBhcmFtZXRlciBuYW1lcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbHMgdGhlIGNsYXNzIHdoaWNoIHVzZXIgd2FudHMgdG8gZ2V0IHBhcmFtZXRlciBpbmZvIGZyb20KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIENoYWluZWRQYXJhbVJlYWRlcihDbGFzcyBjbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFBhcmFtUmVhZGVyIHJlYWRlciA9IG5ldyBQYXJhbVJlYWRlcihjbHMpOwotICAgICAgICBjaGFpbi5hZGQocmVhZGVyKTsKLSAgICAgICAgY2xzQ2hhaW4uYWRkKGNscyk7Ci0gICAgfQotCi0gICAgLy9ub3cgSSBuZWVkIHRvIGNyZWF0ZSBkZWxpZ2F0ZSBtZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgotICAgICAqIElmIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG5hbWVzLCByZXR1cm4gbnVsbC4gIFRoZSByZXR1cm5lZCBhcnJheSB3aWxsCi0gICAgICogaGF2ZSBvbmUgbmFtZSBwZXIgcGFyYW1ldGVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgc2FtZQotICAgICAqIGFzIHRoZSBsZW5ndGggb2YgdGhlIENsYXNzW10gYXJyYXkgcmV0dXJuZWQgYnkgQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjdG9yCi0gICAgICogQHJldHVybiBSZXR1cm5zIGFycmF5IG9mIG5hbWVzLCBvbmUgcGVyIHBhcmFtZXRlciwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcyhDb25zdHJ1Y3RvciBjdG9yKSB7Ci0gICAgICAgIC8vdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGNvbnN0cnVjdG9yIGNoYWluaW5nLgotICAgICAgICByZXR1cm4gKChQYXJhbVJlYWRlcikgY2hhaW4uZ2V0KDApKS5nZXRQYXJhbWV0ZXJOYW1lcyhjdG9yKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIG1ldGhvZC4KLSAgICAgKiBJZiBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBuYW1lcyBpbiB0aGUgY3VycmVudCBjbGFzcywgc2VhcmNoIGl0cyBwYXJlbnQgCi0gICAgICogY2xhc3MgdW50aWwgd2UgcmVhY2ggamF2YS5sYW5nLk9iamVjdC4gSWYgc3RpbGwgY2FuIG5vdCBmaW5kIHRoZSBtZXRob2QsCi0gICAgICogcmV0dXJucyBudWxsLiBUaGUgcmV0dXJuZWQgYXJyYXkgaGFzIG9uZSBuYW1lIHBlciBwYXJhbWV0ZXIuIFRoZSBsZW5ndGggCi0gICAgICogb2YgdGhlIGFycmF5IHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiB0aGUgQ2xhc3NbXSBhcnJheSAKLSAgICAgKiByZXR1cm5lZCBieSBNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIFJldHVybnMgYXJyYXkgb2YgbmFtZXMsIG9uZSBwZXIgcGFyYW1ldGVyLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlck5hbWVzKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgLy9nbyBmaW5kIHRoZSBvbmUgZnJvbSB0aGUgY2FjaGUgZmlyc3QKLSAgICAgICAgaWYgKG1ldGhvZFRvUGFyYW1NYXAuY29udGFpbnNLZXkobWV0aG9kKSkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbWV0aG9kVG9QYXJhbU1hcC5nZXQobWV0aG9kKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHJldCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjaGFpbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBQYXJhbVJlYWRlciByZWFkZXIgPSAoUGFyYW1SZWFkZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHJldCA9IHJlYWRlci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kVG9QYXJhbU1hcC5wdXQobWV0aG9kLCByZXQpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9pZiB3ZSBoZXJlLCBpdCBtZWFucyB3ZSBuZWVkIHRvIGNyZWF0ZSBuZXcgY2hhaW4uCi0gICAgICAgIENsYXNzIGNscyA9IChDbGFzcykgY2xzQ2hhaW4uZ2V0KGNoYWluLnNpemUoKSAtIDEpOwotICAgICAgICB3aGlsZSAoY2xzICE9IG51bGwgJiYgY2xzICE9IGphdmEubGFuZy5PYmplY3QuY2xhc3MgJiYgY2xzLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBzdXBlckNsYXNzID0gY2xzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1SZWFkZXIgX3JlYWRlciA9IG5ldyBQYXJhbVJlYWRlcihzdXBlckNsYXNzKTsKLSAgICAgICAgICAgICAgICBjaGFpbi5hZGQoX3JlYWRlcik7Ci0gICAgICAgICAgICAgICAgY2xzQ2hhaW4uYWRkKGNscyk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gX3JlYWRlci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCkgeyAvL3dlIGZvdW5kIGl0IHNvIGp1c3QgcmV0dXJuIGl0LgotICAgICAgICAgICAgICAgICAgICBtZXRob2RUb1BhcmFtTWFwLnB1dChtZXRob2QsIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vY2FuIG5vdCBmaW5kIHRoZSBzdXBlciBjbGFzcyBpbiB0aGUgY2xhc3MgcGF0aCwgYWJvcnQgaGVyZQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xzID0gc3VwZXJDbGFzczsKLSAgICAgICAgfQotICAgICAgICBtZXRob2RUb1BhcmFtTWFwLnB1dChtZXRob2QsIHJldCk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvQ2xhc3NSZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvQ2xhc3NSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViNzM5Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL0NsYXNzUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZTsKLQotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2xhc3MgZmlsZSByZWFkZXIgZm9yIG9idGFpbmluZyB0aGUgcGFyYW1ldGVyIG5hbWVzCi0gKiBmb3IgZGVjbGFyZWQgbWV0aG9kcyBpbiBhIGNsYXNzLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBkZWJ1Z2dpbmcKLSAqIGF0dHJpYnV0ZXMgZm9yIHVzIHRvIG9idGFpbiB0aGlzIGluZm9ybWF0aW9uLiA8cD4KLSAqIDxwLz4KLSAqIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgaW5oZXJpdGVkIG1ldGhvZHMuICBUbyBvYnRhaW4gcGFyYW1ldGVyCi0gKiBuYW1lcyBmb3IgaW5oZXJpdGVkIG1ldGhvZHMsIHlvdSBtdXN0IHVzZSBhIHBhcmFtUmVhZGVyIGZvciB0aGUKLSAqIGNsYXNzIHRoYXQgb3JpZ2luYWxseSBkZWNsYXJlZCB0aGUgbWV0aG9kLiA8cD4KLSAqIDxwLz4KLSAqIGRvbid0IGdldCB0cmlja3ksIGl0J3MgdGhlIGJhcmUgbWluaW11bS4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCi0gKiBhcmUgbm90IHRocmVhZHNhZmUgLS0gZG9uJ3Qgc2hhcmUgdGhlbS4gPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc1JlYWRlciBleHRlbmRzIEJ5dGVBcnJheUlucHV0U3RyZWFtIHsKLSAgICAvLyBjb25zdGFudHMgdmFsdWVzIHRoYXQgYXBwZWFyIGluIGphdmEgY2xhc3MgZmlsZXMsCi0gICAgLy8gZnJvbSBqdm0gc3BlYyAybmQgZWQsIHNlY3Rpb24gNC40LCBwcCAxMDMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfQ2xhc3MgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9GaWVsZHJlZiA9IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX01ldGhvZHJlZiA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfU3RyaW5nID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfSW50ZWdlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0Zsb2F0ID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfTG9uZyA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0RvdWJsZSA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX05hbWVBbmRUeXBlID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX1V0ZjggPSAxOwotICAgIC8qKgotICAgICAqIHRoZSBjb25zdGFudCBwb29sLiAgY29uc3RhbnQgcG9vbCBpbmRpY2VzIGluIHRoZSBjbGFzcyBmaWxlCi0gICAgICogZGlyZWN0bHkgaW5kZXggaW50byB0aGlzIGFycmF5LiAgVGhlIHZhbHVlIHN0b3JlZCBpbiB0aGlzIGFycmF5Ci0gICAgICogaXMgdGhlIHBvc2l0aW9uIGluIHRoZSBjbGFzcyBmaWxlIHdoZXJlIHRoYXQgY29uc3RhbnQgYmVnaW5zLgotICAgICAqLwotICAgIHByaXZhdGUgaW50W10gY3Bvb2xJbmRleDsKLSAgICBwcml2YXRlIE9iamVjdFtdIGNwb29sOwotCi0gICAgcHJpdmF0ZSBNYXAgYXR0ck1ldGhvZHM7Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgYnl0ZWNvZGUgZm9yIGEgZ2l2ZW4gY2xhc3MsIGJ5IHVzaW5nIHRoZSBjbGFzcydzIGRlZmluaW5nCi0gICAgICogY2xhc3Nsb2FkZXIgYW5kIGFzc3VtaW5nIHRoYXQgZm9yIGEgY2xhc3MgbmFtZWQgUC5DLCB0aGUgYnl0ZWNvZGVzIGFyZQotICAgICAqIGluIGEgcmVzb3VyY2UgbmFtZWQgL1AvQy5jbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIHRoZSBjbGFzcyBvZiBpbnRlcmVzdAotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZWNvZGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoQ2xhc3MgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gZmluID0gYy5nZXRSZXNvdXJjZUFzU3RyZWFtKCcvJyArIGMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyIpOwotICAgICAgICBpZiAoZmluID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgYnl0ZWNvZGUgZm9yIGNsYXNzICIgKyBjLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICBpbnQgYWN0dWFsOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGFjdHVhbCA9IGZpbi5yZWFkKGJ1Zik7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgYWN0dWFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChhY3R1YWwgPiAwKTsKLSAgICAgICAgICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBjbGFzc0Rlc2NyaXB0b3JUb05hbWUoU3RyaW5nIGRlc2MpIHsKLSAgICAgICAgcmV0dXJuIGRlc2MucmVwbGFjZSgnLycsICcuJyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNYXAgZmluZEF0dHJpYnV0ZVJlYWRlcnMoQ2xhc3MgYykgewotICAgICAgICBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjLmdldE1ldGhvZHMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJyZWFkIikgJiYgbWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlKCkgPT0gdm9pZC5jbGFzcykgewotICAgICAgICAgICAgICAgIG1hcC5wdXQobmFtZS5zdWJzdHJpbmcoNCksIG1ldGhvZHNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFNpZ25hdHVyZShNZW1iZXIgbWV0aG9kLCBDbGFzc1tdIHBhcmFtVHlwZXMpIHsKLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgbWV0aG9kIGRlc2NyaXB0b3IKLQotICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKG1ldGhvZCBpbnN0YW5jZW9mIE1ldGhvZCkgPyBtZXRob2QuZ2V0TmFtZSgpIDogIjxpbml0PiIpOwotICAgICAgICBiLmFwcGVuZCgnKCcpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkRGVzY3JpcHRvcihiLCBwYXJhbVR5cGVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGIuYXBwZW5kKCcpJyk7Ci0gICAgICAgIGlmIChtZXRob2QgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIGFkZERlc2NyaXB0b3IoYiwgKChNZXRob2QpIG1ldGhvZCkuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgewotICAgICAgICAgICAgYWRkRGVzY3JpcHRvcihiLCB2b2lkLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZXNjcmlwdG9yKFN0cmluZ0J1ZmZlciBiLCBDbGFzcyBjKSB7Ci0gICAgICAgIGlmIChjLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgIGlmIChjID09IHZvaWQuY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1YnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gaW50LmNsYXNzKQotICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdJJyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09IGJvb2xlYW4uY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1onKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gYnl0ZS5jbGFzcykKLSAgICAgICAgICAgICAgICBiLmFwcGVuZCgnQicpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSBzaG9ydC5jbGFzcykKLSAgICAgICAgICAgICAgICBiLmFwcGVuZCgnUycpOwotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSBsb25nLmNsYXNzKQotICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdKJyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjID09IGNoYXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ0MnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gZmxvYXQuY2xhc3MpCi0gICAgICAgICAgICAgICAgYi5hcHBlbmQoJ0YnKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gZG91YmxlLmNsYXNzKSBiLmFwcGVuZCgnRCcpOwotICAgICAgICB9IGVsc2UgaWYgKGMuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgYWRkRGVzY3JpcHRvcihiLCBjLmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiLmFwcGVuZCgnTCcpLmFwcGVuZChjLmdldE5hbWUoKS5yZXBsYWNlKCcuJywgJy8nKSkuYXBwZW5kKCc7Jyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV4dCB1bnNpZ25lZCAxNiBiaXQgdmFsdWUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIGludCByZWFkU2hvcnQoKSB7Ci0gICAgICAgIHJldHVybiAocmVhZCgpIDw8IDgpIHwgcmVhZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmV4dCBzaWduZWQgMzIgYml0IHZhbHVlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcmVhZEludCgpIHsKLSAgICAgICAgcmV0dXJuIChyZWFkKCkgPDwgMjQpIHwgKHJlYWQoKSA8PCAxNikgfCAocmVhZCgpIDw8IDgpIHwgcmVhZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNraXBzIG4gYnl0ZXMgaW4gdGhlIGlucHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBza2lwRnVsbHkoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgaW50IGMgPSAoaW50KSBza2lwKG4pOwotICAgICAgICAgICAgaWYgKGMgPD0gMCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJFcnJvciBsb29raW5nIGZvciBwYXJhbXRlciBuYW1lcyBpbiBieXRlY29kZTogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwotICAgICAgICAgICAgbiAtPSBjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIE1lbWJlciByZXNvbHZlTWV0aG9kKGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkUG9zID0gcG9zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVtYmVyIG0gPSAoTWVtYmVyKSBjcG9vbFtpbmRleF07Ci0gICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpbmRleF07Ci0gICAgICAgICAgICAgICAgQ2xhc3Mgb3duZXIgPSByZXNvbHZlQ2xhc3MocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIE5hbWVBbmRUeXBlIG50ID0gcmVzb2x2ZU5hbWVBbmRUeXBlKHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbnQubmFtZSArIG50LnR5cGU7Ci0gICAgICAgICAgICAgICAgaWYgKG50Lm5hbWUuZXF1YWxzKCI8aW5pdD4iKSkgewotICAgICAgICAgICAgICAgICAgICBDb25zdHJ1Y3RvcltdIGN0b3JzID0gb3duZXIuZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3RvcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaWcgPSBnZXRTaWduYXR1cmUoY3RvcnNbaV0sIGN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZy5lcXVhbHMoc2lnbmF0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwb29sW2luZGV4XSA9IG0gPSBjdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvd25lci5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2lnID0gZ2V0U2lnbmF0dXJlKG1ldGhvZHNbaV0sIG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnLmVxdWFscyhzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Bvb2xbaW5kZXhdID0gbSA9IG1ldGhvZHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihzaWduYXR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG07Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwb3MgPSBvbGRQb3M7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBGaWVsZCByZXNvbHZlRmllbGQoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkUG9zID0gcG9zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmllbGQgZiA9IChGaWVsZCkgY3Bvb2xbaV07Ci0gICAgICAgICAgICBpZiAoZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpXTsKLSAgICAgICAgICAgICAgICBDbGFzcyBvd25lciA9IHJlc29sdmVDbGFzcyhyZWFkU2hvcnQoKSk7Ci0gICAgICAgICAgICAgICAgTmFtZUFuZFR5cGUgbnQgPSByZXNvbHZlTmFtZUFuZFR5cGUocmVhZFNob3J0KCkpOwotICAgICAgICAgICAgICAgIGNwb29sW2ldID0gZiA9IG93bmVyLmdldERlY2xhcmVkRmllbGQobnQubmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZjsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcyA9IG9sZFBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5hbWVBbmRUeXBlIHsKLSAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgIFN0cmluZyB0eXBlOwotCi0gICAgICAgIHB1YmxpYyBOYW1lQW5kVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIE5hbWVBbmRUeXBlIHJlc29sdmVOYW1lQW5kVHlwZShpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IG9sZFBvcyA9IHBvczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE5hbWVBbmRUeXBlIG50ID0gKE5hbWVBbmRUeXBlKSBjcG9vbFtpXTsKLSAgICAgICAgICAgIGlmIChudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVVdGY4KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IHJlc29sdmVVdGY4KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBjcG9vbFtpXSA9IG50ID0gbmV3IE5hbWVBbmRUeXBlKG5hbWUsIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG50OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcG9zID0gb2xkUG9zOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgcmVzb2x2ZUNsYXNzKGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBpbnQgb2xkUG9zID0gcG9zOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IChDbGFzcykgY3Bvb2xbaV07Ci0gICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9zID0gY3Bvb2xJbmRleFtpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc29sdmVVdGY4KHJlYWRTaG9ydCgpKTsKLSAgICAgICAgICAgICAgICBjcG9vbFtpXSA9IGMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzRGVzY3JpcHRvclRvTmFtZShuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcyA9IG9sZFBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcmVzb2x2ZVV0ZjgoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBvbGRQb3MgPSBwb3M7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIGNwb29sW2ldOwotICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcyA9IGNwb29sSW5kZXhbaV07Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRTaG9ydCgpOwotICAgICAgICAgICAgICAgIHNraXBGdWxseShsZW4pOwotICAgICAgICAgICAgICAgIGNwb29sW2ldID0gcyA9IG5ldyBTdHJpbmcoYnVmLCBwb3MgLSBsZW4sIGxlbiwgInV0Zi04Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBvcyA9IG9sZFBvczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlYWRDcG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOyAvLyBjcG9vbCBjb3VudAotICAgICAgICBjcG9vbEluZGV4ID0gbmV3IGludFtjb3VudF07Ci0gICAgICAgIGNwb29sID0gbmV3IE9iamVjdFtjb3VudF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaW50IGMgPSByZWFkKCk7Ci0gICAgICAgICAgICBjcG9vbEluZGV4W2ldID0gc3VwZXIucG9zOwotICAgICAgICAgICAgc3dpdGNoIChjKSAvLyBjb25zdGFudCBwb29sIHRhZwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRmllbGRyZWY6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9NZXRob2RyZWY6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWY6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9OYW1lQW5kVHlwZToKLQotICAgICAgICAgICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gY2xhc3MgaW5kZXggb3IgKDEyKSBuYW1lIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9DbGFzczoKLSAgICAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX1N0cmluZzoKLQotICAgICAgICAgICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gc3RyaW5nIGluZGV4IG9yIGNsYXNzIGluZGV4Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9Mb25nOgotICAgICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRG91YmxlOgotCi0gICAgICAgICAgICAgICAgICAgIHJlYWRJbnQoKTsgLy8gaGktdmFsdWUKLQotICAgICAgICAgICAgICAgICAgICAvLyBzZWUganZtIHNwZWMgc2VjdGlvbiA0LjQuNSAtIGRvdWJsZSBhbmQgbG9uZyBjcG9vbAotICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIG9jY3VweSB0d28gInNsb3RzIiBpbiB0aGUgY3Bvb2wgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0KLSAgICAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX0ludGVnZXI6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9GbG9hdDoKLQotICAgICAgICAgICAgICAgICAgICByZWFkSW50KCk7IC8vIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9VdGY4OgotCi0gICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkU2hvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2tpcEZ1bGx5KGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgLy8gY29ycnVwdCBjbGFzcyBmaWxlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVycm9yIGxvb2tpbmcgZm9yIHBhcmFtdGVyIG5hbWVzIGluIGJ5dGVjb2RlOiB1bmV4cGVjdGVkIGJ5dGVzIGluIGZpbGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNraXBBdHRyaWJ1dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgcmVhZFNob3J0KCk7IC8vIG5hbWUgaW5kZXgKLSAgICAgICAgICAgIHNraXBGdWxseShyZWFkSW50KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYW4gYXR0cmlidXRlcyBhcnJheS4gIFRoZSBlbGVtZW50cyBvZiBhIGNsYXNzIGZpbGUgdGhhdAotICAgICAqIGNhbiBjb250YWluIGF0dHJpYnV0ZXMgYXJlOiBmaWVsZHMsIG1ldGhvZHMsIHRoZSBjbGFzcyBpdHNlbGYsCi0gICAgICogYW5kIHNvbWUgb3RoZXIgdHlwZXMgb2YgYXR0cmlidXRlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWFkQXR0cmlidXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjb3VudCA9IHJlYWRTaG9ydCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGludCBuYW1lSW5kZXggPSByZWFkU2hvcnQoKTsgLy8gbmFtZSBpbmRleAotICAgICAgICAgICAgaW50IGF0dHJMZW4gPSByZWFkSW50KCk7Ci0gICAgICAgICAgICBpbnQgY3VyUG9zID0gcG9zOwotCi0gICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSByZXNvbHZlVXRmOChuYW1lSW5kZXgpOwotCi0gICAgICAgICAgICBNZXRob2QgbSA9IChNZXRob2QpIGF0dHJNZXRob2RzLmdldChhdHRyTmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtLmludm9rZSh0aGlzLCBuZXcgT2JqZWN0W117fSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IGN1clBvczsKLSAgICAgICAgICAgICAgICAgICAgc2tpcEZ1bGx5KGF0dHJMZW4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGN1clBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNraXBGdWxseShhdHRyTGVuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgY2FyZSB3aGF0IGF0dHJpYnV0ZSB0aGlzIGlzCi0gICAgICAgICAgICAgICAgc2tpcEZ1bGx5KGF0dHJMZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYSBjb2RlIGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkQ29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtYXggc3RhY2sKLSAgICAgICAgcmVhZFNob3J0KCk7IC8vIG1heCBsb2NhbHMKLSAgICAgICAgc2tpcEZ1bGx5KHJlYWRJbnQoKSk7IC8vIGNvZGUKLSAgICAgICAgc2tpcEZ1bGx5KDggKiByZWFkU2hvcnQoKSk7IC8vIGV4Y2VwdGlvbiB0YWJsZQotCi0gICAgICAgIC8vIHJlYWQgdGhlIGNvZGUgYXR0cmlidXRlcyAocmVjdXJzaXZlKS4gIFRoaXMgaXMgd2hlcmUKLSAgICAgICAgLy8gd2Ugd2lsbCBmaW5kIHRoZSBMb2NhbFZhcmlhYmxlVGFibGUgYXR0cmlidXRlLgotICAgICAgICByZWFkQXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzc1JlYWRlcihieXRlIGJ1ZltdLCBNYXAgYXR0ck1ldGhvZHMpIHsKLSAgICAgICAgc3VwZXIoYnVmKTsKLQotICAgICAgICB0aGlzLmF0dHJNZXRob2RzID0gYXR0ck1ldGhvZHM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL01ldGhvZFRhYmxlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL01ldGhvZFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTljZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL2phdmEyd3NkbC9ieXRlY29kZS9NZXRob2RUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIE1ldGhvZFRhYmxlIHsKLQotICAgIHByaXZhdGUgSGFzaE1hcCBuYW1lVG9NZXRob2RNYXA7Ci0gICAgcHJpdmF0ZSBDaGFpbmVkUGFyYW1SZWFkZXIgY3ByOwotCi0gICAgcHVibGljIE1ldGhvZFRhYmxlKENsYXNzIGNscykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNwciA9IG5ldyBDaGFpbmVkUGFyYW1SZWFkZXIoY2xzKTsKLSAgICAgICAgbmFtZVRvTWV0aG9kTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbG9hZE1ldGhvZHMoY2xzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBsb2FkIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGUgZ2l2ZW4gY2xhc3MgYnkgSmF2YSByZWZsZWN0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZE1ldGhvZHMoQ2xhc3MgY2xzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIFtdIG1ldGhvZHMgPSBjbHMuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBtZXRob2RzW2ldOwotICAgICAgICAgICAgbmFtZVRvTWV0aG9kTWFwLnB1dChtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBbXSBnZXRQYXJhbWV0ZXJOYW1lcyhTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbmFtZVRvTWV0aG9kTWFwLmdldChtZXRob2ROYW1lKTsKLSAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3ByLmdldFBhcmFtZXRlck5hbWVzKG1ldGhvZCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1OYW1lRXh0cmFjdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL1BhcmFtTmFtZUV4dHJhY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ1NTA3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1OYW1lRXh0cmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLmJ5dGVjb2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJldHJpZXZlcyBmdW5jdGlvbiBwYXJhbWV0ZXIgbmFtZXMgZnJvbSBieXRlY29kZSBidWlsdCB3aXRoCi0gKiBkZWJ1Z2dpbmcgc3ltYm9scy4gIFVzZWQgYXMgYSBsYXN0IHJlc29ydCB3aGVuIGNyZWF0aW5nIFdTREwuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbU5hbWVFeHRyYWN0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtTmFtZUV4dHJhY3Rvci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIGZ1bmN0aW9uIHBhcmFtZXRlciBuYW1lcyBmcm9tIGEgbWV0aG9kLiAKLSAgICAgKiBSZXR1cm5zIG51bGwgaWYgdW5hYmxlIHRvIHJlYWQgcGFyYW1ldGVyIG5hbWVzIChpLmUuIGJ5dGVjb2RlIG5vdAotICAgICAqIGJ1aWx0IHdpdGggZGVidWcpLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXNGcm9tRGVidWdJbmZvKE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgLy8gRG9uJ3Qgd29ycnkgYWJvdXQgaXQgaWYgdGhlcmUgYXJlIG5vIHBhcmFtcy4KLSAgICAgICAgaW50IG51bVBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKLSAgICAgICAgaWYgKG51bVBhcmFtcyA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgLy8gZ2V0IGRlY2xhcmluZyBjbGFzcwotICAgICAgICBDbGFzcyBjID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0KLSAgICAgICAgLy8gRG9uJ3Qgd29ycnkgYWJvdXQgaXQgaWYgdGhlIGNsYXNzIGlzIGEgSmF2YSBkeW5hbWljIHByb3h5Ci0gICAgICAgIGlmIChQcm94eS5pc1Byb3h5Q2xhc3MoYykpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGdldCBhIHBhcmFtZXRlciByZWFkZXIKLSAgICAgICAgICAgIFBhcmFtUmVhZGVyIHByID0gbmV3IFBhcmFtUmVhZGVyKGMpOwotICAgICAgICAgICAgLy8gZ2V0IHRoZSBwYXJhbWV0ZXIgbmFtZXMKLSAgICAgICAgICAgIHJldHVybiBwci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBsb2cgaXQgYW5kIGxlYXZlCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1SZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9qYXZhMndzZGwvYnl0ZWNvZGUvUGFyYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxYzNjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vamF2YTJ3c2RsL2J5dGVjb2RlL1BhcmFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5ieXRlY29kZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2xhc3MgZmlsZSByZWFkZXIgZm9yIG9idGFpbmluZyB0aGUgcGFyYW1ldGVyIG5hbWVzCi0gKiBmb3IgZGVjbGFyZWQgbWV0aG9kcyBpbiBhIGNsYXNzLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBkZWJ1Z2dpbmcKLSAqIGF0dHJpYnV0ZXMgZm9yIHVzIHRvIG9idGFpbiB0aGlzIGluZm9ybWF0aW9uLiA8cD4KLSAqIDxwLz4KLSAqIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgaW5oZXJpdGVkIG1ldGhvZHMuICBUbyBvYnRhaW4gcGFyYW1ldGVyCi0gKiBuYW1lcyBmb3IgaW5oZXJpdGVkIG1ldGhvZHMsIHlvdSBtdXN0IHVzZSBhIHBhcmFtUmVhZGVyIGZvciB0aGUKLSAqIGNsYXNzIHRoYXQgb3JpZ2luYWxseSBkZWNsYXJlZCB0aGUgbWV0aG9kLiA8cD4KLSAqIDxwLz4KLSAqIGRvbid0IGdldCB0cmlja3ksIGl0J3MgdGhlIGJhcmUgbWluaW11bS4gIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzCi0gKiBhcmUgbm90IHRocmVhZHNhZmUgLS0gZG9uJ3Qgc2hhcmUgdGhlbS4gPHA+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVJlYWRlcgotICAgICAgICBleHRlbmRzIENsYXNzUmVhZGVyIHsKLSAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOwotICAgIHByaXZhdGUgTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByaXZhdGUgQ2xhc3NbXSBwYXJhbVR5cGVzOwotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIGEgY2xhc3MgZmlsZSwgZ2l2ZW4gaXQncyBjbGFzcy4gIFdlJ2xsIHVzZSB0aGUgZGVmaW5pbmcKLSAgICAgKiBjbGFzc2xvYWRlciB0byBsb2NhdGUgdGhlIGJ5dGVjb2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIGMKLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1SZWFkZXIoQ2xhc3MgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhnZXRCeXRlcyhjKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2Vzc2VzIHRoZSBnaXZlbiBjbGFzcyBieXRlcyBkaXJlY3RseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbVJlYWRlcihieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoYiwgZmluZEF0dHJpYnV0ZVJlYWRlcnMoUGFyYW1SZWFkZXIuY2xhc3MpKTsKLQotICAgICAgICAvLyBjaGVjayB0aGUgbWFnaWMgbnVtYmVyCi0gICAgICAgIGlmIChyZWFkSW50KCkgIT0gMHhDQUZFQkFCRSkgewotICAgICAgICAgICAgLy8gbm90IGEgY2xhc3MgZmlsZSEKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgbG9va2luZyBmb3IgcGFyYW10ZXIgbmFtZXMgaW4gYnl0ZWNvZGU6IGlucHV0IGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGNsYXNzIGZpbGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtaW5vciB2ZXJzaW9uCi0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtYWpvciB2ZXJzaW9uCi0KLSAgICAgICAgcmVhZENwb29sKCk7IC8vIHNsdXJwIGluIHRoZSBjb25zdGFudCBwb29sCi0KLSAgICAgICAgcmVhZFNob3J0KCk7IC8vIGFjY2VzcyBmbGFncwotICAgICAgICByZWFkU2hvcnQoKTsgLy8gdGhpcyBjbGFzcyBuYW1lCi0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBzdXBlciBjbGFzcyBuYW1lCi0KLSAgICAgICAgaW50IGNvdW50ID0gcmVhZFNob3J0KCk7IC8vIGlmYWNlcyBjb3VudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBpbnRlcmZhY2UgaW5kZXgKLSAgICAgICAgfQotCi0gICAgICAgIGNvdW50ID0gcmVhZFNob3J0KCk7IC8vIGZpZWxkcyBjb3VudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBhY2Nlc3MgZmxhZ3MKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBuYW1lIGluZGV4Ci0gICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gZGVzY3JpcHRvciBpbmRleAotICAgICAgICAgICAgc2tpcEF0dHJpYnV0ZXMoKTsgLy8gZmllbGQgYXR0cmlidXRlcwotICAgICAgICB9Ci0KLSAgICAgICAgY291bnQgPSByZWFkU2hvcnQoKTsgLy8gbWV0aG9kcyBjb3VudAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBhY2Nlc3MgZmxhZ3MKLSAgICAgICAgICAgIGludCBtID0gcmVhZFNob3J0KCk7IC8vIG5hbWUgaW5kZXgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVzb2x2ZVV0ZjgobSk7Ci0gICAgICAgICAgICBpbnQgZCA9IHJlYWRTaG9ydCgpOyAvLyBkZXNjcmlwdG9yIGluZGV4Ci0gICAgICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBuYW1lICsgcmVzb2x2ZVV0ZjgoZCk7Ci0gICAgICAgICAgICByZWFkQXR0cmlidXRlcygpOyAvLyBtZXRob2QgYXR0cmlidXRlcwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWFkQ29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlYWRTaG9ydCgpOyAvLyBtYXggc3RhY2sKLSAgICAgICAgaW50IG1heExvY2FscyA9IHJlYWRTaG9ydCgpOyAvLyBtYXggbG9jYWxzCi0KLSAgICAgICAgTWV0aG9kSW5mbyBpbmZvID0gbmV3IE1ldGhvZEluZm8obWF4TG9jYWxzKTsKLSAgICAgICAgaWYgKG1ldGhvZHMgIT0gbnVsbCAmJiBtZXRob2ROYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1ldGhvZHMucHV0KG1ldGhvZE5hbWUsIGluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcEZ1bGx5KHJlYWRJbnQoKSk7IC8vIGNvZGUKLSAgICAgICAgc2tpcEZ1bGx5KDggKiByZWFkU2hvcnQoKSk7IC8vIGV4Y2VwdGlvbiB0YWJsZQotICAgICAgICAvLyByZWFkIHRoZSBjb2RlIGF0dHJpYnV0ZXMgKHJlY3Vyc2l2ZSkuICBUaGlzIGlzIHdoZXJlCi0gICAgICAgIC8vIHdlIHdpbGwgZmluZCB0aGUgTG9jYWxWYXJpYWJsZVRhYmxlIGF0dHJpYnV0ZS4KLSAgICAgICAgcmVhZEF0dHJpYnV0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgotICAgICAqIElmIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIG5hbWVzLCByZXR1cm4gbnVsbC4gIFRoZSByZXR1cm5lZCBhcnJheSB3aWxsCi0gICAgICogaGF2ZSBvbmUgbmFtZSBwZXIgcGFyYW1ldGVyLiAgVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgc2FtZQotICAgICAqIGFzIHRoZSBsZW5ndGggb2YgdGhlIENsYXNzW10gYXJyYXkgcmV0dXJuZWQgYnkgQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjdG9yCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZ1tdIGFycmF5IG9mIG5hbWVzLCBvbmUgcGVyIHBhcmFtZXRlciwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcyhDb25zdHJ1Y3RvciBjdG9yKSB7Ci0gICAgICAgIHBhcmFtVHlwZXMgPSBjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJOYW1lcyhjdG9yLCBwYXJhbVR5cGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZGVjbGFyZWQgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIG1ldGhvZC4KLSAgICAgKiBJZiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBuYW1lcywgcmV0dXJuIG51bGwuICBUaGUgcmV0dXJuZWQgYXJyYXkgd2lsbAotICAgICAqIGhhdmUgb25lIG5hbWUgcGVyIHBhcmFtZXRlci4gIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHdpbGwgYmUgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBDbGFzc1tdIGFycmF5IHJldHVybmVkIGJ5IE1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLgotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZAotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXSBhcnJheSBvZiBuYW1lcywgb25lIHBlciBwYXJhbWV0ZXIsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBwYXJhbVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QsIHBhcmFtVHlwZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJOYW1lcyhNZW1iZXIgbWVtYmVyLCBDbGFzcyBbXSBwYXJhbVR5cGVzKSB7Ci0gICAgICAgIC8vIGxvb2sgdXAgdGhlIG5hbWVzIGZvciB0aGlzIG1ldGhvZAotICAgICAgICBNZXRob2RJbmZvIGluZm8gPSAoTWV0aG9kSW5mbykgbWV0aG9kcy5nZXQoZ2V0U2lnbmF0dXJlKG1lbWJlciwgcGFyYW1UeXBlcykpOwotCi0gICAgICAgIC8vIHdlIGtub3cgYWxsIHRoZSBsb2NhbCB2YXJpYWJsZSBuYW1lcywgYnV0IHdlIG9ubHkgbmVlZCB0byByZXR1cm4KLSAgICAgICAgLy8gdGhlIG5hbWVzIG9mIHRoZSBwYXJhbWV0ZXJzLgotCi0gICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtVHlwZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGludCBqID0gTW9kaWZpZXIuaXNTdGF0aWMobWVtYmVyLmdldE1vZGlmaWVycygpKSA/IDAgOiAxOwotCi0gICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7ICAvLyBkaWQgd2UgZmluZCBhbnkgbm9uLW51bGwgbmFtZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpbmZvLm5hbWVzW2pdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVzW2ldID0gaW5mby5uYW1lc1tqXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzW2ldID09IGRvdWJsZS5jbGFzcyB8fCBwYXJhbVR5cGVzW2ldID09IGxvbmcuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBhIHNsb3QgZm9yIDY0Yml0IHBhcmFtcwotICAgICAgICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1OYW1lczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZEluZm8gewotICAgICAgICBTdHJpbmdbXSBuYW1lczsKLSAgICAgICAgaW50IG1heExvY2FsczsKLQotICAgICAgICBwdWJsaWMgTWV0aG9kSW5mbyhpbnQgbWF4TG9jYWxzKSB7Ci0gICAgICAgICAgICB0aGlzLm1heExvY2FscyA9IG1heExvY2FsczsKLSAgICAgICAgICAgIG5hbWVzID0gbmV3IFN0cmluZ1ttYXhMb2NhbHNdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2RJbmZvIGdldE1ldGhvZEluZm8oKSB7Ci0gICAgICAgIE1ldGhvZEluZm8gaW5mbyA9IG51bGw7Ci0gICAgICAgIGlmIChtZXRob2RzICE9IG51bGwgJiYgbWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbmZvID0gKE1ldGhvZEluZm8pIG1ldGhvZHMuZ2V0KG1ldGhvZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgaW52b2tlZCB3aGVuIGEgTG9jYWxWYXJpYWJsZVRhYmxlIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWFkTG9jYWxWYXJpYWJsZVRhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxlbiA9IHJlYWRTaG9ydCgpOyAvLyB0YWJsZSBsZW5ndGgKLSAgICAgICAgTWV0aG9kSW5mbyBpbmZvID0gZ2V0TWV0aG9kSW5mbygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgICAgICByZWFkU2hvcnQoKTsgLy8gc3RhcnQgcGMKLSAgICAgICAgICAgIHJlYWRTaG9ydCgpOyAvLyBsZW5ndGgKLSAgICAgICAgICAgIGludCBuYW1lSW5kZXggPSByZWFkU2hvcnQoKTsgLy8gbmFtZV9pbmRleAotICAgICAgICAgICAgcmVhZFNob3J0KCk7IC8vIGRlc2NyaXB0b3JfaW5kZXgKLSAgICAgICAgICAgIGludCBpbmRleCA9IHJlYWRTaG9ydCgpOyAvLyBsb2NhbCBpbmRleAotICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluZm8ubmFtZXNbaW5kZXhdID0gcmVzb2x2ZVV0ZjgobmFtZUluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdE9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdE9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2ZGM5My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWJzdHJhY3RPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RPcGVyYXRpb25EaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBBeGlzIEVuZ2luZSB0byBmaW5kIHRoZSBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzT3BlcmF0aW9uLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0RGlzcGF0Y2hlcigpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1zZ2N0eAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoKG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpICE9IG51bGwpICYmIChtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpID09IG51bGwpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uKG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpLCBtc2djdHgpOwotCi0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZ2N0eC5nZXRMb2dJRFN0cmluZygpICsgIiAiICsgTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3BlcmF0aW9uZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAvL3NldHRpbmcgYXhpc01lc3NhZ2UgaW50byBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIG1zZ2N0eC5zZXRBeGlzTWVzc2FnZShheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGZjMDlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFic3RyYWN0U2VydmljZURpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBYnN0cmFjdFNlcnZpY2VEaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBBeGlzIEVuZ2luZSB0byBmaW5kIHRoZSBzZXJ2aWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIEF4aXNTZXJ2aWNlLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdERpc3BhdGNoZXIoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtc2djdHgKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtc2djdHguZ2V0QXhpc1NlcnZpY2UoKTsKLQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBmaW5kU2VydmljZShtc2djdHgpOwotCi0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2Vmb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1zZ2N0eC5zZXRBeGlzU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZGJjNWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FjdGlvbkJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbkRpc3BhdGNoZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgYWN0aW9uID0gbWVzc2FnZUNvbnRleHQuZ2V0U29hcEFjdGlvbigpOwotCi0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgQ2hlY2tpbmcgZm9yIE9wZXJhdGlvbiB1c2luZyBBY3Rpb24gOiAiICsKLSAgICAgICAgICAgICAgICAgICAgYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFJFVklFVzogU2hvdWxkIHdlIEZJUlNUIHRyeSB0byBmaW5kIGFuIG9wZXJhdGlvbiB0aGF0IGV4cGxpY2l0bHkgbWFwcGVkIHRoaXMgCi0gICAgICAgICAgICAvLyBTT0FQQWN0aW9uIGFzIGFuIGFsaWFzIGJ5IGNhbGxpbmc6IAotICAgICAgICAgICAgLy8gQXhpc09wZXJhdGlvbiBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgIC8vIEFuZCBUSEVOLCBpZiB3ZSBkaWRuJ3QgZmluZCBhbiBleHBsaWNpdCBtYXBwaW5nIG9mIHRoaXMgYWN0aW9uLCBzZWUgaWYgdGhlcmUncyBhbiAKLSAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBhY3Rpb24sIGFuZCByb3V0ZSB0byB0aGF0IGJ5IGNhbGxpbmc6Ci0gICAgICAgICAgICAvLyBzZXJ2aWNlLmdldE9wZXJhdGlvbkJ5U09BUEFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlTT0FQQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICBpZiAob3AgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9wID0gc2VydmljZS5nZXRPcGVyYXRpb25CeUFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSEFDSzogUGxlYXNlIHJlbW92ZSB0aGlzIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIGN1c3RvbSBhY3Rpb24KLSAgICAgICAgICAgICAqIHVyaQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKG9wID09IG51bGwpICYmIChhY3Rpb24ubGFzdEluZGV4T2YoJy8nKSAhPSAtMSkpIHsKLSAgICAgICAgICAgICAgICBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShhY3Rpb24uc3Vic3RyaW5nKGFjdGlvbi5sYXN0SW5kZXhPZignLycpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmxlbmd0aCgpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gb3A7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiYTRlYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nRmF1bHRzSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBEaXNwYXRjaGVyIGJhc2VkIG9uIHRoZSBXUy1BZGRyZXNzaW5nIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3REaXNwYXRjaGVyIGltcGxlbWVudHMgQWRkcmVzc2luZ0NvbnN0YW50cyB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBOQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBydWJzZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlcigpOwotICAgIHByaXZhdGUgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIGFib2QgPSBuZXcgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBhYm9kLmZpbmRPcGVyYXRpb24oc2VydmljZSwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCXJldHVybiBydWJzZC5maW5kU2VydmljZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdERpc3BhdGNoZXIoKSB7Ci0gICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihOQU1FKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1zZ2N0eAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKiBAbm9pbnNwZWN0aW9uIE1ldGhvZFJldHVybk9mQ29uY3JldGVDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSByZXNwb25zZSA9IEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgCi0gICAgICAgIC8vIGZpcnN0IGNoZWNrIHdlIGNhbiBkaXNwYXRjaCB1c2luZyB0aGUgcmVsYXRlcyB0bwotICAgICAgICBpZiAobXNnY3R4LmdldFJlbGF0ZXNUbygpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByZWxhdGVzVG8gPSBtc2djdHguZ2V0UmVsYXRlc1RvKCkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJjaGVja2luZ3JlbGF0ZXN0byIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVzVG8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWxhdGVzVG8gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHJlbGF0ZXNUbykgJiYgKG1zZ2N0eC5nZXRPcGVyYXRpb25Db250ZXh0KCk9PW51bGwpKSB7Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2N0eC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcGVyYXRpb25Db250ZXh0KHJlbGF0ZXNUbyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uQ29udGV4dCAhPSBudWxsKSAvL25vaW5zcGVjdGlvbiBUb2RvQ29tbWVudAotICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBpZihvcGVyYXRpb25Db250ZXh0LmlzQ29tcGxldGUoKSl7Ci0vLyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaCBoYXBwZW5zIGJlY2F1c2Ugb2YgdGhlIFJlbGF0ZXNUbyBhbmQgdGhlIG1lcCBpcyBjb21wbGV0ZQotLy8gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgdGhyb3cgYSBtb3JlIGRlc2NyaXB0aXZlIGZhdWx0LgotLy8gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImR1cGxpY2F0ZXJlbGF0ZXN0byIscmVsYXRlc1RvKSk7Ci0vLyAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc09wZXJhdGlvbihvcGVyYXRpb25Db250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ2N0eC5zZXRPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBtc2djdHguc2V0U2VydmljZUNvbnRleHQoKFNlcnZpY2VDb250ZXh0KSBvcGVyYXRpb25Db250ZXh0LmdldFBhcmVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnY3R4LnNldEF4aXNTZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU2VydmljZUNvbnRleHQpIG9wZXJhdGlvbkNvbnRleHQuZ2V0UGFyZW50KCkpLmdldEF4aXNTZXJ2aWNlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBJcyB0aGlzIG5lY2Vzc2FyeSBoZXJlPwotICAgICAgICAgICAgICAgICAgICBtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpLnJlZ2lzdGVyTWVzc2FnZUNvbnRleHQobXNnY3R4LCBvcGVyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgICAgICAgICBtc2djdHguc2V0U2VydmljZUdyb3VwQ29udGV4dElkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU2VydmljZUdyb3VwQ29udGV4dCkgbXNnY3R4LmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0UGFyZW50KCkpLmdldElkKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIERpc3BhdGNoZWQgc3VjY2Vzc2Z1bGx5IG9uIHRoZSBSZWxhdGVzVG8uIG9wZXJhdGlvbj0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vRWxzZSB3ZSB3aWxsIHRyeSB0byBkaXNwYXRjaCBiYXNlZCBvbiB0aGUgV1MtQSBBY3Rpb24KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXNwb25zZSA9IHN1cGVyLmludm9rZShtc2djdHgpOwotICAgICAgICAgICAgT2JqZWN0IGZsYWcgPSBtc2djdHguZ2V0TG9jYWxQcm9wZXJ0eShJU19BRERSX0lORk9fQUxSRUFEWV9QUk9DRVNTRUQpOwotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJpbnZva2U6IElTX0FERFJfSU5GT19BTFJFQURZX1BST0NFU1NFRD0iICsgZmxhZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShmbGFnKSkgewotICAgICAgICAgICAgICAgIC8vIElmIG5vIEF4aXNPcGVyYXRpb24gaGFzIGJlZW4gZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgZGlzcGF0Y2ggcGhhc2UgYW5kIGFkZHJlc3NpbmcKLSAgICAgICAgICAgICAgICAvLyBpcyBpbiB1c2Ugd2Ugc2hvdWxkIHRocm93IGFuIEFjdGlvbk5vdFN1cHBvcnRlZCBGYXVsdCwgdW5sZXNzIHdlJ3ZlIGJlZW4gdG9sZAotICAgICAgICAgICAgICAgIC8vIG5vdCB0byBkbyB0aGlzIGNoZWNrIChieSBTeW5hcHNlLCBmb3IgaW5zdGFuY2UpCi0gICAgICAgICAgICAgICAgaWYgKEphdmFVdGlscy5pc1RydWUobXNnY3R4LmdldFByb3BlcnR5KEFERFJfVkFMSURBVEVfQUNUSU9OKSwgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tBY3Rpb24obXNnY3R4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSWYgYWRkcmVzc2luZyB3YXMgZm91bmQgYW5kIHRoZSBkaXNwYXRjaCBmYWlsZWQgd2UgU0hPVUxEIChhbmQgaGVuY2Ugd2lsbCkgcmV0dXJuIGEKLSAgICAgKiBXUy1BZGRyZXNzaW5nIEFjdGlvbk5vdFN1cHBvcnRlZCBmYXVsdC4gVGhpcyB3aWxsIG1ha2UgbW9yZSBzZW5zZSBvbmNlIHRoZQotICAgICAqIEFkZHJlc3NpbmdCYXNlZERzaXBhdGNoZXIgaXMgbW92ZWQgaW50byB0aGUgYWRkcmVzc2luZyBtb2R1bGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBY3Rpb24oTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICgobXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpID09IG51bGwpIHx8IChtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlckFjdGlvbk5vdFN1cHBvcnRlZEZhdWx0KG1zZ0NvbnRleHQsIG1zZ0NvbnRleHQuZ2V0V1NBQWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0hUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0hUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBiOTBjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdERpc3BhdGNoZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsICYmIG1lc3NhZ2VDb250ZXh0LmdldFRvKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCkuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgU3RyaW5nIGh0dHBMb2NhdGlvbiA9IHBhcnNlUmVxdWVzdFVSTCh1cmksIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0UGF0aCgpKTsKLSAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCk7Ci0KLSAgICAgICAgICAgIGlmIChodHRwTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGh0dHBMb2NhdGlvbiA9IGh0dHBNZXRob2QgKyBodHRwTG9jYXRpb247Ci0gICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSBjaGVjayB3aGV0aGVyIHRoZSByZXF1ZXN0IHdhcyBkaXNwYXRjaGVkIHRvIHRoZSBjb3JyZWN0IGVuZHBvaW50LiBJZiBpdAotICAgICAgICAgICAgICAgIC8vIHdhcyB3ZSBjYW4gZGlzcGF0Y2ggdGhlIG9wZXJhdGlvbiB1c2luZyB0aGUgSFRUUExvY2F0aW9uRGlzcGF0Y2hlciB0YWJsZSBvZiB0aGF0Ci0gICAgICAgICAgICAgICAgLy8gc3BlY2lmaWMgZW5kcG9pbnQuIAotICAgICAgICAgICAgICAgIGlmIChheGlzRW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBNYXAgaHR0cExvY2F0aW9uVGFibGUgPSAoTWFwKSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkhUVFBfTE9DQVRJT05fVEFCTEUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHR0cExvY2F0aW9uVGFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE9wZXJhdGlvbkZyb21IVFRQTG9jYXRpb24oaHR0cExvY2F0aW9uLCBodHRwTG9jYXRpb25UYWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHQgdG8gY2hlY2sgZm9yIE9wZXJhdGlvbiB1c2luZyBIVFRQIExvY2F0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBEaXNwYXRjaGVyIGRvZXMgbm90IG5lZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmljZSwgYXMgdGhhdCBpcyBoYW5kbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwYXJzZVJlcXVlc3RVUkwoU3RyaW5nIHBhdGgsIFN0cmluZyBzZXJ2aWNlUGF0aCkgewotCi0gICAgICAgIGludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2Yoc2VydmljZVBhdGgpOwotICAgICAgICBTdHJpbmcgc2VydmljZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKC0xICE9IGluZGV4KSB7Ci0gICAgICAgICAgICBpbnQgc2VydmljZVN0YXJ0ID0gaW5kZXggKyBzZXJ2aWNlUGF0aC5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gc2VydmljZVN0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBwYXRoLnN1YnN0cmluZyhzZXJ2aWNlU3RhcnQgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluZGV4ID0gc2VydmljZS5pbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBpZiAoLTEgIT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlID0gc2VydmljZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcXVlcnlJbmRleCA9IHNlcnZpY2UuaW5kZXhPZigiPyIpOwotICAgICAgICAgICAgICAgIGlmIChxdWVyeUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlLnN1YnN0cmluZyhxdWVyeUluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gdGhlIHJlcXVlc3RQYXRoIHRoYXQgdGhlIHJlcXVlc3QgY2FtZSB0byBoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgYXhpc09wZXJhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3RQYXRoIC0gUGFydCBvZiB0aGUgcmVxdWVzdCB1cmwgd2hpY2ggaXMgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcnZpY2UgbmFtZQotICAgICAqIEBwYXJhbSBodHRwTG9jYXRpb25UYWJsZSAtIFRoZSBodHRwTG9jYXRpb25UYWJsZSBzdG9yZWQgaW4gdGhlIHJlbGF2YW50IGJpbmRpbmcKLSAgICAgKiBAcmV0dXJuIEF4aXNPcGVyYXRpb24gLSBUaGUgY29ycmVzcG9uZGluZyBBeGlzT3BlcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGdldE9wZXJhdGlvbkZyb21IVFRQTG9jYXRpb24oU3RyaW5nIHJlcXVlc3RQYXRoLCBNYXAgaHR0cExvY2F0aW9uVGFibGUpIHsKLQotICAgICAgICBDb2xsZWN0aW9uIGh0dHBMb2NhdGlvbnMgPSBodHRwTG9jYXRpb25UYWJsZS5rZXlTZXQoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGh0dHBMb2NhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHJlcXVlc3RQYXRoLmluZGV4T2YobG9jYXRpb24pOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEF4aXNPcGVyYXRpb24pIGh0dHBMb2NhdGlvblRhYmxlLmdldChsb2NhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWIxMmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJlbGF0ZXNUbyByZWxhdGVzVG8gPSBtZXNzYWdlQ29udGV4dC5nZXRSZWxhdGVzVG8oKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uQ29udGV4dCB1c2luZyBSZWxhdGVzVG8gOiAiICsgcmVsYXRlc1RvKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJlbGF0ZXNUbyAhPSBudWxsKSAmJiAocmVsYXRlc1RvLmdldFZhbHVlKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQocmVsYXRlc1RvLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBGb3VuZCBPcGVyYXRpb25Db250ZXh0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjY1NGY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJlbGF0ZXNUb0Jhc2VkU2VydmljZURpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJlbGF0ZXNUbyByZWxhdGVzVG8gPSBtZXNzYWdlQ29udGV4dC5nZXRSZWxhdGVzVG8oKTsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uQ29udGV4dCB1c2luZyBSZWxhdGVzVG8gOiAiICsgcmVsYXRlc1RvKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJlbGF0ZXNUbyAhPSBudWxsKSAmJiAocmVsYXRlc1RvLmdldFZhbHVlKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQocmVsYXRlc1RvLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBGb3VuZCBPcGVyYXRpb25Db250ZXh0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGM5NjYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotCi0vKioKLSAqIERpc3BhdGNoZXMgdGhlIHNlcnZpY2UgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3REaXNwYXRjaGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBydWJzZCA9IG5ldyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlcigpOwotICAgIAotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kT3BlcmF0aW9uKG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIFRoaXMgRGlzcGF0Y2hlciBkb2VzIG5vdCBuZWVkIHRvIHJlc29sdmUgdGhlIG9wZXJhdGlvbiwgYXMgdGhhdCBpcyBoYW5kbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRTZXJ2aWNlKG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZmluZFNlcnZpY2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlyZXR1cm4gcnVic2QuZmluZFNlcnZpY2UobWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU0ODU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb25EaXNwYXRjaGVyIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0b0VQUiA9IG1lc3NhZ2VDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgIGlmICh0b0VQUiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZVBhcnQgPSB0b0VQUi5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBVdGlscy5wYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKGZpbGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldFNlcnZpY2VDb250ZXh0UGF0aCgpKTsKLQotICAgICAgICAgICAgaWYgKCh2YWx1ZXMubGVuZ3RoID49IDIpICYmICh2YWx1ZXNbMV0gIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKHZhbHVlc1sxXSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uIHVzaW5nIFFOYW1lKHRhcmdldCBlbmRwb2ludCBVUkkgZnJhZ21lbnQpIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgQXR0ZW1wdGVkIHRvIGNoZWNrIGZvciBPcGVyYXRpb24gdXNpbmcgdGFyZ2V0IGVuZHBvaW50IFVSSSwgYnV0IHRoZSBvcGVyYXRpb24gZnJhZ21lbnQgd2FzIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBBdHRlbXB0ZWQgdG8gY2hlY2sgZm9yIE9wZXJhdGlvbiB1c2luZyBudWxsIHRhcmdldCBlbmRwb2ludCBVUkkiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdERpc3BhdGNoZXIoKSB7Ci0gICAgICAgIGluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbihOQU1FKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZTdlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0U2VydmljZURpc3BhdGNoZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFJlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgdG9FUFIgPSBtZXNzYWdlQ29udGV4dC5nZXRUbygpOwotICAgICAgICBpZiAodG9FUFIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIENoZWNraW5nIGZvciBTZXJ2aWNlIHVzaW5nIHRhcmdldCBlbmRwb2ludCBhZGRyZXNzIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB0b0VQUi5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXJ0ID0gdG9FUFIuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgLy9SRVZJRVc6IChuYWd5KSBQYXJzaW5nIHRoZSBSZXF1ZXN0VVJJIHdpbGwgYWxzbyBnaXZlIHVzIHRoZSBvcGVyYXRpb25OYW1lIGlmIHByZXNlbnQsIHNvIHdlIGNvdWxkIGNvbmNlaXZhYmx5IHN0b3JlIGl0IGluIHRoZSBNZXNzYWdlQ29udGV4dCwgYnV0IGRvaW5nIHNvIGFuZCByZXRyaWV2aW5nIGl0IGlzIHByb2JhYmx5IG5vIGZhc3RlciB0aGFuIHNpbXBseSByZXBhcnNpbmcgdGhlIFVSSQotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gVXRpbHMucGFyc2VSZXF1ZXN0VVJMRm9yU2VydmljZUFuZE9wZXJhdGlvbihmaWxlUGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSk7Ci0KLSAgICAgICAgICAgIGlmICgodmFsdWVzLmxlbmd0aCA+PSAxKSAmJiAodmFsdWVzWzBdICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAJCi0gICAgICAgICAgICAJQXhpc0NvbmZpZ3VyYXRpb24gcmVnaXN0cnkgPQotICAgICAgICAgICAgCQljb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICAJQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSByZWdpc3RyeS5nZXRTZXJ2aWNlKHZhbHVlc1swXSk7Ci0KLSAgICAgICAgICAgIAkvLyBJZiB0aGUgYXhpc1NlcnZpY2UgaXMgbm90IG51bGwgd2UgZ2V0IHRoZSBiaW5kaW5nIHRoYXQgdGhlIHJlcXVlc3QgY2FtZSB0byBhZGQKLSAgICAgICAgICAgIAkvLyBhZGQgaXQgYXMgYSBwcm9wZXJ0eSB0byB0aGUgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgIAlpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgCQlNYXAgZW5kcG9pbnRzID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCk7Ci0gICAgICAgICAgICAJCWlmIChlbmRwb2ludHMgIT0gbnVsbCkgewotICAgICAgICAgICAgCQkJaWYgKGVuZHBvaW50cy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgCQkJCW1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkVORFBPSU5UX0xPQ0FMX05BTUUsCi0gICAgICAgICAgICAJCQkJCQllbmRwb2ludHMuZ2V0KAotICAgICAgICAgICAgCQkJCQkJCQlheGlzU2VydmljZS5nZXRFbmRwb2ludE5hbWUoKSkpOwotICAgICAgICAgICAgCQkJfSBlbHNlIHsKLSAgICAgICAgICAgIAkJCQlTdHJpbmcgZW5kcG9pbnROYW1lID0gdmFsdWVzWzBdLnN1YnN0cmluZyh2YWx1ZXNbMF0uaW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICAJCQkJbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSwKLSAgICAgICAgICAgIAkJCQkJCWVuZHBvaW50cy5nZXQoZW5kcG9pbnROYW1lKSk7Ci0gICAgICAgICAgICAJCQl9Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9Ci0KLSAgICAgICAgICAgIAlyZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEF0dGVtcHRlZCB0byBjaGVjayBmb3IgU2VydmljZSB1c2luZyB0YXJnZXQgZW5kcG9pbnQgVVJJLCBidXQgdGhlIHNlcnZpY2UgZnJhZ21lbnQgd2FzIG1pc3NpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgQXR0ZW1wdGVkIHRvIGNoZWNrIGZvciBTZXJ2aWNlIHVzaW5nIG51bGwgdGFyZ2V0IGVuZHBvaW50IFVSSSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTVjOGIxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRhcmdldCBlbmRwb2ludCBVUkwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0RGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIjsKLSAgICBwcml2YXRlIFJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgcnVib2QgPSBuZXcgUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyI2ZpbmRPcGVyYXRpb24ob3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGZpbmRPcGVyYXRpb24oQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAJcmV0dXJuIHJ1Ym9kLmZpbmRPcGVyYXRpb24oc2VydmljZSwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBEaXNwYXRjaGVyIGRvZXMgbm90IG5lZWQgdG8gcmVzb2x2ZSB0aGUgc2VydmljZSwgYXMgdGhhdCBpcyBoYW5kbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMTYzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyBiYXNlZCBvbiB0aGUgU09BUEFjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdERpc3BhdGNoZXIgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgTkFNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIGFib2QgPSBuZXcgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyKCk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBhYm9kLmZpbmRPcGVyYXRpb24oc2VydmljZSwgbWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BYnN0cmFjdERpc3BhdGNoZXIjZmluZFNlcnZpY2Uob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobWVzc2FnZUNvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICIgQ2hlY2tpbmcgZm9yIFNlcnZpY2UgdXNpbmcgU09BUEFjdGlvbiBpcyBhIFRPRE8gaXRlbSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4NmE1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQWJzdHJhY3REaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIERpc3BhdGNoZXMgYmFzZWQgb24gdGhlIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGZpcnN0IGNoaWxkIG9mCi0gKiB0aGUgYm9keS4KLSAqLwotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0RGlzcGF0Y2hlciB7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBOQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGxvY2FsTmFtZSAhPSBudWxsKXsKLSAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TlMoKTsKLSAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBudWxsOwotICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUobnMuZ2V0TmFtZXNwYWNlVVJJKCksIGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUocU5hbWUpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBmb3Igc2VydmljZXMgdXNlcyB0aGUgUlBDIG1lc3NhZ2UgcmVjZWl2ZXIKLSAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICBRTmFtZSBvcGVyYXRpb25OYW1lID0gbmV3IFFOYW1lKGxvY2FsTmFtZSk7Ci0gICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzT3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkFic3RyYWN0RGlzcGF0Y2hlciNmaW5kU2VydmljZShvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGZpbmRTZXJ2aWNlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0U09BUEJvZHlGaXJzdEVsZW1lbnROUygpOwotCi0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGFydCA9IG5zLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ2hlY2tpbmcgZm9yIFNlcnZpY2UgdXNpbmcgU09BUCBtZXNzYWdlIGJvZHkncyBmaXJzdCBjaGlsZCdzIG5hbWVzcGFjZSA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGVQYXJ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBVdGlscy5wYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKGZpbGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gdmFsdWVzWzBdOwotCi0gICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHJlZ2lzdHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RyeS5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0RGlzcGF0Y2hlcigpIHsKLSAgICAgICAgaW5pdChuZXcgSGFuZGxlckRlc2NyaXB0aW9uKE5BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNTEzNjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1NPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvZ2dpbmdDb250cm9sOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0gICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhtZXNzYWdlQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsKLSAgICAgICAgICAgICAgICAgICAgIiBDaGVja2luZyBmb3IgT3BlcmF0aW9uIHVzaW5nIFNPQVAgbWVzc2FnZSBib2R5J3MgZmlyc3QgY2hpbGQncyBsb2NhbCBuYW1lIDogIgotICAgICAgICAgICAgICAgICAgICArIGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKGxvY2FsUGFydCkpOwotCi0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG5zID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRTT0FQQm9keUZpcnN0RWxlbWVudE5TKCk7Ci0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKG5zLmdldE5hbWVzcGFjZVVSSSgpLCBsb2NhbFBhcnQpOwotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShxTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobG9jYWxQYXJ0KTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ocU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBheGlzT3BlcmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzcwOTU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9TT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRGlzcGF0Y2hlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlNPQVBNZXNzYWdlQm9keUJhc2VkU2VydmljZURpc3BhdGNoZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQTWVzc2FnZUJvZHlCYXNlZFNlcnZpY2VEaXNwYXRjaGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldFNPQVBCb2R5Rmlyc3RFbGVtZW50TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0U09BUEJvZHlGaXJzdEVsZW1lbnROUygpOwotCi0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGFydCA9IG5zLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2VDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGVja2luZyBmb3IgU2VydmljZSB1c2luZyBTT0FQIG1lc3NhZ2UgYm9keSdzIGZpcnN0IGNoaWxkJ3MgbmFtZXNwYWNlIDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZVBhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBVdGlscy5wYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKGZpbGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1swXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gdmFsdWVzWzBdOwotCi0gICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHJlZ2lzdHJ5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXREaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWJzdHJhY3REaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Fic3RyYWN0RGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFjYjA5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWJzdHJhY3REaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIGRpc3BhdGNoZXJzLiBBIGRpc3BhdGNoZXIncyB0YXNrIGlzCi0gKiB0byBmaW5kIHRoZSBzZXJ2aWNlIGZvciBhbiBpbmNvbWluZyBTT0FQIG1lc3NhZ2UuCi0gKiA8cC8+Ci0gKiBJbiBBeGlzMiwgYSBjaGFpbiBvZiBkaXNwYXRjaGVycyBpcyBzZXR1cC4gRWFjaCB0cmllcyB0bwotICogZGlzcGF0Y2ggYW5kIHJldHVybiB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbiwgaW4gY2FzZSBpdCBmYWlscwotICogdG8gZmluZCB0aGUgc2VydmljZSBvciBvcGVyYXRpb24uIERpc3BhdGNoZXJzIGxvb2sgZm9yIHNlcnZpY2VzLCBvcGVyYXRpb25zLAotICogb3IgYm90aC4KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaXNwYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE5BTUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFic3RyYWN0RGlzcGF0Y2hlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0RGlzcGF0Y2hlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3REaXNwYXRjaGVyKCkgewotICAgICAgICBpbml0KG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oTkFNRSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBBeGlzIEVuZ2luZSB0byBmaW5kIHRoZSBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzT3BlcmF0aW9uLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgQXhpcyBFbmdpbmUgdG8gZmluZCB0aGUgc2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzU2VydmljZS4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBBeGlzU2VydmljZSBmaW5kU2VydmljZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGluaXREaXNwYXRjaGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbXNnY3R4Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ2N0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbXNnY3R4LmdldEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gZmluZFNlcnZpY2UobXNnY3R4KTsKLQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlZm91bmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChheGlzU2VydmljZSAhPSBudWxsKSAmJiAobXNnY3R4LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSkgewotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbihheGlzU2VydmljZSwgbXNnY3R4KTsKLQotICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wZXJhdGlvbmZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbXNnY3R4LnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgLy9zZXR0aW5nIGF4aXNNZXNzYWdlIGludG8gbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICBtc2djdHguc2V0QXhpc01lc3NhZ2UoYXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSk7Ci0gICAgICAgICAgICAgICAgQXhpc0VuZHBvaW50IGF4aXNFbmRwb2ludCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoQXhpc0VuZHBvaW50KSBtc2djdHguZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpc0VuZHBvaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmcgYXhpc0JpbmRpbmcgPSBheGlzRW5kcG9pbnQuZ2V0QmluZGluZygpOwotCQkJCQlBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IChBeGlzQmluZGluZ09wZXJhdGlvbikgYXhpc0JpbmRpbmcKLQkJCQkJCQkuZ2V0Q2hpbGQoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkpOwotCQkJCQlpZiAoYXhpc0JpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpCi0JCQkJCQkJCS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCUF4aXNCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IG51bGw7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPEF4aXNCaW5kaW5nT3BlcmF0aW9uPiBpdGVyYXRvciA9IGF4aXNCaW5kaW5nLmdldENoaWxkcmVuKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJYmluZGluZ09wID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxvY2FsTmFtZS5lcXVhbHMoYmluZGluZ09wLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpIHsKLQkJCQkJCQkJYXhpc0JpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3A7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkgaWYgKGF4aXNCaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCW1zZ2N0eAotCQkJCQkJCQkuc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJQ29uc3RhbnRzLkFYSVNfQklORElOR19NRVNTQUdFLAotCQkJCQkJCQkJCWF4aXNCaW5kaW5nT3BlcmF0aW9uCi0JCQkJCQkJCQkJCQkuZ2V0Q2hpbGQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKSk7Ci0JCQkJCQltc2djdHguc2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19PUEVSQVRJT04sCi0JCQkJCQkJCWF4aXNCaW5kaW5nT3BlcmF0aW9uKTsKLQkJCQkJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWExNmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi0vKioKLSAqIERpc3BhdGNoZXIgYmFzZWQgb24gdGhlIFdTLUFkZHJlc3NpbmcgcHJvcGVydGllcy4KLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIKLSAqLwotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjUwZTU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIudW5rbm93bmNvbnRlbnQuVW5rbm93bkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkF4aXNEYXRhTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuTW9kdWxlRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uTW9kdWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5UYXJnZXRSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLS8qKgotICogQ2xhc3MgQXhpc0NvbmZpZ3VyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEF4aXNDb25maWd1cmF0aW9uIGV4dGVuZHMgQXhpc0Rlc2NyaXB0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzQ29uZmlndXJhdGlvbi5jbGFzcyk7Ci0gICAgLyogCi0gICAgICogVG8gc3RvcmUgY29uZmlndXJlZCBkYXRhIGxvY2F0b3JzCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQXhpc0RhdGFMb2NhdG9yPiBkYXRhTG9jYXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF4aXNEYXRhTG9jYXRvcj4oKTsKLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGRhdGFMb2NhdG9yQ2xhc3NOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgLyoqCi0gICAgICogTWFwIG9mIGFsbCBhdmFpbGFibGUgbW9kdWxlcy4gVGhlIGtleSBpcyB0aGUgYXJjaGl2ZSBuYW1lIGFzIGRlZmluZWQgYnkKLSAgICAgKiB7QGxpbmsgQXhpc01vZHVsZSNnZXRBcmNoaXZlTmFtZSgpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBeGlzTW9kdWxlPiBhbGxNb2R1bGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBeGlzTW9kdWxlPigpOwotCi0gICAgLy8gVG8gc3RvcmUgbWFwcGluZyBiZXR3ZWVuIGRlZmF1bHQgdmVyc2lvbiBhbmQgbW9kdWxlIG5hbWUKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVUb3ZlcnNpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQotICAgIC8vIHByaXZhdGUgZmluYWwgSGFzaE1hcCBzZXJ2aWNlR3JvdXBzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uPiB0cmFuc3BvcnRzSW4gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRyYW5zcG9ydEluRGVzY3JpcHRpb24+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbj4gdHJhbnNwb3J0c091dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBMaXN0PEF4aXNNb2R1bGU+PiBwb2xpY3lTdXBwb3J0ZWRNb2R1bGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEF4aXNNb2R1bGU+PigpOwotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSBRTmFtZXMgb2YgbG9jYWwgcG9saWN5IGFzc2VydGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxRTmFtZT4gbG9jYWxQb2xpY3lBc3NlcnRpb25zID0gbmV3IEFycmF5TGlzdDxRTmFtZT4oKTsKLQotICAgIC8vIHRvIHN0b3JlIEF4aXNPYnNlcnZlciBPYmplY3RzCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8QXhpc09ic2VydmVyPiBvYnNlcnZlcnNMaXN0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgVVJMIGF4aXMyUmVwb3NpdG9yeSA9IG51bGw7Ci0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPiBhbGxTZXJ2aWNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQXhpc1NlcnZpY2U+IGFsbEVuZHBvaW50cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIEF4aXNTZXJ2aWNlPigpOwotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSBzZXJ2ZXIueG1sIGF0IHRoZSBkb2N1bWVudCBwYXJzaW5nIHRpbWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2xvYmFsTW9kdWxlTGlzdDsKLQotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBmYXVsdHlNb2R1bGVzOwotCi0gICAgLyoqCi0gICAgICogVG8gc3RvcmUgZmF1bHR5IHNlcnZpY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZhdWx0eVNlcnZpY2VzOwotCi0gICAgcHJpdmF0ZSBMaXN0PFBoYXNlPiBpbkZhdWx0UGhhc2VzOwotCi0gICAgcHJpdmF0ZSBMaXN0PFBoYXNlPiBpblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2g7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlUmVjZWl2ZXI+IG1lc3NhZ2VSZWNlaXZlcnM7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBCdWlsZGVyPiBtZXNzYWdlQnVpbGRlcnM7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlRm9ybWF0dGVyPiBtZXNzYWdlRm9ybWF0dGVyczsKLQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgbW9kdWxlQ2xhc3NMb2FkZXI7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBNb2R1bGVDb25maWd1cmF0aW9uPiBtb2R1bGVDb25maWdtYXA7Ci0KLSAgICBwcml2YXRlIExpc3Q8UGhhc2U+IG91dEZhdWx0UGhhc2VzOwotCi0gICAgcHJpdmF0ZSBMaXN0PFBoYXNlPiBvdXRQaGFzZXM7Ci0KLSAgICBwcm90ZWN0ZWQgUGhhc2VzSW5mbyBwaGFzZXNpbmZvOwotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBzZXJ2aWNlQ2xhc3NMb2FkZXI7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIHN5c3RlbUNsYXNzTG9hZGVyOwotCi0gICAgLy9UbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgc3RhcnRlZCBvciBub3QKLSAgICBwcml2YXRlIGJvb2xlYW4gc3RhcnQ7Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxUYXJnZXRSZXNvbHZlcj4gdGFyZ2V0UmVzb2x2ZXJzOwotCi0gICAgcHJpdmF0ZSBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlcjsKLQotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLSAgICBwcml2YXRlIFRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbiB0cmFuc2FjdGlvbkNvbmZpZ3VyYXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBBeGlzQ29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0NvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIG1vZHVsZUNvbmZpZ21hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTW9kdWxlQ29uZmlndXJhdGlvbj4oKTsKLSAgICAgICAgZ2xvYmFsTW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtZXNzYWdlUmVjZWl2ZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlUmVjZWl2ZXI+KCk7Ci0gICAgICAgIG1lc3NhZ2VCdWlsZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnVpbGRlcj4oKTsKLSAgICAgICAgbWVzc2FnZUZvcm1hdHRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VGb3JtYXR0ZXI+KCk7Ci0gICAgICAgIG91dFBoYXNlcyA9IG5ldyBBcnJheUxpc3Q8UGhhc2U+KCk7Ci0gICAgICAgIGluRmF1bHRQaGFzZXMgPSBuZXcgQXJyYXlMaXN0PFBoYXNlPigpOwotICAgICAgICBvdXRGYXVsdFBoYXNlcyA9IG5ldyBBcnJheUxpc3Q8UGhhc2U+KCk7Ci0gICAgICAgIGZhdWx0eVNlcnZpY2VzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZmF1bHR5TW9kdWxlcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIG9ic2VydmVyc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNPYnNlcnZlcj4oKTsKLSAgICAgICAgaW5QaGFzZXNVcHRvQW5kSW5jbHVkaW5nUG9zdERpc3BhdGNoID0gbmV3IEFycmF5TGlzdDxQaGFzZT4oKTsKLSAgICAgICAgc3lzdGVtQ2xhc3NMb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBzZXJ2aWNlQ2xhc3NMb2FkZXIgPSBzeXN0ZW1DbGFzc0xvYWRlcjsKLSAgICAgICAgbW9kdWxlQ2xhc3NMb2FkZXIgPSBzeXN0ZW1DbGFzc0xvYWRlcjsKLQotICAgICAgICB0aGlzLnBoYXNlc2luZm8gPSBuZXcgUGhhc2VzSW5mbygpOwotICAgICAgICB0YXJnZXRSZXNvbHZlcnMgPSBuZXcgQXJyYXlMaXN0PFRhcmdldFJlc29sdmVyPigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VSZWNlaXZlcihTdHJpbmcgbWVwVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyKSB7Ci0gICAgICAgIG1lc3NhZ2VSZWNlaXZlcnMucHV0KG1lcFVSTCwgbWVzc2FnZVJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG1lc3NhZ2VCdWlsZGVyIGltcGxlbWVudGF0aW9uIGFnYWluc3QgYSBjb250ZW50IHR5cGUuCi0gICAgICogVGhpcyBpcyB1c2VkIGJ5IEF4aXMyIHRvIHN1cHBvcnQgZGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSAgICB0aGUgcmVsZXZhbnQgY29udGVudC10eXBlIChpLmUuICJ0ZXh0L3htbCIpCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdWlsZGVyIGEgQnVpbGRlciBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VCdWlsZGVyKFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGVyIG1lc3NhZ2VCdWlsZGVyKSB7Ci0gICAgICAgIG1lc3NhZ2VCdWlsZGVycy5wdXQoY29udGVudFR5cGUsIG1lc3NhZ2VCdWlsZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciBhIG1lc3NhZ2VGb3JtYXR0ZXIgaW1wbGVtZW50YXRpb24gYWdhaW5zdCBhIGNvbnRlbnQgdHlwZS4KLSAgICAgKiBUaGlzIGlzIHVzZWQgYnkgQXhpczIgdG8gc3VwcG9ydCBzZXJpYWxpemF0aW9uIG9mIG1lc3NhZ2VzIHRvIGRpZmZlcmVudAotICAgICAqIG1lc3NhZ2UgZm9ybWF0cy4gKEVnOiBKU09OKQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlICAgICAgdGhlIHJlbGV2YW50IGNvbnRlbnQtdHlwZSAoaS5lLiAidGV4dC94bWwiKQotICAgICAqIEBwYXJhbSBtZXNzYWdlRm9ybWF0dGVyIGEgTWVzc2FnZUZvcm1hdHRlciBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2VGb3JtYXR0ZXIoU3RyaW5nIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZvcm1hdHRlciBtZXNzYWdlRm9ybWF0dGVyKSB7Ci0gICAgICAgIG1lc3NhZ2VGb3JtYXR0ZXJzLnB1dChjb250ZW50VHlwZSwgbWVzc2FnZUZvcm1hdHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIGF2YWlsYWJsZSBNb2R1bGUgdG8gdGhpcyBjb25maWd1cmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlIGFuIEF4aXNNb2R1bGUKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpbiBjYXNlIG9mIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkTW9kdWxlKEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbW9kdWxlLnNldFBhcmVudCh0aGlzKTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBtb2R1bGUgdmVyc2lvbiBwYXJhbXRlciBpcyB0aGVyZSAsIGlmIHNvIHNldCB0aGUgbW9kdWxlIHZlcnNpb24gYXMgdGhhdAotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtZXRlciA9IG1vZHVsZS5nZXRQYXJhbWV0ZXIob3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuTU9EVUxFX1ZFUlNJT04pOwotICAgICAgICBpZiAodmVyc2lvblBhcmFtZXRlciAhPW51bGwgKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIHZlcnNpb25QYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlLnNldFZlcnNpb24obmV3IFZlcnNpb24odmVyc2lvbikpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgdmVyc2lvbiBudW1iZXIgJyIgKyB2ZXJzaW9uICsgIicgc3BlY2lmaWVkIGJ5IHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLk1PRFVMRV9WRVJTSU9OICsgIiBwYXJhbWV0ZXIgaXMgaW52YWxpZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYWxsTW9kdWxlcy5wdXQobW9kdWxlLmdldEFyY2hpdmVOYW1lKCksIG1vZHVsZSk7Ci0gICAgICAgIG5vdGlmeU9ic2VydmVycyhBeGlzRXZlbnQuTU9EVUxFX0RFUExPWSwgbW9kdWxlKTsKLQotICAgICAgICAvLyBSZWdpc3RlcmluZyB0aGUgcG9saWN5IG5hbWVzcGFjZXMgdGhhdCB0aGUgbW9kdWxlIHVuZGVyc3RhbmQKLSAgICAgICAgcmVnaXN0ZXJNb2R1bGVQb2xpY3lTdXBwb3J0KG1vZHVsZSk7Ci0gICAgICAgIC8vIFJlZ2lzdGVyaW5nIHRoZSBwb2xpY3kgYXNzZXJ0aW9ucyB0aGF0IGFyZSBsb2NhbCB0byB0aGUgc3lzdGVtCi0gICAgICAgIHJlZ2lzdGVyTG9jYWxQb2xpY3lBc3NlcnRpb25zKG1vZHVsZSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lNb2R1bGUoU3RyaW5nIG1vZHVsZUZpbGVOYW1lKSB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgbW9kdWxlRmlsZSA9IG5ldyBGaWxlKG1vZHVsZUZpbGVOYW1lKTsKLSAgICAgICAgaWYgKCFtb2R1bGVGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigiTW9kdWxlIGFyY2hpdmUgJyIgKyBtb2R1bGVGaWxlTmFtZSArICInIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgfQotICAgICAgICBEZXBsb3ltZW50RmlsZURhdGEgZGZkID0gbmV3IERlcGxveW1lbnRGaWxlRGF0YShtb2R1bGVGaWxlLCBuZXcgTW9kdWxlRGVwbG95ZXIodGhpcykpOwotICAgICAgICBkZmQuZGVwbG95KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gcmVtb3ZlIGEgZ2l2ZW4gbW9kdWxlIGZyb20gdGhlIHN5c3RlbQotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZSBuYW1lIG9mIG1vZHVsZSB0byByZW1vdmUKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNyZW1vdmVNb2R1bGUoU3RyaW5nLFN0cmluZyl9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlKFN0cmluZyBtb2R1bGUpIHsKLSAgICAgICAgYWxsTW9kdWxlcy5yZW1vdmUobW9kdWxlKTsKLSAgICAgICAgLy8gVE9ETyBkaXNlbmdhZ2UgaGFzIHRvIGJlIGRvbmUgaGVyZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIG1vZHVsZSB3aXRoIG1vZHVsZU5hbWUgJiBtb2R1bGVWZXJzaW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZQotICAgICAqIEBwYXJhbSBtb2R1bGVWZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlKFN0cmluZyBtb2R1bGVOYW1lLCBTdHJpbmcgbW9kdWxlVmVyc2lvbikgewotICAgICAgICBhbGxNb2R1bGVzLnJlbW92ZShVdGlscy5nZXRNb2R1bGVOYW1lKG1vZHVsZU5hbWUsIG1vZHVsZVZlcnNpb24pKTsKLSAgICAgICAgLy8gVE9ETyBkaXNlbmdhZ2UgaGFzIHRvIGJlIGRvbmUgaGVyZQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIG1vZHVsZSB3aXRoIG1vZHVsZU5hbWUgJiBtb2R1bGVWZXJzaW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHJlbW92ZQotICAgICAqIEBwYXJhbSBtb2R1bGVWZXJzaW9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlKFN0cmluZyBtb2R1bGVOYW1lLCBWZXJzaW9uIG1vZHVsZVZlcnNpb24pIHsKLSAgICAgICAgcmVtb3ZlTW9kdWxlKG1vZHVsZU5hbWUsIG1vZHVsZVZlcnNpb24udG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBtb2R1bGUgY29uZmlndXJhdGlvbiwgaWYgdGhlcmUgaXMgYSBtb2R1bGVDb25maWcgdGFnIGluIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlQ29uZmlndXJhdGlvbiBhIE1vZHVsZUNvbmZpZ3VyYXRpb24gdG8gcmVtZW1iZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRNb2R1bGVDb25maWcoTW9kdWxlQ29uZmlndXJhdGlvbiBtb2R1bGVDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIG1vZHVsZUNvbmZpZ21hcC5wdXQobW9kdWxlQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQ29uZmlndXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkT2JzZXJ2ZXJzKEF4aXNPYnNlcnZlciBheGlzT2JzZXJ2ZXIpIHsKLSAgICAgICAgb2JzZXJ2ZXJzTGlzdC5hZGQoYXhpc09ic2VydmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkU2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2VydmljZShBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKHNlcnZpY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5zZXRQYXJlbnQodGhpcyk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgYWRkU2VydmljZUdyb3VwKGF4aXNTZXJ2aWNlR3JvdXApOwotLy8gICAgICAgIHByb2Nlc3NFbmRwb2ludHMoc2VydmljZSwgc2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkU2VydmljZUdyb3VwKEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBheGlzU2VydmljZUdyb3VwLnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKEF4aXNFdmVudC5TRVJWSUNFX0RFUExPWSwgYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotCi0gICAgICAgIEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPiBzZXJ2aWNlcyA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgd2hpbGUgKHNlcnZpY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChheGlzU2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKEphdmEyV1NETENvbnN0YW50cy5BWElTMl9YU0QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlcnZpY2VzID0gYXhpc1NlcnZpY2VHcm91cC5nZXRTZXJ2aWNlcygpOwotICAgICAgICB3aGlsZSAoc2VydmljZXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlLmlzVXNlRGVmYXVsdENoYWlucygpKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8QXhpc09wZXJhdGlvbj4gb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHBoYXNlc2luZm8uc2V0T3BlcmF0aW9uUGhhc2VzKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yPEF4aXNNb2R1bGU+IGVuTW9kdWxlID0gZ2V0RW5nYWdlZE1vZHVsZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZW5Nb2R1bGUuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZUdyb3VwLmVuZ2FnZU1vZHVsZSgoQXhpc01vZHVsZSkgZW5Nb2R1bGUubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlcyA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPiBzZXJ2aWNlc0lBZGRlZCA9IG5ldyBBcnJheUxpc3Q8QXhpc1NlcnZpY2U+KCk7Ci0gICAgICAgIHdoaWxlIChzZXJ2aWNlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5uZXh0KCk7Ci0gICAgICAgICAgICBwcm9jZXNzRW5kcG9pbnRzKGF4aXNTZXJ2aWNlLCBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgQXhpc0VuZHBvaW50PiBlbmRwb2ludHMgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKTsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYWRkVG9BbGxTZXJ2aWNlc01hcChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2hvb3BzLCBtdXN0IGhhdmUgYmVlbiBhIGR1cGxpY2F0ZSEgIElmIHdlIGhhZCBhIHByb2JsZW0gaGVyZSwgd2UgaGF2ZSB0bwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIG9uZXMgd2UgYWRkZWQuLi4KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPiBpID0gc2VydmljZXNJQWRkZWQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhbGxTZXJ2aWNlcy5yZW1vdmUoc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBBbmQgdG9zcyB0aGlzIGluIGNhc2UgYW55b25lIHdhbnRzIGl0PwotICAgICAgICAgICAgICAgIHRocm93IGF4aXNGYXVsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VzSUFkZGVkLmFkZChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBpZiAoZW5kcG9pbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGVuZHBvaW50TmFtZUl0ZXIgPSBlbmRwb2ludHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZW5kcG9pbnROYW1lSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50TmFtZSA9IChTdHJpbmcpIGVuZHBvaW50TmFtZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIHNlcnZpY2UgdG8gYWxsRW5kcG9pbnRzIG1hcDogKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VOYW1lICsgIiwiICsgZW5kcG9pbnROYW1lICsgIikgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhbGxFbmRwb2ludHMucHV0KHNlcnZpY2VOYW1lICsgIi4iICsgZW5kcG9pbnROYW1lLCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFmdGVyIGFkZGluZyB0byBhbGxFbmRwb2ludHMgbWFwLCBzaXplIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWxsRW5kcG9pbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWF4aXNTZXJ2aWNlLmlzQ2xpZW50U2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKEF4aXNFdmVudC5TRVJWSUNFX0RFUExPWSwgYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIHNlcnZpY2VHcm91cHMucHV0KGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpLAotICAgICAgICAvLyBheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgYWRkQ2hpbGQoYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9BbGxTZXJ2aWNlc01hcChBeGlzU2VydmljZSBheGlzU2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugb2xkU2VydmljZSA9IChBeGlzU2VydmljZSkgYWxsU2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKG9sZFNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgc2VydmljZSB0byBhbGxTZXJ2aWNlcyBtYXA6IFsiICsgc2VydmljZU5hbWUgKyAiXSAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFsbFNlcnZpY2VzLnB1dChzZXJ2aWNlTmFtZSwgYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJBZnRlciBhZGRpbmcgdG8gYWxsU2VydmljZXMgbWFwLCBzaXplIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhbGxTZXJ2aWNlcy5zaXplKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uKCJBeGlzQ29uZmlndXJhdGlvbi5hZGRUb0FsbFNlcnZpY2VzTWFwIGNhbGxlZCBmcm9tIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIGFscmVhZHkgdGhlcmUsIHRoYXQncyBmaW5lLiAgSWYgbm90LCBmYXVsdCEKLSAgICAgICAgICAgIGlmIChvbGRTZXJ2aWNlICE9IGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0d29zZXJ2aWNlY2Fubm90aGF2ZXNhbWVuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCByZW1vdmVTZXJ2aWNlR3JvdXAoU3RyaW5nIHNlcnZpY2VHcm91cE5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgZ2V0Q2hpbGQoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIGlmIChheGlzU2VydmljZUdyb3VwID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaW52YWxpZHNlcnZpY2Vncm91cG5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yPEF4aXNTZXJ2aWNlPiBzZXJ2aWNlcyA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgYm9vbGVhbiBpc0NsaWVudFNpZGUgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKHNlcnZpY2VzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLm5leHQoKTsKLSAgICAgICAgICAgIGFsbFNlcnZpY2VzLnJlbW92ZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKCFheGlzU2VydmljZS5pc0NsaWVudFNpZGUoKSkgewotICAgICAgICAgICAgICAgIG5vdGlmeU9ic2VydmVycyhBeGlzRXZlbnQuU0VSVklDRV9SRU1PVkUsIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNDbGllbnRTaWRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9yZW1vdmVzIHRoZSBlbmRwb2ludHMgdG8gdGhpcyBzZXJ2aWNlCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBheGlzU2VydmljZS5nZXRFbmRwb2ludHMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgIGtleSA9IHNlcnZpY2VOYW1lICsgIi4iICsgKFN0cmluZylpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB0aGlzLmFsbEVuZHBvaW50cy5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZUNoaWxkKHNlcnZpY2VHcm91cE5hbWUpOwotICAgICAgICBpZiAoIWlzQ2xpZW50U2lkZSkgewotICAgICAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKEF4aXNFdmVudC5TRVJWSUNFX1JFTU9WRSwgYXhpc1NlcnZpY2VHcm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2VHcm91cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkVHJhbnNwb3J0SW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHJhbnNwb3J0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc3BvcnRJbihUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnQuZ2V0UmVjZWl2ZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0IFJlY2VpdmVyIGNhbiBub3QgYmUgbnVsbCBmb3IgdGhlIHRyYW5zcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICsgdHJhbnNwb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJhbnNwb3J0c0luLnB1dCh0cmFuc3BvcnQuZ2V0TmFtZSgpLCB0cmFuc3BvcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBhZGRUcmFuc3BvcnRPdXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHJhbnNwb3J0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUcmFuc3BvcnRPdXQoVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnQuZ2V0U2VuZGVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydCBzZW5kZXIgY2FuIG5vdCBiZSBudWxsIGZvciB0aGUgdHJhbnNwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgKyB0cmFuc3BvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cmFuc3BvcnRzT3V0LnB1dCh0cmFuc3BvcnQuZ2V0TmFtZSgpLCB0cmFuc3BvcnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuZ2FnZXMgdGhlIGRlZmF1bHQgbW9kdWxlIHZlcnNpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUsCi0gICAgICogb3IgaWYgdGhlIG1vZHVsZSBuYW1lIGNvbnRhaW5zIHZlcnNpb24gbnVtYmVyIGluIGl0IHRoZW4gaXQgd2lsbCBlbmdhZ2UKLSAgICAgKiB0aGUgY29ycmVjdCBtb2R1bGUuIEJvdGggdGhlIGJlbG93IGNhc2VzIGFyZSB2YWxpZCA6IC0KLSAgICAgKiAxLiBlbmdhZ2VNb2R1bGUoImFkZHJlc3NpbmciKTsgMi4gZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nLTEuMjMiKTsKLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVyZWYgUU5hbWUgb2YgbW9kdWxlIHRvIGVuZ2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSB0aGUgU3RyaW5nIHZlcnNpb24gaW5zdGVhZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU1vZHVsZShRTmFtZSBtb2R1bGVyZWYpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBlbmdhZ2VNb2R1bGUobW9kdWxlcmVmLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmdhZ2VzIHRoZSBkZWZhdWx0IG1vZHVsZSB2ZXJzaW9uIGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gbW9kdWxlIG5hbWUgLAotICAgICAqIG9yIGlmIHRoZSBtb2R1bGUgbmFtZSBjb250YWlucyB2ZXJzaW9uIG51bWJlciBpbiBpdCB0aGVuIGl0IHdpbGwgZW5nYWdlCi0gICAgICogdGhlIGNvcnJlY3QgbW9kdWxlLiBCb3RoIG9mIHRoZSBiZWxvdyB0d28gY2FzZXMgYXJlIHZhbGlkIDEuCi0gICAgICogZW5nYWdlTW9kdWxlKCJhZGRyZXNzaW5nIik7IDIuIGVuZ2FnZU1vZHVsZSgiYWRkcmVzc2luZy0xLjIzIik7Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlcmVmIG5hbWUgb2YgbW9kdWxlIHRvIGVuZ2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKFN0cmluZyBtb2R1bGVyZWYpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShtb2R1bGVyZWYpOwotICAgICAgICBpZiAobW9kdWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtb2R1bGVub3RhdmFpbGJsZSIsIG1vZHVsZXJlZikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5nYWdlcyBhIG1vZHVsZSB1c2luZyBnaXZlbiBuYW1lIGFuZCBpdHMgdmVyc2lvbiBJRC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb2R1bGVOYW1lCi0gICAgICogQHBhcmFtIHZlcnNpb25JRAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlKFN0cmluZyBtb2R1bGVOYW1lLCBTdHJpbmcgdmVyc2lvbklEKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxOYW1lID0gVXRpbHMuZ2V0TW9kdWxlTmFtZShtb2R1bGVOYW1lLCB2ZXJzaW9uSUQpOwotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShhY3R1YWxOYW1lKTsKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVmZXJ0b2ludmFsaWRtb2R1bGUiKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkVuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSwgQXhpc0Rlc2NyaXB0aW9uIGVuZ2FnZXIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBJdGVyYXRvcjxBeGlzU2VydmljZUdyb3VwPiBzZXJ2aWNlZ3JvdXBzID0gZ2V0U2VydmljZUdyb3VwcygpOwotICAgICAgICB3aGlsZSAoc2VydmljZWdyb3Vwcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gKEF4aXNTZXJ2aWNlR3JvdXApIHNlcnZpY2Vncm91cHMubmV4dCgpOwotICAgICAgICAgICAgc2VydmljZUdyb3VwLmVuZ2FnZU1vZHVsZShtb2R1bGUsIGVuZ2FnZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gZGlzLWVuZ2FnZSBhIG1vZHVsZSBmcm9tIHRoZSBzeXN0ZW0uIFRoaXMgd2lsbCByZW1vdmUgYWxsIHRoZSBoYW5kbGVycwotICAgICAqIGJlbG9uZ2luZyB0byB0aGlzIG1vZHVsZSBmcm9tIGFsbCB0aGUgaGFuZGxlciBjaGFpbnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlIG1vZHVsZSB0byBkaXNlbmdhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRpc2VuZ2FnZShBeGlzTW9kdWxlIG1vZHVsZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFBoYXNlUmVzb2x2ZXIgcGhhc2VSZXNvbHZlciA9IG5ldyBQaGFzZVJlc29sdmVyKHRoaXMpOwotICAgICAgICBwaGFzZVJlc29sdmVyLmRpc2VuZ2FnZU1vZHVsZUZyb21HbG9iYWxDaGFpbnMobW9kdWxlKTsKLQotICAgICAgICBJdGVyYXRvcjxBeGlzU2VydmljZUdyb3VwPiBzZXJ2aWNlR3JvdXBzID0gZ2V0U2VydmljZUdyb3VwcygpOwotICAgICAgICB3aGlsZSAoc2VydmljZUdyb3Vwcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IChBeGlzU2VydmljZUdyb3VwKSBzZXJ2aWNlR3JvdXBzLm5leHQoKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlPYnNlcnZlcnMoaW50IGV2ZW50X3R5cGUsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgQXhpc0V2ZW50IGV2ZW50ID0gbmV3IEF4aXNFdmVudChldmVudF90eXBlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9ic2VydmVyc0xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEF4aXNPYnNlcnZlciBheGlzT2JzZXJ2ZXIgPSAoQXhpc09ic2VydmVyKSBvYnNlcnZlcnNMaXN0LmdldChpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIXNlcnZpY2UuaXNDbGllbnRTaWRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc09ic2VydmVyLnNlcnZpY2VVcGRhdGUoZXZlbnQsIHNlcnZpY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzdG9wIHRoZSBzeXN0ZW0gZHVlIHRvIHRoaXMsIHNvIGxvZyBhbmQgaWdub3JlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5T2JzZXJ2ZXJzKGludCBldmVudF90eXBlLCBBeGlzTW9kdWxlIG1vdWxlKSB7Ci0gICAgICAgIEF4aXNFdmVudCBldmVudCA9IG5ldyBBeGlzRXZlbnQoZXZlbnRfdHlwZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYnNlcnZlcnNMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBeGlzT2JzZXJ2ZXIgYXhpc09ic2VydmVyID0gKEF4aXNPYnNlcnZlcikgb2JzZXJ2ZXJzTGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc09ic2VydmVyLm1vZHVsZVVwZGF0ZShldmVudCwgbW91bGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHN0b3AgdGhlIHN5c3RlbSBkdWUgdG8gdGhpcywgc28gbG9nIGFuZCBpZ25vcmUKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlPYnNlcnZlcnMoaW50IGV2ZW50X3R5cGUsIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7Ci0gICAgICAgIEF4aXNFdmVudCBldmVudCA9IG5ldyBBeGlzRXZlbnQoZXZlbnRfdHlwZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYnNlcnZlcnNMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBeGlzT2JzZXJ2ZXIgYXhpc09ic2VydmVyID0gKEF4aXNPYnNlcnZlcikgb2JzZXJ2ZXJzTGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc09ic2VydmVyLnNlcnZpY2VHcm91cFVwZGF0ZShldmVudCwgc2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzdG9wIHRoZSBzeXN0ZW0gZHVlIHRvIHRoaXMsIHNvIGxvZyBhbmQgaWdub3JlCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHJlbW92ZVNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVNlcnZpY2UoU3RyaW5nIG5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBhbGxTZXJ2aWNlcy5yZW1vdmUobmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gc2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgICAgICBzZXJ2aWNlR3JvdXAucmVtb3ZlU2VydmljZShuYW1lKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlcmVtb3ZlZCIsIG5hbWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbiBBeGlzTW9kdWxlIHRvIHRoZSBsaXN0IG9mIGdsb2JhbGx5IGRlcGxveWVkIG1vZHVsZXMuCi0gICAgICogPHAvPgotICAgICAqIFRPRE86IHNob3VsZCB0aGlzIGNoZWNrIGZvciBkdXBsaWNhdGUgbmFtZXM/Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBuYW1lIG9mIEF4aXNNb2R1bGUgdG8gYWRkIHRvIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkR2xvYmFsTW9kdWxlUmVmKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIGdsb2JhbE1vZHVsZUxpc3QuYWRkKG1vZHVsZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEVuZ2FnZSBhbGwgdGhlIHByZXZpb3VzbHkgYWRkZWQgZ2xvYmFsIG1vZHVsZXMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhbiBpbmRpdmlkdWFsIGVuZ2FnZU1vZHVsZSgpIGZhaWxzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5nYWdlR2xvYmFsTW9kdWxlcygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaSA9IGdsb2JhbE1vZHVsZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbmdhZ2VNb2R1bGUoKFN0cmluZykgaS5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0RmF1bHR5TW9kdWxlcygpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0eU1vZHVsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0RmF1bHR5U2VydmljZXMoKSB7Ci0gICAgICAgIHJldHVybiBmYXVsdHlTZXJ2aWNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVGYXVsdHlTZXJ2aWNlKFN0cmluZyBrZXkpIHsKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdHIgPSBmYXVsdHlTZXJ2aWNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGZ1bGxGaWxlTmFtZSA9IChTdHJpbmcpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZnVsbEZpbGVOYW1lLmluZGV4T2Yoa2V5KSA+IDApIHsKLSAgICAgICAgICAgICAgICBmYXVsdHlTZXJ2aWNlcy5yZW1vdmUoZnVsbEZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0byBnZXQgdGhlIG91dCBmbG93IGNvcnJlcG9kbmluZyB0byB0aGUgZ2xvYmFsIG91dCBmbG93OwotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRPdXRGbG93UGhhc2VzKCkgewotICAgICAgICByZXR1cm4gdGhpcy5vdXRQaGFzZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEFycmF5TGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQaGFzZT4gZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbkZhdWx0UGhhc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRJbkZsb3dQaGFzZXMoKSB7Ci0gICAgICAgIHJldHVybiBpblBoYXNlc1VwdG9BbmRJbmNsdWRpbmdQb3N0RGlzcGF0Y2g7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VSZWNlaXZlciBnZXRNZXNzYWdlUmVjZWl2ZXIoU3RyaW5nIG1lcFVSTCkgewotICAgICAgICByZXR1cm4gKE1lc3NhZ2VSZWNlaXZlcikgbWVzc2FnZVJlY2VpdmVycy5nZXQobWVwVVJMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY29udGVudFR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIG1lc3NhZ2UgYnVpbGRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lIGFnYWluc3QKLSAgICAgKiAgICAgICAgIHRoZSBnaXZlbiBjb250ZW50IHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkZXIgZ2V0TWVzc2FnZUJ1aWxkZXIoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIGlmIChtZXNzYWdlQnVpbGRlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVpbGRlciA9IChCdWlsZGVyKSBtZXNzYWdlQnVpbGRlcnMuZ2V0KGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyID0gKEJ1aWxkZXIpIG1lc3NhZ2VCdWlsZGVycy5nZXQoY29udGVudFR5cGUudG9Mb3dlckNhc2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBCdWlsZGVyPj4gaXRlcmF0b3IgPSBtZXNzYWdlQnVpbGRlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVudHJ5PFN0cmluZywgQnVpbGRlcj4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlLm1hdGNoZXMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXIgZ2V0TWVzc2FnZUJ1aWxkZXIoU3RyaW5nIGNvbnRlbnRUeXBlLCBib29sZWFuIGRlZmF1bHRCdWlsZGVyKSB7Ci0gICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IGdldE1lc3NhZ2VCdWlsZGVyKGNvbnRlbnRUeXBlKTsKLSAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCAmJiBkZWZhdWx0QnVpbGRlcil7Ci0gICAgICAgICAgICBidWlsZGVyID0gbmV3IFVua25vd25Db250ZW50QnVpbGRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQotICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyZWQgbWVzc2FnZSBmb3JtYXR0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZQotICAgICAqICAgICAgICAgYWdhaW5zdCB0aGUgZ2l2ZW4gY29udGVudCB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRm9ybWF0dGVyIGdldE1lc3NhZ2VGb3JtYXR0ZXIoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIHJldHVybiAoTWVzc2FnZUZvcm1hdHRlcikgbWVzc2FnZUZvcm1hdHRlcnMuZ2V0KGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLS8vICAgIC8qKgotLy8gICAgICoKLS8vICAgICAqIEBkZXByZWNhdGUgUGxlYXNlIHVzZSBTdHJpbmcgdmVyc2lvbiBpbnN0ZWFkCi0vLyAgICAgKiBAcGFyYW0gcW5hbWUKLS8vICAgICAqIEByZXR1cm4KLS8vICAgICAqLwotLy8gICAgcHVibGljIEF4aXNNb2R1bGUgZ2V0TW9kdWxlKFFOYW1lIHFuYW1lKSB7Ci0vLyAgICAgICAgcmV0dXJuIGdldE1vZHVsZShxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0vLyAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0TW9kdWxlLiBGaXJzdCBpdCB3aWxsIGNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG1vZHVsZSBpcyB0aGVyZQotICAgICAqIGluIHRoZSBoYXNoTWFwLCBpZiBzbyByZXR1cm5zIHRoYXQgYW5kIHRoZSBuYW1lLCB3aGljaCBjYW4gYmUgZWl0aGVyIHdpdGgKLSAgICAgKiB2ZXJzaW9uIHN0cmluZyBvciB3aXRob3V0IHZlcnNpb24gc3RyaW5nLiA8cC8+IElmIGl0cyBub3QgZm91bmQgYW5kIHRoZQotICAgICAqIG5hbWUgZG9lcyBub3QgY29udGFpbiB0aGUgdmVyc2lvbiBzdHJpbmcgaW4gaXQgdGhlbiBjaGVja3Mgd2hldGhlciB0aGUgZGVmYXVsdAotICAgICAqIHZlcnNpb24gb2YgdGhlIG1vZHVsZSBpcyBhdmFpbGFibGUgaW4gdGhlIHN5dGVtIGZvciB0aGUgZ2l2ZW4gbmFtZSwgdGhlbiByZXR1cm5zCi0gICAgICogdGhhdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIE1vZHVsZURlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgbmFtZSkgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IChBeGlzTW9kdWxlKSBhbGxNb2R1bGVzLmdldChuYW1lKTsKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbW9kdWxlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrcyB3aGV0aGVyIHRoZSB2ZXJzaW9uIHN0cmluZyBzZXBlcmF0b3IgaXMgbm90IHRoZXJlIGluIHRoZQotICAgICAgICAvLyBtb2R1bGUgbmFtZQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IG5hbWU7Ci0gICAgICAgIFN0cmluZyBkZWZhdWx0TW9kdWxlVmVyc2lvbiA9IGdldERlZmF1bHRNb2R1bGVWZXJzaW9uKG1vZHVsZU5hbWUpOwotICAgICAgICBpZiAoZGVmYXVsdE1vZHVsZVZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kdWxlID0KLSAgICAgICAgICAgICAgICAgICAgKEF4aXNNb2R1bGUpIGFsbE1vZHVsZXMuZ2V0KFV0aWxzLmdldE1vZHVsZU5hbWUobW9kdWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE1vZHVsZVZlcnNpb24pKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBtb2R1bGUgaGF2aW5nIG5hbWU9bW9kdWxlTmFtZSAmIHZlcnNpb249bW9kdWxlVmVyc2lvbgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZU5hbWUgICAgVGhlIG1vZHVsZSBuYW1lCi0gICAgICogQHBhcmFtIG1vZHVsZVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIG1vZHVsZQotICAgICAqIEByZXR1cm4gVGhlIEF4aXNNb2R1bGUgaGF2aW5nIG5hbWU9bW9kdWxlTmFtZSAmIHZlcnNpb249bW9kdWxlVmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBBeGlzTW9kdWxlIGdldE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSwgU3RyaW5nIG1vZHVsZVZlcnNpb24pIHsKLSAgICAgICAgaWYgKG1vZHVsZVZlcnNpb24gPT0gbnVsbCB8fCBtb2R1bGVWZXJzaW9uLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGVWZXJzaW9uID0gZ2V0RGVmYXVsdE1vZHVsZVZlcnNpb24obW9kdWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBeGlzTW9kdWxlKSBhbGxNb2R1bGVzLmdldChVdGlscy5nZXRNb2R1bGVOYW1lKG1vZHVsZU5hbWUsIG1vZHVsZVZlcnNpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3MgbG9hZGVyIHRoYXQgYmVjb21lcyB0aGUgcGFyZW50IG9mIGFsbCB0aGUgbW9kdWxlcwotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRNb2R1bGVDbGFzc0xvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlQ2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZUNvbmZpZ3VyYXRpb24gZ2V0TW9kdWxlQ29uZmlnKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiAoTW9kdWxlQ29uZmlndXJhdGlvbikgbW9kdWxlQ29uZmlnbWFwLmdldChtb2R1bGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgSGFzaE1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIEF4aXNNb2R1bGU+IGdldE1vZHVsZXMoKSB7Ci0gICAgICAgIHJldHVybiBhbGxNb2R1bGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIGxpc3Qgb2YgdGhlIGdsb2JhbCBtb2R1bGVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBnbG9iYWwgbW9kdWxlIGxpc3QuICBCRSBDQVJFRlVMLCB0aGlzIGxpc3QgaXMgbXV0YWJsZS4KLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIGFkZEdsb2JhbE1vZHVsZSgpCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHbG9iYWxNb2R1bGVzKCkgewotICAgICAgICByZXR1cm4gZ2xvYmFsTW9kdWxlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgQXJyYXlMaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBoYXNlPiBnZXRPdXRGYXVsdEZsb3dQaGFzZXMoKSB7Ci0gICAgICAgIHJldHVybiBvdXRGYXVsdFBoYXNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2VzSW5mbyBnZXRQaGFzZXNJbmZvKCkgewotICAgICAgICByZXR1cm4gcGhhc2VzaW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVVJMIGdldFJlcG9zaXRvcnkoKSB7Ci0gICAgICAgIHJldHVybiBheGlzMlJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBBeGlzU2VydmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0U2VydmljZShTdHJpbmcgbmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBhbGxTZXJ2aWNlcy5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoInNlcnZpY2VpbmFjdGl2ZSIsIG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBhbGxFbmRwb2ludHMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzZXJ2aWNlaW5hY3RpdmUiLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcnZpY2UgY2FuIHN0YXJ0IGFuZCBzdG9wLCBvbmNlIHN0b3BwZWQgaXQgY2Fubm90IGJlIGFjY2Vzc2VkLCBzbyB3ZQotICAgICAqIG5lZWQgYSB3YXkgdG8gZ2V0IHRoZSBzZXJ2aWNlIGV2ZW4gaWYgc2VydmljZSBpcyBub3QgYWN0aXZlLgotICAgICAqCi0gICAgICogQHJldHVybiBBeGlzU2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzU2VydmljZSBnZXRTZXJ2aWNlRm9yQWN0aXZhdGlvbihTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBudWxsOwotICAgICAgICBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgYWxsU2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBhbGxFbmRwb2ludHMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBheGlzU2VydmljZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSBjbGFzcyBsb2FkZXIgdGhhdCBiZWNvbWVzIHRoZSBwYXJlbnQgb2YgYWxsIHRoZSBzZXJ2aWNlcwotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRTZXJ2aWNlQ2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VDbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2VHcm91cCBnZXRTZXJ2aWNlR3JvdXAoU3RyaW5nIHNlcnZpY2VOYW1lQW5kR3JvdXBTdHJpbmcpIHsKLSAgICAgICAgLy8gcmV0dXJuIChBeGlzU2VydmljZUdyb3VwKQotICAgICAgICAvLyBzZXJ2aWNlR3JvdXBzLmdldChzZXJ2aWNlTmFtZUFuZEdyb3VwU3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIChBeGlzU2VydmljZUdyb3VwKSBnZXRDaGlsZChzZXJ2aWNlTmFtZUFuZEdyb3VwU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3I8QXhpc1NlcnZpY2VHcm91cD4gZ2V0U2VydmljZUdyb3VwcygpIHsKLSAgICAgICAgLy8gcmV0dXJuIHNlcnZpY2VHcm91cHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuIChJdGVyYXRvcjxBeGlzU2VydmljZUdyb3VwPikgZ2V0Q2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICAvLyBUbyBnZXQgYWxsIHRoZSBzZXJ2aWNlcyBpbiB0aGUgc3lzdGVtCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBBeGlzU2VydmljZT4gZ2V0U2VydmljZXMoKSB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBBeGlzU2VydmljZT4gaGFzaE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXhpc1NlcnZpY2U+KHRoaXMuYWxsU2VydmljZXMuc2l6ZSgpKTsKLSAgICAgICAgU3RyaW5nIGtleTsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSB0aGlzLmFsbFNlcnZpY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyl7Ci0gICAgICAgICAgICBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGhhc2hNYXAucHV0KGtleSwgdGhpcy5hbGxTZXJ2aWNlcy5nZXQoa2V5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhc2hNYXA7Ci0gICAgfQotCi0gICAgLy8gVGhlIGNsYXNzIGxvYWRlciB3aGljaCBiZWNvbWUgdGhlIHRvcCBtb3N0IHBhcmVudCBvZiBhbGwgdGhlIG1vZHVsZXMgYW5kCi0gICAgLy8gc2VydmljZXMKLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN5c3RlbUNsYXNzTG9hZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGdldFRyYW5zcG9ydEluKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbikgdHJhbnNwb3J0c0luLmdldChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gZ2V0VHJhbnNwb3J0T3V0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiAoVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24pIHRyYW5zcG9ydHNPdXQuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbj4gZ2V0VHJhbnNwb3J0c0luKCkgewotICAgICAgICByZXR1cm4gdHJhbnNwb3J0c0luOwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24+IGdldFRyYW5zcG9ydHNPdXQoKSB7Ci0gICAgICAgIHJldHVybiB0cmFuc3BvcnRzT3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIHJlbWFpbiBmb3IgYSBmZXcgQXhpczIgcmVsZWFzZXMgdG8gc3VwcG9ydAotICAgICAqIGxlZ2FjeSBhcHBzIHN0aWxsIHVzaW5nIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIHFuYW1lCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjaXNFbmdhZ2VkKFN0cmluZyl9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmdhZ2VkKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBpc0VuZ2FnZWQocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW5nYWdlZChTdHJpbmcgbW9kdWxlSWQpIHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUobW9kdWxlSWQpOwotICAgICAgICBpZiAobW9kdWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGlzRW5nYWdlZCA9IHN1cGVyLmlzRW5nYWdlZChtb2R1bGUpOwotICAgICAgICBpZiAoIWlzRW5nYWdlZCkgewotICAgICAgICAgICAgQXhpc01vZHVsZSBkZWZhdWx0TW9kdWxlID0gZ2V0RGVmYXVsdE1vZHVsZShtb2R1bGVJZCk7Ci0gICAgICAgICAgICBpc0VuZ2FnZWQgPSBlbmdhZ2VkTW9kdWxlcyAhPSBudWxsICYmIGVuZ2FnZWRNb2R1bGVzLnZhbHVlcygpLmNvbnRhaW5zKGRlZmF1bHRNb2R1bGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0VuZ2FnZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmdhZ2VkKEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgewotICAgICAgICBib29sZWFuIGlzRW5nYWdlZCA9IHN1cGVyLmlzRW5nYWdlZChheGlzTW9kdWxlKTsKLSAgICAgICAgaWYgKCFpc0VuZ2FnZWQpIHsKLSAgICAgICAgICAgIGlzRW5nYWdlZCA9IGVuZ2FnZWRNb2R1bGVzICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2FnZWRNb2R1bGVzLnZhbHVlcygpLmNvbnRhaW5zKGF4aXNNb2R1bGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0VuZ2FnZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2xvYmFsT3V0UGhhc2UoTGlzdDxQaGFzZT4gb3V0UGhhc2VzKSB7Ci0gICAgICAgIHRoaXMub3V0UGhhc2VzID0gb3V0UGhhc2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5GYXVsdFBoYXNlcyhMaXN0PFBoYXNlPiBsaXN0KSB7Ci0gICAgICAgIGluRmF1bHRQaGFzZXMgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaCgKLSAgICAJCUxpc3Q8UGhhc2U+IGluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaCkgewotICAgICAgICB0aGlzLmluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaCA9IGluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLm1vZHVsZUNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRGYXVsdFBoYXNlcyhMaXN0PFBoYXNlPiBsaXN0KSB7Ci0gICAgICAgIG91dEZhdWx0UGhhc2VzID0gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZXNJbmZvKFBoYXNlc0luZm8gcGhhc2VzSW5mbykgewotICAgICAgICB0aGlzLnBoYXNlc2luZm8gPSBwaGFzZXNJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcG9zaXRvcnkoVVJMIGF4aXMyUmVwb3NpdG9yeSkgewotICAgICAgICB0aGlzLmF4aXMyUmVwb3NpdG9yeSA9IGF4aXMyUmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1DbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzLnN5c3RlbUNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGRlZmF1bHQgbW9kdWxlIHZlcnNpb24sIHdoaWNoIGNhbiBiZSBkb25lIGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICogb3IgYnkgdXNpbmcgYXhpczIueG1sLiBUaGUgZGVmYXVsdCBtb2R1bGUgdmVyc2lvbiBpcyBpbXBvcnRhbnQgaWYgdXNlcgotICAgICAqIGFza3MgdG8gZW5nYWdlIGEgbW9kdWxlIHdpdGhvdXQgZ2l2ZW4gdmVyc2lvbiBJRCwgaW4gd2hpY2ggY2FzZSwKLSAgICAgKiB0aGUgZGVmYXVsdCB2ZXJzaW9uIGlzIGVuZ2FnZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlTmFtZQotICAgICAqIEBwYXJhbSBtb2R1bGVWZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGVmYXVsdE1vZHVsZVZlcnNpb24oU3RyaW5nIG1vZHVsZU5hbWUsIFN0cmluZyBtb2R1bGVWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChuYW1lVG92ZXJzaW9uTWFwLmdldChtb2R1bGVOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBuYW1lVG92ZXJzaW9uTWFwLnB1dChtb2R1bGVOYW1lLCBtb2R1bGVWZXJzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1vZHVsZVZlcnNpb24oU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIG5hbWVUb3ZlcnNpb25NYXAuZ2V0KG1vZHVsZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzTW9kdWxlIGdldERlZmF1bHRNb2R1bGUoU3RyaW5nIG1vZHVsZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2R1bGVWZXJzaW9uID0gZ2V0RGVmYXVsdE1vZHVsZVZlcnNpb24obW9kdWxlTmFtZSk7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kdWxlVmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF4aXNNb2R1bGUpIGFsbE1vZHVsZXMuZ2V0KG1vZHVsZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChBeGlzTW9kdWxlKSBhbGxNb2R1bGVzLmdldChtb2R1bGVOYW1lICsgIi0iICsgZGVmYXVsdE1vZHVsZVZlcnNpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIENsdXN0ZXJNYW5hZ2VyIGdldENsdXN0ZXJNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gY2x1c3Rlck1hbmFnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2x1c3Rlck1hbmFnZXIoQ2x1c3Rlck1hbmFnZXIgY2x1c3Rlck1hbmFnZXIpIHsKLSAgICAgICAgdGhpcy5jbHVzdGVyTWFuYWdlciA9IGNsdXN0ZXJNYW5hZ2VyOwotICAgIH0KLQotICAgICBwdWJsaWMgVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uIGdldFRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2FjdGlvbkNvbmZpZyhUcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24gdHJhbnNhY3Rpb25Db25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Db25maWd1cmF0aW9uID0gdHJhbnNhY3Rpb25Db25maWd1cmF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBhbGxTZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VuYW1lbm90dmFsaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZS5zZXRBY3RpdmUoZmFsc2UpOwotICAgICAgICBub3RpZnlPYnNlcnZlcnMoQXhpc0V2ZW50LlNFUlZJQ0VfU1RPUCwgc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGFsbFNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZW5hbWVub3R2YWxpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlLnNldEFjdGl2ZSh0cnVlKTsKLSAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKEF4aXNFdmVudC5TRVJWSUNFX1NUQVJULCBzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxBeGlzTW9kdWxlPiBnZXRNb2R1bGVzRm9yUG9saWN5TmFtZXNhcGNlKFN0cmluZyBuYW1lc2FwY2UpIHsKLSAgICAgICAgcmV0dXJuIHBvbGljeVN1cHBvcnRlZE1vZHVsZXMuZ2V0KG5hbWVzYXBjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJNb2R1bGVQb2xpY3lTdXBwb3J0KEF4aXNNb2R1bGUgYXhpc01vZHVsZSkgewotICAgICAgICBTdHJpbmdbXSBuYW1lc3BhY2VzID0gYXhpc01vZHVsZS5nZXRTdXBwb3J0ZWRQb2xpY3lOYW1lc3BhY2VzKCk7Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxBeGlzTW9kdWxlPiBtb2R1bGVzTGlzdDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIG1vZHVsZXNMaXN0ID0gcG9saWN5U3VwcG9ydGVkTW9kdWxlcy5nZXQobmFtZXNwYWNlc1tpXSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlc0xpc3QuYWRkKGF4aXNNb2R1bGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtb2R1bGVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXhpc01vZHVsZT4oKTsKLSAgICAgICAgICAgICAgICBtb2R1bGVzTGlzdC5hZGQoYXhpc01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgcG9saWN5U3VwcG9ydGVkTW9kdWxlcy5wdXQobmFtZXNwYWNlc1tpXSwgbW9kdWxlc0xpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMb2NhbFBvbGljeUFzc2VydGlvbnMoQXhpc01vZHVsZSBheGlzTW9kdWxlKSB7Ci0gICAgICAgIFFOYW1lW10gbG9jYWxQb2xpY3lBc3NlcnRpb25zID0gYXhpc01vZHVsZS5nZXRMb2NhbFBvbGljeUFzc2VydGlvbnMoKTsKLQotICAgICAgICBpZiAobG9jYWxQb2xpY3lBc3NlcnRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxQb2xpY3lBc3NlcnRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRMb2NhbFBvbGljeUFzc2VydGlvbihsb2NhbFBvbGljeUFzc2VydGlvbnNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdDxBeGlzT2JzZXJ2ZXI+IGdldE9ic2VydmVyc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBvYnNlcnZlcnNMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiBzdGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGFydChib29sZWFuIHN0YXJ0KSB7Ci0gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRUYXJnZXRSZXNvbHZlckNoYWluIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiBUYXJnZXRSZXNvbHZlciB3aGljaCBpdGVyYXRlcyBvdmVyIHRoZSByZWdpc3RlcmVkCi0gICAgICogVGFyZ2V0UmVzb2x2ZXJzLCBjYWxsaW5nIGVhY2ggb25lIGluIHR1cm4gd2hlbgotICAgICAqIHJlc29sdmVUYXJnZXQgaXMgY2FsbGVkLgotICAgICAqLwotICAgIHB1YmxpYyBUYXJnZXRSZXNvbHZlciBnZXRUYXJnZXRSZXNvbHZlckNoYWluKCkgewotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUYXJnZXQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxUYXJnZXRSZXNvbHZlcj4gaXRlciA9IHRhcmdldFJlc29sdmVycy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBUYXJnZXRSZXNvbHZlciB0ciA9IChUYXJnZXRSZXNvbHZlcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyLnJlc29sdmVUYXJnZXQobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUYXJnZXRSZXNvbHZlcihUYXJnZXRSZXNvbHZlciB0cikgewotICAgICAgICB0YXJnZXRSZXNvbHZlcnMuYWRkKHRyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbFBvbGljeUFzc2VydGlvbihRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHRoaXMubG9jYWxQb2xpY3lBc3NlcnRpb25zLmFkZChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxRTmFtZT4gZ2V0TG9jYWxQb2xpY3lBc3NlcnRpb25zKCkgewotICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFBvbGljeUFzc2VydGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxQb2xpY3lBc3NlcnRpb24oUU5hbWUgbmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsUG9saWN5QXNzZXJ0aW9ucy5yZW1vdmUobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3NlcnRpb25Mb2NhbChRTmFtZSBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxvY2FsUG9saWN5QXNzZXJ0aW9ucy5jb250YWlucyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvd3MgdG8gZGVmaW5lL2NvbmZpZ3VyZSBEYXRhIExvY2F0b3IgZm9yIHNwZWNpZmllZCBkaWFsZWN0IGF0IEF4aXMgMiBDb25maWd1cmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpYWxlY3QtICBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50cyB0aGUgZm9ybWF0IGFuZCB2ZXJzaW9uIG9mIGRhdGEKLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIC0gY2xhc3MgbmFtZSBvZiB0aGUgRGF0YSBMb2NhdG9yIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCByZXRyaWV2YWwKLSAgICAgKiAgICAgICAgICAgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGRpYWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRGF0YUxvY2F0b3JDbGFzc05hbWVzKFN0cmluZyBkaWFsZWN0LCBTdHJpbmcgY2xhc3NuYW1lKSB7Ci0gICAgICAgIGRhdGFMb2NhdG9yQ2xhc3NOYW1lcy5wdXQoZGlhbGVjdCwgY2xhc3NuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgaW50ZXJuYWwgdXNlZCBvbmx5ISBUbyBzdG9yZSBpbnN0YW5jZSBvZiBEYXRhTG9jYXRvciB3aGVuIGl0IGlzIGZpcnN0IGxvYWRlZC4gVGhpcyBhbGxvd3MgdG8KLSAgICAgKiByZXVzZSBvZiB0aGUgRGF0YUxvY2F0b3IgYWZ0ZXIgaXQgaXMgaW5pdGlhbGx5IGxvYWRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkaWFsZWN0LSAgICBhbiBhYnNvbHV0ZSBVUkkgcmVwcmVzZW50cyB0aGUgZm9ybWF0IGFuZCB2ZXJzaW9uIG9mIGRhdGEKLSAgICAgKiBAcGFyYW0gZGF0YUxvY2F0b3IgLSBzcGVjaWZpZWQgYW4gRGF0YUxvY2F0b3IgaW5zdGFuY2UgIHRvIHN1cHBvcnQgcmV0cmlldmFsCi0gICAgICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzcGVjaWZpZWQgZGlhbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGREYXRhTG9jYXRvcihTdHJpbmcgZGlhbGVjdCwgQXhpc0RhdGFMb2NhdG9yIGRhdGFMb2NhdG9yKSB7Ci0gICAgICAgIGRhdGFMb2NhdG9ycy5wdXQoZGlhbGVjdCwgZGF0YUxvY2F0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBEYXRhTG9jYXRvciBpbnN0YW5jZSBmb3Igc3BlY2lmaWVkIGRpYWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIEF4aXNEYXRhTG9jYXRvciBnZXREYXRhTG9jYXRvcihTdHJpbmcgZGlhbGVjdCkgewotICAgICAgICByZXR1cm4gKEF4aXNEYXRhTG9jYXRvcikgZGF0YUxvY2F0b3JzLmdldChkaWFsZWN0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJldHVybiBjbGFzc25hbWUgb2YgRGF0YUxvY2F0b3IgY29uZmlndXJlZCBmb3Igc3BlY2lmaWVkIGRpYWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREYXRhTG9jYXRvckNsYXNzTmFtZShTdHJpbmcgZGlhbGVjdCkgewotICAgICAgICByZXR1cm4gKFN0cmluZykgZGF0YUxvY2F0b3JDbGFzc05hbWVzLmdldChkaWFsZWN0KTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzeXN0ZW0gcHJlLWRlZmluZWQgcGhhc2VzCi0gICAgICogZm9yIGFsbCB0aGUgZmxvd3MsIGhhdmUgYmVlbiBjaGFuZ2VkLiBJZiB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkLCB0aHJvd3MgYSBEZXBsb3ltZW50RXhjZXB0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGVTeXN0ZW1QcmVkZWZpbmVkUGhhc2VzKCkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBQaGFzZXNJbmZvIHBoYXNlc0luZm8gPSBnZXRQaGFzZXNJbmZvKCk7Ci0gICAgICAgIHNldEluUGhhc2VzVXB0b0FuZEluY2x1ZGluZ1Bvc3REaXNwYXRjaChwaGFzZXNJbmZvLmdldEdsb2JhbEluZmxvdygpKTsKLSAgICAgICAgc2V0SW5GYXVsdFBoYXNlcyhwaGFzZXNJbmZvLmdldEdsb2JhbEluRmF1bHRQaGFzZXMoKSk7Ci0gICAgICAgIHNldEdsb2JhbE91dFBoYXNlKHBoYXNlc0luZm8uZ2V0R2xvYmFsT3V0UGhhc2VMaXN0KCkpOwotICAgICAgICBzZXRPdXRGYXVsdFBoYXNlcyhwaGFzZXNJbmZvLmdldE9VVF9GYXVsdFBoYXNlcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXhpc0NvbmZpZ3VyYXRvciBnZXRDb25maWd1cmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdG9yKEF4aXNDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIGlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlndXJhdG9yLmNsZWFudXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluc2VydCBhIHBoYXNlIGF0IHRoZSBydW50aW1lIGZvciBhIGdpdmVuIGxvY2F0aW9uCi0gICAgICogQW5kIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIGJ5IGJlZm9yZVBoYXNlIGFuZCBhZnRlclBoYXNlLiBQYXJhbWV0ZXJzCi0gICAgICogRWl0aGVyIG9yIGJvdGggb2YgdGhlbSBjYW4gYmUgbnVsbCAsIGlmIGJvdGggdGhlIHBhcmFtZXRlcnMgYXJlIG51bGwgdGhlbiB0aGUgcGhhc2UKLSAgICAgKiB3aWxsIGJlIGFkZGVkIHNvbWUgd2hlcmUgaW4gdGhlIGdsb2JhbCBwaGFzZS4gSWYgb25lIG9mIHRoZW0gYXJlIG51bGwgdGhlbiB0aGUgcGhhc2UKLSAgICAgKiB3aWxsIGJlIGFkZGVkCi0gICAgICogIC0gSWYgdGhlIGJlZm9yZVBoYXNlIGlzIG51bGwgdGhlbiB0aGUgcGhhc2Ugd2lsbCBiZSBhZGRlZCBhZnRlciB0aGUgYWZ0ZXJQaGFzZQotICAgICAqICAtIElmIHRoZSBhZnRlciBwaGFzZSBpcyBudWxsIHRoZW4gdGhlIHBoYXNlIHdpbGwgYmUgYWRkZWQgYmVmb3JlIHRoZSBiZWZvcmVQaGFzZQotICAgICAqIFR5cGUgb2YgdGhlIGZsb3cgd2lsbCBiZSBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtZXRlciBmbG93LgotICAgICAqICAgMSAtIEluZmxvdwotICAgICAqICAgMiAtIG91dCBmbG93Ci0gICAgICogICAzIC0gZmF1bHQgaW4gZmxvdwotICAgICAqICAgNCAtIGZhdWx0IG91dCBmbG93Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZCB0aGUgRGVwbG95YWJsZSByZXByZXNlbnRpbmcgdGhlIFBoYXNlIHRvIGRlcGxveQotICAgICAqIEBwYXJhbSBmbG93IHRoZSB0eXBlIG9mIHRoZSBmbG93Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCA6IElmIHNvbWV0aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zZXJ0UGhhc2UoRGVwbG95YWJsZSBkLCBpbnQgZmxvdykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgc3dpdGNoIChmbG93KSB7Ci0gICAgICAgICAgICBjYXNlIFBoYXNlTWV0YWRhdGEuSU5fRkxPVyA6IHsKLSAgICAgICAgICAgICAgICBMaXN0PFBoYXNlPiBwaGFzZUxpc3QgPSBwaGFzZXNpbmZvLmdldElOUGhhc2VzKCk7Ci0gICAgICAgICAgICAgICAgcGhhc2VMaXN0ID0gZmluZEFuZEluc2VydFBoYXNlKGQsIHBoYXNlTGlzdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBoYXNlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBoYXNlc2luZm8uc2V0SU5QaGFzZXMocGhhc2VMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBoYXNlTWV0YWRhdGEuT1VUX0ZMT1cgOiB7Ci0gICAgICAgICAgICAJTGlzdDxQaGFzZT4gcGhhc2VMaXN0ID0gcGhhc2VzaW5mby5nZXRPVVRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICBwaGFzZUxpc3QgPSBmaW5kQW5kSW5zZXJ0UGhhc2UoZCwgcGhhc2VMaXN0KTsKLSAgICAgICAgICAgICAgICBpZiAocGhhc2VMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhhc2VzaW5mby5zZXRPVVRQaGFzZXMocGhhc2VMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBoYXNlTWV0YWRhdGEuRkFVTFRfT1VUX0ZMT1cgOiB7Ci0gICAgICAgICAgICAJTGlzdDxQaGFzZT4gcGhhc2VMaXN0ID0gcGhhc2VzaW5mby5nZXRPdXRGYXVsdFBoYXNlTGlzdCgpOwotICAgICAgICAgICAgICAgIHBoYXNlTGlzdCA9IGZpbmRBbmRJbnNlcnRQaGFzZShkLCBwaGFzZUxpc3QpOwotICAgICAgICAgICAgICAgIGlmIChwaGFzZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwaGFzZXNpbmZvLnNldE9VVF9GYXVsdFBoYXNlcyhwaGFzZUxpc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhhc2VNZXRhZGF0YS5GQVVMVF9JTl9GTE9XIDogewotICAgICAgICAgICAgCUxpc3Q8UGhhc2U+IHBoYXNlTGlzdCA9IHBoYXNlc2luZm8uZ2V0SU5fRmF1bHRQaGFzZXMoKTsKLSAgICAgICAgICAgICAgICBwaGFzZUxpc3QgPSBmaW5kQW5kSW5zZXJ0UGhhc2UoZCwgcGhhc2VMaXN0KTsKLSAgICAgICAgICAgICAgICBpZiAocGhhc2VMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGhhc2VzaW5mby5zZXRJTl9GYXVsdFBoYXNlcyhwaGFzZUxpc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc2VydCBhIFBoYXNlCi0gICAgICogQHBhcmFtIGQKLSAgICAgKiBAcGFyYW0gcGhhc2VMaXN0Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFBoYXNlPiBmaW5kQW5kSW5zZXJ0UGhhc2UoRGVwbG95YWJsZSBkLCBMaXN0PFBoYXNlPiBwaGFzZUxpc3QpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBEZXBsb3lhYmxlQ2hhaW48UGhhc2U+IGVjID0gbmV3IERlcGxveWFibGVDaGFpbjxQaGFzZT4oKTsKLSAgICAgICAgU3RyaW5nIGxhc3QgPSBudWxsOwotICAgICAgICBmb3IgKEl0ZXJhdG9yPFBoYXNlPiBpID0gcGhhc2VMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBoYXNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIERlcGxveWFibGUgZXhpc3RpbmcgPSBuZXcgRGVwbG95YWJsZShuYW1lKTsKLSAgICAgICAgICAgIGV4aXN0aW5nLnNldFRhcmdldChwaGFzZSk7Ci0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGV4cGxpY2l0IGNoYWluIHJlbGF0aW9uc2hpcCBmb3IgcHJlZXhpc3RpbmcgcGhhc2VzLCBmb3Igbm93LgotICAgICAgICAgICAgICAgIGVjLmFkZFJlbGF0aW9uc2hpcChsYXN0LCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3QgPSBuYW1lOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBlYy5kZXBsb3koZXhpc3RpbmcpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gd2hlbiBidWlsZGluZyBhIHNpbXBsZSBsaXN0IGxpa2UgdGhlIGFib3ZlCi0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBlYy5kZXBsb3koZCk7Ci0KLSAgICAgICAgICAgIGlmIChkLmdldFRhcmdldCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IG5ldyBQaGFzZSgpOwotICAgICAgICAgICAgICAgIHBoYXNlLnNldE5hbWUoZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIGQuc2V0VGFyZ2V0KHBoYXNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWMucmVidWlsZCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBoYXNlTGlzdCA9IGVjLmdldENoYWluKCk7Ci0KLSAgICAgICAgcmV0dXJuIHBoYXNlTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbmRwb2ludHMoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgCQlBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEF4aXNFbmRwb2ludD4gZW5zcG9pbnRzID0gYXhpc1NlcnZpY2UuZ2V0RW5kcG9pbnRzKCk7Ci0gICAgICAgIGlmIChlbnNwb2ludHMgPT0gbnVsbCB8fCBlbnNwb2ludHMuc2l6ZSgpID09IDApIHsKLQkJCW9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzLmFkZEVuZHBvaW50c1RvU2VydmljZSgKLQkJCQkJYXhpc1NlcnZpY2UsIGF4aXNDb25maWd1cmF0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0NvbmZpZ3VyYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTg5NTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXhpc0NvbmZpZ3VyYXRvciB7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmF0aW9uY29udGV4dGZhY3Rvcnkgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBBeGlzQ29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHJldHVybiBBeGlzQ29uZmlndXJhdG9yCi0gICAgICovCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRvIGRlcGxveSBzZXJ2aWNlcyBmcm9tIHRoZSByZXBvc2l0b3J5Ci0gICAgICovCi0gICAgdm9pZCBsb2FkU2VydmljZXMoKTsKLQotICAgIC8qKgotICAgICAqIEVuZ2FnZXMgdGhlIGdsb2JhbCBtb2R1bGVzIHNwZWNpZmllZCBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICB2b2lkIGVuZ2FnZUdsb2JhbE1vZHVsZXMoKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogQ2xlYW4gdXAgdGhlIG1lc3MKLSAgICAgKi8KLSAgICB2b2lkIGNsZWFudXAoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0VuZ2luZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOGRhNGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlJvbGVQbGF5ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkF4aXNDYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5DYWxsYmFjazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlci5JbnZvY2F0aW9uUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ2FsbGJhY2tSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9nZ2luZ0NvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotLyoqCi0gKiBUaGVyZSBpcyBvbmUgZW5naW5lIGZvciB0aGUgU2VydmVyIGFuZCB0aGUgQ2xpZW50LiB0aGUgc2VuZCgpIGFuZCByZWNlaXZlKCkKLSAqIE1ldGhvZHMgYXJlIHRoZSBiYXNpYyBvcGVyYXRpb25zIHRoZSBTeW5jLCBBc3luYyBtZXNzYWdlaW5nIGFyZSBidWlsZCBvbiB0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzRW5naW5lIHsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGxvZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzRW5naW5lLmNsYXNzKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gUkVTVU1JTkdfRVhFQ1VUSU9OID0gdHJ1ZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIE5PVF9SRVNVTUlOR19FWEVDVVRJT04gPSBmYWxzZTsKLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tNdXN0VW5kZXJzdGFuZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTGlzdDxRTmFtZT4gdW5wcm9jZXNzZWQgPSBudWxsOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0IGFsbCB0aGUgaGVhZGVycyB0YXJnZXRlZCB0byB1cwotICAgICAgICBJdGVyYXRvciBoZWFkZXJCbG9ja3MgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5nZXRIZWFkZXJzVG9Qcm9jZXNzKChSb2xlUGxheWVyKW1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBhcmFtZXRlclZhbHVlKCJyb2xlUGxheWVyIikpOwotICAgICAgICB3aGlsZSAoaGVhZGVyQmxvY2tzLmhhc05leHQoKSkgewotICAgICAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gKFNPQVBIZWFkZXJCbG9jaykgaGVhZGVyQmxvY2tzLm5leHQoKTsKLSAgICAgICAgICAgIFFOYW1lIGhlYWRlck5hbWUgPSBoZWFkZXJCbG9jay5nZXRRTmFtZSgpOwotICAgICAgICAgICAgLy8gaWYgdGhpcyBoZWFkZXIgYmxvY2sgaGFzIGJlZW4gcHJvY2Vzc2VkIG9yIG11c3RVbmRlcnN0YW5kIGlzbid0Ci0gICAgICAgICAgICAvLyB0dXJuZWQgb24gdGhlbiBpdHMgY29vbAotICAgICAgICAgICAgaWYgKGhlYWRlckJsb2NrLmlzUHJvY2Vzc2VkKCkgfHwgIWhlYWRlckJsb2NrLmdldE11c3RVbmRlcnN0YW5kKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJNdXN0VW5kZXJzdGFuZCBoZWFkZXIgbm90IHByb2Nlc3NlZCBvciByZWdpc3RlcmVkIGFzIHVuZGVyc3Rvb2QiK2hlYWRlck5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaXNSZWNlaXZlck11c3RVbmRlcnN0YW5kUHJvY2Vzc29yKG1zZ0NvbnRleHQpKXsKLSAgICAgICAgICAgICAgICBpZih1bnByb2Nlc3NlZCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgdW5wcm9jZXNzZWQgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZighdW5wcm9jZXNzZWQuY29udGFpbnMoaGVhZGVyTmFtZSkpewotICAgICAgICAgICAgICAgICAgICB1bnByb2Nlc3NlZC5hZGQoaGVhZGVyTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT29wcywgdGhyb3cgYW4gYXBwcm9wcmlhdGUgTXVzdFVuZGVyc3RhbmQgZmF1bHQhIQotICAgICAgICAgICAgUU5hbWUgZmF1bHRRTmFtZSA9IGhlYWRlckJsb2NrLmdldFZlcnNpb24oKS5nZXRNdXN0VW5kZXJzdGFuZEZhdWx0Q29kZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtdXN0dW5kZXJzdGFuZGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgaGVhZGVyQmxvY2suZ2V0TG9jYWxOYW1lKCkpLCBmYXVsdFFOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZih1bnByb2Nlc3NlZCAhPW51bGwgJiYgdW5wcm9jZXNzZWQuc2l6ZSgpPjApewotICAgICAgICAgICAgLy9BZGRpbmcgSGVhZGVyUU5hbWVzIHRoYXQgZmFpbGVkIE1VIGNoZWNrIGFzIEF4aXNTZXJ2aWNlIFBhcmFtZXRlcgotICAgICAgICAgICAgLy9UaGV5IHdpbGwgYmUgZXhhbWluZWQgbGF0ZXIgYnkgTWVzc2FnZVJlY2VpdmVycy4KLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBVbnByb2Nlc3NlZCBoZWFkZXJzIHRvIE1lc3NhZ2VDb250ZXh0LiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuVU5QUk9DRVNTRURfSEVBREVSX1FOQU1FUywgdW5wcm9jZXNzZWQpOyAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlY2VpdmVyTXVzdFVuZGVyc3RhbmRQcm9jZXNzb3IoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCl7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG51bGw7Ci0gICAgICAgIGlmKG1zZ0NvbnRleHQuaXNTZXJ2ZXJTaWRlKCkpewotICAgICAgICAgICAgcmVjZWl2ZXIgPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKS5nZXRNZXNzYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHJlY2VpdmVyIT1udWxsICYmIHJlY2VpdmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCJKQVhXU01lc3NhZ2VSZWNlaXZlciIpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGhhbmRsZSBhbnkgZXJyb3IgdGhhdCBvY2N1cnMgYXQgaW5mbG93IG9yIG91dGZsb3cuIEJ1dCBpZiB0aGUKLSAgICAgKiBtZXRob2QgaXMgY2FsbGVkIHR3aWNlLCBpdCBpbXBsaWVzIHRoYXQgc2VuZGluZyB0aGUgZXJyb3IgaGFuZGxpbmcgaGFzIGZhaWxlZCwgaW4gd2hpY2ggY2FzZQotICAgICAqIHRoZSBtZXRob2QgbG9ncyB0aGUgZXJyb3IgYW5kIGV4aXN0cy4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIChwb3N0IDEuMSBicmFuY2gpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0LCBUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQocHJvY2Vzc2luZ0NvbnRleHQsIGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kcyByZXByZXNlbnRzIHRoZSBpbmZsb3cgb2YgdGhlIEF4aXMsIHRoaXMgY291bGQgYmUgZWl0aGVyIGF0IHRoZSBzZXJ2ZXIgc2lkZSBvciB0aGUgY2xpZW50IHNpZGUuCi0gICAgICogSGVyZSB0aGUgPGNvZGU+RXhlY3V0aW9uQ2hhaW48L2NvZGU+IGlzIGNyZWF0ZWQgdXNpbmcgdGhlIFBoYXNlcy4gVGhlIEhhbmRsZXJzIGF0IHRoZSBlYWNoIFBoYXNlcyBpcyBvcmRlcmVkIGluCi0gICAgICogZGVwbG95bWVudCB0aW1lIGJ5IHRoZSBkZXBsb3ltZW50IG1vZHVsZQotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKiBAc2VlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHNlZSBQaGFzZQotICAgICAqIEBzZWUgSGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhdGlvblJlc3BvbnNlIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiByZWNlaXZlOiIgKyBtc2dDb250ZXh0LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgfQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dCA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgTGlzdDxQaGFzZT4gcHJlQ2FsY3VsYXRlZFBoYXNlczsKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNGYXVsdCgpIHx8IG1zZ0NvbnRleHQuaXNQcm9jZXNzaW5nRmF1bHQoKSkgewotICAgICAgICAgICAgcHJlQ2FsY3VsYXRlZFBoYXNlcyA9IGNvbmZDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0SW5GYXVsdEZsb3dQaGFzZXMoKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5JTl9GQVVMVF9GTE9XKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByZUNhbGN1bGF0ZWRQaGFzZXMgPSBjb25mQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRGTE9XKE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBleGVjdXRpb24gY2hhaW4gaW4gdGhlIE1lc3NhZ2VDb250ZXh0IHRvIGEgKmNvcHkqIG9mIHdoYXQKLSAgICAgICAgLy8gd2UgZ290IGFib3ZlLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBtZXNzYWdlIHByb2Nlc3NpbmcgdG8gY2hhbmdlIHRoZSBjaGFpbiB3aXRob3V0Ci0gICAgICAgIC8vIGFmZmVjdGluZyBsYXRlciBtZXNzYWdlcy4KLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGV4ZWN1dGlvbkNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPigpOwotICAgICAgICBleGVjdXRpb25DaGFpbi5hZGRBbGwocHJlQ2FsY3VsYXRlZFBoYXNlcyk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RXhlY3V0aW9uQ2hhaW4oZXhlY3V0aW9uQ2hhaW4pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW52b2NhdGlvblJlc3BvbnNlIHBpID0gaW52b2tlKG1zZ0NvbnRleHQsIE5PVF9SRVNVTUlOR19FWEVDVVRJT04pOwotCi0gICAgICAgICAgICBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICBjaGVja011c3RVbmRlcnN0YW5kKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGludm9rZSB0aGUgTWVzc2FnZSBSZWNlaXZlcnMKLQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKS5nZXRNZXNzYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbWVzc2FnZXJlY2lldmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWNlaXZlci5yZWNlaXZlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIC8vIFVuZG8gYW55IHBhcnRpYWwgd29yay4KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGluY29taW5nIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkludm9jYXRpb25SZXNwb25zZSBpcyBhYm9ydGVkLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgaW5jb21pbmcgTWVzc2FnZUNvbnRleHQgaXMgcmVtb3ZlZCwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgdGhlIE9wZXJhdGlvbkNvbnRleHQgaXMgbWFya2VkIGFzIGluY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQkJQXhpc09wZXJhdGlvbiBheGlzT3AgPSBtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZihheGlzT3AhPW51bGwpewotCQkJCQlTdHJpbmcgbWVwVVJJICA9IGF4aXNPcC5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0JCQkJCWlmIChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVwVVJJKSkgewotCQkJCQkJT3BlcmF0aW9uQ29udGV4dCBvcEN0eCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotCQkJCQkJaWYgKG9wQ3R4ICE9IG51bGwpIHsKLQkJCQkJCQlvcEN0eC5yZW1vdmVNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2V7Ci0JCQkJCWxvZy5kZWJ1ZygiQ291bGQgbm90IGNsZWFuIHVwIG9wIGN0eCBmb3IgIiArIG1zZ0NvbnRleHQpOwotCQkJCX0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnJlY2VpdmUoKSI7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGVycm9yTXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEZhaWx1cmVSZWFzb24oZSk7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRha2UgdGhlIGV4ZWN1dGlvbiBjaGFpbiBmcm9tIHRoZSBtc2dDb250ZXh0ICwgYW5kIHRoZW4gdGFrZSB0aGUgY3VycmVudCBJbmRleAotICAgICAqIGFuZCBpbnZva2UgYWxsIHRoZSBwaGFzZXMgaW4gdGhlIGFycmF5bGlzdAotICAgICAqIGlmIHRoZSBtc2dDb250ZXh0IGlzIHBhdWVzZCB0aGVuIHRoZSBleGVjdXRpb24gd2lsbCBiZSBicmVha2VkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIHRoYXQgaW5kaWNhdGVzIHdoYXQKLSAgICAgKiAgICAgICAgIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzaG91bGQgYmUuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIGJvb2xlYW4gcmVzdW1pbmcpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRDdXJyZW50SGFuZGxlckluZGV4KCkgPT0gLTEpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0Q3VycmVudEhhbmRsZXJJbmRleCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLQotICAgICAgICB3aGlsZSAobXNnQ29udGV4dC5nZXRDdXJyZW50SGFuZGxlckluZGV4KCkgPCBtc2dDb250ZXh0LmdldEV4ZWN1dGlvbkNoYWluKCkuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGN1cnJlbnRIYW5kbGVyID0gKEhhbmRsZXIpIG1zZ0NvbnRleHQuZ2V0RXhlY3V0aW9uQ2hhaW4oKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0KG1zZ0NvbnRleHQuZ2V0Q3VycmVudEhhbmRsZXJJbmRleCgpKTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIXJlc3VtaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuYWRkRXhlY3V0ZWRQaGFzZShjdXJyZW50SGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIHJlc3VtaW5nIHRoZSBmbG93LCB3ZSBkb24ndCB3YW50IHRvIGFkZCB0aGUgcGhhc2UKLSAgICAgICAgICAgICAgICAgICAgKiBhZ2FpbiwgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZC4KLSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzdW1pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGkgPSBjdXJyZW50SGFuZGxlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRDdXJyZW50UGhhc2VJbmRleCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgZ290IGEgZmF1bHQsIHdlIHN0aWxsIHdhbnQgdG8gYWRkIHRoZSBwaGFzZSB0byB0aGUKLSAgICAgICAgICAgICAgICAgICAgbGlzdCB0byBiZSBleGVjdXRlZCBmb3IgZmxvd0NvbXBsZXRlKC4uLikgdW5sZXNzIHRoaXMgd2FzCi0gICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBoYW5kbGVyLCBhcyB0aGVuIHRoZSBjdXJyZW50UGhhc2VJbmRleCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgIHNldCB0byAwIGFuZCB0aGlzIHdpbGwgbG9vayBsaWtlIHdlJ3ZlIGV4ZWN1dGVkIGFsbCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuICBJZiwgYXQgc29tZSBwb2ludCwgYSBwaGFzZSByZWFsbHkgbmVlZHMgdG8gZ2V0Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbiBvZiBmbG93Q29tcGxldGUsIHRoZW4gd2UnbGwgbmVlZCB0byBpbnRyb2R1Y2UKLSAgICAgICAgICAgICAgICAgICAgc29tZSBtb3JlIGNvbXBsZXggbG9naWMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGhhcyBiZWVuCi0gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLiovCi0gICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQucmVtb3ZlRmlyc3RFeGVjdXRlZFBoYXNlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0Q3VycmVudEhhbmRsZXJJbmRleChtc2dDb250ZXh0LmdldEN1cnJlbnRIYW5kbGVySW5kZXgoKSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmxvd0NvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgSXRlcmF0b3I8SGFuZGxlcj4gaW52b2tlZFBoYXNlSXRlcmF0b3IgPSBtc2dDb250ZXh0LmdldEV4ZWN1dGVkUGhhc2VzKCk7Ci0KLSAgICAgICAgd2hpbGUgKGludm9rZWRQaGFzZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgSGFuZGxlciBjdXJyZW50SGFuZGxlciA9ICgoSGFuZGxlcikgaW52b2tlZFBoYXNlSXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgIGN1cnJlbnRIYW5kbGVyLmZsb3dDb21wbGV0ZShtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgT3V0SW5BeGlzT3BlcmF0aW9uIGN1cnJlbnRseSBpbnZva2VzCi0gICAgICAgICogcmVjZWl2ZSgpIGV2ZW4gd2hlbiBhIGZhdWx0IG9jY3VycywgYW5kIHdlIHdpbGwgaGF2ZSBhbHJlYWR5IGV4ZWN1dGVkCi0gICAgICAgICogdGhlIGZsb3dDb21wbGV0ZSBvbiB0aG9zZSBiZWZvcmUgcmVjZWl2ZUZhdWx0KCkgaXMgY2FsbGVkLgotICAgICAgICAqLwotICAgICAgICBtc2dDb250ZXh0LnJlc2V0RXhlY3V0ZWRQaGFzZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbXNnQ29uZXRleHQgaXMgcHVhc2VkIGFuZCB0cnkgdG8gaW52b2tlIHRoZW4KLSAgICAgKiBmaXJzdCBpbnZva2UgdGhlIHBoYXNlIGxpc3QgYW5kIGFmdGVyIHRoZSBtZXNzYWdlIHJlY2VpdmVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIGFsbG93aW5nIHRoZSBpbnZva2VyIHRvIHBlcmhhcHMgZGV0ZXJtaW5lCi0gICAgICogICAgICAgICB3aGV0aGVyIG9yIG5vdCB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIHdpbGwgZXZlciBzdWNjZWVkLgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbnZvY2F0aW9uUmVzcG9uc2UgcmVzdW1lUmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiIHJlc3VtZVJlY2VpdmU6IiArIG1zZ0NvbnRleHQuZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9SRVZJRVc6IFRoaXMgbmFtZSBpcyBhIGxpdHRsZSBtaXNsZWFkaW5nLCBhcyBpdCBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIHNob3VsZCBiZSBhIHJlc3VtZVJlY2VpdmVGYXVsdCBhcyB3ZWxsLCB3aGVuLCBpbiBmYWN0LCB0aGlzIGRvZXMgYm90aAotICAgICAgICAvL1JFVklFVzogVW5saWtlIHdpdGggcmVjZWl2ZSwgdGhlcmUgaXMgbm8gd3JhcHBpbmcgdHJ5L2NhdGNoIGNsYXVzZSB3aGljaCB3b3VsZAotICAgICAgICAvL2ZpcmUgb2ZmIHRoZSBmbG93Q29tcGxldGUgb24gYW4gZXJyb3IsIGFzIHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlCi0gICAgICAgIC8vbWVzc2FnZSB3aWxsIGJlIHJlc3VtZWQgYWdhaW4sIGJ1dCBwZXJoYXBzIHdlIG5lZWQgdG8gdW53aW5kIGJhY2sgdG8KLSAgICAgICAgLy90aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG1lc3NhZ2Ugd2FzIHJlc3VtZWQgYW5kIHByb3ZpZGUgYW5vdGhlciBBUEkKLSAgICAgICAgLy90byBhbGxvdyB0aGUgZnVsbCB1bndpbmQgaWYgdGhlIG1lc3NhZ2UgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLgotICAgICAgICAvL2ludm9rZSB0aGUgcGhhc2VzCi0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IGludm9rZShtc2dDb250ZXh0LCBSRVNVTUlOR19FWEVDVVRJT04pOwotICAgICAgICAvL2ludm9raW5nIHRoZSBNUgotCi0gICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFKSkgewotICAgICAgICAgICAgY2hlY2tNdXN0VW5kZXJzdGFuZChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChtc2dDb250ZXh0LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBNZXNzYWdlIFJlY2VpdmVycwotICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciByZWNlaXZlciA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9tZXNzYWdlcmVjaWV2ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE5hbWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlY2VpdmVyLnJlY2VpdmUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gcmVzdW1lIHRoZSBpbnZvY2F0aW9uIGF0IHRoZSBzZW5kIHBhdGggLCB0aGlzIGlzIG5lZW5lZCBzaW5jZSBpdCBpcyByZXF1aXJlIHRvIGNhbGwKLSAgICAgKiBUcmFuc3BvcnRTZW5kZXIgYXQgdGhlIGVuZAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAcmV0dXJuIEFuIEludm9jYXRpb25SZXNwb25zZSBhbGxvd2luZyB0aGUgaW52b2tlciB0byBwZXJoYXBzIGRldGVybWluZQotICAgICAqICAgICAgICAgd2hldGhlciBvciBub3QgdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyB3aWxsIGV2ZXIgc3VjY2VlZC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhdGlvblJlc3BvbnNlIHJlc3VtZVNlbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiByZXN1bWVTZW5kOiIgKyBtc2dDb250ZXh0LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vUkVWSUVXOiBUaGlzIG5hbWUgaXMgYSBsaXR0bGUgbWlzbGVhZGluZywgYXMgaXQgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBzaG91bGQgYmUgYSByZXN1bWVTZW5kRmF1bHQgYXMgd2VsbCwgd2hlbiwgaW4gZmFjdCwgdGhpcyBkb2VzIGJvdGgKLSAgICAgICAgLy9SRVZJRVc6IFVubGlrZSB3aXRoIHNlbmQsIHRoZXJlIGlzIG5vIHdyYXBwaW5nIHRyeS9jYXRjaCBjbGF1c2Ugd2hpY2ggd291bGQKLSAgICAgICAgLy9maXJlIG9mZiB0aGUgZmxvd0NvbXBsZXRlIG9uIGFuIGVycm9yLCBhcyB3ZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHRoZQotICAgICAgICAvL21lc3NhZ2Ugd2lsbCBiZSByZXN1bWVkIGFnYWluLCBidXQgcGVyaGFwcyB3ZSBuZWVkIHRvIHVud2luZCBiYWNrIHRvCi0gICAgICAgIC8vdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBtZXNzYWdlIHdhcyByZXN1bWVkIGFuZCBwcm92aWRlIGFub3RoZXIgQVBJCi0gICAgICAgIC8vdG8gYWxsb3cgdGhlIGZ1bGwgdW53aW5kIGlmIHRoZSBtZXNzYWdlIGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgLy9pbnZva2UgdGhlIHBoYXNlcwotICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLSAgICAgICAgLy9JbnZva2luZyBUcmFuc3BvcnQgU2VuZGVyCi0gICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFKSkgewotICAgICAgICAgICAgLy8gd3JpdGUgdGhlIE1lc3NhZ2UgdG8gdGhlIFdpcmUKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG1zZ0NvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgICAgICBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyID0gdHJhbnNwb3J0T3V0LmdldFNlbmRlcigpOwotICAgICAgICAgICAgc2VuZGVyLmludm9rZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIGZsb3dDb21wbGV0ZShtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwaTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXN1bWUgcHJvY2Vzc2luZyBvZiBhIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnY3R4Ci0gICAgICogQHJldHVybiBBbiBJbnZvY2F0aW9uUmVzcG9uc2UgYWxsb3dpbmcgdGhlIGludm9rZXIgdG8gcGVyaGFwcyBkZXRlcm1pbmUKLSAgICAgKiAgICAgICAgIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgd2lsbCBldmVyIHN1Y2NlZWQuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEludm9jYXRpb25SZXNwb25zZSByZXN1bWUoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgcmVzdW1lOiIgKyBtc2djdHguZ2V0TWVzc2FnZUlEKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNnY3R4LnNldFBhdXNlZChmYWxzZSk7Ci0gICAgICAgIGlmIChtc2djdHguZ2V0RkxPVygpID09IE1lc3NhZ2VDb250ZXh0LklOX0ZMT1cpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bWVSZWNlaXZlKG1zZ2N0eCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdW1lU2VuZChtc2djdHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2RzIHJlcHJlc2VudHMgdGhlIG91dGZsb3cgb2YgdGhlIEF4aXMsIHRoaXMgY291bGQgYmUgZWl0aGVyIGF0IHRoZSBzZXJ2ZXIgc2lkZSBvciB0aGUgY2xpZW50IHNpZGUuCi0gICAgICogSGVyZSB0aGUgPGNvZGU+RXhlY3V0aW9uQ2hhaW48L2NvZGU+IGlzIGNyZWF0ZWQgdXNpbmcgdGhlIFBoYXNlcy4gVGhlIEhhbmRsZXJzIGF0IHRoZSBlYWNoIFBoYXNlcyBpcyBvcmRlcmVkIGluCi0gICAgICogZGVwbG95bWVudCB0aW1lIGJ5IHRoZSBkZXBsb3ltZW50IG1vZHVsZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqIEBzZWUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAc2VlIFBoYXNlCi0gICAgICogQHNlZSBIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBzZW5kOiIgKyBtc2dDb250ZXh0LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBmaW5kIGFuZCBpbnZva2UgdGhlIFBoYXNlcwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXJyYXlMaXN0IGV4ZWN1dGlvbkNoYWluID0gb3BlcmF0aW9uQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0UGhhc2VzT3V0RmxvdygpOwotICAgICAgICAvL3JhdGhlciB0aGFuIGhhdmluZyB0d28gc3RlcHMgYWRkZWQgYm90aCBvcGFyYXRpb24gYW5kIGdsb2JhbCBjaGFpbiB0b2dldGhlcgotICAgICAgICBBcnJheUxpc3Qgb3V0UGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvdXRQaGFzZXMuYWRkQWxsKGV4ZWN1dGlvbkNoYWluKTsKLSAgICAgICAgb3V0UGhhc2VzLmFkZEFsbChtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRPdXRGbG93UGhhc2VzKCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldEV4ZWN1dGlvbkNoYWluKG91dFBoYXNlcyk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5PVVRfRkxPVyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgTk9UX1JFU1VNSU5HX0VYRUNVVElPTik7Ci0KLSAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFKSkgewotICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBNZXNzYWdlIHRvIHRoZSBXaXJlCi0gICAgICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbXNnQ29udGV4dC5nZXRUcmFuc3BvcnRPdXQoKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNwb3J0T3V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVHJhbnNwb3J0IG91dCBoYXMgbm90IGJlZW4gc2V0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSB0cmFuc3BvcnRPdXQuZ2V0U2VuZGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBib29sZWFuIHByb3BlcnR5IG9ubHkgdXNlZCBpbiBjbGllbnQgc2lkZSBmaXJlQW5kRm9yZ2V0IGludm9jYXRpb24KLSAgICAgICAgICAgICAgICAvL0l0IHdpbGwgc2V0IGEgcHJvcGVydHkgaW50byBtZXNzYWdlIGNvbnRleHQgYW5kIGlmIHNvbWUgb25lIGhhcyBzZXQgdGhlCi0gICAgICAgICAgICAgICAgLy9wcm9wZXJ0eSB0aGVuIHRyYW5zcG9ydCBzZW5kZXIgd2lsbCBpbnZva2UgaW4gYSBkaWZmcmVudCB0aHJlYWQKLSAgICAgICAgICAgICAgICBPYmplY3QgaXNUcmFuc3BvcnROb25CbG9ja2luZyA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfTk9OX0JMT0NLSU5HKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNUcmFuc3BvcnROb25CbG9ja2luZyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKEJvb2xlYW4pIGlzVHJhbnNwb3J0Tm9uQmxvY2tpbmcpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRUaHJlYWRQb29sKCkuZXhlY3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJhbnNwb3J0Tm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyKG1zZ0NvbnRleHQsIHNlbmRlcikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vUkVWSUVXOiBJbiB0aGUgY2FzZSBvZiB0aGUgVHJhbnNwb3J0Tm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyLCBkb2VzIHRoaXMgbmVlZCB0byB3YWl0IHVudGlsIHRoYXQgZmluaXNoZXM/Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpKSB7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBJbnZvY2F0aW9uUmVzcG9uc2UgZW5jb3VudGVyZWQgaW4gQXhpc0VuZ2luZS5zZW5kKCkiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEZhaWx1cmVSZWFzb24oZSk7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgdGhlIFNPQVAgRmF1bHQgdG8gYW5vdGhlciBTT0FQIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlbmRGYXVsdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiIHNlbmRGYXVsdDoiICsgbXNnQ29udGV4dC5nZXRNZXNzYWdlSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICAvL0ZJWE1FOiBJZiB0aGlzIGdldHMgcGF1c2VkIGluIHRoZSBvcGVyYXRpb24tc3BlY2lmaWMgcGhhc2VzLCB0aGUgcmVzdW1lIGlzIG5vdCBnb2luZyB0byBmdW5jdGlvbiBjb3JyZWN0bHkgYXMgdGhlIHBoYXNlcyB3aWxsIG5vdCBoYXZlIGFsbCBiZWVuIHNldAotCi0gICAgICAgIC8vIGZpbmQgYW5kIGV4ZWN1dGUgdGhlIEZhdWx0IE91dCBGbG93IEhhbmRsZXJzCi0gICAgICAgIGlmIChvcENvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gb3BDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIEFycmF5TGlzdCBmYXVsdEV4ZWN1dGlvbkNoYWluID0gYXhpc09wZXJhdGlvbi5nZXRQaGFzZXNPdXRGYXVsdEZsb3coKTsKLQotICAgICAgICAgICAgLy9hZGRpbmcgYm90aCBvcGVyYXRpb24gc3BlY2lmaWMgYW5kIGdsb2JhbCBvdXQgZmF1bHQgZmxvd3MuCi0KLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXRGYXVsdFBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIG91dEZhdWx0UGhhc2VzLmFkZEFsbCgoQXJyYXlMaXN0KSBmYXVsdEV4ZWN1dGlvbkNoYWluLmNsb25lKCkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFeGVjdXRpb25DaGFpbigoQXJyYXlMaXN0KSBvdXRGYXVsdFBoYXNlcy5jbG9uZSgpKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IGludm9rZShtc2dDb250ZXh0LCBOT1RfUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLQotICAgICAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUaGUgcmVzdW1wdGlvbiBvZiB0aGlzIGZsb3cgbWF5IGZ1bmN0aW9uIGluY29ycmVjdGx5LCBhcyB0aGUgT3V0RmF1bHRGbG93IHdpbGwgbm90IGJlIHVzZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5BQk9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnNlbmRGYXVsdCgpIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRGYWlsdXJlUmVhc29uKGUpOwotICAgICAgICAgICAgICAgIGZsb3dDb21wbGV0ZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0PEhhbmRsZXI+IGV4ZWN1dGlvbkNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyPihtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRPdXRGYXVsdEZsb3dQaGFzZXMoKSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RXhlY3V0aW9uQ2hhaW4oZXhlY3V0aW9uQ2hhaW4pOwotICAgICAgICBtc2dDb250ZXh0LnNldEZMT1coTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cpOwotICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgTk9UX1JFU1VNSU5HX0VYRUNVVElPTik7Ci0KLSAgICAgICAgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUUpKSB7Ci0gICAgICAgICAgICAvLyBBY3R1YWxseSBzZW5kIHRoZSBTT0FQIEZhdWx0Ci0gICAgICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBtc2dDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpOwotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVHJhbnNwb3J0IG91dCBoYXMgbm90IGJlZW4gc2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyID0gdHJhbnNwb3J0T3V0LmdldFNlbmRlcigpOwotCi0gICAgICAgICAgICBzZW5kZXIuaW52b2tlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuU1VTUEVORCkpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLkFCT1JUKSkgewotICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0KLSAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBJbnZvY2F0aW9uUmVzcG9uc2UgZW5jb3VudGVyZWQgaW4gQXhpc0VuZ2luZS5zZW5kRmF1bHQoKSI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiAiICsgZXJyb3JNc2cpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBoZXJlIHdlIGFzc3VtZSB0aGF0IGl0IGlzIHJlc3VtZSBmcm9tIGFuIG9wZXJhdGlvbiBsZXZlbCBoYW5kbGVyCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXN1bWVTZW5kRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdHsKLSAgICAgICAgaWYgKExvZ2dpbmdDb250cm9sLmRlYnVnTG9nZ2luZ0FsbG93ZWQgJiYgbG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZShtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiIHJlc3VtZVNlbmRGYXVsdDoiICsgbXNnQ29udGV4dC5nZXRNZXNzYWdlSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLQotICAgICAgICBpZiAob3BDb250ZXh0ICE9IG51bGwpIHsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnZvY2F0aW9uUmVzcG9uc2UgcGkgPSBpbnZva2UobXNnQ29udGV4dCwgUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLQotICAgICAgICAgICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBUaGUgcmVzdW1wdGlvbiBvZiB0aGlzIGZsb3cgbWF5IGZ1bmN0aW9uIGluY29ycmVjdGx5LCBhcyB0aGUgT3V0RmF1bHRGbG93IHdpbGwgbm90IGJlIHVzZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5BQk9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnNlbmRGYXVsdCgpIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGVycm9yTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChlcnJvck1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldEZhaWx1cmVSZWFzb24oZSk7Ci0gICAgICAgICAgICAgICAgZmxvd0NvbXBsZXRlKG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8SGFuZGxlcj4gZXhlY3V0aW9uQ2hhaW4gPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXI+KG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE91dEZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRFeGVjdXRpb25DaGFpbihleGVjdXRpb25DaGFpbik7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RkxPVyhNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVyk7Ci0gICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IGludm9rZShtc2dDb250ZXh0LCBOT1RfUkVTVU1JTkdfRVhFQ1VUSU9OKTsKLQotICAgICAgICBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRSkpIHsKLSAgICAgICAgICAgIC8vIEFjdHVhbGx5IHNlbmQgdGhlIFNPQVAgRmF1bHQKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IG1zZ0NvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0gICAgICAgICAgICBpZiAodHJhbnNwb3J0T3V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUcmFuc3BvcnQgb3V0IGhhcyBub3QgYmVlbiBzZXQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSB0cmFuc3BvcnRPdXQuZ2V0U2VuZGVyKCk7Ci0KLSAgICAgICAgICAgIHNlbmRlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EKSkgewotICAgICAgICB9IGVsc2UgaWYgKHBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQUJPUlQpKSB7Ci0gICAgICAgICAgICBmbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPQotICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIEludm9jYXRpb25SZXNwb25zZSBlbmNvdW50ZXJlZCBpbiBBeGlzRW5naW5lLnNlbmRGYXVsdCgpIjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2dDb250ZXh0LmdldExvZ0lEU3RyaW5nKCkgKyAiICIgKyBlcnJvck1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KGVycm9yTXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHdoZW4gc29tZW9uZSBpbnZva2UgYSBzZXJ2aWNlIGludm9jYXRpb24gd2l0aCB0d28gdHJhbnNwb3J0cwotICAgICAqIElmIHdlIGRvbnQgY3JlYXRlIGEgbmV3IHRocmVhZCB0aGVuIHRoZSBtYWluIHRocmVhZCB3aWxsIGJsb2NrIHVudGlsbCBpdCBnZXRzIHRoZQotICAgICAqIHJlc3BvbnNlIC4gSW4gdGhlIGNhc2Ugb2YgSFRUUCB0cmFuc3BvcnRzZW5kZXIgd2lsbCBibG9jayB1bnRpbGwgaXQgZ2V0cyBIVFRQIDIwMAotICAgICAqIFNvICwgbWFpbiB0aHJlYWQgYWxzbyBibG9jayB0aWxsIHRyYW5zcG9ydCBzZW5kZXIgcmVyZWFzZXMgdGhlIHRyZWFkLiBTbyB0aGVyZSBpcyBubwotICAgICAqIGFjdHVhbCBub24tYmxvY2tpbmcuIFRoYXQgaXMgd2h5IHdoZW4gc2VuZGluZyB3ZSBjcmVhdCBhIG5ldyB0aGVhZCBhbmQgc2VuZCB0aGUKLSAgICAgKiByZXF1c2V0IHZpYSB0aGF0LgotICAgICAqIDxwLz4KLSAgICAgKiBTbyB3aG9sZSBwb3Jwb3NlIG9mIHRoaXMgY2xhc3MgdG8gc2VuZCB0aGUgcmVxdXNldCB2aWEgYSBuZXcgdGhyZWFkCi0gICAgICogPHAvPgotICAgICAqIHdheSB0cmFuc3BvcnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHJhbnNwb3J0Tm9uQmxvY2tpbmdJbnZvY2F0aW9uV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1zZ2N0eDsKLSAgICAgICAgcHJpdmF0ZSBUcmFuc3BvcnRTZW5kZXIgc2VuZGVyOwotCi0gICAgICAgIHB1YmxpYyBUcmFuc3BvcnROb25CbG9ja2luZ0ludm9jYXRpb25Xb3JrZXIoTWVzc2FnZUNvbnRleHQgbXNnY3R4LAotICAgICAgICAgICAgVHJhbnNwb3J0U2VuZGVyIHNlbmRlcikgewotICAgICAgICAgICAgdGhpcy5tc2djdHggPSBtc2djdHg7Ci0gICAgICAgICAgICB0aGlzLnNlbmRlciA9IHNlbmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VuZGVyLmludm9rZShtc2djdHgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbyhtc2djdHguZ2V0TG9nSURTdHJpbmcoKSArICIgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobXNnY3R4LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LkRJU0FCTEVfQVNZTkNfQ0FMTEJBQ0tfT05fVFJBTlNQT1JUX0VSUk9SKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSBtc2djdHguZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbXNnUmVjZWl2ZXIgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2VSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtc2dSZWNlaXZlciAhPSBudWxsKSAmJiAobXNnUmVjZWl2ZXIgaW5zdGFuY2VvZiBDYWxsYmFja1JlY2VpdmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjYWxsYmFjayA9ICgoQ2FsbGJhY2tSZWNlaXZlcikgbXNnUmVjZWl2ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9va3VwQ2FsbGJhY2sobXNnY3R4LmdldE1lc3NhZ2VJRCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOyAvLyBUT0RPOiBzaG91bGQgd2UgbG9nIHRoaXM/PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayBpbnN0YW5jZW9mIENhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc3RhbmNlcyBvZiBDYWxsYmFjayBvbmx5IGV4cGVjdCBvbkNvbXBsZXRlIHRvIGJlIGNhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBzdWNjZXNzZnVsIE1FUC4gIEVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXN5bmMgUmVzcG9uc2Ugb2JqZWN0LCB3aGljaCB0aGUgQ2FsbGJhY2sgaW1wbGVtZW50YXRpb25zIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENhbGxiYWNrKWNhbGxiYWNrKS5vbkVycm9yKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBBeGlzQ2FsbGJhY2sgKHdoaWNoIGlzIE91dEluQXhpc09wZXJhdGlvbkNsaWVudCRTeW5jQ2FsbEJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBzdXBwb3J0IGFzeW5jLW9uLXRoZS13aXJlIHVuZGVyIGEgc3luY2hyb25vdXMgQVBJIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRpb24pIG5lZWQgdG8gYmUgdG9sZCB0aGUgTUVQIGlzIGNvbXBsZXRlIGFmdGVyIGJlaW5nIHRvbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEF4aXNDYWxsYmFjayljYWxsYmFjaykub25FcnJvcihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBeGlzQ2FsbGJhY2spY2FsbGJhY2spLm9uQ29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNFcnJvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2NzI3Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIEF4aXNFcnJvciBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjI5MTA2MjEzNjQwNzk5NTkyMEw7Ci0KLSAgICBwdWJsaWMgQXhpc0Vycm9yKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc0Vycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEVycm9yIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gY2F1c2UgICBDYXVzZQotICAgICAqLwotICAgIHB1YmxpYyBBeGlzRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRXZlbnQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQXhpc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDk1MTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIEF4aXNFdmVudCB7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBBeGlzIGV2ZW50IGlzIHNlbnQgdG8gcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgd2hlbmV2ZXIgYW55dGhpbmcgc2lnbmlmaWNhbnQKLSAgICAgKiBoYXBwZW5zIHRvIDxjb2RlPkF4aXNDb25maWd1cmF0aW9uPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX0RFUExPWSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9SRU1PVkUgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfU1RPUCA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9TVEFSVCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX0RFUExPWSA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9EVUxFX1JFTU9WRSA9IDU7Ci0gICAgcHJpdmF0ZSBpbnQgRVZFTlRfVFlQRTsKLQotICAgIHB1YmxpYyBBeGlzRXZlbnQoaW50IEVWRU5UX1RZUEUpIHsKLSAgICAgICAgdGhpcy5FVkVOVF9UWVBFID0gRVZFTlRfVFlQRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEV2ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEVWRU5UX1RZUEU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNPYnNlcnZlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyNTY0MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNPYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLQotcHVibGljIGludGVyZmFjZSBBeGlzT2JzZXJ2ZXIgZXh0ZW5kcyBQYXJhbWV0ZXJJbmNsdWRlIHsKLQotICAgIC8vIFRoZSBpbml0aWxpemF0aW9uIGNvZGUgd2lsbCBnbyBoZXJlCi0gICAgdm9pZCBpbml0KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpOwotCi0gICAgdm9pZCBzZXJ2aWNlVXBkYXRlKEF4aXNFdmVudCBldmVudCwgQXhpc1NlcnZpY2Ugc2VydmljZSk7Ci0KLSAgICB2b2lkIHNlcnZpY2VHcm91cFVwZGF0ZShBeGlzRXZlbnQgZXZlbnQsIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKTsKLQotICAgIHZvaWQgbW9kdWxlVXBkYXRlKEF4aXNFdmVudCBldmVudCwgQXhpc01vZHVsZSBtb2R1bGUpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BeGlzU2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NDg1Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0F4aXNTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2x1c3RlcmluZy5DbHVzdGVyaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlIGEgdmVyeSBjb252ZW5pZW50IHdheSBvZiBjcmVhdGluZyBzZXJ2ZXIgYW5kIGRlcGxveWluZyBzZXJ2aWNlcy4KLSAqIE9uY2Ugc29tZW9uZSBjYWxsIHN0YXJ0IG1ldGhvZCBpdCB3aWxsIGZpcmUgdXAgY29uZmlndXJhdGlvbiBjb250ZXh0IGFuZCBzdGFydCB1cCB0aGUgbGlzdGVuZXJzLgotICogT25lIGNhbiBwcm92aWRlIHJlcG9zaXRvcnkgbG9jYXRpb24gYW5kIGF4aXMueG1sIGFzIHN5c3RlbSBwcm9wZXJ0aWVzLgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzU2VydmVyIHsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0OwotICAgIHByb3RlY3RlZCBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyOwotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydE9uRGVwbG95OwotICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7Ci0KLQotICAgIC8qKgotICAgICAqIElmIHlvdSBkbyBub3Qgd2FudCBBeGlzMiB0byBzdGFydCB0aGUgc2VydmVyIGF1dG9tYXRpY2FsbHkgdGhlbiBwYXNzIHRoZSAiZmFsc2UiIGVsc2UgInRydWUiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnRPbkRlcGxveSA6IGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZlcihib29sZWFuIHN0YXJ0T25EZXBsb3kpIHsKLSAgICAgICAgdGhpcy5zdGFydE9uRGVwbG95ID0gc3RhcnRPbkRlcGxveTsKLSAgICAgICAgbGlzdGVuZXJNYW5hZ2VyID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2VydmVyIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseSBpZiB5b3UgY2FsbCBkZXBsb3lTZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2ZXIoKSB7Ci0gICAgICAgIHRoaXModHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2lsbCBtYWtlIEphdmEgY2xhc3MgaW50byBhIHdlYiBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzTmFtZSA6IEFjdHVhbCBjbGFzcyB5b3Ugd2FudCB0byBtYWtlIGFzIGEgd2ViIHNlcnZpY2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCA6IElmIHNvbWV0aGluZyB3ZW50IHdyb25nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVwbG95U2VydmljZShTdHJpbmcgc2VydmljZUNsYXNzTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBBeGlzU2VydmljZS5jcmVhdGVTZXJ2aWNlKHNlcnZpY2VDbGFzc05hbWUsIGF4aXNDb25maWcpOwotICAgICAgICBheGlzQ29uZmlnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIGlmIChzdGFydE9uRGVwbG95KSB7Ci0gICAgICAgICAgICBzdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2lsbCBjcmVhdGUgYSBjb25maWd1cmF0aW9uIGNvbnRleHQgZnJvbSB0aGUgYXZpYWxhYmxlIGRhdGEgYW5kIHRoZW4gaXQKLSAgICAgKiB3aWxsIHN0YXJ0IHRoZSBsaXN0ZW5lciBtYW5hZ2VyCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RhcnRlZCkgewotCi0gICAgICAgICAgICBDbHVzdGVyTWFuYWdlciBjbHVzdGVyTWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRDbHVzdGVyTWFuYWdlcigpOwotICAgICAgICAgICAgU3RyaW5nIGF2b2lkSW5pdCA9IENsdXN0ZXJpbmdDb25zdGFudHMuUGFyYW1ldGVycy5BVk9JRF9JTklUSUFUSU9OOwotICAgICAgICAgICAgaWYgKGNsdXN0ZXJNYW5hZ2VyICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjbHVzdGVyTWFuYWdlci5nZXRQYXJhbWV0ZXIoYXZvaWRJbml0KSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKChTdHJpbmcpIGNsdXN0ZXJNYW5hZ2VyLmdldFBhcmFtZXRlcihhdm9pZEluaXQpLmdldFZhbHVlKCkpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLnNldENvbmZpZ3VyYXRpb25Db250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGNsdXN0ZXJNYW5hZ2VyLmluaXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLnN0YXJ0U3lzdGVtKGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBzZXJ2ZXIsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlcyB0aGUgbGlzdGVuZXIgbWFuYWdlciBhcyB3ZWxsLgotICAgICAqCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQudGVybWluYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dC4gUGxlYXNlIGNhbGwgdGhpcyBiZWZvcmUgeW91IGNhbGwgZGVwbG95U2VydmljZSBvciBzdGFydCBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0IENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbkNvbnRleHQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gY29udGV4dCBpZiBvbmUgaXMgbm90IHNldCBhbHJlYWR5IHZpYSBzZXRDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqCi0gICAgICogQHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VycyBleHRlbmRpbmcgdGhpcyBjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc3VwcGx5IGEgY3VzdG9tIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlZmF1bHRPYmplY3RTdXBwbGllci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZWZhdWx0T2JqZWN0U3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhY2E2OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlZmF1bHRPYmplY3RTdXBwbGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE9iamVjdFN1cHBsaWVyIGltcGxlbWVudHMgT2JqZWN0U3VwcGxpZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuT2JqZWN0U3VwcGxpZXIjZ2V0T2JqZWN0KGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChDbGFzcyBjbGF6eikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBwYXJlbnQgPSBjbGF6ei5nZXREZWNsYXJpbmdDbGFzcygpOwotCQkJT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLQotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgdGhpcyBpcyBhbiBpbm5lciBjbGFzcyB0aGVuIHRoYXQgY2FuIGJlIGEgbm9uIHN0YXRpYyBpbm5lciBjbGFzcy4gCi0JCQkJLy8gdGhvc2UgY2xhc3NlcyBoYXZlIHRvIGJlIGluc3RhbnRpYXRlZCBpbiBhIGRpZmZlcmVudCB3YXkgdGhhbiBhIG5vcm1hbCBpbml0aWFsaXphdGlvbi4KLQkJCQlpbnN0YW5jZSA9IGNsYXp6LmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsgcGFyZW50IH0pCi0JCQkJCQkubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgZ2V0T2JqZWN0KHBhcmVudCkgfSk7Ci0JCQl9IGVsc2UgewotCQkJCWluc3RhbmNlID0gY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGVwZW5kZW5jeU1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGVwZW5kZW5jeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0NWYzZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2VydmljZS5MaWZlY3ljbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBJZiB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBoYXMgYW4gaW5pdCBtZXRob2Qgd2l0aCAxIG9yIDIgbWVzc2FnZSBjb250ZXh0IGFzIGl0cyBwYXJhbWV0ZXJzLCB0aGVuCi0gKiB0aGUgRGVwZW5kZW5jeU1hbmFnZXIgY2FsbHMgdGhlIGluaXQgbWV0aG9kIHdpdGggYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lNYW5hZ2VyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVwZW5kZW5jeU1hbmFnZXIuY2xhc3MpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZJQ0VfSU5JVF9NRVRIT0QgPSAiaW5pdCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9ERVNUUk9ZX01FVEhPRCA9ICJkZXN0cm95IjsKLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgYSBuZXcgc2VydmljZSBvYmplY3QuICBFc3NlbnRpYWxseSwgY2hlY2sgdG8gc2VlIGlmIHRoZSBvYmplY3Qgd2FudHMgdG8gcmVjZWl2ZQotICAgICAqIGFuIGluaXQoKSBjYWxsIC0gaWYgc28sIGNhbGwgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqIHRoZSBzZXJ2aWNlIG9iamVjdAotICAgICAqIEBwYXJhbSBzZXJ2aWNlQ29udGV4dCB0aGUgYWN0aXZlIFNlcnZpY2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0gaW5pdGlhbGl6aW5nCi0gICAgICogCi0gICAgICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBpbml0U2VydmljZU9iamVjdCgpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRTZXJ2aWNlQ2xhc3MoT2JqZWN0IG9iaiwgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaW5pdFNlcnZpY2VPYmplY3Qob2JqLCBzZXJ2aWNlQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBzZXJ2aWNlIG9iamVjdC4gIEVzc2VudGlhbGx5LCBjaGVjayB0byBzZWUgaWYgdGhlIG9iamVjdCB3YW50cyB0byByZWNlaXZlCi0gICAgICogYW4gaW5pdCgpIGNhbGwgLSBpZiBzbywgY2FsbCBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmogdGhlIHNlcnZpY2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0IHRoZSBhY3RpdmUgU2VydmljZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbSBpbml0aWFsaXppbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFNlcnZpY2VPYmplY3QoT2JqZWN0IG9iaiwgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgd2F5IHRvIGRvIHRoaW5ncyBpbnRvIHRoZSBmdXR1cmUuCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMaWZlY3ljbGUpIHsKLSAgICAgICAgICAgICgoTGlmZWN5Y2xlKW9iaikuaW5pdChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAuLi5ob3dldmVyLCB3ZSBhbHNvIHN0aWxsIHN1cHBvcnQgdGhlIG9sZCB3YXkgZm9yIG5vdy4gIE5vdGUgdGhhdCBpbnRyb3NwZWN0aW5nIGZvcgotICAgICAgICAvLyBhIG1ldGhvZCBsaWtlIHRoaXMgaXMgc29tZXRoaW5nIGxpa2UgMTAgdGltZXMgc2xvd2VyIHRoYW4gdGhlIGFib3ZlIGluc3RhbmNlb2YgY2hlY2suCi0KLSAgICAgICAgQ2xhc3MgY2xhc3NUb0xvYWQgPSBvYmouZ2V0Q2xhc3MoKTsKLSAgICAgICAgLy8gV2UgY2FuIG5vdCBjYWxsIGNsYXNzVG9Mb2FkLmdldERlY2xhcmVkTWV0aGVkKCkgLCBzaW5jZSB0aGVyZQotICAgICAgICAvLyAgY2FuIGJlIGluc2F0bmNlIHdoZXJlIG11dGlwbGUgc2VydmljZXMgZXh0ZW5kcyB1c2luZyBvbmUgY2xhc3MKLSAgICAgICAgLy8ganVzdCBmb3IgaW5pdCBhbmQgb3RoZXIgcmVmbGVjdGlvbiBtZXRob2RzCi0gICAgICAgIE1ldGhvZCBtZXRob2QgPQotICAgICAgICAgICAgICAgIG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtZXRob2QgPSBjbGFzc1RvTG9hZC5nZXRNZXRob2QoU0VSVklDRV9JTklUX01FVEhPRCwgbmV3IENsYXNzW117U2VydmljZUNvbnRleHQuY2xhc3N9KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vV2UgZG8gbm90IG5lZWQgdG8gaW5mb3JtIHRoaXMgdG8gdXNlciAsIHNpbmNlIHRoaXMgc29tZXRoaW5nCi0gICAgICAgICAgICAvLyBBeGlzMiBpcyBjaGVja2luZyB0byBzdXBwb3J0IFNlc3Npb24uIFNvIGlmIHRoZSBtZXRob2QgaXMKLSAgICAgICAgICAgIC8vIG5vdCB0aGVyZSB3ZSBzaG91bGQgaWdub3JlIHRoYXQKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShvYmosIG5ldyBPYmplY3RbXXtzZXJ2aWNlQ29udGV4dH0pOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY2FsbCAiICsgU0VSVklDRV9JTklUX01FVEhPRCwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGNhbGwgIiArIFNFUlZJQ0VfSU5JVF9NRVRIT0QsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmluZm8oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY2FsbCAiICsgU0VSVklDRV9JTklUX01FVEhPRCwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyBpbml0IGFsbCB0aGUgc2VydmljZXMgaW4gYXBwbGljYXRpb24gc2NvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlR3JvdXBDb250ZXh0IHRoZSBTZXJ2aWNlR3JvdXBDb250ZXh0IGZyb20gd2hpY2ggdG8gZXh0cmFjdCBhbGwgdGhlIHNlcnZpY2VzCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlcmUncyBhIHByb2JsZW0gaW5pdGlhbGl6aW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRTZXJ2aWNlKFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBJdGVyYXRvcjxBeGlzU2VydmljZT4gc2VydmljZUl0ciA9IHNlcnZpY2VHcm91cC5nZXRTZXJ2aWNlcygpOwotICAgICAgICB3aGlsZSAoc2VydmljZUl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlSXRyLm5leHQoKTsKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgUGFyYW1ldGVyIGltcGxJbmZvUGFyYW0gPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgICAgICBpZiAoaW1wbEluZm9QYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgaW1wbENsYXNzID0gTG9hZGVyLmxvYWRDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgaW1wbEluZm9QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VydmljZUltcGwgPSBpbXBsQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQuc2V0UHJvcGVydHkoU2VydmljZUNvbnRleHQuU0VSVklDRV9PQkpFQ1QsIHNlcnZpY2VJbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaW5pdFNlcnZpY2VPYmplY3Qoc2VydmljZUltcGwsIHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSBhIHNlcnZpY2Ugb2JqZWN0IHRoYXQgaXQncyBvbiBkZWF0aCByb3cuCi0gICAgICogQHBhcmFtIHNlcnZpY2VDb250ZXh0IHRoZSBhY3RpdmUgU2VydmljZUNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVzdHJveVNlcnZpY2VPYmplY3QoU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KFNlcnZpY2VDb250ZXh0LlNFUlZJQ0VfT0JKRUNUKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgTGlmZWN5Y2xlIG9iamVjdCwganVzdCBjYWxsIGl0LgotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIExpZmVjeWNsZSkgewotICAgICAgICAgICAgICAgICgoTGlmZWN5Y2xlKW9iaikuZGVzdHJveShzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBhbHNvIHVzZSAicmF3IiBpbnRyb3NwZWN0aW9uIHRvIHRyeSBhbmQgZmluZCB0aGUgZGVzdHJveSBtZXRob2QuCi0KLSAgICAgICAgICAgIENsYXNzIGNsYXNzVG9Mb2FkID0gb2JqLmdldENsYXNzKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kID0gY2xhc3NUb0xvYWQuZ2V0TWV0aG9kKFNFUlZJQ0VfREVTVFJPWV9NRVRIT0QsIG5ldyBDbGFzc1tde1NlcnZpY2VDb250ZXh0LmNsYXNzfSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vV2UgZG8gbm90IG5lZWQgdG8gaW5mb3JtIHRoaXMgdG8gdXNlciAsIHNpbmNlIHRoaXMgc29tZXRoaW5nCi0gICAgICAgICAgICAgICAgLy8gQXhpczIgaXMgY2hlY2tpbmcgdG8gc3VwcG9ydCBTZXNzaW9uLiBTbyBpZiB0aGUgbWV0aG9kIGlzCi0gICAgICAgICAgICAgICAgLy8gbm90IHRoZXJlIHdlIHNob3VsZCBpZ25vcmUgdGhhdAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihtZXRob2QhPW51bGwpewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLCBuZXcgT2JqZWN0W117c2VydmljZUNvbnRleHR9KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gY2FsbCAiICsgU0VSVklDRV9ERVNUUk9ZX01FVEhPRCwgZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJFeGNlcHRpb24gdHJ5aW5nIHRvIGNhbGwgIiArIFNFUlZJQ0VfREVTVFJPWV9NRVRIT0QsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5OTYyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotLyoqDQotICogQSBEZXBsb3lhYmxlIGlzIGEgY29udGFpbmVyIGZvciBzb21ldGhpbmcgKFBoYXNlcywgSGFuZGxlcnMpIHdoaWNoIHdhbnRzDQotICogdG8gYmUgZGVwbG95ZWQgaW4gYW4gb3JkZXJlZCBhbmQgY29uc3RyYWluZWQgZmFzaGlvbiB2aWEgYQ0KLSAqIERlcGxveWFibGVDaGFpbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgRGVwbG95YWJsZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7DQotICAgIHByaXZhdGUgU3RyaW5nIHBoYXNlOw0KLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IHN1Y2Nlc3NvcnM7DQotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcHJlZGVjZXNzb3JzOw0KLSAgICANCi0gICAgYm9vbGVhbiBmaXJzdDsNCi0gICAgYm9vbGVhbiBsYXN0Ow0KLQ0KLSAgICBPYmplY3QgdGFyZ2V0Ow0KLQ0KLSAgICBwdWJsaWMgRGVwbG95YWJsZShTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRGVwbG95YWJsZShTdHJpbmcgbmFtZSwgT2JqZWN0IHRhcmdldCkgew0KLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBuYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFN1Y2Nlc3NvcihTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgaWYgKHN1Y2Nlc3NvcnMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHN1Y2Nlc3NvcnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotICAgICAgICB9DQotICAgICAgICBzdWNjZXNzb3JzLmFkZChuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRQcmVkZWNlc3NvcihTdHJpbmcgbmFtZSkgew0KLSAgICAgICAgaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7DQotICAgICAgICAgICAgcHJlZGVjZXNzb3JzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlZGVjZXNzb3JzLmFkZChuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJlZGVjZXNzb3JzKCkgew0KLSAgICAgICAgcmV0dXJuIHByZWRlY2Vzc29yczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3VjY2Vzc29ycygpIHsNCi0gICAgICAgIHJldHVybiBzdWNjZXNzb3JzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhhc2UoKSB7DQotICAgICAgICByZXR1cm4gcGhhc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGhhc2UoU3RyaW5nIHBoYXNlKSB7DQotICAgICAgICB0aGlzLnBoYXNlID0gcGhhc2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNGaXJzdCgpIHsNCi0gICAgICAgIHJldHVybiBmaXJzdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdChib29sZWFuIGZpcnN0KSB7DQotICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYXN0KCkgew0KLSAgICAgICAgcmV0dXJuIGxhc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdChib29sZWFuIGxhc3QpIHsNCi0gICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE9iamVjdCB0YXJnZXQpIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0KCkgew0KLSAgICAgICAgcmV0dXJuIHRhcmdldDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGVDaGFpbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc2Y2E1MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0RlcGxveWFibGVDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLS8qKg0KLSAqIEEgRGVwbG95YWJsZUNoYWluIGlzIGEgY29udGFpbmVyIHdoaWNoIG1hbmFnZXMgZGVwZW5kZW5jaWVzIGJldHdlZW4gRGVwbG95YWJsZXMuICBZb3UNCi0gKiBkZXBsb3koKSB0aGVtIGluLCB0aGVuIGNhbGwgcmVidWlsZCgpIHdoaWNoIHdpbGwgc2V0IHVwIGEgY2hhaW4sIGNvcnJlY3RseSBvcmRlcmVkIGFjY29yZGluZw0KLSAqIHRvIHRoZSBjb25zdHJhaW50cyBpbiB0aGUgRGVwbG95YWJsZXMuDQotICovDQotcHVibGljIGNsYXNzIERlcGxveWFibGVDaGFpbjxUPiB7DQotICAgIC8qKiBUaGUgYWN0dWFsIHRoaW5ncyAoaGFuZGxlcnMgb3IgcGhhc2VzKSAqLw0KLSAgICBMaXN0PE9iamVjdD4gY2hhaW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0gICAgRGVwbG95YWJsZSBmaXJzdDsNCi0gICAgRGVwbG95YWJsZSBsYXN0Ow0KLQ0KLSAgICAvKiogQSBNYXAgb2YgbmFtZSAtPiBMaXN0IChvZiBTdHJpbmdzKS4gIEVhY2ggTGlzdCBjb250YWlucyB0aGUga2V5J3Mgc3VjY2Vzc29ycyAqLw0KLSAgICBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gYWN0aXZlQ29uc3RyYWludHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PigpOw0KLQ0KLSAgICAvKiogQSBNYXAgb2YgbmFtZSAtPiBEZXBsb3lhYmxlIGZvciBhbGwgZGVwbG95ZWQgaXRlbXMgKi8NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBEZXBsb3lhYmxlPiBkZXBsb3llZCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgRGVwbG95YWJsZT4oKTsNCi0NCi0gICAgLyoqDQotICAgICAqIERlcGxveSBhIERlcGxveWFibGUgaW50byB0aGlzIGNoYWluLiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1Qgb3JkZXIgeWV0LiAgVGhlIGlkZWENCi0gICAgICogaXMgdG8gZGVwbG95IGV2ZXJ5dGhpbmcgZmlyc3QsIHRoZW4gY2FsbCByZWJ1aWxkKCkgdG8gZ2VuZXJhdGUgdGhlIGZ1bGx5IG9yZGVyZWQgY2hhaW4uDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgdmFsaWRhdGUgdGhlIERlcGxveWFibGUsIGluY2x1ZGluZyBjb25maXJtaW5nIHRoYXQgaXQncyBjb21wYXRpYmxlIHdpdGgNCi0gICAgICogYW55IHByZXZpb3VzbHkgZGVwbG95ZWQgaXRlbSBvZiB0aGUgc2FtZSBuYW1lLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZGVwbG95YWJsZSBEZXBsb3lhYmxlIHRvIGRlcGxveS4NCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBkZXBsb3ltZW50IGVycm9yLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgZGVwbG95KERlcGxveWFibGUgZGVwbG95YWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTdHJpbmcgbmFtZSA9IGRlcGxveWFibGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgU2V0PFN0cmluZz4gbXlTdWNjZXNzb3JzID0gZGVwbG95YWJsZS5nZXRTdWNjZXNzb3JzKCk7DQotICAgICAgICBTZXQ8U3RyaW5nPiBteVByZWRlY2Vzc29ycyA9IGRlcGxveWFibGUuZ2V0UHJlZGVjZXNzb3JzKCk7DQotDQotICAgICAgICBpZiAoZGVwbG95YWJsZS5pc0ZpcnN0KCkpIHsNCi0gICAgICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCInIiArIGZpcnN0LmdldE5hbWUoKSArICInIGlzIGFscmVhZHkgZmlyc3QsIGNhbid0IGRlcGxveSAnIiArDQotICAgICAgICAgICAgICAgICAgICBuYW1lICsgIicgYXMgZmlyc3QgYWxzby4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG15UHJlZGVjZXNzb3JzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRGVwbG95aW5nICciICsgbmFtZSArDQotICAgICAgICAgICAgICAgICAgICAgICAgIicgLSBjYW4ndCBib3RoIGJlIGZpcnN0IGFuZCBoYXZlIHByZWRlY2Vzc29ycyEiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZmlyc3QgPSBkZXBsb3lhYmxlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGRlcGxveWFibGUuaXNMYXN0KCkpIHsNCi0gICAgICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIiciICsgbGFzdC5nZXROYW1lKCkgKyAiJyBpcyBhbHJlYWR5IGxhc3QsIGNhbid0IGRlcGxveSAnIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArICInIGFzIGxhc3QgYWxzby4iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKG15U3VjY2Vzc29ycyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkRlcGxveWluZyAnIiArIG5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICInIC0gY2FuJ3QgYm90aCBiZSBsYXN0IGFuZCBoYXZlIHN1Y2Nlc3NvcnMhIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGxhc3QgPSBkZXBsb3lhYmxlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgRGVwbG95YWJsZSBwcmV2aW91cyA9IChEZXBsb3lhYmxlKWRlcGxveWVkLmdldChuYW1lKTsNCi0gICAgICAgIGlmIChwcmV2aW91cyA9PSBudWxsKSB7DQotICAgICAgICAgICAgZGVwbG95ZWQucHV0KG5hbWUsIGRlcGxveWFibGUpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgYnkgdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBlbnN1cmUgaXQncyBjb21wYXRpYmxlDQotICAgICAgICAgICAgaWYgKHByZXZpb3VzLmlzRmlyc3QoKSAhPSBkZXBsb3lhYmxlLmlzRmlyc3QoKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYW4ndCBkZXBsb3kgJyIgKyBuYW1lICsgIicsIHZhbHVlcyBmb3IgZmlyc3QgZG9uJ3QgbWF0Y2ghIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChwcmV2aW91cy5pc0xhc3QoKSAhPSBkZXBsb3lhYmxlLmlzTGFzdCgpKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IGRlcGxveSAnIiArIG5hbWUgKyAiJywgdmFsdWVzIGZvciBsYXN0IGRvbid0IG1hdGNoISIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBPYmplY3QgdGFyZ2V0ID0gcHJldmlvdXMuZ2V0VGFyZ2V0KCk7DQotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGlmIChkZXBsb3lhYmxlLmdldFRhcmdldCgpICE9IG51bGwgJiYgIXRhcmdldC5lcXVhbHMoZGVwbG95YWJsZS5nZXRUYXJnZXQoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNhbid0IGRlcGxveSAnIiArIG5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJywgIHRhcmdldHMgbXVzdCBlaXRoZXIgbWF0Y2ggb3IgYmUgbnVsbC4iKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHByZXZpb3VzLnNldFRhcmdldChkZXBsb3lhYmxlLmdldFRhcmdldCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobXlTdWNjZXNzb3JzICE9IG51bGwgJiYgIW15U3VjY2Vzc29ycy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWNjZXNzb3JzID0gYWN0aXZlQ29uc3RyYWludHMuZ2V0KG5hbWUpOw0KLSAgICAgICAgICAgIGlmIChzdWNjZXNzb3JzID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgc3VjY2Vzc29ycyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsNCi0gICAgICAgICAgICAgICAgYWN0aXZlQ29uc3RyYWludHMucHV0KG5hbWUsIHN1Y2Nlc3NvcnMpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBzdWNjZXNzb3JzLmFkZEFsbChteVN1Y2Nlc3NvcnMpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKG15UHJlZGVjZXNzb3JzICE9IG51bGwpIHsNCi0gICAgICAgICAgICBmb3IgKE9iamVjdCBteVByZWRlY2Vzc29yIDogbXlQcmVkZWNlc3NvcnMpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWRlY2Vzc29yID0gKFN0cmluZylteVByZWRlY2Vzc29yOw0KLSAgICAgICAgICAgICAgICAvLyBkZWZpbmUgcmVsYXRpb25zaGlwIGZvciBlYWNoIG9uZQ0KLSAgICAgICAgICAgICAgICBhZGRSZWxhdGlvbnNoaXAocHJlZGVjZXNzb3IsIG5hbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmluZCB0aGUgY29ycmVjdCAobWluaW11bSkgaW5kZXggZm9yIGEgZ2l2ZW4gbmFtZS4gIEZpbmRzIHRoZSBhY3RpdmUgY29uc3RyYWludHMNCi0gICAgICogZm9yIHRoZSBuYW1lLCB0aGVuIHdhbGtzIHRoYXQgbGlzdCwgbWFraW5nIHN1cmUgdGhhdCBlYWNoIG9uZSBpcyBhbHJlYWR5IHBsYWNlZC4NCi0gICAgICogSWYgYSBnaXZlbiBzdWNjZXNzb3IgaXNuJ3QgeWV0IHBsYWNlZCwgd2UgcmVjdXJzaXZlbHkgY2FsbCB0aGlzIG1ldGhvZCB0byBwbGFjZSBpdCwNCi0gICAgICogcGFzc2luZyBhIHNldCBvZiAid2hhdCdzIGxlZnQgdG8gZG8iIGFuZCBhIHNldCBvZiAid2hhdCB3ZSd2ZSBzZWVuIi4NCi0gICAgICoNCi0gICAgICogVGhpcyByZXN1bHRzIGluIGNoYWluIGNvbnRhaW5pbmcgdGhlIG5hbWVzIChTdHJpbmdzKS4NCi0gICAgICoNCi0gICAgICogVE9ETzogaW52ZXN0aWdhdGUgb3B0aW1pemluZyB0aGlzIGFsZ29yaXRobSBhIGJpdA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdGFyZ2V0IGRlcGxveWFibGUncyBuYW1lDQotICAgICAqIEBwYXJhbSByZW1haW5pbmcgYSBTZXQgb2YgdGhlIG5hbWVzIG9mIHRoaW5ncyB3ZSBoYXZlIHlldCB0byBkZXBsb3kNCi0gICAgICogQHBhcmFtIHNlZW4gYSBTZXQgb2YgdGhlIG5hbWVzIG9mIHRoaW5ncyB3ZSd2ZSBhbHJlYWR5IHNlZW4gKHRvIGRldGVjdCBsb29wcykNCi0gICAgICogQHJldHVybiBhbiBpbmRleCA+PTAgb3IgLTEgaWYgdGhlcmUgd2FzIGEgZGVwZW5kZW5jeSBjeWNsZQ0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSdzIGEgY3ljbGljIGRlcGVuZGVuY3kNCi0gICAgICovDQotICAgIHByaXZhdGUgaW50IGdldE1pbkluZGV4KFN0cmluZyBuYW1lLCBTZXQ8U3RyaW5nPiByZW1haW5pbmcsIFNldDxTdHJpbmc+IHNlZW4pIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgaWYgKHNlZW4uY29udGFpbnMobmFtZSkpIHsNCi0gICAgICAgICAgICAvLyBXZSByZXR1cm4gLTEgaGVyZSBpbnN0ZWFkIG9mIHRocm93aW5nIHRoZSBFeGNlcHRpb24gc28gd2UgY2FuIGJ1aWxkIGEgYmV0dGVyDQotICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBiZWxvdy4NCi0gICAgICAgICAgICByZXR1cm4gLTE7DQotICAgICAgICB9DQotDQotICAgICAgICBTZXQ8U3RyaW5nPiBzdWNjZXNzb3JzID0gYWN0aXZlQ29uc3RyYWludHMuZ2V0KG5hbWUpOw0KLSAgICAgICAgaWYgKHN1Y2Nlc3NvcnMgPT0gbnVsbCB8fCBzdWNjZXNzb3JzLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIC8vIE5ldmVyIHB1dCBhbnl0aGluZyBhZnRlciB0aGUgdGhpbmcgbWFya2VkICJsYXN0Ii4uLg0KLSAgICAgICAgICAgIGludCBpbmRleCA9IChsYXN0ID09IG51bGwpID8gY2hhaW4uc2l6ZSgpIDogY2hhaW4uc2l6ZSgpIC0gMTsNCi0gICAgICAgICAgICBjaGFpbi5hZGQoaW5kZXgsIG5hbWUpOw0KLSAgICAgICAgICAgIHJlbWFpbmluZy5yZW1vdmUobmFtZSk7DQotICAgICAgICAgICAgcmV0dXJuIGluZGV4Ow0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaW50IG1pbkluZGV4ID0gLTE7DQotICAgICAgICBmb3IgKE9iamVjdCBzdWNjZXNzb3IgOiBzdWNjZXNzb3JzKSB7DQotICAgICAgICAgICAgU3RyaW5nIG90aGVyTmFtZSA9IChTdHJpbmcpc3VjY2Vzc29yOw0KLSAgICAgICAgICAgIGludCBvdGhlcklkeCA9IGNoYWluLmluZGV4T2Yob3RoZXJOYW1lKTsNCi0gICAgICAgICAgICBpZiAob3RoZXJJZHggPiAtMSkgew0KLSAgICAgICAgICAgICAgICBpZiAoKG1pbkluZGV4ID09IC0xKSB8fCAobWluSW5kZXggPiBvdGhlcklkeCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gb3RoZXJJZHg7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGd1eSBpc24ndCBpbiBvdXIgbGlzdCB5ZXQgLSBwdXQgaGltIGluIElGIGhlJ3MgcmVhbCAoZXhpc3RzIGluDQotICAgICAgICAgICAgICAgIC8vIHRoZSBkZXBsb3llZCBsaXN0KSBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IHBsYWNlZCBoaW0gKGV4aXN0cyBpbg0KLSAgICAgICAgICAgICAgICAvLyB0aGUgcmVtYWluaW5nIHNldCkuDQotICAgICAgICAgICAgICAgIGlmICgoZGVwbG95ZWQuZ2V0KG90aGVyTmFtZSkgIT0gbnVsbCkgJiYgcmVtYWluaW5nLmNvbnRhaW5zKG90aGVyTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKG5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IGluIGxpc3QgeWV0LCBnbyBwbGFjZSBpdA0KLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbiA9IGdldE1pbkluZGV4KG90aGVyTmFtZSwgcmVtYWluaW5nLCBzZWVuKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChtaW5JbmRleCA9PSAtMSB8fCBtaW4gPCBtaW5JbmRleCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gbWluOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pbkluZGV4ID09IC0xKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVHJ5aW5nIHRvIHB1dCAnIiArIG5hbWUgKyAiJyBiZWZvcmUgJyIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJOYW1lICsgIicgLSBpbmNvbXBhdGlibGUgY29uc3RyYWludHMhIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAobWluSW5kZXggPT0gLTEpIG1pbkluZGV4ID0gMDsNCi0NCi0gICAgICAgIGNoYWluLmFkZChtaW5JbmRleCwgbmFtZSk7DQotICAgICAgICByZW1haW5pbmcucmVtb3ZlKG5hbWUpOw0KLQ0KLSAgICAgICAgcmV0dXJuIG1pbkluZGV4Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUYWtpbmcgaW50byBhY2NvdW50IGFsbCB0aGUgYWN0aXZlIGNvbnN0cmFpbnRzLCBvcmRlciB0aGUgbGlzdC4gIFRoaXMgYmxvd3MNCi0gICAgICogYXdheSB0aGUgb2xkIG9yZGVyLiAgQ291bGQgaW1wcm92ZSB0aGlzIHNsaWdodGx5IHdpdGggYSAiZGlydHkiIGZsYWcuDQotICAgICAqDQotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW4gb3JkZXJpbmcgY29uZmxpY3QNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJlYnVpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGNoYWluLmNsZWFyKCk7DQotDQotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAga2V5cy5hZGRBbGwoZGVwbG95ZWQua2V5U2V0KCkpOw0KLQ0KLSAgICAgICAgLy8gRmlyc3QgZ29lcyBmaXJzdC4NCi0gICAgICAgIGlmIChmaXJzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgY2hhaW4uYWRkKGZpcnN0LmdldE5hbWUoKSk7DQotICAgICAgICAgICAga2V5cy5yZW1vdmUoZmlyc3QuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIExhc3QgZ29lcyBuZXh0LCBhbmQgZXZlcnl0aGluZyBlbHNlIHdpbGwgZ2V0IGluc2VydGVkIGJlZm9yZSBpdCBpZiBpdCBleGlzdHMuDQotICAgICAgICBpZiAobGFzdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgU2V0PFN0cmluZz4gYWZ0ZXJMYXN0ID0gYWN0aXZlQ29uc3RyYWludHMuZ2V0KGxhc3QuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICBpZiAoYWZ0ZXJMYXN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2FuJ3QgaGF2ZSBhbnl0aGluZyB3aGljaCBnb2VzIGFmdGVyICciICsgbGFzdC5nZXROYW1lKCkgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICInLCB3aGljaCBoYXMgYmVlbiBkZWNsYXJlZCBsYXN0LiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjaGFpbi5hZGQobGFzdC5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIGtleXMucmVtb3ZlKGxhc3QuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHdoaWxlICgha2V5cy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpa2V5cy5pdGVyYXRvcigpLm5leHQoKTsNCi0gICAgICAgICAgICBnZXRNaW5JbmRleChuYW1lLCBrZXlzLCBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8gTm93IHdlJ3ZlIGdvdCBhIGNoYWluIG9mIG5hbWVzLiAgQ29udmVydCB0byBhY3R1YWwgdGhpbmdzIGJlZm9yZSB3ZSByZXR1cm4uDQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYWluLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWNoYWluLmdldChpKTsNCi0gICAgICAgICAgICBjaGFpbi5zZXQoaSwgKChEZXBsb3lhYmxlKWRlcGxveWVkLmdldChuYW1lKSkuZ2V0VGFyZ2V0KCkpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBBZGRzIGEgYmVmb3JlL2FmdGVyIHJlbGF0aW9uc2hpcCB0byB0aGUgYWN0aXZlIGNvbnN0cmFpbnRzLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gYmVmb3JlIG5hbWUgb2YgdGhlIERlcGxveWFibGUgdGhhdCBtdXN0IGNvbWUgZmlyc3QNCi0gICAgICogQHBhcmFtIGFmdGVyIG5hbWUgb2YgdGhlIERlcGxveWFibGUgdGhhdCBtdXN0IGNvbWUgbGF0ZXINCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGFkZFJlbGF0aW9uc2hpcChTdHJpbmcgYmVmb3JlLCBTdHJpbmcgYWZ0ZXIpIHsNCi0gICAgICAgIFNldDxTdHJpbmc+IHN1Y2Nlc3NvcnMgPSBhY3RpdmVDb25zdHJhaW50cy5nZXQoYmVmb3JlKTsNCi0gICAgICAgIGlmIChzdWNjZXNzb3JzID09IG51bGwpIHsNCi0gICAgICAgICAgICBzdWNjZXNzb3JzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOw0KLSAgICAgICAgICAgIGFjdGl2ZUNvbnN0cmFpbnRzLnB1dChiZWZvcmUsIHN1Y2Nlc3NvcnMpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgc3VjY2Vzc29ycy5hZGQoYWZ0ZXIpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXQgdGhlIGNoYWluIC0gb25jZSByZWJ1aWxkKCkgaGFzIGJlZW4gY2FsbGVkIHRoaXMgd2lsbCBiZSB0aGUgY2hhaW4gb2YgdGFyZ2V0IG9iamVjdHMuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gYSBMaXN0IG9mIHRhcmdldCBvYmplY3RzIGluIHRoZSBjb3JyZWN0IG9yZGVyDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxUPiBnZXRDaGFpbigpIHsNCi0gICAgICAgIC8vIHRvZG8gLSBzaG91bGQgdGhpcyBjYWxsIHJlYnVpbGQoKSBhdXRvbWF0aWNhbGx5IChpZiBkaXJ0eSBmbGFnIGlzIHNldCk/DQotICAgICAgICByZXR1cm4gKExpc3Q8VD4pIGNoYWluOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGlzcGF0Y2hQaGFzZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EaXNwYXRjaFBoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZWU1NGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EaXNwYXRjaFBoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRGlzcGF0Y2hQaGFzZSBleHRlbmRzIFBoYXNlIHsKLQotICAgIHB1YmxpYyBEaXNwYXRjaFBoYXNlKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBEaXNwYXRjaFBoYXNlKFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgc3VwZXIocGhhc2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Bvc3RDb25kaXRpb25zKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0b0VQUiA9IG1zZ0NvbnRleHQuZ2V0VG8oKTsKLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNGYXVsdCBmYXVsdCA9IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZW5vdGZvdW5kZm9yZXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRvRVBSICE9IG51bGwpID8gdG9FUFIuZ2V0QWRkcmVzcygpIDogIiIpKSk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUob3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzLkZBVUxUX0NMSUVOVCk7Ci0gICAgICAgICAgICB0aHJvdyBmYXVsdDsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIC8vIElmIHdlJ3JlIGNvbmZpZ3VyZWQgdG8gZG8gc28sIGNoZWNrIHRoZSBzZXJ2aWNlIGZvciBhIHNpbmdsZSBvcC4uLgotICAgICAgICBpZiAob3BlcmF0aW9uID09IG51bGwgJiYKLSAgICAgICAgICAgICAgICBKYXZhVXRpbHMuaXNUcnVlKHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoQXhpc1NlcnZpY2UuU1VQUE9SVF9TSU5HTEVfT1ApKSkgewotICAgICAgICAgICAgSXRlcmF0b3I8QXhpc09wZXJhdGlvbj4gb3BzID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGV4YWN0bHkgb25lLCB0aGF0J3MgdGhlIG9uZSB3ZSB3YW50LiAgSWYgdGhlcmUncyBtb3JlLCBmb3JnZXQgaXQuCi0gICAgICAgICAgICBpZiAob3BzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKW9wcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEF4aXNPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgYW4gb3BlcmF0aW9uLCBmYXVsdC4KLSAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzRmF1bHQgZmF1bHQgPSBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm9wZXJhdGlvbm5vdGZvdW5kZm9yZXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRvRVBSICE9IG51bGwpID8gdG9FUFIuZ2V0QWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIiKSwgbXNnQ29udGV4dC5nZXRXU0FBY3Rpb24oKSkpOwotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5GQVVMVF9DTElFTlQpOwotICAgICAgICAgICAgdGhyb3cgZmF1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2YWxpZGF0ZVRyYW5zcG9ydChtc2dDb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIHZhbGlkYXRlQmluZGluZ3MobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgbG9hZENvbnRleHRzKHNlcnZpY2UsIG1zZ0NvbnRleHQpOwotCi0gICAgICAgIGlmIChtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbm5vdEJlTnVsbE9wZXJhdGlvbkNvbnRleHQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2Fubm90QmVOdWxsU2VydmljZUNvbnRleHQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIC0gcmV2aWV3IHRoaXMKLSAgICAgICAgaWYgKChtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSA9PSBudWxsKSAmJiAobXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0QXhpc09wZXJhdGlvbihtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkgPT0gbnVsbCkgJiYgKG1zZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRBeGlzU2VydmljZShtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCkuZ2V0QXhpc1NlcnZpY2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBzaG91bGQgc2VuZCBhbiBlYXJseSBhY2sgdG8gdGhlIHRyYW5zcG9ydCB3aGV2ZXIgcG9zc2libGUsIGJ1dCBzb21lIG1vZHVsZXMgbmVlZAotICAgICAgICAvLyB0byB1c2UgdGhlIGJhY2tjaGFubmVsLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHRoZXkgaGF2ZSBkaXNhYmxlZCB0aGlzIGNvZGUuCi0gICAgICAgIEJvb2xlYW4gZGlzYWJsZUFjayA9IChCb29sZWFuKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfUkVTUE9OU0VfQUNLKTsKLSAgICAgICAgaWYoZGlzYWJsZUFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNhYmxlQWNrID0gKEJvb2xlYW4pIChtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkgIT0gbnVsbCA/IAotICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNQT05TRV9BQ0spIDogbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKGRpc2FibGVBY2sgPT0gbnVsbCB8fCBkaXNhYmxlQWNrLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0gICAgICAgIAlTdHJpbmcgbWVwU3RyaW5nID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICAJaWYgKGlzT25ld2F5KG1lcFN0cmluZykpIHsKLQkgICAgICAgICAgICBPYmplY3QgcmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0ID0KLQkgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKTsKLQkgICAgICAgICAgICBpZiAocmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0ICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgKChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpIHJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCkuYWNrbm93bGVkZ2VNZXNzYWdlKG1zZ0NvbnRleHQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0gZWxzZSBpZiAobWVwU3RyaW5nLmVxdWFscyhXU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVCkKLQkgICAgICAgICAgICAgICAgfHwgbWVwU3RyaW5nLmVxdWFscyhXU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PVVQpCi0JICAgICAgICAgICAgICAgIHx8IG1lcFN0cmluZy5lcXVhbHMoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQpKSB7IC8vIE9SLCBpZiAyIHdheSBvcGVyYXRpb24gYnV0IHRoZSByZXNwb25zZSBpcyBpbnRlbmRlZCB0byBub3QgdXNlIHRoZSByZXNwb25zZSBjaGFubmVsIG9mIGEgMi13YXkgdHJhbnNwb3J0Ci0JICAgICAgICAgICAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgdGhlIHRyYW5zcG9ydCB3YWl0aW5nLgotCSAgICAgICAgICAgIE9iamVjdCByZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgPQotCSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuVFJBTlNQT1JUX0NPTlRST0wpOwotCSAgICAgICAgICAgIGlmIChyZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICBpZiAoQWRkcmVzc2luZ0hlbHBlci5pc1JlcGx5UmVkaXJlY3RlZChtc2dDb250ZXh0KQotCSAgICAgICAgICAgICAgICAgICAgICAgICYmIEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobXNnQ29udGV4dCkpIHsKLQkgICAgICAgICAgICAgICAgICAgICgoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KSByZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpLmFja25vd2xlZGdlTWVzc2FnZShtc2dDb250ZXh0KTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0gICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotCi0gICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25DaGFpbiA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpOwotICAgICAgICBtc2dDb250ZXh0LnNldEV4ZWN1dGlvbkNoYWluKChBcnJheUxpc3QpIG9wZXJhdGlvbkNoYWluLmNsb25lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkQ29udGV4dHMoQXhpc1NlcnZpY2Ugc2VydmljZSwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBzY29wZSA9IHNlcnZpY2UgPT0gbnVsbCA/IG51bGwgOiBzZXJ2aWNlLmdldFNjb3BlKCk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotCi0gICAgICAgIGlmICgobXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dElkKAotICAgICAgICAgICAgICAgICAgICAoKFNlcnZpY2VHcm91cENvbnRleHQpc2VydmljZUNvbnRleHQuZ2V0UGFyZW50KCkpLmdldElkKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgZmlsbENvbnRleHRzRnJvbVNlc3Npb25Db250ZXh0KG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKENvbnN0YW50cy5TQ09QRV9TT0FQX1NFU1NJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgZXh0cmFjdFNlcnZpY2VHcm91cENvbnRleHRJZChtc2dDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG1zZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotLy8gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLS8vICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgIH0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmZpbmRGb3JFeGlzdGluZ09wZXJhdGlvbkNvbnRleHQobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gcmVnaXN0ZXIgb3BlcmF0aW9uIGNvbnRleHQgYW5kIG1lc3NhZ2UgY29udGV4dAotLy8gICAgICAgICAgICBheGlzT3BlcmF0aW9uLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dChtc2dDb250ZXh0LCBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCBvcGVyYXRpb25Db250ZXh0KTsKLQotICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSAoU2VydmljZUNvbnRleHQpIG9wZXJhdGlvbkNvbnRleHQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZUdyb3VwQ29udGV4dCkgc2VydmljZUNvbnRleHQuZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoc2VydmljZUdyb3VwQ29udGV4dC5nZXRJZCgpKTsKLSAgICAgICAgfSBlbHNlIHsgICAgLy8gMi4gaWYgbnVsbCwgY3JlYXRlIG5ldyBvcEN0eHQKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlsbCB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IGFuZCBzZXJ2aWNlIGNvbnRleHQgaW5mbwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxTZXJ2aWNlQ29udGV4dEFuZFNlcnZpY2VHcm91cENvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHQgPSBtc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25Db250ZXh0ID0gc2VydmljZUNvbnRleHQuY3JlYXRlT3BlcmF0aW9uQ29udGV4dChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIGF4aXNPcGVyYXRpb24ucmVnaXN0ZXJNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0LCBvcGVyYXRpb25Db250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHNlcnZpY2VDb250ZXh0LnNldE15RVBSKG1zZ0NvbnRleHQuZ2V0VG8oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2V0aGVyIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhhcyBjb21lIGluIHZhbGlkIHRyYW5zcG9ydCAsIHNpbXBsZXkgdGhlIHRyYW5zcG9ydHMKLSAgICAgKiB0aGF0IHNlcnZpY2UgYXV0aG9yIHdhbnRzIHRvIGV4cG9zZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ2N0eCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUcmFuc3BvcnQoTWVzc2FnZUNvbnRleHQgbXNnY3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZS5pc0VuYWJsZUFsbFRyYW5zcG9ydHMoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTGlzdCB0cnMgPSBzZXJ2aWNlLmdldEV4cG9zZWRUcmFuc3BvcnRzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgaW5jb21taW5nVHJzID0gbXNnY3R4LmdldEluY29taW5nVHJhbnNwb3J0TmFtZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHIgPSAoU3RyaW5nKSB0cnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpbmNvbW1pbmdUcnMgIT0gbnVsbCAmJiBpbmNvbW1pbmdUcnMuZXF1YWxzKHRyKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRvRVBSID0gbXNnY3R4LmdldFRvKCk7Ci0gICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZW5vdGZvdW5kZm9yZXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodG9FUFIgIT0gbnVsbCkgPyB0b0VQUi5nZXRBZGRyZXNzKCkgOiAiIikpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVG8gY2hlY2sgd2hldGhlciB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgY29tZSBpbiB2YWxpZCBiaW5kaW5nICwgd2UgY2hlY2sgd2hldGhlciBzZXJ2aWNlCi0gICAgICogYXV0aG9yIGhhcyBkaXNhYmxlZCBhbnkgYmluZGluZyB1c2luZyBwYXJhbWV0ZXJzCi0gICAgICogPGNvZGU+b3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVAxMjwvY29kZT4KLSAgICAgKiA8Y29kZT5vcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUDExPC9jb2RlPgotICAgICAqIDxjb2RlPm9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUPC9jb2RlPgotICAgICAqIEBwYXJhbSBzZXJ2aWNlIG1zZ2N0eCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ2N0eC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBkaXNhYmxlUkVTVCA9IGZhbHNlOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZVJFU1RQYXJhbWV0ZXIgPSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsKLSAgICAgICAgaWYgKGRpc2FibGVSRVNUUGFyYW1ldGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGRpc2FibGVSRVNUUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVJFU1QgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTEgPSBmYWxzZTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVTT0FQMTFQYXJhbWV0ZXIgPSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTEpOwotICAgICAgICBpZiAoZGlzYWJsZVNPQVAxMVBhcmFtZXRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDExUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVNPQVAxMSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGRpc2FibGVTT0FQMTIgPSBmYWxzZTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVTT0FQMTJQYXJhbWV0ZXIgPSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQMTIpOwotICAgICAgICBpZiAoZGlzYWJsZVNPQVAxMlBhcmFtZXRlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBKYXZhVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaXNUcnVlRXhwbGljaXRseShkaXNhYmxlU09BUDEyUGFyYW1ldGVyLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVNPQVAxMiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChtc2djdHguaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgaWYgKGRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJiaW5kaW5nRGlzYWJsZWQiLCJIdHRwIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1zZ2N0eC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBpZiAoZGlzYWJsZVNPQVAxMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ0Rpc2FibGVkIiwiU09BUDExIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYoZGlzYWJsZVNPQVAxMikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYmluZGluZ0Rpc2FibGVkIiwiU09BUDEyIikpOyAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxDb250ZXh0c0Zyb21TZXNzaW9uQ29udGV4dChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1bmFibGV0b2ZpbmRzZXJ2aWNlIikpOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXNzaW9uQ29udGV4dCgpOwotICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgbGlzdGVuZXIgPSBtc2dDb250ZXh0LmdldFRyYW5zcG9ydEluKCkuZ2V0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIHNlc3Npb25Db250ZXh0ID0gbGlzdGVuZXIuZ2V0U2Vzc2lvbkNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNyZWF0ZUFuZEZpbGxDb250ZXh0cyhzZXJ2aWNlLCBtc2dDb250ZXh0LCBzZXNzaW9uQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlR3JvdXBOYW1lID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZUdyb3VwKCkuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNlcnZpY2VHcm91cENvbnRleHQgPQotICAgICAgICAgICAgICAgIHNlc3Npb25Db250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoc2VydmljZUdyb3VwTmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vc2V0dGluZyBzZXJ2aWNlIGdyb3VwIGNvbnRleHQKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgIC8vIHNldHRpbmcgU2VydmljZSBjb250ZXh0Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZpY2VDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3JlYXRlQW5kRmlsbENvbnRleHRzKHNlcnZpY2UsIG1zZ0NvbnRleHQsIHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNlc3Npb25Db250ZXh0LmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotICAgICAgICAvL2ZvdW5kIHRoZSBzZXJ2aWNlQ29udGV4dCBmcm9tIHNlc3Npb24gY29udGV4dCAsIHNvIGFkZGluZyB0aGF0IGludG8gbXNnQ29udGV4dAotICAgICAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlQ29udGV4dCk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPT0tJRV9TVFJJTkcsIHNlc3Npb25Db250ZXh0LmdldENvb2tpZUlEKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEZpbGxDb250ZXh0cyhBeGlzU2VydmljZSBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZXJ2aWNlR3JvdXBDb250ZXh0OwotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSBzZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gY29uZmlnQ3R4LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoYXhpc1NlcnZpY2VHcm91cCk7Ci0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VHcm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoc2VydmljZSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuYWRkU2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuYWRkU2VydmljZUdyb3VwQ29udGV4dChzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFFOYW1lIFNFUlZJQ0VfR1JPVVBfUU5BTUUgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0VSVklDRV9HUk9VUF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfUFJFRklYKTsKLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0U2VydmljZUdyb3VwQ29udGV4dElkKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQSGVhZGVyIHNvYXBIZWFkZXIgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChzb2FwSGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBzZXJ2aWNlR3JvdXBJZCA9IHNvYXBIZWFkZXIuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKFNFUlZJQ0VfR1JPVVBfUU5BTUUpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VHcm91cElkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZpY2VHcm91cENvbnRleHRJZChzZXJ2aWNlR3JvdXBJZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZGV0ZXJtaW5lIGlmIHRoZSBNRVAgaW5kaWNhdGVkIGJ5ICdtZXBTdHJpbmcnIHNwZWNpZmllcwotICAgICAqIGEgb25ld2F5IE1FUC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzT25ld2F5KFN0cmluZyBtZXBTdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIChtZXBTdHJpbmcuZXF1YWxzKFdTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSkKLSAgICAgICAgICAgICAgICB8fCBtZXBTdHJpbmcuZXF1YWxzKFdTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpCi0gICAgICAgICAgICAgICAgfHwgbWVwU3RyaW5nLmVxdWFscyhXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWMzNGZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyB0aGUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXJnZXQgZW5kcG9pbnQgVVJMLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlcgotICovCi1wdWJsaWMgY2xhc3MgSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9IYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYTg3ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLS8qKgotICogQSBIYW5kbGVyIHJlcHJlc2VudHMgYSBwaWVjZSBvZiBtZXNzYWdlIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eSBpbiBBeGlzMi4KLSAqCi0gKiBIYW5kbGVycyBhcmUgY29tYmluZWQgaW50byBjaGFpbnMgYW5kIHBoYXNlcyBpbiBvcmRlciB0byBwcm92aWRlIGN1c3RvbWl6YWJsZSBmdW5jdGlvbmFsaXR5Ci0gKiBzdWNoIGFzIHNlY3VyaXR5LCByZWxpYWJpbGl0eSwgZXRjLiAgSGFuZGxlcnMgbXVzdCBiZSBtdWx0aS10aHJlYWQgc2FmZSBhbmQgc2hvdWxkIGtlZXAgYWxsCi0gKiB0aGVpciBzdGF0ZSBpbiBDb250ZXh0IG9iamVjdHMgKHNlZSB0aGUgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0IHBhY2thZ2UpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgd2lsbCBiZSBnb2luZyBhd2F5IGFmdGVyIHRoZSAxLjMgcmVsZWFzZSwgaXQgd2FzIG5ldmVyIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhIEhhbmRsZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlckRlc2MgdGhlIEhhbmRsZXJEZXNjcmlwdGlvbiBmb3IgdGhpcyBIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlckRlc2MpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCByZWdpc3RlcmVkIGhhbmRsZXIgd2hlbiBhIG1lc3NhZ2UKLSAgICAgKiBuZWVkcyB0byBiZSBwcm9jZXNzZWQuICBJZiB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nIGlzIHBhdXNlZCBieSB0aGUKLSAgICAgKiBoYW5kbGVyLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFnYWluIGZvciB0aGUgaGFuZGxlciB0aGF0Ci0gICAgICogcGF1c2VkIHRoZSBwcm9jZXNzaW5nIG9uY2UgaXQgaXMgcmVzdW1lZC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAqIDxwLz4KLSAgICAgKiBIYW5kbGVycyB0aGF0IHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG1lc3NhZ2UgdGhhdCBpcyB0byBiZQotICAgICAqIHByb2Nlc3NlZCAoZS5nLiByZXNwb25zZSB2cyByZXF1ZXN0LCBpbmJvdW5kIHZzLiBvdXRib3VuZCwgZXRjLikgY2FuCi0gICAgICogcmV0cmlldmUgdGhhdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBNZXNzYWdlQ29udGV4dCB2aWEKLSAgICAgKiBNZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgYW5kCi0gICAgICogTWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSBBUElzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPiB0byBwcm9jZXNzIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkhhbmRsZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIHRoYXQgaW5kaWNhdGVzIHdoYXQKLSAgICAgKiAgICAgICAgIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIG1lc3NhZ2UgcHJvY2Vzc2luZyBzaG91bGQgYmUuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgdGhlIGhhbmRsZXIgZW5jb3VudGVycyBhbiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIHJlZ2lzdGVyZWQgaGFuZGxlciB0aGF0IGhhZCBpdHMKLSAgICAgKiBpbnZva2UoLi4uKSBtZXRob2QgY2FsbGVkIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbWVzc2FnZSwgb25jZQotICAgICAqIHRoZSBtZXNzYWdlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZC4gIER1cmluZyBleGVjdXRpb24gb2YgdGhlCi0gICAgICogZmxvd0NvbXBsZXRlJ3MsIGhhbmRsZXJzIGFyZSBpbnZva2VkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciB0aGF0IHRoZXkKLSAgICAgKiB3ZXJlIGludm9rZWQgb3JpZ2luYWxseS4gIE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgU0hPVUxEIGNoZWNrCi0gICAgICogbXNnQ29udGV4dC5nZXRGYWlsdXJlUmVhc29uKCkgdG8gc2VlIGlmIHRoaXMgaXMgYW4gZXJyb3Igb3IgYSBub3JtYWwKLSAgICAgKiBjb21wbGV0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIDxjb2RlPk1lc3NhZ2VDb250ZXh0PC9jb2RlPiB0byBwcm9jZXNzIHdpdGggdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgIDxjb2RlPkhhbmRsZXI8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZsb3dDb21wbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIEhhbmRsZXJEZXNjcmlwdGlvbiBvZiBhIGhhbmRsZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgSGFuZGxlckRlc2NyaXB0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyRGVzY3JpcHRpb24gZ2V0SGFuZGxlckRlc2MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIEhhbmRsZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGhhbmRsZXIncyBuYW1lIGFzIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBQYXJhbWV0ZXIgZnJvbSB0aGlzIEhhbmRsZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHZhbHVlCi0gICAgICogQHJldHVybiB0aGUgUGFyYW1ldGVyLCBvciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgdHlwZSBlbmNhcHN1bGF0ZXMgYW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgbWVzc2FnZSBwcm9jZXNzaW5nCi0gICAgICogaW5zdHJ1Y3Rpb24gdmFsdWVzIHRoYXQgbWF5IGJlIHJldHVybmVkIGJ5IGEgaGFuZGxlci9waGFzZSB3aXRoaW4gdGhlCi0gICAgICogcnVudGltZS4gIFRoZSByZXR1cm5lZCBpbnN0cnVjdGlvbiB3aWxsIGRldGVybWluZSB0aGUgbmV4dCBzdGVwIGluCi0gICAgICogdGhlIHByb2Nlc3NpbmcuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGNsYXNzIEludm9jYXRpb25SZXNwb25zZSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW52b2NhdGlvblJlc3BvbnNlIENPTlRJTlVFID0KLSAgICAgICAgICAgICAgICBuZXcgSW52b2NhdGlvblJlc3BvbnNlKDAsICJJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUUiKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnZvY2F0aW9uUmVzcG9uc2UgU1VTUEVORCA9Ci0gICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25SZXNwb25zZSgxLCAiSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQiKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnZvY2F0aW9uUmVzcG9uc2UgQUJPUlQgPQotICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uUmVzcG9uc2UoMiwgIkludm9jYXRpb25SZXNwb25zZS5BQk9SVCIpOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IGluc3RydWN0aW9uSUQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gICAgICAgIHByaXZhdGUgSW52b2NhdGlvblJlc3BvbnNlKGludCBpbnN0cnVjdGlvbklELCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25JRCA9IGluc3RydWN0aW9uSUQ7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAJaWYodGhpcz09b2JqKSB7Ci0gICAgICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgICAgIAl9Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBJbnZvY2F0aW9uUmVzcG9uc2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvblJlc3BvbnNlIGluc3RhbmNlID0gKEludm9jYXRpb25SZXNwb25zZSkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIChpbnN0cnVjdGlvbklEID09IGluc3RhbmNlLmluc3RydWN0aW9uSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSW5zdGFuY2VEaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0luc3RhbmNlRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2Y3YTIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvSW5zdGFuY2VEaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLS8qKgotICogQnkgdGhlIHRpbWUgdGhlIGNvbnRyb2wgY29tZXMgdG8gdGhpcyBoYW5kbGVyLCB0aGUgZGlzcGF0Y2hpbmcgbXVzdCBoYXZlIGhhcHBlbmVkCi0gKiBzbyB0aGF0IHRoZSBtZXNzYWdlIGNvbnRleHQgY29udGFpbnMgdGhlIEF4aXNTZXJ2aWNlR3JvdXAsIEF4aXNTZXJ2aWNlIGFuZAotICogQXhpc09wZXJhdGlvbi4KLSAqIFRoaXMgd2lsbCB0aGVuIHRyeSB0byBmaW5kIHRoZSBDb250ZXh0cyBvZiBTZXJ2aWNlR3JvdXAsIFNlcnZpY2UgYW5kIHRoZSBPcGVyYXRpb24uCi0gKiBAZGVwcmVjYXRlZCBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIGhhcyBtb3ZlZCBpbnRvIHRoZSBEaXNwYXRjaFBoYXNlIHBvc3Rjb25kaXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW5jZURpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogVGhpcyBkb2Vzbid0IGRvIGFueXRoaW5nLCBhcyB0aGUgZnVuY3Rpb25hbGl0eSBpcyBub3cgaW4gRGlzcGF0Y2hQaGFzZS5jaGVja1Bvc3RDb25kaXRpb25zKCkKLSAgICAgKiBUaGUgY2xhc3MgcmVtYWlucyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb2YgYXhpczIueG1sIGZpbGVzLCBidXQgaXQgc2hvdWxkIGdvIGF3YXkgYWZ0ZXIKLSAgICAgKiAxLjMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgPGNvZGU+TWVzc2FnZUNvbnRleHQ8L2NvZGU+IHRvIHByb2Nlc3Mgd2l0aCB0aGlzIDxjb2RlPkhhbmRsZXI8L2NvZGU+LgotICAgICAqIEByZXR1cm4gQW4gSW52b2NhdGlvblJlc3BvbnNlIHRoYXQgaW5kaWNhdGVzIHdoYXQgdGhlIG5leHQgc3RlcCBpbiB0aGUgbWVzc2FnZSBwcm9jZXNzaW5nCi0gICAgICogICAgICAgICBzaG91bGQgYmUuCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCBpZiB0aGUgaGFuZGxlciBlbmNvdW50ZXJzIGFuIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9MaXN0ZW5lck1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTGlzdGVuZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDNlOGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9MaXN0ZW5lck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzLk1vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lck1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExpc3RlbmVyTWFuYWdlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICBwcm90ZWN0ZWQgTGlzdGVuZXJNYW5hZ2VyU2h1dGRvd25UaHJlYWQgc2h1dGRvd25Ib29rVGhyZWFkID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdGVuZXJNYW5hZ2VyIGdldERlZmF1bHRMaXN0ZW5lck1hbmFnZXIoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQuZ2V0TGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHg7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0TGlzdGVuZXI+IHN0YXJ0ZWRUcmFuc3BvcnRzID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0TGlzdGVuZXI+KCk7Ci0KLSAgICAvLyBXZSdyZSBzdG9wcGVkIGF0IGZpcnN0LgotICAgIHByaXZhdGUgYm9vbGVhbiBzdG9wcGVkID0gdHJ1ZTsKLQotICAgIC8vIG5lZWQgdG8gcHJlc2VydmUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgcmVxdWlyaW5nIGEgc2h1dGRvd24gaG9vawotICAgIHByaXZhdGUgYm9vbGVhbiBzaHV0ZG93bkhvb2tSZXF1aXJlZCA9IHRydWU7Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBpZiAodGhpcy5jb25maWdjdHggIT0gbnVsbCkgcmV0dXJuOwotCi0gICAgICAgIGNvbmZpZ0N0eC5zZXRUcmFuc3BvcnRNYW5hZ2VyKHRoaXMpOwotICAgICAgICB0aGlzLmNvbmZpZ2N0eCA9IGNvbmZpZ0N0eDsKLQotICAgICAgICAvLyBpbml0aWFsaXplIGFsbCB0aGUgdHJhbnNwb3J0IGxpc3RlbmVycwotICAgICAgICBmb3IgKE9iamVjdCBvIDogY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0c0luKCkudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9IChUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKW87Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgbGlzdGVuZXIgPSB0cmFuc3BvcnRJbi5nZXRSZWNlaXZlcigpOwotICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsICYmIHN0YXJ0ZWRUcmFuc3BvcnRzLmdldCh0cmFuc3BvcnRJbi5nZXROYW1lKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuaW5pdChjb25maWdjdHgsIHRyYW5zcG9ydEluKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWdjdHgoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWdjdHg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gZ2V0IGFuIEVQUiBmb3IgYSBnaXZlbiBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgICB0aGUgbmFtZSBvZiB0aGUgc2VydmljZQotICAgICAqIEBwYXJhbSBvcE5hbWUgICAgICAgIHRoZSBvcGVyYXRpb24gbmFtZQotICAgICAqIEBwYXJhbSB0cmFuc3BvcnROYW1lIHRoZSBuYW1lIG9mIHRoZSB0cmFuc3BvcnQsIG9yIG51bGwuCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUmZvclNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhbnNwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh0cmFuc3BvcnROYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHRyYW5zcG9ydE5hbWUpKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlbm90Zm91bmRpbnRoZXN5c3RlbSIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VydmljZS5pc0VuYWJsZUFsbFRyYW5zcG9ydHMoKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPFRyYW5zcG9ydExpc3RlbmVyPiBpdHJfc3QgPSBzdGFydGVkVHJhbnNwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdHJfc3QuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHRyYW5zcG9ydExpc3RlbmVyID0gaXRyX3N0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VbXSBlcFJzRm9yU2VydmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0TGlzdGVuZXIuZ2V0RVBSc0ZvclNlcnZpY2Uoc2VydmljZU5hbWUsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXBSc0ZvclNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVwUnNGb3JTZXJ2aWNlWzBdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBjYW4gYmUgZm91bmQgcmV0dXJuIG51bGwKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhwb3NlVHJhbnNwb3J0ID0gc2VydmljZS5nZXRFeHBvc2VkVHJhbnNwb3J0cygpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gc3RhcnRlZFRyYW5zcG9ydHMuZ2V0KGV4cG9zZVRyYW5zcG9ydC5nZXQoMCkpOwotCi0gICAgICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VbXSBlcHJzRm9yU2VydmljZTsKLSAgICAgICAgICAgICAgICBlcHJzRm9yU2VydmljZSA9IGxpc3RlbmVyLmdldEVQUnNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lLCBudWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXByc0ZvclNlcnZpY2UgIT0gbnVsbCA/IGVwcnNGb3JTZXJ2aWNlWzBdIDogbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJTiA9IGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc3BvcnRJbih0cmFuc3BvcnROYW1lKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gdHJzSU4uZ2V0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlW10gZXByc0ZvclNlcnZpY2U7Ci0gICAgICAgICAgICBlcHJzRm9yU2VydmljZSA9IGxpc3RlbmVyLmdldEVQUnNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBlcHJzRm9yU2VydmljZSAhPSBudWxsID8gZXByc0ZvclNlcnZpY2VbMF0gOiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFRvIHN0YXJ0IGFsbCB0aGUgdHJhbnNwb3J0cyAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgaWYgKCFzdG9wcGVkKSByZXR1cm47Ci0KLSAgICAgICAgaWYgKGNvbmZpZ2N0eCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkNhbid0IHN0YXJ0IHVuaW5pdGlhbGl6ZWQgTGlzdGVuZXJNYW5hZ2VyISIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChPYmplY3QgbyA6IGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydHNJbigpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSAoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbilvOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIGxpc3RlbmVyID0gdHJhbnNwb3J0SW4uZ2V0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBzdGFydGVkVHJhbnNwb3J0cy5nZXQodHJhbnNwb3J0SW4uZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRUcmFuc3BvcnRzLnB1dCh0cmFuc3BvcnRJbi5nZXROYW1lKCksIGxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzaHV0ZG93bkhvb2tUaHJlYWQgPT0gbnVsbCAmJiBpc1NodXRkb3duSG9va1JlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIHNodXRkb3duSG9va1RocmVhZCA9IG5ldyBMaXN0ZW5lck1hbmFnZXJTaHV0ZG93blRocmVhZCh0aGlzKTsKLSAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhzaHV0ZG93bkhvb2tUaHJlYWQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBzdG9wcGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0U3lzdGVtKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIGluaXQoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICBzdGFydCgpOwotICAgIH0KLQotICAgIC8qKiBTdG9wIGFsbCB0aGUgdHJhbnNwb3J0cyBhbmQgbm90aWZ5IG1vZHVsZXMgb2Ygc2h1dGRvd24uICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHN0b3BwZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSB0aGUgc2h1dGRvd24gaG9vawotICAgICAgICBpZiAoc2h1dGRvd25Ib29rVGhyZWFkICE9IG51bGwgJiYgc2h1dGRvd25Ib29rVGhyZWFkLmdldFN0YXRlKCkgIT0gVGhyZWFkLlN0YXRlLlJVTk5BQkxFKSB7Ci0gICAgICAgIAlSdW50aW1lLmdldFJ1bnRpbWUoKS5yZW1vdmVTaHV0ZG93bkhvb2soc2h1dGRvd25Ib29rVGhyZWFkKTsKLSAgICAgICAgICAgIHNodXRkb3duSG9va1RocmVhZCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE9iamVjdCBvIDogc3RhcnRlZFRyYW5zcG9ydHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHRyYW5zcG9ydExpc3RlbmVyID0gKFRyYW5zcG9ydExpc3RlbmVyKW87Ci0gICAgICAgICAgICB0cmFuc3BvcnRMaXN0ZW5lci5zdG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdG9wIHRoZSB0cmFuc3BvcnQgc2VuZGVycwotICAgICAgICBIYXNoTWFwPFN0cmluZywgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24+IG91dFRyYW5zcG9ydHMgPQotICAgICAgICAgICAgICAgIGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydHNPdXQoKTsKLSAgICAgICAgaWYgKG91dFRyYW5zcG9ydHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8VHJhbnNwb3J0T3V0RGVzY3JpcHRpb24+IHRyc0l0ciA9IG91dFRyYW5zcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0cnNJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gb3V0RGVzY3JpcHRpb24gPSB0cnNJdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFNlbmRlciBzZW5kZXIgPSBvdXREZXNjcmlwdGlvbi5nZXRTZW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VuZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZGVyLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTaHV0IGRvd24gdGhlIHNlcnZpY2VzCi0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSlvOwotICAgICAgICAgICAgU2VydmljZUxpZmVDeWNsZSBzZXJ2aWNlTGlmZUN5Y2xlID0gYXhpc1NlcnZpY2UuZ2V0U2VydmljZUxpZmVDeWNsZSgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VMaWZlQ3ljbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VMaWZlQ3ljbGUuc2h1dERvd24oY29uZmlnY3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFNodXQgZG93biB0aGUgbW9kdWxlcwotICAgICAgICBIYXNoTWFwPFN0cmluZywgQXhpc01vZHVsZT4gbW9kdWxlcyA9IGNvbmZpZ2N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8QXhpc01vZHVsZT4gbW9kdWxlaXRyID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1vZHVsZWl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUgPSBtb2R1bGVpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBheGlzTW9kdWxlLmdldE1vZHVsZSgpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtb2R1bGUuc2h1dGRvd24oY29uZmlnY3R4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnY3R4LmNsZWFudXBDb250ZXh0cygpOwotCi0gICAgICAgIHN0b3BwZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0cnNJbiAgIDogVHJhbnNwb3J0IGluIGRlc2NyaXB0aW9uICh3aGljaCBjb250YWlucyBUcmFuc3BvcnQgTGlzdGVuZXIpCi0gICAgICogQHBhcmFtIHN0YXJ0ZWQgOiB3aGV0aGVyIHRyYW5zcG9ydCBMaXN0ZW5lciBydW5uaW5nIG9yIG5vdAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IDogd2lsbCB0aHJvdyBBeGlzRmF1bHQgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGFydGVkKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkVHJhbnNwb3J0SW4odHJzSW4pOwotICAgICAgICBUcmFuc3BvcnRMaXN0ZW5lciB0cmFuc3BvcnRMaXN0ZW5lciA9IHRyc0luLmdldFJlY2VpdmVyKCk7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRMaXN0ZW5lci5pbml0KGNvbmZpZ2N0eCwgdHJzSW4pOwotICAgICAgICAgICAgICAgIHRyYW5zcG9ydExpc3RlbmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNodXRkb3duSG9va1RocmVhZCA9PSBudWxsICYmIGlzU2h1dGRvd25Ib29rUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBzaHV0ZG93bkhvb2tUaHJlYWQgPSBuZXcgTGlzdGVuZXJNYW5hZ2VyU2h1dGRvd25UaHJlYWQodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhzaHV0ZG93bkhvb2tUaHJlYWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGFydGVkVHJhbnNwb3J0cy5wdXQodHJzSW4uZ2V0TmFtZSgpLCB0cmFuc3BvcnRMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNMaXN0ZW5lclJ1bm5pbmcoU3RyaW5nIHRyYW5zcG9ydE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXJ0ZWRUcmFuc3BvcnRzLmdldCh0cmFuc3BvcnROYW1lKSAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RvcHBlZCgpIHsKLSAgICAgICAgcmV0dXJuIHN0b3BwZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHRoaXMuY29uZmlnY3R4LnNldFRyYW5zcG9ydE1hbmFnZXIobnVsbCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBzdGFydGVkVHJhbnNwb3J0cy52YWx1ZXMoKSkgewotICAgICAgICAgICAgVHJhbnNwb3J0TGlzdGVuZXIgdHJhbnNwb3J0TGlzdGVuZXIgPSAoVHJhbnNwb3J0TGlzdGVuZXIpbzsKLSAgICAgICAgICAgIHRyYW5zcG9ydExpc3RlbmVyLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnN0YXJ0ZWRUcmFuc3BvcnRzLmNsZWFyKCk7Ci0gICAgICAgIHRoaXMuY29uZmlnY3R4ID0gbnVsbDsKLSAgICAgICAgZGVmYXVsdENvbmZpZ3VyYXRpb25Db250ZXh0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NodXRkb3duSG9va1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gc2h1dGRvd25Ib29rUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2h1dGRvd25Ib29rUmVxdWlyZWQoYm9vbGVhbiBzaHV0ZG93bkhvb2tSZXF1aXJlZCkgewotICAgICAgICB0aGlzLnNodXRkb3duSG9va1JlcXVpcmVkID0gc2h1dGRvd25Ib29rUmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIExpc3RlbmVyTWFuYWdlclNodXRkb3duVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlcjsKLQotICAgICAgICBwdWJsaWMgTGlzdGVuZXJNYW5hZ2VyU2h1dGRvd25UaHJlYWQoTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlcikgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXJNYW5hZ2VyID0gbGlzdGVuZXJNYW5hZ2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyTWFuYWdlci5zdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTg0OTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9NZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotLyoqCi0gKiBBbiBpbnN0YW5jZSBvZiBNZXNzYWdlUmVjZWl2ZXIgY2FuIGJlIHNldHVwIHRvIHJlY2VpdmUgbWVzc2FnZXMuIFRoZSBhcHBsaWNhdGlvbiBsb2dpYyBoYXMgbm8gaW1wYWN0Ci0gKiBvbiB0aGUgQXhpcyBFbmdpbmUgaXRzZWxmLiBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gbG9naWMgdG8gZG8gd2hhdGV2ZXIgaXQgbmVlZHMuIEZvciBlLmcuCi0gKiB0aGUgTWVzc2FnZVJlY2VpdmVyIGNhbiBoYW5kbGUgYSBtZXNzYWdlLCBzZW5kIGEgcmVzcG9uc2UgYmFjayBhbmQvb3Igc2VuZCBvdGhlciBtZXNzYWdlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVjZWl2ZXIgewotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgdGhyb3dzIEF4aXNGYXVsdDsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U3VwcGxpZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvT2JqZWN0U3VwcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxNDE4Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL09iamVjdFN1cHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0U3VwcGxpZXIgewotICAgIC8qKgotICAgICAqIElmIHNvbWVvbmUgd2FudCB0byB3cml0ZSBzZXJ2aWNlIGltcGwgY2xhc3Mgd2l0aCBpbnRlcmZhY2UKLSAgICAgKiBiZWluZyB0aGVyZSBtZXRob2QgcGFyYW1ldGVyICwgdGhlbiBhdCB0aGUgdGltZSBvZiBkZXNlcmlsaXphdGlvbgotICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgcHJvdmlkZSB0aGUgaW1wbCBjbGFzcyBmb3IgdGhhdCBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhenogVHlwZQotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCA6IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcKLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0T2JqZWN0KENsYXNzIGNsYXp6KSB0aHJvd3MgQXhpc0ZhdWx0OwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QaGFzZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBjYTk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUGhhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QaGFzZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2dnaW5nQ29udHJvbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKLQotLyoqCi0gKiBBIFBoYXNlIGlzIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBIYW5kbGVycy4KLSAqLwotcHVibGljIGNsYXNzIFBoYXNlIGltcGxlbWVudHMgSGFuZGxlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfUEhBU0VTID0gIioiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgbG9nCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBoYXNlLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVidWdFbmFibGVkID0gTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGhhbmRsZXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEhhbmRsZXI+IGhhbmRsZXJzOwotCi0gICAgLyoqCi0gICAgICogQSBoYW5kbGVyIGhhcyBiZWVuIG1hcmtlZCBhcyBwcmVzZW50IGluIGJvdGggdGhlIGZpcnN0IHBoYXNlIGFuZCB0aGUgbGFzdCBwaGFzZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc09uZUhhbmRsZXI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZU5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBwaGFzZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUZpcnN0U2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBoYXNlRmlyc3RTZXQ7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUxhc3RTZXQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGhhc2VMYXN0U2V0OwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZSgpIHsKLSAgICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuYW1lZCBQaGFzZQotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlTmFtZSB0aGUgbmFtZSBmb3IgdGhpcyBQaGFzZQotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZShTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIGhhbmRsZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PEhhbmRsZXI+KCk7Ci0gICAgICAgIHRoaXMucGhhc2VOYW1lID0gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGhhbmRsZXIgdG8gdGhlIFBoYXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIEhhbmRsZXIgdG8gYWRkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgbG9nLmRlYnVnKCJIYW5kbGVyICIgKyBoYW5kbGVyLmdldE5hbWUoKSArICIgYWRkZWQgdG8gUGhhc2UgIiArIHBoYXNlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHBoYXNlTGFzdFNldCkgewotICAgICAgICAgICAgLy8gaGFuZGxlcnMuc2l6ZSgpIGNhbiBub3QgYmUgMCAsIHNpbmNlIHdoZW4gc2V0dGluZyBwaGFzZSBsYXN0IGl0IGlzIGFsd2F5cyA+IDAKLSAgICAgICAgICAgIGlmIChoYW5kbGVycy5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZCgwLCBoYW5kbGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXJzLnNpemUoKSAtIDIsIGhhbmRsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgSGFuZGxlckRlc2NyaXB0aW9uIHRvIHRoZSBQaGFzZQotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXJEZXNjIHRoZSBIYW5kbGVyRGVzY3JpcHRpb24gdG8gYWRkCi0gICAgICogQHRocm93cyBQaGFzZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYykgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3I8SGFuZGxlcj4gaGFuZGxlcnNfaXRyID0gZ2V0SGFuZGxlcnMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChoYW5kbGVyc19pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmQgPSAoSGFuZGxlcikgaGFuZGxlcnNfaXRyLm5leHQoKTsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiB0aGlzRGVzYyA9IGhhbmQuZ2V0SGFuZGxlckRlc2MoKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyRGVzYy5nZXROYW1lKCkuZXF1YWxzKHRoaXNEZXNjLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNPbmVIYW5kbGVyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIlBoYXNlICciICsgdGhpcy5nZXRQaGFzZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICInIGNhbiBvbmx5IGhhdmUgb25lIGhhbmRsZXIsIHNpbmNlIHRoZXJlIGlzIGEgIgotICAgICAgICAgICAgICAgICAgICArICJoYW5kbGVyIHdpdGggYm90aCBwaGFzZUZpcnN0IGFuZCBwaGFzZUxhc3QgdHJ1ZSAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVyRGVzYy5nZXRSdWxlcygpLmlzUGhhc2VGaXJzdCgpICYmIGhhbmRsZXJEZXNjLmdldFJ1bGVzKCkuaXNQaGFzZUxhc3QoKSkgewotICAgICAgICAgICAgaWYgKCFoYW5kbGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24odGhpcy5nZXRQaGFzZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFscmVhZHkgY29udGFpbnMgSGFuZGxlcnMsIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJEZXNjLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCB0aGVyZWZvcmUgYmUgYm90aCBwaGFzZUZpcnN0IGFuZCBwaGFzZUxhc3QuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyRGVzYy5nZXRIYW5kbGVyKCkpOwotICAgICAgICAgICAgICAgIGlzT25lSGFuZGxlciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlckRlc2MuZ2V0UnVsZXMoKS5pc1BoYXNlRmlyc3QoKSkgewotICAgICAgICAgICAgc2V0UGhhc2VGaXJzdChoYW5kbGVyRGVzYy5nZXRIYW5kbGVyKCkpOwotICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJEZXNjLmdldFJ1bGVzKCkuaXNQaGFzZUxhc3QoKSkgewotICAgICAgICAgICAgc2V0UGhhc2VMYXN0KGhhbmRsZXJEZXNjLmdldEhhbmRsZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnNlcnRIYW5kbGVyKGhhbmRsZXJEZXNjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIEhhbmRsZXIgYXQgYSBwYXJ0aWN1bGFyIGluZGV4IHdpdGhpbiB0aGUgUGhhc2UuCi0gICAgICoKLSAgICAgKiBJZiB3ZSBoYXZlIGEgUGhhc2Ugd2l0aCAoSDEsIEgyKSwgY2FsbGluZyBhZGRIYW5kbGVyKEgzLCAxKSB3aWxsIHJlc3VsdCBpbiAoSDEsIEgzLCBIMikKLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyIHRoZSBIYW5kbGVyIHRvIGFkZAotICAgICAqIEBwYXJhbSBpbmRleCB0aGUgcG9zaXRpb24gaW4gdGhlIFBoYXNlIGF0IHdoaWNoIHRvIHBsYWNlIHRoZSBIYW5kbGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyIGhhbmRsZXIsIGludCBpbmRleCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSGFuZGxlciAiICsgaGFuZGxlci5nZXROYW1lKCkgKyAiIGluc2VydGVkIGF0IHBvc2l0aW9uICIgKyBpbmRleCArCi0gICAgICAgICAgICAgICAgICAgICIgb2YgUGhhc2UgIiArIHBoYXNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlcnMuYWRkKGluZGV4LCBoYW5kbGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maXJtIHRoYXQgYWxsIHBvc3QtY29uZGl0aW9ucyBvZiB0aGlzIFBoYXNlIGFyZSBtZXQuICBBZnRlciBhbGwgSGFuZGxlcnMgaW4gYQotICAgICAqIFBoYXNlIGFyZSBpbnZva2UoKWQsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLiAgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaXQgaW4gb3JkZXIKLSAgICAgKiB0byBjb25maXJtIHRoYXQgdGhlIHB1cnBvc2Ugb2YgdGhlIGdpdmVuIFBoYXNlIGhhcyBiZWVuIGFjaGVpdmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGEgcG9zdC1jb25kaXRpb24gaGFzIG5vdCBiZWVuIG1ldCwgb3Igb3RoZXIgcHJvYmxlbXMgb2NjdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1Bvc3RDb25kaXRpb25zKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBEZWZhdWx0IHZlcnNpb24gZG9lcyBub3RoaW5nCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHByZWNvbmRpdGlvbnMgZm9yIGEgUGhhc2UuICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBQaGFzZSBpcwotICAgICAqIGludm9rZWQsIEJFRk9SRSBhbnkgSGFuZGxlcnMgYXJlIGludm9rZWQuICBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpdCBpbiBvcmRlcgotICAgICAqIHRvIGNvbmZpcm0gdGhhdCBuZWNlc3NhcnkgcHJlY29uZGl0aW9ucyBhcmUgbWV0IGJlZm9yZSB0aGUgUGhhc2UgZG9lcyBpdHMgd29yay4gIFRoZXkKLSAgICAgKiBzaG91bGQgdGhyb3cgYW4gYXBwcm9wcmlhdGUgQXhpc0ZhdWx0IGlmIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhIHByZWNvbmRpdGlvbiBpcyBub3QgbWV0LCBvciBpbiBjYXNlIG9mIG90aGVyIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGVja1ByZWNvbmRpdGlvbnMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIERlZmF1bHQgdmVyc2lvbiBkb2VzIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICAvLyBEZWZhdWx0IHZlcnNpb24gZG9lcyBub3RoaW5nCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlcmRlc2MpIHsKLSAgICAgICAgLy8gRGVmYXVsdCB2ZXJzaW9uIGRvZXMgbm90aGluZwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRIYW5kbGVyKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYykgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gaGFuZGxlckRlc2MuZ2V0SGFuZGxlcigpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZXMgPSBoYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0UnVsZXMoKTsKLSAgICAgICAgU3RyaW5nIGJlZm9yZU5hbWUgPSBydWxlcy5nZXRCZWZvcmUoKTsKLSAgICAgICAgU3RyaW5nIGFmdGVyTmFtZSA9IHJ1bGVzLmdldEFmdGVyKCk7Ci0KLSAgICAgICAgLy8gSWYgd2UgZG9uJ3QgY2FyZSB3aGVyZSBpdCBnb2VzLCB0YWNrIGl0IG9uIGF0IHRoZSBlbmQKLSAgICAgICAgaWYgKGJlZm9yZU5hbWUgPT0gbnVsbCAmJiBhZnRlck5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkSGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE90aGVyd2lzZSB3YWxrIHRoZSBsaXN0IGFuZCBmaW5kIHRoZSByaWdodCBwbGFjZSB0byBwdXQgaXQKLSAgICAgICAgaW50IGJlZm9yZUluZGV4ID0gLTEsIGFmdGVySW5kZXggPSAtMTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBIYW5kbGVyIHRlbXBIYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChpKTsKLQotICAgICAgICAgICAgaWYgKChiZWZvcmVOYW1lICE9IG51bGwpICYmIChiZWZvcmVJbmRleCA9PSAtMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGVtcEhhbmRsZXIuZ2V0TmFtZSgpLmVxdWFscyhiZWZvcmVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCB0aGUgImJlZm9yZSIgaGFuZGxlcgotICAgICAgICAgICAgICAgICAgICBiZWZvcmVJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKGFmdGVyTmFtZSAhPSBudWxsKSAmJiAoYWZ0ZXJJbmRleCA9PSAtMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAodGVtcEhhbmRsZXIuZ2V0TmFtZSgpLmVxdWFscyhhZnRlck5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIHRoZSAiYWZ0ZXIiIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChiZWZvcmVJbmRleCA+IC0xKSAmJiAoYWZ0ZXJJbmRleCA+PSBiZWZvcmVJbmRleCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQaGFzZUV4Y2VwdGlvbigiQ2FuJ3QgaW5zZXJ0IGhhbmRsZXIgYmVjYXVzZSAiICsgYmVmb3JlTmFtZSArICIgaXMgYmVmb3JlICIgKwotICAgICAgICAgICAgICAgICAgICBhZnRlck5hbWUgKyAiIGluIFBoYXNlICciICsgcGhhc2VOYW1lICsgIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwaGFzZUZpcnN0U2V0ICYmIGJlZm9yZUluZGV4ID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQaGFzZUV4Y2VwdGlvbigiQ2FuJ3QgaW5zZXJ0IGhhbmRsZXIgYmVmb3JlIGhhbmRsZXIgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBiZWZvcmVOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIicsIHdoaWNoIGlzIG1hcmtlZCBwaGFzZUZpcnN0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGhhc2VMYXN0U2V0ICYmIGFmdGVySW5kZXggPT0gKGhhbmRsZXJzLnNpemUoKSAtIDEpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIkNhbid0IGluc2VydCBoYW5kbGVyIGFmdGVyIGhhbmRsZXIgJyIKLSAgICAgICAgICAgICAgICAgICAgKyBhZnRlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiJywgd2hpY2ggaXMgbWFya2VkIHBoYXNlTGFzdCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJlZm9yZUluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChiZWZvcmVJbmRleCwgaGFuZGxlcik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXJJbmRleCA+IC0xKXsKLSAgICAgICAgICAgIGlmIChwaGFzZUxhc3RTZXQpewotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVycy5zaXplKCkgPT0xKXsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKDAsaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVycy5zaXplKCkgLTIsaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFmdGVySW5kZXggPT0gKGhhbmRsZXJzLnNpemUoKSAtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChhZnRlckluZGV4ICsxLGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGhhc2VMYXN0U2V0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJzLnNpemUoKSA9PTEpewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoMCxoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9ICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXJzLnNpemUoKSAtMixoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBhbGwgdGhlIGhhbmRsZXJzIGluIHRoaXMgUGhhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2djdHggdGhlIGN1cnJlbnQgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIEFuIEludm9jYXRpb25SZXNwb25zZSB0aGF0IGluZGljYXRlcyB3aGF0Ci0gICAgICogICAgICAgICB0aGUgbmV4dCBzdGVwIGluIHRoZSBtZXNzYWdlIHByb2Nlc3Npbmcgc2hvdWxkIGJlLgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2djdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAKLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIENoZWNraW5nIHByZS1jb25kaXRpb24gZm9yIFBoYXNlIFwiIiArIHBoYXNlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSW52b2NhdGlvblJlc3BvbnNlIHBpID0gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotCi0gICAgICAgIGludCBjdXJyZW50SW5kZXggPSBtc2djdHguZ2V0Q3VycmVudFBoYXNlSW5kZXgoKTsKLQotICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrUHJlY29uZGl0aW9ucyhtc2djdHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIEludm9raW5nIHBoYXNlIFwiIiArIHBoYXNlTmFtZSArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGhhbmRsZXJzU2l6ZSA9IGhhbmRsZXJzLnNpemUoKTsKLSAgICAgICAgCi0gICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCBoYW5kbGVyc1NpemUpIHsKLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoY3VycmVudEluZGV4KTsKLQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZ2N0eC5nZXRMb2dJRFN0cmluZygpICsgIiBJbnZva2luZyBIYW5kbGVyICciICsgaGFuZGxlci5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIicgaW4gUGhhc2UgJyIgKyBwaGFzZU5hbWUgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGkgPSBoYW5kbGVyLmludm9rZShtc2djdHgpOwotCi0gICAgICAgICAgICBpZiAoIXBpLmVxdWFscyhJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdXJyZW50SW5kZXgrKzsKLSAgICAgICAgICAgIG1zZ2N0eC5zZXRDdXJyZW50UGhhc2VJbmRleChjdXJyZW50SW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcobXNnY3R4LmdldExvZ0lEU3RyaW5nKCkgKyAiIENoZWNraW5nIHBvc3QtY29uZGl0aW9ucyBmb3IgcGhhc2UgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgcGhhc2VOYW1lICsgIlwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtc2djdHguc2V0Q3VycmVudFBoYXNlSW5kZXgoMCk7Ci0gICAgICAgIGNoZWNrUG9zdENvbmRpdGlvbnMobXNnY3R4KTsKLSAgICAgICAgcmV0dXJuIHBpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZsb3dDb21wbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKG1zZ0NvbnRleHQuZ2V0TG9nSURTdHJpbmcoKSArICIgSW52b2tpbmcgZmxvd0NvbXBsZXRlKCkgaW4gUGhhc2UgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgcGhhc2VOYW1lICsgIlwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIHdpbGwgYmUgbm9uLXplcm8gaWYgd2UgZmFpbGVkIGR1cmluZyBleGVjdXRpb24gb2Ygb25lIG9mIHRoZQotICAgICAgICAvLyBoYW5kbGVycyBpbiB0aGlzIHBoYXNlCi0gICAgICAgIGludCBjdXJyZW50SGFuZGxlckluZGV4ID0gbXNnQ29udGV4dC5nZXRDdXJyZW50UGhhc2VJbmRleCgpOwotICAgICAgICBpZiAoY3VycmVudEhhbmRsZXJJbmRleCA9PSAwKSB7Ci0gICAgICAgICAgICBjdXJyZW50SGFuZGxlckluZGV4ID0gaGFuZGxlcnMuc2l6ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLypXZSBuZWVkIHRvIHNldCBpdCB0byAwIHNvIHRoYXQgYW55IHByZXZpb3VzIHBoYXNlcyB3aWxsIGV4ZWN1dGUgYWxsCi0gICAgICAgICAqIG9mIHRoZWlyIGhhbmRsZXJzLiovCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEN1cnJlbnRQaGFzZUluZGV4KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICg7IGN1cnJlbnRIYW5kbGVySW5kZXggPiAwOyBjdXJyZW50SGFuZGxlckluZGV4LS0pIHsKLSAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoY3VycmVudEhhbmRsZXJJbmRleCAtIDEpOwotCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnQ29udGV4dC5nZXRMb2dJRFN0cmluZygpICsgIiBJbnZva2luZyBmbG93Q29tcGxldGUoKSBmb3IgSGFuZGxlciAnIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldE5hbWUoKSArICInIGluIFBoYXNlICciICsgcGhhc2VOYW1lICsgIiciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGFuZGxlci5mbG93Q29tcGxldGUobXNnQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy5nZXRQaGFzZU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEhhbmRsZXJDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uIGdldEhhbmRsZXJEZXNjKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCB0aGUgaGFuZGxlcnMgaW4gdGhlIHBoYXNlLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIGFuIEFycmF5TGlzdCBvZiBIYW5kbGVycwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEhhbmRsZXI+IGdldEhhbmRsZXJzKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gcGhhc2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBoYXNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBoYXNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgdGhpcy5waGFzZU5hbWUgPSBwaGFzZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgSGFuZGxlciB0byB0aGUgUGhhc2UgaW4gdGhlIHZlcnkgZmlyc3QgcG9zaXRpb24sIGFuZCBlbnN1cmUgbm8gb3RoZXIgSGFuZGxlcgotICAgICAqIHdpbGwgY29tZSBiZWZvcmUgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgSGFuZGxlciB0byBhZGQKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIGFub3RoZXIgSGFuZGxlciBpcyBhbHJlYWR5IHNldCBhcyBwaGFzZUZpcnN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGhhc2VGaXJzdChIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBQaGFzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwaGFzZUZpcnN0U2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIlBoYXNlRmlyc3QgaGFzIGJlZW4gc2V0IGFscmVhZHksIGNhbm5vdCBoYXZlIHR3byIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHBoYXNlRmlyc3QgSGFuZGxlcnMgZm9yIFBoYXNlICciICsgdGhpcy5nZXRQaGFzZU5hbWUoKSArICInIik7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlcnMuYWRkKDAsIGhhbmRsZXIpOwotICAgICAgICBwaGFzZUZpcnN0U2V0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBIYW5kbGVyIHRvIHRoZSBQaGFzZSBpbiB0aGUgdmVyeSBsYXN0IHBvc2l0aW9uLCBhbmQgZW5zdXJlIG5vIG90aGVyIEhhbmRsZXIKLSAgICAgKiB3aWxsIGNvbWUgYWZ0ZXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgSGFuZGxlciB0byBhZGQKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIGFub3RoZXIgSGFuZGxlciBpcyBhbHJlYWR5IHNldCBhcyBwaGFzZUxhc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaGFzZUxhc3QoSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgUGhhc2VFeGNlcHRpb24gewotICAgICAgICBpZiAocGhhc2VMYXN0U2V0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGhhc2VFeGNlcHRpb24oIlBoYXNlTGFzdCBhbHJlYWR5IGhhcyBiZWVuIHNldCwiCi0gICAgICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgaGF2ZSB0d28gUGhhc2VMYXN0IEhhbmRsZXIgZm9yIHNhbWUgcGhhc2UgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMuZ2V0UGhhc2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcnMuYWRkKGhhbmRsZXIpOwotICAgICAgICBwaGFzZUxhc3RTZXQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGdpdmVuIEhhbmRsZXIgZnJvbSBhIHBoYXNlIHVzaW5nIGEgSGFuZGxlckRlc2NyaXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGFuZGxlckRlc2MgdGhlIEhhbmRsZXJEZXNjcmlwdGlvbiB0byByZW1vdmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIYW5kbGVyKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYykgewotICAgICAgICBpZiAoaGFuZGxlcnMucmVtb3ZlKGhhbmRsZXJEZXNjLmdldEhhbmRsZXIoKSkpIHsKLSAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlID0gaGFuZGxlckRlc2MuZ2V0UnVsZXMoKTsKLSAgICAgICAgICAgIGlmIChydWxlLmlzUGhhc2VGaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgcGhhc2VGaXJzdFNldCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJ1bGUuaXNQaGFzZUxhc3QoKSkgewotICAgICAgICAgICAgICAgIHBoYXNlTGFzdFNldCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJ1bGUuaXNQaGFzZUZpcnN0KCkgJiYgcnVsZS5pc1BoYXNlTGFzdCgpKSB7Ci0gICAgICAgICAgICAgICAgaXNPbmVIYW5kbGVyID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuZGVidWcoInJlbW92ZWQgaGFuZGxlciAiICsgaGFuZGxlckRlc2MuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIHRoZSBwaGFzZSAiICsgcGhhc2VOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygidW5hYmxlIHRvIHJlbW92ZSBoYW5kbGVyICIgKyBoYW5kbGVyRGVzYy5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gdGhlIHBoYXNlICIgKyBwaGFzZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BpbmdhYmxlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BpbmdhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmUwZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QaW5nYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdhYmxlIHsKLSAgICBwdWJsaWMgaW50IFBJTkdfRkFJTEQgPSAwOwotICAgIHB1YmxpYyBpbnQgUElOR19NT0RVTEVfTEVWRUwgPSAxOwotICAgIHB1YmxpYyBpbnQgUElOR19NUl9MRVZFTCA9IDI7Ci0gICAgcHVibGljIGludCBQSU5HX1NVQ0NFU1NGVUwgPSAzOwotCi0gICAgcHVibGljIFN0cmluZyBPUEVSQVRJT05fVE9fUElORyA9ICJvcGVyYXRpb25Ub1BpbmciOwotCi0gICAgaW50IHBpbmcoKSB0aHJvd3MgQXhpc0ZhdWx0OwotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1JlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWEwNWE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIHRoZSBzZXJ2aWNlIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXJnZXQgZW5kcG9pbnQgVVJMLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIKLSAqLwotcHVibGljIGNsYXNzIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFkY2Y2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyB0aGUgb3BlcmF0aW9uIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXJnZXQgZW5kcG9pbnQgVVJMLgotICoKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciBleHRlbmRzIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NmQ5NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLS8qKgotICogRGlzcGF0Y2hlcyBiYXNlZCBvbiB0aGUgU09BUEFjdGlvbi4KLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHsKLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDdjODkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotLyoqCi0gKiBEaXNwYXRjaGVzIGJhc2VkIG9uIHRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBmaXJzdCBjaGlsZCBvZgotICogdGhlIGJvZHkuCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciB7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1NlcnZpY2VMaWZlQ3ljbGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUxpZmVDeWNsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVmNzM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU2VydmljZUxpZmVDeWNsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotCi0vKioKLSAqIFdoZW4geW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBkYXRhYmFzZSBjb25uZWN0aW9ucyAsIHN0YXJ0aW5nIHRocmVhZHMgYW5kIGV0Yy4uCi0gKiBhdCB0aGUgdGltZSB5b3UgZGVwbG95ICBzZXJ2aWNlIChzaW1pbGFyIHRvIGxvYWRvbnN0YXJ0dXApLgotICogWW91IG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCBhZGQgYWRkaXRpb25hbCAob3B0aW9uYWwpIGF0dHJpYnV0ZQotICogaW50byBzZXJ2aWNlcy54bWwgPHNlcnZpY2UgbmFtZT0iRm9vIiAgY2xhc3M9IlNlcnZpY2UgbGlmZSBjeWNsZSBpbXBsIGNsYXNzIj4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VMaWZlQ3ljbGUgewotCi0gICAgLyoqCi0gICAgICogdGhpcyB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGRlcGxveWVtZW50IHRpbWUgb2YgdGhlIHNlcnZpY2UuIGlycmVzcGVjdGl2ZQotICAgICAqIG9mIHRoZSBzZXJ2aWNlIHNjb3BlIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRVcChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpOwotCi0gICAgLyoqCi0gICAgICogdGhpcyB3aWxsIGJlIGNhbGxlZCBkdXJpbmcgdGhlIHN5c3RlbSBzaHV0IGRvd24gdGltZS4gaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0RG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdjdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9BYnN0cmFjdEhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9BYnN0cmFjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwOWRkOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvQWJzdHJhY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLQotLyoqCi0gKiBDbGFzcyBBYnN0cmFjdEhhbmRsZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotCi0gICAgLyoqCi0gICAgICogRmllbGQgaGFuZGxlckRlc2MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJEZXNjOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgQWJzdHJhY3RIYW5kbGVyLgotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0gICAgICAgIGhhbmRsZXJEZXNjID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiRGVmYXVsdEhhbmRsZXIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaW5jZSB0aGlzIG1pZ2h0IGNoYW5nZSB0aGUgd2hvbGUgYmVoYXZpb3Igb2YgQXhpczIgaGFuZGxlcnMsIGFuZCBzaW5jZSB0aGlzIGlzIHN0aWxsIHVuZGVyIGRpc2N1c3Npb24KLSAgICAgKiAoaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1heGlzLWRldiZtPTExNDUwNDA4NDkyOTI4NSZ3PTIpIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGlzIGRlZmVycmVkLgotICAgICAqIE5vdGUgOiBUaGlzIG1ldGhvZCB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCwgZnJvbSBBeGlzMiBlbmdpbmUsIHVudGlsIHRoaXMgaXMgZnVsbHkgaW1wbGVtZW50ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW5pdC4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXJkZXNjKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckRlc2MgPSBoYW5kbGVyZGVzYzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCi0gICAgICAgIHJldHVybiAobmFtZSAhPSBudWxsKQotICAgICAgICAgICAgICAgID8gbmFtZQotICAgICAgICAgICAgICAgIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwaGFzZVJ1bGUgb2YgYSBoYW5kbGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIEhhbmRsZXJEZXNjcmlwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckRlc2NyaXB0aW9uIGdldEhhbmRsZXJEZXNjKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckRlc2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldE5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckRlc2MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRQYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUGFyYW1ldGVyLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyRGVzYy5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmxvd0NvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjQ0YjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZUJ1bmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pMThuOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBBY2NlcHQgcGFyYW1ldGVycyBmb3IgUHJvamVjdFJlc291cmNlQnVuZGxlLAotICogYnV0IGRlZmVyIG9iamVjdCBpbnN0YW50aWF0aW9uIChhbmQgdGhlcmVmb3JlCi0gKiByZXNvdXJjZSBidW5kbGUgbG9hZGluZykgdW50aWwgcmVxdWlyZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQnVuZGxlIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBfcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgTG9jYWxlIGxvY2FsZTsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgcGFyZW50OwotCi0KLSAgICBwdWJsaWMgZmluYWwgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICBpZiAoIWxvYWRlZCkgewotICAgICAgICAgICAgX3Jlc291cmNlQnVuZGxlID0gUHJvamVjdFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50KTsKLSAgICAgICAgICAgIGxvYWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIF9yZXNvdXJjZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRXh0ZW5kTWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUJ1bmRsZShTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBwYXJlbnQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lOwotICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZTsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIChTdHJpbmdbXSkgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlCi0gICAgICogbWVzc2FnZSBtYXkgY29udGFpbiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuCi0gICAgICogYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPgotICAgICAqIFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0KLSAgICAgKiA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tde2FyZzB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUKLSAgICAgKiBtZXNzYWdlIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+Ci0gICAgICogVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfQotICAgICAqIDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIG5ldyBTdHJpbmdbXXthcmcwLCBhcmcxfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlCi0gICAgICogbWVzc2FnZSBtYXkgY29udGFpbiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuCi0gICAgICogYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPgotICAgICAqIFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0KLSAgICAgKiA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW117YXJnMCwgYXJnMSwgYXJnMn0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW117YXJnMCwgYXJnMSwgYXJnMiwgYXJnM30pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tde2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzR9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUKLSAgICAgKiBtZXNzYWdlIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+Ci0gICAgICogVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfQotICAgICAqIDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJyYXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFJlc291cmNlQnVuZGxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnID0gZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzb3VyY2Uga2V5IFwiIiArIGtleSArCi0gICAgICAgICAgICAgICAgICAgICJcIiBpbiBiYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0UmVzb3VyY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlQnVuZGxlKCkuZ2V0UmVzb3VyY2VOYW1lKCksIGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcnJheSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MTYyNjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaTE4bjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGhpc0NsYXNzID0gTWVzc2FnZXMuY2xhc3M7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5wcm9qZWN0TmFtZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWUgPSBNZXNzYWdlc0NvbnN0YW50cy5yZXNvdXJjZU5hbWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGxvY2FsZSA9IE1lc3NhZ2VzQ29uc3RhbnRzLmxvY2FsZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZID0gImRlZmF1bHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19NRVNTQUdFX0JVTkRMRSA9ICJNZXNzYWdlIEJ1bmRsZSBpcyBub3QgYXZhaWxhYmxlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2UodGhpc0NsYXNzLmdldE5hbWUoKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSB0aGlzQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHBhcmVudCA9Ci0gICAgICAgICAgICAoTWVzc2FnZXNDb25zdGFudHMucm9vdFBhY2thZ2VOYW1lLmVxdWFscyhwYWNrYWdlTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICA6IE1lc3NhZ2VzQ29uc3RhbnRzLnJvb3RCdW5kbGU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIG1lc3NhZ2VCdW5kbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBkZWZhdWx0TWVzc2FnZUJ1bmRsZSA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLCBjbGFzc0xvYWRlciwgcGFyZW50KTsKLSAgICAgICAgYWRkTWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSwgZGVmYXVsdE1lc3NhZ2VCdW5kbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIGFkZCBhIG5ldyBNZXNzYWdlIEJ1bmRsZSB0byB0aGUgTWVzc2FnZUJ1bmRsZSBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBtZXNzYWdlIGJ1bmRsZSBsYXRlci4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZSAgICBUaGUgbWVzc2FnZSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lc3NhZ2VCdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSkgewotICAgICAgICBtZXNzYWdlQnVuZGxlTWFwLnB1dChtZXNzYWdlQnVuZGxlS2V5LCBtZXNzYWdlQnVuZGxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezR9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmdbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQnVuZGxlIGdldE1lc3NhZ2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VCdW5kbGUgZ2V0TWVzc2FnZUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSkgewotICAgICAgICByZXR1cm4gKE1lc3NhZ2VCdW5kbGUpIG1lc3NhZ2VCdW5kbGVNYXAuZ2V0KG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHs0fQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsIFN0cmluZyBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkuaW50ZXJuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL01lc3NhZ2VzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmIwYTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pMThuOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlc0NvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSAib3JnLmFwYWNoZS5heGlzMiIuaW50ZXJuKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lID0gInJlc291cmNlIi5pbnRlcm4oKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvY2FsZSBsb2NhbGUgPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcm9vdFBhY2thZ2VOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuaTE4biIuaW50ZXJuKCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIHJvb3RCdW5kbGUgPQotICAgICAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXNDb25zdGFudHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvaTE4bi9Qcm9qZWN0UmVzb3VyY2VCdW5kbGUuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL1Byb2plY3RSZXNvdXJjZUJ1bmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzNkOTVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL1Byb2plY3RSZXNvdXJjZUJ1bmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5pMThuOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIDxwPldyYXBwZXIgY2xhc3MgZm9yIHJlc291cmNlIGJ1bmRsZXMuIFByb3BlcnR5IGZpbGVzIGFyZSB1c2VkIHRvIHN0b3JlCi0gKiByZXNvdXJjZSBzdHJpbmdzLCB3aGljaCBhcmUgdGhlIG9ubHkgdHlwZXMgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZS4KLSAqIFByb3BlcnR5IGZpbGVzIGNhbiBpbmhlcml0IHByb3BlcnRpZXMgZnJvbSBvdGhlciBmaWxlcyBzbyB0aGF0Ci0gKiBhIGJhc2UgcHJvcGVydHkgZmlsZSBjYW4gYmUgdXNlZCBhbmQgYSBzbWFsbCBudW1iZXIgb2YgcHJvcGVydGllcwotICogY2FuIGJlIG92ZXItcmlkZGVuIGJ5IGFub3RoZXIgcHJvcGVydHkgZmlsZS4gRm9yIGV4YW1wbGUgeW91IG1heQotICogY3JlYXRlIGFuIGVuZ2xpc2ggdmVyc2lvbiBvZiBhIHJlc291cmNlIGZpbGUgbmFtZWQgInJlc291cmNlLnByb3BlcnRpZXMiLgotICogWW91IHRoZW4gZGVjaWRlIHRoYXQgdGhlIEJyaXRpc2ggRW5nbGlzaCB2ZXJzaW9uIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcwotICogZXhjZXB0IG9uZSBhcmUgdGhlIHNhbWUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVkZWZpbmUgYWxsIG9mIHRoZQotICogcHJvcGVydGllcyBpbiAicmVzb3VyY2VfZW5fR0IiLCBqdXN0IHRoZSBvbmUgdGhhdCBpcyBkaWZmZXJlbnQuPC9wPgotICogPHA+VGhlIGJhc2VuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIKLSAqIGV4dGVuc2lvbi48L3A+Ci0gKiA8cD5Qcm9wZXJ0aWVzIHdpbGwgYmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS48cD4KLSAqIDxwPlByb3BlcnR5IHZhbHVlcyBzdG9yZWQgaW4gdGhlIHByb3BlcnR5IGZpbGVzIGNhbiBhbHNvIGNvbnRhaW4gZHluYW1pYwotICogdmFyaWFibGVzLiBBbnkgZHluYW1pYyB2YXJpYWJsZSBkZWZpbmVkIGluIFByb3BlcnRpZXNVdGlsLmdldFZhcmlhYmxlVmFsdWUoKQotICogY2FuIGJlIHVzZWQgKHN1Y2ggYXMge2RhdGV9KSwgYXMgd2VsbCBhcyBhcmd1bWVudHMgaW4gdGhlIGZvcm0gezB9LCB7MX0sIGV0Yy4KLSAqIEFyZ3VtZW50IHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YXJpb3VzIG92ZXJsb2FkZWQgZ2V0U3RyaW5nKCkgbWV0aG9kcy48L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFByb2plY3RSZXNvdXJjZUJ1bmRsZS5jbGFzcyk7Ci0KLQotICAgIC8vIFRoZSBzdGF0aWMgY2FjaGUgb2YgUmVzb3VyY2VCdW5kbGVzLgotICAgIC8vIFRoZSBrZXkgaXMgdGhlICdiYXNlbmFtZSArIGxvY2FsZSArIGRlZmF1bHQgbG9jYWxlJwotICAgIC8vIFRoZSBlbGVtZW50IGlzIGEgUmVzb3VyY2VCdW5kbGUgb2JqZWN0Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaHRhYmxlIGJ1bmRsZUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZU5hbWU7Ci0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgaGFuZGxlR2V0T2JqZWN0KFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcodGhpcy50b1N0cmluZygpICsgIjo6aGFuZGxlR2V0T2JqZWN0KCIgKyBrZXkgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdCBvYmo7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvYmogPSByZXNvdXJjZUJ1bmRsZS5nZXRPYmplY3Qoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8qIGNhdGNoIG1pc3NpbmcgcmVzb3VyY2UsIGlnbm9yZSwgJiByZXR1cm4gbnVsbAotICAgICAgICAgICAgICogaWYgdGhpcyBtZXRob2QgZG9lc24ndCByZXR1cm4gbnVsbCwgdGhlbiBwYXJlbnRzCi0gICAgICAgICAgICAgKiBhcmUgbm90IHNlYXJjaGVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG9iaiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0S2V5cygpIHsKLSAgICAgICAgRW51bWVyYXRpb24gbXlLZXlzID0gcmVzb3VyY2VCdW5kbGUuZ2V0S2V5cygpOwotICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBteUtleXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICB3aGlsZSAobXlLZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZChteUtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uIHBLZXlzID0gcGFyZW50LmdldEtleXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChwS2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHNldC5hZGQocEtleXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRW51bWVyYXRpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvciBpdCA9IHNldC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgYSBwcm9wZXIgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgVGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGJhc2VuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuCi0gICAgICogICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGEgcHJvcGVyIHByZWZpeCBvZiB0aGUgY2FsbGVyJ3MgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gY2FsbGVyICAgICAgIFRoZSBjYWxsaW5nIGNsYXNzLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCdW5kbGUocHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgYSBwcm9wZXIgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgVGhlIHBhY2thZ2UgbmFtZSB0byBjb25zdHJ1Y3QgYmFzZSBuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgVGhlIGxvY2FsZQotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwgbG9jYWxlLCBsb2FkZXIsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBjbGFzcyBiZWxvbmdzLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgYSBwcm9wZXIgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBjYWxsZXIgICAgICAgIFRoZSBjYWxsaW5nIGNsYXNzLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbmFtZSBhcyB3ZWxsIGFzIHRvIGdldCB0aGUgcHJvcGVyIENsYXNzTG9hZGVyLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB3aXRob3V0IHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICogQHBhcmFtIGxvY2FsZSAgICAgICAgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBleHRlbmRzQnVuZGxlIElmIG5vbi1udWxsLCB0aGVuIHRoaXMgRXh0ZW5kTWVzc2FnZXMgd2lsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdG8gZXh0ZW5kc0J1bmRsZS4KLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiBwcm9qZWN0TmFtZSBpcyBub3QgYSBwcmVmaXggb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbGVyJ3MgcGFja2FnZSBuYW1lLCBvciBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQvbG9hZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGNhbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgZXh0ZW5kc0J1bmRsZSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0QnVuZGxlKHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhY2thZ2UoY2FsbGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlci5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kc0J1bmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBhIHByb3BlciBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lICAgVGhlIHBhY2thZ2UgbmFtZSB0byBmdXJ0aGVyIGNvbnN0cnVjdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbmFtZS4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lICBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2l0aG91dCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0gZXh0ZW5kc0J1bmRsZSBJZiBub24tbnVsbCwgdGhlbiB0aGlzIEV4dGVuZE1lc3NhZ2VzIHdpbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHRvIGV4dGVuZHNCdW5kbGUuCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgcHJvamVjdE5hbWUgaXMgbm90IGEgcHJlZml4IG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGxlcidzIHBhY2thZ2UgbmFtZSwgb3IgaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kL2xvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgZXh0ZW5kc0J1bmRsZSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0QnVuZGxlKCIgKyBwcm9qZWN0TmFtZSArICIsIgotICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICsgcmVzb3VyY2VOYW1lICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICsgU3RyaW5nLnZhbHVlT2YobG9jYWxlKSArICIsLi4uKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gbmV3IENvbnRleHQoKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2NhbGUobG9jYWxlKTsKLSAgICAgICAgY29udGV4dC5zZXRMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgY29udGV4dC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UGFyZW50QnVuZGxlKGV4dGVuZHNCdW5kbGUpOwotCi0gICAgICAgIHBhY2thZ2VOYW1lID0gY29udGV4dC52YWxpZGF0ZShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidW5kbGUgPSBnZXRCdW5kbGUoY29udGV4dCwgcGFja2FnZU5hbWUpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uOiAiLCBlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHJlc291cmNlICciICsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKyAnLicgKyByZXNvdXJjZU5hbWUgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwgIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYnVuZGxlLi4uCi0gICAgICogLSBjaGVjayBjYWNoZQotICAgICAqIC0gdHJ5IHVwIGhpZXJhcmNoeQotICAgICAqIC0gaWYgYXQgdG9wIG9mIGhpZXJhcmNoeSwgdXNlIChsaW5rIHRvKSBjb250ZXh0LmdldFBhcmVudEJ1bmRsZSgpCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gY29udGV4dC5nZXRDYWNoZUtleShwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgUHJvamVjdFJlc291cmNlQnVuZGxlIHByYiA9IChQcm9qZWN0UmVzb3VyY2VCdW5kbGUpIGJ1bmRsZUNhY2hlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKHByYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhY2thZ2VOYW1lICsgJy4nICsgY29udGV4dC5nZXRSZXNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gY29udGV4dC5sb2FkQnVuZGxlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHBhcmVudCA9IGNvbnRleHQuZ2V0UGFyZW50QnVuZGxlKHBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHJiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmIgPSBuZXcgUHJvamVjdFJlc291cmNlQnVuZGxlKG5hbWUsIHJiKTsKLSAgICAgICAgICAgICAgICBwcmIuc2V0UGFyZW50KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlZCAiICsgcHJiICsgIiwgbGlua2VkIHRvIHBhcmVudCAiICsgU3RyaW5nLnZhbHVlT2YocGFyZW50KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZUJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJiID0gKFByb2plY3RSZXNvdXJjZUJ1bmRsZSkgcGFyZW50OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJiID0gbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZShuYW1lLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSb290IHBhY2thZ2Ugbm90IGZvdW5kLCBjcm9zcyBsaW5rIHRvICIgKyBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICBidW5kbGVDYWNoZS5wdXQoY2FjaGVLZXksIHByYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJiOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpLmludGVybigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb2plY3RSZXNvdXJjZUJ1bmRsZShTdHJpbmcgbmFtZSwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlCi0gICAgICovCi0vLyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLS8vICAgICAgICBidW5kbGVDYWNoZS5jbGVhcigpOwotLy8gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZU5hbWU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0IHsKLSAgICAgICAgcHJpdmF0ZSBMb2NhbGUgX2xvY2FsZTsKLSAgICAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBfbG9hZGVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIF9yZXNvdXJjZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgX3BhcmVudDsKLQotICAgICAgICB2b2lkIHNldExvY2FsZShMb2NhbGUgbCkgewotICAgICAgICAgICAgLyogMS4gRG9jcyBpbmRpY2F0ZSB0aGF0IGlmIGxvY2FsZSBpcyBub3Qgc3BlY2lmaWVkLAotICAgICAgICAgICAgICogICAgdGhlbiB0aGUgZGVmYXVsdCBsb2NhbCBpcyB1c2VkIGluIGl0J3MgcGxhY2UuCi0gICAgICAgICAgICAgKiAyLiBBIG51bGwgdmFsdWUgZm9yIGxvY2FsZSBpcyBpbnZhbGlkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBUaGVyZWZvcmUsIGRlZmF1bHQuLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgX2xvY2FsZSA9IChsID09IG51bGwpID8gZGVmYXVsdExvY2FsZSA6IGw7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldExvYWRlcihDbGFzc0xvYWRlciBsKSB7Ci0gICAgICAgICAgICBfbG9hZGVyID0gKGwgIT0gbnVsbCkgPyBsIDogdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAvLyBTVEFSVCBGSVg6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjgKLSAgICAgICAgICAgIGlmIChfbG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBfbG9hZGVyID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEVORCBGSVg6IGh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTY4NjgKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIF9wcm9qZWN0TmFtZSA9IG5hbWUuaW50ZXJuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFJlc291cmNlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgX3Jlc291cmNlTmFtZSA9IG5hbWUuaW50ZXJuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBhcmVudEJ1bmRsZShSZXNvdXJjZUJ1bmRsZSBiKSB7Ci0gICAgICAgICAgICBfcGFyZW50ID0gYjsKLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsZSBnZXRMb2NhbGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2xvY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzTG9hZGVyIGdldExvYWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBfbG9hZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm9qZWN0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGdldFBhcmVudEJ1bmRsZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcGFyZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldENhY2hlS2V5KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgU3RyaW5nIGxvYWRlck5hbWUgPSAoX2xvYWRlciA9PSBudWxsKSA/ICIiIDogKCI6IiArIF9sb2FkZXIuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUgKyAiLiIgKyBfcmVzb3VyY2VOYW1lICsgIjoiICsgX2xvY2FsZSArICI6IiArIGRlZmF1bHRMb2NhbGUgKwotICAgICAgICAgICAgICAgICAgICBsb2FkZXJOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgbG9hZEJ1bmRsZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwYWNrYWdlTmFtZSArICcuJyArIF9yZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvYWRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBzdXJwcmVzc2luZyBwcmludCBzdGFjay4uIGp1c3QgdGhlIHN0cmluZyBmb3IgaW5mby4KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWRCdW5kbGU6IElnbm9yaW5nIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUgZ2V0UGFyZW50QnVuZGxlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcDsKLSAgICAgICAgICAgIGlmICghcGFja2FnZU5hbWUuZXF1YWxzKF9wcm9qZWN0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwID0gZ2V0QnVuZGxlKHRoaXMsIGdldFBhY2thZ2UocGFja2FnZU5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcCA9IF9wYXJlbnQ7Ci0gICAgICAgICAgICAgICAgX3BhcmVudCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgcGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoX3Byb2plY3ROYW1lID09IG51bGwgfHwgX3Byb2plY3ROYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb2plY3QgbmFtZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUHJvamVjdCBuYW1lIG5vdCBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFja2FnZSBuYW1lIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJQYWNrYWdlIG5vdCBzcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUuaW50ZXJuKCk7Ci0KLSAgICAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHByb2plY3QgaXMgYSBwcm9wZXIgcHJlZml4IG9mIGNsYXNzLgotICAgICAgICAgICAgKiBUZXJtaW5hdGUgcHJvamVjdCBuYW1lIHdpdGggJy4nIHRvIGVuc3VyZSBwcm9wZXIgbWF0Y2guCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFwYWNrYWdlTmFtZS5lcXVhbHMoX3Byb2plY3ROYW1lKSAmJiAhcGFja2FnZU5hbWUuc3RhcnRzV2l0aChfcHJvamVjdE5hbWUgKyAnLicpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9qZWN0IG5vdCBhIHByZWZpeCBvZiBQYWNrYWdlIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUHJvamVjdCAnIiArIF9wcm9qZWN0TmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBtdXN0IGJlIGEgcHJlZml4IG9mIFBhY2thZ2UgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArICcuJyArIF9yZXNvdXJjZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vUkIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL1JCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzI4MWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vUkIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaTE4bjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQ1VSUkVOVExZIE5PVCBVU0VECi0gKiBLRUVQSU5HIEZPUiBSRUZFUkVOQ0UgIDkvMTkvMjAwMgotICogPHAvPgotICogPHA+V3JhcHBlciBjbGFzcyBmb3IgcmVzb3VyY2UgYnVuZGxlcy4gUHJvcGVydHkgZmlsZXMgYXJlIHVzZWQgdG8gc3RvcmUKLSAqIHJlc291cmNlIHN0cmluZ3MsIHdoaWNoIGFyZSB0aGUgb25seSB0eXBlcyBvZiByZXNvdXJjZXMgYXZhaWxhYmxlLgotICogUHJvcGVydHkgZmlsZXMgY2FuIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGZpbGVzIHNvIHRoYXQKLSAqIGEgYmFzZSBwcm9wZXJ0eSBmaWxlIGNhbiBiZSB1c2VkIGFuZCBhIHNtYWxsIG51bWJlciBvZiBwcm9wZXJ0aWVzCi0gKiBjYW4gYmUgb3Zlci1yaWRkZW4gYnkgYW5vdGhlciBwcm9wZXJ0eSBmaWxlLiBGb3IgZXhhbXBsZSB5b3UgbWF5Ci0gKiBjcmVhdGUgYW4gZW5nbGlzaCB2ZXJzaW9uIG9mIGEgcmVzb3VyY2UgZmlsZSBuYW1lZCAicmVzb3VyY2UucHJvcGVydGllcyIuCi0gKiBZb3UgdGhlbiBkZWNpZGUgdGhhdCB0aGUgQnJpdGlzaCBFbmdsaXNoIHZlcnNpb24gb2YgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzCi0gKiBleGNlcHQgb25lIGFyZSB0aGUgc2FtZSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byByZWRlZmluZSBhbGwgb2YgdGhlCi0gKiBwcm9wZXJ0aWVzIGluICJyZXNvdXJjZV9lbl9HQiIsIGp1c3QgdGhlIG9uZSB0aGF0IGlzIGRpZmZlcmVudC48L3A+Ci0gKiA8cD5UaGUgcHJvcGVydHkgZmlsZSBsb29rdXAgc2VhcmNoZXMgZm9yIGNsYXNzZXMgd2l0aCB2YXJpb3VzIHN1ZmZpeGVzCi0gKiBvbiB0aGUgYmFzaXMgaWYgdGhlIGRlc2lyZWQgbG9jYWwgYW5kIHRoZSBjdXJyZW50IGRlZmF1bHQgbG9jYWwKLSAqIChhcyByZXR1cm5lZCBieSBMb2NhbC5nZXREZWZhdWx0KCkpLiBBcyBwcm9wZXJ0eSBmaWxlcyBhcmUgZm91bmQgdGhlCi0gKiBwcm9wZXJ0eSB2YWx1ZXMgYXJlIG1lcmdlZCBzbyB0aGF0IGluaGVyaXRhbmNlIGlzIHByZXNlcnZlZC48L3A+Ci0gKiA8cD5UaGUgb3JkZXIgb2Ygc2VhcmNoaW5nIGlzOjwvcD4KLSAqIDxkaXI+Ci0gKiBiYXNlbmFtZSArICJfIiArIGxhbmdhZ2UgKyAiXyIgKyBjb3VudHJ5ICsgIl8iICsgdmFyaWFudAotICogYmFzZW5hbWUgKyAiXyIgKyBsYW5nYWdlICsgIl8iICsgY291bnRyeQotICogYmFzZW5hbWUgKyAiXyIgKyBsYW5nYWdlCi0gKiBiYXNlbmFtZSArICJfIiArIGRlZmF1bHRMYW5ndWFnZSArICJfIiArIGRlZmF1bHRDb3VudHJ5ICsgIl8iICsgZGVmYXVsdFZhcmlhbnQKLSAqIGJhc2VuYW1lICsgIl8iICsgZGVmYXVsdExhbmd1YWdlICsgIl8iICsgZGVmYXVsdENvdW50cnkKLSAqIGJhc2VuYW1lICsgIl8iICsgZGVmYXVsdExhbmd1YWdlCi0gKiBiYXNlbmFtZQotICogPC9kaXI+Ci0gKiA8cD5UaGUgYmFzZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIgotICogZXh0ZW5zaW9uLjwvcD4KLSAqIDxwPlByb3BlcnRpZXMgd2lsbCBiZSBjYWNoZWQgZm9yIHBlcmZvcm1hbmNlLjxwPgotICogPHA+UHJvcGVydHkgdmFsdWVzIHN0b3JlZCBpbiB0aGUgcHJvcGVydHkgZmlsZXMgY2FuIGFsc28gY29udGFpbiBkeW5hbWljCi0gKiB2YXJpYWJsZXMuIEFueSBkeW5hbWljIHZhcmlhYmxlIGRlZmluZWQgaW4gUHJvcGVydGllc1V0aWwuZ2V0VmFyaWFibGVWYWx1ZSgpCi0gKiBjYW4gYmUgdXNlZCAoc3VjaCBhcyB7ZGF0ZX0pLCBhcyB3ZWxsIGFzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybSB7MH0sIHsxfSwgZXRjLgotICogQXJndW1lbnQgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcmxvYWRlZCBnZXRTdHJpbmcoKSBtZXRob2RzLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJCIHsKLSAgICAvLyBUaGUgc3RhdGljIGNhY2hlIG9mIHByb3BlcnRpZXMuIFRoZSBrZXkgaXMgdGhlIGJhc2VuYW1lICsgdGhlIGxvY2FsICsKLSAgICAvLyB0aGUgZGVmYXVsdCBsb2NhbCBhbmQgdGhlIGVsZW1lbnQgaXMgdGhlIFByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcKLSAgICAvLyB0aGUgcmVzb3VyY2VzCi0gICAgc3RhdGljIEhhc2h0YWJsZSBwcm9wZXJ0eUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLy8gVGhlIGRlZmF1bHQgYmFzZSBuYW1lCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9OQU1FID0gInJlc291cmNlIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBmaWxlIGV4dGVuc2lvbgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VYVCA9ICIucHJvcGVydGllcyI7Ci0KLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBiYXNlIHByb3BlcnR5IGZpbGUgKHdpdGggZXh0ZW5zaW9uKQotICAgIHByb3RlY3RlZCBTdHJpbmcgYmFzZVByb3BlcnR5RmlsZU5hbWU7Ci0KLSAgICAvLyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgcmVzb3VyY2VQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBSQihTdHJpbmcgbmFtZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobnVsbCwgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lCi0gICAgICogICAgICAgICAgICAgICB0byBmdXJ0aGVyIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlcgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUkIoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzKGNhbGxlciwgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lCi0gICAgICogICAgICAgICAgICAgICB0byBmdXJ0aGVyIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlcgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUkIoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG5hbWUsIExvY2FsZSBsb2NhbGUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIENsYXNzIGM7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBjID0gKENsYXNzKSBjYWxsZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMgPSBjYWxsZXIuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBsb2FkZXIKLSAgICAgICAgICAgIGNsID0gYy5nZXRDbGFzc0xvYWRlcigpOwotCi0gICAgICAgICAgICBpZiAobmFtZS5pbmRleE9mKCIvIikgPT0gLTEpIHsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBiYXNlbmFtZSBvbmx5IGlmIG5vdCBnaXZlbgotICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxOYW1lLnN1YnN0cmluZygwLCBwb3MgKyAxKS5yZXBsYWNlKCcuJywgJy8nKSArIG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVHJ5IHRoZSBzaGFyZWQgZGVmYXVsdCBwcm9wZXJ0aWVzIGZpbGUuLi4KLSAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIi8iKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIG5hbWUgPSAib3JnL2FwYWNoZS9heGlzMi9kZWZhdWx0LXJlc291cmNlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgbG9jYWxlIGdpdmVuIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IGxvY2FsZSwgaWdub3JlIGl0Ci0gICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvY2FsZS5lcXVhbHMoZGVmYXVsdExvY2FsZSkpIHsKLSAgICAgICAgICAgICAgICBsb2NhbGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTG9hZCB0aGUgcHJvcGVydGllcy4gSWYgbm8gcHJvcGVydHkgZmlsZXMgZXhpc3QgdGhlbiBhCi0gICAgICAgIC8vIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgotICAgICAgICBsb2FkUHJvcGVydGllcyhuYW1lLCBjbCwgbG9jYWxlLCBkZWZhdWx0TG9jYWxlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCAoT2JqZWN0W10pIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMl07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZQotICAgICAqIG1lc3NhZ2UgbWF5IGNvbnRhaW4gdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbgotICAgICAqIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4KLSAgICAgKiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9Ci0gICAgICogPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbM107Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUKLSAgICAgKiBtZXNzYWdlIG1heSBjb250YWluIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4KLSAgICAgKiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+Ci0gICAgICogVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfQotICAgICAqIDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcnJheSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICBpZiAocmVzb3VyY2VQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1zZyA9IHJlc291cmNlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKCJDYW5ub3QgZmluZCByZXNvdXJjZSBrZXkgXCIiICsga2V5ICsKLSAgICAgICAgICAgICAgICAgICAgIlwiIGluIGJhc2UgbmFtZSAiICsgYmFzZVByb3BlcnR5RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcnJheSk7Ci0gICAgICAgIHJldHVybiBtc2c7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgbG9hZFByb3BlcnRpZXMoU3RyaW5nIGJhc2VuYW1lLCBDbGFzc0xvYWRlciBsb2FkZXIsIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGRlZmF1bHRMb2NhbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZpcnN0Ci0gICAgICAgIFN0cmluZyBsb2FkZXJOYW1lID0gIiI7Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9hZGVyTmFtZSA9ICI6IiArIGxvYWRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9IGJhc2VuYW1lICsgIjoiICsgbG9jYWxlICsgIjoiICsgZGVmYXVsdExvY2FsZSArIGxvYWRlck5hbWU7Ci0gICAgICAgIFByb3BlcnRpZXMgcCA9IChQcm9wZXJ0aWVzKSBwcm9wZXJ0eUNhY2hlLmdldChjYWNoZUtleSk7Ci0gICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lID0gYmFzZW5hbWUgKyBQUk9QRVJUWV9FWFQ7Ci0KLSAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIHByb3BlcnRpZXMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGNhY2hlLiBTZWFyY2ggdGhlIGdpdmVuIGxvY2FsZQotICAgICAgICAgICAgLy8gZmlyc3QKLSAgICAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHAgPSBsb2FkUHJvcGVydGllcyhiYXNlbmFtZSwgbG9hZGVyLCBsb2NhbGUsIHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWFyY2ggdGhlIGRlZmF1bHQgbG9jYWxlCi0gICAgICAgICAgICBpZiAoZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcCA9IGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lLCBsb2FkZXIsIGRlZmF1bHRMb2NhbGUsIHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBiYXNlbmFtZQotICAgICAgICAgICAgcCA9IG1lcmdlKHAsIGxvYWRQcm9wZXJ0aWVzKGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBsb2FkZXIpKTsKLQotICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHJlc291cmNlIGZvciBiYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHJvcGVydHlGaWxlTmFtZSwgYmFzZVByb3BlcnR5RmlsZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUucHV0KGNhY2hlS2V5LCBwKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzb3VyY2VQcm9wZXJ0aWVzID0gcDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhTdHJpbmcgYmFzZW5hbWUsIENsYXNzTG9hZGVyIGxvYWRlciwgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0KLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpOwotICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmFyaWFudC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IG1lcmdlKHByb3BzLCBsb2FkUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSArICJfIiArIGxhbmd1YWdlICsgIl8iICsgY291bnRyeSArICJfIiArIHZhcmlhbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfRVhULCBsb2FkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBtZXJnZShwcm9wcywgbG9hZFByb3BlcnRpZXMoYmFzZW5hbWUgKyAiXyIgKyBsYW5ndWFnZSArICJfIiArIGNvdW50cnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfRVhULCBsb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BzID0gbWVyZ2UocHJvcHMsIGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lICsgIl8iICsgbGFuZ3VhZ2UgKyBQUk9QRVJUWV9FWFQsIGxvYWRlcikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhTdHJpbmcgcmVzbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBudWxsOwotCi0gICAgICAgIC8vIEF0dGVtcHQgdG8gb3BlbiBhbmQgbG9hZCB0aGUgcHJvcGVydGllcwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc25hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFaXRoZXIgd2UncmUgdXNpbmcgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgb3Igd2UgZGlkbid0IGZpbmQgdGhlCi0gICAgICAgICAgICAvLyByZXNvdXJjZSB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShyZXNuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9uIGVycm9yLCBjbGVhciB0aGUgcHJvcHMKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yIG9uIGNsb3NlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0d28gUHJvcGVydGllcyBvYmplY3RzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgbWVyZ2UoUHJvcGVydGllcyBwMSwgUHJvcGVydGllcyBwMikgewotICAgICAgICBpZiAoKHAxID09IG51bGwpICYmCi0gICAgICAgICAgICAgICAgKHAyID09IG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIGlmIChwMSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcDI7Ci0gICAgICAgIH0gZWxzZSBpZiAocDIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm93IG1lcmdlLiBwMSB0YWtlcyBwcmVjZWRlbmNlCi0gICAgICAgIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcDIua2V5cygpOwotICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHAxLmdldFByb3BlcnR5KGtleSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHAxLnB1dChrZXksIHAyLmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdW5kZXJseWluZyBwcm9wZXJ0aWVzCi0gICAgICovCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlUHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvLyBTVEFUSUMgQUNDRVNTT1JTCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBudWxsLCBrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbNF07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIG9bM10gPSBhcmczOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMywgT2JqZWN0IGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbNV07Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIG9bM10gPSBhcmczOwotICAgICAgICBvWzRdID0gYXJnNDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZ3MgICBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBhcmdzKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0W10gbyA9IG5ldyBPYmplY3RbM107Ci0gICAgICAgIG9bMF0gPSBhcmcwOwotICAgICAgICBvWzFdID0gYXJnMTsKLSAgICAgICAgb1syXSA9IGFyZzI7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzRdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwgT2JqZWN0IGFyZzMsIE9iamVjdCBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzVdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgb1s0XSA9IGFyZzQ7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzICAgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIGxvY2FsZSwga2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICAvLyBXb3JraG9yc2UgdGhhdCBkb2VzIHRoZSByZXNvdXJjZSBsb2FkaW5nIGFuZCBrZXkgbG9va3VwCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShPYmplY3QgY2FsbGVyLCBTdHJpbmcgYmFzZW5hbWUsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZmlyc3RFeCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBmdWxsTmFtZSA9IG51bGw7Ci0gICAgICAgIENsYXNzIGN1ckNsYXNzID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBkaWROdWxsID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBjdXJDbGFzcyA9IChDbGFzcykgY2FsbGVyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJDbGFzcyA9IGNhbGxlci5nZXRDbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG1zZyA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZnVsbCBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgaWYgKGN1ckNsYXNzICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBiYXNlbmFtZQotICAgICAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gY3VyQ2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IHBrZ05hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZSA9IHBrZ05hbWUuc3Vic3RyaW5nKDAsIHBvcyArIDEpLnJlcGxhY2UoJy4nLCAnLycpICsgYmFzZW5hbWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWUgPSBiYXNlbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ1bGxOYW1lID0gYmFzZW5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUkIgcmIgPSBuZXcgUkIoY2FsbGVyLCBmdWxsTmFtZSwgbG9jYWxlKTsKLSAgICAgICAgICAgICAgICBtc2cgPSByYi5nZXRTdHJpbmcoa2V5LCBhcmdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChjdXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGZpcnN0IGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGlmIChmaXJzdEV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RFeCA9IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3VwZXJjbGFzcwotICAgICAgICAgICAgICAgIGN1ckNsYXNzID0gY3VyQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgIGlmIChjdXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWROdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpZE51bGwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjYWxsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGN1ckNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNuYW1lLnN0YXJ0c1dpdGgoImphdmEuIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZE51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGlkTnVsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGludGVybmFsIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNhY2hlKCkgewotICAgICAgICBwcm9wZXJ0eUNhY2hlLmNsZWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjMxNzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jCi0jIERvIG5vdCByZW1vdmUgdGhlIGZvbGxvd2luZyBjb21tZW50IGxpbmUuIEl0IGlzIGEgdmFyaWFibGUgdXNlZCBieSBhIHRyYW5zbGF0aW9uIHRvb2wuCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBETyBOT1QgVE9VQ0ggVEhFU0UgUFJPUEVSVElFUyAtIFRIRVkgQVJFIEFVVE9NQVRJQ0FMTFkgVVBEQVRFRCBCWSBUSEUgQlVJTEQKLSMgUFJPQ0VTUy4KLWF4aXNWZXJzaW9uPUFwYWNoZSBBeGlzMiB2ZXJzaW9uOiBAYXhpc1ZlcnNpb25ACi1heGlzVmVyc2lvblJhdz1AYXhpc1ZlcnNpb25ACi1heGlzQnVpbHRPblJhdz1AVE9EQVlACi1heGlzVXNlckFnZW50PUF4aXMvQGF4aXNWZXJzaW9uQAotYnVpbHRPbj1CdWlsdCBvbiBAVE9EQVlACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aHJlYWRwb29sc2h1dGRvd249VGhyZWFkIHBvb2wgaXMgc2h1dCBkb3duLgotZXJyb3JXaGlsZVNhZmVTaHV0RG93bj1FcnJvciBkdXJpbmcgc2FmZSBzaHV0ZG93bgotaW52YWxpZHVzZXI9VGhlIHVzZXIgbmFtZSBpcyBub3QgdmFsaWQuCi1pbnZhbGlkU09BUHZlcnNpb249VGhlIFNPQVAgVVJJIGlzIG5vdCB2YWxpZC4gQXhpczIgc3VwcG9ydHMgU09BUCBWZXJzaW9uIDEuMSBhbmQgMS4yIG9ubHkuCi1jYW5ub3RJbmZlclRyYW5zcG9ydD1UaGUgc3lzdGVtIGNhbm5vdCBpbmZlciB0aGUgdHJhbnNwb3J0IGluZm9ybWF0aW9uIGZyb20gdGhlIHswfSBVUkwuCi1jYW5ub3RJbmZlclRyYW5zcG9ydE5vQWRkcj1BZGRyZXNzIGluZm9ybWF0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBFbmRwb2ludCBSZWZlcmVuY2UgKEVQUikuVGhlIHN5c3RlbSBjYW5ub3QgaW5mZXIgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20uCi1jYW5ub3RCZU51bGxBeGlzT3BlcmF0aW9uPVRoZSBBeGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgbnVsbC4KLWNhbm5vdEJlTnVsbFNlcnZpY2VDb250ZXh0PVRoZSBTZXJ2aWNlQ29udGV4dCBjYW5ub3QgYmUgbnVsbC4KLWNhbm5vdEJlTnVsbENvbmZpZ3VyYXRpb25Db250ZXh0PVRoZSBDb25maWd1cmF0aW9uQ29udGV4dCBjYW5ub3QgYmUgbnVsbC4KLWNhbm5vdEJlTnVsbE9wZXJhdGlvbkNvbnRleHQ9VGhlIE9wZXJhdGlvbkNvbnRleHQgY2Fubm90IGJlIG51bGwuCi1ub3doZXJlVG9TZW5kRXJyb3I9VGhlIHJldHVybiByZXNwb25zZSBwYXRoIGlzIG1pc3NpbmcgYW5kIGZhdWx0VG8gaXMgbm90IHNwZWNpZmllZC4KLWVycm9yd2hpbGVQcm9jZXNzaW5nRmF1bHQ9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZmF1bHQuIFNlZSB0aGUgcHJldmlvdXMgZXJyb3IgaW4gdGhlIHN0YWNrIHRyYWNlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAKLXVuU3VwcG9ydGVkTUVQPUFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiAoTUVQKSBleGlzdHMgaW4gezB9LgotbWVwQ2xpZW50U3VwcG9ydE9ubHk9VGhpcyBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgY2xpZW50IHN1cHBvcnRzIHswfSBvbmx5IGFuZCB0aGUgc3VwcGxpZWQgQXhpcyBvcGVyYXRpb25zIHN1cHBvcnRzIHsxfS4KLWlucHV0c3RyZWFtTnVsbD1UaGUgaW5wdXQgc3RyZWFtIGZvciBhbiBpbmNvbWluZyBtZXNzYWdlIGlzIG51bGwuCi11bmtub3duVHJhbnNwb3J0PUFuIHVua25vd24gdHJhbnNwb3J0IGNhbGxlZCB7MH0gZXhpc3RzLgotcGFyYW1Jc05vdFNwZWNpZmllZD1UaGUgezB9IHBhcmFtZXRlciBpcyBub3Qgc3BlY2lmaWVkLgotZ3Jvb3Z5Tm9hbnN3ZXI9QW4gYW5zd2VyIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmcm9tIGdyb292eS4gCi1ncm9vdnlVbmFibGVUb0xvYWQ9VGhlIHN5c3RlbSBjYW5ub3QgbG9hZCB7MH0KLW91dE1lc3NhZ2VOdWxsPVRoZSBvdXQgbWVzc2FnZSBpcyBOVUxMLCBub3RoaW5nIHRvIHdyaXRlLgotY2FuTm90QmVOdWxsPXswfSBjYW5ub3QgYmUgTlVMTC4KLW5vdEZvdW5kPXswfSBjYW5ub3QgYmUgZm91bmQuCi10cmFuc3BvcnRFcnJvcj1UcmFuc3BvcnQgZXJyb3I6IHswfSBFcnJvcjogezF9Ci1odHRwVHJhbnNwb3J0RXJyb3I9SFRUUCBUcmFuc3BvcnQgZXJyb3I6ICcnezB9JycgLSAnJ3sxfScnCi1wcmVhdHVyZUVPUz1BIHByZW1hdHVyZSBlbmQgb2Ygc3RyZWFtIGhhcyBvY2N1cnJlZC4KLXJlc3BvbnNlVGltZU91dD1UaW1lIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgc2VydmVyIHRvIHNlbmQgdGhlIHJlc3BvbnNlLgotY2FsbEJhY2tDb21wbGV0ZWRXaXRoRXJyb3I9VGhlIGNhbGxiYWNrIGNvbXBsZXRlLCBidXQgdGhlcmUgd2FzIG5vIGVudmVsb3BlIGVsZW1lbnQgb3IgYW4gZXJyb3IuCi0yY2hhbm5lbE5lZWRBZGRyZXNzaW5nPVRvIHVzZSB0d28gdHJhbnNwb3J0IGNoYW5uZWxzIHlvdSBtdXN0IHVzZSB0aGUgV1MtQWRkcmVzc2luZyBtb2R1bGUuIAotdXNlU2VwYXJhdGVMaXN0ZW5lckxpbWl0ZWQ9U2V0dGluZyB1c2VTZXBhcmF0ZUxpc3RlbmVyIHRvIGZhbHNlIGlzIG5vdCBhIHZhbGlkIG9wdGlvbiB3aGVuIHRoZSBTZW5kZXIgaXMgezB9IGFuZCBMaXN0ZW5lciBpcyB7MX0gICAKLXJlcGx5TmVlZFN0YXJ0aW5nPUJlZm9yZSByZXF1ZXN0aW5nIHRoZSBSZXBseVRvIHZhbHVlLCB0aGUgc3lzdGVtIG11c3Qgc3RhcnQgdGhlIFRyYW5zcG9ydExpc3RlbmVyLiBUaGUgVHJhbnNwb3J0IGlzIHswfQotZmFpbGVkVG9PcGVuU29ja2V0PVRoZSBzeXN0ZW0gZmFpbGVkIHRvIG9wZW4gdGhlIHNvY2tldC4KLW5vUmVjZXA0RW1haWw9QSByZWNpcGllbnQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZS1tYWlsIG1lc3NhZ2UuCi11bmtub3duTXNnTGFiZWw9QW4gdW5rbm93biBtZXNzYWdlIGxhYmVsIGhhcyBiZWVuIGVuY291bnRlcmVkOiB7MH0KLWNhbm5vdENvcnJlbGF0ZU1zZz0gVGhlIHN5c3RlbSBjYW5ub3QgY29ycmVsYXRlIHRoZSB7MH0gbWVzc2FnZSBvcGVyYXRpb24gdG8gUmVsYXRlc1RvIHsxfQotYWRkQWZ0ZXJJbnZva2UwMD17MH06IFRoZSBjaGFpbiBhbHJlYWR5IGhhcyBiZWVuIGludm9rZWQuCi0jQWFuZEJkb25vdG1hdGNoPVRoZSB7MH0gdmFsdWUgZG9lcyBub3QgbWF0Y2ggezF9IHZhbHVlLiBUaGUgc3lzdGVtIGV4cGVjdGVkIHRoZSB7Mn0gdmFsdWUsIGJ1dCBmb3VuZCB0aGUgezN9IHZhbHVlLgotcnBjTmVlZG1hdGNoaW5nQ2hpbGQ9VGhlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCAoUlBDKSBzdHlsZSBleHBlY3RzIHRoZSBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIFNPQVAgYm9keS4KLXVua25vd25TdHlsZT1UaGUgezB9IHN0eWxlIGlzIGFuIHVua25vd24gc3R5bGUuCi1yYXdYbWxQcm92aWRlcklzTGltaXRlZD1UaGUgWE1MIHByb3ZpZGVyIHN1cHBvcnRzIG9ubHkgdGhlIG1ldGhvZHMgdGhhdCBjb250YWluIHRoZSBwdWJsaWMgT01FbGVtZW50ICZsdDttZXRob2QtbmFtZSZndDsoT01FbGVtZW50KSBzaWduYXR1cmUgd2hlcmUgdGhlIG1ldGhvZC1uYW1lIHZhcmlhYmxlIGNhbiBiZSBhbnkgdmFsdWUuCi1tZXRob2ROb3RJbXBsZW1lbnRlZD1UaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZG9lcyBub3QgZGVmaW5lIGEgbWV0aG9kIGNhbGxlZAotbWV0aG9kRG9lc05vdEV4aXN0SW5PdXQ9VGhlIFNlcnZpY2VDbGFzcyBvYmplY3QgZG9lcyBub3QgaW1wbGVtZW50IHRoZSByZXF1aXJlZCBtZXRob2QgaW4gdGhlIGZvbGxvd2luZyBmb3JtOiBPTUVsZW1lbnQgezB9KE9NRWxlbWVudCBlKQotbWV0aG9kRG9lc05vdEV4aXN0SW5Pbmx5PVJhd1hNTE1lc3NhZ2VSZWNlaXZlciBjYW4gbm90IGhhbmRsZSB0aGlzIHNjZW5hcmlvIHNpbmNlIFNlcnZpY2VDbGFzcyBoYXMgaW1wbGVtZW50ZWQgdG8gdGFrZSBOb24gT01FbGVtZW50IGFzIG1ldGhvZCBhcmd1bWVudHMuCi1pbXBsUmV0dXJuZWROdWxsPVRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyByZXR1cm5lZCBhIG51bGwgdmFsdWUuCi1pbnZhbGlkTWV0aG9kTmFtZT1UaGUgezB9IG1ldGhvZCBuYW1lIGlzIG5vdCB2YWxpZCBmb3IgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuCi1ibG9ja0ludm9jYXRpb25FeHBlY3RzUmVzPVRoZSBibG9ja2luZyBpbnZvY2F0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSByZXNwb25zZS4KLXNlcnZpY2VHcm91cElETm90Rm91bmQ9VGhlIFNPQVAgc2Vzc2lvbiBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gdGhlIGNvcnJlbGF0aW9uIGlkIHRoYXQgd2FzIHJlY2VpdmVkLgotCi0jICAgIENsaWVudAotb3BlcmF0aW9ubm90Zm91bmQ9VGhlIHswfSBvcGVyYXRpb24gY2Fubm90IGJlIGZvdW5kLgotdW5zdXBwb3J0ZWR5eXBlPUFuIHVuc3VwcG9ydGVkIHR5cGUgZXhpc3RzLgotdW5rbm93bnNvYXB2ZXJzaW9uPVRoZSBzeXN0ZW0gZG9lcyBub3QgcmVjb2duaXplIHRoZSBTT0FQIHZlcnNpb24uCi1jYW5ub3RmaW5kYW1vZHVsZXRvcHJvY2Vzcz1UaGUgc3lzdGVtIGNhbm5vdCBmaW5kIGEgbW9kdWxlIHRvIHByb2Nlc3MgezB9IHR5cGUgYXNzZXJ0aW9ucy4KLW5vZW5kcG9pbnRmb3VuZD1BbiBlbmRwb2ludCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFNlcnZpY2UgezB9IAotZW5kcG9pbnRub3Rmb3VuZD1BbiBlbmRwb2ludCBjYW5ub3QgYmUgZm91bmQuCi11bnN1cHBvcnRkbWVwPUFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgZXhjaGFuZ2UgcGF0dGVybiAoTUVQKSBleGlzdHMuCi1ub3NlcnZpY2Vmb3VuZD1BIHNlcnZpY2Ugd2FzIG5vdCBsb2NhdGVkLiAKLQotIyBjb250ZXh0Ci1zZXJ2aWNlbm90Zm91bmQ9QSBzZXJ2aWNlIGNhbm5vdCBiZSBsb2NhdGVkLgotdGhyZWFkcG9vbHNldD1UaGUgdGhyZWFkIHBvb2wgaXMgYWxyZWFkeSBzZXQuCi10cmFuc3BvcnRpbml0ZXJyb3I9QSB0cmFuc3BvcnQtT1VUIGluaXRpYWxpemF0aW9uIGVycm9yOiB7MH0KLWludmFsaWRzZXJ2aWNlaW5hZ3JvdXA9VGhlIHswfSBzZXJ2aWNlLCB3aGljaCBpcyBub3QgdmFsaWQsIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgezF9IHNlcnZpY2UgZ3JvdXAuCi1jYW5ub3RGbHVzaFJvb3ROdWxsPUNvbnRleHQgY2Fubm90IGJlIGZsdXNoZWQgc2luY2UgdGhlIHJvb3QgY29udGV4dCBpcyBudWxsCi0KLSMgICAgIERlcGxveW1lbnQgRXJyb3JzCi1pbnZhbGlkV1NETEZvdW5kPVRoZSBXU0RMIGZpbGUgZm91bmQgaW4gdGhlIHNlcnZpY2UgYXJjaGl2ZSBmaWxlIGlzIG5vdCB2YWxpZC4gVGhlIFdTREwgZmlsZSBtdXN0IGhhdmUgZWl0aGVyIGh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbCBvciBodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwgYXMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLSN3c2RsZmlsZW5vdGZvdW5kPVRoZSBXU0RMIGZpbGUgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgc2VydmljZTogezB9Ci1zZXJ2aWNleG1sbm90Zm91bmQ9VGhlIHNlcnZpY2VzLnhtbCBmaWxlIGNhbm5vdCBiZSBmb3VuZCBmb3IgdGhlIHNlcnZpY2U6IHswfQotbW9kdWxleG1sbm90Zm91bmQ9VGhlIG1vZHVsZS54bWwgZmlsZSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBtb2R1bGU6IHswfQotY2xhc3Nub3Rmb3VuZD1UaGUgezB9IGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KLWZpbGVOb3RGb3VuZD1UaGUgezB9IGZpbGUgY2Fubm90IGJlIGZvdW5kLgotcmVwb2Nhbm5vdGJlYnVsbD1UaGUgQXhpczIgcmVwb3NpdG9yeSBjYW5ub3QgYmUgbnVsbC4KLWNvbmZpZ25vdGZvdW5kPVRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGF4aXMyLnhtbCBmaWxlLgotcGF0aHRvY29uZmlnY2Fub3RudWxsPVRoZSBwYXRoIHRvIGF4aXMyLnhtbCBmaWxlIGNhbm5vdCBiZSBOVUxMLgotbW9kdWxldmFsZmFpbGVkPU1vZHVsZSB2YWxpZGF0aW9uIGZhaWxlZDogezB9Ci1pbnZhbGlkcGhhc2U9RGlkIG5vdCBmaW5kIHRoZSBkZXNpcmVkIHBoYXNlICcnezB9Jycgd2hpbGUgZGVwbG95aW5nIGhhbmRsZXIgJyd7MX0nJy4KLWRpc3BhdGNoUGhhc2VOb3RGb3VuZE9uSW5mbG93PVRoZSAnIkRpc3BhdGNoJyIgcGhhc2UgaXMgbm90IGZvdW5kIG9uIHRoZSBnbG9iYWwgJyJJbkZsb3cnIiBwaGFzZSBvZiB0aGUgYXhpczIueG1sIGZpbGUuIE1ha2Ugc3VyZSB0aGUgcGhhc2UgaXMgd2l0aGluIHRoZSBheGlzMi54bWwgZmlsZS4KLSNpbnZhbGlkbW9kdWxlcmVmPVRoZSB7MH0gc2VydmljZSByZWZlcnMgdG8gdGhlIHsxfSBtb2R1bGUsIHdoaWNoIGlzIG5vdCB2YWxpZC4KLWludmFsaWRtb2R1bGVyZWZieW9wPXswfSBvcGVyYXRpb24gcmVmZXJzIHRvIHRoZSB7MX0gbW9kdWxlLCB3aGljaCBpcyBub3QgdmFsaWQuCi1hZGRpbmduZXdtb2R1bGU9QWRkaW5nIG5ldyBtb2R1bGUKLXNldHRpbmdjbD1UaGUgc2VydmljZSBpcyBzZXR0aW5nIHRoZSB7MH0gY2xhc3MgbG9hZGVyLgotZGVwbG95aW5nd3M9RGVwbG95aW5nIFdlYiBzZXJ2aWNlOiB7MH0gLSB7MX0KLWludmFsaWRzZXJ2aWNlPVRoZSB7MH0gc2VydmljZSwgd2hpY2ggaXMgbm90IHZhbGlkLCBjYXVzZWQgezF9Ci1kZXBsb3lpbmdtb2R1bGU9RGVwbG95aW5nIG1vZHVsZTogezB9IC0gezF9Ci1kZXBsb3lpbmdwb2pvPURlcGxveWluZyBwb2pvOiB7MH0gLSB7MX0KLWludmFsaWRtb2R1bGU9VGhlIHswfSBtb2R1bGUsIHdoaWNoIGlzIG5vdCB2YWxpZCwgY2F1c2VkIHsxfQotc2VydmljZXJlbW92ZWQ9VW5kZXBsb3lpbmcgV2ViIHNlcnZpY2U6IHswfQotdHlwZW1hcHBpbmdub3RhbGxvd2VkPVR5cGUgTWFwcGluZ3MgYXJlIG5vdCBhbGxvd2VkIGluIHRoZSBheGlzMi54bWwgZmlsZS4KLWVycm9yaW5sb2FkaW5nbXI9QSB7MH0gZXJyb3Igb2NjdXJyZWQgaW4gbG9hZGluZyB0aGUgbWVzc2FnZSByZWNlaXZlciB7MX0KLWVycm9yaW5sb2FkaW5ndHM9QSB7MH0gZXJyb3Igb2NjdXJyZWQgaW4gbG9hZGluZyB0aGUgdHJhbnNwb3J0IHNlbmRlciB7MX0gCi1lcnJvcmxvYWRpbmdidWlsZGVyPUEgezB9IGVycm9yIG9jY3VycmVkIHdoaWxlIHZhbGlkYXRpbmcgdGhlIG1lc3NhZ2UgYnVpbGRlciB7MX0KLWVycm9ybG9hZGluZ2Zvcm1hdHRlcj1BIHswfSBlcnJvciBvY2N1cnJlZCB3aGlsZSB2YWxpZGF0aW5nIHRoZSBtZXNzYWdlIGZvcm1hdHRlciB7MX0KLWludmFsaWRjb25maWdhdHRyaWJ1dGU9QXR0cmlidXRlcyBleGlzdCBpbiB0aGUgYXhpczIueG1sIGZpbGUgdGhhdCBhcmUgbm90IHZhbGlkLiAgezB9IHsxfQotdW5kZWZpbmVkRmxvd1R5cGU9QW4gdW5kZWZpbmVkIGZsb3cgdHlwZSBleGlzdHMgaW4gezB9Ci1mbG93dHlwZWlzcmVxdWlyZD1UaGUgZmxvdyB0eXBlIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlIGluIHswfQotZWxlbWVudGlzbm90YWxsb3c9VGhlIHswfSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIGluIHRoZSBheGlzMi54bWwgZmlsZS4KLSMgb3V0Zmxvd25vdGFsbG93ZWRpbnRyaW4gaXMgbm90IHVzZWQKLSNvdXRmbG93bm90YWxsb3dlZGludHJpbj1PVVRGbG93IGRvZXMgbm90IHN1cHBvcnQgaW4gQXhpc1RyYW5zcG9ydElOICB7MH0KLXVua25vd25lbGVtZW50PVRoaXMgZWxlbWVudCBpcyB1bmtub3duOiB7MH0KLWluZmxvd25vdGFsbG93ZWRpbnRyb3V0PUluRmxvdyBpcyBub3Qgc3VwcG9ydGVkIGluIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHswfQotYmFkYXJndWZvcnNlcnZpY2U9VGhlIHswfSBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZCBmb3IgdGhlIHsxfSBzZXJ2aWNlLgotdHlwZW1hcHBpbmdub3RpbXBsPVR5cGUgbWFwcGluZyBzdXBwb3J0IGlzIG5vdCBhdmFpbGFibGUuCi1iZWFubWFwcGluZ25vdGltcGw9QmVhbiBtYXBwaW5nIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4KLW1vZHVsZW5vdGZvdW5kPVRoZSB7MH0gbW9kdWxlIGlzIG5vdCB2YWxpZCBvciBoYXMgbm90IGJlZW4gZGVwbG95ZWQuCi1iYWRwYXJhYWd1PWJhZCBwYXJhbWV0ZXIgYXJndW1lbnRzLiBuYW1lIGNhbm5vdCBiZSBudWxsIDogezB9Ci1iYWRsaXN0YWd1PVRoZSBsaXN0ZW5lciBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZC4KLSMgaW52YWxpZGhhbmRsZXJkaWYgYW5kIHRoaXNzaG91bGRiZWltcGxlbWVudCBhcmUgbm90IHVzZWQuCi0jaW52YWxpZGhhbmRsZXJkaWY9IFRoZSBIYW5kbGVyIGNhbm5vdCBoYXZlIGJvdGggYSBuYW1lIGFuZCBhIHJlZiB7MH0KLSN0aGlzc2hvdWxkYmVpbXBsbWVudD1UaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB7MH0KLW9wbm90Zm91bmRpbndzZGw9VGhlIHswfSBPcGVyYXRpb24gTmFtZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFdTREwgZmlsZS4KLSMgYmFkb3BlYXR0cmlidXRlIGFuZCB1bmtub3duZWxlbWVudGlub3AgYXJlIG5vdCB1c2VkLgotI2JhZG9wYXR0cmlidXRlPUFuIGF0dHJpYnV0ZSB0aGF0IGlzIG5vdCB2YWxpZCB3YXMgZm91bmQgaW4gdGhlIG9wZXJhdGlvbjogezB9Ci0jdW5rbm93bmVsZW1lbnRpbm9wPUFuIHVua25vd24gZWxlbWVudCBleGlzdHMgaW4gdGhlIG9wZXJhdGlvbjogezB9Ci1tb2R1bGVjYW5ub3RoYXZyYm90aG5hbWVhbmRyZWY9QSBtb2R1bGUgY2Fubm90IGhhdmUgYm90aCBhIG5hbWUgYW5kIGEgcmVmIHswfS4KLWludmFsaWRlbGVpbm1vZHVsZT1UaGUgezB9IGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgaW4gdGhlIG1vZHVsZS54bWwgZmlsZS4KLSMgaW52YWxpZHBoYXNlMDEgaXMgbm90IHVzZWQuCi0jaW52YWxpZHBoYXNlMDE9SW52YWxpZCBQaGFzZSA6IHswfSBmb3IgdGhlIGhhbmRsZXIgezF9IGRvZXMgbm90IGV4aXQgaW4gYXhpczIueG1sIG9yIHJlZmVyaW5nIHRvIHBoYXNlIGluIGRpZmZlcmVudCBmbG93Ci1pbnZhbGlkbW9kdWxlcmVmYnljb25maWc9QSByZWZlcmVuY2UgYnkgdGhlIGF4aXMyLnhtbCBmaWxlIGlzIG1hZGUgdG8gdGhlIHswfSBtb2R1bGUsIHdoaWNoIGlzIG5vdCB2YWxpZC4KLXBoYXNlZG9zZW5vdHNwZWNpZmllZD1BIFBoYXNlIGlzIHNwZWNpZmllZCBmb3IgdGhlIHswfSBoYW5kbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1zZXJ2aWNlbW9kdWxlY2Fubm90aGF2ZWdsb2JhbD1BIHNlcnZpY2Utc3BlY2lmaWMgbW9kdWxlIGNhbm5vdCByZWZlciBzeXN0ZW0gcHJlLWRlZmluZWQgcGhhc2VzOiAgezB9Ci1mbmY9VGhlIGZpbGUgY2Fubm90IGJlIGZvdW5kLgotZm5mX2U9VGhlIHswfSBmaWxlIGNhbm5vdCBiZSBmb3VuZC4KLVN0cmVhbUV4Y2VwdGlvbj1YTUxTdHJlYW1FeGNlcHRpb24gOiB7MH0KLW1uZj17MH0gOiBUaGUgbW9kdWxlIGNhbm5vdCBiZSBmb3VuZC4KLWludmFsaWRfc3RvcmFnZT1UaGUgZGVmaW5pdGlvbiBvZiB0aGUgc3RvcmFnZSBjbGFzcyBpcyBub3QgdmFsaWQgYmVjYXVzZSB0aGUgY2xhc3MgbmFtZSBpcyBtaXNzaW5nLgotbm9fZGlzcGF0Y2hlcl9mb3VuZD1BIGRpc3BhdGNoZXIgY2Fubm90IGJlIGZvdW5kIGFuZCBjYW5ub3QgY29udGludWUuCi1ub01ldGFJbmY9SW52YWxpZCBzZXJ2aWNlLiBNRVRBLUlORiBkaXJlY3Rvcnkgbm90IGZvdW5kLgotaXZzPUludmFsaWQgc2VydmljZS4gTUVUQS1JTkYgZGlyZWN0b3J5IG5vdCBmb3VuZC4KLWJhZE1vZHVsZUZyb21PcGVyYXRpb249QW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIHswfSBlbmdhZ2luZyBtb2R1bGUgdG8gdGhlIHsxfSBvcGVyYXRpb24uIEEgbW9kdWxlIHJlZmVyZW5jZSB0aGF0IGlzIG5vdCB2YWxpZCBleGlzdHMgYXQgdGhlIG9wZXJhdGlvbi4KLWJhZE1vZHVsZUZyb21TZXJ2aWNlPUFuIGVycm9yIG9jY3VycmVkIGluIHRoZSB7MH0gZW5nYWdpbmcgbW9kdWxlIHRvIHRoZSB7MX0gc2VydmljZS4gQSBtb2R1bGUgcmVmZXJlbmNlIHRoYXQgaXMgbm90IHZhbGlkIGV4aXN0cyBhdCB0aGUgc2VydmljZS4KLUluc3RhbnRpYXRpb25FeGNlcHRpb249QW4gSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlcnJvciBvY2N1cnJlZCBpbiBBeGlzIHN0b3JhZ2UgcHJvY2Vzc2luZyAgezB9Ci1JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uPUFuIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXJyb3Igb2NjdXJyZWQgaW4gQXhpcyBzdG9yYWdlIHByb2Nlc3NpbmcgIHswfQotdHJhbnNwb3J0U2VuZGVyRXJyb3I9VGhlIFRyYW5zcG9ydFNlbmRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyByZXF1aXJlZCBmb3IgdGhlIHRyYW5zcG9ydCB7MH0KLW9ic2VyZXJyb3I9QW4gaW1wbGVtZW5hdGlvbiBjbGFzcyBvZiB0aGUgT2JzZXJ2ZXIgb2JqZWN0IGlzIHJlcXVpcmVkLgotaW52YWxpZG1vZHVsZWNvbmZpZz1BIG1vZHVsZSBjb25maWd1cmF0aW9uIGV4aXN0cyB0aGF0IGlzIG5vdCB2YWxpZC4KLWludmFsaWRoYW5kbGVyPUludmFsaWQgaGFuZGxlciBjb25maWchICBOYW1lOiB7MH0gUmVhc29uOiB7MX0KLXBhcmFtZXRlcmxvY2tlZGVycm9yPVRoZSB7MH0gcGFyYW1ldGVyIGlzIGxvY2tlZCBhdCB0aGUgdG9wIGxldmVsIGFuZCBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4KLW9wX2Vycm9yPVByb2Nlc3NpbmcgT3BlcmF0aW9ucyBNb2R1bGVzIHdpdGggYW4gZXJyb3Igb2YgezB9Ci1zZXJ2aWNlbmFtZWVyb3I9QSBzZXJ2aWNlIG5hbWUgaXMgcmVxdWlyZWQuCi1pbnZhbGlkX29wPVRoZSBvcGVyYXRpb24gaXMgbm90IHZhbGlkOiB7MH0gCi1jYW5ub3RDb3JyZWxhdGVNc2cwMT1DYW5ub3QgY29ycmVsYXRlIE1lc3NhZ2VJRCB7MX0gdG8gezB9Ci1maWxlRXhpc3RzTm9PdmVyd3JpdGU9VGhlIHswfSBmaWxlIGNhbm5vdCBiZSBvdmVyd3JpdHRlbi4KLWNhbm5vdENvbm5lY3RFcnJvcj1VbmFibGUgdG8gY29ubmVjdAotZmFpbGVkSk1TQ29ubmVjdG9yU2h1dGRvd249QSBmYWlsdXJlIG9jY3VycmVkIGluIHRoZSBKTVNDb25uZWN0b3JTaHV0ZG93bgotZXJyb3JpbnNjaGVtYWdlbj1UaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIGR1cmluZyBzY2hlbWEgZ2VuZXJhdGlvbjogezB9Ci1lcnJvcmluaW5wdXRzdHJlYW1jbG9zZT1BbiBlcnJvciBvY2N1cnJlZCBpbiBjbG9zaW5nIGlucHV0IHN0cmVhbS4KLXBoYXNlY2xhc3Nub3Rmb3VuZD1UaGUgc3lzdGVtIGNhbm5vdCBmaW5kIHRoZSBwaGFzZSBjbGFzczogezB9IDogezF9Ci1tb2R1bGVuYW1lY2Fubm90YmVudWxsPVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIC9kZWZhdWx0TW9kdWxlVmVyc2lvbnMvbW9kdWxlL0BuYW1lIGlzIG5vdCBzZXQgaW4gYXhpczIueG1sCi1tb2R1bGV2ZXJzaW9uY2Fubm90YmVudWxsPVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlIC9kZWZhdWx0TW9kdWxlVmVyc2lvbnMvbW9kdWxlL0B2ZXJzaW9uIGlzIG5vdCBzZXQgaW4gYXhpczIueG1sCi0jIGRvY3VtZW50Y3JlYXRpbmdlcnJvciBpcyBub3QgdXNlZC4KLSNkb2N1bWVudGNyZWF0aW5nZXJyb3I9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gY3JlYXRpbmcgdGhlIGRvY3VtZW50IGZyb20gdGhlIFdTREwgZmlsZTogezB9Ci1ub3NlcnZpY2VlbGVtdGZvdW5kPVRoZSBqYXZheC53c2RsLlNlcnZpY2UgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuCi1zZXJ2aWNlcG9ydGVycm9yPVRoZSBzeXN0ZW0gbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBwb3J0Lgotc29hcGJpbmRpbmdlcnJvcj1UaGUgc3lzdGVtIG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcG9ydCB3aXRoIGEgU09BUCBiaW5kaW5nLgotYXhpc29wZXJhdGlvbmNyZWF0ZWVycm9yPUFuIGV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIEF4aXNPcGVyYXRpb24gZm9yIHRoZSBBeGlzU2VydmljZTogezB9Ci13cmFwcGVyZWxlbWVudGNyZWF0ZXJyb3I9QW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoZW4gY3JlYXRpbmcgdGhlIHdyYXBwZXIgZWxlbWVudC4KLXBvbGljeXByb2Nlc3NpbmdlcnJvcj1BbiBleGNlcHRpb24gb2NjdXJyZWQgd2hlbiBwcm9jZXNzaW5nIHBvbGljeSBlbGVtZW50cy4KLWJvdGhyZXBvYW5kY29uZmlnbnVsbD1UaGUgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgYXhpczIueG1sIGZpbGUgaXMgbm90IHByb3ZpZGVkLiBUaGUgc3lzdGVtIHdpbGwgdXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHdoaWNoIHVzZXMgdGhlIGRlZmF1bHRfYXhpczIueG1sIGZpbGUuCi1jYW5ub3RmaW5kcmVwbz1UaGUgc3lzdGVtIGNhbm5vdCBsb2NhdGUgdGhlIHNwZWNpZmllZCByZXBvc2l0b3J5IGxvY2F0aW9uOiB7MH0KLW5vcmVwb2ZvdW5kaW5heGlzMj1BIHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgbm90IGZvdW5kIGluIHRoZSBheGlzMi54bWwgZmlsZS4KLW5vc2VydmljZWRpcmZvdW5kPU5vIHNlcnZpY2VzIGRpcmVjdG9yeSB3YXMgZm91bmQgdW5kZXIgezB9Lgotbm9tb2R1bGVkaXJmb3VuZD1ObyBtb2R1bGVzIGRpcmVjdG9yeSB3YXMgZm91bmQgdW5kZXIgezB9LgotY29uZmRpcm5vdGZvdW5kPVRoZSBjb25mIGRpcmVjdG9yeSBjYW5ub3QgYmUgZm91bmQgYW5kIHRoZSBheGlzMi54bWwgZmlsZSBpcyBub3QgcHJvdmlkZWQuIFRoZSBzeXN0ZW0gd2lsbCB1c2UgdGhlIGRlZmF1bHRfYXhpczIueG1sIGZpbGUuCi1ub2F4aXMyeG1sZm91bmQ9VGhlIGF4aXMyLnhtbCBmaWxlIGNhbm5vdCBiZSBmb3VuZCBpbiBjb25mIGRpcmVjdG9yeS4gIFRoZSBzeXN0ZW0gd2lsbCB1c2UgdGhlIGRlZmF1bHRfYXhpczIueG1sIGZpbGUuCi1iYWRlbGVtZW50Zm91bmQ9VGhlIHN5c3RlbSB3YXMgbG9va2luZyBmb3IgdGhlICcnezB9JycgZWxlbWVudCwgYnV0IGl0IGZvdW5kICcnezF9JycKLW1lc3NhZ2VsYWJlbGNhbm5vdGZvdW5kPVRoZSBtZXNzYWdlIGxhYmVsIGNhbm5vdCBiZSBudWxsLgotcGFyYW10ZXJsb2NrZWRieXBhcmVudD1UaGUgezB9IHBhcmFtZXRlciBpcyBhbHJlYWR5IGxvY2tlZCBhbmQgdGhlIHZhbHVlIGNhbm5vdCBiZSBvdmVycmlkZGVuLgotbW9kdWxlYWxyZWR5ZW5nYWdlZD1UaGUgezB9IG1vZHVsZSBpcyBhbHJlYWR5IGVuZ2FnZWQuIFRoZSBvcGVyYXRpb24gaGFzIGJlZW4gc3RvcHBlZC4gCi1tZXBtYXBwaW5nZXJyb3I9VGhlIHN5c3RlbSBjYW5ub3QgbWFwIHRoZSBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gKE1FUCkgVVJJIHRvIGEgY29uc3RhbnQgdmFsdWUgZm9yIHRoZSBheGlzMiBNRVAuCi1tZXBub3R5ZXRpbXBsZW1lbnRlZD1UaGUgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChNRVApIHswfSBoYXMgbm90IGltcGxlbWVudGVkIHRoZSBjcmVhdGVDbGllbnQgbWV0aG9kLgotbW9kdWxlYWxyZWR5ZW5nYWdldG9zZXJ2aWNlPVRoZSBzeXN0ZW0gaXMgYXR0ZW1wdGluZyB0byBlbmdhZ2UgYSBtb2R1bGUgdGhhdCBpcyBhbHJlYWR5IGVuZ2FnZWQ6IHswfQotaW52YWxpZG9wZXJhdGlvbj1UaGUgZm9sbG93aW5nIG9wZXJhdGlvbiBpcyBub3QgdmFsaWQ6IHswfQotbm9zY2hlbWFmb3VuZD1BIHNjaGVtYSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBzZXJ2aWNlLgotbW9kdWxlbm90YXZhaWxibGU9VGhlIHN5c3RlbSBpcyBhdHRlbXB0aW5nIHRvIGVuZ2FnZSBhIG1vZHVsZSB0aGF0IGlzIG5vdCBhdmFpbGFibGU6IHswfQotbW9kdWxlYWxyZWR5ZW5nYWdlZHRvc2VydmljZWdyb3VwPVRoZSB7MH0gbW9kdWxlIGhhcyBhbHJlYWR5IGJlZW4gZW5nYWdlZCBvbiB0aGUgc2VydmljZSBncm91cC4gVGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBzdG9wcGVkLiAKLXNlcnZpY2Vub3Rmb3VuZGlud3NkbD1UaGUgezB9IHNlcnZpY2UgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBXU0RMIGZpbGUuCi1ub3NlcnZpY2Vmb3VuZGlud3NkbD1UaGUgc2VydmljZSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGdpdmVuIFdTREwgZmlsZS4KLW5vcG9ydHR5cGVmb3VuZGZvcj1BIHBvcnQgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgezB9IHBvcnQgbmFtZS4KLW5vcG9ydHR5cGVmb3VuZD1BIHBvcnQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzZXJ2aWNlIGVsZW1lbnQuCi1tb2R1bGVuZj1BIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQuCi1tZXBjb21wbGV0ZWQ9QSBtZXNzYWdlIHdhcyBhZGRlZCB0aGF0IGlzIG5vdCB2YWxpZC4gSG93ZXZlciwgdGhlIG9wZXJhdGlvbiBjb250ZXh0IHdhcyBjb21wbGV0ZS4KLWludmFsaWRhY2Vzcz0gQW4gYWNjZXNzIG9jY3VycmVkIHRoYXQgaXMgbm90IHZhbGlkLgotbWVwaXNjb21wbHRlZD1UaGUgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChNRVApIGlzIGFscmVhZHkgY29tcGxldGUuIFVzZSB0aGUgcmVzZXQgbWV0aG9kIGJlZm9yZSByZS1ydW5uaW5nLgotb3V0bXNnY3R4bnVsbD1UaGUgb3V0IG1lc3NhZ2UgY29udGV4dCBpcyBudWxsLiBTZXQgdGhlIG91dCBtZXNzYWdlIGNvbnRleHQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCi1jYW5ub3RyZXNldD1UaGUgbWVzc2FnZSBleGNoYW5nZSBwYXR0ZXJuIChNRVApIGlzIG5vdCBjb21wbGV0ZS4gQ2Fubm90IHJlc2V0Ci1jYW5ub3RhZGRtc2djdHg9VGhlIHN5c3RlbSBjYW5ub3QgYWRkIHRoZSBtZXNzYWdlIGNvbnRleHQgYWdhaW4gdW50aWwgY2xpZW50IHJ1bnMuCi1jbHVzdGVySW1wbE5vdEZvdW5kPUNsdXN0ZXJpbmcgaW1wbGVtZW50YXRpb24gY2xhc3MgezB9IG5vdCBmb3VuZAotY29udGV4dE1hbmFnZXJMaXN0ZW5lcklzTnVsbD1DbHVzdGVyIENvbnRleHRNYW5hZ2VyIGVudHJ5IG5vdCBmb3VuZCBpbiBheGlzMi54bWwKLWNvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXJJc051bGw9Q2x1c3RlciBDb25maWd1cmF0aW9uTWFuYWdlciBlbnRyeSBub3QgZm91bmQgaW4gYXhpczIueG1sCi1jYW5ub3RMb2FkQ2x1c3RlckltcGw9Q2x1c3RlciBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgYmUgbG9hZGVkCi1jbGFzc0F0dHJpYnV0ZU5vdEZvdW5kPVRoZSBlbGVtZW50IHswfSBtdXN0IGhhdmUgYSBhdHRyaWJ1dGUgd2l0aCB0aGUgbmFtZSAnJ2NsYXNzJycKLQotI1BvbGljeQotZW1wdHlwb2xpY3k9VGhlIFBvbGljeSBJRCBpcyBlaXRoZXIgbnVsbCBvciBlbXB0eS4KLSMgb3V0TWVzc2FnZU51bGwgaXMgbm90IHVzZWQuCi0jb3V0TWVzc2FnZU51bGw9VGhlIG91dCBtZXNzYWdlIGlzIG51bGwuCi1tYWxmb3JtZWRVUkxFeGNlcHRpb24wMD1NYWxmb3JtZWRVUkxFeGNlcHRpb246Ci1leGNlcHRpb24wMD1FeGNlcHRpb246Ci0jQnl0ZSBjb2RlIHJlYWRpbmcgZm9yIEphdmEyV1NETAotYmFkQ2xhc3NGaWxlMDA9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBsb29raW5nIGZvciBwYXJhbWV0ZXIgbmFtZXMgaW4gdGhlIGJ5dGVjb2RlLiBUaGUgaW5wdXQgbWlnaHQgbm90IGJlIGEgdmFsaWQgY2xhc3MgZmlsZS4KLWNhbnRMb2FkQnllY29kZT1UaGUgc3lzdGVtIGNhbm5vdCBsb2FkIHRoZSBieXRlY29kZSBmb3IgdGhlIGNsYXNzICJ7MH0iCi11bmV4cGVjdGVkRU9GMDA9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBsb29raW5nIGZvciB0aGUgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBieXRlY29kZS4gVGhlIGVuZCBvZiB0aGUgZmlsZSB3YXMgcmVhY2hlZCB1bmV4cGVjdGVkbHkuIAotdW5leHBlY3RlZEJ5dGVzMDA9QW4gZXJyb3Igb2NjdXJyZWQgd2hlbiBsb29raW5nIGZvciB0aGUgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSBieXRlY29kZS4gVGhlcmUgYXJlIHVuZXhwZWN0ZWQgYnl0ZXMgaW4gdGhlIGZpbGUuCi0jZGVzY3JpcHRpb24KLXNlcnZpY2Vmb3VuZD1Gb3VuZCBBeGlzU2VydmljZSA6IHswfQotb3BlcmF0aW9uZm91bmQ9Rm91bmQgQXhpc09wZXJhdGlvbiA6IHswfQotY2hlY2tpbmdvcGVyYXRpb249VGhlIHN5c3RlbSBpcyBjaGVja2luZyBmb3IgdGhlIG9wZXJhdGlvbiB1c2luZyB0aGUgZm9sbG93aW5nIFdTQUFjdGlvbjogezB9Ci1jaGVja2luZ3NlcnZpY2Vmb3JlcHI9VGhlIHN5c3RlbSBpcyBjaGVja2luZyBmb3IgdGhlIHNlcnZpY2UgdXNpbmcgdGhlIGZvbGxvd2luZyB0b0VQUiBhZGRyZXNzOiB7MH0KLWNoZWNraW5ncmVsYXRlc3RvPVRoZSBzeXN0ZW0gaXMgY2hlY2tpbmcgdGhlIGZvbGxvd2luZyAgUmVsYXRlc1RvOiB7MH0KLXR3b3NlcnZpY2VjYW5ub3RoYXZlc2FtZW5hbWU9VHdvIHNlcnZpY2VzIGNhbm5vdCBoYXZlIHNhbWUgbmFtZS4gIEEgc2VydmljZSB3aXRoIHRoZSB7MH0gbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3lzdGVtLgotY2Fubm90YWRkYXBwbGljYXRpb25zY29wZXNlcnZpY2U9VGhlIHN5c3RlbSBjYW5ub3QgYWRkIGEgc2VydmljZSB3aXRoIGFwcGxpY2F0aW9uIHNjb3BlIGFmdGVyIHRoZSBzeXN0ZW0gaGFzIHN0YXJ0ZWQuCi1pbnZhbGlkc2VydmljZWdyb3VwbmFtZT1UaGUgezB9IHNlcnZpY2UgZ3JvdXAgbmFtZSBpcyBub3QgdmFsaWQuCi1tb2R1bGVhbHJlZHllbmdhZ2VkZ2xvYmFseT1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGVuZ2FnZSB0aGUgezB9IG1vZHVsZSwgd2hpY2ggaXMgYWxyZWFkeSBlbmdhZ2VkLgotcmVmZXJ0b2ludmFsaWRtb2R1bGU9QSByZWZlcmVuY2Ugd2FzIG1hZGUgdG8gYSBtb2R1bGUgdGhhdCBoYXMgbm90IGJlZW4gZGVwbG95ZWQuIAotc2VydmljZWluYWN0aXZlPVRoZSBzeXN0ZW0gaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgYW4gaW5hY3RpdmUgc2VydmljZTogezB9Ci1zZXJ2aWNlbmFtZW5vdHZhbGlkPVRoZSB7MH0gc2VydmljZSBuYW1lIGluIG5vdCB2YWxpZC4KLWVuZ2luZXN0YXJ0ZWQ9VGhlIEF4aXMgZW5naW5lIHN0YXJ0ZWQuCi1tdXN0dW5kZXJzdGFuZGZhaWxlZD1NdXN0IFVuZGVyc3RhbmQgY2hlY2sgZmFpbGVkIGZvciBoZWFkZXIgezB9IDogezF9Ci1tdXN0dW5kZXJzdGFuZGZhaWxlZDI9TXVzdCBVbmRlcnN0YW5kIGNoZWNrIGZhaWxlZCBmb3IgaGVhZGVyczogezB9Ci1yZWNlaXZlZGVycm9ybWVzc2FnZT1UaGUgc3lzdGVtIHJlY2VpdmVkIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGUgezB9IElELiAKLXNlcnZpY2Vub3Rmb3VuZGZvcmVwcj1UaGUgc2VydmljZSBjYW5ub3QgYmUgZm91bmQgZm9yIHRoZSBlbmRwb2ludCByZWZlcmVuY2UgKEVQUikgezB9Ci1iaW5kaW5nRGlzYWJsZWQ9ezB9IGJpbmRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgc2VydmljZS4KLW9wZXJhdGlvbm5vdGZvdW5kZm9yZXByPVRoZSBlbmRwb2ludCByZWZlcmVuY2UgKEVQUikgZm9yIHRoZSBPcGVyYXRpb24gbm90IGZvdW5kIGlzIHswfSBhbmQgdGhlIFdTQSBBY3Rpb24gPSB7MX0KLXVuYWJsZXRvZmluZHNlcnZpY2U9VGhlIHJlcXVlc3RlZCBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBmb3VuZCAtLSB0aGUgb3BlcmF0aW9uIGhhcyBiZWVuIHN0b3BwZWQuCi1pbnZhbGlkc2VydmljZWdyb3VvaWQ9VGhlIHswfSBTZXJ2aWNlIEdyb3VwIElEIGlzIG5vdCB2YWxpZC4KLXNlcnZpY2Vub3Rmb3VuZGludGhlc3lzdGVtPVRoZSB7MH0gc2VydmljZSBpcyBub3QgZm91bmQgaW4gdGhlIHN5c3RlbS4KLXRyYW5zcG9ydG5vdGZvdW5kPVRoZSB0cmFuc3BvcnQgaXMgbm90IGZvdW5kOiB7MH0KLUNhbm5vdENvbmZpZ3VyZUF4aXMyPVRoZSBzeXN0ZW0gY2Fubm90IGNvbmZpZ3VyZSBBeGlzMi4KLXdzYWRkcmVzc2luZ3JlcXVpcmVkbm90cHJlc2VudD1XUy1BZGRyZXNzaW5nIGlzIHJlcXVpcmVkLCBidXQgaXQgY2Fubm90IGJlIGZvdW5kLgotbm9tZXNzYWdlcmVjaWV2ZXI9TWVzc2FnZSBSZWNlaXZlciBub3QgZm91bmQgZm9yIEF4aXNPcGVyYXRpb246IHswfQotZHVwbGljYXRlcmVsYXRlc3RvPVRoZSBtZXNzYWdlIGlzIGEgZHVwbGljYXRlIChoYXMgdGhlIHNhbWUgcmVwbHkgcmVsYXRpb25zaGlwIHZhbHVlKSBvZiBhbiBhbHJlYWR5IHByb2Nlc3NlZCBtZXNzYWdlLiBSZWxhdGVzVG8gPSB7MH0KLWdldE1lc3NhZ2VDb250ZXh0RXJyb3I9VGhlIG1lc3NhZ2UgY29udGV4dCBjb3VsZCBub3QgYmUgcmV0cmlldmVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiB7MH0KLW1pc21hdGNoZWRNb2R1bGVWZXJzaW9ucz1UcmllZCB0byBkZXBsb3kgKHRvIHswfSkgYSBtb2R1bGUgJyd7MX0nJyB3aGVuICcnezJ9Jycgd2FzIGFscmVhZHkgZGVwbG95ZWQgLSB2ZXJzaW9uIG1pc21hdGNoIQotZGVwbG95aW5nZXhjZXB0aW9uPURlcGxveWluZyBFeGNlcHRpb24gT2NjdXJlZCB3aXRoIHswfQotc3Ryb3JpbmdmYXVsdHlzZXJ2aWNlPUV4Y2VwdGlvbiBvY2N1cmVkIGFuZCBtYWRlIHRoZSBzZXJ2aWNlIGZhdWx0eSB3aXRoIHswfQotamF4d3NqYXJzbWlzc2luZz1KQVhXUyBqYXJzIGFyZSBtaXNzaW5nIGluIHRoZSBjbGFzc3BhdGggd2l0aCB7MH0sIHN3aXRjaGluZyB0byBhbm5vbmdlbgotZmF1bHR5c2VydmljZXJlbW92YWw9UHJlZGljdGluZyBmYXVsdHkgc2VydmljZSB3aXRoIHswfSwgYW5kIHJlbW92aW5nIGl0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWM1NDAxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotLyoqCi0gKiBUaGlzIHV0aWxpdHkgd3JhcHBlciBjbGFzcyBpcyBjcmVhdGVkIHRvIHN1cHBvcnQgQVhJUzIgcnVucwotICogaW5zaWRlIG9mIEphdmEgMiBTZWN1cml0eSBlbnZpcm9ubWVudC4gRHVlIHRvIHRoZSBhY2Nlc3MgY29udHJvbAotICogY2hlY2tpbmcgYWxnb3JpdGhtLCBmb3IgSmF2YSAyIFNlY3VyaXR5IHRvIGZ1bmN0aW9uIHByb3Blcmx5LAotICogPGNvZGU+ZG9Qcml2aWxlZ2VkKCk8L2NvZGU+Ci0gKiBpcyByZXF1aXJlZCBpbiBjYXNlcyB3aGVyZSB0aGVyZSBpcyBhcHBsaWNhdGlvbiBjb2RlIG9uIHRoZSBzdGFjayBmcmFtZQotICogYWNjZXNzaW5nIHRoZSBzeXN0ZW0gcmVzb3VyY2VzIChpZSwgcmVhZC93cml0ZSBmaWxlcywgb3BlbmluZyBwb3J0cywgYW5kIGV0YykuCi0gKiBUaGlzIGNsYXNzIGFsc28gaW1wcm92ZSBwZXJmb3JtYW5jZSBubyBtYXR0aGVyIFNlY3VyaXR5IE1hbmFnZXIgaXMgYmVpbmcgZW5hYmxlZAotICogb3Igbm90LgotICogPHAvPgotICogTm90ZTogVGhpcyB1dGlsaXR5IHNob3VsZCBiZSB1c2VkIHByb3Blcmx5LCBvdGhlcndpc2UgbWlnaHQgaW50cm9kdWNlCi0gKiBzZWN1cml0eSBob2xlcy4KLSAqIDxwLz4KLSAqIFVzYWdlIEV4YW1wbGU6Ci0gKiA8Y29kZT4KLSAqIHB1YmxpYyB2b2lkIGNoYW5nZVBhc3N3b3JkKCkgewotICogLi4uCi0gKiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAqIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICogZiA9IFV0aWwub3BlblBhc3N3b3JkRmlsZSgpOwotICogLi4uCi0gKiA8cC8+Ci0gKiB9Ci0gKiB9KTsKLSAqIC4uLgotICogfQotICogPC9jb2RlPgotICovCi0KLQotcHVibGljIGNsYXNzIEFjY2Vzc0NvbnRyb2xsZXIgewotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIHNwZWNpZmllZCA8Y29kZT5Qcml2aWxlZ2VkQWN0aW9uPC9jb2RlPiB3aXRoIHByaXZpbGVnZXMKLSAgICAgKiBlbmFibGVkIGlmIGEgc2VjdXJpdHkgbWFuYWdlciBpcyBwcmVzZW50LgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdGhyb3dzIGFuICh1bmNoZWNrZWQpIGV4Y2VwdGlvbiwKLSAgICAgKiBpdCB3aWxsIHByb3BhZ2F0ZSB0aHJvdWdoIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QuCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24sQWNjZXNzQ29udHJvbENvbnRleHQpCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChhY3Rpb24ucnVuKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIHNwZWNpZmllZCA8Y29kZT5Qcml2aWxlZ2VkQWN0aW9uPC9jb2RlPiB3aXRoIHByaXZpbGVnZXMKLSAgICAgKiBlbmFibGVkIGFuZCByZXN0cmljdGVkIGJ5IHRoZSBzcGVjaWZpZWQgPGNvZGU+QWNjZXNzQ29udHJvbENvbnRleHQ8L2NvZGU+LgotICAgICAqIFRoZSBhY3Rpb24gaXMgcGVyZm9ybWVkIHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgcGVybWlzc2lvbnMKLSAgICAgKiBwb3NzZXNzZWQgYnkgdGhlIGNhbGxlcidzIHByb3RlY3Rpb24gZG9tYWluLCBhbmQgdGhvc2UgcG9zc2Vzc2VkCi0gICAgICogYnkgdGhlIGRvbWFpbnMgcmVwcmVzZW50ZWQgYnkgdGhlIHNwZWNpZmllZAotICAgICAqIDxjb2RlPkFjY2Vzc0NvbnRyb2xDb250ZXh0PC9jb2RlPiBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgcHJlc2VudC4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIElmIHRoZSBhY3Rpb24ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZCB0aHJvd3MgYW4gKHVuY2hlY2tlZCkgZXhjZXB0aW9uLAotICAgICAqIGl0IHdpbGwgcHJvcGFnYXRlIHRocm91Z2ggdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uICB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4KLSAgICAgKiBAcGFyYW0gY29udGV4dCBhbiA8aT5hY2Nlc3MgY29udHJvbCBjb250ZXh0PC9pPiByZXByZXNlbnRpbmcgdGhlCi0gICAgICogICAgICAgICAgICAgICAgcmVzdHJpY3Rpb24gdG8gYmUgYXBwbGllZCB0byB0aGUgY2FsbGVyJ3MgZG9tYWluJ3MKLSAgICAgKiAgICAgICAgICAgICAgICBwcml2aWxlZ2VzIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBzcGVjaWZpZWQgYWN0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhY3Rpb24ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZC4KLSAgICAgKiBAc2VlICNkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEFjdGlvbikKLSAgICAgKiBAc2VlICNkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbixBY2Nlc3NDb250cm9sQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGRvUHJpdmlsZWdlZChQcml2aWxlZ2VkQWN0aW9uPFQ+IGFjdGlvbiwgQWNjZXNzQ29udHJvbENvbnRleHQgY29udGV4dCkgewotICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChzbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjwvY29kZT4gd2l0aAotICAgICAqIHByaXZpbGVnZXMgZW5hYmxlZC4gIFRoZSBhY3Rpb24gaXMgcGVyZm9ybWVkIHdpdGggPGk+YWxsPC9pPiBvZiB0aGUKLSAgICAgKiBwZXJtaXNzaW9ucyBwb3NzZXNzZWQgYnkgdGhlIGNhbGxlcidzIHByb3RlY3Rpb24gZG9tYWluLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdGhyb3dzIGFuIDxpPnVuY2hlY2tlZDwvaT4KLSAgICAgKiBleGNlcHRpb24sIGl0IHdpbGwgcHJvcGFnYXRlIHRocm91Z2ggdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aW9uIHRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhY3Rpb24ncyA8Y29kZT5ydW48L2NvZGU+IG1ldGhvZC4KLSAgICAgKiBAdGhyb3dzIFByaXZpbGdlZEFjdGlvbkV4Y2VwdGlvbiB0aGUgc3BlY2lmaWVkIGFjdGlvbidzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QgdGhyZXcgYSA8aT5jaGVja2VkPC9pPiBleGNlcHRpb24uCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24sQWNjZXNzQ29udHJvbENvbnRleHQpCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUPiBhY3Rpb24pCi0gICAgICAgICAgICB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHNtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjwvY29kZT4gd2l0aAotICAgICAqIHByaXZpbGVnZXMgZW5hYmxlZCBhbmQgcmVzdHJpY3RlZCBieSB0aGUgc3BlY2lmaWVkCi0gICAgICogPGNvZGU+QWNjZXNzQ29udHJvbENvbnRleHQ8L2NvZGU+LiAgVGhlIGFjdGlvbiBpcyBwZXJmb3JtZWQgd2l0aCB0aGUKLSAgICAgKiBpbnRlcnNlY3Rpb24gb2YgdGhlIHRoZSBwZXJtaXNzaW9ucyBwb3NzZXNzZWQgYnkgdGhlIGNhbGxlcidzCi0gICAgICogcHJvdGVjdGlvbiBkb21haW4sIGFuZCB0aG9zZSBwb3NzZXNzZWQgYnkgdGhlIGRvbWFpbnMgcmVwcmVzZW50ZWQgYnkgdGhlCi0gICAgICogc3BlY2lmaWVkIDxjb2RlPkFjY2Vzc0NvbnRyb2xDb250ZXh0PC9jb2RlPi4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIGFjdGlvbidzIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIHRocm93cyBhbiA8aT51bmNoZWNrZWQ8L2k+Ci0gICAgICogZXhjZXB0aW9uLCBpdCB3aWxsIHByb3BhZ2F0ZSB0aHJvdWdoIHRoaXMgbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdGlvbiAgdGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICAgICogQHBhcmFtIGNvbnRleHQgYW4gPGk+YWNjZXNzIGNvbnRyb2wgY29udGV4dDwvaT4gcmVwcmVzZW50aW5nIHRoZQotICAgICAqICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNhbGxlcidzIGRvbWFpbidzCi0gICAgICogICAgICAgICAgICAgICAgcHJpdmlsZWdlcyBiZWZvcmUgcGVyZm9ybWluZyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYWN0aW9uJ3MgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QuCi0gICAgICogQHRocm93cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHRoZSBzcGVjaWZpZWQgYWN0aW9uJ3MKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cnVuPC9jb2RlPiBtZXRob2QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXcgYSA8aT5jaGVja2VkPC9pPiBleGNlcHRpb24uCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRBY3Rpb24pCi0gICAgICogQHNlZSAjZG9Qcml2aWxlZ2VkKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24sQWNjZXNzQ29udHJvbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWQoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUPiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGNvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGEgInNuYXBzaG90IiBvZiB0aGUgY3VycmVudCBjYWxsaW5nIGNvbnRleHQsIHdoaWNoCi0gICAgICogaW5jbHVkZXMgdGhlIGN1cnJlbnQgVGhyZWFkJ3MgaW5oZXJpdGVkIEFjY2Vzc0NvbnRyb2xDb250ZXh0LAotICAgICAqIGFuZCBwbGFjZXMgaXQgaW4gYW4gQWNjZXNzQ29udHJvbENvbnRleHQgb2JqZWN0LiBUaGlzIGNvbnRleHQgbWF5IHRoZW4KLSAgICAgKiBiZSBjaGVja2VkIGF0IGEgbGF0ZXIgcG9pbnQsIHBvc3NpYmx5IGluIGFub3RoZXIgdGhyZWFkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQWNjZXNzQ29udHJvbENvbnRleHQgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dC4KLSAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBY2Nlc3NDb250cm9sQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFjY2VzcyByZXF1ZXN0IGluZGljYXRlZCBieSB0aGUKLSAgICAgKiBzcGVjaWZpZWQgcGVybWlzc2lvbiBzaG91bGQgYmUgYWxsb3dlZCBvciBkZW5pZWQsIGJhc2VkIG9uCi0gICAgICogdGhlIHNlY3VyaXR5IHBvbGljeSBjdXJyZW50bHkgaW4gZWZmZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIHF1aWV0bHkgcmV0dXJucyBpZiB0aGUgYWNjZXNzIHJlcXVlc3QKLSAgICAgKiBpcyBwZXJtaXR0ZWQsIG9yIHRocm93cyBhIHN1aXRhYmxlIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24gb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHBlcm0gdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uLgotICAgICAqIEB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBlcm1pdHRlZCwgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2VjdXJpdHkgcG9saWN5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB0aHJvd3MgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24ocGVybSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm8gaW5zdGFudGlhdGlvbiBhbGxvd2VkCi0gICAgICovCi0gICAgcHJpdmF0ZSBBY2Nlc3NDb250cm9sbGVyKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tb2R1bGVzL01vZHVsZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21vZHVsZXMvTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTA2ZmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21vZHVsZXMvTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tb2R1bGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIEV2ZXJ5IG1vZHVsZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzLiBNb2R1bGVzIGFyZSBpbiBvbmUgb2YKLSAqIHR3byBzdGF0ZXM6ICJhdmFpbGFibGUiIG9yICJlbmdhZ2VkIi4gQWxsIG1vZHVsZXMgdGhhdCB0aGUgcnVudGltZQotICogZGV0ZWN0cyAoZnJvbSB0aGUgc3lzdGVtIG1vZHVsZXMvIGRpcmVjdG9yeSBvciBmcm9tIG90aGVyIG1lYW5zKSBhcmUgc2FpZCB0bwotICogYmUgaW4gdGhlICJhdmFpbGFibGUiIHN0YXRlLiBJZiBzb21lIHNlcnZpY2UgaW5kaWNhdGVzIGEgZGVwZW5kZW5jeSBvbiB0aGlzCi0gKiBtb2R1bGUgdGhlbiB0aGUgbW9kdWxlIGlzIGluaXRpYWxpemVkIChvbmNlIGZvciB0aGUgbGlmZSBvZiB0aGUgc3lzdGVtKSBhbmQKLSAqIHRoZSBzdGF0ZSBjaGFuZ2VzIHRvICJpbml0aWFsaXplZCIuCi0gKiA8cC8+Ci0gKiA8cC8+QW55IG1vZHVsZSB3aGljaCBpcyBpbiB0aGUgImVuZ2FnZWQiIHN0YXRlIGNhbiBiZSBlbmdhZ2VkIGFzIG5lZWRlZAotICogYnkgdGhlIGVuZ2luZSB0byByZXNwb25kIHRvIGEgbWVzc2FnZS4gQ3VycmVudGx5IG1vZHVsZSBlbmdhZ2VtZW50IGlzIGRvbmUKLSAqIHZpYSBkZXBsb3ltZW50ICh1c2luZyBtb2R1bGUueG1sKS4gSW4gdGhlIGZ1dHVyZSB3ZSBtYXkgZW5nYWdlIG1vZHVsZXMKLSAqIHByb2dyYW1tYXRpY2FsbHkgYnkgaW50cm9kdWNpbmcgYW4gZW5nYWdlKCkgbWV0aG9kIHRvIHRoaXMgaW50ZXJmYWNlLCB0aGVyZWJ5Ci0gKiBhbGxvd2luZyBtb3JlIGR5bmFtaWMgc2NlbmFyaW9zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZSB7Ci0KLSAgICAvLyBpbml0aWFsaXplIHRoZSBtb2R1bGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogV2hlbiBlbmdhZ2luZyB0aGlzIG1vZHVsZSB0byBzb21lIHNlcnZpY2Ugb3Igb3BlcmF0aW9uICwgbW9kdWxlIHdpbGwgYmUgbm90aWZ5IGJ5IGNhbGxpbmcgdGhpcwotICAgICAqIG1ldGhvZCB0aGVyZSBtb2R1bGUgYXV0aG9yIGNhbiB2YWxpZGF0ZSAsIGFkZCBwb2xpY3kgYW5kIGRvIGFueSB0aGluZyB0aGF0IGhlIHdhbnQgLCBhbmQgaGUgY2FuCi0gICAgICogcmVmdXNlIHRoZSBlbmdhZ2UgYXMgd2VsbAotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNEZXNjcmlwdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIEV2YWx1YXRlIHdoZXRoZXIgaXQgY2FuIHN1cHBvcnQgdGhlIHNwZWNpZmllZCBhc3NlcnRpb24gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXNzZXJ0aW9uIGNhbgotICAgICAqIGJlIHN1cHBvcnRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3NlcnRpb24gdGhlIGFzc2VydGlvbiB0aGF0IHRoZSBtb2R1bGUgbXVzdCBkZWNpZGUgd2hldGhlciBpdCBjYW4gc3VwcG9ydCBvciBub3QuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXNzZXJ0aW9uIGNhbiBiZSBzdXBwb3J0ZWQgYnkgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbik7Ci0KLSAgICAvKioKLSAgICAgKiBFdmFsdWF0ZXMgc3BlY2lmaWVkIHBvbGljeSBmb3IgdGhlIHNwZWNpZmllZCBBeGlzRGVzY3JpcHRpb24uIEl0IGNvbXB1dGVzIHRoZSBjb25maWd1cmF0aW9uIHRoYXQKLSAgICAgKiBpcyBhcHByb3ByaWF0ZSB0byBzdXBwb3J0IHRoZSBwb2xpY3kgYW5kIHN0b3JlcyBpdCB0aGUgYXBwcm9wcmlhdGUgZGVzY3JpcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9saWN5IHRoZSBwb2xpY3kgdGhhdCBpcyBhcHBsaWNhYmxlIGZvciB0aGUgc3BlY2lmaWVkIEF4aXNEZXNjcmlwdGlvbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdDsKLQotCi0gICAgLy8gc2h1dGRvd24gdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL25hbWVzcGFjZS9Db25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9uYW1lc3BhY2UvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyM2Y5MjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL25hbWVzcGFjZS9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9OQU1FU1BBQ0VfVVJJID0KLSAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9uYW1lc3BhY2VzL2F4aXMyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTMl9OQU1FU1BBQ0VfUFJFRklYID0gImF4aXMyIjsKLQotICAgIC8vIE5hbWVzcGFjZSBQcmVmaXggQ29uc3RhbnRzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfU09BUF9FTlYgPSAic29hcGVudiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYX1NPQVBfRU5DID0gInNvYXBlbmMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1BSRUZJWF9TQ0hFTUFfWFNJID0gInhzaSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYX1NDSEVNQV9YU0QgPSAieHNkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfV1NETCA9ICJ3c2RsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfV1NETF9TT0FQID0gIndzZGxzb2FwIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19QUkVGSVhfWE1MID0gInhtbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfUFJFRklYX1hPUCA9ICJ4b3AiOwotCi0gICAgLy8KLSAgICAvLyBTT0FQLUVOViBOYW1lc3BhY2VzCi0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUDExX0VOViA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfRU5WID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0xJVEVSQUxfRU5DID0gIiI7Ci0KLSAgICAvLwotICAgIC8vIFNPQVAtRU5DIE5hbWVzcGFjZXMKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTFfRU5DID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMl9FTkMgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbmNvZGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMl9OT0VOQyA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlL2VuY29kaW5nL25vbmUiOwotCi0gICAgLy8gTWlzYyBTT0FQIE5hbWVzcGFjZXMgLyBVUklzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMV9ORVhUX0FDVE9SID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2FjdG9yL25leHQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfTkVYVF9ST0xFID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9uZXh0IjsKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgVVJJX1NPQVAxMl9ORVhUX1JPTEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUDEyX05FWFRfQUNUT1IgPSBVUklfU09BUDEyX05FWFRfUk9MRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfUlBDID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtcnBjIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfTk9ORV9ST0xFID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUvcm9sZS9ub25lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUDEyX1VMVElNQVRFX1JPTEUgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wZS9yb2xlL3VsdGltYXRlUmVjZWl2ZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1NPQVAxMV9IVFRQID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQMTJfSFRUUCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9odHRwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUxOUyA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hNTCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjsKLQotICAgIC8vCi0gICAgLy8gU2NoZW1hIFhTRCBOYW1lc3BhY2VzCi0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfMTk5OV9TQ0hFTUFfWFNEID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJXzIwMDBfU0NIRU1BX1hTRCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QgPSBVUklfMjAwMV9TQ0hFTUFfWFNEOwotCi0gICAgLy8KLSAgICAvLyBTY2hlbWEgWFNJIE5hbWVzcGFjZXMKLSAgICAvLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8xOTk5X1NDSEVNQV9YU0kgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfMjAwMF9TQ0hFTUFfWFNJID0KLSAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJXzIwMDFfU0NIRU1BX1hTSSA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ERUZBVUxUX1NDSEVNQV9YU0kgPSBVUklfMjAwMV9TQ0hFTUFfWFNJOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1BPTElDWSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvZm9ybWF0YmluZGluZy8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9qYXZhLyI7Ci0gICAgLyoqCi0gICAgICogV1NETCBOYW1lc3BhY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTREwxMSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTREwyMCA9Ci0gICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbCI7Ci0KLSAgICAvLwotICAgIC8vIFdTREwgZXh0ZW5zaW9ucyBmb3IgU09BUCBpbiBESU1FCi0gICAgLy8gKGh0dHA6Ly9nb3Rkb3RuZXQuY29tL3RlYW0veG1sX3dzc3BlY3MvZGltZS9XU0RMLUV4dGVuc2lvbi1mb3ItRElNRS5odG0pCi0gICAgLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRElNRV9XU0RMID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvd3NkbC8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0RJTUVfQ09OVEVOVCA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9jb250ZW50LXR5cGUvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ESU1FX1JFRkVSRU5DRSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9yZWZlcmVuY2UvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ESU1FX0NMT1NFRF9MQVlPVVQgPQotICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ESU1FX09QRU5fTEFZT1VUID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvb3Blbi1sYXlvdXQiOwotCi0gICAgLy8gWE9QL01UT00KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfWE9QX0lOQ0xVREUgPQotICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgveG9wL2luY2x1ZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fWE9QX0lOQ0xVREUgPSAiSW5jbHVkZSI7Ci0KLQotICAgIC8vCi0gICAgLy8gV1NETCBTT0FQIE5hbWVzcGFjZQotICAgIC8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTREwxMV9TT0FQID0KLSAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETDEyX1NPQVAgPQotICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0VOVkVMT1BFID0gIkVudmVsb3BlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0hFQURFUiA9ICJIZWFkZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQk9EWSA9ICJCb2R5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUID0gIkZhdWx0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTk9UVU5ERVJTVE9PRCA9ICJOb3RVbmRlcnN0b29kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VQR1JBREUgPSAiVXBncmFkZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TVVBQT1JURURFTlZFTE9QRSA9ICJTdXBwb3J0ZWRFbnZlbG9wZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX0NPREUgPSAiZmF1bHRjb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX1NUUklORyA9ICJmYXVsdHN0cmluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9ERVRBSUwgPSAiZGV0YWlsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX0FDVE9SID0gImZhdWx0YWN0b3IiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9DT0RFX1NPQVAxMiA9ICJDb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX1ZBTFVFX1NPQVAxMiA9ICJWYWx1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9TVUJDT0RFX1NPQVAxMiA9ICJTdWJjb2RlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX1JFQVNPTl9TT0FQMTIgPSAiUmVhc29uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBVUxUX05PREVfU09BUDEyID0gIk5vZGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fRkFVTFRfUk9MRV9TT0FQMTIgPSAiUm9sZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQVVMVF9ERVRBSUxfU09BUDEyID0gIkRldGFpbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9URVhUX1NPQVAxMiA9ICJUZXh0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTVVTVF9VTkRFUlNUQU5EID0gIm11c3RVbmRlcnN0YW5kIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VOQ09ESU5HX1NUWUxFID0gImVuY29kaW5nU3R5bGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQUNUT1IgPSAiYWN0b3IiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUk9MRSA9ICJyb2xlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFTEFZID0gInJlbGF5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JPT1QgPSAicm9vdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9IUkVGID0gImhyZWYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVGID0gInJlZiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9RTkFNRSA9ICJxbmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUlJBWV9UWVBFID0gImFycmF5VHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JVEVNX1RZUEUgPSAiaXRlbVR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVJSQVlfU0laRSA9ICJhcnJheVNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT0ZGU0VUID0gIm9mZnNldCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QT1NJVElPTiA9ICJwb3NpdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSEFORExFUklORk9DSEFJTiA9ICJoYW5kbGVySW5mb0NoYWluIjsKLQotICAgIC8vIEZhdWx0IENvZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9DTElFTlQgPSAiQ2xpZW50IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVUxUX1NFUlZFUl9HRU5FUkFMID0KLSAgICAgICAgICAgICJTZXJ2ZXIuZ2VuZXJhbEV4Y2VwdGlvbiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9TRVJWRVJfVVNFUiA9Ci0gICAgICAgICAgICAiU2VydmVyLnVzZXJFeGNlcHRpb24iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBGQVVMVF9WRVJTSU9OTUlTTUFUQ0ggPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5WLCAiVmVyc2lvbk1pc21hdGNoIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX01VU1RVTkRFUlNUQU5EID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDExX0VOViwgIk11c3RVbmRlcnN0YW5kIik7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU09BUDEyX01VU1RVTkRFUlNUQU5EID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgIk11c3RVbmRlcnN0YW5kIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX1NPQVAxMl9WRVJTSU9OTUlTTUFUQ0ggPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCAiVmVyc2lvbk1pc21hdGNoIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEZBVUxUX1NPQVAxMl9EQVRBRU5DT0RJTkdVTktOT1dOID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgIkRhdGFFbmNvZGluZ1Vua25vd24iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU09BUDEyX1NFTkRFUiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTlYsICJTZW5kZXIiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU09BUDEyX1JFQ0VJVkVSID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgIlJlY2VpdmVyIik7Ci0KLSAgICAvLyBTT0FQIDEuMiBGYXVsdCBzdWJjb2RlcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU1VCQ09ERV9CQURBUkdTID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX1JQQywgIkJhZEFyZ3VtZW50cyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgRkFVTFRfU1VCQ09ERV9QUk9DX05PVF9QUkVTRU5UID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX1JQQywgIlByb2NlZHVyZU5vdFByZXNlbnQiKTsKLQotICAgIC8vIFFOYW1lcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9GQVVMVENPREUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCBFTEVNX0ZBVUxUX0NPREUpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRkFVTFRTVFJJTkcgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCBFTEVNX0ZBVUxUX1NUUklORyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9GQVVMVEFDVE9SID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiIiwgRUxFTV9GQVVMVF9BQ1RPUik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9GQVVMVERFVEFJTFMgPQotICAgICAgICAgICAgbmV3IFFOYW1lKCIiLCBFTEVNX0ZBVUxUX0RFVEFJTCk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUQ09ERV9TT0FQMTIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCBFTEVNX0ZBVUxUX0NPREVfU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUVkFMVUVfU09BUDEyID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9GQVVMVF9WQUxVRV9TT0FQMTIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRkFVTFRTVUJDT0RFX1NPQVAxMiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTlYsIEVMRU1fRkFVTFRfU1VCQ09ERV9TT0FQMTIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUVfRkFVTFRSRUFTT05fU09BUDEyID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9GQVVMVF9SRUFTT05fU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX1RFWFRfU09BUDEyID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9URVhUX1NPQVAxMik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUTk9ERV9TT0FQMTIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCBFTEVNX0ZBVUxUX05PREVfU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUUk9MRV9TT0FQMTIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5WLCBFTEVNX0ZBVUxUX1JPTEVfU09BUDEyKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0ZBVUxUREVUQUlMX1NPQVAxMiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTlYsIEVMRU1fRkFVTFRfREVUQUlMX1NPQVAxMik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9OT1RVTkRFUlNUT09EID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfU09BUDEyX0VOViwgRUxFTV9OT1RVTkRFUlNUT09EKTsKLQotICAgIC8vIERlZmluZSBxbmFtZXMgZm9yIHRoZSBhbGwgb2YgdGhlIFhTRCBhbmQgU09BUC1FTkMgZW5jb2RpbmdzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfU1RSSU5HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzdHJpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9CT09MRUFOID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJib29sZWFuIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRE9VQkxFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkb3VibGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9GTE9BVCA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZmxvYXQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JTlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImludCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0lOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9MT05HID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJsb25nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfU0hPUlQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgInNob3J0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQllURSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYnl0ZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0RFQ0lNQUwgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImRlY2ltYWwiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9CQVNFNjQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImJhc2U2NEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0hFWEJJTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiaGV4QmluYXJ5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZU0lNUExFVFlQRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImFueVNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9BTllUWVBFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnlUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIEFYSVMyX05PTkUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyIiwgIm5vbmUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9RTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiUU5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkYXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidGltZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1RJTUVJTlNUQU5UMTk5OSA9IG5ldyBRTmFtZShVUklfMTk5OV9TQ0hFTUFfWFNELCAidGltZUluc3RhbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9USU1FSU5TVEFOVDIwMDAgPSBuZXcgUU5hbWUoVVJJXzIwMDBfU0NIRU1BX1hTRCwgInRpbWVJbnN0YW50Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT1JNQUxJWkVEU1RSSU5HID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAibm9ybWFsaXplZFN0cmluZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1RPS0VOID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ0b2tlbiIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVU5TSUdORURMT05HID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ1bnNpZ25lZExvbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FRElOVCA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAidW5zaWduZWRJbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9VTlNJR05FRFNIT1JUID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ1bnNpZ25lZFNob3J0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVU5TSUdORURCWVRFID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJ1bnNpZ25lZEJ5dGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9QT1NJVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJwb3NpdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ORUdBVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJuZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT05ORUdBVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJub25OZWdhdGl2ZUludGVnZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT05QT1NJVElWRUlOVEVHRVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJub25Qb3NpdGl2ZUludGVnZXIiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1lFQVJNT05USCA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiZ1llYXJNb250aCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX01PTlRIREFZID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJnTW9udGhEYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ZRUFSID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJnWWVhciIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX01PTlRIID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJnTW9udGgiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVkgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgImdEYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EVVJBVElPTiA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiZHVyYXRpb24iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05BTUUgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIk5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OQ05BTUUgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIk5DTmFtZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX05NVE9LRU4gPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIk5NVE9LRU4iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OTVRPS0VOUyA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiTk1UT0tFTlMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9OT1RBVElPTiA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiTk9UQVRJT04iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9FTlRJVFkgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgIkVOVElUWSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0VOVElUSUVTID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJFTlRJVElFUyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0lEUkVGID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJJRFJFRiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0lEUkVGUyA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiSURSRUZTIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZVVJJID0gbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJhbnlVUkkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9MQU5HVUFHRSA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAibGFuZ3VhZ2UiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JRCA9IG5ldyBRTmFtZShVUklfMjAwMV9TQ0hFTUFfWFNELCAiSUQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9TQ0hFTUEgPSBuZXcgUU5hbWUoVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNjaGVtYSIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYTUxfTEFORyA9IG5ldyBRTmFtZShOU19VUklfWE1MLCAibGFuZyIpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0JBU0U2NCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImJhc2U2NCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9CQVNFNjRCSU5BUlkgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfU1RSSU5HID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAic3RyaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0JPT0xFQU4gPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJib29sZWFuIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImRvdWJsZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9GTE9BVCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0lOVCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgImludCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9MT05HID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9TSE9SVCA9IG5ldyBRTmFtZShVUklfU09BUDExX0VOQywgInNob3J0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0JZVEUgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJieXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0lOVEVHRVIgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJpbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0RFQ0lNQUwgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJkZWNpbWFsIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0FSUkFZID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAiQXJyYXkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfQ09NTU9OX0FUVFJTMTEgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMV9FTkMsICJjb21tb25BdHRyaWJ1dGVzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0NPTU1PTl9BVFRSUzEyID0gbmV3IFFOYW1lKFVSSV9TT0FQMTJfRU5DLCAiY29tbW9uQXR0cmlidXRlcyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF9BUlJBWV9BVFRSUzExID0gbmV3IFFOYW1lKFVSSV9TT0FQMTFfRU5DLCAiYXJyYXlBdHRyaWJ1dGVzIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQX0FSUkFZX0FUVFJTMTIgPSBuZXcgUU5hbWUoVVJJX1NPQVAxMl9FTkMsICJhcnJheUF0dHJpYnV0ZXMiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfQVJSQVkxMiA9IG5ldyBRTmFtZShVUklfU09BUDEyX0VOQywgIkFycmF5Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0xJVEVSQUxfSVRFTSA9IG5ldyBRTmFtZShVUklfTElURVJBTF9FTkMsICJpdGVtIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9SUENfUkVTVUxUID0gbmV3IFFOYW1lKFVSSV9TT0FQMTJfUlBDLCAicmVzdWx0Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0NUX0FQUExJQ0FUSU9OX09DVEVUU1RSRUFNID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9DVF9URVhUX1BMQUlOID0gInRleHQvcGxhaW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQ1RfSU1BR0VfSlBFRyA9ICJpbWFnZS9qcGVnIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0NUX0lNQUdFX0dJRiA9ICJpbWFnZS9naWYiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQ1RfVEVYVF9YTUwgPSAidGV4dC94bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfQ1RfQVBQTElDQVRJT05fWE1MID0gImFwcGxpY2F0aW9uL3htbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9DVF9NVUxUSVBBUlRfUFJFRklYID0gIm11bHRpcGFydC8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBCQVNFXzY0X0NPTlRFTlRfUU5BTUUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKFVSSV8yMDAxX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhNSU1FX0NPTlRFTlRfVFlQRV9RTkFNRSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZSIsICJjb250ZW50VHlwZSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TRUNVUklUWVBPTElDWSA9Ci0gICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZUV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcmVzb2x2ZXIvUGhhc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2ZmJhOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi0vKioKLSAqIENsYXNzIFBoYXNlRXhjZXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUV4Y2VwdGlvbiBleHRlbmRzIEF4aXNGYXVsdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NjkwNTAzMzk2NzI0OTI5MzIyTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFBoYXNlRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBQaGFzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBQaGFzZUV4Y2VwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgUGhhc2VFeGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGNhdXNlCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlSG9sZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDNjNmY1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXJyb3JNc2dzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZCBhbGwgdGhlIHBoYXNlcyBmb3VuZCBpbiB0aGUgc2VydmljZXMueG1sIGFuZCBzZXJ2ZXIueG1sCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZUhvbGRlciB7Ci0gICAgcHJpdmF0ZSBMaXN0IHBoYXNlTGlzdDsKLQotICAgIHB1YmxpYyBQaGFzZUhvbGRlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2VIb2xkZXIoTGlzdCBwaGFzZXMpIHsKLSAgICAgICAgdGhpcy5waGFzZUxpc3QgPSBwaGFzZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHBoYXNlIG5hbWUgaXMgZXF1YWwgdG8gIioiIHRoYXQgaW1wbGllcyAsIHRoZSBoYW5kbGVyIHNob3VsZCBiZQotICAgICAqIGFkZGVkIHRvIGVhY2ggYW5kIGV2ZXJ5IHBoYXNlIGluIHRoZSBzeXN0ZW0gZm9yIGEgZ2l2ZW4gZmxvdyAgLCBhbmQgYXQgdGhhdAotICAgICAqIHBvaW50IGlmIHRoZSBwaGFzZSBydWxlIGNvbnRhaW5zIGFueSBiZWZvcmVzIG9yIGFmdGVycyB0aGVuIHRoZXkgd2lsbCBiZQotICAgICAqIGlnbm9yZWQuIFBoYXNlIGZpcnN0IGFuZCBwaGFzZSBsYXN0IGFyZSBzdXBwb3J0ZWQgLCBidXQgbWFrZSBzdXJlIHlvdSBkb250Ci0gICAgICogYnJlYWsgYW55IG9mIHRoZSBwaGFzZSBydWxlcy4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhlIHBoYXNlIG5hbWUgaXMgbm90IGFib3ZlIHRoZW4gdGhlIGhhZGxlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwaGFzZQotICAgICAqIHNwZWNpZmllZCBieSAgdGhlIHBoYXNlIHJ1bGUgLCBhbmQgbm8gcnVsZXMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXJEZXNjIEhhbmRsZXJEZXNjcmlwdGlvbiB0byBkZXBsb3kKLSAgICAgKiBAdGhyb3dzIFBoYXNlRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYSBwcm9ibGVtCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlckRlc2MpIHRocm93cyBQaGFzZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gaGFuZGxlckRlc2MuZ2V0UnVsZXMoKTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBydWxlIG1ha2VzIHNlbnNlICh0aHJvd3MgUGhhc2VFeGNlcHRpb24gaWYgbm90KQotICAgICAgICBydWxlLnZhbGlkYXRlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IHJ1bGUuZ2V0UGhhc2VOYW1lKCk7Ci0gICAgICAgIGlmIChQaGFzZS5BTExfUEhBU0VTLmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICBoYW5kbGVyRGVzYy5nZXRSdWxlcygpLnNldEJlZm9yZSgiIik7Ci0gICAgICAgICAgICBoYW5kbGVyRGVzYy5nZXRSdWxlcygpLnNldEFmdGVyKCIiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihoYW5kbGVyRGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGhhc2VFeGlzdHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGdldFBoYXNlKHBoYXNlTmFtZSkuYWRkSGFuZGxlcihoYW5kbGVyRGVzYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQaGFzZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKERlcGxveW1lbnRFcnJvck1zZ3MuSU5WQUxJRF9QSEFTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZU5hbWUsIGhhbmRsZXJEZXNjLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBnZXQgdGhlIGFjdHVhbCBwaGFzZSBvYmplY3QgZ2l2ZW4gaW4gdGhlIHBoYXNlIGFycmF5IGxpc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwaGFzZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgUGhhc2UKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBQaGFzZSwgb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgUGhhc2UgZ2V0UGhhc2UoU3RyaW5nIHBoYXNlTmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlTGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChwaGFzZS5nZXRQaGFzZU5hbWUoKS5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwaGFzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIGEgbmFtZWQgUGhhc2UgZXhpc3RzIGluIHRoaXMgaG9sZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHBoYXNlTmFtZSBuYW1lIHRvIGNoZWNrCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgUGhhc2UgbWF0Y2hpbmcgdGhlIG5hbWUgd2FzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcGhhc2VFeGlzdHMoU3RyaW5nIHBoYXNlTmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlTGlzdC5nZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChwaGFzZS5nZXRQaGFzZU5hbWUoKS5lcXVhbHMocGhhc2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlTWV0YWRhdGEuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJlc29sdmVyL1BoYXNlTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZWI2Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZU1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyOwotCi0vKioKLSAqIENsYXNzIFBoYXNlTWV0YWRhdGEKLSAqLwotcHVibGljIGNsYXNzIFBoYXNlTWV0YWRhdGEgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX0ZMT1cgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9GTE9XID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQVVMVF9PVVRfRkxPVyA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkFVTFRfSU5fRkxPVyA9IDM7Ci0KLSAgICAvLyBJTkZMT1cKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9UUkFOU1BPUlRJTiA9ICJUcmFuc3BvcnRJbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfUFJFX0RJU1BBVENIID0gIlByZURpc3BhdGNoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9QT1NUX0RJU1BBVENIID0gIlBvc3REaXNwYXRjaCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfUE9MSUNZX0RFVEVSTUlOQVRJT04gPSAiUG9saWN5RGV0ZXJtaW5hdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfTUVTU0FHRV9QUk9DRVNTSU5HID0gIk1lc3NhZ2VQcm9jZXNzaW5nIjsKLQotICAgIC8vIE9VVEZMT1cKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9NRVNTQUdFX09VVCA9ICJNZXNzYWdlT3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9ESVNQQVRDSCA9ICJEaXNwYXRjaCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfVFJBTlNQT1JUX09VVCA9ICJUcmFuc3BvcnRPdXQiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX1BIQVNFID0gIlRSQU5TUE9SVCI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZVJlc29sdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcGhhc2VyZXNvbHZlci9QaGFzZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTc5NzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcmVzb2x2ZXIvUGhhc2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5GbG93OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQ2xhc3MgUGhhc2VSZXNvbHZlcgotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VSZXNvbHZlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5fRkxPVyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9VVF9GQVVMVF9GTE9XID0gNTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIGF4aXNDb25maWcKLSAgICAgKi8KLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWc7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBwaGFzZUhvbGRlcgotICAgICAqLwotICAgIHByaXZhdGUgUGhhc2VIb2xkZXIgcGhhc2VIb2xkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yICwgdG8gb2J1aWxkIGNoYWlucyBmb3IgR2xvYmFsRGVzY3JpcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzY29uZmlnCi0gICAgICovCi0gICAgcHVibGljIFBoYXNlUmVzb2x2ZXIoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc2NvbmZpZykgewotICAgICAgICB0aGlzLmF4aXNDb25maWcgPSBheGlzY29uZmlnOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmdhZ2VNb2R1bGVUb0Zsb3coRmxvdyBmbG93LCBMaXN0IGhhbmRsZXJDaGFpbikgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgcGhhc2VIb2xkZXIgPSBuZXcgUGhhc2VIb2xkZXIoaGFuZGxlckNoYWluKTsKLSAgICAgICAgaWYgKGZsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbG93LmdldEhhbmRsZXJDb3VudCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gbWV0YWRhdGEgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcGhhc2VIb2xkZXIuYWRkSGFuZGxlcihtZXRhZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5nYWdlTW9kdWxlVG9PcGVyYXRpb24oQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbG93VHlwZSkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZsb3cgZmxvdyA9IG51bGw7Ci0gICAgICAgIHN3aXRjaCAoZmxvd1R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUGhhc2VNZXRhZGF0YS5JTl9GTE9XIDogewotICAgICAgICAgICAgICAgIHBoYXNlcy5hZGRBbGwoYXhpc0NvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKSk7Ci0gICAgICAgICAgICAgICAgcGhhc2VzLmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpKTsKLSAgICAgICAgICAgICAgICBmbG93ID0gYXhpc01vZHVsZS5nZXRJbkZsb3coKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgUGhhc2VNZXRhZGF0YS5PVVRfRkxPVyA6IHsKLSAgICAgICAgICAgICAgICBwaGFzZXMuYWRkQWxsKGF4aXNPcGVyYXRpb24uZ2V0UGhhc2VzT3V0RmxvdygpKTsKLSAgICAgICAgICAgICAgICBwaGFzZXMuYWRkQWxsKGF4aXNDb25maWcuZ2V0T3V0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBmbG93ID0gYXhpc01vZHVsZS5nZXRPdXRGbG93KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIFBoYXNlTWV0YWRhdGEuRkFVTFRfT1VUX0ZMT1cgOiB7Ci0gICAgICAgICAgICAgICAgcGhhc2VzLmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFBoYXNlc091dEZhdWx0RmxvdygpKTsKLSAgICAgICAgICAgICAgICBwaGFzZXMuYWRkQWxsKGF4aXNDb25maWcuZ2V0T3V0RmF1bHRGbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgICAgIGZsb3cgPSBheGlzTW9kdWxlLmdldEZhdWx0T3V0RmxvdygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBQaGFzZU1ldGFkYXRhLkZBVUxUX0lOX0ZMT1cgOiB7Ci0gICAgICAgICAgICAgICAgcGhhc2VzLmFkZEFsbChheGlzT3BlcmF0aW9uLmdldFBoYXNlc0luRmF1bHRGbG93KCkpOwotICAgICAgICAgICAgICAgIHBoYXNlcy5hZGRBbGwoYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgICAgICBmbG93ID0gYXhpc01vZHVsZS5nZXRGYXVsdEluRmxvdygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVuZ2FnZU1vZHVsZVRvRmxvdyhmbG93LCBwaGFzZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU1vZHVsZVRvT3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiwgQXhpc01vZHVsZSBtb2R1bGUpCi0gICAgICAgICAgICB0aHJvd3MgUGhhc2VFeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCB0eXBlID0gSU5fRkxPVzsgdHlwZSA8IE9VVF9GQVVMVF9GTE9XOyB0eXBlKyspIHsKLSAgICAgICAgICAgIGVuZ2FnZU1vZHVsZVRvT3BlcmF0aW9uKGF4aXNPcGVyYXRpb24sIG1vZHVsZSwgdHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUbyByZW1vdmUgaGFuZGxlcnMgZnJvbSBnbG9iYWwgY2hpYW5zIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkICwgZmlyc3QgaXQgdGFrZSBpbmZsb3cKLSAgICAgKiBvZiB0aGUgbW9kdWxlIGFuZCB0aGVuIHRha2UgaGFuZGxlciBvbmUgYnkgb25lIGFuZCB0aGVuIHJlbW92ZSB0aG9zZSBoYW5kbGVycyBmcm9tCi0gICAgICogZ2xvYmFsIGluY2hhaW4gLAotICAgICAqIHRoZSBzYW1lIHByb2NlZHVyZSB3aWxsIGJlIGNhcnJ5IG91dCBmb3IgYWxsIHRoZSBvdGhlciBmbG93cyBhcyB3ZWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2VuZ2FnZU1vZHVsZUZyb21HbG9iYWxDaGFpbnMoQXhpc01vZHVsZSBtb2R1bGUpIHsKLSAgICAgICAgLy9JTkZMT1cKLSAgICAgICAgRmxvdyBmbG93ID0gbW9kdWxlLmdldEluRmxvdygpOwotICAgICAgICBpZiAoZmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZsb3cuZ2V0SGFuZGxlckNvdW50KCk7IGorKykgewotICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyID0gZmxvdy5nZXRIYW5kbGVyKGopOwotICAgICAgICAgICAgICAgIHJlbW92ZUhhbmRsZXJmcm9tYVBoYXNlKGhhbmRsZXIsIGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vT1VURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldE91dEZsb3coKTsKLSAgICAgICAgaWYgKGZsb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmbG93LmdldEhhbmRsZXJDb3VudCgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGFuZGxlciA9IGZsb3cuZ2V0SGFuZGxlcihqKTsKLSAgICAgICAgICAgICAgICByZW1vdmVIYW5kbGVyZnJvbWFQaGFzZShoYW5kbGVyLCBheGlzQ29uZmlnLmdldE91dEZsb3dQaGFzZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9JTkZBVUxURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldEZhdWx0SW5GbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL09VVEZBVUxURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldEZhdWx0T3V0RmxvdygpOwotICAgICAgICBpZiAoZmxvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZsb3cuZ2V0SGFuZGxlckNvdW50KCk7IGorKykgewotICAgICAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyID0gZmxvdy5nZXRIYW5kbGVyKGopOwotICAgICAgICAgICAgICAgIHJlbW92ZUhhbmRsZXJmcm9tYVBoYXNlKGhhbmRsZXIsIGF4aXNDb25maWcuZ2V0T3V0RmF1bHRGbG93UGhhc2VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gcmVtb3ZlIGhhbmRsZXJzIGZyb20gb3BlcmF0aW9ucyBjaGlhbnMgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgLCBmaXJzdCBpdCB0YWtlIGluZmxvdwotICAgICAqIG9mIHRoZSBtb2R1bGUgYW5kIHRoZW4gdGFrZSBoYW5kbGVyIG9uZSBieSBvbmUgYW5kIHRoZW4gcmVtb3ZlIHRob3NlIGhhbmRsZXJzIGZyb20KLSAgICAgKiBnbG9iYWwgaW5jaGFpbiAsCi0gICAgICogdGhlIHNhbWUgcHJvY2VkdXJlIHdpbGwgYmUgY2Fycnkgb3V0IGZvciBhbGwgdGhlIG90aGVyIGZsb3dzIGFzIHdlbGwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzZW5nYWdlTW9kdWxlRnJvbU9wZXJhdGlvbkNoYWluKEF4aXNNb2R1bGUgbW9kdWxlLCBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgICAgICAvL0lORkxPVwotICAgICAgICBGbG93IGZsb3cgPSBtb2R1bGUuZ2V0SW5GbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL09VVEZMT1cKLSAgICAgICAgZmxvdyA9IG1vZHVsZS5nZXRPdXRGbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFBoYXNlc091dEZsb3coKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9JTkZBVUxURkxPVwotICAgICAgICBmbG93ID0gbW9kdWxlLmdldEZhdWx0SW5GbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFBoYXNlc0luRmF1bHRGbG93KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vT1VURkFVTFRGTE9XCi0gICAgICAgIGZsb3cgPSBtb2R1bGUuZ2V0RmF1bHRPdXRGbG93KCk7Ci0gICAgICAgIGlmIChmbG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmxvdy5nZXRIYW5kbGVyQ291bnQoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhhbmRsZXIgPSBmbG93LmdldEhhbmRsZXIoaik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcmZyb21hUGhhc2UoaGFuZGxlciwgb3BlcmF0aW9uLmdldFBoYXNlc091dEZhdWx0RmxvdygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIHJlbW92ZSBhIHNpbmdsZSBoYW5kbGVyIGZyb20gYSBnaXZlbiBsaXN0IG9mIHBoYXNlcwotICAgICAqCi0gICAgICogQHBhcmFtIGhhbmRsZXIKLSAgICAgKiBAcGFyYW0gcGhhc2VMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUhhbmRsZXJmcm9tYVBoYXNlKEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyLCBMaXN0PFBoYXNlPiBwaGFzZUxpc3QpIHsKLSAgICAgICAgU3RyaW5nIHBoYXNlTmFtZSA9IGhhbmRsZXIuZ2V0UnVsZXMoKS5nZXRQaGFzZU5hbWUoKTsKLSAgICAgICAgSXRlcmF0b3I8UGhhc2U+IHBoYXNlSXRyID0gcGhhc2VMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwaGFzZUl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZUl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocGhhc2UuZ2V0UGhhc2VOYW1lKCkuZXF1YWxzKHBoYXNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwaGFzZS5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTW9kdWxlVG9NZXNzYWdlKEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlLCBBeGlzTW9kdWxlIGF4aXNNb2R1bGUpCi0gICAgICAgICAgICB0aHJvd3MgUGhhc2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZGlyZWN0aW9uID0gYXhpc01lc3NhZ2UuZ2V0RGlyZWN0aW9uKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNNZXNzYWdlLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUuZXF1YWxzSWdub3JlQ2FzZShkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBlbmdhZ2VNb2R1bGVUb09wZXJhdGlvbihheGlzT3BlcmF0aW9uLCBheGlzTW9kdWxlLCBQaGFzZU1ldGFkYXRhLk9VVF9GTE9XKTsKLSAgICAgICAgfSBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUuZXF1YWxzSWdub3JlQ2FzZShkaXJlY3Rpb24pKSB7Ci0gICAgICAgICAgICBlbmdhZ2VNb2R1bGVUb09wZXJhdGlvbihheGlzT3BlcmF0aW9uLCBheGlzTW9kdWxlLCBQaGFzZU1ldGFkYXRhLklOX0ZMT1cpOwotICAgICAgICB9IGVsc2UgaWYgKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9GQVVMVF9WQUxVRS5lcXVhbHMoZGlyZWN0aW9uKSkgewotICAgICAgICAgICAgLy9UT0RPIDogTmVlZCB0byBoYW5kbGUgZmF1bHQgY29ycmVjdGx5Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmUyOTcxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi0vKioKLSAqIFRoaXMgaXMgdGFrZXMgY2FyZSBvZiB0aGUgSU4tT05MWSBNRVAgb24gdGhlIHNlcnZlciBzaWRlCi0gKgotICogVE9ETzogRGVwcmVjYXRlIHRoaXMgYW5kIHVzZSBBTVIgZGlyZWN0bHk/Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTU0OTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGlzIHRha2VzIGNhcmUgb2YgdGhlIElOLU9VVCBzeW5jIE1FUCBpbiB0aGUgc2VydmVyIHNpZGUKLSAqCi0gKiBAZGVwcmVjYXRlZCBubyBsb25nZXIgbmVlZGVkLCBnb2luZyBhd2F5IGFmdGVyIDEuMwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShmaW5hbCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ3R4KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbWVzc2FnZUN0eC5zZXRQcm9wZXJ0eShET19BU1lOQywgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgc3VwZXIucmVjZWl2ZShtZXNzYWdlQ3R4KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzA3N2Q0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLk1lc3NhZ2VDb250ZXh0QnVpbGRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBBYnNyYWN0IElOLU9VVCBNRVAgTWVzc2FnZVJlY2VpdmVyLiBUaGUKLSAqIHByb3RlY3RlZCBhYnN0cmFjdCBtZXRob2RzIGFyZSBvbmx5IGZvciB0aGUgc2FrZSBvZiBicmVha2luZyBkb3duIHRoZSBsb2dpYwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlY2VpdmVyIHsKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwgTWVzc2FnZUNvbnRleHQgb3V0TWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNc2dDb250ZXh0ID0gTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZU91dE1lc3NhZ2VDb250ZXh0KG1zZ0NvbnRleHQpOwotICAgICAgICBvdXRNc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5hZGRNZXNzYWdlQ29udGV4dChvdXRNc2dDb250ZXh0KTsKLQotICAgICAgICBpbnZva2VCdXNpbmVzc0xvZ2ljKG1zZ0NvbnRleHQsIG91dE1zZ0NvbnRleHQpOwotICAgICAgICByZXBsaWNhdGVTdGF0ZShtc2dDb250ZXh0KTsKLQotICAgICAgICBBeGlzRW5naW5lLnNlbmQob3V0TXNnQ29udGV4dCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9BYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI5NGYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgQWJzcmFjdCBJTi1PVVQgTUVQIE1lc3NhZ2VSZWNlaXZlci4gVGhlCi0gKiBwcm90ZWN0ZWQgYWJzdHJhY3QgbWV0aG9kcyBhcmUgb25seSBmb3IgdGhlIHNha2Ugb2YgYnJlYWtpbmcgZG93biB0aGUgbG9naWMKLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWNlaXZlciB7Ci0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgb3V0TXNnQ29udGV4dCA9IE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jcmVhdGVPdXRNZXNzYWdlQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgb3V0TXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuYWRkTWVzc2FnZUNvbnRleHQob3V0TXNnQ29udGV4dCk7Ci0KLSAgICAgICAgaW52b2tlQnVzaW5lc3NMb2dpYyhtc2dDb250ZXh0LCBvdXRNc2dDb250ZXh0KTsKLSAgICAgICAgcmVwbGljYXRlU3RhdGUobXNnQ29udGV4dCk7Ci0KLSAgICAgICAgQXhpc0VuZ2luZS5zZW5kKG91dE1zZ0NvbnRleHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzODgwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsYXNzbG9hZGVyLk11bHRpUGFyZW50Q2xhc3NMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyaW5nLkNsdXN0ZXJpbmdGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXJpbmcuY29udGV4dC5SZXBsaWNhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXNzYWdlUmVjZWl2ZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0TWVzc2FnZVJlY2VpdmVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFID0gInNjb3BlIjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VUQ0NMID0gbnVsbDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFRF9UQ0NMID0gIl9TQVZFRF9UQ0NMXyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUMgPSAiX1NBVkVEX01DXyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9fQVNZTkMgPSAibWVzc2FnZVJlY2VpdmVyLmludm9rZU9uU2VwYXJhdGVUaHJlYWQiOwotCi0gICAgLy8gUGxhY2UgdG8gc3RvcmUgcHJldmlvdXMgdmFsdWVzCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaHJlYWRDb250ZXh0RGVzY3JpcHRvciB7Ci0gICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBvbGRDbGFzc0xvYWRlcjsKLSAgICAgICAgcHVibGljIE1lc3NhZ2VDb250ZXh0IG9sZE1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJlcGxpY2F0ZVN0YXRlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQ2x1c3RlcmluZ0ZhdWx0IHsKLSAgICAgICAgUmVwbGljYXRvci5yZXBsaWNhdGUobWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSBhY3R1YWwgd29yayBvZiB0aGUgTWVzc2FnZVJlY2VpdmVyLiAgTXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNvbmNyZXRlIHN1YmNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUN0eCBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhIHByb2JsZW0gb2NjdXJyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ3R4IGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIGEgcHJvYmxlbSBvY2N1cnJlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmUoZmluYWwgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUN0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCWlmIChtZXNzYWdlQ3R4LmlzUHJvcGVydHlUcnVlKERPX0FTWU5DKQotCQkJCXx8ICgobWVzc2FnZUN0eC5nZXRQYXJhbWV0ZXIoRE9fQVNZTkMpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KG1lc3NhZ2VDdHguZ2V0UGFyYW1ldGVyKERPX0FTWU5DKS5nZXRWYWx1ZSgpKSkpIHsKLQotICAgICAgICAgICAgU3RyaW5nIG1lcCA9IG1lc3NhZ2VDdHguZ2V0QXhpc09wZXJhdGlvbigpCi0JCQkJCS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0JCQlFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvID0gbWVzc2FnZUN0eC5nZXRSZXBseVRvKCk7Ci0JCQkvLyBJbiBvcmRlciB0byBpbnZva2UgdGhlIHNlcnZpY2UgaW4gdGhlIEFTWU5DIG1vZGUsIHRoZSByZXF1ZXN0Ci0JCQkvLyBzaG91bGQgY29udGFpbiBSZXBseVRvIGhlYWRlciBpZiB0aGUgTUVQIG9mIHRoZSBzZXJ2aWNlIGlzIG5vdAotCQkJLy8gSW5Pbmx5IHR5cGUKLQkJCWlmICgoIVdTRExVdGlsLmlzT3V0cHV0UHJlc2VudEZvck1FUChtZXApKQotCQkJCQl8fCAocmVwbHlUbyAhPSBudWxsICYmICFyZXBseVRvLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLQkJCQlBc3luY01lc3NhZ2VSZWNlaXZlcldvcmtlciB3b3JrZXIgPSBuZXcgQXN5bmNNZXNzYWdlUmVjZWl2ZXJXb3JrZXIoCi0JCQkJCQltZXNzYWdlQ3R4KTsKLQkJCQltZXNzYWdlQ3R4LmdldEVudmVsb3BlKCkuYnVpbGQoKTsKLQkJCQltZXNzYWdlQ3R4LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0VGhyZWFkUG9vbCgpLmV4ZWN1dGUoCi0JCQkJCQl3b3JrZXIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0KLSAgICAgICAgVGhyZWFkQ29udGV4dERlc2NyaXB0b3IgdGMgPSBzZXRUaHJlYWRDb250ZXh0KG1lc3NhZ2VDdHgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW52b2tlQnVzaW5lc3NMb2dpYyhtZXNzYWdlQ3R4KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGZhdWx0KSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbi1vbmx5LCBlYXQgdGhpcy4gIE90aGVyd2lzZSwgdG9zcyBpdCB1cHdhcmRzIQotICAgICAgICAgICAgaWYgKChtZXNzYWdlQ3R4LmdldEF4aXNPcGVyYXRpb24oKSBpbnN0YW5jZW9mIEluT25seUF4aXNPcGVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgICAgICFXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLmVxdWFscyhtZXNzYWdlQ3R4LmdldEF4aXNPcGVyYXRpb24oKS5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGZhdWx0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRUeXBlKENvbnN0YW50cy5BUFBMSUNBVElPTl9GQVVMVCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZmF1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXN0b3JlVGhyZWFkQ29udGV4dCh0Yyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXZlcmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBuZWVkIHRvIGJlIGF2YWlsYWJsZSB0byB0aGUgc2VydmljZQotICAgICAqIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgRm9yIG9uZSwgdGhlIFRocmVhZENvbnRleHRDbGFzc0xvYWRlciBuZWVkcwotICAgICAqIHRvIGJlIGNvcnJlY3QsIGFuZCBmb3IgYW5vdGhlciB3ZSBuZWVkIHRvIGdpdmUgdGhlIHNlcnZpY2UgY29kZQotICAgICAqIGFjY2VzcyB0byB0aGUgTWVzc2FnZUNvbnRleHQgKGdldEN1cnJlbnRDb250ZXh0KCkpLiAgU28gd2UgdG9zcyB0aGVzZQotICAgICAqIHRoaW5ncyBpbiBUTFMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gYSBUaHJlYWRDb250ZXh0RGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBvbGQgdmFsdWVzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRocmVhZENvbnRleHREZXNjcmlwdG9yIHNldFRocmVhZENvbnRleHQoZmluYWwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBUaHJlYWRDb250ZXh0RGVzY3JpcHRvciB0YyA9IG5ldyBUaHJlYWRDb250ZXh0RGVzY3JpcHRvcigpOwotICAgICAgICB0Yy5vbGRNZXNzYWdlQ29udGV4dCA9IChNZXNzYWdlQ29udGV4dCkgTWVzc2FnZUNvbnRleHQuY3VycmVudE1lc3NhZ2VDb250ZXh0LmdldCgpOwotICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXJfZG9Qcml2KCk7Ci0gICAgICAgIHRjLm9sZENsYXNzTG9hZGVyID0gY29udGV4dENsYXNzTG9hZGVyOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlVENDTCA9IChTdHJpbmcpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLlNFUlZJQ0VfVENDTCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlVENDTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlVENDTCA9IHNlcnZpY2VUQ0NMLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAgICAgICBpZiAoc2VydmljZVRDQ0wuZXF1YWxzKENvbnN0YW50cy5UQ0NMX0NPTVBPU0lURSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlQYXJlbnRDbGFzc0xvYWRlcihuZXcgVVJMW117fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzTG9hZGVyW117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dENsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlVENDTC5lcXVhbHMoQ29uc3RhbnRzLlRDQ0xfU0VSVklDRSkpIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldENsYXNzTG9hZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQuc2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KG1zZ0NvbnRleHQpOwotICAgICAgICByZXR1cm4gdGM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXJfZG9Qcml2KCkgewotICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVRocmVhZENvbnRleHQoZmluYWwgVGhyZWFkQ29udGV4dERlc2NyaXB0b3IgdGMpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRjLm9sZENsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICBNZXNzYWdlQ29udGV4dC5jdXJyZW50TWVzc2FnZUNvbnRleHQuc2V0KHRjLm9sZE1lc3NhZ2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgc2VydmljZSBvYmplY3QuICBPdmVycmlkZSBpZiB5b3Ugd2FudCB0byBjdXN0b21pemUgaG93Ci0gICAgICogdGhpcyBoYXBwZW5zIGluIHlvdXIgb3duIE1lc3NhZ2VSZWNlaXZlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHJldHVybiBSZXR1cm5zIE9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgbWFrZU5ld1NlcnZpY2VPYmplY3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBzZXJ2aWNlLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgICAgIC8vIGFsbG93IGFsdGVybmF0aXZlIGRlZmluaXRpb24gb2YgbWFrZU5ld1NlcnZpY2VPYmplY3QKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlLmdldFBhcmFtZXRlcihDb25zdGFudHMuU0VSVklDRV9PQkpFQ1RfU1VQUExJRVIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgc2VydmljZU9iamVjdFBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX09CSkVDVF9TVVBQTElFUik7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgc2VydmljZU9iamVjdE1ha2VyID0gTG9hZGVyLmxvYWRDbGFzcyhjbGFzc0xvYWRlciwgKChTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlT2JqZWN0UGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEZpbmQgc3RhdGljIGdldFNlcnZpY2VPYmplY3QoKSBtZXRob2QsIGNhbGwgaXQgaWYgdGhlcmUKLSAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VPYmplY3RNYWtlci5nZXRNZXRob2QoImdldFNlcnZpY2VPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tde0F4aXNTZXJ2aWNlLmNsYXNzfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5pbnZva2Uoc2VydmljZU9iamVjdE1ha2VyLm5ld0luc3RhbmNlKCksIG5ldyBPYmplY3RbXXtzZXJ2aWNlfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQYXJhbWV0ZXIgaW1wbEluZm9QYXJhbSA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTKTsKLSAgICAgICAgICAgIGlmIChpbXBsSW5mb1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBpbXBsQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFN0cmluZykgaW1wbEluZm9QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW1Jc05vdFNwZWNpZmllZCIsICJTRVJWSUNFX09CSkVDVF9TVVBQTElFUiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEZhY3RvcnkgZ2V0U09BUEZhY3RvcnkoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyBuc1VSSSA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgaWYgKFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5zVVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuc1VSSSkpIHsKLSAgICAgICAgICAgIHJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImludmFsaWRTT0FQdmVyc2lvbiIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QuICBUaGlzIHdpbGwgZWl0aGVyIHJldHVybiBhIGNhY2hlZAotICAgICAqIG9iamVjdCBpZiBwcmVzZW50IGluIHRoZSBTZXJ2aWNlQ29udGV4dCwgb3IgY3JlYXRlIGEgbmV3IG9uZSB2aWEKLSAgICAgKiBtYWtlTmV3U2VydmljZU9iamVjdCgpIChhbmQgdGhlbiBjYWNoZSB0aGF0KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBiYWNrLWVuZCBzZXJ2aWNlIG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiB0aGVyZSdzIGEgcHJvYmxlbQotICAgICAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICBPYmplY3Qgc2VydmljZWltcGwgPSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eShTZXJ2aWNlQ29udGV4dC5TRVJWSUNFX09CSkVDVCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlaW1wbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBzaW5jZSBzZXJ2aWNlIGltcGwgaXMgdGhlcmUgaW4gc2VydmljZSBjb250ZXh0ICwgdGFrZSB0aGF0IGZyb20gdGhlcmUKLSAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlaW1wbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXJ2aWNlIGltcGwgY2xhc3MgZm9yIHRoYXQgc2VydmljZQotICAgICAgICAgICAgc2VydmljZWltcGwgPSBtYWtlTmV3U2VydmljZU9iamVjdChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIC8vU2VydmljZSBpbml0aWFsaXphdGlvbgotICAgICAgICAgICAgRGVwZW5kZW5jeU1hbmFnZXIuaW5pdFNlcnZpY2VPYmplY3Qoc2VydmljZWltcGwsIG1zZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHQoKSk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShTZXJ2aWNlQ29udGV4dC5TRVJWSUNFX09CSkVDVCwgc2VydmljZWltcGwpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VpbXBsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEFzeW5jTWVzc2FnZVJlY2VpdmVyV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgIAlwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHg7Ci0KLSAgICAJcHVibGljIEFzeW5jTWVzc2FnZVJlY2VpdmVyV29ya2VyKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpewotICAgIAkJdGhpcy5tZXNzYWdlQ3R4ID0gbWVzc2FnZUN0eDsKLSAgICAJfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkQ29udGV4dERlc2NyaXB0b3IgdGMgPSBzZXRUaHJlYWRDb250ZXh0KG1lc3NhZ2VDdHgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludm9rZUJ1c2luZXNzTG9naWMobWVzc2FnZUN0eCk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVRocmVhZENvbnRleHQodGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgSU4tT05MWSwgc3dhbGxvdyB0aGlzLiAgT3RoZXJ3aXNlLCBzZW5kIGl0LgotICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlQ3R4LmdldEF4aXNPcGVyYXRpb24oKSBpbnN0YW5jZW9mIEluT25seUF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgZmF1bHRDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQobWVzc2FnZUN0eCwgZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNFbmdpbmUuc2VuZEZhdWx0KGZhdWx0Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL0Fic3RyYWN0Um9idXN0SW5NZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RSb2J1c3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdjZDcxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvQWJzdHJhY3RSb2J1c3RJbk1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi0vKioKLSAqIFRoaXMgaXMgdGFrZXMgY2FyZSBvZiB0aGUgSU4tT1VUIHN5bmMgTUVQIGluIHRoZSBzZXJ2ZXIgc2lkZQotICoKLSAqIEBkZXByZWNhdGVkIG5vdCBuZWVkZWQsIHNpbmNlIGluLW9ubHkgTWVzc2FnZVJlY2VpdmVycyBjYW4gdGhyb3cgZmF1bHRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJvYnVzdEluTWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgIEFic3RyYWN0TWVzc2FnZVJlY2VpdmVyewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzYyNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUaGUgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIE1lc3NhZ2VSZWNlaXZlciBoYW5kcyBvdmVyIHRoZSByYXcgcmVxdWVzdCByZWNlaXZlZCB0bwotICogdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgYXMgYW4gT01FbGVtZW50LiBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgTk9UCi0gKiBleHBlY3RlZCB0byByZXR1cm4gYW55IHZhbHVlLCBidXQgbWF5IGRvIHNvIGFuZCBpdCB3b3VsZCBiZSBpZ25vcmVkLiBUaGlzIGlzIGEKLSAqIHN5bmNocm9ub3VzIE1lc3NhZ2VSZWNlaXZlciwgYW5kIGZpbmRzIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGludm9rZSBieQotICogcmVmZXJyaW5nIHRvIHRoZSAiU2VydmljZUNsYXNzIiBwYXJhbWV0ZXIgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlLnhtbCBhbmQKLSAqIGxvb2tpbmcgYXQgdGhlIG1ldGhvZHMgb2YgdGhlIGZvcm0gdm9pZCA8PG1ldGhvZE5hbWU+PihPTUVsZW1lbnQgcmVxdWVzdCkKLSAqCi0gKiBAc2VlIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyCi0gKiBAc2VlIFJhd1hNTElOT3V0QXN5bmNNZXNzYWdlUmVjZWl2ZXIKLSAqLwotcHVibGljIGNsYXNzIFJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5NZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHJpdmF0ZSBNZXRob2QgZmluZE9wZXJhdGlvbihBeGlzT3BlcmF0aW9uIG9wLCBDbGFzcyBpbXBsQ2xhc3MpIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpKG9wLmdldFBhcmFtZXRlclZhbHVlKCJteU1ldGhvZCIpKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gbWV0aG9kOwotCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gb3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTG9va2luZyBmb3IgYSBtZXRob2Qgb2YgdGhlIGZvcm0gInZvaWQgbWV0aG9kKE9NRWxlbWVudCkiCi0gICAgICAgICAgICBtZXRob2QgPSBpbXBsQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzcyBbXSB7IE9NRWxlbWVudC5jbGFzcyB9KTsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyh2b2lkLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wLmFkZFBhcmFtZXRlcigibXlNZXRob2QiLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZyBoZXJlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBGYWxsIHRocm91Z2gKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIGJ1c2luZXNzIGxvZ2ljIGludm9jYXRpb24gb24gdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBpbmNvbWluZyBtZXNzYWdlIGNvbnRleHQKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBvbiBpbnZhbGlkIG1ldGhvZCAod3Jvbmcgc2lnbmF0dXJlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGludm9rZUJ1c2luZXNzTG9naWMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXRUaGVJbXBsZW1lbnRhdGlvbk9iamVjdChtc2dDb250ZXh0KTsKLQotICAgICAgICAgICAgLy8gZmluZCB0aGUgV2ViU2VydmljZSBtZXRob2QKLSAgICAgICAgICAgIENsYXNzIGltcGxDbGFzcyA9IG9iai5nZXRDbGFzcygpOwotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZmluZE9wZXJhdGlvbihvcCwgaW1wbENsYXNzKTsKLQotICAgICAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJtZXRob2REb2VzTm90RXhpc3RJbk9ubHkiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1ldGhvZC5pbnZva2Uob2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKSB9KTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5PdXRBc3luY01lc3NhZ2VSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjE3NjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9SYXdYTUxJTk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIFRoZSBSYXdYTUxJTk91dEFzeW5jTWVzc2FnZVJlY2VpdmVyIE1lc3NhZ2VSZWNlaXZlciBoYW5kcyBvdmVyIHRoZSByYXcgcmVxdWVzdCByZWNlaXZlZCB0bwotICogdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgYXMgYW4gT01FbGVtZW50LiBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgZXhwZWN0ZWQKLSAqIHRvIHJldHVybiBiYWNrIHRoZSBPTUVsZW1lbnQgdG8gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gVGhpcyBpcyBhbiBhc3luY2hyb25vdXMKLSAqIE1lc3NhZ2VSZWNlaXZlciwgYW5kIGZpbmRzIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGludm9rZSBieSByZWZlcnJpbmcgdG8KLSAqIHRoZSAiU2VydmljZUNsYXNzIiBwYXJhbWV0ZXIgdmFsdWUgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlLnhtbCBhbmQgbG9va2luZyBhdCB0aGUKLSAqIG1ldGhvZHMgb2YgdGhlIGZvcm0gT01FbGVtZW50IDw8bWV0aG9kTmFtZT4+KE9NRWxlbWVudCByZXF1ZXN0KQotICoKLSAqIEBzZWUgUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyCi0gKiBAc2VlIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyCi0gKiBAZGVwcmVjYXRlZCB1c2UgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIgYW5kIHRoZSBET19BU1lOQyBwcm9wZXJ0eSBpbnN0ZWFkLi4uLgotICovCi1wdWJsaWMgY2xhc3MgUmF3WE1MSU5PdXRBc3luY01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIHsKLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKGZpbmFsIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDdHgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBtZXNzYWdlQ3R4LnNldFByb3BlcnR5KERPX0FTWU5DLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBzdXBlci5yZWNlaXZlKG1lc3NhZ2VDdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlOTU2ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvcmVjZWl2ZXJzL1Jhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFRoZSBSYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciBNZXNzYWdlUmVjZWl2ZXIgaGFuZHMgb3ZlciB0aGUgcmF3IHJlcXVlc3QgcmVjZWl2ZWQgdG8KLSAqIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGFzIGFuIE9NRWxlbWVudC4gVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzIGV4cGVjdGVkCi0gKiB0byByZXR1cm4gYmFjayB0aGUgT01FbGVtZW50IHRvIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuIFRoaXMgaXMgYSBzeW5jaHJvbm91cwotICogTWVzc2FnZVJlY2VpdmVyLCBhbmQgZmluZHMgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgdG8gaW52b2tlIGJ5IHJlZmVycmluZyB0bwotICogdGhlICJTZXJ2aWNlQ2xhc3MiIHBhcmFtZXRlciB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIHNlcnZpY2UueG1sIGFuZCBsb29raW5nIGF0IHRoZQotICogbWV0aG9kcyBvZiB0aGUgZm9ybSBPTUVsZW1lbnQgPDxtZXRob2ROYW1lPj4oT01FbGVtZW50IHJlcXVlc3QpCi0gKgotICogQHNlZSBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIKLSAqIEBzZWUgUmF3WE1MSU5PdXRBc3luY01lc3NhZ2VSZWNlaXZlcgotICovCi1wdWJsaWMgY2xhc3MgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEluT3V0U3luY01lc3NhZ2VSZWNlaXZlcgotICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2VSZWNlaXZlciB7Ci0KLSAgICBwcml2YXRlIE1ldGhvZCBmaW5kT3BlcmF0aW9uKEF4aXNPcGVyYXRpb24gb3AsIENsYXNzIGltcGxDbGFzcykgewotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkob3AuZ2V0UGFyYW1ldGVyVmFsdWUoIm15TWV0aG9kIikpOwotICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHJldHVybiBtZXRob2Q7Ci0KLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBvcC5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIExvb2tpbmcgZm9yIGEgbWV0aG9kIG9mIHRoZSBmb3JtICJPTUVsZW1lbnQgbWV0aG9kKE9NRWxlbWVudCkiCi0gICAgICAgICAgICBtZXRob2QgPSBpbXBsQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzcyBbXSB7IE9NRWxlbWVudC5jbGFzcyB9KTsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhPTUVsZW1lbnQuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3AuYWRkUGFyYW1ldGVyKCJteU1ldGhvZCIsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGhlcmUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEZhdWx0IHRocm91Z2gKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIGJ1c3NpbmVzcyBsb2dpYyBpbnZvY2F0aW9uIG9uIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICB0aGUgaW5jb21pbmcgbWVzc2FnZSBjb250ZXh0Ci0gICAgICogQHBhcmFtIG5ld21zZ0NvbnRleHQgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgY29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IG9uIGludmFsaWQgbWV0aG9kICh3cm9uZyBzaWduYXR1cmUpIG9yIGJlaGF2aW91ciAocmV0dXJuIG51bGwpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBNZXNzYWdlQ29udGV4dCBuZXdtc2dDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KG1zZ0NvbnRleHQpOwotCi0gICAgICAgICAgICAvLyBmaW5kIHRoZSBXZWJTZXJ2aWNlIG1ldGhvZAotICAgICAgICAgICAgQ2xhc3MgaW1wbENsYXNzID0gb2JqLmdldENsYXNzKCk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BEZXNjID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZmluZE9wZXJhdGlvbihvcERlc2MsIGltcGxDbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoTWVzc2FnZXMuZ2V0TWVzc2FnZSgibWV0aG9kRG9lc05vdEV4aXN0SW5PdXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2MuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IChPTUVsZW1lbnQpIG1ldGhvZC5pbnZva2UoCi0gICAgICAgICAgICAgICAgICAgIG9iaiwgbmV3IE9iamVjdFtde21zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCl9KTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IGdldFNPQVBGYWN0b3J5KG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjLmdldERlZmF1bHRFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmV3bXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9TZXJ2ZXJDYWxsYmFjay5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JlY2VpdmVycy9TZXJ2ZXJDYWxsYmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA2NzExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9yZWNlaXZlcnMvU2VydmVyQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBTZXJ2ZXJDYWxsYmFjayB7Ci0gICAgcHVibGljIHZvaWQgaGFuZGxlRmF1bHQoQXhpc0ZhdWx0IGZhdWx0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlUmVzdWx0KE1lc3NhZ2VDb250ZXh0IHJlc3VsdCkgdGhyb3dzIEF4aXNGYXVsdDsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi9zZXJ2aWNlL0xpZmVjeWNsZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NlcnZpY2UvTGlmZWN5Y2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDZmOWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NlcnZpY2UvTGlmZWN5Y2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgTGlmZWN5Y2xlIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgeW91ciBiYWNrLWVuZCBzZXJ2aWNlCi0gKiBjbGFzcyBpZiB5b3Ugd2lzaCB0byBiZSBub3RpZmllZCBvZiBjcmVhdGlvbiBhbmQgY2xlYW51cCBieSB0aGUgQXhpczIKLSAqIGZyYW1ld29yay4KLSAqLwotcHVibGljIGludGVyZmFjZSBMaWZlY3ljbGUgewotCi0gICAgLyoqCi0gICAgICogaW5pdCgpIGlzIGNhbGxlZCB3aGVuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgaGFzIGJlZW4gY3JlYXRlZC4KLSAgICAgKiBUaGlzIG9jY3VycyBpbiBzeW5jIHdpdGggc2Vzc2lvbi9TZXJ2aWNlQ29udGV4dCBjcmVhdGlvbi4gIFRoaXMgbWV0aG9kIGdpdmVzIGNsYXNzZXMKLSAgICAgKiBhIGNoYW5jZSB0byBkbyBhbnkgc2V0dXAgd29yayAoZ3JhYiByZXNvdXJjZXMsIGVzdGFibGlzaCBjb25uZWN0aW9ucywgZXRjKSBiZWZvcmUKLSAgICAgKiB0aGV5IGFyZSBpbnZva2VkIGJ5IGEgc2VydmljZSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFjdGl2ZSBTZXJ2aWNlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLiAgVGhyb3dpbmcgYSBmYXVsdCBoZXJlIHdpbGwgcmVzdWx0IGluIGVpdGhlcgotICAgICAqICAgICAgICAgICAgICAgICAgIGZhaWxlZCBkZXBsb3ltZW50IChmb3IgYXBwbGljYXRpb24tc2NvcGVkIHNlcnZpY2VzKSBvciBmYWlsZWQgcmVxdWVzdHMuCi0gICAgICovCi0gICAgdm9pZCBpbml0KFNlcnZpY2VDb250ZXh0IGNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBkZXN0cm95KCkgaXMgY2FsbGVkIHdoZW4gQXhpczIgZGVjaWRlcyB0aGF0IGl0IGlzIGZpbmlzaGVkIHdpdGggYSBwYXJ0aWN1bGFyIGluc3RhbmNlCi0gICAgICogb2YgdGhlIGJhY2stZW5kIHNlcnZpY2UgY2xhc3MuICBJdCBhbGxvd3MgY2xhc3NlcyB0byBjbGVhbiB1cCByZXNvdXJjZXMuCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGFjdGl2ZSBTZXJ2aWNlQ29udGV4dAotICAgICAqLwotICAgIHZvaWQgZGVzdHJveShTZXJ2aWNlQ29udGV4dCBjb250ZXh0KTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2YTU0Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zYWN0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25Db25maWd1cmF0aW9uIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmFuc2FjdGlvbkNvbmZpZ3VyYXRpb24uY2xhc3MpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9UWF9USU1FX09VVCA9IDMwMDAwMCA7IC8vMzBzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfTUFOQUdFUl9KTkRJX05BTUUgPSAiVHJhbnNhY3Rpb25NYW5hZ2VySk5ESU5hbWUiOwotCi0gICAgcHJpdmF0ZSBpbnQgdHJhbnNhY3Rpb25UaW1lb3V0ID0gREVGQVVMVF9UWF9USU1FX09VVDsKLSAgICBwcml2YXRlIFRocmVhZExvY2FsIHRocmVhZFRyYW5zYWN0aW9uTWFuYWdlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGpuZGlQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICBwcml2YXRlIFN0cmluZyB0cmFuc2FjdGlvbk1hbmFnZXJKTkRJTmFtZSA9IG51bGw7Ci0KLQotCi0gICAgcHVibGljIFRyYW5zYWN0aW9uQ29uZmlndXJhdGlvbihQYXJhbWV0ZXJJbmNsdWRlIHRyYW5zYWN0aW9uUGFyYW1ldGVycykgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgIEl0ZXJhdG9yIGl0ID0gdHJhbnNhY3Rpb25QYXJhbWV0ZXJzLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gKFBhcmFtZXRlcikgaXQubmV4dCgpOwotICAgICAgICAgICAgam5kaVByb3BlcnRpZXMucHV0KHBhcmFtZXRlci5nZXROYW1lKCksIChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfSAgICAgICAgIAotICAgICAKLSAgICAgICAgdHJhbnNhY3Rpb25NYW5hZ2VySk5ESU5hbWUgPSAoU3RyaW5nKSB0cmFuc2FjdGlvblBhcmFtZXRlcnMuZ2V0UGFyYW1ldGVyKFRYX01BTkFHRVJfSk5ESV9OQU1FKS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmKHRyYW5zYWN0aW9uTWFuYWdlckpORElOYW1lID09IG51bGwpewotICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJSZXF1aXJlZCB0cmFuc2FjdGlvbiBwYXJhbWV0ZXIgIiArIFRYX01BTkFHRVJfSk5ESV9OQU1FICsgIiBtaXNzaW5nIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJlYWRUcmFuc2FjdGlvbk1hbmFnZXIgPSBuZXcgVGhyZWFkTG9jYWwoKTsgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VHJhbnNhY3Rpb25UaW1lb3V0KCl7Ci0gICAgICAgIHJldHVybiB0cmFuc2FjdGlvblRpbWVvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UaW1lb3V0KGludCB0cmFuc2FjdGlvblRpbWVvdXQpewotICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVGltZW91dCA9IHRyYW5zYWN0aW9uVGltZW91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIFRyYW5zYWN0aW9uTWFuYWdlciBnZXRUcmFuc2FjdGlvbk1hbmFnZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgVHJhbnNhY3Rpb25NYW5hZ2VyIHRyYW5zYWN0aW9uTWFuYWdlciA9IChUcmFuc2FjdGlvbk1hbmFnZXIpIHRocmVhZFRyYW5zYWN0aW9uTWFuYWdlci5nZXQoKTsKLSAgICAgICAgaWYgKHRyYW5zYWN0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbk1hbmFnZXIgPSBsb29rdXBUcmFuc2FjdGlvbk1hbmFnZXIoKTsKLSAgICAgICAgICAgIHRocmVhZFRyYW5zYWN0aW9uTWFuYWdlci5zZXQodHJhbnNhY3Rpb25NYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJKTkRJIGxvb2t1cCBUcmFuc2FjdGlvbk1hbmFnZXIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgbG9nLmRlYnVnKCJSZS11c2UgcHJldmlvdXNseSBKTkRJIGxvb2t1cCBUcmFuc2FjdGlvbk1hbmFnZXIiKTsKLSAgICAgICAgfQotICAgICAgICB0cnl7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbk1hbmFnZXIuc2V0VHJhbnNhY3Rpb25UaW1lb3V0KHRyYW5zYWN0aW9uVGltZW91dCk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGlnbm9yZSkge30KLQotICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25NYW5hZ2VyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIFRyYW5zYWN0aW9uTWFuYWdlciBsb29rdXBUcmFuc2FjdGlvbk1hbmFnZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgSW5pdGlhbENvbnRleHQoam5kaVByb3BlcnRpZXMpOwotICAgICAgICAgICAgT2JqZWN0IHRyYW5zYWN0aW9uTWFuYWdlciA9IGNvbnRleHQubG9va3VwKCB0cmFuc2FjdGlvbk1hbmFnZXJKTkRJTmFtZSApOwotICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uTWFuYWdlciAhPSBudWxsICYmIHRyYW5zYWN0aW9uTWFuYWdlciBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uTWFuYWdlcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoVHJhbnNhY3Rpb25NYW5hZ2VyKSB0cmFuc2FjdGlvbk1hbmFnZXI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiVHJhbnNhY3Rpb25NYW5hZ2VyIDogIiArIHRyYW5zYWN0aW9uTWFuYWdlckpORElOYW1lICsgIiBub3QgZm91bmQgd2hlbiBsb29raW5nIHVwIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIEpOREkgcHJvcGVydGllcyA6ICIgKyBjb250ZXh0LmdldEVudmlyb25tZW50KCkpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRyYW5zYWN0aW9uTWFuYWdlciA6ICIgKyB0cmFuc2FjdGlvbk1hbmFnZXJKTkRJTmFtZSArICIgbm90IGZvdW5kIHdoZW4gbG9va2luZyB1cCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBKTkRJIHByb3BlcnRpZXMgOiAiICsgY29udGV4dC5nZXRFbnZpcm9ubWVudCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICBsb2cuZXJyb3IobmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoIkVycm9yIGxvb2tpbmcgdXAgVHJhbnNhY3Rpb25NYW5hZ2VyICIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiB1c2luZyBKTkRJIHByb3BlcnRpZXMgOiAiKS5hcHBlbmQoam5kaVByb3BlcnRpZXMpKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlRyYW5zYWN0aW9uTWFuYWdlciBub3QgZm91bmQgd2hlbiBsb29raW5nIHVwIiArCi0gICAgICAgICAgICAgICAgICAgICIgdXNpbmcgSk5ESSBwcm9wZXJ0aWVzIDogIiArIGpuZGlQcm9wZXJ0aWVzKTsKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L01lc3NhZ2VGb3JtYXR0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvTWVzc2FnZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODYzMjI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvTWVzc2FnZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIDxwLz4KLSAqIE1lc3NhZ2VGb3JtYXR0ZXIgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkIGJ5IEF4aXMyIHRvIHN1cHBvcnQgc2VyaWFsaXphdGlvbgotICogb2YgbWVzc2FnZXMgdG8gZGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0cy4gKEVnOiBKU09OKS4gVXNlcnMgY2FuIHJlZ2lzdGVyCi0gKiBNZXNzYWdlRm9ybWF0dGVyIGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IGEgbWVzc2FnZSB0eXBlIHVzaW5nIHRoZSBheGlzMi54bWwuCi0gKiBNZXNzYWdlIHR5cGUgZm9yIGEgbWVzc2FnZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNldHRpbmcgdGhlICJtZXNzYWdlVHlwZSIKLSAqIHByb3BlcnR5IGluIHRoZSBNZXNzYWdlQ29udGV4dC4gVGhpcyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBhIHBhcmFtZXRlciBpbiB0aGUKLSAqIHNlcnZpY2UueG1sL2F4aXMyLnhtbCBmb3IgYSBwZXIgc2VydmljZSBiYXNlZC9lbmdpbmUgd2lkZSBjb25maWd1cmF0aW9uLgotICogPC9wPgotICogPHAvPgotICogPG1lc3NhZ2VGb3JtYXR0ZXJzPgotICogPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICogY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAqIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUZvcm1hdHRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBvZiB0aGUgbWVzc2FnZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgotICAgICAqICAgICAgICAgbWVzc2FnZSBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRvIHN1cHBvcnQgZGVmZmVyZWQgd3JpdGluZyB0cmFuc3BvcnRzIGFzIGluIGh0dHAgY2h1bmtpbmcuLiBBeGlzMiB3YXMKLSAgICAgKiBkb2luZyB0aGlzIGZvciBzb21lIHRpbWUuLgotICAgICAqIDxwLz4KLSAgICAgKiBQcmVzZXJ2ZSBmbGFnIGNhbiBiZSB1c2VkIHRvIHByZXNlcnZlIHRoZSBlbnZlbG9wZSBmb3IgbGF0ZXIgdXNlLiBUaGlzIGlzCi0gICAgICogdXNlZnVsbCB3aGVuIGltcGxlbWVudGluZyBhdXRoZW50aWNhdGlvbiBtYWNobmlzbXMgbGlrZSBOVExNLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFN0cmVhbQotICAgICAqIEBwYXJhbSBwcmVzZXJ2ZSAgICAgOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgZG8gbm90IGNvbnN1bWUgdGhlIE9NIHdoZW4gdGhpcyBpcyBzZXQuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBEaWZmZXJlbnQgbWVzc2FnZSBmb3JtYXRzIGNhbiBzZXQgdGhlaXIgb3duIGNvbnRlbnQgdHlwZXMKLSAgICAgKiBFZzogSlNPTkZvcm1hdHRlciBjYW4gc2V0IHRoZSBjb250ZW50IHR5cGUgYXMgYXBwbGljYXRpb24vanNvbgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGZvcm1hdAotICAgICAqIEBwYXJhbSBzb2FwQWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24pOwotCi0gICAgLyoqCi0gICAgICogU29tZSBtZXNzYWdlIGZvcm1hdHMgbWF5IHdhbnQgdG8gYWx0ZXIgdGhlIHRhcmdldCB1cmwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB0YXJnZXQgVVJMCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB0YXJnZXRVUkwpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoaXMgb25seSBpZiB5b3Ugd2FudCBzZXQgYSB0cmFuc3BvcnQgaGVhZGVyIGZvciBTT0FQIEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbik7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L091dFRyYW5zcG9ydEluZm8uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvT3V0VHJhbnNwb3J0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmQ4ZWM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvT3V0VHJhbnNwb3J0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0OwotCi1wdWJsaWMgaW50ZXJmYWNlIE91dFRyYW5zcG9ydEluZm8gewotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1JlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9SZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNTRlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1JlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIGNvbnRyb2wgb2JqZWN0IGZvciBhIFJlcXVlc3QvUmVzcG9uc2UgdHJhbnNwb3J0LgotICogVGhlIG5vcm1hbCBmbG93IG9mIEF4aXMyIGlzIHJvb3RlZCBhdCB0aGUgdHJhbnNwb3J0IC0tIHRoaXMgZG9lcyBub3QKLSAqIGFsbG93IGZvciBhbiBhY2tub3dsZWRnZW1lbnQgdG8gYmUgdHJhbnNtaXR0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgaGFzCi0gKiBjb21wbGV0ZWQsIG5vciBkb2VzIGl0IGFsbG93IGZvciBwcm9jZXNzaW5nIHRvIGJlIHBhdXNlZCBhbmQgcmVzdW1lZAotICogb24gYSBzZXBhcmF0ZSB0aHJlYWQgd2l0aG91dCBoYXZpbmcgYSByZXNwb25zZSBiZSBzZW50IGJhY2suICBUaGlzIGludGVyZmFjZQotICogZW5hYmxlcyBib3RoIG9mIHRob3NlIHNjZW5hcmlvcyBieSBhbGxvd2luZyB0aGUgdHJhbnNwb3J0IHRvIGV4cG9zZQotICogY29udHJvbHMgdG8gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSB2aWEgYSBjYWxsYmFjay4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgewotCi0gICAgLypUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIHRvIGJlIHN0b3JlZCBvbiB0aGUKLSAgICBNZXNzYWdlQ29udGV4dCovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0NPTlRST0wKLSAgICAgICAgICAgID0gIlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydENvbnRyb2wiOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSBpbiBhIG1lc3NhZ2UgdHJhbnNwb3J0IHdpbGwgY2FsbCB0aGUgYXdhaXRSZXNwb25zZSBtZXRob2QKLSAgICAgKiBvZiB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IGluc3RlYWQgb2YgcmV0dXJuaW5nLiBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgQm9vbGVhbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9MRF9SRVNQT05TRSA9ICJIb2xkUmVzcG9uc2UiOwotCi0gICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSB0cmFuc3BvcnQgdGhhdCBhIG1lc3NhZ2Ugc2hvdWxkIGJlIGFja25vd2xlZGdlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWNrbm93bGVkZ2VNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBQYXVzZSBleGVjdXRpb24gYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UgbWVzc2FnZSB0byBiZSByZWFkeS4gIFRoaXMgd2lsbAotICAgICAqIHR5cGljYWxseSBiZSBjYWxsZWQgYnkgdGhlIHRyYW5zcG9ydCBhZnRlciBhIG1lc3NhZ2UgaGFzIGJlZW4gcGF1c2VkIGFuZAotICAgICAqIHdpbGwgY2F1c2UgdGhlIHRyYW5zcG9ydCB0byBibG9jayB1bnRpbCBhIHJlc3BvbnNlIG1lc3NhZ2UgaXMgcmVhZHkgdG8gYmUKLSAgICAgKiByZXR1cm5lZC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIFJNIGZvciBpbi1vdXQgTUVQcyBvdmVyIGEKLSAgICAgKiByZXF1ZXN0L3Jlc3BvbnNlIHRyYW5zcG9ydDsgd2l0aG91dCBpdCB0aGUgbWVzc2FnZSB3b3VsZCBiZSBwYXVzZWQgYW5kIHRoZQotICAgICAqIHRyYW5zcG9ydCB3b3VsZCBzaW1wbHkgYWNrIHRoZSByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF3YWl0UmVzcG9uc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFNpZ25hbCB0aGF0IGEgcmVzcG9uc2UgaGFzIGJlIGNyZWF0ZWQgYW5kIGlzIHJlYWR5IGZvciB0cmFuc21pc3Npb24uICBUaGlzCi0gICAgICogc2hvdWxkIHJlbGVhc2UgYW55b25lIHdobyBpcyBibG9ja2VkIG9uIGEgYXdhaXRSZXNwb25zZSgpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNpZ25hbFJlc3BvbnNlUmVhZHkoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCB0ZWxsIHRoZSB0cmFuc3BvcnQgdG8gZW5kIGEgY3VycmVudCB3YWl0IGJ5IHJhaXNpbmcgdGhlIGdpdmVuIGZhdWx0LgotICAgICAqIEBwYXJhbSBmYXVsdCBUaGUgZmF1bHQgdG8gYmUgcmFpc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNpZ25hbEZhdWx0UmVhZHkoQXhpc0ZhdWx0IGZhdWx0KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGdpdmVzIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhbiBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgZ2V0U3RhdHVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSByZXNwb25zZSBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlV3JpdHRlbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIHJlc3BvbnNlIHdyaXR0ZW4gZmxhZyBvbiB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IAotICAgICAqIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VXcml0dGVuKGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuKTsKLSAgICAKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gZ2l2ZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc3BvcnQgaXMgaW4gaXRzIGluaXRpYWwgc3RhZ2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBJTklUSUFMID0KLSAgICAgICAgICAgICAgICBuZXcgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzKDEpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBhd2FpdFJlc3BvbnNlIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzIFdBSVRJTkcgPQotICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMoMik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGFja25vd2xlZGdlTWVzc2FnZSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBBQ0tFRCA9IAotICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgKDMpOwotICAgICAgICAvKioKLSAgICAgICAgICogJ3NpZ25hbFJlc3BvbnNlUmVhZHknIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzIFNJR05BTExFRCA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyg0KTsKLQotICAgICAgICBwcml2YXRlIGludCB2YWx1ZTsKLQotICAgICAgICBwcml2YXRlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyhpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cyBpbnN0YW5jZSA9IChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMpIG9iajsKLSAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gaW5zdGFuY2UudmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1NpbXBsZUF4aXMyU2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1NpbXBsZUF4aXMyU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAzYzU1MDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9TaW1wbGVBeGlzMlNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXhpczJTZXJ2ZXIgZXh0ZW5kcyBBeGlzU2VydmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTaW1wbGVBeGlzMlNlcnZlci5jbGFzcyk7Ci0KLSAgICBpbnQgcG9ydCA9IC0xOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgREVGQVVMVF9QT1JUID0gODA4MDsKLQotCi0gICAgcHVibGljIFNpbXBsZUF4aXMyU2VydmVyICgKLSAgICAgICAgICAgIFN0cmluZyByZXBvTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgY29uZkxvY2F0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoZmFsc2UpOwotICAgICAgICBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0ocmVwb0xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZkxvY2F0aW9uKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlcG9Mb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjb25mTG9jYXRpb24gPSBudWxsOwotCi0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIG9wdGlvbnNQYXJzZXIgPSBuZXcgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoYXJncyk7Ci0gICAgICAgIExpc3QgaW52YWxpZE9wdGlvbnNMaXN0ID0gb3B0aW9uc1BhcnNlci5nZXRJbnZhbGlkT3B0aW9ucyhuZXcgT3B0aW9uc1ZhbGlkYXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG9wdGlvbi5nZXRPcHRpb25UeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICEoInJlcG8iLmVxdWFsc0lnbm9yZUNhc2Uob3B0aW9uVHlwZSkgfHwgImNvbmYiCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmICgoaW52YWxpZE9wdGlvbnNMaXN0LnNpemUoKSA+IDApIHx8IChhcmdzLmxlbmd0aCA+IDQpKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgb3B0aW9uc01hcCA9IG9wdGlvbnNQYXJzZXIuZ2V0QWxsT3B0aW9ucygpOwotCi0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIHJlcG9PcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pIG9wdGlvbnNNYXAKLSAgICAgICAgICAgICAgICAuZ2V0KCJyZXBvIik7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIGNvbmZPcHRpb24gPSAoQ29tbWFuZExpbmVPcHRpb24pIG9wdGlvbnNNYXAKLSAgICAgICAgICAgICAgICAuZ2V0KCJjb25mIik7Ci0KLSAgICAgICAgbG9nLmluZm8oIltTaW1wbGVBeGlzU2VydmVyXSBTdGFydGluZyIpOwotICAgICAgICBpZiAocmVwb09wdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXBvTG9jYXRpb24gPSByZXBvT3B0aW9uLmdldE9wdGlvblZhbHVlKCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiW1NpbXBsZUF4aXNTZXJ2ZXJdIFVzaW5nIHRoZSBBeGlzMiBSZXBvc2l0b3J5IgotICAgICAgICAgICAgICAgICAgICArIG5ldyBGaWxlKHJlcG9Mb2NhdGlvbikuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlQXhpc1NlcnZlcl0gVXNpbmcgdGhlIEF4aXMyIFJlcG9zaXRvcnkiCi0gICAgICAgICAgICAgICAgICAgICsgbmV3IEZpbGUocmVwb0xvY2F0aW9uKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmZPcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgY29uZkxvY2F0aW9uID0gY29uZk9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiW1NpbXBsZUF4aXNTZXJ2ZXJdIFVzaW5nIHRoZSBBeGlzMiBDb25maWd1cmF0aW9uIEZpbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShjb25mTG9jYXRpb24pLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaW1wbGVBeGlzMlNlcnZlciBzZXJ2ZXIgPSBuZXcgU2ltcGxlQXhpczJTZXJ2ZXIocmVwb0xvY2F0aW9uLCBjb25mTG9jYXRpb24pOwotICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiW1NpbXBsZUF4aXNTZXJ2ZXJdIFN0YXJ0ZWQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZUF4aXNTZXJ2ZXJdIFN0YXJ0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5mYXRhbCgiW1NpbXBsZUF4aXNTZXJ2ZXJdIFNodXR0aW5nIGRvd24uIEVycm9yIHN0YXJ0aW5nIFNpbXBsZUF4aXNTZXJ2ZXIiLCB0KTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW1NpbXBsZUF4aXNTZXJ2ZXJdIFNodXR0aW5nIGRvd24uIEVycm9yIHN0YXJ0aW5nIFNpbXBsZUF4aXNTZXJ2ZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIlVzYWdlOiBTaW1wbGVBeGlzU2VydmVyIC1yZXBvIDxyZXBvc2l0b3J5PiAgLWNvbmYgPGF4aXMyIGNvbmZpZ3VyYXRpb24gZmlsZT4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0TGlzdGVuZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwZDcwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1RyYW5zcG9ydExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotCi0vKioKLSAqIENsYXNzIFRyYW5zcG9ydExpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0TGlzdGVuZXIgewotCi0gICAgU3RyaW5nIFBBUkFNX1BPUlQgPSAicG9ydCI7Ci0gICAgU3RyaW5nIEhPU1RfQUREUkVTUyA9ICJob3N0bmFtZSI7Ci0KLSAgICB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgYXhpc0NvbmYsIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwcnRJbikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICB2b2lkIHN0YXJ0KCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIHZvaWQgc3RvcCgpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUKLSAgICAgKiBAcGFyYW0gaXAKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqIEBkZXByZWNhdGVkIFRyYW5zcG9ydCBsaXN0ZW5lciBjYW4gZXhwb3NlIG1vcmUgdGhhbiBFUFJzLiBTbyB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIEVQUnMuCi0gICAgICogICAgICAgICAgICAgRGVwcmVjYXRpbmcgdGhpcyBtZXRob2QgZm9yIG5vdyBhbmQgcGxlYXNlIHVzZSBnZXRFUFJzRm9yU2VydmljZXMgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBFbmRwb2ludFJlZmVyZW5jZSBnZXRFUFJGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgRW5kcG9pbnRSZWZlcmVuY2VbXSBnZXRFUFJzRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRvIGdldCB0aGUgc2Vzc2lvbkNvbnRleHQgdHJhbnNwb3J0IGRlcGVuZGVudCBtYW5uZXIuIFNvIHRoYXQgdHJhbnNwb3J0IGxpc3RlbmVyCi0gICAgICogY2FuIHJldHVybiBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIHNlc3Npb24gbWFuYWdtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgOiBNZXNzYWdlQ29udGV4dCB3aGljaCBoYXMgYWxsIHRoZSByZWxhdmVudCBkYXRhCi0gICAgICogQHJldHVybiBTZXNzaW9uQ29udGV4dAotICAgICAqLwotICAgIFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLSAgICAKLSAgICB2b2lkIGRlc3Ryb3koKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0U2VuZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L1RyYW5zcG9ydFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWY5MTk5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0U2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLQotLyoqCi0gKiBUcmFuc3BvcnRTZW5kZXIgc2VuZHMgdGhlIFNPQVAgTWVzc2FnZSB0byBvdGhlciBTT0FQIG5vZGVzLiBBIFRyYW5zcG9ydFNlbmRlciBpcyByZXNwb25zaWJsZSBmb3IKLSAqIHdyaXRpbmcgdGhlIFNPQVAgTWVzc2FnZSB0byB0aGUgd2lyZS4gT3V0IGZsb3cgbXVzdCBiZSB0ZXJtaW5hdGVkIGVuZCB3aXRoIGEgVHJhbnNwb3J0U2VuZGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNwb3J0U2VuZGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhbiB1cAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZDb250ZXh0Ci0gICAgICogQHBhcmFtIHRyYW5zcG9ydE91dAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZDb250ZXh0LCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9UcmFuc3BvcnRVdGlscy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9UcmFuc3BvcnRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQzZDMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvVHJhbnNwb3J0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLkF0dGFjaG1lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQ2FjaGVkRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5hdHRhY2htZW50cy5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkRldGFjaGFibGVJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwubGxvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFRyYW5zcG9ydFV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUcmFuc3BvcnRVdGlscy5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSBjcmVhdGVTT0FQTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBNZXNzYWdlKG1zZ0NvbnRleHQsIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgYSBTT0FQRW52ZWxvcGUgYmFzZWQgb24gdGhlIElucHV0U3RyZWFtIHN0b3JlZCBvbgotICAgICAqIHRoZSBNZXNzYWdlQ29udGV4dC4gVGhlICdkZXRhY2gnIHBhcmFtZXRlciBjb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgCi0gICAgICogdW5kZXJseWluZyBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaXMgZGV0YWNoZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kLiBOb3RlLAotICAgICAqIGRldGFjaGluZyB0aGUgRGV0YWNoYWJsZUlucHV0U3RyZWFtIGNsb3NlcyB0aGUgdW5kZXJseWluZyBJbnB1dFN0cmVhbSB0aGF0Ci0gICAgICogaXMgc3RvcmVkIG9uIHRoZSBNZXNzYWdlQ29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNPQVBFbnZlbG9wZSBjcmVhdGVTT0FQTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGV0YWNoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLS8vICAgICAgICBmaW5hbCBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0vLyAgICAgICAgaWYgKGVudmVsb3BlICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgaWYgKGVudmVsb3BlLmlzQ29tcGxldGUoKSkKLS8vICAgICAgICAgICAgICAgIHJldHVybiBlbnZlbG9wZTsKLS8vICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IChJbnB1dFN0cmVhbSkgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0lOKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0lOLCBudWxsKTsKLQotICAgICAgICAgICAgLy8gdGhpcyBpbnB1dHN0cmFtIGlzIHNldCBieSB0aGUgVHJhbnNwb3J0U2VuZGVyIHJlcHJlc2VudHMgYSB0d28KLSAgICAgICAgICAgIC8vIHdheSB0cmFuc3BvcnQgb3IgYSBUcmFuc3BvcnQgUmVjZXZpZXIKLSAgICAgICAgICAgIGlmIChpblN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnB1dHN0cmVhbU51bGwiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBjaGFyIGVuY29kaW5nCi0gICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCAmJiBjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2hhclNldEVuYyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoYXJTZXRFbmMgPSBNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBjaGFyU2V0RW5jKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IGNyZWF0ZVNPQVBNZXNzYWdlKG1zZ0NvbnRleHQsIGluU3RyZWFtLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGlmIHdlIHdlcmUgdG9sZCB0byBkZXRhY2gsIHdlIHdpbGwgbWFrZSB0aGUgY2FsbCBoZXJlLCB0aGlzIGlzIG9ubHkgYXBwbGljYWJsZQotICAgICAgICAgICAgLy8gaWYgYSBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaW5zdGFuY2UgaXMgZm91bmQgb24gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICBpZihkZXRhY2gpIHsKLSAgICAgICAgICAgICAgICBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gZGlzID0gKERldGFjaGFibGVJbnB1dFN0cmVhbSkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuREVUQUNIQUJMRV9JTlBVVF9TVFJFQU0pOwotICAgICAgICAgICAgICAgIGlmKGRpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGFjaGluZyBpbnB1dCBzdHJlYW0gYWZ0ZXIgU09BUEVudmVsb3BlIGNvbnN0cnVjdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpcy5kZXRhY2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZW52OwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9iamVjdGl2ZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYXB0dXJlIHRoZSBTT0FQRW52ZWxvcGUgY3JlYXRpb24gbG9naWMKLSAgICAgKiBhbmQgbWFrZSBpdCBhIGNvbW1vbiBmb3IgYWxsIHRoZSB0cmFuc3BvcnRzIGFuZCB0byBpbi9vdXQgZmxvd3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEBwYXJhbSBpblN0cmVhbQotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQotICAgICAqIEByZXR1cm4gdGhlIFNPQVBFbnZlbG9wZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICogQHRocm93cyBPTUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTT0FQRW52ZWxvcGUgY3JlYXRlU09BUE1lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0LCBPTUV4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uLAotICAgICAgICAgICAgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBjcmVhdGVEb2N1bWVudEVsZW1lbnQoY29udGVudFR5cGUsIG1zZ0NvbnRleHQsIGluU3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBFbnZlbG9wZShkb2N1bWVudEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU09BUEVudmVsb3BlIGNyZWF0ZVNPQVBFbnZlbG9wZShPTUVsZW1lbnQgZG9jdW1lbnRFbGVtZW50KSB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHJlY2VpdmVkIGEgU09BUEVudmVsb3BlIG9yIG5vdAotICAgICAgICBpZiAoZG9jdW1lbnRFbGVtZW50IGluc3RhbmNlb2YgU09BUEVudmVsb3BlKSB7Ci0gICAgICAgICAgICBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIGRvY3VtZW50RWxlbWVudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIElmIGl0IGlzIG5vdCBhIFNPQVBFbnZlbG9wZSB3ZSB3cmFwIHRoYXQgd2l0aCBhIGZha2UKLSAgICAgICAgICAgIC8vIFNPQVBFbnZlbG9wZS4KLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgIGVudmVsb3BlID0gc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoZG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgY3JlYXRlRG9jdW1lbnRFbGVtZW50KFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBBeGlzRmF1bHQsIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBudWxsOwotICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50VHlwZS5pbmRleE9mKCc7Jyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgdHlwZSA9IGNvbnRlbnRUeXBlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGUgPSBjb250ZW50VHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNvbWUgc2VydmljZXMgc2VuZCBSRVNUIHJlc3BvbmNlcyBhcyB0ZXh0L3htbC4gV2Ugc2hvdWxkIGNvbnZlcnQgaXQgdG8KLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL3htbCBpZiBpdHMgYSBSRVNUIHJlc3BvbnNlLCBpZiBub3QgaXQgd2lsbCB0cnkgdG8gdXNlIHRoZSBTT0FQTWVzc2FnZUJ1aWxkZXIuCi0gICAgICAgICAgICAvLyBpc0RvaW5nUkVTVCBzaG91bGQgYWxyZWFkeSBiZSBwcm9wZXJseSBzZXQgYnkgSFRUUFRyYW5zcG9ydFV0aWxzLmluaXRpYWxpemVNZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSAmJiBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKHR5cGUpKSB7Ci0vLyAgICAgICAgICAgIGlmIChIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUwuZXF1YWxzKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNTZXJ2ZXJTaWRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0U29hcEFjdGlvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfQVBQTElDQVRJT05fWE1MOwotICAgICAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSAmJgotLy8gICAgICAgICAgICAgICAgICAgICAgICAhbXNnQ29udGV4dC5pc1Byb3BlcnR5VHJ1ZShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5TT0FQX1JFU1BPTlNFX01FUCkpIHsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKENvbnN0YW50cy5Db25maWd1cmF0aW9uLlNPQVBfUkVTUE9OU0VfTUVQKSkgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBCdWlsZGVyVXRpbC5nZXRCdWlsZGVyRnJvbVNlbGVjdG9yKHR5cGUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotCSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImNyZWF0ZVNPQVBFbnZlbG9wZSB1c2luZyBCdWlsZGVyICgiICsgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmdldENsYXNzKCkgKyAiKSBzZWxlY3RlZCBmcm9tIHR5cGUgKCIgKyB0eXBlICsiKSIpOwotCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBidWlsZGVyLnByb2Nlc3NEb2N1bWVudChpblN0cmVhbSwgY29udGVudFR5cGUsIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkb2N1bWVudEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBmaW5kIGEgQnVpbGRlciBmb3IgdHlwZSAoIiArIHR5cGUgKyAiKS4gIFVzaW5nIFJFU1QuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSBCdWlsZGVyVXRpbC5nZXRQT1hCdWlsZGVyKGluU3RyZWFtLCBudWxsKTsKLSAgICAgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRSBtYWtpbmcgc29hcCBkZWZ1YWx0IGZvciB0aGUgbW9tZW50Li5taWdodCBlZmZlY3QgdGhlCi0gICAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3QgZmluZCBhIEJ1aWxkZXIgZm9yIHR5cGUgKCIgKyB0eXBlICsgIikuICBVc2luZyBTT0FQLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLSAgICAgICAgICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gQnVpbGRlclV0aWwuZ2V0U09BUEJ1aWxkZXIoaW5TdHJlYW0sIGNoYXJTZXRFbmMpOwotICAgICAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHNldCBlbmNvZGluZyBmcm9tIHRoZQotICAgICAqIENvbnRlbnQtdHlwZSBoZWFkZXIKLSAgICAgKiBFeGFtcGxlOgotICAgICAqIENvbnRlbnQtVHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9dXRmLTgKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoYXJTZXRFbmNvZGluZyhTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIklucHV0IGNvbnRlbnRUeXBlICgiICsgY29udGVudFR5cGUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIGludCBpbmRleCA9IGNvbnRlbnRUeXBlLmluZGV4T2YoSFRUUENvbnN0YW50cy5DSEFSX1NFVF9FTkNPRElORyk7Ci0KLSAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7ICAgIC8vIENoYXJzZXQgZW5jb2Rpbmcgbm90IGZvdW5kIGluIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyCi0gICAgICAgICAgICAvLyBVc2luZyB0aGUgZGVmYXVsdCBVVEYtOAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGFyU2V0RW5jb2RpbmcgZGVmYXVsdGVkICgiICsgTWVzc2FnZUNvbnRleHQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORyArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTWVzc2FnZUNvbnRleHQuREVGQVVMVF9DSEFSX1NFVF9FTkNPRElORzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBzcGFjZXMgYXJvdW5kIHRoZSAnPScgc2lnbgotICAgICAgICBpbnQgaW5kZXhPZkVxID0gY29udGVudFR5cGUuaW5kZXhPZigiPSIsIGluZGV4KTsKLQotICAgICAgICAvLyBUaGVyZSBjYW4gYmUgc2l0dWF0aW9ucyB3aGVyZSAiY2hhcnNldCIgaXMgbm90IHRoZSBsYXN0IHBhcmFtZXRlciBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlcgotICAgICAgICBpbnQgaW5kZXhPZlNlbWlDb2xvbiA9IGNvbnRlbnRUeXBlLmluZGV4T2YoIjsiLCBpbmRleE9mRXEpOwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgaWYgKGluZGV4T2ZTZW1pQ29sb24gPiAwKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IChjb250ZW50VHlwZS5zdWJzdHJpbmcoaW5kZXhPZkVxICsgMSwgaW5kZXhPZlNlbWlDb2xvbikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsdWUgPSAoY29udGVudFR5cGUuc3Vic3RyaW5nKGluZGV4T2ZFcSArIDEsIGNvbnRlbnRUeXBlLmxlbmd0aCgpKSkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgIiIgYXJvdW5kIHRoZSB2YWx1ZSAtIGlmIHNvIHJlbW92ZSB0aGVtCi0gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdcIicpICE9IC0xKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2VBbGwoIlwiIiwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hhclNldEVuY29kaW5nIGZyb20gY29udGVudC10eXBlICgiICsgdmFsdWUgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIE9NRWxlbWVudCBvdXRwdXRNZXNzYWdlID0gZW52ZWxvcGU7Ci0KLSAgICAgICAgaWYgKChlbnZlbG9wZSAhPSBudWxsKSAmJiBtc2dDb250ZXh0LmlzRG9pbmdSRVNUKCkpIHsKLSAgICAgICAgICAgIG91dHB1dE1lc3NhZ2UgPSBlbnZlbG9wZS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0cHV0TWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotCi0gICAgICAgICAgICAgICAgLy8gUGljayB0aGUgY2hhciBzZXQgZW5jb2RpbmcgZnJvbSB0aGUgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotCi0gICAgICAgICAgICAgICAgZm9ybWF0LnNldERvT3B0aW1pemUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGZvcm1hdC5zZXREb2luZ1NXQShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0LnNldENoYXJTZXRFbmNvZGluZyhjaGFyU2V0RW5jKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlLnNlcmlhbGl6ZUFuZENvbnN1bWUob3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJvdXRNZXNzYWdlTnVsbCIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWwgd29yayBmb3IgYSBidWlsZGVyIHNlbGVjdG9yIHdoaWNoIHNlbGVjdHMgdGhlIGJ1aWxkZXIgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBmb3JtYXQgYmFzZWQgb24gdGhlIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlY2lldmVkIG1lc3NhZ2UuCi0gICAgICogY29udGVudC10eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggdGhlIEF4aXMyLnhtbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHJldHVybiB0aGUgYnVpbGRlciByZWdpc3RlcmVkIGFnYWluc3QgdGhlIGdpdmVuIGNvbnRlbnQtdHlwZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRm9ybWF0dGVyIGdldE1lc3NhZ2VGb3JtYXR0ZXIoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPSBudWxsOwotICAgICAgICBTdHJpbmcgbWVzc2FnZUZvcm1hdFN0cmluZyA9IGdldE1lc3NhZ2VGb3JtYXR0ZXJQcm9wZXJ0eShtc2dDb250ZXh0KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VGb3JtYXRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlciA9IG1zZ0NvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNZXNzYWdlRm9ybWF0dGVyKG1lc3NhZ2VGb3JtYXRTdHJpbmcpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1lc3NhZ2VGb3JtYXR0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlciA9IChNZXNzYWdlRm9ybWF0dGVyKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfRk9STUFUVEVSKTsKLSAgICAgICAgICAgIGlmKG1lc3NhZ2VGb3JtYXR0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtZXNzYWdlRm9ybWF0dGVyID09IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGRvaW5nIHJlc3QgYmV0dGVyIGRlZmF1bHQgdG8gQXBwbGljYXRpb24veG1sIGZvcm1hdHRlcgotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCk7Ci0gICAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVC5lcXVhbHMoaHR0cE1ldGhvZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0RFTEVURS5lcXVhbHMoaHR0cE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBYRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvblhNTEZvcm1hdHRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBMZXRzIGRlZmF1bHQgdG8gU09BUCBmb3JtYXR0ZXIKLSAgICAgICAgICAgICAgICAvL1RPRE8gbmVlZCB0byBpbXByb3ZlIHRoaXMgdG8gdXNlIHRoZSBzdGF0ZWxlc3MgbmF0dXJlCi0gICAgICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlciA9IG5ldyBTT0FQTWVzc2FnZUZvcm1hdHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlICAgICAgICAgIFRoZSBjb250ZW50VHlwZSBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZS4gIEl0IG1heSBiZSBudWxsCi0gICAgICogQHBhcmFtIGRlZmF1bHRTT0FQTmFtZXNwYWNlIFVzdWFsbHkgc2V0IHRoZSB2ZXJzaW9uIHRoYXQgaXMgZXhwZWN0ZWQuICBUaGlzIGEgZmFsbGJhY2sgaWYgdGhlIGNvbnRlbnRUeXBlIGlzIHVuYXZhaWxhYmxlIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IG1hdGNoIG91ciBleHBlY3RhdGlvbnMKLSAgICAgKiBAcmV0dXJuIG51bGwgb3IgdGhlIHNvYXAgbmFtZXNwYWNlLiAgQSBudWxsIGluZGljYXRlcyB0aGF0IHRoZSBtZXNzYWdlIHdpbGwgYmUgaW50ZXJwcmV0dGVkIGFzIGEgbm9uLVNPQVAgKGkuZS4gUkVTVCkgbWVzc2FnZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTT0FQTmFtZXNwYWNlRnJvbUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFNPQVBOYW1lc3BhY2UpIHsKLQotICAgICAgICBTdHJpbmcgcmV0dXJuTlMgPSBkZWZhdWx0U09BUE5hbWVzcGFjZTsKLSAgICAgICAgLy8gRGlzY3JpbWluYXRlIHVzaW5nIHRoZSBjb250ZW50IFR5cGUKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogU09BUDExIGNvbnRlbnQtdHlwZSBpcyAidGV4dC94bWwiCi0gICAgICAgICAgICAqIFNPQVAxMiBjb250ZW50LXR5cGUgaXMgImFwcGxpY2F0aW9uL3NvYXAreG1sIgotICAgICAgICAgICAgKgotICAgICAgICAgICAgKiBXaGF0IGFib3V0IG90aGVyIGNvbnRlbnQtdHlwZXM/Ci0gICAgICAgICAgICAqCi0gICAgICAgICAgICAqIFRPRE86IEknbSBub3QgZnVsbHkgY29udmluY2VkIHRoaXMgbWV0aG9kIGlzIGNvbXBsZXRlLCBnaXZlbiB0aGUgbWVkaWEgdHlwZXMKLSAgICAgICAgICAgICogbGlzdGVkIGluIEhUVFBDb25zdGFudHMuICBTaG91bGQgd2UgYXNzdW1lIGFsbCBhcHBsaWNhdGlvbi8qIGlzIFNPQVAxMj8KLSAgICAgICAgICAgICogU2hvdWxkIHdlIGFzc3VtZSBhbGwgdGV4dC8qIGlzIFNPQVAxMT8KLSAgICAgICAgICAgICoKLSAgICAgICAgICAgICogU28sIHdlJ2xsIGZvbGxvdyB0aGlzIHBhdHRlcm46Ci0gICAgICAgICAgICAqIDEpICBmaW5kIHRoZSBjb250ZW50LXR5cGUgbWFpbiBzZXR0aW5nCi0gICAgICAgICAgICAqIDIpICBpZiAoMSkgbm90IHVuZGVyc3Rvb2QsIGZpbmQgdGhlICJ0eXBlPSIgcGFyYW0KLSAgICAgICAgICAgICogVGhpbGluYTogSSBtZXJnZWQgKDEpICYgKDIpCi0gICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBpZiAoSmF2YVV0aWxzLmluZGV4T2ZJZ25vcmVDYXNlKGNvbnRlbnRUeXBlLCBTT0FQMTJDb25zdGFudHMuU09BUF8xMl9DT05URU5UX1RZUEUpID4gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuTlMgPSBTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gc2VhcmNoIGZvciAidHlwZT10ZXh0L3htbCIKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIChKYXZhVXRpbHMuaW5kZXhPZklnbm9yZUNhc2UoY29udGVudFR5cGUsIFNPQVAxMUNvbnN0YW50cy5TT0FQXzExX0NPTlRFTlRfVFlQRSkgPiAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm5OUyA9IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuTlMgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBjb250ZW50LXR5cGUgb3IgXCJ0eXBlPVwiIHBhcmFtZXRlciB3YXMgZm91bmQgaW4gdGhlIGNvbnRlbnQtdHlwZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgYW5kIG5vIGRlZmF1bHQgd2FzIHNwZWNpZmllZCwgdGh1cyBkZWZhdWx0aW5nIHRvIFNPQVAgMS4xLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuTlMgPSBTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNvbnRlbnQtdHlwZTogIiArIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZGVmYXVsdFNPQVBOYW1lc3BhY2U6ICIgKyBkZWZhdWx0U09BUE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmVkIG5hbWVzcGFjZTogIiArIHJldHVybk5TKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTlM7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0NvbnRlbnRUeXBlRm9yQWN0aW9uKFN0cmluZyBjb250ZW50VHlwZSwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICAvL0NoZWNrIGZvciBhY3Rpb24gaGVhZGVyIGFuZCBzZXQgaXQgaW4gYXMgc29hcEFjdGlvbiBpbiBNZXNzYWdlQ29udGV4dAotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50VHlwZS5pbmRleE9mKCJhY3Rpb24iKTsKLSAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc2llbnRTdHJpbmcgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcoaW5kZXgsIGNvbnRlbnRUeXBlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGludCBlcXVhbCA9IHRyYW5zaWVudFN0cmluZy5pbmRleE9mKCI9Iik7Ci0gICAgICAgICAgICBpbnQgZmlyc3RTZW1pQ29sb24gPSB0cmFuc2llbnRTdHJpbmcuaW5kZXhPZigiOyIpOwotICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb247IC8vIFRoaXMgd2lsbCBjb250YWluICIiIGluIHRoZSBzdHJpbmcKLSAgICAgICAgICAgIGlmIChmaXJzdFNlbWlDb2xvbiA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgc29hcEFjdGlvbiA9IHRyYW5zaWVudFN0cmluZy5zdWJzdHJpbmcoZXF1YWwgKyAxLCBmaXJzdFNlbWlDb2xvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24gPSB0cmFuc2llbnRTdHJpbmcuc3Vic3RyaW5nKGVxdWFsICsgMSwgdHJhbnNpZW50U3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc29hcEFjdGlvbiAhPSBudWxsKSAmJiBzb2FwQWN0aW9uLnN0YXJ0c1dpdGgoIlwiIikKLSAgICAgICAgICAgICAgICAgICAgJiYgc29hcEFjdGlvbi5lbmRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgICAgIHNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDEsIHNvYXBBY3Rpb24ubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U29hcEFjdGlvbihzb2FwQWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGb3JtYXR0ZXJQcm9wZXJ0eShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlRm9ybWF0dGVyUHJvcGVydHkgPSBudWxsOwotICAgICAgICBPYmplY3QgcHJvcGVydHkgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSk7Ci0gICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlRm9ybWF0dGVyUHJvcGVydHkgPSAoU3RyaW5nKSBwcm9wZXJ0eTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWVzc2FnZUZvcm1hdHRlclByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JtYXR0ZXJQcm9wZXJ0eSA9IChTdHJpbmcpIHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0dGVyUHJvcGVydHk7Ci0gICAgfQotICAgIAotICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSByZXNwb25zZSB3cml0dGVuIGZsYWcgZnJvbSB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0Ci0gICAgICAgICAqIGluc3RhbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVzcG9uc2VXcml0dGVuKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmVxUmVzVHJhbnNwb3J0ID0gZ2V0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXFSZXNUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCByZXR1cm5pbmcgaXNSZXNwb25zZVdyaXR0ZW4oKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVxUmVzVHJhbnNwb3J0LmlzUmVzcG9uc2VXcml0dGVuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmV0dXJuaW5nIGZhbHNlIGZyb20gZ2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlJlc3BvbnNlV3JpdHRlbigpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byBzZXQgdGhlIHJlc3BvbnNlIHdyaXR0ZW4gZmxhZyBvbiB0aGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0Ci0gICAgICAgICAqIGluc3RhbmNlLgotICAgICAgICAqLwotICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXNwb25zZVdyaXR0ZW4oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuKSB7Ci0gICAgICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgcmVxUmVzVHJhbnNwb3J0ID0gZ2V0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXFSZXNUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBzZXR0aW5nIHJlc3BvbnNlIHdyaXR0ZW4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxUmVzVHJhbnNwb3J0LnNldFJlc3BvbnNlV3JpdHRlbihyZXNwb25zZVdyaXR0ZW4pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgY2Fubm90IHNldCByZXNwb25zZSB3cml0dGVuIik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAKLSAgICAgICAvKioKLSAgICAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgdGhlIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBpbnN0YW5jZQotICAgICAgICAqIGZyb20gdGhlIE1lc3NhZ2VDb250ZXh0IG9iamVjdC4gVGhlIE1lc3NhZ2VDb250ZXh0IG1heSBiZSB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgc28KLSAgICAgICAgKiBpbiB0aGF0IGNhc2Ugd2Ugd2lsbCBoYXZlIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0IGZyb20gdGhlIE9wZXJhdGlvbkNvbnRleHQuCi0gICAgICAgICovCi0gICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IGdldFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgIAkgICB0cnkgewotICAgIAkJICAgLy8gSWYgdGhpcyBpcyB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dCB3ZSBzaG91bGQgZmluZCBpdCBkaXJlY3RseSBieSB0aGUgZ2V0UHJvcGVydHkoKQotICAgICAgICAgICAgICAgLy8gbWV0aG9kCi0gICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKSAKLSAgICAgICAgICAgIAkJICAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIHJldHVybiAoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KSBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAJCSAgIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgd2UgbmVlZCB0byBsb29rIGZvciB0aGUgcmVxdWVzdCBNZXNzYWdlQ29udGV4dAotICAgICAgICAJCWVsc2UgaWYgKG1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSAhPSBudWxsCi0gICAgICAgIAkJCQkmJiBtZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAJCS5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpICE9IG51bGwpIHsKLSAgICAgICAgCQkJCQkJcmV0dXJuIChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpIG1lc3NhZ2VDb250ZXh0LgotICAgICAgICAJCQkJCQlnZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoCi0gICAgICAgIAkJCQkJCQkJV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKS5nZXRQcm9wZXJ0eSgKLSAgICAgICAgCQkJCQkJCQkJCVJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCk7Ci0gICAgICAgIAkJfSAKLSAgICAgICAgCQllbHNlIHsKLSAgICAgICAgCQkJcmV0dXJuIG51bGw7Ci0gICAgICAgIAkJfSAKLSAgICAJICAgfQotICAgICAgICAgICBjYXRjaChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgCS8vIHByb2JhYmx5IHNob3VsZCBub3QgYmUgZmF0YWwsIHNvIGp1c3QgbG9nIHRoZSBtZXNzYWdlCi0gICAgICAgICAgIAlTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZ2V0TWVzc2FnZUNvbnRleHRFcnJvciIsIGFmLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAJbG9nLmRlYnVnKG1zZyk7Ci0gICAgICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgfQotICAgIH0KLSAgICAgICAKLSAgICAgICAvKioKLSAgICAgICAgKiBDbGVhbiB1cCBjYWNoZWQgYXR0YWNobWVudCBmaWxlIAotICAgICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICAgICovCi0gICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUF0dGFjaG1lbnRzKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAJaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkVudGVyaW5nIGRlbGV0ZUF0dGFjaG1lbnRzKCkiKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAJQXR0YWNobWVudHMgYXR0YWNobWVudHMgPSBtc2dDb250ZXh0LmdldEF0dGFjaG1lbnRNYXAoKTsKLSAgICAgICAJTGlmZWN5Y2xlTWFuYWdlciBsY20gPSAoTGlmZWN5Y2xlTWFuYWdlciltc2dDb250ZXh0LmdldFJvb3RDb250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRQYXJhbWV0ZXJWYWx1ZShEZXBsb3ltZW50Q29uc3RhbnRzLkFUVEFDSE1FTlRTX0xJRkVDWUNMRV9NQU5BR0VSKTsKLSAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBDb250ZW50IElEcyBmb3IgdGhlIGF0dGFjaG1lbnRzLi4uYnV0IGRvZXMgbm90IHRyeSB0byBwdWxsIHRoZSBzdHJlYW0gZm9yIG5ldyBhdHRhY2htZW50cy4KLSAgICAgICAgICAgICAgIC8vIChQdWxsaW5nIHRoZSBzdHJlYW0gZm9yIG5ldyBhdHRhY2htZW50cyB3aWxsIHByb2JhYmx5IGZhaWwuLi50aGUgc3RyZWFtIGlzIHByb2JhYmx5IGNsb3NlZCkKLSAgICAgICAgICAgICAgIExpc3Qga2V5cyA9IGF0dGFjaG1lbnRzLmdldENvbnRlbnRJRExpc3QoKTsKLSAgICAgICAgICAgICAgIGlmIChrZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgIAlTdHJpbmcga2V5ID0gbnVsbDsKLSAgICAgICAgICAgICAgIAlGaWxlIGZpbGUgPSBudWxsOwotICAgICAgICAgICAgICAgCURhdGFTb3VyY2UgZGF0YVNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSAoU3RyaW5nKSBrZXlzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBhdHRhY2htZW50cy5nZXREYXRhSGFuZGxlcihrZXkpLmdldERhdGFTb3VyY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBDYWNoZWRGaWxlRGF0YVNvdXJjZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAJZmlsZSA9ICgoQ2FjaGVkRmlsZURhdGFTb3VyY2UpZGF0YVNvdXJjZSkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0ZSBjYWNoZSBhdHRhY2htZW50IGZpbGU6ICIrZmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpZihsY20hPW51bGwpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImRlbGV0aW5nIGZpbGUgdXNpbmcgbGlmZWN5Y2xlbWFuYWdlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbS5kZWxldGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAJICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGUgY2FjaGUgYXR0YWNobWVudCBmaWxlIGZhaWxlZCIrIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxjbSE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsgICAgICAgICAgICAgICAgICAgICAgICAJCQkgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjbS5kZWxldGVPbkV4aXQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgICAKLSAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4aXRpbmcgZGVsZXRlQXR0YWNobWVudHMoKSIpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIC8qKgotICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgY29tcG9uZW50cyB3aXNoaW5nIHRvIGRldGFjaCB0aGUgRGV0YWNoYWJsZUlucHV0U3RyZWFtCi0gICAgICAgICogb2JqZWN0IHRoYXQgaXMgcHJlc2VudCBvbiB0aGUgTWVzc2FnZUNvbnRleHQuIFRoaXMgaXMgbWVhbnQgdG8gc2hpZWxkIGNvbXBvbmVudHMKLSAgICAgICAgKiBmcm9tIGFueSBsb2dpYyB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkIG9uIHRoZSBEZXRhY2hhYmxlSW5wdXRTdHJlYW0gaW4gb3JkZXIgdG8gCi0gICAgICAgICogaGF2ZSBpdCBlZmZlY3RpdmVseSBkZXRhY2hlZC4gSWYgdGhlIERldGFjaGFibGVJbnB1dFN0cmVhbSBpcyBub3QgcHJlc2VudCwgb3IgaWYKLSAgICAgICAgKiB0aGUgc3VwcGxpZWQgTWVzc2FnZUNvbnRleHQgaXMgbnVsbCwgbm8gYWN0aW9uIHdpbGwgYmUgdGFrZW4uCi0gICAgICAgICovCi0gICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRldGFjaElucHV0U3RyZWFtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgaWYobXNnQ29udGV4dCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkRFVEFDSEFCTEVfSU5QVVRfU1RSRUFNKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgRGV0YWNoYWJsZUlucHV0U3RyZWFtIGRpcyA9IChEZXRhY2hhYmxlSW5wdXRTdHJlYW0pIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkRFVEFDSEFCTEVfSU5QVVRfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGFjaGluZyBEZXRhY2hhYmxlSW5wdXRTdHJlYW06ICIgKyBkaXMpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBkaXMuZGV0YWNoKCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRldGFjaCBub3QgcGVyZm9ybWVkIGZvciBNZXNzYWdlQ29udGV4dDogIiArIG1zZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhdGNoKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KHQpOwotICAgICAgICAgICB9Ci0gICAgICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2hlY2tzIHdoZXRoZXIgTVRPTSBuZWVkcyB0byBiZSBlbmFibGVkIGZvciB0aGUgbWVzc2FnZSByZXByZXNlbnRlZCBieQotICAgICAqIHRoZSBtc2dDb250ZXh0LiBXZSBjaGVjayB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgImVuYWJsZU1UT00iIHByb3BlcnR5Ci0gICAgICogZWl0aGVyIHVzaW5nIHRoZSBjb25maWcgZmlsZXMgKGF4aXMyLnhtbCwgc2VydmljZXMueG1sKSBvcgotICAgICAqIHByb2dyYW1hdGljYWxseS4gUHJvZ3JhbWF0aWMgY29uZmlndXJhdGlvbiBpcyBnaXZlbiBwcmlvcml0eS4gSWYgdGhlCi0gICAgICogZ2l2ZW4gdmFsdWUgaXMgIm9wdGlvbmFsIiwgTVRPTSB3aWxsIGJlIGVuYWJsZWQgb25seSBpZiB0aGUgaW5jb21pbmcKLSAgICAgKiBtZXNzYWdlIHdhcyBhbiBNVE9NIG1lc3NhZ2UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBTd0EgbmVlZHMgdG8gYmUgZW5hYmxlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb1dyaXRlTVRPTShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlTVRPTTsKLSAgICAgICAgT2JqZWN0IGVuYWJsZU1UT01PYmplY3QgPSBudWxsOwotICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgd2hldGhlciBNVE9NIGlzIGVuYWJsZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gKEVnOkF4aXMyLnhtbCwgc2VydmljZXMueG1sKQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbXNnQ29udGV4dC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00pOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZU1UT01PYmplY3QgPSBwYXJhbWV0ZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGlzIG92ZXJyaWRkZW4gcHJvZ3JhbWF0aWNhbGx5Li4KLSAgICAgICAgLy8gUHJpb3JpdHkgZ2l2ZW4gdG8gcHJvZ3JhbWF0aWNhbGx5IHNldHRpbmcgb2YgdGhlIHZhbHVlCi0gICAgICAgIE9iamVjdCBwcm9wZXJ0eSA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00pOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5hYmxlTVRPTU9iamVjdCA9IHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIGVuYWJsZU1UT00gPSBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShlbmFibGVNVE9NT2JqZWN0KTsKLSAgICAgICAgLy8gSGFuZGxlIHRoZSBvcHRpb25hbCB2YWx1ZSBmb3IgZW5hYmxlTVRPTQotICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZm9yICdlbmFibGVNVE9NJyBpcyBnaXZlbiBhcyBvcHRpb25hbCBhbmQgaWYgdGhlIHJlcXVlc3QKLSAgICAgICAgLy8gbWVzc2FnZSB3YXMgYSBNVE9NIG1lc3NhZ2Ugd2Ugc2VudCBvdXQgTVRPTQotICAgICAgICBpZiAoIWVuYWJsZU1UT00gJiYgbXNnQ29udGV4dC5pc0RvaW5nTVRPTSgpICYmIChlbmFibGVNVE9NT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBlbmFibGVNVE9NT2JqZWN0KS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5WQUxVRV9PUFRJT05BTCkpIHsKLSAgICAgICAgICAgICAgICAvL0luIHNlcnZlciBzaWRlLCB3ZSBjaGVjayB3aGV0aGVyIHJlcXVlc3Qgd2FzIE1UT00KLSAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXNnQ29udGV4dC5pc0RvaW5nTVRPTSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNVE9NID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNsaWVudCBzaWRlLCB3ZSBlbmFibGUgTVRPTSBpZiBpdCBpcyBvcHRpb25hbCAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmFibGVNVE9NID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuYWJsZU1UT007Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogQ2hlY2tzIHdoZXRoZXIgU09BUCBXaXRoIEF0dGFjaG1lbnRzIChTd0EpIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZQotICAgICAqIG1lc3NhZ2UgcmVwcmVzZW50ZWQgYnkgdGhlIG1zZ0NvbnRleHQuIFdlIGNoZWNrIHZhbHVlIGFzc2lnbmVkIHRvIHRoZQotICAgICAqICJlbmFibGVTd0EiIHByb3BlcnR5IGVpdGhlciB1c2luZyB0aGUgY29uZmlnIGZpbGVzIChheGlzMi54bWwsCi0gICAgICogc2VydmljZXMueG1sKSBvciBwcm9ncmFtYXRpY2FsbHkuIFByb2dyYW1hdGljIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4KLSAgICAgKiBwcmlvcml0eS4gSWYgdGhlIGdpdmVuIHZhbHVlIGlzICJvcHRpb25hbCIsIFN3QSB3aWxsIGJlIGVuYWJsZWQgb25seSBpZgotICAgICAqIHRoZSBpbmNvbWluZyBtZXNzYWdlIHdhcyBTd0EgdHlwZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiB0cnVlIGlmIFN3QSBuZWVkcyB0byBiZSBlbmFibGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGRvV3JpdGVTd0EoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBib29sZWFuIGVuYWJsZVN3QTsKLSAgICAgICAgT2JqZWN0IGVuYWJsZVN3QU9iamVjdCA9IG51bGw7Ci0gICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSB3aGV0aGVyIFN3QSBpcyBlbmFibGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uCi0gICAgICAgIC8vIChFZzpBeGlzMi54bWwsIHNlcnZpY2VzLnhtbCkKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG1zZ0NvbnRleHQuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9TV0EpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZVN3QU9iamVjdCA9IHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXMgb3ZlcnJpZGRlbiBwcm9ncmFtYXRpY2FsbHkuLgotICAgICAgICAvLyBQcmlvcml0eSBnaXZlbiB0byBwcm9ncmFtYXRpY2FsbHkgc2V0dGluZyBvZiB0aGUgdmFsdWUKLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfU1dBKTsKLSAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuYWJsZVN3QU9iamVjdCA9IHByb3BlcnR5OwotICAgICAgICB9Ci0gICAgICAgIGVuYWJsZVN3QSA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGVuYWJsZVN3QU9iamVjdCk7Ci0gICAgICAgIC8vIEhhbmRsZSB0aGUgb3B0aW9uYWwgdmFsdWUgZm9yIGVuYWJsZVN3QQotICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZm9yICdlbmFibGVTd0EnIGlzIGdpdmVuIGFzIG9wdGlvbmFsIGFuZCBpZiB0aGUgcmVxdWVzdAotICAgICAgICAvLyBtZXNzYWdlIHdhcyBhIFN3QSBtZXNzYWdlIHdlIHNlbnQgb3V0IFN3QQotICAgICAgICBpZiAoIWVuYWJsZVN3QSAmJiBtc2dDb250ZXh0LmlzRG9pbmdTd0EoKSAmJiAoZW5hYmxlU3dBT2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgaWYgKCgoU3RyaW5nKSBlbmFibGVTd0FPYmplY3QpLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLlZBTFVFX09QVElPTkFMKSkgewotICAgICAgICAgICAgICAgIGVuYWJsZVN3QSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuYWJsZVN3QTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2luZ1JFU1QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBib29sZWFuIGVuYWJsZVJFU1QgPSBmYWxzZTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGlzRG9pbmdSZXN0IGlzIGFscmVhZHkgdHJ1ZSBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIGlmIChtc2dDb250ZXh0LmlzRG9pbmdSRVNUKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgZW5hYmxlUkVTVFByb3BlcnR5ID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfUkVTVCk7Ci0gICAgICAgIGlmIChlbmFibGVSRVNUUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5hYmxlUkVTVCA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGVuYWJsZVJFU1RQcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nUkVTVChlbmFibGVSRVNUKTsKLQotICAgICAgICByZXR1cm4gZW5hYmxlUkVTVDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBxdWVyeSBDaGFyU2V0RW5jb2RpbmcuIEZpcnN0IGxvb2sgaW4gdGhlCi0gICAgICogTWVzc2FnZUNvbnRleHQuIElmIGl0J3Mgbm90IHRoZXJlIGxvb2sgaW4gdGhlIE9wQ29udGV4dC4gVXNlIHRoZSBkZWZ1YWx0LAotICAgICAqIGlmIGl0J3Mgbm90IGdpdmVuIGluIGVpdGhlciBjb250ZXh0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0IHRoZSBhY3RpdmUgTWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgQ2hhclNldEVuY29kaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhclNldEVuY29kaW5nKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmMgPSAoU3RyaW5nKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORyk7Ci0KLSAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGN0eCA9IG1zZ0NvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG9wY3R4ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFyU2V0RW5jID0gKFN0cmluZykgb3BjdHgKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBJZiB0aGUgY2hhciBzZXQgZW5jIGlzIHN0aWxsIG5vdCBmb3VuZCB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGNoYXJTZXRFbmMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNoYXJTZXRFbmMgPSBNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFyU2V0RW5jOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0FwcGxpY2F0aW9uWE1MRm9ybWF0dGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTExMmVhZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSTFRlbXBsYXRpbmdVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBGb3JtYXRlcyB0aGUgcmVxdWVzdCBtZXNzYWdlIGFzIGFwcGxpY2F0aW9uL3htbAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIgaW1wbGVtZW50cyBNZXNzYWdlRm9ybWF0dGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBcHBsaWNhdGlvblhNTEZvcm1hdHRlci5jbGFzcyk7Ci0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBnZXRCeXRlcyhtZXNzYWdlQ29udGV4dCwgZm9ybWF0LCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgYnl0ZXMgZm9yIHRoaXMgbWVzc2FnZQotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiBAcGFyYW0gcHJlc2VydmUgKGluZGljYXRlcyBpZiB0aGUgT00gc2hvdWxkIGJlIHByZXNlcnZlZCBvciBjb25zdW1lZCkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZXNlcnZlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RhcnQgZ2V0Qnl0ZXMoKSIpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGZhdWx0IGZsb3c9IiArIAotICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudDsKLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgY29ycmVjdCBlbGVtZW50IHRvIHNlcmlhbGl6ZS4gIE5vcm1hbGx5IGl0IGlzIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICAvLyBpbiB0aGUgYm9keS4gIEJ1dCBpZiB0aGlzIGlzIGEgZmF1bHQsIHVzZSB0aGUgZGV0YWlsIGVudHJ5IGVsZW1lbnQgb3IgdGhlIAotICAgICAgICAgICAgLy8gZmF1bHQgcmVhc29uLgotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldEZMT1coKSA9PSBNZXNzYWdlQ29udGV4dC5PVVRfRkFVTFRfRkxPVykgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0RGV0YWlsIHNvYXBGYXVsdERldGFpbCA9IGZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IHNvYXBGYXVsdERldGFpbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChvbUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBmYXVsdC5nZXRSZWFzb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTm9ybWFsIGNhc2U6IFRoZSB4bWwgcGF5bG9hZCBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYm9keS4KLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlc091dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VydmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemUoYnl0ZXNPdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShieXRlc091dCwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzT3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZW5kIGdldEJ5dGVzKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJzdGFydCB3cml0ZVRvKCkiKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cpIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGYXVsdCgpOwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdERldGFpbCBzb2FwRmF1bHREZXRhaWwgPSBmYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50ID0gc29hcEZhdWx0RGV0YWlsLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob21FbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb21FbGVtZW50ID0gZmF1bHQuZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9tRWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKG91dHB1dFN0cmVhbSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgd3JpdGVUbygpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbikgewotCi0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlOwotICAgICAgICBjb250ZW50VHlwZSA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSk7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNvbnRlbnRUeXBlIHNldCBmcm9tIG1lc3NhZ2VDb250ZXh0ID0iICsgY29udGVudFR5cGUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIoTk9URSkgY29udGVudFR5cGUgZnJvbSBmb3JtYXQgaXM9IiArIGZvcm1hdC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDsKLSAgICAgICAgfSBlbHNlIGlmIChpc1NPQVBDb250ZW50VHlwZShjb250ZW50VHlwZSkpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTDsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgaXMgc2V0IGluY29ycmVjdGx5IGZvciBBcHBsaWNhdGlvbiBYTUwuIik7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJJdCBpcyBjaGFuZ2VkIHRvICIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgcmV0dXJuZWQgPSIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0VGFyZ2V0QWRkcmVzcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB0YXJnZXRVUkwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhCi0gICAgICAgIC8vIHZhbHVlcyBhbmQgY3JlYXRlIGEgbmV3IHRhcmdldCBVUkwuCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRhcmdldFVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdFNPQVBBY3Rpb24oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NPQVBDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgaWYgKEphdmFVdGlscy5pbmRleE9mSWdub3JlQ2FzZShjb250ZW50VHlwZSwgU09BUDEyQ29uc3RhbnRzLlNPQVBfMTJfQ09OVEVOVF9UWVBFKSA+IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBzZWFyY2ggZm9yICJ0eXBlPXRleHQveG1sIgotICAgICAgICBlbHNlIGlmIChKYXZhVXRpbHMuaW5kZXhPZklnbm9yZUNhc2UoY29udGVudFR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfMTFfQ09OVEVOVF9UWVBFKSA+IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmQ5YjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBIVFRQIHByb3RvY29sIGFuZCBtZXNzYWdlIGNvbnRleHQgY29uc3RhbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSFRUUENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0NPTlRFTlRfVFlQRSA9ICJIVFRQX0NPTlRFTlRfVFlQRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfVkVSU0lPTiA9ICJQUk9UT0NPTCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRV9YX1dXV19GT1JNID0KLSAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfVEVYVF9YTUwgPSAidGV4dC94bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfTVVMVElQQVJUX1JFTEFURUQgPSAibXVsdGlwYXJ0L3JlbGF0ZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfTVVMVElQQVJUX0ZPUk1fREFUQSA9ICJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTCA9ICJhcHBsaWNhdGlvbi94bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfQVBQTElDQVRJT05fU09BUF9YTUwgPSAiYXBwbGljYXRpb24vc29hcCt4bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfQVBQTElDQVRJT05fRUNIT19YTUwgPSAiYXBwbGljYXRpb24vZWNobyt4bWwiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUkVRVUVTVF9VUkkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1VSSSA9ICJSRVFVRVNUX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBSRVNQT05TRV9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQ09ERSA9ICJSRVNQT05TRV9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFJFU1BPTlNFX1dPUkQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9XT1JEID0gIlJFU1BPTlNFX1dPUkQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUkVTUE9OU0VfQUNLX0NPREVfVkFMCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQUNLX0NPREVfVkFMID0gIjIwMiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBTT0NLRVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0NLRVQgPSAiU09DS0VUIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFJFU1BPTlNFX0hFQURFUlMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9IRUFERVJTID0gIkhUVFAtUmVzcG9uc2UtSGVhZGVycyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBSRVFVRVNUX0hFQURFUlMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUlMgPSAiSFRUUC1SZXF1ZXN0LUhlYWRlcnMiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX1dSSVRFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9XUklURVIgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLndyaXRlciI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQTFVHSU5fU0VSVklDRV9OQU1FCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1NFUlZJQ0VfTkFNRSA9ICJ0cmFuc3BvcnQuaHR0cC5wbHVnaW4uc2VydmljZU5hbWUiOwotCi0gICAgLyoqCi0gICAgICogQVhJUyBzZXJ2bGV0IHBsdWdpbiBwYXJhbWV0ZXIgbmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX05BTUUgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLnBsdWdpbk5hbWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX0xPRwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9MT0cgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLmxvZyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBQTFVHSU5fSVNfREVWRUxPUE1FTlQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSVNfREVWRUxPUE1FTlQgPSAidHJhbnNwb3J0Lmh0dHAucGx1Z2luLmlzRGV2ZWxvcG1lbnQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX0VYQ0VQVElPTl9MT0cKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRVhDRVBUSU9OX0xPRyA9ICJ0cmFuc3BvcnQuaHR0cC5wbHVnaW4uZXhjZXB0aW9uTG9nIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIFBMVUdJTl9FTkdJTkUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRU5HSU5FID0gInRyYW5zcG9ydC5odHRwLnBsdWdpbi5lbmdpbmUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgUExVR0lOX0VOQUJMRV9MSVNUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0VOQUJMRV9MSVNUID0gInRyYW5zcG9ydC5odHRwLnBsdWdpbi5lbmFibGVMaXN0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE9LW10KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT0tbXSA9ICgiMjAwIE9LIikudG9DaGFyQXJyYXkoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE5PQ09OVEVOVFtdCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE5PQ09OVEVOVFtdID0gKCIyMDIgT0tcblxuIikuZ2V0Qnl0ZXMoKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIE1DX0hUVFBfU1RBVFVTX01FU1NBR0UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQ19IVFRQX1NUQVRVU19NRVNTQUdFID0gInRyYW5zcG9ydC5odHRwLnN0YXR1c01lc3NhZ2UiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgTUNfSFRUUF9TVEFUVVNfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU1RBVFVTX0NPREUgPSAidHJhbnNwb3J0Lmh0dHAuc3RhdHVzQ29kZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRSRVNQT05TRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU0VSVkxFVFJFU1BPTlNFID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRSZXNwb25zZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRSRVFVRVNUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCA9ICJ0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0UmVxdWVzdCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRQQVRISU5GTwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU0VSVkxFVFBBVEhJTkZPID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRQYXRoSW5mbyI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRMT0NBVElPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1DX0hUVFBfU0VSVkxFVExPQ0FUSU9OID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRMb2NhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQ19IVFRQX1NFUlZMRVQgPSAidHJhbnNwb3J0Lmh0dHAuc2VydmxldCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBNQ19IVFRQX1NFUlZMRVRDT05URVhUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUNfSFRUUF9TRVJWTEVUQ09OVEVYVCA9ICJ0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0Q29udGV4dCI7Ci0KLSAgICAvKioKLSAgICAgKiB0cmFuc3BvcnQuaHR0cC5zZXJ2bGV0Q29uZmlnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSFRUUF9TRVJWTEVUQ09ORklHID0gInRyYW5zcG9ydC5odHRwLnNlcnZsZXRDb25maWciOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1VTRVJfQUdFTlQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVVNFUl9BR0VOVCA9ICJVc2VyLUFnZW50IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9UUkFOU0ZFUl9FTkNPRElOR19DSFVOS0VECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRUQgPSAiY2h1bmtlZCIuaW50ZXJuKCk7Ci0KLSAgICAvKiBodHRwIDEuMSAqLwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HID0gIlRyYW5zZmVyLUVuY29kaW5nIi5pbnRlcm4oKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9TT0FQX0FDVElPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TT0FQX0FDVElPTiA9ICJTT0FQQWN0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9TRVRfQ09PS0lFMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVRfQ09PS0lFMiA9ICJTZXQtQ29va2llMiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfU0VUX0NPT0tJRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVRfQ09PS0lFID0gIlNldC1Db29raWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1BST1hZX0FVVEhPUklaQVRJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfQVVUSE9SSVpBVElPTiA9ICJQcm94eS1BdXRob3JpemF0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9QUk9UT0NPTF9WMTEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPVE9DT0xfVjExID0gIjEuMSIuaW50ZXJuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfUFJPVE9DT0xfVjEwCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MX1YxMCA9ICIxLjAiLmludGVybigpOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1BST1RPQ09MXzExCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MXzExID0gIkhUVFAvMS4xIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9QUk9UT0NPTF8xMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9UT0NPTF8xMCA9ICJIVFRQLzEuMCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfUFJBR01BCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BSQUdNQSA9ICJQcmFnbWEiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX1BPU1QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUE9TVCA9ICJQT1NUIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9QVVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFVUID0gIlBVVCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfTE9DQVRJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTE9DQVRJT04gPSAiTG9jYXRpb24iOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0hPU1QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSE9TVCA9ICJIb3N0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9HRVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfR0VUID0gIkdFVCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfREVMRVRFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RFTEVURSA9ICJERUxFVEUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0VYUEVDVF8xMDBfQ29udGludWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhQRUNUXzEwMF9Db250aW51ZSA9ICIxMDAtY29udGludWUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0VYUEVDVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FWFBFQ1QgPSAiRXhwZWN0IjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9ERUZBVUxUX0NIQVJfRU5DT0RJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfREVGQVVMVF9DSEFSX0VOQ09ESU5HID0gImlzby04ODU5LTEiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0NPT0tJRTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09PS0lFMiA9ICJDb29raWUyIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT09LSUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09PS0lFID0gIkNvb2tpZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OVEVOVF9UWVBFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfVFlQRSA9ICJDb250ZW50LVR5cGUiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORyA9ICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT05URU5UX0xPQ0FUSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTE9DQVRJT04gPSAiQ29udGVudC1Mb2NhdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OVEVOVF9MRU5HVEgKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MRU5HVEggPSAiQ29udGVudC1MZW5ndGgiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0NPTlRFTlRfSUQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9JRCA9ICJDb250ZW50LUlkIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT05URU5UX0RFU0NSSVBUSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfREVTQ1JJUFRJT04gPSAiQ29udGVudC1EZXNjcmlwdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OTkVDVElPTl9LRUVQQUxJVkUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OTkVDVElPTl9LRUVQQUxJVkUgPSAiS2VlcC1BbGl2ZSIuaW50ZXJuKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ09OTkVDVElPTl9DTE9TRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05ORUNUSU9OX0NMT1NFID0gImNsb3NlIi5pbnRlcm4oKTsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9DT05ORUNUSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTk5FQ1RJT04gPSAiQ29ubmVjdGlvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ0FDSEVfQ09OVFJPTF9OT0NBQ0hFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NBQ0hFX0NPTlRST0xfTk9DQUNIRSA9ICJuby1jYWNoZSI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQ0FDSEVfQ09OVFJPTAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DQUNIRV9DT05UUk9MID0gIkNhY2hlLUNvbnRyb2wiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSEVBREVSX0FVVEhPUklaQVRJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVVUSE9SSVpBVElPTiA9ICJBdXRob3JpemF0aW9uIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9BQ0NFUFRfVEVYVF9BTEwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX1RFWFRfQUxMID0gInRleHQvKiI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQUNDRVBUX01VTFRJUEFSVF9SRUxBVEVECi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9NVUxUSVBBUlRfUkVMQVRFRCA9ICJtdWx0aXBhcnQvcmVsYXRlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIRUFERVJfQUNDRVBUX0FQUExfU09BUAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfQVBQTF9TT0FQID0gImFwcGxpY2F0aW9uL3NvYXAreG1sIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9BQ0NFUFRfQVBQTElDQVRJT05fRElNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfQVBQTElDQVRJT05fRElNRSA9ICJhcHBsaWNhdGlvbi9kaW1lIjsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIEhFQURFUl9BQ0NFUFQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUID0gIkFjY2VwdCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBDSEFSX1NFVF9FTkNPRElORwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQVJfU0VUX0VOQ09ESU5HID0gImNoYXJzZXQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgVU5BVVRIW10KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgVU5BVVRIW10gPSAoIjQwMSBVbmF1dGhvcml6ZWQiKS5nZXRCeXRlcygpOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgU09fVElNRU9VVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPX1RJTUVPVVQgPSAiU09fVElNRU9VVCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBTRU5ERVJbXQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRU5ERVJbXSA9ICI0MDAiLmdldEJ5dGVzKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFkgPSAiUFJPWFkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhFTlRJQ0FURSA9ICJfTlRMTV9ESUdFU1RfQkFTSUNfQVVUSEVOVElDQVRJT05fIjsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRPTV9SRUNFSVZFRF9DT05URU5UX1RZUEUgPSAiTVRPTV9SRUNFSVZFRCI7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBJU0VbXQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBJU0VbXSA9ICgiNTAwIEludGVybmFsIHNlcnZlciBlcnJvciIpLmdldEJ5dGVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBIVFRQX1JFUV9UWVBFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVFfVFlQRSA9ICJIVFRQX1JFUV9UWVBFIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29udGVudCBlbmNvZGluZyBjaGF0c2V0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9FTEVNRU5UX0NIQVJTRVQgPSAiVVMtQVNDSUkiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSFRUUFtdCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjaGFyIEhUVFBbXSA9ICJIVFRQLzEuMCAiLnRvQ2hhckFycmF5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBERUZBVUxUX1NPX1RJTUVPVVQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NPX1RJTUVPVVQgPSA2MDAwMDsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIERFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX1RJTUVPVVQgPSA2MDAwMDsKLQotICAgIC8qKgotICAgICAqIEZpZWxkIENPTk5FQ1RJT05fVElNRU9VVAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fVElNRU9VVCA9ICJDT05ORUNUSU9OX1RJTUVPVVQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ0FDSEVEX0hUVFBfQ0xJRU5UCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVEX0hUVFBfQ0xJRU5UID0gIkNBQ0hFRF9IVFRQX0NMSUVOVCI7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIE1VTFRJVEhSRUFEX0hUVFBfQ09OTkVDVElPTl9NQU5BR0VSCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVUVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIgPSAiTVVUVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIgPSAiTVVMVElUSFJFQURfSFRUUF9DT05ORUNUSU9OX01BTkFHRVIiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgQ0FDSEVEX0hUVFBfQ0xJRU5UCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0VfSFRUUF9DTElFTlQgPSAiUkVVU0VfSFRUUF9DTElFTlQiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgSFRUUF9NRVRIT0QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRCA9ICJIVFRQX01FVEhPRF9PQkpFQ1QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9FTkNPRElORyA9ICJBY2NlcHQtRW5jb2RpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0VOQ09ESU5HID0gIkNvbnRlbnQtRW5jb2RpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0VOQ09ESU5HX0xPV0VSQ0FTRSA9Ci0gICAgICAgICAgICBIRUFERVJfQ09OVEVOVF9FTkNPRElORy50b0xvd2VyQ2FzZSgpOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU0lPTl9HWklQID0gImd6aXAiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgdG8gc2V0IHRoZSBjb29ja2llIHBvbGljeSBvZiBjb21tb25zIGh0dHAgY2xpZW50Ci0gICAgICogaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9odHRwY29tcG9uZW50cy9odHRwY2xpZW50LTMueC9jb29raWVzLmh0bWwKLSAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PS0lFX1BPTElDWSA9ICJDT09LSUVfUE9MSUNZIjsKLQotICAgIC8qKgotICAgICAqIElmIHlvdSB3YW50IHRoZSBIVFRQIHNlbmRlciB0byBpbmRpY2F0ZSB0aGF0IGl0IGNhbiBhY2NlcHQgYSBnemlwZWQKLSAgICAgKiByZXNwb25zZSwgc2V0IHRoaXMgbWVzc2FnZSBjb250ZXh0IHByb3BlcnR5IHRvIHRydWUuIFRoZSBzZW5kZXIgd2lsbAotICAgICAqIGF1dG9tYXRpY2FsbHkgdW56aXAgdGhlIHJlc3BvbnNlIGlmIGl0cyBnemlwcGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1DX0FDQ0VQVF9HWklQID0gInRyYW5zcG9ydC5odHRwLmFjY2VwdEd6aXAiOwotCi0gICAgLyoqCi0gICAgICogYnkgZGVmYXVsdCB0aGUgSFRUUCByZXF1ZXN0IGJvZHkgaXMgbm90IGNvbXByZXNzZWQuIHNldCB0aGlzIG1lc3NhZ2UKLSAgICAgKiBjb250ZXh0IHByb3BlcnR5IHRvIHRydWUgdG8gaGF2ZSB0aGUgcmVxdWVzdCBib2R5IGd6aXAgY29tcHJlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ19HWklQX1JFUVVFU1QgPSAidHJhbnNwb3J0Lmh0dHAuZ3ppcFJlcXVlc3QiOwotCi0gICAgLyogYnkgZGVmYXVsdCB0aGUgSFRUUCByZXNwb25zZSBib2R5IGlzIG5vdCBjb21wcmVzc2VkLiBzZXQgdGhpcyBtZXNzYWdlCi0gICAgKiBjb250ZXh0IHByb3BlcnR5IHRvIHRydWUgdG8gaGF2ZSB0aGUgcmVzcG9uc2UgYm9keSBnemlwIGNvbXByZXNzZWQuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQ19HWklQX1JFU1BPTlNFID0gImd6aXBSZXNwb25zZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gc2V0IGFueSBjdXN0b20gaGVhZGVycyB0byB0aGUgbWVzc2FnZSBjb250ZXh0LCB3aGljaCB3aWxsIGJlIHBpY2tlZAotICAgICAqIHVwIGJ5IHRoZSBzZW5kZXIgd2hpbGUgc2VuZGluZyB0aGUgcmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSUyA9ICJIVFRQX0hFQURFUlMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRUQgPSAiX19DSFVOS0VEX18iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0xfVkVSU0lPTiA9ICJfX0hUVFBfUFJPVE9DT0xfVkVSU0lPTl9fIjsKLSAgICAvL3RvIHNldCBhbmQgZ2V0IHRoZSBwcm9wZXJ0eSBmcm9tIHNlcnZpY2UgY29udGV4dAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPT0tJRV9TVFJJTkcgPSAiQ29va2llIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9HRVQgPSAiR0VUIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX01FVEhPRF9QT1NUID0gIlBPU1QiOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfU09BUF8xMl9BQ1RJT04gPSAiT21pdFNPQVAxMkFjdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1BST1RPQ09MX0hBTkRMRVIgPSAiQ1VTVE9NX1BST1RPQ09MX0hBTkRMRVIiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EX1BBUkFNUyA9ICJIVFRQX01FVEhPRF9QQVJBTVMiOwotCi0gICAgLyoKLSAgICAgKiBBdXRvbWF0aWNhbGx5IHJlbGVhc2UgY29ubmVjdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19SRUxFQVNFX0NPTk5FQ1RJT04gPSAiQXV0b1JlbGVhc2VDb25uZWN0aW9uIiA7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0Qnl0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YQotICAgICAqIEByZXR1cm4gUmV0dXJucyBieXRlW10uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXMoZmluYWwgU3RyaW5nIGRhdGEpIHsKLSAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyYW1ldGVyIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBkYXRhLmdldEJ5dGVzKEhUVFBfRUxFTUVOVF9DSEFSU0VUKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGF0YS5nZXRCeXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQUdFTlQgPSAidXNlckFnZW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVIgPSAic2VydmVyIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL011bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZGExZDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL011bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5Db21wbGV4UGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwuVVJMVGVtcGxhdGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLm11bHRpcGFydC5TdHJpbmdQYXJ0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRm9ybWF0ZXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyBtdWx0aXBhcnQvZm9ybS1kYXRhLiBBbiBleGFtcGxlIG9mIHRoaXMgc2VyaWFsaXphdGlvbiBpcyBzaG93bgotICogYmVsb3cgd2hpY2ggd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBXZWIgU2VydmljZXMgRGVzY3JpcHRpb24gTGFuZ3VhZ2UgKFdTREwpIFZlcnNpb24gMi4wIFBhcnQgMjogQWRqdW5jdHMKLSAqIDxwLz4KLSAqIFRoZSBmb2xsb3dpbmcgaW5zdGFuY2UgZGF0YSBvZiBhbiBpbnB1dCBtZXNzYWdlOgotICogPHAvPgotICogPGRhdGE+Ci0gKiA8dG93bj4KLSAqIDxuYW1lPkZyw6lqdXM8L25hbWU+Ci0gKiA8Y291bnRyeT5GcmFuY2U8L2NvdW50cnk+Ci0gKiA8L3Rvd24+Ci0gKiA8ZGF0ZT5AQEBALUBALUBAPC9kYXRlPgotICogPC9kYXRhPgotICogPHAvPgotICogd2l0aCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBlbGVtZW50Ci0gKiA8cC8+Ci0gKiA8b3BlcmF0aW9uIHJlZj0ndDpkYXRhJwotICogd2h0dHA6bG9jYXRpb249J3RlbXBlcmF0dXJlJwotICogd2h0dHA6bWV0aG9kPSdQT1NUJwotICogd2h0dHA6aW5wdXRTZXJpYWxpemF0aW9uPSdtdWx0aXBhcnQvZm9ybS1kYXRhJy8+Ci0gKiA8cC8+Ci0gKiB3aWxsIHNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhcyBmb2xsb3c6Ci0gKiA8cC8+Ci0gKiBDb250ZW50LVR5cGU6IG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PUFhQjAzeAotICogQ29udGVudC1MZW5ndGg6IHh4eAotICogPHAvPgotICogLS1BYUIwM3gKLSAqIENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0idG93biIKLSAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veG1sCi0gKiA8cC8+Ci0gKiA8dG93bj4KLSAqIDxuYW1lPkZyw6lqdXM8L25hbWU+Ci0gKiA8Y291bnRyeT5GcmFuY2U8L2NvdW50cnk+Ci0gKiA8L3Rvd24+Ci0gKiAtLUFhQjAzeAotICogQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJkYXRlIgotICogQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Ci0gKgotICogQEBAQC1AQC1AQCAtLUFhQjAzeC0tCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIGJ5dGUgYXJyYXkgb2YgdGhlIG1lc3NhZ2UgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgKiAgICAgICAgIG1lc3NhZ2UgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICAgIFBhcnRbXSBwYXJ0cyA9IGNyZWF0ZU11bHRpcGF0Rm9ybURhdGFSZXF1ZXN0KG9tRWxlbWVudCk7Ci0gICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZXNPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhY2Nlc3NpbmcgYSBjbGFzcyBvZiBDb21tb25zLUZsaWVVcGxvYWQKLSAgICAgICAgICAgICAgICBQYXJ0LnNlbmRQYXJ0cyhieXRlc091dCwgcGFydHMsIGZvcm1hdC5nZXRNaW1lQm91bmRhcnkoKS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzT3V0LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07ICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRvIHN1cHBvcnQgZGVmZmVyZWQgd3JpdGluZyB0cmFuc3BvcnRzIGFzIGluIGh0dHAgY2h1bmtpbmcuLiBBeGlzMiB3YXMKLSAgICAgKiBkb2luZyB0aGlzIGZvciBzb21lIHRpbWUuLgotICAgICAqIDxwLz4KLSAgICAgKiBQcmVzZXJ2ZSBmbGFnIGNhbiBiZSB1c2VkIHRvIHByZXNlcnZlIHRoZSBlbnZlbG9wZSBmb3IgbGF0ZXIgdXNlLiBUaGlzIGlzCi0gICAgICogdXNlZnVsbCB3aGVuIGltcGxlbWVudGluZyBhdXRoZW50aWNhdGlvbiBtYWNobmlzbXMgbGlrZSBOVExNLgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dFN0cmVhbQotICAgICAqIEBwYXJhbSBwcmVzZXJ2ZSAgICAgOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgZG8gbm90IGNvbnN1bWUgdGhlIE9NIHdoZW4gdGhpcyBpcyBzZXQuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYiA9IGdldEJ5dGVzKG1lc3NhZ2VDb250ZXh0LCBmb3JtYXQpOwotCi0gICAgICAgICAgICBpZiAoYiAhPSBudWxsICYmIGIubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgd3JpdGluZyB0aGUgcmVxdWVzdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlmZmVyZW50IG1lc3NhZ2UgZm9ybWF0cyBjYW4gc2V0IHRoZWlyIG93biBjb250ZW50IHR5cGVzCi0gICAgICogRWc6IEpTT05Gb3JtYXR0ZXIgY2FuIHNldCB0aGUgY29udGVudCB0eXBlIGFzIGFwcGxpY2F0aW9uL2pzb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBmb3JtYXQKLSAgICAgKiBAcGFyYW0gc29hcEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX01VTFRJUEFSVF9GT1JNX0RBVEE7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGZvcm1hdC5nZXRDaGFyU2V0RW5jb2RpbmcoKTsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlICs9ICI7IGNoYXJzZXQ9IiArIGVuY29kaW5nOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgKyAiOyAiICsgImJvdW5kYXJ5PSIgKyBmb3JtYXQuZ2V0TWltZUJvdW5kYXJ5KCk7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTb21lIG1lc3NhZ2UgZm9ybWF0cyBtYXkgd2FudCB0byBhbHRlciB0aGUgdGFyZ2V0IHVybC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHRhcmdldCBVUkwKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMIGdldFRhcmdldEFkZHJlc3MoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwgVVJMIHRhcmdldFVSTCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhCi0gICAgICAgIC8vIHZhbHVlcyBhbmQgY3JlYXRlIGEgbmV3IHRhcmdldCBVUkwuCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCBmYWxzZSk7Ci0KLSAgICAgICAgcmV0dXJuIHRhcmdldFVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoaXMgb25seSBpZiB5b3Ugd2FudCBzZXQgYSB0cmFuc3BvcnQgaGVhZGVyIGZvciBTT0FQIEFjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICByZXR1cm4gc29hcEFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZGF0YU91dAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhcnRbXSBjcmVhdGVNdWx0aXBhdEZvcm1EYXRhUmVxdWVzdChPTUVsZW1lbnQgZGF0YU91dCkgewotICAgICAgICBBcnJheUxpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChkYXRhT3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIxID0gZGF0YU91dC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcjEuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpIGl0ZXIxLm5leHQoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyMiA9IGVsZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgZWxlbWVudCBpcyBhIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgICAgIGlmIChpdGVyMi5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChlbGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIG9tRWxlbWVudC5hZGRDaGlsZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcGxleFR5cGUob21FbGVtZW50LCBlbGUuZ2V0Q2hpbGRFbGVtZW50cygpLCBvbUZhY3RvcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkKG5ldyBDb21wbGV4UGFydChlbGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgb21FbGVtZW50LnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQobmV3IFN0cmluZ1BhcnQoZWxlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIGVsZS5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUGFydFtdIHBhcnRzQXJyYXkgPSBuZXcgUGFydFtwYXJ0cy5zaXplKCldOwotICAgICAgICByZXR1cm4gKFBhcnRbXSkgcGFydHMudG9BcnJheShwYXJ0c0FycmF5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogQHBhcmFtIGl0ZXIKLSAgICAgKiBAcGFyYW0gb21GYWN0b3J5Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgT01FbGVtZW50IHByb2Nlc3NDb21wbGV4VHlwZShPTUVsZW1lbnQgcGFyZW50LCBJdGVyYXRvciBpdGVyLCBPTUZhY3Rvcnkgb21GYWN0b3J5KSB7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGVsZSA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgb21FbGVtZW50ID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChlbGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgbnVsbCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyMiA9IGVsZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoaXRlcjIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50LmFkZENoaWxkKHByb2Nlc3NDb21wbGV4VHlwZShvbUVsZW1lbnQsIGVsZS5nZXRDaGlsZEVsZW1lbnRzKCksIG9tRmFjdG9yeSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGVsZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBvbUVsZW1lbnQuc2V0VGV4dChlbGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQob21FbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb21FbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TT0FQTWVzc2FnZUZvcm1hdHRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NPQVBNZXNzYWdlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjhkZTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NPQVBNZXNzYWdlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTUlNRU91dHB1dFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5VUkxUZW1wbGF0aW5nVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNPQVBNZXNzYWdlRm9ybWF0dGVyLmNsYXNzKTsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RhcnQgd3JpdGVUbygpIik7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgcHJlc2VydmU9IiArIHByZXNlcnZlKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpc09wdGltaXplZD0iICsgZm9ybWF0LmlzT3B0aW1pemVkKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlzRG9pbmdTV0E9IiArIGZvcm1hdC5pc0RvaW5nU1dBKCkpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbXNnQ3R4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAKLSAgICAgICAgaW50IG9wdGltaXplZFRocmVzaG9sZCA9IFV0aWxzLmdldE10b21UaHJlc2hvbGQobXNnQ3R4dCk7ICAgICAgIAotICAgICAgICBpZihvcHRpbWl6ZWRUaHJlc2hvbGQgPiAwKXsKLSAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgCQlsb2cuZGVidWcoIlNldHRpbmcgTVRPTSBvcHRpbWl6ZWQgVGhyZXNob2xkIFZhbHVlIG9uIE9NT3V0cHV0Rm9ybWF0Iik7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlmb3JtYXQuc2V0T3B0aW1pemVkVGhyZXNob2xkKG9wdGltaXplZFRocmVzaG9sZCk7Ci0gICAgICAgIH0JICAgICAgICAKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCEoZm9ybWF0LmlzT3B0aW1pemVkKCkpICYgZm9ybWF0LmlzRG9pbmdTV0EoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1dyaXRlciBidWZmZXJlZFNPQVBCb2R5ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgIGlmIChwcmVzZXJ2ZSkgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZShidWZmZXJlZFNPQVBCb2R5LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShidWZmZXJlZFNPQVBCb2R5LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3cml0ZVN3QU1lc3NhZ2UobXNnQ3R4dCwgYnVmZmVyZWRTT0FQQm9keSwgb3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlc2VydmUpIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemUob3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShvdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZW5kIHdyaXRlVG8oKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInN0YXJ0IGdldEJ5dGVzKCkiKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiICBpc09wdGltaXplZD0iICsgZm9ybWF0LmlzT3B0aW1pemVkKCkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgIGlzRG9pbmdTV0E9IiArIGZvcm1hdC5pc0RvaW5nU1dBKCkpOwotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbXNnQ3R4dC5nZXRFbnZlbG9wZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzT3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKCFmb3JtYXQuaXNPcHRpbWl6ZWQoKSkgewotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuaXNEb2luZ1NXQSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdoeSBhcmUgd2UgY3JlYXRpbmcgYSBuZXcgT01PdXRwdXRGb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0MiA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICAgICAgICAgICAgICBmb3JtYXQyLnNldENoYXJTZXRFbmNvZGluZyhmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgYnVmZmVyZWRTT0FQQm9keSA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ1ZmZlcmVkU09BUEJvZHksIGZvcm1hdDIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZVN3QU1lc3NhZ2UobXNnQ3R4dCwgYnVmZmVyZWRTT0FQQm9keSwgYnl0ZXNPdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ5dGVzT3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNPdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXJpYWxpemVBbmRDb25zdW1lKGJ5dGVzT3V0LCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc091dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgZ2V0Qnl0ZXMoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgewotICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCk7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGZvcm1hdC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgZnJvbSB0aGUgT01PdXRwdXRGb3JtYXQgPSIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsICYmIGNvbnRlbnRUeXBlICE9IG51bGwgJiYKLSAgICAgICAgCQljb250ZW50VHlwZS5pbmRleE9mKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9NVUxUSVBBUlRfUkVMQVRFRCk9PS0xKSB7Ci0gICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWN0aW9uIGhlYWRlciBpcyBub3QgbWFuZGF0ZWQgaW4gU09BUCAxLjIuIFNvIHB1dHRpbmcgaXQsIGlmCi0gICAgICAgIC8vIGF2YWlsYWJsZQotICAgICAgICBpZiAoIW1zZ0N0eHQuaXNTT0FQMTEoKSAmJiAoc29hcEFjdGlvblN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmICEiIi5lcXVhbHMoc29hcEFjdGlvblN0cmluZy50cmltKCkpCi0gICAgICAgICAgICAgICAgJiYgISJcIlwiIi5lcXVhbHMoc29hcEFjdGlvblN0cmluZy50cmltKCkpKSB7Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlICsgIjsgYWN0aW9uPVwiIiArIHNvYXBBY3Rpb25TdHJpbmcrICJcIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgaXMgYSBxdWljayBzYWZldHkgY2F0Y2guICBQcmlvciB2ZXJzaW9ucyBvZiBTT0FQRm9ybWF0dGVyCi0gICAgICAgIC8vIHBsYWNlZCBhICc7JyBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50LXR5cGUuICBNYW55IHZlbmRvcnMgaWdub3JlIHRoaXMKLSAgICAgICAgLy8gbGFzdCAnOycuICBIb3dldmVyIGl0IGlzIG5vdCBsZWdhbCBhbmQgc29tZSB2ZW5kb3JzIHJlcG9ydCBhbiBlcnJvci4KLSAgICAgICAgLy8gVG8gaW5jcmVhc2UgaW50ZXJvcGVyYWJpbGl0eSwgdGhlICc7JyBpcyBzdHJpcHBlZCBvZmYuCi0gICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUudHJpbSgpOwotICAgICAgICBpZiAoY29udGVudFR5cGUubGFzdEluZGV4T2YoIjsiKSA9PSAoY29udGVudFR5cGUubGVuZ3RoKCktMSkpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3Vic3RyaW5nKDAsIGNvbnRlbnRUeXBlLmxlbmd0aCgpLTEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29udGVudFR5cGUgcmV0dXJuZWQgPSIgKyBjb250ZW50VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtc2dDdHh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKSB7Ci0gICAgICAgIC8vIGlmIFNPQVAgMS4yIHdlIGF0dGFjaCB0aGUgc29hcCBhY3Rpb24gdG8gdGhlIGNvbnRlbnQtdHlwZQotICAgICAgICAvLyBObyBuZWVkIHRvIHNldCBpdCBhcyBhIGhlYWRlci4KLSAgICAgICAgaWYgKG1zZ0N0eHQuaXNTT0FQMTEoKSkgewotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhzb2FwQWN0aW9uU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiXCJcIiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChzb2FwQWN0aW9uU3RyaW5nICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFzb2FwQWN0aW9uU3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU09BUEFjdGlvbiBzdHJpbmcgbXVzdCBiZSBhIHF1b3RlZCBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgc29hcEFjdGlvblN0cmluZyA9ICJcIiIgKyBzb2FwQWN0aW9uU3RyaW5nICsgIlwiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb25TdHJpbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHRhcmdldFVSTCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHRlbXBsYXRlIGluIHRoZSBVUkwsIGlmIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSB0aGVuIHdpdGggZGF0YQotICAgICAgICAvLyB2YWx1ZXMgYW5kIGNyZWF0ZSBhIG5ldyB0YXJnZXQgVVJMLgotICAgICAgICB0YXJnZXRVUkwgPSBVUkxUZW1wbGF0aW5nVXRpbC5nZXRUZW1wbGF0ZWRVUkwodGFyZ2V0VVJMLCBtc2dDdHh0LCBmYWxzZSk7Ci0gICAgICAgIHJldHVybiB0YXJnZXRVUkw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlU3dBTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDdHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGJ1ZmZlcmVkU09BUEJvZHksIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInN0YXJ0IHdyaXRlU3dBTWVzc2FnZSgpIik7Ci0gICAgICAgIH0KLSAgICAgICAgT2JqZWN0IHByb3BlcnR5ID0gbXNnQ3R4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NTTdfQ09NUEFUSUJMRSk7Ci0gICAgICAgIGJvb2xlYW4gTU03Q29tcGF0TW9kZSA9IGZhbHNlOwotICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgTU03Q29tcGF0TW9kZSA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU1NN0NvbXBhdE1vZGUpIHsKLSAgICAgICAgICAgIE1JTUVPdXRwdXRVdGlscy53cml0ZVNPQVBXaXRoQXR0YWNobWVudHNNZXNzYWdlKGJ1ZmZlcmVkU09BUEJvZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDdHh0LmdldEF0dGFjaG1lbnRNYXAoKSwgZm9ybWF0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBpbm5lckJvdW5kYXJ5OwotICAgICAgICAgICAgU3RyaW5nIHBhcnRDSUQ7Ci0gICAgICAgICAgICBPYmplY3QgaW5uZXJCb3VuZGFyeVByb3BlcnR5ID0gbXNnQ3R4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTU03X0lOTkVSX0JPVU5EQVJZKTsKLSAgICAgICAgICAgIGlmIChpbm5lckJvdW5kYXJ5UHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlubmVyQm91bmRhcnkgPSAoU3RyaW5nKSBpbm5lckJvdW5kYXJ5UHJvcGVydHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlubmVyQm91bmRhcnkgPSAiaW5uZXJCb3VuZGFyeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgVVVJREdlbmVyYXRvci5nZXRVVUlEKCkucmVwbGFjZSgnOicsICdfJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPYmplY3QgcGFydENJRFByb3BlcnR5ID0gbXNnQ3R4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTU03X1BBUlRfQ0lEKTsKLSAgICAgICAgICAgIGlmIChwYXJ0Q0lEUHJvcGVydHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcnRDSUQgPSAoU3RyaW5nKSBwYXJ0Q0lEUHJvcGVydHk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhcnRDSUQgPSAiaW5uZXJDSUQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpLnJlcGxhY2UoJzonLCAnXycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTUlNRU91dHB1dFV0aWxzLndyaXRlTU03TWVzc2FnZShidWZmZXJlZFNPQVBCb2R5LCBvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0N0eHQuZ2V0QXR0YWNobWVudE1hcCgpLCBmb3JtYXQsIHBhcnRDSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQm91bmRhcnkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJlbmQgd3JpdGVTd0FNZXNzYWdlKCkiKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1hGb3JtVVJMRW5jb2RlZEZvcm1hdHRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1hGb3JtVVJMRW5jb2RlZEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk2ZjkxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSTFRlbXBsYXRpbmdVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogRm9ybWF0ZXMgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKLSAqLwotcHVibGljIGNsYXNzIFhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VGb3JtYXR0ZXIgewotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlcyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG9tRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IG9tRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYVN0cmluZyA9ICIiOwotCi0gICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZTEgPSAoT01FbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlcjsKLQotICAgICAgICAgICAgICAgIHBhcmFtZXRlciA9IGVsZTEuZ2V0TG9jYWxOYW1lKCkgKyAiPSIgKyBlbGUxLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBwYXJhU3RyaW5nID0gIiIuZXF1YWxzKHBhcmFTdHJpbmcpID8gcGFyYW1ldGVyIDogKHBhcmFTdHJpbmcgKyAiJiIgKyBwYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcGFyYVN0cmluZy5nZXRCeXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGJvb2xlYW4gcHJlc2VydmUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoZ2V0Qnl0ZXMobWVzc2FnZUNvbnRleHQsIGZvcm1hdCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHdyaXRpbmcgdGhlIHJlcXVlc3QiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uKSB7Ci0KLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfWF9XV1dfRk9STTsKLQotICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudFR5cGUgKz0gIjsgY2hhcnNldD0iICsgZW5jb2Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBzb2FwIGFjdGlvbiBpcyB0aGVyZSAoY2FuIGJlIHRoZXJlIGlzIHNvYXAgcmVzcG9uc2UgTUVQIGlzIHVzZWQpIGFkZCBpdC4KLSAgICAgICAgaWYgKChzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgISIiLmVxdWFscyhzb2FwQWN0aW9uLnRyaW0oKSkKLSAgICAgICAgICAgICAgICAmJiAhIlwiXCIiLmVxdWFscyhzb2FwQWN0aW9uLnRyaW0oKSkpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgKyAiO2FjdGlvbj1cIiIgKyBzb2FwQWN0aW9uICsgIlwiOyI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRUYXJnZXRBZGRyZXNzKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBPTU91dHB1dEZvcm1hdCBmb3JtYXQsIFVSTCB0YXJnZXRVUkwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgdGVtcGxhdGUgaW4gdGhlIFVSTCwgaWYgc28gd2UgaGF2ZSB0byByZXBsYWNlIHRoZW4gd2l0aCBkYXRhCi0gICAgICAgIC8vIHZhbHVlcyBhbmQgY3JlYXRlIGEgbmV3IHRhcmdldCBVUkwuCi0gICAgICAgIHRhcmdldFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmdldFRlbXBsYXRlZFVSTCh0YXJnZXRVUkwsIG1lc3NhZ2VDb250ZXh0LCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIGlnbm9yZVVuY2l0ZWQgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfSUdOT1JFX1VOQ0lURUQpOwotCi0gICAgICAgIC8vIE5lZWQgdG8gaGF2ZSB0aGlzIGNoZWNrIGhlcmUgY2F1c2UgICAgICAgICAKLSAgICAgICAgaWYgKGlnbm9yZVVuY2l0ZWQgPT0gbnVsbCB8fCAhSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoaWdub3JlVW5jaXRlZCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QpOwotICAgICAgICAgICAgaWYgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVC5lcXVhbHMoaHR0cE1ldGhvZCkgfHwgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfREVMRVRFLmVxdWFscyhodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgdGFyZ2V0VVJMID0gVVJMVGVtcGxhdGluZ1V0aWwuYXBwZW5kUXVlcnlQYXJhbWV0ZXJzKG1lc3NhZ2VDb250ZXh0LCB0YXJnZXRVUkwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkuZGV0YWNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGFyZ2V0VVJMOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZm9ybWF0U09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbikgewotICAgICAgICByZXR1cm4gc29hcEFjdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9Db21wbGV4UGFydC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvQ29tcGxleFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZWQzYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9Db21wbGV4UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuUGFydEJhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnV0aWwuRW5jb2RpbmdVdGlsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29tcGxleFBhcnQgZXh0ZW5kcyBQYXJ0QmFzZSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBEZWZhdWx0IGNvbnRlbnQgZW5jb2Rpbmcgb2Ygc3RyaW5nIHBhcmFtZXRlcnMuDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfVFlQRSA9ICJhcHBsaWNhdGlvbi94bWwiOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmYXVsdCBjaGFyc2V0IG9mIHN0cmluZyBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NIQVJTRVQgPSAiVVMtQVNDSUkiOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmYXVsdCB0cmFuc2ZlciBlbmNvZGluZyBvZiBzdHJpbmcgcGFyYW1ldGVycw0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UUkFOU0ZFUl9FTkNPRElORyA9ICI4Yml0IjsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnRlbnRzIG9mIHRoaXMgU3RyaW5nUGFydC4NCi0gICAgICovDQotICAgIHByaXZhdGUgYnl0ZVtdIGNvbnRlbnQ7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGUgU3RyaW5nIHZhbHVlIG9mIHRoaXMgcGFydC4NCi0gICAgICovDQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJ0DQotICAgICAqIEBwYXJhbSB2YWx1ZSAgIHRoZSBzdHJpbmcgdG8gcG9zdA0KLSAgICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgY2hhcnNldCB0byBiZSB1c2VkIHRvIGVuY29kZSB0aGUgc3RyaW5nLCBpZiA8Y29kZT5udWxsPC9jb2RlPg0KLSAgICAgKiAgICAgICAgICAgICAgICB0aGUge0BsaW5rICNERUZBVUxUX0NIQVJTRVQgZGVmYXVsdH0gaXMgdXNlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIENvbXBsZXhQYXJ0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBjaGFyc2V0KSB7DQotDQotICAgICAgICBzdXBlcigNCi0gICAgICAgICAgICAgICAgbmFtZSwNCi0gICAgICAgICAgICAgICAgREVGQVVMVF9DT05URU5UX1RZUEUsDQotICAgICAgICAgICAgICAgIGNoYXJzZXQgPT0gbnVsbCA/IERFRkFVTFRfQ0hBUlNFVCA6IGNoYXJzZXQsDQotICAgICAgICAgICAgICAgIERFRkFVTFRfVFJBTlNGRVJfRU5DT0RJTkcNCi0gICAgICAgICk7DQotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIG1heSBub3QgYmUgbnVsbCIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoMCkgIT0gLTEpIHsNCi0gICAgICAgICAgICAvLyBTZWUgUkZDIDIwNDgsIDIuOC4gIjhiaXQgRGF0YSINCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOVUxzIG1heSBub3QgYmUgcHJlc2VudCBpbiBzdHJpbmcgcGFydHMiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBuYW1lICBUaGUgbmFtZSBvZiB0aGUgcGFydA0KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHN0cmluZyB0byBwb3N0DQotICAgICAqLw0KLSAgICBwdWJsaWMgQ29tcGxleFBhcnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcyhuYW1lLCB2YWx1ZSwgbnVsbCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgaW4gYnl0ZXMuICBCeXRlcyBhcmUgbGF6aWx5IGNyZWF0ZWQgdG8gYWxsb3cgdGhlIGNoYXJzZXQgdG8gYmUgY2hhbmdlZA0KLSAgICAgKiBhZnRlciB0aGUgcGFydCBpcyBjcmVhdGVkLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGluIGJ5dGVzDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRDb250ZW50KCkgew0KLSAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGNvbnRlbnQgPSBFbmNvZGluZ1V0aWwuZ2V0Qnl0ZXModmFsdWUsIGdldENoYXJTZXQoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gY29udGVudDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogV3JpdGVzIHRoZSBkYXRhIHRvIHRoZSBnaXZlbiBPdXRwdXRTdHJlYW0uDQotICAgICAqDQotICAgICAqIEBwYXJhbSBvdXQgdGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0bw0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgd3JpdGUgZXJyb3INCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIHNlbmREYXRhKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICBvdXQud3JpdGUoZ2V0Q29udGVudCgpKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YS4NCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBJTyBwcm9ibGVtIG9jY3Vycw0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMubXVsdGlwYXJ0LlBhcnQjbGVuZ3RoT2ZEYXRhKCkNCi0gICAgICovDQotICAgIHByb3RlY3RlZCBsb25nIGxlbmd0aE9mRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gZ2V0Q29udGVudCgpLmxlbmd0aDsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQuQmFzZVBhcnQjc2V0Q2hhclNldChqYXZhLmxhbmcuU3RyaW5nKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0Q2hhclNldChTdHJpbmcgY2hhclNldCkgew0KLSAgICAgICAgc3VwZXIuc2V0Q2hhclNldChjaGFyU2V0KTsNCi0gICAgICAgIHRoaXMuY29udGVudCA9IG51bGw7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUXVlcnlTdHJpbmdQYXJzZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1F1ZXJ5U3RyaW5nUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTUyYjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUXVlcnlTdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogUGFyc2VyIGZvciBVUkwgcXVlcnkgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5U3RyaW5nUGFyc2VyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBxdWVyeVN0cmluZzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHBhcmFtQmVnaW47Ci0gICAgcHJpdmF0ZSBpbnQgcGFyYW1FbmQ7Ci0gICAgcHJpdmF0ZSBpbnQgcGFyYW1OYW1lRW5kOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbVZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgcGFyc2VyIGZyb20gdGhlIGdpdmVuIFVSTCBxdWVyeSBzdHJpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHF1ZXJ5U3RyaW5nIHRoZSBxdWVyeSBzdHJpbmcsIGkuZS4gdGhlIHBhcnQgb2YgdGhlIFVSTCBzdGFydGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICBhZnRlciB0aGUgJz8nIGNoYXJhY3RlcgotICAgICAqLwotICAgIHB1YmxpYyBRdWVyeVN0cmluZ1BhcnNlcihTdHJpbmcgcXVlcnlTdHJpbmcpIHsKLSAgICAgICAgdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNb3ZlIHRvIHRoZSBuZXh0IHBhcmFtZXRlciBpbiB0aGUgcXVlcnkgc3RyaW5nLgotICAgICAqIAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBwYXJhbWV0ZXIgaGFzIGJlZW4gZm91bmQ7IAotICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dCgpIHsKLSAgICAgICAgaW50IGxlbiA9IHF1ZXJ5U3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBpZiAocGFyYW1FbmQgPT0gbGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyYW1CZWdpbiA9IHBhcmFtRW5kID09IDAgPyAwIDogcGFyYW1FbmQrMTsKLSAgICAgICAgaW50IGlkeCA9IHF1ZXJ5U3RyaW5nLmluZGV4T2YoJyYnLCBwYXJhbUJlZ2luKTsKLSAgICAgICAgcGFyYW1FbmQgPSBpZHggPT0gLTEgPyBsZW4gOiBpZHg7Ci0gICAgICAgIGlkeCA9IHF1ZXJ5U3RyaW5nLmluZGV4T2YoJz0nLCBwYXJhbUJlZ2luKTsKLSAgICAgICAgcGFyYW1OYW1lRW5kID0gaWR4ID09IC0xIHx8IGlkeCA+IHBhcmFtRW5kID8gcGFyYW1FbmQgOiBpZHg7Ci0gICAgICAgIHBhcmFtTmFtZSA9IG51bGw7Ci0gICAgICAgIHBhcmFtVmFsdWUgPSBudWxsOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhIHBhcmFtZXRlciB3aXRoIGEgbmFtZSBpbiBhIGdpdmVuIGNvbGxlY3Rpb24uCi0gICAgICogVGhpcyBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgcGFyYW1ldGVycyB1bnRpbCBhIHBhcmFtZXRlciB3aXRoCi0gICAgICogYSBtYXRjaGluZyBuYW1lIGhhcyBiZWVuIGZvdW5kLiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGlzIG5vdAotICAgICAqIGNvbnNpZGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNlYXJjaChDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLSAgICAgICAgd2hpbGUgKG5leHQoKSkgewotICAgICAgICAgICAgaWYgKG5hbWVzLmNvbnRhaW5zKGdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIuCi0gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgaWYge0BsaW5rICNuZXh0KCl9IGhhcyBiZWVuIGNhbGxlZAotICAgICAqIHByZXZpb3VzbHkgYW5kIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdhcyA8Y29kZT50cnVlPC9jb2RlPi4gT3RoZXJ3aXNlIHRoZQotICAgICAqIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIGlmIChwYXJhbU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1OYW1lID0gcXVlcnlTdHJpbmcuc3Vic3RyaW5nKHBhcmFtQmVnaW4sIHBhcmFtTmFtZUVuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIuCi0gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgaWYge0BsaW5rICNuZXh0KCl9IGhhcyBiZWVuIGNhbGxlZAotICAgICAqIHByZXZpb3VzbHkgYW5kIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdhcyA8Y29kZT50cnVlPC9jb2RlPi4gT3RoZXJ3aXNlIHRoZQotICAgICAqIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgZGVjb2RlZCB2YWx1ZSBvZiB0aGUgY3VycmVudCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICBpZiAocGFyYW1WYWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1OYW1lRW5kID09IHBhcmFtRW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBVUklFbmNvZGVyRGVjb2Rlci5kZWNvZGUocXVlcnlTdHJpbmcuc3Vic3RyaW5nKHBhcmFtTmFtZUVuZCsxLCBwYXJhbUVuZCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IFVSSUVuY29kZXJEZWNvZGVyLmRlY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBub3QgdGhyb3cKLSAgICAgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHNpbmNlIHRoaXMgYWN0dWFsbHkgbmV2ZXIgaGFwcGVucyAodGhlIGNoYXJzZXQKLSAgICAgICAgICAgICAgICAvLyBiZWluZyBsb29rZWQgdXAgaXMgVVRGLTggd2hpY2ggYWx3YXlzIGV4aXN0cykuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1WYWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvVVJJRW5jb2RlckRlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYzViNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUklFbmNvZGVyRGVjb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBVUklFbmNvZGVyRGVjb2RlciB7DQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUYiOyAvLyROT04tTkxTLTEkDQotDQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPSAiVVRGOCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgLyoqDQotICAgICAqIFZhbGlkYXRlIGEgc3RyaW5nIGJ5IGNoZWNraW5nIGlmIGl0IGNvbnRhaW5zIGFueSBjaGFyYWN0ZXJzIG90aGVyIHRoYW46DQotICAgICAqIDxwLz4NCi0gICAgICogMS4gbGV0dGVycyAoJ2EnLi4neicsICdBJy4uJ1onKSAyLiBudW1iZXJzICgnMCcuLic5JykgMy4gY2hhcmFjdGVycyBpbg0KLSAgICAgKiB0aGUgbGVnYWxzZXQgcGFyYW1ldGVyIDQuIG90aGVycyAoVW5pY29kZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBpbg0KLSAgICAgKiBVUy1BU0NJSSBzZXQsIGFuZCBhcmUgbm90IElTTyBDb250cm9sIG9yIGFyZSBub3QgSVNPIFNwYWNlIGNoYXJhY3RlcnMpDQotICAgICAqIDxwLz4NCi0gICAgICogY2FsbGVkIGZyb20gVVJJLkhlbHBlci5wYXJzZVVSSSgpIHRvIHZhbGlkYXRlIGVhY2ggY29tcG9uZW50DQotICAgICAqIDxwLz4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHMgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSB2YWxpZGF0ZWQNCi0gICAgICogQHBhcmFtIGxlZ2FsIGphdmEubGFuZy5TdHJpbmcgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiB0aGUgU3RyaW5nIHMNCi0gICAgICovDQotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyBzLCBTdHJpbmcgbGVnYWwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gew0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOykgew0KLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsNCi0gICAgICAgICAgICBpZiAoY2ggPT0gJyUnKSB7DQotICAgICAgICAgICAgICAgIGRvIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChpICsgMiA+PSBzLmxlbmd0aCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVSSVN5bnRheEV4Y2VwdGlvbihzLCAiSW5jb21wbGV0ZSAlIHNlcXVlbmNlIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDEgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDEpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDIgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDIpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPT0gLTEgfHwgZDIgPT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVVJJU3ludGF4RXhjZXB0aW9uKHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCAlIHNlcXVlbmNlICIgKyBzLnN1YnN0cmluZyhpLCBpICsgMykNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBpICs9IDM7DQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmIHMuY2hhckF0KGkpID09ICclJyk7DQotDQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAoISgoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpDQotICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgbGVnYWwuaW5kZXhPZihjaCkgPiAtMSB8fCAoY2ggPiAxMjcNCi0gICAgICAgICAgICAgICAgICAgICYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoY2gpICYmICFDaGFyYWN0ZXINCi0gICAgICAgICAgICAgICAgICAgIC5pc0lTT0NvbnRyb2woY2gpKSkpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVSSVN5bnRheEV4Y2VwdGlvbihzLCAiSWxsZWdhbCBjaGFyYWN0ZXIiLCBpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaSsrOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlU2ltcGxlKFN0cmluZyBzLCBTdHJpbmcgbGVnYWwpDQotICAgICAgICAgICAgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7KSB7DQotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOw0KLSAgICAgICAgICAgIGlmICghKChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykNCi0gICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCBsZWdhbC5pbmRleE9mKGNoKSA+IC0xKSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVVJJU3ludGF4RXhjZXB0aW9uKHMsICJJbGxlZ2FsIGNoYXJhY3RlciIsIGkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQWxsIGNoYXJhY3RlcnMgZXhjZXB0IGxldHRlcnMgKCdhJy4uJ3onLCAnQScuLidaJykgYW5kIG51bWJlcnMgKCcwJy4uJzknKQ0KLSAgICAgKiBhbmQgbGVnYWwgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gdGhlaXIgaGV4aWRlY2ltYWwgdmFsdWUgcHJlcGVuZGVkDQotICAgICAqIGJ5ICclJy4NCi0gICAgICogPHAvPg0KLSAgICAgKiBGb3IgZXhhbXBsZTogJyMnIC0+ICUyMw0KLSAgICAgKiA8cC8+DQotICAgICAqIE90aGVyIGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBVbmljb2RlIGNoYXJzIHRoYXQgYXJlIG5vdCBVUy1BU0NJSSwgYW5kIGFyZQ0KLSAgICAgKiBub3QgSVNPIENvbnRyb2wgb3IgYXJlIG5vdCBJU08gU3BhY2UgY2hhcnMsIGFyZSBwcmVzZXJ2ZWQuDQotICAgICAqIDxwLz4NCi0gICAgICogQ2FsbGVkIGZyb20gVVJJLnF1b3RlQ29tcG9uZW50KCkgKGZvciBtdWx0aXBsZSBhcmd1bWVudCBjb25zdHJ1Y3RvcnMpDQotICAgICAqIDxwLz4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHMgICAgIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQNCi0gICAgICogQHBhcmFtIGxlZ2FsIGphdmEubGFuZy5TdHJpbmcgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCB0byBiZSBwcmVzZXJ2ZWQgaW4gdGhlDQotICAgICAqICAgICAgICAgICAgICBzdHJpbmcgcw0KLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgdGhlIGNvbnZlcnRlZCBzdHJpbmcNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlSWxsZWdhbChTdHJpbmcgcywgU3RyaW5nIGxlZ2FsKQ0KLSAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgew0KLSAgICAgICAgICAgIGNoYXIgY2ggPSBzLmNoYXJBdChpKTsNCi0gICAgICAgICAgICBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAneicpDQotICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykNCi0gICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQ0KLSAgICAgICAgICAgICAgICAgICAgfHwgbGVnYWwuaW5kZXhPZihjaCkgPiAtMSkgew0KLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNoKTsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117Y2h9KS5nZXRCeXRlcyhlbmNvZGluZyk7DQotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyUnKTsNCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZGlnaXRzLmNoYXJBdCgoYnl0ZXNbal0gJiAweGYwKSA+PiA0KSk7DQotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGRpZ2l0cy5jaGFyQXQoYnl0ZXNbal0gJiAweGYpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogT3RoZXIgY2hhcmFjdGVycywgd2hpY2ggYXJlIFVuaWNvZGUgY2hhcnMgdGhhdCBhcmUgbm90IFVTLUFTQ0lJLCBhbmQgYXJlDQotICAgICAqIG5vdCBJU08gQ29udHJvbCBvciBhcmUgbm90IElTTyBTcGFjZSBjaGFycyBhcmUgbm90IHByZXNlcnZlZC4gVGhleSBhcmUNCi0gICAgICogY29udmVydGVkIGludG8gdGhlaXIgaGV4aWRlY2ltYWwgdmFsdWUgcHJlcGVuZGVkIGJ5ICclJy4NCi0gICAgICogPHAvPg0KLSAgICAgKiBGb3IgZXhhbXBsZTogRXVybyBjdXJyZW5jeSBzeW1ib2wgLT4gIiVFMiU4MiVBQyIuDQotICAgICAqIDxwLz4NCi0gICAgICogQ2FsbGVkIGZyb20gVVJJLnRvQVNDSUlTdHJpbmcoKQ0KLSAgICAgKiA8cC8+DQotICAgICAqDQotICAgICAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQNCi0gICAgICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nIHRoZSBjb252ZXJ0ZWQgc3RyaW5nDQotICAgICAqLw0KLSAgICBzdGF0aWMgU3RyaW5nIGVuY29kZU90aGVycyhTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7DQotICAgICAgICAgICAgY2hhciBjaCA9IHMuY2hhckF0KGkpOw0KLSAgICAgICAgICAgIGlmIChjaCA8PSAxMjcpIHsNCi0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjaCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IFN0cmluZyhuZXcgY2hhcltde2NofSkuZ2V0Qnl0ZXMoZW5jb2RpbmcpOw0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCclJyk7DQotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGRpZ2l0cy5jaGFyQXQoKGJ5dGVzW2pdICYgMHhmMCkgPj4gNCkpOw0KLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChkaWdpdHMuY2hhckF0KGJ5dGVzW2pdICYgMHhmKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIERlY29kZXMgdGhlIHN0cmluZyBhcmd1bWVudCB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIGVuY29kZWQgaW4gdGhlDQotICAgICAqIDxjb2RlPngtd3d3LWZvcm0tdXJsZW5jb2RlZDwvY29kZT4gTUlNRSBjb250ZW50IHR5cGUgdXNpbmcgdGhlIFVURi04DQotICAgICAqIGVuY29kaW5nIHNjaGVtZS4NCi0gICAgICogPHAvPg0KLSAgICAgKiAnJScgYW5kIHR3byBmb2xsb3dpbmcgaGV4IGRpZ2l0IGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCB0byB0aGUNCi0gICAgICogZXF1aXZhbGVudCBieXRlIHZhbHVlLiBBbGwgb3RoZXIgY2hhcmFjdGVycyBhcmUgcGFzc2VkIHRocm91Z2gNCi0gICAgICogdW5tb2RpZmllZC4NCi0gICAgICogPHAvPg0KLSAgICAgKiA8cC8+DQotICAgICAqIGUuZy4gIkElMjBCJTIwQyAlMjQlMjUiIC0+ICJBIEIgQyAkJSINCi0gICAgICogPHAvPg0KLSAgICAgKiBDYWxsZWQgZnJvbSBVUkkuZ2V0WFlaKCkgbWV0aG9kcw0KLSAgICAgKiA8cC8+DQotICAgICAqDQotICAgICAqIEBwYXJhbSBzIGphdmEubGFuZy5TdHJpbmcgVGhlIGVuY29kZWQgc3RyaW5nLg0KLSAgICAgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgVGhlIGRlY29kZWQgdmVyc2lvbi4NCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7KSB7DQotICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7DQotICAgICAgICAgICAgaWYgKGMgPT0gJyUnKSB7DQotICAgICAgICAgICAgICAgIG91dC5yZXNldCgpOw0KLSAgICAgICAgICAgICAgICBkbyB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDIgPj0gcy5sZW5ndGgoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29tcGxldGUgJSBzZXF1ZW5jZSBhdCAiICsgaSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDEgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDEpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpbnQgZDIgPSBDaGFyYWN0ZXIuZGlnaXQocy5jaGFyQXQoaSArIDIpLCAxNik7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPT0gLTEgfHwgZDIgPT0gLTEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgJSBzZXF1ZW5jZSIgKyBzLnN1YnN0cmluZyhpLCBpICsgMykgKyAiYXQgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgoYnl0ZSkgKChkMSA8PCA0KSArIGQyKSk7DQotICAgICAgICAgICAgICAgICAgICBpICs9IDM7DQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBzLmxlbmd0aCgpICYmIHMuY2hhckF0KGkpID09ICclJyk7DQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQob3V0LnRvU3RyaW5nKGVuY29kaW5nKSk7DQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOw0KLSAgICAgICAgICAgIGkrKzsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUkxUZW1wbGF0aW5nVXRpbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvVVJMVGVtcGxhdGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMTUzOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUkxUZW1wbGF0aW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuV1NETDIwVXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIHV0aWwgaXMgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIGNyZWF0aW5nIHRoZSBVUkwncyBmb3IgYWxsIHJlcXVlc3QgKFdTREwgMi4wIGFsbHdzIHRvDQotICogY2hhbmdlIHRoZSBVUkwncyBvZiBTT0FQIG1lc3NhZ2VzIHRvbykuIEl0IHJlc29sdmVzIFdTREwgMi4wIGh0dHBsb2NhdGlvbiBwcm9wZXJ0eSBhbmQgYWxzbw0KLSAqIGFwcGVuZCBwYXJhbWV0ZXJzIHRvIFVSTCdzIHdoZW4gbmVlZGVkLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBVUkxUZW1wbGF0aW5nVXRpbCB7DQotDQotICAgIC8qKg0KLSAgICAgKiBBcHBlbmRzIFF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIFVSTA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIHJlcXVlc3QNCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgIC0gT3JpZ2luYWwgdXJsIHN0cmluZw0KLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBhcHBlbmRlZCBxdWVyeSBwYXJhbWV0ZXJzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIFVSTCBhcHBlbmRRdWVyeVBhcmFtZXRlcnMoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFVSTCB1cmwpIHRocm93cyBBeGlzRmF1bHQgew0KLQ0KLSAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC50b1N0cmluZygpOw0KLSAgICAgICAgT01FbGVtZW50IGZpcnN0RWxlbWVudDsNCi0gICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0DQotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX1FVRVJZX1BBUkFNRVRFUl9TRVBBUkFUT1IpOw0KLSAgICAgICAgLy8gSW4gY2FzZSBxdWVyeVBhcmFtZXRlclNlcGFyYXRvciBpcyBudWxsIHdlIGJldHRlciB1c2UgdGhlIGRlZmF1bHQgdmFsdWUNCi0NCi0gICAgICAgIGlmIChxdWVyeVBhcmFtZXRlclNlcGFyYXRvciA9PSBudWxsKSB7DQotICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgPSBXU0RMMjBEZWZhdWx0VmFsdWVIb2xkZXINCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGZpcnN0RWxlbWVudCA9IG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpOw0KLSAgICAgICAgU3RyaW5nIHBhcmFtcyA9ICIiOw0KLQ0KLSAgICAgICAgaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IGZpcnN0RWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7DQotDQotICAgICAgICAgICAgU3RyaW5nIGxlZ2FsQ2hhcmFjdGVycyA9IFdTREwyQ29uc3RhbnRzLkxFR0FMX0NIQVJBQ1RFUlNfSU5fUVVFUlkucmVwbGFjZUFsbChxdWVyeVBhcmFtZXRlclNlcGFyYXRvciwgIiIpOw0KLQ0KLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZWxlbWVudCA9IChPTUVsZW1lbnQpIGl0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zICsgVVJJRW5jb2RlckRlY29kZXIucXVvdGVJbGxlZ2FsKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIGxlZ2FsQ2hhcmFjdGVycykgKyAiPSIgKyBVUklFbmNvZGVyRGVjb2Rlci5xdW90ZUlsbGVnYWwoZWxlbWVudC5nZXRUZXh0KCksIGxlZ2FsQ2hhcmFjdGVycykgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlclNlcGFyYXRvcjsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKCEiIi5lcXVhbHMocGFyYW1zKSkgew0KLSAgICAgICAgICAgIGludCBpbmRleCA9IHVybFN0cmluZy5pbmRleE9mKCI/Iik7DQotICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7DQotICAgICAgICAgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZyArICI/IiArIHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSB1cmxTdHJpbmcubGVuZ3RoKCkgLSAxKSB7DQotICAgICAgICAgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZyArIHBhcmFtcy5zdWJzdHJpbmcoMCwgcGFyYW1zLmxlbmd0aCgpIC0gMSk7DQotDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nICsgcXVlcnlQYXJhbWV0ZXJTZXBhcmF0b3IgKyBwYXJhbXMuc3Vic3RyaW5nKDAsIHBhcmFtcy5sZW5ndGgoKSAtIDEpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxTdHJpbmcpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHVybDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGVkIFVSTCBnaXZlbiB0aGUgb3JpZ2luYWwgVVJMDQotICAgICAqDQotICAgICAqIEBwYXJhbSB0YXJnZXRVUkwgICAgICAtIFRoZSBvcmlnaW5hbCBVUkwNCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0IC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSByZXF1ZXN0DQotICAgICAqIEBwYXJhbSBkZXRhY2ggICAgICAgICAtIEJvb2xlYW4gdmFsdWUgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbGVtZW50IHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tIHRoZQ0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcC4gV2hlbiBzZXJpYWxpemluZyBkYXRhIGFzIGFwcGxpY2F0aW9uL3gtZm9ybS11cmxlbmNvZGVkIHdoYXQgZ29lcyBpbiB0aGUgYm9keSBpcyB0aGUNCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciBhbmQgdGhlcmVmb3JlIHdlIHNob3VsZCBkZXRhY2ggdGhlIGVsZW1lbnQgZnJvbSB0aGUgZW52ZWxvcC4NCi0gICAgICogQHJldHVybiBUaGUgdGVtcGxhdGVkIFVSTA0KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMNCi0gICAgICovDQotICAgIHB1YmxpYyBzdGF0aWMgVVJMIGdldFRlbXBsYXRlZFVSTChVUkwgdGFyZ2V0VVJMLCBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgYm9vbGVhbiBkZXRhY2gpDQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7DQotDQotICAgICAgICBTdHJpbmcgaHR0cExvY2F0aW9uID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9MT0NBVElPTik7DQotDQotLy8gICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSB0YXJnZXRVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgIGlmIChodHRwTG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgU3RyaW5nIHJlcGxhY2VkUXVlcnkgPSBodHRwTG9jYXRpb247DQotICAgICAgICBpbnQgc2VwYXJhdG9yID0gaHR0cExvY2F0aW9uLmluZGV4T2YoJ3snKTsNCi0gICAgICAgICAgICB0cnkgew0KLQ0KLSAgICAgICAgaWYgKHNlcGFyYXRvciA+IC0xKSB7DQotICAgICAgICAgICAgcmVwbGFjZWRRdWVyeSA9IFVSSUVuY29kZXJEZWNvZGVyLnF1b3RlSWxsZWdhbCgNCi0gICAgICAgICAgICAgICAgICAgIFdTREwyMFV0aWwuYXBwbHlVUklUZW1wbGF0aW5nKG1lc3NhZ2VDb250ZXh0LCBodHRwTG9jYXRpb24sIGRldGFjaCksDQotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5MRUdBTF9DSEFSQUNURVJTX0lOX1VSTCk7DQotDQotICAgICAgICB9DQotICAgICAgICAgICAgICAgIFVSSSB0YXJnZXRVUkk7DQotICAgICAgICAgICAgICAgIFVSSSBhcHBlbmRlZFVSSTsNCi0gICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VkUXVlcnkuY2hhckF0KDApID09ICc/Jykgew0KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRVUkkgPSBuZXcgVVJJKHRhcmdldFVSTC50b1N0cmluZyAoKSArIHJlcGxhY2VkUXVlcnkpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmlTdHJpbmcgPSB0YXJnZXRVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghdXJpU3RyaW5nLmVuZHNXaXRoKCIvIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldFVSSSA9IG5ldyBVUkkodXJpU3RyaW5nICsgIi8iKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VVJJID0gbmV3IFVSSSh1cmlTdHJpbmcpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRVUkkgPSB0YXJnZXRVUkkucmVzb2x2ZShyZXBsYWNlZFF1ZXJ5KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgdGFyZ2V0VVJMID0gYXBwZW5kZWRVUkkudG9VUkwoKTsNCi0NCi0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgcmVxdWVzdCBVUkwiKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgcmVxdWVzdCBVUkwiKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIHJlcXVlc3QgVVJMIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHRhcmdldFVSTDsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9BeGlzUG9saWN5TG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQXhpc1BvbGljeUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3YzNkZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9BeGlzUG9saWN5TG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNCaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0VuZHBvaW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBvbGljeVN1YmplY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIEF4aXNQb2xpY3lMb2NhdG9yIGltcGxlbWVudHMgUG9saWN5UmVnaXN0cnkgewotCi0gICAgQXhpc0Rlc2NyaXB0aW9uIHN1YmplY3QgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfQklORElOR19NRVNTQUdFID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBBWElTX01FU1NBR0UgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfQklORElOR19PUEVSQVRJT04gPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfT1BFUkFUSU9OID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBBWElTX0JJTkRJTkcgPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfRU5EUE9JTlQgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IEFYSVNfU0VSVklDRSA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgQVhJU19TRVJWSUNFX0dST1VQID0gODsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzaG9ydCBBWElTX0NPTkZJR1VSQVRJT04gPSA5OwotICAgIAotICAgIAotICAgIAotICAgIHB1YmxpYyBBeGlzUG9saWN5TG9jYXRvcihBeGlzRGVzY3JpcHRpb24gc3ViamVjdCkgewotICAgICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3kgbG9va3VwKFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKHN1YmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFBvbGljeSBwb2xpY3kgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgUG9saWN5U3ViamVjdCBwb2xpY3lTdWJqZWN0ID0gc3ViamVjdC5nZXRQb2xpY3lTdWJqZWN0KCk7Ci0JCVBvbGljeUNvbXBvbmVudCBhdHRhY2hlZFBvbGljeUNvbXBvbmVudCA9IHBvbGljeVN1YmplY3QKLQkJCQkuZ2V0QXR0YWNoZWRQb2xpY3lDb21wb25lbnQoa2V5KTsKLQotCQlpZiAoYXR0YWNoZWRQb2xpY3lDb21wb25lbnQgIT0gbnVsbAotCQkJCSYmIGF0dGFjaGVkUG9saWN5Q29tcG9uZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0JCQlwb2xpY3kgPSAoUG9saWN5KSBhdHRhY2hlZFBvbGljeUNvbXBvbmVudDsKLQkJCWlmIChwb2xpY3kgIT0gbnVsbCkgewotCQkJCXJldHVybiBwb2xpY3k7Ci0JCQl9Ci0JCX0KLQkJCi0gICAgICAgIAotCQlpZiAoc3ViamVjdCBpbnN0YW5jZW9mIEF4aXNTZXJ2aWNlKSB7Ci0JCQlwb2xpY3kgPSAoKEF4aXNTZXJ2aWNlKSBzdWJqZWN0KS5sb29rdXBQb2xpY3koa2V5KTsKLQkJCWlmIChwb2xpY3kgIT0gbnVsbCkgewotCQkJCXJldHVybiBwb2xpY3k7Ci0JCQl9Ci0JCX0KLQkJCi0gICAgICAgIAotICAgICAgICBzaG9ydCB0eXBlID0gZ2V0VHlwZShzdWJqZWN0KTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIHByb2Nlc3NpbmcgdGhlIHBhcmFsbGVsIGxldmVsCi0gICAgICAgICAqLwotICAgICAgICBBeGlzRGVzY3JpcHRpb24gcGFyYWxsZWxMZXZlbCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBBWElTX0JJTkRJTkdfTUVTU0FHRToKLSAgICAgICAgICAgIHBhcmFsbGVsTGV2ZWwgPSAoKEF4aXNCaW5kaW5nTWVzc2FnZSkgc3ViamVjdCkuZ2V0QXhpc01lc3NhZ2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFYSVNfQklORElOR19PUEVSQVRJT046Ci0gICAgICAgICAgICBwYXJhbGxlbExldmVsID0gKChBeGlzQmluZGluZ09wZXJhdGlvbikgc3ViamVjdCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBhcmFsbGVsTGV2ZWwgIT0gbnVsbCkgewotICAgICAgICAgICAgcG9saWN5ID0gKG5ldyBBeGlzUG9saWN5TG9jYXRvcihwYXJhbGxlbExldmVsKSkubG9va3VwKGtleSk7Ci0gICAgICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9saWN5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBBeGlzRGVzY3JpcHRpb24gdXBwZXJMZXZlbCA9IGdldFVwcGVyTGV2ZWwodHlwZSwgc3ViamVjdCk7Ci0gICAgICAgIGlmICh1cHBlckxldmVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvbGljeSA9IChuZXcgQXhpc1BvbGljeUxvY2F0b3IodXBwZXJMZXZlbCkpLmxvb2t1cChrZXkpOwotICAgICAgICAgICAgcmV0dXJuIHBvbGljeTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcga2V5LCBQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAKLSAgICBwcml2YXRlIEF4aXNEZXNjcmlwdGlvbiBnZXRVcHBlckxldmVsKHNob3J0IHR5cGUsIEF4aXNEZXNjcmlwdGlvbiB0aGlzTGV2ZWwpIHsKLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEFYSVNfQklORElOR19NRVNTQUdFOgotICAgICAgICAgICAgcmV0dXJuICgoQXhpc0JpbmRpbmdNZXNzYWdlKSB0aGlzTGV2ZWwpLmdldEF4aXNCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICAgIGNhc2UgQVhJU19CSU5ESU5HX09QRVJBVElPTjoKLSAgICAgICAgICAgIHJldHVybiAoKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSB0aGlzTGV2ZWwpLmdldEF4aXNCaW5kaW5nKCk7Ci0gICAgICAgIGNhc2UgQVhJU19CSU5ESU5HOgotICAgICAgICAgICAgcmV0dXJuICgoQXhpc0JpbmRpbmcpIHRoaXNMZXZlbCkuZ2V0QXhpc0VuZHBvaW50KCk7Ci0gICAgICAgIGNhc2UgQVhJU19FTkRQT0lOVDoKLSAgICAgICAgICAgIHJldHVybiAoKEF4aXNFbmRwb2ludCkgdGhpc0xldmVsKS5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBjYXNlIEFYSVNfTUVTU0FHRToKLSAgICAgICAgCXJldHVybiAoKEF4aXNNZXNzYWdlKSB0aGlzTGV2ZWwpLmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgY2FzZSBBWElTX09QRVJBVElPTjoKLSAgICAgICAgCXJldHVybiAoKEF4aXNPcGVyYXRpb24pIHRoaXNMZXZlbCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgY2FzZSBBWElTX1NFUlZJQ0U6Ci0gICAgICAgICAgICByZXR1cm4gKChBeGlzU2VydmljZSkgdGhpc0xldmVsKS5nZXRBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgIGNhc2UgQVhJU19TRVJWSUNFX0dST1VQOgotICAgICAgICAgICAgcmV0dXJuICgoQXhpc1NlcnZpY2VHcm91cCkgdGhpc0xldmVsKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzaG9ydCBnZXRUeXBlKEF4aXNEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotICAgICAgICAKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0JpbmRpbmdNZXNzYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19CSU5ESU5HX01FU1NBR0U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBBeGlzTWVzc2FnZSkgewotICAgICAgICAgICAgcmV0dXJuIEFYSVNfTUVTU0FHRTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19CSU5ESU5HX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBBWElTX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNCaW5kaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19CSU5ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc0VuZHBvaW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19FTkRQT0lOVDsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19TRVJWSUNFOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc1NlcnZpY2VHcm91cCkgewotICAgICAgICAgICAgcmV0dXJuIEFYSVNfU0VSVklDRV9HUk9VUDsKLSAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNDb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVhJU19DT05GSUdVUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0Jhc2U2NC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQmFzZTY0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMjMwMDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQmFzZTY0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZTY0IGV4dGVuZHMgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkJhc2U2NCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ2FsbGJhY2tSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ2FsbGJhY2tSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAxZmJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NhbGxiYWNrUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5Bc3luY1Jlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5hc3luYy5BeGlzQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci0KLS8qKgotICogVGhpcyBpcyBhIE1lc3NhZ2VSZWNlaXZlciB3aGljaCBpcyB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZSB0byBhY2NlcHQgdGhlCi0gKiBtZXNzYWdlcyAocmVzcG9uc2UpIHRoYXQgY29tZSB0byB0aGUgY2xpZW50LiBUaGlzIGNvcnJlbGF0ZXMgdGhlIGluY29taW5nIG1lc3NhZ2UgdG8KLSAqIHRoZSByZWxhdGVkIG1lc3NhZ2VzIGFuZCBtYWtlcyBhIGNhbGwgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tSZWNlaXZlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWNlaXZlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2FsbGJhY2tSZWNlaXZlci5jbGFzcyk7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVklDRV9OQU1FID0gIkNsaWVudFNlcnZpY2UiOwotICAgIHByaXZhdGUgQ29uY3VycmVudEhhc2hNYXAgY2FsbGJhY2tTdG9yZTsKLQotICAgIHB1YmxpYyBDYWxsYmFja1JlY2VpdmVyKCkgewotICAgICAgICBjYWxsYmFja1N0b3JlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soU3RyaW5nIG1zZ0lELCBDYWxsYmFjayBjYWxsYmFjaykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgCXB1dElmQWJzZW50KG1zZ0lELCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soU3RyaW5nIG1zZ0lELCBBeGlzQ2FsbGJhY2sgY2FsbGJhY2spIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlwdXRJZkFic2VudChtc2dJRCwgY2FsbGJhY2spOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQga2V5LCB2YWx1ZSBpbnRvIHRoZSBjYWxsYmFjayBtYXAuIEl0IHRocm93cyBhbgotICAgICAqIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpZCB3YXMgYSBkdXBsaWNhdGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0lEIFRoZSBtZXNzYWdlIGlkLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgb2JqZWN0LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IElmIHRoZSBtZXNzYWdlIGlkIHdhcyBhIGR1cGxpY2F0ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHV0SWZBYnNlbnQoU3RyaW5nIG1zZ0lELCBPYmplY3QgY2FsbGJhY2spIHRocm93cyBBeGlzRmF1bHQgewotICAgIAlpZiAoY2FsbGJhY2tTdG9yZS5wdXRJZkFic2VudChtc2dJRCwgY2FsbGJhY2spID09IG51bGwpIHsKLSAgICAJCWlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGJhY2tSZWNlaXZlcjogYWRkIGNhbGxiYWNrICIgKyBtc2dJRCArICIsICIgKyBjYWxsYmFjayArICIgLCIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAJfSBlbHNlIHsKLSAgICAJCXRocm93IG5ldyBBeGlzRmF1bHQoIlRoZSBDYWxsYmFjayBmb3IgTWVzc2FnZUlEICIgKyBtc2dJRCArICIgaXMgYSBkdXBsaWNhdGUiKTsKLSAgICAJfQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbG9va3VwQ2FsbGJhY2soU3RyaW5nIG1zZ0lEKSB7Ci0JCU9iamVjdCBvID0gY2FsbGJhY2tTdG9yZS5yZW1vdmUobXNnSUQpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiQ2FsbGJhY2tSZWNlaXZlcjogbG9va3VwIGNhbGxiYWNrICIgKyBtc2dJRCArICIsICIgKyBvICsgIiAsIiArIHRoaXMpOwotICAgICAgICByZXR1cm4gbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBSZWxhdGVzVG8gcmVsYXRlc1RPID0gbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0UmVsYXRlc1RvKCk7Ci0gICAgICAgIGlmIChyZWxhdGVzVE8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2Fubm90IGlkZW50aWZ5IGNvcnJlY3QgQ2FsbGJhY2sgb2JqZWN0LiBSZWxhdGVzVG8gaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlSUQgPSByZWxhdGVzVE8uZ2V0VmFsdWUoKTsKLQotICAgICAgICBPYmplY3QgY2FsbGJhY2tPYmogPSBjYWxsYmFja1N0b3JlLnJlbW92ZShtZXNzYWdlSUQpOwotCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIGxvZy5kZWJ1ZygiQ2FsbGJhY2tSZWNlaXZlcjogcmVjZWl2ZSBmb3VuZCBjYWxsYmFjayAiICsgY2FsbGJhY2tPYmogKyAiLCAiICsgbWVzc2FnZUlEICsgIiwgIiArIHRoaXMgKyAiLCAiICsgbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotCi0gICAgICAgIGlmIChjYWxsYmFja09iaiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaGUgQ2FsbGJhY2sgZm9yIE1lc3NhZ2VJRCAiICsgbWVzc2FnZUlEICsgIiB3YXMgbm90IGZvdW5kIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2FsbGJhY2tPYmogaW5zdGFuY2VvZiBBeGlzQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIEF4aXNDYWxsYmFjayBheGlzQ2FsbGJhY2sgPSAoQXhpc0NhbGxiYWNrKWNhbGxiYWNrT2JqOwotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc0NhbGxiYWNrLm9uRmF1bHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF4aXNDYWxsYmFjay5vbk1lc3NhZ2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFaXRoZXIgd2F5IHdlJ3JlIGRvbmUuCi0gICAgICAgICAgICBheGlzQ2FsbGJhY2sub25Db21wbGV0ZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVEhJUyBORVhUIFBBUlQgV0lMTCBFVkVOVFVBTExZIEdPIEFXQVkgV0hFTiBDYWxsYmFjayBET0VTCi0KLSAgICAgICAgLy8gT0ssIHRoaXMgbXVzdCBiZSBhbiBvbGQtc3R5bGUgQ2FsbGJhY2sKLSAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSAoQ2FsbGJhY2spY2FsbGJhY2tPYmo7Ci0gICAgICAgIEFzeW5jUmVzdWx0IHJlc3VsdCA9IG5ldyBBc3luY1Jlc3VsdChtc2dDb250ZXh0KTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSByZXN1bHQgaXMgYSBmYXVsdC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCk7Ci0KLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBpZiAob3BDb250ZXh0ICE9IG51bGwgJiYgIW9wQ29udGV4dC5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICBvcENvbnRleHQuYWRkTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbnZlbG9wZS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgQXhpc0ZhdWx0IGF4aXNGYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRJbmJvdW5kRmF1bHRGcm9tTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihheGlzRmF1bHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkNvbXBsZXRlKHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGUpOwotICAgICAgICB9ICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNhbGxiYWNrLnNldENvbXBsZXRlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy90byBnZXQgdGhlIHBlbmRpbmcgcmVxdWVzdAotICAgIHB1YmxpYyBNYXAgZ2V0Q2FsbGJhY2tTdG9yZSgpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxiYWNrU3RvcmU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTBkYjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lT3B0aW9uIGltcGxlbWVudHMgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBvcHRpb25WYWx1ZXM7Ci0KLSAgICBwdWJsaWMgQ29tbWFuZExpbmVPcHRpb24oU3RyaW5nIHR5cGUsIFN0cmluZ1tdIHZhbHVlcykgewotICAgICAgICBzZXRPcHRpb25UeXBlKHR5cGUpOwotICAgICAgICBBcnJheUxpc3QgYXJyYXlMaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFycmF5TGlzdC5hZGQodmFsdWVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IGFycmF5TGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICAvL2NhdGVyIGZvciB0aGUgbG9uZyBvcHRpb25zIGZpcnN0Ci0gICAgICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoIi0tIikpIHsKLSAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJlcGxhY2VGaXJzdCgiLS0iLCAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICB0eXBlID0gdHlwZS5yZXBsYWNlRmlyc3QoIi0iLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3dlIGRvIG5vdCBjaGFuZ2UgdGhlIGNhc2Ugb2YgdGhlIG9wdGlvbiEKLQotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0eXBlCi0gICAgICovCi0gICAgcHVibGljIENvbW1hbmRMaW5lT3B0aW9uKFN0cmluZyB0eXBlLCBBcnJheUxpc3QgdmFsdWVzKSB7Ci0gICAgICAgIHNldE9wdGlvblR5cGUodHlwZSk7Ci0KLSAgICAgICAgaWYgKG51bGwgIT0gdmFsdWVzKSB7Ci0gICAgICAgICAgICB0aGlzLm9wdGlvblZhbHVlcyA9IHZhbHVlczsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlLgotICAgICAqIEBzZWUgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcHRpb25WYWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25WYWx1ZSgpIHsKLSAgICAgICAgaWYgKChvcHRpb25WYWx1ZXMgIT0gbnVsbCkgJiYgKG9wdGlvblZhbHVlcy5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG9wdGlvblZhbHVlcy5nZXQoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBvcHRpb25WYWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRPcHRpb25WYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBvcHRpb25WYWx1ZXM7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZjNmNmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgewotCi0gICAgaW50ZXJmYWNlIFdTREwySmF2YUNvbnN0YW50cyB7Ci0gICAgICAgIFN0cmluZyBBbGxfUE9SVFNfT1BUSU9OID0gImFwIjsKLSAgICAgICAgU3RyaW5nIEFsbF9QT1JUU19PUFRJT05fTE9ORyA9ICJhbGwtcG9ydHMiOwotICAgICAgICBTdHJpbmcgQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT04gPSAiYiI7Ci0gICAgICAgIFN0cmluZyBCQUNLV09SRF9DT01QQVRJQklMSVRZX09QVElPTl9MT05HID0gImJhY2t3b3JkLWNvbXBhdGlibGUiOwotICAgICAgICBTdHJpbmcgQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiA9ICJhIjsKLSAgICAgICAgU3RyaW5nIENPREVHRU5fQVNZTkNfT05MWV9PUFRJT05fTE9ORyA9ICJhc3luYyI7Ci0gICAgICAgIFN0cmluZyBDT0RFR0VOX1NZTkNfT05MWV9PUFRJT04gPSAicyI7Ci0gICAgICAgIFN0cmluZyBDT0RFR0VOX1NZTkNfT05MWV9PUFRJT05fTE9ORyA9ICJzeW5jIjsKLSAgICAgICAgU3RyaW5nIERBVEFfQklORElOR19UWVBFX09QVElPTiA9ICJkIjsKLSAgICAgICAgU3RyaW5nIERBVEFfQklORElOR19UWVBFX09QVElPTl9MT05HID0gImRhdGFiaW5kaW5nLW1ldGhvZCI7Ci0gICAgICAgIFN0cmluZyBFWFRFUk5BTF9NQVBQSU5HX09QVElPTiA9ICJlbSI7Ci0gICAgICAgIFN0cmluZyBFWFRFUk5BTF9NQVBQSU5HX09QVElPTl9MT05HID0gImV4dGVybmFsLW1hcHBpbmciOwotICAgICAgICBTdHJpbmcgRkxBVFRFTl9GSUxFU19PUFRJT04gPSAiZiI7Ci0gICAgICAgIFN0cmluZyBGTEFUVEVOX0ZJTEVTX09QVElPTl9MT05HID0gImZsYXR0ZW4tZmlsZXMiOwotICAgICAgICBTdHJpbmcgR0VORVJBVEVfQUxMX09QVElPTiA9ICJnIjsKLSAgICAgICAgU3RyaW5nIEdFTkVSQVRFX0FMTF9PUFRJT05fTE9ORyA9ICJnZW5lcmF0ZS1hbGwiOwotICAgICAgICBTdHJpbmcgR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04gPSAic2QiOwotICAgICAgICBTdHJpbmcgR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT05fTE9ORyA9ICJzZXJ2aWNlLWRlc2NyaXB0aW9uIjsKLSAgICAgICAgU3RyaW5nIEdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04gPSAidCI7Ci0gICAgICAgIFN0cmluZyBHRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OX0xPTkcgPSAidGVzdC1jYXNlIjsKLSAgICAgICAgU3RyaW5nIE5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04gPSAibnMycCI7Ci0gICAgICAgIFN0cmluZyBOQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OX0xPTkcgPSAibmFtZXNwYWNlMnBhY2thZ2UiOwotICAgICAgICBTdHJpbmcgTk9fQlVJTERfWE1MX09QVElPTl9MT05HID0gIm5vQnVpbGRYTUwiOwotICAgICAgICBTdHJpbmcgTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORyA9ICJub01lc3NhZ2VSZWNlaXZlciI7Ci0gICAgICAgIFN0cmluZyBOT19XU0RMU19PUFRJT05fTE9ORyA9ICJub1dTREwiOwotICAgICAgICBTdHJpbmcgT1VUUFVUX0xPQ0FUSU9OX09QVElPTiA9ICJvIjsKLSAgICAgICAgU3RyaW5nIE9VVFBVVF9MT0NBVElPTl9PUFRJT05fTE9ORyA9ICJvdXRwdXQiOwotICAgICAgICBTdHJpbmcgT1ZFUlJJREVfT1BUSU9OID0gIm9yIjsKLSAgICAgICAgU3RyaW5nIE9WRVJSSURFX09QVElPTl9MT05HID0gIm92ZXItcmlkZSI7Ci0gICAgICAgIFN0cmluZyBFWENFUFRJT05fQkFTRV9DTEFTU19PUFRJT04gPSAiZWJjIjsKLSAgICAgICAgU3RyaW5nIEVYQ0VQVElPTl9CQVNFX0NMQVNTX09QVElPTl9MT05HID0gImV4Y2VwdGlvbi1iYXNlLWNsYXNzIjsKLSAgICAgICAgU3RyaW5nIE9WRVJSSURFX0FCU09MVVRFX0FERFJFU1NfT1BUSU9OID0gIm9hYSI7Ci0gICAgICAgIFN0cmluZyBPVkVSUklERV9BQlNPTFVURV9BRERSRVNTX09QVElPTl9MT05HID0gIm92ZXJyaWRlLWFic29sdXRlLWFkZHJlc3MiOwotICAgICAgICBTdHJpbmcgUEFDS0FHRV9PUFRJT04gPSAicCI7Ci0gICAgICAgIFN0cmluZyBQQUNLQUdFX09QVElPTl9MT05HID0gInBhY2thZ2UiOwotICAgICAgICBTdHJpbmcgUE9SVF9OQU1FX09QVElPTiA9ICJwbiI7Ci0gICAgICAgIFN0cmluZyBQT1JUX05BTUVfT1BUSU9OX0xPTkcgPSAicG9ydC1uYW1lIjsKLSAgICAgICAgU3RyaW5nIFJFUE9TSVRPUllfUEFUSF9PUFRJT04gPSAiciI7Ci0gICAgICAgIFN0cmluZyBSRVBPU0lUT1JZX1BBVEhfT1BUSU9OX0xPTkcgPSAicmVwb3NpdG9yeS1wYXRoIjsKLSAgICAgICAgU3RyaW5nIFJFU09VUkNFX0ZPTERFUl9PUFRJT04gPSAiUiI7Ci0gICAgICAgIFN0cmluZyBSRVNPVVJDRV9GT0xERVJfT1BUSU9OX0xPTkcgPSAicmVzb3VyY2UtZm9sZGVyIjsKLSAgICAgICAgU3RyaW5nIFNFUlZFUl9TSURFX0NPREVfT1BUSU9OID0gInNzIjsKLSAgICAgICAgU3RyaW5nIFNFUlZFUl9TSURFX0NPREVfT1BUSU9OX0xPTkcgPSAic2VydmVyLXNpZGUiOwotICAgICAgICBTdHJpbmcgU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiA9ICJzc2kiOwotICAgICAgICBTdHJpbmcgU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTl9MT05HID0gInNlcnZlcnNpZGUtaW50ZXJmYWNlIjsKLSAgICAgICAgU3RyaW5nIFNFUlZJQ0VfTkFNRV9PUFRJT04gPSAic24iOwotICAgICAgICBTdHJpbmcgU0VSVklDRV9OQU1FX09QVElPTl9MT05HID0gInNlcnZpY2UtbmFtZSI7Ci0gICAgICAgIFN0cmluZyBTT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OID0gIlMiOwotICAgICAgICBTdHJpbmcgU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTl9MT05HID0gInNvdXJjZS1mb2xkZXIiOwotICAgICAgICBTdHJpbmcgU1RVQl9MQU5HVUFHRV9PUFRJT04gPSAibCI7Ci0gICAgICAgIFN0cmluZyBTVFVCX0xBTkdVQUdFX09QVElPTl9MT05HID0gImxhbmd1YWdlIjsKLSAgICAgICAgU3RyaW5nIFNVUFBSRVNTX1BSRUZJWEVTX09QVElPTiA9ICJzcCI7Ci0gICAgICAgIFN0cmluZyBTVVBQUkVTU19QUkVGSVhFU19PUFRJT05fTE9ORyA9ICJzdXBwcmVzcy1wcmVmaXhlcyI7Ci0gICAgICAgIFN0cmluZyBVTlBBQ0tfQ0xBU1NFU19PUFRJT04gPSAidSI7Ci0gICAgICAgIFN0cmluZyBVTlBBQ0tfQ0xBU1NFU19PUFRJT05fTE9ORyA9ICJ1bnBhY2stY2xhc3NlcyI7Ci0gICAgICAgIFN0cmluZyBVTldSQVBfUEFSQU1FVEVSUyA9ICJ1dyI7Ci0gICAgICAgIFN0cmluZyBVTldSQVBfUEFSQU1FVEVSU19MT05HID0gInVud3JhcC1wYXJhbXMiOwotICAgICAgICBTdHJpbmcgV1NETF9MT0NBVElPTl9VUklfT1BUSU9OID0gInVyaSI7Ci0gICAgICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fT1BUSU9OID0gInd2IjsKLSAgICAgICAgU3RyaW5nIFdTRExfVkVSU0lPTl9PUFRJT05fTE9ORyA9ICJ3c2RsLXZlcnNpb24iOwotICAgICAgICBTdHJpbmcgSFRUUF9QUk9YWV9IT1NUX09QVElPTl9MT05HID0gImh0dHAtcHJveHktaG9zdCI7Ci0gICAgICAgIFN0cmluZyBIVFRQX1BST1hZX1BPUlRfT1BUSU9OX0xPTkcgPSAiaHR0cC1wcm94eS1wb3J0IjsKLSAgICAgICAgU3RyaW5nIEVYQ0xVREVfUEFLQUdFU19PUFRJT04gPSAiZXAiOwotICAgICAgICBTdHJpbmcgRVhDTFVERV9QQUtBR0VTX09QVElPTl9MT05HID0gImV4Y2x1ZGUtcGFja2FnZXMiOwotICAgICAgICBTdHJpbmcgU0tFTFRPTl9JTlRFUkZBQ0VfTkFNRV9PUFRJT04gPSAic2luIjsKLSAgICAgICAgU3RyaW5nIFNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OX0xPTkcgPSAic2tlbHRvbi1pbnRlcmZhY2UtbmFtZSI7Ci0gICAgICAgIFN0cmluZyBVU0VfT1BFUkFUSU9OX05BTUUgPSAidW9uIjsKLSAgICAgICAgU3RyaW5nIFVTRV9PUEVSQVRJT05fTkFNRV9MT05HID0gInVzZS1vcGVyYXRpb24tbmFtZSI7Ci0gICAgICAgIFN0cmluZyBTS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OID0gInNjbiI7Ci0gICAgICAgIFN0cmluZyBTS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OX0xPTkcgPSAic2tlbHRvbi1jbGFzcy1uYW1lIjsKLQotICAgICAgICBTdHJpbmcgSU5WQUxJRF9PUFRJT04gPSAiSU5WQUxJRF9PUFRJT04iOwotICAgICAgICBTdHJpbmcgRVhUUkFfT1BUSU9OVFlQRV9QUkVGSVggPSAiRSI7Ci0KLSAgICAgICAgU3RyaW5nIFdTRExfVkVSU0lPTl8yID0gIjIuMCI7Ci0gICAgICAgIFN0cmluZyBXU0RMX1ZFUlNJT05fMl9PUFRJT05BTCA9ICIyIjsKLSAgICAgICAgU3RyaW5nIFdTRExfVkVSU0lPTl8xID0gIjEuMSI7Ci0gICAgfQotCi0gICAgaW50ZXJmYWNlIEV4dGVuc2lvbkFyZ3VtZW50cyB7Ci0gICAgICAgIFN0cmluZyBXSVRIT1VUX0RBVEFCSU5EX0NPREUgPSAid2RjIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xFX0lOUFVUID0gIlNPTEVfSU5QVVQiOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb25QYXJzZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvbW1hbmRMaW5lT3B0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTVhYzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvQ29tbWFuZExpbmVPcHRpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZU9wdGlvblBhcnNlciBpbXBsZW1lbnRzIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzIHsKLQotICAgIC8vc3RhdGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFNUQVJURUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGludCBORVdfT1BUSU9OID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgU1VCX1BBUkFNX09GX09QVElPTiA9IDI7Ci0KLSAgICBwcml2YXRlIE1hcCBjb21tYW5kTGluZU9wdGlvbnM7Ci0KLSAgICBwdWJsaWMgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoTWFwIGNvbW1hbmRMaW5lT3B0aW9ucykgewotICAgICAgICB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucyA9IGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoU3RyaW5nW10gYXJncykgewotICAgICAgICB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucyA9IHRoaXMucGFyc2UoYXJncyk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBsaXN0IHdpdGggPGNvZGU+Q29tbWFuZExpbmVPcHRpb248L2NvZGU+IG9iamVjdHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmdzCi0gICAgICogQHJldHVybiBDb21tYW5kTGluZU9wdGlvbiBMaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgcGFyc2UoU3RyaW5nW10gYXJncykgewotICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBpZiAoMCA9PSBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU3RhdGUgMCBtZWFucyBzdGFydGVkCi0gICAgICAgIC8vU3RhdGUgMSBtZWFucyBlYXJsaWVyIG9uZSB3YXMgYSBuZXcgLW9wdGlvbgotICAgICAgICAvL1N0YXRlIDIgbWVhbnMgZWFybGllciBvbmUgd2FzIGEgc3ViIHBhcmFtIG9mIGEgLW9wdGlvbgotCi0gICAgICAgIGludCBzdGF0ZSA9IFNUQVJURUQ7Ci0gICAgICAgIEFycmF5TGlzdCBvcHRpb25CdW5kbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3B0aW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uIGNvbW1hbmRMaW5lT3B0aW9uOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoU1RBUlRFRCA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBmcmVzaCBvbmUKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBORVdfT1BUSU9OOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25UeXBlID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNVQl9QQVJBTV9PRl9PUFRJT04gPT0gc3RhdGUgfHwgTkVXX09QVElPTiA9PSBzdGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBuZXcgb25lIGJ1dCBvbGQgb25lIHNob3VsZCBiZSBzYXZlZAotICAgICAgICAgICAgICAgICAgICBjb21tYW5kTGluZU9wdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKG9wdGlvblR5cGUsIG9wdGlvbkJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9ucy5wdXQoY29tbWFuZExpbmVPcHRpb24uZ2V0T3B0aW9uVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBORVdfT1BUSU9OOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25UeXBlID0gYXJnc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFNUQVJURUQgPT0gc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLlNPTEVfSU5QVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZExpbmVPcHRpb25zOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChORVdfT1BUSU9OID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbkJ1bmRsZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uQnVuZGxlLmFkZChhcmdzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVUJfUEFSQU1fT0ZfT1BUSU9OOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTVUJfUEFSQU1fT0ZfT1BUSU9OID09IHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbkJ1bmRsZS5hZGQoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0KLSAgICAgICAgY29tbWFuZExpbmVPcHRpb24gPSBuZXcgQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uVHlwZSwgb3B0aW9uQnVuZGxlKTsKLSAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChjb21tYW5kTGluZU9wdGlvbi5nZXRPcHRpb25UeXBlKCksIGNvbW1hbmRMaW5lT3B0aW9uKTsKLSAgICAgICAgcmV0dXJuIGNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEFsbE9wdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbW1hbmRMaW5lT3B0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbnZhbGlkT3B0aW9ucyhPcHRpb25zVmFsaWRhdG9yIHZhbGlkYXRvcikgewotICAgICAgICBMaXN0IGZhdWx0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmNvbW1hbmRMaW5lT3B0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbiBjb21tYW5kTGluZU9wdGlvbiA9ICgoQ29tbWFuZExpbmVPcHRpb24pIChpdGVyYXRvci5uZXh0KCkpKTsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0b3IuaXNJbnZhbGlkKGNvbW1hbmRMaW5lT3B0aW9uKSkgewotICAgICAgICAgICAgICAgIGZhdWx0TGlzdC5hZGQoY29tbWFuZExpbmVPcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhdWx0TGlzdDsKLSAgICB9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvdW50ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0NvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwYTAyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Db3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzaW1wbGUgemVyby1iYXNlZCBjb3VudGVyIHdpdGggc3luY2hyb25pemVkIGFjY2Vzcy4KLSAqLwotcHVibGljIGNsYXNzIENvdW50ZXIgewotCi0gICAgcHJpdmF0ZSBsb25nIHZhbHVlID0gMEw7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgaW5jcmVtZW50QW5kR2V0KCkgewotICAgICAgICByZXR1cm4gKyt2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZGVjcmVtZW50QW5kR2V0KCkgewotICAgICAgICBpZiAodmFsdWUgPiAwTCkgewotICAgICAgICAgICAgcmV0dXJuIC0tdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIHZhbHVlID0gMEw7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRGVmYXVsdEVudGl0eVJlc29sdmVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9EZWZhdWx0RW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhM2FhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9EZWZhdWx0RW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciB7Ci0gICAgcHVibGljIERlZmF1bHRFbnRpdHlSZXNvbHZlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotICAgICAgICByZXR1cm4gWE1MVXRpbHMuZ2V0RW1wdHlJbnB1dFNvdXJjZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0V4dGVybmFsUG9saWN5U2VyaWFsaXplci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljY2UyOGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyIHsKLQotICAgIHByaXZhdGUgTGlzdCBhc3NlcnRpb25zMkZpbHRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblRvRmlsdGVyKFFOYW1lIG5hbWUpIHsKLSAgICAgICAgYXNzZXJ0aW9uczJGaWx0ZXIuYWRkKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvbnNUb0ZpbHRlcihMaXN0IGFzc2VydGlvbnMyRmlsdGVyKSB7Ci0gICAgICAgIHRoaXMuYXNzZXJ0aW9uczJGaWx0ZXIgPSBhc3NlcnRpb25zMkZpbHRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBc3NlcnRpb25zVG9GaWx0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBhc3NlcnRpb25zMkZpbHRlcjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShQb2xpY3kgcG9saWN5LCBPdXRwdXRTdHJlYW0gb3MpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG9zKTsKLSAgICAgICAgICAgIHBvbGljeSA9IChQb2xpY3kpIHBvbGljeS5ub3JtYWxpemUoZmFsc2UpOwotCi0gICAgICAgICAgICBTdHJpbmcgd3NwUHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChDb25zdGFudHMuVVJJX1BPTElDWV9OUyk7Ci0KLQkJCWlmICh3c3BQcmVmaXggPT0gbnVsbCkgewotCQkJCXdzcFByZWZpeCA9IENvbnN0YW50cy5BVFRSX1dTUDsKLQkJCQl3cml0ZXIuc2V0UHJlZml4KHdzcFByZWZpeCwgQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMpOwotCQkJfQotCi0JCQlTdHJpbmcgd3N1UHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChDb25zdGFudHMuVVJJX1dTVV9OUyk7Ci0JCQlpZiAod3N1UHJlZml4ID09IG51bGwpIHsKLQkJCQl3c3VQcmVmaXggPSBDb25zdGFudHMuQVRUUl9XU1U7Ci0JCQkJd3JpdGVyLnNldFByZWZpeCh3c3VQcmVmaXgsIENvbnN0YW50cy5VUklfV1NVX05TKTsKLQkJCX0KLQotCQkJd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHdzcFByZWZpeCwgQ29uc3RhbnRzLkVMRU1fUE9MSUNZLAotCQkJCQlDb25zdGFudHMuVVJJX1BPTElDWV9OUyk7Ci0KLQkJCVFOYW1lIGtleTsKLQotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gbnVsbDsKLQkJCVN0cmluZyBsb2NhbE5hbWUgPSBudWxsOwotCi0JCQlIYXNoTWFwIHByZWZpeDJucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwb2xpY3kuZ2V0QXR0cmlidXRlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0KLQkJCQlrZXkgPSAoUU5hbWUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlsb2NhbE5hbWUgPSBrZXkuZ2V0TG9jYWxQYXJ0KCk7Ci0KLQkJCQluYW1lc3BhY2VVUkkgPSBrZXkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkJbmFtZXNwYWNlVVJJID0gKG5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSS5sZW5ndGgoKSA9PSAwKSA/IG51bGwKLQkJCQkJCTogbmFtZXNwYWNlVVJJOwotCi0JCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0KLQkJCQkJU3RyaW5nIHdyaXRlclByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlVVJJKTsKLQkJCQkJd3JpdGVyUHJlZml4ID0gKHdyaXRlclByZWZpeCA9PSBudWxsIHx8IHdyaXRlclByZWZpeAotCQkJCQkJCS5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiB3cml0ZXJQcmVmaXg7Ci0KLQkJCQkJaWYgKHdyaXRlclByZWZpeCA9PSBudWxsKSB7Ci0JCQkJCQlwcmVmaXggPSBrZXkuZ2V0UHJlZml4KCk7Ci0JCQkJCQlwcmVmaXggPSAocHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpID09IDApID8gbnVsbAotCQkJCQkJCQk6IHByZWZpeDsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJlZml4ID0gd3JpdGVyUHJlZml4OwotCQkJCQl9Ci0KLQkJCQkJaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0JCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUocHJlZml4LCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwKLQkJCQkJCQkJcG9saWN5LmdldEF0dHJpYnV0ZShrZXkpKTsKLQkJCQkJCXByZWZpeDJucy5wdXQocHJlZml4LCBrZXkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHBvbGljeQotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKGtleSkpOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZXIud3JpdGVBdHRyaWJ1dGUobG9jYWxOYW1lLCBwb2xpY3kuZ2V0QXR0cmlidXRlKGtleSkpOwotCQkJCX0KLQotCQkJfQotCi0JCQkvLyB3cml0ZXMgeG1sbnM6d3NwPSIuLiIKLQkJCXdyaXRlci53cml0ZU5hbWVzcGFjZSh3c3BQcmVmaXgsIENvbnN0YW50cy5VUklfUE9MSUNZX05TKTsKLQotCQkJU3RyaW5nIHByZWZpWDsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZWZpeDJucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXByZWZpWCA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZmlYLCAoU3RyaW5nKSBwcmVmaXgybnMuZ2V0KHByZWZpWCkpOwotCQkJfQotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoQ29uc3RhbnRzLkFUVFJfV1NQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5FTEVNX0VYQUNUTFlPTkUsIENvbnN0YW50cy5VUklfUE9MSUNZX05TKTsKLSAgICAgICAgICAgIC8vIHdyaXRlIDx3c3A6RXhhY3RseU9uZT4KLQotICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25MaXN0OwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9saWN5LmdldEFsdGVybmF0aXZlcygpOyBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCi0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uTGlzdCA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyB3cml0ZSA8d3NwOkFsbD4KLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoQ29uc3RhbnRzLkFUVFJfV1NQLCBDb25zdGFudHMuRUxFTV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfUE9MSUNZX05TKTsKLQotICAgICAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb247Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGFzc2VydGlvbnMgPSBhc3NlcnRpb25MaXN0Lml0ZXJhdG9yKCk7IGFzc2VydGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbiA9IChBc3NlcnRpb24pIGFzc2VydGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXNzZXJ0aW9uczJGaWx0ZXIuY29udGFpbnMoYXNzZXJ0aW9uLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gYXNzZXJ0aW9uIHRvIGZpbHRlciwgd2Ugd2lsbCBub3Qgc2VyaWFsaXplIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbi5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3cml0ZSA8L3dzcDpBbGw+Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSA8L3dzcDpFeGFjdGx5T25lPgotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgLy8gd3JpdGUgPC93c3A6UG9saWN5PgotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9GaWxlV3JpdGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9GaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzk2YTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvRmlsZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmlsZVdyaXRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLyByZXR1cm5zIGEgZmlsZSBvYmplY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSByb290TG9jYXRpb24gLSBMb2NhdGlvbiB0byBiZSB3cml0dGVuCi0gICAgICogQHBhcmFtIHBhY2thZ2VOYW1lICAtIHBhY2thZ2UsIGNhbiBiZSAnLicgc2VwYXJhdGVkCi0gICAgICogQHBhcmFtIGZpbGVOYW1lICAgICBuYW1lIG9mIHRoZSBmaWxlCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiAgICB0eXBlIG9mIHRoZSBmaWxlLCBqYXZhLCBjcHAgZXRjCi0gICAgICogQHJldHVybiB0aGUgRmlsZSB0aGF0IHdhcyBjcmVhdGVkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZUNsYXNzRmlsZShGaWxlIHJvb3RMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHRlbnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgcmV0dXJuRmlsZSA9IG51bGw7Ci0gICAgICAgIEZpbGUgcm9vdCA9IHJvb3RMb2NhdGlvbjsKLQotICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeU5hbWVzW10gPSBwYWNrYWdlTmFtZS5zcGxpdCgiXFwuIik7Ci0gICAgICAgICAgICBGaWxlIHRlbXBGaWxlID0gbnVsbDsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBkaXJlY3RvcnlOYW1lcy5sZW5ndGg7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGVtcEZpbGUgPSBuZXcgRmlsZShyb290LCBkaXJlY3RvcnlOYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IHRlbXBGaWxlOwotICAgICAgICAgICAgICAgIGlmICghdGVtcEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGUubWtkaXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGV4dGVuc2lvbiAhPSBudWxsKSAmJiAhZmlsZU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZSArIGV4dGVuc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybkZpbGUgPSBuZXcgRmlsZShyb290LCBmaWxlTmFtZSk7Ci0KLSAgICAgICAgaWYgKCFyZXR1cm5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAvLyByZXR1cm5GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuRmlsZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSG9zdENvbmZpZ3VyYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0hvc3RDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmQxY2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSG9zdENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi0vL3RvIGtlZXAgaW5mb3IgZ2V0dGluZyBmcm9tIGF4aXMyLnhtbAotCi1wdWJsaWMgY2xhc3MgSG9zdENvbmZpZ3VyYXRpb24gewotICAgIHByaXZhdGUgU3RyaW5nIGlwOwotICAgIHByaXZhdGUgaW50IHBvcnQ7Ci0KLSAgICBwdWJsaWMgSG9zdENvbmZpZ3VyYXRpb24oU3RyaW5nIGlwLCBpbnQgcG9ydCkgewotICAgICAgICB0aGlzLmlwID0gaXA7Ci0gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJcCgpIHsKLSAgICAgICAgcmV0dXJuIGlwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSU9VdGlscy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSU9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTljYzA3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0lPVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgSU9VdGlscyB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29waWVzIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiAgdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPgotICAgICAqIEBwYXJhbSBvdXQgdGhlIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4KLSAgICAgKiBAcGFyYW0gY2xvc2UgY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBjbG9zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gaW4ucmVhZChidWZmZXIpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICB0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgICAgIHRyeSB7IG91dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSmF2YVV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNmJhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBKYXZhVXRpbHMKLSAqLwotcHVibGljIGNsYXNzIEphdmFVdGlscyB7Ci0gICAgLyoqCi0gICAgICogVGhlc2UgYXJlIGphdmEga2V5d29yZHMgYXMgc3BlY2lmaWVkIGF0IHRoZSBmb2xsb3dpbmcgVVJMIChzb3J0ZWQgYWxwaGFiZXRpY2FsbHkpLgotICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzIyOTMwOAotICAgICAqIE5vdGUgdGhhdCBmYWxzZSwgdHJ1ZSwgYW5kIG51bGwgYXJlIG5vdCBzdHJpY3RseSBrZXl3b3JkczsgdGhleSBhcmUgbGl0ZXJhbCB2YWx1ZXMsCi0gICAgICogYnV0IGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBhcnJheSwgdGhleSBjYW4gYmUgdHJlYXRlZCBhcyBsaXRlcmFscy4KLSAgICAgKiAqKioqKiogUExFQVNFIEtFRVAgVEhJUyBMSVNUIFNPUlRFRCBJTiBBU0NFTkRJTkcgT1JERVIgKioqKioqCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXl3b3Jkc1tdID0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgImFic3RyYWN0IiwgImFzc2VydCIsICJib29sZWFuIiwgImJyZWFrIiwgImJ5dGUiLCAiY2FzZSIsCi0gICAgICAgICAgICAgICAgICAgICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbnN0IiwgImNvbnRpbnVlIiwKLSAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiLCAiZG8iLCAiZG91YmxlIiwgImVsc2UiLCAiZXh0ZW5kcyIsCi0gICAgICAgICAgICAgICAgICAgICJmYWxzZSIsICJmaW5hbCIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsCi0gICAgICAgICAgICAgICAgICAgICJnb3RvIiwgImlmIiwgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluc3RhbmNlb2YiLAotICAgICAgICAgICAgICAgICAgICAiaW50IiwgImludGVyZmFjZSIsICJsb25nIiwgIm5hdGl2ZSIsICJuZXciLAotICAgICAgICAgICAgICAgICAgICAibnVsbCIsICJwYWNrYWdlIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsCi0gICAgICAgICAgICAgICAgICAgICJyZXR1cm4iLCAic2hvcnQiLCAic3RhdGljIiwgInN0cmljdGZwIiwgInN1cGVyIiwKLSAgICAgICAgICAgICAgICAgICAgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhpcyIsICJ0aHJvdyIsICJ0aHJvd3MiLAotICAgICAgICAgICAgICAgICAgICAidHJhbnNpZW50IiwgInRydWUiLCAidHJ5IiwgInZvaWQiLCAidm9sYXRpbGUiLAotICAgICAgICAgICAgICAgICAgICAid2hpbGUiCi0gICAgICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ29sbGF0b3IgZm9yIGNvbXBhcmluZyB0aGUgc3RyaW5ncwotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBlbmdsaXNoQ29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBjaGFyYWN0ZXIgYXMgc3VmZml4Ci0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGNoYXIga2V5d29yZFByZWZpeCA9ICdfJzsKLQotICAgIC8qKgotICAgICAqIElzIHRoaXMgYW4gWE1MIHB1bmN0dWF0aW9uIGNoYXJhY3Rlcj8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHVuY3R1YXRpb24oY2hhciBjKSB7Ci0gICAgICAgIHJldHVybiAnLScgPT0gYwotICAgICAgICAgICAgICAgIHx8ICcuJyA9PSBjCi0gICAgICAgICAgICAgICAgfHwgJzonID09IGMKLSAgICAgICAgICAgICAgICB8fCAnXHUwMEI3JyA9PSBjCi0gICAgICAgICAgICAgICAgfHwgJ1x1MDM4NycgPT0gYwotICAgICAgICAgICAgICAgIHx8ICctJyA9PSBjCi0gICAgICAgICAgICAgICAgfHwgJ1x1MDZERCcgPT0gYwotICAgICAgICAgICAgICAgIHx8ICdcdTA2REUnID09IGM7Ci0gICAgfSAvLyBpc1B1bmN0dWF0aW9uCi0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHN0cmluZyBpcyBhIHZhbGlkIGphdmEga2V5d29yZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBib29sZWFuLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFLZXl3b3JkKFN0cmluZyBrZXl3b3JkKSB7Ci0gICAgICAgIC8vIE5vbmUgb2YgdGhlIGphdmEga2V5d29yZHMgaGF2ZSB1cHBlcmNhc2UgY2hhcmFjdGVycwotICAgICAgICBpZiAoaGFzVXBwZXJDYXNlKGtleXdvcmQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChBcnJheXMuYmluYXJ5U2VhcmNoKGtleXdvcmRzLCBrZXl3b3JkLCBlbmdsaXNoQ29sbGF0b3IpID49IDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSB3b3JkIGhhcyBhbnkgdXBwZXJjYXNlIGxldHRlcnMKLSAgICAgKgotICAgICAqIEBwYXJhbSB3b3JkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNVcHBlckNhc2UoU3RyaW5nIHdvcmQpIHsKLSAgICAgICAgaWYgKHdvcmQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW4gPSB3b3JkLmxlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHdvcmQuY2hhckF0KGkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUdXJucyBhIGphdmEga2V5d29yZCBzdHJpbmcgaW50byBhIG5vbi1KYXZhIGtleXdvcmQgc3RyaW5nLiAgKFJpZ2h0IG5vdwotICAgICAqIHRoaXMgc2ltcGx5IG1lYW5zIGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlLikKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlTm9uSmF2YUtleXdvcmQoU3RyaW5nIGtleXdvcmQpIHsKLSAgICAgICAgcmV0dXJuIGtleXdvcmRQcmVmaXggKyBrZXl3b3JkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbE5hbWVUb0phdmEoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgLy8gcHJvdGVjdCBvdXJzZWx2ZXMgZnJvbSBnYXJiYWdlCi0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXJbXSBuYW1lQXJyYXkgPSBuYW1lLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGludCBuYW1lTGVuID0gbmFtZS5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZUxlbik7Ci0gICAgICAgIGJvb2xlYW4gd29yZFN0YXJ0ID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gVGhlIG1hcHBpbmcgaW5kaWNhdGVzIHRvIGNvbnZlcnQgZmlyc3QgY2hhcmFjdGVyLgotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChpIDwgbmFtZUxlbgotICAgICAgICAgICAgICAgICYmIChpc1B1bmN0dWF0aW9uKG5hbWVBcnJheVtpXSkKLSAgICAgICAgICAgICAgICB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChuYW1lQXJyYXlbaV0pKSkgewotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpIDwgbmFtZUxlbikgewotICAgICAgICAgICAgLy8gRGVjYXBpdGFsaXphdGlvbiBjb2RlIHVzZWQgdG8gYmUgaGVyZSwgYnV0IHdlIHVzZSB0aGUKLSAgICAgICAgICAgIC8vIEludHJvc3BlY3RvciBmdW5jdGlvbiBub3cgYWZ0ZXIgd2UgZmlsdGVyIG91dCBhbGwgYmFkIGNoYXJzLgotCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKG5hbWVBcnJheVtpXSk7Ci0gICAgICAgICAgICAvL3dvcmRTdGFydCA9ICFDaGFyYWN0ZXIuaXNMZXR0ZXIobmFtZUFycmF5W2ldKTsKLSAgICAgICAgICAgIHdvcmRTdGFydCA9ICFDaGFyYWN0ZXIuaXNMZXR0ZXIobmFtZUFycmF5W2ldKSAmJiBuYW1lQXJyYXlbaV0gIT0gIl8iLmNoYXJBdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZSBpZGVudGlmaWVyIGNhbm5vdCBiZSBtYXBwZWQgc3RyaWN0bHkgYWNjb3JkaW5nIHRvCi0gICAgICAgICAgICAvLyBKU1IgMTAxCi0gICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWVBcnJheVswXSkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJfIikuYXBwZW5kKG5hbWVBcnJheVswXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBYTUwgaWRlbnRpZmllciBkb2VzIG5vdCBjb250YWluIGFueSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAgICAgLy8gd2UgY2FuIG1hcCB0byBKYXZhLiAgVXNpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgICAgLy8gd2lsbCBtYWtlIGl0IHNvbWV3aGF0IHVuaXF1ZS4KLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJfIikuYXBwZW5kKG5hbWVBcnJheS5sZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIG1hcHBpbmcgaW5kaWNhdGVzIHRvIHNraXAgb3ZlcgotICAgICAgICAvLyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgbGV0dGVycyBvcgotICAgICAgICAvLyBkaWdpdHMuICBUaGUgZmlyc3QgbGV0dGVyL2RpZ2l0Ci0gICAgICAgIC8vIGZvbGxvd2luZyBhIHNraXBwZWQgY2hhcmFjdGVyIGlzCi0gICAgICAgIC8vIHVwcGVyLWNhc2VkLgotICAgICAgICBmb3IgKCsraTsgaSA8IG5hbWVMZW47ICsraSkgewotICAgICAgICAgICAgY2hhciBjID0gbmFtZUFycmF5W2ldOwotCi0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgYmFkIGNoYXIsIHNraXAgaXQgYW5kIHJlbWVtYmVyIHRvIGNhcGl0YWxpemUgbmV4dAotICAgICAgICAgICAgLy8gZ29vZCBjaGFyYWN0ZXIgd2UgZW5jb3VudGVyCi0gICAgICAgICAgICBpZiAoaXNQdW5jdHVhdGlvbihjKSB8fCAhQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0gICAgICAgICAgICAgICAgd29yZFN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh3b3JkU3RhcnQgJiYgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSWYgYyBpcyBub3QgYSBjaGFyYWN0ZXIsIGJ1dCBpcyBhIGxlZ2FsIEphdmEKLSAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2hhcmFjdGVyLCBjYXBpdGFsaXplIHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiAgIjIyaGkiIGJlY29tZXMgIjIySGkiCi0gICAgICAgICAgICAvL3dvcmRTdGFydCA9ICFDaGFyYWN0ZXIuaXNMZXR0ZXIoYyk7Ci0gICAgICAgICAgICB3b3JkU3RhcnQgPSAhQ2hhcmFjdGVyLmlzTGV0dGVyKGMpICYmIGMgIT0gIl8iLmNoYXJBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvdmVydCBiYWNrIHRvIGEgU3RyaW5nCi0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZm9yIEphdmEga2V5d29yZHMKLSAgICAgICAgaWYgKGlzSmF2YUtleXdvcmQobmV3TmFtZSkpIHsKLSAgICAgICAgICAgIG5ld05hbWUgPSBtYWtlTm9uSmF2YUtleXdvcmQobmV3TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3TmFtZTsKLSAgICB9IC8vIHhtbE5hbWVUb0phdmEKLQotICAgIC8qKgotICAgICAqIENhcGl0YWxpemVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZUZpcnN0Q2hhcihTdHJpbmcgbmFtZSkgewotCi0gICAgICAgIGlmICgobmFtZSA9PSBudWxsKSB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciBzdGFydCA9IG5hbWUuY2hhckF0KDApOwotCi0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RhcnQpKSB7Ci0gICAgICAgICAgICBzdGFydCA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdGFydCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdGFydCArIG5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfSAgICAvLyBjYXBpdGFsaXplRmlyc3RDaGFyCi0KLSAgICAvKioKLSAgICAgKiBjb252ZXJ0cyBhbiB4bWwgbmFtZSB0byBhIGphdmEgaWRlbnRpZmllcgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcmV0dXJuIGphdmEgaWRlbnRpZmllcgotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIGphdmFOYW1lID0geG1sTmFtZVRvSmF2YShuYW1lKTsKLSAgICAgICAgLy8gY29udmVydCB0aGUgZmlyc3QgbGV0dGVyIHRvIGxvd2VyY2FzZQotICAgICAgICBpZiAoKGphdmFOYW1lICE9IG51bGwpICYmIChqYXZhTmFtZS5sZW5ndGgoKSA+IDApKSB7Ci0gICAgICAgICAgICBqYXZhTmFtZSA9IGphdmFOYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsgamF2YU5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGphdmFOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBTdHJpbmcgJ3ZhbHVlJzoKLSAgICAgKiByZXR1cm4gJ2ZhbHNlJyBpZiBpdHMgJ2ZhbHNlJywgJzAnLCBvciAnbm8nIC0gZWxzZSAndHJ1ZScKLSAgICAgKiA8cC8+Ci0gICAgICogRm9sbG93IGluICdDJyB0cmFkaXRpb24gb2YgYm9vbGVhbiB2YWx1ZXM6Ci0gICAgICogZmFsc2UgaXMgc3BlY2lmaWMgKDApLCBldmVyeXRoaW5nIGVsc2UgaXMgdHJ1ZTsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gIWlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgU3RyaW5nICd2YWx1ZSc6Ci0gICAgICogcmV0dXJuICd0cnVlJyBpZiBpdHMgJ3RydWUnLCAnMScsIG9yICd5ZXMnIC0gZWxzZSAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUV4cGxpY2l0bHkoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZXF1YWxzKCIxIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgT2JqZWN0ICd2YWx1ZSc6Ci0gICAgICogaWYgaXRzIG51bGwsIHJldHVybiBkZWZhdWx0LgotICAgICAqIGlmIGl0cyBhIEJvb2xlYW4sIHJldHVybiBib29sZWFuVmFsdWUoKQotICAgICAqIGlmIGl0cyBhbiBJbnRlZ2VyLCAgcmV0dXJuICdmYWxzZScgaWYgaXRzICcwJyBlbHNlICd0cnVlJwotICAgICAqIGlmIGl0cyBhIFN0cmluZywgcmV0dXJuIGlzVHJ1ZUV4cGxpY2l0bHkoKFN0cmluZyl2YWx1ZSkuCi0gICAgICogQWxsIG90aGVyIHR5cGVzIHJldHVybiAndHJ1ZScKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcnVlRXhwbGljaXRseShPYmplY3QgdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbCkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNUcnVlRXhwbGljaXRseSgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUV4cGxpY2l0bHkoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpc1RydWVFeHBsaWNpdGx5KHZhbHVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIE9iamVjdCAndmFsdWUnOgotICAgICAqIGlmIGl0cyBudWxsLCByZXR1cm4gZGVmYXVsdC4KLSAgICAgKiBpZiBpdHMgYSBCb29sZWFuLCByZXR1cm4gYm9vbGVhblZhbHVlKCkKLSAgICAgKiBpZiBpdHMgYW4gSW50ZWdlciwgIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnMCcgZWxzZSAndHJ1ZScKLSAgICAgKiBpZiBpdHMgYSBTdHJpbmcsIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnZmFsc2UnLCAnbm8nLCBvciAnMCcgLSBlbHNlICd0cnVlJwotICAgICAqIEFsbCBvdGhlciB0eXBlcyByZXR1cm4gJ3RydWUnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShPYmplY3QgdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbCkgewotICAgICAgICByZXR1cm4gIWlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlLCAhZGVmYXVsdFZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzVHJ1ZSh2YWx1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBTdHJpbmcgJ3ZhbHVlJzoKLSAgICAgKiByZXR1cm4gJ3RydWUnIGlmIGl0cyAnZmFsc2UnLCAnMCcsIG9yICdubycgLSBlbHNlICdmYWxzZScKLSAgICAgKiA8cC8+Ci0gICAgICogRm9sbG93IGluICdDJyB0cmFkaXRpb24gb2YgYm9vbGVhbiB2YWx1ZXM6Ci0gICAgICogZmFsc2UgaXMgc3BlY2lmaWMgKDApLCBldmVyeXRoaW5nIGVsc2UgaXMgdHJ1ZTsKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWxzZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgU3RyaW5nICd2YWx1ZSc6Ci0gICAgICogcmV0dXJuICd0cnVlJyBpZiBpdHMgbnVsbCwgJ2ZhbHNlJywgJzAnLCBvciAnbm8nIC0gZWxzZSAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFsc2VFeHBsaWNpdGx5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikgfHwKLSAgICAgICAgICAgICAgICB2YWx1ZS5lcXVhbHMoIjAiKSB8fAotICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIm5vIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIE9iamVjdCAndmFsdWUnOgotICAgICAqIGlmIGl0cyBudWxsLCByZXR1cm4gZGVmYXVsdC4KLSAgICAgKiBpZiBpdHMgYSBCb29sZWFuLCByZXR1cm4gIWJvb2xlYW5WYWx1ZSgpCi0gICAgICogaWYgaXRzIGFuIEludGVnZXIsICByZXR1cm4gJ3RydWUnIGlmIGl0cyAnMCcgZWxzZSAnZmFsc2UnCi0gICAgICogaWYgaXRzIGEgU3RyaW5nLCByZXR1cm4gaXNGYWxzZUV4cGxpY2l0bHkoKFN0cmluZyl2YWx1ZSkuCi0gICAgICogQWxsIG90aGVyIHR5cGVzIHJldHVybiAnZmFsc2UnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFsc2VFeHBsaWNpdGx5KE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgICByZXR1cm4gISgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpID09IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNGYWxzZUV4cGxpY2l0bHkoKFN0cmluZykgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWxzZUV4cGxpY2l0bHkoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBpc0ZhbHNlRXhwbGljaXRseSh2YWx1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIE9iamVjdCAndmFsdWUnOgotICAgICAqIGlmIGl0cyBudWxsLCByZXR1cm4gZGVmYXVsdC4KLSAgICAgKiBpZiBpdHMgYSBCb29sZWFuLCByZXR1cm4gYm9vbGVhblZhbHVlKCkKLSAgICAgKiBpZiBpdHMgYW4gSW50ZWdlciwgIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnMCcgZWxzZSAndHJ1ZScKLSAgICAgKiBpZiBpdHMgYSBTdHJpbmcsIHJldHVybiAnZmFsc2UnIGlmIGl0cyAnZmFsc2UnLCAnbm8nLCBvciAnMCcgLSBlbHNlICd0cnVlJwotICAgICAqIEFsbCBvdGhlciB0eXBlcyByZXR1cm4gJ3RydWUnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmFsc2UoT2JqZWN0IHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWwpIHsKLSAgICAgICAgcmV0dXJuIGlzRmFsc2VFeHBsaWNpdGx5KHZhbHVlLCBkZWZhdWx0VmFsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYWxzZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGlzRmFsc2UodmFsdWUsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCB8fCBpc0phdmFLZXl3b3JkKGlkKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChpZC5jaGFyQXQoMCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpZC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChpZC5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIGVtcHR5IGltbXV0YWJsZSA8Y29kZT5TdHJpbmc8L2NvZGU+IGFycmF5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotICAgIC8qKgotICAgICAqIDxwPlNwbGl0cyB0aGUgcHJvdmlkZWQgdGV4dCBpbnRvIGFuIGFycmF5LCBzZXBhcmF0b3Igc3BlY2lmaWVkLgotICAgICAqIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgU3RyaW5nVG9rZW5pemVyLjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHA+VGhlIHNlcGFyYXRvciBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIFN0cmluZyBhcnJheS4KLSAgICAgKiBBZGphY2VudCBzZXBhcmF0b3JzIGFyZSB0cmVhdGVkIGFzIG9uZSBzZXBhcmF0b3IuPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD5BIDxjb2RlPm51bGw8L2NvZGU+IGlucHV0IFN0cmluZyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LjwvcD4KLSAgICAgKiA8cC8+Ci0gICAgICogPHByZT4KLSAgICAgKiBTdHJpbmdVdGlscy5zcGxpdChudWxsLCAqKSAgICAgICAgID0gbnVsbAotICAgICAqIFN0cmluZ1V0aWxzLnNwbGl0KCIiLCAqKSAgICAgICAgICAgPSBbXQotICAgICAqIFN0cmluZ1V0aWxzLnNwbGl0KCJhLmIuYyIsICcuJykgICAgPSBbImEiLCAiYiIsICJjIl0KLSAgICAgKiBTdHJpbmdVdGlscy5zcGxpdCgiYS4uYi5jIiwgJy4nKSAgID0gWyJhIiwgImIiLCAiYyJdCi0gICAgICogU3RyaW5nVXRpbHMuc3BsaXQoImE6YjpjIiwgJy4nKSAgICA9IFsiYTpiOmMiXQotICAgICAqIFN0cmluZ1V0aWxzLnNwbGl0KCJhXHRiXG5jIiwgbnVsbCkgPSBbImEiLCAiYiIsICJjIl0KLSAgICAgKiBTdHJpbmdVdGlscy5zcGxpdCgiYSBiIGMiLCAnICcpICAgID0gWyJhIiwgImIiLCAiYyJdCi0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyICAgICAgICAgICB0aGUgU3RyaW5nIHRvIHBhcnNlLCBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBzZXBhcmF0b3JDaGFyIHRoZSBjaGFyYWN0ZXIgdXNlZCBhcyB0aGUgZGVsaW1pdGVyLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHNwbGl0cyBvbiB3aGl0ZXNwYWNlCi0gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBwYXJzZWQgU3RyaW5ncywgPGNvZGU+bnVsbDwvY29kZT4gaWYgbnVsbCBTdHJpbmcgaW5wdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0KFN0cmluZyBzdHIsIGNoYXIgc2VwYXJhdG9yQ2hhcikgewotICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgICAgICAgfQotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGludCBpID0gMCwgc3RhcnQgPSAwOwotICAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChpIDwgbGVuKSB7Ci0gICAgICAgICAgICBpZiAoc3RyLmNoYXJBdChpKSA9PSBzZXBhcmF0b3JDaGFyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSArK2k7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hdGNoKSB7Ci0gICAgICAgICAgICBsaXN0LmFkZChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldFdyYXBwZXJDbGFzcyhDbGFzcyBwcmltaXRpdmUpIHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZSA9PSBpbnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuSW50ZWdlci5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUgPT0gc2hvcnQuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuU2hvcnQuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlID09IGJvb2xlYW4uY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUgPT0gYnl0ZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5CeXRlLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBsb25nLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkxvbmcuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlID09IGRvdWJsZS5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5Eb3VibGUuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlID09IGZsb2F0LmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkZsb2F0LmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZSA9PSBjaGFyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0V3JhcHBlckNsYXNzKFN0cmluZyBwcmltaXRpdmUpIHsKLSAgICAgICAgaWYgKHByaW1pdGl2ZS5lcXVhbHMoImludCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YS5sYW5nLkludGVnZXIuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLmVxdWFscygic2hvcnQiKSkgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5TaG9ydC5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJib29sZWFuIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJieXRlIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQnl0ZS5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJsb25nIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuTG9uZy5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJkb3VibGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5Eb3VibGUuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLmVxdWFscygiZmxvYXQiKSkgewotICAgICAgICAgICAgcmV0dXJuIGphdmEubGFuZy5GbG9hdC5jbGFzczsKLSAgICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUuZXF1YWxzKCJjaGFyIikpIHsKLSAgICAgICAgICAgIHJldHVybiBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2NhbnMgdGhlIHBhcmFtZXRlciBzdHJpbmcgZm9yIHRoZSBwYXJhbWV0ZXIgc2VhcmNoIGlnbm9yaW5nIGNhc2Ugd2hlbgotICAgICAqIGNvbXBhcmluZyBjaGFyYWN0ZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEBwYXJhbSBzZWFyY2ggSWYgdGVzdCBpcyBlbXB0eSAtMSBpcyBhbHdheXMgcmV0dXJuZWQuCi0gICAgICogQHJldHVybiAtMSBpZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQgb3IgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZwotICAgICAqICAgICAgICAgY2hhcmFjdGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZklnbm9yZUNhc2UoZmluYWwgU3RyaW5nIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VhcmNoKSB7Ci0gICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICBmaW5hbCBpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotICAgICAgICBmaW5hbCBpbnQgdGVzdExlbmd0aCA9IHNlYXJjaC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKHN0cmluZ0xlbmd0aCA+IDEgfHwgdGVzdExlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgIGZpbmFsIGNoYXIgZmlyc3RDaGFyT2ZUZXN0ID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaC5jaGFyQXQoMCkpOwotICAgICAgICAgICAgZmluYWwgaW50IGxhc3RTdHJpbmdDaGFyYWN0ZXJUb0NoZWNrID0gc3RyaW5nTGVuZ3RoIC0gdGVzdExlbmd0aCArIDE7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFzdFN0cmluZ0NoYXJhY3RlclRvQ2hlY2s7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdENoYXJPZlRlc3QgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZy5jaGFyQXQoaSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCB0ZXN0TGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHN0cmluZy5jaGFyQXQoaSArIGopOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBvdGhlckNoYXIgPSBzZWFyY2guY2hhckF0KGopOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uob3RoZXJDaGFyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHJlcGxhY2U6IExpa2UgU3RyaW5nLnJlcGxhY2UgZXhjZXB0IHRoYXQgdGhlIG9sZCBuZXcgaXRlbXMgYXJlIHN0cmluZ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBzdHJpbmcKLSAgICAgKiBAcGFyYW0gb2xkVCBvbGQgdGV4dCB0byByZXBsYWNlCi0gICAgICogQHBhcmFtIG5ld1QgbmV3IHRleHQgdG8gdXNlCi0gICAgICogQHJldHVybiByZXBsYWNlbWVudCBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyByZXBsYWNlKFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9sZFQsIFN0cmluZyBuZXdUKSB7Ci0KLSAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuICIiOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIHN0cmluZyBidWZmZXIgdGhhdCBpcyB0d2ljZSBpbml0aWFsIGxlbmd0aC4KLSAgICAgICAgLy8gVGhpcyBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSAqIDIpOwotCi0gICAgICAgIGludCBsZW4gPSBvbGRULmxlbmd0aCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludCBpID0gbmFtZS5pbmRleE9mKG9sZFQsIHN0YXJ0KTsKLQotICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lLnN1YnN0cmluZyhzdGFydCwgaSkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuZXdUKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyBsZW47Ci0gICAgICAgICAgICAgICAgaSA9IG5hbWUuaW5kZXhPZihvbGRULCBzdGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhcnQgPCBuYW1lLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lLnN1YnN0cmluZyhzdGFydCkpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBObyBGRkRDIGNvZGUgbmVlZGVkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhzYik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbi4KLSAgICAgKiBOb3RlIFRoaXMgdXRpbGl0eSBpcyB1c2VmdWwgaW4gZGVidWcgc2NlbmFyaW9zIHRvIGR1bXAgb3V0IAotICAgICAqIHRoZSBjYWxsIHN0YWNrLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYWxsU3RhY2tUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN0YWNrVG9TdHJpbmcobmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0YWNrIG9mIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFja1RvU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyIHN3ID0gbmV3IGphdmEuaW8uU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGphdmEuaW8uQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgamF2YS5pby5CdWZmZXJlZFdyaXRlcihzdyk7Ci0gICAgICAgIGphdmEuaW8uUHJpbnRXcml0ZXIgcHcgPSBuZXcgamF2YS5pby5QcmludFdyaXRlcihidyk7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKLSAgICAgICAgcHcuY2xvc2UoKTsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotICAgICAgICAvLyBKdW1wIHBhc3QgdGhlIHRocm93YWJsZQotICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcodGV4dC5pbmRleE9mKCJhdCIpKTsKLSAgICAgICAgdGV4dCA9IHJlcGxhY2UodGV4dCwgImF0ICIsICJERUJVR19GUkFNRSA9ICIpOwotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Mb2FkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTNiMjhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotLyoqCi0gKiBMb2FkcyByZXNvdXJjZXMgKG9yIGltYWdlcykgZnJvbSB2YXJpb3VzIHNvdXJjZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2FkZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgZm9yIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpbiBkaWZmZXJlbnQKLSAgICAgKiBwbGFjZXMuIFRoZSBzZWFyY2ggb3JkZXIgaXMgYXMgZm9sbG93czoKLSAgICAgKiA8b2w+Ci0gICAgICogPHA+PGxpPlNlYXJjaCBmb3IgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHVzaW5nIHRoZSB0aHJlYWQgY29udGV4dAotICAgICAqIGNsYXNzIGxvYWRlciB1bmRlciBKYXZhMi4gSWYgdGhhdCBmYWlscywgc2VhcmNoIGZvcgotICAgICAqIDxjb2RlPnJlc291cmNlPC9jb2RlPiB1c2luZyB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgbG9hZGVkIHRoaXMKLSAgICAgKiBjbGFzcyAoPGNvZGU+TG9hZGVyPC9jb2RlPikuCi0gICAgICogPHA+PGxpPlRyeSBvbmUgbGFzdCB0aW1lIHdpdGgKLSAgICAgKiA8Y29kZT5DbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShyZXNvdXJjZSk8L2NvZGU+LCB0aGF0IGlzIGlzCi0gICAgICogdXNpbmcgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgaW4gSkRLIDEuMiBhbmQgdmlydHVhbCBtYWNoaW5lJ3MKLSAgICAgKiBidWlsdC1pbiBjbGFzcyBsb2FkZXIgaW4gSkRLIDEuMS4KLSAgICAgKiA8L29sPgotICAgICAqIDxwLz4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBVUkwKLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFdlIGNvdWxkIG5vdCBmaW5kIHJlc291cmNlLiBMZXIgdXMgbm93IHRyeSB3aXRoIHRoZQotICAgICAgICAgICAgLy8gY2xhc3Nsb2FkZXIgdGhhdCBsb2FkZWQgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gZ2V0VENMKCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nICIgKyBjbGFzc0xvYWRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNsYXNzIGxvYWRlci4iKTsKLSAgICAgICAgICAgICAgICB1cmwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLndhcm4oIkNhdWdodCBFeGNlcHRpb24gd2hpbGUgaW4gTG9hZGVyLmdldFJlc291cmNlLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXN0IGRpdGNoIGF0dGVtcHQ6IGdldCB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3MgcGF0aC4gSXQKLSAgICAgICAgLy8gbWF5IGJlIHRoZSBjYXNlIHRoYXQgY2xhenogd2FzIGxvYWRlZCBieSB0aGUgRXh0ZW50c2lvbiBjbGFzcwotICAgICAgICAvLyBsb2FkZXIgd2hpY2ggdGhlIHBhcmVudCBvZiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4gSGVuY2UgdGhlCi0gICAgICAgIC8vIGNvZGUgYmVsb3cuCi0gICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKCkuIik7Ci0gICAgICAgIHJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlcgotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBVUkwuCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgcmVzb3VyY2UpCi0gICAgICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIiArIHJlc291cmNlICsgIl0gdXNpbmcgIiArIGxvYWRlciArICIgY2xhc3MgbG9hZGVyLiIpOwotICAgICAgICAgICAgICAgIHVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLndhcm4oIkNhdWdodCBFeGNlcHRpb24gd2hpbGUgaW4gTG9hZGVyLmdldFJlc291cmNlLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlc291cmNlKHJlc291cmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBmb3IgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGluIGRpZmZlcmVudAotICAgICAqIHBsYWNlcy4gVGhlIHNlYXJjaCBvcmRlciBpcyBhcyBmb2xsb3dzOgotICAgICAqIDxvbD4KLSAgICAgKiA8cD48bGk+U2VhcmNoIGZvciA8Y29kZT5yZXNvdXJjZTwvY29kZT4gdXNpbmcgdGhlIHRocmVhZCBjb250ZXh0Ci0gICAgICogY2xhc3MgbG9hZGVyIHVuZGVyIEphdmEyLiBJZiB0aGF0IGZhaWxzLCBzZWFyY2ggZm9yCi0gICAgICogPGNvZGU+cmVzb3VyY2U8L2NvZGU+IHVzaW5nIHRoZSBjbGFzcyBsb2FkZXIgdGhhdCBsb2FkZWQgdGhpcwotICAgICAqIGNsYXNzICg8Y29kZT5Mb2FkZXI8L2NvZGU+KS4KLSAgICAgKiA8cD48bGk+VHJ5IG9uZSBsYXN0IHRpbWUgd2l0aAotICAgICAqIDxjb2RlPkNsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpPC9jb2RlPiwgdGhhdCBpcyBpcwotICAgICAqIHVzaW5nIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyIGluIEpESyAxLjIgYW5kIHZpcnR1YWwgbWFjaGluZSdzCi0gICAgICogYnVpbHQtaW4gY2xhc3MgbG9hZGVyIGluIEpESyAxLjEuCi0gICAgICogPC9vbD4KLSAgICAgKiA8cC8+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVVJMCi0gICAgICovCi0gICAgc3RhdGljIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyByZXNvdXJjZSkgewotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBMZXQncyB0cnkgdGhlIFRocmVhZCBDb250ZXh0IENsYXNzIExvYWRlcgotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBnZXRUQ0woKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIiArIHJlc291cmNlICsgIl0gdXNpbmcgIiArIGNsYXNzTG9hZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgY2xhc3MgbG9hZGVyLiIpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCJDYXVnaHQgRXhjZXB0aW9uIHdoaWxlIGluIExvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gV2UgY291bGQgbm90IGZpbmQgcmVzb3VyY2UuIExlciB1cyBub3cgdHJ5IHdpdGggdGhlCi0gICAgICAgICAgICAvLyBjbGFzc2xvYWRlciB0aGF0IGxvYWRlZCB0aGlzIGNsYXNzLgotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUcnlpbmcgdG8gZmluZCBbIiArIHJlc291cmNlICsgIl0gdXNpbmcgIiArIGNsYXNzTG9hZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgY2xhc3MgbG9hZGVyLiIpOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCJDYXVnaHQgRXhjZXB0aW9uIHdoaWxlIGluIExvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMYXN0IGRpdGNoIGF0dGVtcHQ6IGdldCB0aGUgcmVzb3VyY2UgZnJvbSB0aGUgY2xhc3MgcGF0aC4gSXQKLSAgICAgICAgLy8gbWF5IGJlIHRoZSBjYXNlIHRoYXQgY2xhenogd2FzIGxvYWRlZCBieSB0aGUgRXh0ZW50c2lvbiBjbGFzcwotICAgICAgICAvLyBsb2FkZXIgd2hpY2ggdGhlIHBhcmVudCBvZiB0aGUgc3lzdGVtIGNsYXNzIGxvYWRlci4gSGVuY2UgdGhlCi0gICAgICAgIC8vIGNvZGUgYmVsb3cuCi0gICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oKS4iKTsKLSAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2FkZXIKLSAgICAgKiBAcGFyYW0gcmVzb3VyY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgVVJMLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyByZXNvdXJjZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGZpbmQgWyIgKyByZXNvdXJjZSArICJdIHVzaW5nICIgKyBsb2FkZXIgKyAiIGNsYXNzIGxvYWRlci4iKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLndhcm4oIkNhdWdodCBFeGNlcHRpb24gd2hpbGUgaW4gTG9hZGVyLmdldFJlc291cmNlLiBUaGlzIG1heSBiZSBpbm5vY3VvdXMuIiwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBDbGFzc0xvYWRlci4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXRUQ0woKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBzcGVjaWZpZWQgY2xhc3Nsb2FkZXIgYW5kIHRoZW4gZmFsbHMgYmFjayB0byB0aGUgbG9hZENsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvYWRlcgotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gUmV0dXJucyBDbGFzcy4KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBzdGF0aWMgcHVibGljIENsYXNzIGxvYWRDbGFzcyhDbGFzc0xvYWRlciBsb2FkZXIsIFN0cmluZyBjbGF6eikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoY2xhenopOwotICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxvYWRDbGFzcyhjbGF6eik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgcnVubmluZyB1bmRlciBKREsgMS4yLCBsb2FkcyB0aGUgc3BlY2lmaWVkIGNsYXNzIHVzaW5nIHRoZQotICAgICAqIDxjb2RlPlRocmVhZDwvY29kZT4gPGNvZGU+Y29udGV4dENsYXNzTG9hZGVyPC9jb2RlPiAuIElmIHRoYXQKLSAgICAgKiBmYWlscywgdHJ5IENsYXNzLmZvcm5hbWUuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXp6Ci0gICAgICogQHJldHVybiBSZXR1cm5zIENsYXNzLgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGF6eikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgdGNsID0gZ2V0VENMKCk7Ci0KLSAgICAgICAgICAgIGlmICh0Y2wgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzIGMgPSB0Y2wubG9hZENsYXNzKGNsYXp6KTsKLSAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZSk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHdlIHJlYWNoZWQgaGVyZSBiZWNhdXNlIHRjbCB3YXMgbnVsbCBvciBiZWNhdXNlIG9mIGEKLSAgICAgICAgLy8gc2VjdXJpdHkgZXhjZXB0aW9uLCBvciBiZWNhdXNlIGNsYXp6IGNvdWxkIG5vdCBiZSBsb2FkZWQuLi4KLSAgICAgICAgLy8gSW4gYW55IGNhc2Ugd2Ugbm93IHRyeSBvbmUgbW9yZSB0aW1lCi0gICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXp6KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Mb2dnaW5nQ29udHJvbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTG9nZ2luZ0NvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3ODEwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Mb2dnaW5nQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgbW9yZSBlZmZpY2llbnQgbWVhbnMgb2YgY29udHJvbCBvdmVyIGxvZ2dpbmcgdGhhbgotICogZG8gbW9zdCBwcm92aWRlcnMgb2YgdGhlIENvbW1vbidzIGxvZ2dpbmcgQVBJIGF0IHRoZSBjb3N0IG9mIHJ1bnRpbWUKLSAqIGZsZXhpYmlsaXR5LgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0NvbnRyb2wgewotICAgIC8qKgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UgdGhlbiBkZWJ1ZyBtZXNzYWdlcyB3aWxsIG5vdCBiZSBsb2dnZWQsCi0gICAgICogaXJyZXNwZWN0aXZlIG9mIHRoZSBsZXZlbCBzZXQgZm9yIHRoZSBsb2dnZXIgaXRzZWxmLiAgVGhpcyBjYW4gb25seQotICAgICAqIGJlIGNoYW5nZWQgYXMgdGhlIHJlc3VsdCBvZiBhIEpWTSByZXN0YXJ0IG9yIGEgcHVyZ2UgYW5kIHJlbG9hZGluZwotICAgICAqIG9mIHRoaXMgY2xhc3MuCi0gICAgICogPHAvPgotICAgICAqIFVzYWdlOiBpZiAoTG9nZ2luZ0NvbnRyb2wuZGVidWdMb2dnaW5nQWxsb3dlZCAmJiBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkuLi4KLSAgICAgKiBvcgotICAgICAqIGlmIChMb2dnaW5nQ29udHJvbC5kZWJ1Z0xvZ2dpbmdBbGxvd2VkICYmIGxvZy5pc1RyYWNlRW5hYmxlZCgpKS4uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0xvZ2dpbmdBbGxvd2VkOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHByb3AgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gbmVlZCBkb1ByaXYgdG8gZ2V0IHN5c3RlbSBwcm9wIHdpdGggSjJTIGVuYWJsZWQKLSAgICAgICAgICAgIHByb3AgPSAoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJBeGlzMi5wcm9oaWJpdERlYnVnTG9nZ2luZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBTRSkgewotICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgIH0KLSAgICAgICAgZGVidWdMb2dnaW5nQWxsb3dlZCA9IHByb3AgPT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9NZXNzYWdlQ29udGV4dEJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL01lc3NhZ2VDb250ZXh0QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJmYjAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL01lc3NhZ2VDb250ZXh0QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5VVUlER2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJlYXNvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0U3ViQ29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0VmFsdWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXJCbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUFByb2Nlc3NpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdE5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQ29udGV4dEJ1aWxkZXIgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3ICdyZXNwb25zZScgbWVzc2FnZSBjb250ZXh0IGJhc2VkIG9uIGEgJ3JlcXVlc3QnIG1lc3NhZ2UgY29udGV4dAotICAgICAqIE9ubHkgZGVhbHMgd2l0aCBwcm9wZXJ0aWVzL2ZpZWxkcyB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgYm90aCAnbm9ybWFsJyBhbmQgZmF1bHQgcmVzcG9uc2VzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBuZXdtc2dDdHggPQotICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRTZXNzaW9uQ29udGV4dChpbk1lc3NhZ2VDb250ZXh0LmdldFNlc3Npb25Db250ZXh0KCkpOwotICAgICAgICBuZXdtc2dDdHguc2V0VHJhbnNwb3J0SW4oaW5NZXNzYWdlQ29udGV4dC5nZXRUcmFuc3BvcnRJbigpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldFRyYW5zcG9ydE91dChpbk1lc3NhZ2VDb250ZXh0LmdldFRyYW5zcG9ydE91dCgpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldFNlcnZlclNpZGUoaW5NZXNzYWdlQ29udGV4dC5pc1NlcnZlclNpZGUoKSk7Ci0KLSAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYmUgc3BlY2lmeWluZyAob3IgZGVmYXVsdGluZyB0bykgdGhlICJyZXNwb25zZSIgcmVsYXRpb25zaGlwVHlwZT8/Ci0gICAgICAgIG5ld21zZ0N0eC5hZGRSZWxhdGVzVG8obmV3IFJlbGF0ZXNUbyhpbk1lc3NhZ2VDb250ZXh0LmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlSWQoKSkpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKSk7Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FKSk7Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJU19CSU5ESU5HX09QRVJBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19PUEVSQVRJT04pKTsKLQotICAgICAgICAvLyBTZXR0aW5nIHRoZSBjaGFyYXRlciBzZXQgZW5jb2RpbmcKLSAgICAgICAgbmV3bXNnQ3R4LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKSk7Ci0gICAgICAgIC8vU2V0dGluZyB0aGUgbWVzc2FnZSB0eXBlIHByb3BlcnR5Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSkpOwotICAgICAgICBuZXdtc2dDdHguc2V0RG9pbmdSRVNUKGluTWVzc2FnZUNvbnRleHQuaXNEb2luZ1JFU1QoKSk7Ci0KLSAgICAgICAgbmV3bXNnQ3R4LnNldE9wZXJhdGlvbkNvbnRleHQoaW5NZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkpOwotCi0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKSk7Ci0gICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPKSk7Ci0KLSAgICAgICAgaGFuZGxlQ29ycmVsYXRpb25JRChpbk1lc3NhZ2VDb250ZXh0LG5ld21zZ0N0eCk7Ci0gICAgICAgIHJldHVybiBuZXdtc2dDdHg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIE1lc3NhZ2VDb250ZXh0IGZvciB1c2Ugd2l0aCBhIG5vbi1mYXVsdCByZXNwb25zZSBiYXNlZCBvbiBhbiByZXF1ZXN0IE1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZXNzYWdlQ29udGV4dCBjcmVhdGVPdXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2VDb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGEgYmFzaWMgcmVzcG9uc2UgTWVzc2FnZUNvbnRleHQgd2l0aCBiYXNpYyBmaWVsZHMgY29waWVkCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG5ld21zZ0N0eCA9IGNyZWF0ZVJlc3BvbnNlTWVzc2FnZUNvbnRleHQoaW5NZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgLy8gU2ltcGxlIHJlc3BvbnNlIHNvIHNldCBUbyB0byB2YWx1ZSBvZiBpbmJvdW5kIFJlcGx5VG8KLSAgICAgICAgbmV3bXNnQ3R4LnNldFRvKGluTWVzc2FnZUNvbnRleHQuZ2V0UmVwbHlUbygpKTsKLSAgICAgICAgaWYgKG5ld21zZ0N0eC5nZXRUbygpID09IG51bGwpIHsKLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gVGFyZ2V0IFJlc29sdXRpb24KLSAgICAgICAgVGFyZ2V0UmVzb2x2ZXIgdGFyZ2V0UmVzb2x2ZXIgPQotICAgICAgICAgICAgICAgIG5ld21zZ0N0eC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VGFyZ2V0UmVzb2x2ZXJDaGFpbigpOwotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0UmVzb2x2ZXIucmVzb2x2ZVRhcmdldChuZXdtc2dDdHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIFJlcGx5VG8gZm9yIHJlc3BvbnNlIG1lc3NhZ2UuCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gaW5NZXNzYWdlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCAmJiBDb25zdGFudHMuU0NPUEVfU09BUF9TRVNTSU9OLmVxdWFscyhheGlzU2VydmljZS5nZXRTY29wZSgpKSkgewotICAgICAgICAgICAgLy9JZiB0aGUgd3NhIDIwMDQvMDggKHN1Ym1pc3Npb24pIHNwZWMgaXMgaW4gZWZmZWN0IHVzZSB0aGUgd3NhIGFub255bW91cyBVUkkgYXMgdGhlIGRlZmF1bHQgcmVwbHlUbyB2YWx1ZS4KLSAgICAgICAgICAgIC8vVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgd3NhIG5vbmUgVVJJIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhhdCBzcGVjLgotICAgICAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBpbk1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHModmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICBuZXdtc2dDdHguc2V0UmVwbHlUbygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX0FOT05ZTU9VU19VUkwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3bXNnQ3R4LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotCi0gICAgICAgICAgICAvLyBhZGQgdGhlIHNlcnZpY2UgZ3JvdXAgaWQgYXMgYSByZWZlcmVuY2UgcGFyYW1ldGVyCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkID0gaW5NZXNzYWdlQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0SWQoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0SWQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHNlcnZpY2VHcm91cENvbnRleHRJZCkpIHsKLSAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZXBseVRvRVBSID0gbmV3bXNnQ3R4LmdldFJlcGx5VG8oKTsKLSAgICAgICAgICAgICAgICByZXBseVRvRVBSLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihuZXcgUU5hbWUoQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TRVJWSUNFX0dST1VQX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVhJUzJfTkFNRVNQQUNFX1BSRUZJWCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIG91dGJvdW5kVG9FUFIgPSBuZXdtc2dDdHguZ2V0VG8oKTsKLSAgICAgICAgICAgIE9iamVjdCB2ZXJzaW9uID0gbmV3bXNnQ3R4LmdldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRS5lcXVhbHModmVyc2lvbikgfHwKLSAgICAgICAgICAgICAgICAob3V0Ym91bmRUb0VQUiAhPSBudWxsICYmICFvdXRib3VuZFRvRVBSLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgICAgICBuZXdtc2dDdHguc2V0TWVzc2FnZUlEKFVVSURHZW5lcmF0b3IuZ2V0VVVJRCgpKTsKLSAgICAgICAgICAgICAgICBuZXdtc2dDdHguc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTk9ORV9VUkkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCB3c2E6QWN0aW9uIGZvciByZXNwb25zZSBtZXNzYWdlCi0gICAgICAgIC8vIFVzZSBzcGVjaWZpZWQgdmFsdWUgaWYgYXZhaWxhYmxlCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYW8gPSBpbk1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKChhbyAhPSBudWxsKSAmJiAoYW8uZ2V0T3V0cHV0QWN0aW9uKCkgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRXU0FBY3Rpb24oYW8uZ2V0T3V0cHV0QWN0aW9uKCkpOwotICAgICAgICB9IGVsc2UgeyAvLyBJZiBub3QsIHNpbXBseSBjb3B5IHRoZSByZXF1ZXN0IHZhbHVlLiBBbG1vc3QgYWx3YXlzIGludmFsaWQuCi0gICAgICAgICAgICBuZXdtc2dDdHguc2V0V1NBQWN0aW9uKGluTWVzc2FnZUNvbnRleHQuZ2V0V1NBQWN0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFvICE9IG51bGwpewotICAgICAgICAgICBuZXdtc2dDdHguc2V0QXhpc01lc3NhZ2UoYW8uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfT1VUX1ZBTFVFKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXR0aW5nIHRoZSBvdXQgYm91bmQgYmluZGluZyBtZXNzYWdlCi0gICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBpbmJvdW5kQXhpc0JpbmRpbmdNZXNzYWdlCi0gICAgICAgICAgICAgICAgPSAoQXhpc0JpbmRpbmdNZXNzYWdlKWluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19NRVNTQUdFKTsKLSAgICAgICAgaWYgKGluYm91bmRBeGlzQmluZGluZ01lc3NhZ2UgIT0gbnVsbCl7Ci0gICAgICAgICAgICBBeGlzQmluZGluZ09wZXJhdGlvbiBheGlzQmluZGluZ09wZXJhdGlvbiA9IGluYm91bmRBeGlzQmluZGluZ01lc3NhZ2UuZ2V0QXhpc0JpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIG5ld21zZ0N0eC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJU19CSU5ESU5HX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgIGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldENoaWxkKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9PVVRfVkFMVUUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5ld21zZ0N0eC5zZXREb2luZ01UT00oaW5NZXNzYWdlQ29udGV4dC5pc0RvaW5nTVRPTSgpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldERvaW5nU3dBKGluTWVzc2FnZUNvbnRleHQuaXNEb2luZ1N3QSgpKTsKLSAgICAgICAgbmV3bXNnQ3R4LnNldFNlcnZpY2VHcm91cENvbnRleHRJZChpbk1lc3NhZ2VDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHRJZCgpKTsKLQotCi0KLSAgICAgICAgLy8gRW5zdXJlIHRyYW5zcG9ydCBzZXR0aW5ncyBtYXRjaCB0aGUgc2NoZW1lIGZvciB0aGUgVG8gRVBSCi0gICAgICAgIHNldHVwQ29ycmVjdFRyYW5zcG9ydE91dChuZXdtc2dDdHgpOwotICAgICAgICByZXR1cm4gbmV3bXNnQ3R4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgY29ycmVsYXRpb24gaWQgKGptcykgZnJvbSB0aGUgaW4gbWVzc2FnZSBjdHgKLSAgICAgKiB0byB0aGUgb3V0IG1lc3NhZ2UgY3R4LiBDdXJyZW50bHkgdGhpcyBjaGVjayBpcyBmb3Igam1zIAotICAgICAqIG9ubHksIGJ1dCBjYW4gYmUgZXhwYW5kZWQgdG8gb3RoZXIgdHJhbnNwb3J0cyBpZiB0aGUgbmVlZAotICAgICAqIGFyaXNlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUNvcnJlbGF0aW9uSUQoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCxNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlQ29udGV4dCkgICAgCi0gICAgewotICAgIAlpZiAoaW5NZXNzYWdlQ29udGV4dC5nZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUoKSE9IG51bGwgJiYKLSAgICAJICAgIGluTWVzc2FnZUNvbnRleHQuZ2V0SW5jb21pbmdUcmFuc3BvcnROYW1lKCkuZXF1YWxzKENvbnN0YW50cy5UUkFOU1BPUlRfSk1TKSkKLSAgICAJewotICAgIAkJbG9nLmRlYnVnKCJJbmNvbWluZyBUcmFuc3BvcnQgaXMgSk1TLCBsZXRzIGNoZWNrIGZvciBKTVMgY29ycmVsYXRpb24gaWQiKTsKLSAgICAJCQotCSAgICAJU3RyaW5nIGNvcnJlbGF0aW9uSWQgPQotCSAgICAgICAgICAgIChTdHJpbmcpIGluTWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkpNU19DT09SRUxBVElPTl9JRCk7Ci0JICAgIAlsb2cuZGVidWcoIkNvcnJlbGF0aW9uIGlkIGlzICIgKyBjb3JyZWxhdGlvbklkKTsKLQkgICAgICAgIGlmIChjb3JyZWxhdGlvbklkICE9IG51bGwgJiYgY29ycmVsYXRpb25JZC5sZW5ndGgoKSA+IDApIHsKLQkgICAgICAgIAlvdXRNZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuSk1TX0NPT1JFTEFUSU9OX0lELCBjb3JyZWxhdGlvbklkKTsKLQkgICAgICAgIH0KLSAgICAJfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBoYW5kbGUgYW55IGVycm9yIHRoYXQgb2NjdXJzIGF0IGluZmxvdyBvciBvdXRmbG93LiBCdXQgaWYgdGhlCi0gICAgICogbWV0aG9kIGlzIGNhbGxlZCB0d2ljZSwgaXQgaW1wbGllcyB0aGF0IHNlbmRpbmcgdGhlIGVycm9yIGhhbmRsaW5nIGhhcyBmYWlsZWQsIGluIHdoaWNoIGNhc2UKLSAgICAgKiB0aGUgbWV0aG9kIGxvZ3MgdGhlIGVycm9yIGFuZCBleGl0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgcHJvY2Vzc2luZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChwcm9jZXNzaW5nQ29udGV4dC5pc1Byb2Nlc3NpbmdGYXVsdCgpKSB7Ci0gICAgICAgICAgICAvLyBXZSBnZXQgdGhlIGVycm9yIGZpbGUgcHJvY2Vzc2luZyB0aGUgZmF1bHQuIG5vdGhpbmcgd2UgY2FuIGRvCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVycm9yd2hpbGVQcm9jZXNzaW5nRmF1bHQiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgdGhlIHRocm93YWJsZSBpcyBhbiBBeGlzRmF1bHQgYW5kIGlmIGl0IGFscmVhZHkgY29udGFpbnMgdGhlCi0gICAgICAgIC8vIGZhdWx0IE1lc3NhZ2VDb250ZXh0Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdE1lc3NhZ2VDb250ZXh0ID0gKChBeGlzRmF1bHQpIGUpLmdldEZhdWx0TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdE1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVzZSBtYXkgbm90IGhhdmUgYmVlbiBzZXQgY29ycmVjdGx5IHdoZW4gdGhlIG9yaWdpbmFsIGNvbnRleHQKLSAgICAgICAgICAgICAgICAvLyB3YXMgY3JlYXRlZCAtLSBhbiBleGFtcGxlIG9mIHRoaXMgaXMgd2l0aCB0aGUgU2ltcGxlSFRUUFNlcnZlci4KLSAgICAgICAgICAgICAgICAvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCB0aGluZyB0byBkbywgb3IgaWYgdGhlCi0gICAgICAgICAgICAgICAgLy8gY29kZSB0aGF0IGNyZWF0ZWQgdGhpcyBjb250ZXh0IGluIHRoZSBmaXJzdCBwbGFjZSBzaG91bGQKLSAgICAgICAgICAgICAgICAvLyBleHBlY3QgdGhhdCB0aGUgdHJhbnNwb3J0IG91dCBpbmZvIHdhcyBzZXQgY29ycmVjdGx5LCBhcwotICAgICAgICAgICAgICAgIC8vIGl0IG1heSBuZWVkIHRvIHVzZSB0aGF0IGluZm8gYXQgc29tZSBwb2ludCBiZWZvcmUgd2UgZ2V0IHRvCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBjb2RlLgotICAgICAgICAgICAgICAgIGZhdWx0TWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKSk7Ci0gICAgICAgICAgICAgICAgZmF1bHRNZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5PVVRfVFJBTlNQT1JUX0lORk8pKTsKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2VDb250ZXh0LnNldFByb2Nlc3NpbmdGYXVsdCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmF1bHRNZXNzYWdlQ29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJhc2ljIHJlc3BvbnNlIE1lc3NhZ2VDb250ZXh0IHdpdGggYmFzaWMgZmllbGRzIGNvcGllZAotICAgICAgICBNZXNzYWdlQ29udGV4dCBmYXVsdENvbnRleHQgPSBjcmVhdGVSZXNwb25zZU1lc3NhZ2VDb250ZXh0KHByb2Nlc3NpbmdDb250ZXh0KTsKLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgZmF1bHQgbWVzc2FnZSBjb250ZXh0Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BlcmF0aW9uQ29udGV4dCA9IHByb2Nlc3NpbmdDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbkNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmFkZEZhdWx0TWVzc2FnZUNvbnRleHQoZmF1bHRDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdENvbnRleHQuc2V0UHJvY2Vzc2luZ0ZhdWx0KHRydWUpOwotCi0gICAgICAgIC8vIFNldCB3c2E6QWN0aW9uIGZvciByZXNwb25zZSBtZXNzYWdlCi0gICAgICAgIAotICAgICAgICAvLyBVc2Ugc3BlY2lmaWVkIHZhbHVlIGlmIGF2YWlsYWJsZQotCi0gICAgICAgIFN0cmluZyBmYXVsdEFjdGlvbiA9IChlIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSA/ICgoQXhpc0ZhdWx0KWUpLmdldEZhdWx0QWN0aW9uKCkgOiBudWxsOwotCi0gICAgICAgIGlmIChmYXVsdEFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gcHJvY2Vzc2luZ0NvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKG9wICE9IG51bGwgJiYgb3AuZ2V0RmF1bHRBY3Rpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkIHRoZSBvcCBiZSBhYmxlIHRvIHBpY2sgYSBmYXVsdCBhY3Rpb24gYmFzZWQgb24gdGhlIGZhdWx0PwotICAgICAgICAgICAgICAgIGZhdWx0QWN0aW9uID0gb3AuZ2V0RmF1bHRBY3Rpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7IC8vSWYsIGZvciBzb21lIHJlYXNvbiB0aGVyZSBpcyBubyB2YWx1ZSBzZXQsIHNob3VsZCB1c2UgYSBzZW5zaWJsZSBhY3Rpb24uCi0gICAgICAgICAgICAgICAgZmF1bHRBY3Rpb24gPSBGaW5hbC5XU0FfU09BUF9GQVVMVF9BQ1RJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmYXVsdENvbnRleHQuc2V0V1NBQWN0aW9uKGZhdWx0QWN0aW9uKTsKLQotICAgICAgICAvLyB0aGVyZSBhcmUgc29tZSBpbmZvcm1hdGlvbiAgdGhhdCB0aGUgZmF1bHQgdGhyb3dlciB3YW50cyB0byBwYXNzIHRvIHRoZSBmYXVsdCBwYXRoLgotICAgICAgICAvLyBNZWFucyB0aGF0IHRoZSBmYXVsdCBpcyBhIHdzLWFkZHJlc3Npbmcgb25lIGhlbmNlIHVzZSB0aGUgd3MtYWRkcmVzc2luZyBmYXVsdCBhY3Rpb24uCi0gICAgICAgIE9iamVjdCBmYXVsdEluZm9Gb3JIZWFkZXJzID0KLSAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5nZXRMb2NhbFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUyk7Ci0gICAgICAgIGlmIChmYXVsdEluZm9Gb3JIZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMsIGZhdWx0SW5mb0ZvckhlYWRlcnMpOwotCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBvdmVycmlkZXMgYW55IGFjdGlvbiBzZXQgYWJvdmUKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRXU0FBY3Rpb24oRmluYWwuV1NBX0ZBVUxUX0FDVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiB0aGUgZXhjZXB0aW9uIGlzIGR1ZSB0byBhIHByb2JsZW0gaW4gdGhlIGZhdWx0VG8gaGVhZGVyIGl0c2VsZiwgd2UgY2FuIG5vdCB1c2UgdGhhdAotICAgICAgICAvLyBmYXVsdCBpbmZvcm1hdGlvbiB0byBzZW5kIHRoZSBlcnJvci4gVHJ5IHRvIHNlbmQgdXNpbmcgcmVwbHlUbywgZWxzZSBsZWF2ZSBpdCB0byB0cmFuc3BvcnQKLSAgICAgICAgYm9vbGVhbiBzaG91bGRTZW5kRmF1bHRUb0ZhdWx0VG8gPQotICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdIZWxwZXIuc2hvdWxkU2VuZEZhdWx0VG9GYXVsdFRvKHByb2Nlc3NpbmdDb250ZXh0KTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZmF1bHRUbyA9IHByb2Nlc3NpbmdDb250ZXh0LmdldEZhdWx0VG8oKTsKLSAgICAgICAgaWYgKGZhdWx0VG8gIT0gbnVsbCAmJiBzaG91bGRTZW5kRmF1bHRUb0ZhdWx0VG8pIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUbyhmYXVsdFRvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUbyhwcm9jZXNzaW5nQ29udGV4dC5nZXRSZXBseVRvKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZhdWx0Q29udGV4dC5nZXRUbygpID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90IHdvcnRoIHNldHRpbmcgdXAgdGhlIHNlc3Npb24gaW5mb3JtYXRpb24gb24gYSBmYXVsdCBmbG93Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIG91dGJvdW5kVG9FUFIgPSBmYXVsdENvbnRleHQuZ2V0VG8oKTsKLSAgICAgICAgT2JqZWN0IHZlcnNpb24gPSBmYXVsdENvbnRleHQuZ2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBpZiAoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UuZXF1YWxzKHZlcnNpb24pIHx8Ci0gICAgICAgICAgICAob3V0Ym91bmRUb0VQUiAhPSBudWxsICYmICFvdXRib3VuZFRvRVBSLmhhc0Fub255bW91c0FkZHJlc3MoKSkpIHsKLSAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICAgICAgZmF1bHRDb250ZXh0LnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkbyBUYXJnZXQgUmVzb2x1dGlvbgotICAgICAgICBUYXJnZXRSZXNvbHZlciB0YXJnZXRSZXNvbHZlciA9IGZhdWx0Q29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VGFyZ2V0UmVzb2x2ZXJDaGFpbigpOwotICAgICAgICBpZiAodGFyZ2V0UmVzb2x2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0UmVzb2x2ZXIucmVzb2x2ZVRhcmdldChmYXVsdENvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW5zdXJlIHRyYW5zcG9ydCBzZXR0aW5ncyBtYXRjaCB0aGUgc2NoZW1lIGZvciB0aGUgVG8gRVBSCi0gICAgICAgIHNldHVwQ29ycmVjdFRyYW5zcG9ydE91dChmYXVsdENvbnRleHQpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGNyZWF0ZUZhdWx0RW52ZWxvcGUocHJvY2Vzc2luZ0NvbnRleHQsIGUpOwotICAgICAgICBmYXVsdENvbnRleHQuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotCi0gICAgICAgIC8vZ2V0IHRoZSBTT0FQIGhlYWRlcnMsIHVzZXIgaXMgdHJ5aW5nIHRvIHNlbmQgaW4gdGhlIGZhdWx0Ci0gICAgICAgIC8vIFRPRE86IFJhdGlvbmFsaXplIHRoaXMgbWVjaGFuaXNtIGEgYml0IC0gbWF5YmUgaGVhZGVycyBzaG91bGQgbGl2ZSBpbiB0aGUgZmF1bHQ/Ci0gICAgICAgIExpc3Qgc29hcEhlYWRlcnNMaXN0ID0KLSAgICAgICAgICAgICAgICAoTGlzdCkgcHJvY2Vzc2luZ0NvbnRleHQuZ2V0UHJvcGVydHkoU09BUENvbnN0YW50cy5IRUFERVJfTE9DQUxfTkFNRSk7Ci0gICAgICAgIGlmIChzb2FwSGVhZGVyc0xpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyRWxlbWVudCA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgYVNvYXBIZWFkZXJzTGlzdCA6IHNvYXBIZWFkZXJzTGlzdCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwSGVhZGVyQmxvY2sgPSAoT01FbGVtZW50KWFTb2FwSGVhZGVyc0xpc3Q7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuYWRkQ2hpbGQoc29hcEhlYWRlckJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFRyYW5zcG9ydC1zcGVjaWZpYyBzdHVmZiBpbiBoZXJlPyAgV2h5PyAgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5PwotICAgICAgICAvLyBub3cgYWRkIEhUVFAgSGVhZGVycwotICAgICAgICBmYXVsdENvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUykpOwotCi0gICAgICAgIHJldHVybiBmYXVsdENvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlIHRoYXQgaWYgdGhlIHNjaGVtZSBvZiB0aGUgVG8gRVBSIGZvciB0aGUgcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0gICAgICogdHJhbnNwb3J0IHVzZWQgZm9yIHRoZSByZXF1ZXN0IHRoYXQgdGhlIGNvcnJlY3QgVHJhbnNwb3J0T3V0IGlzIGF2YWlsYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBDb3JyZWN0VHJhbnNwb3J0T3V0KE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBEZXRlcm1pbmUgdGhhdCB3ZSBoYXZlIHRoZSBjb3JyZWN0IHRyYW5zcG9ydCBhdmFpbGFibGUuCi0gICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCA9IGNvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHJlc3BvbnNlRVBSID0gY29udGV4dC5nZXRUbygpOwotICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNTZXJ2ZXJTaWRlKCkgJiYgcmVzcG9uc2VFUFIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VFUFIuaGFzQW5vbnltb3VzQWRkcmVzcygpICYmICFyZXNwb25zZUVQUi5oYXNOb25lQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKHJlc3BvbnNlRVBSLmdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodHJhbnNwb3J0T3V0ID09IG51bGwpIHx8ICF0cmFuc3BvcnRPdXQuZ2V0TmFtZSgpLmVxdWFscyhzY2hlbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydE91dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydE91dChzY2hlbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQ2FuIG5vdCBmaW5kIHRoZSB0cmFuc3BvcnQgc2VuZGVyIDogIiArIHNjaGVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFRyYW5zcG9ydE91dCh0cmFuc3BvcnRPdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5zZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkRJRkZFUkVOVF9FUFIsIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KHVyaXNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZm9ybWF0aW9uIHRvIGNyZWF0ZSB0aGUgU09BUEZhdWx0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBkaWZmZXJlbnQgcGxhY2VzLgotICAgICAqIDEuIFRob3NlIGluZm9ybWF0aW9uIG1heSBoYXZlIGJlZW4gcHV0IGluIHRvIHRoZSBtZXNzYWdlIGNvbnRleHQgYnkgc29tZSBoYW5kbGVyLiBXaGVuIHNvbWVvbmUKLSAgICAgKiBpcyBwdXR0aW5nIGxpa2UgdGhhdCwgaGUgbXVzdCBtYWtlIHN1cmUgdGhlIFNPQVBFbGVtZW50cyBoZSBpcyBwdXR0aW5nIG11c3QgYmUgZnJvbSB0aGUKLSAgICAgKiBjb3JyZWN0IFNPQVAgVmVyc2lvbi4KLSAgICAgKiAyLiBTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpcyBmbGV4aWJsZSBlbm91Z2ggdG8gY2FycnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhdWx0LiBGb3IgZXhhbXBsZQotICAgICAqIGl0IGhhcyBhbiBhdHRyaWJ1dGUgdG8gc3RvcmUgdGhlIGZhdWx0IGNvZGUuIFRoZSBmYXVsdCByZWFzb24gY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHRoZQotICAgICAqIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4gSSBvcHRlZCB0byBwdXQgdGhlIHN0YWNrdHJhY2UgdW5kZXIgdGhlIGRldGFpbCBlbGVtZW50LgotICAgICAqIGVnIDogPERldGFpbD4KLSAgICAgKiA8RXhjZXB0aW9uPiBzdGFjayB0cmFjZSBnb2VzIGhlcmUgPC9FeGNlcHRpb24+Ci0gICAgICogPERldGFpbD4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgdGhvc2UgaW5mb3JtYXRpb24gY2FuIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbnkgb2YgdGhlIGFib3ZlIHBsYWNlcywgSSBkZWZhdWx0IHRoZSBzb2FwCi0gICAgICogZmF1bHQgdmFsdWVzIHRvIGZvbGxvd2luZy4KLSAgICAgKiA8RmF1bHQ+Ci0gICAgICogPENvZGU+Ci0gICAgICogPFZhbHVlPmVudjpSZWNlaXZlcjwvVmFsdWU+Ci0gICAgICogPC9Db2RlPgotICAgICAqIDxSZWFzb24+Ci0gICAgICogPFRleHQ+dW5rbm93bjwvVGV4dD4KLSAgICAgKiA8L1JlYXNvbj4KLSAgICAgKiA8Um9sZS8+Ci0gICAgICogPE5vZGUvPgotICAgICAqIDxEZXRhaWwvPgotICAgICAqIDwvRmF1bHQ+Ci0gICAgICogPHAvPgotICAgICAqIC0tIEVDCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU09BUEVudmVsb3BlIGNyZWF0ZUZhdWx0RW52ZWxvcGUoTWVzc2FnZUNvbnRleHQgY29udGV4dCwgVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlOwotCi0gICAgICAgIGlmIChjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIGVudmVsb3BlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRGYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBGb2xsb3dpbmcgd2lsbCBtYWtlIFNPQVAgMS4yIGFzIHRoZSBkZWZhdWx0LCB0b28uCi0gICAgICAgICAgICBlbnZlbG9wZSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKS5nZXREZWZhdWx0RmF1bHRFbnZlbG9wZSgpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGVudmVsb3BlLmdldEJvZHkoKS5nZXRGYXVsdCgpOwotCi0gICAgICAgIFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uIHNvYXBFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBBeGlzRmF1bHQgYXhpc0ZhdWx0ID0gbnVsbDsKLQotICAgICAgICBpZiAoZSA9PSBudWxsKSByZXR1cm4gZW52ZWxvcGU7Ci0KLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBeGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdCA9IChBeGlzRmF1bHQpIGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQgPSAoQXhpc0ZhdWx0KSBlLmdldENhdXNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXhpc0ZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBheGlzRmF1bHQuaGVhZGVySXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXIgPSAoU09BUEhlYWRlckJsb2NrKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRIZWFkZXIoKS5hZGRDaGlsZChoZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbikgewotICAgICAgICAgICAgc29hcEV4Y2VwdGlvbiA9IChTT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbikgZTsKLSAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNGYXVsdC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU09BUFByb2Nlc3NpbmdFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBzb2FwRXhjZXB0aW9uID0gKFNPQVBQcm9jZXNzaW5nRXhjZXB0aW9uKSBheGlzRmF1bHQuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVzZXIgY2FuIHNldCB0aGUgZmF1bHQgaW5mb3JtYXRpb24gdG8gdGhlIG1lc3NhZ2UgY29udGV4dCBvciB0byB0aGUgQXhpc0ZhdWx0IGl0c2VsZi4KLSAgICAgICAgLy8gd2hhdGV2ZXIgdXNlciBzZXRzIHRvIHRoZSBtZXNzYWdlIGNvbnRleHQsIHN1cGVyY2VkZXMgZWVyeXRoaW5nLgotICAgICAgICAKLSAgICAgICAgT2JqZWN0IGZhdWx0Q29kZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfQ09ERV9MT0NBTF9OQU1FKTsKLSAgICAgICAgU3RyaW5nIHNvYXBGYXVsdENvZGUgPSAiIjsKLQotICAgICAgICBpZiAoZmF1bHRDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0LnNldENvZGUoKFNPQVBGYXVsdENvZGUpIGZhdWx0Q29kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc29hcEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlID0gc29hcEV4Y2VwdGlvbi5nZXRGYXVsdENvZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNGYXVsdC5nZXRGYXVsdENvZGVFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldENvZGUoYXhpc0ZhdWx0LmdldEZhdWx0Q29kZUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0Q29kZVFOYW1lID0gYXhpc0ZhdWx0LmdldEZhdWx0Q29kZSgpOwotICAgICAgICAgICAgICAgIGlmIChmYXVsdENvZGVRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXVsdENvZGVRTmFtZS5nZXRMb2NhbFBhcnQoKS5pbmRleE9mKCI6IikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBmYXVsdENvZGVRTmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBmYXVsdENvZGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3BlY2lmaWVkIHByZWZpeCBhbmQgdXJpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4OwotICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gdXJpID09IG51bGwgfHwgIiIgLmVxdWFscyh1cmkpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkgOiB1cmk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBhbmQgdXJpIGFyZSBkZWNsYXJlZCBvbiB0aGUgZmF1bHQsIGFuZCAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcmVzdWx0aW5nIHByZWZpeC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGZhdWx0LmRlY2xhcmVOYW1lc3BhY2UodXJpLCBwcmVmaXgpLmdldFByZWZpeCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhdWx0Q29kZSA9IHByZWZpeCArICI6IiArIGZhdWx0Q29kZVFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEZhdWx0Q29kZSA9IGZhdWx0Q29kZVFOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZGVmYXVsdGluZyB0byBmYXVsdCBjb2RlIFJlY2VpdmVyLCBpZiBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZQotICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwgJiYgY29udGV4dC5nZXRFbnZlbG9wZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUgPSAoIiIuZXF1YWxzKHNvYXBGYXVsdENvZGUpIHx8IChzb2FwRmF1bHRDb2RlID09IG51bGwpKQotICAgICAgICAgICAgICAgICAgICA/IFNPQVAxMkNvbnN0YW50cy5TT0FQX0RFRkFVTFRfTkFNRVNQQUNFX1BSRUZJWCArICI6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0VmVyc2lvbigpLmdldFJlY2VpdmVyRmF1bHRDb2RlKCkuZ2V0TG9jYWxQYXJ0KCkKLSAgICAgICAgICAgICAgICAgICAgOiBzb2FwRmF1bHRDb2RlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRDb2RlKCkuc2V0VGV4dChzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuZ2V0Q29kZSgpLmdldFZhbHVlKCkuc2V0VGV4dChzb2FwRmF1bHRDb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGF4aXNGYXVsdCAhPSBudWxsICYmICFjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgIGlmIChheGlzRmF1bHQuZ2V0RmF1bHRTdWJDb2RlcygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBMaXN0IGZhdWx0U3ViQ29kZXMgPSBheGlzRmF1bHQuZ2V0RmF1bHRTdWJDb2RlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFFOYW1lIGZhdWx0U3ViQ29kZVFOYW1lOwotCi0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZmF1bHRTdWJDb2RlIDogZmF1bHRTdWJDb2RlcykgewotCi0gICAgICAgICAgICAgICAgICAgIGZhdWx0U3ViQ29kZVFOYW1lID0gKFFOYW1lKWZhdWx0U3ViQ29kZTsKLQotICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IChTT0FQRmFjdG9yeSllbnZlbG9wZS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzb2FwRmF1bHRTdWJDb2RlID0gc2YuY3JlYXRlU09BUEZhdWx0U3ViQ29kZShmYXVsdC5nZXRDb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRWYWx1ZSBzYW9wRmF1bHRWYWx1ZSA9IHNmLmNyZWF0ZVNPQVBGYXVsdFZhbHVlKGZhdWx0LmdldENvZGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNhb3BGYXVsdFZhbHVlLnNldFRleHQoZmF1bHRTdWJDb2RlUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBzb2FwRmF1bHRTdWJDb2RlLnNldFZhbHVlKHNhb3BGYXVsdFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHQuZ2V0Q29kZSgpLnNldFN1YkNvZGUoc29hcEZhdWx0U3ViQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBGYXVsdFJlYXNvbiBmYXVsdFJlYXNvbiA9IChTT0FQRmF1bHRSZWFzb24pY29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRkFVTFRfUkVBU09OX0xPQ0FMX05BTUUpOwotCi0gICAgICAgIGlmIChmYXVsdFJlYXNvbiA9PSBudWxsICYmIGF4aXNGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdFJlYXNvbiA9IGF4aXNGYXVsdC5nZXRGYXVsdFJlYXNvbkVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmF1bHRSZWFzb24gIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHQuc2V0UmVhc29uKGZhdWx0UmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIiI7Ci0gICAgICAgICAgICBpZiAoc29hcEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNvYXBFeGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgRmF1bHRSZWFzb25FbGVtZW50LCB0cnkgcmVhc29uIHN0cmluZwotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBheGlzRmF1bHQuZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwgfHwgIiIuZXF1YWxzKG1lc3NhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGdldEZhdWx0UmVhc29uRnJvbUV4Y2VwdGlvbihlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCAiIi5lcXVhbHMobWVzc2FnZSkpIG1lc3NhZ2UgPSAidW5rbm93biI7Ci0KLSAgICAgICAgICAgIGlmIChjb250ZXh0LmlzU09BUDExKCkpIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRSZWFzb24oKS5zZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRSZWFzb24oKS5nZXRGaXJzdFNPQVBUZXh0KCkuc2V0TGFuZygiZW4tVVMiKTsKLSAgICAgICAgICAgICAgICBmYXVsdC5nZXRSZWFzb24oKS5nZXRGaXJzdFNPQVBUZXh0KCkuc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBmYXVsdFJvbGUgPSBjb250ZXh0LmdldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX1JPTEVfTE9DQUxfTkFNRSk7Ci0gICAgICAgIGlmIChmYXVsdFJvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHQuZ2V0Um9sZSgpLnNldFRleHQoKFN0cmluZykgZmF1bHRSb2xlKTsKLSAgICAgICAgfSBlbHNlIGlmIChheGlzRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF4aXNGYXVsdC5nZXRGYXVsdFJvbGVFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldFJvbGUoYXhpc0ZhdWx0LmdldEZhdWx0Um9sZUVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZmF1bHROb2RlID0gY29udGV4dC5nZXRQcm9wZXJ0eShTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9OT0RFX0xPQ0FMX05BTUUpOwotICAgICAgICBpZiAoZmF1bHROb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdE5vZGUgc29hcEZhdWx0Tm9kZSA9IGZhdWx0LmdldE5vZGUoKTsKLSAgICAgICAgICAgIGlmKHNvYXBGYXVsdE5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBGYXVsdE5vZGUuc2V0VGV4dCgoU3RyaW5nKSBmYXVsdE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF4aXNGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXhpc0ZhdWx0LmdldEZhdWx0Tm9kZUVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuc2V0Tm9kZShheGlzRmF1bHQuZ2V0RmF1bHROb2RlRWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbG93IGhhbmRsZXJzIHRvIG92ZXJyaWRlIHRoZSBzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIHNldHRpbmcgZnJvbSB0aGUgQ29uZmlndXJhdGlvbiB0byBhbGxvdwotICAgICAgICAvLyBXUy0qIHByb3RvY29sIGZhdWx0cyB0byBub3QgaW5jbHVkZSB0aGUgZXhjZXB0aW9uLgotICAgICAgICBib29sZWFuIHNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMgPSBmYWxzZTsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYyA9IGNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICBPYmplY3QgZmxhZ0Zyb21Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgaWYgKG9jICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZsYWdGcm9tQ29udGV4dCA9IGNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5TRU5EX1NUQUNLVFJBQ0VfREVUQUlMU19XSVRIX0ZBVUxUUyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWdGcm9tQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzID0gSmF2YVV0aWxzLmlzVHJ1ZShmbGFnRnJvbUNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gY29udGV4dC5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLlNFTkRfU1RBQ0tUUkFDRV9ERVRBSUxTX1dJVEhfRkFVTFRTKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyA9IEphdmFVdGlscy5pc1RydWUocGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZmF1bHREZXRhaWwgPSBjb250ZXh0LmdldFByb3BlcnR5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0ZBVUxUX0RFVEFJTF9MT0NBTF9OQU1FKTsKLSAgICAgICAgaWYgKGZhdWx0RGV0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0LnNldERldGFpbCgoU09BUEZhdWx0RGV0YWlsKSBmYXVsdERldGFpbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXhpc0ZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChheGlzRmF1bHQuZ2V0RmF1bHREZXRhaWxFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldERldGFpbChheGlzRmF1bHQuZ2V0RmF1bHREZXRhaWxFbGVtZW50KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgZGV0YWlsID0gYXhpc0ZhdWx0LmdldERldGFpbCgpOwotICAgICAgICAgICAgICAgIGlmIChkZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5nZXREZXRhaWwoKS5hZGREZXRhaWxFbnRyeShkZXRhaWwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cykgewotICAgICAgICAgICAgICAgICAgICBmYXVsdC5zZXRFeGNlcHRpb24oYXhpc0ZhdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmF1bHQuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCAmJiBzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzKSB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIGZhdWx0LnNldEV4Y2VwdGlvbigoRXhjZXB0aW9uKSBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHQuc2V0RXhjZXB0aW9uKG5ldyBFeGNlcHRpb24oZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVudmVsb3BlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ5IHRoZSB0aW1lIHRoZSBleGNlcHRpb24gY29tZXMgaGVyZSBpdCBjYW4gYmUgd3JhcHBlZCBieSBzbyBtYW55IGxldmVscy4gVGhpcyB3aWxsIGNyaXAgZG93bgotICAgICAqIHRvIHRoZSByb290IGNhdXNlIGFuZCBnZXQgdGhlIGluaXRpYWwgZXJyb3IgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eQotICAgICAqCi0gICAgICogQHBhcmFtIGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmF1bHRSZWFzb25Gcm9tRXhjZXB0aW9uKFRocm93YWJsZSBlLCBNZXNzYWdlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFRocm93YWJsZSB0aHJvd2FibGUgPSBlOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBjb250ZXh0LmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5EUklMTF9ET1dOX1RPX1JPT1RfQ0FVU0VfRk9SX0ZBVUxUX1JFQVNPTik7Ci0gICAgICAgIGJvb2xlYW4gZHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiA9Ci0gICAgICAgICAgICAgICAgcGFyYW0gIT0gbnVsbCAmJiAoKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKSkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOwotICAgICAgICBpZiAoZHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbikgewotICAgICAgICAgICAgd2hpbGUgKHRocm93YWJsZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvd2FibGUgPSB0aHJvd2FibGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2VuZGVyRmF1bHRDb2RlKE9NTmFtZXNwYWNlIHNvYXBOYW1lc3BhY2UpIHsKLSAgICAgICAgcmV0dXJuIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkuZXF1YWxzKHNvYXBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgICAgICAgPyBTT0FQMTJDb25zdGFudHMuU09BUF9ERUZBVUxUX05BTUVTUEFDRV9QUkVGSVggKyAiOiIKLSAgICAgICAgICAgICAgICArIFNPQVAxMkNvbnN0YW50cy5GQVVMVF9DT0RFX1NFTkRFUgotICAgICAgICAgICAgICAgIDogU09BUDEyQ29uc3RhbnRzLlNPQVBfREVGQVVMVF9OQU1FU1BBQ0VfUFJFRklYICsgIjoiCi0gICAgICAgICAgICAgICAgKyBTT0FQMTFDb25zdGFudHMuRkFVTFRfQ09ERV9TRU5ERVI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTWV0YURhdGFFbnRyeS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTWV0YURhdGFFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2IxNTdlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL01ldGFEYXRhRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVTZXJpYWxpemFibGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRXh0ZXJuYWxpemFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0OwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotLyoqCi0gKiBBbiBpbnRlcm5hbCBjbGFzcyBmb3IgaG9sZGluZyBhIHNldCBvZiBpbmZvcm1hdGlvbgotICogYWJvdXQgYW4gb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTWV0YURhdGFFbnRyeSBpbXBsZW1lbnRzIEV4dGVybmFsaXphYmxlLCBTYWZlU2VyaWFsaXphYmxlIHsKLSAgICAvLyBzZXJpYWxpemF0aW9uIGlkZW50aWZpZXIKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTc4MzYxMDY5NTI2Mjk5ODc1TDsKLQotICAgIC8vIHN1cHBvcnRlZCByZXZpc2lvbiBsZXZlbHMsIGFkZCBhIG5ldyBsZXZlbCB0byBtYW5hZ2UgY29tcGF0aWJsZSBjaGFuZ2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVklTSU9OXzIgPSAyOwotICAgIC8vIGN1cnJlbnQgcmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBvYmplY3QKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcmV2aXNpb25JRCA9IFJFVklTSU9OXzI7Ci0KLSAgICAvLyBkYXRhIHRvIGtlZXAgb24gYW4gb2JqZWN0Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHFuYW1lQXNTdHJpbmcgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhTmFtZSA9IG51bGw7Ci0KLSAgICAvLyBsaXN0IG9mIE1ldGFEYXRhRW50cnkgb2JqZWN0cyB0aGF0IGFyZSBvd25lZCBieSB0aGUKLSAgICAvLyBvcmlnaW5hbCBvYmplY3QgcmVmZXJyZWQgdG8gYnkgdGhpcyBNZXRhRGF0YUVudHJ5Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW4gPSBudWxsOwotCi0gICAgLy8gbWFya2VyIHRvIGluZGljYXRlIGVuZC1vZi1saXN0Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5EX09GX0xJU1QgPSAiTEFTVF9FTlRSWSI7Ci0KLSAgICAvKioKLSAgICAgKiBTaW1wbGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IGNsYXNzCi0gICAgICogQHBhcmFtIHFuYW1lQXNTdHJpbmcgYW4gZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgUU5hbWUgb2YgdGhpcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcW5hbWVBc1N0cmluZykgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5xbmFtZUFzU3RyaW5nID0gcW5hbWVBc1N0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBjbGFzc05hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IGNsYXNzCi0gICAgICogQHBhcmFtIHFuYW1lQXNTdHJpbmcgYW4gZXhwYW5kZWQgdmVyc2lvbiBvZiB0aGUgUU5hbWUgb2YgdGhpcyBvYmplY3QKLSAgICAgKiBAcGFyYW0gZXh0cmFOYW1lIGFuIGFkZGl0aW9uYWwgbmFtZSBhc3NvY2lhdGVkIHdpdGhlIHRoZSBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0YURhdGFFbnRyeShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcW5hbWVBc1N0cmluZywgU3RyaW5nIGV4dHJhTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgdGhpcy5xbmFtZUFzU3RyaW5nID0gcW5hbWVBc1N0cmluZzsKLSAgICAgICAgdGhpcy5leHRyYU5hbWUgPSBleHRyYU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIG5hbWUgb2YgdGhlIG9iamVjdCBjbGFzcwotICAgICAqIEBwYXJhbSBxbmFtZUFzU3RyaW5nIGFuIGV4cGFuZGVkIHZlcnNpb24gb2YgdGhlIFFOYW1lIG9mIHRoaXMgb2JqZWN0Ci0gICAgICogQHBhcmFtIGNoaWxkcmVuIGFuIEFycmF5TGlzdCBjb250YWluaW5nIE1ldGFEYXRhRW50cmllcyBmb3Igb3duZWQgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBNZXRhRGF0YUVudHJ5KFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBxbmFtZUFzU3RyaW5nLCBBcnJheUxpc3QgY2hpbGRyZW4pIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgICAgIHRoaXMucW5hbWVBc1N0cmluZyA9IHFuYW1lQXNTdHJpbmc7Ci0gICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgY2xhc3MgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY2xhc3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGMgdGhlIGNsYXNzIG5hbWUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjKSB7Ci0gICAgICAgIGNsYXNzTmFtZSA9IGM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBRTmFtZSBiYXNlZCBvbiB0aGUgcW5hbWVBc1N0cmluZyB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpIHsKLSAgICAgICAgaWYgKHFuYW1lQXNTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIFFOYW1lLnZhbHVlT2YocW5hbWVBc1N0cmluZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBRTmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIHEgdGhlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgcSkgewotICAgICAgICBpZiAocSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxbmFtZUFzU3RyaW5nID0gcS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcW5hbWVBc1N0cmluZyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIFFOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbiB0aGUgUU5hbWUgYXMgYSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShTdHJpbmcgbikgewotICAgICAgICBxbmFtZUFzU3RyaW5nID0gbjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgUU5hbWUgYXMgYSBzdHJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIFFOYW1lIGFzIGEgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRRTmFtZUFzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gcW5hbWVBc1N0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QuCi0gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgaXMgdXNlZCBhcyBhIG5hbWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gcW5hbWVBc1N0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYWRkaXRpb25hbCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhZGRpdGlvbmFsIG5hbWUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFeHRyYU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBleHRyYU5hbWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGFkZGl0aW9uYWwgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIGUgdGhlIGV4dHJhIG5hbWUgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXh0cmFOYW1lKFN0cmluZyBlKSB7Ci0gICAgICAgIGV4dHJhTmFtZSA9IGU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eSBvciBub3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gZmFsc2UgZm9yIGEgbm9uLWVtcHR5IGxpc3QsIHRydWUgZm9yIGFuIGVtcHR5IGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RFbXB0eSgpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4uaXNFbXB0eSgpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBsaXN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gTCB0aGUgQXJyYXlMaXN0IG9mIE1ldGFEYXRhRW50cnkgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKEFycmF5TGlzdCBMKSB7Ci0gICAgICAgIGNoaWxkcmVuID0gTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgdG8gdGhlIGxpc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBlIHRoZSBNZXRhRGF0YUVudHJ5IG9iamVjdCB0byBhZGQgdG8gdGhlIGxpc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRUb0xpc3QoTWV0YURhdGFFbnRyeSBlKSB7Ci0gICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZHJlbi5hZGQoZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdCgpIHsKLSAgICAgICAgY2hpbGRyZW4gPSBudWxsOwotICAgIH0KLQotCi0gICAgLy8gbWVzc2FnZSBzdHJpbmdzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU1VQUE9SVEVEX1NVSUQgPSAiU2VyaWFsaXphdGlvbiB2ZXJzaW9uIElEIGlzIG5vdCBzdXBwb3J0ZWQuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TVVBQT1JURURfUkVWSUQgPSAiUmV2aXNpb24gSUQgaXMgbm90IHN1cHBvcnRlZC4iOwotCi0KLSAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotICAgICAqCi0gICAgICogQHBhcmFtIG91dCBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBvYmplY3QgY29udGVudHMgdG8KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIC8vIHdyaXRlIG91dCBjb250ZW50cyBvZiB0aGlzIG9iamVjdAotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWVzc2FnZSAKLSAgICAgICAgLy8gY29udGV4dCBkZWZpbml0aW9uLCBiZSBzdXJlIHRvIG1haW50YWluIHRoZSAKLSAgICAgICAgLy8gb2JqZWN0IGxldmVsIGlkZW50aWZpZXJzCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBvdXQud3JpdGVMb25nKHNlcmlhbFZlcnNpb25VSUQpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIG91dC53cml0ZUludChyZXZpc2lvbklEKTsKLQotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAvLyB2YXJpb3VzIHNpbXBsZSBmaWVsZHMKLSAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGNsYXNzTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChxbmFtZUFzU3RyaW5nKTsKLSAgICAgICAgb3V0LndyaXRlT2JqZWN0KGV4dHJhTmFtZSk7Ci0gICAgICAgIG91dC53cml0ZUxpc3QoY2hpbGRyZW4pOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXN0b3JlIHRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgd2FzCi0gICAgICogcHJldmlvdXNseSBzYXZlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTk9URTogVGhlIGZpZWxkIGRhdGEgbXVzdCByZWFkIGJhY2sgaW4gdGhlIHNhbWUgb3JkZXIgYW5kIHR5cGUKLSAgICAgKiBhcyBpdCB3YXMgd3JpdHRlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiBUaGUgc3RyZWFtIHRvIHJlYWQgdGhlIG9iamVjdCBjb250ZW50cyBmcm9tCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlYWRFeHRlcm5hbChPYmplY3RJbnB1dCBpbk9iamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaW5PYmplY3QpOwotCi0gICAgICAgIC8vIHNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRAotICAgICAgICBsb25nIHN1aWQgPSBpbi5yZWFkTG9uZygpOwotCi0gICAgICAgIC8vIHJldmlzaW9uIElECi0gICAgICAgIGludCByZXZJRCA9IGluLnJlYWRJbnQoKTsKLQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG9iamVjdCBkYXRhIGlzIGluIGEgdmVyc2lvbiB3ZSBjYW4gaGFuZGxlCi0gICAgICAgIGlmIChzdWlkICE9IHNlcmlhbFZlcnNpb25VSUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKFVOU1VQUE9SVEVEX1NVSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBvYmplY3QgZGF0YSBpcyBpbiBhIHJldmlzaW9uIGxldmVsIHdlIGNhbiBoYW5kbGUKLSAgICAgICAgaWYgKHJldklEICE9IFJFVklTSU9OXzIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKFVOU1VQUE9SVEVEX1JFVklEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIHZhcmlvdXMgc2ltcGxlIGZpZWxkcwotICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGNsYXNzTmFtZSA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgcW5hbWVBc1N0cmluZyA9IChTdHJpbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgZXh0cmFOYW1lID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICBjaGlsZHJlbiA9IGluLnJlYWRBcnJheUxpc3QoKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTXVsdGlwbGVFbnRyeUhhc2hNYXAuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL011bHRpcGxlRW50cnlIYXNoTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZmU3OGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvTXVsdGlwbGVFbnRyeUhhc2hNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGlzIHdpbGwgbWFrZSBhIGhhc2ggbWFwIHdoaWNoIGNhbiBjb250YWluIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBzYW1lIGhhc2ggdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZUVudHJ5SGFzaE1hcCB7Ci0KLSAgICBwcml2YXRlIE1hcCB0YWJsZTsKLQotICAgIHB1YmxpYyBNdWx0aXBsZUVudHJ5SGFzaE1hcCgpIHsKLSAgICAgICAgdGhpcy50YWJsZSA9IG5ldyBIYXNodGFibGUoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgeW91IGNhbGwgZ2V0IG9uY2UgaW4gdGhpcywgaXQgd2lsbCByZW1vdmUgdGhhdCBpdGVtIGZyb20gdGhlIG1hcAotICAgICAqCi0gICAgICogQHBhcmFtIGtleQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgdGFibGUuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgbGlzdC5yZW1vdmUoMCk7Ci0vLyAgICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAwKSB7Ci0vLyAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmUoa2V5KTsKLS8vICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBBcnJheUxpc3QgbGlzdCA9IChBcnJheUxpc3QpIHRhYmxlLmdldChrZXkpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgbGlzdFRvQmVBZGRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHRhYmxlLnB1dChrZXksIGxpc3RUb0JlQWRkZWQpOwotICAgICAgICAgICAgbGlzdFRvQmVBZGRlZC5hZGQodmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGlzdC5hZGQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotCi0gICAgICAgIHJldHVybiB0YWJsZS5rZXlTZXQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PYmplY3RTdGF0ZVV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PYmplY3RTdGF0ZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MWM2NjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvT2JqZWN0U3RhdGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkFjdGl2YXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLkV4dGVybmFsaXplQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5leHRlcm5hbGl6ZS5TYWZlT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LmV4dGVybmFsaXplLlNhZmVPYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVXRpbGl0eSB0byB3cml0ZSwgcmVhZCBhbmQgYWN0aXZhdGUgZXh0ZXJuYWxpemVkIE9iamVjdHMKLSAqLwotcHVibGljIGNsYXNzIE9iamVjdFN0YXRlVXRpbHMgaW1wbGVtZW50cyBFeHRlcm5hbGl6ZUNvbnN0YW50cyB7Ci0gICAgLyoKLSAgICAgKiBzZXR1cCBmb3IgbG9nZ2luZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPYmplY3RTdGF0ZVV0aWxzLmNsYXNzKTsKLQotICAgIC8vIHVzZWQgdG8gaW5kaWNhdGUgYW4gdmFsaWQgIm51bGwiIG9iamVjdCwKLSAgICAvLyB0eXBpY2FsbHkgdXNlZCBpbiBrZXktdmFsdWUgcGFpcnMgd2hlcmUgYSBub24tbnVsbCBrZXkgcmVmZXJzIHRvIGEgbnVsbAotICAgIC8vIHZhbHVlCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTlVMTF9PQkpFQ1QgPSAiTlVMTF9PQkoiOwotCi0gICAgLy8gbWVzc2FnZS90cmFjZS9sb2dnaW5nIHN0cmluZ3MKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNVUFBPUlRFRF9TVUlEID0gIlNlcmlhbGl6YXRpb24gdmVyc2lvbiBJRCBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNVUFBPUlRFRF9SRVZJRCA9ICJSZXZpc2lvbiBJRCBpcyBub3Qgc3VwcG9ydGVkLiI7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFNhdmUvUmVzdG9yZSBtZXRob2RzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byB3cml0ZQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZyhPYmplY3RPdXRwdXQgbywgU3RyaW5nIHN0ciwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChzdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYSBzdHJpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gUmV0dXJucyBudWxsIGlmIG5vIHN0cmluZyBpcyBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGkgVGhlIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgb3IgbnVsbCwgaWYgbm90IGF2YWlsYWJsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkU3RyaW5nKE9iamVjdElucHV0IGksIFN0cmluZyBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaSk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBtYXJrZXIKLSAgICAgICAgaW4ucmVhZFVURigpOwotCi0gICAgICAgIC8vIEdldCB0aGUgb2JqZWN0Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gb2JqZWN0IHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byB3cml0ZQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZU9iamVjdChPYmplY3RPdXRwdXQgbywgT2JqZWN0IG9iaiwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZU9iamVjdChvYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYW4gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0uIFJldHVybnMgbnVsbCBpZiBubyBvYmplY3QgaXMgYXZhaWxhYmxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpIFRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHJldHVybiBUaGUgb2JqZWN0IG9yIG51bGwsIGlmIG5vdCBhdmFpbGFibGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcmVhZE9iamVjdChPYmplY3RJbnB1dCBpLCBTdHJpbmcgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGkpOwotICAgICAgICBpbi5yZWFkVVRGKCk7IC8vIFJlYWQgTWFya2VyCi0gICAgICAgIHJldHVybiBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0uIE5PVEU6IGVhY2ggb2JqZWN0IGluIHRoZSBhcnJheQotICAgICAqIHNob3VsZCBpbXBsZW1lbnQgZWl0aGVyIGphdmEuaW8uU2VyaWFsaXphYmxlIG9yIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW4gb3JkZXIgdG8gYmUgc2F2ZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBhbCBUaGUgQXJyYXlMaXN0IHRvIHdyaXRlCi0gICAgICogQHBhcmFtIGRlc2MgQSB0ZXh0IGRlc2NyaXB0aW9uIHRvIHVzZSBmb3IgbG9nZ2luZwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQXJyYXlMaXN0KE9iamVjdE91dHB1dCBvLCBBcnJheUxpc3QgYWwsIFN0cmluZyBkZXNjKSAKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZUxpc3QoYWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGFuIGFycmF5IG9mIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gUmV0dXJucyBudWxsIGlmIG5vIGFycmF5IGlzCi0gICAgICogYXZhaWxhYmxlLiBOT1RFOiBlYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgc2hvdWxkIGltcGxlbWVudCBlaXRoZXIgamF2YS5pby5TZXJpYWxpemFibGUgb3IKLSAgICAgKiBqYXZhLmlvLkV4dGVybmFsaXphYmxlIGluIG9yZGVyIHRvIGJlIHNhdmVkCi0gICAgICogCi0gICAgICogQHBhcmFtIGkgVGhlIGlucHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBkZXNjIEEgdGV4dCBkZXNjcmlwdGlvbiB0byB1c2UgZm9yIGxvZ2dpbmcKLSAgICAgKiBAcmV0dXJuIFRoZSBBcnJheUxpc3Qgb3IgbnVsbCwgaWYgbm90IGF2YWlsYWJsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdCByZWFkQXJyYXlMaXN0KE9iamVjdElucHV0IGksIFN0cmluZyBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTYWZlT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBTYWZlT2JqZWN0SW5wdXRTdHJlYW0uaW5zdGFsbChpKTsKLSAgICAgICAgaW4ucmVhZFVURigpOwotICAgICAgICByZXR1cm4gaW4ucmVhZEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGEgaGFzaG1hcCBvZiBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4gTk9URTogZWFjaCBvYmplY3QgaW4gdGhlIG1hcAotICAgICAqIHNob3VsZCBpbXBsZW1lbnQgZWl0aGVyIGphdmEuaW8uU2VyaWFsaXphYmxlIG9yIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW4gb3JkZXIgdG8gYmUgc2F2ZWQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbyBUaGUgb3V0cHV0IHN0cmVhbQotICAgICAqIEBwYXJhbSBtYXAgVGhlIEhhc2hNYXAgdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVIYXNoTWFwKE9iamVjdE91dHB1dCBvLCBIYXNoTWFwIG1hcCwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gU2FmZU9iamVjdE91dHB1dFN0cmVhbS5pbnN0YWxsKG8pOwotICAgICAgICBvdXQud3JpdGVVVEYoZGVzYyk7Ci0gICAgICAgIG91dC53cml0ZU1hcChtYXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYSBoYXNobWFwIG9mIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gUmV0dXJucyBudWxsIGlmIG5vIGhhc2htYXAgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluIFRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHJldHVybiBUaGUgSGFzaE1hcCBvciBudWxsLCBpZiBub3QgYXZhaWxhYmxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSGFzaE1hcCByZWFkSGFzaE1hcChPYmplY3RJbnB1dCBpLCBTdHJpbmcgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdElucHV0U3RyZWFtIGluID0gU2FmZU9iamVjdElucHV0U3RyZWFtLmluc3RhbGwoaSk7Ci0gICAgICAgIGluLnJlYWRVVEYoKTsKLSAgICAgICAgcmV0dXJuIGluLnJlYWRIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGUgYSBsaW5rZWQgbGlzdCBvZiBvYmplY3RzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4gPE5PVEU6IGVhY2ggb2JqZWN0IGluIHRoZQotICAgICAqIGFycmF5IHNob3VsZCBpbXBsZW1lbnQgZWl0aGVyIGphdmEuaW8uU2VyaWFsaXphYmxlIG9yIGphdmEuaW8uRXh0ZXJuYWxpemFibGUgaW4gb3JkZXIgdG8gYmUKLSAgICAgKiBzYXZlZAotICAgICAqIAotICAgICAqIEBwYXJhbSBvIFRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQHBhcmFtIGxpc3QgVGhlIExpbmtlZExpc3QgdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVMaW5rZWRMaXN0KE9iamVjdE91dHB1dCBvLCBMaW5rZWRMaXN0IG9iamxpc3QsIFN0cmluZyBkZXNjKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU2FmZU9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBTYWZlT2JqZWN0T3V0cHV0U3RyZWFtLmluc3RhbGwobyk7Ci0gICAgICAgIG91dC53cml0ZVVURihkZXNjKTsKLSAgICAgICAgb3V0LndyaXRlTGlzdChvYmpsaXN0KTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIGEgbGlua2VkIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtLiBSZXR1cm5zIG51bGwgaWYgbm8gYXJyYXkgaXMKLSAgICAgKiBhdmFpbGFibGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGluIFRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAcGFyYW0gZGVzYyBBIHRleHQgZGVzY3JpcHRpb24gdG8gdXNlIGZvciBsb2dnaW5nCi0gICAgICogQHJldHVybiBUaGUgbGlua2VkIGxpc3Qgb3IgbnVsbCwgaWYgbm90IGF2YWlsYWJsZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpbmtlZExpc3QgcmVhZExpbmtlZExpc3QoT2JqZWN0SW5wdXQgaSwgU3RyaW5nIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNhZmVPYmplY3RJbnB1dFN0cmVhbSBpbiA9IFNhZmVPYmplY3RJbnB1dFN0cmVhbS5pbnN0YWxsKGkpOwotICAgICAgICBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIHJldHVybiBpbi5yZWFkTGlua2VkTGlzdCgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gRmluZGVyIG1ldGhvZHMKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQotICAgICAqIAotICAgICAqIEBwYXJhbSBheGlzQ29uZmlnIFRoZSBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QKLSAgICAgKiBAcGFyYW0gb3BDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdCAoY291bGQgYmUgYSBkZXJpdmVkIGNsYXNzKQotICAgICAqIEBwYXJhbSBvcFFOYW1lIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3BlcmF0aW9uCi0gICAgICogQHJldHVybiB0aGUgQXhpc09wZXJhdGlvbiBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjcml0ZXJpYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc09wZXJhdGlvbiBmaW5kT3BlcmF0aW9uKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsIFN0cmluZyBvcENsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcFFOYW1lKSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmZpbmRPcGVyYXRpb24oYXhpc0NvbmZpZywgb3BDbGFzc05hbWUsIG9wUU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgQXhpc1NlcnZpY2Ugb2JqZWN0Ci0gICAgICogQHBhcmFtIG9wQ2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvYmplY3QgKGNvdWxkIGJlIGEgZGVyaXZlZCBjbGFzcykKLSAgICAgKiBAcGFyYW0gb3BRTmFtZSB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4gdGhlIEF4aXNPcGVyYXRpb24gb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNPcGVyYXRpb24gZmluZE9wZXJhdGlvbihBeGlzU2VydmljZSBzZXJ2aWNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3BDbGFzc05hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEFjdGl2YXRlVXRpbHMuZmluZE9wZXJhdGlvbihzZXJ2aWNlLCBvcENsYXNzTmFtZSwgb3BRTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgQXhpc1NlcnZpY2Ugb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdCAoY291bGQgYmUgYSBkZXJpdmVkCi0gICAgICogY2xhc3MpCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQotICAgICAqIEByZXR1cm4gdGhlIEF4aXNTZXJ2aWNlIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBmaW5kU2VydmljZShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLCBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICByZXR1cm4gQWN0aXZhdGVVdGlscy5maW5kU2VydmljZShheGlzQ29uZmlnLCBzZXJ2aWNlQ2xhc3NOYW1lLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgQXhpc1NlcnZpY2VHcm91cCBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYSA8cC8+IDxCPk5vdGU8Qj4gdGhlIHNhdmVkIAotICAgICAqIHNlcnZpY2UgZ3JvdXAgbWV0YSBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHVwIHdpdGggYW55IG9mIHRoZSBzZXJ2aWNlR3JvdXBzIHRoYXQgCi0gICAgICogYXJlIGluIHRoZSBjdXJyZW50IEF4aXNDb25maWd1cmF0aW9uIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmZpZyBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0Ci0gICAgICogQHBhcmFtIHNlcnZpY2VHcnBDbGFzc05hbWUgdGhlIGNsYXNzIG5hbWUgc3RyaW5nIGZvciB0aGUgdGFyZ2V0IG9iamVjdCAoY291bGQgYmUgYSBkZXJpdmVkCi0gICAgICogY2xhc3MpCi0gICAgICogQHBhcmFtIHNlcnZpY2VHcnBOYW1lIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBncm91cAotICAgICAqIEByZXR1cm4gdGhlIEF4aXNTZXJ2aWNlR3JvdXAgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlR3JvdXAgZmluZFNlcnZpY2VHcm91cChBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JwQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlR3JwTmFtZSkgewotICAgICAgICByZXR1cm4gQWN0aXZhdGVVdGlscy5maW5kU2VydmljZUdyb3VwKGF4aXNDb25maWcsIHNlcnZpY2VHcnBDbGFzc05hbWUsIHNlcnZpY2VHcnBOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBBeGlzTWVzc2FnZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQotICAgICAqIAotICAgICAqIEBwYXJhbSBvcCBUaGUgQXhpc09wZXJhdGlvbiBvYmplY3QKLSAgICAgKiBAcGFyYW0gbXNnTmFtZSBUaGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbXNnRWxlbWVudE5hbWUgVGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBBeGlzTWVzc2FnZSBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBjcml0ZXJpYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc01lc3NhZ2UgZmluZE1lc3NhZ2UoQXhpc09wZXJhdGlvbiBvcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnRWxlbWVudE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEFjdGl2YXRlVXRpbHMuZmluZE1lc3NhZ2Uob3AsIG1zZ05hbWUsIG1zZ0VsZW1lbnROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBIYW5kbGVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhCi0gICAgICogCi0gICAgICogQHBhcmFtIGV4aXN0aW5nSGFuZGxlcnMgVGhlIGxpc3Qgb2YgZXhpc3RpbmcgaGFuZGxlcnMgYW5kIHBoYXNlcwotICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3NOYW1lIHRoZSBjbGFzcyBuYW1lIHN0cmluZyBmb3IgdGhlIHRhcmdldCBvYmplY3QgKGNvdWxkIGJlIGEgZGVyaXZlZAotICAgICAqIGNsYXNzKQotICAgICAqIEByZXR1cm4gdGhlIEhhbmRsZXIgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgY3JpdGVyaWEKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBmaW5kSGFuZGxlcihBcnJheUxpc3QgZXhpc3RpbmdIYW5kbGVycywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFFbnRyeSBtZXRhRGF0YUVudHJ5KSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmZpbmRIYW5kbGVyKGV4aXN0aW5nSGFuZGxlcnMsIG1ldGFEYXRhRW50cnkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgdGhlIFRyYW5zcG9ydExpc3RlbmVyIG9iamVjdCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhIDxwLz4gPEI+Tm90ZTxCPiB0aGUgc2F2ZWQgbWV0YQotICAgICAqIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdXAgd2l0aCBhbnkgb2YgdGhlIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQKLSAgICAgKiBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgVGhlIEF4aXNDb25maWd1cmF0aW9uIG9iamVjdAotICAgICAqIEBwYXJhbSBsaXN0ZW5lckNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZSBzdHJpbmcgZm9yIHRoZSB0YXJnZXQgb2JqZWN0IChjb3VsZCBiZSBhIGRlcml2ZWQKLSAgICAgKiBjbGFzcykKLSAgICAgKiBAcmV0dXJuIHRoZSBUcmFuc3BvcnRMaXN0ZW5lciBvYmplY3QgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0TGlzdGVuZXIgZmluZFRyYW5zcG9ydExpc3RlbmVyKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmZpbmRUcmFuc3BvcnRMaXN0ZW5lcihheGlzQ29uZmlnLCBsaXN0ZW5lckNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYTEgVGhlIGZpcnN0IGNvbGxlY3Rpb24KLSAgICAgKiBAcGFyYW0gYTIgVGhlIHNlY29uZCBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIHN0cmljdCBJbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgY2hlY2tpbmcgaXMgcmVxdWlyZWQuIFN0cmljdCBjaGVja2luZyBtZWFucyB0aGF0IHRoZQotICAgICAqIHR3byBjb2xsZWN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgb3JkZXIuIAotICAgICAqIE5vbi1zdHJpY3QgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgdHdvIGNvbGxlY3Rpb25zIG11c3QgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cywgCi0gICAgICogYnV0IHRoZSBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQuCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoQXJyYXlMaXN0IGExLCBBcnJheUxpc3QgYTIsIGJvb2xlYW4gc3RyaWN0KSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChhMSwgYTIsIHN0cmljdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbTEgVGhlIGZpcnN0IGNvbGxlY3Rpb24KLSAgICAgKiBAcGFyYW0gbTIgVGhlIHNlY29uZCBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIHN0cmljdCBJbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgY2hlY2tpbmcgaXMgcmVxdWlyZWQuIFN0cmljdCBjaGVja2luZyBtZWFucyB0aGF0IHRoZQotICAgICAqIHR3byBjb2xsZWN0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgbWFwcGluZ3MuIE5vbi1zdHJpY3QgY2hlY2tpbmcgbWVhbnMgdGhhdCB0aGUgdHdvCi0gICAgICogY29sbGVjdGlvbnMgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMuIEluIGJvdGggY2FzZXMsIHRoZSBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQuCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSB0d28gY29sbGVjdGlvbnMgYXJlIGVxdWl2YWxlbnQgRkFMU0UsIG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VxdWl2YWxlbnQoTWFwIG0xLCBNYXAgbTIsIGJvb2xlYW4gc3RyaWN0KSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChtMSwgbTIsIHN0cmljdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdGhlIHR3byBjb2xsZWN0aW9ucyB0byBzZWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbDEKLSAgICAgKiAgICAgICAgICAgIFRoZSBmaXJzdCBjb2xsZWN0aW9uCi0gICAgICogQHBhcmFtIGwyCi0gICAgICogICAgICAgICAgICBUaGUgc2Vjb25kIGNvbGxlY3Rpb24KLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgZXF1aXZhbGVudCBGQUxTRSwgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXF1aXZhbGVudChMaW5rZWRMaXN0IGwxLCBMaW5rZWRMaXN0IGwyKSB7Ci0gICAgICAgIHJldHVybiBBY3RpdmF0ZVV0aWxzLmlzRXF1aXZhbGVudChsMSwgbDIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNQYXJzZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMDYzMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PcHRpb25zUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotLyoqCi0gKiBHZW5lcmFsIHB1cnBvc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgcGFyc2VyLgotICogSWYgdGhpcyBpcyB1c2VkIG91dHNpZGUgb2YgQXhpcyBqdXN0IHJlbW92ZSB0aGUgQXhpcyBzcGVjaWZpYyBzZWN0aW9ucy4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uc1BhcnNlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE9wdGlvbnNQYXJzZXIuY2xhc3MpOwotICAgIFN0cmluZyBhcmdzW10gPSBudWxsOwotICAgIFZlY3RvciB1c2VkQXJncyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciAtIGp1c3QgcGFzcyBpbiB0aGUgPGI+YXJnczwvYj4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25zUGFyc2VyKFN0cmluZyBfYXJnc1tdKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKF9hcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgIF9hcmdzID0gbmV3IFN0cmluZ1tde307Ci0gICAgICAgIH0KLQotICAgICAgICBhcmdzID0gX2FyZ3M7Ci0gICAgICAgIHVzZWRBcmdzID0gbnVsbDsKLSAgICAgICAgZ2V0VXNlcigpOwotICAgICAgICBnZXRQYXNzd29yZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgIHJldHVybiAoaXNWYWx1ZVNldCgndycpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHJldHVybnMgYW4gYXJyYXkgb2YgdW51c2VkIGFyZ3MgLSB0aGVzZSBhcmUgdGhlIG5vbi1vcHRpb24KLSAgICAgKiBhcmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVtYWluaW5nQXJncygpIHsKLSAgICAgICAgQXJyYXlMaXN0IGFsID0gbnVsbDsKLSAgICAgICAgaW50IGxvb3A7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgbG9vcCA8IGFyZ3MubGVuZ3RoOyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmICgoYXJnc1tsb29wXSA9PSBudWxsKSB8fCAoYXJnc1tsb29wXS5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJnc1tsb29wXS5jaGFyQXQoMCkgPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFsLmFkZChhcmdzW2xvb3BdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFbXSA9IG5ldyBTdHJpbmdbYWwuc2l6ZSgpXTsKLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgYWwuc2l6ZSgpOyBsb29wKyspIHsKLSAgICAgICAgICAgIGFbbG9vcF0gPSAoU3RyaW5nKSBhbC5nZXQobG9vcCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMganVzdCByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIHVucHJvY2Vzc2VkIGZsYWdzIC0gbWFpbmx5Ci0gICAgICogZm9yIGVycm9yIHJlcG9ydGluZyAtIHNvIHlvdSBjYW4gcmVwb3J0IHRoZSB1bmtub3duIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtYWluaW5nRmxhZ3MoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG51bGw7Ci0gICAgICAgIGludCBsb29wOwotCi0gICAgICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBhcmdzLmxlbmd0aDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAoKGFyZ3NbbG9vcF0gPT0gbnVsbCkgfHwgKGFyZ3NbbG9vcF0ubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcF0uY2hhckF0KDApICE9ICctJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoYXJnc1tsb29wXS5zdWJzdHJpbmcoMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgoc2IgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICA/IG51bGwKLSAgICAgICAgICAgICAgICA6IHNiLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLSAgICAgICAgcmV0dXJuIChpc1ZhbHVlU2V0KCd1JykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gaW50IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBmbGFnIHdhcwotICAgICAqIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgT25jZSB0aGlzIGZsYWcgaXMgbG9va2VkIGZvciB5b3UKLSAgICAgKiBtdXN0IHNhdmUgdGhlIHJlc3VsdCBiZWNhdXNlIGlmIHlvdSBjYWxsIGl0IGFnYWluIGZvciB0aGUgc2FtZQotICAgICAqIGZsYWcgeW91J2xsIGdldCB6ZXJvLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaXNGbGFnU2V0KGNoYXIgb3B0Q2hhcikgewotICAgICAgICBpbnQgdmFsdWUgPSAwOwotICAgICAgICBpbnQgbG9vcDsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgKHVzZWRBcmdzICE9IG51bGwpICYmIChsb29wIDwgdXNlZEFyZ3Muc2l6ZSgpKTsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgdXNlZEFyZ3MuZWxlbWVudEF0KGxvb3ApOwotCi0gICAgICAgICAgICBpZiAoYXJnLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZy5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZy5jaGFyQXQoaSkgPT0gb3B0Q2hhcikgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBhcmdzLmxlbmd0aDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAoKGFyZ3NbbG9vcF0gPT0gbnVsbCkgfHwgKGFyZ3NbbG9vcF0ubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcF0uY2hhckF0KDApICE9ICctJykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoKGFyZ3NbbG9vcF0gIT0gbnVsbCkgJiYgKGkgPSBhcmdzW2xvb3BdLmluZGV4T2Yob3B0Q2hhcikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tsb29wXSA9IGFyZ3NbbG9vcF0uc3Vic3RyaW5nKDAsIGkpICsgYXJnc1tsb29wXS5zdWJzdHJpbmcoaSArIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcF0ubGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBhcmdzW2xvb3BdID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YWx1ZSsrOwotCi0gICAgICAgICAgICAgICAgaWYgKHVzZWRBcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlZEFyZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXNlZEFyZ3MuYWRkKCItIiArIG9wdENoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyAob3IgbnVsbCkgc3BlY2lmeWluZyB0aGUgdmFsdWUgZm9yIHRoZSBwYXNzZWQKLSAgICAgKiBvcHRpb24uICBJZiB0aGUgb3B0aW9uIGlzbid0IHRoZXJlIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4gIFRoZQotICAgICAqIG9wdGlvbidzIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgb25lIG9mIHR3byB3YXlzOgotICAgICAqIC14IHZhbHVlCi0gICAgICogLXh2YWx1ZQotICAgICAqIE5vdGUgdGhhdDogIC1heCB2YWx1ZQotICAgICAqIGlzIG5vdCB2YWx1ZSAobWVhbmluZyBmbGFnICdhJyBmb2xsb3dlZCBieSBvcHRpb24gJ3gnLgotICAgICAqIE9wdGlvbnMgd2l0aCB2YWx1ZXMgbXVzdCBiZSB0aGUgZmlyc3QgY2hhciBhZnRlciB0aGUgJy0nLgotICAgICAqIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIHRoZW4gdGhlIGxhc3Qgb25lIHdpbnMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBpc1ZhbHVlU2V0KGNoYXIgb3B0Q2hhcikgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBpbnQgbG9vcDsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgKHVzZWRBcmdzICE9IG51bGwpICYmIChsb29wIDwgdXNlZEFyZ3Muc2l6ZSgpKTsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gKFN0cmluZykgdXNlZEFyZ3MuZWxlbWVudEF0KGxvb3ApOwotCi0gICAgICAgICAgICBpZiAoKGFyZy5jaGFyQXQoMCkgIT0gJy0nKSB8fCAoYXJnLmNoYXJBdCgxKSAhPSBvcHRDaGFyKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YWx1ZSA9IGFyZy5zdWJzdHJpbmcoMik7Ci0KLSAgICAgICAgICAgIGlmIChsb29wICsgMSA8IHVzZWRBcmdzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gKFN0cmluZykgdXNlZEFyZ3MuZWxlbWVudEF0KCsrbG9vcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgYXJncy5sZW5ndGg7IGxvb3ArKykgewotICAgICAgICAgICAgaWYgKChhcmdzW2xvb3BdID09IG51bGwpIHx8IChhcmdzW2xvb3BdLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhcmdzW2xvb3BdLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaSA9IGFyZ3NbbG9vcF0uaW5kZXhPZihvcHRDaGFyKTsKLQotICAgICAgICAgICAgaWYgKGkgIT0gMSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaSAhPSBhcmdzW2xvb3BdLmxlbmd0aCgpIC0gMSkgewotCi0gICAgICAgICAgICAgICAgLy8gTm90IGF0IGVuZCBvZiBhcmcsIHNvIHVzZSByZXN0IG9mIGFyZyBhcyB2YWx1ZQotICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnc1tsb29wXS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICAgICAgICAgIGFyZ3NbbG9vcF0gPSBhcmdzW2xvb3BdLnN1YnN0cmluZygwLCBpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGNoYXIgZnJvbSB0aGUgY3VycmVudCBhcmcKLSAgICAgICAgICAgICAgICBhcmdzW2xvb3BdID0gYXJnc1tsb29wXS5zdWJzdHJpbmcoMCwgaSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGFmdGVyIGNoYXIgc28gdXNlIG5leHQgYXJnCi0gICAgICAgICAgICAgICAgaWYgKChsb29wICsgMSA8IGFyZ3MubGVuZ3RoKSAmJiAoYXJnc1tsb29wICsgMV0gIT0gbnVsbCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGFyZyBpcyB0aGVyZSBhbmQgbm9uLW51bGwKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbbG9vcCArIDFdLmNoYXJBdCgwKSAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnc1tsb29wICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2xvb3AgKyAxXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaXMgbnVsbCBvciBub3QgdGhlcmUgLSBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlID0gbnVsbCA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXJnc1tsb29wXS5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgYXJnc1tsb29wXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvciBub3csIGtlZXAgbG9vcGluZyB0byBnZXQgdGhhdCBsYXN0IG9uIHRoZXJlCi0gICAgICAgICAgICAvLyBicmVhayA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHVzZWRBcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VkQXJncyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdXNlZEFyZ3MuYWRkKCItIiArIG9wdENoYXIpOwotCi0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdXNlZEFyZ3MuYWRkKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAodmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNWYWxpZGF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL09wdGlvbnNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNjcwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9PcHRpb25zVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIHRoZSBvcHRpb25zIHZhbGlkYXRvci4gVGhpcyBhY3RzIGFzIHRoZSBpbnB1dCBmb3IgdGhlIGNvbW1hbmRsaW5lT3B0aW9ucyBwYXJzZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcHRpb25zVmFsaWRhdG9yIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUG9saWN5TG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUG9saWN5TG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY5N2Y2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1BvbGljeUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGE7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EYXRhUmV0cmlldmFsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRGF0YVJldHJpZXZhbFJlcXVlc3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmU7DQotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeVJlZ2lzdHJ5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBQb2xpY3lMb2NhdG9yIGltcGxlbWVudHMgUG9saWN5UmVnaXN0cnkgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nZ2VyID0gTG9nRmFjdG9yeS5nZXRMb2coUG9saWN5TG9jYXRvci5jbGFzcyk7DQotDQotCXByaXZhdGUgQXhpc1NlcnZpY2Ugc2VydmljZTsNCi0NCi0JcHVibGljIFBvbGljeUxvY2F0b3IoQXhpc1NlcnZpY2Ugc2VydmljZSkgew0KLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgUG9saWN5IGxvb2t1cChTdHJpbmcgaWRlbnRpZmllcikgew0KLQkJUG9saWN5IHBvbGljeSA9IHNlcnZpY2UubG9va3VwUG9saWN5KGlkZW50aWZpZXIpOw0KLQkJaWYgKHBvbGljeSA9PSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOw0KLQkJCQltc2dDb250ZXh0LnNldEF4aXNTZXJ2aWNlKHNlcnZpY2UpOw0KLQ0KLQkJCQlEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0ID0gbmV3IERhdGFSZXRyaWV2YWxSZXF1ZXN0KCk7DQotCQkJCXJlcXVlc3QucHV0RGlhbGVjdChEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9QT0xJQ1kpOw0KLQkJCQlyZXF1ZXN0LnB1dElkZW50aWZpZXIoaWRlbnRpZmllcik7DQotDQotCQkJCURhdGFbXSBkYXRhID0gc2VydmljZS5nZXREYXRhKHJlcXVlc3QsIG1zZ0NvbnRleHQpOw0KLQkJCQlpZiAoZGF0YS5sZW5ndGggIT0gMCkgew0KLQkJCQkJT01FbGVtZW50IGVsZW1lbnQgPSAoT01FbGVtZW50KSBkYXRhWzBdLmdldERhdGEoKTsNCi0JCQkJCQ0KLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgew0KLQkJCQkJCXJldHVybiBQb2xpY3lFbmdpbmUuZ2V0UG9saWN5KGVsZW1lbnQpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCQ0KLQkJCX0gY2F0Y2ggKERhdGFSZXRyaWV2YWxFeGNlcHRpb24gZXgpIHsNCi0JCQkJbG9nZ2VyLmVycm9yKCIiICsgZXgpOw0KLQkJCX0gY2F0Y2ggKEF4aXNGYXVsdCBleCkgew0KLQkJCQlsb2dnZXIuZXJyb3IoIiIgKyBleCk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHBvbGljeTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCByZWdpc3RlcihTdHJpbmcgaWRlbnRpZmllciwgUG9saWN5IHBvbGljeSkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpZGVudGlmaWVyKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Qb2xpY3lVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9Qb2xpY3lVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjIzZmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUG9saWN5VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3lFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5UmVmZXJlbmNlOwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTTJXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3lVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhZmVTdHJpbmcoU3RyaW5nIHVuc2FmZVN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQljaGFyW10gY2hhcnMgPSB1bnNhZmVTdHJpbmcudG9DaGFyQXJyYXkoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGMgPSBjaGFyc1tpXTsKLQotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICdcXCc6Ci0JCQkJc2J1Zi5hcHBlbmQoJ1xcJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoJ1xcJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYnVmLmFwcGVuZCgnXFwnKTsKLQkJCQlzYnVmLmFwcGVuZCgnIicpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCXNidWYuYXBwZW5kKCdcXCcpOwotCQkJCXNidWYuYXBwZW5kKCduJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccic6Ci0JCQkJc2J1Zi5hcHBlbmQoJ1xcJyk7Ci0JCQkJc2J1Zi5hcHBlbmQoJ3InKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2J1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc2J1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5UmVmZXJlbmNlIGNyZWF0ZVBvbGljeVJlZmVyZW5jZShQb2xpY3kgcG9saWN5KSB7Ci0JCVBvbGljeVJlZmVyZW5jZSBwb2xpY3lSZWZlcmVuY2UgPSBuZXcgUG9saWN5UmVmZXJlbmNlKCk7Ci0JCVN0cmluZyBrZXkgPSBwb2xpY3kuZ2V0TmFtZSgpOwotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCWtleSA9IHBvbGljeS5nZXRJZCgpOwotCQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQkJa2V5ID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0JCQkJcG9saWN5LnNldElkKGtleSk7Ci0JCQl9Ci0JCQlwb2xpY3lSZWZlcmVuY2Uuc2V0VVJJKCIjIiArIGtleSk7Ci0JCX0gZWxzZSB7Ci0JCQlwb2xpY3lSZWZlcmVuY2Uuc2V0VVJJKGtleSk7Ci0JCX0KLQkJcmV0dXJuIHBvbGljeVJlZmVyZW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgKLQkJCVBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQsCi0JCQlFeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIgZXh0ZXJuYWxQb2xpY3lTZXJpYWxpemVyKQotCQkJdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0KLQkJaWYgKHBvbGljeUNvbXBvbmVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlleHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIuc2VyaWFsaXplKChQb2xpY3kpIHBvbGljeUNvbXBvbmVudCwgYmFvcyk7Ci0JCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MKLQkJCQkJLnRvQnl0ZUFycmF5KCkpOwotCQkJcmV0dXJuIChPTUVsZW1lbnQpIFhNTFV0aWxzLnRvT00oYmFpcyk7Ci0KLQkJfSBlbHNlIHsKLQkJCU9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJCU9NRWxlbWVudCBlbGVtID0gZmFjLmNyZWF0ZU9NRWxlbWVudChDb25zdGFudHMuRUxFTV9QT0xJQ1lfUkVGLAotCQkJCQlDb25zdGFudHMuVVJJX1BPTElDWV9OUywgQ29uc3RhbnRzLkFUVFJfV1NQKTsKLQkJCWVsZW0uYWRkQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1VSSSwKLQkJCQkJKChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUNvbXBvbmVudCkuZ2V0VVJJKCksIG51bGwpOwotCQkJcmV0dXJuIGVsZW07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRQb2xpY3lDb21wb25lbnRBc09NRWxlbWVudCgKLQkJCVBvbGljeUNvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0JCQlGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoYmFvcyk7Ci0KLQkJY29tcG9uZW50LnNlcmlhbGl6ZSh3cml0ZXIpOwotCQl3cml0ZXIuZmx1c2goKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0JCXJldHVybiAoT01FbGVtZW50KSBYTUxVdGlscy50b09NKGJhaXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5Q29tcG9uZW50IGdldFBvbGljeUNvbXBvbmVudEZyb21PTUVsZW1lbnQoCi0JCQlPTUVsZW1lbnQgcG9saWN5Q29tcG9uZW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQotCQlpZiAoQ29uc3RhbnRzLlFfRUxFTV9QT0xJQ1kuZXF1YWxzKHBvbGljeUNvbXBvbmVudC5nZXRRTmFtZSgpKSkgewotCQkJcmV0dXJuIFBvbGljeUVuZ2luZS5nZXRQb2xpY3kocG9saWN5Q29tcG9uZW50KTsKLQotCQl9IGVsc2UgaWYgKHBvbGljeUNvbXBvbmVudC5nZXRRTmFtZSgpLmVxdWFscygKLQkJCQluZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMsIENvbnN0YW50cy5FTEVNX1BPTElDWV9SRUYpKSkgewotCQkJcmV0dXJuIFBvbGljeUVuZ2luZS5nZXRQb2xpY3lSZWZlcmVuY2UocG9saWN5Q29tcG9uZW50KTsKLQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkFncnVtZW50IGlzIG5laXRoZXIgYSA8d3NwOlBvbGljeT4gbm9yIGEgPHdzcDpQb2xpY3lSZWZlcmVuY2U+IGVsZW1lbnQiKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5IGdldFBvbGljeUZyb21PTUVsZW1lbnQoT01FbGVtZW50IHBvbGljeUVsZW1lbnQpIHsKLQkJaWYgKENvbnN0YW50cy5RX0VMRU1fUE9MSUNZLmVxdWFscyhwb2xpY3lFbGVtZW50LmdldFFOYW1lKCkpKSB7Ci0JCQlyZXR1cm4gUG9saWN5RW5naW5lLmdldFBvbGljeShwb2xpY3lFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJhcmd1bWVudCBpcyBub3QgYSA8d3NwOlBvbGljeSAuLj4gZWxlbWVudCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQb2xpY3lSZWZlcmVuY2UgZ2V0UG9saWN5UmVmZXJlbmNlRnJvbU9NRWxlbWVudCgKLQkJCU9NRWxlbWVudCBwb2xpY3lSZWZFbGVtZW50KSB7Ci0JCWlmIChDb25zdGFudHMuVVJJX1BPTElDWV9OUy5lcXVhbHMocG9saWN5UmVmRWxlbWVudC5nZXROYW1lc3BhY2UoKQotCQkJCS5nZXROYW1lc3BhY2VVUkkoKSkKLQkJCQkmJiBDb25zdGFudHMuRUxFTV9QT0xJQ1lfUkVGLmVxdWFscyhwb2xpY3lSZWZFbGVtZW50Ci0JCQkJCQkuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQlyZXR1cm4gUG9saWN5RW5naW5lLmdldFBvbGljeVJlZmVyZW5jZShwb2xpY3lSZWZFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJhcmd1bWVudCBpcyBub3QgYSA8d3NwOlBvbGljeVJlZmVyZW5jZT4gZWxlbWVudCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQb2xpY3lDb21wb25lbnQgZ2V0UG9saWN5Q29tcG9uZW50KG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoQ29uc3RhbnRzLlVSSV9QT0xJQ1lfTlMuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0KLQkJCWlmIChDb25zdGFudHMuRUxFTV9QT0xJQ1kuZXF1YWxzKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIFBvbGljeUVuZ2luZS5nZXRQb2xpY3kobm9kZVRvU3RyZWFtKGVsZW1lbnQpKTsKLQotCQkJfSBlbHNlIGlmIChDb25zdGFudHMuRUxFTV9QT0xJQ1lfUkVGLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkgewotCQkJCXJldHVybiBQb2xpY3lFbmdpbmUuZ2V0UG9saWN5UmVmZXJlbmUobm9kZVRvU3RyZWFtKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCSJBZ3J1bWVudCBpcyBuZWl0aGVyIGEgPHdzcDpQb2xpY3k+IG5vciBhIDx3c3A6UG9saWN5UmVmZXJlbmNlPiBlbGVtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gbm9kZVRvU3RyZWFtKG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbWVudCkgewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJVHJhbnNmb3JtZXIgdGY7Ci0JCXRyeSB7Ci0JCQkvLyB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQkvLyB0Zi50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlbGVtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0JCQlTdHJpbmcgbm9kZVN0cmluZyA9IERPTTJXcml0ZXIubm9kZVRvU3RyaW5nKGVsZW1lbnQpOwotCQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShub2RlU3RyaW5nLmdldEJ5dGVzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBwcm9jZXNzIHBvbGljeSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9saWN5Q29tcG9uZW50VG9TdHJpbmcoUG9saWN5Q29tcG9uZW50IHBvbGljeUNvbXBvbmVudCkKLQkJCXRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihiYW9zKTsKLQotCQlwb2xpY3lDb21wb25lbnQuc2VyaWFsaXplKHdyaXRlcik7Ci0JCXdyaXRlci5mbHVzaCgpOwotCi0JCXJldHVybiBiYW9zLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVJZChBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJUG9saWN5SW5jbHVkZSBwb2xpY3lJbmNsdWRlID0gZGVzY3JpcHRpb24uZ2V0UG9saWN5SW5jbHVkZSgpOwotCQlTdHJpbmcgaWRlbnRpZmllciA9ICItcG9saWN5LTEiOwotCi0JCWlmIChkZXNjcmlwdGlvbiBpbnN0YW5jZW9mIEF4aXNNZXNzYWdlKSB7Ci0JCQlpZGVudGlmaWVyID0gIm1zZy0iICsgKChBeGlzTWVzc2FnZSkgZGVzY3JpcHRpb24pLmdldE5hbWUoKQotCQkJCQkrIGlkZW50aWZpZXI7Ci0JCQlkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLmdldFBhcmVudCgpOwotCQl9Ci0KLQkJaWYgKGRlc2NyaXB0aW9uIGluc3RhbmNlb2YgQXhpc09wZXJhdGlvbikgewotCQkJaWRlbnRpZmllciA9ICJvcC0iICsgKChBeGlzT3BlcmF0aW9uKSBkZXNjcmlwdGlvbikuZ2V0TmFtZSgpCi0JCQkJCSsgaWRlbnRpZmllcjsKLQkJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlpZiAoZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBBeGlzU2VydmljZSkgewotCQkJaWRlbnRpZmllciA9ICJzZXJ2aWNlLSIgKyAoKEF4aXNTZXJ2aWNlKSBkZXNjcmlwdGlvbikuZ2V0TmFtZSgpCi0JCQkJCSsgaWRlbnRpZmllcjsKLQkJfQotCi0JCS8qCi0JCSAqIEludCA0OSBpcyB0aGUgdmFsdWUgb2YgdGhlIENoYXJhY3RlciAnMScuIEhlcmUgd2Ugd2FudCB0byBjaGFuZ2UgJzEnCi0JCSAqIHRvICcyJyBvciAnMicgdG8gJzMnIC4uIGV0Yy4gdG8gY29uc3RydWN0IGEgdW5pcXVlIGlkZW50aWZpZXIuCi0JCSAqLwotCQlmb3IgKGludCBpbmRleCA9IDQ5OyBwb2xpY3lJbmNsdWRlLmdldFBvbGljeShpZGVudGlmaWVyKSAhPSBudWxsOyBpbmRleCsrKSB7Ci0JCQlpZGVudGlmaWVyID0gaWRlbnRpZmllci5yZXBsYWNlKChjaGFyKSBpbmRleCwgKGNoYXIpIChpbmRleCArIDEpKTsKLQkJfQotCi0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUG9saWN5IGdldE1lcmdlZFBvbGljeShMaXN0IHBvbGljaWVzLAotCQkJQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0KLQkJUG9saWN5IHBvbGljeSA9IG51bGw7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvbGljaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwb2xpY3lFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBvbGljeUVsZW1lbnQgaW5zdGFuY2VvZiBQb2xpY3kpIHsKLQkJCQlwb2xpY3kgPSAocG9saWN5ID09IG51bGwpID8gKFBvbGljeSkgcG9saWN5RWxlbWVudAotCQkJCQkJOiAoUG9saWN5KSBwb2xpY3kubWVyZ2UoKFBvbGljeSkgcG9saWN5RWxlbWVudCk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJUG9saWN5UmVmZXJlbmNlIHBvbGljeVJlZmVyZW5jZSA9IChQb2xpY3lSZWZlcmVuY2UpIHBvbGljeUVsZW1lbnQ7Ci0JCQkJUG9saWN5IHBvbGljeTIgPSAoUG9saWN5KSBwb2xpY3lSZWZlcmVuY2Uubm9ybWFsaXplKAotCQkJCQkJbmV3IEF4aXNQb2xpY3lMb2NhdG9yKGRlc2NyaXB0aW9uKSwgZmFsc2UpOwotCQkJCXBvbGljeSA9IChwb2xpY3kgPT0gbnVsbCkgPyBwb2xpY3kyIDogKFBvbGljeSkgcG9saWN5Ci0JCQkJCQkubWVyZ2UocG9saWN5Mik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocG9saWN5ICE9IG51bGwpIHsKLQkJCXBvbGljeSA9IChQb2xpY3kpIHBvbGljeS5ub3JtYWxpemUobmV3IEF4aXNQb2xpY3lMb2NhdG9yKAotCQkJCQlkZXNjcmlwdGlvbiksIGZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBwb2xpY3k7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQb2xpY3kgZ2V0TWVyZ2VkUG9saWN5KExpc3QgcG9saWNpZXMsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLQotCQlQb2xpY3kgcG9saWN5ID0gbnVsbDsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9saWNpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHBvbGljeUVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJCXBvbGljeSA9IChwb2xpY3kgPT0gbnVsbCkgPyAoUG9saWN5KSBwb2xpY3lFbGVtZW50Ci0JCQkJCQk6IChQb2xpY3kpIHBvbGljeS5tZXJnZSgoUG9saWN5KSBwb2xpY3lFbGVtZW50KTsKLQotCQkJfSBlbHNlIHsKLQkJCQlQb2xpY3lSZWZlcmVuY2UgcG9saWN5UmVmZXJlbmNlID0gKFBvbGljeVJlZmVyZW5jZSkgcG9saWN5RWxlbWVudDsKLQkJCQlQb2xpY3kgcG9saWN5MiA9IChQb2xpY3kpIHBvbGljeVJlZmVyZW5jZS5ub3JtYWxpemUoCi0JCQkJCQluZXcgUG9saWN5TG9jYXRvcihzZXJ2aWNlKSwgZmFsc2UpOwotCQkJCXBvbGljeSA9IChwb2xpY3kgPT0gbnVsbCkgPyBwb2xpY3kyIDogKFBvbGljeSkgcG9saWN5Ci0JCQkJCQkubWVyZ2UocG9saWN5Mik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocG9saWN5ICE9IG51bGwpIHsKLQkJCXBvbGljeSA9IChQb2xpY3kpIHBvbGljeS5ub3JtYWxpemUobmV3IFBvbGljeUxvY2F0b3Ioc2VydmljZSksCi0JCQkJCWZhbHNlKTsKLQkJfQotCi0JCXJldHVybiBwb2xpY3k7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUHJldHR5UHJpbnRlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvUHJldHR5UHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDBlMDAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1ByZXR0eVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFRpZGllcyB1cCB0aGUgamF2YSBzb3VyY2UgY29kZSB1c2luZyBKYWxvcHkuCi0gKiBUaGlzIGlzIHVzZWQgYnkgYm90aCBBREIgYW5kIENvZGVnZW4gaGVuY2UgbmVlZHMgdG8gYmUgaW4gdGhlCi0gKiBjb21tb25zIHJhdGhlciB0aGFuIGEgc3BlY2lmaWMgbW9kdWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmV0dHlQcmludGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUHJldHR5UHJpbnRlci5jbGFzcyk7Ci0KLQotICAgIC8qKgotICAgICAqIFByZXR0eSBwcmludHMgY29udGVudHMgb2YgdGhlIGphdmEgc291cmNlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmV0dGlmeShGaWxlIGZpbGUpIHsKLSAgICAgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNldCAiYXhpczIuamFsb3B5PWZhbHNlIiBvbiB0aGUgc3lzdGVtIHByb3BlcnR5LAotICAgICAgICAvLyB0aGVuIGp1c3QgcmV0dXJuIGJhY2sgdG8gY2FsbGVyCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYXhpczIuamFsb3B5Iik7Ci0gICAgICAgIGlmKChwcm9wZXJ0eSA9PSBudWxsKSB8fCAhSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkocHJvcGVydHkpKXsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBQcmludFN0cmVhbSBiYWNrdXBPdXRwdXRTdHJlYW0gPSBTeXN0ZW0ub3V0OwotICAgICAgICBQcmludFN0cmVhbSBiYWNrdXBFcnJvclN0cmVhbSA9IFN5c3RlbS5lcnI7Ci0gICAgICAgIFN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkpOwotICAgICAgICBTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGNsYXp6Q29uZmlndXJhdG9yID0gTG9hZGVyLmxvYWRDbGFzcygib3JnLmFwYWNoZS5sb2c0ai5Qcm9wZXJ0eUNvbmZpZ3VyYXRvciIpOwotICAgICAgICAgICAgTWV0aG9kIGNvbmZpZ3VyZSA9IGNsYXp6Q29uZmlndXJhdG9yLmdldE1ldGhvZCgiY29uZmlndXJlIiwgbmV3IENsYXNzW117UHJvcGVydGllcy5jbGFzc30pOwotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvIiwKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJsb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbyIsICJGQVRBTCIpKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyZS5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde3Byb3BlcnRpZXN9KTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBKYWxvcHkgYmVhbgotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBMb2FkZXIubG9hZENsYXNzKCJkZS5odW5zaWNrZXIuamFsb3B5LkphbG9weSIpOwotICAgICAgICAgICAgT2JqZWN0IHByZXR0aWZpZXIgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGlucHV0IGZpbGUKLSAgICAgICAgICAgIE1ldGhvZCBpbnB1dCA9IGNsYXp6LmdldE1ldGhvZCgic2V0SW5wdXQiLCBuZXcgQ2xhc3NbXXtGaWxlLmNsYXNzfSk7Ci0gICAgICAgICAgICBpbnB1dC5pbnZva2UocHJldHRpZmllciwgbmV3IE9iamVjdFtde2ZpbGV9KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgICAgTWV0aG9kIG91dHB1dCA9IGNsYXp6LmdldE1ldGhvZCgic2V0T3V0cHV0IiwgbmV3IENsYXNzW117RmlsZS5jbGFzc30pOwotICAgICAgICAgICAgb3V0cHV0Lmludm9rZShwcmV0dGlmaWVyLCBuZXcgT2JqZWN0W117ZmlsZX0pOwotCi0gICAgICAgICAgICBDbGFzcyBjbGF6ejIgPSBMb2FkZXIubG9hZENsYXNzKCJkZS5odW5zaWNrZXIuamFsb3B5LnN0b3JhZ2UuQ29udmVudGlvbiIpOwotICAgICAgICAgICAgTWV0aG9kIGluc3RhbmNlID0gY2xhenoyLmdldE1ldGhvZCgiZ2V0SW5zdGFuY2UiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgIE9iamVjdCBzZXR0aW5ncyA9IGluc3RhbmNlLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117fSk7Ci0KLSAgICAgICAgICAgIENsYXNzIGNsYXp6MyA9IExvYWRlci5sb2FkQ2xhc3MoImRlLmh1bnNpY2tlci5qYWxvcHkuc3RvcmFnZS5Db252ZW50aW9uS2V5cyIpOwotICAgICAgICAgICAgRmllbGQgZmllbGQgPSBjbGF6ejMuZ2V0RmllbGQoIkNPTU1FTlRfRk9STUFUX01VTFRJX0xJTkUiKTsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBmaWVsZC5nZXQobnVsbCk7Ci0gICAgICAgICAgICBNZXRob2QgcHV0ID0gY2xhenoyLmdldE1ldGhvZCgicHV0IiwgbmV3IENsYXNzW117a2V5LmdldENsYXNzKCksIFN0cmluZy5jbGFzc30pOwotICAgICAgICAgICAgcHV0Lmludm9rZShzZXR0aW5ncywgbmV3IE9iamVjdFtde2tleSwgInRydWUifSk7Ci0KLSAgICAgICAgICAgIC8vIGZvcm1hdCBhbmQgb3ZlcndyaXRlIHRoZSBnaXZlbiBpbnB1dCBmaWxlCi0gICAgICAgICAgICBNZXRob2QgZm9ybWF0ID0gY2xhenouZ2V0TWV0aG9kKCJmb3JtYXQiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgIGZvcm1hdC5pbnZva2UocHJldHRpZmllciwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcmV0dHkgcHJpbnRlZCBmaWxlIDogIiArIGZpbGUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiSmFsb3B5L0xvZzRqIG5vdCBmb3VuZCAtIHVuYWJsZSB0byBwcmV0dHkgcHJpbnQgIiArIGZpbGUpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLndhcm4oIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcHJldHR5IHByaW50IGZpbGUgIiArIGZpbGUsIGUpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHByZXR0eSBwcmludCBmaWxlICIgKyBmaWxlLCB0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQoYmFja3VwT3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoYmFja3VwRXJyb3JTdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU2NoZW1hVXRpbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU2NoZW1hVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZkMGNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1NjaGVtYVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbXBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWFJbmNsdWRlOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hT2JqZWN0Q29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYVV0aWwgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTY2hlbWFVdGlsLmNsYXNzKTsKLQotCi0gICAgcHVibGljIHN0YXRpYyBYbWxTY2hlbWFbXSBnZXRBbGxTY2hlbWFzKFhtbFNjaGVtYSBzY2hlbWEpIHsKLSAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0cmF2ZXJzZVNjaGVtYXMoc2NoZW1hLCBtYXApOwotICAgICAgICByZXR1cm4gKFhtbFNjaGVtYVtdKSBtYXAudmFsdWVzKCkudG9BcnJheShuZXcgWG1sU2NoZW1hW21hcC52YWx1ZXMoKS5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYXZlcnNlU2NoZW1hcyhYbWxTY2hlbWEgc2NoZW1hLCBIYXNoTWFwIG1hcCkgewotICAgICAgICBTdHJpbmcga2V5ID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICsgIjoiICsgc2NoZW1hLmdldFNvdXJjZVVSSSgpOwotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtYXAucHV0KGtleSwgc2NoZW1hKTsKLQotICAgICAgICBYbWxTY2hlbWFPYmplY3RDb2xsZWN0aW9uIGluY2x1ZGVzID0gc2NoZW1hLmdldEluY2x1ZGVzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0ZW1wSXRlcmF0b3IgPSBpbmNsdWRlcy5nZXRJdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHRlbXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHRlbXBJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYbWxTY2hlbWFJbXBvcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYTEgPSAoKFhtbFNjaGVtYUltcG9ydCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlU2NoZW1hcyhzY2hlbWExLCBtYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWG1sU2NoZW1hSW5jbHVkZSkgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hMSA9ICgoWG1sU2NoZW1hSW5jbHVkZSkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWExICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlU2NoZW1hcyhzY2hlbWExLCBtYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU2VsZk1hbmFnZWREYXRhSG9sZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TZWxmTWFuYWdlZERhdGFIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlNDI0ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TZWxmTWFuYWdlZERhdGFIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5FeHRlcm5hbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXQ7Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXQ7Ci0KLXB1YmxpYyBjbGFzcyBTZWxmTWFuYWdlZERhdGFIb2xkZXIgaW1wbGVtZW50cyBFeHRlcm5hbGl6YWJsZSB7Ci0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgY2xhc3NuYW1lOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyBpZDsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBieXRlW10gZGF0YTsKLQotICAgIHB1YmxpYyBTZWxmTWFuYWdlZERhdGFIb2xkZXIoKSB7Ci0gICAgICAgIC8vIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIE9iamVjdFN0YXRlVXRpbHMKLSAgICB9Ci0KLSAgICAvLyBUT0RPIGJldHRlciBleGNlcHRpb24KLSAgICBwdWJsaWMgU2VsZk1hbmFnZWREYXRhSG9sZGVyKFN0cmluZyBjbGFzc25hbWUsIFN0cmluZyBpZCwgYnl0ZVtdIGRhdGEpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoKGNsYXNzbmFtZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChpZCA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGNhbm5vdCBiZSBudWxsOiBjbGFzc25hbWUgPSAiICsgY2xhc3NuYW1lICsgIiwgaWQgPSAiICsgaWQpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0KLSAgICAgICAgLy8gVE9ETyBkZWVwIGNvcHkgbmVjZXNzYXJ5PwotICAgICAgICB0aGlzLmRhdGEgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5kYXRhW2ldID0gZGF0YVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcmVhZEV4dGVybmFsKE9iamVjdElucHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBjbGFzc25hbWUgPSAoU3RyaW5nKSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIGlkID0gKFN0cmluZykgaW4ucmVhZFVURigpOwotICAgICAgICBpbnQgZGF0YWxlbmd0aCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgZGF0YSA9IG5ldyBieXRlW2RhdGFsZW5ndGhdOwotICAgICAgICBpbi5yZWFkKGRhdGEpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVFeHRlcm5hbChPYmplY3RPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQud3JpdGVVVEYoY2xhc3NuYW1lKTsKLSAgICAgICAgb3V0LndyaXRlVVRGKGlkKTsKLSAgICAgICAgb3V0LndyaXRlSW50KGRhdGEubGVuZ3RoKTsKLSAgICAgICAgb3V0LndyaXRlKGRhdGEpOwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc25hbWUoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc25hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXREYXRhKCkgewotICAgICAgICByZXR1cm4gZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TZXNzaW9uVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1Nlc3Npb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjZjMzU4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1Nlc3Npb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNlc3Npb25VdGlscyB7Ci0KLSAgICAvKioKLSAgICAgKiBXYWxrIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc2VydmljZXMgYW5kIHVzZSB0aGUgbWluaW11bSBvZiB0aGUgc2NvcGVzIGFzIHRoZSBzY29wZSBmb3IgdGhlIHdob2xlIHNlcnZpY2UgZ3JvdXAKLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzU2VydmljZUdyb3VwCi0gICAgICogQHJldHVybiBzY29wZSBmb3IgdGhlIHNlcnZpY2UgZ3JvdXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjYWxjdWxhdGVNYXhTY29wZUZvclNlcnZpY2VHcm91cChBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXApIHsKLSAgICAgICAgSXRlcmF0b3I8QXhpc1NlcnZpY2U+IHNlcnZpY3MgPSBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIGludCBtYXhTY29wZSA9IDE7Ci0gICAgICAgIHdoaWxlIChzZXJ2aWNzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY3MubmV4dCgpOwotICAgICAgICAgICAgaW50IHNjb3BlSW50VmFsdWUgPSBnZXRTY29wZUludFZhbHVlKGF4aXNTZXJ2aWNlLmdldFNjb3BlKCkpOwotICAgICAgICAgICAgaWYgKG1heFNjb3BlIDwgc2NvcGVJbnRWYWx1ZSkgewotICAgICAgICAgICAgICAgIG1heFNjb3BlID0gc2NvcGVJbnRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0U2NvcGVTdHJpbmcobWF4U2NvcGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnZlcnQgc2NvcGUgaW50byBhIG51bWVyaWNhbCB2YWx1ZQotICAgICAqCi0gICAgICogQHBhcmFtIHNjb3BlCi0gICAgICogQHJldHVybiBpbnRlZ2VyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFNjb3BlSW50VmFsdWUoU3RyaW5nIHNjb3BlKSB7Ci0gICAgICAgIGlmIChDb25zdGFudHMuU0NPUEVfUkVRVUVTVC5lcXVhbHMoc2NvcGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLlNDT1BFX1NPQVBfU0VTU0lPTi5lcXVhbHMoc2NvcGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04uZXF1YWxzKHNjb3BlKSkgewotICAgICAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYWN0dWFsIHNjb3BlIHN0cmluZyBnaXZlbiB0aGUgbnVtZXJpY2FsIHZhbHVlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcmV0dXJuIHN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTY29wZVN0cmluZyhpbnQgc2NvcGUpIHsKLSAgICAgICAgc3dpdGNoIChzY29wZSkgewotICAgICAgICAgICAgY2FzZSAxIDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfUkVRVUVTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgMiA6IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlNDT1BFX1RSQU5TUE9SVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAzIDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfU09BUF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSA0IDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0IDogewotICAgICAgICAgICAgICAgIHJldHVybiBDb25zdGFudHMuU0NPUEVfVFJBTlNQT1JUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TdHJlYW1XcmFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9TdHJlYW1XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NTU0YzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvU3RyZWFtV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkxvY2F0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgU3RyZWFtV3JhcHBlciBpbXBsZW1lbnRzIFhNTFN0cmVhbVJlYWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NXSVRDSEVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5JVCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NXSVRDSF9BVF9ORVhUID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09NUExFVEVfQVRfTkVYVCA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTVBMRVRFRCA9IDQ7Ci0gICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgcmVhbFJlYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBTVEFURV9JTklUOwotICAgIHByaXZhdGUgaW50IHByZXZTdGF0ZSA9IHN0YXRlOwotCi0KLSAgICBwdWJsaWMgU3RyZWFtV3JhcHBlcihYTUxTdHJlYW1SZWFkZXIgcmVhbFJlYWRlcikgewotICAgICAgICBpZiAocmVhbFJlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlYWRlciBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5yZWFsUmVhZGVyID0gcmVhbFJlYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmVhbFJlYWRlci5jbG9zZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHByZXZTdGF0ZSA9IHN0YXRlOwotICAgICAgICBpbnQgcmV0dXJuRXZlbnQgPSAtMTsKLQotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0lOSVQ6Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCkgPT0gU1RBUlRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9TV0lUQ0hFRDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuRXZlbnQgPSByZWFsUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NXSVRDSEVEOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURV9TV0lUQ0hFRDoKLSAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHJlYWxSZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5FdmVudCA9PSBFTkRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVhbFJlYWRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9DT01QTEVURV9BVF9ORVhUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgICAgY2FzZSBTVEFURV9TV0lUQ0hfQVRfTkVYVDoKLS8vICAgICAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfU1dJVENIRUQ7Ci0vLyAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0vLyAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NUExFVEVfQVRfTkVYVDoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICByZXR1cm5FdmVudCA9IEVORF9ET0NVTUVOVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIC8vb29wcyAtIG5vIHdheSB3ZSBjYW4gZ28gYmV5b25kIHRoaXMKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJlbmQgcmVhY2hlZCEiKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuRXZlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBuZXh0VGFnKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwcmV2U3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIubmV4dFRhZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWlyZShpbnQgaSwgU3RyaW5nIHMsIFN0cmluZyBzMSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZWFsUmVhZGVyLnJlcXVpcmUoaSwgcywgczEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gc3RhbmRhbG9uZVNldCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLnN0YW5kYWxvbmVTZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0QXR0cmlidXRlTG9jYWxOYW1lKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgaSkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldEF0dHJpYnV0ZU5hbWVzcGFjZShpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldEF0dHJpYnV0ZVByZWZpeChpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVUeXBlKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgcywgU3RyaW5nIHMxKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShzLCBzMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmdTY2hlbWUoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRDaGFyYWN0ZXJFbmNvZGluZ1NjaGVtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRUZXh0KCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRFbGVtZW50VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldEVuY29kaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0RPQ1VNRU5UOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYXRpb24gZ2V0TG9jYXRpb24oKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRMb2NhdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE5hbWVzcGFjZUNvbnRleHQgZ2V0TmFtZXNwYWNlQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldE5hbWVzcGFjZUNvbnRleHQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROYW1lc3BhY2VDb3VudCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldE5hbWVzcGFjZUNvdW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlUHJlZml4KGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXROYW1lc3BhY2VQcmVmaXgoaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKGludCBpKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXROYW1lc3BhY2VVUkkoaSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBzKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXROYW1lc3BhY2VVUkkocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElEYXRhKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0UElEYXRhKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UElUYXJnZXQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRQSVRhcmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldFByZWZpeCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0UHJvcGVydHkocyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2hhcltdIGdldFRleHRDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgY2hhclswXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGksIGNoYXJbXSBjaGFycywgaW50IGkxLCBpbnQgaTIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VGV4dENoYXJhY3RlcnMoaSwgY2hhcnMsIGkxLCBpMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmdldFRleHRMZW5ndGgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5nZXRUZXh0U3RhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuZ2V0VmVyc2lvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOYW1lKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaGFzTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoc3RhdGUgPT0gU1RBVEVfQ09NUExFVEVfQVRfTkVYVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gU1RBVEVfQ09NUExFVEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaGFzTmV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUZXh0KCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaGFzVGV4dCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGkpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmlzQXR0cmlidXRlU3BlY2lmaWVkKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDaGFyYWN0ZXJzKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaXNDaGFyYWN0ZXJzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuZEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5pc0VuZEVsZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsKLSAgICAgICAgaWYgKHN0YXRlICE9IFNUQVRFX0lOSVQpIHsKLSAgICAgICAgICAgIHJldHVybiByZWFsUmVhZGVyLmlzU3RhbmRhbG9uZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFydEVsZW1lbnQoKSB7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBTVEFURV9JTklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhbFJlYWRlci5pc1N0YXJ0RWxlbWVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKCkgewotICAgICAgICBpZiAoc3RhdGUgIT0gU1RBVEVfSU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxSZWFkZXIuaXNXaGl0ZVNwYWNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UYXJnZXRSZXNvbHZlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVGFyZ2V0UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxZjdlNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UYXJnZXRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLS8qKgotICogVGFyZ2V0UmVzb2x2ZXIKLSAqIDxwLz4KLSAqIEludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBjb2RlIHRvIHVwZGF0ZSB0aGUgaW52b2NhdGlvbiB0YXJnZXQgVVJMCi0gKiBiZWZvcmUgdGhlIHRyYW5zcG9ydCBpcyBzZWxlY3RlZCBhbmQgdGhlIGVuZ2luZSBpbnZva2VkLgotICogPHAvPgotICogRXhhbXBsZXMgb2YgdXNlOgotICogMS4gd3NhOlRvIHNldCB0byBhIFVSTiB2YWx1ZSB3aGljaCBuZWVkcyB0cmFuc2xhdGVkIHRvIGEgdGFyZ2V0YWJsZSBVUkwKLSAqIDIuIHN1cHBvcnQgY2x1c3RlcmluZyB3aGVyZSBhIHNpbmdsZSBVUkkgbWF5IHJlcGVzZW50IG11bHRpcGxlIHNlcnZlcnMgYW5kIG9uZSBtdXN0IGJlIHNlbGVjdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFyZ2V0UmVzb2x2ZXIgewotICAgIC8qKgotICAgICAqIHJlc29sdmVUYXJnZXQgZXhhbWluZXMgdGhlIE1lc3NhZ2VDb250ZXh0IGFuZCB1cGRhdGVzIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAqIGluIG9yZGVyIHRvIHJlc29sdmUgdGhlIHRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGFyZ2V0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2YzBkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBwaWVjZSBvZiBjb2RlIHRoYXQgd2lsbCBwbHVnIGludG8gdGhlIHVzZXIKLSAqIHByb2dyYW1taW5nIG1vZGVsIGltcGwgKGUuZy4gSkFYLVdTIGltcGwpIGFuZCB3aWxsIGJlIGludm9rZWQgd2hpbGUgb24gdGhlCi0gKiB1bHRpbWF0ZSB0aHJlYWQgb2YgZXhlY3V0aW9uLiAgSXQgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIG1lY2hhbmlzbSB0bwotICogYWxsb3cgaW5mb3JtYXRpb24gdG8gYmUgbWlncmF0ZWQgYmV0d2VlbiB0aGUgQXhpczIgY29udGV4dHMgYW5kIHRocmVhZAotICogbG9jYWwgc3RvcmFnZS4KLSAqIDxwLz4KLSAqIE5vdGU6IEl0IGlzIHVwIHRvIGVhY2ggcGFydGljdWxhciBwcm9ncmFtbWluZyBtb2RlbCBpbXBsIHRvIGRlY2lkZSB3aGV0aGVyCi0gKiBvciBub3QgdGhleSB3aXNoIHRvIG1ha2UgdXNlIG9mIHRoZSBUaHJlYWRDb250ZXh0TWlncmF0b3JzLgotICogPHAvPgotICogRm9yIGVhY2ggZ2VuZXJhbCBNRVAsIGhlcmUgaXMgdGhlIGludm9jYXRpb24gcGF0dGVybjoKLSAqIDxwLz4KLSAqIFtvbmUtd2F5IGluYm91bmRdCi0gKiBtaWdyYXRlQ29udGV4dFRvVGhyZWFkKHJlcSkKLSAqIGNsZWFudXBUaHJlYWQocmVxKQotICogPHAvPgotICogW3JlcS9yc3AgaW5ib3VuZF0KLSAqIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQocmVxKQotICogbWlncmF0ZVRocmVhZFRvQ29udGV4dChyc3ApCi0gKiBjbGVhbnVwQ29udGV4dChyc3ApCi0gKiBjbGVhbnVwVGhyZWFkKHJlcSkKLSAqIDxwLz4KLSAqIFtvbmUtd2F5IG91dGJvdW5kXQotICogbWlncmF0ZVRocmVhZFRvQ29udGV4dChyZXEpCi0gKiBjbGVhbnVwQ29udGV4dChyZXEpCi0gKiA8cC8+Ci0gKiBbcmVxL3JzcCBvdXRib3VuZCAoYm90aCBzeW5jIGFuZCBhc3luYyldCi0gKiBtaWdyYXRlVGhyZWFkVG9Db250ZXh0KHJlcSkKLSAqIGNsZWFudXBDb250ZXh0KHJlcSkKLSAqIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQocnNwKQotICogTm90ZTogdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjbGVhbnVwVGhyZWFkKHJzcCk7IG9uZSBvZiB0aGUgaW5ib3VuZAotICogY2FzZXMgd291bGQgbmVlZCB0byBoYW5kbGUgdGhpcwotICogPHAvPgotICogSWYgYSBmYXVsdCBvY2N1cnMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBvbmUgb2YgdGhlIG1pZ3JhdG9ycywgaXQgd2lsbCBiZQotICogdHJlYXRlZCBsaWtlIGFueSBvdGhlciBzZXJ2aWNlIGZhdWx0IChpLmUuIGxpa2Ugd2hhdCB3aWxsIGhhcHBlbiBpZiB3ZSBjYW4ndAotICogZGVsaXZlciB0aGUgbWVzc2FnZSB0byBhIHNlcnZpY2Ugb3IgaWYgYSBoYW5kbGVyIGZhaWxzLgotICogPHAvPgotICogVGhlIGNsZWFudXAqIG1ldGhvZHMgY2FuIGJlIGV4cGVjdGVkIHRvIGJlIGludm9rZWQgYWZ0ZXIgYW55IGV4ZWNlcHRpb24KLSAqIHRoYXQgb2NjdXJzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIG1pZ3JhdGlvbiB0aGF0IHdvdWxkIGNhdXNlIHRoYXQgc2NvcGUKLSAqIHRvIGJlIGxlZnQgc28gdGhhdCB0aGUgdGhyZWFkIGFuZC9vciBjb250ZXh0IG1heSBiZSBjbGVhbmVkIHVwIHByb3Blcmx5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRocmVhZENvbnRleHRNaWdyYXRvciB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgKiBndWFyYW50ZWVkIHRvIGJlIG9uIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGluCi0gICAgICogdXNlciBzcGFjZS4gIEl0IHdpbGwgYmUgaW52b2tlZCBmb3IgaW5jb21pbmcgbWVzc2FnZXMuCi0gICAgICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiB1c2UgdGhlIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZQotICAgICAqIE1lc3NhZ2VDb250ZXh0IHRvIGRldGVybWluZSB3aGV0aGVyIGEgcmVxdWVzdCBvciByZXNwb25zZSBpcyBiZWluZwotICAgICAqIHByb2Nlc3NlZC4KLSAgICAgKiAoZS5nLiBNZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICB2b2lkIG1pZ3JhdGVDb250ZXh0VG9UaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgbWVzc2FnZSBpcwotICAgICAqIGd1YXJhbnRlZWQgdG8gc3RpbGwgYmUgb24gdGhlIHRocmVhZCBvZiBleGVjdXRpb24gdGhhdCB3YXMgdXNlZCBpbiB1c2VyCi0gICAgICogc3BhY2UsIGFmdGVyIGFsbCBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQgKGkuZS4gd2hlbiB0aGUgcGFydGljdWxhcgotICAgICAqIHByb2Nlc3Npbmcgb2YgYSBtZXNzYWdlIGlzIHVud2luZGluZy4pICBJdCBwcm92aWRlcyBhIG1lY2hhbmlzbSB3aGljaCBjYW4KLSAgICAgKiBiZSB1c2VkIHRvIGNsZWFuIHVwIHRoZSBUTFMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKi8KLSAgICB2b2lkIGNsZWFudXBUaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgKiBndWFyYW50ZWVkIHRvIHN0aWxsIGJlIG9uIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgd2FzIHVzZWQgaW4KLSAgICAgKiB1c2VyIHNwYWNlLiAgSXQgd2lsbCBiZSBpbnZva2VkIGZvciBib3RoIG91dGdvaW5nIG1lc3NhZ2VzLgotICAgICAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBjYW4gdXNlIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUKLSAgICAgKiBNZXNzYWdlQ29udGV4dCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlcXVlc3Qgb3IgcmVzcG9uc2UgaXMgYmVpbmcKLSAgICAgKiBwcm9jZXNzZWQuCi0gICAgICogKGUuZy4gTWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgdm9pZCBtaWdyYXRlVGhyZWFkVG9Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UgaXMKLSAgICAgKiBndWFyYW50ZWVkIHRvIGJlIG9uIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGluIHVzZXIKLSAgICAgKiBzcGFjZSwgYWZ0ZXIgYWxsIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCAoaS5lLiB3aGVuIHRoZSBwYXJ0aWN1bGFyCi0gICAgICogcHJvY2Vzc2luZyBvZiBhIG1lc3NhZ2UgaXMgdW53aW5kaW5nLikgIEl0IHByb3ZpZGVzIGEgbWVjaGFuaXNtIHdoaWNoIGNhbgotICAgICAqIGJlIHVzZWQgdG8gY2xlYW4gdXAgdGhlIE1lc3NhZ2VDb250ZXh0IG9yIHJlc3RvcmUgVExTLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICovCi0gICAgdm9pZCBjbGVhbnVwQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGJjYjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gbWFrZSBpdCBlYXNpZXIvY2xlYW5lciBmb3IgdXNlciBwcm9ncmFtbWluZwotICogbW9kZWwtbGV2ZWwgaW1wbGVtZW50YXRpb25zIChlLmcuIHRoZSBBeGlzMiBKQVgtV1MgY29kZSkgdG8gaW52b2tlIHRoZQotICogVGhyZWFkQ29udGV4dE1pZ3JhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwgewotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmV3IFRocmVhZENvbnRleHRNaWdyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqIEBwYXJhbSB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1pZ3JhdG9ycy4KLSAgICAgKiBAcGFyYW0gbWlncmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGhyZWFkQ29udGV4dE1pZ3JhdG9yKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvciBtaWdyYXRvcikKLSAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhZGRUaHJlYWRDb250ZXh0TWlncmF0b3IoYXhpc0NvbmZpZ3VyYXRpb24sIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwgbWlncmF0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIGEgbmV3IFRocmVhZENvbnRleHRNaWdyYXRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzQ29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1pZ3JhdG9ycy4KLSAgICAgKiBAcGFyYW0gbWlncmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGhyZWFkQ29udGV4dE1pZ3JhdG9yKEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvciBtaWdyYXRvcikKLSAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwgbmV3IExpbmtlZExpc3QoKSk7Ci0gICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRQYXJhbWV0ZXIocGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBtaWdyYXRvckxpc3QgPSAoTGlzdCkgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgbWlncmF0b3JMaXN0LmFkZChtaWdyYXRvcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWN0aXZhdGUgYW55IHJlZ2lzdGVyZWQgVGhyZWFkQ29udGV4dE1pZ3JhdG9ycyB0byBtb3ZlIGNvbnRleHQgaW5mbwotICAgICAqIHRvIHRoZSB0aHJlYWQgb2YgZXhlY3V0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGluIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gdGhhdCBjb250YWlucwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgbWlncmF0b3JzLgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybU1pZ3JhdGlvblRvVGhyZWFkKFN0cmluZyB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IAotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcih0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IG1pZ3JhdG9yTGlzdCA9IChMaXN0KSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIHRocmVhZENvbnRleHRNaWdyYXRvcnMgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAoKFRocmVhZENvbnRleHRNaWdyYXRvcikgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWlncmF0ZUNvbnRleHRUb1RocmVhZChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdGl2YXRlIGFueSByZWdpc3RlcmVkIFRocmVhZENvbnRleHRNaWdyYXRvcnMgdG8gcmVtb3ZlIGluZm9ybWF0aW9uCi0gICAgICogZnJvbSB0aGUgdGhyZWFkIG9mIGV4ZWN1dGlvbiBpZiBuZWNlc3NhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyZWFkQ29udGV4dE1pZ3JhdG9yTGlzdElEIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBtaWdyYXRvcnMuCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybVRocmVhZENsZWFudXAoU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IAotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcih0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IG1pZ3JhdG9yTGlzdCA9IChMaXN0KSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIHRocmVhZENvbnRleHRNaWdyYXRvcnMgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAoKFRocmVhZENvbnRleHRNaWdyYXRvcikgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5uZXh0KCkpLmNsZWFudXBUaHJlYWQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY3RpdmF0ZSBhbnkgcmVnaXN0ZXJlZCBUaHJlYWRDb250ZXh0TWlncmF0b3JzIHRvIG1vdmUgaW5mbyBmcm9tIHRoZQotICAgICAqIHRocmVhZCBvZiBleGVjdXRpb24gaW50byB0aGUgY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIG1pZ3JhdG9ycy4KLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBlcmZvcm1NaWdyYXRpb25Ub0NvbnRleHQoU3RyaW5nIHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KQotICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IAotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcih0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0IG1pZ3JhdG9yTGlzdCA9IChMaXN0KSBwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgTGlzdEl0ZXJhdG9yIHRocmVhZENvbnRleHRNaWdyYXRvcnMgPSBtaWdyYXRvckxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAoKFRocmVhZENvbnRleHRNaWdyYXRvcikgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycy5uZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWlncmF0ZVRocmVhZFRvQ29udGV4dChtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFjdGl2YXRlIGFueSByZWdpc3RlcmVkIFRocmVhZENvbnRleHRNaWdyYXRvcnMgdG8gcmVtb3ZlIGluZm9ybWF0aW9uIGZyb20KLSAgICAgKiB0aGUgY29udGV4dCBpZiBuZWNlc3NhcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhyZWFkQ29udGV4dE1pZ3JhdG9yTGlzdElEIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBtaWdyYXRvcnMuCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGVyZm9ybUNvbnRleHRDbGVhbnVwKFN0cmluZyB0aHJlYWRDb250ZXh0TWlncmF0b3JMaXN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGlmIChtc2dDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gCi0gICAgICAgICAgICBtc2dDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKHRocmVhZENvbnRleHRNaWdyYXRvckxpc3RJRCk7Ci0KLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3QgbWlncmF0b3JMaXN0ID0gKExpc3QpIHBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBMaXN0SXRlcmF0b3IgdGhyZWFkQ29udGV4dE1pZ3JhdG9ycyA9IG1pZ3JhdG9yTGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0aHJlYWRDb250ZXh0TWlncmF0b3JzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICgoVGhyZWFkQ29udGV4dE1pZ3JhdG9yKSB0aHJlYWRDb250ZXh0TWlncmF0b3JzLm5leHQoKSkuY2xlYW51cENvbnRleHQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVJMLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1YWIyZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBVUkwgewotICAgIHByaXZhdGUgaW50IHBvcnQgPSAtMTsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBob3N0OwotICAgIHByaXZhdGUgU3RyaW5nIHByb3RvY29sOwotCi0gICAgcHVibGljIFVSTChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgIGludCBlbmQgPSAwOwotCi0gICAgICAgIGVuZCA9IHVybC5pbmRleE9mKCI6Ly8iKTsKLQotICAgICAgICBpZiAoZW5kID4gMCkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSB1cmwuc3Vic3RyaW5nKDAsIGVuZCk7Ci0gICAgICAgICAgICBzdGFydCA9IGVuZCArIDM7Ci0gICAgICAgIH0KLQotICAgICAgICBlbmQgPSB1cmwuaW5kZXhPZignLycsIHN0YXJ0KTsKLQotICAgICAgICBpZiAoZW5kID4gMCkgewotICAgICAgICAgICAgU3RyaW5nIGhvc3RBbmRQb3J0ID0gdXJsLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQotICAgICAgICAgICAgZmlsZU5hbWUgPSB1cmwuc3Vic3RyaW5nKGVuZCk7Ci0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGhvc3RBbmRQb3J0LmluZGV4T2YoJzonKTsKLQotICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0QW5kUG9ydC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhvc3RBbmRQb3J0LnN1YnN0cmluZyhpbmRleCArIDEpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RBbmRQb3J0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaG9zdCA9IHVybDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkgewotICAgICAgICByZXR1cm4gaG9zdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgaW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotICAgICAgICByZXR1cm4gcHJvdG9jb2w7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVJMUHJvY2Vzc29yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkxQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4YzI4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9VUkxQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgVVJMUHJvY2Vzc29yIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0UgPSAib3JnLmFwYWNoZS5heGlzMiI7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbWFrZVBhY2thZ2VOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVBhY2thZ2VOYW1lKFN0cmluZyBuYW1lc3BhY2UpIHsKLQotICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOwotCi0gICAgICAgIC8vIGdldCB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZG9jdW1lbnQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmEubmV0LlVSTCB1ID0gbmV3IGphdmEubmV0LlVSTChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICBob3N0bmFtZSA9IHUuZ2V0SG9zdCgpOwotICAgICAgICAgICAgcGF0aCA9IHUuZ2V0UGF0aCgpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5pbmRleE9mKCI6IikgPiAtMSkgewotICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmFtZXNwYWNlLnN1YnN0cmluZyhuYW1lc3BhY2UuaW5kZXhPZigiOiIpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxlYWRpbmcgLwotICAgICAgICAgICAgICAgIHdoaWxlIChob3N0bmFtZS5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGhvc3RuYW1lLmluZGV4T2YoIi8iKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc3Vic3RyaW5nKDAsIGhvc3RuYW1lLmluZGV4T2YoIi8iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBob3N0bmFtZSA9IG5hbWVzcGFjZS5yZXBsYWNlKCcvJywnLicpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgZGlkbid0IGZpbGUgYSBob3N0bmFtZSwgYmFpbAotICAgICAgICBpZiAoaG9zdG5hbWUgPT0gbnVsbCB8fCBob3N0bmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnZlcnQgaWxsZWdhbCBqYXZhIGlkZW50aWZpZXIKLSAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCctJywgJ18nKTsKLSAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnLScsICdfJyk7Ci0KLSAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnOicsICdfJyk7Ci0KLSAgICAgICAgLy8gY2hvbXAgb2ZmIGxhc3QgZm9yd2FyZCBzbGFzaCBpbiBwYXRoLCBpZiBuZWNlc3NhcnkKLSAgICAgICAgaWYgKChwYXRoLmxlbmd0aCgpID4gMCkgJiYgKHBhdGguY2hhckF0KHBhdGgubGVuZ3RoKCkgLSAxKSA9PSAnLycpKSB7Ci0gICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG9rZW5pemUgdGhlIGhvc3RuYW1lIGFuZCByZXZlcnNlIGl0Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaG9zdG5hbWUsICIuOiIpOwotICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgd29yZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZXNwYWNlLmxlbmd0aCgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gd29yZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIGFkZFdvcmRUb1BhY2thZ2VCdWZmZXIoc2IsIHdvcmRzW2ldLCAoaSA9PSB3b3Jkcy5sZW5ndGggLSAxKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0b2tlbml6ZSB0aGUgcGF0aAotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXRoLCAiLyIpOwotCi0gICAgICAgIHdoaWxlIChzdDIuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBhZGRXb3JkVG9QYWNrYWdlQnVmZmVyKHNiLCBzdDIubmV4dFRva2VuKCksIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBNYXNzYWdlcyA8dHQ+d29yZDwvdHQ+IGludG8gYSBmb3JtIHN1aXRhYmxlIGZvciB1c2UgaW4gYSBKYXZhIHBhY2thZ2UgbmFtZS4KLSAgICAgKiBBcHBlbmRzIGl0IHRvIHRoZSB0YXJnZXQgc3RyaW5nIGJ1ZmZlciB3aXRoIGEgPHR0Pi48L3R0PiBkZWxpbWl0ZXIgaWYKLSAgICAgKiA8dHQ+d29yZDwvdHQ+IGlzIG5vdCB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgcGFja2FnZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHNiICAgICAgICB0aGUgYnVmZmVyIHRvIGFwcGVuZCB0bwotICAgICAqIEBwYXJhbSB3b3JkICAgICAgdGhlIHdvcmQgdG8gYXBwZW5kCi0gICAgICogQHBhcmFtIGZpcnN0V29yZCBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHdvcmQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdvcmRUb1BhY2thZ2VCdWZmZXIoU3RyaW5nQnVmZmVyIHNiLCBTdHJpbmcgd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdFdvcmQpIHsKLQotICAgICAgICBpZiAoSmF2YVV0aWxzLmlzSmF2YUtleXdvcmQod29yZCkpIHsKLSAgICAgICAgICAgIHdvcmQgPSBKYXZhVXRpbHMubWFrZU5vbkphdmFLZXl3b3JkKHdvcmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2VwYXJhdGUgd2l0aCBkb3QgYWZ0ZXIgdGhlIGZpcnN0IHdvcmQKLSAgICAgICAgaWYgKCFmaXJzdFdvcmQpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnLicpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJlZml4IGRpZ2l0cyB3aXRoIHVuZGVyc2NvcmVzCi0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCh3b3JkLmNoYXJBdCgwKSkpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnXycpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVwbGFjZSBwZXJpb2RzIHdpdGggdW5kZXJzY29yZXMKLSAgICAgICAgaWYgKHdvcmQuaW5kZXhPZignLicpICE9IC0xKSB7Ci0gICAgICAgICAgICBjaGFyW10gYnVmID0gd29yZC50b0NoYXJBcnJheSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChidWZbaV0gPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9ICdfJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdvcmQgPSBuZXcgU3RyaW5nKGJ1Zik7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQod29yZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVVVJREdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA1MThhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1VVSURHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVVUlER2VuZXJhdG9yIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3IgewotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjRhMTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkZsb3c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0SW5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGhhc2VSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci0KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFV0aWxzLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRIYW5kbGVyKEZsb3cgZmxvdywgSGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgcGhhc2VOYW1lKSB7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyRGVzYyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oaGFuZGxlci5nZXROYW1lKCkpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUocGhhc2VOYW1lKTsKLQotICAgICAgICBoYW5kbGVyRGVzYy5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgaGFuZGxlci5pbml0KGhhbmRsZXJEZXNjKTsKLSAgICAgICAgaGFuZGxlckRlc2Muc2V0SGFuZGxlcihoYW5kbGVyKTsKLSAgICAgICAgZmxvdy5hZGRIYW5kbGVyKGhhbmRsZXJEZXNjKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI6Y3JlYXRlT3V0TWVzc2FnZUNvbnRleHQoKQotICAgICAqIEBkZXByZWNhdGVkIChwb3N0MS4xYnJhbmNoKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUNvbnRleHQgY3JlYXRlT3V0TWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZU91dE1lc3NhZ2VDb250ZXh0KGluTWVzc2FnZUNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlU2ltcGxlU2VydmljZShRTmFtZSBzZXJ2aWNlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwgUU5hbWUgb3BOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTaW1wbGVTZXJ2aWNlKHNlcnZpY2VOYW1lLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgY3JlYXRlU2ltcGxlU2VydmljZWZvckNsaWVudChRTmFtZSBzZXJ2aWNlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgb3BOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTaW1wbGVTZXJ2aWNlZm9yQ2xpZW50KHNlcnZpY2VOYW1lLCBuZXcgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcE5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBjcmVhdGVTaW1wbGVJbk9ubHlTZXJ2aWNlKFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoZ2V0Q29udGV4dENsYXNzTG9hZGVyX0RvUHJpdigpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG9wTmFtZSk7Ci0KLSAgICAgICAgYXhpc09wLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjZWl2ZXIpOwotICAgICAgICBheGlzT3Auc2V0U3R5bGUoV1NETENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihheGlzT3ApOwotICAgICAgICBzZXJ2aWNlLm1hcEFjdGlvblRvT3BlcmF0aW9uKENvbnN0YW50cy5BWElTMl9OQU1FU1BBQ0VfVVJJICsgIi8iICsgb3BOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPcCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyX0RvUHJpdigpIHsKLSAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcikgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBjcmVhdGVTaW1wbGVTZXJ2aWNlKFFOYW1lIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUmVjZWl2ZXIgbWVzc2FnZVJlY2VpdmVyLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBvcE5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZShzZXJ2aWNlTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5zZXRDbGFzc0xvYWRlcihnZXRDb250ZXh0Q2xhc3NMb2FkZXJfRG9Qcml2KCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5TRVJWSUNFX0NMQVNTLCBjbGFzc05hbWUpKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcCA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24ob3BOYW1lKTsKLQotICAgICAgICBheGlzT3Auc2V0TWVzc2FnZVJlY2VpdmVyKG1lc3NhZ2VSZWNlaXZlcik7Ci0gICAgICAgIGF4aXNPcC5zZXRTdHlsZShXU0RMQ29uc3RhbnRzLlNUWUxFX1JQQyk7Ci0gICAgICAgIHNlcnZpY2UuYWRkT3BlcmF0aW9uKGF4aXNPcCk7Ci0gICAgICAgIHNlcnZpY2UubWFwQWN0aW9uVG9PcGVyYXRpb24oQ29uc3RhbnRzLkFYSVMyX05BTUVTUEFDRV9VUkkgKyAiLyIgKyBvcE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZVNpbXBsZVNlcnZpY2Vmb3JDbGllbnQoUU5hbWUgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIG9wTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKHNlcnZpY2VOYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBzZXJ2aWNlLnNldENsYXNzTG9hZGVyKGdldENvbnRleHRDbGFzc0xvYWRlcl9Eb1ByaXYoKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MsIGNsYXNzTmFtZSkpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wID0gbmV3IE91dEluQXhpc09wZXJhdGlvbihvcE5hbWUpOwotCi0gICAgICAgIGF4aXNPcC5zZXRNZXNzYWdlUmVjZWl2ZXIobWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgYXhpc09wLnNldFN0eWxlKFdTRExDb25zdGFudHMuU1RZTEVfUlBDKTsKLSAgICAgICAgc2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wKTsKLQotICAgICAgICByZXR1cm4gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VDb250ZXh0IGZpbGxDb250ZXh0SW5mb3JtYXRpb24oQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gMi4gaWYgbnVsbCwgY3JlYXRlIG5ldyBvcEN0eHQKLSAgICAgICAgLy8gZmlsbCB0aGUgc2VydmljZSBncm91cCBjb250ZXh0IGFuZCBzZXJ2aWNlIGNvbnRleHQgaW5mbwotICAgICAgICByZXR1cm4gZmlsbFNlcnZpY2VDb250ZXh0QW5kU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZSwgY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VDb250ZXh0IGZpbGxTZXJ2aWNlQ29udGV4dEFuZFNlcnZpY2VHcm91cENvbnRleHQoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgc2VydmljZUdyb3VwQ29udGV4dElkID0gVVVJREdlbmVyYXRvci5nZXRVVUlEKCk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChheGlzU2VydmljZS5nZXRBeGlzU2VydmljZUdyb3VwKCkpOwotCi0gICAgICAgIHNlcnZpY2VHcm91cENvbnRleHQuc2V0SWQoc2VydmljZUdyb3VwQ29udGV4dElkKTsKLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuYWRkU2VydmljZUdyb3VwQ29udGV4dEludG9Tb2FwU2Vzc2lvblRhYmxlKHNlcnZpY2VHcm91cENvbnRleHQpOwotICAgICAgICByZXR1cm4gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dChheGlzU2VydmljZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnJlYWsgYSBmdWxsIHBhdGggaW50byBwaWVjZXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgd2hlcmUgZWxlbWVudCBbMF0gYWx3YXlzIGNvbnRhaW5zIHRoZSBzZXJ2aWNlLCBhbmQgZWxlbWVudCAxLCBpZiBub3QgbnVsbCwgY29udGFpbnMKLSAgICAgKiAgICAgICAgIHRoZSBwYXRoIGFmdGVyIHRoZSBmaXJzdCBlbGVtZW50LiBhbGwgPyBwYXJhbWV0ZXJzIGFyZSBkaXNjYXJkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBwYXJzZVJlcXVlc3RVUkxGb3JTZXJ2aWNlQW5kT3BlcmF0aW9uKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VydmljZVBhdGgpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInBhcnNlUmVxdWVzdFVSTEZvclNlcnZpY2VBbmRPcGVyYXRpb24gOiBbIiArIHBhdGggKyAiXVsiICsgc2VydmljZVBhdGggKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbMl07Ci0KLSAgICAgICAgLy8gVE9ETy4gVGhpcyBpcyBraW5kIG9mIGJyaXR0bGUuIEFueSBzZXJ2aWNlIHdpdGggdGhlIG5hbWUgL3NlcnZpY2VzIHdvdWxkIGNhdXNlIGZ1bi4KLSAgICAgICAgaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihzZXJ2aWNlUGF0aCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlOwotCi0gICAgICAgIGlmICgtMSAhPSBpbmRleCkgewotICAgICAgICAgICAgaW50IHNlcnZpY2VTdGFydCA9IGluZGV4ICsgc2VydmljZVBhdGgubGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gc2VydmljZVN0YXJ0ICsgMSkgewotICAgICAgICAgICAgICAgIHNlcnZpY2UgPSBwYXRoLnN1YnN0cmluZyhzZXJ2aWNlU3RhcnQgKyAxKTsKLQotICAgICAgICAgICAgICAgIGludCBxdWVyeUluZGV4ID0gc2VydmljZS5pbmRleE9mKCc/Jyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocXVlcnlJbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IHNlcnZpY2Uuc3Vic3RyaW5nKDAsIHF1ZXJ5SW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBvcGVyYXRpb25JbmRleCA9IHNlcnZpY2UuaW5kZXhPZignLycpOwotCi0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gPSBzZXJ2aWNlLnN1YnN0cmluZygwLCBvcGVyYXRpb25JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IHNlcnZpY2Uuc3Vic3RyaW5nKG9wZXJhdGlvbkluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkluZGV4ID0gdmFsdWVzWzFdLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1sxXSA9IHZhbHVlc1sxXS5zdWJzdHJpbmcob3BlcmF0aW9uSW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1swXSA9IHNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gcGFyc2UgcmVxdWVzdCBVUkwgWyIgKyBwYXRoICsgIl1bIiArIHNlcnZpY2VQYXRoICsgIl0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXROZXdDb25maWd1cmF0aW9uQ29udGV4dChTdHJpbmcgcmVwb3NpdHJ5KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcG9zaXRyeSk7Ci0gICAgICAgIGJvb2xlYW4gZXhpc3RzID0gZXhpc3RzKGZpbGUpOwotICAgICAgICBpZiAoIWV4aXN0cykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigicmVwb3NpdG9yeSBkaXJlY3RvcnkgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0cyIpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgYXhpczJ4bWwgPSBuZXcgRmlsZShmaWxlLCAiYXhpcy54bWwiKTsKLSAgICAgICAgU3RyaW5nIGF4aXMyeG1sU3RyaW5nID0gbnVsbDsKLSAgICAgICAgaWYgKGV4aXN0cyhheGlzMnhtbCkpIHsKLSAgICAgICAgICAgIGF4aXMyeG1sU3RyaW5nID0gYXhpczJ4bWwuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZykgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPFN0cmluZz4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShwYXRoLCBheGlzMnhtbFN0cmluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleGlzdHMoZmluYWwgRmlsZSBmaWxlKSB7Ci0gICAgICAgIEJvb2xlYW4gZXhpc3RzID0gKEJvb2xlYW4pIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbjxCb29sZWFuPigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGZpbGUuZXhpc3RzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICApOwotICAgICAgICByZXR1cm4gZXhpc3RzLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmFtZXRlclZhbHVlKFBhcmFtZXRlciBwYXJhbSkgewotICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoU3RyaW5nIG1vZHVsZU5hbWUsIFN0cmluZyBtb2R1bGVWZXJzaW9uKSB7Ci0gICAgICAgIGlmIChtb2R1bGVWZXJzaW9uICE9IG51bGwgJiYgbW9kdWxlVmVyc2lvbi5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGVOYW1lID0gbW9kdWxlTmFtZSArICItIiArIG1vZHVsZVZlcnNpb247Ci0gICAgICAgIH0gCi0gICAgICAgIHJldHVybiBtb2R1bGVOYW1lOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTExFR0FMX0NIQVJBQ1RFUlMgPSAiL1xuXHJcdFwwXGZgPypcXDw+fFwiOiI7Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRNb2R1bGVOYW1lKFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBtb2R1bGVOYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmICgoYyA+IDEyNykgfHwgKElMTEVHQUxfQ0hBUkFDVEVSUy5pbmRleE9mKGMpID49IDApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIC0gaWYgaGUgdHJ5aW5nIHRvIGVuZ2FnZSB0aGUgc2FtZSBtb2R1bGUgdGhlbiBtZXRob2Qgd2lsbCByZXR1cmVuIGZhbHNlCi0gICAgICogLSBlbHNlIGl0IHdpbGwgcmV0dXJuIHRydWUKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1ZlcnNpb24oVmVyc2lvbiBtb2R1bGUxdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gbW9kdWxlMnZlcnNpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoKG1vZHVsZTF2ZXJzaW9uICE9bnVsbCAmJiAhbW9kdWxlMXZlcnNpb24uZXF1YWxzKG1vZHVsZTJ2ZXJzaW9uKSkgfHwKLSAgICAgICAgICAgICAgICBtb2R1bGUydmVyc2lvbiAhPW51bGwgJiYgIW1vZHVsZTJ2ZXJzaW9uLmVxdWFscyhtb2R1bGUxdmVyc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoInRyeWluZyB0byBlbmdhZ2UgdHdvIGRpZmZlcmVudCBtb2R1bGUgdmVyc2lvbnMgIiArCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZTF2ZXJzaW9uICsgIiA6ICIgKyBtb2R1bGUydmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZURlZmF1bHRNb2R1bGVWZXJzaW9uKEhhc2hNYXAgbW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICBJdGVyYXRvciBhbGxNb2R1bGVzID0gbW9kdWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBNYXA8U3RyaW5nLFZlcnNpb24+IGRlZmF1bHRNb2R1bGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFZlcnNpb24+KCk7Ci0gICAgICAgIHdoaWxlIChhbGxNb2R1bGVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXhpc01vZHVsZSBheGlzTW9kdWxlID0gKEF4aXNNb2R1bGUpIGFsbE1vZHVsZXMubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBheGlzTW9kdWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFZlcnNpb24gY3VycmVudERlZmF1bHRWZXJzaW9uID0gZGVmYXVsdE1vZHVsZXMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gYXhpc01vZHVsZS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoY3VycmVudERlZmF1bHRWZXJzaW9uID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24gIT0gbnVsbCAmJiB2ZXJzaW9uLmNvbXBhcmVUbyhjdXJyZW50RGVmYXVsdFZlcnNpb24pID4gMCkpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0TW9kdWxlcy5wdXQobmFtZSwgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3IgZGVmX21vZF9pdHIgPSBkZWZhdWx0TW9kdWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZGVmX21vZF9pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IChTdHJpbmcpIGRlZl9tb2RfaXRyLm5leHQoKTsKLSAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IGRlZmF1bHRNb2R1bGVzLmdldChtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIGF4aXNDb25maWcuYWRkRGVmYXVsdE1vZHVsZVZlcnNpb24obW9kdWxlTmFtZSwgdmVyc2lvbiA9PSBudWxsID8gbnVsbCA6IHZlcnNpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiBhIE1lc3NhZ2VDb250ZXh0IHByb3BlcnR5IGlzIHRydWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBCb29sZWFuLlRSVUUsICJ0cnVlIiwgMSwgZXRjLiBvciBmYWxzZSBvdGhlcndpc2UKLSAgICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIE1lc3NhZ2VDb250ZXh0LmlzVHJ1ZShwcm9wZXJ0eU5hbWUpIGluc3RlYWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHBsaWNpdGx5VHJ1ZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICBPYmplY3QgZmxhZyA9IG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICAgIHJldHVybiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShmbGFnKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIHRoZSBTdHJpbmcgVVJJIG9mIHRoZSBNZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm4gdG8gYSBpbnRlZ2VyLgotICAgICAqIEZ1cnRoZXIsIGluIHRoZSBmaXJzdCBsb29rdXAsIGl0IHdpbGwgY2FjaGUgdGhlIGxvb2tlZAotICAgICAqIHVwIHZhbHVlIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzIGFyZSBleHRyZW1lbHkgZWZmaWNpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEF4aXNTcGVjaWZNRVBDb25zdGFudChTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgewotCi0KLSAgICAgICAgaW50IG1lcENvbnN0YW50ID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfSU5WQUxJRDsKLQotICAgICAgICBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VULmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSB8fAotICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09VVDsKLSAgICAgICAgfSBlbHNlIGlmICgKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9JTl9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX0lOX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQKLSAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09QVElPTkFMX09VVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSkgewotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTl9PUFRJT05BTF9PVVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4uZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX09VVF9JTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSkgewotICAgICAgICAgICAgbWVwQ29uc3RhbnQgPSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9PVVRfSU47Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX09OTFk7Ci0gICAgICAgIH0gZWxzZSBpZiAoV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT1BUSU9OQUxfSU4uZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX09VVF9PUFRJT05BTF9JTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikpIHsKLSAgICAgICAgICAgIG1lcENvbnN0YW50ID0gV1NETENvbnN0YW50cy5NRVBfQ09OU1RBTlRfT1VUX09QVElPTkFMX0lOOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETDIwXzIwMDRfQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZOwotICAgICAgICB9IGVsc2UgaWYgKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX09VVF9PTkxZLmVxdWFscyhtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKSB8fAotICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMobWVzc2FnZUV4Y2hhbmdlUGF0dGVybikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKG1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4pKSB7Ci0gICAgICAgICAgICBtZXBDb25zdGFudCA9IFdTRExDb25zdGFudHMuTUVQX0NPTlNUQU5UX1JPQlVTVF9PVVRfT05MWTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtZXBDb25zdGFudCA9PSBXU0RMQ29uc3RhbnRzLk1FUF9DT05TVEFOVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0Vycm9yKE1lc3NhZ2VzLmdldE1lc3NhZ2UoIm1lcG1hcHBpbmdlcnJvciIpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIG1lcENvbnN0YW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbiBBeGlzRmF1bHQgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGUgU09BUEZhdWx0IGluIHRoZSBTT0FQRW52ZWxvcGUgYXR0YWNoZWQKLSAgICAgKiB0byB0aGUgcHJvdmlkZWQgTWVzc2FnZUNvbnRleHQuIFRoaXMgZmlyc3QgY2hlY2sgZm9yIGFuIGFscmVhZHkgZXh0cmFjdGVkIEF4aXNGYXVsdAotICAgICAqIGFuZCBvdGhlcndpc2UgZG9lcyBhIHNpbXBsZSBleHRyYWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBNVVNUIE5PVCBiZSBwYXNzZWQgYSBNZXNzYWdlQ29udGV4dCB3aGljaCBkb2VzIG5vdCBjb250YWluIGEgU09BUEZhdWx0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzRmF1bHQgZ2V0SW5ib3VuZEZhdWx0RnJvbU1lc3NhZ2VDb250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIC8vIEdldCB0aGUgZmF1bHQgaWYgaXQncyBhbHJlYWR5IGJlZW4gZXh0cmFjdGVkIGJ5IGEgaGFuZGxlcgotICAgICAgICBBeGlzRmF1bHQgcmVzdWx0ID0gKEF4aXNGYXVsdCkgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLklOQk9VTkRfRkFVTFRfT1ZFUlJJREUpOwotICAgICAgICAvLyBFbHNlLCBleHRyYWN0IGl0IGZyb20gdGhlIFNPQVBCb2R5Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQ7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keTsKLSAgICAgICAgICAgIGlmIChlbnZlbG9wZSAhPSBudWxsICYmIChzb2FwQm9keSA9IGVudmVsb3BlLmdldEJvZHkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICgoc29hcEZhdWx0ID0gc29hcEJvZHkuZ2V0RmF1bHQoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF4aXNGYXVsdChzb2FwRmF1bHQsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXRzIGEgUkVTVCByZXNwb25zZSB0aGUgY29udGVudCBpcyBub3QgYSBTT0FQIGVudmVsb3AgYW5kIGhlbmNlIHdlIHdpbGwKLSAgICAgICAgICAgICAgICAvLyBIYXZlIHVzZSB0aGUgc29hcCBib2R5IGFzIHRoZSBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZUNvbnRleHQuaXNEb2luZ1JFU1QoKSAmJiBzb2FwQm9keS5nZXRGaXJzdEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc0ZhdWx0KHNvYXBCb2R5LmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdCBnb2luZyB0byBiZSBhYmxlIHRvCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIE1lc3NhZ2VDb250ZXh0IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBTT0FQRmF1bHQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBwcm92aWRlIHRoZSBsb2dpYyBuZWVkZWQgdG8gcmV0cmlldmUgYW4gT2JqZWN0J3MgY2xhc3Nsb2FkZXIKLSAgICAgKiBpbiBhIEphdmEgMiBTZWN1cml0eSBjb21wbGlhbnQgbWFubmVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0T2JqZWN0Q2xhc3NMb2FkZXIoZmluYWwgT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZihvYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TXRvbVRocmVzaG9sZChNZXNzYWdlQ29udGV4dCBtc2dDdHh0KXsKLSAgICAJSW50ZWdlciB2YWx1ZSA9IG51bGw7ICAgICAgICAgCi0gICAgICAgIGlmKCFtc2dDdHh0LmlzU2VydmVyU2lkZSgpKXsgICAgICAgICAgICAgICAgCi0JICAgICAgICB2YWx1ZSA9IChJbnRlZ2VyKW1zZ0N0eHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTVRPTV9USFJFU0hPTEQpOwkgICAgICAgIAotICAgICAgICB9ZWxzZXsKLSAgICAgICAgCVBhcmFtZXRlciBwYXJhbSA9IG1zZ0N0eHQuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1UT01fVEhSRVNIT0xEKTsKLSAgICAgICAgCWlmKHBhcmFtIT1udWxsKXsKLSAgICAgICAgCQl2YWx1ZSA9IChJbnRlZ2VyKXBhcmFtLmdldFZhbHVlKCk7ICAgICAgIAkJICAgICAgICAJCQotICAgICAgICAJfSAgICAgICAgCSAgICAgICAgCQotICAgICAgICB9Ci0gICAgICAgIGludCB0aHJlc2hvbGQgPSAodmFsdWUhPW51bGwpP3ZhbHVlLmludFZhbHVlKCk6MDsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAJbG9nLmRlYnVnKCJNVE9NIG9wdGltaXplZCBUaHJlc2hvbGQgdmFsdWUgPSIrdGhyZXNob2xkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhyZXNob2xkOwotICAgIH0KLSAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaXAgYWRkcmVzcyB0byBiZSB1c2VkIGZvciB0aGUgcmVwbHl0byBlcHIKLSAgICAgKiBDQVVUSU9OOgotICAgICAqIFRoaXMgd2lsbCBnbyB0aHJvdWdoIGFsbCB0aGUgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcyBhbmQgd2lsbCB0cnkgdG8gcmV0dXJuIGFuIGlwIGFkZHJlc3MuCi0gICAgICogRmlyc3QgdGhpcyB3aWxsIHRyeSB0byBnZXQgdGhlIGZpcnN0IElQIHdoaWNoIGlzIG5vdCBsb29wYmFjayBhZGRyZXNzICgxMjcuMC4wLjEpLiBJZiBub25lIGlzIGZvdW5kCi0gICAgICogdGhlbiB0aGlzIHdpbGwgcmV0dXJuIHRoaXMgd2lsbCByZXR1cm4gMTI3LjAuMC4xLgotICAgICAqIFRoaXMgd2lsbCA8Yj5ub3Q8Yj4gY29uc2lkZXIgSVB2NiBhZGRyZXNzZXMuCi0gICAgICogPHAvPgotICAgICAqIFRPRE86Ci0gICAgICogLSBJbXByb3ZlIHRoaXMgbG9naWMgdG8gZ2VuYXJhbGl6ZSBpdCBhIGJpdCBtb3JlCi0gICAgICogLSBPYnRhaW4gdGhlIGlwIHRvIGJlIHVzZWQgaGVyZSBmcm9tIHRoZSBDYWxsIEFQSQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKiBAdGhyb3dzIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbgotICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJcEFkZHJlc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLSAgICAgICAgU3RyaW5nIGFkZHJlc3MgPSAiMTI3LjAuMC4xIjsKLQotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBuZXRmYWNlID0gKE5ldHdvcmtJbnRlcmZhY2UpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGFkZHJlc3NlcyA9IG5ldGZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpOwotCi0gICAgICAgICAgICB3aGlsZSAoYWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgaXAgPSAoSW5ldEFkZHJlc3MpIGFkZHJlc3Nlcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICghaXAuaXNMb29wYmFja0FkZHJlc3MoKSAmJiBpc0lQKGlwLmdldEhvc3RBZGRyZXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpcC5nZXRIb3N0QWRkcmVzcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlIGhvc3RuYW1lIHBhcmFtZXRlciBpcyB0aGVyZSBpbiBBeGlzQ29uZmlndXJhdGlvbiAoYXhpczIueG1sKSAsCi0gICAgICogaWYgaXQgaXMgdGhlcmUgdGhlbiB0aGlzIHdpbGwgcmV0dW4gdGhhdCBhcyB0aGUgaG9zdCBuYW1lICwgby53IHdpbGwgcmV0dXJuIHRoZSBJUCBhZGRyZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElwQWRkcmVzcyhBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGF4aXNDb25maWd1cmF0aW9uIT1udWxsKXsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihUcmFuc3BvcnRMaXN0ZW5lci5IT1NUX0FERFJFU1MpOwotICAgICAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgIGhvc3RBZGRyZXNzID0gKChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCkpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZihob3N0QWRkcmVzcyE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBob3N0QWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldElwQWRkcmVzcygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZSBob3N0bmFtZSBwYXJhbWV0ZXIgaXMgdGhlcmUgaW4gQXhpc0NvbmZpZ3VyYXRpb24gKGF4aXMyLnhtbCkgLAotICAgICAqIGlmIGl0IGlzIHRoZXJlIHRoZW4gdGhpcyB3aWxsIHJldHVybiB0aGF0IGFzIHRoZSBob3N0IG5hbWUgLCBvLncgd2lsbCByZXR1cm4gdGhlIElQIGFkZHJlc3MuCi0gICAgICogQHBhcmFtIGF4aXNDb25maWd1cmF0aW9uCi0gICAgICogQHJldHVybiBob3N0bmFtZSAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIb3N0bmFtZShBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbikgewotICAgICAgICBpZihheGlzQ29uZmlndXJhdGlvbiE9bnVsbCl7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoVHJhbnNwb3J0TGlzdGVuZXIuSE9TVF9BRERSRVNTKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nICBob3N0QWRkcmVzcyA9ICgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYoaG9zdEFkZHJlc3MhPW51bGwpewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9zdEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJUChTdHJpbmcgaG9zdEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIGhvc3RBZGRyZXNzLnNwbGl0KCJbLl0iKS5sZW5ndGggPT0gNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzYW5pdGl6ZVdlYk91dHB1dChTdHJpbmcgdGV4dCkgewotICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsKLSAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvV1NETDIwVXRpbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvV1NETDIwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJhOWJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1dTREwyMFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlVSSUVuY29kZXJEZWNvZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuaHR0cC5IVFRQTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53b2Rlbi53c2RsMjAuZXh0ZW5zaW9ucy5odHRwLkhUVFBMb2NhdGlvblRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUud29kZW4ud3NkbDIwLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHRTdWJjb2RlczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgV1NETDIwVXRpbCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGV4dHJhY3RXU0RMMjBTb2FwRmF1bHRJbmZvKE1hcCBvcHRpb25zLCBPTUVsZW1lbnQgYmluZGluZ01lc3NhZ2VFbGVtZW50LCBPTUZhY3Rvcnkgb21GYWN0b3J5LCBPTU5hbWVzcGFjZSB3c29hcCkgewotICAgICAgICAvLyBGYXVsdCBzcGVjaWZpYyBwcm9wZXJ0aWVzCi0gICAgICAgIFNPQVBGYXVsdENvZGUgZmF1bHRDb2RlID0gKFNPQVBGYXVsdENvZGUpIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAuZ2V0KFdTREwyQ29uc3RhbnRzLkFUVFJfV1NPQVBfQ09ERSk7Ci0gICAgICAgIGlmIChmYXVsdENvZGUgIT0gbnVsbCAmJiBmYXVsdENvZGUuZ2V0UU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBiaW5kaW5nTWVzc2FnZUVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0NPREUsIHdzb2FwLCBmYXVsdENvZGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdFN1YmNvZGVzIHNvYXBGYXVsdFN1YmNvZGVzID0gKFNPQVBGYXVsdFN1YmNvZGVzKSBvcHRpb25zCi0gICAgICAgICAgICAgICAgLmdldChXU0RMMkNvbnN0YW50cy5BVFRSX1dTT0FQX1NVQkNPREVTKTsKLSAgICAgICAgUU5hbWUgZmF1bHRDb2Rlc1tdOwotICAgICAgICBpZiAoc29hcEZhdWx0U3ViY29kZXMgIT0gbnVsbCAmJiAoZmF1bHRDb2RlcyA9IHNvYXBGYXVsdFN1YmNvZGVzLmdldFFOYW1lcygpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0Q29kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nTWVzc2FnZUVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9TVUJDT0RFUywgd3NvYXAsIGZhdWx0Q29kZXNbMF0uZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmVzb2x2ZSBodHRwbG9jYXRpb24gcHJvcGVydHkuIEl0IGNoYW5nZXMgdGhlIFVSTCBhcyBzdGlwdWxhdGVkIGJ5Ci0gICAgICogdGhlIGh0dHBsb2NhdGlvbiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dCAtIFRoZSBNZXNzYWdlQ29udGV4dCBvZiB0aGUgcmVxdWVzdAotICAgICAqIEBwYXJhbSByYXdVUkxTdHJpbmcgICAtIFRoZSByYXcgVVJMIGNvbnRhaW5pbmcgaHR0cGxvY2F0aW9uIHRlbXBsYXRlcwotICAgICAqIEBwYXJhbSBkZXRhY2ggICAgICAgICAtIEJvb2xlYW4gdmFsdWUgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbGVtZW50IHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wLiBXaGVuIHNlcmlhbGl6aW5nIGRhdGEgYXMgYXBwbGljYXRpb24veC1mb3JtLXVybGVuY29kZWQgd2hhdCBnb2VzIGluIHRoZSBib2R5IGlzIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgYW5kIHRoZXJlZm9yZSB3ZSBzaG91bGQgZGV0YWNoIHRoZSBlbGVtZW50IGZyb20gdGhlIGVudmVsb3AuCi0gICAgICogQHJldHVybiAtIFN0cmluZyB3aXRoIHRlbXBsYXRlZCB2YWx1ZXMgcmVwbGFjZWQKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IC0gVGhyb3duIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5VVJJVGVtcGxhdGluZyhNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCwgU3RyaW5nIHJhd1VSTFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGV0YWNoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBPTUVsZW1lbnQgZmlyc3RFbGVtZW50OwotICAgICAgICBpZiAoZGV0YWNoKSB7Ci0gICAgICAgICAgICBmaXJzdEVsZW1lbnQgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmNsb25lT01FbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SKTsKLSAgICAgICAgaWYgKHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yID0gV1NETDIwRGVmYXVsdFZhbHVlSG9sZGVyLkFUVFJfV0hUVFBfUVVFUllfUEFSQU1FVEVSX1NFUEFSQVRPUl9ERUZBVUxUOwotICAgICAgICB9Ci0gICAgICAgIEhUVFBMb2NhdGlvbiBodHRwTG9jYXRpb24gPSBuZXcgSFRUUExvY2F0aW9uKHJhd1VSTFN0cmluZyk7Ci0gICAgICAgIEhUVFBMb2NhdGlvblRlbXBsYXRlW10gdGVtcGxhdGVzID0gaHR0cExvY2F0aW9uLmdldFRlbXBsYXRlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBIVFRQTG9jYXRpb25UZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudFZhbHVlID0gZ2V0T01FbGVtZW50VmFsdWUobG9jYWxOYW1lLCBmaXJzdEVsZW1lbnQpOwotICAgICAgICAgICAgaWYgKHRlbXBsYXRlLmlzRW5jb2RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuaXNRdWVyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zZXRWYWx1ZShVUklFbmNvZGVyRGVjb2Rlci5xdW90ZUlsbGVnYWwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTEVHQUxfQ0hBUkFDVEVSU19JTl9RVUVSWS5yZXBsYWNlQWxsKHF1ZXJ5UGFyYW1ldGVyU2VwYXJhdG9yLCAiIikpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNldFZhbHVlKFVSSUVuY29kZXJEZWNvZGVyLnF1b3RlSWxsZWdhbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5MRUdBTF9DSEFSQUNURVJTX0lOX1BBVEgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJVbmFibGUgdG8gZW5jb2RlIFF1ZXJ5IFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zZXRWYWx1ZShlbGVtZW50VmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGh0dHBMb2NhdGlvbi5nZXRGb3JtYXR0ZWRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0cml2ZSBlbGVtZW50cyBmcm9tIHRoZSBzb2FwIGVudmVsb3AKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50TmFtZSAgIC0gVGhlIG5hbWUgb2YgdGhlIHJlcXVpcmVkIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFRoZSBwYXJlbnQgZWxlbWVudCB0aGF0IHRoZSByZXF1aXJlZCBlbGVtZW50IHNob3VsZCBiZSByZXRyaXZlZCBmcm9tCi0gICAgICogQHJldHVybiAtIFRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhcyBhIHN0cmluZwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRPTUVsZW1lbnRWYWx1ZShTdHJpbmcgZWxlbWVudE5hbWUsIE9NRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0KLSAgICAgICAgT01FbGVtZW50IGh0dHBVUkxQYXJhbSA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yIGNoaWxkcmVuID0gcGFyZW50RWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0KLSAgICAgICAgd2hpbGUgKGNoaWxkcmVuLmhhc05leHQoKSkgewotICAgICAgICAgICAgT01FbGVtZW50IGNoaWxkID0gKE9NRWxlbWVudCkgY2hpbGRyZW4ubmV4dCgpOwotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBjaGlsZC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhxTmFtZS5nZXRMb2NhbFBhcnQoKSkpIHsKLSAgICAgICAgICAgICAgICBodHRwVVJMUGFyYW0gPSBjaGlsZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChodHRwVVJMUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaHR0cFVSTFBhcmFtLmRldGFjaCgpOwotCi0gICAgICAgICAgICBpZiAocGFyZW50RWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5kZXRhY2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBodHRwVVJMUGFyYW0uZ2V0VGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvV1NETFNlcmlhbGl6YXRpb25VdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9XU0RMU2VyaWFsaXphdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxZTU0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9XU0RMU2VyaWFsaXphdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Qb2xpY3lTdWJqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuSFRUUEhlYWRlck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLlNPQVBIZWFkZXJNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5TT0FQTW9kdWxlTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5UmVmZXJlbmNlOwotCi0vKioKLSAqIEhlbHBzIHRoZSBBeGlzU2VydmljZSB0byBXU0RMIHByb2Nlc3MKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJpYWxpemF0aW9uVXRpbCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9TVEFSVCA9ICI8IVtDREFUQVsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX1NUQVJUX1JFR0VYID0gIjwhXFxbQ0RBVEFcXFsiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0VORCA9ICJdXT4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBX0VORF9SRUdFWCA9ICJcXF1cXF0+IjsKLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEgbmFtZXNwYWNlIGl0IHJldHVybnMgdGhlIHByZWZpeCBmb3IgdGhhdCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSB0aGF0IHRoZSBwcmVmaXggaXMgbmVlZGVkIGZvcgotICAgICAqIEBwYXJhbSBuYW1lU3BhY2VNYXAgLSBUaGUgbmFtZXNwYWNlTWFwCi0gICAgICogQHJldHVybiAtIFRoZSBwcmVmaXggb2YgdGhlIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZpeChTdHJpbmcgbmFtZXNwYWNlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVTcGFjZU1hcCkgewotICAgICAgICBTZXQ8U3RyaW5nPiBrZXlTZXQ7Ci0gICAgICAgIGlmIChuYW1lU3BhY2VNYXAgIT0gbnVsbCAmJiAoa2V5U2V0ID0gbmFtZVNwYWNlTWFwLmtleVNldCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGtleXMgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZVNwYWNlTWFwLmdldChrZXkpLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvcnJlY3QgZWxlbWVudCBuYW1lIGZvciBhIGdpdmVuIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gYXhpc01lc3NhZ2UgLSBUaGUgYXhpc01lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbmFtZVNwYWNlTWFwIC0gVGhlIG5hbWVzcGFjZU1hcAotICAgICAqIEByZXR1cm4gLSBUaGUgZWxlbWVudCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoQXhpc01lc3NhZ2UgYXhpc01lc3NhZ2UsIE1hcCBuYW1lU3BhY2VNYXApIHsKLSAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gYXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgIGlmIChlbGVtZW50UU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIFdTREwyQ29uc3RhbnRzLk5NVE9LRU5fTk9ORTsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuWFNEX0FOWS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIFdTREwyQ29uc3RhbnRzLk5NVE9LRU5fQU5ZOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9Ci0gICAgICAgICAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5nZXRQcmVmaXgoZWxlbWVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lU3BhY2VNYXApOwotICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIGVsZW1lbnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzb2FwIGhlYWRlciBlbGVtZW50IHRvIGEgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICogQHBhcmFtIG9tRmFjdG9yeSAtIEFuIE9NRmFjdG9yeQotICAgICAqIEBwYXJhbSBsaXN0IC0gVGhlIGFycmF5bGlzdCBvZiBzb2FwSGVhZGVyTWVzc2FnZXMKLSAgICAgKiBAcGFyYW0gd3NvYXAgLSBUaGUgV1NETCAyLjAgU09BUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRoYXQgdGhlIGhlYWRlciBzaG91bGQgYmUgYWRkZWQgdG8KLSAgICAgKiBAcGFyYW0gbmFtZVNwYWNlTWFwIC0gVGhlIG5hbWVzcGFjZU1hcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTT0FQSGVhZGVyRWxlbWVudHMoT01GYWN0b3J5IG9tRmFjdG9yeSwgQXJyYXlMaXN0IGxpc3QsIE9NTmFtZXNwYWNlIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGVsZW1lbnQsIE1hcCBuYW1lU3BhY2VNYXApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyTWVzc2FnZSBzb2FwSGVhZGVyTWVzc2FnZSA9IChTT0FQSGVhZGVyTWVzc2FnZSkgbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgc29hcEhlYWRlckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9IRUFERVIsIHdzb2FwKTsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc29hcEhlYWRlck1lc3NhZ2UuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlQsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIGdldFByZWZpeChxTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZVNwYWNlTWFwKSArICI6IiArIHFOYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTVVTVF9VTkRFUlNUQU5ELCBudWxsLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKHNvYXBIZWFkZXJNZXNzYWdlLmlzTXVzdFVuZGVyc3RhbmQoKSkpKTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRVFVSVJFRCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi50b1N0cmluZyhzb2FwSGVhZGVyTWVzc2FnZS5pc1JlcXVpcmVkKCkpKSk7Ci0gICAgICAgICAgICBlbGVtZW50LmFkZENoaWxkKHNvYXBIZWFkZXJFbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBzb2FwIG1vZHVsZSBlbGVtZW50IHRvIGEgZ2l2ZW4gT01FbGVtZW50Ci0gICAgICogQHBhcmFtIG9tRmFjdG9yeSAtIEFuIE9NRmFjdG9yeQotICAgICAqIEBwYXJhbSBsaXN0IC0gVGhlIGFycmF5bGlzdCBvZiBzb2FwTW9kdWxlTWVzc2FnZXMKLSAgICAgKiBAcGFyYW0gd3NvYXAgLSBUaGUgV1NETCAyLjAgU09BUCBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRoYXQgdGhlIGhlYWRlciBzaG91bGQgYmUgYWRkZWQgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkU09BUE1vZHVsZUVsZW1lbnRzKE9NRmFjdG9yeSBvbUZhY3RvcnksIEFycmF5TGlzdCBsaXN0LCBPTU5hbWVzcGFjZSB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU09BUE1vZHVsZU1lc3NhZ2Ugc29hcE1vZHVsZU1lc3NhZ2UgPSAoU09BUE1vZHVsZU1lc3NhZ2UpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgT01FbGVtZW50IHNvYXBNb2R1bGVFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTU9EVUxFLCB3c29hcCk7Ci0gICAgICAgICAgICBzb2FwTW9kdWxlRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfUkVGLCBudWxsLCBzb2FwTW9kdWxlTWVzc2FnZS5nZXRVcmkoKSkpOwotICAgICAgICAgICAgZWxlbWVudC5hZGRDaGlsZChzb2FwTW9kdWxlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgSFRUUCBoZWFkZXIgZWxlbWVudCB0byBhIGdpdmVuIE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBvbUZhY3RvcnkgLSBBbiBPTUZhY3RvcnkKLSAgICAgKiBAcGFyYW0gbGlzdCAtIFRoZSBhcnJheWxpc3Qgb2YgSFRUUEhlYWRlck1lc3NhZ2VzCi0gICAgICogQHBhcmFtIHdodHRwIC0gVGhlIFdTREwgMi4wIEhUVFAgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0aGF0IHRoZSBoZWFkZXIgc2hvdWxkIGJlIGFkZGVkIHRvCi0gICAgICogQHBhcmFtIG5hbWVTcGFjZU1hcCAtIFRoZSBuYW1lc3BhY2VNYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSFRUUEhlYWRlckVsZW1lbnRzKE9NRmFjdG9yeSBvbUZhY3RvcnksIEFycmF5TGlzdCBsaXN0LCBPTU5hbWVzcGFjZSB3aHR0cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBlbGVtZW50LCBNYXAgbmFtZVNwYWNlTWFwKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSFRUUEhlYWRlck1lc3NhZ2UgaHR0cEhlYWRlck1lc3NhZ2UgPSAoSFRUUEhlYWRlck1lc3NhZ2UpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgT01FbGVtZW50IGh0dHBIZWFkZXJFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfSEVBREVSLCB3aHR0cCk7Ci0gICAgICAgICAgICBodHRwSGVhZGVyRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwgaHR0cEhlYWRlck1lc3NhZ2UuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IGh0dHBIZWFkZXJNZXNzYWdlLmdldHFOYW1lKCk7Ci0gICAgICAgICAgICBodHRwSGVhZGVyRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfVFlQRSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJlZml4KHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lU3BhY2VNYXApICsgIjoiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgICAgIGh0dHBIZWFkZXJFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRVFVSVJFRCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGh0dHBIZWFkZXJNZXNzYWdlLmlzUmVxdWlyZWQoKSkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgZWxlbWVudC5hZGRDaGlsZChodHRwSGVhZGVyRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBkZWZhdWx0IFNPQVAgMTEgQmluZGluZyBmb3IgYSBnaXZlbiBBeGlzU2VydmljZQotICAgICAqIEBwYXJhbSBmYWMgLSBUaGUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIC0gVGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzb2FwIC0gVGhlIFdTREwgMi4wIFNPQVAgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyAtIFRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHJldHVybiAtIFRoZSBnZW5lcmF0ZWQgU09BUDExQmluZGluZyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2VuZXJhdGVTT0FQMTFCaW5kaW5nKE9NRmFjdG9yeSBmYWMsIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2RsLCBPTU5hbWVzcGFjZSB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgdG5zLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgT01FbGVtZW50IGJpbmRpbmcgPSBmYWMuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgIGJpbmRpbmcuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwgc2VydmljZU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkJJTkRJTkdfTkFNRV9TVUZGSVgpKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLCBudWxsLCB0bnMKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZml4KCkgKyAiOiIgKyBXU0RMMkNvbnN0YW50cy5ERUZBVUxUX0lOVEVSRkFDRV9OQU1FKSk7Ci0KLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9WRVJTSU9OLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlNPQVBfVkVSU0lPTl8xXzEpKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9QUk9UT0NPTCwgd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkhUVFBfUFJPVE9DQUwpKTsKLSAgICAgICAgZ2VuZXJhdGVEZWZhdWx0U09BUEJpbmRpbmdPcGVyYXRpb25zKGF4aXNTZXJ2aWNlLCBmYWMsIGJpbmRpbmcsIHdzZGwsIHRucywgd3NvYXApOwotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBkZWZhdWx0IFNPQVAgMTIgQmluZGluZyBmb3IgYSBnaXZlbiBBeGlzU2VydmljZQotICAgICAqIEBwYXJhbSBmYWMgLSBUaGUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIC0gVGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdzb2FwIC0gVGhlIFdTREwgMi4wIFNPQVAgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyAtIFRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHJldHVybiAtIFRoZSBnZW5lcmF0ZWQgU09BUDEyQmluZGluZyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2VuZXJhdGVTT0FQMTJCaW5kaW5nKE9NRmFjdG9yeSBmYWMsIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2RsLCBPTU5hbWVzcGFjZSB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgdG5zLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgT01FbGVtZW50IGJpbmRpbmcgPSBmYWMuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgIGJpbmRpbmcuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTkFNRSwgbnVsbCwgc2VydmljZU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNPQVAxMkJJTkRJTkdfTkFNRV9TVUZGSVgpKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLCBudWxsLCB0bnMKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZml4KCkgKyAiOiIgKyBXU0RMMkNvbnN0YW50cy5ERUZBVUxUX0lOVEVSRkFDRV9OQU1FKSk7Ci0KLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVApKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9WRVJTSU9OLCB3c29hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLlNPQVBfVkVSU0lPTl8xXzIpKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9QUk9UT0NPTCwgd3NvYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkhUVFBfUFJPVE9DQUwpKTsKLSAgICAgICAgZ2VuZXJhdGVEZWZhdWx0U09BUEJpbmRpbmdPcGVyYXRpb25zKGF4aXNTZXJ2aWNlLCBmYWMsIGJpbmRpbmcsIHdzZGwsIHRucywgd3NvYXApOwotICAgICAgICByZXR1cm4gYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYSBkZWZhdWx0IEhUVFAgQmluZGluZyBmb3IgYSBnaXZlbiBBeGlzU2VydmljZQotICAgICAqIEBwYXJhbSBmYWMgLSBUaGUgT01GYWN0b3J5Ci0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIC0gVGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIHdzZGwgdGhlIFdTREwgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHdodHRwIC0gVGhlIFdTREwgMi4wIEhUVFAgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHRucyAtIFRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICogQHJldHVybiAtIFRoZSBnZW5lcmF0ZWQgSFRUUEJpbmRpbmcgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdlbmVyYXRlSFRUUEJpbmRpbmcoT01GYWN0b3J5IGZhYywgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2RsLCBPTU5hbWVzcGFjZSB3aHR0cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHRucywgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIE9NRWxlbWVudCBiaW5kaW5nID0gZmFjLmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5CSU5ESU5HX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICBiaW5kaW5nLmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBmYWMuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsIG51bGwsIHNlcnZpY2VOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5IVFRQX0JJTkRJTkcpKTsKLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLklOVEVSRkFDRV9MT0NBTF9OQU1FLCBudWxsLCB0bnMKLSAgICAgICAgICAgICAgICAuZ2V0UHJlZml4KCkgKyAiOiIgKyBXU0RMMkNvbnN0YW50cy5ERUZBVUxUX0lOVEVSRkFDRV9OQU1FKSk7Ci0KLSAgICAgICAgYmluZGluZy5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9UWVBFLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX0hUVFApKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRDaGlsZHJlbigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgT01FbGVtZW50IG9wRWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgYmluZGluZy5hZGRDaGlsZChvcEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIG9wRWxlbWVudC5hZGRBdHRyaWJ1dGUoZmFjLmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRUYsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKyBuYW1lKSk7Ci0gICAgICAgICAgICBvcEVsZW1lbnQuYWRkQXR0cmlidXRlKGZhYy5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfTE9DQVRJT04sIHdodHRwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kaW5nOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVEZWZhdWx0U09BUEJpbmRpbmdPcGVyYXRpb25zKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRmFjdG9yeSBvbUZhY3RvcnksIE9NRWxlbWVudCBiaW5kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzZGwsIE9NTmFtZXNwYWNlIHRucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c29hcCkgewotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYXhpc09wZXJhdGlvbi5pc0NvbnRyb2xPcGVyYXRpb24oKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT01FbGVtZW50IG9wRWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuT1BFUkFUSU9OX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgYmluZGluZy5hZGRDaGlsZChvcEVsZW1lbnQpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIG9wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9SRUYsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKyBuYW1lKSk7Ci0gICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IGF4aXNPcGVyYXRpb24uZ2V0U29hcEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9wRWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BQ1RJT04sIHdzb2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEFjdGlvbikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgZGVmYXVsdCBzZXJ2aWNlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb21GYWN0b3J5IC0gVGhlIE9NRmFjdG9yeQotICAgICAqIEBwYXJhbSB3c2RsIHRoZSBXU0RMIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB0bnMgLSBUaGUgdGFyZ2V0bmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIC0gVGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGRpc2FibGVSRVNUIG9ubHkgZ2VuZXJhdGUgUkVTVCBlbmRwb2ludCBpZiB0aGlzIGlzIGZhbHNlCi0gICAgICogQHBhcmFtIGRpc2FibGVTT0FQMTIgb25seSBnZW5lcmF0ZSBTT0FQIDEuMiBlbmRwb2ludCBpZiB0aGlzIGlzIGZhbHNlCi0gICAgICogQHJldHVybiAtIFRoZSBnZW5lcmF0ZWQgc2VydmljZSBlbGVtZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2VuZXJhdGVTZXJ2aWNlRWxlbWVudChPTUZhY3Rvcnkgb21GYWN0b3J5LCBPTU5hbWVzcGFjZSB3c2RsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgdG5zLCBBeGlzU2VydmljZSBheGlzU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZVJFU1QsIGJvb2xlYW4gZGlzYWJsZVNPQVAxMiwgIGJvb2xlYW4gZGlzYWJsZVNPQVAxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVTZXJ2aWNlRWxlbWVudChvbUZhY3RvcnksIHdzZGwsIHRucywgYXhpc1NlcnZpY2UsIGRpc2FibGVSRVNULCBkaXNhYmxlU09BUDEyLGRpc2FibGVTT0FQMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2VuZXJhdGVzIGEgZGVmYXVsdCBzZXJ2aWNlIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb21GYWN0b3J5IC0gVGhlIE9NRmFjdG9yeQotICAgICAqIEBwYXJhbSB3c2RsIHRoZSBXU0RMIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB0bnMgLSBUaGUgdGFyZ2V0bmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGF4aXNTZXJ2aWNlIC0gVGhlIEF4aXNTZXJ2aWNlCi0gICAgICogQHBhcmFtIGRpc2FibGVSRVNUIG9ubHkgZ2VuZXJhdGUgUkVTVCBlbmRwb2ludCBpZiB0aGlzIGlzIGZhbHNlCi0gICAgICogQHBhcmFtIGRpc2FibGVTT0FQMTIgb25seSBnZW5lcmF0ZSBTT0FQIDEuMiBlbmRwb2ludCBpZiB0aGlzIGlzIGZhbHNlCi0gICAgICogQHJldHVybiAtIFRoZSBnZW5lcmF0ZWQgc2VydmljZSBlbGVtZW50Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2VuZXJhdGVTZXJ2aWNlRWxlbWVudChPTUZhY3Rvcnkgb21GYWN0b3J5LCBPTU5hbWVzcGFjZSB3c2RsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgdG5zLCBBeGlzU2VydmljZSBheGlzU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZVJFU1QsIGJvb2xlYW4gZGlzYWJsZVNPQVAxMiwgYm9vbGVhbiBkaXNhYmxlU09BUDExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZXBycywgU3RyaW5nIHNlcnZpY2VOYW1lKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmKGVwcnMgPT0gbnVsbCl7Ci0gICAgICAgICAgICBlcHJzID0gYXhpc1NlcnZpY2UuZ2V0RVBScygpOwotICAgICAgICAgICAgaWYgKGVwcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGVwcnMgPSBuZXcgU3RyaW5nW117c2VydmljZU5hbWV9OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE9NRWxlbWVudCBzZXJ2aWNlRWxlbWVudDsKLSAgICAgICAgc2VydmljZUVsZW1lbnQgPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLlNFUlZJQ0VfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoV1NETDJDb25zdGFudHMuQVRUUklCVVRFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2VydmljZU5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5JTlRFUkZBQ0VfTE9DQUxfTkFNRSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnMuZ2V0UHJlZml4KCkgKyAiOiIgKyBXU0RMMkNvbnN0YW50cy5ERUZBVUxUX0lOVEVSRkFDRV9OQU1FKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXBycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBlcHIgPSBlcHJzW2ldOwotICAgICAgICAgICAgaWYgKGVwci5zdGFydHNXaXRoKCJodHRwczovLyIpKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSFRUUFNfUFJFRklYOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgc29hcDExRW5kcG9pbnRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbnVsbDsKLSAgICAgICAgICAgIGlmICghZGlzYWJsZVNPQVAxMSkgewotICAgICAgICAgICAgICAgIHNvYXAxMUVuZHBvaW50RWxlbWVudCA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSwgd3NkbCk7Ci0gICAgICAgICAgICAgICAgc29hcDExRW5kcG9pbnRFbGVtZW50LmFkZEF0dHJpYnV0ZShvbUZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfU09BUDExX0VORFBPSU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBzb2FwMTFFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQklORElOR19MT0NBTF9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgdG5zLmdldFByZWZpeCgpICsgIjoiICsgc2VydmljZU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuQklORElOR19OQU1FX1NVRkZJWCkpOwotICAgICAgICAgICAgICAgIHNvYXAxMUVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZShXU0RMMkNvbnN0YW50cy5BVFRSSUJVVEVfQUREUkVTUywgbnVsbCwgZXByKSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZUVsZW1lbnQuYWRkQ2hpbGQoc29hcDExRW5kcG9pbnRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgT01FbGVtZW50IHNvYXAxMkVuZHBvaW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICBzb2FwMTJFbmRwb2ludEVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5FTkRQT0lOVF9MT0NBTF9OQU1FLCB3c2RsKTsKLSAgICAgICAgICAgICAgICBzb2FwMTJFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfU09BUDEyX0VORFBPSU5UX05BTUUpKTsKLSAgICAgICAgICAgICAgICBzb2FwMTJFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkJJTkRJTkdfTE9DQUxfTkFNRSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRucy5nZXRQcmVmaXgoKSArICI6IiArIHNlcnZpY2VOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNPQVAxMkJJTkRJTkdfTkFNRV9TVUZGSVgpKTsKLSAgICAgICAgICAgICAgICBzb2FwMTJFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BRERSRVNTLCBudWxsLCBlcHIpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRWxlbWVudC5hZGRDaGlsZChzb2FwMTJFbmRwb2ludEVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBPTUVsZW1lbnQgaHR0cEVuZHBvaW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoIWRpc2FibGVSRVNUKSB7Ci0gICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkVORFBPSU5UX0xPQ0FMX05BTUUsIHdzZGwpOwotICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKG9tRmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArIFdTREwyQ29uc3RhbnRzLkRFRkFVTFRfSFRUUF9FTkRQT0lOVF9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RWxlbWVudC5hZGRBdHRyaWJ1dGUob21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuQklORElOR19MT0NBTF9OQU1FLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgdG5zLmdldFByZWZpeCgpICsgIjoiICsgc2VydmljZU5hbWUgKyBKYXZhMldTRExDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkhUVFBfQklORElORykpOwotICAgICAgICAgICAgICAgIGh0dHBFbmRwb2ludEVsZW1lbnQuYWRkQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgb21GYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKFdTREwyQ29uc3RhbnRzLkFUVFJJQlVURV9BRERSRVNTLCBudWxsLCBlcHIpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRWxlbWVudC5hZGRDaGlsZChodHRwRW5kcG9pbnRFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGVwci5zdGFydHNXaXRoKCJodHRwczovLyIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwMTFEb2N1bWVudGF0aW9uID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ET0NVTUVOVEFUSU9OLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcDExRG9jdW1lbnRhdGlvbi5zZXRUZXh0KCJUaGlzIGVuZHBvaW50IGV4cG9zZXMgYSBTT0FQIDExIGJpbmRpbmcgb3ZlciBhIEhUVFBTIik7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXAxMUVuZHBvaW50RWxlbWVudC5hZGRDaGlsZChzb2FwMTFEb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDEyKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwMTJEb2N1bWVudGF0aW9uID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ET0NVTUVOVEFUSU9OLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcDEyRG9jdW1lbnRhdGlvbi5zZXRUZXh0KCJUaGlzIGVuZHBvaW50IGV4cG9zZXMgYSBTT0FQIDEyIGJpbmRpbmcgb3ZlciBhIEhUVFBTIik7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXAxMkVuZHBvaW50RWxlbWVudC5hZGRDaGlsZChzb2FwMTJEb2N1bWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgaHR0cERvY3VtZW50YXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuRE9DVU1FTlRBVElPTiwgd3NkbCk7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBEb2N1bWVudGF0aW9uLnNldFRleHQoIlRoaXMgZW5kcG9pbnQgZXhwb3NlcyBhIEhUVFAgYmluZGluZyBvdmVyIGEgSFRUUFMiKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RWxlbWVudC5hZGRDaGlsZChodHRwRG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChlcHIuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBzb2FwMTFEb2N1bWVudGF0aW9uID0gb21GYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChXU0RMMkNvbnN0YW50cy5ET0NVTUVOVEFUSU9OLCB3c2RsKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcDExRG9jdW1lbnRhdGlvbi5zZXRUZXh0KCJUaGlzIGVuZHBvaW50IGV4cG9zZXMgYSBTT0FQIDExIGJpbmRpbmcgb3ZlciBhIEhUVFAiKTsKLSAgICAgICAgICAgICAgICAgICAgc29hcDExRW5kcG9pbnRFbGVtZW50LmFkZENoaWxkKHNvYXAxMURvY3VtZW50YXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVTT0FQMTIpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IHNvYXAxMkRvY3VtZW50YXRpb24gPSBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04sIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBzb2FwMTJEb2N1bWVudGF0aW9uLnNldFRleHQoIlRoaXMgZW5kcG9pbnQgZXhwb3NlcyBhIFNPQVAgMTIgYmluZGluZyBvdmVyIGEgSFRUUCIpOwotICAgICAgICAgICAgICAgICAgICBzb2FwMTJFbmRwb2ludEVsZW1lbnQuYWRkQ2hpbGQoc29hcDEyRG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZVJFU1QpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IGh0dHBEb2N1bWVudGF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFdTREwyQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04sIHdzZGwpOwotICAgICAgICAgICAgICAgICAgICBodHRwRG9jdW1lbnRhdGlvbi5zZXRUZXh0KCJUaGlzIGVuZHBvaW50IGV4cG9zZXMgYSBIVFRQIGJpbmRpbmcgb3ZlciBhIEhUVFAiKTsKLSAgICAgICAgICAgICAgICAgICAgaHR0cEVuZHBvaW50RWxlbWVudC5hZGRDaGlsZChodHRwRG9jdW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBuYW1lc3BhY2VzIHRvIHRoZSBnaXZlbiBPTUVsZW1lbnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbkVsZW1lbnQgLSBUaGUgT01FbGVtZW50IHRoYXQgdGhlIG5hbWVzcGFjZXMgc2hvdWxkIGJlIGFkZGVkIHRvCi0gICAgICogQHBhcmFtIG5hbWVTcGFjZU1hcCAtIFRoZSBuYW1lc3BhY2VNYXAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcG9wdWxhdGVOYW1lc3BhY2VzKE9NRWxlbWVudCBkZXNjcmlwdGlvbkVsZW1lbnQsIE1hcCBuYW1lU3BhY2VNYXApIHsKLSAgICAgICAgaWYgKG5hbWVTcGFjZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGtleXMgPSBuYW1lU3BhY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkVsZW1lbnQuZGVjbGFyZURlZmF1bHROYW1lc3BhY2UoKFN0cmluZykgbmFtZVNwYWNlTWFwLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25FbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UoKFN0cmluZykgbmFtZVNwYWNlTWFwLmdldChrZXkpLCBrZXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFdTQVdBY3Rpb25BdHRyaWJ1dGUoT01FbGVtZW50IGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugd3NhdykgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgfHwgYWN0aW9uLmxlbmd0aCgpID09IDAgfHwgIlxcXCJcXFwiIi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnQuYWRkQXR0cmlidXRlKCJBY3Rpb24iLCBhY3Rpb24sIHdzYXcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbnNpb25FbGVtZW50KE9NRmFjdG9yeSBmYWMsIE9NRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lLCBTdHJpbmcgYXR0MU5hbWUsIFN0cmluZyBhdHQxVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2Ugc29hcE5hbWVTcGFjZSkgewotICAgICAgICBPTUVsZW1lbnQgZXh0RWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQobmFtZSwgc29hcE5hbWVTcGFjZSk7Ci0gICAgICAgIGVsZW1lbnQuYWRkQ2hpbGQoZXh0RWxlbWVudCk7Ci0gICAgICAgIGV4dEVsZW1lbnQuYWRkQXR0cmlidXRlKGF0dDFOYW1lLCBhdHQxVmFsdWUsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRXU0FkZHJlc3NpbmdUb0JpbmRpbmcoU3RyaW5nIGFkZHJlc3NpbmdGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01GYWN0b3J5IG9tRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBiaW5kaW5nRWxlbWVudCAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSB3c2F3KSB7Ci0gICAgICAgIC8vIEFkZCBXUy1BZGRyZXNzaW5nIFVzaW5nQWRkcmVzc2luZyBlbGVtZW50IGlmIGFwcHJvcHJpYXRlCi0gICAgICAgIC8vIFNIT1VMRCBiZSBvbiB0aGUgYmluZGluZyBlbGVtZW50IHBlciB0aGUgc3BlY2lmaWNhdGlvbgotICAgICAgICBpZiAoYWRkcmVzc2luZ0ZsYWcuZXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19PUFRJT05BTCkpIHsKLSAgICAgICAgICAgIFdTRExTZXJpYWxpemF0aW9uVXRpbC5hZGRFeHRlbnNpb25FbGVtZW50KG9tRmFjdG9yeSwgYmluZGluZ0VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuVVNJTkdfQUREUkVTU0lORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIiwgInRydWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3KTsKLSAgICAgICAgfSBlbHNlIGlmIChhZGRyZXNzaW5nRmxhZy5lcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVEKSkgewotICAgICAgICAgICAgV1NETFNlcmlhbGl6YXRpb25VdGlsLmFkZEV4dGVuc2lvbkVsZW1lbnQob21GYWN0b3J5LCBiaW5kaW5nRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5VU0lOR19BRERSRVNTSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiLCAidHJ1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFdTRExEb2N1bWVudGF0aW9uRWxlbWVudChBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCwgT01GYWN0b3J5IG9tRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NTmFtZXNwYWNlIHdzZGwpIHsKLSAgICAgICAgT01Ob2RlIGRvY3VtZW50YXRpb25Ob2RlID0gYXhpc0Rlc2NyaXB0aW9uLmdldERvY3VtZW50YXRpb25Ob2RlKCk7Ci0gICAgICAgIE9NRWxlbWVudCBkb2N1bWVudGF0aW9uOwotICAgICAgICBpZiAoZG9jdW1lbnRhdGlvbk5vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiA9IG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoV1NETDJDb25zdGFudHMuRE9DVU1FTlRBVElPTiwgd3NkbCk7Ci0gICAgICAgICAgICBkb2N1bWVudGF0aW9uLmFkZENoaWxkKGRvY3VtZW50YXRpb25Ob2RlKTsKLSAgICAgICAgICAgIG9tRWxlbWVudC5hZGRDaGlsZChkb2N1bWVudGF0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkUG9saWNpZXNBc0V4dGVuc2libGVFbGVtZW50KAotCQkJQXhpc0Rlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPTUVsZW1lbnQgZGVzY3JpcHRpb25FbGVtZW50KSB7Ci0JCVBvbGljeVN1YmplY3QgcG9saWN5U3ViamVjdCA9IGRlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKTsKLQkJQ29sbGVjdGlvbiBhdHRhY2hQb2xpY3lDb21wb25lbnRzID0gcG9saWN5U3ViamVjdAotCQkJCS5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKTsKLQkJQXJyYXlMaXN0IHBvbGljaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhdHRhY2hQb2xpY3lDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwb2xpY3lFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQlpZiAocG9saWN5RWxlbWVudCBpbnN0YW5jZW9mIFBvbGljeSkgewotCQkJCXBvbGljaWVzLmFkZChwb2xpY3lFbGVtZW50KTsKLQotCQkJfSBlbHNlIGlmIChwb2xpY3lFbGVtZW50IGluc3RhbmNlb2YgUG9saWN5UmVmZXJlbmNlKSB7Ci0JCQkJU3RyaW5nIGtleSA9ICgoUG9saWN5UmVmZXJlbmNlKSBwb2xpY3lFbGVtZW50KS5nZXRVUkkoKTsKLQotCQkJCWlmIChrZXkuc3RhcnRzV2l0aCgiIyIpKSB7Ci0JCQkJCWtleSA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoIiMiKSArIDEpOwotCQkJCX0KLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gZ2V0QXhpc1NlcnZpY2UoZGVzY3JpcHRpb24pOwotCQkJCVBvbGljeUxvY2F0b3IgbG9jYXRvciA9IG5ldyBQb2xpY3lMb2NhdG9yKHNlcnZpY2UpOwotCQkJCVBvbGljeSBwID0gbG9jYXRvci5sb29rdXAoa2V5KTsKLQotCQkJCWlmIChwID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBvbGljeSBub3QgZm91bmQgZm9yIHVyaSA6ICIKLQkJCQkJCQkrIGtleSk7Ci0JCQkJfQotCQkJCXBvbGljaWVzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCUV4dGVybmFsUG9saWN5U2VyaWFsaXplciBmaWx0ZXIgPSBudWxsOwotCQlpZiAoIXBvbGljaWVzLmlzRW1wdHkoKSkgewotCQkJZmlsdGVyID0gbmV3IEV4dGVybmFsUG9saWN5U2VyaWFsaXplcigpOwotCQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBkZXNjcmlwdGlvbgotCQkJCQkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZmlsdGVyLnNldEFzc2VydGlvbnNUb0ZpbHRlcihheGlzQ29uZmlndXJhdGlvbgotCQkJCQkJLmdldExvY2FsUG9saWN5QXNzZXJ0aW9ucygpKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwb2xpY2llcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlQb2xpY3kgcG9saWN5ID0gKFBvbGljeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJT01FbGVtZW50IHBvbGljeUVsZW1lbnQ7Ci0JCQl0cnkgewotCQkJCXBvbGljeUVsZW1lbnQgPSBQb2xpY3lVdGlsLmdldFBvbGljeUNvbXBvbmVudEFzT01FbGVtZW50KAotCQkJCQkJcG9saWN5LCBmaWx0ZXIpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJT01Ob2RlIGZpcnN0Q2hpbGQgPSBkZXNjcmlwdGlvbkVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0JCQlpZiAoZmlyc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQkJZmlyc3RDaGlsZC5pbnNlcnRTaWJsaW5nQmVmb3JlKHBvbGljeUVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlkZXNjcmlwdGlvbkVsZW1lbnQuYWRkQ2hpbGQocG9saWN5RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBeGlzU2VydmljZSBnZXRBeGlzU2VydmljZShBeGlzRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwgfHwgZGVzY3JpcHRpb24gaW5zdGFuY2VvZiBBeGlzU2VydmljZSkgewotCQkJcmV0dXJuIChBeGlzU2VydmljZSkgZGVzY3JpcHRpb247Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0QXhpc1NlcnZpY2UoZGVzY3JpcHRpb24uZ2V0UGFyZW50KCkpOwotCQl9Ci0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0SG9zdElQKFN0cmluZyBzZXJ2aWNlVVJMKXsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGlwID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlcnZpY2VVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IGlwaW5kZXggPSBzZXJ2aWNlVVJMLmluZGV4T2YoIi8vIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaXBpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlwID0gc2VydmljZVVSTC5zdWJzdHJpbmcoaXBpbmRleCArIDIsIHNlcnZpY2VVUkwubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2VwZXJhdG9ySW5kZXggPSBpcC5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzbGFzaEluZGV4ID0gaXAuaW5kZXhPZigiLyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXBlcmF0b3JJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcCA9IGlwLnN1YnN0cmluZygwLCBzZXBlcmF0b3JJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcCA9IGlwLnN1YnN0cmluZygwLCBzbGFzaEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBpcDsgICAgICAKLSAgICAgICAgfSAgICAgIAotCi0JCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YTUxDaGFyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YTUxDaGFyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMzBjYzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWE1MQ2hhci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgYmFzaWMgWE1MIGNoYXJhY3RlciBwcm9wZXJ0aWVzLiBUaGUgZGF0YQotICogaW4gdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNoYXJhY3RlciBpcyBhIHZhbGlkCi0gKiBYTUwgY2hhcmFjdGVyIG9yIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZSwgbmFtZSBzdGFydCwgb3IgbmFtZQotICogY2hhcmFjdGVyLgotICogPHAvPgotICogQSBzZXJpZXMgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBhcmUgc3VwcGxpZWQgdG8gZWFzZSB0aGUgYnVyZGVuCi0gKiBvZiB0aGUgZGV2ZWxvcGVyLiBCZWNhdXNlIGlubGluaW5nIHRoZSBjaGVja3MgY2FuIGltcHJvdmUgcGVyCi0gKiBjaGFyYWN0ZXIgcGVyZm9ybWFuY2UsIHRoZSB0YWJsZXMgb2YgY2hhcmFjdGVyIHByb3BlcnRpZXMgYXJlCi0gKiBwdWJsaWMuIFVzaW5nIHRoZSBjaGFyYWN0ZXIgYXMgYW4gaW5kZXggaW50byB0aGUgPGNvZGU+Q0hBUlM8L2NvZGU+Ci0gKiBhcnJheSBhbmQgYXBwbHlpbmcgdGhlIGFwcHJvcHJpYXRlIG1hc2sgZmxhZyAoZS5nLgotICogPGNvZGU+TUFTS19WQUxJRDwvY29kZT4pLCB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0cyBhcyBjYWxsaW5nIHRoZQotICogY29udmVuaWVuY2UgbWV0aG9kcy4gVGhlcmUgaXMgb25lIGV4Y2VwdGlvbjogY2hlY2sgdGhlIGNvbW1lbnRzCi0gKiBmb3IgdGhlIDxjb2RlPmlzVmFsaWQ8L2NvZGU+IG1ldGhvZCBmb3IgZGV0YWlscy4KLSAqLwotcHVibGljIGNsYXNzIFhNTENoYXIgewotCi0gICAgLy8KLSAgICAvLyBDb25zdGFudHMKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogQ2hhcmFjdGVyIGZsYWdzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDSEFSUyA9IG5ldyBieXRlWzEgPDwgMTZdOwotCi0gICAgLyoqCi0gICAgICogVmFsaWQgY2hhcmFjdGVyIG1hc2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19WQUxJRCA9IDB4MDE7Ci0KLSAgICAvKioKLSAgICAgKiBTcGFjZSBjaGFyYWN0ZXIgbWFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX1NQQUNFID0gMHgwMjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgc3RhcnQgY2hhcmFjdGVyIG1hc2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FX1NUQVJUID0gMHgwNDsKLQotICAgIC8qKgotICAgICAqIE5hbWUgY2hhcmFjdGVyIG1hc2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19OQU1FID0gMHgwODsKLQotICAgIC8qKgotICAgICAqIFB1YmlkIGNoYXJhY3RlciBtYXNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfUFVCSUQgPSAweDEwOwotCi0gICAgLyoqCi0gICAgICogQ29udGVudCBjaGFyYWN0ZXIgbWFzay4gU3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB0aGF0IGNhbgotICAgICAqIGJlIGNvbnNpZGVyZWQgdGhlIHN0YXJ0IG9mIG1hcmt1cCwgc3VjaCBhcyAnJmx0OycgYW5kICcmYW1wOycuCi0gICAgICogVGhlIHZhcmlvdXMgbmV3bGluZSBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkIHNwZWNpYWwgYXMgd2VsbC4KLSAgICAgKiBBbGwgb3RoZXIgdmFsaWQgWE1MIGNoYXJhY3RlcnMgY2FuIGJlIGNvbnNpZGVyZWQgY29udGVudC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSBpbm5lciBsb29wIG9mIGNoYXJhY3RlciBzY2FubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX0NPTlRFTlQgPSAweDIwOwotCi0gICAgLyoqCi0gICAgICogTkNOYW1lIHN0YXJ0IGNoYXJhY3RlciBtYXNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BU0tfTkNOQU1FX1NUQVJUID0gMHg0MDsKLQotICAgIC8qKgotICAgICAqIE5DTmFtZSBjaGFyYWN0ZXIgbWFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVNLX05DTkFNRSA9IDB4ODA7Ci0KLSAgICAvLwotICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbgotICAgIC8vCi0KLSAgICBzdGF0aWMgewotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwKLSAgICAgICAgLy8gICAgICAgICAgICAgIFsjeEUwMDAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4MTBGRkZGXQotICAgICAgICAvLwotCi0gICAgICAgIGludCBjaGFyUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMDksIDB4MDAwQSwgMHgwMDBELCAweDAwMEQsIDB4MDAyMCwgMHhEN0ZGLCAweEUwMDAsIDB4RkZGRCwKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbM10gUyA6Oj0gKCN4MjAgfCAjeDkgfCAjeEQgfCAjeEEpKwotICAgICAgICAvLwotCi0gICAgICAgIGludCBzcGFjZUNoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMjAsIDB4MDAwOSwgMHgwMDBELCAweDAwMEEsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgQ29tYmluaW5nQ2hhciB8IEV4dGVuZGVyCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IG5hbWVDaGFyW10gPSB7Ci0gICAgICAgICAgICAgICAgMHgwMDJELCAweDAwMkUsIC8vICctJyBhbmQgJy4nCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IG5hbWVTdGFydENoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwM0EsIDB4MDA1RiwgLy8gJzonIGFuZCAnXycKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8IDB4RCB8IDB4QSB8IFthLXpBLVowLTldIHwgWy0nKCkrLC4vOj0/OyEqI0AkXyVdCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IHB1YmlkQ2hhcltdID0gewotICAgICAgICAgICAgICAgIDB4MDAwQSwgMHgwMDBELCAweDAwMjAsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDNELAotICAgICAgICAgICAgICAgIDB4MDA1RgotICAgICAgICB9OwotCi0gICAgICAgIGludCBwdWJpZFJhbmdlW10gPSB7Ci0gICAgICAgICAgICAgICAgMHgwMDI3LCAweDAwM0IsIDB4MDAzRiwgMHgwMDVBLCAweDAwNjEsIDB4MDA3QQotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4NF0gTGV0dGVyIDo6PSBCYXNlQ2hhciB8IElkZW9ncmFwaGljCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGxldHRlclJhbmdlW10gPSB7Ci0gICAgICAgICAgICAgICAgLy8gQmFzZUNoYXIKLSAgICAgICAgICAgICAgICAweDAwNDEsIDB4MDA1QSwgMHgwMDYxLCAweDAwN0EsIDB4MDBDMCwgMHgwMEQ2LCAweDAwRDgsIDB4MDBGNiwKLSAgICAgICAgICAgICAgICAweDAwRjgsIDB4MDEzMSwgMHgwMTM0LCAweDAxM0UsIDB4MDE0MSwgMHgwMTQ4LCAweDAxNEEsIDB4MDE3RSwKLSAgICAgICAgICAgICAgICAweDAxODAsIDB4MDFDMywgMHgwMUNELCAweDAxRjAsIDB4MDFGNCwgMHgwMUY1LCAweDAxRkEsIDB4MDIxNywKLSAgICAgICAgICAgICAgICAweDAyNTAsIDB4MDJBOCwgMHgwMkJCLCAweDAyQzEsIDB4MDM4OCwgMHgwMzhBLCAweDAzOEUsIDB4MDNBMSwKLSAgICAgICAgICAgICAgICAweDAzQTMsIDB4MDNDRSwgMHgwM0QwLCAweDAzRDYsIDB4MDNFMiwgMHgwM0YzLCAweDA0MDEsIDB4MDQwQywKLSAgICAgICAgICAgICAgICAweDA0MEUsIDB4MDQ0RiwgMHgwNDUxLCAweDA0NUMsIDB4MDQ1RSwgMHgwNDgxLCAweDA0OTAsIDB4MDRDNCwKLSAgICAgICAgICAgICAgICAweDA0QzcsIDB4MDRDOCwgMHgwNENCLCAweDA0Q0MsIDB4MDREMCwgMHgwNEVCLCAweDA0RUUsIDB4MDRGNSwKLSAgICAgICAgICAgICAgICAweDA0RjgsIDB4MDRGOSwgMHgwNTMxLCAweDA1NTYsIDB4MDU2MSwgMHgwNTg2LCAweDA1RDAsIDB4MDVFQSwKLSAgICAgICAgICAgICAgICAweDA1RjAsIDB4MDVGMiwgMHgwNjIxLCAweDA2M0EsIDB4MDY0MSwgMHgwNjRBLCAweDA2NzEsIDB4MDZCNywKLSAgICAgICAgICAgICAgICAweDA2QkEsIDB4MDZCRSwgMHgwNkMwLCAweDA2Q0UsIDB4MDZEMCwgMHgwNkQzLCAweDA2RTUsIDB4MDZFNiwKLSAgICAgICAgICAgICAgICAweDA5MDUsIDB4MDkzOSwgMHgwOTU4LCAweDA5NjEsIDB4MDk4NSwgMHgwOThDLCAweDA5OEYsIDB4MDk5MCwKLSAgICAgICAgICAgICAgICAweDA5OTMsIDB4MDlBOCwgMHgwOUFBLCAweDA5QjAsIDB4MDlCNiwgMHgwOUI5LCAweDA5REMsIDB4MDlERCwKLSAgICAgICAgICAgICAgICAweDA5REYsIDB4MDlFMSwgMHgwOUYwLCAweDA5RjEsIDB4MEEwNSwgMHgwQTBBLCAweDBBMEYsIDB4MEExMCwKLSAgICAgICAgICAgICAgICAweDBBMTMsIDB4MEEyOCwgMHgwQTJBLCAweDBBMzAsIDB4MEEzMiwgMHgwQTMzLCAweDBBMzUsIDB4MEEzNiwKLSAgICAgICAgICAgICAgICAweDBBMzgsIDB4MEEzOSwgMHgwQTU5LCAweDBBNUMsIDB4MEE3MiwgMHgwQTc0LCAweDBBODUsIDB4MEE4QiwKLSAgICAgICAgICAgICAgICAweDBBOEYsIDB4MEE5MSwgMHgwQTkzLCAweDBBQTgsIDB4MEFBQSwgMHgwQUIwLCAweDBBQjIsIDB4MEFCMywKLSAgICAgICAgICAgICAgICAweDBBQjUsIDB4MEFCOSwgMHgwQjA1LCAweDBCMEMsIDB4MEIwRiwgMHgwQjEwLCAweDBCMTMsIDB4MEIyOCwKLSAgICAgICAgICAgICAgICAweDBCMkEsIDB4MEIzMCwgMHgwQjMyLCAweDBCMzMsIDB4MEIzNiwgMHgwQjM5LCAweDBCNUMsIDB4MEI1RCwKLSAgICAgICAgICAgICAgICAweDBCNUYsIDB4MEI2MSwgMHgwQjg1LCAweDBCOEEsIDB4MEI4RSwgMHgwQjkwLCAweDBCOTIsIDB4MEI5NSwKLSAgICAgICAgICAgICAgICAweDBCOTksIDB4MEI5QSwgMHgwQjlFLCAweDBCOUYsIDB4MEJBMywgMHgwQkE0LCAweDBCQTgsIDB4MEJBQSwKLSAgICAgICAgICAgICAgICAweDBCQUUsIDB4MEJCNSwgMHgwQkI3LCAweDBCQjksIDB4MEMwNSwgMHgwQzBDLCAweDBDMEUsIDB4MEMxMCwKLSAgICAgICAgICAgICAgICAweDBDMTIsIDB4MEMyOCwgMHgwQzJBLCAweDBDMzMsIDB4MEMzNSwgMHgwQzM5LCAweDBDNjAsIDB4MEM2MSwKLSAgICAgICAgICAgICAgICAweDBDODUsIDB4MEM4QywgMHgwQzhFLCAweDBDOTAsIDB4MEM5MiwgMHgwQ0E4LCAweDBDQUEsIDB4MENCMywKLSAgICAgICAgICAgICAgICAweDBDQjUsIDB4MENCOSwgMHgwQ0UwLCAweDBDRTEsIDB4MEQwNSwgMHgwRDBDLCAweDBEMEUsIDB4MEQxMCwKLSAgICAgICAgICAgICAgICAweDBEMTIsIDB4MEQyOCwgMHgwRDJBLCAweDBEMzksIDB4MEQ2MCwgMHgwRDYxLCAweDBFMDEsIDB4MEUyRSwKLSAgICAgICAgICAgICAgICAweDBFMzIsIDB4MEUzMywgMHgwRTQwLCAweDBFNDUsIDB4MEU4MSwgMHgwRTgyLCAweDBFODcsIDB4MEU4OCwKLSAgICAgICAgICAgICAgICAweDBFOTQsIDB4MEU5NywgMHgwRTk5LCAweDBFOUYsIDB4MEVBMSwgMHgwRUEzLCAweDBFQUEsIDB4MEVBQiwKLSAgICAgICAgICAgICAgICAweDBFQUQsIDB4MEVBRSwgMHgwRUIyLCAweDBFQjMsIDB4MEVDMCwgMHgwRUM0LCAweDBGNDAsIDB4MEY0NywKLSAgICAgICAgICAgICAgICAweDBGNDksIDB4MEY2OSwgMHgxMEEwLCAweDEwQzUsIDB4MTBEMCwgMHgxMEY2LCAweDExMDIsIDB4MTEwMywKLSAgICAgICAgICAgICAgICAweDExMDUsIDB4MTEwNywgMHgxMTBCLCAweDExMEMsIDB4MTEwRSwgMHgxMTEyLCAweDExNTQsIDB4MTE1NSwKLSAgICAgICAgICAgICAgICAweDExNUYsIDB4MTE2MSwgMHgxMTZELCAweDExNkUsIDB4MTE3MiwgMHgxMTczLCAweDExQUUsIDB4MTFBRiwKLSAgICAgICAgICAgICAgICAweDExQjcsIDB4MTFCOCwgMHgxMUJDLCAweDExQzIsIDB4MUUwMCwgMHgxRTlCLCAweDFFQTAsIDB4MUVGOSwKLSAgICAgICAgICAgICAgICAweDFGMDAsIDB4MUYxNSwgMHgxRjE4LCAweDFGMUQsIDB4MUYyMCwgMHgxRjQ1LCAweDFGNDgsIDB4MUY0RCwKLSAgICAgICAgICAgICAgICAweDFGNTAsIDB4MUY1NywgMHgxRjVGLCAweDFGN0QsIDB4MUY4MCwgMHgxRkI0LCAweDFGQjYsIDB4MUZCQywKLSAgICAgICAgICAgICAgICAweDFGQzIsIDB4MUZDNCwgMHgxRkM2LCAweDFGQ0MsIDB4MUZEMCwgMHgxRkQzLCAweDFGRDYsIDB4MUZEQiwKLSAgICAgICAgICAgICAgICAweDFGRTAsIDB4MUZFQywgMHgxRkYyLCAweDFGRjQsIDB4MUZGNiwgMHgxRkZDLCAweDIxMkEsIDB4MjEyQiwKLSAgICAgICAgICAgICAgICAweDIxODAsIDB4MjE4MiwgMHgzMDQxLCAweDMwOTQsIDB4MzBBMSwgMHgzMEZBLCAweDMxMDUsIDB4MzEyQywKLSAgICAgICAgICAgICAgICAweEFDMDAsIDB4RDdBMywKLSAgICAgICAgICAgICAgICAvLyBJZGVvZ3JhcGhpYwotICAgICAgICAgICAgICAgIDB4MzAyMSwgMHgzMDI5LCAweDRFMDAsIDB4OUZBNSwKLSAgICAgICAgfTsKLSAgICAgICAgaW50IGxldHRlckNoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAvLyBCYXNlQ2hhcgotICAgICAgICAgICAgICAgIDB4MDM4NiwgMHgwMzhDLCAweDAzREEsIDB4MDNEQywgMHgwM0RFLCAweDAzRTAsIDB4MDU1OSwgMHgwNkQ1LAotICAgICAgICAgICAgICAgIDB4MDkzRCwgMHgwOUIyLCAweDBBNUUsIDB4MEE4RCwgMHgwQUJELCAweDBBRTAsIDB4MEIzRCwgMHgwQjlDLAotICAgICAgICAgICAgICAgIDB4MENERSwgMHgwRTMwLCAweDBFODQsIDB4MEU4QSwgMHgwRThELCAweDBFQTUsIDB4MEVBNywgMHgwRUIwLAotICAgICAgICAgICAgICAgIDB4MEVCRCwgMHgxMTAwLCAweDExMDksIDB4MTEzQywgMHgxMTNFLCAweDExNDAsIDB4MTE0QywgMHgxMTRFLAotICAgICAgICAgICAgICAgIDB4MTE1MCwgMHgxMTU5LCAweDExNjMsIDB4MTE2NSwgMHgxMTY3LCAweDExNjksIDB4MTE3NSwgMHgxMTlFLAotICAgICAgICAgICAgICAgIDB4MTFBOCwgMHgxMUFCLCAweDExQkEsIDB4MTFFQiwgMHgxMUYwLCAweDExRjksIDB4MUY1OSwgMHgxRjVCLAotICAgICAgICAgICAgICAgIDB4MUY1RCwgMHgxRkJFLCAweDIxMjYsIDB4MjEyRSwKLSAgICAgICAgICAgICAgICAvLyBJZGVvZ3JhcGhpYwotICAgICAgICAgICAgICAgIDB4MzAwNywKLSAgICAgICAgfTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBbODddIENvbWJpbmluZ0NoYXIgOjo9IC4uLgotICAgICAgICAvLwotCi0gICAgICAgIGludCBjb21iaW5pbmdDaGFyUmFuZ2VbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAzMDAsIDB4MDM0NSwgMHgwMzYwLCAweDAzNjEsIDB4MDQ4MywgMHgwNDg2LCAweDA1OTEsIDB4MDVBMSwKLSAgICAgICAgICAgICAgICAweDA1QTMsIDB4MDVCOSwgMHgwNUJCLCAweDA1QkQsIDB4MDVDMSwgMHgwNUMyLCAweDA2NEIsIDB4MDY1MiwKLSAgICAgICAgICAgICAgICAweDA2RDYsIDB4MDZEQywgMHgwNkRELCAweDA2REYsIDB4MDZFMCwgMHgwNkU0LCAweDA2RTcsIDB4MDZFOCwKLSAgICAgICAgICAgICAgICAweDA2RUEsIDB4MDZFRCwgMHgwOTAxLCAweDA5MDMsIDB4MDkzRSwgMHgwOTRDLCAweDA5NTEsIDB4MDk1NCwKLSAgICAgICAgICAgICAgICAweDA5NjIsIDB4MDk2MywgMHgwOTgxLCAweDA5ODMsIDB4MDlDMCwgMHgwOUM0LCAweDA5QzcsIDB4MDlDOCwKLSAgICAgICAgICAgICAgICAweDA5Q0IsIDB4MDlDRCwgMHgwOUUyLCAweDA5RTMsIDB4MEE0MCwgMHgwQTQyLCAweDBBNDcsIDB4MEE0OCwKLSAgICAgICAgICAgICAgICAweDBBNEIsIDB4MEE0RCwgMHgwQTcwLCAweDBBNzEsIDB4MEE4MSwgMHgwQTgzLCAweDBBQkUsIDB4MEFDNSwKLSAgICAgICAgICAgICAgICAweDBBQzcsIDB4MEFDOSwgMHgwQUNCLCAweDBBQ0QsIDB4MEIwMSwgMHgwQjAzLCAweDBCM0UsIDB4MEI0MywKLSAgICAgICAgICAgICAgICAweDBCNDcsIDB4MEI0OCwgMHgwQjRCLCAweDBCNEQsIDB4MEI1NiwgMHgwQjU3LCAweDBCODIsIDB4MEI4MywKLSAgICAgICAgICAgICAgICAweDBCQkUsIDB4MEJDMiwgMHgwQkM2LCAweDBCQzgsIDB4MEJDQSwgMHgwQkNELCAweDBDMDEsIDB4MEMwMywKLSAgICAgICAgICAgICAgICAweDBDM0UsIDB4MEM0NCwgMHgwQzQ2LCAweDBDNDgsIDB4MEM0QSwgMHgwQzRELCAweDBDNTUsIDB4MEM1NiwKLSAgICAgICAgICAgICAgICAweDBDODIsIDB4MEM4MywgMHgwQ0JFLCAweDBDQzQsIDB4MENDNiwgMHgwQ0M4LCAweDBDQ0EsIDB4MENDRCwKLSAgICAgICAgICAgICAgICAweDBDRDUsIDB4MENENiwgMHgwRDAyLCAweDBEMDMsIDB4MEQzRSwgMHgwRDQzLCAweDBENDYsIDB4MEQ0OCwKLSAgICAgICAgICAgICAgICAweDBENEEsIDB4MEQ0RCwgMHgwRTM0LCAweDBFM0EsIDB4MEU0NywgMHgwRTRFLCAweDBFQjQsIDB4MEVCOSwKLSAgICAgICAgICAgICAgICAweDBFQkIsIDB4MEVCQywgMHgwRUM4LCAweDBFQ0QsIDB4MEYxOCwgMHgwRjE5LCAweDBGNzEsIDB4MEY4NCwKLSAgICAgICAgICAgICAgICAweDBGODYsIDB4MEY4QiwgMHgwRjkwLCAweDBGOTUsIDB4MEY5OSwgMHgwRkFELCAweDBGQjEsIDB4MEZCNywKLSAgICAgICAgICAgICAgICAweDIwRDAsIDB4MjBEQywgMHgzMDJBLCAweDMwMkYsCi0gICAgICAgIH07Ci0KLSAgICAgICAgaW50IGNvbWJpbmluZ0NoYXJDaGFyW10gPSB7Ci0gICAgICAgICAgICAgICAgMHgwNUJGLCAweDA1QzQsIDB4MDY3MCwgMHgwOTNDLCAweDA5NEQsIDB4MDlCQywgMHgwOUJFLCAweDA5QkYsCi0gICAgICAgICAgICAgICAgMHgwOUQ3LCAweDBBMDIsIDB4MEEzQywgMHgwQTNFLCAweDBBM0YsIDB4MEFCQywgMHgwQjNDLCAweDBCRDcsCi0gICAgICAgICAgICAgICAgMHgwRDU3LCAweDBFMzEsIDB4MEVCMSwgMHgwRjM1LCAweDBGMzcsIDB4MEYzOSwgMHgwRjNFLCAweDBGM0YsCi0gICAgICAgICAgICAgICAgMHgwRjk3LCAweDBGQjksIDB4MjBFMSwgMHgzMDk5LCAweDMwOUEsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gWzg4XSBEaWdpdCA6Oj0gLi4uCi0gICAgICAgIC8vCi0KLSAgICAgICAgaW50IGRpZ2l0UmFuZ2VbXSA9IHsKLSAgICAgICAgICAgICAgICAweDAwMzAsIDB4MDAzOSwgMHgwNjYwLCAweDA2NjksIDB4MDZGMCwgMHgwNkY5LCAweDA5NjYsIDB4MDk2RiwKLSAgICAgICAgICAgICAgICAweDA5RTYsIDB4MDlFRiwgMHgwQTY2LCAweDBBNkYsIDB4MEFFNiwgMHgwQUVGLCAweDBCNjYsIDB4MEI2RiwKLSAgICAgICAgICAgICAgICAweDBCRTcsIDB4MEJFRiwgMHgwQzY2LCAweDBDNkYsIDB4MENFNiwgMHgwQ0VGLCAweDBENjYsIDB4MEQ2RiwKLSAgICAgICAgICAgICAgICAweDBFNTAsIDB4MEU1OSwgMHgwRUQwLCAweDBFRDksIDB4MEYyMCwgMHgwRjI5LAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFs4OV0gRXh0ZW5kZXIgOjo9IC4uLgotICAgICAgICAvLwotCi0gICAgICAgIGludCBleHRlbmRlclJhbmdlW10gPSB7Ci0gICAgICAgICAgICAgICAgMHgzMDMxLCAweDMwMzUsIDB4MzA5RCwgMHgzMDlFLCAweDMwRkMsIDB4MzBGRSwKLSAgICAgICAgfTsKLQotICAgICAgICBpbnQgZXh0ZW5kZXJDaGFyW10gPSB7Ci0gICAgICAgICAgICAgICAgMHgwMEI3LCAweDAyRDAsIDB4MDJEMSwgMHgwMzg3LCAweDA2NDAsIDB4MEU0NiwgMHgwRUM2LCAweDMwMDUsCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gU3BlY2lhbENoYXIgOjo9ICc8JywgJyYnLCAnXG4nLCAnXHInLCAnXScKLSAgICAgICAgLy8KLQotICAgICAgICBpbnQgc3BlY2lhbENoYXJbXSA9IHsKLSAgICAgICAgICAgICAgICAnPCcsICcmJywgJ1xuJywgJ1xyJywgJ10nLAotICAgICAgICB9OwotCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEluaXRpYWxpemUKLSAgICAgICAgLy8KLQotICAgICAgICAvLyBzZXQgdmFsaWQgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGNoYXJSYW5nZVtpXTsgaiA8PSBjaGFyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX1ZBTElEIHwgTUFTS19DT05URU5UOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWNpYWxDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tzcGVjaWFsQ2hhcltpXV0gPSAoYnl0ZSkgKENIQVJTW3NwZWNpYWxDaGFyW2ldXSAmIH5NQVNLX0NPTlRFTlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHNwYWNlIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGFjZUNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW3NwYWNlQ2hhcltpXV0gfD0gTUFTS19TUEFDRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBuYW1lIHN0YXJ0IGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lU3RhcnRDaGFyLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBDSEFSU1tuYW1lU3RhcnRDaGFyW2ldXSB8PSBNQVNLX05BTUVfU1RBUlQgfCBNQVNLX05BTUUgfAotICAgICAgICAgICAgICAgICAgICBNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV0dGVyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBsZXR0ZXJSYW5nZVtpXTsgaiA8PSBsZXR0ZXJSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfTkFNRV9TVEFSVCB8IE1BU0tfTkFNRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGV0dGVyQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbbGV0dGVyQ2hhcltpXV0gfD0gTUFTS19OQU1FX1NUQVJUIHwgTUFTS19OQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgTUFTS19OQ05BTUVfU1RBUlQgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCBuYW1lIGNoYXJhY3RlcnMKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbbmFtZUNoYXJbaV1dIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlnaXRSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGRpZ2l0UmFuZ2VbaV07IGogPD0gZGlnaXRSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tYmluaW5nQ2hhclJhbmdlLmxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gY29tYmluaW5nQ2hhclJhbmdlW2ldOyBqIDw9IGNvbWJpbmluZ0NoYXJSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfTkFNRSB8IE1BU0tfTkNOQU1FOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tYmluaW5nQ2hhckNoYXIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIENIQVJTW2NvbWJpbmluZ0NoYXJDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVyUmFuZ2UubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSBleHRlbmRlclJhbmdlW2ldOyBqIDw9IGV4dGVuZGVyUmFuZ2VbaSArIDFdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBDSEFSU1tqXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVyQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbZXh0ZW5kZXJDaGFyW2ldXSB8PSBNQVNLX05BTUUgfCBNQVNLX05DTkFNRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlbW92ZSAnOicgZnJvbSBhbGxvd2FibGUgTUFTS19OQ05BTUVfU1RBUlQgYW5kIE1BU0tfTkNOQU1FIGNoYXJzCi0gICAgICAgIENIQVJTWyc6J10gJj0gfihNQVNLX05DTkFNRV9TVEFSVCB8IE1BU0tfTkNOQU1FKTsKLQotICAgICAgICAvLyBzZXQgUHViaWQgY2hhcmFjdGVycwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmlkQ2hhci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQ0hBUlNbcHViaWRDaGFyW2ldXSB8PSBNQVNLX1BVQklEOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHViaWRSYW5nZS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IHB1YmlkUmFuZ2VbaV07IGogPD0gcHViaWRSYW5nZVtpICsgMV07IGorKykgewotICAgICAgICAgICAgICAgIENIQVJTW2pdIHw9IE1BU0tfUFVCSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0gLy8gPGNsaW5pdD4oKQotCi0gICAgLy8KLSAgICAvLyBQdWJsaWMgc3RhdGljIG1ldGhvZHMKLSAgICAvLwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3VwcGxlbWVudGFsIGNoYXJhY3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3VwcGxlbWVudGFsKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoYyA+PSAweDEwMDAwICYmIGMgPD0gMHgxMEZGRkYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSB0aGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbgotICAgICAqIHN1cnJvZ2F0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaCBUaGUgaGlnaCBzdXJyb2dhdGUuCi0gICAgICogQHBhcmFtIGwgVGhlIGxvdyBzdXJyb2dhdGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc3VwcGxlbWVudGFsKGNoYXIgaCwgY2hhciBsKSB7Ci0gICAgICAgIHJldHVybiAoaCAtIDB4RDgwMCkgKiAweDQwMCArIChsIC0gMHhEQzAwKSArIDB4MTAwMDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgc3VwcGxlbWVudGFsIGNoYXJhY3RlciB0byAic3BsaXQiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2hhciBoaWdoU3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoY2hhcikgKCgoYyAtIDB4MDAwMTAwMDApID4+IDEwKSArIDB4RDgwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG93IHN1cnJvZ2F0ZSBvZiBhIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBzdXBwbGVtZW50YWwgY2hhcmFjdGVyIHRvICJzcGxpdCIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjaGFyIGxvd1N1cnJvZ2F0ZShpbnQgYykgewotICAgICAgICByZXR1cm4gKGNoYXIpICgoKGMgLSAweDAwMDEwMDAwKSAmIDB4M0ZGKSArIDB4REMwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgYSBoaWdoIHN1cnJvZ2F0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGludCBjKSB7Ci0gICAgICAgIHJldHVybiAoMHhEODAwIDw9IGMgJiYgYyA8PSAweERCRkYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGEgbG93IHN1cnJvZ2F0ZQotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb3dTdXJyb2dhdGUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuICgweERDMDAgPD0gYyAmJiBjIDw9IDB4REZGRik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgdmFsaWQuIFRoaXMgbWV0aG9kCi0gICAgICogYWxzbyBjaGVja3MgdGhlIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIgcmFuZ2UgZnJvbSAweDEwMDAwIHRvIDB4MTBGRkZGLgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGUgcHJvZ3JhbSBjaG9vc2VzIHRvIGFwcGx5IHRoZSBtYXNrIGRpcmVjdGx5IHRvIHRoZQotICAgICAqIDxjb2RlPkNIQVJTPC9jb2RlPiBhcnJheSwgdGhlbiB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcKLSAgICAgKiB0aGUgc3Vycm9nYXRlIGNoYXJhY3RlciByYW5nZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1ZBTElEKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgICgweDEwMDAwIDw9IGMgJiYgYyA8PSAweDEwRkZGRik7Ci0gICAgfSAvLyBpc1ZhbGlkKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludmFsaWQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuICFpc1ZhbGlkKGMpOwotICAgIH0gLy8gaXNJbnZhbGlkKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNhbiBiZSBjb25zaWRlcmVkIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRlbnQoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIChjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX0NPTlRFTlQpICE9IDApIHx8Ci0gICAgICAgICAgICAgICAgKDB4MTAwMDAgPD0gYyAmJiBjIDw9IDB4MTBGRkZGKTsKLSAgICB9IC8vIGlzQ29udGVudChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBjYW4gYmUgY29uc2lkZXJlZCBtYXJrdXAuCi0gICAgICogTWFya3VwIGNoYXJhY3RlcnMgaW5jbHVkZSAnJmx0OycsICcmYW1wOycsIGFuZCAnJScuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hcmt1cChpbnQgYykgewotICAgICAgICByZXR1cm4gYyA9PSAnPCcgfHwgYyA9PSAnJicgfHwgYyA9PSAnJSc7Ci0gICAgfSAvLyBpc01hcmt1cChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHNwYWNlIGNoYXJhY3RlcgotICAgICAqIGFzIGRlZmluZWQgYnkgcHJvZHVjdGlvbiBbM10gaW4gdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3BhY2UoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfU1BBQ0UpICE9IDA7Ci0gICAgfSAvLyBpc1NwYWNlKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgY2hhcmFjdGVyCi0gICAgICogYXMgYW1kZW5kZWQgaW4gdGhlIFhNTCAxLjEgc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzWE1MMTFTcGFjZShpbnQgYykgewotICAgICAgICByZXR1cm4gKGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfU1BBQ0UpICE9IDApIHx8Ci0gICAgICAgICAgICAgICAgYyA9PSAweDg1IHx8IGMgPT0gMHgyMDI4OwotICAgIH0gLy8gaXNYTUwxMVNwYWNlKGludCk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIGEgdmFsaWQgbmFtZSBzdGFydAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzVdIGluIHRoZSBYTUwgMS4wCi0gICAgICogc3BlY2lmaWNhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjIFRoZSBjaGFyYWN0ZXIgdG8gY2hlY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmFtZVN0YXJ0KGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05BTUVfU1RBUlQpICE9IDA7Ci0gICAgfSAvLyBpc05hbWVTdGFydChpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIG5hbWUKLSAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs0XSBpbiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05hbWUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkFNRSkgIT0gMDsKLSAgICB9IC8vIGlzTmFtZShpbnQpOmJvb2xlYW4KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHZhbGlkIE5DTmFtZSBzdGFydAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzRdIGluIE5hbWVzcGFjZXMgaW4gWE1MCi0gICAgICogcmVjb21tZW5kYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05DTmFtZVN0YXJ0KGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX05DTkFNRV9TVEFSVCkgIT0gMDsKLSAgICB9IC8vIGlzTkNOYW1lU3RhcnQoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBOQ05hbWUKLSAgICAgKiBjaGFyYWN0ZXIgYXMgZGVmaW5lZCBieSBwcm9kdWN0aW9uIFs1XSBpbiBOYW1lc3BhY2VzIGluIFhNTAotICAgICAqIHJlY29tbWVuZGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGMgVGhlIGNoYXJhY3RlciB0byBjaGVjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOQ05hbWUoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPCAweDEwMDAwICYmIChDSEFSU1tjXSAmIE1BU0tfTkNOQU1FKSAhPSAwOwotICAgIH0gLy8gaXNOQ05hbWUoaW50KTpib29sZWFuCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB2YWxpZCBQdWJpZAotICAgICAqIGNoYXJhY3RlciBhcyBkZWZpbmVkIGJ5IHByb2R1Y3Rpb24gWzEzXSBpbiB0aGUgWE1MIDEuMAotICAgICAqIHNwZWNpZmljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyBUaGUgY2hhcmFjdGVyIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1B1YmlkKGludCBjKSB7Ci0gICAgICAgIHJldHVybiBjIDwgMHgxMDAwMCAmJiAoQ0hBUlNbY10gJiBNQVNLX1BVQklEKSAhPSAwOwotICAgIH0gLy8gaXNQdWJpZChpbnQpOmJvb2xlYW4KLQotICAgIC8qCi0gICAgICogWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIChOYW1lQ2hhcikqCi0gICAgICovCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgTmFtZSBhY2NvcmRpbmcgdG8gWzVdCi0gICAgICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHN0cmluZyB0byBjaGVjawotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciBjaCA9IG5hbWUuY2hhckF0KDApOwotICAgICAgICBpZiAoIWlzTmFtZVN0YXJ0KGNoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaCA9IG5hbWUuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKCFpc05hbWUoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gLy8gaXNWYWxpZE5hbWUoU3RyaW5nKTpib29sZWFuCi0KLQotICAgIC8qCi0gICAgICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYwotICAgICAqIFs0XSBOQ05hbWUgOjo9IChMZXR0ZXIgfCAnXycpIChOQ05hbWVDaGFyKSoKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs0XQotICAgICAqIGZyb20gdGhlIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIG5jTmFtZSBzdHJpbmcgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5DTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTkNOYW1lKFN0cmluZyBuY05hbWUpIHsKLSAgICAgICAgaWYgKG5jTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciBjaCA9IG5jTmFtZS5jaGFyQXQoMCk7Ci0gICAgICAgIGlmICghaXNOQ05hbWVTdGFydChjaCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG5jTmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaCA9IG5jTmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWlzTkNOYW1lKGNoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IC8vIGlzVmFsaWROQ05hbWUoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvKgotICAgICAqIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKwotICAgICAqLwotICAgIC8qKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5tdG9rZW4gYWNjb3JkaW5nIHRvIFs3XQotICAgICAqIGluIHRoZSBYTUwgMS4wIFJlY29tbWVuZGF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm10b2tlbiBzdHJpbmcgdG8gY2hlY2sKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5tdG9rZW4oU3RyaW5nIG5tdG9rZW4pIHsKLSAgICAgICAgaWYgKG5tdG9rZW4ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm10b2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGNoID0gbm10b2tlbi5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoISBpc05hbWUoY2gpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gLy8gaXNWYWxpZE5hbWUoU3RyaW5nKTpib29sZWFuCi0KLSAgICAvLyBlbmNvZGluZ3MKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5jb2RpbmcgbmFtZSBpcyBhIHZhbGlkIElBTkEgZW5jb2RpbmcuCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlcmUgaXMgYSBkZWNvZGVyIGF2YWlsYWJsZQotICAgICAqIGZvciB0aGlzIGVuY29kaW5nLCBvbmx5IHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIHZhbGlkIGZvciBhbgotICAgICAqIElBTkEgZW5jb2RpbmcgbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpYW5hRW5jb2RpbmcgVGhlIElBTkEgZW5jb2RpbmcgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZElBTkFFbmNvZGluZyhTdHJpbmcgaWFuYUVuY29kaW5nKSB7Ci0gICAgICAgIGlmIChpYW5hRW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGlhbmFFbmNvZGluZy5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gaWFuYUVuY29kaW5nLmNoYXJBdCgwKTsKLSAgICAgICAgICAgICAgICBpZiAoKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBpYW5hRW5jb2RpbmcuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjIDwgJ0EnIHx8IGMgPiAnWicpICYmIChjIDwgJ2EnIHx8IGMgPiAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgIT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAvLyBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyk6Ym9vbGVhbgotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmNvZGluZyBuYW1lIGlzIGEgdmFsaWQgSmF2YSBlbmNvZGluZy4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGVyZSBpcyBhIGRlY29kZXIgYXZhaWxhYmxlCi0gICAgICogZm9yIHRoaXMgZW5jb2RpbmcsIG9ubHkgdGhhdCB0aGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgZm9yIGFuCi0gICAgICogSmF2YSBlbmNvZGluZyBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFFbmNvZGluZyBUaGUgSmF2YSBlbmNvZGluZyBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSmF2YUVuY29kaW5nKFN0cmluZyBqYXZhRW5jb2RpbmcpIHsKLSAgICAgICAgaWYgKGphdmFFbmNvZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gamF2YUVuY29kaW5nLmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9IGphdmFFbmNvZGluZy5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYyA8ICdBJyB8fCBjID4gJ1onKSAmJiAoYyA8ICdhJyB8fCBjID4gJ3onKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjIDwgJzAnIHx8IGMgPiAnOScpICYmIGMgIT0gJy4nICYmIGMgIT0gJ18nICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAhPSAnLScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSAvLyBpc1ZhbGlkSUFOQUVuY29kaW5nKFN0cmluZyk6Ym9vbGVhbgotCi19IC8vIGNsYXNzIFhNTENoYXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTFByZXR0eVByaW50ZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTFByZXR0eVByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYzOTEwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YTUxQcmV0dHlQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLnV0aWxzLklPVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLkVycm9yTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBBbiBYTUwgcHJldHR5IHByaW50ZXIgYmFzZWQgb24geHNsIHN0eWxlc2hlZXRzCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxQcmV0dHlQcmludGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhYTUxQcmV0dHlQcmludGVyLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIFByZXR0eSBwcmludHMgY29udGVudHMgb2YgdGhlIHhtbCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJldHRpZnkoZmluYWwgRmlsZSBmaWxlKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBieXRlW10gYnl0ZUFycmF5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVBcnJheSA9IElPVXRpbHMuZ2V0U3RyZWFtQXNCeXRlQXJyYXkobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXkpOwotICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0KLSAgICAgICAgICAgIFNvdXJjZSBzdHlsZXNoZWV0U291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocHJldHR5UHJpbnRTdHlsZXNoZWV0LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIFNvdXJjZSB4bWxTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKGlucHV0U3RyZWFtKTsKLQotICAgICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBUZW1wbGF0ZXMgdGVtcGxhdGVzID0gdGYubmV3VGVtcGxhdGVzKHN0eWxlc2hlZXRTb3VyY2UpOwotICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0ZW1wbGF0ZXMubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldEVycm9yTGlzdGVuZXIobmV3IEVycm9yTGlzdGVuZXIoKXsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcHJldHR5IHByaW50IGZpbGUgIiArIGZpbGUsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXJyb3IoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcHJldHR5IHByaW50IGZpbGUgIiArIGZpbGUsIGV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBwcmV0dHkgcHJpbnQgZmlsZSAiICsgZmlsZSwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3V0cHV0U3RyZWFtKSk7Ci0KLSAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJldHR5IHByaW50ZWQgZmlsZSA6ICIgKyBmaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBwcmV0dHkgcHJpbnQgZmlsZSAiICsgZmlsZSwgdCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChieXRlQXJyYXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJ5dGVBcnJheSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwcmV0dHlQcmludFN0eWxlc2hlZXQgPQotICAgICAgICAgICAgICAgICAgICAgIjx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybScgdmVyc2lvbj0nMS4wJyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB4bWxuczp4YWxhbj0naHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHQnICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSd4YWxhbic+IiArCi0gICAgICAgICAgICAgICAgICAgICAiICA8eHNsOm91dHB1dCBtZXRob2Q9J3htbCcgaW5kZW50PSd5ZXMnIHhhbGFuOmluZGVudC1hbW91bnQ9JzQnLz4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgIDx4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9JyonLz4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Jy8nPiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+IiArCi0gICAgICAgICAgICAgICAgICAgICAiICA8L3hzbDp0ZW1wbGF0ZT4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J25vZGUoKSB8IEAqJz4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIDx4c2w6Y29weT4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSdub2RlKCkgfCBAKicvPiIgKwotICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgPC94c2w6Y29weT4iICsKLSAgICAgICAgICAgICAgICAgICAgICIgIDwveHNsOnRlbXBsYXRlPiIgKwotICAgICAgICAgICAgICAgICAgICAgIjwveHNsOnN0eWxlc2hlZXQ+IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmV0dGlmeShPTUVsZW1lbnQgd3NkbEVsZW1lbnQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgd3NkbEVsZW1lbnQuc2VyaWFsaXplKGJhb3MpOwotCi0gICAgICAgIFNvdXJjZSBzdHlsZXNoZWV0U291cmNlID0gbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocHJldHR5UHJpbnRTdHlsZXNoZWV0LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU291cmNlIHhtbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwotCi0gICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBUZW1wbGF0ZXMgdGVtcGxhdGVzID0gdGYubmV3VGVtcGxhdGVzKHN0eWxlc2hlZXRTb3VyY2UpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YTUxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg1NmYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hNTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxVdGlscyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY2hhckVuY29kaW5nID0gIklTTy04ODU5LTEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzYXhQYXJzZXJGYWN0b3J5UHJvcGVydHkgPQotICAgICAgICAgICAgImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBnZXRET01GYWN0b3J5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5OwotICAgIHByaXZhdGUgc3RhdGljIFN0YWNrIHNheFBhcnNlcnMgPSBuZXcgU3RhY2soKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbXB0eSA9ICIiOwotICAgIHByaXZhdGUgc3RhdGljIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW1wdHkuZ2V0Qnl0ZXMoKSk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBJbml0aWFsaXplIFNBWCBQYXJzZXIgZmFjdG9yeSBkZWZhdWx0cwotICAgICAgICBpbml0U0FYRmFjdG9yeShudWxsLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIFNBWCBwYXJzZXIgZmFjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5Q2xhc3NOYW1lIFRoZSAob3B0aW9uYWwpIGNsYXNzIG5hbWUgb2YgdGhlIGRlc2lyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IGltcGxlbWVudGF0aW9uLiBXaWxsIGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWQgdG8gdGhlIHN5c3RlbSBwcm9wZXJ0eQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIDxiPmphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk8L2I+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgYWxyZWFkeSBzZXQuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgSWYgPGNvZGU+bnVsbDwvY29kZT4sIGxlYXZlcyBjdXJyZW50IHNldHRpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbG9uZS4KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlQXdhcmUgICB0cnVlIGlmIHdlIHdhbnQgYSBuYW1lc3BhY2UtYXdhcmUgcGFyc2VyCi0gICAgICogQHBhcmFtIHZhbGlkYXRpbmcgICAgICAgdHJ1ZSBpZiB3ZSB3YW50IGEgdmFsaWRhdGluZyBwYXJzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFNBWEZhY3RvcnkoU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmFtZXNwYWNlQXdhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWRhdGluZykgewotICAgICAgICBpZiAoZmFjdG9yeUNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNheEZhY3RvcnkgPSAoU0FYUGFyc2VyRmFjdG9yeSkgTG9hZGVyLmxvYWRDbGFzcyhmYWN0b3J5Q2xhc3NOYW1lKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSBvbmx5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldCB0bwotICAgICAgICAgICAgICAgICAqIGF2b2lkIGNvcnJ1cHRpbmcgZW52aXJvbm1lbnRzIGluIHdoaWNoIEF4aXMgaXMgZW1iZWRkZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShzYXhQYXJzZXJGYWN0b3J5UHJvcGVydHkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHNheFBhcnNlckZhY3RvcnlQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNheEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2F4RmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShuYW1lc3BhY2VBd2FyZSk7Ci0gICAgICAgIHNheEZhY3Rvcnkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLQotICAgICAgICAvLyBEaXNjYXJkIGV4aXN0aW5nIHBhcnNlcnMKLSAgICAgICAgc2F4UGFyc2Vycy5jbGVhcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZ2V0RE9NRmFjdG9yeSgpIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmY7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL2xvZy5lcnJvcihNZXNzYWdlcy5nZXRNZXNzYWdlKCJleGNlcHRpb24wMCIpLCBlICk7Ci0gICAgICAgICAgICBkYmYgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoZGJmKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeVJlc2V0ID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBTQVggcGFyc2VyIGZvciByZXVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJzZXIgQSBTQVggcGFyc2VyIHRoYXQgaXMgYXZhaWxhYmxlIGZvciByZXVzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlU0FYUGFyc2VyKFNBWFBhcnNlciBwYXJzZXIpIHsKLSAgICAgICAgaWYgKCF0cnlSZXNldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9GcmVlIHVwIHBvc3NpYmxlIHJlZi4gaGVsZCBieSBwYXN0IGNvbnRlbnRoYW5kbGVyLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHhtbFJlYWRlcikgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoWE1MVXRpbHMuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgc2F4UGFyc2Vycy5wdXNoKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnlSZXNldCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChvcmcueG1sLnNheC5TQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdHJ5UmVzZXQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gZW1wdHkgbmV3IERvY3VtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIERvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBjb25zdHJ1Y3Rpb24gcHJvYmxlbXMgb2NjdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IG5ld0RvY3VtZW50KCkKLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3luY2hyb25pemVkIChkYmYpIHsKLSAgICAgICAgICAgIHJldHVybiBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBuZXcgRG9jdW1lbnQgcmVhZCBmcm9tIHRoZSBpbnB1dCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgRG9jdW1lbnQuCi0gICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlmIGNvbnN0cnVjdGlvbiBwcm9ibGVtcyBvY2N1cgotICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uICAgICAgICAgICAgICAgICBpZiB0aGUgZG9jdW1lbnQgaGFzIHhtbCBzYXggcHJvYmxlbXMKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICAgICAgaWYgaS9vIGV4Y2VwdGlvbnMgb2NjdXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERvY3VtZW50IG5ld0RvY3VtZW50KElucHV0U291cmNlIGlucCkKLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiOwotICAgICAgICBzeW5jaHJvbml6ZWQgKGRiZikgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAvLyBVbmRlciBzb21lIHBlY3VsaWFyIGNvbmRpdGlvbnMgKGNsYXNzbG9hZGVyIGlzc3VlcyksIGp1c3Qgc2NyYXAgdGhlIG9sZCBkYmYsIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgICAgICBkYmYgPSBnZXRET01GYWN0b3J5KCk7Ci0gICAgICAgICAgICAgICAgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IERlZmF1bHRFbnRpdHlSZXNvbHZlcigpKTsKLSAgICAgICAgZGIuc2V0RXJyb3JIYW5kbGVyKG5ldyBQYXJzZXJFcnJvckhhbmRsZXIoKSk7Ci0gICAgICAgIHJldHVybiAoZGIucGFyc2UoaW5wKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG5ldyBEb2N1bWVudCByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbQotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIERvY3VtZW50LgotICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpZiBjb25zdHJ1Y3Rpb24gcHJvYmxlbXMgb2NjdXIKLSAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgaWYgdGhlIGRvY3VtZW50IGhhcyB4bWwgc2F4IHByb2JsZW1zCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgIGlmIGkvbyBleGNlcHRpb25zIG9jY3VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBuZXdEb2N1bWVudChJbnB1dFN0cmVhbSBpbnApCi0gICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBYTUxVdGlscy5uZXdEb2N1bWVudChuZXcgSW5wdXRTb3VyY2UoaW5wKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIG5ldyBEb2N1bWVudCByZWFkIGZyb20gdGhlIGluZGljYXRlZCB1cmkKLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBEb2N1bWVudC4KLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgY29uc3RydWN0aW9uIHByb2JsZW1zIG9jY3VyCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICAgICAgICAgICAgICAgIGlmIHRoZSBkb2N1bWVudCBoYXMgeG1sIHNheCBwcm9ibGVtcwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgICAgICBpZiBpL28gZXhjZXB0aW9ucyBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoU3RyaW5nIHVyaSkKLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gY2FsbCB0aGUgYXV0aGVudGljYXRlZCB2ZXJzaW9uIGFzIHRoZXJlIG1pZ2h0IGJlIAotICAgICAgICAvLyB1c2VybmFtZS9wYXNzd29yZCBpbmZvIGVtYmVkZWQgaW4gdGhlIHVyaS4KLSAgICAgICAgcmV0dXJuIFhNTFV0aWxzLm5ld0RvY3VtZW50KHVyaSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBmcm9tIHRoZSBnaXZlbiBVUkkuIFVzZXMgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZAotICAgICAqIGlmIHRoZSBVUkkgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpICAgICAgdGhlIHJlc291cmNlIHRvIGdldAotICAgICAqIEBwYXJhbSB1c2VybmFtZSBiYXNpYyBhdXRoIHVzZXJuYW1lCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIGJhc2ljIGF1dGggcGFzc3dvcmQKLSAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgY29uc3RydWN0aW9uIHByb2JsZW1zIG9jY3VyCi0gICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICAgICAgICAgICAgICAgIGlmIHRoZSBkb2N1bWVudCBoYXMgeG1sIHNheCBwcm9ibGVtcwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgICAgICBpZiBpL28gZXhjZXB0aW9ucyBvY2N1cgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgbmV3RG9jdW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCi0gICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U291cmNlIGlucyA9IFhNTFV0aWxzLmdldElucHV0U291cmNlRnJvbVVSSSh1cmksIHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLm5ld0RvY3VtZW50KGlucyk7Ci0gICAgICAgIC8vIENsb3NlIHRoZSBTdHJlYW0KLSAgICAgICAgaWYgKGlucy5nZXRCeXRlU3RyZWFtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5zLmdldEJ5dGVTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGlucy5nZXRDaGFyYWN0ZXJTdHJlYW0oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnMuZ2V0Q2hhcmFjdGVyU3RyZWFtKCkuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyB1cmksIE5vZGUgZSkgewotICAgICAgICB3aGlsZSAoZSAhPSBudWxsICYmIChlLmdldE5vZGVUeXBlKCkgPT0gRWxlbWVudC5FTEVNRU5UX05PREUpKSB7Ci0gICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cnMgPSBlLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IG4rKykgewotICAgICAgICAgICAgICAgIEF0dHIgYSA9IChBdHRyKSBhdHRycy5pdGVtKG4pOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICAgICAgICAgIGlmICgobmFtZSA9IGEuZ2V0TmFtZSgpKS5zdGFydHNXaXRoKCJ4bWxuczoiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXROb2RlVmFsdWUoKS5lcXVhbHModXJpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoNik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZSA9IGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBOb2RlIGUpIHsKLSAgICAgICAgd2hpbGUgKGUgIT0gbnVsbCAmJiAoZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSkgewotICAgICAgICAgICAgQXR0ciBhdHRyID0KLSAgICAgICAgICAgICAgICAgICAgKChFbGVtZW50KSBlKS5nZXRBdHRyaWJ1dGVOb2RlTlMoQ29uc3RhbnRzLk5TX1VSSV9YTUxOUywgcHJlZml4KTsKLSAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZSA9IGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRTmFtZSB3aGVuIHBhc3NlZCBhIHN0cmluZyBsaWtlICJmb286YmFyIiBieSBtYXBwaW5nCi0gICAgICogdGhlICJmb28iIHByZWZpeCB0byBhIG5hbWVzcGFjZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgZ2l2ZW4gTm9kZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIFFOYW1lIGdlbmVyYXRlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRRTmFtZUZyb21TdHJpbmcoU3RyaW5nIHN0ciwgTm9kZSBlKSB7Ci0gICAgICAgIGlmIChzdHIgPT0gbnVsbCB8fCBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCc6Jyk7Ci0gICAgICAgIGlmIChpZHggPiAtMSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN0ci5zdWJzdHJpbmcoMCwgaWR4KTsKLSAgICAgICAgICAgIFN0cmluZyBucyA9IGdldE5hbWVzcGFjZShwcmVmaXgsIGUpOwotICAgICAgICAgICAgaWYgKG5zID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUobnMsIHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSgiIiwgc3RyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgZm9yIGEgcGFydGljdWxhciBRTmFtZSwgbWFwcGluZyBhIG5ldyBwcmVmaXgKLSAgICAgKiBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nRm9yUU5hbWUoUU5hbWUgcW5hbWUsIEVsZW1lbnQgZSkgewotICAgICAgICBTdHJpbmcgdXJpID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgodXJpLCBlKTsKLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IDE7Ci0gICAgICAgICAgICBwcmVmaXggPSAibnMiICsgaTsKLSAgICAgICAgICAgIHdoaWxlIChnZXROYW1lc3BhY2UocHJlZml4LCBlKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUyhDb25zdGFudHMuTlNfVVJJX1hNTE5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sbnM6IiArIHByZWZpeCwgdXJpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uY2F0aW5hdGVzIGFsbCB0aGUgdGV4dCBhbmQgY2RhdGEgbm9kZSBjaGlsZHJlbiBvZiB0aGlzIGVsZW0gYW5kIHJldHVybnMKLSAgICAgKiB0aGUgcmVzdWx0aW5nIHRleHQuCi0gICAgICogKGJ5IE1hdHQgRHVmdGxlcikKLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRFbCB0aGUgZWxlbWVudCB3aG9zZSBjZGF0YS90ZXh0IG5vZGUgdmFsdWVzIGFyZSB0bwotICAgICAqICAgICAgICAgICAgICAgICBiZSBjb21iaW5lZC4KLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNvbmNhdGluYXRlZCBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRDaGFyYWN0ZXJEYXRhKEVsZW1lbnQgcGFyZW50RWwpIHsKLSAgICAgICAgaWYgKHBhcmVudEVsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE5vZGUgdGVtcE5vZGUgPSBwYXJlbnRFbC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIENoYXJhY3RlckRhdGEgY2hhckRhdGE7Ci0KLSAgICAgICAgd2hpbGUgKHRlbXBOb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGVtcE5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJEYXRhID0gKENoYXJhY3RlckRhdGEpIHRlbXBOb2RlOwotICAgICAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKGNoYXJEYXRhLmdldERhdGEoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGVtcE5vZGUgPSB0ZW1wTm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcnNlckVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgcGFyc2UgZXhjZXB0aW9uIGRldGFpbHMKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnNlRXhjZXB0aW9uSW5mbyhTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBzeXN0ZW1JZCA9IHNwZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgICAgICAgaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9ICJudWxsIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAiVVJJPSIgKyBzeXN0ZW1JZCArCi0gICAgICAgICAgICAgICAgICAgICIgTGluZT0iICsgc3BlLmdldExpbmVOdW1iZXIoKSArCi0gICAgICAgICAgICAgICAgICAgICI6ICIgKyBzcGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdGFuZGFyZCBTQVggRXJyb3JIYW5kbGVyIG1ldGhvZHMuCi0gICAgICAgIC8vIFNlZSBTQVggZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLgotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJFcnJvcjogIiArIGdldFBhcnNlRXhjZXB0aW9uSW5mbyhzcGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhdGFsIEVycm9yOiAiICsgZ2V0UGFyc2VFeGNlcHRpb25JbmZvKHNwZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IHRvIGdldCB0aGUgYnl0ZXMgdXJpLgotICAgICAqIERvZXMgTk9UIGhhbmRsZSBhdXRoZW50aWNhdGVkIFVSTHMsCi0gICAgICogdXNlIGdldElucHV0U291cmNlRnJvbVVSSSh1cmksIHVzZXJuYW1lLCBwYXNzd29yZCkKLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgdGhlIHJlc291cmNlIHRvIGdldAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTb3VyY2UgZ2V0SW5wdXRTb3VyY2VGcm9tVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSB0byBnZXQgdGhlIGJ5dGVzIGF0IGEgcHJvdGVjdGVkIHVyaQotICAgICAqIDxwLz4KLSAgICAgKiBSZXRyaWV2ZXMgdGhlIFVSTCBpZiBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcmUgcHJvdmlkZWQuCi0gICAgICogVGhlIGphdmEubmV0LlVSTCBjbGFzcyBkb2VzIG5vdCBkbyBCYXNpYyBBdXRoZW50aWNhdGlvbiwgc28gd2UgaGF2ZSB0bwotICAgICAqIGRvIGl0IG1hbnVhbGx5IGluIHRoaXMgcm91dGluZS4KLSAgICAgKiA8cC8+Ci0gICAgICogSWYgbm8gdXNlcm5hbWUgaXMgcHJvdmlkZWQsIGNyZWF0ZXMgYW4gSW5wdXRTb3VyY2UgZnJvbSB0aGUgdXJpCi0gICAgICogYW5kIGxldHMgdGhlIElucHV0U291cmNlIGdvIGZldGNoIHRoZSBjb250ZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgICAgICB0aGUgcmVzb3VyY2UgdG8gZ2V0Ci0gICAgICogQHBhcmFtIHVzZXJuYW1lIGJhc2ljIGF1dGggdXNlcm5hbWUKLSAgICAgKiBAcGFyYW0gcGFzc3dvcmQgYmFzaWMgYXV0aCBwYXNzd29yZAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIElucHV0U291cmNlIGdldElucHV0U291cmNlRnJvbVVSSShTdHJpbmcgdXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgUHJvdG9jb2xFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBVUkwgd3NkbHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3c2RsdXJsID0gbmV3IFVSTCh1cmkpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gd2UgY2FuJ3QgcHJvY2VzcyBpdCwgaXQgbWlnaHQgYmUgYSAnc2ltcGxlJyBmb28ud3NkbAotICAgICAgICAgICAgLy8gbGV0IElucHV0U291cmNlIGRlYWwgd2l0aCBpdAotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbm8gYXV0aGVudGljYXRpb24sIGp1c3QgbGV0IElucHV0U291cmNlIGRlYWwgd2l0aCBpdAotICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCAmJiB3c2RsdXJsLmdldFVzZXJJbmZvKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhpcyBpcyBub3QgYW4gSFRUUHtTfSB1cmwsIGxldCBJbnB1dFNvdXJjZSBkZWFsIHdpdGggaXQKLSAgICAgICAgaWYgKCF3c2RsdXJsLmdldFByb3RvY29sKCkuc3RhcnRzV2l0aCgiaHR0cCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB3c2RsdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgIC8vIERvZXMgdGhpcyB3b3JrIGZvciBodHRwcz8/PwotICAgICAgICBpZiAoIShjb25uZWN0aW9uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pKSB7Ci0gICAgICAgICAgICAvLyBjYW4ndCBkbyBodHRwIHdpdGggdGhpcyBVUkwsIGxldCBJbnB1dFNvdXJjZSBkZWFsIHdpdGggaXQKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgfQotICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiB1Y29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbjsKLSAgICAgICAgU3RyaW5nIHVzZXJpbmZvID0gd3NkbHVybC5nZXRVc2VySW5mbygpOwotICAgICAgICB1Y29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKLSAgICAgICAgdWNvbm4uc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oZmFsc2UpOwotICAgICAgICB1Y29ubi5zZXREZWZhdWx0VXNlQ2FjaGVzKGZhbHNlKTsKLSAgICAgICAgdWNvbm4uc2V0RG9JbnB1dCh0cnVlKTsKLSAgICAgICAgdWNvbm4uc2V0RG9PdXRwdXQoZmFsc2UpOwotICAgICAgICB1Y29ubi5zZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cyh0cnVlKTsKLSAgICAgICAgdWNvbm4uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQotICAgICAgICAvLyB1c2VybmFtZS9wYXNzd29yZCBpbmZvIGluIHRoZSBVUkwgb3ZlcnJpZGVzIHBhc3NlZCBpbiB2YWx1ZXMgCi0gICAgICAgIFN0cmluZyBhdXRoID0gbnVsbDsKLSAgICAgICAgaWYgKHVzZXJpbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF1dGggPSB1c2VyaW5mbzsKLSAgICAgICAgfSBlbHNlIGlmICh1c2VybmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhdXRoID0gKHBhc3N3b3JkID09IG51bGwpID8gdXNlcm5hbWUgOiB1c2VybmFtZSArICI6IiArIHBhc3N3b3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF1dGggIT0gbnVsbCkgewotICAgICAgICAgICAgdWNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzaWMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRlbmNvZGUoYXV0aC5nZXRCeXRlcyhjaGFyRW5jb2RpbmcpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB1Y29ubi5jb25uZWN0KCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZSh1Y29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlNjRlbmNvZGUoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlKGJ5dGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElucHV0U291cmNlIGdldEVtcHR5SW5wdXRTb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoYmFpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBOb2RlIHdpdGggYSBnaXZlbiBRTmFtZWIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbm9kZSBwYXJlbnQgbm9kZQotICAgICAqIEBwYXJhbSBuYW1lIFFOYW1lIG9mIHRoZSBjaGlsZCB3ZSBuZWVkIHRvIGZpbmQKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgY2hpbGQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoTm9kZSBub2RlLCBRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhub2RlLmdldE5hbWVzcGFjZVVSSSgpKSAmJgotICAgICAgICAgICAgICAgIG5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKG5vZGUuZ2V0TG9jYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgfQotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgcmV0ID0gZmluZE5vZGUoY2hpbGRyZW4uaXRlbShpKSwgbmFtZSk7Ci0gICAgICAgICAgICBpZiAocmV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgRE9NIEVsZW1lbnQgaW50byBhIGZ1bGx5IGJ1aWx0IE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50IGRvbSBFbGVtZW50Ci0gICAgICogQHJldHVybiBPTUVsZW1lbnQKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IHRvT00oRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRvT00oZWxlbWVudCwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnQgRE9NIEVsZW1lbnQgaW50byBhIGZ1bGx5IGJ1aWx0IE9NRWxlbWVudAotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICogQHBhcmFtIGJ1aWxkQWxsIGlmIHRydWUsIGZ1bGwgT00gdHJlZSBpcyBpbW1lZGlhdGVseSBidWlsdC4gaWYgZmFsc2UsIGNhbGxlciBpcyByZXNwb25zaWJsZSAKLSAgICAgKiBmb3IgYnVpbGRpbmcgdGhlIHRyZWUgYW5kIGNsb3NpbmcgdGhlIHBhcnNlci4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCB0b09NKEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBidWlsZEFsbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZWxlbWVudCk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotCi0gICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB4Zm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0KLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IFN0QVhVdGlscwotICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotCi0gICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHJlYWRlcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Q2FjaGUodHJ1ZSk7Ci0gICAgICAgIGJ1aWxkZXIucmVsZWFzZVBhcnNlck9uQ2xvc2UodHJ1ZSk7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChidWlsZEFsbCkgewotICAgICAgICAgICAgb21FbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9tRWxlbWVudDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gT01FbGVtZW50IHRvIGEgRE9NIEVsZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEByZXR1cm4gUmV0dXJucyBFbGVtZW50LgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbGVtZW50IHRvRE9NKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGVsZW1lbnQuc2VyaWFsaXplKGJhb3MpOwotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICByZXR1cm4gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShiYWlzKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gaW5wdXRzdHJlYW0gdG8gYW4gT01Ob2RlCi0gICAgICogVGhlIHJldXJuZWQgT01Ob2RlIGlzIGZ1bGx5IGJ1aWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIGlucHV0U3RyZWFtCi0gICAgICogQHJldHVybiBPTU5vZGUKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NTm9kZSB0b09NKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRvT00oaW5wdXRTdHJlYW0sIHRydWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGdpdmVuIGlucHV0c3RyZWFtIHRvIGFuIE9NTm9kZQotICAgICAqIFRoZSByZXVybmVkIE9NTm9kZSBpcyBmdWxseSBidWlsdCBpZiBidWlsZEFsbCBpcyB0cnVlLgotICAgICAqIElmIGJ1aWxkQWxsIGlzIGZhbHNlLCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSBwYXJzZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLSAgICAgKiBAcGFyYW0gYnVpbGRBbGwKLSAgICAgKiBAcmV0dXJuIE9NTm9kZQotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT01Ob2RlIHRvT00oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGJvb2xlYW4gYnVpbGRBbGwpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzCi0gICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmFjLCB4bWxSZWFkZXIpOwotICAgICAgICBidWlsZGVyLnNldENhY2hlKHRydWUpOwotICAgICAgICBidWlsZGVyLnJlbGVhc2VQYXJzZXJPbkNsb3NlKHRydWUpOwotICAgICAgICBPTU5vZGUgb21Ob2RlID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChidWlsZEFsbCkgewotICAgICAgICAgICAgb21Ob2RlLmJ1aWxkKCk7Ci0gICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvbU5vZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYSBnaXZlbiBSZWFkZXIgdG8gYW4gT01Ob2RlLgotICAgICAqIFRoZSByZXVybmVkIE9NTm9kZSBpcyBmdWxseSBidWlsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NTm9kZSB0b09NKFJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdG9PTShyZWFkZXIsIHRydWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIGdpdmVuIFJlYWRlciB0byBhbiBPTU5vZGUuCi0gICAgICogVGhlIHJldXJuZWQgT01Ob2RlIGlzIGZ1bGx5IGJ1aWx0IGlmIGJ1aWxkQWxsIGlzIHRydWUuCi0gICAgICogSWYgYnVpbGRBbGwgaXMgZmFsc2UsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHBhcnNlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZWFkZXIKLSAgICAgKiBAcGFyYW0gYnVpbGRBbGwKLSAgICAgKiBAcmV0dXJuIE9NTm9kZQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPTU5vZGUgdG9PTShSZWFkZXIgcmVhZGVyLCBib29sZWFuIGJ1aWxkQWxsKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscwotICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1SZWFkZXIocmVhZGVyKTsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBTdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcihmYWMsIHhtbFJlYWRlcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Q2FjaGUodHJ1ZSk7Ci0gICAgICAgIGJ1aWxkZXIucmVsZWFzZVBhcnNlck9uQ2xvc2UodHJ1ZSk7Ci0gICAgICAgIE9NTm9kZSBvbU5vZGUgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGJ1aWxkQWxsKSB7Ci0gICAgICAgICAgICBvbU5vZGUuYnVpbGQoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9tTm9kZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YU0xUVGVtcGxhdGVQcm9jZXNzb3IuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hTTFRUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFhYWI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL1hTTFRUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlVSSVJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIFhTTFRUZW1wbGF0ZVByb2Nlc3NvciB7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYW4gWE1MIHN0cmVhbSB3aXRoIGFuIFhTTCBzdHJlYW0KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgICAgICAgIFN0cmVhbSB0byB3cml0ZSB0aGUgb3V0cHV0Ci0gICAgICogQHBhcmFtIHhtbFN0cmVhbSAgU291cmNlIFhNTCBzdHJlYW0KLSAgICAgKiBAcGFyYW0geHNsdFN0cmVhbSBTb3VyY2UgWFNMIHN0cmVhbQotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlKE91dHB1dFN0cmVhbSBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHhtbFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0geHNsdFN0cmVhbSkKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlIHhtbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeG1sU3RyZWFtKTsKLSAgICAgICAgU291cmNlIHhzbHRTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKHhzbHRTdHJlYW0pOwotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChvdXQpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLm5ld1RyYW5zZm9ybWVyKHhzbHRTb3VyY2UpOwotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCByZXN1bHQpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGFuIFhNTCBzdHJlYW0gd2l0aCBhbiBYU0wgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0ICAgICAgICAgU3RyZWFtIHRvIHdyaXRlIHRoZSBvdXRwdXQKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHBhcmFtIHRyYW5zZm9ybWVyCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcikKLSAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKLSAgICAgICAgU291cmNlIHhtbFNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZG9jKTsKLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQob3V0KTsKLSAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgcmVzdWx0KTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG91dAotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSB4c2x0U3RyZWFtCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHhzbHRTdHJlYW0pCi0gICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZSB4c2x0U291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2x0U3RyZWFtKTsKLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgIC5uZXdUcmFuc2Zvcm1lcih4c2x0U291cmNlKTsKLSAgICAgICAgcGFyc2Uob3V0LCBkb2N1bWVudCwgdHJhbnNmb3JtZXIpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG91dAotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSB4c2x0U3RyZWFtCi0gICAgICogQHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHhzbHRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSVJlc29sdmVyIGN1c3RvbVJlc29sdmVyKQotICAgICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciwgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBwYXJzZShvdXQsIGRvY3VtZW50LCB4c2x0U3RyZWFtLCBjdXN0b21SZXNvbHZlciwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBvdXQKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0geHNsdFN0cmVhbQotICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlKE91dHB1dFN0cmVhbSBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSB4c2x0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUklSZXNvbHZlciBjdXN0b21SZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwcmV0dHkpCi0gICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7Ci0gICAgICAgIFNvdXJjZSB4c2x0U291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2x0U3RyZWFtKTsKLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpZiAocHJldHR5KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyRmFjdG9yeS5zZXRBdHRyaWJ1dGUoImluZGVudC1udW1iZXIiLCBuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXN0b21SZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cmFuc2Zvcm1lckZhY3Rvcnkuc2V0VVJJUmVzb2x2ZXIoY3VzdG9tUmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkKLSAgICAgICAgICAgICAgICAubmV3VHJhbnNmb3JtZXIoeHNsdFNvdXJjZSk7Ci0gICAgICAgIGlmIChwcmV0dHkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW59aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyc2Uob3V0LCBkb2N1bWVudCwgdHJhbnNmb3JtZXIpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvWFNMVFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YU0xUVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmZTdlMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC9YU0xUVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0xUVXRpbHMgewotCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGFkZCBhbiBhdHRyaWJ1dGUgdG8gYSBnaXZlbiBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gQXR0cmliTmFtZQotICAgICAqIEBwYXJhbSBhdHRyaWJWYWx1ZQotICAgICAqIEBwYXJhbSBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEF0dHJpYnV0ZShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBBdHRyaWJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKEF0dHJpYk5hbWUpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0VmFsdWUoYXR0cmliVmFsdWUpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0RWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpOwotCi0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBhZGQgYW4gYXR0cmlidXRlIHRvIGEgZ2l2ZW4gZWxlbWVudAotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIGVsZW1lbnROYW1lCi0gICAgICogQHBhcmFtIHBhcmVudE5vZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBwYXJlbnROb2RlKSB7Ci0gICAgICAgIEVsZW1lbnQgZWx0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSk7Ci0gICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoZWx0KTsKLSAgICAgICAgcmV0dXJuIGVsdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvRGVmYXVsdFRocmVhZEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvRGVmYXVsdFRocmVhZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2Yjk3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL0RlZmF1bHRUaHJlYWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbC50aHJlYWRwb29sOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIFRocmVhZEZhY3RvcnkgaW1wbGVtZW50YXRpb24gdXNpbmcgamF2YS51dGlsLmNvbmN1cnJlbnQKLSAqIENyZWF0ZXMgdGhyZWFkcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHByZWZpeAotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLQotICAgIGZpbmFsIFRocmVhZEdyb3VwIGdyb3VwOwotICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnQ7Ci0gICAgZmluYWwgU3RyaW5nIG5hbWVQcmVmaXg7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdFRocmVhZEZhY3RvcnkoZmluYWwgVGhyZWFkR3JvdXAgZ3JvdXAsIGZpbmFsIFN0cmluZyBuYW1lUHJlZml4KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKLSAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwotICAgICAgICB0aGlzLm5hbWVQcmVmaXggPSBuYW1lUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQodGhpcy5uYW1lUHJlZml4KTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnLScpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXMuY291bnQuZ2V0QW5kSW5jcmVtZW50KCkpOwotICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoZ3JvdXAsIHJ1bm5hYmxlLCBidWZmZXIudG9TdHJpbmcoKSwgMCk7Ci0gICAgICAgIHQuc2V0RGFlbW9uKGZhbHNlKTsKLSAgICAgICAgdC5zZXRQcmlvcml0eShUaHJlYWQuTk9STV9QUklPUklUWSk7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvdGhyZWFkcG9vbC9UaHJlYWRGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1RocmVhZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwZmVjZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1RocmVhZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsLnRocmVhZHBvb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVGhyZWFkRmFjdG9yeSB7Ci0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShqYXZhLmxhbmcuUnVubmFibGUgcnVubmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvdGhyZWFkcG9vbC9UaHJlYWRQb29sLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1RocmVhZFBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2ZmM5OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1RocmVhZFBvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsLnRocmVhZHBvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogVGhpcyB0aGUgdGhyZWFkIHBvb2wgZm9yIGF4aXMyLiBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCBhIHNpbmdsZXRvbgotICogYWNyb3NzIGF4aXMyIGVuZ2luZS4gPGNvZGU+VGhyZWFkUG9vbDwvY29kZT4gaXMgYWNjZXB0cyA8Y29kZT5BeGlzV29ya2VyczwvY29kZT4gd2hpY2ggaGFzCi0gKiBydW4gbWV0aG9kIG9uIHRoZW0gYW5kIGV4ZWN1dGUgdGhpcyBtZXRob2QsIHVzaW5nIG9uZSBvZiB0aGUgdGhyZWFkcwotICogaW4gdGhlIHRocmVhZCBwb29sLgotICovCi1wdWJsaWMgY2xhc3MgVGhyZWFkUG9vbCBpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhUaHJlYWRQb29sLmNsYXNzKTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgU0xFRVBfSU5URVJWQUwgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2h1dERvd247Ci0gICAgcHJvdGVjdGVkIFRocmVhZFBvb2xFeGVjdXRvciBleGVjdXRvcjsKLQotICAgIC8vaW50ZWdlcnMgdGhhdCBkZWZpbmUgdGhlIHBvb2wgc2l6ZSwgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgc2V0LgotICAgIHByaXZhdGUgaW50IGNvcmVQb29sU2l6ZSA9IDU7Ci0gICAgcHJpdmF0ZSBpbnQgbWF4UG9vbFNpemUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotICAgIHB1YmxpYyBUaHJlYWRQb29sKCkgewotICAgICAgICBzZXRFeGVjdXRvcihjcmVhdGVEZWZhdWx0RXhlY3V0b3IoIkF4aXMyIFRhc2siLCBUaHJlYWQuTk9STV9QUklPUklUWSwgdHJ1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBUaHJlYWRQb29sKGludCBjb3JlUG9vbFNpemUsIGludCBtYXhQb29sU2l6ZSkgewotICAgICAgICB0aGlzLmNvcmVQb29sU2l6ZSA9IGNvcmVQb29sU2l6ZTsKLSAgICAgICAgdGhpcy5tYXhQb29sU2l6ZSA9IG1heFBvb2xTaXplOwotICAgICAgICBzZXRFeGVjdXRvcihjcmVhdGVEZWZhdWx0RXhlY3V0b3IoIkF4aXMyIFRhc2siLCBUaHJlYWQuTk9STV9QUklPUklUWSwgdHJ1ZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGVjdXRvciBnZXRFeGVjdXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dG9yKFRocmVhZFBvb2xFeGVjdXRvciBleGVjdXRvcikgewotICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSB3b3JrZXIpIHsKLSAgICAgICAgaWYgKHNodXREb3duKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0aHJlYWRwb29sc2h1dGRvd24iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSh3b3JrZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgZm9yY2VmdWwgc2h1dGRvd24gbWVjaGFuaXNtIGZvciB0aHJlYWQgcG9vbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb3JjZVNodXREb3duKCkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZm9yY2VTaHV0RG93biBjYWxsZWQuIFRocmVhZCB3b3JrZXJzIHdpbGwgYmUgc3RvcHBlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgc2h1dGRvd24gbWV0aG9kIGZvciB0aGUgdGhyZWFkIHBvb2wKLSAgICAgKiBUaGlzIHdpbGwgd2FpdCB0aWxsIGFsbCB0aGUgd29ya2VycyB0aGF0IGFyZSBhbHJlYWR5IGhhbmRlZCBvdmVyIHRvIHRoZQotICAgICAqIHRocmVhZCBwb29sIGdldCBleGVjdXRlZC4KLSAgICAgKgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzYWZlU2h1dERvd24oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBzaHV0RG93biA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBUaHJlYWRQb29sRXhlY3V0b3IgY3JlYXRlRGVmYXVsdEV4ZWN1dG9yKGZpbmFsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRhZW1vbikgewotICAgICAgICBUaHJlYWRQb29sRXhlY3V0b3IgcmM7Ci0gICAgICAgIGlmIChtYXhQb29sU2l6ZSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgICAgICAgcmMgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKGNvcmVQb29sU2l6ZSwgbWF4UG9vbFNpemUsIDEwLAotICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLCBuZXcgU3luY2hyb25vdXNRdWV1ZSgpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFRocmVhZEZhY3RvcnkobmFtZSwgZGFlbW9uLCBwcmlvcml0eSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmMgPSBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKGNvcmVQb29sU2l6ZSwgbWF4UG9vbFNpemUsIDEwLAotICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLCBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZSgpLAotICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdFRocmVhZEZhY3RvcnkobmFtZSwgZGFlbW9uLCBwcmlvcml0eSkpOwotICAgICAgICB9Ci0vLyBGSVhNRTogVGhpcyBBUEkgaXMgb25seSBpbiBKREsgMS42IC0gVXNlIHJlZmxlY3Rpb24/ICAgICAgICAKLS8vICAgICAgICByYy5hbGxvd0NvcmVUaHJlYWRUaW1lT3V0KHRydWUpOwotICAgICAgICByZXR1cm4gcmM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdFRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRhZW1vbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcHJpb3JpdHk7Ci0KLSAgICAgICAgcHVibGljIERlZmF1bHRUaHJlYWRGYWN0b3J5KFN0cmluZyBuYW1lLCBib29sZWFuIGRhZW1vbiwgaW50IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgdGhpcy5kYWVtb24gPSBkYWVtb247Ci0gICAgICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZCgKLSAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgICAgLy8gZG8gdGhlIGZvbGxvd2luZyBzZWN0aW9uIGFzIHByaXZpbGVnZWQKLSAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgd2lsbCB3b3JrIGV2ZW4gd2hlbiBqYXZhMiBzZWN1cml0eQotICAgICAgICAgICAgLy8gaGFzIGJlZW4gZW5hYmxlZAotICAgICAgICAgICAgVGhyZWFkIHJldHVyblRocmVhZCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVyblRocmVhZCA9IChUaHJlYWQpCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUaHJlYWQ+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQgbmV3VGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKHJ1bm5hYmxlLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGhyZWFkLnNldERhZW1vbihkYWVtb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaHJlYWQuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VGhyZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90ZTogaW5uZXIgY2xhc3MgY2FuJ3QgaGF2ZSBpdHMgb3duIHN0YXRpYyBsb2cgdmFyaWFibGUKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaHJlYWRQb29sRXhlY3V0b3IubmV3VGhyZWFkKCk6ICAgRXhjZXB0aW9uIGZyb20gQWNjZXNzQ29udHJvbGxlciBbIiArIGUuZ2V0Q2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lKCkgKyAiXSAgZm9yIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXR1cm5UaHJlYWQ7Ci0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL0hUVFBIZWFkZXJNZXNzYWdlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9IVFRQSGVhZGVyTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzM0ZjlkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL0hUVFBIZWFkZXJNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQSGVhZGVyTWVzc2FnZSB7Ci0KLSAgICAvLyBIb2xkcyB0aGUgUU5hbWUgb2YgdGhlIHR5cGUgYXR0cmlidXRlCi0gICAgcHJpdmF0ZSBRTmFtZSBxTmFtZTsKLQotICAgIC8vIEhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsKLSAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRxTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldHFOYW1lKFFOYW1lIHFOYW1lKSB7Ci0gICAgICAgIHRoaXMucU5hbWUgPSBxTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9TT0FQSGVhZGVyTWVzc2FnZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvU09BUEhlYWRlck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkNjU5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9TT0FQSGVhZGVyTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJNZXNzYWdlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMV9IRUFERVIgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMV9TT0FQLCAiaGVhZGVyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzEyX0hFQURFUiA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDEyX1NPQVAsICJoZWFkZXIiKTsKLQotICAgIHByaXZhdGUgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcnQgPSBudWxsOwotICAgIHByaXZhdGUgUU5hbWUgZWxlbWVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBRTmFtZSB0eXBlOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtdXN0VW5kZXJzdGFuZDsKLQotCi0gICAgcHVibGljIFNPQVBIZWFkZXJNZXNzYWdlKCkgewotICAgICAgICB0aGlzLnR5cGUgPSBTT0FQXzExX0hFQURFUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEhlYWRlck1lc3NhZ2UoUU5hbWUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShRTmFtZSBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZU5hbWUgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcGFydCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFydChTdHJpbmcgcGFydCkgewotICAgICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KFFOYW1lIGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZSgpIHsKLSAgICAgICAgcmV0dXJuIHVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIHVzZSkgewotICAgICAgICB0aGlzLnVzZSA9IHVzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlZCkgewotICAgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011c3RVbmRlcnN0YW5kKCkgewotICAgICAgICByZXR1cm4gbXVzdFVuZGVyc3RhbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TXVzdFVuZGVyc3RhbmQoYm9vbGVhbiBtdXN0VW5kZXJzdGFuZCkgewotICAgICAgICB0aGlzLm11c3RVbmRlcnN0YW5kID0gbXVzdFVuZGVyc3RhbmQ7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1NPQVBNb2R1bGVNZXNzYWdlLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9TT0FQTW9kdWxlTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhmZGY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1NPQVBNb2R1bGVNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotcHVibGljIGNsYXNzIFNPQVBNb2R1bGVNZXNzYWdlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHVyaTsKLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyB1cmkpIHsKLSAgICAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETENvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzczNzc2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL1dTRExDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETENvbnN0YW50cyB7Ci0KLSAgICBTdHJpbmcgV1NETF8xXzFfU1RZTEUgPSAic3R5bGUiOwotCi0gICAgU3RyaW5nIFNUWUxFX1JQQyA9ICJycGMiOwotICAgIFN0cmluZyBTVFlMRV9ET0MgPSAiZG9jdW1lbnQiOwotICAgIFN0cmluZyBTVFlMRV9NU0cgPSAibXNnIjsKLQotICAgIFN0cmluZyBXU0RMXzRfSl9ERUZJTklUSU9OID0gIndzZGw0akRlZmluaXRpb24iOwotICAgIFN0cmluZyBXU0RMXzIwX0RFU0NSSVBUSU9OID0gIldTREwyMERlc2NyaXB0aW9uIjsKLSAgICAvKioKLSAgICAgKiBGaWVsZCBXU0RMMl8wX05BTUVTUEFDRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTREwyXzBfTkFNRVNQQUNFID0gQ29uc3RhbnRzLk5TX1VSSV9XU0RMMjA7Ci0KLSAgICAvKioKLSAgICAgKiBGaWVsZCBXU0RMMV8xX05BTUVTUEFDRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTREwxXzFfTkFNRVNQQUNFID0gQ29uc3RhbnRzLk5TX1VSSV9XU0RMMTE7Ci0KLQotICAgIC8qKgotICAgICAqIEZpZWxkIFdTRExfTUVTU0FHRV9ESVJFQ1RJT05fSU4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfRElSRUNUSU9OX0lOID0gImluIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTUVTU0FHRV9JTl9NRVNTQUdFID0gImluTWVzc2FnZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX01FU1NBR0VfT1VUX01FU1NBR0UgPSAib3V0TWVzc2FnZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0hFQURFUiA9ICJzb2FwX2hlYWRlciI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUiA9ICJodHRwX2hlYWRlciI7Ci0KLQotICAgIC8qKgotICAgICAqIEZpZWxkIFdTRExfTUVTU0FHRV9ESVJFQ1RJT05fT1VUCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9NRVNTQUdFX0RJUkVDVElPTl9PVVQgPSAib3V0IjsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8vLy8vLy8vLy8vLy8vLyBNZXNzYWdlIExhYmVscy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLyoqCi0gICAgICogQ29uc3RhbnQgdG8gcmVwcmVzZW50IHRoZSBtZXNzYWdlIGxhYmVsICJJbiIgd2hpY2ggaXMgdXNlZCBieSB0aGUKLSAgICAgKiBmb2xsb3dpbmcgV1NETCAyLjAgZGVmaW5lZCBNRVBzOiBJbi1Pbmx5LCBSb2J1c3QgSW4tT25seSwgSW4tT3V0LAotICAgICAqIEluLU9wdGlvbmFsLU91dCwgT3V0LUluLCBPdXQtT3B0aW9uYWwtSW4uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1FU1NBR0VfTEFCRUxfSU4gPSAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSA9ICJJbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9MQUJFTF9GQVVMVF9WQUxVRSA9ICJGYXVsdCI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdGFudCB0byByZXByZXNlbnQgdGhlIG1lc3NhZ2UgbGFiZWwgIk91dCIgd2hpY2ggaXMgdXNlZCBieSB0aGUKLSAgICAgKiBmb2xsb3dpbmcgV1NETCAyLjAgZGVmaW5lZCBNRVBzOiBJbi1PdXQsIEluLU9wdGlvbmFsLU91dCwgT3V0LU9ubHksCi0gICAgICogUm9idXN0IE91dC1Pbmx5LCBPdXQtSW4sIE91dC1PcHRpb25hbC1Jbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0xBQkVMX09VVCA9IDE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0xBQkVMX09VVF9WQUxVRSA9ICJPdXQiOwotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX1VTRV9MSVRFUkFMID0gImxpdGVyYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVVNFX0VOQ09ERUQgPSAiZW5jb2RlZCI7Ci0KLQotICAgIGludCBXU0RMXzFfMSA9IDE7Ci0gICAgaW50IFdTRExfMl8wID0gMjsKLSAgICBTdHJpbmcgSU5QVVRfUEFSVF9RTkFNRV9TVUZGSVggPSAiX2lucHV0IjsKLSAgICBTdHJpbmcgT1VUUFVUX1BBUlRfUU5BTUVfU1VGRklYID0gIl9vdXRwdXQiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBXU0RMMTFDb25zdGFudHMgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgVHlwZSBuYW1lIGZvciB0aGUgU09BUCBBZGRyZXNzIGRlZmluZWQgaW4gdGhlIFBvcnQvRW5kcG9pbnQKLSAgICAgICAgICovCi0gICAgICAgIFFOYW1lIFNPQVBfMTFfQUREUkVTUyA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMV9TT0FQLCAiYWRkcmVzcyIpOwotICAgICAgICBRTmFtZSBTT0FQXzEyX0FERFJFU1MgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTJfU09BUCwgImFkZHJlc3MiKTsKLSAgICAgICAgUU5hbWUgU09BUF8xMV9PUEVSQVRJT04gPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTFfU09BUCwgIm9wZXJhdGlvbiIpOwotICAgICAgICBRTmFtZSBTT0FQXzEyX09QRVJBVElPTiA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1dTREwxMl9TT0FQLCAib3BlcmF0aW9uIik7Ci0gICAgICAgIFFOYW1lIFNDSEVNQSA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNjaGVtYSIpOwotICAgICAgICBRTmFtZSBTT0FQXzExX0JPRFkgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTFfU09BUCwgImJvZHkiKTsKLSAgICAgICAgUU5hbWUgU09BUF8xMl9CT0RZID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDEyX1NPQVAsICJib2R5Iik7Ci0gICAgICAgIFFOYW1lIFNPQVBfMTFfSEVBREVSID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDExX1NPQVAsICJoZWFkZXIiKTsKLSAgICAgICAgUU5hbWUgU09BUF8xMl9IRUFERVIgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTJfU09BUCwgImhlYWRlciIpOwotICAgICAgICBRTmFtZSBTT0FQXzExX0JJTkRJTkcgPSBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVSSV9XU0RMMTFfU09BUCwgImJpbmRpbmciKTsKLSAgICAgICAgUU5hbWUgU09BUF8xMl9CSU5ESU5HID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfV1NETDEyX1NPQVAsICJiaW5kaW5nIik7Ci0gICAgICAgIFFOYW1lIFBPTElDWSA9IG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVVJJX1BPTElDWSwgIlBvbGljeSIpOwotICAgICAgICBRTmFtZSBQT0xJQ1lfUkVGRVJFTkNFID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VUklfUE9MSUNZLCAiUG9saWN5UmVmZXJlbmNlIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVQX0NPTlNUQU5UX09VVF9JTiA9IDE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FUF9DT05TVEFOVF9PVVRfT05MWSA9IDE0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FUF9DT05TVEFOVF9JTl9PTkxZID0gMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVQX0NPTlNUQU5UX1JPQlVTVF9JTl9PTkxZID0gMTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVQX0NPTlNUQU5UX0lOX09VVCA9IDEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FUF9DT05TVEFOVF9JTl9PUFRJT05BTF9PVVQgPSAxMzsKLSAgICBpbnQgTUVQX0NPTlNUQU5UX09VVF9PUFRJT05BTF9JTiA9IDE3OwotICAgIGludCBNRVBfQ09OU1RBTlRfSU5WQUxJRCA9IC0xOwotICAgIGludCBNRVBfQ09OU1RBTlRfUk9CVVNUX09VVF9PTkxZID0gMTU7Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFdTREwyMF8yMDA2Q29uc3RhbnRzIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI2luLW9ubHkKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX0lOX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9ubHkiOwotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI3JvYnVzdC1pbi1vbmx5Ci0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfUk9CVVNUX0lOX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL3JvYnVzdC1pbi1vbmx5IjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvQ1Itd3NkbDIwLWFkanVuY3RzLTIwMDYwMzI3LyNpbi1vdXQKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfSU5fT1VUID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiOwotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI2luLW9wdC1vdXQKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VUCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfSU5fT1BUSU9OQUxfT1VUID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vcHQtb3V0IjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvQ1Itd3NkbDIwLWFkanVuY3RzLTIwMDYwMzI3LyNvdXQtb25seQotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9vdXQtb25seSI7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA2L0NSLXdzZGwyMC1hZGp1bmN0cy0yMDA2MDMyNy8jcm9idXN0LW91dC1vbmx5Ci0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9PVVRfT05MWQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX1JPQlVTVF9PVVRfT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvcm9idXN0LW91dC1vbmx5IjsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDYvQ1Itd3NkbDIwLWFkanVuY3RzLTIwMDYwMzI3LyNvdXQtaW4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX0lOID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9vdXQtaW4iOwotICAgICAgICAvKioKLSAgICAgICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNi9DUi13c2RsMjAtYWRqdW5jdHMtMjAwNjAzMjcvI291dC1vcHQtaW4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX09QVElPTkFMX0lOID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9vdXQtb3B0LWluIjsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFdTREwyMF8yMDA0X0NvbnN0YW50cyB7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9JTl9PTkxZID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfUk9CVVNUX0lOX09OTFkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9ST0JVU1RfSU5fT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvcm9idXN0LWluLW9ubHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQKLSAgICAgICAgICovCi0KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX0lOX09VVCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VUCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfSU5fT1BUSU9OQUxfT1VUID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vcHQtb3V0IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09OTFkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9PVVRfT05MWSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvb3V0LW9ubHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2UgdXNlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL3JvYnVzdC1vdXQtb25seSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBNRVBfVVJJX09VVF9JTiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvb3V0LWluIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIE1FUF9VUklfT1VUX09QVElPTkFMX0lOID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9vdXQtb3B0LWluIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMVXRpbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvV1NETFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlMTMyNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC9XU0RMVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBTb21lIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIFdTREwgdXNlcnMKLSAqLwotcHVibGljIGNsYXNzIFdTRExVdGlsIHsKLQotICAgIC8qKgotICAgICAqIHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbWVwIHVyaSBpcyBvbmUgb2YgdGhlCi0gICAgICogaW5wdXQgbWVwcwotICAgICAqCi0gICAgICogQHBhcmFtIG1lcAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lucHV0UHJlc2VudEZvck1FUChTdHJpbmcgbWVwKSB7Ci0gICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1BUSU9OQUxfT1VULmVxdWFscyhtZXApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZLmVxdWFscyhtZXApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQuZXF1YWxzKG1lcCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX09VVF9JTi5lcXVhbHMobWVwKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhtZXApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfSU5fT05MWS5lcXVhbHMobWVwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiByZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG1lcCBVUkkgaXMgb25lIG9mIHRoZSBvdXRwdXQgbWVwcwotICAgICAqCi0gICAgICogQHBhcmFtIE1FUAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc091dHB1dFByZXNlbnRGb3JNRVAoU3RyaW5nIE1FUCkgewotICAgICAgICByZXR1cm4gV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PUFRJT05BTF9PVVQuZXF1YWxzKE1FUCkgfHwKLSAgICAgICAgICAgICAgICBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09VVC5lcXVhbHMoTUVQKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX0lOLmVxdWFscyhNRVApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWS5lcXVhbHMoTUVQKSB8fAotICAgICAgICAgICAgICAgIFdTREwyQ29uc3RhbnRzLk1FUF9VUklfT1VUX09QVElPTkFMX0lOLmVxdWFscyhNRVApIHx8Ci0gICAgICAgICAgICAgICAgV1NETDJDb25zdGFudHMuTUVQX1VSSV9ST0JVU1RfT1VUX09OTFkuZXF1YWxzKE1FUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFydCBuYW1lcyBhcmUgbm90IHVuaXF1ZSBhY3Jvc3MgbWVzc2FnZXMuIEhlbmNlCi0gICAgICogd2UgbmVlZCBzb21lIHdheSBvZiBtYWtpbmcgdGhlIHBhcnQgbmFtZSBhIHVuaXF1ZQotICAgICAqIG9uZSAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGUgbWFwcGVyCi0gICAgICogaXMgYSBnbG9iYWwgbGlzdCBvZiB0eXBlcykuCi0gICAgICogVGhlIHNlZW1pbmdseSBiZXN0IHdheSB0byBkbyB0aGF0IGlzIHRvCi0gICAgICogc3BlY2lmeSBhIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQgUU5hbWUgcmVmZXJlbmNlIHdoaWNoCi0gICAgICogaXMgc3RvcmVkIGluIHRoZSAgbGlzdC4gVGhpcyBwYXJ0IHFuYW1lIGlzCi0gICAgICogdGVtcG9yYXJ5IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBpdCdzCi0gICAgICogbmFtZXNwYWNlIFVSSSAod2hpY2ggaGFwcGVuZWQgdG8gYmUgdGhlIG9wZXJhdGlvbiBuYW1lKQotICAgICAqIHdpdGggX2lucHV0IChvciBhIHNpbWlsYXIgc3VmZml4KSBhdHRhY2hlZCB0byBpdAotICAgICAqCi0gICAgICogQHBhcmFtIG9wTmFtZQotICAgICAqIEBwYXJhbSBzdWZmaXgKLSAgICAgKiBAcGFyYW0gcGFydE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFBhcnRRTmFtZShTdHJpbmcgb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUob3BOYW1lICsgc3VmZml4LCBwYXJ0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29uc3RhbnRGcm9tSFRUUExvY2F0aW9uKFN0cmluZyBodHRwTG9jYXRpb24sIFN0cmluZyBodHRwTWV0aG9kKSB7Ci0gICAgICAgIGlmIChodHRwTG9jYXRpb24uY2hhckF0KDApICE9ICc/JykgewotICAgICAgICAgICAgaHR0cExvY2F0aW9uID0gIi8iICsgaHR0cExvY2F0aW9uOwotICAgICAgICB9Ci0gICAgICAgIGludCBpbmRleCA9IGh0dHBMb2NhdGlvbi5pbmRleE9mKCJ7Iik7Ci0gICAgICAgIGlmIChpbmRleCA+IC0xKSB7Ci0gICAgICAgICAgICBodHRwTG9jYXRpb24gPSBodHRwTG9jYXRpb24uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaHR0cE1ldGhvZCArIGh0dHBMb2NhdGlvbjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETDRKSW1wb3J0ZWRXU0RMSGVscGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTREw0SkltcG9ydGVkV1NETEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZjMWZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETDRKSW1wb3J0ZWRXU0RMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgV1NETDRKIGRlZmludGlvbiB3aGljaCBpbmNsdWRlcyBpbXBvcnRzLgotICogSXQgYWxsb3dzIHRoZSBpbXBvcnRzIHRvIGJlIHByb2Nlc3NlZCBpbnRvIGEgc2luZ2xlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgV1NETDRKSW1wb3J0ZWRXU0RMSGVscGVyIHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTREw0SkltcG9ydGVkV1NETEhlbHBlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1RyYWNlRW5hYmxlZCA9IGxvZy5pc1RyYWNlRW5hYmxlZCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGludGVudGlvbiBvZiB0aGlzIHByb2NlZHVyZSBpcyB0byBwcm9jZXNzIHRoZSBpbXBvcnRzLiBXaGVuCi0gICAgICogcHJvY2Vzc2luZyB0aGUgaW1wb3J0cyB0aGUgaW1wb3J0ZWQgZG9jdW1lbnRzIHdpbGwgYmUgcG9wdWxhdGluZyB0aGUKLSAgICAgKiBpdGVtcyBpbiB0aGUgbWFpbiBkb2N1bWVudCByZWN1cnNpdmxleQotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGw0SkRlZmluaXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0ltcG9ydHMoRGVmaW5pdGlvbiB3c2RsNEpEZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBwcm9jZXNzZWREb2N1bWVudHMpIHsKLQotICAgICAgICAgICAgTWFwIHdzZGxJbXBvcnRzID0gd3NkbDRKRGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsICE9IHdzZGxJbXBvcnRzICYmICF3c2RsSW1wb3J0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIGltcG9ydHNDb2xsZWN0aW9uID0gd3NkbEltcG9ydHMudmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGltcG9ydHNDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBWZWN0b3IgdmFsdWVzID0gKFZlY3RvcikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSAoSW1wb3J0KSB2YWx1ZXMuZWxlbWVudEF0KGkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3NkbEltcG9ydC5nZXREZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWYgPSB3c2RsSW1wb3J0LmdldERlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRlZERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBpbXBvcnRlZERlZi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBpbXBvcnRlZERlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHJlY3Vyc2l2ZSBpbXBvcnRzIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2VkRG9jdW1lbnRzLmNvbnRhaW5zKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWREb2N1bWVudHMuYWRkKGtleSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ltcG9ydHMoaW1wb3J0ZWREZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRG9jdW1lbnRzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gaW1wb3J0ZWREZWYuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBrZXlzID0gbmFtZXNwYWNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkyID0ga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdzZGw0SkRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1ZhbHVlKG5hbWVzcGFjZXMuZ2V0KGtleTIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLnB1dChrZXkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5nZXQoa2V5MikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDRKRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkucHV0QWxsKG5hbWVzcGFjZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHR5cGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzIHQgPSBpbXBvcnRlZERlZi5nZXRUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHR5cGVzTGlzdCA9IHQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGVzTGlzdC5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVzIHR5cGVzID0gd3NkbDRKRGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzID0gd3NkbDRKRGVmaW5pdGlvbi5jcmVhdGVUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNEpEZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKEV4dGVuc2liaWxpdHlFbGVtZW50KSB0eXBlc0xpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChqKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBtZXNzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbWVzc2FnZXNNYXAgPSBpbXBvcnRlZERlZi5nZXRNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNEpEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCkucHV0QWxsKG1lc3NhZ2VzTWFwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgcG9ydHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHBvcnR0eXBlTWFwID0gaW1wb3J0ZWREZWYuZ2V0UG9ydFR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkucHV0QWxsKHBvcnR0eXBlTWFwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYmluZGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGJpbmRpbmdNYXAgPSBpbXBvcnRlZERlZi5nZXRCaW5kaW5ncygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNEpEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkucHV0QWxsKGJpbmRpbmdNYXApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBzZXJ2aWNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2VydmljZU1hcCA9IGltcG9ydGVkRGVmLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0SkRlZmluaXRpb24uZ2V0U2VydmljZXMoKS5wdXRBbGwoc2VydmljZU1hcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBleHRFbGVtZW50TGlzdCA9IGltcG9ydGVkRGVmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsNEpEZWZpbml0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRFbGVtZW50TGlzdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExEZWZpbml0aW9uV3JhcHBlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMRGVmaW5pdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjYmI3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExEZWZpbml0aW9uV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLkZhdWx0Ow0KLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsNCi1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOw0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuUGFydDsNCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOw0KLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5Ow0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLQ0KLS8qKg0KLSAqIFRoZXJlIGFyZSBjYXNlcyB3aGVyZSBhIFdTREwgZGVmaW5pdGlvbiBpcyBrZXB0IGluIG1lbW9yeQ0KLSAqIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgYWNjZXNzZWQgZHVyaW5nIHJ1bnRpbWUuICBJbiBzaXR1YXRpb25zIHdoZXJlIA0KLSAqIHRoZXJlIGFyZSBsb3RzIG9mIFdTREwgZGVmaW5pdGlvbnMgb3IgYmlnIFdTRExzLCB0aGUgbWVtb3J5IGZvb3RwcmludCBjYW4gYmUgDQotICogaHVnZS4NCi0gKg0KLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBhIFdTREw0SiBkZWZpbml0aW9uDQotICogd2l0aCBhIGxvd2VyIG1lbW9yeSBmb290cHJpbnQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2VydGFpbg0KLSAqIGVudmlyb25tZW50cy4NCi0gKg0KLSAqIFRoaXMgY2xhc3MgbWFrZXMgdGhlIGRlY2lzaW9uIG9uIHdoaWNoIGltcGxlbWVudGF0aW9uIHRvIHVzZQ0KLSAqIHRvIHJlZHVjZSBtZW1vcnkgZm9vdHByaW50LiAgVGhpcyBhbGxvd3Mgb3RoZXIgaW1wbGVtZW50YXRpb25zDQotICogdG8gYmUgdXNlZCBmb3Igc3BlY2lmaWMgZW52aXJvbm1lbnRzIHdpdGhvdXQgYWRkaW5nIGxvdHMgb2YgZXh0cmENCi0gKiBvdmVyaGVhZCB0byBldmVyeSBlbnZpcm9ubWVudC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXU0RMRGVmaW5pdGlvbldyYXBwZXIgaW1wbGVtZW50cyBEZWZpbml0aW9uIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFdTRExEZWZpbml0aW9uV3JhcHBlci5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIldTRExEZWZpbml0aW9uV3JhcHBlciI7DQotDQotICAgIC8vIGphdmF4LndzZGwuRGVmaW5pdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlDQotICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjc4ODgwNzM3NTgxNDA5NzQwOUw7DQotDQotDQotICAgIC8vIHRoZSBzZXR0aW5nIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgaW4tbWVtb3J5IGNvcHkgb2YgdGhlIA0KLSAgICAvLyBXU0RMIGRlZmluaXRpb24gc2hvdWxkIGJlIG1hbmlwdWxhdGVkIHRvIHJlZHVjZSBtZW1vcnkgZm9vdHByaW50DQotICAgIHByaXZhdGUgYm9vbGVhbiByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgPSBmYWxzZTsNCi0NCi0gICAgLy8gdGhlIG9wdGlvbmFsIHNldHRpbmcgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHR5cGUgb2YgcmVkdWN0aW9uIHRvIHVzZQ0KLSAgICBwcml2YXRlIGludCByZWR1Y2VXU0RMTWVtb3J5VHlwZSA9IDA7DQotDQotICAgIC8vIHRoZSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZSANCi0gICAgcHJpdmF0ZSBXU0RMV3JhcHBlckltcGwgd3JhcHBlckltcGwgPSBudWxsOw0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gY29uc3RydWN0b3JzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAZGVwcmVjYXRlZCBiZWNhdXNlIHRoaXMgY29uc3RydWN0b3IgZG9lcyBub3QgcHJvdmlkZSBhbnkgZ3VpZGFuY2UgZm9yIA0KLSAgICAgKiBtZW1vcnkgdXNhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExEZWZpbml0aW9uV3JhcHBlcihEZWZpbml0aW9uKSBlbnRyeSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIG51bGwpOw0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGRlZg0KLSAgICAgKiBAcGFyYW0gbGltaXRNZW1vcnkgdHJ1ZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBtZW1vcnkgc2Vuc2l0aXZlIHdyYXBwZXINCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiwgYm9vbGVhbikgZW50cnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJlZHVjZVdTRExNZW1vcnlDYWNoZSAgPSBsaW1pdE1lbW9yeTsNCi0gICAgICAgIHJlZHVjZVdTRExNZW1vcnlUeXBlID0gbWVtb3J5VHlwZTsNCi0gICAgICAgIHByZXBhcmUoZGVmLCBudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIGRlZiBXRERMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIGF4aXNDb25maWcgQXhpcyBDb25maWd1cmF0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgV1NETERlZmluaXRpb25XcmFwcGVyKERlZmluaXRpb24gZGVmLEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbixBeGlzQ29uZmlndXJhdGlvbikgZW50cnkgIik7DQotICAgICAgICB9DQotICAgICAgICBzZXR1cE1lbW9yeVBhcm1zKGF4aXNDb25maWcpOw0KLSAgICAgICAgcHJlcGFyZShkZWYsIG51bGwpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCBmb3IgdGhlIHdzZGwNCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGEgY29uc3RydWN0b3Igd2l0aCBhIEF4aXNDb25maWd1cmF0aW9uIG9yIG1lbW9yeSBsaW1pdCBwYXJhbWV0ZXINCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbixVUkwpIGVudHJ5Iik7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgd1VSTCk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIGZvciB0aGUgd3NkbA0KLSAgICAgKiBAcGFyYW0gbGltaXRJbk1lbW9yeSAgVGhlIHNldHRpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbi1tZW1vcnkgV1NETCBjb3B5DQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgbWFuaXB1bGF0ZWQgdG8gcmVkdWNlIG1lbW9yeSBmb290cHJpbnQNCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMLCBib29sZWFuIGxpbWl0SW5NZW1vcnkpIHsNCi0gICAgICAgIHJlZHVjZVdTRExNZW1vcnlDYWNoZSA9IGxpbWl0SW5NZW1vcnk7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbixVUkwsYm9vbGVhbikgZW50cnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXBhcmUoZGVmLCB3VVJMKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIGZvciB0aGUgd3NkbA0KLSAgICAgKiBAcGFyYW0gbGltaXRJbk1lbW9yeSAgVGhlIHNldHRpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBpbi1tZW1vcnkgV1NETCBjb3B5DQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgbWFuaXB1bGF0ZWQgdG8gcmVkdWNlIG1lbW9yeSBmb290cHJpbnQNCi0gICAgICogQHBhcmFtIG1lbW9yeVR5cGUNCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMLCBib29sZWFuIGxpbWl0SW5NZW1vcnksIGludCBtZW1vcnlUeXBlKSB7DQotICAgICAgICByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgPSBsaW1pdEluTWVtb3J5Ow0KLSAgICAgICAgdGhpcy5yZWR1Y2VXU0RMTWVtb3J5VHlwZSA9IG1lbW9yeVR5cGU7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbixVUkwsYm9vbGVhbikgZW50cnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXBhcmUoZGVmLCB3VVJMKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgZm9yIHRoZSB3c2RsDQotICAgICAqIEBwYXJhbSBsaW1pdFR5cGUgIFRoZSBzZXR0aW5nIGluZGljYXRpbmcgd2hpY2ggcmVkdWN0aW9uIHRlY2huaXF1ZQ0KLSAgICAgKiAgICAgICAgICAgICAgICAgICB0byB1c2UgDQotICAgICAqLw0KLSAgICBwdWJsaWMgV1NETERlZmluaXRpb25XcmFwcGVyKERlZmluaXRpb24gZGVmLCBVUkwgd1VSTCwgaW50IGxpbWl0VHlwZSkgew0KLSAgICAgICAgcmVkdWNlV1NETE1lbW9yeUNhY2hlID0gdHJ1ZTsNCi0gICAgICAgIHJlZHVjZVdTRExNZW1vcnlUeXBlID0gbGltaXRUeXBlOw0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETERlZmluaXRpb25XcmFwcGVyKERlZmluaXRpb24sVVJMLGludCkgZW50cnkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHByZXBhcmUoZGVmLCB3VVJMKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgZm9yIHRoZSB3c2RsDQotICAgICAqIEBwYXJhbSBheGlzQ2ZnICBUaGUgQXhpc0NvbmZpZ3VyYXRpb24gb2JqZWN0LCB0byBiZSB1c2VkIHRvIGdldCBjb25maWd1cmF0aW9uIHNldHRpbmdzICANCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMLCBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ2ZnKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMRGVmaW5pdGlvbldyYXBwZXIoRGVmaW5pdGlvbixVUkwsQXhpc0NvbmZpZ3VyYXRpb24pIGVudHJ5Iik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBkZXRlcm1pbmUgd2hhdCB0aGUgc2V0dGluZyBmb3IgdGhlIG1lbW9yeSBvcHRpbWl6YXRpb24gaXMNCi0gICAgICAgIHNldHVwTWVtb3J5UGFybXMoYXhpc0NmZyk7DQotICAgICAgICBwcmVwYXJlKGRlZiwgd1VSTCk7DQotICAgIH0NCi0NCi0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwTWVtb3J5UGFybXMoIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDZmcpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoInNldHVwTWVtb3J5UGFybXMoQXhpc0NvbmZpZ3VyYXRpb24pIGVudHJ5Iik7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBkZXRlcm1pbmUgd2hhdCB0aGUgc2V0dGluZyBmb3IgdGhlIG1lbW9yeSBvcHRpbWl6YXRpb24gaXMNCi0gICAgICAgIGlmIChheGlzQ2ZnICE9IG51bGwpIHsNCi0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBheGlzQ2ZnLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfQ0FDSEUpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgPSANCi0gICAgICAgICAgICAgICAgcGFyYW0gIT0gbnVsbCAmJiAoKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKSkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOw0KLQ0KLQ0KLSAgICAgICAgICAgIHBhcmFtID0gYXhpc0NmZy5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uUkVEVUNFX1dTRExfTUVNT1JZX1RZUEUpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpOw0KLQ0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpID0gbmV3IEludGVnZXIodmFsdWUpOw0KLSAgICAgICAgICAgICAgICAgICAgcmVkdWNlV1NETE1lbW9yeVR5cGUgPSBpLmludFZhbHVlKCk7IA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJyZWR1Y2VXU0RMTWVtb3J5Q2FjaGU6IisgcmVkdWNlV1NETE1lbW9yeUNhY2hlICsgIiwgcmVkdWNlV1NETE1lbW9yeVR5cGU6IiArIHJlZHVjZVdTRExNZW1vcnlUeXBlICk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXhpc0NvbmZpZ3VyYXRpb24gaXMgbnVsbC4gIFRoaXMgaXMgdW5leHBlY3RlZCIgKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgd3NkbCBkZWZpbml0aW9uIHdyYXBwZXINCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREw0SiBkZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCB3aGVyZSB0aGUgV1NETCBpcyBvYnRhaW5lZA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmUoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSB7DQotICAgICAgICANCi0gICAgICAgIGlmIChyZWR1Y2VXU0RMTWVtb3J5Q2FjaGUpIHsNCi0NCi0gICAgICAgICAgICAvLyBpZiB0aGUgdHlwZSBpcyBzcGVjaWZpZWQsIHRoZW4gdXNlIGl0DQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBkZWZhdWx0IHRvIHRoZSBzZXJpYWxpemF0aW9uIHRlY2huaXF1ZQ0KLQ0KLSAgICAgICAgICAgIGlmIChyZWR1Y2VXU0RMTWVtb3J5VHlwZSA9PSAyKSB7DQotICAgICAgICAgICAgICAgIC8vIGEgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgcmVsZWFzZSAmIHJlbG9hZCBvbiB0aGUgDQotICAgICAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgV1NETDRKIG9iamVjdA0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIHdvdWxkIGJlIGRlc2lyYWJsZSBmb3IgdGhvc2UgZW52aXJvbm1lbnRzIHdoZXJlIA0KLSAgICAgICAgICAgICAgICAvLyBtYW55IG9mIHRoZSBXU0RMIGRlZmluaXRpb25zIGFyZSBub3Qgc2VyaWFsaXphYmxlIA0KLSAgICAgICAgICAgICAgICB3cmFwcGVySW1wbCA9IG5ldyBXU0RMV3JhcHBlclJlbG9hZEltcGwoZGVmLCB3VVJMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vIGEgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgc2VyaWFsaXphdGlvbiB0byBzYXZlIHRoZSAgDQotICAgICAgICAgICAgICAgIC8vIHVuZGVybHlpbmcgV1NETDRKIG9iamVjdA0KLSAgICAgICAgICAgICAgICB3cmFwcGVySW1wbCA9IG5ldyBXU0RMV3JhcHBlclNhdmVJbXBsKGRlZiwgd1VSTCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgLy8gYSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIHRoYXQgaXMganVzdCBhIHBhc3N0aHJvdWdoIHRvIHRoZSANCi0gICAgICAgICAgICAvLyB1bmRlcmx5aW5nIFdTREw0SiBvYmplY3QNCi0gICAgICAgICAgICB3cmFwcGVySW1wbCA9IG5ldyBXU0RMV3JhcHBlckJhc2ljSW1wbChkZWYsIHdVUkwpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgd3JhcHBlckltcGwucmVsZWFzZVJlc291cmNlcygpOw0KLSAgICB9DQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBwdWJsaWMgV1NETERlZmluaXRpb25XcmFwcGVyIG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIC8qDQotICAgICAqIFJldHVybnMgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFVud3JhcHBlZERlZmluaXRpb24oKSB7DQotDQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgaW50IGdldE1lbW9yeUxpbWl0VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZVdTRExNZW1vcnlUeXBlOw0KLSAgICB9DQotDQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmludGlvbiBpbnRlcmZhY2UgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRCYXNlVVJJKFN0cmluZyBkKSB7DQotICAgICAgICAvLyBTZXQgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCBmb3IgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBUaGlzIGlkZW50aWZpZXMgdGhlIG9yaWdpbiBvZiB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQsIG5vdCB0aGUgaW1wb3J0cy4NCi0NCi0gICAgICAgIHdyYXBwZXJJbXBsLnNldERvY3VtZW50QmFzZVVSSShkKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSSgpIHsNCi0gICAgICAgIC8vIEdldCB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50IGZvciB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgb3JpZ2luIG9mIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCwgbm90IHRoZSBpbXBvcnRzLg0KLQ0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldERvY3VtZW50QmFzZVVSSSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG4pIHsNCi0gICAgICAgIHdyYXBwZXJJbXBsLnNldFFOYW1lKG4pOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRRTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdCkgew0KLSAgICAgICAgd3JhcHBlckltcGwuc2V0VGFyZ2V0TmFtZXNwYWNlKHQpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5hZGROYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2VVUkkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5yZW1vdmVOYW1lc3BhY2UocHJlZml4KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0TmFtZXNwYWNlKHByZWZpeCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldFByZWZpeChuYW1lc3BhY2VVUkkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXROYW1lc3BhY2VzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhUeXBlcyB0eXBlcykgew0KLSAgICAgICAgd3JhcHBlckltcGwuc2V0VHlwZXModHlwZXMpOw0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyBUeXBlcyBnZXRUeXBlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRUeXBlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChJbXBvcnQgaW1wb3J0RGVmKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5hZGRJbXBvcnQoaW1wb3J0RGVmKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1wb3J0IHJlbW92ZUltcG9ydChJbXBvcnQgaW1wb3J0RGVmKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwucmVtb3ZlSW1wb3J0KGltcG9ydERlZik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0SW1wb3J0cyhuYW1lc3BhY2VVUkkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0SW1wb3J0cygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRJbXBvcnRzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsNCi0gICAgICAgIHdyYXBwZXJJbXBsLmFkZE1lc3NhZ2UobWVzc2FnZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZShRTmFtZSBuYW1lKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0TWVzc2FnZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSByZW1vdmVNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5yZW1vdmVNZXNzYWdlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TWVzc2FnZXMoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0TWVzc2FnZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgew0KLSAgICAgICAgd3JhcHBlckltcGwuYWRkQmluZGluZyhiaW5kaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRCaW5kaW5nKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIHJlbW92ZUJpbmRpbmcoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnJlbW92ZUJpbmRpbmcobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRCaW5kaW5ncygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRCaW5kaW5ncygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsQmluZGluZ3MoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0QWxsQmluZGluZ3MoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkgew0KLSAgICAgICAgd3JhcHBlckltcGwuYWRkUG9ydFR5cGUocG9ydFR5cGUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0UG9ydFR5cGUobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIHJlbW92ZVBvcnRUeXBlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5yZW1vdmVQb3J0VHlwZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFBvcnRUeXBlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRQb3J0VHlwZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbFBvcnRUeXBlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRBbGxQb3J0VHlwZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgew0KLSAgICAgICAgd3JhcHBlckltcGwuYWRkU2VydmljZShzZXJ2aWNlKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRTZXJ2aWNlKG5hbWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIHJlbW92ZVNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnJlbW92ZVNlcnZpY2UobmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRTZXJ2aWNlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5nZXRTZXJ2aWNlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsU2VydmljZXMoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0QWxsU2VydmljZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChvcmcudzNjLmRvbS5FbGVtZW50IGRvY0VsKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2NFbCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIG9yZy53M2MuZG9tLkVsZW1lbnQgZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSB7DQotICAgICAgICByZXR1cm4gIHdyYXBwZXJJbXBsLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCkgew0KLSAgICAgICAgd3JhcHBlckltcGwuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbWVudCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlQmluZGluZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZUJpbmRpbmdGYXVsdCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nSW5wdXQgY3JlYXRlQmluZGluZ0lucHV0KCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlQmluZGluZ091dHB1dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVGYXVsdCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgY3JlYXRlSW1wb3J0KCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZUltcG9ydCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVJbnB1dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlTWVzc2FnZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmNyZWF0ZU91dHB1dCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQYXJ0IGNyZWF0ZVBhcnQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlUGFydCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0IGNyZWF0ZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlUG9ydCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVQb3J0VHlwZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuY3JlYXRlU2VydmljZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBUeXBlcyBjcmVhdGVUeXBlcygpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5jcmVhdGVUeXBlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZykgew0KLSAgICAgICAgd3JhcHBlckltcGwuc2V0RXh0ZW5zaW9uUmVnaXN0cnkoZXh0UmVnKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIG90aGVyIEFic3RyYWN0V1NETEVsZW1lbnQgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IHJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIHJldHVybiB3cmFwcGVySW1wbC5yZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtZW50KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgcmV0dXJuIHdyYXBwZXJJbXBsLmdldEV4dGVuc2lvbkF0dHJpYnV0ZShuYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKSB7DQotICAgICAgICByZXR1cm4gd3JhcHBlckltcGwuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lLCBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICB3cmFwcGVySW1wbC5zZXRFeHRlbnNpb25BdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJCYXNpY0ltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJCYXNpY0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5YWMzMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVyQmFzaWNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLklucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5QYXJ0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7DQotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsNCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ow0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgV1NETDRKIGRlZmluaXRpb24NCi0gKiB3aXRoIGEgbG93ZXIgbWVtb3J5IGZvb3RwcmludC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluDQotICogZW52aXJvbm1lbnRzLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXU0RMV3JhcHBlckJhc2ljSW1wbCBpbXBsZW1lbnRzIFdTRExXcmFwcGVySW1wbCB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhXU0RMV3JhcHBlckJhc2ljSW1wbC5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIldTRExXcmFwcGVyQmFzaWNJbXBsIjsNCi0NCi0gICAgLy8gamF2YXgud3NkbC5EZWZpbml0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUNCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNzg4ODA3Mzc1ODE0MDk3NDA5TDsNCi0NCi0gICAgLy8gdGhlIHdzZGw0aiB3c2RsIGRlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICBwcml2YXRlIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBudWxsOw0KLQ0KLSAgICAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIGJhc2UgZG9jdW1lbnQgdXNlZCBpbiB0aGUgd3NkbDRqIGRlZmluaXRpb24NCi0gICAgcHJpdmF0ZSBVUkwgd3NkbFVSTCA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxFeHBsaWNpdFVSSSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxEb2N1bWVudEJhc2VVUkkgPSBudWxsOw0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gY29uc3RydWN0b3JzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICogDQotICAgICAqIEBwYXJhbSBkZWYgICAgVGhlIFdTREwgRGVmaW5pdGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExXcmFwcGVyQmFzaWNJbXBsKERlZmluaXRpb24gZGVmKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExXcmFwcGVyQmFzaWNJbXBsKERlZmluaXRpb24gZGVmKSBjYWxsZWQiKTsNCi0gICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLmNhbGxTdGFja1RvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIG51bGwpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCBmb3IgdGhlIHdzZGwNCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMV3JhcHBlckJhc2ljSW1wbChEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETFdyYXBwZXJCYXNpY0ltcGwoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSBjYWxsZWQiKTsNCi0gICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLmNhbGxTdGFja1RvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIHdVUkwpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBJbml0aWFsaXplIHRoZSB3c2RsIGRlZmluaXRpb24gd3JhcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETDRKIGRlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIHdoZXJlIHRoZSBXU0RMIGlzIG9idGFpbmVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZShEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucHJlcGFyZSgpIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gZGVmOw0KLSAgICAgICAgd3NkbFVSTCA9IHdVUkw7DQotICAgIH0NCi0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIHB1YmxpYyBXU0RMV3JhcHBlckltcGwgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgLyoNCi0gICAgICogUmVsZWFzZXMgb2JqZWN0cyB0byByZWR1Y2UgbWVtb3J5IGZvb3RwcmludC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSZXNvdXJjZXMoKSB7DQotICAgICAgICAvLyBwbGFjZWhvbGRlcg0KLSAgICB9DQotDQotDQotICAgIC8qDQotICAgICAqIFJldHVybnMgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFVud3JhcHBlZERlZmluaXRpb24oKSB7DQotICAgICAgICBEZWZpbml0aW9uIGRlZjsNCi0NCi0gICAgICAgIGlmICgod3NkbERlZmluaXRpb24gIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICAod3NkbERlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpKSB7DQotICAgICAgICAgICAgZGVmID0gKChXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHdzZGxEZWZpbml0aW9uKS5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRlZiA9IHdzZGxEZWZpbml0aW9uOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRlZjsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZCAgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvblRvV3JhcChEZWZpbml0aW9uIGQpIHsNCi0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gZDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb24oU3RyaW5nIHVyaUxvY2F0aW9uKSB7DQotICAgICAgICBpZiAodXJpTG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHdzZGxVUkwgPSBuZXcgVVJMKHVyaUxvY2F0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIHRvZG8NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIGZvciB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKSB7DQotICAgICAgICBpZiAod3NkbFVSTCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDbG9zZXMgdGhlIHVzZSBvZiB0aGUgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiBhbmQgYWxsb3dzIA0KLSAgICAgKiBpbnRlcm5hbCByZXNvdXJjZXMgdG8gYmUgcmVsZWFzZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gZm9yIHRoaXMgaW1wbGVtZW50YXRpb24NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gamF2YXgud3NkbC5EZWZpbnRpb24gaW50ZXJmYWNlIG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50QmFzZVVSSShTdHJpbmcgZCkgew0KLQ0KLSAgICAgICAgLy8gU2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50QmFzZVVSSSgiICsgZCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSSgpIHsNCi0NCi0gICAgICAgIC8vIEdldCB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50IGZvciB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgb3JpZ2luIG9mIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCwgbm90IHRoZSBpbXBvcnRzLg0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXREb2N1bWVudEJhc2VVUkkoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFFOYW1lKCIgKyBuICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0UU5hbWUobik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRRTmFtZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRRTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFRhcmdldE5hbWVzcGFjZSgiICsgdCArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZSh0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkTmFtZXNwYWNlKCIgKyBwcmVmaXggKyAiLCAiICsgbmFtZXNwYWNlVVJJICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZU5hbWVzcGFjZSgiICsgcHJlZml4ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXROYW1lc3BhY2UoIiArIHByZWZpeCArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0UHJlZml4KCIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hbWVzcGFjZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hdGl2ZUF0dHJpYnV0ZU5hbWVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE5hdGl2ZUF0dHJpYnV0ZU5hbWVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhUeXBlcyB0eXBlcykgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRUeXBlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsNCi0gICAgICAgIH0gDQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIFR5cGVzIGdldFR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUeXBlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkSW1wb3J0KCIgKyBpbXBvcnREZWYgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRJbXBvcnQoaW1wb3J0RGVmKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW1wb3J0IHJlbW92ZUltcG9ydChJbXBvcnQgaW1wb3J0RGVmKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZUltcG9ydCgiICsgaW1wb3J0RGVmICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZUltcG9ydChpbXBvcnREZWYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0SW1wb3J0cyhTdHJpbmcgbmFtZXNwYWNlVVJJKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEltcG9ydHMoIiArIG5hbWVzcGFjZVVSSSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKG5hbWVzcGFjZVVSSSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEltcG9ydHMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEltcG9ydHMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0SW1wb3J0cygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkTWVzc2FnZSgiICsgbWVzc2FnZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZE1lc3NhZ2UobWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE1lc3NhZ2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TWVzc2FnZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIHJlbW92ZU1lc3NhZ2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVNZXNzYWdlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZU1lc3NhZ2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldE1lc3NhZ2VzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRNZXNzYWdlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkQmluZGluZygiICsgYmluZGluZyArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZEJpbmRpbmcoYmluZGluZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZyhRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEJpbmRpbmcoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0QmluZGluZyhuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIHJlbW92ZUJpbmRpbmcoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVCaW5kaW5nKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZUJpbmRpbmcobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRCaW5kaW5ncygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxCaW5kaW5ncygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QWxsQmluZGluZ3MoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0QWxsQmluZGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZFBvcnRUeXBlKCIgKyBwb3J0VHlwZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZFBvcnRUeXBlKHBvcnRUeXBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgZ2V0UG9ydFR5cGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQb3J0VHlwZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSByZW1vdmVQb3J0VHlwZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZVBvcnRUeXBlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZVBvcnRUeXBlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRQb3J0VHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFBvcnRUeXBlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsUG9ydFR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxQb3J0VHlwZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0QWxsUG9ydFR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRTZXJ2aWNlKCIgKyBzZXJ2aWNlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0U2VydmljZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRTZXJ2aWNlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgcmVtb3ZlU2VydmljZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZVNlcnZpY2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlU2VydmljZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0U2VydmljZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFNlcnZpY2VzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbFNlcnZpY2VzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxTZXJ2aWNlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRBbGxTZXJ2aWNlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3JnLnczYy5kb20uRWxlbWVudCBkb2NFbCkgew0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uRWxlbWVudCBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIHsNCi0NCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gIHdzZGxEZWZpbml0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KCIgKyBleHRFbGVtZW50ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbWVudCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyBjcmVhdGVCaW5kaW5nKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nRmF1bHQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ0ZhdWx0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ0lucHV0IGNyZWF0ZUJpbmRpbmdJbnB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ0lucHV0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gY3JlYXRlQmluZGluZ09wZXJhdGlvbigpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ091dHB1dCBjcmVhdGVCaW5kaW5nT3V0cHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nT3V0cHV0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlRmF1bHQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlRmF1bHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgY3JlYXRlSW1wb3J0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVJbXBvcnQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlSW1wb3J0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSW5wdXQgY3JlYXRlSW5wdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUlucHV0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUlucHV0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVNZXNzYWdlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZU1lc3NhZ2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVPcGVyYXRpb24oKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlT3BlcmF0aW9uKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgT3V0cHV0IGNyZWF0ZU91dHB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlT3V0cHV0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZU91dHB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBhcnQgY3JlYXRlUGFydCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlUGFydCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVQb3J0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBvcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlUG9ydFR5cGUoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlUG9ydFR5cGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVNlcnZpY2UoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlU2VydmljZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFR5cGVzIGNyZWF0ZVR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVUeXBlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldEV4dGVuc2lvblJlZ2lzdHJ5KCIgKyBleHRSZWcgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRFeHRlbnNpb25SZWdpc3RyeShleHRSZWcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOw0KLSAgICB9DQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBvdGhlciBBYnN0cmFjdFdTRExFbGVtZW50IG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCByZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KCIgKyBleHRFbGVtZW50ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KGV4dEVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2lvbkF0dHJpYnV0ZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRFeHRlbnNpb25BdHRyaWJ1dGUoIiArIG5hbWUgKyAiLCAgIiArIHZhbHVlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMV3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjIyYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWw7DQotDQotDQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgV1NETDRKIGRlZmluaXRpb24NCi0gKiB3aXRoIGEgbG93ZXIgbWVtb3J5IGZvb3RwcmludC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluDQotICogZW52aXJvbm1lbnRzLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFdyYXBwZXJJbXBsIGV4dGVuZHMgRGVmaW5pdGlvbiB7DQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqDQotICAgICAqIEBwYXJhbSBkICB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uVG9XcmFwKERlZmluaXRpb24gZCk7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzIGJlaW5nIHdyYXBwZWQNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihTdHJpbmcgdXJpTG9jYXRpb24pOw0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpOw0KLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBSZWxlYXNlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdCB0aGF0IGlzDQotICAgICAqIGJlaW5nIHdyYXBwZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVzb3VyY2VzKCk7DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDbG9zZXMgdGhlIHVzZSBvZiB0aGUgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiBhbmQgYWxsb3dzIA0KLSAgICAgKiBpbnRlcm5hbCByZXNvdXJjZXMgdG8gYmUgcmVsZWFzZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVyUmVsb2FkSW1wbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvdXRpbC9XU0RMV3JhcHBlclJlbG9hZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVkYTM3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVyUmVsb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLklucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5QYXJ0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7DQotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsNCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsNCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsNCi1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5Ow0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7DQotDQotDQotLyoqDQotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgV1NETDRKIGRlZmluaXRpb24NCi0gKiB3aXRoIGEgbG93ZXIgbWVtb3J5IGZvb3RwcmludC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluDQotICogZW52aXJvbm1lbnRzLg0KLSAqIA0KLSAqIFRoZSBUeXBlIGFuZCBEb2N1bWVudGF0aW9uIG9iamVjdHMgY29uc3VtZSB0aGUgbW9zdCBzcGFjZQ0KLSAqIGluIG1hbnkgc2NlbmFyaW9zLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiByZWxvYWRzIHRoZXNlIG9iamVjdHMNCi0gKiB3aGVuIHRoZW4gdGhleSBhcmUgcmVxdWVzdGVkLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXU0RMV3JhcHBlclJlbG9hZEltcGwgaW1wbGVtZW50cyBXU0RMV3JhcHBlckltcGwgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NETFdyYXBwZXJSZWxvYWRJbXBsLmNsYXNzKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCA9IGxvZy5pc0RlYnVnRW5hYmxlZCgpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbXlDbGFzc05hbWUgPSAiV1NETFdyYXBwZXJSZWxvYWRJbXBsIjsNCi0NCi0gICAgLy8gamF2YXgud3NkbC5EZWZpbml0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUNCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNzg4ODA3Mzc1ODE0MDk3NDA5TDsNCi0NCi0gICAgLy8gdGhlIHdzZGw0aiB3c2RsIGRlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICBwcml2YXRlIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBudWxsOw0KLQ0KLSAgICAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIGJhc2UgZG9jdW1lbnQgdXNlZCBpbiB0aGUgd3NkbDRqIGRlZmluaXRpb24NCi0gICAgcHJpdmF0ZSBVUkwgd3NkbFVSTCA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxFeHBsaWNpdFVSSSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxEb2N1bWVudEJhc2VVUkkgPSBudWxsOw0KLSAgICANCi0gICAgDQotICAgIC8vIFRoZSB3c2RsRGVmaW5pdGlvbiBhbHdheXMgaGFzIHRoZSBUeXBlcyBhbmQgRG9jdW1lbnRFbGVtZW50DQotICAgIC8vIHB1cmdlZCBmcm9tIGl0Lg0KLSAgICAvLyBJZiBVU0VfU09GVF9SRUZFUkVOQ0VTIGlzIHRydWUsIHRoZW4gd2Uga2VlcCBhIFNPRlQgcmVmZXJlbmNlDQotICAgIC8vIHRvIHRoZXNlIG9iamVjdHMuDQotICAgIC8vIElmIFVTRV9TT0ZUX1JFRkVSRU5DRVMgaXMgZmFsc2UsIHRoZW4gYSBsb2FkRGVmaW5pdGlvbiBpcyBhbHdheXMNCi0gICAgLy8gcGVyZm9ybWVkIHRvIGdldCB0aGUgVHlwZSBvciBEb2N1bWVudGF0aW9uRWxlbWVudA0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBVU0VfU09GVF9SRUZFUkVOQ0VTID0gdHJ1ZTsNCi0gICAgcHJpdmF0ZSB0cmFuc2llbnQgU29mdFJlZmVyZW5jZSBzb2Z0VHlwZXMgPSBudWxsOw0KLSAgICBwcml2YXRlIHRyYW5zaWVudCBTb2Z0UmVmZXJlbmNlIHNvZnREb2NFbGVtZW50ID0gbnVsbDsNCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIFRoZSBXU0RMIERlZmludGlvbiBvYmplY3QgaXMgb3duZWQgYnkgdGhlIFdTRExXcmFwcGVyUmVsb2FkSW1wbCBvYmplY3QuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMV3JhcHBlclJlbG9hZEltcGwoRGVmaW5pdGlvbiBkZWYpIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETFdyYXBwZXJSZWxvYWRJbXBsKERlZmluaXRpb24gZGVmKSBjYWxsZWQiKTsNCi0gICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLmNhbGxTdGFja1RvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIG51bGwpOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDb25zdHJ1Y3Rvcg0KLSAgICAgKiBUaGUgV1NETCBEZWZpbnRpb24gb2JqZWN0IGlzIG93bmVkIGJ5IHRoZSBXU0RMV3JhcHBlclJlbG9hZEltcGwgb2JqZWN0Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETCBEZWZpbml0aW9uDQotICAgICAqIEBwYXJhbSB3VVJMICAgVGhlIFVSTCBmb3IgdGhlIHdzZGwNCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMV3JhcHBlclJlbG9hZEltcGwoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExXcmFwcGVyUmVsb2FkSW1wbChEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIGNhbGxlZCIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgd1VSTCk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEluaXRpYWxpemUgdGhlIHdzZGwgZGVmaW5pdGlvbiB3cmFwcGVyDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMNEogZGVmaW5pdGlvbg0KLSAgICAgKiBAcGFyYW0gd1VSTCAgIFRoZSBVUkwgd2hlcmUgdGhlIFdTREwgaXMgb2J0YWluZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlKERlZmluaXRpb24gZGVmLCBVUkwgd1VSTCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5wcmVwYXJlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gZGVmOw0KLSAgICAgICAgd3NkbFVSTCA9IHdVUkw7DQotDQotICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICB3c2RsRG9jdW1lbnRCYXNlVVJJID0gZGVmLmdldERvY3VtZW50QmFzZVVSSSgpOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBidWlsZCB1cCB0aGUgd3NkbFVSTCBpZiBwb3NzaWJsZQ0KLSAgICAgICAgICAgICAgICBpZiAoKHdzZGxVUkwgPT0gbnVsbCkgJiYgKHdzZGxEb2N1bWVudEJhc2VVUkkgIT0gbnVsbCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGxvY1VSTCA9IG5ldyBVUkwod3NkbERvY3VtZW50QmFzZVVSSSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFVSTCA9IGxvY1VSTDsNCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB1ZXgpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIGdvaW5nDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBleHBsaWNpdCBsb2NhdGlvbiBvZiB0aGUgd3NkbCBpZiBwb3NzaWJsZQ0KLSAgICAgICAgICAgICAgICBpZiAod3NkbFVSTCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB3c2RsRXhwbGljaXRVUkkgPSBnZXRFeHBsaWNpdFVSSSh3c2RsVVJMKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBUeXBlcyBhbmQgRG9jdW1lbnRhdGlvbkVsZW1lbnQgUmVzb3VyY2VzDQotICAgICAgICAgICAgICAgIHJlbGVhc2VSZXNvdXJjZXMoKTsNCi0NCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucHJlcGFyZSgpOiAgQ2F1Z2h0IGV4Y2VwdGlvbiBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXSAgZXJyb3IgWyIgKyBlLmdldE1lc3NhZ2UoKSArICJdIiwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnByZXBhcmUoKTogICB3c2RsRG9jdW1lbnRCYXNlVVJJIFsiICsgd3NkbERvY3VtZW50QmFzZVVSSQ0KLSAgICAgICAgICAgICAgICAgICAgKyAiXSAgICAgd3NkbEV4cGxpY2l0VVJJIFsiICsgd3NkbEV4cGxpY2l0VVJJICsgIl0gICB3c2RsVVJMIFsiICsgd3NkbFVSTCArICJdIik7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIHB1YmxpYyBXU0RMV3JhcHBlckltcGwgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgLyoNCi0gICAgICogUmVsZWFzZXMgVHlwZSBhbmQgRG9jdW1lbnRFbGVtZW50IFJlc291cmNlcw0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVJlc291cmNlcygpIHsNCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRUeXBlcygpOw0KLSAgICAgICAgICAgIGlmICh0eXBlcyAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldFR5cGVzKG51bGwpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aGlzLnNldENhY2hlZFR5cGVzKHR5cGVzKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOw0KLSAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQobnVsbCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkRG9jRWxlbWVudChlbGVtZW50KTsNCi0gICAgICAgICAgICANCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFN0b3JlIHRoZSBjYWNoZWQgdHlwZS4gIFNpbmNlIHRoaXMgaXMgYSBTT0ZUIHJlZmVyZW5jZSwNCi0gICAgICogdGhlIGdjIG1heSByZW1vdmUgaXQuDQotICAgICAqIEBwYXJhbSB0eXBlcw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHNldENhY2hlZFR5cGVzKFR5cGVzIHR5cGVzKSB7DQotICAgICAgICBpZiAoVVNFX1NPRlRfUkVGRVJFTkNFUykgew0KLSAgICAgICAgICAgIGlmIChzb2Z0VHlwZXMgPT0gbnVsbCB8fCBzb2Z0VHlwZXMuZ2V0KCkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgc29mdFR5cGVzID0gbmV3IFNvZnRSZWZlcmVuY2UodHlwZXMpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdzZGwgaGFzIG5vIHR5cGVzDQotICAgICAgICAgICAgICAgICAgICBzb2Z0VHlwZXMgPSBuZXcgU29mdFJlZmVyZW5jZShCb29sZWFuLkZBTFNFKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEdldCB0aGUgY2FjaGVkIHR5cGUuICBTaW5jZSB0aGlzIGlzIGEgU09GVCByZWZlcmVuY2UsDQotICAgICAqIHRoZSBnYyBtYXkgcmVtb3ZlIGl0Lg0KLSAgICAgKiBAcmV0dXJuIHR5cGVzDQotICAgICAqLw0KLSAgICBwcml2YXRlIFR5cGVzIGdldENhY2hlZFR5cGVzKCkgew0KLSAgICAgICAgaWYgKFVTRV9TT0ZUX1JFRkVSRU5DRVMpIHsNCi0gICAgICAgICAgICBpZiAoc29mdFR5cGVzID09IG51bGwgfHwgc29mdFR5cGVzLmdldCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChzb2Z0VHlwZXMuZ2V0KCkuZXF1YWxzKEJvb2xlYW4uRkFMU0UpKSB7DQotICAgICAgICAgICAgICAgIC8vIFRoZSB3c2RsIGhhcyBubyB0eXBlcw0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICByZXR1cm4gKFR5cGVzKSBzb2Z0VHlwZXMuZ2V0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0NhY2hlZFR5cGVzKCkgew0KLSAgICAgICAgaWYgKFVTRV9TT0ZUX1JFRkVSRU5DRVMpIHsNCi0gICAgICAgICAgICByZXR1cm4gKHNvZnRUeXBlcyAhPSBudWxsICYmIHNvZnRUeXBlcy5nZXQoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogU3RvcmUgdGhlIGNhY2hlZCBkb2N1bWVudCBlbGVtZW50LiAgU2luY2UgdGhpcyBpcyBhIFNPRlQgcmVmZXJlbmNlLA0KLSAgICAgKiB0aGUgZ2MgbWF5IHJlbW92ZSBpdC4NCi0gICAgICogQHBhcmFtIGUgRWxlbWVudA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIHNldENhY2hlZERvY0VsZW1lbnQoRWxlbWVudCBlKSB7DQotICAgICAgICBpZiAoVVNFX1NPRlRfUkVGRVJFTkNFUykgew0KLSAgICAgICAgICAgIGlmIChzb2Z0RG9jRWxlbWVudCA9PSBudWxsIHx8IHNvZnREb2NFbGVtZW50LmdldCgpID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgc29mdERvY0VsZW1lbnQgPSBuZXcgU29mdFJlZmVyZW5jZShlKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB3c2RsIGhhcyBubyBkb2N1bWVudCBlbGVtZW50DQotICAgICAgICAgICAgICAgICAgICBzb2Z0RG9jRWxlbWVudCA9IG5ldyBTb2Z0UmVmZXJlbmNlKEJvb2xlYW4uRkFMU0UpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogR2V0IHRoZSBjYWNoZWQgdHlwZS4gIFNpbmNlIHRoaXMgaXMgYSBTT0ZUIHJlZmVyZW5jZSwNCi0gICAgICogdGhlIGdjIG1heSByZW1vdmUgaXQuDQotICAgICAqIEByZXR1cm4gdHlwZXMNCi0gICAgICovDQotICAgIHByaXZhdGUgRWxlbWVudCBnZXRDYWNoZWREb2NFbGVtZW50KCkgew0KLSAgICAgICAgaWYgKFVTRV9TT0ZUX1JFRkVSRU5DRVMpIHsNCi0gICAgICAgICAgICBpZiAoc29mdERvY0VsZW1lbnQgPT0gbnVsbCB8fCBzb2Z0RG9jRWxlbWVudC5nZXQoKSA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc29mdERvY0VsZW1lbnQuZ2V0KCkuZXF1YWxzKEJvb2xlYW4uRkFMU0UpKSB7DQotICAgICAgICAgICAgICAgIC8vIFRoZSB3c2RsIGhhcyBubyBkb2N1bWVudCBlbGVtZW50DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIHJldHVybiAoRWxlbWVudCkgc29mdERvY0VsZW1lbnQuZ2V0KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0NhY2hlZERvY0VsZW1lbnQoKSB7DQotICAgICAgICBpZiAoVVNFX1NPRlRfUkVGRVJFTkNFUykgew0KLSAgICAgICAgICAgIHJldHVybiAoc29mdERvY0VsZW1lbnQgIT0gbnVsbCAmJiBzb2Z0RG9jRWxlbWVudC5nZXQoKSAhPSBudWxsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qDQotICAgICAqIFJldHVybnMgYSBmdWxsLCByZWxvYWRlZCxXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QuDQotICAgICAqIFRoaXMgYXZvaWRzIHRoZSBtZW1vcnkgc2F2aW5nIGNhcGFiaWxpdGllcyBvZiB0aGlzIHdyYXBwZXIuDQotICAgICAqIFRoZSBjYWxsZXIgbXVzdCBub3Qgc2F2ZSB0aGUgcmV0dXJuZWQgZGVmaW50aW9uLg0KLSAgICAgKiBAcmV0dXJuIERlZmludGlvbg0KLSAgICAgKi8NCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpIHsNCi0gICAgICAgIERlZmluaXRpb24gZGVmOw0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBJZiBubyBkZWZpbmlvdG4sIGxvYWQgb25lDQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgZGVmID0gbG9hZERlZmluaXRpb24oKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAvLyB1bmFibGUgdG8gbG9hZCB0aGUgZGVmaW5pdGlvbg0KLSAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOiBlcnJvciB0cnlpbmcgdG8gbG9hZCBEZWZpbml0aW9uICAgIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICBlcnJvciBbIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0gIiwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZGVmID0gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2UgaWYgKHdzZGxEZWZpbml0aW9uIGluc3RhbmNlb2YgV1NETFdyYXBwZXJCYXNpY0ltcGwpIHsNCi0gICAgICAgICAgICAvLyBJZiB3cmFwcGluZyBhbm90aGVyIHdyYXBwZXIsIHRoZW4gZGVsZWdhdGUNCi0gICAgICAgICAgICBkZWYgPSAoKFdTRExXcmFwcGVyQmFzaWNJbXBsKSB3c2RsRGVmaW5pdGlvbikuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAvLyBUaGUgcXVlc3Rpb24gaXMgd2hldGhlciBhIG5ldyBXU0RMRGVmaW5pdGlvbiBzaG91bGQgYmUgbG9hZGVkIGFuZCANCi0gICAgICAgICAgICAvLyByZXR1cm5lZCBvciB3aGV0aGVyIHRoZSBleGlzdGluZyBkZWZpbml0aW9uICh3L28gdGhlIFR5cGUgDQotICAgICAgICAgICAgLy8gYW5kIERvY3VtZW50RWxlbWVudCkgc2hvdWxkIGJlIHJldHVybmVkLg0KLSAgICAgICAgICAgIC8vIA0KLSAgICAgICAgICAgIC8vIFRoZSBhbnN3ZXIgaXMgdG8gcmVsb2FkIHRoZSBXU0RMRGVmaW5pdGlvbiBhbmQgcHJvdmlkZSB0aGUgbmV3DQotICAgICAgICAgICAgLy8gb25lIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBleGlzdGluZyBXU0RMRGVmaW50aW9uIHRoYXQgaXMgc3RvcmVkLg0KLSAgICAgICAgICAgIC8vIFRoZSBvbnVzIGlzIG9uIHRoZSBjYWxsZXIgdG8gZnJlZSB0aGlzIG5ldyBXU0RMRGVmaW5pdGlvbiBhbmQgDQotICAgICAgICAgICAgLy8gbm90IGhvbGQgb250byBpdC4gIElmIHRoZSBjYWxsbGVyIHdhbnRzIG1lbW9yeSBzYXZpbmcgDQotICAgICAgICAgICAgLy8gY2FwYWJpbGl0aWVzLCB0aGVuIHRoZSBjYWxsZXIgc2hvdWxkIGJlIHVzaW5nIHRoaXMgd3JhcHBlciBkaXJlY3RseS4NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgICAgICBpZihkZWYgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgZGVmID0gd3NkbERlZmluaXRpb247DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIHVuYWJsZSB0byBsb2FkIHRoZSBkZWZpbml0aW9uDQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmdldFVud3JhcHBlZERlZmluaXRpb24oKTogZXJyb3IgdHJ5aW5nIHRvIGxvYWQgRGVmaW5pdGlvbiAgICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICBlcnJvciBbIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0gIiwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZGVmID0gd3NkbERlZmluaXRpb247DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGRlZjsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZCAgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvblRvV3JhcChEZWZpbml0aW9uIGQpIHsNCi0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gZDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb24oU3RyaW5nIHVyaUxvY2F0aW9uKSB7DQotICAgICAgICBpZiAodXJpTG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHdzZGxVUkwgPSBuZXcgVVJMKHVyaUxvY2F0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIHRvZG8NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIGZvciB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKSB7DQotICAgICAgICBpZiAod3NkbFVSTCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDbG9zZXMgdGhlIHVzZSBvZiB0aGUgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiBhbmQgYWxsb3dzIA0KLSAgICAgKiBpbnRlcm5hbCByZXNvdXJjZXMgdG8gYmUgcmVsZWFzZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gZm9yIHRoaXMgaW1wbGVtZW50YXRpb24NCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gamF2YXgud3NkbC5EZWZpbnRpb24gaW50ZXJmYWNlIG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50QmFzZVVSSShTdHJpbmcgZCkgew0KLQ0KLSAgICAgICAgLy8gU2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24gYW5kDQotICAgICAgICAvLyBhbGxvd3MgdGhlIERlZmluaXRpb24gdG8gYmUgcmVsb2FkZWQuDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50QmFzZVVSSSgiICsgZCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50QmFzZVVSSSgpIHsNCi0NCi0gICAgICAgIC8vIEdldCB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50IGZvciB0aGUgRGVmaW5pdGlvbi4NCi0gICAgICAgIC8vIFRoaXMgaWRlbnRpZmllcyB0aGUgb3JpZ2luIG9mIHRoZSBEZWZpbml0aW9uIGFuZA0KLSAgICAgICAgLy8gYWxsb3dzIHRoZSBEZWZpbml0aW9uIHRvIGJlIHJlbG9hZGVkLg0KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCwgbm90IHRoZSBpbXBvcnRzLg0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXREb2N1bWVudEJhc2VVUkkoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRRTmFtZShRTmFtZSBuKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFFOYW1lKCIgKyBuICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0UU5hbWUobik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRRTmFtZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRRTmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFRhcmdldE5hbWVzcGFjZSgiICsgdCArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZSh0KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkTmFtZXNwYWNlKCIgKyBwcmVmaXggKyAiLCAiICsgbmFtZXNwYWNlVVJJICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWVzcGFjZShTdHJpbmcgcHJlZml4KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZU5hbWVzcGFjZSgiICsgcHJlZml4ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZU5hbWVzcGFjZShwcmVmaXgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXROYW1lc3BhY2UoIiArIHByZWZpeCArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0UHJlZml4KCIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hbWVzcGFjZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hdGl2ZUF0dHJpYnV0ZU5hbWVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE5hdGl2ZUF0dHJpYnV0ZU5hbWVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhUeXBlcyB0eXBlcykgew0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvLyBub3RlOiB0aGUgd3NkbCBkZWZpbml0aW9uIGltcGxlbWVudGF0aW9uIGNhbid0IHJlLWNyZWF0ZSB0aGUgdHlwZXMgDQotICAgICAgICAgICAgLy8gICAgICAgYWZ0ZXIgdGhlIHR5cGVzIGdvdCBzZXQgdG8gbnVsbCBzbyB0aGUgd3NkbCBkZWZpbml0aW9uIHdvdWxkDQotICAgICAgICAgICAgLy8gICAgICAgbmVlZCB0byBiZSByZWxvYWRlZA0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldFR5cGVzKCkgZnJvbSB3c2RsIERlZmluaXRpb24iKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VHlwZXModHlwZXMpOw0KLQ0KLSAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBrZWVwIHRoZSB0eXBlcyBvYmplY3QgaWYgaXQgZ2V0cyBzZXQ/DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VHlwZXMobnVsbCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIC8qDQotICAgICAgICAgICAgIC8vIHJlbG9hZCB0aGUgd3NkbCBkZWZpbml0aW9uIG9iamVjdA0KLSAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IGFib3V0IGFueSBvbmxpbmUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBkZWZpbml0aW9uPw0KLQ0KLSAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSsiLnNldFR5cGVzKCkgZnJvbSByZWxvYWRlZCB3c2RsIERlZmluaXRpb24iKTsNCi0gICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7DQotICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lKyIuc2V0VHlwZXMoKTogZXJyb3IgdHJ5aW5nIHRvIGxvYWQgRGVmaW5pdGlvbiAgICBbIitlLmdldENsYXNzKCkuZ2V0TmFtZSgpKyJdICBlcnJvciBbIitlLmdldE1lc3NhZ2UoKSsiXSAiLCBlKTsNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgIGRlZi5zZXRUeXBlcyh0eXBlcyk7DQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUrIi5zZXRUeXBlcygpOiBub3RoaW5nIHRvIHNldCIpOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICovDQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0VHlwZXMoKTogbm90aGluZyB0byBzZXQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgcHVibGljIFR5cGVzIGdldFR5cGVzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLnRyYWNlKG15Q2xhc3NOYW1lICsgIi5nZXRUeXBlcygpIGNhbGwgc3RhY2sgPSIgKyBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICAvLyBTZWUgaWYgd2UgaGF2ZSBhIHNvZnQgcmVmZXJlbmNlIHRvIHRoZSBUeXBlDQotICAgICAgICANCi0gICAgICAgIGlmIChoYXNDYWNoZWRUeXBlcygpKSB7DQotICAgICAgICAgICAgVHlwZXMgdCA9IGdldENhY2hlZFR5cGVzKCk7DQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VHlwZXMoKSBmcm9tIHNvZnQgcmVmZXJlbmNlIFsiICsgdA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJdIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiB0Ow0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICANCi0gICAgICAgIC8vIHJlbG9hZCB0aGUgd3NkbCBkZWZpbml0aW9uIG9iamVjdA0KLSAgICAgICAgLy8gVE9ETzogd2hhdCBhYm91dCBhbnkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBkZWZpbml0aW9uPw0KLQ0KLSAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRUeXBlcygpOiBlcnJvciB0cnlpbmcgdG8gbG9hZCBEZWZpbml0aW9uICAgIFsiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIl0gIGVycm9yIFsiICsgZS5nZXRNZXNzYWdlKCkgKyAiXSAiLCBlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsNCi0gICAgICAgICAgICBUeXBlcyB0ID0gZGVmLmdldFR5cGVzKCk7DQotICAgICAgICAgICAgc2V0Q2FjaGVkVHlwZXModCk7DQotICAgICAgICAgICAgc2V0Q2FjaGVkRG9jRWxlbWVudChkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7DQotDQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VHlwZXMoKSBmcm9tIHJlbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiByZXR1cm5pbmcgWyIgKyB0DQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICByZXR1cm4gdDsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VHlwZXMoKSByZXR1cm5pbmcgTlVMTCIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoSW1wb3J0IGltcG9ydERlZikgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRJbXBvcnQoIiArIGltcG9ydERlZiArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZEltcG9ydChpbXBvcnREZWYpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgcmVtb3ZlSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlSW1wb3J0KCIgKyBpbXBvcnREZWYgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlSW1wb3J0KGltcG9ydERlZik7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0SW1wb3J0cygiICsgbmFtZXNwYWNlVVJJICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMobmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0SW1wb3J0cygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0SW1wb3J0cygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRNZXNzYWdlKCIgKyBtZXNzYWdlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkTWVzc2FnZShtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TWVzc2FnZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgcmVtb3ZlTWVzc2FnZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZU1lc3NhZ2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlTWVzc2FnZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TWVzc2FnZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE1lc3NhZ2VzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRCaW5kaW5nKCIgKyBiaW5kaW5nICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkQmluZGluZyhiaW5kaW5nKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QmluZGluZygiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5nKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgcmVtb3ZlQmluZGluZyhRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZUJpbmRpbmcoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlQmluZGluZyhuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QmluZGluZ3MoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEJpbmRpbmdzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEJpbmRpbmdzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbEJpbmRpbmdzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxCaW5kaW5ncygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRBbGxCaW5kaW5ncygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkUG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkUG9ydFR5cGUoIiArIHBvcnRUeXBlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFBvcnRUeXBlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIHJlbW92ZVBvcnRUeXBlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlUG9ydFR5cGUoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24ucmVtb3ZlUG9ydFR5cGUobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFBvcnRUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0UG9ydFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFBvcnRUeXBlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxQb3J0VHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEFsbFBvcnRUeXBlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRBbGxQb3J0VHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZFNlcnZpY2UoIiArIHNlcnZpY2UgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRTZXJ2aWNlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSByZW1vdmVTZXJ2aWNlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlU2VydmljZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5yZW1vdmVTZXJ2aWNlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRTZXJ2aWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0U2VydmljZXMoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0QWxsU2VydmljZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEFsbFNlcnZpY2VzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEFsbFNlcnZpY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChvcmcudzNjLmRvbS5FbGVtZW50IGRvY0VsKSB7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKSBmcm9tIHdzZGwgRGVmaW5pdGlvbiIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAvLyBzZXQgdGhlIGVsZW1lbnQgaW4gdGhlIGRlZmluaXRpb24NCi0gICAgICAgICAgICAvLyBkb24ndCBtYWtlIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2NFbCk7DQotICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGVsZW1lbnQNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChudWxsKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLyoNCi0gICAgICAgICAgICAgLy8gcmVsb2FkIHRoZSB3c2RsIGRlZmluaXRpb24gb2JqZWN0DQotICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgYWJvdXQgYW55IG9ubGluZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGRlZmluaXRpb24NCi0NCi0gICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUrIi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2NFbCkgZnJvbSByZWxvYWRlZCB3c2RsIERlZmluaXRpb24iKTsNCi0gICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7DQotICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lKyIuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZG9jRWwpOiBlcnJvciB0cnlpbmcgdG8gbG9hZCBEZWZpbml0aW9uICAgIFsiK2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIl0gIGVycm9yIFsiK2UuZ2V0TWVzc2FnZSgpKyJdICIsIGUpOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgIGlmIChkZWYgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgZGVmLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSsiLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTogbm90aGluZyB0byBzZXQiKTsNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAqLw0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTogbm90aGluZyB0byBzZXQiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIG9yZy53M2MuZG9tLkVsZW1lbnQgZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSB7DQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cudHJhY2UobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkgY2FsbCBzdGFjayA9IiArDQotICAgICAgICAgICAgICAgICAgICAgIEphdmFVdGlscy5jYWxsU3RhY2tUb1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgLy8gU2VlIGlmIHdlIGhhdmUgYSBzb2Z0IHJlZmVyZW5jZSB0byB0aGUgRG9jdW1lbnRFbGVtZW50DQotICAgICAgICBpZiAoaGFzQ2FjaGVkRG9jRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgRWxlbWVudCBlID0gZ2V0Q2FjaGVkRG9jRWxlbWVudCgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIGZyb20gc29mdCByZWZlcmVuY2UgIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBlOw0KLSAgICAgICAgfSAgICANCi0gICAgICAgIA0KLSAgICAgICAgLy8gcmVsb2FkIHRoZSB3c2RsIGRlZmluaXRpb24gb2JqZWN0DQotICAgICAgICAvLyBUT0RPOiB3aGF0IGFib3V0IGFueSBvbmxpbmUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBkZWZpbml0aW9uPw0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIGZyb20gcmVsb2FkZWQgd3NkbCBEZWZpbml0aW9uIik7DQotICAgICAgICB9DQotDQotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGRlZiA9IGxvYWREZWZpbml0aW9uKCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTogZXJyb3IgdHJ5aW5nIHRvIGxvYWQgRGVmaW5pdGlvbiAgICBbIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRDbGFzcygpLmdldE5hbWUoKSArICJdICBlcnJvciBbIiArIGUuZ2V0TWVzc2FnZSgpICsgIl0gIiwgZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7DQotICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkb2NFbGVtZW50ID0gZGVmLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7DQotICAgICAgICAgICAgc2V0Q2FjaGVkRG9jRWxlbWVudChkb2NFbGVtZW50KTsNCi0gICAgICAgICAgICBzZXRDYWNoZWRUeXBlcyhkZWYuZ2V0VHlwZXMoKSk7DQotDQotICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgIGlmIChkb2NFbGVtZW50ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSBmcm9tIHJlbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiByZXR1cm5pbmcgIE5PTi1OVUxMIG9yZy53M2MuZG9tLkVsZW1lbnQiKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSBmcm9tIHJlbG9hZGVkIHdzZGwgRGVmaW5pdGlvbiByZXR1cm5pbmcgIE5VTEwgb3JnLnczYy5kb20uRWxlbWVudCIpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBkb2NFbGVtZW50Ow0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIHJldHVybmluZyBOVUxMIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoIiArIGV4dEVsZW1lbnQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtZW50KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmcoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmdGYXVsdCBjcmVhdGVCaW5kaW5nRmF1bHQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdGYXVsdCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nSW5wdXQgY3JlYXRlQmluZGluZ0lucHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nSW5wdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ0lucHV0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ091dHB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhdWx0IGNyZWF0ZUZhdWx0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVGYXVsdCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVGYXVsdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEltcG9ydCBjcmVhdGVJbXBvcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUltcG9ydCgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVJbXBvcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlSW5wdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlSW5wdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU1lc3NhZ2UoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZU9wZXJhdGlvbigpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVPcGVyYXRpb24oKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVPdXRwdXQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlT3V0cHV0KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUGFydCBjcmVhdGVQYXJ0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVQYXJ0KCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBhcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQb3J0IGNyZWF0ZVBvcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVBvcnQoKSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb24uY3JlYXRlUG9ydCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnRUeXBlIGNyZWF0ZVBvcnRUeXBlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVQb3J0VHlwZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVQb3J0VHlwZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgY3JlYXRlU2VydmljZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlU2VydmljZSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5jcmVhdGVTZXJ2aWNlKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZXMgY3JlYXRlVHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmNyZWF0ZVR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIiArIGV4dFJlZyArICIpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dFJlZyk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2lvblJlZ2lzdHJ5KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXG4iICsgd3NkbERlZmluaXRpb24udG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOw0KLSAgICB9DQotDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAvLyBvdGhlciBBYnN0cmFjdFdTRExFbGVtZW50IG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCByZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50KSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KCIgKyBleHRFbGVtZW50ICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLnJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KGV4dEVsZW1lbnQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uLmdldEV4dGVuc2lvbkF0dHJpYnV0ZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIik7DQotICAgICAgICB9DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRFeHRlbnNpb25BdHRyaWJ1dGUoIiArIG5hbWUgKyAiLCAgIiArIHZhbHVlICsgIikiKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gcHJpdmF0ZSBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRFeHBsaWNpdFVSSShVUkwgd3NkbFVSTCkgdGhyb3dzIFdTRExFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHBsaWNpdFVSSSgiICsgd3NkbFVSTCArICIpICIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU3RyaW5nIGV4cGxpY2l0VVJJID0gbnVsbDsNCi0NCi0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0NCi0gICAgICAgICAgICAgICAgKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9KTsNCi0NCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgVVJMIHVybCA9IHdzZGxVUkw7DQotICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gbnVsbDsNCi0gICAgICAgICAgICBib29sZWFuIGlzRmlsZVByb3RvY29sID0NCi0gICAgICAgICAgICAgICAgICAgICh1cmwgIT0gbnVsbCAmJiAiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgPyB0cnVlIDogZmFsc2U7DQotDQotICAgICAgICAgICAgaWYgKGlzRmlsZVByb3RvY29sKSB7DQotICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gKHVybCAhPSBudWxsKSA/IHVybC5nZXRQYXRoKCkgOiBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICBVUkkgdXJpID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB1cmkgPSBuZXcgVVJJKHVybC50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXJpIGhhcyByZWxhdGl2ZSBwYXRoIA0KLSAgICAgICAgICAgICAgICAvLyBpZSBwYXRoIGlzIG5vdCBhYnNvbHV0ZSBhbmQgaXMgbm90IHN0YXJ0aW5nIHdpdGggYSAiLyIgDQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNSZWxhdGl2ZVBhdGggPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aCAhPSBudWxsICYmICFuZXcgRmlsZShmaWxlUGF0aCkuaXNBYnNvbHV0ZSgpKSA/IHRydWUgOiBmYWxzZTsNCi0NCi0gICAgICAgICAgICAgICAgaWYgKGlzUmVsYXRpdmVQYXRoKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4cGxpY2l0VVJJKCIgKyB3c2RsVVJMDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpOiBXU0RMIFVSTCBoYXMgYSByZWxhdGl2ZSBwYXRoIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAvLyBMZXRzIHJlYWQgdGhlIGNvbXBsZXRlIFdTREwgVVJMIGZvciByZWxhdGl2ZSBwYXRoIGZyb20gY2xhc3MgbG9hZGVyDQotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgcmVsYXRpdmUgcGF0aCBvZiB1cmwgdG8gZmV0Y2ggY29tcGxldGUgVVJMLiAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICB1cmwgPSBnZXRBYnNvbHV0ZVVSTChjbGFzc0xvYWRlciwgZmlsZVBhdGgpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXhwbGljaXRVUkkoIiArIHdzZGxVUkwgKyAiKTogIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIldTREwgVVJMIGZvciByZWxhdGl2ZSBwYXRoIG5vdCBmb3VuZCBpbiBDbGFzc0xvYWRlciIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuZ2V0RXhwbGljaXRVUkkoIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbFVSTA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIik6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVbmFibGUgdG8gcmVhZCBXU0RMIGZyb20gcmVsYXRpdmUgcGF0aCwgY2hlY2sgdGhlIHJlbGF0aXZlIHBhdGgiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHBsaWNpdFVSSSgiICsgd3NkbFVSTCArICIpOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiUmVsYXRpdmUgcGF0aCBleGFtcGxlOiBmaWxlOi9XRUItSU5GL3dzZGwvPHdzZGxmaWxlbmFtZT4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmdldEV4cGxpY2l0VVJJKCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdzZGxVUkwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNpbmcgcmVsYXRpdmUgcGF0aCBhcyBkZWZhdWx0IHdzZGwgVVJMIHRvIGxvYWQgd3NkbCBEZWZpbml0aW9uLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB3c2RsVVJMOw0KLSAgICAgICAgICAgICAgICAgICAgfSANCi0gICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEV4cGxpY2l0VVJJKCIgKyB3c2RsVVJMICsgIik6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJXU0RMIFVSTCBmb3VuZCBmb3IgcmVsYXRpdmUgcGF0aDogIiArIGZpbGVQYXRoICsgIiBzY2hlbWU6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVyaS5nZXRTY2hlbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7DQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgCWlzID0gZ2V0SW5wdXRTdHJlYW0odXJsQ29uKTsNCi0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHBsaWNpdFVSSSgiICsgd3NkbFVSTCArICIpOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvdWxkIG5vdCBvcGVuIHVybCBjb25uZWN0aW9uLiBUcnlpbmcgdG8gdXNlICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2xhc3Nsb2FkZXIgdG8gZ2V0IGFub3RoZXIgVVJMLiIpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGlmIChmaWxlUGF0aCAhPSBudWxsKSB7DQotDQotICAgICAgICAgICAgICAgICAgICB1cmwgPSBnZXRBYnNvbHV0ZVVSTChjbGFzc0xvYWRlciwgZmlsZVBhdGgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGxvY2F0ZSBVUkwgZm9yIHdzZGwuIFJlcG9ydGluZyBlcnJvciIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigiV1NETDRKV3JhcHBlciA6ICIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdXJsQ29uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgVVJMIGZvciBXU0RMIGZyb20gamFyIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHBsaWNpdFVSSSgiICsgd3NkbFVSTCArICIpOiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJDb3VsZCBub3QgZ2V0IFVSTCBmcm9tIGNsYXNzbG9hZGVyLiBSZXBvcnRpbmcgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXJyb3IgZHVlIHRvIG5vIGZpbGUgcGF0aC4iKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKCJXU0RMV3JhcHBlclJlbG9hZEltcGwgOiAiLCBlLmdldE1lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgZXhwbGljaXRVUkkgPSB1cmxDb24uZ2V0VVJMKCkudG9TdHJpbmcoKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKCJXU0RMV3JhcHBlclJlbG9hZEltcGwgOiAiLCBleC5nZXRNZXNzYWdlKCksIGV4KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBleHBsaWNpdFVSSTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwcml2YXRlIFVSTCBnZXRBYnNvbHV0ZVVSTChmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgZmluYWwgU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7DQotICAgICAgICBVUkwgdXJsID0gKFVSTCkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyLmdldFJlc291cmNlKGZpbGVQYXRoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgKTsNCi0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBnZXQgVVJMIGZyb20gY2xhc3Nsb2FkZXIuIExvb2tpbmcgaW4gYSBqYXIuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKSB7DQotICAgICAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIHVybExvYWRlciA9IChVUkxDbGFzc0xvYWRlcikgY2xhc3NMb2FkZXI7DQotICAgICAgICAgICAgICAgIHVybCA9IGdldFVSTEZyb21KQVIodXJsTG9hZGVyLCB3c2RsVVJMKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdXJsOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBMb2FkIGFuZCBSZXR1cm4gYSBEZWZpbml0aW9uIG9iamVjdC4NCi0gICAgICogKFRoZSBjYWxsZXIgd2lsbCBkZXRlcm1pbmUgaWYgdGhlIERlZmluaXRpb24gb2JqZWN0IHNob3VsZCBoYXZlIA0KLSAgICAgKiBpdHMgcmVzb3VyY2VzIGZyZWVkIG9yIG5vdCkNCi0gICAgICogQHJldHVybiBEZWZpbml0aW9uDQotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGxvYWREZWZpbml0aW9uKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxFeHBsaWNpdFVSSSAhPSBudWxsKSB7DQotICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgZGVmID0gKERlZmluaXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgew0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBnZXRXU0RMUmVhZGVyKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkV1NETCh3c2RsRXhwbGljaXRVUkkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9KTsNCi0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmxvYWREZWZpbml0aW9uKCk6ICINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsNCi0gICAgICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiQ2FsbCBTdGFjayA9ICIgKyBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgV1NETEV4Y2VwdGlvbiB3ZSA9IG5ldyBXU0RMRXhjZXB0aW9uKCJXU0RMV3JhcHBlclJlbG9hZEltcGwgOiAiLCBlLmdldE1lc3NhZ2UoKSwgZSk7DQotICAgICAgICAgICAgICAgIHRocm93IHdlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIExvYWRpbmcgdGhlIHdzZGwgaXMgZXhwZW5zaXZlLiAgRHVtcCB0aGUgY2FsbHN0YWNrLi4gc28gdGhhdCB3ZSANCi0gICAgICAgIC8vIHN1cHBvcnQgY2FuIGxvb2sgYXQgdGhlIHRyYWNlIGFuZCBkZXRlcm1pbmUgaWYgdGhpcyBjbGFzcyBpcyBiZWluZyB1c2VkIGluY29ycmVjdGx5Lg0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5sb2FkRGVmaW5pdGlvbigpOiAgcmV0dXJuaW5nIERlZmluaXRpb24gWyIgKyBkZWYgKyAiXSIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZSgiQ2FsbCBTdGFjayA9ICIgKyBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZGVmOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgVVJMIGdldFVSTEZyb21KQVIoVVJMQ2xhc3NMb2FkZXIgdXJsTG9hZGVyLCBVUkwgcmVsYXRpdmVVUkwpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFVSTFtdIHVybExpc3QgPSB1cmxMb2FkZXIuZ2V0VVJMcygpOw0KLQ0KLSAgICAgICAgaWYgKHVybExpc3QgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMaXN0Lmxlbmd0aDsgaSsrKSB7DQotICAgICAgICAgICAgVVJMIHVybCA9IHVybExpc3RbaV07DQotDQotICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsNCi0NCi0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodXJsLmdldFBhdGgoKSk7DQotDQotICAgICAgICAgICAgICAgIC8vSWYgZmlsZSBpcyBub3Qgb2YgdHlwZSBkaXJlY3RvcnkgdGhlbiBpdHMgYSBqYXIgZmlsZQ0KLSAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSAmJiAhZi5pc0RpcmVjdG9yeSgpKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEphckZpbGUgamYgPSBuZXcgSmFyRmlsZShmKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gamYuZW50cmllcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgYWxsIGVudHJpZXMgaW4gamFyIGZpbGUgYW5kIHJldHVybiB0aGUgZmlyc3QgDQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3NkbCBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgcmVsYXRpdmUgcGF0aA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gamUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLndzZGwiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlVVJMLmdldFBhdGgoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguZW5kc1dpdGgobmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSBVbml4L0xpbnV4IGZpbGUgcGF0aHMgYmVnaW4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgJy8nLiBXaGVuIGFkZGluZyB0aGUgcHJlZml4ICdqYXI6ZmlsZTovJyB3ZSBtYXkgZW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXAgd2l0aCAnLy8nIGFmdGVyIHRoZSAnZmlsZTonIHBhcnQuIFRoaXMgY2F1c2VzIHRoZSBVUkwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqZWN0IHRvIHRyZWF0IHRoaXMgbGlrZSBhIHJlbW90ZSByZXNvdXJjZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5pbmRleE9mKCIvIikgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSwgcGF0aC5sZW5ndGgoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBhYnNvbHV0ZVVybCA9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKCJqYXI6ZmlsZTovIiArIHBhdGggKyAiIS8iICsgamUuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVVcmw7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRExFeGNlcHRpb24gd2UgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdTRExFeGNlcHRpb24oIldTRExXcmFwcGVyUmVsb2FkSW1wbCA6ICIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB3ZTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBSZXR1cm5zIGEgd3NkbCByZWFkZXIgZm9yIHRoZSB3c2RsDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIFdTRExSZWFkZXINCi0gICAgICogQGV4Y2VwdGlvbiBXU0RMRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwcml2YXRlIFdTRExSZWFkZXIgZ2V0V1NETFJlYWRlcigpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsNCi0gICAgICAgIFdTRExSZWFkZXIgcmVhZGVyOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICByZWFkZXIgPSAoV1NETFJlYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7DQotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9KTsNCi0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IChXU0RMRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOw0KLSAgICAgICAgfQ0KLQkvLyBwcmV2ZW50IHN5c3RlbSBvdXQgZnJvbSBvY2N1cnJpbmcNCi0gICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKGNvbS5pYm0ud3NkbC5Db25zdGFudHMuRkVBVFVSRV9WRVJCT1NFLCBmYWxzZSk7DQotICAgICAgICByZXR1cm4gcmVhZGVyOw0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIEphdmEyIFNlY3VyaXR5IGNvbXBsaWFudCB3YXkgdG8gb2J0YWluIHRoZSBJbnB1dFN0cmVhbQ0KLSAgICAgKiBmb3IgYSBnaXZlbiBVUkxDb25uZWN0aW9uIG9iamVjdC4gVGhpcyBpcyBuZWVkZWQgYXMgYSBnaXZlbiBVUkxDb25uZWN0aW9uIG9iamVjdA0KLSAgICAgKiBtYXkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBGaWxlVVJMQ29ubmVjdGlvbiBvYmplY3Qgd2hpY2ggd291bGQgcmVxdWlyZSBhY2Nlc3MgDQotICAgICAqIHBlcm1pc3Npb25zIGlmIEphdmEyIFNlY3VyaXR5IHdhcyBlbmFibGVkLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShVUkxDb25uZWN0aW9uIHVybENvbikgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgIAlmaW5hbCBVUkxDb25uZWN0aW9uIGZpbmFsVVJMQ29uID0gdXJsQ29uOw0KLSAgICAJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLSAgICAJdHJ5IHsNCi0gICAgCQlpcyA9IChJbnB1dFN0cmVhbSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoDQotICAgICAgICAJCQluZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotICAgIAkJCQkJCXJldHVybiBmaW5hbFVSTENvbi5nZXRJbnB1dFN0cmVhbSgpOw0KLSAgICAJCQkJCX0NCi0gICAgICAgIAkJCX0pOw0KLSAgICAJfQ0KLSAgICAJY2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgIAkJdGhyb3cgZS5nZXRFeGNlcHRpb24oKTsNCi0gICAgCX0NCi0gICAgCXJldHVybiBpczsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvc3JjL29yZy9hcGFjaGUvYXhpczIvd3NkbC91dGlsL1dTRExXcmFwcGVyU2F2ZUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJTYXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjJjMzZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC9zcmMvb3JnL2FwYWNoZS9heGlzMi93c2RsL3V0aWwvV1NETFdyYXBwZXJTYXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzNSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvdW50ZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOw0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7DQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsNCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247DQotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7DQotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0Ow0KLWltcG9ydCBqYXZheC53c2RsLklucHV0Ow0KLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7DQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsNCi1pbXBvcnQgamF2YXgud3NkbC5QYXJ0Ow0KLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7DQotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7DQotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsNCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ow0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotDQotLyoqDQotICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGEgV1NETCBkZWZpbml0aW9uIGlzIGtlcHQgaW4gbWVtb3J5DQotICogaW4gY2FzZSBpdCBuZWVkcyB0byBiZSBhY2Nlc3NlZCBkdXJpbmcgcnVudGltZS4gIEluIHNpdHVhdGlvbnMgd2hlcmUgDQotICogdGhlcmUgYXJlIGxvdHMgb2YgV1NETCBkZWZpbml0aW9ucyBvciBiaWcgV1NETHMsIHRoZSBtZW1vcnkgZm9vdHByaW50IGNhbiBiZSANCi0gKiBodWdlLg0KLSAqDQotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgV1NETDRKIGRlZmluaXRpb24NCi0gKiB3aXRoIGEgbG93ZXIgbWVtb3J5IGZvb3RwcmludC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluDQotICogZW52aXJvbm1lbnRzLg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdTRExXcmFwcGVyU2F2ZUltcGwgaW1wbGVtZW50cyBXU0RMV3JhcHBlckltcGwgew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NETFdyYXBwZXJTYXZlSW1wbC5jbGFzcyk7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWJ1Z0VuYWJsZWQgPSBsb2cuaXNEZWJ1Z0VuYWJsZWQoKTsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG15Q2xhc3NOYW1lID0gIldTRExXcmFwcGVyU2F2ZUltcGwiOw0KLQ0KLSAgICAvLyBqYXZheC53c2RsLkRlZmluaXRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQ0KLSAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTI3ODg4MDczNzU4MTQwOTc0MDlMOw0KLQ0KLSAgICAvLyB0aGUgd3NkbDRqIHdzZGwgZGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7DQotDQotICAgIC8vIHRoZSBsb2NhdGlvbiBvZiB0aGUgYmFzZSBkb2N1bWVudCB1c2VkIGluIHRoZSB3c2RsNGogZGVmaW5pdGlvbg0KLSAgICBwcml2YXRlIFVSTCB3c2RsVVJMID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEV4cGxpY2l0VVJJID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbERvY3VtZW50QmFzZVVSSSA9IG51bGw7DQotDQotICAgIC8vIGFuIG9iamVjdCB0aGF0IG1haW50YWlucyBhIHN5bmNocm9uaXplZCBjb3VudGVyDQotICAgIHByaXZhdGUgQ291bnRlciBhY2Nlc3NDb3VudCA9IG51bGw7DQotDQotICAgIC8vIHNlcmlhbGl6YXRpb24tcmVsYXRlZCBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8NCi0gICAgLy8gICAnc2FmZVRvU2VyaWFsaXplJyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd3JhcHBlZCBXU0RMIGRlZmluaXRpb24gb2JqZWN0IGlzDQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgc2FmZSB0byBzZXJpYWxpemUuICBUaGlzIGlzIHNldCB0byBmYWxzZSBpZiB0aGUgdW5kZXJseWluZw0KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgIFdTREw0SidzIFdTREwgZGVmaW5pdGlvbiBoYWQgYW4gZXJyb3Igd2hlbiB3ZSB0cmllZCB0byANCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUgaXQuDQotICAgIC8vIA0KLSAgICAvLyAgICdoYXNCZWVuU2F2ZWQnICAgIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3cmFwcGVkIFdTREwgZGVmaW5pdGlvbiBvYmplY3QNCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2F2ZWQNCi0gICAgLy8gDQotICAgIC8vICAgJ2hhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcnICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd3JhcHBlZCBXU0RMIGRlZmluaXRpb24NCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICBvYmplY3QgaGFzIGJlZW4gdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBzYXZlZC9zZXJpYWx6aWF0aW9uDQotICAgIC8vIA0KLSAgICAvLyANCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhZmVUb1NlcmlhbGl6ZSA9IHRydWU7DQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNCZWVuU2F2ZWQgPSBmYWxzZTsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSBmYWxzZTsNCi0NCi0gICAgcHJpdmF0ZSBGaWxlIHNhdmVkRGVmaW5pdGlvbkZpbGUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBzYXZlZEZpbGVuYW1lID0gbnVsbDsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyBXU0RMV3JhcHBlclNhdmVJbXBsKERlZmluaXRpb24gZGVmKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExXcmFwcGVyU2F2ZUltcGwoRGVmaW5pdGlvbiBkZWYpIGNhbGxlZCIpOw0KLSAgICAgICAgICAgIGxvZy50cmFjZShKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICBwcmVwYXJlKGRlZiwgbnVsbCk7DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gZGVmICAgIFRoZSBXU0RMIERlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIGZvciB0aGUgd3NkbA0KLSAgICAgKi8NCi0gICAgcHVibGljIFdTRExXcmFwcGVyU2F2ZUltcGwoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSB7DQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcoIldTRExXcmFwcGVyU2F2ZUltcGwoRGVmaW5pdGlvbiBkZWYsIFVSTCB3VVJMKSBjYWxsZWQiKTsNCi0gICAgICAgICAgICBsb2cudHJhY2UoSmF2YVV0aWxzLmNhbGxTdGFja1RvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcHJlcGFyZShkZWYsIHdVUkwpOw0KLSAgICB9DQotDQotDQotDQotICAgIC8qKg0KLSAgICAgKiBJbml0aWFsaXplIHRoZSB3c2RsIGRlZmluaXRpb24gd3JhcHBlcg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGRlZiAgICBUaGUgV1NETDRKIGRlZmluaXRpb24NCi0gICAgICogQHBhcmFtIHdVUkwgICBUaGUgVVJMIHdoZXJlIHRoZSBXU0RMIGlzIG9idGFpbmVkDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgcHJlcGFyZShEZWZpbml0aW9uIGRlZiwgVVJMIHdVUkwpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucHJlcGFyZSgpIik7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gZGVmOw0KLSAgICAgICAgd3NkbFVSTCA9IHdVUkw7DQotDQotICAgICAgICBhY2Nlc3NDb3VudCA9IG5ldyBDb3VudGVyKCk7DQotDQotICAgICAgICByZWxlYXNlUmVzb3VyY2VzKCk7DQotICAgIH0NCi0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIHB1YmxpYyBXU0RMRGVmaW5pdGlvbldyYXBwZXIgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgLyoNCi0gICAgICogUmV0dXJucyB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpIHsNCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBEZWZpbml0aW9uIGRlZjsNCi0NCi0gICAgICAgIGlmICgod3NkbERlZmluaXRpb24gIT0gbnVsbCkgJiYNCi0gICAgICAgICAgICAod3NkbERlZmluaXRpb24gaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpKSB7DQotICAgICAgICAgICAgZGVmID0gKChXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHdzZGxEZWZpbml0aW9uKS5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGRlZiA9IHdzZGxEZWZpbml0aW9uOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIGRlZjsNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gZCAgdGhlIFdTREw0SiBEZWZpbml0aW9uIG9iamVjdA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvblRvV3JhcChEZWZpbml0aW9uIGQpIHsNCi0gICAgICAgIHdzZGxEZWZpbml0aW9uID0gZDsNCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgbG9jYXRpb24gZm9yIHRoZSBXU0RMNEogRGVmaW5pdGlvbiBvYmplY3QgdGhhdCBpcyBiZWluZyB3cmFwcGVkDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb24oU3RyaW5nIHVyaUxvY2F0aW9uKSB7DQotICAgICAgICBpZiAodXJpTG9jYXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIHdzZGxVUkwgPSBuZXcgVVJMKHVyaUxvY2F0aW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIC8vIHRvZG8NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIGZvciB0aGUgV1NETDRKIERlZmluaXRpb24gb2JqZWN0IHRoYXQgaXMgYmVpbmcgd3JhcHBlZA0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKSB7DQotICAgICAgICBpZiAod3NkbFVSTCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHdzZGxVUkwudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotDQotICAgIC8qKg0KLSAgICAgKiBDbG9zZXMgdGhlIHVzZSBvZiB0aGUgd3JhcHBlciBpbXBsZW1lbnRhdGlvbiBhbmQgYWxsb3dzIA0KLSAgICAgKiBpbnRlcm5hbCByZXNvdXJjZXMgdG8gYmUgcmVsZWFzZWQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsNCi0gICAgICAgIC8vIFRPRE8gcmVsZWFzZSB0ZW1wb3JhcnkgZmlsZXMNCi0gICAgfQ0KLQ0KLQ0KLQ0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gamF2YXgud3NkbC5EZWZpbnRpb24gaW50ZXJmYWNlIG1ldGhvZHMNCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50QmFzZVVSSShTdHJpbmcgZCkgew0KLQ0KLSAgICAgICAgLy8gU2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldERvY3VtZW50QmFzZVVSSSgiICsgZCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkoZCk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRCYXNlVVJJKCkgew0KLQ0KLSAgICAgICAgLy8gR2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLg0KLSAgICAgICAgLy8gVGhpcyBpZGVudGlmaWVzIHRoZSBvcmlnaW4gb2YgdGhlIERlZmluaXRpb24uDQotICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgVVJJIG9mIHRoZSBiYXNlIGRvY3VtZW50LCBub3QgdGhlIGltcG9ydHMuDQotDQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldERvY3VtZW50QmFzZVVSSSgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLQ0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbikgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRRTmFtZSgiICsgbiArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRRTmFtZShuKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRRTmFtZSgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgUU5hbWUgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRRTmFtZSgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0NCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRUYXJnZXROYW1lc3BhY2UoIiArIHQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKHQpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotDQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGROYW1lc3BhY2UoIiArIHByZWZpeCArICIsICIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCwgbmFtZXNwYWNlVVJJKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyByZW1vdmVOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVOYW1lc3BhY2UoIiArIHByZWZpeCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24ucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXROYW1lc3BhY2UoIiArIHByZWZpeCArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQcmVmaXgoIiArIG5hbWVzcGFjZVVSSSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXROYW1lc3BhY2VzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXROYW1lc3BhY2VzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3QgZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE5hdGl2ZUF0dHJpYnV0ZU5hbWVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBMaXN0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0TmF0aXZlQXR0cmlidXRlTmFtZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlcyhUeXBlcyB0eXBlcykgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXRUeXBlcygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXRUeXBlcyh0eXBlcyk7DQotICAgICAgICB9IA0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgVHlwZXMgZ2V0VHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBUeXBlcyByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldFR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkSW1wb3J0KCIgKyBpbXBvcnREZWYgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkSW1wb3J0KGltcG9ydERlZik7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgcmVtb3ZlSW1wb3J0KEltcG9ydCBpbXBvcnREZWYpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlSW1wb3J0KCIgKyBpbXBvcnREZWYgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEltcG9ydCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLnJlbW92ZUltcG9ydChpbXBvcnREZWYpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0IGdldEltcG9ydHMoU3RyaW5nIG5hbWVzcGFjZVVSSSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRJbXBvcnRzKCIgKyBuYW1lc3BhY2VVUkkgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIExpc3QgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKG5hbWVzcGFjZVVSSSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRJbXBvcnRzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRJbXBvcnRzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkTWVzc2FnZSgiICsgbWVzc2FnZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5hZGRNZXNzYWdlKG1lc3NhZ2UpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0TWVzc2FnZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWVzc2FnZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldE1lc3NhZ2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1lc3NhZ2UgcmVtb3ZlTWVzc2FnZShRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlbW92ZU1lc3NhZ2UoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1lc3NhZ2UgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5yZW1vdmVNZXNzYWdlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0TWVzc2FnZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldE1lc3NhZ2VzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmFkZEJpbmRpbmcoIiArIGJpbmRpbmcgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkQmluZGluZyhiaW5kaW5nKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZyhRTmFtZSBuYW1lKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmdldEJpbmRpbmcoIiArIG5hbWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEJpbmRpbmcgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5nKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nIHJlbW92ZUJpbmRpbmcoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVCaW5kaW5nKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBCaW5kaW5nIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24ucmVtb3ZlQmluZGluZyhuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRCaW5kaW5ncygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0QmluZGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbEJpbmRpbmdzKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRBbGxCaW5kaW5ncygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0QWxsQmluZGluZ3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRQb3J0VHlwZSgiICsgcG9ydFR5cGUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgZ2V0UG9ydFR5cGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRQb3J0VHlwZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgUG9ydFR5cGUgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgcmVtb3ZlUG9ydFR5cGUoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZW1vdmVQb3J0VHlwZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgUG9ydFR5cGUgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5yZW1vdmVQb3J0VHlwZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldFBvcnRUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0UG9ydFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwIGdldEFsbFBvcnRUeXBlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QWxsUG9ydFR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNYXAgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRBbGxQb3J0VHlwZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5hZGRTZXJ2aWNlKCIgKyBzZXJ2aWNlICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmFkZFNlcnZpY2Uoc2VydmljZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoUU5hbWUgbmFtZSkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRTZXJ2aWNlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBTZXJ2aWNlIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZShuYW1lKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2VydmljZSByZW1vdmVTZXJ2aWNlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlU2VydmljZSgiICsgbmFtZSArICIpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgU2VydmljZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLnJlbW92ZVNlcnZpY2UobmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRTZXJ2aWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0U2VydmljZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE1hcCBnZXRBbGxTZXJ2aWNlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0QWxsU2VydmljZXMoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE1hcCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmdldEFsbFNlcnZpY2VzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3JnLnczYy5kb20uRWxlbWVudCBkb2NFbCkgew0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2NFbCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5FbGVtZW50IGdldERvY3VtZW50YXRpb25FbGVtZW50KCkgew0KLQ0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuICB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoIiArIGV4dEVsZW1lbnQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbWVudCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBMaXN0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJpbmRpbmcgY3JlYXRlQmluZGluZygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgQmluZGluZyByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ0ZhdWx0KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBCaW5kaW5nRmF1bHQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ0lucHV0IGNyZWF0ZUJpbmRpbmdJbnB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlQmluZGluZ0lucHV0KCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBCaW5kaW5nSW5wdXQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEJpbmRpbmdPdXRwdXQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEZhdWx0IGNyZWF0ZUZhdWx0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVGYXVsdCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgRmF1bHQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVGYXVsdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbXBvcnQgY3JlYXRlSW1wb3J0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVJbXBvcnQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEltcG9ydCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZUltcG9ydCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlSW5wdXQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIElucHV0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlSW5wdXQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVNZXNzYWdlKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBNZXNzYWdlIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVPcGVyYXRpb24oKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE9wZXJhdGlvbiByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZU9wZXJhdGlvbigpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5jcmVhdGVPdXRwdXQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIE91dHB1dCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZU91dHB1dCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBQYXJ0IGNyZWF0ZVBhcnQoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVBhcnQoKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIFBhcnQgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChoYXNCZWVuU2F2ZWQpIHsNCi0gICAgICAgICAgICAgICAgaGFzQmVlblVwZGF0ZWRTaW5jZVNhdmluZyA9IHRydWU7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFBvcnQgY3JlYXRlUG9ydCgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlUG9ydCgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgUG9ydCByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBvcnQoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVBvcnRUeXBlKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBQb3J0VHlwZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZVBvcnRUeXBlKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2UgY3JlYXRlU2VydmljZSgpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuY3JlYXRlU2VydmljZSgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgU2VydmljZSByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZVNlcnZpY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICByZXR1cm4gcmVzdWx0czsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgVHlwZXMgY3JlYXRlVHlwZXMoKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLmNyZWF0ZVR5cGVzKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBUeXBlcyByZXN1bHRzID0gbnVsbDsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLmNyZWF0ZVR5cGVzKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldEV4dGVuc2lvblJlZ2lzdHJ5KCIgKyBleHRSZWcgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RXh0ZW5zaW9uUmVnaXN0cnkoZXh0UmVnKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2lvblJlZ2lzdHJ5KCkgew0KLSAgICAgICAgaWYgKGlzRGVidWdFbmFibGVkKSB7DQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVzdWx0cyA9IG51bGw7DQotDQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJlc3VsdHMgPSB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSAiIjsNCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmVzdWx0cyA9IHdzZGxEZWZpbml0aW9uLnRvU3RyaW5nKCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotICAgIH0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIG90aGVyIEFic3RyYWN0V1NETEVsZW1lbnQgbWV0aG9kcw0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gICAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IHJlbW92ZUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoIiArIGV4dEVsZW1lbnQgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSB0cnVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24ucmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0RWxlbWVudCk7DQotICAgICAgICB9DQotICAgICAgICBkb25lVXNpbmdXcmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKFFOYW1lIG5hbWUpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKCIgKyBuYW1lICsgIikiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGdldFdyYXBwZWREZWZpbml0aW9uRm9yVXNlKCk7DQotDQotICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXAgZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIHsNCi0gICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpIik7DQotICAgICAgICB9DQotDQotICAgICAgICBnZXRXcmFwcGVkRGVmaW5pdGlvbkZvclVzZSgpOw0KLQ0KLSAgICAgICAgTWFwIHJlc3VsdHMgPSBudWxsOw0KLQ0KLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9IG51bGwpIHsNCi0gICAgICAgICAgICByZXN1bHRzID0gd3NkbERlZmluaXRpb24uZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgZG9uZVVzaW5nV3JhcHBlZERlZmluaXRpb24oKTsNCi0gICAgICAgIHJldHVybiByZXN1bHRzOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lLCBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7DQotICAgICAgICBpZiAoaXNEZWJ1Z0VuYWJsZWQpIHsNCi0gICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNldEV4dGVuc2lvbkF0dHJpYnV0ZSgiICsgbmFtZSArICIsICAiICsgdmFsdWUgKyAiKSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKTsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgaWYgKGhhc0JlZW5TYXZlZCkgew0KLSAgICAgICAgICAgICAgICBoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nID0gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RXh0ZW5zaW9uQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgIC8vIHByaXZhdGUgdXRpbGl0eSBtZXRob2RzDQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLQ0KLSAgICAvKioNCi0gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCB1dGlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZQ0KLSAgICAgKiBXU0RMIGRlZmluaXRpb24gYmVpbmcgd3JhcHBlZCBpcyBhdmFpbGFibGUgZm9yIA0KLSAgICAgKiB1c2UuICANCi0gICAgICogPFA+DQotICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgV1NETDRKIFdTREwgZGVmaW5pdGlvbiBvYmplY3QNCi0gICAgICogaGFkIGJlZW4gc2F2ZWQsIHRoaXMgd2lsbCByZWxvYWQgaXQuDQotICAgICAqLw0KLSAgICBwcml2YXRlIHZvaWQgZ2V0V3JhcHBlZERlZmluaXRpb25Gb3JVc2UoKSB7DQotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGxvYWRSZXNvdXJjZXMoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgYWNjZXNzQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgdXRpbGl0eSB0byBpbmRpY2F0ZSB0aGF0IHRoZQ0KLSAgICAgKiB1c2Ugb2YgV1NETCBkZWZpbml0aW9uIGhhcyBjb21wbGV0ZWQuIA0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSB2b2lkIGRvbmVVc2luZ1dyYXBwZWREZWZpbml0aW9uKCkgew0KLQ0KLSAgICAgICAgbG9uZyBhc3Nlc3NvcnMgPSBhY2Nlc3NDb3VudC5kZWNyZW1lbnRBbmRHZXQoKTsNCi0NCi0gICAgICAgIGlmIChhc3Nlc3NvcnMgPT0gMCkgew0KLSAgICAgICAgICAgIHJlbGVhc2VSZXNvdXJjZXMoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICAvKg0KLSAgICAgKiBSZWR1Y2VzIG1lbW9yeSBmb290cHJpbnQgb2YgdGhlIGluLW1lbW9yeSBjYWNoaW5nIG9mIHRoZSBXU0RMIGRlZmluaXRpb24NCi0gICAgICogYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MNCi0gICAgICoNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSZXNvdXJjZXMoKSB7DQotDQotICAgICAgICBib29sZWFuIHNhdmVkID0gc2F2ZSgpOw0KLQ0KLSAgICAgICAgaWYgKHNhdmVkKSB7DQotICAgICAgICAgICAgLy8gcmVsZWFzZSB0aGUgaW4tbWVtb3J5IGNvcHkgb2YgdGhlIFdTREw0SiANCi0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IG51bGw7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogTG9hZHMgdGhlIHRoZSBXU0RMIGRlZmluaXRpb24gYmFjayBpbnRvIG1lbW9yeQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgbG9hZFJlc291cmNlcygpIHsNCi0NCi0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiA9PSBudWxsKSB7DQotICAgICAgICAgICAgd3NkbERlZmluaXRpb24gPSByZXN0b3JlKCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgLyoqDQotICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IFdTREwgZGVmaW5pdGlvbiBvYmplY3QgdGhhdCB0aGlzIHdyYXBwZXIgY29udGFpbnMuDQotICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIG51bWJlciBvZiBjaGVja3MgdG8gZGV0ZXJtaW5lIGhvdyB0byBwcm9jZWVkIHdpdGgNCi0gICAgICogdGhlIHNhdmluZyBvZiB0aGUgV1NETCBkZWZpbml0aW9uIG9iamVjdCwgc28gdGhlIGNhbGxlciBzaG91bGQgbm90DQotICAgICAqIG5lZWQgdG8gbWFrZSBjaGVja3Mgb24gd2hldGhlciB0byBzYXZlIG9yIG5vdC4NCi0gICAgICogPFA+DQotICAgICAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSB3cmFwcGVkIFdTREwNCi0gICAgICogZGVmaW5pdGlvbiBvYmplY3QsIGZvciBleGFtcGxlLCBkZWNpZGluZyB3aGVuIHRvIHJlbGVhc2UNCi0gICAgICogaXQgb3IgcmVsb2FkIGl0Lg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBUcnVlIC0gaWYgdGhlIHNhdmUgc3VjY2VlZGVkDQotICAgICAqICAgICAgICAgRmFsc2UgLSBpZiB0aGUgc2F2ZSBmYWlsZWQNCi0gICAgICovDQotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlKCkgew0KLQ0KLSAgICAgICAgLy8gaWYgdGhlIHdzZGwgZGVmaW5pdG9uIGZhaWxlZCB0byBzZXJpYWxpemUgZnJvbSBhIHByZXZpb3VzIGF0dGVtcHQNCi0gICAgICAgIC8vIHRvIHNhdmUgaXQsIHRoZW4gZG9uJ3QgdHJ5IHRvIHNhdmUgaXQNCi0gICAgICAgIGlmIChzYWZlVG9TZXJpYWxpemUgPT0gZmFsc2UpIHsNCi0gICAgICAgICAgICAvLyBleGl0IHF1aWNrbHkNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCB3ZSB0aGluayBpdCBpcyBzYWZlIHRvIHByb2NlZWQgd2l0aCBzYXZpbmcgdGhlIA0KLSAgICAgICAgLy8gd3NkbCBkZWZpbml0aW9uDQotDQotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlcmUgaXMgYSBmaWxlIHRvIHVzZSBmb3Igc2F2aW5nIHRoZSB3c2RsIGRlZmluaXRpb24NCi0gICAgICAgIGlmIChzYXZlZERlZmluaXRpb25GaWxlID09IG51bGwpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBzYXZlZERlZmluaXRpb25GaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgid3NkbERlZl8iLCBudWxsKTsNCi0gICAgICAgICAgICAgICAgc2F2ZWRGaWxlbmFtZSA9IHNhdmVkRGVmaW5pdGlvbkZpbGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNhdmUoKTogdGVtcCBmaWxlID0gWyIgKyBzYXZlZEZpbGVuYW1lICsgIl0iKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNhdmUoKTogZXJyb3IgY3JlYXRpbmcgdGVtcCBmaWxlID0gWyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiXSIpOw0KLSAgICAgICAgICAgICAgICBzYXZlZERlZmluaXRpb25GaWxlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgc2F2ZWRGaWxlbmFtZSA9IG51bGw7DQotDQotICAgICAgICAgICAgICAgIC8vIGNhbid0IHNhdmUgdGhlIHdzZGwgZGVmaW5pdGlvbiBhdCB0aGlzIHRpbWUNCi0gICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgYWJsZSB0byBkbyBzbyBsYXRlcg0KLSAgICAgICAgICAgICAgICBoYXNCZWVuU2F2ZWQgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIGlmIChzYXZlZERlZmluaXRpb25GaWxlICE9IG51bGwpIHsNCi0NCi0gICAgICAgICAgICAvLyB0aGUgRmlsZSBvYmplY3QgZXhpc3RzLCBjaGVjayB0byBzZWUgaWYgdGhlIHdzZGwgZGVmaW5pdGlvbiBoYXMNCi0gICAgICAgICAgICAvLyBiZWVuIHByZXZpb3VzbHkgc2F2ZWQNCi0NCi0gICAgICAgICAgICBpZiAoaGFzQmVlblNhdmVkICYmICFoYXNCZWVuVXBkYXRlZFNpbmNlU2F2aW5nKSB7DQotICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2F2ZSBiZWNhdXNlIHdlIHNhdmVkIGl0IGFscmVhZHkNCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIHdlcmUgbm8gdXBkYXRlcyB0byB0aGUgd3NkbCBkZWZpbml0aW9uIG9iamVjdA0KLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgcHJldmlvdXMgc2F2ZQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgICAgICB9DQotDQotDQotICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAgICAgLy8gc2F2ZSB0byB0aGUgZmlsZQ0KLSAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsNCi0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0T2JqU3RyZWFtID0gbnVsbDsNCi0NCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAvLyBzZXR1cCBhbiBvdXRwdXQgc3RyZWFtIHRvIGEgcGh5c2ljYWwgZmlsZQ0KLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzYXZlZERlZmluaXRpb25GaWxlKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2Ygd3JpdGluZyBvYmplY3RzIHRvIHRoZSANCi0gICAgICAgICAgICAgICAgLy8gc3RyZWFtIGNvbm5lY3RlZCB0byB0aGUgZmlsZQ0KLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0gPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7DQotDQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBzYXZlIHRoZSB3c2RsIG9iamVjdA0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNhdmUoKTogc2F2aW5nIHRoZSB3c2RsIGRlZmluaXRpb24uLi4uLiIpOw0KLSAgICAgICAgICAgICAgICBvdXRPYmpTdHJlYW0ud3JpdGVPYmplY3Qod3NkbERlZmluaXRpb24pOw0KLQ0KLSAgICAgICAgICAgICAgICAvLyBjbG9zZSBvdXQgdGhlIHN0cmVhbXMNCi0gICAgICAgICAgICAgICAgb3V0T2JqU3RyZWFtLmZsdXNoKCk7DQotICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0uZmx1c2goKTsNCi0gICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7DQotDQotICAgICAgICAgICAgICAgIGhhc0JlZW5TYXZlZCA9IHRydWU7DQotICAgICAgICAgICAgICAgIGhhc0JlZW5VcGRhdGVkU2luY2VTYXZpbmcgPSBmYWxzZTsNCi0NCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5zYXZlKCk6IC4uLi5zYXZlZCB0aGUgd3NkbCBkZWZpbml0aW9uLi4uLi4iKTsNCi0NCi0gICAgICAgICAgICAgICAgbG9uZyBmaWxlc2l6ZSA9IHNhdmVkRGVmaW5pdGlvbkZpbGUubGVuZ3RoKCk7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiBmaWxlIHNpemUgYWZ0ZXIgc2F2ZSBbIiArIGZpbGVzaXplICsNCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSAgIHRlbXAgZmlsZSA9IFsiICsgc2F2ZWRGaWxlbmFtZSArICJdIik7DQotDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiBlbmQgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSIpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpIHsNCi0gICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgZnV0dXJlIHRyaWVzIGF0IHNhdmluZyB0aGlzIFdTREwgZGVmaW5pdGlvbiBvYmplY3QNCi0gICAgICAgICAgICAgICAgc2FmZVRvU2VyaWFsaXplID0gZmFsc2U7DQotDQotICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGZpbGUgY2Fubm90IGJlIHVzZWQgdG8gcmVzdG9yZSBmcm9tDQotICAgICAgICAgICAgICAgIGhhc0JlZW5TYXZlZCA9IGZhbHNlOw0KLQ0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnNhdmUoKTogZXJyb3Igd2l0aCBzYXZpbmcgdGhlIHdzZGwgZGVmaW5pdGlvbiA9IFsiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICBleDIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIDogIiArIGV4Mi5nZXRNZXNzYWdlKCkgKyAiXSIsIGV4Mik7DQotDQotDQotICAgICAgICAgICAgICAgIGlmIChzYXZlZERlZmluaXRpb25GaWxlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREZWZpbml0aW9uRmlsZS5kZWxldGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERlZmluaXRpb25GaWxlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZEZpbGVuYW1lID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgaWYgKG91dE9ialN0cmVhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ialN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICBpZiAob3V0U3RyZWFtICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3RyZWFtLmNsb3NlKCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGFic29yYiBpdA0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIuc2F2ZSgpOiBlcnJvciBleGl0IC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogUmVzdG9yZXMgdGhlIFdTREwgZGVmaW5pdGlvbiBmcm9tIGEgcHJldmlvdXNseSBzYXZlZCBjb3B5Lg0KLSAgICAgKiA8UD4NCi0gICAgICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIHdyYXBwZWQgV1NETA0KLSAgICAgKiBkZWZpbml0aW9uIG9iamVjdCwgZm9yIGV4YW1wbGUsIGRlY2lkaW5nIHdoZW4gdG8gcmVsZWFzZQ0KLSAgICAgKiBpdCBvciByZWxvYWQgaXQuDQotICAgICAqIA0KLSAgICAgKiBAcmV0dXJuIFRoZSByZXN0b3JlZCBXU0RMIGRlZmluaXRpb24gb2JqZWN0LCBvciBOVUxMDQotICAgICAqLw0KLSAgICBwcml2YXRlIERlZmluaXRpb24gcmVzdG9yZSgpIHsNCi0NCi0gICAgICAgIGlmICghaGFzQmVlblNhdmVkKSB7DQotICAgICAgICAgICAgLy8gdGhlIHdzZGwgZGVmaW50aW9uIGhhcyBub3QgYmVlbiBzYXZlZCwgb3IgdGhlIHByZXZpb3VzIHNhdmVkIHZlcnNpb24NCi0gICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHNvbWUgcmVhc29uDQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAoc2F2ZWREZWZpbml0aW9uRmlsZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgLy8gbm8gZmlsZSB0byByZXN0b3JlIGZyb20NCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgICAgICAgLy8gcmVzdG9yZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZQ0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICBEZWZpbml0aW9uIHJlc3RvcmVkRGVmaW5pdGlvbiA9IG51bGw7DQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOw0KLSAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gaW5PYmpTdHJlYW0gPSBudWxsOw0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAvLyBzZXR1cCBhbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGZpbGUNCi0gICAgICAgICAgICBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2F2ZWREZWZpbml0aW9uRmlsZSk7DQotDQotICAgICAgICAgICAgLy8gYXR0YWNoIGEgc3RyZWFtIGNhcGFibGUgb2YgcmVhZGluZyBvYmplY3RzIGZyb20gdGhlIA0KLSAgICAgICAgICAgIC8vIHN0cmVhbSBjb25uZWN0ZWQgdG8gdGhlIGZpbGUNCi0gICAgICAgICAgICBpbk9ialN0cmVhbSA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShpblN0cmVhbSk7DQotDQotICAgICAgICAgICAgLy8gdHJ5IHRvIHJlc3RvcmUgdGhlIHdyYXBwZWQgd3NkbCBkZWZpbml0aW9uDQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZXN0b3JlKCk6IHJlc3RvcmluZyB0aGUgV1NETCBkZWZpbml0aW9uIC4uLi4uIik7DQotDQotICAgICAgICAgICAgcmVzdG9yZWREZWZpbml0aW9uID0gKERlZmluaXRpb24pIGluT2JqU3RyZWFtLnJlYWRPYmplY3QoKTsNCi0gICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgICAgIGluU3RyZWFtLmNsb3NlKCk7DQotDQotICAgICAgICAgICAgbG9nLmRlYnVnKG15Q2xhc3NOYW1lICsgIi5yZXN0b3JlKCk6IC4uLi5yZXN0b3JlZCB0aGUgV1NETCBkZWZpbml0aW9uIC4uLi4uIik7DQotDQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Mikgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhteUNsYXNzTmFtZSArICIucmVzdG9yZSgpOiBlcnJvciB3aXRoIHJlc3RvcmluZyB0aGUgV1NETCBkZWZpbml0aW9uID0gWyIgKw0KLSAgICAgICAgICAgICAgICAgICAgZXgyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiA6ICIgKyBleDIuZ2V0TWVzc2FnZSgpICsgIl0iLCBleDIpOw0KLQ0KLSAgICAgICAgICAgIGlmIChpbk9ialN0cmVhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICBpbk9ialN0cmVhbS5jbG9zZSgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgaXQNCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoaW5TdHJlYW0gIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIGl0DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotDQotICAgICAgICBsb2cuZGVidWcobXlDbGFzc05hbWUgKyAiLnJlc3RvcmUoKTogZW5kIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0iKTsNCi0gICAgICAgIHJldHVybiByZXN0b3JlZERlZmluaXRpb247DQotDQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL091dEhhbmRsZXJUZXN0LnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9PdXRIYW5kbGVyVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjZkNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL091dEhhbmRsZXJUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyIgeG1sbnM6bXlSZWY9Imh0dHA6Ly9yZWZlcmVuY2Uub3JnIj4KLSAgICAgICAgPHdzYTpGcm9tPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cuZnJvbS5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPgotICAgICAgICAgICAgPHdzYTpSZWZlcmVuY2VQYXJhbWV0ZXJzPgotICAgICAgICAgICAgICAgIDxSZWZlcmVuY2UyPlZhbHVlIDIwMDwvUmVmZXJlbmNlMj4KLSAgICAgICAgICAgIDwvd3NhOlJlZmVyZW5jZVBhcmFtZXRlcnM+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgICAgIDx3c2E6VG8+aHR0cDovL3d3dy50by5vcmcvc2VydmljZS88L3dzYTpUbz4KLSAgICAgICAgPHdzYTpNZXNzYWdlSUQ+MTIzNDU2LTc4OTA8L3dzYTpNZXNzYWdlSUQ+Ci0gICAgICAgIDxteVJlZjpSZWZlcmVuY2U0PlZhbHVlIDQwMDwvbXlSZWY6UmVmZXJlbmNlND4KLSAgICAgICAgPG15UmVmOlJlZmVyZW5jZTM+VmFsdWUgMzAwPC9teVJlZjpSZWZlcmVuY2UzPgotICAgICAgICA8d3NhOlNlcnZpY2VOYW1lIHdzYTpQb3J0TmFtZT0icG9ydCI+c2VydmljZU5TOlNlcnZpY2U8L3dzYTpTZXJ2aWNlTmFtZT4KLSAgICAgICAgPHdzYTpQb3J0VHlwZT5wb3J0TlM6UG9ydDwvd3NhOlBvcnRUeXBlPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3d3LmFjdGlvbnMub3JnL2FjdGlvbjwvd3NhOkFjdGlvbj4KLSAgICAgICAgPHdzYTpSZXBseVRvPgotICAgICAgICAgICAgPHdzYTpBZGRyZXNzPmh0dHA6Ly93d3cucmVwbHlUby5vcmcvc2VydmljZS88L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpSZXBseVRvPgotICAgICAgICA8d3NhOlJlbGF0ZXNUbyB3c2E6UmVsYXRpb25zaGlwVHlwZT0iVGVzdFJlbGF0aW9uIj5odHRwOi8vd3d3LnJlbGF0ZXNUby5vcmcvc2VydmljZS88L3dzYTpSZWxhdGVzVG8+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5Pjwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9QaW5nU2VydmljZS53c2RsIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL1BpbmdTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjZiZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL1BpbmdTZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gV1NETCBkZXNjcmlwdGlvbiBvZiB0aGUgV1NTIFBpbmcgaW50ZXJvcCBzY2VuYXJpb3MgLS0+Ci0KLTxkZWZpbml0aW9ucyBuYW1lPSJQaW5nIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgeG1sbnM6dG5zPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLSAgPHR5cGVzPgotICAgIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0icGluZyI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJwaW5nUmVzcG9uc2UiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQaW5nIiB0eXBlPSJ0bnM6cGluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iUGluZ1Jlc3BvbnNlIiB0eXBlPSJ0bnM6cGluZ1Jlc3BvbnNlIi8+Ci0gICAgPC9zY2hlbWE+Ci0gIDwvdHlwZXM+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iUGluZ1JlcXVlc3QiPgotICAgIDxwYXJ0IG5hbWU9InBpbmciIGVsZW1lbnQ9InRuczpQaW5nIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9InBpbmdSZXNwb25zZSIgZWxlbWVudD0idG5zOlBpbmdSZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPHBvcnRUeXBlIG5hbWU9IlBpbmdQb3J0Ij4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgPGlucHV0ICBtZXNzYWdlPSJ0bnM6UGluZ1JlcXVlc3QiLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotCi0gIDxiaW5kaW5nIG5hbWU9IlBpbmdCaW5kaW5nIiB0eXBlPSJ0bnM6UGluZ1BvcnQiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiCi1zdHlsZT0iZG9jdW1lbnQiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPGlucHV0PiA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPjwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+PC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L2JpbmRpbmc+Ci0KLSAgPHNlcnZpY2UgbmFtZT0iUGluZ1NlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IlBpbmdQb3J0IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9QaW5nU2VydmljZSIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwby9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiZjkwZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPnRydWU8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VyYWxpemVMb2NhdGlvbiI+LjwvcGFyYW1ldGVyPgotICAgIDxob3N0Q29uZmlndXJhdGlvbj4KLSAgICAgICAgPGlwPjEyNy4wLjAuMTwvaXA+Ci0gICAgICAgIDxwb3J0PjU1NTU8L3BvcnQ+Ci0gICAgPC9ob3N0Q29uZmlndXJhdGlvbj4KLQotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwby9tb2R1bGVzL21vZHVsZTEvTUVUQS1JTkYvbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8vbW9kdWxlcy9tb2R1bGUxL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NmNmZmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwby9tb2R1bGVzL21vZHVsZTEvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxtb2R1bGUgbmFtZT0ibW9kdWxlMSI+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDEiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8T3V0RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZhdWx0Rmxvdz4KLQotICAgIDxJbkZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmF1bHRGbG93PgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJjcmVhdFNlcSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICA8L29wZXJhdGlvbj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8vc2VydmljZXMvTWVzc2FnZXRlc3RTZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8vc2VydmljZXMvTWVzc2FnZXRlc3RTZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4YTg2Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3RSZXBvL3NlcnZpY2VzL01lc3NhZ2V0ZXN0U2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08c2VydmljZSBuYW1lPSIiPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgdGVzdGluZyBzZXJ2aWNlICwgdG8gdGVzdCB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgb3Igbm90Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgIDxtb2R1bGUgcmVmPSJtb2R1bGUxIi8+Ci0gICAgICAgIDxtZXNzYWdlIGxhYmVsPSJJbiI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2VJTiI+bWVzc2FnZUlOPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvbWVzc2FnZT4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgIDxtZXNzYWdlIGxhYmVsPSJJbiI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2VJTiI+bWVzc2FnZUlOPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgPG1lc3NhZ2UgbGFiZWw9Ik91dCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lc3NhZ2VPdXQiPm1lc3NhZ2VPdXQ8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9tZXNzYWdlPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZENvbmZpZ09yZGVyQ2hhbmdlL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZENvbmZpZ09yZGVyQ2hhbmdlL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0YTIzMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRDb25maWdPcmRlckNoYW5nZS9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjA8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb3N0RGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQmFkU2VydmVyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0JhZFNlcnZlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODlkYWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQmFkU2VydmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEiIGxvY2tlZD0ieHNkOnRydWUiPjEwPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMiI+Q29sb21ibzwvcGFyYW1ldGVyPgotICAgIDxoYW5kbGVyIG5hbWU9ImgxIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgPG9yZGVyIHBoYXNlPSJwMSIgcGhhc2VGaXJzdD0idHJ1ZSIvPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICA8L2hhbmRsZXI+Ci0gICAgPGhhbmRsZXIgbmFtZT0iaDIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiLz4KLSAgICA8bW9kdWxlIHJlZj0ibW9kdWxlMSI+IDwvbW9kdWxlPgotICAgIDwhLS0KLSAgICAgIDxtb2R1bGUgcmVmPSJ1cmkiPgotICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTMiIGxvY2tlZD0ieHNkOnRydWUiPjEwPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhNCI+TFNGPC9wYXJhbWV0ZXI+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgLS0+Ci0gICAgPHBoYXNlT3JkZXI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJnbG9iYWwiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9InRyYW5zcG9ydCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0ibW9kdWxlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJzZXJ2aWNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxnb29sPgotICAgICAgICBub3QgZ29vZAotICAgIDwvZ29vbD4KLTwvYXhpc2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRtb2R1bGUueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQmFkbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhYjFhZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRtb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9Im1vZHVsZTEiIGNsYXNzPSJtb2R1bGUxLmphdmEiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEyMyIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmEyNDUiPkNvbG9tYm88L3BhcmFtZXRlcj4KLSAgICA8IS0tICBNb2R1bGUgVHlwZU1hcHBpbmcgLS0+Ci0gICAgPHR5cGVNYXBwaW5nPlR5cGUgbWFwcHBpbmcgc2hvdWxkIGNvbWUgaGVyZTwvdHlwZU1hcHBpbmc+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDEiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMSIgcGhhc2VGaXJzdD0idHJ1ZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciIvPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0icDIiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDYiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9GYXVsdEZsb3c+Ci0KLQotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ2xhc3NwYXRoTW9kdWxlL01FVEEtSU5GL21vZHVsZS54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DbGFzc3BhdGhNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1NThjYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DbGFzc3BhdGhNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJjbGFzc3BhdGhNb2R1bGUiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29sb3IiPmJsdWU8L3BhcmFtZXRlcj4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ29uZmlnV2l0aE9ic2VydmVycy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9Db25maWdXaXRoT2JzZXJ2ZXJzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0MzdiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9Db25maWdXaXRoT2JzZXJ2ZXJzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkF4aXNPYnNlcnZlckltcGwiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+Ci0gICAgPC9saXN0ZW5lcj4KLQotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi0gICAgCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmcKLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyUmVwby9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTVhZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gbWlsbGlzZWNvbmRzLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDAwMDwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+Ci0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4cGNldGlvbi0tPgotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPgotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+Ci0KLQotCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+Ci0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4KLQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3RpbmdpdXNoIHRob3NlIGVuZHBvaW50cy0tPgotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gSWYgeW91IGhhdmUgYSBmcm9udGVuZCBob3N0IHdoaWNoIGV4cG9zZXMgdGhpcyB3ZWJzZXJ2aWNlIHVzaW5nIGEgZGlmZmVyZW50IHB1YmxpYyBVUkwgIC0tPgotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaHR0cEZyb250ZW5kSG9zdFVybCI+aHR0cHM6Ly9zb21lb3RoZXJob3N0L2NvbnRleHQ8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPgotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLk11bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPgotCi0gICAgPCEtLSBUZXN0IGN1c3RvbSBkZXBsb3ltZW50IGJ5IHJlZ2lzdGVyaW5nIGZvciAic3ZjIiBmaWxlcywgYW5kIHRoZSAid2lkZ2V0cyIgZGlyIC0tPgotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5zdmMiIGRpcmVjdG9yeT0id2lkZ2V0cyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuZGVwbG95ZXJzLkN1c3RvbURlcGxveWVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlQnVpbGRlcnM+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlciIvPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4KLQotICAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDwhLS08bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPi0tPgotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ2x1c3RlcmluZyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29uZmlndXJlIGFuZCB1bmNvbW1lbnQgZm9sbG93aW5nIGZvciBwcmVwYXJpbmcgQXhpczIgdG8gYSBjbHVzdGVyZWQgZW52aXJvbm1lbnQgLS0+Ci0gICAgPCEtLQotICAgIDxjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbTEiPnZhbHVlMTwvcGFyYW1ldGVyPgotICAgIAk8Y29uZmlndXJhdGlvbk1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLlRyaWJlc0NvbmZpZ3VyYXRpb25NYW5hZ2VyIj4KLSAgICAJICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIiLz4KLSAgICAJPC9jb25maWd1cmF0aW9uTWFuYWdlcj4KLSAgICAJPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29udGV4dC5UcmliZXNDb250ZXh0TWFuYWdlciI+Ci0gICAgCSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyIi8+Ci0gICAgCTwvY29udGV4dE1hbmFnZXI+Ci0gICAgPC9jbHVzdGVyPgotICAgIC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL3NlcnZpY2VzL2dlb3JnZS5zdmMgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vc2VydmljZXMvZ2VvcmdlLnN2YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlNDE1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8vc2VydmljZXMvZ2VvcmdlLnN2YworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgaXMgYSBjdXN0b20gc2VydmljZSBkZXBsb3ltZW50IGluIHRoZSBzZXJ2aWNlcy8gZGlyZWN0b3J5LiAgSXRzIG5hbWUgaXMgR2VvcmdlLg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0N1c3RvbURlcGxveWVyUmVwby93aWRnZXRzL21hcnkuc3ZjIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL3dpZGdldHMvbWFyeS5zdmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjBmMDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJSZXBvL3dpZGdldHMvbWFyeS5zdmMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGlzIGEgY3VzdG9tIHNlcnZpY2UgZGVwbG95bWVudCBpbiB0aGUgd2lkZ2V0cy8gZGlyZWN0b3J5LiAgSXRzIG5hbWUgaXMgTWFyeS4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9PcF9vdmVyaWRlX1NlcnZpY2VfcGFyYS54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9PcF9vdmVyaWRlX1NlcnZpY2VfcGFyYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2NjN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vT3Bfb3ZlcmlkZV9TZXJ2aWNlX3BhcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTZXJ2aWNlMSI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlcCIgbG9ja2VkPSJ0cnVlIj5vcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlUGFyYTIiIGxvY2tlZD0idHJ1ZSI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlcCIgbG9ja2VkPSJ0cnVlIj52YWx1ZTwvcGFyYW1ldGVyPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxOTE0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLQotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VQYXJhMSI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZVBhcmEyIiBsb2NrZWQ9InRydWUiPnRydWU8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibW9kdWxlUGFyYTEiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZHVsZVBhcmEyIiBsb2NrZWQ9InRydWUiPnRydWU8L3BhcmFtZXRlcj4KLQotICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL21vZHVsZV9vdmVyaWRlX2dsb2JhbF9ub25fbG9ja2VkX3BhcmEueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vbW9kdWxlX292ZXJpZGVfZ2xvYmFsX25vbl9sb2NrZWRfcGFyYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MTVkMzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vbW9kdWxlX292ZXJpZGVfZ2xvYmFsX25vbl9sb2NrZWRfcGFyYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0ibW9kdWxlMSIgY2xhc3M9Im9yZy5hcGFjaGUubW9kdWxlLk1vZHVsZTFJbXBsIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZHVsZVBhcmExIiBsb2NrZWQ9InRydWUiPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL21vZHVsZV9vdmVyaWRlX2xvY2tlZF9wYXJhLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL21vZHVsZV9vdmVyaWRlX2xvY2tlZF9wYXJhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmZGZmNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9tb2R1bGVfb3ZlcmlkZV9sb2NrZWRfcGFyYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0ibW9kdWxlMSIgY2xhc3M9Im9yZy5hcGFjaGUubW9kdWxlLk1vZHVsZTFJbXBsIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9Im1vZHVsZVBhcmEyIiBsb2NrZWQ9InRydWUiPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvL29wX292ZXJpZGVfZ2xvYmFsX3BhcmEueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vb3Bfb3ZlcmlkZV9nbG9iYWxfcGFyYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZmEyMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vb3Bfb3ZlcmlkZV9nbG9iYWxfcGFyYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNlcnZpY2UxIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSB0ZXN0aW5nIHNlcnZpY2UgLCB0byB0ZXN0IHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvciBub3QKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZVBhcmEyIiBsb2NrZWQ9InRydWUiPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZVBhcmEyIiBsb2NrZWQ9InRydWUiPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmVjaG8uRWNob0ltcGw8L3BhcmFtZXRlcj4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9zZXJ2aWNlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vc2VydmljZV9vdmVyaWRlX2xvY2tlZF9wYXJhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5YmE4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9zZXJ2aWNlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTZXJ2aWNlMSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgdGVzdGluZyBzZXJ2aWNlICwgdG8gdGVzdCB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgb3Igbm90Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VQYXJhMiIgbG9ja2VkPSJ0cnVlIj5vcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvLkVjaG9JbXBsPC9wYXJhbWV0ZXI+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvUGFyYUxvY2tlZFJlcG8vc2VydmljZV9vdmVyaWRlX25vbl9sb2NrZWRfcGFyYS54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9zZXJ2aWNlX292ZXJpZGVfbm9uX2xvY2tlZF9wYXJhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyZGQ3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9QYXJhTG9ja2VkUmVwby9zZXJ2aWNlX292ZXJpZGVfbm9uX2xvY2tlZF9wYXJhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU2VydmljZTEiPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBhIHRlc3Rpbmcgc2VydmljZSAsIHRvIHRlc3QgdGhlIHN5c3RlbSBpcyB3b3JraW5nIG9yIG5vdAotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlUGFyYTEiIGxvY2tlZD0idHJ1ZSI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1N5c3RlbVBoYXNlUmVtb3ZlL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1N5c3RlbVBoYXNlUmVtb3ZlL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2Y2I4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9TeXN0ZW1QaGFzZVJlbW92ZS9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAKLSAgICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4wPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0SW4iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWJmMmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkZhdm9yaXRlQ29sb3IiPnB1cnBsZTwvcGFyYW1ldGVyPgotCi0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIAotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLQotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9heGlzMl9hLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2F4aXMyX2EueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjc1ZWFiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2F4aXMyX2EueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgcmVkdWN0aW9uIG9mIHRoZSBpbi1tZW1vcnkgY2FjaGUgb2YgV1NETCBkZWZpbml0aW9ucyAtLT4NCi0gICAgPCEtLUluIHNvbWUgc2VydmVyIGVudmlyb25tZW50cywgdGhlIGF2YWlsYWJsZSBtZW1vcnkgaGVhcCBpcyBsaW1pdGVkIGFuZCBjYW4gZmlsbCB1cCB1bmRlciBsb2FkIC0tPg0KLSAgICA8IS0tU2luY2UgaW4tbWVtb3J5IGNvcGllcyBvZiBXU0RMIGRlZmluaXRpb25zIGNhbiBiZSBsYXJnZSwgc29tZSBzdGVwcyBjYW4gYmUgdGFrZW4tLT4NCi0gICAgPCEtLXRvIHJlZHVjZSB0aGUgbWVtb3J5IG5lZWRlZCBmb3IgdGhlIGNhY2hlZCBXU0RMIGRlZmluaXRpb25zLiAtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJyZWR1Y2VXU0RMTWVtb3J5Q2FjaGUiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJyZWR1Y2VXU0RMTWVtb3J5VHlwZSI+MTwvcGFyYW1ldGVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgPCEtLVRoaXMgd2lsbCBnaXZlIG91dCB0aGUgdGltb3V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHRzLCBpbiBtaWxsaXNlY29uZHMtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJDb25maWdDb250ZXh0VGltZW91dEludGVydmFsIj4zMDAwMDwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrIHRyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+DQotICAgIDwhLS10aGF0IGJlaGF2aW9yLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi0tPg0KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4NCi0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPg0KLSAgICA8IS0taXMgc2V0LCB0aGVuIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1QT0pPIGRlcGxveWVyICwgdGhpcyB3aWxsIGFsb3cgdXNlcnMgdG8gZHJvcCAuY2xhc3MgZmlsZSBhbmQgbWFrZSB0aGF0IGludG8gYSBzZXJ2aWNlLS0+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5jbGFzcyIgZGlyZWN0b3J5PSJwb2pvIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlBPSk9EZXBsb3llciIvPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuanNhIiBkaXJlY3Rvcnk9InJtaXNlcnZpY2VzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LlJNSVNlcnZpY2VEZXBsb3llciIvPg0KLSAgICANCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBkZWFmdWx0IE1lc3NhZ2VSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+DQotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4NCi0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+DQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJyaWRlIHRoaXMgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+DQotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+DQotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPg0KLQ0KLQ0KLQ0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGhhc2VzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+DQotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLQ0KLTwvYXhpc2NvbmZpZz4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9idWlsZGVyU2VsZWN0b3JUZXN0L2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGQ4MDQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPgotCi0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5naXVzaCB0aG9zZSBlbmRwb2ludHMtLT4KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+Ci0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tU2V0IHRoZSBmbGFnIHRvIHRydWUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRyYW5zcG9ydCBsZXZlbCBzZXNzaW9uIG1hbmdtZW50LS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VUcmFuc3BvcnRTZXNzaW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUZvbGxvd2luZyB0d28gcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgdG8gaGFuZGxlIFJFU1QgaW4gQXhpczIuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgbWFrZSBBeGlzMiB0byBoYXZlIHR3by0tPgotICAgIDwhLS1kaWZmZXJlbnQgZW5kcG9pbnRzLCBvbmUgZm9yIFJFU1QgKEF4aXNSRVNUU2VydmxldCkgb25lIGZvciBTT0FQIG1lc3NhZ2UgaGFuZGxpbmcgKEF4aXNTZXJ2bGV0KS4gQnV0IGZvbGxvd2luZy0tPgotICAgIDwhLS1wYXJhbWV0ZXJzIGhlbHAgdG8gdHdlYWsgdGhlIG1lc3NhZ2UgaGFuZGxpbmcgb2YgdHdvIG1haW4gc2VydmxldHMuIC0tPgotCi0gICAgPCEtLSBJZiB0aGUgZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCBpcyB0cnVlLCB0aGVuIEF4aXMyTWFpblNlcnZsZXQgd2lsbCBoYW5kbGUgYm90aCBTT0FQIGFuZCBSRVNUIG1lc3NhZ2VzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gYm90aCB0aGUgc2VydmxldHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBzZXBhcmF0ZSBzZXJ2bGV0IHdlIGhhdmUgZm9yIFJFU1QgaGFuZGxpbmcuIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNlcGFyYXRlRW5kcG9pbnRGb3JSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlQnVpbGRlcnM+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0idGV4dC94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlciIvPgotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij44MDgwPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6Ci0gICAgICAgICAgICBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gb24gKGRlZmF1bHQgNjA2MCkKLSAgICAgICAgICAgIGhvc3RuYW1lOiAgaWYgbm9uLW51bGwsIHVybCBwcmVmaXggdXNlZCBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgbnVsbCkKLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikKLSAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0OiAgdmFsdWUgaW4gbWlsbGlzIG9mIHRpbWUgdGhhdCByZXF1ZXN0cyBjYW4gd2FpdCBmb3IgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMjAwMDApCi0gICAgICAgICAgICByZXF1ZXN0VGNwTm9EZWxheTogIHRydWUgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgYW5kIG1pbmltaXplIGxhdGVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMKLSAgICAgICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyAodW5sZXNzIHF1ZXVlIGZpbGxzIHVwKSAgKGRlZmF1bHQgMjUpCi0gICAgICAgICAgICByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBpZiBxdWV1ZSBmaWxscyB1cyAgICAgICAgIChkZWZhdWx0IDE1MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5Ci0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lOiAgdGltZSB0byBrZWVwIHRocmVhZHMgaW4gZXhjZXNzIG9mIGNvcmUgc2l6ZSBhbGl2ZSB3aGlsZSBpbmFjdGl2ZSAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDE4MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgbm8gc3VjaCB0aHJlYWRzIGNhbiBleGlzdCB3aXRoIGRlZmF1bHQgdW5ib3VuZGVkIHJlcXVlc3QgcXVldWUKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykKLSAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgICAgICAgICAgICAgICAgID5odHRwOi8vd3d3Lm15QXBwLmNvbS93czwvcGFyYW1ldGVyPiAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Im9yaWdpblNlcnZlciIgICAgICAgICAgICAgPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRpbWVvdXQiICAgICAgICAgICA+MTAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGNwTm9EZWxheSIgICAgICAgID5mYWxzZTwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUiPjUwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIiA+MTAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lIiAgICAgID4yNDAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWVVbml0IiAgPk1JTExJU0VDT05EUzwvcGFyYW1ldGVyPiAgICAgICAgICAgIC0tPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0gICAgCi0JPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPgotICAgIDwhLS10cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXItLT4+Ci0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4KLSAgICAgICAgPCEtLXVuY29tbWV0IGZvbGxvd2luZyBwYXJhbXRlciAsIGFuZCBzZXQgYXMgeW91IHJlcXVpcmVkLi0tPgotICAgICAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+dGNwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAvdHJhbnNwb3J0UmVjZWl2ZXIgLS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9idWlsZGVyU2VsZWN0b3JUZXN0L2JhZC1heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9idWlsZGVyU2VsZWN0b3JUZXN0L2JhZC1heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTM0YWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvYnVpbGRlclNlbGVjdG9yVGVzdC9iYWQtYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPgotCi0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5naXVzaCB0aG9zZSBlbmRwb2ludHMtLT4KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+Ci0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tU2V0IHRoZSBmbGFnIHRvIHRydWUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRyYW5zcG9ydCBsZXZlbCBzZXNzaW9uIG1hbmdtZW50LS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VUcmFuc3BvcnRTZXNzaW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUZvbGxvd2luZyB0d28gcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgdG8gaGFuZGxlIFJFU1QgaW4gQXhpczIuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgbWFrZSBBeGlzMiB0byBoYXZlIHR3by0tPgotICAgIDwhLS1kaWZmZXJlbnQgZW5kcG9pbnRzLCBvbmUgZm9yIFJFU1QgKEF4aXNSRVNUU2VydmxldCkgb25lIGZvciBTT0FQIG1lc3NhZ2UgaGFuZGxpbmcgKEF4aXNTZXJ2bGV0KS4gQnV0IGZvbGxvd2luZy0tPgotICAgIDwhLS1wYXJhbWV0ZXJzIGhlbHAgdG8gdHdlYWsgdGhlIG1lc3NhZ2UgaGFuZGxpbmcgb2YgdHdvIG1haW4gc2VydmxldHMuIC0tPgotCi0gICAgPCEtLSBJZiB0aGUgZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCBpcyB0cnVlLCB0aGVuIEF4aXMyTWFpblNlcnZsZXQgd2lsbCBoYW5kbGUgYm90aCBTT0FQIGFuZCBSRVNUIG1lc3NhZ2VzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gYm90aCB0aGUgc2VydmxldHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBzZXBhcmF0ZSBzZXJ2bGV0IHdlIGhhdmUgZm9yIFJFU1QgaGFuZGxpbmcuIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNlcGFyYXRlRW5kcG9pbnRGb3JSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPgotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPgotICAgIDxtZXNzYWdlQnVpbGRlcnM+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vanNvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5Gb29CdWlsZGVyIi8+Ci0gICAgPC9tZXNzYWdlQnVpbGRlcnM+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjgwODA8L3BhcmFtZXRlcj4KLSAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZSBzZXR0aW5ncyBmdXJ0aGVyIGJlbG93KToKLSAgICAgICAgICAgIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdCA2MDYwKQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQotICAgICAgICAgICAgb3JpZ2luU2VydmVyOiAgdmFsdWUgb2YgaHR0cCBTZXJ2ZXIgaGVhZGVyIGluIG91dGdvaW5nIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiU2ltcGxlLVNlcnZlci8xLjEiKQotICAgICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6ICB2YWx1ZSBpbiBtaWxsaXMgb2YgdGltZSB0aGF0IHJlcXVlc3RzIGNhbiB3YWl0IGZvciBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAyMDAwMCkKLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdG8gbWluaW1pemUgYmFuZHdpZHRoIGNvbnN1bXB0aW9uIGJ5IGNvbWJpbmluZyBzZWdtZW50cwotICAgICAgICAgICAgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nICh1bmxlc3MgcXVldWUgZmlsbHMgdXApICAoZGVmYXVsdCAyNSkKLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVzICAgICAgICAgKGRlZmF1bHQgMTUwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IGRlZmF1bHQgcXVldWUgbmV2ZXIgZmlsbHMgdXA6ICBzZWUgSHR0cEZhY3RvcnkKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWU6ICB0aW1lIHRvIGtlZXAgdGhyZWFkcyBpbiBleGNlc3Mgb2YgY29yZSBzaXplIGFsaXZlIHdoaWxlIGluYWN0aXZlICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMTgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ6ICBUaW1lVW5pdCBvZiB2YWx1ZSBpbiB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBTRUNPTkRTKQotICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiAgICAgICAgICAgICAgICAgPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luU2VydmVyIiAgICAgICAgICAgICA+TXktU2VydmVyLzEuMTwvcGFyYW1ldGVyPiAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGltZW91dCIgICAgICAgICAgID4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5IiAgICAgICAgPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiID4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiICAgICAgPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiICA+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLSAgICAKLQk8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+Ci0gICAgPCEtLXRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlci0tPj4KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPgotICAgICAgICA8IS0tdW5jb21tZXQgZm9sbG93aW5nIHBhcmFtdGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+Ci0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj50Y3A6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tIC90cmFuc3BvcnRSZWNlaXZlciAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0idGNwIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwcyIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJUcmFuc2Zlci1FbmNvZGluZyI+Y2h1bmtlZDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbW1lbnQgdGhpcyB0byBkaXNhYmxlIEFkZHJlc3NpbmcgLS0+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+Ci0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2VjaG8vTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZWNoby9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZmQzMGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZWNoby9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9ImF4aXN2ZXJzaW9uIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgIFRoaXMgc2VydmljZSBlY2hvIHRoZSBnaXZlbiBpbnB1dCAsIGFuZCB0aGlzIHdhcyBkZXZlbG9wZWQgdG8gdGV4dCB0aGUgYXhpcyBzeXN0ZW0gd29ya2luZwotICAgICAgICAgICAgY29ycmVjdGx5Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5lY2hvLkVjaG88L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InZpZXdWZXJzaW9uIi8+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvZWNoby9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9lY2hvL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZWZmMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9lY2hvL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L2VjaG8iLz4KLQotICAgIDxwYXRoIGlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIj48L3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXZhYyBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyY30iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfS9NRVRBLUlORiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vTUVUQS1JTkYvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amFyLmRpcn0vZWNoby5hYXIiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKioiLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXJzLnVwdG9kYXRlIiB0YXJnZXRmaWxlPSIke2phci5kaXJ9L2VjaG8uYWFyIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2J1aWxkfS8qKiIvPgotICAgICAgICAgICAgPC9zcmNmaWxlcz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0idGhlIGZpbGVzIGFyZSB1cCB0byBkYXRlID0gJHtqYXJzLnVwdG9kYXRlfSI+PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9leGN1bGVSZXBvL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg5NzVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8vYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPg0KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+dHJ1ZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24tLT4NCi0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+DQotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4NCi0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRoaXMgaXMgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgb2YgYWRtaW4gY29uc29sZS0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9zZXJ2aWNlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC4tLT4NCi0gICAgPCEtLVNlcnZpY2VzRGlyZWN0b3J5IG9ubHkgd29ya3Mgb24gdGhlIGZvbGxvd2luZyBjYXNlcy0tPg0KLSAgICA8IS0tLUZpbGUgYmFzZWQgY29uZmlndXJhdG9yIGFuZCBpbiB0aGF0IGNhc2UgdGhlIHZhbHVlIHNob3VsZCBiZSBhIGZpbGUgVVJMIChodHRwOi8vIG5vdCBhbGxvd2VkKS0tPg0KLSAgICA8IS0tLVdoZW4gY3JlYXRpbmcgVVJMIEJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIFVSTCDigJxmaWxlOi8v4oCdICAtLT4NCi0gICAgPCEtLS0gV2FyIGJhc2VkIGNvbmZpZ3VyYXRvciB3aXRoIGV4cGFuZGVkIGNhc2UgLCAtLT4NCi0NCi0gICAgPCEtLUFsbCB0aGUgb3RoZXIgc2NlbmFyaW9zIGl0IHdpbGwgYmUgaWdub3JlZC4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJNb2R1bGVzRGlyZWN0b3J5Ij5tb2R1bGVzPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPg0KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJjb250ZXh0Um9vdCI+YXhpczI8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhvc2UgZW5kcG9pbnRzLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1QT0pPIGRlcGxveWVyICwgdGhpcyB3aWxsIGFsb3cgdXNlcnMgdG8gZHJvcCAuY2xhc3MgZmlsZSBhbmQgbWFrZSB0aGF0IGludG8gYSBzZXJ2aWNlLS0+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5jbGFzcyIgZGlyZWN0b3J5PSJwb2pvIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlBPSk9EZXBsb3llciIvPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzZXQgdGhlIGhvc3QgbmFtZSBmb3IgdGhlIGVwci0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSIgbG9ja2VkPSJ0cnVlIj5teWhvc3QuY29tPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVmYXVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4NCi0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPg0KLSAgICA8IS0tYW55IG9wZXJhdGlvbiAtLT4NCi0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4NCi0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBtZXNzYWdlIGZvcm1hdHRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuTXVsdGlwYXJ0Rm9ybURhdGFGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+DQotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIEJ1aWxkZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIGJ1aWxkZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXRzIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+DQotICAgICAgICA8IS0tTGVmdCBjb21tZW50ZWQgYmVjYXVzZSBpdCBhZGRzIHRoZSBkZXBhbmRhbmN5IG9mIHNlcnZsZXQtYXBpIHRvIG90aGVyIG1vZHVsZXMuDQotICAgICAgICBQbGVhc2UgdW5jb21tZW50IHRvIFJlY2VpdmUgbWVzc2FnZXMgaW4gbXVsdGlwYXJ0L2Zvcm0tZGF0YSBmb3JtYXQtLT4NCi0gICAgICAgIDwhLS08bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPi0tPg0KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRhcmdldCBSZXNvbHZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBhbmQgc3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBmb3IgeW91ciBUYXJnZXRSZXNvbHZlciB0byBhZGQgLS0+DQotICAgIDwhLS0gYSBUYXJnZXRSZXNvbHZlci4gVGFyZ2V0UmVzb2x2ZXJzIGFyZSB1c2VkIHRvIHByb2Nlc3MgdGhlIFRvIEVQUiBmb3IgZXhhbXBsZSB0byAtLT4NCi0gICAgPCEtLSBjaG9vc2UgYSBzZXJ2ZXIgaW4gYSBjbHVzdGVyIC0tPg0KLSAgICA8IS0tPHRhcmdldFJlc29sdmVycz4tLT4NCi0gICAgPCEtLTx0YXJnZXRSZXNvbHZlciBjbGFzcz0iIiAvPi0tPg0KLSAgICA8IS0tPC90YXJnZXRSZXNvbHZlcnM+LS0+DQotDQotDQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4NCi0gICAgPCEtLTx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiDQotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjE8L3BhcmFtZXRlcj4tLT4NCi0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4NCi0gICAgICAgIDwhLS11bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciAsIGFuZCBzZXQgYXMgeW91IHJlcXVpcmVkLi0tPg0KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPC90cmFuc3BvcnRSZWNlaXZlcj4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotDQotICAgIDwhLS08dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImphdmEiLS0+DQotICAgICAgICAgICAgICAgICAgICAgPCEtLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5qYXZhLkphdmFUcmFuc3BvcnRTZW5kZXIiLz4tLT4NCi0NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tICBTT0FQIFJvbGUgQ29uZmlndXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBVc2UgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIHRvIGNvbmZpZ3VyZSB0aGlzIGF4aXMyDQotICAgICAgICAgaW5zdGFuY2UgdG8gYWN0IGluIHBhcnRpY3VsYXIgcm9sZXMuIE5vdGUgdGhhdCBpbg0KLSAgICAgICAgIHRoZSBhYnNlbmNlIG9mIGFueSBjb25maWd1cmF0aW9uLCBBeGlzMiB3aWxsIGFjdA0KLSAgICAgICAgIG9ubHkgaW4gdGhlIHVsdGltYXRlIHJlY2VpdmVyIHJvbGUgLS0+DQotICAgIDxTT0FQUm9sZUNvbmZpZ3VyYXRpb24gaXNVbHRpbWF0ZVJlY2VpdmVyPSJmYWxzZSI+DQotICAgIAk8cm9sZT5odHRwOi8vbXkvY3VzdG9tL3JvbGU8L3JvbGU+DQotICAgIDwvU09BUFJvbGVDb25maWd1cmF0aW9uPg0KLQ0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGhhc2VzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZS1kZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4NCi0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPg0KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLTwvYXhpc2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9leGN1bGVSZXBvL3NlcnZpY2VzL2V4Y2x1ZGVTZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8vc2VydmljZXMvZXhjbHVkZVNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBhN2ZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2V4Y3VsZVJlcG8vc2VydmljZXMvZXhjbHVkZVNlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHNlcnZpY2U+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPm9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5FeGNsdWRlU2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxleGNsdWRlT3BlcmF0aW9ucz4KLSAgICAgICAgPG9wZXJhdGlvbj5hZGQ8L29wZXJhdGlvbj4KLSAgICA8L2V4Y2x1ZGVPcGVyYXRpb25zPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2hvc3RDb25maWdyZXBvL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2hvc3RDb25maWdyZXBvL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0YmY0ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9ob3N0Q29uZmlncmVwby9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlcmFsaXplTG9jYXRpb24iPi48L3BhcmFtZXRlcj4KLSAgICA8aG9zdENvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxpcD4xMjcuMC4wLjE8L2lwPgotICAgICAgICA8cG9ydD41NTU1PC9wb3J0PgotICAgIDwvaG9zdENvbmZpZ3VyYXRpb24+Ci0KLQotICAgIDwhLS1pZiB5b3Ugd2FudCB0byBleHRyYWN0IHRoZSBzZXJ2aWNlIGFyY2hpdmUgZmlsZSBhbmQgd29yayB3aXRoIHRoYXQgcGxlYXNlIHVuY29tbWVudCB0aGlzLS0+Ci0gICAgPCEtLWVsc2UgLCBpdCB3b250IGV4dHJhY3QgYXJjaGl2ZSBmaWxlIG9yIGRvZXMgbm90IHRha2UgaW50byBjb25zaWRlcmF0aW9uIGlmIHNvbWVvbmUgZHJvcC0tPgotICAgIDwhLS1leHBsb2RlZCBkaXJlY3RvcnkgaW50byAvc2VydmljZSBkaXJlY3RvcnktLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJleHRyYWN0U2VydmljZUFyY2hpdmUiPnRydWU8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLSAgICBUaGUgd2F5IG9mIGFkZGluZyBsaXN0ZW5lciB0byB0aGUgc3lzdGVtLS0+Ci0gICAgPCEtLSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuT2JzZXJ2ZXJJTVBMIj4tLT4KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLSAgICA8L2xpc3RlbmVyPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgUmVxdWVzdCBSZXNwb25zZSBzdHlsZSBPcGVyYXRpb25zIC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJJTk9VVCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlNTIyYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9pbnZhbGlkc2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IiI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPm9yZy5hcGFjaGUuYXhpczIuSW52YWxpZFNlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICA8bW9kdWxlIHJlZj0ic2VydmljZU1vZHVsZSIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyIvPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2ludmFsaWRzZXJ2aWNlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMTIwYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9pbnZhbGlkc2VydmljZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIuIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGR9L2NsYXNzZXMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliIiBsb2NhdGlvbj0iJHtidWlsZH0vbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImxpYiIgbG9jYXRpb249ImxpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290IiBsb2NhdGlvbj0iLi4vLi4vLi4vIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imphci5kaXIiIGxvY2F0aW9uPSIke3Jvb3R9L3RhcmdldC90ZXN0LXJlc291cmNlcy9JbnZhbGlkRGVwbG95bWVudC9zZXJ2aWNlcy8iLz4KLQotICAgIDxwYXRoIGlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGggcmVmaWQ9Im1hdmVuLmRlcGVuZGVuY3kuY2xhc3NwYXRoIj48L3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vdGFyZ2V0L2NsYXNzZXMiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvdGVzdC1jbGFzc2VzIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImphcnMudXB0b2RhdGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuY2xhc3Nlc30vTUVUQS1JTkYiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L01FVEEtSU5GLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJidWlsZC54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2phci5kaXJ9L2ludmFsaWRTZXJ2aWNlLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vaW52YWxpZFNlcnZpY2UuamFyIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke2J1aWxkfS8qKiIvPgotICAgICAgICAgICAgPC9zcmNmaWxlcz4KLSAgICAgICAgPC91cHRvZGF0ZT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0idGhlIGZpbGVzIGFyZSB1cCB0byBkYXRlID0gJHtqYXJzLnVwdG9kYXRlfSI+PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjQwODEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbWVzc2FnZUZvcm1hdHRlclRlc3QvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPgotCi0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5naXVzaCB0aG9zZSBlbmRwb2ludHMtLT4KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+Ci0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tU2V0IHRoZSBmbGFnIHRvIHRydWUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRyYW5zcG9ydCBsZXZlbCBzZXNzaW9uIG1hbmdtZW50LS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VUcmFuc3BvcnRTZXNzaW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUZvbGxvd2luZyB0d28gcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgdG8gaGFuZGxlIFJFU1QgaW4gQXhpczIuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgbWFrZSBBeGlzMiB0byBoYXZlIHR3by0tPgotICAgIDwhLS1kaWZmZXJlbnQgZW5kcG9pbnRzLCBvbmUgZm9yIFJFU1QgKEF4aXNSRVNUU2VydmxldCkgb25lIGZvciBTT0FQIG1lc3NhZ2UgaGFuZGxpbmcgKEF4aXNTZXJ2bGV0KS4gQnV0IGZvbGxvd2luZy0tPgotICAgIDwhLS1wYXJhbWV0ZXJzIGhlbHAgdG8gdHdlYWsgdGhlIG1lc3NhZ2UgaGFuZGxpbmcgb2YgdHdvIG1haW4gc2VydmxldHMuIC0tPgotCi0gICAgPCEtLSBJZiB0aGUgZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCBpcyB0cnVlLCB0aGVuIEF4aXMyTWFpblNlcnZsZXQgd2lsbCBoYW5kbGUgYm90aCBTT0FQIGFuZCBSRVNUIG1lc3NhZ2VzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gYm90aCB0aGUgc2VydmxldHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBzZXBhcmF0ZSBzZXJ2bGV0IHdlIGhhdmUgZm9yIFJFU1QgaGFuZGxpbmcuIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNlcGFyYXRlRW5kcG9pbnRGb3JSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TT0FQTWVzc2FnZUZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQotCTwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tdHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyLS0+PgotICAgICAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+Ci0gICAgICAgIDwhLS11bmNvbW1ldCBmb2xsb3dpbmcgcGFyYW10ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gL3RyYW5zcG9ydFJlY2VpdmVyIC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9iYWQtYXhpczIueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbWVzc2FnZUZvcm1hdHRlclRlc3QvYmFkLWF4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwYjcwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tZXNzYWdlRm9ybWF0dGVyVGVzdC9iYWQtYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPgotCi0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5naXVzaCB0aG9zZSBlbmRwb2ludHMtLT4KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+Ci0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tU2V0IHRoZSBmbGFnIHRvIHRydWUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRyYW5zcG9ydCBsZXZlbCBzZXNzaW9uIG1hbmdtZW50LS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VUcmFuc3BvcnRTZXNzaW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUZvbGxvd2luZyB0d28gcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgdG8gaGFuZGxlIFJFU1QgaW4gQXhpczIuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgbWFrZSBBeGlzMiB0byBoYXZlIHR3by0tPgotICAgIDwhLS1kaWZmZXJlbnQgZW5kcG9pbnRzLCBvbmUgZm9yIFJFU1QgKEF4aXNSRVNUU2VydmxldCkgb25lIGZvciBTT0FQIG1lc3NhZ2UgaGFuZGxpbmcgKEF4aXNTZXJ2bGV0KS4gQnV0IGZvbGxvd2luZy0tPgotICAgIDwhLS1wYXJhbWV0ZXJzIGhlbHAgdG8gdHdlYWsgdGhlIG1lc3NhZ2UgaGFuZGxpbmcgb2YgdHdvIG1haW4gc2VydmxldHMuIC0tPgotCi0gICAgPCEtLSBJZiB0aGUgZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCBpcyB0cnVlLCB0aGVuIEF4aXMyTWFpblNlcnZsZXQgd2lsbCBoYW5kbGUgYm90aCBTT0FQIGFuZCBSRVNUIG1lc3NhZ2VzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gYm90aCB0aGUgc2VydmxldHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBzZXBhcmF0ZSBzZXJ2bGV0IHdlIGhhdmUgZm9yIFJFU1QgaGFuZGxpbmcuIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNlcGFyYXRlRW5kcG9pbnRGb3JSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VCdWlsZGVycz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5GYWxzZU1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+ODA4MDwvcGFyYW1ldGVyPgotICAgICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgKHNlZSBleGFtcGxlIHNldHRpbmdzIGZ1cnRoZXIgYmVsb3cpOgotICAgICAgICAgICAgcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0IDYwNjApCi0gICAgICAgICAgICBob3N0bmFtZTogIGlmIG5vbi1udWxsLCB1cmwgcHJlZml4IHVzZWQgaW4gcmVwbHktdG8gZW5kcG9pbnQgcmVmZXJlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IG51bGwpCi0gICAgICAgICAgICBvcmlnaW5TZXJ2ZXI6ICB2YWx1ZSBvZiBodHRwIFNlcnZlciBoZWFkZXIgaW4gb3V0Z29pbmcgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ICJTaW1wbGUtU2VydmVyLzEuMSIpCi0gICAgICAgICAgICByZXF1ZXN0VGltZW91dDogIHZhbHVlIGluIG1pbGxpcyBvZiB0aW1lIHRoYXQgcmVxdWVzdHMgY2FuIHdhaXQgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDIwMDAwKQotICAgICAgICAgICAgcmVxdWVzdFRjcE5vRGVsYXk6ICB0cnVlIHRvIG1heGltaXplIHBlcmZvcm1hbmNlIGFuZCBtaW5pbWl6ZSBsYXRlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSB0byBtaW5pbWl6ZSBiYW5kd2lkdGggY29uc3VtcHRpb24gYnkgY29tYmluaW5nIHNlZ21lbnRzCi0gICAgICAgICAgICByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgKHVubGVzcyBxdWV1ZSBmaWxscyB1cCkgIChkZWZhdWx0IDI1KQotICAgICAgICAgICAgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgaWYgcXVldWUgZmlsbHMgdXMgICAgICAgICAoZGVmYXVsdCAxNTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgZGVmYXVsdCBxdWV1ZSBuZXZlciBmaWxscyB1cDogIHNlZSBIdHRwRmFjdG9yeQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZTogIHRpbWUgdG8ga2VlcCB0aHJlYWRzIGluIGV4Y2VzcyBvZiBjb3JlIHNpemUgYWxpdmUgd2hpbGUgaW5hY3RpdmUgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxODApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IG5vIHN1Y2ggdGhyZWFkcyBjYW4gZXhpc3Qgd2l0aCBkZWZhdWx0IHVuYm91bmRlZCByZXF1ZXN0IHF1ZXVlCi0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdDogIFRpbWVVbml0IG9mIHZhbHVlIGluIHRocmVhZEtlZXBBbGl2ZVRpbWUgKGRlZmF1bHQgU0VDT05EUykgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IFNFQ09ORFMpCi0gICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiICAgICAgICAgICAgICAgICA+aHR0cDovL3d3dy5teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4gLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiICAgICAgICAgICAgID5NeS1TZXJ2ZXIvMS4xPC9wYXJhbWV0ZXI+ICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUaW1lb3V0IiAgICAgICAgICAgPjEwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRjcE5vRGVsYXkiICAgICAgICA+ZmFsc2U8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplIj41MDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSIgPjEwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZSIgICAgICA+MjQwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCIgID5NSUxMSVNFQ09ORFM8L3BhcmFtZXRlcj4gICAgICAgICAgICAtLT4KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPgotICAgIAotCTwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tdHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyLS0+PgotICAgICAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+Ci0gICAgICAgIDwhLS11bmNvbW1ldCBmb2xsb3dpbmcgcGFyYW10ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gL3RyYW5zcG9ydFJlY2VpdmVyIC0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJ0Y3AiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFRyYW5zcG9ydFNlbmRlciIvPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPgotCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iRGlzcGF0Y2giLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZTEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNTBiOGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQ3JlYXRlZC1CeTogQW50IDEuNC4xDQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9NRVRBLUlORi9tb2R1bGUueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlMS9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVkOWYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZTEvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPG1vZHVsZSBuYW1lPSJtb2R1bGUxIj4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img2IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik5ld1BoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgIDxoYW5kbGVyIG5hbWU9ImgxMCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlTGFzdD0idHJ1ZSIgcGhhc2U9Ik5ld1BoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDExIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgYWZ0ZXI9Img2IiBwaGFzZT0iTmV3UGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVnaXN0cnkuSGFuZGxlcjMiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPE91dEZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGYXVsdEZsb3c+Ci0KLSAgICA8SW5GYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img1IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWdpc3RyeS5IYW5kbGVyMyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZhdWx0Rmxvdz4KLQotICAgIDxvcGVyYXRpb24gbmFtZT0iY3JlYXRTZXEiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEiIGxvY2tlZD0ieHNkOnRydWUiPjEwPC9wYXJhbWV0ZXI+Ci0gICAgPC9vcGVyYXRpb24+Ci0KLSAgICA8IS0tIFRoaXMgY2hlY2tzIHRoYXQgcGhhc2VzIGNhbiBiZSBhZGRlZCwgdGhhdCBjb21tYS1zZXBhcmF0ZWQgZmxvdyBsaXN0cyB3b3JrLCAtLT4KLSAgICA8IS0tIGFuZCB0aGF0IGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMgYXJlIHVzZWQgZm9yIGZsb3cgbmFtZXMuICAgICAgICAgICAgICAtLT4KLSAgICA8cGhhc2UgbmFtZT0iTmV3UGhhc2UiIGJlZm9yZT0iRGlzcGF0Y2giIGFmdGVyPSJTZWN1cml0eSIgZmxvdz0iSW5GbG93LG9VdEZsT3ciLz4KLQotICAgIDxwaGFzZSBuYW1lPSJOZXdQaGFzZSIgYmVmb3JlPSJEaXNwYXRjaCIgIGZsb3c9IkluRmF1bHRGbG93Ii8+Ci0gICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5IiBmbG93PSJJbkZsb3ciLz4gPCEtLSBNYWtlIHN1cmUgZHVwbGljYXRlcyBhcmUgT0sgLS0+Ci08L21vZHVsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGUxL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZTEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc1ZjUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZTEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iamFyIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZCIgbG9jYXRpb249ImJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMiIGxvY2F0aW9uPSIke2J1aWxkfS9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYiIgbG9jYXRpb249IiR7YnVpbGR9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIiIGxvY2F0aW9uPSJsaWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdCIgbG9jYXRpb249Ii4uLy4uLy4uLyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiBsb2NhdGlvbj0iJHtyb290fS90YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVzLyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPjwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9NRVRBLUlORi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2phci5kaXJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZGlyfS9tb2R1bGUxLm1hciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vbW9kdWxlMS5tYXIiPgotICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YnVpbGR9LyoqIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0aGUgZmlsZXMgYXJlIHVwIHRvIGRhdGUgPSAke2phcnMudXB0b2RhdGV9Ij48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVDb25maWcvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjUzYjE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZy9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLQotCi0gICAgPG1vZHVsZUNvbmZpZyBuYW1lPSJ0ZXN0TW9kdWxlIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJ0ZXN0TW9kdWxlUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+Ci0gICAgPC9tb2R1bGVDb25maWc+Ci0KLSAgICA8bW9kdWxlQ29uZmlnIG5hbWU9InRlc3RNb2R1bGUyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJ0ZXN0TW9kdWxlUGFyYTIiPk4vQTwvcGFyYW1ldGVyPgotICAgIDwvbW9kdWxlQ29uZmlnPgotCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVDb25maWcvc2VydmljZTEueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlQ29uZmlnL3NlcnZpY2UxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwNzBiYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVDb25maWcvc2VydmljZTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTZXJ2aWNlMSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgdGVzdGluZyBzZXJ2aWNlICwgdG8gdGVzdCB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgb3Igbm90Ci0gICAgPC9kZXNjcmlwdGlvbj4KLQotICAgIDxtb2R1bGVDb25maWcgbmFtZT0iU2VydmllX21vZHVsZSI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmllX21vZHVsZV9wYXJhIj5OL0E8L3BhcmFtZXRlcj4KLSAgICA8L21vZHVsZUNvbmZpZz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICA8bW9kdWxlQ29uZmlnIG5hbWU9Ik9wX01vZHVsZSI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Ik9wX01vZHVsZV9wYXJhIj5OL0E8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9tb2R1bGVDb25maWc+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlRGlzRW5nZWdlUmVwby9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVEaXNFbmdlZ2VSZXBvL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4OTc1Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVEaXNFbmdlZ2VSZXBvL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4NCi0gICAgPCEtLXRoYXQgYmVoYXZpb3VyLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPnRydWU8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLS0+DQotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPg0KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+DQotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1UaGlzIGlzIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIG9mIGFkbWluIGNvbnNvbGUtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+DQotICAgIDwhLS1TZXJ2aWNlc0RpcmVjdG9yeSBvbmx5IHdvcmtzIG9uIHRoZSBmb2xsb3dpbmcgY2FzZXMtLT4NCi0gICAgPCEtLS1GaWxlIGJhc2VkIGNvbmZpZ3VyYXRvciBhbmQgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBmaWxlIFVSTCAoaHR0cDovLyBub3QgYWxsb3dlZCktLT4NCi0gICAgPCEtLS1XaGVuIGNyZWF0aW5nIFVSTCBCYXNlZCBjb25maWd1cmF0b3Igd2l0aCBVUkwg4oCcZmlsZTovL+KAnSAgLS0+DQotICAgIDwhLS0tIFdhciBiYXNlZCBjb25maWd1cmF0b3Igd2l0aCBleHBhbmRlZCBjYXNlICwgLS0+DQotDQotICAgIDwhLS1BbGwgdGhlIG90aGVyIHNjZW5hcmlvcyBpdCB3aWxsIGJlIGlnbm9yZWQuLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4NCi0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRob3NlIGVuZHBvaW50cy0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gQXhpczItLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tUE9KTyBkZXBsb3llciAsIHRoaXMgd2lsbCBhbG93IHVzZXJzIHRvIGRyb3AgLmNsYXNzIGZpbGUgYW5kIG1ha2UgdGhhdCBpbnRvIGEgc2VydmljZS0tPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuY2xhc3MiIGRpcmVjdG9yeT0icG9qbyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5QT0pPRGVwbG95ZXIiLz4NCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiIGxvY2tlZD0idHJ1ZSI+bXlob3N0LmNvbTwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBSZWNlaXZlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLVRoaXMgaXMgdGhlIERlZmF1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+DQotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4NCi0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+DQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdmVycmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+DQotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXQgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLk11bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPg0KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBCdWlsZGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0cyBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VCdWlsZGVycz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlciIvPg0KLSAgICAgICAgPCEtLUxlZnQgY29tbWVudGVkIGJlY2F1c2UgaXQgYWRkcyB0aGUgZGVwYW5kYW5jeSBvZiBzZXJ2bGV0LWFwaSB0byBvdGhlciBtb2R1bGVzLg0KLSAgICAgICAgUGxlYXNlIHVuY29tbWVudCB0byBSZWNlaXZlIG1lc3NhZ2VzIGluIG11bHRpcGFydC9mb3JtLWRhdGEgZm9ybWF0LS0+DQotICAgICAgICA8IS0tPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIi0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4tLT4NCi0gICAgPC9tZXNzYWdlQnVpbGRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUYXJnZXQgUmVzb2x2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgYW5kIHNwZWNpZnkgdGhlIGNsYXNzIG5hbWUgZm9yIHlvdXIgVGFyZ2V0UmVzb2x2ZXIgdG8gYWRkIC0tPg0KLSAgICA8IS0tIGEgVGFyZ2V0UmVzb2x2ZXIuIFRhcmdldFJlc29sdmVycyBhcmUgdXNlZCB0byBwcm9jZXNzIHRoZSBUbyBFUFIgZm9yIGV4YW1wbGUgdG8gLS0+DQotICAgIDwhLS0gY2hvb3NlIGEgc2VydmVyIGluIGEgY2x1c3RlciAtLT4NCi0gICAgPCEtLTx0YXJnZXRSZXNvbHZlcnM+LS0+DQotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXIgY2xhc3M9IiIgLz4tLT4NCi0gICAgPCEtLTwvdGFyZ2V0UmVzb2x2ZXJzPi0tPg0KLQ0KLQ0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+DQotICAgIDwhLS08dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0idGNwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYxPC9wYXJhbWV0ZXI+LS0+DQotICAgICAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+DQotICAgICAgICA8IS0tdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgLCBhbmQgc2V0IGFzIHlvdSByZXF1aXJlZC4tLT4NCi0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj50Y3A6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTwvdHJhbnNwb3J0UmVjZWl2ZXI+LS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgT3V0cyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLQ0KLQ0KLSAgICA8IS0tPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJqYXZhIi0tPg0KLSAgICAgICAgICAgICAgICAgICAgIDwhLS1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuamF2YS5KYXZhVHJhbnNwb3J0U2VuZGVyIi8+LS0+DQotDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSAgU09BUCBSb2xlIENvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVXNlIHRoZSBmb2xsb3dpbmcgcGF0dGVybiB0byBjb25maWd1cmUgdGhpcyBheGlzMg0KLSAgICAgICAgIGluc3RhbmNlIHRvIGFjdCBpbiBwYXJ0aWN1bGFyIHJvbGVzLiBOb3RlIHRoYXQgaW4NCi0gICAgICAgICB0aGUgYWJzZW5jZSBvZiBhbnkgY29uZmlndXJhdGlvbiwgQXhpczIgd2lsbCBhY3QNCi0gICAgICAgICBvbmx5IGluIHRoZSB1bHRpbWF0ZSByZWNlaXZlciByb2xlIC0tPg0KLSAgICA8U09BUFJvbGVDb25maWd1cmF0aW9uIGlzVWx0aW1hdGVSZWNlaXZlcj0iZmFsc2UiPg0KLSAgICAJPHJvbGU+aHR0cDovL215L2N1c3RvbS9yb2xlPC9yb2xlPg0KLSAgICA8L1NPQVBSb2xlQ29uZmlndXJhdGlvbj4NCi0NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBoYXNlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUtZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+DQotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4NCi0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlRGlzRW5nZWdlUmVwby9tb2R1bGVzL3Rlc3RNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZURpc0VuZ2VnZVJlcG8vbW9kdWxlcy90ZXN0TW9kdWxlL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNGQ5NGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlRGlzRW5nZWdlUmVwby9tb2R1bGVzL3Rlc3RNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxtb2R1bGU+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iSG5hZGxlcjEiCi0gICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJIYW5kbGVyMiIKLSAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkhhbmRsZXIzIgotICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9IkhhbmRsZXI0IgotICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZVZlcnNpb24vVGVzdDEvYXhpczIueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlVmVyc2lvbi9UZXN0MS9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWQwODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlVmVyc2lvbi9UZXN0MS9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8ZGVmYXVsdE1vZHVsZVZlcnNpb25zPgotICAgICAgICA8bW9kdWxlIG5hbWU9ImFiYyIgdmVyc2lvbj0iMS4yMyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9ImZvbyIgdmVyc2lvbj0iMC44OSIvPgotICAgIDwvZGVmYXVsdE1vZHVsZVZlcnNpb25zPgotCi0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InVzZXJOYW1lIj5hZG1pbjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZyaWRlIHRoaXMgZm9yIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGhhc2VzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci08L2F4aXNjb25maWc+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdC9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9yZXBvc2l0b3JpZXMvbW9kdWxlTG9hZFRlc3QvYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTg5NzVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdC9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+DQotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi0tPg0KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4NCi0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPg0KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVGhpcyBpcyB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBvZiBhZG1pbiBjb25zb2xlLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPg0KLSAgICA8IS0tU2VydmljZXNEaXJlY3Rvcnkgb25seSB3b3JrcyBvbiB0aGUgZm9sbG93aW5nIGNhc2VzLS0+DQotICAgIDwhLS0tRmlsZSBiYXNlZCBjb25maWd1cmF0b3IgYW5kIGluIHRoYXQgY2FzZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgZmlsZSBVUkwgKGh0dHA6Ly8gbm90IGFsbG93ZWQpLS0+DQotICAgIDwhLS0tV2hlbiBjcmVhdGluZyBVUkwgQmFzZWQgY29uZmlndXJhdG9yIHdpdGggVVJMIOKAnGZpbGU6Ly/igJ0gIC0tPg0KLSAgICA8IS0tLSBXYXIgYmFzZWQgY29uZmlndXJhdG9yIHdpdGggZXhwYW5kZWQgY2FzZSAsIC0tPg0KLQ0KLSAgICA8IS0tQWxsIHRoZSBvdGhlciBzY2VuYXJpb3MgaXQgd2lsbCBiZSBpZ25vcmVkLi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+DQotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aG9zZSBlbmRwb2ludHMtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVBPSk8gZGVwbG95ZXIgLCB0aGlzIHdpbGwgYWxvdyB1c2VycyB0byBkcm9wIC5jbGFzcyBmaWxlIGFuZCBtYWtlIHRoYXQgaW50byBhIHNlcnZpY2UtLT4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIHNldCB0aGUgaG9zdCBuYW1lIGZvciB0aGUgZXByLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiBsb2NrZWQ9InRydWUiPm15aG9zdC5jb208L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWZhdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPg0KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+DQotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPg0KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlQnVpbGRlcnM+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4NCi0gICAgICAgIDwhLS1MZWZ0IGNvbW1lbnRlZCBiZWNhdXNlIGl0IGFkZHMgdGhlIGRlcGFuZGFuY3kgb2Ygc2VydmxldC1hcGkgdG8gb3RoZXIgbW9kdWxlcy4NCi0gICAgICAgIFBsZWFzZSB1bmNvbW1lbnQgdG8gUmVjZWl2ZSBtZXNzYWdlcyBpbiBtdWx0aXBhcnQvZm9ybS1kYXRhIGZvcm1hdC0tPg0KLSAgICAgICAgPCEtLTxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSItLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+LS0+DQotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVGFyZ2V0IFJlc29sdmVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGFuZCBzcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIGZvciB5b3VyIFRhcmdldFJlc29sdmVyIHRvIGFkZCAtLT4NCi0gICAgPCEtLSBhIFRhcmdldFJlc29sdmVyLiBUYXJnZXRSZXNvbHZlcnMgYXJlIHVzZWQgdG8gcHJvY2VzcyB0aGUgVG8gRVBSIGZvciBleGFtcGxlIHRvIC0tPg0KLSAgICA8IS0tIGNob29zZSBhIHNlcnZlciBpbiBhIGNsdXN0ZXIgLS0+DQotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXJzPi0tPg0KLSAgICA8IS0tPHRhcmdldFJlc29sdmVyIGNsYXNzPSIiIC8+LS0+DQotICAgIDwhLS08L3RhcmdldFJlc29sdmVycz4tLT4NCi0NCi0NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPg0KLSAgICA8IS0tPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCINCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MTwvcGFyYW1ldGVyPi0tPg0KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPg0KLSAgICAgICAgPCEtLXVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+DQotICAgICAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+dGNwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08L3RyYW5zcG9ydFJlY2VpdmVyPi0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0NCi0NCi0gICAgPCEtLTx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iamF2YSItLT4NCi0gICAgICAgICAgICAgICAgICAgICA8IS0tY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmphdmEuSmF2YVRyYW5zcG9ydFNlbmRlciIvPi0tPg0KLQ0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gIFNPQVAgUm9sZSBDb25maWd1cmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFVzZSB0aGUgZm9sbG93aW5nIHBhdHRlcm4gdG8gY29uZmlndXJlIHRoaXMgYXhpczINCi0gICAgICAgICBpbnN0YW5jZSB0byBhY3QgaW4gcGFydGljdWxhciByb2xlcy4gTm90ZSB0aGF0IGluDQotICAgICAgICAgdGhlIGFic2VuY2Ugb2YgYW55IGNvbmZpZ3VyYXRpb24sIEF4aXMyIHdpbGwgYWN0DQotICAgICAgICAgb25seSBpbiB0aGUgdWx0aW1hdGUgcmVjZWl2ZXIgcm9sZSAtLT4NCi0gICAgPFNPQVBSb2xlQ29uZmlndXJhdGlvbiBpc1VsdGltYXRlUmVjZWl2ZXI9ImZhbHNlIj4NCi0gICAgCTxyb2xlPmh0dHA6Ly9teS9jdXN0b20vcm9sZTwvcm9sZT4NCi0gICAgPC9TT0FQUm9sZUNvbmZpZ3VyYXRpb24+DQotDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQaGFzZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlLWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+DQotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotPC9heGlzY29uZmlnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdC9tb2R1bGVzL2V4cGxvZGVkL01FVEEtSU5GL21vZHVsZS54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9yZXBvc2l0b3JpZXMvbW9kdWxlTG9hZFRlc3QvbW9kdWxlcy9leHBsb2RlZC9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWI1NTU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3JlcG9zaXRvcmllcy9tb2R1bGVMb2FkVGVzdC9tb2R1bGVzL2V4cGxvZGVkL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gbmFtZSBhdHRyIGlzICJleHBsb2RlZE1vZHVsZSIsIGJ1dCBkaXJlY3RvcnkgbmFtZSBpcyAiZXhwbG9kZWQiLiAgQXR0ciB3aW5zLiAtLT4KLTxtb2R1bGUgbmFtZT0iZXhwbG9kZWRNb2R1bGUiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iY29sb3IiPmdyZWVuPC9wYXJhbWV0ZXI+Ci08L21vZHVsZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZlcjEueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDk2MjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmVyMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2ZXIgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj50cnVlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iSU5PVVQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4wPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciLz4KLQotICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkRpc3BhdGNoIi8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8IS0tICAgQWZ0ZXIgUG9zdGRpc3BhdGNoIHBoYXNlIG1vZHVsZSBhdXRob3Igb3Igb3Igc2VydmljZSBhdXRob3IgY2FuIGFkZCBhbnkgcGhhc2UgaGUgd2FudCAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0idXNlcnBoYXNlMSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvc2VydmVyPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWZjNWQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBwcm92aWRlcj0ieHNkOmFueXByb3ZpZGVyIiBzdHlsZT0icnBjSSIgY29udGV4dFBhdGg9InNlcnZpY2VzIj4KLSAgICA8IS0tIHRoZXNlIGFyZSBTZXJ2aWNlIFBhcmFtZXRlcnMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmEyIj5Db2xvbWJvPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tICBTZXJ2aWNlIFR5cGVNYXBwaW5nIC0tPgotICAgIDx0eXBlTWFwcGluZz5UeXBlIG1hcHBwaW5nIHNob3VsZCBjb21lIGhlcmU8L3R5cGVNYXBwaW5nPgotICAgIDxiZWFuTWFwcGluZz5iZWFuIG1hcHBwaW5nIHNob3VsZCBjb21lIGhlcmU8L2JlYW5NYXBwaW5nPgotCi0gICAgPCEtLQotICAgIFBoYXNlcwotICAgIFAxIHAyIHAzCi0gICAgLS0+Ci0KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAxIiBwaGFzZUZpcnN0PSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIi8+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMiIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4KLQotICAgIDxGYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InAxIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L2ZhdWx0Zmxvdz4KLQotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcG5hbWUiIHFuYW1lPSJvcHFuYW1lIiBzdHlsZT0iYW55U3R5bGUiIHVzZT0iYW55VXNlIj4KLSAgICAgICAgPEluRmxvdz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Img3IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIi8+Ci0gICAgICAgIDwvSW5GbG93PgotICAgICAgICA8T3V0Rmxvdz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9Img4IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImFueWhhc2UiLz4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvT3V0Rmxvdz4KLSAgICAgICAgPEZhdWx0Rmxvdz4KLSAgICAgICAgPC9GYXVsdEZsb3c+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Q0ZmQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgcHJvdmlkZXI9InhzZDphbnlwcm92aWRlciIgc3R5bGU9InhzZDphbnlVUkkiIGNvbnRleHRQYXRoPSJ4c2Q6YW55Y29udGV4dFBhdGgiPgotICAgIDwhLS0gdGhlc2UgYXJlIFNlcnZpY2UgUGFyYW1ldGVycyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTIiPkNvbG9tYm88L3BhcmFtZXRlcj4KLQotICAgIDxtb2R1bGUgcmVmPSJtb2R1bGUxIj48L21vZHVsZT4KLSAgICA8bW9kdWxlIHJlZj0ibW9kdWxlMiI+PC9tb2R1bGU+Ci0KLQotICAgIDwhLS0gIFNlcnZpY2UgVHlwZU1hcHBpbmcgLS0+Ci0gICAgPHR5cGVNYXBwaW5nPgotICAgICAgICA8dHlwZU1hcHBlciB4c2lUeXBlPSJpbnQiIGphdmFUeXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLlR5cGVNYXBwZXJJbXBsIi8+Ci0gICAgPC90eXBlTWFwcGluZz4KLSAgICA8YmVhbk1hcHBpbmc+YmVhbiBtYXBwcGluZyBzaG91bGQgY29tZSBoZXJlPC9iZWFuTWFwcGluZz4KLQotICAgIDwhLS0KLSAgICBQaGFzZXMKLSAgICBQMSBwMiBwMwotICAgIC0tPgotCi0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDEiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMSIgcGhhc2VGaXJzdD0idHJ1ZSIvPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciIvPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUucmVnaXN0cnkuU3BlYWtpbmdIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0icDIiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDUiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJwMSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDYiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9GYXVsdEZsb3c+Ci0KLQotICAgIDxvcGVyYXRpb24gbmFtZT0ib3BuYW1lIiBxbmFtZT0ib3BxbmFtZSIgc3R5bGU9ImFueVN0eWxlIiB1c2U9ImFueVVzZSI+Ci0gICAgICAgIDxtb2R1bGUgcmVmPSJ1cmkiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMyIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTQiPkxTRjwvcGFyYW1ldGVyPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8SW5GbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDciIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiLz4KLSAgICAgICAgPC9JbkZsb3c+Ci0gICAgICAgIDxPdXRGbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDgiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iYW55aGFzZSIvPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9PdXRGbG93PgotICAgICAgICA8RmF1bHRGbG93PgotICAgICAgICA8L0ZhdWx0Rmxvdz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUwYjhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1DcmVhdGVkLUJ5OiBBbnQgMS40LjENCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Zjg4NzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSIiPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgdGVzdGluZyBzZXJ2aWNlICwgdG8gdGVzdCB0aGUgc3lzdGVtIGlzIHdvcmtpbmcgb3Igbm90Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+b3JnLmFwYWNoZS5heGlzMi5zYW1wbGUuZWNoby5FY2hvSW1wbDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgIDxtb2R1bGUgcmVmPSJtb2R1bGUxIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FY2hvU3RydWN0Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRWNob1N0cnVjdEFycmF5Ii8+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEvYnVpbGQueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE1NDFlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UxL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZH0vY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIiIGxvY2F0aW9uPSIke2J1aWxkfS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibGliIiBsb2NhdGlvbj0ibGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgbG9jYXRpb249IiR7cm9vdH0vdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZXMvIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpcy50ZXN0LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJtYXZlbi5kZXBlbmRlbmN5LmNsYXNzcGF0aCI+PC9wYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uL3RhcmdldC9jbGFzc2VzIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vdGFyZ2V0L3Rlc3QtY2xhc3NlcyIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9NRVRBLUlORi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2phci5kaXJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZGlyfS9zZXJ2aWNlMS5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKioiLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXJzLnVwdG9kYXRlIiB0YXJnZXRmaWxlPSIke2phci5kaXJ9L3NlcnZpY2UxLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFlMDk4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIHByb3ZpZGVyPSJ4c2Q6YW55cHJvdmlkZXIiIHN0eWxlPSJ4c2Q6YW55VVJJIiBjb250ZXh0UGF0aD0ieHNkOmFueWNvbnRleHRQYXRoIj4KLSAgICA8IS0tIHRoZXNlIGFyZSBTZXJ2aWNlIFBhcmFtZXRlcnMgLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTA8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmEyIj5Db2xvbWJvPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tICBTZXJ2aWNlIFR5cGVNYXBwaW5nIC0tPgotICAgIDx0eXBlTWFwcGluZz5UeXBlIG1hcHBwaW5nIHNob3VsZCBjb21lIGhlcmU8L3R5cGVNYXBwaW5nPgotICAgIDxiZWFuTWFwcGluZz5iZWFuIG1hcHBwaW5nIHNob3VsZCBjb21lIGhlcmU8L2JlYW5NYXBwaW5nPgotCi0KLSAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLnJlZ2lzdHJ5LlNwZWFraW5nSGFuZGxlciI+Ci0gICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICA8L2hhbmRsZXI+Ci0KLQotICAgIDxJbkZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgyIiByZWY9ImgxIi8+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgzIiByZWY9ImgxIi8+Ci0gICAgPC9JbkZsb3c+Ci0KLSAgICA8T3V0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDMiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5yZWdpc3RyeS5TcGVha2luZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIGJlZm9yZT0iYW55QmVmaXJlVVJJIiBhZnRlcj0iYW55YWZ0ZXJVUkkiIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoNCIgY2xhc3M9IkhhbmRlci5jbGFzcyI+Ci0gICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDUiIGNsYXNzPSJIYW5kZXIuY2xhc3MiPgotICAgICAgICAgICAgPG9yZGVyIGJlZm9yZT0iYW55QmVmaXJlVVJJIiBhZnRlcj0iYW55YWZ0ZXJVUkkiIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iSGFuZGVybmFtZSIgY2xhc3M9IkhhbmRlci5jbGFzcyI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmF1bHRGbG93PgotCi0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Im9wbmFtZSIgcW5hbWU9Im9wcW5hbWUiIHN0eWxlPSJhbnlTdHlsZSIgdXNlPSJhbnlVc2UiPgotICAgICAgICA8bW9kdWxlIHJlZj0idXJpIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTMiIGxvY2tlZD0ieHNkOnRydWUiPjEwPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE0Ij5MU0Y8L3BhcmFtZXRlcj4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPEluRmxvdz4KLSAgICAgICAgICAgIDxoYW5kbGVyIHJlZj0iYW55UmVmIiBuYW1lPSJIYW5kZXJuYW1lIiBjbGFzcz0iSGFuZGVyLmNsYXNzIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE4IiBsb2NrZWQ9InhzZDp0cnVlIj4xMjM8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmE5IiBsb2NrZWQ9InhzZDp0cnVlIj40NTY8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExMCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+Nzg5PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIHJlZj0iYW55UmVmIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLQotICAgICAgICA8L0luRmxvdz4KLSAgICAgICAgPE91dEZsb3c+Ci0gICAgICAgICAgICA8aGFuZGxlciByZWY9ImFueVJlZiIgbmFtZT0iSGFuZGVybmFtZSIgY2xhc3M9IkhhbmRlci5jbGFzcyI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIGJlZm9yZT0iYW55QmVmaXJlVVJJIiBhZnRlcj0iYW55YWZ0ZXJVUkkiIHBoYXNlPSJhbnloYXNlIiBwaGFzZUZpcnN0PSJ0cnVlIiBwaGFzZUxhc3Q9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgcmVmPSJhbnlSZWYiPgotICAgICAgICAgICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotCi0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOCIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+MTIzPC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhOSIgbG9ja2VkPSJ4c2Q6dHJ1ZSI+NDU2PC9wYXJhbWV0ZXI+Ci0gICAgICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhMTAiIGxvY2tlZD0ieHNkOnRydWUiPjc4OTwvcGFyYW1ldGVyPgotCi0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvT3V0Rmxvdz4KLSAgICAgICAgPEluRmF1bHRGbG93PgotICAgICAgICAgICAgPGhhbmRsZXIgcmVmPSJhbnlSZWYiIG5hbWU9IkhhbmRlcm5hbWUiIGNsYXNzPSJIYW5kZXIuY2xhc3MiPgotICAgICAgICAgICAgICAgIDxvcmRlciBiZWZvcmU9ImFueUJlZmlyZVVSSSIgYWZ0ZXI9ImFueWFmdGVyVVJJIiBwaGFzZT0iYW55aGFzZSIgcGhhc2VGaXJzdD0idHJ1ZSIgcGhhc2VMYXN0PSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIHJlZj0iYW55UmVmIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgYmVmb3JlPSJhbnlCZWZpcmVVUkkiIGFmdGVyPSJhbnlhZnRlclVSSSIgcGhhc2U9ImFueWhhc2UiIHBoYXNlRmlyc3Q9InRydWUiIHBoYXNlTGFzdD0iZmFsc2UiLz4KLQotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTgiIGxvY2tlZD0ieHNkOnRydWUiPjEyMzwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTkiIGxvY2tlZD0ieHNkOnRydWUiPjQ1NjwvcGFyYW1ldGVyPgotICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTEwIiBsb2NrZWQ9InhzZDp0cnVlIj43ODk8L3BhcmFtZXRlcj4KLQotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L0luRmF1bHRGbG93PgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxzZXJ2aWNlIHJlZj0ieHNkOmFueVNlcnZpY2VSZWYiLz4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUwYjhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1DcmVhdGVkLUJ5OiBBbnQgMS40LjENCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2ZlZjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZTIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSIiPgotICAgIDwhLS0gdGhlc2UgYXJlIFNlcnZpY2UgUGFyYW1ldGVycyAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmExIiBsb2NrZWQ9InhzZDp0cnVlIj4xMDwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYTIiPkNvbG9tYm88L3BhcmFtZXRlcj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSB0ZXN0aW5nIHNlcnZpY2UgLCB0byB0ZXN0IHRoZSBzeXN0ZW0gaXMgd29ya2luZyBvciBub3QKLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcG5hbWUiPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2UyL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NDIwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlMi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIuIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGR9L2NsYXNzZXMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliIiBsb2NhdGlvbj0iJHtidWlsZH0vbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImxpYiIgbG9jYXRpb249ImxpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290IiBsb2NhdGlvbj0iLi4vLi4vLi4vIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imphci5kaXIiIGxvY2F0aW9uPSIke3Jvb3R9L3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VzLyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPjwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9NRVRBLUlORi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2phci5kaXJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZGlyfS9zZXJ2aWNlMi5qYXIiIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKioiLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXJzLnVwdG9kYXRlIiB0YXJnZXRmaWxlPSIke2phci5kaXJ9L3NlcnZpY2UyLmphciI+Ci0gICAgICAgICAgICA8c3JjZmlsZXMgZGlyPSIke3NyY30iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHtidWlsZH0vKioiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9InRoZSBmaWxlcyBhcmUgdXAgdG8gZGF0ZSA9ICR7amFycy51cHRvZGF0ZX0iPjwvZWNobz4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZUdyb3VwUmVwby9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4ODEyZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+dHJ1ZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZXJhbGl6ZUxvY2F0aW9uIj4uL3RhcmdldDwvcGFyYW1ldGVyPgotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dFBoYXNlIi8+Ci0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPgotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmF1bHRGbG93Ij4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvL3NlcnZpY2VzL3NlcnZpY2VHcm91cC9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvL3NlcnZpY2VzL3NlcnZpY2VHcm91cC9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWU4MzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZUdyb3VwUmVwby9zZXJ2aWNlcy9zZXJ2aWNlR3JvdXAvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHNlcnZpY2VHcm91cD4KLSAgICA8c2VydmljZSBuYW1lPSJzZXJ2aWNlMSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0ib3AxIj4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0ib3AyIj4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9zZXJ2aWNlPgotICAgIDxzZXJ2aWNlIG5hbWU9InNlcnZpY2UyIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJvcDEiPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJvcDIiPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3NlcnZpY2U+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPm9yZy5hcGFjaGUuYXhpczIuRWNobzI8L3BhcmFtZXRlcj4KLTwvc2VydmljZUdyb3VwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VNb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlNGFmYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlTW9kdWxlL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0ic2VydmljZU1vZHVsZSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuSW5hdmFsaWRNb2R1bGVJbXBsIj4KLSAgICA8SW5GbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuTW9kdWxlSGFuZGxlcjEiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9ImgyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5Nb2R1bGVIYW5kbGVyMSI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydEluIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJoMyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuTW9kdWxlSGFuZGxlcjEiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJEaXNwYXRjaCIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPE91dEZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iaDQiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk1vZHVsZUhhbmRsZXIxIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGYXVsdEZsb3c+Ci0KLSAgICA8SW5GYXVsdEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Img1IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5Nb2R1bGVIYW5kbGVyMSI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZhdWx0Rmxvdz4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NlcnZpY2VNb2R1bGUvYnVpbGQueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZU1vZHVsZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZTFiOWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvc2VydmljZU1vZHVsZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIuIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGR9L2NsYXNzZXMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliIiBsb2NhdGlvbj0iJHtidWlsZH0vbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImxpYiIgbG9jYXRpb249ImxpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290IiBsb2NhdGlvbj0iLi4vLi4vLi4vIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imphci5kaXIiIGxvY2F0aW9uPSIke3Jvb3R9L3RhcmdldC90ZXN0LXJlc291cmNlcy9JbnZhbGlkRGVwbG95bWVudC9tb2R1bGVzLyIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMudGVzdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0ibWF2ZW4uZGVwZW5kZW5jeS5jbGFzc3BhdGgiPjwvcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi90YXJnZXQvY2xhc3NlcyIvPgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJqYXJzLnVwdG9kYXRlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphdmFjIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJheGlzLnRlc3QuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8c3JjIHBhdGg9IiR7c3JjfSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlcGVuZHM9ImNvbXBpbGUiIHVubGVzcz0iamFycy51cHRvZGF0ZSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmNsYXNzZXN9L01FVEEtSU5GIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9NRVRBLUlORi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2phci5kaXJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZGlyfS9zZXJ2aWNlTW9kdWxlLmphciIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKiIvPgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8dXB0b2RhdGUgcHJvcGVydHk9ImphcnMudXB0b2RhdGUiIHRhcmdldGZpbGU9IiR7amFyLmRpcn0vc2VydmljZU1vZHVsZS5qYXIiPgotICAgICAgICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtzcmN9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YnVpbGR9LyoqIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJ0aGUgZmlsZXMgYXJlIHVwIHRvIGRhdGUgPSAke2phcnMudXB0b2RhdGV9Ij48L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NvYXByb2xlY29uZmlndXJhdGlvbi9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zb2Fwcm9sZWNvbmZpZ3VyYXRpb24vYXhpczIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFjOTVjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L3NvYXByb2xlY29uZmlndXJhdGlvbi9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFja3RyYWNlIGNhbiBiZSBzZW50IHdpdGggdGhlIGZhdWx0IG1lc3NhZ2UuIFRoZSBmb2xsb3dpbmcgZmxhZyB3aWxsIGNvbnRyb2wgLS0+DQotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj50cnVlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1JZiB0aGVyZSBhcmVuJ3QgYW55IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBmaW5kIG91dCB0aGUgZmF1bHQgcmVhc29uLCB3ZSBzZXQgdGhlIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi0tPg0KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4NCi0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPg0KLSAgICA8IS0taXMgc2V0IHRoZW4sIEF4aXMyIHRyaWVzIHRvIGdldCB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBzZXQgaXRzIG1lc3NhZ2UgYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVGhpcyBpcyB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBvZiBhZG1pbiBjb25zb2xlLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPg0KLSAgICA8IS0tU2VydmljZXNEaXJlY3Rvcnkgb25seSB3b3JrcyBvbiB0aGUgZm9sbG93aW5nIGNhc2VzLS0+DQotICAgIDwhLS0tRmlsZSBiYXNlZCBjb25maWd1cmF0b3IgYW5kIGluIHRoYXQgY2FzZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgZmlsZSBVUkwgKGh0dHA6Ly8gbm90IGFsbG93ZWQpLS0+DQotICAgIDwhLS0tV2hlbiBjcmVhdGluZyBVUkwgQmFzZWQgY29uZmlndXJhdG9yIHdpdGggVVJMIOKAnGZpbGU6Ly/igJ0gIC0tPg0KLSAgICA8IS0tLSBXYXIgYmFzZWQgY29uZmlndXJhdG9yIHdpdGggZXhwYW5kZWQgY2FzZSAsIC0tPg0KLQ0KLSAgICA8IS0tQWxsIHRoZSBvdGhlciBzY2VuYXJpb3MgaXQgd2lsbCBiZSBpZ25vcmVkLi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+DQotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aG9zZSBlbmRwb2ludHMtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVBPSk8gZGVwbG95ZXIgLCB0aGlzIHdpbGwgYWxvdyB1c2VycyB0byBkcm9wIC5jbGFzcyBmaWxlIGFuZCBtYWtlIHRoYXQgaW50byBhIHNlcnZpY2UtLT4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIHNldCB0aGUgaG9zdCBuYW1lIGZvciB0aGUgZXByLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiBsb2NrZWQ9InRydWUiPm15aG9zdC5jb208L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBEZWZhdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPg0KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+DQotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPg0KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlQnVpbGRlcnM+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLlhGb3JtVVJMRW5jb2RlZEJ1aWxkZXIiLz4NCi0gICAgICAgIDwhLS1MZWZ0IGNvbW1lbnRlZCBiZWNhdXNlIGl0IGFkZHMgdGhlIGRlcGFuZGFuY3kgb2Ygc2VydmxldC1hcGkgdG8gb3RoZXIgbW9kdWxlcy4NCi0gICAgICAgIFBsZWFzZSB1bmNvbW1lbnQgdG8gUmVjZWl2ZSBtZXNzYWdlcyBpbiBtdWx0aXBhcnQvZm9ybS1kYXRhIGZvcm1hdC0tPg0KLSAgICAgICAgPCEtLTxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSItLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+LS0+DQotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVGFyZ2V0IFJlc29sdmVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGFuZCBzcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIGZvciB5b3VyIFRhcmdldFJlc29sdmVyIHRvIGFkZCAtLT4NCi0gICAgPCEtLSBhIFRhcmdldFJlc29sdmVyLiBUYXJnZXRSZXNvbHZlcnMgYXJlIHVzZWQgdG8gcHJvY2VzcyB0aGUgVG8gRVBSIGZvciBleGFtcGxlIHRvIC0tPg0KLSAgICA8IS0tIGNob29zZSBhIHNlcnZlciBpbiBhIGNsdXN0ZXIgLS0+DQotICAgIDwhLS08dGFyZ2V0UmVzb2x2ZXJzPi0tPg0KLSAgICA8IS0tPHRhcmdldFJlc29sdmVyIGNsYXNzPSIiIC8+LS0+DQotICAgIDwhLS08L3RhcmdldFJlc29sdmVycz4tLT4NCi0NCi0NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPg0KLSAgICA8IS0tPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCINCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MTwvcGFyYW1ldGVyPi0tPg0KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPg0KLSAgICAgICAgPCEtLXVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+DQotICAgICAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+dGNwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08L3RyYW5zcG9ydFJlY2VpdmVyPi0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0NCi0gIA0KLSAgICA8IS0tPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJqYXZhIi0tPg0KLSAgICAgICAgICAgICAgICAgICAgIDwhLS1jbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuamF2YS5KYXZhVHJhbnNwb3J0U2VuZGVyIi8+LS0+DQotDQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSAgU09BUCBSb2xlIENvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVXNlIHRoZSBmb2xsb3dpbmcgcGF0dGVybiB0byBjb25maWd1cmUgdGhpcyBheGlzMg0KLSAgICAgICAgIGluc3RhbmNlIHRvIGFjdCBpbiBwYXJ0aWN1bGFyIHJvbGVzLiBOb3RlIHRoYXQgaW4NCi0gICAgICAgICB0aGUgYWJzZW5jZSBvZiBhbnkgY29uZmlndXJhdGlvbiwgQXhpczIgd2lsbCBhY3QgDQotICAgICAgICAgb25seSBpbiB0aGUgdWx0aW1hdGUgcmVjZWl2ZXIgcm9sZSAtLT4NCi0gICAgPFNPQVBSb2xlQ29uZmlndXJhdGlvbiBpc1VsdGltYXRlUmVjZWl2ZXI9ImZhbHNlIj4NCi0gICAgCTxyb2xlPmh0dHA6Ly9teS9jdXN0b20vcm9sZTwvcm9sZT4NCi0gICAgPC9TT0FQUm9sZUNvbmZpZ3VyYXRpb24+DQotCQ0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGhhc2VzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZS1kZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iQWRkcmVzc2luZyIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotDQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4NCi0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPg0KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbk91dEZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJSTVBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLTwvYXhpc2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZXByVGVzdC54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvZXByVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTNjYzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2VwclRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlND5WYWx1ZSA0MDA8L3NvYXBlbnY6UmVmZXJlbmNlND4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlMT5WYWx1ZSAxMDA8L3NvYXBlbnY6UmVmZXJlbmNlMT4KLSAgICAgICAgPHNvYXBlbnY6UmVmZXJlbmNlMD5WYWx1ZSAwPC9zb2FwZW52OlJlZmVyZW5jZTA+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTI+VmFsdWUgMjAwPC9zb2FwZW52OlJlZmVyZW5jZTI+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTM+VmFsdWUgMzAwPC9zb2FwZW52OlJlZmVyZW5jZTM+Ci0gICAgICAgIDx3c2E6U2VydmljZU5hbWUgd3NhOlBvcnROYW1lPSJwb3J0Ij5zZXJ2aWNlTlM6U2VydmljZTwvd3NhOlNlcnZpY2VOYW1lPgotICAgICAgICA8d3NhOlBvcnRUeXBlPnBvcnROUzpQb3J0PC93c2E6UG9ydFR5cGU+Ci0gICAgICAgIDx3c2E6RnJvbT4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vd3d3LmZyb20ub3JnL3NlcnZpY2UvPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICA8L3NvYXBlbnY6SGVhZGVyPgotICAgIDxzb2FwZW52OkJvZHk+PC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2oyc2VjYnVpbGQueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2oyc2VjYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzJlMTFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qMnNlY2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3RzZXR1cCI+Ci0gICAKLQk8dGFyZ2V0IG5hbWU9InRlc3RzZXR1cCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9tb3JlIi8+ICAgICAgICAKLSAgICAgICAgPG1rZGlyIGRpcj0iJHttYXZlbi5idWlsZC5kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL2xlc3MiLz4gICAgICAgIAotCi0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9tb3JlL01vcmVQZXJtaXNzaW9uLmphciIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9kcml2ZXIvKiIvPgotICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2FjdGlvbi8qIi8+Ci0gICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvaW50ZXJmLyoiLz4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlLyoiLz4KLSAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgCi0gICAgICAgIDxkZWxldGUgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9kcml2ZXIiIC8+ICAgCi0gICAgICAgIDxkZWxldGUgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlIiAvPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHttYXZlbi5idWlsZC5kaXJ9L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvYWN0aW9uIiAvPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHttYXZlbi5idWlsZC5kaXJ9L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvaW50ZXJmIiAvPgotICAgICAgICAgCi0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7bWF2ZW4uYnVpbGQuZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9sZXNzL0xlc3NQZXJtaXNzaW9uLmphciIgdXBkYXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzLyoiLz4KLSAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgCi0gICAgICAgIDxkZWxldGUgZGlyPSIke21hdmVuLmJ1aWxkLmRpcn0vdGVzdC1jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzIiAvPgotCi0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcG9saWN5L2phdmEyc2VjdGVzdC5wb2xpY3kgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcG9saWN5L2phdmEyc2VjdGVzdC5wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNTY5NDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3BvbGljeS9qYXZhMnNlY3Rlc3QucG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotZ3JhbnQgew0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJiYXNlZGlyIiwgInJlYWQiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJtYXZlbi5idWlsZC5kaXIiLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJleGl0Vk0iOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldFByb3RlY3Rpb25Eb21haW4iOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gIm1vZGlmeVRocmVhZEdyb3VwIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldElPIjsgICAgICAgIA0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldFNlY3VyaXR5TWFuYWdlciI7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke21hdmVuX2J1aWxkX2Rpcn0vY2xhc3Nlcy8iLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS9jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmNsYXNzIiwgInJlYWQiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke21hdmVuX2J1aWxkX2Rpcn0vY2xhc3Nlcy9vcmcvYXBhY2hlL3hlcmNlcy9kb20vQ2hhcmFjdGVyRGF0YUltcGwkMS5jbGFzcyIsICJyZWFkIjsgICAgIA0KLSANCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtY2xhc3Nlcy8iLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LWNsYXNzZXMvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuY2xhc3MiLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LWNsYXNzZXMvb3JnL2FwYWNoZS94ZXJjZXMvZG9tL0NEQVRBU2VjdGlvbkltcGwuY2xhc3MiLCAicmVhZCI7ICANCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHttYXZlbl9idWlsZF9kaXJ9L3Rlc3QtY2xhc3Nlcy9vcmcvYXBhY2hlL3hlcmNlcy9kb20vQ2hhcmFjdGVyRGF0YUltcGwkMS5jbGFzcyIsICJyZWFkIjsNCi0gICAgICAgIA0KLSAgICAgICAgDQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9sZXNzL0xlc3NQZXJtaXNzaW9uLmphciIsICJyZWFkIjsgDQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9tb3JlL01vcmVQZXJtaXNzaW9uLmphciIsICJyZWFkIjsNCi0gICAgICAgIA0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke21hdmVuX3JlcG9fbG9jYWx9Ly0iLCAicmVhZCI7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7bWF2ZW5faW5zdGFsbGVkX3Jvb3R9L2xpYi8tIiwgInJlYWQiOw0KLSAgICAgICAgDQotICAgICAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm1hdmVuX2J1aWxkX2RpciIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAibWF2ZW5fdGVzdF9kZXN0IiwgInJlYWQiOyAgICAgIA0KLSAgICAgICAgDQotfTsNCi0NCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke21hdmVuX2J1aWxkX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvbW9yZS9Nb3JlUGVybWlzc2lvbi5qYXIiIHsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHJpdmF0ZS9wcml2YXRlLnR4dCIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHVibGljL3B1YmxpYy50eHQiLCAicmVhZCI7DQotfTsNCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke21hdmVuX2J1aWxkX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvbGVzcy9MZXNzUGVybWlzc2lvbi5qYXIiIHsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHVibGljL3B1YmxpYy50eHQiLCAicmVhZCI7DQotfTsNCi0NCi0NCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke21hdmVuX2luc3RhbGxlZF9yb290fS9saWIvLSIgew0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2Jhc2VfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wdWJsaWMvcHVibGljLnR4dCIsICJyZWFkIjsNCi0gICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiJHtiYXNlX2Rpcn0vdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHJpdmF0ZS9wcml2YXRlLnR4dCIsICJyZWFkIjsNCi19Ow0KLQ0KLWdyYW50IGNvZGVCYXNlICJmaWxlOiR7bWF2ZW5fYnVpbGRfZGlyfS90ZXN0LWNsYXNzZXMvIiB7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7YmFzZV9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3B1YmxpYy9wdWJsaWMudHh0IiwgInJlYWQiOw0KLX07DQotDQotZ3JhbnQgY29kZUJhc2UgImZpbGU6JHttYXZlbl9idWlsZF9kaXJ9L2NsYXNzZXMvIiB7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7YmFzZV9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3B1YmxpYy9wdWJsaWMudHh0IiwgInJlYWQiOw0KLSAgICAgICAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIke2Jhc2VfZGlyfS90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wcml2YXRlL3ByaXZhdGUudHh0IiwgInJlYWQiOw0KLX07DQotDQotZ3JhbnQgY29kZUJhc2UgImZpbGU6JHttYXZlbl9yZXBvX2xvY2FsfS8tIiB7DQotICAgICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7YmFzZV9kaXJ9L3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3B1YmxpYy9wdWJsaWMudHh0IiwgInJlYWQiOw0KLX07DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL2phdmEyc2VjL3ByaXZhdGUvcHJpdmF0ZS50eHQgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHJpdmF0ZS9wcml2YXRlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExNzM4MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHJpdmF0ZS9wcml2YXRlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgbGluZSBpcyBmcm9tIHByaXZhdGUudHh0Lg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wdWJsaWMvcHVibGljLnR4dCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9qYXZhMnNlYy9wdWJsaWMvcHVibGljLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlNzViMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvamF2YTJzZWMvcHVibGljL3B1YmxpYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGxpbmUgaXMgZnJvbSBwdWJsaWMudHh0Lg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvc29hcG1lc3NhZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjIxZGJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy9zb2FwbWVzc2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgPHNvYXBlbnY6SGVhZGVyPgotICAgICAgICA8d3NhOk1lc3NhZ2VJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj51dWlkOjkyMEM1MTkwLTBCOEYtMTFEOS04Q0VELUYyMkVERUVCRjdFNTwvd3NhOk1lc3NhZ2VJRD4KLSAgICAgICAgPHdzYTpUbyBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5odHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydDwvd3NhOlRvPgotICAgICAgICA8d3NhOkZyb20gc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wMy9hZGRyZXNzaW5nL3JvbGUvYW5vbnltb3VzPC93c2E6QWRkcmVzcz4KLSAgICAgICAgPC93c2E6RnJvbT4KLSAgICAgICAgPHdzYTpBY3Rpb24+aHR0cDovL3dzLmFwYWNoZS5vcmcvdGVzdHMvYWN0aW9uPC93c2E6QWN0aW9uPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPG5zMTpnZXRCYWxhbmNlIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOm5zMT0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMvc2VydmljZXMvQmFua1BvcnQiPgotICAgICAgICAgICAgPGFjY291bnRObyBocmVmPSIjaWQwIi8+Ci0gICAgICAgIDwvbnMxOmdldEJhbGFuY2U+Ci0gICAgICAgIDxtdWx0aVJlZiBpZD0iaWQwIiBzb2FwZW5jOnJvb3Q9IjAiIHNvYXBlbnY6ZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhzaTp0eXBlPSJ4c2Q6aW50IiB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI+MTAwMTwvbXVsdGlSZWY+Ci0gICAgPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3Rlc3QueG1sIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjEzY2M4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iPgotICAgIDxzb2FwZW52OkhlYWRlciB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyI+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTQ+VmFsdWUgNDAwPC9zb2FwZW52OlJlZmVyZW5jZTQ+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTE+VmFsdWUgMTAwPC9zb2FwZW52OlJlZmVyZW5jZTE+Ci0gICAgICAgIDxzb2FwZW52OlJlZmVyZW5jZTA+VmFsdWUgMDwvc29hcGVudjpSZWZlcmVuY2UwPgotICAgICAgICA8c29hcGVudjpSZWZlcmVuY2UyPlZhbHVlIDIwMDwvc29hcGVudjpSZWZlcmVuY2UyPgotICAgICAgICA8c29hcGVudjpSZWZlcmVuY2UzPlZhbHVlIDMwMDwvc29hcGVudjpSZWZlcmVuY2UzPgotICAgICAgICA8d3NhOlNlcnZpY2VOYW1lIHdzYTpQb3J0TmFtZT0icG9ydCI+c2VydmljZU5TOlNlcnZpY2U8L3dzYTpTZXJ2aWNlTmFtZT4KLSAgICAgICAgPHdzYTpQb3J0VHlwZT5wb3J0TlM6UG9ydDwvd3NhOlBvcnRUeXBlPgotICAgICAgICA8d3NhOkZyb20+Ci0gICAgICAgICAgICA8d3NhOkFkZHJlc3M+aHR0cDovL3d3dy5mcm9tLm9yZy9zZXJ2aWNlLzwvd3NhOkFkZHJlc3M+Ci0gICAgICAgIDwvd3NhOkZyb20+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5Pjwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL1N3YVRlc3Qud3NkbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL1N3YVRlc3Qud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1M2FjNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvd3NkbC9Td2FUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyBuYW1lPSJQaW5nIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgeG1sbnM6dG5zPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPgotICA8dHlwZXM+Ci0gICAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJwaW5nIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9InBpbmdSZXNwb25zZSI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9IlBpbmciIHR5cGU9InRuczpwaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJQaW5nUmVzcG9uc2UiIHR5cGU9InRuczpwaW5nUmVzcG9uc2UiLz4KLSAgICA8L3NjaGVtYT4KLSAgPC90eXBlcz4KLQotICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVxdWVzdCI+Ci0gICAgPHBhcnQgbmFtZT0icGluZyIgZWxlbWVudD0idG5zOlBpbmciLz4KLSAgICA8cGFydCBuYW1lPSJhdHRhY2gxIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHBhcnQgbmFtZT0iYXR0YWNoMiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iUGluZ1Jlc3BvbnNlIj4KLSAgICA8cGFydCBuYW1lPSJwaW5nUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpQaW5nUmVzcG9uc2UiLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxwb3J0VHlwZSBuYW1lPSJQaW5nUG9ydCI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJQaW5nIj4KLSAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOlBpbmdSZXF1ZXN0Ii8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpQaW5nUmVzcG9uc2UiLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJQaW5nQmluZGluZyIgdHlwZT0idG5zOlBpbmdQb3J0Ij4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPGlucHV0PiAKLSAgICAgICAgICA8bWltZTptdWx0aXBhcnRSZWxhdGVkPgotICAgICAgICAgICAgPG1pbWU6cGFydD4KLSAgICAgICAgICAgICAgPHNvYXA6Ym9keSBwYXJ0cz0icGluZyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L21pbWU6cGFydD4KLSAgICAgICAgICAgIDxtaW1lOnBhcnQ+Ci0gICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgcGFydD0iYXR0YWNoMSIgdHlwZT0idGV4dC9wbGFpbiIvPgotICAgICAgICAgICAgPC9taW1lOnBhcnQ+Ci0gICAgICAgICAgICA8bWltZTpwYXJ0PgotICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHBhcnQ9ImF0dGFjaDIiIHR5cGU9InRleHQvcGxhaW4iLz4KLSAgICAgICAgICAgIDwvbWltZTpwYXJ0PgotICAgICAgICAgIDwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotICAgICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotICAgPC9iaW5kaW5nPgotCi0gIDxzZXJ2aWNlIG5hbWU9IlBpbmdTZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJQaW5nUG9ydCIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvUGluZ1NlcnZpY2UiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL2FjdGlvblRlc3RzLndzZGwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvd3NkbC9hY3Rpb25UZXN0cy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTk4NzkyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL2FjdGlvblRlc3RzLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iYWN0aW9uVGVzdHMiCi0JeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0LyI+Ci0JPHdzZGw6dHlwZXM+Ci0JPC93c2RsOnR5cGVzPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1JlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9SZXNwb25zZTEiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9SZXNwb25zZTEiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1JlcXVlc3QxIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJlY2hvUmVxdWVzdDEiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob2VjaG9GYXVsdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob2VjaG9GYXVsdCIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvZWNob0ZhdWx0MSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob2VjaG9GYXVsdDEiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlMiI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1Jlc3BvbnNlMiIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVxdWVzdDIiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9SZXF1ZXN0MiIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvZWNob0ZhdWx0MiI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob2VjaG9GYXVsdDIiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1Jlc3BvbnNlMyI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob1Jlc3BvbnNlMyIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvUmVxdWVzdDMiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImVjaG9SZXF1ZXN0MyIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJlY2hvZWNob0ZhdWx0MyI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iZWNob2VjaG9GYXVsdDMiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IndpdGhvdXRXU0FXQWN0aW9uIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9SZXF1ZXN0IiBuYW1lPSJOYW1lZElucHV0Ij48L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZSIgbmFtZT0iTmFtZWRPdXRwdXQiPjwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIG1lc3NhZ2U9InRuczplY2hvZWNob0ZhdWx0Ij48L3dzZGw6ZmF1bHQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IndpdGhXU0FXQWN0aW9uIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9SZXF1ZXN0MSIgd3NhdzpBY3Rpb249Imh0dHA6Ly9leGFtcGxlLm9yZy9hY3Rpb24vZWNob0luIj48L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZTEiIHdzYXc6QWN0aW9uPSJodHRwOi8vZXhhbXBsZS5vcmcvYWN0aW9uL2VjaG9PdXQiPjwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIG1lc3NhZ2U9InRuczplY2hvZWNob0ZhdWx0MSIgd3NhdzpBY3Rpb249Imh0dHA6Ly9leGFtcGxlLm9yZy9hY3Rpb24vZWNob0ZhdWx0Ij48L3dzZGw6ZmF1bHQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IndpdGhvdXRXU0FXQWN0aW9uTm9OYW1lIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9SZXF1ZXN0MiI+PC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UyIj48L3dzZGw6b3V0cHV0PgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0iZWNob0ZhdWx0IiBtZXNzYWdlPSJ0bnM6ZWNob2VjaG9GYXVsdDIiPjwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0id2l0aFNPQVBBY3Rpb24iPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNobyI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1JlcXVlc3QzIj48L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9SZXNwb25zZTMiPjwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIG1lc3NhZ2U9InRuczplY2hvZWNob0ZhdWx0MyI+PC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IndpdGhvdXRXU0FXQWN0aW9uQmluZGluZyIKLQkJdHlwZT0idG5zOndpdGhvdXRXU0FXQWN0aW9uIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0iZWNob0ZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IndpdGhXU0FXQWN0aW9uQmluZGluZyIKLQkJdHlwZT0idG5zOndpdGhXU0FXQWN0aW9uIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0iZWNob0ZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IndpdGhvdXRXU0FXQWN0aW9uTm9OYW1lQmluZGluZyIKLQkJdHlwZT0idG5zOndpdGhvdXRXU0FXQWN0aW9uTm9OYW1lIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0iZWNob0ZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IndpdGhTT0FQQWN0aW9uQmluZGluZyIKLQkJdHlwZT0idG5zOndpdGhTT0FQQWN0aW9uIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0JCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC9lY2hvIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQkJPHdzZGw6ZmF1bHQgbmFtZT0iZWNob0ZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJlY2hvRmF1bHQiIHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpmYXVsdD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9ImFjdGlvblRlc3RzIj4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6d2l0aFNPQVBBY3Rpb25CaW5kaW5nIgotCQkJbmFtZT0iYWN0aW9uVGVzdHNTT0FQIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZyIgLz4KLQkJPC93c2RsOnBvcnQ+Ci0JPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvd3NkbC90ZXN0MS53c2RsIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3QtcmVzb3VyY2VzL3dzZGwvdGVzdDEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxYWE4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvd3NkbC90ZXN0MS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFdTREwgZGVzY3JpcHRpb24gb2YgdGhlIFdTUyBQaW5nIGludGVyb3Agc2NlbmFyaW9zIC0tPgotCi08ZGVmaW5pdGlvbnMgbmFtZT0iRWNobyIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIgotICAgIHhtbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIgCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiCi0gICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL3dzLXBvbGljeS50ZXN0cyI+Ci0gICAgCSAgCi0gIDx0eXBlcz4KLSAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL0VjaG8iCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG8iPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNob1Jlc3BvbnNlIj4KLSAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgIDxlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9InhzZDpzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iRWNobyIgdHlwZT0idG5zOmVjaG8iLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9SZXNwb25zZSIvPgotICAgIDwvc2NoZW1hPgotICA8L3R5cGVzPgotCi0gIDxtZXNzYWdlIG5hbWU9IkVjaG9SZXF1ZXN0Ij4KLSAgICA8cGFydCBuYW1lPSJlY2hvIiBlbGVtZW50PSJ0bnM6RWNobyIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1Jlc3BvbnNlIj4KLSAgICA8cGFydCBuYW1lPSJlY2hvUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpFY2hvUmVzcG9uc2UiLz4KLSAgPC9tZXNzYWdlPgotCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvUG9ydCI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJFY2hvIj4KLSAgICAgIDxpbnB1dCAgbWVzc2FnZT0idG5zOkVjaG9SZXF1ZXN0IiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vaW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpFY2hvUmVzcG9uc2UiIHdzYTpBY3Rpb249Imh0dHA6Ly90ZXN0cy5vcmcvZWNoby9vdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InRuczpFY2hvUG9ydCI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIKLXN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iRWNobyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMvZWNobyIvPgotICAgICAgPGlucHV0PiAKLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLSAgIAotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InRuczpFY2hvQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRWNob1NlcnZpY2UiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QyLndzZGwgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC1yZXNvdXJjZXMvd3NkbC90ZXN0Mi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzhkMjZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tIFdTREwgZGVzY3JpcHRpb24gb2YgdGhlIFdTUyBQaW5nIGludGVyb3Agc2NlbmFyaW9zIC0tPgotCi08ZGVmaW5pdGlvbnMgbmFtZT0iRWNobyIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIgotICAgIHhtbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIgCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiCi0gICAgeG1sbnM6d3NhPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciCi0gICAgeG1sbnM6aW50Zj0iaHR0cDovL3dzLXBvbGljeS50ZXN0cyI+Ci0gICAgCi0gIDx3c3A6UG9saWN5IHdzdTpJZD0iTWVzc2FnZTEtMiI+Ci0gICAgPGludGY6TWVzc2FnZVBvbGljeVRlc3RBc3NlcnRpb24yIG1hcmtlcj0iNiIgLz4KLSAgPC93c3A6UG9saWN5PgotICAgIAotICA8d3NwOlBvbGljeSB3c3U6SWQ9Ik9wZXJhdGlvbjEtMiI+Ci0JPGludGY6T3BlcmF0aW9uUG9saWN5VGVzdEFzc2VydGlvbjIgbWFya2VyPSI2IiAvPgotICA8L3dzcDpQb2xpY3k+Ci0JCi0gIDx3c3A6UG9saWN5IHdzdTpJZD0iRW5kcG9pbnQxLTIiPgotICAgIDxpbnRmOkVuZHBvaW50UG9saWN5VGVzdEFzc2VydGlvbjIgbWFya2VyPSI3IiAvPgotICA8L3dzcDpQb2xpY3k+Ci0JICAKLSAgPHR5cGVzPgotICAgIDxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvRWNobyIKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8Y29tcGxleFR5cGUgbmFtZT0iZWNobyI+Ci0gICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2UiPgotICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbmlsbGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvIiB0eXBlPSJ0bnM6ZWNobyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob1Jlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob1Jlc3BvbnNlIi8+Ci0gICAgPC9zY2hlbWE+Ci0gIDwvdHlwZXM+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iRWNob1JlcXVlc3QiPgotICAgIDxwYXJ0IG5hbWU9ImVjaG8iIGVsZW1lbnQ9InRuczpFY2hvIi8+Ci0gIDwvbWVzc2FnZT4KLQotICA8bWVzc2FnZSBuYW1lPSJFY2hvUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9ImVjaG9SZXNwb25zZSIgZWxlbWVudD0idG5zOkVjaG9SZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9Qb3J0IiB3c3A6UG9saWN5VVJJcz0iI0VuZHBvaW50MS0yIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9IkVjaG8iPgotICAgICAgPHdzcDpQb2xpY3lSZWZlcmVuY2UgVVJJPSIjT3BlcmF0aW9uMS0yIi8+Ci0gICAgICA8aW5wdXQgIG1lc3NhZ2U9InRuczpFY2hvUmVxdWVzdCIgd3NwOlBvbGljeVVSSXM9IiNNZXNzYWdlMS0yIiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vaW4iLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOkVjaG9SZXNwb25zZSIgd3NwOlBvbGljeVVSSXM9IiNNZXNzYWdlMS0yIiB3c2E6QWN0aW9uPSJodHRwOi8vdGVzdHMub3JnL2VjaG8vb3V0IiAvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotCi0gIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJ0bnM6RWNob1BvcnQiPgotICAgIDx3c3A6UG9saWN5IHdzdTpJZD0iRW5kcG9pbnQyIj4KLQkgIDxpbnRmOkVuZHBvaW50UG9saWN5VGVzdEFzc2VydGlvbjEgbWFya2VyPSI2IiAvPgotICAgIDwvd3NwOlBvbGljeT4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIgotc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJFY2hvIj4KLSAgICAgIDx3c3A6UG9saWN5PgotICAgICAgICA8aW50ZjpPcGVyYXRpb25Qb2xpY3lUZXN0QXNzZXJ0aW9uMiBtYXJrZXI9IjMiIC8+Ci0gICAgICA8L3dzcDpQb2xpY3k+IAotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzL2VjaG8iLz4KLSAgICAgIDxpbnB1dD4gCi0gICAgICAgIDx3c3A6UG9saWN5PgotICAgICAgICAgIDxpbnRmOk1lc3NhZ2VQb2xpY3lUZXN0QXNzZXJ0aW9uMSBtYXJrZXI9IjIiIC8+Ci0JCTwvd3NwOlBvbGljeT4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICA8d3NwOlBvbGljeT4KLSAgICAgICAgICA8aW50ZjpNZXNzYWdlUG9saWN5VGVzdEFzc2VydGlvbjEgbWFya2VyPSIxIiAvPgotCQk8L3dzcDpQb2xpY3k+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9iaW5kaW5nPgotICAgCi0gIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4KLSAgICA8d3NwOlBvbGljeT4KLQkgIDxpbnRmOlNlcnZpY2VQb2xpY3lUZXN0QXNzZXJ0aW9uMSBtYXJrZXI9IjUiIC8+Ci0JPC93c3A6UG9saWN5PgotICAgIDxwb3J0IG5hbWU9IkVjaG9Qb3J0IiBiaW5kaW5nPSJ0bnM6RWNob0JpbmRpbmciPgotICAgICAgPHdzcDpQb2xpY3k+Ci0JICAgIDxpbnRmOkVuZHBvaW50UG9saWN5VGVzdEFzc2VydGlvbjEgbWFya2VyPSI0IiAvPgotCSAgPC93c3A6UG9saWN5PgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0VjaG9TZXJ2aWNlIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci0KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0Fic3RyYWN0VGVzdENhc2UuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhjZDM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvQWJzdHJhY3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRlc3QgY2FzZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3RDYXNlCi0gICAgICAgIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByb3RlY3RlZCBTdHJpbmcgdGVzdERpciA9ICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yOwotICAgIHByb3RlY3RlZCBTdHJpbmcgc2FtcGxlRGlyID0gInNhbXBsZXMiICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBvdXREaXIgPSAidGFyZ2V0IiArIEZpbGUuc2VwYXJhdG9yICsgImdlbmVyYXRlZCIgKwotICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKwotICAgICAgICAgICAgInNhbXBsZXMiICsKLSAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdGVtcERpciA9ICJ0YXJnZXQiICsgRmlsZS5zZXBhcmF0b3IgKyAiZ2VuZXJhdGVkIiArCi0gICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAidGVtcCI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0ZXN0UmVzb3VyY2VEaXIgPSAidGVzdC1yZXNvdXJjZXMiOwotCi0KLSAgICAvKioKLSAgICAgKiBCYXNlZGlyIGZvciBhbGwgZmlsZSBJL08uIEltcG9ydGFudCB3aGVuIHJ1bm5pbmcgdGVzdHMgZnJvbQotICAgICAqIHRoZSByZWFjdG9yLiAgTm90ZSB0aGF0IGFueW9uZSBjYW4gdXNlIHRoaXMgc3RhdGljYWxseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlZGlyOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpOwotICAgICAgICBpZiAoYmFzZWRpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBiYXNlZGlyID0gbmV3IEZpbGUoIi4iKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBBYnN0cmFjdFRlc3RDYXNlKFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgICAgIHRlc3REaXIgPSBuZXcgRmlsZShiYXNlZGlyLCB0ZXN0RGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgc2FtcGxlRGlyID0gbmV3IEZpbGUoYmFzZWRpciwgc2FtcGxlRGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgb3V0RGlyID0gbmV3IEZpbGUoYmFzZWRpciwgb3V0RGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgdGVtcERpciA9IG5ldyBGaWxlKGJhc2VkaXIsIHRlbXBEaXIpLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIEZpbGUgZ2V0VGVzdFJlc291cmNlRmlsZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZSh0ZXN0UmVzb3VyY2VEaXIsIHJlbGF0aXZlUGF0aCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0VjaG8yLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0VjaG8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTA4OGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9FY2hvMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLQotcHVibGljIGNsYXNzIEVjaG8yIHsKLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGVjaG8oU09BUEVudmVsb3BlIGluKSB7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0luYXZhbGlkTW9kdWxlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9JbmF2YWxpZE1vZHVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhNjFkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL0luYXZhbGlkTW9kdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLXB1YmxpYyBjbGFzcyBJbmF2YWxpZE1vZHVsZUltcGwgaW1wbGVtZW50cyBNb2R1bGUgewotICAgIC8vIGluaXRpYWxpemUgdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU5vdGlmeShBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvLyBzaHV0ZG93biB0aGUgbW9kdWxlCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9Nb2R1bGVIYW5kbGVyMS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9Nb2R1bGVIYW5kbGVyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJjYjM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvTW9kdWxlSGFuZGxlcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE1vZHVsZUhhbmRsZXIxIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyICB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1vZHVsZUhhbmRsZXIxIC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIE1vZHVsZUhhbmRsZXIxKCkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiaW5zaWRlIGludmFsaWQgbW9kdWxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0FkZHJlc3NpbmdGYXVsdHNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZhdWx0c1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4MjdlNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0ZhdWx0c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuRmluYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nRmF1bHRzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0RmF1bHRDb2RlKFFOYW1lIGdlbmVyaWNGYXVsdENvZGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNwZWNpZmljRmF1bHRDb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBhY3R1YWxGYXVsdENvZGUpIHsgCi0gICAgICAgIC8vIGluIFNPQVAgMS4xIGZhdWx0IGNvZGUgY2FuIGJlIGEgW1N1YmNvZGVdIG9yIFtTdWJzdWJjb2RlXSAKLSAgICAgICAgLy8gc28gbmVlZCB0byBjaGVjayBmb3IgYm90aAotICAgICAgICBpZiAoc3BlY2lmaWNGYXVsdENvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNwZWNpZmljIGZhdWx0IGNvZGUiLCBzcGVjaWZpY0ZhdWx0Q29kZSwgYWN0dWFsRmF1bHRDb2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJ1Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGFzc2VydEVxdWFscygiR2VuZXJpYyBmYXVsdCBjb2RlIiwgZ2VuZXJpY0ZhdWx0Q29kZSwgYWN0dWFsRmF1bHRDb2RlKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJJbnZhbGlkQ2FyZGluYWxpdHlGYXVsdChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsCi0gICAgICogU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJJbnZhbGlkQ2FyZGluYWxpdHlGYXVsdCgpIHsKLSAgICAgICAgLy9GaW5hbCBuYW1lc3BhY2UKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJJbnZhbGlkQ2FyZGluYWxpdHlGYXVsdChtZXNzYWdlQ29udGV4dCwgIkFjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZShuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIkludmFsaWRDYXJkaW5hbGl0eSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpBY3Rpb24iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1N1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJJbnZhbGlkQ2FyZGluYWxpdHlGYXVsdChtZXNzYWdlQ29udGV4dCwgIkFjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCl9LiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyQWN0aW9uTWlzbWF0Y2hGYXVsdCgpIHsKLSAgICAgICAgLy9GaW5hbCBuYW1lc3BhY2UKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJBY3Rpb25NaXNtYXRjaEZhdWx0KG1lc3NhZ2VDb250ZXh0LCAic29hcEFjdGlvbiIsICJ3c2FBY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHRlc3RGYXVsdENvZGUobmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsICJBY3Rpb25NaXNtYXRjaCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpBY3Rpb24iLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBGaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyQWN0aW9uTWlzbWF0Y2hGYXVsdChtZXNzYWdlQ29udGV4dCwgInNvYXBBY3Rpb24iLCAid3NhQWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlciN0cmlnZ2VyT25seUFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsCi0gICAgICogU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiUmVwbHlUbyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVJfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZShuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfT05MWV9BTk9OWU1PVVNfQUREUkVTU19TVVBQT1JURUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpSZXBseVRvIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU3VibWlzc2lvbiBuYW1lc3BhY2UKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJPbmx5QW5vbnltb3VzQWRkcmVzc1N1cHBvcnRlZEZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiUmVwbHlUbyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIjdHJpZ2dlck9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQob3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0LAotICAgICAqIFN0cmluZyl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdCgpIHsKLSAgICAgICAgLy9GaW5hbCBuYW1lc3BhY2UKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyT25seU5vbkFub255bW91c0FkZHJlc3NTdXBwb3J0ZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgIlJlcGx5VG8iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHRlc3RGYXVsdENvZGUobmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsIEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsIEZpbmFsLkZBVUxUX09OTFlfTk9OX0FOT05ZTU9VU19BRERSRVNTX1NVUFBPUlRFRCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpSZXBseVRvIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlcgotICAgICAgICAgICAgICAgICAgICAudHJpZ2dlck9ubHlOb25Bbm9ueW1vdXNBZGRyZXNzU3VwcG9ydGVkRmF1bHQobWVzc2FnZUNvbnRleHQsICJSZXBseVRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgUU5hbWUoU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCBTdWJtaXNzaW9uLkZBVUxUX0lOVkFMSURfSEVBREVSKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlciN0cmlnZ2VyTWVzc2FnZUFkZHJlc3NpbmdSZXF1aXJlZEZhdWx0KG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dCwKLSAgICAgKiBTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlck1lc3NhZ2VBZGRyZXNzaW5nUmVxdWlyZWRGYXVsdCgpIHsKLSAgICAgICAgLy9GaW5hbCBuYW1lc3BhY2UKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobWVzc2FnZUNvbnRleHQsICJBY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVEX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHRlc3RGYXVsdENvZGUobmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsIEZpbmFsLkZBVUxUX0FERFJFU1NJTkdfSEVBREVSX1JFUVVJUkVEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygid3NhOkFjdGlvbiIsICgoTWFwKW1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0hFQURFUl9RTkFNRSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1N1Ym1pc3Npb24gbmFtZXNwYWNlCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJNZXNzYWdlQWRkcmVzc2luZ1JlcXVpcmVkRmF1bHQobWVzc2FnZUNvbnRleHQsICJBY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRURfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIFN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19IRUFERVJfUkVRVUlSRUQpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdChvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQsCi0gICAgICogU3RyaW5nKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdCgpIHsKLSAgICAgICAgLy9GaW5hbCBuYW1lc3BhY2UKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyCi0gICAgICAgICAgICAgICAgICAgIC50cmlnZ2VyQWN0aW9uTm90U3VwcG9ydGVkRmF1bHQobWVzc2FnZUNvbnRleHQsICJodHRwOi8vaW5jb3JyZWN0L2FjdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRF9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB0ZXN0RmF1bHRDb2RlKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRCksCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9pbmNvcnJlY3QvYWN0aW9uIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5GQVVMVF9QUk9CTEVNX0FDVElPTl9OQU1FKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vU3VibWlzc2lvbiBuYW1lc3BhY2UKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIKLSAgICAgICAgICAgICAgICAgICAgLnRyaWdnZXJBY3Rpb25Ob3RTdXBwb3J0ZWRGYXVsdChtZXNzYWdlQ29udGV4dCwgImh0dHA6Ly9pbmNvcnJlY3QvYWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZBVUxUX0FDVElPTl9OT1RfU1VQUE9SVEVEX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKFN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgQWRkcmVzc2luZ0NvbnN0YW50cy5GQVVMVF9BQ1RJT05fTk9UX1NVUFBPUlRFRCksCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJEZXN0aW5hdGlvblVucmVhY2hhYmxlRmF1bHQoTWVzc2FnZUNvbnRleHQsIFN0cmluZyl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyRGVzdGluYXRpb25VbnJlYWNoYWJsZUZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckRlc3RpbmF0aW9uVW5yZWFjaGFibGVGYXVsdChtZXNzYWdlQ29udGV4dCwgImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLkZBVUxUX0FERFJFU1NJTkdfREVTVElOQVRJT05fVU5SRUFDSEFCTEVfUkVBU09OLCBhZi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgdGVzdEZhdWx0Q29kZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKEZpbmFsLldTQV9OQU1FU1BBQ0UsIEFkZHJlc3NpbmdDb25zdGFudHMuRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRSksCi0gICAgICAgICAgICAgICAgICAgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciLCAoKE1hcCltZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX0lORk9STUFUSU9OX0ZPUl9IRUFERVJTKSkuZ2V0KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLkZBVUxUX0hFQURFUl9QUk9CX0lSSSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfT1VUX01FU1NBR0VTKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vU3VibWlzc2lvbiBuYW1lc3BhY2UKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckRlc3RpbmF0aW9uVW5yZWFjaGFibGVGYXVsdChtZXNzYWdlQ29udGV4dCwgImh0dHA6Ly9zb21ld2hlcmUuY29tL3NvbWVob3ciKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN1Ym1pc3Npb24uRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRV9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIEFkZHJlc3NpbmdDb25zdGFudHMuRkFVTFRfQUREUkVTU0lOR19ERVNUSU5BVElPTl9VTlJFQUNIQUJMRSksCi0gICAgICAgICAgICAgICAgICAgIGFmLmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBBZGRyZXNzaW5nRmF1bHRzSGVscGVyI3RyaWdnZXJJbnZhbGlkRVBSRmF1bHQoTWVzc2FnZUNvbnRleHQsIFN0cmluZyl9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VySW52YWxpZEVQUkZhdWx0KCkgewotICAgICAgICAvL0ZpbmFsIG5hbWVzcGFjZQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NpbmdGYXVsdHNIZWxwZXIudHJpZ2dlckludmFsaWRFUFJGYXVsdChtZXNzYWdlQ29udGV4dCwgIlJlcGx5VG8iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbmFsLkZBVUxUX0lOVkFMSURfSEVBREVSX1JFQVNPTiwgYWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHRlc3RGYXVsdENvZGUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCBGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUiksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShGaW5hbC5XU0FfTkFNRVNQQUNFLCAiSW52YWxpZEVQUiIpLAotICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpSZXBseVRvIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VySW52YWxpZEVQUkZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiUmVwbHlUbyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlciN0cmlnZ2VyTWlzc2luZ0FkZHJlc3NJbkVQUkZhdWx0KE1lc3NhZ2VDb250ZXh0LCBTdHJpbmcpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlck1pc3NpbmdBZGRyZXNzSW5FUFJGYXVsdCgpIHsKLSAgICAgICAgLy9GaW5hbCBuYW1lc3BhY2UKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBZGRyZXNzaW5nRmF1bHRzSGVscGVyLnRyaWdnZXJNaXNzaW5nQWRkcmVzc0luRVBSRmF1bHQobWVzc2FnZUNvbnRleHQsICJSZXBseVRvIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaW5hbC5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB0ZXN0RmF1bHRDb2RlKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgRmluYWwuRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoRmluYWwuV1NBX05BTUVTUEFDRSwgIk1pc3NpbmdBZGRyZXNzSW5FUFIiKSwKLSAgICAgICAgICAgICAgICAgICAgYWYuZ2V0RmF1bHRDb2RlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3c2E6UmVwbHlUbyIsICgoTWFwKW1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfSU5GT1JNQVRJT05fRk9SX0hFQURFUlMpKS5nZXQoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuRkFVTFRfSEVBREVSX1BST0JfSEVBREVSX1FOQU1FKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9PVVRfTUVTU0FHRVMpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9TdWJtaXNzaW9uIG5hbWVzcGFjZQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWRkcmVzc2luZ0ZhdWx0c0hlbHBlci50cmlnZ2VyTWlzc2luZ0FkZHJlc3NJbkVQUkZhdWx0KG1lc3NhZ2VDb250ZXh0LCAiUmVwbHlUbyIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYWYpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3VibWlzc2lvbi5GQVVMVF9JTlZBTElEX0hFQURFUl9SRUFTT04sIGFmLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShTdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIFN1Ym1pc3Npb24uRkFVTFRfSU5WQUxJRF9IRUFERVIpLAotICAgICAgICAgICAgICAgICAgICBhZi5nZXRGYXVsdENvZGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzYTpSZXBseVRvIiwgKChNYXApbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5GQVVMVF9JTkZPUk1BVElPTl9GT1JfSEVBREVSUykpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5GQVVMVF9IRUFERVJfUFJPQl9IRUFERVJfUU5BTUUpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX09VVF9NRVNTQUdFUykpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2FkZHJlc3NpbmcvQWRkcmVzc2luZ0hlbHBlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nSGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWUwYTk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9BZGRyZXNzaW5nSGVscGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFkZHJlc3NpbmdIZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdElzUmVwbHlSZWRpcmVjdGVkTm9SZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBhc3NlcnRGYWxzZShBZGRyZXNzaW5nSGVscGVyLmlzUmVwbHlSZWRpcmVjdGVkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzUmVwbHlSZWRpcmVjdGVkQW5vblJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FOT05ZTU9VU19VUkwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQWRkcmVzc2luZ0hlbHBlci5pc1JlcGx5UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlcGx5UmVkaXJlY3RlZE5vbkFub25SZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1JlcGx5UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1JlcGx5UmVkaXJlY3RlZE5vbmVSZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OT05FX1VSSSkpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNSZXBseVJlZGlyZWN0ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNGYXVsdFJlZGlyZWN0ZWROb0ZhdWx0VG9PclJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNGYXVsdFJlZGlyZWN0ZWROb0ZhdWx0VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBZGRyZXNzaW5nSGVscGVyLmlzRmF1bHRSZWRpcmVjdGVkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzRmF1bHRSZWRpcmVjdGVkQW5vbkZhdWx0VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldEZhdWx0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX0FOT05ZTU9VU19VUkwpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ZhdWx0UmVkaXJlY3RlZE5vbkFub25GYXVsdFRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRGYXVsdFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0ZhdWx0UmVkaXJlY3RlZE5vbmVSZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OT05FX1VSSSkpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jUmVwbHlBbGxvd2VkTm9SZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jUmVwbHlBbGxvd2VkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzU3luY1JlcGx5QWxsb3dlZEFub25SZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9BTk9OWU1PVVNfVVJMKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNSZXBseUFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jUmVwbHlBbGxvd2VkTm9uQW5vblJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNSZXBseUFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jUmVwbHlBbGxvd2VkTm9uZVJlcGx5VG8oKSB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1jLnNldFJlcGx5VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQWRkcmVzc2luZ0hlbHBlci5pc1N5bmNSZXBseUFsbG93ZWQobWMpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNTeW5jRmF1bHRBbGxvd2VkTm9GYXVsdFRvT3JSZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jRmF1bHRBbGxvd2VkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzU3luY0ZhdWx0QWxsb3dlZE5vRmF1bHRUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIikpOwotICAgICAgICBhc3NlcnRGYWxzZShBZGRyZXNzaW5nSGVscGVyLmlzU3luY0ZhdWx0QWxsb3dlZChtYykpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc1N5bmNGYXVsdEFsbG93ZWRBbm9uRmF1bHRUbygpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0RmF1bHRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCkpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jRmF1bHRBbGxvd2VkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzU3luY0ZhdWx0QWxsb3dlZE5vbkFub25GYXVsdFRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRGYXVsdFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jRmF1bHRBbGxvd2VkKG1jKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzU3luY0ZhdWx0QWxsb3dlZE5vbmVSZXBseVRvKCkgewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtYy5zZXRSZXBseVRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OT05FX1VSSSkpOwotICAgICAgICBhc3NlcnRUcnVlKEFkZHJlc3NpbmdIZWxwZXIuaXNTeW5jRmF1bHRBbGxvd2VkKG1jKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlSGVscGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlSGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmJjZTIxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZUhlbHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvQW5kRnJvbU9NRm9yRmluYWxTcGVjRVBSKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIjsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOwotCi0gICAgICAgIE9NRmFjdG9yeSBvbWYgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMxID0gb21mLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vdXJpMSIsICJwcmVmaXgxIik7Ci0gICAgICAgIE9NQXR0cmlidXRlIGF0dHIxID0gb21mLmNyZWF0ZU9NQXR0cmlidXRlKCJhdHRyMSIsIG5zMSwgImF0dHIxdmFsdWUiKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMyID0gb21mLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vdXJpMiIsICJwcmVmaXgyIik7Ci0gICAgICAgIE9NQXR0cmlidXRlIGF0dHIyID0gb21mLmNyZWF0ZU9NQXR0cmlidXRlKCJhdHRyMiIsIG5zMiwgImF0dHIydmFsdWUiKTsKLSAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyMSk7Ci0gICAgICAgIGVwci5hZGRBdHRyaWJ1dGUoYXR0cjIpOwotICAgICAgICBPTUVsZW1lbnQgbWQxID0gb21mLmNyZWF0ZU9NRWxlbWVudCgibWQxIiwgImh0dHA6Ly9tZHVyaTEiLCAibWQxcHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZDIgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJtZDIiLCAiaHR0cDovL21kdXJpMiIsICJtZDJwcmVmaXgiKTsKLSAgICAgICAgZXByLmFkZE1ldGFEYXRhKG1kMSk7Ci0gICAgICAgIGVwci5hZGRNZXRhRGF0YShtZDIpOwotICAgICAgICBPTUVsZW1lbnQgZXh0MSA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoImV4dDEiLCAiaHR0cDovL2V4dHVyaTEiLCAiZXh0MXByZWZpeCIpOwotICAgICAgICBPTUVsZW1lbnQgZXh0MiA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoImV4dDIiLCAiaHR0cDovL2V4dHVyaTIiLCAiZXh0MnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkRXh0ZW5zaWJsZUVsZW1lbnQoZXh0MSk7Ci0gICAgICAgIGVwci5hZGRFeHRlbnNpYmxlRWxlbWVudChleHQyKTsKLSAgICAgICAgUU5hbWUgcnAxUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycDF1cmkiLCAicmVmUGFybTEiLCAicnAxcHJlZml4Iik7Ci0gICAgICAgIFFOYW1lIHJwMlFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vcnAydXJpIiwgInJlZlBhcm0yIiwgInJwMnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKHJwMVFuYW1lLCAicnAxIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIocnAyUW5hbWUsICJycDIiKTsKLQotICAgICAgICBBcnJheUxpc3QgYWRkcmVzc0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyMSk7Ci0gICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyMik7Ci0gICAgICAgIGVwci5zZXRBZGRyZXNzQXR0cmlidXRlcyhhZGRyZXNzQXR0cmlidXRlcyk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbWV0YWRhdGFBdHRyaWJ1dGVzLmFkZChhdHRyMSk7Ci0gICAgICAgIG1ldGFkYXRhQXR0cmlidXRlcy5hZGQoYXR0cjIpOwotICAgICAgICBlcHIuc2V0TWV0YWRhdGFBdHRyaWJ1dGVzKG1ldGFkYXRhQXR0cmlidXRlcyk7Ci0KLSAgICAgICAgT01FbGVtZW50IG9tID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIudG9PTShvbWYsIGVwciwgbmV3IFFOYW1lKCJodHRwOi8vbnN1cmwiLCAibG9jYWxOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmaXgiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICAvL1Rlc3QgZGVzZXJpYWxpemUgdXNpbmcgZnJvbU9NKE9NRWxlbWVudCkKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZGVzZXIgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00ob20pOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhlcHIuZ2V0QWRkcmVzcygpLCBkZXNlci5nZXRBZGRyZXNzKCkpOwotICAgICAgICBBcnJheUxpc3QgYWRkckF0dHJzID0gZGVzZXIuZ2V0QWRkcmVzc0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBhZGRyQXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBhZGRyQXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgYXR0cnMgPSBkZXNlci5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMSwgYXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBhdHRycy5nZXQoMSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBtZXRhZGF0YSA9IGRlc2VyLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZDEsIG1ldGFkYXRhLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZDIsIG1ldGFkYXRhLmdldCgxKSk7Ci0gICAgICAgIEFycmF5TGlzdCBtZEF0dHJzID0gZGVzZXIuZ2V0TWV0YWRhdGFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMSwgbWRBdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjIsIG1kQXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgZXh0ZWx0cyA9IGRlc2VyLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0MSwgZXh0ZWx0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0MiwgZXh0ZWx0cy5nZXQoMSkpOwotCi0gICAgICAgIE1hcCBtID0gZGVzZXIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJwMSIsICgoT01FbGVtZW50KSBtLmdldChycDFRbmFtZSkpLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAyIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMlFuYW1lKSkuZ2V0VGV4dCgpKTsKLQotICAgICAgICAvL1Rlc3QgZGVzZXJpYWxpemUgdXNpbmcgZnJvbU9NKEVuZHBvaW50UmVmZXJlbmNlLCBPTUVsZW1lbnQsIFN0cmluZykKLSAgICAgICAgZGVzZXIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZGVzZXIsIG9tLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhlcHIuZ2V0QWRkcmVzcygpLCBkZXNlci5nZXRBZGRyZXNzKCkpOwotICAgICAgICBhZGRyQXR0cnMgPSBkZXNlci5nZXRBZGRyZXNzQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIGFkZHJBdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjIsIGFkZHJBdHRycy5nZXQoMSkpOwotCi0gICAgICAgIGF0dHJzID0gZGVzZXIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIGF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgYXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBtZXRhZGF0YSA9IGRlc2VyLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZDEsIG1ldGFkYXRhLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZDIsIG1ldGFkYXRhLmdldCgxKSk7Ci0gICAgICAgIG1kQXR0cnMgPSBkZXNlci5nZXRNZXRhZGF0YUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBtZEF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgbWRBdHRycy5nZXQoMSkpOwotCi0gICAgICAgIGV4dGVsdHMgPSBkZXNlci5nZXRFeHRlbnNpYmxlRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dDEsIGV4dGVsdHMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4dDIsIGV4dGVsdHMuZ2V0KDEpKTsKLQotICAgICAgICBtID0gZGVzZXIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJwMSIsICgoT01FbGVtZW50KSBtLmdldChycDFRbmFtZSkpLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAyIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMlFuYW1lKSkuZ2V0VGV4dCgpKTsKLQotICAgICAgICAvL0ZhaWx1cmUgdGVzdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVzZXIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGRlc2VyLCBvbSwgQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOwotICAgICAgICAgICAgZmFpbCgiQW4gZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byBmYWlsdXJlIHRvIGxvY2F0ZSBhIHdzYTpBZGRyZXNzIGZpZWxkLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9BbmRGcm9tT01Gb3JTdWJtaXNzaW9uU3BlY0VQUigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYWRkcmVzcyA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMiI7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzKTsKLQotICAgICAgICBPTUZhY3Rvcnkgb21mID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zMSA9IG9tZi5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3VyaTEiLCAicHJlZml4MSIpOwotICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyMSA9IG9tZi5jcmVhdGVPTUF0dHJpYnV0ZSgiYXR0cjEiLCBuczEsICJhdHRyMXZhbHVlIik7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zMiA9IG9tZi5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3VyaTIiLCAicHJlZml4MiIpOwotICAgICAgICBPTUF0dHJpYnV0ZSBhdHRyMiA9IG9tZi5jcmVhdGVPTUF0dHJpYnV0ZSgiYXR0cjIiLCBuczIsICJhdHRyMnZhbHVlIik7Ci0gICAgICAgIGVwci5hZGRBdHRyaWJ1dGUoYXR0cjEpOwotICAgICAgICBlcHIuYWRkQXR0cmlidXRlKGF0dHIyKTsKLSAgICAgICAgT01FbGVtZW50IG1kMSA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoIm1kMSIsICJodHRwOi8vbWR1cmkxIiwgIm1kMXByZWZpeCIpOwotICAgICAgICBPTUVsZW1lbnQgbWQyID0gb21mLmNyZWF0ZU9NRWxlbWVudCgibWQyIiwgImh0dHA6Ly9tZHVyaTIiLCAibWQycHJlZml4Iik7Ci0gICAgICAgIGVwci5hZGRNZXRhRGF0YShtZDEpOwotICAgICAgICBlcHIuYWRkTWV0YURhdGEobWQyKTsKLSAgICAgICAgT01FbGVtZW50IGV4dDEgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJleHQxIiwgImh0dHA6Ly9leHR1cmkxIiwgImV4dDFwcmVmaXgiKTsKLSAgICAgICAgT01FbGVtZW50IGV4dDIgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJleHQyIiwgImh0dHA6Ly9leHR1cmkyIiwgImV4dDJwcmVmaXgiKTsKLSAgICAgICAgZXByLmFkZEV4dGVuc2libGVFbGVtZW50KGV4dDEpOwotICAgICAgICBlcHIuYWRkRXh0ZW5zaWJsZUVsZW1lbnQoZXh0Mik7Ci0gICAgICAgIFFOYW1lIHJwMVFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vcnAxdXJpIiwgInJlZlBhcm0xIiwgInJwMXByZWZpeCIpOwotICAgICAgICBRTmFtZSBycDJRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3JwMnVyaSIsICJyZWZQYXJtMiIsICJycDJwcmVmaXgiKTsKLSAgICAgICAgZXByLmFkZFJlZmVyZW5jZVBhcmFtZXRlcihycDFRbmFtZSwgInJwMSIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKHJwMlFuYW1lLCAicnAyIik7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGFkZHJlc3NBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhZGRyZXNzQXR0cmlidXRlcy5hZGQoYXR0cjEpOwotICAgICAgICBhZGRyZXNzQXR0cmlidXRlcy5hZGQoYXR0cjIpOwotICAgICAgICBlcHIuc2V0QWRkcmVzc0F0dHJpYnV0ZXMoYWRkcmVzc0F0dHJpYnV0ZXMpOwotCi0gICAgICAgIE9NRWxlbWVudCBvbSA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00ob21mLCBlcHIsIG5ldyBRTmFtZSgiaHR0cDovL25zdXJsIiwgImxvY2FsTmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlZml4IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICAvL0FkZCBzb21lIHJlZmVyZW5jZSBwcm9wZXJ0aWVzLgotICAgICAgICBRTmFtZSBwMVFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vcDF1cmkiLCAicmVmUHJvcDEiLCAicDFwcmVmaXgiKTsKLSAgICAgICAgUU5hbWUgcDJRbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3AydXJpIiwgInJlZlByb3AyIiwgInAycHJlZml4Iik7Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFLCAiUmVmZXJlbmNlUHJvcGVydGllcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NpbmdDb25zdGFudHMuV1NBX0RFRkFVTFRfUFJFRklYKTsKLSAgICAgICAgT01FbGVtZW50IHJlZmVyZW5jZVByb3BlcnRpZXMgPSBvbWYuY3JlYXRlT01FbGVtZW50KHFuYW1lLCBvbSk7Ci0gICAgICAgIE9NRWxlbWVudCBwcm9wMSA9IG9tZi5jcmVhdGVPTUVsZW1lbnQocDFRbmFtZSwgcmVmZXJlbmNlUHJvcGVydGllcyk7Ci0gICAgICAgIE9NRWxlbWVudCBwcm9wMiA9IG9tZi5jcmVhdGVPTUVsZW1lbnQocDJRbmFtZSwgcmVmZXJlbmNlUHJvcGVydGllcyk7Ci0gICAgICAgIHByb3AxLnNldFRleHQoInAxIik7Ci0gICAgICAgIHByb3AyLnNldFRleHQoInAyIik7Ci0KLSAgICAgICAgLy9UZXN0IGRlc2VyaWFsaXplIHVzaW5nIGZyb21PTShPTUVsZW1lbnQpCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGRlc2VyID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKG9tKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZXByLmdldEFkZHJlc3MoKSwgZGVzZXIuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgQXJyYXlMaXN0IGFkZHJBdHRycyA9IGRlc2VyLmdldEFkZHJlc3NBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMSwgYWRkckF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgYWRkckF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGF0dHJzID0gZGVzZXIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjEsIGF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhhdHRyMiwgYXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICAvL01ldGFkYXRhIHdpbGwgYmUgbG9zdCB1bmxlc3MgaXQgaXMgc2F2ZWQgYXMgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgICAgICBBcnJheUxpc3QgbWV0YWRhdGEgPSBkZXNlci5nZXRNZXRhRGF0YSgpOwotICAgICAgICBhc3NlcnROdWxsKG1ldGFkYXRhKTsKLQotICAgICAgICBBcnJheUxpc3QgZXh0ZWx0cyA9IGRlc2VyLmdldEV4dGVuc2libGVFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0MSwgZXh0ZWx0cy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0MiwgZXh0ZWx0cy5nZXQoMSkpOwotCi0gICAgICAgIC8vQWxsIHJlZmVyZW5jZSBwcm9wZXJ0aWVzIGFyZSByZXR1cm5lZCBhcyByZWZlcmVuY2UgcGFyYW1ldGVycy4KLSAgICAgICAgTWFwIG0gPSBkZXNlci5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg0LCBtLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMVFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDIiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAyUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHAxUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInAyIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHAyUW5hbWUpKS5nZXRUZXh0KCkpOwotCi0gICAgICAgIC8vVGVzdCBkZXNlcmlhbGl6ZSB1c2luZyBmcm9tT00oRW5kcG9pbnRSZWZlcmVuY2UsIE9NRWxlbWVudCwgU3RyaW5nKQotICAgICAgICBkZXNlciA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiIik7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLmZyb21PTShkZXNlciwgb20sIEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZXByLmdldEFkZHJlc3MoKSwgZGVzZXIuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgYWRkckF0dHJzID0gZGVzZXIuZ2V0QWRkcmVzc0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBhZGRyQXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIyLCBhZGRyQXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBhdHRycyA9IGRlc2VyLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHIxLCBhdHRycy5nZXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXR0cjIsIGF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgLy9NZXRhZGF0YSB3aWxsIGJlIGxvc3QgdW5sZXNzIGl0IGlzIHNhdmVkIGFzIGFuIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICAgICAgbWV0YWRhdGEgPSBkZXNlci5nZXRNZXRhRGF0YSgpOwotICAgICAgICBhc3NlcnROdWxsKG1ldGFkYXRhKTsKLQotICAgICAgICBleHRlbHRzID0gZGVzZXIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQxLCBleHRlbHRzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQyLCBleHRlbHRzLmdldCgxKSk7Ci0KLSAgICAgICAgLy9BbGwgcmVmZXJlbmNlIHByb3BlcnRpZXMgYXJlIHJldHVybmVkIGFzIHJlZmVyZW5jZSBwYXJhbWV0ZXJzLgotICAgICAgICBtID0gZGVzZXIuZ2V0QWxsUmVmZXJlbmNlUGFyYW1ldGVycygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgbS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJwMSIsICgoT01FbGVtZW50KSBtLmdldChycDFRbmFtZSkpLmdldFRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAyIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMlFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwMSIsICgoT01FbGVtZW50KSBtLmdldChwMVFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwMiIsICgoT01FbGVtZW50KSBtLmdldChwMlFuYW1lKSkuZ2V0VGV4dCgpKTsKLQotICAgICAgICAvL0ZhaWx1cmUgdGVzdAotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVzZXIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoIiIpOwotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGRlc2VyLCBvbSwgQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFKTsKLSAgICAgICAgICAgIGZhaWwoIkFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBkdWUgdG8gZmFpbHVyZSB0byBsb2NhdGUgYSB3c2E6QWRkcmVzcyBmaWVsZC4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vcGFzcwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlVHlwZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9FbmRwb2ludFJlZmVyZW5jZVR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjRkZGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL0VuZHBvaW50UmVmZXJlbmNlVHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRSZWZlcmVuY2VUeXBlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIEVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50UmVmZXJlbmNlOwotICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3MgPSAiaHR0dHA6Ly93d3d3Lm9wZW5vdXJjZS5say9+Y2hpbnRoYWthIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oRW5kcG9pbnRSZWZlcmVuY2VUeXBlVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIFRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBlbmRwb2ludFJlZmVyZW5jZSA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZShhZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5kU2V0QWRkcmVzcygpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIG5vdCBzZXQgcHJvcGVybHkgaW4gdGhlIGNvbnN0cnVjdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICBlbmRwb2ludFJlZmVyZW5jZS5nZXRBZGRyZXNzKCkpOwotCi0gICAgICAgIFN0cmluZyBuZXdBZGRyZXNzID0gImh0dHA6Ly93d3cuYXhpczIuY29tIjsKLSAgICAgICAgZW5kcG9pbnRSZWZlcmVuY2Uuc2V0QWRkcmVzcyhuZXdBZGRyZXNzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIG5vdCBzZXQgcHJvcGVybHkgaW4gdGhlIHNldHRlciBtZXRob2QiLAotICAgICAgICAgICAgICAgICAgICAgbmV3QWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50UmVmZXJlbmNlLmdldEFkZHJlc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFuZFNldFJlZmVyZW5jZVBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAgICAgZW5kcG9pbnRSZWZlcmVuY2UuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93d3cub3BlbnNvdWNlLmxrLyIgKyBpLCAiIiArIGkpLAotICAgICAgICAgICAgICAgICAgICAidmFsdWUgIiArIGkgKiA1MCk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgcmV0cmlldmVkUmVmZXJlbmNlUGFyYW1ldGVycyA9IGVuZHBvaW50UmVmZXJlbmNlLmdldEFsbFJlZmVyZW5jZVBhcmFtZXRlcnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVmZXJlbmNlUGFyYW1ldGVyID0gKE9NRWxlbWVudCkgcmV0cmlldmVkUmVmZXJlbmNlUGFyYW1ldGVycy5nZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy5vcGVuc291Y2UubGsvIiArIGksICIiICsgaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAiSW5wdXQgdmFsdWUgZGlmZmVycyBmcm9tIHdoYXQgaXMgdGFrZW4gb3V0IGZyb20gQW55Q29udGVudFR5cGUiLAotICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VQYXJhbWV0ZXIuZ2V0VGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAidmFsdWUgIiArIGkgKiA1MCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vbnltb3VzQWRkcmVzcygpIHsKLSAgICAgICAgLy8gRGVmYXVsdCBFbmRwb2ludFJlZmVyZW5jZSBkb2VzIG5vdCBoYXMgJ2Fub255bW91cyBhZGRyZXNzJwotICAgICAgICBhc3NlcnRGYWxzZShlbmRwb2ludFJlZmVyZW5jZS5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpOwotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggMjAwNS8wOCBBbm9ueW1vdXMgYWRkcmVzcwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIyMDA1MDhhbm9uID0KLSAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfQU5PTllNT1VTX1VSTCk7Ci0gICAgICAgIGFzc2VydFRydWUoZXByMjAwNTA4YW5vbi5oYXNBbm9ueW1vdXNBZGRyZXNzKCkpOwotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggMjAwNC8wOCBBbm9ueW1vdXMgYWRkcmVzcwotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSBlcHIyMDA0MDhhbm9uID0KLSAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9BTk9OWU1PVVNfVVJMKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlcHIyMDA0MDhhbm9uLmhhc0Fub255bW91c0FkZHJlc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhhc05vbmVBZGRyZXNzKCkgewotICAgICAgICAvLyBEZWZhdWx0IEVuZHBvaW50UmVmZXJlbmNlIGRvZXMgbm90IGhhcyAnYW5vbnltb3VzIGFkZHJlc3MnCi0gICAgICAgIGFzc2VydEZhbHNlKGVuZHBvaW50UmVmZXJlbmNlLmhhc05vbmVBZGRyZXNzKCkpOwotCi0gICAgICAgIC8vIEVuZHBvaW50UmVmZXJlbmNlIHdpdGggMjAwNS8wOCBOb25lIGFkZHJlc3MKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByMjAwNTA4bm9uZSA9Ci0gICAgICAgICAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05PTkVfVVJJKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlcHIyMDA1MDhub25lLmhhc05vbmVBZGRyZXNzKCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25EZXNlcmlhbGl6YXRpb24oKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhZGRyZXNzID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIjsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGFkZHJlc3MpOwotCi0gICAgICAgIE9NRmFjdG9yeSBvbWYgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMxID0gb21mLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vdXJpMSIsICJwcmVmaXgxIik7Ci0gICAgICAgIE9NQXR0cmlidXRlIGF0dHIxID0gb21mLmNyZWF0ZU9NQXR0cmlidXRlKCJhdHRyMSIsIG5zMSwgImF0dHIxdmFsdWUiKTsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMyID0gb21mLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vdXJpMiIsICJwcmVmaXgyIik7Ci0gICAgICAgIE9NQXR0cmlidXRlIGF0dHIyID0gb21mLmNyZWF0ZU9NQXR0cmlidXRlKCJhdHRyMiIsIG5zMiwgImF0dHIydmFsdWUiKTsKLSAgICAgICAgZXByLmFkZEF0dHJpYnV0ZShhdHRyMSk7Ci0gICAgICAgIGVwci5hZGRBdHRyaWJ1dGUoYXR0cjIpOwotICAgICAgICBPTUVsZW1lbnQgbWQxID0gb21mLmNyZWF0ZU9NRWxlbWVudCgibWQxIiwgImh0dHA6Ly9tZHVyaTEiLCAibWQxcHJlZml4Iik7Ci0gICAgICAgIE9NRWxlbWVudCBtZDIgPSBvbWYuY3JlYXRlT01FbGVtZW50KCJtZDIiLCAiaHR0cDovL21kdXJpMiIsICJtZDJwcmVmaXgiKTsKLSAgICAgICAgZXByLmFkZE1ldGFEYXRhKG1kMSk7Ci0gICAgICAgIGVwci5hZGRNZXRhRGF0YShtZDIpOwotICAgICAgICBPTUVsZW1lbnQgZXh0MSA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoImV4dDEiLCAiaHR0cDovL2V4dHVyaTEiLCAiZXh0MXByZWZpeCIpOwotICAgICAgICBPTUVsZW1lbnQgZXh0MiA9IG9tZi5jcmVhdGVPTUVsZW1lbnQoImV4dDIiLCAiaHR0cDovL2V4dHVyaTIiLCAiZXh0MnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkRXh0ZW5zaWJsZUVsZW1lbnQoZXh0MSk7Ci0gICAgICAgIGVwci5hZGRFeHRlbnNpYmxlRWxlbWVudChleHQyKTsKLSAgICAgICAgUU5hbWUgcnAxUW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9ycDF1cmkiLCAicmVmUGFybTEiLCAicnAxcHJlZml4Iik7Ci0gICAgICAgIFFOYW1lIHJwMlFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vcnAydXJpIiwgInJlZlBhcm0yIiwgInJwMnByZWZpeCIpOwotICAgICAgICBlcHIuYWRkUmVmZXJlbmNlUGFyYW1ldGVyKHJwMVFuYW1lLCAicnAxIik7Ci0gICAgICAgIGVwci5hZGRSZWZlcmVuY2VQYXJhbWV0ZXIocnAyUW5hbWUsICJycDIiKTsKLQotICAgICAgICBBcnJheUxpc3QgYWRkcmVzc0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyMSk7Ci0gICAgICAgIGFkZHJlc3NBdHRyaWJ1dGVzLmFkZChhdHRyMik7Ci0gICAgICAgIGVwci5zZXRBZGRyZXNzQXR0cmlidXRlcyhhZGRyZXNzQXR0cmlidXRlcyk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgbWV0YWRhdGFBdHRyaWJ1dGVzLmFkZChhdHRyMSk7Ci0gICAgICAgIG1ldGFkYXRhQXR0cmlidXRlcy5hZGQoYXR0cjIpOwotICAgICAgICBlcHIuc2V0TWV0YWRhdGFBdHRyaWJ1dGVzKG1ldGFkYXRhQXR0cmlidXRlcyk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICBvb3Mud3JpdGVPYmplY3QoZXByKTsKLQotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZGVzZXJpYWxpemVkRVBSID0gKEVuZHBvaW50UmVmZXJlbmNlKSBvaXMucmVhZE9iamVjdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhlcHIuZ2V0QWRkcmVzcygpLCBkZXNlcmlhbGl6ZWRFUFIuZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgQXJyYXlMaXN0IGFkZHJBdHRycyA9IGRlc2VyaWFsaXplZEVQUi5nZXRBZGRyZXNzQXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRBdHRyaWJ1dGVzRXF1YWwoYXR0cjEsIChPTUF0dHJpYnV0ZSkgYWRkckF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEF0dHJpYnV0ZXNFcXVhbChhdHRyMiwgKE9NQXR0cmlidXRlKSBhZGRyQXR0cnMuZ2V0KDEpKTsKLQotICAgICAgICBBcnJheUxpc3QgYXR0cnMgPSBkZXNlcmlhbGl6ZWRFUFIuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBhc3NlcnRBdHRyaWJ1dGVzRXF1YWwoYXR0cjEsIChPTUF0dHJpYnV0ZSkgYXR0cnMuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0QXR0cmlidXRlc0VxdWFsKGF0dHIyLCAoT01BdHRyaWJ1dGUpIGF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG1ldGFkYXRhID0gZGVzZXJpYWxpemVkRVBSLmdldE1ldGFEYXRhKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZDEudG9TdHJpbmcoKSwgbWV0YWRhdGEuZ2V0KDApLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWQyLnRvU3RyaW5nKCksIG1ldGFkYXRhLmdldCgxKS50b1N0cmluZygpKTsKLSAgICAgICAgQXJyYXlMaXN0IG1kQXR0cnMgPSBkZXNlcmlhbGl6ZWRFUFIuZ2V0TWV0YWRhdGFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydEF0dHJpYnV0ZXNFcXVhbChhdHRyMSwgKE9NQXR0cmlidXRlKSBtZEF0dHJzLmdldCgwKSk7Ci0gICAgICAgIGFzc2VydEF0dHJpYnV0ZXNFcXVhbChhdHRyMiwgKE9NQXR0cmlidXRlKSBtZEF0dHJzLmdldCgxKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0IGV4dGVsdHMgPSBkZXNlcmlhbGl6ZWRFUFIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHQxLnRvU3RyaW5nKCksIGV4dGVsdHMuZ2V0KDApLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXh0Mi50b1N0cmluZygpLCBleHRlbHRzLmdldCgxKS50b1N0cmluZygpKTsKLQotICAgICAgICBNYXAgbSA9IGRlc2VyaWFsaXplZEVQUi5nZXRBbGxSZWZlcmVuY2VQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicnAxIiwgKChPTUVsZW1lbnQpIG0uZ2V0KHJwMVFuYW1lKSkuZ2V0VGV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJycDIiLCAoKE9NRWxlbWVudCkgbS5nZXQocnAyUW5hbWUpKS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBdHRyaWJ1dGVzRXF1YWwoT01BdHRyaWJ1dGUgYXR0cmlidXRlMSwgT01BdHRyaWJ1dGUgYXR0cmlidXRlMikgewotICAgICAgICBpZiAoIWF0dHJpYnV0ZTEuZ2V0QXR0cmlidXRlVmFsdWUoKS5lcXVhbHMoYXR0cmlidXRlMi5nZXRBdHRyaWJ1dGVWYWx1ZSgpKQotICAgICAgICAgICAgICAgIHx8ICghYXR0cmlidXRlMS5nZXRRTmFtZSgpLmVxdWFscyhhdHRyaWJ1dGUyLmdldFFOYW1lKCkpKSkgewotICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQ6IiArIGF0dHJpYnV0ZTEuZ2V0UU5hbWUoKSArICI9IgotICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZTEuZ2V0QXR0cmlidXRlVmFsdWUoKSArICIgYnV0IGdvdCAiICsgYXR0cmlidXRlMi5nZXRRTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIj0iICsgYXR0cmlidXRlMi5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy9taWhlYWRlcnMvUmVsYXRlc1RvVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21paGVhZGVycy9SZWxhdGVzVG9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNWEwMWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL21paGVhZGVycy9SZWxhdGVzVG9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5taWhlYWRlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLlJlbGF0ZXNUbzsKLQotCi1wdWJsaWMgY2xhc3MgUmVsYXRlc1RvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFJlbGF0ZXNUbyByZWxhdGVzVG87Ci0gICAgU3RyaW5nIGFkZHJlc3MgPSAid3d3LnNvbWVhZGRyZXNzLmNvbSI7Ci0gICAgU3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUgPSAiUmVwbHkiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKFJlbGF0ZXNUb1Rlc3QuY2xhc3MpOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBZGRyZXNzKCkgewotICAgICAgICByZWxhdGVzVG8gPSBuZXcgUmVsYXRlc1RvKGFkZHJlc3MsIHJlbGF0aW9uc2hpcFR5cGUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiUmVsYXRlc1RvIGFkZHJlc3MgaGFzIG5vdCBiZWVuIHNldCBwcm9wZXJseSBpbiB0aGUgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgIHJlbGF0ZXNUby5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgIGFkZHJlc3MpOwotCi0gICAgICAgIFN0cmluZyBuZXdBZGRyZXNzID0gInd3dy5uZXdSZWxhdGlvbi5vcmciOwotICAgICAgICByZWxhdGVzVG8uc2V0VmFsdWUobmV3QWRkcmVzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVsYXRlc1RvIGFkZHJlc3MgaGFzIG5vdCBiZWVuIGdldC9zZXQgcHJvcGVybHkiLAotICAgICAgICAgICAgICAgICAgICAgcmVsYXRlc1RvLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICBuZXdBZGRyZXNzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZWxhdGlvbnNoaXBUeXBlKCkgewotICAgICAgICByZWxhdGVzVG8gPSBuZXcgUmVsYXRlc1RvKGFkZHJlc3MsIHJlbGF0aW9uc2hpcFR5cGUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiUmVsYXRlc1RvIFJlbGF0aW9uc2hpcFR5cGUgaGFzIG5vdCBiZWVuIHNldCBwcm9wZXJseSBpbiB0aGUgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgIHJlbGF0ZXNUby5nZXRSZWxhdGlvbnNoaXBUeXBlKCksCi0gICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwVHlwZSk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld1JlbGF0aW9uc2hpcFR5cGUgPSAiQW55T3RoZXJUeXBlIjsKLSAgICAgICAgcmVsYXRlc1RvLnNldFJlbGF0aW9uc2hpcFR5cGUobmV3UmVsYXRpb25zaGlwVHlwZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUmVsYXRlc1RvIGFkZHJlc3MgaGFzIG5vdCBiZWVuIGdldC9zZXQgcHJvcGVybHkiLAotICAgICAgICAgICAgICAgICAgICAgcmVsYXRlc1RvLmdldFJlbGF0aW9uc2hpcFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgIG5ld1JlbGF0aW9uc2hpcFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudENvbnN0cnVjdG9yKCkgewotICAgICAgICByZWxhdGVzVG8gPSBuZXcgUmVsYXRlc1RvKGFkZHJlc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIlJlbGF0ZXNUbyBhZGRyZXNzIGhhcyBub3QgYmVlbiBzZXQgcHJvcGVybHkgaW4gdGhlIGNvbnN0cnVjdG9yIiwKLSAgICAgICAgICAgICAgICByZWxhdGVzVG8uZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExQWN0aW9uSGVscGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9hZGRyZXNzaW5nL3dzZGwvV1NETDExQWN0aW9uSGVscGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMxYTFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvYWRkcmVzc2luZy93c2RsL1dTREwxMUFjdGlvbkhlbHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy53c2RsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMTFBY3Rpb25IZWxwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgU3RyaW5nIHRlc3RXU0RMRmlsZSA9ICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3dzZGwvYWN0aW9uVGVzdHMud3NkbCI7Ci0KLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBXU0RMUmVhZGVyIHJlYWRlciA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3V1NETFJlYWRlcigpOwotICAgICAgICByZWFkZXIuc2V0RmVhdHVyZSgiamF2YXgud3NkbC5pbXBvcnREb2N1bWVudHMiLCBmYWxzZSk7Ci0gICAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJqYXZheC53c2RsLnZlcmJvc2UiLCBmYWxzZSk7Ci0KLSAgICAgICAgVVJMIHdzZGxGaWxlID0gbmV3IEZpbGUoQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgdGVzdFdTRExGaWxlKQotICAgICAgICAgICAgICAgIC50b1VSTCgpOy8vZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKHRlc3RXU0RMRmlsZSk7Ci0gICAgICAgIGRlZmluaXRpb24gPSByZWFkZXIucmVhZFdTREwod3NkbEZpbGUudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0KLSAgICAvLyBUZXN0IERlZmF1bHRBY3Rpb25QYXR0ZXJuIChubyBuYW1lcyBpbiBXU0RMKQotICAgIC8vIFRlc3Qgbm90IHJlcXVpcmVkIGZvciBGYXVsdCBhcyBGYXVsdCBlbGVtZW50cyBNVVNUIGhhdmUgbmFlcyBwZXIgdGhlIFdTREwgMS4xIHNwZWMKLSAgICAvLyAgICBwb3J0VHlwZT13aXRob3V0V1NBV0FjdGlvbk5vTmFtZQotICAgIC8vIG9wZXJhdGlvbj1lY2hvCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlSW5wdXRBY3Rpb25Ob05hbWVzKCkgewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRBY3Rpb24gPQotICAgICAgICAgICAgICAgICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0L3dpdGhvdXRXU0FXQWN0aW9uTm9OYW1lL2VjaG9SZXF1ZXN0IjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aG91dFdTQVdBY3Rpb25Ob05hbWUiKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIElucHV0IGluID0gb3AuZ2V0SW5wdXQoKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9IFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tSW5wdXRFbGVtZW50KGRlZmluaXRpb24sIHB0LCBvcCwgaW4pOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBY3Rpb24sIGFjdHVhbEFjdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlT3V0cHV0QWN0aW9uTm9OYW1lcygpIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkQWN0aW9uID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC93aXRob3V0V1NBV0FjdGlvbk5vTmFtZS9lY2hvUmVzcG9uc2UiOwotICAgICAgICBQb3J0VHlwZSBwdCA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGUoCi0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9hY3Rpb250ZXN0LyIsICJ3aXRob3V0V1NBV0FjdGlvbk5vTmFtZSIpKTsKLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gcHQuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgT3V0cHV0IG91dCA9IG9wLmdldE91dHB1dCgpOwotICAgICAgICBTdHJpbmcgYWN0dWFsQWN0aW9uID0KLSAgICAgICAgICAgICAgICBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbU91dHB1dEVsZW1lbnQoZGVmaW5pdGlvbiwgcHQsIG9wLCBvdXQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRBY3Rpb24sIGFjdHVhbEFjdGlvbik7Ci0gICAgfQotCi0gICAgLy8gVGVzdCBEZWZhdWx0QWN0aW9uUGF0dGVybiAobmFtZXMgZXhwbGljaXRseSBzZXQgaW4gV1NETCkKLSAgICAvLyAgICBwb3J0VHlwZT13aXRob3V0V1NBV0FjdGlvbgotICAgIC8vIG9wZXJhdGlvbj1lY2hvCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlSW5wdXRBY3Rpb24oKSB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3Qvd2l0aG91dFdTQVdBY3Rpb24vTmFtZWRJbnB1dCI7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gZGVmaW5pdGlvbi5nZXRQb3J0VHlwZSgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIiwgIndpdGhvdXRXU0FXQWN0aW9uIikpOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICBJbnB1dCBpbiA9IG9wLmdldElucHV0KCk7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxBY3Rpb24gPSBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbUlucHV0RWxlbWVudChkZWZpbml0aW9uLCBwdCwgb3AsIGluKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQWN0aW9uLCBhY3R1YWxBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZU91dHB1dEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkQWN0aW9uID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC93aXRob3V0V1NBV0FjdGlvbi9OYW1lZE91dHB1dCI7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gZGVmaW5pdGlvbi5nZXRQb3J0VHlwZSgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIiwgIndpdGhvdXRXU0FXQWN0aW9uIikpOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICBPdXRwdXQgb3V0ID0gb3AuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxBY3Rpb24gPQotICAgICAgICAgICAgICAgIFdTREwxMUFjdGlvbkhlbHBlci5nZXRBY3Rpb25Gcm9tT3V0cHV0RWxlbWVudChkZWZpbml0aW9uLCBwdCwgb3AsIG91dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFjdGlvbiwgYWN0dWFsQWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVGYXVsdEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkQWN0aW9uID0KLSAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC93aXRob3V0V1NBV0FjdGlvbi9lY2hvL0ZhdWx0L2VjaG9GYXVsdCI7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gZGVmaW5pdGlvbi5nZXRQb3J0VHlwZSgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIiwgIndpdGhvdXRXU0FXQWN0aW9uIikpOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICBGYXVsdCBmYXVsdCA9IG9wLmdldEZhdWx0KCJlY2hvRmF1bHQiKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldEFjdGlvbkZyb21GYXVsdEVsZW1lbnQoZGVmaW5pdGlvbiwgcHQsIG9wLCBmYXVsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFjdGlvbiwgYWN0dWFsQWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyBUZXN0IHJlYWRpbmcgd3NhdzpBY3Rpb24gdmFsdWVzCi0gICAgLy8gcG9ydFR5cGU9d2l0aFdTQVdBY3Rpb24KLSAgICAvLyBvcGVyYXRpb249ZWNobwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXU0FXSW5wdXRBY3Rpb24oKSB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZEFjdGlvbiA9ICJodHRwOi8vZXhhbXBsZS5vcmcvYWN0aW9uL2VjaG9JbiI7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgIC5nZXRQb3J0VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIiwgIndpdGhXU0FXQWN0aW9uIikpOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICBJbnB1dCBpbiA9IG9wLmdldElucHV0KCk7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxBY3Rpb24gPSBXU0RMMTFBY3Rpb25IZWxwZXIuZ2V0QWN0aW9uRnJvbUlucHV0RWxlbWVudChkZWZpbml0aW9uLCBwdCwgb3AsIGluKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQWN0aW9uLCBhY3R1YWxBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXU0FXT3V0cHV0QWN0aW9uKCkgewotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRBY3Rpb24gPSAiaHR0cDovL2V4YW1wbGUub3JnL2FjdGlvbi9lY2hvT3V0IjsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgLmdldFBvcnRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYWN0aW9udGVzdC8iLCAid2l0aFdTQVdBY3Rpb24iKSk7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHB0LmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgT3BlcmF0aW9uIG9wID0gKE9wZXJhdGlvbikgb3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgIE91dHB1dCBvdXQgPSBvcC5nZXRPdXRwdXQoKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldEFjdGlvbkZyb21PdXRwdXRFbGVtZW50KGRlZmluaXRpb24sIHB0LCBvcCwgb3V0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQWN0aW9uLCBhY3R1YWxBY3Rpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXU0FXRmF1bHRBY3Rpb24oKSB7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZEFjdGlvbiA9ICJodHRwOi8vZXhhbXBsZS5vcmcvYWN0aW9uL2VjaG9GYXVsdCI7Ci0gICAgICAgIFBvcnRUeXBlIHB0ID0gZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgIC5nZXRQb3J0VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL2FjdGlvbnRlc3QvIiwgIndpdGhXU0FXQWN0aW9uIikpOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICBGYXVsdCBmYXVsdCA9IG9wLmdldEZhdWx0KCJlY2hvRmF1bHQiKTsKLSAgICAgICAgU3RyaW5nIGFjdHVhbEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldEFjdGlvbkZyb21GYXVsdEVsZW1lbnQoZGVmaW5pdGlvbiwgcHQsIG9wLCBmYXVsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEFjdGlvbiwgYWN0dWFsQWN0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvU09BUEJ1aWxkZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2J1aWxkZXIvU09BUEJ1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTQyNTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9idWlsZGVyL1NPQVBCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5idWlsZGVyOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotDQotDQotLyoqDQotICogVGVzdHMgZm9yIFNPQVBCdWlsZGVyDQotICovDQotcHVibGljIGNsYXNzIFNPQVBCdWlsZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2Ugew0KLQ0KLSAgICBwdWJsaWMgU09BUEJ1aWxkZXJUZXN0KFN0cmluZyB0ZXN0TmFtZSkgew0KLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTaW1wbGUgdGVzdCB0aGUgbWFrZXMgc3VyZSBTT0FQQnVpbGRlciBidWlsZHMgYSBkb2N1bWVudCBhbmQNCi0gICAgICogaGFzIGEgY29udGVudCBsZW5ndGgNCi0gICAgICogQHRocm93cyBFeGNlcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEZpbGUgZmlsZSA9IGdldFRlc3RSZXNvdXJjZUZpbGUoInNvYXBtZXNzYWdlLnhtbCIpOw0KLSAgICAgICAgU09BUEJ1aWxkZXIgc29hcEJ1aWxkZXIgPSBuZXcgU09BUEJ1aWxkZXIoKTsNCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOw0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsNCi0gICAgICAgIE9NRWxlbWVudCBlbnZlbG9wZSA9IHNvYXBCdWlsZGVyLnByb2Nlc3NEb2N1bWVudChmaXMsICJ0ZXh0L3htbCIsIG1jKTsNCi0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7DQotICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKTsNCi0gICAgICAgIGFzc2VydFRydWUobWMuZ2V0SW5ib3VuZENvbnRlbnRMZW5ndGgoKSA+IDIwMDApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0SGllcmFyY2h5VGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRIaWVyYXJjaHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjkzMTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRIaWVyYXJjaHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZXh0SGllcmFyY2h5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlOwotICAgIHByaXZhdGUgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbXNnY3R4OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJUZW1wIikpOwotICAgICAgICBheGlzTWVzc2FnZSA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotICAgICAgICBheGlzU2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiVGVtcCIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBheGlzU2VydmljZS5hZGRPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFNlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIG1zZ2N0eCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXRlSGllcmFyY2h5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoCi0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBzZXJ2aWNlR3JvdXBDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBheGlzT3BlcmF0aW9uLmZpbmRPcGVyYXRpb25Db250ZXh0KG1zZ2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobXNnY3R4LCBvcENvbnRleHQpOwotICAgICAgICBtc2djdHguc2V0QXhpc01lc3NhZ2UoYXhpc01lc3NhZ2UpOwotICAgICAgICBtc2djdHguc2V0U2VydmljZUNvbnRleHQoc2VydmljZUNvbnRleHQpOwotCi0gICAgICAgIC8vIHRlc3QgdGhlIGNvbXBsdGUgSGllcmFyY2h5IGJ1aWx0Ci0gICAgICAgIGFzc2VydEVxdWFscyhtc2djdHguZ2V0UGFyZW50KCksIG9wQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcENvbnRleHQuZ2V0UGFyZW50KCksIHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2VDb250ZXh0LmdldFBhcmVudCgpLCBzZXJ2aWNlR3JvdXBDb250ZXh0KTsKLQotICAgICAgICBTdHJpbmcga2V5ID0gImtleTEiOwotICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZTEgPSAicGFyYW1WYWx1ZTEiOwotICAgICAgICBTdHJpbmcgcHJvcFZhbHVlMSA9ICJwcm9wVmFsdWUxIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUyID0gInBhcmFtVmFsdWUyIjsKLSAgICAgICAgU3RyaW5nIHByb3BWYWx1ZTIgPSAicHJvcFZhbHVlMiI7Ci0gICAgICAgIFN0cmluZyBwYXJhbVZhbHVlMyA9ICJwYXJhbVZhbHVlMyI7Ci0gICAgICAgIFN0cmluZyBwcm9wVmFsdWUzID0gInByb3BWYWx1ZTMiOwotICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZTQgPSAicGFyYW1WYWx1ZTQiOwotICAgICAgICBTdHJpbmcgcHJvcFZhbHVlNCA9ICJwcm9wVmFsdWU0IjsKLQotICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5zZXRQcm9wZXJ0eShrZXksIHByb3BWYWx1ZTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvcFZhbHVlMSwgbXNnY3R4LmdldFByb3BlcnR5KGtleSkpOwotCi0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKGtleSwgcGFyYW1WYWx1ZTEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtVmFsdWUxLCBtc2djdHguZ2V0UGFyYW1ldGVyKGtleSkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIAotICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShrZXksIHByb3BWYWx1ZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvcFZhbHVlMiwgbXNnY3R4LmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoa2V5LCBwYXJhbVZhbHVlMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1WYWx1ZTIsIG1zZ2N0eC5nZXRQYXJhbWV0ZXIoa2V5KS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBvcENvbnRleHQuc2V0UHJvcGVydHkoa2V5LCBwcm9wVmFsdWUzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb3BWYWx1ZTMsIG1zZ2N0eC5nZXRQcm9wZXJ0eShrZXkpKTsKLSAgICAgICAgCi0gICAgICAgIGF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoa2V5LCBwYXJhbVZhbHVlMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1WYWx1ZTMsIG1zZ2N0eC5nZXRQYXJhbWV0ZXIoa2V5KS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgCi0gICAgICAgIG1zZ2N0eC5zZXRQcm9wZXJ0eShrZXksIHByb3BWYWx1ZTQpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJvcFZhbHVlNCwgbXNnY3R4LmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAKLSAgICAgICAgYXhpc01lc3NhZ2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoa2V5LCBwYXJhbVZhbHVlNCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1WYWx1ZTQsIG1zZ2N0eC5nZXRQYXJhbWV0ZXIoa2V5KS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY29ubnRlY3RlZEhpZXJhcmNoeSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyB0ZXN0IHRoZSBjb21wbGV0ZSBIaWVyYXJjaHkgYnVpbHQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZ2N0eC5nZXRQYXJlbnQoKSwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIGtleTEgPSAia2V5MSI7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTEgPSAiVmFsMSI7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTIgPSAidmFsdWUyIjsKLSAgICAgICAgU3RyaW5nIGtleTIgPSAia2V5MiI7Ci0KLSAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuc2V0UHJvcGVydHkoa2V5MSwgdmFsdWUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMSwgbXNnY3R4LmdldFByb3BlcnR5KGtleTEpKTsKLQotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihrZXkyLCB2YWx1ZTIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMiwgbXNnY3R4LmdldFBhcmFtZXRlcihrZXkyKS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L0NvbnRleHRMaXN0ZW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5YTAwZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dExpc3RlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5PdXRBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRMaXN0ZW5lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIGNsYXNzIE15TGlzdGVuZXIgaW1wbGVtZW50cyBDb250ZXh0TGlzdGVuZXIgewotICAgICAgICBwcml2YXRlIEFic3RyYWN0Q29udGV4dCBsYXN0Q29udGV4dDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBjb250ZXh0Q3JlYXRlZChBYnN0cmFjdENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgbGFzdENvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29udGV4dFJlbW92ZWQoQWJzdHJhY3RDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIC8vVE9ETzogTWV0aG9kIGltcGxlbWVudGF0aW9uCi0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBYnN0cmFjdENvbnRleHQgZ2V0TGFzdENvbnRleHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGFzdENvbnRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25maXJtIHRoYXQgY3JlYXRpbmcgY29udGV4dHMgYXQgdmFyaW91cyBsZXZlbHMgY29ycmVjdGx5IGNhdXNlcyBub3RpZmljYXRpb25zIHRvCi0gICAgICogQ29udGV4dExpc3RlbmVycyB0aGF0IGFyZSByZWdpc3RlcmVkIG9uIGEgZ2l2ZW4gQ29uZmlndXJhdGlvbkNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNldCB1cCBtZXRhZGF0YQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlnKTsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZXJ2aWNlR3JvdXAgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlnKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiVGVzdFNlcnZpY2UiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgibnMiLCAib3AxIikpOwotICAgICAgICBzZXJ2aWNlLmFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkU2VydmljZShzZXJ2aWNlKTsKLQotICAgICAgICAvLyBSZWdpc3RlciBhIGxpc3RlbmVyIGFuZCBtYWtlIHN1cmUgaXQgc3RhcnRzIG91dCBjbGVhbgotICAgICAgICBNeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE15TGlzdGVuZXIoKTsKLSAgICAgICAgY29uZmlnQ3R4LmFkZENvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIGFzc2VydE51bGwobGlzdGVuZXIuZ2V0TGFzdENvbnRleHQoKSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBjb25maWdDdHguY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZUNvbnRleHQgbm90IHN0b3JlZCIsIG1jLCBsaXN0ZW5lci5nZXRMYXN0Q29udGV4dCgpKTsKLQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNvbmZpZ0N0eC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KHNlcnZpY2VHcm91cCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2djKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXJ2aWNlR3JvdXBDb250ZXh0IG5vdCBzdG9yZWQiLCBzZ2MsIGxpc3RlbmVyLmdldExhc3RDb250ZXh0KCkpOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gc2djLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZXJ2aWNlQ29udGV4dCBub3Qgc3RvcmVkIiwgc2MsIGxpc3RlbmVyLmdldExhc3RDb250ZXh0KCkpOwotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MgPSBzYy5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk9wZXJhdGlvbkNvbnRleHQgbm90IHN0b3JlZCIsIG9jLCBsaXN0ZW5lci5nZXRMYXN0Q29udGV4dCgpKTsKLQotICAgICAgICAvLyBUcnkgYSBzZWNvbmQgbGlzdGVuZXIgYW5kIG1ha2Ugc3VyZSB0aGV5IGJvdGggZ2V0IG5vdGlmaWVkCi0gICAgICAgIE15TGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IE15TGlzdGVuZXIoKTsKLSAgICAgICAgY29uZmlnQ3R4LmFkZENvbnRleHRMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCi0gICAgICAgIG1jID0gY29uZmlnQ3R4LmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2VDb250ZXh0IG5vdCBzdG9yZWQiLCBtYywgbGlzdGVuZXIuZ2V0TGFzdENvbnRleHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZUNvbnRleHQgbm90IHN0b3JlZCBpbiBsaXN0ZW5lciAyIiwgbWMsIGxpc3RlbmVyMi5nZXRMYXN0Q29udGV4dCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dFByb3BlcnRpZXNFeHRlcm5hbGl6ZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0UHJvcGVydGllc0V4dGVybmFsaXplVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjg1MGUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0UHJvcGVydGllc0V4dGVybmFsaXplVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAgICAgIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLk91dE9ubHlBeGlzT3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhlIGV4dGVybmFsaXphdGlvbiBvZiBwcm9wZXJ0aWVzIG9uIGFuIEFic3RyYWN0Q29udGV4dC4gIFNpbmNlIGVhY2ggb2YgdGhlIEFic3RyYWN0Q29udGV4dAotICogc3ViY2xhc3NlcyBoYXZlIHRoZWlyIG93biByZWFkIGFuZCB3cml0ZSBFeHRlcm5hbCBtZXRob2RzLCBlYWNoIG9uZSBpcyB0ZXN0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UHJvcGVydGllc0V4dGVybmFsaXplVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxpemVNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoImtleTEiLCAidmFsdWUxIik7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KCJrZXkyIiwgInZhbHVlMiIpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eShudWxsLCAidmFsdWUzX251bGxLZXkiKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIiwgbnVsbCk7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KCJrZXk1IiwgInZhbHVlNSIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYy5wcm9wZXJ0aWVzIGluc3RhbmNlb2YgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtYy53cml0ZUV4dGVybmFsKG9vcyk7Ci0gICAgICAgICAgICBvb3MuZmx1c2goKTsKLSAgICAgICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jUmVhZCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgbWNSZWFkLnJlYWRFeHRlcm5hbChvaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbWNSZWFkLnByb3BlcnRpZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgbWNSZWFkLmdldFByb3BlcnR5KCJrZXkxIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBtY1JlYWQuZ2V0UHJvcGVydHkoImtleTIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlM19udWxsS2V5IiwgbWNSZWFkLmdldFByb3BlcnR5KG51bGwpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwobWNSZWFkLmdldFByb3BlcnR5KCJrZXk0X251bGxWYWx1ZSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWU1IiwgbWNSZWFkLmdldFByb3BlcnR5KCJrZXk1IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtY1JlYWQucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb246ICIgKyBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxpemVPcGVyYXRpb25Db250ZXh0KCkgewotICAgICAgICBPcGVyYXRpb25Db250ZXh0IGN0eCA9IG5ldyBPcGVyYXRpb25Db250ZXh0KG5ldyBPdXRPbmx5QXhpc09wZXJhdGlvbigpLCBuZXcgU2VydmljZUNvbnRleHQoKSk7Ci0gICAgICAgIAotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTEiLCAidmFsdWUxIik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5MiIsICJ2YWx1ZTIiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KG51bGwsICJ2YWx1ZTNfbnVsbEtleSIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIiwgbnVsbCk7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5NSIsICJ2YWx1ZTUiKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoY3R4LnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGN0eC53cml0ZUV4dGVybmFsKG9vcyk7Ci0gICAgICAgICAgICBvb3MuZmx1c2goKTsKLSAgICAgICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgY3R4UmVhZCA9IG5ldyBPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBjdHhSZWFkLnJlYWRFeHRlcm5hbChvaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgY3R4UmVhZC5wcm9wZXJ0aWVzLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlM19udWxsS2V5IiwgY3R4UmVhZC5nZXRQcm9wZXJ0eShudWxsKSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTUiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXk1IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHhSZWFkLnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbGl6ZVNlcnZpY2VDb250ZXh0KCkgewotICAgICAgICBTZXJ2aWNlQ29udGV4dCBjdHggPSBuZXcgU2VydmljZUNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXkyIiwgInZhbHVlMiIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkobnVsbCwgInZhbHVlM19udWxsS2V5Iik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiLCBudWxsKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXk1IiwgInZhbHVlNSIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHgucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3R4LndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgY3R4UmVhZCA9IG5ldyBTZXJ2aWNlQ29udGV4dCgpOwotICAgICAgICAgICAgY3R4UmVhZC5yZWFkRXh0ZXJuYWwob2lzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGN0eFJlYWQucHJvcGVydGllcy5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXkxIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXkyIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTNfbnVsbEtleSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkobnVsbCkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChjdHhSZWFkLmdldFByb3BlcnR5KCJrZXk0X251bGxWYWx1ZSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWU1IiwgY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5NSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY3R4UmVhZC5wcm9wZXJ0aWVzIGluc3RhbmNlb2YgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZXJuYWxpemVTZXJ2aWNlR3JvdXBDb250ZXh0KCkgewotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IGN0eCA9IG5ldyBTZXJ2aWNlR3JvdXBDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTEiLCAidmFsdWUxIik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5MiIsICJ2YWx1ZTIiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KG51bGwsICJ2YWx1ZTNfbnVsbEtleSIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIiwgbnVsbCk7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5NSIsICJ2YWx1ZTUiKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoY3R4LnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGN0eC53cml0ZUV4dGVybmFsKG9vcyk7Ci0gICAgICAgICAgICBvb3MuZmx1c2goKTsKLSAgICAgICAgICAgIG9vcy5jbG9zZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgY3R4UmVhZCA9IG5ldyBTZXJ2aWNlR3JvdXBDb250ZXh0KCk7Ci0gICAgICAgICAgICBjdHhSZWFkLnJlYWRFeHRlcm5hbChvaXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgY3R4UmVhZC5wcm9wZXJ0aWVzLnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTIiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlM19udWxsS2V5IiwgY3R4UmVhZC5nZXRQcm9wZXJ0eShudWxsKSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGN0eFJlYWQuZ2V0UHJvcGVydHkoImtleTRfbnVsbFZhbHVlIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTUiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXk1IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjdHhSZWFkLnByb3BlcnRpZXMgaW5zdGFuY2VvZiBIYXNoTWFwVXBkYXRlTG9ja2FibGUpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlcm5hbGl6ZVNlc3Npb25Db250ZXh0KCkgewotICAgICAgICBTZXNzaW9uQ29udGV4dCBjdHggPSBuZXcgU2Vzc2lvbkNvbnRleHQoKTsKLSAgICAgICAgCi0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXkyIiwgInZhbHVlMiIpOwotICAgICAgICBjdHguc2V0UHJvcGVydHkobnVsbCwgInZhbHVlM19udWxsS2V5Iik7Ci0gICAgICAgIGN0eC5zZXRQcm9wZXJ0eSgia2V5NF9udWxsVmFsdWUiLCBudWxsKTsKLSAgICAgICAgY3R4LnNldFByb3BlcnR5KCJrZXk1IiwgInZhbHVlNSIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZShjdHgucHJvcGVydGllcyBpbnN0YW5jZW9mIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYW9zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3R4LndyaXRlRXh0ZXJuYWwob29zKTsKLSAgICAgICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICAgICAgb29zLmNsb3NlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pcyA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2Vzc2lvbkNvbnRleHQgY3R4UmVhZCA9IG5ldyBTZXNzaW9uQ29udGV4dCgpOwotICAgICAgICAgICAgY3R4UmVhZC5yZWFkRXh0ZXJuYWwob2lzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGN0eFJlYWQucHJvcGVydGllcy5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXkxIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBjdHhSZWFkLmdldFByb3BlcnR5KCJrZXkyIikpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTNfbnVsbEtleSIsIGN0eFJlYWQuZ2V0UHJvcGVydHkobnVsbCkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChjdHhSZWFkLmdldFByb3BlcnR5KCJrZXk0X251bGxWYWx1ZSIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWU1IiwgY3R4UmVhZC5nZXRQcm9wZXJ0eSgia2V5NSIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY3R4UmVhZC5wcm9wZXJ0aWVzIGluc3RhbmNlb2YgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0UHJvcGVydGllc1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvY29udGV4dC9Db250ZXh0UHJvcGVydGllc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1OTNiYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvQ29udGV4dFByb3BlcnRpZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqICAgICAgCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3QgdGhlIHNldHRpbmcgb2YgcHJvcGVydGllcyBvbiBhbiBBYnN0cmFjdENvbnRleHQgaW5zdGFuY2UuICBOb3RlIHRoYXQgTWVzc2FnZUNvbnRleHQgaXMgdXNlZAotICogaW4gbW9zdCBvZiB0aGUgdGVzdHMgYXMgdGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIEFic3RyYWN0Q29udGV4dC4gIFNvbWUgdGVzdHMgYWxzbyB0ZXN0Ci0gKiB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbiB1c2VkIGluIEFic3RyYWN0Q29udGV4dC5wcm9lcHJ0aWVzIGRpcmVjdGx5LiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRQcm9wZXJ0aWVzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRvIGVuc3VyZSB1c2luZyBhbiBJdGVyYXRvciBmcm9tIGdldFByb3BlcnR5TmFtZXMoKSBhZnRlciB0aGUgcHJvcGVydGllcyBoYXZlIGJlZW4gCi0gICAgICogdXBkYXRlZCBkb2VzIG5vdCBjYXVzZSBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24uICBUaGUgQ01FIGRvZXMgbm90IGhhcHBlbiBiZWNhdXNlCi0gICAgICogdGhlIEl0ZXJhdG9yIGlzIG92ZXIgYSBjb3B5IG9mIHRoZSBrZXkgbmFtZXMsIG5vdCB0aGUgYWN0dWFsIGNvbGxlY3Rpb24gKHdoaWNoIHdvdWxkIGNhdXNlCi0gICAgICogYSBDTUUgaW4gdGhpcyB0ZXN0KS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlOYW1lc0ZvckNNRSgpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KG51bGwsICJ2YWx1ZTNfbnVsbGtleSIpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5NF9udWxsdmFsdWUiLCBudWxsKTsKLQotICAgICAgICAvLyBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5IG5hbWVzLCB0aGVuIGFkZCBhIG5ldyBlbGVtZW50LgotICAgICAgICAvLyBUaGlzIHNpbXVsYXRlcyB0d28gdGhyZWFkcyBhY2Nlc3NpbmcgdGhlIGNvbnRleHQuICBUaGlzIHNob3VsZCBub3QgY2F1c2UKLSAgICAgICAgLy8gYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIChpdCB3aWxsIGlmIGEgbGl2ZSBpdGVyYXRvciBvdmVyIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIC8vIGtleSBzZXQgaXMgcmV0dXJuZWQgYnkgZ2V0UHJvcGVydHlOYW1lcygpKQotICAgICAgICBJdGVyYXRvciBwcm9wTmFtZXNJdGVyYXRvciA9IG1jLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoIm5ld0tleSIsICJuZXdWYWx1ZSIpOwotICAgICAgICB3aGlsZSAocHJvcE5hbWVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgCi0gICAgICAgICAgICAvLyAoMSkgdGhhdCBjYWxsaW5nIG5leHQoKSBvbiB0aGUgaXRlcmF0b3IgZG9lcyBub3QgY2F1c2UgYSBDTUUsIAotICAgICAgICAgICAgLy8gKDIpIHRoYXQgdGhlIGtleXMgYXJlIGFzIGV4cGVjdGVkIGFuZCAKLSAgICAgICAgICAgIC8vICgzKSB0aG9zZSBrZXlzIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgZW50cmllcyBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgICAgIFN0cmluZyBjaGVja0tleSA9IChTdHJpbmcpIHByb3BOYW1lc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNvbmN1cnJlbnRJdGVyYXRvciA9IG1jLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChjb25jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbmN1cnJlbnRLZXkgPSAoU3RyaW5nKSBjb25jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhhdCB1c2luZyBhbiBpdGVyYXRvciBvZiBwcm9wZXJ0eU5hbWVzIGRvZXMgbm90IGNhdXNlIGEgQ01FLiAgVGhpcyBpcyBkZWdlbmVyYXRlCi0gICAgICogdGVzdCBvZiB0aGUgdGVzdCBmb3IgQ01FIHRoYXQgdXBkYXRlcyB0aGUgY29sbGVjdGlvbiBiZWZvcmUgdXNpbmcgdGhlIGl0ZXJhdG9yLgotICAgICAqIEBzZWUgI3Rlc3RQcm9wZXJ0eU5hbWVzRm9yQ01FKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlOYW1lc0ZvckNNRV9Ob1VwZGF0ZSgpIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgbWMuc2V0UHJvcGVydHkoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgIG1jLnNldFByb3BlcnR5KG51bGwsICJ2YWx1ZTNfbnVsbGtleSIpOwotICAgICAgICBtYy5zZXRQcm9wZXJ0eSgia2V5NF9udWxsdmFsdWUiLCBudWxsKTsKLQotICAgICAgICBJdGVyYXRvciBwcm9wTmFtZXNJdGVyYXRvciA9IG1jLmdldFByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgd2hpbGUgKHByb3BOYW1lc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgSXRlcmF0b3IgY29uY3VycmVudEl0ZXJhdG9yID0gbWMuZ2V0UHJvcGVydHlOYW1lcygpOwotICAgICAgICAgICAgLy8gVmVyaWZ5IAotICAgICAgICAgICAgLy8gKDEpIHRoYXQgY2FsbGluZyBuZXh0KCkgb24gdGhlIGl0ZXJhdG9yIGRvZXMgbm90IGNhdXNlIGEgQ01FLCAKLSAgICAgICAgICAgIC8vICgyKSB0aGF0IHRoZSBrZXlzIGFyZSBhcyBleHBlY3RlZCBhbmQgCi0gICAgICAgICAgICAvLyAoMykgdGhvc2Uga2V5cyBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGVudHJpZXMgaW4gdGhlIGNvbGxlY3Rpb24uCi0gICAgICAgICAgICBTdHJpbmcgY2hlY2tLZXkgPSAoU3RyaW5nKSBwcm9wTmFtZXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBzb21lIGFzcGVjdHMgb2YgdGhlIENvbmN1cnJlbnQgY29sbGVjdGlvbiBkaXJlY3RseSwgc3VjaCBhcyBjcmVhdGluZyB3aXRoIGEgTWFwLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaE1hcFVwZGF0ZUxvY2thYmxlKCkgewotICAgICAgICAKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCk7Ci0gICAgICAgIHRlc3RNYXAucHV0KCJrZXkiLCAidmFsdWUiKTsKLSAgICAgICAgdGVzdE1hcC5wdXQoMSwgMik7Ci0gICAgICAgIAotICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgbWFwLnB1dCgiazEiLCAidjEiKTsKLSAgICAgICAgbWFwLnB1dCgiazIiLCAidjIiKTsKLSAgICAgICAgbWFwLnB1dChudWxsLCAidjNOdWxsS2V5Iik7Ci0gICAgICAgIG1hcC5wdXQoImszX251bGwiLCBudWxsKTsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RDdG9yTWFwID0gbmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZShtYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoInYxIiwgdGVzdEN0b3JNYXAuZ2V0KCJrMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2MiIsIHRlc3RDdG9yTWFwLmdldCgiazIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidjNOdWxsS2V5IiwgdGVzdEN0b3JNYXAuZ2V0KG51bGwpKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh0ZXN0Q3Rvck1hcC5nZXQoImszX251bGwiKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBwdXQgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgaWYgdGhlcmUgd2FzIG9uZSwgb3IgbnVsbAotICAgICAgICBhc3NlcnRFcXVhbHMoInYxIiwgdGVzdEN0b3JNYXAucHV0KCJrMSIsICJuZXdLMVZhbHVlIikpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RDdG9yTWFwLnB1dCgiazNfbnVsbCIsICJuZXdLM1ZhbHVlIikpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RDdG9yTWFwLnB1dCgibm9TdWNoS2V5LXB1dCIsICJ2YWx1ZTYiKSk7Ci0gICAgICAgIAotICAgICAgICAvLyByZW1vdmUgcmV0dXJucyB0aGUgdmFsdWUgaWYgdGhlcmUgd2FzIGFuIGVudHJ5IHdpdGggdGhhdCBrZXksIG9yIG51bGwKLSAgICAgICAgYXNzZXJ0TnVsbCh0ZXN0Q3Rvck1hcC5yZW1vdmUoIm5vU3VjaEtleS1yZW1vdmUiKSk7Ci0gICAgICAgIHRlc3RDdG9yTWFwLnB1dCgia2V5NyIsIG51bGwpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RDdG9yTWFwLnJlbW92ZSgia2V5NyIpKTsKLQotICAgIH0KLSAgICAKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBUaGUgZm9sbG93aW5nIHRlc3RzIGFyZSBtdWx0aXRocmVhZGVkIHRlc3RzIHRvIHRlc3QgdGhlIGxvY2tpbmcsIGJsb2NraW5nLCBhbmQgcmVsZWFzaW5nCi0gICAgLy8gb2YgdGhyZWFkcyBieSB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbi4KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZHMgb24gSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgdG8gYmUgdGVzdGVkLiAgVGhlIHVwZGF0ZSBtZXRob2RzIGFyZSB0ZXN0ZWQgdG8KLSAgICAgKiB2ZXJpZnkgdGhleSBibG9jayB3aGlsZSB0aGUgdXBkYXRlTG9jayBpcyBoZWxkLiAgU29tZSBub24tdXBkYXRlIG1ldGhvZHMgYXJlIHRlc3RlZCB0bwotICAgICAqIHZlcmlmeSB0aGV5IGRvIG5vdCBibG9jayBpZiB0aGUgdXBkYXRlTG9jayBpcyBoZWxkLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIGVudW0gTWV0aG9kVG9DaGVjayB7Y2hlY2tMb2NrX3dhaXQsIGNoZWNrTG9ja19ub3dhaXQsIHB1dCwgcHV0QWxsLCByZW1vdmUsIGdldH07Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZS5yZW1vdmUgbWV0aG9kIHdoaWNoIG92ZXJyaWRlcyB0aGUgSGFzaFRhYmxlIG1ldGhvZC4KLSAgICAgKiBUZXN0cyB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbiBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQgdG8gZW5zdXJlIHRoYXQKLSAgICAgKiBhIHRocmVhZCB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjb2xsZWN0aW9uIHdpbGwgYmxvY2sgYXMgbG9uZyBhcyBhbm90aGVyIHRocmVhZCBoYXMgdGhlCi0gICAgICogY29sbGVjdGlvbiBsb2NrZWQgZm9yIHVwZGF0ZS4gIE5vdGUgdGhhdCBVcGRhdGVSdW5uYWJsZSBwZXJmb3JtcyB0aGUgYWN0dWFsIHRlc3Qgb2YgdGhlCi0gICAgICogbWV0aG9kLgotICAgICAqIEBzZWUgVXBkYXRlUnVubmFibGUjcnVuKCkKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRVcGRhdGVMb2NrX3JlbW92ZSgpIHsKLSAgICAgICAgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB0ZXN0TW9uaXRvciA9IG5ldyBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yKCk7Ci0gICAgICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSB0ZXN0TWFwID0gbmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpOwotICAgICAgICB0ZXN0TWFwLnB1dCgidGVzdEtleTEiLCAidmFsdWUxIik7Ci0gICAgICAgIHRlc3RNYXAucHV0KCJyZW1vdmVLZXkiLCAidmFsdWUyIik7Ci0gICAgICAgIHN0YXJ0dXBUZXN0VGhyZWFkcyh0ZXN0TW9uaXRvciwgdGVzdE1hcCwgTWV0aG9kVG9DaGVjay5yZW1vdmUpOwotCi0gICAgICAgIGFzc2VydE5vVGhyZWFkRXJyb3JzKHRlc3RNb25pdG9yKTsgICAgICAgICAgICAKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHVwZGF0ZSB0aHJlYWQgYmxvY2tlZCwgaS5lLiB0aGUgbG9ja1RocmVhZCB3YXMgcmVsZWFzZWQgYmVmb3JlIHRoZSB1cGRhdGUgdGhyZWFkLgotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNb25pdG9yLmxvY2tUaHJlYWRSZWxlYXNlVGltZSA8PSB0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRSZWxlYXNlVGltZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZS5wdXRBbGwgbWV0aG9kIHdoaWNoIG92ZXJyaWRlcyB0aGUgSGFzaFRhYmxlIG1ldGhvZC4KLSAgICAgKiBUZXN0cyB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbiBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQgdG8gZW5zdXJlIHRoYXQKLSAgICAgKiBhIHRocmVhZCB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjb2xsZWN0aW9uIHdpbGwgYmxvY2sgYXMgbG9uZyBhcyBhbm90aGVyIHRocmVhZCBoYXMgdGhlCi0gICAgICogY29sbGVjdGlvbiBsb2NrZWQgZm9yIHVwZGF0ZS4gIE5vdGUgdGhhdCBVcGRhdGVSdW5uYWJsZSBwZXJmb3JtcyB0aGUgYWN0dWFsIHRlc3Qgb2YgdGhlCi0gICAgICogbWV0aG9kLgotICAgICAqIEBzZWUgVXBkYXRlUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRVcGRhdGVMb2NrX3B1dEFsbCgpIHsKLSAgICAgICAgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB0ZXN0TW9uaXRvciA9IG5ldyBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yKCk7Ci0gICAgICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSB0ZXN0TWFwID0gbmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpOwotICAgICAgICBzdGFydHVwVGVzdFRocmVhZHModGVzdE1vbml0b3IsIHRlc3RNYXAsIE1ldGhvZFRvQ2hlY2sucHV0QWxsKTsKLQotICAgICAgICBhc3NlcnROb1RocmVhZEVycm9ycyh0ZXN0TW9uaXRvcik7ICAgICAgICAgICAgCi0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1cGRhdGUgdGhyZWFkIGJsb2NrZWQsIGkuZS4gdGhlIGxvY2tUaHJlYWQgd2FzIHJlbGVhc2VkIGJlZm9yZSB0aGUgdXBkYXRlIHRocmVhZC4KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUgPD0gdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUucHV0IG1ldGhvZCB3aGljaCBvdmVycmlkZXMgdGhlIEhhc2hUYWJsZSBtZXRob2QuCi0gICAgICogVGVzdHMgdGhlIEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlIGNvbGxlY3Rpb24gaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50IHRvIGVuc3VyZSB0aGF0Ci0gICAgICogYSB0aHJlYWQgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29sbGVjdGlvbiB3aWxsIGJsb2NrIGFzIGxvbmcgYXMgYW5vdGhlciB0aHJlYWQgaGFzIHRoZQotICAgICAqIGNvbGxlY3Rpb24gbG9ja2VkIGZvciB1cGRhdGUuICBOb3RlIHRoYXQgVXBkYXRlUnVubmFibGUgcGVyZm9ybXMgdGhlIGFjdHVhbCB0ZXN0IG9mIHRoZQotICAgICAqIG1ldGhvZC4KLSAgICAgKiBAc2VlIFVwZGF0ZVJ1bm5hYmxlI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpdGhyZWFkVXBkYXRlTG9ja19wdXQoKSB7Ci0gICAgICAgIE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IgdGVzdE1vbml0b3IgPSBuZXcgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvcigpOwotICAgICAgICBIYXNoTWFwVXBkYXRlTG9ja2FibGUgdGVzdE1hcCA9IG5ldyBIYXNoTWFwVXBkYXRlTG9ja2FibGUoKTsKLSAgICAgICAgc3RhcnR1cFRlc3RUaHJlYWRzKHRlc3RNb25pdG9yLCB0ZXN0TWFwLCBNZXRob2RUb0NoZWNrLnB1dCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9UaHJlYWRFcnJvcnModGVzdE1vbml0b3IpOyAgICAgICAgICAgIAotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXBkYXRlIHRocmVhZCBibG9ja2VkLCBpLmUuIHRoZSBsb2NrVGhyZWFkIHdhcyByZWxlYXNlZCBiZWZvcmUgdGhlIHVwZGF0ZSB0aHJlYWQuCi0gICAgICAgIGFzc2VydFRydWUodGVzdE1vbml0b3IubG9ja1RocmVhZFJlbGVhc2VUaW1lIDw9IHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZFJlbGVhc2VUaW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0IEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlLnB1dCBtZXRob2Qgd2hpY2ggb3ZlcnJpZGVzIHRoZSBIYXNoVGFibGUgbWV0aG9kLgotICAgICAqIFRlc3RzIHRoZSBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSBjb2xsZWN0aW9uIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCB0byBlbnN1cmUgdGhhdAotICAgICAqIGEgdGhyZWFkIHRyeWluZyB0byB1cGRhdGUgdGhlIGNvbGxlY3Rpb24gZG9lcyBub3QgYmxvY2sgYXMgbG9uZyBhcyBhbm90aGVyIHRocmVhZCBoYXMgdGhlCi0gICAgICogY29sbGVjdGlvbiBsb2NrZWQgZm9yIHVwZGF0ZS4gIE5vdGUgdGhhdCBVcGRhdGVSdW5uYWJsZSBwZXJmb3JtcyB0aGUgYWN0dWFsIHRlc3Qgb2YgdGhlCi0gICAgICogbWV0aG9kLgotICAgICAqIEBzZWUgVXBkYXRlUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRVcGRhdGVMb2NrX2dldCgpIHsKLSAgICAgICAgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB0ZXN0TW9uaXRvciA9IG5ldyBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yKCk7Ci0gICAgICAgIEhhc2hNYXBVcGRhdGVMb2NrYWJsZSB0ZXN0TWFwID0gbmV3IEhhc2hNYXBVcGRhdGVMb2NrYWJsZSgpOwotICAgICAgICB0ZXN0TWFwLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgdGVzdE1hcC5wdXQoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgIHRlc3RNYXAucHV0KCJnZXRLZXkiLCAidmFsdWUzIik7Ci0gICAgICAgIHN0YXJ0dXBUZXN0VGhyZWFkcyh0ZXN0TW9uaXRvciwgdGVzdE1hcCwgTWV0aG9kVG9DaGVjay5nZXQpOwotCi0gICAgICAgIGFzc2VydE5vVGhyZWFkRXJyb3JzKHRlc3RNb25pdG9yKTsKLQotICAgICAgICAvLyBUaGUgdXBkYXRlIHRocmVhZCBzaG91bGRuJ3QgYmxvY2sgc2luY2Ugd2Ugc2FpZCB0byBub3Qgd2FpdC4KLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRSZWxlYXNlVGltZSA8PSB0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUuY2hlY2tVcGRhdGVMb2NrIG1ldGhvZC4KLSAgICAgKiBUZXN0cyB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbiBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQgdG8gZW5zdXJlIHRoYXQKLSAgICAgKiBhIHRocmVhZCB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjb2xsZWN0aW9uIHdpbGwgYmxvY2sgYXMgbG9uZyBhcyBhbm90aGVyIHRocmVhZCBoYXMgdGhlCi0gICAgICogY29sbGVjdGlvbiBsb2NrZWQgZm9yIHVwZGF0ZS4gIE5vdGUgdGhhdCBVcGRhdGVSdW5uYWJsZSBwZXJmb3JtcyB0aGUgYWN0dWFsIHRlc3Qgb2YgdGhlCi0gICAgICogbWV0aG9kLgotICAgICAqIEBzZWUgVXBkYXRlUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0aHJlYWRVcGRhdGVMb2NrX2NoZWNrTG9ja193YWl0KCkgewotICAgICAgICBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yID0gbmV3IE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IoKTsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCk7Ci0gICAgICAgIHN0YXJ0dXBUZXN0VGhyZWFkcyh0ZXN0TW9uaXRvciwgdGVzdE1hcCwgTWV0aG9kVG9DaGVjay5jaGVja0xvY2tfd2FpdCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm9UaHJlYWRFcnJvcnModGVzdE1vbml0b3IpOyAgICAgICAgICAgIAotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXBkYXRlIHRocmVhZCBibG9ja2VkLCBpLmUuIHRoZSBsb2NrVGhyZWFkIHdhcyByZWxlYXNlZCBiZWZvcmUgdGhlIHVwZGF0ZSB0aHJlYWQuCi0gICAgICAgIGFzc2VydFRydWUodGVzdE1vbml0b3IubG9ja1RocmVhZFJlbGVhc2VUaW1lIDw9IHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZFJlbGVhc2VUaW1lKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSB0YWJsZSB3YXMgbm90IGxvY2tlZC4KLSAgICAgICAgYXNzZXJ0RmFsc2UoKChCb29sZWFuKSB0ZXN0TW9uaXRvci5tZXRob2RUb1Rlc3RSZXR1cm5WYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUuY2hlY2tVcGRhdGVMb2NrIG1ldGhvZC4KLSAgICAgKiBUZXN0cyB0aGUgSGFzaFRhYmxlVXBkYXRlTG9ja2FibGUgY29sbGVjdGlvbiBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQgdG8gZW5zdXJlIHRoYXQKLSAgICAgKiBhIHRocmVhZCB0cnlpbmcgdG8gdXBkYXRlIHRoZSBjb2xsZWN0aW9uIHdpbGwgbm90IGJsb2NrIGFzIGxvbmcgYXMgYW5vdGhlciB0aHJlYWQgaGFzIHRoZQotICAgICAqIGNvbGxlY3Rpb24gbG9ja2VkIGZvciB1cGRhdGUuICBOb3RlIHRoYXQgVXBkYXRlUnVubmFibGUgcGVyZm9ybXMgdGhlIGFjdHVhbCB0ZXN0IG9mIHRoZQotICAgICAqIG1ldGhvZC4KLSAgICAgKiBAc2VlIFVwZGF0ZVJ1bm5hYmxlI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpdGhyZWFkVXBkYXRlTG9ja19jaGVja0xvY2tfbm93YWl0KCkgewotICAgICAgICBNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yID0gbmV3IE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IoKTsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBuZXcgSGFzaE1hcFVwZGF0ZUxvY2thYmxlKCk7Ci0gICAgICAgIHN0YXJ0dXBUZXN0VGhyZWFkcyh0ZXN0TW9uaXRvciwgdGVzdE1hcCwgTWV0aG9kVG9DaGVjay5jaGVja0xvY2tfbm93YWl0KTsKLQotICAgICAgICBhc3NlcnROb1RocmVhZEVycm9ycyh0ZXN0TW9uaXRvcik7Ci0KLSAgICAgICAgLy8gVGhlIHVwZGF0ZSB0aHJlYWQgc2hvdWxkbid0IGJsb2NrIHNpbmNlIHdlIHNhaWQgdG8gbm90IHdhaXQuCi0gICAgICAgIGFzc2VydFRydWUodGVzdE1vbml0b3IudXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUgPD0gdGVzdE1vbml0b3IubG9ja1RocmVhZFJlbGVhc2VUaW1lKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZSB0YWJsZSB3YXMgbG9ja2VkLgotICAgICAgICBhc3NlcnRUcnVlKCgoQm9vbGVhbikgdGVzdE1vbml0b3IubWV0aG9kVG9UZXN0UmV0dXJuVmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQW1vdW50IG9mIHRpbWUgdGhlIHRlc3RjYXNlIHNob3VsZCB3YWl0IG9uIHRoZSB0ZXN0IHRocmVhZHMgYmVmb3JlIHRpbWluZyBvdXQKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgVEhSRUFEX1RJTUVPVVQgPSA5MDAwMDsKLSAgICAvLyBBbW91bnQgb2YgdGltZSB0aGUgdGhyZWFkIGhvbGRpbmcgdGhlIHVwZGF0ZSBsb2NrIHNob3VsZCBzbGVlcC4gIFRoaXMgbmVlZHMgdG8gYmUgbG9uZwotICAgIC8vIGVub3VnaCBzbyB0aGF0IGNvbXBhcmlzb25zIGJldHdlZW4gdGhlIHRpbWUgdGhlIGxvY2tpbmcgdGhyZWFkIGlzIHJlbGVhc2VkIGFuZCB0aGUgdXBkYXRlCi0gICAgLy8gdGhyZWFkIGlzIHJlbGVhc2VkIGNhbiBiZSByZWxpYWJseSBjb21wYXJlZCBhcyBhbiBpbmRpY2F0aW9uIG9mIHdoZXRoZXIgdGhlIHVwZGF0ZSB0aHJlYWQKLSAgICAvLyB3YXMgYmxvY2tlZC4KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgTE9DS19USFJFQURfU0xFRVAgPSA1MDAwOwotICAgIAotICAgIC8qKgotICAgICAqIEFzc2VydCB0aGVyZSB3ZXJlIG5vIGVycm9ycyBpbiB0aGUgYmFzaWMgcnVubmluZyBvZiB0aGUgdGhyZWFkcy4KLSAgICAgKiBAcGFyYW0gdGVzdE1vbml0b3IgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgdGVzdCB0aHJlYWRzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb1RocmVhZEVycm9ycyhNdWx0aXRocmVhZFVwZGF0ZUxvY2tNb25pdG9yIHRlc3RNb25pdG9yKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBib3RoIHRocmVhZHMgd2VyZSByZWxlYXNlZCAoaS5lLiByZWxlYXNlIHRpbWUgIT0gMCkgYW5kIHRoYXQgdGhlIAotICAgICAgICAvLyB0aGF0IHRoZXJlIHdlcmUgbm8gZXhjZXB0aW9ucyBlbmNvdW50ZXJlZAotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCh0ZXN0TW9uaXRvci5sb2NrVGhyZWFkRXhjZXB0aW9uKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUgIT0gMCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZEV4Y2VwdGlvbik7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1vbml0b3IudXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUgIT0gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlcyB0aGUgdGVzdCB0aHJlYWRzIHdpdGggdGhlIGNvbW1vbiBvYmplY3QgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvbmUsIHRoZSAKLSAgICAgKiBjb2xsZWN0aW9uIHRvIGJlIHRlc3RlZCBhbmQgdGhlIG1ldGhvZCB0byBiZSB0ZXN0ZWQuICBUd28gdGhyZWFkcyB3aWxsIGJlIHN0YXJ0ZWQ6Ci0gICAgICogKDEpIEEgdGhyZWFkIHRoYXQgd2lsbCBsb2NrIHRoZSBjb2xsZWN0aW9uLCBzbGVlcCwgdGhlbiB1bmxvY2sgdGhlIGNvbGxlY3Rpb24KLSAgICAgKiAoMikgQSB0aHJlYWQgdGhhdCB3aWxsIHRyeSB0byB1cGRhdGUgdGhlIGNvbGxlY3Rpb24gd2hpbGUgaXQgaXMgbG9ja2VkLgotICAgICAqIFRocmVhZCAoMikgc2hvdWxkIGJsb2NrIGlmIHRoZSBtZXRob2QgdG8gYmUgdGVzdGVkIGlzIG9uZSB0aGF0IHdvdWxkIHVwZGF0ZSB0aGUgdGFibGUsIAotICAgICAqIG90aGVyd2lzZSBpdCBzaG91bGQgbm90IGJsb2NrLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0ZXN0TW9uaXRvciBDb21tb24gb2JqZWN0IHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgdGVzdCBtZXRob2QgYW5kIHRoZSB0d28KLSAgICAgKiB0ZXN0IHRocmVhZHMKLSAgICAgKiBAcGFyYW0gdGVzdE1hcCBJbnN0YW5jZSBvZiBIYXNoVGFibGVVcGRhdGVMb2NrYWJsZSB0byB0ZXN0Ci0gICAgICogQHBhcmFtIG1ldGhvZFRvVGVzdCBUaGUgbWV0aG9kIG9uIEhhc2hUYWJsZVVwZGF0ZUxvY2thYmxlIHRvIGJlIHRlc3RlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc3RhcnR1cFRlc3RUaHJlYWRzKE11bHRpdGhyZWFkVXBkYXRlTG9ja01vbml0b3IgdGVzdE1vbml0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2RUb0NoZWNrIG1ldGhvZFRvVGVzdCkgewotICAgICAgICBMb2NraW5nUnVubmFibGUgbG9ja2luZ1J1bm5hYmxlID0gbmV3IExvY2tpbmdSdW5uYWJsZSgpOwotICAgICAgICBsb2NraW5nUnVubmFibGUudGVzdE1vbml0b3IgPSB0ZXN0TW9uaXRvcjsKLSAgICAgICAgbG9ja2luZ1J1bm5hYmxlLnRlc3RNYXAgPSB0ZXN0TWFwOwotICAgICAgICBsb2NraW5nUnVubmFibGUubWV0aG9kVG9UZXN0ID0gbWV0aG9kVG9UZXN0OwotICAgICAgICAKLSAgICAgICAgVXBkYXRlUnVubmFibGUgdXBkYXRlUnVubmFibGUgPSBuZXcgVXBkYXRlUnVubmFibGUoKTsKLSAgICAgICAgdXBkYXRlUnVubmFibGUudGVzdE1vbml0b3IgPSB0ZXN0TW9uaXRvcjsKLSAgICAgICAgdXBkYXRlUnVubmFibGUudGVzdE1hcCA9IHRlc3RNYXA7Ci0gICAgICAgIHVwZGF0ZVJ1bm5hYmxlLm1ldGhvZFRvVGVzdCA9IG1ldGhvZFRvVGVzdDsKLQotICAgICAgICBUaHJlYWQgbG9ja2luZ1RocmVhZCA9IG5ldyBUaHJlYWQobG9ja2luZ1J1bm5hYmxlLCAiTG9ja2luZyIpOwotICAgICAgICBUaHJlYWQgdXBkYXRlVGhyZWFkID0gbmV3IFRocmVhZCh1cGRhdGVSdW5uYWJsZSwgIlVwZGF0aW5nIik7Ci0KLSAgICAgICAgLy8gVG8gZWxpbWluYXRlIGEgdGltaW5nIHdpbmRvdyB3aGVyZSB0aGUgbG9ja2luZyB0aHJlYWQgc3RhcnRzIGFuZCBydW5zIHRvIGNvbXBsZXRpb24KLSAgICAgICAgLy8gYmVmb3JlIHRoZSB1cGRhdGUgdGhyZWFkIGdldHMgc3RhcnRlZCwgc3RhcnQgdGhlIHVwZGF0ZSB0aHJlYWQgZmlyc3QuICBJdCB3aWxsIGJsb2NrCi0gICAgICAgIC8vIHdhaXRpbmcgb24gdGhlIGxvY2tpbmcgdGhyZWFkIHRvIGNvbXBsZXRlLgotICAgICAgICB1cGRhdGVUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbG9ja2luZ1RocmVhZC5zdGFydCgpOwotICAgICAgICAKLSAgICAgICAgLy8gSm9pbiB0aGUgdGhyZWFkcyB0byB3YWl0IGZvciB0aGVpciBjb21wbGV0aW9uLCBzcGVjaWZ5aW5nIGEgdGltZW91dCB0byBwcmV2ZW50IAotICAgICAgICAvLyBhIHRlc3RjYXNlIGhhbmcgaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgdGhyZWFkcy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvY2tpbmdUaHJlYWQuam9pbihUSFJFQURfVElNRU9VVCk7Ci0gICAgICAgICAgICB1cGRhdGVUaHJlYWQuam9pbihUSFJFQURfVElNRU9VVCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmFibGUgdG8gam9pbiB0byB0ZXN0aW5nIHRocmVhZHMiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBPYmplY3QgdXNlZCB0byBjb21tdW5pY2F0ZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSB0ZXN0Y2FzZSBhbmQgdGhlIHR3byB0ZXN0IHRocmVhZHMuCi0gICAgICovCi0gICAgY2xhc3MgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB7Ci0gICAgICAgIGxvbmcgbG9ja1RocmVhZFJlbGVhc2VUaW1lID0gMDsKLSAgICAgICAgYm9vbGVhbiBsb2NrU2V0dXBDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICBSdW50aW1lRXhjZXB0aW9uIGxvY2tUaHJlYWRFeGNlcHRpb24gPSBudWxsOwotCi0gICAgICAgIGxvbmcgdXBkYXRlVGhyZWFkUmVsZWFzZVRpbWUgPSAwOwotICAgICAgICBSdW50aW1lRXhjZXB0aW9uIHVwZGF0ZVRocmVhZEV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICAgICAgT2JqZWN0IG1ldGhvZFRvVGVzdFJldHVyblZhbHVlID0gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWJzdHJhY3Qgc3VwZXJjbGFzcyBvZiB0aGUgdHdvIHRlc3QgdGhyZWFkcy4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCBjbGFzcyBVcGRhdGVMb2NrYWJsZVRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLSAgICAgICAgTXVsdGl0aHJlYWRVcGRhdGVMb2NrTW9uaXRvciB0ZXN0TW9uaXRvciA9IG51bGw7Ci0gICAgICAgIE1ldGhvZFRvQ2hlY2sgbWV0aG9kVG9UZXN0ID0gbnVsbDsKLSAgICAgICAgSGFzaE1hcFVwZGF0ZUxvY2thYmxlIHRlc3RNYXAgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRocmVhZCB0aGF0IHdpbGwgbG9jayB0aGUgY29sbGVjdGlvbiwgc2xlZXAsIHRoZW4gdW5sb2NrIHRoZSBjb2xsZWN0aW9uLgotICAgICAqLwotICAgIGNsYXNzIExvY2tpbmdSdW5uYWJsZSBleHRlbmRzIFVwZGF0ZUxvY2thYmxlVGVzdFJ1bm5hYmxlIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIExvY2sgdGhlIHRhYmxlLCB0aGVuIHJlbGVzZSB0aGUgImxvY2tTZXR1cENvbXBsZXRlIiB3YWl0ZXJzLCB3aGljaCB3aWxsCi0gICAgICAgICAgICAgICAgLy8gcmVsZWFzZSB0aGUgdXBkYXRlIHRocmVhZC4KLSAgICAgICAgICAgICAgICAvLyBOT1RFIHRoYXQgdGhlIGxvY2sgaXMgZG9uZSBpbnNpZGUgYSB0cnkgYmxvY2sgYW5kIHRoZSB1bmxvY2sgaXMgZG9uZSBpbiAKLSAgICAgICAgICAgICAgICAvLyBhIGZpbmFseSBibG9jayBzbyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLgotICAgICAgICAgICAgICAgIHRlc3RNYXAubG9ja0ZvclVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGVzdE1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdE1vbml0b3IubG9ja1RocmVhZFJlbGVhc2VUaW1lID0gMDsKLSAgICAgICAgICAgICAgICAgICAgdGVzdE1vbml0b3IubG9ja1NldHVwQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB0ZXN0TW9uaXRvci5ub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGEgd2hpbGUgdG8gdmVyaWZ5IHRoYXQgdGhlIHVwZGF0ZSB0aHJlYWQgaXMgYmVpbmcgYmxvY2tlZCB3aGlsZSAKLSAgICAgICAgICAgICAgICAvLyB0aGUgdGFibGUgaXMgbG9ja2VkIGJ5IHRoaXMgdGhyZWFkLiAgVGhlbiB1bmxvY2sgdGhlIHRhYmxlLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChMT0NLX1RIUkVBRF9TTEVFUCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICB0ZXN0TW9uaXRvci5sb2NrVGhyZWFkRXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHRlc3RNb25pdG9yLmxvY2tUaHJlYWRFeGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB0aW1lIGJlZm9yZSByZWxlYXNpbmcgdGhlIGxvY2suICBPbiBzb21lIHN5c3RlbXMsIGFzIHNvb24gYXMgdGhlIAotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBpcyBkb25lLCB0aGUgd2FpdGluZyB0aHJlYWQgd2lsbCBpbW1lZGlhdGVseSBnZXQgY29udHJvbC4KLSAgICAgICAgICAgICAgICB0ZXN0TW9uaXRvci5sb2NrVGhyZWFkUmVsZWFzZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICB0ZXN0TWFwLnVubG9ja0ZvclVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRocmVhZCB0aGF0IHdpbGwgcnVuIHRoZSBtZXRob2RzIHRvIGJlIHRlc3RlZCBvbiB0aGUgY29sbGVjdGlvbiB3aGlsZSBpdCBpcyBsb2NrZWQgZm9yIAotICAgICAqIHVwZGF0ZSBieSBhbm90aGVyIHRocmVhZC4KLSAgICAgKi8KLSAgICBjbGFzcyBVcGRhdGVSdW5uYWJsZSBleHRlbmRzIFVwZGF0ZUxvY2thYmxlVGVzdFJ1bm5hYmxlICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIC8vIFNldHVwIHdoYXRldmVyIHdlJ2xsIG5lZWQgdG8gdGVzdCBsYXNlciBvbgotICAgICAgICAgICAgTWFwIHB1dEFsbE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBwdXRBbGxNYXAucHV0KCJrMSIsICJ2MSIpOwotICAgICAgICAgICAgcHV0QWxsTWFwLnB1dCgiazIiLCAidjIiKTsKLSAgICAgICAgICAgIHB1dEFsbE1hcC5wdXQoImszIiwgInYzIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdhaXQgdGlsbCB0aGUgbG9ja2luZyB0aHJlYWQgaXMgc2V0dXAKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0ZXN0TW9uaXRvcikgewotICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZFJlbGVhc2VUaW1lID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSghdGVzdE1vbml0b3IubG9ja1NldHVwQ29tcGxldGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLndhaXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZEV4Y2VwdGlvbiA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGVzdE1vbml0b3IudXBkYXRlVGhyZWFkRXhjZXB0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUZXN0IHRoZSB1cGRhdGUgbWV0aG9kIHNwZWNpZmllZAotICAgICAgICAgICAgc3dpdGNoKG1ldGhvZFRvVGVzdCkgewotICAgICAgICAgICAgY2FzZSBjaGVja0xvY2tfd2FpdDoKLSAgICAgICAgICAgICAgICBib29sZWFuIHJldFZhbFdhaXQgPSB0ZXN0TWFwLmNoZWNrVXBkYXRlTG9jayh0cnVlKTsKLSAgICAgICAgICAgICAgICB0ZXN0TW9uaXRvci5tZXRob2RUb1Rlc3RSZXR1cm5WYWx1ZSA9IG5ldyBCb29sZWFuKHJldFZhbFdhaXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBjaGVja0xvY2tfbm93YWl0OgotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0VmFsTm9XYWl0ID0gdGVzdE1hcC5jaGVja1VwZGF0ZUxvY2soZmFsc2UpOwotICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLm1ldGhvZFRvVGVzdFJldHVyblZhbHVlID0gbmV3IEJvb2xlYW4ocmV0VmFsTm9XYWl0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgcHV0OgotICAgICAgICAgICAgICAgIHRlc3RNYXAucHV0KCJuZXdLZXkiLCAibmV3VmFsdWUiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgcHV0QWxsOgotICAgICAgICAgICAgICAgIHRlc3RNYXAucHV0QWxsKHB1dEFsbE1hcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIHJlbW92ZToKLSAgICAgICAgICAgICAgICB0ZXN0TWFwLnJlbW92ZSgicmVtb3ZlS2V5Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGdldDoKLSAgICAgICAgICAgICAgICB0ZXN0TWFwLmdldCgiZ2V0S2V5Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRlc3RNb25pdG9yLnVwZGF0ZVRocmVhZEV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigibWV0aG9kIHRvIHRlc3Qgbm90IHJlY29nbml6ZWQ6ICIgKyBtZXRob2RUb1Rlc3QpOyAKLSAgICAgICAgICAgICAgICB0aHJvdyB0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRFeGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXN0TW9uaXRvci51cGRhdGVUaHJlYWRSZWxlYXNlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9jb250ZXh0L09wZXJhdGlvbkNvbnRleHRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvT3BlcmF0aW9uQ29udGV4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRlMDIwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2NvbnRleHQvT3BlcmF0aW9uQ29udGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlVVSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uQ29udGV4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dCgKLSAgICAgICAgICAgIG5ldyBBeGlzQ29uZmlndXJhdGlvbigpKTsKLQotICAgIHB1YmxpYyBPcGVyYXRpb25Db250ZXh0VGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TUVQZmluZGluZ09uUmVsYXRlc1RPKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIlRlbXBTQyIpOwotICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuYWRkU2VydmljZShheGlzU2VydmljZSk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY29uZmlnQ29udGV4dC5jcmVhdGVTZXJ2aWNlR3JvdXBDb250ZXh0KAotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKSk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNlc3Npb25Db250ZXh0ID0gc2djLmdldFNlcnZpY2VDb250ZXh0KGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQxID0gdGhpcy5nZXRCYXNpY01lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQxLnNldE1lc3NhZ2VJRChVVUlER2VuZXJhdG9yLmdldFVVSUQoKSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJ0ZXN0IikpOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9wZXJhdGlvbkNvbnRleHQxID0gYXhpc09wZXJhdGlvbgotICAgICAgICAgICAgICAgIC5maW5kT3BlcmF0aW9uQ29udGV4dChtZXNzYWdlQ29udGV4dDEsIHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgYXhpc09wZXJhdGlvbi5yZWdpc3Rlck9wZXJhdGlvbkNvbnRleHQobWVzc2FnZUNvbnRleHQxLCBvcGVyYXRpb25Db250ZXh0MSk7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQyID0gdGhpcy5nZXRCYXNpY01lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0Mi5zZXRNZXNzYWdlSUQoVVVJREdlbmVyYXRvci5nZXRVVUlEKCkpOwotICAgICAgICBtZXNzYWdlQ29udGV4dDIuZ2V0T3B0aW9ucygpLmFkZFJlbGF0ZXNUbygKLSAgICAgICAgICAgICAgICBuZXcgUmVsYXRlc1RvKG1lc3NhZ2VDb250ZXh0MS5nZXRNZXNzYWdlSUQoKSkpOwotICAgICAgICBtZXNzYWdlQ29udGV4dDIuc2V0QXhpc09wZXJhdGlvbihheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcGVyYXRpb25Db250ZXh0MiA9IGF4aXNPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAuZmluZE9wZXJhdGlvbkNvbnRleHQobWVzc2FnZUNvbnRleHQyLCBzZXNzaW9uQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25Db250ZXh0MSwgb3BlcmF0aW9uQ29udGV4dDIpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRCYXNpY01lc3NhZ2VDb250ZXh0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gY29uZmlnQ29udGV4dC5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRUcmFuc3BvcnRJbihuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigiYXhpczIiKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFRyYW5zcG9ydE91dChuZXcgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24oImF4aXMyIikpOwotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dDsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0FkZGluZ09ic2VydmVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0FkZGluZ09ic2VydmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmY4OTRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BZGRpbmdPYnNlcnZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkaW5nT2JzZXJ2ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nT2JzZXJ2cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0NvbmZpZ1dpdGhPYnNlcnZlcnMiOwotICAgICAgICAgICAgZXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUsIGZpbGVuYW1lICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXIpOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjNlYmZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BeGlzTWVzc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgQXhpc01lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEF4aXNNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9Ci0gICAgICAgICAgICAgICAgQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L0F4aXNNZXNzYWdlVGVzdFJlcG8iOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBlciA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKGVyKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGVyLmdldFNlcnZpY2UoIk1lc3NhZ2V0ZXN0U2VydmljZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvU3RyaW5nIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wKTsKLSAgICAgICAgQXhpc01lc3NhZ2UgbWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoIkluIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWVzc2FnZSk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhID0gbWVzc2FnZS5nZXRQYXJhbWV0ZXIoIm1lc3NhZ2VJTiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYS5nZXRWYWx1ZSgpLCAibWVzc2FnZUlOIik7Ci0KLQotICAgICAgICBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgiZWNob1N0cmluZ0FycmF5IikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wKTsKLSAgICAgICAgbWVzc2FnZSA9IG9wLmdldE1lc3NhZ2UoIkluIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWVzc2FnZSk7Ci0gICAgICAgIHBhcmEgPSBtZXNzYWdlLmdldFBhcmFtZXRlcigibWVzc2FnZUlOIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhLmdldFZhbHVlKCksICJtZXNzYWdlSU4iKTsKLQotICAgICAgICBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgiT3V0Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWVzc2FnZSk7Ci0gICAgICAgIHBhcmEgPSBtZXNzYWdlLmdldFBhcmFtZXRlcigibWVzc2FnZU91dCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYS5nZXRWYWx1ZSgpLCAibWVzc2FnZU91dCIpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0F4aXNPYnNlcnZlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9BeGlzT2JzZXJ2ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzEwNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0F4aXNPYnNlcnZlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVySW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlckluY2x1ZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzT2JzZXJ2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQXhpc09ic2VydmVySW1wbCBpbXBsZW1lbnRzIEF4aXNPYnNlcnZlciB7Ci0KLSAgICBQYXJhbWV0ZXJJbmNsdWRlIHBhcmFtZXRlcmltcGw7Ci0KLSAgICAvLyBUaGUgaW5pdGlsaXphdGlvbiBjb2RlIHdpbGwgZ28gaGVyZQotICAgIHB1YmxpYyB2b2lkIGluaXQoQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZykgewotICAgICAgICBwYXJhbWV0ZXJpbXBsID0gbmV3IFBhcmFtZXRlckluY2x1ZGVJbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZVVwZGF0ZShBeGlzRXZlbnQgZXZlbnQsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb2R1bGVVcGRhdGUoQXhpc0V2ZW50IGV2ZW50LCBBeGlzTW9kdWxlIG1vZHVsZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy90byBjaGVjayB3aGV0aGVyIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIGF0IGFueSBsZXZsZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFyYW1ldGVyTG9ja2VkKFN0cmluZyBwYXJhbWV0ZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLnBhcmFtZXRlcmltcGwuZGVzZXJpYWxpemVQYXJhbWV0ZXJzKHBhcmFtZXRlckVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcnZpY2VHcm91cFVwZGF0ZShBeGlzRXZlbnQgZXZlbnQsIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0JhZE1vZHVsZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9CYWRNb2R1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWQ3NzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0JhZE1vZHVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEJhZE1vZHVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmFkTW9kdWxlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRNb2R1bGVYTUwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIGdldFRlc3RSZXNvdXJjZUZpbGUoImRlcGxveW1lbnQvQmFkbW9kdWxlLnhtbCIpKTsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGdsYWJsID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBBeGlzQ29uZmlnQnVpbGRlciBidWlsZGVyID0gbmV3IEF4aXNDb25maWdCdWlsZGVyKGluLCBnbGFibCwgbnVsbCk7Ci0gICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlQ29uZmlnKCk7Ci0gICAgICAgICAgICBmYWlsKAotICAgICAgICAgICAgICAgICAgICAidGhpcyBtdXN0IGZhaWxlZCBncmFjZWZ1bGx5IHdpdGggRGVwbG95bWVudEV4Y2VwdGlvbiBvciBGaWxlTm90Rm91bmRFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBjYXRjaCAoRGVwbG95bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9CdWlsZEVSV2l0aERlcGxveW1lbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQnVpbGRFUldpdGhEZXBsb3ltZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMxZmExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9CdWlsZEVSV2l0aERlcGxveW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgQnVpbGRFUldpdGhEZXBsb3ltZW50VGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdENhc2UgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZEVSV2l0aERlcGxveW1lbnRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlcGxveW1lbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50IjsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGVyID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXIpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGVyLmdldFNlcnZpY2UoInNlcnZpY2UyIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICAgICAgLy9jb21tZW50ZCBzaW5jZSB0aGVyZSBpcyBubyBzZXJ2aWNlIGJhc2VkIG1lc3NhZ2VSZWNlaXZlcnMKLSAgICAgICAgICAgIC8qTWVzc2FnZVJlY2VpdmVyIHByb3ZpZGVyID0gc2VydmljZS5nZXRNZXNzYWdlUmVjZWl2ZXIoKTsKLSAgICAgICAgICBhc3NlcnROb3ROdWxsKHByb3ZpZGVyKTsKLSAgICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyIGluc3RhbmNlb2YgUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIpOyovCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY2wpOwotICAgICAgICAgICAgTG9hZGVyLmxvYWRDbGFzcyhjbCwgIm9yZy5hcGFjaGUuYXhpczIuRWNobzIiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlLmdldFBhcmFtZXRlcigicGFyYTIiKSk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihuZXcgUU5hbWUoIm9wbmFtZSIpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3ApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0J1aWxkZXJTZWxlY3RvckRlcGxveW1lbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQnVpbGRlclNlbGVjdG9yRGVwbG95bWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzZGI4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQnVpbGRlclNlbGVjdG9yRGVwbG95bWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgQnVpbGRlclNlbGVjdG9yRGVwbG95bWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlclNlbGVjdG9yRGVwbG95bWVudFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlclNlbGVjdGlvbigpIHRocm93cyBBeGlzRmF1bHQgewotLy8gICAgICAgIFN0cmluZyByZXBvc2l0b3J5TmFtZSAgPVN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsIi4iKSsiLyIrInRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50IjsKLS8vICAgICAgICBGaWxlIHJlcG8gPSBuZXcgRmlsZShyZXBvc2l0b3J5TmFtZSk7Ci0vLyAgICAgICAgU3RyaW5nIHhtbEZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikrIi8iKyJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L2J1aWxkZXJTZWxlY3RvclRlc3QvYXhpczIueG1sIjsKLS8vICAgICAgICBGaWxlIHhtbCA9IG5ldyBGaWxlKHhtbEZpbGUpOwotLy8gICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZnNjID0gbmV3IEZpbGVTeXN0ZW1Db25maWd1cmF0b3IocmVwby5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1sLmdldEFic29sdXRlUGF0aCgpKTsKLS8vICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gZnNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0vLyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGF4aXNDb25maWcuZ2V0TWVzc2FnZUJ1aWxkZXIoInRleHQveG1sIikuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSwib3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlciIpOwotLy8gICAgICAgIGNsYXNzTmFtZSA9IGF4aXNDb25maWcuZ2V0TWVzc2FnZUJ1aWxkZXIoImFwcGxpY2F0aW9uL3NvYXAreG1sIikuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSwib3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlciIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGVyU2VsZWN0aW9uSW52YWxpZEVudHJ5KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5TmFtZSA9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudCI7Ci0gICAgICAgIEZpbGUgcmVwbyA9IG5ldyBGaWxlKHJlcG9zaXRvcnlOYW1lKTsKLSAgICAgICAgU3RyaW5nIHhtbEZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsKLSAgICAgICAgICAgICAgICAidGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9idWlsZGVyU2VsZWN0b3JUZXN0L2JhZC1heGlzMi54bWwiOwotICAgICAgICBGaWxlIHhtbCA9IG5ldyBGaWxlKHhtbEZpbGUpOwotICAgICAgICBGaWxlU3lzdGVtQ29uZmlndXJhdG9yIGZzYyA9Ci0gICAgICAgICAgICAgICAgbmV3IEZpbGVTeXN0ZW1Db25maWd1cmF0b3IocmVwby5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1sLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgQXhpc0ZhdWx0IHRlc3RGYXVsdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmc2MuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRlc3RGYXVsdCA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RmF1bHQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2NhMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvQ3VzdG9tRGVwbG95ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuZGVwbG95ZXJzLkN1c3RvbURlcGxveWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tRGVwbG95ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21EZXBsb3llcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPQotICAgICAgICAgICAgICAgIEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9DdXN0b21EZXBsb3llclJlcG8iOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgLy8gT0ssIGxldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdCBoZXJlLi4uCi0gICAgICAgIGFzc2VydFRydWUoIkluaXQgd2FzIG5vdCBjYWxsZWQiLCBDdXN0b21EZXBsb3llci5pbml0Q2FsbGVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaXJlY3RvcnkiLCAid2lkZ2V0cyIsIEN1c3RvbURlcGxveWVyLmRpcmVjdG9yeSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZXh0ZW5zaW9uIiwgInN2YyIsIEN1c3RvbURlcGxveWVyLmV4dGVuc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGRlcGxveWVkIGl0ZW1zIiwgMiwgQ3VzdG9tRGVwbG95ZXIuZGVwbG95ZWRJdGVtcyk7Ci0gICAgICAgIGFzc2VydFRydWUoIkdlb3JnZSB3YXNuJ3QgZm91bmQiLCBDdXN0b21EZXBsb3llci5nZW9yZ2VEZXBsb3llZCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk1hcnkgd2Fzbid0IGZvdW5kIiwgQ3VzdG9tRGVwbG95ZXIubWFyeURlcGxveWVkKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlBhcmFtZXRlciBub3Qgc2V0IGNvcnJlY3RseSIsCi0gICAgICAgICAgICAgICAgICAgICBDdXN0b21EZXBsb3llci5QQVJBTV9WQUwsCi0gICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKEN1c3RvbURlcGxveWVyLlBBUkFNX05BTUUpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudFRvdGFsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0RlcGxveW1lbnRUb3RhbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwNWZmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvRGVwbG95bWVudFRvdGFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5LkhhbmRsZXIzOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIERlcGxveW1lbnRUb3RhbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQiOwotICAgICAgICBheGlzQ29uZmlnID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oZmlsZW5hbWUsIGZpbGVuYW1lICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBheGlzQ29uZmlnLmVuZ2FnZU1vZHVsZSgibW9kdWxlMSIpOwotICAgICAgICAgLy8gT0ssIG5vIGV4Y2VwdGlvbnMuICBOb3cgbWFrZSBzdXJlIHdlIHJlYWQgdGhlIGNvcnJlY3QgZmlsZS4uLgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RwYXJzZVNlcnZpY2UxKCkgdGhyb3dzIEF4aXNGYXVsdCwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoIkZhdm9yaXRlQ29sb3IiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gRmF2b3JpdGVDb2xvciBwYXJhbWV0ZXIgaW4gYXhpczIueG1sISIsIHBhcmFtKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwdXJwbGUiLCBwYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1BoYXNlKCkgewotICAgICAgICBMaXN0IGluRmxvdyA9IGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5GbG93LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgaW5GbG93LmdldChpKTsKLSAgICAgICAgICAgIGlmIChwaGFzZS5nZXROYW1lKCkuZXF1YWxzKCJOZXdQaGFzZSIpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBpbmRleCBmb3IgTmV3UGhhc2UhIiwgMywgaSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyAjIG9mIGhhbmRsZXJzIGluIE5ld1BoYXNlIiwgMywgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICAgICAgICAgIEhhbmRsZXIgaDYgPSAoSGFuZGxlcilwaGFzZS5nZXRIYW5kbGVycygpLmdldCgwKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyB0eXBlIGZvciBoYW5kbGVyIiwgaDYgaW5zdGFuY2VvZiBIYW5kbGVyMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbkZsb3cgPSBheGlzQ29uZmlnLmdldEluRmF1bHRGbG93UGhhc2VzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk5ld1BoYXNlIHdhc24ndCBmb3VuZCBpbiBJbkZhdWx0RmxvdyIsIGlzUGhhc2VJbkZsb3coaW5GbG93LCAiTmV3UGhhc2UiKSk7Ci0KLSAgICAgICAgTGlzdCBvdXRGbG93ID0gYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpOwotICAgICAgICBhc3NlcnRUcnVlKCJOZXdQaGFzZSB3YXNuJ3QgZm91bmQgaW4gT3V0RmxvdyIsIGlzUGhhc2VJbkZsb3cob3V0RmxvdywgIk5ld1BoYXNlIikpOyAgICAgICAgCi0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGhhc2VJbkZsb3coTGlzdCBpbkZsb3csIFN0cmluZyBwaGFzZU5hbWUpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKE9iamVjdCBhbkluRmxvdyA6IGluRmxvdykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpYW5JbkZsb3c7Ci0gICAgICAgICAgICBpZiAocGhhc2UuZ2V0TmFtZSgpLmVxdWFscyhwaGFzZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3VuZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9FeGNsdWRlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0V4Y2x1ZGVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTAxOGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L0V4Y2x1ZGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotcHVibGljIGNsYXNzIEV4Y2x1ZGVTZXJ2aWNlIHsKLSAgICBwdWJsaWMgaW50IGFkZChpbnQgYSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIGEgKyBiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZGVkdWMoaW50IGEsIGludCBiKSB7Ci0gICAgICAgIHJldHVybiBhIC0gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGRldmlkZShpbnQgYSwgaW50IGIpIHsKLSAgICAgICAgcmV0dXJuIGEgLyBiOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTWVzc2FnZUZvcm1hdHRlckRlcGxveW1lbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTWVzc2FnZUZvcm1hdHRlckRlcGxveW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTRjZmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01lc3NhZ2VGb3JtYXR0ZXJEZXBsb3ltZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRm9ybWF0dGVyRGVwbG95bWVudFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUZvcm1hdHRlckRlcGxveW1lbnRUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkZXJTZWxlY3Rpb24oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50IjsKLSAgICAgICAgRmlsZSByZXBvID0gbmV3IEZpbGUocmVwb3NpdG9yeU5hbWUpOwotICAgICAgICBTdHJpbmcgeG1sRmlsZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKwotICAgICAgICAgICAgICAgICJ0ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21lc3NhZ2VGb3JtYXR0ZXJUZXN0L2F4aXMyLnhtbCI7Ci0gICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoeG1sRmlsZSk7Ci0gICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZnNjID0KLSAgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihyZXBvLmdldEFic29sdXRlUGF0aCgpLCB4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gZnNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPQotICAgICAgICAgICAgICAgIGF4aXNDb25maWcuZ2V0TWVzc2FnZUZvcm1hdHRlcigiYXBwbGljYXRpb24vc29hcCt4bWwiKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIiwgY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRlclNlbGVjdGlvbkludmFsaWRFbnRyeSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQiOwotICAgICAgICBGaWxlIHJlcG8gPSBuZXcgRmlsZShyZXBvc2l0b3J5TmFtZSk7Ci0gICAgICAgIFN0cmluZyB4bWxGaWxlID0gU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArCi0gICAgICAgICAgICAgICAgInRlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbWVzc2FnZUZvcm1hdHRlclRlc3QvYmFkLWF4aXMyLnhtbCI7Ci0gICAgICAgIEZpbGUgeG1sID0gbmV3IEZpbGUoeG1sRmlsZSk7Ci0gICAgICAgIEZpbGVTeXN0ZW1Db25maWd1cmF0b3IgZnNjID0KLSAgICAgICAgICAgICAgICBuZXcgRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcihyZXBvLmdldEFic29sdXRlUGF0aCgpLCB4bWwuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBBeGlzRmF1bHQgdGVzdEZhdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZzYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGVzdEZhdWx0ID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RGYXVsdCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZGlmaWVkQ29uZmlnRmlsZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2RpZmllZENvbmZpZ0ZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNTFlMjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZGlmaWVkQ29uZmlnRmlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBNb2RpZmllZENvbmZpZ0ZpbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhhc2VPcmRlcmNoYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gIi4vdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9CYWRDb25maWdPcmRlckNoYW5nZS9heGlzMi54bWwiOwotICAgICAgICAgICAgZXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgZmFpbCgKLSAgICAgICAgICAgICAgICAgICAgInRoaXMgbXVzdCBmYWlsZWQgZ3JhY2VmdWxseSB3aXRoIERlcGxveW1lbnRFeGNlcHRpb24gXCJJbnZhbGlkIFN5c3RlbSBwcmVkZWZpbmVkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnBoYXNlcyAsIHBoYXNlIG9yZGVyIGRvZXMgbm90XCIgK1xuIHN1cHBvcnRcXG4gcmVjaGVjayBheGlzMi54bWxcIiIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9Nb2R1bGVEaXNlbmdhZ2VtZW50VGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZURpc2VuZ2FnZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzZiNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZURpc2VuZ2FnZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZTsKLQotcHVibGljIGNsYXNzIE1vZHVsZURpc2VuZ2FnZW1lbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZzsKLSAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAidGVzdFNlcnZpY2UiOwotICAgIFFOYW1lIG9wTmFtZSA9IG5ldyBRTmFtZSgidGVzdE9wZXJhdGlvbiIpOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0KLSAgICAgICAgICAgICAgICBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyAiL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvbW9kdWxlRGlzRW5nZWdlUmVwbyI7Ci0gICAgICAgIGNvbmZpZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS4KLSAgICAgICAgICAgICAgICBjcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgdGVzdFNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgdGVzdFNlcnZpY2Uuc2V0TmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gdGVzdE9wZXJhdGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgdGVzdE9wZXJhdGlvbi5zZXROYW1lKG9wTmFtZSk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlLmFkZE9wZXJhdGlvbih0ZXN0T3BlcmF0aW9uKTsKLQotICAgICAgICB0ZXN0T3BlcmF0aW9uID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICB0ZXN0T3BlcmF0aW9uLnNldE5hbWUobmV3IFFOYW1lKCJvcGVyMiIpKTsKLSAgICAgICAgdGVzdFNlcnZpY2UuYWRkT3BlcmF0aW9uKHRlc3RPcGVyYXRpb24pOwotICAgICAgICAKLSAgICAgICAgY29uZmlnLmFkZFNlcnZpY2UodGVzdFNlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxEaXNlbmdhZ2VtZW50KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gY29uZmlnLmdldE1vZHVsZSgidGVzdE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIFBoYXNlIHBoYXNlOwotICAgICAgICBQaGFzZSB1c2VyUGhhc2U7Ci0gICAgICAgIExpc3QgZ2xvYmFsaW5mbG93ID0gY29uZmlnLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdsb2JhbGluZmxvdyk7Ci0gICAgICAgIHBoYXNlID0gKFBoYXNlKSBnbG9iYWxpbmZsb3cuZ2V0KDMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBoYXNlLmdldEhhbmRsZXJDb3VudCgpLCAwKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihvcE5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbik7Ci0gICAgICAgIHVzZXJQaGFzZSA9IChQaGFzZSkgb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1c2VyUGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBjb25maWcuZW5nYWdlTW9kdWxlKG1vZHVsZS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBjb25maWcuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlRGlzZW5nYWdlbWVudCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGNvbmZpZy5nZXRNb2R1bGUoInRlc3RNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBQaGFzZSBwaGFzZTsKLSAgICAgICAgUGhhc2UgdXNlclBoYXNlOwotICAgICAgICBMaXN0IGdsb2JhbGluZmxvdyA9IGNvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnbG9iYWxpbmZsb3cpOwotICAgICAgICBwaGFzZSA9IChQaGFzZSkgZ2xvYmFsaW5mbG93LmdldCgzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWcuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb24pOwotCi0gICAgICAgIHVzZXJQaGFzZSA9IChQaGFzZSkgb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1c2VyUGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBjb25maWcuZW5nYWdlTW9kdWxlKG1vZHVsZS5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLQotICAgICAgICBzZXJ2aWNlLmRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxDaGVjaygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGNvbmZpZy5nZXRNb2R1bGUoInRlc3RNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBjb25maWcuZW5nYWdlTW9kdWxlKG1vZHVsZS5nZXROYW1lKCkpOwotICAgICAgICBjb25maWcuZGlzZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGNvbmZpZy5lbmdhZ2VNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvbkRpc2VuZ2FnZW1lbnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBjb25maWcuZ2V0TW9kdWxlKCJ0ZXN0TW9kdWxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlKTsKLSAgICAgICAgUGhhc2UgcGhhc2U7Ci0gICAgICAgIFBoYXNlIHVzZXJQaGFzZTsKLSAgICAgICAgTGlzdCBnbG9iYWxpbmZsb3cgPSBjb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2xvYmFsaW5mbG93KTsKLSAgICAgICAgcGhhc2UgPSAoUGhhc2UpIGdsb2JhbGluZmxvdy5nZXQoMyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGhhc2UuZ2V0SGFuZGxlckNvdW50KCksIDApOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uKTsKLSAgICAgICAgdXNlclBoYXNlID0gKFBoYXNlKSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuZ2V0KDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJQaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIGNvbmZpZy5lbmdhZ2VNb2R1bGUobW9kdWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIG9wZXJhdGlvbi5kaXNlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VFbmdhZ2VTZXJ2aWNlRGlzZW5nYWdlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gY29uZmlnLmdldE1vZHVsZSgidGVzdE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIFBoYXNlIHByZWRpc3B0YWg7Ci0gICAgICAgIFBoYXNlIHVzZXJQaGFzZTsKLSAgICAgICAgTGlzdCBnbG9iYWxpbmZsb3cgPSBjb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZ2xvYmFsaW5mbG93KTsKLSAgICAgICAgcHJlZGlzcHRhaCA9IChQaGFzZSkgZ2xvYmFsaW5mbG93LmdldCgzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcmVkaXNwdGFoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWRpc3B0YWguZ2V0SGFuZGxlckNvdW50KCksIDApOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uKTsKLSAgICAgICAgdXNlclBoYXNlID0gKFBoYXNlKSBvcGVyYXRpb24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCkuZ2V0KDEpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHVzZXJQaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCB1c2VyUGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotCi0gICAgICAgIHNlcnZpY2UuZW5nYWdlTW9kdWxlKG1vZHVsZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwcmVkaXNwdGFoLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5kaXNlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByZWRpc3B0YWguZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUVuZ2FnZU9wZXJhdGlvbkRpc2VuZ2FnZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGNvbmZpZy5nZXRNb2R1bGUoInRlc3RNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBQaGFzZSBwaGFzZTsKLSAgICAgICAgUGhhc2UgdXNlclBoYXNlOwotICAgICAgICBMaXN0IGdsb2JhbGluZmxvdyA9IGNvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnbG9iYWxpbmZsb3cpOwotICAgICAgICBwaGFzZSA9IChQaGFzZSkgZ2xvYmFsaW5mbG93LmdldCgzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwaGFzZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwaGFzZS5nZXRIYW5kbGVyQ291bnQoKSwgMCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWcuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb24pOwotICAgICAgICB1c2VyUGhhc2UgPSAoUGhhc2UpIG9wZXJhdGlvbi5nZXRSZW1haW5pbmdQaGFzZXNJbkZsb3coKS5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodXNlclBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0KLSAgICAgICAgc2VydmljZS5lbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVzZXJQaGFzZS5nZXRIYW5kbGVyQ291bnQoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uLmRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uRW5nYWdlT3BlcmF0aW9uRGlzZW5nYWdlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gY29uZmlnLmdldE1vZHVsZSgidGVzdE1vZHVsZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZSk7Ci0gICAgICAgIFBoYXNlIHBoYXNlOwotICAgICAgICBQaGFzZSB1c2VyUGhhc2U7Ci0gICAgICAgIExpc3QgZ2xvYmFsaW5mbG93ID0gY29uZmlnLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdsb2JhbGluZmxvdyk7Ci0gICAgICAgIHBoYXNlID0gKFBoYXNlKSBnbG9iYWxpbmZsb3cuZ2V0KDMpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBoYXNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBoYXNlLmdldEhhbmRsZXJDb3VudCgpLCAwKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24gPSBzZXJ2aWNlLmdldE9wZXJhdGlvbihvcE5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbik7Ci0gICAgICAgIHVzZXJQaGFzZSA9IChQaGFzZSkgb3BlcmF0aW9uLmdldFJlbWFpbmluZ1BoYXNlc0luRmxvdygpLmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh1c2VyUGhhc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgb3BlcmF0aW9uLmVuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICAgICAgb3BlcmF0aW9uLmRpc2VuZ2FnZU1vZHVsZShtb2R1bGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGhhc2UuZ2V0SGFuZGxlckNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdXNlclBoYXNlLmdldEhhbmRsZXJDb3VudCgpKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZUxvYWRpbmdUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlTG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5ZmYzNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxlTG9hZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIE1vZHVsZUxvYWRpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVMb2FkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXBvUm9vdCA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9yZXBvc2l0b3JpZXMvbW9kdWxlTG9hZFRlc3QiOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0ocmVwb1Jvb3QgLCByZXBvUm9vdCArICIvYXhpczIueG1sIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnb3QgdGhlIGV4cGxvZGVkIG1vZHVsZSBpbiB0aGUgcmVwby9tb2R1bGVzIGRpcgotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGFjLmdldE1vZHVsZSgiZXhwbG9kZWRNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZyltb2R1bGUuZ2V0UGFyYW1ldGVyKCJjb2xvciIpLmdldFZhbHVlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZ3JlZW4iLCB2YWwpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnb3QgdGhlIG1vZHVsZSB0aGF0J3Mgb3V0c2lkZSB0aGUgcmVwbywgYnV0IGluIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgbW9kdWxlID0gYWMuZ2V0TW9kdWxlKCJjbGFzc3BhdGhNb2R1bGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRGlkbid0IGZpbmQgY2xhc3NwYXRoIG1vZHVsZSEiLCBtb2R1bGUpOwotICAgICAgICB2YWwgPSAoU3RyaW5nKW1vZHVsZS5nZXRQYXJhbWV0ZXIoImNvbG9yIikuZ2V0VmFsdWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJhbWV0ZXIgd2Fzbid0IHNldCBjb3JyZWN0bHkiLCAiYmx1ZSIsIHZhbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L01vZHVsZXZlcnNpb25UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxldmVyc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiZDc0OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvTW9kdWxldmVyc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxldmVyc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXV0TW9kdWxlVmVyc2lvbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKwotICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVWZXJzaW9uL1Rlc3QxL2F4aXMyLnhtbCI7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCBmaWxlbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFjLmdldERlZmF1bHRNb2R1bGVWZXJzaW9uKCJhYmMiKSwgIjEuMjMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFjLmdldERlZmF1bHRNb2R1bGVWZXJzaW9uKCJmb28iKSwgIjAuODkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlRGVmYXVsdE1vZHVsZVZlcnNpb25zKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTEuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTEiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTEpOwotCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMiA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTIuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTItMC45NCIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMik7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUzID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMy5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMi0wLjk1Iik7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmFkZE1vZHVsZShtb2R1bGUzKTsKLQotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZTQgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICBtb2R1bGU0LnNldEFyY2hpdmVOYW1lKCJNb2R1bGUyLTAuOTMiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTQpOwotCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlNSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTUuc2V0QXJjaGl2ZU5hbWUoInRlc3RNb2R1bGUtMS45MyIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlNSk7Ci0KLSAgICAgICAgVXRpbHMuY2FsY3VsYXRlRGVmYXVsdE1vZHVsZVZlcnNpb24oYXhpc0NvbmZpZ3VyYXRpb24uZ2V0TW9kdWxlcygpLCBheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUxLCBheGlzQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0TW9kdWxlKCJNb2R1bGUxIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlMywgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0RGVmYXVsdE1vZHVsZSgiTW9kdWxlMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZTUsIGF4aXNDb25maWd1cmF0aW9uLmdldERlZmF1bHRNb2R1bGUoInRlc3RNb2R1bGUiKSk7Ci0gICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmVuZ2FnZU1vZHVsZSgiTW9kdWxlMiIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5lbmdhZ2VNb2R1bGUoIk1vZHVsZTEiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uZW5nYWdlTW9kdWxlKCJ0ZXN0TW9kdWxlIiwgIjEuOTMiKTsKLQotICAgICAgICBJdGVyYXRvciBlbmdhZ2VNb2R1bGVzID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0RW5nYWdlZE1vZHVsZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBib29sZWFuIGZvdW5kMSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kMiA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kMyA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoZW5nYWdlTW9kdWxlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKChBeGlzTW9kdWxlKWVuZ2FnZU1vZHVsZXMubmV4dCgpKS5nZXRBcmNoaXZlTmFtZSgpOwotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJNb2R1bGUyLTAuOTUiKSkgewotICAgICAgICAgICAgICAgIGZvdW5kMSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIk1vZHVsZTEiKSkgewotICAgICAgICAgICAgICAgIGZvdW5kMiA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoInRlc3RNb2R1bGUtMS45MyIpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZm91bmQxKSB7Ci0gICAgICAgICAgICBmYWlsKCJEaWRuJ3QgZmluZCBNb2R1bGUyLTAuOTUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kMikgewotICAgICAgICAgICAgZmFpbCgiRGlkbid0IGZpbmQgTW9kdWxlMSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQzKSB7Ci0gICAgICAgICAgICBmYWlsKCJEaWRuJ3QgZmluZCB0ZXN0TW9kdWxlLTEuOTMiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlV2l0aFNOQVBTSE9UKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTEuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTEiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTEpOwotCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMiA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTIuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTEtU05BUFNIT1QiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTIpOwotCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMyA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTMuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTEtMC45NSIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMyk7Ci0gICAgICAgIFV0aWxzLmNhbGN1bGF0ZURlZmF1bHRNb2R1bGVWZXJzaW9uKGF4aXNDb25maWd1cmF0aW9uLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZ3VyYXRpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlMiwgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0RGVmYXVsdE1vZHVsZSgiTW9kdWxlMSIpKTsKLSAgICB9Ci0KLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlV2l0aFNOQVBTSE9UMigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZTEgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICBtb2R1bGUxLnNldEFyY2hpdmVOYW1lKCJNb2R1bGUxLWEiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTEpOwotCi0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlMiA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgIG1vZHVsZTIuc2V0QXJjaGl2ZU5hbWUoIk1vZHVsZTEtYS1TTkFQU0hPVCIpOwotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRNb2R1bGUobW9kdWxlMik7Ci0KLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUzID0gbmV3IEF4aXNNb2R1bGUoKTsKLSAgICAgICAgbW9kdWxlMy5zZXRBcmNoaXZlTmFtZSgiTW9kdWxlMS1hLTAuOTUiKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uYWRkTW9kdWxlKG1vZHVsZTMpOwotICAgICAgICBVdGlscy5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGVzKCksIGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgVXRpbHMuY2FsY3VsYXRlRGVmYXVsdE1vZHVsZVZlcnNpb24oYXhpc0NvbmZpZ3VyYXRpb24uZ2V0TW9kdWxlcygpLCBheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUyLCBheGlzQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0TW9kdWxlKCJNb2R1bGUxLWEiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L09wZXJhdGlvbkV4Y2x1ZGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvT3BlcmF0aW9uRXhjbHVkZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0NDM3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvT3BlcmF0aW9uRXhjbHVkZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkV4Y2x1ZGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEF4aXNDb25maWd1cmF0aW9uIGVyOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVPcGVyYXRpb25zKCkgdGhyb3dzIFBoYXNlRXhjZXB0aW9uLAotICAgICAgICAgICAgRGVwbG95bWVudEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEF4aXNGYXVsdCwKLSAgICAgICAgICAgIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9leGN1bGVSZXBvIjsKLSAgICAgICAgZXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlbmFtZSwgZmlsZW5hbWUgKyAiL2F4aXMyLnhtbCIpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBlci5nZXRTZXJ2aWNlKCJleGNsdWRlU2VydmljZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgiZGVkdWMiKSkpOwotICAgICAgICBhc3NlcnROdWxsKHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZSgiYWRkIikpKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L09wZXJhdGlvbk1vZHVsZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9PcGVyYXRpb25Nb2R1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDI2ZDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L09wZXJhdGlvbk1vZHVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbk1vZHVsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgLyoqCi0gICAgICogQ29uZmlybSB0aGF0IGFuIG9wZXJhdGlvbiBtb2R1bGUgYSkgZG9lc24ndCBjYXVzZSBhbnkgZGVwbG95bWVudCBwcm9ibGVtcywgYW5kCi0gICAgICogYikgY29ycmVjdGx5IGNvbmZpZ3VyZXMgdGhlIEF4aXNPcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uTW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9Ci0gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzL2RlcGxveW1lbnQvQXhpc01lc3NhZ2VUZXN0UmVwbyIpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKCJNZXNzYWdldGVzdFNlcnZpY2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGRuJ3QgZmluZCBzZXJ2aWNlIiwgc2VydmljZSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvU3RyaW5nIikpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDb3VsZG4ndCBmaW5kIG9wZXJhdGlvbiIsIG9wZXJhdGlvbik7Ci0gICAgICAgIEFycmF5TGlzdCBtb2R1bGVSZWZzID0gb3BlcmF0aW9uLmdldE1vZHVsZVJlZnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyAjIG9mIG1vZHVsZXMiLCAxLCBtb2R1bGVSZWZzLnNpemUoKSk7Ci0gICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZyltb2R1bGVSZWZzLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBtb2R1bGUgbmFtZSIsICJtb2R1bGUxIiwgbW9kdWxlTmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NPQVBSb2xlQ29uZmlndXJhdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TT0FQUm9sZUNvbmZpZ3VyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjgyYjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NPQVBSb2xlQ29uZmlndXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuUm9sZVBsYXllcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247DQotDQotcHVibGljIGNsYXNzIFNPQVBSb2xlQ29uZmlndXJhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbVNPQVBSb2xlQ29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb257DQotCQlTdHJpbmcgZmlsZW5hbWUgPQ0KLSAgICAgICAgICAgIEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zb2Fwcm9sZWNvbmZpZ3VyYXRpb24iOw0KLQkJQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQ0KLSAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lICwgZmlsZW5hbWUgKyAiL2F4aXMyLnhtbCIpDQotICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotCQlSb2xlUGxheWVyIHJvbGVQbGF5ZXIgPSAoUm9sZVBsYXllcilheGlzQ29uZmlnLmdldFBhcmFtZXRlclZhbHVlKENvbnN0YW50cy5TT0FQX1JPTEVfUExBWUVSX1BBUkFNRVRFUik7DQotCQlhc3NlcnROb3ROdWxsKHJvbGVQbGF5ZXIpOw0KLQkJYXNzZXJ0RmFsc2Uocm9sZVBsYXllci5pc1VsdGltYXRlRGVzdGluYXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoMSwgcm9sZVBsYXllci5nZXRSb2xlcygpLnNpemUoKSk7DQotCQlhc3NlcnRFcXVhbHMoImh0dHA6Ly9teS9jdXN0b20vcm9sZSIsIHJvbGVQbGF5ZXIuZ2V0Um9sZXMoKS5nZXQoMCkpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TYW1lU2VydmljZUFkZGluZ1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TYW1lU2VydmljZUFkZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMjhkZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU2FtZVNlcnZpY2VBZGRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoaXMgdGVzdCBjb25maXJtcyB0aGF0IHdlIGJlaGF2ZSBjb3JyZWN0bHkgd2hlbiBhZGRpbmcgU2VydmljZUdyb3VwcyB3aXRoIGR1cGxpY2F0ZQotICogU2VydmljZXMgdG8gb25lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRlcGxveWVkLgotICovCi1wdWJsaWMgY2xhc3MgU2FtZVNlcnZpY2VBZGRpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIEF4aXNDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlR3JvdXAoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgZmluYWwgU3RyaW5nIFNFUlZJQ0UxID0gInNlcmV2aWNlMSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBTRVJWSUNFMiA9ICJzZXJldmljZTIiOwotICAgICAgICBmaW5hbCBTdHJpbmcgU0VSVklDRTQgPSAic2VyZXZpY2U0IjsKLSAgICAgICAgZmluYWwgU3RyaW5nIFNFUlZJQ0VfR1JPVVAyID0gIlNlcnZpY2VHcm91cDIiOwotCi0gICAgICAgIGNvbmZpZyA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVFbXB0eUNvbmZpZ3VyYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBGaXJzdCBjcmVhdGUgYSBTZXJ2aWNlR3JvdXAgd2l0aCBTMSBhbmQgUzQKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwMSA9IG5ldyBBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAxLnNldFNlcnZpY2VHcm91cE5hbWUoIlNlcnZpY2VHcm91cDEiKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZTEgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgc2VydmljZTEuc2V0TmFtZShTRVJWSUNFMSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAxLmFkZFNlcnZpY2Uoc2VydmljZTEpOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2U0ID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2U0LnNldE5hbWUoU0VSVklDRTQpOwotICAgICAgICBheGlzU2VydmljZUdyb3VwMS5hZGRTZXJ2aWNlKHNlcnZpY2U0KTsKLSAgICAgICAgY29uZmlnLmFkZFNlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwMSk7Ci0KLSAgICAgICAgLy8gTm93IGNyZWF0ZSBhbm90aGVyIFNlcnZpY2VHcm91cCB3aXRoIFMyIGFuZCBTNAotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAyID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgYXhpc1NlcnZpY2VHcm91cDIuc2V0U2VydmljZUdyb3VwTmFtZShTRVJWSUNFX0dST1VQMik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UyID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2UyLnNldE5hbWUoU0VSVklDRTIpOwotICAgICAgICBheGlzU2VydmljZUdyb3VwMi5hZGRTZXJ2aWNlKHNlcnZpY2UyKTsKLQotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlMjQgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgc2VydmljZTI0LnNldE5hbWUoU0VSVklDRTQpOwotICAgICAgICBheGlzU2VydmljZUdyb3VwMi5hZGRTZXJ2aWNlKHNlcnZpY2UyNCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBmYWlsIQotICAgICAgICAgICAgY29uZmlnLmFkZFNlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwMik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgZXhwZWN0ZWQgYmVjYXVzZSBTNCB3YXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbiBhbHJlYWR5IGV4aXN0aW5nIHNlcnZpY2UKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkNhdWdodCB0aGUgd3JvbmcgZmF1bHQhIiwgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKS5pbmRleE9mKFNFUlZJQ0U0KSA+IC0xKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKFNFUlZJQ0UxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2VydmljZSAxIHdhc24ndCBkZXBsb3llZCEiLCBzZXJ2aWNlKTsKLSAgICAgICAgc2VydmljZSA9IGNvbmZpZy5nZXRTZXJ2aWNlKFNFUlZJQ0U0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2VydmljZSA0IHdhc24ndCBkZXBsb3llZCEiLCBzZXJ2aWNlKTsKLQotICAgICAgICBzZXJ2aWNlID0gY29uZmlnLmdldFNlcnZpY2UoU0VSVklDRTIpOwotICAgICAgICBhc3NlcnROdWxsKCJTZXJ2aWNlIDIgd2Fzbid0IHN1cHBvc2VkIHRvIGJlIGRlcGxveWVkISIsIHNlcnZpY2UpOwotICAgICAgICBhc3NlcnROdWxsKCJTZXJ2aWNlR3JvdXAyIHdhc24ndCBzdXBwb3NlZCB0byBiZSBkZXBsb3llZCEiLAotICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRTZXJ2aWNlR3JvdXAoInNlcnZpY2UyIikpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VHcm91cFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TZXJ2aWNlR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzY5MWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NlcnZpY2VHcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUdyb3VwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBBeGlzQ29uZmlndXJhdGlvbiBhcjsKLSAgICBTdHJpbmcgcmVwbyA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9zZXJ2aWNlR3JvdXBSZXBvIjsKLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShyZXBvLCByZXBvICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlR3JvdXAoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZ2QgPSBhci5nZXRTZXJ2aWNlR3JvdXAoInNlcnZpY2VHcm91cCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNnZCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UxID0gYXIuZ2V0U2VydmljZSgic2VydmljZTEiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMSk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UyID0gYXIuZ2V0U2VydmljZSgic2VydmljZTIiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlMik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU3BlYWtpbmdIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU3BlYWtpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGZhMjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L1NwZWFraW5nSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNwZWFraW5nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwZWFraW5nSGFuZGxlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFNwZWFraW5nSGFuZGxlcigpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlID0gIkhpIEkgYW10ZXN0aW5nICI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvU3lzdGVtUGhhc2VzcmVtb3ZlZFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TeXN0ZW1QaGFzZXNyZW1vdmVkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M4OTUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVwbG95bWVudC9TeXN0ZW1QaGFzZXNyZW1vdmVkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFN5c3RlbVBoYXNlc3JlbW92ZWRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFN5c3RlbVBoYXNlc3JlbW92ZWRUZXN0LmNsYXNzKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZU9yZGVyY2hhZ2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAiLi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1N5c3RlbVBoYXNlUmVtb3ZlIjsKLSAgICAgICAgICAgIGVyID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKGZpbGVuYW1lLCBmaWxlbmFtZSArICIvYXhpczIueG1sIikKLSAgICAgICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBmYWlsKAotICAgICAgICAgICAgICAgICAgICAidGhpcyBtdXN0IGZhaWxlZCBncmFjZWZ1bGx5IHdpdGggRGVwbG95bWVudEV4Y2VwdGlvbiBcIkludmFsaWQgU3lzdGVtIHByZWRlZmluZWQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucGhhc2VzICwgcGhhc2Ugb3JkZXIgZG9lcyBub3RcIiArXG4gc3VwcG9ydFxcbiByZWNoZWNrIGF4aXMyLnhtbFwiIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbyhlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvZGVwbG95ZXJzL0N1c3RvbURlcGxveWVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvZGVwbG95ZXJzL0N1c3RvbURlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDc0MmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L2RlcGxveWVycy9DdXN0b21EZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LmRlcGxveWVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5EZXBsb3ltZW50RmlsZURhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBBIGN1c3RvbSBEZXBsb3llciBpbnN0YW5jZSBmb3IgdGVzdGluZy4gIFRoaXMgY29vcmRpbmF0ZXMgd2l0aCB0aGUgQ3VzdG9tRGVwbG95ZXJUZXN0IGFuZAotICogdGhlIEN1c3RvbURlcGxveWVyUmVwby8gcmVwb3NpdG9yeSBpbiB0ZXN0LXJlc291cmNlcy8uICBJdCdzIGdvaW5nIHRvIGJlIHNldCB1cCB0byBkZXBsb3kKLSAqICJzdmMiIGZpbGVzLCBib3RoIGluIHRoZSBzZXJ2aWNlcy8gZGlyZWN0b3J5IGFuZCBpbiB0aGUgd2lkZ2V0cy8gZGlyZWN0b3J5LiAgQWZ0ZXIgdGhlCi0gKiBjb25maWcgaXMgY29tcGxldGUsIHdlIHNob3VsZCBoYXZlIDIgZGVwbG95ZWQgaXRlbXMsIGFuZCBzaG91bGQgaGF2ZSBmb3VuZCBib3RoICJNYXJ5IiBhbmQKLSAqICJHZW9yZ2UiIChzZWUgdGhlIHJlcG8gZm9yIHRlc3QgZGF0YSkuICBXZSB1c2Ugc3RhdGljIGZpZWxkcyB0byBrZWVwIGFsbCB0aGlzIGluZm9ybWF0aW9uCi0gKiBpbiBhIHdheSB0aGF0IHRoZSB0ZXN0IGNhbiBhY2Nlc3MgaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21EZXBsb3llciBpbXBsZW1lbnRzIERlcGxveWVyIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDdXN0b21EZXBsb3llci5jbGFzcyk7Ci0KLSAgICAvKiogSGFzIGluaXQoKSBiZWVuIGNhbGxlZD8gKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5pdENhbGxlZDsKLSAgICAvKiogVGhpcyBpcyBzZXQgdG8gdGhlIGxhc3QgYXJndW1lbnQgdG8gc2V0RGlyZWN0b3J5KCkgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3Rvcnk7Ci0gICAgLyoqIFRoaXMgaXMgc2V0IHRvIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHNldEV4dGVuc2lvbigpICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uOwotICAgIC8qKiBUaGUgY291bnQgb2YgZGVwbG95ZWQgaXRlbXMgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBkZXBsb3llZEl0ZW1zOwotICAgIC8qKiBTZXQgdG8gdHJ1ZSBpZiAiR2VvcmdlIiBoYXMgYmVlbiBkZXBsb3llZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZW9yZ2VEZXBsb3llZDsKLSAgICAvKiogU2V0IHRvIHRydWUgaWYgIk1hcnkiIGhhcyBiZWVuIGRlcGxveWVkICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIG1hcnlEZXBsb3llZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUUgPSAiY3VzdG9tRGVwbG95ZXJQYXJhbSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVkFMID0gImN1c3RvbURlcGxveWVyIHBhcmFtZXRlciB2YWx1ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBEZXBsb3llcgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0N0eCBvdXIgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBpbml0Q2FsbGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBTZXQgYSBwcm9wZXJ0eSBvbiB0aGUgQXhpc0NvbmZpZyBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBlbmQgdXAgd2l0aCB0aGUgcmlnaHQgb25lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRQYXJhbWV0ZXIoUEFSQU1fTkFNRSwgUEFSQU1fVkFMKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gVHdvIGNvbW1lbnRzIC0gMSkgd2h5IHRoZSBoZWNrIGRvZXMgYWRkUGFyYW1ldGVyIHRocm93IEF4aXNGYXVsdD8KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIDIpIHdoeSBkb2Vzbid0IGluaXQoKSB0aHJvdyBBeGlzRmF1bHQ/Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGEgZmlsZSBhbmQgYWRkIGl0IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVwbG95bWVudEZpbGVEYXRhIHRoZSBEZXBsb3ltZW50RmlsZURhdGEgb2JqZWN0IHRvIGRlcGxveQotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBsb2cuaW5mbygiRGVwbG95aW5nIC0gIiArIGRlcGxveW1lbnRGaWxlRGF0YS5nZXROYW1lKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICBpbnQgeD0gZmlzLmF2YWlsYWJsZSgpOwotICAgICAgICAgICAgYnl0ZSBiW109IG5ldyBieXRlW3hdOwotICAgICAgICAgICAgZmlzLnJlYWQoYik7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYik7Ci0gICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCJHZW9yZ2UiKSA+IC0xKSBnZW9yZ2VEZXBsb3llZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoY29udGVudC5pbmRleE9mKCJNYXJ5IikgPiAtMSkgbWFyeURlcGxveWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGRlcGxveWVkSXRlbXMrKzsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBkaXJlY3RvcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBkaXJlY3RvcnkgZGlyZWN0b3J5IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotICAgICAgICBDdXN0b21EZXBsb3llci5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBleHRlbnNpb24gdG8gbG9vayBmb3IgVE9ETzogU3VwcG9ydCBtdWx0aXBsZSBleHRlbnNpb25zPwotICAgICAqCi0gICAgICogQHBhcmFtIGV4dGVuc2lvbiB0aGUgZmlsZSBleHRlbnNpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRGVwbG95ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvbikgewotICAgICAgICBDdXN0b21EZXBsb3llci5leHRlbnNpb24gPSBleHRlbnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGEgZ2l2ZW4gZmlsZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgbmFtZSBvZiBpdGVtIHRvIHJlbW92ZQotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bkRlcGxveShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVW5kZXBsb3kKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9CZWFuRXhjbHVkZUluZm9UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9CZWFuRXhjbHVkZUluZm9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjRhNTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvQmVhbkV4Y2x1ZGVJbmZvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgQmVhbkV4Y2x1ZGVJbmZvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0V4Y2x1ZGVkUHJvcGVydHkoKXsKLSAgICAgICAgQmVhbkV4Y2x1ZGVJbmZvIGJlYW5FeGNsdWRlSW5mbyA9IG5ldyBCZWFuRXhjbHVkZUluZm8oIltBLXpdKlN0cmluZ3xEYXlQaG9uZVRUWSIsIkRheVBob25lVFRZU3RyaW5nIik7Ci0gICAgICAgIGFzc2VydFRydWUoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiRGV0YWlsc1N0cmluZyIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiRGF5UGhvbmVUVFlTdHJpbmciKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJlYW5FeGNsdWRlSW5mby5pc0V4Y2x1ZGVkUHJvcGVydHkoIkVsZW1lbnREZXRpbHMiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXBsb3ltZW50L3V0aWwvRXhjbHVkZUluZm9UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9FeGNsdWRlSW5mb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3MzdhZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2RlcGxveW1lbnQvdXRpbC9FeGNsdWRlSW5mb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEV4Y2x1ZGVJbmZvVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcygpewotICAgICAgICBFeGNsdWRlSW5mbyBleGNsdWRlSW5mbyA9IG5ldyBFeGNsdWRlSW5mbygpOwotICAgICAgICBleGNsdWRlSW5mby5wdXRCZWFuSW5mbygib3JnLmtwLmFudWhhay5jZHIudGVzdC5bQS16XSoiLG5ldyBCZWFuRXhjbHVkZUluZm8oIltBLXpdKkJvb2wiLCJpc1tBLXpdKiIpKTsKLSAgICAgICAgZXhjbHVkZUluZm8ucHV0QmVhbkluZm8oIm9yZy5rcC5hbnVoYWsuY2RyLnR5cGVzLltBLXpdKiIsbmV3IEJlYW5FeGNsdWRlSW5mbygiW0Etel0qU3RyaW5nIixudWxsKSk7Ci0gICAgICAgIGV4Y2x1ZGVJbmZvLnB1dEJlYW5JbmZvKCJvcmcua3AuYW51aGFrLm1ldGEuW0Etel0qIixuZXcgQmVhbkV4Y2x1ZGVJbmZvKCJbQS16XSoiLG51bGwpKTsKLQotICAgICAgICBCZWFuRXhjbHVkZUluZm8gYmVhbkV4Y2x1ZGVJbmZvID0gZXhjbHVkZUluZm8uZ2V0QmVhbkV4Y2x1ZGVJbmZvRm9yQ2xhc3MoIm9yZy5rcC5hbnVoYWsuY2RyLnRlc3QuVGVzdENsYXNzIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJlYW5FeGNsdWRlSW5mby5pc0V4Y2x1ZGVkUHJvcGVydHkoIlRlc3RQcm9wZXJ0eSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJUZXN0Qm9vbCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiaXNUZXN0Qm9vbCIpKTsKLQotICAgICAgICBiZWFuRXhjbHVkZUluZm8gPSBleGNsdWRlSW5mby5nZXRCZWFuRXhjbHVkZUluZm9Gb3JDbGFzcygib3JnLmtwLmFudWhhay5jZHIudHlwZXMuVGVzdENsYXNzIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJlYW5FeGNsdWRlSW5mby5pc0V4Y2x1ZGVkUHJvcGVydHkoIlRlc3RQcm9wZXJ0eSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJUZXN0U3RyaW5nIikpOwotICAgICAgICBhc3NlcnRGYWxzZShiZWFuRXhjbHVkZUluZm8uaXNFeGNsdWRlZFByb3BlcnR5KCJpc1Rlc3RCb29sIikpOwotCi0gICAgICAgIGJlYW5FeGNsdWRlSW5mbyA9IGV4Y2x1ZGVJbmZvLmdldEJlYW5FeGNsdWRlSW5mb0ZvckNsYXNzKCJvcmcua3AuYW51aGFrLm1ldGEuVGVzdENsYXNzIik7Ci0gICAgICAgIGFzc2VydFRydWUoYmVhbkV4Y2x1ZGVJbmZvLmlzRXhjbHVkZWRQcm9wZXJ0eSgiVGVzdFByb3BlcnR5IikpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzU2VydmljZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vQXhpc1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzdiZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9BeGlzU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUUgPSAiQ3VzdG9tUGFyYW1ldGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBQQVJBTV9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQotICAgIGNsYXNzIE15T2JzZXJ2ZXIgaW1wbGVtZW50cyBQYXJhbWV0ZXJPYnNlcnZlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGdvdEl0ID0gZmFsc2U7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGFyYW1ldGVyQ2hhbmdlZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoUEFSQU1fTkFNRS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIHZhbHVlIiwgUEFSQU1fVkFMVUUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBnb3RJdCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZ0Jhc2ljKCkgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wMSA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFFOYW1lIG9wTmFtZSA9IG5ldyBRTmFtZSgiZm9vIik7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHJlZ2lzdGVyaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiBtdWx0aXBsZSB0aW1lcwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG9wTmFtZSwgb3AxKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDEsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG9wTmFtZSwgb3AxKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDEsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG9wTmFtZSwgb3AxKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDEsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nT3ZlcmxvYWRpbmcoKSB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3AxID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcDIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbigpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wMyA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFFOYW1lIG9wTmFtZSA9IG5ldyBRTmFtZSgiZm9vIik7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHJlZ2lzdGVyaW5nIGRpZmZlcmVudCBvcGVyYXRpb25zIHVuZGVyIHRoZSBzYW1lIG9wTmFtZQotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG9wTmFtZSwgb3AxKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhvcDEsIHNlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG9wTmFtZSkpOwotICAgICAgICAKLSAgICAgICAgc2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKG9wTmFtZSwgb3AyKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBzZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShvcE5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIHNlcnZpY2UuYWRkTWVzc2FnZUVsZW1lbnRRTmFtZVRvT3BlcmF0aW9uTWFwcGluZyhvcE5hbWUsIG9wMyk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgc2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUob3BOYW1lKSk7ICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJPYnNlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0KLSAgICAgICAgTXlPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBNeU9ic2VydmVyKCk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyT2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihQQVJBTV9OQU1FLCBQQVJBTV9WQUxVRSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkRpZG4ndCBnZXQgbm90aWZpY2F0aW9uIiwgb2JzZXJ2ZXIuZ290SXQpOwotICAgIH0KLSAgICAgCi0gICAgLyoqCi0gICAgICogU2ltcGxlIHRlc3QgdG8gZW5zdXJlIHRoYXQgUGFyYW1ldGVycyBtYXJrZWQgYXMgVHJhbnNpZW50Ci0gICAgICogYXJlIG5vdCBwZXJzaXN0ZWQuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50UGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgCi0gICAgICAgIFBhcmFtZXRlciBwMSA9IG5ldyBQYXJhbWV0ZXIoIk5PUk1BTCIsICJIZWxsbyBXb3JsZCIpOwotICAgICAgICBQYXJhbWV0ZXIgcDIgPSBuZXcgUGFyYW1ldGVyKCJUUkFOU0lFTlQiLCAiSGVsbG8gV29ybGQiKTsKLSAgICAgICAgcDIuc2V0VHJhbnNpZW50KHRydWUpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIGhlYWRlciBpbiBhbiBvYmplY3Qgb3V0cHV0IGlzIDQgYnl0ZXMKLSAgICAgICAgZmluYWwgaW50IEhFQURFUl9MRU5HVEggPSA0OwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbm9uLXRyYW5zaWVudCB2YWx1ZSBpcyB3cml0dGVuCi0gICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICBwMS53cml0ZUV4dGVybmFsKG9vcyk7Ci0gICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICBvb3MuY2xvc2UoKTsKLSAgICAgICAgaW50IGxlbmd0aDEgPSBiYW9zLnRvQnl0ZUFycmF5KCkubGVuZ3RoOwotICAgICAgICBhc3NlcnRUcnVlKCBsZW5ndGgxID4gSEVBREVSX0xFTkdUSCk7Ci0gICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRyYW5zaWVudCB2YWx1ZSBpcyBub3Qgd3JpdHRlbgotICAgICAgICBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgICAgICBwMi53cml0ZUV4dGVybmFsKG9vcyk7Ci0gICAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgICBvb3MuY2xvc2UoKTsKLSAgICAgICAgaW50IGxlbmd0aDIgPSBiYW9zLnRvQnl0ZUFycmF5KCkubGVuZ3RoOwotICAgICAgICBhc3NlcnRUcnVlKCBsZW5ndGgyIDw9IEhFQURFUl9MRU5HVEgpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNpbXBsZSB0ZXN0IHRvIG1ha2UgdmVyaWZ5IHRoYXQgdGhlIE1lc3NhZ2VDb250ZXh0IGxpc3RlbmVyCi0gICAgICogaXMgaW52b2tlZCB3aGVuIGEgU2VydmljZUNvbnRleHQgaXMgYXR0YWNoZWQgdG8gdGhlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUNvbnRleHRMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYWMpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIGEgZHVtbXkgQXhpc1NlcnZpY2UKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlLnNldE5hbWUoImR1bW15Iik7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZUdyb3VwIGFzZyA9IG5ldyBBeGlzU2VydmljZUdyb3VwKCk7Ci0gICAgICAgIGFzZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAKLSAgICAgICAgLy8gQXR0YWNoIGEgU2VydmljZUNvbnRleHRMaXN0ZW5lcgotICAgICAgICAvLyBUaGUgU2VydmljZUNvbnRleHRMaXN0ZW5lciB3aWxsIGNvcHkgc2FtcGxlIGluZm9ybWF0aW9uIGZyb20gCi0gICAgICAgIC8vIHRoZSBTZXJ2aWNlQ29udGV4dCBvbnRvIHRoZSBNZXNzYWdlQ29udGV4dAotICAgICAgICBzZXJ2aWNlLmFkZE1lc3NhZ2VDb250ZXh0TGlzdGVuZXIobmV3IE15TWVzc2FnZUNvbnRleHRMaXN0ZW5lcigpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIENyZWF0ZSBhIER1bW15IFNlcnZpY2VDb250ZXh0Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gbmV3IFNlcnZpY2VHcm91cENvbnRleHQoY2MsIGFzZyk7Ci0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjID0gc2djLmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotICAgICAgICBzYy5zZXRQcm9wZXJ0eSgiU0VSVklDRV9QUk9QRVJUWSIsICJTVUNDRVNTRlVMIik7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgYSBNZXNzYWdlQ29udGV4dAotICAgICAgICBNZXNzYWdlQ29udGV4dCBtYyA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAKLSAgICAgICAgLy8gQXR0YWNoIHRoZSBTZXJ2aWNlQ29udGV4dCBhbmQgTWVzc2FnZUNvbnRleHQuCi0gICAgICAgIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBNeVNlcnZpY2VDb250ZXh0TGlzdGVuZXIuYXR0YWNoRXZlbnQKLSAgICAgICAgbWMuc2V0U2VydmljZUNvbnRleHQoc2MpOwotICAgICAgICAKLSAgICAgICAgLy8gVmVyaWZ5IHN1Y2Nlc3MKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU1VDQ0VTU0ZVTCIuZXF1YWxzKG1jLmdldFByb3BlcnR5KCJNRVNTQUdFX1BST1BFUlRZIikpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2FtZXBsZSBNZXNzYWdlQ29udGV4dExpc3RlbmVyIHdoaWNoIHNldHMgYSBwcm9wZXJ0eSAKLSAgICAgKiBvbiB0aGUgTWVzc2FnZUNvbnRleHQgd2hlbiB0aGUgU2VyaXZjZUNvbnRleHQgaXMgYXR0YWNoZWQuCi0gICAgICovCi0gICAgY2xhc3MgTXlNZXNzYWdlQ29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgTWVzc2FnZUNvbnRleHRMaXN0ZW5lciB7Ci0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hFbnZlbG9wZUV2ZW50KE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGF0dGFjaFNlcnZpY2VDb250ZXh0RXZlbnQoU2VydmljZUNvbnRleHQgc2MsIE1lc3NhZ2VDb250ZXh0IG1jKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBzYy5nZXRQcm9wZXJ0eSgiU0VSVklDRV9QUk9QRVJUWSIpOwotICAgICAgICAgICAgbWMuc2V0UHJvcGVydHkoIk1FU1NBR0VfUFJPUEVSVFkiLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Nb2NrRmxvdy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9Nb2NrRmxvdy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDAyZWEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vTW9ja0Zsb3cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgTW9ja0Zsb3cgZXh0ZW5kcyBGbG93IHsKLSAgICBwdWJsaWMgTW9ja0Zsb3coU3RyaW5nIG1lc3NhZ2UsIGludCBsZW5ndGgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3BlYWtpbmdIYW5kbGVyMSBoMSA9IG5ldyBTcGVha2luZ0hhbmRsZXIxKAotICAgICAgICAgICAgICAgICAgICAiRXhlY3V0aW5nICIgKyBpICsgIiBpbnNpZGUgIiArIG1lc3NhZ2UpOwotICAgICAgICAgICAgVXRpbHMuYWRkSGFuZGxlcih0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhhc2VNZXRhZGF0YS5QSEFTRV9QT0xJQ1lfREVURVJNSU5BVElPTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyRWRpdFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUGFyYW1ldGVyRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzY2Y2Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJFZGl0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUoInRydWUiKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldE5hbWUoImVuYWJsZU1UT00iKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldFZhbHVlKCJ0cnVlIik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgc2VydmljZUdyb3VwID0gbmV3IEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgc2VydmljZUdyb3VwLnNldFNlcnZpY2VHcm91cE5hbWUoInRlc3RTZXJ2aWNlR3JvdXAiKTsKLSAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlLnNldE5hbWUoInNlcnZpY2UiKTsKLSAgICAgICAgc2VydmljZUdyb3VwLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIGF4aXNDb25maWcuYWRkU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgIHBhcmFtZXRlciA9IHNlcnZpY2VHcm91cC5nZXRQYXJhbWV0ZXIoImVuYWJsZU1UT00iKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldFZhbHVlKCJ0cnVlIik7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhMj0gc2VydmljZUdyb3VwLmdldFBhcmFtZXRlcigiZW5hYmxlTVRPTSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYTIuZ2V0VmFsdWUoKSwidHJ1ZSIpOwotICAgICAgICBQYXJhbWV0ZXIgdGVzdCA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgdGVzdC5zZXROYW1lKCJ0ZXN0Iik7Ci0gICAgICAgIHRlc3Quc2V0VmFsdWUoInRlc3QiKTsKLSAgICAgICAgc2VydmljZUdyb3VwLmFkZFBhcmFtZXRlcih0ZXN0KTsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBzZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyKCJ0ZXN0Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwYXJhLmdldFZhbHVlKCksInRlc3QiKTsKLSAgICAgICAgcGFyYS5zZXRWYWx1ZSgibmV3VmFsdWUiKTsKLSAgICAgICAgcGFyYSA9IHNlcnZpY2VHcm91cC5nZXRQYXJhbWV0ZXIoInRlc3QiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmEuZ2V0VmFsdWUoKSwibmV3VmFsdWUiKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUmVnaXN0cnlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1JlZ2lzdHJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjc2MTdlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUmVnaXN0cnlUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0KLSAgICBwdWJsaWMgUmVnaXN0cnlUZXN0KFN0cmluZyB0ZXN0TmFtZSkgewotICAgICAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlck1ldGFkYXRhKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobWQgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHRlc3RQYXJhbWV0ZUluQ2x1ZGUoaG1kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICB0ZXN0UGFyYW1ldGVJbkNsdWRlKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGUoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgibW9kdWxlMSIpOwotICAgICAgICBtb2R1bGUuc2V0UGFyZW50KGF4aXNDb25maWd1cmF0aW9uKTsKLSAgICAgICAgdGVzdFBhcmFtZXRlSW5DbHVkZShtb2R1bGUpOwotICAgICAgICB0ZXN0Rmxvd0luY2x1ZGVUZXN0KG1vZHVsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvbigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gbmV3IEluT3V0QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wIikpOwotICAgICAgICBvcC5zZXRQYXJlbnQoc2VydmljZSk7Ci0gICAgICAgIHRlc3RQYXJhbWV0ZUluQ2x1ZGUob3ApOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlSW5DbHVkZShQYXJhbWV0ZXJJbmNsdWRlIHBhcm1JbmNsdWRlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RyaW5nIGtleSA9ICJ2YWx1ZTEiOwotICAgICAgICBQYXJhbWV0ZXIgcCA9IG5ldyBQYXJhbWV0ZXIoa2V5LCAidmFsdWUyIik7Ci0gICAgICAgIHBhcm1JbmNsdWRlLmFkZFBhcmFtZXRlcihwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHAsIHBhcm1JbmNsdWRlLmdldFBhcmFtZXRlcihrZXkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rmxvd0luY2x1ZGVUZXN0KEF4aXNNb2R1bGUgZmxvd0luY2x1ZGUpIHsKLSAgICAgICAgRmxvdyBmbG93MSA9IG5ldyBGbG93KCk7Ci0gICAgICAgIEZsb3cgZmxvdzIgPSBuZXcgRmxvdygpOwotICAgICAgICBGbG93IGZsb3czID0gbmV3IEZsb3coKTsKLQotICAgICAgICBmbG93SW5jbHVkZS5zZXRJbkZsb3coZmxvdzEpOwotICAgICAgICBmbG93SW5jbHVkZS5zZXRGYXVsdEluRmxvdyhmbG93Mik7Ci0gICAgICAgIGZsb3dJbmNsdWRlLnNldE91dEZsb3coZmxvdzMpOwotICAgICAgICBhc3NlcnRTYW1lKGZsb3cxLCBmbG93SW5jbHVkZS5nZXRJbkZsb3coKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoZmxvdzIsIGZsb3dJbmNsdWRlLmdldEZhdWx0SW5GbG93KCkpOwotICAgICAgICBhc3NlcnRTYW1lKGZsb3czLCBmbG93SW5jbHVkZS5nZXRPdXRGbG93KCkpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZXJzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IG5ldyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBoYW5kbGVyLmluaXQobmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoaGFuZGxlci5nZXRQYXJhbWV0ZXIoImhlbGxvIikpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1NwZWFraW5nSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9TcGVha2luZ0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJhYTJlYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1NwZWFraW5nSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTcGVha2luZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBIYW5kbGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU3BlYWtpbmdIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgU3BlYWtpbmdIYW5kbGVyKCkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiSGkgSSBhbXRlc3RpbmcgIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cwotICAgICAgICAgICAgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1NwZWFraW5nSGFuZGxlcjEuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdIYW5kbGVyMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY1OGE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdIYW5kbGVyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTcGVha2luZ0hhbmRsZXIxIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIGltcGxlbWVudHMgSGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNwZWFraW5nSGFuZGxlcjEuY2xhc3MpOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIHB1YmxpYyBTcGVha2luZ0hhbmRsZXIxKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1NwZWFraW5nUHJvdmlkZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWFkYTVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vU3BlYWtpbmdQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNwZWFraW5nUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTcGVha2luZ1Byb3ZpZGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBTcGVha2luZ1Byb3ZpZGVyKCkgewotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gU3BlYWtpbmcgUHJvdmlkZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9WZXJzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmY2OTYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vVmVyc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSB0ZXN0VmVyc2lvblNlcXVlbmNlID0gewotICAgICAgICAiMC4xIiwKLSAgICAgICAgIjAuMiIsCi0gICAgICAgICIxLjAiLAotICAgICAgICAiMS4xLWJldGExIiwKLSAgICAgICAgIjEuMS1iZXRhMiIsCi0gICAgICAgICIxLjEtUkMxIiwKLSAgICAgICAgIjEuMS1SQzIiLAotICAgICAgICAiMS4xLVNOQVBTSE9UIiwKLSAgICAgICAgIjEuMSIsCi0gICAgICAgICIxLjEuMSIsCi0gICAgICAgICIxLjEuMiIsCi0gICAgICAgICIxLjIiLAotICAgICAgICAiU05BUFNIT1QiCi0gICAgfTsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2lnbihpbnQgdikgewotICAgICAgICBpZiAodiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIGlmICh2ID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkxPTA7IGkxPHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoOyBpMSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpMj0wOyBpMjx0ZXN0VmVyc2lvblNlcXVlbmNlLmxlbmd0aDsgaTIrKykgewotICAgICAgICAgICAgICAgIFZlcnNpb24gdjEgPSBuZXcgVmVyc2lvbih0ZXN0VmVyc2lvblNlcXVlbmNlW2kxXSk7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbiB2MiA9IG5ldyBWZXJzaW9uKHRlc3RWZXJzaW9uU2VxdWVuY2VbaTJdKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModjEgKyAiIHZzLiAiICsgdjIsIHNpZ24oaTEtaTIpLCBzaWduKHYxLmNvbXBhcmVUbyh2MikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0VmVyc2lvblNlcXVlbmNlW2ldLCBuZXcgVmVyc2lvbih0ZXN0VmVyc2lvblNlcXVlbmNlW2ldKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGkxPTA7IGkxPHRlc3RWZXJzaW9uU2VxdWVuY2UubGVuZ3RoOyBpMSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpMj0wOyBpMjx0ZXN0VmVyc2lvblNlcXVlbmNlLmxlbmd0aDsgaTIrKykgewotICAgICAgICAgICAgICAgIFZlcnNpb24gdjEgPSBuZXcgVmVyc2lvbih0ZXN0VmVyc2lvblNlcXVlbmNlW2kxXSk7Ci0gICAgICAgICAgICAgICAgVmVyc2lvbiB2MiA9IG5ldyBWZXJzaW9uKHRlc3RWZXJzaW9uU2VxdWVuY2VbaTJdKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModjEgKyAiIHZzLiAiICsgdjIsIGkxID09IGkyLCB2MS5lcXVhbHModjIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PEludGVnZXI+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTx0ZXN0VmVyc2lvblNlcXVlbmNlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWx1ZXMuYWRkKG5ldyBWZXJzaW9uKHRlc3RWZXJzaW9uU2VxdWVuY2VbaV0pLmhhc2hDb2RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGNvbGxpc2lvbiBmcmVxdWVuY3kgaXMgbGVzcyB0aGFuIDEwJQotICAgICAgICBhc3NlcnRUcnVlKHZhbHVlcy5zaXplKCkgPiB0ZXN0VmVyc2lvblNlcXVlbmNlLmxlbmd0aCo5LzEwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyQXR0YWNobWVudFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJBdHRhY2htZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTg1ZjgxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGVzY3JpcHRpb24vV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJBdHRhY2htZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXJBdHRhY2htZW50VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNobWVudCgpIHsKLSAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoInRlc3QtcmVzb3VyY2VzL3dzZGwvU3dhVGVzdC53c2RsIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdFJlc291Y2VGaWxlOiAiICsgdGVzdFJlc291cmNlRmlsZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0odGVzdFJlc291cmNlRmlsZSkpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBidWlsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIGZpbGU6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIFdTREwgOiAiICsgdGVzdFJlc291cmNlRmlsZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb24gIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMVG9BbGxTZXJ2aWNlc0J1aWxkZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExUb0FsbFNlcnZpY2VzQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4YmFjYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExUb0FsbFNlcnZpY2VzQnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRlc3RzIHRoZSBXU0RMMTFUb0FsbFNlcnZpY2VzQnVpbGRlciBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFdTRExUb0FsbFNlcnZpY2VzQnVpbGRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZXhwZWN0ZWRTZXJ2aWNlMTEgPSB7Ci0gICAgICAgICAgICAiRWNob1NlcnZpY2VQb3J0T25lIiwKLSAgICAgICAgICAgICJFY2hvU2VydmljZVBvcnRUd28iLAotICAgICAgICAgICAgIkVjaG9TZXJ2aWNlUG9ydFRocmVlIn07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gZXhwZWN0ZWRTZXJ2aWNlMjAgPSB7Ci0gICAgICAgICAgICAiZWNob1NlcnZpY2UxJGVjaG9TZXJ2aWNlU09BUEJpbmRpbmdfaHR0cCIsCi0gICAgICAgICAgICAiZWNob1NlcnZpY2UxJGVjaG9TZXJ2aWNlRW5kcG9pbnQyU09BUEJpbmRpbmdfaHR0cCIsCi0gICAgICAgICAgICAiZWNob1NlcnZpY2UyJGVjaG9TZXJ2aWNlU09BUEJpbmRpbmdfaHR0cCJ9OwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLSAgICBMaXN0ZW5lck1hbmFnZXIgbG07Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBsbSA9IG5ldyBMaXN0ZW5lck1hbmFnZXIoKTsKLSAgICAgICAgbG0uaW5pdChjb25maWdDb250ZXh0KTsKLSAgICAgICAgbG0uc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBjb25maWdDb250ZXh0LnRlcm1pbmF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1Jlc3VsdHMoTGlzdCBheGlzU2VydmljZXMsIFN0cmluZyBleHBlY3RlZFNlcnZpY2VbXSkgewotCi0gICAgICAgIEl0ZXJhdG9yIGFzaSA9IGF4aXNTZXJ2aWNlcy5pdGVyYXRvcigpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIHdoaWxlIChhc2kuaGFzTmV4dCgpICYmIGkgPCBleHBlY3RlZFNlcnZpY2UubGVuZ3RoKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBhcyA9IChBeGlzU2VydmljZSkgYXNpLm5leHQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXhpc1NlcnZpY2UgOiAiICsgYXMuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlIG5hbWUgaW4gQXhpc1NlcnZpY2UgTGlzdDogZXhwZWN0ZWQgIgotICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkU2VydmljZVtpXSArICIgYnV0IGZvdW5kICIgKyBhcy5nZXROYW1lKCkgKyAiLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXMuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VydmljZVtpXSk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V1NETDExdG9BbGxBeGlzU2VydmljZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VGaWxlID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LWNsYXNzZXMvd3NkbC9FY2hvU2VydmljZVdzZGwxMS53c2RsIik7Ci0gICAgICAgIEZpbGUgb3V0TG9jYXRpb24gPSBuZXcgRmlsZSgidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzIik7Ci0gICAgICAgIG91dExvY2F0aW9uLm1rZGlycygpOwotICAgICAgICBpZiAodGVzdFJlc291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKHRlc3RSZXNvdXJjZUZpbGUpKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZXMgPSBidWlsZGVyLnBvcHVsYXRlQWxsU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgZmlsZTogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBpbiBXU0RMIDogIiArIHRlc3RSZXNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrUmVzdWx0cyhheGlzU2VydmljZXMsIGV4cGVjdGVkU2VydmljZTExKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdTREwyMHRvQWxsQXhpc1NlcnZpY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdGVzdFJlc291cmNlRmlsZSA9IG5ldyBGaWxlKCJ0YXJnZXQvdGVzdC1jbGFzc2VzL3dzZGwvRWNob1NlcnZpY2VXc2RsMjAud3NkbCIpOwotICAgICAgICBGaWxlIG91dExvY2F0aW9uID0gbmV3IEZpbGUoInRhcmdldC90ZXN0LXJlc291cmNlcyIpOwotICAgICAgICBvdXRMb2NhdGlvbi5ta2RpcnMoKTsKLSAgICAgICAgaWYgKHRlc3RSZXNvdXJjZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIExpc3QgYXhpc1NlcnZpY2VzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDIwVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0UmVzb3VyY2VGaWxlKSk7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VzID0gYnVpbGRlci5wb3B1bGF0ZUFsbFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIGZpbGU6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgaW4gV1NETCA6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja1Jlc3VsdHMoYXhpc1NlcnZpY2VzLCBleHBlY3RlZFNlcnZpY2UyMCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExXcmFwcGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kZXNjcmlwdGlvbi9XU0RMV3JhcHBlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhMTAyMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rlc2NyaXB0aW9uL1dTRExXcmFwcGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuV1NETERlZmluaXRpb25XcmFwcGVyOw0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsNCi1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOw0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOw0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETExvY2F0b3I7DQotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV1NETFdyYXBwZXJUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfV1NETF9WRVJCT1NFX01PREVfS0VZID0gImphdmF4LndzZGwudmVyYm9zZSI7DQotDQotICAgIC8vcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWYgPSBudWxsOw0KLSAgICBwcml2YXRlIFdTRExMb2NhdG9yIGN1c3RvbVdTTEQ0SlJlc29sdmVyID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVVyaSA9IG51bGw7DQotDQotICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NmZyA9IG51bGw7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGF4aXMyeG1sID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsNCi0gICAgICAgICAgICAgICAgICAgICAgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9heGlzMl9hLnhtbCI7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIHdzZGwxID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgDQotICAgICAgICAgICAgICAgICAgICAgICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3dzZGwvYWN0aW9uVGVzdHMud3NkbCI7IA0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsMiA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArIA0KLSAgICAgICAgICAgICAgICAgICAgICAiL3RhcmdldC90ZXN0LXJlc291cmNlcy93c2RsL3Rlc3QxLndzZGwiOyANCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbDMgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXIgKyANCi0gICAgICAgICAgICAgICAgICAgICAgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvd3NkbC90ZXN0Mi53c2RsIjsgDQotDQotDQotDQotICAgIHB1YmxpYyBXU0RMV3JhcHBlclRlc3QoU3RyaW5nIG5hbWUpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLSAgICB9DQotDQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RXc2RsV3JhcHBlcigpIHsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotICAgICAgICAgICAgLy8gbG9hZCB0aGUgd3NkbA0KLSAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmMSA9IG51bGw7DQotDQotICAgICAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VGaWxlMSA9IG5ldyBGaWxlKHdzZGwxKTsNCi0NCi0gICAgICAgICAgICBpZiAodGVzdFJlc291cmNlRmlsZTEuZXhpc3RzKCkpIHsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV1NETCBmaWxlIDE6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlMS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgZGVmMSA9IHJlYWRJblRoZVdTRExGaWxlKG5ldyBGaWxlSW5wdXRTdHJlYW0odGVzdFJlc291cmNlRmlsZTEpKTsgDQotICAgICAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTEpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgaW4gV1NETCA6ICIgKyB0ZXN0UmVzb3VyY2VGaWxlMS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb246ICIgKyBlMS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGUxOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vd3NkbERlZiA9IGRlZjE7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigid3NkbERlZiAxID0gWyIpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHdzZGxEZWYpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJdIik7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsNCi0NCi0NCi0gICAgICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgICAgICAgICAvLyBzZXR1cCB0aGUgd3JhcHBlcg0KLSAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICAgICAgICAgIGF4aXNDZmcgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkNCi0gICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgYXhpczJ4bWwpDQotICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOw0KLQ0KLSAgICAgICAgICAgIFdTRExEZWZpbml0aW9uV3JhcHBlciBwYXNzdGhydSA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmMSwgdGVzdFJlc291cmNlRmlsZTEudG9VUkwoKSwgZmFsc2UpOw0KLQ0KLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmX3Bhc3N0aHJ1ID0gcGFzc3RocnUuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZWZfcGFzc3RocnVfc3RyID0gZGVmX3Bhc3N0aHJ1LnRvU3RyaW5nKCk7DQotICAgICAgICAgICAgUU5hbWUgZGVmX3Bhc3N0aHJ1X3FuID0gZGVmX3Bhc3N0aHJ1LmdldFFOYW1lKCk7DQotICAgICAgICAgICAgU3RyaW5nIGRlZl9wYXNzdGhydV9uYW1lc3BhY2UgPSBkZWZfcGFzc3RocnUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgVHlwZXMgZGVmX3Bhc3N0aHJ1X3R5cGVzID0gZGVmX3Bhc3N0aHJ1LmdldFR5cGVzKCk7DQotDQotICAgICAgICAgICAgV1NETERlZmluaXRpb25XcmFwcGVyIHNlcmlhbGl6ZSA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmMSwgdGVzdFJlc291cmNlRmlsZTEudG9VUkwoKSwgYXhpc0NmZyk7IA0KLQ0KLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmX3NlcmlhbGl6ZSA9IHNlcmlhbGl6ZS5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7DQotICAgICAgICAgICAgU3RyaW5nIGRlZl9zZXJpYWxpemVfc3RyID0gZGVmX3NlcmlhbGl6ZS50b1N0cmluZygpOw0KLSAgICAgICAgICAgIFFOYW1lIGRlZl9zZXJpYWxpemVfcW4gPSBkZWZfc2VyaWFsaXplLmdldFFOYW1lKCk7DQotICAgICAgICAgICAgU3RyaW5nIGRlZl9zZXJpYWxpemVfbmFtZXNwYWNlID0gZGVmX3NlcmlhbGl6ZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0gICAgICAgICAgICBUeXBlcyBkZWZfc2VyaWFsaXplX3R5cGVzID0gZGVmX3NlcmlhbGl6ZS5nZXRUeXBlcygpOw0KLQ0KLSAgICAgICAgICAgIFdTRExEZWZpbml0aW9uV3JhcHBlciByZWxvYWQgPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZjEsIHRlc3RSZXNvdXJjZUZpbGUxLnRvVVJMKCksIDIpOyANCi0NCi0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZl9yZWxvYWQgPSByZWxvYWQuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZWZfcmVsb2FkX3N0ciA9IGRlZl9yZWxvYWQudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICBRTmFtZSBkZWZfcmVsb2FkX3FuID0gZGVmX3JlbG9hZC5nZXRRTmFtZSgpOw0KLSAgICAgICAgICAgIFN0cmluZyBkZWZfcmVsb2FkX25hbWVzcGFjZSA9IGRlZl9yZWxvYWQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotICAgICAgICAgICAgVHlwZXMgZGVmX3JlbG9hZF90eXBlcyA9IGRlZl9yZWxvYWQuZ2V0VHlwZXMoKTsNCi0NCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXh4KSB7DQotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEV4Y2VwdGlvbiAiICsgZXh4KTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBwcml2YXRlIERlZmluaXRpb24gcmVhZEluVGhlV1NETEZpbGUoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBXU0RMRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7DQotDQotICAgICAgICAvLyBzd2l0Y2ggb2ZmIHRoZSB2ZXJib3NlIG1vZGUgZm9yIGFsbCB1c2VjYXNlcw0KLSAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoSkFWQVhfV1NETF9WRVJCT1NFX01PREVfS0VZLCBmYWxzZSk7DQotDQotICAgICAgICAvLyBpZiB0aGUgY3VzdGVtIHJlc29sdmVyIGlzIHByZXNlbnQgdGhlbiB1c2UgaXQNCi0gICAgICAgIGlmIChjdXN0b21XU0xENEpSZXNvbHZlciAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkV1NETChjdXN0b21XU0xENEpSZXNvbHZlcik7DQotICAgICAgICB9IA0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgRG9jdW1lbnQgZG9jOw0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIGRvYyA9IG5ld0RvY3VtZW50KGluKTsNCi0gICAgICAgICAgICB9IA0KLSAgICAgICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5QQVJTRVJfRVJST1IsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZXIgQ29uZmlndXJhdGlvbiBFcnJvciIsIGUpOw0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uUEFSU0VSX0VSUk9SLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VyIFNBWCBFcnJvciIsIGUpOw0KLQ0KLSAgICAgICAgICAgIH0gDQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsICJJTyBFcnJvciIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKGdldEJhc2VVcmkoKSwgZG9jKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VVcmkoKSB7DQotICAgICAgICByZXR1cm4gYmFzZVVyaTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVXJpKFN0cmluZyBiYXNlVXJpKSB7DQotICAgICAgICB0aGlzLmJhc2VVcmkgPSBiYXNlVXJpOw0KLSAgICB9DQotDQotDQotICAgIHByaXZhdGUgRG9jdW1lbnQgbmV3RG9jdW1lbnQoSW5wdXRTdHJlYW0gaW5wKQ0KLSAgICAgICAgICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0NCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gZ2V0RE9NRmFjdG9yeSgpOw0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiOw0KLQ0KLSAgICAgICAgc3luY2hyb25pemVkIChkYmYpIHsNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKXsNCi0gICAgICAgICAgICAgICAgLy8gVW5kZXIgc29tZSBwZWN1bGlhciBjb25kaXRpb25zIChjbGFzc2xvYWRlciBpc3N1ZXMpLCBqdXN0IHNjcmFwIHRoZSBvbGQgZGJmLCBjcmVhdGUgYSBuZXcgb25lIGFuZCB0cnkgYWdhaW4uDQotICAgICAgICAgICAgICAgIGRiZiA9IGdldERPTUZhY3RvcnkoKTsNCi0gICAgICAgICAgICAgICAgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZGIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IERlZmF1bHRFbnRpdHlSZXNvbHZlcigpKTsNCi0gICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihuZXcgUGFyc2VyRXJyb3JIYW5kbGVyKCkpOw0KLSAgICAgICAgcmV0dXJuIChkYi5wYXJzZShpbnApKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZ2V0RE9NRmFjdG9yeSgpIHsNCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy9sb2cuZXJyb3IoTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uMDAiKSwgZSApOw0KLSAgICAgICAgICAgIGRiZiA9IG51bGw7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gKGRiZik7DQotICAgIH0NCi0NCi0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gaW50ZXJuYWwgY2xhc3M6IFBhcnNlckVycm9ySGFuZGxlcg0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgY2xhc3MgUGFyc2VyRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsNCi0gICAgICAgIC8qKg0KLSAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHBhcnNlIGV4Y2VwdGlvbiBkZXRhaWxzDQotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnNlRXhjZXB0aW9uSW5mbyhTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHsNCi0gICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQgPSBzcGUuZ2V0U3lzdGVtSWQoKTsNCi0gICAgICAgICAgICBpZiAoc3lzdGVtSWQgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9ICJudWxsIjsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuICJVUkk9IiArIHN5c3RlbUlkICsNCi0gICAgICAgICAgICAgICAgICAgICIgTGluZT0iICsgc3BlLmdldExpbmVOdW1iZXIoKSArDQotICAgICAgICAgICAgICAgICAgICAiOiAiICsgc3BlLmdldE1lc3NhZ2UoKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgc3RhbmRhcmQgU0FYIEVycm9ySGFuZGxlciBtZXRob2RzLg0KLSAgICAgICAgLy8gU2VlIFNBWCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uDQotDQotICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBzcGUpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVycm9yOiAiICsgZ2V0UGFyc2VFeGNlcHRpb25JbmZvKHNwZSk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihtZXNzYWdlKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gc3BlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJGYXRhbCBFcnJvcjogIiArIGdldFBhcnNlRXhjZXB0aW9uSW5mbyhzcGUpOw0KLSAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24obWVzc2FnZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gICAgLy8gaW50ZXJuYWwgY2xhc3M6IERlZmF1bHRFbnRpdHlSZXNvbHZlcg0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLSAgICBwdWJsaWMgY2xhc3MgRGVmYXVsdEVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgew0KLQ0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZW1wdHkgPSAiIjsNCi0gICAgICAgIHByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbXB0eS5nZXRCeXRlcygpKTsNCi0NCi0gICAgICAgIHB1YmxpYyBEZWZhdWx0RW50aXR5UmVzb2x2ZXIoKSB7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgew0KLQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoYmFpcyk7DQotICAgICAgICB9DQotDQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9BY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDZjNDNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uQmFzZWRPcGVyYXRpb25EaXNwYXRjaFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZE9wZXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBBeGlzU2VydmljZSBhcyA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXMpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMSA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMSIpKTsKLSAgICAgICAgQXJyYXlMaXN0IG9wMWFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIG9wMWFjdGlvbnMuYWRkKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjEiKTsKLSAgICAgICAgb3BlcmF0aW9uMS5zZXRXc2FtYXBwaW5nTGlzdChvcDFhY3Rpb25zKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjIgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjIiKSk7Ci0gICAgICAgIEFycmF5TGlzdCBvcDJhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBvcDJhY3Rpb25zLmFkZCgidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24yIik7Ci0gICAgICAgIG9wZXJhdGlvbjIuc2V0V3NhbWFwcGluZ0xpc3Qob3AyYWN0aW9ucyk7Ci0KLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjEpOwotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMik7Ci0KLSAgICAgICAgYXMubWFwQWN0aW9uVG9PcGVyYXRpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMSIsIG9wZXJhdGlvbjEpOwotICAgICAgICBhcy5tYXBBY3Rpb25Ub09wZXJhdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24yIiwgb3BlcmF0aW9uMik7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0V1NBQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLQotICAgICAgICBBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgYWJvZCA9IG5ldyBBY3Rpb25CYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIoKTsKLSAgICAgICAgYWJvZC5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMiwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmOTkyYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL0FkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVBY3Rpb25GbGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIAotICAgICAgICAvL0luZGljYXRlIHRoYXQgdGhlIEFkZHJlc3NpbmdJbkhhbmRsZXIgaGFzIHJ1bi4KLSAgICAgICAgbWMuc2V0UHJvcGVydHkoQWRkcmVzc2luZ0NvbnN0YW50cy5JU19BRERSX0lORk9fQUxSRUFEWV9QUk9DRVNTRUQsIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgLy8gVGVsbCB2YWxpZGF0aW9uIGhhbmRsZXIgTk9UIHRvIGNoZWNrIGFjdGlvbiBkaXNwYXRjaAotICAgICAgICBtYy5zZXRQcm9wZXJ0eShBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJfVkFMSURBVEVfQUNUSU9OLCBCb29sZWFuLkZBTFNFKTsKLQotICAgICAgICAvLyBFdmVuIHRob3VnaCB0aGlzIG1lc3NhZ2UgaGFzIGFuIGFjdGlvbiB0aGF0IHdpbGwgbm90IGRpc3BhdGNoIHRvIGFuCi0gICAgICAgIC8vIEF4aXNPcGVyYXRpb24sIHRoaXMgc2hvdWxkbid0IHRocm93IGEgZmF1bHQuCi0gICAgICAgIEFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIgZGlzcGF0Y2hlciA9IG5ldyBBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyKCk7Ci0gICAgICAgIGRpc3BhdGNoZXIuaW52b2tlKG1jKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZhYzc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5SZWxhdGVzVG87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuT3BlcmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk9ubHlBeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZE9wZXJhdGlvbigpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotICAgICAgICBBeGlzU2VydmljZSBhczEgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGFjID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMxKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgYXMxLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMxLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChhYyk7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2djID0gY2MuY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChhczEuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKTsKLSAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoYXMxKTsKLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvYzEgPSBzZXJ2aWNlQ29udGV4dC5jcmVhdGVPcGVyYXRpb25Db250ZXh0KG9wZXJhdGlvbjEpOwotICAgICAgICBPcGVyYXRpb25Db250ZXh0IG9jMiA9IHNlcnZpY2VDb250ZXh0LmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uMik7Ci0gICAgICAgIGNjLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dCgidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMubWVzc2FnZWlkOjEyMyIsIG9jMSk7Ci0gICAgICAgIGNjLnJlZ2lzdGVyT3BlcmF0aW9uQ29udGV4dCgidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMubWVzc2FnZWlkOjQ1NiIsIG9jMik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gY2MuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAuYWRkUmVsYXRlc1RvKG5ldyBSZWxhdGVzVG8oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLm1lc3NhZ2VpZDo0NTYiKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzMSk7Ci0KLSAgICAgICAgUmVsYXRlc1RvQmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyIHJ1aXNkID0gbmV3IFJlbGF0ZXNUb0Jhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotICAgICAgICBydWlzZC5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24yLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTZlYTM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVsYXRlc1RvQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuUmVsYXRlc1RvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRlc1RvQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChhYyk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBzZyA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGFjKTsKLSAgICAgICAgc2cuYWRkU2VydmljZShhczEpOwotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IHNnYyA9IGNjLmNyZWF0ZVNlcnZpY2VHcm91cENvbnRleHQoc2cpOwotCi0gICAgICAgIFNlcnZpY2VDb250ZXh0IHNjMSA9IHNnYy5nZXRTZXJ2aWNlQ29udGV4dChhczEpOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMiA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTIiKTsKLSAgICAgICAgc2cuYWRkU2VydmljZShhczIpOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzYzIgPSBzZ2MuZ2V0U2VydmljZUNvbnRleHQoYXMyKTsKLQotICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMSk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMyKTsKLQotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjEgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjEiKSk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgYXMxLmFkZE9wZXJhdGlvbihvcGVyYXRpb24xKTsKLSAgICAgICAgYXMyLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotCi0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MxID0gc2MxLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uMSk7Ci0gICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb2MyID0gc2MyLmNyZWF0ZU9wZXJhdGlvbkNvbnRleHQob3BlcmF0aW9uMik7Ci0KLSAgICAgICAgY2MucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5tZXNzYWdlaWQ6MTIzIiwgb2MxKTsKLSAgICAgICAgY2MucmVnaXN0ZXJPcGVyYXRpb25Db250ZXh0KCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5tZXNzYWdlaWQ6NDU2Iiwgb2MyKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgIC5hZGRSZWxhdGVzVG8obmV3IFJlbGF0ZXNUbygidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMubWVzc2FnZWlkOjQ1NiIpKTsKLQotICAgICAgICBSZWxhdGVzVG9CYXNlZFNlcnZpY2VEaXNwYXRjaGVyIHJ1aXNkID0gbmV3IFJlbGF0ZXNUb0Jhc2VkU2VydmljZURpc3BhdGNoZXIoKTsKLSAgICAgICAgcnVpc2QuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoYXMyLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA4YzMxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1JlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLQotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMSA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMSIpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjEpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gY2MuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMS9vcGVyYXRpb24yIikpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhczEpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgcnVpc2QgPSBuZXcgUmVxdWVzdFVSSUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotICAgICAgICBydWlzZC5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24yLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvUmVxdWVzdFVSSUJhc2VkU2VydmljZURpc3BhdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzhiMWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9kaXNwYXRjaGVycy9SZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0VVJJQmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZFNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMyID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMiIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMSk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMyKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjYy5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgLnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UyIikpOwotCi0gICAgICAgIFJlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyIHJ1aXNkID0gbmV3IFJlcXVlc3RVUklCYXNlZFNlcnZpY2VEaXNwYXRjaGVyKCk7Ci0gICAgICAgIHJ1aXNkLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFzMiwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1NPQVBNZXNzYWdlQm9keUJhc2VkT3BlcmF0aW9uRGlzcGF0Y2hlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA3MDNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRPcGVyYXRpb25EaXNwYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSW5Pbmx5QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZUJvZHlCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRPcGVyYXRpb24oKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLQotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMSA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMSIpKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjEpOwotICAgICAgICBhczEuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjIpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUVtcHR5Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYWMgPSBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBhYy5hZGRTZXJ2aWNlKGFzMSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gY2MuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhczEpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgc2IgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuY3JlYXRlU09BUEJvZHkoc2UpOwotICAgICAgICBzYi5hZGRDaGlsZChPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KCJvcGVyYXRpb24yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QiLCAicGZ4IikpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRFbnZlbG9wZShzZSk7Ci0KLQotICAgICAgICBTT0FQTWVzc2FnZUJvZHlCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIgcnVpc2QgPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQTWVzc2FnZUJvZHlCYXNlZE9wZXJhdGlvbkRpc3BhdGNoZXIoKTsKLSAgICAgICAgcnVpc2QuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMiwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZGlzcGF0Y2hlcnMvU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxYTE0Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2Rpc3BhdGNoZXJzL1NPQVBNZXNzYWdlQm9keUJhc2VkU2VydmljZURpc3BhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlQm9keUJhc2VkU2VydmljZURpc3BhdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotICAgICAgICBBeGlzU2VydmljZSBhczEgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzMiA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTIiKTsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlRW1wdHlDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFjLmFkZFNlcnZpY2UoYXMxKTsKLSAgICAgICAgYWMuYWRkU2VydmljZShhczIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgU09BUEVudmVsb3BlIHNlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZVNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBzYiA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVTT0FQQm9keShzZSk7Ci0gICAgICAgIHNiLmFkZENoaWxkKE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQoIm9wZXJhdGlvbjIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZngiKSk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKHNlKTsKLQotCi0gICAgICAgIFNPQVBNZXNzYWdlQm9keUJhc2VkU2VydmljZURpc3BhdGNoZXIgcnVpc2QgPSBuZXcgU09BUE1lc3NhZ2VCb2R5QmFzZWRTZXJ2aWNlRGlzcGF0Y2hlcigpOwotICAgICAgICBydWlzZC5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhhczIsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvQWJzdHJhY3RFbmdpbmVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BYnN0cmFjdEVuZ2luZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1NDI3MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9BYnN0cmFjdEVuZ2luZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RFbmdpbmVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyBBYnN0cmFjdEVuZ2luZVRlc3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEFic3RyYWN0RW5naW5lVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgTnVsbE1lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRNZXNzYWdlKQotICAgICAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlQ2hhaW5UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EZXBsb3lhYmxlQ2hhaW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDdkN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvRGVwbG95YWJsZUNoYWluVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBEZXBsb3lhYmxlQ2hhaW5UZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBzdGF0aWMgZmluYWwgT2JqZWN0IEFfVEFSR0VUID0gbmV3IE9iamVjdCgpOw0KLSAgICBzdGF0aWMgZmluYWwgT2JqZWN0IEJfVEFSR0VUID0gbmV3IE9iamVjdCgpOw0KLSAgICBzdGF0aWMgZmluYWwgT2JqZWN0IENfVEFSR0VUID0gbmV3IE9iamVjdCgpOw0KLSAgICBzdGF0aWMgZmluYWwgT2JqZWN0IERfVEFSR0VUID0gbmV3IE9iamVjdCgpOw0KLSAgICBzdGF0aWMgZmluYWwgT2JqZWN0IEVfVEFSR0VUID0gbmV3IE9iamVjdCgpOw0KLQ0KLSAgICBwcml2YXRlIERlcGxveWFibGUgYTsNCi0gICAgcHJpdmF0ZSBEZXBsb3lhYmxlIGI7DQotICAgIHByaXZhdGUgRGVwbG95YWJsZSBjOw0KLSAgICBwcml2YXRlIERlcGxveWFibGUgZDsNCi0gICAgcHJpdmF0ZSBEZXBsb3lhYmxlIGU7DQotICAgIERlcGxveWFibGVDaGFpbiBlYzsNCi0NCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGEgPSBuZXcgRGVwbG95YWJsZSgiYSIsIEFfVEFSR0VUKTsNCi0gICAgICAgIGIgPSBuZXcgRGVwbG95YWJsZSgiYiIsIEJfVEFSR0VUKTsNCi0gICAgICAgIGMgPSBuZXcgRGVwbG95YWJsZSgiYyIsIENfVEFSR0VUKTsNCi0gICAgICAgIGQgPSBuZXcgRGVwbG95YWJsZSgiZCIsIERfVEFSR0VUKTsNCi0gICAgICAgIGUgPSBuZXcgRGVwbG95YWJsZSgiZSIsIEVfVEFSR0VUKTsNCi0gICAgICAgIGVjID0gbmV3IERlcGxveWFibGVDaGFpbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVEZXBsb3koKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGEuYWRkU3VjY2Vzc29yKCJiIik7DQotICAgICAgICBlYy5kZXBsb3koYSk7DQotDQotICAgICAgICAvLyBTaG91bGQgYmUgb2sgdG8gZG8gdGhpcyBhZ2FpbiBhcyBsb25nIGFzIGV2ZXJ5dGhpbmcgbWF0Y2hlcy4NCi0gICAgICAgIGVjLmRlcGxveShhKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIGEuYWRkU3VjY2Vzc29yKCJiIik7DQotICAgICAgICBlYy5kZXBsb3koYik7DQotICAgICAgICBlYy5kZXBsb3koYSk7DQotICAgICAgICBlYy5yZWJ1aWxkKCk7DQotICAgICAgICBMaXN0IGNoYWluID0gZWMuZ2V0Q2hhaW4oKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGl0ZW1zIiwgMiwgY2hhaW4uc2l6ZSgpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiV3Jvbmcgb3JkZXIiLCBBX1RBUkdFVCwgY2hhaW4uZ2V0KDApKTsNCi0NCi0gICAgICAgIGVjLmFkZFJlbGF0aW9uc2hpcCgiYiIsICJhIik7DQotICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBlYy5yZWJ1aWxkKCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsNCi0gICAgICAgICAgICAvLyBFeHBlY3RlZCBFeGNlcHRpb24sIHlheSENCi0gICAgICAgICAgICBjYXVnaHQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFjYXVnaHQpIGZhaWwoIkRpZG4ndCBjYXRjaCBleGNlcHRpb24gZm9yIGN5Y2xpYyBkZXBlbmRlbmN5Iik7DQotDQotICAgICAgICBlYyA9IG5ldyBEZXBsb3lhYmxlQ2hhaW4oKTsNCi0gICAgICAgIGIuYWRkU3VjY2Vzc29yKCJjIik7DQotICAgICAgICBkLmFkZFN1Y2Nlc3NvcigiZSIpOw0KLSAgICAgICAgZS5hZGRQcmVkZWNlc3NvcigiYiIpOw0KLQ0KLSAgICAgICAgZS5zZXRMYXN0KHRydWUpOw0KLQ0KLSAgICAgICAgZWMuZGVwbG95KGIpOw0KLSAgICAgICAgZWMuZGVwbG95KGEpOw0KLSAgICAgICAgZWMuZGVwbG95KGMpOw0KLSAgICAgICAgZWMuZGVwbG95KGQpOw0KLSAgICAgICAgZWMuZGVwbG95KGUpOw0KLSAgICAgICAgZWMucmVidWlsZCgpOw0KLSAgICAgICAgY2hhaW4gPSBlYy5nZXRDaGFpbigpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgaXRlbXMiLCA1LCBjaGFpbi5zaXplKCkpOw0KLSAgICAgICAgaW50IGFJbmRleCA9IGNoYWluLmluZGV4T2YoQV9UQVJHRVQpOw0KLSAgICAgICAgaW50IGJJbmRleCA9IGNoYWluLmluZGV4T2YoQl9UQVJHRVQpOw0KLSAgICAgICAgaW50IGNJbmRleCA9IGNoYWluLmluZGV4T2YoQ19UQVJHRVQpOw0KLSAgICAgICAgaW50IGRJbmRleCA9IGNoYWluLmluZGV4T2YoRF9UQVJHRVQpOw0KLSAgICAgICAgaW50IGVJbmRleCA9IGNoYWluLmluZGV4T2YoRV9UQVJHRVQpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShhSW5kZXggPCBiSW5kZXgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShiSW5kZXggPCBjSW5kZXgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShkSW5kZXggPCBlSW5kZXgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShiSW5kZXggPCBlSW5kZXgpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Rpc3BhdGNoUGhhc2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9EaXNwYXRjaFBoYXNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWY0N2VlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL0Rpc3BhdGNoUGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50cy5XU0RMMjBfMjAwNF9Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzOw0KLQ0KLXB1YmxpYyBjbGFzcyBEaXNwYXRjaFBoYXNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgY2FwYWJpbGl0eSBvZiBpc09uZXdheSBtZXRob2QgaW4gRGlzcGF0Y2hQaGFzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc09uZXdheSgpIHsNCi0gICAgICAgIFN0cmluZyBtZXAgPSBXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7DQotICAgICAgICBEaXNwYXRjaFBoYXNlIHBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsNCi0gICAgICAgIGJvb2xlYW4gb25ld2F5ID0gcGhhc2UuaXNPbmV3YXkobWVwKTsNCi0gICAgICAgIGFzc2VydFRydWUob25ld2F5KTsNCi0gICAgICAgIG1lcCA9IFdTREwyMF8yMDA0X0NvbnN0YW50cy5NRVBfVVJJX0lOX09OTFk7DQotICAgICAgICBvbmV3YXkgPSBwaGFzZS5pc09uZXdheShtZXApOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShvbmV3YXkpOw0KLSAgICAgICAgbWVwID0gV1NETDIwXzIwMDZDb25zdGFudHMuTUVQX1VSSV9JTl9PTkxZOw0KLSAgICAgICAgb25ld2F5ID0gcGhhc2UuaXNPbmV3YXkobWVwKTsNCi0gICAgICAgIGFzc2VydFRydWUob25ld2F5KTsNCi0gICAgICAgIG1lcCA9IFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VUOw0KLSAgICAgICAgb25ld2F5ID0gcGhhc2UuaXNPbmV3YXkobWVwKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKG9uZXdheSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9kdWxlQ29uZmlnVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9kdWxlQ29uZmlnVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJmNTJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL01vZHVsZUNvbmZpZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Nb2R1bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlQ29uZmlnVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIEF4aXNDb25maWd1cmF0aW9uIGFyOwotICAgIFN0cmluZyBheGlzMnhtbCA9IEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArCi0gICAgICAgICAgICAiL3RhcmdldC90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L21vZHVsZUNvbmZpZy9heGlzMi54bWwiOwotICAgIFN0cmluZyByZXBvID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudC9tb2R1bGVDb25maWciOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZUNvbmZpZ0F0QXhpc0NvbmZpZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFyID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIGF4aXMyeG1sKQotICAgICAgICAgICAgICAgICAgICAuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIE1vZHVsZUNvbmZpZ3VyYXRpb24gbW9kdWxlQ29uZmlndXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIGFyLmdldE1vZHVsZUNvbmZpZygidGVzdE1vZHVsZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhID0gbW9kdWxlQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoInRlc3RNb2R1bGVQYXJhIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmEpOwotCi0gICAgICAgICAgICBtb2R1bGVDb25maWd1cmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgYXIuZ2V0TW9kdWxlQ29uZmlnKCJ0ZXN0TW9kdWxlMiIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIHBhcmEgPSBtb2R1bGVDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcigidGVzdE1vZHVsZVBhcmEyIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmEpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIERlcGxveW1lbnRFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlQ29uZmlnQXRTZXJ2aWNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgYXhpczJ4bWwpOwotICAgICAgICAgICAgYXIgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0TmFtZSgidGVzdFNlcnZpY2UiKTsKLSAgICAgICAgICAgIGFyLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVwbyArICIvc2VydmljZTEueG1sIik7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzYnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihpbiwgY29uZmlndXJhdGlvbkNvbnRleHQsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2J1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHNidWlsZGVyLmJ1aWxkT00oKSk7Ci0KLSAgICAgICAgICAgIE1vZHVsZUNvbmZpZ3VyYXRpb24gbW9kdWxlQ29uZmlndXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0TW9kdWxlQ29uZmlnKCJTZXJ2aWVfbW9kdWxlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vZHVsZUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmEgPSBtb2R1bGVDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcigiU2VydmllX21vZHVsZV9wYXJhIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmEpOwotCi0gICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wID0gc2VydmljZS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKCJlY2hvU3RyaW5nIikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvcCk7Ci0KLSAgICAgICAgICAgIG1vZHVsZUNvbmZpZ3VyYXRpb24gPSBvcC5nZXRNb2R1bGVDb25maWcoIk9wX01vZHVsZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGVDb25maWd1cmF0aW9uKTsKLSAgICAgICAgICAgIHBhcmEgPSBtb2R1bGVDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcigiT3BfTW9kdWxlX3BhcmEiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocGFyYSk7Ci0KLQotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBEZXBsb3ltZW50RXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBGaWxlTm90Rm91bmRFeGNlcHRpb24gICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEF4aXNGYXVsdCAgIiArIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2R1bGVFbmdhZ2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9Nb2R1bGVFbmdhZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwY2IxMDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvTW9kdWxlRW5nYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlRW5nYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZUVuZ2FnZW1lbnQoKSB0aHJvd3MgQXhpc0ZhdWx0LAotICAgICAgICAgICAgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMvZGVwbG95bWVudCI7Ci0gICAgICAgIGF4aXNDb25maWcgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlbmFtZSwgZmlsZW5hbWUgKyAiL2F4aXMyLnhtbCIpCi0gICAgICAgICAgICAgICAgLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNNb2R1bGUgbW9kdWxlID0gYXhpc0NvbmZpZy5nZXRNb2R1bGUoIm1vZHVsZTEiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotICAgICAgICBheGlzQ29uZmlnLmVuZ2FnZU1vZHVsZSgibW9kdWxlMSIpOwotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlKCJzZXJ2aWNlMiIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIG1vZHVsZU9wZXJhdGlvbiA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKAotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiY3JlYXRTZXEiKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobW9kdWxlT3BlcmF0aW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhcmFtZXRlckFkZFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhcmFtZXRlckFkZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlMDZmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QYXJhbWV0ZXJBZGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5Jbk91dEF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLS8qKgotICogVG8gY2hjZWsgbG9ja2VkIGlzIHdvcmtpbmcgY29ycmNldGx5Ci0gKi8KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckFkZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIEF4aXNDb25maWd1cmF0aW9uIHJlZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlclNlcnZpY2VMb2NrZWRBdEF4aXNDb25maWcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHBhcmEuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgICAgICBwYXJhLnNldE5hbWUoIlBBUkFfTkFNRSIpOwotICAgICAgICAgICAgcGFyYS5zZXRMb2NrZWQodHJ1ZSk7Ci0gICAgICAgICAgICByZWcuYWRkUGFyYW1ldGVyKHBhcmEpOwotCi0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICAgICAgcmVnLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihwYXJhKTsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGZhaWxzIHdpdGggUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlck1vZHVsZUxvY2tlZEF0QXhpc0NvbmZpZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYS5zZXRWYWx1ZShudWxsKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TmFtZSgiUEFSQV9OQU1FIik7Ci0gICAgICAgICAgICBwYXJhLnNldExvY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIHJlZy5hZGRQYXJhbWV0ZXIocGFyYSk7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IG5ldyBBeGlzTW9kdWxlKCJTZXJ2aWNlMSIpOwotICAgICAgICAgICAgbW9kdWxlLnNldFBhcmVudChyZWcpOwotICAgICAgICAgICAgbW9kdWxlLmFkZFBhcmFtZXRlcihwYXJhKTsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGZhaWxzIHdpdGggUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBhcmFtZXRlck9wZXJhdGlvbmxvY2tlZEJ5QXhpc0NvbmZpZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYS5zZXRWYWx1ZShudWxsKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TmFtZSgiUEFSQV9OQU1FIik7Ci0gICAgICAgICAgICBwYXJhLnNldExvY2tlZCh0cnVlKTsKLSAgICAgICAgICAgIHJlZy5hZGRQYXJhbWV0ZXIocGFyYSk7Ci0KLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoIlNlcnZpY2UxIik7Ci0gICAgICAgICAgICByZWcuYWRkU2VydmljZShzZXJ2aWNlKTsKLQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVydGlvbiA9IG5ldyBJbk91dEF4aXNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIG9wZXJ0aW9uLnNldFBhcmVudChzZXJ2aWNlKTsKLSAgICAgICAgICAgIG9wZXJ0aW9uLmFkZFBhcmFtZXRlcihwYXJhKTsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGZhaWxzIHdpdGggUGFybXRlciBpcyBsb2NrZWQgY2FuIG5vdCBvdmVyaWRlIik7Ci0KLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRQYXJhbWV0ZXJPcGVyYXRpb25Mb2NrZWJ5U2VydmljZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgcGFyYS5zZXRWYWx1ZShudWxsKTsKLSAgICAgICAgICAgIHBhcmEuc2V0TmFtZSgiUEFSQV9OQU1FIik7Ci0gICAgICAgICAgICBwYXJhLnNldExvY2tlZCh0cnVlKTsKLQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgICAgIHJlZy5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIocGFyYSk7Ci0KLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcnRpb24gPSBuZXcgSW5PdXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICBvcGVydGlvbi5zZXRQYXJlbnQoc2VydmljZSk7Ci0gICAgICAgICAgICBvcGVydGlvbi5hZGRQYXJhbWV0ZXIocGFyYSk7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBmYWlscyB3aXRoIFBhcm10ZXIgaXMgbG9ja2VkIGNhbiBub3Qgb3ZlcmlkZSIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9QYXJhbWV0ZXJMb2NrZWQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhcmFtZXRlckxvY2tlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjgzYWIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvZW5naW5lL1BhcmFtZXRlckxvY2tlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuTW9kdWxlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyTG9ja2VkIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQXhpc0NvbmZpZ3VyYXRpb24gYXI7Ci0gICAgU3RyaW5nIHJlcG8gPSAiLi90ZXN0LXJlc291cmNlcy9kZXBsb3ltZW50L1BhcmFMb2NrZWRSZXBvIjsKLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXIgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShudWxsLCByZXBvICsgIi9heGlzMi54bWwiKQotICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyaWRlX05vbl9sb2NrZWRfUGFyYV9TZXJ2aWNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcik7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBhci5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJlcG8gKyAiL3NlcnZpY2Vfb3ZlcmlkZV9ub25fbG9ja2VkX3BhcmEueG1sIik7Ci0gICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzYnVpbGRlciA9IG5ldyBTZXJ2aWNlQnVpbGRlcihpbiwgbnVsbCwgc2VydmljZSk7Ci0gICAgICAgICAgICBzYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2Uoc2J1aWxkZXIuYnVpbGRPTSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2J1aWxkZXIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRGVwbG95bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRGVwbG95bWVudEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyaWRlX2xvY2tlZF9QYXJhX1NlcnZpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFyKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGFyLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVwbyArICIvc2VydmljZV9vdmVyaWRlX2xvY2tlZF9wYXJhLnhtbCIpOwotICAgICAgICAgICAgU2VydmljZUJ1aWxkZXIgc2J1aWxkZXIgPSBuZXcgU2VydmljZUJ1aWxkZXIoaW4sIG51bGwsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2J1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHNidWlsZGVyLmJ1aWxkT00oKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNidWlsZGVyKTsKLSAgICAgICAgICAgIGZhaWwoIlBhcm10ZXIgaXMgbG9ja2VkIGNhbiBub3Qgb3ZlcmlkZSIpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyaWRlX2xvY2tlZF9QYXJhX09wZXJhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXIpOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IG5ldyBBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgYXIuYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvICsgIi9vcF9vdmVyaWRlX2dsb2JhbF9wYXJhLnhtbCIpOwotICAgICAgICAgICAgU2VydmljZUJ1aWxkZXIgc2J1aWxkZXIgPSBuZXcgU2VydmljZUJ1aWxkZXIoaW4sIG51bGwsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2J1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHNidWlsZGVyLmJ1aWxkT00oKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNidWlsZGVyKTsKLSAgICAgICAgICAgIGZhaWwoIlBhcm10ZXIgaXMgbG9ja2VkIGNhbiBub3Qgb3ZlcmlkZSIpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBBeGlzRmF1bHQgIiArIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyaWRlX1NlcnZpY2VfbG9ja2VkX1BhcmFfT3BlcmF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcik7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBhci5hZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJlcG8gKyAiL09wX292ZXJpZGVfU2VydmljZV9wYXJhLnhtbCIpOwotICAgICAgICAgICAgU2VydmljZUJ1aWxkZXIgc2J1aWxkZXIgPSBuZXcgU2VydmljZUJ1aWxkZXIoaW4sIG51bGwsIHNlcnZpY2UpOwotICAgICAgICAgICAgc2J1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHNidWlsZGVyLmJ1aWxkT00oKSk7Ci0gICAgICAgICAgICBmYWlsKCJQYXJtdGVyIGlzIGxvY2tlZCBjYW4gbm90IG92ZXJpZGUiKTsKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgY2FuIG5vdCBmYWlsIHdpdGggdGhpcyBGaWxlTm90Rm91bmRFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9IGNhdGNoIChEZXBsb3ltZW50RXhjZXB0aW9uIGUpIHsKLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgQXhpc0ZhdWx0ICIgKyBheGlzRmF1bHQpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEF4aXNGYXVsdCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmlkZV9Ob25fbG9ja2VkX1BhcmFfTW9kdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcik7Ci0gICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgICAgICBtb2R1bGUuc2V0UGFyZW50KGFyKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvICsgIi9tb2R1bGVfb3ZlcmlkZV9nbG9iYWxfbm9uX2xvY2tlZF9wYXJhLnhtbCIpOwotICAgICAgICAgICAgTW9kdWxlQnVpbGRlciBtYnVpbGRlciA9IG5ldyBNb2R1bGVCdWlsZGVyKGluLCBtb2R1bGUsIGFyKTsKLSAgICAgICAgICAgIG1idWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGlzIGNhbiBub3QgZmFpbCB3aXRoIHRoaXMgRmlsZU5vdEZvdW5kRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoRGVwbG95bWVudEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyaWRlX2xvY2tlZF9QYXJhX01vZHVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXIpOwotICAgICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBuZXcgQXhpc01vZHVsZSgpOwotICAgICAgICAgICAgbW9kdWxlLnNldFBhcmVudChhcik7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVwbyArICIvbW9kdWxlX292ZXJpZGVfbG9ja2VkX3BhcmEueG1sIik7Ci0gICAgICAgICAgICBNb2R1bGVCdWlsZGVyIG1idWlsZGVyID0gbmV3IE1vZHVsZUJ1aWxkZXIoaW4sIG1vZHVsZSwgYXIpOwotICAgICAgICAgICAgbWJ1aWxkZXIucG9wdWxhdGVNb2R1bGUoKTsKLSAgICAgICAgICAgIGZhaWwoIlBhcm10ZXIgaXMgbG9ja2VkIGNhbiBub3Qgb3ZlcmlkZSIpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVGhpcyBjYW4gbm90IGZhaWwgd2l0aCB0aGlzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlcGxveW1lbnRFeGNlcHRpb24gZSkgewotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9lbmdpbmUvU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NWM0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2VuZ2luZS9TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5lbmdpbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRPcGVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQobmV3IEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IGNjLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBvcGVyYXRpb24xLnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMSIpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgb3BlcmF0aW9uMi5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLQotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjEiKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNvYXBBY3Rpb25EaXNwYXRjaGVyID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbjEsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIHJvdXRlIG9uIGFuIGVtdHB5LXN0cmluZyBhY3Rpb24uCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBvcGVyYXRpb24xLnNldFNvYXBBY3Rpb24oIiIpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgb3BlcmF0aW9uMi5zZXRTb2FwQWN0aW9uKCIiKTsKLQotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRTb2FwQWN0aW9uKCIiKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNvYXBBY3Rpb25EaXNwYXRjaGVyID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0TnVsbChtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsQWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIHJvdXRlIG9uIGEgbnVsbCBhY3Rpb24uCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBvcGVyYXRpb24xLnNldFNvYXBBY3Rpb24obnVsbCk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24yID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24yIikpOwotICAgICAgICBvcGVyYXRpb24yLnNldFNvYXBBY3Rpb24obnVsbCk7Ci0KLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjEpOwotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMik7Ci0KLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbihudWxsKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNvYXBBY3Rpb25EaXNwYXRjaGVyID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0TnVsbChtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVBY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGJlIGFibGUgdG8gcm91dGUgb24gYSBTT0FQQWN0aW9uIHRoYXQgaXMgYSBkdXBsaWNhdGUuCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCJTZXJ2aWNlMSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBvcGVyYXRpb24xLnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMSIpOwotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgb3BlcmF0aW9uMi5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLQotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLQotICAgICAgICBTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIHNvYXBBY3Rpb25EaXNwYXRjaGVyID0gbmV3IFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbjIsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0KLSAgICAgICAgLy8gTm93IGFkZCBhIGR1cGxpY2F0ZSBhY3Rpb24sIHRoZW4gdmFsaWRhdGUgd2UgY2FuJ3Qgcm91dGUgb24gaXQgYW55bW9yZS4KLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24zID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24zIikpOwotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBBY3Rpb24gaXMgaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIHdpdGggb3BlcmF0aW9uIDIgYWJvdmUuCi0gICAgICAgIG9wZXJhdGlvbjMuc2V0U29hcEFjdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24yIik7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24zKTsKLQotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oInVybjpvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLnRlc3Q6b3BlcmF0aW9uMiIpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnROdWxsKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0KLSAgICAgICAgLy8gTm93IHZlcmlmeSB0aGF0IGFkZGluZyBhbm90aGVyIG9wZXJhdGlvbiB3aXRoIHRoZSBkdXBsaWNhdGUgU09BUEFjdGlvbiAKLSAgICAgICAgLy8gZG9lc24ndCBzb21laG93IGdldCBpdCBhZGRlZCBiYWNrIGludG8gdGhlIHZhbGlkIGFsaWFzIG1hcAotICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbjQgPSBuZXcgSW5Pbmx5QXhpc09wZXJhdGlvbihuZXcgUU5hbWUoIm9wZXJhdGlvbjQiKSk7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgU09BUEFjdGlvbiBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgd2l0aCBvcGVyYXRpb24gMiBhYm92ZS4KLSAgICAgICAgb3BlcmF0aW9uNC5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjIiKTsKLSAgICAgICAgYXMuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjQpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEF4aXNTZXJ2aWNlKGFzKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U29hcEFjdGlvbigidXJuOm9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMudGVzdDpvcGVyYXRpb24yIik7Ci0gICAgICAgIHNvYXBBY3Rpb25EaXNwYXRjaGVyLmludm9rZShtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydE51bGwobWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLQotICAgICAgICAvLyBBbmQgZmluYWxseSwgdmVyaWZ5IHRoYXQgYWZ0ZXIgYWxsIHRoZSBhYm92ZSwgd2UgY2FuIHN0aWxsIHJvdXRlIG9uIGEgdmFsaWQKLSAgICAgICAgLy8gU09BUEFjdGlvbiBmb3Igb3BlcmF0aW9uIDEgKHdob3NlIFNPQVBBY3Rpb24gd2FzIG5ldmVyIGR1cGxpY2F0ZWQsIHNvIHNob3VsZCBzdGlsbCBiZQotICAgICAgICAvLyB2YWxpZCkKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXMpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRTb2FwQWN0aW9uKCJ1cm46b3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy50ZXN0Om9wZXJhdGlvbjEiKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIuaW52b2tlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbjEsIG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0KLQotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFjdGlvblZzT3BOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNob3VsZCByb3V0ZSBiYXNlZCBvbiBhY3Rpb24gYmVmb3JlIHRyeWluZyB0byByb3V0ZSBiYXNlZCBvbiBvcGVyYXRpb24gbmFtZQotICAgICAgICAvLyAtIG1ldGhvZCBvcGVyYXRpb24xLCBhY3Rpb24gPSBvcGVyYXRpb24yCi0gICAgICAgIC8vIC0gbWV0aG9kIG9wZXJhdGlvbjIsIGFjdGlvbiA9IG9wZXJhdGlvbjEKLSAgICAgICAgLy8gSW5jb21pbmcgYWN0aW9uIHNob3VsZCByb3V0ZSB0bzoKLSAgICAgICAgLy8gLSBhY3Rpb24gPSBvcGVyYXRpb24yLCByb3V0ZSB0byBvcGVyYXRpb24xCi0gICAgICAgIC8vIC0gYWN0aW9uID0gb3BlcmF0aW9uMSwgcm91dGUgdG8gb3BlcmF0aW9uMgotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBBeGlzU2VydmljZSBhcyA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXMpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBvcGVyYXRpb24xLnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjIiKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgb3BlcmF0aW9uMi5zZXRTb2FwQWN0aW9uKCJvcGVyYXRpb24xIik7Ci0gICAgICAgIAotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLSAgICAgICAgCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjIiKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAvLyBTaW5jZSBBeGlzMiB1c2VzIGEgc2luZ2xlIGFsaWFzIHRhYmxlIGZvciBTT0FQQWN0aW9ucyBhbmQgb3BlcmF0aW9uIG5hbWVzIChhbmQKLSAgICAgICAgLy8gV1MtQWRkcmVzc2luZyBhY3Rpb25zIGFuZCBpbnB1dCBtZXNzYWdlIG5hbWVzKSwgaGF2aW5nIGFuIGFjdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICAgICAgLy8gYXMgYSBkaWZmZXJlbnQgb3BlcmF0aW9uIHdpbGwgY2F1c2UgdGhhdCBhbGlhcyB0byBiZSB1bnVzYWJsZSBmb3Igcm91dGluZy4KLS8vICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMSwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBvdGhlciBhY3Rpb24gd29ya3MgYWxzbwotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjEiKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotLy8gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24yLCBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpOwotICAgICAgICBhc3NlcnROdWxsKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEFjdGlvblZzT3BOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFNob3VsZG4ndCByb3V0ZSBvbiBhY3Rpb24gYmVjYXVzZSBpdCBpcyBpbnZhbGlkICh1c2VkID4gMSB0aW1lKSBldmVuIHRob3VnaCBpdCBtYXRjaGVzCi0gICAgICAgIC8vIGFuIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgIC8vIC0gbWV0aG9kIG9wZXJhdGlvbjEsIGFjdGlvbiA9IG9wZXJhdGlvbjIKLSAgICAgICAgLy8gLSBtZXRob2Qgb3BlcmF0aW9uMiwgYWN0aW9uID0gb3BlcmF0aW9uMgotICAgICAgICAvLyBJbmNvbWluZyBhY3Rpb24gc2hvdWxkIHJvdXRlIHRvOgotICAgICAgICAvLyAtIGFjdGlvbiA9IG9wZXJhdGlvbjIsIG51bGwKLSAgICAgICAgLy8gLSBhY3Rpb24gPSBvcGVyYXRpb24xLCByb3V0ZSB0byBvcGVyYXRpb24xIChiYXNlZCBvbiBtZXRob2QgbmFtZSBtYXRjaCB0byBhY3Rpb24pCi0gICAgICAgIC8vIAotICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBBeGlzU2VydmljZSBhcyA9IG5ldyBBeGlzU2VydmljZSgiU2VydmljZTEiKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0QXhpc1NlcnZpY2UoYXMpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBvcGVyYXRpb24xID0gbmV3IEluT25seUF4aXNPcGVyYXRpb24obmV3IFFOYW1lKCJvcGVyYXRpb24xIikpOwotICAgICAgICBvcGVyYXRpb24xLnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjIiKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uMiA9IG5ldyBJbk9ubHlBeGlzT3BlcmF0aW9uKG5ldyBRTmFtZSgib3BlcmF0aW9uMiIpKTsKLSAgICAgICAgb3BlcmF0aW9uMi5zZXRTb2FwQWN0aW9uKCJvcGVyYXRpb24yIik7Ci0gICAgICAgIAotICAgICAgICBhcy5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMSk7Ci0gICAgICAgIGFzLmFkZE9wZXJhdGlvbihvcGVyYXRpb24yKTsKLSAgICAgICAgCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjIiKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4ndCByb3V0ZSBvbiB0aGUgU09BUEFjdGlvbiBiZWNhdXNlIGl0IGhhcyBiZWVuIHNwZWNpZmllZCA+IDEgdGltZQotICAgICAgICBhc3NlcnROdWxsKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3cgdmVyaWZ5IHRoYXQgYSBTT0FQQWN0aW9uIHRoYXQgaGFwcGVucyB0byBtYXAgdG8gYW4gb3BlcmF0aW9uIG5hbWUgY2FuIHN0aWxsIGJlIHJvdXRlZAotICAgICAgICBtZXNzYWdlQ29udGV4dCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRBeGlzU2VydmljZShhcyk7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNvYXBBY3Rpb24oIm9wZXJhdGlvbjEiKTsKLSAgICAgICAgc29hcEFjdGlvbkRpc3BhdGNoZXIgPSBuZXcgU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICBzb2FwQWN0aW9uRGlzcGF0Y2hlci5pbnZva2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uMSwgbWVzc2FnZUNvbnRleHQuZ2V0QXhpc09wZXJhdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL0hhbmRsZXIyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL0hhbmRsZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDM5ZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9IYW5kbGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyMiBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIYW5kbGVyMi5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIEhhbmRsZXIyKCkgewotICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiaW5zaWRlIHNlcnZpY2UgMiI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG1lc3NhZ2UgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2FjdGlvbi9BY3Rpb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9hY3Rpb24vQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2EzMjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2FjdGlvbi9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmFjdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuZHJpdmVyLkphdmEyU2VjVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuaW50ZXJmLkFjdG9yOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotLyoqCi0gKiBBY3Rpb24gcmVhZHMgdGhlIGRhdGEgZnJvbSBhbiBpbnB1dCBmaWxlCi0gKiBhbmQgdGhlbiBzYXZlcyB0aGUgZmlsZSBpbnB1dCB0byBKYXZhMlNlY1Rlc3QgY2xhc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uIGltcGxlbWVudHMgQWN0b3IgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBGaWxlUmVhZGVyIGZpbGVSZWFkZXI7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIHB1YmxpYyBBY3Rpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRpbmcgQWN0b3IncyB0YWtlQWN0aW9uIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRha2VBY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBQcmludCBvdXQgbWF2ZW4ncyBiYXNlLGJ1aWxkLCBhbmQgdGVzdCBkaXJlY290b3JpZXMKLSAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiYXNlZGlyID0+ICIgKyBiYXNlRGlyKTsKLQotICAgICAgICAgICAgU3RyaW5nIGJ1aWxkRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJtYXZlbl9idWlsZF9kaXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYnVpbGREaXIgPT4gIiArIGJ1aWxkRGlyKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRlc3REaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm1hdmVuX3Rlc3RfZGVzdCIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0RGlyID0+ICIgKyB0ZXN0RGlyKTsKLQotICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgXCAoYmFjayBzbGFzaCkgdG8gLyAoZm9yd2FyZCBzbGFzaCkKLSAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyTSA9IGJhc2VEaXIucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiYXNlRGlyTSA9PiAiICsgYmFzZURpck0pOwotCi0gICAgICAgICAgICBTdHJpbmcgZnMgPSAiLyI7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBmaWxlIFVSTAotICAgICAgICAgICAgU3RyaW5nIGZpbGVVUkwgPSBiYXNlRGlyTSArIGZzICsgInRlc3QtcmVzb3VyY2VzIiArIGZzICsgImphdmEyc2VjIiArIGZzICsgZmlsZU5hbWU7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgVVJMID0+ICIgKyBmaWxlVVJMKTsKLQotICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGZpbGVVUkwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigicHVibGljLnR4dCIpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENoYXJBcnJheVdyaXRlciBjYXcgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgaW50IGM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChjID0gZmlsZVJlYWRlci5yZWFkKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhdy53cml0ZShjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gU2V0L3NhdmUgdGhlIGZpbGUgaW5wdXQgYXMgdGVzdCByZXN1bHQgb250byBKYXZhMlNlY1Rlc3QKLSAgICAgICAgICAgICAgICBKYXZhMlNlY1Rlc3QudGVzdFJlc3VsdCA9IGNhdy50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9kcml2ZXIvSmF2YTJTZWNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvZHJpdmVyL0phdmEyU2VjVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTBmNmJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9kcml2ZXIvSmF2YTJTZWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuZHJpdmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5sZXNzLkxlc3NQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5sZXNzLkxlc3NQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lmxlc3MuTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5tb3JlLk1vcmVQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5tb3JlLk1vcmVQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lm1vcmUuTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi0vKioKLSAqIEphdmEyU2VjVGVzdCBkZW1vc3RyYXRlcyB0aGUgdXNhZ2VzIG9mIEFjY2Vzc0NvbnRyb2xsZXIgY2xhc3MgYW5kIFBvbGljeSBmaWxlKHMpIHdoaWxlIFNlY3VyaXR5IE1hbmFnZXIgaXMgZW5hYmxlZDoKLSAqIDEuIHRlc3ROb1ByaXZpbGVnZVBhc3NlZCBzaG93cyB0aGUgdXNhZ2Ugb2Ygbm8gQWNjZXNzQ29udHJvbGxlciBidXQgaXQgc3RpbGwgd29yayBmaW5lCi0gKiBiZWNhdXNlIGl0IGhhcyBhbGwgdGhlIHBlcm1pc3Npb25zLgotICogMi4gdGVzdE5vUHJpdmlsZWdlRmFpbHVyZSBzaG93cyB0aGUgdXNhZ2Ugb2YgQWNjZXNzQ29udHJvbGxlciB3aXRoIExlc3NQZXJtaXNzaW9uLmphdmEsCi0gKiB3aGljaCBpcyBub3QgcmlnaHQgYXBwcm9hY2guCi0gKiAzLiB0ZXN0RG9Qcml2aWxlZ2VQYXNzZWQgc2hvd3MgdGhlIGNvcnJlY3QgcHJhY3RpY2Ugb2YgamF2YSAyIHNlY3VyaXR5IGJ5IGdyYW50aW5nIHRoZSBhcHByb3ByaWF0ZQotICogcGVybWlzc2lvbiBpbiB0aGUgcG9saWN5IGZpbGUoczAgYW5kIHdyYXBwaW5nIHRoZSBBY2Nlc3NDb250cm9sbGVyIGNhbGxzIHdpdGggTW9yZVBlcm1pc3Npb24uamF2YS4KLSAqIDQuIHRlc3REb1ByaXZpbGVnZUZhaWx1cmUgc2hvd3MgdGhlIHJldmVyc2UgY2FsbCBvcmRlciBvZiBNb3JlUGVybWlzc2lvbiBhbmQgTGVzc1Blcm1pc3Npb24KLSAqIGZyb20gdGVzdERvUHJpdmlsZWdlZFBhc3NlZC4KLSAqIDUuIHRlc3RBY2Nlc3NDb250cm9sQ29udGV4dEZhaWx1cmUgc2hvd3MgdGhlIEFjY2Vzc0NvbnRleHQgd2hpY2ggY29udGFpbnMgYSBuby1wZXJtaXNzaW9uIGNsYXNzCi0gKiBvbiB0aGUgc3RhY2sgY2FuIGNhdXNlIGEgZmFpbHVyZS4gSW4gb3VyIGNhc2UsIHRoZSBuby1wZXJtaXNzaW9uIGNsYXNzIGlzCi0gKiBMZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0LgotICovCi0KLXB1YmxpYyBjbGFzcyBKYXZhMlNlY1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgLy8gU3RhdGljIHZhcmlhYmxlIHRvIGtlZXAgdGhlIHRlc3QgcmVzdWx0IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlc3RSZXN1bHQgPSAiIjsKLQotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICBwdWJsaWMgSmF2YTJTZWNUZXN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuSmF2YTJTZWNUZXN0IGN0b3IgMSIpOwotICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZShUaW1lWm9uZS5nZXREZWZhdWx0KCkpOwotICAgICAgICBTdHJpbmcgREFURV9GT1JNQVQgPSAieXl5eS1NTS1kZCBISDptbTpzcyI7Ci0gICAgICAgIGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdChEQVRFX0ZPUk1BVCk7Ci0gICAgICAgIHNkZi5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXREZWZhdWx0KCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgdGltZSA9PiAiICsgc2RmLmZvcm1hdChjYWwuZ2V0VGltZSgpKSArICJcbiIpOwotICAgIH0KLQotICAgIC8vIENvbnN0cnVjdG9yCi0gICAgcHVibGljIEphdmEyU2VjVGVzdChTdHJpbmcgYXJnKSB7Ci0gICAgICAgIHN1cGVyKGFyZyk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5KYXZhMlNlY1Rlc3QgY3RvciAyIik7Ci0gICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIFN0cmluZyBEQVRFX0ZPUk1BVCA9ICJ5eXl5LU1NLWRkIEhIOm1tOnNzIjsKLSAgICAgICAgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0KERBVEVfRk9STUFUKTsKLSAgICAgICAgc2RmLnNldFRpbWVab25lKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3VycmVudCB0aW1lID0+ICIgKyBzZGYuZm9ybWF0KGNhbC5nZXRUaW1lKCkpICsgIlxuIik7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgaXMgYWRkZWQgZm9yIHJ1bm5pbmcgdGhpcyB0ZXN0IGFzIGEgcHVyZSBqdW5pdCB0ZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQotICAgIH0KLQotICAgIC8vIFRoaXMgbWV0aG9kIGlzIGFkZGVkIGZvciBydW5uaW5nIHRoaXMgdGVzdCBhcyBhIHB1cmUganVuaXQgdGVzdAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXZhMlNlY1Rlc3QuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdGVzdE5vUHJpdmlsZWdlZFN1Y2Nlc3NlZAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJpdmlsZWdlU3VjY2Vzc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3ROb1ByaXZpbGVnZVN1Y2Nlc3NlZCBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nID0gIlRoaXMgbGluZSBpcyBmcm9tIHB1YmxpYy50eHQuIjsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdE5vUHJpdmlsZWdlZFN1Y2Nlc3NlZCgpIGJlZ2lucyIpOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWN1cml0eSBtYW5hZ2VyIGlzIGVuYWJsZWQgb3Igbm90LgotICAgICAgICAvLyBJZiBub3QsIHR1cm4gaXQgb24KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVuIHRlc3QgV0lUSE9VVCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCB3cmFwcGVyCi0gICAgICAgIEFjdGlvbiBkcCA9IG5ldyBBY3Rpb24oInB1YmxpYy9wdWJsaWMudHh0Iik7Ci0gICAgICAgIE1vcmVQZXJtaXNzaW9uIG1wID0gbmV3IE1vcmVQZXJtaXNzaW9uKGRwLCBmYWxzZSk7Ci0gICAgICAgIExlc3NQZXJtaXNzaW9uIGxwID0gbmV3IExlc3NQZXJtaXNzaW9uKG1wLCBmYWxzZSk7Ci0gICAgICAgIGxwLnRha2VBY3Rpb24oKTsKLQotICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVycyB3aXRoaW4gdGhlIHJlc3VsdCBzdHJpbmcKLSAgICAgICAgdGVzdFJlc3VsdCA9IHRlc3RSZXN1bHQucmVwbGFjZUFsbCgiXFxyIiwgIiIpOwotICAgICAgICB0ZXN0UmVzdWx0ID0gdGVzdFJlc3VsdC5yZXBsYWNlQWxsKCJcXG4iLCAiIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0aW5nIHN0cmluZyBpcyAiICsgdGVzdFJlc3VsdCk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHRoZSB0ZXN0IHJlc3VsdCBieSBjb21wYXJpbmcgdGhlIHRlc3QgcmVzdWx0IHdpdGggZXhwZWN0ZWQgc3RyaW5nCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBzdHJpbmcgY29udGVudHMgZG8gbm90IG1hdGNoLiIsCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZSh0ZXN0UmVzdWx0KSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3ROb1ByaXZpbGVnZWRTdWNjZXNzZWQoKSBlbmRzXG5cbiIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdGVzdE5vUHJpdmlsZWdlZEZhaWx1cmUKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ByaXZpbGVnZUZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJTZWNUZXN0LnRlc3RSZXN1bHQgPSAidGVzdE5vUHJpdmlsZWdlRmFpbHVyZSBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdE5vUHJpdmlsZWdlZEZhaWx1cmVkKCkgYmVnaW5zIik7Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlY3VyaXR5IGlzIGVuYWJsZSBvciBub3QuCi0gICAgICAgIC8vIGlmIGl0IGlzIG5vdCBlbmFibGVkLCB0dXJuIGl0IG9uCi0gICAgICAgIG9sZFNNID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAob2xkU00gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZW5hYmxlZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGRpc2FibGVkLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmFibGluZyB0aGUgZGVmYXVsdCBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUnVuIHRlc3Qgd2l0aCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlIHdyYXBwZXIKLSAgICAgICAgQWN0aW9uIGRwID0gbmV3IEFjdGlvbigicHJpdmF0ZS9wcml2YXRlLnR4dCIpOwotICAgICAgICBNb3JlUGVybWlzc2lvbiBtcCA9IG5ldyBNb3JlUGVybWlzc2lvbihkcCwgZmFsc2UpOwotICAgICAgICBMZXNzUGVybWlzc2lvbiBscCA9IG5ldyBMZXNzUGVybWlzc2lvbihtcCwgZmFsc2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbHAudGFrZUFjdGlvbigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSB0ZXN0IHJlc3VsdAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSXQgaXMgbm90IHRoZSBzZWN1cml0eSBleGNlcHRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24pKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIERpc2FibGUgc2VjdXJpdHkgbWFuYWdlciBpZiBpdCBpcyBlbmFibGVkIGJ5IHRoaXMgdGVzdGNzYWUKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3RpbGwgZW5hYmxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXNOb1ByaXZpbGVnZWRGYWlsdXJlKCkgZW5kc1xuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdGVzdERvUHJpdmlsZWdlZFN1Y2Nlc3NlZAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdERvUHJpdmlsZWdlU3VjY2Vzc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3REb1ByaXZpbGVnZVN1Y2Nlc3NlZCBmYWlsZWQuIjsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIG9sZFNNID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nID0gIlRoaXMgbGluZSBpcyBmcm9tIHByaXZhdGUudHh0LiI7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3REb1ByaXZpbGVnZWRTdWNjZXNzZWQoKSBiZWdpbnMiKTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VjdXJpdHkgaXMgZW5hYmxlIG9yIG5vdC4KLSAgICAgICAgLy8gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHR1cm4gaXQgb24KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVuIHRlc3Qgd2l0aCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlCi0gICAgICAgIEFjdGlvbiBkcCA9IG5ldyBBY3Rpb24oInByaXZhdGUvcHJpdmF0ZS50eHQiKTsKLSAgICAgICAgTW9yZVBlcm1pc3Npb24gbXAgPSBuZXcgTW9yZVBlcm1pc3Npb24oZHAsIHRydWUpOwotICAgICAgICBMZXNzUGVybWlzc2lvbiBscCA9IG5ldyBMZXNzUGVybWlzc2lvbihtcCwgZmFsc2UpOwotICAgICAgICBscC50YWtlQWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gRGlzYWJsZSBzZWN1cml0eSBtYW5hZ2VyIGlmIGl0IGlzIGVuYWJsZWQgYnkgdGhpcyB0ZXN0Y3NhZQotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgJiYgb2xkU00gPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdWNjZXNzZnVsbHkgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdGlsbCBlbmFibGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZW1vdmUgZXh0cmEgY2hhcmFjdGVycyB3aXRoaW4gdGhlIHJlc3VsdCBzdHJpbmcKLSAgICAgICAgdGVzdFJlc3VsdCA9IHRlc3RSZXN1bHQucmVwbGFjZUFsbCgiXFxyIiwgIiIpOwotICAgICAgICB0ZXN0UmVzdWx0ID0gdGVzdFJlc3VsdC5yZXBsYWNlQWxsKCJcXG4iLCAiIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0aW5nIHN0cmluZyBpcyAiICsgdGVzdFJlc3VsdCk7Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHRoZSB0ZXN0IHJlc3VsdCBieSBjb21wYXJpbmcgdGhlIHRlc3QgcmVzdWx0IHdpdGggZXhwZWN0ZWQgc3RyaW5nICAgICAgICAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBzdHJpbmcgY29udGVudHMgZG8gbm90IG1hdGNoLiIsCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZSh0ZXN0UmVzdWx0KSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0RG9Qcml2aWxlZ2VkU3VjY2Vzc2VkKCkgZW5kc1xuXG4iKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRlc3REb1ByaXZpbGVnZWRGYWlsdXJlCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Qcml2aWxlZ2VGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3REb1ByaXZpbGVnZUZhaWx1cmUgZmFpbGVkLiI7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTTSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJUaGlzIGxpbmUgaXMgZnJvbSBwcml2YXRlLnR4dC4iOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0RG9Qcml2aWxlZ2VkRmFpbHVyZSgpIGJlZ2lucyIpOwotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWN1cml0eSBpcyBlbmFibGUgb3Igbm90LgotICAgICAgICAvLyBJZiBpdCBpcyBub3QgZW5hYmxlZCwgdHVybiBpdCBvbgotICAgICAgICBvbGRTTSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKG9sZFNNICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGVuYWJsZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5hYmxpbmcgdGhlIGRlZmF1bHQgSmF2YSBTZWN1cml0eSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW4gdGVzdCB3aXRoIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2UKLSAgICAgICAgQWN0aW9uIGRwID0gbmV3IEFjdGlvbigicHJpdmF0ZS9wcml2YXRlLnR4dCIpOwotICAgICAgICBNb3JlUGVybWlzc2lvbiBtcCA9IG5ldyBNb3JlUGVybWlzc2lvbihkcCwgZmFsc2UpOwotICAgICAgICBMZXNzUGVybWlzc2lvbiBscCA9IG5ldyBMZXNzUGVybWlzc2lvbihtcCwgdHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtcC50YWtlQWN0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHRlc3QgcmVzdWx0Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJdCBpcyBub3QgdGhlIHNlY3VyaXR5IGV4Y2VwdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbikpOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgJiYgb2xkU00gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdWNjZXNzZnVsbHkgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdERvUHJpdmlsZWdlZEZhaWx1cmUoKSBlbmRzXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB0ZXN0QWNjZXNzQ29udHJvbENvbnRleHRGYWlsdXJlCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQ29udHJvbENvbnRleHRGYWlsdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmEyU2VjVGVzdC50ZXN0UmVzdWx0ID0gInRlc3RBY2Nlc3NDb250cm9sQ29udGV4dEZhaWx1cmUgZmFpbGVkLiI7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTTSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJUaGlzIGxpbmUgaXMgZnJvbSBwcml2YXRlLnR4dC4iOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0QWNjZXNzQ29udHJvbENvbnRleHRGYWlsdXJlKCkgYmVnaW5zIik7Ci0gICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHNlY3VyaXR5IGlzIGVuYWJsZSBvciBub3QuCi0gICAgICAgIC8vIElmIGl0IGlzIG5vdCBlbmFibGVkLCB0dXJuIGl0IG9uCi0gICAgICAgIG9sZFNNID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAob2xkU00gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZW5hYmxlZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGRpc2FibGVkLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmFibGluZyB0aGUgZGVmYXVsdCBKYXZhIFNlY3VyaXR5IE1hbmFnZXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1biB0ZXN0IHdpdGggQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZQotICAgICAgICBBY3Rpb24gZHAgPSBuZXcgQWN0aW9uKCJwcml2YXRlL3ByaXZhdGUudHh0Iik7Ci0gICAgICAgIE1vcmVQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQgbXAgPSBuZXcgTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dChkcCwgZmFsc2UpOwotICAgICAgICBMZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0IGxwID0gbmV3IExlc3NQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQobXAsIHRydWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbHAudGFrZUFjdGlvbigpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVmVyaWZ5IHRoZSB0ZXN0IHJlc3VsdAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSXQgaXMgbm90IHRoZSBzZWN1cml0eSBleGNlcHRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGUgaW5zdGFuY2VvZiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xFeGNlcHRpb24pKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGlzYWJsZSBzZWN1cml0eSBtYW5hZ2VyIGlmIGl0IGlzIGVuYWJsZWQgYnkgdGhpcyB0ZXN0Y3NhZQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmIG9sZFNNID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdGlsbCBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RBY2Nlc3NDb250cm9sQ29udGV4dEZhaWx1cmUoKSBlbmRzXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gMiBiZWdpbnMKLQotICAgIC8qKgotICAgICAqIHRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uU3VjY2Vzc2VkCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpdmlsZWdlZEV4Y2VwdGlvblN1Y2Nlc3NlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXZhMlNlY1Rlc3QudGVzdFJlc3VsdCA9ICJ0ZXN0UHJpdmllbGdlZEV4Y2VwdGlvblN1Y2Nlc3NlZCBmYWlsZWQiOwotICAgICAgICBTZWN1cml0eU1hbmFnZXIgb2xkU00gPSBudWxsOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiVGhpcyBsaW5lIGlzIGZyb20gcHJpdmF0ZS50eHQuIjsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25TdWNjZXNzZWQoKSBiZWdpbnMiKTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VjdXJpdHkgaXMgZW5hYmxlIG9yIG5vdC4KLSAgICAgICAgLy8gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHR1cm4gaXQgb24KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVuIHRlc3Qgd2l0aCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlCi0gICAgICAgIEFjdGlvbiBkcCA9IG5ldyBBY3Rpb24oInByaXZhdGUvcHJpdmF0ZS50eHQiKTsKLSAgICAgICAgTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIG1wID0KLSAgICAgICAgICAgICAgICBuZXcgTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKGRwLCB0cnVlKTsKLSAgICAgICAgTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGxwID0KLSAgICAgICAgICAgICAgICBuZXcgTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKG1wLCBmYWxzZSk7Ci0gICAgICAgIGxwLnRha2VBY3Rpb24oKTsKLQotICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSBleHRyYSBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgcmVzdWx0IHN0cmluZwotICAgICAgICB0ZXN0UmVzdWx0ID0gdGVzdFJlc3VsdC5yZXBsYWNlQWxsKCJcXHIiLCAiIik7Ci0gICAgICAgIHRlc3RSZXN1bHQgPSB0ZXN0UmVzdWx0LnJlcGxhY2VBbGwoIlxcbiIsICIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0RG9Qcml2aWxlZ2UncyByZXN1bHQgc3RyaW5nIGlzICIgKyB0ZXN0UmVzdWx0KTsKLQotICAgICAgICAvLyBWZXJpZnkgdGhlIHRlc3QgcmVzdWx0IGJ5IGNvbXBhcmluZyB0aGUgdGVzdCByZXN1bHQgd2l0aCBleHBlY3RlZCBzdHJpbmcgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHN0cmluZyBjb250ZW50cyBkbyBub3QgbWF0Y2guIiwKLSAgICAgICAgICAgICAgICAgICBleHBlY3RlZFN0cmluZy5lcXVhbHNJZ25vcmVDYXNlKHRlc3RSZXN1bHQpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3REb1ByaXZpbGVnZVN1Y2Nlc3NlZCgpIGVuZHNcblxuIik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB0ZXN0UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbkZhaWx1cmUKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXZhMlNlY1Rlc3QudGVzdFJlc3VsdCA9ICJ0ZXN0UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbkZhaWx1cmUgZmFpbGVkLiI7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTTSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFN0cmluZyA9ICJUaGlzIGxpbmUgaXMgZnJvbSBwcml2YXRlLnR4dC4iOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0UHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbkZhaWx1cmUoKSBiZWdpbnMiKTsKLSAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgc2VjdXJpdHkgaXMgZW5hYmxlIG9yIG5vdC4KLSAgICAgICAgLy8gSWYgaXQgaXMgbm90IGVuYWJsZWQsIHR1cm4gaXQgb24KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUnVuIHRlc3Qgd2l0aCBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlCi0gICAgICAgIEFjdGlvbiBkcCA9IG5ldyBBY3Rpb24oInByaXZhdGUvcHJpdmF0ZS50eHQiKTsKLSAgICAgICAgTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIG1wID0KLSAgICAgICAgICAgICAgICBuZXcgTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKGRwLCBmYWxzZSk7Ci0gICAgICAgIExlc3NQZXJtaXNzaW9uUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbiBscCA9Ci0gICAgICAgICAgICAgICAgbmV3IExlc3NQZXJtaXNzaW9uUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbihtcCwgdHJ1ZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtcC50YWtlQWN0aW9uKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBWZXJpZnkgdGhlIHRlc3QgcmVzdWx0Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJdCBpcyBub3QgdGhlIHNlY3VyaXR5IGV4Y2VwdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAoZSBpbnN0YW5jZW9mIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbikpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRGlzYWJsZSBzZWN1cml0eSBtYW5hZ2VyIGlmIGl0IGlzIGVuYWJsZWQgYnkgdGhpcyB0ZXN0Y3NhZQotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmIG9sZFNNID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG51bGwpOwotICAgICAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3VjY2Vzc2Z1bGx5IGRpc2FibGVkLiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdGlsbCBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uRmFpbHVyZSgpIGVuZHNcblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZXN0Q2hlY2tQZXJtaXNzaW9uQWxsb3dlZAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrUGVybWlzc2lvbkFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSmF2YTJTZWNUZXN0LnRlc3RSZXN1bHQgPSAidGVzdENoZWNrUGVybWlzc2lvbkFsbG93ZWQgZmFpbGVkLiI7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTTSA9IG51bGw7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RDaGVja1Blcm1pc3Npb25BbGxvd2VkKCkgYmVnaW5zLlxuIik7Ci0gICAgICAgIGJvb2xlYW4gYWxsb3dlZCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAicHVibGljL3B1YmxpYy50eHQiOwotCi0gICAgICAgIG9sZFNNID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAob2xkU00gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZW5hYmxlZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TZWN1cml0eSBNYW5hZ2VyIGlzIGRpc2FibGVkLiIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbmFibGluZyB0aGUgZGVmYXVsdCBKYXZhIFNlY3VyaXR5IE1hbmFnZXIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBQcmludCBvdXQgbWF2ZW4ncyBiYXNlLGJ1aWxkLCBhbmQgdGVzdCBkaXJlY290b3JpZXMKLSAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiYXNlZGlyID0+ICIgKyBiYXNlRGlyKTsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIFwgKGJhY2sgc2xhc2gpIHRvIC8gKGZvcndhcmQgc2xhc2gpCi0gICAgICAgICAgICBTdHJpbmcgYmFzZURpck0gPSBiYXNlRGlyLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZURpck0gPT4gIiArIGJhc2VEaXJNKTsKLSAgICAgICAgICAgIFN0cmluZyBmcyA9ICIvIjsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGZpbGUgVVJMCi0gICAgICAgICAgICBTdHJpbmcgZmlsZVVSTCA9IGJhc2VEaXJNICsgZnMgKyAidGVzdC1yZXNvdXJjZXMiICsgZnMgKyAiamF2YTJzZWMiICsgZnMgKyBmaWxlTmFtZTsKLSAgICAgICAgICAgIFBlcm1pc3Npb24gcGVybSA9IG5ldyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uKGZpbGVVUkwsICJyZWFkIik7Ci0gICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihwZXJtKTsKLSAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJBY2Nlc3NpbmcgdG8gcHVibGljLnR4dCBmaWxlIGlzIGRlbmllZDsgVGVzdCBmYWlsZWQuIiwgYWxsb3dlZCk7Ci0gICAgICAgICAgICAvLyBEaXNhYmxlIHNlY3VyaXR5IG1hbmFnZXIgaWYgaXQgaXMgZW5hYmxlZCBieSB0aGlzIHRlc3Rjc2FlCi0gICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpICE9IG51bGwgJiYgb2xkU00gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHkgTWFuYWdlciBpcyBzdWNjZXNzZnVsbHkgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN0aWxsIGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxudGVzdENoZWNrUGVybWlzc2lvbkFsbG93ZWQoKSBlbmRzLlxuIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogdGVzdENoZWNrUGVybWlzc2lvbkRlbmllZAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrUGVybWlzc2lvbkRlbmllZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXZhMlNlY1Rlc3QudGVzdFJlc3VsdCA9ICJ0ZXN0Q2hlY2tQZXJtaXNzaW9uRGVuaWVkIGZhaWxlZCI7Ci0gICAgICAgIFNlY3VyaXR5TWFuYWdlciBvbGRTTSA9IG51bGw7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbnRlc3RDaGVja1Blcm1pc3Npb25EZW5pZWQoKSBiZWdpbnMuXG4iKTsKLSAgICAgICAgYm9vbGVhbiBkZW5pZWQgPSB0cnVlOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAicHJpdmF0ZS9wcml2YXRlLnR4dCI7Ci0KLSAgICAgICAgb2xkU00gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChvbGRTTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU2VjdXJpdHkgTWFuYWdlciBpcyBlbmFibGVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5IE1hbmFnZXIgaXMgZGlzYWJsZWQuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuYWJsaW5nIHRoZSBkZWZhdWx0IEphdmEgU2VjdXJpdHkgTWFuYWdlciIpOwotICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihuZXcgU2VjdXJpdHlNYW5hZ2VyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFByaW50IG91dCBtYXZlbidzIGJhc2UsYnVpbGQsIGFuZCB0ZXN0IGRpcmVjb3RvcmllcwotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBBYnN0cmFjdFRlc3RDYXNlLmJhc2VkaXI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2VkaXIgPT4gIiArIGJhc2VEaXIpOwotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBcIChiYWNrIHNsYXNoKSB0byAvIChmb3J3YXJkIHNsYXNoKQotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXJNID0gYmFzZURpci5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2VEaXJNID0+ICIgKyBiYXNlRGlyTSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmcyA9ICIvIjsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGZpbGUgVVJMCi0gICAgICAgICAgICBTdHJpbmcgZmlsZVVSTCA9IGJhc2VEaXJNICsgZnMgKyAidGVzdC1yZXNvdXJjZXMiICsgZnMgKyAiamF2YTJzZWMiICsgZnMgKyBmaWxlTmFtZTsKLSAgICAgICAgICAgIFBlcm1pc3Npb24gcGVybSA9IG5ldyBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uKGZpbGVVUkwsICJyZWFkIik7Ci0gICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihwZXJtKTsKLSAgICAgICAgICAgIGRlbmllZCA9IGZhbHNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgZGVuaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkFjY2Vzc2luZyB0byBwcml2YXRlLnR4dCBmaWxlIGlzIGFsbG93ZWQ7IFRlc3QgZmFpbGVkLiIsIGRlbmllZCk7Ci0KLSAgICAgICAgICAgIC8vIERpc2FibGUgc2VjdXJpdHkgbWFuYWdlciBpZiBpdCBpcyBlbmFibGVkIGJ5IHRoaXMgdGVzdGNzYWUKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgIT0gbnVsbCAmJiBvbGRTTSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eSBNYW5hZ2VyIGlzIHN1Y2Nlc3NmdWxseSBkaXNhYmxlZC4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5IE1hbmFnZXIgaXMgc3RpbGwgZW5hYmxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG50ZXN0Q2hlY2tQZXJtaXNzaW9uRGVuaWVkKCkgZW5kcy5cbiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2ludGVyZi9BY3Rvci5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2ludGVyZi9BY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODdhMWYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9pbnRlcmYvQWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmludGVyZjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgQWN0b3IKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEFjdG9yIHsKLSAgICBwdWJsaWMgdm9pZCB0YWtlQWN0aW9uKCk7Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzL0xlc3NQZXJtaXNzaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbGVzcy9MZXNzUGVybWlzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzliMjE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzL0xlc3NQZXJtaXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5sZXNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmludGVyZi5BY3RvcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotCi0vKioKLSAqIExlc3NQZXJtaXNzaW9uIGhhcyBubyByZWFkIHBlcm1pc3Npb24gdG8gdGhlIHByaXZhdGUudHh0IGZpbGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGVzc1Blcm1pc3Npb24gaW1wbGVtZW50cyBBY3RvciB7Ci0KLSAgICBwcml2YXRlIEFjdG9yIF9hY3RvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gX3VzaW5nRG9Qcml2aWxlZ2U7Ci0KLSAgICAvLyBDb25zdHJ1dG9yCi0gICAgcHVibGljIExlc3NQZXJtaXNzaW9uKEFjdG9yIGEsIGJvb2xlYW4gdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICBfYWN0b3IgPSBhOwotICAgICAgICBfdXNpbmdEb1ByaXZpbGVnZSA9IHVzaW5nRG9Qcml2aWxlZ2U7Ci0gICAgfQotCi0gICAgLy8gSW1wbGVtZW50IEFjdG9yJ3MgdGFrZUFjdGlvbiBtZXRob2QKLSAgICBwdWJsaWMgdm9pZCB0YWtlQWN0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKF91c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIEFjY2Vzc0NvbnRyb2xsZXIncyBkb1ByaXZpbGVnZQotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBVc2Ugbm8gQWNjZXNzQ29udHJvbGxlcidzIGRvUHJpdmlsZWdlCi0gICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbGVzcy9MZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbGVzcy9MZXNzUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTdiYTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvTGVzc1Blcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkubGVzczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5pbnRlcmYuQWN0b3I7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotCi0vKioKLSAqIExlc3NQZXJtaXNzaW9uIGhhcyBubyByZWFkIHBlcm1pc3Npb24gdG8gdGhlIHByaXZhdGUudHh0IGZpbGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGVzc1Blcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dCBpbXBsZW1lbnRzIEFjdG9yIHsKLQotICAgIHByaXZhdGUgQWN0b3IgX2FjdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBfdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIC8vIENvbnN0cnV0b3IKLSAgICBwdWJsaWMgTGVzc1Blcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dChBY3RvciBhLCBib29sZWFuIHVzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgX2FjdG9yID0gYTsKLSAgICAgICAgX3VzaW5nRG9Qcml2aWxlZ2UgPSB1c2luZ0RvUHJpdmlsZWdlOwotICAgIH0KLQotICAgIC8vIEltcGxlbWVudCBBY3RvcidzIHRha2VBY3Rpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGFrZUFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgICAgIC8vIERlbW9zdHJhdGUgdGhlIHVzYWdlIG9mIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByaXZpbGVnZUFjdGlvbiBhY3Rpb24sIEFjY2Vzc0NvbnRleHQgY3R4KQotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFjYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVzZSBubyBkb1ByaXZpbGVnZWQKLSAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9sZXNzL0xlc3NQZXJtaXNzaW9uUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmY5YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L2xlc3MvTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5sZXNzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmludGVyZi5BY3RvcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotCi0vKioKLSAqIExlc3NQZXJtaXNzaW9uIGhhcyBubyByZWFkIHBlcm1pc3Npb24gdG8gdGhlIHByaXZhdGUudHh0IGZpbGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgTGVzc1Blcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGltcGxlbWVudHMgQWN0b3IgewotCi0gICAgcHJpdmF0ZSBBY3RvciBfYWN0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF91c2luZ0RvUHJpdmlsZWdlOwotCi0gICAgLy8gQ29uc3RydXRvcgotICAgIHB1YmxpYyBMZXNzUGVybWlzc2lvblByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oQWN0b3IgYSwgYm9vbGVhbiB1c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgIF9hY3RvciA9IGE7Ci0gICAgICAgIF91c2luZ0RvUHJpdmlsZWdlID0gdXNpbmdEb1ByaXZpbGVnZTsKLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnQgQWN0b3IncyB0YWtlQWN0aW9uIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRha2VBY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3VzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBEZW1vc3RyYXRlIHRoZSB1c2FnZSBvZiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGFjdGlvbikKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIG5vIGRvUHJpdmlsZWdlZAotICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb24uamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlL01vcmVQZXJtaXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTczOTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5Lm1vcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuaW50ZXJmLkFjdG9yOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0vKioKLSAqIE1vcmVQZXJtaXNzaW9uIGhhcyByZWFkIHBlcm1pc3Npb24gdG8gYm90aCBwdWJsaWMudHh0IGFuZCBwcml2YXRlLnR4dAotICovCi0KLXB1YmxpYyBjbGFzcyBNb3JlUGVybWlzc2lvbiBpbXBsZW1lbnRzIEFjdG9yIHsKLQotICAgIHByaXZhdGUgQWN0b3IgX2FjdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBfdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIC8vIENvbnN0cnVjdG9yCi0gICAgcHVibGljIE1vcmVQZXJtaXNzaW9uKEFjdG9yIGEsIGJvb2xlYW4gdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICBfYWN0b3IgPSBhOwotICAgICAgICBfdXNpbmdEb1ByaXZpbGVnZSA9IHVzaW5nRG9Qcml2aWxlZ2U7Ci0KLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRpbmcgQWN0b3IncyB0YWtlQWN0aW9uIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRha2VBY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3VzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBVc2UgQWNjZXNzQ29udHJvbGxlcidzIGRvUHJpdmlsZWdlCi0gICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVzZSBubyBBY2Nlc3NDb250cm9sbGVyJ3MgZG9Qcml2aWxlZ2UKLSAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlL01vcmVQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlL01vcmVQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlOGY5NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2phdmEvc2VjdXJpdHkvbW9yZS9Nb3JlUGVybWlzc2lvbkFjY2Vzc0NvbnRyb2xDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5tb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BYnN0cmFjdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5pbnRlcmYuQWN0b3I7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci0KLS8qKgotICogTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sbGVyQ29udGV4dCBoYXMgcmVhZCBwZXJtaXNzaW9uIHRvIGJvdGggcHVibGljLnR4dCBhbmQgcHJpdmF0ZS50eHQKLSAqLwotCi1wdWJsaWMgY2xhc3MgTW9yZVBlcm1pc3Npb25BY2Nlc3NDb250cm9sQ29udGV4dCBpbXBsZW1lbnRzIEFjdG9yIHsKLQotICAgIHByaXZhdGUgQWN0b3IgX2FjdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBfdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIC8vIENvbnN0cnVjdG9yCi0gICAgcHVibGljIE1vcmVQZXJtaXNzaW9uQWNjZXNzQ29udHJvbENvbnRleHQoQWN0b3IgYSwgYm9vbGVhbiB1c2luZ0RvUHJpdmlsZWdlKSB7Ci0gICAgICAgIF9hY3RvciA9IGE7Ci0gICAgICAgIF91c2luZ0RvUHJpdmlsZWdlID0gdXNpbmdEb1ByaXZpbGVnZTsKLQotICAgIH0KLQotICAgIC8vIEltcGxlbWVudGluZyBBY3RvcidzIHRha2VBY3Rpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgdGFrZUFjdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChfdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICAgICAgICAgIC8vIFByaW50IG91dCBtYXZlbidzIGJhc2UsYnVpbGQsIGFuZCB0ZXN0IGRpcmVjb3RvcmllcwotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZWRpciA9PiAiICsgYmFzZURpcik7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSBcIChiYWNrIHNsYXNoKSB0byAvIChmb3J3YXJkIHNsYXNoKQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyTSA9IGJhc2VEaXIucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYmFzZURpck0gPT4gIiArIGJhc2VEaXJNKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBmcyA9ICIvIjsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAicHJpdmF0ZS9wcml2YXRlLnR4dCI7Ci0KLSAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgZmlsZSBVUkwKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZVVSTCA9IGJhc2VEaXJNICsgZnMgKyAidGVzdC1yZXNvdXJjZXMiICsgZnMgKyAiamF2YTJzZWMiICsgZnMgKyBmaWxlTmFtZTsKLSAgICAgICAgICAgICAgICBQZXJtaXNzaW9uIHBlcm0gPSBuZXcgamF2YS5pby5GaWxlUGVybWlzc2lvbihmaWxlVVJMLCAicmVhZCIpOwotICAgICAgICAgICAgICAgIGFjYy5jaGVja1Blcm1pc3Npb24ocGVybSk7Ci0gICAgICAgICAgICAgICAgLy8gRGVtb3N0cmF0ZSB0aGUgdXNhZ2Ugb2YgQWNjZXNzQ29udHJvbGxlcidzIGRvUHJpdmlsZWdlKFByaXZpbGVnZUFjdGlvbiBhY3Rpb24sIEFjY2Vzc0NvbnRleHQgY3R4KQotICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hY3Rvci50YWtlQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFjYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFVzZSBubyBkb1ByaXZpbGVnZWQKLSAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF2YS9zZWN1cml0eS9tb3JlL01vcmVQZXJtaXNzaW9uUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbi5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmNlYzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXZhL3NlY3VyaXR5L21vcmUvTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5tb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LmludGVyZi5BY3RvcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotLyoqCi0gKiBNb3JlUGVybWlzc2lvbiBoYXMgcmVhZCBwZXJtaXNzaW9uIHRvIGJvdGggcHVibGljLnR4dCBhbmQgcHJpdmF0ZS50eHQKLSAqLwotCi1wdWJsaWMgY2xhc3MgTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGltcGxlbWVudHMgQWN0b3IgewotCi0gICAgcHJpdmF0ZSBBY3RvciBfYWN0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIF91c2luZ0RvUHJpdmlsZWdlOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBwdWJsaWMgTW9yZVBlcm1pc3Npb25Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKEFjdG9yIGEsIGJvb2xlYW4gdXNpbmdEb1ByaXZpbGVnZSkgewotICAgICAgICBfYWN0b3IgPSBhOwotICAgICAgICBfdXNpbmdEb1ByaXZpbGVnZSA9IHVzaW5nRG9Qcml2aWxlZ2U7Ci0KLSAgICB9Ci0KLSAgICAvLyBJbXBsZW1lbnRpbmcgQWN0b3IncyB0YWtlQWN0aW9uIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHRha2VBY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoX3VzaW5nRG9Qcml2aWxlZ2UpIHsKLSAgICAgICAgICAgICAgICAvLyBEZW1vc3RyYXRlIHRoZSB1c2FnZSBvZiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uIGFjdGlvbikKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWN0b3IudGFrZUFjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIG5vIGRvUHJpdmlsZWdlCi0gICAgICAgICAgICAgICAgX2FjdG9yLnRha2VBY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL21pc2MvTWlzY1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWlzYy9NaXNjVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY1OTQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWlzYy9NaXNjVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1pc2M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTWlzY1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZQotICAgICAqLwotICAgIHB1YmxpYyBNaXNjVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF4aXNGYXVsdCgpIHsKLSAgICAgICAgRXhjZXB0aW9uIGUgPSBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihuZXcgRXhjZXB0aW9uKCkpOwotICAgICAgICBhc3NlcnROb3RTYW1lKEF4aXNGYXVsdC5tYWtlRmF1bHQoZSksIGUpOwotCi0gICAgICAgIGUgPSBuZXcgQXhpc0ZhdWx0KCIiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL0FkZGluZ0hhbmRsZXJUb0VhY2hQaGFzZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL0FkZGluZ0hhbmRsZXJUb0VhY2hQaGFzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhZmQ2My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcnVsZS9BZGRpbmdIYW5kbGVyVG9FYWNoUGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlSG9sZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFkZGluZ0hhbmRsZXJUb0VhY2hQaGFzZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnOwotCi0gICAgcHVibGljIEFkZGluZ0hhbmRsZXJUb0VhY2hQaGFzZVRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhhc2VSdWxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL1RPRE8gZml4IG1lCi0gICAgICAgIGF4aXNDb25maWcgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgTGlzdCBpblBoYXNlID0gYXhpc0NvbmZpZy5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgUGhhc2UgdHJhbnNwb3J0SU4gPSBuZXcgUGhhc2UoIlRyYW5zcG9ydEluIik7Ci0gICAgICAgIFBoYXNlIHByZURpc3BhdGNoID0gbmV3IFBoYXNlKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBEaXNwYXRjaFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotLy8KLSAgICAgICAgZGlzcGF0Y2hQaGFzZS5zZXROYW1lKCJEaXNwYXRjaCIpOwotICAgICAgICBpblBoYXNlLmFkZCh0cmFuc3BvcnRJTik7Ci0gICAgICAgIGluUGhhc2UuYWRkKHByZURpc3BhdGNoKTsKLSAgICAgICAgaW5QaGFzZS5hZGQoZGlzcGF0Y2hQaGFzZSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uZ2V0UnVsZXMoKS5zZXRQaGFzZU5hbWUoIioiKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihpblBoYXNlKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5QaGFzZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBpblBoYXNlLmdldChpKTsKLSAgICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgaWYgKGgxLmVxdWFscyhoYW5kbGVyKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlNvbWUgdGhpbmcgaGFzIGdvbmUgd3JvbmcgaG5hZGxlciBkb2VzIG5vdCBleGl0IGluIHRoZSBwaGFzZSA6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwaGFzZS5nZXRQaGFzZU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhhc2VSdWxlc1dpdGhQaGFzZUZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIC8vVE9ETyBmaXggbWUKLSAgICAgICAgYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBMaXN0IGluUGhhc2UgPSBheGlzQ29uZmlnLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBQaGFzZSB0cmFuc3BvcnRJTiA9IG5ldyBQaGFzZSgiVHJhbnNwb3J0SW4iKTsKLSAgICAgICAgUGhhc2UgcHJlRGlzcGF0Y2ggPSBuZXcgUGhhc2UoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0vLwotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0gICAgICAgIGluUGhhc2UuYWRkKHRyYW5zcG9ydElOKTsKLSAgICAgICAgaW5QaGFzZS5hZGQocHJlRGlzcGF0Y2gpOwotICAgICAgICBpblBoYXNlLmFkZChkaXNwYXRjaFBoYXNlKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5nZXRSdWxlcygpLnNldFBoYXNlTmFtZSgiKiIpOwotICAgICAgICBobS5nZXRSdWxlcygpLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0KLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIoaW5QaGFzZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluUGhhc2Uuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBpblBoYXNlLmdldChpKTsKLSAgICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOwotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldCgwKTsKLSAgICAgICAgICAgIGlmICghaDEuZXF1YWxzKGhhbmRsZXIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU29tZSB0aGluZyBoYXMgZ29uZSB3cm9uZyBobmFkbGVyIGRvZXMgbm90IGV4aXQgYXMgcGhhc2UgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3QgaGFuZGxlciB0aGUgcGhhc2UgOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGhhc2UuZ2V0UGhhc2VOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlUnVsZXNXaXRoQWZ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPIGZpeCBtZQotICAgICAgICBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIExpc3QgaW5QaGFzZSA9IGF4aXNDb25maWcuZ2V0SW5GbG93UGhhc2VzKCk7Ci0gICAgICAgIFBoYXNlIHRyYW5zcG9ydElOID0gbmV3IFBoYXNlKCJUcmFuc3BvcnRJbiIpOwotICAgICAgICBQaGFzZSBwcmVEaXNwYXRjaCA9IG5ldyBQaGFzZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBkaXNwYXRjaFBoYXNlID0gbmV3IERpc3BhdGNoUGhhc2UoKTsKLS8vCi0gICAgICAgIGRpc3BhdGNoUGhhc2Uuc2V0TmFtZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgaW5QaGFzZS5hZGQodHJhbnNwb3J0SU4pOwotICAgICAgICBpblBoYXNlLmFkZChwcmVEaXNwYXRjaCk7Ci0gICAgICAgIGluUGhhc2UuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLmdldFJ1bGVzKCkuc2V0UGhhc2VOYW1lKCIqIik7Ci0gICAgICAgIGhtLmdldFJ1bGVzKCkuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihpblBoYXNlKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5QaGFzZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIGluUGhhc2UuZ2V0KGkpOwotICAgICAgICAgICAgTGlzdCBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KDApOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChoYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0UnVsZXMoKS5nZXRBZnRlcigpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1BoYXNlUnVsZUhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1BoYXNlUnVsZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxMzA3MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcnVsZS9QaGFzZVJ1bGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uSGFuZGxlckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGhhc2VSdWxlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBoYXNlUnVsZUhhbmRsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwdWJsaWMgUGhhc2VSdWxlSGFuZGxlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2VSdWxlSGFuZGxlcihTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbmFtZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8oIkkgYW0gIiArIG5hbWUgKyAiIEhhbmRsZXIgUnVubmluZyA6KSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KEhhbmRsZXJEZXNjcmlwdGlvbiBoYW5kbGVyZGVzYykgewotICAgICAgICBzdXBlci5pbml0KGhhbmRsZXJkZXNjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcnVsZS9QaGFzZVJ1bGVUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9waGFzZXJ1bGUvUGhhc2VSdWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0YzFjNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcnVsZS9QaGFzZVJ1bGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5IYW5kbGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QaGFzZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucGhhc2VyZXNvbHZlci5QaGFzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcmVzb2x2ZXIuUGhhc2VIb2xkZXI7Ci0KLS8qKgotICogVGVzdCB2YXJpb3VzIFBoYXNlUnVsZSBjb25maWd1cmF0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VSdWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvLyBTb21lIHNoYXJlZCBIYW5kbGVycyBhbmQgSGFuZGxlckRlc2NyaXB0aW9ucwotICAgIC8vIFRPRE8gOiBGYWN0b3Igb3V0IHNoYXJlZCBkYXRhIGZvciB0aGVzZSB0ZXN0cwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJlZm9yZSgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBQaGFzZSBwMSA9IG5ldyBQaGFzZSgiUGhhc2VBIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDEpOwotICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDIpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZyA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KG5ldyBBeGlzQ29uZmlndXJhdGlvbigpKS5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKHBoYXNlcyk7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMSkuc2V0TmFtZSgiRmlyc3QiKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLnNldE5hbWUoIkgxIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgyKS5zZXROYW1lKCJTZWNvbmQiKTsKLSAgICAgICAgaDIuaW5pdChobTEpOwotICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgIGhtMS5zZXROYW1lKCJIMiIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGUxLnNldEJlZm9yZSgiSDEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotCi0gICAgICAgIExpc3QgaGFuZGxlcnMgPSBwMS5nZXRIYW5kbGVycygpOwotICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KDApOwotICAgICAgICBpZiAoaGFuZGxlciAhPSBoMikgewotICAgICAgICAgICAgZmFpbCgiQ29tcHV0ZWQgSG5hZGxlciBvcmRlciBpcyB3cm9uZyAiKTsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldCgxKTsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gaDEpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvbXB1dGVkIEhuYWRsZXIgb3JkZXIgaXMgd3JvbmcgIik7Ci0gICAgICAgIH0KLSAgICAgICAgcDEuaW52b2tlKG1zZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJlZm9yZXdpdGhOb0ZpcnN0KCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFBoYXNlIHAxID0gbmV3IFBoYXNlKCJQaGFzZUEiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgIFBoYXNlIHAyID0gbmV3IFBoYXNlKCJQaGFzZUIiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMik7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnID0KLSAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQobmV3IEF4aXNDb25maWd1cmF0aW9uKCkpLmNyZWF0ZU1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKHBoYXNlcyk7Ci0KLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgyKS5zZXROYW1lKCJTZWNvbmQiKTsKLSAgICAgICAgaDIuaW5pdChobTEpOwotICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgIGhtMS5zZXROYW1lKCJIMiIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGUxLnNldEJlZm9yZSgiSDEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMSkuc2V0TmFtZSgiRmlyc3QiKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLnNldE5hbWUoIkgxIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBMaXN0IGhhbmRsZXJzID0gcDEuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldCgwKTsKLSAgICAgICAgaWYgKGhhbmRsZXIgIT0gaDIpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvbXB1dGVkIEhhbmRsZXIgb3JkZXIgaXMgd3JvbmcgIik7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoMSk7Ci0gICAgICAgIGlmIChoYW5kbGVyICE9IGgxKSB7Ci0gICAgICAgICAgICBmYWlsKCJDb21wdXRlZCBIYW5kbGVyIG9yZGVyIGlzIHdyb25nICIpOwotICAgICAgICB9Ci0gICAgICAgIHAxLmludm9rZShtc2cpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCZWZvcmVBZnRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBQaGFzZSBwMSA9IG5ldyBQaGFzZSgiUGhhc2VBIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDEpOwotICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgIHBoYXNlcy5hZGQocDIpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKHBoYXNlcyk7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIFBoYXNlUnVsZUhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgaDEuc2V0TmFtZSgiRmlyc3QiKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLnNldE5hbWUoIkgxIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgyKS5zZXROYW1lKCJGb3J0aCIpOwotICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotCi0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0zLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgzID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMykuc2V0TmFtZSgiU2Vjb25kIik7Ci0gICAgICAgIGgzLmluaXQoaG0zKTsKLSAgICAgICAgaG0zLnNldEhhbmRsZXIoaDMpOwotICAgICAgICBobTMuc2V0TmFtZSgiSDMiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUzID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMy5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlMy5zZXRBZnRlcigiSDEiKTsKLSAgICAgICAgaG0zLnNldFJ1bGVzKHJ1bGUzKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTMpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTQgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtNC5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoNCA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDQpLnNldE5hbWUoIlRoaXJkIik7Ci0gICAgICAgIGg0LmluaXQoaG00KTsKLSAgICAgICAgaG00LnNldEhhbmRsZXIoaDQpOwotICAgICAgICBobTQuc2V0TmFtZSgiSDQiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGU0ID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlNC5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlNC5zZXRBZnRlcigiSDEiKTsKLSAgICAgICAgcnVsZTQuc2V0QmVmb3JlKCJIMiIpOwotICAgICAgICBobTQuc2V0UnVsZXMocnVsZTQpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtNCk7Ci0KLSAgICAgICAgTGlzdCBoYW5kbGVycyA9IHAxLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRIMSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kSDQgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaGFuZGxlcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChoMyA9PSBoYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZEgxKQotICAgICAgICAgICAgICAgICAgICBmYWlsKCJIMyBmb3VuZCBiZWZvcmUgSDEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoMSA9PSBoYW5kbGVyKQotICAgICAgICAgICAgICAgIGZvdW5kSDEgPSB0cnVlOwotICAgICAgICAgICAgaWYgKGgyID09IGhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSDQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiSDIgZm91bmQgYmVmb3JlIEg0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGg0ID09IGhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiSDQgZm91bmQgYmVmb3JlIEgxIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvdW5kSDQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBoYXNlRmlyc3QoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgxKS5zZXROYW1lKCJQaGFzZUZpcnN0SGFuZGxlciIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZUZpcnN0KHRydWUpOwotICAgICAgICBobS5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0xLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgKChQaGFzZVJ1bGVIYW5kbGVyKSBoMikuc2V0TmFtZSgiU2Vjb25kIEhhbmRsZXIiKTsKLSAgICAgICAgaDIuaW5pdChobTEpOwotICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgIGhtMS5zZXROYW1lKCJIMiIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgIHJ1bGUxLnNldEJlZm9yZSgiSDEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0xKTsKLSAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlN1Y2NlZWRlZCBpbiBkZXBsb3lpbmcgYWZ0ZXIgUGhhc2VGaXJzdCBoYW5kbGVyISIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZUxhc3QoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihwaGFzZXMpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDEuaW5pdChobSk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlTGFzdCIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZUxhc3QodHJ1ZSk7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgyKS5zZXROYW1lKCJTZWNvbmQgSGFuZGxlciIpOwotICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgIGhtMS5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTEuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZTEuc2V0QWZ0ZXIoIkgxIik7Ci0gICAgICAgIGhtMS5zZXRSdWxlcyhydWxlMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBoYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmYWlsKCJTdWNjZWVkZWQgaW4gZGVwbG95aW5nIGFmdGVyIFBoYXNlTGFzdCBoYW5kbGVyISIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZVJ1bGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gOiBXaGF0IGlzIHRoaXMgdGVzdGluZyBleGFjdGx5PwotICAgIAlMaXN0IGluUGhhc2UgPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKTsKLSAgICAgICAgUGhhc2UgdHJhbnNwb3J0SU4gPSBuZXcgUGhhc2UoIlRyYW5zcG9ydEluIik7Ci0gICAgICAgIFBoYXNlIHByZURpc3BhdGNoID0gbmV3IFBoYXNlKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBEaXNwYXRjaFBoYXNlIGRpc3BhdGNoUGhhc2UgPSBuZXcgRGlzcGF0Y2hQaGFzZSgpOwotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0KLSAgICAgICAgaW5QaGFzZS5hZGQodHJhbnNwb3J0SU4pOwotICAgICAgICBpblBoYXNlLmFkZChwcmVEaXNwYXRjaCk7Ci0gICAgICAgIGluUGhhc2UuYWRkKGRpc3BhdGNoUGhhc2UpOwotCi0gICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKGluUGhhc2UpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgaG0uc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIGhtLnNldE5hbWUoIkgxIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlLnNldFBoYXNlTmFtZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZUZpcnN0KHRydWUpOwotICAgICAgICBobS5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0xLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDIuaW5pdChobTEpOwotICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgIGhtMS5zZXROYW1lKCJIMiIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgcnVsZTEuc2V0QWZ0ZXIoIkgxIik7Ci0gICAgICAgIGhtMS5zZXRSdWxlcyhydWxlMSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0xKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0yID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTIuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDMgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMy5pbml0KGhtMik7Ci0gICAgICAgIGhtMi5zZXRIYW5kbGVyKGgzKTsKLSAgICAgICAgaG0yLnNldE5hbWUoIkgzIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMiA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTIuc2V0UGhhc2VOYW1lKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBydWxlMi5zZXRBZnRlcigiSDEiKTsKLSAgICAgICAgcnVsZTIuc2V0QmVmb3JlKCJIMiIpOwotICAgICAgICBobTIuc2V0UnVsZXMocnVsZTIpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtMik7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtMyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0zLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGg0ID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDQuaW5pdChobTMpOwotICAgICAgICBobTMuc2V0SGFuZGxlcihoNCk7Ci0gICAgICAgIGhtMy5zZXROYW1lKCJINCIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTMgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUzLnNldFBoYXNlTmFtZSgiRGlzcGF0Y2giKTsKLSAgICAgICAgaG0zLnNldFJ1bGVzKHJ1bGUzKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVIYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFBoYXNlIHAxID0gbmV3IFBoYXNlKCJQaGFzZUEiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgIFBoYXNlIHAyID0gbmV3IFBoYXNlKCJQaGFzZUIiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMik7Ci0KLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgxKS5zZXROYW1lKCJQaGFzZUZpcnN0SGFuZGxlciIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZUZpcnN0KHRydWUpOwotICAgICAgICBydWxlLnNldFBoYXNlTGFzdCh0cnVlKTsKLSAgICAgICAgaG0uc2V0UnVsZXMocnVsZSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIlNlY29uZCBIYW5kbGVyIik7Ci0gICAgICAgIGgyLmluaXQoaG0xKTsKLSAgICAgICAgaG0xLnNldEhhbmRsZXIoaDIpOwotICAgICAgICBobTEuc2V0TmFtZSgiSDIiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlMS5zZXRBZnRlcigiSDEiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0xKTsKLSAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ2F1Z2h0IGV4cGVjdGVkIEV4Y2VwdGlvbgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGZhaWwgd2l0aCA6IGNhbiBvbmx5IGhhdmUgb25lIGhhbmRsZXIsIHNpbmNlIHRoZXJlIGlzIGEgIiArCi0gICAgICAgICAgICAgICAgImhhbmRsZXIgd2l0aCBib3RoIHBoYXNlRmlyc3QgYW5kIFBoYXNlTGFzdCB0cnVlICIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGhhc2VGaXJzdCgpIHsKLSAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICBwaGFzZXMuYWRkKHAxKTsKLSAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICBQaGFzZUhvbGRlciBwaCA9IG5ldyBQaGFzZUhvbGRlcihwaGFzZXMpOwotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDEuaW5pdChobSk7Ci0gICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlRmlyc3RIYW5kbGVyIik7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBobS5zZXROYW1lKCJIMSIpOwotICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICBydWxlLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0gICAgICAgIHJ1bGUuc2V0QmVmb3JlKCJIMiIpOwotICAgICAgICBobS5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGZhaWwKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotICAgICAgICAgICAgZmFpbCgiSW5jb3JyZWN0bHkgYWRkZWQgSGFuZGxlciB3aXRoIGJvdGggUGhhc2VGaXJzdCBhbmQgYmVmb3JlIG5hbWUiKTsKLSAgICAgICAgfSBjYXRjaCAoUGhhc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gUGVyZmVjdCwgY2F1Z2h0IHRoZSBleHBlY3RlZCBFeGNlcHRpb24KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGhhc2VGaXJzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgUGhhc2UgcDEgPSBuZXcgUGhhc2UoIlBoYXNlQSIpOwotICAgICAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgICAgICBQaGFzZSBwMiA9IG5ldyBQaGFzZSgiUGhhc2VCIik7Ci0gICAgICAgICAgICBwaGFzZXMuYWRkKHAyKTsKLQotICAgICAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGhtLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICAgICBoMS5pbml0KGhtKTsKLSAgICAgICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDEpLnNldE5hbWUoIlBoYXNlRmlyc3RIYW5kbGVyIik7Ci0gICAgICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgICAgIGhtLnNldE5hbWUoIkgxIik7Ci0gICAgICAgICAgICBQaGFzZVJ1bGUgcnVsZSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgICAgIHJ1bGUuc2V0UGhhc2VGaXJzdCh0cnVlKTsKLSAgICAgICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICAgICAgcGguYWRkSGFuZGxlcihobSk7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnBoYXNlcnVsZS5QaGFzZVJ1bGVIYW5kbGVyIik7Ci0gICAgICAgICAgICBIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgICAgICgoUGhhc2VSdWxlSGFuZGxlcikgaDIpLnNldE5hbWUoIlNlY29uZCBIYW5kbGVyIik7Ci0gICAgICAgICAgICBoMi5pbml0KGhtMSk7Ci0gICAgICAgICAgICBobTEuc2V0SGFuZGxlcihoMik7Ci0gICAgICAgICAgICBobTEuc2V0TmFtZSgiSDIiKTsKLSAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgICAgIHJ1bGUxLnNldFBoYXNlTmFtZSgiUGhhc2VBIik7Ci0gICAgICAgICAgICBydWxlMS5zZXRQaGFzZUZpcnN0KHRydWUpOwotICAgICAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0xKTsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGJlIGZhaWxkIHdpdGggUGhhc2VGaXJzdCBhbHJlYWR5IGhhcyBiZWVuIHNldCwgY2Fubm90IGhhdmUgdHdvICIgKwotICAgICAgICAgICAgICAgICAgICAicGhhc2VGaXJzdCBIYW5kbGVyIGZvciBzYW1lIHBoYXNlICIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGhhc2VMYXN0RXJyb3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFBoYXNlIHAxID0gbmV3IFBoYXNlKCJQaGFzZUEiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMSk7Ci0gICAgICAgIFBoYXNlIHAyID0gbmV3IFBoYXNlKCJQaGFzZUIiKTsKLSAgICAgICAgcGhhc2VzLmFkZChwMik7Ci0KLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIocGhhc2VzKTsKLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhtID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgIGgxLmluaXQoaG0pOwotICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgxKS5zZXROYW1lKCJQaGFzZUZpcnN0SGFuZGxlciIpOwotICAgICAgICBobS5zZXRIYW5kbGVyKGgxKTsKLSAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQaGFzZUEiKTsKLSAgICAgICAgcnVsZS5zZXRQaGFzZUxhc3QodHJ1ZSk7Ci0gICAgICAgIHJ1bGUuc2V0QmVmb3JlKCJIMiIpOwotICAgICAgICBobS5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotICAgICAgICB9IGNhdGNoIChQaGFzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmYWlsKCJIYW5kbGVyIHdpdGggUGhhc2VMYXN0IGNhbm5vdCBhbHNvIGhhdmUgYmVmb3JlL2FmdGVyIHNldCIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGhhc2VMYXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJyYXlMaXN0IHBoYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIFBoYXNlIHAxID0gbmV3IFBoYXNlKCJQaGFzZUEiKTsKLSAgICAgICAgICAgIHBoYXNlcy5hZGQocDEpOwotICAgICAgICAgICAgUGhhc2UgcDIgPSBuZXcgUGhhc2UoIlBoYXNlQiIpOwotICAgICAgICAgICAgcGhhc2VzLmFkZChwMik7Ci0KLSAgICAgICAgICAgIFBoYXNlSG9sZGVyIHBoID0gbmV3IFBoYXNlSG9sZGVyKHBoYXNlcyk7Ci0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0gPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBobS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIucGhhc2VydWxlLlBoYXNlUnVsZUhhbmRsZXIiKTsKLSAgICAgICAgICAgIEhhbmRsZXIgaDEgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICAgICAgaDEuaW5pdChobSk7Ci0gICAgICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgxKS5zZXROYW1lKCJQaGFzZUxhc3QiKTsKLSAgICAgICAgICAgIGhtLnNldEhhbmRsZXIoaDEpOwotICAgICAgICAgICAgaG0uc2V0TmFtZSgiSDEiKTsKLSAgICAgICAgICAgIFBoYXNlUnVsZSBydWxlID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICAgICAgcnVsZS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICAgICAgcnVsZS5zZXRQaGFzZUxhc3QodHJ1ZSk7Ci0gICAgICAgICAgICBobS5zZXRSdWxlcyhydWxlKTsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0pOwotCi0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaG0xLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGUuUGhhc2VSdWxlSGFuZGxlciIpOwotICAgICAgICAgICAgSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCk7Ci0gICAgICAgICAgICAoKFBoYXNlUnVsZUhhbmRsZXIpIGgyKS5zZXROYW1lKCJTZWNvbmQgSGFuZGxlciIpOwotICAgICAgICAgICAgaDIuaW5pdChobTEpOwotICAgICAgICAgICAgaG0xLnNldEhhbmRsZXIoaDIpOwotICAgICAgICAgICAgaG0xLnNldE5hbWUoIkgyIik7Ci0gICAgICAgICAgICBQaGFzZVJ1bGUgcnVsZTEgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgICAgICBydWxlMS5zZXRQaGFzZU5hbWUoIlBoYXNlQSIpOwotICAgICAgICAgICAgcnVsZTEuc2V0UGhhc2VMYXN0KHRydWUpOwotICAgICAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgICAgIHBoLmFkZEhhbmRsZXIoaG0xKTsKLSAgICAgICAgICAgIGZhaWwoIlRoaXMgc2hvdWxkIGJlIGZhaWxkIHdpdGggUGhhc2VsYXN0IGFscmVhZHkgaGFzIGJlZW4gc2V0LCBjYW5ub3QgaGF2ZSB0d28gIiArCi0gICAgICAgICAgICAgICAgICAgICJwaGFzZUxhc3QgSGFuZGxlciBmb3Igc2FtZSBwaGFzZSAiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB0ZXN0IG1ha2VzIHN1cmUgd2UgY2FuJ3QgYWRkIGEgSGFuZGxlciB0byBhIFBoYXNlIHdoZW4gdGhlCi0gICAgICogYmVmb3JlIGFuZCBhZnRlciBjb25zdHJhaW50cyBkb24ndCBtYWtlIHNlbnNlLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUncyBhbiBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRCZWZvcmVBbmRBZnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCJhIik7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoZCA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oImEiKTsKLSAgICAgICAgaDEuaW5pdChoZCk7Ci0KLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoMiA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCJjIik7Ci0gICAgICAgIGhkID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiYyIpOwotICAgICAgICBoMi5pbml0KGhkKTsKLQotICAgICAgICBQaGFzZSBwaGFzZSA9IG5ldyBQaGFzZSgpOwotICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKGgxKTsKLSAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihoMik7Ci0KLSAgICAgICAgUGhhc2VSdWxlIGJhZFJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIGJhZFJ1bGUuc2V0QmVmb3JlKCJhIik7Ci0gICAgICAgIGJhZFJ1bGUuc2V0QWZ0ZXIoImMiKTsKLQotICAgICAgICBoZCA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oImIiKTsKLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoMyA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCJiIik7Ci0gICAgICAgIGgzLmluaXQoaGQpOwotCi0gICAgICAgIGhkLnNldEhhbmRsZXIoaDMpOwotICAgICAgICBoZC5zZXRSdWxlcyhiYWRSdWxlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGQpOwotICAgICAgICAgICAgZmFpbCgiQmFkIFBoYXNlUnVsZSB3YXMgYWNjZXB0ZWQhIik7Ci0gICAgICAgIH0gY2F0Y2ggKFBoYXNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIENvcnJlY3QgLSBleGNlcHRpb24gY2F1Z2h0Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BoYXNlcnVsZS9QcmVEaXNwYXRjaFBoYXNlUnVsZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1ByZURpc3BhdGNoUGhhc2VSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmVlNTA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvcGhhc2VydWxlL1ByZURpc3BhdGNoUGhhc2VSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5waGFzZXJ1bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQWJzdHJhY3RUZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkhhbmRsZXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBoYXNlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5waGFzZXJlc29sdmVyLlBoYXNlSG9sZGVyOwotCi1wdWJsaWMgY2xhc3MgUHJlRGlzcGF0Y2hQaGFzZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0Q2FzZSB7Ci0KLSAgICBQcmVEaXNwYXRjaFBoYXNlUnVsZVRlc3QgcGhhc2VydWw7Ci0gICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc1N5dGVtOwotCi0gICAgcHVibGljIFByZURpc3BhdGNoUGhhc2VSdWxlVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKLSAgICAgICAgc3VwZXIodGVzdE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZVJ1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPIEZpeCBtZQotICAgICAgICBwaGFzZXJ1bCA9IG5ldyBQcmVEaXNwYXRjaFBoYXNlUnVsZVRlc3QoIiIpOwotICAgICAgICBheGlzU3l0ZW0gPSBuZXcgQXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgTGlzdCBpblBoYXNlID0gYXhpc1N5dGVtLmdldEluRmxvd1BoYXNlcygpOwotICAgICAgICBQaGFzZSB0cmFuc3BvcnRJTiA9IG5ldyBQaGFzZSgiVHJhbnNwb3J0SW4iKTsKLSAgICAgICAgUGhhc2UgcHJlRGlzcGF0Y2ggPSBuZXcgUGhhc2UoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIERpc3BhdGNoUGhhc2UgZGlzcGF0Y2hQaGFzZSA9IG5ldyBEaXNwYXRjaFBoYXNlKCk7Ci0vLwotICAgICAgICBkaXNwYXRjaFBoYXNlLnNldE5hbWUoIkRpc3BhdGNoIik7Ci0gICAgICAgIGluUGhhc2UuYWRkKHRyYW5zcG9ydElOKTsKLSAgICAgICAgaW5QaGFzZS5hZGQocHJlRGlzcGF0Y2gpOwotICAgICAgICBpblBoYXNlLmFkZChkaXNwYXRjaFBoYXNlKTsKLSAgICAgICAgUGhhc2VIb2xkZXIgcGggPSBuZXcgUGhhc2VIb2xkZXIoaW5QaGFzZSk7Ci0KLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gcHJlID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBwcmUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgxID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDEuaW5pdChwcmUpOwotICAgICAgICBwcmUuc2V0SGFuZGxlcihoMSk7Ci0gICAgICAgIHByZS5zZXROYW1lKCJwcmUtSDEiKTsKLSAgICAgICAgUGhhc2VSdWxlIHByZV9ydWxlMSA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcHJlX3J1bGUxLnNldFBoYXNlTmFtZSgiUHJlRGlzcGF0Y2giKTsKLSAgICAgICAgcHJlLnNldFJ1bGVzKHByZV9ydWxlMSk7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIocHJlKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gcHJlMiA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgcHJlMi5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDIgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoMi5pbml0KHByZTIpOwotICAgICAgICBwcmUyLnNldEhhbmRsZXIoaDIpOwotICAgICAgICBwcmUyLnNldE5hbWUoImRpc3BhdGNoIik7Ci0gICAgICAgIFBoYXNlUnVsZSBwcmVydWxlMiA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcHJlcnVsZTIuc2V0UGhhc2VOYW1lKCJEaXNwYXRjaCIpOwotICAgICAgICBwcmUyLnNldFJ1bGVzKHByZXJ1bGUyKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihwcmUyKTsKLQotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobSA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaG0uc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGgzID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDMuaW5pdChobSk7Ci0gICAgICAgIGhtLnNldEhhbmRsZXIoaDMpOwotICAgICAgICBobS5zZXROYW1lKCJwcmUtSDIiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUuc2V0UGhhc2VOYW1lKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBydWxlLnNldFBoYXNlRmlyc3QodHJ1ZSk7Ci0gICAgICAgIGhtLnNldFJ1bGVzKHJ1bGUpOwotICAgICAgICBwaC5hZGRIYW5kbGVyKGhtKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaG0xID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigpOwotICAgICAgICBobTEuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlciIpOwotICAgICAgICBIYW5kbGVyIGg0ID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoKTsKLSAgICAgICAgaDQuaW5pdChobTEpOwotICAgICAgICBobTEuc2V0SGFuZGxlcihoNCk7Ci0gICAgICAgIGhtMS5zZXROYW1lKCJwcmUtSDMiKTsKLSAgICAgICAgUGhhc2VSdWxlIHJ1bGUxID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlMS5zZXRQaGFzZU5hbWUoIlByZURpc3BhdGNoIik7Ci0gICAgICAgIHJ1bGUxLnNldEFmdGVyKCJwcmUtSDIiKTsKLSAgICAgICAgaG0xLnNldFJ1bGVzKHJ1bGUxKTsKLSAgICAgICAgcGguYWRkSGFuZGxlcihobTEpOwotCi0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBobTIgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGhtMi5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyIik7Ci0gICAgICAgIEhhbmRsZXIgaDUgPSBuZXcgUGhhc2VSdWxlSGFuZGxlcigpOwotICAgICAgICBoNS5pbml0KGhtMik7Ci0gICAgICAgIGhtMi5zZXRIYW5kbGVyKGg1KTsKLSAgICAgICAgaG0yLnNldE5hbWUoIkgzIik7Ci0gICAgICAgIFBoYXNlUnVsZSBydWxlMiA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTIuc2V0UGhhc2VOYW1lKCJQcmVEaXNwYXRjaCIpOwotICAgICAgICBydWxlMi5zZXRBZnRlcigicHJlLUgyIik7Ci0gICAgICAgIHJ1bGUyLnNldEJlZm9yZSgicHJlLUgzIik7Ci0gICAgICAgIGhtMi5zZXRSdWxlcyhydWxlMik7Ci0gICAgICAgIHBoLmFkZEhhbmRsZXIoaG0yKTsKLQotICAgICAgICAvKkFycmF5TGlzdCBvaCA9IHBoLmdldE9yZGVySGFuZGxlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9oLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gbWV0YWRhdGEgPSAoSGFuZGxlckRlc2NyaXB0aW9uKSBvaC5nZXQoaSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWU6IiArIG1ldGFkYXRhLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQaGFzZUxhc3RBbmRBZnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFBoYXNlIHBoYXNlID0gbmV3IFBoYXNlKCk7Ci0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLyBoYW5kbGVyIDEgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoMSA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCJhIik7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoZDEgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJhIik7Ci0gICAgICAgIGgxLmluaXQoaGQxKTsKLSAgICAgICAgaGQxLnNldEhhbmRsZXIoaDEpOwotICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKGhkMSk7Ci0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLyBoYW5kbGVyIDQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgUGhhc2VSdWxlIHJ1bGU0ID0gbmV3IFBoYXNlUnVsZSgpOwotICAgICAgICBydWxlNC5zZXRQaGFzZUxhc3QodHJ1ZSk7Ci0KLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoNCA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCJkIik7Ci0gICAgICAgIEhhbmRsZXJEZXNjcmlwdGlvbiBoZDQgPSBuZXcgSGFuZGxlckRlc2NyaXB0aW9uKCJkIik7Ci0gICAgICAgIGg0LmluaXQoaGQ0KTsKLQotICAgICAgICBoZDQuc2V0SGFuZGxlcihoNCk7Ci0gICAgICAgIGhkNC5zZXRSdWxlcyhydWxlNCk7Ci0gICAgICAgIHBoYXNlLmFkZEhhbmRsZXIoaGQ0KTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8gaGFuZGxlciAyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIFBoYXNlUnVsZSBydWxlMiA9IG5ldyBQaGFzZVJ1bGUoKTsKLSAgICAgICAgcnVsZTIuc2V0QWZ0ZXIoImEiKTsKLQotICAgICAgICBIYW5kbGVyRGVzY3JpcHRpb24gaGQyID0gbmV3IEhhbmRsZXJEZXNjcmlwdGlvbigiYiIpOwotICAgICAgICBQaGFzZVJ1bGVIYW5kbGVyIGgyID0gbmV3IFBoYXNlUnVsZUhhbmRsZXIoImIiKTsKLSAgICAgICAgaDIuaW5pdChoZDIpOwotCi0gICAgICAgIGhkMi5zZXRIYW5kbGVyKGgyKTsKLSAgICAgICAgaGQyLnNldFJ1bGVzKHJ1bGUyKTsKLSAgICAgICAgcGhhc2UuYWRkSGFuZGxlcihoZDIpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vIGhhbmRsZXIgMyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICBQaGFzZVJ1bGUgcnVsZTMgPSBuZXcgUGhhc2VSdWxlKCk7Ci0gICAgICAgIHJ1bGUzLnNldEFmdGVyKCJiIik7Ci0KLSAgICAgICAgSGFuZGxlckRlc2NyaXB0aW9uIGhkMyA9IG5ldyBIYW5kbGVyRGVzY3JpcHRpb24oImMiKTsKLSAgICAgICAgUGhhc2VSdWxlSGFuZGxlciBoMyA9IG5ldyBQaGFzZVJ1bGVIYW5kbGVyKCJjIik7Ci0gICAgICAgIGgzLmluaXQoaGQzKTsKLQotICAgICAgICBoZDMuc2V0SGFuZGxlcihoMyk7Ci0gICAgICAgIGhkMy5zZXRSdWxlcyhydWxlMyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKGhkMyk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJBZGRpbmcgaGFuZGxlcnMgd2l0aCBhZnRlciBhdHRyaWJ1dGUgdG8gdGhlIHBoYXNlIGJlaGF2aW91ciBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JlZ2lzdHJ5L0hhbmRsZXIzLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JlZ2lzdHJ5L0hhbmRsZXIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNTVmZTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9yZWdpc3RyeS9IYW5kbGVyMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyMyBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhIYW5kbGVyMyAuY2xhc3MpOwotICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgSGFuZGxlcjMoKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9ICJpbnNpZGUgTW9kdWxlIDEiOwotICAgIH0KLQotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy5pbmZvKCJJIGFtICIgKyBtZXNzYWdlICsgIiBIYW5kbGVyIFJ1bm5pbmcgOikiKTsKLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBsb2cuaW5mbygiSSBhbSAiICsgbWVzc2FnZSArICIgSGFuZGxlciBSdW5uaW5nIDopIik7Ci0gICAgfQotCi0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhbXBsZS9lY2hvL0VjaG9JbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhbXBsZS9lY2hvL0VjaG9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGM3MGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYW1wbGUvZWNoby9FY2hvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhbXBsZS5lY2hvOwotCi1wdWJsaWMgY2xhc3MgRWNob0ltcGwgewotICAgIHB1YmxpYyBFY2hvSW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBlY2hvU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgaW4pIHsKLSAgICAgICAgcmV0dXJuIGluOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZWNob1N0cmluZ0FycmF5KGphdmEubGFuZy5TdHJpbmdbXSBpbikgewotICAgICAgICByZXR1cm4gaW47Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2FtcGxlL2hhbmRsZXJzL0xvZ2dpbmdIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhbXBsZS9oYW5kbGVycy9Mb2dnaW5nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDgwMmJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2FtcGxlL2hhbmRsZXJzL0xvZ2dpbmdIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FtcGxlLmhhbmRsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzY1Njg1MTI2MDY3ODY2NDc0Nkw7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTG9nZ2luZ0hhbmRsZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGxvZy5pbmZvKCJJbmNvbWluZyBtZXNzYWdlIEZyb20gIiArIG1zZ0NvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCkpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJldm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0gICAgICAgIGxvZy5pbmZvKCJJbmNvbWluZyBtZXNzYWdlIFJldm9rZWQgYXQgdGhlIHNlcnZlciAiICsgbXNnQ29udGV4dC5nZXRUbygpLmdldEFkZHJlc3MoKSk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9RdWVyeVN0cmluZ1BhcnNlclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9RdWVyeVN0cmluZ1BhcnNlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5NWFjZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUXVlcnlTdHJpbmdQYXJzZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVN0cmluZ1BhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVBhcmFtZXRlcigpIHsKLSAgICAgICAgUXVlcnlTdHJpbmdQYXJzZXIgcCA9IG5ldyBRdWVyeVN0cmluZ1BhcnNlcigibmFtZT12YWx1ZSIpOwotICAgICAgICBhc3NlcnRUcnVlKHAubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocC5uZXh0KCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVQYXJhbWV0ZXJzKCkgewotICAgICAgICBRdWVyeVN0cmluZ1BhcnNlciBwID0gbmV3IFF1ZXJ5U3RyaW5nUGFyc2VyKCJuYW1lMT12YWx1ZTEmbmFtZTI9dmFsdWUyIik7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUxIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUyIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMiIsIHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHAubmV4dCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVBhcmFtZXRlcldpdGhvdXRWYWx1ZSgpIHsKLSAgICAgICAgUXVlcnlTdHJpbmdQYXJzZXIgcCA9IG5ldyBRdWVyeVN0cmluZ1BhcnNlcigibmFtZSIpOwotICAgICAgICBhc3NlcnRUcnVlKHAubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgcC5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKHAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHAubmV4dCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUGFyYW1ldGVyc1dpdGhvdXRWYWx1ZTEoKSB7Ci0gICAgICAgIFF1ZXJ5U3RyaW5nUGFyc2VyIHAgPSBuZXcgUXVlcnlTdHJpbmdQYXJzZXIoIm5hbWUmbmFtZTIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShwLm5leHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHAubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lMiIsIHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwLm5leHQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVBhcmFtZXRlcnNXaXRob3V0VmFsdWUyKCkgewotICAgICAgICBRdWVyeVN0cmluZ1BhcnNlciBwID0gbmV3IFF1ZXJ5U3RyaW5nUGFyc2VyKCJuYW1lPXZhbHVlJm5hbWUyIik7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBwLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBwLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHAubmV4dCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lMiIsIHAuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwLm5leHQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkVmFsdWUoKSB7Ci0gICAgICAgIFF1ZXJ5U3RyaW5nUGFyc2VyIHAgPSBuZXcgUXVlcnlTdHJpbmdQYXJzZXIoIm5hbWU9MjAlMjUlMjBkb3duIik7Ci0gICAgICAgIGFzc2VydFRydWUocC5uZXh0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBwLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMjAlIGRvd24iLCBwLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShwLm5leHQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1VSTFRlbXBsYXRpbmdVdGlsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1VSTFRlbXBsYXRpbmdVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRmYjI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvdXRpbC9VUkxUZW1wbGF0aW5nVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFVSTFRlbXBsYXRpbmdVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCi0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dDsKLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLQotICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGRlZmF1bHRFbnZlbG9wZSA9IHNvYXBGYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOwotCi0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudmVsb3BlKGRlZmF1bHRFbnZlbG9wZSk7Ci0KLSAgICAgICAgT01FbGVtZW50IGJvZHlGaXJzdEVsZW1lbnQgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIlRlc3RPcGVyYXRpb24iLCBudWxsKTsKLSAgICAgICAgZGVmYXVsdEVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChib2R5Rmlyc3RFbGVtZW50KTsKLQotICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIkZpcnN0TmFtZSIsIG51bGwsIGJvZHlGaXJzdEVsZW1lbnQpLnNldFRleHQoIkZvbyIpOwotICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoIkxhc3ROYW1lIiwgbnVsbCwgYm9keUZpcnN0RWxlbWVudCkuc2V0VGV4dCgiQmFyIik7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcGxhdGVkVVJMKCkgdGhyb3dzIEF4aXNGYXVsdCwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHRlc3RVUkwgPQotICAgICAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9sb2NhaG9zdDo4MDgwL3BhcmFtT25lIik7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KFdTREwyQ29uc3RhbnRzLkFUVFJfV0hUVFBfTE9DQVRJT04sICJ7Rmlyc3ROYW1lfT90ZXN0PTEmbGFzdE5hbWU9e0xhc3ROYW1lfSIpOwotICAgICAgICBVUkwgbW9kaWZpZWRVUkwgPSBVUkxUZW1wbGF0aW5nVXRpbC5nZXRUZW1wbGF0ZWRVUkwodGVzdFVSTCwgbWVzc2FnZUNvbnRleHQsIHRydWUpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3JpZ2luYWwgPSAiICsgdGVzdFVSTCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZpZWRVUkwgPSAiICsgbW9kaWZpZWRVUkwpOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFVSTCA9ICJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZS9Gb28/dGVzdD0xJmxhc3ROYW1lPUJhciI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2RpZmllZFVSTC50b1N0cmluZygpLCBleHBlY3RlZFVSTCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kUGFyYW1ldGVyc1RvVVJMKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQXhpc0ZhdWx0IHsKLSAgICAgICAgVVJMIHRlc3RVUkwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0xPQ0FUSU9OLCBudWxsKTsKLSAgICAgICAgVVJMIG1vZGlmaWVkVVJMID0gVVJMVGVtcGxhdGluZ1V0aWwuYXBwZW5kUXVlcnlQYXJhbWV0ZXJzKG1lc3NhZ2VDb250ZXh0LHRlc3RVUkwpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3JpZ2luYWwgPSAiICsgdGVzdFVSTCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZpZWRVUkwgPSAiICsgbW9kaWZpZWRVUkwpOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFVSTCA9ICJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZT9GaXJzdE5hbWU9Rm9vJkxhc3ROYW1lPUJhciI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2RpZmllZFVSTC50b1N0cmluZygpLCBleHBlY3RlZFVSTCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1ldGVyU2VwZXJhdG9yKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQXhpc0ZhdWx0IHsKLSAgICAgICAgVVJMIHRlc3RVUkwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0xPQ0FUSU9OLCBudWxsKTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuQVRUUl9XSFRUUF9RVUVSWV9QQVJBTUVURVJfU0VQQVJBVE9SLCI7Iik7Ci0gICAgICAgIFVSTCBtb2RpZmllZFVSTCA9IFVSTFRlbXBsYXRpbmdVdGlsLmFwcGVuZFF1ZXJ5UGFyYW1ldGVycyhtZXNzYWdlQ29udGV4dCx0ZXN0VVJMKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm9yaWdpbmFsID0gIiArIHRlc3RVUkwpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGlmaWVkVVJMID0gIiArIG1vZGlmaWVkVVJMKTsKLQotICAgICAgICBTdHJpbmcgZXhwZWN0ZWRVUkwgPSAiaHR0cDovL2xvY2Fob3N0OjgwODAvcGFyYW1PbmU/Rmlyc3ROYW1lPUZvbztMYXN0TmFtZT1CYXIiOwotICAgICAgICBhc3NlcnRFcXVhbHMobW9kaWZpZWRVUkwudG9TdHJpbmcoKSwgZXhwZWN0ZWRVUkwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVVbmNpdGVkRmFsc2UoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBBeGlzRmF1bHQgewotCi0gICAgICAgIFVSTCB0ZXN0VVJMID0gbmV3IFVSTCgiaHR0cDovL2xvY2Fob3N0OjgwODAvcGFyYW1PbmUvRm9vP3Rlc3Q9MSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0lHTk9SRV9VTkNJVEVELCJmYWxzZSIpOwotICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0xPQ0FUSU9OLCBudWxsKTsKLSAgICAgICAgVVJMIG1vZGlmaWVkVVJMID0gVVJMVGVtcGxhdGluZ1V0aWwuYXBwZW5kUXVlcnlQYXJhbWV0ZXJzKG1lc3NhZ2VDb250ZXh0LHRlc3RVUkwpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigib3JpZ2luYWwgPSAiICsgdGVzdFVSTCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibW9kaWZpZWRVUkwgPSAiICsgbW9kaWZpZWRVUkwpOwotCi0gICAgICAgIFN0cmluZyBleHBlY3RlZFVSTCA9ICJodHRwOi8vbG9jYWhvc3Q6ODA4MC9wYXJhbU9uZS9Gb28/dGVzdD0xJkZpcnN0TmFtZT1Gb28mTGFzdE5hbWU9QmFyIjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGlmaWVkVVJMLnRvU3RyaW5nKCksIGV4cGVjdGVkVVJMKTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvc2FtcGxlLnhtbCBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L3NhbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNmZlNzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvc2FtcGxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOndzYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOC9hZGRyZXNzaW5nIj4KLSAgICA8c29hcGVudjpIZWFkZXI+Ci0gICAgICAgIDx3c2E6TWVzc2FnZUlEIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPnV1aWQ6OTIwQzUxOTAtMEI4Ri0xMUQ5LThDRUQtRjIyRURFRUJGN0U1PC93c2E6TWVzc2FnZUlEPgotICAgICAgICA8d3NhOlRvIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0JhbmtQb3J0PC93c2E6VG8+Ci0gICAgICAgIDx3c2E6RnJvbSBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj4KLSAgICAgICAgICAgIDx3c2E6QWRkcmVzcz5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzAzL2FkZHJlc3Npbmcvcm9sZS9hbm9ueW1vdXM8L3dzYTpBZGRyZXNzPgotICAgICAgICA8L3dzYTpGcm9tPgotICAgICAgICA8d3NhOkFjdGlvbj5odHRwOi8vd3MuYXBhY2hlLm9yZy90ZXN0cy9hY3Rpb248L3dzYTpBY3Rpb24+Ci0gICAgPC9zb2FwZW52OkhlYWRlcj4KLSAgICA8c29hcGVudjpCb2R5PgotICAgICAgICA8bnMxOmdldEJhbGFuY2Ugc29hcGVudjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeG1sbnM6bnMxPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9CYW5rUG9ydCI+Ci0gICAgICAgICAgICA8YWNjb3VudE5vPjIzNDwvYWNjb3VudE5vPgotICAgICAgICA8L25zMTpnZXRCYWxhbmNlPgotICAgIDwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L3RjcC9UQ1BUcmFuc3BvcnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC90Y3AvVENQVHJhbnNwb3J0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjdmY2E5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L3RjcC9UQ1BUcmFuc3BvcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBUQ1BUcmFuc3BvcnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyBUQ1BUcmFuc3BvcnRUZXN0KFN0cmluZyBhcmcwKSB7Ci0gICAgICAgIHN1cGVyKGFyZzApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc3BvcnRTZW5kZXIoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGNyZWF0ZVNPQVBFbnZlbG9wZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1scmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpbik7Ci0gICAgICAgICAgICBTdEFYQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHhtbHJlYWRlciwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gKFNPQVBFbnZlbG9wZSkgYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvSmF2YVV0aWxzVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRhOWVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC9KYXZhVXRpbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIFdTTzIgSW5jLiAoaHR0cDovL3d3dy53c28yLm9yZykgQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKg0KLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgSmF2YVV0aWxzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHB1YmxpYyB2b2lkIHRlc3RYTUxOYW1lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgLyogQmVnaW4gVEFCTEUgMjAtMiBJbGx1c3RyYXRpdmUgRXhhbXBsZXMgZnJvbSBKQVhSUEMgU3BlYyAqLw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtaXhlZENhc2VOYW1lIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJtaXhlZENhc2VOYW1lIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lV2l0aERhc2hlcyIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigibmFtZS13aXRoLWRhc2hlcyIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygibmFtZV93aXRoX3VuZGVyc2NvcmUiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIm5hbWVfd2l0aF91bmRlcnNjb3JlIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvdGhlcl9wdW5jdENoYXJzIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJvdGhlcl9wdW5jdC5jaGFycyIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiYW5zd2VyNDIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIkFuc3dlcjQyIikpOw0KLSAgICAgICAgLyogRW5kIFRBQkxFIDIwLTIgSWxsdXN0cmF0aXZlIEV4YW1wbGVzIGZyb20gSkFYUlBDIFNwZWMgKi8NCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygibmFtZVdpdGhEYXNoZXMiLA0KLSAgICAgICAgICAgICAgICBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIm5hbWUtd2l0aC1kYXNoZXMiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIm90aGVyUHVuY3RDaGFycyIsDQotICAgICAgICAgICAgICAgIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigib3RoZXIucHVuY3RcdTAwQjdjaGFycyIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiYW5zd2VyNDIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIkFuc3dlcjQyIikpOw0KLQ0KLS8vICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MjE2MEZvbyIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiXHUyMTYwZm9vIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIjJmb28iKSk7DQotDQotICAgICAgICAvL2Fzc2VydEVxdWFscygiX0Zvb18iLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIl9mb29fIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJfZm9vXyIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiX2Zvb18iKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiLS1mb29iYXItLSIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vMjJCYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvbzIyYmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29cdTIxNjBCYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvb1x1MjE2MGJhciIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb28tYmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvby5iYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb0JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vOmJhciIpKTsNCi0NCi0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJmb29fQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb29fYmFyIikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb29fYmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvb1x1MDBCN2JhciIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJmb29cdTAzODdiYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb0JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vXHUwNkREYmFyIikpOw0KLQ0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoImZvb1x1MDZERWJhciIpKTsNCi0NCi0gICAgICAgIGFzc2VydEVxdWFscygiZm9vQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJGb29CYXIiKSk7DQotDQotLy8gICAgICAgIGFzc2VydEVxdWFscygiRk9PQmFyIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJGT09CYXIiKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoImExQkJCIiwgSmF2YVV0aWxzLnhtbE5hbWVUb0phdmFJZGVudGlmaWVyKCJBMS1CQkIiKSk7DQotDQotLy8gICAgICAgIGFzc2VydEVxdWFscygiQUJCQiIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiQS1CQkIiKSk7DQotDQotLy8gICAgICAgIGFzc2VydEVxdWFscygiQUNDQyIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiQUNDQyIpKTsNCi0NCi0NCi0gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIGFtYmlndW91cyBpbiBKU1ItMTAxDQotICAgICAgICBhc3NlcnRFcXVhbHMoImZvb0JhciIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiZm9vIGJhciIpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygiXzEiLCBKYXZhVXRpbHMueG1sTmFtZVRvSmF2YUlkZW50aWZpZXIoIi0iKSk7DQotDQotICAgICAgICBhc3NlcnRFcXVhbHMoIl9hYnN0cmFjdCIsIEphdmFVdGlscy54bWxOYW1lVG9KYXZhSWRlbnRpZmllcigiYWJzdHJhY3QiKSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC9UaHJlYWRDb250ZXh0TWlncmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMjFkYTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL1RocmVhZENvbnRleHRNaWdyYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudXRpbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lECi0gICAgICAgICAgICA9ICJUZXN0LVRocmVhZENvbnRleHRNaWdyYXRvci1MaXN0IjsKLSAgICBwcml2YXRlIE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OwotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IENvbmZpZ3VyYXRpb25Db250ZXh0KG5ldyBBeGlzQ29uZmlndXJhdGlvbigpKS5jcmVhdGVNZXNzYWdlQ29udGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eU1pZ3JhdG9yU3RydWN0dXJlKCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1NaWdyYXRpb25Ub1RocmVhZChURVNUX1RIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbAotICAgICAgICAgICAgICAgIC5wZXJmb3JtTWlncmF0aW9uVG9Db250ZXh0KFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1UaHJlYWRDbGVhbnVwKFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1Db250ZXh0Q2xlYW51cChURVNUX1RIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQsIG1lc3NhZ2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlncmF0aW9uKCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0TWlncmF0b3IgdGVzdE1pZ3JhdG9yMSA9IG5ldyBUZXN0TWlncmF0b3IoKTsKLSAgICAgICAgVGVzdE1pZ3JhdG9yIHRlc3RNaWdyYXRvcjIgPSBuZXcgVGVzdE1pZ3JhdG9yKCk7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwuYWRkVGhyZWFkQ29udGV4dE1pZ3JhdG9yKG1lc3NhZ2VDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1pZ3JhdG9yMSk7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwuYWRkVGhyZWFkQ29udGV4dE1pZ3JhdG9yKG1lc3NhZ2VDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1pZ3JhdG9yMik7Ci0gICAgICAgIFRocmVhZENvbnRleHRNaWdyYXRvclV0aWwKLSAgICAgICAgICAgICAgICAucGVyZm9ybU1pZ3JhdGlvblRvVGhyZWFkKFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNaWdyYXRvcjEubWlncmF0ZWRUb1RocmVhZCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMi5taWdyYXRlZFRvVGhyZWFkKTsKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbAotICAgICAgICAgICAgICAgIC5wZXJmb3JtTWlncmF0aW9uVG9Db250ZXh0KFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNaWdyYXRvcjEubWlncmF0ZWRUb0NvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNaWdyYXRvcjIubWlncmF0ZWRUb0NvbnRleHQpOwotICAgICAgICBUaHJlYWRDb250ZXh0TWlncmF0b3JVdGlsCi0gICAgICAgICAgICAgICAgLnBlcmZvcm1UaHJlYWRDbGVhbnVwKFRFU1RfVEhSRUFEX0NPTlRFWFRfTUlHUkFUT1JfTElTVF9JRCwgbWVzc2FnZUNvbnRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKHRlc3RNaWdyYXRvcjEuY2xlYW5lZFRocmVhZCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMi5jbGVhbmVkVGhyZWFkKTsKLSAgICAgICAgVGhyZWFkQ29udGV4dE1pZ3JhdG9yVXRpbAotICAgICAgICAgICAgICAgIC5wZXJmb3JtQ29udGV4dENsZWFudXAoVEVTVF9USFJFQURfQ09OVEVYVF9NSUdSQVRPUl9MSVNUX0lELCBtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMS5jbGVhbmVkQ29udGV4dCk7Ci0gICAgICAgIGFzc2VydFRydWUodGVzdE1pZ3JhdG9yMi5jbGVhbmVkQ29udGV4dCk7Ci0gICAgfQotCi0gICAgY2xhc3MgVGVzdE1pZ3JhdG9yIGltcGxlbWVudHMgVGhyZWFkQ29udGV4dE1pZ3JhdG9yIHsKLSAgICAgICAgYm9vbGVhbiBtaWdyYXRlZFRvVGhyZWFkOwotICAgICAgICBib29sZWFuIGNsZWFuZWRUaHJlYWQ7Ci0gICAgICAgIGJvb2xlYW4gbWlncmF0ZWRUb0NvbnRleHQ7Ci0gICAgICAgIGJvb2xlYW4gY2xlYW5lZENvbnRleHQ7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbWlncmF0ZUNvbnRleHRUb1RocmVhZChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBtaWdyYXRlZFRvVGhyZWFkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXBUaHJlYWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgICAgIGNsZWFuZWRUaHJlYWQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbWlncmF0ZVRocmVhZFRvQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBtaWdyYXRlZFRvQ29udGV4dCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICAgICAgY2xlYW5lZENvbnRleHQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHNQYXJzZVJlcXVlc3RUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3V0aWwvVXRpbHNQYXJzZVJlcXVlc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDFkNGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL1V0aWxzUGFyc2VSZXF1ZXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCB0aGF0IHRoaW5ncyBicmVhawotICovCi0KLXB1YmxpYyBjbGFzcyBVdGlsc1BhcnNlUmVxdWVzdFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBVdGlsc1BhcnNlUmVxdWVzdFRlc3QoU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0ZmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL2ZhaWwoImhlcmUiKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgYXNzZXJ0UGFyc2VzVG8oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9zZXJ2aWNlcy9TeXN0ZW0iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICJTeXN0ZW0iKTsKLS8vICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQ2FsbGVkU2VydmljZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0UGFyc2VzVG8oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9zZXJ2aWNlcy9zZXJ2aWNlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlcyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlV2l0aFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFBhcnNlc1RvKCJodHRwOi8vbG9jYWxob3N0OjgwODEvc2VydmljZXMvU3lzdGVtP3N5c3RlbT1lY2IyZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJTeXN0ZW0iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVdpdGhEb3VibGVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRQYXJzZXNUbygiaHR0cDovL2xvY2FsaG9zdDo4MDgxL3NlcnZpY2VzL1N5c3RlbT9zeXN0ZW09ZWNiMmY/am9iPTMiLAotICAgICAgICAgICAgICAgICAgICAgICAiU3lzdGVtIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRQYXJzZXNUbygiaHR0cDovL2xvY2FsaG9zdDo4MDgxL3NlcnZpY2VzL1N5c3RlbS9vcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAiU3lzdGVtIiwgIm9wZXJhdGlvbiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVyYXRpb25XaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0UGFyc2VzVG8oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9zZXJ2aWNlcy9TeXN0ZW0vb3BlcmF0aW9uP3N5c3RlbT1lY2IyZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJTeXN0ZW0iLCAib3BlcmF0aW9uIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZXJhdGlvblNlcnZpY2VDYWxsZWRTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRQYXJzZXNUbygiaHR0cDovL2xvY2FsaG9zdDo4MDgxL3NlcnZpY2VzL3NlcnZpY2VzL29wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlcyIsICJvcGVyYXRpb24iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGFyc2VzVG8oU3RyaW5nIHBhdGgsIFN0cmluZyBzZXJ2aWNlKSB7Ci0gICAgICAgIGFzc2VydFBhcnNlc1RvKHBhdGgsIHNlcnZpY2UsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZXNUbyhTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcnZpY2UsIFN0cmluZyBvcGVyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nW10gc3RyaW5ncyA9IFV0aWxzLnBhcnNlUmVxdWVzdFVSTEZvclNlcnZpY2VBbmRPcGVyYXRpb24ocGF0aCwgIi9heGlzMi9zZXJ2aWNlcyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZSwgc3RyaW5nc1swXSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb24sIHN0cmluZ3NbMV0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGVzdFRocmVhZFBvb2wuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdXRpbC90aHJlYWRwb29sL1Rlc3RUaHJlYWRQb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmU3MWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMva2VybmVsL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi91dGlsL3RocmVhZHBvb2wvVGVzdFRocmVhZFBvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi51dGlsLnRocmVhZHBvb2w7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVGVzdFRocmVhZFBvb2wgZXh0ZW5kcyBBYnN0cmFjdFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdFRocmVhZFBvb2woU3RyaW5nIHRlc3ROYW1lKSB7Ci0gICAgICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgICB9Ci0KLSAgICBjbGFzcyBUZXN0V29ya2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIGJvb2xlYW4gd29ya0RvbmU7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgd29ya0RvbmUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXb3JrRG9uZSgpIHsKLSAgICAgICAgICAgIHJldHVybiB3b3JrRG9uZTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBvb2woKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgVGhyZWFkUG9vbCB0UG9vbCA9IG5ldyBUaHJlYWRQb29sKCk7Ci0gICAgICAgIExpc3Qgd29ya2VyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgVGVzdFdvcmtlciB3b3JrZXIgPSBuZXcgVGVzdFdvcmtlcigpOwotICAgICAgICAgICAgd29ya2VyTGlzdC5hZGQod29ya2VyKTsKLSAgICAgICAgICAgIHRQb29sLmV4ZWN1dGUod29ya2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRQb29sLnNhZmVTaHV0RG93bigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKChUZXN0V29ya2VyKSB3b3JrZXJMaXN0LmdldChpKSkuaXNXb3JrRG9uZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9rZXJuZWwvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3ZhbGlkYXRpb24vVmFsaWRhdGVBeGlzMlhNTFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdmFsaWRhdGlvbi9WYWxpZGF0ZUF4aXMyWE1MVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjg4MWQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL2tlcm5lbC90ZXN0L29yZy9hcGFjaGUvYXhpczIvdmFsaWRhdGlvbi9WYWxpZGF0ZUF4aXMyWE1MVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkFic3RyYWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5Ow0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotcHVibGljIGNsYXNzIFZhbGlkYXRlQXhpczJYTUxUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KLQ0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGlvbkZlYXR1cmUNCi0gICAgICAgICAgICA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvdmFsaWRhdGlvbiI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzY2hlbWFWYWxpZGF0aW9uRmVhdHVyZQ0KLSAgICAgICAgICAgID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7DQotDQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRTY2hlbWFQcm9wDQotICAgICAgICAgICAgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZhbGlkYXRlKEZpbGUgeG1sU291cmNlLCBGaWxlIHhzZFNvdXJjZSkgew0KLQ0KLSAgICAgICAgYm9vbGVhbiB2YWxpZCA9IHRydWU7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0gICAgICAgICAgICAvLyBjb25maWd1cmVzIHRoZSB4ZXJjZXMgcGFyc2VyIGZvciBzY2hlbWEgdmFsaWRhdGlvbi4NCi0gICAgICAgICAgICBmYWN0b3J5LnNldEZlYXR1cmUodmFsaWRhdGlvbkZlYXR1cmUsIHRydWUpOw0KLSAgICAgICAgICAgIGZhY3Rvcnkuc2V0RmVhdHVyZShzY2hlbWFWYWxpZGF0aW9uRmVhdHVyZSwgdHJ1ZSk7DQotDQotICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7DQotDQotICAgICAgICAgICAgLy92YWxpZGF0ZSBhZ2FpbnN0IHRoZSBnaXZlbiBzY2hlbWFVUkwNCi0gICAgICAgICAgICBwYXJzZXIuc2V0UHJvcGVydHkoZXh0U2NoZW1hUHJvcCwgeHNkU291cmNlLnRvVVJMKCkudG9TdHJpbmcoKSk7DQotDQotICAgICAgICAgICAgLy8gcGFyc2UgKHZhbGlkYXRlcykgdGhlIHhtbA0KLSAgICAgICAgICAgIHBhcnNlci5wYXJzZSh4bWxTb3VyY2UsIG5ldyBEZWZhdWx0SGFuZGxlcigpKTsNCi0NCi0gICAgICAgIH0gY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkgew0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU0FYIG5vdCByZWNvZ25pc2VkICIgKyBzbnJlKTsNCi0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOw0KLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHNlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTQVggcGFyc2VyICIgKyBzZSk7DQotICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlcnJvciBwYXJzaW5nICIgKyBlKTsNCi0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHZhbGlkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXhpczJYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIFN0cmluZyB4bWxGaWxlID0NCi0gICAgICAgICAgICAgICAgQWJzdHJhY3RUZXN0Q2FzZS5iYXNlZGlyICsgIi9jb25mL2F4aXMyLnhtbCI7DQotICAgICAgICBTdHJpbmcgeHNkRmlsZSA9DQotICAgICAgICAgICAgICAgIEFic3RyYWN0VGVzdENhc2UuYmFzZWRpciArICIvcmVzb3VyY2VzL2F4aXMyLnhzZCI7DQotICAgICAgICBhc3NlcnRUcnVlKHZhbGlkYXRlKG5ldyBGaWxlKHhtbEZpbGUpLCBuZXcgRmlsZSh4c2RGaWxlKSkpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsNCi0gICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShhcmdzWzBdKTsNCi0gICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZShhcmdzWzFdKTsNCi0gICAgICAgIGlmIChmMS5pc0RpcmVjdG9yeSgpKSB7DQotICAgICAgICAgICAgcmVjdXJzZURpcmVjdG9yeShmMSwgZjIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZjEuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIDogIiArICh2YWxpZGF0ZShmMSwgZjIpID8gIk9LIiA6ICJJTlZBTElEIikpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVjdXJzZURpcmVjdG9yeShGaWxlIGYxLCBGaWxlIGYyKSB7DQotICAgICAgICBGaWxlW10gYXJyYXkgPSBmMS5saXN0RmlsZXMoKTsNCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBGaWxlIGZpbGUgPSBhcnJheVtpXTsNCi0gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7DQotICAgICAgICAgICAgICAgIHJlY3Vyc2VEaXJlY3RvcnkoZmlsZSwgZjIpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiYXhpczIueG1sIikpIHsNCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiA6ICIgKyAodmFsaWRhdGUoZmlsZSwgZjIpID8gIk9LIiA6ICJJTlZBTElEIikpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3BvbS54bWwgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTNkNzdkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLW1ldGFkYXRhPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIE1ldGFkYXRhPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5KU1ItMTgxIGFuZCBKU1ItMjI0IEFubm90YXRpb25zIFByb2Nlc3Npbmc8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXh3c18yLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zYWFqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLXJlc29sdmVyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLXJlc29sdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3MzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGIteGpjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZGRyZXNzaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvbWV0YWRhdGE8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9tZXRhZGF0YTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvbWV0YWRhdGE8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgLVhib290Y2xhc3NwYXRoL3A6JHtiYXNlZGlyfS8uLi9qYXh3cy1hcGkvdGFyZ2V0L2NsYXNzZXMke3BhdGguc2VwYXJhdG9yfSR7YmFzZWRpcn0vLi4vandzLWFwaS90YXJnZXQvY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlclZlcnNpb24+MS41PC9jb21waWxlclZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcmVwby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y3JlYXRlLXRlc3QtcmVwb3NpdG9yeTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3JlcG9zaXRvcnk8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXhpczJ4bWw+Li4va2VybmVsL2NvbmYvYXhpczIueG1sPC9heGlzMnhtbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbkRpcmVjdG9yeT5jb25mPC9jb25maWd1cmF0aW9uRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuLXRzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzIHVubGVzcz0ibWF2ZW4udGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGVyZXMgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLnNvdXJjZS5kaXIiIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy94c2QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnNvdXJjZS5kaXIiIHZhbHVlPSJ0ZXN0LXJlc291cmNlcy93c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXIiIHZhbHVlPSIke3NjaGVtYS5vdXRwdXQuYmFzZS5kaXJ9L3NyYyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke3NjaGVtYS5vdXRwdXQuYmFzZS5kaXJ9L2NsYXNzZXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gbWFrZSB0aGUgZGlycyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3NjaGVtYS5nZW5lcmF0ZWQuY2xhc3Nlcy5kaXJ9IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJ1biBKQVhCIHNjaGVtYSBjb21waWxlciB3aXRoIGRlc2lnbmF0ZWQgc2NoZW1hcyAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBKQVgtQiBjbGFzc2VzIGZyb20gWFNEczwvZWNobz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8+R2VuZXJhdGluZyBqYXZhIGZyb20gUHJveHlEb2NMaXRXcmFwcGVkLndzZGw8L2VjaG8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnN1bi50b29scy54amMuRHJpdmVyIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSAtcXVpZXQgLXAgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZCAtcXVpZXQgLXdzZGwgJHt3c2RsLnNvdXJjZS5kaXJ9L1Byb3h5RG9jTGl0V3JhcHBlZC53c2RsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phdmE+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idWlsZC1yZXBvPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzIHVubGVzcz0ibWF2ZW4udGVzdC5za2lwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9EaXI9InRhcmdldC90ZXN0LWNsYXNzZXMvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdC1yZXNvdXJjZXMvIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3QiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vSGFuZGxlckNvbmZpZ0ZpbGUueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLQotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFkZC10ZXN0LXNvdXJjZTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXRlc3Qtc291cmNlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7YmFzZWRpcn0vdGFyZ2V0L3NjaGVtYS9zcmM8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLypUZXN0cy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlcG8ucGF0aDwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+Li90YXJnZXQvcmVwb3NpdG9yeTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL0NsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjJiNDguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLQotCi0vKiogVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYSBmYWN0b3J5IGZvciBDb25maWd1cmF0aW9uQ29udGV4dHMgc3VpdGFibGUgaW4gdGhlIGNsaWVudCBlbnZpcm9ubWVudC4gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzKTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHJlcG9QYXRoID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBheGlzQ29uZmlnUGF0aCA9IG51bGw7Ci0KLSAgICAvKiogUmV0dXJucyBhIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IG9iamVjdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IG5ld0luc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gKENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KU1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuY2xhc3MpOyAgICAgICAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBDb25maWd1cmF0aW9uQ29udGV4dCBmcm9tIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdG9yIAotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoQXhpc0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHQoY29uZmlndXJhdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xpZW50Q29uZmlnQ3R4dEVyciIsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBDb25maWd1cmF0aW9uQ29udGV4dCBmcm9tIHRoZSBzcGVjaWZpZWQgcmVwb3NpdG9yeSBhbmQgYXhpczIueG1sIAotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoU3RyaW5nIHJlcG9QYXRoLAotICAgICAgICAgICAgU3RyaW5nIGF4aXNDb25maWdQYXRoKSB7Ci0gICAgICAgIHRoaXMucmVwb1BhdGggPSByZXBvUGF0aDsKLSAgICAgICAgdGhpcy5heGlzQ29uZmlnUGF0aCA9IGF4aXNDb25maWdQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdXAgYSBDb25maWd1cmF0aW9uQ29udGV4dCBvYmplY3QgdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gYnVpbGRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBDb25maWd1cmF0aW9uQ29udGV4dCBvYmplY3QgdGhhdCBpcyBzdWl0YWJsZSBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgb24gdXNlIGl0LgotICAgICAgICBpZiAoY29uZmlnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYocmVwb1BhdGggPT0gbnVsbCkgIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgZm9yIHRoZSByZXBvc2l0b3J5LgotICAgICAgICAgICAgcmVwb1BhdGggPSBnZXRQcm9wZXJ0eV9kb1ByaXYoQ29uc3RhbnRzLkFYSVMyX1JFUE9fUEFUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYXhpc0NvbmZpZ1BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBzeXN0ZW0gcHJvcGVydGllcyBmb3IgYXhpczIueG1sIAotICAgICAgICAgICAgYXhpc0NvbmZpZ1BhdGggPSBnZXRQcm9wZXJ0eV9kb1ByaXYoQ29uc3RhbnRzLkFYSVMyX0NPTkZJR19QQVRIKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXhpczIgcmVwb3NpdG9yeSBwYXRoIDogIiArIHJlcG9QYXRoKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQXhpczIgQ29uZmlnIHBhdGggOiAiICsgYXhpc0NvbmZpZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3Qgc3BlY2lmaWVkLCBjcmVhdGUgYSBkZWZhdWx0IG9uZSBmcm9tIHRoZSBheGlzMl9kZWZhdWx0LnhtbCBpbnNpZGUgdGhlIGtlcm5lbCBqYXIuCi0vLyAgICAgICAgaWYgKHJlcG9QYXRoID09IG51bGwgJiYgYXhpc0NvbmZpZ1BhdGggPT0gbnVsbCkgewotLy8gICAgICAgICAgICB0cnkgewotLy8gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLS8vICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xpZW50Q29uZmlnQ3R4dEVyciIsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBUcnkgdGhlIGZpbGUgc3lzdGVtIHdpdGggdGhlIHNwZWNpZmllZCBzeXN0ZW0gcHJvcGVydGllcy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0ocmVwb1BhdGgsIGF4aXNDb25maWdQYXRoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY2xpZW50Q29uZmlnQ3R4dEVyciIsZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eV9kb1ByaXYoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKQotICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotCi0gICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGFueSBmaW5hbCBjbGllbnQtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvbiBhIG5ld2x5IGNyZWF0ZWQgQXhpc1NlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZSBBIG5ld2x5IGNyZWF0ZWQgQXhpc1NlcnZpY2Ugb24gd2hpY2ggdG8gcGVyZm9ybSBhbnkgZmluYWwgY2xpZW50LXJlbGF0ZWQKLSAgICAgKiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNvbXBsZXRlQXhpczJDb25maWd1cmF0aW9uKEF4aXNTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9FeGNlcHRpb25GYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9FeGNlcHRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTY0ZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvRXhjZXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLndzLlByb3RvY29sRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFeGNlcHRpb25GYWN0b3J5IGlzIHVzZWQgdG8gY3JlYXRlIGV4Y2VwdGlvbnMgd2l0aGluIHRoZSBKQVgtV1MgaW1wbGVtZW50YXRpb24uIFRoZXJlIGFyZSBzZXZlcmFsCi0gKiByZWFzb25zIGZvciB1c2luZyBhIGZhY3RvcnkgdG8gY3JlYXRlIGV4Y2VwdGlvbnMuIDEuIFdlIGNhbiBpbnRlcmNlcHQgYWxsIGV4Y2VwdGlvbiBjcmVhdGlvbiBhbmQKLSAqIGFkZCB0aGUgYXBwcm9wcmlhdGUgbG9nZ2luZy9zZXJ2aWNlYWJpbGl0eS4gMi4gRXhjZXB0aW9ucyBhcmUgY2hhaW5lZC4gIEV4Y2VwdGlvbkZhY3RvcnkgY2FuCi0gKiBsZW5ndGhlbiBvciByZWR1Y2UgdGhlIGNhdXNlIGNoYWlucyBhcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCB0aGUgSkFYLVdTIHByb2dyYW1taW5nIG1vZGVsLiAzLgotICogUHJldmVudHMgY29uc3RydWN0aW9uIG9mIHRoZSBzYW1lIGV4Y2VwdGlvbi4gIFVzZXMgc2ltaWxhciBwcmluY2lwbGVzIGFzCi0gKiBBeGlzRmF1bHQubWFrZUV4Y2VwdGlvbi4KLSAqIDxwLz4KLSAqIEV4YW1wbGUgVXNhZ2U6IC8vIEV4YW1wbGUgdXNhZ2UKLSAqIDxwLz4KLSAqIHB1YmxpYyBmb29NZXRob2QoKSB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7IHRyeXsgLi4uIH0gY2F0Y2goRXhjZXB0aW9uIGUpeyB0aHJvdwotICogRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlKTsgfSB9Ci0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25GYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgTG9nIGxvZyA9Ci0gICAgICAgICAgICBMb2dGYWN0b3J5LmdldExvZyhFeGNlcHRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvKiogUHJpdmF0ZSBDb25zdHJ1Y3RvciBBbGwgbWV0aG9kcyBhcmUgc3RhdGljLiAgVGhlIHByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgaW5zdGFudGlhdGlvbi4gKi8KLSAgICBwcml2YXRlIEV4Y2VwdGlvbkZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSBhIGdpdmVuIFRocm93YWJsZSBpbnN0YW5jZSBhbmQgbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCi0gICAgICogQHJldHVybiBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlRXhjZXB0aW9uIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIFdlYlNlcnZpY2VFeGNlcHRpb24gKE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgZXhjZXB0aW9uIGNvdWxkIGJlIGEgUHJvdG9jb2xFeGNlcHRpb24gb3IKLSAgICAgICAgICAgIC8vIG90aGVyIGtpbmQgb2YgZXhjZXB0aW9uKQotICAgICAgICAgICAgV2ViU2VydmljZUV4Y2VwdGlvbiBlID0KLSAgICAgICAgICAgICAgICAgICAgKFdlYlNlcnZpY2VFeGNlcHRpb24pZmluZEV4Y2VwdGlvbih0aHJvd2FibGUsIFdlYlNlcnZpY2VFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGUgPSBjcmVhdGVXZWJTZXJ2aWNlRXhjZXB0aW9uKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLy8gVE9ETwotICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBnb29kIHNpdHVhdGlvbiwgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBleGNlcHRpb24uCi0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ciEgIEZvciBub3cgbG9nIHRoZSBwcm9ibGVtIGFuZCByZXRocm93Li4ud2UgbWF5IHJldmlzaXQgdGhpcyBsYXRlcgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4Y2VwdGlvbkR1cmluZ0V4Y2VwdGlvbkZsb3ciKSwgcmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBQcm90b2NvbEV4Y2VwdGlvbiB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSBhIFRocm93YWJsZSBhbmQgbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gdGhyb3dhYmxlCi0gICAgICogQHJldHVybiBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvdG9jb2xFeGNlcHRpb24gbWFrZVByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIFByb3RvY29sRXhjZXB0aW9uCi0gICAgICAgICAgICBQcm90b2NvbEV4Y2VwdGlvbiBlID0KLSAgICAgICAgICAgICAgICAgICAgKFByb3RvY29sRXhjZXB0aW9uKWZpbmRFeGNlcHRpb24odGhyb3dhYmxlLCBQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZSA9IGNyZWF0ZVByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2UsIHRocm93YWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgLy8gVE9ETwotICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBnb29kIHNpdHVhdGlvbiwgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGJ1aWxkaW5nIHRoZSBleGNlcHRpb24uCi0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBvY2N1ciEgIEZvciBub3cgbG9nIHRoZSBwcm9ibGVtIGFuZCByZXRocm93Li4ud2UgbWF5IHJldmlzaXQgdGhpcyBsYXRlcgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImV4Y2VwdGlvbkR1cmluZ0V4Y2VwdGlvbkZsb3ciKSwgcmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgcmU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIGEgV2ViU2VydmljZUV4Y2VwdGlvbiB3aXRoIGEgZ2l2ZW4gbWVzc2FnZQotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VFeGNlcHRpb24gbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1lc3NhZ2UsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdlYlNlcnZpY2VFeGNlcHRpb24gdXNpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gYSBnaXZlbiBUaHJvd2FibGUgaW5zdGFuY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VFeGNlcHRpb24gbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgewotICAgICAgICByZXR1cm4gbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obnVsbCwgdGhyb3dhYmxlKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFdlYlNlcnZpY2VFeGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHQgICAgICAgVGhyb3dhYmxlCi0gICAgICogQHJldHVybiBXZWJTZXJ2aWNlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUV4Y2VwdGlvbiBjcmVhdGVXZWJTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgewotCi0gICAgICAgIC8vIFdlIG1pZ2h0IGhhdmUgYW4gZW1iZWRkZWQgV2ViU2VydmljZUV4Y2VwdGlvbiB0aGF0IGhhcyBhIGdvb2QgbWVzc2FnZSBvbiBpdAotICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIG1lID0gKFdlYlNlcnZpY2VFeGNlcHRpb24pZmluZEV4Y2VwdGlvbih0LCBXZWJTZXJ2aWNlRXhjZXB0aW9uLmNsYXNzKTsKLSAgICAgICAgaWYgKG1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZU1lc3NhZ2UgPSBtZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAobWVNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZU1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAiOiAiICsgbWVNZXNzYWdlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgcm9vdCBjYXVzZS4gIFdlIHdhbnQgdG8gc3RyaXAgb3V0IHRoZSBpbnRlcm1lZGlhdGUgZXhjZXB0aW9ucyAobGlrZSBBeGlzRmF1bHQpIGJlY2F1c2UKLSAgICAgICAgLy8gdGhlc2Ugd29uJ3QgbWFrZSBzZW5zZSB0byB0aGUgdXNlci4KLSAgICAgICAgVGhyb3dhYmxlIHJvb3RDYXVzZSA9IG51bGw7Ci0gICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJvb3RDYXVzZSA9IGdldFJvb3RDYXVzZSh0KTsKLSAgICAgICAgfQotICAgICAgICByb290Q2F1c2UgPSByb290Q2F1c2UgPT0gbnVsbCA/IHQgOiByb290Q2F1c2U7Ci0gICAgICAgIFdlYlNlcnZpY2VFeGNlcHRpb24gZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gVGhlIHJvb3QgY2F1c2UgbWF5IG5vdCBoYXZlIGEgZ29vZCBtZXNzYWdlLiAgV2UgbWlnaHQgd2FudCB0byBlbmhhbmNlIGl0Ci0gICAgICAgIFN0cmluZyBlbmhhbmNlZE1lc3NhZ2UgPSBlbmhhbmNlTWVzc2FnZShyb290Q2F1c2UpOwotICAgICAgICBpZiAoZW5oYW5jZWRNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAiOiAiICsgZW5oYW5jZWRNZXNzYWdlOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBlbmhhbmNlZE1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlID0gbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24obWVzc2FnZSwgcm9vdENhdXNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGUgPSBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihyb290Q2F1c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0ZSBFeGNlcHRpb246IiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHQgICAgICAgVGhyb3dhYmxlCi0gICAgICogQHJldHVybiBQcm90b2NvbEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFByb3RvY29sRXhjZXB0aW9uIGNyZWF0ZVByb3RvY29sRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgewotICAgICAgICBUaHJvd2FibGUgcm9vdENhdXNlID0gbnVsbDsKLSAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcm9vdENhdXNlID0gZ2V0Um9vdENhdXNlKHQpOwotICAgICAgICB9Ci0gICAgICAgIHJvb3RDYXVzZSA9IHJvb3RDYXVzZSA9PSBudWxsID8gdCA6IHJvb3RDYXVzZTsKLSAgICAgICAgUHJvdG9jb2xFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGUgPSBuZXcgUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZSwgcm9vdENhdXNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGUgPSBuZXcgUHJvdG9jb2xFeGNlcHRpb24ocm9vdENhdXNlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiY3JlYXRlIEV4Y2VwdGlvbjoiLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGV4Y2VwdGlvbiBvciBuZXN0ZWQgY2F1c2UgdGhhdCBpcyBhc3NpZ25hYmxlIGZyb20gdGhlIHNwZWNpZmllZCBjbGFzcwotICAgICAqCi0gICAgICogQHBhcmFtIHQgICBUaHJvd2FibGUKLSAgICAgKiBAcGFyYW0gY2xzCi0gICAgICogQHJldHVybiBFeGNlcHRpb24gb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEV4Y2VwdGlvbiBmaW5kRXhjZXB0aW9uKFRocm93YWJsZSB0LCBDbGFzcyBjbHMpIHsKLSAgICAgICAgd2hpbGUgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNscy5pc0Fzc2lnbmFibGVGcm9tKHQuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VwdGlvbil0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdCA9IGdldENhdXNlKHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFRocm93YWJsZSBjYXVzZSBvZiB0aGUgRXhjZXB0aW9uLiAgU29tZSBleGNlcHRpb25zIHN0b3JlIHRoZSBjYXVzZSBpbiBhIGRpZmZlcmVudAotICAgICAqIGZpZWxkLCB3aGljaCBpcyB3aHkgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgd2hlbiB3YWxraW5nIHRoZSBjYXVzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCBUaHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFRocm93YWJsZSBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhyb3dhYmxlIGdldENhdXNlKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIFRocm93YWJsZSBjYXVzZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gTG9vayBmb3IgYSBzcGVjaWZpYyBjYXVzZSBmb3IgdGhpcyBraW5kIG9mIGV4Y2VwdGlvbgotICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIGNhdXNlID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKXQpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgbm8gc3BlY2lmaWMgY2F1c2UsIGZhbGwgYmFjayB0byB0aGUgZ2VuZXJhbCBjYXVzZS4KLSAgICAgICAgaWYgKGNhdXNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGNhdXNlID0gdC5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYXVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBzZWFyY2hlcyB0aGUgY2F1c2VzIG9mIHRoZSBzcGVjaWZpZWQgdGhyb3dhYmxlIHVudGlsIGl0IGZpbmRzIG9uZSB0aGF0IGlzCi0gICAgICogYWNjZXB0YWJsZSBhcyBhICJyb290IiBjYXVzZS4KLSAgICAgKiA8cC8+Ci0gICAgICogRXhhbXBsZTogSWYgdCBpcyBhbiBBeGlzRmF1bHQsIHRoZSBjb2RlIHRyYXZlcnNlcyB0byB0aGUgbmV4dCBjYXVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0IFRocm93YWJsZQotICAgICAqIEByZXR1cm4gVGhyb3dhYmxlIHJvb3QgY2F1c2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIHdoaWxlICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSBuZXh0Q2F1c2UgPSBudWxsOwotICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHx8Ci0gICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBPTUV4Y2VwdGlvbiB8fAotICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgQXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoaXMgY2F1c2UKLSAgICAgICAgICAgICAgICBuZXh0Q2F1c2UgPSBnZXRDYXVzZSh0KTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dENhdXNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nUm9vdENhdXNlKHQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdCA9IG5leHRDYXVzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdCBjYXVzZQotICAgICAgICAgICAgICAgIGxvZ1Jvb3RDYXVzZSh0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2dSb290Q2F1c2UodCk7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE90aGVyIGRldmVsb3BlcnMgbWF5IGFkZCBhZGRpdGlvbmFsIGNyaXRlcmlhIHRvIGdpdmUgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGJhY2sgdG8gdGhlIHVzZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdCBUaHJvd2FibGUKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBhIG1lc3NhZ2UgdGhhdCBoZWxwcyB0aGUgdXNlciB1bmRlcnN0YW5kIHdoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5oYW5jZU1lc3NhZ2UoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShiYW9zLCB0cnVlKTsKLSAgICAgICAgdC5wcmludFN0YWNrVHJhY2UocHMpOwotICAgICAgICBTdHJpbmcgc3RhY2tUcmFjZSA9IGJhb3MudG9TdHJpbmcoKTsKLQotICAgICAgICAvLyBUT0RPIGJldHRlciBjcml0ZXJpYQotICAgICAgICBpZiAoKHQgaW5zdGFuY2VvZiBTdGFja092ZXJmbG93RXJyb3IpICYmIChzdGFja1RyYWNlLmNvbnRhaW5zKCJKQVhCIikpKQotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkpBQkdyYXBoUHJvYmxlbSIpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBMb2cgdGhlIHJvb3QgY2F1c2UKLSAgICAgKiBAcGFyYW0gdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nUm9vdENhdXNlKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIC8vIFRPRE8gU2hvdWxkIGNlcnRhaW4gdGhyb3dhYmxlcyBiZSBsb2dnZWQgZWxzZXdoZXJlCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSb290IENhdXNlOiIgKyAgdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic3RhY2s6IiArIHN0YWNrVG9TdHJpbmcodCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdGFjayBvZiB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbgotICAgICAqIEBwYXJhbSBlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0YWNrVG9TdHJpbmcoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgamF2YS5pby5TdHJpbmdXcml0ZXIgc3c9IG5ldyBqYXZhLmlvLlN0cmluZ1dyaXRlcigpOyAKLSAgICAgICAgamF2YS5pby5CdWZmZXJlZFdyaXRlciBidyA9IG5ldyBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyKHN3KTsKLSAgICAgICAgamF2YS5pby5QcmludFdyaXRlciBwdz0gbmV3IGphdmEuaW8uUHJpbnRXcml0ZXIoYncpOyAKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICByZXR1cm4gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uQWRkcmVzc2luZy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2luZy9TdWJtaXNzaW9uQWRkcmVzc2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzllYjQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkFkZHJlc3NpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZzsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotQERvY3VtZW50ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi1AUmV0ZW50aW9uKHZhbHVlPVJldGVudGlvblBvbGljeS5SVU5USU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLUBUYXJnZXQodmFsdWU9RWxlbWVudFR5cGUuVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotQFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbihpZD1TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuSUQsIGJlYW49U3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmNsYXNzKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotcHVibGljIEBpbnRlcmZhY2UgU3VibWlzc2lvbkFkZHJlc3NpbmcgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgZGVmYXVsdCB0cnVlOw0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzaW5nL1N1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE4Y2M0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3NpbmcvU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Npbmc7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRmVhdHVyZTsNCi0NCi1wdWJsaWMgZmluYWwgY2xhc3MgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlIGV4dGVuZHMgV2ViU2VydmljZUZlYXR1cmUgew0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA4L2FkZHJlc3NpbmciOw0KLSAgICANCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZWQ7DQotICAgIA0KLSAgICBwdWJsaWMgU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlKCkgew0KLSAgICAgICAgdGhpcyh0cnVlLCBmYWxzZSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUoYm9vbGVhbiBlbmFibGVkKSB7DQotICAgICAgICB0aGlzKGVuYWJsZWQsIGZhbHNlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZShib29sZWFuIGVuYWJsZWQsIGJvb2xlYW4gcmVxdWlyZWQpIHsNCi0gICAgICAgIHRoaXMuZW5hYmxlZCAgPSBlbmFibGVkOw0KLSAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7DQotICAgICAgICByZXR1cm4gcmVxdWlyZWQ7DQotICAgIH0NCi0gICAgDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElEKCkgew0KLSAgICAgICAgcmV0dXJuIElEOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhdGFsb2cvSkFYV1NDYXRhbG9nTWFuYWdlci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9KQVhXU0NhdGFsb2dNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNmYyN2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9KQVhXU0NhdGFsb2dNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIEpBWFdTQ2F0YWxvZ01hbmFnZXIgewotCi0gIC8qKgotICAgKiBXaGF0IGlzIHRoZSBjdXJyZW50IHZlcmJvc2l0eT8KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBpbnQgZ2V0VmVyYm9zaXR5KCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgY3VycmVudCB2ZXJib3NpdHkuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXRWZXJib3NpdHkgKGludCB2ZXJib3NpdHkpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbGlzdCBvZiBjYXRhbG9nIGZpbGVzLgotICAgKgotICAgKiBAcmV0dXJuIEEgdmVjdG9yIG9mIHRoZSBjYXRhbG9nIGZpbGUgbmFtZXMgb3IgbnVsbCBpZiBubyBjYXRhbG9ncwotICAgKiBhcmUgYXZhaWxhYmxlIGluIHRoZSBwcm9wZXJ0aWVzLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIFZlY3RvciBnZXRDYXRhbG9nRmlsZXMoKTsKLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIGxpc3Qgb2YgY2F0YWxvZyBmaWxlcy4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIHNldENhdGFsb2dGaWxlcyhTdHJpbmcgZmlsZUxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcHJlZmVyIHB1YmxpYyBzZXR0aW5nLgotICAgKgotICAgKiBAcmV0dXJuIFRydWUgaWYgcHVibGljIGlkZW50aWZpZXJzIGFyZSBwcmVmZXJyZWQuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBnZXRQcmVmZXJQdWJsaWMgKCk7Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBwcmVmZXIgcHVibGljIHNldHRpbmcuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBzZXRQcmVmZXJQdWJsaWMgKGJvb2xlYW4gcHJlZmVyUHVibGljKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHVzZSBzdGF0aWMgY2F0YWxvZyBzZXR0aW5nLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gZ2V0VXNlU3RhdGljQ2F0YWxvZygpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIHVzZSBzdGF0aWMgY2F0YWxvZyBzZXR0aW5nLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIHZvaWQgc2V0VXNlU3RhdGljQ2F0YWxvZyhib29sZWFuIHVzZVN0YXRpYyk7Ci0KLSAgLyoqCi0gICAqIEdldCBhIG5ldyBjYXRhbG9nIGluc3RhbmNlLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdW5kZXJseWluZyBjYXRhbG9nIGNsYXNzLgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIENhdGFsb2cgZ2V0UHJpdmF0ZUNhdGFsb2coKTsgCi0gIAotICAvKioKLSAgICogR2V0IGEgY2F0YWxvZyBpbnN0YW5jZS4KLSAgICoKLSAgICogSWYgdGhpcyBtYW5hZ2VyIHVzZXMgc3RhdGljIGNhdGFsb2dzLCB0aGUgc2FtZSBzdGF0aWMgY2F0YWxvZyB3aWxsCi0gICAqIGFsd2F5cyBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlIGEgbmV3IGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBDYXRhbG9nIGdldENhdGFsb2coKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IENhdGFsb2cgY2xhc3MgbmFtZS4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0NsYXNzTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXQgdGhlIENhdGFsb2cgY2xhc3MgbmFtZS4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIHNldENhdGFsb2dDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSk7IAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9pbXBsL09BU0lTQ2F0YWxvZ01hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhdGFsb2cvaW1wbC9PQVNJU0NhdGFsb2dNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDRkYjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2F0YWxvZy9pbXBsL09BU0lTQ2F0YWxvZ01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2dNYW5hZ2VyOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOw0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247DQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqICBPQVNJU0NhdGFsb2dNYW5hZ2VyIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgY2F0YWxvZyBwcm9wZXJ0aWVzLg0KLSAqICBUaGUgcHJpbWFyeSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIA0KLSAqICBvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5DYXRhbG9nTWFuZ2VyIGlzIHRoYXQgdGhlIHN0YXRpY0NhdGFsb2cgaXMgbm90DQotICogIGEgc3RhdGljIGRhdGEgbWVtYmVyIGluIHRoZSBPQVNJU0NhdGFsb2dNYW5nZXIgY2xhc3MuICBUaGlzIGVuYWJsZXMgdGhlIHVzZQ0KLSAqICBvZiBhIHN0YXRpYyBjYXRhbG9nIHBlciBDYXRhbG9nTWFuYWdlci4gIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBPQVNJU0NhdGFsb2dNYW5hZ2VyIGV4dGVuZHMgQ2F0YWxvZ01hbmFnZXIgaW1wbGVtZW50cyBKQVhXU0NhdGFsb2dNYW5hZ2VyIHsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DQVRBTE9HX1dFQiA9ICJXRUItSU5GL2pheC13cy1jYXRhbG9nLnhtbCI7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19FSkIgPSAiTUVUQS1JTkYvamF4LXdzLWNhdGFsb2cueG1sIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19ERUJVR19LRVkgPSAiT0FTSVNDYXRhbG9nTWFuYWdlci5jYXRhbG9nLmRlYnVnLmxldmVsIjsNCi0gICAgDQotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIgPSBudWxsOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0NCi0gICAgCUxvZ2dlci5nZXRMb2dnZXIoT0FTSVNDYXRhbG9nTWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVCVUdfTEVWRUwgPSBudWxsOw0KLQ0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgREVCVUdfTEVWRUwgPSAoU3RyaW5nKQ0KLSAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKA0KLSAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShDQVRBTE9HX0RFQlVHX0tFWSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgfSk7DQotICAgIH0NCi0gICAgLyoqIFRoZSBzdGF0aWMgY2F0YWxvZyB1c2VkIGJ5IHRoaXMgbWFuYWdlci4gKi8NCi0gICAgcHJpdmF0ZSBDYXRhbG9nIHN0YXRpY0NhdGFsb2cgPSBudWxsOw0KLQ0KLSAgICAvKioNCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciB3aXRoIENsYXNzTG9hZGVyIGFyZ3VtZW50Lg0KLSAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHRoZSBkZWZhdWx0cyBzcGVjaWZpZWQgZm9yIEF4aXMyIGluIHRoZQ0KLSAgICAgKiBhY2NlcHREZWZhdWx0cyBtZXRob2QuDQotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIE9BU0lTQ2F0YWxvZ01hbmFnZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsNCi0gICAgICAgIHRoaXMoKTsNCi0gICAgICAgIHRoaXMuY2xhc3Nsb2FkZXIgPSBjbGFzc0xvYWRlcjsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgc3BlY2lmaWVzIGFuIGV4cGxpY2l0IHByb3BlcnR5IGZpbGUgYW5kIENsYXNzTG9hZGVyLg0KLSAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXINCi0gICAgICogQHBhcmFtIHByb3BlcnR5RmlsZU5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBPQVNJU0NhdGFsb2dNYW5hZ2VyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgcHJvcGVydHlGaWxlTmFtZSkgew0KLSAgICAgICAgdGhpcyhwcm9wZXJ0eUZpbGVOYW1lKTsNCi0gICAgICAgIHRoaXMuY2xhc3Nsb2FkZXIgPSBjbGFzc0xvYWRlcjsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aCBubyBhcmd1bWVudHMuDQotICAgICAqIFRoaXMgY29uc3RydWN0b3Igd2lsbCB1c2UgdGhlIGRlZmF1bHRzIHNwZWNpZmllZCBmb3IgQXhpczIgaW4gdGhlDQotICAgICAqIGFjY2VwdERlZmF1bHRzIG1ldGhvZC4NCi0gICAgICovDQotICAgIHB1YmxpYyBPQVNJU0NhdGFsb2dNYW5hZ2VyKCkgew0KLSAgICAJc3VwZXIoKTsNCi0gICAgCXRoaXMuYWNjZXB0RGVmYXVsdHMoKTsNCi0gICAgCWlmIChERUJVR19MRVZFTCAhPSBudWxsKSB7DQotICAgIAkJdGhpcy5kZWJ1Zy5zZXREZWJ1ZyhJbnRlZ2VyLnBhcnNlSW50KERFQlVHX0xFVkVMKSk7IA0KLSAgICAJfQ0KLSAgICAJDQotICAgIAlTdHJpbmcgZmlsZXBhdGggPSBkZXRlcm1pbmVGaWxlTmFtZSgpOw0KLSAgICANCi0gICAgICAgIGlmIChmaWxlcGF0aCAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5zZXRDYXRhbG9nRmlsZXMoZmlsZXBhdGgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3IgdGhhdCBzcGVjaWZpZXMgYW4gZXhwbGljaXQgcHJvcGVydHkgZmlsZS4NCi0gICAgICogQHBhcmFtIHByb3BlcnR5RmlsZU5hbWUNCi0gICAgICovDQotICAgIHB1YmxpYyBPQVNJU0NhdGFsb2dNYW5hZ2VyKFN0cmluZyBwcm9wZXJ0eUZpbGVOYW1lKSB7DQotICAgIAlzdXBlcihwcm9wZXJ0eUZpbGVOYW1lKTsNCi0gICAgICAgIGlmIChERUJVR19MRVZFTCAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5kZWJ1Zy5zZXREZWJ1ZyhJbnRlZ2VyLnBhcnNlSW50KERFQlVHX0xFVkVMKSk7ICAgICAgICAgICAgDQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBhY2NlcHREZWZhdWx0cygpIHsNCi0gICAgCXRoaXMuc2V0VXNlU3RhdGljQ2F0YWxvZyh0cnVlKTsNCi0gICAgCXRoaXMuc2V0SWdub3JlTWlzc2luZ1Byb3BlcnRpZXModHJ1ZSk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgYSBjYXRhbG9nIGluc3RhbmNlLg0KLSAgICAgKg0KLSAgICAgKiBJZiB0aGlzIG1hbmFnZXIgdXNlcyBzdGF0aWMgY2F0YWxvZ3MsIHRoZSBzYW1lIHN0YXRpYyBjYXRhbG9nIHdpbGwNCi0gICAgICogYWx3YXlzIGJlIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgY2F0YWxvZyB3aWxsIGJlIHJldHVybmVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIENhdGFsb2cgZ2V0Q2F0YWxvZygpIHsNCi0gICAgICAgIENhdGFsb2cgY2F0YWxvZyA9IHN0YXRpY0NhdGFsb2c7DQotDQotICAgICAgICBpZiAoY2F0YWxvZyA9PSBudWxsIHx8ICFzdXBlci5nZXRVc2VTdGF0aWNDYXRhbG9nKCkpIHsNCi0gICAgICAgICAgICBjYXRhbG9nID0gZ2V0UHJpdmF0ZUNhdGFsb2coKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjYXRhbG9nOw0KLSAgICB9DQotDQotDQotICAgIHByaXZhdGUgU3RyaW5nIGRldGVybWluZUZpbGVOYW1lKCkgew0KLQ0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSAoY2xhc3Nsb2FkZXIgIT0gbnVsbCkgPyBjbGFzc2xvYWRlciA6IGZpbmRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgLy8gdHJ5IHdlYiBhcHAgV0VCLUlORiBmaXJzdA0KLSAgICAgICAgVVJMIHVybCA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlKERFRkFVTFRfQ0FUQUxPR19XRUIpOw0KLSAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgLy8gaGF2ZSBub3QgcmV0dXJuZWQgLS0gcGVyaGFwcyB3ZSdyZSBpbiBhbiBFSkI/DQotICAgICAgICB1cmwgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZShERUZBVUxUX0NBVEFMT0dfRUpCKTsNCi0gICAgICAgIHJldHVybiB1cmwgPT0gbnVsbD8gbnVsbDogdXJsLnRvU3RyaW5nKCk7DQotDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBHZXQgYSBuZXcgY2F0YWxvZyBpbnN0YW5jZS4NCi0gICAgICoNCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgdW5kZXJseWluZyBjYXRhbG9nIGNsYXNzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIENhdGFsb2cgZ2V0UHJpdmF0ZUNhdGFsb2coKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGZpbmFsIENhdGFsb2dNYW5hZ2VyIGNtID0gdGhpczsNCi0gICAgICAgICAgICBDYXRhbG9nIGNhdGFsb2cgPSANCi0gICAgICAgICAgICAgICAgKENhdGFsb2cpIEFjY2Vzc0NvbnRyb2xsZXIuDQotICAgICAgICAgICAgICAgIGRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ2F0YWxvZyBjYXRhbG9nID0gc3RhdGljQ2F0YWxvZzsNCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZVN0YXRpYyA9IGNtLmdldFVzZVN0YXRpY0NhdGFsb2coKTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2F0YWxvZyA9PSBudWxsIHx8ICF1c2VTdGF0aWMpIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdGFsb2dDbGFzc05hbWUgPSBnZXRDYXRhbG9nQ2xhc3NOYW1lKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXRhbG9nQ2xhc3NOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cgPSBuZXcgQ2F0YWxvZygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nID0gKENhdGFsb2cpIENsYXNzLmZvck5hbWUoY2F0YWxvZ0NsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLm1lc3NhZ2UoMSwiQ2F0YWxvZyBjbGFzcyBuYW1lZCAnIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXRhbG9nQ2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGNvdWxkIG5vdCBiZSBmb3VuZC4gVXNpbmcgZGVmYXVsdC4iKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRhbG9nID0gbmV3IENhdGFsb2coKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjbmZlKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcubWVzc2FnZSgxLCJDbGFzcyBuYW1lZCAnIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXRhbG9nQ2xhc3NOYW1lDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGlzIG5vdCBhIENhdGFsb2cuIFVzaW5nIGRlZmF1bHQuIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZyA9IG5ldyBDYXRhbG9nKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0YWxvZy5zZXRDYXRhbG9nTWFuYWdlcihjbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cuc2V0dXBSZWFkZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2cubG9hZFN5c3RlbUNhdGFsb2dzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXRhbG9nOw0KLSAgICAgICAgICAgICAgICAgICAgfX0pOw0KLSAgICAgICAgICAgIHN0YXRpY0NhdGFsb2cgPSBjYXRhbG9nOw0KLSAgICAgICAgICAgIHJldHVybiBjYXRhbG9nOw0KLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsNCi0gICAgICAgICAgICAvLyBUaGUgQ2F0Y2ggYW5kIHN3YWxsb3cNCi0gICAgICAgICAgICBkZWJ1Zy5tZXNzYWdlKDEsImdldFByaXZhdGVDYXRhdGFsb2cgZmFpbGVkLiAgIiArDQotICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgY29udGludWVzICIgKyBwYWUuZ2V0RXhjZXB0aW9uKCkpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTZXQgdGhlIGxpc3Qgb2YgY2F0YWxvZyBmaWxlcy4NCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZXNldCB0aGUgc3RhdGljQ2F0YWxvZyBmb3IgdGhpcyBDYXRhbG9nTWFuYWdlci4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dGaWxlcyhTdHJpbmcgZmlsZUxpc3QpIHsNCi0gICAgCXN0YXRpY0NhdGFsb2cgPSBudWxsOw0KLSAgICAJc3VwZXIuc2V0Q2F0YWxvZ0ZpbGVzKGZpbGVMaXN0KTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENPUElFRCBGUk9NIGphdmF4LnhtbC53cy5zcGkuRmFjdG9yeUZpbmRlcg0KLSAgICAgKiANCi0gICAgICogRmlndXJlIG91dCB3aGljaCBDbGFzc0xvYWRlciB0byB1c2UuICBGb3IgSkRLIDEuMiBhbmQgbGF0ZXIgdXNlDQotICAgICAqIHRoZSBjb250ZXh0IENsYXNzTG9hZGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4NCi0gICAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXJyb3IgaWYgdGhpcyBjbGFzcyBpcyB1bmFibGUgdG8gd29yayB3aXRoIHRoZQ0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0IEpESw0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZmluZENsYXNzTG9hZGVyKCkgew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IA0KLSAgICAgICAgICAgICAgICAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuDQotICAgICAgICAgICAgICAgIGRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsNCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG0gPSBudWxsOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBUaHJlYWQuY2xhc3MuZ2V0TWV0aG9kKCJnZXRDb250ZXh0Q2xhc3NMb2FkZXIiLCAoQ2xhc3NbXSkgbnVsbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgd2UgYXJlIHJ1bm5pbmcgSkRLIDEuMSwgdXNlIHRoZSBjdXJyZW50IENsYXNzTG9hZGVyDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcHJpbnQgZGVidWcgc3RhdGVtZW50IGFib3V0IGFzc3VtaW5nIEpESyAxLjENCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9BU0lTQ2F0YWxvZ01hbmFnZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzc0xvYWRlcikgbS5pbnZva2UoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgfX0NCi0gICAgICAgICAgICAgICAgKTsNCi0gICAgICAgICAgICByZXR1cm4gY2w7DQotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24ocGFlLmdldEV4Y2VwdGlvbigpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9BdHRhY2htZW50RGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0F0dGFjaG1lbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM2YjNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0F0dGFjaG1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsNCi0NCi0vKioNCi0gKiBBIHBhcmFtZXRlciBvciByZXR1cm4gdmFsdWUgbWF5IGJlIHJlcHJlc2VudGVkIGFzIGFuIGF0dGFjaG1lbnQuDQotICogSW4gc3VjaCBjYXNlcywgdGhlIFBhcmFtZXRlckRlc2NyaXB0aW9uIG9yIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGhhcw0KLSAqIGFuIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBkZWZpbmluZyB0aGUgYXR0YWNobWVudCBpbmZvcm1hdGlvbi4NCi0gKiANCi0gKiBOb3RlIHRoYXQgYW4gQXR0YWNobWVudCBtYXkgYmUgb25lIG9mIDMgdHlwZXM6IFNXQSwgU1dBUkVGIGFuZCBNVE9NLg0KLSAqICAgIFNXQVJFRiBhbmQgTVRPTSBhdHRhY2htZW50cyBoYXZlIGFuIHhtbCBlbGVtZW50IChlaXRoZXIgaW4gdGhlIGJvZHkgb3IgaGVhZGVyKSANCi0gKiAgICB0aGF0IHJlZmVyZW5jZXMgdGhlIGF0dGFjaG1lbnQgcGFydC4NCi0gKiAgICANCi0gKiAgICBTV0EgYXR0YWNobWVudHMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGF0dGFjaG1lbnQgcGFydC4gIFRoZXJlIGFyZSBpcyBubw0KLSAqICAgIHhtbCBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGUgYXR0YWNobWVudC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQXR0YWNobWVudERlc2NyaXB0aW9uIHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBAUmV0dXJuIFRoZSBhdHRhY2htZW50IHR5cGUgDQotICAgICAqLw0KLSAgICBBdHRhY2htZW50VHlwZSBnZXRBdHRhY2htZW50VHlwZSgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gb25lIG9yIG1vcmUgbWltZSB0eXBlcyBkZWZpbmVkIGZvciB0aGlzIGF0dGFjaG1lbnQNCi0gICAgICovDQotICAgIFN0cmluZ1tdIGdldE1pbWVUeXBlcygpOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9BdHRhY2htZW50VHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQXR0YWNobWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjYjUyZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9BdHRhY2htZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsNCi0NCi0vKioNCi0gKiBEZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYXR0YWNobWVudHMuDQotICovDQotcHVibGljIGVudW0gQXR0YWNobWVudFR5cGUgew0KLSAgICBTV0EsICAgICAgLy8gRGVmaW5lZCBieSBCaW5kaW5nIE1JTUUgVHlwZXMsIG5vIHhtbCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50DQotICAgIFNXQVJFRiwgICAvLyBEZWZpbmVkIGJ5IFNXQVJFRiwgeG1sIHJlZmVyZW5jZXMgdGhlIGF0dGFjaG1lbnQNCi0gICAgTVRPTSAgICAgIC8vIERlZmluZWQgYnkgTVRPTSBzcGVjaWZpY2F0aW9uLCB4bWwgcmVmZXJlbmNlcyB0aGUgYXR0YWNobWVudA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvbkZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjIwMTRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Rlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkpBWFdTUklXU0RMR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5EZXNjcmlwdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuU2NoZW1hQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIENyZWF0ZXMgdGhlIEpBWC1XUyBtZXRhZGF0YSBkZXNjcmlwdGlvbiBoaWVyYXJjaHkgZnJvbSBzb21lIGNvbWJpbmF0aW9ucyBvZiBXU0RMLCBKYXZhIGNsYXNzCi0gKiBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgYW5ub3RhdGlvbnMsIGFuZCAoaW4gdGhlIGZ1dHVyZSkgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0aW9uRmFjdG9yeS5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBvZiB1cGRhdGUgYmVpbmcgZG9uZSBmb3IgYSBwYXJ0aWN1bGFyIFBvcnQuICBUaGlzIGlzIHVzZWQgYnkgdGhlIEpBWC1XUyBzZXJ2aWNlCi0gICAgICogZGVsZWdhdGUgb24gdGhlIENMSUVOVCBzaWRlLiBUaGlzIGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIHVwZGF0ZUVuZHBvaW50IGZhY3RvcnkKLSAgICAgKiBtZXRob2QuICBBbiBFbmRwb2ludERlc2NyaXB0aW9uIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydC4gR0VUX1BPUlQ6Ci0gICAgICogUmV0dXJuIGFuIFNFSS1iYXNlZCBwcmUtZXhpc3RpbmcgcG9ydCBBRERfUE9SVDogICBSZXR1cm4gYSBEaXNwYXRjaC1vbmx5IG5vbi1wcmUtZXhpc3RpbmcKLSAgICAgKiBwb3J0IENSRUFURV9ESVNQQVRDSDogUmV0dXJuIGEgRGlzcGF0Y2ggcG9ydDsgdGhpcyBpcyB2YWxpZCBvbiBlaXRoZXIgYSBwcmUtZXhpc3RpbmcgcG9ydAotICAgICAqIChlLmcuIEdFVF9QT1JUKSBvciBkeW5hbWljIHBvcnQgKEFERF9QT1JUKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBVcGRhdGVUeXBlIHsKLSAgICAgICAgR0VUX1BPUlQsIEFERF9QT1JULCBDUkVBVEVfRElTUEFUQ0h9Ci0KLSAgICAvKiogQSBEZXNjcnB0aW9uRmFjdG9yeSBjYW4gbm90IGJlIGluc3RhbnRpYXRlZDsgYWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4gKi8KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uRmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluaXRpYWwgU2VydmljZURlc2NyaXB0aW9uIGhpZXJhcmNoeSBvbiB0aGUgQ0xJRU5UIHNpZGUuICBUaGlzIGlzIGludGVuZGVkIHRvIGJlCi0gICAgICogY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBjcmVhdGVzIGEgU2VydmljZURlbGVnYXRlLiAgTm90ZSB0aGF0IGl0IHdpbGwgb25seSBjcmVhdGUgdGhlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGF0IHRoaXMgcG9pbnQuICBUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgdW5kZXIgdGhpcwotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHVwZGF0ZUVuZHBvaW50IGZhY3RvcnkgbWV0aG9kLCB3aGljaCB3aWxsIGJlIGNhbGxlZAotICAgICAqIGJ5IHRoZSBTZXJ2aWNlRGVsZWdhdGUgb25jZSB0aGUgcG9ydCBpcyBrbm93biAoaS5lLiBhZGRQb3J0LCBnZXRQb3J0LCBvciBjcmVhdGVEaXNwYXRjaCkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbFVSTCAgICAgIFVSTCB0byB0aGUgV1NETCBmaWxlIHRvIHVzZTsgdGhpcyBtYXkgYmUgbnVsbAotICAgICAqIEBwYXJhbSBzZXJ2aWNlUU5hbWUgVGhlIFNlcnZpY2VRTmFtZSBmb3IgdGhpcyBzZXJ2aWNlOyBtYXkgbm90IGJlIG51bGwKLSAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzIFRoZSBTZXJ2aWNlIGNsYXNzOyBtYXkgbm90IGJlIG51bGwgYW5kIG11c3QgYmUgYXNzaWduYWJsZSBmcm9tCi0gICAgICogICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuU2VydmljZQotICAgICAqIEByZXR1cm4gQSBTZXJ2aWNlRGVzY3JpcHRpb24gaW5zdGFuY2UgZm9yIGEgQ0xJRU5UIGFjY2VzcyB0byB0aGUgc2VydmljZS4KLSAgICAgKiBAc2VlICN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzLCBRTmFtZSwgU2VydmljZURlc2NyaXB0aW9uLlVwZGF0ZVR5cGUpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRGVzY3JpcHRpb24gY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCB3c2RsVVJMLCBRTmFtZSBzZXJ2aWNlUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlcnZpY2VDbGFzcykgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24od3NkbFVSTCwgc2VydmljZVFOYW1lLCBzZXJ2aWNlQ2xhc3MpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGluaXRpYWwgU2VydmljZURlc2NyaXB0b24gaGllcmFyY2h5IG9uIHRoZSBDTElFTlQgc2lkZS4gIFRoaXMgYWxsb3dzIGEgc3BhcnNlIERCQwotICAgICAqIHRvIGJlIHNwZWNpZmllZCBpbiBhZGRpdGlvbiB0byB0aGUgc2VydmljZSBjbGFzcy4gIFRoZSBzcGFyc2UgREJDIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlCi0gICAgICogdGhlIGNsYXNzIGFubm90YXRpb24gbWVtYmVyIHZhbHVlcy4gIAotICAgICAqIAotICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcykKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHdzZGxVUkwKLSAgICAgKiBAcGFyYW0gc2VydmljZVFOYW1lCi0gICAgICogQHBhcmFtIHNlcnZpY2VDbGFzcwotICAgICAqIEBwYXJhbSBzcGFyc2VDb21wb3NpdGUKLSAgICAgKiBAcGFyYW0gc3BhcnNlQ29tcG9zaXRlS2V5Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwgd3NkbFVSTCwgCi0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUsIENsYXNzIHNlcnZpY2VDbGFzcywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSwKLSAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKHdzZGxVUkwsIHNlcnZpY2VRTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3MsIHNwYXJzZUNvbXBvc2l0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZUtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhcmNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgSWYgYW4gRW5kcG9pbnREZXNjcml0cHRpb24gYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwKLSAgICAgKiBiZSByZXR1cm5lZDsgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4gIE5vdGUgdGhhdCBpZiB0aGUgU0VJIGlzIG51bGwKLSAgICAgKiB0aGVuIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHJldHVybmVkIHdpbGwgYmUgZm9yIGEgRGlzcGF0Y2ggY2xpZW50IG9ubHkgYW5kIGl0IHdpbGwgbm90IGhhdmUKLSAgICAgKiBhbiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhcmNoeSBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiwgYXQgYSBsYXRlciBwb2ludCwgdGhlIHNhbWUKLSAgICAgKiBwb3J0IGlzIHJlcXVlc3RlZCBhbmQgYW4gU0VJIGlzIHByb3ZpZGVkLCB0aGUgZXhpc3RpbmcgRW5kcG9pbnREZXNjcmlwdGlvbiB3aWxsIGJlIHVwZGF0ZWQKLSAgICAgKiB3aXRoIGEgbmV3bHktY3JlYXRlZCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhcmNoeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gQW4gZXhpc3RpbmcgY2xpZW50LXNpZGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhpcyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgIFRoZSBTZXJ2aWNlSW50ZXJmYWNlIGNsYXNzLiAgVGhpcyBjYW4gYmUgbnVsbCBmb3IgYWRkaW5nIGEgcG9ydCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBEaXNwYXRjaDsgaXQgY2FuIG5vdCBiZSBudWxsIHdoZW4gZ2V0dGluZyBhIHBvcnQuCi0gICAgICogQHBhcmFtIHBvcnRRTmFtZSAgICAgICAgICBUaGUgUU5hbWUgb2YgdGhlIHBvcnQuICBJZiB0aGlzIGlzIG51bGwsIHRoZSBydW50aW1lIHdpbGwgYXR0ZW1wdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIHBvcnQgdG8gdXNlLgotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVwZGF0ZTogYWRkaW5nIGEgcG9ydCwgY3JlYXRpbmcgYSBkaXNwYXRjaCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHJldHVybiBBbiBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvcnQuCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqIEBzZWUgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgbnVsbCwgbnVsbCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBUaGlzIGlzIGlkZW50aWNhbCB0byBhYm92ZSwgYnV0IHRoaXMgbWV0aG9kIGhhcyBhIAotICAgICAqIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgKHdoaWNoIGludm9rZWQgaXQpIGZvciBwdXJwb3NlcyBvZiBwcm9wZXJseSBjYWNoaW5nIAotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbnMgdGhhdCBjb250YWluIGR5bmFtaWMgcG9ydHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gQW4gZXhpc3RpbmcgY2xpZW50LXNpZGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhpcyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgIFRoZSBTZXJ2aWNlSW50ZXJmYWNlIGNsYXNzLiAgVGhpcyBjYW4gYmUgbnVsbCBmb3IgYWRkaW5nIGEgcG9ydCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBEaXNwYXRjaDsgaXQgY2FuIG5vdCBiZSBudWxsIHdoZW4gZ2V0dGluZyBhIHBvcnQuCi0gICAgICogQHBhcmFtIHBvcnRRTmFtZSAgICAgICAgICBUaGUgUU5hbWUgb2YgdGhlIHBvcnQuICBJZiB0aGlzIGlzIG51bGwsIHRoZSBydW50aW1lIHdpbGwgYXR0ZW1wdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIHBvcnQgdG8gdXNlLgotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVwZGF0ZTogYWRkaW5nIGEgcG9ydCwgY3JlYXRpbmcgYSBkaXNwYXRjaCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBBIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBjYWxsZWQgaXQKLSAgICAgKiBAcmV0dXJuIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydC4KLSAgICAgKiBAc2VlICNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLCBRTmFtZSwgQ2xhc3MpCi0gICAgICogQHNlZSBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZWksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgc2VydmljZURlbGVnYXRlS2V5LCBudWxsLCBudWxsKTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSBhbiBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhcmNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgQWRkaXRpb25hbCBtZXRhZGF0YSBtYXkgYmUgc3BlY2lmaWVkIGluIGEgc3BhcnNlCi0gICAgICogY29tcG9zaXRlLiAgVGhhdCBtZXRhZGF0YSBtYXkgY29tZSBmcm9tIGEgSlNSLTEwOSBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBmb3IgZXhhbXBsZSwKLSAgICAgKiBvciBmcm9tIHJlc291cmNlIGluamVjdGlvbiBvZiBhbiBXZWJTZXJ2aWNlUmVmIG9yIG90aGVyIFJlc291cmNlIGFubm90YXRpb24uCi0gICAgICogCi0gICAgICogQHNlZSAjdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uLCBDbGFzcywgUU5hbWUsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUpCi0gICAgICogIAotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24KLSAgICAgKiBAcGFyYW0gc2VpCi0gICAgICogQHBhcmFtIHBvcnRRTmFtZQotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIENsYXNzIHNlaSwgUU5hbWUgcG9ydFFOYW1lLAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5KSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0UU5hbWUsIHVwZGF0ZVR5cGUsIGNvbXBvc2l0ZSwgc3BhcnNlQ29tcG9zaXRlS2V5LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIElmIGFuIEVuZHBvaW50RGVzY3JpdHB0aW9uIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsCi0gICAgICogYmUgcmV0dXJuZWQ7IGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBOb3RlIHRoYXQgaWYgdGhlIFNFSSBpcyBudWxsCi0gICAgICogdGhlbiB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiByZXR1cm5lZCB3aWxsIGJlIGZvciBhIERpc3BhdGNoIGNsaWVudCBvbmx5IGFuZCBpdCB3aWxsIG5vdCBoYXZlCi0gICAgICogYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBoaWVyYWNoeSBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiwgYXQgYSBsYXRlciBwb2ludCwgdGhlIHNhbWUKLSAgICAgKiBwb3J0IGlzIHJlcXVlc3RlZCBhbmQgYW4gU0VJIGlzIHByb3ZpZGVkLCB0aGUgZXhpc3RpbmcgRW5kcG9pbnREZXNjcmlwdGlvbiB3aWxsIGJlIHVwZGF0ZWQKLSAgICAgKiB3aXRoIGEgbmV3bHktY3JlYXRlZCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGhpZXJhY3kuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uICBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgICBUaGUgU2VydmljZUludGVyZmFjZSBjbGFzcy4gIFRoaXMgY2FuIGJlIG51bGwgZm9yIGFkZGluZyBhIHBvcnQgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gZXByICAgICAgICAgICAgICAgICBUaGUgZW5kcG9pbnQgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgcG9ydC4KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSBUaGUgYWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZSAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdXBkYXRlOiBhZGRpbmcgYSBwb3J0LCBjcmVhdGluZyBhIGRpc3BhdGNoLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHJldHVybiBBbiBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvcnQuCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqIEBzZWUgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHVwZGF0ZVR5cGUsIG51bGwsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBUaGlzIGlzIGlkZW50aWNhbCB0byBhYm92ZSwgYnV0IHRoaXMgbWV0aG9kIGhhcyBhIAotICAgICAqIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgKHdoaWNoIGludm9rZWQgaXQpIGZvciBwdXJwb3NlcyBvZiBwcm9wZXJseSBjYWNoaW5nIAotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbnMgdGhhdCBjb250YWluIGR5bmFtaWMgcG9ydHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gQW4gZXhpc3RpbmcgY2xpZW50LXNpZGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhpcyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgIFRoZSBTZXJ2aWNlSW50ZXJmYWNlIGNsYXNzLiAgVGhpcyBjYW4gYmUgbnVsbCBmb3IgYWRkaW5nIGEgcG9ydCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBEaXNwYXRjaDsgaXQgY2FuIG5vdCBiZSBudWxsIHdoZW4gZ2V0dGluZyBhIHBvcnQuCi0gICAgICogQHBhcmFtIGVwciAgICAgICAgICAgICAgICAgVGhlIGVuZHBvaW50IHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IHBvcnQuCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgVGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIG9mIHRoZSBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgdXBkYXRlOiBhZGRpbmcgYSBwb3J0LCBjcmVhdGluZyBhIGRpc3BhdGNoLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGluZyBhbiBTRUktYmFzZWQgcG9ydC4KLSAgICAgKiBAcGFyYW0gc2VydmljZURlbGVnYXRlS2V5IEEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSB0aGF0IGNhbGxlZCBpdAotICAgICAqIEByZXR1cm4gQW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3J0LgotICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcykKLSAgICAgKiBAc2VlIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB1cGRhdGVUeXBlLCBzZXJ2aWNlRGVsZWdhdGVLZXksIG51bGwsIG51bGwpOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgYW4gRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYWNoeSBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgQ0xJRU5UIHNpZGUKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb24gZm9yIGEgcGFydGljdWxhciBwb3J0LiAgQWRkaXRvbmFsIG1ldGRhdGEgbWF5IGJlIHNwZWNpZmllZCBpbiBhIHNwYXJzZQotICAgICAqIGNvbXBvc2l0ZS4gIFRoYXQgbWV0YWRhdGEgbWF5IGNvbWUgZnJvbSBhIEpTUi0xMDkgY2xpZW50IGRlcGxveW1lbnQgZGVzY3JpcHRvciwgZm9yIGV4YW1wbGUsCi0gICAgICogb3IgZnJvbSByZXNvdXJjZSBpbmplY3Rpb24gb2YgYW4gV2ViU2VydmljZVJlZiBvciBvdGhlciBSZXNvdXJjZSBhbm5vdGF0aW9uLgotICAgICAqIAotICAgICAqIEBzZWUgI3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3MsIFFOYW1lLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlKQotICAgICAqICAKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uCi0gICAgICogQHBhcmFtIHNlaQotICAgICAqIEBwYXJhbSBwb3J0UU5hbWUKLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZQotICAgICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICBDbGFzcyBzZWksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5KSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB1cGRhdGVUeXBlLCBjb21wb3NpdGUsIHNwYXJzZUNvbXBvc2l0ZUtleSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIElmIGFuIEVuZHBvaW50RGVzY3JpdHB0aW9uIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsCi0gICAgICogYmUgcmV0dXJuZWQ7IGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBOb3RlIHRoYXQgaWYgdGhlIFNFSSBpcyBudWxsCi0gICAgICogdGhlbiB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiByZXR1cm5lZCB3aWxsIGJlIGZvciBhIERpc3BhdGNoIGNsaWVudCBvbmx5IGFuZCBpdCB3aWxsIG5vdCBoYXZlCi0gICAgICogYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYsIGF0IGEgbGF0ZXIgcG9pbnQsIHRoZSBzYW1lCi0gICAgICogcG9ydCBpcyByZXF1ZXN0ZWQgYW5kIGFuIFNFSSBpcyBwcm92aWRlZCwgdGhlIGV4aXN0aW5nIEVuZHBvaW50RGVzY3JpcHRpb24gd2lsbCBiZSB1cGRhdGVkCi0gICAgICogd2l0aCBhIG5ld2x5LWNyZWF0ZWQgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBoaWVyYXJjaHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZURlc2NyaXB0aW9uIEFuIGV4aXN0aW5nIGNsaWVudC1zaWRlIFNlcnZpY2VEZXNjcmlwdGlvbi4gIFRoaXMgbXVzdCBub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwuCi0gICAgICogQHBhcmFtIHNlaSAgICAgICAgICAgICAgICBUaGUgU2VydmljZUludGVyZmFjZSBjbGFzcy4gIFRoaXMgY2FuIGJlIG51bGwgZm9yIGFkZGluZyBhIHBvcnQgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW5nIGEgRGlzcGF0Y2g7IGl0IGNhbiBub3QgYmUgbnVsbCB3aGVuIGdldHRpbmcgYSBwb3J0LgotICAgICAqIEBwYXJhbSBwb3J0UU5hbWUgICAgICAgICAgVGhlIFFOYW1lIG9mIHRoZSBwb3J0LiAgSWYgdGhpcyBpcyBudWxsLCB0aGUgcnVudGltZSB3aWxsIGF0dGVtcHQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRvIHNlbGVjdCBhbiBhcHByb3ByaWF0ZSBwb3J0IHRvIHVzZS4KLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZSAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSB1cGRhdGU6IGFkZGluZyBhIHBvcnQsIGNyZWF0aW5nIGEgZGlzcGF0Y2gsIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nIGFuIFNFSS1iYXNlZCBwb3J0LgotICAgICAqIEByZXR1cm4gQW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3J0LgotICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcykKLSAgICAgKiBAc2VlIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaSwgUU5hbWUgcG9ydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgcG9ydFFOYW1lLCB1cGRhdGVUeXBlLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSBvciBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBUaGlzIGlzIGlkZW50aWNhbCB0byBhYm92ZSwgYnV0IHRoaXMgbWV0aG9kIGhhcyBhIAotICAgICAqIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgKHdoaWNoIGludm9rZWQgaXQpIGZvciBwdXJwb3NlcyBvZiBwcm9wZXJseSBjYWNoaW5nIAotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbnMgdGhhdCBjb250YWluIGR5bmFtaWMgcG9ydHMKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVzY3JpcHRpb24gQW4gZXhpc3RpbmcgY2xpZW50LXNpZGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhpcyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbC4KLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICAgICAgICAgIFRoZSBTZXJ2aWNlSW50ZXJmYWNlIGNsYXNzLiAgVGhpcyBjYW4gYmUgbnVsbCBmb3IgYWRkaW5nIGEgcG9ydCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBEaXNwYXRjaDsgaXQgY2FuIG5vdCBiZSBudWxsIHdoZW4gZ2V0dGluZyBhIHBvcnQuCi0gICAgICogQHBhcmFtIHBvcnRRTmFtZSAgICAgICAgICBUaGUgUU5hbWUgb2YgdGhlIHBvcnQuICBJZiB0aGlzIGlzIG51bGwsIHRoZSBydW50aW1lIHdpbGwgYXR0ZW1wdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlIHBvcnQgdG8gdXNlLgotICAgICAqIEBwYXJhbSB1cGRhdGVUeXBlICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVwZGF0ZTogYWRkaW5nIGEgcG9ydCwgY3JlYXRpbmcgYSBkaXNwYXRjaCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgYW4gU0VJLWJhc2VkIHBvcnQuCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBBIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgdGhhdCBjYWxsZWQgaXQKLSAgICAgKiBAcmV0dXJuIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcG9ydC4KLSAgICAgKiBAc2VlICNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLCBRTmFtZSwgQ2xhc3MpCi0gICAgICogQHNlZSBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZWksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0UU5hbWUsIHVwZGF0ZVR5cGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgIH0gICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIGFuIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFyY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBBZGRpdGlvbmFsIG1ldGFkYXRhIG1heSBiZSBzcGVjaWZpZWQgaW4gYSBzcGFyc2UKLSAgICAgKiBjb21wb3NpdGUuICBUaGF0IG1ldGFkYXRhIG1heSBjb21lIGZyb20gYSBKU1ItMTA5IGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGZvciBleGFtcGxlLAotICAgICAqIG9yIGZyb20gcmVzb3VyY2UgaW5qZWN0aW9uIG9mIGFuIFdlYlNlcnZpY2VSZWYgb3Igb3RoZXIgUmVzb3VyY2UgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlICN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzLCBRTmFtZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSkKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBzZWkKLSAgICAgKiBAcGFyYW0gcG9ydFFOYW1lCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSwKLSAgICAgICAgICAgIE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXksCi0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsCi0gICAgICAgICAgICAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0UU5hbWUsIHVwZGF0ZVR5cGUsIGNvbXBvc2l0ZSwgc3BhcnNlQ29tcG9zaXRlS2V5LCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGhpZXJhY2h5IGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBDTElFTlQgc2lkZQotICAgICAqIFNlcnZpY2VEZXNjcmlwdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIHBvcnQuICBJZiBhbiBFbmRwb2ludERlc2NyaXRwdGlvbiBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbAotICAgICAqIGJlIHJldHVybmVkOyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgTm90ZSB0aGF0IGlmIHRoZSBTRUkgaXMgbnVsbAotICAgICAqIHRoZW4gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gcmV0dXJuZWQgd2lsbCBiZSBmb3IgYSBEaXNwYXRjaCBjbGllbnQgb25seSBhbmQgaXQgd2lsbCBub3QgaGF2ZQotICAgICAqIGFuIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gaGllcmFjaHkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgSWYsIGF0IGEgbGF0ZXIgcG9pbnQsIHRoZSBzYW1lCi0gICAgICogcG9ydCBpcyByZXF1ZXN0ZWQgYW5kIGFuIFNFSSBpcyBwcm92aWRlZCwgdGhlIGV4aXN0aW5nIEVuZHBvaW50RGVzY3JpcHRpb24gd2lsbCBiZSB1cGRhdGVkCi0gICAgICogd2l0aCBhIG5ld2x5LWNyZWF0ZWQgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBoaWVyYWN5LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiAgQW4gZXhpc3RpbmcgY2xpZW50LXNpZGUgU2VydmljZURlc2NyaXB0aW9uLiAgVGhpcyBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwuCi0gICAgICogQHBhcmFtIHNlaSAgICAgICAgICAgICAgICAgVGhlIFNlcnZpY2VJbnRlcmZhY2UgY2xhc3MuICBUaGlzIGNhbiBiZSBudWxsIGZvciBhZGRpbmcgYSBwb3J0IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBEaXNwYXRjaDsgaXQgY2FuIG5vdCBiZSBudWxsIHdoZW4gZ2V0dGluZyBhIHBvcnQuCi0gICAgICogQHBhcmFtIGVwciAgICAgICAgICAgICAgICAgVGhlIGVuZHBvaW50IHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IHBvcnQuCi0gICAgICogQHBhcmFtIGFkZHJlc3NpbmdOYW1lc3BhY2UgVGhlIGFkZHJlc3NpbmcgbmFtZXNwYWNlIG9mIHRoZSBlbmRwb2ludCByZWZlcmVuY2UuCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHVwZGF0ZTogYWRkaW5nIGEgcG9ydCwgY3JlYXRpbmcgYSBkaXNwYXRjaCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nIGFuIFNFSS1iYXNlZCBwb3J0LgotICAgICAqIEByZXR1cm4gQW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBwb3J0LgotICAgICAqIEBzZWUgI2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihVUkwsIFFOYW1lLCBDbGFzcykKLSAgICAgKiBAc2VlIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB1cGRhdGVUeXBlLCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHJpZXZlIG9yIGNyZWF0ZSB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBoaWVyYXJjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGFib3ZlLCBidXQgdGhpcyBtZXRob2QgaGFzIGEgCi0gICAgICogcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZSAod2hpY2ggaW52b2tlZCBpdCkgZm9yIHB1cnBvc2VzIG9mIHByb3Blcmx5IGNhY2hpbmcgCi0gICAgICogU2VydmljZURlc2NyaXB0aW9ucyB0aGF0IGNvbnRhaW4gZHluYW1pYyBwb3J0cwotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbiBBbiBleGlzdGluZyBjbGllbnQtc2lkZSBTZXJ2aWNlRGVzY3JpcHRpb24uICBUaGlzIG11c3Qgbm90IGJlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLgotICAgICAqIEBwYXJhbSBzZWkgICAgICAgICAgICAgICAgVGhlIFNlcnZpY2VJbnRlcmZhY2UgY2xhc3MuICBUaGlzIGNhbiBiZSBudWxsIGZvciBhZGRpbmcgYSBwb3J0IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGluZyBhIERpc3BhdGNoOyBpdCBjYW4gbm90IGJlIG51bGwgd2hlbiBnZXR0aW5nIGEgcG9ydC4KLSAgICAgKiBAcGFyYW0gZXByICAgICAgICAgICAgICAgICBUaGUgZW5kcG9pbnQgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgcG9ydC4KLSAgICAgKiBAcGFyYW0gYWRkcmVzc2luZ05hbWVzcGFjZSBUaGUgYWRkcmVzc2luZyBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50IHJlZmVyZW5jZS4KLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZSAgICAgICAgIFRoZSB0eXBlIG9mIHRoZSB1cGRhdGU6IGFkZGluZyBhIHBvcnQsIGNyZWF0aW5nIGEgZGlzcGF0Y2gsIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nIGFuIFNFSS1iYXNlZCBwb3J0LgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVsZWdhdGVLZXkgQSByZWZlcmVuY2UgYmFjayB0byB0aGUgU2VydmljZURlbGVnYXRlIHRoYXQgY2FsbGVkIGl0Ci0gICAgICogQHJldHVybiBBbiBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvcnQuCi0gICAgICogQHNlZSAjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwgUU5hbWUsIENsYXNzKQotICAgICAqIEBzZWUgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VpLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbAotICAgICAgICAgICAgICAgICAgIC51cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgZXByLCBhZGRyZXNzaW5nTmFtZXNwYWNlLCB1cGRhdGVUeXBlLCBzZXJ2aWNlRGVsZWdhdGVLZXksIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICB9ICAgIAotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgb3IgY3JlYXRlIGFuIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFjaHkgYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIENMSUVOVCBzaWRlCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIGZvciBhIHBhcnRpY3VsYXIgcG9ydC4gIEFkZGl0b25hbCBtZXRkYXRhIG1heSBiZSBzcGVjaWZpZWQgaW4gYSBzcGFyc2UKLSAgICAgKiBjb21wb3NpdGUuICBUaGF0IG1ldGFkYXRhIG1heSBjb21lIGZyb20gYSBKU1ItMTA5IGNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGZvciBleGFtcGxlLAotICAgICAqIG9yIGZyb20gcmVzb3VyY2UgaW5qZWN0aW9uIG9mIGFuIFdlYlNlcnZpY2VSZWYgb3Igb3RoZXIgUmVzb3VyY2UgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAc2VlICN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzLCBRTmFtZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSkKLSAgICAgKiAgCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZXNjcmlwdGlvbgotICAgICAqIEBwYXJhbSBzZWkKLSAgICAgKiBAcGFyYW0gcG9ydFFOYW1lCi0gICAgICogQHBhcmFtIHVwZGF0ZVR5cGUKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLAotICAgICAgICAgICAgQ2xhc3Mgc2VpLCBFbmRwb2ludFJlZmVyZW5jZSBlcHIsCi0gICAgICAgICAgICBTdHJpbmcgYWRkcmVzc2luZ05hbWVzcGFjZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlLAotICAgICAgICAgICAgT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSwKLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSWQsIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uRmFjdG9yeUltcGwKLSAgICAgICAgLnVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBlcHIsIGFkZHJlc3NpbmdOYW1lc3BhY2UsIHVwZGF0ZVR5cGUsIGNvbXBvc2l0ZSwgc3BhcnNlQ29tcG9zaXRlS2V5LCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIGZ1bGwgU2VydmljZURlc2NyaXB0aW9uIGhpZXJhcmNoeSBvbiB0aGUgU0VSVkVSIHNpZGUgZm9yIEVBQ0ggc2VydmljZSBpbXBsZW1lbnRhdGlvbgotICAgICAqIGVudHJ5IGluIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgKERCQykgbWFwLiAgTm90ZSB0aGF0IHRoZSBhc3NvY2lhdGVkIFNFUlZFUiBzaWRlCi0gICAgICogQXhpcyBkZXNjcmlwdGlvbiBvYmplY3RzIGFyZSBhbHNvIGNyZWF0ZWQuICBUbyBjcmVhdGUgYSBzaW5nbGUgU2VydmljZURlc2NyaXB0aW9uIGhpZXJhcmNoeQotICAgICAqIGZvciBhIHNpbmdsZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLCB1c2UgdGhlIGZhY3RvcnkgbWV0aG9kIHRoYXQgdGFrZXMgYSBzaW5nbGUgY2xhc3MKLSAgICAgKiBhbmQgcmV0dXJucyBhIHNpbmdsZSBTZXJ2aWNlRGVzY3JpcHRpb24uCi0gICAgICogPHAvPgotICAgICAqIEEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBEQkMgZW50cnkgaXMgb25lIHRoYXQ6ICgxKSBJcyBhIGNsYXNzIGFuZCBub3QgYW4gaW50ZXJmYWNlICgyKQotICAgICAqIENhcnJpZXMgYSBXZWJTZXJ2aWNlIG9yIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uLgotICAgICAqIDxwLz4KLSAgICAgKiBBIERCQyByZXByZXNlbnRzIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gIFRoZXJlIHdpbGwgYmUKLSAgICAgKiBvdGhlciBEQkMgZW50cmllcyBpbiB0aGUgbWFwIGZvciBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZQotICAgICAqIGltcGxlbWVudGF0aW9uLCBzdWNoIGFzIHN1cGVyIGNsYXNzZXMsIHN1cGVyIGludGVyZmFjZXMsIGZhdWx0IGNsYXNzZXMsIGFuZCBzdWNoLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgbWFwIG1heSBjb250YWluID4gMSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIERCQy4gIEEgZnVsbCBTZXJ2aWNlRGVzY3JpcHRpb25oaWVyYXJjaHkKLSAgICAgKiB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggc2VydmljZSBpbXBsZW1lbnRhdGlvbiBEQkMgZW50cnkuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCBlYWNoIFNlcnZpY2VEZXNjcmlwdGlvbiB3aWxsIGhhdmUgZXhhY3RseSBvbmUgRW5kcG9pbnREZXNjcmlwdGlvbiBjb3JyZXNwb25kaW5nIHRvCi0gICAgICogZWFjaCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRiY01hcCBBIEhhc2hNYXAga2V5ZWQgb24gY2xhc3MgbmFtZSB3aXRoIGEgdmFsdWUgZm9yIHRoZSBEQkMgZm9yIHRoYXQgY2xhc3NuYW1lCi0gICAgICogQHJldHVybiBBIExpc3Qgb2YgU2VydmljZURlc2NyaXB0aW9ucyB3aXRoIHRoZSBhc3NvY2lhdGVkIFNFUlZFUiBzaWRlIGhpZXJhcmNoeSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXApIHsKLSAgICAgICAgU2NoZW1hQnVpbGRlci5pbml0Q2FjaGUoKTsgIC8vIHR1cm4gb24gc3RhdGljIFhtbFNjaGVtYSBvYmplY3QgY2FjaGluZyBpbiBTY2hlbWFCdWlsZGVyCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBsaXN0U0QgPSBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwLCBudWxsKTsKLSAgICAgICAgU2NoZW1hQnVpbGRlci5jbGVhckNhY2hlKCk7ICAvLyB0dXJuIG9mZiBjYWNoaW5nIHNvIHdlIGRvbid0IGJyZWFrIGV2ZXJ5Ym9keSBlbHNlCi0gICAgICAgIHJldHVybiBsaXN0U0Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZnVsbCBTZXJ2aWNlRGVzY3JpcHRpb24gaGllcmFyY2h5IG9uIHRoZSBTRVJWRVIgc2lkZSBmb3IgRUFDSCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uCi0gICAgICogZW50cnkgaW4gdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSAoREJDKSBtYXAuICBOb3RlIHRoYXQgdGhlIGFzc29jaWF0ZWQgU0VSVkVSIHNpZGUKLSAgICAgKiBBeGlzIGRlc2NyaXB0aW9uIG9iamVjdHMgYXJlIGFsc28gY3JlYXRlZC4gIFRvIGNyZWF0ZSBhIHNpbmdsZSBTZXJ2aWNlRGVzY3JpcHRpb24gaGllcmFyY2h5Ci0gICAgICogZm9yIGEgc2luZ2xlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MsIHVzZSB0aGUgZmFjdG9yeSBtZXRob2QgdGhhdCB0YWtlcyBhIHNpbmdsZSBjbGFzcwotICAgICAqIGFuZCByZXR1cm5zIGEgc2luZ2xlIFNlcnZpY2VEZXNjcmlwdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogQSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIERCQyBlbnRyeSBpcyBvbmUgdGhhdDogKDEpIElzIGEgY2xhc3MgYW5kIG5vdCBhbiBpbnRlcmZhY2UgKDIpCi0gICAgICogQ2FycmllcyBhIFdlYlNlcnZpY2Ugb3IgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24uCi0gICAgICogPHAvPgotICAgICAqIEEgREJDIHJlcHJlc2VudHMgdGhlIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVGhlcmUgd2lsbCBiZQotICAgICAqIG90aGVyIERCQyBlbnRyaWVzIGluIHRoZSBtYXAgZm9yIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlCi0gICAgICogaW1wbGVtZW50YXRpb24sIHN1Y2ggYXMgc3VwZXIgY2xhc3Nlcywgc3VwZXIgaW50ZXJmYWNlcywgZmF1bHQgY2xhc3NlcywgYW5kIHN1Y2guCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCBtYXAgbWF5IGNvbnRhaW4gPiAxIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gREJDLiAgQSBmdWxsIFNlcnZpY2VEZXNjcmlwdGlvbmhpZXJhcmNoeQotICAgICAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIERCQyBlbnRyeS4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IGVhY2ggU2VydmljZURlc2NyaXB0aW9uIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8KLSAgICAgKiBlYWNoIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGJjTWFwIEEgSGFzaE1hcCBrZXllZCBvbiBjbGFzcyBuYW1lIHdpdGggYSB2YWx1ZSBmb3IgdGhlIERCQyBmb3IgdGhhdCBjbGFzc25hbWUKLSAgICAgKiBAcGFyYW0gY29uZmlnQ29udGV4dCBDb25maWd1cmF0aW9uQ29udGV4dCB1c2VkIHRvIGdldCBXU0RMIERlZmluaXRpb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgotICAgICAqIEByZXR1cm4gQSBMaXN0IG9mIFNlcnZpY2VEZXNjcmlwdGlvbnMgd2l0aCB0aGUgYXNzb2NpYXRlZCBTRVJWRVIgc2lkZSBoaWVyYXJjaHkgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKAotICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCxDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCwgY29uZmlnQ29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgZnVsbCBTZXJ2aWNlRGVzY3JpcHRpb24gaGllcmFyY2h5IG9uIHRoZSBTRVJWRVIgc2lkZSBmb3IgYSBzaW5nbGUgc2VydmljZQotICAgICAqIGltcGxlbWVudGF0aW9uIGNsYXNzLiAgVG8gY3JlYXRlIHByb2Nlc3MgbW9yZSB0aGFuIG9uZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGF0IG9uZSB0aW1lIG9yCi0gICAgICogdG8gcHJvY2VzcyB0aGVtIHdpdGhvdXQgY2F1c2luZyB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIHRvIGJlIGxvYWRlZCwgdXNlIHRoZQotICAgICAqIGZhY3RvcnkgbWV0aG9kIHRoYXQgdGFrZXMgYSBjb2xsZWN0aW9uIG9mIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBvYmplY3RzIGFuZCByZXR1cm5zIGEKLSAgICAgKiBjb2xsZWN0aW9uIG9mIFNlcnZpY2VEZXNjcmlwdGlvbnMuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCB0aGUgU2VydmljZURlc2NyaXB0aW9uIHdpbGwgaGF2ZSBleGFjdGx5IG9uZSBFbmRwb2ludERlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8KLSAgICAgKiB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW1wbENsYXNzIEEgV2ViIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgKGkuZS4gb25lIHRoYXQgY2FycmllcyBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2Ugb3IgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24pLgotICAgICAqIEByZXR1cm4gQSBTZXJ2aWNlRGVzY3JpcHRpb24gd2l0aCB0aGUgYXNzb2NpYXRlZCBTRVJWRVIgc2lkZSBoaWVyYXJjaHkgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oQ2xhc3Mgc2VydmljZUltcGxDbGFzcykgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oc2VydmljZUltcGxDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm92aWRlIHZlcnkgY29udmVuaWVudCB3YXkgb2YgY3JlYXRpbmcgYW4gQXhpc1NlcnZpY2UgZnJvbSBhbiBhbm5vdGF0ZWQgamF2YSBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW1wbENsYXNzIEEgV2ViIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MgKGkuZS4gb25lIHRoYXQgY2FycmllcyBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2Ugb3IgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24pLgotICAgICAqIEByZXR1cm4gQW4gQXhpc1NlcnZpY2UgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEF4aXNTZXJ2aWNlIGNyZWF0ZUF4aXNTZXJ2aWNlKENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUF4aXNTZXJ2aWNlKHNlcnZpY2VJbXBsQ2xhc3MsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgcHJvdmlkZSB2ZXJ5IGNvbnZlbmllbnQgd2F5IG9mIGNyZWF0aW5nIGFuIEF4aXNTZXJ2aWNlIGZyb20gYW4gYW5ub3RhdGVkIGphdmEgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZUltcGxDbGFzcyBBIFdlYiBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIChpLmUuIG9uZSB0aGF0IGNhcnJpZXMgYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlIG9yIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uKS4KLSAgICAgKiBAcmV0dXJuIEFuIEF4aXNTZXJ2aWNlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBeGlzU2VydmljZSBjcmVhdGVBeGlzU2VydmljZShDbGFzcyBzZXJ2aWNlSW1wbENsYXNzLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihzZXJ2aWNlSW1wbENsYXNzLCBjb25maWdDb250ZXh0KTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkQXJyYXkgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZEFycmF5WzBdLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKQVhXU1JJV1NETEdlbmVyYXRvciB2YWx1ZSA9IG5ldyBKQVhXU1JJV1NETEdlbmVyYXRvcihheGlzU2VydmljZSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoIldTRExTdXBwbGllciIsIHZhbHVlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcigiU2NoZW1hU3VwcGxpZXIiLCB2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgbG9nLmluZm8oIlVuYWJsZSB0byBzZXQgdGhlIFdTRExTdXBwbGllciIsIGV4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXhpc1NlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBDbGllbnQgQ29uZmlndXJhdGlvbkZhY3RvcnkgdXNlZCB0byBjcmVhdGUgQXhpc0NvbmZpZ3VyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgQ2xpZW50IENvbmZpZ3VyYXRpb24gRmFjdG9yeSdzIG5ldyBpbnN0YW5jZS4gQ2xpbmV0Q29uZmlndXJhdGlvbkZhY3RvcnkgaXMKLSAgICAgKiAgICAgICAgIFNpbmdsZXRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGNyZWF0ZUNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5nZXRDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBvYmplY3QsIHdoaWNoIGRlc2NyaWJlcyBhdHRyaWJ1dGVzIG9mIGhhbmRsZXJzCi0gICAgICogdGhhdCBoYXZlIGJlZW4gcmVzb2x2ZWQgZm9yIGEgZ2l2ZSBwb3J0LiAgVGhpcyBpbmNsdWRlcyB0aGUgaGFuZGxlciBjbGFzc2VzIGFuZCB0aGUgcm9sZXMuCi0gICAgICogQHJldHVybiBBIG5ldyBpbnN0YW5jZSBvZiBhIFJlc29sZmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gY3JlYXRlUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvbktleS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhOWYzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvbktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uS2V5IHsKLQotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBVUkwgd3NkbFVybCA9IG51bGw7Ci0KLSAgICBwcml2YXRlIENsYXNzIHNlcnZpY2VDbGFzcyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBudWxsOwotCi0gICAgcHVibGljIERlc2NyaXB0aW9uS2V5KFFOYW1lIHNlcnZpY2VOYW1lLCBVUkwgd3NkbFVybCwgQ2xhc3Mgc2VydmljZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy53c2RsVXJsID0gd3NkbFVybDsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIHRoaXMuY29uZmlnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gbykgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRGVzY3JpcHRpb25LZXkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBEZXNjcmlwdGlvbktleSBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbktleSlvOwotCi0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgiRGVzY3JpcHRpb25SZWdpc3RyeUVycjAiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVzY3JpcHRpb24uc2VydmljZU5hbWUuZXF1YWxzKHRoaXMuc2VydmljZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgZGVzY3JpcHRpb24ud3NkbFVybCAhPSBudWxsID8gZGVzY3JpcHRpb24ud3NkbFVybC5lcXVhbHModGhpcy53c2RsVXJsKSA6Ci0gICAgICAgICAgICAgICAgdGhpcy53c2RsVXJsID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlc2NyaXB0aW9uLnNlcnZpY2VDbGFzcyA9PSB0aGlzLnNlcnZpY2VDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzY3JpcHRpb24uY29uZmlnQ29udGV4dCA9PSB0aGlzLmNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQotICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyAoKHNlcnZpY2VOYW1lID09IG51bGwpID8gMCA6IHNlcnZpY2VOYW1lLmhhc2hDb2RlKCkpOwotICAgICAgICBoYXNoID0gaGFzaCArICgod3NkbFVybCA9PSBudWxsKSA/IDAgOiB3c2RsVXJsLmhhc2hDb2RlKCkpOwotICAgICAgICBoYXNoID0gaGFzaCArICgoc2VydmljZUNsYXNzID09IG51bGwpID8gMCA6IHNlcnZpY2VDbGFzcy5oYXNoQ29kZSgpKTsKLSAgICAgICAgaGFzaCA9IGhhc2ggKyAoKGNvbmZpZ0NvbnRleHQgPT0gbnVsbCkgPyAwIDogY29uZmlnQ29udGV4dC5oYXNoQ29kZSgpKTsKLSAgICAgICAgcmV0dXJuIGhhc2g7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q29uZmlnQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29uZmlnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVybCgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxVcmw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbFVybChVUkwgd3NkbFVybCkgewotICAgICAgICB0aGlzLndzZGxVcmwgPSB3c2RsVXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRTZXJ2aWNlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUNsYXNzKENsYXNzIHNlcnZpY2VDbGFzcykgewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50S2V5KCkgewotCi0gICAgICAgIFN0cmluZyBzTmFtZSA9IChzZXJ2aWNlTmFtZSAhPSBudWxsKSA/IHNlcnZpY2VOYW1lLnRvU3RyaW5nKCkgOiAiIjsKLSAgICAgICAgU3RyaW5nIHNXc2RsVVJMID0gKHdzZGxVcmwgIT0gbnVsbCkgPyB3c2RsVXJsLnRvU3RyaW5nKCkgOiAiIjsKLSAgICAgICAgU3RyaW5nIHNDbGFzcyA9IChzZXJ2aWNlQ2xhc3MgIT0gbnVsbCkgPyBzZXJ2aWNlQ2xhc3MudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICBTdHJpbmcgc0NvbmZpZyA9IChjb25maWdDb250ZXh0ICE9IG51bGwpID8gY29uZmlnQ29udGV4dC50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgOiAiIjsKLSAgICAgICAgU3RyaW5nIGtleSA9IHNOYW1lICsgc1dzZGxVUkwgKyBzQ2xhc3MgKyBzQ29uZmlnOwotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlYzk2NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEFuIEVuZHBvaW50RGVzY3JpcHRpb24gY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIFNlcnZpY2UgSW1wbGVtZW50YXRpb24uIEl0IGNhbiBjb3JyZXNwb25kIHRvCi0gKiBlaXRoZXIgZWl0aGVyIGEgY2xpZW50IHRvIHRoYXQgaW1wbCBvciB0aGUgYWN0dWFsIHNlcnZpY2UgaW1wbC4KLSAqIDxwLz4KLSAqIFRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsZXZhbnQgdG8gYm90aCBhIFByb3ZpZGVyLWJhc2VkIGFuZAotICogU0VJLWJhc2VkIChha2EgRW5kcG9pbnQtYmFzZWQgb3IgSmF2YS1iYXNlZCkgZW5wZG9pbnRzLiBTRUktYmFzZWQgZW5kcG9pbnRzICh3aGV0aGVyIHRoZXkgaGF2ZSBhbgotICogZXhwbGljaXQgb3IgaW1wbGNpdCBTRUkpIHdpbGwgaGF2ZSBhZGR0aW9uYWwgbWV0YWRhdGEgaW5mb3JtYXRpb24gaW4gYW4KLSAqIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gY2xhc3MgYW5kIHN1Yi1oaWVyYWNoeTsgUHJvdmlkZXItYmFzZWQgZW5kcG9pdG5zIGRvIG5vdCBoYXZlIHN1Y2ggYQotICogaGllcmFjaHkuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogPGI+RW5kcG9pbnREZXNjcmlwdGlvbiBkZXRhaWxzPC9iPgotICogPHAvPgotICogICAgIENPUlJFU1BPTkRTIFRPOiAgICAgIFRoZSBlbmRwb2ludCAoYm90aCBDbGllbnQgYW5kIFNlcnZlcikKLSAqIDxwLz4KLSAqICAgICBBWElTMiBERUxFR0FURTogICAgICBBeGlzU2VydmljZQotICogPHAvPgotICogICAgIENISUxEUkVOOiAgICAgICAgICAgIDAuLjEgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbgotICogPHAvPgotICogICAgIEFOTk9UQVRJT05TOgotICogICAgICAgICBXZWJTZXJ2aWNlIFsxODFdCi0gKiAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlciBbMjI0XQotICogICAgICAgICAgICAgU2VydmljTW9kZSBbMjI0XQotICogICAgICAgICBCaW5kaW5nVHlwZSBbMjI0XQotICogPHAvPgotICogICAgIFdTREwgRUxFTUVOVFM6Ci0gKiAgICAgICAgIHBvcnQKLSAqIDxwLz4KLSAqICA8L3ByZT4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50RGVzY3JpcHRpb24gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJU19TRVJWSUNFX1BBUkFNRVRFUiA9Ci0gICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NMSUVOVF9CSU5ESU5HX0lEID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotCi0gICAgLyoqCi0gICAgICogUGFyYW1hdGVyIHNldCBvbiBBeGlzU2VydmljZSB3aGljaCBjb250YWlucyBhbiBBcnJheUxpc3Qgb2YgU09BUCBoZWFkZXIgUU5hbWVzCi0gICAgICogb2YgU09BUEhhbmRsZXJzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX1BBUkFNRVRFUl9RTkFNRVMgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uLmhhbmRsZXJQYXJhbWV0ZXJRTmFtZXMiOwotICAgICAgICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTZXJ2aWNlQ2xpZW50IGdldFNlcnZpY2VDbGllbnQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTZXJ2aWNlRGVzY3JpcHRpb24gZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKQVgtV1MgaGFuZGxlciBQb3J0SW5mbyBvYmplY3QgZm9yIHRoaXMgZW5kcG9pbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFBvcnRJbmZvCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFBvcnRJbmZvIGdldFBvcnRJbmZvKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Byb3ZpZGVyQmFzZWQoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW5kcG9pbnRCYXNlZCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYmluZGluZyB0eXBlIEZPUiBBIFNFUlZFUi4gIFRoaXMgaXMgYmFzZWQgb24gdGhlIEJpbmRpbmdUeXBlIGFubm90YXRpb24gYW5kL29yCi0gICAgICogdGhlIFdTREwuIFRoaXMgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgYmluZGluZyAoU09BUDExKSBpZiBubyBhbm5vdGF0aW9uIHdhcyBzcGVjaWZpZWQgb24gdGhlCi0gICAgICogc2VydmVyLiBUaGlzIHNob3VsZCBOT1QgYmUgY2FsbGVkIG9uIHRoZSBjbGllbnQgc2luY2UgaXQgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBkZWZhdWx0Ci0gICAgICogYmluZGluZy4gVXNlIGdldENsaWVudEJpbmRpbmdJRCgpIG9uIGNsaWVudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRCaW5kaW5nVHlwZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SGFuZGxlckNoYWluKEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgYSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3QuICBJZiB0aGUKLSAgICAgKiBrZXkgaXMgbm9uLW51bGwgdGhlbiBpdCBpcyB1c2VkIHRvIGxvb2sgZm9yIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgKiBzcGFyc2UgbWV0YWRhdGEuICBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgcmVzb2x2ZWQgaXM6Ci0gICAgICogMSkgTG9vayBpbiBzcGFyc2UgY29tcG9zaXRlIGlmIHRoZSBrZXkgaXMgbm90IG51bGwKLSAgICAgKiAyKSBMb29rIGluIHRoZSBjb21wb3NpdGUKLSAgICAgKiAzKSBMb29rIGZvciBhIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGFuZCByZWFkIGluIHRoZSBmaWxlIGl0IHNwZWNpZmllcyAgCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBNYXkgYmUgbnVsbC4gIElmIG5vbi1udWxsLCB1c2VkIHRvIGxvb2sgZm9yIHNlcnZpY2UtZGVsZWdhdGUKLSAgICAgKiAgICAgc3BlY2lmaWMgc3BhcnNlIGNvbXBvc2l0ZSBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgSGFuZGxlckNoYWluc1R5cGUgb2JqZWN0IG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgYSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3QuCi0gICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIGdldEhhbmRsZXJDaGFpbihudWxsKS4KLSAgICAgKiBAc2VlICNnZXRIYW5kbGVyQ2hhaW4oT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW4oKTsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgYmluZGluZyB0eXBlIEZPUiBBIENMSUVOVC4gIFRoZSBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uIGlzIG5vdCB2YWxpZCBvbiB0aGUgY2xpZW50IHBlcgotICAgICAqIHRoZSBKQVgtV1Mgc3BlYy4gIFRoZSB2YWx1ZSBjYW4gYmUgc2V0IHZpYSBhZGRQb3J0KC4uLikgZm9yIGEgRGlzcGF0Y2ggY2xpZW50IG9yIHZpYSBUQkQgZm9yCi0gICAgICogYSBQcm94eSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Q2xpZW50QmluZGluZ0lEKFN0cmluZyBjbGllbnRCaW5kaW5nSUQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBiaW5kaW5nIHR5cGUgRk9SIEEgQ0xJRU5ULiAgVGhpcyB3aWxsIHJldHVybiB0aGUgZGVmYXVsdCBjbGllbnQgYmluZGluZyB0eXBlIGlmCi0gICAgICogY2FsbGVkIG9uIHRoZSBzZXJ2ZXIuICBVc2UgZ2V0QmluZGluZ1R5cGUoKSBvbiBzZXJ2ZXJzLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQgYmluZGluZyB0eXBlCi0gICAgICogQHNlZSBzZXRDbGllbnRCaW5kaW5nSUQoKTsKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENsaWVudEJpbmRpbmdJRCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRBZGRyZXNzKFN0cmluZyBlbmRwb2ludEFkZHJlc3MpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFbmRwb2ludEFkZHJlc3MoKTsKLQotICAgIC8vcHVibGljIGFic3RyYWN0IExpc3Q8U3RyaW5nPiBnZXRIYW5kbGVyTGlzdCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBRTmFtZSBnZXRQb3J0UU5hbWUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTZXJ2aWNlLk1vZGUgZ2V0U2VydmljZU1vZGUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaWduYWxzIHdoZXRoZXIgb3Igbm90IE1UT00gaGFzIGJlZW4gdHVybmVkIG9uIGZvciB0aGUgZW5kcG9pbnQgCi0gICAgICogYmFzZWQgb24gdGhlIGFubm90YXRpb24gY29uZmlndXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBCb3RoIHRoZSBATVRPTSBhbmQgQEJpbmRpbmdUeXBlIGFyZSBpbnNwZWN0ZWQuICBUaGUgQE1UT00KLSAgICAgKiBhbm5vdGF0aW9uIGlzIGluc3BlY3RlZCBmaXJzdC4gIElmIHRoZSBATVRPTQotICAgICAqIGFubm90YXRpb24gaXMgbm90IHByZXNlbnQsIHRoZW4gdGhlIEBCaW5kaW5nVHlwZSBpcyBpbnNwZWN0ZWQuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGJvb2xlYW4gdmFsdWUgCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIElmIE1UT00gaXMgZW5hYmxlZCwgcmV0dXJucyB0aGUgdGhyZXNob2xkIHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gLTEgaWYgTVRPTSBpcyBub3QgZW5hYmxlZCwgYSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIGlmIAotICAgICAqIG9uZSB3YXMgY29uZmlndXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1UT01UaHJlc2hvbGQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSA8Y29kZT4mbHQ7d3NkbDpiaW5kaW5nJmd0OzwvY29kZT4gbXVzdCBiZSAKLSAgICAgKiBzdHJpY3RseSByZXNwZWN0ZWQgYnkgdGhlIHJ1bnRpbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGJvb2xlYW4gdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiByZXNwZWN0QmluZGluZygpOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHdoZXRoZXIgb3Igbm90IHN0cmljdCBiaW5kaW5nIHN1cHBvcnQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcGVjdEJpbmRpbmcoYm9vbGVhbiByZXNwZWN0KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBRTmFtZSB0byBhIGxpc3Qgb2YgYmluZGluZyB0eXBlcyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZQotICAgICAqIHN1cHBvcnRlZCBieSB0aGUgZW5kcG9pbnQgYXMgZGVmaW5lZCBpbiB0aGUgV1NETC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhZGRSZXF1aXJlZEJpbmRpbmcoUU5hbWUgbmFtZSk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtub3duIGJpbmRpbmdzIHRoYXQgc2hvdWxkIGJlIHN1cHBvcnRlZCBiYXNlZAotICAgICAqIG9uIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgV1NETC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0UmVxdWlyZWRCaW5kaW5ncygpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLCBpZiBhbnksIHVzZWQgdG8gYnVpbGQgdGhpcyBzZXJ2aWNlIGRlc2NyaXB0aW9uLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgT2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHByb3BlcnR5IGtleSBzdXBwbGllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpOwotICAgIAotICAgIC8qKgotICAgICAqIFN0b3JlIHRoZSBwcm9wZXJ0eSBieSB0aGUga2V5IHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpOwotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb25KYXZhLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludERlc2NyaXB0aW9uSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU2NzEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50RGVzY3JpcHRpb25KYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB7Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZSBnZXRBbm5vV2ViU2VydmljZSgpOwotCi0gICAgcHVibGljIFdlYlNlcnZpY2VQcm92aWRlciBnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpOwotCi0gICAgcHVibGljIEJpbmRpbmdUeXBlIGdldEFubm9CaW5kaW5nVHlwZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpOwotCi0gICAgcHVibGljIFNlcnZpY2VNb2RlIGdldEFubm9TZXJ2aWNlTW9kZSgpOwotCi0gICAgcHVibGljIFNlcnZpY2UuTW9kZSBnZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpOwotICAgIAotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm9GZWF0dXJlKFN0cmluZyBpZCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludERlc2NyaXB0aW9uV1NETC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnREZXNjcmlwdGlvbldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5Y2ZmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludERlc2NyaXB0aW9uV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW5kcG9pbnREZXNjcmlwdGlvbldTREwgewotICAgIC8qKgotICAgICAqIFN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBTT0FQIEJpbmRpbmcuICBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGJpbmRpbmcKLSAgICAgKiBleHRlbnNpYmlsaXR5IGVsZW1lbnQgdW5kZXIgdGhlIFdTREwgYmluZGluZy4gIFRoaXMgY291bGQgYmUgU09BUCBvciBIVFRQCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDExX1dTRExfQklORElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJfV1NETF9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9XU0RMX0JJTkRJTkcgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI7Ci0gICAgLyoqIFFOYW1lcyBmb3IgdGhlIFNPQVAgYWRkcmVzcyBleHRlbnNpYmxpdHkgZWxlbWVudCB1bmRlciB0aGUgV1NETCBQb3J0IGVsZW1lbnQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTFfQUREUkVTU19FTEVNRU5UID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShDb25zdGFudHMuVVJJX1dTRExfU09BUDExLCAiYWRkcmVzcyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMl9BRERSRVNTX0VMRU1FTlQgPQotICAgICAgICAgICAgbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTIsICJhZGRyZXNzIik7Ci0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRXU0RMU2VydmljZSgpOwotCi0gICAgcHVibGljIFBvcnQgZ2V0V1NETFBvcnQoKTsKLQotICAgIHB1YmxpYyBCaW5kaW5nIGdldFdTRExCaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBzcGVjaWZpYyB3c2RsOmJpbmRpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBUeXBpY2FsbHksIHRoaXMgaXMKLSAgICAgKiB0aGUgPHNvYXA6YmluZGluZz4gZWxlbWVudCB0aGF0IGRlZmluZXMgZWl0aGVyIGEgU09BUCAxLjEgb3IgYSBTT0FQIDEuMiBiaW5kaW5nLgotICAgICAqIAotICAgICAqIElNUE9SVEFOVCBOT1RFOiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgY29udmVydGVkIGZyb20gdGhlIFdTREwgQmluZGluZyB0eXBlICh3aGljaCBpcyB0aGUKLSAgICAgKiBuYW1lc3BhY2Ugb24gdGhlIGFzc29jYWl0ZWQgYmluZGluZyBleHRlbnNpYmlsaXR5IGVsZW1lbnQpIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlCi0gICAgICogZm9yIHRoZSBTT0FQQmluZGluZyBhbm5vdGF0aW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgU09BUDEyIFdTREwKLSAgICAgKiAgICAgLi4uCi0gICAgICogICAgIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotICAgICAqICAgICAuLi4gIAotICAgICAqICAgICA8d3NkbDpiaW5kaW5nIC4uLj4KLSAgICAgKiAgICAgICA8c29hcDEyOmJpbmRpbmcgLi4uPgotICAgICAqIAotICAgICAqIFdvdWxkIHJldHVybiB0aGUgdmFsdWUgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HIHdoaWNoIGlzCi0gICAgICogICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBjb25zdGFudHMgZGVmaW5lZCBpbiBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEJpbmRpbmdUeXBlKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExTT0FQQWRkcmVzcygpOwotCi0gICAgLyoqCi0gICAgICogSXMgdGhlIFdTREwgZGVmaW5pdGlvbiBmdWxseSBzcGVjaWZpZWQgZm9yIHRoZSBlbmRwb2ludCAoV1NETCAxLjEgcG9ydCkgcmVwcmVzZW50ZWQgYnkgdGhpcwotICAgICAqIEVuZHBvaW50RGVzY3JpcHRpb24uICBJZiB0aGUgV1NETCBpcyBQYXJ0aWFsLCB0aGF0IG1lYW5zIHRoZSBFbmRwb2ludCBjb3VsZCBub3QgYmUgY3JlYXRlZAotICAgICAqIHdpdGggdGhlIGluZm9tYXRpb24gY29udGFpbmVkIGluIHRoZSBXU0RMIGZpbGUsIGFuZCBhbm5vdGF0aW9ucyB3ZXJlIHVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFdTREwgd2FzIGZ1bGx5IHNwZWNpZmllZDsgZmFsc2UgaWYgaXQgd2FzIHBhcnRpYWwgV1NETAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV1NETEZ1bGx5U3BlY2lmaWVkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3ZTA1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogQW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgU0VJLWJhc2VkIFNlcnZpY2UgSW1wbGVtZW50YXRpb24uIEl0Ci0gKiBjYW4gY29ycmVzcG9uZCB0byBlaXRoZXIgZWl0aGVyIGEgY2xpZW50IHRvIHRoYXQgaW1wbCBvciB0aGUgYWN0dWFsIHNlcnZpY2UgaW1wbC4KLSAqIDxwLz4KLSAqIFRoZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsZXZhbnQgb25seSB0byBhbiBTRUktYmFzZWQgKGFrYQotICogRW5kcG9pbnQtYmFzZWQgb3IgSmF2YS1iYXNlZCkgZW5wZG9pbnQ7IFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50LCB3aGljaCBhcmUgbm90IG9wZXJhdGlvbiBiYXNlZAotICogYW5kIGRvIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgU0VJLCB3aWxsIG5vdCBoYXZlIGFuIGFuIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gY2xhc3MgYW5kCi0gKiBzdWItaGllcmFjaHkuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogPGI+RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBkZXRhaWxzPC9iPgotICogPHAvPgotICogICAgIENPUlJFU1BPTkRTIFRPOiAgICAgIEFuIFNFSSAob24gYm90aCBDbGllbnQgYW5kIFNlcnZlcikKLSAqIDxwLz4KLSAqICAgICBBWElTMiBERUxFR0FURTogICAgICBub25lCi0gKiA8cC8+Ci0gKiAgICAgQ0hJTERSRU46ICAgICAgICAgICAgMS4ubiBPcGVyYXRpb25EZXNjcmlwdGlvbgotICogPHAvPgotICogICAgIEFOTk9UQVRJT05TOgotICogICAgICAgICBTT0FQQmluZGluZyBbMTgxXQotICogPHAvPgotICogICAgIFdTREwgRUxFTUVOVFM6Ci0gKiAgICAgICAgIHBvcnRUeXBlCi0gKiA8cC8+Ci0gKiAgPC9wcmU+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiBhIHNwZWNpYWwgb3BlcmF0aW9uIGFkZGVkIHRvIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25zIGZvciBwcm92aWRlciAKLSAgICAgKiBlbmRwb2ludHMgdGhhdCBkbyBub3Qgc3BlY2lmeSBXU0RMLCBhbmQgdGhlcmVmb3JlIGRvIG5vdCBoYXZlIHNwZWNpZmljIFdTREwgb3BlcmF0aW9ucwotICAgICAqIGNyZWF0ZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgSFRUUCBiaW5kaW5ncywgbm90IGZvciBTT0FQIGJpbmRpbmdzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX05PV1NETF9QUk9WSURFUl9PUEVSQVRJT05fTkFNRSA9ICJqYXh3c05vV1NETFByb3ZpZGVyT3BlcmF0aW9uIjsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBFbmRwb2ludERlc2NyaXB0aW9uIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uKE1ldGhvZCBzZWlNZXRob2QpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIG9wZXJhdGlvbnMgbWF0Y2hpbmcgdGhlIG9wZXJhdGlvbiBRTmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbmRwb2ludAotICAgICAqIGRlc2NyaXB0aW9uLiBOb3RlIHRoYXQgaWYgdGhlIFNFSSBvciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIChhbmQgdGh1cyB0aGUgaW1wbGljaXQgU0VJKQotICAgICAqIGNvbnRhaW5lZCBKQVgtV1MgY2xpZW50IHNpZGUgYXN5bmMgb3BlcmF0aW9ucyB0aGVuIHRoZXkgd2lsbCBhbHNvIGJlIHJldHVybmVkLiBVc2UKLSAgICAgKiBnZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCkgdG8gcmV0dXJuIGFuIGFycmF5IG9mIG9wZXJhdGlvbnMgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBKQVgtV1MKLSAgICAgKiBjbGllbnQgc2lkZSBhc3luYyBvcGVyYXRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIG9wZXJhdGlvblFOYW1lCi0gICAgICogQHJldHVybgotICAgICAqIEBzZWUgI2dldERpc3BhdGNoYWJsZU9wZXJhdGlvbihRTmFtZSBvcGVyYXRpb25RTmFtZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXRPcGVyYXRpb24oUU5hbWUgb3BlcmF0aW9uUU5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgdGhlIGRpc3BhdGNoYWJsZSBvcGVyYXRpb25zIG1hdGNoaW5nIHRoZSBvcGVyYXRpb24gUU5hbWUuICBBIGRpc3BhdGNoYWJsZQotICAgICAqIG9wZXJhdGlvbiBpcyBvbmUgdGhhdCBpcyBOT1QgYSBKQVgtV1MgY2xpZW50LXNpZGUgYXN5bmMgbWV0aG9kIGludm9jYXRpb24gYW5kIGRvZXMgTk9UCi0gICAgICogY2FycnkgYW4gQFdlYk1ldGhvZChleGNsdWRlPXRydWUpIGFubm90YXRpb24uCi0gICAgICogCi0gICAgICogSkFYLVdTIGNsaWVudC1zaWRlIGFzeW5jIG1ldGhvZHMgd2hpY2ggaGF2ZSBzaWduYXR1cmVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXMgYXJlIAotICAgICAqIGZpbHRlcmVkIG91dCBvZiB0aGlzIGxpc3Q6IGphdmF4LnhtbC53cy5SZXNwb25zZTxUPgotICAgICAqIG1ldGhvZCguLi4pIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/PiBtZXRob2QoLi4uLCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyPFQ+KQotICAgICAqIDxwLz4KLSAgICAgKiBUaGVzZSBtZXRob2RzIGFyZSBmaWx0ZXJlZCBiZWNhdXNlIGEgY29tbW9uIHVzZSBjYXNlIGlzIHRvIHVzZSB0aGUgc2FtZSBTRUkgb24gYm90aCB0aGUKLSAgICAgKiBjbGllbnQgYW5kIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gc2lkZSwgZ2VuZXJhdGluZyBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZpY2UgaW1wbGVtbnRhdGlvbgotICAgICAqIGNvZGUgZnJvbSB0aGF0IFNFSS4gIElmIHRoYXQgU0VJIGhhcHBlbnMgdG8gY29udGFpbiB0aGUgY2xpZW50LXNpZGUtb25seSBKQVgtV1MgbWV0aG9kcywgdGhleQotICAgICAqIHNob3VsZCBiZSBpbmdvcmVkIG9uIHRoZSBzZXJ2aWNlIGltcGxlbWVuYXRpb24gc2lkZS4gIFRvIHJldHVybiBhbGwgdGhlIG9wZXJhdGlvbnMsIHVzZQotICAgICAqIGdldE9wZXJhdGlvbihRTmFtZSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKFFOYW1lIG9wZXJhdGlvblFOYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPcGVyYXRpb25EZXNjcmlwdGlvbltdIGdldERpc3BhdGNoYWJsZU9wZXJhdGlvbihRTmFtZSBvcGVyYXRpb25RTmFtZSk7Ci0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9ucygpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb24oU3RyaW5nIG9wZXJhdGlvbk5hbWUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0T3BlcmF0aW9ucygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZChTdHJpbmcgamF2YU1ldGhvZE5hbWUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IENsYXNzIGdldFNFSUNsYXNzKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgUU5hbWUgZ2V0UG9ydFR5cGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBnZXRTb2FwQmluZGluZ1VzZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25KYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYTVlZDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25KYXZhIHsKLSAgICBwdWJsaWMgYWJzdHJhY3QgV2ViU2VydmljZSBnZXRBbm5vV2ViU2VydmljZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIFNPQVBCaW5kaW5nIGdldEFubm9Tb2FwQmluZGluZygpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIGdldEFubm9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgZ2V0QW5ub1NvYXBCaW5kaW5nVXNlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uV1NETC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjZGI0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLQotcHVibGljIGludGVyZmFjZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uV1NETCB7Ci0KLSAgICBwdWJsaWMgUG9ydFR5cGUgZ2V0V1NETFBvcnRUeXBlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9GYXVsdERlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9GYXVsdERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2U3YjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRmF1bHREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLS8qKgotICogQSBGYXVsdERlc2NyaXB0aW9uIGNvcnJlc3BvbmRzIHRvIGEgZmF1bHQgdGhhdCBjYW4gYmUgdGhyb3duIGZyb20gYW4gb3BlcmF0aW9uLiAgTk9URSB0aGlzIGl0IG5vdCAKLSAqIGltcGxlbWVudGVkIHlldCEKLSAqIAotICogRmF1bHREZXNjcmlwdG9ucyBjb250YWluIGluZm9ybWF0aW9uIHRoYXQgaXMgb25seSByZWxldmVudCBmb3IgYW5kIFNFSS1iYXNlZCBzZXJ2aWNlLCBpLmUuIG9uZSB0aGF0IGlzIGludm9rZWQgdmlhIHNwZWNpZmljCi0gKiBtZXRob2RzLiAgVGhpcyBjbGFzcyBkb2VzIG5vdCBleGlzdCBmb3IgUHJvdmlkZXItYmFzZWQgc2VydmljZXMgKGkuZS4gdGhvc2UgdGhhdCBzcGVjaWZ5IFdlYlNlcnZpY2VQcm92aWRlcikKLSAqIAotICogPHByZT4KLSAqIDxiPk9wZXJhdGlvbkRlc2NyaXB0aW9uIGRldGFpbHM8L2I+Ci0gKiAKLSAqICAgICBDT1JSRVNQT05EUyBUTzogICAgICBBbiBleGNlcHRpb24gdGhyb3duIGJ5IGFuIG9wZXJhdGlvbiBvbiBhbiBTRUkgKG9uIGJvdGggQ2xpZW50IGFuZCBTZXJ2ZXIpICAgICAgCi0gKiAgICAgICAgIAotICogICAgIEFYSVMyIERFTEVHQVRFOiAgICAgIE5vbmUKLSAqICAgICAKLSAqICAgICBDSElMRFJFTjogICAgICAgICAgICBOb25lCi0gKiAgICAgCi0gKiAgICAgQU5OT1RBVElPTlM6Ci0gKiAgICAgICAgIFdlYkZhdWx0IFsyMjRdCi0gKiAgICAgCi0gKiAgICAgV1NETCBFTEVNRU5UUzoKLSAqICAgICAgICAgZmF1bHQgbWVzc2FnZQotICogICAgICAgICAKLSAqICA8L3ByZT4gICAgICAgCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBGYXVsdERlc2NyaXB0aW9uIHsKLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKTsKLQotCi0gICAgLyoqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbiBjbGFzcyAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyB0aGF0IGlzIHByb3ZpZGVkIHZpYSB0aGUgZ2V0RmF1bHRJbmZvIG1ldGhvZC4gIiIgaXMgcmV0dXJuZWQgaWYgdGhlCi0gICAgICogICAgICAgICBleGNlcHRpb24gY2xhc3MgZG9lcyBub3QgcHJvdmlkZSBhIGdldEZhdWx0SW5mbyBtZXRob2QgKHN1Y2ggZXhjZXB0aW9ucyBhcmUKLSAgICAgKiAgICAgICAgIGNvbnNpZGVyZWQgbm9uLWNvbXBsaWFudCBieSBKQVgtV1MpLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRJbmZvKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBKQVhCIGNsYXNzIGRlZmluZWQgaW4gdGhlIHNjaGVtYSBmb3IgdGhpcyBleGNlcHRpb24uICBOb3RlIHRoYXQgdGhpcwotICAgICAqICAgICAgICAgaXMgdXN1YWxseSBhIGJlYW4sIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIGEgamF2YSBwcmltaXRpdmUuICBJZiBub3QgZGVmaW5lZCwgdGhlCi0gICAgICogICAgICAgICBnZXRGYXVsdEluZm8gdHlwZSBpcyByZXR1cm5lZC4KLSAgICAgKiAgICAgICAgIDxwLz4KLSAgICAgKiAgICAgICAgIE5PVEUgRm9yIG5vbi1jb21wbGlhbnQgZXhjZXB0aW9ucywgdGhlIGdldEZhdWx0SW5mbyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlZC4KLSAgICAgKiAgICAgICAgIEluIHRoZXNlIGNhc2VzLCBhICIiIGlzIHJldHVybmVkLiAgVGhlIHJ1bnRpbWUgKEpBWFdTKSBtYXkgdXNlIG90aGVyIGluZm9ybWF0aW9uIHRvCi0gICAgICogICAgICAgICBsb2NhdGUgYW5kL29yIGJ1aWxkIHRoZSBmYXVsdGJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCBsb2NhbG5hbWUgKGZvciB0aGUgSkFYQiBjbGFzcykgY29ycmVzcG9uZGluZyB0byB0aGlzIGV4Y2VwdGlvbi4gIiIgaWYgbm90Ci0gICAgICogICAgICAgICBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgZWxlbWVudCB0YXJnZXROYW1lc3BhY2UgKGZvciB0aGUgSkFYQiBjbGFzcykgY29ycmVzcG9uZGluZyB0byB0aGlzIGV4Y2VwdGlvbi4gIiIKLSAgICAgKiAgICAgICAgIGlmIG5vdCBkZWZpbmVkLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0ZhdWx0RGVzY3JpcHRpb25KYXZhLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9GYXVsdERlc2NyaXB0aW9uSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmYxODFiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0ZhdWx0RGVzY3JpcHRpb25KYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLQotcHVibGljIGludGVyZmFjZSBGYXVsdERlc2NyaXB0aW9uSmF2YSB7Ci0gICAgcHVibGljIFdlYkZhdWx0IGdldEFubm9XZWJGYXVsdCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRmF1bHREZXNjcmlwdGlvbldTREwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0ZhdWx0RGVzY3JpcHRpb25XU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjMyNDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRmF1bHREZXNjcmlwdGlvbldTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0RGVzY3JpcHRpb25XU0RMIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJmZGYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogQW4gT3BlcmF0aW9uRGVzY3JpcHRvbiBjb3JyZXNwb25kcyB0byBhIG1ldGhvZCBvbiBhbiBTRUkuICBUaGF0IFNFSSBjb3VsZCBiZSBleHBsaWNpdCAoaS5lLgotICogV2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZT1zZWkuY2xhc3MpIG9yIGltcGxpY2l0IChpLmUuIHB1YmxpYyBtZXRob2RzIG9uIHRoZSBzZXJ2aWNlCi0gKiBpbXBsZW1lbnRhdGlvbiBhcmUgdGhlIGNvbnRyYWN0IGFuZCB0aHVzIHRoZSBpbXBsaWNpdCBTRUkpLiAgTm90ZSB0aGF0IHdoaWxlCi0gKiBPcGVyYXRpb25EZXNjcmlwdGlvbnMgYXJlIGNyZWF0ZWQgb24gYm90aCB0aGUgY2xpZW50IGFuZCBzZXJ2aWNlIHNpZGUsIGltcGxpY2l0IFNFSXMgd2lsbCBvbmx5Ci0gKiBvY2N1ciBvbiB0aGUgc2VydmljZSBzaWRlLgotICogPHAvPgotICogT3BlcmF0aW9uRGVzY3JpcHRvbnMgY29udGFpbiBpbmZvcm1hdGlvbiB0aGF0IGlzIG9ubHkgcmVsZXZlbnQgZm9yIGFuZCBTRUktYmFzZWQgc2VydmljZSwgaS5lLgotICogb25lIHRoYXQgaXMgaW52b2tlZCB2aWEgc3BlY2lmaWMgbWV0aG9kcy4gIFRoaXMgY2xhc3MgZG9lcyBub3QgZXhpc3QgZm9yIFByb3ZpZGVyLWJhc2VkIHNlcnZpY2VzCi0gKiAoaS5lLiB0aG9zZSB0aGF0IHNwZWNpZnkgV2ViU2VydmljZVByb3ZpZGVyKQotICogPHAvPgotICogPHByZT4KLSAqIDxiPk9wZXJhdGlvbkRlc2NyaXB0aW9uIGRldGFpbHM8L2I+Ci0gKiA8cC8+Ci0gKiAgICAgQ09SUkVTUE9ORFMgVE86ICAgICAgQSBzaW5nbGUgb3BlcmF0aW9uIG9uIGFuIFNFSSAob24gYm90aCBDbGllbnQgYW5kIFNlcnZlcikKLSAqIDxwLz4KLSAqICAgICBBWElTMiBERUxFR0FURTogICAgICBBeGlzT3BlcmF0aW9uCi0gKiA8cC8+Ci0gKiAgICAgQ0hJTERSRU46ICAgICAgICAgICAgMC4ubiBQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICogICAgICAgICAgICAgICAgICAgICAgICAgIDAuLm4gRmF1bHREZXNjcmlwdGlvbiAoTm90ZTogTm90IGZ1bGx5IGltcGxlbWVudGVkKQotICogPHAvPgotICogICAgIEFOTk9UQVRJT05TOgotICogICAgICAgICBXZWJNZXRob2QgWzE4MV0KLSAqICAgICAgICAgU09BUEJpbmRpbmcgWzE4MV0KLSAqICAgICAgICAgT25ld2F5IFsxODFdCi0gKiAgICAgICAgIFdlYlJlc3VsdCBbMTgxXQotICogICAgICAgICBSZXF1ZXN0V3JhcHBlciBbMjI0XQotICogICAgICAgICBSZXNwb25zZVdyYXBwZXIgWzIyNF0KLSAqIDxwLz4KLSAqICAgICBXU0RMIEVMRU1FTlRTOgotICogICAgICAgICBvcGVyYXRpb24KLSAqIDxwLz4KLSAqICA8L3ByZT4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcGVyYXRpb25EZXNjcmlwdGlvbiB7Ci0gICAgLyoqCi0gICAgICogUGFyYW1hdGVyIHNldCBvbiBBeGlzT3BlcmF0aW9uIHdoaWNoIGNvbnRhaW5zIGFuIEFycmF5TGlzdCBvZiBTT0FQIGhlYWRlciBRTmFtZXMKLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIFNFSSBwYXJhbWV0ZXJzLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUEFSQU1FVEVSX1FOQU1FUyA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uLmhlYWRlclBhcmFtZXRlclFOYW1lcyI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJU19PUEVSQVRJT05fUEFSQU1FVEVSID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb24uYXhpc09wZXJhdGlvblBhcmFtZXRlciI7Ci0gICAgCi0gICAgcHVibGljIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotCi0gICAgcHVibGljIEZhdWx0RGVzY3JpcHRpb25bXSBnZXRGYXVsdERlc2NyaXB0aW9ucygpOwotCi0gICAgcHVibGljIEZhdWx0RGVzY3JpcHRpb24gcmVzb2x2ZUZhdWx0QnlFeGNlcHRpb25OYW1lKFN0cmluZyBleGNlcHRpb25DbGFzc05hbWUpOwotCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uIGdldFBhcmFtZXRlckRlc2NyaXB0aW9uKGludCBwYXJhbWV0ZXJOdW1iZXIpOwotCi0gICAgcHVibGljIFBhcmFtZXRlckRlc2NyaXB0aW9uIGdldFBhcmFtZXRlckRlc2NyaXB0aW9uKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTsKLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgIAotICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbiBAWG1sTGlzdCBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiB0aGUgbWV0aG9kCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0VHlwZSgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEF4aXNPcGVyYXRpb24gZ2V0QXhpc09wZXJhdGlvbigpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhTWV0aG9kTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhRGVjbGFyaW5nQ2xhc3NOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SmF2YVBhcmFtZXRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIENsaWVudCBzaWRlIGFuZCBub24tREJDIHNlcnZpY2Ugc2lkZSBvbmx5ISBSZXR1cm4gdGhlIFNFSSBtZXRob2QgZm9yIHdoaWNoIGEKLSAgICAgKiBzZXJ2aWNlLmdldFBvcnQoQ2xhc3MgU0VJQ2xhc3MpIGNyZWF0ZWQgdGhlIEVuZHBvaW50RGVzY3JpcHRpb25JbnRlcmZhY2UgYW5kIHRoZSBhc3NvY2lhdGVkCi0gICAgICogT3BlcmF0aW9uRGVzY3JpcHRpb25zLiAgUmV0dXJucyBudWxsIG9uIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHNpZGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZCBnZXRTRUlNZXRob2QoKTsKLQotICAgIC8qKgotICAgICAqIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gc2lkZSBvbmx5ISAgR2l2ZW4gYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLCBmaW5kIHRoZSBtZXRob2Qgb24KLSAgICAgKiB0aGF0IGNsYXNzIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBvcGVyYXRpb24gZGVzY3JpcHRpb24uICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9uIHRoZQotICAgICAqIHNlcnZpY2UgaW1wbCBzaWRlLCB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb25zIGNhbiBiZSBidWlsdCB1c2luZyBieXRlLXNjYW5uaW5nIGFuZCB3aXRob3V0IHRoZQotICAgICAqIGNsYXNzIGFjdHVhbGx5IGhhdmluZyBiZWVuIGxvYWRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlSW1wbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZEZyb21TZXJ2aWNlSW1wbChDbGFzcyBzZXJ2aWNlSW1wbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbnN3ZXIgaWYgdGhpcyBvcGVyYXRpb24gY29ycmVzcG9uZHMgdG8gdGhlIEpBWC1XUyBDbGllbnQtb25seSBhc3luYyBtZXRob2RzLiAgVGhlc2UgbWV0aG9kcwotICAgICAqIGFyZSBvZiB0aGUgZm9ybTogamF2YXgueG1sLndzLlJlc3BvbnNlPFQ+IG1ldGhvZCguLi4pIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/PgotICAgICAqIG1ldGhvZCguLi4sIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI8VD4pCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCk7Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0TmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPbmVXYXkoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhjbHVkZWQoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdE5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFBhcnROYW1lKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3VsdEhlYWRlcigpOwotCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIENsYXNzIG9mIHRoZSByZXR1cm4gdHlwZS4gIEZvciBKQVgtV1MgYXN5bmMgcmV0dXJucyBvZiB0eXBlIFJlc3BvbnNlPFQ+IG9yCi0gICAgICogQXN5bmNIYW5kbGVyPFQ+LCB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIFJlc3BvbnNlIG9yIEFzeW5jSGFubGVyIHJlc3BlY3RpdmVseSBpcyByZXR1cm5lZC4KLSAgICAgKiBUbyBnZXQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCA8VD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQ2xhc3MKLSAgICAgKiBAc2VlIGdldFJlc3VsdEFjdHVhbFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFjdHVhbCBDbGFzcyBvZiB0aGUgdHlwZS4gIEZvciBhIEpBWC1XUyBhc3luYyByZXR1cm4gdHlwZSBvZiBSZXNwb25zZTxUPiBvcgotICAgICAqIEFzeW5jSGFuZGxlcjxUPiwgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCA8VD4gaXMgcmV0dXJuZWQuICBGb3Igbm9uLUpBWC1XUyBhc3luYyByZXR1cm5zLAotICAgICAqIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybiB0eXBlIGlzIHJldHVybmVkLiAgTm90ZSB0aGF0IGZvciBhIEdlbmVyaWMgcmV0dXJuIHR5cGUsCi0gICAgICogc3VjaCBhcyBMaXN0PEZvbz4sIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggTGlzdCB3aWxsIGJlIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBhY3R1YWwgQ2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0QWN0dWFsVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgd3JhcHBlciBjbGFzcy4gTk9URTogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUKLSAgICAgKiAgICAgICAgIHJlcXVlc3Qgd3JhcHBlciBjbGFzcyBpcyBub3Qga25vd24gZHVyaW5nIHRoZSBkZXNjcmlwdGlvbiBsYXllciBwcm9jZXNzaW5nLiBJbiBzdWNoCi0gICAgICogICAgICAgICBjYXNlcyB0aGUgaW1wbGVtZW50YXRpb24gbWF5IHVzZSBwcm9wcmlldGFyeSBjb2RlIHRvIGZpbmQgdGhlIGNsYXNzLiBGb3IgZXhhbXBsZSwKLSAgICAgKiAgICAgICAgIEpBWFdTIG1heSBsb29rIGZvciBhIG1hdGNoaW5nIGNsYXNzIGluIHRoZSBzZWkgcGFja2FnZSwgaW4gYSBzcGVjaWFsIGpheHdzIHBhY2thZ2Ugb3IKLSAgICAgKiAgICAgICAgIHByb2NlZWQgd2l0aG91dCB0aGUgY2xhc3MgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIG5hbWUgb2YgdGhlIHdyYXBwZXIgY2xhc3MuIE5PVEU6IFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICByZXF1ZXN0IHdyYXBwZXIgY2xhc3MgaXMgbm90IGtub3duIGR1cmluZyB0aGUgZGVzY3JpcHRpb24gbGF5ZXIgcHJvY2Vzc2luZy4gSW4gc3VjaAotICAgICAqICAgICAgICAgY2FzZXMgdGhlIGltcGxlbWVudGF0aW9uIG1heSB1c2UgcHJvcHJpZXRhcnkgY29kZSB0byBmaW5kIHRoZSBjbGFzcy4gRm9yIGV4YW1wbGUsCi0gICAgICogICAgICAgICBKQVhXUyBtYXkgbG9vayBmb3IgYSBtYXRjaGluZyBjbGFzcyBpbiB0aGUgc2VpIHBhY2thZ2UsIGluIGEgc3BlY2lhbCBqYXh3cyBwYWNrYWdlIG9yCi0gICAgICogICAgICAgICBwcm9jZWVkIHdpdGhvdXQgdGhlIGNsYXNzIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1OYW1lcygpOwotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCk7Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIGdldFNvYXBCaW5kaW5nVXNlKCk7Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIGdldE9wZXJhdGlvblJ1bnRpbWVEZXNjKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvblJ1bnRpbWVEZXNjKE9wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbiBvcmQpOwotCi0gICAgLyoqCi0gICAgICogRm9yIEpBWC1XUyBjbGllbnQtc2lkZSBhc3luYyBvcGVyYXRpb25zLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHN5bmMgCi0gICAgICogT3BlcmF0aW9uRGVzY3JpcHRpb24uCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IGlmIHRoaXMgbWV0aG9kIGlzIHVzZWQgd2l0aGluIHRoZSBtZXRhZGF0YSBsYXllciwgaXQgaXMgcG9zc2libGUgdGhhdCBpdCB3aWxsIHJldHVybgotICAgICAqIG51bGwuICBUaGF0IHdpbGwgaGFwcGVuIGlmIHRoZSBtZXRhZGF0YSBsYXllciBpcyBjb25zdHJ1Y3RlZCBmcm9tIGFubm90YXRpb25zIG9uIHRoZSBTRUkgCi0gICAgICogKG5vdCBXU0RMKS4gIEluIHRoYXQgY2FzZSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgYXN5bmMgbWV0aG9kcyBvbiB0aGUgU0VJIGFyZSBwcm9jZXNzZWQgCi0gICAgICogYmVmb3JlIHRoZSBzeW5jIG1ldGhvZC4gIEluIHRoYXQgY2FzZSwgdGhlcmUgd2lsbCBiZSBubyBzeW5jIG1ldGhvZCB5ZXQuICBJZiB0aGlzIG1ldGhvZAotICAgICAqIGlzIGNhbGxlZCBvdXRzaWRlIHRoZSBtZXRhZGF0YSBsYXllciwgdGhlbiBpZiB0aGUgYXN5bmMgbWV0aG9kcyBleGlzdCwgdGhlIHN5bmMgbWV0aG9kCi0gICAgICogc2hvdWxkIGFsc28gZXhpc3QuICAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN5bmMgb3BlcmF0aW9uLCBvciBudWxsIChzZWUgbm90ZSBhYm92ZSkuCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldFN5bmNPcGVyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQXR0YWNobWVudCBEZXNjcmlwdGlvbiBmb3IgdGhlIHJldHVybiB0eXBlIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0YWNobWVudERlc2NyaXB0aW9uIGdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIG9mIGJpbmRpbmcgaW5wdXQgbWVzc2FnZSBmb3IgdGhlIG9wZXJhdGlvbgotICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nSW5wdXROYW1lc3BhY2UoKTsKLSAgICAKLSAgICAvKioKLSAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBvZiBiaW5kaW5nIG91dHB1dCBtZXNzYWdlIGZvciB0aGUgb3BlcmF0aW9uCi0gICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdPdXRwdXROYW1lc3BhY2UoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0b3Igb2YgbmVzdGVkIHN3YVJlZiBhdHRhY2htZW50cyBvbiB0aGUgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2V0cyB0aGUgaW5kaWNhdG9yIG9mIG5lc3RlZCByZXF1ZXN0IHN3YVJlZiBhdHRhY2htZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoYm9vbGVhbiBiKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0b3Igb2YgbmVzdGVkIHN3YVJlZiBhdHRhY2htZW50cyBvbiB0aGUgcmVzcG9uc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cygpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXRzIHRoZSBpbmRpY2F0b3Igb2YgbmVzdGVkIHJlc3BvbnNlIHN3YVJlZiBhdHRhY2htZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKGJvb2xlYW4gYik7Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbkphdmEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1NGNiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbkphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC53cy5BY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhIHsKLQotICAgIHB1YmxpYyBXZWJSZXN1bHQgZ2V0QW5ub1dlYlJlc3VsdCgpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbm5vV2ViUmVzdWx0SGVhZGVyKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJSZXN1bHROYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJSZXN1bHRQYXJ0TmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgUmVxdWVzdFdyYXBwZXIgZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgQFJlcXVlc3RXcmFwcGVyIGNsYXNzTmFtZSBvciBudWxsIE5PVEU6IFRoZXJlIGlzIG5vIGRlZmF1bHQKLSAgICAgKiAgICAgICAgIGZvciB0aGUgY2xhc3NuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1JlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIFJlc3BvbnNlV3JhcHBlciBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgQFJlc3BvbnNlV3JhcHBlciBjbGFzc05hbWUgb3IgbnVsbCBOT1RFOiBUaGVyZSBpcyBubyBkZWZhdWx0Ci0gICAgICogICAgICAgICBmb3IgdGhlIGNsYXNzbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKTsKLQotICAgIHB1YmxpYyBTT0FQQmluZGluZyBnZXRBbm5vU29hcEJpbmRpbmcoKTsKLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOwotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIGdldEFubm9Tb2FwQmluZGluZ1N0eWxlKCk7Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIGdldEFubm9Tb2FwQmluZGluZ1VzZSgpOwotCi0gICAgcHVibGljIFdlYk1ldGhvZCBnZXRBbm5vV2ViTWV0aG9kKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJNZXRob2RBY3Rpb24oKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGdldEFubm9XZWJNZXRob2RFeGNsdWRlKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJNZXRob2RPcGVyYXRpb25OYW1lKCk7Ci0KLSAgICAvLyBOb3RlIHRoYXQgdGhlIFdlYlBhcmFtIGFubm90YXRpb24gaXMgaGFuZGxlZCBieSBQYXJhbWV0ZXJEZXNjcmlwdGlvbi4gIFRoZXNlCi0gICAgLy8gV2ViUGFyYW0tcmVsYXRlZCBtZXRob2RzIGFyZSBzaW1wbHkgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAgICBwdWJsaWMgTW9kZVtdIGdldEFubm9XZWJQYXJhbU1vZGVzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QW5ub1dlYlBhcmFtTmFtZXMoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbm5vV2ViUGFyYW1UYXJnZXROYW1lc3BhY2VzKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm9XZWJQYXJhbUhlYWRlcihTdHJpbmcgbmFtZSk7Ci0KLSAgICBwdWJsaWMgT25ld2F5IGdldEFubm9PbmV3YXkoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub09uZVdheSgpOwotICAgIAotICAgIHB1YmxpYyBBY3Rpb24gZ2V0QW5ub0FjdGlvbigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uRGVzY3JpcHRpb25XU0RMLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbldTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyZWRmMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvbldTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9wZXJhdGlvbkRlc2NyaXB0aW9uV1NETCB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ1NDRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL09wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi0vKioKLSAqIEEgT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIG9iamVjdCBjb250YWlucyBpbW11dGFibGUgZGF0YSB0aGF0IGlzIG5lZWRlZCBkdXJpbmcgdGhlIHJ1bnRpbWUKLSAqIChpLmUuIHRvIGNhY2hlIG1hcnNoYWwgYW5kIGRlbWFyc2hhbCBpbmZvcm1hdGlvbikuICBUaGUgT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIG9iamVjdCBtdXN0Ci0gKiBiZSBpbW11dGFibGUgc28gdGhhdCBpdCBjYW4gc2FmZWx5IGFjY2Vzc2VkIGJ5IG11bHRpcGxlIHRoZWFkcyB3aXRob3V0IHN5bmNocm9uaXphdGlvbi4KLSAqIDxwLz4KLSAqIEl0IGNhbm5vdCBiZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIHRoYXQgbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50IHRocmVhZHMvCi0gKiBjbGFzc2xvYWRlcnMgKGkuZS4gaXQgY2Fubm90IGhhdmUgcmVmZXJlbmNlcyB0byBDbGFzcyBvYmplY3RzKQotICogPHAvPgotICogVGhlIGFjdHVhbCBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24gb2JqZWN0cyBhcmUgYWNjZXNzZWQgdmlhIHRoZSBrZXkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIHsKLQotICAgIC8qKiBAcmV0dXJuIE9wZXJhdGlvbkRlc2MgcGFyZW50ICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0KLSAgICAvKiogQHJldHVybiBTdHJpbmcgKGkuZS4gSkFYV1MpICovCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXkoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9QYXJhbWV0ZXJEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJjMjVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLQotLyoqCi0gKiBBIFBhcmFtZXRlckRlc2NyaXB0b24gY29ycmVzcG9uZHMgdG8gcGFyYW1ldGVyIHRvIGEgbWV0aG9kIG9uIGFuIFNFSS4gVGhhdCBTRUkgY291bGQgYmUgZXhwbGljaXQKLSAqIChpLmUuIFdlYlNlcnZpY2UuZW5kcG9pbnRJbnRlcmZhY2U9c2VpLmNsYXNzKSBvciBpbXBsaWNpdCAoaS5lLiBwdWJsaWMgbWV0aG9kcyBvbiB0aGUgc2VydmljZQotICogaW1wbGVtZW50YXRpb24gYXJlIHRoZSBjb250cmFjdCBhbmQgdGh1cyB0aGUgaW1wbGljaXQgU0VJKS4KLSAqIDxwLz4KLSAqIFBhcmFtZXRlckRlc2NyaXB0b25zIGNvbnRhaW4gaW5mb3JtYXRpb24gdGhhdCBpcyBvbmx5IHJlbGV2ZW50IGZvciBhbmQgU0VJLWJhc2VkIHNlcnZpY2UsIGkuZS4KLSAqIG9uZSB0aGF0IGlzIGludm9rZWQgdmlhIHNwZWNpZmljIG1ldGhvZHMuIFRoaXMgY2xhc3MgZG9lcyBub3QgZXhpc3QgZm9yIFByb3ZpZGVyLWJhc2VkIHNlcnZpY2VzCi0gKiAoaS5lLiB0aG9zZSB0aGF0IHNwZWNpZnkgV2ViU2VydmljZVByb3ZpZGVyKQotICogPHAvPgotICogPHByZT4KLSAqICA8Yj5QYXJhbWV0ZXJuRGVzY3JpcHRpb24gZGV0YWlsczwvYj4KLSAqIDxwLz4KLSAqICAgICAgQ09SUkVTUE9ORFMgVE86ICAgICAgQSBwYXJhbWV0ZXIgdG8gYSBtZXRob2Qgb24gYW4gU0VJIChvbiBib3RoIENsaWVudCBhbmQgU2VydmVyKQotICogPHAvPgotICogICAgICBBWElTMiBERUxFR0FURTogICAgICBOb25lCi0gKiA8cC8+Ci0gKiAgICAgIENISUxEUkVOOiAgICAgICAgICAgIE5vbmUKLSAqIDxwLz4KLSAqICAgICAgQU5OT1RBVElPTlM6Ci0gKiAgICAgICAgICBXZWJQYXJhbSBbMTgxXQotICogPHAvPgotICogICAgICBXU0RMIEVMRU1FTlRTOgotICogICAgICAgICAgbWVzc2FnZSBwYXJ0cwotICogPHAvPgotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVyRGVzY3JpcHRpb24gewotCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlck5hbWUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcnROYW1lKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hvbGRlclR5cGUoKTsKLSAgICAKLSAgICAvLyBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYW4gQFhNTExpc3QgYW5ub3RhdGlvbiB3YXMgZm91bmQgb24gYSBwYXJhbWV0ZXIKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RUeXBlKCk7Ci0gICAgCi0gICAgcHVibGljIENsYXNzIGdldFBhcmFtZXRlclR5cGUoKTsKLQotICAgIHB1YmxpYyBDbGFzcyBnZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hlYWRlcigpOwotCi0gICAgcHVibGljIFdlYlBhcmFtLk1vZGUgZ2V0TW9kZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gQXR0YWNobWVudERlc2NyaXB0aW9uIGZvciB0aGlzIHBhcmFtZXRlciBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBnZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckRlc2NyaXB0aW9uSmF2YS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNGExZTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhIHsKLSAgICBwdWJsaWMgV2ViUGFyYW0gZ2V0QW5ub1dlYlBhcmFtKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbm5vV2ViUGFyYW1IZWFkZXIoKTsKLQotICAgIHB1YmxpYyBXZWJQYXJhbS5Nb2RlIGdldEFubm9XZWJQYXJhbU1vZGUoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlBhcmFtTmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1QYXJ0TmFtZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1UYXJnZXROYW1lc3BhY2UoKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BhcmFtZXRlckRlc2NyaXB0aW9uV1NETC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb25XU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWZkNTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFyYW1ldGVyRGVzY3JpcHRpb25XU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGFyYW1ldGVyRGVzY3JpcHRpb25XU0RMIHsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0NThhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogICAgICANCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhhbmRsZXJzIHdoaWNoIGhhdmUgYmVlbiByZXNvbHZlZCB0byBhIHBhcnRpY2x1YXIgcG9ydC4NCi0gKiBUaGlzIGluZm9ybWF0aW9uIGNvbnNpc3RzIG9mOg0KLSAqIC0gVGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gY2xhc3Nlcw0KLSAqIC0gVGhlIGxpc3Qgb2YgU09BUCByb2xlcyAoYWthIFNPQVAgQWN0b3JzKQ0KLSAqIA0KLSAqICBUaGlzIGluZm9ybWF0aW9uIGlzIGNhY2hlZCBvbiB0aGUgc2VydmljZSBkZXNjcnBpcHRpb24gc28gdGhlIGhhbmRsZXJzIGRvbid0IA0KLSAqICBoYXZlIHRvIGJlIHJlc29sdmVkIGZvciBvdGhlciBIYW5kbGVyUmVzb2x2ZXJzIHJlcXVlc3RpbmcgaGFuZGxlcnMgZm9yIHRoZSANCi0gKiAgc2FtZSBwb3J0Lg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIHsNCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzZXMoTGlzdDxDbGFzcz4gaGFuZGxlckNsYXNzZXMpOw0KLSAgICBwdWJsaWMgTGlzdDxDbGFzcz4gZ2V0SGFuZGxlckNsYXNzZXMoKTsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKExpc3Q8U3RyaW5nPiByb2xlKTsNCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSb2xlcygpOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjI0NDc4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBTZXJ2aWNlRGVzY3JpcHRpb24gY29ycmVzcG9uZHMgdG8gYSBTZXJ2aWNlIHVuZGVyIHdoaWNoIHRoZXJlIGNhbiBiZSBhIGNvbGxlY3Rpb24gb2YgZW5wZG9pbnRzLgotICogSW4gV1NETCAxLjEgdGVybXMsIHRoZW4sIGEgU2VydmljZURlc2NyaXB0aW9uIGNvcnJlc3BvbmRzIHRvIGEgd3NkbDpTZXJ2aWNlIHVuZGVyIHdoaWNoIHRoZXJlIGFyZQotICogb25lIG9yIG1vcmUgd3NkbDpQb3J0IGVudHJpZXMuIFRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gaXMgdGhlIHJvb3Qgb2YgdGhlIG1ldGRhdGEgYWJzdHJhY3Rpb24KLSAqIERlc2NyaXB0aW9uIGhpZXJhY2h5LgotICogPHAvPgotICogVGhlIERlc2NyaXB0aW9uIGhpZXJhY2h5IGlzOgotICogPHByZT4KLSAqIFNlcnZpY2VEZXNjcmlwdGlvbgotICogICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXQotICogICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uCi0gKiAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdCi0gKiAgICAgICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXQotICogICAgICAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb25bXQotICogPHAvPgotICogPGI+U2VydmljZURlc2NyaXB0aW9uIGRldGFpbHM8L2I+Ci0gKiA8cC8+Ci0gKiAgICAgQ09SUkVTUE9ORFMgVE86Ci0gKiAgICAgICAgIE9uIHRoZSBDbGllbnQ6IFRoZSBKQVgtV1MgU2VydmljZSBjbGFzcyBvciBnZW5lcmF0ZWQgc3ViY2xhc3MuCi0gKiA8cC8+Ci0gKiAgICAgICAgIE9uIHRoZSBTZXJ2ZXI6IFRoZSBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLiAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgMS4uMQotICogICAgICAgICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIGEgU2VydmljZURlc2NyaXB0aW9uIGFuZCBFbmRwb2ludERlc2NyaXB0aW9uCi0gKiAgICAgICAgIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KLSAqIDxwLz4KLSAqICAgICBBWElTMiBERUxFR0FURTogICAgICBOb25lCi0gKiA8cC8+Ci0gKiAgICAgQ0hJTERSRU46ICAgICAgICAgICAgMS4ubiBFbmRwb2ludERlc2NyaXB0aW9uCi0gKiA8cC8+Ci0gKiAgICAgQU5OT1RBVElPTlM6Ci0gKiAgICAgICAgIE5vbmUKLSAqIDxwLz4KLSAqICAgICBXU0RMIEVMRU1FTlRTOgotICogICAgICAgICBzZXJ2aWNlCi0gKiA8cC8+Ci0gKiAgPC9wcmU+Ci0gKi8KLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlRGVzY3JpcHRpb24gewotICAgIAotCXB1YmxpYyBhYnN0cmFjdCBFbmRwb2ludERlc2NyaXB0aW9uW10gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpOwotCi0gICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50RGVzY3JpcHRpb24gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihRTmFtZSBwb3J0UU5hbWUpOwotCi0gICAgLy8gQ2FsbGVkIHRoZSBjbGllbnQtc2lkZSB0byByZXRyaWV2ZSBkZWZpbmVkIGFuZCBkeW5hbWljIHBvcnRzCi0gICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50RGVzY3JpcHRpb24gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihRTmFtZSBwb3J0UU5hbWUsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBFbmRwb2ludERlc2NyaXB0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBTRUkgY2xhc3MuICBOb3RlIHRoYXQgRGlzcGF0Y2ggZW5kcG9pbnRzCi0gICAgICogd2lsbCBuZXZlciBiZSByZXR1cm5lZCBiZWNhdXNlIHRoZXkgZG8gbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBTRUkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VpQ2xhc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IEVuZHBvaW50RGVzY3JpcHRpb25bXSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKENsYXNzIHNlaUNsYXNzKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRBeGlzQ29uZmlnQ29udGV4dCgpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFNlcnZpY2VDbGllbnQgZ2V0U2VydmljZUNsaWVudChRTmFtZSBwb3J0UU5hbWUsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFFOYW1lIGdldFNlcnZpY2VRTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBoYW5kbGVyIGNoYWluIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXMgYSBIYW5kbGVyQ2hhaW5zVHlwZSBvYmplY3QuICBJZiB0aGUKLSAgICAgKiBrZXkgaXMgbm9uLW51bGwgdGhlbiBpdCBpcyB1c2VkIHRvIGxvb2sgZm9yIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgICAgKiBzcGFyc2UgbWV0YWRhdGEuICBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgcmVzb2x2ZWQgaXM6Ci0gICAgICogMSkgTG9vayBpbiBzcGFyc2UgY29tcG9zaXRlIGlmIHRoZSBrZXkgaXMgbm90IG51bGwKLSAgICAgKiAyKSBMb29rIGluIHRoZSBjb21wb3NpdGUKLSAgICAgKiAzKSBMb29rIGZvciBhIEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGFuZCByZWFkIGluIHRoZSBmaWxlIGl0IHNwZWNpZmllcyAgCi0gICAgICogCi0gICAgICogQHBhcmFtIHNlcnZpY2VEZWxlZ2F0ZUtleSBNYXkgYmUgbnVsbC4gIElmIG5vbi1udWxsLCB1c2VkIHRvIGxvb2sgZm9yIHNlcnZpY2UtZGVsZWdhdGUKLSAgICAgKiAgICAgc3BlY2lmaWMgc3BhcnNlIGNvbXBvc2l0ZSBpbmZvcm1hdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgSGFuZGxlckNoYWluc1R5cGUgb2JqZWN0IG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgaGFuZGxlciBjaGFpbiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFzIGEgSGFuZGxlckNoYWluc1R5cGUgb2JqZWN0LgotICAgICAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBnZXRIYW5kbGVyQ2hhaW4obnVsbCkuCi0gICAgICogQHNlZSAjZ2V0SGFuZGxlckNoYWluKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHBvcnRzIGZvciB0aGlzIHNlcml2Y2UuICBUaGUgcG9ydHMgcmV0dXJuZWQgYXJlIHRoZSAtIFBvcnRzIGRlY2xhcmVkCi0gICAgICogcG9ydHMgZm9yIHRoaXMgU2VydmljZS4gIFRoZXkgY2FuIGJlIGRlbGNhcmVkIGluIHRoZSBXU0RMIG9yIHZpYSBhbm5vdGF0aW9ucy4gLSBEeW5hbWljIHBvcnRzCi0gICAgICogYWRkZWQgdG8gdGhlIHNlcnZpY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVsZWdhdGVLZXkgVGhpcyBzaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsIHdoZW4gY2FsbGVkIHZpYSBTZXJ2aWNlRGVsZWdhdGUgYW5kIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBoZWxwIHJldHJpZXZlIGR5bmFtaWMgcG9ydHMgcGVyIGNsaWVudAotCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFFOYW1lPiBnZXRQb3J0cyhPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5KTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIGdldFNlcnZpY2VSdW50aW1lRGVzYyhTdHJpbmcgbmFtZSk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUnVudGltZURlc2MoU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBvcmQpOwotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIEFuc3dlciBpZiBNVE9NIGlzIGVuYWJsZWQgZm9yIHRoZSBzZXJ2aWNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgU2VydmljZSBEZXNjcmlwdGlvbi4gIFRoaXMKLSAgICAgKiBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgb24gdGhlIHNlcnZpY2UtcmVxdWVzdGVyIHNpZGU7IGl0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIAotICAgICAqIHNlcnZpY2UtcHJvdmlkZXIgc2lkZS4gIElmIHRoZSBrZXkgaXMgbm9uLW51bGwsIGl0IGlzIHVzZWQgdG8gbG9vayB1cCBhbiBzcGFyc2UgbWV0YWRhdGEKLSAgICAgKiB0aGF0IG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkIHdoZW4gdGhlIFNlcnZpY2UgRGVzY3JpcHRpb24gd2FzIGNyZWF0ZWQuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBrZXkgSWYgbm9uLW51bGwsIHVzZWQgdG8gbG9vayB1cCBhbnkgc3BhcnNlIG1ldGFkYXRhIHRoYXQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQKLSAgICAgKiAgICAgd2hlbiB0aGUgc2VydmljZSB3YXMgY3JlYXRlZC4KLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgbXRvbSB3YXMgZW5hYmxlZCBlaXRoZXIgaW4gdGhlIHNwYXJzZSBtZXRhZGF0YSBvciBpbiB0aGUgY29tcG9zaXRlOyBGQUxTRQotICAgICAqICAgICBvdGhld2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKE9iamVjdCBrZXkpOwotICAgIAotICAgIC8qKgotICAgICAqIEFuc3dlciBpZiBNVE9NIGlzIGVuYWJsZWQgZm9yIHRoZSBzZXJ2aWNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgU2VydmljZSBEZXNjcmlwdGlvbiAgCi0gICAgICogYW5kIHRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBpbmRpY2F0ZWQuIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIHRoZSAKLSAgICAgKiBzZXJ2aWNlLXJlcXVlc3RlciBzaWRlOyBpdCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzZXJ2aWNlLXByb3ZpZGVyIHNpZGUuICBJZiB0aGUga2V5IGlzIAotICAgICAqIG5vbi1udWxsLCBpdCBpcyB1c2VkIHRvIGxvb2sgdXAgYW4gc3BhcnNlIG1ldGFkYXRhIHRoYXQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQgd2hlbiB0aGUgCi0gICAgICogU2VydmljZSBEZXNjcmlwdGlvbiB3YXMgY3JlYXRlZC4gSWYgdGhlIHNlaUNsYXNzIGlzIG5vbi1udWxsIGl0IGlzIHVzZWQgdG8gZnVydGhlciBzY29wZQotICAgICAqIHRoZSBlbmFibGVtZW50IG9mIE1UT00gdG8gYSBzcGVjaWZpYyBTRUkuCi0gICAgICogIAotICAgICAqIEBwYXJhbSBrZXkgSWYgbm9uLW51bGwsIHVzZWQgdG8gbG9vayB1cCBhbnkgc3BhcnNlIG1ldGFkYXRhIHRoYXQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQKLSAgICAgKiAgICAgd2hlbiB0aGUgc2VydmljZSB3YXMgY3JlYXRlZC4KLSAgICAgKiBAcGFyYW0gc2VpQ2xhc3MgUmVwcmVzZW50cyBjbGllbnQgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgY2xhc3MuCi0gICAgICogCi0gICAgICogQHJldHVybiBUUlVFIGlmIG10b20gd2FzIGVuYWJsZWQgZWl0aGVyIGluIHRoZSBzcGFyc2UgbWV0YWRhdGEgb3IgaW4gdGhlIGNvbXBvc2l0ZTsgRkFMU0UKLSAgICAgKiAgICAgb3RoZXdpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZChPYmplY3Qga2V5LCBDbGFzcyBzZWlDbGFzcyk7Ci0gICAgCi0gICAgcHVibGljIFFOYW1lIGdldFByZWZlcnJlZFBvcnQoT2JqZWN0IGtleSk7Ci0gICAgCi0gICAgcHVibGljIEpBWFdTQ2F0YWxvZ01hbmFnZXIgZ2V0Q2F0YWxvZ01hbmFnZXIoKTsKLQotICAgIC8qKgotICAgICAqIEFuc3dlciBpbmZvcm1hdGlvbiBmb3IgcmVzb2x2ZWQgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBwb3J0LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBzZXQKLSAgICAgKiB3aGVuIHRoZSBoYW5kbGVyIHJlc29sdmVyIGluaXRpYWxseSByZXNvbHZlcyB0aGUgaGFuZGxlcnMgYmFzZWQgb24gdGhlIGhhbmRsZXIgCi0gICAgICogY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhY2hlZCBvbiB0aGUgc2VydmljZSBkZXNjcmlwdGlvbiBmb3IgcGVyZm9ybWFuY2UgCi0gICAgICogc28gdGhhdCBzdWJzZXF1ZW50IHF1ZXJpZXMgYnkgb3RoZXIgaGFuZGxlciByZXNvbHZlcnMgZm9yIHRoZSBzYW1lIHBvcnQgZG8gbm90IGhhdmUgdG8KLSAgICAgKiByZS1yZXNvbHZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcG9ydEluZm8gUG9ydCBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaW5mb3JtYXRpb24gaXMgZGVzaXJlZAotICAgICAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gZm9yIHRoZSByZXNvbHZlZCBoYW5kbGVycywgb3IgbnVsbCBpZiBubyAKLSAgICAgKiAgICAgaW5mb3JtYXRpb24gaXMgZm91bmQgaW4gdGhlIGNhY2hlLgotICAgICAqLwotICAgIHB1YmxpYyBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gZ2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKFBvcnRJbmZvIHBvcnRJbmZvKTsKLQotICAgIC8qKgotICAgICAqIENhY2hlIGluZm9ybWF0aW9uIGZvciBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVzb2x2ZWQgZm9yIHRoaXMgcG9ydC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBzZXQKLSAgICAgKiB3aGVuIHRoZSBoYW5kbGVyIHJlc29sdmVyIGluaXRpYWxseSByZXNvbHZlcyB0aGUgaGFuZGxlcnMgYmFzZWQgb24gdGhlIGhhbmRsZXIgCi0gICAgICogY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIEl0IGlzIGNhY2hlZCBvbiB0aGUgc2VydmljZSBkZXNjcmlwdGlvbiBmb3IgcGVyZm9ybWFuY2UgCi0gICAgICogc28gdGhhdCBzdWJzZXF1ZW50IHF1ZXJpZXMgYnkgb3RoZXIgaGFuZGxlciByZXNvbHZlcnMgZm9yIHRoZSBzYW1lIHBvcnQgZG8gbm90IGhhdmUgdG8KLSAgICAgKiByZS1yZXNvbHZlIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICAgICogICAKLSAgICAgKiBAcGFyYW0gcG9ydEluZm8gUG9ydCBmb3Igd2hpY2ggdGhlIGhhbmRsZXIgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNhY2hlZAotICAgICAqIEBwYXJhbSByZXNvbHZlZEhhbmRsZXJzSW5mbyBBbiBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlc29sdmVkIGhhbmRsZXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uKFBvcnRJbmZvIHBvcnRJbmZvLCBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gcmVzb2x2ZWRIYW5kbGVyc0luZm8pOwotICAgIAotICAgIC8qKgotICAgICAqIENoZWNrIGludG8gcmVsZWFzaW5nIHJlc291cmNlcyByZWxhdGVkIHRvIHRoaXMgU2VydmljZURlc2NyaXB0aW9uLiAgVGhvc2UgcmVzb3VyY2VzIGluY2x1ZGUKLSAgICAgKiB0aGlzIFNlcnZpY2VEZXNjcmlwdGlvbiBpbnN0YW5jZSwgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaW5zdGFuY2VzIGl0IG93bnMgYW5kIHRoZWlyCi0gICAgICogYXNzb2NpYXRlZCBBeGlzU2VydmljZSBhbmQgcmVsYXRlZCBvYmplY3RzLiAgCi0gICAgICogCi0gICAgICogTk9URTogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gU2VydmljZURlc2NycGl0aW9uIGluc3RhbmNlcyB0aGF0IGFyZSBvd25lZCBieQotICAgICAqIGNsaWVudCBTZXJ2aWNlRGVsZWdhdGUgaW5zdGFuY2VzOyBpdCBTSE9VTEQgTk9UIGJlIGNhbGxlZCBvbiBzZXJ2ZXItc2lkZSAKLSAgICAgKiBTZXJ2aWNlRGVzY3JpcHRpb25zIHNpbmNlIHRob3NlIGFyZSBidWlsdCBkdXJpbmcgc2VydmVyIHN0YXJ0IGFuZCB0aGVpciBsaWZlLWN5Y2xlIGlzCi0gICAgICogdGhlIGxpZmUtY3ljbGUgb2YgdGhlIHNlcnZlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZGVsZWdhdGUgVGhlIFNlcnZpY2VEZWxlZ2F0ZSBpbnN0YW5jZSB0aGF0IG93bnMgdGhpcyBTZXJ2aWNlRGVzY3JpcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVJlc291cmNlcyhPYmplY3QgZGVsZWdhdGUpOwotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgcXVlcnlpbmcgdGhlIG1ldGFkYXRhIGZvciBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIGEgZ2l2ZW4gQmluZGluZ1Byb3ZpZGVyIGluc3RhbmNlLiBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgdGhlIHJlcXVlc3Rvci1zaWRlLCBhbmQKLSAgICAgKiB0aGUgcHJvcGVydGllcyBhcmUgc2NvcGVkIGF0IHRoZSBwb3J0IGxldmVsLgotICAgICAqIEBwYXJhbSBzZXJ2aWNlRGVsZWdhdGVLZXkgVGhpcyBzaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsIHdoZW4gY2FsbGVkIHZpYSBTZXJ2aWNlRGVsZWdhdGUgYW5kIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBoZWxwIHJldHJpZXZlIGR5bmFtaWMgcG9ydHMgcGVyIGNsaWVudAotICAgICAqIEBwYXJhbSBrZXkgVGhpcyBzaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsIGFuZCBpcyB1c2VkIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgZm9yIGEgZ2l2ZW4KLSAgICAgKiAgICAgICAgICAgIGNsaWVudC1zaWRlIHBvcnQKLSAgICAgKiBAcmV0dXJuIAotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEJpbmRpbmdQcm9wZXJ0aWVzKE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXksIFN0cmluZyBrZXkpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb25KYXZhLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb25KYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGZmYjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZURlc2NyaXB0aW9uSmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VEZXNjcmlwdGlvbkphdmEgewotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb25XU0RMLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlRGVzY3JpcHRpb25XU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTBhY2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZURlc2NyaXB0aW9uV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTRExXcmFwcGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VEZXNjcmlwdGlvbldTREwgewotICAgIHB1YmxpYyBhYnN0cmFjdCBXU0RMV3JhcHBlciBnZXRXU0RMV3JhcHBlcigpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFdTRExXcmFwcGVyIGdldEdlbmVyYXRlZFdzZGxXcmFwcGVyKCk7Ci0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRXU0RMU2VydmljZSgpOwotCi0gICAgcHVibGljIE1hcCBnZXRXU0RMUG9ydHMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybiBhIGNvbGxlY3Rpb24gb2YgV1NETCBwb3J0cyB1bmRlciB0aGlzIHNlcnZpY2Ugd2hpY2ggdXNlIHRoZSBwb3J0VHlwZSBRTmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb3J0VHlwZVFOCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBvcnQ+IGdldFdTRExQb3J0c1VzaW5nUG9ydFR5cGUoUU5hbWUgcG9ydFR5cGVRTik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGNvbGxlY3Rpb24gb2YgV1NETCBwb3J0cyB3aGljaCBzcGVjaWZ5IGEgU09BUCAxLjEgb3IgMS4yIGFkZHJlc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbFBvcnRzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBvcnQ+IGdldFdTRExQb3J0c1VzaW5nU09BUEFkZHJlc3MoTGlzdDxQb3J0PiB3c2RsUG9ydHMpOwotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKTsKLQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1dTRExTcGVjaWZpZWQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3ZDljZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9TZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLS8qKgotICogQSBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIG9iamVjdCBjb250YWlucyBpbW11dGFibGUgZGF0YSB0aGF0IGlzIG5lZWRlZCBkdXJpbmcgdGhlIHJ1bnRpbWUKLSAqIChpLmUuIHRvIGRldGVjdCBAUmVzb3VyY2UgaW5qZWN0aW9uKS4gVGhlIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gbXVzdCBiZSBpbW11dGFibGUgc28gdGhhdCBpdAotICogY2FuIHNhZmVseSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aGVhZHMgd2l0aG91dCBzeW5jaHJvbml6YXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIHRvIHN0b3JlCi0gKiBpbmZvcm1hdGlvbiB0aGF0IG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGRpZmZlcmVudCB0aHJlYWRzLyBjbGFzc2xvYWRlcnMgKGkuZS4gaXQgY2Fubm90IGhhdmUKLSAqIHJlZmVyZW5jZXMgdG8gQ2xhc3Mgb2JqZWN0cykKLSAqIDxwLz4KLSAqIFRoZSBhY3R1YWwgU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBvYmplY3RzIGFyZSBhY2Nlc3NlZCB2aWEgdGhlIGtleS4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uIHsKLQotICAgIC8qKiBAcmV0dXJuIE9wZXJhdGlvbkRlc2MgcGFyZW50ICovCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQotICAgIC8qKiBAcmV0dXJuIFN0cmluZyAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0FjdGlvbkFubm90LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0FjdGlvbkFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWRlOTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9BY3Rpb25Bbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uQW5ub3QgaW1wbGVtZW50cyBBY3Rpb24gewotICAgIAotICAgIHByaXZhdGUgRmF1bHRBY3Rpb25bXSBmYXVsdDsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dDsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXQ7Ci0KLSAgICBwcml2YXRlIEFjdGlvbkFubm90KCkgewotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEFjdGlvbkFubm90KEZhdWx0QWN0aW9uW10gZmF1bHQsIFN0cmluZyBpbnB1dCwgU3RyaW5nIG91dHB1dCkgewotICAgICAgICB0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uQW5ub3QgY3JlYXRlQWN0aW9uQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkFubm90KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uQW5ub3QgY3JlYXRlQWN0aW9uQW5ub3RJbXBsKEZhdWx0QWN0aW9uW10gZmF1bHQsIFN0cmluZyBpbnB1dCwgU3RyaW5nIG91dHB1dCkgewotICAgICAgICByZXR1cm4gbmV3IEFjdGlvbkFubm90KGZhdWx0LCBpbnB1dCwgb3V0cHV0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHQoRmF1bHRBY3Rpb25bXSBmYXVsdCkgewotICAgICAgICB0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXQoU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoU3RyaW5nIG91dHB1dCkgewotICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmF1bHRBY3Rpb25bXSBmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIGZhdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgaW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG91dHB1dCgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAQWN0aW9uLmZhdWx0PSAiICsgZmF1bHQpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQEFjdGlvbi5pbnB1dD0gIiArIGlucHV0KTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBBY3Rpb24ub3V0cHV0PSAiICsgb3V0cHV0KTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0FkZHJlc3NpbmdBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9BZGRyZXNzaW5nQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiYzE4Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0FkZHJlc3NpbmdBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nQW5ub3QgaW1wbGVtZW50cyBBZGRyZXNzaW5nIHsNCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQ7DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkKCkgew0KLSAgICAgICAgcmV0dXJuIGVuYWJsZWQ7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlKSB7DQotICAgICAgICBlbmFibGVkID0gZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlZCgpIHsNCi0gICAgICAgIHJldHVybiByZXF1aXJlZDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiByKSB7DQotICAgICAgICByZXF1aXJlZCA9IHI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBBZGRyZXNzaW5nLmNsYXNzOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQmluZGluZ1R5cGVBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9CaW5kaW5nVHlwZUFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzg3ZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9CaW5kaW5nVHlwZUFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVHlwZUFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlID0gIiI7Ci0KLSAgICAvKiogQSBCaW5kaW5nVHlwZUFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBCaW5kaW5nVHlwZUFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBCaW5kaW5nVHlwZUFubm90KFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCaW5kaW5nVHlwZUFubm90IGNyZWF0ZUJpbmRpbmdUeXBlQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdUeXBlQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdUeXBlQW5ub3QgY3JlYXRlQmluZGluZ1R5cGVBbm5vdEltcGwoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1R5cGVBbm5vdCh2YWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgQmluZGluZ1R5cGVBbm5vdCBjcmVhdGVGcm9tQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgQmluZGluZ1R5cGVBbm5vdCByZXR1cm5Bbm5vdCA9IG51bGw7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbiBpbnN0YW5jZW9mIGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZSkgewotICAgICAgICAgICAgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIGJ0ID0gKGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZSkgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgIHJldHVybkFubm90ID0gbmV3IEJpbmRpbmdUeXBlQW5ub3QoYnQudmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAQmluZGluZ1R5cGUudmFsdWU9ICIgKyB2YWx1ZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0N1c3RvbUFubm90YXRpb25JbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFlYmZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIHJlcHJlc2VudCBhbm5vdGF0aW9uIGluc3RhbmNlcyANCi0gKiB0aGF0IGFyZSBub3QgZXhwbGljaXRseSBkZWZpbmVkIGJ5IHRoZSBNRFEgbGF5ZXIuIFRoaXMgd2lsbCANCi0gKiBhbGxvdyB0aGUgdXNlIG9mIGN1c3RvbSBhbm5vdGF0aW9ucyBvciB0aG9zZSBvdXRzaWRlIHRoZSBzY29wZSANCi0gKiBvZiB0aGUgbWV0YWRhdGEgdGhhdCBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGhpbiBNRFEuIFRoZSBwcm92aWRlcg0KLSAqIG9mIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMgd2lsbCBiZSByZXNwb25zYmlsZSBmb3IgbWFwcGluZw0KLSAqIHNwZWNpZmljIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSBpbXBsZW1lbnRhdGlvbnMgdG8gYWN0dWFsDQotICogYW5ub3RhdGlvbiB0eXBlcy4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLSAgICAgKiBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIHRoaXMgaW5zdGFuY2UgcmVwcmVzZW50cy4NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgc2V0cyBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lDQotICAgICAqIG9mIHRoZSBhbm5vdGF0aW9uIHR5cGUgdGhpcyBpbnN0YW5jZSByZXByZXNlbnRzLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbkNsYXNzTmFtZShTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZSk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgRWxlbWVudFR5cGUgRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlDQotICAgICAqIHRhcmdldCBmb3IgdGhpcyBhbm5vdGF0aW9uIGluc3RhbmNlLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKTsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBFbGVtZW50VHlwZSBFbnVtIHRoYXQgcmVwcmVzZW50cw0KLSAgICAgKiB0aGUgdGFyZ2V0IGZvciB0aGlzIGFubm90YXRpb24gaW5zdGFuY2UuDQotICAgICAqLw0KLSAgICBwdWJsaWMgRWxlbWVudFR5cGUgZ2V0VGFyZ2V0KCk7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVGhpcyBtZXRob2Qgc3RvcmVzIHBhcmFtZXRlciBkYXRhIGluIHRoZSBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UNCi0gICAgICogYmFzZWQgb24gdGhlIGtleSB0aGF0IGlzIHN1cHBsaWVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyRGF0YShTdHJpbmcgcGFyYW1OYW1lLCBPYmplY3QgcGFyYW1WYWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIHBhcmFtZXRlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4NCi0gICAgICogcGFyYW1ldGVyIG5hbWUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmFtZXRlckRhdGEoU3RyaW5nIHBhcmFtTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9DdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZWM3NTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9DdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHByb2Nlc3NvcnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gDQotICogaGFuZGxlIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMgdGhhdCBhcmUgYWRkZWQgdG8gdGhlIE1EUSBsYXllciANCi0gKiBieSB0aGUgdWFzZXIuIFRoZXNlIHByb2Nlc3NvcnMgd2lsbCBhbHNvIGJlIHJlZ2lzdGVyZWQgd2l0aCANCi0gKiBNRFEsIGFuZCB0aGV5IHdpbGwgYmUgY2FsbGVkIGJ5IE1EUSBhcyBuZWVkZWQuIA0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmdWxseSBxdWFsaWZlZCBuYW1lIG9mIHRoZSANCi0gICAgICogQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGNsYXNzIHRoYXQgdGhpcyBwcm9jZXNzb3INCi0gICAgICogaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKFN0cmluZyBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgdGhlIA0KLSAgICAgKiBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UgY2xhc3MgdGhhdCB0aGlzIHByb2Nlc3Nvcg0KLSAgICAgKiBpcyByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcuDQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZSgpOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRvIHByb2Nlc3MgYW4gYW5ub3RhdGlvbiB0eXBlDQotICAgICAqIHJlY29nbml6ZWQgYnkgdGhpcyBwcm9jZXNzb3IgdGhhdCB3YXMgZm91bmQgYXQgdGhlIHR5cGUNCi0gICAgICogbGV2ZWwuDQotICAgICAqIEBwYXJhbSBlZCAtIEVuZHBvaW50RGVzY3JpcHRpb24gdGhhdCB0aGUgYW5ub3RhdGlvbiB3YXMgYXNzb2NpYXRlZCB3aXRoDQotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gVGhlIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSB0aGF0IHNob3VsZCBiZSBwcm9jZXNzZWQNCi0gICAgICogYnkgdGhpcyBwcm9jZXNzb3INCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NUeXBlTGV2ZWxBbm5vdGF0aW9uKEVuZHBvaW50RGVzY3JpcHRpb24gZWQsIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSBhbm5vdGF0aW9uKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZmI5MmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMNEpXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxlbWVudHMgVE1Bbm5vdGF0aW9uQ29tcG9zaXRlLCBUTUZBbm5vdGF0aW9uQ29tcG9zaXRlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuY2xhc3MpOwotCi0gICAgLyoKLSAgICAgICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZ1bGwgcmVmbGVjdGVkIGNsYXNzLCBhcyB3ZWxsIGFzLCB0aGUKLSAgICAgICogcG9zc2libGUgYW5ub3RhdGlvbnMgZm91bmQgZm9yIHRoaXMgY2xhc3MuLi50aGUgY2xhc3MgZGVzY3JpcHRpb24KLSAgICAgICogbXVzdCBiZSBjb21wbGV0ZSBlbm91Z2ggZm9yIGZ1bGwgdmFsaWRhdGlvbiBiZXR3ZWVuIGNsYXNzIGluZm8gYW5kIGFubm90YXRpb25zCi0gICAgICAqIFRoZSBhbm5vdGF0aW9ucyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzIG1lbWJlcnMuCi0gICAgICAqLwotCi0gICAgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpIHsKLSAgICAgICAgdGhpcygoQ29uZmlndXJhdGlvbkNvbnRleHQpbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZShDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIG15Q29uZmlnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgICAgIG1ldGhvZERlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0gICAgICAgIGZpZWxkRGVzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICB3ZWJTZXJ2aWNlUmVmQW5ub3RMaXN0ID0gbmV3IEFycmF5TGlzdDxXZWJTZXJ2aWNlUmVmQW5ub3Q+KCk7Ci0gICAgICAgIGludGVyZmFjZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGdlbmVyaWNBbm5vdGF0aW9uSW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+KCk7Ci0gICAgICAgIGdlbmVyaWNBbm5vdGF0aW9uUHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvcj4oKTsKLSAgICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgIH0KLQotICAgIC8vTm90ZTogYSBXU0RMIGlzIG5vdCBuZWNlc3NhcnkKLSAgICBwcml2YXRlIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgVVJMIHdzZGxVUkwgPSBudWxsOwotICAgIHByaXZhdGUgV1NETDRKV3JhcHBlciB3c2RsV3JhcHBlciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IG15Q29uZmlnQ29udGV4dDsKLSAgICAKLSAgICAvLyBDbGFzcy1sZXZlbCBhbm5vdGF0aW9ucwotICAgIHByaXZhdGUgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdDsKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHdlYlNlcnZpY2VQcm92aWRlckFubm90OwotICAgIHByaXZhdGUgU2VydmljZU1vZGVBbm5vdCBzZXJ2aWNlTW9kZUFubm90OwotICAgIHByaXZhdGUgV2ViU2VydmljZUNsaWVudEFubm90IHdlYlNlcnZpY2VDbGllbnRBbm5vdDsKLSAgICBwcml2YXRlIFdlYkZhdWx0QW5ub3Qgd2ViRmF1bHRBbm5vdDsKLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90OwotICAgIHByaXZhdGUgU29hcEJpbmRpbmdBbm5vdCBzb2FwQmluZGluZ0Fubm90OwotICAgIHByaXZhdGUgTGlzdDxXZWJTZXJ2aWNlUmVmQW5ub3Q+IHdlYlNlcnZpY2VSZWZBbm5vdExpc3Q7Ci0gICAgcHJpdmF0ZSBCaW5kaW5nVHlwZUFubm90IGJpbmRpbmdUeXBlQW5ub3Q7Ci0gICAgCi0gICAgLy8gQ29sbGVjdGlvbiBvZiBQb3J0Q29tcG9zaXRlIG9iamVjdHMgd2hpY2ggd2VyZSBjcmVhdGVkIGZyb20KLSAgICAvLyB0aGlzIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBpbnN0YW5jZQotICAgIHByaXZhdGUgTGlzdDxQb3J0Q29tcG9zaXRlPiBwb3J0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9ydENvbXBvc2l0ZT4oKTsKLSAgICAKLSAgICBwcml2YXRlIExpc3Q8QW5ub3RhdGlvbj4gZmVhdHVyZXM7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIERlZmluaXRpb24+IHdzZGxEZWZzID0gbmV3IEhhc2hNYXA8UU5hbWUsIERlZmluaXRpb24+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFVSTD4gd3NkbFVSTHMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgVVJMPigpOwotICAgIAotICAgIHByaXZhdGUgU2V0PFFOYW1lPiBzZXJ2aWNlUU5hbWVzID0gbmV3IEhhc2hTZXQ8UU5hbWU+KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBNYXA8UU5hbWUsIExpc3Q8UG9ydENvbXBvc2l0ZT4+IHNRTmFtZVRvUEMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgTGlzdDxQb3J0Q29tcG9zaXRlPj4oKTsKLSAgICAKLSAgICAvLyBDbGFzcyBpbmZvcm1hdGlvbgotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbiBieSBpbnRyb3NwZWN0aW5nIG9uIGEgY2xhc3MuICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbgotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uRnJvbUNsYXNzKGZpbmFsIENsYXNzIGNscywgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhID0gY2xzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nW10gY2xhc3NNb2RpZmllcnM7IC8vcHVibGljLCBhYnN0cmFjdCwgZmluYWwsIHN0cmljdGZwLi4uCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZW5kc0NsYXNzOyAgICAvL1NldCB0byB0aGUgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzTGlzdDsgLy9TZXQgdGhpcyBmb3IgYWxsIGltcGxlbWVudGVkIGludGVyZmFjZXMKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnRlcmZhY2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIFFOYW1lIHByZWZlcnJlZFBvcnQ7ICAgICAgICAvLyBQb3J0IHRvIHVzZSBpZiBubyBwb3J0IFFOYW1lIGdpdmVuLiAgTWF5IGJlIG51bGwKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNVE9NRW5hYmxlZCA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWV0aG9kRGVzY3JpcHRpb25zOwotICAgIHByaXZhdGUgTGlzdDxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBmaWVsZERlc2NyaXB0aW9uczsKLSAgICAKLSAgICAvLyB3ZSBjYW4ga2VlcCB0aGVzZSBpbiBhIHNpbmd1bGFyIGxpc3QgYi9jIGZvciBhIGdpdmVuIHR5cGUtbGV2ZWwgYW5ub3RhdGlvbgotICAgIC8vIHRoZXJlIGNhbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgYW5ub3RhdGlvbgotICAgIHByaXZhdGUgTGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+IGdlbmVyaWNBbm5vdGF0aW9uSW5zdGFuY2VzOwotICAgIAotICAgIC8vIGEgbWFwIHRoYXQgc3RvcmVzIGFsbCB0aGUgdHlwZS10YXJnZXR0ZWQgR2VuZXJpY0Fubm90YXRpb25Qcm9jZXNzb3IgaW5zdGFuY2VzCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yPiBnZW5lcmljQW5ub3RhdGlvblByb2Nlc3NvcnM7Ci0KLSAgICBwcml2YXRlIFdzZGxHZW5lcmF0b3Igd3NkbEdlbmVyYXRvcjsKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgIAotICAgIC8vIEpBWEIgb2JqZWN0IHVzZWQgdG8gcmVwcmVzZW50IGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvCi0gICAgLy8gZWl0aGVyIHRoaXMgb3IgdGhlIEhhbmRsZXJDaGFpbkFubm90IG1heSBiZSBwcmVzZW50LCBidXQgCi0gICAgLy8gbm90IGJvdGgsIHRoZXkgbWF5IGJvdGggYmUgbnVsbAotICAgIHByaXZhdGUgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBudWxsOwotICAgIAotICAgIC8vIERvZXMgdGhpcyBjb21wb3NpdGUgcmVwcmVzZW50IGEgc2VydmljZSByZXF1ZXN0ZXIgb3Igc2VydmljZSBwcm92aWRlci4KLSAgICAvLyBXZSBkZWZhdWx0IHRvIHNlcnZpY2UgcHJvdmlkZXIgc2luY2UgY29tcG9zaXRlcyB3ZXJlIG9yZ2luYWxseSBub3QgdXNlZCBieSByZXF1ZXN0ZXJzLgotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpY2VQcm92aWRlciA9IHRydWU7Ci0gICAgCi0gICAgLy8gRm9yIGEgc2VydmljZSByZXF1ZXN0ZXIsIHRoaXMgd2lsbCBiZSB0aGUgY2xpZW50LXNpZGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9zaXRlOyAKLSAgICAvLyBJdCBjb3VsZCBiZSB0aGUgU2VydmljZSBjbGFzcyBvciB0aGUgU0VJIGNsYXNzLiAgT24gdGhlIHNlcnZpY2UgcHJvdmlkZXIgdGhpcyB3aWxsIGJlIG51bGwKLSAgICAvLyB1bmxlc3MgdGhlIGRlcHJlY2F0ZWQgc2VydmljZSBjb25zdHJ1Y3Rpb24gbG9naWMgaW4gRGVzY3JpcHRpb25GYWN0b3J5IHdhcyB1c2VkLgotICAgIHByaXZhdGUgQ2xhc3MgdGhlQ29ycmVzcG9uZGluZ0NsYXNzOwotICAgIAotICAgIC8vIFNlcnZpY2UtcmVxdWVzdGVycyAoYWthIGNsaWVudHMpIGNhbiBzcGVjaWZ5IGEgc3ByYXNlIGNvbXBvc2l0ZSB0aGF0IG1heSBjb250YWluIGFubm90YXRpb24KLSAgICAvLyBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIGluZm9ybWF0aW9uIGluIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9yIGFuIGluamVjdGVkIAotICAgIC8vIHJlc291cmNlLgotICAgIHByaXZhdGUgV2Vha0hhc2hNYXA8T2JqZWN0LCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IHNwYXJzZUNvbXBvc2l0ZU1hcCA9IG5ldyBXZWFrSGFzaE1hcDxPYmplY3QsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAKLSAgICAvLyBBbGxvdyBhIHVuaXF1ZSBYTUwgQ2F0YWxvZ01hbmFnZXIgcGVyIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAgcHJpdmF0ZSBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbnVsbDsKLSAgICAKLSAgICAvLyBUaGlzIGlzIGEgYmFnIG9mIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byB0aGUgREJDLiBDdXJyZW50bHkgdGhlc2UgcHJvcGVydGllcyB3aWxsIGJlCi0gICAgLy8gY29waWVkIG92ZXIgZnJvbSB0aGUgREJDIHRvIHRoZSBkZXNjcmlwdGlvbiBoaWVyYXJjaHkuIFRoaXMgd2lsbCBvbmx5IG9jY3VyIG9uIHRoZQotICAgIC8vIHNlcnZlci1zaWRlIGZvciBub3cKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U3BhcnNlQ29tcG9zaXRlKE9iamVjdCBrZXksIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUpIHsKLSAgICAgICAgaWYgKGtleSAhPSBudWxsICYmIHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnNwYXJzZUNvbXBvc2l0ZU1hcC5wdXQoa2V5LCBzcGFyc2VDb21wb3NpdGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZ2V0U3BhcnNlQ29tcG9zaXRlKE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIHNwYXJzZUNvbXBvc2l0ZU1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYSBzZXJ2aWNlIHJlcXVlc3Rlciwgc2V0IHRoZSBRTmFtZSBvZiB0aGUgcHJlZmVycmVkIHBvcnQgZm9yIHRoaXMgc2VydmljZS4gIFRoaXMKLSAgICAgKiBpbmRpY2F0ZXMgd2hpY2ggcG9ydCAoaS5lLiB3aGljaCBFbmRwb2ludERlc2NyaXB0aW9uKSBzaG91bGQgYmUgcmV0dXJuZWQgaWYgYSBwb3J0IFFOYW1lCi0gICAgICogaXNuJ3Qgc3BlY2lmaWVkLiAgVGhpcyBtYXkgYmUgbnVsbCwgaW5kaWNhdGluZyB0aGUgZmlyc3QgdmFsaWQgcG9ydCBpbiB0aGUgV1NETCBzaG91bGQgYmUKLSAgICAgKiByZXR1cm5lZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJlZmVycmVkUG9ydAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByZWZlcnJlZFBvcnQoUU5hbWUgcHJlZmVycmVkUG9ydCkgewotICAgICAgICB0aGlzLnByZWZlcnJlZFBvcnQgPSBwcmVmZXJyZWRQb3J0OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGb3IgYSBzZXJ2aWNlIHJlcXVlc3RlciwgdGhlIFFOYW1lIG9mIHRoZSBwcmVmZXJlZCBwb3J0IGZvciB0aGlzIHNlcnZpY2UuICBUaGlzIGluZGljYXRlcwotICAgICAqIHdoaWNoIHBvcnQgc2hvdWxkIGJlIHJldHVybmVkIGlmIGEgcG9ydCBRTmFtZSB3YXNuJ3Qgc3BlY2lmaWVkLiAgVGhpcyBtYXkgYmUgbnVsbCwgCi0gICAgICogaW5kaWNhdGluZyB0aGUgZmlyc3QgdmFsaWQgcG9ydCBpbiB0aGUgV1NETCBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRQcmVmZXJyZWRQb3J0KCkgewotICAgICAgICByZXR1cm4gcHJlZmVycmVkUG9ydDsKLSAgICB9Ci0gICAgcHVibGljIFFOYW1lIGdldFByZWZlcnJlZFBvcnQoT2JqZWN0IGtleSkgewotICAgICAgICBRTmFtZSByZXR1cm5QcmVmZXJyZWRQb3J0ID0gbnVsbDsKLSAgICAgICAgLy8gU2VlIGlmIHRoZXJlJ3MgYSBzcGFyc2UgY29tcG9zaXRlIG92ZXJyaWRlIGZvciB0aGlzIGNvbXBvc2l0ZQotICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2UgPSBnZXRTcGFyc2VDb21wb3NpdGUoa2V5KTsKLSAgICAgICAgICAgIGlmIChzcGFyc2UgIT0gbnVsbCAKLSAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuaXNFbXB0eShzcGFyc2UuZ2V0UHJlZmVycmVkUG9ydCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVyblByZWZlcnJlZFBvcnQgPSBzcGFyc2UuZ2V0UHJlZmVycmVkUG9ydCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm5QcmVmZXJyZWRQb3J0ID0gZ2V0UHJlZmVycmVkUG9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuUHJlZmVycmVkUG9ydCA9IGdldFByZWZlcnJlZFBvcnQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVyblByZWZlcnJlZFBvcnQ7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJc01UT01FbmFibGVkKGJvb2xlYW4gaXNNVE9NRW5hYmxlZCkgewotICAgICAgICB0aGlzLmlzTVRPTUVuYWJsZWQgPSBpc01UT01FbmFibGVkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKCkgewotICAgICAgICByZXR1cm4gaXNNVE9NRW5hYmxlZDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNNVE9NRW5hYmxlZChPYmplY3Qga2V5KSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0dXJuSXNNVE9NRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VEQkMgPSBnZXRTcGFyc2VDb21wb3NpdGUoa2V5KTsKLSAgICAgICAgICAgIGlmIChzcGFyc2VEQkMgIT0gbnVsbCAmJiBzcGFyc2VEQkMuaXNNVE9NRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuSXNNVE9NRW5hYmxlZCA9IHNwYXJzZURCQy5pc01UT01FbmFibGVkKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybklzTVRPTUVuYWJsZWQgPSBpc01UT01FbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybklzTVRPTUVuYWJsZWQgPSBpc01UT01FbmFibGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXR1cm5Jc01UT01FbmFibGVkOwotICAgIH0KLSAgICAKLSAgICAvLyBNZXRob2RzCi0gICAgcHVibGljIFdlYlNlcnZpY2VBbm5vdCBnZXRXZWJTZXJ2aWNlQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlQW5ub3QgPSAKLSAgICAgICAgICAgIChXZWJTZXJ2aWNlQW5ub3QpIGdldENvbXBvc2l0ZUFubm90YXRpb24od2ViU2VydmljZUFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlQW5ub3QuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lmp3cy5XZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NNb2RpZmllcnMuICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzTW9kaWZpZXJzKCkgewotICAgICAgICByZXR1cm4gY2xhc3NNb2RpZmllcnM7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGhlQ29ycmVzcG9uZGluZ0NsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGVDb3JyZXNwb25kaW5nQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBzdXBlciBjbGFzcyBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBleHRlbmRzQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbGlzdCBvZiBpbXBsZW1lbnRlZCBpbnRlcmZhY2VzLiAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW50ZXJmYWNlc0xpc3QoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VzTGlzdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2hhaW5Bbm5vdEltcGwuICovCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbkFubm90IGdldEhhbmRsZXJDaGFpbkFubm90KCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluQW5ub3QgPSAKLSAgICAgICAgICAgIChIYW5kbGVyQ2hhaW5Bbm5vdCkgZ2V0Q29tcG9zaXRlQW5ub3RhdGlvbihoYW5kbGVyQ2hhaW5Bbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5Bbm5vdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuSGFuZGxlckNoYWluLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2aWNlTW9kZUFubm90LiAqLwotICAgIHB1YmxpYyBTZXJ2aWNlTW9kZUFubm90IGdldFNlcnZpY2VNb2RlQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTW9kZUFubm90ID0gCi0gICAgICAgICAgICAoU2VydmljZU1vZGVBbm5vdCkgZ2V0Q29tcG9zaXRlQW5ub3RhdGlvbihzZXJ2aWNlTW9kZUFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1vZGVBbm5vdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZS5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgc29hcEJpbmRpbmdBbm5vdC4gKi8KLSAgICBwdWJsaWMgU29hcEJpbmRpbmdBbm5vdCBnZXRTb2FwQmluZGluZ0Fubm90KCkgewotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdBbm5vdCA9IAotICAgICAgICAgICAgKFNvYXBCaW5kaW5nQW5ub3QpIGdldENvbXBvc2l0ZUFubm90YXRpb24oc29hcEJpbmRpbmdBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvYXBCaW5kaW5nQW5ub3QuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViRmF1bHRBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViRmF1bHRBbm5vdCBnZXRXZWJGYXVsdEFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViRmF1bHRBbm5vdCA9IAotICAgICAgICAgICAgKFdlYkZhdWx0QW5ub3QpIGdldENvbXBvc2l0ZUFubm90YXRpb24od2ViRmF1bHRBbm5vdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJGYXVsdEFubm90LmNsYXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5XZWJGYXVsdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZUNsaWVudEFubm90LiAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViU2VydmljZUNsaWVudEFubm90ID0gCi0gICAgICAgICAgICAoV2ViU2VydmljZUNsaWVudEFubm90KSBnZXRDb21wb3NpdGVBbm5vdGF0aW9uKHdlYlNlcnZpY2VDbGllbnRBbm5vdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgV2ViU2VydmljZUNsaWVudEFubm90IGdldFdlYlNlcnZpY2VDbGllbnRBbm5vdChPYmplY3Qga2V5KSB7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBhbm5vdCA9IGdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlID0gZ2V0U3BhcnNlQ29tcG9zaXRlKGtleSk7Ci0gICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBzcGFyc2VBbm5vdCA9IG51bGw7Ci0gICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc3BhcnNlQW5ub3QgPSBzcGFyc2VDb21wb3NpdGUuZ2V0V2ViU2VydmljZUNsaWVudEFubm90KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDbGllbnRBbm5vdC5jcmVhdGVGcm9tQW5ub3RhdGlvbihhbm5vdCwgc3BhcnNlQW5ub3QpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBjb21wb3NpdGUgYW5ub3RhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuICBJZiB0aGUgY29tcG9zaXRlIGFubm90YXRpb24gaXMgCi0gICAgICogbnVsbCwgdGhlbiB0aGUgYXNzb2NpYXRlZCBjbGFzcyAoaWYgbm90IG51bGwpIHdpbGwgYmUgZXhhbWluZWQgZm9yIHRoZSBhcHByb3ByaWF0ZSBqYXZhCi0gICAgICogYW5ub3RhdGlvbi4gIElmIG9uZSBpcyBmb3VuZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGUgYW5ub3RhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlQW5ub3RhdGlvbiBNYXkgYmUgbnVsbC4gIFRoZSBjdXJyZW50IGNvbXBvc2l0ZSBhbm5vdGF0aW9uLiAgSWYgdGhpcyBpcwotICAgICAqIG5vbi1udWxsLCBpdCB3aWxsIHNpbXBseSBiZSByZXR1cm5lZC4KLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlQW5ub3RDbGFzcyBUaGUgY2xhc3Mgb2YgdGhlIGNvbXBvc2l0ZSBhbm5vdGF0aW9uLiAgVGhpcyBpcyBhIHN1YmNsYXNzIG9mCi0gICAgICogdGhlIGphdmEgYW5ub3RhdGlvbiBjbGFzcy4KLSAgICAgKiBAcGFyYW0gamF2YUFubm90YXRpb25DbGFzcyBUaGUgamF2YSBhbm5vdGF0aW9uIGNsYXNzLiAgVGhlIGFzc29jaWF0ZWQgY2xhc3Mgd2lsbCBiZSAKLSAgICAgKiByZWZsZWN0ZWQgb24gdG8gc2VlIGlmIHRoaXMgYW5ub3RhdGlvbiBleGlzdHMuICBJZiBzbywgaXQgaXMgdXNlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAgICAgKiB0aGUgY29tcG9zaXRlIGFubm90YXRpb24gY2xhc3MuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgQW5ub3RhdGlvbiBnZXRDb21wb3NpdGVBbm5vdGF0aW9uKEFubm90YXRpb24gY29tcG9zaXRlQW5ub3RhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjb21wb3NpdGVBbm5vdENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGphdmFBbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgQW5ub3RhdGlvbiByZXR1cm5Bbm5vdGF0aW9uID0gY29tcG9zaXRlQW5ub3RhdGlvbjsKLSAgICAgICAgaWYgKHJldHVybkFubm90YXRpb24gPT0gbnVsbCAmJiB0aGVDb3JyZXNwb25kaW5nQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIGNsYXNzIGFuZCBpZiBvbmUgZXhpc3RzLCBjb25zdHJ1Y3QgYSBjb21wb3NpdGUgYW5ub3QgZm9yIGl0Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25Gcm9tQ2xhc3MgPSBnZXRBbm5vdGF0aW9uRnJvbUNsYXNzKHRoZUNvcnJlc3BvbmRpbmdDbGFzcywgamF2YUFubm90YXRpb25DbGFzcyk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkZyb21DbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGNyZWF0ZUFubm90ID0gY29tcG9zaXRlQW5ub3RDbGFzcy5nZXRNZXRob2QoImNyZWF0ZUZyb21Bbm5vdGF0aW9uIiwgQW5ub3RhdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgY3JlYXRlQW5ub3QuaW52b2tlKG51bGwsIGFubm90YXRpb25Gcm9tQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gY3JlYXRlIGNvbXBvc2l0ZSBhbm5vdGF0aW9uIGR1ZSB0byBleGNlcHRpb24uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgQ29tcG9zaXRlIEFubm90YXRpb246ICIgKyBjb21wb3NpdGVBbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBDb21wb3NpdGUgQW5ub3QgY2xhc3M6ICIgKyBjb21wb3NpdGVBbm5vdENsYXNzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgSmF2YSBBbm5vdCBjbGFzczogIiArIGphdmFBbm5vdGF0aW9uQ2xhc3MsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJEZXNjcmlwdGlvbkJ1aWxkZXJFcnIxIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUFubm90Q2xhc3MudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QgZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCA9IAotICAgICAgICAgICAgKFdlYlNlcnZpY2VQcm92aWRlckFubm90KSBnZXRDb21wb3NpdGVBbm5vdGF0aW9uKHdlYlNlcnZpY2VQcm92aWRlckFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlckFubm90LmNsYXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QgbGlzdC4gKi8KLSAgICBwdWJsaWMgTGlzdDxXZWJTZXJ2aWNlUmVmQW5ub3Q+IGdldEFsbFdlYlNlcnZpY2VSZWZBbm5vdHMoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUmVmQW5ub3RMaXN0OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VSZWZBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViU2VydmljZVJlZkFubm90IGdldFdlYlNlcnZpY2VSZWZBbm5vdChTdHJpbmcgbmFtZSkgewotCi0gICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3c3JhID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3I8V2ViU2VydmljZVJlZkFubm90PiBpdGVyID0KLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlUmVmQW5ub3RMaXN0Lml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICB3c3JhID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAod3NyYS5uYW1lKCkuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgICAgIHJldHVybiB3c3JhOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c3JhOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdlYlNlcnZpY2VSZWZBbm5vdC4gKi8KLSAgICBwdWJsaWMgQmluZGluZ1R5cGVBbm5vdCBnZXRCaW5kaW5nVHlwZUFubm90KCkgewotICAgICAgICByZXR1cm4gKEJpbmRpbmdUeXBlQW5ub3QpIGdldENvbXBvc2l0ZUFubm90YXRpb24oYmluZGluZ1R5cGVBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdUeXBlQW5ub3QuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuQmluZGluZ1R5cGUuY2xhc3MpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uPiBnZXRXZWJTZXJ2aWNlRmVhdHVyZXMoKSB7Ci0gICAgICAgIHJldHVybiBmZWF0dXJlczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUZlYXR1cmVzKExpc3Q8QW5ub3RhdGlvbj4gbGlzdCkgewotICAgICAgICBmZWF0dXJlcyA9IGxpc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFdlYlNlcnZpY2VGZWF0dXJlKEFubm90YXRpb24gYSkgewotICAgICAgICBpZiAoZmVhdHVyZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgZmVhdHVyZXMuYWRkKGEpOwotICAgIH0KLSAgICAKLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsRGVmaW5pdGlvbiAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdzZGxEZWZpbml0aW9uKCkgewotICAgICAgICBpZiAod3NkbERlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uOwotICAgICAgICB9IGVsc2UgaWYgKHdzZGxXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uID0gd3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NkbERlZmluaXRpb24gPSBjcmVhdGVXc2RsRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFVSTCAqLwotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3NkbFVSTDsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgbmFtZSAqLwotICAgIHB1YmxpYyBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1hdGNoaW5nTWV0aG9kcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPSBtZXRob2REZXNjcmlwdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBjb21wb3NpdGUgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRNZXRob2ROYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUuZ2V0TWV0aG9kTmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ01ldGhvZHMuYWRkKGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoaW5nTWV0aG9kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudGggb2NjdXJlbmNlIG9mIHRoaXMgTWV0aG9kQ29tcG9zaXRlLiBTaW5jZSBtZXRob2QgbmFtZXMgYXJlIG5vdCB1bmlxdWUsIHdlIGhhdmUKLSAgICAgKiB0byBhY2NvdW50IGZvciBtdWx0aXBsZSBvY2N1cnJlbmNlcwotICAgICAqCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUKLSAgICAgKiBAcGFyYW0gb2NjdXJlbmNlICBUaGUgbnRoIG9jY3VyYW5jZSB0byByZXR1cm47IG5vdCB0aGlzIGlzIE5PVCAwIGJhc2VkCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBtZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLAotICAgICAgICAgICAgaW50IG9jY3VyZW5jZSkgewotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSByZXR1cm5NREMgPSBudWxsOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtYXRjaGluZ01ldGhvZHMgPQotICAgICAgICAgICAgICAgIGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1ldGhvZE5hbWUpOwotICAgICAgICBpZiAobWF0Y2hpbmdNZXRob2RzICE9IG51bGwgJiYgIW1hdGNoaW5nTWV0aG9kcy5pc0VtcHR5KCkgJiYKLSAgICAgICAgICAgICAgICBvY2N1cmVuY2UgPiAwICYmIG9jY3VyZW5jZSA8PSBtYXRjaGluZ01ldGhvZHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm5NREMgPSBtYXRjaGluZ01ldGhvZHMuZ2V0KC0tb2NjdXJlbmNlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTURDOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBnZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkgewotICAgICAgICByZXR1cm4gbWV0aG9kRGVzY3JpcHRpb25zOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlLi5udWxsIGlmIG5vdCBmb3VuZCAqLwotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGdldEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUoU3RyaW5nIGZpZWxkTmFtZSkgewotCi0gICAgICAgIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgY29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3I8RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaXRlciA9Ci0gICAgICAgICAgICAgICAgZmllbGREZXNjcmlwdGlvbnMuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRGaWVsZE5hbWUoKS5lcXVhbHMoZmllbGROYW1lKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgTW9kdWxlQ2xhc3NUeXBlLiAqLwotICAgIHB1YmxpYyBXc2RsR2VuZXJhdG9yIGdldEN1c3RvbVdzZGxHZW5lcmF0b3IoKSB7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMud3NkbEdlbmVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBDbGFzc0xvYWRlci4gKi8KLSAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoKSB7Ci0KLSAgICAgICAgcmV0dXJuIGlzSW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8vKysrKysrKysKLSAgICAvL1NldHRlcnMKLSAgICAvLysrKysrKysrCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUFubm90KFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlQW5ub3QgPSB3ZWJTZXJ2aWNlQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBjbGFzc01vZGlmaWVycyBUaGUgY2xhc3NNb2RpZmllcnMgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTW9kaWZpZXJzKFN0cmluZ1tdIGNsYXNzTW9kaWZpZXJzKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NNb2RpZmllcnMgPSBjbGFzc01vZGlmaWVyczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3NOYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGV4dGVuZHNDbGFzcyBUaGUgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1cGVyQ2xhc3NOYW1lKFN0cmluZyBleHRlbmRzQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5leHRlbmRzQ2xhc3MgPSBleHRlbmRzQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBpbnRlcmZhY2VzTGlzdCBUaGUgaW50ZXJmYWNlc0xpc3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEludGVyZmFjZXNMaXN0KExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzTGlzdCkgewotICAgICAgICB0aGlzLmludGVyZmFjZXNMaXN0ID0gaW50ZXJmYWNlc0xpc3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBoYW5kbGVyQ2hhaW5Bbm5vdCBUaGUgaGFuZGxlckNoYWluQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbkFubm90KEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluQW5ub3QgPSBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHNlcnZpY2VNb2RlQW5ub3QgVGhlIHNlcnZpY2VNb2RlQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VNb2RlQW5ub3QoU2VydmljZU1vZGVBbm5vdCBzZXJ2aWNlTW9kZUFubm90KSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU1vZGVBbm5vdCA9IHNlcnZpY2VNb2RlQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBzb2FwQmluZGluZ0Fubm90IFRoZSBzb2FwQmluZGluZ0Fubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2FwQmluZGluZ0Fubm90KFNvYXBCaW5kaW5nQW5ub3Qgc29hcEJpbmRpbmdBbm5vdCkgewotICAgICAgICB0aGlzLnNvYXBCaW5kaW5nQW5ub3QgPSBzb2FwQmluZGluZ0Fubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViRmF1bHRBbm5vdCBUaGUgd2ViRmF1bHRBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViRmF1bHRBbm5vdChXZWJGYXVsdEFubm90IHdlYkZhdWx0QW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJGYXVsdEFubm90ID0gd2ViRmF1bHRBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYlNlcnZpY2VDbGllbnRBbm5vdCBUaGUgd2ViU2VydmljZUNsaWVudEFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoCi0gICAgICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3Qgd2ViU2VydmljZUNsaWVudEFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZUNsaWVudEFubm90ID0gd2ViU2VydmljZUNsaWVudEFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZVByb3ZpZGVyQW5ub3QgVGhlIHdlYlNlcnZpY2VQcm92aWRlckFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgKLSAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHdlYlNlcnZpY2VQcm92aWRlckFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZVByb3ZpZGVyQW5ub3QgPSB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYlNlcnZpY2VSZWZBbm5vdCBUaGUgd2ViU2VydmljZVJlZkFubm90IHRvIGFkZCB0byB0aGUgbGlzdC4gKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRXZWJTZXJ2aWNlUmVmQW5ub3QoCi0gICAgICAgICAgICBXZWJTZXJ2aWNlUmVmQW5ub3Qgd2ViU2VydmljZVJlZkFubm90KSB7Ci0gICAgICAgIHdlYlNlcnZpY2VSZWZBbm5vdExpc3QuYWRkKHdlYlNlcnZpY2VSZWZBbm5vdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVJlZkFubm90KFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QpIHsKLSAgICAgICAgYWRkV2ViU2VydmljZVJlZkFubm90KHdlYlNlcnZpY2VSZWZBbm5vdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IoQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLSAgICAgICAgZ2VuZXJpY0Fubm90YXRpb25Qcm9jZXNzb3JzLnB1dChwcm9jZXNzb3IuZ2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCksIHByb2Nlc3Nvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yPiBnZXRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycygpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyaWNBbm5vdGF0aW9uUHJvY2Vzc29yczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlKEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIGdlbmVyaWNBbm5vdGF0aW9uSW5zdGFuY2VzLmFkZChhbm5vdGF0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPiBnZXRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2VzKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJpY0Fubm90YXRpb25JbnN0YW5jZXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIHdzZGxEZWZpbml0aW9uIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihEZWZpbml0aW9uIHdzZGxEZWYpIHsKLQotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHdzZGxEZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHdzZGxEZWYgaW5zdGFuY2VvZiBXU0RMNEpXcmFwcGVyKSB7Ci0gICAgICAgICAgICAgICAgd3NkbFdyYXBwZXIgPSAoV1NETDRKV3JhcHBlcikgd3NkbERlZjsKLQotICAgICAgICAgICAgICAgIGRlZiA9IHdzZGxXcmFwcGVyLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG15Q29uZmlnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgV1NETDRKV3JhcHBlciB3aXRoIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxXcmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIod3NkbERlZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15Q29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uLCBkZWZhdWx0IHRvIHVzaW5nIGEgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkgc2Vuc2l0aXZlIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxXcmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIod3NkbERlZiwgdHJ1ZSwgMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVmID0gd3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhYnNvcmIKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsRGVmaW5pdGlvbkJhc2VVUkkgPSBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHdzZGxEZWZpbml0aW9uQmFzZVVSSSAhPSBudWxsKSAmJiAod3NkbFVSTCA9PSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBVUkwod3NkbERlZmluaXRpb25CYXNlVVJJKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOnNldFdzZGxEZWZpbml0aW9uKCk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiQ2F1Z2h0IGV4Y2VwdGlvbiBjcmVhdGluZyBXU0RMIFVSTCA6IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd3NkbERlZmluaXRpb25CYXNlVVJJICsgIjsgZXhjZXB0aW9uOiAiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2UudG9TdHJpbmcoKSxlKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxVUkwgVGhlIHdzZGxVUkwgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldHdzZGxVUkwoVVJMIHdzZGxVUkwpIHsKLSAgICAgICAgdGhpcy53c2RsVVJMID0gd3NkbFVSTDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIEJpbmRpbmdUeXBlQW5ub3QgVGhlIEJpbmRpbmdUeXBlQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdUeXBlQW5ub3QoCi0gICAgICAgICAgICBCaW5kaW5nVHlwZUFubm90IGJpbmRpbmdUeXBlQW5ub3QpIHsKLSAgICAgICAgdGhpcy5iaW5kaW5nVHlwZUFubm90ID0gYmluZGluZ1R5cGVBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGlzSW50ZXJmYWNlIFNldHMgd2hldGhlciB0aGlzIGNvbXBvc2l0ZSByZXByZXNlbnRzIGEgY2xhc3Mgb3IgaW50ZXJmYWNlICovCi0gICAgcHVibGljIHZvaWQgc2V0SXNJbnRlcmZhY2UoYm9vbGVhbiBpc0ludGVyZmFjZSkgewotICAgICAgICB0aGlzLmlzSW50ZXJmYWNlID0gaXNJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXRob2REZXNjcmlwdGlvbiBUaGUgbWV0aG9kRGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoZSBzZXQuICovCi0gICAgcHVibGljIHZvaWQgYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWV0aG9kRGVzY3JpcHRpb24pIHsKLSAgICAgICAgbWV0aG9kRGVzY3JpcHRpb25zLmFkZChtZXRob2REZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZXRob2REZXNjcmlwdGlvbiBUaGUgbWV0aG9kRGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoZSBzZXQuICovCi0gICAgcHVibGljIHZvaWQgYWRkRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZShGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGZpZWxkRGVzY3JpcHRpb24pIHsKLSAgICAgICAgZmllbGREZXNjcmlwdGlvbnMuYWRkKGZpZWxkRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVdzZGxHZW5lcmF0b3IoV3NkbEdlbmVyYXRvciB3c2RsR2VuZXJhdG9yKSB7Ci0KLSAgICAgICAgdGhpcy53c2RsR2VuZXJhdG9yID0gd3NkbEdlbmVyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCi0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbnNUeXBlIGdldEhhbmRsZXJDaGFpbnNUeXBlKCkgewotICAgIAlyZXR1cm4gaGFuZGxlckNoYWluc1R5cGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbnNUeXBlKEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlKSB7Ci0gICAgCXRoaXMuaGFuZGxlckNoYWluc1R5cGUgPSBoYW5kbGVyQ2hhaW5zVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW5zd2VyIGRvZXMgdGhpcyBjb21wb3NpdGUgcmVwcmVzZW50IGEgc2VydmljZSByZXF1ZXN0ZXIgKGFrYSBjbGllbnQpIG9yIGEgc2VydmljZQotICAgICAqIHByb3ZpZGVyIChha2Egc2VydmVyKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNlcnZpY2UgcHJvdmlkZXIgKGFrYSBhbiBlbmRwb2ludCBvciBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KLSAgICAgKiBvciBhIHNlcnZlcikKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmljZVByb3ZpZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaW5kaWNhdGlvbiBvZiB3aGV0aGVyIHRoaXMgY29tcG9zaXRlIHJlcHJlc2VudHMgYSBzZXJ2aWNlIHJlcXVlc3RlciAoYWthIGNsaWVudCkgb3IKLSAgICAgKiBhIHNlcnZpY2UgcHJvdmlkZXIgKGFrYSBzZXJ2ZXIpLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElzU2VydmljZVByb3ZpZGVyKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgaXNTZXJ2aWNlUHJvdmlkZXIgPSB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb3NpdGUuICBGb3IgYSBzZXJ2aWNlIHJlcXVlc3RlciwgdGhpcyBjb3VsZCBiZSB0aGUKLSAgICAgKiBTZXJ2aWNlIGNsYXNzIG9yIHRoZSBTRUkgY2xhc3MuICBGb3IgYSBzZXJ2aWNlIHByb3ZpZGVyIHRoaXMgd2lsbCBiZSBudWxsICh1bmxlc3MgdGhlIAotICAgICAqIGRlcHJlY2F0ZWQgc2VydmljZSBjb25zdHJ1Y3Rpb24gbG9naWMgaW4gRGVzY3JpcHRpb25GYWN0b3J5IGlzIHVzZWQpCi0gICAgICogQHBhcmFtIHRoZUNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29ycmVzcG9uZGluZ0NsYXNzKENsYXNzIHRoZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMudGhlQ29ycmVzcG9uZGluZ0NsYXNzID0gdGhlQ2xhc3M7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9zaXRlLCBpZiBhbnkuCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRDb3JyZXNwb25kaW5nQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiB0aGVDb3JyZXNwb25kaW5nQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBDYXRhbG9nIE1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9zaXRlLiAgCi0gICAgICogQHBhcmFtIHRoZUNhdGFsb2dNYW5nZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nTWFuYWdlcihKQVhXU0NhdGFsb2dNYW5hZ2VyIHRoZUNhdGFsb2dNYW5hZ2VyKSB7Ci0gICAgCXRoaXMuY2F0YWxvZ01hbmFnZXIgPSB0aGVDYXRhbG9nTWFuYWdlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2F0YWxvZyBtYW5hZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvc2l0ZSwgaWYgYW55LgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSkFYV1NDYXRhbG9nTWFuYWdlciBnZXRDYXRhbG9nTWFuYWdlcigpIHsKLSAgICAJcmV0dXJuIGNhdGFsb2dNYW5hZ2VyOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgewotICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydGllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9yZSBhIFdTREwgRGVmaW5pdGlvbiBrZXllZCBieSBhIHNlcnZpY2UgUU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihRTmFtZSBzZXJ2aWNlUU5hbWUsIERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICB0aGlzLndzZGxEZWZzLnB1dChzZXJ2aWNlUU5hbWUsIGRlZmluaXRpb24pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXRyaXZlIGEgV1NETCBEZWZpbml0aW9uIGJ5IGEgc2VydmljZSBRTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdzZGxEZWZpbml0aW9uKFFOYW1lIHNlcnZpY2VRTmFtZSkgewotICAgICAgICByZXR1cm4gd3NkbERlZnMuZ2V0KHNlcnZpY2VRTmFtZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFN0b3JlIGEgV1NETCBVUkwga2V5ZWQgYnkgYSBzZXJ2aWNlIFFOYW1lCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0d3NkbFVSTChRTmFtZSBzZXJ2aWNlUU5hbWUsIFVSTCB1cmwpIHsKLSAgICAgICAgd3NkbFVSTHMucHV0KHNlcnZpY2VRTmFtZSwgdXJsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cml2ZSBhIFdTREwgVVJMIGJ5IGEgc2VydmljZSBRTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVSTChRTmFtZSBzZXJ2aWNlUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxVUkxzLmdldChzZXJ2aWNlUU5hbWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdGhlIHNldCBvZiB3c2RsOnNlcnZpY2UgUU5hbWVzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IHRoaXMgREJDJ3MgbWV0YWRhdGEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUU5hbWVzKFNldDxRTmFtZT4gc2VydmljZVFOYW1lcykgewotICAgICAgICB0aGlzLnNlcnZpY2VRTmFtZXMgPSBzZXJ2aWNlUU5hbWVzOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNldCBvZiB3c2RsOnNlcnZpY2UgUU5hbWVzIHJlcHJlc2VudGVkIGJ5IHRoaXMgREJDJ3MgbWV0YWRhdGEKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFNldDxRTmFtZT4gZ2V0U2VydmljZVFOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VRTmFtZXM7Ci0gICAgfQotICAgIAotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzYW1lTGluZSA9ICI7ICI7Ci0gICAgICAgIHNiLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkNsYXNzTmFtZTogIiArIGNsYXNzTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChzYW1lTGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiU3VwZXJDbGFzczoiICsgZXh0ZW5kc0NsYXNzKTsKLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQ2xhc3MgbW9kaWZpZXJzOiAiKTsKLSAgICAgICAgaWYgKGNsYXNzTW9kaWZpZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NNb2RpZmllcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY2xhc3NNb2RpZmllcnNbaV0pOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzYW1lTGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiaXMgU2VydmljZSBQcm92aWRlcjogIiArIGlzU2VydmljZVByb3ZpZGVyKCkgKTsKLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgid3NkbFVSTDogIiArIGdldFdzZGxVUkwoKSApOwotCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJoYXMgd3NkbERlZmluaXRpb24/OiAiKTsKLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uICE9bnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJ0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoImZhbHNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiSW50ZXJmYWNlczogIik7Ci0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaW50SXRlciA9IGludGVyZmFjZXNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbnRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGludGVyID0gaW50SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaW50ZXIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHNhbWVMaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJTZXJ2aWNlQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJTZXJ2aWNlOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJTZXJ2aWNlQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViU2VydmljZVByb3ZpZGVyQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJTZXJ2aWNlUHJvdmlkZXI6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHdlYlNlcnZpY2VQcm92aWRlckFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJCaW5kaW5nVHlwZTogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYmluZGluZ1R5cGVBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJTZXJ2aWNlQ2xpZW50QW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJTZXJ2aWNlQ2xpZW50OiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJTZXJ2aWNlQ2xpZW50QW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViRmF1bHRBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYkZhdWx0OiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3ZWJGYXVsdEFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VNb2RlQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJTZXJ2aWNlTW9kZTogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc2VydmljZU1vZGVBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiU09BUEJpbmRpbmc6ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHNvYXBCaW5kaW5nQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGFuZGxlckNoYWluQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJIYW5kbGVyQ2hhaW46ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGhhbmRsZXJDaGFpbkFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZBbm5vdExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJOdW1iZXIgb2YgV2ViU2VydmljZVJlZjogICIgKyB3ZWJTZXJ2aWNlUmVmQW5ub3RMaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBJdGVyYXRvcjxXZWJTZXJ2aWNlUmVmQW5ub3Q+IHdzckl0ZXIgPSB3ZWJTZXJ2aWNlUmVmQW5ub3RMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAod3NySXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUmVmQW5ub3Qgd3NyID0gd3NySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHdzci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2FtZUxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIk51bWJlciBvZiBNZXRob2QgRGVzY3JpcHRpb25zOiAiICsgbWV0aG9kRGVzY3JpcHRpb25zLnNpemUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yPE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNJdGVyID0gbWV0aG9kRGVzY3JpcHRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChtZGNJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbWRjSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobWRjLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIk51bWJlciBvZiBGaWVsZCBEZXNjcmlwdGlvbnM6ICIgKyBmaWVsZERlc2NyaXB0aW9ucy5zaXplKCkpOwotICAgICAgICBJdGVyYXRvcjxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBmZGNJdGVyID0gZmllbGREZXNjcmlwdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGZkY0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGZkYyA9IGZkY0l0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGZkYy50b1N0cmluZygpKTsKLQkJfQotICAgICAgICAKLSAgICAgICAgaWYocG9ydENvbXBvc2l0ZUxpc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIXBvcnRDb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIqKiBQb3J0Q29tcG9zaXRlIE9iamVjdHMqKiIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgZm9yKFBvcnRDb21wb3NpdGUgcGMgOiBwb3J0Q29tcG9zaXRlTGlzdCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiUG9ydENvbXBvc2l0ZSIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHdzZGwgZGVmaW5pdGlvbiBmcm9tIHRoZSBzdXBwbGllZCAKLSAgICAgKiBsb2NhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gX3dzZGxVUkwgVGhlIFVSTCB3aGVyZSB0aGUgd3NkbCBpcyBsb2NhdGVkCi0gICAgICogQHJldHVybiBUaGUgV1NETCBEZWZpbml0aW9uIG9yIE5VTEwKLSAgICAgKi8KLSAgICBwcml2YXRlIERlZmluaXRpb24gY3JlYXRlV3NkbERlZmluaXRpb24oVVJMIF93c2RsVVJMKSB7Ci0gICAgICAgIGlmIChfd3NkbFVSTCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIERlZmluaXRpb24gd3NkbERlZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlcigiICsgX3dzZGxVUkwudG9TdHJpbmcoKSArICIsQ29uZmlndXJhdGlvbkNvbnRleHQiICk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB3c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKF93c2RsVVJMLCBteUNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAod3NkbFdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdzZGxEZWYgPSB3c2RsV3JhcHBlci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTpjcmVhdGVXc2RsRGVmaW5pdGlvbigiCi0gICAgICAgICAgICAgICAgICAgICAgICArIF93c2RsVVJMLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIik6IENhdWdodCBleGNlcHRpb24gdHJ5aW5nIHRvIGNyZWF0ZSBXU0RMIERlZmluaXRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICtlLCBlKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3NkbERlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBteUNvbmZpZ0NvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFkZHMgYSBQb3J0Q29tcG9zaXRlIHRvIHRoZSBnZW5lcmljIGxpc3QuIFRoaXMgbGlzdCBvZiBQb3J0Q29tcG9zaXRlIG9iamVjdHMKLSAgICAgKiBpcyBub3Qga2V5ZWQgYnkgd3NkbDpzZXJ2aWNlIFFOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBvcnRDb21wb3NpdGUoUG9ydENvbXBvc2l0ZSBwb3J0REJDKSB7Ci0gICAgICAgIHBvcnRDb21wb3NpdGVMaXN0LmFkZChwb3J0REJDKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFBvcnRDb21wb3NpdGUgdG8gYSBsaXN0IHRoYXQgaXMga2V5ZWQgYnkgYSB3c2RsOnNlcnZpY2UgUU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUG9ydENvbXBvc2l0ZShRTmFtZSBzZXJ2aWNlUU5hbWUsIFBvcnRDb21wb3NpdGUgcG9ydERCQykgewotICAgICAgICBMaXN0PFBvcnRDb21wb3NpdGU+IHBjTGlzdCA9IHNRTmFtZVRvUEMuZ2V0KHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgIGlmKHBjTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwY0xpc3QgPSBuZXcgTGlua2VkTGlzdDxQb3J0Q29tcG9zaXRlPigpOwotICAgICAgICAgICAgc1FOYW1lVG9QQy5wdXQoc2VydmljZVFOYW1lLCBwY0xpc3QpOwotICAgICAgICB9Ci0gICAgICAgIHBjTGlzdC5hZGQocG9ydERCQyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGdlbmVyaWMgUG9ydENvbXBvc2l0ZSBpbnN0YW5jZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UG9ydENvbXBvc2l0ZT4gZ2V0UG9ydENvbXBvc2l0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0Q29tcG9zaXRlTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyBhbGwgdGhlIFBvcnRDb21wb3NpdGUgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgd3NkbDpzZXJ2aWNlIFFOYW1lLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQb3J0Q29tcG9zaXRlPiBnZXRQb3J0Q29tcG9zaXRlcyhRTmFtZSBzZXJ2aWNlUU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHNRTmFtZVRvUEMuZ2V0KHNlcnZpY2VRTmFtZSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFkNWMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIERlc2NyaXB0aW9uQnVpbGRlclV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5jbGFzcyk7Ci0KLSAgICBzdGF0aWMgU3RyaW5nIEpBWFdTX0hPTERFUl9DTEFTUyA9ICJqYXZheC54bWwud3MuSG9sZGVyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUFJJTUlUSVZFID0gImludCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9QUklNSVRJVkVfRU5DT0RJTkcgPSAiSSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEVfUFJJTUlUSVZFID0gImJ5dGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFX1BSSU1JVElWRV9FTkNPRElORyA9ICJCIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUl9QUklNSVRJVkUgPSAiY2hhciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJfUFJJTUlUSVZFX0VOQ09ESU5HID0gIkMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVF9QUklNSVRJVkUgPSAic2hvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVF9QUklNSVRJVkVfRU5DT0RJTkcgPSAiUyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU5fUFJJTUlUSVZFID0gImJvb2xlYW4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX1BSSU1JVElWRV9FTkNPRElORyA9ICJaIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR19QUklNSVRJVkUgPSAibG9uZyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfUFJJTUlUSVZFX0VOQ09ESU5HID0gIkoiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9QUklNSVRJVkUgPSAiZmxvYXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9QUklNSVRJVkVfRU5DT0RJTkcgPSAiRiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9QUklNSVRJVkUgPSAiZG91YmxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1BSSU1JVElWRV9FTkNPRElORyA9ICJEIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9QUklNSVRJVkUgPSAidm9pZCI7Ci0gICAgLy8gUkVWSUVXOiBUaGlzIG1heSBub3QgYmUgdGhlIGNvcnJlY3QgZW5jb2RpbmcgZm9yIFZvaWQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9QUklNSVRJVkVfRU5DT0RJTkcgPSAiViI7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3V0ZXJtb3N0IGdlbmVyaWMgcmF3IHR5cGUgY2xhc3MsIG9yIG51bGwgaWYgdGhlIGFyZ3VtZW50Ci0gICAgICogaXMgbm90IGEgZ2VuZXJpYy4gIEZvciBleGFtcGxlIGlmIHRoZSBzdHJpbmcgImphdmF4LnhtbC53cy5Ib2xkZXI8bXkucGFja2FnZS5NeU9iamVjdD4iIGlzCi0gICAgICogcGFzc2VkIGluLCB0aGUgc3RyaW5nICJqYXZheC54bWwud3MuSG9sZGVyIiB3aWxsIGJlIHJldHVybmVkLgotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlIHRoYXQgZ2VuZXJpYyBhcnJheXMgYXJlIHN1cHBvcnRlZC4gIEZvciBleGFtcGxlLCBmb3IgIkhvbGRlcjxMaXN0PFN0cmluZz5bXVtdIiwgdGhlCi0gICAgICogcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSAiTGlzdFtdW10iLgotICAgICAqCi0gICAgICogQHBhcmFtIGlucHV0VHlwZQotICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmljIHJhdyB0eXBlIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gZ2VuZXJpYy4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldFJhd1R5cGUoU3RyaW5nIGlucHV0VHlwZSkgewotICAgICAgICBTdHJpbmcgcmV0dXJuUmF3VHlwZSA9IG51bGw7Ci0gICAgICAgIGludCBsZWZ0QnJhY2tldCA9IGlucHV0VHlwZS5pbmRleE9mKCI8Iik7Ci0gICAgICAgIGludCByaWdodEJyYWNrZXQgPSBpbnB1dFR5cGUubGFzdEluZGV4T2YoIj4iKTsKLSAgICAgICAgaWYgKGxlZnRCcmFja2V0ID4gMCAmJiByaWdodEJyYWNrZXQgPiAwICYmIHJpZ2h0QnJhY2tldCA+IGxlZnRCcmFja2V0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydDEgPSBpbnB1dFR5cGUuc3Vic3RyaW5nKDAsIGxlZnRCcmFja2V0KTsKLSAgICAgICAgICAgIGlmICgocmlnaHRCcmFja2V0ICsgMSkgPT0gaW5wdXRUeXBlLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm90aGluZyBhZnRlciB0aGUgY2xvc2luZyAiPiIgd2UgbmVlZCB0byBhcHBlbmQgdG8gdGhlIHJhdyB0eXBlCi0gICAgICAgICAgICAgICAgcmV0dXJuUmF3VHlwZSA9IHBhcnQxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGNsb3NpbmcgIj4iIHRoZW4gYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgdG8gdGhlIHJhdyB0eXBlCi0gICAgICAgICAgICAgICAgLy8gVGhpcyB3b3VsZCBiZSBhbiBhcnJheSBkZWNsYXJhdGlvbiBmb3IgZXhhbXBsZS4KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydDIgPSBpbnB1dFR5cGUuc3Vic3RyaW5nKHJpZ2h0QnJhY2tldCArIDEpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICByZXR1cm5SYXdUeXBlID0gcGFydDEgKyBwYXJ0MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuUmF3VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFjdHVhbCB0eXBlIGluIGEgSkFYLVdTIGhvbGRlciBkZWNsYXJhdGlvbi4gIEZvciBleGFtcGxlLCBmb3IgdGhlIGFyZ3VtZW50Ci0gICAgICogImphdmF4LnhtbC53cy5Ib2xkZXI8bXkucGFja2FnZS5NeU9iamVjdD4iLCByZXR1cm4gIm15LnBhY2thZ2UuTXlPYmplY3QiLiBJZiB0aGUgYWN0dWFsIHR5cGUKLSAgICAgKiBpdHNlbGYgaXMgYSBnZW5lcmljLCB0aGVuIHRoYXQgcmF3IHR5cGUgd2lsbCBiZSByZXR1cm5lZC4gIEZvciBleGFtcGxlLAotICAgICAqICJqYXZheC54bWwud3MuSG9sZGVyPGphdmEudXRpbC5MaXN0PG15LnBhY2thZ2UuTXlPYmplY3Q+PiIgd2lsbCByZXR1cm4gImphdmEudXRpbC5MaXN0Ii4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IEhvbGRlcnMgb2YgQXJyYXlzIGFuZCBvZiBHZW5lcmljIEFycmF5cyBhcmUgYWxzbyBzdXBwb3J0ZWQuICBGb3IgZXhhbXBsZSwgZm9yCi0gICAgICogImphdmF4LnhtbC53cy5Ib2xkZXI8U3RyaW5nW10+IiwgcmV0dXJuICJTdHJpbmdbXSIuICBGb3IgYW4gYXJyYXkgb2YgYSBnZW5lcmljLCB0aGUgYXJyYXkgb2YKLSAgICAgKiB0aGUgcmF3IHR5cGUgaXMgcmV0dXJuZWQuICBGb3IgZXhhbXBsZSwgZm9yICJqYXZheC54bWwud3MuSG9sZGVyPExpc3Q8U3RyaW5nPltdW10+IiwgcmV0dXJuCi0gICAgICogIkxpc3RbXVtdIi4KLSAgICAgKiA8cC8+Ci0gICAgICogSW1wb3J0YW50IG5vdGUhICBUaGUgSkFYLVdTIEhvbGRlciBnZW5lcmljIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgYWN0dWFsIHR5cGUsIGkuZS4gdGhlCi0gICAgICogZ2VuZXJpYyBpcyBqYXZheC54bWwud3MuSG9sZGVyPFQ+LiAgVGhpcyBtZXRob2QgaXMgbm90IGdlbmVyYWwgcHVycG9zZTsgaXQgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqIGdlbmVyaWNzIHdpdGggbXVsdGlwbGUgdHlwZXMgc3VjaCBhcyBHZW5lcmljPEssVj4gYXQgdGhlIG91dGVybW9zdCBsZXZlbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBob2xkZXJJbnB1dFN0cmluZwotICAgICAqIEByZXR1cm4gcmV0dXJuIHRoZSBhY3R1YWwgYXJndW1lbnQgY2xhc3MgbmFtZSBmb3IgYSBKQVgtV1MgSG9sZGVyOyByZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogICAgICAgICBhcmd1bWVudCBpcyBub3QgYSBKQVgtV1MgSG9sZGVyCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBnZXRIb2xkZXJBY3R1YWxUeXBlKFN0cmluZyBob2xkZXJJbnB1dFN0cmluZykgewotICAgICAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gbnVsbDsKLSAgICAgICAgaWYgKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzSG9sZGVyVHlwZShob2xkZXJJbnB1dFN0cmluZykpIHsKLSAgICAgICAgICAgIGludCBsZWZ0QnJhY2tldCA9IGhvbGRlcklucHV0U3RyaW5nLmluZGV4T2YoIjwiKTsKLSAgICAgICAgICAgIGludCByaWdodEJyYWNrZXQgPSBob2xkZXJJbnB1dFN0cmluZy5sYXN0SW5kZXhPZigiPiIpOwotICAgICAgICAgICAgaWYgKGxlZnRCcmFja2V0ID4gMCAmJiByaWdodEJyYWNrZXQgPiBsZWZ0QnJhY2tldCArIDEpIHsKLSAgICAgICAgICAgICAgICAvLyBHZXQgZXZlcnl0aGluZyBiZXR3ZWVuIHRoZSBvdXRlcm1vc3QgIjwiIGFuZCAiPiIKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBob2xkZXJJbnB1dFN0cmluZy5zdWJzdHJpbmcobGVmdEJyYWNrZXQgKyAxLCByaWdodEJyYWNrZXQpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaG9sZGVyIGNvbnRhaW5lZCBhIGdlbmVyaWMsIHRoZW4gZ2V0IHRoZSBnZW5lcmljIHJhdyB0eXBlIChlLmcuICJMaXN0IiBmb3IKLSAgICAgICAgICAgICAgICAvLyBIb2xkZXI8TGlzdDxTdHJpbmc+PikuCi0gICAgICAgICAgICAgICAgU3RyaW5nIHJhd1R5cGUgPSBnZXRSYXdUeXBlKGFjdHVhbFR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChyYXdUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gcmF3VHlwZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nID0gYWN0dWFsVHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblN0cmluZzsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBpbnB1dCBTdHJpbmcgaXMgYSBKQVgtV1MgSG9sZGVyLiAgRm9yIGV4YW1wbGUgImphdmF4LnhtbC53cy5Ib2xkZXI8bXkucGFja2FnZS5NeU9iamVjdD4iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNoZWNrVHlwZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBhIEpBWC1XUyBIb2xkZXIgdHlwZTsgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHN0YXRpYyBib29sZWFuIGlzSG9sZGVyVHlwZShTdHJpbmcgY2hlY2tUeXBlKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNIb2xkZXIgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNoZWNrVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2hlY2tUeXBlLnN0YXJ0c1dpdGgoSkFYV1NfSE9MREVSX0NMQVNTKSkgewotICAgICAgICAgICAgICAgIGlzSG9sZGVyID0gY2hlY2tUeXBlLmxlbmd0aCgpID09IEpBWFdTX0hPTERFUl9DTEFTUy5sZW5ndGgoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tUeXBlLmNoYXJBdChKQVhXU19IT0xERVJfQ0xBU1MubGVuZ3RoKCkpID09ICc8JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNIb2xkZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW5zd2VycyBpZiB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2xhc3MgY29udGFpbnMgYW4gYXJyYXkgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlCi0gICAgICogIkZvb1tdW10iIHdvdWxkIHJldHVybiB0cnVlLCBhcyB3b3VsZCAiaW50W10iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzQW5BcnJheShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUuaW5kZXhPZigiWyIpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYW4gY2xhc3MgbmFtZSB0aGF0IGlzIGFuIGFycmF5LCByZXR1cm4gdGhlIG5vbi1hcnJheSBkZWNsYXJhdGlvbiBwb3J0aW9uLiBGb3IgZXhhbXBsZQotICAgICAqICJteS5wYWNrYWdlLkZvb1tdW10iIHdvdWxkIHJldHVybiAibXkucGFja2FnZS5Gb28iLiBSZXR1cm5zIG51bGwgaWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90Ci0gICAgICogY29udGFpbiBhbiBhcnJheSBkZWNsYXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmdWxsQ2xhc3NOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZUFycmF5Q2xhc3NOYW1lKFN0cmluZyBmdWxsQ2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBiYXNlQXJyYXlDbGFzc05hbWUgPSBudWxsOwotICAgICAgICBpZiAoZnVsbENsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgZmlyc3RBcnJheURpbWVuc2lvbiA9IGZ1bGxDbGFzc05hbWUuaW5kZXhPZigiWyIpOwotICAgICAgICAgICAgaWYgKGZpcnN0QXJyYXlEaW1lbnNpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgYmFzZUFycmF5Q2xhc3NOYW1lID0gZnVsbENsYXNzTmFtZS5zdWJzdHJpbmcoMCwgZmlyc3RBcnJheURpbWVuc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJhc2VBcnJheUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBwcmVmaXggc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gQ2xhc3MuZm9yTmFtZShTdHJpbmcpIGZvciBhbiBhcnJheS4gIEVhY2ggYXJyYXkKLSAgICAgKiBkaW1lbnNpb24gcmVwcmVzZW50ZWQgYnkgIltdIiB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlICJbIi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnJheUNsYXNzTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldEFycmF5RGltZW5zaW9uUHJlZml4KFN0cmluZyBhcnJheUNsYXNzTmFtZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYXJyYXlEaW1QcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgaWYgKGFycmF5Q2xhc3NOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBhcnJheURpbUluZGV4ID0gYXJyYXlDbGFzc05hbWUuaW5kZXhPZigiW10iKTsKLSAgICAgICAgICAgIHdoaWxlIChhcnJheURpbUluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIGFycmF5RGltUHJlZml4LmFwcGVuZCgiWyIpOwotICAgICAgICAgICAgICAgIC8vIFNraXAgb3ZlciB0aGlzICJbXSIgYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IG1vcmUuCi0gICAgICAgICAgICAgICAgaW50IHN0YXJ0TmV4dCA9IGFycmF5RGltSW5kZXggKyAyOwotICAgICAgICAgICAgICAgIGFycmF5RGltSW5kZXggPSBhcnJheUNsYXNzTmFtZS5pbmRleE9mKCJbXSIsIHN0YXJ0TmV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXJyYXlEaW1QcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmV0dXJuIGFycmF5RGltUHJlZml4LnRvU3RyaW5nKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBwcmltaXRpdmVzLCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHByaW1pdGl2ZSBjbGFzcy4gIE5vdGUgdGhhdCBhcnJheXMgb2YgcHJpbWl0aXZlcyBhcmUKLSAgICAgKiBoYW5kbGVkIGRpZmZlcmVudGx5LCBsaWtlIGFycmF5cyBvZiBvYmplY3RzLiAgT25seSBub24tYXJyYXkgcHJpbWl0aXZlcyBhcmUgcHJvY2Vzc2VkIGJ5IHRoaXMKLSAgICAgKiBtZXRob2QuICBUaGlzIG1ldGhvZCB1bmRlcnN0YW5kcyBib3RoIHRoZSB0eXBpY2FsIHByaW1pdGl2ZSBkZWNsYXJhdGlvbiAoZS5nLiAiaW50IikgYW5kIHRoZQotICAgICAqIGVuY29kaW5nIHVzZWQgYXMgZm9yIGFycmF5cyAoZS5nLiAiSSIpLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzVHlwZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgQ2xhc3MgZ2V0UHJpbWl0aXZlQ2xhc3MoU3RyaW5nIGNsYXNzVHlwZSkgewotCi0gICAgICAgIENsYXNzIHBhcmFtQ2xhc3MgPSBudWxsOwotCi0gICAgICAgIGlmIChJTlRfUFJJTUlUSVZFLmVxdWFscyhjbGFzc1R5cGUpIHx8IElOVF9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBpbnQuY2xhc3M7Ci0gICAgICAgIH0gZWxzZSBpZiAoQllURV9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgQllURV9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBieXRlLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKENIQVJfUFJJTUlUSVZFLmVxdWFscyhjbGFzc1R5cGUpIHx8IENIQVJfUFJJTUlUSVZFX0VOQ09ESU5HLmVxdWFscyhjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICBwYXJhbUNsYXNzID0gY2hhci5jbGFzczsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChTSE9SVF9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgU0hPUlRfUFJJTUlUSVZFX0VOQ09ESU5HLmVxdWFscyhjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICBwYXJhbUNsYXNzID0gc2hvcnQuY2xhc3M7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICBpZiAoQk9PTEVBTl9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgQk9PTEVBTl9QUklNSVRJVkVfRU5DT0RJTkcuZXF1YWxzKGNsYXNzVHlwZSkpIHsKLSAgICAgICAgICAgIHBhcmFtQ2xhc3MgPSBib29sZWFuLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKExPTkdfUFJJTUlUSVZFLmVxdWFscyhjbGFzc1R5cGUpIHx8IExPTkdfUFJJTUlUSVZFX0VOQ09ESU5HLmVxdWFscyhjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICBwYXJhbUNsYXNzID0gbG9uZy5jbGFzczsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIGlmIChGTE9BVF9QUklNSVRJVkUuZXF1YWxzKGNsYXNzVHlwZSkgfHwgRkxPQVRfUFJJTUlUSVZFX0VOQ09ESU5HLmVxdWFscyhjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICBwYXJhbUNsYXNzID0gZmxvYXQuY2xhc3M7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICBpZiAoRE9VQkxFX1BSSU1JVElWRS5lcXVhbHMoY2xhc3NUeXBlKSB8fCBET1VCTEVfUFJJTUlUSVZFX0VOQ09ESU5HLmVxdWFscyhjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICBwYXJhbUNsYXNzID0gZG91YmxlLmNsYXNzOwotICAgICAgICB9IGVsc2UgaWYgKFZPSURfUFJJTUlUSVZFLmVxdWFscyhjbGFzc1R5cGUpIHx8IFZPSURfUFJJTUlUSVZFX0VOQ09ESU5HLmVxdWFscyhjbGFzc1R5cGUpKSB7Ci0gICAgICAgICAgICBwYXJhbUNsYXNzID0gdm9pZC5jbGFzczsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1DbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbmNvZGluZyB1c2VkIHRvIHJlcHJlc2VudCBhIENsYXNzIGZvciBhbiBhcnJheSBvZiBhIHByaW1pdGl2ZSB0eXBlLiAgRm9yCi0gICAgICogZXhhbXBsZSwgYW4gYXJyYXkgb2YgYm9vbGVhbiBpcyByZXByZXNlbnRlZCBieSAiWiIuIFRoaXMgaXMgYXMgZGVzY3JpYmVkIGluIHRoZSBqYXZhZG9jIGZvcgotICAgICAqIENsYXNzLmdldE5hbWUoKS4gIElmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBwcmltaXRpdmUgdHlwZSwgYSBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCBhcnJheXMgb2Ygdm9pZHMgYXJlIG5vdCBhbGxvd2VkOyBhIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmltaXRpdmVUeXBlCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBTdHJpbmcgZ2V0UHJpbWl0aXZlVHlwZUFycmF5RW5jb2RpbmcoU3RyaW5nIHByaW1pdGl2ZVR5cGUpIHsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLQotICAgICAgICBpZiAoQk9PTEVBTl9QUklNSVRJVkUuZXF1YWxzKHByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEJPT0xFQU5fUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKEJZVEVfUFJJTUlUSVZFLmVxdWFscyhwcmltaXRpdmVUeXBlKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBCWVRFX1BSSU1JVElWRV9FTkNPRElORzsKLSAgICAgICAgfSBlbHNlIGlmIChDSEFSX1BSSU1JVElWRS5lcXVhbHMocHJpbWl0aXZlVHlwZSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gQ0hBUl9QUklNSVRJVkVfRU5DT0RJTkc7Ci0gICAgICAgIH0gZWxzZSBpZiAoRE9VQkxFX1BSSU1JVElWRS5lcXVhbHMocHJpbWl0aXZlVHlwZSkpIHsKLSAgICAgICAgICAgIGVuY29kaW5nID0gRE9VQkxFX1BSSU1JVElWRV9FTkNPRElORzsKLSAgICAgICAgfSBlbHNlIGlmIChGTE9BVF9QUklNSVRJVkUuZXF1YWxzKHByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IEZMT0FUX1BSSU1JVElWRV9FTkNPRElORzsKLSAgICAgICAgfSBlbHNlIGlmIChJTlRfUFJJTUlUSVZFLmVxdWFscyhwcmltaXRpdmVUeXBlKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBJTlRfUFJJTUlUSVZFX0VOQ09ESU5HOwotICAgICAgICB9IGVsc2UgaWYgKExPTkdfUFJJTUlUSVZFLmVxdWFscyhwcmltaXRpdmVUeXBlKSkgewotICAgICAgICAgICAgZW5jb2RpbmcgPSBMT05HX1BSSU1JVElWRV9FTkNPRElORzsKLSAgICAgICAgfSBlbHNlIGlmIChTSE9SVF9QUklNSVRJVkUuZXF1YWxzKHByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgICAgICAgICBlbmNvZGluZyA9IFNIT1JUX1BSSU1JVElWRV9FTkNPRElORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHBhcmFtZXRlciByZXByZXNlbnRzIGFuZCBhcnJheSwgdGhlbiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIGluIGEgZm9ybWF0IHRoYXQgYQotICAgICAqIENsYXNzLmZvck5hbWUoU3RyaW5nKSBjYW4gYmUgZG9uZSBvbiBpdC4gIFRoaXMgZm9ybWF0IGlzIGRlc2NyaWJlZCBieSBDbGFzcy5nZXROYW1lKCkuIElmIHRoZQotICAgICAqIHBhcmFtZXRlciBkb2VzIG5vdCByZXByZXNlbnQgYW4gYXJyYXksIHRoZSBwYXJlbWVtdGVyIGlzIHJldHVybmVkIHVubW9kaWZpZWQuCi0gICAgICogPHAvPgotICAgICAqIE5vdGUgdGhhdCBhcnJheXMgb2YgcHJpbWl0aXZlcyBhcmUgcHJvY2Vzc2VkIGFzIHdlbGwgYXMgYXJyYXlzIG9mIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NUb0xvYWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyByZXBhcnNlSWZBcnJheShTdHJpbmcgY2xhc3NUb0xvYWQpIHsKLQotICAgICAgICBTdHJpbmcgcmVwYXJzZWRDbGFzc05hbWUgPSBjbGFzc1RvTG9hZDsKLSAgICAgICAgaWYgKGlzQ2xhc3NBbkFycmF5KGNsYXNzVG9Mb2FkKSkgewotICAgICAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0gZ2V0QmFzZUFycmF5Q2xhc3NOYW1lKGNsYXNzVG9Mb2FkKTsKLSAgICAgICAgICAgIFN0cmluZyBkaW1lbnNpb25QcmVmaXggPSBnZXRBcnJheURpbWVuc2lvblByZWZpeChjbGFzc1RvTG9hZCk7Ci0gICAgICAgICAgICBpZiAoZ2V0UHJpbWl0aXZlVHlwZUFycmF5RW5jb2RpbmcoYmFzZVR5cGUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXBhcnNlZENsYXNzTmFtZSA9IGRpbWVuc2lvblByZWZpeCArIGdldFByaW1pdGl2ZVR5cGVBcnJheUVuY29kaW5nKGJhc2VUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVwYXJzZWRDbGFzc05hbWUgPSBkaW1lbnNpb25QcmVmaXggKyAiTCIgKyBiYXNlVHlwZSArICI7IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVwYXJzZWRDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCBhIGNsYXNzIHJlcHJlc2VudGVkIGluIGEgRGVzY3JpcHRpb24gQnVpbGRlciBDb21wb3NpdGUuICBJZiBhIGNsYXNzbG9hZGVyIGlzIHNwZWNpZmllZCwKLSAgICAgKiBpdCB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZSB0aGUgZGVmYXVsdCBjbGFzc2xvYWRlciBpcyB1c2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzVG9Mb2FkCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHN0YXRpYyBDbGFzcyBsb2FkQ2xhc3NGcm9tQ29tcG9zaXRlKFN0cmluZyBjbGFzc1RvTG9hZCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgQ2xhc3MgcmV0dXJuQ2xhc3MgPSBudWxsOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gYXJyYXksIHRoZW4gY3JlYXRlIGEgc3RyaW5nIHZlcnNpb24gYXMgZGVzY3JpYmVkIGJ5IENsYXNzLmdldE5hbWUuCi0gICAgICAgIC8vIEZvciBleGFtcGxlLCAiRm9vW11bXSIgYmVjb21lcyAiW1tMRm9vIi4gIE5vdGUgdGhhdCBhcnJheXMgb2YgcHJpbWl0aXZlcyBtdXN0IGFsc28gYmUgcGFyc2VkLgotICAgICAgICBjbGFzc1RvTG9hZCA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLnJlcGFyc2VJZkFycmF5KGNsYXNzVG9Mb2FkKTsKLQotICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVXNlIHRoZSBzcGVjaWZpZWQgY2xhc3Nsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3MuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybkNsYXNzID0gZm9yTmFtZShjbGFzc1RvTG9hZCwgZmFsc2UsIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2F0Y2ggVGhyb3dhYmxlIGFzIENsYXNzTG9hZGVyIGNhbiB0aHJvdyBhbiBOb0NsYXNzRGVmRm91bmRFcnJvciB0aGF0Ci0gICAgICAgICAgICAvL2RvZXMgbm90IGV4dGVuZCBFeGNlcHRpb24sIHNvIGxldHMgY2F0Y2ggZXZlcnl0aGluZyB0aGF0IGV4dGVuZHMgVGhyb3dhYmxlCi0gICAgICAgICAgICAvL3JhdGhlciB0aGFuIGp1c3QgRXhjZXB0aW9uLgotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJEQlVDbGFzc05vdEZvdW5kIiwgY2xhc3NUb0xvYWQsIGNsYXNzTG9hZGVyLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vVXNlIHRoZSB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgY2xhc3MuCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybkNsYXNzID0gZm9yTmFtZShjbGFzc1RvTG9hZCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dENsYXNzTG9hZGVyKG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLSAgICAgICAgICAgICAgICAvL1VzZSB0aGUgZGVmYXVsdCBjbGFzc2xvYWRlciB0byBsb2FkIHRoZSBjbGFzcy4KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5DbGFzcyA9IGZvck5hbWUoY2xhc3NUb0xvYWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0NhdGNoIFRocm93YWJsZSBhcyBDbGFzc0xvYWRlciBjYW4gdGhyb3cgYW4gTm9DbGFzc0RlZkZvdW5kRXJyb3IgdGhhdAotICAgICAgICAgICAgICAgIC8vZG9lcyBub3QgZXh0ZW5kIEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZXgyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiREJVQ2xhc3NOb3RGb3VuZDIiLCBjbGFzc1RvTG9hZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3M7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgIHJldHVybiAoc3RyaW5nID09IG51bGwgfHwgIiIuZXF1YWxzKHN0cmluZykpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHFuYW1lID09IG51bGwgfHwgaXNFbXB0eShxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIENsYXNzTG9hZGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIgOiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvRmF1bHRBY3Rpb25Bbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9GYXVsdEFjdGlvbkFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxM2JkMjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9GYXVsdEFjdGlvbkFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmF1bHRBY3Rpb25Bbm5vdCBpbXBsZW1lbnRzIEZhdWx0QWN0aW9uIHsKLSAgICAKLSAgICBwcml2YXRlIENsYXNzIGNsYXNzTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWVTdHJpbmc7Ci0KLSAgICBwcml2YXRlIEZhdWx0QWN0aW9uQW5ub3QoKSB7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRmF1bHRBY3Rpb25Bbm5vdChDbGFzcyBjbGFzc05hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEZhdWx0QWN0aW9uQW5ub3QgY3JlYXRlRmF1bHRBY3Rpb25Bbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmF1bHRBY3Rpb25Bbm5vdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEZhdWx0QWN0aW9uQW5ub3QgY3JlYXRlRmF1bHRBY3Rpb25Bbm5vdEltcGwoQ2xhc3MgY2xhc3NOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGYXVsdEFjdGlvbkFubm90KGNsYXNzTmFtZSwgdmFsdWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZVN0cmluZykgewotICAgICAgICB0aGlzLmNsYXNzTmFtZVN0cmluZyA9IGNsYXNzTmFtZVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoQ2xhc3MgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBjbGFzc05hbWVTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWVTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBGYXVsdEFjdGlvbi5jbGFzc05hbWU9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQEZhdWx0QWN0aW9uLnZhbHVlPSAiICsgdmFsdWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGFmMDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLQotcHVibGljIGNsYXNzIEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbGVtZW50cyBUTUZBbm5vdGF0aW9uQ29tcG9zaXRlIHsKLQotICAgIC8vTWV0aG9kIHJlZmxlY3RpdmUgaW5mb3JtYXRpb24KLSAgICBwcml2YXRlIFN0cmluZyBmaWVsZE5hbWU7ICAgICAgIC8vIGZpZWxkIG5hbWUKLSAgICBwcml2YXRlIFN0cmluZyBtb2RpZmllclR5cGU7ICAgIC8vIGZpZWxkIG1vZGlmaWVyCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmllbGRDbGFzc05hbWU7ICAvLyBmdWxseSBxdWFsaWZpZWQgZmllbGQgY2xhc3MgbmFtZQotCQotCS8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCB3YXMgYW5ub3RhdGVkIHdpdGggQFhtbExpc3Qgb3Igbm90Ci0JcHJpdmF0ZSBib29sZWFuIGlzTGlzdFR5cGUgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgSGFuZGxlckNoYWluQW5ub3QgaGFuZGxlckNoYWluQW5ub3Q7Ci0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlUmVmQW5ub3Qgd2ViU2VydmljZVJlZkFubm90OwotCi0gICAgLyoKLSAgICAgICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotICAgICAgKi8KLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlKAotICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBtb2RpZmllclR5cGUsCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5Bbm5vdCBoYW5kbGVyQ2hhaW5Bbm5vdCwKLSAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QKLSAgICApIHsKLSAgICAgICAgdGhpcy5maWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0gICAgICAgIHRoaXMubW9kaWZpZXJUeXBlID0gbW9kaWZpZXJUeXBlOwotICAgICAgICB0aGlzLmhhbmRsZXJDaGFpbkFubm90ID0gaGFuZGxlckNoYWluQW5ub3Q7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZVJlZkFubm90ID0gd2ViU2VydmljZVJlZkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZWxkTmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2hhaW5Bbm5vdC4gKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluQW5ub3QgZ2V0SGFuZGxlckNoYWluQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RpZmllclR5cGUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNb2RpZmllclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtb2RpZmllclR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZWxkQ2xhc3NOYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZENsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QuICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VSZWZBbm5vdCBnZXRXZWJTZXJ2aWNlUmVmQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIGZpZWxkTmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBmaWVsZE5hbWUpIHsKLSAgICAgICAgdGhpcy5maWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBoYW5kbGVyQ2hhaW5Bbm5vdCBUaGUgaGFuZGxlckNoYWluQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbkFubm90KEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluQW5ub3QgPSBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1vZGlmaWVyVHlwZSBUaGUgbW9kaWZpZXJUeXBlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllclR5cGUoU3RyaW5nIG1vZGlmaWVyVHlwZSkgewotICAgICAgICB0aGlzLm1vZGlmaWVyVHlwZSA9IG1vZGlmaWVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYlNlcnZpY2VSZWZBbm5vdCBUaGUgd2ViU2VydmljZVJlZkFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlUmVmQW5ub3QoV2ViU2VydmljZVJlZkFubm90IHdlYlNlcnZpY2VSZWZBbm5vdCkgewotICAgICAgICB0aGlzLndlYlNlcnZpY2VSZWZBbm5vdCA9IHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0xpc3RUeXBlKGJvb2xlYW4gaXNMaXN0VHlwZSkgewotCQl0aGlzLmlzTGlzdFR5cGUgPSBpc0xpc3RUeXBlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RUeXBlKCkgewotCQlyZXR1cm4gaXNMaXN0VHlwZTsKLQl9Ci0gICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkQ2xhc3NOYW1lKFN0cmluZyBmaWVsZENsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmZpZWxkQ2xhc3NOYW1lID0gZmllbGRDbGFzc05hbWU7Ci0gICAgfQotCQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKCIqKioqKiBCRUdJTiBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlICoqKioqIik7Ci0gICAgICAgIHNiLmFwcGVuZCgiRkRDLmZpZWxkTmFtZT0iICsgZmllbGROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBpZiAoaGFuZGxlckNoYWluQW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJcdCBASGFuZGxlckNoYWluIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlx0IiArIGhhbmRsZXJDaGFpbkFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlx0IEBXZWJTZXJ2aWNlUmVmIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlx0IiArIHdlYlNlcnZpY2VSZWZBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQoIioqKioqIEVORCBGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIik7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KLQkKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvSGFuZGxlckNoYWluQW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvSGFuZGxlckNoYWluQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjMjdkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0hhbmRsZXJDaGFpbkFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ2hhaW5Bbm5vdCBpbXBsZW1lbnRzIGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLQotICAgIC8qKiBBIFdlYlNlcnZpY2VBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgSGFuZGxlckNoYWluQW5ub3QoKSB7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5Bbm5vdChTdHJpbmcgZmlsZSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEhhbmRsZXJDaGFpbkFubm90IGNyZWF0ZUhhbmRsZXJDaGFpbkFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyQ2hhaW5Bbm5vdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEhhbmRsZXJDaGFpbkFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBIYW5kbGVyQ2hhaW5Bbm5vdCByZXR1cm5Bbm5vdCA9IG51bGw7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbiBpbnN0YW5jZW9mIGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4pIHsKLSAgICAgICAgICAgIGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW4gaGMgPSAoamF2YXguandzLkhhbmRsZXJDaGFpbikgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgIHJldHVybkFubm90ID0gbmV3IEhhbmRsZXJDaGFpbkFubm90KGhjLmZpbGUoKSwgaGMubmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuQW5ub3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmaWxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5maWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJASGFuZGxlckNoYWluLmZpbGU9ICIgKyBmaWxlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBIYW5kbGVyQ2hhaW4ubmFtZT0gIiArIG5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvSkFYV1NSSVdTRExHZW5lcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvSkFYV1NSSVdTRExHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0ZDk0MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL0pBWFdTUklXU0RMR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuU2NoZW1hU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLldTRExTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5pbXBsLk9BU0lTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5DYXRhbG9nVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5TY2hlbWFVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWEuWG1sU2NoZW1hQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGludGVyZmFjZSB0aGF0IGlzIGRlZmluZWQgYnkgdGhlCi0gKiBNRFEgY29kZS4gSXQgd2lsbCBiZSByZWdpc3RlcmVkIHdpdGhpbiB0aGUgTURRIGZyYW1ld29yaywgYW5kIHRoZQotICogTURRIGNvZGUgd2lsbCBjYWxsIHRoaXMgd2hlbiBpdCBmaW5kcyBhbiBhcHBsaWNhdGlvbiB0aGF0IHdhcwotICogZGVwbG95ZWQgd2l0aG91dCBXU0RMLiBUaGlzIGNsYXNzIHdpbGwgdXNlIHRoZSBXc0dlbiB0b29sIHRvCi0gKiBnZW5lcmF0ZSBhIFdTREwgRGVmaW5pdGlvbiBiYXNlZCBvbiB0aGUgSmF2YSBzb3VyY2UgZm9yIHRoZSBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEpBWFdTUklXU0RMR2VuZXJhdG9yIGltcGxlbWVudHMgU2NoZW1hU3VwcGxpZXIsIFdTRExTdXBwbGllciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coSkFYV1NSSVdTRExHZW5lcmF0b3IuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NQYXRoOwotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5pdCA9IGZhbHNlOwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFhtbFNjaGVtYT4gZG9jTWFwOwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIERlZmluaXRpb24+IHdzZGxEZWZNYXA7Ci0KLSAgICBwdWJsaWMgSkFYV1NSSVdTRExHZW5lcmF0b3IoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5heGlzU2VydmljZSA9IGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8gV3NHZW4gdG8gZ2VuZXJhdGUgYSBXU0RMIGZpbGUgZm9yCi0gICAgICogYXBwbGljYXRpb25zIGRlcGxveWVkIHdpdGhvdXQgV1NETC4gV2Ugd2lsbCB0aGVuIHJlYWQgdGhpcyBmaWxlIGluIGZyb20KLSAgICAgKiBkaXNrIGFuZCBjcmVhdGUgYSBEZWZpbml0aW9uLiBBZnRlciB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBmaWxlIHdlIHdpbGwKLSAgICAgKiByZW1vdmUgaXQgZnJvbSBkaXNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV3NkbChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgYmluZGluZ1R5cGUpIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICAJZ2VuZXJhdGVXc2RsKGNsYXNzTmFtZSwgYmluZGluZ1R5cGUsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBjYWxsIHRvIFdzR2VuIHRvIGdlbmVyYXRlIGEgV1NETCBmaWxlIGZvcgotICAgICAqIGFwcGxpY2F0aW9ucyBkZXBsb3llZCB3aXRob3V0IFdTREwuIFdlIHdpbGwgdGhlbiByZWFkIHRoaXMgZmlsZSBpbiBmcm9tCi0gICAgICogZGlzayBhbmQgY3JlYXRlIGEgRGVmaW5pdGlvbi4gQWZ0ZXIgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZmlsZSB3ZSB3aWxsCi0gICAgICogcmVtb3ZlIGl0IGZyb20gZGlzay4gIFRoaXMgbWV0aG9kIGFjY2VwdHMgYSBDYXRhbG9nTWFuYWdlciBhcyBhIHBhcmFtZXRlcgotICAgICAqIGZvciB0aGUgZXZlbnR1YWwgdXNlIGluIGJ5IGFuIFhNTFNjaGVtYUNvbGxlY3Rpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXc2RsKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBiaW5kaW5nVHlwZSwgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgdGhyb3dzCi0gICAgICAgICAgICBXZWJTZXJ2aWNlRXhjZXB0aW9uIHsKLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEZpbGUgdGVtcEZpbGUgPSAoRmlsZSkgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKTsKLSAgICAgICAgaWYgKHRlbXBGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRlbXBGaWxlID0gbmV3IEZpbGUoZ2V0UHJvcGVydHlfZG9Qcml2KCJqYXZhLmlvLnRtcGRpciIpLCAiX2F4aXMyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBQYXJhbWV0ZXIgc2VydmxldENvbmZpZ1BhcmFtID0gYXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuSFRUUF9TRVJWTEVUQ09ORklHKTsKLQotICAgICAgICBTdHJpbmcgd2ViQmFzZSA9IG51bGw7Ci0gICAgICAgIGlmIChzZXJ2bGV0Q29uZmlnUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHNlcnZsZXRDb25maWdQYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7Ci0gICAgCi0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2VydmxldENvbmZpZykgewotICAgICAgICAgICAgICAgIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IChTZXJ2bGV0Q29uZmlnKSBvYmo7Ci0gICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQgPSBzZXJ2bGV0Q29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgd2ViQmFzZSA9IHNlcnZsZXRDb250ZXh0LmdldFJlYWxQYXRoKCIvV0VCLUlORiIpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGNsYXNzUGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzUGF0aCA9IGdldERlZmF1bHRDbGFzc3BhdGgod2ViQmFzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkZvciBpbXBsZW1lbnRhdGlvbiBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIiBXc0dlbiBjbGFzc3BhdGg6ICIgKwotICAgICAgICAgICAgICAgICAgICBjbGFzc1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBsb2NhbE91dHB1dERpcmVjdG9yeSA9IHRlbXBGaWxlLmdldEFic29sdXRlUGF0aCgpICsgY2xhc3NOYW1lOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiT3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIFdTREwgZmlsZTogIiArIGxvY2FsT3V0cHV0RGlyZWN0b3J5KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGVycm9yT25SZWFkID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2VuZXJhdGluZyBuZXcgV1NETCBEZWZpbml0aW9uIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNyZWF0ZU91dHB1dERpcmVjdG9yeShsb2NhbE91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6ejsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJ5IHRoZSBvbmUgaW4gSkRLMTYKLSAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Muc3BpLldTVG9vbHNPYmplY3RGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCl7Ci0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIFJJCi0gICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLndzLnNwaS5XU1Rvb2xzT2JqZWN0RmFjdG9yeSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWV0aG9kIG0xID0gY2xhenouZ2V0TWV0aG9kKCJuZXdJbnN0YW5jZSIsIG5ldyBDbGFzc1tde30pOwotICAgICAgICAgICAgT2JqZWN0IGZhY3RvcnkgPSBtMS5pbnZva2UobmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgU3RyaW5nW10gYXJndW1lbnRzID0gZ2V0V3NHZW5Bcmd1bWVudHMoY2xhc3NOYW1lLCBiaW5kaW5nVHlwZSwgbG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgTWV0aG9kIG0yID0gY2xhenouZ2V0TWV0aG9kKCJ3c2dlbiIsIG5ldyBDbGFzc1tde091dHB1dFN0cmVhbS5jbGFzcywgU3RyaW5nW10uY2xhc3N9KTsKLSAgICAgICAgICAgIG0yLmludm9rZShmYWN0b3J5LCBvcywgYXJndW1lbnRzKTsKLSAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAgICAgICB3c2RsRGVmTWFwID0gcmVhZEluV1NETChsb2NhbE91dHB1dERpcmVjdG9yeSk7Ci0gICAgICAgICAgICBpZiAod3NkbERlZk1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBIFdTREwgRGVmaW5pdGlvbiBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgaW1wbGVtZW50YXRpb24gY2xhc3M6ICIgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG9jTWFwID0gcmVhZEluU2NoZW1hKGxvY2FsT3V0cHV0RGlyZWN0b3J5LCBjYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9jY3VycmVkIGdlbmVyYXRpbmcgV1NETCBmaWxlIGZvciBXZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyIgKyBjbGFzc05hbWUgKyAifTogeyIgKyB0ICsgIn0iOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgdCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbihtc2csIHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHNldCB1cCB0aGUgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBXc0dlbiB0b29sLgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0V3NHZW5Bcmd1bWVudHMoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGJpbmRpbmdUeXBlLCBTdHJpbmcgbG9jYWxPdXRwdXREaXJlY3RvcnkpIHRocm93cwotICAgICAgICAgICAgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1tdIGFyZ3VtZW50cyA9IG51bGw7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZSA9PSBudWxsIHx8IGJpbmRpbmdUeXBlLmVxdWFscygiIikgfHwgYmluZGluZ1R5cGUuZXF1YWxzKAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykgfHwgYmluZGluZ1R5cGUuZXF1YWxzKAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHZW5lcmF0aW5nIFdTREwgd2l0aCBTT0FQIDEuMSBiaW5kaW5nIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3VtZW50cyA9IG5ldyBTdHJpbmdbXXsiLWNwIiwgY2xhc3NQYXRoLCBjbGFzc05hbWUsICIta2VlcCIsICItd3NkbDpzb2FwMS4xIiwgIi1kIiwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxPdXRwdXREaXJlY3Rvcnl9OwotICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpIHx8IGJpbmRpbmdUeXBlLmVxdWFscygKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR2VuZXJhdGluZyBXU0RMIHdpdGggU09BUCAxLjIgYmluZGluZyB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmd1bWVudHMgPSBuZXcgU3RyaW5nW117Ii1jcCIsIGNsYXNzUGF0aCwgY2xhc3NOYW1lLCAiLWtlZXAiLCAiLWV4dGVuc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICItd3NkbDpYc29hcDEuMiIsICItZCIsIGxvY2FsT3V0cHV0RGlyZWN0b3J5fTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJUaGUgYmluZGluZyAiICsgYmluZGluZ1R5cGUgKyAiIHNwZWNpZmllZCBieSB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBjYW5ub3QgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIFdTREwuIFBsZWFzZSBjaG9vc2UgIiArCi0gICAgICAgICAgICAgICAgICAgICJhIHN1cHBvcnRlZCBiaW5kaW5nIHR5cGUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFyZ3VtZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgRGVmaW5pdGlvbiBiYXNlZCBvbiB0aGUKLSAgICAgKiBXU0RMIGZpbGUgZ2VuZXJhdGVkIGJ5IFdzR2VuLgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIERlZmluaXRpb24+IHJlYWRJbldTREwoU3RyaW5nIGxvY2FsT3V0cHV0RGlyZWN0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxGaWxlPiB3c2RsRmlsZXMgPSBnZXRXU0RMRmlsZXMobG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVmaW5pdGlvbj4gd3NkbERlZk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgZm9yIChGaWxlIHdzZGxGaWxlIDogd3NkbEZpbGVzKSB7Ci0gICAgICAgICAgICBpZiAod3NkbEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgV1NETFJlYWRlciB3c2RsUmVhZGVyID0gd3NkbEZhY3RvcnkubmV3V1NETFJlYWRlcigpOwotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHdzZGxGaWxlLnRvVVJMKCkub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGxvY2FsT3V0cHV0RGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZShpcykpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkod3NkbEZpbGUudG9VUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0IGJhc2UgZG9jdW1lbnQgVVJJIGZvciBnZW5lcmF0ZWQgV1NETDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2RsRmlsZS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb3VsZCBub3Qgc2V0IGJhc2UgZG9jdW1lbnQgVVJJIGZvciBnZW5lcmF0ZWQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV1NETDogIiArIHdzZGxGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmTWFwLnB1dCh3c2RsRmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSwgZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBEZWZpbml0aW9uIGZyb20gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCBXU0RMIGZpbGUgeyIgKyB3c2RsRmlsZS5nZXROYW1lKCkgKyAifTogeyIgKyBlICsgIn0iOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gY3JlYXRlIERlZmluaXRpb24gZnJvbSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkIFdTREwgZmlsZSAgeyIgKyB3c2RsRmlsZS5nZXROYW1lKCkgKyAifTogeyIgKyBlICsgIn0iOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbERlZk1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gbG9jYXRlIHRoZSBXU0RMIGZpbGUgdGhhdCB3YXMKLSAgICAgKiBnZW5lcmF0ZWQgYnkgV3NHZW4uIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBmaWxlIHdpdGggdGhlCi0gICAgICogIi53c2RsIiBleHRlbnNpb24gaW4gdGhpcyBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGdldFdTRExGaWxlcyhTdHJpbmcgbG9jYWxPdXRwdXREaXJlY3RvcnkpIHsKLSAgICAgICAgRmlsZSBjbGFzc0RpcmVjdG9yeSA9IG5ldyBGaWxlKGxvY2FsT3V0cHV0RGlyZWN0b3J5KTsKLSAgICAgICAgQXJyYXlMaXN0PEZpbGU+IHdzZGxGaWxlcyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLSAgICAgICAgaWYgKGNsYXNzRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IGNsYXNzRGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotICAgICAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aCgiLndzZGwiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9jYXRlZCBnZW5lcmF0ZWQgV1NETCBmaWxlOiAiICsgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxGaWxlcy5hZGQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBmaWxlIHdpbGwgY3JlYXRlIHRoZSBkaXJlY3Rvcnkgd2Ugd2lsbCB1c2UgYXMgdGhlIG91dHB1dAotICAgICAqIGRpcmVjdG9yeSBhcmd1bWVudCBpbiBvdXIgY2FsbCB0byBXc0dlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlT3V0cHV0RGlyZWN0b3J5KFN0cmluZyBsb2NhbE91dHB1dERpcmVjdG9yeSkgewotICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGxvY2FsT3V0cHV0RGlyZWN0b3J5KTsKLSAgICAgICAgaWYgKCFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgZGlyZWN0b3J5Lm1rZGlycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCByZWFkIGluIGFsbCBvZiB0aGUgc2NoZW1hIGZpbGVzIHRoYXQgd2VyZSBnZW5lcmF0ZWQKLSAgICAgKiBmb3IgYSBnaXZlbiBhcHBsaWNhdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBYbWxTY2hlbWE+IHJlYWRJblNjaGVtYShTdHJpbmcgbG9jYWxPdXRwdXREaXJlY3RvcnksIAotICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBYbWxTY2hlbWFDb2xsZWN0aW9uIHNjaGVtYUNvbGxlY3Rpb24gPSBuZXcgWG1sU2NoZW1hQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKGNhdGFsb2dNYW5hZ2VyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2NoZW1hQ29sbGVjdGlvbi5zZXRTY2hlbWFSZXNvbHZlcihuZXcgQ2F0YWxvZ1VSSVJlc29sdmVyKGNhdGFsb2dNYW5hZ2VyKSk7Ci0gICAgICAgICAgICBzY2hlbWFDb2xsZWN0aW9uLnNldEJhc2VVcmkobmV3IEZpbGUobG9jYWxPdXRwdXREaXJlY3RvcnkpLmdldEFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFhtbFNjaGVtYT4gZG9jTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBYbWxTY2hlbWE+KCk7Ci0gICAgICAgICAgICBMaXN0PEZpbGU+IHNjaGVtYUZpbGVzID0gZ2V0U2NoZW1hRmlsZXMobG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICAgICAgZm9yIChGaWxlIHNjaGVtYUZpbGUgOiBzY2hlbWFGaWxlcykgewotICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBkb2MgPSBzY2hlbWFDb2xsZWN0aW9uLnJlYWQobmV3IElucHV0U291cmNlKHNjaGVtYUZpbGUudG9VUkwoKS50b1N0cmluZygpKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVhZCBpbiBzY2hlbWEgZmlsZTogIiArIHNjaGVtYUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZG9jTWFwLnB1dChzY2hlbWFGaWxlLmdldE5hbWUoKSwgZG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkb2NNYXA7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9jY3VycmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gcmVhZCBnZW5lcmF0ZWQgc2NoZW1hIGZpbGUgeyIgKyBlICsgIn0iOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIGxpc3Qgb2YgZmlsZSBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGFsbCB0aGUKLSAgICAgKiBzY2hlbWEgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxGaWxlPiBnZXRTY2hlbWFGaWxlcyhTdHJpbmcgbG9jYWxPdXRwdXREaXJlY3RvcnkpIHsKLSAgICAgICAgQXJyYXlMaXN0PEZpbGU+IHNjaGVtYUZpbGVzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotICAgICAgICBGaWxlIGNsYXNzRGlyZWN0b3J5ID0gbmV3IEZpbGUobG9jYWxPdXRwdXREaXJlY3RvcnkpOwotICAgICAgICBpZiAoY2xhc3NEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gY2xhc3NEaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIueHNkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxvY2F0ZWQgZ2VuZXJhdGVkIHNjaGVtYSBmaWxlOiAiICsgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUZpbGVzLmFkZChmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNjaGVtYUZpbGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdTREwoQXhpc1NlcnZpY2Ugc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFBhcmFtZXRlciB3c2RsUGFyYW1ldGVyID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoV1NETENvbnN0YW50cy5XU0RMXzRfSl9ERUZJTklUSU9OKTsKLSAgICAgICAgaWYgKHdzZGxQYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gd3NkbFBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKERlZmluaXRpb24pIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluaXRpYWxpemUoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmTWFwLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZShBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MpLmdldFZhbHVlKCk7Ci0gICAgICAgIGlmICghaW5pdCkgewotICAgICAgICAgICAgZ2VuZXJhdGVXc2RsKGNsYXNzTmFtZSwgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLCBnZXRDYXRhbG9nTWFuYWdlcihzZXJ2aWNlKSk7Ci0gICAgICAgICAgICBpbml0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxTY2hlbWEgZ2V0U2NoZW1hKEF4aXNTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyB4c2QpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBQYXJhbWV0ZXIgd3NkbFBhcmFtZXRlciA9IHNlcnZpY2UuZ2V0UGFyYW1ldGVyKFdTRExDb25zdGFudHMuV1NETF80X0pfREVGSU5JVElPTik7Ci0gICAgICAgIGlmICh3c2RsUGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gc2VydmljZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoeHNkID09IG51bGwgfHwgeHNkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChYbWxTY2hlbWEpIGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hIHNjaGVtYSA9IChYbWxTY2hlbWEpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sU2NoZW1hW10gc2NoZW1hcyA9IFNjaGVtYVV0aWwuZ2V0QWxsU2NoZW1hcyhzY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzY2hlbWFzW2ldLmdldFNvdXJjZVVSSSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5lbmRzV2l0aCh4c2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjaGVtYXNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChYbWxTY2hlbWEpIGxpc3QuZ2V0KDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluaXRpYWxpemUoc2VydmljZSk7Ci0gICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBkb2NNYXAuZ2V0KHhzZCk7Ci0gICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkgewotICAgICAgICAgICAgZG9jTWFwLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY2hlbWE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhwYW5kIGEgZGlyZWN0b3J5IHBhdGggb3IgbGlzdCBvZiBkaXJlY3RvcnkgcGF0aHMgKEZpbGUucGF0aFNlcGFyYXRvcgotICAgICAqIGRlbGltaXRlZCkgaW50byBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvZiBhbGwgdGhlIGphciBmaWxlcyBpbiB0aG9zZQotICAgICAqIGRpcmVjdG9yaWVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpclBhdGhzIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IHBhdGggb3IgbGlzdCBvZgotICAgICAqICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgcGF0aHMuCi0gICAgICogQHJldHVybiBUaGUgZmlsZSBwYXRocyBvZiB0aGUgamFyIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gVGhpcyBpcyBhbgotICAgICAqICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGZpbGVzIHdlcmUgZm91bmQsIGFuZCBpcyB0ZXJtaW5hdGVkIGJ5IGFuCi0gICAgICogICAgICAgICBhZGRpdGlvbmFsIHBhdGhTZXBhcmF0b3IgaW4gYWxsIG90aGVyIGNhc2VzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cGFuZERpcnMoU3RyaW5nIGRpclBhdGhzKSB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGlyUGF0aHMsIEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBkID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKGQpOwotICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcyhuZXcgSmF2YUFyY2hpdmVGaWx0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZpbGVzW2ldKS5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoaXMgaW5wdXRzdHJlYW0gaXMgYSBqYXIvemlwCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXMKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgaW5wdXRzdHJlYW0gaXMgYSBqYXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXIoSW5wdXRTdHJlYW0gaXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEphcklucHV0U3RyZWFtIGppcyA9IG5ldyBKYXJJbnB1dFN0cmVhbShpcyk7Ci0gICAgICAgICAgICBpZiAoamlzLmdldE5leHRFbnRyeSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgQ2F0YWxvZ01hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIGFuIEF4aXNTZXJ2aWNlCi0gICAgICogQHJldHVybiB0aGUgQ2F0YWxvZ01hbmFnZXIgaW4gdXNlIGZvciB0aGlzIEF4aXNTZXJ2aWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKQVhXU0NhdGFsb2dNYW5hZ2VyIGdldENhdGFsb2dNYW5hZ2VyKEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAJUGFyYW1ldGVyIHBhcmFtID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoRW5kcG9pbnREZXNjcmlwdGlvbi5BWElTX1NFUlZJQ0VfUEFSQU1FVEVSKTsKLQotICAgIAlpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IChFbmRwb2ludERlc2NyaXB0aW9uKXBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZWQuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0Q2F0YWxvZ01hbmFnZXIoKTsKLSAgICAJfSBlbHNlCi0gICAgCSAgICByZXR1cm4gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBkZWZhdWx0IGNsYXNzcGF0aCBmcm9tIHZhcmlvdXMgdGhpbmdpZXMgaW4gdGhlIG1lc3NhZ2UgY29udGV4dAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAcmV0dXJuIGRlZmF1bHQgY2xhc3NwYXRoCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2xhc3NwYXRoKFN0cmluZyB3ZWJCYXNlKSB7Ci0gICAgICAgIEhhc2hTZXQgY2xhc3NwYXRoID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBmaWxsQ2xhc3NQYXRoKGNsLCBjbGFzc3BhdGgpOwotCi0gICAgICAgIC8vIEp1c3QgdG8gYmUgc2FmZSAodGhlIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZXR1cm4gdGhlIHdlYmFwcAotICAgICAgICAvLyBjbGFzc3BhdGggaW4gYWxsIGNhc2VzKSwgbWFudWFsbHkgZG8gdGhpczoKLSAgICAgICAgaWYgKHdlYkJhc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkUGF0aChjbGFzc3BhdGgsIHdlYkJhc2UgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiY2xhc3NlcyIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGliQmFzZSA9IHdlYkJhc2UgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAibGliIjsKLSAgICAgICAgICAgICAgICBGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGxpYkJhc2UpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGphckZpbGVzID0gbGliRGlyLmxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGphckZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJGaWxlID0gamFyRmlsZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqYXJGaWxlLmVuZHNXaXRoKCIuamFyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhdGgoY2xhc3NwYXRoLCBsaWJCYXNlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE9oIHdlbGwuICBObyBiaWcgZGVhbC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgVVJMIHNlcnZpY2VBcmNoaXZlID0gYXhpc1NlcnZpY2UuZ2V0RmlsZU5hbWUoKTsKLSAgICAgICAgaWYoc2VydmljZUFyY2hpdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGguYWRkKFV0aWxzLnRvRmlsZShzZXJ2aWNlQXJjaGl2ZSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGF4aXMuZXh0LmRpcnMgY2FuIGJlIHVzZWQgaW4gYW55IGFwcHNlcnZlcgotICAgICAgICBnZXRDbGFzc1BhdGhGcm9tRGlyZWN0b3J5UHJvcGVydHkoY2xhc3NwYXRoLCAiYXhpcy5leHQuZGlycyIpOwotCi0gICAgICAgIC8vIGNsYXNzcGF0aCB1c2VkIGJ5IEphc3BlciAKLSAgICAgICAgZ2V0Q2xhc3NQYXRoRnJvbVByb3BlcnR5KGNsYXNzcGF0aCwgIm9yZy5hcGFjaGUuY2F0YWxpbmEuanNwX2NsYXNzcGF0aCIpOwotCi0gICAgICAgIC8vIHdlYnNwaGVyZSBzdHVmZi4KLSAgICAgICAgZ2V0Q2xhc3NQYXRoRnJvbVByb3BlcnR5KGNsYXNzcGF0aCwgIndzLmV4dC5kaXJzIik7Ci0gICAgICAgIGdldENsYXNzUGF0aEZyb21Qcm9wZXJ0eShjbGFzc3BhdGgsICJjb20uaWJtLndlYnNwaGVyZS5zZXJ2bGV0LmFwcGxpY2F0aW9uLmNsYXNzcGF0aCIpOwotCi0gICAgICAgIC8vIGphdmEgY2xhc3MgcGF0aAotICAgICAgICBnZXRDbGFzc1BhdGhGcm9tUHJvcGVydHkoY2xhc3NwYXRoLCAiamF2YS5jbGFzcy5wYXRoIik7Ci0KLSAgICAgICAgLy8gTG9hZCBqYXJzIGZyb20gamF2YSBleHRlcm5hbCBkaXJlY3RvcnkKLSAgICAgICAgZ2V0Q2xhc3NQYXRoRnJvbURpcmVjdG9yeVByb3BlcnR5KGNsYXNzcGF0aCwgImphdmEuZXh0LmRpcnMiKTsKLQotICAgICAgICAvLyBib290IGNsYXNzcGF0aCBpc24ndCBmb3VuZCBpbiBhYm92ZSBzZWFyY2gKLSAgICAgICAgZ2V0Q2xhc3NQYXRoRnJvbVByb3BlcnR5KGNsYXNzcGF0aCwgInN1bi5ib290LmNsYXNzLnBhdGgiKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3NwYXRoLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgcGF0aC5hcHBlbmQocyk7Ci0gICAgICAgICAgICBwYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgfQotICAgICAgICBsb2cuZGVidWcocGF0aCk7Ci0gICAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQYXRoKEhhc2hTZXQgY2xhc3NwYXRoLCBTdHJpbmcgcykgewotICAgICAgICBTdHJpbmcgcGF0aCA9IHMucmVwbGFjZSgoKEZpbGUuc2VwYXJhdG9yQ2hhciA9PSAnLycpID8gJ1xcJyA6ICcvJyksIEZpbGUuc2VwYXJhdG9yQ2hhcikudHJpbSgpOwotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgaWYgKGZpbGVFeGlzdHMoZmlsZSkpIHsKLSAgICAgICAgICAgIHBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgY2xhc3NwYXRoLmFkZChwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhbGwgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgdG8gdGhlIGNsYXNzcGF0aAotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0Q2xhc3NQYXRoRnJvbURpcmVjdG9yeVByb3BlcnR5KEhhc2hTZXQgY2xhc3NwYXRoLCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgU3RyaW5nIGRpcnMgPSBnZXRQcm9wZXJ0eV9kb1ByaXYocHJvcGVydHkpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXRoID0gZXhwYW5kRGlycyhkaXJzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIE9oIHdlbGwuICBObyBiaWcgZGVhbC4KLSAgICAgICAgfQotICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRQYXRoKGNsYXNzcGF0aCwgcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlfZG9Qcml2KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICByZXR1cm4gKFN0cmluZykKLSAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLQotICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkIGEgY2xhc3NwYXRoIHN0b3JlZCBpbiBhIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0Q2xhc3NQYXRoRnJvbVByb3BlcnR5KEhhc2hTZXQgY2xhc3NwYXRoLCBTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRQcm9wZXJ0eV9kb1ByaXYocHJvcGVydHkpOwotICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRQYXRoKGNsYXNzcGF0aCwgcGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWxrIHRoZSBjbGFzc2xvYWRlciBoaWVyYXJjaHkgYW5kIGFkZCB0byB0aGUgY2xhc3NwYXRoCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2wKLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsQ2xhc3NQYXRoKENsYXNzTG9hZGVyIGNsLCBIYXNoU2V0IGNsYXNzcGF0aCkgewotICAgICAgICB3aGlsZSAoY2wgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpIHsKLSAgICAgICAgICAgICAgICBVUkxbXSB1cmxzID0gKChVUkxDbGFzc0xvYWRlcikgY2wpLmdldFVSTHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgKHVybHMgIT0gbnVsbCkgJiYgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB1cmxzW2ldLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgLy9JZiBpdCBpcyBhIGRyaXZlIGxldHRlciwgYWRqdXN0IGFjY29yZGluZ2x5LgotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+PSAzICYmIHBhdGguY2hhckF0KDApID09ICcvJyAmJiBwYXRoLmNoYXJBdCgyKSA9PSAnOicpCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFBhdGgoY2xhc3NwYXRoLCBVUkxEZWNvZGVyLmRlY29kZShwYXRoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXRzIGEgamFyIGV4dHJhY3QgQ2xhc3MtUGF0aCBlbnRyaWVzIGZyb20gbWFuaWZlc3QKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsc1tpXS5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSmFyKGZpcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBqYXIuZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZSA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXRoKGNsYXNzcGF0aCwgYmFzZSArIEZpbGUuc2VwYXJhdG9yQ2hhciArIHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsID0gY2wuZ2V0UGFyZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaWx0ZXIgZm9yIHppcC9qYXIKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhQXJjaGl2ZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVGaWx0ZXIgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gKG5hbWUuZW5kc1dpdGgoIi5qYXIiKSB8fCBuYW1lLmVuZHNXaXRoKCIuemlwIikpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBwcml2YXRlIEJvb2xlYW4gZmlsZUV4aXN0cyAoZmluYWwgRmlsZSBmaWxlKSB7Ci0gICAgICAgIEJvb2xlYW4gZXhpc3RzID0gKEJvb2xlYW4pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihmaWxlLmV4aXN0cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIGV4aXN0czsKLSAgICB9Ci0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NRFFDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvTURRQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWY1NmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NRFFDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBNRFFDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TRVJWSUNFX1FOQU1FID0gIldTRExfU0VSVklDRV9RTkFNRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9QT1JUID0gIldTRExfUE9SVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9ERUZJTklUSU9OID0gV1NETENvbnN0YW50cy5XU0RMXzRfSl9ERUZJTklUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT04gPSAiV1NETF9MT0NBVElPTiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9DTEFTUyA9ICJTZXJ2aWNlQ2xhc3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfUE9SVFRZUEVfTkFNRSA9ICJXU0RMX1BPUlRUWVBFX05BTUUiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0NMQVNTX05BTUUgPSAiamF2YS5sYW5nLk9iamVjdCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9TT1VSQ0UgPQotICAgICAgICAgICAgImphdmF4LnhtbC53cy5Qcm92aWRlcjxqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZT4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX1NPQVAgPSAiamF2YXgueG1sLndzLlByb3ZpZGVyPGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlPiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfREFUQVNPVVJDRSA9Ci0gICAgICAgICAgICAiamF2YXgueG1sLndzLlByb3ZpZGVyPGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZT4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX1NUUklORyA9ICJqYXZheC54bWwud3MuUHJvdmlkZXI8amF2YS5sYW5nLlN0cmluZz4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX09NRUxFTUVOVCA9ICJqYXZheC54bWwud3MuUHJvdmlkZXI8b3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ+IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9OQU1FID0gIldTRExfRklMRV9OQU1FIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRE9DUyA9ICJTQ0hFTUFfRE9DUyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9DT01QT1NJVEUgPSAiV1NETF9DT01QT1NJVEUiOwotCi0gICAgLy8gSmF2YSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgY2xhc3MgY29uc3RydWN0b3IKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVFJVQ1RPUl9NRVRIT0QgPSAiPGluaXQ+IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9UWVBFX0ZVVFVSRSA9ICJqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9UWVBFX1JFU1BPTlNFID0gImphdmF4LnhtbC53cy5SZXNwb25zZSI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1NFUlZJQ0VfQ0xBU1MgPSAiQ0xJRU5UX1NFUlZJQ0VfQ0xBU1MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9TRUlfQ0xBU1MgPSAiQ0xJRU5UX1NFSV9DTEFTUyI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9DSEFJTl9ERUNMQVJJTkdfQ0xBU1MgPSAiSEFORExFUl9DSEFJTl9ERUNMQVJJTkdfQ0xBU1MiOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFSV9NVE9NX0VOQUJMRU1FTlRfTUFQID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5TRUlfTVRPTV9FTkFCTEVNRU5UX01BUCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19QUk9QU19NQVAgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkJJTkRJTkdfUFJPUFNfTUFQIjsgICAgCi0gICAgCi0gICAgLy9SZXByZXNlbnQgU09BUC9KTVMgQmluZGluZ3MKLSAgICAvL1JFVklFVzogU09BUC1KTVMgbWF5IGJlIHVzaW5nIHRoZSBzYW1lIE5TIGZvciBTT0FQMTEgYW5kIFNPQVAxMiwgCi0gICAgLy8gIGlmIHNvIHdlIGNvdWxkIHJlbW92ZSBzb21lIGR1cGxpY2F0ZSB2YWx1ZXMgYmVsb3cKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFKTVNfQklORElORyA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnLzIwMDYvMDYvc29hcC9iaW5kaW5ncy9KTVMvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTJKTVNfQklORElORyA9ICJodHRwOi8vd3d3LmV4YW1wbGUub3JnLzIwMDYvMDYvc29hcC9iaW5kaW5ncy9KTVMvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQMTFKTVNfTVRPTV9CSU5ESU5HID0gImh0dHA6Ly9odHRwOi8vd3d3LmV4YW1wbGUub3JnLzIwMDYvMDYvc29hcC9iaW5kaW5ncy9KTVMvP210b209dHJ1ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUDEySk1TX01UT01fQklORElORyA9ICJodHRwOi8vaHR0cDovL3d3dy5leGFtcGxlLm9yZy8yMDA2LzA2L3NvYXAvYmluZGluZ3MvSk1TLz9tdG9tPXRydWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfSFRUUF9CSU5ESU5HID0iU09BUF9IVFRQX0JJTkRJTkciOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NVE9NQW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvTVRPTUFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODM1NGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9NVE9NQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgTVRPTUFubm90IGltcGxlbWVudHMgTVRPTSB7DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsNCi0gICAgcHJpdmF0ZSBpbnQgdGhyZXNob2xkOw0KLSAgICANCi0gICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCgpIHsNCi0gICAgICAgIHJldHVybiBlbmFibGVkOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZSkgew0KLSAgICAgICAgZW5hYmxlZCA9IGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCB0aHJlc2hvbGQoKSB7DQotICAgICAgICByZXR1cm4gdGhyZXNob2xkOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJlc2hvbGQoaW50IGkpIHsNCi0gICAgICAgIHRocmVzaG9sZCA9IGk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBNVE9NLmNsYXNzOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0M2NlMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL01ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxlbWVudHMgVE1Bbm5vdGF0aW9uQ29tcG9zaXRlLCBUTUZBbm5vdGF0aW9uQ29tcG9zaXRlIHsKLQotICAgIC8vTWV0aG9kIHJlZmxlY3RpdmUgaW5mb3JtYXRpb24KLSAgICBwcml2YXRlIFN0cmluZyBtZXRob2ROYW1lOyAgICAvL2EgcHVibGljIG1ldGhvZCBuYW1lIGluIHRoaXMgY2xhc3MKLSAgICBwcml2YXRlIFN0cmluZyByZXR1cm5UeXBlOyAgICAvL01ldGhvZHMgcmV0dXJuIHR5cGUKLSAgICBwcml2YXRlIFN0cmluZ1tdIGV4Y2VwdGlvbnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVjbGFyaW5nQ2xhc3M7IC8vdGhlIGNsYXNzL2ludGVyZmFjZSB0aGF0IGFjdHVhbGx5IGRlY2xhcmVzIHRoaXMgbWV0aG9kCi0KLSAgICBib29sZWFuIG9uZVdheUFubm90YXRlZDsKLQkvLyBib29sZWFuIHRoYXQgaW5kaWNhdGVzIGlmIGFuIEBYbWxMaXN0IGFubm90YXRpb24gd2FzIGZvdW5kIG9uIHRoZSBtZXRob2QKLQlwcml2YXRlIGJvb2xlYW4gCQkJCWlzTGlzdFR5cGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIFdlYk1ldGhvZEFubm90IHdlYk1ldGhvZEFubm90OwotICAgIHByaXZhdGUgV2ViUmVzdWx0QW5ub3Qgd2ViUmVzdWx0QW5ub3Q7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5Bbm5vdCBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICBwcml2YXRlIFNvYXBCaW5kaW5nQW5ub3Qgc29hcEJpbmRpbmdBbm5vdDsKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgcHJpdmF0ZSBXZWJFbmRwb2ludEFubm90IHdlYkVuZHBvaW50QW5ub3Q7Ci0gICAgcHJpdmF0ZSBSZXF1ZXN0V3JhcHBlckFubm90IHJlcXVlc3RXcmFwcGVyQW5ub3Q7IC8vVE9ETyBFRElUIENIRUNLOiBvbmx5IG9uIG1ldGhvZHMgb2YgU0VJCi0gICAgcHJpdmF0ZSBSZXNwb25zZVdyYXBwZXJBbm5vdCByZXNwb25zZVdyYXBwZXJBbm5vdDsvL1RPRE8gRURJVCBDSEVDSzogb25seSBvbiBtZXRob2RzIG9mIFNFSQotICAgIHByaXZhdGUgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGFyYW1ldGVyRGVzY3JpcHRpb25zOy8vVE9ETyBFRElUIENIRUNLOiBvbmx5IG9uIG1ldGhvZHMgb2YgU0VJCi0KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBwYXJlbnREQkM7Ci0gICAgCi0gICAgcHJpdmF0ZSBBY3Rpb25Bbm5vdCBhY3Rpb25Bbm5vdDsKLQotICAgIC8qCi0gICAgICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICAgICovCi0gICAgcHVibGljIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCkgewotICAgICAgICBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lLAotICAgICAgICAgICAgU3RyaW5nIHJldHVyblR5cGUsCi0gICAgICAgICAgICBXZWJNZXRob2RBbm5vdCB3ZWJNZXRob2RBbm5vdCwKLSAgICAgICAgICAgIFdlYlJlc3VsdEFubm90IHdlYlJlc3VsdEFubm90LAotICAgICAgICAgICAgYm9vbGVhbiBvbmVXYXlBbm5vdGF0ZWQsCi0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5Bbm5vdCBoYW5kbGVyQ2hhaW5Bbm5vdCwKLSAgICAgICAgICAgIFNvYXBCaW5kaW5nQW5ub3Qgc29hcEJpbmRpbmdBbm5vdCwKLSAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QsCi0gICAgICAgICAgICBXZWJFbmRwb2ludEFubm90IHdlYkVuZHBvaW50QW5ub3QsCi0gICAgICAgICAgICBSZXF1ZXN0V3JhcHBlckFubm90IHJlcXVlc3RXcmFwcGVyQW5ub3QsCi0gICAgICAgICAgICBSZXNwb25zZVdyYXBwZXJBbm5vdCByZXNwb25zZVdyYXBwZXJBbm5vdAotICAgICkgewotCi0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgICAgIHRoaXMucmV0dXJuVHlwZSA9IHJldHVyblR5cGU7Ci0gICAgICAgIHRoaXMud2ViTWV0aG9kQW5ub3QgPSB3ZWJNZXRob2RBbm5vdDsKLSAgICAgICAgdGhpcy53ZWJSZXN1bHRBbm5vdCA9IHdlYlJlc3VsdEFubm90OwotICAgICAgICB0aGlzLm9uZVdheUFubm90YXRlZCA9IG9uZVdheUFubm90YXRlZDsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ2hhaW5Bbm5vdCA9IGhhbmRsZXJDaGFpbkFubm90OwotICAgICAgICB0aGlzLnNvYXBCaW5kaW5nQW5ub3QgPSBzb2FwQmluZGluZ0Fubm90OwotICAgICAgICB0aGlzLndlYlNlcnZpY2VSZWZBbm5vdCA9IHdlYlNlcnZpY2VSZWZBbm5vdDsKLSAgICAgICAgdGhpcy53ZWJFbmRwb2ludEFubm90ID0gd2ViRW5kcG9pbnRBbm5vdDsKLSAgICAgICAgdGhpcy5yZXF1ZXN0V3JhcHBlckFubm90ID0gcmVxdWVzdFdyYXBwZXJBbm5vdDsKLSAgICAgICAgdGhpcy5yZXNwb25zZVdyYXBwZXJBbm5vdCA9IHJlc3BvbnNlV3JhcHBlckFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG1ldGhvZE5hbWUgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2ROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFN0cmluZyBkZXNjcmJpbmcgdGhpcyBtZXRob2QgcmVzdWx0IHR5cGUuICBOb3RlIHRoYXQgdGhpcyBzdHJpbmcgaXMgdW5wYXJzZWQuICBGb3IKLSAgICAgKiBleGFtcGxlLCBpZiBpdCByZXByZXNlbnRzIGEgamF2YS51dGlsLkxpc3Q8bXkucGFja2FnZS5Gb28+LCB0aGVuIHRoYXQgZXhjYWN0IHN0cmluZyB3aWxsIGJlCi0gICAgICogcmV0dXJuZWQsIGkuZS4gImphdmEudXRpbC5MaXN0PG15LnBhY2thZ2UuRm9vPiIuICBZb3UgY2FuIHVzZSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0IHRvCi0gICAgICogcmV0cmlldmUgcGFyc2VkIHZhbHVlcyBmb3IgR2VuZXJpY3MgYW5kIEhvbGRlcnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJldHVyblR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5UeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0aG9kIHJlc3VsdCB0eXBlLiAgTm90ZSB0aGF0IGlmIHRoZSByZXN0dXJuIHR5cGUgYQotICAgICAqIGdlbmVyaWMgKHN1Y2ggYXMgamF2YS51dGlsLkxpc3Q8bXkucGFja2FnZS5Gb28+KSB0aGVuIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJhdyB0eXBlIGlzCi0gICAgICogcmV0dXJuZWQgKGkuZS4gamF2YS51dGlsLkxpc3QpLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGVyZSBhcmUgb3RoZXIgbWV0aG9kcyB0aGF0IHJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBhY3R1YWwgdHlwZSBmb3IgY2VydGFpbiBKQVgtV1Mgc3BlY2lmaWMKLSAgICAgKiBnZW5lcmljcyBzdWNoIGFzIFJlc3BvbnNlPFQ+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtZXRlclR5cGVDbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UmV0dXJuVHlwZUNsYXNzKCkgewotICAgICAgICBDbGFzcyByZXR1cm5UeXBlQ2xhc3MgPSBudWxsOwotICAgICAgICBTdHJpbmcgZnVsbFJldHVyblR5cGUgPSBnZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmIChmdWxsUmV0dXJuVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm5UeXBlQ2xhc3MgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRQcmltaXRpdmVDbGFzcyhmdWxsUmV0dXJuVHlwZSk7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgR2VuZXJpYywgd2UgbmVlZCB0byBsb2FkIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJhdyBUeXBlLCAKLSAgICAgICAgICAgICAgICAvLyBpLmUuIGZvciBMaXN0PEZvbz4sIHdlIHdhbnQgdG8gbG9hZCBMaXN0LiBPdGh3ZXJpc2UsIGxvYWQgdGhlIHR5cGUgZGlyZWN0bHkuIAotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc1RvTG9hZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUoZnVsbFJldHVyblR5cGUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NUb0xvYWQgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKGZ1bGxSZXR1cm5UeXBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjbGFzc1RvTG9hZCA9IGZ1bGxSZXR1cm5UeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm5UeXBlQ2xhc3MgPSBsb2FkQ2xhc3NGcm9tTURDKGNsYXNzVG9Mb2FkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5UeXBlQ2xhc3M7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3NGcm9tTURDKFN0cmluZyBjbGFzc1RvTG9hZCkgewotICAgICAgICBDbGFzcyByZXR1cm5DbGFzcyA9IG51bGw7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKLQotICAgICAgICBpZiAoZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlUmVmKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVSZWYoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybkNsYXNzID0gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMubG9hZENsYXNzRnJvbUNvbXBvc2l0ZShjbGFzc1RvTG9hZCwgY2xhc3NMb2FkZXIpOwotICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gcmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgT25lV2F5ICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNPbmVXYXkoKSB7Ci0gICAgICAgIHJldHVybiBvbmVXYXlBbm5vdGF0ZWQ7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViRW5kcG9pbnRBbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViRW5kcG9pbnRBbm5vdCBnZXRXZWJFbmRwb2ludEFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViRW5kcG9pbnRBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSByZXF1ZXN0V3JhcHBlckFubm90LiAqLwotICAgIHB1YmxpYyBSZXF1ZXN0V3JhcHBlckFubm90IGdldFJlcXVlc3RXcmFwcGVyQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlckFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlc3BvbnNlV3JhcHBlckFubm90LiAqLwotICAgIHB1YmxpYyBSZXNwb25zZVdyYXBwZXJBbm5vdCBnZXRSZXNwb25zZVdyYXBwZXJBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlV3JhcHBlckFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJDaGFpbkFubm90LiAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5Bbm5vdCBnZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHNvYXBCaW5kaW5nQW5ub3QuICovCi0gICAgcHVibGljIFNvYXBCaW5kaW5nQW5ub3QgZ2V0U29hcEJpbmRpbmdBbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViTWV0aG9kQW5ub3QuICovCi0gICAgcHVibGljIFdlYk1ldGhvZEFubm90IGdldFdlYk1ldGhvZEFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViTWV0aG9kQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViUmVzdWx0QW5ub3QuICovCi0gICAgcHVibGljIFdlYlJlc3VsdEFubm90IGdldFdlYlJlc3VsdEFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViUmVzdWx0QW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZVJlZkFubm90LiAqLwotICAgIHB1YmxpYyBXZWJTZXJ2aWNlUmVmQW5ub3QgZ2V0V2ViU2VydmljZVJlZkFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViU2VydmljZVJlZkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGFjdGlvbkFubm90LiAqLwotICAgIHB1YmxpYyBBY3Rpb25Bbm5vdCBnZXRBY3Rpb25Bbm5vdCgpIHsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2VwdGlvbnMuICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2VwdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb25zOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2VwdGlvbnMuICovCi0gICAgcHVibGljIENsYXNzW10gZ2V0RXhjZXB0aW9uVHlwZXMoKSB7Ci0gICAgICAgIC8vVE9ETzogSW1wbGVtZW50IHRoaXMuLi4KLSAgICAgICAgLy9mb3IgZWFjaCBleGNlcHRpb24gaW4gdGhlIGFycmF5LCBjb252ZXJ0IGl0IHRvIGEgY2xhc3MsIGFuZCByZXR1cm4gdGhhdAotICAgICAgICAvL0lmIGEgY2xhc3Nsb2FkZXIgd2FzIG5vdCBzZXQsIHRoZW4ganVzdCB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzWzBdOwotICAgICAgICByZXR1cm4gY2xhc3NlczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZGVjbGFyaW5nIGNsYXNzLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0gICAgICAgIGlmIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsICYmIHBhcmVudERCQyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyZW50REJDLmdldENsYXNzTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWNsYXJpbmdDbGFzczsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBNb2R1bGVDbGFzc1R5cGUuICovCi0gICAgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVSZWYoKSB7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50REJDOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbWV0aG9kTmFtZSBUaGUgbWV0aG9kTmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICB0aGlzLm1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcmV0dXJuVHlwZSBUaGUgcmV0dXJuVHlwZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShTdHJpbmcgcmV0dXJuVHlwZSkgewotICAgICAgICB0aGlzLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gb25lV2F5QW5ub3RhdGVkIFRoZSBvbmVXYXkgYm9vbGVhbiB0byBzZXQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbmVXYXlBbm5vdChib29sZWFuIG9uZVdheUFubm90YXRlZCkgewotICAgICAgICB0aGlzLm9uZVdheUFubm90YXRlZCA9IG9uZVdheUFubm90YXRlZDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYkVuZHBvaW50QW5ub3RJbXBsIFRoZSB3ZWJFbmRwb2ludEFubm90SW1wbCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViRW5kcG9pbnRBbm5vdChXZWJFbmRwb2ludEFubm90IHdlYkVuZHBvaW50QW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJFbmRwb2ludEFubm90ID0gd2ViRW5kcG9pbnRBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHJlcXVlc3RXcmFwcGVyQW5ub3QgVGhlIHJlcXVlc3RXcmFwcGVyQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RXcmFwcGVyQW5ub3QoCi0gICAgICAgICAgICBSZXF1ZXN0V3JhcHBlckFubm90IHJlcXVlc3RXcmFwcGVyQW5ub3QpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0V3JhcHBlckFubm90ID0gcmVxdWVzdFdyYXBwZXJBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHJlc3BvbnNlV3JhcHBlckFubm90IFRoZSByZXNwb25zZVdyYXBwZXJBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VXcmFwcGVyQW5ub3QoCi0gICAgICAgICAgICBSZXNwb25zZVdyYXBwZXJBbm5vdCByZXNwb25zZVdyYXBwZXJBbm5vdCkgewotICAgICAgICB0aGlzLnJlc3BvbnNlV3JhcHBlckFubm90ID0gcmVzcG9uc2VXcmFwcGVyQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBoYW5kbGVyQ2hhaW5Bbm5vdCBUaGUgaGFuZGxlckNoYWluQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbkFubm90KEhhbmRsZXJDaGFpbkFubm90IGhhbmRsZXJDaGFpbkFubm90KSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluQW5ub3QgPSBoYW5kbGVyQ2hhaW5Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHNvYXBCaW5kaW5nQW5ub3QgVGhlIHNvYXBCaW5kaW5nQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nQW5ub3QoU29hcEJpbmRpbmdBbm5vdCBzb2FwQmluZGluZ0Fubm90KSB7Ci0gICAgICAgIHRoaXMuc29hcEJpbmRpbmdBbm5vdCA9IHNvYXBCaW5kaW5nQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJNZXRob2RBbm5vdCBUaGUgd2ViTWV0aG9kQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYk1ldGhvZEFubm90KFdlYk1ldGhvZEFubm90IHdlYk1ldGhvZEFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViTWV0aG9kQW5ub3QgPSB3ZWJNZXRob2RBbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdlYlJlc3VsdEFubm90IFRoZSB3ZWJSZXN1bHRBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V2ViUmVzdWx0QW5ub3QoV2ViUmVzdWx0QW5ub3Qgd2ViUmVzdWx0QW5ub3QpIHsKLSAgICAgICAgdGhpcy53ZWJSZXN1bHRBbm5vdCA9IHdlYlJlc3VsdEFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZVJlZkFubm90IFRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSZWZBbm5vdChXZWJTZXJ2aWNlUmVmQW5ub3Qgd2ViU2VydmljZVJlZkFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZVJlZkFubm90ID0gd2ViU2VydmljZVJlZkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gYWN0aW9uQW5ub3QgVGhlIGFjdGlvbkFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb25Bbm5vdChBY3Rpb25Bbm5vdCBhY3Rpb25Bbm5vdCkgewotICAgICAgICB0aGlzLmFjdGlvbkFubm90ID0gYWN0aW9uQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwYXJhbWV0ZXJEZXNjcmlwdGlvbiBUaGUgcGFyYW1ldGVyRGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoZSBzZXQuICovCi0gICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoCi0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwYXJhbWV0ZXJEZXNjcmlwdGlvbikgewotICAgICAgICBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuYWRkKHBhcmFtZXRlckRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyRGVzY3JpcHRpb24gVGhlIHBhcmFtZXRlckRlc2NyaXB0aW9uIHRvIGFkZCB0byB0aGUgc2V0LgotICAgICAqIEBwYXJhbSBpbmRleCAgICAgICAgICAgICAgICBUaGUgaW5kZXggYXQgd2hpY2ggdG8gcGxhY2UgdGhpcyBwYXJhbWV0ZXJEZXNjcmlwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBhcmFtZXRlckRlc2NyaXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewotICAgICAgICBwYXJhbWV0ZXJEZXNjcmlwdGlvbi5zZXRMaXN0T3JkZXIoaW5kZXgpOwotICAgICAgICBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuYWRkKGluZGV4LCBwYXJhbWV0ZXJEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwYXJhbWV0ZXJEZXNjcmlwdGlvbiBUaGUgcGFyYW1ldGVyRGVzY3JpcHRpb24gdG8gYWRkIHRvIHRoZSBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KAotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGFyYW1ldGVyRGVzY3JpcHRpb25MaXN0KSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyRGVzY3JpcHRpb25zID0gcGFyYW1ldGVyRGVzY3JpcHRpb25MaXN0OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcGFyYW1ldGVyRGVzY3JpcHRpb24gVGhlIHBhcmFtZXRlckRlc2NyaXB0aW9uIHRvIGFkZCB0byB0aGUgc2V0LiAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0aW9ucy5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBleGNlcHRpb25zIFRoZSBleGNlcHRpb25zIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNlcHRpb25zKFN0cmluZ1tdIGV4Y2VwdGlvbnMpIHsKLSAgICAgICAgdGhpcy5leGNlcHRpb25zID0gZXhjZXB0aW9uczsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGRlY2xhcmluZ0NsYXNzIFRoZSB3cmFwcGVyIGNsYXNzIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWNsYXJpbmdDbGFzcyhTdHJpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIE1vZHVsZUNsYXNzVHlwZS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVSZWYoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotCi0gICAgICAgIHRoaXMucGFyZW50REJDID0gZGJjOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUpIHsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSlvYmo7Ci0gICAgICAgICAgICBpZiAoISh0aGlzLm1ldGhvZE5hbWUuZXF1YWxzKG1kYy5nZXRNZXRob2ROYW1lKCkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IHRoaXNQYXJhbUxpc3QgPSB0aGlzLnBhcmFtZXRlckRlc2NyaXB0aW9uczsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IHBhcmFtTGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgIG1kYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKTsKLSAgICAgICAgICAgIGlmICh0aGlzUGFyYW1MaXN0LnNpemUoKSAhPSBwYXJhbUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzUGFyYW1MaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEodGhpc1BhcmFtTGlzdC5nZXQoaSkuY29tcGFyZShwYXJhbUxpc3QuZ2V0KGkpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotICAgICAgICB9Ci0gICAgfQotCi0JcHVibGljIHZvaWQgc2V0SXNMaXN0VHlwZShib29sZWFuIGlzTGlzdFR5cGUpIHsKLQkJdGhpcy5pc0xpc3RUeXBlID0gaXNMaXN0VHlwZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNMaXN0VHlwZSgpIHsKLQkJcmV0dXJuIGlzTGlzdFR5cGU7Ci0JfQotCQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVMaW5lID0gIjsgIjsKLSAgICAgICAgc2IuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiTmFtZTogIiArIG1ldGhvZE5hbWUpOwotICAgICAgICBzYi5hcHBlbmQoc2FtZUxpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIlJldHVyblR5cGU6ICIgKyByZXR1cm5UeXBlKTsKLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiRXhjZXB0aW9uczogIik7Ci0gICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChleGNlcHRpb25zW2ldKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2FtZUxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9uZVdheUFubm90YXRlZCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJPbmVXYXkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJNZXRob2RBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYk1ldGhvZDogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViTWV0aG9kQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVxdWVzdFdyYXBwZXJBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlJlcXVlc3RXcmFwcGVyOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChyZXF1ZXN0V3JhcHBlckFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlckFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVzcG9uc2V0V3JhcHBlcjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocmVzcG9uc2VXcmFwcGVyQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc29hcEJpbmRpbmdBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIlNPQVBCaW5kaW5nOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzb2FwQmluZGluZ0Fubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdlYkVuZHBvaW50QW5ub3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCJXZWJFbmRwb2ludDogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViRW5kcG9pbnRBbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3ZWJSZXN1bHRBbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYlJlc3VsdDogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViUmVzdWx0QW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViU2VydmljZVJlZkFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViU2VydmljZVJlZjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViU2VydmljZVJlZkFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFjdGlvbkFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiQWN0aW9uOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChhY3Rpb25Bbm5vdC50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5Bbm5vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkhhbmRsZXJDaGFpbjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaGFuZGxlckNoYWluQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiTnVtYmVyIG9mIFBhcmFtZXRlciBEZXNjcmlwdGlvbnM6ICIgKyBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU+IHBkY0l0ZXIgPSBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHBkY0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBwZGNJdGVyLm5leHQoKTsKLQkJCXNiLmFwcGVuZChwZGMudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9PbmVXYXlBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9PbmVXYXlBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJiMmJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvT25lV2F5QW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIE9uZVdheUFubm90IGltcGxlbWVudHMgamF2YXguandzLk9uZXdheSB7Ci0KLSAgICAvKiogQSBPbmVXYXlBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgT25lV2F5QW5ub3QoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPbmVXYXlBbm5vdCBjcmVhdGVPbmVXYXlBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT25lV2F5QW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0MzFiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1BhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW1ldGVyVHlwZTsKLSAgICBwcml2YXRlIENsYXNzIHBhcmFtZXRlclR5cGVDbGFzczsKLSAgICBwcml2YXRlIFdlYlBhcmFtQW5ub3Qgd2ViUGFyYW1Bbm5vdDsKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbGlzdE9yZGVyOwotCS8vIFdpbGwgaW5kaWNhdGUgd2hldGhlciBvciBub3Qgd2UgZm91bmQgYW4gQFhNTExpc3QgYW5ub3RhdGlvbiBvbiB0aGUgcGFyYW1ldGVyCi0JcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICBpc0xpc3RUeXBlOwotCi0gICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBwYXJlbnRNREM7Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoCi0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSwKLSAgICAgICAgICAgIENsYXNzIHBhcmFtZXRlclR5cGVDbGFzcywKLSAgICAgICAgICAgIFdlYlBhcmFtQW5ub3Qgd2ViUGFyYW1Bbm5vdCwKLSAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3ZWJTZXJ2aWNlUmVmQW5ub3QpIHsKLQotICAgICAgICB0aGlzLnBhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXJUeXBlOwotICAgICAgICB0aGlzLnBhcmFtZXRlclR5cGVDbGFzcyA9IHBhcmFtZXRlclR5cGVDbGFzczsKLSAgICAgICAgdGhpcy53ZWJQYXJhbUFubm90ID0gd2ViUGFyYW1Bbm5vdDsKLSAgICAgICAgdGhpcy53ZWJTZXJ2aWNlUmVmQW5ub3QgPSB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgU3RyaW5nIGRlc2NyYmluZyB0aGlzIFBhcmFtZXRlciB0eXBlLiAgTm90ZSB0aGF0IHRoaXMgc3RyaW5nIGlzIHVucGFyc2VkLiAgRm9yCi0gICAgICogZXhhbXBsZSwgaWYgaXQgcmVwcmVzZW50cyBhIGphdmEudXRpbC5MaXN0PG15LnBhY2thZ2UuRm9vPiwgdGhlbiB0aGF0IGV4Y2FjdCBzdHJpbmcgd2lsbCBiZQotICAgICAqIHJldHVybmVkLCBpLmUuICJqYXZhLnV0aWwuTGlzdDxteS5wYWNrYWdlLkZvbz4iLiAgWW91IGNhbiB1c2Ugb3RoZXIgbWV0aG9kcyB0byByZXRyaWV2ZSBwYXJzZWQKLSAgICAgKiB2YWx1ZXMgZm9yIEdlbmVyaWNzIGFuZCBIb2xkZXJzLiAgRm9yIGV4YW1wbGUsIGdldFBhcmFtZXRlclR5cGVDbGFzcygpLCBnZXRSYXdUeXBlKCksCi0gICAgICogZ2V0SG9sZGVyQWN0dWFsVHlwZSgpLCBhbmQgZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcmFtZXRlclR5cGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gcGFyYW1ldGVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIFBhcmFtZXRlci4gIE5vdGUgdGhhdCBpZiB0aGlzIGlzIGEgZ2VuZXJpYyAoaW5jbHVkaW5nIGEKLSAgICAgKiBKQVhXUyBIb2xkZXI8VD4pIHRoZW4gdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmF3IHR5cGUgaXMgcmV0dXJuZWQgKGkuZS4gSG9sZGVyLmNsYXNzKS4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGEgSkFYLVdTIEhvbGRlcjxUPiwgdXNlIGdldEhvbGRlckFjdHVhbFR5cGUoLi4uKSB0byBnZXQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBULgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXJUeXBlQ2xhc3MuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFBhcmFtZXRlclR5cGVDbGFzcygpIHsKLQotICAgICAgICBpZiAocGFyYW1ldGVyVHlwZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRQYXJhbWV0ZXJUeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVDbGFzcyA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFByaW1pdGl2ZUNsYXNzKGdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlclR5cGVDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSBHZW5lcmljLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmF3IFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gZm9yIEpBWC1XUyBIb2xkZXI8Rm9vPiwgd2Ugd2FudCB0byBsb2FkIEhvbGRlci4gT3Rod2VyaXNlLCBsb2FkIHRoZSB0eXBlIGRpcmVjdGx5LiAKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzVG9Mb2FkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUocGFyYW1ldGVyVHlwZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NUb0xvYWQgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKHBhcmFtZXRlclR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NUb0xvYWQgPSBwYXJhbWV0ZXJUeXBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVDbGFzcyA9IGxvYWRDbGFzc0Zyb21QREMoY2xhc3NUb0xvYWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyVHlwZUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBKQVgtV1MgSG9sZGVyPFQ+LCByZXR1cm5zIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggVC4gIEZvciBub24tSkFYLVdTIEhvbGRlcnMgcmV0dXJucwotICAgICAqIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldEhvbGRlckFjdHVhbFR5cGVDbGFzcygpIHsKLSAgICAgICAgQ2xhc3MgcmV0dXJuQ2xhc3MgPSBudWxsOwotCi0gICAgICAgIGlmIChEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0hvbGRlclR5cGUocGFyYW1ldGVyVHlwZSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc1RvTG9hZCA9IERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldEhvbGRlckFjdHVhbFR5cGUocGFyYW1ldGVyVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm5DbGFzcyA9IGxvYWRDbGFzc0Zyb21QREMoY2xhc3NUb0xvYWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5DbGFzczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGxvYWRDbGFzc0Zyb21QREMoU3RyaW5nIGNsYXNzVG9Mb2FkKSB7Ci0gICAgICAgIENsYXNzIHJldHVybkNsYXNzID0gbnVsbDsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotCi0gICAgICAgIGlmIChnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZVJlZigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZVJlZigpLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZVJlZigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlciA9IGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlUmVmKCkuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlUmVmKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybkNsYXNzID0gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMubG9hZENsYXNzRnJvbUNvbXBvc2l0ZShjbGFzc1RvTG9hZCwgY2xhc3NMb2FkZXIpOwotICAgICAgICByZXR1cm4gcmV0dXJuQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViUGFyYW1Bbm5vdC4gKi8KLSAgICBwdWJsaWMgV2ViUGFyYW1Bbm5vdCBnZXRXZWJQYXJhbUFubm90KCkgewotICAgICAgICByZXR1cm4gd2ViUGFyYW1Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QuICovCi0gICAgcHVibGljIFdlYlNlcnZpY2VSZWZBbm5vdCBnZXRXZWJTZXJ2aWNlUmVmQW5ub3QoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUmVmQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZUNvbnRleHRBbm5vdC4gKi8KLSAgICBwdWJsaWMgaW50IGdldExpc3RPcmRlcigpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RPcmRlcjsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRNREMuICovCi0gICAgcHVibGljIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlUmVmKCkgewotICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRNREM7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlIFRoZSBwYXJhbWV0ZXJUeXBlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJUeXBlKFN0cmluZyBwYXJhbWV0ZXJUeXBlKSB7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwYXJhbWV0ZXJUeXBlQ2xhc3MgVGhlIHBhcmFtZXRlclR5cGVDbGFzcyB0byBzZXQuICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFBhcmFtZXRlclR5cGVDbGFzcyhDbGFzcyBwYXJhbWV0ZXJUeXBlQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJUeXBlQ2xhc3MgPSBwYXJhbWV0ZXJUeXBlQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3ZWJQYXJhbUFubm90IFRoZSB3ZWJQYXJhbUFubm90IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJQYXJhbUFubm90KFdlYlBhcmFtQW5ub3Qgd2ViUGFyYW1Bbm5vdCkgewotICAgICAgICB0aGlzLndlYlBhcmFtQW5ub3QgPSB3ZWJQYXJhbUFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZVJlZkFubm90IFRoZSB3ZWJTZXJ2aWNlUmVmQW5ub3QgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSZWZBbm5vdChXZWJTZXJ2aWNlUmVmQW5ub3Qgd2ViU2VydmljZVJlZkFubm90KSB7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZVJlZkFubm90ID0gd2ViU2VydmljZVJlZkFubm90OwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd2ViU2VydmljZUNvbnRleHRBbm5vdCBUaGUgd2ViU2VydmljZUNvbnRleHRBbm5vdCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdE9yZGVyKGludCBsaXN0T3JkZXIpIHsKLSAgICAgICAgdGhpcy5saXN0T3JkZXIgPSBsaXN0T3JkZXI7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtZGMgVGhlIHBhcmVudCBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGVSZWYoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjKSB7Ci0gICAgICAgIHRoaXMucGFyZW50TURDID0gbWRjOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IChQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSlvYmo7Ci0gICAgICAgICAgICBpZiAoISh0aGlzLnBhcmFtZXRlclR5cGUuZXF1YWxzKHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgCQotICAgIHB1YmxpYyB2b2lkIHNldElzTGlzdFR5cGUoYm9vbGVhbiBpc0xpc3RUeXBlKSB7Ci0gICAgCXRoaXMuaXNMaXN0VHlwZSA9IGlzTGlzdFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0VHlwZSgpIHsKLSAgICAJcmV0dXJuIGlzTGlzdFR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlIGRhdGEgbWVtYmVycyBoZXJlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2FtZUxpbmUgPSAiOyAiOwotICAgICAgICBzYi5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChzYW1lTGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiUGFyYW1ldGVyVHlwZTogIiArIHBhcmFtZXRlclR5cGUpOwotCi0gICAgICAgIGlmICh3ZWJQYXJhbUFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViUGFyYW06ICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHdlYlBhcmFtQW5ub3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2ViU2VydmljZVJlZkFubm90ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViU2VydmljZVJlZjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQod2ViU2VydmljZVJlZkFubm90LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmF3VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmdldFJhd1R5cGUocGFyYW1ldGVyVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRIb2xkZXJBY3R1YWxUeXBlKCkgewotICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0SG9sZGVyQWN0dWFsVHlwZShwYXJhbWV0ZXJUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0hvbGRlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0hvbGRlclR5cGUocGFyYW1ldGVyVHlwZSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Qb3J0Q29tcG9zaXRlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1BvcnRDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwM2JhMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1BvcnRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7DQotDQotLyoqDQotICogVGhpcyBzdWJjbGFzcyBvZiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHdpbGwgYmUgdXNlZCB0byBtb2RlbA0KLSAqIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgcG9ydC4gIFRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUsIHdoZW4NCi0gKiB1c2VkIGluIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcsIG1vcmUgb3IgbGVzcyByZXByZXNlbnRzIGEgc2luZ2xlIHdlYiANCi0gKiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzLiBJdCBpcyBwb3NzaWJsZSwgYW5kIGxpa2VseSwgdGhhdCBhIHNpbmdsZQ0KLSAqIGltcGxlbWVudGF0aW9uIGNsYXNzIHdpbGwgc2VydmUgbXVsdGlwbGUgcG9ydHMuIFRoZSBQb3J0Q29tcG9zaXRlIGFsbG93cw0KLSAqIG1ldGFkYXRhIHRoYXQgYXBwbGllcyBhdCB0aGUgcG9ydCBsZXZlbCB0byBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgDQotICogRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLiBUaGlzIHdpbGwgYWxsb3cgcHJvY2Vzc2luZyBhbmQgY29uZmlndXJpbmcNCi0gKiBvZiBtdWx0aXBsZSBwb3J0cyBpbiB0aGUgZGVzY3JpcHRpb24gaGllcmFyY2h5IGZyb20gYSBzaW5nbGUgREJDIG9iamVjdC4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9zaXRlIGV4dGVuZHMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHsNCi0gICAgDQotICAgIHByaXZhdGUgV3NkbEdlbmVyYXRvciB3c2RsR2VuZXJhdG9yOw0KLSAgICANCi0gICAgLy8gVGhlIFdlYlNlcnZpY2VBbm5vdCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgV2ViU2VydmljZUFubm90DQotICAgIC8vIHRoYXQgZXhpc3RzIG9uIHRoZSBEQkMgd2l0aCB3aGljaCBhIFBvcnRDb21wb3NpdGUgaW5zdGFuY2Ugd2FzIGNvbnN0cnVjdGVkLg0KLSAgICAvLyBJdCBleGlzdHMgaGVyZSBzbyBwb3J0LXNwZWNpZmljIHZhbHVlcywgc3VjaCBhcyAncG9ydE5hbWUnLCBjYW4gYmUgb3ZlcnJpZGRlbi4NCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQW5ub3Qgd3NBbm5vdDsNCi0gICAgDQotICAgIC8vIFRoZSBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBzaG91bGQgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSB0aGUgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QNCi0gICAgLy8gdGhhdCBleGlzdHMgb24gdGhlIERCQyB3aXRoIHdoaWNoIGEgUG9ydENvbXBvc2l0ZSBpbnN0YW5jZSB3YXMgY29uc3RydWN0ZWQuDQotICAgIC8vIEl0IGV4aXN0cyBoZXJlIHNvIHBvcnQtc3BlY2lmaWMgdmFsdWVzLCBzdWNoIGFzICdwb3J0TmFtZScsIGNhbiBiZSBvdmVycmlkZGVuLg0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHdzcEFubm90Ow0KLSAgICANCi0gICAgcHJpdmF0ZSBCaW5kaW5nVHlwZUFubm90IGJ0QW5ub3Q7DQotICAgIA0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbkFubm90IGhjQW5ub3Q7DQotICAgIA0KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbnNUeXBlIGhjc1R5cGU7DQotICAgIA0KLSAgICBwcml2YXRlIEJvb2xlYW4gbXRvbUVuYWJsZWQ7DQotICAgIA0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsNCi0gICAgDQotICAgIHByaXZhdGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGJhc2VEQkM7DQotICAgIA0KLSAgICBwdWJsaWMgUG9ydENvbXBvc2l0ZShEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgYmFzZURCQykgew0KLSAgICAgICAgdGhpcy5iYXNlREJDID0gYmFzZURCQzsNCi0gICAgfQ0KLSAgICANCi0gICAgDQotICAgIHB1YmxpYyBXc2RsR2VuZXJhdG9yIGdldEN1c3RvbVdzZGxHZW5lcmF0b3IoKSB7DQotICAgICAgICBpZih3c2RsR2VuZXJhdG9yID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRDdXN0b21Xc2RsR2VuZXJhdG9yKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gd3NkbEdlbmVyYXRvcjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgV2ViU2VydmljZUFubm90IGdldFdlYlNlcnZpY2VBbm5vdCgpIHsNCi0gICAgICAgIGlmKHdzQW5ub3QgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlREJDLmdldFdlYlNlcnZpY2VBbm5vdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHdzQW5ub3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFdlYlNlcnZpY2VQcm92aWRlckFubm90IGdldFdlYlNlcnZpY2VQcm92aWRlckFubm90KCkgew0KLSAgICAgICAgaWYod3NwQW5ub3QgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIHJldHVybiBiYXNlREJDLmdldFdlYlNlcnZpY2VQcm92aWRlckFubm90KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gd3NwQW5ub3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tV3NkbEdlbmVyYXRvcihXc2RsR2VuZXJhdG9yIHdzZGxHZW5lcmF0b3IpIHsNCi0gICAgICAgIHRoaXMud3NkbEdlbmVyYXRvciA9IHdzZGxHZW5lcmF0b3I7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluQW5ub3QoSGFuZGxlckNoYWluQW5ub3QgaGFuZGxlckNoYWluQW5ub3QpIHsNCi0gICAgICAgIHRoaXMuaGNBbm5vdCA9IGhhbmRsZXJDaGFpbkFubm90Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDaGFpbnNUeXBlKEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlKSB7DQotICAgICAgICB0aGlzLmhjc1R5cGUgPSBoYW5kbGVyQ2hhaW5zVHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc01UT01FbmFibGVkKGJvb2xlYW4gaXNNVE9NRW5hYmxlZCkgew0KLSAgICAgICAgdGhpcy5tdG9tRW5hYmxlZCA9IGlzTVRPTUVuYWJsZWQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsNCi0gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZUFubm90KFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QpIHsNCi0gICAgICAgIHRoaXMud3NBbm5vdCA9IHdlYlNlcnZpY2VBbm5vdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdChXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCkgew0KLSAgICAgICAgdGhpcy53c3BBbm5vdCA9IHdlYlNlcnZpY2VQcm92aWRlckFubm90Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCaW5kaW5nVHlwZUFubm90IGdldEJpbmRpbmdUeXBlQW5ub3QoKSB7DQotICAgICAgICBpZihidEFubm90ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRCaW5kaW5nVHlwZUFubm90KCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gYnRBbm5vdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluQW5ub3QgZ2V0SGFuZGxlckNoYWluQW5ub3QoKSB7DQotICAgICAgICBpZihoY0Fubm90ID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGhjQW5ub3Q7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEhhbmRsZXJDaGFpbnNUeXBlIGdldEhhbmRsZXJDaGFpbnNUeXBlKCkgew0KLSAgICAgICAgaWYoaGNzVHlwZSA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBoY3NUeXBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7DQotICAgICAgICBpZihtdG9tRW5hYmxlZCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGJhc2VEQkMuaXNNVE9NRW5hYmxlZCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG10b21FbmFibGVkOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdUeXBlQW5ub3QoQmluZGluZ1R5cGVBbm5vdCBiaW5kaW5nVHlwZUFubm90KSB7DQotICAgICAgICB0aGlzLmJ0QW5ub3QgPSBiaW5kaW5nVHlwZUFubm90Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7DQotICAgICAgICBpZihwcm9wZXJ0aWVzID09IG51bGwpIHsNCi0gICAgICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRQcm9wZXJ0aWVzKCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcHJvcGVydGllczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRQb3J0Q29tcG9zaXRlKFBvcnRDb21wb3NpdGUgcG9ydERCQykgew0KLSAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlDQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8UG9ydENvbXBvc2l0ZT4gZ2V0UG9ydENvbXBvc2l0ZXMoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEpBWFdTQ2F0YWxvZ01hbmFnZXIgZ2V0Q2F0YWxvZ01hbmFnZXIoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRDYXRhbG9nTWFuYWdlcigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldENsYXNzTG9hZGVyKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzTW9kaWZpZXJzKCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0Q2xhc3NNb2RpZmllcnMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldENsYXNzTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMaXN0PEN1c3RvbUFubm90YXRpb25JbnN0YW5jZT4gZ2V0Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcygpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvcj4gZ2V0Q3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnMoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycygpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBnZXRGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlKFN0cmluZyBmaWVsZE5hbWUpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGUoZmllbGROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZXNMaXN0KCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0SW50ZXJmYWNlc0xpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoU3RyaW5nIG1ldGhvZE5hbWUsIGludCBvY2N1cmVuY2UpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1ldGhvZE5hbWUsIG9jY3VyZW5jZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKFN0cmluZyBtZXRob2ROYW1lKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZXRob2ROYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UHJlZmVycmVkUG9ydCgpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldFByZWZlcnJlZFBvcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UHJlZmVycmVkUG9ydChPYmplY3Qga2V5KSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRQcmVmZXJyZWRQb3J0KGtleSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFNlcnZpY2VNb2RlQW5ub3QgZ2V0U2VydmljZU1vZGVBbm5vdCgpIHsNCi0gICAgICAgIHJldHVybiBiYXNlREJDLmdldFNlcnZpY2VNb2RlQW5ub3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU29hcEJpbmRpbmdBbm5vdCBnZXRTb2FwQmluZGluZ0Fubm90KCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0U29hcEJpbmRpbmdBbm5vdCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJDbGFzc05hbWUoKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRTdXBlckNsYXNzTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuaXNJbnRlcmZhY2UoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRXc2RsRGVmaW5pdGlvbigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRTZXJ2aWNlUU5hbWVzKCkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0U2VydmljZVFOYW1lcygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBEZWZpbml0aW9uIGdldFdzZGxEZWZpbml0aW9uKFFOYW1lIHNlcnZpY2VRTmFtZSkgew0KLSAgICAgICAgcmV0dXJuIGJhc2VEQkMuZ2V0V3NkbERlZmluaXRpb24oc2VydmljZVFOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUU5hbWVzKFNldDxRTmFtZT4gc2VydmljZVFOYW1lcykgew0KLSAgICAgICAgYmFzZURCQy5zZXRTZXJ2aWNlUU5hbWVzKHNlcnZpY2VRTmFtZXMpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxEZWZpbml0aW9uKFFOYW1lIHNlcnZpY2VRTmFtZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7DQotICAgICAgICBiYXNlREJDLnNldFdzZGxEZWZpbml0aW9uKHNlcnZpY2VRTmFtZSwgZGVmaW5pdGlvbik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHNldHdzZGxVUkwoUU5hbWUgc2VydmljZVFOYW1lLCBVUkwgdXJsKSB7DQotICAgICAgICBiYXNlREJDLnNldHdzZGxVUkwoc2VydmljZVFOYW1lLCB1cmwpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgVVJMIGdldFdzZGxVUkwoUU5hbWUgc2VydmljZVFOYW1lKSB7DQotICAgICAgICByZXR1cm4gYmFzZURCQy5nZXRXc2RsVVJMKHNlcnZpY2VRTmFtZSk7DQotICAgIH0NCi0gICAgDQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgZmluYWwgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOw0KLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVMaW5lID0gIjsgIjsNCi0gICAgICAgIHNiLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsNCi0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsNCi0gICAgICAgIHNiLmFwcGVuZCgiQ2xhc3NOYW1lOiAiICsgZ2V0Q2xhc3NOYW1lKCkpOw0KLQ0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLQ0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLSAgICAgICAgc2IuYXBwZW5kKCJoYXMgd3NkbERlZmluaXRpb24/OiAiKTsNCi0gICAgICAgIGlmIChnZXRXc2RsRGVmaW5pdGlvbigpICE9bnVsbCkgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgidHJ1ZSIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoImZhbHNlIik7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAod3NBbm5vdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOw0KLSAgICAgICAgICAgIHNiLmFwcGVuZCgiV2ViU2VydmljZTogIik7DQotICAgICAgICAgICAgc2IuYXBwZW5kKHdzQW5ub3QudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICBpZiAod3NwQW5ub3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoIldlYlNlcnZpY2VQcm92aWRlcjogIik7DQotICAgICAgICAgICAgc2IuYXBwZW5kKHdzcEFubm90LnRvU3RyaW5nKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgaWYgKGJ0QW5ub3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoIkJpbmRpbmdUeXBlOiAiKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoYnRBbm5vdC50b1N0cmluZygpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGhjQW5ub3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsNCi0gICAgICAgICAgICBzYi5hcHBlbmQoIkhhbmRsZXJDaGFpbjogIik7DQotICAgICAgICAgICAgc2IuYXBwZW5kKGhjQW5ub3QudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmVxdWVzdFdyYXBwZXJBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXF1ZXN0V3JhcHBlckFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjc1OTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXF1ZXN0V3JhcHBlckFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdFdyYXBwZXJBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotCi0gICAgLyoqIEEgUmVxdWVzdFdyYXBwZXJBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgUmVxdWVzdFdyYXBwZXJBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgUmVxdWVzdFdyYXBwZXJBbm5vdCgKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdFdyYXBwZXJBbm5vdCBjcmVhdGVSZXF1ZXN0V3JhcHBlckFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0V3JhcHBlckFubm90KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0V3JhcHBlckFubm90IGNyZWF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RJbXBsKAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lCi0gICAgKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVxdWVzdFdyYXBwZXJBbm5vdChsb2NhbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGxvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhcmdldE5hbWVzcGFjZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxMb2NhdGlvbi4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldE5hbWVzcGFjZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3c2RsTG9jYXRpb24gVGhlIHdzZGxMb2NhdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLy9obW0sIHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcwotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFJlcXVlc3RXcmFwcGVyLmxvY2FsTmFtZT0gIiArIGxvY2FsTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAUmVxdWVzdFdyYXBwZXIuY2xhc3NOYW1lPSAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBSZXF1ZXN0V3JhcHBlci50YXJnZXROYW1lc3BhY2U9ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1Jlc3BlY3RCaW5kaW5nQW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmVzcGVjdEJpbmRpbmdBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjEyN2I3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmVzcGVjdEJpbmRpbmdBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmc7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIFJlc3BlY3RCaW5kaW5nQW5ub3QgaW1wbGVtZW50cyBSZXNwZWN0QmluZGluZyB7DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsNCi0gICAgDQotICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWQoKSB7DQotICAgICAgICByZXR1cm4gZW5hYmxlZDsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGUpIHsNCi0gICAgICAgIGVuYWJsZWQgPSBlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7DQotICAgICAgICByZXR1cm4gUmVzcGVjdEJpbmRpbmcuY2xhc3M7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXNwb25zZVdyYXBwZXJBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9SZXNwb25zZVdyYXBwZXJBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjI2N2ZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmVzcG9uc2VXcmFwcGVyQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXNwb25zZVdyYXBwZXJBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLQotICAgIC8qKiBBIFJlc3BvbnNlV3JhcHBlckFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBSZXNwb25zZVdyYXBwZXJBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgUmVzcG9uc2VXcmFwcGVyQW5ub3QoCi0gICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc3BvbnNlV3JhcHBlckFubm90IGNyZWF0ZVJlc3BvbnNlV3JhcHBlckFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVdyYXBwZXJBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzcG9uc2VXcmFwcGVyQW5ub3QgY3JlYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RJbXBsKAotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lCi0gICAgKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2VXcmFwcGVyQW5ub3QobG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUpOwotICAgIH0KLQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGxvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhcmdldE5hbWVzcGFjZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxMb2NhdGlvbi4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxOYW1lKFN0cmluZyBsb2NhbE5hbWUpIHsKLSAgICAgICAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldE5hbWVzcGFjZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3c2RsTG9jYXRpb24gVGhlIHdzZGxMb2NhdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLy9obW0sIHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcwotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFJlc3BvbnNlV3JhcHBlci5sb2NhbE5hbWU9ICIgKyBsb2NhbE5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFJlc3BvbnNlV3JhcHBlci5jbGFzc05hbWU9ICIgKyBjbGFzc05hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFJlc3BvbnNlV3JhcHBlci50YXJnZXROYW1lc3BhY2U9ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1NlcnZpY2VNb2RlQW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvU2VydmljZU1vZGVBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRlNGEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvU2VydmljZU1vZGVBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZU1vZGVBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2UuTW9kZSB2YWx1ZSA9IFNlcnZpY2UuTW9kZS5QQVlMT0FEOwotCi0gICAgLyoqIEEgU2VydmljZU1vZGVBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgU2VydmljZU1vZGVBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgU2VydmljZU1vZGVBbm5vdChTZXJ2aWNlLk1vZGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZU1vZGVBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VNb2RlQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VNb2RlQW5ub3QgY3JlYXRlV2ViU2VydmljZUFubm90SW1wbChTZXJ2aWNlLk1vZGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlTW9kZUFubm90KHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlTW9kZUFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTZXJ2aWNlTW9kZUFubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlKSB7Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuU2VydmljZU1vZGUgc20gPSAoamF2YXgueG1sLndzLlNlcnZpY2VNb2RlKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBuZXcgU2VydmljZU1vZGVBbm5vdChzbS52YWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuQW5ub3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2UuTW9kZSB2YWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7Ci0gICAgfQotCi0gICAgLy9obW0sIHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcwotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLy9TZXR0ZXJzCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU2VydmljZS5Nb2RlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZSBkYXRhIG1lbWJlcnMgaGVyZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBTZXJ2aWNlTW9kZS52YWx1ZT0gIiArIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvU29hcEJpbmRpbmdBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Tb2FwQmluZGluZ0Fubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGZkOGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Tb2FwQmluZGluZ0Fubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgU29hcEJpbmRpbmdBbm5vdCBpbXBsZW1lbnRzIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIHsKLQotICAgIHByaXZhdGUgU3R5bGUgc3R5bGUgPSBTdHlsZS5ET0NVTUVOVDsKLSAgICBwcml2YXRlIFVzZSB1c2UgPSBVc2UuTElURVJBTDsKLSAgICBwcml2YXRlIFBhcmFtZXRlclN0eWxlIHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuV1JBUFBFRDsKLQotICAgIC8qKiBBIFNvYXBCaW5kaW5nQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFNvYXBCaW5kaW5nQW5ub3QoKSB7Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTb2FwQmluZGluZ0Fubm90KFN0eWxlIHN0eWxlLCBVc2UgdXNlLCBQYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlKSB7Ci0gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKLSAgICAgICAgdGhpcy51c2UgPSB1c2U7Ci0gICAgICAgIHRoaXMucGFyYW1ldGVyU3R5bGUgPSBwYXJhbVN0eWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU29hcEJpbmRpbmdBbm5vdCBjcmVhdGVTb2FwQmluZGluZ0Fubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTb2FwQmluZGluZ0Fubm90KCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgU29hcEJpbmRpbmdBbm5vdCBjcmVhdGVGcm9tQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgU29hcEJpbmRpbmdBbm5vdCByZXR1cm5Bbm5vdCA9IG51bGw7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbiBpbnN0YW5jZW9mIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyBzYiA9IChqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZykgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgIHJldHVybkFubm90ID0gbmV3IFNvYXBCaW5kaW5nQW5ub3Qoc2Iuc3R5bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IudXNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnBhcmFtZXRlclN0eWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0dXJuQW5ub3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFN0eWxlIHN0eWxlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zdHlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVXNlIHVzZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJTdHlsZSBwYXJhbWV0ZXJTdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1ldGVyU3R5bGU7Ci0gICAgfQotCi0KLSAgICAvKiogQHBhcmFtIHBhcmFtZXRlclN0eWxlIFRoZSBwYXJhbWV0ZXJTdHlsZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyU3R5bGUoUGFyYW1ldGVyU3R5bGUgcGFyYW1ldGVyU3R5bGUpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJTdHlsZSA9IHBhcmFtZXRlclN0eWxlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHlsZSBzdHlsZSkgewotICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB1c2UgVGhlIHVzZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VXNlKFVzZSB1c2UpIHsKLSAgICAgICAgdGhpcy51c2UgPSB1c2U7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAU09BUEJpbmRpbmcuc3R5bGU9ICIgKyBzdHlsZS50b1N0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAU09BUEJpbmRpbmcucGFyYW1ldGVyU3R5bGU9ICIgKyBwYXJhbWV0ZXJTdHlsZS50b1N0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAU09BUEJpbmRpbmcudXNlPSAiICsgdXNlLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvVE1Bbm5vdGF0aW9uQ29tcG9zaXRlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1RNQW5ub3RhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE0NTEyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvVE1Bbm5vdGF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgYW5kCi0gKiBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZS4gSXQgd2lsbCBkZWNsYXJlIHNldHRlcnMgZm9yIGFubm90YXRpb24gdHlwZXMgdGhhdCBhcmUgY29tbW9uIHRvIFR5cGVzCi0gKiBhbmQgTWV0aG9kcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUTUFubm90YXRpb25Db21wb3NpdGUgewotCi0gICAgcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdBbm5vdChTb2FwQmluZGluZ0Fubm90IHNiQW5ub3QpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1RNRkFubm90YXRpb25Db21wb3NpdGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDVjNDVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLAotICogTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUsIGFuZCBGaWVsZERlc2NyaXB0aW9uQ29tcG9pc3RlLiBJdCB3aWxsIGRlY2xhcmUgc2V0dGVycyBmb3IgYW5ub3RhdGlvbgotICogdHlwZXMgdGhhdCBhcmUgY29tbW9uIHRvIFR5cGVzLCBNZXRob2RzLCBhbmQgRmllbGRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRNRkFubm90YXRpb25Db21wb3NpdGUgewotCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluQW5ub3QoSGFuZGxlckNoYWluQW5ub3QgaGNBbm5vdCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlUmVmQW5ub3QoV2ViU2VydmljZVJlZkFubm90IHdzckFubm90KTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViRW5kcG9pbnRBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJFbmRwb2ludEFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmNmNTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJFbmRwb2ludEFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJFbmRwb2ludEFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLldlYkVuZHBvaW50IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLQotICAgIC8qKiBBIFdlYkVuZHBvaW50QW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYkVuZHBvaW50QW5ub3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFdlYkVuZHBvaW50QW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYkVuZHBvaW50QW5ub3QgY3JlYXRlV2ViRW5kcG9pbnRBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViRW5kcG9pbnRBbm5vdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViRW5kcG9pbnRBbm5vdCBjcmVhdGVXZWJFbmRwb2ludEFubm90SW1wbChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IFdlYkVuZHBvaW50QW5ub3QobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8vaG1tLCBzaG91bGQgd2UgcmVhbGx5IGRvIHRoaXMKLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJFbmRwb2ludC5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJGYXVsdEFubm90LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYkZhdWx0QW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiZTc4MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYkZhdWx0QW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYkZhdWx0QW5ub3QgaW1wbGVtZW50cyBqYXZheC54bWwud3MuV2ViRmF1bHQgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICJyZXR1cm4iOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIGZhdWx0QmVhbiA9ICIiOwotCi0gICAgLyoqIEEgV2ViRmF1bHRBbm5vdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAqLwotICAgIHByaXZhdGUgV2ViRmF1bHRBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViRmF1bHRBbm5vdCBjcmVhdGVXZWJGYXVsdEFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJGYXVsdEFubm90KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAnbmFtZScKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy50YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBmYXVsdEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZhdWx0QmVhbjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGZhdWx0QmVhbiBUaGUgZmF1bHRCZWFuIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEJlYW4oU3RyaW5nIGZhdWx0QmVhbikgewotICAgICAgICB0aGlzLmZhdWx0QmVhbiA9IGZhdWx0QmVhbjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlIGRhdGEgbWVtYmVycyBoZXJlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYkZhdWx0Lm5hbWU9ICIgKyBuYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJGYXVsdC5mYXVsdEJlYW49ICIgKyBmYXVsdEJlYW4pOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYkZhdWx0LnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYk1ldGhvZEFubm90LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYk1ldGhvZEFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNmIwZjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJNZXRob2RBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kQW5ub3QgaW1wbGVtZW50cyBqYXZheC5qd3MuV2ViTWV0aG9kIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBhY3Rpb24gPSAiIjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZXhjbHVkZSA9IGZhbHNlOwotCi0gICAgLyoqIEEgV2ViTWV0aG9kQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYk1ldGhvZEFubm90KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJNZXRob2RBbm5vdCBjcmVhdGVXZWJNZXRob2RBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViTWV0aG9kQW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG9wZXJhdGlvbk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBhY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBleGNsdWRlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5leGNsdWRlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gZXhjbHVkZSBUaGUgZXhjbHVkZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZShib29sZWFuIGV4Y2x1ZGUpIHsKLSAgICAgICAgdGhpcy5leGNsdWRlID0gZXhjbHVkZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG9wZXJhdGlvbk5hbWUgVGhlIG9wZXJhdGlvbk5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbk5hbWUoU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25OYW1lID0gb3BlcmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViTWV0aG9kLm9wZXJhdGlvbk5hbWU9ICIgKyBvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJNZXRob2QuYWN0aW9uPSAiICsgYWN0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJNZXRob2QuZXhjbHVkZSA9ICIpOwotICAgICAgICBpZiAoZXhjbHVkZSkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJ0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoImZhbHNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViUGFyYW1Bbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJQYXJhbUFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzE2NmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJQYXJhbUFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViUGFyYW1Bbm5vdCBpbXBsZW1lbnRzIGphdmF4Lmp3cy5XZWJQYXJhbSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIE1vZGUgbW9kZSA9IE1vZGUuSU47Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhlYWRlcjsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJ0TmFtZTsKLQotICAgIC8qKiBBIFdlYlBhcmFtQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlBhcmFtQW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlBhcmFtQW5ub3QgY3JlYXRlV2ViUGFyYW1Bbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViUGFyYW1Bbm5vdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgJ25hbWUnCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RlIG1vZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGVhZGVyKCkgewotICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwYXJ0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldE5hbWVzcGFjZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKE1vZGUgbW9kZSkgewotICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihib29sZWFuIGhlYWRlcikgewotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhcnROYW1lIFRoZSBwYXJ0TmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFydE5hbWUoU3RyaW5nIHBhcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucGFydE5hbWUgPSBwYXJ0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJQYXJhbS5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViUGFyYW0ucGFydE5hbWU9ICIgKyBwYXJ0TmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViUGFyYW0ubW9kZSA9ICIgKyBtb2RlLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViUGFyYW0uaGVhZGVyPSAiKTsKLSAgICAgICAgaWYgKGhlYWRlcikgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJ0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoImZhbHNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViUmVzdWx0QW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViUmVzdWx0QW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdlNzA2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlJlc3VsdEFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViUmVzdWx0QW5ub3QgaW1wbGVtZW50cyBqYXZheC5qd3MuV2ViUmVzdWx0IHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGVhZGVyID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFydE5hbWUgPSAiIjsKLQotICAgIC8qKiBBIFdlYlJlc3VsdEFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBXZWJSZXN1bHRBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgV2ViUmVzdWx0QW5ub3QuICovCi0gICAgcHVibGljIHN0YXRpYyBXZWJSZXN1bHRBbm5vdCBjcmVhdGVXZWJSZXN1bHRBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViUmVzdWx0QW5ub3QoKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBoZWFkZXIuICovCi0gICAgcHVibGljIGJvb2xlYW4gaGVhZGVyKCkgewotICAgICAgICByZXR1cm4gaGVhZGVyOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJ0TmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHBhcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcGFydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFyZ2V0TmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gaGVhZGVyIFRoZSBoZWFkZXIgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihib29sZWFuIGhlYWRlcikgewotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhcnROYW1lIFRoZSBwYXJ0TmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFydE5hbWUoU3RyaW5nIHBhcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucGFydE5hbWUgPSBwYXJ0TmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3M8QW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uLmNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgdW5pdCB0ZXN0aW5nLiBXZSB3aWxsIHByaW50IGFsbCBvZiB0aGUKLSAgICAgKiBkYXRhIG1lbWJlcnMgaGVyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5lID0gIlxuIjsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJSZXN1bHQubmFtZT0gIiArIG5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlJlc3VsdC5wYXJ0TmFtZT0gIiArIHBhcnROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJSZXN1bHQudGFyZ2V0TmFtZXNwYWNlPSAiICsgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJSZXN1bHQuaGVhZGVyPSAiKTsKLSAgICAgICAgaWYgKGhlYWRlcikgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJ0cnVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoImZhbHNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUFubm90LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E1YjU3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUFubm90LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUFubm90IGltcGxlbWVudHMgamF2YXguandzLldlYlNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBwb3J0TmFtZSA9ICIiOwotCi0gICAgLyoqIEEgV2ViU2VydmljZUFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQW5ub3QoKSB7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VBbm5vdCgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgICAgIHRoaXMuZW5kcG9pbnRJbnRlcmZhY2UgPSBlbmRwb2ludEludGVyZmFjZTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUFubm90IGNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZUFubm90KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQW5ub3QgY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUKLSAgICApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlQW5ub3QobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydE5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VBbm5vdCBjcmVhdGVGcm9tQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgV2ViU2VydmljZUFubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXguandzLldlYlNlcnZpY2UpIHsKLSAgICAgICAgICAgIGphdmF4Lmp3cy5XZWJTZXJ2aWNlIHdzID0gKGphdmF4Lmp3cy5XZWJTZXJ2aWNlKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlQW5ub3Qod3MubmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MudGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5zZXJ2aWNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Mud3NkbExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5lbmRwb2ludEludGVyZmFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MucG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMud3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmVuZHBvaW50SW50ZXJmYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBvcnROYW1lOwotICAgIH0KLQotCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvL1NldHRlcnMKLQotICAgIC8qKiBAcGFyYW0gZW5kcG9pbnRJbnRlcmZhY2UgVGhlIGVuZHBvaW50SW50ZXJmYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludEludGVyZmFjZShTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UpIHsKLSAgICAgICAgdGhpcy5lbmRwb2ludEludGVyZmFjZSA9IGVuZHBvaW50SW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gcG9ydE5hbWUgVGhlIHBvcnROYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gc2VydmljZU5hbWUgVGhlIHNlcnZpY2VOYW1lIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2UgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gd3NkbExvY2F0aW9uIFRoZSB3c2RsTG9jYXRpb24gdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxMb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMud3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2UubmFtZT0gIiArIG5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2Uuc2VydmljZU5hbWU9ICIgKyBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZT0gIiArIGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZT0gIiArIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZS53c2RsTG9jYXRpb249ICIgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2UucG9ydE5hbWU9ICIgKyBwb3J0TmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQ2xpZW50QW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUNsaWVudEFubm90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGZmN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlQ2xpZW50QW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgaW1wbGVtZW50cyBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb247Ci0KLSAgICAvKiogQSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgV2ViU2VydmljZUNsaWVudEFubm90KAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgY3JlYXRlV2ViU2VydmljZUNsaWVudEFubm90SW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQ2xpZW50QW5ub3RJbXBsKAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbgotICAgICkgewotICAgICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VDbGllbnRBbm5vdChuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbiB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlIGFubm90YXRpb24gaW5zdGFuY2UKLSAgICAgKiBwYXNzZWQgaW4uIAotICAgICAqIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFVzZSB0aGUgdmFsdWVzIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhbm5vdGF0aW9uLiAgTm90ZSB0aGlzIGNvdWxkCi0gICAgICogYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGphdmEgYW5ub3RhdGlvbiBzdXBlcmNsYXNzIGFzIHdlbGwuCi0gICAgICogQHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGFubm90YXRpb24gb3IgbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGNyZWF0ZWQgd2l0aCB0aGUKLSAgICAgKiBhbm5vdGF0aW9uIHBhc3NlZCBpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBjcmVhdGVGcm9tQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90IHJldHVybkFubm90ID0gbnVsbDsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQpIHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50IHdzYyA9IChqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCkgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgIHJldHVybkFubm90ID0gbmV3IFdlYlNlcnZpY2VDbGllbnRBbm5vdCh3c2MubmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzYy50YXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c2Mud3NkbExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbiB1c2luZyB0aGUgdmFsdWVzIGZyb20gdGhlIHR3byBhbm5vdGF0aW9ucyBwYXNzZWQKLSAgICAgKiBpbiBhcyBhcmd1bWVudHMuICBJZiBlaXRoZXIgaXMgbnVsbCwgdGhlIG5ldyBhbm5vdGF0aW9uIGlzIGNyZWF0ZWQgd2l0aCB0aGUgbm9uLW51bGwgCi0gICAgICogYW5ub3RhdGlvbidzIHZhbHVlcy4gIElmIGJvdGggYXJlIG51bGwsIHRoZW4gbm8gYW5ub3RhdGlvbiBpcyBjcmVhdGVkLiAgTm9uLWVtcHR5IHZhbHVlcyBpbiAKLSAgICAgKiB0aGUgc3BhcnNlIGFubm90YXRpb24gKGlmIGFueSkgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWVzIGluIHRoZSBiYXNlIGFubm90YXRpb24uIAotICAgICAqICAKLSAgICAgKiBAcGFyYW0gYmFzZUFubm90YXRpb24gSW5pdGlhbCB2YWx1ZXMgdG8gYmUgdXNlZCBpbiBjcmVhdGluZyB0aGUgYW5ub3RhdGlvbi4gIE1heSBiZSBudWxsLgotICAgICAqIEBwYXJhbSBzcGFyc2VBbm5vdGF0aW9uIE5vbi1lbXB0eSB2YWx1ZXMgKG5vdCBudWxsIGFuZCBub3QgIiIpIHdpbGwgb3ZlcnJpZGUgdmFsdWVzIGluIAotICAgICAqIHRoZSBiYXNlIGFubm90YXRpb24uCi0gICAgICogQHJldHVybiBBIG5ldyBhbm5vdGF0aW9uIGNyZWF0ZWQgZnJvbSB0aGUgYXJndW1lbnRzLCBvciBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRBbm5vdCBjcmVhdGVGcm9tQW5ub3RhdGlvbihBbm5vdGF0aW9uIGJhc2VBbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gc3BhcnNlQW5ub3RhdGlvbikgewotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QgcmV0dXJuQW5ub3QgPSBudWxsOwotICAgICAgICBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCBiYXNlV1NDQW5ub3RhdGlvbiA9IG51bGw7Ci0gICAgICAgIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50IHNwYXJzZVdTQ0Fubm90YXRpb24gPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKGJhc2VBbm5vdGF0aW9uICE9IG51bGwgJiYgYmFzZUFubm90YXRpb24gaW5zdGFuY2VvZiBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCkgewotICAgICAgICAgICAgYmFzZVdTQ0Fubm90YXRpb24gPSAoamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQpIGJhc2VBbm5vdGF0aW9uOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoc3BhcnNlQW5ub3RhdGlvbiAhPSBudWxsICYmIHNwYXJzZUFubm90YXRpb24gaW5zdGFuY2VvZiBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCkgewotICAgICAgICAgICAgc3BhcnNlV1NDQW5ub3RhdGlvbiA9IChqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCkgc3BhcnNlQW5ub3RhdGlvbjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGJhc2VXU0NBbm5vdGF0aW9uICE9IG51bGwgJiYgc3BhcnNlV1NDQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBCb3RoIHNwZWNpZmllZCwgY3JlYXRlIGJhc2VkIG9uIHRoZSBiYXNlIGFubm90YXRpb24gbWVyZ2VkIHdpdGggdGhlIHNwYXJzZQotICAgICAgICAgICAgLy8gYW5ub3RhdGlvbgotICAgICAgICAgICAgcmV0dXJuQW5ub3QgPSBXZWJTZXJ2aWNlQ2xpZW50QW5ub3QuY3JlYXRlRnJvbUFubm90YXRpb24oYmFzZVdTQ0Fubm90YXRpb24pOwotICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0VtcHR5KHNwYXJzZVdTQ0Fubm90YXRpb24ubmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybkFubm90LnNldE5hbWUoc3BhcnNlV1NDQW5ub3RhdGlvbi5uYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0VtcHR5KHNwYXJzZVdTQ0Fubm90YXRpb24udGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHNwYXJzZVdTQ0Fubm90YXRpb24udGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0VtcHR5KHNwYXJzZVdTQ0Fubm90YXRpb24ud3NkbExvY2F0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQW5ub3Quc2V0V3NkbExvY2F0aW9uKHNwYXJzZVdTQ0Fubm90YXRpb24ud3NkbExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGJhc2VXU0NBbm5vdGF0aW9uICE9IG51bGwgJiYgc3BhcnNlV1NDQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHNwYXJzZSBpbmZvcm1hdGlvbiwgc28ganVzdCBjcmVhdGUgZnJvbSB0aGUgYmFzZSBhbm5vdGF0aW9uCi0gICAgICAgICAgICByZXR1cm5Bbm5vdCA9IFdlYlNlcnZpY2VDbGllbnRBbm5vdC5jcmVhdGVGcm9tQW5ub3RhdGlvbihiYXNlV1NDQW5ub3RhdGlvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVdTQ0Fubm90YXRpb24gPT0gbnVsbCAmJiBzcGFyc2VXU0NBbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgb25seSBzcGFyc2UgaW5mb3JtYXRpb24sIHNvIGNyZWF0ZSBhIG5ldyBhbm5vdGF0aW9uIGJhc2VkIG9uIHRoYXQKLSAgICAgICAgICAgIHJldHVybkFubm90ID0gV2ViU2VydmljZUNsaWVudEFubm90LmNyZWF0ZUZyb21Bbm5vdGF0aW9uKHNwYXJzZVdTQ0Fubm90YXRpb24pOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VXU0NBbm5vdGF0aW9uID09IG51bGwgJiYgc3BhcnNlV1NDQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBObyBhbm50b3RhdGlvbiBzcGVjaWZlZCwgc28ganVzdCByZXR1cm4gbnVsbCB3aGljaCB3YXMgaW5pdGlhbGl6ZWQgYWJvdmUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgYWxsIHRoZSBjYXNlcyBhcmUgY292ZXJlZCBhYm92ZQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkRlc2NyaXB0aW9uQnVpbGRlckVycjIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwYXJzZUFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogc3BhcnNlQW5ub3RhdGlvbi50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2VBbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGJhc2VBbm5vdGF0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFyZ2V0TmFtZXNwYWNlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxMb2NhdGlvbi4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0TmFtZXNwYWNlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHdzZGxMb2NhdGlvbiBUaGUgd3NkbExvY2F0aW9uIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvL2htbSwgc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZUNsaWVudC5uYW1lPSAiICsgbmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZUNsaWVudC50YXJnZXROYW1lc3BhY2U9ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VDbGllbnQud3NkbExvY2F0aW9uPSAiICsgd3NkbExvY2F0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VDb250ZXh0QW5ub3QuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUNvbnRleHRBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODRkZjI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZUNvbnRleHRBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLndzLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ29udGV4dEFubm90IGltcGxlbWVudHMgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0IHsKLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBQcmluY2lwYWwgdXNlclByaW5jaXBhbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNVc2VySW5Sb2xlID0gZmFsc2U7Ci0KLSAgICAvKiogQSBXZWJTZXJ2aWNlQ29udGV4dEFubm90IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQuICovCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dEFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dEFubm90KAotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICBQcmluY2lwYWwgdXNlclByaW5jaXBhbCwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNVc2VySW5Sb2xlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUNvbnRleHQgPSBtZXNzYWdlQ29udGV4dDsKLSAgICAgICAgdGhpcy51c2VyUHJpbmNpcGFsID0gdXNlclByaW5jaXBhbDsKLSAgICAgICAgdGhpcy5pc1VzZXJJblJvbGUgPSBpc1VzZXJJblJvbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJvbGUgVGhlIHJvbGUgdG8gY2hlY2suCi0gICAgICogQHJldHVybiBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHVzZXIgaXMgaW4gUm9sZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgewotICAgICAgICByZXR1cm4gaXNVc2VySW5Sb2xlOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG1lc3NhZ2VDb250ZXh0LiAqLwotICAgIHB1YmxpYyBNZXNzYWdlQ29udGV4dCBnZXRNZXNzYWdlQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0OwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHVzZXJQcmluY2lwYWwuICovCi0gICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgewotICAgICAgICByZXR1cm4gdXNlclByaW5jaXBhbDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIGlzVXNlckluUm9sZSBUaGUgaXNVc2VySW5Sb2xlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VySW5Sb2xlKGJvb2xlYW4gaXNVc2VySW5Sb2xlKSB7Ci0gICAgICAgIHRoaXMuaXNVc2VySW5Sb2xlID0gaXNVc2VySW5Sb2xlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gbWVzc2FnZUNvbnRleHQgVGhlIG1lc3NhZ2VDb250ZXh0IHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICB0aGlzLm1lc3NhZ2VDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB1c2VyUHJpbmNpcGFsIFRoZSB1c2VyUHJpbmNpcGFsIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyUHJpbmNpcGFsKFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsKSB7Ci0gICAgICAgIHRoaXMudXNlclByaW5jaXBhbCA9IHVzZXJQcmluY2lwYWw7Ci0gICAgfQotCi0gICAgcHVibGljIDxUIGV4dGVuZHMgRW5kcG9pbnRSZWZlcmVuY2U+IFQgZ2V0RW5kcG9pbnRSZWZlcmVuY2UoQ2xhc3M8VD4gYXJnMCwgRWxlbWVudC4uLiBhcmcxKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVuZHBvaW50UmVmZXJlbmNlKEVsZW1lbnQuLi4gYXJnMCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgLy9obW0sIHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcwotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWFjMTVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV2ViU2VydmljZVByb3ZpZGVyQW5ub3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbExvY2F0aW9uID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBwb3J0TmFtZSA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOwotCi0gICAgLyoqIEEgV2ViU2VydmljZVByb3ZpZGVyQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VQcm92aWRlckFubm90KCkgewotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIHRoaXMud3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VQcm92aWRlckFubm90KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCBjcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZQotICAgICkgewotICAgICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VQcm92aWRlckFubm90KHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VQcm92aWRlckFubm90IGNyZWF0ZUZyb21Bbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCByZXR1cm5Bbm5vdCA9IG51bGw7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbiBpbnN0YW5jZW9mIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIgd3NwID0gKGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIpIGFubm90YXRpb247Ci0gICAgICAgICAgICByZXR1cm5Bbm5vdCA9IG5ldyBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCh3c3Aud3NkbExvY2F0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3Auc2VydmljZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzcC5wb3J0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NwLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiByZXR1cm5Bbm5vdDsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBwb3J0TmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmljZU5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBzZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhcmdldE5hbWVzcGFjZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsTG9jYXRpb24uICovCi0gICAgcHVibGljIFN0cmluZyB3c2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBwb3J0TmFtZSBUaGUgcG9ydE5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSkgewotICAgICAgICB0aGlzLnBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgc2VydmljZU5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldE5hbWVzcGFjZSB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3c2RsTG9jYXRpb24gVGhlIHdzZGxMb2NhdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzPEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbi5jbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHVuaXQgdGVzdGluZy4gV2Ugd2lsbCBwcmludCBhbGwgb2YgdGhlCi0gICAgICogZGF0YSBtZW1iZXJzIGhlcmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbmV3TGluZSA9ICJcbiI7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVByb3ZpZGVyLnNlcnZpY2VOYW1lPSAiICsgc2VydmljZU5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VQcm92aWRlci50YXJnZXROYW1lc3BhY2U9ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VQcm92aWRlci53c2RsTG9jYXRpb249ICIgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VQcm92aWRlci5wb3J0TmFtZT0gIiArIHBvcnROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VSZWZBbm5vdC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9XZWJTZXJ2aWNlUmVmQW5ub3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyZGQyMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dlYlNlcnZpY2VSZWZBbm5vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSZWZBbm5vdCBpbXBsZW1lbnRzIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiIjsKLSAgICBwcml2YXRlIENsYXNzIHR5cGU7Ci0gICAgcHJpdmF0ZSBDbGFzcyB2YWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBtYXBwZWROYW1lID0gIiI7Ci0gICAgCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBTdHJpbmcgdmVyc2lvbnMgb2YgdGhlIENsYXNzIGF0dHJpYnV0ZXMgd2hlbiB0aGUgYXNzb2NpYXRlZCBkZXByZWNhdGVkIAotICAgIC8vIG1ldGhvZHMgYXJlIHJlbW92ZWQuCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZVN0cmluZyA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlU3RyaW5nID0gIiI7Ci0KLSAgICAvKiogQSBXZWJTZXJ2aWNlUmVmQW5ub3QgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gKi8KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VSZWZBbm5vdCgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgV2ViU2VydmljZVJlZkFubm90KAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgQ2xhc3MgdHlwZSwKLSAgICAgICAgICAgIENsYXNzIHZhbHVlLAotICAgICAgICAgICAgU3RyaW5nIG1hcHBlZE5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGUgU3RyaW5nIHZhbHVlcyBmb3IgdHlwZSBhbmQgdmFsdWUgc2hvdWxkbid0IGJlIHVzZWQuICBVc2Uge0BsaW5rICNXZWJTZXJ2aWNlUmVmQW5ub3QoU3RyaW5nLCBTdHJpbmcsIENsYXNzLCBDbGFzcywgU3RyaW5nKX0KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB3c2RsTG9jYXRpb24KLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSBtYXBwZWROYW1lCi0gICAgICogQHBhcmFtIHR5cGVTdHJpbmcKLSAgICAgKiBAcGFyYW0gdmFsdWVTdHJpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIFdlYlNlcnZpY2VSZWZBbm5vdCgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIENsYXNzIHR5cGUsCi0gICAgICAgICAgICBDbGFzcyB2YWx1ZSwKLSAgICAgICAgICAgIFN0cmluZyBtYXBwZWROYW1lLAotICAgICAgICAgICAgU3RyaW5nIHR5cGVTdHJpbmcsCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLSAgICAgICAgdGhpcy50eXBlU3RyaW5nID0gdHlwZVN0cmluZzsKLSAgICAgICAgdGhpcy52YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVJlZkFubm90IGNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdEltcGwoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZVJlZkFubm90KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUmVmQW5ub3QgY3JlYXRlV2ViU2VydmljZVJlZkFubm90SW1wbCgKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgIENsYXNzIHR5cGUsCi0gICAgICAgICAgICBDbGFzcyB2YWx1ZSwKLSAgICAgICAgICAgIFN0cmluZyBtYXBwZWROYW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZVJlZkFubm90KG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBkZXByZWNhdGVkIFRoZSBTdHJpbmcgdmFsdWVzIGZvciB0eXBlIGFuZCB2YWx1ZSBzaG91bGQgbm90IGJlIHVzZWQuICBVc2Uge0BsaW5rICNjcmVhdGVXZWJTZXJ2aWNlUmVmQW5ub3RJbXBsKFN0cmluZywgU3RyaW5nLCBDbGFzcywgQ2xhc3MsIFN0cmluZyl9Ci0gICAgICogCi0gICAgICogIFRoZXJlIHNob3VsZG4ndCBiZSBib3RoIGEgY2xhc3MgYW5kIFN0cmluZyBmb3IgdHlwZSBhbmQgdmFsdWU7IHRoZXJlIGlzbid0IG9uIHRoZSBhY3R1YWwgCi0gICAgICogIGFubm90YXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uCi0gICAgICogQHBhcmFtIHR5cGUKLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcGFyYW0gbWFwcGVkTmFtZQotICAgICAqIEBwYXJhbSB0eXBlU3RyaW5nCi0gICAgICogQHBhcmFtIHZhbHVlU3RyaW5nCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVJlZkFubm90IGNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdEltcGwoCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24sCi0gICAgICAgICAgICBDbGFzcyB0eXBlLAotICAgICAgICAgICAgQ2xhc3MgdmFsdWUsCi0gICAgICAgICAgICBTdHJpbmcgbWFwcGVkTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyB0eXBlU3RyaW5nLAotICAgICAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nCi0gICAgKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViU2VydmljZVJlZkFubm90KG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nKTsKLSAgICB9Ci0KLQotICAgIC8qKiBAcmV0dXJuIFJldHVybnMgdGhlIG1hcHBlZE5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBtYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdHlwZS4gKi8KLSAgICBwdWJsaWMgQ2xhc3MgdHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUuICovCi0gICAgcHVibGljIENsYXNzIHZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbExvY2F0aW9uLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgd3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICN0eXBlKCl9IAotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHlwZVN0cmluZy4gCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdHlwZVN0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICN2YWx1ZSgpfSAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbHVlU3RyaW5nLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZVN0cmluZzsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG1hcHBlZE5hbWUgVGhlIG1hcHBlZE5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoU3RyaW5nIG1hcHBlZE5hbWUpIHsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ2xhc3MgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIC8qKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShDbGFzcyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3c2RsTG9jYXRpb24gVGhlIHdzZGxMb2NhdGlvbiB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbExvY2F0aW9uLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUeXBlKENsYXNzKX0KLSAgICAgKiBAcGFyYW0gdHlwZVN0cmluZyBUaGUgdHlwZVN0cmluZyB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZVN0cmluZyhTdHJpbmcgdHlwZVN0cmluZykgewotICAgICAgICB0aGlzLnR5cGVTdHJpbmcgPSB0eXBlU3RyaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHtAbGluayAjc2V0VmFsdWUoQ2xhc3MpfSAKLSAgICAgKiBAcGFyYW0gdmFsdWVTdHJpbmcgVGhlIHZhbHVlU3RyaW5nIHRvIHNldC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVN0cmluZyhTdHJpbmcgdmFsdWVTdHJpbmcpIHsKLSAgICAgICAgdGhpcy52YWx1ZVN0cmluZyA9IHZhbHVlU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzczxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb24uY2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciB1bml0IHRlc3RpbmcuIFdlIHdpbGwgcHJpbnQgYWxsIG9mIHRoZQotICAgICAqIGRhdGEgbWVtYmVycyBoZXJlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSAiXG4iOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VSZWYubmFtZT0gIiArIG5hbWUpOwotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiQFdlYlNlcnZpY2VSZWYud3NkbExvY2F0aW9uPSAiICsgd3NkbExvY2F0aW9uKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlUmVmLm1hcHBlZE5hbWU9ICIgKyBtYXBwZWROYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlUmVmLnR5cGVTdHJpbmc9ICIgKyB0eXBlU3RyaW5nKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlUmVmLnR5cGU9ICIgKyAoKHR5cGUgIT0gbnVsbCkgPyB0eXBlLnRvU3RyaW5nKCkgOiBudWxsKSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgc2IuYXBwZW5kKCJAV2ViU2VydmljZVJlZi52YWx1ZVN0cmluZz0gIiArIHZhbHVlU3RyaW5nKTsKLSAgICAgICAgc2IuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICBzYi5hcHBlbmQoIkBXZWJTZXJ2aWNlUmVmLnZhbHVlPSAiICsgKCh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKSk7Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9Xc2RsQ29tcG9zaXRlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dzZGxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkMWYwMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dzZGxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURvY3VtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgV3NkbENvbXBvc2l0ZSB7Ci0KLSAgICBIYXNoTWFwPFN0cmluZywgRGVmaW5pdGlvbj4gd3NkbERlZmluaXRpb25zTWFwOwotCi0gICAgSGFzaE1hcDxTdHJpbmcsIE9NRG9jdW1lbnQ+IHNjaGVtYU1hcDsKLQotICAgIFN0cmluZyB3c2RsRmlsZU5hbWU7Ci0KLSAgICBwdWJsaWMgV3NkbENvbXBvc2l0ZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSBzY2hlbWFNYXAuICovCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPTURvY3VtZW50PiBnZXRTY2hlbWFNYXAoKSB7Ci0gICAgICAgIHJldHVybiBzY2hlbWFNYXA7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbERlZmluaXRpb24uICovCi0gICAgcHVibGljIEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPiBnZXRXc2RsRGVmaW5pdGlvbnNNYXAoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbnNNYXA7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyB0aGUgcm9vdCBXU0RMIERlZmluaXRpb24gKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRSb290V3NkbERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbnNNYXAuZ2V0KGdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsRmlsZU5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsRmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBzY2hlbWFNYXAgVGhlIHNjaGVtYU1hcCB0byBzZXQuICovCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hTWFwKEhhc2hNYXA8U3RyaW5nLCBPTURvY3VtZW50PiBzY2hlbWFNYXApIHsKLSAgICAgICAgdGhpcy5zY2hlbWFNYXAgPSBzY2hlbWFNYXA7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgd3NkbERlZmluaXRpb24gdG8gc2V0LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxEZWZpbml0aW9uKEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPiB3c2RsRGVmaW5pdGlvbnNNYXApIHsKLSAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbnNNYXAgPSB3c2RsRGVmaW5pdGlvbnNNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZSBUaGUgd3NkbEZpbGVOYW1lIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9IHdzZGxGaWxlTmFtZTsKLSAgICB9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1dzZGxHZW5lcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV3NkbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDJmMTJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvV3NkbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBXc2RsR2VuZXJhdG9yIHsKLQotICAgIHB1YmxpYyBXc2RsQ29tcG9zaXRlIGdlbmVyYXRlV3NkbChTdHJpbmcgaW1wbENsYXNzLCBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYykKLSAgICAgICAgICAgIHRocm93cyBXZWJTZXJ2aWNlRXhjZXB0aW9uOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvQ29udmVydGVyVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0NvbnZlcnRlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YjgzYjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvQ29udmVydGVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5IYW5kbGVyQ2hhaW5Bbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5Tb2FwQmluZGluZ0Fubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5UTUFubm90YXRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlRNRkFubm90YXRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYlNlcnZpY2VSZWZBbm5vdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxMaXN0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENvbnZlcnRlclV0aWxzIHsKLQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gcmV0cmlldmUgdGhlIGFubm90YXRpb24gc3BlY2lmaWVkIGJ5IGEgY2VydGFpbiA8Y29kZT5DbGFzczwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQ2xhc3MgLSA8Y29kZT5DbGFzczwvY29kZT4gdGhlIGFubm90YXRpb24gPGNvZGU+Q2xhc3M8L2NvZGU+Ci0gICAgICogQHBhcmFtIGVsZW1lbnQgICAgICAgICAtIDxjb2RlPkFubm90YXRlZEVsZW1lbnQ8L2NvZGU+IC0gdGhlIGVsZW1lbnQgb24gd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgYW5ub3RhdGlvbiAoaS5lLiBDbGFzcywgTWV0aG9kLCBGaWVsZCkKLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+QW5ub3RhdGlvbjwvY29kZT4gYW5ub3RhdGlvbiByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gPGNvZGU+Q2xhc3M8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQ2xhc3MgYW5ub3RhdGlvbkNsYXNzLCBmaW5hbCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIChBbm5vdGF0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEFubm90YXRpb24oYW5ub3RhdGlvbkNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhbGwgYW5ub3RhdGlvbnMgdGhhdCBtYXRjaCB0aGUgZm9sbG93aW5nCi0gICAgICogY29uZGl0aW9uczoKLSAgICAgKiAKLSAgICAgKiAtIEFubm90YXRpb25zIHRoYXQgZXh0ZW5kIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgVAotICAgICAqIC0gQW5ub3RhdGlvbnMgdGhhdCB0aGVtc2VsdmVzIGFyZSBhbm5vdGF0ZWQgd2l0aCB0eXBlIFQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IExpc3Q8QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoZmluYWwgQ2xhc3M8VD4gYW5ub3RhdGlvbkNsYXNzLCBmaW5hbCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uPigpOwotICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gR2V0IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFubm90YXRpb25zIGZyb20gdGhlIGNsYXNzIHRoYXQgd2FzIHByb3ZpZGVkLgotICAgICAgICBhbm5vdGF0aW9ucyA9IChBbm5vdGF0aW9uW10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKEFubm90YXRpb24gYTogYW5ub3RhdGlvbnMpIHsgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgdGhlIGFubm90YXRpb24gbWF0Y2hlcyB0aGUgcGFyYW1ldGVyIHR5cGUgd2UncmUgbG9va2luZwotICAgICAgICAgICAgLy8gZm9yLCBhZGQgaXQgdG8gdGhlIGxpc3QuCi0gICAgICAgICAgICBpZiAoYS5hbm5vdGF0aW9uVHlwZSgpLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvbkNsYXNzKSB8fCAKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhLmFubm90YXRpb25UeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBtYXRjaGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIDxjb2RlPkhhbmRsZXJDaGFpbkFubm90PC9jb2RlPiBzaW5jZSB0aGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBoYW5kbGVyQ2hhaW4gLSA8Y29kZT5IYW5kbGVyQ2hhaW48L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPkhhbmRsZXJDaGFpbkFubm90PC9jb2RlPgotICAgICAqIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBtYXkgYmUgcHJlc2VudCBvbiBhIFR5cGUsIE1ldGhvZCwgb3IgRmllbGQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBIYW5kbGVyQ2hhaW5Bbm5vdCBjcmVhdGVIYW5kbGVyQ2hhaW5Bbm5vdChIYW5kbGVyQ2hhaW4gaGFuZGxlckNoYWluKSB7Ci0gICAgICAgIEhhbmRsZXJDaGFpbkFubm90IGhjQW5ub3QgPSBIYW5kbGVyQ2hhaW5Bbm5vdC5jcmVhdGVIYW5kbGVyQ2hhaW5Bbm5vdEltcGwoKTsKLSAgICAgICAgaGNBbm5vdC5zZXRGaWxlKGhhbmRsZXJDaGFpbi5maWxlKCkpOwotICAgICAgICBoY0Fubm90LnNldE5hbWUoaGFuZGxlckNoYWluLm5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBoY0Fubm90OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRvIGNyZWF0ZSBhIDxjb2RlPlNvYXBCaW5kaW5nQW5ub3Q8L2NvZGU+IHNpbmNlIHRoZQotICAgICAqCi0gICAgICogQHBhcmFtIHNvYXBCaW5kaW5nIC0gPGNvZGU+U09BUEJpbmRpbmc8L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPlNvYXBCaW5kaW5nQW5ub3Q8L2NvZGU+Ci0gICAgICogQFNPQVBCaW5kaW5nIGFubm90YXRpb24gbWF5IGJlIHByZXNlbnQgb24gYSBUeXBlIG9yIE1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNvYXBCaW5kaW5nQW5ub3QgY3JlYXRlU29hcEJpbmRpbmdBbm5vdChTT0FQQmluZGluZyBzb2FwQmluZGluZykgewotICAgICAgICBTb2FwQmluZGluZ0Fubm90IHNiQW5ub3QgPSBTb2FwQmluZGluZ0Fubm90LmNyZWF0ZVNvYXBCaW5kaW5nQW5ub3RJbXBsKCk7Ci0gICAgICAgIHNiQW5ub3Quc2V0UGFyYW1ldGVyU3R5bGUoc29hcEJpbmRpbmcucGFyYW1ldGVyU3R5bGUoKSk7Ci0gICAgICAgIHNiQW5ub3Quc2V0U3R5bGUoc29hcEJpbmRpbmcuc3R5bGUoKSk7Ci0gICAgICAgIHNiQW5ub3Quc2V0VXNlKHNvYXBCaW5kaW5nLnVzZSgpKTsKLSAgICAgICAgcmV0dXJuIHNiQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGEgPGNvZGU+V2ViU2VydmljZVJlZkFubm90PC9jb2RlPiBzaW5jZSB0aGUKLSAgICAgKgotICAgICAqIEBwYXJhbSB3ZWJTZXJ2aWNlUmVmIC0gPGNvZGU+V2ViU2VydmljZVJlZjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+V2ViU2VydmljZVJlZkFubm90PC9jb2RlPgotICAgICAqIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gbWF5IGJlIHByZXNlbnQgb24gYSBUeXBlLCBNZXRob2QsIG9yIEZpZWxkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVJlZkFubm90IGNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdChXZWJTZXJ2aWNlUmVmIHdlYlNlcnZpY2VSZWYpIHsKLSAgICAgICAgV2ViU2VydmljZVJlZkFubm90IHdzckFubm90ID0gV2ViU2VydmljZVJlZkFubm90LmNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdEltcGwoKTsKLSAgICAgICAgd3NyQW5ub3Quc2V0TWFwcGVkTmFtZSh3ZWJTZXJ2aWNlUmVmLm1hcHBlZE5hbWUoKSk7Ci0gICAgICAgIHdzckFubm90LnNldE5hbWUod2ViU2VydmljZVJlZi5uYW1lKCkpOwotICAgICAgICB3c3JBbm5vdC5zZXRUeXBlKHdlYlNlcnZpY2VSZWYudHlwZSgpKTsKLSAgICAgICAgd3NyQW5ub3Quc2V0VmFsdWUod2ViU2VydmljZVJlZi52YWx1ZSgpKTsKLSAgICAgICAgd3NyQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdlYlNlcnZpY2VSZWYud3NkbExvY2F0aW9uKCkpOwotICAgICAgICByZXR1cm4gd3NyQW5ub3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlIHRvIGF0dGFjaCBASGFuZGxlckNoYWluIGFubm90YXRpb24gZGF0YSB0byBhIGNvbXBvc2l0ZSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlICAgICAgICAtIDxjb2RlPlRNRkFubm90YXRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIGFubm90YXRlZEVsZW1lbnQgLSA8Y29kZT5Bbm5vdGF0ZWRFbGVtZW50PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKFRNRkFubm90YXRpb25Db21wb3NpdGUgY29tcG9zaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotICAgICAgICBIYW5kbGVyQ2hhaW4gaGFuZGxlckNoYWluID0gKEhhbmRsZXJDaGFpbilDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgIEhhbmRsZXJDaGFpbi5jbGFzcywgYW5ub3RhdGVkRWxlbWVudCk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgSGFuZGxlckNoYWluQW5ub3QgaGNBbm5vdCA9IENvbnZlcnRlclV0aWxzLmNyZWF0ZUhhbmRsZXJDaGFpbkFubm90KAotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW4pOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbkFubm90KGhjQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlIHRvIGF0dGFjaCBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBkYXRhIHRvIGEgY29tcG9zaXRlIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgICAgICAgIC0gPGNvZGU+VE1Bbm5vdGF0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBhbm5vdGF0ZWRFbGVtZW50IC0gPGNvZGU+QW5ub3RhdGVkRWxlbWVudDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0YWNoU29hcEJpbmRpbmdBbm5vdGF0aW9uKFRNQW5ub3RhdGlvbkNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLSAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcywgYW5ub3RhdGVkRWxlbWVudCk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTb2FwQmluZGluZ0Fubm90IHNiQW5ub3QgPSBDb252ZXJ0ZXJVdGlscy5jcmVhdGVTb2FwQmluZGluZ0Fubm90KHNvYXBCaW5kaW5nKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRTb2FwQmluZGluZ0Fubm90KHNiQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdXNlIHRvIGF0dGFjaCBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uIGRhdGEgdG8gYSBjb21wb3NpdGUgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAgICAgICAgLSA8Y29kZT5UTUZBbm5vdGF0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBhbm5vdGF0ZWRFbGVtZW50IC0gPGNvZGU+QW5ub3RhdGVkRWxlbWVudDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oVE1GQW5ub3RhdGlvbkNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotICAgICAgICBXZWJTZXJ2aWNlUmVmIHdlYlNlcnZpY2VSZWYgPSAoV2ViU2VydmljZVJlZilDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VSZWYuY2xhc3MsIGFubm90YXRlZEVsZW1lbnQpOwotICAgICAgICBpZiAod2ViU2VydmljZVJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlUmVmQW5ub3Qgd3NyQW5ub3QgPSBDb252ZXJ0ZXJVdGlscy5jcmVhdGVXZWJTZXJ2aWNlUmVmQW5ub3QoCi0gICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VSZWYpOwotICAgICAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VSZWZBbm5vdCh3c3JBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogVGhpcyBtZXRob2Qgd2lsbCBhZGQgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBvYmplY3RzIHRvIGEgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGF0dGFjaEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGVzKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZQotICAgICAgICAgICAgY29tcG9zaXRlLCBMaXN0PEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+IGZkY0xpc3QpIHsKLSAgICAgICAgZm9yIChGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGZkYyA6IGZkY0xpc3QpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlKGZkYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogVGhpcyBtZXRob2Qgd2lsbCBhZGQgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgb2JqZWN0cyB0byBhIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZXMoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlCi0gICAgICAgICAgICBjb21wb3NpdGUsIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QpIHsKLSAgICAgICAgZm9yIChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgOiBtZGNMaXN0KSB7Ci0gICAgICAgICAgICBjb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgICAgIG1kYy5zZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVSZWYoY29tcG9zaXRlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBUaGlzIG1ldGhvZCB3aWxsIGFkZCBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBvYmplY3RzIHRvIGEgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXR0YWNoUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVzKExpc3QKLSAgICAgICAgICAgIDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGRjTGlzdCwgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjKSB7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjIDogcGRjTGlzdCkgewotICAgICAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYyk7Ci0gICAgICAgICAgICBwZGMuc2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGVSZWYobWRjKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgdG8gc2VlIGlmIGEgbWV0aG9kJ3MgZGVjbGFyaW5nIGNsYXNzIGlzIHRoZSBPYmplY3QgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5ib29sZWFuPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChNZXRob2QgbWV0aG9kLCBTdHJpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBjb25zdHJ1Y3QgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBmdWxsIHR5cGUgb2YgYSBwYXJhbWV0ZXJpemVkIHZhcmlhYmxlLgotICAgICAqIEBwYXJhbSBwdCAtIDxjb2RlPlBhcmFtZXRlcml6ZWRUeXBlPC9jb2RlPgotICAgICAqIEBwYXJhbSBwYXJhbVR5cGUgLSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICogQHJldHVybiAtIDxjb2RlPlN0cmluZzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsVHlwZShQYXJhbWV0ZXJpemVkVHlwZSBwdCwgU3RyaW5nIHBhcmFtVHlwZSkgewotICAgICAgICBpZiAocHQuZ2V0UmF3VHlwZSgpIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIENsYXNzIHJhd0NsYXNzID0gKENsYXNzKXB0LmdldFJhd1R5cGUoKTsKLSAgICAgICAgICAgIHBhcmFtVHlwZSA9IHBhcmFtVHlwZSArIHJhd0NsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlW10gZ2VuZXJpY1R5cGVzID0gcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOwotICAgICAgICBpZiAoZ2VuZXJpY1R5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZSA9IHBhcmFtVHlwZSArICI8IjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJpY1R5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHlwZSB0eXBlID0gZ2VuZXJpY1R5cGVzW2ldOwotICAgICAgICAgICAgICAgIHBhcmFtVHlwZSA9IGdldFR5cGUodHlwZSwgcGFyYW1UeXBlKTsKLQotICAgICAgICAgICAgICAgIC8vIFNldCBzdHJpbmcgZm9yIG1vcmUgcGFyYW1ldGVycyBPUiBjbG9zZSB0aGUgZ2VuZXJpYyBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZS4KLSAgICAgICAgICAgICAgICBpZiAoaSAhPSBnZW5lcmljVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGUgPSBwYXJhbVR5cGUgKyAiLCAiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZSA9IHBhcmFtVHlwZSArICI+IjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1UeXBlOwotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKFR5cGUgdHlwZSwgU3RyaW5nIHBhcmFtVHlwZSkgewotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICBwYXJhbVR5cGUgPSBwYXJhbVR5cGUgKyAoKENsYXNzKXR5cGUpLmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZSA9IGdldEZ1bGxUeXBlKChQYXJhbWV0ZXJpemVkVHlwZSl0eXBlLCBwYXJhbVR5cGUpOwotICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBXaWxkY2FyZFR5cGUpIHsKLSAgICAgICAgICAgIHBhcmFtVHlwZSA9IHBhcmFtVHlwZSArICI/IjsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgewotICAgICAgICAgICAgcGFyYW1UeXBlID0gZ2V0VHlwZSgoKEdlbmVyaWNBcnJheVR5cGUpdHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSwgcGFyYW1UeXBlKSArICJbXSI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmFtVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBzZWFyY2ggYXJyYXkgb2YgcGFyYW1ldGVyIGFubm90YXRpb25zIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIEBYbWxMaXN0Ci0gICAgICogYW5ub3RhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzWG1sTGlzdEFubm90YXRpb24oQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7Ci0gICAgICAgIGZvcihBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgaWYoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpID09IFhtbExpc3QuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0phdmFDbGFzc1RvREJDQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjUxNzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuQmluZGluZ1R5cGVBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5GaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuU2VydmljZU1vZGVBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViRmF1bHRBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZVJlZkFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5DbGFzc0xvYWRlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnM7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEphdmFDbGFzc1RvREJDQ29udmVydGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ2xhc3Mgc2VydmljZUNsYXNzOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VpQ2xhc3NOYW1lOwotCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBjbGFzc2VzOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgT2JqZWN0PiBhbm5vdGF0aW9uUHJvY2Vzc29yczsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwPENsYXNzLCBPYmplY3Q+KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihDbGFzcyBzZXJ2aWNlQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPigpOwotICAgICAgICBlc3RhYmxpc2hDbGFzc0hpZXJhcmNoeShzZXJ2aWNlQ2xhc3MpOwotICAgICAgICBlc3RhYmxpc2hJbnRlcmZhY2VIaWVyYXJjaHkoc2VydmljZUNsYXNzLmdldEludGVyZmFjZXMoKSk7Ci0gICAgICAgIGVzdGFibGlzaEV4Y2VwdGlvbkNsYXNzZXMoc2VydmljZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgb25seSBtZXRob2Qgd2Ugd2lsbCBleHBvc2UgdG8gdXNlcnMgb2YgdGhpcyBjbGFzcy4gSXQgd2lsbCB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiB0aGUKLSAgICAgKiA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+IGJhc2VkIG9uIG91ciBzZXJ2aWNlIGNsYXNzLiBJdCB3aWxsIGFsc28gaGFuZGxlIHRoZQotICAgICAqIGNhc2Ugb2YgYW4gaW1wbCBjbGFzcyB0aGF0IHJlZmVyZW5jZXMgYW4gU0VJLgotICAgICAqCi0gICAgICogQHJldHVybiAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gcHJvZHVjZURCQygpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNyZWF0aW5nIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBtYXAgZnJvbSBKYXZhIENsYXNzLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGJ1aWxkREJDKGRiY01hcCwgY2xhc3Nlcy5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKHNlaUNsYXNzTmFtZSAhPSBudWxsICYmICFzZWlDbGFzc05hbWUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlciA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIHNlaUNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VpQ2xhc3MgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Q2xhc3NMb2FkZXIubG9hZENsYXNzKHNlaUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVpbGREQkMoZGJjTWFwLCBzZWlDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHRyeSB0byBzZWUgaWYgdGhlIFNFSSBoYXMgYW55IHN1cGVyIGludGVyZmFjZXMgIAotICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGludGVyZmFjZXMgPSBzZWlDbGFzcy5nZXRJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGREQkMoZGJjTWFwLCBpbnRlcmZhY2VzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2xhc3Mgbm90IGZvdW5kIGV4Y2VwdGlvbiBjYXVnaHQgZm9yIGNsYXNzOiAiICsgc2VpQ2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGJjTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZERCQyhIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAsIENsYXNzIGNsYXp6KSB7Ci0gICAgICAgIHNlcnZpY2VDbGFzcyA9IGNsYXp6OwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBpbnRyb3NwZWN0Q2xhc3MoY29tcG9zaXRlKTsKLSAgICAgICAgZGJjTWFwLnB1dChjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIGNvbXBvc2l0ZSk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgaW50cm9zcGVjdGlvbiBvZiB0aGUgY2xhc3MtbGV2ZWwgaW5mb3JtYXRpb24uIEl0IHdpbGwgc3RvcmUgdGhlCi0gICAgICogZ2F0aGVyZWQgaW5mb3JtYXRpb24gaW4gdGhlIHBlcnRpbmVudCBkYXRhIG1lbWJlcnMgb2YgdGhlIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludHJvc3BlY3RDbGFzcyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIC8vIE5lZWQgdG8gaW52ZXN0aWdhdGUgdGhpcywgcHJvYmFibHkgd2FudCB0byBzcGVjaWZ5Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlclV0aWxzLmdldENsYXNzTG9hZGVyKHNlcnZpY2VDbGFzcykpOwotICAgICAgICBjb21wb3NpdGUuc2V0SXNJbnRlcmZhY2Uoc2VydmljZUNsYXNzLmlzSW50ZXJmYWNlKCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0U3VwZXJDbGFzc05hbWUoc2VydmljZUNsYXNzLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsID8gc2VydmljZUNsYXNzLgotICAgICAgICAgICAgICAgIGdldFN1cGVyY2xhc3MoKS5nZXROYW1lKCkgOiBudWxsKTsKLSAgICAgICAgY29tcG9zaXRlLnNldENsYXNzTmFtZShzZXJ2aWNlQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc2V0SW50ZXJmYWNlcyhjb21wb3NpdGUpOwotICAgICAgICBzZXRUeXBlVGFyZ2V0dGVkQW5ub3RhdGlvbnMoY29tcG9zaXRlKTsKLSAgICAgICAgRmllbGRbXSBmaWVsZHMgPSAoRmllbGRbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2VDbGFzcy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBKYXZhRmllbGRzVG9GRENDb252ZXJ0ZXIgZmllbGRDb252ZXJ0ZXIgPSBuZXcgSmF2YUZpZWxkc1RvRkRDQ29udmVydGVyKAotICAgICAgICAgICAgICAgICAgICBmaWVsZHMpOwotICAgICAgICAgICAgTGlzdDxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBmZGNMaXN0ID0gZmllbGRDb252ZXJ0ZXIuY29udmVydEZpZWxkcygpOwotICAgICAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZXMoY29tcG9zaXRlLCBmZGNMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmljZUNsYXNzLmdldE1ldGhvZHMoKS5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAvLyBJbmhlcml0ZWQgbWV0aG9kcyBhbmQgY29uc3RydWN0b3JzIGZvciBzdXBlcmNsYXNzZXMgd2lsbCBiZSBpbiBhIHNlcGVyYXRlIERCQyBmb3IKLSAgICAgICAgICAgIC8vIHRoZSBzdXBlcmNsYXNzLiAgV2Ugb25seSBuZWVkIHRoZSBvbmVzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoaXMgY2xhc3MuCi0gICAgICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gKE1ldGhvZFtdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAgQ29uc3RydWN0b3JbXSBkZWNsYXJlZENvbnN0cnVjdG9ycyA9IChDb25zdHJ1Y3RvcltdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBKYXZhTWV0aG9kc1RvTURDQ29udmVydGVyIG1ldGhvZENvbnZlcnRlciA9IG5ldyBKYXZhTWV0aG9kc1RvTURDQ29udmVydGVyKAotICAgICAgICAgICAgICAgICAgICBtZXRob2RzLCBkZWNsYXJlZENvbnN0cnVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gbWV0aG9kQ29udmVydGVyLmNvbnZlcnRNZXRob2RzKCk7Ci0gICAgICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZXMoY29tcG9zaXRlLCBtZGNMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGFueSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSBzZXJ2aWNlIGNsYXNzLiBXZSB3aWxsCi0gICAgICogdGhlbiBzZXQgdGhlc2UgYXMgYSBsaXN0IG9mIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lcyBvbiB0aGUgPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldEludGVyZmFjZXMoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBUeXBlW10gaW50ZXJmYWNlcyA9IChUeXBlW10pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlQ2xhc3MuZ2V0R2VuZXJpY0ludGVyZmFjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZUxpc3QgPSBpbnRlcmZhY2VzLmxlbmd0aCA+IDAgPyBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKQotICAgICAgICAgICAgICAgIDogbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpbnRlcmZhY2VMaXN0LmFkZChnZXROYW1lRnJvbVR5cGUoaW50ZXJmYWNlc1tpXSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBzZXQgdGhpcyBsaXN0IGlmIHdlIGZvdW5kIGludGVyZmFjZXMgYi9jIHRoZQotICAgICAgICAvLyBEQkMgbmV3cyB1cCBhbiBpbnRlcmZhY2UgbGlzdCBhcyBwYXJ0IG9mIGl0cyBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgIC8vIFRodXMsIGlmIHdlIHNldCB0aGlzIGxpc3QgdG8gbnVsbCB3ZSBtYXkgY2F1c2UgYW4gTlBFCi0gICAgICAgIGlmIChpbnRlcmZhY2VMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRJbnRlcmZhY2VzTGlzdChpbnRlcmZhY2VMaXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWVGcm9tVHlwZShUeXBlIHR5cGUpIHsKLSAgICAgICAgU3RyaW5nIHJldHVybk5hbWUgPSBudWxsOwotICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm5OYW1lID0gKChDbGFzcyl0eXBlKS5nZXROYW1lKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm5OYW1lID0gKChQYXJhbWV0ZXJpemVkVHlwZSl0eXBlKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5OYW1lOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBUeXBlIHRhcmdldHRlZCBhbm5vdGF0aW9ucyB0byB0aGUKLSAgICAgKiA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRUeXBlVGFyZ2V0dGVkQW5ub3RhdGlvbnMoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBhdHRhY2hCaW5kaW5nVHlwZUFubm90YXRpb24oY29tcG9zaXRlKTsKLSAgICAgICAgYXR0YWNoSGFuZGxlckNoYWluQW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hTZXJ2aWNlTW9kZUFubm90YXRpb24oY29tcG9zaXRlKTsKLSAgICAgICAgYXR0YWNoU29hcEJpbmRpbmdBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYkZhdWx0QW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hXZWJTZXJ2aWNlQW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hXZWJTZXJ2aWNlQ2xpZW50QW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdGF0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGF0dGFjaFdlYlNlcnZpY2VSZWZzQW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hXZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbihjb21wb3NpdGUpOwotICAgICAgICBhdHRhY2hXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb25zKGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBAV2ViU2VydmljZSBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyY29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZUFubm90YXRpb24oRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgPSAoV2ViU2VydmljZSlDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2UuY2xhc3MsIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEF0dGFjaCBAV2ViU2VydmljZSBhbm5vdGF0ZWQgZGF0YQotICAgICAgICAgICAgV2ViU2VydmljZUFubm90IHdzQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICAgICAgd3NBbm5vdC5zZXRFbmRwb2ludEludGVyZmFjZSh3ZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIFNFSSBhbmQgc2F2ZSBuYW1lIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgc2VpQ2xhc3NOYW1lID0gd2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICAgICAgd3NBbm5vdC5zZXROYW1lKHdlYlNlcnZpY2UubmFtZSgpKTsKLSAgICAgICAgICAgIHdzQW5ub3Quc2V0UG9ydE5hbWUod2ViU2VydmljZS5wb3J0TmFtZSgpKTsKLSAgICAgICAgICAgIHdzQW5ub3Quc2V0U2VydmljZU5hbWUod2ViU2VydmljZS5zZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIHdzQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgd3NBbm5vdC5zZXRXc2RsTG9jYXRpb24od2ViU2VydmljZS53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUFubm90KHdzQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBAV2ViU2VydmljZUNsaWVudCBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyY29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZSAtIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZUNsaWVudEFubm90YXRpb24oRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnQgPSAoV2ViU2VydmljZUNsaWVudClDb252ZXJ0ZXJVdGlscy4KLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VDbGllbnQuY2xhc3MsIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlQ2xpZW50ICE9IG51bGwpIHsKLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gYXR0YWNoIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYlNlcnZpY2VQcm92aWRlckFubm90YXRpb24oRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXIgd2ViU2VydmljZVByb3ZpZGVyID0gKFdlYlNlcnZpY2VQcm92aWRlcilDb252ZXJ0ZXJVdGlscy4KLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcywgc2VydmljZUNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBdHRhY2ggQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uIGRhdGEKLSAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHdzcEFubm90ID0gV2ViU2VydmljZVByb3ZpZGVyQW5ub3QuCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgICAgIHdzcEFubm90LnNldFBvcnROYW1lKHdlYlNlcnZpY2VQcm92aWRlci5wb3J0TmFtZSgpKTsKLSAgICAgICAgICAgIHdzcEFubm90LnNldFNlcnZpY2VOYW1lKHdlYlNlcnZpY2VQcm92aWRlci5zZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgIHdzcEFubm90LnNldFRhcmdldE5hbWVzcGFjZSh3ZWJTZXJ2aWNlUHJvdmlkZXIudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgd3NwQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdlYlNlcnZpY2VQcm92aWRlci53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3Qod3NwQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBAQmluZGluZ1R5cGUgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaEJpbmRpbmdUeXBlQW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIEJpbmRpbmdUeXBlIGJpbmRpbmdUeXBlID0gKEJpbmRpbmdUeXBlKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgQmluZGluZ1R5cGUuY2xhc3MsIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBdHRhY2ggQEJpbmRpbmdUeXBlIGFubm90YXRpb24gZGF0YQotICAgICAgICAgICAgQmluZGluZ1R5cGVBbm5vdCBidEFubm90ID0gQmluZGluZ1R5cGVBbm5vdC5jcmVhdGVCaW5kaW5nVHlwZUFubm90SW1wbCgpOwotICAgICAgICAgICAgYnRBbm5vdC5zZXRWYWx1ZShiaW5kaW5nVHlwZS52YWx1ZSgpKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRCaW5kaW5nVHlwZUFubm90KGJ0QW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBASGFuZGxlckNoYWluIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyY29tcG9zaXRlPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoSGFuZGxlckNoYWluQW5ub3RhdGlvbihjb21wb3NpdGUsIHNlcnZpY2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBAU2VydmljZU1vZGUgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFNlcnZpY2VNb2RlQW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFNlcnZpY2VNb2RlIHNlcnZpY2VNb2RlID0gKFNlcnZpY2VNb2RlKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgU2VydmljZU1vZGUuY2xhc3MsIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGlmIChzZXJ2aWNlTW9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBBdHRhY2ggQFNlcnZpY2VNb2RlIGFubm90YXRlZCBkYXRhCi0gICAgICAgICAgICBTZXJ2aWNlTW9kZUFubm90IHNtQW5ub3QgPSBTZXJ2aWNlTW9kZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgICAgIHNtQW5ub3Quc2V0VmFsdWUoc2VydmljZU1vZGUudmFsdWUoKSk7Ci0gICAgICAgICAgICBjb21wb3NpdGUuc2V0U2VydmljZU1vZGVBbm5vdChzbUFubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBkcml2ZSB0aGUgc2V0dGluZyBvZiBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJjb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFNvYXBCaW5kaW5nQW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaFNvYXBCaW5kaW5nQW5ub3RhdGlvbihjb21wb3NpdGUsIHNlcnZpY2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBAV2ViRmF1bHQgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYkZhdWx0QW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFdlYkZhdWx0IHdlYkZhdWx0ID0gKFdlYkZhdWx0KUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgV2ViRmF1bHQuY2xhc3MsIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJGYXVsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJGYXVsdEFubm90IHdlYkZhdWx0QW5ub3QgPSBXZWJGYXVsdEFubm90LmNyZWF0ZVdlYkZhdWx0QW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICB3ZWJGYXVsdEFubm90LnNldEZhdWx0QmVhbih3ZWJGYXVsdC5mYXVsdEJlYW4oKSk7Ci0gICAgICAgICAgICB3ZWJGYXVsdEFubm90LnNldE5hbWUod2ViRmF1bHQubmFtZSgpKTsKLSAgICAgICAgICAgIHdlYkZhdWx0QW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHdlYkZhdWx0LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJGYXVsdEFubm90KHdlYkZhdWx0QW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGF0dGFjaCBAV2ViU2VydmljZVJlZnMgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYlNlcnZpY2VSZWZzQW5ub3RhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VSZWZzIHdlYlNlcnZpY2VSZWZzID0gKFdlYlNlcnZpY2VSZWZzKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZVJlZnMuY2xhc3MsIHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXZWJTZXJ2aWNlUmVmW10gcmVmcyA9IHdlYlNlcnZpY2VSZWZzLnZhbHVlKCk7Ci0gICAgICAgICAgICBmb3IgKFdlYlNlcnZpY2VSZWYgcmVmIDogcmVmcykgewotICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VSZWZBbm5vdCB3c3JBbm5vdCA9IENvbnZlcnRlclV0aWxzLmNyZWF0ZVdlYlNlcnZpY2VSZWZBbm5vdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZik7Ci0gICAgICAgICAgICAgICAgY29tcG9zaXRlLnNldFdlYlNlcnZpY2VSZWZBbm5vdCh3c3JBbm5vdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZHJpdmUgdGhlIHNldHRpbmcgb2YgQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLSAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oY29tcG9zaXRlLCBzZXJ2aWNlQ2xhc3MpOwotCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBsaXN0IG9mIFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiBpbnN0YW5jZXMsIGFuZCBzZXQgdGhlbSBvbiB0aGUgY29tcG9zaXRlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb21wb3NpdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9ucyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gZmVhdHVyZXMgPSBDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9ucygKLSAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbi5jbGFzcywgc2VydmljZUNsYXNzKTsgCi0gICAgICAgIAotICAgICAgICBpZiAoZmVhdHVyZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGVyZSB3ZXJlIFsiICsgZmVhdHVyZXMuc2l6ZSgpICsgIl0gV2ViU2VydmljZUZlYXR1cmUgYW5ub3RhdGlvbnMgZm91bmQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlRmVhdHVyZXMoZmVhdHVyZXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVzdGFibGlzaENsYXNzSGllcmFyY2h5KENsYXNzIHJvb3RDbGFzcykgewotICAgICAgICBjbGFzc2VzLmFkZChyb290Q2xhc3MpOwotICAgICAgICBpZiAocm9vdENsYXNzLmdldFN1cGVyY2xhc3MoKSAhPSBudWxsICYmICFyb290Q2xhc3MuZ2V0U3VwZXJjbGFzcygpLmdldE5hbWUoKS4KLSAgICAgICAgICAgICAgICBlcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkgewotICAgICAgICAgICAgY2xhc3Nlcy5hZGQocm9vdENsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0gICAgICAgICAgICBlc3RhYmxpc2hJbnRlcmZhY2VIaWVyYXJjaHkocm9vdENsYXNzLmdldFN1cGVyY2xhc3MoKS5nZXRJbnRlcmZhY2VzKCkpOwotICAgICAgICAgICAgZXN0YWJsaXNoQ2xhc3NIaWVyYXJjaHkocm9vdENsYXNzLmdldFN1cGVyY2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXN0YWJsaXNoSW50ZXJmYWNlSGllcmFyY2h5KENsYXNzW10gaW50ZXJmYWNlcykgewotICAgICAgICBpZiAoaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKENsYXNzIGludGVyIDogaW50ZXJmYWNlcykgewotICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGludGVyKTsKLSAgICAgICAgICAgICAgICBlc3RhYmxpc2hJbnRlcmZhY2VIaWVyYXJjaHkoaW50ZXIuZ2V0SW50ZXJmYWNlcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW55IGNoZWNrZWQgZXhjZXB0aW9ucyAoaS5lLiBkZWNsYXJlZCBvbiBhIG1ldGhvZCB2aWEgYSB0aHJvd3MgY2xhdXNlKQotICAgICAqIHRvIHRoZSBsaXN0IG9mIGNsYXNzZXMgZm9yIHdoaWNoIGEgREJDIG5lZWRzIHRvIGJlIGJ1aWx0LgotICAgICAqIEBwYXJhbSByb290Q2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZXN0YWJsaXNoRXhjZXB0aW9uQ2xhc3NlcyhmaW5hbCBDbGFzcyByb290Q2xhc3MpIHsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IChNZXRob2RbXSkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIENsYXNzW10gZXhjZXB0aW9uQ2xhc3NlcyA9IG1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkNsYXNzZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZvciAoQ2xhc3MgY2hlY2tlZEV4Y2VwdGlvbiA6IGV4Y2VwdGlvbkNsYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2hlY2tlZEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0phdmFGaWVsZHNUb0ZEQ0NvbnZlcnRlci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YUZpZWxkc1RvRkRDQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNTYxODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YUZpZWxkc1RvRkRDQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IEphdmEgRmllbGRzIGludG8gRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBvYmplY3RzLiAqLwotcHVibGljIGNsYXNzIEphdmFGaWVsZHNUb0ZEQ0NvbnZlcnRlciB7Ci0KLSAgICBwcml2YXRlIEZpZWxkW10gZmllbGRzOwotCi0gICAgcHVibGljIEphdmFGaWVsZHNUb0ZEQ0NvbnZlcnRlcihGaWVsZFtdIGZpZWxkcykgewotICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0byBjcmVhdGUgPGNvZGU+RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0cyBmb3IgcHVibGljCi0gICAgICogZmllbGRzIGluIGEgZ2l2ZW4gQ2xhc3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+TGlzdDwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBjb252ZXJ0RmllbGRzKCkgewotICAgICAgICBMaXN0PEZpZWxkRGVzY3JpcHRpb25Db21wb3NpdGU+IGZkY0xpc3QgPSBuZXcKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotICAgICAgICAgICAgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBmZGMgPSBuZXcgRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgZmRjLnNldEZpZWxkTmFtZShmaWVsZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgZmRjLnNldE1vZGlmaWVyVHlwZShNb2RpZmllci50b1N0cmluZyhmaWVsZC5nZXRNb2RpZmllcnMoKSkpOwotICAgICAgICAgICAgYXR0YWNoSGFuZGxlckNoYWluQW5ub3RhdGlvbihmZGMsIGZpZWxkKTsKLSAgICAgICAgICAgIGF0dGFjaFdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uKGZkYywgZmllbGQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmZGNMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8gYXR0YWNoIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBkYXRhIGlmIGl0IGlzIGZvdW5kIG9uIHRoZQotICAgICAqIEZpZWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZkYyAgIC0gPGNvZGU+RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gZmllbGQgLSA8Y29kZT5GaWVsZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoSGFuZGxlckNoYWluQW5ub3RhdGlvbihGaWVsZERlc2NyaXB0aW9uQ29tcG9zaXRlIGZkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBmaWVsZCkgewotICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKGZkYywgZmllbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGNhbGwgdG8gYXR0YWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gZGF0YQotICAgICAqIGlmIGl0IGlzIGZvdW5kIG9uIHRoZSBGaWVsZC4KLSAgICAgKiBAcGFyYW0gZmRjIC0gPGNvZGU+RmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gZmllbGQgLSA8Y29kZT5GaWVsZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24oRmllbGREZXNjcmlwdGlvbkNvbXBvc2l0ZSBmZGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaFdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uKGZkYywgZmllbGQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0phdmFNZXRob2RzVG9NRENDb252ZXJ0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0phdmFNZXRob2RzVG9NRENDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlkYmYwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9KYXZhTWV0aG9kc1RvTURDQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkFjdGlvbkFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5GYXVsdEFjdGlvbkFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlJlcXVlc3RXcmFwcGVyQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlJlc3BvbnNlV3JhcHBlckFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJFbmRwb2ludEFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJNZXRob2RBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViUmVzdWx0QW5ub3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5GYXVsdEFjdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEphdmFNZXRob2RzVG9NRENDb252ZXJ0ZXIgewotCi0gICAgcHJpdmF0ZSBNZXRob2RbXSBtZXRob2RzOwotICAgIHByaXZhdGUgQ29uc3RydWN0b3JbXSBjb25zdHJ1Y3RvcnM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGVjbGFyaW5nQ2xhc3M7Ci0KLSAgICBwdWJsaWMgSmF2YU1ldGhvZHNUb01EQ0NvbnZlcnRlcihNZXRob2RbXSBtZXRob2RzLCBDb25zdHJ1Y3RvcltdIGNvbnN0cnVjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVjbGFyaW5nQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5tZXRob2RzID0gbWV0aG9kczsKLSAgICAgICAgdGhpcy5jb25zdHJ1Y3RvcnMgPSBjb25zdHJ1Y3RvcnM7Ci0gICAgICAgIHRoaXMuZGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZHJpdmUgdGhlIGNyZWF0aW9uIG9mIGEgPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+IGZvciBldmVyeSBwdWJsaWMgCi0gICAgICogSmF2YSBNZXRob2QgaW4gdGhlIG1ldGhvZHMgYXJyYXkgYW5kIGV2ZXJ5IEphdmEgQ29uc3RydWN0b3IgaW4gdGhlIGNvbnN0cnVjdG9ycyBhcnJheS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5MaXN0PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBjb252ZXJ0TWV0aG9kcygpIHsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCA9IG5ldwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKCFDb252ZXJ0ZXJVdGlscy5pc0luaGVyaXRlZChtZXRob2QsIGRlY2xhcmluZ0NsYXNzKSAKLSAgICAgICAgICAgICAgICAmJiBNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICAgICAgc2V0RXhjZXB0aW9uTGlzdChtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUobWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgc2V0UmV0dXJuVHlwZShtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgc2V0SXNMaXN0VHlwZShtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgbWRjLnNldERlY2xhcmluZ0NsYXNzKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoSGFuZGxlckNoYWluQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoT25ld2F5QW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoU29hcEJpbmRpbmdBbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBhdHRhY2hSZXF1ZXN0V3JhcHBlckFubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGF0dGFjaFJlc3BvbnNlV3JhcHBlckFubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGF0dGFjaFdlYkVuZHBvaW50QW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoV2ViTWV0aG9kQW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoV2ViUmVzdWx0QW5ub3RhdGlvbihtZGMsIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGF0dGFjaEFjdGlvbkFubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBKYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlciBwYXJhbUNvbnZlcnRlciA9IG5ldyBKYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGRjTGlzdCA9IHBhcmFtQ29udmVydGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVzKHBkY0xpc3QsIG1kYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1kY0xpc3QuYWRkKG1kYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCI8aW5pdD4iKTsKLSAgICAgICAgICAgIG1kYy5zZXREZWNsYXJpbmdDbGFzcyhjb25zdHJ1Y3Rvci5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBtZGNMaXN0LmFkZChtZGMpOwotICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBKYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlciBwYXJhbUNvbnZlcnRlciA9IG5ldyBKYXZhUGFyYW1Ub1BEQ0NvbnZlcnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGRjTGlzdCA9IHBhcmFtQ29udmVydGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFBhcmFtcygpOwotICAgICAgICAgICAgICAgIENvbnZlcnRlclV0aWxzLmF0dGFjaFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlcyhwZGNMaXN0LCBtZGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1kY0xpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYXR0YWNoZXMgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyBmb3IgYSBKYXZhIE1ldGhvZCB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRFeGNlcHRpb25MaXN0KE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBpZiAobWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgVHlwZVtdIGV4Y2VwdGlvblR5cGVzID0gbWV0aG9kLmdldEdlbmVyaWNFeGNlcHRpb25UeXBlcygpOwotICAgICAgICAgICAgU3RyaW5nW10gZXhjZXB0aW9ucyA9IG5ldyBTdHJpbmdbZXhjZXB0aW9uVHlwZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUeXBlIHR5cGUgPSBleGNlcHRpb25UeXBlc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKXR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsVHlwZSA9ICIiOwotICAgICAgICAgICAgICAgICAgICBmdWxsVHlwZSA9IENvbnZlcnRlclV0aWxzLmdldEZ1bGxUeXBlKHB0LCBmdWxsVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnNbaV0gPSBmdWxsVHlwZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgewotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zW2ldID0gKChDbGFzcyl0eXBlKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWRjLnNldEV4Y2VwdGlvbnMoZXhjZXB0aW9ucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBhdHRhY2htZW50IG9mIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaEhhbmRsZXJDaGFpbkFubm90YXRpb24oTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QKLSAgICAgICAgICAgIG1ldGhvZCkgewotICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hIYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKG1kYywgbWV0aG9kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZHJpdmUgdGhlIHNldHRpbmcgb2YgQFNPQVBCaW5kaW5nIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb21wb3NpdGUgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoU29hcEJpbmRpbmdBbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBDb252ZXJ0ZXJVdGlscy5hdHRhY2hTb2FwQmluZGluZ0Fubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkcml2ZSB0aGUgYXR0YWNobWVudCBvZiBAT25ld2F5IGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hPbmV3YXlBbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kCi0gICAgICAgICAgICBtZXRob2QpIHsKLSAgICAgICAgT25ld2F5IG9uZXdheSA9IChPbmV3YXkpQ29udmVydGVyVXRpbHMuZ2V0QW5ub3RhdGlvbihPbmV3YXkuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgIGlmIChvbmV3YXkgIT0gbnVsbCkgewotICAgICAgICAgICAgbWRjLnNldE9uZVdheUFubm90KHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWRjLnNldE9uZVdheUFubm90KGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQFJlcXVlc3RXcmFwcGVyIGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QKLSAgICAgICAgICAgIG1ldGhvZCkgewotICAgICAgICBSZXF1ZXN0V3JhcHBlciByZXF1ZXN0V3JhcHBlciA9IChSZXF1ZXN0V3JhcHBlcilDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgIFJlcXVlc3RXcmFwcGVyLmNsYXNzLCBtZXRob2QpOwotICAgICAgICBpZiAocmVxdWVzdFdyYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVxdWVzdFdyYXBwZXJBbm5vdCByd0Fubm90ID0gUmVxdWVzdFdyYXBwZXJBbm5vdC5jcmVhdGVSZXF1ZXN0V3JhcHBlckFubm90SW1wbCgpOwotICAgICAgICAgICAgcndBbm5vdC5zZXRDbGFzc05hbWUocmVxdWVzdFdyYXBwZXIuY2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgcndBbm5vdC5zZXRMb2NhbE5hbWUocmVxdWVzdFdyYXBwZXIubG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgcndBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UocmVxdWVzdFdyYXBwZXIudGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgbWRjLnNldFJlcXVlc3RXcmFwcGVyQW5ub3QocndBbm5vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBhdHRhY2htZW50IG9mIEBSZXNwb25lV3JhcHBlciBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCAtIDxjb2RlPk1ldGhvZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIFJlc3BvbnNlV3JhcHBlciByZXNwb25zZVdyYXBwZXIgPSAoUmVzcG9uc2VXcmFwcGVyKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oCi0gICAgICAgICAgICAgICAgUmVzcG9uc2VXcmFwcGVyLmNsYXNzLCBtZXRob2QpOwotICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlc3BvbnNlV3JhcHBlckFubm90IHJ3QW5ub3QgPSBSZXNwb25zZVdyYXBwZXJBbm5vdC5jcmVhdGVSZXNwb25zZVdyYXBwZXJBbm5vdEltcGwoKTsKLSAgICAgICAgICAgIHJ3QW5ub3Quc2V0Q2xhc3NOYW1lKHJlc3BvbnNlV3JhcHBlci5jbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICByd0Fubm90LnNldExvY2FsTmFtZShyZXNwb25zZVdyYXBwZXIubG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgcndBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UocmVzcG9uc2VXcmFwcGVyLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIG1kYy5zZXRSZXNwb25zZVdyYXBwZXJBbm5vdChyd0Fubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQFdlYkVuZHBvaW50IGFubm90YXRpb24gZGF0YSB0byB0aGUKLSAgICAgKiA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZGMgICAgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hXZWJFbmRwb2ludEFubm90YXRpb24oTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLCBNZXRob2QKLSAgICAgICAgICAgIG1ldGhvZCkgewotICAgICAgICBXZWJFbmRwb2ludCB3ZWJFbmRwb2ludCA9IChXZWJFbmRwb2ludClDb252ZXJ0ZXJVdGlscy5nZXRBbm5vdGF0aW9uKAotICAgICAgICAgICAgICAgIFdlYkVuZHBvaW50LmNsYXNzLCBtZXRob2QpOwotICAgICAgICBpZiAod2ViRW5kcG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgV2ViRW5kcG9pbnRBbm5vdCB3ZUFubm90ID0gV2ViRW5kcG9pbnRBbm5vdC5jcmVhdGVXZWJFbmRwb2ludEFubm90SW1wbCgpOwotICAgICAgICAgICAgd2VBbm5vdC5zZXROYW1lKHdlYkVuZHBvaW50Lm5hbWUoKSk7Ci0gICAgICAgICAgICBtZGMuc2V0V2ViRW5kcG9pbnRBbm5vdCh3ZUFubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQFdlYk1ldGhvZCBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCAtIDxjb2RlPk1ldGhvZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViTWV0aG9kQW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIFdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoV2ViTWV0aG9kKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oV2ViTWV0aG9kLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7Ci0gICAgICAgIGlmICh3ZWJNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgV2ViTWV0aG9kQW5ub3Qgd21Bbm5vdCA9IFdlYk1ldGhvZEFubm90LmNyZWF0ZVdlYk1ldGhvZEFubm90SW1wbCgpOwotICAgICAgICAgICAgd21Bbm5vdC5zZXRBY3Rpb24od2ViTWV0aG9kLmFjdGlvbigpKTsKLSAgICAgICAgICAgIHdtQW5ub3Quc2V0RXhjbHVkZSh3ZWJNZXRob2QuZXhjbHVkZSgpKTsKLSAgICAgICAgICAgIHdtQW5ub3Quc2V0T3BlcmF0aW9uTmFtZSh3ZWJNZXRob2Qub3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgIG1kYy5zZXRXZWJNZXRob2RBbm5vdCh3bUFubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQFdlYlJlc3VsdCBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCAtIDxjb2RlPk1ldGhvZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoV2ViUmVzdWx0QW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIFdlYlJlc3VsdCB3ZWJSZXN1bHQgPSAoV2ViUmVzdWx0KUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7Ci0gICAgICAgIGlmICh3ZWJSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgV2ViUmVzdWx0QW5ub3Qgd3JBbm5vdCA9IFdlYlJlc3VsdEFubm90LmNyZWF0ZVdlYlJlc3VsdEFubm90SW1wbCgpOwotICAgICAgICAgICAgd3JBbm5vdC5zZXRIZWFkZXIod2ViUmVzdWx0LmhlYWRlcigpKTsKLSAgICAgICAgICAgIHdyQW5ub3Quc2V0TmFtZSh3ZWJSZXN1bHQubmFtZSgpKTsKLSAgICAgICAgICAgIHdyQW5ub3Quc2V0UGFydE5hbWUod2ViUmVzdWx0LnBhcnROYW1lKCkpOwotICAgICAgICAgICAgd3JBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2Uod2ViUmVzdWx0LnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIG1kYy5zZXRXZWJSZXN1bHRBbm5vdCh3ckFubm90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBkYXRhIHRvIHRoZQotICAgICAqIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEBwYXJhbSBtZXRob2QgLSA8Y29kZT5NZXRob2Q8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kCi0gICAgICAgICAgICBtZXRob2QpIHsKLSAgICAgICAgQ29udmVydGVyVXRpbHMuYXR0YWNoV2ViU2VydmljZVJlZkFubm90YXRpb24obWRjLCBtZXRob2QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgZHJpdmUgdGhlIGF0dGFjaG1lbnQgb2YgQEFjdGlvbiBhbm5vdGF0aW9uIGRhdGEgdG8gdGhlCi0gICAgICogPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjICAgIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG1ldGhvZCAtIDxjb2RlPk1ldGhvZDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQWN0aW9uQW5ub3RhdGlvbihNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZAotICAgICAgICAgICAgbWV0aG9kKSB7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24gPSAoQWN0aW9uKUNvbnZlcnRlclV0aWxzLmdldEFubm90YXRpb24oQWN0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7Ci0gICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgQWN0aW9uQW5ub3QgYWN0aW9uQW5ub3QgPSBBY3Rpb25Bbm5vdC5jcmVhdGVBY3Rpb25Bbm5vdEltcGwoKTsKLSAgICAgICAgICAgIEZhdWx0QWN0aW9uW10gZmF1bHRzID0gYWN0aW9uLmZhdWx0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChmYXVsdHMgIT0gbnVsbCAmJiBmYXVsdHMubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICBMaXN0PEZhdWx0QWN0aW9uPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxGYXVsdEFjdGlvbj4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKEZhdWx0QWN0aW9uIGZhdWx0IDogZmF1bHRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZhdWx0QWN0aW9uQW5ub3QgZmF1bHRBbm5vdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYXVsdEFjdGlvbkFubm90LmNyZWF0ZUZhdWx0QWN0aW9uQW5ub3RJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhdWx0QW5ub3Quc2V0Q2xhc3NOYW1lKGZhdWx0LmNsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRBbm5vdC5zZXRWYWx1ZShmYXVsdC52YWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoZmF1bHRBbm5vdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFjdGlvbkFubm90LnNldEZhdWx0KGxpc3QudG9BcnJheShuZXcgRmF1bHRBY3Rpb25bMF0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWN0aW9uQW5ub3Quc2V0SW5wdXQoYWN0aW9uLmlucHV0KCkpOwotICAgICAgICAgICAgYWN0aW9uQW5ub3Quc2V0T3V0cHV0KGFjdGlvbi5vdXRwdXQoKSk7Ci0gICAgICAgICAgICBtZGMuc2V0QWN0aW9uQW5ub3QoYWN0aW9uQW5ub3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBkZXRlcm1pbmUgdGhlIHJldHVybiB0eXBlIG9mIGEgPGNvZGU+TWV0aG9kPC9jb2RlPiBhbmQKLSAgICAgKiBhdHRhY2ggaXQgdG8gYSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0LgotICAgICAqIEBwYXJhbSBtZGMgLSA8Y29kZT5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gPGNvZGU+TWV0aG9kPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRSZXR1cm5UeXBlKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYywgTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBUeXBlIHR5cGUgPSBtZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUoInZvaWQiKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKXR5cGU7Ci0gICAgICAgICAgICBTdHJpbmcgZnVsbFR5cGUgPSAiIjsKLSAgICAgICAgICAgIGZ1bGxUeXBlID0gQ29udmVydGVyVXRpbHMuZ2V0RnVsbFR5cGUocHQsIGZ1bGxUeXBlKTsKLSAgICAgICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKGZ1bGxUeXBlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCgoQ2xhc3MpdHlwZSkuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgc2V0SXNMaXN0VHlwZShNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsIE1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgbWRjLnNldElzTGlzdFR5cGUoQ29udmVydGVyVXRpbHMuaGFzWG1sTGlzdEFubm90YXRpb24obWV0aG9kLmdldEFubm90YXRpb25zKCkpKTsKLSAgICB9Ci0gICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YVBhcmFtVG9QRENDb252ZXJ0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL0phdmFQYXJhbVRvUERDQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDZjMTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9jb252ZXJ0ZXIvSmF2YVBhcmFtVG9QRENDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViUGFyYW1Bbm5vdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEphdmFQYXJhbVRvUERDQ29udmVydGVyIHsKLQotICAgIHByaXZhdGUgVHlwZVtdIHBhcmFtVHlwZXM7Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25bXVtdIHBhcmFtQW5ub3RhdGlvbnM7Ci0KLSAgICBwdWJsaWMgSmF2YVBhcmFtVG9QRENDb252ZXJ0ZXIoVHlwZVtdIHBhcmFtVHlwZXMsIEFubm90YXRpb25bXVtdIHBhcmFtQW5ub3RhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5wYXJhbVR5cGVzID0gcGFyYW1UeXBlczsKLSAgICAgICAgdGhpcy5wYXJhbUFubm90YXRpb25zID0gcGFyYW1Bbm5vdGF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gY29udmVydFBhcmFtcygpIHsKLSAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGRjTGlzdCA9IG5ldwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgICAgIFR5cGUgcGFyYW1UeXBlID0gcGFyYW1UeXBlc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBmdWxsVHlwZSA9IENvbnZlcnRlclV0aWxzLmdldFR5cGUocGFyYW1UeXBlLCAiIik7Ci0gICAgICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShmdWxsVHlwZSk7Ci0gICAgICAgICAgICBwZGMuc2V0TGlzdE9yZGVyKGkpOwotICAgICAgICAgICAgYXR0YWNoV2ViUGFyYW1Bbm5vdGF0aW9uKHBkYywgaSk7Ci0gICAgICAgICAgICBwZGMuc2V0SXNMaXN0VHlwZShDb252ZXJ0ZXJVdGlscy5oYXNYbWxMaXN0QW5ub3RhdGlvbihwYXJhbUFubm90YXRpb25zW2ldKSk7Ci0gICAgICAgICAgICBwZGNMaXN0LmFkZChwZGMpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwZGNMaXN0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBhdHRhY2ggQFdlYlBhcmFtIGFubm90YXRpb24gZGF0YSB0byB0aGUgPGNvZGU+IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIGlmIHRoZSBhbm5vdGF0aW9uIHdhcyBmb3VuZCBvbiB0aGUgcGFyYW1ldGVyIHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5kZXggaW4gdGhlIHBhcmFtZXRlciBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHBkYyAgIC0gPGNvZGU+UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+Ci0gICAgICogQHBhcmFtIG9yZGVyIC0gdGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIHBhcmFtZXRlciBsaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFdlYlBhcmFtQW5ub3RhdGlvbihQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMsIGludCBvcmRlcikgewotICAgICAgICBBbm5vdGF0aW9uW10gb3JkZXJBbm5vdHMgPSBwYXJhbUFubm90YXRpb25zW29yZGVyXTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90IDogb3JkZXJBbm5vdHMpIHsKLSAgICAgICAgICAgIGlmIChhbm5vdCBpbnN0YW5jZW9mIFdlYlBhcmFtKSB7Ci0gICAgICAgICAgICAgICAgV2ViUGFyYW0gd2ViUGFyYW0gPSAoV2ViUGFyYW0pYW5ub3Q7Ci0gICAgICAgICAgICAgICAgV2ViUGFyYW1Bbm5vdCB3cEFubm90ID0gV2ViUGFyYW1Bbm5vdC5jcmVhdGVXZWJQYXJhbUFubm90SW1wbCgpOwotICAgICAgICAgICAgICAgIHdwQW5ub3Quc2V0SGVhZGVyKHdlYlBhcmFtLmhlYWRlcigpKTsKLSAgICAgICAgICAgICAgICB3cEFubm90LnNldE1vZGUod2ViUGFyYW0ubW9kZSgpKTsKLSAgICAgICAgICAgICAgICB3cEFubm90LnNldE5hbWUod2ViUGFyYW0ubmFtZSgpKTsKLSAgICAgICAgICAgICAgICB3cEFubm90LnNldFBhcnROYW1lKHdlYlBhcmFtLnBhcnROYW1lKCkpOwotICAgICAgICAgICAgICAgIHdwQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHdlYlBhcmFtLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICBwZGMuc2V0V2ViUGFyYW1Bbm5vdCh3cEFubm90KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQXR0YWNobWVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9BdHRhY2htZW50RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTIwMzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9BdHRhY2htZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudFR5cGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCi0NCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzDQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkF0dGFjaG1lbnREZXNjcmlwdGlvbiB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsLmNsYXNzKTsNCi0gICAgDQotICAgIHByaXZhdGUgQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFR5cGU7DQotICAgIHByaXZhdGUgU3RyaW5nW10gbWltZVR5cGVzOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBhdHRhY2htZW50VHlwZQ0KLSAgICAgKiBAcGFyYW0gbWltZVR5cGVzDQotICAgICAqLw0KLSAgICBwdWJsaWMgQXR0YWNobWVudERlc2NyaXB0aW9uSW1wbChBdHRhY2htZW50VHlwZSBhdHRhY2htZW50VHlwZSwgU3RyaW5nW10gbWltZVR5cGVzKSB7DQotICAgICAgICB0aGlzLmF0dGFjaG1lbnRUeXBlID0gYXR0YWNobWVudFR5cGU7DQotICAgICAgICB0aGlzLm1pbWVUeXBlcyA9IG1pbWVUeXBlczsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZyA9IHRvU3RyaW5nKCk7DQotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGVkIEF0dGFjaG1lbnREZXNjcmlwdGlvbkltcGwiKTsNCi0gICAgICAgICAgICBsb2cuZGVidWcoZGVidWdTdHJpbmcpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBdHRhY2htZW50VHlwZSBnZXRBdHRhY2htZW50VHlwZSgpIHsNCi0gICAgICAgIHJldHVybiBhdHRhY2htZW50VHlwZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWltZVR5cGVzKCkgew0KLSAgICAgICAgcmV0dXJuIG1pbWVUeXBlczsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsNCi0gICAgICAgIGZpbmFsIFN0cmluZyBzYW1lbGluZSA9ICI7ICI7DQotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLSAgICAgICAgDQotICAgICAgICBzdHJpbmcuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOw0KLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsNCi0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgQXR0YWNobWVudCBUeXBlOiAiICsgZ2V0QXR0YWNobWVudFR5cGUoKSk7DQotICAgICAgICAvLw0KLSAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsNCi0gICAgICAgIHN0cmluZy5hcHBlbmQoIiAgTWltZSBUeXBlczogIiArIGdldE1pbWVUeXBlcygpKTsNCi0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0Rlc2NyaXB0aW9uRmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWUzNTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi0vKioKLSAqIAotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5tZXRhZGF0YS5TZXJ2aWNlTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3IuRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnZhbGlkYXRvci5TZXJ2aWNlRGVzY3JpcHRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDcmVhdGVzIHRoZSBKQVgtV1MgbWV0YWRhdGEgZGVzY3JpdHBpb24gaGllcmFjaHkgZnJvbSBzb21lIGNvbWJpbmF0aW9ucyBvZiBXU0RMLCBKYXZhIGNsYXNzZXMKLSAqIHdpdGggYW5ub3RhdGlvbnMsIGFuZCAoaW4gdGhlIGZ1dHVyZSkgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGFuZCBpcwotICogbm90IGludGVuZGVkIHRvIGJlIGEgcHVibGljIEFQSS4gIFRoZSBBUEkgaXM6Ci0gKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25GYWN0b3J5SW1wbCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxEZXNjcmlwdGlvbktleSwgU2VydmljZURlc2NyaXB0aW9uPiBjYWNoZSA9Ci0gICAgICAgICAgICBuZXcgSGFzaHRhYmxlPERlc2NyaXB0aW9uS2V5LCBTZXJ2aWNlRGVzY3JpcHRpb24+KCk7Ci0KLSAgICAvKiogQSBEZXNjcnB0aW9uRmFjdG9yeSBjYW4gbm90IGJlIGluc3RhbnRpYXRlZDsgYWxsIG1ldGhvZHMgYXJlIHN0YXRpYy4gKi8KLSAgICBwcml2YXRlIERlc2NyaXB0aW9uRmFjdG9yeUltcGwoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSNjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMLCBRTmFtZSwgQ2xhc3MsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMIHdzZGxVUkwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBzZXJ2aWNlQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbih3c2RsVVJMLCBzZXJ2aWNlUU5hbWUsIHNlcnZpY2VDbGFzcywgbnVsbCwgbnVsbCk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFVSTCwKLSAgICAgKiAgICAgIFFOYW1lLCBDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVVJMIHdzZGxVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5KSB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKQotICAgICAgICAgICAgICAgIC5nZXRDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBEZXNjcmlwdGlvbktleSBrZXkgPSBuZXcgRGVzY3JpcHRpb25LZXkoc2VydmljZVFOYW1lLCB3c2RsVVJMLCBzZXJ2aWNlQ2xhc3MsIGNvbmZpZ0NvbnRleHQpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FjaGUgTWFwID0gIiArIGNhY2hlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVzY3JpcHRpb24gS2V5ID0gIiArIGtleS5wcmludEtleSgpKTsKLQotICAgICAgICB9Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZChjb25maWdDb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNrIHRvIHNlZSBpZiBTZXJ2aWNlRGVzY3JpcHRpb24gaXMgZm91bmQgaW4gY2FjaGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VEZXNjID0gY2FjaGUuZ2V0KGtleSk7Ci0KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uIGZvdW5kIGluIHRoZSBjYWNoZSIpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc2VydmljZURlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlcnZpY2VEZXNjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzY3JpcHRpb24gbm90IGZvdW5kIGluIHRoZSBjYWNoZSIpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiBjcmVhdGluZyBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc2VydmljZURlc2NJbXBsID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NJbXBsID0gbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwod3NkbFVSTCwgc2VydmljZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xhc3MsIHNwYXJzZUNvbXBvc2l0ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZUtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDbGllbnQtc2lkZSBzZXJ2aWNlIGRlc2NyaXB0aW9uIGNyZWF0ZWQgd2l0aCBzZXJ2aWNlIGNsYXNzOiAiICsgc2VydmljZUNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBTZXJ2aWNlIFFOOiAiICsgc2VydmljZVFOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBhbmQgREJDOiAiICsgc3BhcnNlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhzZXJ2aWNlRGVzY0ltcGwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjSW1wbCA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKHdzZGxVUkwsIHNlcnZpY2VRTmFtZSwgc2VydmljZUNsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VydmljZURlc2NJbXBsLnNldEF4aXNDb25maWdDb250ZXh0KGNvbmZpZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjID0gc2VydmljZURlc2NJbXBsOwotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjcmlwdGlvbiBjcmVhdGVkIHdpdGggV1NETCBVUkw6ICIgKyB3c2RsVVJMICsgIjsgUU5hbWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVFOYW1lICsgIjsgQ2xhc3M6ICIgKyBzZXJ2aWNlQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc2VydmljZURlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhY2hpbmcgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbiBpbiB0aGUgY2FjaGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FjaGUucHV0KGtleSwgc2VydmljZURlc2MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBIHNlcnZpY2UgZGVzY3JpcHRpb24gd2FzIGZvdW5kIGluIHRoZSBjYWNoZS4gIElmIGEgc3BhcnNlIGNvbXBvc2l0ZSB3YXMKLSAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQsIHRoZW4gc2V0IGl0IG9uIHRoZSBmb3VuZCBzZXJ2aWNlIGRlc2MKLSAgICAgICAgICAgICAgICAoKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwpIHNlcnZpY2VEZXNjKS5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS4KLSAgICAgICAgICAgICAgICAgICAgc2V0U3BhcnNlQ29tcG9zaXRlKHNwYXJzZUNvbXBvc2l0ZUtleSwgc3BhcnNlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc2VydmljZURlc2MpLnJlZ2lzdGVyVXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFycyB0aGUgZW50aXJlIFNlcnZpY2VEZXNjcmlwdGlvbiBjYWNoZS4KLSAgICAgKiAKLSAgICAgKiA8aDQ+Tm90ZTwvaDQ+ICAgICAKLSAgICAgKiBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGNhdXNlIHVucHJlZGljdGFibGUgcmVzdWx0cyB3aGVuIGNvbmZpZ3VyYXRpb24gY29udGV4dHMgYXJlIGJlaW5nIHJldXNlZAotICAgICAqIGFuZC9vciB0aGVyZSBhcmUgb3V0c3RhbmRpbmcgcmVxdWVzdHMgdXNpbmcgdGhlIGNhY2hlZCBTZXJ2aWNlRGVzY3JpcHRpb24gb2JqZWN0cy4gQWxzbywgCi0gICAgICogaW4tZmxpZ2h0IHJlcXVlc3RzIChib3RoIGNsaWVudCBhbmQgc2VydmVyKSB1c2luZyBTZXJ2aWNlRGVsZWdhdGVzIE1VU1QgYmUgZG9uZSBhbmQgb3V0IG9mCi0gICAgICogc2NvcGUgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJTZXJ2aWNlRGVzY3JpcHRpb25DYWNoZSgpIHsKLSAgICAgICAgY2FjaGUuY2xlYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIGFsbCB0aGUgU2VydmljZURlc2NyaXB0aW9uIG9iamVjdHMgaW4gdGhlIGNhY2hlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIAotICAgICAqIGNvbmZpZ3VyYXRpb24gY29udGV4dC4KLSAgICAgKiAKLSAgICAgKiA8aDQ+Tm90ZTwvaDQ+Ci0gICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHRvIGNsZWFyIHRoZSBjYWNoZSB3aGVuIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICogd2lsbCBub3QgYmUgdXNlZCBhbnltb3JlIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgdXNpbmcgdGhlIGFzc29jaWF0ZWQgCi0gICAgICogU2VydmljZURlc2NyaXB0aW9uIG9iamVjdHMuIEFsc28sIGluLWZsaWdodCByZXF1ZXN0cyAoYm90aCBjbGllbnQgYW5kIHNlcnZlcikgdXNpbmcgCi0gICAgICogU2VydmljZURlbGVnYXRlcyBNVVNUIGJlIGRvbmUgYW5kIG91dCBvZiBzY29wZSBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLiAgICAgIAotICAgICAqIE90aGVyd2lzZSwgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG1pZ2h0IG9jY3VyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25maWdDb250ZXh0IFRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cyBpbiB0aGUgY2FjaGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyU2VydmljZURlc2NyaXB0aW9uQ2FjaGUoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgewotICAgICAgICBpZiAoY29uZmlnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChjb25maWdDb250ZXh0KSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8RGVzY3JpcHRpb25LZXk+IGl0ZXIgPSBjYWNoZS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbktleSBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5nZXRDb25maWdDb250ZXh0KCkgPT0gY29uZmlnQ29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgCi0gICAgCi0gICAgLyoqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKENsYXNzKSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihDbGFzcyBzZXJ2aWNlSW1wbENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oc2VydmljZUltcGxDbGFzcywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKENsYXNzKSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihDbGFzcyBzZXJ2aWNlSW1wbENsYXNzLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VJbXBsQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPSBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCwgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZURlc2NMaXN0ICE9IG51bGwgJiYgc2VydmljZURlc2NMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzYyA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uIGNyZWF0ZWQgd2l0aCBjbGFzczogIiArIHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoc2VydmljZURlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NpcHRpb24gd2FzIG5vdCBjcmVhdGVkIGZvciBjbGFzczogIiArIHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZVNlcnZpY2VEZXNjckVyciIsIHNlcnZpY2VJbXBsQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjOwotICAgIH0KLQotICAgIC8qKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5I2NyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoSGFzaE1hcCkgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKAotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJjcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKEhhc2htYXA8U3RyaW5nLERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4sQ29uZmlndXJhdGlvbkNvbnRleHQgIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjcmlwdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IG5hbWVJdGVyID0gZGJjTWFwLnZhbHVlcygpCi0gICAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7IG5hbWVJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZXJ2aWNlSW1wbENvbXBvc2l0ZSA9IG5hbWVJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpc0ltcGwoc2VydmljZUltcGxDb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGlzIGltcGwgY2xhc3MKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhpcyBEQkMgcmVwcmVzZW50cyBhIHNpbmdsZSB3c2RsOnNlcnZpY2UgCi0gICAgICAgICAgICAgICAgU2V0PFFOYW1lPiBzUU5hbWVzID0gc2VydmljZUltcGxDb21wb3NpdGUuZ2V0U2VydmljZVFOYW1lcygpOwotICAgICAgICAgICAgICAgIGlmKHNRTmFtZXMgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNRTmFtZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgU2VydmljZURlc2NyaXB0aW9uIGluc3RhbmNlcyBmcm9tIGNvbXBvc2l0ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc2VydmljZURlc2NyaXB0aW9uID0gbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJjTWFwLCBzZXJ2aWNlSW1wbENvbXBvc2l0ZSwgY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvciB2YWxpZGF0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvcihzZXJ2aWNlRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yLnZhbGlkYXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbkxpc3QuYWRkKHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2UgRGVzY3JpcHRpb24gY3JlYXRlZCBmcm9tIERlc2NyaXB0aW9uQ29tcG9zaXRlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZVNydmNEZXNjckRCQ01hcEVyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJbXBsQ29tcG9zaXRlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoaXMgREJDIHJlcHJlc2VudHMgbXVsdGlwbGUgd3NkbDpzZXJ2aWNlcwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxRTmFtZT4gc1FOYW1lSXRlciA9IHNRTmFtZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoc1FOYW1lSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHNRTmFtZSA9IHNRTmFtZUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBTZXJ2aWNlRGVzY3JpcHRpb24gZnJvbSBzZXJ2aWNlIFFOYW1lIHNldCBmb3IgOiAiICsgc1FOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc2VydmljZURlc2NyaXB0aW9uID0gbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoZGJjTWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxDb21wb3NpdGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yIHZhbGlkYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvcihzZXJ2aWNlRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvci52YWxpZGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uTGlzdC5hZGQoc2VydmljZURlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlIERlc2NyaXB0aW9uIGNyZWF0ZWQgZnJvbSBEZXNjcmlwdGlvbkNvbXBvc2l0ZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlU3J2Y0Rlc2NyREJDTWFwRXJyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW1wbENvbXBvc2l0ZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiREJDIGlzIG5vdCBhIHNlcnZpY2UgaW1wbDogIiArIHNlcnZpY2VJbXBsQ29tcG9zaXRlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IFByb2Nlc3MgYWxsIGNvbXBvc2l0ZXMgdGhhdCBhcmUgV2ViRmF1bHRzLi4uY3VycmVudCB0aGlua2luZyBpcwotICAgICAgICAvLyB0aGF0Ci0gICAgICAgIC8vIHNpbmNlIFdlYkZhdWx0IGFubm90YXRpb25zIG9ubHkgZXhpc3Qgb24gZXhjZXB0aW9uIGNsYXNzZXMsIHRoZW4gdGhleQotICAgICAgICAvLyBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZW1zZWx2ZXMsIGFuZCBhdCB0aGlzIGxldmVsCi0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VEZXNjcmlwdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICogICAgICBDbGFzcywgUU5hbWUsIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gdXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgbnVsbCwgbnVsbCwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5I3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwKLSAgICAgKiAgICAgIENsYXNzLCBRTmFtZSwgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLCBDbGFzcyBzZWksIFFOYW1lIHBvcnRRTmFtZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlIHVwZGF0ZVR5cGUsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXksIFN0cmluZyBiaW5kaW5nSWQsIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgcmV0dXJuIHVwZGF0ZUVuZHBvaW50KHNlcnZpY2VEZXNjcmlwdGlvbiwgc2VpLCBwb3J0UU5hbWUsIHVwZGF0ZVR5cGUsIG51bGwsIHNlcnZpY2VEZWxlZ2F0ZUtleSwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5I3VwZGF0ZUVuZHBvaW50KFNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3MsIFFOYW1lLCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50KAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiwgQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLCAKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5LAotICAgICAgICAgICAgU3RyaW5nIGJpbmRpbmdJZCwgCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gbnVsbDsKLSAgICAgICAgc3luY2hyb25pemVkKHNlcnZpY2VEZXNjcmlwdGlvbikgewotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYyA9IAotICAgICAgICAgICAgICAgICgoU2VydmljZURlc2NyaXB0aW9uSW1wbClzZXJ2aWNlRGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAudXBkYXRlRW5kcG9pbnREZXNjcmlwdGlvbihzZWksIHBvcnRRTmFtZSwgdXBkYXRlVHlwZSwgY29tcG9zaXRlLCBzZXJ2aWNlRGVsZWdhdGVLZXksIGJpbmRpbmdJZCwgZW5kcG9pbnRBZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yIGVuZHBvaW50VmFsaWRhdG9yID0gbmV3IEVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3IoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNFbmRwb2ludFZhbGlkID0gZW5kcG9pbnRWYWxpZGF0b3IudmFsaWRhdGUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghaXNFbmRwb2ludFZhbGlkKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRpb25FcnJvcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRWYWxpZGF0b3IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlZDogIiArIGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNldFByb3BlcnRpZXNPbkVuZHBvaW50RGVzYyhlbmRwb2ludERlc2MsIGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZW5kcG9pbnREZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uLAotICAgICAqIENsYXNzLCBFbmRwb2ludFJlZmVyZW5jZSwgU3RyaW5nLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLCBDbGFzcyBzZWksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gdXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgdXBkYXRlVHlwZSwgbnVsbCwgbnVsbCwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3RvcnkjdXBkYXRlRW5kcG9pbnQoU2VydmljZURlc2NyaXB0aW9uLAotICAgICAqIENsYXNzLCBFbmRwb2ludFJlZmVyZW5jZSwgU3RyaW5nLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW5kcG9pbnREZXNjcmlwdGlvbiB1cGRhdGVFbmRwb2ludCgKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24sIENsYXNzIHNlaSwgRW5kcG9pbnRSZWZlcmVuY2UgZXByLAotICAgICAgICAgICAgU3RyaW5nIGFkZHJlc3NpbmdOYW1lc3BhY2UsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSwgU3RyaW5nIGJpbmRpbmdJZCwgU3RyaW5nIGVuZHBvaW50QWRkcmVzcykgewotICAgICAgICByZXR1cm4gdXBkYXRlRW5kcG9pbnQoc2VydmljZURlc2NyaXB0aW9uLCBzZWksIGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSwgdXBkYXRlVHlwZSwgbnVsbCwgc3BhcnNlQ29tcG9zaXRlS2V5LCBiaW5kaW5nSWQsIGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeSN1cGRhdGVFbmRwb2ludChTZXJ2aWNlRGVzY3JpcHRpb24sCi0gICAgICogQ2xhc3MsIEVuZHBvaW50UmVmZXJlbmNlLCBTdHJpbmcsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50RGVzY3JpcHRpb24gdXBkYXRlRW5kcG9pbnQoCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2NyaXB0aW9uLCBDbGFzcyBzZWksIEVuZHBvaW50UmVmZXJlbmNlIGVwciwKLSAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzaW5nTmFtZXNwYWNlLAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUgdXBkYXRlVHlwZSwKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5LCBTdHJpbmcgYmluZGluZ0lkLCBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZU5hbWUgc2VydmljZU5hbWUgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5nZXRTZXJ2aWNlTmFtZU1ldGFkYXRhKGVwciwgYWRkcmVzc2luZ05hbWVzcGFjZSk7Ci0gICAgICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBzZXJ2aWNlRGVzY3JpcHRpb24uZ2V0U2VydmljZVFOYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vV2UgbmVlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNlcnZpY2UgbmFtZSBpbiB0aGUgRVBSIG1ldGFkYXRhIGRvZXMgbm90Ci0gICAgICAgICAgICAvL21hdGNoIHRoZSBzZXJ2aWNlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVgtV1Mgc2VydmljZSBpbnN0YW5jZS4KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZS5nZXROYW1lKCkgIT0gbnVsbCAmJiAhc2VydmljZVFOYW1lLmVxdWFscyhzZXJ2aWNlTmFtZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZU5hbWVNaXNtYXRjaCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lLmdldE5hbWUoKS50b1N0cmluZygpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9JZiBhIHBvcnQgbmFtZSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgRVBSIG1ldGFkYXRhIHRoZW4gdXNlIHRoYXQsIG90aGVyd2lzZQotICAgICAgICAgICAgLy9sZWF2ZSBpdCB0byB0aGUgcnVudGltZSB0byBmaW5kIGEgc3VpdGFibGUgcG9ydCwgYmFzZWQgb24gV1NETC9hbm5vdGF0aW9ucy4KLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZS5nZXRFbmRwb2ludE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9ydFFOYW1lID0gbmV3IFFOYW1lKHNlcnZpY2VRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgc2VydmljZU5hbWUuZ2V0RW5kcG9pbnROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgidXBkYXRlRW5kcG9pbnRFcnJvciIsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB1cGRhdGVFbmRwb2ludChzZXJ2aWNlRGVzY3JpcHRpb24sIHNlaSwgcG9ydFFOYW1lLCB1cGRhdGVUeXBlLCBjb21wb3NpdGUsIHNwYXJzZUNvbXBvc2l0ZUtleSwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBnaXZlbiBEQkMgcmVwcmVzZW50cyBhIFdlYiBzZXJ2aWNlCi0gICAgICogaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGJjIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5ib29sZWFuPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbXBsKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLSAgICAgICAgaWYgKCFkYmMuaXNJbnRlcmZhY2UoKQotICAgICAgICAgICAgICAgICYmIChkYmMuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCB8fCBkYmMKLSAgICAgICAgICAgICAgICAuZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCBhbnkgcHJvcGVydGllcyBzdXBwbGllZCBvbiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGluc3RhbmNlCi0gICAgICogb24gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24uIElmIHRoZSBEQkMgaXMgbnVsbCBvciB0aGVyZSBhcmUgbm8gcHJvcGVydGllcyBwcmVzZW50LCB0aGlzCi0gICAgICogbWV0aG9kIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgc2V0UHJvcGVydGllc09uRW5kcG9pbnREZXNjKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlKSB7Ci0gICAgICAgIGlmKGNvbXBvc2l0ZSAhPSBudWxsIAotICAgICAgICAgICAgICAgICYmIAotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIWNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IoU3RyaW5nIGtleSA6IGNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjb21wb3NpdGUuZ2V0UHJvcGVydGllcygpLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2V0dGluZyBwcm9wZXJ0eSBmcm9tIERCQyBvbnRvIEVuZHBvaW50RGVzY3JpcHRpb24sIGtleT0gIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ICsgIiwgdmFsdWU9ICIgKyB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIGNyZWF0ZVJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb25JbXBsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gaW5zdGFuY2UgZnJvbSB0aGUgY2xpZW50LXNpZGUgY2FjaGUgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogc2VydmljZSBkZWxlZ2F0ZXMgdXNpbmcgaXQuICBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGluIGEgc3luYyBibG9jayBzbyB0aGF0IGEgbG9va3VwIAotICAgICAqIGluIGNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbiBkb2Vzbid0IGFjY2VzcyB0aGUgY2FjaGUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN2Y0Rlc2MgVGhlIGluc3RhbmNlIHRvIGJlIHJlbW92ZWQuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbUNhY2hlKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzYykgewotICAgICAgICBib29sZWFuIHN2Y0Rlc2NSZW1vdmVkID0gZmFsc2U7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBzdmNEZXNjLmdldEF4aXNDb25maWdDb250ZXh0KCk7Ci0gICAgICAgIHN5bmNocm9uaXplZChjb25maWdDb250ZXh0KSB7Ci0gICAgICAgICAgICBzdmNEZXNjLmRlcmVnaXN0ZXJVc2UoKTsKLSAgICAgICAgICAgIGlmIChzdmNEZXNjLmlzSW5Vc2UoKSkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjcmlwdGlvbiBzdGlsbCBpbiB1c2U7IG5vdCByZW1vdmVkIGZyb20gY2FjaGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3ZjRGVzY1JlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VydmljZURlc2NyaXB0aW9uIG5vdCBpbiB1c2U7IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGNhY2hlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN2Y0Rlc2NSZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PERlc2NyaXB0aW9uS2V5LCBTZXJ2aWNlRGVzY3JpcHRpb24+PiBjYWNoZUVudHJ5U2V0ID0gCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PERlc2NyaXB0aW9uS2V5LCBTZXJ2aWNlRGVzY3JpcHRpb24+PiBjYWNoZUVudHJ5SXRlcmF0b3IgPQotICAgICAgICAgICAgICAgICAgICBjYWNoZUVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNhY2hlRW50cnlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PERlc2NyaXB0aW9uS2V5LCBTZXJ2aWNlRGVzY3JpcHRpb24+IGVudHJ5ID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUVudHJ5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZW50cnlTdmNEZXNjVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjRGVzYyA9PSBlbnRyeVN2Y0Rlc2NWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVFbnRyeUl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmVkIHNlcnZpY2UgZGVzY3JpcHRpb24gZnJvbSBjYWNoZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdmNEZXNjUmVtb3ZlZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0Rlc2NyaXB0aW9uVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTlhYjdjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRGVzY3JpcHRpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzLkNPTlNUUlVDVE9SX01FVEhPRDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJNZXRob2RBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKiogVXRpbGl0aWVzIHVzZWQgdGhyb3VnaG91dCB0aGUgRGVzY3JpcHRpb24gcGFja2FnZS4gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVzY3JpcHRpb25VdGlscy5jbGFzcyk7Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIChzdHJpbmcgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc3RyaW5nKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gcW5hbWUgPT0gbnVsbCB8fCBpc0VtcHR5KHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBSZXR1cm5zIFRSVUUgaWYgd2UgZmluZCBqdXN0IG9uZSBXZWJNZXRob2QgQW5ub3RhdGlvbiB3aXRoIGV4Y2x1ZGUgZmxhZyBzZXQgdG8gZmFsc2UgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBmYWxzZUV4Y2x1c2lvbnNFeGlzdChEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG51bGw7Ci0gICAgICAgIEl0ZXJhdG9yPE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBpdGVyID0gZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgbWRjID0gaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFdlYk1ldGhvZEFubm90IHdtYSA9IG1kYy5nZXRXZWJNZXRob2RBbm5vdCgpOwotICAgICAgICAgICAgaWYgKHdtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdtYS5leGNsdWRlKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdhdGhlcnMgYWxsIE1ldGhvZERlc2NyaXB0aW9uQ29tcHNpdGUncyB0aGF0IGNvbnRhaW4gYSBXZWJNZXRob2QgQW5ub3RhdGlvbiB3aXRoIHRoZSBleGNsdWRlCi0gICAgICogc2V0IHRvIEZBTFNFCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4KLSAgICAgKi8KLSAgICBzdGF0aWMgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBnZXRNZXRob2RzV2l0aEZhbHNlRXhjbHVzaW9ucygKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLSAgICAgICAgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPSBkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuZmFsc2VFeGNsdXNpb25zRXhpc3QoZGJjKSkgewotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1kYy5nZXRXZWJNZXRob2RBbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1kYy5nZXRXZWJNZXRob2RBbm5vdCgpLmV4Y2x1ZGUoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWRjLnNldERlY2xhcmluZ0NsYXNzKGRiYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZGNMaXN0LmFkZChtZGMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1kY0xpc3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgICogQ2hlY2sgd2hldGhlciBhIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGNvbnRhaW5zIGEgV2ViTWV0aG9kIGFubm90YXRpb24gd2l0aAotICAgICAgKiBleGx1ZGUgc2V0IHRvIHRydWUKLSAgICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNFeGNsdWRlVHJ1ZShNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMpIHsKLQotICAgICAgICBpZiAobWRjLmdldFdlYk1ldGhvZEFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1kYy5nZXRXZWJNZXRob2RBbm5vdCgpLmV4Y2x1ZGUoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBqYXZpZnlDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpZiAoY2xhc3NOYW1lLmluZGV4T2YoIi8iKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlQWxsKCIvIiwgIi4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgd2l0aG91dCBhbnkgcGFja2FnZSBxdWFsaWZpZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhlQ2xhc3MKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBzYW5zIHBhY2thZ2UgcXVhbGlmaWNhdGlvbi4KLSAgICAgKi8KLSAgICBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZUphdmFDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHJldHVybk5hbWUgPSBudWxsOwotCi0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBmcU5hbWUgPSBuYW1lOwotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRoZSAic2ltcGxlIG5hbWUiLCBzbyBzdHJpcCBvZmYgYW55IHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgbmFtZQotICAgICAgICAgICAgaW50IGVuZE9mUGFja2FnZUluZGV4ID0gZnFOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgICAgICBpbnQgc3RhcnRPZkNsYXNzSW5kZXggPSBlbmRPZlBhY2thZ2VJbmRleCArIDE7Ci0gICAgICAgICAgICByZXR1cm5OYW1lID0gZnFOYW1lLnN1YnN0cmluZyhzdGFydE9mQ2xhc3NJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIGZyb20gdGhlIGNsYXNzLiAgSWYgbm8gcGFja2FnZSwgdGhlbiByZXR1cm5zIG51bGwKLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVDbGFzc05hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBnZXRKYXZhUGFja2FnZU5hbWUoU3RyaW5nIHRoZUNsYXNzTmFtZSkgewotICAgICAgICBTdHJpbmcgcmV0dXJuUGFja2FnZSA9IG51bGw7Ci0gICAgICAgIGlmICh0aGVDbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGZxTmFtZSA9IHRoZUNsYXNzTmFtZTsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgcGFja2FnZSBuYW1lLCBpZiB0aGVyZSBpcyBvbmUKLSAgICAgICAgICAgIGludCBlbmRPZlBhY2thZ2VJbmRleCA9IGZxTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgaWYgKGVuZE9mUGFja2FnZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm5QYWNrYWdlID0gZnFOYW1lLnN1YnN0cmluZygwLCBlbmRPZlBhY2thZ2VJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblBhY2thZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYLVdTIG5hbWVzcGFjZSBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBOT19QQUNLQUdFX0hPU1RfTkFNRSA9ICJEZWZhdWx0TmFtZXNwYWNlIjsKLQotICAgIHN0YXRpYyBTdHJpbmcgbWFrZU5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBwcm90b2NvbCkgewotICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHByb3RvY29sKSkgewotICAgICAgICAgICAgcHJvdG9jb2wgPSAiaHR0cCI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm90b2NvbCArICI6Ly8iICsgTk9fUEFDS0FHRV9IT1NUX05BTUU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYWNrYWdlTmFtZSwgIi4iKTsKLSAgICAgICAgU3RyaW5nW10gd29yZHMgPSBuZXcgU3RyaW5nWyBzdC5jb3VudFRva2VucygpIF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpCi0gICAgICAgICAgICB3b3Jkc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoODApOwotICAgICAgICBmb3IgKGludCBpID0gd29yZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIFN0cmluZyB3b3JkID0gd29yZHNbaV07Ci0gICAgICAgICAgICAvLyBzZXBlcmF0ZSB3aXRoIGRvdAotICAgICAgICAgICAgaWYgKGkgIT0gd29yZHMubGVuZ3RoIC0gMSkKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCh3b3JkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvdG9jb2wgKyAiOi8vIiArIHNiLnRvU3RyaW5nKCkgKyAiLyI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbWV0aG9kIHNob3VsZCBoYXZlIGFuIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGNyZWF0ZWQgZm9yIGl0IGJhc2VkIG9uIHRoZQotICAgICAqIG5hbWUuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gYWxsb3cgdXMgdG8gZXhsdWRlIG1ldGhvZHMgc3VjaCBhcyBjb25zdHJ1Y3RvcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBjcmVhdGVPcGVyYXRpb25EZXNjcmlwdGlvbihTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBpZiAobWV0aG9kTmFtZS5lcXVhbHMoQ09OU1RSVUNUT1JfTUVUSE9EKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgd2lsbCBvcGVuIGEgc3RyZWFtIHRvIGFuIEBIYW5kbGVyQ2hhaW4gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ0ZpbGUgIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lICAgLSBUaGUgY2xhc3MgaW4gd2hpY2ggdGhlIGFubm90YXRpb24gd2FzIGRlY2xhcmVkLiBUaGlzIGlzIHVzZWQgaW4gY2FzZSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgZmlsZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciAtIENsYXNzTG9hZGVyIHVzZWQgdG8gbG9hZCByZWxhdGl2ZSBmaWxlIHBhdGhzLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIG9wZW5IYW5kbGVyQ29uZmlnU3RyZWFtKFN0cmluZyBjb25maWdGaWxlLCBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gY29uZmlnU3RyZWFtID0gbnVsbDsKLSAgICAgICAgVVJMIGNvbmZpZ1VSTDsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkF0dGVtcHRpbmcgdG8gbG9hZCBASGFuZGxlckNoYWluIGNvbmZpZ3VyYXRpb24gZmlsZTogIiArIGNvbmZpZ0ZpbGUgKwotICAgICAgICAgICAgICAgICAgICAiIHJlbGF0aXZlIHRvIGNsYXNzOiAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29uZmlnVVJMID0gbmV3IFVSTChjb25maWdGaWxlKTsKLSAgICAgICAgICAgIGlmIChjb25maWdVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGFic29sdXRlIEBIYW5kbGVyQ2hhaW4gY29uZmlndXJhdGlvbiBmaWxlOiAiICsgY29uZmlnRmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ1N0cmVhbSA9IGNvbmZpZ1VSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyB0cnkgYW5vdGhlciBtZXRob2QgdG8gb2J0YWluIGEgc3RyZWFtIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcmVwb3J0IHRoaXMgc2luY2UgaXQgd2FzIGEgdmFsaWQgVVJMIGJ1dCB0aGUgb3BlblN0cmVhbSBjYXVzZWQgYSBwcm9ibGVtCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImhjQ29uZmlnTG9hZEZhaWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUsIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlnU3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQEhhbmRsZXJDaGFpbi5maWxlIGF0dHJpYnV0ZSByZWZlcnMgdG8gYSByZWxhdGl2ZSBsb2NhdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjb25maWdGaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCIuIiwgIi8iKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzb2x2aW5nIEBIYW5kbGVyQ2hhaW4gY29uZmlndXJhdGlvbiBmaWxlOiAiICsgY29uZmlnRmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWxhdGl2ZSB0byBjbGFzcyBmaWxlOiAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB1cmkgPSB1cmkucmVzb2x2ZShjb25maWdGaWxlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRQYXRoID0gdXJpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQEhhbmRsZXJDaGFpbi5maWxlIHJlc29sdmVkIGZpbGUgcGF0aCBsb2NhdGlvbjogIiArIHJlc29sdmVkUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ1N0cmVhbSA9IGdldElucHV0U3RyZWFtKHJlc29sdmVkUGF0aCwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJoY0NvbmZpZ0xvYWRGYWlsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRmlsZSwgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlnU3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5OUyIsCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGaWxlLCBjbGFzc05hbWUpKTsKLSAgICAgICAgICAgIC8vIE5vIGxvbmdlciB0aHJvd2luZyBhbiBleGNlcHRpb24gaGVyZS4gIFRoaXMgbWV0aG9kIGlzIGJlc3QtZWZmb3J0LCBhbmQgdGhlIGNhbGxlciBtYXkKLSAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIHBhdGggaXMgcmVsYXRpdmUgYW5kIHRyeSBhZ2Fpbi4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgICAgICAgICAgIC8vIGZvciBkZXRlcm1pbmluZyB3aGVuIHRvICJnaXZlIHVwIgotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJASGFuZGxlckNoYWluIGNvbmZpZ3VyYXRpb24gZmFpbDogIiArIGNvbmZpZ0ZpbGUgKyAiIGluIGNsYXNzOiAiICsgY2xhc3NOYW1lICsgIiBmYWlsZWQgdG8gbG9hZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQEhhbmRsZXJDaGFpbiBjb25maWd1cmF0aW9uIGZpbGU6ICIgKyBjb25maWdGaWxlICsgIiBpbiBjbGFzczogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgKyAiIHdhcyBzdWNjZXNzZnVsbHkgbG9hZGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25maWdTdHJlYW07Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyBwYXRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBJbnB1dFN0cmVhbSBjb25maWdTdHJlYW0gPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgICAgICBpZiAoY29uZmlnU3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHRyeSBhbm90aGVyIGNsYXNzbG9hZGVyCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IFN5c3RlbS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdTdHJlYW0gPSBjbC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWdTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gYW5kIGFub3RoZXIgY2xhc3Nsb2FkZXIKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIGlmIChjbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnU3RyZWFtID0gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnU3RyZWFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERldGVybWluZSBpcyB0aGlzIG1ldGhvZCBpcyBhbiBhc3luYyBtZXRob2QKLSAgICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIG1ldGhvZCB0byBleGFtaW5lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FzeW5jKE1ldGhvZCBtZXRob2QpIHsKLQotICAgICAgICBpZiAobWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZE5hbWUuZW5kc1dpdGgoIkFzeW5jIikKLSAgICAgICAgICAgICYmIChyZXR1cm5UeXBlLmlzQXNzaWduYWJsZUZyb20oamF2YXgueG1sLndzLlJlc3BvbnNlLmNsYXNzKSB8fCByZXR1cm5UeXBlCi0gICAgICAgICAgICAgICAgLmlzQXNzaWduYWJsZUZyb20oamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlLmNsYXNzKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlckNoYWluc1R5cGUgbG9hZEhhbmRsZXJDaGFpbnMoSW5wdXRTdHJlYW0gaXMsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIYW5kbGVyQ2hhaW5zUGFyc2VyIHBhcnNlciA9IG5ldyBIYW5kbGVyQ2hhaW5zUGFyc2VyKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VyLmxvYWRIYW5kbGVyQ2hhaW5zKGlzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImxvYWRIYW5kbGVyQ2hhaW5FcnIiLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgICB9ICAgICAgIAotICAgIH0KLSAgICAKLQkKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGxvb3AgdGhyb3VnaCBhIGxpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBsb29raW5nIGZvciBvbmUKLSAgICAgKiBvZiBmb3VyIG9iamVjdHM6IFNPQVBCb2R5LCBTT0FQMTJCb2R5LCBTT0FQSGVhZGVyLCBTT0FQMTJIZWFkZXIuIElmIGFueSBvZiB0aGVzZQotICAgICAqIG9iamVjdHMgYXJlIGZvdW5kIHRoZSBuYW1lc3BhY2UgVVJJIGZyb20gdGhpcyBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lc3BhY2VGcm9tU09BUEVsZW1lbnQoTGlzdCBleHRFbGVtZW50cykgewotICAgICAgICBJdGVyYXRvciBleHRJdGVyID0gZXh0RWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGV4dEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgZXh0T2JqID0gZXh0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZXh0T2JqIGluc3RhbmNlb2YgU09BUEJvZHkpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgU09BUEJvZHkgbmFtZXNwYWNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFNPQVBCb2R5KSBleHRPYmopLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUEJvZHkpIGV4dE9iaikuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dE9iaiBpbnN0YW5jZW9mIFNPQVAxMkJvZHkpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgU09BUDEyQm9keSBuYW1lc3BhY2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoU09BUDEyQm9keSkgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoKFNPQVAxMkJvZHkpIGV4dE9iaikuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dE9iaiBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgU09BUEhlYWRlciBuYW1lc3BhY2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoU09BUEhlYWRlcikgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoKFNPQVBIZWFkZXIpIGV4dE9iaikuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dE9iaiBpbnN0YW5jZW9mIFNPQVAxMkhlYWRlcikgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJldHVybmluZyBTT0FQMTJIZWFkZXIgbmFtZXNwYWNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKFNPQVAxMkhlYWRlcikgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoKFNPQVAxMkhlYWRlcikgZXh0T2JqKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGV4dE9iaiBpbnN0YW5jZW9mIE1JTUVNdWx0aXBhcnRSZWxhdGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgYSBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LiAgVW53cmFwcGluZyB0byBnZXQgU09BUCBiaW5kaW5nLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBtaW1lID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRPYmo7Ci0gICAgICAgICAgICAgICAgTGlzdCBtaW1lUGFydHMgPSBtaW1lLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IG1pbWVQYXJ0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1JTUVQYXJ0IG1pbWVQYXJ0ID0gKE1JTUVQYXJ0KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0IGVsZW1lbnRzID0gbWltZVBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbnMgPSBnZXROYW1lc3BhY2VGcm9tU09BUEVsZW1lbnQoZWxlbWVudHMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHByb2Nlc3MgYSBXU0RMIEJpbmRpbmcgYW5kIGJ1aWxkIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBvYmplY3RzIGlmIHRoZQotICAgICAqIFdTREwgZGljYXRhdGVzIGF0dGFjaG1lbnRzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRBdHRhY2htZW50RnJvbUJpbmRpbmcoT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsIG9wRGVzYywgQmluZGluZyBiaW5kaW5nKSB7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGJpbmRpbmdPcEl0ZXIgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChiaW5kaW5nT3BJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBCaW5kaW5nT3BlcmF0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCBPcGVyYXRpb25EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nT3AuZ2V0TmFtZSgpLmVxdWFscyhvcERlc2MuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlByb2Nlc3NpbmcgYmluZGluZyBvcGVydGlvbiBpbnB1dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0JpbmRpbmdGb3JNSU1FKGJpbmRpbmdPcC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjLCBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvY2Vzc2luZyBiaW5kaW5nIG91dHB1dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0JpbmRpbmdGb3JNSU1FKGJpbmRpbmdPcC5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wRGVzYywgYmluZGluZ09wLmdldE9wZXJhdGlvbigpLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGxvb3AgdGhyb3VnaCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgYSBnaXZlbiBCaW5kaW5nSW5wdXQgb3IKLSAgICAgKiBCaW5kaW5nT3V0cHV0IGVsZW1lbnQgYW5kIGRldGVybWluZSBpZiBpdCBoYXMgYW55IE1JTUVNdWx0aXBhcnRSZWxhdGVkIGNvbnRlbnQuIElmIGl0IAotICAgICAqIGRvZXMgaXQgd2lsbCBidWlsZCB1cCB0aGUgYXBwcm9wcmlhdGUgQXR0YWNobWVudERlc2NyaXB0aW9uIG9iamVjdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzQmluZGluZ0Zvck1JTUUoTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsIG9wRGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUmVxdWVzdCkgewotICAgICAgICBJdGVyYXRvciBleHRlbnNpYmlsaXR5SXRlciA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZXh0ZW5zaWJpbGl0eUl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gZXh0ZW5zaWJpbGl0eUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1JTUVNdWx0aXBhcnRSZWxhdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBhIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBleHRlbnNpYmxpdHkgZWxlbWVudC4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEZvdW5kIG1pbWUgaW5mb3JtYXRpb24gbm93IHByb2Nlc3MgaXQgYW5kIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFuIEF0dGFjaG1lbnREZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgIE1JTUVNdWx0aXBhcnRSZWxhdGVkIG1pbWUgPSAoTUlNRU11bHRpcGFydFJlbGF0ZWQpIG9iajsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBwYXJ0SXRlciA9IG1pbWUuZ2V0TUlNRVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocGFydEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGEgbWltZTpwYXJ0IGNoaWxkIGVsZW1lbnQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE1JTUVQYXJ0IG1pbWVQYXJ0ID0gKE1JTUVQYXJ0KSBwYXJ0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG1FeHRJdGVyID0gbWltZVBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBlYWNoIG1pbWUgcGFydCB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgbWltZSBjb250ZW50Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChtRXh0SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvYmoyID0gbUV4dEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG1pbWUgY29udGVudCB3ZSBuZWVkIHRvIHBvdGVudGlhbGx5IGNyZWF0ZSBhbiBBdHRhY2htZW50RGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmoyIGluc3RhbmNlb2YgTUlNRUNvbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU1FQ29udGVudCBtaW1lQ29udGVudCA9IChNSU1FQ29udGVudCkgb2JqMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCA9IG1pbWVDb250ZW50LmdldFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG1pbWVDb250ZW50LmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG5vdCBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIHBhcnQgZm9yIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BEZXNjLmdldFBhcnRBdHRhY2htZW50RGVzY3JpcHRpb24ocGFydCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIG5ldyBBdHRhY2htZW50RGVzY3JpcHRpb24gZm9yIHBhcnQ6ICIgKyBwYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvbiBvcGVyYXRpb246ICIgKyBvcERlc2MuZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdHRhY2htZW50RGVzY3JpcHRpb25JbXBsKEF0dGFjaG1lbnRUeXBlLlNXQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyB0eXBlIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcERlc2MuYWRkUGFydEF0dGFjaG1lbnREZXNjcmlwdGlvbihwYXJ0LCBhdHRhY2htZW50RGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFscmVhZHkgY3JlYXRlZCBBdHRhY2htZW50RGVzY3JpcHRpb24gZm9yIHBhcnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJ0ICsgIiBvZiB0eXBlOiAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmoyIGluc3RhbmNlb2YgU09BUEJvZHkgfHwgb2JqMiBpbnN0YW5jZW9mIFNPQVAxMkJvZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBhIGJvZHkgZWxlbWVudCB3aXRoIHBvdGVudGlhbCBuZXN0ZWQgbWltZSBjb250ZW50Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsYWcgd2hldGhlciB0aGVyZSdzIGEgcG90ZW50aWFsIG5lc3RlZCBhdHRhY2htZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1JlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjLnNldEhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wRGVzYy5zZXRIYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJIYW5kbGVySGVhZGVycyhBeGlzU2VydmljZSBheGlzU2VydmljZSwgTGlzdDxIYW5kbGVyPiBoYW5kbGVycykgewotICAgICAgICBpZiAoaGFuZGxlcnMgPT0gbnVsbCB8fCBheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEFycmF5TGlzdDxRTmFtZT4gdW5kZXJzdG9vZEhlYWRlclFOYW1lcyA9IG5ldyBBcnJheUxpc3Q8UU5hbWU+KCk7Ci0gICAgICAgIGZvciAoSGFuZGxlciBoYW5kbGVyIDogaGFuZGxlcnMpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgU09BUEhhbmRsZXIpIHsKLSAgICAgICAgICAgICAgICBTT0FQSGFuZGxlciBzb2FwSGFuZGxlciA9IChTT0FQSGFuZGxlcikgaGFuZGxlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTZXQ8UU5hbWU+IGhlYWRlcnMgPSBzb2FwSGFuZGxlci5nZXRIZWFkZXJzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKFFOYW1lIGhlYWRlciA6IGhlYWRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5kZXJzdG9vZEhlYWRlclFOYW1lcy5jb250YWlucyhoZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZEhlYWRlclFOYW1lcy5hZGQoaGVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghdW5kZXJzdG9vZEhlYWRlclFOYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFBhcmFtZXRlciBoZWFkZXJRTlBhcmFtZXRlciA9IAotICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXIoRW5kcG9pbnREZXNjcmlwdGlvbi5IQU5ETEVSX1BBUkFNRVRFUl9RTkFNRVMsIHVuZGVyc3Rvb2RIZWFkZXJRTmFtZXMpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoaGVhZGVyUU5QYXJhbWV0ZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybihNZXNzYWdlcy5nZXRNZXNzYWdlKCJyZWdIYW5kbGVySGVhZGVyc0VyciIsYXhpc1NlcnZpY2UuZ2V0TmFtZSgpLGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHaXZlbiBhIGJpbmRpbmcgdHlwZSB2YWx1ZSBiYXNlZCBvbiBhIEpBWFdTIGFubnRhdGlvbiwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICAgKiBiaW5kaW5nIHR5cGUuICBUaGUgSkFYV1MgYW5ub3RhdGlvbiB2YWx1ZXMgdW5kZXJzdG9vZCBhcmUgdGhvc2UgcmV0dXJuZWQgYnkKLSAgICAgKiBtYXBCaW5kaW5nVHlwZVdzZGx0b0Fubm90YXRpb24uCi0gICAgICogCi0gICAgICogQHNlZSAjbWFwQmluZGluZ1R5cGVXc2RsVG9Bbm5vdGF0aW9uKFN0cmluZywgU3RyaW5nKQotICAgICAqIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uQmluZGluZ1R5cGUgVGhlIGJpbmRpbmcgdHlwZSBhcyByZXByZXNlbnRlZCBieSBhIEpBWFdTIGFubm90YXRpb24gdmFsdWUKLSAgICAgKiBAcmV0dXJuIFRoZSBiaW5kaW5nIHR5cGUgYXMgcmVwcmVzZW50ZWQgYnkgYSBXU0RMIGJpbmRpbmcgZXh0ZW5zaW9uIG5hbWVzcGFjZSB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcEJpbmRpbmdUeXBlQW5ub3RhdGlvblRvV3NkbChTdHJpbmcgYW5ub3RhdGlvbkJpbmRpbmdUeXBlKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsQmluZGluZ1R5cGUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORy5lcXVhbHMoYW5ub3RhdGlvbkJpbmRpbmdUeXBlKQotICAgICAgICAgICAgICAgIHx8IE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfQklORElORy5lcXVhbHMoYW5ub3RhdGlvbkJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgd3NkbEJpbmRpbmdUeXBlID0gRW5kcG9pbnREZXNjcmlwdGlvbldTREwuU09BUDExX1dTRExfQklORElORzsKLSAgICAgICAgfSBlbHNlIGlmIChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcuZXF1YWxzKGFubm90YXRpb25CaW5kaW5nVHlwZSkKLSAgICAgICAgICAgICAgICB8fCBNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcuZXF1YWxzKGFubm90YXRpb25CaW5kaW5nVHlwZSkpIHsKLSAgICAgICAgICAgIHdzZGxCaW5kaW5nVHlwZSA9IEVuZHBvaW50RGVzY3JpcHRpb25XU0RMLlNPQVAxMl9XU0RMX0JJTkRJTkc7Ci0gICAgICAgIH0gZWxzZSBpZiAoamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HLmVxdWFscyhhbm5vdGF0aW9uQmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICB3c2RsQmluZGluZ1R5cGUgPSBFbmRwb2ludERlc2NyaXB0aW9uV1NETC5IVFRQX1dTRExfQklORElORzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHdzZGxCaW5kaW5nVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBiaW5kaW5nIHR5cGUgdmFsdWUgYmFzZWQgb24gV1NETCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpBWFdTIGFubm90YXRpb24gdmFsdWUuCi0gICAgICogVGhlIFdTREwgYmluZGluZyB0eXBlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIG5hbWVzcGFjZSBvZiB0aGUgYmluZGluZyBleHRlbnNpb24gZWxlbWVudC4KLSAgICAgKiBUaGUgSkFYV1MgYW5ub3RhdGlvbiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdmFsdWVzIHRvIHRoZSBIVFRQQmluZGluZyBhbmQgU09BUEJpbmRpbmcKLSAgICAgKiBhbm5vdGF0aW9ucy4gIEFkZGl0aW9uYWxseSwgcHJvcHJpZXRhcnkgdmFsdWVzIGZvciBKTVMgYmluZGluZ3MgYXJlIHN1cHBvcnRlZC4gIFRoZSBKQVhXUwotICAgICAqIGJpbmRpbmcgdHlwZSBhbm5vdGF0aW9uIHZhbHVlcyByZXR1cm5lZCBjb3VsZCBiZSBmcm9tIFNPQVBCaW5kaW5nIG9yIEhUVFBCaW5kaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSB3c2RsQmluZGluZ1R5cGUgVGhlIGJpbmRpbmcgdHlwZSBhcyByZXByZXNudGVkIGJ5IHRoZSBXU0RMIGJpbmRpbmcgZXh0ZW5zaW9uIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBzb2FwVHJhbnNwb3J0IFRoZSBXU0RMIHRyYW5zcG9ydC4gIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgSk1TIGJpbmRpbmcgdHlwZSBzaG91bGQKLSAgICAgKiBiZSByZXR1cm5lZAotICAgICAqIEByZXR1cm4gVGhlIGJpbmRpbmcgcmVwcmVzZW50ZWQgYnkgYSBKQVhXUyBCaW5kaW5nIFR5cGUgQW5ub3RhdGlvbiB2YWx1ZSBmcm9tIGVpdGhlciAKLSAgICAgKiBTT0FQQmluZGluZyBvciBIVFRQQmluZGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYXBCaW5kaW5nVHlwZVdzZGxUb0Fubm90YXRpb24oU3RyaW5nIHdzZGxCaW5kaW5nVHlwZSwgU3RyaW5nIHNvYXBUcmFuc3BvcnQpIHsKLSAgICAgICAgU3RyaW5nIHNvYXBCaW5kaW5nVHlwZSA9IG51bGw7Ci0gICAgICAgIGlmIChFbmRwb2ludERlc2NyaXB0aW9uV1NETC5TT0FQMTFfV1NETF9CSU5ESU5HLmVxdWFscyh3c2RsQmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HLmVxdWFscyhzb2FwVHJhbnNwb3J0KSkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nVHlwZSA9ICBNRFFDb25zdGFudHMuU09BUDExSk1TX0JJTkRJTkc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vUkVWSUVXOiBXZSBhcmUgbWFraW5nIHRoZSBhc3N1bXB0aW9uIHRoYXQgaWYgbm90IEpNUywgdGhlbiBIVFRQCi0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdUeXBlID0gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSBlbHNlIGlmIChFbmRwb2ludERlc2NyaXB0aW9uV1NETC5TT0FQMTJfV1NETF9CSU5ESU5HLmVxdWFscyh3c2RsQmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICBpZiAoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HLmVxdWFscyhzb2FwVHJhbnNwb3J0KSkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nVHlwZSA9ICBNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vUkVWSUVXOiBXZSBhcmUgbWFraW5nIHRoZSBhc3N1bXB0aW9uIHRoYXQgaWYgbm90IEpNUywgdGhlbiBIVFRQCi0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdUeXBlID0gU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfSBlbHNlIGlmIChFbmRwb2ludERlc2NyaXB0aW9uV1NETC5IVFRQX1dTRExfQklORElORy5lcXVhbHMod3NkbEJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdUeXBlID0gamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwQmluZGluZ1R5cGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9FbmRwb2ludERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9FbmRwb2ludERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmJhMGY2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRW5kcG9pbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cy5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0SW5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uT3V0T25seUF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0FsbEF4aXNTZXJ2aWNlc0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYXRhbG9nLkpBWFdTQ2F0YWxvZ01hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5DdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5Xc2RsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuU2VydmVyRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LlNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5DYXRhbG9nVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTREw0SldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuV1NETERlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAxMi5TT0FQMTJBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5NVE9NOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKiogQHNlZSAuLi9FbmRwb2ludERlc2NyaXB0aW9uICovCi0vKgotICogSU1QT1JUQU5UIE5PVEU6IEF4aXMyIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgc2VydmljZSBhbmQgMSBwb3J0IHVuZGVyIHRoYXQgc2VydmljZS4gIFdoZW4gdGhhdCBpcwotICogZml4ZWQsIHRoYXQgd2lsbCBwcm9iYWJseSBoYXZlIGFuIGltcGFjdCBvbiB0aGlzIGNsYXNzLiAgSW4gcGFydGljdWxhciwgSSB0aGluayB0aGlzIHNob3VsZCBiZSBjcmVhdGVkIAotICogc29tZWhvdyBmcm9tIGFuIEF4aXNTZXJ2aWNlL0F4aXNQb3J0IGNvbWJpbmF0aW9uLCBhbmQgbm90IGRpcmVjdGx5IGZyb20gdGhlIFdTREwuCi0gKi8KLWNsYXNzIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsCi0gICAgICAgIGltcGxlbWVudHMgRW5kcG9pbnREZXNjcmlwdGlvbiwgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEsIEVuZHBvaW50RGVzY3JpcHRpb25XU0RMIHsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uSW1wbCBwYXJlbnRTZXJ2aWNlRGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBheGlzU2VydmljZTsKLSAgICAvLyBJbiBzb21lIGVudmlyb25tZW50cyBzb21lIG9mIHRoZSByZXNvdXJjZXMgb24gYW4gQXhpc1NlcnZpY2UgY2FuIGxlYWQgdG8gT09Ncy4KLSAgICAvLyBIb3dldmVyLCByZWxlYXNpbmcgdGhlc2UgcmVzb3VyY2VzIGNhbiBoYXZlIG90aGVyIGltcGxpY2F0aW9ucy4gIAotICAgIHByaXZhdGUgYm9vbGVhbiByZWxlYXNlQXhpc1NlcnZpY2VSZXNvdXJjZXMgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgUU5hbWUgcG9ydFFOYW1lOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZVFOYW1lOwotCi0gICAgLy8gQ29ycmVzcG9uZHMgdG8gYSBwb3J0IHRoYXQgd2FzIGFkZGVkIGR5bmFtaWNhbGx5IHZpYSBhZGRQb3J0IGFuZCBpcyBub3QgZGVjbGFyZWQgKGVpdGhlciBpbiBXU0RMIG9yIGFubm90YXRpb25zKQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0R5bmFtaWNQb3J0OwotCi0gICAgLy8gSWYgdGhlIFdTREwgaXMgZnVsbHkgc3BlY2lmaWVkLCB3ZSBjb3VsZCBidWlsZCB0aGUgQXhpc1NlcnZpY2UgZnJvbSB0aGUgV1NETAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VJbXBsTmFtZTsgICAgLy9jbGFzcyBuYW1lIG9mIHRoZSBzZXJ2aWNlIGltcGwgb3IgU0VJCi0KLSAgICAvLyBOb3RlIHRoYXQgYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB3aWxsIE9OTFkgYmUgc2V0IGZvciBhbiBFbmRwb2ludC1iYXNlZCBpbXBsZW1lbnRhdGlvbjsKLSAgICAvLyBpdCB3aWxsIE5PVCBiZSBzZXQgZm9yIGEgUHJvdmlkZXItYmFzZWQgaW1wbGVtZW50YXRpb24KLSAgICBwcml2YXRlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLQotICAgIC8vT24gQ2xpZW50IHNpZGUsIHRoZXJlIHNob3VsZCBiZSBPbmUgU2VydmljZUNsaWVudCBpbnN0YW5jZSBwZXIgQXhpc1Nlcml2Y2UKLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG51bGw7Ci0KLSAgICAvL1RoaXMgaXMgdGhlIGJhc2UgV2ViU2VydmljZSBvciBXZWJTZXJ2aWNlUHJvdmlkZXIgdGhhdCB3ZSBhcmUgcHJvY2Vzc2luZwotICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBudWxsOwotCi0gICAgLy8gU2V0IG9mIHBhY2thZ2VzIHRoYXQgYXJlIG5lZWRlZCB0byBtYXJzaGFsL3VubWFzaGFsIGRhdGEgKHVzZWQgdG8gc2V0IEpBWEJDb250ZXh0KQotICAgIFRyZWVTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG51bGw7Ci0KLSAgICAvLyBUaGUgSkFYLVdTIEhhbmRsZXIgcG9ydCBpbmZvcm1hdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW5kcG9pbnQKLSAgICBwcml2YXRlIFBvcnRJbmZvIHBvcnRJbmZvOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50QmluZGluZ0lEOwotICAgIC8vIFRoZSBlZmZlY3RpdmUgZW5kcG9pbnQgYWRkcmVzcy4gIEl0IGNvdWxkIGJlIHNldCBieSB0aGUgY2xpZW50IG9yIGNvbWUgZnJvbSB0aGUgV1NETCBTT0FQIGFkZHJlc3MKLSAgICBwcml2YXRlIFN0cmluZyBlbmRwb2ludEFkZHJlc3M7Ci0gICAgLy8gVGhlIGVuZHBvaW50IGFkZHJlc3MgZnJvbSB0aGUgV1NETCBzb2FwOmFkZHJlc3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlmIHByZXNlbnQuCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbFNPQVBBZGRyZXNzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsLmNsYXNzKTsKLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OIHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlcgotICAgIC8vIE9ubHkgb25lIG9mIHRoZXNlIHR3byBhbm5vdGF0aW9ucyB3aWxsIGJlIHNldDsgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlIHdlYlNlcnZpY2VBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgV2ViU2VydmljZVByb3ZpZGVyIHdlYlNlcnZpY2VQcm92aWRlckFubm90YXRpb247Ci0KLSAgICAvL0FOTk9UQVRJT046IEBIYW5kbGVyQ2hhaW4KLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbiBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uOwotICAgIHByaXZhdGUgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGU7Ci0KLSAgICAvLyBJbmZvcm1hdGlvbiBjb21tb24gdG8gYm90aCBXZWJTZXJ2aWNlIGFuZCBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbnMKLSAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uX1dzZGxMb2NhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uX1NlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGFubm90YXRpb25fUG9ydE5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbl9UYXJnZXROYW1lc3BhY2U7Ci0KLSAgICAvLyBJbmZvcm1hdGlvbiBvbmx5IHNldCBvbiBXZWJTZXJ2aWNlIGFubm90YXRpb24KLSAgICAvLyBBTk5PVEFUSU9OOiBAV2ViU2VydmljZQotICAgIHByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VfRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZV9OYW1lOwotCi0gICAgLy8gQU5OT1RBVElPTjogQFNlcnZpY2VNb2RlCi0gICAgLy8gTm90ZSB0aGlzIGlzIG9ubHkgdmFsaWQgb24gYSBQcm92aWRlci1iYXNlZCBlbmRwb2ludAotICAgIHByaXZhdGUgU2VydmljZU1vZGUgc2VydmljZU1vZGVBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU2VydmljZS5Nb2RlIHNlcnZpY2VNb2RlVmFsdWU7Ci0gICAgLy8gRGVmYXVsdCBTZXJ2aWNlTW9kZS52YWx1ZSBwZXIgSkFYV1MgU3BlYyA3LjEgImphdmF4LnhtbC5TZXJ2aWNlTW9kZSIgcGcgNzkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4LnhtbC53cy5TZXJ2aWNlLk1vZGUgU2VydmljZU1vZGVfREVGQVVMVCA9Ci0gICAgICAgICAgICBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLlBBWUxPQUQ7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAQmluZGluZ1R5cGUKLSAgICBwcml2YXRlIEJpbmRpbmdUeXBlIGJpbmRpbmdUeXBlQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyBiaW5kaW5nVHlwZVZhbHVlOwotICAgIC8vIERlZmF1bHQgQmluZGluZ1R5cGUudmFsdWUgcGVyIEpBWFdTIFNwZWMgU2VjIDcuOCAiamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIiBwZyA4MyAKLSAgICAvLyBhbmQgU2VjIDEuNCAiU09BUCBUcmFuc3BvcnQgYW5kIFRyYW5zZmVyIEJpbmRpbmdzIiBwZyAxMTkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCaW5kaW5nVHlwZV9ERUZBVUxUID0KLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORzsKLSAgICAKLSAgICAvLyBBTk5PVEFUSU9OOiBAUmVzcGVjdEJpbmRpbmcKLSAgICBwcml2YXRlIEJvb2xlYW4gcmVzcGVjdEJpbmRpbmcgPSBmYWxzZTsKLSAgICBwcml2YXRlIExpc3QgcmVxdWlyZWRCaW5kaW5nczsKLSAgICAKLSAgICBwcml2YXRlIEludGVnZXIgcG9ydENvbXBvc2l0ZUluZGV4ID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIExpc3Q8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPiBjdXN0b21Bbm5vdGF0aW9uczsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I+IGN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzOwotCi0gICAgLy8gU3VwcG9ydHMgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9ucwotICAgIHByaXZhdGUgU2VydmVyRnJhbWV3b3JrIGZyYW1ld29yayA9IG5ldyBTZXJ2ZXJGcmFtZXdvcmsoKTsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKLSAgICAKLSAgICAvLyBSZW1lbWJlcnMgaWYgdGhpcyBlbmRwb2ludCBkZXNjcmlwdGlvbiBpcyBNVE9NRW5hYmxlZAotICAgIHByaXZhdGUgQm9vbGVhbiBpc01UT01FbmFibGVkQ2FjaGUgPSBudWxsOwotCi0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2VydmljZS1yZXF1ZXN0ZXIgc2lkZSBFbmRwb2ludERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBXU0RMIHBvcnQuICAKLSAgICAgKiBOb3RlIHRoYXQgcGVyIHRoZSBKQVgtV1MgU3BlYyAoRmluYWwKLSAgICAgKiBSZWxlYXNlLCA0LzE5LzIwMDYgU2VjdGlvbiA0LjIuMyBQcm94aWVzLCBwYWdlIDU1KXRoZSAibmFtZXNwYWNlIGNvbXBvbmVudCBvZiB0aGUgcG9ydCBpcyB0aGUKLSAgICAgKiB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBXU0RMIGRlZmluaXRpb24gZG9jdW1lbnQiLiBOb3RlIHRoaXMgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBvbiB0aGUKLSAgICAgKiBjbGllbnQtc2lkZSAodGhpcyBtYXkgY2hhbmdlKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVDbGFzcyBUaGUgU0VJIG9yIEltcGwgY2xhc3MuICBUaGlzIHdpbGwgYmUgTlVMTCBmb3IgRGlzcGF0Y2ggY2xpZW50cyBzaW5jZSB0aGV5Ci0gICAgICogICAgICAgICAgICAgICAgIGRvbid0IHVzZSBhbiBTRUkKLSAgICAgKi8KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChDbGFzcyB0aGVDbGFzcywgUU5hbWUgcG9ydE5hbWUsIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgcGFyZW50KSB7Ci0gICAgICAgIHRoaXModGhlQ2xhc3MsIHBvcnROYW1lLCBwYXJlbnQsIG51bGwsIG51bGwpOwotICAgIH0KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChDbGFzcyB0aGVDbGFzcywgUU5hbWUgcG9ydE5hbWUsIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgcGFyZW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjLCBPYmplY3QgY29tcG9zaXRlS2V5ICkgewotICAgICAgICB0aGlzKHRoZUNsYXNzLCBwb3J0TmFtZSwgZmFsc2UsIHBhcmVudCwgZGJjLCBjb21wb3NpdGVLZXkpOwotICAgIH0KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChDbGFzcyB0aGVDbGFzcywgUU5hbWUgcG9ydE5hbWUsIGJvb2xlYW4gZHluYW1pY1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcyh0aGVDbGFzcywgcG9ydE5hbWUsIGR5bmFtaWNQb3J0LCBwYXJlbnQsIG51bGwsIG51bGwpOwotICAgIH0KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChDbGFzcyB0aGVDbGFzcywgUU5hbWUgcG9ydE5hbWUsIGJvb2xlYW4gZHluYW1pY1BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotCi0gICAgICAgIHRoaXMucGFyZW50U2VydmljZURlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5LCBzcGFyc2VDb21wb3NpdGUpOwotICAgICAgICBjb21wb3NpdGUuc2V0Q29ycmVzcG9uZGluZ0NsYXNzKHRoZUNsYXNzKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDbGFzc0xvYWRlcihsb2FkZXIpOwotICAgICAgICBjb21wb3NpdGUuc2V0SXNTZXJ2aWNlUHJvdmlkZXIoZmFsc2UpOwotCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5pc0R5bmFtaWNQb3J0ID0gZHluYW1pY1BvcnQ7Ci0gICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydE5hbWUpKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgcG9ydCBuYW1lIGlzIG51bGwsIHRoZW4gcGVyIEpBWC1XUyAyLjAgc3BlYyBwLiA1NSwgdGhlIHJ1bnRpbWUgaXMgcmVzcG9uc2libGUgZm9yIHNlbGVjdGluZyB0aGUgcG9ydC4KLSAgICAgICAgICAgIHRoaXMucG9ydFFOYW1lID0gc2VsZWN0UG9ydFRvVXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnBvcnRRTmFtZSA9IHBvcnROYW1lOwotICAgICAgICB9Ci0gICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZXJlIG11c3QgYmUgYSBwb3J0IFFOYW1lIHNldCwgZWl0aGVyIGFzIHBhc3NlZCBpbiwgb3IgZGV0ZXJtaW5lZCBmcm9tIHRoZSBXU0RMIGFuZC9vciBhbm5vdGF0aW9ucy4KLSAgICAgICAgLy8gSWYgbm90LCB0aGF0IGlzIGFuIGVycm9yLgotICAgICAgICBpZiAodGhpcy5wb3J0UU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25FcnIxIix0aGVDbGFzcy5nZXROYW1lKCkscGFyZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNldHVwQXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYWRkVG9BeGlzU2VydmljZSgpOwotICAgICAgICBzZXR1cFJlbGVhc2VSZXNvdXJjZXMoZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKSk7Ci0KLSAgICAgICAgYnVpbGREZXNjcmlwdGlvbkhpZXJhY2h5KCk7Ci0gICAgICAgIGFkZEFub255bW91c0F4aXNPcGVyYXRpb25zKCk7Ci0KLSAgICAgICAgLy8gVGhpcyB3aWxsIHNldCB0aGUgc2VydmljZUNsaWVudCBmaWVsZCBhZnRlciBhZGRpbmcgdGhlIEF4aXNTZXJ2aWNlIHRvIHRoZSBBeGlzQ29uZmlnCi0gICAgICAgIGdldFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgLy8gR2l2ZSB0aGUgY29uZmlndXJhdGlvbiBidWlsZGVyIGEgY2hhbmNlIHRvIGZpbmFsaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2VydmljZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgLmNvbXBsZXRlQXhpczJDb25maWd1cmF0aW9uKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NyaXB0aW9uRXJyMiIsZS5nZXRDbGFzcygpLmdldE5hbWUoKSxwYXJlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVsZWFzZUF4aXNTZXJ2aWNlUmVzb3VyY2VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXR1cFJlbGVhc2VSZXNvdXJjZXMoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChheGlzQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gCi0gICAgICAgICAgICAgICAgICAgIGF4aXNDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfQ0FDSEUpOwotICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VBeGlzU2VydmljZVJlc291cmNlcyA9ICgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmRwb2ludERlc2NyaXB0aW9uIGNvbmZpZ3VyZWQgdG8gcmVsZWFzZSBBeGlzU2VydmljZSByZXNvdXJjZXMgdmlhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIENvbnN0YW50cy5Db25maWd1cmF0aW9uLlJFRFVDRV9XU0RMX01FTU9SWV9DQUNIRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihjb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgQm9vbGVhbiByZWR1Y2VDYWNoZSA9IChCb29sZWFuKSBjb21wb3NpdGUuZ2V0UHJvcGVydGllcygpLmdldChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfQ0FDSEUpOwotICAgICAgICAgICAgaWYocmVkdWNlQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0cmlldmVkIHRoZSBmb2xsb3dpbmcgcmVkdWNlIFdTREwgY2FjaGUgdmFsdWU6ICIgKyByZWR1Y2VDYWNoZSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIHRoZSBjb21wb3NpdGU6ICIgKyBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWxlYXNlQXhpc1NlcnZpY2VSZXNvdXJjZXMgPSByZWR1Y2VDYWNoZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwoU2VydmljZURlc2NyaXB0aW9uSW1wbCBwYXJlbnQsIFN0cmluZyBzZXJ2aWNlSW1wbE5hbWUpIHsKLSAgICAgICAgdGhpcyhwYXJlbnQsIHNlcnZpY2VJbXBsTmFtZSwgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2VydmljZS1wcm92aWRlciBzaWRlIEVuZHBvaW50RGVzY3JpcHRpb24gYmFzZWQgb24gdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZS4gCi0gICAgICogTm90ZSB0aGF0IHBlciB0aGUKLSAgICAgKiBKQVgtV1MgU3BlYyAoRmluYWwgUmVsZWFzZSwgNC8xOS8yMDA2IFNlY3Rpb24gNC4yLjMgUHJveGllcywgcGFnZSA1NSl0aGUgIm5hbWVzcGFjZSBjb21wb25lbnQKLSAgICAgKiBvZiB0aGUgcG9ydCBpcyB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgV1NETCBkZWZpbml0aW9uIGRvY3VtZW50Ii4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVDbGFzcyBUaGUgU0VJIG9yIEltcGwgY2xhc3MuICBUaGlzIHdpbGwgYmUgTlVMTCBmb3IgRGlzcGF0Y2ggY2xpZW50cyBzaW5jZSB0aGV5Ci0gICAgICogICAgICAgICAgICAgICAgIGRvbid0IHVzZSBhbiBTRUkKLSAgICAgKi8KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHBhcmVudCwgU3RyaW5nIHNlcnZpY2VJbXBsTmFtZSwgTWFwPFN0cmluZywgT2JqZWN0PgotICAgICAgICBwcm9wZXJ0aWVzLCBJbnRlZ2VyIHBvcnRDb21wb3NpdGVJbmRleCkgewotICAgICAgICAKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSBDdXN0b21Bbm5vdGF0aW9uSW50YW5jZSBsaXN0IGFuZCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIG1hcAotICAgICAgICBjdXN0b21Bbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPigpOwotICAgICAgICBjdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3Nvcj4oKTsKLSAgICAgICAgdGhpcy5wb3J0Q29tcG9zaXRlSW5kZXggPSBwb3J0Q29tcG9zaXRlSW5kZXg7Ci0gICAgICAgIAotICAgICAgICAvLyBzZXQgcHJvcGVydGllcyBtYXAKLSAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucGFyZW50U2VydmljZURlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICB0aGlzLnNlcnZpY2VJbXBsTmFtZSA9IHNlcnZpY2VJbXBsTmFtZTsKLQotICAgICAgICAvLyBpZiB0aGUgU2VydmljZURlc2NyaXB0aW9uJ3Mgc2VydmljZSBRTmFtZSBpcyBzcGVjaWZpZWQsIGxldCdzIHVzZSB0aGF0IHRvIGdldCB0aGUKLSAgICAgICAgLy8gY29ycmVjdCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUKLSAgICAgICAgaWYocGFyZW50LmdldFNlcnZpY2VRTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUocGFyZW50LmdldFNlcnZpY2VRTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0Q29tcG9zaXRlSW5kZXgpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdpbGwgZ2V0IHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgYnkgdGhlIGN1cnJlbnQgaW5kZXgKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb21wb3NpdGUgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRDb21wb3NpdGVJbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChjb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NyaXB0aW9uRXJyMyIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoY29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCkgIT0gbnVsbCAmJiBjb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluc1R5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaGFuZGxlclNvdXJjZUZhaWwiLCBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaGFuZGxlckNoYWluc1R5cGUgPSBjb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluc1R5cGUoKTsKLQotICAgICAgICAvL1NldCB0aGUgYmFzZSBsZXZlbCBvZiBhbm5vdGF0aW9uIHRoYXQgd2UgYXJlIHByb2Nlc3NpbmcuLi5jdXJyZW50bHkKLSAgICAgICAgLy8gYSAnV2ViU2VydmljZScgb3IgYSAnV2ViU2VydmljZVByb3ZpZGVyJwotICAgICAgICBpZiAoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwpCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd2ViU2VydmljZVByb3ZpZGVyQW5ub3RhdGlvbiA9IGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpOwotCi0gICAgICAgIAotICAgICAgICAvLyBub3cgZ2V0IHRoZSBjdXN0b20gYW5ub3RhdGlvbiBhbmQgcHJvY2VzcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEQkMKLSAgICAgICAgY3VzdG9tQW5ub3RhdGlvbnMuYWRkQWxsKGNvbXBvc2l0ZS5nZXRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2VzKCkpOwotICAgICAgICBjdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycy5wdXRBbGwoY29tcG9zaXRlLmdldEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gTm90ZSB0aGF0IG9uIHRoZSBjbGllbnQgc2lkZSwgdGhlIHNlcnZpY2UgUU4gc2hvdWxkIGJlIHNldDsgb24gdGhlIHNlcnZlciBzaWRlIGl0IHdpbGwgbm90IGJlLgotICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldFNlcnZpY2VRTmFtZSgpKSkgewotICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLnNldFNlcnZpY2VRTmFtZShnZXRTZXJ2aWNlUU5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9DYWxsIHRoZSBnZXR0ZXIgdG8gaW5zdXJlIHRoZSBxdWFsaWZpZWQgcG9ydCBuYW1lIGlzIHNldC4gCi0gICAgICAgIGdldFBvcnRRTmFtZSgpOwotCi0gICAgICAgIHNldHVwQXhpc1NlcnZpY2VGcm9tREJMKCk7Ci0gICAgICAgIGFkZFRvQXhpc1NlcnZpY2UoKTsgICAgLy9BZGQgYSByZWZlcmVuY2UgdG8gdGhpcyBFbmRwb2ludERlc2NyaXB0aW9uIHRvIHRoZSBBeGlzU2VydmljZQotCi0gICAgICAgIGJ1aWxkRGVzY3JpcHRpb25IaWVyYWNoeSgpOwotCi0gICAgICAgIFdzZGxDb21wb3NpdGUgd3NkbENvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBnZXRCaW5kaW5nVHlwZSgpOwotCi0gICAgICAgIGJvb2xlYW4gaXNTT0FQMTEgPQotICAgICAgICAgICAgICAgIChiaW5kaW5nVHlwZS5lcXVhbHMoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdUeXBlLmVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IHRydWUgOiBmYWxzZTsKLQotCi0gICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGdlbmVyYXRlIFdTREwKLSAgICAgICAgLy8gRmlyc3QsIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgb25seSBhIFNPQVAgMS4xIGJhc2VkIGJpbmRpbmcsIHBlciBKQVhXUyBzcGVjLiB3ZSBjYW5ub3QgCi0gICAgICAgIC8vIGdlbmVyYXRlIFdTREwgaWYgdGhlIGJpbmRpbmcgdHlwZSBpcyBub3QgU09BUCAxLjEgYmFzZWQuCi0gICAgICAgIC8vIFRoZW4sIGFzc3VtaW5nIHRoZSBjb21wb3NpdGUgZG9lcyBub3QgY29udGFpbiBhIAotICAgICAgICAvLyBXc2RsIERlZmluaXRpb24sIGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBpdAotICAgICAgICBpZiAoaXNTT0FQMTEpewotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAoaXNFbmRwb2ludEJhc2VkKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghaXNFbmRwb2ludEJhc2VkKCkpCi0gICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIC8vVGhpcyBpcyBlaXRoZXIgYW4gaW1wbGljaXQgU0VJLCBvciBhIFdlYlNlcnZpY2UgUHJvdmlkZXIKLSAgICAKLSAgICAgICAgICAgICAgICB3c2RsQ29tcG9zaXRlID0gZ2VuZXJhdGVXU0RMKGNvbXBvc2l0ZSk7Ci0gICAgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzRW5kcG9pbnRCYXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy9UaGlzIGltcGwgY2xhc3Mgc3BlY2lmaWVzIGFuIFNFSS4uLnRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIFRoZXJlIGlzIGEgYnVnCi0gICAgICAgICAgICAgICAgLy9pbiB0aGUgdG9vbGluZyB0aGF0IGFsbG93cyBmb3IgdGhlIHdzZGxsb2NhdGlvbiB0byBiZSBzcGVjaWZlZCBvbiBlaXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgLy9pbXBsLiBjbGFzcywgb3IgdGhlIFNFSSwgb3IgYm90aC4gU28sIHdlIG5lZWQgdG8gbG9vayBmb3IgdGhlIHdzZGwgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAgICAvLwkJCTEuIElmIHRoZSBXc2RsIGV4aXN0cyBvbiB0aGUgU0VJLCB0aGVuIGNoZWNrIGZvciBpdCBvbiB0aGUgaW1wbC4KLSAgICAgICAgICAgICAgICAvLwkJCTIuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiBlaXRoZXIgbG9jYXRpb24sIGluIHRoYXQgb3JkZXIsIHRoZW4gZ2VuZXJhdGUKLSAgICAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2VpYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgCi0gICAgICAgICAgICAgICAgLy9Pbmx5IGdlbmVyYXRlIFdTREwgaWYgYSBkZWZpbml0aW9uIGRvZXNuJ3QgYWxyZWFkeSBleGlzdAotICAgICAgICAgICAgICAgIGlmIChzZWljLmdldFdzZGxEZWZpbml0aW9uKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgd3NkbENvbXBvc2l0ZSA9IGdlbmVyYXRlV1NETChjb21wb3NpdGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy9UaGlzIGlzIGEgU09BUDEyIGJpbmRpbmcgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgV1NETCBkZWZpbml0aW9uLCBsb2cgYSBXQVJOSU5HCi0gICAgICAgICAgICBsb2cud2FybigiVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgV1NETCBkZWZpbml0aW9uIGFuZCBpcyBub3QgYSBTT0FQIDEuMSBiYXNlZCBiaW5kaW5nLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIlBlciBKQVhXUyBzcGVjLiAtIGEgV1NETCBkZWZpbml0aW9uIGNhbm5vdCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uIE5hbWU6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU09BUDExKXsKLSAgICAKLSAgICAgICAgICAgIC8vU2F2ZSB0aGUgV1NETCBMb2NhdGlvbiBhbmQgdGhlIFdzZGxEZWZpbml0aW9uLCB2YWx1ZSBkZXBlbmRzIG9uIHdoZXRoZXIgd3NkbCB3YXMgZ2VuZXJhdGVkCi0gICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbExvY2F0aW9uUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICAgICAgd3NkbExvY2F0aW9uUGFyYW1ldGVyLnNldE5hbWUoTURRQ29uc3RhbnRzLldTRExfTE9DQVRJT04pOwotICAgIAotICAgICAgICAgICAgUGFyYW1ldGVyIHdzZGxEZWZQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldE5hbWUoTURRQ29uc3RhbnRzLldTRExfREVGSU5JVElPTik7Ci0gICAgCi0gICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbENvbXBvc2l0ZVBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxDb21wb3NpdGVQYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9DT01QT1NJVEUpOwotICAgIAotICAgICAgICAgICAgaWYgKHdzZGxDb21wb3NpdGUgIT0gbnVsbCkgewotICAgIAotICAgICAgICAgICAgICAgIC8vV2UgaGF2ZSBhIHdzZGwgY29tcG9zaXRlLCBzbyBzZXQgdGhlc2UgdmFsdWVzIGZvciB0aGUgZ2VuZXJhdGVkIHdzZGwKLSAgICAgICAgICAgICAgICB3c2RsQ29tcG9zaXRlUGFyYW1ldGVyLnNldFZhbHVlKHdzZGxDb21wb3NpdGUpOwotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvblBhcmFtZXRlci5zZXRWYWx1ZSh3c2RsQ29tcG9zaXRlLmdldFdzZGxGaWxlTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcigpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBVUkwgd3NkbFVybCA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcigpLmdldFdTRExMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChkZWYgaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXRWYWx1ZShkZWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBXU0RMRGVmaW5pdGlvbldyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgV1NETERlZmluaXRpb25XcmFwcGVyIHdyYXAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IGNvbXBvc2l0ZS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCAmJiBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXAgPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZiwgd3NkbFVybCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHNob3VsZG4ndCBnZXQgaGVyZS4gIEJ1dCBpZiB3ZSBkbywgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1lbW9yeSBzZW5zaXR2ZSB3c2RsIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXAgPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZiwgd3NkbFVybCwgdHJ1ZSwgMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXRWYWx1ZSh3cmFwKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vTm8gd3NkbCBjb21wb3NpdGUgYmVjYXVzZSB3c2RsIGFscmVhZHkgZXhpc3RzCi0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb25QYXJhbWV0ZXIuc2V0VmFsdWUoZ2V0QW5ub1dlYlNlcnZpY2VXU0RMTG9jYXRpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMV3JhcHBlcigpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBVUkwgd3NkbFVybCA9IGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMV3JhcHBlcigpLmdldFdTRExMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChkZWYgaW5zdGFuY2VvZiBXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXRWYWx1ZShkZWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBXU0RMRGVmaW5pdGlvbldyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgV1NETERlZmluaXRpb25XcmFwcGVyIHdyYXAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYyA9IGNvbXBvc2l0ZS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCAmJiBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXAgPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZiwgd3NkbFVybCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHNob3VsZG4ndCBnZXQgaGVyZS4gIEJ1dCBpZiB3ZSBkbywgdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIG1lbW9yeSBzZW5zaXR2ZSB3c2RsIHdyYXBwZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyYXAgPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZiwgd3NkbFVybCwgdHJ1ZSwgMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd3NkbERlZlBhcmFtZXRlci5zZXRWYWx1ZSh3cmFwKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9UaGVyZSBpcyBubyB3c2RsIGNvbXBvc2l0ZSBhbmQgdGhlcmUgaXMgTk9UIGEgd3NkbCBkZWZpbml0aW9uCi0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uUGFyYW1ldGVyLnNldFZhbHVlKG51bGwpOwotICAgICAgICAgICAgICAgIHdzZGxEZWZQYXJhbWV0ZXIuc2V0VmFsdWUobnVsbCk7Ci0gICAgCi0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICh3c2RsQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHdzZGxDb21wb3NpdGVQYXJhbWV0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIod3NkbERlZlBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHdzZGxMb2NhdGlvblBhcmFtZXRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZW5kcG9pbnREZXNjcmlwdGlvbkVycjQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIGFjY291bnQgZm9yIFNPQVAgMS4yIFdTREwgd2hlbiBzdXBwbGllZCB3aXRoIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbERlZlBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxEZWZQYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9ERUZJTklUSU9OKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciB3c2RsTG9jYXRpb25QYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICB3c2RsTG9jYXRpb25QYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9MT0NBVElPTik7Ci0gICAgICAgICAgICBpZiAoZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdzZGxMb2NhdGlvblBhcmFtZXRlci5zZXRWYWx1ZShnZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0V1NETExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZiBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikgewotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldFZhbHVlKGRlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIFdTRExEZWZpbml0aW9uV3JhcHBlcgotICAgICAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNjID0gY29tcG9zaXRlLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYyAhPSBudWxsICYmIGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVXJsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLiAgQnV0IGlmIHdlIGRvLCB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWVtb3J5IHNlbnNpdHZlIHdzZGwgd3JhcHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCA9IG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIoZGVmLCB3c2RsVXJsLCB0cnVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3c2RsRGVmUGFyYW1ldGVyLnNldFZhbHVlKHdyYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vIFdTREwgc3VwcGxpZWQgYW5kIHdlIGRvIG5vdCBnZW5lcmF0ZSBmb3Igbm9uLVNPQVAgMS4xL0hUVFAKLSAgICAgICAgICAgIC8vIGVuZHBvaW50cwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uUGFyYW1ldGVyLnNldFZhbHVlKG51bGwpOwotICAgICAgICAgICAgICAgIHdzZGxEZWZQYXJhbWV0ZXIuc2V0VmFsdWUobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcih3c2RsRGVmUGFyYW1ldGVyKTsKLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIod3NkbExvY2F0aW9uUGFyYW1ldGVyKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJlbmRwb2ludERlc2NyaXB0aW9uRXJyNCIpLGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBCZWZvcmUgd2UgbGVhdmUgd2UgbmVlZCB0byBkcml2ZSB0aGUgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnMgaWYgCi0gICAgICAgIC8vIHRoZXJlIHdlcmUgYW55IEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSBvYmplY3RzIHJlZ2lzdGVyZWQKLSAgICAgICAgSXRlcmF0b3I8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPiBhbm5vdGF0aW9uSXRlciA9IGN1c3RvbUFubm90YXRpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGFubm90YXRpb25JdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGFubm90YXRpb24gPSBhbm5vdGF0aW9uSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgZm9yIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IgZm9yIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzOiAiICsgYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IGN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzLmdldChhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGlmKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yOiAiICsgcHJvY2Vzc29yLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U6ICIgKyBhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3NUeXBlTGV2ZWxBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDb25maWd1cmUgYW55IGF2YWlsYWJsZSBXZWJTZXJ2aWNlRmVhdHVyZXMgb24gdGhlIGVuZHBvaW50LgotICAgICAgICBjb25maWd1cmVXZWJTZXJ2aWNlRmVhdHVyZXMoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFJFVklFVzogdGhlcmUgYXJlIHNvbWUgdGhyb3dzIGFib3ZlIHRoYXQgd29uJ3QgY2F1c2UgdGhlIHJlbGVhc2UKLSAgICAgICAgc2V0dXBSZWxlYXNlUmVzb3VyY2VzKGNvbXBvc2l0ZS5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgcmVsZWFzZUF4aXNTZXJ2aWNlUmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvQXhpc1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSB0byB0aGlzIEVuZHBvaW50RGVzY3JpcHRpb24gb2JqZWN0IHRvIHRoZSBBeGlzU2VydmljZQotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHBhcmFtZXRlci5zZXROYW1lKEVuZHBvaW50RGVzY3JpcHRpb24uQVhJU19TRVJWSUNFX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuc2V0VmFsdWUodGhpcyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIAl0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25FcnI1IiksZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYnVpbGRFbmRwb2ludERlc2NyaXB0aW9uRnJvbUFubm90YXRpb25zKCkgewotICAgICAgICAvLyBUT0RPOiBUaGUgY29tbWVudHMgYmVsb3cgYXJlIG5vdCBxdWl0ZSBjb3JyZWN0OyB0aGlzIG1ldGhvZCBpcyB1c2VkIG9uIEJPVEggdGhlIAotICAgICAgICAvLyAgICAgICBjbGllbnQgYW5kIHNlcnZlci4gIE9uIHRoZSBjbGllbnQgdGhlIGNsYXNzIGlzIGFsd2F5cyBhbiBTRUkuICBPbiB0aGUgc2VydmVyIGl0IAotICAgICAgICAvLwkJIGlzIGFsd2F5cyBhIHNlcnZpY2UgaW1wbCB3aGljaCBtYXkgYmUgYSBwcm92aWRlciBvciBlbmRwb2ludCBiYXNlZDsKLSAgICAgICAgLy8JCSBlbmRwb2ludCBiYXNlZCBtYXkgcmVmZXJlbmNlIGFuIFNFSSBjbGFzcwotCi0gICAgICAgIC8vIFRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIGNsYXNzIGNvdWxkIGJlIGVpdGhlciBQcm92aWRlci1iYXNlZCBvciBFbmRwb2ludC1iYXNlZC4gIFRoZSAKLSAgICAgICAgLy8gYW5ub3RhdGlvbnMgdGhhdCBhcmUgcHJlc2VudCBhcmUgc2ltaWxhciBidXQgZGlmZmVyZW50LiAgQ29uZm9ybWFuY2UgcmVxdWlyZW1lbnRzIAotICAgICAgICAvLyBwZXIgSkFYLVdTCi0gICAgICAgIC8vIC0gQSBQcm92aWRlciBiYXNlZCBpbXBsZW1lbnRhdGlvbiBNVVNUIGNhcnJ5IHRoZSBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24KLSAgICAgICAgLy8gICBwZXIgc2VjdGlvbiA1LjEgamF2YXgueG1sLndzLlByb3ZpZGVyIG9uIHBhZ2UgNjMKLSAgICAgICAgLy8gLSBBbiBFbmRwb2ludCBiYXNlZCBpbXBsZW1lbnRhdGlvbiBNVVNUIGNhcnJ5IHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uIHBlciBKU1ItMTgxIAotICAgICAgICAvLyAgIChyZWZlcmVuY2UgVEJEKSBhbmQgSkFYLVdTIChyZWZlcmVuY2UgVEJEKQotICAgICAgICAvLyAtIEFuIEVuZHBvaW50IGJhc2VkIGltcGxlbWVudGF0aW9uIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gTUFZIHJlZmVyZW5jZSBhbiBlbmRwb2ludAotICAgICAgICAvLyAgIGludGVyZmFjZSAKLSAgICAgICAgLy8gLSBUaGUgQFdlYlNlcnZpY2UgYW5kIEBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbnMgY2FuIG5vdCBhcHBlYXIgaW4gdGhlIHNhbWUgY2xhc3MgcGVyIAotICAgICAgICAvLyAgIEpBWC1XUyBzZWN0aW9uIDcuNyBvbiBwYWdlIDgyLgotCi0gICAgICAgIC8vIElmIHBvcnROYW1lIHdhcyBzcGVjaWZpZWQsIHNldCBpdC4gIE90aGVyd2lzZSwgd2Ugd2lsbCBnZXQgaXQgZnJvbSB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgLy8gYW5ub3RhdGlvbiB3aGVuIHRoZSBnZXR0ZXIgaXMgY2FsbGVkLgotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gRW5kcG9pbnQtYmFzZWQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiAoaS5lLiBub3QgYSAKLSAgICAgICAgLy8gUHJvdmlkZXItYmFzZWQgb25lKSwgdGhlbiBjcmVhdGUgdGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdG8gY29udGFpbgotICAgICAgICAvLyB0aGUgb3BlcmF0aW9ucyBvbiB0aGUgZW5kcG9pbnQuICBQcm92aWRlci1iYXNlZCBlbmRwb2ludHMgZG9uJ3QgaGF2ZSBvcGVyYXRpb25zCi0gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGVtLCBzbyB0aGV5IGRvbid0IGhhdmUgYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbi4KLSAgICAgICAgaWYgKHdlYlNlcnZpY2VBbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIHRoaXMgaW1wbCBjbGFzcyByZWZlcmVuY2VzIGFuIFNFSSwgdGhlbiB1c2UgdGhhdCBTRUkgdG8gY3JlYXRlIHRoZSBFbmRwb2ludEludGVyZmFjZURlc2MuCi0gICAgICAgICAgICBTdHJpbmcgc2VpQ2xhc3NOYW1lID0gZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCi0gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZS5pc1NlcnZpY2VQcm92aWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3Mgc2VpQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoc2VpQ2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjbGllbnQgY29kZSBwYXRoOyB0aGUgQFdlYlNlcnZjZSB3aWxsIG5vdCBoYXZlIGFuIGVuZHBvaW50SW50ZXJmYWNlIG1lbWJlcgotICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IGJ1aWxkIHRoZSBFbmRwb2ludEludGVyZmFjZURlc2MgYmFzZWQgb24gdGhlIGNsYXNzIGl0c2VsZi4KLSAgICAgICAgICAgICAgICAgICAgc2VpQ2xhc3MgPSBjb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPSBuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoc2VpQ2xhc3MsIHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoY29tcG9zaXRlLCB0cnVlLCB0aGlzKTsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vT3RoZXJ3aXNlLCBidWlsZCB0aGUgRUlEIGJhc2VkIG9uIHRoZSBTRUkgY29tcG9zaXRlCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPSBuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpLmdldChzZWlDbGFzc05hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcyBpcyBjb25zdHJ1Y3RlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIEBXZWJTZXJ2aWNlLm5hbWUgCi0gICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBvbiB0aGUgYXhpc1NlcnZpY2UgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlV2ViU2VydmljZU5hbWVQYXJhbWV0ZXIoKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24pLmdldEFubm9XZWJTZXJ2aWNlTmFtZSgpLCBheGlzU2VydmljZSk7IAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXZWJTZXJ2aWNlUHJvdmlkZXIgd2l0aG91dCBXU0RMIGVuY291bnRlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBnZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICAgICAgaWYgKGphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nLkhUVFBfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpfHwKLSAgICAgICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSl8fAotICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKXx8Ci0gICAgICAgICAgICAgICAgICAgIE1EUUNvbnN0YW50cy5TT0FQX0hUVFBfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChjb21wb3NpdGUsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldFBvcnRRTmFtZSgpIHsKLSAgICAgICAgaWYgKHBvcnRRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGUgbmFtZSB3YXMgbm90IHNldCBieSB0aGUgY29uc3RydWN0b3JzLCBzbyBnZXQgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlIGFubm90YXRpb24uCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyB0bnMgPSBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgcG9ydFFOYW1lID0gbmV3IFFOYW1lKHRucywgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnRRTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZVFOYW1lKCkgewotICAgICAgICBpZiAoc2VydmljZVFOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlIG5hbWUgaGFzIGJlZW4gc2V0IG9uIHRoZSBTZXJ2aWNlLCB1c2UgdGhhdC4gIE90aGVyd2lzZQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIG9mZiB0aGUgYW5ub3RhdGlvbnMKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VEZXNjUU5hbWUgPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlUU5hbWUoKTsKLSAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHNlcnZpY2VEZXNjUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZVFOYW1lID0gc2VydmljZURlc2NRTmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IGdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdG5zID0gZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUodG5zLCBsb2NhbFBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlUU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRTZXJ2aWNlRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkgewotICAgICAgICByZXR1cm4gKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwpcGFyZW50U2VydmljZURlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzU2VydmljZSBnZXRBeGlzU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNEeW5hbWljUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIGlzRHluYW1pY1BvcnQ7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVXaXRoU0VJKENsYXNzIHNlaSwgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSwgT2JqZWN0IHNwYXJzZUNvbXBvc2l0ZUtleSkgewotICAgICAgICAvLyBVcGRhdGluZyB3aXRoIGFuIFNFSSBpcyBvbmx5IHZhbGlkIGZvciBkZWNsYXJlZCBwb3J0czsgaXQgaXMgbm90IHZhbGlkIGZvciBkeW5hbWljIHBvcnRzLgotICAgICAgICBpZiAoaXNEeW5hbWljUG9ydCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVwZGF0ZVdpdGhTRUlFcnIxIixwb3J0UU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1cGRhdGVXaXRoU0VJRXJyMiIscG9ydFFOYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29tcG9zaXRlLnNldFNwYXJzZUNvbXBvc2l0ZShzcGFyc2VDb21wb3NpdGVLZXksIHNwYXJzZUNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gd2FzIGNyZWF0ZWQgcHJldmlvdXNseSBiYXNlZCBvbiB0aGUgcG9ydCBkZWNsYXJhdGlvbiAoaS5lLiBXU0RMKQotICAgICAgICAgICAgLy8gc28gdXBkYXRlIHRoYXQgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBTRUkgYW5ub3RhdGlvbnMKLSAgICAgICAgICAgICgoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwpZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbikudXBkYXRlV2l0aFNFSShzZWkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBkb2VzIG5vdCBleGlzdCB5ZXQuICBUaGlzIGN1cnJlbnRseSBoYXBwZW5zIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIAotICAgICAgICAgICAgLy8gTk8gV1NETCBwcm92aWRlZCBhbmQgYSBEaXNwYXRjaCBjbGllbnQgaXMgY3JlYXRlZCBmb3IgcHJpb3IgdG8gYSBnZXRQb3J0IGJlaW5nIGRvbmUgZm9yIHRoYXQgcG9ydC4KLSAgICAgICAgICAgIC8vIFRoZXJlIHdhcyBubyBXU0RMIHRvIGNyZWF0ZSB0aGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBmcm9tIGFuZCB0aGVyZSB3YXMgbm8gYW5ub3RhdGVkIFNFSSB0bwotICAgICAgICAgICAgLy8gdXNlIGF0IHRoYXQgdGltZS4gIE5vdyB3ZSBoYXZlIGFuIGFubm90YXRlZCBTRUksIHNvIGNyZWF0ZSB0aGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBub3cuCi0gICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKHNlaSwgdGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXR1cEF4aXNTZXJ2aWNlKCkgewotICAgICAgICAvLyBCdWlsZCB1cCB0aGUgQXhpc1NlcnZpY2UuICBOb3RlIHRoYXQgaWYgdGhpcyBpcyBhIGR5bmFtaWMgcG9ydCwgdGhlbiB3ZSBkb24ndCB1c2UgdGhlCi0gICAgICAgIC8vIFdTREwgdG8gYnVpbGQgdXAgdGhlIEF4aXNTZXJ2aWNlIHNpbmNlIHRoZSBwb3J0IGFkZGVkIHRvIHRoZSBTZXJ2aWNlIGJ5IHRoZSBjbGllbnQgaXMgbm90Ci0gICAgICAgIC8vIG9uZSB0aGF0IHdpbGwgYmUgcHJlc2VudCBpbiB0aGUgV1NETC4gIEEgbnVsbCBjbGFzcyBwYXNzZWQgaW4gYXMgdGhlIFNFSSBpbmRpY2F0ZXMgdGhpcyAKLSAgICAgICAgLy8gaXMgYSBkaXNwYXRjaCBjbGllbnQuCi0gICAgICAgIGlmICghaXNEeW5hbWljUG9ydCAmJiBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETCA9IGJ1aWxkQXhpc1NlcnZpY2VGcm9tV1NETCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRBeGlzU2VydmljZUZyb21Bbm5vdGF0aW9ucygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2V0dXBBeGlzU2VydmljZUVycjEiLGNyZWF0ZUF4aXNTZXJ2aWNlTmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTYXZlIHRoZSBTZXJ2aWNlIFFOYW1lIGFzIGEgcGFyYW1ldGVyLgotICAgICAgICBQYXJhbWV0ZXIgc2VydmljZU5hbWVQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHNlcnZpY2VOYW1lUGFyYW1ldGVyLnNldE5hbWUoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLldTRExfU0VSVklDRV9RTkFNRSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lUGFyYW1ldGVyLnNldFZhbHVlKGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldFNlcnZpY2VRTmFtZSgpKTsKLQotICAgICAgICAvLyBTYXZlIHRoZSBQb3J0IG5hbWUuICBOb3RlOiBBeGlzIGRvZXMgbm90IGV4cGVjdCBhIFFOYW1lIHNpbmNlIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwb3J0IGlzIHRoZSBucyBmcm9tIHRoZSBXU0RMIGRlZmluaXRpb24gCi0gICAgICAgIFBhcmFtZXRlciBwb3J0UGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBwb3J0UGFyYW1ldGVyLnNldE5hbWUoV1NETDExVG9BbGxBeGlzU2VydmljZXNCdWlsZGVyLldTRExfUE9SVCk7Ci0gICAgICAgIHBvcnRQYXJhbWV0ZXIuc2V0VmFsdWUocG9ydFFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFN0b3JlIHRoZSBzZXJ2aWNlIGNsYXNzIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICAgIFBhcmFtZXRlciBzZXJ2aWNlQ2xhc3NOYW1lUGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHNlcnZpY2VDbGFzc05hbWVQYXJhbS5zZXROYW1lKE1EUUNvbnN0YW50cy5DTElFTlRfU0VSVklDRV9DTEFTUyk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlQ2xhc3NOYW1lID0gdGhpcy5nZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0U2VydmljZUNsYXNzTmFtZSgpOwotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIHNlcnZpY2UgY2xhc3MgbmFtZSBwYXJhbWV0ZXIgdG86ICIgKyBzZXJ2aWNlQ2xhc3NOYW1lICsgCi0gICAgICAgICAgICAgICAgICAgICAgIiBvbiBBeGlzU2VydmljZTogIiArIGF4aXNTZXJ2aWNlICsgIkAiICsgYXhpc1NlcnZpY2UuaGFzaENvZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VydmljZUNsYXNzTmFtZVBhcmFtLnNldFZhbHVlKHNlcnZpY2VDbGFzc05hbWUpOwotICAgICAgICAKLSAgICAgICAgLy8gU3RvcmUgdGhlIHNlaSBjbGFzcyBmdWxseSBxdWFsaWZpZWQgbmFtZSwgaWYgaXQgaXMgYXZhaWxhYmxlCi0gICAgICAgIFBhcmFtZXRlciBzZWlDbGFzc05hbWVQYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgc2VpQ2xhc3NOYW1lUGFyYW0uc2V0TmFtZShNRFFDb25zdGFudHMuQ0xJRU5UX1NFSV9DTEFTUyk7Ci0gICAgICAgIFN0cmluZyBzZWlDbGFzc05hbWUgPSBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgc2VpIGNsYXNzIG5hbWUgcGFyYW1ldGVyIHRvOiAiICsgc2VpQ2xhc3NOYW1lICsgCi0gICAgICAgICAgICAgICAgICAgICAgIiBvbiBBeGlzU2VydmljZTogIiArIGF4aXNTZXJ2aWNlICsgIkAiICsgYXhpc1NlcnZpY2UuaGFzaENvZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2VpQ2xhc3NOYW1lUGFyYW0uc2V0VmFsdWUoc2VpQ2xhc3NOYW1lKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHNlcnZpY2VOYW1lUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihwb3J0UGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihzZXJ2aWNlQ2xhc3NOYW1lUGFyYW0pOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHNlaUNsYXNzTmFtZVBhcmFtKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2V0dXBBeGlzU2VydmljZUVycjIiKSxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhpcyBzZXR1cHMgYW5kIGJ1aWxkcyB0aGUgQXhpc1NlcnZpY2UgdXNpbmcgb25seSB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlTGlzdAotICAgICAqIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXR1cEF4aXNTZXJ2aWNlRnJvbURCTCgpIHsKLSAgICAgICAgLy8gQnVpbGQgdXAgdGhlIEF4aXNTZXJ2aWNlLiAgTm90ZSB0aGF0IGlmIHRoaXMgaXMgYSBkaXNwYXRjaCBjbGllbnQsIHRoZW4gd2UgZG9uJ3QgdXNlIHRoZQotICAgICAgICAvLyBXU0RMIHRvIGJ1aWxkIHVwIHRoZSBBeGlzU2VydmljZSBzaW5jZSB0aGUgcG9ydCBhZGRlZCB0byB0aGUgU2VydmljZSBieSB0aGUgY2xpZW50IGlzIG5vdAotICAgICAgICAvLyBvbmUgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIFdTREwuICBBIG51bGwgY2xhc3MgcGFzc2VkIGluIGFzIHRoZSBTRUkgaW5kaWNhdGVzIHRoaXMgCi0gICAgICAgIC8vIGlzIGEgZGlzcGF0Y2ggY2xpZW50LgotCi0gICAgICAgIC8vIElmIFdTREwgaXMgcHJlc2VudCwgaXQgbWF5IGJlIGZ1bGwgb3Igb25seSBwYXJ0aWFsLiAgSWYgd2UgY2FuIGNyZWF0ZSB0aGUgQXhpc1NlcnZpY2UgZnJvbSAKLSAgICAgICAgLy8gdGhlIFdTREwsIHRoYXQgV1NETCBpcyBmdWxseSBzcGVjaWZpZWQuICBPdGhlcndpc2UsIGl0IGlzICJwYXJ0aWFsIFdTREwiLiAgSW4gdGhhdCBjYXNlCi0gICAgICAgIC8vIHdlIHVzZSBhbm5vdGFpb25zIHRvIGJ1aWxkIHRoZSBBeGlzU2VydmljZQotICAgICAgICBpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETCA9IGZhbHNlOwotICAgICAgICBpZiAoZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaXNBeGlzU2VydmljZUJ1aWx0RnJvbVdTREwgPSBidWlsZEF4aXNTZXJ2aWNlRnJvbVdTREwoKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETCkgewotICAgICAgICAgICAgLy9nZW5lcmF0ZVdTREwoY29tcG9zaXRlKTsKLSAgICAgICAgICAgIGJ1aWxkQXhpc1NlcnZpY2VGcm9tQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNldHVwQXhpc1NlcnZpY2VFcnIxIixjcmVhdGVBeGlzU2VydmljZU5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1NhdmUgdGhlIFBvcnQgVHlwZSBuYW1lCi0gICAgICAgIFBhcmFtZXRlciBwb3J0VHlwZU5hbWVQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHBvcnRUeXBlTmFtZVBhcmFtZXRlci5zZXROYW1lKE1EUUNvbnN0YW50cy5XU0RMX1BPUlRUWVBFX05BTUUpOwotICAgICAgICBwb3J0VHlwZU5hbWVQYXJhbWV0ZXIuc2V0VmFsdWUoZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBTYXZlIHRoZSBTZXJ2aWNlIFFOYW1lIGFzIGEgcGFyYW1ldGVyLgotICAgICAgICBQYXJhbWV0ZXIgc2VydmljZU5hbWVQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHNlcnZpY2VOYW1lUGFyYW1ldGVyLnNldE5hbWUoTURRQ29uc3RhbnRzLldTRExfU0VSVklDRV9RTkFNRSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lUGFyYW1ldGVyLnNldFZhbHVlKGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldFNlcnZpY2VRTmFtZSgpKTsKLQotICAgICAgICAvLyBTYXZlIHRoZSBQb3J0IG5hbWUuICBOb3RlOiBBeGlzIGRvZXMgbm90IGV4cGVjdCBhIFFOYW1lIHNpbmNlIHRoZSBuYW1lc3BhY2UKLSAgICAgICAgLy8gICBmb3IgdGhlIHBvcnQgaXMgdGhlIG5zIGZyb20gdGhlIFdTREwgZGVmaW5pdGlvbiAKLSAgICAgICAgUGFyYW1ldGVyIHBvcnRQYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgIHBvcnRQYXJhbWV0ZXIuc2V0TmFtZShNRFFDb25zdGFudHMuV1NETF9QT1JUKTsKLSAgICAgICAgcG9ydFBhcmFtZXRlci5zZXRWYWx1ZShnZXRQb3J0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgLy9TYXZlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIHNlcnZpY2VJbXBsCi0gICAgICAgIFBhcmFtZXRlciBzZXJ2aWNlQ2xhc3NOYW1lUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcigpOwotICAgICAgICBzZXJ2aWNlQ2xhc3NOYW1lUGFyYW1ldGVyLnNldE5hbWUoTURRQ29uc3RhbnRzLlNFUlZJQ0VfQ0xBU1MpOwotICAgICAgICBzZXJ2aWNlQ2xhc3NOYW1lUGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgLnNldFZhbHVlKERlc2NyaXB0aW9uVXRpbHMuamF2aWZ5Q2xhc3NOYW1lKGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIocG9ydFR5cGVOYW1lUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihzZXJ2aWNlTmFtZVBhcmFtZXRlcik7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIocG9ydFBhcmFtZXRlcik7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoc2VydmljZUNsYXNzTmFtZVBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNldHVwQXhpc1NlcnZpY2VFcnIyIiksZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYnVpbGRBeGlzU2VydmljZUZyb21XU0RMKCkgewotICAgICAgICBib29sZWFuIGlzQnVpbHRGcm9tV1NETCA9IGZhbHNlOwotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGF4aXMgc2VydmljZSBidWlsZGVyIHRha2VzIG9ubHkgdGhlIGxvY2FscGFydCBvZiB0aGUgcG9ydCBxbmFtZS4KLSAgICAgICAgICAgIC8vIFRPRE86OiBUaGlzIHNob3VsZCBjaGVjayB0aGF0IHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGRlZmluaXRpb24gbWF0Y2hlcyB0aGUgbmFtZXNwYWNlIG9mIHRoZSBwb3J0UU5hbWUgcGVyIEpBWFJQQyBzcGVjCi0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVXNlIGdldERlZmluaXRpb24oKSBzbyB0aGF0IHdlIGhhdmUgdGhlIGFkdmFudGFnZXMgb2YgdGhlIG1lbW9yeSBmZWF0dXJlcy4KLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBzZXJ2aWNlQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0U2VydmljZVFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9ydFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkJ1aWxkaW5nIEF4aXNTZXJ2aWNlIGZyb20gd3NkbDogIiArIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRXU0RMV3JhcHBlcigpLmdldFdTRExMb2NhdGlvbigpKTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOwotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5pc1NlcnZpY2VQcm92aWRlcigpKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBjb21wb3NpdGUuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBnZXRDb250ZXh0Q2xhc3NMb2FkZXIobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldENhdGFsb2dNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBDYXRhbG9nVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIgPSBuZXcgQ2F0YWxvZ1VSSVJlc29sdmVyKGNhdGFsb2dNYW5hZ2VyLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICBzZXJ2aWNlQnVpbGRlci5zZXRDdXN0b21SZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0KLSAgICAgICAgICAgIGlmIChnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuaXNTZXJ2ZXJTaWRlKCkpCi0gICAgICAgICAgICAgICAgc2VydmljZUJ1aWxkZXIuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZXJ2aWNlQnVpbGRlci5zZXRTZXJ2ZXJTaWRlKGZhbHNlKTsKLQotICAgICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBBeGlzQ29uZmlndXJhdGlvbiB3aXRoIHRoZSBTZXJ2aWNlQnVpbGRlciBpZiBpdAotICAgICAgICAgICAgLy8gaXMgYXZhaWxhYmxlLiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgdGhlIHNlcnZpY2VCdWlsZGVyIGNhbgotICAgICAgICAgICAgLy8gdXNlIHRoZSBhcHByb3ByaWF0ZSBXU0RMIHdyYXBwZXIgbWVtb3J5IHBhcmFtZXRlcnMuCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBhYyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjID0gY29tcG9zaXRlLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQnVpbGRlci51c2VBeGlzQ29uZmlndXJhdGlvbihhYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgQXhpc1NlcnZpY2UKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gc2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIElmIGFuIEF4aXNDb25maWd1cmF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLAotICAgICAgICAgICAgLy8gZGVmYXVsdCB0byB1c2luZyBhIG1lbW9yeSBlZmZpY2llbnQgd3JhcHBlcgotICAgICAgICAgICAgaWYgKGFjID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgd3NkbFdyYXBwZXJQYXJhbSA9IAotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoV1NETENvbnN0YW50cy5XU0RMXzRfSl9ERUZJTklUSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbFdyYXBwZXJQYXJhbSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIHdzZGxXcmFwcGVyUGFyYW0uZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikgewotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgV1NETERlZmluaXRpb25XcmFwcGVyIHdyYXBwZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgIChXU0RMRGVmaW5pdGlvbldyYXBwZXIpICB3c2RsV3JhcHBlclBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyBJZiBvbmx5IHRoZSBiYXNpYyB3cmFwcGVyIGlzIGJlaW5nIHVzZWQsIHVwZ3JhZGUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIFJFTE9BRCB3cmFwcGVyCi0gICAgICAgICAgICAgICAgICAgIGlmICh3cmFwcGVyLmdldE1lbW9yeUxpbWl0VHlwZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbERlZiA9IHdyYXBwZXIuZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0RMRGVmaW5pdGlvbldyYXBwZXIgd3JhcHBlcjIgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKHdzZGxEZWYsIHRydWUsIDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsV3JhcHBlclBhcmFtLnNldFZhbHVlKHdyYXBwZXIyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUoY3JlYXRlQXhpc1NlcnZpY2VOYW1lKCkpOwotICAgICAgICAgICAgaXNCdWlsdEZyb21XU0RMID0gdHJ1ZTsKLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IChnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETExvY2F0aW9uKCkgIT0gbnVsbCkgPwotICAgICAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETExvY2F0aW9uKCkudG9TdHJpbmcoKSA6IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgaW1wbENsYXNzTmFtZSA9IGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIGxvZy53YXJuKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImJsZEF4aXNTcnZjRnJvbVdTRExFcnIiLGltcGxDbGFzc05hbWUsd3NkbExvY2F0aW9uKSxlKTsKLQotICAgICAgICAgICAgaXNCdWlsdEZyb21XU0RMID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gaXNCdWlsdEZyb21XU0RMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0J1aWx0RnJvbVdTREw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQXhpc1NlcnZpY2VGcm9tQW5ub3RhdGlvbnMoKSB7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChwb3J0UU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZU5hbWUgPSBjcmVhdGVBeGlzU2VydmljZU5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE1ha2UgdGhpcyBzZXJ2aWNlIG5hbWUgdW5pcXVlLiAgVGhlIEF4aXMyIGVuZ2luZSBhc3N1bWVzIHRoYXQgYSBzZXJ2aWNlIGl0IGNhbiBub3QgZmluZCBpcyBhIGNsaWVudC1zaWRlIHNlcnZpY2UuCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IFNlcnZpY2VDbGllbnQuQU5PTl9TRVJWSUNFICsgdGhpcy5oYXNoQ29kZSgpICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VBeGlzU2VydmljZVJlc291cmNlcygpIHsKLSAgICAgICAgLy8gcmVsZWFzZSB0aGUgc2NoZW1hIGxpc3QgaW4gdGhlIEF4aXNTZXJ2aWNlCi0gICAgICAgIGlmIChyZWxlYXNlQXhpc1NlcnZpY2VSZXNvdXJjZXMgJiYgYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYXhpc1NlcnZpY2UucmVsZWFzZVNjaGVtYUxpc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBidWlsZERlc2NyaXB0aW9uSGllcmFjaHkoKSB7Ci0gICAgICAgIC8vIEJ1aWxkIHVwIHRoZSBEZXNjcmlwdGlvbiBIaWVyYWNoeS4gIE5vdGUgdGhhdCBpZiB0aGlzIGlzIGEgZHluYW1pYyBwb3J0LCB0aGVuIHdlIGRvbid0IHVzZSB0aGUKLSAgICAgICAgLy8gV1NETCB0byBidWlsZCB1cCB0aGUgaGllcmFjaHkgc2luY2UgdGhlIHBvcnQgYWRkZWQgdG8gdGhlIFNlcnZpY2UgYnkgdGhlIGNsaWVudCBpcyBub3QKLSAgICAgICAgLy8gb25lIHRoYXQgd2lsbCBiZSBwcmVzZW50IGluIHRoZSBXU0RMLgotCi0gICAgICAgIGlmIChjb21wb3NpdGUuaXNTZXJ2aWNlUHJvdmlkZXIoKSkgewotICAgICAgICAgICAgaWYgKCFpc0R5bmFtaWNQb3J0ICYmIGlzV1NETEZ1bGx5U3BlY2lmaWVkKCkpCi0gICAgICAgICAgICAgICAgYnVpbGRFbmRwb2ludERlc2NyaXB0aW9uRnJvbVdTREwoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBidWlsZEVuZHBvaW50RGVzY3JpcHRpb25Gcm9tQW5ub3RhdGlvbnMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vU3RpbGwgcHJvY2Vzc2luZyBhbm5vdGF0aW9ucyBmcm9tIHRoZSBjbGFzcwotICAgICAgICAgICAgLy8gVGhpcyBwYXRoIHdhcyBub3QgdXBkYXRlZAotICAgICAgICAgICAgaWYgKCFpc0R5bmFtaWNQb3J0ICYmIGlzV1NETEZ1bGx5U3BlY2lmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZEVuZHBvaW50RGVzY3JpcHRpb25Gcm9tV1NETCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVzdCBvZiB0aGUgZGVzY3JpcHRpb24gaGllcmFjaHkgZnJvbSBhbm5vdGF0aW9ucyBvbiB0aGUgY2xhc3MuCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gU0VJIGNsYXNzLCB0aGVuIHRoaXMgaXMgYSBEaXN0cGFjaCBjYXNlLCBhbmQgd2UgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIHRoZSByZXN0IG9mIHRoZSBkZXNjcmlwdGlvbiBoaWVyYWNoeSAoc2luY2UgaXQgaXMgbm90IGFuIFNFSSBhbmQgdGh1cwotICAgICAgICAgICAgICAgIC8vIG5vdCBvcGVyYXRpb24tYmFzZWQgY2xpZW50LgotICAgICAgICAgICAgICAgIGJ1aWxkRW5kcG9pbnREZXNjcmlwdGlvbkZyb21Bbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRW5kcG9pbnREZXNjcmlwdGlvbkZyb21XU0RMKCkgewotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICBqYXZheC53c2RsLlNlcnZpY2Ugd3NkbFNlcnZpY2UgPQotICAgICAgICAgICAgICAgIHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2UoZ2V0U2VydmljZURlc2NyaXB0aW9uKCkuZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICBpZiAod3NkbFNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlc2NFcnIyIiwgY3JlYXRlQXhpc1NlcnZpY2VOYW1lKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcCB3c2RsUG9ydHMgPSB3c2RsU2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICBib29sZWFuIHdzZGxQb3J0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHdzZGxQb3J0cyAhPSBudWxsICYmIHdzZGxQb3J0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB3c2RsUG9ydEl0ZXJhdG9yID0gd3NkbFBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICh3c2RsUG9ydEl0ZXJhdG9yLmhhc05leHQoKSAmJiAhd3NkbFBvcnRGb3VuZCkgewotICAgICAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSAoUG9ydCl3c2RsUG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoZSBuYW1lc3BhY2UgaXMgbm90IGluY2x1ZGVkIG9uIHRoZSBXU0RMIFBvcnQuCi0gICAgICAgICAgICAgICAgaWYgKHdzZGxQb3J0LmdldE5hbWUoKS5lcXVhbHMocG9ydFFOYW1lLmdldExvY2FsUGFydCgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBFbmRwb2ludEludGVyZmFjZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFNFSSBpZiB0aGVyZSBpcyBvbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3Igb24gdGhlIHNlcnZpY2UgaW1wbCBjbGFzcyAoaS5lLiBhbiBpbXBsaWNpdCBTRUkpLgotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlLmlzU2VydmljZVByb3ZpZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWlDbGFzc05hbWUgPSBnZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHNlaUNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBTRUkgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIHNlcnZpY2UgaW1wbCBhcyBhbiBpbXBsaWNpdCBTRUkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChjb21wb3NpdGUsIHRydWUsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGJ1aWxkIHRoZSBFSUQgYmFzZWQgb24gdGhlIFNFSSBjb21wb3NpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpLmdldChzZWlDbGFzc05hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZnRlciB0aGlzIGlzIGNvbnN0cnVjdGVkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgQFdlYlNlcnZpY2UubmFtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgb24gdGhlIGF4aXNTZXJ2aWNlIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVXZWJTZXJ2aWNlTmFtZVBhcmFtZXRlcigoKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKS5nZXRBbm5vV2ViU2VydmljZU5hbWUoKSwgYXhpc1NlcnZpY2UpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgRW5kcG9pbnQgSW50ZXJmYWNlIERlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBXU0RMLgotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IG5ldyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCh0aGlzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGNyZWF0ZWQgd2l0aCBXU0RMIHdpdGggaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFubm90YXRpb25zIGluIHRoZSBTRUkKLSAgICAgICAgICAgICAgICAgICAgICAgICgoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwpZW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZVdpdGhTRUkoY29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3c2RsUG9ydEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXdzZGxQb3J0Rm91bmQpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlc2NFcnIzIixwb3J0UU5hbWUuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIGFub255bW91cyBheGlzIG9wZXJhdGlvbnMgdG8gdGhlIEF4aXNTZXJ2aWNlLiAgTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWVkZWQgb24gdGhlCi0gICAgICogY2xpZW50IHNpZGUsIGFuZCB0aGV5IGFyZSBjdXJyZW50bHkgdXNlZCBpbiB0d28gY2FzZXMgKDEpIEZvciBEaXNwYXRjaCBjbGllbnRzICh3aGljaCBkb24ndAotICAgICAqIHVzZSBTRUlzIGFuZCB0aHVzIGRvbid0IHVzZSBvcGVyYXRpb25zKSAoMikgVEVNUE9SQVJMSVkgZm9yIFNlcnZpY2VzIGNyZWF0ZWQgd2l0aG91dCBXU0RMCi0gICAgICogKGFuZCB0aHVzIHdoaWNoIGhhdmUgbm8gQXhpc09wZXJhdGlvbnMgY3JlYXRlZCkgU2VlIHRoZSBBeGlzSW52b2NhdGlvbkNvbnRyb2xsZXIgaW52b2tlCi0gICAgICogbWV0aG9kcyBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAqIDxwLz4KLSAgICAgKiBCYXNlZCBvbiBTZXJ2aWNlQ2xpZW50LmNyZWF0ZUFub255bW91U2VydmljZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRBbm9ueW1vdXNBeGlzT3BlcmF0aW9ucygpIHsKLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE91dE9ubHlBeGlzT3BlcmF0aW9uIG91dE9ubHlPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBuZXcgT3V0T25seUF4aXNPcGVyYXRpb24oU2VydmljZUNsaWVudC5BTk9OX09VVF9PTkxZX09QKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihvdXRPbmx5T3BlcmF0aW9uKTsKLSAgICAgICAgICAgIG91dE9ubHlPcGVyYXRpb24uc2V0U29hcEFjdGlvbihudWxsKTsKLQotICAgICAgICAgICAgT3V0SW5BeGlzT3BlcmF0aW9uIG91dEluT3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE91dEluQXhpc09wZXJhdGlvbihTZXJ2aWNlQ2xpZW50LkFOT05fT1VUX0lOX09QKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihvdXRJbk9wZXJhdGlvbik7Ci0gICAgICAgICAgICBvdXRJbk9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uKG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VDbGllbnQgZ2V0U2VydmljZUNsaWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPSBnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5nZXRBeGlzQ29uZmlnQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTdmMgPSBnZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDZmcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc0NmZy5nZXRTZXJ2aWNlKGF4aXNTdmMuZ2V0TmFtZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTdmMuc2V0TmFtZShheGlzU3ZjLmdldE5hbWUoKSArIHVuaXF1ZUlEKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ3R4LCBheGlzU3ZjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VDbGllbnRDcmVhdGVFcnJvciIpLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZUNsaWVudDsKLSAgICB9Ci0KLSAgICAvL1RoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgZGVwcmVjYXRlZCBpbiBmYXZvciAnY3JlYXRlQXhpc1NlcnZpY2VOYW1lRnJvbURCTAotICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUF4aXNTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHBvcnRRTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0TmFtZSA9IHBvcnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBvcnROYW1lID0gIk5vUG9ydE5hbWVTcGVjaWZpZWQiOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VEZXNjcmlwdGlvbigpLmdldFNlcnZpY2VRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIi4iICsgcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXU0RMRnVsbHlTcGVjaWZpZWQoKSB7Ci0gICAgICAgIHJldHVybiBpc0F4aXNTZXJ2aWNlQnVpbHRGcm9tV1NETDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyQmFzZWQoKSB7Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdGF0aW9uICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRwb2ludEJhc2VkKCkgewotICAgICAgICByZXR1cm4gd2ViU2VydmljZUFubm90YXRpb24gIT0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViU2VydmljZSBhbmQgV2ViU2VydmljZVByb3ZpZGVyCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25fV3NkbExvY2F0aW9uID09IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJTZXJ2aWNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25fV3NkbExvY2F0aW9uID0gZ2V0QW5ub1dlYlNlcnZpY2UoKS53c2RsTG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vSWYgdGhpcyBpcyBub3QgYW4gaW1wbGljaXQgU0VJLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IGl0cyBub3Qgb24gdGhlIFNFSQotICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUuaXNTZXJ2aWNlUHJvdmlkZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShzZWljLmdldFdlYlNlcnZpY2VBbm5vdCgpLndzZGxMb2NhdGlvbigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fV3NkbExvY2F0aW9uID0gc2VpYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKS53c2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkud3NkbExvY2F0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Xc2RsTG9jYXRpb24gPSBnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkud3NkbExvY2F0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuMSBwZyAxNgotICAgICAgICAgICAgICAgIGFubm90YXRpb25fV3NkbExvY2F0aW9uID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25fV3NkbExvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25fU2VydmljZU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJTZXJ2aWNlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlKCkuc2VydmljZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1NlcnZpY2VOYW1lID0gZ2V0QW5ub1dlYlNlcnZpY2UoKS5zZXJ2aWNlTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKS5zZXJ2aWNlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25fU2VydmljZU5hbWUgPSBnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkuc2VydmljZU5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBpcyB0aGUgInNpbXBsZSBuYW1lIiBvZiB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlICsgIlNlcnZpY2UiCi0gICAgICAgICAgICAgICAgLy8gUGVyIEpTUi0xODEgTVIgU2VjIDQuMSwgcGcgMTUKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1NlcnZpY2VOYW1lID0gRGVzY3JpcHRpb25VdGlscy5nZXRTaW1wbGVKYXZhQ2xhc3NOYW1lKGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkgKyAiU2VydmljZSI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25fU2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbl9Qb3J0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlNlcnZpY2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2UoKS5wb3J0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25fUG9ydE5hbWUgPSBnZXRBbm5vV2ViU2VydmljZSgpLnBvcnROYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpLnBvcnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9Qb3J0TmFtZSA9IGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKS5wb3J0TmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHRoZSB2YWx1ZQotICAgICAgICAgICAgICAgIGlmIChpc1Byb3ZpZGVyQmFzZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24gcGF0aAotICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgaW4gSlNSLTIyNCwgYnV0IHdlIGNhbiBhc3N1bWUgaXQgaXMgCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbWlsYXIgdG8gdGhlIGRlZmF1bHQgaW4gdGhlIFdlYlNlcnZpY2UgY2FzZSwgaG93ZXZlciB0aGVyZSBpcyBubwotICAgICAgICAgICAgICAgICAgICAvLyBuYW1lIGF0dHJpYnV0ZSBmb3IgYSBXZWJTZXJ2aWNlUHJvdmlkZXIuICBTbyBpbiB0aGlzIGNhc2Ugd2UgdXNlIAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgV2ViU2VydmljZS5uYW1lIHBlciBKU1ItMTgxIE1SIHNlYyA0LjEgcGcgMTUuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSB0aGluZyBhcyB0aGUgY2FsbCB0byBnZXRXZWJTZXJ2aWNlTmFtZSgpIAotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgV2ViU2VydmljZSBjYXNlOyBpdCBpcyBkb25lIHNlcGVydGVseSBqdXN0IHRvIGJlIGNsZWFyIHRoZXJlIGlzIG5vIAotICAgICAgICAgICAgICAgICAgICAvLyBuYW1lIGVsZW1lbnQgb24gdGhlIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fUG9ydE5hbWUgPSBEZXNjcmlwdGlvblV0aWxzLmdldFNpbXBsZUphdmFDbGFzc05hbWUoY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiUG9ydCI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBwYXRoCi0gICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgaXMgdGhlIEBXZWJTZXJ2aWNlLm5hbWUgb2YgdGhlIGNsYXNzIG9yIGludGVyZmFjZSArICJQb3J0IgotICAgICAgICAgICAgICAgICAgICAvLyBQZXIgSlNSLTE4MSBNUiBTZWMgNC4xLCBwZyAxNQotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1BvcnROYW1lID0gZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkgKyAiUG9ydCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uX1BvcnROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uX1RhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlNlcnZpY2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2UoKS50YXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX1RhcmdldE5hbWVzcGFjZSA9IGdldEFubm9XZWJTZXJ2aWNlKCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEFubm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpLnRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25fVGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHZhbHVlIHBlciBKU1ItMTgxIE1SIFNlYyA0LjEgcGcgMTUgZGVmZXJzIHRvICJJbXBsZW1lbnRhdGlvbiBkZWZpbmVkLCAKLSAgICAgICAgICAgICAgICAvLyBhcyBkZXNjcmliZWQgaW4gSkFYLVdTIDIuMCwgc2VjdGlvbiAzLjIiIHdoaWNoIGlzIEpBWC1XUyAyLjAgU2VjIDMuMiwgcGcgMjkuCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9UYXJnZXROYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLm1ha2VOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25VdGlscy5nZXRKYXZhUGFja2FnZU5hbWUoY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uX1RhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViU2VydmljZVByb3ZpZGVyCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIFdlYlNlcnZpY2VQcm92aWRlciBnZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gd2ViU2VydmljZVByb3ZpZGVyQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViU2VydmljZQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyBXZWJTZXJ2aWNlIGdldEFubm9XZWJTZXJ2aWNlKCkgewotICAgICAgICByZXR1cm4gd2ViU2VydmljZUFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotICAgICAgICAvLyBUT0RPOiBWYWxpZGF0aW9uOiBOb3QgYWxsb3dlZCBvbiBXZWJTZXJ2aWNlUHJvdmlkZXIKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VfRW5kcG9pbnRJbnRlcmZhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc1Byb3ZpZGVyQmFzZWQoKSAmJiBnZXRBbm5vV2ViU2VydmljZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZSgpLmVuZHBvaW50SW50ZXJmYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgd2ViU2VydmljZV9FbmRwb2ludEludGVyZmFjZSA9IGdldEFubm9XZWJTZXJ2aWNlKCkuZW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBlbGVtZW50IGlzIG5vdCB2YWxpZCBvbiBhIFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgd2ViU2VydmljZV9FbmRwb2ludEludGVyZmFjZSA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlX0VuZHBvaW50SW50ZXJmYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkgewotICAgICAgICAvLyBUT0RPOiBWYWxpZGF0aW9uOiBOb3QgYWxsb3dlZCBvbiBXZWJTZXJ2aWNlUHJvdmlkZXIKLQotICAgICAgICAvL1RPRE86IFBlciBKU1IxMDkgdjEuMiBTZWMuIDUuMy4yLjEKLSAgICAgICAgLy8gICAgICBJZiBub3Qgc3BlY2lmaWVkIHRoZW4gd2UgY2FuIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBhcyBzcGVjaWZpZWQgaW4gSlNSIDE4MQotICAgICAgICAvLwkJKGJ1dCBvbmx5IGlmIGl0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIG1vZHVsZSkuLi5vciBJZiB0aGUgbmFtZSBpcwotICAgICAgICAvLwkJbm90IHNwZWNpZmllZCBpbiB0aGUgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBCZWFuIHRoZW4gZnVsbHkKLSAgICAgICAgLy8JCXF1YWxpZmllZCBuYW1lIG9mIHRoZSBCZWFuIGNsYXNzIGlzIHVzZWQgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MKLSAgICAgICAgLy8JCUlmIHRoZSBhYm92ZSBpcyBub3QgdW5pcXVlIHRoZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlCi0gICAgICAgIC8vCQlCZWFuIGNsYXNzIGlzIHVzZWQgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MKLQotICAgICAgICBpZiAod2ViU2VydmljZV9OYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaXNQcm92aWRlckJhc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlNlcnZpY2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlKCkubmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX05hbWUgPSBnZXRBbm5vV2ViU2VydmljZSgpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX05hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25VdGlscy5nZXRTaW1wbGVKYXZhQ2xhc3NOYW1lKGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGVsZW1lbnQgaXMgbm90IHZhbGlkIG9uIGEgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24KLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX05hbWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViU2VydmljZV9OYW1lOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBTZXJ2aWNlTW9kZQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwdWJsaWMgU2VydmljZU1vZGUgZ2V0QW5ub1NlcnZpY2VNb2RlKCkgewotCi0gICAgICAgIGlmIChzZXJ2aWNlTW9kZUFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmljZU1vZGVBbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldFNlcnZpY2VNb2RlQW5ub3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2VydmljZU1vZGVBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlLk1vZGUgZ2V0U2VydmljZU1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlLk1vZGUgZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSB7Ci0gICAgICAgIC8vIFRoaXMgYW5ub3RhdGlvbiBpcyBvbmx5IHZhbGlkIG9uIFByb3ZpZGVyLWJhc2VkIGVuZHBvaW50cy4gCi0gICAgICAgIGlmIChpc1Byb3ZpZGVyQmFzZWQoKSAmJiBzZXJ2aWNlTW9kZVZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vU2VydmljZU1vZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZU1vZGVWYWx1ZSA9IGdldEFubm9TZXJ2aWNlTW9kZSgpLnZhbHVlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlcnZpY2VNb2RlVmFsdWUgPSBTZXJ2aWNlTW9kZV9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTW9kZVZhbHVlOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBCaW5kaW5nVHlwZQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyBCaW5kaW5nVHlwZSBnZXRBbm5vQmluZGluZ1R5cGUoKSB7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZUFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgYmluZGluZ1R5cGVBbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldEJpbmRpbmdUeXBlQW5ub3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGluZ1R5cGVBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub0JpbmRpbmdUeXBlVmFsdWUoKSB7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZVZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vQmluZGluZ1R5cGUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub0JpbmRpbmdUeXBlKCkudmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZVZhbHVlID0gZ2V0QW5ub0JpbmRpbmdUeXBlKCkudmFsdWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gQmluZGluZ1R5cGUgYW5ub3RhdGlvbiBwcmVzZW50IG9yIHZhbHVlIHdhcyBlbXB0eTsgdXNlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZVZhbHVlID0gQmluZGluZ1R5cGVfREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGluZ1R5cGVWYWx1ZTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogSGFuZGxlckNoYWluCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWluKEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbikgewotICAgICAgICBoYW5kbGVyQ2hhaW5zVHlwZSA9IGhhbmRsZXJDaGFpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gZ2V0SGFuZGxlckNoYWluKG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzY2hlbWEgZGVyaXZlZCBqYXZhIGNsYXNzIGNvbnRhaW5pbmcgdGhlIHRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICAKLSAgICAgKiBUaGF0IGluZm9ybWF0aW9uLCByZXR1cm5lZCBpbiB0aGUgSGFuZGxlckNoYWluc1R5cGUgb2JqZWN0LCBpcyBsb29rZWQgZm9yIGluIHRoZSBmb2xsb3dpbmcgCi0gICAgICogcGxhY2VzIGluIHRoaXMgb3JkZXI6Ci0gICAgICogLSBTZXQgb24gdGhlIHNwYXJzZUNvbXBvc2l0ZSBmb3IgdGhlIGdpdmVuIGtleQotICAgICAqIC0gU2V0IG9uIHRoZSBjb21wb3NpdGUKLSAgICAgKiAtIFJlYWQgaW4gZnJvbSB0aGUgZmlsZSBzcGVjaWZpZWQgb24gSGFuZGxlckNoYWluIGFubm90YXRpb24KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEhhbmRsZXJDaGFpbnNUeXBlIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IGZvciB0aGUgSGFuZGxlciBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBIYW5kbGVyQ2hhaW5zVHlwZSBpbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBmb3IgdGhpcyBTZXJ2aWNlRGVsZWdhdGUKLSAgICAgICAgLy8gKGkuZS4gdGhpcyBzcGFyc2VDb21wb3NpdGVLZXkpLCB0aGVuIHJldHVybiB0aGF0LgotICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlS2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICAgICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCAmJiBzcGFyc2VDb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluc1R5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0ID0gc3BhcnNlQ29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbnNUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhjdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gSGFuZGxlckNoYWluc1R5cGUgaW4gdGhlIGNvbXBvc2l0ZSwgdGhlbiByZWFkIGluIHRoZSBmaWxlIHNwZWNpZmllZAotICAgICAgICAvLyBvbiB0aGUgSGFuZGxlckNoYWluIGFubm90YXRpb24gaWYgaXQgaXMgcHJlc2VudC4KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbnNUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGdldEFubm9IYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKHNwYXJzZUNvbXBvc2l0ZUtleSk7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJGaWxlTmFtZSA9IGhhbmRsZXJDaGFpbkFubm90YXRpb24uZmlsZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhNZXNzYWdlcy5nZXRNZXNzYWdlKCJoYW5kbGVyQ2hhaW5zVHlwZUVyciIsaGFuZGxlckZpbGVOYW1lLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgaXMgdXNpbmcgdGhlIGNsYXNzbG9hZGVyIGZvciBFbmRwb2ludERlc2NyaXB0aW9uSW1wbDsgaXMgdGhhdCBPSz8KLSAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IChjb21wb3NpdGUuaXNTZXJ2aWNlUHJvdmlkZXIoKSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldENsYXNzTG9hZGVyKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVHJ5aW5nIHRvIGxvYWQgZmlsZSAiICsgaGFuZGxlckZpbGVOYW1lICsgIiByZWxhdGl2ZSB0byAiICsgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBEZXNjcmlwdGlvblV0aWxzLm9wZW5IYW5kbGVyQ29uZmlnU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNvbmZpZyBzdHJlYW0gaXMgc3RpbGwgbnVsbC4gIFRoaXMgbWF5IG1lYW4gdGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBpcyBvbiBhICpkcml2ZXIqIGNsYXNzCi0gICAgICAgICAgICAgICAgICAgIC8vIG5leHQgdG8gYSBAV2ViU2VydmljZVJlZiBhbm5vdGF0aW9uLCBzbyB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgY2xhc3MgZGVjbGFyaW5nIEBIYW5kbGVyQ2hhaW4KLSAgICAgICAgICAgICAgICAgICAgLy8gYW5kIE5PVCByZWxhdGl2ZSB0byB0aGUgU2VydmljZSBvciBFbmRwb2ludCBjbGFzcywgd2hpY2ggYWxzbyBtZWFucyB3ZSBzaG91bGQgdXNlIHRoZSBzcGFyc2VDb21wb3NpdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhhdCBpcyB3aGVyZSB0aGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGluZm8gd291bGQgaGF2ZSBiZWVuIGxvYWRlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGFuZGxlckNoYWluRGVjbGFyaW5nQ2xhc3MgPSAoU3RyaW5nKXNwYXJzZUNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KE1EUUNvbnN0YW50cy5IQU5ETEVSX0NIQUlOX0RFQ0xBUklOR19DTEFTUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGhhbmRsZXJDaGFpbkRlY2xhcmluZ0NsYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gRGVzY3JpcHRpb25VdGlscy5vcGVuSGFuZGxlckNvbmZpZ1N0cmVhbShoYW5kbGVyRmlsZU5hbWUsIGNsYXNzTmFtZSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImhhbmRsZXJDaGFpbk5TIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyRmlsZU5hbWUsIGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyMSA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5zVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLmxvYWRIYW5kbGVyQ2hhaW5zKGlzLCBjbGFzc0xvYWRlcjEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluc1R5cGU7Ci0gICAgfQotICAKLSAgICBwdWJsaWMgSGFuZGxlckNoYWluIGdldEFubm9IYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgaWYgKHRoaXMuaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmlzU2VydmljZVByb3ZpZGVyKCkpIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFBlciBKU1ItMTgxIFRoZSBASGFuZGxlckNoYWluIGFubm90YXRpb24gTUFZIGJlIHByZXNlbnQgb24KLSAgICAgICAgICAgICAgICAgKiB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlIGFuZCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGJlYW4uIFRoZQotICAgICAgICAgICAgICAgICAqIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIGJlYW4ncyBASGFuZGxlckNoYWluIGlzIHVzZWQgaWYKLSAgICAgICAgICAgICAgICAgKiBASGFuZGxlckNoYWluIGlzIHByZXNlbnQgb24gYm90aC4gU28sIGlmIHdlIGRvIGZpbmQgdGhlCi0gICAgICAgICAgICAgICAgICogYW5ub3RhdGlvbiBvbiB0aGlzIGltcGwsIHRoZW4gZG9uJ3Qgd29ycnkgYWJvdXQgZWxzZQotICAgICAgICAgICAgICAgICAqIE90aGVyd2lzZSwgY2hlY2sgdG8gc2VlIGlmIHRoZSBTRUkgbWlnaHQgYmUgYW5ub3RhdGVkIHdpdGgKLSAgICAgICAgICAgICAgICAgKiBASGFuZGxlckNoYWluCi0gICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID0gY29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbkFubm90YXRpb24gPT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgTk9UIGFuIGltcGxpY2l0IFNFSSwgdGhlbiBjaGVjayBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFubm90YXRpb24gb24gdGhlIFNFSQotICAgICAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljID0gZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VpYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9IHNlaWMuZ2V0SGFuZGxlckNoYWluQW5ub3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9IGNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGVLZXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKHNwYXJzZUNvbXBvc2l0ZUtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZSAhPSBudWxsICYmIHNwYXJzZUNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9IHNwYXJzZUNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5Bbm5vdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBNVE9NCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIAotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uI2lzTVRPTUVuYWJsZWQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTVRPTUVuYWJsZWQoKSB7Ci0gICAgICAgIGlmIChpc01UT01FbmFibGVkQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGlzTVRPTUVuYWJsZWRDYWNoZS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gaXNNVE9NRW5hYmxlZCBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBAQmluZGluZ1R5cGUgYW5kIHRoZSBATVRPTSBzZXR0aW5nLgotICAgICAgICBNVE9NIG10b21Bbm5vdGF0aW9uID0KLSAgICAgICAgICAgICAgICAoTVRPTSkgZ2V0QW5ub0ZlYXR1cmUoTVRPTUZlYXR1cmUuSUQpOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlIEBNVE9NIGFubm90YXRpb24gaXMgc2V0LCBpdCB3aW5zCi0gICAgICAgIGlmIChtdG9tQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpc01UT01FbmFibGVkQ2FjaGUgPSBCb29sZWFuLnZhbHVlT2YobXRvbUFubm90YXRpb24uZW5hYmxlZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBpc01UT01FbmFibGVkQ2FjaGUuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEVsc2UgbG9vayBhdCB0aGUgYmluZGluZ1R5cGUKLSAgICAgICAgU3RyaW5nIGJpbmRpbmdUeXBlID0gZ2V0QmluZGluZ1R5cGUoKTsKLSAgICAgICAgaXNNVE9NRW5hYmxlZENhY2hlID0gQm9vbGVhbi52YWx1ZU9mKGlzTVRPTUJpbmRpbmcoYmluZGluZ1R5cGUpKTsKLSAgICAgICAgcmV0dXJuIGlzTVRPTUVuYWJsZWRDYWNoZS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01UT01CaW5kaW5nKFN0cmluZyB1cmwpIHsKLSAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgKHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19NVE9NX0JJTkRJTkcpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogUmVzcGVjdEJpbmRpbmcKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcmVzcGVjdEJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiByZXNwZWN0QmluZGluZzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVzcGVjdEJpbmRpbmcoYm9vbGVhbiByKSB7Ci0gICAgICAgIHJlc3BlY3RCaW5kaW5nID0gcjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGFkZFJlcXVpcmVkQmluZGluZyhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChyZXF1aXJlZEJpbmRpbmdzID09IG51bGwpCi0gICAgICAgICAgICByZXF1aXJlZEJpbmRpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIHJldHVybiByZXF1aXJlZEJpbmRpbmdzLmFkZChuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRSZXF1aXJlZEJpbmRpbmdzKCkgewotICAgICAgICBpZiAocmVxdWlyZWRCaW5kaW5ncyA9PSBudWxsKQotICAgICAgICAgICAgcmVxdWlyZWRCaW5kaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkQmluZGluZ3M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb24jZ2V0TVRPTVRocmVzaG9sZCgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNVE9NVGhyZXNob2xkKCkgewotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGNhY2hlIHRoaXMgY2FsbCBoZXJlIHNvIHdlIGRvbid0IGhhdmUgdG8gbWFrZQotICAgICAgICAgICAgLy8gaXQgb24gZXZlcnkgcGFzcyB0aHJvdWdoLgotICAgICAgICAgICAgUGFyYW1ldGVyIG10b21UaHJlc2hvbGQgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQ29uZmlndXJhdGlvbi5NVE9NX1RIUkVTSE9MRCk7Ci0gICAgICAgICAgICBpZiAobXRvbVRocmVzaG9sZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBtdG9tVGhyZXNob2xkLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgLy8gR2V0IHRoZSBzcGVjaWZpZWQgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub0ZlYXR1cmUoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHJldHVybiBmcmFtZXdvcmsuZ2V0QW5ub3RhdGlvbihpZCk7Ci0gICAgfQotICAgIAotICAgIC8vVGhlIFdlYlNlcnZpY2VGZWF0dXJlcyBzaG91bGQgYmUgY29uZmlndWVkIGxhc3Qgc28gdGhhdCBhbnkgb3RoZXIKLSAgICAvL2NvbmZpZ3VyYXRpb24gY2FuIGJlIG92ZXJyaWRkZW4uIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUKLSAgICAvL3NlcnZlciBzaWRlLgotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVXZWJTZXJ2aWNlRmVhdHVyZXMoKSB7Ci0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGlkcyA9IFNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmdldElkcygpOwotICAgICAgICAKLSAgICAgICAgZm9yIChTdHJpbmcgaWQgOiBpZHMpIHsKLSAgICAgICAgICAgIFNlcnZlckNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBTZXJ2ZXJDb25maWd1cmF0b3JSZWdpc3RyeS5nZXRDb25maWd1cmF0b3IoaWQpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdG9yLnN1cHBvcnRzKGJpbmRpbmdUeXBlKSkKLSAgICAgICAgICAgICAgICBmcmFtZXdvcmsuYWRkQ29uZmlndXJhdG9yKGlkLCBjb25maWd1cmF0b3IpOwotICAgICAgICB9Ci0gICAgCQotICAgICAgICAvLyBUaGUgZmVhdHVyZSBpbnN0YW5jZXMgYXJlIHN0b3JlZCBvbiB0aGUgY29tcG9zaXRlIGZyb20gZWl0aGVyIHRoZSAKLSAgICAgICAgLy8gSmF2YSBjbGFzcyBvciBmcm9tIHNvbWV0aGluZyBlbHNlIGJ1aWxkaW5nIHRoZSBsaXN0IGFuZCBzZXR0aW5nIGl0IHRoZXJlLgotICAgICAgICBMaXN0PEFubm90YXRpb24+IGZlYXR1cmVzID0gY29tcG9zaXRlLmdldFdlYlNlcnZpY2VGZWF0dXJlcygpOwotICAgICAgICAKLSAgICAgICAgaWYgKGZlYXR1cmVzICE9IG51bGwgJiYgZmVhdHVyZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgLy8gQWRkIGVhY2ggb2YgdGhlIGFubm90YXRpb24gaW5zdGFuY2VzIHRvIHRoZSBXZWJTZXJ2aWNlRmVhdHVyZSBmcmFtZXdvcmsKLSAgICAgICAgICAgIEl0ZXJhdG9yPEFubm90YXRpb24+IGl0ciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb24gZmVhdHVyZSA9IChBbm5vdGF0aW9uKSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZyYW1ld29yay5hZGRBbm5vdGF0aW9uKGZlYXR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBLaWNrIG9mZiB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgV2ViU2VydmljZUZlYXR1cmUgaW5zdGFuY2VzLgotICAgICAgICAgICAgZnJhbWV3b3JrLmNvbmZpZ3VyZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIGluc3RhbmNlcyB3ZXJlIGZvdW5kIG9uIHRoZSBjb21wb3NpdGUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGdldFdTRExEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKWdldFNlcnZpY2VEZXNjcmlwdGlvbigpKS5nZXRXU0RMRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgZ2V0V1NETFNlcnZpY2UoKSB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmbiA9IGdldFdTRExEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChkZWZuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZuLmdldFNlcnZpY2UoZ2V0U2VydmljZVFOYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9ydCBnZXRXU0RMUG9ydCgpIHsKLSAgICAgICAgamF2YXgud3NkbC5TZXJ2aWNlIHNlcnZpY2UgPSBnZXRXU0RMU2VydmljZSgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmljZS5nZXRQb3J0KGdldFBvcnRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0V1NETEJpbmRpbmcoKSB7Ci0gICAgICAgIEJpbmRpbmcgd3NkbEJpbmRpbmcgPSBudWxsOwotICAgICAgICBQb3J0IHdzZGxQb3J0ID0gZ2V0V1NETFBvcnQoKTsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmID0gZ2V0V1NETERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKHdzZGxQb3J0ICE9IG51bGwgJiYgd3NkbERlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsQmluZGluZyA9IHdzZGxQb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEJpbmRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMQmluZGluZ1R5cGUoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsQmluZGluZ1R5cGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgc29hcFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICAgIEJpbmRpbmcgd3NkbEJpbmRpbmcgPSBnZXRXU0RMQmluZGluZygpOwotICAgICAgICBpZiAod3NkbEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAJCi0gICAgICAgICAgICAvLyBJZiBhIFdTREwgYmluZGluZyB3YXMgZm91bmQsIHdlIG5lZWQgdG8gZmluZCB0aGUgcHJvcGVyIGV4dGVuc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgbmFtZXNwYWNlLiAgVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGJpbmRpbmcgZWxlbWVudCB3aWxsIAotICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgU09BUCAxLjEgdnMuIFNPQVAgMS4yIHZzLiBIVFRQIChvciBvdGhlcikuIElmIHRoZSBuYW1lc3BhY2UgCi0gICAgICAgICAgICAvLyBpbmRpY2F0ZXMgU09BUCB3ZSB0aGVuIG5lZWQgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHRyYW5zcG9ydCBpcyAoSFRUUCB2cy4gSk1TKQotICAgICAgICAgICAgLy8gVE9ETzogV2hhdCBkbyB3ZSBkbyBpZiBubyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgZXhpc3RzPwotICAgICAgICAgICAgTGlzdDxFeHRlbnNpYmlsaXR5RWxlbWVudD4gZWxlbWVudHMgPSB3c2RsQmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yPEV4dGVuc2liaWxpdHlFbGVtZW50PiBpdHIgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShlLmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nIHNvYXBCbmQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZyllOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy9yZXByZXNlbnRhdGlvbjogdGhpcyBpcyBzb2FwOmJpbmRpbmcgPSBlbGVtZW50VHlwZSB3aGVyZSBOYW1lc3BhY2VVUkkgaXMgInNvYXAiCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0cmFuc3BvcnQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlICd0cmFuc3BvcnQnIGF0dHJpYnV0ZSB3aXRoaW4gdGhpcyBiaW5kaW5nIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgd3NkbEJpbmRpbmdUeXBlID0gc29hcEJuZC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgICAgICAgICAgICAgIHNvYXBUcmFuc3BvcnQgPSBzb2FwQm5kLmdldFRyYW5zcG9ydFVSSSgpOwotCi0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTT0FQMTJCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZS5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICBTT0FQMTJCaW5kaW5nIHNvYXBCbmQgPSAoU09BUDEyQmluZGluZyllOwotICAgICAgICAgICAgICAgICAgICB3c2RsQmluZGluZ1R5cGUgPSBzb2FwQm5kLmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBUcmFuc3BvcnQgPSBzb2FwQm5kLmdldFRyYW5zcG9ydFVSSSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhUVFBCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZS5nZXRDbGFzcygpKSkgewotICAgICAgICAgICAgICAgICAgICBIVFRQQmluZGluZyBodHRwQm5kID0gKEhUVFBCaW5kaW5nKWU7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxCaW5kaW5nVHlwZSA9IGh0dHBCbmQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNvbnZlcnQgdGhlIHdzZGwtYmFzZWQgU09BUCBhbmQgSFRUUCBuYW1lc3BhY2UgaW50byB0aGUgZXhwZWN0ZWQgQmluZGluZyBUeXBlIGZvciAKLSAgICAgICAgICAgIC8vIEhUVFAgb3IgU09BUEJpbmRpbmdzIHdpdGggdGhlIGFwcHJvcHJpYXRlIHRyYW5zcG9ydCAoSFRUUCwgSk1TLCBldGMuKQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3aGF0IHdlJ3JlIGFjdHVhbGx5IHJldHVybmluZyBpcyB0aGUgV1NETCBiaW5kaW5nIHR5cGUgdmFsdWUgY29udmV0ZWQKLSAgICAgICAgICAgIC8vIHRvIHRoZSBjb3JyZXNwb25kaW5nIFNPQVBCaW5kaW5nIG9yIEhUVFBCaW5kaW5nIHZhbHVlLiAgV2UgYXJlIG92ZXJ3aXRlIHRoZSAKLSAgICAgICAgICAgIC8vIHdzZGxCaW5kaW5nVHlwZSB3aXRoIHRoYXQgY29udmVydGVkIEpBWFdTIGFubm90YXRpb24gYmluZGluZyB0eXBlIHZhbHVlIGFuZAotICAgICAgICAgICAgLy8gcmV0dXJuIGl0LgotICAgICAgICAgICAgd3NkbEJpbmRpbmdUeXBlID0gRGVzY3JpcHRpb25VdGlscy5tYXBCaW5kaW5nVHlwZVdzZGxUb0Fubm90YXRpb24od3NkbEJpbmRpbmdUeXBlLCBzb2FwVHJhbnNwb3J0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEJpbmRpbmdUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJTZXJ2aWNlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9ydEluZm8gZ2V0UG9ydEluZm8oKSB7Ci0gICAgICAgIGlmIChwb3J0SW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0SW5mbyA9IG5ldyBQb3J0SW5mb0ltcGwoZ2V0U2VydmljZVFOYW1lKCksIGdldFBvcnRRTmFtZSgpLCBnZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50QmluZGluZ0lEKFN0cmluZyBjbGllbnRCaW5kaW5nSUQpIHsKLQotICAgICAgICBpZiAoY2xpZW50QmluZGluZ0lEID09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuY2xpZW50QmluZGluZ0lEID0gREVGQVVMVF9DTElFTlRfQklORElOR19JRDsKLSAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0ZUNsaWVudEJpbmRpbmdJRChjbGllbnRCaW5kaW5nSUQpKSB7Ci0gICAgICAgICAgICB0aGlzLmNsaWVudEJpbmRpbmdJRCA9IGNsaWVudEJpbmRpbmdJRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoImFkZFBvcnRFcnIwIiwgZ2V0UG9ydFFOYW1lKCkudG9TdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQ2xpZW50QmluZGluZ0lEKFN0cmluZyBiaW5kaW5nSWQpIHsKLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgaWYgKGJpbmRpbmdJZCAhPSBudWxsICYmICEoYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nSWQuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIGJpbmRpbmdJZC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIGJpbmRpbmdJZC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIGJpbmRpbmdJZC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ0lkLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORykpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJhZGRQb3J0RXJyMCIsIGdldFBvcnRRTmFtZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNWYWxpZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEJpbmRpbmdJRCgpIHsKLSAgICAgICAgaWYgKGNsaWVudEJpbmRpbmdJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0V1NETERlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50QmluZGluZ0lEID0gZ2V0V1NETEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudEJpbmRpbmdJRCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudEJpbmRpbmdJRCA9IERFRkFVTFRfQ0xJRU5UX0JJTkRJTkdfSUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGllbnRCaW5kaW5nSUQgPSBERUZBVUxUX0NMSUVOVF9CSU5ESU5HX0lEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGllbnRCaW5kaW5nSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRBZGRyZXNzKFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgLy8gUkVWSUVXOiBTaG91bGQgdGhpcyBiZSBjYWxsZWQgd2hlbmV2ZXIgQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkgaXMgc2V0IGJ5IHRoZSBjbGllbnQ/Ci0gICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGVuZHBvaW50QWRkcmVzcykpIHsKLSAgICAgICAgICAgIHRoaXMuZW5kcG9pbnRBZGRyZXNzID0gZW5kcG9pbnRBZGRyZXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2luY2UgYSBwb3J0IGNhbiBiZSBhZGRlZCB3aXRob3V0IHNldHRpbmcgYW4gZW5kcG9pbnQgYWRkcmVzcywgdGhpcyBpcyBub3QgYW4gZXJyb3IuCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBIG51bGwgb3IgZW1wdHkgZW5kcG9pbnQgYWRkcmVzcyB3YXMgYXR0ZW1wdGVkIHRvIGJlIHNldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJvd2FibGUoIlN0YWNrIFRyYWNlYmFjayIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnRBZGRyZXNzKCkgewotICAgICAgICBpZiAoZW5kcG9pbnRBZGRyZXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBlbmRwb2ludEFkZHJlc3MgaGFzIG5vdCBiZWVuIHNldCBleHBsaWNpdGx5IGJ5IGEgY2FsbCB0byBzZXRFbmRwb2ludEFkZHJlc3MoKQotICAgICAgICAgICAgLy8gdGhlbiB0cnkgdG8gZ2V0IGl0IGZyb20gdGhlIFdTREwKLSAgICAgICAgICAgIGVuZHBvaW50QWRkcmVzcyA9IGdldFdTRExTT0FQQWRkcmVzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmRwb2ludEFkZHJlc3M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZihwcm9wZXJ0aWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmKHByb3BlcnRpZXMgIT0gbnVsbCkgewotICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFNPQVAgQWRkcmVzcyBmcm9tIHRoZSBXU0RMIGZvciB0aGlzIHBvcnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBTT0FQIEFkZHJlc3MgZnJvbSB0aGUgV1NETCBmb3IgdGhpcyBwb3J0IG9yIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMU09BUEFkZHJlc3MoKSB7Ci0gICAgICAgIGlmICh3c2RsU09BUEFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IGdldFdTRExQb3J0KCk7Ci0gICAgICAgICAgICBpZiAod3NkbFBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBwb3J0IGlzIGluIHRoZSBXU0RMLCBzbyBzZWUgaWYgaXQgaGFzIGEgU09BUCBhZGRyZXNzIGV4dGVuc2liaWxpdHkgZWxlbWVudCBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgTGlzdCBleHRFbGVtZW50TGlzdCA9IHdzZGxQb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGxpc3RFbGVtZW50IDogZXh0RWxlbWVudExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClsaXN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzU09BUEFkZHJlc3NFbGVtZW50KGV4dEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFkZHJlc3MgPSBnZXRTT0FQQWRkcmVzc0Zyb21FbGVtZW50KGV4dEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoc29hcEFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbFNPQVBBZGRyZXNzID0gc29hcEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGxTT0FQQWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIFdTREwgRXh0ZW5zaWJpbGl0eSBlbGVtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBTT0FQIEFkZHJlc3MgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleEVsZW1lbnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gaXNTT0FQQWRkcmVzc0VsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXhFbGVtZW50KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNBZGRyZXNzID0gZmFsc2U7Ci0gICAgICAgIGlmIChleEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaXNBZGRyZXNzID0gKFNPQVBfMTFfQUREUkVTU19FTEVNRU5ULmVxdWFscyhleEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgKFNPQVBfMTJfQUREUkVTU19FTEVNRU5ULmVxdWFscyhleEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXNBZGRyZXNzOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0U09BUEFkZHJlc3NGcm9tRWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50KSB7Ci0gICAgICAgIFN0cmluZyByZXR1cm5BZGRyZXNzID0gbnVsbDsKLQotICAgICAgICBpZiAoZXh0RWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoU09BUF8xMV9BRERSRVNTX0VMRU1FTlQuZXF1YWxzKGV4dEVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5BZGRyZXNzID0gKChTT0FQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChTT0FQXzEyX0FERFJFU1NfRUxFTUVOVC5lcXVhbHMoZXh0RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybkFkZHJlc3MgPSAoKFNPQVAxMkFkZHJlc3MpZXh0RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5BZGRyZXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbGVjdHMgYSBwb3J0IHRvIHVzZSBpbiB0aGUgY2FzZSB3aGVyZSBhIHBvcnRRTmFtZSB3YXMgbm90IHNwZWNpZmllZCBieSB0aGUgY2xpZW50IG9uIHRoZQotICAgICAqIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgY2FsbC4gIElmIFdTREwgaXMgcHJlc2VudCwgdGhlbiBhbiBhcHByb3ByaWF0ZSBwb3J0IGlzIGxvb2tlZCBmb3IKLSAgICAgKiB1bmRlciB0aGUgc2VydmljZSBlbGVtZW50LCBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiBub25lIGNhbiBiZSBmb3VuZC4gIElmIFdTREwgaXMgbm90Ci0gICAgICogcHJlc2VudCwgdGhlbiB0aGUgc2VsZWN0ZWQgcG9ydCBpcyBzaW1wbHkgdGhlIG9uZSBkZXRlcm1pbmVkIGJ5IGFubm90YXRpb25zLgotICAgICAqCi0gICAgICogQHJldHVybiBBIFFOYW1lIHJlcHJlc2VudGluZyB0aGUgcG9ydCB0aGF0IGlzIHRvIGJlIHVzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBRTmFtZSBzZWxlY3RQb3J0VG9Vc2UoKSB7Ci0gICAgICAgIFFOYW1lIHBvcnRUb1VzZSA9IG51bGw7Ci0gICAgICAgIC8vIElmIFdTREwgU2VydmljZSBmb3IgdGhpcyBwb3J0IGlzIHByZXNlbnQsIHRoZW4gd2UnbGwgZmluZCBhbiBhcHByb3ByaWF0ZSBwb3J0IGRlZmluZWQgaW4gdGhlcmUgYW5kIHNldCAKLSAgICAgICAgLy8gdGhlIG5hbWUgYWNjb3JkaW5nbHkuICBJZiBubyBXU0RMIGlzIHByZXNlbnQsIHRoZSB0aGUgUG9ydFFOYW1lIGdldHRlciB3aWxsIHVzZSBhbm5vdGF0aW9ucyB0byBzZXQgdGhlIHZhbHVlLgotICAgICAgICBpZiAoZ2V0V1NETFNlcnZpY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0VG9Vc2UgPSBzZWxlY3RXU0RMUG9ydFRvVXNlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBObyBXU0RMLCBzbyB0aGUgcG9ydCB0byB1c2UgaXMgdGhlIG9uZSBkZWZpbmVkIGJ5IHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgICAgIHBvcnRUb1VzZSA9IGdldFBvcnRRTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0VG9Vc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9vayB0aHJvdWdoIHRoZSBXU0RMIFNlcnZpY2UgZm9yIGEgcG9ydCB0aGF0IHNob3VsZCBiZSB1c2VkLiAgSWYgbm9uZSBjYW4gYmUgZm91bmQsIHRoZW4KLSAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3NkbFNlcnZpY2UKLSAgICAgKiBAcmV0dXJuIEEgUU5hbWUgcmVwcmVzZW50aW5nIHRoZSBwb3J0IGZyb20gdGhlIFdTREwgdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFFOYW1lIHNlbGVjdFdTRExQb3J0VG9Vc2UoKSB7Ci0gICAgICAgIFFOYW1lIHdzZGxQb3J0VG9Vc2UgPSBudWxsOwotCi0gICAgICAgIC8vIFRvIHNlbGVjdCB3aGljaCBXU0RMIFBvcnQgdG8gdXNlLCB3ZSBkbyB0aGUgZm9sbG93aW5nCi0gICAgICAgIC8vIDEpIEZpbmQgdGhlIHN1YnNldCBvZiBhbGwgcG9ydHMgdW5kZXIgdGhlIHNlcnZpY2UgdGhhdCB1c2UgdGhlIFBvcnRUeXBlIHJlcHJlc2VudGVkIGJ5IHRoZSBTRUkKLSAgICAgICAgLy8gMikgRnJvbSB0aGUgc3Vic2V0IGluICgxKSBmaW5kIGFsbCB0aG9zZSBwb3J0cyB0aGF0IHNwZWNpZnkgYSBTT0FQIEFkZHJlc3MKLSAgICAgICAgLy8gMykgVXNlIHRoZSBmaXJzdCBwb3J0IGZyb20gKDIpCi0KLSAgICAgICAgLy8gUGVyIEpTUi0xODEsIAotICAgICAgICAvLyAtIFRoZSBwb3J0VHlwZSBuYW1lIGNvcnJlc3BvbmRzIHRvIHRoZSBXZWJTZXJ2aWNlLm5hbWUgYW5ub3RhdGlvbiB2YWx1ZSwgd2hpY2ggaXMKLSAgICAgICAgLy8gICByZXR1cm5lZCBieSBnZXROYW1lKCkKLSAgICAgICAgLy8gLSBUaGUgcG9ydFR5cGUgbmFtZXNwYWNlIGNvcnJlc3BvbmRzIHRvIHRoZSBXZWJTZXJ2aWNlLnRhcmdldE5hbWVzcGFjZSBhbm5vdGF0aW9uLCB3aGljaAotICAgICAgICAvLyAgIGlzIHJldHVybmVkIGJ5IGdldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICAgIFN0cmluZyBwb3J0VHlwZUxQID0gZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgcG9ydFR5cGVUTlMgPSBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgUU5hbWUgcG9ydFR5cGVRTiA9IG5ldyBRTmFtZShwb3J0VHlwZVROUywgcG9ydFR5cGVMUCk7Ci0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uV1NETCBzZXJ2aWNlRGVzY1dTREwgPSAoU2VydmljZURlc2NyaXB0aW9uV1NETClnZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLQotICAgICAgICBMaXN0PFBvcnQ+IHdzZGxQb3J0c1VzaW5nUG9ydFR5cGUgPSBzZXJ2aWNlRGVzY1dTREwuZ2V0V1NETFBvcnRzVXNpbmdQb3J0VHlwZShwb3J0VHlwZVFOKTsKLSAgICAgICAgTGlzdDxQb3J0PiB3c2RsUG9ydHNVc2luZ1NPQVBBZGRyZXNzZXMgPQotICAgICAgICAgICAgICAgIHNlcnZpY2VEZXNjV1NETC5nZXRXU0RMUG9ydHNVc2luZ1NPQVBBZGRyZXNzKHdzZGxQb3J0c1VzaW5nUG9ydFR5cGUpOwotICAgICAgICBpZiAod3NkbFBvcnRzVXNpbmdTT0FQQWRkcmVzc2VzICE9IG51bGwgJiYgIXdzZGxQb3J0c1VzaW5nU09BUEFkZHJlc3Nlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIFdlIHJldHVybiB0aGUgZmlyc3QgcG9ydCB0aGF0IHVzZXMgdGhlIHBhcnRpY2x1YXIgUG9ydFR5cGUgYW5kIGhhcyBhIFNPQVAgYWRkcmVzcy4KLSAgICAgICAgICAgIC8vIEhPV0VWRVIsIHRoYXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBmaXJzdCBvbmUgaW4gdGhlIFdTREwgdGhhdCBtZWV0cyB0aGF0IGNyaXRlcmlhISAgCi0gICAgICAgICAgICAvLyBUaGUgcHJvYmxlbSBpcyB0aGF0IFdTREw0SiBTZXJ2aWNlLmdldFBvcnRzKCksIHdoaWNoIGlzIHVzZWQgdG8gZ2V0IGEgTWFwIG9mIHBvcnRzIHVuZGVyIHRoZSBzZXJ2aWNlIAotICAgICAgICAgICAgLy8gRE9FUyBOT1QgcmV0dXJuIHRoZSBwb3J0cyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZGVmaW5lZCBpbiB0aGUgV1NETC4gIAotICAgICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBjYW4ndCBuZWNlc3NhcmlseSBwcmVkaWN0IHdoaWNoIG9uZSB3ZSdsbCBnZXQgYmFjayBhcyB0aGUgImZpcnN0IiBvbmUgaW4gdGhlIGNvbGxlY3Rpb24uCi0gICAgICAgICAgICAvLyBSRVZJRVc6IE5vdGUgdGhlIGFib3ZlIGNvbW1lbnQ7IGlzIHRoZXJlIGFueXRoaW5nIG1vcmUgcHJlZGljdGlibGUgYW5kIGRldGVybWluc3RpYyB3ZSBjYW4gZG8/Ci0gICAgICAgICAgICBQb3J0IHBvcnRUb1VzZSA9IChQb3J0KXdzZGxQb3J0c1VzaW5nU09BUEFkZHJlc3Nlcy50b0FycmF5KClbMF07Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydExvY2FsUGFydCA9IHBvcnRUb1VzZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWVzcGFjZSA9IHNlcnZpY2VEZXNjV1NETC5nZXRXU0RMU2VydmljZSgpLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICB3c2RsUG9ydFRvVXNlID0gbmV3IFFOYW1lKHBvcnROYW1lc3BhY2UsIHBvcnRMb2NhbFBhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdzZGxQb3J0VG9Vc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBXc2RsQ29tcG9zaXRlIGdlbmVyYXRlV1NETChEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0KLSAgICAgICAgV3NkbENvbXBvc2l0ZSB3c2RsQ29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZuID0gZGJjLmdldFdzZGxEZWZpbml0aW9uKGdldFNlcnZpY2VRTmFtZSgpKTsKLSAgICAgICAgaWYoZGVmbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZuID0gZGJjLmdldFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlZm4gPT0gbnVsbCB8fCAhaXNBeGlzU2VydmljZUJ1aWx0RnJvbVdTREwpIHsKLQotICAgICAgICAgICAgLy9JbnZva2UgdGhlIGNhbGxiYWNrIGZvciBnZW5lcmF0aW5nIHRoZSB3c2RsCi0gICAgICAgICAgICBpZiAoZGJjLmdldEN1c3RvbVdzZGxHZW5lcmF0b3IoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGltcGxOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbXBsTmFtZSA9IERlc2NyaXB0aW9uVXRpbHMuamF2aWZ5Q2xhc3NOYW1lKGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbE5hbWUgPSAoU3RyaW5nKWF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKE1EUUNvbnN0YW50cy5TRVJWSUNFX0NMQVNTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd3NkbENvbXBvc2l0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYmMuZ2V0Q3VzdG9tV3NkbEdlbmVyYXRvcigpLmdlbmVyYXRlV3NkbChpbXBsTmFtZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAod3NkbENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHdzZGxDb21wb3NpdGUuZ2V0V3NkbEZpbGVOYW1lKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIuZXF1YWxzKHdzZGxDb21wb3NpdGUuZ2V0V3NkbEZpbGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsQ29tcG9zaXRlLnNldFdzZGxGaWxlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKSArICIud3NkbCIpLnRvTG93ZXJDYXNlKCkpOyAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmID0gd3NkbENvbXBvc2l0ZS5nZXRSb290V3NkbERlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBkYmMuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTREw0SldyYXBwZXIgd3NkbDRqV3JhcHBlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0aldyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcihkYmMuZ2V0V3NkbFVSTCgpLCB3c2RsRGVmLCBjYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw0aldyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcihkYmMuZ2V0V3NkbFVSTCgpLCB3c2RsRGVmLCB0cnVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5zZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcih3c2RsNGpXcmFwcGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZ2VuZXJhdGVXU0RMRXJyIiksZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBSRVZJRVc6RGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBhbHdheXMgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIHRoaXMsIG9yIGF0IHRoaXMgcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKCJFbmRwb2ludERlc2NyaXB0aW9uSW1wbDogVW5hYmxlIHRvIGZpbmQgY3VzdG9tIFdTREwgZ2VuZXJhdG9yIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGN1c3RvbSBXU0RMIGdlbmVyYXRvciByZXR1cm5lZCBudWxsLCBzbyBubyBnZW5lcmF0ZWQgV1NETCBpcyBhdmFpbGFibGUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgdXNlZCB0byB0aHJvdyBhbiBleGNlcHRpb24sIGJ1dCBpdCBzZWVtcyB3ZSBzaG91bGRuJ3QgcmVxdWlyZQotICAgICAgICAgICAgICAgIC8vIGEgd3NkbCBnZW5lcmF0b3IgYmUgcHJvdmlkZWQuCi0vLyAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKCJFbmRwb2ludERlc2NyaXB0aW9uSW1wbDogVW5hYmxlIHRvIGZpbmQgY3VzdG9tIFdTREwgZ2VuZXJhdG9yIik7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY3VzdG9tIFdTREwgZ2VuZXJhdG9yIHdhcyBzdXBwbGllZCwgc28gV1NETCBjYW4gbm90IGJlIGdlbmVyYXRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbENvbXBvc2l0ZTsKLSAgICB9Ci0gICAgCi0gICAgTGlzdDxDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U+IGdldEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBjdXN0b21Bbm5vdGF0aW9uczsKLSAgICB9Ci0gICAgCi0gICAgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvciBnZXRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yKFN0cmluZyBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3JzICE9IG51bGwgPyAKLSAgICAgICAgICAgICAgICBjdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29ycy5nZXQoYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKSA6IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkgewotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTmFtZTogIiArIGdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkVuZHBvaW50IEFkZHJlc3M6ICIgKyBnZXRFbmRwb2ludEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNlcnZpY2VRTmFtZTogIiArIGdldFNlcnZpY2VRTmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUG9ydFFOYW1lOiAiICsgZ2V0UG9ydFFOYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJUYXJnZXROYW1lc3BhY2U6ICIgKyBnZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNlcnZpY2UgTW9kZTogIiArIGdldFNlcnZpY2VNb2RlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJCaW5kaW5nIFR5cGU6ICIgKyBnZXRCaW5kaW5nVHlwZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQ2xpZW50IEJpbmRpbmcgVHlwZTogIiArIGdldENsaWVudEJpbmRpbmdJRCgpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgcHJvdmlkZXItYmFzZWQ6ICIgKyAoaXNQcm92aWRlckJhc2VkKCkgPT0gdHJ1ZSkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJJcyBwcm94eS1iYXNlZDogIiArIChpc0VuZHBvaW50QmFzZWQoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIklzIFdTREwgZnVsbHkgc3BlY2lmaWVkOiAiICsgKGlzV1NETEZ1bGx5U3BlY2lmaWVkKCkgPT0gdHJ1ZSkpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJBeGlzU2VydmljZTogIiArIGdldEF4aXNTZXJ2aWNlKCkpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb246ICIgKyBlbmRwb2ludEludGVyZmFjZURlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gaXMgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJDb21wbGV0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICJFbmRwb2ludERlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQ2xhc3MgY2xzLCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIENsYXNzIGZvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiBpbml0aWFsaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzcykgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBpbml0aWFsaXplLCBjbGFzc2xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBDbGFzc0xvYWRlciBjbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyIDogVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIHVwZGF0ZSBvciBzZXQgdGhlIHBhcmFtZXRlciBvbiB0aGUgQXhpc1NlcnZpY2UgdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAqIHZhbHVlIG9mIHRoZSBAV2ViU2VydmljZS5uYW1lIGF0dHJpYnV0ZS4gVGhpcyBpcyBuZWVkZWQgc2luY2UgdGhlIEBXZWJTZXJ2aWNlLm5hbWUKLSAgICAgKiB2YWx1ZSBtYXkgbm90IGJlIGtub3duIHVudGlsIHRoZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGlzIGNyZWF0ZWQgZm9yCi0gICAgICogdGhlIGV4cGxpY2l0bHkgZGVmaW5lZCBTRUkuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlTmFtZVBhcmFtZXRlcihTdHJpbmcgbmV3TmFtZSwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIEBXZWJTZXJ2aWNlLm5hbWUgdmFsdWUgb24gdGhlICIgKyBzZXJ2aWNlLmdldE5hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICIgQXhpc1NlcnZpY2UgdG86ICIgKyBuZXdOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBzZXJ2aWNlLmdldFBhcmFtZXRlcihNRFFDb25zdGFudHMuV1NETF9QT1JUVFlQRV9OQU1FKTsKLSAgICAgICAgaWYocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW0uc2V0VmFsdWUobmV3TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgIHBhcmFtLnNldE5hbWUoTURRQ29uc3RhbnRzLldTRExfUE9SVFRZUEVfTkFNRSk7Ci0gICAgICAgICAgICBwYXJhbS5zZXRWYWx1ZShuZXdOYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKHBhcmFtKTsgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXR1cEF4aXNTZXJ2aWNlRXJyMiIpLGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgY3VycmVudFVuaXF1ZUlEID0gMDsKLSAgICBwcml2YXRlIGxvbmcgdW5pcXVlSUQoKSB7Ci0gICAgICAgIGlmIChjdXJyZW50VW5pcXVlSUQgPT0gMCkgewotICAgICAgICAgICAgY3VycmVudFVuaXF1ZUlEID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGN1cnJlbnRVbmlxdWVJRCsrOwotICAgIH0KLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSB0aGUgQXhpc1NlcnZpY2Ugb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBFbmRwb2ludERlc2NyaXB0aW9uLiAgTm90ZSB0aGF0Ci0gICAgICogdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiB0aGF0IG93bnMgdGhpcyBFbmRwb2ludERlc2NyaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Db250ZXh0ICBUaGUgQXhpczIgQ29uZmlndXJhdGlvbkNvbnRleHQgaG9sZGluZyB0aGUgQXhpc0NvbmZpZ3VyYXRpb24KLSAgICAgKiBmcm9tIHdoaWNoIHRoZSBBeGlzU2VydmljZXMgc2hvdWxkIGJlIHJlbW92ZWQuCi0gICAgICovCi0gICAgdm9pZCByZWxlYXNlUmVzb3VyY2VzKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB7Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IGF4aXNTZXJ2aWNlLmdldEF4aXNTZXJ2aWNlR3JvdXAoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5yZW1vdmVTZXJ2aWNlR3JvdXAoYXhpc1NlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmRwb2ludERlc2NyaXB0aW9uSW1wbCByZWxlYXNlIHJlc291cmNlcyBjYXVnaHQgZXhjZXB0aW9uIHdoaWNoIGl0IGlzIGlnbm9yaW5nIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwZTMwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiBAc2VlIC4uL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gKi8KLWNsYXNzIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsCi0gICAgICAgIGltcGxlbWVudHMgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiwgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEsCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMIHsKLSAgICBwcml2YXRlIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHBhcmVudEVuZHBvaW50RGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+IG9wZXJhdGlvbkRlc2NyaXB0aW9ucyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPigpOwotICAgIHByaXZhdGUgTWFwPFFOYW1lLCBMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPj4gZGlzcGF0Y2hhYmxlT3BlcmF0aW9uczsKLSAgICBwcml2YXRlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmM7Ci0KLSAgICAvL0xvZ2dpbmcgc2V0dXAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwuY2xhc3MpOwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT04gcmVsYXRlZCBpbmZvcm1hdGlvbgotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8vIEFOTk9UQVRJT046IEBXZWJTZXJ2aWNlCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlIHdlYlNlcnZpY2VBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZV9OYW1lOwotCi0KLSAgICAvLyBBTk5PVEFUSU9OOiBAU09BUEJpbmRpbmcKLSAgICAvLyBOb3RlIHRoaXMgaXMgdGhlIFR5cGUtbGV2ZWwgYW5ub3RhdGlvbi4gIFNlZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBmb3IgdGhlIE1ldGhvZC1sZXZlbCBhbm5vdGF0aW9uCi0gICAgcHJpdmF0ZSBTT0FQQmluZGluZyBzb2FwQmluZGluZ0Fubm90YXRpb247Ci0gICAgcHJpdmF0ZSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBzb2FwQmluZGluZ1N0eWxlOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuNyAiQW5ub3RhdGlvbjogamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciIHBnIDI4Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBTT0FQQmluZGluZ19TdHlsZV9ERUZBVUxUID0KLSAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UOwotICAgIHByaXZhdGUgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIHNvYXBCaW5kaW5nVXNlOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuNyAiQW5ub3RhdGlvbjogamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciIHBnIDI4Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgU09BUEJpbmRpbmdfVXNlX0RFRkFVTFQgPQotICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUw7Ci0gICAgcHJpdmF0ZSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBzb2FwUGFyYW1ldGVyU3R5bGU7Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBTZWMgNC43ICJBbm5vdGF0aW9uOiBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZyIgcGcgMjgKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlIFNPQVBCaW5kaW5nX1BhcmFtZXRlclN0eWxlX0RFRkFVTFQgPQotICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRDsKLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgb3BlcmF0aW9uRGVzY3JpcHRpb24gdG8gdGhlIGxpc3Qgb2Ygb3BlcmF0aW9ucy4gIE5vdGUgdGhhdCB3ZSBjYW4gbm90IGNyZWF0ZSB0aGUKLSAgICAgKiBsaXN0IG9mIGRpc3BhdGNoYWJsZSBvcGVyYXRpb25zIGF0IHRoaXMgcG9pbnRzLgotICAgICAqIEBzZWUgI2luaXRpYWxpemVEaXNwYXRjaGFibGVPcGVyYXRpb25zTGlzdCgpCi0gICAgICogCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIGRlc2NyaXB0aW9uIHRvIGFkZCB0byB0aGlzIGVuZHBvaW50IGludGVyZmFjZQotICAgICAqLwotICAgIHZvaWQgYWRkT3BlcmF0aW9uKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbikgewotICAgICAgICBvcGVyYXRpb25EZXNjcmlwdGlvbnMuYWRkKG9wZXJhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgc2VydmljZSByZXF1ZXN0ZXIgKGFrYSBjbGllbnQtc2lkZSkgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBmb3IgdGhlCi0gICAgICogZ2l2ZW4gU0VJIGNsYXNzLiAgVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGlmIGhpZXJhY2h5IGlzIGJlaW5nIGJ1aWx0IGZ1bGx5IGZyb20gYW5ub3RhdGlvbnMKLSAgICAgKiBhbmQgbm90IFdTREwuCi0gICAgICogQHBhcmFtIHNlaQotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChDbGFzcyBzZWksIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHBhcmVudCkgewotICAgICAgICBwYXJlbnRFbmRwb2ludERlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGRiYy5zZXRDb3JyZXNwb25kaW5nQ2xhc3Moc2VpKTsKLQotICAgICAgICAvLyBQZXIgSlNSLTE4MSBhbGwgbWV0aG9kcyBvbiB0aGUgU0VJIGFyZSBtYXBwZWQgdG8gb3BlcmF0aW9ucyByZWdhcmRsZXNzCi0gICAgICAgIC8vIG9mIHdoZXRoZXIgdGhleSBpbmNsdWRlIGFuIEBXZWJNZXRob2QgYW5ub3RhdGlvbi4gIFRoYXQgYW5ub3RhdGlvbiBtYXkKLSAgICAgICAgLy8gYmUgcHJlc2VudCB0byBjdXN0b21pemUgdGhlIG1hcHBpbmcsIGJ1dCBpcyBub3QgcmVxdWlyZWQgKHAxNCkKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogZ2V0U0VJTWV0aG9kcyhkYmMuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCkpKSB7Ci0gICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKG1ldGhvZCwgdGhpcyk7Ci0gICAgICAgICAgICBhZGRPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgfSAKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBzZXJ2aWNlIHJlcXVlc3RlciAoYWthIGNsaWVudC1zaWRlKSBFbmRwb2ludEludGVyZmFjZURlc2NycHRpb24gZm9yCi0gICAgICogYW4gU0VJIHJlcHJlc2VudGVkIGJ5IGFuIEF4aXNTZXJ2aWNlLiAgVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGlmIHRoZSBoaWVyYWNoeSBpcwotICAgICAqIGJlaW5nIGJ1aWx0IGZ1bGx5IGZyb20gV1NETC4gIFRoZSBBeGlzU2VydmljZSBhbmQgdW5kZXJseWluZyBBeGlzT3BlcmF0aW9ucyB3ZXJlIGJ1aWx0Ci0gICAgICogYmFzZWQgb24gdGhlIFdTREwsIHNvIHdlIHdpbGwgdXNlIHRoZW0gdG8gY3JlYXRlIHRoZSBuZWNlc3Nhcnkgb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKi8KLSAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBwYXJlbnQpIHsKLSAgICAgICAgcGFyZW50RW5kcG9pbnREZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IHBhcmVudEVuZHBvaW50RGVzY3JpcHRpb24uZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgaWYgKGF4aXNTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBwdWJsaXNoZWRPcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0UHVibGlzaGVkT3BlcmF0aW9ucygpOwotICAgICAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9uc0l0ZXJhdG9yID0gcHVibGlzaGVkT3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG9wZXJhdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbilvcGVyYXRpb25zSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGFkZE9wZXJhdGlvbihuZXcgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKGF4aXNPcGVyYXRpb24sIHRoaXMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYXMgUHJvdmlkZXItYmFzZWQgZW5kcG9pbnQgd2hpY2ggZG9lcyBub3QgaGF2ZSBzcGVjaWZpYyBXU0RMIG9wZXJhdGlvbnMuICBTaW5jZSB0aGVyZQotICAgICAqIGFyZSBubyBzcGVjaWZpYyBXU0RMIG9wZXJhdGlvbnMgaW4gdGhpcyBjYXNlLCB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlIGdlbmVyaWMgb3BlcmF0aW9uIHRoYXQKLSAgICAgKiB3aWxsIGFjY2VwdCBhbnkgaW5jb21pbmcgb3BlcmF0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSBkYmMKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICovCi0gICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgcGFyZW50KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJDcmVhdGluZyBhIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZm9yIGEgZ2VuZXJpYyBXU0RMLWxlc3MgcHJvdmlkZXIiKTsKLSAgICAgICAgfQotICAgICAgICBwYXJlbnRFbmRwb2ludERlc2NyaXB0aW9uID0gcGFyZW50OwotICAgICAgICB0aGlzLmRiYyA9IGRiYzsKLSAgICAgICAgCi0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgZ2VuZXJpYyBwcm92aWRlciBBeGlzT3BlcmF0aW9uIHRvIHVzZSB0aGVuIGNvbnN0cnVjdAotICAgICAgICAvLyBhbiBPcGVyYWN0aW9uRGVzY3JpcHRpb24gZm9yIGl0LgotICAgICAgICBBeGlzT3BlcmF0aW9uIGdlbmVyaWNQcm92aWRlckF4aXNPcCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZW5lcmljUHJvdmlkZXJBeGlzT3AgPSAKLSAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uRmFjdG9yeS5nZXRPcGVyYXRpb25EZXNjcmlwdGlvbihXU0RMQ29uc3RhbnRzLldTREwyMF8yMDA2Q29uc3RhbnRzLk1FUF9VUklfSU5fT1VUKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZWlEZXNjckltcGxFcnIiKSxlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ2VuZXJpY1Byb3ZpZGVyQXhpc09wLnNldE5hbWUobmV3IFFOYW1lKEpBWFdTX05PV1NETF9QUk9WSURFUl9PUEVSQVRJT05fTkFNRSkpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSBuZXcgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKGdlbmVyaWNQcm92aWRlckF4aXNPcCwgdGhpcyk7Ci0gICAgICAgIAotICAgICAgICBhZGRPcGVyYXRpb24ob3BEZXNjKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkT3BlcmF0aW9uKGdlbmVyaWNQcm92aWRlckF4aXNPcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgYW4gRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBmcm9tIGEgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLiAgVGhpcyBFSUQgaGFzCi0gICAgICogV1NETCBvcGVyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBpdC4gIEl0IGNvdWxkIHJlcHJlc2VudCBhbiBTRUktYmFzZWQgZW5kcG9pbnQgYnVpbHQgZnJvbQotICAgICAqIFdTREwgb3IgYW5ub3RhdGlvbnMsIE9SIGl0IGNvdWxkIHJlcHJlc2VudCBhIFByb3ZpZGVyLWJhc2VkIGVucG9pbnQgYnVpbHQgZnJvbSBXU0RMLiAgSXQgd2lsbAotICAgICAqIG5vdCByZXByZXNlbnQgYSBQcm92aWRlci1iYXNlZCBlbmRwb2ludCBidWlsdCB3aXRob3V0IFdTREwgKHdoaWNoIGRvZXMgbm90IGtub3cgYWJvdXQKLSAgICAgKiBzcGVjaWZpYyBXU0RMIG9wZXJhdGlvbnMpLiBGb3IgdGhhdCB0eXBlIG9mIEVJRCwgc2VlOgotICAgICAqIEBzZWUgICNFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbChEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjLCBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBwYXJlbnQpCi0gICAgICogQHBhcmFtIGRiYwotICAgICAqIEBwYXJhbSBpc0NsYXNzCi0gICAgICogQHBhcmFtIHBhcmVudAotICAgICAqLwotICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIHBhcmVudCkgewotCi0gICAgICAgIHBhcmVudEVuZHBvaW50RGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuZGJjID0gZGJjOwotCi0gICAgICAgIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRBeGlzU2VydmljZSgpCi0gICAgICAgICAgICAgICAgLnNldFRhcmdldE5hbWVzcGFjZShnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotICAgICAgICAvLyBQZXIgSlNSLTE4MSBhbGwgbWV0aG9kcyBvbiB0aGUgU0VJIGFyZSBtYXBwZWQgdG8gb3BlcmF0aW9ucyByZWdhcmRsZXNzCi0gICAgICAgIC8vIG9mIHdoZXRoZXIgdGhleSBpbmNsdWRlIGFuIEBXZWJNZXRob2QgYW5ub3RhdGlvbi4gIFRoYXQgYW5ub3RhdGlvbiBtYXkKLSAgICAgICAgLy8gYmUgcHJlc2VudCB0byBjdXN0b21pemUgdGhlIG1hcHBpbmcsIGJ1dCBpcyBub3QgcmVxdWlyZWQgKHAxNCkKLQotICAgICAgICAvL1dlIGFyZSBwcm9jZXNzaW5nIHRoZSBTRUkgY29tcG9zaXRlCi0gICAgICAgIC8vRm9yIGV2ZXJ5IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGluIHRoaXMgbGlzdCwgY2FsbCBPcGVyYXRpb25EZXNjcmlwdGlvbiAKLSAgICAgICAgLy9jb25zdHJ1Y3RvciBmb3IgaXQsIHRoZW4gYWRkIHRoaXMgb3BlcmF0aW9uCi0KLSAgICAgICAgLy9SZXRyaWV2ZSB0aGUgcmVsZXZlbnQgbWV0aG9kIGNvbXBvc2l0ZXMgZm9yIHRoaXMgZGJjIChhbmQgdGhvc2UgaW4gdGhlIHN1cGVyY2xhc3MgY2hhaW4pCi0gICAgICAgIEl0ZXJhdG9yPE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBpdGVyID0gcmV0cmlldmVSZWxldmVudE1ldGhvZHMoZGJjKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2cuZGVidWcoIkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsOiBGaW5pc2hlZCByZXRyaWV2aW5nIG1ldGhvZHMiKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbnVsbDsKLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG1kYyA9IGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBtZGMuc2V0RGVjbGFyaW5nQ2xhc3MoZGJjLmdldENsYXNzTmFtZSgpKTsKLQotICAgICAgICAgICAgLy8gT25seSBhZGQgaWYgaXQgaXMgYSBtZXRob2QgdGhhdCB3b3VsZCBiZSBvciBpcyBpbiB0aGUgV1NETCBpLmUuIAotICAgICAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIGFuIE9wZXJhdGlvbkRlc2NyaXB0b3IgZm9yIHRoZSBNREMgcmVwcmVzZW50aW5nIHRoZQotICAgICAgICAgICAgLy8gY29uc3RydWN0b3IKLSAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmNyZWF0ZU9wZXJhdGlvbkRlc2NyaXB0aW9uKG1kYy5nZXRNZXRob2ROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgLy9GaXJzdCBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgQXhpc1NlcnZpY2UsIGlmIHNvCi0gICAgICAgICAgICAgICAgLy90aGVuIHVzZSB0aGF0IGluIHRoZSBkZXNjcmlwdGlvbiBoaWVyYXJjaHkKLQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPcGVyYXRpb24oT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsLmRldGVybWluZU9wZXJhdGlvblFOYW1lKG1kYykpOwotCi0gICAgICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwobWRjLCB0aGlzLCBheGlzT3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBheGlzT3BlcmF0aW9uIGRpZCBub3QgYWxyZWFkeSBleGlzdCBvbiB0aGUgQXhpc1NlcnZpY2UsIGFuZCBzbyB3YXMgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbiwgc28gd2UgbmVlZCB0byBhZGQgdGhlIG9wZXJhdGlvbiB0byB0aGUgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbClvcGVyYXRpb24pLmFkZFRvQXhpc1NlcnZpY2UoYXhpc1NlcnZpY2UpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFSUQ6IEp1c3QgYWRkZWQgb3BlcmF0aW9uPSAiICsgb3BlcmF0aW9uLmdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGw6IEZpbmlzaGVkIEFkZGluZyBvcGVyYXRpb25zIik7Ci0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZFtdIGdldFNFSU1ldGhvZHMoQ2xhc3Mgc2VpKSB7Ci0gICAgICAgIC8vIFBlciBKU1ItMTgxIGFsbCBtZXRob2RzIG9uIHRoZSBTRUkgYXJlIG1hcHBlZCB0byBvcGVyYXRpb25zIHJlZ2FyZGxlc3MKLSAgICAgICAgLy8gb2Ygd2hldGhlciB0aGV5IGluY2x1ZGUgYW4gQFdlYk1ldGhvZCBhbm5vdGF0aW9uLiAgVGhhdCBhbm5vdGF0aW9uIG1heQotICAgICAgICAvLyBiZSBwcmVzZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWFwcGluZywgYnV0IGlzIG5vdCByZXF1aXJlZCAocDE0KQotICAgICAgICBNZXRob2RbXSBzZWlNZXRob2RzID0gc2VpLmdldE1ldGhvZHMoKTsKLSAgICAgICAgQXJyYXlMaXN0IG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChzZWkgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogc2VpTWV0aG9kcykgewotCi0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0aG9kTGlzdC5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSlNSLTE4MSBzYXlzIG1ldGhvZHMgbXVzdCBiZSBwdWJsaWMgKHAxNCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZWlNZXRob2RzRXJyIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdGhlciB2YWxpZGF0aW9uIHBlciBKU1ItMTgxCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1ldGhvZFtdKW1ldGhvZExpc3QudG9BcnJheShuZXcgTWV0aG9kW21ldGhvZExpc3Quc2l6ZSgpXSk7Ci0vLyAgICAgICAgcmV0dXJuIHNlaU1ldGhvZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gd2l0aCBpbmZvcm1hdGlvbiBmcm9tIGFuIGFubm90YXRlZAotICAgICAqIFNFSS4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IHdoZW4gdGhlIHRoaXMgd2FzIGNyZWF0ZWQgd2l0aCBXU0RMLiBJbiB0aGlzIGNhc2UsIHRoZQotICAgICAqIGluZm9ybWF0aW9uIGZyb20gdGhlIFdTREwgaXMgYXVnbWVudGVkIGJhc2VkIG9uIHRoZSBhbm5vdGF0ZWQgU0VJLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlaQotICAgICAqLwotICAgIHZvaWQgdXBkYXRlV2l0aFNFSShDbGFzcyBzZWkpIHsKLSAgICAgICAgQ2xhc3Mgc2VpQ2xhc3MgPSBkYmMuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7Ci0gICAgICAgIGlmIChzZWlDbGFzcyAhPSBudWxsICYmIHNlaUNsYXNzICE9IHNlaSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VpUHJvY2Vzc2luZ0VyciIpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VpQ2xhc3MgIT0gbnVsbCAmJiBzZWlDbGFzcyA9PSBzZWkpIHsKLSAgICAgICAgICAgIC8vIFdlJ3ZlIGFscmVhZHkgZG9uZSB0aGUgbmVjZXNzYXJ5IHVwZGF0ZXMgZm9yIHRoaXMgU0VJCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlaUNsYXNzID0gc2VpOwotICAgICAgICAgICAgZGJjLnNldENvcnJlc3BvbmRpbmdDbGFzcyhzZWkpOwotICAgICAgICAgICAgLy8gVXBkYXRlIChvciBwb3NzaWJseSBhZGQpIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBmb3IgZWFjaCBvZiB0aGUgbWV0aG9kcyBvbiB0aGUgU0VJLgotICAgICAgICAgICAgZm9yIChNZXRob2Qgc2VpTWV0aG9kIDogZ2V0U0VJTWV0aG9kcyhzZWlDbGFzcykpIHsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRPcGVyYXRpb24oc2VpTWV0aG9kKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIE9wRGVzYyBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMgamF2YSBtZXRob2Qgc2V0IG9uIGl0LCB0aGVuIHRoZSBPcERlc2MgaGFzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiB1cGRhdGVkIGZvciB0aGlzIG1ldGhvZCwgc28gc2tpcCBpdC4KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgKGZvciBub3cgYXQgbGVhc3QpIHRoZSBvcGVyYXRpb25zIHdlcmUgY3JlYXRlZCB3aXRoIFdTREwgcHJldmlvdXNseS4KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGV5IGhhZCBiZWVuIGNyZWF0ZWQgZnJvbSBhbiBhbm5vdGF0ZWQgY2xhc3MgYW5kIG5vIFdTREwsIHRoZW4gdGhlIHNlaUNsYXNzIHdvdWxkIGhhdmUgCi0gICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBiZWVuIHNldCBzbyB3ZSB3b3VsZCBoYXZlIHRha2VuIG90aGVyIGJyYW5jaGVzIGluIHRoaXMgaWYgdGVzdC4gIChOb3RlIHRoaXMgY291bGQKLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2Ugb25jZSBBeGlzU2VydmljZXMgY2FuIGJlIGJ1aWx0IGZyb20gYW5ub3RhdGlvbnMgYnkgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBjbGFzcykuCi0gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG9wZXJhdGlvbnMgd2VyZSBjcmVhdGVkIGZyb20gV1NETCwgdGhleSB3aWxsIG5vdCBoYXZlIGEgamF2YSBtZXRob2QsIHdoaWNoCi0gICAgICAgICAgICAgICAgLy8gY29tZXMgZnJvbSB0aGUgU0VJLCBzZXQgb24gdGhlbSB5ZXQuCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBBbm90aGVyIGNvbnNpZGVyYXRpb24gaXMgdGhhdCBjdXJyZW50bHkgQXhpczIgZG9lcyBub3Qgc3VwcG9ydCBvdmVybG9hZGVkIFdTREwgb3BlcmF0aW9ucy4KLSAgICAgICAgICAgICAgICAvLyBUaGF0IG1lYW5zIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgT3BlcmF0aW9uRGVzYyBidWlsZCBmcm9tIFdTREwuICBTdGlsbCBhbm90aGVyIGNvbnNpZGVyYXRpb24gaXMKLSAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBKQVhXUyBhc3luYyBtZXRob2RzIHdoaWNoIG1heSBleGlzdCBvbiB0aGUgU0VJIHdpbGwgTk9UIGV4aXN0IGluIHRoZSBXU0RMLiAgQW4gZXhhbXBsZQotICAgICAgICAgICAgICAgIC8vIG9mIHRoZXNlIG1ldGhvZHMgZm9yIHRoZSBXU0RMIG9wZXJhdGlvbjoKLSAgICAgICAgICAgICAgICAvLyAgICAgU3RyaW5nIGVjaG8oU3RyaW5nKQotICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgZ2VuZXJhdGVkIEpBWC1XUyBTRUkgbWV0aG9kcyBmcm9tIHRoZSB0b29saW5nOyB0YWtlIG5vdGUgb2YgdGhlIGFubm90YXRpb24gc3BlY2lmeWluZyB0aGUgCi0gICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIG5hbWUKLSAgICAgICAgICAgICAgICAvLyAgICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPSJlY2hvIiAuLi4pCi0gICAgICAgICAgICAgICAgLy8gICAgIFJlc3BvbnNlPFN0cmluZz4gZWNob1N0cmluZ0FzeW5jKFN0cmluZykKLSAgICAgICAgICAgICAgICAvLyAgICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lPSJlY2hvIiAuLi4pCi0gICAgICAgICAgICAgICAgLy8gICAgIEZ1dHVyZTw/PiBlY2hvU3RyaW5nQXN5bmMoU3RyaW5nLCBBc3luY0hhbmRsZXIpCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBTbyBnaXZlbiBhbGwgdGhlIGFib3ZlLCB0aGUgY29kZSBkb2VzIHRoZSBmb2xsb3dpbmcgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiBRTmFtZQotICAgICAgICAgICAgICAgIC8vICh3aGljaCBtaWdodCBhbHNvIGJlIHRoZSBqYXZhIG1ldGhvZCBuYW1lOyBzZWUgZGV0ZXJtaW5lT3BlcmF0aW9uUU5hbWUgZm9yIGRldGFpbHMpCi0gICAgICAgICAgICAgICAgLy8gKDEpIElmIGFuIG9wZXJhdGlvbkRlc2MgZG9lcyBub3QgZXhpc3QsIGFkZCBpdC4KLSAgICAgICAgICAgICAgICAvLyAoMikgSWYgYW4gb3BlcmF0aW9uRGVzYyBkb2VzIGV4aXN0IGJ1dCBkb2VzIG5vdCBoYXZlIGEgamF2YSBtZXRob2Qgc2V0IG9uIGl0LCBzZXQgaXQKLSAgICAgICAgICAgICAgICAvLyAoMykgSWYgYW4gb3BlcmF0aW9uRGVzYyBkb2VzIGV4aXN0IGFuZCBoYXMgYSBqYXZhIG1ldGhvZCBzZXQgb24gaXQgYWxyZWFkeSwgYWRkIGEgbmV3IG9uZS4gCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYXkgbmVlZCB0byBjaGFuZ2Ugd2hlbiBBeGlzMiBzdXBwb3J0cyBvdmVybG9hZGVkIFdTREwgb3BlcmF0aW9ucwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBRTmFtZSBmb3IgdGhpcyBqYXZhIG1ldGhvZCBhbmQgdGhlbiB1cGRhdGUgKG9yIGFkZCkgdGhlIGFwcHJvcHJpYXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnRzIGJlbG93IGZvciBpbXBvcmFudCBub3RlcyBhYm91dCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBOT1RFIE9OIE9WRVJMT0FERUQgT1BFUkFUSU9OUwotICAgICAgICAgICAgICAgIC8vIEF4aXMyIGRvZXMgTk9UIGN1cnJlbnRseSBzdXBwb3J0IG92ZXJsb2FkaW5nIFdTREwgb3BlcmF0aW9ucy4KLSAgICAgICAgICAgICAgICBRTmFtZSBzZWlPcGVyYXRpb25RTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuZGV0ZXJtaW5lT3BlcmF0aW9uUU5hbWUoc2VpTWV0aG9kKTsKLSAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIHVwZGF0ZU9wRGVzYyA9IGdldE9wZXJhdGlvbihzZWlPcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZU9wRGVzYyA9PSBudWxsIHx8IHVwZGF0ZU9wRGVzYy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG9wZXJhdGlvbiB3YXNuJ3QgZGVmaW5lZCBpbiB0aGUgV1NETC4gIE5vdGUgdGhhdCB0aGUgSkFYLVdTIGFzeW5jIG1ldGhvZHMKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYXJlIGRlZmluZWQgb24gdGhlIFNFSSBhcmUgbm90IGRlZmluZWQgYXMgb3BlcmF0aW9ucyBpbiB0aGUgV1NETC4KLSAgICAgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggdGhleSB1c3VhbGx5IHNwZWNpZmljIHRoZSBzYW1lIE9wZXJhdGlvbk5hbWUgYXMgdGhlIFdTREwgb3BlcmF0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlcmUgbWF5IGJlIGNhc2VzIHdoZXJlIHRoZXkgZG8gbm90LgotICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKHNlaU1ldGhvZCwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSBBeGlzMiBkb2VzIG5vdCBzdXBwb3J0IG92ZXJsb2FkZWQgb3BlcmF0aW9ucy4gIFRoYXQgbWVhbnMgdGhhdCBldmVuIGlmIHRoZSBXU0RMCi0gICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZWQgb3ZlcmxvYWRlZCBvcGVyYXRpb25zLCB0aGVyZSB3b3VsZCBzdGlsbCBvbmx5IGJlIGEgc2luZ2xlIEF4aXNPcGVyYXRpb24sIGFuZCBpdAotICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSB0aGUgbGFzdCBvcGVyYXRpb24gZW5jb3VudGVyZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gSE9XRVZFUiB0aGUgZ2VuZXJhdGVkIEpBWC1XUyBhc3luYyBtZXRob2RzIChzZWUgYWJvdmUpIG1heSAod2lsbCBhbHdheXM/KSBoYXZlIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbiBuYW1lIGFuZCBzbyB3aWxsIGNvbWUgZG93biB0aGlzIHBhdGg7IHRoZXkgbmVlZCB0byBiZSBhZGRlZC4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV2hlbiBBeGlzMiBzdGFydHMgc3VwcG9ydGluZyBvdmVybG9hZGVkIG9wZXJhdGlvbnMsIHRoZW4gdGhpcyBsb2dpYyB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZAotCi0gICAgICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIG9wZGVzY3M7IGlmIG9uZSBkb2Vzbid0IGN1cnJlbnRseSBoYXZlIGEgamF2YSBtZXRob2Qgc2V0LCBzZXQgaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYWxsIGhhdmUgamF2YSBtZXRob2RzIHNldCwgdGhlbiBhZGQgYSBuZXcgb25lLiAgQXNzdW1lIHdlJ2xsIG5lZWQgdG8gYWRkIGEgbmV3IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRPcERlc2MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIGNoZWNrT3BEZXNjIDogdXBkYXRlT3BEZXNjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tPcERlc2MuZ2V0U0VJTWV0aG9kKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGJlIGNoZWNraW5nIChzb21laG93KSB0aGF0IHRoZSBzaWduYXR1cmUgbWF0Y2hlcz8gIFByb2JhYmx5IG5vdCBhbiBpc3N1ZSB1bnRpbCBvdmVybG9hZGVkIFdTREwgb3BzIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhhdCB0aGlzIGlzIG5vdCBvbmUgb2YgdGhlICdhc3luYycgbWV0aG9kcyBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoaXMgb3BlcmF0aW9uLiBJZiBpdCBpcywgbGV0IGl0IGJlIGNyZWF0ZWQgYXMgaXRzIG93biBvcERlc2MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzQXN5bmMoc2VpTWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbCkgY2hlY2tPcERlc2MpLnNldFNFSU1ldGhvZChzZWlNZXRob2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPcERlc2MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRPcERlc2MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoc2VpTWV0aG9kLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBPcGVyYXRpb25EZXNjcmlwdGlvbnMgY29ycmVzcG9uZGluZyB0byBhIHBhcnRpY3VsYXIgSmF2YSBtZXRob2QgbmFtZS4gTm90ZSB0aGF0IGFuCi0gICAgICogYXJyYXkgaXMgcmV0dXJuZWQgYmVjYXVzZSBhIG1ldGhvZCBjb3VsZCBiZSBvdmVybG9hZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFNZXRob2ROYW1lIFN0cmluZyByZXByZXNlbnRpbmcgYSBKYXZhIE1ldGhvZCBOYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbltdIGdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoU3RyaW5nIGphdmFNZXRob2ROYW1lKSB7Ci0gICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoamF2YU1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEFycmF5TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4gbWF0Y2hpbmdPcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBnZXRPcGVyYXRpb25zKCkpIHsKLSAgICAgICAgICAgIGlmIChqYXZhTWV0aG9kTmFtZS5lcXVhbHMob3BlcmF0aW9uLmdldEphdmFNZXRob2ROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hpbmdPcGVyYXRpb25zLmFkZChvcGVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucy5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdPcGVyYXRpb25zLnRvQXJyYXkobmV3IE9wZXJhdGlvbkRlc2NyaXB0aW9uWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIE9wZXJhdGlvbkRlc3JpcHRpb24gKG9ubHkgb25lKSBjb3JyZXNwb25kaW5nIHRvIHRoZSBPcGVyYXRpb25OYW1lIHBhc3NlZCBpbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb25OYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb24oU3RyaW5nIG9wZXJhdGlvbk5hbWUpIHsKLSAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShvcGVyYXRpb25OYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBtYXRjaGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uIDogZ2V0T3BlcmF0aW9ucygpKSB7Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMob3BlcmF0aW9uLmdldE9wZXJhdGlvbk5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGluZ09wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hpbmdPcGVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0T3BlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbkRlc2NyaXB0aW9ucy50b0FycmF5KG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvblswXSk7Ci0gICAgfQotCi0gICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0gICAgICAgIHJldHVybiAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpcGFyZW50RW5kcG9pbnREZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gcGFyZW50RW5kcG9pbnREZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgT3BlcmF0aW9ucyBnaXZlbiBhbiBvcGVyYXRpb24gUU5hbWUuICBOb3RlIHRoYXQgYW4gYXJyYXkgaXMgcmV0dXJuZWQgc2luY2UKLSAgICAgKiBhIFdTREwgb3BlcmF0aW9uIG1heSBiZSBvdmVybG9hZGVkIHBlciBKQVgtV1MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0T3BlcmF0aW9uKFFOYW1lIG9wZXJhdGlvblFOYW1lKSB7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gcmV0dXJuT3BlcmF0aW9ucyA9IG51bGw7Ci0gICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KG9wZXJhdGlvblFOYW1lKSkgewotICAgICAgICAgICAgQXJyYXlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPiBtYXRjaGluZ09wZXJhdGlvbnMgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPigpOwotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBhbGxPcGVyYXRpb25zID0gZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBhbGxPcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKG9wZXJhdGlvblFOYW1lLmdldExvY2FsUGFydCgpKSkgewotICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ09wZXJhdGlvbnMuYWRkKG9wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT25seSByZXR1cm4gYW4gYXJyYXkgaWYgdGhlcmUncyBhbnl0aGluZyBpbiBpdAotICAgICAgICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuT3BlcmF0aW9ucyA9IG1hdGNoaW5nT3BlcmF0aW9ucy50b0FycmF5KG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvblswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybk9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24jZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9uKFFOYW1lIG9wZXJhdGlvblFOYW1lKQotICAgICovCi0gICAgcHVibGljIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gZ2V0RGlzcGF0Y2hhYmxlT3BlcmF0aW9uKFFOYW1lIG9wZXJhdGlvblFOYW1lKSB7Ci0gICAgICAgIC8vIFJFVklFVzogQ2FuIHRoaXMgYmUgc3luY2VkIGF0IGEgbW9yZSBncmFudWxhciBsZXZlbD8gIENhbid0IHN5bmMgb24gZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucyBiZWNhdXNlCi0gICAgICAgIC8vICAgICAgICAgaXQgbWF5IGJlIG51bGwsIGJ1dCBhbHNvIHRoZSBpbml0aWFsaXphdGlvbiBtdXN0IGZpbmlzaCBiZWZvcmUgbmV4dCB0aHJlYWQgc2VlcyAKLSAgICAgICAgLy8gICAgICAgICBkaXNwYXRhY2hhYmxlT3BlcmF0aW9ucyAhPSBudWxsCi0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAoZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZURpc3BhdGNoYWJsZU9wZXJhdGlvbnNMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOb3RlIHRoYXQgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsIGNyZWF0ZXMgb3BlcmF0aW9uIHFuYW1lIHdpdGggZW1wdHkgbmFtZXNwYWNlLiBUaHVzIAotICAgICAgICAvLyB1c2luZyBvbmx5IHRoZSBsb2NhbFBhcnQgdG8gZ2V0IGRpc3BhdGNoYWJsZSBvcGVyYXRpb25zLgotICAgIAlRTmFtZSBrZXkgPSBuZXcgUU5hbWUoIiIsb3BlcmF0aW9uUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIAlMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPiBvcGVyYXRpb25zID0gZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucy5nZXQoa2V5KTsKLSAgICAJaWYob3BlcmF0aW9ucyE9bnVsbCl7Ci0gICAgCQlyZXR1cm4gb3BlcmF0aW9ucy50b0FycmF5KG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvbltvcGVyYXRpb25zLnNpemUoKV0pOwotICAgIAl9Ci0gICAgCXJldHVybiBuZXcgT3BlcmF0aW9uRGVzY3JpcHRpb25bMF07Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiNnZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBnZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCkgewotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIHJldHVybk9wZXJhdGlvbnMgPSBudWxsOwotCi0gICAgICAgIC8vIFJFVklFVzogQ2FuIHRoaXMgYmUgc3luY2VkIGF0IGEgbW9yZSBncmFudWxhciBsZXZlbD8gIENhbid0IHN5bmMgb24gZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucyBiZWNhdXNlCi0gICAgICAgIC8vICAgICAgICAgaXQgbWF5IGJlIG51bGwsIGJ1dCBhbHNvIHRoZSBpbml0aWFsaXphdGlvbiBtdXN0IGZpbmlzaCBiZWZvcmUgbmV4dCB0aHJlYWQgc2VlcyAKLSAgICAgICAgLy8gICAgICAgICBkaXNwYXRhY2hhYmxlT3BlcmF0aW9ucyAhPSBudWxsCi0gICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICBpZiAoZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5pdGlhbGl6ZURpc3BhdGNoYWJsZU9wZXJhdGlvbnNMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbjxMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPj4gZGlzcGF0Y2hhYmxlVmFsdWVzID0gZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucy52YWx1ZXMoKTsKLSAgICAgICAgSXRlcmF0b3I8TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4+IGl0ZXJhdG9yVmFsdWVzID0gZGlzcGF0Y2hhYmxlVmFsdWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIEFycmF5TGlzdDxPcGVyYXRpb25EZXNjcmlwdGlvbj4gYWxsRGlzcGF0Y2hhYmxlT3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvclZhbHVlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIExpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+IG9wRGVzY0xpc3QgPSBpdGVyYXRvclZhbHVlcy5uZXh0KCk7Ci0gICAgICAgICAgICBhbGxEaXNwYXRjaGFibGVPcGVyYXRpb25zLmFkZEFsbChvcERlc2NMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYWxsRGlzcGF0Y2hhYmxlT3BlcmF0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm5PcGVyYXRpb25zID0gYWxsRGlzcGF0Y2hhYmxlT3BlcmF0aW9ucy50b0FycmF5KG5ldyBPcGVyYXRpb25EZXNjcmlwdGlvblthbGxEaXNwYXRjaGFibGVPcGVyYXRpb25zLnNpemUoKV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PcGVyYXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgbGlzdCBvZiBkaXNwYXRjaGFibGUgb3BlcmF0aW9ucyBmcm9tIHRoZSBsaXN0IG9mIGFsbCB0aGUgb3BlcmF0aW9ucy4gIEEgCi0gICAgICogZGlzcGF0Y2hhYmxlIG9wZXJhdGlvbiBpcyBvbmUgdGhhdCBjYW4gYmUgaW52b2tlZCBvbiB0aGUgZW5kcG9pbnQsIHNvIGl0IERPRVMgTk9UIGluY2x1ZGU6Ci0gICAgICogLSBKQVhXUyBDbGllbnQgQXN5bmMgbWV0aG9kcwotICAgICAqIC0gTWV0aG9kcyB0aGF0IGhhdmUgYmVlbiBleGNsdWRlZCB2aWEgV2ViTWV0aG9kLmV4Y2x1ZGUgYW5ub3RhdGlvbgotICAgICAqCi0gICAgICogTm90ZTogV2UgaGF2ZSB0byBjcmVhdGUgdGhlIGxpc3Qgb2YgZGlzcGF0Y2hhYmxlIG9wZXJhdGlvbnMgaW4gYSBsYXp5IHdheTsgd2UgY2FuJ3QKLSAgICAgKiBjcmVhdGUgaXQgYXMgdGhlIG9wZXJhdGlvbnMgYXJlIGFkZGVkIHZpYSBhZGRPcGVyYXRpb25zKCkgYmVjYXVzZSBvbiB0aGUgY2xpZW50Ci0gICAgICogdGhhdCBsaXN0IGlzIGJ1aWx0IGluIHR3byBwYXJ0czsgZmlyc3QgdXNpbmcgQXhpc09wZXJhdGlvbnMgZnJvbSB0aGUgV1NETCwgd2hpY2ggd2lsbAotICAgICAqIG5vdCBoYXZlIGFueSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIChzdWNoIGFzIFdlYk1ldGhvZC5leGNsdWRlKS4gIFRoYXQgbGlzdCB3aWxsIHRoZW4KLSAgICAgKiAgYmUgdXBkYXRlZCB3aXRoIFNFSSBpbmZvcm1hdGlvbiwgd2hpY2ggaXMgdGhlIHBvaW50IGFubm90YXRpb24gaW5mb3JtYXRpb24gYmVjb21lcwotICAgICAqICBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEaXNwYXRjaGFibGVPcGVyYXRpb25zTGlzdCgpIHsKLSAgICAgICAgZGlzcGF0Y2hhYmxlT3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPj4oKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcERlc2NzID0gZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBmb3IgKE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA6IG9wRGVzY3MpIHsKLSAgICAgICAgICBpZiAoIW9wRGVzYy5pc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSAmJiAhb3BEZXNjLmlzRXhjbHVkZWQoKSkgewotICAgICAgICAgICAgICBMaXN0PE9wZXJhdGlvbkRlc2NyaXB0aW9uPiBkaXNwYXRjaGFibGVPcGVyYXRpb25zV2l0aE5hbWUgPSBkaXNwYXRjaGFibGVPcGVyYXRpb25zLmdldChvcERlc2MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgaWYoZGlzcGF0Y2hhYmxlT3BlcmF0aW9uc1dpdGhOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIGRpc3BhdGNoYWJsZU9wZXJhdGlvbnNXaXRoTmFtZSA9IG5ldyBBcnJheUxpc3Q8T3BlcmF0aW9uRGVzY3JpcHRpb24+KCk7Ci0gICAgICAgICAgICAgICAgICBkaXNwYXRjaGFibGVPcGVyYXRpb25zLnB1dChvcERlc2MuZ2V0TmFtZSgpLCBkaXNwYXRjaGFibGVPcGVyYXRpb25zV2l0aE5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGRpc3BhdGNoYWJsZU9wZXJhdGlvbnNXaXRoTmFtZS5hZGQob3BEZXNjKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gT3BlcmF0aW9uRGVzY3JpcHRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIFNFSSBtZXRob2QuICBOb3RlIHRoYXQgdGhpcyBPTkxZIHdvcmtzCi0gICAgICogaWYgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9ucyB3ZXJlIGNyZWF0ZWQgZnJvbSBpbnRyb3NwZWN0aW5nIGFuIFNFSS4gIElmIHRoZSB3ZXJlIGNyZWF0ZWQKLSAgICAgKiB3aXRoIGEgV1NETCB0aGVuIHVzZSB0aGUgZ2V0T3BlcmF0aW9uKFFOYW1lKSBtZXRob2QsIHdoaWNoIGNhbiByZXR1cm4gPiAxIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWlNZXRob2QgVGhlIGphdmEubGFuZy5NZXRob2QgZnJvbSB0aGUgU0VJIGZvciB3aGljaCBhbiBPcGVyYXRpb25EZXNjcmlwdGlvbiBpcwotICAgICAqICAgICAgICAgICAgICAgICAgd2FudGVkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvbiBnZXRPcGVyYXRpb24oTWV0aG9kIHNlaU1ldGhvZCkgewotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiByZXR1cm5PcGVyYXRpb24gPSBudWxsOwotICAgICAgICBpZiAoc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gYWxsT3BlcmF0aW9ucyA9IGdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uIDogYWxsT3BlcmF0aW9ucykgewotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb24uZ2V0U0VJTWV0aG9kKCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0U0VJTWV0aG9kKCkuZXF1YWxzKHNlaU1ldGhvZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5PcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5PcGVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldFNFSUNsYXNzKCkgewotICAgICAgICByZXR1cm4gZGJjLmdldENvcnJlc3BvbmRpbmdDbGFzcygpOwotICAgIH0KLSAgICAvLyBBbm5vdGF0aW9uLXJlYWx0ZWQgZ2V0dGVycwotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIFNPQVAgQmluZGluZyBhbm5vdGF0aW9uIHJlYWx0ZWQgbWV0aG9kcwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwdWJsaWMgU09BUEJpbmRpbmcgZ2V0QW5ub1NvYXBCaW5kaW5nKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdBbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQW5ub3RhdGlvbiA9IGRiYy5nZXRTb2FwQmluZGluZ0Fubm90KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9Tb2FwQmluZGluZ1N0eWxlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIGdldEFubm9Tb2FwQmluZGluZ1N0eWxlKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdTdHlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1NvYXBCaW5kaW5nKCkgIT0gbnVsbCAmJiBnZXRBbm5vU29hcEJpbmRpbmcoKS5zdHlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZ1N0eWxlID0gZ2V0QW5ub1NvYXBCaW5kaW5nKCkuc3R5bGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBCaW5kaW5nX1N0eWxlX0RFRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGU7Ci0gICAgfQotCi0gICAgcHVibGljIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9Tb2FwQmluZGluZ1VzZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgZ2V0QW5ub1NvYXBCaW5kaW5nVXNlKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdVc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9Tb2FwQmluZGluZygpICE9IG51bGwgJiYgZ2V0QW5ub1NvYXBCaW5kaW5nKCkudXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nVXNlID0gZ2V0QW5ub1NvYXBCaW5kaW5nKCkudXNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nVXNlID0gU09BUEJpbmRpbmdfVXNlX0RFRkFVTFQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nVXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7Ci0gICAgICAgIGlmIChzb2FwUGFyYW1ldGVyU3R5bGUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9Tb2FwQmluZGluZygpICE9IG51bGwgJiYgZ2V0QW5ub1NvYXBCaW5kaW5nKCkucGFyYW1ldGVyU3R5bGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcFBhcmFtZXRlclN0eWxlID0gZ2V0QW5ub1NvYXBCaW5kaW5nKCkucGFyYW1ldGVyU3R5bGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc29hcFBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmdfUGFyYW1ldGVyU3R5bGVfREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcFBhcmFtZXRlclN0eWxlOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBSZXR1cm5zIGEgbm9uLW51bGwgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlcwotICAgICovCi0gICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHJpZXZlUmVsZXZlbnRNZXRob2RzKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLQotICAgICAgICAvKgotICAgICAgICAqIERlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgaXMgYW4gaW1wbGljaXQgU0VJIG9yIGFuIGFjdHVhbCBTRUksIEdhdGhlciB1cCBhbmQgYnVpbGQgYQotICAgICAgICAqIGxpc3Qgb2YgTURDJ3MuIElmIHRoaXMgaXMgYW4gYWN0dWFsIFNFSSwgdGhlbiBzdGFydGluZyB3aXRoIHRoaXMgREJDLCBidWlsZCBhIGxpc3Qgb2YgYWxsCi0gICAgICAgICogTURDJ3MgdGhhdCBhcmUgcHVibGljIG1ldGhvZHMgaW4gdGhlIGNoYWluIG9mIGV4dGVuZGVkIGNsYXNzZXMuCi0gICAgICAgICogSWYgdGhpcyBpcyBhbiBpbXBsaWNpdCBTRUksIHRoZW4gc3RhcnRpbmcgd2l0aCB0aGlzIERCQywKLSAgICAgICAgKiAgMS4gSWYgYSBmYWxzZSBleGNsdWRlIGlzIGZvdW5kLCB0aGVuIHRha2Ugb25seSB0aG9zZSB0aGF0IGhhdmUgZmFsc2UgZXhjbHVkZXMKLSAgICAgICAgKiAgMi4gQXNzdW1pbmcgbm8gZmFsc2UgZXhjbHVkZXMsIHRha2UgYWxsIHB1YmxpYyBtZXRob2RzIHRoYXQgZG9uJ3QgaGF2ZSBleGNsdWRlID09IHRydWUKLSAgICAgICAgKiAgMy4gRm9yIGVhY2ggc3VwZXIgY2xhc3MsIGlmICdXZWJTZXJ2aWNlJyBwcmVzZW50LCB0YWtlIGFsbCBNREMncyBhY2NvcmRpbmcgdG8gcnVsZXMgMSYyCi0gICAgICAgICogICAgQnV0LCBpZiBXZWJTZXJ2aWNlIG5vdCBwcmVzZW50LCBncmFiIG9ubHkgTURDJ3MgdGhhdCBhcmUgYW5ub3RhdGVkLgotICAgICAgICAqLwotICAgICAgICBpZiAobG9nLmlzVHJhY2VFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy50cmFjZSgicmV0cmlldmVSZWxldmVudE1ldGhvZHM6IEVudGVyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHJldHJpZXZlTGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKTsKLQotICAgICAgICBpZiAoZGJjLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZW1vdmluZyBvdmVycmlkZGVuIG1ldGhvZHMgZm9yIGludGVyZmFjZTogIiArIGRiYy5nZXRDbGFzc05hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggc3VwZXIgaW50ZXJmYWNlOiAiICsgZGJjLmdldFN1cGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgcmV0cmlldmUgYWxsIHRoZSBtZXRob2RzLCB0aGVuIHJlbW92ZSB0aGUgb3ZlcnJpZGRlbgotICAgICAgICAgICAgLy8gbWV0aG9kcyB0aGF0IGV4aXN0IGluIHRoZSBiYXNlIGludGVyZmFjZQotICAgICAgICAgICAgcmV0cmlldmVMaXN0ID0gcmV0cmlldmVTRUlNZXRob2RzQ2hhaW4oZGJjKTsKLSAgICAgICAgICAgIHJldHJpZXZlTGlzdCA9IHJlbW92ZU92ZXJyaWRkZW5NZXRob2RzKHJldHJpZXZlTGlzdCwgZGJjKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy90aGlzIGlzIGFuIGltcGxpZWQgU0VJLi4ucnVsZXMgYXJlIG1vcmUgY29tcGxpY2F0ZWQKLQotICAgICAgICAgICAgcmV0cmlldmVMaXN0ID0gcmV0cmlldmVJbXBsaWNpdFNFSU1ldGhvZHMoZGJjKTsKLQotICAgICAgICAgICAgLy9Ob3csIGNvbnRpbnVlIHRvIGJ1aWxkIHRoaXMgbGlzdCB3aXRoIHJlbGV2ZW50IG1ldGhvZHMgaW4gdGhlIGNoYWluIG9mCi0gICAgICAgICAgICAvL3N1cGVyY2xhc3Nlcy4gSWYgdGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIHN1cGVyY2xhc3NlcyBpcyB0aGUgc2FtZSBhcyBmb3IKLSAgICAgICAgICAgIC8vdGhlIG9yaWdpbmFsIFNFSSwgdGhlbiB3ZSBjYW4gY29tYmluZSB0aGlzIGNvZGUgd2l0aCBhYm92ZSBjb2RlLiBCdXQsIGl0cyBwb3NzaWJsZQotICAgICAgICAgICAgLy90aGUgbG9naWMgaXMgZGlmZmVyZW50IGZvciBzdXBlcmNsYXNzZXMuLi5rZWVwaW5nIHNlcGFyYXRlIGZvciBub3cuCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgdGVtcERCQyA9IGRiYzsKLQotICAgICAgICAgICAgd2hpbGUgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkodGVtcERCQy5nZXRTdXBlckNsYXNzTmFtZSgpKSkgewotCi0gICAgICAgICAgICAgICAgLy92ZXJpZnkgdGhhdCB0aGlzIHN1cGVyY2xhc3MgbmFtZSBpcyBub3QKLSAgICAgICAgICAgICAgICAvLyAgICAgIGphdmEubGFuZy5vYmplY3QsIGlmIHNvLCB0aGVuIHdlJ3JlIGRvbmUgcHJvY2Vzc2luZwotICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmphdmlmeUNsYXNzTmFtZSh0ZW1wREJDLmdldFN1cGVyQ2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKE1EUUNvbnN0YW50cy5PQkpFQ1RfQ0xBU1NfTkFNRSkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN1cGVyREJDID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQodGVtcERCQy5nZXRTdXBlckNsYXNzTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgbG9nLnRyYWNlKCJzdXBlcmNsYXNzIG5hbWUgZm9yIHRoaXMgREJDIGlzOiIgKyB0ZW1wREJDLmdldFN1cGVyQ2xhc3NOYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgLy9WZXJpZnkgdGhhdCB3ZSBjYW4gZmluZCB0aGUgU0VJIGluIHRoZSBjb21wb3NpdGUgbGlzdAotICAgICAgICAgICAgICAgIGlmIChzdXBlckRCQyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VpTm90Rm91bmRFcnIiKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9JZiB0aGUgc3VwZXJjbGFzcyBjb250YWlucyBhIFdlYlNlcnZpY2UgYW5ub3RhdGlvbiB0aGVuIHJldHJpZXZlIGl0cyBtZXRob2RzCi0gICAgICAgICAgICAgICAgLy9hcyB3ZSB3b3VsZCBmb3IgdGhlIGltcGwgY2xhc3MsIG90aGVyd2lzZSBpZ25vcmUgdGhlIG1ldGhvZHMgb2YgdGhpcwotICAgICAgICAgICAgICAgIC8vc3VwZXJjbGFzcwotICAgICAgICAgICAgICAgIGlmIChzdXBlckRCQy5nZXRXZWJTZXJ2aWNlQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vTm93LCBnYXRoZXIgdGhlIGxpc3Qgb2YgTWV0aG9kcyBqdXN0IGxpa2Ugd2UgZG8gZm9yIHRoZSBsb3dlc3Qgc3ViY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVMaXN0LmFkZEFsbChyZXRyaWV2ZUltcGxpY2l0U0VJTWV0aG9kcyhzdXBlckRCQykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ZW1wREJDID0gc3VwZXJEQkM7Ci0gICAgICAgICAgICB9IC8vRG9uZSB3aXRoIGltcGxpZWQgU0VJJ3Mgc3VwZXJjbGFzc2VzCi0gICAgICAgICAgICByZXRyaWV2ZUxpc3QgPSByZW1vdmVPdmVycmlkZGVuTWV0aG9kcyhyZXRyaWV2ZUxpc3QsIGRiYyk7Ci0gICAgICAgIH0vL0RvbmUgd2l0aCBpbXBsaWVkIFNFSSdzCi0KLSAgICAgICAgcmV0dXJuIHJldHJpZXZlTGlzdC5pdGVyYXRvcigpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBlc3RhYmxpc2ggYSA8Y29kZT5IYXNoTWFwPC9jb2RlPiB0aGF0IHJlcHJlc2VudHMgYSBjbGFzcyBuYW1lIG9mIGEgY29tcG9zaXRlCi0gICAgICogYW5kIGFuIGludGVnZXIgdmFsdWUgZm9yIHRoZSBlbnRyeS4gVGhlIGludGVnZXIgcmVwcmVzZW50cyB0aGUgY2xhc3NlcyBsZXZlbCBpbiB0aGUgSmF2YQotICAgICAqIGhpZXJhcmNoeS4gMCByZXByZXNlbnRzIHRoZSBtb3N0IGJhc2ljIGNsYXNzIHdpdGggbiByZXByZXNlbnRpbmcgdGhlIGhpZ2hlc3QgbGV2ZWwgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGJjIC0gPGNvZGU+RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPC9jb2RlPgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5IYXNoTWFwPC9jb2RlPgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGdldENsYXNzSGllcmFyY2h5KERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgICAgICBnZXRTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0REJDTWFwKCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBoaWVyYXJjaHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJQdXR0aW5nIGNsYXNzIGF0IGJhc2UgbGV2ZWw6ICIgKyBkYmMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGhpZXJhcmNoeU1hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCBJbnRlZ2VyLnZhbHVlT2YoMCkpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3VwZXJEQkMgPSBkYmNNYXAuZ2V0KChkYmMuZ2V0U3VwZXJDbGFzc05hbWUoKSkpOwotICAgICAgICBpbnQgaSA9IDE7Ci0gICAgICAgIHdoaWxlIChzdXBlckRCQyAhPSBudWxsICYmICFzdXBlckRCQy5nZXRDbGFzc05hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKSkgewotICAgICAgICAgICAgaGllcmFyY2h5TWFwLnB1dChzdXBlckRCQy5nZXRDbGFzc05hbWUoKSwgSW50ZWdlci52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHV0dGluZyBjbGFzczogIiArIHN1cGVyREJDLmdldENsYXNzTmFtZSgpICsgIiBhdCBoaWVyYXJjaHkgcmFuazogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIHN1cGVyREJDID0gZGJjTWFwLmdldChzdXBlckRCQy5nZXRTdXBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGllcmFyY2h5TWFwOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBkcml2ZXMgdGhlIGVzdGFibGlzaG1lbnQgb2YgdGhlIGhpZXJhcmNoeSBvZiBpbnRlcmZhY2VzIGZvciBhbiBTRUkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRJbnRlcmZhY2VIaWVyYXJjaHkoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYykgewotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJHZXR0aW5nIGludGVyZmFjZSBoaWVyYXJjaHkgZm9yOiAiICsgZGJjLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBoaWVyYXJjaHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIGhpZXJhcmNoeU1hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCAwKTsKLSAgICAgICAgcmV0dXJuIGdldEludGVyZmFjZUhpZXJhcmNoeShkYmMuZ2V0SW50ZXJmYWNlc0xpc3QoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWN1cnNpdmUgbWV0aG9kIHRoYXQgYnVpbGRzIHRoZSBoaWVyYXJjaHkgb2YgaW50ZXJmYWNlcy4gVGhpcyBiZWdpbnMgd2l0aCBhbgotICAgICAqIFNFSSBhbmQgd2Fsa3MgYWxsIG9mIGl0cyBzdXBlciBpbnRlcmZhY2VzLgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0SW50ZXJmYWNlSGllcmFyY2h5KExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBoaWVyYXJjaHlNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpOwotICAgICAgICAKLSAgICAgICAgLy8gd2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgaW50ZXJmYWNlcwotICAgICAgICBpZihpbnRlcmZhY2VzICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICFpbnRlcmZhY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yKFN0cmluZyBpbnRlcmZhemUgOiBpbnRlcmZhY2VzKSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGludGVyREJDID0gZGJjTWFwLmdldChpbnRlcmZhemUpOwotICAgICAgICAgICAgICAgIGlmKGludGVyREJDICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSW5zZXJ0aW5nIHN1cGVyIGludGVyZmFjZSAiICsgaW50ZXJEQkMuZ2V0Q2xhc3NOYW1lKCkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGF0IGxldmVsICIgKyBsZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5TWFwLnB1dChpbnRlckRCQy5nZXRDbGFzc05hbWUoKSwgbGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJmYWNlSGllcmFyY2h5KGludGVyREJDLmdldEludGVyZmFjZXNMaXN0KCksIGhpZXJhcmNoeU1hcCwgbGV2ZWwrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoaWVyYXJjaHlNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBsb29wIHRocm91Z2ggZWFjaCBtZXRob2QgdGhhdCB3YXMgcHJldmlvdXNseSBkZXRlcm1pbmVkIGFzIGJlaW5nIHJlbGV2YW50IHRvCi0gICAgICogdGhlIGN1cnJlbnQgY29tcG9zaXRlLiBJdCB3aWxsIHRoZW4gZHJpdmUgdGhlIGNhbGwgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcmVwcmVzZW50cyBhIG1ldGhvZAotICAgICAqIHRoYXQgaGFzIGJlZW4gb3ZlcnJpZGRlbi4gSWYgaXQgcmVwcmVzZW50cyBhbiBvdmVycmlkaW5nIG1ldGhvZCBkZWNsYXJhdGlvbiBpdCB3aWxsIHJlbW92ZQotICAgICAqIHRoZSBpbmhlcml0ZWQgbWV0aG9kcyBmcm9tIHRoZSBsaXN0IGxlYXZpbmcgb25seSB0aGUgbW9zdCBiYXNpYyBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kTGlzdCAtIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gbGlzdCBvZiByZWxldmFudCBtZXRob2RzCi0gICAgICogQHBhcmFtIGRiYyAgICAgICAgLSA8Y29kZT5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU8L2NvZGU+IGN1cnJlbnQgY29tcG9zaXRlCi0gICAgICogQHJldHVybiAtIDxjb2RlPkFycmF5TGlzdDwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcmVtb3ZlT3ZlcnJpZGRlbk1ldGhvZHMoCi0gICAgICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZExpc3QsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMpIHsKLSAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gaGllcmFyY2h5TWFwID0gZGJjLmlzSW50ZXJmYWNlKCkgPyBnZXRJbnRlcmZhY2VIaWVyYXJjaHkoZGJjKSA6IAotICAgICAgICAgICAgZ2V0Q2xhc3NIaWVyYXJjaHkoZGJjKTsKLSAgICAgICAgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXR1cm5NZXRob2RzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZExpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChub3RGb3VuZChyZXR1cm5NZXRob2RzLCBtZXRob2RMaXN0LmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm5NZXRob2RzLmFkZChnZXRCYXNlTWV0aG9kKG1ldGhvZExpc3QuZ2V0KGkpLCBpLCBtZXRob2RMaXN0LCBoaWVyYXJjaHlNYXApKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5NZXRob2RzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbG9vcCB0aHJvdWdoIGVhY2ggbWV0aG9kIHdlIGhhdmUgYWxyZWFkeSBpZGVudGlmaWVkIGFzIGEgYmFzZSBtZXRob2QgYW5kCi0gICAgICogY29tcGFyZSB0aGUgY3VycmVudCBtZXRob2QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWRjTGlzdCAtIDxjb2RlPkFycmF5TGlzdDwvY29kZT4gaWRlbnRpZmllZCBiYXNlIG1ldGhvZHMKLSAgICAgKiBAcGFyYW0gbWRjICAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPiBjdXJyZW50IG1ldGhvZAotICAgICAqIEByZXR1cm4gLSBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIG5vdEZvdW5kKEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjKSB7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWV0aG9kIDogbWRjTGlzdCkgewotICAgICAgICAgICAgaWYgKG1kYy5jb21wYXJlKG1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBtb3N0IGJhc2ljIGxldmVsIG9mIGEgbWV0aG9kIGRlY2xhcmF0aW9uIGluCi0gICAgICogdGhlIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4gaGllcmFyY2h5LgotICAgICAqCi0gICAgICogQHBhcmFtIG1kYyAgICAgICAgICAtIDxjb2RlPk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPC9jb2RlPiBjdXJyZW50IG1ldGhvZAotICAgICAqIEBwYXJhbSBpbmRleCAgICAgICAgLSA8Y29kZT5pbnQ8L2NvZGU+IGN1cnJlbnQgbG9jYXRpb24gaW4gbWV0aG9kIGxpc3QKLSAgICAgKiBAcGFyYW0gbWV0aG9kTGlzdCAgIC0gPGNvZGU+TGlzdDwvY29kZT4gbGlzdCBvZiBtZXRob2RzIGF2YWlsYWJsZSBvbiB0aGlzIGNvbXBvc2l0ZQotICAgICAqIEBwYXJhbSBoaWVyYXJjaHlNYXAgLSA8Y29kZT5IYXNoTWFwPC9jb2RlPiBtYXAgdGhhdCByZXByZXNlbnRzIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGN1cnJlbnQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIC0gPGNvZGU+TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU8L2NvZGU+IG1vc3QgYmFzaWMgbWV0aG9kIGRlY2xhcmF0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgZ2V0QmFzZU1ldGhvZChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1ldGhvZExpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaHlNYXApIHsKLSAgICAgICAgaW50IGJhc2VMZXZlbCA9IGhpZXJhcmNoeU1hcC5nZXQobWRjLmdldERlY2xhcmluZ0NsYXNzKCkpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQmFzZSBtZXRob2Q6ICIgKyBtZGMuZ2V0TWV0aG9kTmFtZSgpICsgIiBpbml0aWFsIGxldmVsOiAiICsgYmFzZUxldmVsKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgaW5kZXggPCBtZXRob2RMaXN0LnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgY29tcGFyZU1EQyA9IG1ldGhvZExpc3QuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgIC8vIElmIHRoZSB0d28gbWV0aG9kcyBhcmUgdGhlIHNhbWUgbWV0aG9kIHRoYXQgbWVhbnMgd2UgaGF2ZSBmb3VuZCBhbiBpbmhlcml0ZWQKLSAgICAgICAgICAgIC8vIG92ZXJyaWRkZW4gY2FzZQotICAgICAgICAgICAgaWYgKG1kYy5lcXVhbHMoY29tcGFyZU1EQykpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBlcXVpdmFsZW50IG1ldGhvZHM6ICIgKyBtZGMuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZWNsYXJhdGlvbiBsZXZlbCBvZiB0aGUgbWV0aG9kIHdlIGFyZSBjb21wYXJpbmcgdG8KLSAgICAgICAgICAgICAgICBpbnQgY29tcGFyZUxldmVsID0gaGllcmFyY2h5TWFwLmdldChjb21wYXJlTURDLmdldERlY2xhcmluZ0NsYXNzKCkpOwotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtZXRob2Qgd2FzIGRlY2xhcmVkIGJ5IGEgY2xhc3MgaW4gYSBsb3dlciBsZXZlbCBvZiB0aGUgaGllcmFyY2h5IGl0Ci0gICAgICAgICAgICAgICAgLy8gYmVjb21lcyB0aGUgbWV0aG9kIHRoYXQgd2Ugd2lsbCBjb21wYXJlIG90aGVyIG1ldGhvZHMgdG8KLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUxldmVsIDwgYmFzZUxldmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBtZXRob2QgbG93ZXIgaW4gaGllcmFyY2h5IGNoYWluOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1EQy5nZXRNZXRob2ROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9mIGNsYXNzOiAiICsgY29tcGFyZU1EQy5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1kYyA9IGNvbXBhcmVNREM7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VMZXZlbCA9IGNvbXBhcmVMZXZlbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1kYzsKLSAgICB9Ci0KLSAgICAvKgotICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBrbm93IHRoYXQgdGhpcyBEQkMgaXMgYW4gaW1wbGljaXQgU0VJCi0gICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcmV0cmlldmVJbXBsaWNpdFNFSU1ldGhvZHMoCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0KLSAgICAgICAgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXRyaWV2ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0KLSAgICAgICAgcmV0cmlldmVMaXN0ID0gRGVzY3JpcHRpb25VdGlscy5nZXRNZXRob2RzV2l0aEZhbHNlRXhjbHVzaW9ucyhkYmMpOwotCi0gICAgICAgIC8vSWYgdGhpcyBsaXN0IGlzIGVtcHR5LCB0aGVuIHRoZXJlIGFyZSBubyBmYWxzZSBleGNsdXNpb25zLCBzbyBnYXRoZXIKLSAgICAgICAgLy9hbGwgY29tcG9zaXRlcyB0aGF0IGRvbid0IGhhdmUgZXhjbHVkZSA9PSB0cnVlCi0gICAgICAgIC8vSWYgdGhlIGxpc3QgaXMgbm90IGVtcHR5LCB0aGVuIGl0IG1lYW5zIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBtZXRob2Qgd2l0aCAnZXhjbHVkZT09ZmFsc2UnCi0gICAgICAgIC8vc28gdGhlIGxpc3Qgc2hvdWxkIGNvbnRhaW4gb25seSB0aG9zZSBtZXRob2RzCi0gICAgICAgIGlmIChyZXRyaWV2ZUxpc3QgPT0gbnVsbCB8fCByZXRyaWV2ZUxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yPE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBpdGVyID0gbnVsbDsKLSAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QgPSBkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpOwotCi0gICAgICAgICAgICBpZiAobWRjTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXRlciA9IGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRXhjbHVkZVRydWUobWRjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWRjLnNldERlY2xhcmluZ0NsYXNzKGRiYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZUxpc3QuYWRkKG1kYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0cmlldmVMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXRyaWV2ZVNFSU1ldGhvZHMoCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0KLSAgICAgICAgLy9SdWxlcyBmb3IgcmV0cmlldmluZyBNZXRob2RzIG9uIGFuIFNFSSAob3IgYSBzdXBlcmNsYXNzIG9mIGFuIFNFSSkgYXJlIHNpbXBsZQotICAgICAgICAvL0p1c3QgcmV0cmlldmUgYWxsIG1ldGhvZHMgcmVnYXJkbGVzcyBvZiBXZWJNZXRob2QgYW5ub3RhdGlvbnMKLSAgICAgICAgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXRyaWV2ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0KLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPSBudWxsOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKTsKLQotICAgICAgICBpZiAobWRjTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpdGVyID0gZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbWRjLnNldERlY2xhcmluZ0NsYXNzKGRiYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0cmlldmVMaXN0LmFkZChtZGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHJpZXZlTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcmV0cmlldmVTRUlNZXRob2RzQ2hhaW4oCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgdG1wREJDKSB7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IHRtcERCQzsKLSAgICAgICAgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiByZXRyaWV2ZUxpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+KCk7Ci0KLSAgICAgICAgcmV0cmlldmVMaXN0ID0gcmV0cmlldmVTRUlNZXRob2RzKGRiYyk7Ci0KLSAgICAgICAgLy9TaW5jZSB0aGlzIGlzIGFuIGludGVyZmFjZSwgYW55dGhpbmcgdGhhdCBpcyBpbiB0aGUgZXh0ZW5kcyBjbGF1c2Ugd2lsbCBhY3R1YWxseSBhcHBlYXIKLSAgICAgICAgLy8gaW4gdGhlIGludGVyZmFjZXMgbGlzdCBpbnN0ZWFkLgotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBudWxsOwotICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlc0xpc3QgPSBkYmMuZ2V0SW50ZXJmYWNlc0xpc3QoKTsKLSAgICAgICAgaWYgKGludGVyZmFjZXNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZXIgPSBkYmMuZ2V0SW50ZXJmYWNlc0xpc3QoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VOYW1lID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN1cGVySW50ZXJmYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLmdldERCQ01hcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaW50ZXJmYWNlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICByZXRyaWV2ZUxpc3QuYWRkQWxsKHJldHJpZXZlU0VJTWV0aG9kc0NoYWluKHN1cGVySW50ZXJmYWNlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0cmlldmVMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICgoU2VydmljZURlc2NyaXB0aW9uV1NETClnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0U2VydmljZURlc2NyaXB0aW9uKCkpCi0gICAgICAgICAgICAgICAgLmdldFdTRExEZWZpbml0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBvcnRUeXBlIGdldFdTRExQb3J0VHlwZSgpIHsKLSAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotLy8gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25XU0RMIGVuZHBvaW50RGVzY1dTREwgPSAoRW5kcG9pbnREZXNjcmlwdGlvbldTREwpIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKTsKLS8vICAgICAgICBCaW5kaW5nIHdzZGxCaW5kaW5nID0gZW5kcG9pbnREZXNjV1NETC5nZXRXU0RMQmluZGluZygpOwotLy8gICAgICAgIGlmICh3c2RsQmluZGluZyAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgIHBvcnRUeXBlID0gd3NkbEJpbmRpbmcuZ2V0UG9ydFR5cGUoKTsKLS8vICAgICAgICB9Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBnZXRXU0RMRGVmaW5pdGlvbigpOwotICAgICAgICBpZiAod3NkbERlZm4gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRucyA9IGdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcG9ydFR5cGUgPSB3c2RsRGVmbi5nZXRQb3J0VHlwZShuZXcgUU5hbWUodG5zLCBsb2NhbFBhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydFR5cGU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYlNlcnZpY2UgZ2V0QW5ub1dlYlNlcnZpY2UoKSB7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IGRiYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViU2VydmljZUFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJTZXJ2aWNlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJTZXJ2aWNlKCkudGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgd2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSA9IGdldEFubm9XZWJTZXJ2aWNlKCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuMSBwZyAxNSBkZWZlcnMgdG8gIkltcGxlbWVudGF0aW9uIGRlZmluZWQsIAotICAgICAgICAgICAgICAgIC8vIGFzIGRlc2NyaWJlZCBpbiBKQVgtV1MgMi4wLCBzZWN0aW9uIDMuMiIgd2hpY2ggaXMgSkFYLVdTIDIuMCBTZWMgMy4yLCBwZyAyOS4KLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25VdGlscy5tYWtlTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMuZ2V0SmF2YVBhY2thZ2VOYW1lKGRiYy5nZXRDbGFzc05hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViU2VydmljZVRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VfTmFtZSA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViU2VydmljZSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViU2VydmljZSgpLm5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX05hbWUgPSBnZXRBbm5vV2ViU2VydmljZSgpLm5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUGVyIHRoZSBKU1IgMTgxIFNwZWNpZmljYXRpb24sIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgLy8gaXMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlX05hbWUgPSBEZXNjcmlwdGlvblV0aWxzLmdldFNpbXBsZUphdmFDbGFzc05hbWUoZGJjLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViU2VydmljZV9OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJTZXJ2aWNlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRQb3J0VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0bnMgPSBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZSh0bnMsIG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTmFtZTogIiArIGdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlBvcnRUeXBlOiAiICsgZ2V0UG9ydFR5cGUoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNPQVAgU3R5bGU6ICIgKyBnZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJTT0FQIFVzZTogIiArIGdldFNvYXBCaW5kaW5nVXNlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJTT0FQIFBhcmFtYXRlciBTdHlsZTogIiArIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BlcmF0aW9ucyA9IGdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25zICE9IG51bGwgJiYgb3BlcmF0aW9ucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTnVtYmVyIG9mIG9wZXJhdGlvbnM6ICIgKyBvcGVyYXRpb25zLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk9wZXJhdGlvbjogIiArIG9wZXJhdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk9wZXJhdGlvbkRlc2NyaXB0aW9uIGFycmF5IGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJDb21wbGV0ZSBkZWJ1ZyBpbmZvcm1hdGlvbiBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICJFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQ2xhc3MgY2xzLCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRmF1bHREZXNjcmlwdGlvbkltcGwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvRmF1bHREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMjIxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0ZhdWx0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkZhdWx0RGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKiogQHNlZSAuLi9GYXVsdERlc2NyaXB0aW9uICovCi0KLQotY2xhc3MgRmF1bHREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBGYXVsdERlc2NyaXB0aW9uLCBGYXVsdERlc2NyaXB0aW9uSmF2YSwgRmF1bHREZXNjcmlwdGlvbldTREwgewotCi0gICAgcHJpdmF0ZSBDbGFzcyBleGNlcHRpb25DbGFzczsKLSAgICBwcml2YXRlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBXZWJGYXVsdCBhbm5vdGF0aW9uOwotICAgIHByaXZhdGUgT3BlcmF0aW9uRGVzY3JpcHRpb24gcGFyZW50OwotCi0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gIiI7ICAvLyBXZWJGYXVsdC5uYW1lCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmF1bHRCZWFuID0gIiI7ICAvLyBXZWJGYXVsdC5mYXVsdEJlYW4KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiIjsgLy8gV2ViRmF1bHQudGFyZ2V0TmFtZXNwYWNlCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmF1bHRJbmZvID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVCA9ICJGYXVsdCI7Ci0KLQotICAgIC8qKgotICAgICAqIFRoZSBGYXVsdERlc2NyaXB0aW9uSW1wbCBjbGFzcyB3aWxsIG9ubHkgYmUgdXNlZCB0byBkZXNjcmliZSBleGNlcHRpb25zIGRlY2xhcmVkIHRvIGJlIHRocm93bgotICAgICAqIGJ5IGEgc2VydmljZSB0aGF0IGhhcyBhIFdlYkZhdWx0IGFubm90YXRpb24uICBObyBnZW5lcmljIGV4Y2VwdGlvbiBzaG91bGQgZXZlciBoYXZlIGEKLSAgICAgKiBGYXVsdERlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCBpdC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdXNlciBvZiB0aGUKLSAgICAgKiBGYXVsdERlc2NyaXB0aW9uSW1wbCBjbGFzcyB0byBhdm9pZCBpbnN0YW50aWF0aW5nIHRoaXMgb2JqZWN0IGZvciBub24tYW5ub3RhdGVkIGdlbmVyaWMKLSAgICAgKiBleGNlcHRpb25zLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4Y2VwdGlvbkNsYXNzIGFuIGV4Y2VwdGlvbiBkZWNsYXJlZCB0byBiZSB0aHJvd24gYnkgdGhlIHNlcnZpY2Ugb24gd2hpY2ggdGhpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBGYXVsdERlc2NyaXB0aW9uIG1heSBhcHBseS4KLSAgICAgKiBAcGFyYW0gYmVhbk5hbWUgICAgICAgZnVsbHkgcXVhbGlmaWVkIHBhY2thZ2UrY2xhc3NuYW1lIG9mIHRoZSBiZWFuIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uICAgICB0aGUgV2ViRmF1bHQgYW5ub3RhdGlvbiBvYmplY3Qgb24gdGhpcyBleGNlcHRpb24gY2xhc3MKLSAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzIEZhdWx0RGVzY3JpcHRpb24KLSAgICAgKi8KLSAgICBGYXVsdERlc2NyaXB0aW9uSW1wbChDbGFzcyBleGNlcHRpb25DbGFzcywgV2ViRmF1bHQgYW5ub3RhdGlvbiwgT3BlcmF0aW9uRGVzY3JpcHRpb24gcGFyZW50KSB7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uQ2xhc3MgPSBleGNlcHRpb25DbGFzczsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgRmF1bHREZXNjcmlwdGlvbkltcGwoRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGZhdWx0REJDLCBPcGVyYXRpb25EZXNjcmlwdGlvbiBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5jb21wb3NpdGUgPSBmYXVsdERCQzsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYkZhdWx0IGdldEFubm9XZWJGYXVsdCgpIHsKLQotICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaXNEQkMoKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSB0aGlzLmNvbXBvc2l0ZS5nZXRXZWJGYXVsdEFubm90KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICAvLyBubyBuZWVkIGZvciBkZWZhdWx0cyBoZXJlLiAgVGhlIGV4Y2VwdGlvbkNsYXNzIHN0b3JlZCBpbiB0aGlzCi0gICAgICAgICAgICAvLyBGYXVsdERlc2NyaXB0aW9uIG9iamVjdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCB0byBiZQotICAgICAgICAgICAgLy8gdGhyb3duIGZyb20gdGhlIHNlcnZpY2UgbWV0aG9kCi0gICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRJbmZvKCkgewotICAgICAgICBpZiAoZmF1bHRJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYXVsdEluZm87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBleGNlcHRpb25DbGFzcy5nZXRNZXRob2QoImdldEZhdWx0SW5mbyIsIG51bGwpOwotICAgICAgICAgICAgICAgIGZhdWx0SW5mbyA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0Q2Fub25pY2FsTmFtZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgYSBsZWdhY3kgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZmF1bHRJbmZvID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPQotICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoImdldEZhdWx0SW5mbyIsIDEpOwotICAgICAgICAgICAgaWYgKG1kYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRJbmZvID0gbWRjLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRJbmZvID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0QmVhbigpIHsKLSAgICAgICAgaWYgKGZhdWx0QmVhbiAhPSBudWxsICYmIGZhdWx0QmVhbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmF1bHRCZWFuIGlmIGl0IHdhcyBhbHJlYWR5IGNhbGN1bGF0ZWQKLSAgICAgICAgICAgIHJldHVybiBmYXVsdEJlYW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBMb2FkIHVwIHRoZSBXZWJGYXVsdCBhbm5vdGF0aW9uIGFuZCBnZXQgdGhlIGZhdWx0QmVhbi4KLSAgICAgICAgICAgIC8vIEBXZWJGYXVsdCBtYXkgbm90IGJlIHByZXNlbnQKLSAgICAgICAgICAgIFdlYkZhdWx0IGFubm90YXRpb24gPSBnZXRBbm5vV2ViRmF1bHQoKTsKLQotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uLmZhdWx0QmVhbigpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5mYXVsdEJlYW4oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmYXVsdEJlYW4gPSBhbm5vdGF0aW9uLmZhdWx0QmVhbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBkZWZhdWx0LiAgQnV0IGl0IHNlZW1zIHJlYXNvbmFibGUgdG8gcmV0dXJuCi0gICAgICAgICAgICAgICAgLy8gdGhlIGZhdWx0IGluZm8gdHlwZS4KLSAgICAgICAgICAgICAgICBmYXVsdEJlYW4gPSBnZXRGYXVsdEluZm8oKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBmYXVsdEJlYW4gc3RpbGwgbWF5IGJlICIiIGF0IHRoaXMgcG9pbnQuICBUaGUgSkFYV1MgcnVudGltZQotICAgICAgICAgICAgICAgIC8vIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nL2J1aWxkaW4gYSByZXByZXNlbnRhdGl2ZSBmYXVsdCBiZWFuLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYXVsdEJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTG9hZCB0aGUgYW5ub3RhdGlvbi4gVGhlIGFubm90YXRpb24gbWF5IG5vdCBiZSBwcmVzZW50IGluIFdTR2VuIGNhc2VzCi0gICAgICAgICAgICBXZWJGYXVsdCBhbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vV2ViRmF1bHQoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5uYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGFubm90YXRpb24ubmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBpcyB1bmRlZmluZWQuCi0gICAgICAgICAgICAgICAgLy8gVGhlIEpBWC1XUyBsYXllciBtYXkgdXNlIHRoZSBmYXVsdCBiZWFuIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgbmFtZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIExvYWQgdGhlIGFubm90YXRpb24uIFRoZSBhbm5vdGF0aW9uIG1heSBub3QgYmUgcHJlc2VudCBpbiBXU0dlbiBjYXNlcwotICAgICAgICAgICAgV2ViRmF1bHQgYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub1dlYkZhdWx0KCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24udGFyZ2V0TmFtZXNwYWNlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gYW5ub3RhdGlvbi50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgaXMgdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgLy8gVGhlIEpBWC1XUyBsYXllciBtYXkgdXNlIHRoZSBmYXVsdCBiZWFuIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB0aGUgbmFtZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBsYXN0IHRva2VuIGluIGEgIi4iLWRlbGltaXRlZCBwYWNrYWdlK2NsYXNzbmFtZSBzdHJpbmcKLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgaW4pIHsKLSAgICAgICAgaWYgKGluID09IG51bGwgfHwgaW4ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGluOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBvdXQgPSBudWxsOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbiwgIi4iKTsKLSAgICAgICAgaWYgKHRva2VuaXplci5jb3VudFRva2VucygpID09IDApCi0gICAgICAgICAgICBvdXQgPSBpbjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIG91dCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RCQygpIHsKLSAgICAgICAgaWYgKHRoaXMuY29tcG9zaXRlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiRXhjZXB0aW9uIGNsYXNzOiAiICsgZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5hbWU6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5hbWVzcGFjZTogIiArIGdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJGYXVsdEJlYW46ICIgKyBnZXRGYXVsdEJlYW4oKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiRmF1bHRJbmZvIFR5cGUgTmFtZSAgOiAiICsgZ2V0RmF1bHRJbmZvKCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQ29tcGxldGUgZGVidWcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAiRmF1bHREZXNjcmlwdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0hhbmRsZXJDaGFpbnNQYXJzZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvSGFuZGxlckNoYWluc1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2FhMTgwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvSGFuZGxlckNoYWluc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLkhhbmRsZXJDaGFpbnNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpbnNQYXJzZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRUVfTlMgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9IQU5ETEVSX0NIQUlOUyA9IG5ldyBRTmFtZShKQVZBX0VFX05TLCAiaGFuZGxlci1jaGFpbnMiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9IQU5ETEVSX0NIQUlOID0gbmV3IFFOYW1lKEpBVkFfRUVfTlMsICJoYW5kbGVyLWNoYWluIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHQgY29udGV4dDsKLSAgICAKLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgbG9hZEhhbmRsZXJDaGFpbnMoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24geyAgICAgICAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlscy5uZXdEb2N1bWVudChpbik7Ci0gICAgICAgIEVsZW1lbnQgZWwgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKCFKQVZBX0VFX05TLmVxdWFscyhlbC5nZXROYW1lc3BhY2VVUkkoKSkgfHwKLSAgICAgICAgICAgICEiaGFuZGxlci1jaGFpbnMiLmVxdWFscyhlbC5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViU2VydmljZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbGVtZW50IHsiICsgZWwuZ2V0TmFtZXNwYWNlVVJJKCkgKyAifSIgKyBlbC5nZXRMb2NhbE5hbWUoKSArICIuIEV4cGVjdGVkICIgKyBRTkFNRV9IQU5ETEVSX0NIQUlOUyArICIgZWxlbWVudCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWlucyA9IG5ldyBIYW5kbGVyQ2hhaW5zVHlwZSgpOwotICAgICAgICBOb2RlIG5vZGUgPSBlbC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGVsID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoIUpBVkFfRUVfTlMuZXF1YWxzKGVsLmdldE5hbWVzcGFjZVVSSSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAhZWwuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJoYW5kbGVyLWNoYWluIikpIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVsZW1lbnQgeyIgKyBlbC5nZXROYW1lc3BhY2VVUkkoKSArICJ9IiArIGVsLmdldExvY2FsTmFtZSgpICsgIi4gRXhwZWN0ZWQgIiArIFFOQU1FX0hBTkRMRVJfQ0hBSU4gKyAiIGVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWlucy5nZXRIYW5kbGVyQ2hhaW4oKS5hZGQocHJvY2Vzc0hhbmRsZXJDaGFpbkVsZW1lbnQoZWwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5UeXBlIHByb2Nlc3NIYW5kbGVyQ2hhaW5FbGVtZW50KEVsZW1lbnQgZWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYW5kbGVyQ2hhaW5UeXBlIGhhbmRsZXIgPSBuZXcgSGFuZGxlckNoYWluVHlwZSgpOwotICAgICAgICBOb2RlIG5vZGUgPSBlbC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIE5vZGUgY3VyID0gbm9kZTsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICBpZiAoY3VyIGluc3RhbmNlb2YgRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGVsID0gKEVsZW1lbnQpY3VyOwotICAgICAgICAgICAgICAgIGlmICghSkFWQV9FRV9OUy5lcXVhbHMoZWwuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZWwuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJwb3J0LW5hbWUtcGF0dGVybiIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc2V0UG9ydE5hbWVQYXR0ZXJuKHByb2Nlc3NQYXR0ZXJuRWxlbWVudChlbCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNlcnZpY2UtbmFtZS1wYXR0ZXJuIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zZXRTZXJ2aWNlTmFtZVBhdHRlcm4ocHJvY2Vzc1BhdHRlcm5FbGVtZW50KGVsKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvdG9jb2wtYmluZGluZ3MiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmdldFByb3RvY29sQmluZGluZ3MoKS5hZGRBbGwocHJvY2Vzc1Byb3RvY29sQmluZGluZ3NFbGVtZW50KGVsKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaGFuZGxlciIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZ2V0SGFuZGxlcigpLmFkZChwcm9jZXNzSGFuZGxlckVsZW1lbnQoZWwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHByb2Nlc3NQcm90b2NvbEJpbmRpbmdzRWxlbWVudChFbGVtZW50IGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm90b2NvbEJpbmRpbmdzU3RyaW5nID0gZWwuZ2V0VGV4dENvbnRlbnQoKS50cmltKCk7Ci0gICAgICAgIFN0cmluZyBbXSBwcm90b2NvbEJpbmRpbmdzID0gcHJvdG9jb2xCaW5kaW5nc1N0cmluZy5zcGxpdCgiXFxzKyIpOwotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChwcm90b2NvbEJpbmRpbmdzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBRTmFtZSBwcm9jZXNzUGF0dGVybkVsZW1lbnQoRWxlbWVudCBlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lUGF0dGVybiA9IGVsLmdldFRleHRDb250ZW50KCkudHJpbSgpOwotICAgICAgICAKLSAgICAgICAgLy8gc2VlIEJhc2VIYW5kbGVyUmVzb2x2ZXIudmFsaWRhdGVQYXR0ZXJuIGZvciB2YWxpZCBzdHJpbmdzCi0gICAgICAgIAotICAgICAgICBpZiAoIioiLmVxdWFscyhuYW1lUGF0dGVybikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUU5hbWUoIioiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFuYW1lUGF0dGVybi5jb250YWlucygiOiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCIiLCBuYW1lUGF0dGVybiwgIiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gbmFtZVBhdHRlcm4uc3Vic3RyaW5nKG5hbWVQYXR0ZXJuLmluZGV4T2YoJzonKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgICBTdHJpbmcgcGZ4ID0gbmFtZVBhdHRlcm4uc3Vic3RyaW5nKDAsIG5hbWVQYXR0ZXJuLmluZGV4T2YoJzonKSk7Ci0gICAgICAgIFN0cmluZyBucyA9IGVsLmxvb2t1cE5hbWVzcGFjZVVSSShwZngpOwotICAgICAgICBpZiAobnMgPT0gbnVsbCkgewotICAgICAgICAgICAgbnMgPSBwZng7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcG9wdWxhdGUgcHJlZml4IHNvIEJhc2VIYW5kbGVyUmVzb2x2ZXIudmFsaWRhdGVQYXR0ZXJuIGNhbiB2YWxpZGF0ZSBpdAotICAgICAgICAvLyBRTmFtZSBjdG9yIGlzIFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxwYXJ0LCBwcmVmaXgpCi0gICAgICAgIHJldHVybiBuZXcgUU5hbWUobnMsIGxvY2FsUGFydCwgcGZ4KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBIYW5kbGVyVHlwZSBwcm9jZXNzSGFuZGxlckVsZW1lbnQoRWxlbWVudCBlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7ICAgICAgCi0gICAgICAgIEpBWEJDb250ZXh0IGN0eCA9IGdldENvbnRleHRGb3JIYW5kbGVyVHlwZSgpOwotICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY3R4LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICBIYW5kbGVyVHlwZSBoYW5kbGVyID0gdW5tYXJzaGFsbGVyLnVubWFyc2hhbChlbCwgSGFuZGxlclR5cGUuY2xhc3MpLmdldFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgSkFYQkNvbnRleHQgZ2V0Q29udGV4dEZvckhhbmRsZXJUeXBlKCkKLSAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24gewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoSGFuZGxlclR5cGUuY2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL09wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGQ0MTMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3Npbmcud3NkbC5XU0RMMTFBY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTWVzc2FnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQXR0YWNobWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRmF1bHREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRmF1bHRBY3Rpb25Bbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk9uZVdheUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLkNvbnZlcnRlclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuV1NETDRKV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkF0dHJpYnV0ZUV4dGVuc2libGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkZhdWx0QWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRmF1bHQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotLyoqIEBzZWUgLi4vT3BlcmF0aW9uRGVzY3JpcHRpb24gKi8KLS8vIFRPRE86IEF4aXMyIGRvZXMgbm90IHN1cHBvcnQgb3ZlcmxvYWRlZCBvcGVyYXRpb25zLCBhbHRob3VnaCBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmFkZE9wZXJhdGlvbigpIGRvZXMgc3VwcG9ydCBvdmVybG9hZGluZwotLy8gICAgICAgb2YgbWV0aG9kcyByZXByZXNlbnRlZCBieSBPcGVyYXRpb25EZXNjcmlwdGlvbiBjbGFzc2VzLiAgSG93ZXZlciwgdGhlIEF4aXNPcGVyYXRpb24gY29udGFpbmVkIGluIGFuIE9wZXJhdGlvbkRlc2NyaXB0aW9uCi0vLyAgICAgICBkb2VzIE5PVCBzdXBwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcy4KLS8vCi0vLyAgICAgICBXaGlsZSBvdmVybG9hZGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IFdTLUksIGl0IElTIHN1cHBvcnRlZCBieSBKQVgtV1MgKHAxMSkuCi0vLyAgICAgICBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBzdXBwb3J0IGluIEF4aXMyOyBjdXJyZW50bHkgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIucG9wdWxhdGVPcGVyYXRpb25zIGRvZXMgbm90Ci0vLyAgICAgICBzdXBwb3J0IG92ZXJsb2FkZWQgbWV0aG9kcyBpbiB0aGUgV1NETDsgdGhlIG9wZXJhdGlvbnMgYXJlIHN0b3JlZCBvbiBBeGlzU2VydmljZSBhcyBjaGlsZHJlbiBpbiBhIEhhc2hNYXAgd2l0aCB0aGUgd3NkbAotLy8gICAgICAgb3BlcmF0aW9uIG5hbWUgYXMgdGhlIGtleS4KLQotY2xhc3MgT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsCi0gICAgICAgIGltcGxlbWVudHMgT3BlcmF0aW9uRGVzY3JpcHRpb24sIE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSwgT3BlcmF0aW9uRGVzY3JpcHRpb25XU0RMIHsKLSAgICBwcml2YXRlIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gcGFyZW50RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLSAgICBwcml2YXRlIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLSAgICBwcml2YXRlIFFOYW1lIG9wZXJhdGlvblFOYW1lOwotICAgIHByaXZhdGUgTWV0aG9kIHNlaU1ldGhvZDsKLSAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1ldGhvZENvbXBvc2l0ZTsKLSAgICBwcml2YXRlIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1ldGVyRGVzY3JpcHRpb25zOwotICAgIHByaXZhdGUgRmF1bHREZXNjcmlwdGlvbltdIGZhdWx0RGVzY3JpcHRpb25zOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwuY2xhc3MpOwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OIHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAT25ld2F5Ci0gICAgcHJpdmF0ZSBPbmV3YXkgb25ld2F5QW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIEJvb2xlYW4gb25ld2F5SXNPbmV3YXk7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAWG1sTGlzdAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0xpc3RUeXBlID0gZmFsc2U7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAUmVxdWVzdFdyYXBwZXIKLSAgICBwcml2YXRlIFJlcXVlc3RXcmFwcGVyIHJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyByZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyByZXF1ZXN0V3JhcHBlckxvY2FsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyByZXF1ZXN0V3JhcHBlckNsYXNzTmFtZTsKLQotICAgIC8vIEFOTk9UQVRJT046IEBSZXNwb25zZVdyYXBwZXIKLSAgICBwcml2YXRlIFJlc3BvbnNlV3JhcHBlciByZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyByZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lOwotICAgIAotICAgIC8vIEFOTk9UQVRJT046IEBBY3Rpb24KLSAgICBwcml2YXRlIEFjdGlvbiBhY3Rpb25Bbm5vdGF0aW9uOwotCi0gICAgLy8gQU5OT1RBVElPTjogQFNPQVBCaW5kaW5nCi0gICAgLy8gTm90ZSB0aGlzIGlzIHRoZSBNZXRob2QtbGV2ZWwgYW5ub3RhdGlvbi4gIFNlZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGZvciB0aGUgVHlwZS1sZXZlbCBhbm5vdGF0aW9uCi0gICAgLy8gQWxzbyBub3RlIHRoaXMgYW5ub3RhdGlvbiBpcyBvbmx5IGFsbG93ZWQgb24gbWV0aG9kcyBpZiBTT0FQQmluZGluZy5TdHlsZSBpcyBET0NVTUVOVCBhbmQgaWYgdGhlIG1ldGhvZC1sZXZlbAotICAgIC8vIGFubm90YXRpb24gaXMgYWJzZW50LCB0aGUgYmVoYXZpb3IgZGVmaW5lZCBvbiB0aGUgVHlwZSBpcyB1c2VkLgotICAgIC8vIHBlciBKU1ItMTgxIE1SIFNlYyA0LjcgIkFubm90YXRpb246IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIiBwZyAyOAotICAgIHByaXZhdGUgU09BUEJpbmRpbmcgc29hcEJpbmRpbmdBbm5vdGF0aW9uOwotICAgIHByaXZhdGUgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgc29hcEJpbmRpbmdTdHlsZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlIFNvYXBCaW5kaW5nX1N0eWxlX1ZBTElEID0KLSAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UOwotICAgIHByaXZhdGUgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIHNvYXBCaW5kaW5nVXNlOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuNyAiQW5ub3RhdGlvbjogamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciIHBnIDI4Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgU09BUEJpbmRpbmdfVXNlX0RFRkFVTFQgPQotICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUw7Ci0gICAgcHJpdmF0ZSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuNyAiQW5ub3RhdGlvbjogamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciIHBnIDI4Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBTT0FQQmluZGluZ19QYXJhbWV0ZXJTdHlsZV9ERUZBVUxUID0KLSAgICAgICAgICAgIGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQ7Ci0KLSAgICAvLyBBTk5PVEFUSU9OOiBAV2ViTWV0aG9kCi0gICAgcHJpdmF0ZSBXZWJNZXRob2Qgd2ViTWV0aG9kQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJNZXRob2RPcGVyYXRpb25OYW1lOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuMiwgcGcgMTcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXZWJNZXRob2RfQWN0aW9uX0RFRkFVTFQgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJNZXRob2RBY3Rpb247Ci0gICAgLy8gRGVmYXVsdCB2YWx1ZSBwZXIgSlNSLTE4MSBNUiBzZWMgNC4yLCBwZyAxNwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXZWJNZXRob2RfRXhjbHVkZV9ERUZBVUxUID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotICAgIHByaXZhdGUgQm9vbGVhbiB3ZWJNZXRob2RFeGNsdWRlOwotCi0gICAgLy8gQU5OT1RBVElPTjogQFdlYlBhcmFtCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSB3ZWJQYXJhbU5hbWVzOwotICAgIHByaXZhdGUgTW9kZVtdIHdlYlBhcmFtTW9kZTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIHdlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlOwotCi0KLSAgICAvLyBBTk5PVEFUSU9OOiBAV2ViUmVzdWx0Ci0gICAgcHJpdmF0ZSBXZWJSZXN1bHQgd2ViUmVzdWx0QW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJSZXN1bHROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlJlc3VsdFBhcnROYW1lOwotICAgIC8vIERlZmF1bHQgdmFsdWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuNS4xLCBwZyAyMwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYlJlc3VsdF9UYXJnZXROYW1lc3BhY2VfREVGQVVMVCA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlJlc3VsdFRhcmdldE5hbWVzcGFjZTsKLSAgICAvLyBEZWZhdWx0IHZhbHVlIHBlciBKU1ItMTgxIE1SIHNlYyA0LjUsIHBnIDI0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdlYlJlc3VsdF9IZWFkZXJfREVGQVVMVCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgICBwcml2YXRlIEJvb2xlYW4gd2ViUmVzdWx0SGVhZGVyOwotICAgIAotICAgIC8vICBXZWIgUmVzdWx0IEF0dGFjaG1lbnQgRGVzY3JpcHRpb24gaW5mb3JtYXRpb24KLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgX3NldEF0dGFjaG1lbnREZXNjID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzUmVzcG9uc2VTd2FSZWZBdHRhY2htZW50cyA9IGZhbHNlOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQXR0YWNobWVudERlc2NyaXB0aW9uPiBwYXJ0QXR0YWNobWVudE1hcDsKLSAgICAKLSAgICBwcml2YXRlIE1ldGhvZCBzZXJ2aWNlSW1wbE1ldGhvZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VydmljZUltcGxNZXRob2RGb3VuZCA9IGZhbHNlOwotICAgIC8vIEZvciBKQVgtV1MgY2xpZW50IGFzeW5jIG1ldGhvZHMsIHRoaXMgaXMgdGhlIGNvcnJlc3BvbmRpbmcgU3luYyBtZXRob2Q7IGZvciBldmVyeXRoaW5nIGVsc2UsCi0gICAgLy8gdGhpcyBpcyAidGhpcyIuCi0gICAgcHJpdmF0ZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBzeW5jT3BlcmF0aW9uRGVzY3JpcHRpb24gPSBudWxsOwotICAgIC8vIFJVTlRJTUUgSU5GT1JNQVRJT04KLSAgICBNYXA8U3RyaW5nLCBPcGVyYXRpb25SdW50aW1lRGVzY3JpcHRpb24+IHJ1bnRpbWVEZXNjTWFwID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIE9wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbj4oKSk7Ci0gICAgLy8gQ2FjaGUgdGhlIGFjdHVhbCBDbGFzcyBvZiB0aGUgdHlwZSBiZWluZyByZXR1cm5lZC4gCi0gICAgcHJpdmF0ZSBDbGFzcyByZXN1bHRBY3R1YWxUeXBlQ2xheno7Ci0KLSAgICBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoTWV0aG9kIG1ldGhvZCwgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBwYXJlbnQpIHsKLSAgICAgICAgcGFyZW50RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgcGFydEF0dGFjaG1lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0dGFjaG1lbnREZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgc2V0U0VJTWV0aG9kKG1ldGhvZCk7Ci0JCQotICAgICAgICAvLyBUaGUgb3BlcmF0aW9uUU5hbWUgaXMgaW50ZW50aW9uYWxseSB1bnF1YWxpZmllZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlbWFpbmluZyBwYXJ0cyBvZiB0aGUgc3lzdGVtLiAKLSAgICAgICAgLy8gVXNpbmcgYSBxdWFsaWZpZWQgbmFtZSB3aWxsIGNhdXNlIGJyZWFrYWdlLgotICAgICAgICAvLyBEb24ndCBkbyAtLT4gdGhpcy5vcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZShwYXJlbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsIGdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIGlmIChnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24gPSBjcmVhdGVDbGllbnRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYodGhpcy5heGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5heGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKE9wZXJhdGlvbkRlc2NyaXB0aW9uLkFYSVNfT1BFUkFUSU9OX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpKTsgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJvcGVyYXRpb25EZXNjcmlwdGlvbkVycjEiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRBdHRhY2htZW50SW5mb3JtYXRpb24oKTsKLSAgICB9Ci0KLSAgICBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoQXhpc09wZXJhdGlvbiBvcGVyYXRpb24sIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gcGFyZW50KSB7Ci0gICAgICAgIHBhcmVudEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIHBhcnRBdHRhY2htZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBdHRhY2htZW50RGVzY3JpcHRpb24+KCk7Ci0gICAgICAgIGF4aXNPcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgICAgIGlmKHRoaXMuYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbi5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihPcGVyYXRpb25EZXNjcmlwdGlvbi5BWElTX09QRVJBVElPTl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7ICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3BlcmF0aW9uRGVzY3JpcHRpb25FcnIxIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRoaXMub3BlcmF0aW9uUU5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAgICAgYnVpbGRBdHRhY2htZW50SW5mb3JtYXRpb24oKTsKLSAgICB9Ci0KLSAgICBPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uKSB7Ci0KLSAgICAgICAgcGFyZW50RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgcGFydEF0dGFjaG1lbnRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEF0dGFjaG1lbnREZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgbWV0aG9kQ29tcG9zaXRlID0gbWRjOwotICAgICAgICAvLyBUaGUgb3BlcmF0aW9uUU5hbWUgaXMgaW50ZW50aW9uYWxseSB1bnF1YWxpZmllZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHJlbWFpbmluZyBwYXJ0cyBvZiB0aGUgc3lzdGVtLiAKLSAgICAgICAgLy8gVXNpbmcgYSBxdWFsaWZpZWQgbmFtZSB3aWxsIGNhdXNlIGJyZWFrYWdlLgotICAgICAgICAvLyBEb24ndCBkbyAtLT4gdGhpcy5vcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZShwYXJlbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIGdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsIGdldE9wZXJhdGlvbk5hbWUoKSk7Ci0KLSAgICAgICAgd2ViTWV0aG9kQW5ub3RhdGlvbiA9IG1ldGhvZENvbXBvc2l0ZS5nZXRXZWJNZXRob2RBbm5vdCgpOwotCi0gICAgICAgIHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGNyZWF0ZVBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBmYXVsdERlc2NyaXB0aW9ucyA9IGNyZWF0ZUZhdWx0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGlzTGlzdFR5cGUgPSBtZGMuaXNMaXN0VHlwZSgpOwotICAgICAgICBidWlsZEF0dGFjaG1lbnRJbmZvcm1hdGlvbigpOwotCi0gICAgICAgIC8vSWYgYW4gQXhpc09wZXJhdGlvbiB3YXMgYWxyZWFkeSBjcmVhdGVkIGZvciB1cyBieSBwb3B1bGF0ZVNlcnZpY2UgdGhlbiBqdXN0IHVzZSB0aGF0IG9uZQotICAgICAgICAvL090aGVyd2lzZSwgY3JlYXRlIGl0Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbiA9IGF4aXNPcGVyYXRpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmF4aXNPcGVyYXRpb24gPSBjcmVhdGVBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKHRoaXMuYXhpc09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMuYXhpc09wZXJhdGlvbi5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihPcGVyYXRpb25EZXNjcmlwdGlvbi5BWElTX09QRVJBVElPTl9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7ICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKEF4aXNGYXVsdCBhZikgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgib3BlcmF0aW9uRGVzY3JpcHRpb25FcnIxIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBSZWdpc3RlciB1bmRlcnN0b29kIGhlYWRlcnMgb24gYXhpc09wZXJhdGlvbgotICAgICAgICByZWdpc3Rlck11c3RVbmRlcnN0YW5kSGVhZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBBeGlzT3BlcmF0aW9uIGZvciB0aGlzIE9wZXJhdGlvbi4gIE5vdGUgdGhhdCB0aGUgUGFyYW1ldGVyRGVzY3JpcHRpb25zIG11c3QKLSAgICAgKiBiZSBjcmVhdGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIHNpbmNlLCBmb3IgYSBET0MvTElUL0JBUkUgKGFrYSBVTldSQVBQRUQpIG1lc3NhZ2UsIHRoZSAKLSAgICAgKiBQYXJhbWF0ZXJEZXNjcmlwdGlvbiBpcyB1c2VkIHRvIHNldHVwIHRoZSBBeGlzTWVzc2FnZSBjb3JyZWN0bHkgZm9yIHVzZSBpbiBTT0FQIEJvZHktYmFzZWQKLSAgICAgKiBkaXNwYXRjaGluZyBvbiBpbmNvbWluZyBET0MvTElUL0JBUkUgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGNyZWF0ZUNsaWVudEF4aXNPcGVyYXRpb24oKSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gbmV3QXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbkZhY3RvcnkuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfT05MWSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbkZhY3RvcnkuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oV1NETDJDb25zdGFudHMuTUVQX1VSSV9PVVRfSU4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9SRVZJRVc6IFRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIE1FUCdzLCBzdWNoIGFzOiBPVVRfT05MWSwgSU5fT1BUSU9OQUxfT1VULCBPVVRfSU4sIE9VVF9PUFRJT05BTF9JTiwgUk9CVVNUX09VVF9PTkxZLAotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9CVVNUX0lOX09OTFkKLSAgICAgICAgICAgIC8vICAgICAgRGV0ZXJtaW5lIGhvdyB0aGVzZSBNRVAncyBzaG91bGQgYmUgaGFuZGxlZCwgaWYgYXQgYWxsCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNsaWVudEF4aXNPcHJFcnIiKSxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0TmFtZShkZXRlcm1pbmVPcGVyYXRpb25RTmFtZShzZWlNZXRob2QpKTsKLSAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5zZXRTb2FwQWN0aW9uKHRoaXMuZ2V0QWN0aW9uKCkpOwotICAgICAgICAKLSAgICAgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIC8vTk9URTogYXNzdW1wdGlvbiBoZXJlIGlzIHRoYXQgYWxsIGluZm8uIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGFjdGlvbnMgd2lsbCBoYXZlIHRvIGNvbWUKLSAgICAgICAgLy8gICAgICBmcm9tIGFubm90YXRpb25zIChvciBkZWZhdWx0IHZhbHVlcykKLSAgICAgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiA9IG5ld0F4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpOwotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG5ld0F4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TlMgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLmdldFRhcmdldE5hbWVzcGFjZSgpOyAgICAgICAgCi0gICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLmdldFBvcnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAKLSAgICAgICAgLy9XZSBkb24ndCBoYXZlIGEgbmFtZSBhdCB0aGlzIHBvaW50LCBzaG91bGRuJ3QgbWF0dGVyIGlmIHdlIGhhdmUgdGhlIE1FUC4KLSAgICAgICAgLy9PbiB0aGUgY2xpZW50IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFjdGlvbnMgYXJlIHJldmVyc2VkLgotICAgICAgICBTdHJpbmcgaW5wdXROYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGlucHV0QWN0aW9uID0gZ2V0T3V0cHV0QWN0aW9uKCk7Ci0KLSAgICAgICAgLy9JZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGFuIGFjdGlvbiB0aGVuIGZhbGwgYmFjayB0byB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybi4KLSAgICAgICAgaWYgKGlucHV0QWN0aW9uID09IG51bGwgfHwgaW5wdXRBY3Rpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgaW5wdXRBY3Rpb24gPQotICAgICAgICAgICAgICAgIFdTREwxMUFjdGlvbkhlbHBlci5nZXRJbnB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbiggbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIEFycmF5TGlzdCBpbnB1dEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlucHV0QWN0aW9ucy5hZGQoaW5wdXRBY3Rpb24pOwotICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLnNldFdzYW1hcHBpbmdMaXN0KGlucHV0QWN0aW9ucyk7Ci0gICAgICAgIAotICAgICAgICAvL01hcCB0aGUgYWN0aW9uIHRvIHRoZSBvcGVyYXRpb24gb24gdGhlIGFjdHVhbCBheGlzU2VydmljZQotICAgICAgICAvL1RPRE86IERldGVybWluZSB3aGV0aGVyIHRoaXMgc2hvdWxkIGJlIGRvbmUgYXQgYSBoaWdoZXIgbGV2ZWwgaW4gdGhlIAotICAgICAgICAvLyAgICAgIGRlc2NyaXB0aW9uIGhpZXJhcmNoeQotICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuCi0gICAgICAgICAgICBnZXRBeGlzU2VydmljZSgpLm1hcEFjdGlvblRvT3BlcmF0aW9uKGlucHV0QWN0aW9uLCBuZXdBeGlzT3BlcmF0aW9uKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy9zZXQgdGhlIE9VVFBVVCBBQ1RJT04KLQotICAgICAgICAvL1dlIGRvbid0IGhhdmUgYSBuYW1lIGF0IHRoaXMgcG9pbnQsIHNob3VsZG4ndCBtYXR0ZXIgaWYgd2UgaGF2ZSB0aGUgTUVQCi0gICAgICAgIC8vT24gdGhlIGNsaWVudCB0aGUgaW5wdXQgYW5kIG91dHB1dCBhY3Rpb25zIGFyZSByZXZlcnNlZC4KLSAgICAgICAgU3RyaW5nIG91dHB1dE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3V0cHV0QWN0aW9uID0gZ2V0SW5wdXRBY3Rpb24oKTsKLQotICAgICAgICBpZiAob3V0cHV0QWN0aW9uID09IG51bGwgfHwgb3V0cHV0QWN0aW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG91dHB1dEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldE91dHB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbiggbWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0T3V0cHV0QWN0aW9uKG91dHB1dEFjdGlvbik7Ci0KLSAgICAgICAgc2V0RmF1bHRBY3Rpb25zKG5ld0F4aXNPcGVyYXRpb24sIG9wZXJhdGlvbk5hbWUsIHRhcmdldE5TLCBwb3J0VHlwZU5hbWUpOwotCi0gICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgIGdldEF4aXNTZXJ2aWNlKCkuYWRkT3BlcmF0aW9uKG5ld0F4aXNPcGVyYXRpb24pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG5ld0F4aXNPcGVyYXRpb247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBBeGlzT3BlcmF0aW9uIGZvciB0aGlzIE9wZXJhdGlvbi4gIE5vdGUgdGhhdCB0aGUgUGFyYW1ldGVyRGVzY3JpcHRpb25zIG11c3QKLSAgICAgKiBiZSBjcmVhdGVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIHNpbmNlLCBmb3IgYSBET0MvTElUL0JBUkUgKGFrYSBVTldSQVBQRUQpIG1lc3NhZ2UsIHRoZSAKLSAgICAgKiBQYXJhbWF0ZXJEZXNjcmlwdGlvbiBpcyB1c2VkIHRvIHNldHVwIHRoZSBBeGlzTWVzc2FnZSBjb3JyZWN0bHkgZm9yIHVzZSBpbiBTT0FQIEJvZHktYmFzZWQKLSAgICAgKiBkaXNwYXRjaGluZyBvbiBpbmNvbWluZyBET0MvTElUL0JBUkUgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBBeGlzT3BlcmF0aW9uIGNyZWF0ZUF4aXNPcGVyYXRpb24oKSB7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gbmV3QXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNPbmVXYXkoKSkgewotICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24gPSBBeGlzT3BlcmF0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT05MWSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbkZhY3RvcnkuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oV1NETDJDb25zdGFudHMuTUVQX1VSSV9JTl9PVVQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9UT0RPOiBUaGVyZSBhcmUgc2V2ZXJhbCBvdGhlciBNRVAncywgc3VjaCBhczogT1VUX09OTFksIElOX09QVElPTkFMX09VVCwgT1VUX0lOLCBPVVRfT1BUSU9OQUxfSU4sIFJPQlVTVF9PVVRfT05MWSwKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQlVTVF9JTl9PTkxZCi0gICAgICAgICAgICAvLyAgICAgIERldGVybWluZSBob3cgdGhlc2UgTUVQJ3Mgc2hvdWxkIGJlIGhhbmRsZWQsIGlmIGF0IGFsbAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjbGllbnRBeGlzT3ByRXJyIiksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5zZXROYW1lKGRldGVybWluZU9wZXJhdGlvblFOYW1lKHRoaXMubWV0aG9kQ29tcG9zaXRlKSk7Ci0gICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0U29hcEFjdGlvbih0aGlzLmdldEFjdGlvbigpKTsKLQotICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgLy9OT1RFOiBhc3N1bXB0aW9uIGhlcmUgaXMgdGhhdCBhbGwgaW5mby4gbmVlZCB0byBnZW5lcmF0ZSB0aGUgYWN0aW9ucyB3aWxsIGhhdmUgdG8gY29tZQotICAgICAgICAvLyAgICAgIGZyb20gYW5ub3RhdGlvbnMgKG9yIGRlZmF1bHQgdmFsdWVzKQotICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuID0gbmV3QXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuKCk7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gbmV3QXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROUyA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSA9IGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0UG9ydFR5cGUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgIAotICAgICAgICAvL1dlIGRvbid0IGhhdmUgYSBuYW1lIGF0IHRoaXMgcG9pbnQsIHNob3VsZG4ndCBtYXR0ZXIgaWYgd2UgaGF2ZSB0aGUgTUVQCi0gICAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgaW5wdXRBY3Rpb24gPSBnZXRJbnB1dEFjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgLy9JZiB3ZSBkb24ndCBoYXZlIGFuIGFjdGlvbiB0aGVuIGZhbGwgYmFjayB0byB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybi4KLSAgICAgICAgaWYgKGlucHV0QWN0aW9uID09IG51bGwgfHwgaW5wdXRBY3Rpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgaW5wdXRBY3Rpb24gPQotICAgICAgICAgICAgICAgIFdTREwxMUFjdGlvbkhlbHBlci5nZXRJbnB1dEFjdGlvbkZyb21TdHJpbmdJbmZvcm1hdGlvbihtZXNzYWdlRXhjaGFuZ2VQYXR0ZXJuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0VHlwZU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXROYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgQXJyYXlMaXN0IGlucHV0QWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaW5wdXRBY3Rpb25zLmFkZChpbnB1dEFjdGlvbik7Ci0gICAgICAgIG5ld0F4aXNPcGVyYXRpb24uc2V0V3NhbWFwcGluZ0xpc3QoaW5wdXRBY3Rpb25zKTsKLSAgICAgICAgCi0gICAgICAgIC8vTWFwIHRoZSBhY3Rpb24gdG8gdGhlIG9wZXJhdGlvbiBvbiB0aGUgYWN0dWFsIGF4aXNTZXJ2aWNlCi0gICAgICAgIC8vVE9ETzogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBzaG91bGQgYmUgZG9uZSBhdCBhIGhpZ2hlciBsZXZlbCBpbiB0aGUgCi0gICAgICAgIC8vICAgICAgZGVzY3JpcHRpb24gaGllcmFyY2h5Ci0gICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgIGdldEF4aXNTZXJ2aWNlKCkubWFwQWN0aW9uVG9PcGVyYXRpb24oaW5wdXRBY3Rpb24sIG5ld0F4aXNPcGVyYXRpb24pOwotICAgICAgICAKLSAgICAgICAgLy9zZXQgdGhlIE9VVFBVVCBBQ1RJT04KLQotICAgICAgICAvL1dlIGRvbid0IGhhdmUgYSBuYW1lIGF0IHRoaXMgcG9pbnQsIHNob3VsZG4ndCBtYXR0ZXIgaWYgd2UgaGF2ZSB0aGUgTUVQCi0gICAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIG91dHB1dEFjdGlvbiA9IGdldE91dHB1dEFjdGlvbigpOwotICAgICAgICAKLSAgICAgICAgLy9JZiB3ZSBkb24ndCBoYXZlIGFuIGFjdGlvbiB0aGVuIGZhbGwgYmFjayB0byB0aGUgRGVmYXVsdCBBY3Rpb24gUGF0dGVybi4KLSAgICAgICAgaWYgKG91dHB1dEFjdGlvbiA9PSBudWxsIHx8IG91dHB1dEFjdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXRBY3Rpb24gPQotICAgICAgICAgICAgICAgIFdTREwxMUFjdGlvbkhlbHBlci5nZXRPdXRwdXRBY3Rpb25Gcm9tU3RyaW5nSW5mb3JtYXRpb24obWVzc2FnZUV4Y2hhbmdlUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5TLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlTmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLnNldE91dHB1dEFjdGlvbihvdXRwdXRBY3Rpb24pOwotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIEZBVUxUIEFDVElPTgotICAgICAgICBzZXRGYXVsdEFjdGlvbnMobmV3QXhpc09wZXJhdGlvbiwgb3BlcmF0aW9uTmFtZSwgdGFyZ2V0TlMsIHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIERPQy9MSVQvQkFSRSBvcGVyYXRpb24sIHRoZW4gc2V0IHRoZSBRTmFtZSBvZiB0aGUgaW5wdXQgQXhpc01lc3NhZ2UgdG8gdGhlIAotICAgICAgICAvLyBwYXJ0IGZvciB0aGUgZmlyc3QgSU4gb3IgSU4vT1VUIG5vbi1oZWFkZXIgcGFyYW1ldGVyLiAgSWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMsIHRoZW4gZG9uJ3Qgc2V0Ci0gICAgICAgIC8vIGFueXRoaW5nLiAgVGhlIEF4aXNNZXNzYWdlIG5hbWUgaXMgdXNlZCB0byBkbyBTT0FQLWJvZHkgYmFzZWQgcm91dGluZyBvZiBET0MvTElUL0JBUkUKLSAgICAgICAgLy8gaW5jb21pbmcgbWVzc2FnZXMuCi0gICAgICAgIGlmIChnZXRTb2FwQmluZGluZ1N0eWxlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQKLSAgICAgICAgICAgICAgICAmJiBnZXRTb2FwQmluZGluZ1VzZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMCi0gICAgICAgICAgICAgICAgJiYgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjcyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgaWYgKHBhcmFtRGVzY3MgIT0gbnVsbCAmJiBwYXJhbURlc2NzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgV2ViUGFyYW0uTW9kZSBwYXJhbU1vZGUgPSBwYXJhbURlc2MuZ2V0TW9kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtRGVzYy5pc0hlYWRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhcmFtTW9kZSA9PSBXZWJQYXJhbS5Nb2RlLklOIHx8IHBhcmFtTW9kZSA9PSBXZWJQYXJhbS5Nb2RlLklOT1VUKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgZm91bmQgdGhlIGZpcnN0IElOIG9yIElOT1VUIG5vbi1oZWFkZXIgcGFyYW1ldGVyLCBzbyBzZXQgdGhlIEF4aXNNZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBRTmFtZSBiYXNlZCBvbiB0aGlzIHBhcmFtZXRlciB0aGVuIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5nZXRNZXNzYWdlKFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBwYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnROYW1lc3BhY2UgPSBwYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgdXAgYW5ub3RhdGlvbiBiYXNlZCBEb2MvTGl0L0JhcmUgb3BlcmF0aW9uOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F4aXNPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IGF4aXNNZXNzYWdlOiAiICsgYXhpc01lc3NhZ2UgKyAiOyBuYW1lOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVsZW1lbnROYW1lICsgIjsgcGFydFROUzogIiArIHBhcnROYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNNZXNzYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZUF4aXNPcHJFcnIxIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocGFydE5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNyZWF0ZUF4aXNPcHJFcnIyIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZWxlbWVudE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVBeGlzT3ByRXJyMyIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFydFFOYW1lID0gbmV3IFFOYW1lKHBhcnROYW1lc3BhY2UsIGVsZW1lbnROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgQXhpc01lc3NhZ2UgZWxlbWVudCBRTmFtZSBmb3IgYmFyZSBtYXBwaW5nOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0UU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzTWVzc2FnZS5zZXRFbGVtZW50UU5hbWUocGFydFFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJLmdldEF4aXNTZXJ2aWNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKHBhcnRRTmFtZSwgbmV3QXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3QXhpc09wZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RmF1bHRBY3Rpb25zKEF4aXNPcGVyYXRpb24gbmV3QXhpc09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnRUeXBlTmFtZSkgewotICAgICAgICAvLyBXYWxrIHRoZSBmYXVsdCBpbmZvcm1hdGlvbgotICAgICAgICBGYXVsdERlc2NyaXB0aW9uW10gZmF1bHREZXNjcyA9IGdldEZhdWx0RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICAvL0dlbmVyYXRlIGZhdWx0IGFjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBEZWZhdWx0IEFjdGlvbiBQYXR0ZXJuLgotICAgICAgICBpZiAoZmF1bHREZXNjcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjIDogZmF1bHREZXNjcykgewotICAgICAgICAKLSAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBmYXVsdE1lc3NhZ2UgPSBuZXcgQXhpc01lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHREZXNjLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0TmFtZShmYXVsdE5hbWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBmYXVsdEFjdGlvbiA9IAotICAgICAgICAgICAgICAgICAgICAgICAgV1NETDExQWN0aW9uSGVscGVyLmdldEZhdWx0QWN0aW9uRnJvbVN0cmluZ0luZm9ybWF0aW9uKCB0YXJnZXROUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGVOYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdE1lc3NhZ2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLmFkZEZhdWx0QWN0aW9uKGZhdWx0RGVzYy5nZXRFeGNlcHRpb25DbGFzc05hbWUoKSwgIGZhdWx0QWN0aW9uKTsKLSAgICAgICAgICAgICAgICBuZXdBeGlzT3BlcmF0aW9uLnNldEZhdWx0TWVzc2FnZXMoZmF1bHRNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9PdmVycmlkZSB0aGUgZmF1bHQgYWN0aW9ucyBiYXNlZCBvbiBhbnkgRmF1bHRBY3Rpb24gYW5ub3RhdGlvbnMgdGhhdCBhcmUgZGVmaW5lZC4KLSAgICAgICAgRmF1bHRBY3Rpb25bXSBmYXVsdEFjdGlvbnMgPSBnZXRGYXVsdEFjdGlvbnMoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmYXVsdEFjdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChGYXVsdEFjdGlvbiBmYXVsdEFjdGlvbiA6IGZhdWx0QWN0aW9ucykgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKGZhdWx0QWN0aW9uIGluc3RhbmNlb2YgRmF1bHRBY3Rpb25Bbm5vdAotICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgoRmF1bHRBY3Rpb25Bbm5vdCkgZmF1bHRBY3Rpb24pLmNsYXNzTmFtZVN0cmluZygpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gKChGYXVsdEFjdGlvbkFubm90KSBmYXVsdEFjdGlvbikuY2xhc3NOYW1lU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoZmF1bHRBY3Rpb24uY2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBmYXVsdEFjdGlvbi5jbGFzc05hbWUoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxvb2tpbmcgZm9yIEZhdWx0RGVzY3JpcHRpb24gZm9yIGNsYXNzOiAiICsgY2xhc3NOYW1lICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcm9tIEBGYXVsdEFjdGlvbiBhbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmYXVsdERlc2MgPSByZXNvbHZlRmF1bHRCeUV4Y2VwdGlvbk5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhdWx0RGVzYyAhPSBudWxsKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXhpc09wZXJhdGlvbi5hZGRGYXVsdEFjdGlvbihjbGFzc05hbWUsIGZhdWx0QWN0aW9uLnZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgQXhpc09wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgT3BlcmF0aW9uRGVzY3JpcHRpb24gdG8gdGhlIEF4aXNTZXJ2aWNlIGlmIGl0Ci0gICAgICogaXNuJ3QgYWxyZWFkeSB0aGVyZS4gSXQgYWxzbyBhZGRlcyB0aGUgQXhpc09wZXJhdGlvbiB0byBhbnkgb3RoZXIgcm91dGluZyBtZWNoYW5pc21zIGZvcgotICAgICAqIHRoYXQgQXhpc1NlcnZpY2U6IC0gRm9yIERvYy9MaXQvQmFyZSBvcGVyYXRpb25zIGl0IGlzIGFkZGVkIHRvIHRoZQotICAgICAqIE1lc3NhZ2VFbGVtZW50UU5hbWVUb09wZXJhdGlvbk1hcHBpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzU2VydmljZQotICAgICAqLwotICAgIHZvaWQgYWRkVG9BeGlzU2VydmljZShBeGlzU2VydmljZSBheGlzU2VydmljZSkgewotICAgICAgICBBeGlzT3BlcmF0aW9uIG5ld0F4aXNPcGVyYXRpb24gPSBnZXRBeGlzT3BlcmF0aW9uKCk7Ci0gICAgICAgIFFOYW1lIGF4aXNPcFFOYW1lID0gbmV3QXhpc09wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihheGlzT3BRTmFtZSk7Ci0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE9wZXJhdGlvbihuZXdBeGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgIC8vIEZvciBhIERvYy9MaXQvQmFyZSBvcGVyYXRpb24sIHdlIGFsc28gbmVlZCB0byBhZGQgdGhlIGVsZW1lbnQgbWFwcGluZwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRTb2FwQmluZGluZ1N0eWxlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQKLSAgICAgICAgICAgICAgICAmJiBnZXRTb2FwQmluZGluZ1VzZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMCi0gICAgICAgICAgICAgICAgJiYgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlCi0gICAgICAgICAgICAgICAgLkJBUkUpIHsKLSAgICAgICAgICAgIEF4aXNNZXNzYWdlIGF4aXNNZXNzYWdlID0KLSAgICAgICAgICAgICAgICAgICAgbnVsbDsKLSAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uIT1udWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc01lc3NhZ2UgPSBheGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXhpc01lc3NhZ2UgPSBuZXdBeGlzT3BlcmF0aW9uLmdldE1lc3NhZ2UoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChheGlzTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gYXhpc01lc3NhZ2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZWxlbWVudFFOYW1lKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKGVsZW1lbnRRTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZS5hZGRNZXNzYWdlRWxlbWVudFFOYW1lVG9PcGVyYXRpb25NYXBwaW5nKGVsZW1lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBeGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldFNFSU1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgCQkJbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlaU1ldGhvZEVyciIpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZWlNZXRob2QgPSBtZXRob2Q7Ci0gICAgICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKFdlYk1ldGhvZCkKLSAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKHNlaU1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIHBhcmFtZXRlckRlc2NyaXB0aW9ucyA9IGNyZWF0ZVBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgZmF1bHREZXNjcmlwdGlvbnMgPSBjcmVhdGVGYXVsdERlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgaXNMaXN0VHlwZSA9IENvbnZlcnRlclV0aWxzLmhhc1htbExpc3RBbm5vdGF0aW9uKHNlaU1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSZWdpc3RlciB1bmRlcnN0b29kIGhlYWRlcnMgb24gYXhpc09wZXJhdGlvbgotICAgICAgICByZWdpc3Rlck11c3RVbmRlcnN0YW5kSGVhZGVycygpOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbClwYXJlbnRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBBeGlzT3BlcmF0aW9uIGdldEF4aXNPcGVyYXRpb24oKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBvbmx5IHRoZSBzeW5jIG9wZXJhdGlvbnMsIGFuZCBub3QgdGhlIEpBWC1XUyBhc3luYyBjbGllbnQgdmVyc2lvbnMgb2YgYW4gCi0gICAgICAgIC8vIG9wZXJhdGlvbiwgd2lsbCBoYXZlIGFuIEF4aXNPcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIGl0LiAgRm9yIHRob3NlIGFzeW5jIG9wZXJhdGlvbnMsIAotICAgICAgICAvLyBnZXQgdGhlIEF4aXNPcGVyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW5jIG1ldGhvZCBhbmQgcmV0dXJuIHRoYXQuCi0gICAgICAgIGlmIChheGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA9IGdldFN5bmNPcGVyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChvcERlc2MgIT0gbnVsbCAmJiBvcERlc2MgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTeW5jT3BlcmF0aW9uKCkuZ2V0QXhpc09wZXJhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGF4aXNPcGVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb25RTmFtZTsKLSAgICB9Ci0KLSAgICAvLyBKYXZhLXJlbGF0ZWQgZ2V0dGVycwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU1ldGhvZE5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyByZXR1cm5TdHJpbmcgPSBudWxsOwotCi0gICAgICAgIGlmICghaXNEQkMoKSkgewotICAgICAgICAgICAgaWYgKHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuU3RyaW5nID0gc2VpTWV0aG9kLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVyblN0cmluZyA9IG1ldGhvZENvbXBvc2l0ZS5nZXRNZXRob2ROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YURlY2xhcmluZ0NsYXNzTmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IHNlaU1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZENvbXBvc2l0ZS5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhUGFyYW1ldGVycygpIHsKLQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByZXR1cm5QYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICBpZiAoc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzc1tdIHBhcmFtYXRlcnMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKENsYXNzIHBhcmFtIDogcGFyYW1hdGVycykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXJzLmFkZChwYXJhbS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBJdGVyYXRvcjxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RDb21wb3NpdGUuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuUGFyYW1ldGVycy5hZGQoaXRlci5uZXh0KCkuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSByZXN0LCB3aGljaCByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIGFuIGVtcHR5IGFycmF5Ci0gICAgICAgIHJldHVybiByZXR1cm5QYXJhbWV0ZXJzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGlzIHdpbGwgcmV0dXJuIE5VTEwgdW5sZXNzIHRoZSBvcGVyYXRpb24gd2FzIGJ1aWx0IHZpYSBpbnRyb3NwZWN0aW9uIG9uIHRoZSBTRUkuIEluCi0gICAgICogb3RoZXIgd29yZHMsIGl0IHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgYnVpbHQgd2l0aCBXU0RMLgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2QgZ2V0U0VJTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gc2VpTWV0aG9kOwotICAgIH0KLQotICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGdldE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCkgewotICAgICAgICByZXR1cm4gbWV0aG9kQ29tcG9zaXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dyYXBwZWRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIGNyZWF0ZVBhcmFtZXRlckRlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+IGJ1aWxkUGFyYW1ldGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGFyYW1ldGVyRGVzY3JpcHRpb24+KCk7Ci0KLSAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICBDbGFzc1tdIHBhcmFtZXRlcnMgPSBzZWlNZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgIFR5cGVbXSBwYXJhbWF0ZXJUeXBlcyA9IHNlaU1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgIEFubm90YXRpb25bXVtdIGFubm90YXRpb25zID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtRGVzYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwoaSwgcGFyYW1ldGVyc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtYXRlclR5cGVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNbaV0sIHRoaXMpOwotICAgICAgICAgICAgICAgIGJ1aWxkUGFyYW1ldGVyTGlzdC5hZGQocGFyYW1EZXNjKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbnVsbDsKLSAgICAgICAgICAgIEl0ZXJhdG9yPFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBpdGVyID0KLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kQ29tcG9zaXRlLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kQ29tcG9zaXRlLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsKGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZENvbXBvc2l0ZS5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRQYXJhbWV0ZXJMaXN0LmFkZChwYXJhbURlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkUGFyYW1ldGVyTGlzdC50b0FycmF5KG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbltidWlsZFBhcmFtZXRlckxpc3Quc2l6ZSgpXSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZhdWx0RGVzY3JpcHRpb25bXSBjcmVhdGVGYXVsdERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBBcnJheUxpc3Q8RmF1bHREZXNjcmlwdGlvbj4gYnVpbGRGYXVsdExpc3QgPSBuZXcgQXJyYXlMaXN0PEZhdWx0RGVzY3JpcHRpb24+KCk7Ci0KLSAgICAgICAgaWYgKCFpc0RCQygpKSB7Ci0gICAgICAgICAgICAvLyBnZXQgZXhjZXB0aW9ucyB0aGlzIG1ldGhvZCAidGhyb3dzIgotICAgICAgICAgICAgQ2xhc3NbXSB3ZWJGYXVsdENsYXNzZXMgPSBzZWlNZXRob2QuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQotICAgICAgICAgICAgZm9yIChDbGFzcyB3ZkNsYXNzIDogd2ViRmF1bHRDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIEpBWFdTIDMuNywgdGhlIEBXZWJGYXVsdCBhbm5vdGF0aW9uIGlzIG9ubHkgdXNlZCBmb3IgY3VzdG9taXphdGlvbnMsCi0gICAgICAgICAgICAgICAgLy8gc28gd2UnbGwgYWRkIGFsbCBkZWNsYXJlZCBleGNlcHRpb25zCi0gICAgICAgICAgICAgICAgV2ViRmF1bHQgd2Zhbm5vID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ubyA6IHdmQ2xhc3MuZ2V0QW5ub3RhdGlvbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYW5uby5hbm5vdGF0aW9uVHlwZSgpID09IFdlYkZhdWx0LmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ZmFubm8gPSAoV2ViRmF1bHQpYW5ubzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZEZhdWx0TGlzdC5hZGQobmV3IEZhdWx0RGVzY3JpcHRpb25JbXBsKHdmQ2xhc3MsIHdmYW5ubywgdGhpcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyBkbyBJIGNhcmUgYWJvdXQgbWV0aG9kQ29tcG9zaXRlIGxpa2UgdGhlIHBhcmFtRGVzY3JpcHRpb24gZG9lcz8KLSAgICAgICAgICAgIC8vQ2FsbCBGYXVsdERlc2NyaXB0aW9uSW1wbCBmb3IgYWxsIG5vbi1nZW5lcmljIGV4Y2VwdGlvbnMuLi5OZWVkIHRvIGNoZWNrIGEKLSAgICAgICAgICAgIC8vIGEgY291cGxlIG9mIHRoaW5ncwotICAgICAgICAgICAgLy8gMS4gSWYgdGhpcyBpcyBhIGdlbmVyaWMgZXhjZXB0aW9uLCBpZ25vcmUgaXQKLSAgICAgICAgICAgIC8vIDIuIElmIHRoaXMgaXMgbm90IGEgZ2VuZXJpYyBleGNlcHRpb24sIHRoZW4gZmluZCBpdCBpbiB0aGUgREJDIE1hcAotICAgICAgICAgICAgLy8gICAgICAgSWYgbm90IGZvdW5kIGluIG1hcCwgdGhlbiB0aHJvdyBub3QgZm91bmQgZXhjZXB0aW9uCi0gICAgICAgICAgICAvLzMuIFBhc3MgdGhlIHZhbGlkYXRlZCBXZWJGYXVsdCBkYmMgYW5kIHBvc3NpYmx5IHRoZSBjbGFzc0ltcGwgZGJjIHRvIEZhdWx0RGVzY3JpcHRpb24KLSAgICAgICAgICAgIC8vNC4gUG9zc2libHkgc2V0IEF4aXNPcGVyYXRpb24uc2V0RmF1bHRNZXNzYWdlcyBhcnJheS4uLm9yIHNvbWV0aGluZyBsaWtlIHRoYXQKLQotICAgICAgICAgICAgU3RyaW5nW10gd2ViRmF1bHRDbGFzc05hbWVzID0gbWV0aG9kQ29tcG9zaXRlLmdldEV4Y2VwdGlvbnMoKTsKLQotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoKS5nZXREQkNNYXAoKTsKLQotICAgICAgICAgICAgaWYgKHdlYkZhdWx0Q2xhc3NOYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgd2ZDbGFzc05hbWUgOiB3ZWJGYXVsdENsYXNzTmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8JVHJ5IHRvIGZpbmQgdGhpcyBleGNlcHRpb24gY2xhc3MgaW4gdGhlIGRiYyBsaXN0LiBJZiB3ZSBjYW4ndCBmaW5kIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vICB0aGVuIGp1c3QgYXNzdW1lIHRoYXQgaXRzIGEgZ2VuZXJpYyBleGNlcHRpb24uCi0KLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGZhdWx0REJDID0gZGJjTWFwLmdldCh3ZkNsYXNzTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhdWx0REJDICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpBWFdTIDMuNyBkb2VzIG5vdCByZXF1aXJlIEBXZWJGYXVsdCBhbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBhIHZhbGlkIGV4Y2VwdGlvbiBjb21wb3NpdGUgdGhhdHMgYW5ub3RhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZEZhdWx0TGlzdC5hZGQobmV3IEZhdWx0RGVzY3JpcHRpb25JbXBsKGZhdWx0REJDLCB0aGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWlsZEZhdWx0TGlzdC50b0FycmF5KG5ldyBGYXVsdERlc2NyaXB0aW9uWzBdKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViTWV0aG9kCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBXZWJNZXRob2QgZ2V0QW5ub1dlYk1ldGhvZCgpIHsKLSAgICAgICAgaWYgKHdlYk1ldGhvZEFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGlzREJDKCkgJiYgbWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQ29tcG9zaXRlLmdldFdlYk1ldGhvZEFubm90KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2ViTWV0aG9kQW5ub3RhdGlvbiA9IChXZWJNZXRob2QpIGdldEFubm90YXRpb24oc2VpTWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IFdlYk1ldGhvZCBhbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJNZXRob2RBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHN0YXRpYyBRTmFtZSBkZXRlcm1pbmVPcGVyYXRpb25RTmFtZShNZXRob2QgamF2YU1ldGhvZCkgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGRldGVybWluZU9wZXJhdGlvbk5hbWUoamF2YU1ldGhvZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUU5hbWUgZGV0ZXJtaW5lT3BlcmF0aW9uUU5hbWUoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZGV0ZXJtaW5lT3BlcmF0aW9uTmFtZShtZGMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGV0ZXJtaW5lT3BlcmF0aW9uTmFtZShNZXRob2QgamF2YU1ldGhvZCkgewotCi0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGphdmFNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBXZWJNZXRob2Qgd21Bbm5vdGF0aW9uID0gKFdlYk1ldGhvZCkgZ2V0QW5ub3RhdGlvbihqYXZhTWV0aG9kLFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgIC8vIFBlciBKU1ItMTgxIE1SIFNlYyA0LjIgIkFubm90YXRpb246IGphdmF4Lmp3cy5XZWJNZXRob2QiIHBnIDE3LAotICAgICAgICAvLyBpZiBAV2ViTWV0aG9kIHNwZWNpZmllcyBhbmQgb3BlcmF0aW9uIG5hbWUsIHVzZSB0aGF0LiAgT3RoZXJ3aXNlCi0gICAgICAgIC8vIGRlZmF1bHQgaXMgdGhlIEphdmEgbWV0aG9kIG5hbWUKLSAgICAgICAgaWYgKHdtQW5ub3RhdGlvbiAhPSBudWxsICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkod21Bbm5vdGF0aW9uLm9wZXJhdGlvbk5hbWUoKSkpIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUgPSB3bUFubm90YXRpb24ub3BlcmF0aW9uTmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlcmF0aW9uTmFtZSA9IGphdmFNZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgLy9UT0RPOiBGb3Igbm93LCB3ZSBhcmUgb3ZlcnJpZGluZyB0aGUgYWJvdmUgbWV0aG9kIG9ubHkgYmVjYXVzZSBpdCBpcyBzdGF0aWMsIHRoZXNlIHNob3VsZAotICAgIC8vYmUgY29tYmluZWQgYXQgc29tZSBwb2ludAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBkZXRlcm1pbmVPcGVyYXRpb25OYW1lKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYykgewotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG1kYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBXZWJNZXRob2Qgd21Bbm5vdGF0aW9uID0gbWRjLmdldFdlYk1ldGhvZEFubm90KCk7Ci0gICAgICAgIGlmICh3bUFubm90YXRpb24gIT0gbnVsbCAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHdtQW5ub3RhdGlvbi5vcGVyYXRpb25OYW1lKCkpKSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lID0gd21Bbm5vdGF0aW9uLm9wZXJhdGlvbk5hbWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUgPSBtZGMuZ2V0TWV0aG9kTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYk1ldGhvZE9wZXJhdGlvbk5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJNZXRob2RPcGVyYXRpb25OYW1lKCkgewotICAgICAgICBpZiAod2ViTWV0aG9kT3BlcmF0aW9uTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJNZXRob2RPcGVyYXRpb25OYW1lID0gZGV0ZXJtaW5lT3BlcmF0aW9uTmFtZShzZWlNZXRob2QpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZE9wZXJhdGlvbk5hbWUgPSBkZXRlcm1pbmVPcGVyYXRpb25OYW1lKG1ldGhvZENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYk1ldGhvZE9wZXJhdGlvbk5hbWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbiNnZXRTeW5jT3BlcmF0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0U3luY09wZXJhdGlvbigpIHsKLQotICAgICAgICBpZiAoc3luY09wZXJhdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYW55dGhpbmc7IHRoZSBzeW5jIG9wZXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNldCBhbmQgd2lsbCBiZQotICAgICAgICAgICAgLy8gcmV0dXJuZWQgYmVsb3cKLSAgICAgICAgfSBlbHNlIGlmICghaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IE9wRGVzYyBpcyBub3QgYW4gYXN5bmMgb3BlcmF0aW9uLiAgQ2FjaGUgaXQsIHRoZW4gcmV0dXJuIGl0IGJlbG93LgotICAgICAgICAgICAgc3luY09wZXJhdGlvbkRlc2NyaXB0aW9uID0gdGhpczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmVuJ3QgZm91bmQgYSBzeW5jIG9wZGVzYyBmb3IgdGhpcyBvcGVyYXRpb24geWV0LCBzbyB0cnkgYWdhaW4uICBTZWUgdGhlIAotICAgICAgICAgICAgLy8gY29tbWVudHMgaW4gdGhlIGludGVyZmFjZSBkZWNsYXJhdGlvbiBmb3IgdGhpcyBtZXRob2Qgb24gd2h5IHRoaXMgbWlnaHQgb2NjdXIuCi0gICAgICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSBudWxsOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgd2ViTWV0aG9kQW5ub05hbWUgPSBnZXRPcGVyYXRpb25OYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YU1ldGhvZE5hbWUgPSBnZXRKYXZhTWV0aG9kTmFtZSgpOwotICAgICAgICAgICAgaWYgKHdlYk1ldGhvZEFubm9OYW1lICE9IG51bGwgJiYgd2ViTWV0aG9kQW5ub05hbWUubGVuZ3RoKCkgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgIHdlYk1ldGhvZEFubm9OYW1lICE9IGphdmFNZXRob2ROYW1lKSB7Ci0gICAgICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2VhcmNoaW5nIGZvciBvcERlc2Mgb2Ygc3luYyBvcGVyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb2RzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgb2RzID0gZWlkLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2Qod2ViTWV0aG9kQW5ub05hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2RzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgOiBvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2QuZ2V0SmF2YU1ldGhvZE5hbWUoKS5lcXVhbHMod2ViTWV0aG9kQW5ub05hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhb2QuaXNKQVhXU0FzeW5jQ2xpZW50TWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BEZXNjID0gb2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBvcERlc2MgbWlnaHQgc3RpbGwgYmUgbnVsbAotICAgICAgICAgICAgc3luY09wZXJhdGlvbkRlc2NyaXB0aW9uID0gb3BEZXNjOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzeW5jT3BlcmF0aW9uRGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViTWV0aG9kQWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViTWV0aG9kQWN0aW9uKCkgewotICAgICAgICBpZiAod2ViTWV0aG9kQWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViTWV0aG9kKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJNZXRob2QoKS5hY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJNZXRob2RBY3Rpb24gPSBnZXRBbm5vV2ViTWV0aG9kKCkuYWN0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdlYk1ldGhvZEFjdGlvbiA9IFdlYk1ldGhvZF9BY3Rpb25fREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViTWV0aG9kQWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRXhjbHVkZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViTWV0aG9kRXhjbHVkZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEFubm9XZWJNZXRob2RFeGNsdWRlKCkgewotICAgICAgICBpZiAod2ViTWV0aG9kRXhjbHVkZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0aW9uOiBpZiB0aGlzIGF0dHJpYnV0ZSBzcGVjaWZpZWQsIG5vIG90aGVyIGVsZW1lbnRzIGFsbG93ZWQgcGVyIEpTUi0xODEgTVIgU2VjIDQuMiwgcGcgMTcKLSAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRpb246IFRoaXMgZWxlbWVudCBpcyBub3QgYWxsb3dlZCBvbiBlbmRwb2ludCBpbnRlcmZhY2VzCi0gICAgICAgICAgICAvLyBVbmxpa2UgdGhlIGVsZW1lbnRzIHdpdGggYSBTdHJpbmcgdmFsdWUsIGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQsIGV4Y2x1ZGUgd2lsbCBhbHdheXMgCi0gICAgICAgICAgICAvLyByZXR1cm4gYSB1c2FibGUgdmFsdWUgc2luY2UgaXQgd2lsbCBkZWZhdWx0IHRvIEZBTFNFIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJNZXRob2QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2ViTWV0aG9kRXhjbHVkZSA9IG5ldyBCb29sZWFuKGdldEFubm9XZWJNZXRob2QoKS5leGNsdWRlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3ZWJNZXRob2RFeGNsdWRlID0gV2ViTWV0aG9kX0V4Y2x1ZGVfREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB3ZWJNZXRob2RFeGNsdWRlLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IFJlcXVlc3RXcmFwcGVyCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgcHVibGljIFJlcXVlc3RXcmFwcGVyIGdldEFubm9SZXF1ZXN0V3JhcHBlcigpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPSAoUmVxdWVzdFdyYXBwZXIpIAotICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uKHNlaU1ldGhvZCxSZXF1ZXN0V3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzREJDKCkgJiYgbWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPSBtZXRob2RDb21wb3NpdGUuZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IFJlcXVlc3RXcmFwcGVyIGFubm90YXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1JlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHdyYXBwZWQgcGFyYW1ldGVyIHN0eWxlIChiYXNlZCBvbiB0aGUgYW5ub3RhdGlvbiBhbmQgdGhlIFdTREwpLCByZXR1cm5zIHRoZSB3cmFwcGVyCi0gICAgICogdmFsdWUuICBGb3Igbm9uLXdyYXBwZWQgKGkuZS4gYmFyZSkgcGFyYW1ldGVyIHN0eWxlLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSB7Ci0gICAgICAgIGlmICghaXNXcmFwcGVkUGFyYW1ldGVycygpKSB7Ci0gICAgICAgICAgICAvLyBBIHdyYXBwZXIgaXMgb25seSBtZWFuaW5nZnVsIGZvciB3cmFwcGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9SZXF1ZXN0V3JhcHBlcigpLmxvY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lID0gZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkubG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGxvY2FsTmFtZSBpcyB0aGUgdmFsdWUgb2Ygb3BlcmF0aW9uUU5hbWUgYXMKLSAgICAgICAgICAgICAgICAvLyBkZWZpbmVkIGluIHRoZSBXZWJNZXRob2QgYW5ub3RhdGlvbi4gW0pBWC1XUyBTZWMuIDcuMywgcC4gODBdCi0gICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUgPSBnZXRBbm5vV2ViTWV0aG9kT3BlcmF0aW9uTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlckxvY2FsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1JlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHdyYXBwZWQgcGFyYW1ldGVyIHN0eWxlIChiYXNlZCBvbiB0aGUgYW5ub3RhdGlvbiBhbmQgdGhlIFdTREwpLCByZXR1cm5zIHRoZSB3cmFwcGVyCi0gICAgICogdmFsdWUuICBGb3Igbm9uLXdyYXBwZWQgKGkuZS4gYmFyZSkgcGFyYW1ldGVyIHN0eWxlLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIGlmICghaXNXcmFwcGVkUGFyYW1ldGVycygpKSB7Ci0gICAgICAgICAgICAvLyBBIHdyYXBwZXIgaXMgb25seSBtZWFuaW5nZnVsIGZvciB3cmFwcGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9SZXF1ZXN0V3JhcHBlcigpLnRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0YXJnZXROYW1lc3BhY2UgaXMgdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFNFSS4gW0pBWC1XUyBTZWMgNy4zLCBwLiA4MF0KLSAgICAgICAgICAgICAgICByZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vUmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3Igd3JhcHBlZCBwYXJhbWV0ZXIgc3R5bGUgKGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9uIGFuZCB0aGUgV1NETCksIHJldHVybnMgdGhlIHdyYXBwZXIKLSAgICAgKiB2YWx1ZS4gIEZvciBub24td3JhcHBlZCAoaS5lLiBiYXJlKSBwYXJhbWV0ZXIgc3R5bGUsIHJldHVybnMgbnVsbC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9SZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc1dyYXBwZWRQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIEEgd3JhcHBlciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHdyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1JlcXVlc3RXcmFwcGVyKCkuY2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJDbGFzc05hbWUgPSBnZXRBbm5vUmVxdWVzdFdyYXBwZXIoKS5jbGFzc05hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gZGVmYXVsdCBmb3IgdGhlIFJlcXVlc3RXcmFwcGVyIGNsYXNzIG5hbWUuICAKLSAgICAgICAgICAgICAgICAvLyBJbiBzdWNoIGNhc2VzIHRoZSBwcm9ncmFtbWluZyBsYXllciAoSkFYV1MpIG1heSB1c2UgYSBwcm9ncmFtbWluZyBzcGVjIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgLy8gbWVjaGFuaXNtIHRvIGZpbmQgdGhlIGNsYXNzLCBidWlsZCB0aGUgY2xhc3MsIG9yIG9wZXJhdGUgd2l0aG91dCB0aGUgY2xhc3MuCi0gICAgICAgICAgICAgICAgcmVxdWVzdFdyYXBwZXJDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlckNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogUmVzcG9uc2VXcmFwcGVyCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBSZXNwb25zZVdyYXBwZXIgZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlcigpIHsKLSAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiA9IChSZXNwb25zZVdyYXBwZXIpCi0gICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oc2VpTWV0aG9kLFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzREJDKCkgJiYgbWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gbWV0aG9kQ29tcG9zaXRlLmdldFJlc3BvbnNlV3JhcHBlckFubm90KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVuYWJsZSB0byBnZXQgUmVzcG9uc2VXcmFwcGVyIGFubm90YXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlV3JhcHBlckFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIHdyYXBwZWQgcGFyYW1ldGVyIHN0eWxlIChiYXNlZCBvbiB0aGUgYW5ub3RhdGlvbiBhbmQgdGhlIFdTREwpLCByZXR1cm5zIHRoZSB3cmFwcGVyCi0gICAgICogdmFsdWUuICBGb3Igbm9uLXdyYXBwZWQgKGkuZS4gYmFyZSkgcGFyYW1ldGVyIHN0eWxlLCByZXR1cm5zIG51bGwuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkgewotICAgICAgICBpZiAoIWlzV3JhcHBlZFBhcmFtZXRlcnMoKSkgewotICAgICAgICAgICAgLy8gQSB3cmFwcGVyIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igd3JhcHBlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9SZXNwb25zZVdyYXBwZXIoKS5sb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUgPSBnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkubG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGxvY2FsTmFtZSBpcyB0aGUgdmFsdWUgb2Ygb3BlcmF0aW9uUU5hbWUgYXMgCi0gICAgICAgICAgICAgICAgLy8gZGVmaW5lZCBpbiB0aGUgV2ViTWV0aG9kIGFubm90YXRpb24gYXBwZW5kZWQgd2l0aCAiUmVzcG9uc2UiLiBbSkFYLVdTIFNlYy4gNy40LCBwLiA4MV0KLSAgICAgICAgICAgICAgICByZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUgPSBnZXRBbm5vV2ViTWV0aG9kT3BlcmF0aW9uTmFtZSgpICsgIlJlc3BvbnNlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZSAoYmFzZWQgb24gdGhlIGFubm90YXRpb24gYW5kIHRoZSBXU0RMKSwgcmV0dXJucyB0aGUgd3JhcHBlcgotICAgICAqIHZhbHVlLiAgRm9yIG5vbi13cmFwcGVkIChpLmUuIGJhcmUpIHBhcmFtZXRlciBzdHlsZSwgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgaWYgKCFpc1dyYXBwZWRQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIEEgd3JhcHBlciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHdyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlcigpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkudGFyZ2V0TmFtZXNwYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlID0gZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlcigpLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGFyZ2V0TmFtZXNwYWNlIGlzIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBTRUkuIFtKQVgtV1MgU2VjIDcuMywgcC4gODBdCi0gICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZSAoYmFzZWQgb24gdGhlIGFubm90YXRpb24gYW5kIHRoZSBXU0RMKSwgcmV0dXJucyB0aGUgd3JhcHBlcgotICAgICAqIHZhbHVlLiAgRm9yIG5vbi13cmFwcGVkIChpLmUuIGJhcmUpIHBhcmFtZXRlciBzdHlsZSwgcmV0dXJucyBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc1dyYXBwZWRQYXJhbWV0ZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIEEgd3JhcHBlciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIHdyYXBwZWQgcGFyYW1ldGVycwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlcigpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vUmVzcG9uc2VXcmFwcGVyKCkuY2xhc3NOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lID0gZ2V0QW5ub1Jlc3BvbnNlV3JhcHBlcigpLmNsYXNzTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBkZWZhdWx0IGZvciB0aGUgUmVzcG9uc2VXcmFwcGVyIGNsYXNzIG5hbWUuICAKLSAgICAgICAgICAgICAgICAvLyBJbiBzdWNoIGNhc2VzIHRoZSBwcm9ncmFtbWluZyBsYXllciAoSkFYV1MpIG1heSB1c2UgYSBwcm9ncmFtbWluZyBzcGVjIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgLy8gbWVjaGFuaXNtIHRvIGZpbmQgdGhlIGNsYXNzLCBidWlsZCB0aGUgY2xhc3MsIG9yIG9wZXJhdGUgd2l0aG91dCB0aGUgY2xhc3MuCi0gICAgICAgICAgICAgICAgcmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBXZWJGYXVsdAotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIC8qCi0gICAgICogVE9ETyBzb21lIG9mIHRoZSBXZWJGYXVsdCBzdHVmZiBzaG91bGQgYmUgbW92ZWQgdG8gRmF1bHREZXNjcmlwdGlvbgotICAgICAqLwotCi0gICAgLyoKLSAgICAqICBUT0RPOiAgdGhpcyB3aWxsIG5lZWQgcmV2aXNpdGVkLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBhIFdlYkZhdWx0IGlzIG5vdCBtYXBwZWQgMToxIHRvIGFuCi0gICAgKiAgT3BlcmF0aW9uRGVzY3JpcHRpb24uICBXZSBzaG91bGQgZG8gYSBiZXR0ZXIgam9iIGNhY2hpbmcgdGhlIGluZm9ybWF0aW9uLiAgRm9yIG5vdywgSSdtCi0gICAgKiAgZm9sbG93aW5nIHRoZSBnZXRXZWJQYXJhbSgpIHBhdHRlcm4uCi0gICAgKgotICAgICogIFRoaXMgaXMgZ29ubmEgZ2V0IGNvbXBsaWNhdGVkLiAgT25lIG90aGVyIHRoaW5nIHRvIGNvbnNpZGVyIGlzIHRoYXQgYSBtZXRob2QgKG9wZGVzYykgbWF5IGRlY2xhcmUKLSAgICAqICBzZXZlcmFsIHR5cGVzIG9mIGV4Y2VwdGlvbnMgaXQgdGhyb3dzCi0gICAgKgotICAgICovCi0KLSAgICBwdWJsaWMgRmF1bHREZXNjcmlwdGlvbltdIGdldEZhdWx0RGVzY3JpcHRpb25zKCkgewotICAgICAgICByZXR1cm4gZmF1bHREZXNjcmlwdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIEZhdWx0RGVzY3JpcHRpb24gcmVzb2x2ZUZhdWx0QnlFeGNlcHRpb25OYW1lKFN0cmluZyBleGNlcHRpb25DbGFzc05hbWUpIHsKLSAgICAgICAgaWYgKGZhdWx0RGVzY3JpcHRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoRmF1bHREZXNjcmlwdGlvbiBmZCA6IGZhdWx0RGVzY3JpcHRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkNsYXNzTmFtZS5lcXVhbHMoZmQuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IFdlYlBhcmFtCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIE5vdGUgdGhhdCB0aGlzIGFubm90YXRpb24gaXMgaGFuZGxlZCBieSB0aGUgUGFyYW1ldGVyRGVzY3JpcHRvbi4KLSAgICAvLyBNZXRob2RzIGFyZSBwcm92aWRlZCBvbiBPcGVyYXRpb25EZXNjcmlwdGlvbiBhcyBjb252ZW5pZW5jZSBtZXRob2RzLgotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlckRlc2NyaXB0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyRGVzY3JpcHRpb24gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgLy8gVE9ETzogVmFsaWRhdGlvbjogRm9yIEJBUkUgcGFyYW1hdGVyVXNlLCBvbmx5IGEgc2luZ2xlIElOIG91ciBJTk9VVCBwYXJhbWF0ZXIgYW5kIGEgc2luZ2xlIG91dHB1dCAoZWl0aGVyIHJldHVybiBvciBPVVQgb3IgSU5PVVQpIGlzIGFsbG93ZWQgCi0gICAgICAgIC8vICAgICAgIFBlciBKU1ItMjI0LCBTZWMgMy42LjIuMiwgcGcgMzcKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gbWF0Y2hpbmdQYXJhbURlc2MgPSBudWxsOwotICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSAhPSBudWxsICYmICFwYXJhbWV0ZXJOYW1lLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjIDogcGFyYW1ldGVyRGVzY3JpcHRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUuZXF1YWxzKHBhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nUGFyYW1EZXNjID0gcGFyYW1EZXNjOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hdGNoaW5nUGFyYW1EZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbihpbnQgcGFyYW1ldGVyTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJEZXNjcmlwdGlvbnNbcGFyYW1ldGVyTnVtYmVyXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1OYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJQYXJhbU5hbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEFubm9XZWJQYXJhbU5hbWVzKCkgewotICAgICAgICBpZiAod2ViUGFyYW1OYW1lcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBidWlsZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtRGVzY3MgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVzY3JpcHRpb24gY3VycmVudFBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKLSAgICAgICAgICAgICAgICBidWlsZE5hbWVzLmFkZChjdXJyZW50UGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3ZWJQYXJhbU5hbWVzID0gYnVpbGROYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbU5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBbm5vV2ViUGFyYW1UYXJnZXROYW1lc3BhY2VzKCkgewotICAgICAgICBpZiAod2ViUGFyYW1UYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gYnVpbGRUYXJnZXROUyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25bXSBwYXJhbURlc2NzID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlc2NyaXB0aW9uIGN1cnJlbnRQYXJhbURlc2MgOiBwYXJhbURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRUYXJnZXROUy5hZGQoY3VycmVudFBhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZSA9IGJ1aWxkVGFyZ2V0TlMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUGFyYW1UYXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUGFyYW1UYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nIHJldHVyblRhcmdldE5TID0gbnVsbDsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24obmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuVGFyZ2V0TlMgPSBwYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVyblRhcmdldE5TOwotICAgIH0KLQotCi0gICAgcHVibGljIE1vZGVbXSBnZXRBbm5vV2ViUGFyYW1Nb2RlcygpIHsKLSAgICAgICAgaWYgKHdlYlBhcmFtTW9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8TW9kZT4gYnVpbGRNb2RlcyA9IG5ldyBBcnJheUxpc3Q8TW9kZT4oKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjcyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBjdXJyZW50UGFyYW1EZXNjIDogcGFyYW1EZXNjcykgewotICAgICAgICAgICAgICAgIGJ1aWxkTW9kZXMuYWRkKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWN1cnJlbnRQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbU1vZGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3ZWJQYXJhbU1vZGUgPSBidWlsZE1vZGVzLnRvQXJyYXkobmV3IE1vZGVbMF0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm5vV2ViUGFyYW1IZWFkZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjID0gZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24obmFtZSk7Ci0gICAgICAgIGlmIChwYXJhbURlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtRGVzYy5pc0hlYWRlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogV2ViUmVzdWx0Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBXZWJSZXN1bHQgZ2V0QW5ub1dlYlJlc3VsdCgpIHsKLSAgICAgICAgaWYgKHdlYlJlc3VsdEFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFpc0RCQygpICYmIHNlaU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0QW5ub3RhdGlvbiA9IChXZWJSZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb24oc2VpTWV0aG9kLFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0QW5ub3RhdGlvbiA9IG1ldGhvZENvbXBvc2l0ZS5nZXRXZWJSZXN1bHRBbm5vdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IFdlYlJlc3VsdCBhbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHRBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJSZXN1bHQoKSAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkgewotICAgICAgICBib29sZWFuIGlzUmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGlmICghaXNBbm5vT25lV2F5KCkpIHsKLSAgICAgICAgICAgIGlmICghaXNEQkMoKSAmJiBzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzZWlNZXRob2QuZ2V0UmV0dXJuVHlwZSgpICE9IFZvaWQuVFlQRSkgewotICAgICAgICAgICAgICAgICAgICBpc1Jlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KG1ldGhvZENvbXBvc2l0ZS5nZXRSZXR1cm5UeXBlKCkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhbWV0aG9kQ29tcG9zaXRlLmdldFJldHVyblR5cGUoKS5lcXVhbHMoInZvaWQiKSkKLSAgICAgICAgICAgICAgICAgICAgaXNSZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBjbGFzcyB0byBkZXRlcm1pbmUgaWYgcmVzdWx0IGlzIHJldHVybmVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1Jlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUmVzdWx0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlJlc3VsdE5hbWUoKSB7Ci0gICAgICAgIGlmICghaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdlYlJlc3VsdE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJSZXN1bHQoKSAhPSBudWxsICYmICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlJlc3VsdCgpLm5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0TmFtZSA9IGdldEFubm9XZWJSZXN1bHQoKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEFubm9Tb2FwQmluZGluZ1N0eWxlKCkgPT0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQKLSAgICAgICAgICAgICAgICAgICAgJiYgZ2V0QW5ub1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSA9PSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBmb3Igb3BlcmF0aW9uIHN0eWxlIERPQ1VNRU5UIGFuZCBwYXJhbWF0ZXIgc3R5bGUgQkFSRSBwZXIgSlNSIDE4MSBNUiBTZWMgNC41LjEsIHBnIDIzCi0gICAgICAgICAgICAgICAgd2ViUmVzdWx0TmFtZSA9IGdldEFubm9XZWJNZXRob2RPcGVyYXRpb25OYW1lKCkgKyAiUmVzcG9uc2UiOwotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIERlZmVhdWx0IHZhbHVlIGlzICJyZXR1cm4iIHBlciBKU1ItMTgxIE1SIFNlYy4gNC41LjEsIHAuIDIyCi0gICAgICAgICAgICAgICAgd2ViUmVzdWx0TmFtZSA9ICJyZXR1cm4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJSZXN1bHROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0UGFydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUmVzdWx0UGFydE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFubm9XZWJSZXN1bHRQYXJ0TmFtZSgpIHsKLSAgICAgICAgaWYgKCFpc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAod2ViUmVzdWx0UGFydE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJSZXN1bHQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlJlc3VsdCgpLnBhcnROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgd2ViUmVzdWx0UGFydE5hbWUgPSBnZXRBbm5vV2ViUmVzdWx0KCkucGFydE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyB0aGUgV2ViUmVzdWx0Lm5hbWUgcGVyIEpTUi0xODEgTVIgU2VjIDQuNS4xLCBwZyAyMwotICAgICAgICAgICAgICAgIHdlYlJlc3VsdFBhcnROYW1lID0gZ2V0QW5ub1dlYlJlc3VsdE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUmVzdWx0UGFydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbm5vV2ViUmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAoIWlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3ZWJSZXN1bHRUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJSZXN1bHQoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlJlc3VsdCgpLnRhcmdldE5hbWVzcGFjZSgpKSkgewotICAgICAgICAgICAgICAgIHdlYlJlc3VsdFRhcmdldE5hbWVzcGFjZSA9IGdldEFubm9XZWJSZXN1bHQoKS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKSA9PSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVAotICAgICAgICAgICAgICAgICAgICAmJiBnZXRBbm5vU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQKLSAgICAgICAgICAgICAgICAgICAgJiYgIWdldEFubm9XZWJSZXN1bHRIZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgZm9yIG9wZXJhdGlvbiBzdHlsZSBET0NVTUVOVCBhbmQgcGFyYW1hdGVyIHN0eWxlIFdSQVBQRUQgYW5kIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBtYXAgdG8gYSBoZWFkZXIgcGVyIEpTUi0xODEgTVIgU2VjIDQuNS4xLCBwZyAyMy0yNAotICAgICAgICAgICAgICAgIHdlYlJlc3VsdFRhcmdldE5hbWVzcGFjZSA9IFdlYlJlc3VsdF9UYXJnZXROYW1lc3BhY2VfREVGQVVMVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyB0aGUgbmFtZXNwYWNlIGZyb20gdGhlIFdlYlNlcnZpY2UgcGVyIEpTUi0xODEgTVIgU2VjIDQuNS4xLCBwZyAyMy0yNAotICAgICAgICAgICAgICAgIHdlYlJlc3VsdFRhcmdldE5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKWdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKS5nZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlJlc3VsdFRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3VsdEhlYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJSZXN1bHRIZWFkZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbm5vV2ViUmVzdWx0SGVhZGVyKCkgewotICAgICAgICBpZiAoIWlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2ViUmVzdWx0SGVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViUmVzdWx0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFVubGlrZSB0aGUgZWxlbWVudHMgd2l0aCBhIFN0cmluZyB2YWx1ZSwgaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudCwgZXhjbHVkZSB3aWxsIGFsd2F5cyAKLSAgICAgICAgICAgICAgICAvLyByZXR1cm4gYSB1c2FibGUgdmFsdWUgc2luY2UgaXQgd2lsbCBkZWZhdWx0IHRvIEZBTFNFIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotICAgICAgICAgICAgICAgIHdlYlJlc3VsdEhlYWRlciA9IG5ldyBCb29sZWFuKGdldEFubm9XZWJSZXN1bHQoKS5oZWFkZXIoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdlYlJlc3VsdEhlYWRlciA9IFdlYlJlc3VsdF9IZWFkZXJfREVGQVVMVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUmVzdWx0SGVhZGVyLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBBTk5PVEFUSU9OOiBTT0FQQmluZGluZwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwdWJsaWMgU09BUEJpbmRpbmcgZ2V0QW5ub1NvYXBCaW5kaW5nKCkgewotICAgICAgICAvLyBUT0RPOiBWQUxJREFUSU9OOiBPbmx5IHN0eWxlIG9mIERPQ1VNRU5UIGFsbG93ZWQgb24gTWV0aG9kIGFubm90YXRpb247IHJlbWVtYmVyIHRvIGNoZWNrIHRoZSBUeXBlJ3Mgc3R5bGUgc2V0dGluZyBhbHNvCi0gICAgICAgIC8vICAgICAgIEpTUi0xODEgU2VjIDQuNyBwLiAyOAotICAgICAgICBpZiAoc29hcEJpbmRpbmdBbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaXNEQkMoKSAmJiBzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nQW5ub3RhdGlvbiA9IChTT0FQQmluZGluZykKLSAgICAgICAgICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbihzZWlNZXRob2QsU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RCQygpICYmIG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gbWV0aG9kQ29tcG9zaXRlLmdldFNvYXBCaW5kaW5nQW5ub3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGdldCBTT0FQIEJpbmRpbmcgYW5ub3RhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZSBnZXRTb2FwQmluZGluZ1N0eWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nU3R5bGUoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ1N0eWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vU29hcEJpbmRpbmcoKSAhPSBudWxsICYmIGdldEFubm9Tb2FwQmluZGluZygpLnN0eWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nU3R5bGUgPSBnZXRBbm5vU29hcEJpbmRpbmcoKS5zdHlsZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBQZXIgSlNSLTE4MSBNUiBTZWMgNC43LCBwZyAyODogaWYgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBUeXBlIHZhbHVlLgotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nU3R5bGUgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwQmluZGluZ1N0eWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UgZ2V0U29hcEJpbmRpbmdVc2UoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vU29hcEJpbmRpbmdVc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlIGdldEFubm9Tb2FwQmluZGluZ1VzZSgpIHsKLSAgICAgICAgaWYgKHNvYXBCaW5kaW5nVXNlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vU29hcEJpbmRpbmcoKSAhPSBudWxsICYmIGdldEFubm9Tb2FwQmluZGluZygpLnVzZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzb2FwQmluZGluZ1VzZSA9IGdldEFubm9Tb2FwQmluZGluZygpLnVzZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBQZXIgSlNSLTE4MSBNUiBTZWMgNC43LCBwZyAyODogaWYgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBUeXBlIHZhbHVlLgotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nVXNlID0gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nVXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBCaW5kaW5nVXNlOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZSBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUgZ2V0QW5ub1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vU29hcEJpbmRpbmcoKSAhPSBudWxsICYmIGdldEFubm9Tb2FwQmluZGluZygpLnBhcmFtZXRlclN0eWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPSBnZXRBbm5vU29hcEJpbmRpbmcoKS5wYXJhbWV0ZXJTdHlsZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBQZXIgSlNSLTE4MSBNUiBTZWMgNC43LCBwZyAyODogaWYgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBUeXBlIHZhbHVlLgotICAgICAgICAgICAgICAgIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IEFjdGlvbgotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICBwdWJsaWMgQWN0aW9uIGdldEFubm9BY3Rpb24oKSB7Ci0gICAgICAgIGlmIChhY3Rpb25Bbm5vdGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghaXNEQkMoKSAmJiBzZWlNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFjdGlvbkFubm90YXRpb24gPSAoQWN0aW9uKSBnZXRBbm5vdGF0aW9uKHNlaU1ldGhvZCwgQWN0aW9uLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG1ldGhvZENvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uQW5ub3RhdGlvbiA9IG1ldGhvZENvbXBvc2l0ZS5nZXRBY3Rpb25Bbm5vdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGdldCBBY3Rpb24gYW5ub3RhdGlvbi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRBbm5vQWN0aW9uOiAiICsgYWN0aW9uQW5ub3RhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBhY3Rpb25Bbm5vdGF0aW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbnB1dEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIGlucHV0QWN0aW9uID0gbnVsbDsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGdldEFubm9BY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaW5wdXRBY3Rpb24gPSBhY3Rpb24uaW5wdXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldElucHV0QWN0aW9uOiAiICsgaW5wdXRBY3Rpb24pOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW5wdXRBY3Rpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldE91dHB1dEFjdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIG91dHB1dEFjdGlvbiA9IG51bGw7Ci0gICAgICAgIEFjdGlvbiBhY3Rpb24gPSBnZXRBbm5vQWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dHB1dEFjdGlvbiA9IGFjdGlvbi5vdXRwdXQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldE91dHB1dEFjdGlvbjogIiArIG91dHB1dEFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBvdXRwdXRBY3Rpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRmF1bHRBY3Rpb25bXSBnZXRGYXVsdEFjdGlvbnMoKSB7Ci0gICAgICAgIEZhdWx0QWN0aW9uW10gZmF1bHRBY3Rpb25zID0gbnVsbDsKLSAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGdldEFubm9BY3Rpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChhY3Rpb24gIT0gIG51bGwpIHsKLSAgICAgICAgICAgIGZhdWx0QWN0aW9ucyA9IGFjdGlvbi5mYXVsdCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiZ2V0RmF1bHRBY3Rpb25zOiAiICsgZmF1bHRBY3Rpb25zKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhdWx0QWN0aW9uczsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogT25lV2F5Ci0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBPbmV3YXkgZ2V0QW5ub09uZXdheSgpIHsKLSAgICAgICAgaWYgKG9uZXdheUFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBvbmV3LXdheSBhbm5vdGF0aW9uIGZyb20gZWl0aGVyIHRoZSBtZXRob2QgY29tcG9zaXRlIChzZXJ2ZXItc2lkZSkKLSAgICAgICAgICAgIC8vIG9yIGZyb20gdGhlIFNFSSBtZXRob2QgKGNsaWVudC1zaWRlKS4gIAotICAgICAgICAgICAgaWYgKGlzREJDKCkgJiYgbWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQ29tcG9zaXRlLmlzT25lV2F5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb25ld2F5QW5ub3RhdGlvbiA9IE9uZVdheUFubm90LmNyZWF0ZU9uZVdheUFubm90SW1wbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzREJDKCkgJiYgc2VpTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvbmV3YXlBbm5vdGF0aW9uID0gKE9uZXdheSkgZ2V0QW5ub3RhdGlvbihzZWlNZXRob2QsT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGdldCBPbmVXYXkgYW5ub3RhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb25ld2F5QW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQW5ub09uZVdheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub09uZVdheSgpIHsKLSAgICAgICAgaWYgKG9uZXdheUlzT25ld2F5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vT25ld2F5KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBwcmVzZW5jZSBvZiB0aGUgYW5ub3RhdGlvbiBpbmRpY2F0ZXMgdGhlIG1ldGhvZCBpcyBvbmV3YXkKLSAgICAgICAgICAgICAgICBvbmV3YXlJc09uZXdheSA9IG5ldyBCb29sZWFuKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYW5ub3RhdGlvbiBpcyBub3QgcHJlc2VudCwgdGhlIGRlZmF1bHQgaXMgdGhpcyBpcyBOT1QgYSBPbmUgV2F5IG1ldGhvZAotICAgICAgICAgICAgICAgIG9uZXdheUlzT25ld2F5ID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbmV3YXlJc09uZXdheS5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEQkMoKSB7Ci0gICAgICAgIGlmIChtZXRob2RDb21wb3NpdGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbiNnZXRSZXN1bHRUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVzdWx0VHlwZSgpIHsKLSAgICAgICAgQ2xhc3MgcmV0dXJuQ2xhc3MgPSBudWxsOwotICAgICAgICBpZiAoIWlzREJDKCkgJiYgZ2V0U0VJTWV0aG9kKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgTWV0aG9kIHNlaU1ldGhvZCA9IHRoaXMuZ2V0U0VJTWV0aG9kKCk7Ci0gICAgICAgICAgICByZXR1cm5DbGFzcyA9IHNlaU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybkNsYXNzID0gbWV0aG9kQ29tcG9zaXRlLmdldFJldHVyblR5cGVDbGFzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZ2V0IHJlc3VsdCB0eXBlIGZyb20gbnVsbCBjbGFzcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5DbGFzczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uI2dldFJlc3VsdEFjdHVhbFR5cGUoKQotICAgICAqLwotICAgIHB1YmxpYyBDbGFzcyBnZXRSZXN1bHRBY3R1YWxUeXBlKCkgewotICAgICAgICBpZihyZXN1bHRBY3R1YWxUeXBlQ2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0QWN0dWFsVHlwZUNsYXp6ID0gZmluZFJlc3VsdEFjdHVhbFR5cGUoKTsgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdEFjdHVhbFR5cGVDbGF6ejsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENsYXNzIGZpbmRSZXN1bHRBY3R1YWxUeXBlKCkgewotICAgICAgICAvLyBUT0RPOiBGaXggdGhpcyEgIGl0IGlzbid0IGRvaW5nIHRoZSByaWdodCB0aGluZyBmb3IgREJDIGFzIG5vdGVkIGJlbG93IHdpdGggRklYTUUgY29tbWVudHMKLSAgICAgICAgLy8gICAgICAgVGhpcyBpcyB1c2VkIHRvIG1hcnNoYWxsIHRoZSByc3Agb24gdGhlIHNlcnZpY2UgKGRiYykgYW5kIGRlbWFyc2hhbGwgb24gdGhlIGNsaWVudCAocmVmbGVjdGlvbikKLSAgICAgICAgLy8gICAgICAgQnV0IHdlIHNob3VsZG4ndCBnZXQgYW4gYXN5bmMgT3BEZXNjIG9uIHRoZSBzZXJ2aWNlIHNpbmNlIGdldERpc3BhdGNoYWJsZU9wZXJhdGlvbihRTikgcmVtb3ZlcyB0aGVtLgotCi0gICAgICAgIENsYXNzIHJldHVyblR5cGUgPSBnZXRSZXN1bHRUeXBlKCk7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSkgewotICAgICAgICAgICAgLy9wb29saW5nIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICBpZiAoUmVzcG9uc2UuY2xhc3MgPT0gcmV0dXJuVHlwZSkgewotICAgICAgICAgICAgICAgIGlmICghaXNEQkMoKSkgewotICAgICAgICAgICAgICAgICAgICBUeXBlIHR5cGUgPSBzZWlNZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgVHlwZSBhVHlwZSA9IHBUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFUeXBlICE9IG51bGwgJiYgUGFyYW1ldGVyaXplZFR5cGUuY2xhc3MuaXNJbnN0YW5jZShhVHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpKChQYXJhbWV0ZXJpemVkVHlwZSlhVHlwZSkuZ2V0UmF3VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpYVR5cGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFRoaXMgZG9lc24ndCB3b3JrIGZvciBEQkMuICBUaGF0J3MgT0sgZm9yIG5vdyBiZWNhdXNlIERCQyBpc24ndCB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgeWV0OyB0aGUgY2xpZW50IGlzIGFsbCBKYXZhIFJlZmxlY3Rpb24uICBPbiB0aGUgU2VydmljZSBzaWRlLCB0aGUgQXN5bmMgbWV0aG9kcyBhcmUgbm90IHVzZWQuCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBUaGlzIG5lZWRzIHRvIHJldHVybiBUIGZvciBSZXNwb25zZTxUPiwgb3IgTGlzdCBmb3IgUmVzcG9uc2U8TGlzdDxUPj4+Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5UeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2FsbGJhY2sgSW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgREJDLiAgVGhhdCdzIE9LIGZvciBub3cgYmVjYXVzZSBEQkMgaXNuJ3QgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgeWV0OyB0aGUgY2xpZW50IGlzIGFsbCBKYXZhIFJlZmxlY3Rpb24uICBPbiB0aGUgU2VydmljZSBzaWRlLCB0aGUgQXN5bmMgbWV0aG9kcyBhcmUgbm90IHVzZWQuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIFRoaXMgbmVlZHMgdG8gZmluZCBhbmQgcmV0dXJuIFQgZm9yIEFzeW5jSGFuZGxlcjxUPiwgb3IgTGlzdCBmb3IgQXN5bmNIYW5kbGVyPExpc3Q8VD4+PgotICAgICAgICAgICAgICAgIFR5cGVbXSB0eXBlID0gZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1ldGVyc1tdID0gZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChDbGFzcyBwYXJhbSA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFzeW5jSGFuZGxlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpdHlwZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgYVR5cGUgPSBwVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVR5cGUgIT0gbnVsbCAmJiBQYXJhbWV0ZXJpemVkVHlwZS5jbGFzcy5pc0luc3RhbmNlKGFUeXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpKChQYXJhbWV0ZXJpemVkVHlwZSlhVHlwZSkuZ2V0UmF3VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzcylhVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFR5cGVbXSBnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSB7Ci0gICAgICAgIGlmIChpc0RCQygpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBkb2Vzbid0IHdvcmsgZm9yIERCQy4gIFRoYXQncyBPSyBmb3Igbm93IGJlY2F1c2UgREJDIGlzbid0IHVzZWQgb24gdGhlIGNsaWVudCBzaWRlCi0gICAgICAgICAgICAvLyAgICAgICAgeWV0OyB0aGUgY2xpZW50IGlzIGFsbCBKYXZhIFJlZmxlY3Rpb24uICBPbiB0aGUgU2VydmljZSBzaWRlLCB0aGUgQXN5bmMgbWV0aG9kcyBhcmUgbm90IHVzZWQuCi0gICAgICAgICAgICAvLyAgICAgICAgQW5kIHRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB0byBwYXJzZSBvdXQgdGhlIEpBWC1XUyBBc3luYyBwYXJhbWV0ZXIgdHlwZXMgdG8gZmluZAotICAgICAgICAgICAgLy8gICAgICAgIEFzeW5jSGFuZGxlcjxUPi4gIFRoZSBwcm9ibGVtIHdpdGggdGhlIGNvZGUgdGhhdCB3YXMgcmVtb3ZlZCBpcyB0aGF0IGEgVHlwZSBjYW4gbm90IGJlCi0gICAgICAgICAgICAvLyAgICAgICAgaW5zdGFudGlhdGVkLCBzbyB3ZSBjYW4ndCBuZXcgdXAgYSBUeXBlIGluc2lkZSB0aGUgUERDLgotICAgICAgICAJdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiZ2VuUGFyYW1UeXBlc0VyciIpKSk7Ci0vLyAgICAgICAgICAgVHlwZSBbXSB0eXBlID0gbmV3IFR5cGVbcGFyYW1ldGVyRGVzY3JpcHRpb25zLmxlbmd0aF07Ci0vLyAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgcGFyYW1ldGVyRGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKXsKLS8vICAgICAgICAgICAgICAgdHlwZVtpXSA9ICgoUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsKSBwYXJhbWV0ZXJEZXNjcmlwdGlvbnNbaV0pLmdldFBhcmFtZXRlckFjdHVhbEdlbmVyaWNUeXBlKCk7Ci0vLyAgICAgICAgICAgfQotLy8gICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVHlwZSBbXSB0eXBlID0gc2VpTWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0gICAgICAgIGlmIChpc0RCQygpKSB7Ci0gICAgICAgICAgICBDbGFzcyBbXSBwYXJhbWV0ZXJzID0gbmV3IENsYXNzW3BhcmFtZXRlckRlc2NyaXB0aW9ucy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJEZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzW2ldID0gcGFyYW1ldGVyRGVzY3JpcHRpb25zW2ldLmdldFBhcmFtZXRlclR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ2xhc3MgW10gcGFyYW1ldGVycyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uI2lzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpCi0gICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSB7Ci0gICAgICAgIGJvb2xlYW4gYW5zd2VyID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHJldHVyblR5cGVOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKGlzREJDKCkpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBnZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpLmdldE1ldGhvZE5hbWUoKTsKLSAgICAgICAgICAgIHJldHVyblR5cGVOYW1lID0gZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKS5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gdGhpcy5nZXRTRUlNZXRob2QoKTsKLSAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIHJldHVyblR5cGVOYW1lID0gbWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGhvZE5hbWUgIT0gbnVsbCAmJiByZXR1cm5UeXBlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbnN3ZXIgPSAocmV0dXJuVHlwZU5hbWUuY29udGFpbnMoUmVzcG9uc2UuY2xhc3MuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlTmFtZS5jb250YWlucyhGdXR1cmUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIk1ldGhvZCA9ICIgKyBtZXRob2ROYW1lKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0dXJuIFR5cGUgPSAiICsgcmV0dXJuVHlwZU5hbWUpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJJcyBjbGllbnQgYXN5bmMgPSAiICsgYW5zd2VyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgU2VydmljZSBJbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHRoaXMgb3BlcmF0aW9uIElGRiBpdCBoYXMgYmVlbiBzZXQgYnkgYSBwcmV2aW91cwotICAgICAqIGNhbGwgdG8gZ2V0TWV0aG9kRnJvbVNlcnZpY2VJbXBsKENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MpLiAgT3RoZXJ3aXNlIGEgbnVsbCBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1ldGhvZCBnZXRNZXRob2RGcm9tU2VydmljZUltcGwoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlSW1wbE1ldGhvZDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kRnJvbVNlcnZpY2VJbXBsKENsYXNzIHNlcnZpY2VJbXBsKSB7Ci0KLSAgICAgICAgLy8gVE9ETzogVGhpcyBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzIGluIHRoZSBzZXJ2aWNlIGltcGwgIFRoaXMgaXMKLSAgICAgICAgLy8gICAgICAgRElGRkVSRU5UIHRoYW4gb3ZlcmxvYWRlZCBXU0RMIG9wZXJhdGlvbnMgKHdoaWNoIGFyZW4ndCBzdXBwb3J0ZWQpLiAgV2UKLSAgICAgICAgLy8gICAgICAgTVVTVCBzdXBwb3J0IG92ZXJsb2FkZWQgc2VydmljZSBpbXBsIG1ldGhvZHMgYXMgbG9uZyBhcyB0aGV5IGhhdmUgZGlmZmVyZW50Ci0gICAgICAgIC8vICAgICAgIHdzZGwgb3BlcmF0aW9uIG5hbWVzLiAgRm9yIGV4YW1wbGU6Ci0gICAgICAgIC8vICBTZXJ2aWNlSW1wbGUgQ2xhc3MgICAgICAgICAgU0VJIENsYXNzCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFdlYk1ldGhvZC5uYW1lID0gRm9vMQotICAgICAgICAvLyAgdm9pZCBmb28oKSAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAV2ViTWV0aG9kLm5hbWUgPSBGb28yCi0gICAgICAgIC8vICB2b2lkIGZvbyhpbnQpICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KQotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBXZWJNZXRob2QubmFtZSA9IEZvbzMKLSAgICAgICAgLy8gIHZvaWQgZm9vKFN0cmluZykgICAgICAgICAgICB2b2lkIGZvbyhTdHJpbmcpCi0gICAgICAgIC8vCi0gICAgICAgIC8vICBUaGVyZSB3aWxsIGJlIHR3byBPcERlc2NzLCBGb28xIGFuZCBGb28yOyB0aGUgaW5jb21pbmcgd3NkbCBvcGVyYXRpb24gd2lsbCBjb3JyZWN0bHkgaWRlbnRpZnkKLSAgICAgICAgLy8gIHdoaWNoIE9wRGVzYy4gIEhvd2V2ZXIsIHRvIHJldHVybiB0aGUgY29ycmVjdCBzZXJ2aWNlIGltcGwgbWV0aG9kLCB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlCi0gICAgICAgIC8vICBzaWduYXR1cmVzLCBub3QganVzdCB0aGUgbWV0aG9kIG5hbWVzLgotICAgICAgICBpZiAoIXNlcnZpY2VJbXBsTWV0aG9kRm91bmQpIHsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBzZXJ2aWNlSW1wbC5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgb3BEZXNjTWV0aG9kTmFtZSA9IGdldEphdmFNZXRob2ROYW1lKCk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtRGVzYyA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICAgICAgLy8gVE9ETzogQXMgbm90ZWQgYWJvdmUsIGEgZnVsbCBzaWduYXR1cmUgaXMgbmVjZXNzYXJ5LCBub3QganVzdCBudW1iZXIgb2YgcGFyYW1zCi0gICAgICAgICAgICBpbnQgbnVtYmVyT2ZQYXJhbXMgPSAwOwotICAgICAgICAgICAgaWYgKHBhcmFtRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbnVtYmVyT2ZQYXJhbXMgPSBwYXJhbURlc2MubGVuZ3RoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBzZXJ2aWNlIGltcGwgYW5kIGZpbmQgdGhlIG1ldGhvZCB0aGF0IG1hcHMKLSAgICAgICAgICAgIC8vIHRvIHRoaXMgT3BlcmF0aW9uRGVzY3JpcHRvbgotICAgICAgICAgICAgZm9yIChNZXRob2QgY2hlY2tNZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrTWV0aG9kLmdldE5hbWUoKS5lcXVhbHMob3BEZXNjTWV0aG9kTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NbXSBtZXRob2RQYXJhbXMgPSBjaGVja01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBcyBub3RlZCBhYm92ZSwgYSBmdWxsIHNpZ25hdHVyZSBpcyBuZWNlc3NhcnksIG5vdCBqdXN0IG51bWJlciBvZiBwYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZFBhcmFtcy5sZW5ndGggPT0gbnVtYmVyT2ZQYXJhbXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVR5cGVzTWF0Y2gocGFyYW1EZXNjLCBtZXRob2RQYXJhbXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUltcGxNZXRob2QgPSBjaGVja01ldGhvZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VJbXBsTWV0aG9kRm91bmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlSW1wbE1ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGNvbXBhcmUgdGhlIHR5cGVzIG9mIHRoZSBwYXJhbWV0ZXJzIGluIGEgPGNvZGU+UGFyYW1ldGVyRGVzY3JpcHRpb248L2NvZGU+Ci0gICAgICogdnMuIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudHMgaW4gdGhlIHBhcmFtZXRlcnMgb2YgYSA8Y29kZT5NZXRob2Q8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhcmFtRGVzY3MgICAtIDxjb2RlPlBhcmFtZXRlckRlc2NyaXB0aW9uPC9jb2RlPltdCi0gICAgICogQHBhcmFtIG1ldGhvZFBhcmFtcyAtIDxjb2RlPkNsYXNzPC9jb2RlPltdCi0gICAgICogQHJldHVybiAtIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcmFtVHlwZXNNYXRjaChQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtRGVzY3MsIENsYXNzW10KLSAgICAgICAgICAgIG1ldGhvZFBhcmFtcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtRGVzY3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBtUGFyYW1UeXBlID0gbWV0aG9kUGFyYW1zW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBwZFR5cGUgPSBnZXRQRFR5cGUocGFyYW1EZXNjc1tpXSk7Ci0gICAgICAgICAgICBpZiAobVBhcmFtVHlwZSA9PSBudWxsIHx8ICFtUGFyYW1UeXBlLmVxdWFscyhwZFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBnZXQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgcGFyYW1ldGVyIGNsYXNzIG9mIGEKLSAgICAgKiA8Y29kZT5QYXJhbWV0ZXJEZXNjcmlwdGlvbjwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGQgLSA8Y29kZT5QYXJhbWV0ZXJEZXNjcml0aW9uPC9jb2RlPgotICAgICAqIEByZXR1cm4gLSA8Y29kZT5TdHJpbmc8L2NvZGU+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UERUeXBlKFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlID0gbnVsbDsKLSAgICAgICAgaWYgKHBkLmdldFBhcmFtZXRlclR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gcGQuZ2V0UGFyYW1ldGVyVHlwZSgpLmdldE5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChwZC5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IHBkLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIE9wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbiBnZXRPcGVyYXRpb25SdW50aW1lRGVzYyhTdHJpbmcgbmFtZSkgewotICAgICAgICAvLyBUT0RPIEFkZCB0b1N0cmluZyBzdXBwb3J0Ci0gICAgICAgIHJldHVybiBydW50aW1lRGVzY01hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uUnVudGltZURlc2MoT3BlcmF0aW9uUnVudGltZURlc2NyaXB0aW9uIG9yZCkgewotICAgICAgICAvLyBUT0RPIEFkZCB0b1N0cmluZyBzdXBwb3J0Ci0gICAgICAgIHJ1bnRpbWVEZXNjTWFwLnB1dChvcmQuZ2V0S2V5KCksIG9yZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzTGlzdFR5cGUoKSB7Ci0gICAgCXJldHVybiBpc0xpc3RUeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbmFtZXNwYWNlIGZvciB0aGUgQmluZGluZ0lucHV0IHRoYXQgdGhpcyBvcGVyYXRpb24KLSAgICAgKiBzcGVjaWZpZXMuIEl0IHdpbGwgZmlyc3QgbG9vayBmb3IgYSBuYW1lc3BhY2Ugb24gdGhlIFdTREwgQmluZGluZyBvYmplY3QgYW5kIHRoZW4gCi0gICAgICogZGVmYXVsdCB0byB0aGUgd2ViIHNlcnZpY2UncyB0YXJnZXQgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ0lucHV0TmFtZXNwYWNlKCkgewotICAgICAgICBTdHJpbmcgdG5zID0gbnVsbDsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0KLSAgICAgICAgICAgICAgICB0aGlzLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFdTRExCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgV1NETCBiaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB0aGlzIGNhbGwgZG9lcyBub3Qgc3VwcG9ydCBvdmVybG9hZGVkIFdTREwgb3BlcmF0aW9ucyBhcyBpdAotICAgICAgICAgICAgLy8gZG9lcyBub3Qgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcwotICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPQotICAgICAgICAgICAgICAgICAgICBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb24oZ2V0T3BlcmF0aW9uTmFtZSgpLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGlmIChiaW5kaW5nT3AgIT0gbnVsbCAmJiBiaW5kaW5nT3AuZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFdTREwgYmluZGluZyBvcGVyYXRpb24gYW5kIGlucHV0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRucyA9IGdldEJpbmRpbmdOYW1lc3BhY2UoYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodG5zICE9IG51bGwgJiYgbG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3Igb3BlcmF0aW9uOiAiICsgYmluZGluZ09wLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXR1cm5pbmcgdGhlIGZvbGxvd2luZyBuYW1lc3BhY2UgZm9yIGlucHV0IG1lc3NhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gV1NETDogIiArIHRucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0bnMgPT0gbnVsbCkgewotICAgICAgICAgICAgdG5zID0gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3IgYmluZGluZyBpbnB1dCByZXR1cm5pbmcgQFdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlOiAiICsgdG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG5zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBCaW5kaW5nT3V0cHV0IHRoYXQgdGhpcyBvcGVyYXRpb24KLSAgICAgKiBzcGVjaWZpZXMuIEl0IHdpbGwgZmlyc3QgbG9vayBmb3IgYSBuYW1lc3BhY2Ugb24gdGhlIFdTREwgQmluZGluZyBvYmplY3QgYW5kIHRoZW4gCi0gICAgICogZGVmYXVsdCB0byB0aGUgd2ViIHNlcnZpY2UncyB0YXJnZXQgbmFtZXNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ091dHB1dE5hbWVzcGFjZSgpIHsKLSAgICAgICAgU3RyaW5nIHRucyA9IG51bGw7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9Ci0gICAgICAgICAgICAgICAgdGhpcy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRXU0RMQmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFdTREwgYmluZGluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gdGhpcyBjYWxsIGRvZXMgbm90IHN1cHBvcnQgb3ZlcmxvYWRlZCBXU0RMIG9wZXJhdGlvbnMgYXMgaXQKLSAgICAgICAgICAgIC8vIGRvZXMgbm90IHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZXMKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wID0KLSAgICAgICAgICAgICAgICAgICAgYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9uKGdldE9wZXJhdGlvbk5hbWUoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ09wICE9IG51bGwgJiYgYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBhbmQgb3V0cHV0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRucyA9IGdldEJpbmRpbmdOYW1lc3BhY2UoYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRucyAhPSBudWxsICYmIGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yIG9wZXJhdGlvbjogIiArIGJpbmRpbmdPcC5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcmV0dXJuaW5nIHRoZSBmb2xsb3dpbmcgbmFtZXNwYWNlIGZvciBvdXRwdXQgbWVzc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBXU0RMOiAiICsgdG5zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0bnMgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvciBiaW5kaW5nIG91dHB1dCByZXR1cm5pbmcgQFdlYlNlcnZpY2UudGFyZ2V0TmFtZXNwYWNlOiAiICsgdG5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG5zOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIG5hbWVzcGFjZSB0aGF0IGlzIHNwZWNpZmllZCBieSB0aGUgQmluZGluZ0lucHV0IG9yCi0gICAgICogQmluZGluZ091dHB1dCBvYmplY3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmluZGluZ05hbWVzcGFjZShBdHRyaWJ1dGVFeHRlbnNpYmxlIG9wSW5mbykgewotICAgICAgICBpZiAob3BJbmZvIGluc3RhbmNlb2YgQmluZGluZ0lucHV0KSB7Ci0gICAgICAgICAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSAoQmluZGluZ0lucHV0KSBvcEluZm87Ci0gICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRpb25VdGlscy5nZXROYW1lc3BhY2VGcm9tU09BUEVsZW1lbnQoaW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG9wSW5mbyBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpIHsKLSAgICAgICAgICAgIEJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gKEJpbmRpbmdPdXRwdXQpIG9wSW5mbzsKLSAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdGlvblV0aWxzLmdldE5hbWVzcGFjZUZyb21TT0FQRWxlbWVudChvdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQXR0YWNobWVudERlc2NyaXB0aW9uIGdldFJlc3VsdEF0dGFjaG1lbnREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gdGhpcy5nZXRSZXN1bHRQYXJ0TmFtZSgpOwotICAgICAgICBpZiAocGFydE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgcmVzdWx0IEF0dGFjaG1lbnREZXNjcmlwdGlvbiBmb3IgcGFydE5hbWU6ICIgKyBwYXJ0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFydEF0dGFjaG1lbnRNYXAuZ2V0KHBhcnROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGlkIG5vdCBmaW5kIHJlc3VsdCBBdHRhY2htZW50RGVzY3JpcHRpb24gZm9yIHBhcnROYW1lOiAiICsgcGFydE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRyaXZlIHRoZSBidWlsZGluZyBvZiBBdHRhY2htZW50RGVzY3JpcHRpb24gb2JqZWN0cyBmb3IgdGhlCi0gICAgICogb3BlcmF0aW9uIGlucHV0L291dHB1dCBtZXNzYWdlcyBpbiB0aGUgV1NETC4KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBidWlsZEF0dGFjaG1lbnRJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlN0YXJ0IGJ1aWxkQXR0YWNobWVudEluZm9ybWF0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT25seSBidWlsZGluZyBhdHRhY2htZW50IGluZm8gaWYgd2UgZmluZCBhIGZ1bGwgV1NETAotICAgICAgICBpZiAodGhpcy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpCi0gICAgICAgICAgICAgICAgLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAuaXNXU0RMRnVsbHlTcGVjaWZpZWQoKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBIGZ1bGwgV1NETCBpcyBhdmFpbGFibGUuICBRdWVyeSB0aGUgV1NETCBiaW5kaW5nIGZvciB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2htZW50RGVzY3JpcHRpb24gaW5mb3JtYXRpb24uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLmdldEF0dGFjaG1lbnRGcm9tQmluZGluZyh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSW1wbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V1NETEJpbmRpbmcoKSk7Ci0gICAgICAgIH0gIGVsc2UgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJUaGUgV1NETCBpcyBub3QgYXZhaWxhYmxlLiAgTG9va2luZyBmb3IgQFdlYlNlcnZpY2Ugd3NkbExvY2F0aW9uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUcnkgZ2V0dGluZyBhIFdTREwKLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB0aGlzLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsKCkuCi0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgICAgICBnZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uID09IG51bGwgfHwgd3NkbExvY2F0aW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJAV2ViU2VydmljZSB3c2RsTG9jYXRpb24gaXMgbm90IHNwZWNpZmllZC4gICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBjb250aW51ZXMgd2l0aG91dCBBdHRhY2htZW50RGVzY3JpcHRpb24gaW5mb3JtYXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkBXZWJTZXJ2aWNlIHdzZGxMb2NhdGlvbiBpcyAiICsgd3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotICAgICAgICAgICAgICAgIFdTREw0SldyYXBwZXIgd3NkbDRqID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gZmlsZS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICB3c2RsNGogPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsIHRydWUsIDIpOyAgLy8gSW4gdGhpcyBjb250ZXh0LCBsaW1pdCB0aGUgd3NkbCBtZW1vcnkKLSAgICAgICAgICAgICAgICAgICAgZGVmID0gd3NkbDRqLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBXU0RMLiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc2luZyBjb250aW51ZXMgd2l0aG91dCBBdHRhY2htZW50RGVzY3JpcHRpb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZm9ybWF0aW9uLiAiICsgdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgV1NETCBvbiB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS5nZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbCgpLgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZURlc2NyaXB0aW9uSW1wbCgpLnNldFdzZGxXcmFwcGVyKHdzZGw0aik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJXU0RMIERlZmluaXRpb24gaXMgbG9hZGVkLiAgR2V0IHRoZSBXU0RMIEJpbmRpbmcuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHRoaXMuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkltcGwoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKCkuZ2V0V1NETEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETCBCaW5kaW5nIHdhcyBub3QgZm91bmQgZm9yIHNlcnZpY2VOYW1lPSIgKyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlUU5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHBvcnROYW1lPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbmRwb2ludERlc2NyaXB0aW9uKCkuZ2V0UG9ydFFOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJRdWVyeSBCaW5kaW5nIGZvciBBdHRhY2htZW50RGVzY3JpcHRpb24gSW5mb3JtYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMuZ2V0QXR0YWNobWVudEZyb21CaW5kaW5nKHRoaXMsIGJpbmRpbmcpOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmQgYnVpbGRBdHRhY2htZW50SW5mb3JtYXRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCByZXR1cm4gYW4gQXR0YWNobWVudERlc2NyaXB0aW9uIGJhc2VkIG9uIGEgcGFydCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBBdHRhY2htZW50RGVzY3JpcHRpb24gZ2V0UGFydEF0dGFjaG1lbnREZXNjcmlwdGlvbihTdHJpbmcgcGFydE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHBhcnRBdHRhY2htZW50TWFwLmdldChwYXJ0TmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUGFydEF0dGFjaG1lbnREZXNjcmlwdGlvbihTdHJpbmcgcGFydE5hbWUsIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBhdHRhY2htZW50RGVzYykgewotICAgICAgICBwYXJ0QXR0YWNobWVudE1hcC5wdXQocGFydE5hbWUsIGF0dGFjaG1lbnREZXNjKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzKCkgewotICAgICAgICByZXR1cm4gaGFzUmVxdWVzdFN3YVJlZkF0dGFjaG1lbnRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNSZXF1ZXN0U3dhUmVmQXR0YWNobWVudHMoYm9vbGVhbiBiKSB7Ci0gICAgICAgIGhhc1JlcXVlc3RTd2FSZWZBdHRhY2htZW50cyA9IGI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc1Jlc3BvbnNlU3dhUmVmQXR0YWNobWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBoYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRIYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzKGJvb2xlYW4gYikgewotICAgICAgICBoYXNSZXNwb25zZVN3YVJlZkF0dGFjaG1lbnRzID0gYjsKLSAgICB9Ci0gICAgICAgICAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3bGluZSA9ICJcbiI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzYW1lbGluZSA9ICI7ICI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5hbWU6ICIgKyBnZXROYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJPcGVyYXRpb24gTmFtZTogIiArIGdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkFjdGlvbjogIiArIGdldEFjdGlvbigpKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiT3BlcmF0aW9uIGV4Y2x1ZGVkOiAiICsgKGlzRXhjbHVkZWQoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIklzIG9uZXdheTogIiArIChpc09uZVdheSgpID09IHRydWUpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgcmV0dXJuaW5nIHJlc3VsdDogIiArIChpc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpID09IHRydWUpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgcmVzdWx0IGhlYWRlcjogIiArIChpc1Jlc3VsdEhlYWRlcigpID09IHRydWUpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiSXMgSkFYV1MgQ2xpZW50IEFzeW5jIG1ldGhvZDogIiArIChpc0pBWFdTQXN5bmNDbGllbnRNZXRob2QoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNPQVAgU3R5bGU6ICIgKyBnZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJTT0FQIFVzZTogIiArIGdldFNvYXBCaW5kaW5nVXNlKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJTT0FQIFBhcmFtYXRlciBTdHlsZTogIiArIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlJlc3VsdCBuYW1lOiAiICsgZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUmVzdWx0IHBhcnQgbmFtZTogIiArIGdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChzYW1lbGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJSZXN1bHQgdHlwZTogIiArIGdldFJlc3VsdFR5cGUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlJlc3VsdCBhY3R1YWwgdHlwZTogIiArIGdldFJlc3VsdEFjdHVhbFR5cGUoKSk7Ci0gICAgICAgICAgICBpZiAoZ2V0UmVzdWx0QXR0YWNobWVudERlc2NyaXB0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChnZXRSZXN1bHRBdHRhY2htZW50RGVzY3JpcHRpb24oKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUmVxdWVzdCBXcmFwcGVyIGNsYXNzOiAiICsgZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlJlc3BvbnNlIFdyYXBwZXIgY2xhc3M6ICIgKyBnZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkphdmEgZGVjbGFyaW5nIGNsYXNzIG5hbWU6ICIgKyBnZXRKYXZhRGVjbGFyaW5nQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkphdmEgbWV0aG9kIG5hbWU6ICIgKyBnZXRKYXZhTWV0aG9kTmFtZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJKYXZhIHBhcmFtYXRlcnM6ICIgKyBnZXRKYXZhUGFyYW1ldGVycygpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJTZXJ2aWNlIEltcGxlbWVudGF0aW9uIG1ldGhvZDogIiArIGdldE1ldGhvZEZyb21TZXJ2aWNlSW1wbCgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJBeGlzIE9wZXJhdGlvbjogIiArIGdldEF4aXNPcGVyYXRpb24oKSk7Ci0KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtRGVzY3MgPSBnZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbURlc2NzICE9IG51bGwgJiYgcGFyYW1EZXNjcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTnVtYmVyIG9mIFBhcmFtZXRlciBEZXNjcmlwdGlvbnM6ICIgKyBwYXJhbURlc2NzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwYXJhbURlc2MgOiBwYXJhbURlc2NzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlBhcmFtZXRlciBEZXNjcmlwdGlvbjogIiArIHBhcmFtRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5vIFBhcmFtYXRlciBEZXNjcmlwdGlvbnMiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIEZhdWx0RGVzY3JpcHRpb25bXSBmYXVsdERlc2NzID0gZ2V0RmF1bHREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGlmIChmYXVsdERlc2NzICE9IG51bGwgJiYgZmF1bHREZXNjcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiTnVtYmVyIG9mIEZhdWx0IERlc2NyaXB0aW9uczogIiArIGZhdWx0RGVzY3MubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEZhdWx0RGVzY3JpcHRpb24gZmF1bHREZXNjIDogZmF1bHREZXNjcykgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJGYXVsdCBEZXNjcmlwdGlvbjogIiArIGZhdWx0RGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5vIEZhdWx0IERlc2NyaXB0aW9ucyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZighcGFydEF0dGFjaG1lbnRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOdW1iZXIgb2YgQXR0YWNobWVudCBEZXNjcmlwdGlvbnM6ICIgICsgcGFydEF0dGFjaG1lbnRNYXAuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEF0dGFjaG1lbnREZXNjcmlwdGlvbj4gYWRJdGVyID0gcGFydEF0dGFjaG1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZShhZEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGFkSXRlci5uZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJObyBBdHRhY2htZW50IERlc2NyaXB0aW9ucyIpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlJ1bnRpbWVEZXNjcmlwdGlvbnM6IiArIHRoaXMucnVudGltZURlc2NNYXAuc2l6ZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBmb3IgKE9wZXJhdGlvblJ1bnRpbWVEZXNjcmlwdGlvbiBydW50aW1lRGVzYyA6IHJ1bnRpbWVEZXNjTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChydW50aW1lRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkNvbXBsZXRlIGRlYnVnIGluZm9ybWF0aW9uIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbkRlc2NyaXB0aW9uIik7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICAvKiogCi0gICAgICogQWRkcyBhIGxpc3Qgb2YgU09BUCBoZWFkZXIgUU5hbWVzIHRoYXQgYXJlIHVuZGVyc3Rvb2QgYnkgSkFYV1MgZm9yIHRoaXMgb3BlcmF0aW9uIHRvIHRoZQotICAgICAqIEF4aXNPcGVyYXRpb24uICBUaGlzIHdpbGwgYmUgdXNlZCBieSBBeGlzMiB0byB2ZXJpZnkgdGhhdCBhbGwgaGVhZGVycyBtYXJrZWQgYXMKLSAgICAgKiBtdXN0VW5kZXJzdGFuZCBoYXZlIGJlZW4gb3Igd2lsbCBiZSBwcm9jZXNzZWQuCi0gICAgICogCi0gICAgICogU2VydmVyIHNpZGUgaGVhZGVycyBjb25zaWRlcmVkIHVuZGVyc3Rvb2QgW0pBWFdTIDIuMCBTZWMgMTAuMi4xIHBhZ2UgMTE3XQotICAgICAqIC0gU0VJIG1ldGhvZCBwYXJhbXMgdGhhdCBhcmUgaW4gaGVhZGVycyAKLSAgICAgKiAtIEhlYWRlcnMgcHJvY2Vzc2VkIGJ5IGFwcGxpY2F0aW9uIGhhbmRsZXJzIChUQkQpCi0gICAgICogCi0gICAgICogQ2xpZW50IHNpZGUgaGVhZGVycyBjb25zaWRlcmVkIHVuZGVyc3Rvb2Q6IE5vbmUKLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWdpc3Rlck11c3RVbmRlcnN0YW5kSGVhZGVycygpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIFJFVklFVzogSWYgY2xpZW50IHNpZGUgKHJldHVybiB2YWx1ZSwgT1VUIG9yIElOT1VUIHBhcmFtcykgbmVlZHMgdG8gYmUgc3VwcG9ydGVkIHRoZW4KLSAgICAgICAgLy8gdGhpcyBuZWVkcyB0byBwcm9jZXNzIGNsaWVudCBhbmQgc2VydmVyIGRpZmZlcmVudGx5LgotCi0gICAgICAgIEF4aXNPcGVyYXRpb24gdGhlQXhpc09wZXJhdGlvbiA9IGdldEF4aXNPcGVyYXRpb24oKTsgCi0gICAgICAgIGlmICh0aGVBeGlzT3BlcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVGhlIGF4aXMgb3BlcmF0aW9uIGlzIG51bGwsIHNvIGhlYWRlciBRTmFtZXMgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQuICBPcERlc2MgPSAiICsgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBhbnkgSU4gb3IgSU5PVVQgcGFyYW1ldGVycyBhcmUgaW4gdGhlIGhlYWRlciwgdGhlbiBhZGQgdGhlaXIgUU5hbWVzIHRvIHRoZSBsaXN0Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBhcmFtRGVzY3NbXSA9IGdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBBcnJheUxpc3QgdW5kZXJzdG9vZFFOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYgKHBhcmFtRGVzY3MgIT0gbnVsbCAmJiBwYXJhbURlc2NzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVzY3JpcHRpb24gcGFyYW1EZXNjIDogcGFyYW1EZXNjcykgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbURlc2MuaXNIZWFkZXIoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwYXJhbURlc2MuZ2V0TW9kZSgpID09IFdlYlBhcmFtLk1vZGUuSU4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtRGVzYy5nZXRNb2RlKCkgPT0gV2ViUGFyYW0uTW9kZS5JTk9VVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgUU5hbWUgaGVhZGVyUU4gPSBuZXcgUU5hbWUocGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVuZGVyc3Rvb2RRTmFtZXMuYWRkKGhlYWRlclFOKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk9wRGVzYzogdW5kZXJzdG9vZFFOYW1lIGFkZGVkIHRvIEF4aXNPcGVyYXRpb24gKGlmIG5vdCBudWxsKSAiICsgaGVhZGVyUU4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF1bmRlcnN0b29kUU5hbWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyIGhlYWRlclFOUGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihPcGVyYXRpb25EZXNjcmlwdGlvbi5IRUFERVJfUEFSQU1FVEVSX1FOQU1FUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZFFOYW1lcyk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoZUF4aXNPcGVyYXRpb24uYWRkUGFyYW1ldGVyKGhlYWRlclFOUGFyYW1ldGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oTWVzc2FnZXMuZ2V0TWVzc2FnZSgicmVnTVVIZWFkZXJzRXJyIix0aGVBeGlzT3BlcmF0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogR2V0IGFuIGFubm90YXRpb24uICBUaGlzIGlzIHdyYXBwZXJlZCB0byBhdm9pZCBhIEphdmEyU2VjdXJpdHkgdmlvbGF0aW9uLgotICAgICAqIEBwYXJhbSBjbHMgQ2xhc3MgdGhhdCBjb250YWlucyBhbm5vdGF0aW9uIAotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIENsYXNzIG9mIHJlcXVyZXN0ZWQgQW5ub3RhdGlvbgotICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBvciBudWxsCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgZmluYWwgQ2xhc3MgYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gKEFubm90YXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9QYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjIzMWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9QYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5BdHRhY2htZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5QYXJhbWV0ZXJEZXNjcmlwdGlvbldTREw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuQ29udmVydGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkdlbmVyaWNBcnJheVR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKLQotLyoqIEBzZWUgLi4vUGFyYW1ldGVyRGVzY3JpcHRpb24gKi8KLWNsYXNzIFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbAotICAgICAgICBpbXBsZW1lbnRzIFBhcmFtZXRlckRlc2NyaXB0aW9uLCBQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEsIFBhcmFtZXRlckRlc2NyaXB0aW9uV1NETCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBPcGVyYXRpb25EZXNjcmlwdGlvbiBwYXJlbnRPcGVyYXRpb25EZXNjcmlwdGlvbjsKLSAgICAvLyBUaGUgQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXIuICBOb3RlIHRoYXQgZm9yIGEgR2VuZXJpYywgaW5jbHVkaW5nIHRoZSBKQVgtV1MgSG9sZGVyPFQ+IEdlbmVyaWMsIAotICAgIC8vIHRoaXMgcmVwcmVzZW50cyB0aGUgcmF3IHR5cGUgb2YgdGhlIEdlbmVyaWMgKGUuZy4gTGlzdCBmb3IgTGlzdDxUPiBvciBIb2xkZXIgZm9yIEhvbGRlcjxUPikuCi0gICAgcHJpdmF0ZSBDbGFzcyBwYXJhbWV0ZXJUeXBlOwotICAgIC8vIEZvciB0aGUgSkFYLVdTIEdlbmVyaWMgSG9sZGVyPFQ+IChlLmcuIEhvbGRlcjxGb28+KSwgdGhpcyB3aWxsIGJlIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudCAoZS5nLiBGb28pLiAgRm9yIAotICAgIC8vIGFueSBvdGhlciBwYXJhbWV0ZXIgKGluY2x1ZGluZyBvdGhlciBHZW5lcmljcyksIHRoaXMgd2lsbCBiZSBudWxsLiAKLSAgICAvLyBOb3RlIHRoYXQgc2luY2UgSkFYLVdTIEhvbGRlcjxUPiBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGFjdHVhbCB0eXBlIFQgKG5vdCBtdWx0aXBsZSB0eXBlcyBzdWNoIGFzIDxLLFY+KQotICAgIHByaXZhdGUgQ2xhc3MgcGFyYW1ldGVySG9sZGVyQWN0dWFsVHlwZTsKLQotICAgIC8vIDAtYmFzZWQgbnVtYmVyIG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIGFyZ3VtZW50IGxpc3QKLSAgICBwcml2YXRlIGludCBwYXJhbWV0ZXJOdW1iZXIgPSAtMTsKLSAgICAvLyBUaGUgUGFyYW1ldGVyIERlc2NyaXB0aW9uIENvbXBvc2l0ZSB1c2VkIHRvIGJ1aWxkIHRoZSBQYXJhbWV0ZXJEZXNjcmlwdGlvbgotICAgIHByaXZhdGUgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGFyYW1EZXNjQ29tcG9zaXRlOwotCi0gICAgLy8gQU5OT1RBVElPTjogQFdlYk1ldGhvZAotICAgIHByaXZhdGUgV2ViUGFyYW0gd2ViUGFyYW1Bbm5vdGF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIHdlYlBhcmFtTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyB3ZWJQYXJhbVBhcnROYW1lOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZV9ERUZBVUxUID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd2ViUGFyYW1UYXJnZXROYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBXZWJQYXJhbS5Nb2RlIHdlYlBhcmFtTW9kZTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV2ViUGFyYW1fSGVhZGVyX0RFRkFVTFQgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHdlYlBhcmFtSGVhZGVyOwotICAgIAotICAgIC8vIEF0dGFjaG1lbnQgRGVzY3JpcHRpb24gaW5mb3JtYXRpb24KLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgX3NldEF0dGFjaG1lbnREZXNjID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBBdHRhY2htZW50RGVzY3JpcHRpb24gYXR0YWNobWVudERlc2MgPSBudWxsOwotICAgIAotICAgIC8vIFRoaXMgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlcmUgd2FzIGFuIEBYTUxMaXN0IG9uIHRoZSBwYXJhbWV0ZXIKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMaXN0VHlwZSA9IGZhbHNlOwotICAgIAotICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbChpbnQgcGFyYW1ldGVyTnVtYmVyLCBDbGFzcyBwYXJhbWV0ZXJUeXBlLCBUeXBlIHBhcmFtZXRlckdlbmVyaWNUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gcGFyYW1ldGVyQW5ub3RhdGlvbnMsIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmFtZXRlck51bWJlciA9IHBhcmFtZXRlck51bWJlcjsKLSAgICAgICAgdGhpcy5wYXJlbnRPcGVyYXRpb25EZXNjcmlwdGlvbiA9IHBhcmVudDsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZTsKLQotICAgICAgICAvLyBUaGUgVHlwZSBhcmd1bWVudCBjb3VsZCBiZSBhIFR5cGUgKGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBQYXJhbWF0ZXJpemVkIEdlbmVyaWMpIG9yCi0gICAgICAgIC8vIGp1c3QgYSBDbGFzcyAoaWYgaXQgaXMgbm90KS4gIElmIGl0IEpBWC1XUyBIb2xkZXI8VD4gcGFyYW1ldGVyaXplZCB0eXBlLCB0aGVuIGdldCB0aGUgCi0gICAgICAgIC8vIGFjdHVhbCBwYXJhbWV0ZXIgdHlwZSBhbmQgaGFuZyBvbiB0byB0aGF0LCB0b28uCi0gICAgICAgIGlmIChQYXJhbWV0ZXJpemVkVHlwZS5jbGFzcy5pc0luc3RhbmNlKHBhcmFtZXRlckdlbmVyaWNUeXBlKSkgewotICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJIb2xkZXJBY3R1YWxUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0R2VuZXJpY1BhcmFtZXRlckFjdHVhbFR5cGUoKFBhcmFtZXRlcml6ZWRUeXBlKXBhcmFtZXRlckdlbmVyaWNUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5kV2ViUGFyYW1Bbm5vdGF0aW9uKHBhcmFtZXRlckFubm90YXRpb25zKTsKLSAgICAgICAgdGhpcy5pc0xpc3RUeXBlID0gQ29udmVydGVyVXRpbHMuaGFzWG1sTGlzdEFubm90YXRpb24ocGFyYW1ldGVyQW5ub3RhdGlvbnMpOwotICAgIH0KLQotICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbChpbnQgcGFyYW1ldGVyTnVtYmVyLCBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHBhcmVudCkgewotICAgICAgICB0aGlzLnBhcmFtRGVzY0NvbXBvc2l0ZSA9IHBkYzsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJOdW1iZXIgPSBwYXJhbWV0ZXJOdW1iZXI7Ci0gICAgICAgIHRoaXMucGFyZW50T3BlcmF0aW9uRGVzY3JpcHRpb24gPSBwYXJlbnQ7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3RhdGlvbiA9IHBkYy5nZXRXZWJQYXJhbUFubm90KCk7Ci0gICAgICAgIHRoaXMuaXNMaXN0VHlwZSA9IHBkYy5pc0xpc3RUeXBlKCk7Ci0KLSAgICAgICAgLy9UT0RPOiBOZWVkIHRvIGJ1aWxkIHRoZSBzY2hlbWEgbWFwLiBOZWVkIHRvIGFkZCBsb2dpYyB0byBhZGQgdGhpcyBwYXJhbWV0ZXIKLSAgICAgICAgLy8gICAgICB0byB0aGUgc2NoZW1hIG1hcC4KLQotICAgIH0KLQotICAgIC8qCi0gICAgKiBUaGlzIGdyYWJzIHRoZSBXZWJQYXJhbSBhbm5vdGF0aW9uIGZyb20gdGhlIGxpc3Qgb2YgYW5ub3RhdGlvbnMgZm9yIHRoaXMgcGFyYW1ldGVyCi0gICAgKiBUaGlzIHNob3VsZCBiZSBERVBSRUNBVEVEIG9uY2UgREJDIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCi0gICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZmluZFdlYlBhcmFtQW5ub3RhdGlvbihBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGNoZWNrQW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgbWF5IG5vdCB3b3JrIHdpdGggdGhlIE1EUUlucHV0LiAgRnJvbSB0aGUgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiBpbnRlcmZhY2UKLSAgICAgICAgICAgIC8vICAgICAgICAgamF2YWRvYzogIk5vdGUgdGhhdCBhbiBpbnRlcmZhY2UgdGhhdCBtYW51YWxseSBleHRlbmRzIHRoaXMgb25lIGRvZXMgbm90IGRlZmluZSBhbiBhbm5vdGF0aW9uIHR5cGUuIgotICAgICAgICAgICAgaWYgKGNoZWNrQW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpID09IFdlYlBhcmFtLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgd2ViUGFyYW1Bbm5vdGF0aW9uID0gKFdlYlBhcmFtKWNoZWNrQW5ub3RhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT3BlcmF0aW9uRGVzY3JpcHRpb24gZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRPcGVyYXRpb25EZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcmFtZXRlci4gIE5vdGUgdGhhdCBmb3IgdGhlIEpBWC1XUyBIb2xkZXI8VD4gdHlwZSwKLSAgICAgKiB5b3UgY2FuIHVzZSBnZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkgdG8gZ2V0IHRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UGFyYW1ldGVyVHlwZSgpIHsKLSAgICAgICAgaWYgKHBhcmFtZXRlclR5cGUgPT0gbnVsbCAmJiBwYXJhbURlc2NDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcGFyYW1ldGVyVHlwZSA9IHBhcmFtRGVzY0NvbXBvc2l0ZS5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyYW1ldGVyVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgYSBub24tSG9sZGVyIHR5cGUsIHJldHVybnMgdGhlIHBhcmFtZXRlciBjbGFzcy4gIEZvciBhIEhvbGRlcjxUPiB0eXBlLCByZXR1cm5zIHRoZSBjbGFzcwotICAgICAqIG9mIFQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIENsYXNzIGdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSB7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXJIb2xkZXJBY3R1YWxUeXBlID09IG51bGwgJiYgcGFyYW1EZXNjQ29tcG9zaXRlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBwYXJhbURlc2NDb21wb3NpdGUuaXNIb2xkZXJUeXBlKCkpIHsKLSAgICAgICAgICAgIHBhcmFtZXRlckhvbGRlckFjdHVhbFR5cGUgPSBwYXJhbURlc2NDb21wb3NpdGUuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCk7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVySG9sZGVyQWN0dWFsVHlwZTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJIb2xkZXJBY3R1YWxUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJIb2xkZXJBY3R1YWxUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHBhcmFtRGVzY0NvbXBvc2l0ZSAhPSBudWxsICYmIHBhcmFtZXRlclR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUgPSBwYXJhbURlc2NDb21wb3NpdGUuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyVHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRFTVBPUkFSWSBNRVRIT0QhICBGb3IgYSBKQVgtV1MgSG9sZGVyPFQ+IHRoaXMgcmV0dXJucyB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIDxUPi4gRm9yIGEKLSAgICAgKiBIb2xkZXI8R2VuZXJpYzwuLi4+PiwgaXQgcmV0dXJucyB0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIEdlbmVyaWMuICBJZiB0aGUgdHlwZSBpcyBub3QgYQotICAgICAqIEpBWC1XUyBIb2xkZXIsIHJldHVybiBhIG51bGwuCi0gICAgICogPHAvPgotICAgICAqIFRoaXMgbWV0aG9kIFNIT1VMRCBCRSBSRU1PVkVEIHdoZW4gdGhlIGRlc2NyaXB0aW9uIGxheWVyIGlzIHJlZmFjdG9yZWQgdG8gdXNlIG9ubHkgREJDIGFuZAotICAgICAqIG5vdCBKYXZhIHJlZmxlY3Rpb24gZGlyZWN0bHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyR2VuZXJpY1R5cGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgbWV0aG9kIHdoZW4gY29kZSByZWZhY3RvcmVkIHRvIG9ubHkgdXNlIERCQy4KLSAgICBwcml2YXRlIENsYXNzIGdldEdlbmVyaWNQYXJhbWV0ZXJBY3R1YWxUeXBlKFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlckdlbmVyaWNUeXBlKSB7Ci0gICAgICAgIENsYXNzIHJldHVybkNsYXNzID0gbnVsbDsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIEpBWC1XUyBIb2xkZXIgdHlwZSwgdGhlbiBnZXQgdGhlIGFjdHVhbCB0eXBlLiAgTm90ZSB0aGF0IHdlIGNhbid0IHVzZSB0aGUKLSAgICAgICAgLy8gaXNIb2xkZXJUeXBlIG1ldGhvZCB5ZXQgYmVjYXVzZSB0aGUgY2xhc3MgdmFyaWFibGUgaXQgaXMgZ29pbmcgdG8gY2hlY2sgKHBhcmFtZXRlckhvbGRlckFjdHVhbFR5cGUpCi0gICAgICAgIC8vIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldC4KLSAgICAgICAgaWYgKHBhcmFtZXRlckdlbmVyaWNUeXBlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJHZW5lcmljVHlwZS5nZXRSYXdUeXBlKCkgPT0gamF2YXgueG1sLndzLkhvbGRlci5jbGFzcykgewotICAgICAgICAgICAgLy8gTk9URQotICAgICAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNvZGUsIHBsZWFzZSByZW1lbWJlciB0byBjaGFuZ2UgCi0gICAgICAgICAgICAvLyBPcGVyYXRpb25EZXNjLmdldFJlc3VsdEFjdHVhbFR5cGUKLQotICAgICAgICAgICAgVHlwZSB0eXBlID0gcGFyYW1ldGVyR2VuZXJpY1R5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiBQYXJhbWV0ZXJpemVkVHlwZS5jbGFzcy5pc0luc3RhbmNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIHR5cGVzIG9mIEhvbGRlcjxHZW5lcmljPEssVj4+LCByZXR1cm4gY2xhc3MgYXNzb2NpYXRlZCB3aXRoIEdlbmVyaWMKLSAgICAgICAgICAgICAgICByZXR1cm5DbGFzcyA9IChDbGFzcykoKFBhcmFtZXRlcml6ZWRUeXBlKXR5cGUpLmdldFJhd1R5cGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsICYmIEdlbmVyaWNBcnJheVR5cGUuY2xhc3MuaXNJbnN0YW5jZSh0eXBlKSkgewotICAgICAgICAgICAgICAgIFR5cGUgY29tcG9uZW50VHlwZSA9ICgoR2VuZXJpY0FycmF5VHlwZSl0eXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgICAgIENsYXNzIGFycmF5Q2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChQYXJhbWV0ZXJpemVkVHlwZS5jbGFzcy5pc0luc3RhbmNlKGNvbXBvbmVudFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvciB0eXBlcyBvZiBIb2xkZXI8R2VuZXJpYzxLLFY+W10+LCByZXR1cm4gY2xhc3MgYXNzb2NpYXRlZCB3aXRoIEdlbmVyaWNbXQotICAgICAgICAgICAgICAgICAgICBhcnJheUNsYXNzID0gKENsYXNzKSgoUGFyYW1ldGVyaXplZFR5cGUpY29tcG9uZW50VHlwZSkuZ2V0UmF3VHlwZSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZvciB0eXBlcyBvZiBIb2xkZXI8T2JqZWN0W10+LCByZXR1cm4gY2xhc3MgYXNzb2NpYXRlZCB3aXRoIE9iamVjdFtdCi0gICAgICAgICAgICAgICAgICAgIGFycmF5Q2xhc3MgPSAoQ2xhc3MpY29tcG9uZW50VHlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gUkVWSUVXOiBUaGlzIG9ubHkgd29ya3MgZm9yIGEgc2luZ2xlIGRpbWVuc2lvbiBhcnJheSEgIE5vdGUgdGhhdCBpZiB0aGlzIG1ldGhvZCBpcyByZW1vdmVkCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICB3aGVuIERCQyBpcyB1c2VkLCBqdXN0IG1ha2Ugc3VyZSBEQkMgc3VwcG9ydHMgbXVsdGktZGltIGFycmF5cwotICAgICAgICAgICAgICAgIHJldHVybkNsYXNzID0gQXJyYXkubmV3SW5zdGFuY2UoYXJyYXlDbGFzcywgMCkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yIHR5cGVzIG9mIEhvbGRlcjxPYmplY3Q+LCByZXR1cm4gdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCBPYmplY3QKLSAgICAgICAgICAgICAgICByZXR1cm5DbGFzcyA9IChDbGFzcyl0eXBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkNsYXNzOwotICAgIH0KLQotICAgIC8qKiBBbnN3ZXIgd2hldGhlciB0aGlzIFBhcmFtZXRlckRlc2NyaXB0aW9uIHJlcHJlc2VudHMgYSBKQVgtV1MgSG9sZGVyPFQ+IHR5cGUuICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNIb2xkZXJUeXBlKCkgewotICAgICAgICAvLyBJZiB0aGlzIGlzIGEgSkFYLVdTIEhvbGRlcjxUPiB0eXBlLCB0aGVuIHdlIHNldCB0aGUgdGhlIGNsYXNzIG9mIHRoZSBhY3R1YWwKLSAgICAgICAgLy8gcGFyYW1ldGVyIDxUPiBpbiB0aGUgY29uc3RydWN0b3IuICBPdGhlcndpc2UsIHRoYXQgaXMgbnVsbC4KLSAgICAgICAgLy8gSG9sZGVyIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IEpTUi0yMjQgSkFYLVdTIDIuMCwgU2VjIDIuMy4zLCBwZyAxNgotICAgICAgICBpZiAocGFyYW1EZXNjQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbURlc2NDb21wb3NpdGUuaXNIb2xkZXJUeXBlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gSG9sZGVyLmNsYXNzLmVxdWFscyhnZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEFOTk9UQVRJT046IFdlYlBhcmFtCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIHB1YmxpYyBXZWJQYXJhbSBnZXRBbm5vV2ViUGFyYW0oKSB7Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbUFubm90YXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlBhcmFtTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlBhcmFtTmFtZSgpIHsKLSAgICAgICAgaWYgKHdlYlBhcmFtTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlBhcmFtKCkgIT0gbnVsbCAmJiAhRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGdldEFubm9XZWJQYXJhbSgpLm5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbU5hbWUgPSBnZXRBbm5vV2ViUGFyYW0oKS5uYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpID09IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5UCi0gICAgICAgICAgICAgICAgICAgICYmIGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpID09Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWwgcGVyIEpTUi0xODEgTVIgU2VjIDQuNC4xLCBwZyAxOQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRpb246IEZvciBCQVJFIHBhcmFtYXRlclVzZSwgb25seSBhIHNpbmdsZSBJTiBvdXIgSU5PVVQgcGFyYW1hdGVyIGFuZCBhIHNpbmdsZSBvdXRwdXQgKGVpdGhlciByZXR1cm4gb3IgT1VUIG9yIElOT1VUKSBpcyBhbGxvd2VkCi0gICAgICAgICAgICAgICAgLy8gICAgICAgUGVyIEpTUi0yMjQsIFNlYyAzLjYuMi4yLCBwZyAzNwotICAgICAgICAgICAgICAgIHdlYlBhcmFtTmFtZSA9IGdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkuZ2V0T3BlcmF0aW9uTmFtZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHBlciBKU1ItMTgxIE1SIFNlYyA0LjQuMSwgcGcgMjAKLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gImFyZ04iIHdoZXJlIE4gaXMgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbU5hbWUgPSAiYXJnIiArIHBhcmFtZXRlck51bWJlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUGFyYW1OYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUGFyYW1QYXJ0TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlBhcmFtUGFydE5hbWUoKSB7Ci0gICAgICAgIGlmICh3ZWJQYXJhbVBhcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChnZXRBbm5vV2ViUGFyYW0oKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZ2V0QW5ub1dlYlBhcmFtKCkucGFydE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbVBhcnROYW1lID0gZ2V0QW5ub1dlYlBhcmFtKCkucGFydE5hbWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBwZXIgSlNSLTE4MSBNUiBTZWMgNC40LjEsIHBnIDIwCi0gICAgICAgICAgICAgICAgd2ViUGFyYW1QYXJ0TmFtZSA9IGdldEFubm9XZWJQYXJhbU5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUGFyYW1QYXJ0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldEFubm9XZWJQYXJhbVRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub1dlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBpZiAod2ViUGFyYW1UYXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJQYXJhbSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShnZXRBbm5vV2ViUGFyYW0oKS50YXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbVRhcmdldE5hbWVzcGFjZSA9IGdldEFubm9XZWJQYXJhbSgpLnRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nU3R5bGUoKSA9PSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVAotICAgICAgICAgICAgICAgICAgICAmJiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbigpLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSA9PQotICAgICAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVECi0gICAgICAgICAgICAgICAgICAgICYmICFnZXRBbm5vV2ViUGFyYW1IZWFkZXIoKSkgewotICAgICAgICAgICAgICAgIC8vIERlZmF1bCBwZXIgSlNSLTE4MSBNUiBTZWMgNC40LjEsIHBnIDIwCi0gICAgICAgICAgICAgICAgd2ViUGFyYW1UYXJnZXROYW1lc3BhY2UgPSBXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2VfREVGQVVMVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBwZXIgSlNSLTE4MSBNUiBTZWMgNC40LjEsIHBnIDIwCi0gICAgICAgICAgICAgICAgd2ViUGFyYW1UYXJnZXROYW1lc3BhY2UgPSAoKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKWdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtVGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotLy8gICAgcHVibGljIE1vZGUgZ2V0TW9kZSgpIHsKLQotICAgIHB1YmxpYyBXZWJQYXJhbS5Nb2RlIGdldE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vV2ViUGFyYW1Nb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYlBhcmFtLk1vZGUgZ2V0QW5ub1dlYlBhcmFtTW9kZSgpIHsKLSAgICAgICAgaWYgKHdlYlBhcmFtTW9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJbnRlcmVzdGluZyBjb251bmRydW0gaGVyZToKLSAgICAgICAgICAgIC8vIEJlY2F1c2UgV2ViUGFyYW0ubW9kZSBoYXMgYSBkZWZhdWx0IHZhbHVlLCBpdCB3aWxsIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nIGlmIHRoZQotICAgICAgICAgICAgLy8gYW5ub3RhdGlvbiBpcyBwcmVzZW50LiAgVGhhdCB2YWx1ZSBpcyBjdXJyZW50bHkgTW9kZS5JTi4gIEhvd2V2ZXIsIHRoYXQgZGVmYXVsdCBpcyBvbmx5Ci0gICAgICAgICAgICAvLyBjb3JyZWN0IGZvciBhIG5vbi1Ib2xkZXIgVHlwZTsgdGhlIGNvcnJlY3QgZGVmYXVsdCBmb3IgYSBIb2xkZXIgVHlwZSBpcyBNb2RlLklOT1VULiAgRnVydGhlcm1vcmUsCi0gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIHdheSAoSSBjYW4gdGVsbCkgdG8gZGlmZmVyZW50aWF0ZSBpZiB0aGUgc2V0dGluZyBmb3IgbW9kZSgpIHdhcyBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLAotICAgICAgICAgICAgLy8gc28gdGhlcmUncyBubyB3YXkgdG8gdGVsbCBpZiB0aGUgdmFsdWUgaXMgZGVmYXVsdGVkIHRvIElOIG9yIGV4cGxpY2l0bHkgc3BlY2lmaWVkIElOIGJ5IHRoZSBhbm5vdGF0aW9uLgotICAgICAgICAgICAgLy8gVGhlIGNvbnVuZHJ1bSBpczogRG8gd2UgcmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSBhbm5vdGF0aW9uLCBvciBkbyB3ZSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgYmFzZWQgb24gdGhlCi0gICAgICAgICAgICAvLyB0eXBlLiAgRm9yIG5vdywgZm9yIGEgSG9sZGVyIHR5cGUgdGhhdCBoYXMgYSB2YWx1ZSBvZiBJTiwgd2UgcmVzZXQgdGhlIHZhbHVlIHRvIElOT1VULgotICAgICAgICAgICAgLy8gVGhhdCBtZWFucyBldmVuIGlmIFdlYlBhcmFtLm1vZGU9SU4gd2FzIGV4cGxpY2l0bHkgc2V0LCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4gdG8gSU5PVVQuCi0gICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGZyb20gSlNSLTE4MSBNUiBTZWMgNC40LjEsIHBnIDIwCi0KLSAgICAgICAgICAgIC8vIFVubGlrZSBhIFN0cmluZyB2YWx1ZSwgaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudCwgaXQgd2lsbCByZXR1cm4gYSB1c2FibGUgZGVmYXVsdCB2YWx1ZSBhcyBkZWZpbmVkIGJ5IAotICAgICAgICAgICAgLy8gdGhlIEFubm90YXRpb24uICBUaGF0IGlzIGN1cnJlbnRseSBNb2RlLklOCi0gICAgICAgICAgICBpZiAoZ2V0QW5ub1dlYlBhcmFtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdlYlBhcmFtTW9kZSA9IGdldEFubm9XZWJQYXJhbSgpLm1vZGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgd2ViUGFyYW1Nb2RlID0gV2ViUGFyYW0uTW9kZS5JTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzSG9sZGVyVHlwZSgpICYmIHdlYlBhcmFtTW9kZSA9PSBXZWJQYXJhbS5Nb2RlLklOKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBwZXIgSlNSLTE4MSBNUiBTZWMgNC40LjEsIHBnIDIwCi0gICAgICAgICAgICAgICAgd2ViUGFyYW1Nb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViUGFyYW1Nb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSGVhZGVyKCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub1dlYlBhcmFtSGVhZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0QW5ub1dlYlBhcmFtSGVhZGVyKCkgewotICAgICAgICBpZiAod2ViUGFyYW1IZWFkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVW5saWtlIGEgU3RyaW5nIHZhbHVlLCBpZiB0aGUgYW5ub3RhdGlvbiBpcyBwcmVzZW50LCBpdCB3aWxsIHJldHVybiBhIHVzYWJsZSBkZWZhdWx0IHZhbHVlLgotICAgICAgICAgICAgaWYgKGdldEFubm9XZWJQYXJhbSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbUhlYWRlciA9IGdldEFubm9XZWJQYXJhbSgpLmhlYWRlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3ZWJQYXJhbUhlYWRlciA9IFdlYlBhcmFtX0hlYWRlcl9ERUZBVUxUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJQYXJhbUhlYWRlci5ib29sZWFuVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgbmV3bGluZSA9ICJcbiI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzYW1lbGluZSA9ICI7ICI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk5hbWU6ICIgKyBnZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJJcyBoZWFkZXI6ICIgKyAoaXNIZWFkZXIoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIklzIGhvbGRlcjogIiArIChpc0hvbGRlclR5cGUoKSA9PSB0cnVlKSk7Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk1vZGU6ICIgKyBnZXRNb2RlKCkpOwotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJUeXBlOiAiICsgZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoc2FtZWxpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQWN0dWFsIHR5cGU6ICIgKyBnZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICAgICAgaWYgKGdldEF0dGFjaG1lbnREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoZ2V0QXR0YWNobWVudERlc2NyaXB0aW9uKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiQ29tcGxldGUgZGVidWcgaW5mb3JtYXRpb24gbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyRGVzY3JpcHRpb24iKTsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMaXN0VHlwZSgpIHsKLSAgICAJcmV0dXJuIGlzTGlzdFR5cGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRvIHBhcmVudCBpbXBsIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbCBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoKSB7Ci0gICAgICAgIGlmKHRoaXMuZ2V0T3BlcmF0aW9uRGVzY3JpcHRpb24oKSBpbnN0YW5jZW9mIE9wZXJhdGlvbkRlc2NyaXB0aW9uSW1wbCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoT3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsKSB0aGlzLmdldE9wZXJhdGlvbkRlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBiYXNlZCBvbiB0aGUgcGFydCBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgcHVibGljIEF0dGFjaG1lbnREZXNjcmlwdGlvbiBnZXRBdHRhY2htZW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHRoaXMuZ2V0UGFydE5hbWUoKTsKLSAgICAgICAgaWYocGFydE5hbWUgIT0gbnVsbCAmJiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0dXJuaW5nIHBhcmFtZXRlciBBdHRhY2htZW50RGVzY3JpcHRpb24gZm9yIHBhcnROYW1lOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpb25EZXNjcmlwdGlvbkltcGwoKS5nZXRQYXJ0QXR0YWNobWVudERlc2NyaXB0aW9uKHBhcnROYW1lKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBwYXJhbWV0ZXIgQXR0YWNobWVudERlc2NyaXB0aW9uIGZvciBwYXJ0TmFtZTogIiArIHBhcnROYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1BvcnRJbmZvSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9Qb3J0SW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MjA3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1BvcnRJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5Qb3J0SW5mbzsKLQotcHVibGljIGNsYXNzIFBvcnRJbmZvSW1wbCBpbXBsZW1lbnRzIFBvcnRJbmZvIHsKLSAgICBwcml2YXRlIFFOYW1lIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFFOYW1lIHBvcnROYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBiaW5kaW5nSWQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lCi0gICAgICogQHBhcmFtIHBvcnROYW1lCi0gICAgICogQHBhcmFtIGJpbmRpbmdJZAotICAgICAqLwotICAgIFBvcnRJbmZvSW1wbChRTmFtZSBzZXJ2aWNlTmFtZSwgUU5hbWUgcG9ydE5hbWUsIFN0cmluZyBiaW5kaW5nSWQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBvcnRJbmZvRXJyMCIsICI8bnVsbD4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInBvcnRJbmZvRXJyMSIsICI8bnVsbD4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRpbmdJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJwb3J0SW5mb0VycjIiLCAiPG51bGw+IikpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZSA9IHBvcnROYW1lOwotICAgICAgICB0aGlzLmJpbmRpbmdJZCA9IGJpbmRpbmdJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJpbmRpbmdJRCgpIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdJZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1Jlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbkltcGwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2EyZGVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiAgICAgIA0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLS8qKg0KLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24gaW50ZXJmYWNlIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uIHsNCi0gICAgcHJpdmF0ZSBMaXN0PENsYXNzPiBoYW5kbGVyQ2xhc3NlczsNCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcm9sZXM7IA0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24jYWRkSGFuZGxlckNsYXNzKGphdmEubGFuZy5DbGFzcykNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDbGFzc2VzKExpc3Q8Q2xhc3M+IGhhbmRsZXJDbGFzc2VzKSB7DQotICAgICAgICB0aGlzLmhhbmRsZXJDbGFzc2VzID0gaGFuZGxlckNsYXNzZXM7DQotICAgIH0NCi0NCi0gICAgLyogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uI2FkZFJvbGUoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFJvbGVzKExpc3Q8U3RyaW5nPiByb2xlcykgew0KLSAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOw0KLSAgICB9DQotDQotICAgIC8qIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiNnZXRIYW5kbGVyQ2xhc3NlcygpDQotICAgICAqLw0KLSAgICBwdWJsaWMgTGlzdDxDbGFzcz4gZ2V0SGFuZGxlckNsYXNzZXMoKSB7DQotICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyQ2xhc3NlczsNCi0gICAgfQ0KLQ0KLSAgICAvKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24jZ2V0Um9sZXMoKQ0KLSAgICAgKi8NCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSb2xlcygpIHsNCi0gICAgICAgIHJldHVybiB0aGlzLnJvbGVzOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvU2VydmljZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYmViM2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuSkFYV1NDYXRhbG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuaW1wbC5PQVNJU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5SZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25KYXZhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5Qb3J0Q29tcG9zaXRlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHMuUkVUVVJOX1RZUEVfRlVUVVJFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzLlJFVFVSTl9UWVBFX1JFU1BPTlNFOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTREw0SldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTRExXcmFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2c7Ci0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLlBvcnRJbmZvOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotCi0vKiogQHNlZSAuLi9TZXJ2aWNlRGVzY3JpcHRpb24gKi8KLWNsYXNzIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwKLSAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlRGVzY3JpcHRpb24sIFNlcnZpY2VEZXNjcmlwdGlvbldTREwsIFNlcnZpY2VEZXNjcmlwdGlvbkphdmEgewotICAgIHByaXZhdGUgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgY2xpZW50Q29uZmlnRmFjdG9yeTsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0KLSAgICAvLyBOdW1iZXIgb2YgdGltZXMgdGhpcyBpbnN0YW5jZSBpcyBiZWluZyB1c2VkLiAgRm9yIHNlcnZpY2UtcHJvdmlkZXJzLCB0aGlzIGlzIG5vdCBkZWNyZW1lbnRlZAotICAgIC8vIHNpbmNlIHRoZSBzZXJpY2UgaXNuJ3QgdW4tdXNlZCBvbmNlIGl0IGlzIGNyZWF0ZWQuICBGb3Igc2VydmljZS1yZXF1ZXN0ZXJzLCB0aGUgc2VydmljZQotICAgIC8vIGlzIHVzZWQgYnkgU2VydmljZURlbGVnYXRlcywgYW5kIGJlY29tZXMgdW4tdXNlZCB3aGVuIHRoZSBTZXJ2aWNlRGVsZWdhdGUgaXMgcmVsZWFzZWQuCi0gICAgcHJpdmF0ZSBpbnQgdXNlQ291bnQgPSAwOwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxVUkw7Ci0gICAgcHJpdmF0ZSBRTmFtZSBzZXJ2aWNlUU5hbWU7Ci0KLSAgICBwcml2YXRlIFdTRExXcmFwcGVyIHdzZGxXcmFwcGVyOwotICAgIHByaXZhdGUgV1NETFdyYXBwZXIgZ2VuZXJhdGVkV3NkbFdyYXBwZXI7Ci0gICAgCi0gICAgLy9BTk5PVEFUSU9OOiBASGFuZGxlckNoYWluCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW4gaGFuZGxlckNoYWluQW5ub3RhdGlvbjsKLSAgICBwcml2YXRlIEhhbmRsZXJDaGFpbnNUeXBlIGhhbmRsZXJDaGFpbnNUeXBlOwotCi0gICAgLy8gRW5kcG9pbnREZXNjcmlwdGlvbnMgZnJvbSBhbm5vdGF0aW9ucyBhbmQgd3NkbAotICAgIHByaXZhdGUgTWFwPFFOYW1lLCBFbmRwb2ludERlc2NyaXB0aW9uPiBkZWZpbmVkRW5kcG9pbnREZXNjcmlwdGlvbnMgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFFOYW1lLCBFbmRwb2ludERlc2NyaXB0aW9uPigpOwotCi0gICAgLy8gRW5kcG9pbnRzIGZvciBkeW5hbWljIHBvcnRzCi0gICAgLy8gVGhpcyBuZWVkcyB0byBiZSBhIHN0cm9uZyByZWZlcmVuY2UgKG5vdCBXZWFrIG9yIFNvZnQpIHNvIHRoYXQgdGhlIHJlc291cmNlIHJlbGVhc2UgbG9naWMKLSAgICAvLyBpbiB0aGUgZmluYWxpemVyIHN0aWxsIGhhcyBhIHJlZmVyZW5jZSB0byB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbnMgc28gdGhleSBjYW4gYmUKLSAgICAvLyByZWxlYXNlZC4gIE90aGVyd2lzZSwgdGhpcyBjb2xsZWN0aW9uIHdpbGwgYmUgbnVsbCB3aGVuIHRoZSBmaW5hbGl6ZXIgaXMgY2FsbGVkLgotICAgIHByaXZhdGUgTWFwPE9iamVjdCwgTWFwPFFOYW1lLCBFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4+IGR5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9ucyA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8T2JqZWN0LCBNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPj4oKTsKLQotICAgIC8vIENhY2hlIGNsYXNzZXMgZm9yIHRoZSBpbmZvIGZvciByZXNvbHZlZCBoYW5kbGVycwotICAgIHByaXZhdGUgU29mdFJlZmVyZW5jZTxNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4+IHJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICBuZXcgU29mdFJlZmVyZW5jZTxNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4+Ci0gICAgICAgIChuZXcgQ29uY3VycmVudEhhc2hNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4oKSk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlID0gZmFsc2U7Ci0KLSAgICAvLyBBbGxvdyBhIHVuaXF1ZSBYTUwgQ2F0YWxvZ01hbmFnZXIgcGVyIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAgcHJpdmF0ZSBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbnVsbDsKLSAgICAKLSAgICAvLyBSVU5USU1FIElORk9STUFUSU9OCi0gICAgTWFwPFN0cmluZywgU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbj4gcnVudGltZURlc2NNYXAgPQotICAgICAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbj4oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYV1NfRFlOQU1JQ19FTkRQT0lOVFMgPSAiamF4d3MuZHluYW1pYy5lbmRwb2ludHMiOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2VydmljZS1yZXF1ZXN0ZXIgc2lkZSAoYWthIGNsaWVudC1zaWRlKSBzZXJ2aWNlIGRlc2NyaXB0aW9uLgotICAgICAqIENvbnN0cnVjdCBhIHNlcnZpY2UgZGVzY3JpcHRpb24gaGllcmFjaHkKLSAgICAgKiBiYXNlZCBvbiBXU0RMIChtYXkgYmUgbnVsbCksIHRoZSBTZXJ2aWNlIGNsYXNzLCBhbmQgYSBzZXJ2aWNlIFFOYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHdzZGxVUkwgICAgICBUaGUgV1NETCBmaWxlICh0aGlzIG1heSBiZSBudWxsKS4KLSAgICAgKiBAcGFyYW0gc2VydmljZVFOYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGluIHRoZSBXU0RMLiAgVGhpcyBjYW4gbm90IGJlIG51bGwgc2luY2UgYQotICAgICAqICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLndzLlNlcnZpY2UgY2FuIG5vdCBiZSBjcmVhdGVkIHdpdGggYSBudWxsIHNlcnZpY2UgUU5hbWUuCi0gICAgICogQHBhcmFtIHNlcnZpY2VDbGFzcyBUaGUgSkFYLVdTIHNlcnZpY2UgY2xhc3MuICBUaGlzIGNvdWxkIGJlIGFuIGluc3RhbmNlIG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuU2VydmljZSBvciBhIGdlbmVyYXRlZCBzZXJ2aWNlIHN1YmNsYXNzIHRoZXJlb2YuICBUaGlzIHdpbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoVVJMIHdzZGxVUkwsIFFOYW1lIHNlcnZpY2VRTmFtZSwgQ2xhc3Mgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMod3NkbFVSTCwgc2VydmljZVFOYW1lLCBzZXJ2aWNlQ2xhc3MsIG51bGwsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZXJ2aWNlLXJlcXVlc3RlciBzaWRlIHNlcnZpY2UgZGVzY3JpcHRpb24uICBTYW1lIGFzIGNvbnN0cnVjdG9yIGFib3ZlIHdpdGggYW4gCi0gICAgICogYWRkaXRvbmFsIGNvbXBvc2l0ZSBwYXJhbWF0ZXIuICBOb3RlIHRoYXQgdGhlIGNvbXBvc2l0ZSBpcyAic3BhcnNlIiBpbiB0aGF0IGFueSB2YWx1ZXMgaXQKLSAgICAgKiBjb250YWlucyBvdmVycmlkZXMgYW55IHZhbHVlcyBvbiB0aGUgY29ycmVzcG9uZGluZyBjbGFzcyBhbm5vdGF0aW9uIEhPV0VWRVIgaWYgdGhlIGNvbXBvc2l0ZQotICAgICAqIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbHVlLCBpdCBpcyBnb3R0ZW4gZnJvbSB0aGUgY2xhc3MgYW5ub3RhdGlvbi4gCi0gICAgICogQHBhcmFtIHdzZGxVUkwKLSAgICAgKiBAcGFyYW0gc2VydmljZVFOYW1lCi0gICAgICogQHBhcmFtIHNlcnZpY2VDbGFzcwotICAgICAqIEBwYXJhbSBzcGFyc2VDb21wb3NpdGUgYSBjb21wb3NpdGUgd2l0aCBhbnkgYW5ub3RhdGlvbiBvdmVycmlkZXMgc3VjaCBhcyBmcm9tIGEgY2xpZW50IGRlcGxveW1lbnQKLSAgICAgKiAgICAgZGVzY3JpcHRvci4gIENBTiBOT1QgQkUgTlVMTCwgYnV0IGl0IGNhbiBiZSBhbiBvYmplY3QgY3JlYXRlZCB3aXRoIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoVVJMIHdzZGxVUkwsIFFOYW1lIHNlcnZpY2VRTmFtZSwgQ2xhc3Mgc2VydmljZUNsYXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc3BhcnNlQ29tcG9zaXRlS2V5KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKFVSTCxRTmFtZSxDbGFzcyxEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUsT2JqZWN0KSIpOwotICAgICAgICB9Ci0gICAgCQotICAgIAlpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAJICAgIGNhdGFsb2dNYW5hZ2VyID0gc3BhcnNlQ29tcG9zaXRlLmdldENhdGFsb2dNYW5hZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAJaWYgKGNhdGFsb2dNYW5hZ2VyID09IG51bGwpIHsKLSAgICAJCWNhdGFsb2dNYW5hZ2VyID0gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgfQotICAgIAkKLSAgICAgICAgaWYgKHNlcnZpY2VRTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyMCIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmljZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgLm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyMSIsICJudWxsIikpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghamF2YXgueG1sLndzLlNlcnZpY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzZXJ2aWNlQ2xhc3MpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY0VycjEiLCBzZXJ2aWNlQ2xhc3MuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRJc1NlcnZpY2VQcm92aWRlcihmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRDb3JyZXNwb25kaW5nQ2xhc3Moc2VydmljZUNsYXNzKTsKLSAgICAgICAgLy8gVGhlIGNsYXNzbG9hZGVyIHdhcyBvcmlnaW5hbGx5IGdvdHRlbiBvZmYgdGhpcyBjbGFzcywgYnV0IGl0IHNlZW1zIG1vcmUgbG9naWNhbCB0byAKLSAgICAgICAgLy8gZ2V0IGl0IG9mZiB0aGUgYXBwbGljYXRpb24gc2VydmljZSBjbGFzcy4KLS8vICAgICAgICBjb21wb3NpdGUuc2V0Q2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Q2xhc3NMb2FkZXIoZ2V0Q2xhc3NMb2FkZXIoc2VydmljZUNsYXNzKSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5LCBzcGFyc2VDb21wb3NpdGUpOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgdGhlcmUncyBhIFdTREwgVVJMIHNwZWNpZmllZCBpbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSwgdGhhdCBpcyBhIG92ZXJyaWRlLCBmb3IgZXhhbXBsZQotICAgICAgICAvLyBmcm9tIGEgSlNSLTEwOSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIGFuZCB0aGF0J3MgdGhlIG9uZSB0byB1c2UuCi0gICAgICAgIFVSTCBzcGFyc2VDb21wb3NpdGVXc2RsVVJMID0gZ2V0U3BhcnNlQ29tcG9zaXRlV3NkbFVSTChzcGFyc2VDb21wb3NpdGUpOwotICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlV3NkbFVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldzZGwgbG9jYXRpb24gb3ZlcnJpZGVuIGJ5IHNwYXJzZSBjb21wb3NpdGU7IG92ZXJyaWRlbiB2YWx1ZTogIiArIHRoaXMud3NkbFVSTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLndzZGxVUkwgPSBzcGFyc2VDb21wb3NpdGVXc2RsVVJMLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLndzZGxVUkwgPSB3c2RsVVJMID09IG51bGwgPyBudWxsIDogd3NkbFVSTC50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJXc2RsIExvY2F0aW9uIHZhbHVlIHVzZWQ6ICIgKyB0aGlzLndzZGxVUkwpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IE9uIHRoZSBjbGllbnQgc2lkZSwgd2Ugc2hvdWxkIG5vdCBzdXBwb3J0IHBhcnRpYWwgV1NETDsgaS5lLiBpZiB0aGUgV1NETCBpcyBzcGVjaWZpZWQgaXQgbXVzdCBiZQotICAgICAgICAvLyAgICAgICBjb21wbGV0ZSBhbmQgbXVzdCBjb250YWluIHRoZSBTZXJ2aWNlUU5hbWUuICBUaGlzIGlzIGhvdyB0aGUgU3VuIFJJIGJlaGF2ZXMgb24gdGhlIGNsaWVudC4KLSAgICAgICAgLy8gICAgICAgV2hlbiB0aGlzIGlzIGZpeGVkLCB0aGUgY2hlY2sgaW4gU2VydmljZURlbGVnYXRlKFVSTCwgUU5hbWUsIENsYXNzKSBzaG91bGQgYmUgcmVtb3ZlZAotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogVGhlIHNlcnZpY2VRTmFtZSBuZWVkcyB0byBiZSB2ZXJpZmllZCBiZXR3ZWVuIHRoZSBhcmd1bWVudC9XU0RML0Fubm90YXRpb24KLSAgICAgICAgdGhpcy5zZXJ2aWNlUU5hbWUgPSBzZXJ2aWNlUU5hbWU7Ci0KLSAgICAgICAgc2V0dXBXc2RsRGVmaW5pdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBVUkwgZ2V0U3BhcnNlQ29tcG9zaXRlV3NkbFVSTChEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3BhcnNlQ29tcG9zaXRlKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgV1NETCBmaWxlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgY29tcG9zaXRlCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NjID0gKFdlYlNlcnZpY2VDbGllbnQpIHNwYXJzZUNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsKLSAgICAgICAgICAgIGlmICh3c2MgIT0gbnVsbCAmJiB3c2Mud3NkbExvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2Mud3NkbExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgVVJMIHdzZGxVcmwgPSBnZXRXU0RMVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHdzZGxVcmwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNlcnZpY2VEZXNjRXJyNCIsIHdzZGxMb2NhdGlvbikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9IHdzZGxVcmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJMIGNyZWF0ZVdzZGxVUkwoU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICBVUkwgdGhlVXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoZVVybCA9IG5ldyBVUkwod3NkbExvY2F0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBKdXN0IHJldHVybiBhIG51bGwgdG8gaW5kaWNhdGUgd2UgY291bGRuJ3QgY3JlYXRlIGEgVVJMIGZyb20gdGhlIHN0cmluZwotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gb2J0YWluIFVSTCBmb3IgV1NETCBmaWxlOiAiICsgd3NkbExvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYnkgdXNpbmcgRmlsZSByZWZlcmVuY2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhlVXJsOwotICAgIH0KLQotICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0gICAgICAgIHRoaXMoZGJjTWFwLCBjb21wb3NpdGUsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoZGJjTWFwLCBjb21wb3NpdGUsIGNvbmZpZ0NvbnRleHQsIG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzZXJ2aWNlLXByb3ZpZGVyIHNpZGUgU2VydmljZSBkZXNjcmlwdGlvbiBoaWVyYWNoeS4gIFRoZSBoaWVyYWNoeSBpcyBjcmVhdGVkIGVudGlyZWx5Ci0gICAgICogZnJvbSBjb21wb3NpdGUuICBBbGwgcmVsZXZhbnQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyByZWZlcmVuY2VkIGZyb20gdGhlIGNsYXNzIHJlcHJlc2VudGVkIGJ5Ci0gICAgICogY29tcG9zaXRlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcC4KLSAgICAgKiBAcGFyYW0gZGJjTWFwCi0gICAgICogQHBhcmFtIGNvbXBvc2l0ZQotICAgICAqLwotICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAsCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlLCAKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIAotICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lKSB7Ci0gICAgICAgIHRoaXMuY29tcG9zaXRlID0gY29tcG9zaXRlOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjcmlwdGlvbkltcGwoSGFzaE1hcDxTdHJpbmcsRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPixDb25maWd1cmF0aW9uQ29udGV4dCkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlSW1wbE5hbWUgPSB0aGlzLmNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKTsKLQotICAgICAgICB0aGlzLmRiY01hcCA9IGRiY01hcDsKLSAgICAgICAgdGhpcy5pc1NlcnZlclNpZGUgPSB0cnVlOwotICAgICAgICB0aGlzLnNlcnZpY2VRTmFtZSA9IHNlcnZpY2VRTmFtZTsKLSAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlciA9IHRoaXMuY29tcG9zaXRlLmdldENhdGFsb2dNYW5hZ2VyKCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy8gaWYgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBzcGVjaWZpYyBzZXJ2aWNlIFFOYW1lCi0gICAgICAgIC8vIHdlIHNob3VsZCB1c2UgdGhhdCB0byByZXRyaWV2ZSB0aGUgcG90ZW50aWFsIGxpc3Qgb2YgUG9ydENvbXBvc2l0ZSBvYmplY3RzCi0gICAgICAgIExpc3Q8UG9ydENvbXBvc2l0ZT4gcG9ydENvbXBvc2l0ZXMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgaWYodGhpcy5zZXJ2aWNlUU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcG9ydENvbXBvc2l0ZXMgPSBjb21wb3NpdGUuZ2V0UG9ydENvbXBvc2l0ZXModGhpcy5zZXJ2aWNlUU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcG9ydENvbXBvc2l0ZXMgPSBjb21wb3NpdGUuZ2V0UG9ydENvbXBvc2l0ZXMoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL2NhcHR1cmUgdGhlIFdTREwsIGlmIHRoZXJlIGlzIGFueS4uLnRvIGJlIHVzZWQgZm9yIGxhdGVyIHByb2Nlc3NpbmcKLSAgICAgICAgc2V0dXBXc2RsRGVmaW5pdGlvbigpOwotCi0gICAgICAgIC8vIERvIGEgZmlyc3QgcGFzcyB2YWxpZGF0aW9uIGZvciB0aGlzIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZS4KLSAgICAgICAgLy8gVGhpcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYSBmdWxsIGludGVncml0eSBjaGVjaywgYnV0IHJhdGhlciBhIGZhaWwtZmFzdCBtZWNoYW5pc20KLSAgICAgICAgdmFsaWRhdGVEQkNMSW50ZWdyaXR5KCk7Ci0KLSAgICAgICAgLy8gVGhlIFNlcnZpY2VRTmFtZSBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzZXQgYmFzZWQgb24gYW5ub3RhdGlvbiBvciBkZWZhdWx0Ci0gICAgICAgIC8vIEl0IHdpbGwgYmUgc2V0IGJ5IHRoZSBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBzaW5jZSBpdCBpcyB0aGUgb25lIHRoYXQga25vd3MKLSAgICAgICAgLy8gaG93IHRvIHByb2Nlc3MgdGhlIGFubm90YXRpb25zIGFuZCB0aGUgZGVmYXVsdHMuCi0KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBJZiBQb3J0Q29tcG9zaXRlIGluc3RhbmNlcyB3ZXJlIHNwZWNpZmllZCBvbiB0aGUgREJDIHdlIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZwotICAgICAgICAvLyB3ZSB3YW50IHRvIHN3aXRjaCB0aGUgY29udGV4dCBvZiBwcm9jZXNzaW5nIHRvIHRoZSBQb3J0Q29tcG9zaXRlcwotICAgICAgICBpZihwb3J0Q29tcG9zaXRlcyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAhcG9ydENvbXBvc2l0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIEVuZHBvaW50RGVzY3JpcHRpb24gaW5zdGFuY2UgZnJvbSBQb3J0Q29tcG9zaXRlcyBmb3IgIiArCi0gICAgICAgICAgICAgICAgCQkiaW1wbGVtZW50YXRpb24gY2xhc3M6ICIgKyBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yKFBvcnRDb21wb3NpdGUgcG9ydENvbXBvc2l0ZSA6IHBvcnRDb21wb3NpdGVzKSB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIFNFSSBhbmQgdGhlIEltcGwKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gZ2V0QWxsUHJvcHMocG9ydENvbXBvc2l0ZSwgZGJjTWFwKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIHBhc3MgaW4gYW4gaW5kZXggc28gdGhlIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGluc3RhbmNlIHdpbGwga25vdwotICAgICAgICAgICAgICAgIC8vIHdoaWNoIFBvcnRDb21wb3NpdGUgaW5zdGFuY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuZCBjYW4gcmV0cmlldmUgdGhhdCAKLSAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZSBhcyByZXF1aXJlZAotICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVuZHBvaW50RGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwodGhpcywgc2VydmljZUltcGxOYW1lLCBwcm9wcywgaSk7Ci0gICAgICAgICAgICAgICAgYWRkRW5kcG9pbnREZXNjcmlwdGlvbihlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIG5vIFBvcnRDb21wb3NpdGVzIHRoZW4gd2UgYnVpbGQgdGhlIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGluc3RhbmNlIGZyb20gdGhlCi0gICAgICAgIC8vIERCQyB0aGF0IHdhcyBzdXBwbGllZAotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBQb3J0Q29tcG9zaXRlcyBmb3VuZCBmb3IgaW1wbGVtZW50YXRpb24gY2xhc3M6ICIgKyBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIFNFSSBhbmQgdGhlIEltcGwKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gZ2V0QWxsUHJvcHMoY29tcG9zaXRlLCBkYmNNYXApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2luZ2xlIEVuZHBvaW50RGVzY3JpcHRpb24gaGllcmFjaHkgZnJvbSB0aGUgc2VydmljZSBpbXBsIGFubm90YXRpb25zOyBTaW5jZSB0aGUgUG9ydFFOYW1lIGlzIG51bGwsIAotICAgICAgICAJLy8gaXQgd2lsbCBiZSBzZXQgdG8gdGhlIGFubm90YXRpb24gdmFsdWUuCi0gICAgICAgIAlFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBlbmRwb2ludERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAJbmV3IEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHRoaXMsIHNlcnZpY2VJbXBsTmFtZSwgcHJvcHMsIG51bGwpOwotICAgICAgICAJYWRkRW5kcG9pbnREZXNjcmlwdGlvbihlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotICAgIC8vIFNUQVJUIG9mIHB1YmxpYyBhY2Nlc3NvciBtZXRob2RzCi0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgb3IgY3JlYXRlIGFuIEVuZHBvaW50RGVzY3JpcHRpb24uIFVwZGF0ZXMgdG8gZXhpc3RpbmcgRW5kcG9pbnREZXNjcmlwdG9ucyB3aWxsIGJlCi0gICAgICogYmFzZWQgb24gdGhlIFNFSSBjbGFzcyBhbmQgaXRzIGFubm90YXRpb25zLiAgQm90aCBkZWNsYXJlZCBwb3J0cyBhbmQgZHluYW1pYyBwb3J0cyBjYW4gYmUKLSAgICAgKiB1cGRhdGVkLiAgQSBkZWNsYXJlZCBwb3J0IGlzIG9uZSB0aGF0IGlzIGRlZmluZWQgKGUuZy4gaW4gV1NETCBvciB2aWEgYW5ub3RhdGlvbnMpOyBhIGR5YW1pYwotICAgICAqIHBvcnQgaXMgb25lIHRoYXQgaXMgbm90IGRlZmluZWQgKGUuZy4gbm90IHZpYSBXU0RMIG9yIGFubm90YXRpb25zKSBhbmQgaGFzIGJlZW4gYWRkZWQgdmlhCi0gICAgICogU2VyaXZjZS5hZGRQb3J0LgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgcHJlZGVmaW5lZCBwb3J0cywgYSBjb21wb3NpdGUgb2Ygc3BhcnNlIG1ldGFkYXRhLCBzdWNoIGFzIGZyb20gYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgKiBtYXkgYmUgc3VwcGxpZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlYW5ub3RhdGlvbnMgc3VjaCBhcwotICAgICAqIGFkZGluZyBhIGhhbmRsZXIgY2hhaW4uICBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBpcyBOT1Qgc3VwcG9ydGVkIGZvciBkeW5hbWljIChpLmUuIEFERF9QT1JUKQotICAgICAqIG9yIGRpc3BhdGNoIGNsaWVudHMuIAotICAgICAqIDxwLz4KLSAgICAgKiBOb3RlcyBvbiBob3cgYW4gRW5kcG9pbnREZXNjcmlwdGlvbiBjYW4gYmUgdXBkYXRlZCBvciBjcmVhdGVkOiAxKSBTZXJ2aWNlLmNyZWF0ZURpc3BhdGNoIGNhbgotICAgICAqIGNyZWF0ZSBhIERpc3BhdGNoIGNsaWVudCBmb3IgZWl0aGVyIGEgZGVjbGFyZWQgb3IgZHluYW1pYyBwb3J0IDIpIE5vdGUgdGhhdCBjcmVhdGluZyBhCi0gICAgICogRGlzcGF0Y2ggZG9lcyBub3QgYXNzb2NpYXRlIGFuIFNFSSB3aXRoIGFuIGVuZHBvaW50IDMpIFNlcnZpY2UuZ2V0UG9ydCB3aWxsIGFzc29jaWF0ZSBhbiBTRUkKLSAgICAgKiB3aXRoIGEgcG9ydCA0KSBBIGdldFBvcnQgb24gYW4gZW5kcG9pbnQgd2hpY2ggd2FzIG9yaWdpbmFsbHkgY3JlYXRlZCBmb3IgYSBEaXN0cGF0Y2ggd2lsbAotICAgICAqIHVwZGF0ZSB0aGF0IEVuZHBvaW50RGVzY3JpcHRpb24gd2l0aCB0aGUgU0VJIHByb3ZpZGVkIG9uIHRoZSBnZXRQb3J0IDUpIFNlcnZpY2UuZ2V0UG9ydCBjYW4KLSAgICAgKiBub3QgYmUgY2FsbGVkIG9uIGEgZHluYW1pYyBwb3J0IChwZXIgdGhlIEpBWC1XUyBzcGVjKSA2KSBTZXJ2aWNlLmFkZFBvcnQgY2FuIG5vdCBiZSBjYWxsZWQKLSAgICAgKiBmb3IgYSBkZWNsYXJlZCBwb3J0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VpICAgICAgICBUaGlzIHdpbGwgYmUgbm9uLW51bGwgaWYgdGhlIHVwZGF0ZSBpcyBvZiB0eXBlIEdFVF9QT1JUOyBpdCB3aWxsIGJlIG51bGwgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgdXBkYXRlIGlzIEFERF9QT1JUIG9yIENSRUFURV9ESVNQQVRDSAotICAgICAqIEBwYXJhbSBwb3J0UU5hbWUKLSAgICAgKiBAcGFyYW0gdXBkYXRlVHlwZSBJbmRpY2F0ZXMgd2hhdCBpcyBjYXVzaW5nIHRoZSB1cGRhdGUgR0VUX1BPUlQgaXMgYW4gYXR0ZW1wdCB0byBnZXQgYQotICAgICAqICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIFNFSS1iYXNlZCBwb3J0IEFERF9QT1JUIGlzIGFuIGF0dGVtcHQgdG8gYWRkIGEgcHJldmlvdXNseQotICAgICAqICAgICAgICAgICAgICAgICAgIG5vbi1leGlzdGVudCBkeW5hbWljIHBvcnQgQ1JFQVRFX0RJU1BBVENIIGlzIGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEKLSAgICAgKiAgICAgICAgICAgICAgICAgICBEaXNwYXRjaC1iYXNlZCBjbGllbnQgdG8gZWl0aGVyIGEgZGVjbGFyZWQgcG9ydCBvciBhIHByZS1leGlzdGluZyBkeW5hbWljCi0gICAgICogICAgICAgICAgICAgICAgICAgcG9ydC4KLSAgICAgKiBAcGFyYW0gY29tcG9zaXRlICBNYXkgY29udGFpbiBzcGFyc2UgbWV0YWRhdGEsIGZvciBleGFtcGxlIGZyb20gYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoYXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBjbGFzcyBhbm5vdGF0aW9ucyB0byB1cGRhdGUgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gaGllcmFyY2h5LiAgRm9yIGV4YW1wbGUsIGl0IG1heSBjb250YWluIGEgSGFuZGxlckNoYWluIGFubm90YXRpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiBhIEpTUi0xMDkgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgCi0gICAgICovCi0KLSAgICBFbmRwb2ludERlc2NyaXB0aW9uIHVwZGF0ZUVuZHBvaW50RGVzY3JpcHRpb24oQ2xhc3Mgc2VpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZSB1cGRhdGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRBZGRyZXNzKSB7Ci0KLQkKLSAgICAJRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZW5kcG9pbnREZXNjcmlwdGlvbiA9IGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHBvcnRRTmFtZSk7Ci0gICAgCWJvb2xlYW4gaXNQb3J0RGVjbGFyZWQgPSBpc1BvcnREZWNsYXJlZChwb3J0UU5hbWUpOwotCi0gICAgCS8vIElmIGEgZGVmaW5lZCBlbmRwb2ludERlc2NyaXB0aW9uIGlzIG5vdCBhdmFpbGFibGUsIHRyeSBhbmQgbG9jYXRlIGEgZHluYW1pYyBlbmRwb2ludC4KLSAgICAJLy8gTm90ZSB0aGF0IGEgZHluYW1pYyBwb3J0IHdpbGwgb25seSBiZSBmb3VuZCBmb3IgdGhlIGNsaWVudCB0aGF0IGNyZWF0ZWQgaXQsIHBlciB0aGUKLSAgICAJLy8gc2VydmljZURlbGVnYXRlS2V5Ci0KLSAgICAJaWYgKGVuZHBvaW50RGVzY3JpcHRpb24gPT0gbnVsbCAmJiBzZXJ2aWNlRGVsZWdhdGVLZXkgIT0gbnVsbCkgewotICAgIAkJZW5kcG9pbnREZXNjcmlwdGlvbiA9IGdldER5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9uSW1wbChwb3J0UU5hbWUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgCX0KLQotICAgICAgICAvLyBJZiBubyBRTmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBhcmd1bWVudHMsIG9uZSBtYXkgaGF2ZSBiZWVuIHNwZWNpZmllZCBpbiB0aGUgc3BhcnNlCi0gICAgICAgIC8vIGNvbXBvc2l0ZSBtZXRhZGF0YSB3aGVuIHRoZSBzZXJ2aWNlIHdhcyBjcmVhdGVkLgotICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHBvcnRRTmFtZSkpIHsKLSAgICAgICAgICAgIFFOYW1lIHByZWZlcnJlZFBvcnRRTiA9IGdldFByZWZlcnJlZFBvcnQoc2VydmljZURlbGVnYXRlS2V5KTsKLSAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHByZWZlcnJlZFBvcnRRTikpIHsKLSAgICAgICAgICAgICAgICBwb3J0UU5hbWUgPSBwcmVmZXJyZWRQb3J0UU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHVwZGF0ZVR5cGUpIHsKLQotICAgICAgICAgICAgY2FzZSBBRERfUE9SVDoKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY0VycjUiLCBwb3J0UU5hbWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBQb3J0IG11c3QgTk9UIGJlIGRlY2xhcmVkIChlLmcuIGNhbiBub3QgYWxyZWFkeSBleGlzdCBpbiBXU0RMKQotICAgICAgICAgICAgICAgIC8vIElmIGFuIEVuZHBvaW50RGVzYyBkb2Vzbid0IGV4aXN0OyBjcmVhdGUgaXQgYXMgbG9uZyBhcyBpdCBkb2Vzbid0IGV4aXN0IGluIHRoZSBXU0RMCi0gICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShwb3J0UU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiYWRkUG9ydEVycjIiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChnZXRXU0RMV3JhcHBlcigpICE9IG51bGwgJiYgaXNQb3J0RGVjbGFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJhZGRQb3J0RHVwIiwgcG9ydFFOYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZHBvaW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIFNFSSBDbGFzcyBhbmQgaXRzIGFubm90YXRpb25zIHRvIGZpbmlzaCBjcmVhdGluZyB0aGUgRGVzY3JpcHRpb24gaGllcmFyY2h5LiAgTm90ZSB0aGF0IEVuZHBvaW50SW50ZXJmYWNlLCBPcGVyYXRpb25zLCBQYXJhbWV0ZXJzLCBldGMuCi0gICAgICAgICAgICAgICAgICAgIC8vIGFyZSBub3QgY3JlYXRlZCBmb3IgZHluYW1pYyBwb3J0cy4gIEl0IHdvdWxkIGJlIGFuIGVycm9yIHRvIGxhdGVyIGRvIGEgZ2V0UG9ydCBhZ2FpbnN0IGEgZHluYW1pYyBwb3J0IChwZXIgdGhlIEpBWC1XUyBzcGVjKQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBhZGQgdGhlIGR5bmFtaWMgcG9ydCB1bmRlciBhIHNwZWNpZmljIHNlcnZpY2UgZGVsZWdhdGUsIHRoYXQgaXMgYW4gZXJyb3IKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZURlbGVnYXRlS2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY3JpcHRpb25JbXBsQWRkUG9ydEVyciIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24gPSBjcmVhdGVFbmRwb2ludERlc2NyaXB0aW9uSW1wbChzZWksIHBvcnRRTmFtZSwgYmluZGluZ0lkLCBlbmRwb2ludEFkZHJlc3MpOyAgICAKLSAgICAgICAgICAgICAgICAgICAgYWRkRHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25JbXBsKGVuZHBvaW50RGVzY3JpcHRpb24sIHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgZXJyb3IgY2hKZWNrIGFib3ZlIHBhc3NlZCwgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gYWxyZWFkeSBleGlzdHMgYW5kIG5lZWRzIG5vIHVwZGF0aW5nCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEdFVF9QT1JUOgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGV4aXN0aW5nIGVuZHBvaW50RGVzYyBieSBTRUkgY2xhc3MgaWYgcG9ydFFOYW1lIHdhcyBub3Qgc3BlY2lmaWVkIAotICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludERlc2NyaXB0aW9uID09IG51bGwgJiYgcG9ydFFOYW1lID09IG51bGwgJiYgc2VpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbiA9IGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHNlaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIElmIGFuIGVuZHBvaW50RGVzYyBkb2Vzbid0IGV4aXN0LCBhbmQgdGhlIHBvcnQgZXhpc3RzIGluIHRoZSBXU0RMLCBjcmVhdGUgaXQKLSAgICAgICAgICAgICAgICAvLyBJZiBhbiBlbmRwb2ludERlc2MgYWxyZWFkeSBleGlzdHMgYW5kIGhhcyBhbiBhc3NvY2lhdGVkIFNFSSBhbHJlYWR5LCBtYWtlIHN1cmUgdGhleSBtYXRjaAotICAgICAgICAgICAgICAgIC8vIElmIGFuIGVuZHBvaW50RGVzYyBhbHJlYWR5IGV4aXN0cyBhbmQgd2FzIGNyZWF0ZWQgZm9yIERpc3BhdGNoIChubyBTRUkpLCB1cGRhdGUgdGhhdCB3aXRoIHRoZSBTRUkgcHJvdmlkZWQgb24gdGhlIGdldFBvcnQKLQotICAgICAgICAgICAgICAgIC8vIFBvcnQgbXVzdCBiZSBkZWNsYXJlZCAoZS5nLiBpbiBXU0RMIG9yIHZpYSBhbm5vdGF0aW9ucykKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBPbmNlIGlzUG9ydERlY2xhcmVkIHVuZGVyc3RhbmRzIGFubm90YXRpb25zIGFuZCBub3QganVzdCBXU0RMLCB0aGUgMm5kIHBhcnQgb2YgdGhpcyBjaGVjayBjYW4gcG9zc2libHkgYmUgcmVtb3ZlZC4KLSAgICAgICAgICAgICAgICAvLyAgICAgICBBbHRob3VnaCBjb25zaWRlciB0aGUgY2hlY2sgYmVsb3cgdGhhdCB1cGRhdGVzIGFuIGV4aXN0aW5nIEVuZHBvaW50RGVzY3JpdHBpb24gd2l0aCBhbiBTRUkuCi0gICAgICAgICAgICAgICAgaWYgKCFpc1BvcnREZWNsYXJlZCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGVuZHBvaW50RGVzY3JpcHRpb24gIT0gbnVsbCAmJiBlbmRwb2ludERlc2NyaXB0aW9uLmlzRHluYW1pY1BvcnQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBndWFyZHMgYWdhaW5zdCB0aGUgY2FzZSB3aGVyZSBhbiBhZGRQb3J0IHdhcyBkb25lIHByZXZpb3VzbHkgYW5kIG5vdyBhIGdldFBvcnQgaXMgZG9uZSBvbiBpdC4KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1cGRhdGVFUERlc2NyRXJyMSIsKHBvcnRRTmFtZSAhPSBudWxsID8gcG9ydFFOYW1lLnRvU3RyaW5nKCkgOiAibm90IHNwZWNpZmllZCIpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInVwZGF0ZUVQRGVzY3JFcnIyIiwocG9ydFFOYW1lICE9IG51bGwgPyBwb3J0UU5hbWUudG9TdHJpbmcoKSA6ICJub3Qgc3BlY2lmaWVkIikpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZHBvaW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIFNFSSBDbGFzcyBhbmQgaXRzIGFubm90YXRpb25zIHRvIGZpbmlzaCBjcmVhdGluZyB0aGUgRGVzY3JpcHRpb24gaGllcmFjaHk6IEVuZHBvaW50LCBFbmRwb2ludEludGVyZmFjZSwgT3BlcmF0aW9ucywgUGFyYW1ldGVycywgZXRjLgotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHNlaSwgcG9ydFFOYW1lLCB0aGlzLCBjb21wb3NpdGUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEVuZHBvaW50RGVzY3JpcHRpb24oZW5kcG9pbnREZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIFdlIG11c3QgcmVzZXQgdGhlIHNlcnZpY2UgcnVudGltZSBkZXNjcmlwdGlvbiBhZnRlciBhZGRpbmcgYSBuZXcgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICogc2luY2UgdGhlIHJ1bnRpbWUgZGVzY3JpcHRpb24gaW5mb3JtYXRpb24gY291bGQgaGF2ZSByZWZlcmVuY2VzIHRvIG9sZAotICAgICAgICAgICAgICAgICAgICAgKiBpbmZvcm1hdGlvbi4gU2VlIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uRmFjdG9yeSBhbmQgCi0gICAgICAgICAgICAgICAgICAgICAqIE1hcnNoYWxTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uLgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcmVzZXRTZXJ2aWNlUnVudGltZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKGdldEVuZHBvaW50U0VJKHBvcnRRTmFtZSkgPT0gbnVsbCAmJiAhZW5kcG9pbnREZXNjcmlwdGlvbi5pc0R5bmFtaWNQb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRXhpc3RpbmcgZW5kcG9pbnREZXNjIGZyb20gYSBkZWNsYXJlZCBwb3J0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCBhbiBTRUkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBjbGllbnQgZmlyc3QgZGlkIGEgQ1JFQVRFX0RJU1BBVENIIG9uIGEgZGVjbGFyZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gcG9ydCwgd2hpY2ggd291bGQgY2F1c2UgaXQgdG8gYmUgY3JlYXRlZCwgYW5kIHRoZW4gZGlkIGEgR0VUX1BPUlQgb24gdGhlIAotICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHBvcnQgbGF0ZXIsIHByb3ZpZGluZyBhbiBTRUkuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGVzIAotICAgICAgICAgICAgICAgICAgICAvLyAxKSBBbiBFbmRwb2ludERlc2NyaXRwdGlvbiBjcmVhdGVkIGZyb20gYW4gYWRkUG9ydCAoaS5lLiBhIGR5bmFtaWMgcG9ydCkgY2FuIAotICAgICAgICAgICAgICAgICAgICAvLyAgICBub3QgZG8gdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgLy8gMikgQSBzcGFyc2UgY29tcG9zaXRlIG1heSBiZSBzcGVjaWZpZWQuICBXZSBkb24ndCBhbGxvdyBtaXhpbmcgSkFYLVdTIHVubWFuYWdlZAotICAgICAgICAgICAgICAgICAgICAvLyAgICBhcGlzIChDUkVBVEVfRElTUEFUQ0gpIHdpdGggSlNSLTEwOSBtYW5hZ2VkIGFwaXMgKEdFVF9QT1JUIHdpdGggc3BhcnNlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbXBvc2l0ZSBtZXRhZGF0YSBmcm9tIGEgREQpLiAgU2luY2UgdGhlIHNwYXJzZSBjb21wb3NpdGUgaXMgc3RvcmVkIGJ5Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIGEga2V5IEFORCBDUkVBVEVfRElTUEFUQ0ggYW5kIEFERF9QT1JUIHdpbGwgdGhyb3duIGFuIGV4Y2VwdGlvbiBvZiBhIGNvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAvLyAgICBpcyBzcGVjaWZpZWQsIGhhdmluZyBhIGNvbXBvc2l0ZSBhbmQga2V5IG9uIHRoZSBHRVRfUE9SVHMgc2hvdWxkbid0IGJlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIGEgcHJvYmxlbS4KLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbi51cGRhdGVXaXRoU0VJKHNlaSwgY29tcG9zaXRlLCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0RW5kcG9pbnRTRUkocG9ydFFOYW1lKSAhPSBzZWkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ1cGRhdGVFUERlc2NyRXJyMyIscG9ydFFOYW1lLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIAkJCQlzZWkuZ2V0TmFtZSgpLGdldEVuZHBvaW50U0VJKHBvcnRRTmFtZSkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGVycm9yIGNoZWNrIGFib3ZlIHBhc3NlZCwgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gYWxyZWFkeSBleGlzdHMgYW5kIG5lZWRzIG5vIHVwZGF0aW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgYWRkIHRoZSBzcGFyc2UgY29tcG9zaXRlIGlmIG9uZSB3YXMgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLnNldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGVLZXksIGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENSRUFURV9ESVNQQVRDSDoKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY0VycjYiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFBvcnQgbWF5IG9yIG1heSBub3QgZXhpc3QgaW4gV1NETC4KLSAgICAgICAgICAgICAgICAvLyBJZiBhbiBlbmRwb2ludERlc2MgZG9lc24ndCBleGlzdCBhbmQgaXQgaXMgaW4gdGhlIFdTREwsIGl0IGNhbiBiZSBjcmVhdGVkCi0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhbiBlcnJvci4KLSAgICAgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHBvcnRRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJjcmVhdGVEaXNwYXRjaEZhaWwwIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kcG9pbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBFbmRwb2ludERlc2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzOyBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBEaXNwYXRjaCBzaG91bGQgbm90IGhhdmUgYW4gU0VJIGFzc29jaWF0ZWQgd2l0aCBpdCBvbiB0aGUgdXBkYXRlIGNhbGwuCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlRGlzcGF0Y2hGYWlsMyIscG9ydFFOYW1lLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCAmJiBpc1BvcnREZWNsYXJlZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBFbmRwb2ludERlc2NyaXB0aW9uIGRvZXNuJ3QgZXhpc3QgYW5kIHRoaXMgaXMgYSBkZWNsYXJlZCBQb3J0LCBzbyBjcmVhdGUgb25lCi0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgU0VJIENsYXNzIGFuZCBpdHMgYW5ub3RhdGlvbnMgdG8gZmluaXNoIGNyZWF0aW5nIHRoZSBEZXNjcmlwdGlvbiBoaWVyYXJjaHkuICAKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IEVuZHBvaW50SW50ZXJmYWNlLCBPcGVyYXRpb25zLCBQYXJhbWV0ZXJzLCBldGMuIGFyZSBub3QgY3JlYXRlZCBmb3IgCi0gICAgICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoLWJhc2VkIHBvcnRzLCBidXQgbWlnaHQgYmUgdXBkYXRlZCBsYXRlciBpZiBhIGdldFBvcnQgaXMgZG9uZSBhZ2FpbnN0IAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBkZWNsYXJlZCBwb3J0LgotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uID0gbmV3IEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKHNlaSwgcG9ydFFOYW1lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRW5kcG9pbnREZXNjcmlwdGlvbihlbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcG9ydCBpcyBub3QgYSBkZWNsYXJlZCBwb3J0IGFuZCBpdCBkb2VzIG5vdCBoYXZlIGFuIEVuZHBvaW50RGVzY3JpcHRpb24sIAotICAgICAgICAgICAgICAgICAgICAvLyBtZWFuaW5nIGFuIGFkZFBvcnQgaGFzIG5vdCBiZWVuIGRvbmUgZm9yIGl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY3JlYXRlRGlzcGF0Y2hGYWlsMSIsIHBvcnRRTmFtZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmRwb2ludERlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgY3JlYXRlRW5kcG9pbnREZXNjcmlwdGlvbkltcGwoQ2xhc3Mgc2VpLCBRTmFtZSBwb3J0UU5hbWUsIFN0cmluZyBiaW5kaW5nSWQsIFN0cmluZyBlbmRwb2ludEFkZHJlc3MpIHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgY3JlYXRlRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgOiAoIgotICAgICAgICAgICAgICAgICAgICAgICsgcG9ydFFOYW1lICsgIiwiICsgYmluZGluZ0lkICsgIiwiICsgZW5kcG9pbnRBZGRyZXNzICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBlbmRwb2ludERlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImxvb2tpbmcgZm9yICIgKyBKQVhXU19EWU5BTUlDX0VORFBPSU5UUyArICIgaW4gQXhpc0NvbmZpZ3VyYXRpb24gOiAiICsgY29uZmlndXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKEpBWFdTX0RZTkFNSUNfRU5EUE9JTlRTKTsKLSAgICAgICAgSGFzaE1hcCBjYWNoZWREZXNjcmlwdGlvbnMgPSAoSGFzaE1hcCkKLSAgICAgICAgICAgICAgICAoKHBhcmFtZXRlciA9PSBudWxsKSA/IG51bGwgOiBwYXJhbWV0ZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGlmKGNhY2hlZERlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjYWNoZWREZXNjcmlwdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmFkZFBhcmFtZXRlcihKQVhXU19EWU5BTUlDX0VORFBPSU5UUywgY2FjaGVkRGVzY3JpcHRpb25zKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRlZCBuZXcgaW5zdGFuY2Ugb2YgY2FjaGVkRGVzY3JpcHRpb25zIDogIiArIGNhY2hlZERlc2NyaXB0aW9ucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImZvdW5kIG9sZCBqYXh3cy5keW5hbWljLmVuZHBvaW50cyBjYWNoZSBpbiBBeGlzQ29uZmlndXJhdGlvbiAoIiAgKyAgY2FjaGVkRGVzY3JpcHRpb25zICsgIikgd2l0aCBzaXplIDogKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWNoZWREZXNjcmlwdGlvbnMuc2l6ZSgpICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBrZXkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGtleS5hcHBlbmQocG9ydFFOYW1lID09IG51bGwgPyAiTlVMTCIgOiBwb3J0UU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIGtleS5hcHBlbmQoJzonKTsKLSAgICAgICAga2V5LmFwcGVuZChiaW5kaW5nSWQgPT0gbnVsbCA/ICJOVUxMIiA6IGJpbmRpbmdJZCk7Ci0gICAgICAgIGtleS5hcHBlbmQoJzonKTsKLSAgICAgICAga2V5LmFwcGVuZChlbmRwb2ludEFkZHJlc3MgPT0gbnVsbCA/ICJOVUxMIiA6IGVuZHBvaW50QWRkcmVzcyk7Ci0gICAgICAgIHN5bmNocm9uaXplZChjYWNoZWREZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgIFdlYWtSZWZlcmVuY2UgcmVmID0gKFdlYWtSZWZlcmVuY2UpIGNhY2hlZERlc2NyaXB0aW9ucy5nZXQoa2V5LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKHJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbiA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgcmVmLmdldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGVuZHBvaW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbiA9IG5ldyBFbmRwb2ludERlc2NyaXB0aW9uSW1wbChzZWksIHBvcnRRTmFtZSwgdHJ1ZSwgdGhpcyk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoY2FjaGVkRGVzY3JpcHRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyBjYWNoZWREZXNjcmlwdGlvbnMucHV0IDogKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2V5LnRvU3RyaW5nKCkgKyAiKSA6IHNpemUgLSAiICsgY2FjaGVkRGVzY3JpcHRpb25zLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhY2hlZERlc2NyaXB0aW9ucy5wdXQoa2V5LnRvU3RyaW5nKCksIG5ldyBXZWFrUmVmZXJlbmNlKGVuZHBvaW50RGVzY3JpcHRpb24pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiZm91bmQgb2xkIGVudHJ5IGZvciBlbmRwb2ludERlc2NyaXB0aW9uIGluIGpheHdzLmR5bmFtaWMuZW5kcG9pbnRzIGNhY2hlIDogKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYWNoZWREZXNjcmlwdGlvbnMuc2l6ZSgpICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5kcG9pbnREZXNjcmlwdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBnZXQgYWxsIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gc2V0IG9uIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUKLSAgICAgKiBpbnN0YW5jZS4gSWYgdGhlIERCQyByZXByZXNlbnRzIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgcmVmZXJlbmNlcyBhbiBTRUksIHRoZQotICAgICAqIHByb3BlcnRpZXMgZnJvbSB0aGUgU0VJIHdpbGwgYWxzbyBiZSBtZXJnZWQgd2l0aCB0aGUgcmV0dXJuZWQgcmVzdWx0LgotICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRBbGxQcm9wcyhEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXApIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3QgZ2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIERCQwotICAgICAgICBpZihkYmMuZ2V0UHJvcGVydGllcygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICFkYmMuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcHJvcHMucHV0QWxsKGRiYy5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBubyBuZWVkIHRvIGNvbnRpbnVlIGlmIHRoZSAnZGJjTWFwJyBpcyBudWxsCi0gICAgICAgIGlmKGRiY01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgIC8vIG5vdyBpZiB0aGlzIGlzIGEgd2ViIHNlcnZpY2UgaW1wbCB3aXRoIGFuIFNFSSwgZ2V0IHRoZSBTRUkgcHJvcHMKLSAgICAgICAgICAgIGlmKGRiYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaURCQyA9IGRiY01hcC5nZXQoZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgICAgIGlmKHNlaURCQyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc2VpREJDLmdldFByb3BlcnRpZXMoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIXNlaURCQy5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dEFsbChzZWlEQkMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENsYXNzIGdldEVuZHBvaW50U0VJKFFOYW1lIHBvcnRRTmFtZSkgewotICAgICAgICBDbGFzcyBlbmRwb2ludFNFSSA9IG51bGw7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUpOwotICAgICAgICBpZiAoZW5kcG9pbnREZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRlcmZhY2VEZXNjID0gCi0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZURlc2MgIT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICBlbmRwb2ludFNFSSA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTRUlDbGFzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmRwb2ludFNFSTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQb3J0RGVjbGFyZWQoUU5hbWUgcG9ydFFOYW1lKSB7Ci0gICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gYWNjb3VudCBmb3IgZGVjbGFyYXRpb24gb2YgdGhlIHBvcnQgdmlhIGFubm90YXRpb25zIGluIGFkZGl0aW9uIHRvIGp1c3QgV1NETAotICAgICAgICAvLyBUT0RPOiBBZGQgbG9naWMgdG8gY2hlY2sgdGhlIHBvcnRRTiBuYW1lc3BhY2UgYWdhaW5zdCB0aGUgV1NETCBEZWZpbml0aW9uIE5TCi0gICAgICAgIGJvb2xlYW4gcG9ydElzRGVjbGFyZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydFFOYW1lKSkgewotICAgICAgICAgICAgaWYgKGdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBnZXRXU0RMV3JhcHBlcigpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlIHdzZGxTZXJ2aWNlID0gd3NkbERlZm4uZ2V0U2VydmljZShzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSB3c2RsU2VydmljZS5nZXRQb3J0KHBvcnRRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgcG9ydElzRGVjbGFyZWQgPSAod3NkbFBvcnQgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZCBsb2dpYyB0byBkZXRlcm1pbmUgaWYgcG9ydCBpcyBkZWNsYXJlZCB2aWEgYW5ub3RhdGlvbnMgd2hlbiBubyBXU0RMIGlzIHByZXNlbnQuICBGb3Igbm93LCB3ZSBoYXZlIHRvIGFzc3VtZSBpdCBpcyBkZWNsYXJlZCAKLSAgICAgICAgICAgICAgICAvLyBzbyBnZXRQb3J0KC4uLikgYW5kIGNyZWF0ZURpc3BhdGNoKC4uLikgY2FsbHMgd29yayB3aGVuIHRoZXJlIGlzIG5vIFdTREwuCi0gICAgICAgICAgICAgICAgcG9ydElzRGVjbGFyZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUG9ydFFOYW1lIGlzIG51bGwsIHNvIHRoZSBydW50aW1lIGdldHMgdG8gY2hvb3NlIHdoaWNoIG9uZSB0byB1c2UuICBTaW5jZSB0aGVyZSdzIG5vIFdTREwKLSAgICAgICAgICAgIC8vIHdlJ2xsIHVzZSBhbm5vdGF0aW9ucywgc28gaXQgaXMgaW1wbGljaXRseSBkZWNsYXJlZAotICAgICAgICAgICAgcG9ydElzRGVjbGFyZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwb3J0SXNEZWNsYXJlZDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldEVuZHBvaW50RGVzY3JpcHRpb25zKCkKLSAgICAqLwotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uW10gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBkZWZpbmVkRW5kcG9pbnREZXNjcmlwdGlvbnMudmFsdWVzKCkudG9BcnJheShuZXcgRW5kcG9pbnREZXNjcmlwdGlvbkltcGxbMF0pOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPiBnZXREeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsKLSAgICAgICAgQ29sbGVjdGlvbiA8RW5kcG9pbnREZXNjcmlwdGlvbkltcGw+IGR5bmFtaWNFbmRwb2ludHMgPSBudWxsOwotICAgIAlpZiAoc2VydmljZURlbGVnYXRlS2V5ICE9IG51bGwgKSB7Ci0gICAgCQlpZiAoZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zLmdldChzZXJ2aWNlRGVsZWdhdGVLZXkpICE9IG51bGwpCi0gICAgCQkJZHluYW1pY0VuZHBvaW50cyA9IGR5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9ucy5nZXQoc2VydmljZURlbGVnYXRlS2V5KS52YWx1ZXMoKTsKLSAgICAgICAgfQotICAgIAlyZXR1cm4gZHluYW1pY0VuZHBvaW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBnZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKSB7Ci0gICAgCXJldHVybiBkZWZpbmVkRW5kcG9pbnREZXNjcmlwdGlvbnMudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRFbmRwb2ludERlc2NyaXB0aW9uKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUpCi0gICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKFFOYW1lIHBvcnRRTmFtZSkgewotCi0gICAgCXJldHVybiBnZXRFbmRwb2ludERlc2NyaXB0aW9uKHBvcnRRTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50RGVzY3JpcHRpb24gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihRTmFtZSBwb3J0UU5hbWUsIE9iamVjdCBzZXJ2aWNlRGVsZWdhdGVLZXkpIHsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiByZXR1cm5EZXNjID0gbnVsbDsKLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydFFOYW1lKSkgewotICAgIAkJcmV0dXJuRGVzYyA9IGRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucy5nZXQocG9ydFFOYW1lKTsKLQotICAgIAkJaWYgKHJldHVybkRlc2MgPT0gbnVsbCAmJiBzZXJ2aWNlRGVsZWdhdGVLZXkgIT0gbnVsbCkgewotCQkgICAgICAgICAgIHJldHVybkRlc2MgPSBnZXREeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbkltcGwocG9ydFFOYW1lLCBzZXJ2aWNlRGVsZWdhdGVLZXkpOwotICAgIAkJfSAgICAJCSAgICAgICAgCQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5EZXNjOwotICAgIH0KLQotICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGdldEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKFFOYW1lIHBvcnRRTmFtZSkgewotICAgICAgICByZXR1cm4gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKWdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOYW1lLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZ2V0RW5kcG9pbnREZXNjcmlwdGlvbkltcGwoUU5hbWUgcG9ydFFOYW1lLCBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5KSB7Ci0gICAgICAgIHJldHVybiAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBnZXRFbmRwb2ludERlc2NyaXB0aW9uSW1wbChDbGFzcyBzZWlDbGFzcykgewotICAgICAgICBmb3IgKEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjcmlwdGlvbiA6IGRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucy52YWx1ZXMoKSkgewotICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBEaXNwYXRjaCBlbmRwb2ludHMgd2lsbCBub3QgaGF2ZSBhbiBlbmRwb2ludEludGVyZmFjZSBiZWNhdXNlIHRoZSBkbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIFNFSQotICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgZW5kcG9pbnRTRUlDbGFzcyA9IGVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTRUlDbGFzcygpOwotICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludFNFSUNsYXNzICE9IG51bGwgJiYgZW5kcG9pbnRTRUlDbGFzcy5lcXVhbHMoc2VpQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpZW5kcG9pbnREZXNjcmlwdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgbWVhbnMgZm9yIGFjY2Vzc2luZyBhIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBpbnN0YW5jZS4KLSAgICAgKiBJZiB0aGUgaW50ZWdlciB2YWx1ZSBwYXNzZWQgaW4gaXMgYW4gaW5kZXggaW4gdGhlIGxpc3Qgb2YgUG9ydENvbXBvc2l0ZSBvYmplY3RzLCAKLSAgICAgKiB0aGVuIHRoZSBpbmRpY2lhdGVkIFBvcnRDb21wb3NpdGUgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgaW5zdGFuY2UgREJDCi0gICAgICogd2lsbCBiZSByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZShRTmFtZSBzZXJ2aWNlUU5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcG9ydENvbXBvc2l0ZUluZGV4KSB7Ci0gICAgICAgIAotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIC8vIGlmIHRoZSBzZXJ2aWNlIFFOYW1lIHdhcyBzcGVjaWZpZWQgbGV0J3MgYXR0ZW1wdCB0byBnZXQgdGhlIGNvcnJlY3QgCi0gICAgICAgIC8vIFBvcnRDb21wb3NpdGUgbGlzdAotICAgICAgICBpZihzZXJ2aWNlUU5hbWUgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFNlcnZpY2VRTmFtZXMoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAhY29tcG9zaXRlLmdldFNlcnZpY2VRTmFtZXMoKS5pc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIHBvcnRDb21wb3NpdGVJbmRleCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFBvcnRDb21wb3NpdGU+IHBjTGlzdCA9IGNvbXBvc2l0ZS5nZXRQb3J0Q29tcG9zaXRlcyhzZXJ2aWNlUU5hbWUpOwotICAgICAgICAgICAgaWYocGNMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkYmMgPSBwY0xpc3QuZ2V0KHBvcnRDb21wb3NpdGVJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYmMgPSBjb21wb3NpdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGlnbm9yZSBudWxsIHZhbHVlcyBvciB2YWx1ZXMgdGhhdCB3b3VsZCBjYXVzZSBhbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCi0gICAgICAgIGVsc2UgaWYocG9ydENvbXBvc2l0ZUluZGV4ID09IG51bGwgCi0gICAgICAgICAgICAgICAgfHwgCi0gICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFBvcnRDb21wb3NpdGVzKCkgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgcG9ydENvbXBvc2l0ZUluZGV4IDwgMAotICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgcG9ydENvbXBvc2l0ZUluZGV4ID49IGNvbXBvc2l0ZS5nZXRQb3J0Q29tcG9zaXRlcygpLnNpemUoKSkgewotICAgICAgICAgICAgZGJjID0gY29tcG9zaXRlOyAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgUG9ydENvbXBvc2l0ZSBpbnN0YW5jZQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXR1cm5pbmcgUG9ydENvbXBvc2l0ZSBhdCBpbmRleDogIiArIHBvcnRDb21wb3NpdGVJbmRleCArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gU2VydmljZURlc2NyaXB0aW9uSW1wbDogIiArIHRoaXMuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYmMgPSBjb21wb3NpdGUuZ2V0UG9ydENvbXBvc2l0ZXMoKS5nZXQocG9ydENvbXBvc2l0ZUluZGV4KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGRiYzsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRFbmRwb2ludERlc2NyaXB0aW9uKGphdmEubGFuZy5DbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnREZXNjcmlwdGlvbltdIGdldEVuZHBvaW50RGVzY3JpcHRpb24oQ2xhc3Mgc2VpQ2xhc3MpIHsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIHJldHVybkVuZHBvaW50RGVzYyA9IG51bGw7Ci0gICAgICAgIEFycmF5TGlzdDxFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4gbWF0Y2hpbmdFbmRwb2ludHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8RW5kcG9pbnREZXNjcmlwdGlvbkltcGw+KCk7Ci0gICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uIDogZGVmaW5lZEVuZHBvaW50RGVzY3JpcHRpb25zLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IERpc3BhdGNoIGVuZHBvaW50cyB3aWxsIG5vdCBoYXZlIGFuIGVuZHBvaW50SW50ZXJmYWNlIGJlY2F1c2UgdGhlIGRvIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgU0VJCi0gICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2VEZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBlbmRwb2ludFNFSUNsYXNzID0gZW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNFSUNsYXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50U0VJQ2xhc3MgIT0gbnVsbCAmJiBlbmRwb2ludFNFSUNsYXNzLmVxdWFscyhzZWlDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdFbmRwb2ludHMuYWRkKChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCllbmRwb2ludERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1hdGNoaW5nRW5kcG9pbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybkVuZHBvaW50RGVzYyA9IG1hdGNoaW5nRW5kcG9pbnRzLnRvQXJyYXkobmV3IEVuZHBvaW50RGVzY3JpcHRpb25JbXBsWzBdKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuRW5kcG9pbnREZXNjOwotICAgIH0KLQotICAgIC8vIEVORCBvZiBwdWJsaWMgYWNjZXNzb3IgbWV0aG9kcwotICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotICAgIHByaXZhdGUgdm9pZCBhZGRFbmRwb2ludERlc2NyaXB0aW9uKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVuZHBvaW50KSB7Ci0gICAgCWRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucy5wdXQoZW5kcG9pbnQuZ2V0UG9ydFFOYW1lKCksIGVuZHBvaW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBXc2RsRGVmaW5pdGlvbigpIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBubyBXU0RMIHByb3ZpZGVkLCBmb3IgZXhhbXBsZSB3aGVuIGNhbGxlZCBmcm9tIAotICAgICAgICAvLyBTZXJ2aWNlLmNyZWF0ZShRTmFtZSBzZXJ2aWNlTmFtZSkuCi0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInNldHVwV3NkbERlZmluaXRpb24oKSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoY29tcG9zaXRlLmlzU2VydmljZVByb3ZpZGVyKCkpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gIEN1cnJlbnRseSwgdGhlcmUgaXMgYSBidWcgd2hpY2ggYWxsb3dzIHRoZSB3c2RsRGVmaW5pdGlvbiB0byBiZSBwbGFjZWQKLSAgICAgICAgICAgIC8vICBvbiBlaXRoZXIgdGhlIGltcGwgY2xhc3MgY29tcG9zaXRlIG9yIHRoZSBzZWkgY29tcG9zaXRlLCBvciBib3RoLiBXZSBuZWVkIHRvCi0gICAgICAgICAgICAvLyAgbG9vayBpbiBib3RoIHBsYWNlcyBhbmQgZmluZCB0aGUgY29ycmVjdCBvbmUsIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoc2VydmljZVFOYW1lICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKHNlcnZpY2VRTmFtZSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgV1NETCBkZWZpbml0aW9uIGJ5IHNlcnZpY2UgUU5hbWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBjb21wb3NpdGUuZ2V0V3NkbERlZmluaXRpb24oc2VydmljZVFOYW1lKTsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gY29tcG9zaXRlLmdldFdzZGxVUkwoc2VydmljZVFOYW1lKTsKLSAgICAgICAgICAgICAgICB0aGlzLndzZGxVUkwgPSB1cmwgIT0gbnVsbCA/IHVybC50b1N0cmluZygpIDogbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG5vdCBudWxsMSIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG51bGwxIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3NkbEV4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlIGlmICgoKGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLmVuZHBvaW50SW50ZXJmYWNlKCkpKQotICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAoIShjb21wb3NpdGUuZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSA9PSBudWxsKSkpIHsKLSAgICAgICAgICAgICAgICAvL1RoaXMgaXMgZWl0aGVyIGFuIGltcGxpY2l0IFNFSSwgb3IgYSBXZWJTZXJ2aWNlIFByb3ZpZGVyCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRXc2RsRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGNvbXBvc2l0ZS5nZXRXc2RsVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFVSTCA9IHVybCA9PSBudWxsID8gbnVsbCA6IHVybC50b1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbm90IG51bGwxIik7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBudWxsMSIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3NkbEV4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIAlTdHJpbmcgd3NkbExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAJd3NkbExvY2F0aW9uID0gY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwgPyBjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkud3NkbExvY2F0aW9uKCkgOgotICAgICAgICAgICAgICAgIAkJY29tcG9zaXRlLmdldFdlYlNlcnZpY2VQcm92aWRlckFubm90KCkud3NkbExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCWlmKHdzZGxMb2NhdGlvbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgCQkJJiYKLSAgICAgICAgICAgICAgICAJCQkhIiIuZXF1YWxzKHdzZGxMb2NhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAJICAgIHNldFdTRExEZWZpbml0aW9uT25EQkMod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vVGhpcyBpbXBsIGNsYXNzIHNwZWNpZmllcyBhbiBTRUkuLi50aGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBUaGVyZSBpcyBhIGJ1ZwotICAgICAgICAgICAgICAgIC8vaW4gdGhlIHRvb2xpbmcgdGhhdCBhbGxvd3MgZm9yIHRoZSB3c2RsbG9jYXRpb24gdG8gYmUgc3BlY2lmZWQgb24gZWl0aGVyIHRoZQotICAgICAgICAgICAgICAgIC8vaW1wbC4gY2xhc3MsIG9yIHRoZSBTRUksIG9yIGJvdGguIFNvLCB3ZSBuZWVkIHRvIGxvb2sgZm9yIHRoZSB3c2RsIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgMS4gSWYgdGhlIFdzZGwgZXhpc3RzIG9uIHRoZSBTRUksIHRoZW4gY2hlY2sgZm9yIGl0IG9uIHRoZSBpbXBsLgotICAgICAgICAgICAgICAgIC8vICAgICAgICAgIDIuIElmIGl0IGlzIG5vdCBmb3VuZCBpbiBlaXRoZXIgbG9jYXRpb24sIGluIHRoYXQgb3JkZXIsIHRoZW4gZ2VuZXJhdGUKLQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERCQ01hcCgpLmdldChjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VpYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBTRUkgY2xhc3MgIiArIGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpICsgIiB3YXMgbm90IGZvdW5kLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWljICE9IG51bGwgJiYgc2VpYy5nZXRXc2RsRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgd3NkbCBkZWYgZnJvbSB0aGUgU0VJIGNvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJHZXQgdGhlIHdzZGwgZGVmaW5pdGlvbiBmcm9tIHRoZSBTRUkgY29tcG9zaXRlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IHNlaWMuZ2V0V3NkbFVSTCgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFVSTCA9IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG5vdCBudWxsMiIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbnVsbDIiKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2RsV3JhcHBlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXU0RMNEpXcmFwcGVyKHNlaWMuZ2V0V3NkbFVSTCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VpYy5nZXRXc2RsRGVmaW5pdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlLmdldFdzZGxEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3NldCB0aGUgd3NkbCBkZWYgZnJvbSB0aGUgaW1wbC4gY2xhc3MgY29tcG9zaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkdldCB0aGUgd3NkbCBkZWZpbml0aW9uIGZyb20gdGhlIGltcGwgY2xhc3MgY29tcG9zaXRlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG5vdCBudWxsMyIpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbnVsbDMiKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGNvbXBvc2l0ZS5nZXRXc2RsVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZGxVUkwgPSB1cmwgPT0gbnVsbCA/IG51bGwgOiB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcihjb21wb3NpdGUuZ2V0V3NkbFVSTCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRXc2RsRGVmaW5pdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0YWxvZ01hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIAlTdHJpbmcgd3NkbExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgCS8vIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiB0aGUgd3NkbExvY2F0aW9uIGlzIG9uIHRoZSBTRUkKLSAgICAgICAgICAgICAgICAgICAgCWlmKHNlaWMgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAJCQkmJgotICAgICAgICAgICAgICAgICAgICAJCQlzZWljLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbG9nLmRlYnVnKCJHZXQgdGhlIHdzZGwgbG9jYXRpb24gZnJvbSB0aGUgU0VJIGNvbXBvc2l0ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgd3NkbExvY2F0aW9uID0gc2VpYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKS53c2RsTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCQotICAgICAgICAgICAgICAgICAgICAJLy8gbm93IGNoZWNrIHRoZSBpbXBsCi0gICAgICAgICAgICAgICAgICAgIAlpZih3c2RsTG9jYXRpb24gPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAJICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAiIi5lcXVhbHMod3NkbExvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAJICAgICAgICBsb2cuZGVidWcoIkdldCB0aGUgd3NkbCBsb2NhdGlvbiBmcm9tIHRoZSBpbXBsIGNsYXNzIGNvbXBvc2l0ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgd3NkbExvY2F0aW9uID0gY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLndzZGxMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgICAgIAlpZih3c2RsTG9jYXRpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAJICAgICAgICAhIiIuZXF1YWxzKHdzZGxMb2NhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbG9nLmRlYnVnKCJ3c2RsIGxvY2F0aW9uID0iICsgd3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAkgICAgCi0gICAgICAgICAgICAgICAgICAgIAkgICAgdGhpcy53c2RsVVJMID0gd3NkbExvY2F0aW9uOwotICAgICAgICAgICAgICAgICAgICAJICAgIHNldFdTRExEZWZpbml0aW9uT25EQkMod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIndzZGxFeGNlcHRpb24iLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9EZXByZWNhdGUgdGhpcyBjb2RlIGJsb2NrIHdoZW4gTURRIGlzIGZ1bGx5IGludGVncmF0ZWQKLSAgICAgICAgfSBlbHNlIGlmICh3c2RsVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbm90IG51bGw0Iik7IAotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJuZXcgV1NETDRKV3JhcHBlci1Db25maWdDb250ZXh0IG51bGw0Iik7IAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMud3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcihuZXcgVVJMKHRoaXMud3NkbFVSTCksY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlcik7Ci0gICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3NkbE5vdEZvdW5kRXJyIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoInVua25vd25Ib3N0IiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiY29ubmVjdGlvblJlZnVzZWQiLCBlLmdldE1lc3NhZ2UoKSksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgidXJsU3RyZWFtIiwgZS5nZXRNZXNzYWdlKCkpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgid3NkbEV4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWNjZXB0cyBhIGxvY2F0aW9uIG9mIGEgV1NETCBkb2N1bWVudCBhbmQgYXR0ZW1wdHMgdG8KLSAgICAgKiBsb2FkIGFuZCBzZXQgdGhlIFdTREwgZGVmaW5pdGlvbiBvbiB0aGUgREJDIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFdTRExEZWZpbml0aW9uT25EQkMoU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgIAlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkJbG9nLmRlYnVnKCJBdHRlbXB0aW5nIHRvIGxvYWQgV1NETCBmaWxlIGZyb20gbG9jYXRpb24gc3BlY2lmaWVkIGluIGFubm90YXRpb246ICIgKwotCQkJCQl3c2RsTG9jYXRpb24pOwotCQl9Ci0JCWlmKGNvbXBvc2l0ZS5nZXRDbGFzc0xvYWRlcigpID09IG51bGwpIHsKLQkJCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0JCQkJbG9nLmRlYnVnKCJBIGNsYXNzbG9hZGVyIGNvdWxkIG5vdCBiZSBmb3VuZCBmb3IgY2xhc3M6ICIgKyBjb21wb3NpdGUuCi0JCQkJCQlnZXRDbGFzc05hbWUoKSArICIuIFRoZSBXU0RMIGZpbGU6ICIgKyB3c2RsTG9jYXRpb24gKyAiIHdpbGwgbm90IGJlICIgKwotCQkJCQkJCQkicHJvY2Vzc2VkLCBhbmQgdGhlIFNlcnZpY2VEZXNjcmlwdGlvbiB3aWxsIGJlIGJ1aWx0IGZyb20gIiArCi0JCQkJCQkJCSJhbm5vdGF0aW9ucyIpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCSAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotCQkgICAgICAgIGxvZy5kZWJ1ZygiQXR0ZW1wdGluZyB0byByZWFkIFdTREw6ICIgKyB3c2RsTG9jYXRpb24gKyAiIGZvciB3ZWIgIiArCi0JCSAgICAgICAgCQkic2VydmljZSBlbmRwb2ludDogIiArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5ldyBXU0RMNEpXcmFwcGVyLUNvbmZpZ0NvbnRleHQgbm90IG51bGw1Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygibmV3IFdTREw0SldyYXBwZXItQ29uZmlnQ29udGV4dCBudWxsNSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGdldFdTRExVUkwod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY2MgPSBjb21wb3NpdGUuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NkbFdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih1cmwsIGNjLCB0aGlzLmNhdGFsb2dNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2JhYmx5IHNob3VsZG4ndCBnZXQgaGVyZS4gIEJ1dCBpZiB3ZSBkbywgdXNlIGEgbWVtb3J5IHNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3NkbCB3cmFwcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZGxXcmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIodXJsLCB0aGlzLmNhdGFsb2dNYW5hZ2VyLCB0cnVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuc2V0V3NkbERlZmluaXRpb24od3NkbFdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpKTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQlsb2cuZGVidWcoIlRoZSBXU0RMIGZpbGU6ICIgKyB3c2RsTG9jYXRpb24gKyAiIGZvciBjbGFzczogIiArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSArIAotCQkJCQkJImNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuIFRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gd2lsbCBiZSBidWlsdCBmcm9tICIgKwotCQkJCQkJCQkiYW5ub3RhdGlvbnMiKTsKLQkJCX0KLQkJfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBvYnRhaW5pbmcgYSBVUkwgZm9yIHRoZSBnaXZlbiBXU0RMIGxvY2F0aW9uLiAgVGhlIFdTREwgd2lsbCBiZQotICAgICAqIGxvb2tlZCBmb3IgaW4gdGhlIGZvbGxvd2luZyBwbGFjZXMgaW4gdGhpcyBvcmRlcjoKLSAgICAgKiAKLSAgICAgKiBQcmVSZXNvbHV0aW9uKSBjaGVjayBmb3IgeG1sY2F0YWxvZyByZXNvbHZlcgotICAgICAqIDEpIEFzIGEgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aAotICAgICAqIDIpIEFzIGEgZnVsbHkgc3BlY2lmaWVkIFVSTAotICAgICAqIDMpIEFzIGEgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS4gIFRoaXMgaXMgYW5hbGFnb3VzIHRvIHdoYXQgdGhlIGdlbmVyYXRlZAotICAgICAqICAgIFNlcnZpY2UgY2xpZW50IGRvZXMuICBJcyBwcmVwZW5kcyAiZmlsZTovIiB0byB3aGF0ZXZlciBpcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICogICAgQFdlYlNlcnZpY2VDbGllbnQud3NkbExvY2F0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxMb2NhdGlvbiBUaGUgV1NETCBmb3Igd2hpY2ggYSBVUkwgaXMgd2FudGVkCi0gICAgICogQHJldHVybiBBIFVSTCBpZiB0aGUgV1NETCBjYW4gYmUgbG9jYXRlZCwgb3IgbnVsbAotICAgICAqLwotICAgIHByaXZhdGUgVVJMIGdldFdTRExVUkwoU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICAvLyBMb29rIGZvciB0aGUgV1NETCBmaWxlIGFzIGZvbGxvd3M6Ci0gICAgICAgIC8vIFByZVJlc29sdXRpb24pIGNoZWNrIGZvciB4bWxjYXRhbG9nIHJlc29sdmVyCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9IHJlc29sdmVXU0RMTG9jYXRpb25CeUNhdGFsb2cod3NkbExvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyAxKSBBcyBhIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGgKLQotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBjb21wb3NpdGUuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdXJsID0gZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uLCBsb2FkZXIpOyAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gVHJ5IHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlcgotICAgICAgICBpZih1cmwgPT0gbnVsbCl7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENvbnRleHRDbGFzc0xvYWRlcihudWxsKTsKLSAgICAgICAgICAgIGlmKGNsYXNzTG9hZGVyICE9IGxvYWRlcil7Ci0gICAgICAgICAgICAgICAgdXJsID0gZ2V0UmVzb3VyY2Uod3NkbExvY2F0aW9uLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAyKSBBcyBhIGZ1bGx5IHNwZWNpZmllZCBVUkwKLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVSTCBmb3Igd3NkbCBmaWxlOiAiICsgd3NkbExvY2F0aW9uICsgIiBjb3VsZCBub3QgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGV0ZXJtaW5lZCBieSBjbGFzc2xvYWRlci4uLiBsb29raW5nIGZvciBmaWxlIHJlZmVyZW5jZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXJsID0gY3JlYXRlV3NkbFVSTCh3c2RsTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIDMpIEFzIGEgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbS4gIFRoaXMgaXMgYW5hbGFnb3VzIHRvIHdoYXQgdGhlIGdlbmVyYXRlZAotICAgICAgICAvLyAgICBTZXJ2aWNlIGNsaWVudCBkb2VzLiAgSXMgcHJlcGVuZHMgImZpbGU6LyIgdG8gd2hhdGV2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZQotICAgICAgICAvLyAgICBAV2ViU2VydmljZUNsaWVudC53c2RsTG9jYXRpb24gZWxlbWVudC4KLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlVSTCBmb3Igd3NkbCBmaWxlOiAiICsgd3NkbExvY2F0aW9uICsgIiBjb3VsZCBub3QgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm91bmQgYXMgbG9jYWwgZmlsZSByZWZlcmVuY2UuLi4gcHJlcGVuZGluZyBmaWxlOiBwcm90b2NvbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSBVbml4L0xpbnV4IGZpbGUgcGF0aHMgYmVnaW4KLSAgICAgICAgICAgIC8vIHdpdGggYSAnLycuIFdoZW4gYWRkaW5nIHRoZSBwcmVmaXggJ2phcjpmaWxlOi8nIHdlIG1heSBlbmQKLSAgICAgICAgICAgIC8vIHVwIHdpdGggJy8vJyBhZnRlciB0aGUgJ2ZpbGU6JyBwYXJ0LiBUaGlzIGNhdXNlcyB0aGUgVVJMIAotICAgICAgICAgICAgLy8gb2JqZWN0IHRvIHRyZWF0IHRoaXMgbGlrZSBhIHJlbW90ZSByZXNvdXJjZQotICAgICAgICAgICAgaWYod3NkbExvY2F0aW9uLmluZGV4T2YoIi8iKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uLnN1YnN0cmluZygxLCB3c2RsTG9jYXRpb24ubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXJsID0gY3JlYXRlV3NkbFVSTCgiZmlsZTovIiArIHdzZGxMb2NhdGlvbik7Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIG9idGFpbiBVUkwgZm9yIFdTREwgZmlsZTogIiArIHdzZGxMb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ5IHVzaW5nIHByZXBlbmRlZCBmaWxlOiBwcm90b2NvbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVUkwgZ2V0UmVzb3VyY2UoZmluYWwgU3RyaW5nIHdzZGxMb2NhdGlvbiwgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0gICAgICAgIHJldHVybiAoVVJMKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLmdldFJlc291cmNlKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb25XU0RMI2dldFdTRExXcmFwcGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETFdyYXBwZXIgZ2V0V1NETFdyYXBwZXIoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsV3JhcHBlcjsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uV1NETCNnZXRXU0RMTG9jYXRpb24oKQotICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsVVJMOwotICAgIH0KLQotICAgIHB1YmxpYyBXU0RMV3JhcHBlciBnZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVkV3NkbFdyYXBwZXI7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRBeGlzQ29uZmlnQ29udGV4dChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWcpIHsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0gY29uZmlnOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldEF4aXNDb25maWdDb250ZXh0KCkKLSAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRBeGlzQ29uZmlnQ29udGV4dCgpIHsKLSAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dCA9IGdldENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KCkuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLQotICAgIH0KLQotICAgIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGdldENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KCkgewotCi0gICAgICAgIGlmIChjbGllbnRDb25maWdGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsaWVudENvbmZpZ0ZhY3RvcnkgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xpZW50Q29uZmlnRmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldFNlcnZpY2VDbGllbnQoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkKLSAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQ2xpZW50IGdldFNlcnZpY2VDbGllbnQoUU5hbWUgcG9ydFFOYW1lLCBPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5KSB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgcmV0dXJuU2VydmljZUNsaWVudCA9IG51bGw7Ci0gICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KHBvcnRRTmFtZSkpIHsKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihwb3J0UU5hbWUsIHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbmRwb2ludERlc2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVyblNlcnZpY2VDbGllbnQgPSBlbmRwb2ludERlc2MuZ2V0U2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBFbmRwb2ludCBEZXNjcmlwdGlvbiBmb3IgcG9ydCBRTmFtZQotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBmaW5kIHBvcnRRTmFtZTogIiArIHBvcnRRTmFtZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdW5kZXIgU2VydmljZURlc2NyaXB0aW9uOiAiICsgdG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gUG9ydFFOYW1lIGlzIGVtcHR5Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBvcnRRTmFtZSBhZ3J1bWVudCBpcyBpbnZhbGlkOyBpdCBjYW4gbm90IGJlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nOiAiICsgcG9ydFFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVyblNlcnZpY2VDbGllbnQ7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRTZXJ2aWNlUU5hbWUoKQotICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldFNlcnZpY2VRTmFtZSgpIHsKLSAgICAgICAgLy9JdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyB3aWxsIGFsd2F5cyBiZSBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yIHJhdGhlciB0aGFuCi0gICAgICAgIC8vYnVpbHQgdXAgZnJvbSB0aGUgY2xhc3Mgb3IgREJDCi0gICAgICAgIHJldHVybiBzZXJ2aWNlUU5hbWU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRTZXJ2aWNlUU5hbWUoUU5hbWUgdGhlTmFtZSkgewotICAgICAgICBzZXJ2aWNlUU5hbWUgPSB0aGVOYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSkFYV1NDYXRhbG9nTWFuYWdlciBnZXRDYXRhbG9nTWFuYWdlcigpIHsKLSAgICAJcmV0dXJuIGNhdGFsb2dNYW5hZ2VyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2lzTVRPTUVuYWJsZWQoamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmlzTVRPTUVuYWJsZWQoa2V5KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jaXNNVE9NRW5hYmxlZChqYXZhLmxhbmcuT2JqZWN0LCBDbGFzcyBzZWlDbGFzcykKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01UT01FbmFibGVkKE9iamVjdCBrZXksIENsYXNzIHNlaUNsYXNzKSB7Ci0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImlzTVRPTUVuYWJsZWQsIGtleT0gIiArIGtleSArICIsIHNlaUNsYXNzPSAiICsgc2VpQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIG10b21FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzcGFyc2VDb21wb3NpdGUgPSBnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS5nZXRTcGFyc2VDb21wb3NpdGUoa2V5KTsKLSAgICAgICAgaWYoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIHNlaUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHNlaVRvTVRPTSA9IChNYXA8U3RyaW5nLCBCb29sZWFuPikgCi0gICAgICAgICAgICAgICAgc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5nZXQoTURRQ29uc3RhbnRzLlNFSV9NVE9NX0VOQUJMRU1FTlRfTUFQKTsKLSAgICAgICAgICAgIGlmKHNlaVRvTVRPTSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgIHNlaVRvTVRPTS5nZXQoc2VpQ2xhc3MuZ2V0TmFtZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXRvbUVuYWJsZWQgPSBzZWlUb01UT00uZ2V0KHNlaUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBtdG9tRW5hYmxlZCA9IGlzTVRPTUVuYWJsZWQoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG10b21FbmFibGVkID0gaXNNVE9NRW5hYmxlZChrZXkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJpc01UT01FbmFibGVkLCBrZXk9ICIgKyBrZXkgKyAiLCBzZWlDbGFzcz0gIiArIHNlaUNsYXNzICsgIiwgaXNNVE9NRW5hYmxlZD0gIiArIG10b21FbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbXRvbUVuYWJsZWQ7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uI2dldEJpbmRpbmdQcm9wZXJpdGVzKGphdmEubGFuZy5PYmplY3QsIFN0cmluZyBrZXkpCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0QmluZGluZ1Byb3BlcnRpZXMoT2JqZWN0IHNlcnZpY2VEZWxlZ2F0ZUtleSwgU3RyaW5nIGtleSkgewotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCaW5kaW5nUHJvcGVydGllcywgc2VydmljZURlbGVnYXRlS2V5PSAiICsgc2VydmljZURlbGVnYXRlS2V5ICsgCi0gICAgICAgICAgICAgICAgICAgICAgIiwga2V5PSAiICsga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYmluZGluZ1Byb3BzID0gbnVsbDsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShzZXJ2aWNlRGVsZWdhdGVLZXkpOwotICAgICAgICBpZihzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgT2JqZWN0Pj4gYWxsQmluZGluZ1Byb3BzID0gKE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE9iamVjdD4+KSAKLSAgICAgICAgICAgICAgICBzcGFyc2VDb21wb3NpdGUuZ2V0UHJvcGVydGllcygpLmdldChNRFFDb25zdGFudHMuQklORElOR19QUk9QU19NQVApOwotICAgICAgICAgICAgYmluZGluZ1Byb3BzID0gYWxsQmluZGluZ1Byb3BzICE9IG51bGwgPyAoTWFwPFN0cmluZywgT2JqZWN0PikgYWxsQmluZGluZ1Byb3BzLmdldChrZXkpIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImdldEJpbmRpbmdQcm9wZXJ0aWVzLCBzZXJ2aWNlRGVsZWdhdGVLZXk9ICIgKyBzZXJ2aWNlRGVsZWdhdGVLZXkgKyAKLSAgICAgICAgICAgICAgICAgICAgICAiLCBrZXk9ICIgKyBrZXkgKyAiLCBwcm9wc1NpemU9ICIgKyAoYmluZGluZ1Byb3BzICE9IG51bGwgPyBiaW5kaW5nUHJvcHMuc2l6ZSgpIDogMCkpOwotICAgICAgICB9ICAgIAotCi0gICAgICAgIHJldHVybiBiaW5kaW5nUHJvcHM7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jZ2V0UHJlZmVycmVkUG9ydChqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRQcmVmZXJyZWRQb3J0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFByZWZlcnJlZFBvcnQoa2V5KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jaXNTZXJ2ZXJTaWRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclNpZGUoKSB7Ci0gICAgICAgIHJldHVybiBpc1NlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZ2V0REJDTWFwKCkgewotICAgICAgICByZXR1cm4gZGJjTWFwOwotICAgIH0KLQotICAgIHZvaWQgc2V0R2VuZXJhdGVkV3NkbFdyYXBwZXIoV1NETDRKV3JhcHBlciB3cmFwcGVyKSB7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVkV3NkbFdyYXBwZXIgPSB3cmFwcGVyOwotICAgIH0KLQotICAgIHZvaWQgc2V0V3NkbFdyYXBwZXIoV1NETDRKV3JhcHBlciB3cmFwcGVyKSB7Ci0gICAgICAgIHRoaXMud3NkbFdyYXBwZXIgPSB3cmFwcGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZURCQ0xJbnRlZ3JpdHkoKSB7Ci0KLSAgICAgICAgLy9GaXJzdCwgY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGlzIGlucHV0IGNvbXBvc2l0ZQotICAgICAgICAvL2FuZCByZXRyaWV2ZQotICAgICAgICAvL3RoZSBjb21wb3NpdGUgdGhhdCByZXByZXNlbnRzIHRoaXMgaW1wbAotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUludGVncml0eSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoImRiY2xJbnRlZ3JpdHlFcnIiLGV4LnRvU3RyaW5nKCksY29tcG9zaXRlLnRvU3RyaW5nKCkpLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBWYWxpZGF0ZXMgdGhlIGludGVncml0eSBvZiBhbiBpbXBsLiBjbGFzcy4gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseSBmb3IgYW4gU0VJIGNvbXBvc2l0ZQotICAgICAgKi8KLSAgICB2b2lkIHZhbGlkYXRlSW50ZWdyaXR5KCkgewotICAgICAgICAvL0luIEdlbmVyYWwsIHRoaXMgaW50ZWdyaXR5IGNoZWNrZXIgc2hvdWxkIGRvIGdyb3NzIGxldmVsIGNoZWNraW5nCi0gICAgICAgIC8vSXQgc2hvdWxkIG5vdCBiZSBzZXR0aW5nIHNwZWMtZGVmaW5lZCBkZWZhdWx0IHZhbHVlcywgYnV0IGNhbiBsb29rCi0gICAgICAgIC8vYXQgdGhpbmdzIGxpa2UgZW1wdHkgc3RyaW5ncyBvciBudWxsIHZhbHVlcwotCi0gICAgICAgIC8vVmVyaWZ5IHRoYXQsIGlmIHRoaXMgaW1wbGVtZW50cyBhIHN0cm9uZ2x5IHR5cGVkIHByb3ZpZGVyIGludGVyZmFjZSwgdGhhdCBpdAotICAgICAgICAvLyBhbHNvIGNvbnRhaW4gYSBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBwZXIgSkFYV1MgU2VjLiA1LjEKLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0KLSAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0SW50ZXJmYWNlc0xpc3QoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIC8vIFJlbWVtYmVyIGlmIHdlJ3ZlIHZhbGlkYXRlZCB0aGUgUHJvdmlkZXIgaW50ZXJmYWNlLiAgTGF0ZXIgd2UnbGwgbWFrZSBzdXJlIHRoYXQgaWYgd2UgaGF2ZSBhbiAKLSAgICAgICAgLy8gV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24sIHdlIGZvdW5kIGEgdmFsaWQgaW50ZXJmYWNlIGhlcmUuCi0gICAgICAgIGJvb2xlYW4gcHJvdmlkZXJJbnRlcmZhY2VWYWxpZCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VTdHJpbmcgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpbnRlcmZhY2VTdHJpbmcuZXF1YWxzKE1EUUNvbnN0YW50cy5QUk9WSURFUl9TT1VSQ0UpCi0gICAgICAgICAgICAgICAgICAgIHx8IGludGVyZmFjZVN0cmluZy5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX1NPQVApCi0gICAgICAgICAgICAgICAgICAgIHx8IGludGVyZmFjZVN0cmluZy5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX0RBVEFTT1VSQ0UpCi0gICAgICAgICAgICAgICAgICAgIHx8IGludGVyZmFjZVN0cmluZy5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX1NUUklORykKLSAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJmYWNlU3RyaW5nLmVxdWFscyhNRFFDb25zdGFudHMuUFJPVklERVJfT01FTEVNRU5UKSkgewotICAgICAgICAgICAgICAgIHByb3ZpZGVySW50ZXJmYWNlVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vVGhpcyBpcyBhIHByb3ZpZGVyIGJhc2VkIGVuZHBvaW50LCBtYWtlIHN1cmUgdGhlIGFubm90YXRpb24gZXhpc3RzCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjEiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vVmVyaWZ5IHRoYXQgV2ViU2VydmljZSBhbmQgV2ViU2VydmljZVByb3ZpZGVyIGFyZSBub3QgYm90aCBzcGVjaWZpZWQKLSAgICAgICAgLy9wZXIgSkFYV1MgLSBTZWMuIDcuNwotICAgICAgICBpZiAoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjIiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghcHJvdmlkZXJJbnRlcmZhY2VWYWxpZCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjMiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yIHBlciBKQVhXUyAtIFNlYyA1LjEKLSAgICAgICAgICAgIGlmICghdmFsaWRhdGVEZWZhdWx0Q29uc3RydWN0b3IoKSkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjQiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhbiBpbnZva2UgbWV0aG9kIHBlciBKQVhXUyAtIFNlYyA1LjEuMQotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUludm9rZU1ldGhvZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyNSIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vSWYgU2VydmljZU1vZGUgYW5ub3RhdGlvbiBzcGVjaWZpZXMgJ3BheWxvYWQnLCB0aGVuIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG5vdCB0eXBlZCB3aXRoCi0gICAgICAgICAgICAvLyBTT0FQTWVzc2FnZSBvciBEYXRhU291cmNlCi0gICAgICAgICAgICB2YWxpZGF0ZVByb3ZpZGVySW50ZXJmYWNlcygpOwotCi0gICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRTZXJ2aWNlTW9kZUFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZUludGVncml0eUVycjYiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgb24gdGhlIGNsYXNzIHRoYXQgdGhpcy5jbGFzc01vZGlmaWVycyBBcnJheSBkb2VzIG5vdCBjb250YWluIHRoZSBzdHJpbmdzCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIEZJTkFMIG9yIEFCU1RSQUNULCBidXQgZG9lcyBjb250YWluIFBVQkxJQwotICAgICAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIG9uIHRoZSBjbGFzcyB0aGF0IGEgcHVibGljIGNvbnN0cnVjdG9yIGV4aXN0cwotICAgICAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIG9uIHRoZSBjbGFzcyB0aGF0IGEgZmluYWxpemUoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgICAgICAgICBpZiAoIURlc2NyaXB0aW9uVXRpbHMuaXNFbXB0eShjb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkud3NkbExvY2F0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUuZ2V0V3NkbERlZmluaXRpb24oZ2V0U2VydmljZVFOYW1lKCkpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRXc2RsRGVmaW5pdGlvbigpID09IG51bGwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0V3NkbFVSTCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyNyIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS53c2RsTG9jYXRpb24oKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8JCXNldFdlYlNlcnZpY2VBbm5vdERlZmF1bHRzKHRydWU9aW1wbCk7IE11c3QgaGFwcGVuIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyBhbm5vdAotICAgICAgICAgICAgICAgIGlmICghRGVzY3JpcHRpb25VdGlscy5pc0VtcHR5KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmNNYXAuZ2V0KGNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmeSB0aGF0IHdlIGNhbiBmaW5kIHRoZSBTRUkgaW4gdGhlIGNvbXBvc2l0ZSBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWljID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyOCIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgb25seSBjbGFzcyBhbm5vdGF0aW9ucyBhcmUgV2ViU2VydmljZSBhbmQgSGFuZGxlckNoYWluCi0gICAgICAgICAgICAgICAgICAgIC8vIChwZXIgSlNSMTgxIFNlYy4gMy4xKS4gIE5vdGUgdGhhdCB0aGlzIGFwcGxpZXMgdG8gSlNSLTE4MSBhbm5vdGF0aW9uczsgdGhlIHJlc3RyaWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IGFwcGx5IHRvIEpTUi0yMjQgYW5ub3RhdGlvbnMgc3VjaCBhcyBCaW5kaW5nVHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldFNvYXBCaW5kaW5nQW5ub3QoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcG9zaXRlLmdldFdlYkZhdWx0QW5ub3QoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcG9zaXRlLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyOSIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvL1ZlcmlmeSB0aGF0IFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgbmFtZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgLy8ocGVyIEpTUjE4MSBTZWMuIDMuMSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoY29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpLm5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlSW50ZWdyaXR5RXJyMTAiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0V2ViU2VydmljZUFubm90KCkubmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVNFSShzZWljKTsKLSAgICAgICAgICAgICAgICAgICAgLy9WZXJpZnkgdGhhdCB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gY2xhc3MgaW1wbGVtZW50cyBhbGwgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlSW1wbGVtZW50YXRpb24oc2VpYyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9WZXJpZnkgdGhhdCB0aGlzIGltcGwuIGNsYXNzIGRvZXMgbm90IGNvbnRhaW4gYW55IEBXZWJNZXRob2QgYW5ub3RhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdlYk1ldGhvZEFubm90YXRpb25zRXhpc3QoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnIxMSIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy90aGlzIGlzIGFuIGltcGxpY2l0IFNFSSAoaS5lLiBpbXBsIHcvb3V0IGVuZHBvaW50SW50ZXJmYWNlCi0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrSW1wbGljaXRTRUlBZ2FpbnN0V1NETCgpOwotICAgICAgICAgICAgICAgICAgICAvLwlUT0RPOglDYWxsIFZhbGlkYXRlV2ViTWV0aG9kQW5ub3RzKCkKLSAgICAgICAgICAgICAgICAgICAgLy8JCQktIHRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgdGhhdCBhbGwgbWV0aG9kcyBhcmUgcHVibGljIC0gPz8/Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsgLy90aGlzIGlzIGFuIGludGVyZmFjZS4uLndlIHNob3VsZCBub3QgYmUgcHJvY2Vzc2luZyBpbnRlcmZhY2VzIGhlcmUKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnIxMiIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBTT0FQQmluZGluZyBhbm5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZS5nZXRTb2FwQmluZGluZ0Fubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb21wb3NpdGUuZ2V0U29hcEJpbmRpbmdBbm5vdCgpLnVzZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5FTkNPREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbnRlZ3JpdHlFcnIxMyIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7ICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNoZWNrTWV0aG9kc0FnYWluc3RXU0RMKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZSB0aGVyZSBpcyBhbiBpbnZva2UgbWV0aG9kIG9uIHRoZSBjb21wb3NpdGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlSW52b2tlTWV0aG9kKCkgewotICAgICAgICBib29sZWFuIHZhbGlkSW52b2tlTWV0aG9kID0gZmFsc2U7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGludm9rZU1ldGhvZExpc3QgPQotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgiaW52b2tlIik7Ci0gICAgICAgIGlmIChpbnZva2VNZXRob2RMaXN0ICE9IG51bGwgJiYgIWludm9rZU1ldGhvZExpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICB2YWxpZEludm9rZU1ldGhvZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbGlkSW52b2tlTWV0aG9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoYXQsIGlmIHVzaW5nIFBBWUxPQUQgbW9kZSwgdGhlbiBpbnRlcmZhY2VzIGxpc3QgY2Fubm90IGNvbnRhaW4gU09BUE1lc3NhZ2Ugb3IKLSAgICAgKiBEYXRhU291cmNlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvdmlkZXJJbnRlcmZhY2VzKCkgewotCi0gICAgICAgIC8vIERlZmF1bHQgZm9yIFNlcnZpY2VNb2RlIGlzICdQQVlMT0FEJy4gU28sIGlmIGl0IGlzIHNwZWNpZmllZCAgKGV4cGxpY2l0bHkgb3IKLSAgICAgICAgLy8gaW1wbGljaXRseSkgdGhlbiB2ZXJpZnkgdGhhdCB3ZSBhcmUgbm90IGltcGxlbWVudGluZyBpbXByb3BlciBpbnRlcmZhY2VzKQotICAgICAgICBpZiAoKGNvbXBvc2l0ZS5nZXRTZXJ2aWNlTW9kZUFubm90KCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB8fCBjb21wb3NpdGUuZ2V0U2VydmljZU1vZGVBbm5vdCgpLnZhbHVlKCkgPT0gamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5QQVlMT0FEKSB7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGNvbXBvc2l0ZS5nZXRJbnRlcmZhY2VzTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VTdHJpbmcgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlU3RyaW5nLmVxdWFscyhNRFFDb25zdGFudHMuUFJPVklERVJfU09BUCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGludGVyZmFjZVN0cmluZy5lcXVhbHMoTURRQ29uc3RhbnRzLlBST1ZJREVSX0RBVEFTT1VSQ0UpKSB7Ci0gICAgICAgICAgICAgICAgCQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlUElzRXJyMSIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBXZSBhcmUgaW4gTUVTU0FHRSBtb2RlCi0gICAgICAgICAgICAvLyBDb25mb3JtYW5jZTogSkFYV1MgU3BlYy4tIFNlYy4gNC4zIChqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UpCi0KLSAgICAgICAgICAgIC8vIFJFVklFVzogU2hvdWxkIHRoZSBwcm92aWRlciBpbnRlcmZhY2UgdmFsaWRhdGlvbiBiZSBtb3ZlZCB0byBwb3N0LWNvbnN0cnVjdGlvbiB2YWxpZGF0aW9uLCAKLSAgICAgICAgICAgIC8vIHNpbmNlIGl0IHNlZW1zIHRoYXQgdGhlIGxvZ2ljIHRvIHVuZGVyc3RhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBiaW5kaW5nIHR5cGUgCi0gICAgICAgICAgICAvLyAoc2VlIGNvbW1lbnQgYmVsb3cpIHNob3VsZCBiZSBsZWZ0IHRvIHRoZSBjcmVhdGlvbiBvZiB0aGUgRGVzY3JpcHRpb24gb2JqZWN0cy4KLSAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29tcG9zaXRlLmdldEJpbmRpbmdUeXBlQW5ub3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ1R5cGUgPSBjb21wb3NpdGUuZ2V0QmluZGluZ1R5cGVBbm5vdCgpLnZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGNvbXBvc2l0ZS5nZXRJbnRlcmZhY2VzTGlzdCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VTdHJpbmcgPSBpdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChpbnRlcmZhY2VTdHJpbmcuZXF1YWxzKE1EUUNvbnN0YW50cy5QUk9WSURFUl9TT0FQKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBCaW5kaW5nVHlwZSBpcyBTT0FQL0hUVFAgd2l0aCBTT0FQTWVzc2FnZQotCQkJCQkvLyBvYmplY3QsIERlZmF1bHQgZm9yIEJpbmRpbmcgVHlwZSBpcyBTT0FQL0hUVFAKLQkJCQkJaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoYmluZGluZ1R5cGUpCi0JCQkJCQkJJiYgIWJpbmRpbmdUeXBlCi0JCQkJCQkJCQkuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpCi0JCQkJCQkJJiYgIWJpbmRpbmdUeXBlCi0JCQkJCQkJCQkuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpCi0JCQkJCQkJJiYgIWJpbmRpbmdUeXBlCi0JCQkJCQkJCQkuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcpCi0JCQkJCQkJJiYgIWJpbmRpbmdUeXBlCi0JCQkJCQkJCQkuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORykKLQkJCQkJCQkmJiAhYmluZGluZ1R5cGUKLQkJCQkJCQkJCS5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19NVE9NX0JJTkRJTkcpCi0JCQkJCQkJJiYgIWJpbmRpbmdUeXBlCi0JCQkJCQkJICAgICAgICAuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQX0hUVFBfQklORElORykpCi0KLQkJCQkJCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMKLQkJCQkJCQkJLmdldE1lc3NhZ2UoInZhbGlkYXRlUElzRXJyMiIsIGNvbXBvc2l0ZQotCQkJCQkJCQkJCS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50ZXJmYWNlU3RyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKE1EUUNvbnN0YW50cy5QUk9WSURFUl9EQVRBU09VUkNFKSkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBCaW5kaW5nVHlwZSBpcyBYTUwvSFRUUCB3aXRoIERhdGFTb3VyY2Ugb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkoYmluZGluZ1R5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWJpbmRpbmdUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpKQotICAgICAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZVBJc0VycjMiLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGUgdGhlcmUgaXMgYSBkZWZhdWx0IG5vLWFyZ3VtZW50IGNvbnN0cnVjdG9yIG9uIHRoZSBjb21wb3NpdGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkgewotICAgICAgICBib29sZWFuIHZhbGlkRGVmYXVsdEN0b3IgPSBmYWxzZTsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gY29uc3RydWN0b3JMaXN0ID0KLSAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoIjxpbml0PiIpOwotICAgICAgICBpZiAoY29uc3RydWN0b3JMaXN0ICE9IG51bGwgJiYgIWNvbnN0cnVjdG9yTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBwdWJsaWMgY29uc3RydWN0b3JzOyBtYWtlIHN1cmUgdGhlcmUgaXMgb25lIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzLgotICAgICAgICAgICAgZm9yIChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBjaGVja0N0b3IgOiBjb25zdHJ1Y3Rvckxpc3QpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwYXJhbUxpc3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDdG9yLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICAgICAgICAgIGlmIChwYXJhbUxpc3QgPT0gbnVsbCB8fCBwYXJhbUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkRGVmYXVsdEN0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsaWREZWZhdWx0Q3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVJbXBsZW1lbnRhdGlvbihEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2VpYykgewotICAgICAgICAvKgotICAgICAgICAgKiAgVmVyaWZ5IHRoYXQgYW4gaW1wbCBjbGFzcyBpbXBsZW1lbnRzIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgU0VJLiBXZSBoYXZlIHRvIHZlcmlmeSB0aGlzIAotICAgICAgICAgKiAgYmVjYXVzZSBhbiBpbXBsIGNsYXNzIGlzIG5vdCByZXF1aXJlZCB0byBhY3R1YWxseSB1c2UgdGhlICdpbXBsZW1lbnRzJyBjbGF1c2UuIFNvLCBpZiAKLSAgICAgICAgICogIGl0IGRvZXNuJ3QsIHRoZSBKYXZhIGNvbXBpbGVyIHdvbid0IGNhdGNoIGl0LiBEb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNoYWluaW5nIAotICAgICAgICAgKiAgYmVjYXVzZSBvbmx5IG9uZSBFbmRwb2ludEludGVyZmFjZSBjYW4gYmUgc3BlY2lmaWVkLCBhbmQgdGhlIFNFSSBjYW5ub3Qgc3BlY2lmeSBhbiAKLSAgICAgICAgICogIEVuZHBvaW50SW50ZXJmYWNlLCBzbyB0aGUgSmF2YSBjb21waWxlciB3aWxsIHRha2UgY2FyZSBvZiBldmVyeXRoaW5nIGVsc2UuCi0gICAgICAgICAqICAKLSAgICAgICAgICogIE5vdGUsIGhvd2V2ZXIsIHRoYXQgd2UgZG8gbmVlZCB0byB0YWtlIG92ZXJsb2FkZWQgbWV0aG9kcyBpbnRvIGEgY29uc2lkZXJhdGlvbi4gIFRoZQotICAgICAgICAgKiAgc2FtZSBtZXRob2QgbmFtZSBjYW4gYmUgc3BlY2lmaWVkIGZvciBtdWx0aXBsZSBtZXRob2RzLCBidXQgdGhleSBjYW4gaGF2ZSBkaWZmZXJlbnQKLSAgICAgICAgICogIHBhcmFtZXRlcnMuICBOb3RlIHRoYXQgbWV0aG9kcyB3aGljaCBkaWZmZXIgb25seSBpbiB0aGUgcmV0dXJuIHR5cGUgb3IgdGhlIGV4Y2VwdGlvbnMKLSAgICAgICAgICogIHRocm93biBhcmUgbm90IG92ZXJsb2FkZWQgKGFuZCB0aGVyZWZvcmUgd291bGQgY2F1c2UgYSBjb21waWxlIGVycm9yKS4KLSAgICAgICAgICovCi0KLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gaW1wbE1ldGhvZHMgPSBjb21wb3NpdGUuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpOwotICAgICAgICAvLyBBZGQgbWV0aG9kcyBkZWNsYXJlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24ncyBzdXBlcmNsYXNzCi0gICAgICAgIGFkZFN1cGVyQ2xhc3NNZXRob2RzKGltcGxNZXRob2RzLCBjb21wb3NpdGUpOwotCi0gICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IHNlaU1ldGhvZHMgPSBzZWljLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKTsKLSAgICAgICAgLy8gQWRkIGFueSBtZXRob2RzIGRlY2xhcmVkIGluIHN1cGVyaW50ZXJmYWNlcyBvZiB0aGUgU0VJCi0gICAgICAgIGFkZFN1cGVyQ2xhc3NNZXRob2RzKHNlaU1ldGhvZHMsIHNlaWMpOwotCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgdGhlIG1ldGhvZHMgaW4gdGhlIFNFSSAoaW5jbHVkaW5nIGFueSBpbmhlcml0ZWQgZnJvbSBzdXBlcmludGVyZmFjZXMpIGFyZQotICAgICAgICAvLyBpbXBsZW1lbnRlZCBieSB0aGUgYmVhbiAoaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzIG9uIHRoZSBiZWFuKSwgdGFraW5nIGludG8KLSAgICAgICAgLy8gYWNjb3VudCBvdmVybG9hZGVkIG1ldGhvZHMuCi0gICAgICAgIEl0ZXJhdG9yPE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiB2ZXJpZnlTRUlJdGVyYXRvciA9IHNlaU1ldGhvZHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHZlcmlmeVNFSUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc2VpTURDID0gdmVyaWZ5U0VJSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgdGhpcyBTRUkgbWV0aG9kLiAgU2luY2Ugd2UgaGF2ZSB0byBhY2NvdW50Ci0gICAgICAgICAgICAvLyBmb3IgbWV0aG9kIG92ZXJsb2FkaW5nLCB3ZSBsb29rIGZvciBBTEwgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIAotICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24sIHRoZW4gZnJvbSB0aGF0IGNvbGxlY3Rpb24gb2YgbWV0aG9kcywgd2UgbG9vayBmb3Igb25lIHRoYXQgaGFzIHRoZSAKLSAgICAgICAgICAgIC8vIHNhbWUgcGFyYW1ldGVycy4gIElmIHdlIGZpbmQgb25lIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycywgdGhlbiB3ZSBjaGVjayB0aGUgcmV0dXJuCi0gICAgICAgICAgICAvLyBhbmQgZXhjZXB0aW9ucy4gIE5vdGUgdGhhdCBpbiBKYXZhLCBvdmVybG9hZGVkIG1ldGhvZHMgYXJlIG9uZXMgdGhhdCBoYXZlIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBuYW1lIGJ1dCBkaWZmZXJlbnQgcGFyYW1ldGVyczsgYSBkaWZmZXJlbmNlIGluIHRoZSByZXR1cm4gdHlwZSBvciB0aHJvd24gZXhjZXB0aW9ucwotICAgICAgICAgICAgLy8gZG9lcyBub3QgY29uc3RpdHV0ZSBvdmVybG9hZGluZyBhbmQgaXMgYSBjb21waWxlIGVycm9yLgotICAgICAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGltcGxNRENJdGVyYXRvciA9IGltcGxNZXRob2RzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBib29sZWFuIG1ldGhvZEltcGxGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKGltcGxNRENJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsTURDID0gaW1wbE1EQ0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoc2VpTURDLmdldE1ldGhvZE5hbWUoKS5lcXVhbHMoaW1wbE1EQy5nZXRNZXRob2ROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBtZXRob2QgbmFtZXMgbWF0Y2gsIHNvIG5vdyBjaGVjayB0aGUgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVNZXRob2RQYXJhbWV0ZXJzKHNlaU1EQywgaW1wbE1EQywgc2VpYy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RJbXBsRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXJzIGRpZG4ndCBtYXRjaCwgc28gd2UnbGwgY2hlY2sgdGhlIG5leHQgCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbXBsZW1udGF0aW9uIG1ldGhvZCBvbiB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhlIGlubmVyIGxvb3AuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIGFuZCB0aGUgcGFyYW1ldGVycyBtYXRjaGVkLCB0aGVuIHdlJ3ZlIGZvdW5kIHRoZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50YXRpb24sIGV2ZW4gaWYgaXQgd2FzIG92ZXJsb2FkZWQuIE5vdyBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGFuZAotICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd24gZXhjZXB0aW9ucy4gIE5vdGUgdGhlc2Ugd2lsbCBtZXRob2RzIHRocm93IGV4Y2VwdGlvbnMgaWYgdmFsaWRhdGlvbiBmYWlscy4KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYWxsIHRoZSB2YWxpZGF0aW9uIHBhc3Nlcywgd2UgY2FuIGJyZWFrIG91dCBvZiB0aGUgaW5uZXIgbG9vcCBzaW5jZSB3ZSAKLSAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNlaSBtZXRob2QuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RJbXBsRm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlTWV0aG9kRXhjZXB0aW9ucyhzZWlNREMsIGltcGxNREMsIHNlaWMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVNZXRob2RSZXR1cm5WYWx1ZShzZWlNREMsIGltcGxNREMsIHNlaWMuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghbWV0aG9kSW1wbEZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZGlkbid0IGZpbmQgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIFNFSSBtZXRob2QsIHNvIHRocm93IGEgdmFsaWRhdGlvbgotICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVJbXBsRXJyIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgCQkJCXNlaU1EQy5nZXRNZXRob2ROYW1lKCksc2VpYy5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVycyhNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMsCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gc2VpUERDTGlzdCA9IHNlaU1EQwotICAgICAgICAgICAgLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBpbXBsUERDTGlzdCA9IGltcGxNREMKLSAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKTsKLSAgICAgICAgaWYgKChzZWlQRENMaXN0ID09IG51bGwgfHwgc2VpUERDTGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAmJiAoaW1wbFBEQ0xpc3QgPT0gbnVsbCB8fCBpbXBsUERDTGlzdC5pc0VtcHR5KCkpKSB7Ci0gICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gcGFyYW1ldGVycyBvbiB0aGUgU0VJIG9yIHRoZSBpbXBsOyBhbGwgaXMgd2VsbAotICAgICAgICB9IGVsc2UgaWYgKChzZWlQRENMaXN0ID09IG51bGwgfHwgc2VpUERDTGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAmJiAhKGltcGxQRENMaXN0ID09IG51bGwgfHwgaW1wbFBEQ0xpc3QuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVNZXRob2RQYXJhbUVycjEiLGltcGxQRENMaXN0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLHNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKHNlaVBEQ0xpc3QgIT0gbnVsbCAmJiAhc2VpUERDTGlzdC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAmJiAhKGltcGxQRENMaXN0ICE9IG51bGwgJiYgIWltcGxQRENMaXN0LmlzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kUGFyYW1FcnIyIixzZWlQRENMaXN0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLHNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2VpUERDTGlzdC5zaXplKCkgIT0gaW1wbFBEQ0xpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZU1ldGhvZFBhcmFtRXJyMyIsCi0gICAgICAgICAgICAJCQkJbmV3IEludGVnZXIoc2VpUERDTGlzdC5zaXplKCkpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAJCQkJbmV3IEludGVnZXIoaW1wbFBEQ0xpc3Quc2l6ZSgpKS50b1N0cmluZygpLGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwKLSAgICAgICAgICAgIAkJCQlzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLGNsYXNzTmFtZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBvcmRlciBhbmQgdHlwZSBvZiBwYXJhbWV0ZXJzIG1hdGNoCi0gICAgICAgICAgICAvLyBSRVZJRVc6IFRoaXMgY2hlY2tzIGZvciBzdHJpY3QgZXF1YWxpdHkgb2YgdGhlIGZ1bGx5IHF1YWxpZmllZAotICAgICAgICAgICAgLy8gdHlwZS4gSXQgZG9lcyBub3QKLSAgICAgICAgICAgIC8vIHRha2UgaW50byBjb25zaWRlcmF0aW9uIG9iamVjdCBoaWVyYWNoeS4gRm9yIGV4YW1wbGUgZm9vKEFuaW1hbCkKLSAgICAgICAgICAgIC8vIHdpbGwgbm90IGVxdWFsIGJhcihaZWJyYSkKLSAgICAgICAgICAgIGJvb2xlYW4gcGFyYW1ldGVyc01hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgIFN0cmluZyBmYWlsaW5nTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKGludCBwYXJhbU51bWJlciA9IDA7IHBhcmFtTnVtYmVyIDwgc2VpUERDTGlzdC5zaXplKCk7IHBhcmFtTnVtYmVyKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VpUGFyYW1UeXBlID0gc2VpUERDTGlzdC5nZXQocGFyYW1OdW1iZXIpLmdldFBhcmFtZXRlclR5cGUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wbFBhcmFtVHlwZSA9IGltcGxQRENMaXN0LmdldChwYXJhbU51bWJlcikuZ2V0UGFyYW1ldGVyVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmICghc2VpUGFyYW1UeXBlLmVxdWFscyhpbXBsUGFyYW1UeXBlKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzTWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gaW5zZXJ0cyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YocGFyYW1OdW1iZXIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWlQYXJhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbFBhcmFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VpTURDLmdldE1ldGhvZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZhaWxpbmdNZXNzYWdlID0gTWVzc2FnZXMuZ2V0TWVzc2FnZSgic2VydmljZURlc2NyaXB0aW9uSW1wbFZhbGlkYXRpb25FcnIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzTWF0Y2gpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGZhaWxpbmdNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1ldGhvZFJldHVyblZhbHVlKE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaU1EQywKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbE1EQywgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBTdHJpbmcgc2VpUmV0dXJuVmFsdWUgPSBzZWlNREMuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBTdHJpbmcgaW1wbFJldHVyblZhbHVlID0gaW1wbE1EQy5nZXRSZXR1cm5UeXBlKCk7Ci0KLSAgICAgICAgaWYgKHNlaVJldHVyblZhbHVlID09IG51bGwgJiYgaW1wbFJldHVyblZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIE5laXRoZXIgc3BlY2lmeSBhIHJldHVybiB2YWx1ZTsgYWxsIGlzIHdlbGwKLSAgICAgICAgfSBlbHNlIGlmIChzZWlSZXR1cm5WYWx1ZSA9PSBudWxsICYmIGltcGxSZXR1cm5WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZU1ldGhvZFJWRXJyMSIsaW1wbFJldHVyblZhbHVlLAotICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSxzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLGNsYXNzTmFtZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHNlaVJldHVyblZhbHVlICE9IG51bGwgJiYgaW1wbFJldHVyblZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kUlZFcnIyIixzZWlSZXR1cm5WYWx1ZSwKLSAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpTURDLmdldE1ldGhvZE5hbWUoKSxjbGFzc05hbWUpKTsKLSAgICAgICAgfSBlbHNlIGlmICghc2VpUmV0dXJuVmFsdWUuZXF1YWxzKGltcGxSZXR1cm5WYWx1ZSkpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kUlZFcnIzIixzZWlSZXR1cm5WYWx1ZSxpbXBsUmV0dXJuVmFsdWUsCi0gICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLHNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4Y2VwdGlvbnMgKCBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMsIAotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsTURDLAotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0KLSAgICAgICAgU3RyaW5nW10gc2VpRXhjZXB0aW9ucyA9IHNlaU1EQy5nZXRFeGNlcHRpb25zKCk7Ci0gICAgICAgIFN0cmluZ1tdIGltcGxFeGNlcHRpb25zID0gaW1wbE1EQy5nZXRFeGNlcHRpb25zKCk7Ci0KLSAgICAgICAgLy8gQW4gaW1wbCBjYW4gY2hvb3NlIHRvIHRocm93IGZld2VyIGNoZWNrZWQgZXhjZXB0aW9ucyB0aGFuIGRlY2xhcmVkIG9uIHRoZSBTRUksIGJ1dCBub3QgbW9yZS4KLSAgICAgICAgLy8gVGhpcyBpcyBhbmFsYWdvdXMgdG8gdGhlIEphdmEgcnVsZXMgZm9yIGludGVyZmFjZXMuCi0gICAgICAgIGlmIChzZWlFeGNlcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChpbXBsRXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTRUkgZGVsY2FyZXMgbm8gY2hlY2tlZCBleGNlcHRpb25zLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGhhcyBjaGVja2VkIGV4Y2VwdGlvbnMsIHdoaWNoIGlzIGFuIGVycm9yCi0gICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlTWV0aG9kRXhjZXB0aW9uRXJyMSIsCi0gICAgICAgICAgICAgICAgCQkJCWNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSxzZWlNREMuZ2V0TWV0aG9kTmFtZSgpLGNsYXNzTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGltcGxFeGNlcHRpb25zID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIHRocm93cyBmZXdlciBjaGVja2VkIGV4Y2VwdGlvbnMgdGhhbiBTRUksIHdoaWNoIGlzIE9LLgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayB0aGUgbGlzdCBsZW5ndGg7IEFuIGltcGxlbWVudGF0aW9uIGNhbiBub3QgZGVjbGFyZSBtb3JlIGV4Y2VwdGlvbnMgdGhhbiB0aGUgU0VJCi0gICAgICAgIGlmIChzZWlFeGNlcHRpb25zLmxlbmd0aCA8IGltcGxFeGNlcHRpb25zLmxlbmd0aCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVNZXRob2RFeGNlcHRpb25FcnIyIiwKLSAgICAgICAgICAgIAkJCQluZXcgSW50ZWdlcihpbXBsRXhjZXB0aW9ucy5sZW5ndGgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAJCQkJbmV3IEludGVnZXIoc2VpRXhjZXB0aW9ucy5sZW5ndGgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAJCQkJY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLHNlaU1EQy5nZXRNZXRob2ROYW1lKCksY2xhc3NOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGVhY2ggY2hlY2tlZCBleGNlcHRpb24gZGVjbGFyZWQgYnkgdGhlIAotICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpcyBvbiB0aGUgU0VJIGFsc28KLSAgICAgICAgaWYgKGltcGxFeGNlcHRpb25zLmxlbmd0aCA+IDApIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBpbXBsRXhjZXB0aW9uIDogaW1wbEV4Y2VwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kSXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoc2VpRXhjZXB0aW9ucy5sZW5ndGggPiAwKSB7ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHNlaUV4Y2VwdGlvbiA6IHNlaUV4Y2VwdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWlFeGNlcHRpb24uZXF1YWxzKGltcGxFeGNlcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZEl0KSB7ICAgIAkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlNZXNzYWdlcy5nZXRNZXNzYWdlKCJ2YWxpZGF0ZU1ldGhvZEV4Y2VwdGlvbkVycjMiLGltcGxFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIAkJCQljb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpTURDLmdldE1ldGhvZE5hbWUoKSxjbGFzc05hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW55IG1ldGhvZHMgZGVjbGFyZWQgaW4gc3VwZXJjbGFzc2VzIHRvIHRoZSBMaXN0LiAgVGhlIGhpZXJhY2h5IHN0YXJ0aW5nIHdpdGggdGhlIERCQwotICAgICAqIHdpbGwgYmUgd2Fsa2VkIHVwIHJlY3Vyc2l2ZWx5LCBhZGRpbmcgbWV0aG9kcyBmcm9tIGVhY2ggcGFyZW50IERCQyBlbmNvdW50ZXJlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgY2FuIGJlIHVzZWQgZm9yIGVpdGhlciBjbGFzc2VzIG9yIGludGVyZmFjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kTGlzdCBUaGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIG1ldGhvZHMsIGluY2x1ZGluZyBvdmVybG9hZGVkIG9uZXMKLSAgICAgKiBAcGFyYW0gZGJjIFRoZSBjb21wb3NpdGUgdG8gYmUgY2hlY2tlZCBmb3IgbWV0aG9kcyB0byBiZSBhZGRlZCB0byB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRTdXBlckNsYXNzTWV0aG9kcyhMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZXRob2RMaXN0LCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdXBlckRCQyA9IGRiY01hcC5nZXQoZGJjLmdldFN1cGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICBpZiAoc3VwZXJEQkMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1JdGVyID0gc3VwZXJEQkMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAobUl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIG1ldGhvZExpc3QuYWRkKG1kYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRTdXBlckNsYXNzTWV0aG9kcyhtZXRob2RMaXN0LCBzdXBlckRCQyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICAqIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQsIGlmIHRoZXJlIGFyZSBhbnkgV2ViTWV0aG9kIHdpdGggZXhjbHVkZSA9PSBmYWxzZSwgdGhlbgotICAgICAgKiBtYWtlIHN1cmUgdGhhdCB3ZSBmaW5kIGFsbCBvZiB0aG9zZSBtZXRob2RzIHJlcHJlc2VudGVkIGluIHRoZSB3c2RsLiBIb3dldmVyLCBpZgotICAgICAgKiB0aGVyZSBhcmUgbm8gZXhjbHVzaW9ucyA9PSBmYWxzZSwgb3IgdGhlcmUgYXJlIG5vIFdlYk1ldGhvZCBhbm5vdGF0aW9ucywgdGhlbiB2ZXJpZnkKLSAgICAgICogdGhhdCBhbGwgdGhlIHB1YmxpYyBtZXRob2RzIGFyZSBpbiB0aGUgd3NkbAotICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNZXRob2RzQWdhaW5zdFdTREwoKSB7Ci0gICAgICAgIC8vIFZlcmlmeSB0aGF0LCBmb3IgSW1wbGljaXRTRUksIHRoYXQgYWxsIG1ldGhvZHMgdGhhdCBzaG91bGQgZXhpc3QoaWYgb25lIGZhbHNlIGZvdW5kLCB0aGVuCi0gICAgICAgIC8vIG9ubHkgbG9vayBmb3IgV2ViTWV0aG9kcyB3LyBGYWxzZSwgZWxzZSB0YWtlIGFsbCBwdWJsaWMgbWV0aG9kcyBidXQgaWdub3JlIHRob3NlIHdpdGgKLSAgICAgICAgLy8gZXhjbHVkZSA9PSB0cnVlCi0gICAgICAgIGlmICh3ZWJNZXRob2RBbm5vdGF0aW9uc0V4aXN0KCkpIHsKLSAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvblV0aWxzLmZhbHNlRXhjbHVzaW9uc0V4aXN0KGNvbXBvc2l0ZSkpCi0gICAgICAgICAgICAgICAgdmVyaWZ5RmFsc2VFeGNsdXNpb25zV2l0aFdTREwoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2ZXJpZnlQdWJsaWNNZXRob2RzV2l0aFdTREwoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZlcmlmeVB1YmxpY01ldGhvZHNXaXRoV1NETCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSW1wbGljaXRTRUlBZ2FpbnN0V1NETCgpIHsKLQotICAgICAgICAvL1RPRE86IElmIHRoZXJlIGlzIGEgV1NETCwgdGhlbiB2ZXJpZnkgdGhhdCBhbGwgV2ViTWV0aG9kcyBvbiB0aGlzIGNsYXNzIGFuZCBpbiB0aGUKLSAgICAgICAgLy8JCXN1cGVyY2xhc3NlcyBjaGFpbiBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlIFdTREwuLi5Mb29rIGF0IGxvZ2ljIGJlbG93IHRvIG1ha2UKLSAgICAgICAgLy8JCXN1cmUgdGhpcyByZWFsbHkgaGFwcGVuaW5nCi0KLQotICAgICAgICBpZiAod2ViTWV0aG9kQW5ub3RhdGlvbnNFeGlzdCgpKSB7Ci0gICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25VdGlscy5mYWxzZUV4Y2x1c2lvbnNFeGlzdChjb21wb3NpdGUpKQotICAgICAgICAgICAgICAgIHZlcmlmeUZhbHNlRXhjbHVzaW9uc1dpdGhXU0RMKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdmVyaWZ5UHVibGljTWV0aG9kc1dpdGhXU0RMKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJpZnlQdWJsaWNNZXRob2RzV2l0aFdTREwoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrU0VJQWdhaW5zdFdTREwoKSB7Ci0gICAgICAgIC8vVE9ETzogUGxhY2UgbG9naWMgaGVyZSB0byB2ZXJpZnkgdGhhdCBlYWNoIHB1YmxpY01ldGhvZCB3aXRoIFdlYk1ldGhvZCBhbm5vdAotICAgICAgICAvLyAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgV1NETCAoSWYgdGhlcmUgaXMgYSBXU0RMKSBJZiB3ZSBmaW5kCi0gICAgICAgIC8vCSAgICBhIFdlYk1ldGhvZCBhbm5vdGF0aW9uLCB1c2UgaXRzIHZhbHVlcyBmb3IgbG9va2luZyBpbiB0aGUgV1NETAotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU0VJKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWljKSB7Ci0KLSAgICAgICAgaWYgKHNlaWMuZ2V0V2ViU2VydmljZUFubm90KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIAkJTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVTRUlFcnIxIixjb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksc2VpYy5nZXRDbGFzc05hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc2VpYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAJCU1lc3NhZ2VzLmdldE1lc3NhZ2UoInZhbGlkYXRlU0VJRXJyMiIsY29tcG9zaXRlLmdldENsYXNzTmFtZSgpLAotICAgICAgICAgICAgCQkJCXNlaWMuZ2V0Q2xhc3NOYW1lKCksc2VpYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKS5lbmRwb2ludEludGVyZmFjZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgICAgIGlmIChzZWljLmdldFNvYXBCaW5kaW5nQW5ub3QoKSAhPSBudWxsICYmCi0gICAgICAgIAkJc2VpYy5nZXRTb2FwQmluZGluZ0Fubm90KCkudXNlKCkgPT0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkVOQ09ERUQpIHsKLSAgICAgICAgCXRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgidmFsaWRhdGVTRUlFcnIzIixzZWljLmdldENsYXNzTmFtZSgpKSk7ICAKLSAgICAgICAgfQotCi0gICAgICAgIGNoZWNrU0VJQWdhaW5zdFdTREwoKTsKLQotICAgICAgICAvL1RPRE86IE1vcmUgdmFsaWRhdGlvbiBoZXJlCi0KLSAgICAgICAgLy9UT0RPOiBNYWtlIHN1cmUgd2UgZG9uJ3QgZmluZCBhbnkgV2ViTWV0aG9kIGFubm90YXRpb25zIHdpdGggZXhjbHVkZSA9PSB0cnVlCi0gICAgICAgIC8vCQlhbnl3aGVyZSBpbiB0aGUgc3VwZXJjbGFzc2VzIGNoYWluCi0KLSAgICAgICAgLy9UT0RPOiBDaGVjayB0aGF0IGFsbCBXZWJNZXRob2QgYW5ub3RhdGlvbnMgaW4gdGhlIHN1cGVyY2xhc3MgY2hhaW4gYXJlIHJlcHJlc2VudGVkIGluCi0gICAgICAgIC8vCQlXU0RMLCBhc3N1bWluZyB0aGVyZSBpcyBXU0RMCi0KLSAgICAgICAgLy9UT0RPOglWYWxpZGF0ZSB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgcHVibGljCi0KLSAgICAgICAgLy8JCUNhbGwgVmFsaWRhdGVXZWJNZXRob2RBbm5vdHMoKQotICAgICAgICAvLwotCi0gICAgICAgIC8vVGhpcyB3aWxsIHBlcmZvcm0gdmFsaWRhdGlvbiBmb3IgYWxsIG1ldGhvZHMsIHJlZ2FyZGxlc3Mgb2YgV2ViTWV0aG9kIGFubm90YXRpb25zCi0gICAgICAgIC8vSXQgaXMgY2FsbGVkIGZvciB0aGUgU0VJLCBhbmQgYW4gaW1wbC4gY2xhc3MgdGhhdCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGVuZHBvaW50SW50ZXJmYWNlCi0gICAgICAgIHZhbGlkYXRlTWV0aG9kcyhzZWljLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSk7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyBUUlVFIGlmIHdlIGZpbmQganVzdCBvbmUgV2ViTWV0aG9kIEFubm90YXRpb24gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gd2ViTWV0aG9kQW5ub3RhdGlvbnNFeGlzdCgpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbnVsbDsKLSAgICAgICAgSXRlcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGl0ZXIgPQotICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkuaXRlcmF0b3IoKTsKLQotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG1kYyA9IGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAobWRjLmdldFdlYk1ldGhvZEFubm90KCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RmFsc2VFeGNsdXNpb25zV2l0aFdTREwoKSB7Ci0gICAgICAgIC8vVE9ETzogUGxhY2UgbG9naWMgaGVyZSB0byB2ZXJpZnkgdGhhdCBlYWNoIGV4Y2x1ZGU9PWZhbHNlIFdlYk1ldGhvZCBhbm5vdCB3ZSBmaW5kCi0gICAgICAgIC8vICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBXU0RMCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVB1YmxpY01ldGhvZHNXaXRoV1NETCgpIHsKLSAgICAgICAgLy9UT0RPOiBQbGFjZSBsb2dpYyBoZXJlIHRvIHZlcmlmeSB0aGF0IGVhY2ggcHVibGljTWV0aG9kIHdpdGggbm8gV2ViTWV0aG9kIGFubm90Ci0gICAgICAgIC8vICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBXU0RMCi0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZU1ldGhvZHMoTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCkgewotICAgICAgICBpZiAobWRjTGlzdCAhPSBudWxsICYmICFtZGNMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZm9yIChNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgOiBtZGNMaXN0KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJldHVyblR5cGUgPSBtZGMuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJldHVyblR5cGUuZXF1YWxzKFJFVFVSTl9UWVBFX0ZVVFVSRSkgfHwgcmV0dXJuVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhSRVRVUk5fVFlQRV9SRVNQT05TRSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlKCJzZXJ2ZXJTaWRlQXN5bmMiLCBtZGMuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgbWRjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICBpZiAobWRjLmdldFNvYXBCaW5kaW5nQW5ub3QoKSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRoaXMgSkFYV1MgZW5naW5lLCBTT0FQQmluZGluZy5Vc2UgPSBFTkNPREVEIGlzIHVuc3VwcG9ydGVkCi0gICAgICAgICAgICAgICAgICAgIGlmIChtZGMuZ2V0U29hcEJpbmRpbmdBbm5vdCgpLnVzZSgpID09IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5FTkNPREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzb2FwQmluZGluZ1VzZUVuY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kYy5nZXREZWNsYXJpbmdDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kYy5nZXRNZXRob2ROYW1lKCkpKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQsIGlmIGEgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBleGlzdHMsIHRoYXQgaXRzIHN0eWxlIGJlIHNldCB0bwotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IERPQ1VNRU5UIEpTUjE4MS1TZWMgNC43LjEKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1kYy5nZXRTb2FwQmluZGluZ0Fubm90KCkuc3R5bGUoKSA9PSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5SUEMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNvYXBCaW5kaW5nU3R5bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kYy5nZXREZWNsYXJpbmdDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kYy5nZXRNZXRob2ROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBGaWxsIHRoaXMgb3V0IHRvIHZhbGlkYXRlIGFsbCBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSAoYW5kCi0gICAgICAgIC8vIHRoZWlyIGluY2x1c2l2ZQotICAgICAgICAvLyAgICAgIGFubm90YXRpb25zIG9uIHRoaXMgU0VJIChTRUkgaXMgYXNzdW1lZCBoZXJlKQotICAgICAgICAvL2NoZWNrIG9uZXdheQotICAgICAgICAvLwotCi0gICAgICAgIC8vVGhpcyBjb3VsZCBiZSBhbiBTRUksIG9yIGFuIGltcGwuIGNsYXNzIHRoYXQgZG9lc24nIHNwZWNpZnkgYW4gRW5kcG9pbnRJbnRlcmZhY2UgKHNvLCBpdAotICAgICAgICAvL2lzIGltcGxpY2l0bHkgYW4gU0VJLi4ubmVlZCB0byBjb25zaWRlciB0aGlzCi0gICAgICAgIC8vCi0KLSAgICAgICAgLy9UT0RPOiBWZXJpZnkgdGhhdCwgaWYgdGhpcyBpcyBhbiBpbnRlcmZhY2UuLi50aGF0IHRoZXJlIGFyZSBubyBNZXRob2RzIHdpdGggV2ViTWV0aG9kCi0gICAgICAgIC8vICAgICAgYW5ub3RhdGlvbnMgdGhhdCBjb250YWluIGV4Y2x1ZGUgPT0gdHJ1ZQotCi0gICAgICAgIC8vVE9ETzogVmVyaWZ5IHRoYXQsIGlmIGEgU09BUEJpbmRpbmcgYW5ub3RhdGlvbiBleGlzdHMsIHRoYXQgaXRzIHN0eWxlIGJlIHNldCB0bwotICAgICAgICAvLyAgICAgIG9ubHkgRE9DVU1FTlQgSlNSMTgxLVNlYyA0LjcuMQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlV1NETE9wZXJhdGlvbnMoKSB7Ci0gICAgICAgIC8vVmVyaWZpZXMgdGhhdCBhbGwgb3BlcmF0aW9ucyBvbiB0aGUgd3NkbCBhcmUgZm91bmQgaW4gdGhlIGltcGwvc2VpIGNsYXNzCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNXU0RMU3BlY2lmaWVkKCkgewotICAgICAgICBib29sZWFuIHdzZGxTcGVjaWZpZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgd3NkbFNwZWNpZmllZCA9IChnZXRXU0RMV3JhcHBlcigpLmdldERlZmluaXRpb24oKSAhPSBudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbFNwZWNpZmllZDsKLSAgICB9Ci0KLSAgICAKLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQU5OT1RBVElPTjogSGFuZGxlckNoYWluCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb24jZ2V0SGFuZGxlckNoYWluKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gZ2V0SGFuZGxlckNoYWluKG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbiNnZXRIYW5kbGVyQ2hhaW4oamF2YS5sYW5nLk9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWluKE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBIYW5kbGVyQ2hhaW5zVHlwZSBpbiB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBmb3IgdGhpcyBTZXJ2aWNlRGVsZWdhdGUKLSAgICAgICAgLy8gKGkuZS4gdGhpcyBzcGFyc2VDb21wb3NpdGVLZXkpLCB0aGVuIHJldHVybiB0aGF0LgotICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlS2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNwYXJzZUNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICAgICAgICAgIGlmIChzcGFyc2VDb21wb3NpdGUgIT0gbnVsbCAmJiBzcGFyc2VDb21wb3NpdGUuZ2V0SGFuZGxlckNoYWluc1R5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNwYXJzZUNvbXBvc2l0ZS5nZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBIYW5kbGVyQ2hhaW5zVHlwZSBpbiB0aGUgY29tcG9zaXRlLCB0aGVuIHJlYWQgaW4gdGhlIGZpbGUgc3BlY2lmaWVkCi0gICAgICAgIC8vIG9uIHRoZSBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBpZiBpdCBpcyBwcmVzZW50LgotICAgICAgICBpZiAoaGFuZGxlckNoYWluc1R5cGUgPT0gbnVsbCkgewotCi0gICAgICAgICAgICBnZXRBbm5vSGFuZGxlckNoYWluQW5ub3RhdGlvbihzcGFyc2VDb21wb3NpdGVLZXkpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbkFubm90YXRpb24gIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGhhbmRsZXJGaWxlTmFtZSA9IGhhbmRsZXJDaGFpbkFubm90YXRpb24uZmlsZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5kcG9pbnREZXNjcmlwdGlvbkltcGwuZ2V0SGFuZGxlckNoYWluOiBmaWxlTmFtZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoYW5kbGVyRmlsZU5hbWUgKyAiIGNsYXNzTmFtZTogIiArIGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKTsKLQotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gY29tcG9zaXRlLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvblV0aWxzLm9wZW5IYW5kbGVyQ29uZmlnU3RyZWFtKGhhbmRsZXJGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnIHN0cmVhbSBpcyBzdGlsbCBudWxsLiAgVGhpcyBtYXkgbWVhbiB0aGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIGlzIG9uIGEgKmRyaXZlciogY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCB0byBhIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24sIHNvIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBjbGFzcyBkZWNsYXJpbmcgQEhhbmRsZXJDaGFpbgotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgTk9UIHJlbGF0aXZlIHRvIHRoZSBTZXJ2aWNlIG9yIEVuZHBvaW50IGNsYXNzLCB3aGljaCBhbHNvIG1lYW5zIHdlIHNob3VsZCB1c2UgdGhlIHNwYXJzZUNvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGF0IGlzIHdoZXJlIHRoZSBASGFuZGxlckNoYWluIGFubm90YXRpb24gaW5mbyB3b3VsZCBoYXZlIGJlZW4gbG9hZGVkLgotICAgICAgICAgICAgICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoYW5kbGVyQ2hhaW5EZWNsYXJpbmdDbGFzcyA9IChTdHJpbmcpc3BhcnNlQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKS5nZXQoTURRQ29uc3RhbnRzLkhBTkRMRVJfQ0hBSU5fREVDTEFSSU5HX0NMQVNTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5EZWNsYXJpbmdDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gaGFuZGxlckNoYWluRGVjbGFyaW5nQ2xhc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBEZXNjcmlwdGlvblV0aWxzLm9wZW5IYW5kbGVyQ29uZmlnU3RyZWFtKGhhbmRsZXJGaWxlTmFtZSwgY2xhc3NOYW1lLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZihpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiaGFuZGxlckNoYWluTlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJGaWxlTmFtZSwgY2xhc3NOYW1lKSk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uVXRpbHMubG9hZEhhbmRsZXJDaGFpbnMoaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5zVHlwZTsKLSAgICB9Ci0KLSAgICAKLSAgICAvKgotICAgICAqIFRoaXMgaXMgYSBjbGllbnQgc2lkZSBvbmx5IG1ldGhvZC4gVGhlIGdlbmVyYXRlZCBzZXJ2aWNlIGNsYXNzIG1heSBjb250YWluIAotICAgICAqIGhhbmRsZXIgY2hhaW4gYW5ub3RhdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluIGdldEFubm9IYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKE9iamVjdCBzcGFyc2VDb21wb3NpdGVLZXkpIHsKLSAgICAgICAgaWYgKHRoaXMuaGFuZGxlckNoYWluQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlQ2xhc3MgPSBjb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VDbGFzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkFubm90YXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIYW5kbGVyQ2hhaW4pIGdldEFubm90YXRpb24oc2VydmljZUNsYXNzLCBIYW5kbGVyQ2hhaW4uY2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JaWYgKGhhbmRsZXJDaGFpbkFubm90YXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHNwYXJzZUNvbXBvc2l0ZUtleSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNwYXJzZUNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoc3BhcnNlQ29tcG9zaXRlS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoc3BhcnNlQ29tcG9zaXRlICE9IG51bGwgJiYgc3BhcnNlQ29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uID0gc3BhcnNlQ29tcG9zaXRlLmdldEhhbmRsZXJDaGFpbkFubm90KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbkFubm90YXRpb247Ci0gICAgfQotICAgIAotICAgIC8qIFJldHVybnMgdGhlIFdTREwgZGVmaW5pdG9uIGFzIHNwZWNpZmllZCBpbiB0aGUgbWV0YWRhdGEuICBOb3RlIHRoYXQgdGhpcyBXU0RMIG1heSBub3QgYmUKLSAgICAgKiBjb21wbGV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvbigpIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZuID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFdTRExXcmFwcGVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVmbiA9IGdldFdTRExXcmFwcGVyKCkuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWZuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTREwgZGVmaW5pdG9uIGFzIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgV1NETCBnZW5lcmF0b3IuICBUaGlzIHdpbGwgYmUgbnVsbAotICAgICAqIHVubGVzcyB0aGUgV1NETCBkZWZpbml0aW9uIHByb3ZpZGVkIGJ5IHRoZSBtZXRhZGF0YSBpcyBpbmNvbXBsZXRlCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V1NETEdlbmVyYXRlZERlZmluaXRpb24oKSB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmbiA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlZm4gPSBnZXRHZW5lcmF0ZWRXc2RsV3JhcHBlcigpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZSBnZXRXU0RMU2VydmljZSgpIHsKLSAgICAgICAgU2VydmljZSByZXR1cm5XU0RMU2VydmljZSA9IG51bGw7Ci0gICAgICAgIERlZmluaXRpb24gZGVmbiA9IGdldFdTRExEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChkZWZuICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybldTRExTZXJ2aWNlID0gZGVmbi5nZXRTZXJ2aWNlKGdldFNlcnZpY2VRTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuV1NETFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRXU0RMUG9ydHMoKSB7Ci0gICAgICAgIFNlcnZpY2Ugd3NkbFNlcnZpY2UgPSBnZXRXU0RMU2VydmljZSgpOwotICAgICAgICBpZiAod3NkbFNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHdzZGxTZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFFOYW1lPiBnZXRQb3J0cyhPYmplY3Qgc2VydmljZURlbGVnYXRlS2V5KSB7Ci0gICAgICAgIEFycmF5TGlzdDxRTmFtZT4gcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0PFFOYW1lPigpOwotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FjaGUgdGhlc2UgcmVzdWx0cyBiZWNhdXNlIHRoZSBsaXN0IG9mIHBvcnRzIGNhbiBiZSBhZGRlZAotICAgICAgICAvLyB0byB2aWEgZ2V0UG9ydCguLi4pIGFuZCBhZGRQb3J0KC4uLikuCi0KLSAgICAgICAgLy8gSWYgdGhlIFdTREwgaXMgc3BlY2lmaWVkLCBnZXQgdGhlIGxpc3Qgb2YgcG9ydHMgdW5kZXIgdGhpcyBzZXJ2aWNlCi0gICAgICAgIE1hcCB3c2RsUG9ydHNNYXAgPSBnZXRXU0RMUG9ydHMoKTsKLSAgICAgICAgaWYgKHdzZGxQb3J0c01hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB3c2RsUG9ydHNJdGVyYXRvciA9IHdzZGxQb3J0c01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBXU0RMIFBvcnRzIGRvIG5vdCBoYXZlIGEgdGFyZ2V0IG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLSAgICAgICAgICAgIC8vIEpBWFdTIHNheXMgdG8gdXNlIHRoZSBUTlMgZnJvbSB0aGUgU2VydmljZS4KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlVE5TID0gZ2V0U2VydmljZVFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBmb3IgKFBvcnQgd3NkbFBvcnQgPSBudWxsOyB3c2RsUG9ydHNJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgd3NkbFBvcnQgPSAoUG9ydCl3c2RsUG9ydHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxQb3J0TG9jYWxQYXJ0ID0gd3NkbFBvcnQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIHBvcnRMaXN0LmFkZChuZXcgUU5hbWUoc2VydmljZVROUywgd3NkbFBvcnRMb2NhbFBhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgRW5kcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIGFkZCBhbnkKLSAgICAgICAgLy8gbm90IGFscmVhZHkgaW4gdGhlIGxpc3QuICBUaGlzIHdpbGwgaW5jbHVkZSBwb3J0cyBhZGRlZCB0byB0aGUgU2VydmljZQotICAgICAgICAvLyB2aWEgZ2V0UG9ydCguLi4pIGFuZCBhZGRQb3J0KC4uLikKLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlbmRwb2ludERlc2NzID0gZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgOiBlbmRwb2ludERlc2NzKSB7Ci0gICAgICAgICAgICBRTmFtZSBlbmRwb2ludFBvcnRRTmFtZSA9IGVuZHBvaW50RGVzYy5nZXRQb3J0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmICghcG9ydExpc3QuY29udGFpbnMoZW5kcG9pbnRQb3J0UU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcG9ydExpc3QuYWRkKGVuZHBvaW50UG9ydFFOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9SZXRyaWV2ZSBhbGwgdGhlIGR5bmFtaWMgcG9ydHMgZm9yIHRoaXMgY2xpZW50Ci0gICAgICAgIGlmIChzZXJ2aWNlRGVsZWdhdGVLZXkgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4gZHluYW1pY0VuZHBvaW50RGVzY3MgPSBnZXREeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKHNlcnZpY2VEZWxlZ2F0ZUtleSk7Ci0JCQlpZiAoZHluYW1pY0VuZHBvaW50RGVzY3MgIT0gbnVsbCkgewotCQkJCWZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBkeW5hbWljRW5kcG9pbnREZXNjIDogZHluYW1pY0VuZHBvaW50RGVzY3MpIHsKLQkJCQkJUU5hbWUgZW5kcG9pbnRQb3J0UU5hbWUgPSBkeW5hbWljRW5kcG9pbnREZXNjCi0JCQkJCQkJLmdldFBvcnRRTmFtZSgpOwotCQkJCQlpZiAoIXBvcnRMaXN0LmNvbnRhaW5zKGVuZHBvaW50UG9ydFFOYW1lKSkgewotCQkJCQkJcG9ydExpc3QuYWRkKGVuZHBvaW50UG9ydFFOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotICAgICAgICByZXR1cm4gcG9ydExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8UG9ydD4gZ2V0V1NETFBvcnRzVXNpbmdQb3J0VHlwZShRTmFtZSBwb3J0VHlwZVFOKSB7Ci0gICAgICAgIEFycmF5TGlzdDxQb3J0PiBwb3J0TGlzdCA9IG5ldyBBcnJheUxpc3Q8UG9ydD4oKTsKLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvblV0aWxzLmlzRW1wdHkocG9ydFR5cGVRTikpIHsKLSAgICAgICAgICAgIE1hcCB3c2RsUG9ydE1hcCA9IGdldFdTRExQb3J0cygpOwotICAgICAgICAgICAgaWYgKHdzZGxQb3J0TWFwICE9IG51bGwgJiYgIXdzZGxQb3J0TWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG1hcEVsZW1lbnQgOiB3c2RsUG9ydE1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBQb3J0IHdzZGxQb3J0ID0gKFBvcnQpbWFwRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgd3NkbFBvcnRUeXBlID0gd3NkbFBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHdzZGxQb3J0VHlwZVFOID0gd3NkbFBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0VHlwZVFOLmVxdWFscyh3c2RsUG9ydFR5cGVRTikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRMaXN0LmFkZCh3c2RsUG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnRMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFBvcnQ+IGdldFdTRExQb3J0c1VzaW5nU09BUEFkZHJlc3MoTGlzdDxQb3J0PiB3c2RsUG9ydHMpIHsKLSAgICAgICAgQXJyYXlMaXN0PFBvcnQ+IHBvcnRzVXNpbmdBZGRyZXNzID0gbmV3IEFycmF5TGlzdDxQb3J0PigpOwotICAgICAgICBpZiAod3NkbFBvcnRzICE9IG51bGwgJiYgIXdzZGxQb3J0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZvciAoUG9ydCBjaGVja1BvcnQgOiB3c2RsUG9ydHMpIHsKLSAgICAgICAgICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50TGlzdCA9IGNoZWNrUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBjaGVja0VsZW1lbnQgOiBleHRlbnNpYmlsaXR5RWxlbWVudExpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzU09BUEFkZHJlc3NFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudCljaGVja0VsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0c1VzaW5nQWRkcmVzcy5hZGQoY2hlY2tQb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydHNVc2luZ0FkZHJlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gZ2V0U2VydmljZVJ1bnRpbWVEZXNjKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBydW50aW1lRGVzY01hcC5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVJ1bnRpbWVEZXNjKFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24gc3JkKSB7Ci0gICAgICAgIHJ1bnRpbWVEZXNjTWFwLnB1dChzcmQuZ2V0S2V5KCksIHNyZCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZXNldFNlcnZpY2VSdW50aW1lRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJ1bnRpbWVEZXNjTWFwLmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2xpZW50LXNpZGUgc2VydmljZSBjbGFzcyBpZiBpdCBleGlzdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2aWNlQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY29tcG9zaXRlLmdldENsYXNzTmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZ2V0RHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25JbXBsKFFOYW1lIHBvcnRRTmFtZSwgT2JqZWN0IGtleSkgewotICAgICAgICBNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPiBpbm5lck1hcCA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZChkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgCWlubmVyTWFwID0gZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKGlubmVyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlyZXR1cm4gaW5uZXJNYXAuZ2V0KHBvcnRRTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZER5bmFtaWNFbmRwb2ludERlc2NyaXB0aW9uSW1wbChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCBlbmRwb2ludERlc2NyaXB0aW9uSW1wbCwgCi0gICAgCQkJCQkJCQkJCQkJT2JqZWN0IGtleSkgewotICAgICAgICBNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPiBpbm5lck1hcCA9IG51bGw7Ci0gICAgICAgIHN5bmNocm9uaXplZChkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMpIHsKLSAgICAgICAgICAgIGlubmVyTWFwID0gZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKGlubmVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgIGlubmVyTWFwID0gbmV3IEhhc2hNYXA8UU5hbWUsIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsPigpOwotICAgICAgICAgICAgICAgZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zLnB1dChrZXksIGlubmVyTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlubmVyTWFwLnB1dChlbmRwb2ludERlc2NyaXB0aW9uSW1wbC5nZXRQb3J0UU5hbWUoKSwgZW5kcG9pbnREZXNjcmlwdGlvbkltcGwpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAvKiogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIERlc2NyaXB0aW9uIG9iamVjdCBhbmQgYWxsIHRoZSBvYmplY3RzIGl0IGNvbnRhaW5zLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gIlxuIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHNhbWVsaW5lID0gIjsgIjsKLSAgICAgICAgLy8gVGhpcyBwcm9kdWNlcyBhIFRSRU1FTkRPVVMgYW1vdW50IG9mIG91dHB1dCBpZiB3ZSBoYXZlIHRoZSBXU0RMIERlZmluaXRpb24gb2JqZWN0cyAKLSAgICAgICAgLy8gZG8gYSB0b1N0cmluZyBvbiB0aGVtc2VsdmVzLgotICAgICAgICBib29sZWFuIGR1bXBXU0RMQ29udGVudHMgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEJhc2ljIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIlNlcnZpY2VRTmFtZTogIiArIGdldFNlcnZpY2VRTmFtZSgpKTsKLSAgICAgICAgICAgIC8vIFdTREwgaW5mb3JtYXRpb24KLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJpc1dTRExTcGVjaWZpZWQ6ICIgKyBpc1dTRExTcGVjaWZpZWQoKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIldTREwgTG9jYXRpb246ICIgKyBnZXRXU0RMTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgaWYgKGR1bXBXU0RMQ29udGVudHMpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJXU0RMIERlZmluaXRpb246ICIgKyBnZXRXU0RMRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkdlbmVyYXRlZCBXU0RMIERlZmluaXRpb246ICIgKyBnZXRXU0RMR2VuZXJhdGVkRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiV1NETCBEZWZpbml0aW9uIGF2YWlsYWJsZTogIiArIChnZXRXU0RMRGVmaW5pdGlvbigpICE9IG51bGwpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHNhbWVsaW5lKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJHZW5lcmF0ZWQgV1NETCBEZWZpbml0aW9uIGF2YWlsYWJsZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAoZ2V0V1NETEdlbmVyYXRlZERlZmluaXRpb24oKSAhPSBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQb3J0cwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIExpc3Q8UU5hbWU+IHBvcnRzID0gZ2V0UG9ydHMobnVsbCk7Ci0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJOdW1iZXIgb2YgZGVmaW5lZCBwb3J0czogIiArIHBvcnRzLnNpemUoKSk7Ci0gICAgICAgICAgICAvL1RPRE86IFNob3cgdGhlIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBkeW5hbWljIHBvcnRzCi0gICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUG9ydCBRTmFtZXM6ICIpOwotICAgICAgICAgICAgZm9yIChRTmFtZSBwb3J0IDogcG9ydHMpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKHBvcnQgKyBzYW1lbGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBBeGlzIENvbmZpZyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgLy8gV2UgZG9uJ3QgcHJpbnQgb3V0IHRoZSBjb25maWcgY29udGV4dCBiZWNhdXNlIGl0IHdpbGwgZm9yY2Ugb25lIHRvIGJlIGNyZWF0ZWQKLSAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KLSAgICAgICAgICAgIC8vIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAvLyBzdHJpbmcuYXBwZW5kKCJDb25maWd1cmF0aW9uQ29udGV4dDogIiArIGdldEF4aXNDb25maWdDb250ZXh0KCkpOwotICAgICAgICAgICAgLy8gRW5kcG9pbnREZXNjcmlwdGlvbnMKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPEVuZHBvaW50RGVzY3JpcHRpb24+IGVuZHBvaW50RGVzY3MgPSBnZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChlbmRwb2ludERlc2NzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKCJFbmRwb2ludERlc2NyaXB0aW9uIGFycmF5IGlzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIk51bWJlciBvZiBFbmRwb2ludERlc2NycHRpb25zOiAiICsgZW5kcG9pbnREZXNjcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA6IGVuZHBvaW50RGVzY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChlbmRwb2ludERlc2MudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZy5hcHBlbmQobmV3bGluZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZCgiUnVudGltZURlc2NyaXB0aW9uczoiICsgdGhpcy5ydW50aW1lRGVzY01hcC5zaXplKCkpOwotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIGZvciAoU2VydmljZVJ1bnRpbWVEZXNjcmlwdGlvbiBydW50aW1lRGVzYyA6IHJ1bnRpbWVEZXNjTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChydW50aW1lRGVzYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKG5ld2xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgc3RyaW5nLmFwcGVuZChuZXdsaW5lKTsKLSAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoIkNvbXBsZXRlIGRlYnVnIGluZm9ybWF0aW9uIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2VEZXNjcmlwdGlvbiIpOwotICAgICAgICAgICAgcmV0dXJuIHN0cmluZy50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpbmcudG9TdHJpbmcoKTsKLQotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXQgYW4gYW5ub3RhdGlvbi4gIFRoaXMgaXMgd3JhcHBlcmVkIHRvIGF2b2lkIGEgSmF2YTJTZWN1cml0eSB2aW9sYXRpb24uCi0gICAgICogQHBhcmFtIGNscyBDbGFzcyB0aGF0IGNvbnRhaW5zIGFubm90YXRpb24gCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gQ2xhc3Mgb2YgcmVxdXJlc3RlZCBBbm5vdGF0aW9uCi0gICAgICogQHJldHVybiBhbm5vdGF0aW9uIG9yIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oZmluYWwgQ2xhc3MgY2xzLCBmaW5hbCBDbGFzcyBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldENvbnRleHRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBDbGFzc0xvYWRlciBjbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyIDogVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3MgY2xzKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihlLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24oUG9ydEluZm8gcG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiByZXNvbHZlZEhhbmRsZXJzSW5mbykgewotICAgICAgICAvLyBHZXQgdGhlIGNhY2hlIGFuZCBzdG9yZSB0aGUgaGFuZGxlciBkZXNjcmlwdGlvbgotICAgICAgICBNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4gY2FjaGUgPSByZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24uZ2V0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8UG9ydEluZm8sIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbj4oKTsKLSAgICAgICAgICAgIHJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IFNvZnRSZWZlcmVuY2U8TWFwPFBvcnRJbmZvLCBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24+PihjYWNoZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBjYWNoZS5wdXQocG9ydEluZm8sIHJlc29sdmVkSGFuZGxlcnNJbmZvKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgCi0gICAgcHVibGljIFJlc29sdmVkSGFuZGxlcnNEZXNjcmlwdGlvbiBnZXRSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24oUG9ydEluZm8gcG9ydEluZm8pIHsKLSAgICAgICAgTWFwPFBvcnRJbmZvLCBSZXNvbHZlZEhhbmRsZXJzRGVzY3JpcHRpb24+IGNhY2hlID0gcmVzb2x2ZWRIYW5kbGVyc0Rlc2NyaXB0aW9uLmdldCgpOwotCi0gICAgICAgIHJldHVybiAoY2FjaGUgPT0gbnVsbCkgPwotICAgICAgICAgICAgICAgIG51bGw6IC8vIE5vIENhY2hlCi0gICAgICAgICAgICAgICAgY2FjaGUuZ2V0KHBvcnRJbmZvKTsgCi0gICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVXU0RMTG9jYXRpb25CeUNhdGFsb2coU3RyaW5nIHdzZGxMb2NhdGlvbikgewotICAgICAgICBpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQ2F0YWxvZyBjYXRhbG9nID0gY2F0YWxvZ01hbmFnZXIuZ2V0Q2F0YWxvZygpOwotICAgICAgICAgICAgaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZExvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkTG9jYXRpb24gPSBjYXRhbG9nLnJlc29sdmVVUkkod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxseSwgb25lIG1pZ2h0IGFsc28gZG8gdGhlIGZvbGxvd2luZywgYnV0IGluIHRoaXMgY2FzZSB3ZSdyZSBsb29raW5nIGF0IGEgdG9wLWxldmVsIFdTREwsIHNvIG5vIHBhcmVudAotICAgICAgICAgICAgICAgICAgICAvLyByZXNvbHZlZExvY2F0aW9uID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHdzZGxMb2NhdGlvbiwgcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJYTUxDYXRhbG9nIHRyYW5zZm9ybWVkIG9yaWdpbmFsIHdzZGwgbG9jYXRpb24gXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHdzZGxMb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgdG8gXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc29sdmVkTG9jYXRpb24gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZExvY2F0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhdGFsb2cgcmVzb2x1dGlvbiBhdHRlbXB0IGNhdXNlZCBleGNlcHRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbExvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgdGhlIHVzZSBjb3VudCBmb3IgdGhpcyBTZXJ2aWNlRGVzY3JpcHRpb24gaW5zdGFuY2UuICBOb3RlIHRoZSB1c2UgY291bnQgaXMKLSAgICAgKiBvbmx5IHVzZWQgb24gdGhlIGNsaWVudCBzaWRlLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW5Vc2UoKSB7Ci0gICAgICAgIHJldHVybiB1c2VDb3VudCA+IDA7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlZ2lzdGVyIHRoYXQgdGhpcyBTZXJ2aWNlRGVzY3JpcHRpb24gaXMgYmVpbmcgdXNlZCBieSBhIHNlcnZpY2UgZGVsZWdhdGUgaW5zdGFuY2UuICBOb3RlCi0gICAgICogdGhpcyBpcyBvbmx5IHVzZWQgb24gdGhlIGNsaWVudCBzaWRlIChzaW5jZSB0aGUgc2VydmljZSBkZWxlZ2F0ZSBpcyB3aGF0IGlzIGJlaW5nIAotICAgICAqIHJlZ2lzdGVyZWQpLgotICAgICAqIAotICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNpbmNlIG9ubHkgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgc2hvdWxkIGJlIGNhbGxpbmcKLSAgICAgKiBpdC4KLSAgICAgKi8KLSAgICB2b2lkIHJlZ2lzdGVyVXNlKCkgewotICAgICAgICB1c2VDb3VudCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlcmVnaXN0ZXIgdGhhdCB0aGlzIFNlcnZpY2VEZXNjcmlwdGlvbiBpcyBiZWluZyB1c2VkIGJ5IGEgc2VydmljZSBkZWxlZ2F0ZSBpbnN0YW5jZS4gIE5vdGUKLSAgICAgKiB0aGlzIGlzIG9ubHkgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUgKHNpbmNlIHRoZSBzZXJ2aWNlIGRlbGVnYXRlIGlzIHdoYXQgaXMgYmVpbmcgCi0gICAgICogcmVnaXN0ZXJlZCkuCi0KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzaW5jZSBvbmx5IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIHNob3VsZCBiZSBjYWxsaW5nCi0gICAgICogaXQuCi0gICAgICovCi0gICAgdm9pZCBkZXJlZ2lzdGVyVXNlKCkgewotICAgICAgICBpZiAodXNlQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICB1c2VDb3VudC0tOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVJlc291cmNlcyhPYmplY3QgZGVsZWdhdGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjcmlwdGlvbiByZWxlYXNlIHJlc291cmNlcyBjYWxsZWQgd2l0aCBkZWxlZ2F0ZSAiICsgZGVsZWdhdGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSBzZXJ2aWNlIGRlc2MgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUsIHdoaWNoIG1lYW5zIG5vIG90aGVyIHNlcnZpY2UgZGVsZWdhdGVzCi0gICAgICAgIC8vIGFyZSB1c2luZyBpdCwgdGhlbiB3ZSB3aWxsIHJlbGVhc2UgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggaXQuICBJZiBpdCBjYW4ndCBiZSAKLSAgICAgICAgLy8gcmVtb3ZlZCBiZWNhdXNlIGl0IGlzIHN0aWxsIGluIHVzZSwgdGhlbiBqdXN0IHJldHVybi4KLSAgICAgICAgaWYgKCFEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLnJlbW92ZUZyb21DYWNoZSh0aGlzKSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXJ2aWNlRGVzYyB3YXMgbm90IHJlbW92ZWQgZnJvbSBjYWNoZSwgc28gaXQgd2lsbCBub3QgYmUgcmVsZWFzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlcnZpY2VEZXNjIHdhcyByZW1vdmVkIGZyb20gY2FjaGUsIHNvIHJlbGVhc2luZyBhc3NvY2lhdGVkIHJlc291cmNlcyIpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBDbG9zZSBhbGwgdGhlIGVuZHBvaW50IGRlc2NzLCBib3RoIGRlY2xhcmVkIGFuZCBkeW5hbWljCi0gICAgICAgIENvbGxlY3Rpb248RW5kcG9pbnREZXNjcmlwdGlvbj4gZGVmaW5lZEVuZHBvaW50cyA9IGRlZmluZWRFbmRwb2ludERlc2NyaXB0aW9ucy52YWx1ZXMoKTsgCi0gICAgICAgIGlmIChkZWZpbmVkRW5kcG9pbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVsZWFzaW5nIGRlZmluZWQgZW5kcG9pbnRzLCBzaXplOiAiICsgZGVmaW5lZEVuZHBvaW50cy5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA6IGRlZmluZWRFbmRwb2ludHMpIHsKLSAgICAgICAgICAgICAgICAoKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlbmRwb2ludERlc2MpLnJlbGVhc2VSZXNvdXJjZXMoZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVmaW5lZEVuZHBvaW50RGVzY3JpcHRpb25zLmNsZWFyKCk7Ci0gICAgICAgIAotICAgICAgICBDb2xsZWN0aW9uPE1hcDxRTmFtZSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGw+PiBkeW5hbWljRW5kcG9pbnRzTWFwID0gCi0gICAgICAgICAgICBkeW5hbWljRW5kcG9pbnREZXNjcmlwdGlvbnMudmFsdWVzKCk7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWxlYXNpbmcgZHluYW1pYyBlbmRwb2ludHMsIHNpemU6ICIgKyBkeW5hbWljRW5kcG9pbnRzTWFwLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3I8TWFwPFFOYW1lLCBFbmRwb2ludERlc2NyaXB0aW9uSW1wbD4+IGR5bmFtaWNFbmRwb2ludHNNYXBJdGVyYXRvciA9IGR5bmFtaWNFbmRwb2ludHNNYXAuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGR5bmFtaWNFbmRwb2ludHNNYXBJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcDxRTmFtZSwgRW5kcG9pbnREZXNjcmlwdGlvbkltcGw+IG1hcEVudHJ5ID0gZHluYW1pY0VuZHBvaW50c01hcEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248RW5kcG9pbnREZXNjcmlwdGlvbkltcGw+IGR5bmFtaWNFbmRwb2ludHMgPSBtYXBFbnRyeS52YWx1ZXMoKTsKLSAgICAgICAgICAgIGlmIChkeW5hbWljRW5kcG9pbnRzICE9IG51bGwgJiYgZHluYW1pY0VuZHBvaW50cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA6IGR5bmFtaWNFbmRwb2ludHMpIHsKLSAgICAgICAgICAgICAgICAgICAgKChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgZW5kcG9pbnREZXNjKS5yZWxlYXNlUmVzb3VyY2VzKGdldEF4aXNDb25maWdDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBlbmRwb2ludCBmcm9tIHRoZSBsaXN0IG9uIGF4aXMgY29uZmlnIAotICAgICAgICAgICAgICAgICAgICByZW1vdmVGcm9tRHluYW1pY0VuZHBvaW50Q2FjaGUoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZHluYW1pY0VuZHBvaW50RGVzY3JpcHRpb25zLmNsZWFyKCk7Ci0gICAgICAgIAotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWxlYXNlIHJlc29yY2VzIGluIFNlcnZpY2VEZXNjIGNhdWdodCB0aHJvd2FibGUgIiwgdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgZW5kcG9pbnREZXNjcmlwdGlvbiBmcm9tIHRoZSBsaXN0IG9mIGR5bmFtaWMgcG9ydHMgaGVsZCBvbiB0aGUKLSAgICAgKiBBeGlzQ29uZmlndXJhdGlvbiBvYmplY3QuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVuZHBvaW50RGVzYyBUaGUgZW5kcG9pbnREZXNjcmlwdGlvbiB0byBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21EeW5hbWljRW5kcG9pbnRDYWNoZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYykgewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gY29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoSkFYV1NfRFlOQU1JQ19FTkRQT0lOVFMpOwotICAgICAgICBIYXNoTWFwIGNhY2hlZERlc2NyaXB0aW9ucyA9IChIYXNoTWFwKQotICAgICAgICAgICAgICAgICgocGFyYW1ldGVyID09IG51bGwpID8gbnVsbCA6IHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKGNhY2hlZERlc2NyaXB0aW9ucyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoY2FjaGVkRGVzY3JpcHRpb25zKSB7Ci0gICAgICAgICAgICAgICAgU2V0IGNhY2hlZERlc2NTZXQgPSBjYWNoZWREZXNjcmlwdGlvbnMuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBjYWNoZWREZXNjSXRlcmF0b3IgPSBjYWNoZWREZXNjU2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNhY2hlZERlc2NJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IG1hcEVudHJ5ID0gKE1hcC5FbnRyeSkgY2FjaGVkRGVzY0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgV2Vha1JlZmVyZW5jZSB3ZWFrUmVmID0gKFdlYWtSZWZlcmVuY2UpIG1hcEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3ZWFrUmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGNoZWNrRHluYW1pY0VuZHBvaW50RGVzYyA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgd2Vha1JlZi5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludERlc2MgPT0gY2hlY2tEeW5hbWljRW5kcG9pbnREZXNjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRGVzY0l0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlbW92aW5nIGVuZHBvaW50IGRlc2MgZnJvbSBkeW5hbWljIGNhY2hlIG9uIGNvbmZpZ3VyYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1VSSVJlc29sdmVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9VUklSZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1NDc4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1VSSVJlc29sdmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci0KLS8qKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbG9jYXRlIHhtbCBzY2hlbWFzIHRoYXQgYXJlIGltcG9ydGVkIGJ5IHdzZGwgZG9jdW1lbnRzLiAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1RPQ09MID0gImh0dHBzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9QUk9UT0NPTCA9ICJqYXIiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfUkVTT1VSQ0VfUFJPVE9DT0wgPSAiYnVuZGxlcmVzb3VyY2UiOwotCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVVJJUmVzb2x2ZXJJbXBsLmNsYXNzKTsKLQotICAgIHB1YmxpYyBVUklSZXNvbHZlckltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFVSSVJlc29sdmVySW1wbChDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBjbGFzc0xvYWRlciA9IGNsOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVVyaSkgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygicmVzb2x2ZUVudGl0eTogWyIrIG5hbWVzcGFjZSArICJdWyIrIHNjaGVtYUxvY2F0aW9uICsgIl1bICIgKyBiYXNlVXJpKyAiXSIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIFVSSSBwYXRoVVJJID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhdGhVUklTdHIgPSBudWxsOwotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJJbXBvcnQgbG9jYXRpb246ICIgKyBzY2hlbWFMb2NhdGlvbiArICIgcGFyZW50IGRvY3VtZW50OiAiICsgCi0gICAgICAgICAgICAgICAgICAgIGJhc2VVcmkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiYXNlVXJpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxvY2F0aW9uIGlzIGFuIGFic29sdXRlIHBhdGgsIGJ1aWxkIGEgVVJMIGRpcmVjdGx5Ci0gICAgICAgICAgICAgICAgLy8gZnJvbSBpdAotICAgICAgICAgICAgCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLSAgICAgICAgICAgIAkJbG9nLmRlYnVnKCJCYXNlIFVSSSBub3QgbnVsbCIpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZShzY2hlbWFMb2NhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0cmlldmluZyBpbnB1dCBzdHJlYW0gZm9yIGFic29sdXRlIHNjaGVtYSBsb2NhdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpcyA9IGdldElucHV0U3RyZWFtRm9yVVJJKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJzY2hlbWFMb2NhdGlvbiBub3QgaW4gYWJzb2x1dGUgcGF0aCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVUkkgPSBuZXcgVVJJKGJhc2VVcmkpOwotICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goVVJJU3ludGF4RXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gR290IFVSSVN5bnRheEV4Y2VwdGlvbiwgQ3JlYXRpb24gb2YgVVJJIHJlcXVpcmVzIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSB1c2Ugc3BlY2lhbCBlc2NhcGUgY2hhcmFjdGVycyBpbiBwYXRoLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFVSSSBjb25zdHJ1Y3RvciBiZWxvdyBkb2VzIHRoaXMgZm9yIHVzLCBzbyBsZXRzIHVzZSB0aGF0LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiR290IFVSSVN5bnRheEV4Y2VwdGlvbi4gRXhjZXB0aW9uIE1lc3NhZ2UgPSAiK2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkltcGxlbWVudGluZyBhbHRlcm5hdGUgd2F5IHRvIGNyZWF0ZSBVUkkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVSSSA9IG5ldyBVUkkobnVsbCwgbnVsbCwgYmFzZVVyaSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhVUklTdHIgPSBzY2hlbWFMb2NhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhYnNvbHV0ZSB3ZSBuZWVkIHRvIHJlc29sdmUgdGhlIHBhdGggd2l0aG91dCB0aGUgCi0gICAgICAgICAgICAgICAgICAgIC8vIHNjaGVtZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFVSSS5pc0Fic29sdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJlbnQgZG9jdW1lbnQgaXMgYXQgYWJzb2x1dGUgbG9jYXRpb246ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChiYXNlVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSSB0ZW1wVVJJOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFVSSSA9IG5ldyBVUkkodXJsLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKFVSSVN5bnRheEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Hb3QgVVJJU3ludGF4RXhjZXB0aW9uLCBDcmVhdGlvbiBvZiBVUkkgcmVxdWlyZXMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgdXNlIHNwZWNpYWwgZXNjYXBlIGNoYXJhY3RlcnMgaW4gcGF0aC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFVSSSBjb25zdHJ1Y3RvciBiZWxvdyBkb2VzIHRoaXMgZm9yIHVzLCBzbyBsZXRzIHVzZSB0aGF0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkdvdCBVUklTeW50YXhFeGNlcHRpb24uIEV4Y2VwdGlvbiBNZXNzYWdlID0gIitlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkltcGxlbWVudGluZyBhbHRlcm5hdGUgd2F5IHRvIGNyZWF0ZSBVUkkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wVVJJID0gbmV3IFVSSShudWxsLCBudWxsLCB1cmwuZ2V0UGF0aCgpLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJIHJlc29sdmVkVVJJID0gdGVtcFVSSS5yZXNvbHZlKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYmFjayB0aGUgc2NoZW1lIHRvIHRoZSByZXNvbHZlZCBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVSSVN0ciA9IGNvbnN0cnVjdFBhdGgodXJsLCByZXNvbHZlZFVSSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNvbHZlZCB0aGlzIHBhdGggdG8gaW1wb3J0ZWQgZG9jdW1lbnQ6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJU3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyZW50IGRvY3VtZW50IGlzIGF0IHJlbGF0aXZlIGxvY2F0aW9uOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVSSSA9IHBhdGhVUkkucmVzb2x2ZShzY2hlbWFMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoVVJJU3RyID0gcGF0aFVSSS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlc29sdmVkIHRoaXMgcGF0aCB0byBpbXBvcnRlZCBkb2N1bWVudDogIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFVSSVN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgcGF0aCBpcyBhYnNvbHV0ZSwgYnVpbGQgVVJMIGRpcmVjdGx5IGZyb20gaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUocGF0aFVSSVN0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gZ2V0SW5wdXRTdHJlYW1Gb3JVUkkocGF0aFVSSVN0cik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbG9jYXRpb24gaXMgcmVsYXRpdmUsIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gdXNpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJhc2VVUkksIHRoZW4gdXNlIHRoZSBsb2FkU3RyYXRlZ3kgdG8gZ2FpbiBhbiBpbnB1dAotICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgVVJJIHdpbGwgc3RpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG1vZHVsZQotICAgICAgICAgICAgICAgICAgICBpZihpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGNsYXNzTG9hZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGhVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgCWxvZy5kZWJ1ZygiRXhjZXB0aW9uIG9jY3VyZWQgaW4gcmVzb2x2ZUVudGl0eSwgaWdub3JpbmcgZXhjZXB0aW9uIGNvbnRpbnVpbmcgcHJvY2Vzc2luZyAiK2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiWFNEIGlucHV0IHN0cmVhbSBpcyBudWxsIGFmdGVyIHJlc29sdmluZyBpbXBvcnQgZm9yOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiArICIgZnJvbSBwYXJlbnQgZG9jdW1lbnQ6ICIgKyBiYXNlVXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJYU0QgaW5wdXQgc3RyZWFtIGlzIG5vdCBudWxsIGFmdGVyIHJlc29sdmluZyBpbXBvcnQgZm9yOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiArICIgZnJvbSBwYXJlbnQgZG9jdW1lbnQ6ICIgKyBiYXNlVXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElucHV0U291cmNlIHJldHVybklucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlzKTsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIHN5c3RlbUlkLiAgWG1sU2NoZW1hIHdpbGwgdXNlIHRoaXMgdmFsdWUgdG8gbWFpbnRhaW4gYSBjb2xsZWN0aW9uIG9mCi0gICAgICAgIC8vIGltcG9ydGVkIFhTRHMgdGhhdCBoYXZlIGJlZW4gcmVhZC4gIElmIHRoaXMgdmFsdWUgaXMgbnVsbCwgdGhlbiBjaXJjdWxhciBYU0RzIHdpbGwgCi0gICAgICAgIC8vIGNhdXNlIGluZmluaXRlIHJlY3Vyc2l2ZSByZWFkcy4KLSAgICAgICAgcmV0dXJuSW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQocGF0aFVSSVN0ciAhPSBudWxsID8gcGF0aFVSSVN0ciA6IHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJyZXR1cm5JbnB1dFNvdXJjZSA6IiArIHJldHVybklucHV0U291cmNlLmdldFN5c3RlbUlkKCkpOyAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVybklucHV0U291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGxvY2F0aW9uIGdpdmVuIGlzIGFuIGFic29sdXRlIChhY3R1YWwpIG9yIHJlbGF0aXZlIHBhdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQWJzb2x1dGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gYWJzb2x1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYgKGxvY2F0aW9uLmluZGV4T2YoIjovIikgIT0gLTEpIHsKLSAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5pbmRleE9mKCI6XFwiKSAhPSAtMSkgewotICAgICAgICAgICAgYWJzb2x1dGUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmluZGV4T2YoImZpbGU6IikgIT0gLTEpIHsKLSAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWJzb2x1dGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbnB1dCBzdHJlYW0gZnJvbSB0aGUgdXJpIGdpdmVuLiBJZiB3ZSBjYW5ub3QgZmluZCB0aGUgc3RyZWFtLCA8Y29kZT5udWxsPC9jb2RlPiBpcwotICAgICAqIHJldHVybmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtRm9yVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgVVJMIHN0cmVhbVVSTCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgVVJJIHBhdGhVUkkgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJlYW1VUkwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICAgICAgICBpcyA9IG9wZW5TdHJlYW1fZG9Qcml2KHN0cmVhbVVSTCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAvL0V4Y2VwdGlvbiBoYW5kbGluZyBub3QgbmVlZGVkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXRoVVJJID0gbmV3IFVSSSh1cmkpOwotICAgICAgICAgICAgICAgIHN0cmVhbVVSTCA9IHBhdGhVUkkudG9VUkwoKTsKLSAgICAgICAgICAgICAgICBpcyA9IG9wZW5TdHJlYW1fZG9Qcml2KHN0cmVhbVVSTCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vRXhjZXB0aW9uIGhhbmRsaW5nIG5vdCBuZWVkZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVVJMID0gKFVSTCkgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIGlzID0gb3BlblN0cmVhbV9kb1ByaXYoc3RyZWFtVVJMKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgLy9FeGNlcHRpb24gaGFuZGxpbmcgbm90IG5lZWRlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIG9wZW5TdHJlYW1fZG9Qcml2KGZpbmFsIFVSTCBzdHJlYW1VUkwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gKElucHV0U3RyZWFtKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29uc3RydWN0UGF0aChVUkwgYmFzZVVSTCwgVVJJIHJlc29sdmVkVVJJKSB7Ci0gICAgICAgIFN0cmluZyBpbXBvcnRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQWxsb3cgZm9yIGh0dHAgb3IgaHR0cHMKLSAgICAgICAgICAgIGlmIChiYXNlVVJMLmdldFByb3RvY29sKCkgIT0gbnVsbCAmJiAKLSAgICAgICAgICAgICAgICAgICAgKGJhc2VVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoSFRUUF9QUk9UT0NPTCkgfHwgCi0gICAgICAgICAgICAgICAgICAgICBiYXNlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKEhUVFBTX1BST1RPQ09MKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoQlVORExFX1JFU09VUkNFX1BST1RPQ09MKSkpIHsKLSAgICAgICAgICAgIAlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAJCWxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIHBhdGggd2l0aCBodHRwL2h0dHBzIHByb3RvY29sIik7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZVVSTC5nZXRQcm90b2NvbCgpLCBiYXNlVVJMLmdldEhvc3QoKSwgYmFzZVVSTC5nZXRQb3J0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLQkJCQkJbG9nLmRlYnVnKCJVUkwgPSAiICsgdXJsKTsKLQkJCQl9Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGZvciBmaWxlCi0gICAgICAgICAgICBlbHNlIGlmIChiYXNlVVJMLmdldFByb3RvY29sKCkgIT0gbnVsbCAmJiBiYXNlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKEZJTEVfUFJPVE9DT0wpKSB7Ci0gICAgICAgICAgICAJaWYobG9nLmlzRGVidWdFbmFibGVkKCkpewotICAgICAgICAgICAgCQlsb2cuZGVidWcoIkNvbnN0cnVjdGluZyBwYXRoIHdpdGggZmlsZSBwcm90b2NvbCIpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGJhc2VVUkwuZ2V0UHJvdG9jb2woKSwgYmFzZVVSTC5nZXRIb3N0KCksIHJlc29sdmVkVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9DaGVjayBmb3IgamFyCi0gICAgICAgICAgICBlbHNlIGlmIChiYXNlVVJMLmdldFByb3RvY29sKCkgIT0gbnVsbCAmJiBiYXNlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKEpBUl9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIAlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAJCWxvZy5kZWJ1ZygiQ29uc3RydWN0aW5nIHBhdGggd2l0aCBqYXIgcHJvdG9jb2wiKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJdXJsID0gbmV3IFVSTChiYXNlVVJMLmdldFByb3RvY29sKCksIGJhc2VVUkwuZ2V0SG9zdCgpLCByZXNvbHZlZFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgaWYoYmFzZVVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAvLyB0cnkgY29uc3RydWN0aW5nIGl0IHdpdGggdW5rbm93biBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvbnN0cnVjdGluZyBwYXRoIHdpdGggdW5rbm93biBwcm90b2NvbDogIiArIGJhc2VVUkwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTChiYXNlVVJMLmdldFByb3RvY29sKCksIGJhc2VVUkwuZ2V0SG9zdCgpLCByZXNvbHZlZFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoImJhc2VVUkwgaXMgTlVMTCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldE1lc3NhZ2UoInNjaGVtYUltcG9ydEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFVSSS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwudG9TdHJpbmcoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJzY2hlbWFJbXBvcnRFcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRVUkkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpbXBvcnRMb2NhdGlvbiA9IHVybC50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gaW1wb3J0TG9jYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL0VuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYjcyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTURRQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5EZXNjcmlwdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLQotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmU7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgewotICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjOwotICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIGVuZHBvaW50RGVzY0phdmE7Ci0gICAgRW5kcG9pbnREZXNjcmlwdGlvbldTREwgZW5kcG9pbnREZXNjV1NETDsKLQotICAgIHB1YmxpYyBFbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yKEVuZHBvaW50RGVzY3JpcHRpb24gdG9WYWxpZGF0ZSkgewotICAgICAgICBlbmRwb2ludERlc2MgPSB0b1ZhbGlkYXRlOwotICAgICAgICBlbmRwb2ludERlc2NKYXZhID0gKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKWVuZHBvaW50RGVzYzsKLSAgICAgICAgZW5kcG9pbnREZXNjV1NETCA9IChFbmRwb2ludERlc2NyaXB0aW9uV1NETCllbmRwb2ludERlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0KLSAgICAgICAgaWYgKGdldFZhbGlkYXRpb25MZXZlbCgpID09IFZhbGlkYXRpb25MZXZlbC5PRkYpIHsKLSAgICAgICAgICAgIHJldHVybiBWQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vVGhlIGZvbGxvd2luZyBwaGFzZSBJSSB2YWxpZGF0aW9uIGNhbiBvbmx5IGhhcHBlbiBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYy5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKS5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVdTRExQb3J0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVdTRExCaW5kaW5nVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICghdmFsaWRhdGVSZXNwZWN0QmluZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbGlkYXRlRW5kcG9pbnRJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZBTElEOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVdTRExCaW5kaW5nVHlwZSgpIHsKLSAgICAgICAgYm9vbGVhbiBpc0JpbmRpbmdWYWxpZCA9IGZhbHNlOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIGJpbmRpbmcgdHlwZSBmcm9tIHRoZSBhbm5vdGF0aW9uCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGVuZHBvaW50RGVzYy5nZXRCaW5kaW5nVHlwZSgpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlIHdzZGwgYmluZGluZyB0eXBlIHRoYXQgd2Ugbm93IHJlY2VpdmUgaGFzIGJlZW4gcHJldmlvdXNseSBtYXBwZWQgdG8gdGhlIGV4cGVjdGVkCi0gICAgICAgIC8vIFNPQVAgYW5kIEhUVFAgYmluZGluZ3MuIFNvLCB0aGVyZSBpcyBub3cgbGltaXRlZCB2YWxpZGF0aW9uIHRvIHBlcmZvcm0uCi0gICAgICAgIC8vIAotICAgICAgICAvLyBJTVBPUlRBTlQgTk9URTogVGhlIHZhbHVlIHJldHVybmVkIGlzIE5PVCB0aGUgV1NETCBCaW5kaW5nIFR5cGUgdmFsdWU7IGl0IGhhcyBiZWVuCi0gICAgICAgIC8vICAgIG5vcm1hbGl6ZWQgdG8gYmUgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpBWFdTIEJpbmRpbmdUeXBlIGFubm90YXRpb25zLgotICAgICAgICAvLyAgICBUaGF0IG1lYW5zIHdoZW4gd2UgbG9nIHRoaXMgdmFsdWUgYmVsb3cgd2UgbmVlZCB0byB1bi1ub3JtYWxpemUgaXQgc28gdGhlIHZhbHVlCi0gICAgICAgIC8vICAgIGlzIG9uZSB0aGF0IGFjdHVhbGwgYXBwZWFycyBpbiB0aGUgV1NETC4gIFRoaXMgaXNuJ3QgYW4gaXNzdWUgZm9yIFNPQVAxMSBiZWNhdXNlCi0gICAgICAgIC8vICAgIHRoZSB2YWx1ZXMgYXJlIHRoZSBzYW1lOyBidXQgaXQgSVMgYW4gaXNzdWUgZm9yIFNPQVAxMi4KLSAgICAgICAgU3RyaW5nIHdzZGxCaW5kaW5nVHlwZSA9IGVuZHBvaW50RGVzY1dTREwuZ2V0V1NETEJpbmRpbmdUeXBlKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJIGRvbid0IHRoaW5rIHRoaXMgY2FuIGhhcHBlbjsgdGhlIERlc2NyaXB0aW9uIGxheWVyIHNob3VsZCBwcm92aWRlIGEgZGVmYXVsdAotICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbm5vdGF0aW9uIGJpbmRpbmcgdHlwZSBpcyBudWxsIGFuZCBkaWQgbm90IGhhdmUgYSBkZWZhdWx0Iik7Ci0gICAgICAgICAgICBpc0JpbmRpbmdWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGFubm90YXRpb24gdmFsdWUgc3BlY2lmaWVkIGlzIHZhbGlkLgotICAgICAgICBlbHNlIGlmICghU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSkgJiYKLSAgICAgICAgICAgICAgICAhU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpICYmCi0gICAgICAgICAgICAgICAgIU1EUUNvbnN0YW50cy5TT0FQMTFKTVNfQklORElORy5lcXVhbHMoYmluZGluZ1R5cGUpICYmCi0gICAgICAgICAgICAgICAgIU1EUUNvbnN0YW50cy5TT0FQMTFKTVNfTVRPTV9CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSkgJiYKLSAgICAgICAgICAgICAgICAhTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HLmVxdWFscyhiaW5kaW5nVHlwZSkgJiYKLSAgICAgICAgICAgICAgICAhTURRQ29uc3RhbnRzLlNPQVAxMkpNU19NVE9NX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSAmJgotICAgICAgICAgICAgICAgICFNRFFDb25zdGFudHMuU09BUF9IVFRQX0JJTkRJTkcuZXF1YWxzKGJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYW5ub3RhdGlvbiBiaW5kaW5nIHZhbHVlIHNwZWNpZmllZDogIiArIGJpbmRpbmdUeXBlKTsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihiaW5kaW5nVHlwZS5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVBfSFRUUF9CSU5ESU5HKSAmJiBlbmRwb2ludERlc2MuaXNFbmRwb2ludEJhc2VkKCkpewotICAgICAgICAJYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywKLSAgICAgICAgICAgICAgICAgICAgIkEgU09BUF9IVFRQX0JJTkRJTkcgd2FzIGZvdW5kIG9uIGEgQEJpbmRpbmd0eXBlIFNFSSBiYXNlZCBFbmRwb2ludC4iICsKLSAgICAgICAgICAgICAgICAgICAgIiBTT0FQX0hUVFBfQklORElORyBpcyBzdXBwb3J0ZWQgb24gUHJvdmlkZXIgRW5kcG9pbnRzIG9ubHkuIik7Ci0gICAgICAgIAlpc0JpbmRpbmdWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gV1NETCwgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIFdTREwgQmluZGluZyBUeXBlIHRvIHZhbGlkYXRlIGFnYWluc3QKLSAgICAgICAgZWxzZSBpZiAod3NkbEJpbmRpbmdUeXBlID09IG51bGwpIHsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBXU0RMIHZhbHVlIGlzIHZhbGlkCi0gICAgICAgIGVsc2UgaWYgKCFTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcuZXF1YWxzKHdzZGxCaW5kaW5nVHlwZSkKLSAgICAgICAgICAgICAgICAmJiAhU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLmVxdWFscyh3c2RsQmluZGluZ1R5cGUpCi0gICAgICAgICAgICAgICAgJiYgIWphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nLkhUVFBfQklORElORy5lcXVhbHMod3NkbEJpbmRpbmdUeXBlKSkgewotICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUodGhpcywgIkludmFsaWQgd3NkbCBiaW5kaW5nIHZhbHVlIHNwZWNpZmllZDogIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRGVzY3JpcHRpb25VdGlscy5tYXBCaW5kaW5nVHlwZUFubm90YXRpb25Ub1dzZGwod3NkbEJpbmRpbmdUeXBlKSk7Ci0gICAgICAgICAgICBpc0JpbmRpbmdWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIFdTREwgYW5kIGFubm90YXRpb25zIHZhbHVlcyBpbmRpY2F0ZSB0aGUgc2FtZSB0eXBlIG9mIGJpbmRpbmcKLSAgICAgICAgZWxzZSBpZiAod3NkbEJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpCi0gICAgICAgICAgICAgICAgJiYgKGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HKSkpIHsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh3c2RsQmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykKLSAgICAgICAgICAgICAgICAmJiAoYmluZGluZ1R5cGUuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORykgfHwKLSAgICAgICAgICAgICAgICBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpKSkgewotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHdzZGxCaW5kaW5nVHlwZS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKQotICAgICAgICAgICAgICAgICAmJiBiaW5kaW5nVHlwZS5lcXVhbHMoSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HKSkgewotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBIVFRQIGJpbmRpbmcgaXMgbm90IHZhbGlkIG9uIGEgSmF2YSBCZWFuIFNFSS1iYXNlZCBlbmRwb2ludDsgb25seSBvbiBhIFByb3ZpZGVyIGJhc2VkIG9uZS4KLSAgICAgICAgZWxzZSBpZiAod3NkbEJpbmRpbmdUeXBlLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpICYmCi0gICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjLmlzRW5kcG9pbnRCYXNlZCgpKSB7Ci0gICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuIEhUVFBCaW5kaW5nIHdhcyBmb3VuZCBvbiBhbiBAV2ViU2VydmljZSBTRUkgYmFzZWQgZW5kcG9pbnQuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgbm90IHN1cHBvcnRlZC4gICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuIEhUVFBCaW5kaW5nIG11c3QgdXNlIGFuIEBXZWJTZXJ2aWNlUHJvdmlkZXIgZW5kcG9pbnQuIik7Ci0gICAgICAgICAgICBpc0JpbmRpbmdWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHdzZGwgYmluZGluZyBpcyBub3QgSFRUUCBiaW5kaW5nIGFuZCBCaW5kaW5nVHlwZSBhbm5vdGF0aW9uIGlzIFNPQVBfSFRUUF9CSU5ESU5HIHRoZW4KLSAgICAgICAgLy8gd3NkbCBpcyB2YWxpZCBhbmQgSkFYLVdTIG5lZWRzIHRvIHN1cHBvcnQgYm90aCBzb2FwIDExIGFuZCBzb2FwIDEyIG9uIFByb3ZpZGVyIGVuZHBvaW50cy4KLSAgICAgICAgZWxzZSBpZighd3NkbEJpbmRpbmdUeXBlLmVxdWFscyhIVFRQQmluZGluZy5IVFRQX0JJTkRJTkcpIAotICAgICAgICAgICAgJiYgYmluZGluZ1R5cGUuZXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQX0hUVFBfQklORElORykgJiYgZW5kcG9pbnREZXNjLmlzUHJvdmlkZXJCYXNlZCgpKXsKLSAgICAgICAgICAgIGlzQmluZGluZ1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTWlzbWF0Y2hlZCBiaW5kaW5ncyAKLSAgICAgICAgICAgIFN0cmluZyB3c2RsSW5zZXJ0ID0gIlsiICsgYmluZGluZ0h1bWFuUmVhZGFibGVEZXNjcmlwdGlvbih3c2RsQmluZGluZ1R5cGUpICsgIl0iICsKLSAgICAgICAgICAgICAgICAibmFtZXNwYWNlID0geyIgKyBEZXNjcmlwdGlvblV0aWxzLm1hcEJpbmRpbmdUeXBlQW5ub3RhdGlvblRvV3NkbCh3c2RsQmluZGluZ1R5cGUpICsifSI7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbkluc2VydCA9ICJbIiArIGJpbmRpbmdIdW1hblJlYWRhYmxlRGVzY3JpcHRpb24oYmluZGluZ1R5cGUpICsgIl0iICsKLSAgICAgICAgICAgICAgICAibmFtZXNwYWNlID0geyIgKyBiaW5kaW5nVHlwZSArIn0iOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmdldE1lc3NhZ2UoImVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0aW9uIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbEluc2VydCwgYW5ub3RhdGlvbkluc2VydCk7Ci0gICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaXNCaW5kaW5nVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBpc0JpbmRpbmdWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVXU0RMUG9ydCgpIHsKLSAgICAgICAgLy8gVkFMSURBVElPTjogSWYgdGhlIHNlcnZpY2UgaXMgc3BlY2lmaWVkIGluIHRoZSBXU0RMLCB0aGVuIHRoZSBwb3J0IG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuCi0gICAgICAgIC8vICAgICAgICAgICAgIElmIHRoZSBzZXJ2aWNlIGlzIE5PVCBpbiB0aGUgV1NETCwgdGhlbiB0aGlzIGlzICJwYXJ0aWFsIHdzZGwiIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHZhbGlkYXRlCi0gICAgICAgIC8vICAgICAgICAgICAgIGFnYWluc3QgdGhlIFdTREwKLSAgICAgICAgU2VydmljZSB3c2RsU2VydmljZSA9IGVuZHBvaW50RGVzY1dTREwuZ2V0V1NETFNlcnZpY2UoKTsKLSAgICAgICAgaWYgKHdzZGxTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSBlbmRwb2ludERlc2NXU0RMLmdldFdTRExQb3J0KCk7Ci0gICAgICAgICAgICBpZiAod3NkbFBvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcml2Y2UgZXhpc3RzIGluIFdTREwsIGJ1dCBQb3J0IGRvZXMgbm90LiAgTm90IGEgdmFsaWQgUGFydGlhbCBXU0RMLiAgU2VydmljZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlbmRwb2ludERlc2MuZ2V0U2VydmljZVFOYW1lKCkgKyAiOyBQb3J0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzYy5nZXRQb3J0UU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZBTElEOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUVuZHBvaW50SW50ZXJmYWNlKCkgewotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IGVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChlaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvciBlaWRWYWxpZGF0b3IgPQotICAgICAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvcihlaWQpOwotICAgICAgICAgICAgYm9vbGVhbiBpc0VuZHBvaW50SW50ZXJmYWNlVmFsaWQgPSBlaWRWYWxpZGF0b3IudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGlmICghaXNFbmRwb2ludEludGVyZmFjZVZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUoZWlkVmFsaWRhdG9yLCAiSW52YWxpZCBFbmRwb2ludCBJbnRlcmZhY2UiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogSWYgdGhlIEBSZXNwZWN0QmluZGluZyBhbm5vdGF0aW9uIGlzIHByZXNlbnQsIHRoZW4gd2UgbXVzdCBhbHNvIGhhdmUgYSBXU0RMIAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJlc3BlY3RCaW5kaW5nKCkgewotICAgICAgICAvLyBJZiBhIFdTREwgd2l0aCBhIHZhbGlkIDx3c2RsOnBvcnQ+IHdhcyBwcmVzZW50LCB0aGVuIHRoZSBXU0RMIGlzIGNvbnNpZGVyZWQKLSAgICAgICAgLy8gZnVsbHkgc3BlY2lmaWVkLiAgV2l0aG91dCB0aGF0LCB0aGUgQFJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24gaXMgaW52YWxpZC4KLSAgICAgICAgaWYgKGVuZHBvaW50RGVzYy5yZXNwZWN0QmluZGluZygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghZW5kcG9pbnREZXNjLmlzUHJvdmlkZXJCYXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gZW5kcG9pbnREZXNjSmF2YS5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gZW5kcG9pbnREZXNjSmF2YS5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkud3NkbExvY2F0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24gPT0gbnVsbCB8fCB3c2RsTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsICJBbm5vdGF0aW9uIEBSZXNwZWN0QmluZGluZyByZXF1aXJlcyB0aGF0IGEgV1NETCBmaWxlIGJlIHNwZWNpZmllZC4iKTsgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvci5JTlZBTElEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSB3aWxsIHZhbGlkYXRlIHRoZSBjb25maWd1cmVkIGJpbmRpbmdzIGJhc2VkIG9uIHRoZWlyIG1hcHBpbmcKLSAgICAgICAgICAgIC8vIHRvIGEga25vd24gV2ViU2VydmljZUZlYXR1cmUgZWxlbWVudC4gIElmIHRoZXJlIGlzIG5vdCBhIFdlYlNlcnZpY2VGZWF0dXJlCi0gICAgICAgICAgICAvLyBhbm5vdGF0aW9uIGZvciBhIGdpdmVuIGJpbmRpbmcsIGEgdmFsaWRhdGlvbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgICAgICAgICAgTGlzdCByZXF1aXJlZCA9IGVuZHBvaW50RGVzYy5nZXRSZXF1aXJlZEJpbmRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAocmVxdWlyZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSByZXF1aXJlZC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSBuYW1lID0gKFFOYW1lKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZlYXR1cmVOYW1lID0gZ2V0RmVhdHVyZUZvckJpbmRpbmcobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlTmFtZSAhPSBudWxsICYmIGZlYXR1cmVOYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgZWRqID0gKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKSBlbmRwb2ludERlc2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm8gPSBlZGouZ2V0QW5ub0ZlYXR1cmUoZmVhdHVyZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIGZlYXR1cmUgPSBnZXRGZWF0dXJlRnJvbUFubm90YXRpb24oYW5ubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLCAiQW5ub3RhdGlvbiBAUmVzcGVjdEJpbmRpbmcgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlc3BvbmRpbmcgZmVhdHVyZSAiICsgZmVhdHVyZU5hbWUgKyAiIHdhcyBub3QgZW5hYmxlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdG9yLklOVkFMSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICBhZGRWYWxpZGF0aW9uRmFpbHVyZSh0aGlzLCAiQW5ub3RhdGlvbiBAUmVzcGVjdEJpbmRpbmcgd2FzIGVuYWJsZWQsIGJ1dCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgIiB3YXMgbm90IHJlY29nbml6ZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3IuSU5WQUxJRDsKLSAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHJldHVybiBWYWxpZGF0b3IuVkFMSUQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIGdldEZlYXR1cmVGcm9tQW5ub3RhdGlvbihBbm5vdGF0aW9uIGEpIHsKLSAgICAgICAgcmV0dXJuIGEuYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbi5jbGFzcyk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiaW5kaW5nSHVtYW5SZWFkYWJsZURlc2NyaXB0aW9uKFN0cmluZyBucykgewotICAgICAgICBpZiAoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjEgSFRUUCBCaW5kaW5nIjsKLSAgICAgICAgfSBlbHNlIGlmIChTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAgMS4xIE1UT00gSFRUUCBCaW5kaW5nIjsKLSAgICAgICAgfSBlbHNlIGlmIChTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcuZXF1YWxzKG5zKSkgewotICAgICAgICAgICAgcmV0dXJuICJTT0FQIDEuMiBIVFRQIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLmVxdWFscyhucykpIHsKLSAgICAgICAgICAgIHJldHVybiAiU09BUCAxLjIgTVRPTSBIVFRQIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKE1EUUNvbnN0YW50cy5TT0FQMTFKTVNfQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAgMS4xIEpNUyBCaW5kaW5nIjsKLSAgICAgICAgfSBlbHNlIGlmIChNRFFDb25zdGFudHMuU09BUDExSk1TX01UT01fQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAgMS4xIE1UT00gSk1TIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAgMS4yIEpNUyBCaW5kaW5nIjsKLSAgICAgICAgfSBlbHNlIGlmIChNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlNPQVAgMS4yIE1UT00gSk1TIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgaWYgKEhUVFBCaW5kaW5nLkhUVFBfQklORElORy5lcXVhbHMobnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlhNTCBIVFRQIEJpbmRpbmciOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIEJpbmRpbmciOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGZWF0dXJlRm9yQmluZGluZyhRTmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiwgIlVzaW5nQWRkcmVzc2luZyIpKSkgewotICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NpbmdGZWF0dXJlLklEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL0VuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkNGIzMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uT3BlcmF0aW9uRGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7Ci0gICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlcEludGVyZmFjZURlc2M7Ci0gICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEgZXBJbnRlcmZhY2VEZXNjSmF2YTsKLSAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uV1NETCBlcEludGVyZmFjZURlc2NXU0RMOwotCi0gICAgcHVibGljIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25WYWxpZGF0b3IoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0b1ZhbGlkYXRlKSB7Ci0gICAgICAgIGVwSW50ZXJmYWNlRGVzYyA9IHRvVmFsaWRhdGU7Ci0gICAgICAgIGVwSW50ZXJmYWNlRGVzY0phdmEgPSAoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEpZXBJbnRlcmZhY2VEZXNjOwotICAgICAgICBlcEludGVyZmFjZURlc2NXU0RMID0gKEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25XU0RMKWVwSW50ZXJmYWNlRGVzYzsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3IuVmFsaWRhdG9yI3ZhbGlkYXRlKCkKLSAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotICAgICAgICBpZiAoZ2V0VmFsaWRhdGlvbkxldmVsKCkgPT0gVmFsaWRhdGlvbkxldmVsLk9GRikgewotICAgICAgICAgICAgcmV0dXJuIFZBTElEOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdmFsaWRhdGVTRUl2c1dTRExQb3J0VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXZhbGlkYXRlU0VJdnNJbXBsZW1lbnRhdGlvbigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlU0VJdnNXU0RMUG9ydFR5cGUoKSB7Ci0gICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gZXBJbnRlcmZhY2VEZXNjV1NETC5nZXRXU0RMUG9ydFR5cGUoKTsKLSAgICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IE5lZWQgbW9yZSB2YWxpZGF0aW9uIGhlcmUsIGluY2x1ZGluZzogb3BlcmF0aW9uIG5hbWUsIHBhcmFtZXRlcnMsIGZhdWx0cwotICAgICAgICAgICAgTGlzdCB3c2RsT3BlcmF0aW9uTGlzdCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKTsKLQotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBkaXNwYXRjaGFibGVPcERlc2NBcnJheSA9IAotICAgICAgICAgICAgICAgIGVwSW50ZXJmYWNlRGVzYy5nZXREaXNwYXRjaGFibGVPcGVyYXRpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICBpZiAod3NkbE9wZXJhdGlvbkxpc3Quc2l6ZSgpICE9IGRpc3BhdGNoYWJsZU9wRGVzY0FycmF5Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsICJUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgaW4gdGhlIFdTREwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicG9ydFR5cGUgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBtZXRob2RzIGluIHRoZSBTRUkgb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ3c2RsIG9wZXJhdGlvbnMgPSBbIiArIHRvU3RyaW5nKHdzZGxPcGVyYXRpb25MaXN0KSArIl0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGF0Y2ggb3BlcmF0aW9ucyA9IFsiICsgdG9TdHJpbmcoZGlzcGF0Y2hhYmxlT3BEZXNjQXJyYXkpICsiXSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSB0aGUgc2FtZSBzaXplLCBsZXQncyBjaGVjayB0byBzZWUgaWYgdGhlIG9wZXJhdGlvbiBuYW1lcyBtYXRjaAotICAgICAgICAgICAgaWYgKCFjaGVja09wZXJhdGlvbnNNYXRjaE1ldGhvZHMod3NkbE9wZXJhdGlvbkxpc3QsIGRpc3BhdGNoYWJsZU9wRGVzY0FycmF5KSkgewotICAgICAgICAgICAgICAgIGFkZFZhbGlkYXRpb25GYWlsdXJlKHRoaXMsICJUaGUgb3BlcmF0aW9uIG5hbWVzIGluIHRoZSBXU0RMIHBvcnRUeXBlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImRvIG5vdCBtYXRjaCB0aGUgbWV0aG9kIG5hbWVzIGluIHRoZSBTRUkgb3IgV2ViIHNlcnZpY2UgaSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIm1wbGVtZW50YXRpb24gY2xhc3MuICAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJ3c2RsIG9wZXJhdGlvbnMgPSBbIiArIHRvU3RyaW5nKHdzZGxPcGVyYXRpb25MaXN0KSArIl0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGF0Y2ggb3BlcmF0aW9ucyA9IFsiICsgdG9TdHJpbmcoZGlzcGF0Y2hhYmxlT3BEZXNjQXJyYXkpICsiXSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWQUxJRDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPcGVyYXRpb25zTWF0Y2hNZXRob2RzKExpc3Qgd3NkbE9wZXJhdGlvbkxpc3QsIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10KLSAgICAgICAgICAgIG9wRGVzY0FycmF5KSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBvcE5hbWVMaXN0ID0gY3JlYXRlV1NETE9wZXJhdGlvbk5hbWVMaXN0KHdzZGxPcGVyYXRpb25MaXN0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcERlc2NBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjID0gb3BEZXNjQXJyYXlbaV07Ci0gICAgICAgICAgICBpZiAob3BOYW1lTGlzdC5jb250YWlucyhvcERlc2MuZ2V0T3BlcmF0aW9uTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIG9wTmFtZUxpc3QucmVtb3ZlKG9wRGVzYy5nZXRPcGVyYXRpb25OYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gY3JlYXRlV1NETE9wZXJhdGlvbk5hbWVMaXN0KExpc3Qgd3NkbE9wZXJhdGlvbkxpc3QpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IG9wTmFtZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgSXRlcmF0b3Igd3NkbE9wSXRlciA9IHdzZGxPcGVyYXRpb25MaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlICh3c2RsT3BJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHdzZGxPcEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKW9iajsKLSAgICAgICAgICAgICAgICBvcE5hbWVMaXN0LmFkZChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3BOYW1lTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVTRUl2c0ltcGxlbWVudGF0aW9uKCkgewotICAgICAgICAvLyBSRVZJRVc6IFRoaXMgbGV2ZWwgb2YgdmFsaWRhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgZG9uZSBieSB0aGUgREJDIENvbXBvc2l0ZSB2YWxpZGF0aW9uCi0gICAgICAgIHJldHVybiBWQUxJRDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKExpc3Qgd3NkbE9wZXJhdGlvbkxpc3QpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICBJdGVyYXRvciB3c2RsT3BJdGVyID0gd3NkbE9wZXJhdGlvbkxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHdzZGxPcEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gd3NkbE9wSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pb2JqOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBvcGVyYXRpb24uZ2V0TmFtZSgpICsgIiAiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhPcGVyYXRpb25EZXNjcmlwdGlvbltdIHdzZGxPcERlc2NzKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICAgICAgZm9yIChpbnQgaT0gMDsgaTx3c2RsT3BEZXNjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ICs9IHdzZGxPcERlc2NzW2ldLmdldE9wZXJhdGlvbk5hbWUoKSArICIgIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9PcGVyYXRpb25EZXNjcmlwdGlvblZhbGlkYXRvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL09wZXJhdGlvbkRlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NDAzYTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL09wZXJhdGlvbkRlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24udmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5PcGVyYXRpb25EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLk9wZXJhdGlvbkRlc2NyaXB0aW9uV1NETDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbkRlc2NyaXB0aW9uVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYzsKLSAgICBwcml2YXRlIE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSBvcERlc2NKYXZhOwotICAgIHByaXZhdGUgT3BlcmF0aW9uRGVzY3JpcHRpb25XU0RMIG9wRGVzY1dTREw7Ci0KLQotICAgIHB1YmxpYyBPcGVyYXRpb25EZXNjcmlwdGlvblZhbGlkYXRvcihPcGVyYXRpb25EZXNjcmlwdGlvbiB0b1ZhbGlkYXRlKSB7Ci0gICAgICAgIG9wRGVzYyA9IHRvVmFsaWRhdGU7Ci0gICAgICAgIG9wRGVzY0phdmEgPSAoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wRGVzYzsKLSAgICAgICAgb3BEZXNjV1NETCA9IChPcGVyYXRpb25EZXNjcmlwdGlvbldTREwpb3BEZXNjOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3IuVmFsaWRhdG9yI3ZhbGlkYXRlKCkKLSAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotICAgICAgICBpZiAoZ2V0VmFsaWRhdGlvbkxldmVsKCkgPT0gVmFsaWRhdGlvbkxldmVsLk9GRikgewotICAgICAgICAgICAgcmV0dXJuIFZBTElEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUkVWSUVXOiBTaG91bGQgdGhlcmUgYmUgb3BlcmF0aW9uLWxldmVsIHZhbGlkYXRpb24gcGVyZm9ybWVkIGhlcmU/Ci0gICAgICAgIHJldHVybiBWQUxJRDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9TZXJ2aWNlRGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9TZXJ2aWNlRGVzY3JpcHRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMDkzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi92YWxpZGF0b3IvU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24udmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uSmF2YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbldTREw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VEZXNjcmlwdGlvblZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYzsKLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbkphdmEgc2VydmljZURlc2NKYXZhOwotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0aW9uV1NETCBzZXJ2aWNlRGVzY1dTREw7Ci0KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0aW9uVmFsaWRhdG9yKFNlcnZpY2VEZXNjcmlwdGlvbiB0b1ZhbGlkYXRlKSB7Ci0gICAgICAgIHNlcnZpY2VEZXNjID0gdG9WYWxpZGF0ZTsKLSAgICAgICAgc2VydmljZURlc2NKYXZhID0gKFNlcnZpY2VEZXNjcmlwdGlvbkphdmEpc2VydmljZURlc2M7Ci0gICAgICAgIHNlcnZpY2VEZXNjV1NETCA9IChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKXNlcnZpY2VEZXNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gYXMgZm9sbG93cyAxKSBWYWxpZGF0ZSB0aGF0IGFubm90YXRpb25zIGFuZCB3aGF0ZXZlciBXU0RMIGlzCi0gICAgICogc3BlY2lmaWVkIGlzIHZhbGlkIDIpIFZhbGlkYXRlIHRoYXQgSmF2YSBpbXBsZW1lbnRhdGlvbnMgYXJlIGNvcnJlYyBhKSBTZXJ2aWNlCi0gICAgICogSW1wbGVtZW50YXRpb25zIG1hdGNoIFNFSXMgaWYgc3BlY2lmaWVkIGIpIE9wZXJhdGlvbnMgbWF0Y2ggU0VJIG1ldGhvZHMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU2VydmljZURlc2NyaXB0aW9uIGlzIHZhbGlkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoKSB7Ci0gICAgICAgIGlmIChnZXRWYWxpZGF0aW9uTGV2ZWwoKSA9PSBWYWxpZGF0aW9uTGV2ZWwuT0ZGKSB7Ci0gICAgICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbGlkYXRlRW5kcG9pbnREZXNjcmlwdGlvbnMoKSkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gVkFMSUQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlRW5kcG9pbnREZXNjcmlwdGlvbnMoKSB7Ci0gICAgICAgIGJvb2xlYW4gYXJlQWxsVmFsaWQgPSB0cnVlOwotICAgICAgICAvLyBWYWxpZGF0ZSBhbGwgdGhlIEVuZHBvaW50cyB0aGF0IHdlcmUgY3JlYXRlZCB1bmRlciB0aGlzIFNlcnZpY2UgRGVzY3JpcHRpb24KLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlbmRwb2ludERlc2NzID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnNfQXNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIGZvciAoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2M6ZW5kcG9pbnREZXNjcykgewotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvblZhbGlkYXRvciBlbmRwb2ludFZhbGlkYXRvciA9IG5ldyBFbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdG9yKGVuZHBvaW50RGVzYyk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNFbmRwb2ludFZhbGlkID0gZW5kcG9pbnRWYWxpZGF0b3IudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGlmICghaXNFbmRwb2ludFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgYWRkVmFsaWRhdGlvbkZhaWx1cmUoZW5kcG9pbnRWYWxpZGF0b3IsICJFbmRwb2ludCBmYWlsZWQgdmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgICAgIGFyZUFsbFZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFyZUFsbFZhbGlkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1ZhbGlkYXRpb25GYWlsdXJlcy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1ZhbGlkYXRpb25GYWlsdXJlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI2MzUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9WYWxpZGF0aW9uRmFpbHVyZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFJlY29yZCBWYWxpZGF0b3IgRmFpbHVyZXMuCi0gKiBUaGUgdmFsaWRhdG9yIGZhaWx1cmVzIGFyZSBnYXRoZXJlZCBhbmQgdGhlbiBpc3N1ZWQgYXQgdGhlIGVuZCBvZiB0aGUgdmFsaWRhdGlvbiBwaGFzZS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25GYWlsdXJlcyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVmFsaWRhdGlvbkZhaWx1cmVzLmNsYXNzKTsKLSAgICBBcnJheUxpc3Q8VmFsaWRhdGlvbkZhaWx1cmU+IHZhbGlkYXRpb25GYWlsdXJlcyA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvbkZhaWx1cmU+KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoVmFsaWRhdG9yIGZhaWxpbmdWYWxpZGF0b3IsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIFZhbGlkYXRpb25GYWlsdXJlIHZmID0gbmV3IFZhbGlkYXRpb25GYWlsdXJlKGZhaWxpbmdWYWxpZGF0b3IsIG1lc3NhZ2UpOwotICAgICAgICB2YWxpZGF0aW9uRmFpbHVyZXMuYWRkKHZmKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBZGRpbmcgVmFsaWRhdGlvbkZhaWx1cmUgPSAiICsgdmYudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBsb2cudHJhY2UoIkxvY2F0aW9uIG9mIFZhbGlkYXRpb24gRmFpbHVyZSA9ICIgKyBKYXZhVXRpbHMuY2FsbFN0YWNrVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxWYWxpZGF0aW9uRmFpbHVyZT4gZ2V0VmFsaWRhdGlvbkZhaWx1cmVzKCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGlvbkZhaWx1cmVzOwotICAgIH0KLQotfQotCi0vKioKLSAqICJTcGVjaWZpYyBWYWxpZGF0b3IgRmFpbHVyZXMKLSAqCi0gKi8KLWNsYXNzIFZhbGlkYXRpb25GYWlsdXJlIHsKLSAgICBWYWxpZGF0b3IgdmFsaWRhdG9yOwotICAgIFN0cmluZyBtZXNzYWdlOwotCi0gICAgVmFsaWRhdGlvbkZhaWx1cmUoVmFsaWRhdG9yIHZhbGlkYXRvciwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0gICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgIHJldHVybiAiVmFsaWRhdG9yID0gWyIgKyB2YWxpZGF0b3IgKyAiXSBNZXNzYWdlID0gWyIgKyBtZXNzYWdlICsgIl0iOwotICAgIH0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vdmFsaWRhdG9yL1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NlZjY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3ZhbGlkYXRvci9WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0b3IgewotICAgIHB1YmxpYyBlbnVtIFZhbGlkYXRpb25MZXZlbCB7Ci0gICAgICAgIE9GRiwgRlVMTH0KLQotICAgIDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVkFMSUQgPSB0cnVlOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlZBTElEID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdGlvbkZhaWx1cmVzIHZhbGlkYXRpb25GYWlsdXJlcyA9IG5ldyBWYWxpZGF0aW9uRmFpbHVyZXMoKTsKLSAgICBwcml2YXRlIFZhbGlkYXRpb25MZXZlbCB2YWxpZGF0aW9uTGV2ZWwgPSBWYWxpZGF0aW9uTGV2ZWwuRlVMTDsKLQotICAgIGFic3RyYWN0IHB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCk7Ci0KLSAgICB2b2lkIGFkZFZhbGlkYXRpb25GYWlsdXJlKFZhbGlkYXRvciBmYWlsaW5nVmFsaWRhdG9yLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICB2YWxpZGF0aW9uRmFpbHVyZXMuYWRkKGZhaWxpbmdWYWxpZGF0b3IsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIFZhbGlkYXRpb25MZXZlbCBnZXRWYWxpZGF0aW9uTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0aW9uTGV2ZWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VTdHJpbmcgPSAiIjsKLSAgICAgICAgSXRlcmF0b3I8VmFsaWRhdGlvbkZhaWx1cmU+IGZhaWx1cmVJdGVyID0gdmFsaWRhdGlvbkZhaWx1cmVzLgotICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25GYWlsdXJlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChmYWlsdXJlSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFZhbGlkYXRpb25GYWlsdXJlIGZhaWx1cmUgPSBmYWlsdXJlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBtZXNzYWdlU3RyaW5nID0gbWVzc2FnZVN0cmluZyArICIgOjogIiArIGZhaWx1cmUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IGZhaWx1cmUuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgZGlmZmVyZW50IHZhbGlkYXRvciByZWZlcmVuY2Ugd2Ugd2FudCB0byBjYWxsCi0gICAgICAgICAgICAvLyB0b1N0cmluZyBvbiBpdCBhbHNvCi0gICAgICAgICAgICBpZiAodmFsaWRhdG9yICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlU3RyaW5nID0gbWVzc2FnZVN0cmluZyArICIgOjogIiArIHZhbGlkYXRvci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXNzYWdlU3RyaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0Rlc2NyaXB0aW9uVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRGVzY3JpcHRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWJmZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRGVzY3JpcHRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8gcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudAotICogZWxlbWVudC4gIFRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgc2hvdWxkIGluY2x1ZGUgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIERlcGxveW1lbnQKLSAqIENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzIHRvIHByb3ZpZGUgdG8gdGhlIGNvbnN1bWVyIG9mIHRoZSBEZXBsb3ltZW50Ci0gKiBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlIHRvb2xzIHVzZWQgYnkgc3VjaCBhCi0gKiBEZXBsb3ltZW50IEZpbGUgY29uc3VtZXIgd2lsbCBkaXNwbGF5IHRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLSAqIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbi4KLSAqIDxwLz4KLSAqIFRoZSBsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZSBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAqICJlbiIgKEVuZ2xpc2gpLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZGVzY3JpcHRpb25UeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImRlc2NyaXB0aW9uVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT54c2RTdHJpbmdUeXBlIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgcmVmPSJ7aHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlfWxhbmciLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImRlc2NyaXB0aW9uVHlwZSIpCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UeXBlCi0gICAgICAgIGV4dGVuZHMgWHNkU3RyaW5nVHlwZSB7Ci0KLSAgICBAWG1sQXR0cmlidXRlKG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxhbmc7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFuZyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMYW5nKCkgewotICAgICAgICByZXR1cm4gbGFuZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFuZyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubGFuZyA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRGlzcGxheU5hbWVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9EaXNwbGF5TmFtZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MGM2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9EaXNwbGF5TmFtZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkCi0gKiBieSBkaXNwbGF5LW5hbWUgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLSAqIDxwLz4KLSAqIEV4YW1wbGU6Ci0gKiA8cC8+Ci0gKiAuLi4gPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPiBFbXBsb3llZSBTZWxmIFNlcnZpY2UgPC9kaXNwbGF5LW5hbWU+Ci0gKiA8cC8+Ci0gKiBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZGlzcGxheS1uYW1lVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJkaXNwbGF5LW5hbWVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIHJlZj0ie2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZX1sYW5nIi8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJkaXNwbGF5LW5hbWVUeXBlIikKLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB7Ci0KLSAgICBAWG1sQXR0cmlidXRlKG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxhbmc7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFuZyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRMYW5nKCkgewotICAgICAgICByZXR1cm4gbGFuZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFuZyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZyhqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubGFuZyA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiTGlua1R5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYkxpbmtUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MmM4ODUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiTGlua1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGVqYi1saW5rVHlwZSBpcyB1c2VkIGJ5IGVqYi1saW5rIGVsZW1lbnRzIGluIHRoZSBlamItcmVmIG9yIGVqYi1sb2NhbC1yZWYgZWxlbWVudHMgdG8gc3BlY2lmeQotICogdGhhdCBhbiBFSkIgcmVmZXJlbmNlIGlzIGxpbmtlZCB0byBlbnRlcnByaXNlIGJlYW4uCi0gKiA8cC8+Ci0gKiBUaGUgdmFsdWUgb2YgdGhlIGVqYi1saW5rIGVsZW1lbnQgbXVzdCBiZSB0aGUgZWpiLW5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuIGluIHRoZSBzYW1lIGVqYi1qYXIKLSAqIGZpbGUgb3IgaW4gYW5vdGhlciBlamItamFyIGZpbGUgaW4gdGhlIHNhbWUgSmF2YSBFRSBhcHBsaWNhdGlvbiB1bml0LgotICogPHAvPgotICogQWx0ZXJuYXRpdmVseSwgdGhlIG5hbWUgaW4gdGhlIGVqYi1saW5rIGVsZW1lbnQgbWF5IGJlIGNvbXBvc2VkIG9mIGEgcGF0aCBuYW1lIHNwZWNpZnlpbmcgdGhlCi0gKiBlamItamFyIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIHdpdGggdGhlIGVqYi1uYW1lIG9mIHRoZSB0YXJnZXQgYmVhbiBhcHBlbmRlZAotICogYW5kIHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRoIG5hbWUgYnkgIiMiLiAgVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi0gKiBjb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4gIFRoaXMgYWxsb3dzIG11bHRpcGxlCi0gKiBlbnRlcnByaXNlIGJlYW5zIHdpdGggdGhlIHNhbWUgZWpiLW5hbWUgdG8gYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KLSAqIDxwLz4KLSAqIEV4YW1wbGVzOgotICogPHAvPgotICogPGVqYi1saW5rPkVtcGxveWVlUmVjb3JkPC9lamItbGluaz4KLSAqIDxwLz4KLSAqIDxlamItbGluaz4uLi9wcm9kdWN0cy9wcm9kdWN0LmphciNQcm9kdWN0RUpCPC9lamItbGluaz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVqYi1saW5rVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlamItbGlua1R5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJlamItbGlua1R5cGUiKQotcHVibGljIGNsYXNzIEVqYkxpbmtUeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJMb2NhbFJlZlR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYkxvY2FsUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNhNzJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYkxvY2FsUmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuCi0gKiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBob21lIG9yIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCi0gKiBjb25zaXN0cyBvZjoKLSAqIDxwLz4KLSAqIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50Ci0gKiB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4gLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlCi0gKiBiZWFuIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4gb3IgdGhlIGxvY2FsCi0gKiBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLiAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCBsb2NhbCBob21lCi0gKiBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuLiBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1sb2NhbC1yZWYgcmVmZXJzIHRvIHRoZQotICogbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAqIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5LgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZWpiLWxvY2FsLXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZWpiLWxvY2FsLXJlZlR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZWpiLXJlZi1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZWpiLXJlZi10eXBlVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJsb2NhbC1ob21lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWxvY2FsLWhvbWVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImxvY2FsIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWxvY2FsVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlamItbGluayIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1lamItbGlua1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZWpiLWxvY2FsLXJlZlR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJlamJSZWZOYW1lIiwKLSAgICAgICAgImVqYlJlZlR5cGUiLAotICAgICAgICAibG9jYWxIb21lIiwKLSAgICAgICAgImxvY2FsIiwKLSAgICAgICAgImVqYkxpbmsiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgRWpiTG9jYWxSZWZUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBkZXNjcmlwdGlvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImVqYi1yZWYtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgRWpiUmVmTmFtZVR5cGUgZWpiUmVmTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImVqYi1yZWYtdHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBFamJSZWZUeXBlVHlwZSBlamJSZWZUeXBlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibG9jYWwtaG9tZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBMb2NhbEhvbWVUeXBlIGxvY2FsSG9tZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgTG9jYWxUeXBlIGxvY2FsOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZWpiLWxpbmsiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRWpiTGlua1R5cGUgZWpiTGluazsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gaW5qZWN0aW9uVGFyZ2V0OwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWpiUmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBFamJSZWZOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVqYlJlZk5hbWVUeXBlIGdldEVqYlJlZk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlamJSZWZOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBFamJSZWZOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWpiUmVmTmFtZShFamJSZWZOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVqYlJlZk5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWpiUmVmVHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBFamJSZWZUeXBlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVqYlJlZlR5cGVUeXBlIGdldEVqYlJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBlamJSZWZUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBFamJSZWZUeXBlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVqYlJlZlR5cGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIExvY2FsSG9tZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbEhvbWVUeXBlIGdldExvY2FsSG9tZSgpIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsSG9tZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWxIb21lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBMb2NhbEhvbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbEhvbWUoTG9jYWxIb21lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmxvY2FsSG9tZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBMb2NhbFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbFR5cGUgZ2V0TG9jYWwoKSB7Ci0gICAgICAgIHJldHVybiBsb2NhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIExvY2FsVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWwoTG9jYWxUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubG9jYWwgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWpiTGluayBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBFamJMaW5rVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVqYkxpbmtUeXBlIGdldEVqYkxpbmsoKSB7Ci0gICAgICAgIHJldHVybiBlamJMaW5rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJMaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBFamJMaW5rVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWpiTGluayhFamJMaW5rVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVqYkxpbmsgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmTmFtZVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYlJlZk5hbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTRlOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmTmFtZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGVqYi1yZWYtbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGFuIEVKQiByZWZlcmVuY2UuIFRoZSBFSkIgcmVmZXJlbmNlIGlzIGFuIGVudHJ5IGluCi0gKiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4gIFRoZSBuYW1lCi0gKiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LgotICogPHAvPgotICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuYW1lIGlzIHByZWZpeGVkIHdpdGggImVqYi8iLgotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIDxlamItcmVmLW5hbWU+ZWpiL1BheXJvbGw8L2VqYi1yZWYtbmFtZT4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVqYi1yZWYtbmFtZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZi1uYW1lVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPmpuZGktbmFtZVR5cGUiPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJlamItcmVmLW5hbWVUeXBlIikKLXB1YmxpYyBjbGFzcyBFamJSZWZOYW1lVHlwZQotICAgICAgICBleHRlbmRzIEpuZGlOYW1lVHlwZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWYyNzBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VqYlJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBlamItcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1yZWYgZWxlbWVudHMgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlCi0gKiBiZWFuJ3MgaG9tZSBvciB0byB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gKiA8cC8+Ci0gKiAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudAotICogdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZQotICogYmVhbiAtIHRoZSBvcHRpb25hbCByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbiBvciB0aGUgcmVtb3RlIGJ1c2luZXNzCi0gKiBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGhvbWUgaW50ZXJmYWNlIG9mIHRoZQotICogcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uICBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1yZWYgcmVmZXJzIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MKLSAqIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLiAtIG9wdGlvbmFsIGVqYi1saW5rIGluZm9ybWF0aW9uLCB1c2VkIHRvIHNwZWNpZnkgdGhlIHJlZmVyZW5jZWQKLSAqIGVudGVycHJpc2UgYmVhbiAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UgYmVhbiBpbnRvIGEKLSAqIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eQotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZWpiLXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZWpiLXJlZlR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlamItcmVmLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZWpiLXJlZi1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlamItcmVmLXR5cGUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZWpiLXJlZi10eXBlVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJob21lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWhvbWVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJlbW90ZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZW1vdGVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVqYi1saW5rIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWVqYi1saW5rVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlc291cmNlR3JvdXAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJlamItcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImVqYlJlZk5hbWUiLAotICAgICAgICAiZWpiUmVmVHlwZSIsCi0gICAgICAgICJob21lIiwKLSAgICAgICAgInJlbW90ZSIsCi0gICAgICAgICJlamJMaW5rIiwKLSAgICAgICAgIm1hcHBlZE5hbWUiLAotICAgICAgICAiaW5qZWN0aW9uVGFyZ2V0IgotICAgICAgICB9KQotcHVibGljIGNsYXNzIEVqYlJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZWpiLXJlZi1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBFamJSZWZOYW1lVHlwZSBlamJSZWZOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZWpiLXJlZi10eXBlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIEVqYlJlZlR5cGVUeXBlIGVqYlJlZlR5cGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIEhvbWVUeXBlIGhvbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFJlbW90ZVR5cGUgcmVtb3RlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZWpiLWxpbmsiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRWpiTGlua1R5cGUgZWpiTGluazsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gaW5qZWN0aW9uVGFyZ2V0OwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWpiUmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBFamJSZWZOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVqYlJlZk5hbWVUeXBlIGdldEVqYlJlZk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlamJSZWZOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBFamJSZWZOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWpiUmVmTmFtZShFamJSZWZOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVqYlJlZk5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWpiUmVmVHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBFamJSZWZUeXBlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVqYlJlZlR5cGVUeXBlIGdldEVqYlJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBlamJSZWZUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBFamJSZWZUeXBlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWpiUmVmVHlwZShFamJSZWZUeXBlVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVqYlJlZlR5cGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaG9tZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBIb21lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEhvbWVUeXBlIGdldEhvbWUoKSB7Ci0gICAgICAgIHJldHVybiBob21lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBob21lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBIb21lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG9tZShIb21lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmhvbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3RlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFJlbW90ZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVUeXBlIGdldFJlbW90ZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlbW90ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVtb3RlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBSZW1vdGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGUoUmVtb3RlVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnJlbW90ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlamJMaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVqYkxpbmtUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiTGlua1R5cGUgZ2V0RWpiTGluaygpIHsKLSAgICAgICAgcmV0dXJuIGVqYkxpbms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVqYkxpbmsgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEVqYkxpbmtUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFamJMaW5rKEVqYkxpbmtUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWpiTGluayA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldE1hcHBlZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbmplY3Rpb25UYXJnZXQoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEluamVjdGlvblRhcmdldFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGdldEluamVjdGlvblRhcmdldCgpIHsKLSAgICAgICAgaWYgKGluamVjdGlvblRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQgPSBuZXcgQXJyYXlMaXN0PEluamVjdGlvblRhcmdldFR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0aW9uVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZUeXBlVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRWpiUmVmVHlwZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5YzA0NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FamJSZWZUeXBlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgZWpiLXJlZi10eXBlVHlwZSBjb250YWlucyB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiA8cC8+Ci0gKiBUaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZSB0aGF0IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiA8cC8+Ci0gKiBFbnRpdHkgU2Vzc2lvbgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZWpiLXJlZi10eXBlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlamItcmVmLXR5cGVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZWpiLXJlZi10eXBlVHlwZSIpCi1wdWJsaWMgY2xhc3MgRWpiUmVmVHlwZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VtcHR5VHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRW1wdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTMyNTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRW1wdHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eSBlbGVtZW50IHdoZW4gdXNlZC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVtcHR5VHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImVtcHR5VHlwZSIpCi1wdWJsaWMgY2xhc3MgRW1wdHlUeXBlIHsKLQotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvRW52RW50cnlUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FbnZFbnRyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0NjlhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FbnZFbnRyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMKLSAqIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnksIGEgdHlwZSAob3B0aW9uYWwgaWYgdGhlIHZhbHVlIGlzCi0gKiBpbmplY3RlZCwgb3RoZXJ3aXNlIHJlcXVpcmVkKSwgYW5kIGFuIG9wdGlvbmFsIHZhbHVlLgotICogPHAvPgotICogSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvcgotICogSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gKiA8cC8+Ci0gKiBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsIG5vIGluamVjdGlvbiB3aWxsIG9jY3VyIGFuZCBubyBlbnRyeSBvZgotICogdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgY3JlYXRlZC4gIFRoaXMgYWxsb3dzIGFuIGluaXRpYWwgdmFsdWUgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBzb3VyY2UKLSAqIGNvZGUgd2l0aG91dCBiZWluZyBpbmNvcnJlY3RseSBjaGFuZ2VkIHdoZW4gbm8gb3ZlcnJpZGUgaGFzIGJlZW4gc3BlY2lmaWVkLgotICogPHAvPgotICogSWYgYSB2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkIGFuZCBubyBpbmplY3Rpb24gaXMgcmVxdWVzdGVkLCBhIHZhbHVlIG11c3QgYmUgc3VwcGxpZWQgZHVyaW5nCi0gKiBkZXBsb3ltZW50LgotICogPHAvPgotICogVGhpcyB0eXBlIGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZW52LWVudHJ5VHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlbnYtZW50cnlUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZW52LWVudHJ5LW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9am5kaS1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlbnYtZW50cnktdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1lbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImVudi1lbnRyeS12YWx1ZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX14c2RTdHJpbmdUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cmVzb3VyY2VHcm91cCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImVudi1lbnRyeVR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJlbnZFbnRyeU5hbWUiLAotICAgICAgICAiZW52RW50cnlUeXBlIiwKLSAgICAgICAgImVudkVudHJ5VmFsdWUiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgRW52RW50cnlUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBkZXNjcmlwdGlvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImVudi1lbnRyeS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBKbmRpTmFtZVR5cGUgZW52RW50cnlOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZW52LWVudHJ5LXR5cGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRW52RW50cnlUeXBlVmFsdWVzVHlwZSBlbnZFbnRyeVR5cGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlbnYtZW50cnktdmFsdWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBlbnZFbnRyeVZhbHVlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZFbnRyeU5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSm5kaU5hbWVUeXBlIGdldEVudkVudHJ5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGVudkVudHJ5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW52RW50cnlOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudkVudHJ5TmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5lbnZFbnRyeU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW52RW50cnlUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEVudkVudHJ5VHlwZVZhbHVlc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBFbnZFbnRyeVR5cGVWYWx1ZXNUeXBlIGdldEVudkVudHJ5VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGVudkVudHJ5VHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW52RW50cnlUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBFbnZFbnRyeVR5cGVWYWx1ZXNUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnZFbnRyeVR5cGUoRW52RW50cnlUeXBlVmFsdWVzVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmVudkVudHJ5VHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZFbnRyeVZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldEVudkVudHJ5VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBlbnZFbnRyeVZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlbnZFbnRyeVZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbnZFbnRyeVZhbHVlKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5lbnZFbnRyeVZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluamVjdGlvblRhcmdldCgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotICAgICAgICBpZiAoaW5qZWN0aW9uVGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvblRhcmdldCA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VudkVudHJ5VHlwZVZhbHVlc1R5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0VudkVudHJ5VHlwZVZhbHVlc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYzcyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9FbnZFbnRyeVR5cGVWYWx1ZXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBvZiB0aGUgZW52aXJvbm1lbnQgZW50cnkgdmFsdWUgdGhhdCBpcyBleHBlY3RlZAotICogYnkgdGhlIGFwcGxpY2F0aW9uJ3MgY29kZS4KLSAqIDxwLz4KLSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBsZWdhbCB2YWx1ZXMgb2YgZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZToKLSAqIDxwLz4KLSAqIGphdmEubGFuZy5Cb29sZWFuIGphdmEubGFuZy5CeXRlIGphdmEubGFuZy5DaGFyYWN0ZXIgamF2YS5sYW5nLlN0cmluZyBqYXZhLmxhbmcuU2hvcnQKLSAqIGphdmEubGFuZy5JbnRlZ2VyIGphdmEubGFuZy5Mb25nIGphdmEubGFuZy5GbG9hdCBqYXZhLmxhbmcuRG91YmxlCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZW52LWVudHJ5LXR5cGUtdmFsdWVzVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiKQotcHVibGljIGNsYXNzIEVudkVudHJ5VHlwZVZhbHVlc1R5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0Z1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9GdWxseVF1YWxpZmllZENsYXNzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGU5NTJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0Z1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50cyB0aGF0IHVzZSB0aGlzIHR5cGUgZGVzaWduYXRlIHRoZSBuYW1lIG9mIGEgSmF2YSBjbGFzcyBvciBpbnRlcmZhY2UuICBUaGUgbmFtZSBpcyBpbgotICogdGhlIGZvcm0gb2YgYSAiYmluYXJ5IG5hbWUiLCBhcyBkZWZpbmVkIGluIHRoZSBKTFMuICBUaGlzIGlzIHRoZSBmb3JtIG9mIG5hbWUgdXNlZCBpbgotICogQ2xhc3MuZm9yTmFtZSgpLiAgVG9vbHMgdGhhdCBuZWVkIHRoZSBjYW5vbmljYWwgbmFtZSAodGhlIG5hbWUgdXNlZCBpbiBzb3VyY2UgY29kZSkgd2lsbCBuZWVkIHRvCi0gKiBjb252ZXJ0IHRoaXMgYmluYXJ5IG5hbWUgdG8gdGhlIGNhbm9uaWNhbCBuYW1lLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJmdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIpCi1wdWJsaWMgY2xhc3MgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0dlbmVyaWNCb29sZWFuVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvR2VuZXJpY0Jvb2xlYW5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNTg0M2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvR2VuZXJpY0Jvb2xlYW5UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBkZWZpbmVzIGZvdXIgZGlmZmVyZW50IHZhbHVlcyB3aGljaCBjYW4gZGVzaWduYXRlIGJvb2xlYW4gdmFsdWVzLiBUaGlzIGluY2x1ZGVzIHZhbHVlcwotICogeWVzIGFuZCBubyB3aGljaCBhcmUgbm90IGRlc2lnbmF0ZWQgYnkgeHNkOmJvb2xlYW4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdlbmVyaWMtYm9vbGVhblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJpYy1ib29sZWFuVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImdlbmVyaWMtYm9vbGVhblR5cGUiKQotcHVibGljIGNsYXNzIEdlbmVyaWNCb29sZWFuVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlckNoYWluVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlckNoYWluVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWUyYjAzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0hhbmRsZXJDaGFpblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLiBIYW5kbGVyY2hhaW4gY2FuIGJlIGRlZmluZWQgc3VjaCB0aGF0IHRoZQotICogaGFuZGxlcnMgaW4gdGhlIGhhbmRsZXJjaGFpbiBvcGVyYXRlIGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMgcG9ydCwgb3Igb24gYSBsaXN0IG9mCi0gKiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cyBzZXJ2aWNlLW5hbWUtcGF0dGVybiwgcG9ydC1uYW1lLXBhdHRlcm4sIGFuZAotICogcHJvdG9jb2wtYmluZGluZ3MgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBoYW5kbGVycyBpbiB0aGUgaGFuZGxlci1jaGFpbiBhcmUgZm9yIGEKLSAqIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZSBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbgotICogZWxlbWVudCwgdGhlbiB0aGUgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoZSBoYW5kbGVyLWNoYWluIHdpbGwgYmUgYXBwbGllZCBvbiBldmVyeXRoaW5nLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgaGFuZGxlci1jaGFpblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iaGFuZGxlci1jaGFpblR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2Nob2ljZSBtaW5PY2N1cnM9IjAiPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9UU5hbWUiLz4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUtcGF0dGVybiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfVFOYW1lIi8+Ci0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZ3MiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIi8+Ci0gKiAgICAgICAgICZsdDsvY2hvaWNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWhhbmRsZXJUeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJoYW5kbGVyLWNoYWluVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInNlcnZpY2VOYW1lUGF0dGVybiIsCi0gICAgICAgICJwb3J0TmFtZVBhdHRlcm4iLAotICAgICAgICAicHJvdG9jb2xCaW5kaW5ncyIsCi0gICAgICAgICJoYW5kbGVyIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpblR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJzZXJ2aWNlLW5hbWUtcGF0dGVybiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBRTmFtZSBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwb3J0LW5hbWUtcGF0dGVybiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBRTmFtZSBwb3J0TmFtZVBhdHRlcm47Ci0gICAgQFhtbExpc3QKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInByb3RvY29sLWJpbmRpbmdzIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIExpc3Q8amF2YS5sYW5nLlN0cmluZz4gcHJvdG9jb2xCaW5kaW5nczsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEhhbmRsZXJUeXBlPiBoYW5kbGVyOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZU5hbWVQYXR0ZXJuIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBRTmFtZSBnZXRTZXJ2aWNlTmFtZVBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZVBhdHRlcm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VOYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWVQYXR0ZXJuKFFOYW1lIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWVQYXR0ZXJuID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnROYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UG9ydE5hbWVQYXR0ZXJuKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWVQYXR0ZXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwb3J0TmFtZVBhdHRlcm4gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lUGF0dGVybihRTmFtZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnBvcnROYW1lUGF0dGVybiA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwcm90b2NvbEJpbmRpbmdzIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHByb3RvY29sQmluZGluZ3MgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRQcm90b2NvbEJpbmRpbmdzKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxqYXZhLmxhbmcuU3RyaW5nPiBnZXRQcm90b2NvbEJpbmRpbmdzKCkgewotICAgICAgICBpZiAocHJvdG9jb2xCaW5kaW5ncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcm90b2NvbEJpbmRpbmdzID0gbmV3IEFycmF5TGlzdDxqYXZhLmxhbmcuU3RyaW5nPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sQmluZGluZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXIgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaGFuZGxlciBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEhhbmRsZXIoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEhhbmRsZXJUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyVHlwZT4gZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBBcnJheUxpc3Q8SGFuZGxlclR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlckNoYWluc1R5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0hhbmRsZXJDaGFpbnNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDQ0MGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlckNoYWluc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBoYW5kbGVyLWNoYWlucyBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBvciBzZXJ2aWNlCi0gKiBlbmRwb2ludC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGhhbmRsZXItY2hhaW5zVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyLWNoYWluc1R5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaGFuZGxlci1jaGFpbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1oYW5kbGVyLWNoYWluVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiaGFuZGxlci1jaGFpbnNUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiaGFuZGxlckNoYWluIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIEhhbmRsZXJDaGFpbnNUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaGFuZGxlci1jaGFpbiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBoYW5kbGVyQ2hhaW47Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyQ2hhaW4gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaGFuZGxlckNoYWluIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SGFuZGxlckNoYWluKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBIYW5kbGVyQ2hhaW5UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxIYW5kbGVyQ2hhaW5UeXBlPiBnZXRIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlckNoYWluID0gbmV3IEFycmF5TGlzdDxIYW5kbGVyQ2hhaW5UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJDaGFpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlclR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0hhbmRsZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTE2ZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSGFuZGxlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIERlY2xhcmVzIHRoZSBoYW5kbGVyLiBIYW5kbGVycyBjYW4gYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlIEhhbmRsZXJJbmZvCi0gKiBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBoYW5kbGVyVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJoYW5kbGVyVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uR3JvdXAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaGFuZGxlci1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNsYXNzIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaW5pdC1wYXJhbSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wYXJhbS12YWx1ZVR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNvYXAtcm9sZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiaGFuZGxlclR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJkaXNwbGF5TmFtZSIsCi0gICAgICAgICJpY29uIiwKLSAgICAgICAgImhhbmRsZXJOYW1lIiwKLSAgICAgICAgImhhbmRsZXJDbGFzcyIsCi0gICAgICAgICJpbml0UGFyYW0iLAotICAgICAgICAic29hcFJvbGUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgSGFuZGxlclR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZGlzcGxheS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZGlzcGxheU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJY29uVHlwZT4gaWNvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImhhbmRsZXItbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgaGFuZGxlck5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJoYW5kbGVyLWNsYXNzIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBoYW5kbGVyQ2xhc3M7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbml0LXBhcmFtIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFBhcmFtVmFsdWVUeXBlPiBpbml0UGFyYW07Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJzb2FwLXJvbGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHNvYXBSb2xlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREaXNwbGF5TmFtZSgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGlzcGxheU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZVR5cGU+IGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGxheU5hbWUgPSBuZXcgQXJyYXlMaXN0PERpc3BsYXlOYW1lVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SWNvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSWNvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEljb25UeXBlPiBnZXRJY29uKCkgewotICAgICAgICBpZiAoaWNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpY29uID0gbmV3IEFycmF5TGlzdDxJY29uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmhhbmRsZXJOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGdldEhhbmRsZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlckNsYXNzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaGFuZGxlckNsYXNzID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluaXRQYXJhbSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbml0UGFyYW0gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbml0UGFyYW0oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFBhcmFtVmFsdWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxQYXJhbVZhbHVlVHlwZT4gZ2V0SW5pdFBhcmFtKCkgewotICAgICAgICBpZiAoaW5pdFBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXRQYXJhbSA9IG5ldyBBcnJheUxpc3Q8UGFyYW1WYWx1ZVR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5pdFBhcmFtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzb2FwUm9sZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBzb2FwUm9sZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldFNvYXBSb2xlKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluawotICAgICAqIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4gZ2V0U29hcFJvbGUoKSB7Ci0gICAgICAgIGlmIChzb2FwUm9sZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwUm9sZSA9IG5ldyBBcnJheUxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc29hcFJvbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0hvbWVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Ib21lVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWE1ZjcwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0hvbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBob21lVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIGludGVyZmFjZS4KLSAqIDxwLz4KLSAqIEV4YW1wbGU6Ci0gKiA8cC8+Ci0gKiA8aG9tZT5jb20uYWFyZHZhcmsucGF5cm9sbC5QYXlyb2xsSG9tZTwvaG9tZT4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGhvbWVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImhvbWVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImhvbWVUeXBlIikKLXB1YmxpYyBjbGFzcyBIb21lVHlwZQotICAgICAgICBleHRlbmRzIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9JY29uVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSWNvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjOGU2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9JY29uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoZSBpY29uIHR5cGUgY29udGFpbnMgc21hbGwtaWNvbiBhbmQgbGFyZ2UtaWNvbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgdGhlIGZpbGUgbmFtZXMgZm9yIHNtYWxsCi0gKiBhbmQgbGFyZ2UgR0lGLCBKUEVHLCBvciBQTkcgaWNvbiBpbWFnZXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHBhcmVudCBlbGVtZW50IGluIGEgR1VJIHRvb2wuCi0gKiA8cC8+Ci0gKiBUaGUgeG1sOmxhbmcgYXR0cmlidXRlIGRlZmluZXMgdGhlIGxhbmd1YWdlIHRoYXQgdGhlIGljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZQotICogaXMgImVuIiAoRW5nbGlzaCkgYnkgZGVmYXVsdC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGljb25UeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Imljb25UeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNtYWxsLWljb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cGF0aFR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wYXRoVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgcmVmPSJ7aHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlfWxhbmciLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImljb25UeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAic21hbGxJY29uIiwKLSAgICAgICAgImxhcmdlSWNvbiIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBJY29uVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNtYWxsLWljb24iLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgUGF0aFR5cGUgc21hbGxJY29uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibGFyZ2UtaWNvbiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBQYXRoVHlwZSBsYXJnZUljb247Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLSAgICBAWG1sQXR0cmlidXRlKG5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiKQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGxhbmc7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc21hbGxJY29uIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFBhdGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aFR5cGUgZ2V0U21hbGxJY29uKCkgewotICAgICAgICByZXR1cm4gc21hbGxJY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzbWFsbEljb24gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFBhdGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTbWFsbEljb24oUGF0aFR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zbWFsbEljb24gPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGFyZ2VJY29uIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFBhdGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aFR5cGUgZ2V0TGFyZ2VJY29uKCkgewotICAgICAgICByZXR1cm4gbGFyZ2VJY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYXJnZUljb24gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFBhdGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYXJnZUljb24oUGF0aFR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5sYXJnZUljb24gPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsYW5nIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmcoKSB7Ci0gICAgICAgIHJldHVybiBsYW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsYW5nIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5nKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5sYW5nID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9JbmplY3Rpb25UYXJnZXRUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9JbmplY3Rpb25UYXJnZXRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDdmMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSW5qZWN0aW9uVGFyZ2V0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIEFuIGluamVjdGlvbiB0YXJnZXQgc3BlY2lmaWVzIGEgY2xhc3MgYW5kIGEgbmFtZSB3aXRoaW4gdGhhdCBjbGFzcyBpbnRvIHdoaWNoIGEgcmVzb3VyY2Ugc2hvdWxkCi0gKiBiZSBpbmplY3RlZC4KLSAqIDxwLz4KLSAqIFRoZSBpbmplY3Rpb24gdGFyZ2V0IGNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZQotICogaW5qZWN0aW9uLiAgVGhlIEphdmEgRUUgc3BlY2lmaWNhdGlvbnMgZGVzY3JpYmUgd2hpY2ggY2xhc3NlcyBjYW4gYmUgYW4gaW5qZWN0aW9uIHRhcmdldC4KLSAqIDxwLz4KLSAqIFRoZSBpbmplY3Rpb24gdGFyZ2V0IG5hbWUgc3BlY2lmaWVzIHRoZSB0YXJnZXQgd2l0aGluIHRoZSBzcGVjaWZpZWQgY2xhc3MuICBUaGUgdGFyZ2V0IGlzIGZpcnN0Ci0gKiBsb29rZWQgZm9yIGFzIGEgSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUuICBJZiBub3QgZm91bmQsIHRoZSB0YXJnZXQgaXMgbG9va2VkIGZvciBhcyBhIGZpZWxkCi0gKiBuYW1lLgotICogPHAvPgotICogVGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIHRhcmdldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIGJ5Ci0gKiBlaXRoZXIgY2FsbGluZyB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIHRhcmdldCBwcm9wZXJ0eSBvciBieSBzZXR0aW5nIGEgdmFsdWUgaW50byB0aGUgbmFtZWQKLSAqIGZpZWxkLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgaW5qZWN0aW9uLXRhcmdldFR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iaW5qZWN0aW9uLXRhcmdldFR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaW5qZWN0aW9uLXRhcmdldC1jbGFzcyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImluamVjdGlvbi10YXJnZXQtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qYXZhLWlkZW50aWZpZXJUeXBlIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldFR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJpbmplY3Rpb25UYXJnZXRDbGFzcyIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXROYW1lIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIEluamVjdGlvblRhcmdldFR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0LWNsYXNzIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBpbmplY3Rpb25UYXJnZXRDbGFzczsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSmF2YUlkZW50aWZpZXJUeXBlIGluamVjdGlvblRhcmdldE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0Q2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRJbmplY3Rpb25UYXJnZXRDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGluamVjdGlvblRhcmdldENsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXRDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluamVjdGlvblRhcmdldENsYXNzKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaW5qZWN0aW9uVGFyZ2V0Q2xhc3MgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0TmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKYXZhSWRlbnRpZmllclR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKYXZhSWRlbnRpZmllclR5cGUgZ2V0SW5qZWN0aW9uVGFyZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGluamVjdGlvblRhcmdldE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEphdmFJZGVudGlmaWVyVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0TmFtZShKYXZhSWRlbnRpZmllclR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pbmplY3Rpb25UYXJnZXROYW1lID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9KYXZhSWRlbnRpZmllclR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0phdmFJZGVudGlmaWVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY0Yjc1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0phdmFJZGVudGlmaWVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgamF2YS1pZGVudGlmaWVyVHlwZSBkZWZpbmVzIGEgSmF2YSBpZGVudGlmaWVyLiBUaGUgdXNlcnMgb2YgdGhpcyB0eXBlIHNob3VsZCBmdXJ0aGVyIHZlcmlmeQotICogdGhhdCB0aGUgY29udGVudCBkb2VzIG5vdCBjb250YWluIEphdmEgcmVzZXJ2ZWQga2V5d29yZHMuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBqYXZhLWlkZW50aWZpZXJUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImphdmEtaWRlbnRpZmllclR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJqYXZhLWlkZW50aWZpZXJUeXBlIikKLXB1YmxpYyBjbGFzcyBKYXZhSWRlbnRpZmllclR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0phdmFUeXBlVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSmF2YVR5cGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OTQ1NDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSmF2YVR5cGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBnZW5lcmljIHR5cGUgdGhhdCBkZXNpZ25hdGVzIGEgSmF2YSBwcmltaXRpdmUgdHlwZSBvciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YQotICogaW50ZXJmYWNlL3R5cGUsIG9yIGFuIGFycmF5IG9mIHN1Y2ggdHlwZXMuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBqYXZhLXR5cGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImphdmEtdHlwZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJqYXZhLXR5cGVUeXBlIikKLXB1YmxpYyBjbGFzcyBKYXZhVHlwZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0puZGlOYW1lVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSm5kaU5hbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzExNGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvSm5kaU5hbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBqbmRpLW5hbWVUeXBlIHR5cGUgZGVzaWduYXRlcyBhIEpOREkgbmFtZSBpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBhbmQgaXMKLSAqIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuICBBIEpOREkgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIERlcGxveW1lbnQKLSAqIENvbXBvbmVudC4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGpuZGktbmFtZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1lVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImpuZGktbmFtZVR5cGUiKQotcHVibGljIGNsYXNzIEpuZGlOYW1lVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTGlmZWN5Y2xlQ2FsbGJhY2tUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9MaWZlY3ljbGVDYWxsYmFja1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1MTM1NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9MaWZlY3ljbGVDYWxsYmFja1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgbGlmZWN5Y2xlLWNhbGxiYWNrIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEgY2xhc3MgdG8gYmUgY2FsbGVkIHdoZW4gYSBsaWZlY3ljbGUgZXZlbnQKLSAqIG9jY3Vycy4gTm90ZSB0aGF0IGVhY2ggY2xhc3MgbWF5IGhhdmUgb25seSBvbmUgbGlmZWN5Y2xlIGNhbGxiYWNrIG1ldGhvZCBmb3IgYW55IGdpdmVuIGV2ZW50IGFuZAotICogdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgYmUgb3ZlcmxvYWRlZC4KLSAqIDxwLz4KLSAqIElmIHRoZSBsaWZlZnljbGUtY2FsbGJhY2stY2xhc3MgZWxlbWVudCBpcyBtaXNzaW5nIHRoZW4gdGhlIGNsYXNzIGRlZmluaW5nIHRoZSBjYWxsYmFjayBpcwotICogYXNzdW1lZCB0byBiZSB0aGUgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZSBwbGFjZSBpbiB0aGUgZGVzY3JpcHRvciBpbiB3aGljaCB0aGUgY2FsbGJhY2sKLSAqIGRlZmluaXRpb24gYXBwZWFycy4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGxpZmVjeWNsZS1jYWxsYmFja1R5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibGlmZWN5Y2xlLWNhbGxiYWNrVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2stY2xhc3MiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtY2FsbGJhY2stbWV0aG9kIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWphdmEtaWRlbnRpZmllclR5cGUiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJsaWZlY3ljbGUtY2FsbGJhY2tUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAibGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyIsCi0gICAgICAgICJsaWZlY3ljbGVDYWxsYmFja01ldGhvZCIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBMaWZlY3ljbGVDYWxsYmFja1R5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJsaWZlY3ljbGUtY2FsbGJhY2stY2xhc3MiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgbGlmZWN5Y2xlQ2FsbGJhY2tDbGFzczsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImxpZmVjeWNsZS1jYWxsYmFjay1tZXRob2QiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEphdmFJZGVudGlmaWVyVHlwZSBsaWZlY3ljbGVDYWxsYmFja01ldGhvZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsaWZlY3ljbGVDYWxsYmFja0NsYXNzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxpZmVjeWNsZUNhbGxiYWNrQ2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaWZlY3ljbGVDYWxsYmFja0NsYXNzKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsaWZlY3ljbGVDYWxsYmFja01ldGhvZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKYXZhSWRlbnRpZmllclR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKYXZhSWRlbnRpZmllclR5cGUgZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBsaWZlY3ljbGVDYWxsYmFja01ldGhvZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEphdmFJZGVudGlmaWVyVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QoSmF2YUlkZW50aWZpZXJUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubGlmZWN5Y2xlQ2FsbGJhY2tNZXRob2QgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL0xpc3RlbmVyVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTGlzdGVuZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjQxNzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTGlzdGVuZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgbGlzdGVuZXJUeXBlIGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYiBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbGlzdGVuZXJUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Imxpc3RlbmVyVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uR3JvdXAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibGlzdGVuZXItY2xhc3MiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImxpc3RlbmVyVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImRpc3BsYXlOYW1lIiwKLSAgICAgICAgImljb24iLAotICAgICAgICAibGlzdGVuZXJDbGFzcyIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBMaXN0ZW5lclR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZGlzcGxheS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZGlzcGxheU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJY29uVHlwZT4gaWNvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImxpc3RlbmVyLWNsYXNzIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBsaXN0ZW5lckNsYXNzOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGlzcGxheU5hbWUgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREaXNwbGF5TmFtZSgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGlzcGxheU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZVR5cGU+IGdldERpc3BsYXlOYW1lKCkgewotICAgICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgZGlzcGxheU5hbWUgPSBuZXcgQXJyYXlMaXN0PERpc3BsYXlOYW1lVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SWNvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSWNvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEljb25UeXBlPiBnZXRJY29uKCkgewotICAgICAgICBpZiAoaWNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpY29uID0gbmV3IEFycmF5TGlzdDxJY29uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pY29uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBsaXN0ZW5lckNsYXNzIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0TGlzdGVuZXJDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGxpc3RlbmVyQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxpc3RlbmVyQ2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckNsYXNzKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubGlzdGVuZXJDbGFzcyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Mb2NhbEhvbWVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Mb2NhbEhvbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmEyNmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTG9jYWxIb21lVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgbG9jYWwtaG9tZVR5cGUgZGVmaW5lcyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwgaG9tZQotICogaW50ZXJmYWNlLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbG9jYWwtaG9tZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibG9jYWwtaG9tZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAibG9jYWwtaG9tZVR5cGUiKQotcHVibGljIGNsYXNzIExvY2FsSG9tZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTG9jYWxUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Mb2NhbFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzOTBiNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Mb2NhbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIGxvY2FsVHlwZSBkZWZpbmVzIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhbiBlbnRlcnByaXNlIGJlYW4ncyBsb2NhbCBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBsb2NhbFR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibG9jYWxUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImxvY2FsVHlwZSIpCi1wdWJsaWMgY2xhc3MgTG9jYWxUeXBlCi0gICAgICAgIGV4dGVuZHMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9NZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDYwOThhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGlzIHVzZWQgdG8gbGluayBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG9yCi0gKiBtZXNzYWdlLWRyaXZlbiBiZWFuIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4KLSAqIDxwLz4KLSAqIFRoZSBBc3NlbWJsZXIgc2V0cyB0aGUgdmFsdWUgdG8gcmVmbGVjdCB0aGUgZmxvdyBvZiBtZXNzYWdlcyBiZXR3ZWVuIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGluCi0gKiB0aGUgYXBwbGljYXRpb24uCi0gKiA8cC8+Ci0gKiBUaGUgdmFsdWUgbXVzdCBiZSB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBpbiB0aGUgc2FtZSBEZXBsb3ltZW50Ci0gKiBGaWxlIG9yIGluIGFub3RoZXIgRGVwbG95bWVudCBGaWxlIGluIHRoZSBzYW1lIEphdmEgRUUgYXBwbGljYXRpb24gdW5pdC4KLSAqIDxwLz4KLSAqIEFsdGVybmF0aXZlbHksIHRoZSB2YWx1ZSBtYXkgYmUgY29tcG9zZWQgb2YgYSBwYXRoIG5hbWUgc3BlY2lmeWluZyBhIERlcGxveW1lbnQgRmlsZSBjb250YWluaW5nCi0gKiB0aGUgcmVmZXJlbmNlZCBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpdGggdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gYXBwZW5kZWQKLSAqIGFuZCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aCBuYW1lIGJ5ICIjIi4gVGhlIHBhdGggbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgRGVwbG95bWVudCBGaWxlCi0gKiBjb250YWluaW5nIERlcGxveW1lbnQgQ29tcG9uZW50IHRoYXQgaXMgcmVmZXJlbmNpbmcgdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIGFsbG93cwotICogbXVsdGlwbGUgbWVzc2FnZSBkZXN0aW5hdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGlua1R5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIikKLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZQotICAgICAgICBleHRlbmRzIFN0cmluZyB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDdmZGY2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvblJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8KLSAqIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBpbiBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50LiBJdAotICogY29uc2lzdHMgb2Y6Ci0gKiA8cC8+Ci0gKiAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUgLSBhbiBvcHRpb25hbCBtZXNzYWdlCi0gKiBkZXN0aW5hdGlvbiB0eXBlIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyB1c2VkIGZvciBjb25zdW1pbmcKLSAqIG9yIHByb2R1Y2luZyBtZXNzYWdlcywgb3IgYm90aC4gaWYgbm90IHNwZWNpZmllZCwgImJvdGgiIGlzIGFzc3VtZWQuIC0gYW4gb3B0aW9uYWwgbGluayB0byB0aGUKLSAqIG1lc3NhZ2UgZGVzdGluYXRpb24gLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICogPHAvPgotICogVGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZSBtdXN0IGJlIHN1cHBsaWVkIHVubGVzcyBhbiBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgaW4gd2hpY2gKLSAqIGNhc2UgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZSBtdXN0IGJlIGFzc2lnbm1lbnQKLSAqIGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uIHRhcmdldC4KLSAqIDxwLz4KLSAqIEV4YW1wbGVzOgotICogPHAvPgotICogPG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmPiA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQotICogPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPiA8bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZQotICogPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+IDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+Q29ycG9yYXRlU3RvY2tzIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rPiA8L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tcmVmLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9am5kaS1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfW1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb24tbGluayIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmtUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cmVzb3VyY2VHcm91cCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUiLAotICAgICAgICAibWVzc2FnZURlc3RpbmF0aW9uVHlwZSIsCi0gICAgICAgICJtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSIsCi0gICAgICAgICJtZXNzYWdlRGVzdGluYXRpb25MaW5rIiwKLSAgICAgICAgIm1hcHBlZE5hbWUiLAotICAgICAgICAiaW5qZWN0aW9uVGFyZ2V0IgotICAgICAgICB9KQotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSIsCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSm5kaU5hbWVUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uVHlwZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWVzc2FnZS1kZXN0aW5hdGlvbi1saW5rIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbms7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtYXBwZWQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIG1hcHBlZE5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGluamVjdGlvblRhcmdldDsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSm5kaU5hbWVUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoSm5kaU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25UeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZURlc3RpbmF0aW9uVHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZURlc3RpbmF0aW9uTGluayBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlRGVzdGluYXRpb25MaW5rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlRGVzdGluYXRpb25MaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayhNZXNzYWdlRGVzdGluYXRpb25MaW5rVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWM2NmJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkKLSAqIHRoaXMgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0gKiA8cC8+Ci0gKiBUaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBlbGVtZW50IGNvbnRhaW5zOgotICogPHAvPgotICogLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZSAtIGFuIG9wdGlvbmFsIGljb24gLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAqIG5hbWUgd2hpY2ggbXVzdCBiZSB1bmlxdWUgYW1vbmcgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lcyB3aXRoaW4gdGhlIHNhbWUgRGVwbG95bWVudCBGaWxlLiAtIGFuCi0gKiBvcHRpb25hbCBtYXBwZWQgbmFtZQotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uPiA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcyA8L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4KLSAqIDwvbWVzc2FnZS1kZXN0aW5hdGlvbj4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9Im1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25Hcm91cCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c3RyaW5nIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1hcHBlZC1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZFN0cmluZ1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImRpc3BsYXlOYW1lIiwKLSAgICAgICAgImljb24iLAotICAgICAgICAibWVzc2FnZURlc3RpbmF0aW9uTmFtZSIsCi0gICAgICAgICJtYXBwZWROYW1lIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZGlzcGxheS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZGlzcGxheU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJY29uVHlwZT4gaWNvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRpc3BsYXlOYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRpc3BsYXlOYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGlzcGxheU5hbWUoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERpc3BsYXlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gbmV3IEFycmF5TGlzdDxEaXNwbGF5TmFtZVR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGljb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEljb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEljb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJY29uVHlwZT4gZ2V0SWNvbigpIHsKLSAgICAgICAgaWYgKGljb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWNvbiA9IG5ldyBBcnJheUxpc3Q8SWNvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaWNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZURlc3RpbmF0aW9uTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZURlc3RpbmF0aW9uTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKAotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlRGVzdGluYXRpb25OYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDZhYzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkZXN0aW5hdGlvbi4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5Ci0gKiB0aGUgSmF2YSBpbnRlcmZhY2UgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJtZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSI+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIm1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZVR5cGUiKQotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlCi0gICAgICAgIGV4dGVuZHMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Zjk3ZmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSBzcGVjaWZpZXMgdGhlIHVzZSBvZiB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBpbmRpY2F0ZWQgYnkgdGhlCi0gKiByZWZlcmVuY2UuICBUaGUgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZXMgYXJlIGNvbnN1bWVkIGZyb20gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24sCi0gKiBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlIEFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nCi0gKiBwcm9kdWNlcnMgb2YgYSBkZXN0aW5hdGlvbiB3aXRoIGl0cyBjb25zdW1lcnMuCi0gKiA8cC8+Ci0gKiBUaGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2UgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBDb25zdW1lcwotICogUHJvZHVjZXMgQ29uc3VtZXNQcm9kdWNlcwotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ibWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSIpCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9PYmplY3RGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZjZhMzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCAKLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIgcGFja2FnZS4gCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5IAotICogY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24gCi0gKiBmb3IgWE1MIGNvbnRlbnQuIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIFhNTCAKLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcyAKLSAqIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBvZiBzY2hlbWEgCi0gKiB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgbW9kZWwgCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlIAotICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4KLSAqIAotICovCi1AWG1sUmVnaXN0cnkKLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9IYW5kbGVyQ2hhaW5zX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAiaGFuZGxlci1jaGFpbnMiKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3NlcyBmb3IgcGFja2FnZTogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGF0aFR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBQYXRoVHlwZSBjcmVhdGVQYXRoVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUgY3JlYXRlWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2ROb25OZWdhdGl2ZUludGVnZXJUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZW1vdGVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVtb3RlVHlwZSBjcmVhdGVSZW1vdGVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlbW90ZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlc1NoYXJpbmdTY29wZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVHJ1ZUZhbHNlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFRydWVGYWxzZVR5cGUgY3JlYXRlVHJ1ZUZhbHNlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcnVlRmFsc2VUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBMaXN0ZW5lclR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0ZW5lclR5cGUgY3JlYXRlTGlzdGVuZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IExpc3RlbmVyVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkSW50ZWdlclR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBYc2RJbnRlZ2VyVHlwZSBjcmVhdGVYc2RJbnRlZ2VyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2RJbnRlZ2VyVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkQW55VVJJVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFhzZEFueVVSSVR5cGUgY3JlYXRlWHNkQW55VVJJVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2RBbnlVUklUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXNBdXRoVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFJlc0F1dGhUeXBlIGNyZWF0ZVJlc0F1dGhUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlc0F1dGhUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKYXZhVHlwZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBKYXZhVHlwZVR5cGUgY3JlYXRlSmF2YVR5cGVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEphdmFUeXBlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWpiUmVmVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEVqYlJlZlR5cGUgY3JlYXRlRWpiUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFamJSZWZUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgR2VuZXJpY0Jvb2xlYW5UeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgR2VuZXJpY0Jvb2xlYW5UeXBlIGNyZWF0ZUdlbmVyaWNCb29sZWFuVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQm9vbGVhblR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVqYkxpbmtUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiTGlua1R5cGUgY3JlYXRlRWpiTGlua1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWpiTGlua1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5UeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgY3JlYXRlRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEhhbmRsZXJDaGFpbnNUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlckNoYWluc1R5cGUgY3JlYXRlSGFuZGxlckNoYWluc1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlckNoYWluc1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEhhbmRsZXJUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSGFuZGxlclR5cGUgY3JlYXRlSGFuZGxlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlclR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIERlc2NyaXB0aW9uVHlwZSBjcmVhdGVEZXNjcmlwdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVzY3JpcHRpb25UeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBjcmVhdGVYc2RTdHJpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFhzZFN0cmluZ1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZyB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFbXB0eVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBFbXB0eVR5cGUgY3JlYXRlRW1wdHlUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVtcHR5VHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWpiUmVmVHlwZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBFamJSZWZUeXBlVHlwZSBjcmVhdGVFamJSZWZUeXBlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFamJSZWZUeXBlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFhzZFBvc2l0aXZlSW50ZWdlclR5cGUgY3JlYXRlWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2RQb3NpdGl2ZUludGVnZXJUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNwbGF5TmFtZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBEaXNwbGF5TmFtZVR5cGUgY3JlYXRlRGlzcGxheU5hbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IERpc3BsYXlOYW1lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSWNvblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBJY29uVHlwZSBjcmVhdGVJY29uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJY29uVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgSm5kaU5hbWVUeXBlIGNyZWF0ZUpuZGlOYW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKbmRpTmFtZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWZUeXBlIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZURlc3RpbmF0aW9uUmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWpiTG9jYWxSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgRWpiTG9jYWxSZWZUeXBlIGNyZWF0ZUVqYkxvY2FsUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFamJMb2NhbFJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlY3VyaXR5Um9sZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZWN1cml0eVJvbGVUeXBlIGNyZWF0ZVNlY3VyaXR5Um9sZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VjdXJpdHlSb2xlVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGVyc2lzdGVuY2VVbml0UmVmVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFBlcnNpc3RlbmNlVW5pdFJlZlR5cGUgY3JlYXRlUGVyc2lzdGVuY2VVbml0UmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRSZWZUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTZWN1cml0eVJvbGVSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VjdXJpdHlSb2xlUmVmVHlwZSBjcmVhdGVTZWN1cml0eVJvbGVSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNlY3VyaXR5Um9sZVJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEhhbmRsZXJDaGFpblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5UeXBlIGNyZWF0ZUhhbmRsZXJDaGFpblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlckNoYWluVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUm9sZU5hbWVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUm9sZU5hbWVUeXBlIGNyZWF0ZVJvbGVOYW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSb2xlTmFtZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFhzZE5NVE9LRU5UeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkTk1UT0tFTlR5cGUgY3JlYXRlWHNkTk1UT0tFTlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgWHNkTk1UT0tFTlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEphdmFJZGVudGlmaWVyVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEphdmFJZGVudGlmaWVyVHlwZSBjcmVhdGVKYXZhSWRlbnRpZmllclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSmF2YUlkZW50aWZpZXJUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXNvdXJjZUVudlJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBSZXNvdXJjZUVudlJlZlR5cGUgY3JlYXRlUmVzb3VyY2VFbnZSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlRW52UmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9ydENvbXBvbmVudFJlZlR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBQb3J0Q29tcG9uZW50UmVmVHlwZSBjcmVhdGVQb3J0Q29tcG9uZW50UmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQb3J0Q29tcG9uZW50UmVmVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEluamVjdGlvblRhcmdldFR5cGUgY3JlYXRlSW5qZWN0aW9uVGFyZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbmplY3Rpb25UYXJnZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQYXJhbVZhbHVlVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIFBhcmFtVmFsdWVUeXBlIGNyZWF0ZVBhcmFtVmFsdWVUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFBhcmFtVmFsdWVUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTZXJ2aWNlUmVmSGFuZGxlclR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlclR5cGUgY3JlYXRlU2VydmljZVJlZkhhbmRsZXJUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNlcnZpY2VSZWZIYW5kbGVyVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTGlmZWN5Y2xlQ2FsbGJhY2tUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlmZWN5Y2xlQ2FsbGJhY2tUeXBlIGNyZWF0ZUxpZmVjeWNsZUNhbGxiYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaWZlY3ljbGVDYWxsYmFja1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlcnZpY2VSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZVJlZlR5cGUgY3JlYXRlU2VydmljZVJlZlR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VydmljZVJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmtUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZURlc3RpbmF0aW9uTGlua1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25UeXBlIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVXJsUGF0dGVyblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBVcmxQYXR0ZXJuVHlwZSBjcmVhdGVVcmxQYXR0ZXJuVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVcmxQYXR0ZXJuVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSG9tZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBIb21lVHlwZSBjcmVhdGVIb21lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIb21lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVzb3VyY2VSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VSZWZUeXBlIGNyZWF0ZVJlc291cmNlUmVmVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVudkVudHJ5VHlwZVZhbHVlc1R5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBFbnZFbnRyeVR5cGVWYWx1ZXNUeXBlIGNyZWF0ZUVudkVudHJ5VHlwZVZhbHVlc1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW52RW50cnlUeXBlVmFsdWVzVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRWpiUmVmTmFtZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBFamJSZWZOYW1lVHlwZSBjcmVhdGVFamJSZWZOYW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFamJSZWZOYW1lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUnVuQXNUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUnVuQXNUeXBlIGNyZWF0ZVJ1bkFzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSdW5Bc1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIExvY2FsVHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIExvY2FsVHlwZSBjcmVhdGVMb2NhbFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9jYWxUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQcm9wZXJ0eVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBQcm9wZXJ0eVR5cGUgY3JlYXRlUHJvcGVydHlUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5VHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIExvY2FsSG9tZVR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBMb2NhbEhvbWVUeXBlIGNyZWF0ZUxvY2FsSG9tZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTG9jYWxIb21lVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkQm9vbGVhblR5cGUgfQotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBYc2RCb29sZWFuVHlwZSBjcmVhdGVYc2RCb29sZWFuVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2RCb29sZWFuVHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgWHNkUU5hbWVUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkUU5hbWVUeXBlIGNyZWF0ZVhzZFFOYW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBYc2RRTmFtZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVudkVudHJ5VHlwZSB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEVudkVudHJ5VHlwZSBjcmVhdGVFbnZFbnRyeVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRW52RW50cnlUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBQZXJzaXN0ZW5jZUNvbnRleHRSZWZUeXBlIH0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyc2lzdGVuY2VDb250ZXh0UmVmVHlwZSBjcmVhdGVQZXJzaXN0ZW5jZUNvbnRleHRSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgSGFuZGxlckNoYWluc1R5cGUgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIG5hbWUgPSAiaGFuZGxlci1jaGFpbnMiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxIYW5kbGVyQ2hhaW5zVHlwZT4gY3JlYXRlSGFuZGxlckNoYWlucyhIYW5kbGVyQ2hhaW5zVHlwZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEhhbmRsZXJDaGFpbnNUeXBlPihfSGFuZGxlckNoYWluc19RTkFNRSwgSGFuZGxlckNoYWluc1R5cGUuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BhcmFtVmFsdWVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QYXJhbVZhbHVlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjlkNjJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BhcmFtVmFsdWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlIHBhcmFtZXRlci92YWx1ZSBsaXN0cy4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHBhcmFtLXZhbHVlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJwYXJhbS12YWx1ZVR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwYXJhbS1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwYXJhbS12YWx1ZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX14c2RTdHJpbmdUeXBlIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicGFyYW0tdmFsdWVUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicGFyYW1OYW1lIiwKLSAgICAgICAgInBhcmFtVmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZVR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGFyYW0tbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgcGFyYW1OYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGFyYW0tdmFsdWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgcGFyYW1WYWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRQYXJhbU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbU5hbWUob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wYXJhbU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1WYWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRQYXJhbVZhbHVlKCkgewotICAgICAgICByZXR1cm4gcGFyYW1WYWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1WYWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1WYWx1ZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucGFyYW1WYWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QYXRoVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUGF0aFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjMDI4Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QYXRoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudHMgdGhhdCB1c2UgdGhpcyB0eXBlIGRlc2lnbmF0ZSBlaXRoZXIgYSByZWxhdGl2ZSBwYXRoIG9yIGFuIGFic29sdXRlIHBhdGggc3RhcnRpbmcKLSAqIHdpdGggYSAiLyIuCi0gKiA8cC8+Ci0gKiBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZSBzYW1lIERlcGxveW1lbnQgRmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzCi0gKiAoaS5lLiwgdGhvc2Ugbm90IHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgRGVwbG95bWVudCBGaWxlJ3MKLSAqIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZgotICogdGhlIERlcGxveW1lbnQgRmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZSBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzCi0gKiAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcGF0aFR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icGF0aFR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJwYXRoVHlwZSIpCi1wdWJsaWMgY2xhc3MgUGF0aFR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlQ29udGV4dFJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI0ZDE4YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QZXJzaXN0ZW5jZUNvbnRleHRSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgcGVyc2lzdGVuY2UtY29udGV4dC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvCi0gKiBhIHBlcnNpc3RlbmNlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAqIDxwLz4KLSAqIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gLSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2UgbmFtZSAtIGFuIG9wdGlvbmFsIHBlcnNpc3RlbmNlIHVuaXQKLSAqIG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcwotICogdG8gd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB0eXBlIGlzIFRyYW5zYWN0aW9uIG9yIEV4dGVuZGVkLiAgSWYgbm90IHNwZWNpZmllZCwKLSAqIFRyYW5zYWN0aW9uIGlzIGFzc3VtZWQuIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBwZXJzaXN0ZW5jZSBwcm9wZXJ0aWVzIC0gb3B0aW9uYWwgaW5qZWN0aW9uCi0gKiB0YXJnZXRzCi0gKiA8cC8+Ci0gKiBFeGFtcGxlczoKLSAqIDxwLz4KLSAqIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4gPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAqIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT4gPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KLSAqIDxwLz4KLSAqIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4gPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKLSAqIDwvcGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT4gPHBlcnNpc3RlbmNlLXVuaXQtbmFtZT5QZXJzaXN0ZW5jZVVuaXQxIDwvcGVyc2lzdGVuY2UtdW5pdC1uYW1lPgotICogPHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT5FeHRlbmRlZDwvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlPiA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9am5kaS1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c3RyaW5nIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1wZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXByb3BlcnR5IiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXByb3BlcnR5VHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicGVyc2lzdGVuY2UtY29udGV4dC1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSIsCi0gICAgICAgICJwZXJzaXN0ZW5jZVVuaXROYW1lIiwKLSAgICAgICAgInBlcnNpc3RlbmNlQ29udGV4dFR5cGUiLAotICAgICAgICAicGVyc2lzdGVuY2VQcm9wZXJ0eSIsCi0gICAgICAgICJtYXBwZWROYW1lIiwKLSAgICAgICAgImluamVjdGlvblRhcmdldCIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBkZXNjcmlwdGlvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUiLAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEpuZGlOYW1lVHlwZSBwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGVyc2lzdGVuY2UtdW5pdC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUgcGVyc2lzdGVuY2VDb250ZXh0VHlwZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBlcnNpc3RlbmNlLXByb3BlcnR5IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFByb3BlcnR5VHlwZT4gcGVyc2lzdGVuY2VQcm9wZXJ0eTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gaW5qZWN0aW9uVGFyZ2V0OwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlVW5pdE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlVW5pdE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFN0cmluZwotICAgICAqICAgICAgICAgICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0TmFtZSgKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucGVyc2lzdGVuY2VVbml0TmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKFBlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucGVyc2lzdGVuY2VDb250ZXh0VHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZVByb3BlcnR5IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHBlcnNpc3RlbmNlUHJvcGVydHkgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRQZXJzaXN0ZW5jZVByb3BlcnR5KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBQcm9wZXJ0eVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3BlcnR5VHlwZT4gZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0eSgpIHsKLSAgICAgICAgaWYgKHBlcnNpc3RlbmNlUHJvcGVydHkgPT0gbnVsbCkgewotICAgICAgICAgICAgcGVyc2lzdGVuY2VQcm9wZXJ0eSA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHlUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlUHJvcGVydHk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluamVjdGlvblRhcmdldCgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotICAgICAgICBpZiAoaW5qZWN0aW9uVGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvblRhcmdldCA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTgwMjMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlQ29udGV4dFR5cGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbCBuYXR1cmUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0gKiByZWZlcmVuY2UuCi0gKiA8cC8+Ci0gKiBUaGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IFRyYW5zYWN0aW9uCi0gKiBFeHRlbmRlZAotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicGVyc2lzdGVuY2UtY29udGV4dC10eXBlVHlwZSIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VDb250ZXh0VHlwZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlVW5pdFJlZlR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1BlcnNpc3RlbmNlVW5pdFJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkMDRkYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9QZXJzaXN0ZW5jZVVuaXRSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEKLSAqIHBlcnNpc3RlbmNlIHVuaXQgYXNzb2NpYXRlZCB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAqIDxwLz4KLSAqIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gLSB0aGUgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2UgbmFtZSAtIGFuIG9wdGlvbmFsIHBlcnNpc3RlbmNlIHVuaXQKLSAqIG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKLSAqIDxwLz4KLSAqIEV4YW1wbGVzOgotICogPHAvPgotICogPHBlcnNpc3RlbmNlLXVuaXQtcmVmPiA8cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlVW5pdCA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+Ci0gKiA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmPgotICogPHAvPgotICogPHBlcnNpc3RlbmNlLXVuaXQtcmVmPiA8cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlVW5pdCA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+Ci0gKiA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPlBlcnNpc3RlbmNlVW5pdDEgPC9wZXJzaXN0ZW5jZS11bml0LW5hbWU+IDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBwZXJzaXN0ZW5jZS11bml0LXJlZlR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qbmRpLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicGVyc2lzdGVuY2UtdW5pdC1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicGVyc2lzdGVuY2VVbml0UmVmTmFtZSIsCi0gICAgICAgICJwZXJzaXN0ZW5jZVVuaXROYW1lIiwKLSAgICAgICAgIm1hcHBlZE5hbWUiLAotICAgICAgICAiaW5qZWN0aW9uVGFyZ2V0IgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdFJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgSm5kaU5hbWVUeXBlIHBlcnNpc3RlbmNlVW5pdFJlZk5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwZXJzaXN0ZW5jZS11bml0LW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgcGVyc2lzdGVuY2VVbml0TmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIm1hcHBlZC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbWFwcGVkTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImluamVjdGlvbi10YXJnZXQiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gaW5qZWN0aW9uVGFyZ2V0OwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGVyc2lzdGVuY2VVbml0UmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBKbmRpTmFtZVR5cGUgZ2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZk5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlVW5pdFJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0UmVmTmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZVVuaXRSZWZOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlVW5pdE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlVW5pdE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBlcnNpc3RlbmNlVW5pdE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFN0cmluZwotICAgICAqICAgICAgICAgICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0TmFtZSgKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucGVyc2lzdGVuY2VVbml0TmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RTdHJpbmdUeXBlIGdldE1hcHBlZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYXBwZWROYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtYXBwZWROYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNYXBwZWROYW1lKFhzZFN0cmluZ1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5tYXBwZWROYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJbmplY3Rpb25UYXJnZXQoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEluamVjdGlvblRhcmdldFR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGdldEluamVjdGlvblRhcmdldCgpIHsKLSAgICAgICAgaWYgKGluamVjdGlvblRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQgPSBuZXcgQXJyYXlMaXN0PEluamVjdGlvblRhcmdldFR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0aW9uVGFyZ2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Qb3J0Q29tcG9uZW50UmVmVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUG9ydENvbXBvbmVudFJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5ZDdmOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Qb3J0Q29tcG9uZW50UmVmVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5IG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhCi0gKiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0gKiBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBjb250YWluZXIgZm9yIGEKLSAqIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBwb3J0LWNvbXBvbmVudC1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InBvcnQtY29tcG9uZW50LXJlZlR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlbmFibGUtbXRvbSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX10cnVlLWZhbHNlVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwb3J0LWNvbXBvbmVudC1saW5rIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXN0cmluZyIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInBvcnQtY29tcG9uZW50LXJlZlR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLAotICAgICAgICAiZW5hYmxlTXRvbSIsCi0gICAgICAgICJwb3J0Q29tcG9uZW50TGluayIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBQb3J0Q29tcG9uZW50UmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJlbmFibGUtbXRvbSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBUcnVlRmFsc2VUeXBlIGVuYWJsZU10b207Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwb3J0LWNvbXBvbmVudC1saW5rIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW5hYmxlTXRvbSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBUcnVlRmFsc2VUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJ1ZUZhbHNlVHlwZSBnZXRFbmFibGVNdG9tKCkgewotICAgICAgICByZXR1cm4gZW5hYmxlTXRvbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZW5hYmxlTXRvbSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgVHJ1ZUZhbHNlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlTXRvbShUcnVlRmFsc2VUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZW5hYmxlTXRvbSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwb3J0Q29tcG9uZW50TGluayBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyBnZXRQb3J0Q29tcG9uZW50TGluaygpIHsKLSAgICAgICAgcmV0dXJuIHBvcnRDb21wb25lbnRMaW5rOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBwb3J0Q29tcG9uZW50TGluayBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nCi0gICAgICogICAgICAgICAgICAgIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0Q29tcG9uZW50TGluayhvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnBvcnRDb21wb25lbnRMaW5rID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Byb3BlcnR5VHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUHJvcGVydHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjAxN2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUHJvcGVydHlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotCi0KLS8qKgotICogU3BlY2lmaWVzIGEgbmFtZS92YWx1ZSBwYWlyLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcHJvcGVydHlUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5VHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXhzZFN0cmluZ1R5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9eHNkU3RyaW5nVHlwZSIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInByb3BlcnR5VHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgIm5hbWUiLAotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFhzZFN0cmluZ1R5cGUgbmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1JlbW90ZVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1JlbW90ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjZjBiNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZW1vdGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSByZW1vdGUgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVudGVycHJpc2UgYmVhbidzIHJlbW90ZSBpbnRlcmZhY2UuCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPHJlbW90ZT5jb20ud29tYmF0LmVtcGwuRW1wbG95ZWVTZXJ2aWNlPC9yZW1vdGU+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciByZW1vdGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJlbW90ZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicmVtb3RlVHlwZSIpCi1wdWJsaWMgY2xhc3MgUmVtb3RlVHlwZQotICAgICAgICBleHRlbmRzIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNBdXRoVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVzQXV0aFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3ZDE3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNBdXRoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgcmVzLWF1dGhUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlIHNpZ25zIG9uIHByb2dyYW1tYXRpY2FsbHkgdG8gdGhlCi0gKiByZXNvdXJjZSBtYW5hZ2VyLCBvciB3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIG9uIGJlaGFsZiBvZiB0aGUKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotICogRGVwbG95ZXIuCi0gKiA8cC8+Ci0gKiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiA8cC8+Ci0gKiBBcHBsaWNhdGlvbiBDb250YWluZXIKLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHJlcy1hdXRoVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJyZXMtYXV0aFR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJyZXMtYXV0aFR5cGUiKQotcHVibGljIGNsYXNzIFJlc0F1dGhUeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTJjNDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiBUaGUgcmVzLXNoYXJpbmctc2NvcGUgdHlwZSBzcGVjaWZpZXMgd2hldGhlciBjb25uZWN0aW9ucyBvYnRhaW5lZCB0aHJvdWdoIHRoZSBnaXZlbiByZXNvdXJjZQotICogbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLCBtdXN0IGJlIG9uZSBvZiB0aGUKLSAqIHR3byBmb2xsb3dpbmc6Ci0gKiA8cC8+Ci0gKiBTaGFyZWFibGUgVW5zaGFyZWFibGUKLSAqIDxwLz4KLSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFNoYXJlYWJsZS4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHJlcy1zaGFyaW5nLXNjb3BlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJyZXMtc2hhcmluZy1zY29wZVR5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iJmx0O2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZT5zdHJpbmciPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJyZXMtc2hhcmluZy1zY29wZVR5cGUiKQotcHVibGljIGNsYXNzIFJlc1NoYXJpbmdTY29wZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBTdHJpbmcgewotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1Jlc291cmNlRW52UmVmVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVzb3VyY2VFbnZSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDhkNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVzb3VyY2VFbnZSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UtZW52LXJlZlR5cGUgaXMgdXNlZCB0byBkZWZpbmUgcmVzb3VyY2UtZW52LXR5cGUgZWxlbWVudHMuICBJdCBjb250YWlucyBhIGRlY2xhcmF0aW9uCi0gKiBvZiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGFuIGFkbWluaXN0ZXJlZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZQotICogZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBvcHRpb25hbCBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgdHlwZQotICogZXhwZWN0ZWQgYnkgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuCi0gKiA8cC8+Ci0gKiBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yCi0gKiBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIDxwLz4KLSAqIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaAotICogY2FzZSB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlIG11c3QgYmUgYXNzaWdubWVudAotICogY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24gdGFyZ2V0LgotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIDxyZXNvdXJjZS1lbnYtcmVmPiA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlIDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICogPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWUgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+IDwvcmVzb3VyY2UtZW52LXJlZj4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHJlc291cmNlLWVudi1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLWVudi1yZWZUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWpuZGktbmFtZVR5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icmVzb3VyY2UtZW52LXJlZi10eXBlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicmVzb3VyY2UtZW52LXJlZlR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJyZXNvdXJjZUVudlJlZk5hbWUiLAotICAgICAgICAicmVzb3VyY2VFbnZSZWZUeXBlIiwKLSAgICAgICAgIm1hcHBlZE5hbWUiLAotICAgICAgICAiaW5qZWN0aW9uVGFyZ2V0IgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXNvdXJjZS1lbnYtcmVmLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEpuZGlOYW1lVHlwZSByZXNvdXJjZUVudlJlZk5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXNvdXJjZS1lbnYtcmVmLXR5cGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgcmVzb3VyY2VFbnZSZWZUeXBlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZUVudlJlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSm5kaU5hbWVUeXBlIGdldFJlc291cmNlRW52UmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlRW52UmVmTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2VFbnZSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlRW52UmVmTmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZUVudlJlZk5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2VFbnZSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0UmVzb3VyY2VFbnZSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VFbnZSZWZUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZUVudlJlZlR5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUVudlJlZlR5cGUoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXNvdXJjZUVudlJlZlR5cGUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RTdHJpbmdUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkU3RyaW5nVHlwZSBnZXRNYXBwZWROYW1lKCkgewotICAgICAgICByZXR1cm4gbWFwcGVkTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWFwcGVkTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWFwcGVkTmFtZShYc2RTdHJpbmdUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMubWFwcGVkTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmplY3Rpb25UYXJnZXQgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5qZWN0aW9uVGFyZ2V0KCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJbmplY3Rpb25UYXJnZXRUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBnZXRJbmplY3Rpb25UYXJnZXQoKSB7Ci0gICAgICAgIGlmIChpbmplY3Rpb25UYXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IEFycmF5TGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluamVjdGlvblRhcmdldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUmVzb3VyY2VSZWZUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNvdXJjZVJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmMDhjZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SZXNvdXJjZVJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYSBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbAotICogcmVzb3VyY2UuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkKLSAqIHJlZmVyZW5jZSBuYW1lLCBhbiBvcHRpb25hbCBpbmRpY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSB0eXBlIGV4cGVjdGVkCi0gKiBieSB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgYW4gb3B0aW9uYWwgdHlwZSBvZiBhdXRoZW50aWNhdGlvbiAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwKLSAqIGFuZCBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzaGFyZWFiaWxpdHkgb2YgY29ubmVjdGlvbnMgb2J0YWluZWQgZnJvbSB0aGUgcmVzb3VyY2UKLSAqIChTaGFyZWFibGUgb3IgVW5zaGFyZWFibGUpLgotICogPHAvPgotICogSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvcgotICogSmF2YUJlYW5zIHByb3BlcnRpZXMuCi0gKiA8cC8+Ci0gKiBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4gaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoCi0gKiBjYXNlIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUgbXVzdCBiZSBhc3NpZ25tZW50Ci0gKiBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbiB0YXJnZXQuCi0gKiA8cC8+Ci0gKiBFeGFtcGxlOgotICogPHAvPgotICogPHJlc291cmNlLXJlZj4gPHJlcy1yZWYtbmFtZT5qZGJjL0VtcGxveWVlQXBwREI8L3Jlcy1yZWYtbmFtZT4gPHJlcy10eXBlPmphdmF4LnNxbC5EYXRhU291cmNlPC9yZXMtdHlwZT4KLSAqIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPiA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4gPC9yZXNvdXJjZS1yZWY+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciByZXNvdXJjZS1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InJlc291cmNlLXJlZlR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9ZGVzY3JpcHRpb25UeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXMtcmVmLW5hbWUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9am5kaS1uYW1lVHlwZSIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXMtdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJlcy1hdXRoIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJlcy1hdXRoVHlwZSIKLSAqIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXMtc2hhcmluZy1zY29wZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXMtc2hhcmluZy1zY29wZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yZXNvdXJjZUdyb3VwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicmVzb3VyY2UtcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgInJlc1JlZk5hbWUiLAotICAgICAgICAicmVzVHlwZSIsCi0gICAgICAgICJyZXNBdXRoIiwKLSAgICAgICAgInJlc1NoYXJpbmdTY29wZSIsCi0gICAgICAgICJtYXBwZWROYW1lIiwKLSAgICAgICAgImluamVjdGlvblRhcmdldCIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicmVzLXJlZi1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBKbmRpTmFtZVR5cGUgcmVzUmVmTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJlcy10eXBlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHJlc1R5cGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXMtYXV0aCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBSZXNBdXRoVHlwZSByZXNBdXRoOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicmVzLXNoYXJpbmctc2NvcGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgUmVzU2hhcmluZ1Njb3BlVHlwZSByZXNTaGFyaW5nU2NvcGU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtYXBwZWQtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RTdHJpbmdUeXBlIG1hcHBlZE5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbmplY3Rpb24tdGFyZ2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PEluamVjdGlvblRhcmdldFR5cGU+IGluamVjdGlvblRhcmdldDsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc1JlZk5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSm5kaU5hbWVUeXBlIGdldFJlc1JlZk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByZXNSZWZOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBKbmRpTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc1JlZk5hbWUoSm5kaU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucmVzUmVmTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0UmVzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc1R5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc1R5cGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNUeXBlKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucmVzVHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNBdXRoIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFJlc0F1dGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzQXV0aFR5cGUgZ2V0UmVzQXV0aCgpIHsKLSAgICAgICAgcmV0dXJuIHJlc0F1dGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc0F1dGggcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJlc0F1dGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNBdXRoKFJlc0F1dGhUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucmVzQXV0aCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNTaGFyaW5nU2NvcGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUmVzU2hhcmluZ1Njb3BlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFJlc1NoYXJpbmdTY29wZVR5cGUgZ2V0UmVzU2hhcmluZ1Njb3BlKCkgewotICAgICAgICByZXR1cm4gcmVzU2hhcmluZ1Njb3BlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNTaGFyaW5nU2NvcGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJlc1NoYXJpbmdTY29wZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucmVzU2hhcmluZ1Njb3BlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluamVjdGlvblRhcmdldCgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotICAgICAgICBpZiAoaW5qZWN0aW9uVGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvblRhcmdldCA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1JvbGVOYW1lVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUm9sZU5hbWVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZWFjNzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvUm9sZU5hbWVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoZSByb2xlLW5hbWVUeXBlIGRlc2lnbmF0ZXMgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotICogPHAvPgotICogVGhlIG5hbWUgbXVzdCBjb25mb3JtIHRvIHRoZSBsZXhpY2FsIHJ1bGVzIGZvciBhIHRva2VuLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igcm9sZS1uYW1lVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJyb2xlLW5hbWVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IiZsdDtodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWU+c3RyaW5nIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAicm9sZS1uYW1lVHlwZSIpCi1wdWJsaWMgY2xhc3MgUm9sZU5hbWVUeXBlCi0gICAgICAgIGV4dGVuZHMgU3RyaW5nIHsKLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9SdW5Bc1R5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1J1bkFzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzRmMjM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1J1bkFzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGNvbXBvbmVudC4gSXQKLSAqIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgcnVuLWFzVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJydW4tYXNUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icm9sZS1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJvbGUtbmFtZVR5cGUiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJydW4tYXNUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicm9sZU5hbWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgUnVuQXNUeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBkZXNjcmlwdGlvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJvbGUtbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgUm9sZU5hbWVUeXBlIHJvbGVOYW1lOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXREZXNjcmlwdGlvbigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgRGVzY3JpcHRpb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBuZXcgQXJyYXlMaXN0PERlc2NyaXB0aW9uVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZU5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUm9sZU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUm9sZU5hbWVUeXBlIGdldFJvbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gcm9sZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJvbGVOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvbGVOYW1lKFJvbGVOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnJvbGVOYW1lID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlY3VyaXR5Um9sZVJlZlR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlY3VyaXR5Um9sZVJlZlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwYjdmZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZWN1cml0eVJvbGVSZWZUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBhIHNlY3VyaXR5IHJvbGUgcmVmZXJlbmNlIGluIGEgY29tcG9uZW50J3MKLSAqIG9yIGEgRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotICogc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUsIGFuZCBhbiBvcHRpb25hbCBsaW5rIHRvIGEgc2VjdXJpdHkgcm9sZS4gSWYgdGhlIHNlY3VyaXR5Ci0gKiByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbiBhcHByb3ByaWF0ZSBzZWN1cml0eSByb2xlLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igc2VjdXJpdHktcm9sZS1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGUtcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJvbGUtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yb2xlLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJvbGUtbGluayIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1yb2xlLW5hbWVUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAic2VjdXJpdHktcm9sZS1yZWZUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiZGVzY3JpcHRpb24iLAotICAgICAgICAicm9sZU5hbWUiLAotICAgICAgICAicm9sZUxpbmsiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlUmVmVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZGVzY3JpcHRpb247Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyb2xlLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFJvbGVOYW1lVHlwZSByb2xlTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJvbGUtbGluayIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBSb2xlTmFtZVR5cGUgcm9sZUxpbms7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByb2xlTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBSb2xlTmFtZVR5cGUgZ2V0Um9sZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByb2xlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZU5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJvbGVOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoUm9sZU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucm9sZU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZUxpbmsgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgUm9sZU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUm9sZU5hbWVUeXBlIGdldFJvbGVMaW5rKCkgewotICAgICAgICByZXR1cm4gcm9sZUxpbms7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJvbGVMaW5rIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvbGVMaW5rKFJvbGVOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnJvbGVMaW5rID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlY3VyaXR5Um9sZVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlY3VyaXR5Um9sZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmNDE5YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZWN1cml0eVJvbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eSByb2xlLiBUaGUgZGVmaW5pdGlvbiBjb25zaXN0cyBvZiBhbgotICogb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgotICogPHAvPgotICogRXhhbXBsZToKLSAqIDxwLz4KLSAqIDxzZWN1cml0eS1yb2xlPiA8ZGVzY3JpcHRpb24+IFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZCB0byBhY2Nlc3MgdGhlCi0gKiBlbXBsb3llZSBzZXJ2aWNlIGFwcGxpY2F0aW9uLiA8L2Rlc2NyaXB0aW9uPiA8cm9sZS1uYW1lPmVtcGxveWVlPC9yb2xlLW5hbWU+IDwvc2VjdXJpdHktcm9sZT4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHNlY3VyaXR5LXJvbGVUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InNlY3VyaXR5LXJvbGVUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icm9sZS1uYW1lIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXJvbGUtbmFtZVR5cGUiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJzZWN1cml0eS1yb2xlVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgInJvbGVOYW1lIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicm9sZS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBSb2xlTmFtZVR5cGUgcm9sZU5hbWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByb2xlTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBSb2xlTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBSb2xlTmFtZVR5cGUgZ2V0Um9sZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByb2xlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcm9sZU5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFJvbGVOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um9sZU5hbWUoUm9sZU5hbWVUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucm9sZU5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTU0MDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbi4gSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUKLSAqIGhhbmRsZXJzIGluIHRoZSBoYW5kbGVyY2hhaW4gb3BlcmF0ZSxhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlLCBvbiBhIHNwZWNpZmljIHBvcnQgb3Igb24gYSBsaXN0IG9mCi0gKiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cyBzZXJ2aWNlLW5hbWUtcGF0dGVybiwgcG9ydC1uYW1lLXBhdHRlcm4gYW5kCi0gKiBwcm90b2NvbC1iaW5kaW5ncyBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIGhhbmRsZXItY2hhaW4gYXJlIGZvciBhIHNlcnZpY2UsCi0gKiBwb3J0IG9yIHByb3RvY29sIGJpbmRpbmcuIElmIG5vbmUgb2YgdGhlc2UgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudAotICogdGhlbiB0aGUgaGFuZGxlcnMgc3BlY2lmaWVkIGluIHRoZSBoYW5kbGVyLWNoYWluIHdpbGwgYmUgYXBwbGllZCBvbiBldmVyeXRoaW5nLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igc2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2Nob2ljZSBtaW5PY2N1cnM9IjAiPgotICogICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNlcnZpY2UtbmFtZS1wYXR0ZXJuIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXNlcnZpY2UtcmVmX3FuYW1lLXBhdHRlcm4iLz4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwb3J0LW5hbWUtcGF0dGVybiIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zZXJ2aWNlLXJlZl9xbmFtZS1wYXR0ZXJuIi8+Ci0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icHJvdG9jb2wtYmluZGluZ3MiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ0xpc3RUeXBlIi8+Ci0gKiAgICAgICAgICZsdDsvY2hvaWNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInNlcnZpY2VOYW1lUGF0dGVybiIsCi0gICAgICAgICJwb3J0TmFtZVBhdHRlcm4iLAotICAgICAgICAicHJvdG9jb2xCaW5kaW5ncyIsCi0gICAgICAgICJoYW5kbGVyIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5UeXBlIHsKLQotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic2VydmljZS1uYW1lLXBhdHRlcm4iLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgc2VydmljZU5hbWVQYXR0ZXJuOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicG9ydC1uYW1lLXBhdHRlcm4iLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgcG9ydE5hbWVQYXR0ZXJuOwotICAgIEBYbWxMaXN0Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJwcm90b2NvbC1iaW5kaW5ncyIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBMaXN0PGphdmEubGFuZy5TdHJpbmc+IHByb3RvY29sQmluZGluZ3M7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxTZXJ2aWNlUmVmSGFuZGxlclR5cGU+IGhhbmRsZXI7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlTmFtZVBhdHRlcm4gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmljZU5hbWVQYXR0ZXJuKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWVQYXR0ZXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlTmFtZVBhdHRlcm4gcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lUGF0dGVybihqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWVQYXR0ZXJuID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnROYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQb3J0TmFtZVBhdHRlcm4oKSB7Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZVBhdHRlcm47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnROYW1lUGF0dGVybiBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWVQYXR0ZXJuKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5wb3J0TmFtZVBhdHRlcm4gPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvdG9jb2xCaW5kaW5ncyBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBwcm90b2NvbEJpbmRpbmdzIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0UHJvdG9jb2xCaW5kaW5ncygpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8amF2YS5sYW5nLlN0cmluZz4gZ2V0UHJvdG9jb2xCaW5kaW5ncygpIHsKLSAgICAgICAgaWYgKHByb3RvY29sQmluZGluZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcHJvdG9jb2xCaW5kaW5ncyA9IG5ldyBBcnJheUxpc3Q8amF2YS5sYW5nLlN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbEJpbmRpbmdzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGhhbmRsZXIgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRIYW5kbGVyKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBTZXJ2aWNlUmVmSGFuZGxlclR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VSZWZIYW5kbGVyVHlwZT4gZ2V0SGFuZGxlcigpIHsKLSAgICAgICAgaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBBcnJheUxpc3Q8U2VydmljZVJlZkhhbmRsZXJUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NDQ4MTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotLyoqCi0gKiBUaGUgaGFuZGxlci1jaGFpbnMgZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2Ugb3Igc2VydmljZQotICogZW5kcG9pbnQuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciBzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlci1jaGFpbnNUeXBlIj4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhhbmRsZXItY2hhaW4iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9c2VydmljZS1yZWZfaGFuZGxlci1jaGFpblR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAic2VydmljZS1yZWZfaGFuZGxlci1jaGFpbnNUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiaGFuZGxlckNoYWluIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSB7Ci0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gImhhbmRsZXItY2hhaW4iLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8U2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGU+IGhhbmRsZXJDaGFpbjsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJDaGFpbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBoYW5kbGVyQ2hhaW4gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRIYW5kbGVyQ2hhaW4oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTZXJ2aWNlUmVmSGFuZGxlckNoYWluVHlwZT4gZ2V0SGFuZGxlckNoYWluKCkgewotICAgICAgICBpZiAoaGFuZGxlckNoYWluID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXJDaGFpbiA9IG5ldyBBcnJheUxpc3Q8U2VydmljZVJlZkhhbmRsZXJDaGFpblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlckNoYWluOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9TZXJ2aWNlUmVmSGFuZGxlclR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlcnZpY2VSZWZIYW5kbGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JkN2Y1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlcnZpY2VSZWZIYW5kbGVyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycwotICogdXNpbmcgdGhlIEhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUKLSAqIGFzc29jaWF0ZWQgd2l0aCBhbGwgcG9ydHMgb2YgdGhlIHNlcnZpY2UuCi0gKiA8cC8+Ci0gKiBVc2VkIGluOiBzZXJ2aWNlLXJlZgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igc2VydmljZS1yZWZfaGFuZGxlclR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ic2VydmljZS1yZWZfaGFuZGxlclR5cGUiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2dyb3VwIHJlZj0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1kZXNjcmlwdGlvbkdyb3VwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImhhbmRsZXItbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaGFuZGxlci1jbGFzcyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImluaXQtcGFyYW0iIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cGFyYW0tdmFsdWVUeXBlIgotICogbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzb2FwLWhlYWRlciIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX14c2RRTmFtZVR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNvYXAtcm9sZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InBvcnQtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zdHJpbmciCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAic2VydmljZS1yZWZfaGFuZGxlclR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJkZXNjcmlwdGlvbiIsCi0gICAgICAgICJkaXNwbGF5TmFtZSIsCi0gICAgICAgICJpY29uIiwKLSAgICAgICAgImhhbmRsZXJOYW1lIiwKLSAgICAgICAgImhhbmRsZXJDbGFzcyIsCi0gICAgICAgICJpbml0UGFyYW0iLAotICAgICAgICAic29hcEhlYWRlciIsCi0gICAgICAgICJzb2FwUm9sZSIsCi0gICAgICAgICJwb3J0TmFtZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVmSGFuZGxlclR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZGlzcGxheS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZGlzcGxheU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJY29uVHlwZT4gaWNvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImhhbmRsZXItbmFtZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgaGFuZGxlck5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJoYW5kbGVyLWNsYXNzIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBoYW5kbGVyQ2xhc3M7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJpbml0LXBhcmFtIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFBhcmFtVmFsdWVUeXBlPiBpbml0UGFyYW07Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJzb2FwLWhlYWRlciIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxYc2RRTmFtZVR5cGU+IHNvYXBIZWFkZXI7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJzb2FwLXJvbGUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIExpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+IHNvYXBSb2xlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicG9ydC1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nPiBwb3J0TmFtZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRlc2NyaXB0aW9uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGVzY3JpcHRpb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERlc2NyaXB0aW9uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGVzY3JpcHRpb25UeXBlPiBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdGlvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRpc3BsYXlOYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRpc3BsYXlOYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0RGlzcGxheU5hbWUoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIERpc3BsYXlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8RGlzcGxheU5hbWVUeXBlPiBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgaWYgKGRpc3BsYXlOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gbmV3IEFycmF5TGlzdDxEaXNwbGF5TmFtZVR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGljb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaWNvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEljb24oKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIEljb25UeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxJY29uVHlwZT4gZ2V0SWNvbigpIHsKLSAgICAgICAgaWYgKGljb24gPT0gbnVsbCkgewotICAgICAgICAgICAgaWNvbiA9IG5ldyBBcnJheUxpc3Q8SWNvblR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaWNvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlck5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlck5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFN0cmluZwotICAgICAqICAgICAgICAgICAgICB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlck5hbWUob3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBoYW5kbGVyQ2xhc3MgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBnZXRIYW5kbGVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJDbGFzcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJDbGFzcyhGdWxseVF1YWxpZmllZENsYXNzVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmhhbmRsZXJDbGFzcyA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbml0UGFyYW0gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5pdFBhcmFtIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0SW5pdFBhcmFtKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBQYXJhbVZhbHVlVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8UGFyYW1WYWx1ZVR5cGU+IGdldEluaXRQYXJhbSgpIHsKLSAgICAgICAgaWYgKGluaXRQYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0UGFyYW0gPSBuZXcgQXJyYXlMaXN0PFBhcmFtVmFsdWVUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmluaXRQYXJhbTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc29hcEhlYWRlciBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBzb2FwSGVhZGVyIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0U29hcEhlYWRlcigpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgWHNkUU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxYc2RRTmFtZVR5cGU+IGdldFNvYXBIZWFkZXIoKSB7Ci0gICAgICAgIGlmIChzb2FwSGVhZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBIZWFkZXIgPSBuZXcgQXJyYXlMaXN0PFhzZFFOYW1lVHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zb2FwSGVhZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzb2FwUm9sZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBzb2FwUm9sZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldFNvYXBSb2xlKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluawotICAgICAqIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4gZ2V0U29hcFJvbGUoKSB7Ci0gICAgICAgIGlmIChzb2FwUm9sZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzb2FwUm9sZSA9IG5ldyBBcnJheUxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuc29hcFJvbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBvcnROYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHBvcnROYW1lIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgotICAgICAqIDxwcmU+Ci0gICAgICogICAgZ2V0UG9ydE5hbWUoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rCi0gICAgICogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuU3RyaW5nPiBnZXRQb3J0TmFtZSgpIHsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnROYW1lID0gbmV3IEFycmF5TGlzdDxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyLlN0cmluZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5wb3J0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZlR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1NlcnZpY2VSZWZUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzM1ZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU2VydmljZVJlZlR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViIHNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLAotICogZGlzcGxheSBuYW1lIGFuZCBpY29ucywgYSBkZWNsYXJhdGlvbiBvZiB0aGUgcmVxdWlyZWQgU2VydmljZSBpbnRlcmZhY2UsIGFuIG9wdGlvbmFsIFdTREwKLSAqIGRvY3VtZW50IGxvY2F0aW9uLCBhbiBvcHRpb25hbCBzZXQgb2YgSkFYLVJQQyBtYXBwaW5ncywgYW4gb3B0aW9uYWwgUU5hbWUgZm9yIHRoZSBzZXJ2aWNlCi0gKiBlbGVtZW50LCBhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkIGJ5IHRoZSBjb250YWluZXIgdG8gYSBXU0RMCi0gKiBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igc2VydmljZS1yZWZUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InNlcnZpY2UtcmVmVHlwZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7Z3JvdXAgcmVmPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWRlc2NyaXB0aW9uR3JvdXAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYtbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1qbmRpLW5hbWVUeXBlIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InNlcnZpY2UtaW50ZXJmYWNlIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfWZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1yZWYtdHlwZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1mdWxseS1xdWFsaWZpZWQtY2xhc3NUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9IndzZGwtZmlsZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX14c2RBbnlVUklUeXBlIgotICogbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImpheHJwYy1tYXBwaW5nLWZpbGUiIHR5cGU9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cGF0aFR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic2VydmljZS1xbmFtZSIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX14c2RRTmFtZVR5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icG9ydC1jb21wb25lbnQtcmVmIiB0eXBlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlfXBvcnQtY29tcG9uZW50LXJlZlR5cGUiCi0gKiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAgICZsdDtjaG9pY2U+Ci0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaGFuZGxlciIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zZXJ2aWNlLXJlZl9oYW5kbGVyVHlwZSIKLSAqIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWNoYWlucyIgdHlwZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZX1zZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiCi0gKiBtaW5PY2N1cnM9IjAiLz4KLSAqICAgICAgICAgJmx0Oy9jaG9pY2U+Ci0gKiAgICAgICAgICZsdDtncm91cCByZWY9IntodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWV9cmVzb3VyY2VHcm91cCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInNlcnZpY2UtcmVmVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImRlc2NyaXB0aW9uIiwKLSAgICAgICAgImRpc3BsYXlOYW1lIiwKLSAgICAgICAgImljb24iLAotICAgICAgICAic2VydmljZVJlZk5hbWUiLAotICAgICAgICAic2VydmljZUludGVyZmFjZSIsCi0gICAgICAgICJzZXJ2aWNlUmVmVHlwZSIsCi0gICAgICAgICJ3c2RsRmlsZSIsCi0gICAgICAgICJqYXhycGNNYXBwaW5nRmlsZSIsCi0gICAgICAgICJzZXJ2aWNlUW5hbWUiLAotICAgICAgICAicG9ydENvbXBvbmVudFJlZiIsCi0gICAgICAgICJoYW5kbGVyIiwKLSAgICAgICAgImhhbmRsZXJDaGFpbnMiLAotICAgICAgICAibWFwcGVkTmFtZSIsCi0gICAgICAgICJpbmplY3Rpb25UYXJnZXQiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZlR5cGUgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxEZXNjcmlwdGlvblR5cGU+IGRlc2NyaXB0aW9uOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiZGlzcGxheS1uYW1lIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZGlzcGxheU5hbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJY29uVHlwZT4gaWNvbjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNlcnZpY2UtcmVmLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwKLSAgICAgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIEpuZGlOYW1lVHlwZSBzZXJ2aWNlUmVmTmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNlcnZpY2UtaW50ZXJmYWNlIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsCi0gICAgICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBzZXJ2aWNlSW50ZXJmYWNlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAic2VydmljZS1yZWYtdHlwZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBGdWxseVF1YWxpZmllZENsYXNzVHlwZSBzZXJ2aWNlUmVmVHlwZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gIndzZGwtZmlsZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBYc2RBbnlVUklUeXBlIHdzZGxGaWxlOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiamF4cnBjLW1hcHBpbmctZmlsZSIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKQotICAgIHByb3RlY3RlZCBQYXRoVHlwZSBqYXhycGNNYXBwaW5nRmlsZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInNlcnZpY2UtcW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkUU5hbWVUeXBlIHNlcnZpY2VRbmFtZTsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gInBvcnQtY29tcG9uZW50LXJlZiIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxQb3J0Q29tcG9uZW50UmVmVHlwZT4gcG9ydENvbXBvbmVudFJlZjsKLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgcmVxdWlyZWQgPSB0cnVlKQotICAgIHByb3RlY3RlZCBMaXN0PFNlcnZpY2VSZWZIYW5kbGVyVHlwZT4gaGFuZGxlcjsKLSAgICBAWG1sRWxlbWVudChuYW1lID0gImhhbmRsZXItY2hhaW5zIiwgbmFtZXNwYWNlID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpCi0gICAgcHJvdGVjdGVkIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSBoYW5kbGVyQ2hhaW5zOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWFwcGVkLW5hbWUiLCBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLSAgICBwcm90ZWN0ZWQgWHNkU3RyaW5nVHlwZSBtYXBwZWROYW1lOwotICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaW5qZWN0aW9uLXRhcmdldCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLAotICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgTGlzdDxJbmplY3Rpb25UYXJnZXRUeXBlPiBpbmplY3Rpb25UYXJnZXQ7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERlc2NyaXB0aW9uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEZXNjcmlwdGlvblR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0aW9uVHlwZT4gZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRpb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwgbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkKLSAgICAgKiBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuIFRoaXMgaXMKLSAgICAgKiB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkaXNwbGF5TmFtZSBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldERpc3BsYXlOYW1lKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBEaXNwbGF5TmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PERpc3BsYXlOYW1lVHlwZT4gZ2V0RGlzcGxheU5hbWUoKSB7Ci0gICAgICAgIGlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNwbGF5TmFtZSA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheU5hbWVUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpY29uIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGljb24gcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRJY29uKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBJY29uVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SWNvblR5cGU+IGdldEljb24oKSB7Ci0gICAgICAgIGlmIChpY29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGljb24gPSBuZXcgQXJyYXlMaXN0PEljb25UeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmljb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VSZWZOYW1lIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEpuZGlOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEpuZGlOYW1lVHlwZSBnZXRTZXJ2aWNlUmVmTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VSZWZOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlUmVmTmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgSm5kaU5hbWVUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUmVmTmFtZShKbmRpTmFtZVR5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlUmVmTmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlSW50ZXJmYWNlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgZ2V0U2VydmljZUludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VJbnRlcmZhY2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlKEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUludGVyZmFjZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlUmVmVHlwZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlIGdldFNlcnZpY2VSZWZUeXBlKCkgewotICAgICAgICByZXR1cm4gc2VydmljZVJlZlR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VSZWZUeXBlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBGdWxseVF1YWxpZmllZENsYXNzVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVJlZlR5cGUoRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlUmVmVHlwZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB3c2RsRmlsZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RBbnlVUklUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgWHNkQW55VVJJVHlwZSBnZXRXc2RsRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB3c2RsRmlsZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgWHNkQW55VVJJVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbEZpbGUoWHNkQW55VVJJVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLndzZGxGaWxlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGpheHJwY01hcHBpbmdGaWxlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFBhdGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aFR5cGUgZ2V0SmF4cnBjTWFwcGluZ0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBqYXhycGNNYXBwaW5nRmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgamF4cnBjTWFwcGluZ0ZpbGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFBhdGhUeXBlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXhycGNNYXBwaW5nRmlsZShQYXRoVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLmpheHJwY01hcHBpbmdGaWxlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2VRbmFtZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBYc2RRTmFtZVR5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBYc2RRTmFtZVR5cGUgZ2V0U2VydmljZVFuYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZVFuYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzZXJ2aWNlUW5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFFOYW1lVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVFuYW1lKFhzZFFOYW1lVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnNlcnZpY2VRbmFtZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwb3J0Q29tcG9uZW50UmVmIHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHBvcnRDb21wb25lbnRSZWYgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6Ci0gICAgICogPHByZT4KLSAgICAgKiAgICBnZXRQb3J0Q29tcG9uZW50UmVmKCkuYWRkKG5ld0l0ZW0pOwotICAgICAqIDwvcHJlPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0IHtAbGluayBQb3J0Q29tcG9uZW50UmVmVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8UG9ydENvbXBvbmVudFJlZlR5cGU+IGdldFBvcnRDb21wb25lbnRSZWYoKSB7Ci0gICAgICAgIGlmIChwb3J0Q29tcG9uZW50UmVmID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnRDb21wb25lbnRSZWYgPSBuZXcgQXJyYXlMaXN0PFBvcnRDb21wb25lbnRSZWZUeXBlPigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnBvcnRDb21wb25lbnRSZWY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXIgcHJvcGVydHkuCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55Ci0gICAgICogbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LiBUaGlzIGlzCi0gICAgICogd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaGFuZGxlciBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEhhbmRsZXIoKS5hZGQobmV3SXRlbSk7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3Qge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U2VydmljZVJlZkhhbmRsZXJUeXBlPiBnZXRIYW5kbGVyKCkgewotICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBoYW5kbGVyID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlUmVmSGFuZGxlclR5cGU+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaGFuZGxlckNoYWlucyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBTZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUgZ2V0SGFuZGxlckNoYWlucygpIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGhhbmRsZXJDaGFpbnMgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWluc1R5cGUgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5oYW5kbGVyQ2hhaW5zID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgWHNkU3RyaW5nVHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIFhzZFN0cmluZ1R5cGUgZ2V0TWFwcGVkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1hcHBlZE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1hcHBlZE5hbWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFhzZFN0cmluZ1R5cGUgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZE5hbWUoWHNkU3RyaW5nVHlwZSB2YWx1ZSkgewotICAgICAgICB0aGlzLm1hcHBlZE5hbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5qZWN0aW9uVGFyZ2V0IHByb3BlcnR5LgotICAgICAqIDxwLz4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LCBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueQotICAgICAqIG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUgcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4gVGhpcyBpcwotICAgICAqIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGluamVjdGlvblRhcmdldCBwcm9wZXJ0eS4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKLSAgICAgKiA8cHJlPgotICAgICAqICAgIGdldEluamVjdGlvblRhcmdldCgpLmFkZChuZXdJdGVtKTsKLSAgICAgKiA8L3ByZT4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdCB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0VHlwZSB9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4gZ2V0SW5qZWN0aW9uVGFyZ2V0KCkgewotICAgICAgICBpZiAoaW5qZWN0aW9uVGFyZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluamVjdGlvblRhcmdldCA9IG5ldyBBcnJheUxpc3Q8SW5qZWN0aW9uVGFyZ2V0VHlwZT4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rpb25UYXJnZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1N0cmluZy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNmRmOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoaXMgaXMgYSBzcGVjaWFsIHN0cmluZyBkYXRhdHlwZSB0aGF0IGlzIGRlZmluZWQgYnkgSmF2YSBFRSBhcyBhIGJhc2UgdHlwZSBmb3IgZGVmaW5pbmcKLSAqIGNvbGxhcHNlZCBzdHJpbmdzLiBXaGVuIHNjaGVtYXMgcmVxdWlyZSB0cmFpbGluZy9sZWFkaW5nIHNwYWNlIGVsaW1pbmF0aW9uIGFzIHdlbGwgYXMgY29sbGFwc2luZwotICogdGhlIGV4aXN0aW5nIHdoaXRlc3BhY2UsIHRoaXMgYmFzZSB0eXBlIG1heSBiZSB1c2VkLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3Igc3RyaW5nIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InN0cmluZyI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPnRva2VuIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInN0cmluZyIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFN0cmluZyB7Ci0KLSAgICBAWG1sVmFsdWUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgdmFsdWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1RydWVGYWxzZVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1RydWVGYWxzZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMWI0ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9UcnVlRmFsc2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgc2ltcGxlIHR5cGUgZGVzaWduYXRlcyBhIGJvb2xlYW4gd2l0aCBvbmx5IHR3byBwZXJtaXNzaWJsZSB2YWx1ZXMKLSAqIDxwLz4KLSAqIC0gdHJ1ZSAtIGZhbHNlCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciB0cnVlLWZhbHNlVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJ0cnVlLWZhbHNlVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSImbHQ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlPnhzZEJvb2xlYW5UeXBlIj4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAidHJ1ZS1mYWxzZVR5cGUiKQotcHVibGljIGNsYXNzIFRydWVGYWxzZVR5cGUKLSAgICAgICAgZXh0ZW5kcyBYc2RCb29sZWFuVHlwZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvVXJsUGF0dGVyblR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1VybFBhdHRlcm5UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzU2ZWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvVXJsUGF0dGVyblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci0KLQotLyoqCi0gKiBUaGUgdXJsLXBhdHRlcm5UeXBlIGNvbnRhaW5zIHRoZSB1cmwgcGF0dGVybiBvZiB0aGUgbWFwcGluZy4gSXQgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZAotICogaW4gU2VjdGlvbiAxMS4yIG9mIHRoZSBTZXJ2bGV0IEFQSSBTcGVjaWZpY2F0aW9uLiBUaGlzIHBhdHRlcm4gaXMgYXNzdW1lZCB0byBiZSBpbiBVUkwtZGVjb2RlZAotICogZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuIElmIGl0IGNvbnRhaW5zIHRob3NlIGNoYXJhY3RlcnMsIHRoZSBjb250YWluZXIgbXVzdAotICogaW5mb3JtIHRoZSBkZXZlbG9wZXIgd2l0aCBhIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UuIFRoZSBjb250YWluZXIgbXVzdCBwcmVzZXJ2ZSBhbGwgY2hhcmFjdGVycwotICogaW5jbHVkaW5nIHdoaXRlc3BhY2VzLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgdXJsLXBhdHRlcm5UeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InVybC1wYXR0ZXJuVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPnN0cmluZyI+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ1cmwtcGF0dGVyblR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJ2YWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBVcmxQYXR0ZXJuVHlwZSB7Ci0KLSAgICBAWG1sVmFsdWUKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RBbnlVUklUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RBbnlVUklUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZTgwNTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkQW55VVJJVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6YW55VVJJLgotICogPHAvPgotICogPHAvPgotICogPHAvPgotICogPHA+SmF2YSBjbGFzcyBmb3IgeHNkQW55VVJJVHlwZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJ4c2RBbnlVUklUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+YW55VVJJIj4KLSAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KLSAqICAgICAmbHQ7L2V4dGVuc2lvbj4KLSAqICAgJmx0Oy9zaW1wbGVDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gInhzZEFueVVSSVR5cGUiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJ2YWx1ZSIKLSAgICAgICAgfSkKLXB1YmxpYyBjbGFzcyBYc2RBbnlVUklUeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RCb29sZWFuVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkQm9vbGVhblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiMDY2NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RCb29sZWFuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Ym9vbGVhbi4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZEJvb2xlYW5UeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InhzZEJvb2xlYW5UeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+Ym9vbGVhbiI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2RCb29sZWFuVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFhzZEJvb2xlYW5UeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBib29sZWFuIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKiogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LiAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RJbnRlZ2VyVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkSW50ZWdlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwYzc2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RJbnRlZ2VyVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6aW50ZWdlci4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZEludGVnZXJUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InhzZEludGVnZXJUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+aW50ZWdlciI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2RJbnRlZ2VyVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFhzZEludGVnZXJUeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlOwotICAgIEBYbWxBdHRyaWJ1dGUKLSAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCi0gICAgQFhtbElECi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgaWQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgQmlnSW50ZWdlciB9Ci0gICAgICovCi0gICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIEJpZ0ludGVnZXIgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEJpZ0ludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmlkID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2ROTVRPS0VOVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkTk1UT0tFTlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwMGU2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2ROTVRPS0VOVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4wLWI1Mi1mY3MgCi0vLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4gCi0vLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4gCi0vLyBHZW5lcmF0ZWQgb246IDIwMDcuMDMuMjEgYXQgMTA6NTY6NTEgQU0gQ0RUIAotLy8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6Tk1UT0tFTi4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZE5NVE9LRU5UeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InhzZE5NVE9LRU5UeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+Tk1UT0tFTiI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2ROTVRPS0VOVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFhzZE5NVE9LRU5UeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyB2YWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjNkZmRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0KLS8qKgotICogVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOm5vbk5lZ2F0aXZlSW50ZWdlci4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZE5vbk5lZ2F0aXZlSW50ZWdlclR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPm5vbk5lZ2F0aXZlSW50ZWdlciI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2ROb25OZWdhdGl2ZUludGVnZXJUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkTm9uTmVnYXRpdmVJbnRlZ2VyVHlwZSB7Ci0KLSAgICBAWG1sVmFsdWUKLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEJpZ0ludGVnZXIgfQotICAgICAqLwotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBCaWdJbnRlZ2VyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDhjMDcyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZFBvc2l0aXZlSW50ZWdlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi0KLS8qKgotICogVGhpcyB0eXBlIGFkZHMgYW4gImlkIiBhdHRyaWJ1dGUgdG8geHNkOnBvc2l0aXZlSW50ZWdlci4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwLz4KLSAqIDxwPkphdmEgY2xhc3MgZm9yIHhzZFBvc2l0aXZlSW50ZWdlclR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSI+Ci0gKiAgICZsdDtzaW1wbGVDb250ZW50PgotICogICAgICZsdDtleHRlbnNpb24gYmFzZT0iJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hPnBvc2l0aXZlSW50ZWdlciI+Ci0gKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+Ci0gKiAgICAgJmx0Oy9leHRlbnNpb24+Ci0gKiAgICZsdDsvc2ltcGxlQ29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJ4c2RQb3NpdGl2ZUludGVnZXJUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkUG9zaXRpdmVJbnRlZ2VyVHlwZSB7Ci0KLSAgICBAWG1sVmFsdWUKLSAgICBwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIEJpZ0ludGVnZXIgfQotICAgICAqLwotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBCaWdJbnRlZ2VyIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pZCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvWHNkUU5hbWVUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RRTmFtZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZjdlZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RRTmFtZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLnhtbC5oYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIHR5cGUgYWRkcyBhbiAiaWQiIGF0dHJpYnV0ZSB0byB4c2Q6UU5hbWUuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciB4c2RRTmFtZVR5cGUgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0ieHNkUU5hbWVUeXBlIj4KLSAqICAgJmx0O3NpbXBsZUNvbnRlbnQ+Ci0gKiAgICAgJmx0O2V4dGVuc2lvbiBiYXNlPSImbHQ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWE+UU5hbWUiPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvZXh0ZW5zaW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAieHNkUU5hbWVUeXBlIiwgcHJvcE9yZGVyID0gewotICAgICAgICAidmFsdWUiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgWHNkUU5hbWVUeXBlIHsKLQotICAgIEBYbWxWYWx1ZQotICAgIHByb3RlY3RlZCBRTmFtZSB2YWx1ZTsKLSAgICBAWG1sQXR0cmlidXRlCi0gICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQotICAgIEBYbWxJRAotICAgIHByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFFOYW1lIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMge0BsaW5rIFFOYW1lIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShRTmFtZSB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZFN0cmluZ1R5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL1hzZFN0cmluZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyNjg1Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi94bWwvaGFuZGxlci9Yc2RTdHJpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjAtYjUyLWZjcyAKLS8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPiAKLS8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLiAKLS8vIEdlbmVyYXRlZCBvbjogMjAwNy4wMy4yMSBhdCAxMDo1Njo1MSBBTSBDRFQgCi0vLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKLQotCi0vKioKLSAqIFRoaXMgdHlwZSBhZGRzIGFuICJpZCIgYXR0cmlidXRlIHRvIHhzZDpzdHJpbmcuCi0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cC8+Ci0gKiA8cD5KYXZhIGNsYXNzIGZvciB4c2RTdHJpbmdUeXBlIGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9InhzZFN0cmluZ1R5cGUiPgotICogICAmbHQ7c2ltcGxlQ29udGVudD4KLSAqICAgICAmbHQ7ZXh0ZW5zaW9uIGJhc2U9IiZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYT5zdHJpbmciPgotICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgotICogICAgICZsdDsvZXh0ZW5zaW9uPgotICogICAmbHQ7L3NpbXBsZUNvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAieHNkU3RyaW5nVHlwZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIFhzZFN0cmluZ1R5cGUgewotCi0gICAgQFhtbFZhbHVlCi0gICAgcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgdmFsdWU7Ci0gICAgQFhtbEF0dHJpYnV0ZQotICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKLSAgICBAWG1sSUQKLSAgICBwcm90ZWN0ZWQgamF2YS5sYW5nLlN0cmluZyBpZDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgamF2YS5sYW5nLlN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIGphdmEubGFuZy5TdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJZChqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL3htbC9oYW5kbGVyL3BhY2thZ2UtaW5mby5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmM1ZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24veG1sL2hhbmRsZXIvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMC1iNTItZmNzIAotLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+IAotLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuIAotLy8gR2VuZXJhdGVkIG9uOiAyMDA3LjAzLjIxIGF0IDEwOjU2OjUxIEFNIENEVCAKLS8vCi0KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIikKLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlcjsKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvU2VydmVyQ29uZmlndXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL1NlcnZlckNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg1NWQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2ZlYXR1cmUvU2VydmVyQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmU7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZlckNvbmZpZ3VyYXRvciB7DQotICAgIC8qKg0KLSAgICAgKiBQZXJmb3JtIHNlcnZlci1zaWRlIGNvbmZpZ3VyYXRpb24gZm9yIGEgPGNvZGU+V2ViU2VydmljZUZlYXR1cmU8L2NvZGU+Lg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGVuZHBvaW50RGVzY3JpcHRpb24NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb25maWd1cmF0b3Igc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBiaW5kaW5nLg0KLSAgICAgKiANCi0gICAgICogQHBhcmFtIGJpbmRpbmdJZCB0aGUgYmluZGluZyBpZCB0byB0ZXN0DQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmZpZ3VyYXRvciBzdXBwb3J0cyB0aGUgYmluZGluZyBpZCwgPGNvZGU+ZmFsc2U8L2NvZGU+DQotICAgICAqIG90aGVyd2lzZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBiaW5kaW5nSWQpOw0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL1NlcnZlckZyYW1ld29yay5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvZmVhdHVyZS9TZXJ2ZXJGcmFtZXdvcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNWZmMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9mZWF0dXJlL1NlcnZlckZyYW1ld29yay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc3BpLldlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotcHVibGljIGNsYXNzIFNlcnZlckZyYW1ld29yayB7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2ZXJGcmFtZXdvcmsuY2xhc3MpOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbltdIFpFUk9fTEVOR1RIX0FSUkFZID0gbmV3IEFubm90YXRpb25bMF07DQotDQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU2VydmVyQ29uZmlndXJhdG9yPiBjb25maWd1cmF0b3JNYXA7DQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbk1hcDsNCi0gICAgDQotICAgIHB1YmxpYyBTZXJ2ZXJGcmFtZXdvcmsoKSB7DQotICAgIAlzdXBlcigpOw0KLSAgICAgICAgY29uZmlndXJhdG9yTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXJ2ZXJDb25maWd1cmF0b3I+KCk7DQotICAgICAgICBhbm5vdGF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPigpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0b3IoU3RyaW5nIGlkLCBTZXJ2ZXJDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7DQotICAgICAgICBjb25maWd1cmF0b3JNYXAucHV0KGlkLCBjb25maWd1cmF0b3IpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKEFubm90YXRpb24gYW5ub3RhdGlvbikgew0KLSAgICAgICAgaWYgKGFubm90YXRpb24gPT0gbnVsbCkNCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgICAgICANCi0gICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiB3c2ZBbm5vdGF0aW9uID0gZ2V0V2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLSAgICAgICAgDQotICAgICAgICBTdHJpbmcgaWQgPSBudWxsOw0KLSAgICAgICAgaWYgKHdzZkFubm90YXRpb24gIT0gbnVsbCkNCi0gICAgICAgIAlpZCA9IHdzZkFubm90YXRpb24uaWQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRvck1hcC5jb250YWluc0tleShpZCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7DQotICAgICAgICBpZiAoIWlzVmFsaWQoYW5ub3RhdGlvbikpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lg0KLSAgICAgICAgICAgICAgICBtYWtlV2ViU2VydmljZUV4Y2VwdGlvbihNZXNzYWdlcy5nZXRNZXNzYWdlKCJpbnZhbGlkV1NBbm5vdGF0aW9uIiwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi50b1N0cmluZygpKSk7DQotICAgICAgICB9DQotICAgICAgICBXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24gd3NmQW5ub3RhdGlvbiA9IGdldFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgIGFubm90YXRpb25NYXAucHV0KHdzZkFubm90YXRpb24uaWQoKSwgYW5ub3RhdGlvbik7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGlkKSB7DQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbk1hcC5nZXQoaWQpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldEFsbEFubm90YXRpb25zKCkgew0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25NYXAudmFsdWVzKCkudG9BcnJheShaRVJPX0xFTkdUSF9BUlJBWSk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pIHsNCi0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogZ2V0QWxsQW5ub3RhdGlvbnMoKSkgew0KLSAgICAgICAgICAgIFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbiB3c2ZBbm5vdGF0aW9uID0gZ2V0V2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uKGFubm90YXRpb24pOw0KLSAgICAgICAgICAgIFNlcnZlckNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBjb25maWd1cmF0b3JNYXAuZ2V0KHdzZkFubm90YXRpb24uaWQoKSk7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm91bmQgU2VydmVyQ29uZmlndXJhdG9yOiAiICsgY29uZmlndXJhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU3RhcnRpbmcgIiArIGNvbmZpZ3VyYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuY29uZmlndXJlKCkiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY29uZmlndXJhdG9yLmNvbmZpZ3VyZShlbmRwb2ludERlc2NyaXB0aW9uKTsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDb21wbGV0ZWQgIiArIGNvbmZpZ3VyYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSArICIuY29uZmlndXJlKCkiKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHByaXZhdGUgV2ViU2VydmljZUZlYXR1cmVBbm5vdGF0aW9uIGdldFdlYlNlcnZpY2VGZWF0dXJlQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsNCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9va2luZyB1cCBXZWJTZXJ2aWNlRmVhdHVyZSBhbm5vdGF0aW9uIGZvciAiICsgYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0QW5ub3RhdGlvbihXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24uY2xhc3MpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vTWVzc2FnZUJ1bmRsZS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjY3MDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9NZXNzYWdlQnVuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIEFjY2VwdCBwYXJhbWV0ZXJzIGZvciBQcm9qZWN0UmVzb3VyY2VCdW5kbGUsIGJ1dCBkZWZlciBvYmplY3QgaW5zdGFudGlhdGlvbiAoYW5kIHRoZXJlZm9yZQotICogcmVzb3VyY2UgYnVuZGxlIGxvYWRpbmcpIHVudGlsIHJlcXVpcmVkLgotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUJ1bmRsZSB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgX3Jlc291cmNlQnVuZGxlID0gbnVsbDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLSAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlQnVuZGxlIHBhcmVudDsKLQotCi0gICAgcHVibGljIGZpbmFsIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLSAgICAgICAgaWYgKCFsb2FkZWQpIHsKLSAgICAgICAgICAgIF9yZXNvdXJjZUJ1bmRsZSA9IFByb2plY3RSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCk7Ci0gICAgICAgICAgICBsb2FkZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBfcmVzb3VyY2VCdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdCBhIG5ldyBFeHRlbmRNZXNzYWdlcyAqLwotICAgIHB1YmxpYyBNZXNzYWdlQnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHBhcmVudCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgdGhpcy5yZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWU7Ci0gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlOwotICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgKFN0cmluZ1tdKW51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIG5ldyBTdHJpbmdbXSB7IGFyZzAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlIG1lc3NhZ2UgbWF5IGNvbnRhaW4KLSAgICAgKiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4gVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfSA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBuZXcgU3RyaW5nW10geyBhcmcwLCBhcmcxIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDxwPkdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkuIFRoZSBtZXNzYWdlIG1heSBjb250YWluCi0gICAgICogdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBzdWJzdGl0dXRlZCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIFZhcmlhYmxlcyBoYXZlIHRoZSBmb3JtYXQ6PC9wPgotICAgICAqIDxkaXI+IFRoaXMgbWVzc2FnZSBoYXMgdHdvIHZhcmlhYmxlczogezB9IGFuZCB7MX0gPC9kaXI+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tdIHsgYXJnMCwgYXJnMSwgYXJnMiB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIsIFN0cmluZyBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGtleSwgbmV3IFN0cmluZ1tdIHsgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyB9KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezR9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzQpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIG5ldyBTdHJpbmdbXSB7IGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlIG1lc3NhZ2UgbWF5IGNvbnRhaW4KLSAgICAgKiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4gVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfSA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFycmF5IEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcGxhY2UgaW4gY29ycmVzcG9uZGluZyB2YXJpYWJsZXMKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFycmF5KSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1zZyA9IG51bGw7Ci0gICAgICAgIGlmIChnZXRSZXNvdXJjZUJ1bmRsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1zZyA9IGdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobXNnID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHJlc291cmNlIGtleSBcIiIgKyBrZXkgKwotICAgICAgICAgICAgICAgICAgICAiXCIgaW4gYmFzZSBuYW1lICIgKwotICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFJlc291cmNlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFJlc291cmNlTmFtZSgpLCBrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgKE9iamVjdFtdKWFycmF5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL01lc3NhZ2VzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzFiOWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0aGlzQ2xhc3MgPSBNZXNzYWdlcy5jbGFzczsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSA9IE1lc3NhZ2VzQ29uc3RhbnRzLnByb2plY3ROYW1lOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZSA9IE1lc3NhZ2VzQ29uc3RhbnRzLnJlc291cmNlTmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGUgbG9jYWxlID0gTWVzc2FnZXNDb25zdGFudHMubG9jYWxlOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkgPSAiZGVmYXVsdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01FU1NBR0VfQlVORExFID0gIk1lc3NhZ2UgQnVuZGxlIGlzIG5vdCBhdmFpbGFibGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZSh0aGlzQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IHRoaXNDbGFzcy5nZXRDbGFzc0xvYWRlcigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgcGFyZW50ID0KLSAgICAgICAgICAgIChNZXNzYWdlc0NvbnN0YW50cy5yb290UGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VOYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgIDogTWVzc2FnZXNDb25zdGFudHMucm9vdEJ1bmRsZTsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXAgbWVzc2FnZUJ1bmRsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBNZXNzYWdlQnVuZGxlIGRlZmF1bHRNZXNzYWdlQnVuZGxlID0KLSAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsIGNsYXNzTG9hZGVyLCBwYXJlbnQpOwotICAgICAgICBhZGRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZLCBkZWZhdWx0TWVzc2FnZUJ1bmRsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVG8gYWRkIGEgbmV3IE1lc3NhZ2UgQnVuZGxlIHRvIHRoZSBNZXNzYWdlQnVuZGxlIGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZWZlciB0byB0aGlzIG1lc3NhZ2UgYnVuZGxlIGxhdGVyLgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlICAgIFRoZSBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVzc2FnZUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlKSB7Ci0gICAgICAgIG1lc3NhZ2VCdW5kbGVNYXAucHV0KG1lc3NhZ2VCdW5kbGVLZXksIG1lc3NhZ2VCdW5kbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUoREVGQVVMVF9NRVNTQUdFX0JVTkRMRV9LRVkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5ICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEBwYXJhbSBhcmc0IFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7NH0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJnNCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJncyBBbiBhcnJheSBvZiBvYmplY3RzIHRvIHBsYWNlIGluIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzCi0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5LCBhcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKERFRkFVTFRfTUVTU0FHRV9CVU5ETEVfS0VZKTsKLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VCdW5kbGUgZ2V0TWVzc2FnZUJ1bmRsZSgpIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShERUZBVUxUX01FU1NBR0VfQlVORExFX0tFWSk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUJ1bmRsZSBnZXRNZXNzYWdlQnVuZGxlKFN0cmluZyBtZXNzYWdlQnVuZGxlS2V5KSB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IChNZXNzYWdlQnVuZGxlKW1lc3NhZ2VCdW5kbGVNYXAuZ2V0KG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VGcm9tQnVuZGxlKFN0cmluZyBtZXNzYWdlQnVuZGxlS2V5LCBTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUJ1bmRsZSBtZXNzYWdlQnVuZGxlID0gZ2V0TWVzc2FnZUJ1bmRsZShtZXNzYWdlQnVuZGxlS2V5KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VCdW5kbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oTk9fTUVTU0FHRV9CVU5ETEUpOwotCi0gICAgICAgIHJldHVybiBtZXNzYWdlQnVuZGxlLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1bmRsZUtleSBUaGUga2V5IGZvciBnZXR0aW5nIHRoZSBjb3JyZWN0IG1lc3NhZ2UgYnVuZGxlLgotICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzApCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzEpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZSA9IGdldE1lc3NhZ2VCdW5kbGUobWVzc2FnZUJ1bmRsZUtleSk7Ci0gICAgICAgIGlmIChtZXNzYWdlQnVuZGxlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKE5PX01FU1NBR0VfQlVORExFKTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZS5nZXRNZXNzYWdlKGtleSwgYXJnMCwgYXJnMSwgYXJnMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VCdW5kbGVLZXkgVGhlIGtleSBmb3IgZ2V0dGluZyB0aGUgY29ycmVjdCBtZXNzYWdlIGJ1bmRsZS4KLSAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZUZyb21CdW5kbGUoU3RyaW5nIG1lc3NhZ2VCdW5kbGVLZXksIFN0cmluZyBrZXksIFN0cmluZyBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMiwgU3RyaW5nIGFyZzMpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQnVuZGxlS2V5IFRoZSBrZXkgZm9yIGdldHRpbmcgdGhlIGNvcnJlY3QgbWVzc2FnZSBidW5kbGUuCi0gICAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICAgICAgICAgICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczICAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcGFyYW0gYXJnNCAgICAgICAgICAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezR9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlRnJvbUJ1bmRsZShTdHJpbmcgbWVzc2FnZUJ1bmRsZUtleSwgU3RyaW5nIGtleSwgU3RyaW5nIGFyZzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyLCBTdHJpbmcgYXJnMywgU3RyaW5nIGFyZzQpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlQnVuZGxlIG1lc3NhZ2VCdW5kbGUgPSBnZXRNZXNzYWdlQnVuZGxlKG1lc3NhZ2VCdW5kbGVLZXkpOwotICAgICAgICBpZiAobWVzc2FnZUJ1bmRsZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihOT19NRVNTQUdFX0JVTkRMRSk7Ci0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGUuZ2V0TWVzc2FnZShrZXksIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpLmludGVybigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vTWVzc2FnZXNDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjY2RkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL01lc3NhZ2VzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bjsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXNDb25zdGFudHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MiLmludGVybigpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJlc291cmNlTmFtZSA9ICJyZXNvdXJjZSIuaW50ZXJuKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2NhbGUgbG9jYWxlID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJvb3RQYWNrYWdlTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4iLmludGVybigpOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSByb290QnVuZGxlID0KLSAgICAgICAgICAgIFByb2plY3RSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzQ29uc3RhbnRzLmNsYXNzLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9Qcm9qZWN0UmVzb3VyY2VCdW5kbGUuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vUHJvamVjdFJlc291cmNlQnVuZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWVlYjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaTE4bi9Qcm9qZWN0UmVzb3VyY2VCdW5kbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogPHA+V3JhcHBlciBjbGFzcyBmb3IgcmVzb3VyY2UgYnVuZGxlcy4gUHJvcGVydHkgZmlsZXMgYXJlIHVzZWQgdG8gc3RvcmUgcmVzb3VyY2Ugc3RyaW5ncywgd2hpY2gKLSAqIGFyZSB0aGUgb25seSB0eXBlcyBvZiByZXNvdXJjZXMgYXZhaWxhYmxlLiBQcm9wZXJ0eSBmaWxlcyBjYW4gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZmlsZXMKLSAqIHNvIHRoYXQgYSBiYXNlIHByb3BlcnR5IGZpbGUgY2FuIGJlIHVzZWQgYW5kIGEgc21hbGwgbnVtYmVyIG9mIHByb3BlcnRpZXMgY2FuIGJlIG92ZXItcmlkZGVuIGJ5Ci0gKiBhbm90aGVyIHByb3BlcnR5IGZpbGUuIEZvciBleGFtcGxlIHlvdSBtYXkgY3JlYXRlIGFuIGVuZ2xpc2ggdmVyc2lvbiBvZiBhIHJlc291cmNlIGZpbGUgbmFtZWQKLSAqICJyZXNvdXJjZS5wcm9wZXJ0aWVzIi4gWW91IHRoZW4gZGVjaWRlIHRoYXQgdGhlIEJyaXRpc2ggRW5nbGlzaCB2ZXJzaW9uIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcwotICogZXhjZXB0IG9uZSBhcmUgdGhlIHNhbWUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVkZWZpbmUgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIGluCi0gKiAicmVzb3VyY2VfZW5fR0IiLCBqdXN0IHRoZSBvbmUgdGhhdCBpcyBkaWZmZXJlbnQuPC9wPiA8cD5UaGUgYmFzZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gKiBmaWxlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uLjwvcD4gPHA+UHJvcGVydGllcyB3aWxsIGJlIGNhY2hlZCBmb3IgcGVyZm9ybWFuY2UuPHA+Ci0gKiA8cD5Qcm9wZXJ0eSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlcyBjYW4gYWxzbyBjb250YWluIGR5bmFtaWMgdmFyaWFibGVzLiBBbnkgZHluYW1pYwotICogdmFyaWFibGUgZGVmaW5lZCBpbiBQcm9wZXJ0aWVzVXRpbC5nZXRWYXJpYWJsZVZhbHVlKCkgY2FuIGJlIHVzZWQgKHN1Y2ggYXMge2RhdGV9KSwgYXMgd2VsbCBhcwotICogYXJndW1lbnRzIGluIHRoZSBmb3JtIHswfSwgezF9LCBldGMuIEFyZ3VtZW50IHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YXJpb3VzIG92ZXJsb2FkZWQKLSAqIGdldFN0cmluZygpIG1ldGhvZHMuPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFJlc291cmNlQnVuZGxlIGV4dGVuZHMgUmVzb3VyY2VCdW5kbGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhQcm9qZWN0UmVzb3VyY2VCdW5kbGUuY2xhc3MpOwotCi0KLSAgICAvLyBUaGUgc3RhdGljIGNhY2hlIG9mIFJlc291cmNlQnVuZGxlcy4KLSAgICAvLyBUaGUga2V5IGlzIHRoZSAnYmFzZW5hbWUgKyBsb2NhbGUgKyBkZWZhdWx0IGxvY2FsZScKLSAgICAvLyBUaGUgZWxlbWVudCBpcyBhIFJlc291cmNlQnVuZGxlIG9iamVjdAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2h0YWJsZSBidW5kbGVDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvY2FsZSBkZWZhdWx0TG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VOYW1lOwotCi0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGhhbmRsZUdldE9iamVjdChTdHJpbmcga2V5KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKHRoaXMudG9TdHJpbmcoKSArICI6OmhhbmRsZUdldE9iamVjdCgiICsga2V5ICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgb2JqOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb2JqID0gcmVzb3VyY2VCdW5kbGUuZ2V0T2JqZWN0KGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvKiBjYXRjaCBtaXNzaW5nIHJlc291cmNlLCBpZ25vcmUsICYgcmV0dXJuIG51bGwKLSAgICAgICAgICAgICAqIGlmIHRoaXMgbWV0aG9kIGRvZXNuJ3QgcmV0dXJuIG51bGwsIHRoZW4gcGFyZW50cwotICAgICAgICAgICAgICogYXJlIG5vdCBzZWFyY2hlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBvYmogPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYmo7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldEtleXMoKSB7Ci0gICAgICAgIEVudW1lcmF0aW9uIG15S2V5cyA9IHJlc291cmNlQnVuZGxlLmdldEtleXMoKTsKLSAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbXlLZXlzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAgICAgd2hpbGUgKG15S2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHNldC5hZGQobXlLZXlzLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbnVtZXJhdGlvbiBwS2V5cyA9IHBhcmVudC5nZXRLZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAocEtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBzZXQuYWRkKHBLZXlzLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uKCkgewotICAgICAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3IgaXQgPSBzZXQuaXRlcmF0b3IoKTsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0Lmhhc05leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuIEl0IG11c3QgYmUgYSBwcm9wZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHByZWZpeCBvZiB0aGUgY2FsbGVyJ3MgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgIFRoZSBwYWNrYWdlIG5hbWUgdG8gZnVydGhlciBjb25zdHJ1Y3QgdGhlIGJhc2VuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgcHJvamVjdE5hbWUgaXMgbm90IGEgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCdW5kbGUocHJvamVjdE5hbWUsIHBhY2thZ2VOYW1lLCByZXNvdXJjZU5hbWUsIG51bGwsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gd2hpY2ggdGhlIGNsYXNzIGJlbG9uZ3MuIEl0IG11c3QgYmUgYSBwcm9wZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHByZWZpeCBvZiB0aGUgY2FsbGVyJ3MgcGFja2FnZS4KLSAgICAgKiBAcGFyYW0gY2FsbGVyICAgICAgIFRoZSBjYWxsaW5nIGNsYXNzLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgcHJvamVjdE5hbWUgaXMgbm90IGEgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRCdW5kbGUocHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFByb2plY3RSZXNvdXJjZUJ1bmRsZQotICAgICAqCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lICBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgY2xhc3MgYmVsb25ncy4gSXQgbXVzdCBiZSBhIHByb3BlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgVGhlIHBhY2thZ2UgbmFtZSB0byBjb25zdHJ1Y3QgYmFzZSBuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHdpdGhvdXQgdGhlICIucHJvcGVydGllcyIgZXh0ZW5zaW9uCi0gICAgICogQHBhcmFtIGxvY2FsZSAgICAgICBUaGUgbG9jYWxlCi0gICAgICogQHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gaWYgcHJvamVjdE5hbWUgaXMgbm90IGEgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlIG5hbWUsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1bmRsZShwcm9qZWN0TmFtZSwgcGFja2FnZU5hbWUsIHJlc291cmNlTmFtZSwgbG9jYWxlLCBsb2FkZXIsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBjbGFzcyBiZWxvbmdzLiBJdCBtdXN0IGJlIGEgcHJvcGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBjYWxsZXIgICAgICAgIFRoZSBjYWxsaW5nIGNsYXNzLiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgdG8gZnVydGhlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdCB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlci4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lICBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAcGFyYW0gbG9jYWxlICAgICAgICBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGV4dGVuZHNCdW5kbGUgSWYgbm9uLW51bGwsIHRoZW4gdGhpcyBFeHRlbmRNZXNzYWdlcyB3aWxsIGRlZmF1bHQgdG8gZXh0ZW5kc0J1bmRsZS4KLSAgICAgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBpZiBwcm9qZWN0TmFtZSBpcyBub3QgYSBwcmVmaXggb2YgdGhlIGNhbGxlcidzIHBhY2thZ2UgbmFtZSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kL2xvYWRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjYWxsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBsb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIGV4dGVuZHNCdW5kbGUpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldEJ1bmRsZShwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWNrYWdlKGNhbGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHNCdW5kbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZSBjbGFzcyBiZWxvbmdzLiBJdCBtdXN0IGJlIGEgcHJvcGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgcHJlZml4IG9mIHRoZSBjYWxsZXIncyBwYWNrYWdlLgotICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSAgIFRoZSBwYWNrYWdlIG5hbWUgdG8gZnVydGhlciBjb25zdHJ1Y3QgdGhlIGJhc2VuYW1lLgotICAgICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0gZXh0ZW5kc0J1bmRsZSBJZiBub24tbnVsbCwgdGhlbiB0aGlzIEV4dGVuZE1lc3NhZ2VzIHdpbGwgZGVmYXVsdCB0byBleHRlbmRzQnVuZGxlLgotICAgICAqIEB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGlmIHByb2plY3ROYW1lIGlzIG5vdCBhIHByZWZpeCBvZiB0aGUgY2FsbGVyJ3MgcGFja2FnZSBuYW1lLAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQvbG9hZGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBleHRlbmRzQnVuZGxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRCdW5kbGUoIiArIHByb2plY3ROYW1lICsgIiwiCi0gICAgICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgKyByZXNvdXJjZU5hbWUgKyAiLCIKLSAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmcudmFsdWVPZihsb2NhbGUpICsgIiwuLi4pIik7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBuZXcgQ29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnNldExvY2FsZShsb2NhbGUpOwotICAgICAgICBjb250ZXh0LnNldExvYWRlcihsb2FkZXIpOwotICAgICAgICBjb250ZXh0LnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgICAgY29udGV4dC5zZXRSZXNvdXJjZU5hbWUocmVzb3VyY2VOYW1lKTsKLSAgICAgICAgY29udGV4dC5zZXRQYXJlbnRCdW5kbGUoZXh0ZW5kc0J1bmRsZSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWUgPSBjb250ZXh0LnZhbGlkYXRlKHBhY2thZ2VOYW1lKTsKLQotICAgICAgICBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1bmRsZSA9IGdldEJ1bmRsZShjb250ZXh0LCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb246ICIsIGUpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzb3VyY2UgJyIgKwotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArICcuJyArIHJlc291cmNlTmFtZSArICInIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VOYW1lLCAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBidW5kbGUuLi4gLSBjaGVjayBjYWNoZSAtIHRyeSB1cCBoaWVyYXJjaHkgLSBpZiBhdCB0b3Agb2YgaGllcmFyY2h5LCB1c2UgKGxpbmsgdG8pCi0gICAgICogY29udGV4dC5nZXRQYXJlbnRCdW5kbGUoKQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjYWNoZUtleSA9IGNvbnRleHQuZ2V0Q2FjaGVLZXkocGFja2FnZU5hbWUpOwotCi0gICAgICAgIFByb2plY3RSZXNvdXJjZUJ1bmRsZSBwcmIgPSAoUHJvamVjdFJlc291cmNlQnVuZGxlKWJ1bmRsZUNhY2hlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKHByYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhY2thZ2VOYW1lICsgJy4nICsgY29udGV4dC5nZXRSZXNvdXJjZU5hbWUoKTsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gY29udGV4dC5sb2FkQnVuZGxlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHBhcmVudCA9IGNvbnRleHQuZ2V0UGFyZW50QnVuZGxlKHBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgaWYgKHJiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmIgPSBuZXcgUHJvamVjdFJlc291cmNlQnVuZGxlKG5hbWUsIHJiKTsKLSAgICAgICAgICAgICAgICBwcmIuc2V0UGFyZW50KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ3JlYXRlZCAiICsgcHJiICsgIiwgbGlua2VkIHRvIHBhcmVudCAiICsgU3RyaW5nLnZhbHVlT2YocGFyZW50KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZUJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJiID0gKFByb2plY3RSZXNvdXJjZUJ1bmRsZSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmIgPSBuZXcgUHJvamVjdFJlc291cmNlQnVuZGxlKG5hbWUsIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJvb3QgcGFja2FnZSBub3QgZm91bmQsIGNyb3NzIGxpbmsgdG8gIiArIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgICAgIGJ1bmRsZUNhY2hlLnB1dChjYWNoZUtleSwgcHJiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcmI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkuaW50ZXJuKCk7Ci0gICAgfQotCi0gICAgLyoqIENvbnN0cnVjdCBhIG5ldyBQcm9qZWN0UmVzb3VyY2VCdW5kbGUgKi8KLSAgICBwcml2YXRlIFByb2plY3RSZXNvdXJjZUJ1bmRsZShTdHJpbmcgbmFtZSwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIHRoaXMucmVzb3VyY2VOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogQ2xlYXJzIHRoZSBpbnRlcm5hbCBjYWNoZSAqLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0vLyAgICAgICAgYnVuZGxlQ2FjaGUuY2xlYXIoKTsKLS8vICAgIH0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VOYW1lOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGV4dCB7Ci0gICAgICAgIHByaXZhdGUgTG9jYWxlIF9sb2NhbGU7Ci0gICAgICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgX2xvYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3ROYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBfcmVzb3VyY2VOYW1lOwotICAgICAgICBwcml2YXRlIFJlc291cmNlQnVuZGxlIF9wYXJlbnQ7Ci0KLSAgICAgICAgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGwpIHsKLSAgICAgICAgICAgIC8qIDEuIERvY3MgaW5kaWNhdGUgdGhhdCBpZiBsb2NhbGUgaXMgbm90IHNwZWNpZmllZCwKLSAgICAgICAgICAgICAqICAgIHRoZW4gdGhlIGRlZmF1bHQgbG9jYWwgaXMgdXNlZCBpbiBpdCdzIHBsYWNlLgotICAgICAgICAgICAgICogMi4gQSBudWxsIHZhbHVlIGZvciBsb2NhbGUgaXMgaW52YWxpZC4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogVGhlcmVmb3JlLCBkZWZhdWx0Li4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIF9sb2NhbGUgPSAobCA9PSBudWxsKSA/IGRlZmF1bHRMb2NhbGUgOiBsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRMb2FkZXIoQ2xhc3NMb2FkZXIgbCkgewotICAgICAgICAgICAgX2xvYWRlciA9IChsICE9IG51bGwpID8gbCA6IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgLy8gU1RBUlQgRklYOiBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE2ODY4Ci0gICAgICAgICAgICBpZiAoX2xvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgX2xvYWRlciA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFTkQgRklYOiBodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE2ODY4Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBfcHJvamVjdE5hbWUgPSBuYW1lLmludGVybigpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRSZXNvdXJjZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIF9yZXNvdXJjZU5hbWUgPSBuYW1lLmludGVybigpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRQYXJlbnRCdW5kbGUoUmVzb3VyY2VCdW5kbGUgYikgewotICAgICAgICAgICAgX3BhcmVudCA9IGI7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2NhbGUgZ2V0TG9jYWxlKCkgewotICAgICAgICAgICAgcmV0dXJuIF9sb2NhbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2xvYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJvamVjdE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0UmVzb3VyY2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIF9yZXNvdXJjZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZUJ1bmRsZSBnZXRQYXJlbnRCdW5kbGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3BhcmVudDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXRDYWNoZUtleShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2FkZXJOYW1lID0gKF9sb2FkZXIgPT0gbnVsbCkgPyAiIiA6ICgiOiIgKyBfbG9hZGVyLmhhc2hDb2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lICsgIi4iICsgX3Jlc291cmNlTmFtZSArICI6IiArIF9sb2NhbGUgKyAiOiIgKyBkZWZhdWx0TG9jYWxlICsKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGxvYWRCdW5kbGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocGFja2FnZU5hbWUgKyAnLicgKyBfcmVzb3VyY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb2FkZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgc3VycHJlc3NpbmcgcHJpbnQgc3RhY2suLiBqdXN0IHRoZSBzdHJpbmcgZm9yIGluZm8uCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJsb2FkQnVuZGxlOiBJZ25vcmluZyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFJlc291cmNlQnVuZGxlIGdldFBhcmVudEJ1bmRsZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHA7Ci0gICAgICAgICAgICBpZiAoIXBhY2thZ2VOYW1lLmVxdWFscyhfcHJvamVjdE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcCA9IGdldEJ1bmRsZSh0aGlzLCBnZXRQYWNrYWdlKHBhY2thZ2VOYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHAgPSBfcGFyZW50OwotICAgICAgICAgICAgICAgIF9wYXJlbnQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKF9wcm9qZWN0TmFtZSA9PSBudWxsIHx8IF9wcm9qZWN0TmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm9qZWN0IG5hbWUgbm90IHNwZWNpZmllZCIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIlByb2plY3QgbmFtZSBub3Qgc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhY2thZ2UgbmFtZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiUGFja2FnZSBub3Qgc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCAiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lLmludGVybigpOwotCi0gICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCBwcm9qZWN0IGlzIGEgcHJvcGVyIHByZWZpeCBvZiBjbGFzcy4KLSAgICAgICAgICAgICogVGVybWluYXRlIHByb2plY3QgbmFtZSB3aXRoICcuJyB0byBlbnN1cmUgcHJvcGVyIG1hdGNoLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghcGFja2FnZU5hbWUuZXF1YWxzKF9wcm9qZWN0TmFtZSkgJiYgIXBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoX3Byb2plY3ROYW1lICsgJy4nKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHJvamVjdCBub3QgYSBwcmVmaXggb2YgUGFja2FnZSIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIlByb2plY3QgJyIgKyBfcHJvamVjdE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIicgbXVzdCBiZSBhIHByZWZpeCBvZiBQYWNrYWdlICciCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lICsgIiciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKyAnLicgKyBfcmVzb3VyY2VOYW1lLCAiIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vUkIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vUkIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNmNkOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL1JCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG47Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIENVUlJFTlRMWSBOT1QgVVNFRCBLRUVQSU5HIEZPUiBSRUZFUkVOQ0UgIDkvMTkvMjAwMgotICogPHAvPgotICogPHA+V3JhcHBlciBjbGFzcyBmb3IgcmVzb3VyY2UgYnVuZGxlcy4gUHJvcGVydHkgZmlsZXMgYXJlIHVzZWQgdG8gc3RvcmUgcmVzb3VyY2Ugc3RyaW5ncywgd2hpY2gKLSAqIGFyZSB0aGUgb25seSB0eXBlcyBvZiByZXNvdXJjZXMgYXZhaWxhYmxlLiBQcm9wZXJ0eSBmaWxlcyBjYW4gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZmlsZXMKLSAqIHNvIHRoYXQgYSBiYXNlIHByb3BlcnR5IGZpbGUgY2FuIGJlIHVzZWQgYW5kIGEgc21hbGwgbnVtYmVyIG9mIHByb3BlcnRpZXMgY2FuIGJlIG92ZXItcmlkZGVuIGJ5Ci0gKiBhbm90aGVyIHByb3BlcnR5IGZpbGUuIEZvciBleGFtcGxlIHlvdSBtYXkgY3JlYXRlIGFuIGVuZ2xpc2ggdmVyc2lvbiBvZiBhIHJlc291cmNlIGZpbGUgbmFtZWQKLSAqICJyZXNvdXJjZS5wcm9wZXJ0aWVzIi4gWW91IHRoZW4gZGVjaWRlIHRoYXQgdGhlIEJyaXRpc2ggRW5nbGlzaCB2ZXJzaW9uIG9mIGFsbCBvZiB0aGUgcHJvcGVydGllcwotICogZXhjZXB0IG9uZSBhcmUgdGhlIHNhbWUsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVkZWZpbmUgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIGluCi0gKiAicmVzb3VyY2VfZW5fR0IiLCBqdXN0IHRoZSBvbmUgdGhhdCBpcyBkaWZmZXJlbnQuPC9wPiA8cD5UaGUgcHJvcGVydHkgZmlsZSBsb29rdXAgc2VhcmNoZXMgZm9yCi0gKiBjbGFzc2VzIHdpdGggdmFyaW91cyBzdWZmaXhlcyBvbiB0aGUgYmFzaXMgaWYgdGhlIGRlc2lyZWQgbG9jYWwgYW5kIHRoZSBjdXJyZW50IGRlZmF1bHQgbG9jYWwgKGFzCi0gKiByZXR1cm5lZCBieSBMb2NhbC5nZXREZWZhdWx0KCkpLiBBcyBwcm9wZXJ0eSBmaWxlcyBhcmUgZm91bmQgdGhlIHByb3BlcnR5IHZhbHVlcyBhcmUgbWVyZ2VkIHNvCi0gKiB0aGF0IGluaGVyaXRhbmNlIGlzIHByZXNlcnZlZC48L3A+IDxwPlRoZSBvcmRlciBvZiBzZWFyY2hpbmcgaXM6PC9wPiA8ZGlyPiBiYXNlbmFtZSArICJfIiArCi0gKiBsYW5nYWdlICsgIl8iICsgY291bnRyeSArICJfIiArIHZhcmlhbnQgYmFzZW5hbWUgKyAiXyIgKyBsYW5nYWdlICsgIl8iICsgY291bnRyeSBiYXNlbmFtZSArICJfIiArCi0gKiBsYW5nYWdlIGJhc2VuYW1lICsgIl8iICsgZGVmYXVsdExhbmd1YWdlICsgIl8iICsgZGVmYXVsdENvdW50cnkgKyAiXyIgKyBkZWZhdWx0VmFyaWFudCBiYXNlbmFtZSArCi0gKiAiXyIgKyBkZWZhdWx0TGFuZ3VhZ2UgKyAiXyIgKyBkZWZhdWx0Q291bnRyeSBiYXNlbmFtZSArICJfIiArIGRlZmF1bHRMYW5ndWFnZSBiYXNlbmFtZSA8L2Rpcj4KLSAqIDxwPlRoZSBiYXNlbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbi48L3A+Ci0gKiA8cD5Qcm9wZXJ0aWVzIHdpbGwgYmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS48cD4gPHA+UHJvcGVydHkgdmFsdWVzIHN0b3JlZCBpbiB0aGUgcHJvcGVydHkgZmlsZXMKLSAqIGNhbiBhbHNvIGNvbnRhaW4gZHluYW1pYyB2YXJpYWJsZXMuIEFueSBkeW5hbWljIHZhcmlhYmxlIGRlZmluZWQgaW4KLSAqIFByb3BlcnRpZXNVdGlsLmdldFZhcmlhYmxlVmFsdWUoKSBjYW4gYmUgdXNlZCAoc3VjaCBhcyB7ZGF0ZX0pLCBhcyB3ZWxsIGFzIGFyZ3VtZW50cyBpbiB0aGUgZm9ybQotICogezB9LCB7MX0sIGV0Yy4gQXJndW1lbnQgdmFsdWVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcmxvYWRlZCBnZXRTdHJpbmcoKSBtZXRob2RzLjwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJCIHsKLSAgICAvLyBUaGUgc3RhdGljIGNhY2hlIG9mIHByb3BlcnRpZXMuIFRoZSBrZXkgaXMgdGhlIGJhc2VuYW1lICsgdGhlIGxvY2FsICsKLSAgICAvLyB0aGUgZGVmYXVsdCBsb2NhbCBhbmQgdGhlIGVsZW1lbnQgaXMgdGhlIFByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcKLSAgICAvLyB0aGUgcmVzb3VyY2VzCi0gICAgc3RhdGljIEhhc2h0YWJsZSBwcm9wZXJ0eUNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLy8gVGhlIGRlZmF1bHQgYmFzZSBuYW1lCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9OQU1FID0gInJlc291cmNlIjsKLQotICAgIC8vIFRoZSBwcm9wZXJ0eSBmaWxlIGV4dGVuc2lvbgotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VYVCA9ICIucHJvcGVydGllcyI7Ci0KLSAgICAvLyBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBiYXNlIHByb3BlcnR5IGZpbGUgKHdpdGggZXh0ZW5zaW9uKQotICAgIHByb3RlY3RlZCBTdHJpbmcgYmFzZVByb3BlcnR5RmlsZU5hbWU7Ci0KLSAgICAvLyBUaGUgcHJvcGVydGllcyBmb3IgdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlCi0gICAgcHJvdGVjdGVkIFByb3BlcnRpZXMgcmVzb3VyY2VQcm9wZXJ0aWVzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSB3aXRob3V0IHRoZSAiLnByb3BlcnRpZXMiIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBSQihTdHJpbmcgbmFtZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMobnVsbCwgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIHRvIGZ1cnRoZXIgY29uc3RydWN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlcgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgUkIoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICB0aGlzKGNhbGxlciwgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IFJCCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdC4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIHRvIGZ1cnRoZXIgY29uc3RydWN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgYmFzZW5hbWUgYXMgd2VsbCBhcyB0byBnZXQgdGhlIHByb3BlciBDbGFzc0xvYWRlcgotICAgICAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgd2l0aG91dCB0aGUgIi5wcm9wZXJ0aWVzIiBleHRlbnNpb24KLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgUkIoT2JqZWN0IGNhbGxlciwgU3RyaW5nIG5hbWUsIExvY2FsZSBsb2NhbGUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKGNhbGxlciAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIENsYXNzIGM7Ci0gICAgICAgICAgICBpZiAoY2FsbGVyIGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICBjID0gKENsYXNzKWNhbGxlcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYyA9IGNhbGxlci5nZXRDbGFzcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGxvYWRlcgotICAgICAgICAgICAgY2wgPSBjLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoIi8iKSA9PSAtMSkgewotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmdWxsIGJhc2VuYW1lIG9ubHkgaWYgbm90IGdpdmVuCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcG9zID0gZnVsbE5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gZnVsbE5hbWUuc3Vic3RyaW5nKDAsIHBvcyArIDEpLnJlcGxhY2UoJy4nLCAnLycpICsgbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUcnkgdGhlIHNoYXJlZCBkZWZhdWx0IHByb3BlcnRpZXMgZmlsZS4uLgotICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZigiLyIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9ICJvcmcvYXBhY2hlL2F4aXMyL2RlZmF1bHQtcmVzb3VyY2UiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCi0gICAgICAgIC8vIElmIHRoZSBsb2NhbGUgZ2l2ZW4gaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQgbG9jYWxlLCBpZ25vcmUgaXQKLSAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9jYWxlLmVxdWFscyhkZWZhdWx0TG9jYWxlKSkgewotICAgICAgICAgICAgICAgIGxvY2FsZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBMb2FkIHRoZSBwcm9wZXJ0aWVzLiBJZiBubyBwcm9wZXJ0eSBmaWxlcyBleGlzdCB0aGVuIGEKLSAgICAgICAgLy8gTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0gICAgICAgIGxvYWRQcm9wZXJ0aWVzKG5hbWUsIGNsLCBsb2NhbGUsIGRlZmF1bHRMb2NhbGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBzdHJpbmcgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBnaXZlbiBrZXkKLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXksIChPYmplY3RbXSludWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IGFyZzApIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzJdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmcoa2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8cD5HZXRzIGEgc3RyaW5nIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgZ2l2ZW4ga2V5LiBUaGUgbWVzc2FnZSBtYXkgY29udGFpbgotICAgICAqIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiBWYXJpYWJsZXMgaGF2ZSB0aGUgZm9ybWF0OjwvcD4KLSAgICAgKiA8ZGlyPiBUaGlzIG1lc3NhZ2UgaGFzIHR3byB2YXJpYWJsZXM6IHswfSBhbmQgezF9IDwvZGlyPgotICAgICAqCi0gICAgICogQHBhcmFtIGtleSAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+R2V0cyBhIHN0cmluZyBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhlIG1lc3NhZ2UgbWF5IGNvbnRhaW4KLSAgICAgKiB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHN1YnN0aXR1dGVkIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gVmFyaWFibGVzIGhhdmUgdGhlIGZvcm1hdDo8L3A+Ci0gICAgICogPGRpcj4gVGhpcyBtZXNzYWdlIGhhcyB0d28gdmFyaWFibGVzOiB7MH0gYW5kIHsxfSA8L2Rpcj4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFycmF5IEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcGxhY2UgaW4gY29ycmVzcG9uZGluZyB2YXJpYWJsZXMKLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJyYXkpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgaWYgKHJlc291cmNlUHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtc2cgPSByZXNvdXJjZVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2cgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcmVzb3VyY2Uga2V5IFwiIiArIGtleSArCi0gICAgICAgICAgICAgICAgICAgICJcIiBpbiBiYXNlIG5hbWUgIiArIGJhc2VQcm9wZXJ0eUZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHJvcGVydHlGaWxlTmFtZSwga2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgYXJyYXkpOwotICAgICAgICByZXR1cm4gbXNnOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRQcm9wZXJ0aWVzKFN0cmluZyBiYXNlbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBMb2NhbGUgbG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSBkZWZhdWx0TG9jYWxlKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBjYWNoZSBmaXJzdAotICAgICAgICBTdHJpbmcgbG9hZGVyTmFtZSA9ICIiOwotICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvYWRlck5hbWUgPSAiOiIgKyBsb2FkZXIuaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSBiYXNlbmFtZSArICI6IiArIGxvY2FsZSArICI6IiArIGRlZmF1bHRMb2NhbGUgKyBsb2FkZXJOYW1lOwotICAgICAgICBQcm9wZXJ0aWVzIHAgPSAoUHJvcGVydGllcylwcm9wZXJ0eUNhY2hlLmdldChjYWNoZUtleSk7Ci0gICAgICAgIGJhc2VQcm9wZXJ0eUZpbGVOYW1lID0gYmFzZW5hbWUgKyBQUk9QRVJUWV9FWFQ7Ci0KLSAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhlIHByb3BlcnRpZXMgd2VyZSBub3QgZm91bmQgaW4gdGhlIGNhY2hlLiBTZWFyY2ggdGhlIGdpdmVuIGxvY2FsZQotICAgICAgICAgICAgLy8gZmlyc3QKLSAgICAgICAgICAgIGlmIChsb2NhbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHAgPSBsb2FkUHJvcGVydGllcyhiYXNlbmFtZSwgbG9hZGVyLCBsb2NhbGUsIHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWFyY2ggdGhlIGRlZmF1bHQgbG9jYWxlCi0gICAgICAgICAgICBpZiAoZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcCA9IGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lLCBsb2FkZXIsIGRlZmF1bHRMb2NhbGUsIHApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBiYXNlbmFtZQotICAgICAgICAgICAgcCA9IG1lcmdlKHAsIGxvYWRQcm9wZXJ0aWVzKGJhc2VQcm9wZXJ0eUZpbGVOYW1lLCBsb2FkZXIpKTsKLQotICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHJlc291cmNlIGZvciBiYXNlIG5hbWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlUHJvcGVydHlGaWxlTmFtZSwgYmFzZVByb3BlcnR5RmlsZU5hbWUsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgICAgIHByb3BlcnR5Q2FjaGUucHV0KGNhY2hlS2V5LCBwKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzb3VyY2VQcm9wZXJ0aWVzID0gcDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhTdHJpbmcgYmFzZW5hbWUsIENsYXNzTG9hZGVyIGxvYWRlciwgTG9jYWxlIGxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0KLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0gICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLSAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpOwotICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmFyaWFudC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IG1lcmdlKHByb3BzLCBsb2FkUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSArICJfIiArIGxhbmd1YWdlICsgIl8iICsgY291bnRyeSArICJfIiArIHZhcmlhbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfRVhULCBsb2FkZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBtZXJnZShwcm9wcywgbG9hZFByb3BlcnRpZXMoYmFzZW5hbWUgKyAiXyIgKyBsYW5ndWFnZSArICJfIiArIGNvdW50cnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfRVhULCBsb2FkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3BzID0gbWVyZ2UocHJvcHMsIGxvYWRQcm9wZXJ0aWVzKGJhc2VuYW1lICsgIl8iICsgbGFuZ3VhZ2UgKyBQUk9QRVJUWV9FWFQsIGxvYWRlcikpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhTdHJpbmcgcmVzbmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBudWxsOwotCi0gICAgICAgIC8vIEF0dGVtcHQgdG8gb3BlbiBhbmQgbG9hZCB0aGUgcHJvcGVydGllcwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc25hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFaXRoZXIgd2UncmUgdXNpbmcgdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgb3Igd2UgZGlkbid0IGZpbmQgdGhlCi0gICAgICAgICAgICAvLyByZXNvdXJjZSB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyCi0gICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShyZXNuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9uIGVycm9yLCBjbGVhciB0aGUgcHJvcHMKLSAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yIG9uIGNsb3NlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9wczsKLSAgICB9Ci0KLSAgICAvKiogTWVyZ2UgdHdvIFByb3BlcnRpZXMgb2JqZWN0cyAqLwotICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIG1lcmdlKFByb3BlcnRpZXMgcDEsIFByb3BlcnRpZXMgcDIpIHsKLSAgICAgICAgaWYgKChwMSA9PSBudWxsKSAmJgotICAgICAgICAgICAgICAgIChwMiA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocDEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHAyOwotICAgICAgICB9IGVsc2UgaWYgKHAyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdyBtZXJnZS4gcDEgdGFrZXMgcHJlY2VkZW5jZQotICAgICAgICBFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHAyLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZyllbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHAxLmdldFByb3BlcnR5KGtleSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHAxLnB1dChrZXksIHAyLmdldFByb3BlcnR5KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHAxOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHVuZGVybHlpbmcgcHJvcGVydGllcyAqLwotICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZVByb3BlcnRpZXM7Ci0gICAgfQotCi0gICAgLy8gU1RBVElDIEFDQ0VTU09SUwotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIFN0cmluZyBrZXkpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzFdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFsyXTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIG9bMV0gPSBhcmcxOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbnVsbCwga2V5LCBvKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFszXTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIG9bMV0gPSBhcmcxOwotICAgICAgICBvWzJdID0gYXJnMjsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmczKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzRdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgbyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHBhcmFtIGFyZzAgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezB9Ci0gICAgICogQHBhcmFtIGFyZzEgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezF9Ci0gICAgICogQHBhcmFtIGFyZzIgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezJ9Ci0gICAgICogQHBhcmFtIGFyZzMgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezN9Ci0gICAgICogQHBhcmFtIGFyZzQgICBUaGUgYXJndW1lbnQgdG8gcGxhY2UgaW4gdmFyaWFibGUgezR9Ci0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzMsIE9iamVjdCBhcmc0KQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzVdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICBvWzNdID0gYXJnMzsKLSAgICAgICAgb1s0XSA9IGFyZzQ7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBudWxsLCBrZXksIG8pOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmdzICAgQW4gYXJyYXkgb2Ygb2JqZWN0cyB0byBwbGFjZSBpbiBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcwotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpCi0gICAgICAgICAgICB0aHJvd3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoY2FsbGVyLCBCQVNFX05BTUUsIG51bGwsIGtleSwgYXJncyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gcmVzb3VyY2UucHJvcGVydGllcyBmcm9tIHRoZSBwYWNrYWdlIG9mIHRoZSBnaXZlbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBjYWxsaW5nIG9iamVjdCwgdXNlZCB0byBnZXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgY2xhc3MgbG9hZGVyCi0gICAgICogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlCi0gICAgICogQHBhcmFtIGtleSAgICBUaGUgcmVzb3VyY2Uga2V5Ci0gICAgICogQHJldHVybiBUaGUgZm9ybWF0dGVkIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IGNhbGxlciwgTG9jYWxlIGxvY2FsZSwgU3RyaW5nIGtleSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbG9jYWxlLCBrZXksIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEByZXR1cm4gVGhlIGZvcm1hdHRlZCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFsyXTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIG9bMV0gPSBhcmcxOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbG9jYWxlLCBrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdFtdIG8gPSBuZXcgT2JqZWN0WzNdOwotICAgICAgICBvWzBdID0gYXJnMDsKLSAgICAgICAgb1sxXSA9IGFyZzE7Ci0gICAgICAgIG9bMl0gPSBhcmcyOwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbG9jYWxlLCBrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJnMCAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MH0KLSAgICAgKiBAcGFyYW0gYXJnMSAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7MX0KLSAgICAgKiBAcGFyYW0gYXJnMiAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7Mn0KLSAgICAgKiBAcGFyYW0gYXJnMyAgIFRoZSBhcmd1bWVudCB0byBwbGFjZSBpbiB2YXJpYWJsZSB7M30KLSAgICAgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5LCBPYmplY3QgYXJnMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyLCBPYmplY3QgYXJnMykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFs0XTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIG9bMV0gPSBhcmcxOwotICAgICAgICBvWzJdID0gYXJnMjsKLSAgICAgICAgb1szXSA9IGFyZzM7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgbyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHJlc291cmNlLnByb3BlcnRpZXMgZnJvbSB0aGUgcGFja2FnZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxlciBUaGUgY2FsbGluZyBvYmplY3QsIHVzZWQgdG8gZ2V0IHRoZSBwYWNrYWdlIG5hbWUgYW5kIGNsYXNzIGxvYWRlcgotICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZQotICAgICAqIEBwYXJhbSBrZXkgICAgVGhlIHJlc291cmNlIGtleQotICAgICAqIEBwYXJhbSBhcmcwICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHswfQotICAgICAqIEBwYXJhbSBhcmcxICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsxfQotICAgICAqIEBwYXJhbSBhcmcyICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHsyfQotICAgICAqIEBwYXJhbSBhcmczICAgVGhlIGFyZ3VtZW50IHRvIHBsYWNlIGluIHZhcmlhYmxlIHszfQotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBjYWxsZXIsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBrZXksIE9iamVjdCBhcmcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIsIE9iamVjdCBhcmczLCBPYmplY3QgYXJnNCkKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBPYmplY3RbXSBvID0gbmV3IE9iamVjdFs1XTsKLSAgICAgICAgb1swXSA9IGFyZzA7Ci0gICAgICAgIG9bMV0gPSBhcmcxOwotICAgICAgICBvWzJdID0gYXJnMjsKLSAgICAgICAgb1szXSA9IGFyZzM7Ci0gICAgICAgIG9bNF0gPSBhcmc0OwotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZShjYWxsZXIsIEJBU0VfTkFNRSwgbG9jYWxlLCBrZXksIG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhIG1lc3NhZ2UgZnJvbSByZXNvdXJjZS5wcm9wZXJ0aWVzIGZyb20gdGhlIHBhY2thZ2Ugb2YgdGhlIGdpdmVuIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsZXIgVGhlIGNhbGxpbmcgb2JqZWN0LCB1c2VkIHRvIGdldCB0aGUgcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBsb2FkZXIKLSAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUKLSAgICAgKiBAcGFyYW0ga2V5ICAgIFRoZSByZXNvdXJjZSBrZXkKLSAgICAgKiBAcGFyYW0gYXJncyAgIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gcGxhY2UgaW4gY29ycmVzcG9uZGluZyB2YXJpYWJsZXMKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZvcm1hdHRlZCBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhPYmplY3QgY2FsbGVyLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKQotICAgICAgICAgICAgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKGNhbGxlciwgQkFTRV9OQU1FLCBsb2NhbGUsIGtleSwgYXJncyk7Ci0gICAgfQotCi0gICAgLy8gV29ya2hvcnNlIHRoYXQgZG9lcyB0aGUgcmVzb3VyY2UgbG9hZGluZyBhbmQga2V5IGxvb2t1cAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoT2JqZWN0IGNhbGxlciwgU3RyaW5nIGJhc2VuYW1lLCBMb2NhbGUgbG9jYWxlLCBTdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGZpcnN0RXggPSBudWxsOwotICAgICAgICBTdHJpbmcgZnVsbE5hbWUgPSBudWxsOwotICAgICAgICBDbGFzcyBjdXJDbGFzcyA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gZGlkTnVsbCA9IGZhbHNlOwotCi0gICAgICAgIGlmIChjYWxsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNhbGxlciBpbnN0YW5jZW9mIENsYXNzKQotICAgICAgICAgICAgICAgIGN1ckNsYXNzID0gKENsYXNzKWNhbGxlcjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjdXJDbGFzcyA9IGNhbGxlci5nZXRDbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG1zZyA9PSBudWxsKSB7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgZnVsbCBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgaWYgKGN1ckNsYXNzICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgZnVsbCBiYXNlbmFtZQotICAgICAgICAgICAgICAgIFN0cmluZyBwa2dOYW1lID0gY3VyQ2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvcyA9IHBrZ05hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZSA9IHBrZ05hbWUuc3Vic3RyaW5nKDAsIHBvcyArIDEpLnJlcGxhY2UoJy4nLCAnLycpICsgYmFzZW5hbWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnVsbE5hbWUgPSBiYXNlbmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZ1bGxOYW1lID0gYmFzZW5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUkIgcmIgPSBuZXcgUkIoY2FsbGVyLCBmdWxsTmFtZSwgbG9jYWxlKTsKLSAgICAgICAgICAgICAgICBtc2cgPSByYi5nZXRTdHJpbmcoa2V5LCBhcmdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChjdXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGZpcnN0IGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGlmIChmaXJzdEV4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3RFeCA9IGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc3VwZXJjbGFzcwotICAgICAgICAgICAgICAgIGN1ckNsYXNzID0gY3VyQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAgICAgICAgIGlmIChjdXJDbGFzcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWROdWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmlyc3RFeDsKLSAgICAgICAgICAgICAgICAgICAgZGlkTnVsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY3VyQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY25hbWUuc3RhcnRzV2l0aCgiamF2YS4iKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lLnN0YXJ0c1dpdGgoImphdmF4LiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlkTnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBmaXJzdEV4OwotICAgICAgICAgICAgICAgICAgICAgICAgZGlkTnVsbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2xhc3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0KLSAgICAvKiogQ2xlYXJzIHRoZSBpbnRlcm5hbCBjYWNoZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLSAgICAgICAgcHJvcGVydHlDYWNoZS5jbGVhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2kxOG4vcmVzb3VyY2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNmMwOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pMThuL3Jlc291cmNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0KLSMgVHJhbnNsYXRpb24gaW5zdHJ1Y3Rpb25zLgotIyAxLiAgRWFjaCBtZXNzYWdlIGxpbmUgaXMgb2YgdGhlIGZvcm0ga2V5PXZhbHVlLgotIyAgICAgVHJhbnNsYXRlIHRoZSB2YWx1ZSwgRE8gTk9UIHRyYW5zbGF0ZSB0aGUga2V5LgotIyAyLiAgVGhlIG1lc3NhZ2VzIG1heSBjb250YWluIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgZmlsbGVkIGluCi0jICAgICBieSB0aGUgcnVudGltZS4gIFRoZXNlIGFyZSBvZiB0aGUgZm9ybTogezB9LCB7MX0sIGV0Yy4KLSMgICAgIFRoZXNlIG11c3QgYXBwZWFyIGFzIGlzIGluIHRoZSBtZXNzYWdlLCB0aG91Z2ggdGhlIG9yZGVyCi0jICAgICBtYXkgYmUgY2hhbmdlZCB0byBzdXBwb3J0IHByb3BlciBsYW5ndWFnZSBzeW50YXguCi0jIDMuICBJZiBhIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXIgaXMgdG8gYXBwZWFyIGluIHRoZSByZXN1bHRpbmcKLSMgICAgIG1lc3NhZ2UsIGl0IG11c3QgYXBwZWFyIGluIHRoaXMgZmlsZSBhcyB0d28gY29uc2VjdXRpdmUKLSMgICAgIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzLgotIyA0LiAgTGluZXMgYmVnaW5uaW5nIHdpdGggIiMiIChsaWtlIHRoaXMgb25lKSBhcmUgY29tbWVudCBsaW5lcwotIyAgICAgYW5kIG1heSBjb250YWluIHRyYW5zbGF0aW9uIGluc3RydWN0aW9ucy4gIFRoZXkgbmVlZCBub3QgYmUKLSMgICAgIHRyYW5zbGF0ZWQgdW5sZXNzIHlvdXIgdHJhbnNsYXRlZCBmaWxlLCByYXRoZXIgdGhhbiB0aGlzIGZpbGUsCi0jICAgICB3aWxsIHNlcnZlIGFzIGEgYmFzZSBmb3Igb3RoZXIgdHJhbnNsYXRvcnMuCi0jCi0jIERvIG5vdCByZW1vdmUgdGhlIGZvbGxvd2luZyBjb21tZW50IGxpbmUuIEl0IGlzIGEgdmFyaWFibGUgdXNlZCBieSBhIHRyYW5zbGF0aW9uIHRvb2wuCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBETyBOT1QgVE9VQ0ggVEhFU0UgUFJPUEVSVElFUyAtIFRIRVkgQVJFIEFVVE9NQVRJQ0FMTFkgVVBEQVRFRCBCWSBUSEUgQlVJTEQKLSMgUFJPQ0VTUy4KLWF4aXNWZXJzaW9uPUFwYWNoZSBBeGlzMiB2ZXJzaW9uOiAjYXhpc1ZlcnNpb24jCi1heGlzVmVyc2lvblJhdz0jYXhpc1ZlcnNpb24jCi1heGlzQnVpbHRPblJhdz0jdG9kYXkjCi1heGlzVXNlckFnZW50PUF4aXMvI2F4aXNWZXJzaW9uIwotYnVpbHRPbj1CdWlsdCBvbiAjdG9kYXkjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotdGVzdDAxPVRoaXMgc3RyaW5nIGlzIGEgdGVzdCBzdHJpbmcgMDEuCi1mYXVsdFByb2Nlc3NpbmdOb3RTdXBwb3J0ZWQ9VXNlciBmYXVsdCBwcm9jZXNzaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBAV2ViRmF1bHQgZmF1bHRiZWFuIGlzIG1pc3NpbmcgZm9yIHswfQotZXhjZXB0aW9uRHVyaW5nRXhjZXB0aW9uRmxvdz1BbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nLiAgVGhlIGV4Y2VwdGlvbiBpcyBzd2FsbG93ZWQgYW5kIGlzIG5vdCBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIGNhbGxlci4KLXNlcnZpY2VDbGllbnRDcmVhdGVFcnJvcj1UaGUgU2VydmljZUNsaWVudCBjYW5ub3QgYmUgY3JlYXRlZC4gCi1jYW5ub3RTZXRFeGN1dG9yVG9OdWxsPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gc2V0IHRoZSBFeGVjdXRvciB0byBhIG51bGwgdmFsdWUuIFRoaXMgaXMgbm90IGFsbG93ZWQuCi1nZXRQb3J0SW52YWxpZFNFST1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGNhbGwgZ2V0UG9ydCB3aXRoIHRoZSB7MH0gcG9ydCBhbmQgezF9IHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIChTRUkpLiBIb3dldmVyLCB0aGlzIGNhbGwgaXMgbm90IGFsbG93ZWQuCi1jcmVhdGVEaXNwYXRjaEZhaWwwPURpc3BhdGNoIGNyZWF0aW9uIGZhaWxlZC4gVGhlIFFOYW1lIHBvcnQgY2Fubm90IGJlIG51bGwuCi1jcmVhdGVEaXNwYXRjaEZhaWwxPURpc3BhdGNoIGNyZWF0aW9uIGZhaWxlZC4gVGhlIHswfSBwb3J0IGNhbm5vdCBiZSBmb3VuZC4gIFZlcmlmeSB0aGF0IHRoZSBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBzZXJ2aWNlLgotY3JlYXRlRGlzcGF0Y2hGYWlsMj1EaXNwYXRjaCBjcmVhdGlvbiBmYWlsZWQuIFRoZSBzZXJ2aWNlIGNhbm5vdCBmaW5kIFBvcnQgZGF0YSBmb3IgdGhlIHswfSBwb3J0LgotYWRkUG9ydER1cD1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFkZCB0aGUgezB9IHBvcnQgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZS4gVGhlIHBvcnQgYWxyZWFkeSBleGlzdHMuCi1hZGRQb3J0RXJyMD1Pbmx5IHRoZSBTT0FQMTFIVFRQX0JJTkRJTkcsIFNPQVAxMkhUVFBfQklORElORywgU09BUDExSFRUUF9NVE9NX0JJTkRJTkcsIFNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HIGFuZCBIVFRQX0JJTkRJTkcgcG9ydHMgYXJlIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuIFRoZSB7MH0gcG9ydCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIFNlcnZpY2VEZWxlZ2F0ZS4KLWFkZFBvcnRFcnIxPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYWRkIHRoZSB7MH0gcG9ydCB3aXRoIHRoZSB7MX0gZW5kcG9pbnQgYWRkcmVzcywgd2hpY2ggaXMgbm90IHZhbGlkLCB0byB0aGUgU2VydmljZURlbGVnYXRlLiBUaGlzIGFkZGl0aW9uIGlzIG5vdCBhbGxvd2VkLgotYWRkUG9ydEVycjI9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhZGQgYSBwb3J0IHdpdGhvdXQgYSBuYW1lIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGUgb2JqZWN0LiBUaGlzIGFkZGl0aW9uIGlzIG5vdCBhbGxvd2VkLgotc2VydmljZURlbGVnYXRlQ29uc3RydWN0MD1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGNvbnN0cnVjdCB0aGUgU2VydmljZURlbGVnYXRlIG9iamVjdCB3aXRoIGFuIHNlcnZpY2UgbmFtZSB0aGF0IGlzIG5vdCB2YWxpZDogezB9Lgotc2VydmljZURlbGVnYXRlQ29uc3RydWN0MT1BbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGNvbnN0cnVjdCB0aGUgU2VydmljZURlbGVnYXRlIG9iamVjdCB3aXRoIHRoZSB7MH0gc2VydmljZSwgYnV0IHRoZSBzZXJ2aWNlIGlzIG5vdCBkZWZpbmVkIGluIHRoZSB7MX0gV1NETCBmaWxlLgotc2VydmljZURlc2NFcnIwPVRoZSBzZXJ2aWNlIGNsYXNzIGlzIG5vdCB2YWxpZC4gVGhlIHNlcnZpY2UgUU5hbWUgY2Fubm90IGJlIG51bGwuCi1zZXJ2aWNlRGVzY0VycjE9VGhlIHNlcnZpY2UgY2xhc3MgaXMgbm90IHZhbGlkLiBUaGUgU2VydmljZSBjbGFzcyB7MH0gbXVzdCBiZSBhc3NpZ25hYmxlIHRvIGphdmF4LnhtbC53cy5TZXJ2aWNlLgotc2VydmljZURlc2NFcnIyPVRoZSBzZXJ2aWNlIGlzIG5vdCB2YWxpZC4gVGhlIHswfSBzZXJ2aWNlIFFOYW1lIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgV1NETCBmaWxlLgotd3NkbE5vdEZvdW5kRXJyPVRoZSBXU0RMIGZpbGUgY291bGQgbm90IGJlIGZvdW5kOiB7MH0KLXdzZGxFeGNlcHRpb249VGhlIGZvbGxvd2luZyBXU0RMIGV4Y2VwdGlvbiBvY2N1cnJlZDogezB9Ci1ub1dlYlJlc3VsdEZvclByb3BlcnR5PVRoZSBzeXN0ZW0gY2Fubm90IGNyZWF0ZSB0aGUgV2ViUmVzdWx0IG9iamVjdCBmb3IgdGhlIHswfSBwcm9wZXJ0eSBvZiB0aGUgezF9IEphdmEgYmVhbi4KLXBvcnRJbmZvRXJyMD1UaGUgc3lzdGVtIGNhbm5vdCBjb25zdHJ1Y3QgdGhlIHBvcnQgZGF0YS4gVGhlIHswfSBzZXJ2aWNlIG5hbWUgaXMgbm90IHZhbGlkLgotcG9ydEluZm9FcnIxPVRoZSBzeXN0ZW0gY2Fubm90IGNvbnN0cnVjdCB0aGUgcG9ydCBkYXRhLiBUaGUgezB9IHBvcnQgbmFtZSBpcyBub3QgdmFsaWQuCi1wb3J0SW5mb0VycjI9VGhlIHN5c3RlbSBjYW5ub3QgY29uc3RydWN0IHRoZSBwb3J0IGRhdGEuIFRoZSB7MH0gYmluZGluZyBpZCBpcyBub3QgdmFsaWQuCi0jIFRoZSBrZXkgcG9ydEluZm9FcnIzIGlzIG5vdCBjdXJyZW50bHkgdXNlZC4KLSMgcG9ydEluZm9FcnIzPVRoZSBzeXN0ZW0gY2Fubm90IGNvbnN0cnVjdCB0aGUgcG9ydCBkYXRhLiBUaGUgezB9IHNlcnZpY2UgZW5kcG9pbnQgaXMgbm90IHZhbGlkLgotd2FybkF4aXNGYXVsdD1BbiBBeGlzRmF1bHQgb2NjdXJyZWQuIEhvd2V2ZXIsIHByb2Nlc3NpbmcgY29udGludWVzLiAgVGhlIEF4aXNGYXVsdCBpcyB7MH0KLWhhbmRsZXJDaGFpbkVycjA9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSB7MH0gbG9naWNhbCBoYW5kbGVyIG9jY3VycyBhZnRlciB0aGUgcHJvdG9jb2wgaGFuZGxlcnMuCi1oYW5kbGVyQ2hhaW5FcnIxPVRoZSB7MH0gaGFuZGxlciBzaG91bGQgbm90IGRpcmVjdGx5IGltcGxlbWVudCB0aGUgamF2YXgueG1sLndzLmhhbmRsZXIuSGFuZGxlciBpbnRlcmZhY2UuCi1oYW5kbGVyQ2hhaW5FcnIyPVRoZSB7MH0gaGFuZGxlciBtdXN0IGltcGxlbWVudCBqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlciBvciBqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyLgotSUNFcnIxPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgaW52b2NhdGlvbiBjb250ZXh0IGlzIG51bGwuCi1JQ0VycjI9IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgbWVzc2FnZSBjb250ZXh0IGlzIG51bGwuCi1JQ0VycjM9IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgcmVxdWVzdCBtZXNzYWdlIGNvbnRleHQgaXMgbnVsbC4KLUlDRXJyND1UaGUgc3lzdGVtIGNhbm5vdCBwZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBpbnZva2Ugd2l0aCBhIG51bGwgY2FsbGJhY2suCi1Bc3luY1BvbGxpbmdOb3RTdXBwb3J0ZWQ9QXN5bmNocm9ub3VzIHBvbGxpbmcgaW52b2NhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQuCi1JQ0NyZWF0ZU9wQ2xpZW50RXJyMT1UaGUgc3lzdGVtIGNhbm5vdCBjcmVhdGUgdGhlIE9wZXJhdGlvbkNsaWVudC4gVGhlIFNlcnZpY2VDbGllbnQgaXMgbnVsbC4KLUlDQ3JlYXRlT3BDbGllbnRFcnIyPVRoZSBzeXN0ZW0gY2Fubm90IGNyZWF0ZSB0aGUgT3BlcmF0aW9uQ2xpZW50LiBUaGUgb3BlcmF0aW9uIHFuYW1lIGlzIG51bGwuCi1wcm94eUVycjE9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBpbnZva2UgdGhlIHswfSBtZXRob2QsIGJ1dCB0aGlzIG1ldGhvZCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyIG9yIHsxfSBjbGFzcy4KLXByb3h5RXJyMj1UaGUgQFNPQVBCaW5kaW5nIGFubm90YXRpb24gU3R5bGUgZm9yIHRoZSBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSAoU0VJKSBhbmQgdGhlIEBTT0FQQmluZGluZyBhbm5vdGF0aW9uIFN0eWxlIGZvciB0aGUgbWV0aG9kIHNob3VsZCBiZSBzYW1lLgotcHJveHlFcnIzPU9wZXJhdGlvbiBEZXNjcmlwdGlvbiB3YXMgbm90IHNldC4KLXByb3h5UHJpdmF0ZU1ldGhvZD1JbnZhbGlkIG1ldGhvZCBjYWxsLiAgVGhlIG1ldGhvZCB7MH0gaXMgbm90IGEgdmFsaWQgbWV0aG9kLgotcHJveHlFeGNsdWRlZE1ldGhvZD1JbnZhbGlkIG1ldGhvZCBjYWxsLiAgVGhlIG1ldGhvZCB7MH0gaGFzIGJlZW4gZXhjbHVkZWQgdXNpbmcgdGhlIEBXZWJNZXRob2QoZXhjbHVkZT10cnVlKSBhbm5vdGF0aW9uLgotcHJveHlOdWxsQ2FsbGJhY2s9SW52YWxpZCBBc3luY0hhbmRsZXIgb2JqZWN0LiAgVGhlIEFzeW5jaEhhbmRsZXIgY2Fubm90IGJlIG51bGwgZm9yIGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBpbnZvY2F0aW9uLgotSkFYV1NNZXNzYWdlUmVjZWl2ZXJOb1NlcnZpY2VDbGFzcz1UaGUgc2VydmljZSBjbGFzcyBjYW5ub3QgYmUgZm91bmQgZm9yIHRoaXMgQXhpc1NlcnZpY2UuCi1FbmRwb2ludENvbnRyb2xsZXJFcnIyPVRoZSBzZXJ2aWNlIGNsYXNzIGlzIG5vdCBjb25maWd1cmVkIGZvciB0aGlzIGVuZHBvaW50LiBQcm9jZXNzaW5nIGNhbm5vdCBjb250aW51ZS4KLUVuZHBvaW50Q29udHJvbGxlckVycjQ9VGhlIHswfSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBjYW5ub3QgYmUgbG9hZGVkIGR1ZSB0byBhbiBlcnJvci4gUHJvY2Vzc2luZyBjYW5ub3QgY29udGludWUuCi1FbmRwb2ludENvbnRyb2xsZXJFcnI1PUEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBjYW5ub3QgYmUgZm91bmQuCi1FbmRwb2ludENvbnRyb2xsZXJFcnI2PVRoZSBzZXJ2aWNlIGlzIHVuYWJsZSB0byBsb2FkIHRoZSB7MH0gc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLUJsb2NrSW1wbEVycjE9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSB7MH0gYmxvY2sgb2JqZWN0IGlzIGFscmVhZHkgY29uc3VtZWQuIFByb2Nlc3NpbmcgY2Fubm90IGNvbnRpbnVlLiAgUnVuIHdpdGggdGhlIGRlYnVnIG9wdGlvbiB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGJsb2NrIHdhcyBmaXJzdCBjb25zdW1lZC4KLVhNTFBhcnRJbXBsRXJyMT1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIFhNTCBwYXJ0IGlzIGFscmVhZHkgY29uc3VtZWQuICBQcm9jZXNzaW5nIGNhbm5vdCBjb250aW51ZS4gUnVuIHdpdGggdGhlIGRlYnVnIG9wdGlvbiB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGJsb2NrIHdhcyBmaXJzdCBjb25zdW1lZC4KLVhNTFBhcnRJbXBsRXJyMj1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIGNvbnRlbnQgb2YgdGhlIFhNTCBwYXJ0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLgotUkVTVElzTm90U3VwcG9ydGVkPVRoZSBSRVNUIHByb3RvY29sIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0uCi1Qcm90b2NvbElzTm90S25vd249VGhlIHByb3RvY29sIGhhcyBub3QgYmVlbiBzZXQuIFRoaXMgZXJyb3IgbWlnaHQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIEpBWC1XUyBsYXllci4KLVNvdXJjZU5vdFN1cHBvcnRlZD1UaGUgezB9IGNsYXNzIGlzIG5vdCBhIHN1cHBvcnRlZCBleHRlbnNpb24gb2YgdGhlIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlLgotU291cmNlTWlzc2luZ1N1cHBvcnQ9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSBjb2RlIHRvIG1ha2UgYSBjb3B5IG9mIHRoaXMgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2UgKHswfSkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHN5c3RlbS4KLU1ldGhvZE5vdEltcGxlbWVudGVkPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkLiBUaGUgezB9IG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0uCi1kaXNwYXRjaEludm9rZUVycjE9VGhlIERpc3BhdGNoLmludm9rZU9uZVdheSBtZXRob2QgaXMgY2FsbGVkIHdpdGggYSBudWxsIE9iamVjdCBhcmd1bWVudC4KLWRpc3BhdGNoSW52b2tlRXJyMj1UaGUgRGlzcGF0Y2guaW52b2tlQXN5bmMgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgbnVsbCBPYmplY3QgYXJndW1lbnQuCi1yZXNldFJlYWRlckVycj1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gVGhlIHN5c3RlbSBjYW5ub3QgcmVzZXQgYSBYTUxTdHJlYW1SZWFkZXIgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXNldCBmZWF0dXJlLgotU0FBSkNvbnZlcnRlckVycjE9VGhlIFNPQVBFbGVtZW50IHBhcmVudCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIHRvU0FBSiBtZXRob2QgaXMgbm90IGF0dGFjaGVkIHRvIGEgU09BUEVudmVsb3BlLiBQcm9jZXNzaW5nIGNhbm5vdCBjb250aW51ZS4KLVNBQUpDb252ZXJ0ZXJFcnIyPUFuIHVuZXhwZWN0ZWQgWE1MU3RyZWFtUmVhZGVyIGV2ZW50LCB7MH0sIG9jY3VycmVkIHdoZW4gY29udmVydGluZyBhbiBPTSB0byBhIFNPQVBFbGVtZW50LgotWE1MU1JFcnIxPVRoZSBnZXRQcm9wZXJ0eSBtZXRob2Qgd2FzIGNhbGxlZCB3aXRoIGEgbnVsbCBrZXkgYXJndW1lbnQuCi1YTUxTUkVycjI9QWxsIG9mIHRoZSBldmVudHMgb2YgdGhlIFhNTFN0cmVhbVJlYWRlciBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzLgotWE1MU1JFcnIzPVRoZSBSZXF1aXJlIG1ldGhvZCBmYWlsZWQuIFRoZSBzeXN0ZW0gZXhwZWN0ZWQgezB9LCBidXQgZm91bmQgezF9LgotWE1MU1JFcnI0PUEgZmFpbHVyZSBvY2N1cnJlZCBpbiB0aGUgezB9IG1ldGhvZC4KLVhNTFNSRXJyNT1UaGUgWE1MU3RyZWFtUmVhZGVyIGV2ZW50LCB7MH0sIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiBwcm9jZXNzaW5nIGEgU09BUE1lc3NhZ2UuCi1JbnZhbGlkUHJvdmlkZXI9VGhlIHswfSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdmFsaWQuIE9ubHkgU3RyaW5nLCBTb3VyY2UsIGFuZCBTT0FQTWVzc2FnZSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBKQVgtV1Mgc3BlY2lmaWNhdGlvbi4KLUludmFsaWRQcm92aWRlckNyZWF0ZT1UaGUgY3JlYXRpb24gb2YgdGhlIHswfSBwcm92aWRlciBpbnN0YW5jZSBmYWlsZWQuIAotU09BUEZhdWx0SXNOb3RJbXBsZW1lbnRlZD1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gU09BUEZhdWx0IHByb2Nlc3NpbmcgaXMgbm90IGltcGxlbWVudGVkLgotTmV2ZXJDYWxsZWQ9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgaW50ZXJuYWwgbWV0aG9kLCB7MH0sICBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gcHJvY2Vzc2luZyBhIG1lc3NhZ2UuCi1KQVhCV3JhcHBlckVycjE9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgSkFYQiBvYmplY3QgYXJndW1lbnQgdG8gdGhlIHVud3JhcCBtZXRob2QgaXMgbnVsbC4KLUpBWEJXcmFwcGVyRXJyMj1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBjaGlsZCBuYW1lcyBhcmd1bWVudCB0byB0aGUgdW53cmFwIG1ldGhvZCBpcyBudWxsLgotSkFYQldyYXBwZXJFcnIzPUFuIGludGVybmFsIGFzc2VydGlvbiBlcnJvciBvY2N1cnJlZC4gVGhlIGNoaWxkIG9iamVjdHMgb3IgY2hpbGQgbmFtZXMgYXJndW1lbnQgdG8gdGhlIHdyYXAgbWV0aG9kIGlzIG51bGwuCi1KQVhCV3JhcHBlckVycjQ9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgbnVtYmVyIG9mIGNoaWxkIG9iamVjdHMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBjaGlsZCBuYW1lcyBpbiB0aGUgd3JhcCBtZXRob2QuCi1KQVhCV3JhcHBlckVycjU9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgbnVtYmVyIG9mIGNoaWxkIG5hbWVzIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgYmVhbiBwcm9wZXJ0aWVzIGluIHRoZSB7MH0gSkFYQiBjbGFzcy4KLUpBWEJXcmFwcGVyRXJyNj1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSB7MH0gSkFYQiBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHsxfSB4bWwgcHJvcGVydHkuCi1KQVhCV3JhcHBlckVycjc9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgdmFsdWUgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzIHRoYXQgaG9sZHMgdGhlIGNoaWxkIG9iamVjdHMgdG8gY3JlYXRlIHRoZSBKQVhCT2JqZWN0IGlzIG51bGwuCi1KQVhCU291cmNlTmFtZXNwYWNlRXJyPVRoZSBET01Tb3VyY2UgdmFsdWUgbXVzdCBiZSBOYW1lc3BhY2UgQXdhcmUuCi1BdHRhY2htZW50c05vdFN1cHBvcnRlZD1TQUFKIGF0dGFjaG1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkLgotcHJvdG9Ob3RGb3VuZDAwPUFuIGFzc29jaWF0ZWQgcHJvdG9jb2wgY2Fubm90IGJlIGZvdW5kIGZvciB0aGUgezB9IGJpbmRpbmcuCi1KYXZhRGlzcEVycjE9QSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KLUphdmFEaXNwRXJyMj1UaGUgc2VydmljZSBpcyB1bmFibGUgdG8gbG9hZCB0aGUgezB9IHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MuCi1JbnZhbGlkV2ViUGFyYW1zPVRoZSBzZXJ2aWNlIGZvdW5kIHdlYlBhcmFtcyB0aGF0IGFyZSBub3QgdmFsaWQuIFRoZSBudW1iZXIgb2Ygd2VicGFyYW1zIHRoYXQgYXJlIGRlZmluZWQgZG9lcyBub3QgbWF0Y2ggdGhlIG1ldGhvZCBpbnB1dCBwYXJhbWV0ZXJzLgotQXN5bmNMaXN0ZW5lckVycjE9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFRoZSBBeGlzQ2FsbGJhY2sgb2JqZWN0IGNhbm5vdCBiZSBudWxsLgotRG9jTGl0UHJveHlIYW5kbGVyRXJyMT1BY2NvcmRpbmcgdG8gdGhlIFdTLUkgc3BlY2lmaWNhdGlvbiwgbXVsdGlwbGUgcGFydCBXU0RMIGZpbGVzIGFyZSBub3QgYWxsb3dlZCBmb3IgYSBEb2N1bWVudC9MaXRlcmFsIEJhcmUgcmVxdWVzdC4gVGhlIGludm9rZWQgbWV0aG9kIGhhcyBtdWx0aXBsZSBpbnB1dCBwYXJhbWV0ZXJzLgotRG9jTGl0UHJveHlIYW5kbGVyRXJyMj1UaGUgTWV0aG9kIElucHV0IHBhcmFtZXRlciBmb3IgYSBub24td3JhcHBlZCBSZXF1ZXN0IGNhbm5vdCBiZSBudWxsLgotRG9jTGl0UHJveHlIYW5kbGVyRXJyMz1Vc2UgdGhlIGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXIgbWV0aG9kIHBhcmFtZXRlciB0eXBlIHdpdGggQXN5bmMgQ2FsbGJhY2sgb3BlcmF0aW9ucyBvbmx5LiBUaGUgbWV0aG9kIGlzIEFzeW5jIGlmIGl0IHJldHVybnMgYSBGdXR1cmU8Pz4gdHlwZSBhbmQgZW5kcyB3aXRoIGxldHRlcnMgJ0FzeW5jJy4KLURvY0xpdFByb3h5SGFuZGxlckVycjQ9VGhlIG1vZGUgZm9yIHRoZSBXZWJQYXJhbSBhbm5vdGF0aW9uIGNhbm5vdCBiZSBJTiBmb3IgYW4gaW5wdXQgcGFyYW1ldGVyIHRoYXQgaXMgYSBIb2xkZXIgdHlwZS4KLURvY0xpdFByb3h5SGFuZGxlckVycjU9VGhlIG9iamVjdCBpcyBub3QgYSBIb2xkZXIgdHlwZS4KLUphdmFCZWFuRGlzcGF0Y2hlckVycjE9QSBKYXZhIG1ldGhvZCB3YXMgbm90IGZvdW5kIGZvciB0aGUgb3BlcmF0aW9uLiBJZiB0aGUgV1NETCBvcGVyYXRpb24gbmFtZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSmF2YSBtZXRob2QgbmFtZSwgbWFrZSBzdXJlIHRoYXQgdGhlIEBXZWJNZXRob2QgYW5ub3RhdGlvbiBuYW1lIGlzIHByZXNlbnQuCi1TT0FQMTJXaXRoU0FBSjEyRXJyPUEgU09BUCAxLjIgbWVzc2FnZSBjYW5ub3QgYmUgcmVuZGVyZWQgaW4gYW4gU0FBSiAxLjIgb2JqZWN0IG1vZGVsLgotZGlzcGF0Y2hOdWxsUGFyYW1NZXNzYWdlTW9kZT1UaGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBhIG51bGwgdmFsdWUgZm9yIGEgRGlzcGF0Y2ggaW52b2NhdGlvbiB1c2luZyB0aGUgTUVTU0FHRSBtb2RlLgotZGlzcGF0Y2hOdWxsUGFyYW1IdHRwQmluZGluZz1UaGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBhIG51bGwgdmFsdWUgZm9yIGEgRGlzcGF0Y2ggaW52b2NhdGlvbiB1c2luZyB0aGUgWE1ML0hUVFAgYmluZGluZy4KLWRpc3BhdGNoSW52YWxpZFBhcmFtPVRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBEaXNwYXRjaCBpbnZvY2F0aW9uIHdhcyBub3QgdmFsaWQuCi1kaXNwYXRjaEludmFsaWRUeXBlPVVuc3VwcG9ydGVkIERpc3BhdGNoIFR5cGUsIERpc3BhdGNoIGNhbiBvbmx5IGJlIG9mIHRoZSBqYXZhLmxhbmcuU3RyaW5nLCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UsIG9yIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSB0eXBlLgotcHJlcGFyZVJlcXVlc3RGYWlsPUFuIGVycm9yIG9jY3VycmVkIHdoZW4gdGhlIHN5c3RlbSB3YXMgcHJlcGFyaW5nIHRoZSByZXF1ZXN0IG1lc3NhZ2UuCi12YWxpZGF0ZVVzZXJOYW1lPUVycm9yOiBBIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gc2V0dGluZyB0aGUgamF2YXgueG1sLndzLnNlY3VyaXR5LmF1dGgudXNlcm5hbWUgcHJvcGVydHkuCi12YWxpZGF0ZVBhc3N3b3JkPUVycm9yOiBBIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gc2V0dGluZyB0aGUgamF2YXgueG1sLndzLnNlY3VyaXR5LmF1dGgucGFzc3dvcmQgcHJvcGVydHkuCi1jaGVja1VzZXJuYW1lQW5kUGFzc3dvcmQ9RXJyb3I6IFRoZSBqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC51c2VybmFtZSB1c2VyIG5hbWUgYW5kIHRoZSBqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC5wYXNzd29yZCBwYXNzd29yZCBtdXN0IGJlIHNwZWNpZmllZC4KLWNoZWNrVXNlck5hbWU9RXJyb3I6IFRoZSBqYXZheC54bWwud3Muc2VjdXJpdHkuYXV0aC51c2VybmFtZSBwcm9wZXJ0eSB3YXMgc2V0LCBidXQgbm8gdmFsdWUgd2FzIHNwZWNpZmllZC4KLU5vTWFpbnRhaW5TZXNzaW9uUHJvcGVydHk9RXJyb3I6IE1haW50YWluIFNlc3Npb24gaXMgZW5hYmxlZCBidXQgbm9uZSBvZiB0aGUgc2Vzc2lvbiBwcm9wZXJ0aWVzIChDb29raWVzLCBPdmVyLXdyaXR0ZW4gVVJMKSBhcmUgcmV0dXJuZWQuCi1OdWxsVmFsdWVGb3JNYWludGFpblNlc3Npb25Qcm9wZXJ0eT1FcnJvcjogVGhlIHZhbHVlIG9mIHRoZSB7MH0gU2Vzc2lvbiBwcm9wZXJ0eSBpcyBOVUxMLgotSkFYQkJsb2NrRmFjdG9yeUVycjE9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgY29udGV4dCBwYXJhbWV0ZXIgb2YgdGhlIEpBWEJCbG9ja0ZhY3RvcnkuY3JlYXRlRnJvbSBtZXRob2Qgc2hvdWxkIGJlIGEgSkFYQkJsb2NrQ29udGV4dCBvYmplY3QsIGJ1dCBhIHswfSBvYmplY3Qgd2FzIGZvdW5kLgotSkFYQkJsb2NrRmFjdG9yeUVycjI9QW4gaW50ZXJuYWwgYXNzZXJ0aW9uIGVycm9yIG9jY3VycmVkLiBUaGUgYnVzaW5lc3Mgb2JqZWN0IHBhcmFtZXRlciBvZiBKQVhCQmxvY2tGYWN0b3J5LmNyZWF0ZUZyb20gbWV0aG9kIHNob3VsZCBiZSBhIEpBWEJFbGVtZW50IG9iamVjdCBvciBhbiBvYmplY3Qgd2l0aCBhbiBAWG1sUm9vdEVsZW1lbnQgYW5ub3RhdGlvbiwgYnV0IGEgezB9IG9iamVjdCB3YXMgZm91bmQuCi1KQVhCQmxvY2tGYWN0b3J5RXJyMz1BbiBpbnRlcm5hbCBhc3NlcnRpb24gZXJyb3Igb2NjdXJyZWQuIFRoZSBxTmFtZSBwYXJhbWV0ZXIgb2YgSkFYQkJsb2NrRmFjdG9yeS5jcmVhdGVGcm9tIG1ldGhvZCBzaG91bGQgbm90IGJlIG51bGwuCi1XU0RMNEpXcmFwcGVyRXJyMT1VbmFibGUgdG8gcmVhZCB3c2RsIGZyb20gcmVsYXRpdmUgcGF0aC4KLVdlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjE9QSBudWxsIHNlcnZpY2UgaW5zdGFuY2UgY2Fubm90IGJlIGluamVjdGVkIGludG8gdGhlIHJlc291cmNlLgotV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyMj1UaGUgaW5qZWN0aW9uIG9mIHByaXZhdGUgYW5kIHByb3RlY3RlZCBzZXQgbWV0aG9kcyBhcmUgbm90IHN1cHBvcnRlZC4KLVdlYlNlcnZpY2VDb250ZXh0SW5qZWN0aW9uSW1wbEVycjM9QSBudWxsIHNlcnZpY2UgaW5zdGFuY2UgY2Fubm90IGJlIGluamVjdGVkIGludG8gdGhlIHdlYnNlcnZpY2VzIGNvbnRleHQuCi1XZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnI0PUEgbnVsbCBzZXJ2aWNlIGluc3RhbmNlIGNhbm5vdCBiZSBpbmplY3RlZCBpbnRvIHRoZSB3ZWJzZXJ2aWNlcyBjb250ZXh0LgotV2ViU2VydmljZUNvbnRleHRJbmplY3Rpb25JbXBsRXJyNT1UaGUgaW5qZWN0aW9uIG9mIHByaXZhdGUgYW5kIHByb3RlY3RlZCBzZXJ2aWNlIGluc3RhbmNlIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQuCi1XZWJTZXJ2aWNlQ29udGV4dEluamVjdGlvbkltcGxFcnI2PVRoZSBpbmplY3Rpb24gY2FuIGhhcHBlbiB1c2luZyBhIG1ldGhvZCBpZiB0aGUgbWV0aG9kIG5hbWUgdGhhdCBzdGFydHMgd2l0aCBcInNldFwiIHJldHVybnMgYSB2b2lkLCBvbmx5IGhhcyBvbmUgcGFyYW1ldGVyLCBhbmQgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSByZXNvdXJjZS4KLVJlc291cmNlSW5qZWN0aW9uRmFjdG9yeUVycjE9QW4gdW5rbm93biByZXNvdXJjZSB0eXBlIHdhcyBmb3VuZCwgT25seSBhIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dCByZXNvdXJjZSB0eXBlIGNhbiBiZSBpbmplY3RlZC4KLUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlckltcGxFcnIxPUVuZHBvaW50TGlmZWN5Y2xlTWFuYWdlciBvYmplY3QgaXMgbnVsbC4KLUNsYXNzVXRpbHNFcnIxPUEgY2xhc3MgbG9hZGVyIHdhcyBub3QgZm91bmQuICAKLUNsYXNzVXRpbHNFcnIyPXswfSBtaWdodCBub3QgYmUgYSB2YWxpZCBwYWNrYWdlIGJlY2F1c2UgdGhlIGVuY29kaW5nIGlzIHVuc3VwcG9ydGVkLgotQ2xhc3NVdGlsc0VycjM9QW4gSU9FeGNlcHRpb24gZXJyb3Igd2FzIHRocm93biB3aGVuIHRyeWluZyB0byBnZXQgYWxsIG9mIHRoZSByZXNvdXJjZXMgZm9yIHswfQotQ2xhc3NVdGlsc0VycjQ9QW4gSU9FeGNlcHRpb24gZXJyb3Igd2FzIHRocm93biB3aGVuIHRyeWluZyB0byByZWFkIHRoZSBqYXIgZmlsZS4KLU1ldGhvZE1hcnNoYWxsZXJFcnIxPUEgSkFYLVdTIHNlcnZpY2UgZXhjZXB0aW9uIGZvciB0aGUgezB9IGZhdWx0IGJlYW4gY2Fubm90IGJlIGNyZWF0ZWQuCi1NZXRob2RNYXJzaGFsbGVyVXRpbEVycjE9RW1wdHkgQm9keSBCbG9jayBGb3VuZCBpbiByZXNwb25zZSBNZXNzYWdlIGZvciB3c2RsIE9wZXJhdGlvbiBkZWZpbnRpb24gdGhhdCBleHBlY3RzIGFuIE91dHB1dC4gUmV0dXJuIHR5cGUgYXNzb2NpYXRlZCB3aXRoIFNFSSBvcGVyYXRpb24gaXMgbm90IHZvaWQsIEJvZHkgQmxvY2sgY2Fubm90IGJlIG51bGwuCi1Tb3VyY2VSZWFkRXJyPUEgcHJvYmxlbSB3YXMgZW5jb3VudGVyZWQgd2hpbGUgcmVhZGluZyB0aGUgU291cmNlIG9iamVjdC4gIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIFNvdXJjZSBvYmplY3QgaXMgY29ycmVjdC4gIFRoZSBjbGFzcyBvZiB0aGUgU291cmNlIG9iamVjdCBpcyB7MH0KLUpBQkdyYXBoUHJvYmxlbT1UaGUgc3lzdGVtIHRocmV3IGEgU3RhY2tPdmVyZmxvd0Vycm9yIGF0IHRoZSBKQVhCIGxldmVsLiAgVGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgeW91ciBKQVhCIG9iamVjdCBoYXMgYSBjaXJjdWxhciByZWZlcmVuY2UuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSkFYQi4KLVNjaGVtYVJlYWRlckVycjE9SW52bGlkIHdzZGwgRGVmaW5pdGlvbiBwcm92aWRlZC4KLVNjaGVtYVJlYWRlckVycjI9Q2lyY3VsYXIgRGVwZW5kZW5jeSBGb3VuZCBpbiBXU0RMIFNjaGVtYSBJbXBvcnRzLCBUd28gU2NoZW1hcyBhcmUgaW1wb3J0aW5nIGVhY2ggb3RoZXIuCi1YU0RMaXN0Tm90U3VwcG9ydGVkPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbWFyc2hhbCBvciB1bm1hcnNoYWwgYW4geHNkOmxpc3Qgd2l0aCBhIGNvbXBvbmVudCB0eXBlIHRoYXQgaXMgYSB7MH0uICBUaGlzIHNjZW5hcmlvIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHJwYy9saXRlcmFsIHByb2Nlc3NpbmcuICBQbGVhc2UgdXNlIGRvY3VtZW50L2xpdGVyYWwgcHJvY2Vzc2luZwotZGlzcGF0Y2hCYWRET01Tb3VyY2U9QW4gaW52YWxpZCBET01Tb3VyY2Ugd2FzIGVuY291bnRlcmVkIGR1cmluZyBEaXNwYXRjaC4gIFBsZWFzZSB1c2UgYSBET01Tb3VyY2UgdGhhdCBjb250YWlucyBhIE5vZGUuCi1jb252ZXJ0UHJvYmxlbT1BbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgSkFYLVdTIG1hcnNoYWxsaW5nLiBBbiBvYmplY3Qgb2YgdHlwZSB7MH0gY2Fubm90IGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBkZXN0aW5hdGlvbiB0eXBlIG9mIHsxfQotaW52YWxpZFByb3BWYWx1ZT1UaGUgdmFsdWUgb2YgcHJvcGVydHkgezB9IHdhcyBpbnZhbGlkLiAgezF9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgezJ9LgotTnVsbFBhcmFtRXJyMT1JbnB1dCBhcmd1bWVudChzKSBpbiBvcGVyYXRpb24gbWV0aG9kIHswfSBpcyBudWxsLiAgVGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgZG9jL2xpdCBtZXNzYWdlcy4KLU51bGxQYXJhbUVycjI9SW5wdXQgYXJndW1lbnQocykgaW4gb3BlcmF0aW9uIG1ldGhvZCB7MH0gaXMgbnVsbC4gIFRoaXMgaXMgbm90IGFsbG93ZWQgZm9yIHJwYy9saXQgbWVzc2FnZXMuCi1OdWxsUGFyYW1FcnIzPVJldHVybiBhcmd1bWVudChzKSBpbiBvcGVyYXRpb24gbWV0aG9kIHswfSBpcyBudWxsLiAgVGhpcyBpcyBub3QgYWxsb3dlZCBmb3IgcnBjL2xpdCBtZXNzYWdlcy4KLXVua25vd25Ib3N0PVRoZSBob3N0IHNwZWNpZmllZCBieSB0aGUgVVJMIGlzIHVua25vd24uCi1jb25uZWN0aW9uUmVmdXNlZD1BbiBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gdGhlIFVSTCB3YXMgcmVmdXNlZC4KLXVybFN0cmVhbT1UaGUgV1NETCBmaWxlIGNvdWxkIG5vdCBiZSBsb2NhdGVkLgotbWltZUJvZHlQYXJ0RXJyb3I9RXJyb3I6IFByb2JsZW0gY3JlYXRpbmcgbWltZSBwYXJ0cy4KLXNjaGVtYUltcG9ydEVycm9yPUFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIHJlc29sdmluZyBpbXBvcnRlZCBzY2hlbWEgezB9IHJlbGF0aXZlIHRvIHBhcmVudCBkb2N1bWVudCB7MX0KLUV4ZWN1dG9yU2h1dGRvd249UmVqZWN0ZWRFeGNlY3V0aW9uRXhjZXB0aW9uLiBUaGUgcmVxdWVzdCBpcyByZWplY3RlZCBiZWNhdXNlIHRoZSBFeGVjdXRvciBTZXJ2aWNlIGZvciB0aGUgc2VydmljZSBpcyBzaHV0ZG93bi4KLWhhbmRsZXJDaGFpbk5TPVRoZSBASGFuZGxlckNoYWluIGNvbmZpZ3VyYXRpb24gZmlsZSB7MH0gaW4gdGhlIGNsYXNzIHsxfSBjb3VsZCBub3QgYmUgbG9hZGVkLgotaGNDb25maWdMb2FkRmFpbD1UaGUgQEhhbmRsZXJDaGFpbiBjb25maWd1cmF0aW9uIGZpbGUgezB9IGluIHRoZSBjbGFzcyB7MX0gY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcjogezJ9Ci1zZXJ2ZXJTaWRlQXN5bmM9VGhlIHNlcnZlci1zaWRlIFNFSSB7MH0gY29udGFpbnMgdGhlIGFzeW5jaHJvbm91cyBtZXRob2QgezF9LiBBc3luY2hyb25vdXMgbWV0aG9kcyBhcmUgbm90IGFsbG93ZWQgZm9yIHNlcnZlci1zaWRlIGFydGlmYWN0cy4KLW9uZXdheUFzeW5jPVRoZSBhc3luYyBsaXN0ZW5lciBwcm9wZXJ0eSB3YXMgc2V0LiAgQSBvbmUgd2F5IGludm9jYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCB1c2luZyBhbiBhc3luYyByZXNwb25zZSBjaGFubmVsLgotc29hcEJpbmRpbmdVc2VFbmNvZGVkPVRoZSBTRUkgezB9IGNvbnRhaW5zIG1ldGhvZCB7MX0gd2l0aCBhbiB1bnN1cHBvcnRlZCBTT0FQQmluZGluZyBhbm5vdGF0aW9uIHZhbHVlLiBTT0FQQmluZGluZy5Vc2UgZmllbGQgY2Fubm90IGJlIHNldCB0byBFTkNPREVELgotc29hcEJpbmRpbmdTdHlsZT1UaGUgU0VJIHswfSBjb250YWlucyBtZXRob2QgezF9IHdpdGggYW5ub3RhdGlvbiBTT0FQQmluZGluZy5TdHlsZSBzZXQgdG8gUlBDLgotaGFuZGxlclNvdXJjZUZhaWw9SW50ZXJuYWwgZXJyb3IuIE11bHRpcGxlIHNvdXJjZXMgd2VyZSBzdXBwbGllZCBmb3IgdGhlIGhhbmRsZXIgY2hhaW4gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgY2xhc3MgezB9LgotZmFpbHVyZUxvZ2dlcj1BIHswfSB0aHJvd2FibGUgd2FzIGNhdWdodC4gIFRoZSBkZXRhaWwgbWVzc2FnZSBpczogezF9Ci1jbGllbnRDb25maWdDdHh0RXJyPUVycm9yIGdldHRpbmcgQ2xpZW50IENvbmZpZ3VyYXRpb24gQ29udGV4dCA6IHswfQotY3JlYXRlU2VydmljZURlc2NyRXJyPUEgU2VydmljZURlc2NyaXB0aW9uIHdhcyBub3QgY3JlYXRlZCBmb3IgezB9Ci1jcmVhdGVTcnZjRGVzY3JEQkNNYXBFcnI9VGhlIFNlcnZpY2VEZXNjcmlwdGlvbiBmYWlsZWQgdG8gdmFsaWRhdGUgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzIC0tIFZhbGlkYXRpb24gUGhhc2UgMiBmYWlsdXJlOiB7MH0sIEZhaWxpbmcgY29tcG9zaXRlOiB7MX0sIEZhaWxpbmcgU2VydmljZSBEZXNjcmlwdGlvbjogezJ9Ci1yZWdIYW5kbGVySGVhZGVyc0Vycj1VbmFibGUgdG8gYWRkIFBhcmFtZXRlciBmb3IgaGVhZGVyIFFOYW1lcyB0byBBeGlzU2VydmljZSB7MH0uIHsxfQotZW5kcG9pbnREZXNjcmlwdGlvbkVycjE9RW5kcG9pbnREZXNjcmlwdGlvbjogUG9ydFFOYW1lIHdhcyBudWxsIGFuZCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBieSBydW50aW1lIGZvciBjbGFzcyB7MH07IFNlcnZpY2VEZXNjcmlwdGlvbjogezF9Ci1lbmRwb2ludERlc2NyaXB0aW9uRXJyMj1DYXVnaHQgezB9IGF0dGVtcHRpbmcgdG8gY29tcGxldGUgY29uZmlndXJhdGlvbiBvbiBBeGlzU2VydmljZSBmb3IgU2VydmljZURlc3JpcHRpb246IHsxfQotZW5kcG9pbnREZXNjcmlwdGlvbkVycjM9RW5kcG9pbnREZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOiBwYXJlbnRzIERCQyBpcyBudWxsCi1lbmRwb2ludERlc2NyaXB0aW9uRXJyND1FbmRwb2ludERlc2NyaXB0aW9uOiBVbmFibGUgdG8gYWRkIHBhcmFtZXRlcnMgdG8gQXhpc1NlcnZpY2UKLWVuZHBvaW50RGVzY3JpcHRpb25FcnI1PUNhbid0IGFkZCBBeGlzU2VydmljZSBwYXJhbTogezB9Ci1lbmRwb2ludERlc2NyaXB0aW9uRXJyNj1FaXRoZXIgV2ViU2VydmljZSBvciBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBtdXN0IGJlIHByZXNlbnQgb24gezB9Ci1lbmRwb2ludERlc2NyaXB0aW9uRXJyNz1Cb3RoIFdlYlNlcnZpY2Ugb3IgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb25zIGNhbm5vdCBiZSBwcmVzZW50b24gezB9Ci1lbmRwb2ludERlc2NyaXB0aW9uRXJyOD1DYW4ndCBjcmVhdGUgU0VJIGNsYXNzOgotb3BlcmF0aW9uRGVzY3JpcHRpb25FcnIxPU9wZXJhdGlvbkRlc2NyaXB0aW9uOiBVbmFibGUgdG8gYWRkIHBhcmFtZXRlcnMgdG8gQXhpc09wZXJhdGlvbgotdXBkYXRlV2l0aFNFSUVycjE9Q2FuIG5vdCB1cGRhdGUgYW4gU0VJIG9uIGEgZHluYW1pYyBwb3J0LiAgUG9ydFFOYW1lOiB7MH0KLXVwZGF0ZVdpdGhTRUlFcnIyPUVuZHBvaW50RGVzY3JpcHRpb24udXBkYXRlV2l0aFNFSSB3YXMgcGFzc2VkIGEgbnVsbCBTRUkuICBQb3J0UU5hbWU6IHswfQotc2V0dXBBeGlzU2VydmljZUVycjE9VW5hYmxlIHRvIGNyZWF0ZSBBeGlzU2VydmljZSBmb3IgezB9Ci1zZXR1cEF4aXNTZXJ2aWNlRXJyMj1FeGNlcHRpb24gd2hlbiBhZGRpbmcgc2VydmljZSBwYXJhbWV0ZXJzLgotYmxkQXhpc1NydmNGcm9tV1NETEVycj1UaGUgV1NETCBmaWxlIGNvdWxkIG5vdCBiZSB1c2VkIGR1ZSB0byBhbiBleGNlcHRpb24uICBUaGUgV1NETCB3aWxsIGJlIGlnbm9yZWQgYW5kIGFubm90YXRpb25zIHdpbGwgYmUgdXNlZC4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH07IFdTREwgTG9jYXRpb246IHsxfQotc2VydmljZURlc2NFcnIzPVdTREwgUG9ydCBub3QgZm91bmQgZm9yIHBvcnQgezB9Ci1nZW5lcmF0ZVdTRExFcnI9RW5kcG9pbnREZXNjcmlwdGlvbkltcGw6IFdTRExFeGNlcHRpb24gdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSBXU0RMNEpXcmFwcGVyCi1oYW5kbGVyQ2hhaW5zVHlwZUVycj1FbmRwb2ludERlc2NyaXB0aW9uSW1wbC5nZXRIYW5kbGVyQ2hhaW46IGZpbGVOYW1lOiB7MH07IGNsYXNzTmFtZTogezF9Ci1laURlc2NySW1wbEVycj1VbmFibGUgdG8gYnVpbGQgQXhpc09wZXJhdGlvbiBmb3IgZ2VuZXJpYyBQcm92aWRlcjsgY2F1Z2h0IGV4Y2VwdGlvbi4KLXNlaU1ldGhvZHNFcnI9U0VJIG1ldGhvZHMgbXVzdCBiZSBwdWJsaWMuCi1zZWlQcm9jZXNzaW5nRXJyPVRoZSBzZWlDbGFzcyBpcyBhbHJlYWR5IHNldDsgcmVzZXRpbmcgaXQgaXMgbm90IHN1cHBvcnRlZC4KLXNlaU5vdEZvdW5kRXJyPUVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb25JbXBsOiBjYW5ub3QgZmluZCBzdXBlciBjbGFzcyB0aGF0IHdhcyBzcGVjaWZpZWQgZm9yIHRoaXMgY2xhc3MuCi1jbGllbnRBeGlzT3ByRXJyPUNhdWdodCBleGNlcHRpb24gdHJ5aW5nIHRvIGNyZWF0ZSBBeGlzT3BlcmF0aW9uLgotY3JlYXRlQXhpc09wckVycjE9Q291bGQgbm90IHNldHVwIERvYy9MaXQvQmFyZSBvcGVyYXRpb24gYmVjYXVzZSBpbnB1dCBtZXNzYWdlIGlzIG51bGwuCi1jcmVhdGVBeGlzT3ByRXJyMj1Db3VsZCBub3Qgc2V0dXAgRG9jL0xpdC9CYXJlIG9wZXJhdGlvbiBiZWNhdXNlIHBhcnQgbmFtZXNwYWNlIGlzIGVtcHR5LgotY3JlYXRlQXhpc09wckVycjM9Q291bGQgbm90IHNldHVwIERvYy9MaXQvQmFyZSBvcGVyYXRpb24gYmVjYXVzZSBuYW1lIGlzIGVtcHR5Lgotc2VpTWV0aG9kRXJyPUNhbiBub3Qgc2V0IGFuIFNFSSBtZXRob2Qgb25jZSBpdCBoYXMgYmVlbiBzZXQuCi1yZWdNVUhlYWRlcnNFcnI9VW5hYmxlIHRvIGFkZCBQYXJhbWV0ZXIgZm9yIGhlYWRlciBRTmFtZXMgdG8gQXhpc09wZXJhdGlvbiB7MH0KLWdlblBhcmFtVHlwZXNFcnI9T3BlcmF0aW9uRGVzY3JpcHRpb25JbXBsLmdldFBhcmFtZXRlckFjdHVhbEdlbmVyaWNUeXBlIG5vdCBzdXBwb3J0ZWQgZm9yIERCQy4KLXVwZGF0ZUVQRGVzY3JFcnIxPVNlcnZpY2VEZXNjcmlwdGlvbi51cGRhdGVFbmRwb2ludERlc2NyaXB0aW9uOiBDYW4gbm90IGRvIGEgZ2V0UG9ydCBvbiBhIHBvcnQgYWRkZWQgdmlhIGFkZFBvcnQoKS4gIFBvcnRRTjogezB9Ci11cGRhdGVFUERlc2NyRXJyMj1TZXJ2aWNlRGVzY3JpcHRpb24udXBkYXRlRW5kcG9pbnREZXNjcmlwdGlvbjogQ2FuIG5vdCBkbyBhIGdldFBvcnQgd2l0aCBhIG51bGwgU0VJLiAgUG9ydFFOOiB7MH0KLXVwZGF0ZUVQRGVzY3JFcnIzPVNlcnZpY2VEZXNjcmlwdGlvbi51cGRhdGVFbmRwb2ludERlc2NyaXB0aW9uOiBDYW4ndCBkbyBhIGdldFBvcnQoKSBzcGVjaWZpeWluZyBhIGRpZmZlcmVudCBTRUkgdGhhbiB0aGUgcHJldmlvdXMgZ2V0UG9ydCgpLiAgUG9ydFFOOiB7MH07IGN1cnJlbnQgU0VJOiB7MX07IHByZXZpb3VzIFNFSTogezJ9Ci1kYmNsSW50ZWdyaXR5RXJyPVZhbGlkYXRpb24gcGhhc2UgMSBmYWlsdXJlOiB7MH07IEZhaWxpbmcgY29tcG9zaXRlOiB7MX0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMT1WYWxpZGF0aW9uIGVycm9yOiBUaGlzIGlzIGEgUHJvdmlkZXIgYmFzZWQgZW5kcG9pbnQgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24uICBQcm92aWRlciBjbGFzczogezB9Ci12YWxpZGF0ZUludGVncml0eUVycjI9VmFsaWRhdGlvbiBlcnJvcjogV2ViU2VydmljZSBhbm5vdGF0aW9uIGFuZCBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBjYW5ub3QgY29leGlzdC4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMz1WYWxpZGF0aW9uIGVycm9yOiBUaGlzIGlzIGEgUHJvdmlkZXIgdGhhdCBkb2VzIG5vdCBzcGVjaWZ5IGEgdmFsaWQgUHJvdmlkZXIgaW50ZXJmYWNlLiAgIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyND1WYWxpZGF0aW9uIGVycm9yOiBQcm92aWRlciBtdXN0IGhhdmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyNT1WYWxpZGF0aW9uIGVycm9yOiBQcm92aWRlciBtdXN0IGhhdmUgYSBwdWJsaWMgaW52b2tlIG1ldGhvZC4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyNj1WYWxpZGF0aW9uIGVycm9yOiBTZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgV2ViU2VydmljZVByb3ZpZGVyLiAgIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyNz1WYWxpZGF0aW9uIGVycm9yOiBjYW5ub3QgZmluZCBXU0RMIERlZmluaXRpb24gc3BlY2lmaWVkIGJ5IHRoaXMgV2ViU2VydmljZSBhbm5vdGF0aW9uLiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9OyBXU0RMIGxvY2F0aW9uOiB7MX0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyOD1WYWxpZGF0aW9uIGVycm9yOiBjYW5ub3QgZmluZCBTRUkgc3BlY2lmaWVkIGJ5IHRoZSBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlLiAgSW1wbGVtZW50YWl0b24gY2xhc3M6IHswfTsgRW5kcG9pbnRJbnRlcmZhY2U6IHsxfQotdmFsaWRhdGVJbnRlZ3JpdHlFcnI5PVZhbGlkYXRpb24gZXJyb3I6IGludmFsaWQgYW5ub3RhdGlvbnMgc3BlY2lmaWVkIHdoZW4gV2ViU2VydmljZSBhbm5vdGF0aW9uIHNwZWNpZmllcyBhbiBlbmRwb2ludCBpbnRlcmZhY2UuICBJbXBsZW1udGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMTA9VmFsaWRhdGlvbiBlcnJvcjogV2ViU2VydmljZS5uYW1lIG11c3Qgbm90IGJlIHNwZWNpZmllZCB3aGVuIHRoZSBiZWFuIHNwZWNpZmllcyBhbiBlbmRwb2ludCBpbnRlcmZhY2UuICBJbXBsZW50YXRpb24gY2xhc3M6IHswfTsgV2ViU2VydmljZS5uYW1lOiB7MX0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMTE9VmFsaWRhdGlvbiBlcnJvcjogV2ViTWV0aG9kIGFubm90YXRpb25zIGNhbm5vdCBleGlzdCBvbiBpbXBsZW50YXRpb24gd2hlbiBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlIGlzIHNldC4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH0KLXZhbGlkYXRlSW50ZWdyaXR5RXJyMTI9VmFsaWRhdGlvbiBlcnJvcjogSW1wcm9wZXIgdXNhZ2U6IGNhbm5vdCBpbnZva2UgdGhpcyBtZXRob2Qgd2l0aCBhbiBpbnRlcmZhY2UuICBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9Ci12YWxpZGF0ZUludGVncml0eUVycjEzPVZhbGlkYXRpb24gZXJyb3I6IFVuc3VwcG9ydGVkIFNPQVBCaW5kaW5nIGFubm90YXRpb24gdmFsdWUuIFRoZSBFTkNPREVEIHNldHRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgU09BUEJpbmRpbmcuVXNlLiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9Ci12YWxpZGF0ZVBJc0VycjE9VmFsaWRhdGlvbiBlcnJvcjogU09BUE1lc3NhZ2UgYW5kIERhdGFTb3VyY2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCB3aGVuIFNlcnZpY2VNb2RlIHNwZWNpZmllcyBQQVlMT0FELiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9Ci12YWxpZGF0ZVBJc0VycjI9VmFsaWRhdGlvbiBlcnJvcjogU09BUE1lc3NhZ2Ugb2JqZWN0cyBjYW5ub3QgYmUgdXNlZCB3aXRoIEhUVFAgYmluZGluZyB0eXBlLiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9Ci12YWxpZGF0ZVBJc0VycjM9VmFsaWRhdGlvbiBlcnJvcjogRGF0YVNvdXJjZSBvYmplY3RzIG11c3QgYmUgdXNlZCB3aXRoIEhUVFAgYmluZGluZyB0eXBlLiBJbXBsZW1lbnRhdGlvbiBjbGFzczogezB9Ci12YWxpZGF0ZUltcGxFcnI9VmFsaWRhdGlvbiBlcnJvcjogSW1wbGVtZW50YXRpb24gc3ViY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IG1ldGhvZCBvbiBzcGVjaWZpZWQgaW50ZXJmYWNlLiAgSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfTsgbWlzc2luZyBtZXRob2QgbmFtZTogezF9OyBlbmRwb2ludEludGVyZmFjZTogezJ9Ci12YWxpZGF0ZU1ldGhvZFBhcmFtRXJyMT1WYWxpZGF0aW9uIGVycm9yOiBTRUkgaW5kaWNhdGVzIG5vIHBhcmFtZXRlcnMgYnV0IGltcGxlbWVudGF0aW9uIG1ldGhvZCBzcGVjaWZpZXMgcGFyYW1ldGVyczogezB9OyBJbXBsZW1lbnRhdGlvbiBjbGFzczogezF9OyBNZXRob2QgbmFtZTogezJ9OyBFbmRwb2ludCBJbnRlcmZhY2U6IHszfQotdmFsaWRhdGVNZXRob2RQYXJhbUVycjI9VmFsaWRhdGlvbiBlcnJvcjogU0VJIGluZGljYXRlcyBwYXJhbWV0ZXJzIHswfSBidXQgaW1wbGVtZW50YXRpb24gbWV0aG9kIHNwZWNpZmllcyBubyBwYXJhbWV0ZXJzOyBJbXBsZW1lbnRhdGlvbiBjbGFzczogezF9OyBNZXRob2QgbmFtZTogezJ9OyBFbmRwb2ludCBJbnRlcmZhY2U6IHszfQotdmFsaWRhdGVNZXRob2RQYXJhbUVycjM9VmFsaWRhdGlvbiBlcnJvcjogVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIG9uIHRoZSBTRUkgbWV0aG9kICh7MH0pIGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBvbiB0aGUgaW1wbGVtZW50YXRpb24gKHsxfSk7IEltcGxlbWVudGF0aW9uIGNsYXNzOiB7Mn07IE1ldGhvZCBuYW1lOiB7M307IEVuZHBvaW50IEludGVyZmFjZTogezR9Ci12YWxpZGF0ZU1ldGhvZFJWRXJyMT1WYWxpZGF0aW9uIGVycm9yOiBTRUkgaW5kaWNhdGVzIG5vIHJldHVybiB2YWx1ZSBidXQgaW1wbGVtZW50YXRpb24gbWV0aG9kIHNwZWNpZmllcyByZXR1cm4gdmFsdWU6IHswfTsgSW1wbGVtZW50YXRpb24gY2xhc3M6IHsxfTsgTWV0aG9kIG5hbWU6IHsyfTsgRW5kcG9pbnQgSW50ZXJmYWNlOiB7M30KLXZhbGlkYXRlTWV0aG9kUlZFcnIyPVZhbGlkYXRpb24gZXJyb3I6IFNFSSBpbmRpY2F0ZXMgcmV0dXJuIHZhbHVlIHswfSBidXQgaW1wbGVtZW50YXRpb24gbWV0aG9kIHNwZWNpZmllcyBubyByZXR1cm4gdmFsdWU7IEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MX07IE1ldGhvZCBuYW1lOiB7Mn07IEVuZHBvaW50IEludGVyZmFjZTogezN9Ci12YWxpZGF0ZU1ldGhvZFJWRXJyMz1WYWxpZGF0aW9uIGVycm9yOiBTRUkgcmV0dXJuIHZhbHVlIHswfSBkb2VzIG5vdCBtYXRjaCBpbXBsZW1lbnRhdGlvbiBtZXRob2QgcmV0dXJuIHZhbHVlIHsxfTsgSW1wbGVtZW50YXRpb24gY2xhc3M6IHsyfTsgTWV0aG9kIG5hbWU6IHszfTsgRW5kcG9pbnQgSW50ZXJmYWNlOiB7NH0KLXZhbGlkYXRlTWV0aG9kRXhjZXB0aW9uRXJyMT1WYWxpZGF0aW9uIGVycm9yOiBJbXBsZW1lbnRhdGlvbiBtZXRob2Qgc2lnbmF0dXJlIGhhcyBtb3JlIGNoZWNrZWQgZXhjZXB0aW9ucyB0aGFuIFNFSSBtZXRob2Qgc2lnbmF0dXJlICgwKTogSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfTsgbWV0aG9kIG5hbWU6IHsxfTsgZW5kcG9pbnRJbnRlcmZhY2U6IHsyfQotdmFsaWRhdGVNZXRob2RFeGNlcHRpb25FcnIyPVZhbGlkYXRpb24gZXJyb3I6IEltcGxlbWVudGF0aW9uIG1ldGhvZCBzaWduYXR1cmUgaGFzIG1vcmUgY2hlY2tlZCBleGNlcHRpb25zICh7MH0pIHRoYW4gU0VJIG1ldGhvZCBzaWduYXR1cmUgKHsxfSk6IEltcGxlbWVudGF0aW9uIGNsYXNzOiB7Mn07IG1ldGhvZCBuYW1lOiB7M307IGVuZHBvaW50SW50ZXJmYWNlOiB7NH0KLXZhbGlkYXRlTWV0aG9kRXhjZXB0aW9uRXJyMz1WYWxpZGF0aW9uIGVycm9yOiBJbXBsZW1lbnRhdGlvbiBtZXRob2Qgc2lnbmF0dXJlIHRocm93cyBleGNlcHRpb24gezB9IHdoaWNoIGlzIG5vdCBkZWNsYXJlZCBvbiB0aGUgU0VJIG1ldGhvZCBzaWduYXR1cmU6IEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MX07IG1ldGhvZCBuYW1lOiB7Mn07IGVuZHBvaW50SW50ZXJmYWNlOiB7M30KLXZhbGlkYXRlU0VJRXJyMT1WYWxpZGF0aW9uIGVycm9yOiBTRUkgZG9lcyBub3QgY29udGFpbiBhIFdlYlNlcnZpY2UgYW5ub3RhdGlvbi4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH07IFNFSTogezF9Ci12YWxpZGF0ZVNFSUVycjI9VmFsaWRhdGlvbiBlcnJvcjogU0VJIG11c3Qgbm90IHNldCBhIHZhbHVlIGZvciBAV2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZS4gIEltcGxlbWVudGF0aW9uIGNsYXNzOiB7MH07IFNFSTogezF9OyBJbnZhbGlkIGVuZHBvaW50SW50ZXJmYWNlIHZhbHVlOiB7Mn0KLXZhbGlkYXRlU0VJRXJyMz1WYWxpZGF0aW9uIGVycm9yOiBVbnN1cHBvcnRlZCBTT0FQQmluZGluZyBhbm5vdGF0aW9uIHZhbHVlLiBUaGUgRU5DT0RFRCBzZXR0aW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFNPQVBCaW5kaW5nLlVzZS4gSW1wbGVtZW50YXRpb24gY2xhc3M6IHswfQotaGFuZGxlckNoYWluRXJyPUVuZHBvaW50RGVzY3JpcHRpb25JbXBsOiBnZXRIYW5kbGVyQ2hhaW46IHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gdW5tYXJzaGFsbCBKQVhCIGNvbnRlbnQuCi1jcmVhdGVEaXNwYXRjaEZhaWwzPVNlcnZpY2VEZXNjcmlwdGlvbi51cGRhdGVFbmRwb2ludERlc2NyaXB0aW9uOiBDYW4gbm90IHNwZWNpZnkgYW4gU0VJIHdoZW4gY3JlYXRpbmcgYSBEaXNwYXRjaC4gUG9ydFFOOiB7MH0KLXJvbGVWYWxpZGF0aW9FcnI9VGhlIHJvbGUgb2YgJ25vbmUnIGlzIG5vdCBhbGxvd2VkLgotdGhyZWFkQ2xzTG9hZGVyRXJyPUF0dGVtcGluZyB0byB1c2UgQ2xhc3NMb2FkZXIgb2YgdHlwZSB7MH0sIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgQ2xhc3NMb2FkZXIgb2YgdHlwZSB7MX0KLWdldEVycj1UaGUgdGFzayB3YXMgY2FuY2VsbGVkLgotZ2V0RXJyMT1UaGUgY2xpZW50IHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciBhbiBhc3luY2hyb25vdXMgcmVzcG9uc2UuCi1wcm9jZXNzUmVzcEVycj1udWxsIHJlc3BvbnNlLgotYWRkUHJvcGVydGllc0Vycj1VbmFibGUgdG8gY29udmVydCBXU0RMIGxvY2F0aW9uIFVSTCB0byBVUkkuICBVUkw6IHswfTsgU2VydmljZTogezF9Ci1pbnZva2VBc3luY0Vycj1BIGNsaWVudCBvdXRib3VuZCBoYW5kbGVyIGNhdXNlIGEgbWVzc2FnZSBmbG93IGRpcmVjdGlvbiByZXZlcnNhbC4gIFRoaXMgY2FzZSBpcyBub3QgeWV0IGltcGxlbWVudGVkLgotY0ZhdWx0TXNnRXJyPVdlIG9ubHkgc3VwcG9ydCBTT0FQMTEgYW5kIFNPQVAxMiBmb3IgSkFYV1MgaGFuZGxlcnMuCi1nZXRIZWFkZXJzRXJyPUludmFsaWQgUU5hbWUsIFFOYW1lIGNhbm5vdCBiZSBudWxsLgotZ2V0SGVhZGVyc0VycjE9SW52YWxpZCBKQVhCQ29udGV4dC4gSkFYQkNvbnRleHQgY2Fubm90IGJlIG51bGwuCi1pbnB1dENvbnZlcnRpb25FcnI9Q2Fubm90IGNvbnZlcnQgZnJvbSB7MH0gdG8gTGlzdDxTdHJpbmc+LgotaW5wdXRDb252ZXJ0aW9uRXJyMT1DYW5ub3QgY29udmVydCBmcm9tICB7MH0gdG8gU3RyaW5nLgotcGRFbGVtZW50RXJyPVNXQVJFRiBhbmQgTVRPTSBhdHRhY2htZW50IHBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBzdHlsZS91c2UuCi1tc2dGcm9tTXNnRXJyPUVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5jb21pbmcgbWVzc2FnZS4KLXBUeXBlRXJyPVByb3ZpZGVyIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgR2VuZXJpYyBUeXBlcyBkZWZpbmVkIHBlciBKQVgtV1MgU3BlY2lmaWNhdGlvbi4KLWJGYWN0b3J5RXJyPVVuZXhwZWN0ZWQgRXJyb3IuIFVuYWJsZSB0byBmaW5kIEJsb2NrRmFjdG9yeSBmb3IgdHlwZTogezB9Ci1pbml0RXJyPVRoZSBpbXBsZW1lbnRvciBvYmplY3QgY2Fubm90IGJlIG51bGwuCi1pbmplY3RPbkNsc0Vycj1XZWJTZXJ2aWNlQ29udGV4dCBJbmplY3Rpb24gb24gYSBDbGFzcyBpcyBub3Qgc3VwcG9ydGVkLgotb3ByRGVzY3JFcnI9Tm8gb3BlcmF0aW9uIGZvdW5kLiAgV1NETCBPcGVyYXRpb24gbmFtZTogezB9Ci1vcHJEZXNjckVycjE9TW9yZSB0aGFuIG9uZSBvcGVyYXRpb24gZm91bmQuIE92ZXJsb2FkZWQgV1NETCBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLiAgV1NETCBPcGVyYXRpb24gbmFtZTogezB9Ci1pbnZva2VFcnI9Tm8gZGlzcGF0Y2hlciBmb3VuZC4KLW51bGxNc2dDdHhFcnI9VGhlIE1lc3NhZ2VDb250ZXh0IGlzIG51bGwuICBUaGlzIGlzIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIHRoYXQgb2NjdXJyZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHByb3BlcnR5IG1pZ3JhdGlvbi4KLXBvcnRFcnI9VW5hYmxlIHRvIGdldFBvcnQgZm9yIHBvcnQgUU5hbWUgezB9Ci1wb3J0RXJyMT1VbmFibGUgdG8gbG9hZCBwcm94eSBjbGFzc2VzLgotcERlc2NyRXJyPU51bGwgRGVzY3JpcHRvci4gUHJvcGVydHlEZXNjcmlwdG9yIG5vdCBmb3VuZC4KLXBEZXNjckVycjI9Tm8gcmVhZCBNZXRob2QgZm91bmQgdG8gcmVhZCBwcm9wZXJ0eSBWYWx1ZSBmcm9tIGpheGJPYmplY3Q6IHswfSAKLXJlc3RXaXRoU09BUEVycj1FeHBlY3RlZCBhbiBYTUwgb3ZlciBIVFRQIG1lc3NhZ2UsIGJ1dCB0aGUgbWVzc2FnZSBhcHBlYXJzIHRvIGJlIGEgU09BUCBtZXNzYWdlLiAgVGhlIG5hbWVzcGFjZSBpcyB7MH0KLW5vRGF0YUhhbmRsZXI9QSBkYXRhIGhhbmRsZXIgd2FzIG5vdCBmb3VuZCBmb3IgY29udGVudCBpZCB7MH0KLURlc2NyaXB0aW9uQnVpbGRlckVycjE9VW5hYmxlIHRvIGNyZWF0ZSBjb21wb3NpdGUgYW5ub3RhdGlvbiB7MH0gZHVlIHRvIGV4Y2VwdGlvbiB7MX0KLURlc2NyaXB0aW9uQnVpbGRlckVycjI9VW5hYmxlIHRvIGNyZWF0ZSBzcGFyc2UgYW5ub3RhdGlvbiB7MH0gZnJvbSBiYXNlIGFubm90YXRpb24gezF9Ci1zZXJ2aWNlRGVzY0VycjQ9VW5hYmxlIHRvIGFjY2VzcyB3c2RsTG9jYXRpb24gezB9Ci1zZXJ2aWNlRGVzY0VycjU9VGhlIGR5bmFtaWMgcG9ydCB7MH0gY2FuIG5vdCBzcGVjaWZ5IGEgc3BhcnNlIGNvbXBvc2l0ZS4KLXNlcnZpY2VEZXNjRXJyNj1DYW4gbm90IHNwZWNpZnkgYSBzcGFyc2UgY29tcG9zaXRlIHdoZW4gY2FsbGluZyBTZXJ2aWNlLmNyZWF0ZURpc3BhdGNoLgotZW5kcG9pbnREZXNjRXJyMT1BeGlzU2VydmljZTogezB9IGRvZXMgbm90IGNvbnRhaW4gYSBTZXJ2aWNlIERlc2NyaXB0aW9uCi1jb252ZXJ0VXRpbHM9Q2Fubm90IGNvbnZlcnQgZnJvbSAgezB9IHRvIHsxfS4gIENoZWNrIHlvdXIgYXBwbGljYXRpb24gZm9yIG1pc21hdGNoZWQgY2xhc3Nlcy4KLXNlcnZpY2VEZWxlZ2F0ZU5vUG9ydD1Db3VsZCBub3QgZmluZCB0aGUgcG9ydCBmb3IgRW5kcG9pbnRSZWZlcmVuY2UgezApCi1zZXJ2aWNlRGVsZWdhdGVQcm94eUVycm9yPVVuYWJsZSB0byBsb2FkIHByb3h5IGNsYXNzZXMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiB7MH0KLXNvYXBNZXNzYWdlQ29udGV4dEVycjE9SWxsZWdhbCBhcmd1bWVudCBlbmNvdW50ZXJlZC4gVGhlIHFuYW1lIGFyZ3VtZW50IGZvciBTT0FQTWVzc2FnZUNvbnRleHQuZ2V0SGVhZGVycyBpcyBudWxsLgotc2luZ2xlVGhyZWFkZWRFeGVjdXRvckVycjE9VGhlIFJ1bm5hYmxlIGNvbW1hbmQgcHJvdmlkZWQgdG8gdGhlIFNpbmdsZVRocmVhZGVkRXhlY3V0b3Igd2FzIG51bGwuICBBIG5vbi1udWxsIGluc3RhbmNlIGlzIHJlcXVpcmVkLgotc2VydmljZURlc2NyaXB0aW9uSW1wbEFkZFBvcnRFcnI9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhZGQgYSBwb3J0IHdpdGggbm8gU2VydmljZURlbGVnYXRlLgotc2VydmljZURlc2NyaXB0aW9uSW1wbFZhbGlkYXRpb25FcnI9VmFsaWRhdGlvbiBlcnJvcjogU0VJIGFuZCBpbXBsZW1lbnRhdGlvbiBwYXJhbWV0ZXJzIGRvIG5vdCBtYXRjaC4gIFBhcmFtZXRlciBudW1iZXIgezB9IG9uIHRoZSBTRUkgaXMgezF9LiAgT24gdGhlIGltcGxlbWVudGF0aW9uIGl0IGlzIHsyfS4gIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpcyB7M30sIHRoZSBtZXRob2QgbmFtZSBpcyB7NH0sIGFuZCB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlIG5hbWUgaXMgezV9LgotcmVzcGVjdEJpbmRpbmdOb3RTcGVjaWZpZWQ9VGhlIFJlc3BlY3RCaW5kaW5nIGZlYXR1cmUgd2FzIG5vdCBzcGVjaWZpZWQuCi1jcmVhdGVIYW5kbGVySW5zdGFuY2VFcnI9VGhlIGNyZWF0ZUhhbmRsZXJJbnN0YW5jZSBtZXRob2Qgd2FzIGludm9rZWQgd2l0aG91dCBhIEhhbmRsZXIgY2xhc3MuCi1kZXN0cm95SGFuZGxlckluc3RhbmNlRXJyPVRoZSBkZXN0cm95SGFuZGxlckluc3RhbmNlIG1ldGhvZCB3YXMgaW52b2tlZCB3aXRob3V0IGEgSGFuZGxlciBjbGFzcy4KLWVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0aW9uPVRoZXJlIGlzIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgd3NkbCBhbmQgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4gIFBsZWFzZSBtYWtlIHN1cmUgYm90aCB1c2UgdGhlIHNhbWUgYmluZGluZyBuYW1lc3BhY2UuICBUaGUgd3NkbCBpcyB7MH0uICBUaGUgYW5ub3RhdGlvbiBpcyB7MX0uCi1sb2FkSGFuZGxlckNoYWluRXJyPVRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgaGFuZGxlciBjaGFpbjogezB9Ci1lbmRwb2ludERlc2NyaXB0aW9uVmFsaWRhdGlvbkVycm9ycz1UaGUgRW5kcG9pbnQgdmFsaWRhdGlvbiBmYWlsZWQgdG8gdmFsaWRhdGUgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiB7MH0KLXNlcnZpY2VOYW1lTWlzbWF0Y2g9VGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgZW5kcG9pbnQgcmVmZXJlbmNlIHswfSBkb2VzIG5vdCBtYXRjaCB0aGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNsaWVudCB7MX0uCi11cGRhdGVFbmRwb2ludEVycm9yPVRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgdGhlIGVuZHBvaW50OiB7MH0KLURCVUNsYXNzTm90Rm91bmQ9VGhlIGNsYXNzLCB7MH0sIGNvdWxkIG5vdCBiZSBmb3VuZCB3aXRoIGNsYXNzbG9hZGVyIHsxfS4KLURCVUNsYXNzTm90Rm91bmQyPVRoZSBjbGFzcywgezB9LCBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCB0aGUgY3VycmVudCBjbGFzc2xvYWRlci4KLVdTRExSZWxhdGl2ZUVycjE9VGhlIHJlbGF0aXZlIGxvY2F0aW9uIHswfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuICBUaGUgcGFyZW50IGxvY2F0aW9uIGlzIHsxfS4gIFRoZSByZXBvcnRlZCBlcnJvciBpcyB7Mn0KLVdTRExSZWxhdGl2ZUVycjI9VGhlIHJlbGF0aXZlIGxvY2F0aW9uIHswfSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuICBUaGUgcGFyZW50IGxvY2F0aW9uIGlzIHsxfS4KLU1pc3NpbmdTZXJ2aWNlTmFtZT1UaGUgc2VydmljZSBuYW1lIHswfSB3YXMgbm90IGZvdW5kIGluIHRoaXMgd3NkbCB7MX0uCi1NaXNzaW5nUG9ydE5hbWU9VGhlIHBvcnQgbmFtZSB7MH0gd2FzIG5vdCBmb3VuZCBpbiB0aGlzIHdzZGwgezF9LgotRmVhdHVyZU5hbWVzcGFjZU5vdFN1cHBvcnRlZD1UaGUgbmFtZXNwYWNlIG9mIHRoaXMgZmVhdHVyZSB7MH0gaXMgbm90IHN1cHBvcnRlZC4KLUFkZHJlc3NpbmdFbmdhZ2VtZW50RXJyb3I9VGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBlbmdhZ2luZyB0aGUgYWRkcmVzc2luZyBtb2R1bGU6IHswfQotTm9XU0FkZHJlc3NpbmdGZWF0dXJlcz1ObyBXUy1BZGRyZXNzaW5nIGZlYXR1cmVzIHdlcmUgc3BlY2lmaWVkLgotZW5kcG9pbnRRTmFtZVNldEVycm9yPSBUaGUgZW5kcG9pbnQgcW5hbWUgezB9IGNhbm5vdCBiZSBzZXQgYmVmb3JlIHRoZSBzZXJ2aWNlIHFuYW1lLgotcmVmZXJlbmNlUGFyYW1ldGVyTnVsbEVycj1UaGUgcmVmZXJlbmNlIHBhcmFtZXRlciBtdXN0IGJlIHNldC4KLXJlZmVyZW5jZVByb3BlcnR5TnVsbEVycj1UaGUgcmVmZXJlbmNlIHByb3BlcnR5IG11c3QgYmUgc2V0LgotbWV0YURhdGFQYXJhbWV0ZXJOdWxsRXJyPVRoZSBtZXRhIGRhdGEgZWxlbWVudCBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQuCi1qYXhiQ29udGV4dEZhaWx1cmU9VGhlIEpBWEJDb250ZXh0IGNvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcjogezB9Ci1lbmRwb2ludFJlZkNvbnN0cnVjdGlvbkZhaWx1cmU9VW5hYmxlIHRvIGNyZWF0ZSB0aGUgVzNDIGVuZHBvaW50IHJlZmVyZW5jZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvciB7MH0KLWVuZHBvaW50UmVmQ29uc3RydWN0aW9uRmFpbHVyZTI9VW5hYmxlIHRvIGNyZWF0ZSB0aGUgc3VibWlzc2lvbiBlbmRwb2ludCByZWZlcmVuY2UgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3IgezB9Ci1lbmRwb2ludFJlZkNvbnN0cnVjdGlvbkZhaWx1cmUzPVVuYWJsZSB0byBjcmVhdGUgdGhlIGVuZHBvaW50IHJlZmVyZW5jZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvciB7MH0KLWVuZHBvaW50UmVmZXJlbmNlV3JpdGVFcnJvcjE9VGhlIHRyYW5zZm9ybSBSZXN1bHQgb2JqZWN0IGlzIG51bGwuICBUaGUgd3JpdGVUbygpIG1ldGhvZCBjYW5ub3QgY29udGludWUuCi1lbmRwb2ludFJlZmVyZW5jZVdyaXRlRXJyb3IyPVRoZSBXM0MgZW5kcG9pbnQgcmVmZXJlbmNlIHdyaXRlVG8oKSBtZXRob2QgZmFpbGVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiB7MH0KLW10b21UaHJlc2hvbGRFcnI9TVRPTSB0aHJlc2hvbGQgc2l6ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8uIEl0IHdhcyB7MH0KLW10b21GZWF0dXJlRXJyPVRoZSBNVE9NRmVhdHVyZSB3YXMgbm90IHNwZWNpZmllZC4KLW10b21Bbm5vdGF0aW9uRXJyPVRoZSBATVRPTSBhbm5vdGF0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotYmluZGluZ1Byb3ZpZGVyRXJyMT1CaW5kaW5nUHJvdmlkZXIgaGFzIGJlZW4gY29maWd1cmVkIGZvciBuYW1lc3BhY2UgezB9LCBidXQgYSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgZm9yIG5hbWVzcGFjZSB7MX0uCi1iaW5kaW5nTWV0aG9kTm90U3VwcG9ydGVkPVRoZSBtZXRob2QgezB9IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBjdXJyZW50IGJpbmRpbmc6IHsxfQotd2ViU2VydmljZUNvbnRleHRFcnIxPVRoZSBNZXNzYWdlQ29udGV4dCBvYmplY3QgaXMgbm90IGF2YWlsYWJsZS4KLWludmFsaWRFbmRwb2ludFJlZmVyZW5jZT1BbiBlbmRwb2ludCByZWZlcmVuY2UgaXMgaW52YWxpZC4gIFRoZSByZXBvcnRlZCBlcnJvciBpczogezB9Ci1kaXNwYXRjaE5vRW5kcG9pbnRSZWZlcmVuY2U9QW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBwZXJmb3JtIGEgY3JlYXRlRGlzcGF0Y2ggd2l0aG91dCBhbiBlbmRwb2ludCByZWZlcmVuY2UuCi1kaXNwYXRjaE5vRW5kcG9pbnRSZWZlcmVuY2UyPUFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gcGVyZm9ybSBhIGdldFBvcnQgd2l0aG91dCBhbiBlbmRwb2ludCByZWZlcmVuY2UuCi1lbmRwb2ludERlc2NyaXB0aW9uQ29uc3RydWN0aW9uRmFpbHVyZT1UaGUgY3JlYXRlRGlzcGF0Y2ggbWV0aG9kIHdhcyB1bmFibGUgdG8gY3JlYXRlIGFuIGVuZHBvaW50IGRlc2NyaXB0aW9uIGZvciBlbmRwb2ludCByZWZlcmVuY2UgezB9Ci1pbnZhbGlkV1NBbm5vdGF0aW9uPUludmFsaWQgb3IgdW5zdXBwb3J0ZWQgV2ViU2VydmljZUZlYXR1cmUgYW5ub3RhdGlvbiB7MH0KLWludmFsaWRXU0ZlYXR1cmU9SW52YWxpZCBvciB1bnN1cHBvcnRlZCBXZWJTZXJ2aWNlRmVhdHVyZSBmZWF0dXJlIHswfQotcmVmZXJlbmNlUGFyYW1ldGVyQ29uc3RydWN0aW9uRXJyPUEgcHJvYmxlbSBvY2N1cmVkIGR1cmluZyB0aGUgYnVpbGRpbmcgb2YgdGhlIHJlZmVyZW5jZSBwYXJhbWV0ZXIgbGlzdC4gU2VlIHRoZSBuZXN0ZWQgZXhjZXB0aW9uIGZvciBkZXRhaWxzLgotZW5kcG9pbnRVcGRhdGVFcnJvcj1BbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGVuZHBvaW50IHVwZGF0ZQotZW5kcG9pbnRSZWZDcmVhdGlvbkVycm9yPUFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgYW4gZW5kcG9pbnQgcmVmZXJlbmNlLgotbXRvbUF0dGFjaEVycj1VbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBhdHRhY2htZW50Ci1tdG9tRW5hYmxlRXJyPVVuYWJsZSB0byBlbmFibGUgbXRvbS4KLW1pc3NpbmdJbnZvY2F0aW9uQ29udHJvbGxlcj1BbiBpbnZvY2F0aW9uIGNvbnRyb2xsZXIgb2JqZWN0IHdhcyBub3QgZm91bmQuCi11bmtub3duQ2xhc3NUeXBlPVVua25vd24gY2xhc3MgdHlwZSB7MH0KLWF4aXNFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlFcnI9Q2Fubm90IGNyZWF0ZSBhbiBlbmRwb2ludCByZWZlcmVuY2UgYmVjYXVzZSB0aGUgc2VydmljZSBuYW1lIGlzIG51bGwsIGFuZCB0aGUgcG9ydCBuYW1lIGlzIHNldCB0byB7MH0KLWF4aXNFbmRwb2ludFJlZmVyZW5jZUZhY3RvcnlFcnIyPUNhbm5vdCBjcmVhdGUgYW4gZW5kcG9pbnQgcmVmZXJlbmNlIGJlY2F1c2UgdGhlIGFkZHJlc3MsIHNlcnZpY2UgbmFtZSwgYW5kL29yIHBvcnQgbmFtZSBhcmUgbnVsbC4KLWRpc3BhdGNoSW52YWxpZFR5cGVXaXRoTW9kZT1VbnN1cHBvcnRlZCBEaXNwYXRjaCBUeXBlOiBEaXNwYXRjaCB0eXBlIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIGNhbm5vdCBiZSB1c2VkIHdpdGggbWVzc2FnZXMgaW4gUGF5bG9hZCBtb2RlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L1NlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9yZWdpc3RyeS9TZXJ2ZXJDb25maWd1cmF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY5NTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3JlZ2lzdHJ5L1NlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3NpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5jb25maWcuQWRkcmVzc2luZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5jb25maWcuTVRPTUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5jb25maWcuUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmdGZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTZXJ2ZXJDb25maWd1cmF0b3I+IG1hcCA9Ci0gICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFNlcnZlckNvbmZpZ3VyYXRvcj4oKTsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICBtYXAucHV0KEFkZHJlc3NpbmdGZWF0dXJlLklELCBuZXcgQWRkcmVzc2luZ0NvbmZpZ3VyYXRvcigpKTsKLSAgICAgICAgbWFwLnB1dChTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuSUQsIG5ldyBBZGRyZXNzaW5nQ29uZmlndXJhdG9yKCkpOwotICAgICAgICBtYXAucHV0KE1UT01GZWF0dXJlLklELCBuZXcgTVRPTUNvbmZpZ3VyYXRvcigpKTsKLSAgICAgICAgbWFwLnB1dChSZXNwZWN0QmluZGluZ0ZlYXR1cmUuSUQsIG5ldyBSZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRvcihTdHJpbmcgaWQsIFNlcnZlckNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLSAgICAgICAgbWFwLnB1dChpZCwgY29uZmlndXJhdG9yKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKFN0cmluZyBpZCkgewotICAgICAgICByZXR1cm4gbWFwLmdldChpZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0SWRzKCkgewotICAgICAgICByZXR1cm4gbWFwLmtleVNldCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTT0FQQmluZGluZyhTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiAodXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykgfHwKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORyl8fCAKLSAgICAgICAgICAgICAgICB1cmwuZXF1YWxzKFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19CSU5ESU5HKSB8fAotICAgICAgICAgICAgICAgIHVybC5lcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMUpNU19NVE9NX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX0JJTkRJTkcpIHx8Ci0gICAgICAgICAgICAgICAgdXJsLmVxdWFscyhNRFFDb25zdGFudHMuU09BUDEySk1TX01UT01fQklORElORykgKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9jb25maWcvQWRkcmVzc2luZ0NvbmZpZ3VyYXRvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9BZGRyZXNzaW5nQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZmU2MDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9BZGRyZXNzaW5nQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zZXJ2ZXIuY29uZmlnOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3Npbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5TZXJ2ZXJDb25maWd1cmF0b3I7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZWdpc3RyeS5TZXJ2ZXJDb25maWd1cmF0b3JSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHdpbGwgZW5hYmxlL2Rpc2FibGUgV1MtQWRkcmVzc2luZyBmb3IgYSBKQVgtV1MgMi4xIHdlYiBzZXJ2aWNlDQotICogZW5kcG9pbnQsIGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIHBhc3NlZCB0byBpdCB2aWEgYW4gPGNvZGU+QWRkcmVzc2luZzwvY29kZT4NCi0gKiBhbm5vdGF0aW9uIGFuZC9vciBhIDxjb2RlPlN1Ym1pc3Npb25BZGRyZXNzaW5nPC9jb2RlPiBhbm5vdGF0aW9uIGZyb20gdGhlDQotICogZW5kcG9pbnQgaW1wbGVtZW50YXRpb24gYmVhbi4NCi0gKiANCi0gKiBAc2VlIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmcNCi0gKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2luZy5TdWJtaXNzaW9uQWRkcmVzc2luZw0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzaW5nQ29uZmlndXJhdG9yIGltcGxlbWVudHMgU2VydmVyQ29uZmlndXJhdG9yIHsNCi0NCi0gICAgLyoNCi0gICAgICogIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuU2VydmVyQ29uZmlndXJhdG9yI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb24pDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uKSB7DQotICAgIAlBZGRyZXNzaW5nIGFkZHJlc3NpbmcgPQ0KLSAgICAJCShBZGRyZXNzaW5nKSAoKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKSBlbmRwb2ludERlc2NyaXB0aW9uKS5nZXRBbm5vRmVhdHVyZShBZGRyZXNzaW5nRmVhdHVyZS5JRCk7DQotICAgIAlTdWJtaXNzaW9uQWRkcmVzc2luZyBzdWJtaXNzaW9uQWRkcmVzc2luZyA9DQotICAgIAkJKFN1Ym1pc3Npb25BZGRyZXNzaW5nKSAoKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKSBlbmRwb2ludERlc2NyaXB0aW9uKS5nZXRBbm5vRmVhdHVyZShTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmUuSUQpOw0KLSAgICAJUGFyYW1ldGVyIG5hbWVzcGFjZSA9IG5ldyBQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04sIG51bGwpOw0KLSAgICAJUGFyYW1ldGVyIGRpc2FibGVkID0gbmV3IFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMsICJmYWxzZSIpOw0KLSAgICAJUGFyYW1ldGVyIHJlcXVpcmVkID0gbmV3IFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSLCBBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQpOw0KLSAgICAJDQotICAgIAlpZiAoYWRkcmVzc2luZyAhPSBudWxsICYmIHN1Ym1pc3Npb25BZGRyZXNzaW5nICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvL0JvdGggYW5ub3RhdGlvbnMgbXVzdCBoYXZlIGJlZW4gc3BlY2lmaWVkLg0KLSAgICAgICAgICAgIGJvb2xlYW4gdzNjQWRkcmVzc2luZ0VuYWJsZWQgPSBhZGRyZXNzaW5nLmVuYWJsZWQoKTsNCi0gICAgICAgICAgICBib29sZWFuIHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCA9IHN1Ym1pc3Npb25BZGRyZXNzaW5nLmVuYWJsZWQoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBpZiAodzNjQWRkcmVzc2luZ0VuYWJsZWQgJiYgc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgCW5hbWVzcGFjZS5zZXRWYWx1ZShudWxsKTsNCi0NCi0gICAgICAgICAgICAgICAgYm9vbGVhbiB3M2NBZGRyZXNzaW5nUmVxdWlyZWQgPSBhZGRyZXNzaW5nLnJlcXVpcmVkKCk7DQotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VibWlzc2lvbkFkZHJlc3NpbmdSZXF1aXJlZCA9IHN1Ym1pc3Npb25BZGRyZXNzaW5nLnJlcXVpcmVkKCk7DQotDQotICAgICAgICAgICAgICAgIGlmICh3M2NBZGRyZXNzaW5nUmVxdWlyZWQgfHwgc3VibWlzc2lvbkFkZHJlc3NpbmdSZXF1aXJlZCkNCi0gICAgICAgICAgICAgICAgCXJlcXVpcmVkLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKHczY0FkZHJlc3NpbmdFbmFibGVkKSB7DQotICAgICAgICAgICAgCW5hbWVzcGFjZS5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOw0KLSAgICAgICAgICAgIAkNCi0gICAgICAgICAgICAJaWYgKGFkZHJlc3NpbmcucmVxdWlyZWQoKSkNCi0gICAgICAgICAgICAJCXJlcXVpcmVkLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nRW5hYmxlZCkgew0KLSAgICAgICAgICAgIAluYW1lc3BhY2Uuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UpOw0KLSAgICAgICAgICAgIAkNCi0gICAgICAgICAgICAJaWYgKHN1Ym1pc3Npb25BZGRyZXNzaW5nLnJlcXVpcmVkKCkpDQotICAgICAgICAgICAgCQlyZXF1aXJlZC5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAJZGlzYWJsZWQuc2V0VmFsdWUoInRydWUiKTsNCi0gICAgICAgICAgICB9DQotICAgIAl9DQotICAgIAllbHNlIGlmIChhZGRyZXNzaW5nICE9IG51bGwpIHsNCi0gICAgICAgICAgICAvL1RoZSBBZGRyZXNzaW5nIGFubm90YXRpb24gbXVzdCBoYXZlIGJlZW4gc3BlY2lmaWVkLg0KLSAgICAgICAgICAgIGJvb2xlYW4gdzNjQWRkcmVzc2luZ0VuYWJsZWQgPSBhZGRyZXNzaW5nLmVuYWJsZWQoKTsNCi0NCi0gICAgICAgICAgICBpZiAodzNjQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAJbmFtZXNwYWNlLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuRmluYWwuV1NBX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgCQ0KLSAgICAgICAgICAgIAlpZiAoYWRkcmVzc2luZy5yZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgIAkJcmVxdWlyZWQuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgCW5hbWVzcGFjZS5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgfQ0KLSAgICAJfQ0KLSAgICAJZWxzZSBpZiAoc3VibWlzc2lvbkFkZHJlc3NpbmcgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIC8vVGhlIFN1Ym1pc3Npb25BZGRyZXNzaW5nIGFubm90YXRpb24gbXVzdCBoYXZlIGJlZW4gc3BlY2lmaWVkLg0KLSAgICAgICAgICAgIGJvb2xlYW4gc3VibWlzc2lvbkFkZHJlc3NpbmdFbmFibGVkID0gc3VibWlzc2lvbkFkZHJlc3NpbmcuZW5hYmxlZCgpOw0KLQ0KLSAgICAgICAgICAgIGlmIChzdWJtaXNzaW9uQWRkcmVzc2luZ0VuYWJsZWQpIHsNCi0gICAgICAgICAgICAJbmFtZXNwYWNlLnNldFZhbHVlKEFkZHJlc3NpbmdDb25zdGFudHMuU3VibWlzc2lvbi5XU0FfTkFNRVNQQUNFKTsNCi0gICAgICAgICAgICAJDQotICAgICAgICAgICAgCWlmIChzdWJtaXNzaW9uQWRkcmVzc2luZy5yZXF1aXJlZCgpKQ0KLSAgICAgICAgICAgIAkJcmVxdWlyZWQuc2V0VmFsdWUoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgCW5hbWVzcGFjZS5zZXRWYWx1ZShBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UpOw0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCQkNCi0gICAgCX0NCi0gICAgCWVsc2Ugew0KLSAgICAgICAgICAgIC8vSWYgbmVpdGhlciB3ZXJlIHNwZWNpZmllZCB0aGVuIHRoaXMgY29uZmlndXJhdG9yIHNob3VsZCBuZXZlciBydW4uDQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIk5vV1NBZGRyZXNzaW5nRmVhdHVyZXMiKSk7DQotICAgIAl9DQotICAgIAkNCi0gICAgCXRyeSB7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgCQlzZXJ2aWNlLmFkZFBhcmFtZXRlcihuYW1lc3BhY2UpOw0KLSAgICAJCXNlcnZpY2UuYWRkUGFyYW1ldGVyKGRpc2FibGVkKTsNCi0gICAgCQlzZXJ2aWNlLmFkZFBhcmFtZXRlcihyZXF1aXJlZCk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZWQpOw0KLSAgICAJCWlmIChKYXZhVXRpbHMuaXNGYWxzZUV4cGxpY2l0bHkodmFsdWUpKSB7DQotICAgIAkJCVNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IGVuZHBvaW50RGVzY3JpcHRpb24uZ2V0U2VydmljZURlc2NyaXB0aW9uKCk7DQotICAgIAkJCUF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBzZC5nZXRBeGlzQ29uZmlnQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotICAgIAkJCWlmICghYXhpc0NvbmZpZy5pc0VuZ2FnZWQoQ29uc3RhbnRzLk1PRFVMRV9BRERSRVNTSU5HKSkNCi0gICAgCQkJCWF4aXNDb25maWcuZW5nYWdlTW9kdWxlKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORyk7DQotICAgIAkJfQ0KLSAgICAJfQ0KLSAgICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigNCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoIkFkZHJlc3NpbmdFbmdhZ2VtZW50RXJyb3IiLCBlLnRvU3RyaW5nKCkpKTsNCi0gICAgCX0NCi0gICAgfQ0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5TZXJ2ZXJDb25maWd1cmF0b3Ijc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBiaW5kaW5nSWQpIHsNCi0gICAgICAgIHJldHVybiBTZXJ2ZXJDb25maWd1cmF0b3JSZWdpc3RyeS5pc1NPQVBCaW5kaW5nKGJpbmRpbmdJZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9NVE9NQ29uZmlndXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL01UT01Db25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE3NzIxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zZXJ2ZXIvY29uZmlnL01UT01Db25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2VydmVyLmNvbmZpZzsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnJlZ2lzdHJ5LlNlcnZlckNvbmZpZ3VyYXRvclJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT007DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLk1UT01GZWF0dXJlOw0KLQ0KLS8qKg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIE1UT01Db25maWd1cmF0b3IgaW1wbGVtZW50cyBTZXJ2ZXJDb25maWd1cmF0b3Igew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTVRPTUNvbmZpZ3VyYXRvci5jbGFzcyk7DQotICAgIA0KLSAgICAvKg0KLSAgICAgKiAobm9uLUphdmFkb2MpDQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLldlYlNlcnZpY2VGZWF0dXJlQ29uZmlndXJhdG9yI2NvbmZpZ3VyZShvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb24pDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2NyaXB0aW9uKSB7DQotICAgIAlNVE9NIG10b21Bbm5vYXRpb24gPQ0KLSAgICAJCShNVE9NKSAoKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKSBlbmRwb2ludERlc2NyaXB0aW9uKS5nZXRBbm5vRmVhdHVyZShNVE9NRmVhdHVyZS5JRCk7DQotICAgIAlBeGlzU2VydmljZSBzZXJ2aWNlID0gZW5kcG9pbnREZXNjcmlwdGlvbi5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAJDQotICAgIAkvL0Rpc2FibGUgTVRPTQ0KLSAgICAJUGFyYW1ldGVyIGVuYWJsZU1UT00gPSBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLCBCb29sZWFuLkZBTFNFKTsNCi0gICAgCVBhcmFtZXRlciB0aHJlc2hvbGQgPSBuZXcgUGFyYW1ldGVyKENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1UT01fVEhSRVNIT0xELCAwKTsNCi0gICAgICANCi0gICAgICAgIGlmIChtdG9tQW5ub2F0aW9uID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lg0KLSAgICAgICAgICAgICAgbWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibXRvbUFubm90YXRpb25FcnIiKSk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIC8vRW5hYmxlIE1UT00uDQotICAgIAlpZiAobXRvbUFubm9hdGlvbi5lbmFibGVkKCkpIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmFibGluZyBNVE9NIHZpYSBhbm5vdGF0aW9uLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgCSAgICBlbmFibGVNVE9NLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7DQotICAgIAl9DQotICAgICAgICANCi0gICAgICAgIC8vU2V0IHRoZSB0aHJlc2hvbGQgdmFsdWUuDQotICAgICAgICBpZiAobXRvbUFubm9hdGlvbi50aHJlc2hvbGQoKSA+IDApIHsNCi0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJTZXR0aW5nIE1UT00gdGhyZXNob2xkIHRvIFsiICsgbXRvbUFubm9hdGlvbi50aHJlc2hvbGQoKSArICJdLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB0aHJlc2hvbGQuc2V0VmFsdWUobXRvbUFubm9hdGlvbi50aHJlc2hvbGQoKSk7DQotICAgICAgICB9DQotICAgIAkNCi0gICAgCXRyeSB7DQotICAgIAkgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIoZW5hYmxlTVRPTSk7DQotICAgICAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIodGhyZXNob2xkKTsNCi0gICAgCX0NCi0gICAgCWNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgibXRvbUVuYWJsZUVyciIpLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOyAgICAJCQ0KLSAgICAJfQ0KLSAgICB9ICAgIA0KLQ0KLSAgICAvKg0KLSAgICAgKiAgKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5TZXJ2ZXJDb25maWd1cmF0b3Ijc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBiaW5kaW5nSWQpIHsNCi0gICAgICAgIHJldHVybiBTZXJ2ZXJDb25maWd1cmF0b3JSZWdpc3RyeS5pc1NPQVBCaW5kaW5nKGJpbmRpbmdJZCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2VydmVyL2NvbmZpZy9SZXNwZWN0QmluZGluZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTljYmY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NlcnZlci9jb25maWcvUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNlcnZlci5jb25maWc7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uSmF2YTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uV1NETDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mZWF0dXJlLlNlcnZlckNvbmZpZ3VyYXRvcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KLQ0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsNCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLS8qKg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5TZXJ2ZXJDb25maWd1cmF0b3I8L2NvZGU+IGludGVyZmFjZSB0aGF0IHdpbGwNCi0gKiBjb25maWd1cmUgdGhlIGVuZHBvaW50IGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIDxjb2RlPlJlc3BlY3RCaW5kaW5nPC9jb2RlPg0KLSAqIGF0dHJpYnV0ZS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IgaW1wbGVtZW50cyBTZXJ2ZXJDb25maWd1cmF0b3Igew0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUmVzcGVjdEJpbmRpbmdDb25maWd1cmF0b3IuY2xhc3MpOyANCi0gICAgDQotICAgIC8qDQotICAgICAqIChub24tSmF2YWRvYykNCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZlYXR1cmUuV2ViU2VydmljZUZlYXR1cmVDb25maWd1cmF0b3IjY29uZmlndXJlKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbikNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzY3JpcHRpb24pIHsNCi0gICAgCVJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24gPQ0KLSAgICAJCShSZXNwZWN0QmluZGluZykgKChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSkgZW5kcG9pbnREZXNjcmlwdGlvbikuZ2V0QW5ub0ZlYXR1cmUoUmVzcGVjdEJpbmRpbmdGZWF0dXJlLklEKTsNCi0gICAgCQ0KLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlNldHRpbmcgcmVzcGVjdEJpbmRpbmcgdG8gIiArIGFubm90YXRpb24uZW5hYmxlZCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbi5zZXRSZXNwZWN0QmluZGluZyhhbm5vdGF0aW9uLmVuYWJsZWQoKSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgLy8gT25jZSB3ZSBrbm93IHRoYXQgQFJlc3BlY3RCaW5kaW5nIGlzIGVuYWJsZWQsIHdlIGhhdmUgdG8gZmluZA0KLSAgICAgICAgICAgIC8vIGFueSBiaW5kaW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgYXZhaWxhYmxlIGFuZCBzZWUgd2hpY2ggb25lcw0KLSAgICAgICAgICAgIC8vIGhhdmUgdGhlICJyZXF1aXJlZCIgZmxhZyBzZXQgdG8gdHJ1ZS4NCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uV1NETCBlZHcgPSAoRW5kcG9pbnREZXNjcmlwdGlvbldTREwpIGVuZHBvaW50RGVzY3JpcHRpb247DQotICAgICAgICAgICAgQmluZGluZyBibmQgPSBlZHcuZ2V0V1NETEJpbmRpbmcoKTsNCi0gICAgICAgICAgICBpZiAoYm5kICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgTGlzdCBsID0gYm5kLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOw0KLSAgICAgICAgICAgICAgICBpZiAobCA9PSBudWxsIHx8IGwuc2l6ZSgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3VuZC4iKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2hlY2tpbmcgbGlzdCBvZiAiICsgbC5zaXplKCkgKyAiIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIHJlcXVpcmVkIGJpbmRpbmdzLiIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gbC5pdGVyYXRvcigpOw0KLSAgICAgICAgICAgICAgICAgICAgTGlzdCB1bnVzZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGkubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgU09BUEJpbmRpbmcgfHwgZSBpbnN0YW5jZW9mIFNPQVAxMkJpbmRpbmcpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCB1ZSA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXFkID0gdWUuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgicmVxdWlyZWQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcWQuZXF1YWxzKCJ0cnVlIikgfHwgcmVxZC5lcXVhbHMoIlRSVUUiKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBhIHJlcXVpcmVkIGVsZW1lbnQ6ICIgKyBlLmdldEVsZW1lbnRUeXBlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnREZXNjcmlwdGlvbi5hZGRSZXF1aXJlZEJpbmRpbmcoZS5nZXRFbGVtZW50VHlwZSgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZEVsZW1lbnRzLmFkZChlLmdldEVsZW1lbnRUeXBlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRSZXF1aXJlZCgpICE9IG51bGwgJiYgZS5nZXRSZXF1aXJlZCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIGEgcmVxdWlyZWQgZWxlbWVudDogIiArIGUuZ2V0RWxlbWVudFR5cGUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NyaXB0aW9uLmFkZFJlcXVpcmVkQmluZGluZyhlLmdldEVsZW1lbnRUeXBlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW51c2VkRWxlbWVudHMuYWRkKGUuZ2V0RWxlbWVudFR5cGUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBmb2xsb3dpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB3ZXJlIGZvdW5kLCBidXQgd2VyZSBub3QgcmVxdWlyZWQuIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCB1bnVzZWRFbGVtZW50cy5zaXplKCk7ICsrbikNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJbIiArIGkgKyAiXSAtICIgKyB1bnVzZWRFbGVtZW50cy5nZXQobikpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgZWxzZSB7DQotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTm8gQFJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24gd2FzIGZvdW5kLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoNCi0gICAgICogKG5vbi1KYXZhZG9jKQ0KLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZmVhdHVyZS5TZXJ2ZXJDb25maWd1cmF0b3Ijc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZykNCi0gICAgICovDQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBiaW5kaW5nSWQpIHsNCi0gICAgICAgIHJldHVybiB0cnVlOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQmFzZVdTRExMb2NhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0Jhc2VXU0RMTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWY5OGQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQmFzZVdTRExMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLkV4Y2VwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFdTREw0SiBpbnRlcmZhY2UgdGhhdCAKLSAqIHdpbGwgYmUgc3VwcGxpZWQgdG8gYSBXU0RMUmVhZGVyIGluc3RhbmNlLiBJdHMgcHJpbWFyeSBnb2FsIGlzIHRvIGFzc2lzdCAKLSAqIHdpdGggbG9jYXRpbmcgaW1wb3J0ZWQgV1NETCBkb2N1bWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlV1NETExvY2F0b3IgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhCYXNlV1NETExvY2F0b3IuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlVVJJLCBsYXN0ZXN0SW1wb3J0VVJJOwotICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBiYXNlSW5wdXRTdHJlYW07Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIElucHV0U3RyZWFtIHBvaW50ZWQgYXQgYW4gaW1wb3J0ZWQgd3NkbCBwYXRobmFtZSByZWxhdGl2ZQotICAgICAqIHRvIHRoZSBwYXJlbnQgcmVzb3VyY2Ugb3IgbG9hZFN0cmF0ZWd5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbXBvcnRQYXRoIGlkZW50aWZpZXMgdGhlIFdTREwgZmlsZSB3aXRoaW4gdGhlIGNvbnRleHQgCi0gICAgICogQHJldHVybiBhbiBzdHJlYW0gb2YgdGhlIFdTREwgZmlsZQotICAgICAqLwotICAgIGFic3RyYWN0IHByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgaW1wb3J0UGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIGZvciBhIGxldmVsIG9mIGluZGlyZWN0aW9uLCBzdWNoIGFzIGEgY2F0YWxvZywgd2hlbiBpbXBvcnRpbmcgVVJJcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1wb3J0VVJJIGEgVVJJIHNwZWNpZnlpbmcgdGhlIGRvY3VtZW50IHRvIGltcG9ydAotICAgICAqIEBwYXJhbSBwYXJlbnQgYSBVUkkgc3BlY2lmeWluZyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudCBkb2N1bWVudCBkb2luZwotICAgICAqIHRoZSBpbXBvcnRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBpbXBvcnQgbG9jYXRpb24sIG9yIG51bGwgaWYgbm8gaW5kaXJlY3Rpb24gaXMgcGVyZm9ybWVkCi0gICAgICovCi0gICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWRpcmVjdGVkVVJJKFN0cmluZyBpbXBvcnRVUkksIFN0cmluZyBwYXJlbnQpOwotICAgIAotICAgIC8qKgotICAgICAgKiBSZXR1cm5zIGFuIElucHV0U291cmNlICJwb2ludGVkIGF0IiB0aGUgYmFzZSBkb2N1bWVudC4KLSAgICAgICovCi0gICAgcHVibGljIElucHV0U291cmNlIGdldEJhc2VJbnB1dFNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShiYXNlSW5wdXRTdHJlYW0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSW5wdXRTb3VyY2UgcG9pbnRlZCBhdCBhbiBpbXBvcnRlZCB3c2RsIGRvY3VtZW50IHdob3NlCi0gICAgICogcGFyZW50IGRvY3VtZW50IHdhcyBsb2NhdGVkIGF0IHBhcmVudExvY2F0aW9uIGFuZCB3aG9zZQotICAgICAqIHJlbGF0aXZlIGxvY2F0aW9uIHRvIHRoZSBwYXJlbnQgZG9jdW1lbnQgaXMgc3BlY2lmaWVkIGJ5Ci0gICAgICogcmVsYXRpdmVMb2NhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnRMb2NhdGlvbiBhIFVSSSBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgICAgKiBkb2N1bWVudCBkb2luZyB0aGUgaW1wb3J0aW5nLgotICAgICAqIEBwYXJhbSByZWxhdGl2ZUxvY2F0aW9uIGEgVVJJIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZQotICAgICAqIGRvY3VtZW50IHRvIGltcG9ydCwgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBkb2N1bWVudCdzIGxvY2F0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBJbnB1dFNvdXJjZSBnZXRJbXBvcnRJbnB1dFNvdXJjZShTdHJpbmcgcGFyZW50TG9jYXRpb24sIFN0cmluZyByZWxhdGl2ZUxvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJnZXRJbXBvcnRJbnB1dFNvdXJjZSwgcGFyZW50TG9jYXRpb249ICIgKyBwYXJlbnRMb2NhdGlvbiArIAotICAgICAgICAgICAgICAgICAgICAiIHJlbGF0aXZlTG9jYXRpb249ICIgKyByZWxhdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIFVSTCBhYnNvbHV0ZVVSTCA9IG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHJlZGlyZWN0ZWRVUkkgPSBnZXRSZWRpcmVjdGVkVVJJKHJlbGF0aXZlTG9jYXRpb24sIHBhcmVudExvY2F0aW9uKTsKLSAgICAgICAgaWYgIChyZWRpcmVjdGVkVVJJICE9IG51bGwpCi0gICAgICAgIAlyZWxhdGl2ZUxvY2F0aW9uID0gcmVkaXJlY3RlZFVSSTsKLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZUltcG9ydChyZWxhdGl2ZUxvY2F0aW9uKSkgewotICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVVUkwgPSBuZXcgVVJMKHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICBpcyA9IGFic29sdXRlVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdGVzdEltcG9ydFVSSSA9IGFic29sdXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlTG9jYXRpb24uc3RhcnRzV2l0aCgiZmlsZTovLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlTG9jYXRpb24gPSAiZmlsZTovIiArIHJlbGF0aXZlTG9jYXRpb24uc3Vic3RyaW5nKCJmaWxlOi8vIi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVVUkwgPSBuZXcgVVJMKHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gYWJzb2x1dGVVUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rlc3RJbXBvcnRVUkkgPSBhYnNvbHV0ZVVSTC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSSSBmaWxlVVJJID0gbmV3IFVSSShyZWxhdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlVVJMID0gZmlsZVVSSS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBhYnNvbHV0ZVVSTC5vcGVuU3RyZWFtKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rlc3RJbXBvcnRVUkkgPSBhYnNvbHV0ZVVSTC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gRkZEQyBjb2RlIG5lZWRlZCAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoaXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIHRyeXsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVVUkwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGFic29sdXRlVVJMLm9wZW5TdHJlYW0oKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGVzdEltcG9ydFVSSSA9IGFic29sdXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgICAgICAgICAgICAgLy9ObyBGRkRDIGNvZGUgbmVlZGVkICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGltcG9ydFBhdGggPSBub3JtYWxpemVQYXRoKHBhcmVudExvY2F0aW9uLCByZWxhdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBpcyA9IGdldElucHV0U3RyZWFtKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgICAgIGxhc3Rlc3RJbXBvcnRVUkkgPSBpbXBvcnRQYXRoOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgRXhjZXB0aW9uRmFjdG9yeS5tYWtlV2ViU2VydmljZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgiV1NETFJlbGF0aXZlRXJyMSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlTG9jYXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExvY2F0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaXMgPT0gbnVsbCl7Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJXU0RMUmVsYXRpdmVFcnIyIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVMb2NhdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TG9jYXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRlZCBmaWxlOiAiICsgcmVsYXRpdmVMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIFVSSSByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBiYXNlIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VVUkk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgVVJJIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgaW1wb3J0IGRvY3VtZW50Ci0gICAgICogdG8gYmUgcmVzb2x2ZWQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVzb2x2aW5nIG5lc3RlZCBpbXBvcnRzLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGF0ZXN0SW1wb3J0VVJJKCkgewotICAgICAgICByZXR1cm4gbGFzdGVzdEltcG9ydFVSSTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBwYXJhbSByYXdVUkkgdGhlIHVyaSBmb3IgYmFzZSB3c2RsIGZpbGUsIHdoaWNoIGNvdWxkIGJlIHRoZSBmb3JtIG9mCi0gICAgICogICAgICAgICAgTUVUQS1JTkYvYmFzZS53c2RsIG9yIGp1c3QgYmFzZS53c2RsLCBidXQgaXQgY2FuIGJlIC9iYXNlLndzZGwgKG5vIGxlYWRpbmcgc2xhc2ggYWNjb3JkaW5nIHRvIHNwZWMpCi0gICAgICogQHJldHVybiB0aGUgdXJpIHdoaWNoIGlzIG9uZSBsZXZlbCB1cCB0aGUgcmF3IHVyaSB3aXRoIHRoZSB0cmFpbGluZyBzbGFzaCAoaWYgbm90IGVtcHR5KQotICAgICAqIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFVSSShTdHJpbmcgcmF3VVJJKSB7Ci0gICAgCWludCBpZHggPSByYXdVUkkubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgaWYoaWR4ID4gMCkgewotICAgICAgICAJcmF3VVJJID0gcmF3VVJJLnN1YnN0cmluZygwLCBpZHggKyAxKTsKLSAgICAgICAgICAgIHJldHVybiByYXdVUkk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gdGhpcyBtYXkgYmUgYW4gYWJzb2x1dGUgZmlsZSByZWZlcmVuY2UKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgIAlpZHggPSByYXdVUkkubGFzdEluZGV4T2YoJ1xcJyk7Ci0gICAgICAgIAlpZihpZHggPiAwKSB7Ci0gICAgICAgIAkJcmF3VVJJID0gcmF3VVJJLnN1YnN0cmluZygwLCBpZHggKyAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmF3VVJJOwotICAgICAgICAJfQotICAgICAgICAJcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnNvbHV0ZUltcG9ydChTdHJpbmcgdXJpKSB7Ci0gICAgICAgIGJvb2xlYW4gYWJzb2x1dGUgPSBmYWxzZTsKLSAgICAgICAgaWYodXJpICE9IG51bGwpewotICAgICAgICAgICAgaWYodXJpLmluZGV4T2YoIjovIikgIT0gLTEpewotICAgICAgICAgICAgICAgIGFic29sdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYodXJpLmluZGV4T2YoIjpcXCIpICE9IC0xKXsKLSAgICAgICAgICAgICAgICBhYnNvbHV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gYWJzb2x1dGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIFppcEZpbGUgY2FuIG5vdCBoYW5kbGUgcmVsYXRpdmUgaW1wb3J0cyBvZiB0aGF0IGhhdmUgZGlyZWN0b3J5IGNvbXBvbmVudHMgCi0gICAgICogb2YgdGhlIGZvcm0gIi4uIi4gIEdpdmVuIGEgJ3JlbGF0aXZlTG9jYXRpb24nIHJlbGF0aXZlIHRvICdwYXJlbnRMb2NhdGlvbicsIHJlcGxhY2UKLSAgICAgKiBhbnkgIi4uIiB3aXRoIGFjdHVhbCBwYXRoIGNvbXBvbmVudCBuYW1lcy4KLSAgICAgKiBAcGFyYW0gcGFyZW50TG9jYXRpb24gUGF0aCByZWxhdGl2ZSB0byB0aGUgbW9kdWxlIHJvb3Qgb2YgdGhlIGZpbGUgdGhhdCBpcyBkb2luZyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0aW5nLgotICAgICAqIEBwYXJhbSByZWxhdGl2ZUxvY2F0aW9uIFBhdGggcmVsYXRpdmUgdG8gdGhlIHBhcmVudExvY2F0aW9uIG9mIHRoZSBmaWxlIHRoYXQgaXMgYmVpbmcgaW1wb3J0ZWQuCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGF0aW5pbmcgdGhlIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgaW1wb3J0ZWQgKGkuZS4gcmVsYXRpdmVMb2NhdGlvbikgdGhhdCBpcwotICAgICAqICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG1vZHVsZSByb290IGFuZCBoYXMgYWxsICIuLiIgYW5kICIuIiBwYXRoIGNvbXBvbmVudHMgcmVtb3ZlZCBhbmQgcmVwbGFjZWQKLSAgICAgKiAgICAgICAgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYWN0dWFsIGRpcmVjdG9yeSBuYW1lLgotICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBXU0RMX1BBVEhfU0VQRVJBVE9SX0NIQVIgPSAnLyc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfUEFUSF9TRVBFUkFUT1IgPQotICAgICAgICAoQ2hhcmFjdGVyLnZhbHVlT2YoV1NETF9QQVRIX1NFUEVSQVRPUl9DSEFSKSkudG9TdHJpbmcoKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgbm9ybWFsaXplUGF0aChTdHJpbmcgcGFyZW50TG9jYXRpb24sIFN0cmluZyByZWxhdGl2ZUxvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJub3JtYWxpemVQYXRoLCBwYXJlbnRMb2NhdGlvbj0gIiArIHBhcmVudExvY2F0aW9uICsgCi0gICAgICAgICAgICAgICAgICAgICIgcmVsYXRpdmVMb2NhdGlvbj0gIiArIHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldCB0aGUgcGF0aCBmcm9tIHRoZSBtb2R1bGUgcm9vdCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltcG9ydGluZyBXU0RMIGZpbGUuCi0gICAgICAgIC8vIE5vdGUgdGhpcyBwYXRoIHdpbGwgZW5kIGluIGEgIi8iIGFuZCB3aWxsIG5vdCBjb250YWluIGFueSAiLi4iIHBhdGggY29tcG9uZW50cy4KLSAgICAgICAgU3RyaW5nIHBhdGhGcm9tUm9vdCA9IGNvbnZlcnRVUkkocGFyZW50TG9jYXRpb24pOwotCi0gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcGF0aCB0byB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIG1vZHVsZSByb290IGJhc2VkIG9uIHRoZSBwYXJlbnQgbG9jYXRpb24sIAotICAgICAgICAvLyByZW1vdmluZyBhbnkgIi4uIiBvciAiLiIgcGF0aCBjb21wb25lbnRzLgotICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aFRvUmVsYXRpdmVMb2NhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aEZyb21Sb290KTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplZFJlbGF0aXZlTG9jYXRpb24gPQotICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihyZWxhdGl2ZUxvY2F0aW9uLCBXU0RMX1BBVEhfU0VQRVJBVE9SKTsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoInBhdGhGcm9tUm9vdCA9ICIgKyBwYXRoRnJvbVJvb3QpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJyZWxhdGl2ZUxvY2F0aW9uID0gIiArIHJlbGF0aXZlTG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICh0b2tlbml6ZWRSZWxhdGl2ZUxvY2F0aW9uLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5leHRUb2tlbiA9IHRva2VuaXplZFJlbGF0aXZlTG9jYXRpb24ubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAobmV4dFRva2VuLmVxdWFscygiLi4iKSkgewotICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIHBhcmVudCBkaXJlY3RvcnksIHNvIGNob3Agb2ZmIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IGluIHRoZSBwYXRoIHRvIGJhY2sKLSAgICAgICAgICAgICAgICAvLyB1cCB0byB0aGUgcGFyZW50IGRpcmVjdG9yeS4gIEZpcnN0IGRlbGV0ZSB0aGUgdHJhaWxpbmcgIi8iIGZyb20gdGhlIHBhdGggaWYgdGhlcmUgCi0gICAgICAgICAgICAgICAgLy8gaXMgb25lLCB0aGVuIGRlbGV0ZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGVuZCBvZiB0aGUgcGF0aCB1bnRpbCB3ZSBmaW5kIHRoZSBuZXh0ICIvIi4KLSAgICAgICAgICAgICAgICBpbnQgY2hhclRvRGVsZXRlID0gcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5sZW5ndGgoKSAtIDE7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhUb1JlbGF0aXZlTG9jYXRpb24uY2hhckF0KGNoYXJUb0RlbGV0ZSkgPT0gV1NETF9QQVRIX1NFUEVSQVRPUl9DSEFSIHx8IAotICAgICAgICAgICAgICAgIAkJcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5jaGFyQXQoY2hhclRvRGVsZXRlKSA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlTG9jYXRpb24uZGVsZXRlQ2hhckF0KGNoYXJUb0RlbGV0ZS0tKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBhdGhUb1JlbGF0aXZlTG9jYXRpb24uY2hhckF0KGNoYXJUb0RlbGV0ZSkgIT0gV1NETF9QQVRIX1NFUEVSQVRPUl9DSEFSICYmIAotICAgICAgICAgICAgICAgIAkJcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5jaGFyQXQoY2hhclRvRGVsZXRlKSAhPSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhUb1JlbGF0aXZlTG9jYXRpb24uZGVsZXRlQ2hhckF0KGNoYXJUb0RlbGV0ZS0tKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5leHRUb2tlbi5lcXVhbHMoIi4iKSkgewotICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIGN1cnJlbnQgZGlyZWN0b3J5LCBkbyBub3QgYWRkIG9yIGRlbGV0ZSBhbnkgcGF0aCBjb21wb25lbnRzCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBwYXRoIGVuZHMgaW4gYSAiLyIgIG9yICJcXCIgdGhlbiBhcHBlbmQgdGhpcyBwYXRoIGNvbXBvbmVudAotICAgICAgICAgICAgCS8vIFRoaXMgaGFuZGxlcyBsb2NhdGlvbnMgd2l0aGluIHRoZSBtb2R1bGUgYW5kIFVSSXMKLSAgICAgICAgICAgICAgICBpZiAoKHBhdGhUb1JlbGF0aXZlTG9jYXRpb24uaW5kZXhPZihTdHJpbmcudmFsdWVPZihXU0RMX1BBVEhfU0VQRVJBVE9SX0NIQVIpKSAKLSAgICAgICAgICAgICAgICAJCSE9IC0xKSAmJiAocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5jaGFyQXQocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5sZW5ndGgoKSAKLSAgICAgICAgICAgICAgICAJCQkJLSAxKSE9IFdTRExfUEFUSF9TRVBFUkFUT1JfQ0hBUikpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5hcHBlbmQoV1NETF9QQVRIX1NFUEVSQVRPUl9DSEFSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBoYW5kbGVzIGZpbGUgYmFzZWQgbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgZWxzZSBpZigocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5pbmRleE9mKCJcXCIpICE9IC0xKSAmJiAocGF0aFRvUmVsYXRpdmVMb2NhdGlvbi4KLSAgICAgICAgICAgICAgICAJCWNoYXJBdChwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmxlbmd0aCgpIC0xKSAhPSAnXFwnKSkgewotICAgICAgICAgICAgICAgIAlwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLmFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0aFRvUmVsYXRpdmVMb2NhdGlvbi5hcHBlbmQobmV4dFRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQnVpbHQgcGF0aCA9ICIgKyBwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXRoVG9SZWxhdGl2ZUxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DYXRhbG9nVVJJUmVzb2x2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQ2F0YWxvZ1VSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTQzYzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DYXRhbG9nVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuSkFYV1NDYXRhbG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuVVJJUmVzb2x2ZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogVGhpcyByZXNvbHZlciBwcm92aWRlcyB0aGUgbWVhbnMgb2YgcmVzb2x2aW5nIHRoZSBpbXBvcnRzIGFuZCBpbmNsdWRlcyBvZiBhCi0gKiBnaXZlbiBzY2hlbWEgZG9jdW1lbnQuIEl0IGFsbG93cyB0aGUgdXNlIG9mIHRoZSBBcGFjaGUgQ29tbW9ucyBSZXNvbHZlciBBUEkKLSAqIHRvIHJlZGlyZWN0IHJlc291cmNlIHJlcXVlc3RzIHRvIGFsdGVybmF0aXZlIGxvY2F0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIENhdGFsb2dVUklSZXNvbHZlciBleHRlbmRzIFVSSVJlc29sdmVySW1wbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2F0YWxvZ1dTRExMb2NhdG9yLmNsYXNzKTsKLSAgICBwcml2YXRlIENhdGFsb2cgY2F0YWxvZ1Jlc29sdmVyOwotICAgIAotICAgIC8qKgotICAgICAqIENhdGFsb2dVUklSZXNvbHZlciBjb25zdHJ1Y3Rvci4gIFJlc29sdmVzIFdTREwgVVJJcyB1c2luZyBBcGFjaGUgQ29tbW9ucyBSZXNvbHZlciBBUEkuCi0gICAgICogQHBhcmFtIGNhdGFsb2dNYW5hZ2VyCi0gICAgICogICAgICAgICAgICB0aGUgT0FTSVNDYXRhbG9nTWFuYWdlciB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgc2V0dGluZ3MgZm9yIHRoZSBYTUwgY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyBDYXRhbG9nVVJJUmVzb2x2ZXIoSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgewotICAgICAgICB0aGlzKGNhdGFsb2dNYW5hZ2VyLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2F0YWxvZ1VSSVJlc29sdmVyIGNvbnN0cnVjdG9yLiAgUmVzb2x2ZXMgV1NETCBVUklzIHVzaW5nIEFwYWNoZSBDb21tb25zIFJlc29sdmVyIEFQSS4KLSAgICAgKiBAcGFyYW0gY2F0YWxvZ01hbmFnZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBPQVNJU0NhdGFsb2dNYW5hZ2VyIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBzZXR0aW5ncyBmb3IgdGhlIFhNTCBjYXRhbG9nCi0gICAgICogQHBhcmFtIGNsYXNzTG9hZGVyCi0gICAgICovICAgIAotICAgIHB1YmxpYyBDYXRhbG9nVVJJUmVzb2x2ZXIoSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlciwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgc3VwZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICBpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5jYXRhbG9nUmVzb2x2ZXIgPSBjYXRhbG9nTWFuYWdlci5nZXRDYXRhbG9nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgVVJJcyB1c2luZyBBcGFjaGUgQ29tbW9ucyBSZXNvbHZlciBBUEkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcG9ydFVSSSBhIFVSSSBzcGVjaWZ5aW5nIHRoZSBkb2N1bWVudCB0byBpbXBvcnQKLSAgICAgKiBAcGFyYW0gcGFyZW50IGEgVVJJIHNwZWNpZnlpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBwYXJlbnQgZG9jdW1lbnQgZG9pbmcKLSAgICAgKiB0aGUgaW1wb3J0aW5nCi0gICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgaW1wb3J0IGxvY2F0aW9uLCBvciBudWxsIGlmIG5vIGluZGlyZWN0aW9uIGlzIHBlcmZvcm1lZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVkaXJlY3RlZFVSSShTdHJpbmcgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpKSB7Ci0gICAgICAgIFN0cmluZyByZXNvbHZlZEltcG9ydExvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSB0aGlzLmNhdGFsb2dSZXNvbHZlci5yZXNvbHZlU3lzdGVtKG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRJbXBvcnRMb2NhdGlvbiA9IGNhdGFsb2dSZXNvbHZlci5yZXNvbHZlVVJJKHNjaGVtYUxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNvbHZlZEltcG9ydExvY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlZEltcG9ydExvY2F0aW9uID0gY2F0YWxvZ1Jlc29sdmVyLnJlc29sdmVQdWJsaWMobmFtZXNwYWNlLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhdGFsb2cgcmVzb2x1dGlvbiBmYWlsZWQiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNvbHZlZEltcG9ydExvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBcyBmb3IgdGhlIHJlc29sdmVyIHRoZSBwdWJsaWMgSUQgaXMgdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlCi0gICAgICogc2NoZW1hIGFuZCB0aGUgc2NoZW1hTG9jYXRpb24gaXMgdGhlIHZhbHVlIG9mIHRoZSBzY2hlbWEgbG9jYXRpb24KLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHNjaGVtYUxvY2F0aW9uCi0gICAgICogQHBhcmFtIGJhc2VVcmkKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVVyaSkgewotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBzY2hlbWFMb2NhdGlvbjsgICAgIAotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXMuY2F0YWxvZ1Jlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyByZWRpcmVjdGVkVVJJID0gZ2V0UmVkaXJlY3RlZFVSSShuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uLCBiYXNlVXJpKTsKLSAgICAgICAgICAgIGlmIChyZWRpcmVjdGVkVVJJICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IHJlZGlyZWN0ZWRVUkk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdXBlci5yZXNvbHZlRW50aXR5KG5hbWVzcGFjZSwgbG9jYXRpb24sIGJhc2VVcmkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DYXRhbG9nV1NETExvY2F0b3IuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQ2F0YWxvZ1dTRExMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzI1NWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9DYXRhbG9nV1NETExvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2F0YWxvZy5KQVhXU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLkNhdGFsb2c7Ci0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFdTREw0SiBpbnRlcmZhY2UgYW5kIGlzIHRoZQotICogaW1wbGVtZW50YXRpb24gd2Ugc3VwcGx5IHRvIGEgV1NETFJlYWRlciBpbnN0YW5jZS4gSXRzIHByaW1hcnkgCi0gKiBnb2FsIGlzIHRvIGFzc2lzdCB3aXRoIGxvY2F0aW5nIGltcG9ydGVkIFdTREwgZG9jdW1lbnRzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRhbG9nV1NETExvY2F0b3IgZXh0ZW5kcyBCYXNlV1NETExvY2F0b3IgaW1wbGVtZW50cyBXU0RMTG9jYXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQ2F0YWxvZ1dTRExMb2NhdG9yLmNsYXNzKTsKLSAgICBwcml2YXRlIENhdGFsb2cgY2F0YWxvZ1Jlc29sdmVyOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDYXRhbG9nV1NETExvY2F0b3IgY29uc3RydWN0b3IuICBSZXNvbHZlcyBXU0RMIFVSSXMgdXNpbmcgQXBhY2hlIENvbW1vbnMgUmVzb2x2ZXIgQVBJLgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIGZvciB0aGUgYmFzZSB3c2RsIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgcm9vdAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSBmb3IgdGhlIGJhc2Ugd3NkbCBmaWxlCi0gICAgICogQHBhcmFtIGNsYXNzbG9hZGVyCi0gICAgICogICAgICAgICAgICB0aGUgQ2xhc3NMb2FkZXIgZm9yIHRoZSBtb2R1bGUKLSAgICAgKiBAcGFyYW0gY2F0YWxvZ01hbmFnZXIKLSAgICAgKiAgICAgICAgICAgIHRoZSBPQVNJU0NhdGFsb2dNYW5hZ2VyIHdoaWNoIHdpbGwgZGV0ZXJtaW5lIHRoZSBzZXR0aW5ncyBmb3IgdGhlIFhNTCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIENhdGFsb2dXU0RMTG9jYXRvcihTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBzdHJlYW0sCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgewotICAgICAgICBiYXNlVVJJID0gY29udmVydFVSSSh1cmkpOwotICAgICAgICBiYXNlSW5wdXRTdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICAgICAgdGhpcy5jYXRhbG9nUmVzb2x2ZXIgPSBjYXRhbG9nTWFuYWdlci5nZXRDYXRhbG9nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzb2x2ZXMgV1NETCBVUklzIHVzaW5nIEFwYWNoZSBDb21tb25zIFJlc29sdmVyIEFQSS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW1wb3J0VVJJIGEgVVJJIHNwZWNpZnlpbmcgdGhlIGRvY3VtZW50IHRvIGltcG9ydAotICAgICAqIEBwYXJhbSBwYXJlbnQgYSBVUkkgc3BlY2lmeWluZyB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudCBkb2N1bWVudCBkb2luZwotICAgICAqIHRoZSBpbXBvcnRpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBpbXBvcnQgbG9jYXRpb24sIG9yIG51bGwgaWYgbm8gaW5kaXJlY3Rpb24gaXMgcGVyZm9ybWVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWRpcmVjdGVkVVJJKFN0cmluZyBpbXBvcnRVUkksIFN0cmluZyBwYXJlbnQpIHsKLSAgICAgICAgU3RyaW5nIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvbHZlZEltcG9ydExvY2F0aW9uID0gdGhpcy5jYXRhbG9nUmVzb2x2ZXIucmVzb2x2ZVN5c3RlbShpbXBvcnRVUkkpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSBjYXRhbG9nUmVzb2x2ZXIucmVzb2x2ZVVSSShpbXBvcnRVUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVkSW1wb3J0TG9jYXRpb24gPSBjYXRhbG9nUmVzb2x2ZXIucmVzb2x2ZVB1YmxpYyhpbXBvcnRVUkksIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2F0YWxvZyByZXNvbHV0aW9uIGZhaWxlZCIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNvbHZlZEltcG9ydExvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIElucHV0U3RyZWFtIHBvaW50ZWQgYXQgYW4gaW1wb3J0ZWQgd3NkbCBwYXRobmFtZSByZWxhdGl2ZSB0bwotICAgICAqIHRoZSBwYXJlbnQgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcG9ydFBhdGgKLSAgICAgKiAgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIFdTREwgZmlsZSB3aXRoaW4gdGhlIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9mIHRoZSBXU0RMIGZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGltcG9ydFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCBpbXBvcnRVUkwgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbXBvcnRVUkwgPSBuZXcgVVJMKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgaXMgPSBpbXBvcnRVUkwub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICB9Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlzID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShpbXBvcnRQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbXBvcnRQYXRoKTsKLSAgICAgICAgICAgICAgICBpcyA9IGZpbGUudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoaW1wb3J0UGF0aCk7Ci0gICAgICAgICAgICAgICAgaXMgPSB1cmkudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgd3NkbExvY2F0aW9uIGluIFVSTCBmb3JtLiBXc2RsTG9jYXRpb24gY291bGQgYmUgVVJMLCByZWxhdGl2ZQotICAgICAqIG1vZHVsZSBwYXRoLCBmdWxsIGFic29sdXRlIHBhdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxMb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIGEgV1NETCBkb2N1bWVudCBpbiB0aGUgZm9ybSBvZiBhIFVSTCBzdHJpbmcsIGEKLSAgICAgKiAgICAgICAgICAgIHJlbGF0aXZlIHBhdGhuYW1lIChyZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIG1vZHVsZSwgb3IgYQotICAgICAqICAgICAgICAgICAgZnVsbC1xdWFsaWZpZWQgYWJzb2x1dGUgcGF0aG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBpbiB0aGUgZm9ybSBvZiBhIFVSTAotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVybChTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFVSTCBzdHJlYW1VUkwgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIFVSSSBwYXRoVVJJID0gbnVsbDsKLQotICAgICAgICAvLyBJZiB0aGUgV1NETCBpcyBwcmVzZW50IGluIHRoZSBjYXRhbG9nLCB1c2UgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCAKLSAgICAgICAgLy8gaW4gdGhlIGNhdGFsb2cuICBJZiB0aGlzIGF0dGVtcHQgcmVzdWx0cyBpbiBmYWlsdXJlLCB1c2UgdGhlIG9yaWdpbmFsCi0gICAgICAgIC8vIGxvY2F0aW9uCi0gICAgICAgIC8vIFRPRE86ICBQcm92aWRlIEFsbG93YW5jZSBmb3IgQ2F0YWxvZwotICAgICAgICAvLyBOb3RlOiAgVGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZC4KLSAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdHJlYW1VUkwgPSBuZXcgVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBpcyA9IHN0cmVhbVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGF0aFVSSSA9IG5ldyBVUkkod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1VUkwgPSBwYXRoVVJJLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgaXMgPSBzdHJlYW1VUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIHN0cmVhbVVSTCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICBpcyA9IHN0cmVhbVVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiBzdHJlYW1VUkwgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJBYnNvbHV0ZSB3c2RsTG9jYXRpb24gY291bGQgbm90IGJlIGRldGVybWluZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyB3c2RsTG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0cmVhbVVSTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL0NsYXNzTG9hZGVyVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQ2xhc3NMb2FkZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY5YThiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQ2xhc3NMb2FkZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIFNlY3VyaXR5IFJpc2suIFBsZWFzZSBkb24ndCB1c2UgdGhpcyBjbGFzcywgQXMgYSBnZW5lcmFsIHJ1bGUKLSAqIGVuZCB1c2VyIGNvZGUgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjY2VzcyBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc0xvYWRlclV0aWxzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDbGFzc0xvYWRlclV0aWxzLmNsYXNzKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQ2xhc3NMb2FkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKGZpbmFsIENsYXNzIGNscykgewotICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNscy5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBDbGFzc0xvYWRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIgOiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRXhjZXB0aW9uIHRocm93biBmcm9tIEFjY2Vzc0NvbnRyb2xsZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoaXMgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZm9yTmFtZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBib29sZWFuIGluaXRpYWxpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsID0gKENsYXNzKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzbG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkV4Y2VwdGlvbiB0aHJvd24gZnJvbSBBY2Nlc3NDb250cm9sbGVyOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhpcyBuYW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIENsYXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBmb3JOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgY2wgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2wgPSAoQ2xhc3MpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IChDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9Db25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZTc2MDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1wdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTEgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTRExfU09BUDEyID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTRExfU09BUDExX0JPRFkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1dTRExfU09BUDEyX0JPRFkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTFfSEVBREVSID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9XU0RMX1NPQVAxMl9IRUFERVIgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTFfQklORElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfV1NETF9TT0FQMTJfQklORElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9MSUNZID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT0xJQ1lfUkVGRVJFTkNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBWElTMl9SRVBPX1BBVEggPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5yZXBvLnBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVMyX0NPTkZJR19QQVRIID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY29uZmlnLnBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9BU1lOQ19NRVAgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy51c2UuYXN5bmMubWVwIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9DT05URVhUX01JR1JBVE9SX0xJU1RfSUQgPSAiSkFYV1MtVGhyZWFkQ29udGV4dE1pZ3JhdG9yLUxpc3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WT0NBVElPTl9QQVRURVJOID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW52b2NhdGlvbi5wYXR0ZXJuIjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQV9SRUdJU1RSWV9DT05GSUdfRklMRSA9IAotICAgICAgICAiTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSI7Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL01vZHVsZVdTRExMb2NhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL01vZHVsZVdTRExMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDBkY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9Nb2R1bGVXU0RMTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMTG9jYXRvcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFdTREw0SiBpbnRlcmZhY2UgYW5kIGlzIHRoZQotICogaW1wbGVtZW50YXRpb24gd2Ugc3VwcGx5IHRvIGEgV1NETFJlYWRlciBpbnN0YW5jZS4gSXRzIHByaW1hcnkgCi0gKiBnb2FsIGlzIHRvIGFzc2lzdCB3aXRoIGxvY2F0aW5nIGltcG9ydGVkIFdTREwgZG9jdW1lbnRzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVXU0RMTG9jYXRvciBleHRlbmRzIEJhc2VXU0RMTG9jYXRvciBpbXBsZW1lbnRzIFdTRExMb2NhdG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNb2R1bGVXU0RMTG9jYXRvci5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIC8qKgotICAgICAqIE1vZHVsZVdTRExMb2NhdG9yIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSB1cmkKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIGZvciB0aGUgYmFzZSB3c2RsIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgcm9vdAotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiAgICAgICAgICAgIHRoZSBJbnB1dFN0cmVhbSBmb3IgdGhlIGJhc2Ugd3NkbCBmaWxlCi0gICAgICogQHBhcmFtIHN0cmF0ZWd5Ci0gICAgICogICAgICAgICAgICB0aGUgbG9hZCBzdHJhdGVneSBmb3IgdGhlIG1vZHVsZQotICAgICAqLwotICAgIHB1YmxpYyBNb2R1bGVXU0RMTG9jYXRvcihTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBzdHJlYW0sCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBiYXNlVVJJID0gY29udmVydFVSSSh1cmkpOwotICAgICAgICBiYXNlSW5wdXRTdHJlYW0gPSBzdHJlYW07Ci0gICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG51bGwgYmVjYXVzZSBubyBVUkkgaW5kaXJlY3Rpb24gaXMgcGVyZm9ybWVkIHdoZW4gCi0gICAgICogdXNpbmcgdGhlIE1vZHVsZVdTRExMb2NhdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbXBvcnRVUkkgYSBVUkkgc3BlY2lmeWluZyB0aGUgZG9jdW1lbnQgdG8gaW1wb3J0Ci0gICAgICogQHBhcmFtIHBhcmVudCBhIFVSSSBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGRvY3VtZW50IGRvaW5nCi0gICAgICogdGhlIGltcG9ydGluZwotICAgICAqIEByZXR1cm4gbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVkaXJlY3RlZFVSSShTdHJpbmcgaW1wb3J0VVJJLCBTdHJpbmcgcGFyZW50KSB7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIElucHV0U3RyZWFtIHBvaW50ZWQgYXQgYW4gaW1wb3J0ZWQgd3NkbCBwYXRobmFtZSByZWxhdGl2ZSB0bwotICAgICAqIHRoZSBwYXJlbnQgZG9jdW1lbnQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGltcG9ydFBhdGgKLSAgICAgKiAgICAgICAgICAgIGlkZW50aWZpZXMgdGhlIFdTREwgZmlsZSB3aXRoaW4gdGhlIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9mIHRoZSBXU0RMIGZpbGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGltcG9ydFBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFVSTCBpbXBvcnRVUkwgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbXBvcnRVUkwgPSBuZXcgVVJMKGltcG9ydFBhdGgpOwotICAgICAgICAgICAgaXMgPSBpbXBvcnRVUkwub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICB9Ci0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlzID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShpbXBvcnRQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbXBvcnRQYXRoKTsKLSAgICAgICAgICAgICAgICBpcyA9IGZpbGUudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoaW1wb3J0UGF0aCk7Ci0gICAgICAgICAgICAgICAgaXMgPSB1cmkudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgd3NkbExvY2F0aW9uIGluIFVSTCBmb3JtLiBXc2RsTG9jYXRpb24gY291bGQgYmUgVVJMLCByZWxhdGl2ZQotICAgICAqIG1vZHVsZSBwYXRoLCBmdWxsIGFic29sdXRlIHBhdGguCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxMb2NhdGlvbgotICAgICAqICAgICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIGEgV1NETCBkb2N1bWVudCBpbiB0aGUgZm9ybSBvZiBhIFVSTCBzdHJpbmcsIGEKLSAgICAgKiAgICAgICAgICAgIHJlbGF0aXZlIHBhdGhuYW1lIChyZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiBhIG1vZHVsZSwgb3IgYQotICAgICAqICAgICAgICAgICAgZnVsbC1xdWFsaWZpZWQgYWJzb2x1dGUgcGF0aG5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBpbiB0aGUgZm9ybSBvZiBhIFVSTAotICAgICAqLwotICAgIHB1YmxpYyBVUkwgZ2V0V3NkbFVybChTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIFVSTCBzdHJlYW1VUkwgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIFVSSSBwYXRoVVJJID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RyZWFtVVJMID0gbmV3IFVSTCh3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgaXMgPSBzdHJlYW1VUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIC8vIE5vIEZGREMgcmVxdWlyZWQKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBhdGhVUkkgPSBuZXcgVVJJKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgc3RyZWFtVVJMID0gcGF0aFVSSS50b1VSTCgpOwotICAgICAgICAgICAgICAgIGlzID0gc3RyZWFtVVJMLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gRkZEQyByZXF1aXJlZAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1VUkwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgaXMgPSBzdHJlYW1VUkwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICAvLyBObyBGRkRDIHJlcXVpcmVkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgJiYgc3RyZWFtVVJMID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWJzb2x1dGUgd3NkbExvY2F0aW9uIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkOiAiCi0gICAgICAgICAgICAgICAgICAgICsgd3NkbExvY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdHJlYW1VUkw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvU29hcFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL1NvYXBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjg1ZDRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvU29hcFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgU29hcFV0aWxzIHsKLQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0T01FbGVtZW50KFNPQVBFbnZlbG9wZSByZXNwb25zZSkgewotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcGFyc2VyID0gcmVzcG9uc2UuZ2V0WE1MU3RyZWFtUmVhZGVyKCk7Ci0KLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3RBWE9NQnVpbGRlcihPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKSwgcGFyc2VyKTsKLQotICAgICAgICByZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU09BUEZhY3RvcnkgZ2V0U29hcEZhY3RvcnkoU3RyaW5nIHNvYXBWZXJzaW9uVVJJKSB7Ci0gICAgICAgIGlmICgiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIi5lcXVhbHMoc29hcFZlcnNpb25VUkkpKQotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3V0aWwvV1NETDRKV3JhcHBlci5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9XU0RMNEpXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1N2U5ZGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9XU0RMNEpXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuRXhjZXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuSkFYV1NDYXRhbG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhdGFsb2cuaW1wbC5PQVNJU0NhdGFsb2dNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLndzZGwuV1NETFJlYWRlckNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLmZhY3RvcnkuUmVzb3VyY2VGaW5kZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZS5SZXNvdXJjZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5XU0RMRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIFdTRExXcmFwcGVyIGludGVyZmFjZSB3aGljaCBjb250cm9scyBhY2Nlc3MKLSAqIHRvIHRoZSB1bmRlcmx5aW5nIERlZmluaXRpb24gKFdTRExEZWZpbml0aW9uV3JhcHBlcikuCi0gKiBUaGUgV1NETERlZmluaXRpb25XcmFwcGVyIGltcGxlbWVudGF0aW9uIHVzZXMgdmFyaW91cyBzdHJhdGVnaWVzCi0gKiB0byBjb250cm9sIGl0cyBpbi1tZW1vcnkgZm9vdHByaW50LgotICovCi1wdWJsaWMgY2xhc3MgV1NETDRKV3JhcHBlciBpbXBsZW1lbnRzIFdTRExXcmFwcGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NETDRKV3JhcHBlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIFdTRExEZWZpbml0aW9uV3JhcHBlciB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFVSTCB3c2RsVVJMOwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxFeHBsaWNpdFVSTDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0gICAgcHJpdmF0ZSBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyID0gbnVsbDsKLSAgICAKLSAgICAvLyBCeSBkZWZhdWx0LCB1c2UgYSByZWxvYWQgc3RyYXRlZ3kgZm9yIHRoZSBXU0RMV3JhcHBlcgotICAgIHByaXZhdGUgYm9vbGVhbiBsaW1pdE1lbW9yeSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBpbnQgbWVtb3J5VHlwZSA9IDI7Ci0gICAgCi0gICAvKioKLSAgICAqIENvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIFVSTCAgIFRoZSBVUkwgZm9yIHRoZSBXU0RMCi0gICAgKiBAZGVwcmVjYXRlZCBVc2UgYSBjb25zdHJ1Y3RvciB0aGF0IHBhc3NlcyBpbiB0aGUgQ29uZmlnQ29udGV4dCwgb3IgbWVtb3J5TGltaXQgcGFyYW1ldGVyCi0gICAgKi8KLSAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24sCi0gICAgICAgICAgICBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY29tbW9uUGFydHNVUkxDb25zdHJ1Y3Rvcih3c2RsVVJMLCAoQ29uZmlndXJhdGlvbkNvbnRleHQpbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSB3c2RsVVJMCi0gICAgICogQHBhcmFtIGxpbWl0TWVtb3J5IHRydWUgaWYgbWVtb3J5IHNob3VsZCBiZSBsaW1pdGVkCi0gICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDb25uZWN0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBib29sZWFuIGxpbWl0TWVtb3J5LCBpbnQgbWVtb3J5VHlwZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24sCi0gICAgQ29ubmVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdTRExFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmxpbWl0TWVtb3J5ID0gbGltaXRNZW1vcnk7Ci0gICAgICAgIHRoaXMubWVtb3J5VHlwZSA9IG1lbW9yeVR5cGU7Ci0gICAgICAgIHRoaXMuY29tbW9uUGFydHNVUkxDb25zdHJ1Y3Rvcih3c2RsVVJMLCAoQ29uZmlndXJhdGlvbkNvbnRleHQpbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzZGxVUkwKLSAgICAgKiBAcGFyYW0gY2F0YWxvZ01hbmFnZXIKLSAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIENvbm5lY3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGEgY29uc3RydWN0b3Igd2l0aCBhIENvbmZpZ3VyYXRpb25Db250ZXh0IG9yIGxpbWl0TWVtb3J5IHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCAKLSAgICBVbmtub3duSG9zdEV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdTRExFeGNlcHRpb24gewotICAgICAgICB0aGlzKHdzZGxVUkwsIGNhdGFsb2dNYW5hZ2VyLCBmYWxzZSwgMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyLCBib29sZWFuIGxpbWl0TWVtb3J5KSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCAKLSAgICBVbmtub3duSG9zdEV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdTRExFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyID0gY2F0YWxvZ01hbmFnZXI7Ci0gICAgICAgIHRoaXMubGltaXRNZW1vcnkgPSBsaW1pdE1lbW9yeTsKLSAgICAgICAgdGhpcy5jb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKHdzZGxVUkwsIChDb25maWd1cmF0aW9uQ29udGV4dCludWxsKTsKLSAgICB9Ci0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIsIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCAKLSAgICBVbmtub3duSG9zdEV4Y2VwdGlvbiwgQ29ubmVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdTRExFeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNhdGFsb2dNYW5hZ2VyID0gY2F0YWxvZ01hbmFnZXI7Ci0gICAgICAgIHRoaXMubGltaXRNZW1vcnkgPSBsaW1pdE1lbW9yeTsKLSAgICAgICAgdGhpcy5tZW1vcnlUeXBlID0gbWVtb3J5VHlwZTsKLSAgICAgICAgdGhpcy5jb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKHdzZGxVUkwsIChDb25maWd1cmF0aW9uQ29udGV4dCludWxsKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCAKLSAgICAgICAgICAgIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIAotICAgIFVua25vd25Ib3N0RXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuY2F0YWxvZ01hbmFnZXIgPSBjYXRhbG9nTWFuYWdlcjsKLSAgICAgICAgdGhpcy5jb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKHdzZGxVUkwsIGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgCi0gICAgVW5rbm93bkhvc3RFeGNlcHRpb24sIENvbm5lY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5jb21tb25QYXJ0c1VSTENvbnN0cnVjdG9yKHdzZGxVUkwsIGNvbmZpZ0NvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY29tbW9uUGFydHNVUkxDb25zdHJ1Y3RvcihVUkwgd3NkbFVSTCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgVW5rbm93bkhvc3RFeGNlcHRpb24sCi0gICAgICAgICAgICBDb25uZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29uZmlnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQ7Ci0gICAgLy8gZGVidWdNZW1vcnlQYXJtcyhjb25maWdDb250ZXh0KTsKLSAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETDRKV3JhcHBlcihVUkwsQ29uZmlndXJhdGlvbkNvbnRleHQpIC0gTG9va2luZyBmb3Igd3NkbCBmaWxlIG9uIGNsaWVudDogIiArICh3c2RsVVJMICE9IG51bGwgPyAKLSAgICAgICAgICAgICAgICAgICAgd3NkbFVSTC5nZXRQYXRoKCk6bnVsbCkpOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotICAgICAgIAotICAgICAgICBVUkxDb25uZWN0aW9uIHVybENvbjsKLSAgICAgICAgdHJ5IHsgICAgICAgIAotICAgICAgICAJCi0gICAgICAgIAl1cmxDb24gPSBnZXRQcml2aWxlZ2VkVVJMQ29ubmVjdGlvbih0aGlzLndzZGxVUkwpOwotCi0gICAgICAgIAlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBnZXRJbnB1dFN0cmVhbSh1cmxDb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IG9wZW4gdXJsIGNvbm5lY3Rpb24uIFRyeWluZyB0byB1c2UgIiArCi0gICAgICAgICAgICAgICAgICAgICJjbGFzc2xvYWRlciB0byBnZXQgYW5vdGhlciBVUkwuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IHdzZGxVUkwgIT0gbnVsbCA/IHdzZGxVUkwuZ2V0UGF0aCgpIDogbnVsbDsKLSAgICAgICAgICAgICAgICBpZihmaWxlUGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBnZXRBYnNvbHV0ZVVSTChjbGFzc0xvYWRlciwgZmlsZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICBpZih1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBsb2NhdGUgVVJMIGZvciB3c2RsLiBSZXBvcnRpbmcgZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigiV1NETDRKV3JhcHBlciA6ICIsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxDb24gPSBvcGVuQ29ubmVjdGlvbih1cmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJGb3VuZCBVUkwgZm9yIFdTREwgZnJvbSBqYXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGdldCBVUkwgZnJvbSBjbGFzc2xvYWRlci4gUmVwb3J0aW5nICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGR1ZSB0byBubyBmaWxlIHBhdGguIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oIldTREw0SldyYXBwZXIgOiAiLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLndzZGxFeHBsaWNpdFVSTCA9IHVybENvbi5nZXRVUkwoKS50b1N0cmluZygpOwotICAgICAgICAgICAgZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2ggKENvbm5lY3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGV4KSAgewotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oIldTREw0SldyYXBwZXIgOiAiLCBleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byByZXRyaWV2ZSBhIFVSTENvbm5lY3Rpb24gb2JqZWN0Ci0gICAgICogYmFzZWQgb24gYSBVUkwgZm9yIHRoZSBXU0RMIGRvY3VtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgVVJMQ29ubmVjdGlvbiBnZXRVUkxDb25uZWN0aW9uKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gaXNGaWxlUHJvdG9jb2wgPQotICAgICAgICAgICAgICAgICh1cmwgIT0gbnVsbCAmJiAiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIGlmIChpc0ZpbGVQcm90b2NvbCkgewotICAgICAgICAgICAgZmlsZVBhdGggPSAodXJsICE9IG51bGwpID8gdXJsLmdldFBhdGgoKSA6IG51bGw7Ci0gICAgICAgICAgICAvL0NoZWNrIGlzIHRoZSB1cmkgaGFzIHJlbGF0aXZlIHBhdGggaS5lIHBhdGggaXMgbm90IGFic29sdXRlIGFuZCBpcyBub3Qgc3RhcnRpbmcgd2l0aCBhICIvIgotICAgICAgICAgICAgYm9vbGVhbiBpc1JlbGF0aXZlUGF0aCA9Ci0gICAgICAgICAgICAgICAgICAgIChmaWxlUGF0aCAhPSBudWxsICYmICFuZXcgRmlsZShmaWxlUGF0aCkuaXNBYnNvbHV0ZSgpKSA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChpc1JlbGF0aXZlUGF0aCkgewotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldTREwgVVJMIGhhcyBhIHJlbGF0aXZlIHBhdGgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9MZXRzIHJlYWQgdGhlIGNvbXBsZXRlIFdTREwgVVJMIGZvciByZWxhdGl2ZSBwYXRoIGZyb20gY2xhc3MgbG9hZGVyCi0gICAgICAgICAgICAgICAgLy9Vc2UgcmVsYXRpdmUgcGF0aCBvZiB1cmwgdG8gZmV0Y2ggY29tcGxldGUgVVJMLgotICAgICAgICAgICAgICAgIHVybCA9IGdldEFic29sdXRlVVJMKGdldFRocmVhZENsYXNzTG9hZGVyKCksIGZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIldTREwgVVJMIGZvciByZWxhdGl2ZSBwYXRoIG5vdCBmb3VuZCBpbiBDbGFzc0xvYWRlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVhZCBXU0RMIGZyb20gcmVsYXRpdmUgcGF0aCwgY2hlY2sgdGhlIHJlbGF0aXZlIHBhdGgiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZWxhdGl2ZSBwYXRoIGV4YW1wbGU6IGZpbGU6L1dFQi1JTkYvd3NkbC88d3NkbGZpbGVuYW1lPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2luZyByZWxhdGl2ZSBwYXRoIGFzIGRlZmF1bHQgd3NkbCBVUkwgdG8gY3JlYXRlIHdzZGwgRGVmaW5pdGlvbi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cmwgPSB3c2RsVVJMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiV1NETCBVUkwgZm91bmQgZm9yIHJlbGF0aXZlIHBhdGg6ICIgKyBmaWxlUGF0aCArICIgc2NoZW1lOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLmdldFByb3RvY29sKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgIGlmKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmV0cmlldmluZyBVUkxDb25uZWN0aW9uIGZyb20gV1NETCBVUkwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBvcGVuQ29ubmVjdGlvbih1cmwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb25uZWN0aW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFVSTENvbm5lY3Rpb24gZ2V0UHJpdmlsZWdlZFVSTENvbm5lY3Rpb24oZmluYWwgVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAJcmV0dXJuIChVUkxDb25uZWN0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCggbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGdldFVSTENvbm5lY3Rpb24odXJsKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihmaW5hbCBVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIChVUkxDb25uZWN0aW9uKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZS5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGdldFRocmVhZENsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVSTCBnZXRBYnNvbHV0ZVVSTChmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgZmluYWwgU3RyaW5nIGZpbGVQYXRoKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZShmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIGlmKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGdldCBVUkwgZnJvbSBjbGFzc2xvYWRlci4gTG9va2luZyBpbiBhIGphci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGNsYXNzTG9hZGVyIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpewotICAgICAgICAgICAgICAgIGZpbmFsIFVSTENsYXNzTG9hZGVyIHVybExvYWRlciA9IChVUkxDbGFzc0xvYWRlciljbGFzc0xvYWRlcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB1cmwgPSAoVVJMKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCggbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZ2V0VVJMRnJvbUpBUih1cmxMb2FkZXIsIHdzZGxVUkwpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBVUkxDbGFzc0xvYWRlciBuZXN0ZWRMb2FkZXIgPSAoVVJMQ2xhc3NMb2FkZXIpIGdldE5lc3RlZENsYXNzTG9hZGVyKFVSTENsYXNzTG9hZGVyLmNsYXNzLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKG5lc3RlZExvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9IChVUkwpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKCBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGdldFVSTEZyb21KQVIobmVzdGVkTG9hZGVyLCB3c2RsVVJMKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJsOyAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBnZXROZXN0ZWRDbGFzc0xvYWRlcihDbGFzcyB0eXBlLCBDbGFzc0xvYWRlciByb290KSB7Ci0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJTZWFyY2hpbmcgZm9yIG5lc3RlZCBVUkxDbGFzc0xvYWRlciIpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICghKHJvb3QgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikpIHsKLSAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY3VycmVudCA9IHJvb3Q7Ci0gICAgICAgICAgICByb290ID0gKENsYXNzTG9hZGVyKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSAmJiByb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIHBhcmVudCBDbGFzc0xvYWRlcjogIiArIHJvb3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVVJMIGdldFVSTEZyb21KQVIoVVJMQ2xhc3NMb2FkZXIgdXJsTG9hZGVyLCBVUkwgcmVsYXRpdmVVUkwpIHsKLSAgICAgICAgVVJMW10gdXJsTGlzdCA9IG51bGw7Ci0gICAgICAgIFJlc291cmNlRmluZGVyRmFjdG9yeSByZmYgPShSZXNvdXJjZUZpbmRlckZhY3RvcnkpTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeShSZXNvdXJjZUZpbmRlckZhY3RvcnkuY2xhc3MpOwotICAgICAgICBSZXNvdXJjZUZpbmRlciBjZiA9IHJmZi5nZXRSZXNvdXJjZUZpbmRlcigpOwotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzb3VyY2VGaW5kZXJGYWN0b3J5OiAiICsgcmZmLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzb3VyY2VGaW5kZXI6ICIgKyBjZi5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHVybExpc3QgPSBjZi5nZXRVUkxzKHVybExvYWRlcik7Ci0gICAgICAgIGlmKHVybExpc3QgPT0gbnVsbCl7Ci0gICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJObyBVUkwncyBmb3VuZCBpbiBVUkwgQ2xhc3NMb2FkZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oTWVzc2FnZXMuZ2V0TWVzc2FnZSgiV1NETDRKV3JhcHBlckVycjEiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFVSTCB1cmwgOiB1cmxMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZSh1cmwuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAvLyBJZiBmaWxlIGlzIG5vdCBvZiB0eXBlIGRpcmVjdG9yeSB0aGVuIGl0cyBhIGphciBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKGlzQUZpbGUoZikpIHsgCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKYXJGaWxlIGpmID0gKEphckZpbGUpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphckZpbGUoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGpmLmVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgYWxsIGVudHJpZXMgaW4gamFyIGZpbGUgYW5kIHJldHVybiB0aGUgZmlyc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdzZGwgZmlsZSB0aGF0IG1hdGNoZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZWxhdGl2ZSBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gamUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVVSTC5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBhdGguZW5kc1dpdGgobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgVW5peC9MaW51eCBmaWxlIHBhdGhzIGJlZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgJy8nLiBXaGVuIGFkZGluZyB0aGUgcHJlZml4ICdqYXI6ZmlsZTovJyB3ZSBtYXkgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cCB3aXRoICcvLycgYWZ0ZXIgdGhlICdmaWxlOicgcGFydC4gVGhpcyBjYXVzZXMgdGhlIFVSTCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdCB0byB0cmVhdCB0aGlzIGxpa2UgYSByZW1vdGUgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBhdGggIT0gbnVsbCAmJiBwYXRoLmluZGV4T2YoIi8iKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEsIHBhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgYWJzb2x1dGVVcmwgPSBuZXcgVVJMKCJqYXI6ZmlsZTovIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhdGggKyAiIS8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgamUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVVybDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBRmlsZShmaW5hbCBGaWxlIGYpIHsKLSAgICAgICAgQm9vbGVhbiByZXQgPSAoQm9vbGVhbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuKGYuZXhpc3RzKCkgJiYgIWYuaXNEaXJlY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICk7Ci0gICAgICAgIHJldHVybiByZXQuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgV1NETFJlYWRlciBnZXRXU0RMUmVhZGVyKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAvLyBLZWVwIHRoaXMgbWV0aG9kIHByaXZhdGUKLSAgICAgICAgV1NETFJlYWRlciByZWFkZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFkZXIgPSAoV1NETFJlYWRlcilBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IChXU0RMRXhjZXB0aW9uKWUuZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETFJlYWRlckNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSAoV1NETFJlYWRlckNvbmZpZ3VyYXRvcikgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuCi0gICAgICAgICAgICBnZXRGYWN0b3J5KFdTRExSZWFkZXJDb25maWd1cmF0b3IuY2xhc3MpOwotICAgICAgICBpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxpbmcgY29uZmlndXJlUmVhZGVySW5zdGFuY2Ugd2l0aDogIiArIGNvbmZpZ3VyYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25maWd1cmF0b3IuY29uZmlndXJlUmVhZGVySW5zdGFuY2UocmVhZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhZGVyOwotICAgIH0KLQotICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RvcgotICAgICoKLSAgICAqIEBwYXJhbSBVUkwgICBUaGUgVVJMIGZvciB0aGUgV1NETAotICAgICogQHBhcmFtIERlZmluaXRpb24gICBEZWZpbml0aW9uIGZvciB0aGUgV1NETAotICAgICogQGRlcHJlY2F0ZWQgVXNlIGEgY29uc3RydWN0b3IgdGhhdCBoYXMgYSBDb25maWdDb250ZXh0IG9yIG1lbW9yeUxpbWl0IHBhcmFtZXRlcgotICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gd3NkbERlZmluaXRpb24pIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyh3c2RsVVJMLCB3c2RsRGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gVVJMICAgVGhlIFVSTCBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgICogQHBhcmFtIENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICovCi0gICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgdGhpcyh3c2RsVVJMLCB3c2RsRGVmaW5pdGlvbiwgY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgIH0KLSAgICAgCi0gICAgIC8qKgotICAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAgKgotICAgICAgKiBAcGFyYW0gVVJMICAgVGhlIFVSTCBmb3IgdGhlIFdTREwKLSAgICAgICogQHBhcmFtIERlZmluaXRpb24gICBEZWZpbml0aW9uIGZvciB0aGUgV1NETAotICAgICAgKiBAcGFyYW0gbGltaXRNZW1vcnkgYm9vbGVhbgotICAgICAgKi8KLSAgICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBib29sZWFuIGxpbWl0TWVtb3J5LCBpbnQgbWVtb3J5VHlwZSkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgIHRoaXMod3NkbFVSTCwgd3NkbERlZmluaXRpb24sIG51bGwsIG51bGwsIGxpbWl0TWVtb3J5LCBtZW1vcnlUeXBlKTsKLSAgICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gVVJMICAgVGhlIFVSTCBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgICogQHBhcmFtIEpBWFdTQ2F0YWxvZ01hbmFnZXIgQ2F0YWxvZyBNYW5hZ2VyIHRvIHVzZSBmb3IgbG9jYXRpbmcgZXh0ZXJuYWwgcmVzb3VyY2VzCi0gICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbGltaXRNZW1vcnksIGludCBtZW1vcnlUeXBlKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMod3NkbFVSTCwgd3NkbERlZmluaXRpb24sIG51bGwsIGNhdGFsb2dNYW5hZ2VyLCBsaW1pdE1lbW9yeSwgbWVtb3J5VHlwZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gVVJMICAgVGhlIFVSTCBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gRGVmaW5pdGlvbiAgIERlZmluaXRpb24gZm9yIHRoZSBXU0RMCi0gICAgICogQHBhcmFtIEpBWFdTQ2F0YWxvZ01hbmFnZXIgQ2F0YWxvZyBNYW5hZ2VyIHRvIHVzZSBmb3IgbG9jYXRpbmcgZXh0ZXJuYWwgcmVzb3VyY2VzCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIGEgY29uc3RydWN0b3Igd2l0aCBhIENvbmZpZ3VyYXRpb25Db250ZXh0IG9yIG1lbW9yeSBsaW1pdCBzZXR0aW5nCi0gICAgICovCi0gICAgcHVibGljIFdTREw0SldyYXBwZXIoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIEpBWFdTQ2F0YWxvZ01hbmFnZXIgY2F0YWxvZ01hbmFnZXIpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyh3c2RsVVJMLCB3c2RsRGVmaW5pdGlvbiwgbnVsbCwgY2F0YWxvZ01hbmFnZXIsIGZhbHNlLCAwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgKiBDb25zdHJ1Y3RvcgotICAgICoKLSAgICAqIEBwYXJhbSBVUkwgICBUaGUgVVJMIGZvciB0aGUgV1NETAotICAgICogQHBhcmFtIERlZmluaXRpb24gICBEZWZpbml0aW9uIGZvciB0aGUgV1NETAotICAgICogQHBhcmFtIENvbmZpZ3VyYXRpb25Db250ZXh0ICB0byBnZXQgcGFyYW1ldGVycyBmb3IgV1NETCBidWlsZGluZyAKLSAgICAgKiBAcGFyYW0gSkFYV1NDYXRhbG9nTWFuYWdlciBDYXRhbG9nIE1hbmFnZXIgdG8gdXNlIGZvciBsb2NhdGluZyBleHRlcm5hbCByZXNvdXJjZXMKLSAgICAqLwotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKFVSTCB3c2RsVVJMLCBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgSkFYV1NDYXRhbG9nTWFuYWdlciBjYXRhbG9nTWFuYWdlcikgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICB0aGlzKHdzZGxVUkwsIHdzZGxEZWZpbml0aW9uLCBjb25maWdDb250ZXh0LCBjYXRhbG9nTWFuYWdlciwgZmFsc2UsIDApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBGdWxsIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgIHByaXZhdGUgV1NETDRKV3JhcHBlcihVUkwgd3NkbFVSTCwgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICBKQVhXU0NhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyLCBib29sZWFuIGxpbWl0TWVtb3J5LCBpbnQgbWVtb3J5VHlwZSkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApIHsgbG9nLmRlYnVnKCJXU0RMNEpXcmFwcGVyKC4uLikgZW50cnkiKTsgfQotCi0gICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgICAgICAgdGhpcy5jYXRhbG9nTWFuYWdlciA9IGNhdGFsb2dNYW5hZ2VyOwotICAgICAgICAgdGhpcy53c2RsVVJMID0gd3NkbFVSTDsKLSAgICAgICAgIHRoaXMubGltaXRNZW1vcnkgPSBsaW1pdE1lbW9yeTsgIC8vIE9ubHkgdXNlZCBpZiBjb25maWdDb250ZXh0IGlzIG5vdCBwcmVzZW50Ci0gICAgICAgICB0aGlzLm1lbW9yeVR5cGUgPSBtZW1vcnlUeXBlOwotICAgICAgICAgaWYgKCh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSAmJiAhKHdzZGxEZWZpbml0aW9uIGluc3RhbmNlb2YgV1NETERlZmluaXRpb25XcmFwcGVyKSkgewotICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwgJiYgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbiA9IAotICAgICAgICAgICAgICAgICAgICAgbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcih3c2RsRGVmaW5pdGlvbiwgd3NkbFVSTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSApOwotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24gPSAKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBXU0RMRGVmaW5pdGlvbldyYXBwZXIod3NkbERlZmluaXRpb24sIHdzZGxVUkwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdE1lbW9yeSwgMik7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gKFdTRExEZWZpbml0aW9uV3JhcHBlcikgd3NkbERlZmluaXRpb247Ci0gICAgICAgICB9Ci0gICAgIH0KLQotCi0gICAvKioKLSAgICAqIENvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIERlZmluaXRpb24gICBEZWZpbml0aW9uIGZvciB0aGUgV1NETAotICAgICogQGRlcHJlY2F0ZWQgVXNlIFdTREw0SldyYXBwZXIoRGVmaW5pdGlvbixDb25maWd1cmF0aW9uQ29udGV4dCkKLSAgICAqLwotICAgIHB1YmxpYyBXU0RMNEpXcmFwcGVyKERlZmluaXRpb24gd3NkbERlZmluaXRpb24pIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyh3c2RsRGVmaW5pdGlvbiwgZmFsc2UsIDApOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBEZWZpbml0aW9uICAgRGVmaW5pdGlvbiBmb3IgdGhlIFdTREwKLSAgICAgKiBAYm9vbGVhbiBsaW1pdE1lbW9yeQotICAgICAqLwotICAgICBwdWJsaWMgV1NETDRKV3JhcHBlcihEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBib29sZWFuIGxpbWl0TWVtb3J5LCBpbnQgbWVtb3J5VHlwZSkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpICkgeyBsb2cuZGVidWcoIldTREw0SldyYXBwZXIoRGVmaW5pdGlvbiwgYm9vbGVhbikgZW50cnkiKTsgfQotCi0gICAgICAgICB0aGlzLmxpbWl0TWVtb3J5ID0gbGltaXRNZW1vcnk7Ci0gICAgICAgICB0aGlzLm1lbW9yeVR5cGUgPSBtZW1vcnlUeXBlOwotICAgICAgICAgaWYgKCh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSAmJiAhKHdzZGxEZWZpbml0aW9uIGluc3RhbmNlb2YgV1NETERlZmluaXRpb25XcmFwcGVyKSkgewotICAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24gPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKHdzZGxEZWZpbml0aW9uLCBudWxsLCBsaW1pdE1lbW9yeSwgbWVtb3J5VHlwZSk7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24gPSAoV1NETERlZmluaXRpb25XcmFwcGVyKSB3c2RsRGVmaW5pdGlvbjsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKHRoaXMud3NkbERlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgIFN0cmluZyBiYXNlVVJJID0gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBVUkwoYmFzZVVSSSk7Ci0gICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgIC8vIGp1c3QgYWJzb3JiIHRoZSBlcnJvcgotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBEZWZpbml0aW9uICAgRGVmaW5pdGlvbiBmb3IgdGhlIFdTREwKLSAgICAgKiBAcGFyYW0gQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICAgcHVibGljIFdTREw0SldyYXBwZXIoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQpIHRocm93cyBXU0RMRXhjZXB0aW9uIHsKLSAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkgKSB7IGxvZy5kZWJ1ZygiV1NETDRKV3JhcHBlcihEZWZpbml0aW9uKSBlbnRyeSIpOyB9Ci0KLSAgICAgICAgIGlmICgod3NkbERlZmluaXRpb24gIT0gbnVsbCkgJiYgISh3c2RsRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFdTRExEZWZpbml0aW9uV3JhcHBlcikpIHsKLSAgICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gbmV3IFdTRExEZWZpbml0aW9uV3JhcHBlcih3c2RsRGVmaW5pdGlvbiwgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbiA9IChXU0RMRGVmaW5pdGlvbldyYXBwZXIpIHdzZGxEZWZpbml0aW9uOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAodGhpcy53c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgU3RyaW5nIGJhc2VVUkkgPSB3c2RsRGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICB3c2RsVVJMID0gbmV3IFVSTChiYXNlVVJJKTsKLSAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgLy8ganVzdCBhYnNvcmIgdGhlIGVycm9yCi0gICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICB9Ci0gICAgLy9UT0RPOiBQZXJmb3JtIHZhbGlkYXRpb25zIGZvciBlYWNoIG1ldGhvZCB0byBjaGVjayBmb3IgbnVsbCBwYXJhbWV0ZXJzIG9uIFFOYW1lLgotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIGEgd3JhcHBlZCBXU0RMNEogd1NETCBkZWZpbml0aW9uCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpIHsKLSAgICAgICAgaWYgKHdzZGxEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmID0gbG9hZERlZmluaXRpb24oKTsKLSAgICAgICAgICAgIGlmIChkZWYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbERlZmluaXRpb24gPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZiwgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbERlZmluaXRpb24gPSBuZXcgV1NETERlZmluaXRpb25XcmFwcGVyKGRlZiwgd3NkbFVSTCwgbGltaXRNZW1vcnksIG1lbW9yeVR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIGFuIHVud3JhcHBlZCBXU0RMNEogd1NETCBkZWZpbml0aW9uCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0VW53cmFwcGVkRGVmaW5pdGlvbigpIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWY7Ci0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWYgPSBsb2FkRGVmaW5pdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKHdzZGxEZWZpbml0aW9uIGluc3RhbmNlb2YgV1NETERlZmluaXRpb25XcmFwcGVyKSB7Ci0gICAgICAgICAgICBkZWYgPSB3c2RsRGVmaW5pdGlvbi5nZXRVbndyYXBwZWREZWZpbml0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWYgPSB3c2RsRGVmaW5pdGlvbjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBMb2FkIGEgV1NETDRKIFdTREwgZGVmaW5pdGlvbiBmcm9tIGEgVVJMCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gbG9hZERlZmluaXRpb24oKSB7Ci0KLSAgICAgICAgRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotCi0gICAgICAgIGlmICh3c2RsRXhwbGljaXRVUkwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gdXJsQ29ubiA9IGdldFByaXZpbGVnZWRVUkxDb25uZWN0aW9uKHRoaXMud3NkbFVSTCk7Ci0gICAgICAgICAgICAgICAgaWYodXJsQ29ubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldElucHV0U3RyZWFtKHVybENvbm4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXRhbG9nTWFuYWdlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGFsb2dNYW5hZ2VyID0gbmV3IE9BU0lTQ2F0YWxvZ01hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2F0YWxvZ1dTRExMb2NhdG9yIGxvY2F0b3IgPSBuZXcgQ2F0YWxvZ1dTRExMb2NhdG9yKHdzZGxFeHBsaWNpdFVSTCwgaXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGhyZWFkQ2xhc3NMb2FkZXIoKSwgY2F0YWxvZ01hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTG9hZGluZyBXU0RMIHVzaW5nIE1vZHVsZVdTRExMb2NhdG9yIGZyb20gYmFzZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYXRpb246ICIgKyB3c2RsRXhwbGljaXRVUkwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgPSAoRGVmaW5pdGlvbikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIFdTRExFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBnZXRXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRXU0RMKGxvY2F0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJVc2luZyBNb2R1bGVXU0RMTG9jYXRvciB3YXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGxvYWRpbmcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV1NETCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcjogIiArIGUudG9TdHJpbmcoKSArICIuIFRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXU0RMIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBXU0RMIGxvY2F0aW9uOiAiICsgd3NkbEV4cGxpY2l0VVJMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihkZWYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJMb2FkaW5nIFdTREwgZnJvbSBsb2NhdGlvbjogIiArIHdzZGxFeHBsaWNpdFVSTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVmID0gKERlZmluaXRpb24pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBnZXRXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkV1NETCh3c2RsRXhwbGljaXRVUkwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25GYWN0b3J5Lm1ha2VXZWJTZXJ2aWNlRXhjZXB0aW9uKGUuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGxvYWQgdGhlIFdTREwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbjogIiArIHdzZGxFeHBsaWNpdFVSTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWREZWZpbml0aW9uKCkgcmV0dXJuaW5nIGEgTk9OLU5VTEwgZGVmaW5pdGlvbiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoImxvYWREZWZpbml0aW9uKCkgcmV0dXJuaW5nIGEgTlVMTCBkZWZpbml0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVmOwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nIGdldEZpcnN0UG9ydEJpbmRpbmcoUU5hbWUgc2VydmljZVFuYW1lKSB7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2Uoc2VydmljZVFuYW1lKTsKLSAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWFwIG1hcCA9IGdldFNlcnZpY2Uoc2VydmljZVFuYW1lKS5nZXRQb3J0cygpOwotICAgICAgICBpZiAobWFwID09IG51bGwgfHwgbWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChPYmplY3QgbGlzdE9iamVjdCA6IG1hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgUG9ydCB3c2RsUG9ydCA9IChQb3J0KWxpc3RPYmplY3Q7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbFBvcnQuZ2V0QmluZGluZygpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUpIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gZ2V0UG9ydChzZXJ2aWNlUW5hbWUsIHBvcnRRbmFtZSk7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb3BPYmogOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKW9wT2JqOwotICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQb3J0IGdldFBvcnQoUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBlcHJRbmFtZSkgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKHNlcnZpY2VRbmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlLmdldFBvcnQoZXByUW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQb3J0QmluZGluZyhRTmFtZSBzZXJ2aWNlUW5hbWUpIHsKLSAgICAgICAgTWFwIG1hcCA9IHRoaXMuZ2V0U2VydmljZShzZXJ2aWNlUW5hbWUpLmdldFBvcnRzKCk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fCBtYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Q8QmluZGluZz4gcG9ydEJpbmRpbmdzID0gbmV3IEFycmF5TGlzdDxCaW5kaW5nPigpOwotICAgICAgICBmb3IgKE9iamVjdCBsaXN0T2JqZWN0IDogbWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBQb3J0IHdzZGxQb3J0ID0gKFBvcnQpbGlzdE9iamVjdDsKLSAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHdzZGxQb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwb3J0QmluZGluZ3MuYWRkKGJpbmRpbmcpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvcnRCaW5kaW5nczsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydEJpbmRpbmcoUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUpIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gZ2V0UG9ydChzZXJ2aWNlUW5hbWUsIHBvcnRRbmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgICByZXR1cm4gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3J0cyhRTmFtZSBzZXJ2aWNlUW5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gcG9ydE5hbWVzID0gbnVsbDsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gdGhpcy5nZXRTZXJ2aWNlKHNlcnZpY2VRbmFtZSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE1hcCBtYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCB8fCBtYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBwb3J0TmFtZXMgPSBuZXcgU3RyaW5nW21hcC52YWx1ZXMoKS5zaXplKCldOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpdGVyLmhhc05leHQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBQb3J0IHdzZGxQb3J0ID0gKFBvcnQpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAod3NkbFBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBvcnROYW1lc1tpXSA9IHdzZGxQb3J0LmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydE5hbWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2aWNlIGdldFNlcnZpY2UoUU5hbWUgc2VydmljZVFuYW1lKSB7Ci0gICAgICAgIGlmIChzZXJ2aWNlUW5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IGdldERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmLmdldFNlcnZpY2Uoc2VydmljZVFuYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uKFFOYW1lIHNlcnZpY2VRbmFtZSkgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRGaXJzdFBvcnRCaW5kaW5nKHNlcnZpY2VRbmFtZSk7Ci0gICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb3BPYmogOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKW9wT2JqOwotICAgICAgICAgICAgTGlzdCBleEVsZW1lbnRzID0gb3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChPYmplY3QgZWxPYmogOiBleEVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXhFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsT2JqOwotICAgICAgICAgICAgICAgIGlmIChpc1NvYXBPcGVyYXRpb24oZXhFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbilleEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uKFFOYW1lIHNlcnZpY2VRbmFtZSwgUU5hbWUgcG9ydFFuYW1lKSB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZVFuYW1lLCBwb3J0UW5hbWUpOwotICAgICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICBmb3IgKE9iamVjdCBvcE9iaiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pb3BPYmo7Ci0gICAgICAgICAgICBMaXN0IGV4RWxlbWVudHMgPSBvcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBlbE9iaiA6IGV4RWxlbWVudHMpIHsKLSAgICAgICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxPYmo7Ci0gICAgICAgICAgICAgICAgaWYgKGlzU29hcE9wZXJhdGlvbihleEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKWV4RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNPQVBBY3Rpb24oUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUsIFFOYW1lIG9wZXJhdGlvblFuYW1lKSB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZVFuYW1lLCBwb3J0UW5hbWUpOwotICAgICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICBpZiAob3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9wT2JqIDogb3BlcmF0aW9ucykgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pb3BPYmo7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBleEVsZW1lbnRzID0gb3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBmb3IgKE9iamVjdCBlbE9iaiA6IGV4RWxlbWVudHMpIHsKLSAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbE9iajsKLSAgICAgICAgICAgIGlmIChpc1NvYXBPcGVyYXRpb24oZXhFbGVtZW50KSkgewotICAgICAgICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IChTT0FQT3BlcmF0aW9uKWV4RWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoc29hcE9wZXJhdGlvbi5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhvcGVyYXRpb25RbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBVUkwgZ2V0V1NETExvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy53c2RsVVJMOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvYXBPcGVyYXRpb24oRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXhFbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBXU0RMV3JhcHBlci5TT0FQXzExX09QRVJBVElPTi5lcXVhbHMoZXhFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpOwotICAgICAgICAvL1RPRE86IEFkZCBTb2FwMTIgc3VwcG9ydCBsYXRlcgotICAgICAgICAvLyB8fCBXU0RMV3JhcHBlci5TT0FQXzEyX09QRVJBVElPTi5lcXVhbHMoZXhFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICBEZWZpbml0aW9uIGRlZiA9IGdldERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSBKYXZhMiBTZWN1cml0eSBjb21wbGlhbnQgd2F5IHRvIG9idGFpbiB0aGUgSW5wdXRTdHJlYW0KLSAgICAgKiBmb3IgYSBnaXZlbiBVUkxDb25uZWN0aW9uIG9iamVjdC4gVGhpcyBpcyBuZWVkZWQgYXMgYSBnaXZlbiBVUkxDb25uZWN0aW9uIG9iamVjdAotICAgICAqIG1heSBiZSBhbiBpbnN0YW5jZSBvZiBhIEZpbGVVUkxDb25uZWN0aW9uIG9iamVjdCB3aGljaCB3b3VsZCByZXF1aXJlIGFjY2VzcyAKLSAgICAgKiBwZXJtaXNzaW9ucyBpZiBKYXZhMiBTZWN1cml0eSB3YXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFVSTENvbm5lY3Rpb24gdXJsQ29uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVVJMQ29ubmVjdGlvbiBmaW5hbFVSTENvbiA9IHVybENvbjsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSAoSW5wdXRTdHJlYW0pIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxVUkxDb24uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVidWdNZW1vcnlQYXJtcyhDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIGlmIChjb25maWdDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDZmcgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gcmVkdWNlV1NETE1lbW9yeUNhY2hlID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgcmVkdWNlV1NETE1lbW9yeVR5cGUgPSA5OwotICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHdoYXQgdGhlIHNldHRpbmcgZm9yIHRoZSBtZW1vcnkgb3B0aW1pemF0aW9uIGlzCi0gICAgICAgICAgICBpZiAoYXhpc0NmZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gYXhpc0NmZy5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uUkVEVUNFX1dTRExfTUVNT1JZX0NBQ0hFKTsKLQotICAgICAgICAgICAgICAgIHJlZHVjZVdTRExNZW1vcnlDYWNoZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtICE9IG51bGwgJiYgKChTdHJpbmcpIHBhcmFtLmdldFZhbHVlKCkpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQotCi0gICAgICAgICAgICAgICAgcGFyYW0gPSBheGlzQ2ZnLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGkgPSBuZXcgSW50ZWdlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VXU0RMTWVtb3J5VHlwZSA9IGkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoInJlZHVjZVdTRExNZW1vcnlDYWNoZToiKyByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgKyAiLCByZWR1Y2VXU0RMTWVtb3J5VHlwZToiICsgcmVkdWNlV1NETE1lbW9yeVR5cGUgKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBeGlzQ29uZmlndXJhdGlvbiBpcyBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkNvbmZpZ0NvbnRleHQgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL1dTRExXcmFwcGVyLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy91dGlsL1dTRExXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzFiMTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvdXRpbC9XU0RMV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBEZWZpbmVzIFdTREwgQWNjZXNzIG1ldGhvZHMKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFdyYXBwZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUE9MSUNZID0gbmV3IFFOYW1lKENvbnN0YW50cy5QT0xJQ1ksICJQb2xpY3kiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFBPTElDWV9SRUZFUkVOQ0UgPQotICAgICAgICAgICAgbmV3IFFOYW1lKENvbnN0YW50cy5QT0xJQ1lfUkVGRVJFTkNFLCAiUG9saWN5UmVmZXJlbmNlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTQ0hFTUEgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLlNDSEVNQSwgInNjaGVtYSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMV9CSU5ESU5HID0KLSAgICAgICAgICAgIG5ldyBRTmFtZShDb25zdGFudHMuVVJJX1dTRExfU09BUDExX0JJTkRJTkcsICJiaW5kaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzExX0JPRFkgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9XU0RMX1NPQVAxMV9CT0RZLCAiYm9keSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU09BUF8xMV9IRUFERVIgPQotICAgICAgICAgICAgbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTFfSEVBREVSLCAiaGVhZGVyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzExX09QRVJBVElPTiA9IG5ldyBRTmFtZShDb25zdGFudHMuVVJJX1dTRExfU09BUDExLCAib3BlcmF0aW9uIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzEyX0JJTkRJTkcgPQotICAgICAgICAgICAgbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTJfQklORElORywgImJpbmRpbmciKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTJfQk9EWSA9IG5ldyBRTmFtZShDb25zdGFudHMuVVJJX1dTRExfU09BUDEyX0JPRFksICJib2R5Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTT0FQXzEyX0hFQURFUiA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9XU0RMX1NPQVAxMl9IRUFERVIsICJoZWFkZXIiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFNPQVBfMTJfT1BFUkFUSU9OID0gbmV3IFFOYW1lKENvbnN0YW50cy5VUklfV1NETF9TT0FQMTEsICJvcGVyYXRpb24iKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0Rmlyc3RQb3J0QmluZGluZyhRTmFtZSBzZXJ2aWNlUW5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKFFOYW1lIHNlcnZpY2VRbmFtZSwgUU5hbWUgcG9ydFFuYW1lKTsKLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0UG9ydEJpbmRpbmcoUU5hbWUgc2VydmljZVFuYW1lKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydEJpbmRpbmcoUU5hbWUgc2VydmljZVFuYW1lLCBRTmFtZSBwb3J0UW5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBvcnRzKFFOYW1lIHNlcnZpY2VRbmFtZSk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2UoUU5hbWUgc2VydmljZVFuYW1lKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEFjdGlvbihRTmFtZSBzZXJ2aWNlUW5hbWUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRTT0FQQWN0aW9uKFFOYW1lIHNlcnZpY2VRbmFtZSwgUU5hbWUgcG9ydFFuYW1lKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUEFjdGlvbihRTmFtZSBzZXJ2aWNlUW5hbWUsIFFOYW1lIHBvcnRRTmFtZSwgUU5hbWUgb3BlcmF0aW9uUW5hbWUpOwotCi0gICAgcHVibGljIFVSTCBnZXRXU0RMTG9jYXRpb24oKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRVbndyYXBwZWREZWZpbml0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9XU0RMUmVhZGVyQ29uZmlndXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1dTRExSZWFkZXJDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlOGE5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy93c2RsL1dTRExSZWFkZXJDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbDsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHdpc2ggdG8NCi0gKiBjb25maWd1cmUgYW4gaW5zdGFuY2Ugb2YgYSBXU0RMUmVhZGVyIG9iamVjdC4gSW1wbGVtZW50YXRpb25zDQotICogbWF5IG1vZGlmeSB0aGUgV1NETFJlYWRlciBpbnN0YW5jZSBhcyBuZWVkZWQgaW4gb3JkZXIgdG8NCi0gKiBjcmVhdGUgYSBXU0RMIERlZmluaXRpb24gb2JqZWN0IHRoYXQgcmVmbGVjdHMgdGhlIGRlc2lyZWQNCi0gKiBtZXRhZGF0YS4NCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFJlYWRlckNvbmZpZ3VyYXRvciB7DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2QgYWNjZXB0cyBhIFdTRExSZWFkZXIgaW5zdGFuY2Ugc28gdGhhdCBpbXBsZW1lbnRvcnMNCi0JICogbWF5IG1vZGlmeSB0aGUgaW5zdGFuY2UgYXMgbmVjZXNzYXJ5LiANCi0JICovDQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJlYWRlckluc3RhbmNlKFdTRExSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NETEV4Y2VwdGlvbjsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9XU0RMUmVhZGVyQ29uZmlndXJhdG9ySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvd3NkbC9XU0RMUmVhZGVyQ29uZmlndXJhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZlZjA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3dzZGwvV1NETFJlYWRlckNvbmZpZ3VyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Mud3NkbDsNCi0NCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOw0KLQ0KLS8qKg0KLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5DQotICogYW5kIHdpbGwgYmUgcmV0cmlldmVkIHdoZW4gYSBXU0RMUmVhZGVyIGluc3RhbmNlIGlzIGNyZWF0ZWQuIFRoaXMgaW1wbGVtZW50YXRpb24NCi0gKiB3aWxsIGJlIGFibGUgdG8gY29uZmlndXJlIHRoZSBpbnN0YW5jZSBhcyBuZWVkZWQuDQotICoNCi0gKi8NCi1wdWJsaWMgY2xhc3MgV1NETFJlYWRlckNvbmZpZ3VyYXRvckltcGwgaW1wbGVtZW50cyBXU0RMUmVhZGVyQ29uZmlndXJhdG9yIHsNCi0NCi0JLyoqDQotCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgdG8gY29uZmlndXJlIHRoZSBXU0RMUmVhZGVyIGluc3RhbmNlLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29uZmlndXJlUmVhZGVySW5zdGFuY2UoV1NETFJlYWRlciByZWFkZXIpIHRocm93cyBXU0RMRXhjZXB0aW9uIA0KLQl7DQotCQkvLyBwcmV2ZW50IHRoZSBXU0RMUmVhZGVyIGluc3RhbmNlIGZyb20gdXNpbmcgdGhlIFN5c3RlbS5vdXQNCi0JCS8vIHN0cmVhbSBmb3IgbWVzc2FnZXMgYW5kIGxvZ2dpbmcNCi0JCXJlYWRlci5zZXRGZWF0dXJlKGNvbS5pYm0ud3NkbC5Db25zdGFudHMuRkVBVFVSRV9WRVJCT1NFLCBmYWxzZSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvZmFjdG9yeS9SZXNvdXJjZUZpbmRlckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL2ZhY3RvcnkvUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4N2E3Y2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvZmFjdG9yeS9SZXNvdXJjZUZpbmRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZS5SZXNvdXJjZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlc291cmNlLmltcGwuUmVzb3VyY2VGaW5kZXJJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VGaW5kZXJGYWN0b3J5IHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmNsYXNzKTsKLQotICAgICAgICBwcml2YXRlIFJlc291cmNlRmluZGVyIGZpbmRlciA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIFJlc291cmNlRmluZGVyIGdldFJlc291cmNlRmluZGVyKCkgewotICAgICAgICAgICAgICAgIGlmIChmaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUZpbmRlckltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlRmluZGVyKFJlc291cmNlRmluZGVyIGZpbmRlcikgewotICAgICAgICAgICAgICAgIGlmKHRoaXMuZmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZGVyID0gZmluZGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZWdpc3RyeS9NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVnaXN0cnkvTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNTU4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZWdpc3RyeS9NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5FeGNlcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLldTRExSZWFkZXJDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLldTRExSZWFkZXJDb25maWd1cmF0b3JJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEuZmFjdG9yeS5SZXNvdXJjZUZpbmRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuY2xhc3MpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uRmlsZUxvYyA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTWFwPENsYXNzLE9iamVjdD4gdGFibGU7Ci0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICAgICAgdGFibGUgPSBuZXcgSGFzaHRhYmxlPENsYXNzLE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICB0YWJsZS5wdXQoUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmNsYXNzLCBuZXcgUmVzb3VyY2VGaW5kZXJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIHRhYmxlLnB1dChDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgbmV3IENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIHRhYmxlLnB1dChXU0RMUmVhZGVyQ29uZmlndXJhdG9yLmNsYXNzLCBuZXcgV1NETFJlYWRlckNvbmZpZ3VyYXRvckltcGwoKSk7Ci0gICAgICAgICAgICAgICAgaWYoY29uZmlndXJhdGlvbkZpbGVMb2MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJBIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbiB3YXMgbm90IHNldC4gVGhlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2xsb3dpbmcgbG9jYXRpb24gd2lsbCBiZSB1c2VkOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLk1FVEFEQVRBX1JFR0lTVFJZX0NPTkZJR19GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uRmlsZUxvYyA9IENvbnN0YW50cy5NRVRBREFUQV9SRUdJU1RSWV9DT05GSUdfRklMRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9hZENvbmZpZ0Zyb21GaWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGYWN0b3J5UmVnaXN0cnkgaXMgY3VycmVudGx5IGEgc3RhdGljIHNpbmdsZXRvbgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSgpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIGdldEZhY3RvcnkKLSAgICAgICAgICogQHBhcmFtIGludGZhY2Ugb2YgdGhlIEZhY3RvcnkKLSAgICAgICAgICogQHJldHVybiBPYmplY3QgdGhhdCBpcyB0aGUgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGZhY2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZhY3RvcnkoQ2xhc3MgaW50ZmFjZSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXQoaW50ZmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBzZXRGYWN0b3J5Ci0gICAgICAgICAqIEBwYXJhbSBpbnRmYWNlCi0gICAgICAgICAqIEBwYXJhbSBmYWN0b3J5T2JqZWN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmFjdG9yeShDbGFzcyBpbnRmYWNlLCBPYmplY3QgZmFjdG9yeU9iamVjdCl7Ci0gICAgICAgICAgICAgICAgdGFibGUucHV0KGludGZhY2UsIGZhY3RvcnlPYmplY3QpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBsb2FkIGEgZmlsZSwgaWYgaXQgZXhpc3RzLCB0aGF0IGNvbnRhaW5zIGEgbGlzdAotICAgICAgICAgKiBvZiBpbnRlcmZhY2VzIGFuZCBjdXN0b20gaW1wbGVtZW50YXRpb25zLiBUaGlzIGFsbG93cyBmb3Igbm9uLQotICAgICAgICAgKiBwcm9ncmFtbWF0aWMgcmVnaXN0cmF0aW9uIG9mIGN1c3RvbSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb25zCi0gICAgICAgICAqIHdpdGggdGhlIE1EUSBsYXllci4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9hZENvbmZpZ0Zyb21GaWxlKCkgewotICAgICAgICAgICAgU3RyaW5nIHBhaXJTZXBhcmF0b3IgPSAifCI7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q29udGV4dENsYXNzTG9hZGVyKG51bGwpOwotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICAgICAgICAgIHVybCA9IGNsYXNzTG9hZGVyLmdldFJlc291cmNlKGNvbmZpZ3VyYXRpb25GaWxlTG9jKTsKLSAgICAgICAgICAgICAgICBpZih1cmwgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShjb25maWd1cmF0aW9uRmlsZUxvYyk7Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gdGhlIHByZXNlbmNlIG9mIHRoaXMgZmlsZSBpcyBvcHRpb25hbAotICAgICAgICAgICAgICAgIGlmKHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZvdW5kIFVSTCB0byBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSBjb25maWd1cmF0aW9uIGZpbGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25GaWxlTG9jKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXBhcmF0b3Igb2YgdGhlIGZpbGUgaXMgdGhlICd8JyBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIHNlcGFyYXRvciB3aWxsIGJlIHRoZSBpbnRlcmZhY2UgYW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSByaWdodCB3aWxsIGJlIHRoZSBjdXN0b20gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgaWYobGluZSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuaW5kZXhPZigifCIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZihwYWlyU2VwYXJhdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW1wbE5hbWUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YocGFpclNlcGFyYXRvcikgKyAxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRm9yIHJlZ2lzdGVyZWQgY2xhc3M6ICIgKyBpbnRlcmZhY2VOYW1lICsgIiB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIHdhcyBmb3VuZDogIiArIGltcGxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGludGYgPSBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbXBsID0gY2xhc3NMb2FkZXIubG9hZENsYXNzKGltcGxOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgY291bGQgbG9hZCBib3RoIHdlIG5lZWQgdG8gcmVnaXN0ZXIgdGhlbSB3aXRoIG91cgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJuYWwgcmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGludGYgIT0gbnVsbCAmJiBpbXBsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkxvYWRlZCBib3RoIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24gY2xhc3M6ICIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lICsgIjoiICsgaW1wbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbXBsLmdldEVuY2xvc2luZ0NsYXNzKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5wdXQoaW50ZiwgaW1wbC5uZXdJbnN0YW5jZSgpKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2cuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzOiAiICsgaW1wbC5nZXRDbGFzcygpLmdldE5hbWUoKSArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZCBub3QgYmUgbHJlZ2lzdGVyZWQgYmVjYXVzZSBpdCBpcyBhbiBpbm5lciBjbGFzcy4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW4gb3JkZXIgdG8gcmVnaXN0ZXIgZmlsZS1iYXNlZCBvdmVycmlkZXMsIGltcGxlbWVudGF0aW9ucyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHB1YmxpYyBvdXRlciBjbGFzc2VzLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGxvYWQgYm90aCBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIGNsYXNzOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lICsgIjoiICsgaW1wbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBGaWxlIGZvciBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSBjb25maWd1cmF0aW9uICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU6ICIgKyBjb25maWd1cmF0aW9uRmlsZUxvYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRpZCBub3QgZmluZCBVUkwgZm9yIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5IGNvbmZpZ3VyYXRpb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlOiAiICsgY29uZmlndXJhdGlvbkZpbGVMb2MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgICAgICBpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlRoZSBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSBjb3VsZCBub3QgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlOiAiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25GaWxlTG9jICsgIiBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3I6ICIgKyB0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQYWNrYWdlIHByb3RlY3RlZCBtZXRob2QgdG8gYWxsb3cgdGVzdHMgdG8gc2V0IHRoZSBsb2NhdGlvbgotICAgICAgICAgKiBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAgICAgKiBAcGFyYW0gY29uZmlnRmlsZU5hbWUKLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25GaWxlTG9jYXRpb24oU3RyaW5nIGNvbmZpZ0ZpbGVMb2MpIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25GaWxlTG9jID0gY29uZmlnRmlsZUxvYzsKLSAgICAgICAgICAgIGxvYWRDb25maWdGcm9tRmlsZSgpOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2w7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcikgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlciA6IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJFeGNlcHRpb24gdGhyb3duIGZyb20gQWNjZXNzQ29udHJvbGxlcjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbkZhY3RvcnkubWFrZVdlYlNlcnZpY2VFeGNlcHRpb24oZS5nZXRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2w7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVzb3VyY2UvUmVzb3VyY2VGaW5kZXIuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3Jlc291cmNlL1Jlc291cmNlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTdhZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVzb3VyY2UvUmVzb3VyY2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoKLSAqIFJlc291cmNlRmluZGVyIHdpbGwgYmUgdXNlZCB0byBmaW5kIFJlc291cmNlcyBmcm9tIGEgY2xhc3Nsb2FkZXIuIAotICogZm9yIGV4YW1wbGUgYSBSZXNvdXJjZUZpbmRlciBjYW4gYmUgdXNlZCB0byBnZXQgYWxsIHRoZSByZXNvdXJjZXMgYXMgdXJsIGZyb20gY2xhc3Nsb2FkZXIKLSAqIG9yIGl0IGNhbiBiZSB1c2VkIHRvIGZpbmQgYSBjbGFzcyBpbiBjbGFzc3BhdGggZnJvbSBDbGFzc2xvYWRlci4gCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUZpbmRlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgcmVhZHMgYWxsIHRoZSByZXNvdXJjZSBVUkxzIGF2YWlsYWJsZSB0byB0aGlzIGNsYXNzTG9hZGVyLgotICAgICAqIEBwYXJhbSBjbAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBVUkxbXSBnZXRVUkxzKENsYXNzTG9hZGVyIGNsKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVzb3VyY2UvaW1wbC9SZXNvdXJjZUZpbmRlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3NyYy9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3Jlc291cmNlL2ltcGwvUmVzb3VyY2VGaW5kZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzJkZDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVzb3VyY2UvaW1wbC9SZXNvdXJjZUZpbmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZS5SZXNvdXJjZUZpbmRlcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VGaW5kZXJJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VGaW5kZXIgewotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZXNvdXJjZS5SZXNvdXJjZUZpbmRlciNnZXRVUkxzKGphdmEubGFuZy5DbGFzc0xvYWRlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgVVJMW10gZ2V0VVJMcyhDbGFzc0xvYWRlciBjbCkgewotICAgICAgICBpZihjbCBpbnN0YW5jZW9mIFVSTENsYXNzTG9hZGVyKXsKLSAgICAgICAgICAgIFVSTENsYXNzTG9hZGVyIHVybExvYWRlciA9IChVUkxDbGFzc0xvYWRlciljbDsKLSAgICAgICAgICAgIHJldHVybiB1cmxMb2FkZXIuZ2V0VVJMcygpOwotICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NlMjhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnkuTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5VGVzdHMkVGVzdEludGVyZmFjZXxvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5LlRlc3RJbXBsZW1lbnRhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzZDMxZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+DQotDQotPHBhcmFtZXRlciBuYW1lPSJyZWR1Y2VXU0RMTWVtb3J5Q2FjaGUiPnRydWU8L3BhcmFtZXRlcj4NCi08cGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlUeXBlIj4yPC9wYXJhbWV0ZXI+DQotDQotICAgIDxtb2R1bGVDb25maWcgbmFtZT0idGVzdE1vZHVsZSI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InRlc3RNb2R1bGVQYXJhIj5OL0E8L3BhcmFtZXRlcj4NCi0gICAgPC9tb2R1bGVDb25maWc+DQotDQotICAgIDxtb2R1bGVDb25maWcgbmFtZT0idGVzdE1vZHVsZTIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJ0ZXN0TW9kdWxlUGFyYTIiPk4vQTwvcGFyYW1ldGVyPg0KLSAgICA8L21vZHVsZUNvbmZpZz4NCi0NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4NCi0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPg0KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZhdWx0RmxvdyI+DQotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiOTVjOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSANCi0jIHN2biwgb25lIGZvciBkZXZlbG9wZW1lbnQgKG9uZSBhdCBzcmMvdGVzdC1yZXNvdXJjZXMpIGFuZCBvdGhlciBmb3IgcHJvZHVjYXRpb24NCi0gDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLg0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZw0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nDQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXINCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1NjgxMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLg0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIENPTlNPTEUNCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUsIExPR0ZJTEUNCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUNCi1sb2c0ai5yb290Q2F0ZWdvcnk9RVJST1IsIENPTlNPTEUNCi0NCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMDQotbG9nNGoubG9nZ2VyLmRlLmh1bnNpY2tlci5qYWxvcHkuaW89RkFUQUwNCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTA0KLQ0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbg0KLQ0KLSMgTE9HRklMRSBpcyBzZXQgdG8gYmUgYSBGaWxlIGFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZw0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuQXBwZW5kPXRydWUNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvdGVzdC1oYW5kbGVyLnhtbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3Rlc3QtaGFuZGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NjUyNmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvdGVzdC1oYW5kbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGp3czpoYW5kbGVyLWNoYWlucyB4bWxuczpqd3M9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotCTxqd3M6aGFuZGxlci1jaGFpbiBuYW1lPSJkZW1vIj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+DQotCQkJCWhhbmRsZXIuVGVzdA0KLQkJCTwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQk8L2p3czpoYW5kbGVyLWNoYWluPgkNCi08L2p3czpoYW5kbGVyLWNoYWlucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2Uud3NkbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTAyNmRiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIDwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICAKLTx0eXBlcz4gICAgICAKLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIgeG1sbnM6dHM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmcveHNkIiAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gICAgICAgICAgIAotCTxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZSI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgCi0gICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIAotICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgCi0gICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIAotICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgCi0gICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIAotPC94c2Q6c2NoZW1hPiAgICAKLTwvdHlwZXM+ICAgICAKLQotPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAKLTxwYXJ0IG5hbWU9Im1lc3NhZ2UiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZSIvPiAgICAKLTwvbWVzc2FnZT4gICAgIAotCi08bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgCi08cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIi8+ICAgIAotPC9tZXNzYWdlPiAgICAgCi0KLTxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgCi0gICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIAotICAgICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZSIgLz4gICAgICAgICAgCi0gICAgICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICAKLSAgICAgICA8L29wZXJhdGlvbj4gICAgCi08L3BvcnRUeXBlPiAgICAgCi0KLTxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICAKLSAgICAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+ICAgICAgIAotICAgICAgICAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0PiAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbnB1dD4gICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PiAgICAgICAKLSAgICAgICAgICAgICAgPC9vcGVyYXRpb24+ICAgIAotPC9iaW5kaW5nPiAgICAgCi0KLTxzZXJ2aWNlIG5hbWU9IkVjaG9NZXNzYWdlU2VydmljZSI+ICAgICAgIAotICAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpFY2hvTWVzc2FnZUJpbmRpbmciIG5hbWU9IkVjaG9NZXNzYWdlUG9ydCI+ICAgICAgICAgIAotICAgICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICAKLSAgICAgICA8L3BvcnQ+ICAgICAKLTwvc2VydmljZT4gIAotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlRGVmYXVsdHMud3NkbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZURlZmF1bHRzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODdiZTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlRGVmYXVsdHMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICA8IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iPiAgICAgCi08dHlwZXM+ICAgICAgCi08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciIHhtbG5zOnRzPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnL3hzZCIgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICAKLQk8Y29tcGxleFR5cGUgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICAKLSAgICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgCi0gICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICAKLSAgICAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgCi0gICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2UiIHR5cGU9InRuczplY2hvTWVzc2FnZSIvPiAgICAgICAgICAKLSAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgCi08L3hzZDpzY2hlbWE+ICAgIAotPC90eXBlcz4gICAgIAotCi08bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgIAotPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIAotPC9tZXNzYWdlPiAgICAgCi0KLTxtZXNzYWdlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAKLTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgCi08L21lc3NhZ2U+ICAgICAKLQotPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICAKLSAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgCi0gICAgICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICAKLSAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIAotICAgICAgIDwvb3BlcmF0aW9uPiAgICAKLTwvcG9ydFR5cGU+ICAgICAKLQotPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIAotICAgICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgCi0gICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4gICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQ+ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5wdXQ+ICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0PiAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPiAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3V0cHV0PiAgICAgICAKLSAgICAgICAgICAgICAgIDwvb3BlcmF0aW9uPiAgICAKLTwvYmluZGluZz4gICAgIAotCi08c2VydmljZSBuYW1lPSJFY2hvTWVzc2FnZVNlcnZpY2UiPiAgICAgICAKLSAgICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJFY2hvTWVzc2FnZVBvcnQiPiAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvRWNob01lc3NhZ2VTZXJ2aWNlL0VjaG9NZXNzYWdlU2VydmljZSIvPiAgICAgICAKLSAgICAgICA8L3BvcnQ+ICAgICAKLTwvc2VydmljZT4gIAotCi08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9DbGllbnRFbmRwb2ludE1ldGFkYXRhLndzZGwgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudEVuZHBvaW50TWV0YWRhdGEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4NmVkMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudEVuZHBvaW50TWV0YWRhdGEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICANCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkNsaWVudERCQ1N1cHBvcnRFbmRwb2ludFRlc3RzIg0KLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50VGVzdHMiDQotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyINCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+ICAgICANCi0gIDx0eXBlcz4gICAgICANCi0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgDQotICAgICAgICAgICAgICAgIHhtbG5zOnRzPSJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy94c2QiDQotICAgICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4NCi0gICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgICAgICAgDQotICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NZXNzYWdlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgICA8L3hzZDpzY2hlbWE+ICAgIA0KLSAgPC90eXBlcz4gICAgIA0KLQ0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi0gICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLSAgPC9tZXNzYWdlPiAgICAgDQotDQotICA8bWVzc2FnZSBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIj4gICAgICAgDQotICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotICA8L21lc3NhZ2U+ICAgICANCi0NCi0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlIiAvPiAgICAgICAgICANCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTWVzc2FnZVJlc3BvbnNlIiAvPiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9wb3J0VHlwZT4gICAgIA0KLQ0KLSAgPGJpbmRpbmcgbmFtZT0iRWNob01lc3NhZ2VCaW5kaW5nIiB0eXBlPSJ0bnM6RWNob01lc3NhZ2VQb3J0VHlwZSI+ICAgICAgIA0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICAgICANCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgPGlucHV0PiAgICAgICAgICAgICANCi0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLz4gICAgICAgICAgDQotICAgICAgPC9pbnB1dD4gICAgICAgICAgIA0KLSAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL29yZy5hcGFjaGUuYmluZGluZy5ucyIvPiAgICAgICAgIA0KLSAgICAgIDwvb3V0cHV0PiAgICAgICANCi0gICAgPC9vcGVyYXRpb24+ICAgIA0KLSAgPC9iaW5kaW5nPiAgICAgDQotDQotICA8c2VydmljZSBuYW1lPSJzdmNMb2NhbFBhcnQiPiAgICAgICANCi0gICAgPHBvcnQgYmluZGluZz0idG5zOkVjaG9NZXNzYWdlQmluZGluZyIgbmFtZT0icG9ydExvY2FsUGFydCI+ICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9FY2hvTWVzc2FnZVNlcnZpY2UvRWNob01lc3NhZ2VTZXJ2aWNlIi8+ICAgICAgIA0KLSAgICA8L3BvcnQ+ICAgICANCi0gIDwvc2VydmljZT4gIA0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZVNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvRWNob01lc3NhZ2VTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTYwOGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9FY2hvTWVzc2FnZVNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+ICA8IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4gICAgIA0KLTx0eXBlcz4gICAgICANCi08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciIHhtbG5zOnRzPSJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnL3hzZCIgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+ICAgICAgICAgICANCi0JPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPHNlcXVlbmNlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9NZXNzYWdlUmVzcG9uc2UiPiAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8c2VxdWVuY2U+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4gICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L3NlcXVlbmNlPiAgICAgICAgICANCi0gICAgICAgPC9jb21wbGV4VHlwZT4gICAgICAgICAgIA0KLSAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlIi8+ICAgICAgICAgIA0KLSAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTWVzc2FnZVJlc3BvbnNlIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2VSZXNwb25zZSIvPiAgICAgICAgDQotPC94c2Q6c2NoZW1hPiAgICANCi08L3R5cGVzPiAgICAgDQotDQotPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2UiPiAgICAgICANCi08cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgDQotPC9tZXNzYWdlPiAgICAgDQotDQotPG1lc3NhZ2UgbmFtZT0iZWNob01lc3NhZ2VSZXNwb25zZSI+ICAgICAgIA0KLTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotPC9tZXNzYWdlPiAgICAgDQotDQotPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWVzc2FnZSI+ICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01lc3NhZ2UiIC8+ICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgICAgICA8L29wZXJhdGlvbj4gICAgDQotPC9wb3J0VHlwZT4gICAgIA0KLQ0KLTxiaW5kaW5nIG5hbWU9IkVjaG9NZXNzYWdlQmluZGluZyIgdHlwZT0idG5zOkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gICAgICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPiAgICAgICANCi0gICAgICAgICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NZXNzYWdlIj4gICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+ICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dD4gICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+ICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPiAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L291dHB1dD4gICAgICAgDQotICAgICAgICAgICAgICAgPC9vcGVyYXRpb24+ICAgIA0KLTwvYmluZGluZz4gICAgIA0KLQ0KLTxzZXJ2aWNlIG5hbWU9IkVjaG9NZXNzYWdlU2VydmljZSI+ICAgICAgIA0KLSAgICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJFY2hvTWVzc2FnZVBvcnQiPiAgICAgICAgICANCi0gICAgICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL0VjaG9NZXNzYWdlU2VydmljZS9FY2hvTWVzc2FnZVNlcnZpY2UiLz4gICAgICAgDQotICAgICAgIDwvcG9ydD4gICAgIA0KLTwvc2VydmljZT4gIA0KLQ0KLTwvZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDEud3NkbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDM0NWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxU2VydmljZSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWE+Ci0gICAgICA8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHNjaGVtYUxvY2F0aW9uPSJQYXJ0aWFsV1NETDFfc2NoZW1hLnhzZCIvPgotICAgIDwveHNkOnNjaGVtYT4KLSAgPC90eXBlcz4KLSAgPG1lc3NhZ2UgbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnMiLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iPgotICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPHBvcnRUeXBlIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDEiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnMiLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbWVzc2FnZT0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotCi08IS0tICBQYXJ0aWFsIFdTREwgMTogTm8gYmluZGluZywgc2VydmljZSwgb3IgcG9ydCBpbmZvcm1hdGlvbgotICAgIDxiaW5kaW5nIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyIgdHlwZT0idG5zOkFkZE51bWJlcnNJbXBsUGFydGlhbDEiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvb3V0cHV0PgotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2ZhdWx0PgotICAgIDwvb3BlcmF0aW9uPgotICA8L2JpbmRpbmc+Ci0gIDxzZXJ2aWNlIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydCIgYmluZGluZz0idG5zOkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0QmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vQFJFUExBQ0VfV0lUSF9IT1NUX05BTUVAOkBSRVBMQUNFX1dJVEhfUE9SVF9OVU1AL3dlYmZhdWx0Y2hrZXhjL3dlYmZhdWx0Y2hrZXhjcDEiLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLS0tPgotICAKLTwvZGVmaW5pdGlvbnM+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMV9zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTk1MDYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwxX3NjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB2ZXJzaW9uPSIxLjAiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzIiB0eXBlPSJuczE6YWRkVHdvTnVtYmVycyIgeG1sbnM6bnMxPSJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIi8+Ci0KLSAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImFkZFR3b051bWJlcnMiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9ImFyZzAiIHR5cGU9InhzOmludCIvPgotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iYXJnMSIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLQotICA8eHM6ZWxlbWVudCBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiIHR5cGU9Im5zMjphZGRUd29OdW1iZXJzUmVzcG9uc2UiIHhtbG5zOm5zMj0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIvPgotCi0gIDx4czpjb21wbGV4VHlwZSBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiPgotICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgIDx4czplbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ieHM6aW50Ii8+Ci0gICAgPC94czpzZXF1ZW5jZT4KLSAgPC94czpjb21wbGV4VHlwZT4KLTwveHM6c2NoZW1hPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMi53c2RsIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9QYXJ0aWFsV1NETDIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiMDQ2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1BhcnRpYWxXU0RMMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx0eXBlcz4KLSAgICA8eHNkOnNjaGVtYT4KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgc2NoZW1hTG9jYXRpb249IlBhcnRpYWxXU0RMMV9zY2hlbWEueHNkIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3R5cGVzPgotCi08IS0tICBQYXJ0aWFsIFdTREwgMjogT25seSB0eXBlcyBzcGVjaWZpZWQKLSAgPG1lc3NhZ2UgbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnMiLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzUmVzcG9uc2UiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iPgotICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPHBvcnRUeXBlIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDEiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnMiLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbWVzc2FnZT0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3BvcnRUeXBlPgotCi0gICAgPGJpbmRpbmcgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvZmF1bHQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLSAgPHNlcnZpY2UgbmFtZT0iQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVNlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFQb3J0IiBiaW5kaW5nPSJ0bnM6QWRkTnVtYmVyc0ltcGxQYXJ0aWFsMVBvcnRCaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9AUkVQTEFDRV9XSVRIX0hPU1RfTkFNRUA6QFJFUExBQ0VfV0lUSF9QT1JUX05VTUAvd2ViZmF1bHRjaGtleGMvd2ViZmF1bHRjaGtleGNwMSIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotLS0+Ci0gIAotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvUHJveHlEb2NMaXRXcmFwcGVkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmVmYzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9Qcm94eURvY0xpdFdyYXBwZWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0JeG1sbnM6dG5zPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJwcm94eSIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnIj4KLQotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYQotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZyIKLQkJCXhtbG5zOnRucz0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmciCi0JCQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik15RmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvbmVXYXlWb2lkIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlIC8+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0ib25lV2F5Ij4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Im9uZXdheV9zdHIiCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0idHdvV2F5SG9sZGVyIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheUhvbGRlcl9zdHIiCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d29XYXlIb2xkZXJfaW50IgotCQkJCQkJCXR5cGU9InhzZDppbnQiIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQotCQkJPHhzZDplbGVtZW50IG5hbWU9InR3b1dheSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ0d293YXlfc3RyIgotCQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQotCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldHVyblR5cGUiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuX3N0ciIKLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2UiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW52b2tlX3N0ciIKLQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZva2VSZXR1cm5UeXBlIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InJldHVybl9zdHIiCi0JCQkJCQkJdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0KLQkJCQotCi0JCQk8IS0tIGZpbiBvcCBkZWZpbml0aW9uIC0tPgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3AiPgotCQkJCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3AiCi0JCQkJCQkJdHlwZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JCQk8L3hzZDplbGVtZW50PgotCi0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmluT3BSZXNwb25zZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIKLQkJCQkJCQl0eXBlPSJ0bnM6RmluYW5jaWFsT3BlcmF0aW9uIiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQkJCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRmluYW5jaWFsT3BlcmF0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iYW1vdW50IiB0eXBlPSJ4c2Q6ZmxvYXQiIC8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpjb21wbGV4VHlwZT4KLQotCQkJPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaXRoZHJhdyI+Ci0JCQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idG5zOkZpbmFuY2lhbE9wZXJhdGlvbiI+Ci0JCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJtZW1vIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlcG9zaXQiPgotCQkJCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRuczpGaW5hbmNpYWxPcGVyYXRpb24iPgotCQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ic3RhdHVzIgotCQkJCQkJCQl0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVZvaWRSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOm9uZVdheVZvaWQiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Im9uZVdheVJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6b25lV2F5IiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlIb2xkZXJSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheUhvbGRlciIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5SG9sZGVyUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6dHdvV2F5SG9sZGVyIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJ0d29XYXlSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOnR3b1dheSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0idHdvV2F5UmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImFsbEJ5TXlzZWxmIiBlbGVtZW50PSJ0bnM6UmV0dXJuVHlwZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iaW52b2tlUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iYWxsQnlNeXNlbGYiIGVsZW1lbnQ9InRuczppbnZva2UiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9Imludm9rZVJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJhbGxCeU15c2VsZiIgZWxlbWVudD0idG5zOlJldHVyblR5cGUiIC8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImZpbk9wUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcCIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluT3BSZXNwb25zZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0ib3AiIGVsZW1lbnQ9InRuczpmaW5PcFJlc3BvbnNlIiAvPgotCTwvd3NkbDptZXNzYWdlPgotCi0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iRG9jTGl0V3JhcHBlZFByb3h5Ij4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0ib25lV2F5Vm9pZCI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5Vm9pZFJlcXVlc3QiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6b25lV2F5UmVxdWVzdCIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlIb2xkZXJSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5Ij4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXF1ZXN0IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp0d29XYXlSZXNwb25zZSIgLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJpbnZva2UiPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOmludm9rZVJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmludm9rZVJlc3BvbnNlIiAvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpmaW5PcFJlcXVlc3QiIC8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmZpbk9wUmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0KLQk8L3dzZGw6cG9ydFR5cGU+Ci0KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlByb3h5RG9jTGl0V3JhcHBlZCIKLQkJdHlwZT0idG5zOkRvY0xpdFdyYXBwZWRQcm94eSI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotCQkJdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIC8+Ci0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheVZvaWQiPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Im9uZVdheSI+Ci0JCQk8c29hcDpvcGVyYXRpb24KLQkJCQlzb2FwQWN0aW9uPSJodHRwOi8vZG9jbGl0d3JhcHBlZC5wcm94eS50ZXN0Lm9yZy90d29XYXlSZXR1cm4iIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0idHdvV2F5SG9sZGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbgotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOm91dHB1dD4KLQotCQk8L3dzZGw6b3BlcmF0aW9uPgotCi0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ0d29XYXkiPgotCQkJPHNvYXA6b3BlcmF0aW9uCi0JCQkJc29hcEFjdGlvbj0iaHR0cDovL2RvY2xpdHdyYXBwZWQucHJveHkudGVzdC5vcmcvdHdvV2F5UmV0dXJuIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCi0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iaW52b2tlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbgotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL3R3b1dheVJldHVybiIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOm91dHB1dD4KLQotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQkKLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbk9wIj4KLQkJCTxzb2FwOm9wZXJhdGlvbgotCQkJCXNvYXBBY3Rpb249Imh0dHA6Ly9kb2NsaXR3cmFwcGVkLnByb3h5LnRlc3Qub3JnL2Zpbk9wIiAvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCi0JCTwvd3NkbDpvcGVyYXRpb24+Ci0KLQk8L3dzZGw6YmluZGluZz4KLQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZSI+Ci0JCTx3c2RsOnBvcnQgYmluZGluZz0idG5zOlByb3h5RG9jTGl0V3JhcHBlZCIKLQkJCW5hbWU9IlByb3h5RG9jTGl0V3JhcHBlZFBvcnQiPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvYXhpczIvc2VydmljZXMvUHJveHlEb2NMaXRXcmFwcGVkU2VydmljZS9pbnZva2UiIC8+Ci0JCTwvd3NkbDpwb3J0PgotCTwvd3NkbDpzZXJ2aWNlPgotCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1Jlc3BlY3RCaW5kaW5nLndzZGwgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1Jlc3BlY3RCaW5kaW5nLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjEzM2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC1yZXNvdXJjZXMvd3NkbC9SZXNwZWN0QmluZGluZy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4gIDwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iDQotICB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2ZlYXR1cmUvcmVzcGVjdGJpbmRpbmciDQotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIg0KLSAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyINCi0gIHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIg0KLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9mZWF0dXJlL3Jlc3BlY3RiaW5kaW5nIj4gICAgIA0KLTx0eXBlcz4gICAgICANCi0gIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9yZXNwZWN0YmluZGluZyIgDQotICAgIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9yZXNwZWN0YmluZGluZyINCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiANCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPiAgICAgICAgICAgDQotCTxjb21wbGV4VHlwZSBuYW1lPSJlY2hvIj4NCi0JICA8c2VxdWVuY2U+DQotICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgPC9zZXF1ZW5jZT4gICAgICAgICAgDQotICAgIDwvY29tcGxleFR5cGU+ICAgICAgICAgICANCi0gICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVjaG9SZXNwb25zZSI+ICAgICAgICAgICAgIA0KLSAgICAgIDxzZXF1ZW5jZT4gICAgICAgICAgICAgICAgDQotICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAgICAgICAgIA0KLSAgICAgIDwvc2VxdWVuY2U+ICAgICAgICAgIA0KLSAgICA8L2NvbXBsZXhUeXBlPiAgICAgICAgICAgDQotICAgICAgIA0KLSAgICA8ZWxlbWVudCBuYW1lPSJlY2hvIiB0eXBlPSJ0bnM6ZWNob01lc3NhZ2UiLz4gICAgICAgICAgDQotICAgIDxlbGVtZW50IG5hbWU9ImVjaG9SZXNwb25zZSIgdHlwZT0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgICAgIA0KLSAgPC94c2Q6c2NoZW1hPiAgICANCi08L3R5cGVzPiAgICAgDQotDQotPG1lc3NhZ2UgbmFtZT0iZWNobyI+ICAgICAgIA0KLSAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlIi8+ICAgIA0KLTwvbWVzc2FnZT4gICAgIA0KLQ0KLTxtZXNzYWdlIG5hbWU9ImVjaG8iPiANCi0gIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0idG5zOmVjaG9NZXNzYWdlUmVzcG9uc2UiLz4gICAgDQotPC9tZXNzYWdlPiAgICAgDQotDQotPHBvcnRUeXBlIG5hbWU9IkVjaG9NZXNzYWdlUG9ydFR5cGUiPiAgICAgICANCi0gIDxvcGVyYXRpb24gbmFtZT0iZWNobyI+ICAgICAgICAgIA0KLSAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG8iIC8+ICAgICAgICAgIA0KLSAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvUmVzcG9uc2UiIC8+ICAgICAgIA0KLSAgPC9vcGVyYXRpb24+ICAgIA0KLTwvcG9ydFR5cGU+ICAgICANCi0NCi08YmluZGluZyBuYW1lPSJFY2hvTWVzc2FnZUJpbmRpbmciIHR5cGU9InRuczpFY2hvTWVzc2FnZVBvcnRUeXBlIj4gICAgICAgDQotICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4gICAgICAgDQotICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPiAgICAgICAgICANCi0gICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPiAgICAgICAgIA0KLSAgICA8aW5wdXQ+ICAgICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+ICAgICAgICAgIA0KLSAgICA8L2lucHV0PiAgICAgICAgICAgDQotICAgIDxvdXRwdXQ+ICAgICAgICAgICAgIA0KLSAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPiAgICAgICAgIA0KLSAgICA8L291dHB1dD4gICAgICAgDQotICA8L29wZXJhdGlvbj4gICANCi0NCi0gIDx3c2F3OlVzaW5nQWRkcmVzc2luZyByZXF1aXJlZD0idHJ1ZSIgLz4gDQotPC9iaW5kaW5nPiAgICAgDQotDQotPHNlcnZpY2UgbmFtZT0iRWNob01lc3NhZ2VTZXJ2aWNlIj4gICAgICAgDQotICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJEZWZhdWx0U2VydmljZVBvcnQiPiAgICAgICAgICANCi0gICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Vua25vd24iLz4gICAgICAgDQotICA8L3BvcnQ+DQotICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJEaXNhYmxlZFNlcnZpY2VQb3J0Ij4gICAgICAgICAgDQotICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC91bmtub3duIi8+ICAgICAgIA0KLSAgPC9wb3J0PiAgICAgDQotICA8cG9ydCBiaW5kaW5nPSJ0bnM6RWNob01lc3NhZ2VCaW5kaW5nIiBuYW1lPSJDb21wbGV0ZVNlcnZpY2VQb3J0Ij4gICAgICAgICAgDQotICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC91bmtub3duIi8+ICAgICAgIA0KLSAgPC9wb3J0PiAgICAgDQotPC9zZXJ2aWNlPiAgDQotDQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0LXJlc291cmNlcy93c2RsL1ZhbGlkYXRlV1NETDEud3NkbCBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVmFsaWRhdGVXU0RMMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzIwYTA0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3QtcmVzb3VyY2VzL3dzZGwvVmFsaWRhdGVXU0RMMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIG5hbWU9IkFkZE51bWJlcnNJbXBsUGFydGlhbDFTZXJ2aWNlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx0eXBlcz4KLSAgICA8eHNkOnNjaGVtYT4KLSAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIgc2NoZW1hTG9jYXRpb249IlBhcnRpYWxXU0RMMV9zY2hlbWEueHNkIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3R5cGVzPgotICA8bWVzc2FnZSBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkVHdvTnVtYmVycyIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9ImFkZFR3b051bWJlcnNSZXNwb25zZSI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgPHBhcnQgbmFtZT0iZmF1bHQiIGVsZW1lbnQ9InRuczpBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iVmFsaWRhdGVXU0RMSW1wbDEiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVycyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnMiLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmFkZFR3b051bWJlcnNSZXNwb25zZSIvPgotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgbWVzc2FnZT0idG5zOkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIvPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkVHdvTnVtYmVyczIiPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczphZGRUd29OdW1iZXJzIi8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczphZGRUd29OdW1iZXJzUmVzcG9uc2UiLz4KLSAgICAgIDxmYXVsdCBuYW1lPSJBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iIG1lc3NhZ2U9InRuczpBZGROZWdhdGl2ZU51bWJlcnNFeGNlcHRpb24iLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydEJpbmRpbmciIHR5cGU9InRuczpWYWxpZGF0ZVdTRExJbXBsMSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgICA8ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIj4KLSAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iQWRkTmVnYXRpdmVOdW1iZXJzRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvZmF1bHQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJhZGRUd29OdW1iZXJzMiI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvb3V0cHV0PgotICAgICAgPGZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkFkZE5lZ2F0aXZlTnVtYmVyc0V4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2ZhdWx0PgotICAgIDwvb3BlcmF0aW9uPgotICA8L2JpbmRpbmc+Ci0gIDxzZXJ2aWNlIG5hbWU9IlZhbGlkYXRlV1NETEltcGwxU2VydmljZUludmFsaWRQb3J0Ij4KLSAgICA8cG9ydCBuYW1lPSJWYWxpZGF0ZVdTRExJbXBsMVBvcnQiIGJpbmRpbmc9InRuczpBZGROdW1iZXJzSW1wbFBhcnRpYWwxUG9ydEJpbmRpbmciPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL0BSRVBMQUNFX1dJVEhfSE9TVF9OQU1FQDpAUkVQTEFDRV9XSVRIX1BPUlRfTlVNQC93ZWJmYXVsdGNoa2V4Yy93ZWJmYXVsdGNoa2V4Y3AxIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci0gIAotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25Qcm92aWRlckltcGxEZXNjcmlwdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblByb3ZpZGVySW1wbERlc2NyaXB0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkZmU5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblByb3ZpZGVySW1wbERlc2NyaXB0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1EUUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Qcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZU1vZGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25Qcm92aWRlckltcGxEZXNjcmlwdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIE5vdGUgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbmNyZWFzZSB0aGUgamF2YSBoZWFwIHNpemUsIGZvciBleGFtcGxlCi0gICAgICAgIC8vIC1YbXg1MTJtLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIG1hdmVuLmp1bml0Lmp2bWFyZ3MgaW4gcHJvamVjdC5wcm9wZXJ0aWVzLgotICAgICAgICAvLyBUbyBjaGFuZ2UgdGhlIHNldHRpbmdzLCBlZGl0IHRoZSBsb2c0ai5wcm9wZXJ0eSBmaWxlCi0gICAgICAgIC8vIGluIHRoZSB0ZXN0LXJlc291cmNlcyBkaXJlY3RvcnkuCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oQmFzaWNQcm92aWRlclRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5Nb2RlLk1FU1NBR0UsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub0JpbmRpbmdUeXBlVmFsdWUoKSk7Ci0gICAgICAgIC8vIFRoZSBXZWJTZXJ2aWNlUHJvdmlkZXIgYW5ub3RhdGlvbiBzcGVjaWZpZWQgbm8gdmFsdWVzIG9uIGl0LgotICAgICAgICAvLyBUT0RPOiBXaGVuIHRoZSBEZXNjcmlwdGlvbiBwYWNrYWdlIGNoYW5nZXMgdG8gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyB3aGVuIG5vIGFubm90YXRpb24gcHJlc2VudCwgdGhpcyBtYXkgbmVlZCB0byBjaGFuZ2UuCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCYXNpY1Byb3ZpZGVyVGVzdEltcGxTZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJCYXNpY1Byb3ZpZGVyVGVzdEltcGxQb3J0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1Byb3ZpZGVyV2l0aEpNUygpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihCYXNpY1Byb3ZpZGVySk1TVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5kcG9pbnREZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IChFbmRwb2ludERlc2NyaXB0aW9uSmF2YSllbmRwb2ludERlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXJ2aWNlLk1vZGUuTUVTU0FHRSwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vU2VydmljZU1vZGVWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORywKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub0JpbmRpbmdUeXBlVmFsdWUoKSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUaGUgV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb24gc3BlY2lmaWVkIG5vIHZhbHVlcyBvbiBpdC4KLSAgICAgICAgLy8gVE9ETzogV2hlbiB0aGUgRGVzY3JpcHRpb24gcGFja2FnZSBjaGFuZ2VzIHRvIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgd2hlbiBubyBhbm5vdGF0aW9uIHByZXNlbnQsIHRoaXMgbWF5IG5lZWQgdG8gY2hhbmdlLgotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VXU0RMTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQmFzaWNQcm92aWRlckpNU1Rlc3RJbXBsU2VydmljZSIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQmFzaWNQcm92aWRlckpNU1Rlc3RJbXBsUG9ydCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVByb3ZpZGVyKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VQcm92aWRlclRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5Nb2RlLlBBWUxPQUQsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub0JpbmRpbmdUeXBlVmFsdWUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3NkbC50ZXN0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm92aWRlclNlcnZpY2UiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUHJvdmlkZXJTZXJ2aWNlUG9ydCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQb3J0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbmFtZXNwYWNlLnRlc3QiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVByb3ZpZGVyV2l0aEpNUygpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXJKTVNUZXN0SW1wbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmRwb2ludERlc2MubGVuZ3RoKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKWVuZHBvaW50RGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlcnZpY2UuTW9kZS5QQVlMT0FELCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9TZXJ2aWNlTW9kZVZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93c2RsLnRlc3QiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlByb3ZpZGVyU2VydmljZSIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm92aWRlclNlcnZpY2VQb3J0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9uYW1lc3BhY2UudGVzdCIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTZXJ2aWNlTW9kZVByb3ZpZGVyKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGVmYXVsdFNlcnZpY2VNb2RlUHJvdmlkZXJUZXN0SW1wbC5jbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmRwb2ludERlc2MubGVuZ3RoKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gKEVuZHBvaW50RGVzY3JpcHRpb25KYXZhKWVuZHBvaW50RGVzY1swXTsKLSAgICAgICAgLy8gRGVmYXVsdCBTZXJ2aWNlTW9kZSBpcyBQQVlMT0FEIHBlciBKQVhXUyBwLiA4MAotICAgICAgICBhc3NlcnRFcXVhbHMoU2VydmljZS5Nb2RlLlBBWUxPQUQsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwL2h0dHAiLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TZXJ2aWNlTW9kZVByb3ZpZGVyKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKE5vU2VydmljZU1vZGVQcm92aWRlclRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjWzBdOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5QQVlMT0FELCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9TZXJ2aWNlTW9kZVZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vQmluZGluZ1R5cGVWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9XZWJTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihOb1dlYlNlcnZpY2VQcm92aWRlclRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gbm90IGNhdWdodCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHN1Y2Nlc3NmdWwgdGVzdCBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiV3JvbmcgZXhjZXB0aW9uIGNhdWdodC4gIEV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gYnV0IGNhdWdodCAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aFdlYlNlcnZpY2VBbm5vdGF0aW9ucygpIHsKLSAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEJvdGhXZWJTZXJ2aWNlQW5ub3RhdGlvblRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIFdlYlNlcnZpY2VFeGNlcHRpb24gbm90IGNhdWdodCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHN1Y2Nlc3NmdWwgdGVzdCBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJXcm9uZyBleGNlcHRpb24gY2F1Z2h0LiAgRXhwZWN0ZWQgV2ViU2VydmljZUV4Y2VwdGlvbiBidXQgY2F1Z2h0ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlTW9kZU9uTm9uUHJvdmlkZXIoKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oV2ViU2VydmljZVNFSVRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZHBvaW50RGVzYy5sZW5ndGgpOwotCi0gICAgICAgIC8vIFRPRE86IEhvdyB3aWxsIHRoZSBKQVgtV1MgZGlzcGF0Y2hlciBnZXQgdGhlIGFwcHJvcHJpYXRlIHBvcnQgKGkuZS4gZW5kcG9pbnQpPyAgQ3VycmVudGx5IGFzc3VtZXMgWzBdCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpZW5kcG9pbnREZXNjWzBdOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1NlcnZpY2VNb2RlVmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9CaW5kaW5nVHlwZVZhbHVlKCkpOwotICAgIH0KLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy9CYXNpYyBQcm92aWRlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBTZXJ2aWNlTW9kZSh2YWx1ZSA9IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1AQmluZGluZ1R5cGUodmFsdWUgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAvIikKLWNsYXNzIEJhc2ljUHJvdmlkZXJUZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7Ci0gcHVibGljIEJhc2ljUHJvdmlkZXJUZXN0SW1wbCgpIHsKLSB9Ci0KLSBwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIG9iaikgewotICAgICByZXR1cm4gbnVsbDsKLSB9Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vQmFzaWMgUHJvdmlkZXIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB1c2luZyBTT0FQL0pNUwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AU2VydmljZU1vZGUodmFsdWUgPSBTZXJ2aWNlLk1vZGUuTUVTU0FHRSkKLUBXZWJTZXJ2aWNlUHJvdmlkZXIoKQotQEJpbmRpbmdUeXBlKE1EUUNvbnN0YW50cy5TT0FQMTJKTVNfQklORElORykKLWNsYXNzIEJhc2ljUHJvdmlkZXJKTVNUZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7Ci0gcHVibGljIEJhc2ljUHJvdmlkZXJKTVNUZXN0SW1wbCgpIHsKLSB9Ci0KLSBwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIG9iaikgewotICAgICByZXR1cm4gbnVsbDsKLSB9Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vV2ViU2VydmljZVByb3ZpZGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFNlcnZpY2VNb2RlKHZhbHVlID0gU2VydmljZS5Nb2RlLlBBWUxPQUQpCi1AV2ViU2VydmljZVByb3ZpZGVyKHNlcnZpY2VOYW1lID0gIlByb3ZpZGVyU2VydmljZSIsIHBvcnROYW1lID0gIlByb3ZpZGVyU2VydmljZVBvcnQiLAotICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25hbWVzcGFjZS50ZXN0Iiwgd3NkbExvY2F0aW9uID0gImh0dHA6Ly93c2RsLnRlc3QiKQotQEJpbmRpbmdUeXBlKHZhbHVlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIpCi1jbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJUZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gewotIHB1YmxpYyBXZWJTZXJ2aWNlUHJvdmlkZXJUZXN0SW1wbCgpIHsKLSB9Ci0KLSBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgb2JqKSB7Ci0gICAgIHJldHVybiBudWxsOwotIH0KLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy9XZWJTZXJ2aWNlUHJvdmlkZXIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AU2VydmljZU1vZGUodmFsdWUgPSBTZXJ2aWNlLk1vZGUuUEFZTE9BRCkKLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWUgPSAiUHJvdmlkZXJTZXJ2aWNlIiwgcG9ydE5hbWUgPSAiUHJvdmlkZXJTZXJ2aWNlUG9ydCIsCi0gICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbmFtZXNwYWNlLnRlc3QiLCB3c2RsTG9jYXRpb24gPSAiaHR0cDovL3dzZGwudGVzdCIpCi1AQmluZGluZ1R5cGUoTURRQ29uc3RhbnRzLlNPQVAxMkpNU19CSU5ESU5HKQotY2xhc3MgV2ViU2VydmljZVByb3ZpZGVySk1TVGVzdEltcGwgaW1wbGVtZW50cyBQcm92aWRlcjxTdHJpbmc+IHsKLSBwdWJsaWMgV2ViU2VydmljZVByb3ZpZGVySk1TVGVzdEltcGwoKSB7Ci0gfQotCi0gcHVibGljIFN0cmluZyBpbnZva2UoU3RyaW5nIG9iaikgewotICAgICByZXR1cm4gbnVsbDsKLSB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBEZWZhdWx0IFNlcnZpY2VNb2RlIGFuZCBCaW5kaW5nVHlwZSBQcm92aWRlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLyBEZWZhdWx0IGlzIFBBWUxPQUQgcGVyIEpBWFdTIHAuIDgwCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AU2VydmljZU1vZGUoKQotQFdlYlNlcnZpY2VQcm92aWRlcigpCi1AQmluZGluZ1R5cGUoKQotY2xhc3MgRGVmYXVsdFNlcnZpY2VNb2RlUHJvdmlkZXJUZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFN0cmluZz4gewotICAgIHB1YmxpYyBEZWZhdWx0U2VydmljZU1vZGVQcm92aWRlclRlc3RJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTm8gU2VydmljZU1vZGUgYW5kIG5vIEJpbmRpbmdUeXBlIFByb3ZpZGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoKQotY2xhc3MgTm9TZXJ2aWNlTW9kZVByb3ZpZGVyVGVzdEltcGwgaW1wbGVtZW50cyBQcm92aWRlcjxTb3VyY2U+IHsKLSAgICBwdWJsaWMgTm9TZXJ2aWNlTW9kZVByb3ZpZGVyVGVzdEltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFNvdXJjZSBpbnZva2UoU291cmNlIG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBOTyBXZWJTZXJ2aWNlUHJvdmlkZXIgUHJvdmlkZXIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy8gVGhpcyBpcyBhbiBJTlZBTElEIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBTZXJ2aWNlTW9kZSh2YWx1ZSA9IFNlcnZpY2UuTW9kZS5NRVNTQUdFKQotQEJpbmRpbmdUeXBlKHZhbHVlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIpCi1jbGFzcyBOb1dlYlNlcnZpY2VQcm92aWRlclRlc3RJbXBsIGltcGxlbWVudHMgUHJvdmlkZXI8U09BUE1lc3NhZ2U+IHsKLSAgICBwdWJsaWMgTm9XZWJTZXJ2aWNlUHJvdmlkZXJUZXN0SW1wbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgaW52b2tlKFNPQVBNZXNzYWdlIG9iaikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBCT1RIIFdlYlNlcnZpY2UgYW5kIFdlYlNlcnZpY2VQcm92aWRlciBQcm92aWRlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLyBUaGlzIGlzIGFuIElOVkFMSUQgc2VydmljZSBpbXBsZW1lbnRhdGlvbgotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AU2VydmljZU1vZGUodmFsdWUgPSBTZXJ2aWNlLk1vZGUuTUVTU0FHRSkKLUBXZWJTZXJ2aWNlKCkKLUBXZWJTZXJ2aWNlUHJvdmlkZXIoKQotQEJpbmRpbmdUeXBlKHZhbHVlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIpCi1jbGFzcyBCb3RoV2ViU2VydmljZUFubm90YXRpb25UZXN0SW1wbCBpbXBsZW1lbnRzIFByb3ZpZGVyPFNPQVBNZXNzYWdlPiB7Ci0gICAgcHVibGljIEJvdGhXZWJTZXJ2aWNlQW5ub3RhdGlvblRlc3RJbXBsKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBpbnZva2UoU09BUE1lc3NhZ2Ugb2JqKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdlYlNlcnZpY2Ugc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzczsgbm90IAotLy8gUHJvdmlkZXItYmFzZWQKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlKCkKLWNsYXNzIFdlYlNlcnZpY2VTRUlUZXN0SW1wbCB7Ci0gICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiAiRnJvbSBXZWJTZXJ2aWNlU0VJVGVzdEltcGwgIiArICJzIjsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblNlcnZpY2VJbXBsRGVzY3JpcHRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzhjY2QwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvLkVjaG9TZXJ2aWNlSW1wbFdpdGhTRUk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotCi0vKioKLSAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiB0aGUgRGVzY3JpcHRpb24gY2xhc3NlcyBiYXNlZCBvbiBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBhbmQgdmFyaW91cwotICogY29tYmluYXRpb25zIG9mIGFubm90YXRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIE5vdGUgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbmNyZWFzZSB0aGUgamF2YSBoZWFwIHNpemUsIGZvciBleGFtcGxlCi0gICAgICAgIC8vIC1YbXg1MTJtLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIG1hdmVuLmp1bml0Lmp2bWFyZ3MgaW4gcHJvamVjdC5wcm9wZXJ0aWVzLgotICAgICAgICAvLyBUbyBjaGFuZ2UgdGhlIHNldHRpbmdzLCBlZGl0IHRoZSBsb2c0ai5wcm9wZXJ0eSBmaWxlCi0gICAgICAgIC8vIGluIHRoZSB0ZXN0LXJlc291cmNlcyBkaXJlY3RvcnkuCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgZGVzY3JpcHRpb24gY2xhc3NlcyB3aXRoIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBAV2ViU2VydmljZQotICAgICAqIEpTUi0xODEgYW5ub3RhdGlvbiB3aGljaCByZWZlcmVuY2VzIGFuIFNFSS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUltcGxXaXRoU0VJKCkgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEVjaG9TZXJ2aWNlSW1wbFdpdGhTRUkuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLmxlbmd0aCwgMSk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2NbMF0uZ2V0QXhpc1NlcnZpY2UoKSk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGZEZXNjID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NbMF0uZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZkRlc2MpOwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BlcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRmRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJiYWRNZXRob2ROYW1lIik7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9ucyk7Ci0gICAgICAgIG9wZXJhdGlvbnMgPSBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIiIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbnMpOwotICAgICAgICBvcGVyYXRpb25zID0gZW5kcG9pbnRJbnRmRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKChTdHJpbmcpbnVsbCk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9ucyk7Ci0gICAgICAgIG9wZXJhdGlvbnMgPSBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImVjaG8iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnMubGVuZ3RoLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0SmF2YU1ldGhvZE5hbWUoKSwgImVjaG8iKTsKLQotICAgICAgICBTdHJpbmdbXSBwYXJhbVR5cGVzID0gb3BlcmF0aW9uc1swXS5nZXRKYXZhUGFyYW1ldGVycygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBhcmFtVHlwZXMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1UeXBlcy5sZW5ndGgsIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS5sYW5nLlN0cmluZz4iLCBwYXJhbVR5cGVzWzBdKTsKLQotICAgICAgICAvLyBUZXN0IFJlcXVlc3RXcmFwcGVyIGFubm90YXRpb25zCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCksICJFY2hvIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKSwgIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNobyIpOwotCi0gICAgICAgIC8vIFRlc3QgUmVzcG9uc2VXcmFwcGVyIGFubm90YXRpb25zCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpLCAiRWNob1Jlc3BvbnNlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNob1Jlc3BvbnNlIik7Ci0KLSAgICAgICAgLy8gVGVzdCBTT0FQQmluZGluZyBkZWZhdWx0OyB0aGF0IGFubm90YXRpb24gaXMgbm90IHByZXNlbnQgaW4gdGhlIFNFSQotICAgICAgICAvLyBOb3RlIHRoYXQgYW5ub3RhdGlvbiBjb3VsZCBvY2N1ciBvbiB0aGUgb3BlcmF0aW9uIG9yIHRoZSB0eXBlCi0gICAgICAgIC8vIChhbHRob3VnaCBvbiB0aGlzIFNFSSBpdCBkb2Vzbid0IG9jY3VyIGVpdGhlciBwbGFjZSkuCi0gICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgb3BlcmF0aW9uc1swXS5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIGVuZHBvaW50SW50ZkRlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVybG9hZGVkU2VydmljZUltcGxXaXRoU0VJKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRG9jTGl0V3JhcHBlZEltcGxXaXRoU0VJLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVuZHBvaW50RGVzYy5sZW5ndGgsIDEpOwotICAgICAgICAvLyBUT0RPOiBVc2luZyBoYXJkY29kZWQgZW5kcG9pbnREZXNjWzBdIGZyb20gU2VydmljZURlc2MKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlbmRwb2ludEludGZEZXNjID0KLSAgICAgICAgICAgICAgICBlbmRwb2ludERlc2NbMF0uZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZkRlc2MpOwotCi0gICAgICAgIC8vIFRlc3QgZm9yIG92ZXJsb2FkZWQgbWV0aG9kcwotICAgICAgICAvLyBTRUkgZGVmaW5lcyB0d28gSmF2YSBtZXRob2RzIHdpdGggdGhpcyBuYW1lCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BlcmF0aW9ucyA9Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnRJbnRmRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJpbnZva2VBc3luYyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9ucy5sZW5ndGgsIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRKYXZhTWV0aG9kTmFtZSgpLCAiaW52b2tlQXN5bmMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMV0uZ2V0SmF2YU1ldGhvZE5hbWUoKSwgImludm9rZUFzeW5jIik7Ci0KLSAgICAgICAgLy8gQ2hlY2sgdGhlIEphdmEgcGFyYW1ldGVycywgV2ViUGFyYW0gbmFtZXMsIGFuZCBXZWJSZXN1bHQgKGFjdHVhbGx5IGxhY2sgdGhlcmVvZikgZm9yIGVhY2ggb2YgdGhlc2Ugb3BlcmF0aW9ucwotCi0gICAgICAgIC8vIE5vdGUgcmVnYXJkaW5nIFdlYlBhcmFtIG5hbWVzOgotICAgICAgICAvL0luIHRoZSBjbGllbnQgQXN5bmMgQ2FsbCB0aGUgdGhlIFdlYlBhcmFtIG5hbWUgd2lsbCBub3QgcmVtb3ZlIEpBWC1XUyBBc3luY0hhbmRsZXIuCi0gICAgICAgIC8vUHJveHkgaW52b2tpbmcgdGhlIHRoZSBBc3luYyBDYWxsIHdpbGwgY2hlY2sgdGhlIGlucHV0IG1ldGhvZCBvYmplY3QgYW5kIGlmCi0gICAgICAgIC8vaXRzIG9mIHR5cGUgSkFYLVdTIEFzeW5jSGFuZGxlciB0aGVuIHRoYXQgV2ViUGFyYW0gd2lsbCBiZSBza2lwcGVkLgotICAgICAgICAvL1RoaXMgaXMgZG9uZSBiZWNhdXNlIEFzeW5jSGFuZGxlciBpcyBOT1QgcGFydCBvZiB0aGUgY29udHJhY3QsIGFuZCB0aHVzIGl0IGlzIE5PVCBwYXJ0IG9mCi0gICAgICAgIC8vIHRoZSBKQVhCIG9iamVjdCBjb25zdHJ1Y3RlZCBmb3IgdGhlIG1ldGhvZCBpbnZvY2F0aW9uLiAgVGhlIEFzeW5jSGFuZGxlciBpcyBwYXJ0IG9mIHRoZSAKLSAgICAgICAgLy8gSkFYLVdTIHByb2dyYW1taW5nIG1vZGVsIHRvIHN1cHBvcnQgYW4gYXN5bmNocm9ub3VzIGNhbGxiYWNrIHRvIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgotCi0gICAgICAgIC8vIE5vdGUgcmVnYXJkaW5nIFdlYlJlc3VsdCBhbm5vdGF0aW9uOgotICAgICAgICAvLyBUaGUgYXN5bmMgbWV0aG9kcyBvbiB0aGlzIFNFSSBkbyBub3QgY2FycnkgYSBXZWJSZXN1bHQgYW5ub3RhdGlvbnMuCi0gICAgICAgIGJvb2xlYW4gdHdvQXJnU2lnbmF0dXJlQ2hlY2tlZCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIG9uZUFyZ1NpZ25hdHVyZUNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb24gOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGVja1BhcmFtcyA9IG9wZXJhdGlvbi5nZXRKYXZhUGFyYW1ldGVycygpOwotICAgICAgICAgICAgU3RyaW5nW10gd2ViUGFyYW1OYW1lcyA9IG9wZXJhdGlvbi5nZXRQYXJhbU5hbWVzKCk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tQYXJhbXMubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgb25lIGFyZ3VlbWVudCBzaWduYXR1cmUKLSAgICAgICAgICAgICAgICBpZiAob25lQXJnU2lnbmF0dXJlQ2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJPbmUgQXJnIHNpZ25hdHVyZSBvY2N1cmVkIG1vcmUgdGhhbiBvbmNlIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25lQXJnU2lnbmF0dXJlQ2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBKYXZhIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbXNbMF0sICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBXZWJQYXJhbSBOYW1lcyAoc2VlIG5vdGUgYWJvdmUpIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgd2ViUGFyYW1OYW1lcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImludm9rZV9zdHIiLCB3ZWJQYXJhbU5hbWVzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGxhY2sgb2YgYSBXZWJSZXN1bHQgYW5ub3RhdGlvbiBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb24gaXMgYWxzbyBub3QgcHJlc2VudCBhbmQgdGh1cyBmdWxseSBkZWZhdWx0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb24uZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb24uaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja1BhcmFtcy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSB0d28gYXJndWVtZW50IHNpZ25hdHVyZQotICAgICAgICAgICAgICAgIGlmICh0d29BcmdTaWduYXR1cmVDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlR3byBBcmcgc2lnbmF0dXJlIG9jY3VyZWQgbW9yZSB0aGFuIG9uY2UiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0d29BcmdTaWduYXR1cmVDaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIEphdmEgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtc1swXSwgImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1zWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI8b3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlPiIpOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgV2ViUGFyYW0gTmFtZXMgKHNlZSBub3RlIGFib3ZlKSAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHdlYlBhcmFtTmFtZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZva2Vfc3RyIiwgd2ViUGFyYW1OYW1lc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSBsYWNrIG9mIGEgV2ViUmVzdWx0IGFubm90YXRpb24gYW5kIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gU09BUEJpbmRpbmcgU3R5bGU9RE9DVU1FTlQsIFVzZT1MSVRFUkFMLCBQYXJhbVN0eWxlPVdSQVBQRUQKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBTT0FQQmluZGluZyBhbm5vdGF0aW9uIGlzIGFsc28gbm90IHByZXNlbnQgYW5kIHRodXMgZnVsbHkgZGVmYXVsdGVkLgotICAgICAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbikuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb24uZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb24uZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgb3BlcmF0aW9uLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uLmlzUmVzdWx0SGVhZGVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiV3JvbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgZm9yIGEgbWV0aG9kIHdpdGggcGFyYW1ldGVycyBvZiBwcmltaXRpdmUgdHlwZXMuICBOb3RlCi0gICAgICAgIC8vIHRoaXMgbWV0aG9kIElTIG92ZXJsb2FkZWQKLSAgICAgICAgb3BlcmF0aW9ucyA9IGVuZHBvaW50SW50ZkRlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgidHdvV2F5SG9sZGVyQXN5bmMiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnMubGVuZ3RoLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wZXJhdGlvbnNbMF0uZ2V0SmF2YU1ldGhvZE5hbWUoKSwgInR3b1dheUhvbGRlckFzeW5jIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzFdLmdldEphdmFNZXRob2ROYW1lKCksICJ0d29XYXlIb2xkZXJBc3luYyIpOwotCi0gICAgICAgIC8vIENoZWNrIHRoZSBwYXJhbWV0ZXJzIGZvciBlYWNoIG9wZXJhdGlvbgotICAgICAgICB0d29BcmdTaWduYXR1cmVDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdGhyZWVBcmdTaWduYXR1cmVDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uIDogb3BlcmF0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nW10gY2hlY2tQYXJhbXMgPSBvcGVyYXRpb24uZ2V0SmF2YVBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHdlYlBhcmFtTmFtZXMgPSBvcGVyYXRpb24uZ2V0UGFyYW1OYW1lcygpOwotICAgICAgICAgICAgaWYgKGNoZWNrUGFyYW1zLmxlbmd0aCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIG9uZSBhcmd1ZW1lbnQgc2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgaWYgKHRocmVlQXJnU2lnbmF0dXJlQ2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJUaHJlZSBBcmcgc2lnbmF0dXJlIG9jY3VyZWQgbW9yZSB0aGFuIG9uY2UiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJlZUFyZ1NpZ25hdHVyZUNoZWNrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbXNbMF0sICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtc1sxXSwgImludCIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbXNbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjxvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlcj4iKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIFdlYlBhcmFtIE5hbWVzIChzZWUgbm90ZSBhYm92ZSkgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCB3ZWJQYXJhbU5hbWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvV2F5SG9sZGVyX3N0ciIsIHdlYlBhcmFtTmFtZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInR3b1dheUhvbGRlcl9pbnQiLCB3ZWJQYXJhbU5hbWVzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGxhY2sgb2YgYSBXZWJSZXN1bHQgYW5ub3RhdGlvbiBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb24gaXMgYWxzbyBub3QgcHJlc2VudCBhbmQgdGh1cyBmdWxseSBkZWZhdWx0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb24uZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb24uaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja1BhcmFtcy5sZW5ndGggPT0gMikgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSB0d28gYXJndWVtZW50IHNpZ25hdHVyZQotICAgICAgICAgICAgICAgIGlmICh0d29BcmdTaWduYXR1cmVDaGVja2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlR3byBBcmcgc2lnbmF0dXJlIG9jY3VyZWQgbW9yZSB0aGFuIG9uY2UiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0d29BcmdTaWduYXR1cmVDaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1zWzBdLCAiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbXNbMV0sICJpbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIFdlYlBhcmFtIE5hbWVzIChzZWUgbm90ZSBhYm92ZSkgCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB3ZWJQYXJhbU5hbWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvV2F5SG9sZGVyX3N0ciIsIHdlYlBhcmFtTmFtZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInR3b1dheUhvbGRlcl9pbnQiLCB3ZWJQYXJhbU5hbWVzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGxhY2sgb2YgYSBXZWJSZXN1bHQgYW5ub3RhdGlvbiBhbmQgdGhlIGRlZmF1bHQgdmFsdWVzIGZvcgotICAgICAgICAgICAgICAgICAgICAvLyBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb24gaXMgYWxzbyBub3QgcHJlc2VudCBhbmQgdGh1cyBmdWxseSBkZWZhdWx0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbi5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb24uZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb24uaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJXcm9uZyBudW1iZXIgb2YgcGFyYW1ldGVycyByZXR1cm5lZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBmb3IgYSBvbmUtd2F5LCB2b2lkIG1ldGhvZCB3aXRoIG5vIHBhcmFtZXRlcnMgd2hpY2ggYWxzbyBpcyBub3Qgb3ZlcmxvYWRlZAotICAgICAgICBvcGVyYXRpb25zID0gZW5kcG9pbnRJbnRmRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJvbmVXYXlWb2lkIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zLmxlbmd0aCwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldEphdmFNZXRob2ROYW1lKCksICJvbmVXYXlWb2lkIik7Ci0gICAgICAgIFN0cmluZ1tdIGNoZWNrRW1wdHlQYXJhbXMgPSBvcGVyYXRpb25zWzBdLmdldEphdmFQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY2hlY2tFbXB0eVBhcmFtcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja0VtcHR5UGFyYW1zLmxlbmd0aCwgMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBvcGVyYXRpb25zWzBdLmlzT25lV2F5KCkpOwotICAgICAgICAvLyBDaGVjayB0aGUgbGFjayBvZiBhIFdlYlJlc3VsdCBhbm5vdGF0aW9uIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yCi0gICAgICAgIC8vIGEgT05FLVdBWSAvIFZPSUQgb3BlcmF0aW9uIHdpdGggYSBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIFNPQVBCaW5kaW5nIGFubm90YXRpb24gaXMgYWxzbyBub3QgcHJlc2VudCBhbmQgdGh1cyBmdWxseSBkZWZhdWx0ZWQuCi0gICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uc1swXSkuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uc1swXSkuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25zWzBdLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgb3BlcmF0aW9uc1swXS5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgb3BlcmF0aW9uc1swXS5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIG9wZXJhdGlvbnNbMF0uZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25zWzBdLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIC8vIFRlc3QgdHdvLXdheSBtZXRob2QgZm9yIGxhY2sgb2YgT25lV2F5IGFubm90YXRpb24gYW5kIFdlYlJlc3VsdCBhbm5vdGF0aW9uCi0gICAgICAgIG9wZXJhdGlvbnMgPSBlbmRwb2ludEludGZEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImludm9rZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3BlcmF0aW9ucy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIG9wZXJhdGlvbnNbMF0uaXNPbmVXYXkoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uc1swXSkuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm5fc3RyIiwgb3BlcmF0aW9uc1swXS5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybl9zdHIiLCBvcGVyYXRpb25zWzBdLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbnNbMF0uZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25zWzBdLmlzUmVzdWx0SGVhZGVyKCkpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBUaGUgZm9sbG93aW5nIHRlc3RzIHVzZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGRlZmluZWQgYmVsb3cKLSAgICAvLyBpbiBvcmRlciB0byB0ZXN0IHZhcmlvdXMgc3BlY2lmaWMgYW5ub3RhdGlvbiBzZXR0aW5ncwotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ0RlZmF1bHQoKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFNPQVBCaW5kaW5nRGVmYXVsdFRlc3RJbXBsLmNsYXNzKTsKLQotICAgICAgICBhc3NlcnROdWxsKAotICAgICAgICAgICAgICAgICgoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEpdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYykuZ2V0QW5ub1NvYXBCaW5kaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVELAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiZWNob1N0cmluZyIpWzBdOwotICAgICAgICAvLyBWZXJpZnkgV2ViUmVzdWx0IGFubm90YXRpb24gZGVmYXVsdCB2YWx1ZXMgZm9yIERPQy9MSVQvV1JBUFBFRCBmcm9tIGEgZGVmYXVsdGVkIFNPQVBCaW5kaW5nCi0gICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ0RvY0VuY0JhcmUoKSB7Ci0gICAgICAgIC8vdmVyaWZ5IHRoYXQgd2UgdGhyb3cgYW4gZXhjZXB0aW9uIHdoZW4gU09BUEJpbmRpbmcuVXNlID09IEVOQ09ERUQgaXMgc3BlY2lmaWVkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhTT0FQQmluZGluZ0RvY0VuY0JhcmVUZXN0SW1wbC5jbGFzcyk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVzZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoLCBTT0FQQmluZGluZy5Vc2UgPT0gRU5DT0RFRCBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nRG9jTGl0QmFyZSgpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoU09BUEJpbmRpbmdEb2NMaXRCYXJlVGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoCi0gICAgICAgICAgICAgICAgKChFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uSmF2YSl0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKS5nZXRBbm5vU29hcEJpbmRpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1VzZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nTWV0aG9kQW5ub3RhdGlvbigpIHsKLSAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYW4gaW1wbCB3aXRob3V0IHRoZSBtZXRob2QgYW5ub3RhdGlvbiB1c2VzIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSB0eXBlCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFNPQVBCaW5kaW5nRG9jTGl0QmFyZVRlc3RJbXBsLmNsYXNzKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKAotICAgICAgICAgICAgICAgICgoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEpdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYykuZ2V0QW5ub1NvYXBCaW5kaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiZWNob1N0cmluZyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9Tb2FwQmluZGluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRTb2FwQmluZGluZ1N0eWxlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsIG9wZXJhdGlvbkRlc2MuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwotCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBtZXRob2QgYW5ub3RhdGlvbiBzZXR0aW5nIG92ZXJyaWRlcyB0aGUgdHlwZSBhbm5vdGF0aW5vIHNldHRpbmcKLSAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFNPQVBCaW5kaW5nRGVmYXVsdE1ldGhvZFRlc3RJbXBsLmNsYXNzKTsKLQotICAgICAgICBhc3NlcnROdWxsKAotICAgICAgICAgICAgICAgICgoRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbkphdmEpdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYykuZ2V0QW5ub1NvYXBCaW5kaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0U29hcEJpbmRpbmdVc2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVELAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImVjaG9TdHJpbmciKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vU29hcEJpbmRpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLCBvcGVyYXRpb25EZXNjLmdldFNvYXBCaW5kaW5nVXNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlcVJzcFdyYXBwZXIoKSB7Ci0KLSAgICAgICAgLy8gVGVzdCBwYXJhbWF0ZXJTdHlsZSA9IFdSQVBQRUQgc2V0IGEgdGhlIHR5cGUgbGV2ZWwgd2l0aCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBtZXRob2QgYW5ub3RhdGlvbiBzZXR0aW5nCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKERlZmF1bHRSZXFSc3BXcmFwcGVyVGVzdEltcGwuY2xhc3MpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIndyYXBwZWRQYXJhbXMiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cmFwcGVkUGFyYW1zIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3cmFwcGVkUGFyYW1zUmVzcG9uc2UiLCBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgLy8gVGVzdCBXZWJSZXN1bHQgYW5ub3RhdGlvbiBkZWZhdWx0cwotICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXR1cm4iLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImJhcmVQYXJhbXMiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgLy8gVGVzdCBXZWJSZXN1bHQgYW5ub3RhdGlvbiBkZWZhdWx0cwotICAgICAgICBhc3NlcnROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImJhcmVQYXJhbXNSZXNwb25zZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXJlUGFyYW1zUmVzcG9uc2UiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICAvLyBUZXN0IHBhcmFtYXRlclN0eWxlID0gQkFSRSBzZXQgYSB0aGUgdHlwZSBsZXZlbCB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIG1ldGhvZCBhbm5vdGF0aW9uIHNldHRpbmcKLSAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKERlZmF1bHRSZXFSc3BXcmFwcGVyQmFyZVRlc3RJbXBsLmNsYXNzKTsKLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgid3JhcHBlZFBhcmFtcyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIndyYXBwZWRQYXJhbXMiLCBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIndyYXBwZWRQYXJhbXNSZXNwb25zZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlclRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJiYXJlUGFyYW1zIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcVJzcFdyYXBwZXIoKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFJlcVJzcFdyYXBwZXJUZXN0SW1wbC5jbGFzcyk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1ldGhvZDFSZXFXcmFwcGVyIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2QxUnNwV3JhcHBlciIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyTG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hLmIuYy5tZXRob2QxUmVxVE5TIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2EuYi5jLm1ldGhvZDFSc3BUTlMiLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLlJlcVJzcFdyYXBwZXJUZXN0SW1wbC5tZXRob2QxUmVxV3JhcHBlciIsCi0gICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkFubm90YXRpb25TZXJ2aWNlSW1wbERlc2NyaXB0aW9uVGVzdHMuUmVxUnNwV3JhcHBlclRlc3RJbXBsLm1ldGhvZDFSc3BXcmFwcGVyIiwKLSAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QyIilbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kMiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kMlJzcFdyYXBwZXIiLCBvcGVyYXRpb25EZXNjLmdldFJlc3BvbnNlV3JhcHBlckxvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vYS5iLmMubWV0aG9kMlJlcVROUyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hLmIuYy5tZXRob2QyUnNwVE5TIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzcG9uc2VXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQW5ub3RhdGlvblNlcnZpY2VJbXBsRGVzY3JpcHRpb25UZXN0cy5SZXFSc3BXcmFwcGVyVGVzdEltcGwubWV0aG9kMlJlcVdyYXBwZXIiLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzYy5nZXRSZXNwb25zZVdyYXBwZXJDbGFzc05hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZCgpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoV2ViTWV0aG9kVGVzdEltcGwuY2xhc3MpOwotCi0gICAgICAgIC8vIFRlc3QgcmVzdWx0cyBmcm9tIG1ldGhvZCB3aXRoIG5vIGFubm90YXRpb24KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25EZXNjcyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QxIik7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzY3MpOwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wZXJhdGlvbkRlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMiIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QyIiwgb3BlcmF0aW9uRGVzYy5nZXRPcGVyYXRpb25OYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIG9wZXJhdGlvbkRlc2MuZ2V0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzRXhjbHVkZWQoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm1ldGhvZDMiLCBvcGVyYXRpb25EZXNjLmdldE9wZXJhdGlvbk5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQWN0aW9uTWV0aG9kMyIsIG9wZXJhdGlvbkRlc2MuZ2V0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzRXhjbHVkZWQoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNCIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2Q0Iiwgb3BlcmF0aW9uRGVzYy5nZXRPcGVyYXRpb25OYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFjdGlvbk1ldGhvZDQiLCBvcGVyYXRpb25EZXNjLmdldEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc0V4Y2x1ZGVkKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDQiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kNCIsIG9wZXJhdGlvbkRlc2MuZ2V0T3BlcmF0aW9uTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJBY3Rpb25NZXRob2Q0Iiwgb3BlcmF0aW9uRGVzYy5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNFeGNsdWRlZCgpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjcyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNSIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2NzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJSZXN1bHQoKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFdlYlJlc3VsdFRlc3RJbXBsLmNsYXNzKTsKLQotICAgICAgICAvLyBET0NVTUVOVCAvIExJVEVSQUwgLyBXUkFQUEVEIG1ldGhvZHMKLQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wZXJhdGlvbkRlc2NzID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDAiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjcyk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QxIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMiIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmV0dXJuIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJldHVybiIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0TmFtZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q0IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcnROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0TmFtZTUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFydE5hbWU1Iiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS41LyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDYiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0TmFtZTciLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFydE5hbWU3Iiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gRE9DVU1FTlQgLyBMSVRFUkFMIC8gQkFSRSBtZXRob2RzCi0KLSAgICAgICAgb3BlcmF0aW9uRGVzY3MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDBfYmFyZSIpOwotICAgICAgICBhc3NlcnROdWxsKG9wZXJhdGlvbkRlc2NzKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QxX2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kMUJhcmVSZXNwb25zZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kMUJhcmVSZXNwb25zZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3NlcnZpY2UudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QyX2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmlzV2ViUmVzdWx0QW5ub3RhdGlvblNwZWNpZmllZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25EZXNjLmlzT3BlcmF0aW9uUmV0dXJuaW5nUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QyQmFyZVJlc3BvbnNlIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2QyQmFyZVJlc3BvbnNlIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDNfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0TmFtZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lIiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShvcGVyYXRpb25EZXNjLmlzUmVzdWx0SGVhZGVyKCkpOwotCi0gICAgICAgIG9wZXJhdGlvbkRlc2MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDRfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0TmFtZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Jlc3VsdC5iYXJlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNV9iYXJlIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuZ2V0QW5ub1dlYlJlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc09wZXJhdGlvblJldHVybmluZ1Jlc3VsdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXN1bHROYW1lNSIsIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJ0TmFtZTUiLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9yZXN1bHQuYmFyZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UuNS8iLAotICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uRGVzYy5pc1Jlc3VsdEhlYWRlcigpKTsKLQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q2X2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5nZXRBbm5vV2ViUmVzdWx0KCkpOwotICAgICAgICBhc3NlcnRGYWxzZSgoKE9wZXJhdGlvbkRlc2NyaXB0aW9uSmF2YSlvcGVyYXRpb25EZXNjKS5pc1dlYlJlc3VsdEFubm90YXRpb25TcGVjaWZpZWQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0KLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNyIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoT3BlcmF0aW9uRGVzY3JpcHRpb25KYXZhKW9wZXJhdGlvbkRlc2MpLmdldEFubm9XZWJSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChPcGVyYXRpb25EZXNjcmlwdGlvbkphdmEpb3BlcmF0aW9uRGVzYykuaXNXZWJSZXN1bHRBbm5vdGF0aW9uU3BlY2lmaWVkKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNPcGVyYXRpb25SZXR1cm5pbmdSZXN1bHQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVzdWx0TmFtZTciLCBvcGVyYXRpb25EZXNjLmdldFJlc3VsdE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFydE5hbWU3Iiwgb3BlcmF0aW9uRGVzYy5nZXRSZXN1bHRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkRlc2MuZ2V0UmVzdWx0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG9wZXJhdGlvbkRlc2MuaXNSZXN1bHRIZWFkZXIoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlBhcmFtV3JhcHBlZCgpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjID0KLSAgICAgICAgICAgICAgICBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoV2ViUGFyYW1UZXN0SW1wbC5jbGFzcyk7Ci0KLSAgICAgICAgLy8gRE9DVU1FTlQgLyBMSVRFUkFMIC8gV1JBUFBFRCBtZXRob2RzCi0KLSAgICAgICAgLy8gbWV0aG9kMAotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbltdIG9wZXJhdGlvbkRlc2NzID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDAiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjcyk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMDAKLSAgICAgICAgb3BlcmF0aW9uRGVzY3MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDAwIik7Ci0gICAgICAgIGFzc2VydE51bGwob3BlcmF0aW9uRGVzY3MpOwotCi0gICAgICAgIC8vIG1ldGhvZDEKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BlcmF0aW9uRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QxIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uW10gcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzAiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzAiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJhcmcwIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIC8vIG1ldGhvZDIKLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMiIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBwYXJhbURlc2MgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyYW1EZXNjLmxlbmd0aCk7Ci0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzAiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMwotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QzIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBwYXJhbURlc2MubGVuZ3RoKTsKLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBOYW1lTWV0aG9kMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0wTmFtZU1ldGhvZDMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTBOYW1lTWV0aG9kMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1sxXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMU5hbWVNZXRob2QzIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFOYW1lTWV0aG9kMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtMU5hbWVNZXRob2QzIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSG9sZGVyLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMl07Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmcyIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1szXTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJhcmczIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5UWVBFLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzRdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhc3RQYXJhbU5hbWVNZXRob2QzIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbig0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigibGFzdFBhcmFtTmFtZU1ldGhvZDMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kNAotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q0IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBwYXJhbURlc2MubGVuZ3RoKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtME5hbWVNZXRob2Q0IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBQYXJ0TmFtZSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtME5hbWVNZXRob2Q0IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS40LjAucmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMV07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFOYW1lTWV0aG9kNCIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0xUGFydE5hbWUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTFOYW1lTWV0aG9kNCIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuVFlQRSwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uNC4xLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzJdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbM107Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmczIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcmczIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigiYXJnMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU5PVVQsIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzRdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDQiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhc3RQYXJhbU5hbWVNZXRob2Q0IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbig0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigibGFzdFBhcmFtTmFtZU1ldGhvZDQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kNQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q1IilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBwYXJhbURlc2MubGVuZ3RoKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1swXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtME5hbWVNZXRob2Q1IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBQYXJ0TmFtZSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oInBhcmFtME5hbWVNZXRob2Q1IikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3BhcmFtLjUuMC5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzFdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0xTmFtZU1ldGhvZDUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMVBhcnROYW1lIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigicGFyYW0xTmFtZU1ldGhvZDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLlRZUEUsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uNS4xLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzJdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU5PVVQsIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzNdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLlRZUEUsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbNF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kNSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJsYXN0UGFyYW1OYW1lTWV0aG9kNSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaGVja1BhcmFtRGVzYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5PVVQsIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIC8vIG1ldGhvZDYKLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kNiIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBwYXJhbURlc2MgPSBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcGFyYW1EZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTBOYW1lTWV0aG9kNiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0wUGFydE5hbWUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTBOYW1lTWV0aG9kNiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMV07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFOYW1lTWV0aG9kNiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0xUGFydE5hbWUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTFOYW1lTWV0aG9kNiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuVFlQRSwgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLQotICAgICAgICBjaGVja1BhcmFtRGVzYyA9IHBhcmFtRGVzY1syXTsKLSAgICAgICAgYXNzZXJ0TnVsbCgoKFBhcmFtZXRlckRlc2NyaXB0aW9uSmF2YSljaGVja1BhcmFtRGVzYykuZ2V0QW5ub1dlYlBhcmFtKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzIiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFyZzIiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJhcmcyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzNdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYXJnMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2hlY2tQYXJhbURlc2MsIG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb24oImFyZzMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLlRZUEUsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTiwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbNF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYXN0UGFyYW1OYW1lTWV0aG9kNiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDYiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJsYXN0UGFyYW1OYW1lTWV0aG9kNiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOLCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShjaGVja1BhcmFtRGVzYy5pc0hlYWRlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViUGFyYW1CYXJlKCkgewotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhXZWJQYXJhbVRlc3RJbXBsLmNsYXNzKTsKLQotICAgICAgICAvLyBET0NVTUVOVCAvIExJVEVSQUwgLyBCQVJFIG1ldGhvZHMKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvcGVyYXRpb25EZXNjcyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2QwX2JhcmUiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjcyk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMDAKLSAgICAgICAgb3BlcmF0aW9uRGVzY3MgPSB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDAwX2JhcmUiKTsKLSAgICAgICAgYXNzZXJ0TnVsbChvcGVyYXRpb25EZXNjcyk7Ci0KLSAgICAgICAgLy8gbWV0aG9kMQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcGVyYXRpb25EZXNjID0KLSAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoIm1ldGhvZDFfYmFyZSIpWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wZXJhdGlvbkRlc2MpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbltdIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJhbURlc2MubGVuZ3RoKTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kMSIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDEiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJyZW5hbWVkTWV0aG9kMSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIC8vIG1ldGhvZDIKLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kMl9iYXJlIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJhbURlc2MubGVuZ3RoKTsKLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZW5hbWVkTWV0aG9kMiIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDIiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJyZW5hbWVkTWV0aG9kMiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vcGFyYW0uc2VydmljZS50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIiwKLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrUGFyYW1EZXNjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4sIGNoZWNrUGFyYW1EZXNjLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotCi0gICAgICAgIC8vIG1ldGhvZDMKLSAgICAgICAgb3BlcmF0aW9uRGVzYyA9IHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgibWV0aG9kM19iYXJlIilbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uRGVzYyk7Ci0gICAgICAgIHBhcmFtRGVzYyA9IG9wZXJhdGlvbkRlc2MuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJhbURlc2MubGVuZ3RoKTsKLSAgICAgICAgY2hlY2tQYXJhbURlc2MgPSBwYXJhbURlc2NbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoKChQYXJhbWV0ZXJEZXNjcmlwdGlvbkphdmEpY2hlY2tQYXJhbURlc2MpLmdldEFubm9XZWJQYXJhbSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbTFOYW1lTWV0aG9kMyIsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlck5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0xTmFtZU1ldGhvZDMiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJ0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNoZWNrUGFyYW1EZXNjLCBvcGVyYXRpb25EZXNjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uKCJwYXJhbTFOYW1lTWV0aG9kMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgY2hlY2tQYXJhbURlc2MuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS5zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kNAotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q0X2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicmVuYW1lZE1ldGhvZDQiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInJlbmFtZWRNZXRob2Q0IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigicmVuYW1lZE1ldGhvZDQiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLmNsYXNzLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9wYXJhbS5zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iLAotICAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXJhbURlc2MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kNQotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q1X2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGFzdFBhcmFtTmFtZU1ldGhvZDUiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImxhc3RQYXJhbU5hbWVNZXRob2Q1IiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigibGFzdFBhcmFtTmFtZU1ldGhvZDUiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hlY2tQYXJhbURlc2MuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9tZXRob2Q1LmJhcmUucmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS41LyIsCi0gICAgICAgICAgICAgICAgICAgICBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLk9VVCwgY2hlY2tQYXJhbURlc2MuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hlY2tQYXJhbURlc2MuaXNIZWFkZXIoKSk7Ci0KLSAgICAgICAgLy8gbWV0aG9kNgotICAgICAgICBvcGVyYXRpb25EZXNjID0gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYy5nZXRPcGVyYXRpb25Gb3JKYXZhTWV0aG9kKCJtZXRob2Q2X2JhcmUiKVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcGVyYXRpb25EZXNjKTsKLSAgICAgICAgcGFyYW1EZXNjID0gb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtRGVzYy5sZW5ndGgpOwotCi0gICAgICAgIGNoZWNrUGFyYW1EZXNjID0gcGFyYW1EZXNjWzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKCgoUGFyYW1ldGVyRGVzY3JpcHRpb25KYXZhKWNoZWNrUGFyYW1EZXNjKS5nZXRBbm5vV2ViUGFyYW0oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicGFyYW0wTmFtZU1ldGhvZDYiLCBjaGVja1BhcmFtRGVzYy5nZXRQYXJhbWV0ZXJOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtMFBhcnROYW1lIiwgY2hlY2tQYXJhbURlc2MuZ2V0UGFydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjaGVja1BhcmFtRGVzYywgb3BlcmF0aW9uRGVzYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbigicGFyYW0wTmFtZU1ldGhvZDYiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGNoZWNrUGFyYW1EZXNjLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3BhcmFtLnNlcnZpY2UudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICBjaGVja1BhcmFtRGVzYy5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5Nb2RlLklOT1VULCBjaGVja1BhcmFtRGVzYy5nZXRNb2RlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGNoZWNrUGFyYW1EZXNjLmlzSGVhZGVyKCkpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAqIE1ldGhvZCB0byByZXR1cm4gdGhlIGVuZHBvaW50IGludGVyZmFjZSBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLSAgICAqLwotICAgIHByaXZhdGUgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoQ2xhc3MgaW1wbGVtZW50YXRpb25DbGFzcykgewotICAgICAgICAvLyBVc2UgdGhlIGRlc2NyaXB0aW9uIGZhY3RvcnkgZGlyZWN0bHk7IHRoaXMgd2lsbCBiZSBkb25lIHdpdGhpbiB0aGUgSkFYLVdTIHJ1bnRpbWUKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKGltcGxlbWVudGF0aW9uQ2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5kcG9pbnREZXNjLmxlbmd0aCk7Ci0KLSAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiB0ZXN0RW5kcG9pbnREZXNjID0gZW5kcG9pbnREZXNjWzBdOwotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MgPQotICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludEludGVyZmFjZURlc2MpOwotCi0gICAgICAgIHJldHVybiB0ZXN0RW5kcG9pbnRJbnRlcmZhY2VEZXNjOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU09BUEJpbmRpbmdEZWZhdWx0VGVzdCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLyBAU09BUEJpbmRpbmcgdmFsdWVzOiBzdHlsZT1ET0NVTUVOVCwgdXNlPUxJVEVSQUwsIHBhcmFtYXRlclN0eWxlPVdSQVBQRUQKLS8vIEBXZWJSZXN1bHQgdmFsdWVzOiBhcmUgYWxsIGRlZmF1bHRlZAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZSgpCi1jbGFzcyBTT0FQQmluZGluZ0RlZmF1bHRUZXN0SW1wbCB7Ci0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFNPQVBCaW5kaW5nRG9jTGlCYXJlVGVzdEltcGwgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotLy8gTm90ZSB0aGF0IFN0eWxlIHNob3VsZCBkZWZhdWx0Ci0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlKCkKLUBTT0FQQmluZGluZyh1c2UgPSBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi1jbGFzcyBTT0FQQmluZGluZ0RvY0xpdEJhcmVUZXN0SW1wbCB7Ci0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vL1NPQVBCaW5kaW5nRG9jRW5jQmFyZVRlc3RJbXBsIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vTm90ZSB0aGF0IFN0eWxlIHNob3VsZCBkZWZhdWx0Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UoKQotQFNPQVBCaW5kaW5nKHVzZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5FTkNPREVELAotICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLWNsYXNzIFNPQVBCaW5kaW5nRG9jRW5jQmFyZVRlc3RJbXBsIHsKLSBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIHMpIHsKLSAgICAgcmV0dXJuIHM7Ci0gfQotfQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU09BUEJpbmRpbmdEZWZhdWx0TWV0aG9kVGVzdCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzCi0vLyBOb3RlIHRoYXQgc3R5bGUgd2lsbCBkZWZhdWx0IHRvIERPQ1VNRU5UIGJhc2VkIG9uIFR5cGUgYW5ub3RhdGlvbgotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZSgpCi1jbGFzcyBTT0FQQmluZGluZ0RlZmF1bHRNZXRob2RUZXN0SW1wbCB7Ci0gICAgQFNPQVBCaW5kaW5nKHVzZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHRlc3REZWZhdWx0UmVxUnNwV3JhcHBlciBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlCi0vL05vdGUgdGhlIGRlZmF1bHQgcGFyYW1ldGVyU3R5bGUgaXMgV1JBUFBFRCwgc28gbm8gdHlwZS1sZXZlbCBhbm5vdGF0aW9uIGlzIHJlcXVpcmVkLgotY2xhc3MgRGVmYXVsdFJlcVJzcFdyYXBwZXJUZXN0SW1wbCB7Ci0gICAgcHVibGljIFN0cmluZyB3cmFwcGVkUGFyYW1zKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIFN0cmluZyBiYXJlUGFyYW1zKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2UKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi1jbGFzcyBEZWZhdWx0UmVxUnNwV3JhcHBlckJhcmVUZXN0SW1wbCB7Ci0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCkKLSAgICBwdWJsaWMgU3RyaW5nIHdyYXBwZWRQYXJhbXMoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBiYXJlUGFyYW1zKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIHRlc3RSZXFSc3BXcmFwcGVyIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gY2xhc3MKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUBXZWJTZXJ2aWNlCi0vL05vdGUgdGhlIGRlZmF1bHQgcGFyYW1ldGVyU3R5bGUgaXMgV1JBUFBFRCwgc28gbm8gdHlwZS1sZXZlbCBhbm5vdGF0aW9uIGlzIHJlcXVpcmVkLgotY2xhc3MgUmVxUnNwV3JhcHBlclRlc3RJbXBsIHsKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIm1ldGhvZDFSZXFXcmFwcGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hLmIuYy5tZXRob2QxUmVxVE5TIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uQW5ub3RhdGlvblNlcnZpY2VJbXBsRGVzY3JpcHRpb25UZXN0cy5SZXFSc3BXcmFwcGVyVGVzdEltcGwubWV0aG9kMVJlcVdyYXBwZXIiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIm1ldGhvZDFSc3BXcmFwcGVyIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vYS5iLmMubWV0aG9kMVJzcFROUyIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLlJlcVJzcFdyYXBwZXJUZXN0SW1wbC5tZXRob2QxUnNwV3JhcHBlciIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBSZXF1ZXN0V3JhcHBlcih0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2EuYi5jLm1ldGhvZDJSZXFUTlMiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Bbm5vdGF0aW9uU2VydmljZUltcGxEZXNjcmlwdGlvblRlc3RzLlJlcVJzcFdyYXBwZXJUZXN0SW1wbC5tZXRob2QyUmVxV3JhcHBlciIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAibWV0aG9kMlJzcFdyYXBwZXIiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9hLmIuYy5tZXRob2QyUnNwVE5TIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDIoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIG1ldGhvZDFSZXFXcmFwcGVyIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBtZXRob2QyUmVxV3JhcHBlciB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgbWV0aG9kMVJzcFdyYXBwZXIgewotCi0gICAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gdGVzdFdlYk1ldGhvZCBzZXJ2aWNlIGltcGxlbWVudGFpdG9uIGNsYXNzCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZQotY2xhc3MgV2ViTWV0aG9kVGVzdEltcGwgewotICAgIC8vIE5vIHdlYiBtZXRob2QgYW5ub3RhdGlvbgotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDIiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMihTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJBY3Rpb25NZXRob2QzIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDMoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q0IiwgYWN0aW9uID0gIkFjdGlvbk1ldGhvZDQiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNChTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKGV4Y2x1ZGUgPSB0cnVlKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBXZWIgUmVzdWx0IAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2aWNlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iKQotLy8gRGVmYXVsdCBTT0FQQmluZGluZyBTdHlsZT1ET0NVTUVOVCwgVXNlPUxJVEVSQUwsIFBhcmFtU3R5bGU9V1JBUFBFRAotY2xhc3MgV2ViUmVzdWx0VGVzdEltcGwgewotICAgIC8vIERPQ1VNRU5UIC8gTElURVJBTCAvIFdSQVBQRUQgbWV0aG9kcwotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMChTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDEiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDIiKQotICAgIEBXZWJSZXN1bHQoKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMihTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDMiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDMoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZSIsIHBhcnROYW1lID0gInBhcnROYW1lIiwKLSAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNChTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lNSIsIHBhcnROYW1lID0gInBhcnROYW1lNSIsCi0gICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UuNS8iLCBoZWFkZXIgPSB0cnVlKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDYiKQotICAgIEBPbmV3YXkKLSAgICBwdWJsaWMgdm9pZCBtZXRob2Q2KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDciKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lNyIsIHBhcnROYW1lID0gInBhcnROYW1lNyIsIGhlYWRlciA9IHRydWUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q3KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIC8vIERPQ1VNRU5UIC8gTElURVJBTCAvIEJBUkUgbWV0aG9kcwotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QwX2JhcmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2QxQmFyZSIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDFfYmFyZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDJCYXJlIikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIEBXZWJSZXN1bHQoKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMl9iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kM0JhcmUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kM19iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNEJhcmUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc3VsdC5iYXJlLnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNF9iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNUJhcmUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWU1IiwgcGFydE5hbWUgPSAicGFydE5hbWU1IiwKLSAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vcmVzdWx0LmJhcmUudGVzdC50YXJnZXQubmFtZXNwYWNlLjUvIiwgaGVhZGVyID0gdHJ1ZSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDVfYmFyZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDZCYXJlIikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIEBPbmV3YXkKLSAgICBwdWJsaWMgdm9pZCBtZXRob2Q2X2JhcmUoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kN0JhcmUiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWU3IiwgcGFydE5hbWUgPSAicGFydE5hbWU3IiwgaGVhZGVyID0gdHJ1ZSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDdfYmFyZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBXZWIgUGFyYW0gdGVzdCBpbXBsCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1AV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3BhcmFtLnNlcnZpY2UudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpCi0vL0RlZmF1bHQgU09BUEJpbmRpbmcgU3R5bGU9RE9DVU1FTlQsIFVzZT1MSVRFUkFMLCBQYXJhbVN0eWxlPVdSQVBQRUQKLWNsYXNzIFdlYlBhcmFtVGVzdEltcGwgewotCi0gICAgLy8gRE9DVU1FTlQgLyBMSVRFUkFMIC8gV1JBUFBFRCBtZXRob2RzCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QwKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDAwKCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2QxIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2QyIikKLSAgICBAV2ViUmVzdWx0KCkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDIoCi0gICAgICAgICAgICBAV2ViUGFyYW0oKSBTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDMiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTBOYW1lTWV0aG9kMyIpIFN0cmluZyBzLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGFyYW0xTmFtZU1ldGhvZDMiKSBqYXZheC54bWwud3MuSG9sZGVyPEludGVnZXI+IGhvbGRlckludGVnZXIsCi0gICAgICAgICAgICBPYmplY3Qgb2JqTm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBpbnQgaW50Tm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJsYXN0UGFyYW1OYW1lTWV0aG9kMyIpIFN0cmluZyBsYXN0KSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UvIikKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDQoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTBOYW1lTWV0aG9kNCIsIHBhcnROYW1lID0gInBhcmFtMFBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3BhcmFtLjQuMC5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpIFN0cmluZyBzLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGFyYW0xTmFtZU1ldGhvZDQiLCBwYXJ0TmFtZSA9ICJwYXJhbTFQYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9wYXJhbS40LjEucmVzdWx0LnRlc3QudGFyZ2V0Lm5hbWVzcGFjZS8iKSBpbnQgaSwKLSAgICAgICAgICAgIE9iamVjdCBvYmpOb1dlYlBhcmFtQW5ubywKLSAgICAgICAgICAgIGphdmF4LnhtbC53cy5Ib2xkZXI8SW50ZWdlcj4gaW50Tm9XZWJQYXJhbUFubm8sCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJsYXN0UGFyYW1OYW1lTWV0aG9kNCIpIFN0cmluZyBsYXN0KSB7Ci0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q1IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZTUiLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZTUiLAotICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLjUvIiwgaGVhZGVyID0gdHJ1ZSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDUoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTBOYW1lTWV0aG9kNSIsIHBhcnROYW1lID0gInBhcmFtMFBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3BhcmFtLjUuMC5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gdHJ1ZSkgU3RyaW5nIHMsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwYXJhbTFOYW1lTWV0aG9kNSIsIHBhcnROYW1lID0gInBhcmFtMVBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3BhcmFtLjUuMS5yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gZmFsc2UpIGludCBpLAotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxPYmplY3Q+IG9iak5vV2ViUGFyYW1Bbm5vLAotICAgICAgICAgICAgaW50IGludE5vV2ViUGFyYW1Bbm5vLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibGFzdFBhcmFtTmFtZU1ldGhvZDUiLCBtb2RlID0gV2ViUGFyYW0uTW9kZS5PVVQpCi0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gbGFzdCkgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDYiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lNSIsIHBhcnROYW1lID0gInBhcnROYW1lNSIsIGhlYWRlciA9IHRydWUpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q2KAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGFyYW0wTmFtZU1ldGhvZDYiLCBwYXJ0TmFtZSA9ICJwYXJhbTBQYXJ0TmFtZSIsIGhlYWRlciA9IHRydWUpCi0gICAgICAgICAgICBTdHJpbmcgcywKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBhcmFtMU5hbWVNZXRob2Q2IiwgcGFydE5hbWUgPSAicGFyYW0xUGFydE5hbWUiLCBoZWFkZXIgPSBmYWxzZSkKLSAgICAgICAgICAgIGludCBpLAotICAgICAgICAgICAgT2JqZWN0IG9iak5vV2ViUGFyYW1Bbm5vLAotICAgICAgICAgICAgaW50IGludE5vV2ViUGFyYW1Bbm5vLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAibGFzdFBhcmFtTmFtZU1ldGhvZDYiKSBTdHJpbmcgbGFzdCkgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICAvLyBET0NVTUVOVCAvIExJVEVSQUwgLyBCQVJFIG1ldGhvZHMKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMF9iYXJlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMDBfYmFyZSgpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kMSIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDFfYmFyZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDIiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdCgpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyX2JhcmUoCi0gICAgICAgICAgICBAV2ViUGFyYW0oKSBTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAicmVuYW1lZE1ldGhvZDMiKQotICAgIEBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gInJlc3VsdE5hbWUiKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kM19iYXJlKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGFyYW0xTmFtZU1ldGhvZDMiKSBqYXZheC54bWwud3MuSG9sZGVyPEludGVnZXI+IGhvbGRlckludGVnZXIpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q0IikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lIiwgcGFydE5hbWUgPSAicGFydE5hbWUiLAotICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9yZXN1bHQudGVzdC50YXJnZXQubmFtZXNwYWNlLyIpCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q0X2JhcmUoCi0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPEludGVnZXI+IGludE5vV2ViUGFyYW1Bbm5vKSB7Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gInJlbmFtZWRNZXRob2Q1IikKLSAgICBAU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJyZXN1bHROYW1lNSIsIHBhcnROYW1lID0gInBhcnROYW1lNSIsCi0gICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3Jlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UuNS8iLCBoZWFkZXIgPSB0cnVlKQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDVfYmFyZSgKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImxhc3RQYXJhbU5hbWVNZXRob2Q1IiwgbW9kZSA9IFdlYlBhcmFtLk1vZGUuT1VULAotICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbWV0aG9kNS5iYXJlLnJlc3VsdC50ZXN0LnRhcmdldC5uYW1lc3BhY2UuNS8iKQotICAgICAgICAgICAgamF2YXgueG1sLndzLkhvbGRlcjxTdHJpbmc+IGxhc3QpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJyZW5hbWVkTWV0aG9kNiIpCi0gICAgQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzdWx0TmFtZTUiLCBwYXJ0TmFtZSA9ICJwYXJ0TmFtZTUiLCBoZWFkZXIgPSB0cnVlKQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kNl9iYXJlKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGFyYW0wTmFtZU1ldGhvZDYiLCBwYXJ0TmFtZSA9ICJwYXJhbTBQYXJ0TmFtZSIsIGhlYWRlciA9IHRydWUpCi0gICAgICAgICAgICBqYXZheC54bWwud3MuSG9sZGVyPFN0cmluZz4gcykgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblNlcnZpY2VJbXBsV2l0aERCQ1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vQW5ub3RhdGlvblNlcnZpY2VJbXBsV2l0aERCQ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMjdjOTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0Fubm90YXRpb25TZXJ2aWNlSW1wbFdpdGhEQkNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViTWV0aG9kQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYlBhcmFtQW5ub3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLldlYlNlcnZpY2VBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLkphdmFDbGFzc1RvREJDQ29udmVydGVyOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIHRoZSBEZXNjcmlwdGlvbiBjbGFzc2VzIGJhc2VkIG9uIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGFuZCB2YXJpb3VzCi0gKiBjb21iaW5hdGlvbnMgb2YgYW5ub3RhdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25TZXJ2aWNlSW1wbFdpdGhEQkNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGRlc2NyaXB0aW9uIGNsYXNzZXMgd2l0aCBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gdGhhdCBjb250YWlucyB0aGUgQFdlYlNlcnZpY2UKLSAgICAgKiBKU1ItMTgxIGFubm90YXRpb24gd2hpY2ggcmVmZXJlbmNlcyBhbiBTRUkuCi0gICAgICovCi0KLSAgICAvL1Rlc3QgY3JlYXRpb24gb2YgYSBTZXJ2aWNlIERlc2NyaXB0aW9uIGZyb20gREJDLCB1c2luZyBhIGJhc2ljIGxpc3QuCi0gICAgLy9BbiBpbXBsaWNpdCBTRUkgdGhhdCBleHRlbmRzIG9ubHkgamF2YS5sYW5nLm9iamVjdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlSW1wbEFzSW1wbGljaXRTRUkoKSB7Ci0gICAgICAgIC8vb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKLQotICAgICAgICAvL0J1aWxkIGEgSGFzaG1hcCBvZiBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVzIHRoYXQgY29udGFpbnMgdGhlIHNlcnZpY2VJbXBsIGFuZAotICAgICAgICAvL2FsbCBuZWNlc3NhcnkgYXNzb2NpYXRlZCBEQkMncyBwb3NzaWJseSBpbmNsdWRpbmcgU0VJIGFuZCBzdXBlcmNsYXNzZXMKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gYnVpbGREQkNOb0VuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgZGJjTWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIGRiYyk7Ci0KLSAgICAgICAgLy8gVE9ETzogVGhpcyB0ZXN0IGlzIGludmFsaWQgYXMgaXMuICBJdCBkb2VzIG5vdCBzcGVjaWZ5IFdTREwsIGFuZCBXU0RMIGdlbmVyYXRvciBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBpbiBPcGVuIFNvdXJjZQotICAgICAgICAvLyAgICAgICBTbywgYW4gZXhjZXB0aW9uIGlzIGN1cnJlbnRseSBiZWluZyB0aHJvd24uICBJdCBtYXkgYmUgdGhlIGNvcnJlY3QgZml4IGlzIHRvIE5PVCBhbHdheXMgdHJ5IHRvIGdlbmVyYXRlIFdTREw7IGFuZCBvbmx5Ci0gICAgICAgIC8vICAgICAgIHRyeSB0byBnZW5lcmF0ZSBpdCBpZiBpdCBpcyBhc2tlZCBmb3IuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2NMaXN0LmdldCgwKSk7Ci0KLSAgICAgICAgICAgIC8vV2Uga25vdyB0aGlzIGxpc3QgY29udGFpbnMgb25seSBvbmUgU0QsIHNvIG5vIG5lZWQgdG8gbG9vcAotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCkuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbmRwb2ludERlc2MubGVuZ3RoLCAxKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogSG93IHdpbGwgdGhlIEpBWC1XUyBkaXNwYXRjaGVyIGdldCB0aGUgYXBwcm9wcmlhdGUgcG9ydCAoaS5lLiBlbmRwb2ludCk/ICBDdXJyZW50bHkgYXNzdW1lcyBbMF0KLSAgICAgICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZW5kcG9pbnRJbnRmRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50RGVzY1swXS5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50SW50ZkRlc2MpOwotCi0gICAgICAgIH0gY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiBEZXByZWNhdGVkIC0tIHRoaXMgdXNlZCB0byBiZSB0aGUgdGVzdCBmb3IKLSAgICAgICAgKiBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QKLSAgICAgICAgKi8KLS8qCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb3BlcmF0aW9ucyA9IGVuZHBvaW50SW50ZkRlc2MuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gcGFyYW1UeXBlcyA9IG9wZXJhdGlvbnNbMF0uZ2V0SmF2YVBhcmFtZXRlcnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhbVR5cGVzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtVHlwZXMubGVuZ3RoLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyIiwgcGFyYW1UeXBlc1swXSk7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IFJlcXVlc3RXcmFwcGVyIGFubm90YXRpb25zCi0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlcXVlc3RXcmFwcGVyTG9jYWxOYW1lKCksICJFY2hvIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlcXVlc3RXcmFwcGVyVGFyZ2V0TmFtZXNwYWNlKCksICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRSZXF1ZXN0V3JhcHBlckNsYXNzTmFtZSgpLCAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvIik7Ci0gICAgICAgIAotICAgICAgICAvLyBUZXN0IFJlc3BvbnNlV3JhcHBlciBhbm5vdGF0aW9ucwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRSZXNwb25zZVdyYXBwZXJMb2NhbE5hbWUoKSwgIkVjaG9SZXNwb25zZSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3BlcmF0aW9uc1swXS5nZXRSZXNwb25zZVdyYXBwZXJUYXJnZXROYW1lc3BhY2UoKSwgImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcGVyYXRpb25zWzBdLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpLCAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUmVzcG9uc2UiKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgU09BUEJpbmRpbmcgZGVmYXVsdDsgdGhhdCBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50IGluIHRoZSBTRUkKLSAgICAgICAgLy8gTm90ZSB0aGF0IGFubm90YXRpb24gY291bGQgb2NjdXIgb24gdGhlIG9wZXJhdGlvbiBvciB0aGUgdHlwZQotICAgICAgICAvLyAoYWx0aG91Z2ggb24gdGhpcyBTRUkgaXQgZG9lc24ndCBvY2N1ciBlaXRoZXIgcGxhY2UpLgotICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIG9wZXJhdGlvbnNbMF0uZ2V0U29hcEJpbmRpbmdTdHlsZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCBlbmRwb2ludEludGZEZXNjLmdldFNvYXBCaW5kaW5nU3R5bGUoKSk7Ci0qLwotICAgIH0KLQotICAgIC8vVE9ETzogQmFzaWMgVGVzdCB3aXRoIEVuZHBvaW50SW50ZXJmYWNlIHNldCB0byBzb21ldGhpbmcgdmFsaWQsIHNvIGFub3RoZXIgREJDIG11c3QKLSAgICAvLyBleGlzdCBpbiBsaXN0Ci0KLSAgICAvL1RPRE86IEJhc2ljIFRlc3QgZm9yIFByb3ZpZGVyCi0KLSAgICAvL1RPRE86IFZhbGlkYXRpb24gVGVzdHMKLSAgICAvLyAtIFNldHRpbmcgV1MgYW5kIFdTUAotICAgIC8vIC0gRmFpbCBqdXN0IG9uZSBpbiBMaXN0LCBCdXQgYWxsb3cgc3VjY2Vzc2Z1bCBvbmVzIHRvIHBhc3MKLQotICAgIC8qCi0gICAgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4gaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgKi8KLQotICAgIC8vcHJpdmF0ZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhDbGFzcyBpbXBsZW1lbnRhdGlvbkNsYXNzKSB7Ci0gICAgLy8gICAgLy8gVXNlIHRoZSBkZXNjcmlwdGlvbiBmYWN0b3J5IGRpcmVjdGx5OyB0aGlzIHdpbGwgYmUgZG9uZSB3aXRoaW4gdGhlIEpBWC1XUyBydW50aW1lCi0gICAgLy8gICAgcmV0dXJuIChuZXcgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpKTsgCi0gICAgLy8JLy9yZXR1cm4gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYzsKLSAgICAvL30KLQotICAgIHN0YXRpYyBwdWJsaWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGJ1aWxkREJDTm9FbmRwb2ludEludGVyZmFjZSgpIHsKLQotICAgICAgICAvL0NyZWF0ZSBhIFdlYlNlcnZpY2VBbm5vdAotICAgICAgICBTdHJpbmcgV1NOYW1lID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkIjsKLSAgICAgICAgU3RyaW5nIFdTVGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyI7Ci0gICAgICAgIFN0cmluZyBXU1NlcnZpY2VOYW1lID0gIkVjaG9TZXJ2aWNlTmFtZSI7Ci0gICAgICAgIC8vU3RyaW5nIFdTV3NkbExvY2F0aW9uID0gImh0dHA6Ly9FY2hvU2VydmljZS93c2RsIjsKLSAgICAgICAgU3RyaW5nIFdTV3NkbExvY2F0aW9uID0gIiI7Ci0gICAgICAgIFN0cmluZyBXU0VuZHBvaW50SW50ZXJmYWNlID0gIiI7Ci0gICAgICAgIFN0cmluZyBXU1BvcnROYW1lID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkUG9ydCI7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9Ci0gICAgICAgICAgICAgICAgV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBXU1RhcmdldE5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTU2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBXU1dzZGxMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdTRW5kcG9pbnRJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBXU1BvcnROYW1lKTsKLQotICAgICAgICAvL0NyZWF0ZSBhIFdlYk1ldGhvZEFubm90Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gImVjaG9TdHJpbmdNZXRob2QiOwotICAgICAgICBTdHJpbmcgYWN0aW9uID0gInVybjpFY2hvU3RyaW5nTWV0aG9kIjsKLSAgICAgICAgYm9vbGVhbiBleGNsdWRlID0gZmFsc2U7Ci0KLSAgICAgICAgV2ViTWV0aG9kQW5ub3Qgd2ViTWV0aG9kQW5ub3QgPSBXZWJNZXRob2RBbm5vdC5jcmVhdGVXZWJNZXRob2RBbm5vdEltcGwoKTsKLSAgICAgICAgd2ViTWV0aG9kQW5ub3Quc2V0T3BlcmF0aW9uTmFtZShvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgd2ViTWV0aG9kQW5ub3Quc2V0QWN0aW9uKGFjdGlvbik7Ci0gICAgICAgIHdlYk1ldGhvZEFubm90LnNldEV4Y2x1ZGUoZXhjbHVkZSk7Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIFdlYlBhcmFtQW5ub3QKLSAgICAgICAgU3RyaW5nIFdQTmFtZSA9ICJhcmcwIjsKLSAgICAgICAgU3RyaW5nIFdQUGFydE5hbWUgPSAic2t1IjsKLSAgICAgICAgU3RyaW5nIFdQVGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyI7Ci0gICAgICAgIFdlYlBhcmFtLk1vZGUgV1BNb2RlID0gV2ViUGFyYW0uTW9kZS5JTjsKLSAgICAgICAgYm9vbGVhbiBXUEhlYWRlciA9IHRydWU7Ci0KLSAgICAgICAgV2ViUGFyYW1Bbm5vdCB3ZWJQYXJhbUFubm90ID0gV2ViUGFyYW1Bbm5vdC5jcmVhdGVXZWJQYXJhbUFubm90SW1wbCgpOwotICAgICAgICB3ZWJQYXJhbUFubm90LnNldE5hbWUoV1BOYW1lKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRQYXJ0TmFtZShXUFBhcnROYW1lKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRNb2RlKFdQTW9kZSk7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKFdQVGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgd2ViUGFyYW1Bbm5vdC5zZXRIZWFkZXIoV1BIZWFkZXIpOwotCi0gICAgICAgIC8vQnVpbGQgdXAgdGhlIHRoZSBEQkMgYW5kIGFsbCBuZWNlc3NhcnkgY29tcG9zaXRlcwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgcGRjLnNldFdlYlBhcmFtQW5ub3Qod2ViUGFyYW1Bbm5vdCk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRXZWJNZXRob2RBbm5vdCh3ZWJNZXRob2RBbm5vdCk7Ci0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjLCAwKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLnNhbXBsZXMuRWNob1NlcnZpY2VBbm5vdGF0ZWQiKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLQotICAgICAgICByZXR1cm4gZGJjOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFdTRExJbXBsKCkgewotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gZ2V0RWNob01lc3NhZ2VTZXJ2aWNlV1NETExvY2F0aW9uKCk7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLgotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoRWNob01lc3NhZ2VTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmNNYXApOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gZGJjTWFwLmdldChFY2hvTWVzc2FnZVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMpOwotICAgICAgICBkYmMuc2V0Q2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBkYmMuZ2V0V2ViU2VydmljZUFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIGRiY01hcC5wdXQoRWNob01lc3NhZ2VTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgZGJjKTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgV1NETCBkZWZpbml0aW9uIHdhcyByZWFkIGluIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uCi0gICAgICAgIGFzc2VydE5vdE51bGwoKChTZXJ2aWNlRGVzY3JpcHRpb25XU0RMKSBzZCkuZ2V0V1NETERlZmluaXRpb24oKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkV1NETFNFSSgpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IGdldEVjaG9NZXNzYWdlU2VydmljZVdTRExMb2NhdGlvbigpOwotCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIAotICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4KLSAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKEVjaG9NZXNzYWdlU2VydmljZVNFSS5jbGFzcyk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjTWFwKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IGRiY01hcC5nZXQoRWNob01lc3NhZ2VTZXJ2aWNlU0VJLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaURCQyA9IGRiY01hcC5nZXQoRWNob01lc3NhZ2VTZXJ2aWNlSW50ZXJmYWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VpREJDKTsKLSAgICAgICAgZGJjLnNldENsYXNzTG9hZGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gc2VpREJDLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgc2VpREJDLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmNNYXAucHV0KEVjaG9NZXNzYWdlU2VydmljZUludGVyZmFjZS5jbGFzcy5nZXROYW1lKCksIHNlaURCQyk7Ci0gICAgICAgIAotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gc2VydmljZURlc2NMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIFdTREwgZGVmaW5pdGlvbiB3YXMgcmVhZCBpbiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbgotICAgICAgICBhc3NlcnROb3ROdWxsKCgoU2VydmljZURlc2NyaXB0aW9uV1NETCkgc2QpLmdldFdTRExEZWZpbml0aW9uKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIGludGVuZGVkIHRvIHZlcmlmeSAgdGhhdCBwcm9wZXJ0aWVzIHNldCBvbiBhIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZQotICAgICAqIGluc3RhbmNlIGFyZSBjYXJyaWVkIG92ZXIgdG8gdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gb2JqZWN0IHRoYXQgaXMgY3JlYXRlZCAKLSAgICAgKiBmcm9tIHRoZSBEQkMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIAotICAgICAgICAvL0J1aWxkIGEgSGFzaG1hcCBvZiBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGVzIHRoYXQgY29udGFpbnMgdGhlIHNlcnZpY2VJbXBsIGFuZAotICAgICAgICAvL2FsbCBuZWNlc3NhcnkgYXNzb2NpYXRlZCBEQkMncyBwb3NzaWJseSBpbmNsdWRpbmcgU0VJIGFuZCBzdXBlcmNsYXNzZXMKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gYnVpbGREQkNOb0VuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgcHJvcHMucHV0KCJwcm9wMSIsICJwcm9wMSIpOwotICAgICAgICBwcm9wcy5wdXQoInByb3AyIiwgInByb3AyIik7Ci0gICAgICAgIGRiYy5zZXRQcm9wZXJ0aWVzKHByb3BzKTsKLQotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjTGlzdC5nZXQoMCkpOwotCi0gICAgICAgICAgICAvL1dlIGtub3cgdGhpcyBsaXN0IGNvbnRhaW5zIG9ubHkgb25lIFNELCBzbyBubyBuZWVkIHRvIGxvb3AKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW5kcG9pbnREZXNjLmxlbmd0aCwgMSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGdldCB0aGUgRW5kcG9pbnREZXNjcmlwdGlvbiBzbyB3ZSBjYW4gbWFrZSBzdXJlIHRoZSBwcm9wZXJ0aWVzIHdlcmUKLSAgICAgICAgICAgIC8vIHByb3BvZ2F0ZWQgdG8gdGhlIHVuZGVybHlpbmcgQXhpcyBydW50aW1lIG9iamVjdHMKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBlbmRwb2ludERlc2NbMF07ICAgICAgICAgIAotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGZpbmQgdGhlIHR3byBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBzZXQgb24gdGhlIERCQwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlZC5nZXRQcm9wZXJ0eSgicHJvcDEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGVkLmdldFByb3BlcnR5KCJwcm9wMSIpLmVxdWFscygicHJvcDEiKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVkLmdldFByb3BlcnR5KCJwcm9wMiIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZWQuZ2V0UHJvcGVydHkoInByb3AyIikuZXF1YWxzKCJwcm9wMiIpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEVjaG9NZXNzYWdlU2VydmljZVdTRExMb2NhdGlvbigpIHsKLSAgICAJU3RyaW5nIGxvYyA9IG51bGw7Ci0gICAgCVN0cmluZyBzZXAgPSBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yOwotICAgICAgICBsb2MgPSBzZXAgKyAidGVzdC1yZXNvdXJjZXMiICsgc2VwICsgIndzZGwiICsgc2VwICsgIkVjaG9NZXNzYWdlU2VydmljZS53c2RsIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCVN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0gICAgICAgICAgICBsb2MgPSBiYXNlRGlyICsgbG9jOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAJaW9lLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgCXJldHVybiBsb2M7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9NZXNzYWdlU2VydmljZSIsIHBvcnROYW1lID0gIkVjaG9NZXNzYWdlUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvRWNob01lc3NhZ2VTZXJ2aWNlLndzZGwiKQotICAgIHB1YmxpYyBjbGFzcyBFY2hvTWVzc2FnZVNlcnZpY2UgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9NZXNzYWdlKFN0cmluZyBhcmcpIHsKLSAgICAgICAgICAgIHJldHVybiBhcmc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob01lc3NhZ2VTZXJ2aWNlIiwgZW5kcG9pbnRJbnRlcmZhY2U9Ci0gICAgCQkib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Bbm5vdGF0aW9uU2VydmljZUltcGxXaXRoREJDVGVzdHMkRWNob01lc3NhZ2VTZXJ2aWNlSW50ZXJmYWNlIikKLSAgICBwdWJsaWMgY2xhc3MgRWNob01lc3NhZ2VTZXJ2aWNlU0VJIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHBvcnROYW1lID0gIkVjaG9NZXNzYWdlUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvRWNob01lc3NhZ2VTZXJ2aWNlLndzZGwiKQotICAgIHB1YmxpYyBpbnRlcmZhY2UgRWNob01lc3NhZ2VTZXJ2aWNlSW50ZXJmYWNlIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKTsKLSAgICB9Ci19Ci0KLQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vREJDd2l0aFJlZHVjZVdTRExNZW1vcnlQYXJtc1Rlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vREJDd2l0aFJlZHVjZVdTRExNZW1vcnlQYXJtc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjZmOWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RCQ3dpdGhSZWR1Y2VXU0RMTWVtb3J5UGFybXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5XU0RMV3JhcHBlcjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi0vKioNCi0gKiBUaGVzZSB0ZXN0cyBhcmUgaW50ZW5kZWQgdG8gdGVzdCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBEQkN3aXRoUmVkdWNlV1NETE1lbW9yeVBhcm1zVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3Qgd2lsbCBjb25maXJtIHRoYXQgd2hlbiByZWR1Y2VXU0RMTWVtb3J5Q2FjaGUgaXMgdHJ1ZSANCi0gICAgICogYW5kIHJlZHVjZVdTRExNZW1vcnlUeXBlPTINCi0gICAgICogIFRoZSBXc2RsRGVmaW5pdGlvbldyYXBwZXIgd2lsbCBjb25zdHJ1Y3QgV1NETFdyYXBwZXJSZWxvYWRJbXBsIGNsYXNzZXMgIA0KLSAgICAgKg0KLSAgICAgKi8NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZWRpcjsNCi0gICAgc3RhdGljIHsNCi0gICAgICAgIGJhc2VkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiKTsNCi0gICAgICAgIGlmIChiYXNlZGlyID09IG51bGwpIHsNCi0gICAgICAgICAgICBiYXNlZGlyID0gbmV3IEZpbGUoIi4iKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0REJDd2l0aFJlZHVjZVdTRExNZW1vcnlQYXJtcygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gSSB1c2VkIE9wZXJhdGlvbkRlc2NyaXB0aW9uVGVzdHMgYXMgYSB0ZW1wbGF0ZSBmb3IgdGhpcyB0ZXN0DQotDQotICAgICAgICBTdHJpbmcgYXhpczJ4bWwgPSBiYXNlZGlyICsNCi0gICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbCI7DQotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjYzsNCi0gICAgICAgIHRyeSB7DQotDQotICAgICAgICAgICAgY2MgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkNCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgYXhpczJ4bWwpOw0KLSAgICAgICAgICAgIGlmIChjYyAhPW51bGwpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhcm0gPSAoU3RyaW5nKWNjLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGFyYW1ldGVyVmFsdWUoInJlZHVjZVdTRExNZW1vcnlDYWNoZSIpIDsNCi0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZ0NvbnRleHQgcGFybToiICsgcGFybSApOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJjb25maWdDb250ZXh0OiBpcyBudWxsIiApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXMyeG1sKTsNCi0NCi0gICAgICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOw0KLSAgICAgICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiQmluZGluZ05hbWVzcGFjZS53c2RsIjsNCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciOw0KLSAgICAgICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUmVsYXRpdmVMb2NhdGlvbiArIHdzZGxGaWxlTmFtZTsNCi0NCi0gICAgICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciANCi0gICAgICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4NCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZShjYyk7DQotDQotICAgICAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod3NkbERlZm4pOw0KLQ0KLSAgICAgICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsNCi0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7DQotICAgICAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRTZXJ2aWNlTmFtZSgiRWNob01lc3NhZ2VTZXJ2aWNlIik7DQotICAgICAgICAgICAgd2ViU2VydmljZUFubm90LnNldFBvcnROYW1lKCJFY2hvTWVzc2FnZVBvcnQiKTsNCi0NCi0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiZWNob01lc3NhZ2UiKTsNCi0gICAgICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7DQotDQotICAgICAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7DQotICAgICAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgICAgIGRiYy5zZXRDbGFzc05hbWUoQmluZGluZ05TSW1wbC5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIC8vZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiREJDd2l0aENvbmZpZ0NvbnRleHRUZXN0cyBzZXRXc2RsVVJMIiApOw0KLSAgICAgICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEQkN3aXRoQ29uZmlnQ29udGV4dFRlc3RzIG5ldyBIYXNoTWFwIiApOw0KLQ0KLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9DQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOw0KLSAgICAgICAgICAgIGRiY01hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCBkYmMpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwLURCQy10b1N0cmluZyIgKyANCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICBkYmMudG9TdHJpbmcoKSArICIgdG9TdHJpbmctRU5EIiApOw0KLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQ0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAsIGNjKTsNCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKiBEQkN3aXRoQ29uZmlnQ29udGV4dFRlc3RzIHRlc3RzOiIgKyBkYmMudG9TdHJpbmcoKSArIiB0b1N0cmluZy1FTkQiICk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEQkN3aXRoQ29uZmlnQ29udGV4dFRlc3RzIGdldCBTZXJ2aWNlRGVzY3JpcHRpb24iICk7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uV1NETCBzZHcgPSAoU2VydmljZURlc2NyaXB0aW9uV1NETClzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2R3KTsNCi0NCi0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiREJDd2l0aENvbmZpZ0NvbnRleHRUZXN0cyBTZXJ2aWNlRGVzY3JpcHRpb25XU0RMIG5vdCBudWxsIiApOw0KLQ0KLSAgICAgICAgICAgIFdTRExXcmFwcGVyIHcgPSBzZHcuZ2V0V1NETFdyYXBwZXIoKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHcpOw0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJEQkN3aXRoQ29uZmlnQ29udGV4dFRlc3RzIFdTRExXcmFwcGVyIG5vdCBudWxsIiApOw0KLQ0KLSAgICAgICAgICAgIERlZmluaXRpb24gZCA9IHcuZ2V0RGVmaW5pdGlvbigpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZCk7DQotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkRCQ3dpdGhDb25maWdDb250ZXh0VGVzdHMgRGVmaW5pdGlvbiBub3QgbnVsbCIgKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGQudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJvcmcuYXBhY2hlLmF4aXMyLndzZGwudXRpbC5XU0RMV3JhcHBlclJlbG9hZEltcGwiKSApOw0KLQ0KLQ0KLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJkOiIgKyBkLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlxuIiArIGQudG9TdHJpbmcoKSApIDsNCi0NCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlZEFycmF5ID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsNCi0gICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVkQXJyYXkpOw0KLSAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBlZEFycmF5Lmxlbmd0aCk7DQotICAgICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVkQXJyYXlbMF07DQotICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7DQotDQotICAgICAgICAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaWQgPSBlZC5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlaWQpOw0KLQ0KLSAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb2RBcnJheSA9IGVpZC5nZXRPcGVyYXRpb25zKCk7DQotICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChvZEFycmF5KTsNCi0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb2RBcnJheS5sZW5ndGgpOw0KLSAgICAgICAgICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9kID0gb2RBcnJheVswXTsNCi0gICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG9kKTsNCi0gICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLCBvZC5nZXRCaW5kaW5nSW5wdXROYW1lc3BhY2UoKSk7DQotICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIiwgb2QuZ2V0QmluZGluZ091dHB1dE5hbWVzcGFjZSgpKTsNCi0gICAgICAgICAgICAgKi8NCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiVGhpcyBzaG91bGQgbm90IGZhaWwgd2l0aCB0aGlzICIgKyBlKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLQ0KLSAgICBAV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvTWVzc2FnZVNlcnZpY2UiLCBwb3J0TmFtZSA9ICJFY2hvTWVzc2FnZVBvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2Uud3NkbCIpDQotICAgIHB1YmxpYyBjbGFzcyBCaW5kaW5nTlNJbXBsIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob01lc3NhZ2UoU3RyaW5nIGFyZykgew0KLSAgICAgICAgICAgIHJldHVybiBhcmc7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob01lc3NhZ2VTZXJ2aWNlIiwgcG9ydE5hbWUgPSAiRWNob01lc3NhZ2VQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlRGVmYXVsdHMud3NkbCIpDQotICAgIHB1YmxpYyBjbGFzcyBCaW5kaW5nTlNEZWZhdWx0c0ltcGwgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKSB7DQotICAgICAgICAgICAgcmV0dXJuIGFyZzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRGVzY3JpcHRpb25UZXN0VXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmExMjNmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9EZXNjcmlwdGlvblRlc3RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25UZXN0VXRpbHMgewotCi0gICAgLyoKLSAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICogVGVzdCB1dGlsaXR5IG1ldGhvZHMKLSAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICovCi0KLSAgICBzdGF0aWMgcHVibGljIFVSTCBnZXRXU0RMVVJMKCkgewotICAgICAgICByZXR1cm4gZ2V0V1NETFVSTCgiV1NETFRlc3RzLndzZGwiKTsKLQotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICBTdHJpbmcgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIik7Ci0gICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSBiYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy93c2RsLyIgKyB3c2RsRmlsZU5hbWU7Ci0gICAgICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyBVUkwgZ2V0V1NETFVSTChTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFVSTCB3c2RsVVJMID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybFN0cmluZyA9IGdldFdTRExMb2NhdGlvbih3c2RsRmlsZU5hbWUpOwotICAgICAgICAvLyBHZXQgdGhlIFVSTCB0byB0aGUgV1NETCBmaWxlLiAgTm90ZSB0aGF0ICdiYXNlZGlyJyBpcyBzZXR1cCBieSBNYXZlbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgd3NkbFVSTCA9IG5ldyBGaWxlKHVybFN0cmluZykuZ2V0QWJzb2x1dGVGaWxlKCkudG9VUkwoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2F1Z2h0IGV4Y2VwdGlvbiBjcmVhdGluZyBXU0RMIFVSTCA6IiArIHVybFN0cmluZyArCi0gICAgICAgICAgICAgICAgICAgICI7IGV4Y2VwdGlvbjogIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGxVUkw7Ci0gICAgfQotCi0gICAgc3RhdGljIERlZmluaXRpb24gY3JlYXRlV1NETERlZmluaXRpb24oVVJMIHdzZGxVUkwpIHsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETCh3c2RsVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgd3NkbERlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKHdzZGxVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICIqKiogRVJST1IgKioqOiBDYXVnaHQgZXhjZXB0aW9uIHRyeWluZyB0byBjcmVhdGUgV1NETCBEZWZpbml0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdzZGxEZWZpbml0aW9uOwotICAgIH0KLSAgICBzdGF0aWMgcHVibGljIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBnZXRTZXJ2aWNlRGVzY3JpcHRpb25Db21wb3NpdGUoU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MpIHsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHJldHVybkNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgIC8vIE5lZWQgdG8gZ2V0IHRoZSBjb21wb3NpdGUgb2ZmIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgZ2V0dGVyIG1ldGhvZCwgYnV0IGl0IGlzIGFsbAotICAgICAgICAvLyBwYWNrYWdlZCBwcm90ZWN0ZWQgYW5kIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgZ2V0Q29tcG9zaXRlID0gc3ZjRGVzYy5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKCJnZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUiKTsKLSAgICAgICAgICAgIGdldENvbXBvc2l0ZS5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuQ29tcG9zaXRlID0gKERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSkgZ2V0Q29tcG9zaXRlLmludm9rZShzdmNEZXNjLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJldHVybkNvbXBvc2l0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRCYXJlUmVzb2x2ZU9wZXJhdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRG9jTGl0QmFyZVJlc29sdmVPcGVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZmY2E5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRCYXJlUmVzb2x2ZU9wZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotLyoqCi0gKiBWYWxpZGF0ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVzb2x2ZSBhbiBpbmNvbWluZyBEb2MvTGl0L0JhcmUgbWVzc2FnZSBpcyBzZXR1cAotICogY29ycmVjdGx5IHZpYSBhbm5vdGF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIERvY0xpdEJhcmVSZXNvbHZlT3BlcmF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYzsKLSAgICBwcml2YXRlIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjOwotICAgIHByaXZhdGUgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2U7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgaWYgKHN2Y0Rlc2MgPT0gbnVsbCkgewotICAgICAgICAgICAgc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRExCUmVzb2x2ZU9wZXJhdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOwotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVwRGVzY3MgPSBzdmNEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzY3MpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY3MubGVuZ3RoKTsKLSAgICAgICAgICAgIGVuZHBvaW50RGVzYyA9IGVwRGVzY3NbMF07Ci0gICAgICAgICAgICBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlU2luZ2xlSW5QYXJhbSgpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDEiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUpOwotCi0gICAgICAgIFFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wMXBhcmFtMVBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lLCBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotCi0gICAgICAgIFFOYW1lIHdyb25nTWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmdFbGVtZW50TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUod3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudCk7Ci0KLSAgICAgICAgUU5hbWUgd3JvbmdNZXNzYWdlRWxlbWVudE5TUU5hbWUgPSBuZXcgUU5hbWUoIndyb25nLm5hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcDFwYXJhbTFQYXJ0TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50TlMgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZSh3cm9uZ01lc3NhZ2VFbGVtZW50TlNRTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoYXhpc09wZXJhdGlvbkZyb21Xcm9uZ0VsZW1lbnROUyk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jTGl0QmFyZVNpbmdsZUluT3V0UGFyYW0oKSB7Ci0gICAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKCIiLCAib3AyIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21PcE5hbWUgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lKTsKLQotICAgICAgICBRTmFtZSBtZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcDJwYXJhbTFQYXJ0TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKG1lc3NhZ2VFbGVtZW50UU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSwgYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jTGl0QmFyZVR3b0luUGFyYW1zKCkgewotICAgICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgIm9wMyIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3AzcGFyYW0xUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUsIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0KLSAgICAgICAgUU5hbWUgd3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcDNwYXJhbTJQYXJ0TmFtZSIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tV3JvbmdFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUod3JvbmdNZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jTGl0QmFyZU91dFBhcmFtT25seSgpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDQiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUpOwotCi0gICAgICAgIFFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wNHBhcmFtMVBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlT3V0UGFyYW1GaXJzdCgpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUpOwotCi0gICAgICAgIFFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wNXBhcmFtMlBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lLCBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotCi0gICAgICAgIFFOYW1lIHdyb25nTWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3A1cGFyYW0xUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKHdyb25nTWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoYXhpc09wZXJhdGlvbkZyb21Xcm9uZ0VsZW1lbnQpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY0xpdEJhcmVEZWZhdWx0UGFydEFubm8oKSB7Ci0gICAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKCIiLCAib3A2Iik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21PcE5hbWUgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uUU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lKTsKLQotICAgICAgICBRTmFtZSBtZXNzYWdlRWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcDYiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbkJ5TWVzc2FnZUVsZW1lbnRRTmFtZShtZXNzYWdlRWxlbWVudFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUsIGF4aXNPcGVyYXRpb25Gcm9tRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jTGl0QmFyZU5vUGFyYW1zKCkgewotICAgICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgiIiwgIm9wNyIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3A3Iik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REb2NMaXRCYXJlSGVhZGVyUGFyYW1GaXJzdCgpIHsKLSAgICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoIiIsICJvcDgiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25RTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21PcE5hbWUpOwotCi0gICAgICAgIFFOYW1lIG1lc3NhZ2VFbGVtZW50UU5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wOHBhcmFtMlBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lLCBheGlzT3BlcmF0aW9uRnJvbUVsZW1lbnQpOwotCi0gICAgICAgIFFOYW1lIHdyb25nTWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3A4cGFyYW0xUGFydE5hbWUiKTsKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uRnJvbVdyb25nRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uQnlNZXNzYWdlRWxlbWVudFFOYW1lKHdyb25nTWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoYXhpc09wZXJhdGlvbkZyb21Xcm9uZ0VsZW1lbnQpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdERvY0xpdFdyYXBwZWQoKSB7Ci0gICAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKCIiLCAib3AxMCIpOwotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb25Gcm9tT3BOYW1lID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKG9wZXJhdGlvblFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzT3BlcmF0aW9uRnJvbU9wTmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgbWVzc2FnZUVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAib3AxMHBhcmFtMVBhcnROYW1lIik7Ci0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbkZyb21FbGVtZW50ID0KLSAgICAgICAgICAgICAgICBheGlzU2VydmljZS5nZXRPcGVyYXRpb25CeU1lc3NhZ2VFbGVtZW50UU5hbWUobWVzc2FnZUVsZW1lbnRRTmFtZSk7Ci0gICAgICAgIGFzc2VydE51bGwoYXhpc09wZXJhdGlvbkZyb21FbGVtZW50KTsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlCi1jbGFzcyBETEJSZXNvbHZlT3BlcmF0aW9uIHsKLQotICAgIEBTT0FQQmluZGluZyhzdHlsZSA9IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCB1c2UgPSBTT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyB2b2lkIG9wMSgKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wMXBhcmFtMVBhcnROYW1lIikgaW50IHBhcmFtMSkgewotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhzdHlsZSA9IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCB1c2UgPSBTT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyB2b2lkIG9wMigKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wMnBhcmFtMVBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkgSG9sZGVyPEludGVnZXI+IHBhcmFtMSkgewotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhzdHlsZSA9IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCB1c2UgPSBTT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyB2b2lkIG9wMygKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wM3BhcmFtMVBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTk9VVCkgSG9sZGVyPEludGVnZXI+IHBhcmFtMSwKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wM3BhcmFtMlBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gV2ViUGFyYW0uTW9kZS5JTikgaW50IHBhcmFtMikgewotICAgIH0KLQotICAgIEBTT0FQQmluZGluZyhzdHlsZSA9IFNPQVBCaW5kaW5nLlN0eWxlLkRPQ1VNRU5ULCB1c2UgPSBTT0FQQmluZGluZy5Vc2UuTElURVJBTCwKLSAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotICAgIHB1YmxpYyB2b2lkIG9wNCgKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wNHBhcmFtMVBhcnROYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gV2ViUGFyYW0uTW9kZS5PVVQpIEhvbGRlcjxJbnRlZ2VyPiBwYXJhbTEpIHsKLSAgICB9Ci0KLSAgICBAU09BUEJpbmRpbmcoc3R5bGUgPSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgdXNlID0gU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgdm9pZCBvcDUoCi0gICAgICAgICAgICBAV2ViUGFyYW0odGFyZ2V0TmFtZXNwYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRExCUmVzb2x2ZU9wZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJvcDVwYXJhbTFQYXJ0TmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IFdlYlBhcmFtLk1vZGUuT1VUKSBIb2xkZXI8SW50ZWdlcj4gcGFyYW0xLAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3A1cGFyYW0yUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOKSBpbnQgcGFyYW0yKSB7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgb3A2KAotICAgICAgICAgICAgQFdlYlBhcmFtIGludCBwYXJhbTEpIHsKLSAgICB9Ci0KLSAgICBAU09BUEJpbmRpbmcoc3R5bGUgPSBTT0FQQmluZGluZy5TdHlsZS5ET0NVTUVOVCwgdXNlID0gU09BUEJpbmRpbmcuVXNlLkxJVEVSQUwsCi0gICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLSAgICBwdWJsaWMgdm9pZCBvcDcoKSB7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLkJBUkUpCi0gICAgcHVibGljIHZvaWQgb3A4KAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3A4cGFyYW0xUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOLAotICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IHRydWUpIEludGVnZXIgcGFyYW0xLAotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRMQlJlc29sdmVPcGVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAib3A4cGFyYW0yUGFydE5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBXZWJQYXJhbS5Nb2RlLklOKSBpbnQgcGFyYW0yKSB7Ci0gICAgfQotCi0gICAgQFNPQVBCaW5kaW5nKHN0eWxlID0gU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQsIHVzZSA9IFNPQVBCaW5kaW5nLlVzZS5MSVRFUkFMLAotICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHlsZSA9IFNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlLldSQVBQRUQpCi0gICAgcHVibGljIHZvaWQgb3AxMCgKLSAgICAgICAgICAgIEBXZWJQYXJhbSh0YXJnZXROYW1lc3BhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5ETEJSZXNvbHZlT3BlcmF0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIm9wMTBwYXJhbTFQYXJ0TmFtZSIpIGludCBwYXJhbTEpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRXcmFwcGVkSW1wbFdpdGhTRUkuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRXcmFwcGVkSW1wbFdpdGhTRUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MWFhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vRG9jTGl0V3JhcHBlZEltcGxXaXRoU0VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuRmluT3BSZXNwb25zZTsKLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbmFuY2lhbE9wZXJhdGlvbjsKLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlJldHVyblR5cGU7Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXlIb2xkZXI7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKLQotLyoqCi0gKiAKLSAqLwotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRG9jTGl0V3JhcHBlZFNlcnZpY2UiLAotICAgICAgICAgICAgZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5Eb2NMaXRXcmFwcGVkUHJveHkiKQotcHVibGljIGNsYXNzIERvY0xpdFdyYXBwZWRJbXBsV2l0aFNFSSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25lV2F5KFN0cmluZyBvbmV3YXlTdHIpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZTxUd29XYXlIb2xkZXI+IHR3b1dheUhvbGRlckFzeW5jKFN0cmluZyB0d29XYXlIb2xkZXJTdHIsIGludCB0d29XYXlIb2xkZXJJbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1dHVyZTw/PiB0d29XYXlIb2xkZXJBc3luYyhTdHJpbmcgdHdvV2F5SG9sZGVyU3RyLCBpbnQgdHdvV2F5SG9sZGVySW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNIYW5kbGVyPFR3b1dheUhvbGRlcj4gYXN5bmNIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHR3b1dheUhvbGRlcihIb2xkZXI8U3RyaW5nPiB0d29XYXlIb2xkZXJTdHIsIEhvbGRlcjxJbnRlZ2VyPiB0d29XYXlIb2xkZXJJbnQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiB0d29XYXlBc3luYyhTdHJpbmcgdHdvd2F5U3RyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gdHdvV2F5QXN5bmMoU3RyaW5nIHR3b3dheVN0ciwgQXN5bmNIYW5kbGVyPFJldHVyblR5cGU+IGFzeW5jSGFuZGxlcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHR3b1dheShTdHJpbmcgdHdvd2F5U3RyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZTxSZXR1cm5UeXBlPiBpbnZva2VBc3luYyhTdHJpbmcgaW52b2tlU3RyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gaW52b2tlQXN5bmMoU3RyaW5nIGludm9rZVN0ciwgQXN5bmNIYW5kbGVyPFJldHVyblR5cGU+IGFzeW5jSGFuZGxlcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgaW52b2tlU3RyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZTxGaW5PcFJlc3BvbnNlPiBmaW5PcEFzeW5jKEZpbmFuY2lhbE9wZXJhdGlvbiBvcCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnV0dXJlPD8+IGZpbk9wQXN5bmMoRmluYW5jaWFsT3BlcmF0aW9uIG9wLCBBc3luY0hhbmRsZXI8RmluT3BSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBGaW5hbmNpYWxPcGVyYXRpb24gZmluT3AoRmluYW5jaWFsT3BlcmF0aW9uIG9wKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdFdyYXBwZWRQcm94eS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0RvY0xpdFdyYXBwZWRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjA5MjA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9Eb2NMaXRXcmFwcGVkUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5hbmNpYWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlOwotaW1wb3J0IG9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5Bc3luY0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKiogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4gSkFYLVdTIFJJIDIuMF8wMS1iMTUtZmNzIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wICovCi1AV2ViU2VydmljZShuYW1lID0gIkRvY0xpdFdyYXBwZWRQcm94eSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIpCi1wdWJsaWMgaW50ZXJmYWNlIERvY0xpdFdyYXBwZWRQcm94eSB7Ci0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAT25ld2F5Ci0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJvbmVXYXlWb2lkIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5PbmVXYXlWb2lkIikKLSAgICBwdWJsaWMgdm9pZCBvbmVXYXlWb2lkKCk7Ci0KLSAgICAvKiogQHBhcmFtIG9uZXdheVN0ciAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQE9uZXdheQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAib25lV2F5IiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuT25lV2F5IikKLSAgICBwdWJsaWMgdm9pZCBvbmVXYXkoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJvbmV3YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyBvbmV3YXlTdHIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlckludAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJTdHIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuVHdvV2F5SG9sZGVyPgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXlIb2xkZXIiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBwdWJsaWMgUmVzcG9uc2U8VHdvV2F5SG9sZGVyPiB0d29XYXlIb2xkZXJBc3luYygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9zdHIiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgU3RyaW5nIHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9pbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgaW50IHR3b1dheUhvbGRlckludCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdHdvV2F5SG9sZGVySW50Ci0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcgotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJTdHIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJ0d29XYXlIb2xkZXIiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gInR3b1dheUhvbGRlciIsCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuVHdvV2F5SG9sZGVyIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUhvbGRlckFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBTdHJpbmcgdHdvV2F5SG9sZGVyU3RyLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX2ludCIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBpbnQgdHdvV2F5SG9sZGVySW50LAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgICAgICBBc3luY0hhbmRsZXI8VHdvV2F5SG9sZGVyPiBhc3luY0hhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHR3b1dheUhvbGRlckludAotICAgICAqIEBwYXJhbSB0d29XYXlIb2xkZXJTdHIKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXlIb2xkZXIiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5SG9sZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheUhvbGRlciIpCi0gICAgcHVibGljIHZvaWQgdHdvV2F5SG9sZGVyKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvV2F5SG9sZGVyX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBtb2RlID0gTW9kZS5JTk9VVCkKLSAgICAgICAgICAgIEhvbGRlcjxTdHJpbmc+IHR3b1dheUhvbGRlclN0ciwKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInR3b1dheUhvbGRlcl9pbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpCi0gICAgICAgICAgICBIb2xkZXI8SW50ZWdlcj4gdHdvV2F5SG9sZGVySW50KTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YXgueG1sLndzLlJlc3BvbnNlPG9yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuUmV0dXJuVHlwZT4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5IiwKLSAgICAgICAgICAgICAgIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5zZWkuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IHR3b1dheUFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBTdHJpbmcgdHdvd2F5U3RyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAidHdvV2F5IiwKLSAgICAgICAgICAgICAgIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJ0d29XYXkiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLlR3b1dheSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IHR3b1dheUFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidHdvd2F5X3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBTdHJpbmcgdHdvd2F5U3RyLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB0d293YXlTdHIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAidHdvV2F5IiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5Ud29XYXkiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFN0cmluZyB0d29XYXkoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ0d293YXlfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyB0d293YXlTdHIpOwotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaW52b2tlU3RyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLlJldHVyblR5cGU+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImludm9rZSIsCi0gICAgICAgICAgICAgICBhY3Rpb24gPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZC90d29XYXlSZXR1cm4iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFJlc3BvbnNlPFJldHVyblR5cGU+IGludm9rZUFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBTdHJpbmcgaW52b2tlU3RyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnZva2VTdHIKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiaW52b2tlIiwKLSAgICAgICAgICAgICAgIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL3R3b1dheVJldHVybiIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJpbnZva2UiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkludm9rZSIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiUmV0dXJuVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5SZXR1cm5UeXBlIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IGludm9rZUFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW52b2tlX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKSBTdHJpbmcgaW52b2tlU3RyLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiYXN5bmNIYW5kbGVyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpCi0gICAgICAgICAgICBBc3luY0hhbmRsZXI8UmV0dXJuVHlwZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnZva2VTdHIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvdHdvV2F5UmV0dXJuIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmV0dXJuX3N0ciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiaW52b2tlIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5JbnZva2UiKQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIlJldHVyblR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy50ZXN0LnByb3h5LmRvY2xpdHdyYXBwZWQuUmV0dXJuVHlwZSIpCi0gICAgcHVibGljIFN0cmluZyBpbnZva2UoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnZva2Vfc3RyIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIFN0cmluZyBpbnZva2VTdHIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG9wCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQuc2VpLkZpbk9wUmVzcG9uc2U+Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImZpbk9wIiwKLSAgICAgICAgICAgICAgIGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL2Zpbk9wIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcCIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3BSZXNwb25zZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcFJlc3BvbnNlIikKLSAgICBwdWJsaWMgUmVzcG9uc2U8RmluT3BSZXNwb25zZT4gZmluT3BBc3luYygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcGFyYW0gYXN5bmNIYW5kbGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZmluT3AiLAotICAgICAgICAgICAgICAgYWN0aW9uID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQvZmluT3AiKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3AiLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJmaW5PcFJlc3BvbnNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkIiwKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJvcmcudGVzdC5wcm94eS5kb2NsaXR3cmFwcGVkLkZpbk9wUmVzcG9uc2UiKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZmluT3BBc3luYygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gIm9wIiwgdGFyZ2V0TmFtZXNwYWNlID0gIiIpIEZpbmFuY2lhbE9wZXJhdGlvbiBvcCwKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImFzeW5jSGFuZGxlciIsIHRhcmdldE5hbWVzcGFjZSA9ICIiKQotICAgICAgICAgICAgQXN5bmNIYW5kbGVyPEZpbk9wUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3AKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkLnNlaS5GaW5hbmNpYWxPcGVyYXRpb24KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5wcm94eS5kb2NsaXR3cmFwcGVkL2Zpbk9wIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAicmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikKLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImZpbk9wIiwKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLnByb3h5LmRvY2xpdHdyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcCIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZmluT3BSZXNwb25zZSIsCi0gICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIucHJveHkuZG9jbGl0d3JhcHBlZCIsCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLnRlc3QucHJveHkuZG9jbGl0d3JhcHBlZC5GaW5PcFJlc3BvbnNlIikKLSAgICBwdWJsaWMgRmluYW5jaWFsT3BlcmF0aW9uIGZpbk9wKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAib3AiLCB0YXJnZXROYW1lc3BhY2UgPSAiIikgRmluYW5jaWFsT3BlcmF0aW9uIG9wKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0dldFN5bmNPcGVyYXRpb25UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL0dldFN5bmNPcGVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQxMGQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9HZXRTeW5jT3BlcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2V0U3luY09wZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N5bmNPcGVyYXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzRGVzYyA9IAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uIiwgInN5bmNPcGVyYXRpb25UZXN0U2VydmljZTIiKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC53cy5TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlRGVzYyA9IAotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHNEZXNjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY09ubHlTRUkuY2xhc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbiIsICJzeW5jT3BlcmF0aW9uVGVzdFBvcnQyIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JUKTsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaURlc2MgPSBlRGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzY3NbXSA9IGVpRGVzYy5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob3BEZXNjcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBvcERlc2NzLmxlbmd0aCk7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSBlYWNoIG9mIHRoZSBhc3luYyBvcGVyYXRpb25zIHJlZmVyZW5jZSB0aGUgc3luYyBvcERlc2MKLSAgICAgICAgaW50IGFzeW5jT3BlcmF0aW9ucyA9IDA7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIHN5bmNPcERlc2NzW10gPSBlaURlc2MuZ2V0T3BlcmF0aW9uRm9ySmF2YU1ldGhvZCgiZWNobyIpOwotICAgICAgICBhc3NlcnROdWxsKHN5bmNPcERlc2NzKTsKLSAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgOiBvcERlc2NzKSB7Ci0gICAgICAgICAgICBpZiAob3BEZXNjLmlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpKSB7Ci0gICAgICAgICAgICAgICAgYXN5bmNPcGVyYXRpb25zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpc24ndCBhIHN5bmMgbWV0aG9kIGluIHRoZSAoaW52YWxpZCkgU0VJLCB0aGVuIHRoaXMgc2hvdWxkIHJldHVybiBudWxsCi0gICAgICAgICAgICBhc3NlcnROdWxsKG9wRGVzYy5nZXRTeW5jT3BlcmF0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBhc3luY09wZXJhdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jT3BlcmF0aW9uKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc0Rlc2MgPSAKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbiIsICJzeW5jT3BlcmF0aW9uVGVzdFNlcnZpY2UxIiksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwud3MuU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZURlc2MgPSAKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzRGVzYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY0FuZEFzeW5jU0VJLmNsYXNzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24iLCAic3luY09wZXJhdGlvblRlc3RQb3J0MSIpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCk7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlEZXNjID0gZURlc2MuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2NzW10gPSBlaURlc2MuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9wRGVzY3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgb3BEZXNjcy5sZW5ndGgpOwotICAgICAgICAvLyBNYWtlIHN1cmUgZWFjaCBvZiB0aGUgYXN5bmMgb3BlcmF0aW9ucyByZWZlcmVuY2UgdGhlIHN5bmMgb3BEZXNjCi0gICAgICAgIGludCBhc3luY09wZXJhdGlvbnMgPSAwOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBzeW5jT3BEZXNjc1tdID0gZWlEZXNjLmdldE9wZXJhdGlvbkZvckphdmFNZXRob2QoImVjaG8iKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzeW5jT3BEZXNjcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzeW5jT3BEZXNjcy5sZW5ndGgpOwotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBzeW5jT3BEZXNjID0gc3luY09wRGVzY3NbMF07Ci0KLSAgICAgICAgZm9yIChPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgOiBvcERlc2NzKSB7Ci0gICAgICAgICAgICBpZiAob3BEZXNjLmlzSkFYV1NBc3luY0NsaWVudE1ldGhvZCgpKSB7Ci0gICAgICAgICAgICAgICAgYXN5bmNPcGVyYXRpb25zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBvcGVyYXRpb25zIHBvaW50IHRvIHRoZSBzeW5jIG9wZXJhdGlvbgotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bmNPcERlc2MsIG9wRGVzYy5nZXRTeW5jT3BlcmF0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYXN5bmNPcGVyYXRpb25zKTsKLSAgICB9Ci0KLQotfQotCi1AV2ViU2VydmljZQotaW50ZXJmYWNlIEFzeW5jT25seVNFSSB7Ci0gICAgLy8gTm90ZSB0aGlzIGlzIGFuIElOVkFMSUQgU0VJIHNpbmNlIGl0IG9ubHkgY29udGFpbnMgdGhlCi0gICAgLy8gSkFYV1MgY2xpZW50IGFzeW5jIG1ldGhvZHMsIGFuZCBub3QgdGhlIGNvcnJlc3BvbmRpbmcgc3luYyAKLSAgICAvLyBtZXRob2QuCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImVjaG8iKQotICAgIHB1YmxpYyBSZXNwb25zZTxTdHJpbmc+IGVjaG9Bc3luYyhTdHJpbmcgdG9FY2hvKTsKLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNobyIpCi0gICAgcHVibGljIEZ1dHVyZTw/PiBlY2hvQXN5bmMoU3RyaW5nIHRvRWNobywgQXN5bmNIYW5kbGVyPFN0cmluZz4gYXN5bmNIYW5kbGVyKTsKLX0KLQotQFdlYlNlcnZpY2UKLWludGVyZmFjZSBTeW5jQW5kQXN5bmNTRUkgewotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJlY2hvIikKLSAgICBwdWJsaWMgUmVzcG9uc2U8U3RyaW5nPiBlY2hvQXN5bmMoU3RyaW5nIHRvRWNobyk7Ci0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImVjaG8iKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZWNob0FzeW5jKFN0cmluZyB0b0VjaG8sIEFzeW5jSGFuZGxlcjxTdHJpbmc+IGFzeW5jSGFuZGxlcik7Ci0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gImVjaG8iKQotICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgdG9FY2hvKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ2hhaW5Db25maWdGaWxlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ2hhaW5Db25maWdGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2YWI2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vSGFuZGxlckNoYWluQ29uZmlnRmlsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluQ29uZmlnRmlsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDb25maWdGaWxlKCkgew0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFZhbGlkQ29uZmlnRmlsZUltcGwuY2xhc3MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVwRGVzY3MgPSBzdmNEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXBEZXNjcy5sZW5ndGgpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MgPSBlcERlc2NzWzBdOw0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0ID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChoY3QpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1JlbGF0aXZlQ29uZmlnRmlsZSgpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEludmFsaWRDb25maWdGaWxlSW1wbC5jbGFzcyk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVwRGVzY3MgPSBzdmNEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY3MubGVuZ3RoKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IGVwRGVzY3NbMF07DQotICAgICAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0ID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIGEgbWlzc2luZyBoYW5kbGVyIGNvbmZpZyBmaWxlIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aCAgICAgICAgfQ0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS50b1N0cmluZygpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBXZWJTZXJ2aWNlRXhjZXB0aW9uLCBidXQgY2F1Z2h0OiAiICsgZSk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdBYnNvbHV0ZUNvbmZpZ0ZpbGUoKSB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihJbnZhbGlkQWJzb2x1dGVDb25maWdGaWxlSW1wbC5jbGFzcyk7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVwRGVzY3MgPSBzdmNEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7DQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVwRGVzY3MubGVuZ3RoKTsNCi0gICAgICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IGVwRGVzY3NbMF07DQotICAgICAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0ID0gZXBEZXNjLmdldEhhbmRsZXJDaGFpbigpOw0KLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIGEgbWlzc2luZyBoYW5kbGVyIGNvbmZpZyBmaWxlIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aC4gIFdlIGNhbid0IGNoZWNrIGZvciBleHBsaWNpdCBkZXRhaWxzIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdoaWNoIGZhaWx1cmUNCi0gICAgICAgICAgICAvLyBvY2N1cnMgZGVwZW5kcyBvbiB0aGUgZW5pdnJvbm1lbnQuICBTb21lIGdldCAiQ29ubmVjdGlvblJlZnVzZWQiIGFuZCBzb21lIGdldCAiRmlsZU5vdEZvdW5kIi4NCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgV2ViU2VydmljZUV4Y2VwdGlvbiwgYnV0IGNhdWdodDogIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlKCkNCi1ASGFuZGxlckNoYWluKGZpbGUgPSAiSGFuZGxlckNvbmZpZ0ZpbGUueG1sIikNCi1jbGFzcyBWYWxpZENvbmZpZ0ZpbGVJbXBsIHsNCi0gICAgDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlKCkNCi1ASGFuZGxlckNoYWluKGZpbGUgPSAiTWlzc2luZ0hhbmRsZXJDb25maWdGaWxlLnhtbCIpDQotY2xhc3MgSW52YWxpZENvbmZpZ0ZpbGVJbXBsIHsNCi0gICAgDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlKCkNCi1ASGFuZGxlckNoYWluKGZpbGUgPSAiaHR0cDovL2xvY2FsaG9zdC93aWxsL25vdC9maW5kL01pc3NpbmdIYW5kbGVyQ29uZmlnRmlsZS54bWwiKQ0KLWNsYXNzIEludmFsaWRBYnNvbHV0ZUNvbmZpZ0ZpbGVJbXBsIHsNCi0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ29uZmlnRmlsZS54bWwgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vSGFuZGxlckNvbmZpZ0ZpbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjRmOTM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9IYW5kbGVyQ29uZmlnRmlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxqd3M6aGFuZGxlci1jaGFpbnMgeG1sbnM6andzPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiPg0KLQ0KLQk8andzOmhhbmRsZXItY2hhaW4gbmFtZT0iTG9nZ2luZ0hhbmRsZXJDaGFpbiI+DQotCQk8andzOnByb3RvY29sLWJpbmRpbmdzPiMjU09BUDExX0hUVFAgIyNzb21ldGhpbmcgYmxhcmc8L2p3czpwcm90b2NvbC1iaW5kaW5ncz4NCi0JCTxqd3M6cG9ydC1uYW1lLXBhdHRlcm4gDQotICAgICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly9hZGRudW1iZXJzaGFuZGxlci5zYW1wbGUuamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iPm5zMTpBZGROdW1iZXJzSGFuZGxlclAqPC9qd3M6cG9ydC1uYW1lLXBhdHRlcm4+DQotICAgICAgICA8andzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuIA0KLSAgICAgICAgICAgICAgeG1sbnM6bnMxPSJodHRwOi8vYWRkbnVtYmVyc2hhbmRsZXIuc2FtcGxlLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIj5uczE6KjwvandzOnNlcnZpY2UtbmFtZS1wYXR0ZXJuPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzTG9naWNhbEhhbmRsZXI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc1Byb3RvY29sSGFuZGxlcjI8L2p3czpoYW5kbGVyLWNsYXNzPg0KLQkJPC9qd3M6aGFuZGxlcj4NCi0JCTxqd3M6aGFuZGxlcj4NCi0JCQk8andzOmhhbmRsZXItY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuYWRkbnVtYmVyc2hhbmRsZXIuQWRkTnVtYmVyc0xvZ2ljYWxIYW5kbGVyMjwvandzOmhhbmRsZXItY2xhc3M+DQotCQk8L2p3czpoYW5kbGVyPg0KLQkJPGp3czpoYW5kbGVyPg0KLQkJCTxqd3M6aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZS5hZGRudW1iZXJzaGFuZGxlci5BZGROdW1iZXJzUHJvdG9jb2xIYW5kbGVyPC9qd3M6aGFuZGxlci1jbGFzcz4NCi0JCTwvandzOmhhbmRsZXI+DQotCTwvandzOmhhbmRsZXItY2hhaW4+DQotCQ0KLTwvandzOmhhbmRsZXItY2hhaW5zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9NdXN0VW5kZXJzdGFuZFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vTXVzdFVuZGVyc3RhbmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmJjNjA2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9NdXN0VW5kZXJzdGFuZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGNsYXNzIE11c3RVbmRlcnN0YW5kVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyUGFyYW1ldGVycygpIHsNCi0gICAgICAgIC8vIFRlc3QgSU4gYW5kIElOT1VUIGhlYWRlciBwYXJhbWF0ZXJzIGluIFNFSQ0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKEhlYWRlclBhcmFtZXRlcnMuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjc1tdID0gc3ZjRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERlc2NzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBlcERlc2NzLmxlbmd0aCk7DQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVwaURlc2MgPSBlcERlc2NzWzBdLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXBpRGVzYyk7DQotICAgICAgICANCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzY3NbXSA9IGVwaURlc2MuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvcERlc2NzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBvcERlc2NzLmxlbmd0aCk7DQotICAgICAgICBPcGVyYXRpb25EZXNjcmlwdGlvbiBvcERlc2MgPSBvcERlc2NzWzBdOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJlY2hvU3RyaW5nIiwgb3BEZXNjLmdldE9wZXJhdGlvbk5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG9wRGVzYy5nZXRBeGlzT3BlcmF0aW9uKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNPcGVyYXRpb24pOw0KLSAgICAgICAgUGFyYW1ldGVyIHVuZGVyc3Rvb2RRTmFtZXNQYXJhbWV0ZXIgPSBheGlzT3BlcmF0aW9uLmdldFBhcmFtZXRlcihPcGVyYXRpb25EZXNjcmlwdGlvbi5IRUFERVJfUEFSQU1FVEVSX1FOQU1FUyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHVuZGVyc3Rvb2RRTmFtZXNQYXJhbWV0ZXIpOw0KLSAgICAgICAgQXJyYXlMaXN0IHVuZGVyc3Rvb2RRTmFtZXMgPSAoQXJyYXlMaXN0KSB1bmRlcnN0b29kUU5hbWVzUGFyYW1ldGVyLmdldFZhbHVlKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoNCwgdW5kZXJzdG9vZFFOYW1lcy5zaXplKCkpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHVuZGVyc3Rvb2RRTmFtZXMuY29udGFpbnMobmV3IFFOYW1lKCJ3ZWJzZXJ2aWNlLm5hbWVzcGFjZSIsICJyZW5hbWVkUGFyYW0xIikpKTsNCi0gICAgICAgIGFzc2VydFRydWUodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgImFyZzEiKSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2VicGFyYW0ubmFtZXNwYWNlIiwgImFyZzIiKSkpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgIm91dE9ubHkiKSkpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgImFyZzMiKSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh1bmRlcnN0b29kUU5hbWVzLmNvbnRhaW5zKG5ldyBRTmFtZSgid2Vic2VydmljZS5uYW1lc3BhY2UiLCAiaW5PdXQiKSkpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgImFyZzQiKSkpOw0KLSAgICAgICAgYXNzZXJ0RmFsc2UodW5kZXJzdG9vZFFOYW1lcy5jb250YWlucyhuZXcgUU5hbWUoIndlYnNlcnZpY2UubmFtZXNwYWNlIiwgIm5vdEluSGVhZGVyIikpKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKHVuZGVyc3Rvb2RRTmFtZXMuY29udGFpbnMobmV3IFFOYW1lKCJ3ZWJzZXJ2aWNlLm5hbWVzcGFjZSIsICJhcmc1IikpKTsNCi0gICAgICAgIA0KLSAgICB9DQotfQ0KLQ0KLUBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT0id2Vic2VydmljZS5uYW1lc3BhY2UiKQ0KLWNsYXNzIEhlYWRlclBhcmFtZXRlcnMgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoDQotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWU9InJlbmFtZWRQYXJhbTEiLCBoZWFkZXI9dHJ1ZSkgU3RyaW5nIHBhcmFtMSwNCi0gICAgICAgICAgICBAV2ViUGFyYW0oaGVhZGVyPXRydWUpIFN0cmluZyBwYXJhbTIsDQotICAgICAgICAgICAgQFdlYlBhcmFtKHRhcmdldE5hbWVzcGFjZT0id2VicGFyYW0ubmFtZXNwYWNlIiwgaGVhZGVyPXRydWUpIFN0cmluZyBwYXJhbTMsDQotICAgICAgICAgICAgQFdlYlBhcmFtKG1vZGU9V2ViUGFyYW0uTW9kZS5PVVQsIGhlYWRlcj10cnVlKSBIb2xkZXI8U3RyaW5nPiBvdXRPbmx5LA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lPSJpbk91dCIsIG1vZGU9V2ViUGFyYW0uTW9kZS5JTk9VVCwgaGVhZGVyPXRydWUpIEhvbGRlcjxTdHJpbmc+IGluT3V0LA0KLSAgICAgICAgICAgIFN0cmluZyBub3RJbkhlYWRlcikgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vT3BlcmF0aW9uRGVzY3JpcHRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRjODE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9PcGVyYXRpb25EZXNjcmlwdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUFubm90OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIFRoZXNlIHRlc3RzIGFyZSBpbnRlbmRlZCB0byB0ZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgT3BlcmF0aW9uRGVzY3JpcHRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkRlc2NyaXB0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIHRlc3Qgd2lsbCBjb25maXJtIHRoYXQgdGhlIGdldEJpbmRpbmdJbnB1dE5hbWVzcGFjZSBhbmQgZ2V0QmluZGluZ091dHB1dE5hbWVzcGFjZQotICAgICAqIG1ldGhvZHMgb2YgdGhlIE9wZXJhdGlvbkRlc2NyaXB0aW9uIGZ1bmN0aW9uIGNvcnJlY3RseS4KLSAgICAgKgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEJpbmRpbmdOYW1lc3BhY2UoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiQmluZGluZ05hbWVzcGFjZS53c2RsIjsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIjsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOwotCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIAotICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExVUkwod3NkbEZpbGVOYW1lKTsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFBvcnROYW1lKCJFY2hvTWVzc2FnZVBvcnQiKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoImVjaG9NZXNzYWdlIik7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMSA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7Ci0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7Ci0gICAgICAgIGRiYy5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgZGJjLnNldENsYXNzTmFtZShCaW5kaW5nTlNJbXBsLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmbik7Ci0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY01hcC5wdXQoZGJjLmdldENsYXNzTmFtZSgpLCBkYmMpOwotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2QpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlZEFycmF5ID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVkQXJyYXlbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlkID0gZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVpZCk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvZEFycmF5ID0gZWlkLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSBvZEFycmF5WzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vb3JnLmFwYWNoZS5iaW5kaW5nLm5zIiwgb2QuZ2V0QmluZGluZ0lucHV0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vcmcuYXBhY2hlLmJpbmRpbmcubnMiLCBvZC5nZXRCaW5kaW5nT3V0cHV0TmFtZXNwYWNlKCkpOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZGluZ05hbWVzcGFjZURlZmF1bHRzKCkgewotICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIkJpbmRpbmdOYW1lc3BhY2VEZWZhdWx0cy53c2RsIjsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIjsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOwotCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIAotICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBVUkwgd3NkbFVSTCA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFdTRExVUkwod3NkbEZpbGVOYW1lKTsKLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsKLQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFBvcnROYW1lKCJFY2hvTWVzc2FnZVBvcnQiKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoImVjaG9NZXNzYWdlIik7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMSA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7Ci0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7Ci0gICAgICAgIGRiYy5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgZGJjLnNldENsYXNzTmFtZShCaW5kaW5nTlNJbXBsLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmbik7Ci0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsKLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uW10gZWRBcnJheSA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWRBcnJheSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlZEFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBlZEFycmF5WzBdOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IGVkLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlaWQpOwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb2RBcnJheSA9IGVpZC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2RBcnJheSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvZEFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9kID0gb2RBcnJheVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIG9kLmdldEJpbmRpbmdJbnB1dE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgb2QuZ2V0QmluZGluZ091dHB1dE5hbWVzcGFjZSgpKTsKLQotICAgIH0KLQotCi0gICAgQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob01lc3NhZ2VTZXJ2aWNlIiwgcG9ydE5hbWUgPSAiRWNob01lc3NhZ2VQb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciLCB3c2RsTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC9CaW5kaW5nTmFtZXNwYWNlLndzZGwiKQotICAgIHB1YmxpYyBjbGFzcyBCaW5kaW5nTlNJbXBsIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBAV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvTWVzc2FnZVNlcnZpY2UiLCBwb3J0TmFtZSA9ICJFY2hvTWVzc2FnZVBvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsL0JpbmRpbmdOYW1lc3BhY2VEZWZhdWx0cy53c2RsIikKLSAgICBwdWJsaWMgY2xhc3MgQmluZGluZ05TRGVmYXVsdHNJbXBsIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFydGlhbFdTRExUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1BhcnRpYWxXU0RMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmM2RmYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vUGFydGlhbFdTRExUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NRFFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUFubm90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5Xc2RsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5Xc2RsR2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGFydGlhbFdTRExUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBiaW5kaW5nLCBzZXJ2aWNlLCBhbmQgcG9ydCBub3Qgc3BlY2lmaWVkIGluIHRoZSBXU0RMLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIHRlc3QgaXMgYmFzZWQgb24gdGhlIEZWVCB0ZXN0IEFkZE51bWJlcnNJbXBsUGFydGlhbDEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbFdTREwxKCkgewotICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIlBhcnRpYWxXU0RMMS53c2RsIjsKLQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGltcGwgY2xhc3MuCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5jcmVhdGVXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJhZGRUd29OdW1iZXJzIik7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJpbnQiKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiaW50Iik7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzIgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7Ci0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMyKTsKLQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEFkZE51bWJlcnNJbXBsUGFydGlhbDEuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgZGJjLnNldFdzZGxEZWZpbml0aW9uKHdzZGxEZWZuKTsKLSAgICAgICAgZGJjLnNldHdzZGxVUkwod3NkbFVSTCk7Ci0gICAgICAgIGRiYy5zZXRDdXN0b21Xc2RsR2VuZXJhdG9yKG5ldyBXU0RMR2VuZXJhdG9ySW1wbCh3c2RsRGVmbikpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY01hcC5wdXQoQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMS5jbGFzcy5nZXROYW1lKCksIGRiYyk7Ci0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLQotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlZEFycmF5ID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVkQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVkQXJyYXlbMF07Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotCi0gICAgICAgIC8vIFRlc3QgZm9yIHByZXNlbmNlIG9mIGdlbmVyYXRlZCBXU0RMCi0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChhcyk7Ci0gICAgICAgIFBhcmFtZXRlciBjb21wb3NpdGVQYXJhbSA9IGFzLmdldFBhcmFtZXRlcihNRFFDb25zdGFudHMuV1NETF9DT01QT1NJVEUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZVBhcmFtKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21wb3NpdGVQYXJhbS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGVpZCA9IGVkLmdldEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlaWQpOwotCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uW10gb2RBcnJheSA9IGVpZC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwob2RBcnJheSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBvZEFycmF5Lmxlbmd0aCk7Ci0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9kID0gb2RBcnJheVswXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgYmluZGluZywgc2VydmljZSwgYW5kIHBvcnQgbm90IHNwZWNpZmllZCBpbiB0aGUgV1NETC4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyB0ZXN0IGlzIGJhc2VkIG9uIHRoZSBGVlQgdGVzdCBBZGROdW1iZXJzSW1wbFBhcnRpYWwyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxXU0RMMigpIHsKLSAgICAgICAgU3RyaW5nIHdzZGxSZWxhdGl2ZUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvIjsKLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9ICJQYXJ0aWFsV1NETDIud3NkbCI7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIjsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOwotCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBpbXBsIGNsYXNzLgotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbERlZm4pOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiYWRkVHdvTnVtYmVycyIpOwotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgiaW50Iik7Ci0KLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjMSA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImludCIpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMyID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiaW50Iik7Ci0KLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzEpOwotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMik7Ci0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7Ci0gICAgICAgIGRiYy5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgZGJjLnNldENsYXNzTmFtZShBZGROdW1iZXJzSW1wbFBhcnRpYWwxLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmbik7Ci0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOwotICAgICAgICBkYmMuc2V0Q3VzdG9tV3NkbEdlbmVyYXRvcihuZXcgV1NETEdlbmVyYXRvckltcGwod3NkbERlZm4pKTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgICAgICBkYmNNYXAucHV0KEFkZE51bWJlcnNJbXBsUGFydGlhbDEuY2xhc3MuZ2V0TmFtZSgpLCBkYmMpOwotCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gc2VydmljZURlc2NMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZCk7Ci0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbltdIGVkQXJyYXkgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkQXJyYXkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZWRBcnJheS5sZW5ndGgpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gZWRBcnJheVswXTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0KLSAgICAgICAgLy8gVGVzdCBmb3IgcHJlc2VuY2Ugb2YgZ2VuZXJhdGVkIFdTREwKLSAgICAgICAgQXhpc1NlcnZpY2UgYXMgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGFzKTsKLSAgICAgICAgUGFyYW1ldGVyIGNvbXBvc2l0ZVBhcmFtID0gYXMuZ2V0UGFyYW1ldGVyKE1EUUNvbnN0YW50cy5XU0RMX0NPTVBPU0lURSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoY29tcG9zaXRlUGFyYW0pOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZVBhcmFtLmdldFZhbHVlKCkpOwotCi0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlkID0gZWQuZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVpZCk7Ci0KLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb25bXSBvZEFycmF5ID0gZWlkLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvZEFycmF5KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG9kQXJyYXkubGVuZ3RoKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb2QgPSBvZEFycmF5WzBdOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2Uod3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvUGFydGlhbFdTREwyLndzZGwiLAotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iKQotY2xhc3MgQWRkTnVtYmVyc0ltcGxQYXJ0aWFsMSB7Ci0gICAgcHVibGljIGludCBhZGRUd29OdW1iZXJzKGludCBudW1iZXIxLCBpbnQgbnVtYmVyMikgewotICAgICAgICByZXR1cm4gbnVtYmVyMSArIG51bWJlcjI7Ci0gICAgfQotfQotCi1jbGFzcyBXU0RMR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRzIFdzZGxHZW5lcmF0b3IgewotCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZjsKLQotICAgIHB1YmxpYyBXU0RMR2VuZXJhdG9ySW1wbChEZWZpbml0aW9uIGRlZikgewotICAgICAgICB0aGlzLmRlZiA9IGRlZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV3NkbENvbXBvc2l0ZSBnZW5lcmF0ZVdzZGwoU3RyaW5nIGltcGxDbGFzcywgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MpCi0gICAgICAgICAgICB0aHJvd3MgV2ViU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIE5lZWQgV1NETCBnZW5lcmF0aW9uIGNvZGUKLSAgICAgICAgV3NkbENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgV3NkbENvbXBvc2l0ZSgpOwotICAgICAgICBjb21wb3NpdGUuc2V0V3NkbEZpbGVOYW1lKGltcGxDbGFzcyk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPiB0ZXN0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEZWZpbml0aW9uPigpOwotICAgICAgICB0ZXN0TWFwLnB1dChjb21wb3NpdGUuZ2V0V3NkbEZpbGVOYW1lKCksIGRlZik7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRXc2RsRGVmaW5pdGlvbih0ZXN0TWFwKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1JlbGVhc2VBeGlzUmVzb3VyY2VzVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9SZWxlYXNlQXhpc1Jlc291cmNlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjQzOGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1JlbGVhc2VBeGlzUmVzb3VyY2VzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqICAgICAgDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUFubm90Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuRGVzY3JpcHRpb25GYWN0b3J5SW1wbDsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBUZXN0IHRoYXQgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBzZXQgaW4gYXhpczIueG1sLCB0aGUgQXhpc1NlcnZpY2UNCi0gKiByZXNvdXJjZXMgYXJlIHJlbGVhc2VkIGFmdGVyIHRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuICBUaGUgY29uZmlndWF0aW9uDQotICogdmFsdWUgaW4gYXhpczIueG1sIGlzOg0KLSAqICAgICA8cGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlDYWNoZSI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAqIA0KLSAqIE5PVEU6IHRoZSB0ZXN0cyBjdXJyZW50bHkgdXNlIHRoZSBheGlzMi54bWwgZnJvbSBtb2R1bGVzL2tlcm5lbC9jb25mIChzZWUNCi0gKiBidWlsZC54bWwpLiAgVGhlcmUgaXMgYW4gYXhpczIueG1sIGluIHRoZSB0ZXN0LXJlc291cmNlIGRpcmVjdG9yeSB3aGljaA0KLSAqIGVuYWJsZXMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0eS4gIFRoaXMgYXhpczIueG1sIGlzIHVzZWQgYnkgZXhwbGljaXRseSBjcmVhdGluZyBhDQotICogY29uZmlndXJhdGlvbiBjb250ZXh0IHRvIHBvaW50IHRvIGl0Lg0KLSAqIA0KLSAqIEFMU08gTk9URTogVGhlIGRlZmF1bHQgYmVoYXZpb3Igc2hvdWxkIGJlIE9GRiEgIFdoZW4gdGhlIHJlc291cmNlcyBhcmUgY2xlYW5lZCBmcm9tDQotICogdGhlIEF4aXNTZXJ2aWNlLCA/eHNkIHdpbGwgbm90IHdvcmsuDQotICogDQotICogVGhpcyB0ZXN0IGlzIGJhc2VkIGhlYXZpbHkgb24gbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vREJDd2l0aFJlZHVjZVdTRExNZW1vcnlQYXJtc1Rlc3RzLmphdmENCi0gKi8NCi1wdWJsaWMgY2xhc3MgUmVsZWFzZUF4aXNSZXNvdXJjZXNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhc2VkaXI7DQotICAgIA0KLSAgICBzdGF0aWMgew0KLSAgICAgICAgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpOw0KLSAgICAgICAgaWYgKGJhc2VkaXIgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGJhc2VkaXIgPSBuZXcgRmlsZSgiLiIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoYXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gTk9UIGNsZW51cCBBeGlzU2VydmljZSByZXNvdXJjZXMuICBUaGUgYXhpczIueG1sDQotICAgICAqIGZpbGUgdXNlZCB3aWxsIGJlIHRoZSBkZWZhdWx0IG9uZSwgaW4gdGFyZ2V0L3JlcG9zaXRvcnkvY29uZi4gIFRoZSBwcm9wZXJ5IHNob3VsZCBub3QNCi0gICAgICogYmUgc2V0IGluIHRoYXQgZmlsZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJTaWRlUmVsZWFzZV9EZWZhdWx0X09GRigpIHsNCi0NCi0gICAgICAgIC8vIFNpbmNlIHdlIGFyZW4ndCBleHBsaWNsdHkgY3JlYXRpbmcgYSBDb25maWd1cmF0aW9uQ29udGV4dCB1c2luZyBhIGRpZmZlcmV0biBheGlzMi54bWwsDQotICAgICAgICAvLyB0aGUgZmlsZSB0YXJnZXQvcmVwb3NpdG9yeS9jb25mL2F4aXMyLnhtbCB3aWxsIGJlIHVzZWQuICBUaGlzIG9uZQ0KLSAgICAgICAgLy8gd2lsbCBub3QgaGF2ZSB0aGUgcHJvcGVydHkgc2V0IHdoaWNoIGNhdXNlcyBBeGlzU2VydmljZSByZXNvdXJjZXMgdG8gYmUgY2xlYW5lZCB1cC4NCi0gICAgICAgIA0KLSAgICAgICAgU3RyaW5nIHdzZGxSZWxhdGl2ZUxvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvIjsNCi0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiQmluZGluZ05hbWVzcGFjZS53c2RsIjsNCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL25vbmFub255bW91cy5jb21wbGV4dHlwZS50ZXN0Lm9yZyI7DQotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7DQotDQotICAgICAgICAvLyBCdWlsZCB1cCBhIERCQywgaW5jbHVkaW5nIHRoZSBXU0RMIERlZmluaXRpb24gYW5kIHRoZSBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIGZvciANCi0gICAgICAgIC8vIHRoZSBpbXBsIGNsYXNzLg0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoLypjb25maWdDb250ZXh0Ki8pOw0KLQ0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7DQotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHdzZGxEZWZuKTsNCi0NCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFNlcnZpY2VOYW1lKCJFY2hvTWVzc2FnZVNlcnZpY2UiKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRQb3J0TmFtZSgiRWNob01lc3NhZ2VQb3J0Iik7DQotDQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJlY2hvTWVzc2FnZSIpOw0KLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzEgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsNCi0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOw0KLQ0KLSAgICAgICAgbWRjLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKHBkYzEpOw0KLQ0KLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7DQotICAgICAgICBkYmMuc2V0V2ViU2VydmljZUFubm90KHdlYlNlcnZpY2VBbm5vdCk7DQotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKEJpbmRpbmdOU0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOw0KLQ0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0NCi0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7DQotICAgICAgICBkYmNNYXAucHV0KGRiYy5nZXRDbGFzc05hbWUoKSwgZGJjKTsNCi0NCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPQ0KLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAgLyosIGNvbmZpZ0NvbnRleHQqLyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZURlc2NMaXN0LnNpemUoKSk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSAoU2VydmljZURlc2NyaXB0aW9uKSBzZXJ2aWNlRGVzY0xpc3QuZ2V0KDApOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzYyk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVuZHBvaW50RGVzYyA9IHNlcnZpY2VEZXNjLmdldEVuZHBvaW50RGVzY3JpcHRpb25zKClbMF07DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7DQotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVuZHBvaW50RGVzYy5nZXRBeGlzU2VydmljZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZSk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpKTsNCi0gICAgICAgIGFzc2VydFRydWUoYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCkuc2l6ZSgpID4gMCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0cyB0aGF0IHdoZW4gdGhlIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZXRzIHRoZSAnUmVkdWNlIFdTREwgQ2FjaGUnIHByb3BlcnR5DQotICAgICAqIHRvIGZhbHNlIHRoYXQgdGhlIEF4aXMgcmVzb3VyY2VzIGFyZSBub3QgY2xlYW5lZCB1cC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJTaWRlUmVsZWFzZV9FeHBsaWNpdF9PRkYoKSB7DQotDQotICAgICAgICANCi0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7DQotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIkJpbmRpbmdOYW1lc3BhY2Uud3NkbCI7DQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciOw0KLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOw0KLQ0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgDQotICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBkYmMuZ2V0UHJvcGVydGllcygpLnB1dChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5SRURVQ0VfV1NETF9NRU1PUllfQ0FDSEUsIGZhbHNlKTsNCi0NCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOw0KLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7DQotDQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRTZXJ2aWNlTmFtZSgiRWNob01lc3NhZ2VTZXJ2aWNlIik7DQotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0UG9ydE5hbWUoIkVjaG9NZXNzYWdlUG9ydCIpOw0KLQ0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7DQotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiZWNob01lc3NhZ2UiKTsNCi0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7DQotDQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7DQotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsNCi0NCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOw0KLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgZGJjLnNldENsYXNzTmFtZShCaW5kaW5nTlNJbXBsLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBkYmMuc2V0d3NkbFVSTCh3c2RsVVJMKTsNCi0NCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9DQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOw0KLSAgICAgICAgZGJjTWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIGRiYyk7DQotDQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0NCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwIC8qLCBjb25maWdDb250ZXh0Ki8pOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjID0gKFNlcnZpY2VEZXNjcmlwdGlvbikgc2VydmljZURlc2NMaXN0LmdldCgwKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpWzBdOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlbmRwb2ludERlc2MpOw0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlbmRwb2ludERlc2MuZ2V0QXhpc1NlcnZpY2UoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UpOw0KLQ0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChheGlzU2VydmljZS5nZXRTY2hlbWEoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKGF4aXNTZXJ2aWNlLmdldFNjaGVtYSgpLnNpemUoKSA+IDApOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmVyU2lkZVJlbGVhc2UoKSB7DQotICAgICAgICBTdHJpbmcgYXhpczJ4bWwgPSBiYXNlZGlyICsgIi90ZXN0LXJlc291cmNlcy9heGlzMi54bWwiOw0KLSAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQgPQ0KLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMyeG1sKTsNCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7DQotICAgICAgICAgICAgZmFpbCgiR290IGZhdWx0IHRyeWluZyB0byBjcmVhdGUgY29uZmlnIGNvbnRleHQiICsgZSk7DQotICAgICAgICB9DQotICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZ0NvbnRleHQpOw0KLSAgICAgICAgU3RyaW5nIHBhcmFtID0NCi0gICAgICAgICAgICAgICAgKFN0cmluZykgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyVmFsdWUoInJlZHVjZVdTRExNZW1vcnlDYWNoZSIpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJhbSk7DQotDQotICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOw0KLSAgICAgICAgU3RyaW5nIHdzZGxGaWxlTmFtZSA9ICJCaW5kaW5nTmFtZXNwYWNlLndzZGwiOw0KLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIjsNCi0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUmVsYXRpdmVMb2NhdGlvbiArIHdzZGxGaWxlTmFtZTsNCi0NCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIA0KLSAgICAgICAgLy8gdGhlIGltcGwgY2xhc3MuDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZShjb25maWdDb250ZXh0KTsNCi0NCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOw0KLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7DQotDQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRTZXJ2aWNlTmFtZSgiRWNob01lc3NhZ2VTZXJ2aWNlIik7DQotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0UG9ydE5hbWUoIkVjaG9NZXNzYWdlUG9ydCIpOw0KLQ0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7DQotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiZWNob01lc3NhZ2UiKTsNCi0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7DQotDQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7DQotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsNCi0NCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOw0KLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgZGJjLnNldENsYXNzTmFtZShCaW5kaW5nTlNJbXBsLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBkYmMuc2V0d3NkbFVSTCh3c2RsVVJMKTsNCi0NCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9DQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOw0KLSAgICAgICAgZGJjTWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIGRiYyk7DQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0NCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwLCBjb25maWdDb250ZXh0KTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IChTZXJ2aWNlRGVzY3JpcHRpb24pIHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShheGlzU2VydmljZS5nZXRTY2hlbWEoKS5zaXplKCkgPT0gMCk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUaGlzIHRlc3RzIHRoYXQgd2hlbiB0aGUgJ1JlZHVjZSBXU0RMIGNhY2hlJyBwcm9wZXJ0eSBpcyBzZXQgb24gdGhlIERCQyB0aGF0DQotICAgICAqIHRoZSBBeGlzIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJTaWRlUmVsZWFzZURCQygpIHsNCi0NCi0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7DQotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIkJpbmRpbmdOYW1lc3BhY2Uud3NkbCI7DQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9ub25hbm9ueW1vdXMuY29tcGxleHR5cGUudGVzdC5vcmciOw0KLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOw0KLQ0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgDQotICAgICAgICAvLyB0aGUgaW1wbCBjbGFzcy4NCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICANCi0gICAgICAgIC8vIHNob3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgcGFyYW1ldGVyIHNldCB0byAndHJ1ZScgaW4gdGhlIGF4aXMyLnhtbA0KLSAgICAgICAgZGJjLmdldFByb3BlcnRpZXMoKS5wdXQoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uUkVEVUNFX1dTRExfTUVNT1JZX0NBQ0hFLCB0cnVlKTsNCi0NCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOw0KLSAgICAgICAgRGVmaW5pdGlvbiB3c2RsRGVmbiA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmNyZWF0ZVdTRExEZWZpbml0aW9uKHdzZGxVUkwpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7DQotDQotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgd2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRUYXJnZXROYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsNCi0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRTZXJ2aWNlTmFtZSgiRWNob01lc3NhZ2VTZXJ2aWNlIik7DQotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0UG9ydE5hbWUoIkVjaG9NZXNzYWdlUG9ydCIpOw0KLQ0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7DQotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZSgiZWNob01lc3NhZ2UiKTsNCi0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuU3RyaW5nIik7DQotDQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7DQotICAgICAgICBwZGMxLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsNCi0NCi0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMxKTsNCi0NCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOw0KLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOw0KLSAgICAgICAgZGJjLnNldENsYXNzTmFtZShCaW5kaW5nTlNJbXBsLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICBkYmMuc2V0d3NkbFVSTCh3c2RsVVJMKTsNCi0NCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9DQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOw0KLSAgICAgICAgZGJjTWFwLnB1dChkYmMuZ2V0Q2xhc3NOYW1lKCksIGRiYyk7DQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0NCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlRGVzY0xpc3Quc2l6ZSgpKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzYyA9IChTZXJ2aWNlRGVzY3JpcHRpb24pIHNlcnZpY2VEZXNjTGlzdC5nZXQoMCk7DQotDQotICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2VEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZW5kcG9pbnREZXNjID0gc2VydmljZURlc2MuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbnMoKVswXTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZW5kcG9pbnREZXNjKTsNCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZW5kcG9pbnREZXNjLmdldEF4aXNTZXJ2aWNlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsNCi0NCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc1NlcnZpY2UuZ2V0U2NoZW1hKCkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShheGlzU2VydmljZS5nZXRTY2hlbWEoKS5zaXplKCkgPT0gMCk7DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIkVjaG9NZXNzYWdlU2VydmljZSIsIHBvcnROYW1lID0gIkVjaG9NZXNzYWdlUG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbm9uYW5vbnltb3VzLmNvbXBsZXh0eXBlLnRlc3Qub3JnIiwgd3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvQmluZGluZ05hbWVzcGFjZS53c2RsIikNCi0gICAgcHVibGljIGNsYXNzIEJpbmRpbmdOU0ltcGwgew0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvTWVzc2FnZShTdHJpbmcgYXJnKSB7DQotICAgICAgICAgICAgcmV0dXJuIGFyZzsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZUFubm90YXRpb25UZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1NlcnZpY2VBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2ODc4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vU2VydmljZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIE5vdGUgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbmNyZWFzZSB0aGUgamF2YSBoZWFwIHNpemUsIGZvciBleGFtcGxlCi0gICAgICAgIC8vIC1YbXg1MTJtLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIG1hdmVuLmp1bml0Lmp2bWFyZ3MgaW4gcHJvamVjdC5wcm9wZXJ0aWVzLgotICAgICAgICAvLyBUbyBjaGFuZ2UgdGhlIHNldHRpbmdzLCBlZGl0IHRoZSBsb2c0ai5wcm9wZXJ0eSBmaWxlCi0gICAgICAgIC8vIGluIHRoZSB0ZXN0LXJlc291cmNlcyBkaXJlY3RvcnkuCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlRGVmYXVsdHMoKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiV2ViU2VydmljZURlZmF1bHRUZXN0IjsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IGdldEVuZHBvaW50RGVzYyhXZWJTZXJ2aWNlRGVmYXVsdFRlc3QuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjbGFzc05hbWUgKyAiU2VydmljZSIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSArICJQb3J0IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VXU0RMTG9jYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VQcm92aWRlckRlZmF1bHRzKCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIldlYlNlcnZpY2VQcm92aWRlckRlZmF1bHRUZXN0IjsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9Ci0gICAgICAgICAgICAgICAgZ2V0RW5kcG9pbnREZXNjKFdlYlNlcnZpY2VQcm92aWRlckRlZmF1bHRUZXN0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0TnVsbCh0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpKTsKLSAgICAgICAgLy8gbmFtZSBlbGVtZW50IG5vdCBhbGxvd2VkIG9uIFdlYlNlcnZpY2VQcm92aWRlcgotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkpOwotICAgICAgICAvLyBFbmRwb2ludEludGVyZmFjZSBlbGVtZW50IG5vdCBhbGxvd2VkIG9uIFdlYlNlcnZpY2VQcm92aWRlcgotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSArICJTZXJ2aWNlIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lICsgIlBvcnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiV2ViU2VydmljZU5hbWUiOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uSmF2YSB0ZXN0RW5kcG9pbnREZXNjID0gZ2V0RW5kcG9pbnREZXNjKFdlYlNlcnZpY2VOYW1lLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlTmFtZUVsZW1lbnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBwZXIgSlNSLTE4MSBNUiBTZWMgNC4xIHBnIDE2LCB0aGUgcG9ydE5hbWUgdXNlcyBXZWJTZXJ2aWNlLm5hbWUsIGJ1dCBzZXJ2aWNlTmFtZSBkb2VzIG5vdCEKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSArICJTZXJ2aWNlIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VOYW1lRWxlbWVudFBvcnQiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZU5hbWVBbmRQb3J0KCkgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIldlYlNlcnZpY2VOYW1lQW5kUG9ydCI7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIHRlc3RFbmRwb2ludERlc2MgPSBnZXRFbmRwb2ludERlc2MoV2ViU2VydmljZU5hbWVBbmRQb3J0LmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlTmFtZUFuZFBvcnRFbGVtZW50IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9kZXNjcmlwdGlvbi5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAvLyBOb3RlIHRoYXQgcGVyIEpTUi0xODEgTVIgU2VjIDQuMSBwZyAxNiwgdGhlIHBvcnROYW1lIHVzZXMgV2ViU2VydmljZS5uYW1lLCBidXQgc2VydmljZU5hbWUgZG9lcyBub3QhCi0gICAgICAgIGFzc2VydEVxdWFscyhjbGFzc05hbWUgKyAiU2VydmljZSIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlUG9ydE5hbWUiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZUFsbCgpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJXZWJTZXJ2aWNlQWxsIjsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IGdldEVuZHBvaW50RGVzYyhXZWJTZXJ2aWNlQWxsLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlKCkpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VQcm92aWRlcigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlQWxsIiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5NeUVuZHBvaW50SW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbmFtZXNwYWNlLnRhcmdldC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VBbGxTZXJ2aWNlRWxlbWVudCIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlU2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZUFsbFBvcnRFbGVtZW50IiwgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVBvcnROYW1lKCkpOwotICAgICAgICAvLyBUT0RPOiBXaGVuIHRoZSBKYXZhUmVmbGVjdGlvbi10by1EQkMgY29udmVydGVyIGlzIGZpeGVkIHRvIHJlYWQgaW4gV1NETCwgdGhlbiBhZGQgdGhpcyBjaGVjayBiYWNrIGluLgotLy8gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL215LndzZGwubG9jYXRpb24vZm9vLndzZGwiLCB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlV1NETExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlUHJvdmlkZXJBbGwoKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAiV2ViU2VydmljZVByb3ZpZGVyQWxsIjsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkphdmEgdGVzdEVuZHBvaW50RGVzYyA9IGdldEVuZHBvaW50RGVzYyhXZWJTZXJ2aWNlUHJvdmlkZXJBbGwuY2xhc3MpOwotICAgICAgICBhc3NlcnROdWxsKHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2UoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVByb3ZpZGVyKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbmFtZXNwYWNlLnRhcmdldC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VQcm92aWRlckFsbFNlcnZpY2VFbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgIHRlc3RFbmRwb2ludERlc2MuZ2V0QW5ub1dlYlNlcnZpY2VTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlUHJvdmlkZXJBbGxQb3J0RWxlbWVudCIsCi0gICAgICAgICAgICAgICAgICAgICB0ZXN0RW5kcG9pbnREZXNjLmdldEFubm9XZWJTZXJ2aWNlUG9ydE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL215LndzZGwub3RoZXIubG9jYXRpb24vZm9vLndzZGwiLAotICAgICAgICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRBbm5vV2ViU2VydmljZVdTRExMb2NhdGlvbigpKTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgKiBNZXRob2QgdG8gcmV0dXJuIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4gaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgKi8KLSAgICBwcml2YXRlIEVuZHBvaW50RGVzY3JpcHRpb25KYXZhIGdldEVuZHBvaW50RGVzYyhDbGFzcyBpbXBsZW1lbnRhdGlvbkNsYXNzKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oaW1wbGVtZW50YXRpb25DbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmRwb2ludERlc2MubGVuZ3RoKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIHRlc3RFbmRwb2ludERlc2MgPSBlbmRwb2ludERlc2NbMF07Ci0gICAgICAgIHJldHVybiAoRW5kcG9pbnREZXNjcmlwdGlvbkphdmEpdGVzdEVuZHBvaW50RGVzYzsKLSAgICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBXZWJTZXJ2aWNlIERlZmF1bHRzIHRlc3QgaW1wbAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQFdlYlNlcnZpY2UoKQotY2xhc3MgV2ViU2VydmljZURlZmF1bHRUZXN0IHsKLQotfQotCi1AV2ViU2VydmljZVByb3ZpZGVyKCkKLWNsYXNzIFdlYlNlcnZpY2VQcm92aWRlckRlZmF1bHRUZXN0IGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7Ci0gICAgcHVibGljIFdlYlNlcnZpY2VQcm92aWRlckRlZmF1bHRUZXN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKFN0cmluZyBvYmopIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBXZWJTZXJ2aWNlIE5hbWUgdGVzdCBpbXBsCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTm90ZSB0aGF0IG5hbWUgaXMgb25seSBhbGxvd2VkIG9uIEBXZWJTZXJ2aWNlOyBub3QgQFdlYlNlcnZpY2VQcm92aWRlcgotCi1AV2ViU2VydmljZShuYW1lID0gIldlYlNlcnZpY2VOYW1lRWxlbWVudCIpCi1jbGFzcyBXZWJTZXJ2aWNlTmFtZSB7Ci0KLX0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJXZWJTZXJ2aWNlTmFtZUFuZFBvcnRFbGVtZW50IiwgcG9ydE5hbWUgPSAiV2ViU2VydmljZVBvcnROYW1lIikKLWNsYXNzIFdlYlNlcnZpY2VOYW1lQW5kUG9ydCB7Ci0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFdlYlNlcnZpY2UgQWxsIHRlc3QgaW1wbAotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFRPRE86IFdoZW4gdGhlIEphdmFSZWZsZWN0aW9uLXRvLURCQyBjb252ZXJ0ZXIgaXMgZml4ZWQgdG8gcmVhZCBpbiB0aGUgV1NETCwgdGhlbiBzcGVjaWZ5IGEgdmFsaWQgV1NETCBmaWxlIGhlcmUKLQotQFdlYlNlcnZpY2UoCi0gICAgICAgIGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uTXlFbmRwb2ludEludGVyZmFjZSIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbmFtZXNwYWNlLnRhcmdldC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgIHNlcnZpY2VOYW1lID0gIldlYlNlcnZpY2VBbGxTZXJ2aWNlRWxlbWVudCIsCi0gICAgICAgIHBvcnROYW1lID0gIldlYlNlcnZpY2VBbGxQb3J0RWxlbWVudCIgLyosCi0gICAgICAgIHdzZGxMb2NhdGlvbj0iaHR0cDovL215LndzZGwubG9jYXRpb24vZm9vLndzZGwiICovKQotY2xhc3MgV2ViU2VydmljZUFsbCB7Ci0KLX0KLQotQFdlYlNlcnZpY2UoKQotaW50ZXJmYWNlIE15RW5kcG9pbnRJbnRlcmZhY2UgewotCi19Ci0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vbmFtZXNwYWNlLnRhcmdldC5qYXh3cy5heGlzMi5hcGFjaGUub3JnLyIsCi0gICAgICAgIHNlcnZpY2VOYW1lID0gIldlYlNlcnZpY2VQcm92aWRlckFsbFNlcnZpY2VFbGVtZW50IiwKLSAgICAgICAgcG9ydE5hbWUgPSAiV2ViU2VydmljZVByb3ZpZGVyQWxsUG9ydEVsZW1lbnQiLAotICAgICAgICB3c2RsTG9jYXRpb24gPSAiaHR0cDovL215LndzZGwub3RoZXIubG9jYXRpb24vZm9vLndzZGwiKQotY2xhc3MgV2ViU2VydmljZVByb3ZpZGVyQWxsIGltcGxlbWVudHMgUHJvdmlkZXI8U3RyaW5nPiB7Ci0gICAgcHVibGljIFdlYlNlcnZpY2VQcm92aWRlckFsbCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGludm9rZShTdHJpbmcgb2JqKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1ZhbGlkYXRlU2VydmljZUltcGxUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1ZhbGlkYXRlU2VydmljZUltcGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGI3YTVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9WYWxpZGF0ZVNlcnZpY2VJbXBsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5KYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTZXJ2aWNlSW1wbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkU2VydmljZUltcGwoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzID0gU2VydmljZUltcGwuY2xhc3M7Ci0gICAgICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9ICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlRGVzY0xpc3QpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcnZpY2VEZXNjTGlzdC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ01ldGhvZHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzID0gTWlzc2luZ01ldGhvZHNJbXBsLmNsYXNzOwotICAgICAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPSAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdXNlZCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRocm93cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MgPSBJbnZhbGlkVGhyb3dzSW1wbC5jbGFzczsKLSAgICAgICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0gIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVzZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc21hdGNoZWRSZXR1cm5UeXBlc0RCQygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MgPSBTZXJ2aWNlSW1wbC5jbGFzczsKLSAgICAgICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihzZXJ2aWNlSW1wbENsYXNzKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiB0eXBlcyBmb3Igb25lIG9mIHRoZSBtZXRob2RzIG9uIHRoZSBpbXBsIGNsYXNzIHRvIG1pc21hdGNoIHRoZSBTRUkKLSAgICAgICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBpbXBsREJDID0gZGJjTWFwLmdldCgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlSW1wbCIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbXBsREJDKTsKLSAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG0xTURDTGlzdCA9IGltcGxEQkMuZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoIm1ldGhvZDEiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobTFNRENMaXN0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtMU1EQ0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG0xTURDID0gbTFNRENMaXN0LmdldCgwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG0xTURDLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICBtMU1EQy5zZXRSZXR1cm5UeXBlKCJsYXZhLmxhbmcuSW50ZWdlciIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0gIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVzZWQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzbWF0Y2hlZFJldHVyblR5cGVzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUltcGxDbGFzcyA9IE1pc21hdGNoZWRSZXR1cm5UeXBlc0ltcGwuY2xhc3M7Ci0gICAgICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9ICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1c2VkIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc21hdGNoZWRQYXJhbWV0ZXJOdW1iZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBzZXJ2aWNlSW1wbENsYXNzID0gTWlzbWF0Y2hlZFBhcmFtZXRlck51bWJlckltcGwuY2xhc3M7Ci0gICAgICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoc2VydmljZUltcGxDbGFzcyk7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNlcnZpY2VEZXNjTGlzdCA9ICBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXApOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgY2F1c2VkIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pc21hdGNoZWRQYXJhbWV0ZXJUeXBlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIHNlcnZpY2VJbXBsQ2xhc3MgPSBNaXNtYXRjaGVkUGFyYW1ldGVyVHlwZXNJbXBsLmNsYXNzOwotICAgICAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKHNlcnZpY2VJbXBsQ2xhc3MpOwotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZXJ2aWNlRGVzY0xpc3QgPSAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdXNlZCBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgIH0KLQotfQotCi1AV2ViU2VydmljZQotaW50ZXJmYWNlIEVuZHBvaW50SW50ZXJmYWNlIHsKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoaW50IHBhcmFtMSwgaW50IHBhcmFtMikgdGhyb3dzIE15RXhjZXB0aW9uOwotICAgIAotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgdGhyb3dzIE15RXhjZXB0aW9uOwotICAgIAotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpOwotfQotCi1jbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi19Ci0KLUBXZWJTZXJ2aWNlIChlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50SW50ZXJmYWNlIikKLWNsYXNzIFNlcnZpY2VJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoaW50IHBhcmFtMSwgaW50IHBhcmFtMikgdGhyb3dzIE15RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8vIEludGVudGlvbmFsbHkgZG9lc24ndCB0aHJvdyBNeUV4Y2VwdGlvbi4gIEl0IGlzIHZhbGlkIGZvciBhIHNlcnZpY2UgaW1wbCB0byB0aHJvdwotICAgIC8vIGZld2VyIGV4Y2VwdGlvbnMgdGhhbiB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMihTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IG1ldGhvZDMoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2UgKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2UiKQotY2xhc3MgTWlzc2luZ01ldGhvZHNJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoaW50IHBhcmFtMSwgaW50IHBhcmFtMikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0vLyAgICBwdWJsaWMgdm9pZCBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHsKLS8vICAgICAgICAKLS8vICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IG1ldGhvZDMoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2UgKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2UiKQotY2xhc3MgSW52YWxpZFRocm93c0ltcGwgewotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShpbnQgcGFyYW0xLCBpbnQgcGFyYW0yKSB0aHJvd3MgTXlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLy8gSW50ZW50aW9uYWxseSBkb2Vzbid0IHRocm93IE15RXhjZXB0aW9uLiAgSXQgaXMgdmFsaWQgZm9yIGEgc2VydmljZSBpbXBsIHRvIHRocm93Ci0gICAgLy8gZmV3ZXIgZXhjZXB0aW9ucyB0aGFuIHRoZSBlbmRwb2ludCBpbnRlcmZhY2UKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgCi0gICAgfQotICAgIC8vIEl0IGlzIGludmFsaWQgdG8gdGhyb3cgbW9yZSBleGNlcHRpb25zIHRoYW4gdGhlIGVuZHBvaW50IGludGVyZmFjZQotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpIHRocm93cyBNeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotQFdlYlNlcnZpY2UgKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnRJbnRlcmZhY2UiKQotY2xhc3MgTWlzbWF0Y2hlZFJldHVyblR5cGVzSW1wbCB7Ci0gICAgLy8gUmV0dXJuIHR5cGUgZG9lc24ndCBtYXRjaCBTRUkKLSAgICBwdWJsaWMgSW50ZWdlciBtZXRob2QxKGludCBwYXJhbTEsIGludCBwYXJhbTIpIHRocm93cyBNeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSAoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZSIpCi1jbGFzcyBNaXNtYXRjaGVkUGFyYW1ldGVyTnVtYmVySW1wbCB7Ci0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKGludCBwYXJhbTEpIHRocm93cyBNeUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgbWV0aG9kMygpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSAoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludEludGVyZmFjZSIpCi1jbGFzcyBNaXNtYXRjaGVkUGFyYW1ldGVyVHlwZXNJbXBsIHsKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoaW50IHBhcmFtMSwgU3RyaW5nIHBhcmFtMikgdGhyb3dzIE15RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8vIEludGVudGlvbmFsbHkgZG9lc24ndCB0aHJvdyBNeUV4Y2VwdGlvbi4gIEl0IGlzIHZhbGlkIGZvciBhIHNlcnZpY2UgaW1wbCB0byB0aHJvdwotICAgIC8vIGZld2VyIGV4Y2VwdGlvbnMgdGhhbiB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMihTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IG1ldGhvZDMoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9WYWxpZGF0ZVdTRExUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1ZhbGlkYXRlV1NETFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzY5NjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1ZhbGlkYXRlV1NETFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5QYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUFubm90OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqIFRlc3RzIHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgV1NETCBmb3IgaW52YWxpZCBjb25maWd1cmF0aW9ucyAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgLyoqIFRoZSBTRUkgdXNlZCBieSB0aGUgc2VydmljZSBpbXBsIGRvZXMgbm90IGNvbnRhaW4gYWxsIHRoZSBtZXRob2RzIGRlZmluZWQgb24gdGhlIFBvcnRUeXBlICovCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUG9ydFR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsUmVsYXRpdmVMb2NhdGlvbiA9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0ZXN0LXJlc291cmNlcy93c2RsLyI7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSAiVmFsaWRhdGVXU0RMMS53c2RsIjsKLQotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9zZXJ2ZXJQYXJ0aWFsMS5jaGVja2V4Y2VwdGlvbi53ZWJmYXVsdC5hbm5vdGF0aW9ucy8iOwotICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbFJlbGF0aXZlTG9jYXRpb24gKyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAgICAgLy8gQnVpbGQgdXAgYSBEQkMsIGluY2x1ZGluZyB0aGUgV1NETCBEZWZpbml0aW9uIGFuZCB0aGUgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGltcGwgY2xhc3MuCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0KLSAgICAgICAgVVJMIHdzZGxVUkwgPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMVVJMKHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgIERlZmluaXRpb24gd3NkbERlZm4gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5jcmVhdGVXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c2RsRGVmbik7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJhZGRUd29OdW1iZXJzIik7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJpbnQiKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiaW50Iik7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzIgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7Ci0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMyKTsKLQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKFZhbGlkYXRlV1NETEltcGwxLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmbik7Ci0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY01hcC5wdXQoVmFsaWRhdGVXU0RMSW1wbDEuY2xhc3MuZ2V0TmFtZSgpLCBkYmMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZmVyZW5jZSBhIFBvcnQgKHdoaWNoIGRvZXMgbm90IGV4aXN0KSB1bmRlciBhIFNlcnZpY2UgdGhhdCBkb2VzLiAgVGhpcyBpcyBub3QgYSB2YWxpZAotICAgICAqIHBhcnRpYWwgV1NETCBjYXNlIGFuZCBzbyBpcyBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVQb3J0KCkgewotICAgICAgICBTdHJpbmcgd3NkbFJlbGF0aXZlTG9jYXRpb24gPSAidGVzdC1yZXNvdXJjZXMvd3NkbC8iOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gIlZhbGlkYXRlV1NETDEud3NkbCI7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIjsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IHdzZGxSZWxhdGl2ZUxvY2F0aW9uICsgd3NkbEZpbGVOYW1lOwotCi0gICAgICAgIC8vIEJ1aWxkIHVwIGEgREJDLCBpbmNsdWRpbmcgdGhlIFdTREwgRGVmaW5pdGlvbiBhbmQgdGhlIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBpbXBsIGNsYXNzLgotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotCi0gICAgICAgIFVSTCB3c2RsVVJMID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0V1NETFVSTCh3c2RsRmlsZU5hbWUpOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZuID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuY3JlYXRlV1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3NkbERlZm4pOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2VBbm5vdCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0U2VydmljZU5hbWUoIlZhbGlkYXRlV1NETEltcGwxU2VydmljZUludmFsaWRQb3J0Iik7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRNZXRob2ROYW1lKCJhZGRUd29OdW1iZXJzIik7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJpbnQiKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYzEuc2V0UGFyYW1ldGVyVHlwZSgiaW50Iik7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYzIgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjMS5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLQotICAgICAgICBtZGMuYWRkUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUocGRjMSk7Ci0gICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMyKTsKLQotICAgICAgICBkYmMuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUobWRjKTsKLSAgICAgICAgZGJjLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBkYmMuc2V0Q2xhc3NOYW1lKFZhbGlkYXRlV1NETEltcGwyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGRiYy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmbik7Ci0gICAgICAgIGRiYy5zZXR3c2RsVVJMKHdzZGxVUkwpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY01hcC5wdXQoVmFsaWRhdGVXU0RMSW1wbDEuY2xhc3MuZ2V0TmFtZSgpLCBkYmMpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2VydmljZURlc2NMaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAoZGJjTWFwKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBjb2RlIHBhdGgKLSAgICAgICAgfQotICAgIH0KLX0KLQotQFdlYlNlcnZpY2Uod3NkbExvY2F0aW9uID0gInRlc3QtcmVzb3VyY2VzL3dzZGwvVmFsaWRhdGVXU0RMMi53c2RsIiwKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vc2VydmVyUGFydGlhbDEuY2hlY2tleGNlcHRpb24ud2ViZmF1bHQuYW5ub3RhdGlvbnMvIikKLWNsYXNzIFZhbGlkYXRlV1NETEltcGwxIHsKLSAgICBwdWJsaWMgaW50IGFkZFR3b051bWJlcnMoaW50IG51bWJlcjEsIGludCBudW1iZXIyKSB7Ci0gICAgICAgIHJldHVybiBudW1iZXIxICsgbnVtYmVyMjsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIlZhbGlkYXRlV1NETEltcGwxU2VydmljZUludmFsaWRQb3J0IiwKLSAgICAgICAgICAgIHdzZGxMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsL1ZhbGlkYXRlV1NETDIud3NkbCIsCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3NlcnZlclBhcnRpYWwxLmNoZWNrZXhjZXB0aW9uLndlYmZhdWx0LmFubm90YXRpb25zLyIpCi1jbGFzcyBWYWxpZGF0ZVdTRExJbXBsMiB7Ci0gICAgcHVibGljIGludCBhZGRUd29OdW1iZXJzKGludCBudW1iZXIxLCBpbnQgbnVtYmVyMikgewotICAgICAgICByZXR1cm4gbnVtYmVyMSArIG51bWJlcjI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dyYXBwZXJQYWNrYWdlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9XcmFwcGVyUGFja2FnZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MTY0ZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL1dyYXBwZXJQYWNrYWdlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsKLQotLyoqIFRlc3RzIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSB3cmFwcGVycy4gKi8KLXB1YmxpYyBjbGFzcyBXcmFwcGVyUGFja2FnZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIE5vdGUgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbmNyZWFzZSB0aGUgamF2YSBoZWFwIHNpemUsIGZvciBleGFtcGxlCi0gICAgICAgIC8vIC1YbXg1MTJtLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIG1hdmVuLmp1bml0Lmp2bWFyZ3MgaW4gcHJvamVjdC5wcm9wZXJ0aWVzLgotICAgICAgICAvLyBUbyBjaGFuZ2UgdGhlIHNldHRpbmdzLCBlZGl0IHRoZSBsb2c0ai5wcm9wZXJ0eSBmaWxlCi0gICAgICAgIC8vIGluIHRoZSB0ZXN0LXJlc291cmNlcyBkaXJlY3RvcnkuCi0gICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTRUlQYWNrYWdlV3JhcHBlcigpIHsKLSAgICAgICAgRW5kcG9pbnRJbnRlcmZhY2VEZXNjcmlwdGlvbiBlaURlc2MgPSBnZXRFbmRwb2ludEludGVyZmFjZURlc2MoU0VJUGFja2FnZVdyYXBwZXIuY2xhc3MpOwotICAgICAgICAKLSAgICAgICAgLy8gU2VlIGlmIHRoZSBuYW1lIGlzIGNvcnJlY3QuLmN1cnJlbnRseSB3ZSBjYW5ub3QgZG8gdGhpcyBkaXJlY3RseSwgc28gSSBhbSB1c2luZwotICAgICAgICAvLyB0aGUgZGVidWcgZHVtcC4KLSAgICAgICAgU3RyaW5nIGR1bXAgPSBlaURlc2MudG9TdHJpbmcoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkdW1wLmNvbnRhaW5zKCJOYW1lOiBTRUlQYWNrYWdlV3JhcHBlciIpKTsKLSAgICAgICAgCi0gICAgICAgIE9wZXJhdGlvbkRlc2NyaXB0aW9uIG9wRGVzYyA9IGVpRGVzYy5nZXRPcGVyYXRpb24oIm1ldGhvZDEiKTsKLSAgICAgICAgU3RyaW5nIHJlcXVlc3RXcmFwcGVyQ2xhc3MgPSBvcERlc2MuZ2V0UmVxdWVzdFdyYXBwZXJDbGFzc05hbWUoKTsKLQotICAgICAgICAvLyBUaGUgYWxnb3JpdGhtIHRvIGZpbmQgdGhlIHJlc3BvbnNlIHdyYXBwZXIgaXMgbm90IGRlZmluZWQgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0gICAgICAgIC8vIFRoZSBtYXJzaGFsbGluZyBsYXllciAoamF4d3MpIGNhbiB1c2UgcHJvcHJpZXRhcnkgbWVjaGFuaXNtcyB0byBmaW5kLCBidWlsZCBvciBvcGVyYXRlCi0gICAgICAgIC8vIHdpdGhvdXQgdGhlIHdyYXBwZXIgY2xhc3MuCi0KLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uTWV0aG9kMSIsIHJlcXVlc3RXcmFwcGVyQ2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcmVxdWVzdFdyYXBwZXJDbGFzcyk7Ci0KLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlV3JhcHBlckNsYXNzID0gb3BEZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpOwotICAgICAgICAvL2Fzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5NZXRob2QxUmVzcG9uc2UiLCByZXNwb25zZVdyYXBwZXJDbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXNwb25zZVdyYXBwZXJDbGFzcyk7Ci0KLSAgICAgICAgRmF1bHREZXNjcmlwdGlvbiBmRGVzYyA9IG9wRGVzYy5nZXRGYXVsdERlc2NyaXB0aW9ucygpWzBdOwotICAgICAgICBTdHJpbmcgZmF1bHRFeGNlcHRpb25DbGFzcyA9IGZEZXNjLmdldEV4Y2VwdGlvbkNsYXNzTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uTWV0aG9kMUV4Y2VwdGlvbiIsIGZhdWx0RXhjZXB0aW9uQ2xhc3MpOwotICAgICAgICBTdHJpbmcgZmF1bHRCZWFuQ2xhc3MgPSBmRGVzYy5nZXRGYXVsdEJlYW4oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkV4Y2VwdGlvbkJlYW4iLCBmYXVsdEJlYW5DbGFzcyk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U0VJU3ViUGFja2FnZVdyYXBwZXIoKSB7Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gZWlEZXNjID0gZ2V0RW5kcG9pbnRJbnRlcmZhY2VEZXNjKFNFSVN1YlBhY2thZ2VXcmFwcGVyLmNsYXNzKTsKLSAgICAgICAgT3BlcmF0aW9uRGVzY3JpcHRpb24gb3BEZXNjID0gZWlEZXNjLmdldE9wZXJhdGlvbigic3ViUGFja2FnZU1ldGhvZDEiKTsKLSAgICAgICAgLy8gVGhlIGFsZ29yaXRobSB0byBmaW5kIHRoZSByZXNwb25zZSB3cmFwcGVyIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLgotICAgICAgICAvLyBUaGUgbWFyc2hhbGxpbmcgbGF5ZXIgKGpheHdzKSBjYW4gdXNlIHByb3ByaWV0YXJ5IG1lY2hhbmlzbXMgdG8gZmluZCwgYnVpbGQgb3Igb3BlcmF0ZQotICAgICAgICAvLyB3aXRob3V0IHRoZSB3cmFwcGVyIGNsYXNzLgotCi0gICAgICAgIFN0cmluZyByZXF1ZXN0V3JhcHBlckNsYXNzID0gb3BEZXNjLmdldFJlcXVlc3RXcmFwcGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmpheHdzLlN1YlBhY2thZ2VNZXRob2QxIiwgcmVxdWVzdFdyYXBwZXJDbGFzcyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXF1ZXN0V3JhcHBlckNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlV3JhcHBlckNsYXNzID0gb3BEZXNjLmdldFJlc3BvbnNlV3JhcHBlckNsYXNzTmFtZSgpOwotICAgICAgICAvL2Fzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5qYXh3cy5TdWJQYWNrYWdlTWV0aG9kMVJlc3BvbnNlIiwgcmVzcG9uc2VXcmFwcGVyQ2xhc3MpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcmVzcG9uc2VXcmFwcGVyQ2xhc3MpOwotICAgICAgICBGYXVsdERlc2NyaXB0aW9uIGZEZXNjID0gb3BEZXNjLmdldEZhdWx0RGVzY3JpcHRpb25zKClbMF07Ci0gICAgICAgIFN0cmluZyBmYXVsdEV4Y2VwdGlvbkNsYXNzID0gZkRlc2MuZ2V0RXhjZXB0aW9uQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TdWJQYWNrYWdlRXhjZXB0aW9uIiwgZmF1bHRFeGNlcHRpb25DbGFzcyk7Ci0gICAgICAgIFN0cmluZyBmYXVsdEJlYW5DbGFzcyA9IGZEZXNjLmdldEZhdWx0QmVhbigpOwotICAgICAgICAvLyBEdWUgdG8gdGhlIG1pc3NpbmcgZ2V0RmF1bHRJbmZvLCB0aGUgcnVudGltZSBtdXN0IGZpbmQgb3IgYnVpbGQgYSBmYXVsdCBiZWFuLgotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGZhdWx0QmVhbkNsYXNzKTsKLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uamF4d3MuU3ViUGFja2FnZUV4Y2VwdGlvbkJlYW4iLCBmYXVsdEJlYW5DbGFzcyk7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICogTWV0aG9kIHRvIHJldHVybiB0aGUgZW5kcG9pbnQgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIGZvciBhIGdpdmVuIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgICovCi0gICAgcHJpdmF0ZSBFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uIGdldEVuZHBvaW50SW50ZXJmYWNlRGVzYyhDbGFzcyBpbXBsZW1lbnRhdGlvbkNsYXNzKSB7Ci0gICAgICAgIC8vIFVzZSB0aGUgZGVzY3JpcHRpb24gZmFjdG9yeSBkaXJlY3RseTsgdGhpcyB3aWxsIGJlIGRvbmUgd2l0aGluIHRoZSBKQVgtV1MgcnVudGltZQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oaW1wbGVtZW50YXRpb25DbGFzcyk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VydmljZURlc2MpOwotCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25bXSBlbmRwb2ludERlc2MgPSBzZXJ2aWNlRGVzYy5nZXRFbmRwb2ludERlc2NyaXB0aW9ucygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVuZHBvaW50RGVzYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmRwb2ludERlc2MubGVuZ3RoKTsKLQotICAgICAgICAvLyBUT0RPOiBIb3cgd2lsbCB0aGUgSkFYLVdTIGRpc3BhdGNoZXIgZ2V0IHRoZSBhcHByb3ByaWF0ZSBwb3J0IChpLmUuIGVuZHBvaW50KT8gIEN1cnJlbnRseSBhc3N1bWVzIFswXQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIHRlc3RFbmRwb2ludERlc2MgPSBlbmRwb2ludERlc2NbMF07Ci0gICAgICAgIEVuZHBvaW50SW50ZXJmYWNlRGVzY3JpcHRpb24gdGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgdGVzdEVuZHBvaW50RGVzYy5nZXRFbmRwb2ludEludGVyZmFjZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdEVuZHBvaW50SW50ZXJmYWNlRGVzYyk7Ci0KLSAgICAgICAgcmV0dXJuIHRlc3RFbmRwb2ludEludGVyZmFjZURlc2M7Ci0gICAgfQotfQotCi1AV2ViU2VydmljZSgpCi1jbGFzcyBTRUlQYWNrYWdlV3JhcHBlciB7Ci0gICAgQFJlcXVlc3RXcmFwcGVyKCkKLSAgICBAUmVzcG9uc2VXcmFwcGVyKCkKLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDEoU3RyaW5nIHN0cmluZykgdGhyb3dzIE1ldGhvZDFFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLX0KLQotY2xhc3MgTWV0aG9kMSB7Ci0KLX0KLQotY2xhc3MgTWV0aG9kMVJlc3BvbnNlIHsKLQotfQotCi1AV2ViRmF1bHQoKQotY2xhc3MgTWV0aG9kMUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgcHVibGljIEV4Y2VwdGlvbkJlYW4gZ2V0RmF1bHRJbmZvKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci19Ci0KLWNsYXNzIEV4Y2VwdGlvbkJlYW4gewotCi19Ci0KLUBXZWJGYXVsdAotY2xhc3MgU3ViUGFja2FnZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gTm8gZ2V0RmF1bHRJbmZvIG1ldGhvZAotfQotCi1AV2ViU2VydmljZSgpCi1jbGFzcyBTRUlTdWJQYWNrYWdlV3JhcHBlciB7Ci0gICAgQFJlcXVlc3RXcmFwcGVyKCkKLSAgICBAUmVzcG9uc2VXcmFwcGVyKCkKLSAgICBwdWJsaWMgU3RyaW5nIHN1YlBhY2thZ2VNZXRob2QxKFN0cmluZyBzdHJpbmcpIHRocm93cyBTdWJQYWNrYWdlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2FkZHJlc3NpbmcvQWN0aW9uVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9hZGRyZXNzaW5nL0FjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkODU1MTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2FkZHJlc3NpbmcvQWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5hZGRyZXNzaW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFjdGlvbjsKLWltcG9ydCBqYXZheC54bWwud3MuRmF1bHRBY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFjdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBucyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9hZGRyZXNzaW5nL2FjdGlvbiI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUgPSAiRGVmYXVsdFNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGxhaW5TZXJ2aWNlUG9ydE5hbWUgPSAiUGxhaW5TZXJ2aWNlUG9ydCI7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQW5ub3RhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGVmYXVsdFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9hZGRyZXNzaW5nL2FjdGlvbi9TZXJ2aWNlMS9nZXRRdW90ZVJlcXVlc3QiLCBheGlzT3BlcmF0aW9uLmdldElucHV0QWN0aW9uKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2FkZHJlc3NpbmcvYWN0aW9uL1NlcnZpY2UxL2dldFF1b3RlUmVzcG9uc2UiLCBheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9hZGRyZXNzaW5nL2FjdGlvbi9TZXJ2aWNlMS9nZXRRdW90ZS9GYXVsdC9UZXN0RXhjZXB0aW9uIiwgYXhpc09wZXJhdGlvbi5nZXRGYXVsdEFjdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFBsYWluQW5ub3RhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUGxhaW5TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBwbGFpblNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0L2lucHV0IiwgYXhpc09wZXJhdGlvbi5nZXRJbnB1dEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC9vdXRwdXQiLCBheGlzT3BlcmF0aW9uLmdldE91dHB1dEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC9mYXVsdCIsIGF4aXNPcGVyYXRpb24uZ2V0RmF1bHRBY3Rpb24oKSk7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKG5hbWU9IlNlcnZpY2UxIiwgdGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1kZWZhdWx0U2VydmljZVBvcnROYW1lKQotICAgIGNsYXNzIERlZmF1bHRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB0aHJvd3MgVGVzdEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKG5hbWU9IlNlcnZpY2UyIiwgdGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1wbGFpblNlcnZpY2VQb3J0TmFtZSkKLSAgICBjbGFzcyBQbGFpblNlcnZpY2UgewotICAgICAgICAKLSAgICAgICAgQEFjdGlvbihpbnB1dD0iaHR0cDovL3Rlc3QvaW5wdXQiLCBvdXRwdXQ9Imh0dHA6Ly90ZXN0L291dHB1dCIsCi0gICAgICAgICAgICAgICAgZmF1bHQ9eyBARmF1bHRBY3Rpb24oY2xhc3NOYW1lPVRlc3RFeGNlcHRpb24uY2xhc3MsIHZhbHVlPSJodHRwOi8vdGVzdC9mYXVsdCIpIH0pCi0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgdGhyb3dzIFRlc3RFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViRmF1bHQobmFtZT0iVGVzdEV4Y2VwdGlvbiIsIHRhcmdldE5hbWVzcGFjZT1ucykKLSAgICBjbGFzcyBUZXN0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvRGVzY3JpcHRpb25CdWlsZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2ZjA0ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9EZXNjcmlwdGlvbkJ1aWxkZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtLk1vZGU7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERpcmVjdGx5IHRlc3QgdGhlIERlc2NyaXB0aW9uIGNsYXNzZXMgYnVpbHQgdmlhIGFubm90YXRpb25zIHdpdGhvdXQgYSBXU0RMIGZpbGUuIFRoZXNlIHRlc3RzCi0gKiBmb2N1cyBvbiBjb21iaW5hdGlvbnMgb2YgdGhlIGZvbGxvd2luZzogLSBBIGdlbmVyaWMgc2VydmljZSAobm8gYW5ub3RhdGlvbnMpIC0gQSBnZW5lcmF0ZWQKLSAqIHNlcnZpY2UgKGFubm90YXRpb25zKSAtIEFuIFNFSQotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25CdWlsZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKiAKLSAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICogU2VydmljZURlc2NyaXB0aW9uIFRlc3RzCi0gICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXZWJTZXJ2aWNlQW5ub3QoKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkIjsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vZGVzY3JpcHRpb24uamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2VOYW1lIjsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICJodHRwOi8vRWNob1NlcnZpY2Uvd3NkbCI7Ci0gICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9ICJFY2hvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIjsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gIkVjaG9TZXJ2aWNlQW5ub3RhdGVkUG9ydCI7Ci0KLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdEltcGwxID0KLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3RJbXBsMiA9Ci0gICAgICAgICAgICAgICAgV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnROYW1lKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlID0KLSAgICAgICAgICAgICAgICBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0KLSAgICAgICAgZGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3RJbXBsMik7Ci0KLQotICAgICAgICBXZWJTZXJ2aWNlIHdlYlNlcnZpY2VBbm5vdEltcGwzID0gCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLmdldFdlYlNlcnZpY2VBbm5vdCgpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIldlYlNlcnZpY2UgbmFtZSBub3Qgc2V0Iiwgd2ViU2VydmljZUFubm90SW1wbDMubmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2ViU2VydmljZSB0YXJnZXROYW1lc3BhY2Ugbm90IHNldCIsIHdlYlNlcnZpY2VBbm5vdEltcGwzLnRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2ViU2VydmljZSBzZXJ2aWNlTmFtZSBub3Qgc2V0Iiwgd2ViU2VydmljZUFubm90SW1wbDMuc2VydmljZU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIldlYlNlcnZpY2Ugd3NkbExvY2F0aW9uIG5vdCBzZXQiLCB3ZWJTZXJ2aWNlQW5ub3RJbXBsMy53c2RsTG9jYXRpb24oKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoIldlYlNlcnZpY2UgZW5kcG9pbnRJbnRlcmZhY2Ugbm90IHNldCIsCi0gICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZUFubm90SW1wbDMuZW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXZWJTZXJ2aWNlIG5hbWU6IiArIHdlYlNlcnZpY2VBbm5vdEltcGwzLm5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVdlYlNlcnZpY2VQcm92aWRlckFubm90KCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9ICJFY2hvU2VydmljZUFubm90YXRlZCI7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIjsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gIkVjaG9TZXJ2aWNlTmFtZSI7Ci0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSAiaHR0cDovL0VjaG9TZXJ2aWNlL3dzZGwiOwotICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UgPSAiRWNob1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSI7Ci0gICAgICAgIFN0cmluZyBwb3J0TmFtZSA9ICJFY2hvU2VydmljZUFubm90YXRlZFBvcnQiOwotCi0gICAgICAgIFdlYlNlcnZpY2VQcm92aWRlckFubm90IHdlYlNlcnZpY2VQcm92aWRlckFubm90ID0KLSAgICAgICAgICAgICAgICBXZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0KLSAgICAgICAgd2ViU2VydmljZVByb3ZpZGVyQW5ub3Quc2V0UG9ydE5hbWUocG9ydE5hbWUpOwotICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHdlYlNlcnZpY2VQcm92aWRlckFubm90LnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdC5zZXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlID0KLSAgICAgICAgICAgICAgICBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0KLSAgICAgICAgZGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VQcm92aWRlckFubm90KHdlYlNlcnZpY2VQcm92aWRlckFubm90KTsKLQotCi0gICAgICAgIGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QzID0KLSAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUuZ2V0V2ViU2VydmljZVByb3ZpZGVyQW5ub3QoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VQcm92aWRlciBwb3J0IG5hbWUgbm90IHNldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDMucG9ydE5hbWUoKSwgcG9ydE5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYlNlcnZpY2VQcm92aWRlciB0YXJnZXROYW1lc3BhY2Ugbm90IHNldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlUHJvdmlkZXJBbm5vdDMudGFyZ2V0TmFtZXNwYWNlKCksIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViU2VydmljZVByb3ZpZGVyIHNlcnZpY2VOYW1lIG5vdCBzZXQgcHJvcGVybHkiLAotICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QzLnNlcnZpY2VOYW1lKCksIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJTZXJ2aWNlUHJvdmlkZXIgd3NkbExvY2F0aW9uIG5vdCBzZXQgcHJvcGVybHkiLAotICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QzLndzZGxMb2NhdGlvbigpLCB3c2RsTG9jYXRpb24pOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYlNlcnZpY2UgbmFtZToiICsgd2ViU2VydmljZVByb3ZpZGVyQW5ub3QzLnBvcnROYW1lKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXZWJNZXRob2RBbm5vdCgpIHsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAiZWNob1N0cmluZ01ldGhvZCI7Ci0gICAgICAgIFN0cmluZyBhY3Rpb24gPSAidXJuOkVjaG9TdHJpbmdNZXRob2QiOwotICAgICAgICBib29sZWFuIGV4Y2x1ZGUgPSB0cnVlOwotCi0KLSAgICAgICAgV2ViTWV0aG9kQW5ub3Qgd2ViTWV0aG9kQW5ub3QgPSBXZWJNZXRob2RBbm5vdC5jcmVhdGVXZWJNZXRob2RBbm5vdEltcGwoKTsKLQotICAgICAgICB3ZWJNZXRob2RBbm5vdC5zZXRPcGVyYXRpb25OYW1lKG9wZXJhdGlvbk5hbWUpOwotICAgICAgICB3ZWJNZXRob2RBbm5vdC5zZXRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgd2ViTWV0aG9kQW5ub3Quc2V0RXhjbHVkZShleGNsdWRlKTsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLQotICAgICAgICBtZGMuc2V0V2ViTWV0aG9kQW5ub3Qod2ViTWV0aG9kQW5ub3QpOwotICAgICAgICBtZGMuc2V0TWV0aG9kTmFtZShvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgZGJjLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKG1kYyk7Ci0KLSAgICAgICAgV2ViTWV0aG9kQW5ub3Qgd2ViTWV0aG9kQW5ub3QzID0KLSAgICAgICAgICAgICAgICBkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUob3BlcmF0aW9uTmFtZSwgMSkuZ2V0V2ViTWV0aG9kQW5ub3QoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBvcGVyYXRpb24gbmFtZSBub3Qgc2V0IHByb3Blcmx5Iiwgd2ViTWV0aG9kQW5ub3QzLm9wZXJhdGlvbk5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBhY3Rpb24gbm90IHNldCBwcm9wZXJseSIsIHdlYk1ldGhvZEFubm90My5hY3Rpb24oKSwgYWN0aW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJNZXRob2QgZXhjbHVkZSBmbGFnIG5vdCBzZXQgcHJvcGVybHkiLCB3ZWJNZXRob2RBbm5vdDMuZXhjbHVkZSgpLCBleGNsdWRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViUGFyYW1Bbm5vdCgpIHsKLQotICAgICAgICBTdHJpbmcgbmFtZSA9ICJhcmcwIjsKLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gInNrdSI7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2Rlc2NyaXB0aW9uLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIjsKLSAgICAgICAgTW9kZSBtb2RlID0gTW9kZS5JTjsKLSAgICAgICAgYm9vbGVhbiBoZWFkZXIgPSB0cnVlOwotCi0gICAgICAgIFdlYlBhcmFtQW5ub3Qgd2ViUGFyYW1Bbm5vdCA9IFdlYlBhcmFtQW5ub3QuY3JlYXRlV2ViUGFyYW1Bbm5vdEltcGwoKTsKLQotICAgICAgICB3ZWJQYXJhbUFubm90LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0UGFydE5hbWUocGFydE5hbWUpOwotICAgICAgICB3ZWJQYXJhbUFubm90LnNldE1vZGUobW9kZSk7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHdlYlBhcmFtQW5ub3Quc2V0SGVhZGVyKGhlYWRlcik7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLQotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFdlYlBhcmFtQW5ub3Qod2ViUGFyYW1Bbm5vdCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKCJpbnQiKTsKLQotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldE1ldGhvZE5hbWUoIlRlc3RNZXRob2QxIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vRmlyc3QgdGVzdCBhZGRzIHRoaXMgcGRjIG91dCBvZiBib3VuZHMKLSAgICAgICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMsIDEpOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGZsb3cKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL05vdywgYWRkIGl0IGF0IHRoZSBwcm9wZXIgcG9zaXRpb24KLSAgICAgICAgICAgIG1kYy5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShwZGMsIDApOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGZsb3cKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkNhdWdodCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRiYy5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShtZGMpOwotCi0gICAgICAgIFdlYlBhcmFtQW5ub3Qgd2ViUGFyYW1Bbm5vdDMgPQotICAgICAgICAgICAgICAgIGRiYy5nZXRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgiVGVzdE1ldGhvZDEiLCAxKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKDApLmdldFdlYlBhcmFtQW5ub3QoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBuYW1lIG5vdCBzZXQgcHJvcGVybHkiLCB3ZWJQYXJhbUFubm90My5uYW1lKCksIG5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBQYXJ0TmFtZSBub3Qgc2V0IHByb3Blcmx5Iiwgd2ViUGFyYW1Bbm5vdDMucGFydE5hbWUoKSwgcGFydE5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIldlYk1ldGhvZCBNb2RlIGZsYWcgbm90IHNldCBwcm9wZXJseSIsIHdlYlBhcmFtQW5ub3QzLm1vZGUoKSwgbW9kZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiV2ViTWV0aG9kIFRhcmdldCBOYW1lc3BhY2Ugbm90IHNldCBwcm9wZXJseSIsCi0gICAgICAgICAgICAgICAgICAgICB3ZWJQYXJhbUFubm90My50YXJnZXROYW1lc3BhY2UoKSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJNZXRob2QgSGVhZGVyIG5vdCBzZXQgcHJvcGVybHkiLCB3ZWJQYXJhbUFubm90My5oZWFkZXIoKSwgaGVhZGVyKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuYWJsZSB0byBjb252ZXJ0IHN0cmluZyB0byBwYXJhbWV0ZXJUeXBlQ2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpLmdldE5hbWUoKSwgImludCIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0Fubm90YXRpb25JbnN0YW5jZXNBbmRQcm9jZXNzb3IoKSB7Ci0gICAgICAgIFRlc3RQcm9jZXNzb3IgYW5ub3RhdGlvblByb2Nlc3NvciA9IG5ldyBUZXN0UHJvY2Vzc29yKCk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3Iuc2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKEN1c3RvbUFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgZGJjLmFkZEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IoYW5ub3RhdGlvblByb2Nlc3Nvcik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I+IHByb2Nlc3NvcnMgPSBkYmMuZ2V0Q3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcnMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9jZXNzb3JzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwcm9jZXNzb3JzLnZhbHVlcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2Nlc3NvcnMudmFsdWVzKCkuc2l6ZSgpLCAxKTsKLSAgICAgICAgQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvciBpbnN0YW5jZSA9IHByb2Nlc3NvcnMuZ2V0KEN1c3RvbUFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YW5jZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgVGVzdFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW5zdGFuY2UuZ2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCksIEN1c3RvbUFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgQ3VzdG9tQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IEN1c3RvbUFubm90YXRpb24oKTsKLSAgICAgICAgYW5ub3RhdGlvbi5zZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKEN1c3RvbS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhbm5vdGF0aW9uLnNldFRhcmdldChFbGVtZW50VHlwZS5UWVBFKTsKLSAgICAgICAgYW5ub3RhdGlvbi5hZGRQYXJhbWV0ZXJEYXRhKCJuYW1lIiwgYW5ub3RhdGlvbi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIGRiYy5hZGRDdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2UoYW5ub3RhdGlvbik7Ci0gICAgICAgIExpc3Q8Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlPiBnYWlMaXN0ID0gZGJjLmdldEN1c3RvbUFubm90YXRpb25JbnN0YW5jZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChnYWlMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdhaUxpc3Quc2l6ZSgpKTsKLSAgICAgICAgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGdhaSA9IGdhaUxpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKGdhaSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhnYWkuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIEN1c3RvbUFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdhaS5nZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCksIEN1c3RvbS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2FpLmdldFRhcmdldCgpLCBFbGVtZW50VHlwZS5UWVBFKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdhaS5nZXRQYXJhbWV0ZXJEYXRhKCJuYW1lIiksIGdhaS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnYWkuZ2V0UGFyYW1ldGVyRGF0YSgidW5rbm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgIGV4ID0gaWFlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZXgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2FpLmFkZFBhcmFtZXRlckRhdGEoInVua25vd24iLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICBleCA9IGlhZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGV4KTsKLSAgICB9Ci0gICAgCi0gICAgY2xhc3MgVGVzdFByb2Nlc3NvciBpbXBsZW1lbnRzIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKFN0cmluZyBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUpIHsKLSAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lID0gYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc1R5cGVMZXZlbEFubm90YXRpb24oRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGFubm90YXRpb24pIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcsIHRlc3RpbmcgcHVycHJvc2VzIG9ubHkKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgY2xhc3MgQ3VzdG9tQW5ub3RhdGlvbiBpbXBsZW1lbnRzIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgRWxlbWVudFR5cGUgZWxlbWVudFR5cGU7Ci0gICAgICAgIAotICAgICAgICBMaXN0PFN0cmluZz4ga25vd25QYXJhbU5hbWVzOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICAgICAgCi0gICAgICAgIEN1c3RvbUFubm90YXRpb24oTGlzdDxTdHJpbmc+IGtub3duUGFyYW1OYW1lcykgewotICAgICAgICAgICAgdGhpcy5rbm93blBhcmFtTmFtZXMgPSBrbm93blBhcmFtTmFtZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIEN1c3RvbUFubm90YXRpb24oKSB7Ci0gICAgICAgICAgICBrbm93blBhcmFtTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGtub3duUGFyYW1OYW1lcy5hZGQoIm5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbkNsYXNzTmFtZShTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZSkgewotICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3NOYW1lID0gYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlckRhdGEoU3RyaW5nIHBhcmFtTmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGNoZWNrUGFyYW1OYW1lKHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICBkYXRhTWFwLnB1dChwYXJhbU5hbWUsIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyRGF0YShTdHJpbmcgcGFyYW1OYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGNoZWNrUGFyYW1OYW1lKHBhcmFtTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YU1hcC5nZXQocGFyYW1OYW1lKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRWxlbWVudFR5cGUgZ2V0VGFyZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tQYXJhbU5hbWUoU3RyaW5nIHBhcmFtTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZihrbm93blBhcmFtTmFtZXMgIT0gbnVsbCAKLSAgICAgICAgICAgICAgICAgICAgJiYgCi0gICAgICAgICAgICAgICAgICAgICFrbm93blBhcmFtTmFtZXMuaXNFbXB0eSgpIAotICAgICAgICAgICAgICAgICAgICAmJiAKLSAgICAgICAgICAgICAgICAgICAgIWtub3duUGFyYW1OYW1lcy5jb250YWlucyhwYXJhbU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciAiICsgcGFyYW1OYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBhbiB1bmtub3duIHBhcmFtZXRlciBmb3IgdGhlIEN1c3RvbUFubm90YXRpb24gdHlwZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAaW50ZXJmYWNlIEN1c3RvbSB7Ci0gICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICB9Ci0KLSAgICBAV2ViU2VydmljZQotICAgIEBDdXN0b20KLSAgICBjbGFzcyBBbm5vdGF0ZWRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBlY2hvU3RyaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWNob1N0cmluZzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1BhcmFtZXRlclBhcnNpbmdUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUGFyYW1ldGVyUGFyc2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MmUwYzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUGFyYW1ldGVyUGFyc2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiogVGVzdHMgdGhlIHBhcnNpbmcgb2YgR2VuZXJpY3MgdGhhdCBhcmUgdXNlZCBpbiB0aGUgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHByb2Nlc3NpbmcuICovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyUGFyc2luZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlcigpIHsKLSAgICAgICAgU3RyaW5nIGhvbGRlcklucHV0U3RyaW5nID0gImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS5sYW5nLk9iamVjdD4iOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoaG9sZGVySW5wdXRTdHJpbmcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS5sYW5nLk9iamVjdD4iLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKERlc2NyaXB0aW9uQnVpbGRlclV0aWxzLmlzSG9sZGVyVHlwZShob2xkZXJJbnB1dFN0cmluZykpOwotICAgICAgICBhc3NlcnRUcnVlKHBkYy5pc0hvbGRlclR5cGUoKSk7Ci0gICAgICAgIFN0cmluZyBob2xkZXJSZXN1bHRTdHJpbmcgPSBEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKGhvbGRlcklucHV0U3RyaW5nKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyIiwgaG9sZGVyUmVzdWx0U3RyaW5nKTsKLSAgICAgICAgaG9sZGVyUmVzdWx0U3RyaW5nID0gcGRjLmdldFJhd1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyIiwgaG9sZGVyUmVzdWx0U3RyaW5nKTsKLSAgICAgICAgamF2YXgueG1sLndzLkhvbGRlciB2YWxpZGF0ZUhvbGRlciA9IG5ldyBqYXZheC54bWwud3MuSG9sZGVyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWxpZGF0ZUhvbGRlci5nZXRDbGFzcygpLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotCi0gICAgICAgIFN0cmluZyBhY3R1YWxUeXBlUmVzdWx0ID0gRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0SG9sZGVyQWN0dWFsVHlwZShob2xkZXJJbnB1dFN0cmluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGFjdHVhbFR5cGVSZXN1bHQpOwotICAgICAgICBhY3R1YWxUeXBlUmVzdWx0ID0gcGRjLmdldEhvbGRlckFjdHVhbFR5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYWN0dWFsVHlwZVJlc3VsdCk7Ci0gICAgICAgIGphdmEubGFuZy5PYmplY3QgdmFsaWRhdGVPYmplY3QgPSBuZXcgamF2YS5sYW5nLk9iamVjdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsaWRhdGVPYmplY3QuZ2V0Q2xhc3MoKSwgcGRjLmdldEhvbGRlckFjdHVhbFR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SG9sZGVyTXlPYmplY3QoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgKLSAgICAgICAgICAgICAgICAiamF2YXgueG1sLndzLkhvbGRlcjxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3Q+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3Q+IiwKLSAgICAgICAgICAgICAgICAgICAgIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocGRjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyIiwgcGRjLmdldFJhd1R5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3QiLAotICAgICAgICAgICAgICAgICAgICAgcGRjLmdldEhvbGRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhNeU9iamVjdC5jbGFzcywgcGRjLmdldEhvbGRlckFjdHVhbFR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSG9sZGVyR2VucmljKCkgewotICAgICAgICBTdHJpbmcgaW5wdXRTdHJpbmcgPSAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15T2JqZWN0PiI7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShpbnB1dFN0cmluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15T2JqZWN0PiIsCi0gICAgICAgICAgICAgICAgICAgICBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShwZGMuaXNIb2xkZXJUeXBlKCkpOwotICAgICAgICBTdHJpbmcgZ2VuZXJpY1R5cGUgPSBwZGMuZ2V0UmF3VHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgZ2VuZXJpY1R5cGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YS51dGlsLkxpc3QuY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgbnVsbCBzaW5jZSB0aGUgZ2VuZXJpYyBpcyBub3QgYSBIb2xkZXIgdHlwZQotICAgICAgICBTdHJpbmcgYWN0dWFsUGFyYW0gPSBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZSgpOwotICAgICAgICBhc3NlcnROdWxsKGFjdHVhbFBhcmFtKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJHZW5lcmljKCkgewotICAgICAgICBTdHJpbmcgaG9sZGVySW5wdXRTdHJpbmcgPSAiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuT2JqZWN0Pj4iOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoaG9sZGVySW5wdXRTdHJpbmcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLk9iamVjdD4+IiwKLSAgICAgICAgICAgICAgICAgICAgIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUocGRjLmlzSG9sZGVyVHlwZSgpKTsKLSAgICAgICAgU3RyaW5nIGhvbGRlclJlc3VsdFN0cmluZyA9IHBkYy5nZXRSYXdUeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlciIsIGhvbGRlclJlc3VsdFN0cmluZyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhIb2xkZXIuY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGFjdHVhbFR5cGVSZXN1bHQgPSBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgYWN0dWFsVHlwZVJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0LmNsYXNzLCBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVzRW5jb2RlZCgpIHsKLSAgICAgICAgU3RyaW5nW10gcHJpbWl0aXZlc1RvVGVzdCA9IHsgIloiLCAiQiIsICJDIiwgIkQiLCAiRiIsICJJIiwgIkoiLCAiUyIsICJWIiB9OwotICAgICAgICBDbGFzc1tdIHByaW1pdGl2ZUNsYXNzZXMgPSB7IGJvb2xlYW4uY2xhc3MsIGJ5dGUuY2xhc3MsIGNoYXIuY2xhc3MsIGRvdWJsZS5jbGFzcywKLSAgICAgICAgICAgICAgICBmbG9hdC5jbGFzcywgaW50LmNsYXNzLCBsb25nLmNsYXNzLCBzaG9ydC5jbGFzcywgdm9pZC5jbGFzcyB9OwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWl0aXZlc1RvVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuaXNIb2xkZXJUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoRGVzY3JpcHRpb25CdWlsZGVyVXRpbHMuZ2V0UmF3VHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKSk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByaW1pdGl2ZUNsYXNzZXNbaV0sIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlcygpIHsKLSAgICAgICAgU3RyaW5nW10gcHJpbWl0aXZlc1RvVGVzdCA9Ci0gICAgICAgICAgICAgICAgeyAiYm9vbGVhbiIsICJieXRlIiwgImNoYXIiLCAiZG91YmxlIiwgImZsb2F0IiwgImludCIsICJsb25nIiwgInNob3J0IiwgInZvaWQiIH07Ci0gICAgICAgIENsYXNzW10gcHJpbWl0aXZlQ2xhc3NlcyA9IHsgYm9vbGVhbi5jbGFzcywgYnl0ZS5jbGFzcywgY2hhci5jbGFzcywgZG91YmxlLmNsYXNzLAotICAgICAgICAgICAgICAgIGZsb2F0LmNsYXNzLCBpbnQuY2xhc3MsIGxvbmcuY2xhc3MsIHNob3J0LmNsYXNzLCB2b2lkLmNsYXNzIH07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzVG9UZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5pc0hvbGRlclR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSkpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pKTsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVBcnJheXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByaW1pdGl2ZXNUb1Rlc3QgPSB7ICJib29sZWFuW10iLCAiYnl0ZVtdIiwgImNoYXJbXSIsICJkb3VibGVbXSIsICJmbG9hdFtdIiwKLSAgICAgICAgICAgICAgICAiaW50W10iLCAibG9uZ1tdIiwgInNob3J0W10iIH07Ci0gICAgICAgIENsYXNzW10gcHJpbWl0aXZlQ2xhc3NlcyA9IHsgYm9vbGVhbltdLmNsYXNzLCBieXRlW10uY2xhc3MsIGNoYXJbXS5jbGFzcywgZG91YmxlW10uY2xhc3MsCi0gICAgICAgICAgICAgICAgZmxvYXRbXS5jbGFzcywgaW50W10uY2xhc3MsIGxvbmdbXS5jbGFzcywgc2hvcnRbXS5jbGFzcyB9OwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWl0aXZlc1RvVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZShwcmltaXRpdmVzVG9UZXN0W2ldKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmltaXRpdmVDbGFzc2VzW2ldLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZU11bHRpRGltQXJyYXlzKCkgewotICAgICAgICBTdHJpbmdbXSBwcmltaXRpdmVzVG9UZXN0ID0geyAiYm9vbGVhbltdW10iLCAiYnl0ZVtdW11bXSIsICJjaGFyW11bXVtdW10iLAotICAgICAgICAgICAgICAgICJkb3VibGVbXVtdW11bXVtdIiwgImZsb2F0W11bXVtdW11bXVtdIiwgImludFtdIiwgImxvbmdbXSIsICJzaG9ydFtdIiB9OwotICAgICAgICBDbGFzc1tdIHByaW1pdGl2ZUNsYXNzZXMgPSB7IGJvb2xlYW5bXVtdLmNsYXNzLCBieXRlW11bXVtdLmNsYXNzLCBjaGFyW11bXVtdW10uY2xhc3MsCi0gICAgICAgICAgICAgICAgZG91YmxlW11bXVtdW11bXS5jbGFzcywgZmxvYXRbXVtdW11bXVtdW10uY2xhc3MsIGludFtdLmNsYXNzLCBsb25nW10uY2xhc3MsCi0gICAgICAgICAgICAgICAgc2hvcnRbXS5jbGFzcyB9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW1pdGl2ZXNUb1Rlc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhTGFuZ09iamVjdEFycmF5cygpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjT2JqZWN0ID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkY09iamVjdC5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLmxhbmcuT2JqZWN0W10iKTsKLSAgICAgICAgT2JqZWN0W10gdmVyaWZ5T2JqZWN0ID0gbmV3IE9iamVjdFs1XTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcmlmeU9iamVjdC5nZXRDbGFzcygpLCBwZGNPYmplY3QuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkY1N0cmluZyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGNTdHJpbmcuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZ1tdW11bXSIpOwotICAgICAgICBTdHJpbmdbXVtdW10gdmVyaWZ5U3RyaW5nID0gbmV3IFN0cmluZ1s1XVsxXVszXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcmlmeVN0cmluZy5nZXRDbGFzcygpLCBwZGNTdHJpbmcuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotCi0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkY0ludGVnZXIgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjSW50ZWdlci5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLmxhbmcuSW50ZWdlcltdW11bXVtdIik7Ci0gICAgICAgIEludGVnZXJbXVtdW11bXSB2ZXJpZnlJbnRlZ2VyID0gbmV3IEludGVnZXJbNV1bMV1bM11bMTJdOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyaWZ5SW50ZWdlci5nZXRDbGFzcygpLCBwZGNJbnRlZ2VyLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXlPYmplY3RBcnJheSgpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3RbXVtdIik7Ci0gICAgICAgIE15T2JqZWN0W11bXSBteU9iamVjdCA9IG5ldyBNeU9iamVjdFsyXVszXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG15T2JqZWN0LmdldENsYXNzKCksIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlck9mUHJpbWl0aXZlQXJyYXkoKSB7Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YXgueG1sLndzLkhvbGRlcjxieXRlW10+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxieXRlW10+IiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICAgICAgYnl0ZSBbXSB2YWxpZGF0ZUJ5dGVBcnJheSA9IG5ldyBieXRlWzEwXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbGlkYXRlQnl0ZUFycmF5LmdldENsYXNzKCksIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlck9mTXlPYmplY3RBcnJheSgpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKAotICAgICAgICAgICAgICAgICJqYXZheC54bWwud3MuSG9sZGVyPG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeU9iamVjdFtdW10+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlPYmplY3RbXVtdPiIsCi0gICAgICAgICAgICAgICAgICAgICBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEhvbGRlci5jbGFzcywgcGRjLmdldFBhcmFtZXRlclR5cGVDbGFzcygpKTsKLSAgICAgICAgTXlPYmplY3RbXVtdIHZhbGlkYXRlTXlPYmplY3QgPSBuZXcgTXlPYmplY3RbNV1bMTBdOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsaWRhdGVNeU9iamVjdC5nZXRDbGFzcygpLCBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJPZlN0cmluZ0FycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS5sYW5nLlN0cmluZ1tdPiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS5sYW5nLlN0cmluZ1tdPiIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nW10uY2xhc3MsIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0FycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmdbXSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nW10uY2xhc3MsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhvbGRlck9mR2VuZXJpY0FycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5bXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyPGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+W10+IiwKLSAgICAgICAgICAgICAgICAgICAgIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJPZkdlbmVyaWNBcnJheU11bHRpRGltZW5zaW9uKCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5bXVtdW10+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YXgueG1sLndzLkhvbGRlcjxqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdW11bXT4iLAotICAgICAgICAgICAgICAgICAgICAgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W11bXVtdLmNsYXNzLCBwZGMuZ2V0SG9sZGVyQWN0dWFsVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJPZkdlbmVyaWNXaWxkY2FyZEFycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmF4LnhtbC53cy5Ib2xkZXI8amF2YS51dGlsLkxpc3Q8Pz5bXT4iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwud3MuSG9sZGVyPGphdmEudXRpbC5MaXN0PD8+W10+IiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYy5nZXRIb2xkZXJBY3R1YWxUeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNBcnJheSgpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz5bXSIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljQXJyYXlNdWx0aURpbWVuc2lvbigpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdW10iKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPltdW10iLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXVtdLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljV2lsZENhcmRBcnJheSgpIHsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkYy5zZXRQYXJhbWV0ZXJUeXBlKCJqYXZhLnV0aWwuTGlzdDw/PltdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8Pz5bXSIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljQXJyYXlPZlN0cmluZ0FycmF5KCkgewotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjLnNldFBhcmFtZXRlclR5cGUoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmdbXT5bXSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmdbXT5bXSIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZUNsYXNzKCkpOwotICAgIH0KLX0KLQotY2xhc3MgTXlPYmplY3QgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmV0dXJuVHlwZVBhcnNpbmdUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvUmV0dXJuVHlwZVBhcnNpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmNlNGFiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1JldHVyblR5cGVQYXJzaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBUZXN0cyB0aGUgcGFyc2luZyBvZiBHZW5lcmljcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgcHJvY2Vzc2luZy4gKi8KLXB1YmxpYyBjbGFzcyBSZXR1cm5UeXBlUGFyc2luZ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vbkhvbGRlckdlbnJpYygpIHsKLSAgICAgICAgU3RyaW5nIGlucHV0U3RyaW5nID0KLSAgICAgICAgICAgICAgICAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15UmV0dXJuVGVzdE9iamVjdD4iOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoaW5wdXRTdHJpbmcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgImphdmEudXRpbC5MaXN0PG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5NeVJldHVyblRlc3RPYmplY3Q+IiwKLSAgICAgICAgICAgICAgICBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoamF2YS51dGlsLkxpc3QuY2xhc3MsIG1kYy5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZXNFbmNvZGVkKCkgewotICAgICAgICBTdHJpbmdbXSBwcmltaXRpdmVzVG9UZXN0ID0geyAiWiIsICJCIiwgIkMiLCAiRCIsICJGIiwgIkkiLCAiSiIsICJTIiwKLSAgICAgICAgICAgICAgICAiViIgfTsKLSAgICAgICAgQ2xhc3NbXSBwcmltaXRpdmVDbGFzc2VzID0geyBib29sZWFuLmNsYXNzLCBieXRlLmNsYXNzLCBjaGFyLmNsYXNzLAotICAgICAgICAgICAgICAgIGRvdWJsZS5jbGFzcywgZmxvYXQuY2xhc3MsIGludC5jbGFzcywgbG9uZy5jbGFzcywgc2hvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgdm9pZC5jbGFzcyB9OwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWl0aXZlc1RvVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0TnVsbChEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pKTsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVzKCkgewotICAgICAgICBTdHJpbmdbXSBwcmltaXRpdmVzVG9UZXN0ID0geyAiYm9vbGVhbiIsICJieXRlIiwgImNoYXIiLCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAiZmxvYXQiLCAiaW50IiwgImxvbmciLCAic2hvcnQiLCAidm9pZCIgfTsKLSAgICAgICAgQ2xhc3NbXSBwcmltaXRpdmVDbGFzc2VzID0geyBib29sZWFuLmNsYXNzLCBieXRlLmNsYXNzLCBjaGFyLmNsYXNzLAotICAgICAgICAgICAgICAgIGRvdWJsZS5jbGFzcywgZmxvYXQuY2xhc3MsIGludC5jbGFzcywgbG9uZy5jbGFzcywgc2hvcnQuY2xhc3MsCi0gICAgICAgICAgICAgICAgdm9pZC5jbGFzcyB9OwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJpbWl0aXZlc1RvVGVzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0TnVsbChEZXNjcmlwdGlvbkJ1aWxkZXJVdGlscy5nZXRSYXdUeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pKTsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVBcnJheXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByaW1pdGl2ZXNUb1Rlc3QgPSB7ICJib29sZWFuW10iLCAiYnl0ZVtdIiwgImNoYXJbXSIsCi0gICAgICAgICAgICAgICAgImRvdWJsZVtdIiwgImZsb2F0W10iLCAiaW50W10iLCAibG9uZ1tdIiwgInNob3J0W10iIH07Ci0gICAgICAgIENsYXNzW10gcHJpbWl0aXZlQ2xhc3NlcyA9IHsgYm9vbGVhbltdLmNsYXNzLCBieXRlW10uY2xhc3MsCi0gICAgICAgICAgICAgICAgY2hhcltdLmNsYXNzLCBkb3VibGVbXS5jbGFzcywgZmxvYXRbXS5jbGFzcywgaW50W10uY2xhc3MsCi0gICAgICAgICAgICAgICAgbG9uZ1tdLmNsYXNzLCBzaG9ydFtdLmNsYXNzIH07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzVG9UZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKHByaW1pdGl2ZXNUb1Rlc3RbaV0pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByaW1pdGl2ZUNsYXNzZXNbaV0sIG1kYy5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlTXVsdGlEaW1BcnJheXMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIHByaW1pdGl2ZXNUb1Rlc3QgPSB7ICJib29sZWFuW11bXSIsICJieXRlW11bXVtdIiwKLSAgICAgICAgICAgICAgICAiY2hhcltdW11bXVtdIiwgImRvdWJsZVtdW11bXVtdW10iLCAiZmxvYXRbXVtdW11bXVtdW10iLAotICAgICAgICAgICAgICAgICJpbnRbXSIsICJsb25nW10iLCAic2hvcnRbXSIgfTsKLSAgICAgICAgQ2xhc3NbXSBwcmltaXRpdmVDbGFzc2VzID0geyBib29sZWFuW11bXS5jbGFzcywgYnl0ZVtdW11bXS5jbGFzcywKLSAgICAgICAgICAgICAgICBjaGFyW11bXVtdW10uY2xhc3MsIGRvdWJsZVtdW11bXVtdW10uY2xhc3MsCi0gICAgICAgICAgICAgICAgZmxvYXRbXVtdW11bXVtdW10uY2xhc3MsIGludFtdLmNsYXNzLCBsb25nW10uY2xhc3MsCi0gICAgICAgICAgICAgICAgc2hvcnRbXS5jbGFzcyB9OwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByaW1pdGl2ZXNUb1Rlc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICAgICAgbWRjLnNldFJldHVyblR5cGUocHJpbWl0aXZlc1RvVGVzdFtpXSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJpbWl0aXZlQ2xhc3Nlc1tpXSwgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhTGFuZ09iamVjdEFycmF5cygpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjT2JqZWN0ID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHBkY09iamVjdC5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuT2JqZWN0W10iKTsKLSAgICAgICAgT2JqZWN0W10gdmVyaWZ5T2JqZWN0ID0gbmV3IE9iamVjdFs1XTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcmlmeU9iamVjdC5nZXRDbGFzcygpLCBwZGNPYmplY3QuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHBkY1N0cmluZyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBwZGNTdHJpbmcuc2V0UmV0dXJuVHlwZSgiamF2YS5sYW5nLlN0cmluZ1tdW11bXSIpOwotICAgICAgICBTdHJpbmdbXVtdW10gdmVyaWZ5U3RyaW5nID0gbmV3IFN0cmluZ1s1XVsxXVszXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHZlcmlmeVN0cmluZy5nZXRDbGFzcygpLCBwZGNTdHJpbmcuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHBkY0ludGVnZXIgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgcGRjSW50ZWdlci5zZXRSZXR1cm5UeXBlKCJqYXZhLmxhbmcuSW50ZWdlcltdW11bXVtdIik7Ci0gICAgICAgIEludGVnZXJbXVtdW11bXSB2ZXJpZnlJbnRlZ2VyID0gbmV3IEludGVnZXJbNV1bMV1bM11bMTJdOwotICAgICAgICBhc3NlcnRFcXVhbHModmVyaWZ5SW50ZWdlci5nZXRDbGFzcygpLCBwZGNJbnRlZ2VyCi0gICAgICAgICAgICAgICAgLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXlPYmplY3RBcnJheSgpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTXlSZXR1cm5UZXN0T2JqZWN0W11bXSIpOwotICAgICAgICBNeVJldHVyblRlc3RPYmplY3RbXVtdIG15T2JqZWN0ID0gbmV3IE15UmV0dXJuVGVzdE9iamVjdFsyXVszXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG15T2JqZWN0LmdldENsYXNzKCksIG1kYy5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFycmF5TGlzdE9mUHJpbWl0aXZlQXJyYXkoKSB7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgiamF2YS51dGlsLkFycmF5TGlzdDxieXRlW10+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkFycmF5TGlzdDxieXRlW10+IiwgbWRjLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheUxpc3QuY2xhc3MsIG1kYy5nZXRSZXR1cm5UeXBlQ2xhc3MoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RPZk15T2JqZWN0QXJyYXkoKSB7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgKLSAgICAgICAgICAgICAgICAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15UmV0dXJuVGVzdE9iamVjdFtdW10+Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15UmV0dXJuVGVzdE9iamVjdFtdW10+IiwKLSAgICAgICAgICAgICAgICBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdC5jbGFzcywgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0FycmF5KCkgewotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgbWRjLnNldFJldHVyblR5cGUoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmdbXT5bXSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmdbXT5bXSIsCi0gICAgICAgICAgICAgICAgICAgICBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXS5jbGFzcywgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0FycmF5TXVsdGlEaW1lbnNpb24oKSB7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIG1kYyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBtZGMuc2V0UmV0dXJuVHlwZSgKLSAgICAgICAgICAgICAgICAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15UmV0dXJuVGVzdE9iamVjdD5bXVtdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiamF2YS51dGlsLkxpc3Q8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLk15UmV0dXJuVGVzdE9iamVjdD5bXVtdIiwKLSAgICAgICAgICAgICAgICBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXVtdLmNsYXNzLCBtZGMuZ2V0UmV0dXJuVHlwZUNsYXNzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZEdlbmVyaWNBcnJheSgpIHsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIG1kYy5zZXRSZXR1cm5UeXBlKCJqYXZhLnV0aWwuTGlzdDw/PltdIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8Pz5bXSIsCi0gICAgICAgICAgICAgICAgICAgICBtZGMuZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXS5jbGFzcywgbWRjLmdldFJldHVyblR5cGVDbGFzcygpKTsKLSAgICB9Ci0KLX0KLQotY2xhc3MgTXlSZXR1cm5UZXN0T2JqZWN0IHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1NwYXJzZUFubm90VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL1NwYXJzZUFubm90VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1MDBiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vYnVpbGRlci9TcGFyc2VBbm5vdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3BhcnNlQW5ub3RUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVVJJID0gImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuU3BhcnNlQW5ub3RUZXN0cyI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN2Y0xvY2FsUGFydCA9ICJzdmNMb2NhbFBhcnQiOw0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TcGFyc2VBbm5vdCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXJzZUFubm90U2VydmljZVN1YmNsYXNzLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICAvLyBBIERCQyB3aWxsIGJlIGNyZWF0ZWQgZm9yIHVzDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY0NvbXBvc2l0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzdmNEZXNjKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsNCi0gICAgICAgIC8vIFRoZXJlIGlzIG5vIERCQyBBbm5vdCBpbiB0aGlzIGNhc2U7IGl0IGlzIHRoZSBjbGFzcyBhbm5vdGF0aW9uIGJ1dCBpdCBzaG91bGQgYmUgDQotICAgICAgICAvLyByZXR1cm5lZCBhcyBhbiBpbnN0YW5jZSBvZiBhIFdlYlNlcnZpY2VDbGllbnRBbm5vdA0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3c0NsaWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VDbGllbnRBbm5vdCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkQ2xhc3MoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRlIHdpdGggYSBXZWJTZXJ2aWNlQ2xpZW50IG92ZXJyaWRlIG9mIHRoZSBXU0RMIGxvY2F0aW9uLg0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIFN0cmluZyBvdmVycmlkZW5Xc2RsTG9jYXRpb24gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMTG9jYXRpb24oIkNsaWVudEVuZHBvaW50TWV0YWRhdGEud3NkbCIpOw0KLSAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90IHdzQ2xpZW50QW5ubyA9IA0KLSAgICAgICAgICAgIFdlYlNlcnZpY2VDbGllbnRBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQ2xpZW50QW5ub3RJbXBsKG51bGwsIG51bGwsIG92ZXJyaWRlbldzZGxMb2NhdGlvbik7DQotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7DQotICAgICAgICBPYmplY3QgY29tcG9zaXRlS2V5ID0gIkNvbXBvc2l0ZUtleSI7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXJzZUFubm90U2VydmljZVN1YmNsYXNzLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY0NvbXBvc2l0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzdmNEZXNjKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnROb3RTYW1lKGNvbXBvc2l0ZSwgc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRTYW1lKFNwYXJzZUFubm90U2VydmljZVN1YmNsYXNzLmNsYXNzLCBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsNCi0gICAgICAgIGFzc2VydFNhbWUoY29tcG9zaXRlLCBzdmNEZXNjQ29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShjb21wb3NpdGVLZXkpKTsNCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBzdmNEZXNjQ29tcG9zaXRlLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3c0NsaWVudCBpbnN0YW5jZW9mIFdlYlNlcnZpY2VDbGllbnRBbm5vdCk7DQotICAgIH0NCi0gICAgLyoqDQotICAgICAqIFRoZSBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaXNuJ3QgcHJvY2Vzc2VkIGJ5IHRoZSBKQVhXUyBydW50aW1lLiAgVGhlIGNvbnRhaW5lciAoaS5lLiB0aGUNCi0gICAgICogY2xpZW50IGNvbnRhaW5lciwgd2ViIGNvbnRhaW5lciwgb3IgZWpiIGNvbnRhaW5lcikgcHJvY2Vzc2VzIGl0IHNpbmNlIGl0IGlzIHJlc3BvbnNpYmxlIGZvcg0KLSAgICAgKiBkb2luZyByZXNvdXJjZSBpbmplY3Rpb24uICBUaGlzIG1lYW5zIG5vbmUgb2YgdGhlIG90aGVyIHRlc3RzIGRlYWwgd2l0aCBXZWJTZXJ2aWNlUmVmLCBzbw0KLSAgICAgKiB0aGlzIHNpbXBsZSB0ZXN0IHZhbGlkYXRlcyBhIGZldyBhc3BlY3RzIG9mIHRoZSBjb21wb3NpdGUgYW5ub3RhdGlvbiBwcm9jZXNzaW5nLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VSZWYoKSB7DQotICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZVJlZkFubm90IHdzciA9IFdlYlNlcnZpY2VSZWZBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlUmVmQW5ub3RJbXBsKCk7DQotICAgICAgICBhc3NlcnRUcnVlKHdzci5uYW1lKCkuZXF1YWxzKCIiKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHdzci53c2RsTG9jYXRpb24oKS5lcXVhbHMoIiIpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIiIuZXF1YWxzKHdzci5nZXRUeXBlU3RyaW5nKCkpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIiIuZXF1YWxzKHdzci5nZXRWYWx1ZVN0cmluZygpKSk7DQotICAgICAgICBhc3NlcnROdWxsKHdzci50eXBlKCkpOw0KLSAgICAgICAgYXNzZXJ0TnVsbCh3c3IudmFsdWUoKSk7DQotICAgICAgICANCi0gICAgICAgIHdzciA9IFdlYlNlcnZpY2VSZWZBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlUmVmQW5ub3RJbXBsKCJuYW1lIiwgIndzZGxMb2NhdGlvbiIsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzLCAibWFwcGVkTmFtZSIpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3c3IubmFtZSgpLmVxdWFscygibmFtZSIpKTsNCi0gICAgICAgIGFzc2VydFRydWUod3NyLndzZGxMb2NhdGlvbigpLmVxdWFscygid3NkbExvY2F0aW9uIikpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiIi5lcXVhbHMod3NyLmdldFR5cGVTdHJpbmcoKSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiIi5lcXVhbHMod3NyLmdldFZhbHVlU3RyaW5nKCkpKTsNCi0gICAgICAgIGFzc2VydFRydWUod3NyLnR5cGUoKSA9PSBTdHJpbmcuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3c3IudmFsdWUoKSA9PSBPYmplY3QuY2xhc3MpOw0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KHRhcmdldE5hbWVzcGFjZT0ib3JpZ2luYWxUTlMiLCB3c2RsTG9jYXRpb249Im9yaWdpbmFsV3NkbExvY2F0aW9uIikNCi1jbGFzcyBTcGFyc2VBbm5vdFNlcnZpY2VTdWJjbGFzcyBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0NCi0gICAgcHJvdGVjdGVkIFNwYXJzZUFubm90U2VydmljZVN1YmNsYXNzKFVSTCB3c2RsRG9jdW1lbnRMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsNCi0gICAgICAgIHN1cGVyKHdzZGxEb2N1bWVudExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL1JlZmxlY3RpdmVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2J1aWxkZXIvY29udmVydGVyL1JlZmxlY3RpdmVDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmYxNzk5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9idWlsZGVyL2NvbnZlcnRlci9SZWZsZWN0aXZlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJNZXRob2RBbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViUGFyYW1Bbm5vdDsKLWltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gTm90ZSB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIGluY3JlYXNlIHRoZSBqYXZhIGhlYXAgc2l6ZSwgZm9yIGV4YW1wbGUKLSAgICAgICAgLy8gLVhteDUxMm0uICBUaGlzIGNhbiBiZSBkb25lIGJ5IHNldHRpbmcgbWF2ZW4uanVuaXQuanZtYXJncyBpbiBwcm9qZWN0LnByb3BlcnRpZXMuCi0gICAgICAgIC8vIFRvIGNoYW5nZSB0aGUgc2V0dGluZ3MsIGVkaXQgdGhlIGxvZzRqLnByb3BlcnR5IGZpbGUKLSAgICAgICAgLy8gaW4gdGhlIHRlc3QtcmVzb3VyY2VzIGRpcmVjdG9yeS4KLSAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxEQkM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNlaURCQzsKLQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoU2ltcGxlU2VydmljZUltcGwuY2xhc3MpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiY01hcCk7Ci0gICAgICAgIGltcGxEQkMgPSBkYmNNYXAuZ2V0KAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLlNpbXBsZVNlcnZpY2VJbXBsIik7Ci0gICAgICAgIHNlaURCQyA9IGRiY01hcC5nZXQoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuU2ltcGxlU2VydmljZSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlSW1wbERCQygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbXBsREJDKTsKLSAgICAgICAgV2ViU2VydmljZSB3c0Fubm90ID0gaW1wbERCQy5nZXRXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0Fubm90KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW1wbGVTZXJ2aWNlIiwgd3NBbm5vdC5zZXJ2aWNlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEltcGxNZXRob2RzKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKGltcGxEQkMpOwotICAgICAgICBMaXN0PE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlPiBtZGNMaXN0ID0gc29ydExpc3QoaW1wbERCQy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBzb3J0TGlzdChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAzKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbWRjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8aW5pdD4iLCBtZGMuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgbWRjID0gbWRjTGlzdC5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZva2UiLCBtZGMuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbWRjLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgIG1kYyA9IG1kY0xpc3QuZ2V0KDIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kYyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW52b2tlMiIsIG1kYy5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIG1kYy5nZXRSZXR1cm5UeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SW1wbFBhcmFtcygpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpbXBsREJDKTsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCA9IHNvcnRMaXN0KGltcGxEQkMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAzKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjID0gbWRjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjKTsKLSAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZT4gcGRjTGlzdCA9IG1kYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBkY0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgbWRjID0gbWRjTGlzdC5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjKTsKLSAgICAgICAgcGRjTGlzdCA9IG1kYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBkY0xpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUgcGRjID0gcGRjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLlN0cmluZz4iLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgbWRjID0gbWRjTGlzdC5nZXQoMik7Ci0gICAgICAgIHBkY0xpc3QgPSBtZGMuZ2V0UGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGVMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwZGNMaXN0LnNpemUoKSwgMik7Ci0gICAgICAgIHBkYyA9IHBkY0xpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgICAgICBwZGMgPSBwZGNMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImludCIsIHBkYy5nZXRQYXJhbWV0ZXJUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlU0VJREJDKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKHNlaURCQyk7Ci0gICAgICAgIFdlYlNlcnZpY2Ugd3NBbm5vdCA9IHNlaURCQy5nZXRXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3c0Fubm90KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW1wbGVTZXJ2aWNlUG9ydCIsIHdzQW5ub3QubmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFNFSU1ldGhvZHMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VpREJDKTsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCA9IHNvcnRMaXN0KHNlaURCQy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBtZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZva2UiLCBtZGMuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbWRjLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjLmdldFdlYk1ldGhvZEFubm90KCkpOwotICAgICAgICBXZWJNZXRob2RBbm5vdCB3bUFubm90ID0gbWRjLmdldFdlYk1ldGhvZEFubm90KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW52b2tlIiwgd21Bbm5vdC5vcGVyYXRpb25OYW1lKCkpOwotICAgICAgICBtZGMgPSBtZGNMaXN0LmdldCgxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnZva2UyIiwgbWRjLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaW50IiwgbWRjLmdldFJldHVyblR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RTRUlQYXJhbXMoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2VpREJDKTsKLSAgICAgICAgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjTGlzdCA9IHNvcnRMaXN0KHNlaURCQy5nZXRNZXRob2REZXNjcmlwdGlvbnNMaXN0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1kY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMobWRjTGlzdC5zaXplKCksIDIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBtZGMgPSBtZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGMpOwotICAgICAgICBMaXN0PFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlPiBwZGNMaXN0ID0gbWRjLmdldFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkY0xpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocGRjTGlzdC5zaXplKCksIDEpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBwZGMgPSBwZGNMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+IiwgcGRjLmdldFBhcmFtZXRlclR5cGUoKSk7Ci0gICAgICAgIFdlYlBhcmFtQW5ub3Qgd3BBbm5vdCA9IHBkYy5nZXRXZWJQYXJhbUFubm90KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwod3BBbm5vdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZWNob1N0cmluZyIsIHdwQW5ub3QubmFtZSgpKTsKLSAgICAgICAgbWRjID0gbWRjTGlzdC5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjKTsKLSAgICAgICAgcGRjTGlzdCA9IG1kYy5nZXRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHBkY0xpc3Quc2l6ZSgpLCAyKTsKLSAgICAgICAgcGRjID0gcGRjTGlzdC5nZXQoMCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwZGMuZ2V0V2ViUGFyYW1Bbm5vdCgpKTsKLSAgICAgICAgcGRjID0gcGRjTGlzdC5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnQiLCBwZGMuZ2V0UGFyYW1ldGVyVHlwZSgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChwZGMuZ2V0V2ViUGFyYW1Bbm5vdCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0REJDSGllcmFyY2h5KCkgewotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoQ2hpbGRDbGFzcy5jbGFzcyk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY01hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBkYmMgPQotICAgICAgICAgICAgICAgIGRiY01hcC5nZXQoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuQ2hpbGRDbGFzcyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IG1kY0xpc3QgPSBzb3J0TGlzdChkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8aW5pdD4iLCBtZGNMaXN0LmdldCgwKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRvQWJzdHJhY3QiLCBtZGNMaXN0LmdldCgxKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImV4dHJhTWV0aG9kIiwgbWRjTGlzdC5nZXQoMikuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgZGJjID0gZGJjTWFwLmdldCgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5QYXJlbnRDbGFzcyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIG1kY0xpc3QgPSBzb3J0TGlzdChkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8aW5pdD4iLCBtZGNMaXN0LmdldCgwKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRvUGFyZW50QWJzdHJhY3QiLCBtZGNMaXN0LmdldCgxKS5nZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBkYmMgPSBkYmNNYXAuZ2V0KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLlNlcnZpY2VJbnRlcmZhY2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMpOwotICAgICAgICBtZGNMaXN0ID0gc29ydExpc3QoZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZGNMaXN0LnNpemUoKSwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZG9BYnN0cmFjdCIsIG1kY0xpc3QuZ2V0KDApLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGRiYyA9IGRiY01hcC5nZXQoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuQ29tbW9uU2VydmljZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIG1kY0xpc3QgPSBzb3J0TGlzdChkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJleHRyYU1ldGhvZCIsIG1kY0xpc3QuZ2V0KDApLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgIGRiYyA9IGRiY01hcC5nZXQoCi0gICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuUGFyZW50U2VydmljZUludGVyZmFjZSIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIG1kY0xpc3QgPSBzb3J0TGlzdChkYmMuZ2V0TWV0aG9kRGVzY3JpcHRpb25zTGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtZGNMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1kY0xpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJkb1BhcmVudEFic3RyYWN0IiwgbWRjTGlzdC5nZXQoMCkuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgZGJjID0gZGJjTWFwLmdldCgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5BYnN0cmFjdFNlcnZpY2UiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkYmMpOwotICAgICAgICBtZGNMaXN0ID0gc29ydExpc3QoZGJjLmdldE1ldGhvZERlc2NyaXB0aW9uc0xpc3QoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobWRjTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtZGNMaXN0LnNpemUoKSwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPGluaXQ+IiwgbWRjTGlzdC5nZXQoMCkuZ2V0TWV0aG9kTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb21lQWJzdHJhY3RNZXRob2QiLCBtZGNMaXN0LmdldCgxKS5nZXRNZXRob2ROYW1lKCkpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gc29ydExpc3QoTGlzdDxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4gbWRjKSB7Ci0gICAgICAgIENvbXBhcmF0b3I8TWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU+IGMgPSBuZXcgQ29tcGFyYXRvcjxNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZT4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbWRjMSwgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgbzIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWRjMS5nZXRNZXRob2ROYW1lKCkuY29tcGFyZVRvKG8yLmdldE1ldGhvZE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQobWRjLCBjKTsKLSAgICAgICAgcmV0dXJuIG1kYzsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lID0gIlNpbXBsZVNlcnZpY2UiLCBlbmRwb2ludEludGVyZmFjZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLiIgKwotICAgICAgICAiZGVzY3JpcHRpb24uYnVpbGRlci5jb252ZXJ0ZXIuU2ltcGxlU2VydmljZSIpCi1jbGFzcyBTaW1wbGVTZXJ2aWNlSW1wbCB7Ci0gICAgcHVibGljIFNpbXBsZVNlcnZpY2VJbXBsKCkgewotICAgIH0KLQotICAgIDsKLQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKExpc3Q8U3RyaW5nPiBteVBhcmFtKSB7Ci0gICAgICAgIHJldHVybiBteVBhcmFtLmdldCgwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGludm9rZTIoaW50IG51bTEsIGludCBudW0yKSB7Ci0gICAgICAgIHJldHVybiBudW0xICsgbnVtMjsKLSAgICB9Ci19Ci0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiU2ltcGxlU2VydmljZVBvcnQiKQotaW50ZXJmYWNlIFNpbXBsZVNlcnZpY2UgewotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJpbnZva2UiKQotICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKEBXZWJQYXJhbShuYW1lID0gImVjaG9TdHJpbmciKSBMaXN0PFN0cmluZz4gYXJnMSk7Ci0KLSAgICBwdWJsaWMgaW50IGludm9rZTIoaW50IGFyZzEsIGludCBhcmcyKTsKLX0KLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiSW5oZXJpdGFuY2VUZXN0Q2hpbGQiKQotY2xhc3MgQ2hpbGRDbGFzcyBleHRlbmRzIFBhcmVudENsYXNzIGltcGxlbWVudHMgU2VydmljZUludGVyZmFjZSwgQ29tbW9uU2VydmljZSB7Ci0gICAgcHVibGljIENoaWxkQ2xhc3MoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9BYnN0cmFjdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHRyYU1ldGhvZCgpIHsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvdGVjdGVkQ2hpbGRNZXRob2QoKSB7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHByaXZhdGVDaGlsZE1ldGhvZCgpIHsgICAgICAgIAotICAgIH0KLX0KLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiSW5oZXJ0aWFuY2VUZXN0UGFyZW50IikKLWNsYXNzIFBhcmVudENsYXNzIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlIGltcGxlbWVudHMgUGFyZW50U2VydmljZUludGVyZmFjZSB7Ci0gICAgcHVibGljIFBhcmVudENsYXNzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvUGFyZW50QWJzdHJhY3QoKSB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvdGVjdGVkUGFyZW50TWV0aG9kKCkgeyAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcml2YXRlUGFyZW50TWV0aG9kKCkgeyAgICAgICAgCi0gICAgfQotfQotCi1pbnRlcmZhY2UgU2VydmljZUludGVyZmFjZSB7Ci0gICAgcHVibGljIHZvaWQgZG9BYnN0cmFjdCgpOwotfQotCi1pbnRlcmZhY2UgQ29tbW9uU2VydmljZSB7Ci0gICAgcHVibGljIHZvaWQgZXh0cmFNZXRob2QoKTsKLX0KLQotaW50ZXJmYWNlIFBhcmVudFNlcnZpY2VJbnRlcmZhY2UgewotICAgIHB1YmxpYyB2b2lkIGRvUGFyZW50QWJzdHJhY3QoKTsKLX0KLQotY2xhc3MgQWJzdHJhY3RTZXJ2aWNlIHsKLSAgICBwdWJsaWMgdm9pZCBzb21lQWJzdHJhY3RNZXRob2QoKSB7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MWU4NjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZWNobyI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZWNobyIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJ0ZXh0Ig0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgRWNobyB7DQotDQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSwgbmlsbGFibGUgPSB0cnVlKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMge0BsaW5rIFN0cmluZyB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotICAgICAgICByZXR1cm4gdGV4dDsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLnRleHQgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvUG9ydC5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNob1BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzZDZiZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvUG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbS5Nb2RlOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOw0KLQ0KLQ0KLS8qKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEpBWFdTIFNJLiBKQVgtV1MgUkkgMi4wLWIyNi1lYTMgR2VuZXJhdGVkIHNvdXJjZSB2ZXJzaW9uOiAyLjAgKi8NCi1AV2ViU2VydmljZShuYW1lID0gIkVjaG9Qb3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwNCi0gICAgICAgICAgICB3c2RsTG9jYXRpb24gPSAiXFx3b3JrXFxhcHBzXFxlY2xpcHNlXFx3b3Jrc3BhY2VcXGF4aXMyLWxpdmVcXG1vZHVsZXNcXGpheHdzXFx0ZXN0LXJlc291cmNlc1xcd3NkbFxcV1NETFRlc3RzLndzZGwiKQ0KLXB1YmxpYyBpbnRlcmZhY2UgRWNob1BvcnQgew0KLQ0KLQ0KLSAgICAvKiogQHBhcmFtIHRleHQgICovDQotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJFY2hvIiwgYWN0aW9uID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzL2VjaG8iKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gIkVjaG8iLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLA0KLSAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMuRWNobyIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gIkVjaG9SZXNwb25zZSIsDQotICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rlc3RzIiwNCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInRleHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgbW9kZSA9IE1vZGUuSU5PVVQpIEhvbGRlcjxTdHJpbmc+IHRleHQpOw0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvUmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9SZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc1MzExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9SZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvUmVzcG9uc2UgY29tcGxleCB0eXBlLg0KLSAqIDxwLz4NCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIDxwLz4NCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJlY2hvUmVzcG9uc2UiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gImVjaG9SZXNwb25zZSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJ0ZXh0Ig0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgRWNob1Jlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlLCBuaWxsYWJsZSA9IHRydWUpDQotICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5Lg0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcyB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgIHJldHVybiB0ZXh0Ow0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzIHtAbGluayBTdHJpbmcgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMudGV4dCA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9TZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk1MDI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL0VjaG9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmVjaG87DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50Ow0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKiogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKQVhXUyBTSS4gSkFYLVdTIFJJIDIuMC1iMjYtZWEzIEdlbmVyYXRlZCBzb3VyY2UgdmVyc2lvbjogMi4wICovDQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJFY2hvU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsDQotICAgICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uID0gIlxcd29ya1xcYXBwc1xcZWNsaXBzZVxcd29ya3NwYWNlXFxheGlzMi1saXZlXFxtb2R1bGVzXFxqYXh3c1xcdGVzdC1yZXNvdXJjZXNcXHdzZGxcXFdTRExUZXN0cy53c2RsIikNCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UNCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBXU0RMX0xPQ0FUSU9OOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBFQ0hPU0VSVklDRSA9DQotICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvU2VydmljZSIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBFQ0hPUE9SVCA9IG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNob1BvcnQiKTsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPQ0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFVSTCgiZmlsZTovQzovd29yay9hcHBzL2VjbGlwc2Uvd29ya3NwYWNlL2F4aXMyLWxpdmUvbW9kdWxlcy9qYXh3cy90ZXN0LXJlc291cmNlcy93c2RsL1dTRExUZXN0cy53c2RsIik7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBXU0RMX0xPQ0FUSU9OID0gdXJsOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBFY2hvU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlKCkgew0KLSAgICAgICAgc3VwZXIoV1NETF9MT0NBVElPTiwgRUNIT1NFUlZJQ0UpOw0KLSAgICB9DQotDQotICAgIC8qKiBAcmV0dXJuIHJldHVybnMgRWNob1BvcnQgKi8NCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiRWNob1BvcnQiKQ0KLSAgICBwdWJsaWMgRWNob1BvcnQgZ2V0RWNob1BvcnQoKSB7DQotICAgICAgICByZXR1cm4gKEVjaG9Qb3J0KXN1cGVyLmdldFBvcnQoRUNIT1BPUlQsIEVjaG9Qb3J0LmNsYXNzKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvU2VydmljZUltcGxXaXRoU0VJLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9FY2hvU2VydmljZUltcGxXaXRoU0VJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjkyM2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vRWNob1NlcnZpY2VJbXBsV2l0aFNFSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvU2VydmljZSIsIGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uZWNoby5FY2hvUG9ydCIpDQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlSW1wbFdpdGhTRUkgew0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKEhvbGRlcjxTdHJpbmc+IHRleHQpIHsNCi0gICAgICAgIHJldHVybjsNCi0gICAgfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9PYmplY3RGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzgwZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2VjaG8vT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvOw0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZQ0KLSAqIGdlbmVyYXRlZCBpbiB0aGUgb3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cyBwYWNrYWdlLiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8NCi0gKiBwcm9ncmFtYXRpY2FsbHkgY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24gZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YQ0KLSAqIHJlcHJlc2VudGF0aW9uIG9mIFhNTCBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMgYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nDQotICogdGhlIGJpbmRpbmcgb2Ygc2NoZW1hIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMNCi0gKiBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4NCi0gKi8NCi1AWG1sUmVnaXN0cnkNCi1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7DQotDQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9FY2hvUmVzcG9uc2VfUU5BTUUgPQ0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCAiRWNob1Jlc3BvbnNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9FY2hvX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsICJFY2hvIik7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMNCi0gICAgICogZm9yIHBhY2thZ2U6IG9yZy5hcGFjaGUud3MuYXhpczIudGVzdHMNCi0gICAgICovDQotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgew0KLSAgICB9DQotDQotICAgIC8qKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVjaG9SZXNwb25zZSB9ICovDQotICAgIHB1YmxpYyBFY2hvUmVzcG9uc2UgY3JlYXRlRWNob1Jlc3BvbnNlKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBFY2hvUmVzcG9uc2UoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFY2hvIH0gKi8NCi0gICAgcHVibGljIEVjaG8gY3JlYXRlRWNobygpIHsNCi0gICAgICAgIHJldHVybiBuZXcgRWNobygpOw0KLSAgICB9DQotDQotICAgIC8qKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRWNob1Jlc3BvbnNlIH17QGNvZGUgPn19ICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiLCBuYW1lID0gIkVjaG9SZXNwb25zZSIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxFY2hvUmVzcG9uc2U+IGNyZWF0ZUVjaG9SZXNwb25zZShFY2hvUmVzcG9uc2UgdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RWNob1Jlc3BvbnNlPihfRWNob1Jlc3BvbnNlX1FOQU1FLCBFY2hvUmVzcG9uc2UuY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKiogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEVjaG8gfXtAY29kZSA+fX0gKi8NCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi90ZXN0cyIsIG5hbWUgPSAiRWNobyIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxFY2hvPiBjcmVhdGVFY2hvKEVjaG8gdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RWNobz4oX0VjaG9fUU5BTUUsIEVjaG8uY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZWNoby9wYWNrYWdlLWluZm8uamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmI3ZDQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9lY2hvL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdGVzdHMiKQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5lY2hvOw0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL0FkZHJlc3NpbmdGZWF0dXJlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL0FkZHJlc3NpbmdGZWF0dXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5MmY2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9BZGRyZXNzaW5nRmVhdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmZlYXR1cmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nOwotCi1wdWJsaWMgY2xhc3MgQWRkcmVzc2luZ0ZlYXR1cmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnMgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9hZGRyZXNzaW5nIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSA9ICJEZWZhdWx0U2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbGFpblNlcnZpY2VQb3J0TmFtZSA9ICJQbGFpblNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUgPSAiRGlzYWJsZWRTZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlcXVpcmVkU2VydmljZVBvcnROYW1lID0gIlJlcXVpcmVkU2VydmljZVBvcnQiOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0Fubm90YXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKERlZmF1bHRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkZWZhdWx0U2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBhc3NlcnROdWxsKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBhc3NlcnROdWxsKHJlcXVpcmVkUGFyYW0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhaW5Bbm5vdGF0aW9uKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihQbGFpblNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHBsYWluU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1VOU1BFQ0lGSUVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGlzYWJsZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1VOU1BFQ0lGSUVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUmVxdWlyZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCByZXF1aXJlZFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGRpc2FibGVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCwgcmVxdWlyZWQpOwotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPWRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgY2xhc3MgRGVmYXVsdFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1wbGFpblNlcnZpY2VQb3J0TmFtZSkKLSAgICBAQWRkcmVzc2luZwotICAgIGNsYXNzIFBsYWluU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPWRpc2FibGVkU2VydmljZVBvcnROYW1lKQotICAgIEBBZGRyZXNzaW5nKGVuYWJsZWQ9ZmFsc2UpCi0gICAgY2xhc3MgRGlzYWJsZWRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9cmVxdWlyZWRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgQEFkZHJlc3NpbmcocmVxdWlyZWQ9dHJ1ZSkKLSAgICBjbGFzcyBSZXF1aXJlZFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9Cb3RoQWRkcmVzc2luZ0ZlYXR1cmVzVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL0JvdGhBZGRyZXNzaW5nRmVhdHVyZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQ4NWQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL0JvdGhBZGRyZXNzaW5nRmVhdHVyZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5mZWF0dXJlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLlN1Ym1pc3Npb25BZGRyZXNzaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7Ci0KLXB1YmxpYyBjbGFzcyBCb3RoQWRkcmVzc2luZ0ZlYXR1cmVzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5zID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2ZlYXR1cmUvYWRkcmVzc2luZyI7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUgPSAiRGVmYXVsdFNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGxhaW5TZXJ2aWNlUG9ydE5hbWUgPSAiUGxhaW5TZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRpc2FibGVkU2VydmljZVBvcnROYW1lID0gIkRpc2FibGVkU2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXF1aXJlZFNlcnZpY2VQb3J0TmFtZSA9ICJSZXF1aXJlZFNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWl4ZWRTZXJ2aWNlUG9ydE5hbWUgPSAibWl4ZWRTZXJ2aWNlUG9ydCI7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE5vQW5ub3RhdGlvbigpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oRGVmYXVsdFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIGFzc2VydE51bGwoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIGFzc2VydE51bGwocmVxdWlyZWRQYXJhbSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkFubm90YXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKFBsYWluU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgcGxhaW5TZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUodmVyc2lvblBhcmFtKTsKLSAgICAgICAgU3RyaW5nIGRpc2FibGVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIFN0cmluZyByZXF1aXJlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHJlcXVpcmVkUGFyYW0pOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCh2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGRpc2FibGVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19VTlNQRUNJRklFRCwgcmVxdWlyZWQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWQoKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKERpc2FibGVkU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIFBhcmFtZXRlciB2ZXJzaW9uUGFyYW0gID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuV1NfQUREUkVTU0lOR19WRVJTSU9OKTsKLSAgICAgICAgUGFyYW1ldGVyIGRpc2FibGVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5ESVNBQkxFX0FERFJFU1NJTkdfRk9SX0lOX01FU1NBR0VTKTsKLSAgICAgICAgUGFyYW1ldGVyIHJlcXVpcmVkUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVNRU5UX1BBUkFNRVRFUik7Ci0KLSAgICAgICAgU3RyaW5nIHZlcnNpb24gID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUodmVyc2lvblBhcmFtKTsKLSAgICAgICAgU3RyaW5nIGRpc2FibGVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUoZGlzYWJsZWRQYXJhbSk7Ci0gICAgICAgIFN0cmluZyByZXF1aXJlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHJlcXVpcmVkUGFyYW0pOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCh2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1VOU1BFQ0lGSUVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUmVxdWlyZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCByZXF1aXJlZFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROdWxsKHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oTWl4ZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBtaXhlZFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5GaW5hbC5XU0FfTkFNRVNQQUNFLCB2ZXJzaW9uKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIGRpc2FibGVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFRCwgcmVxdWlyZWQpOwotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPWRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgY2xhc3MgRGVmYXVsdFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1wbGFpblNlcnZpY2VQb3J0TmFtZSkKLSAgICBAQWRkcmVzc2luZwotICAgIEBTdWJtaXNzaW9uQWRkcmVzc2luZwotICAgIGNsYXNzIFBsYWluU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPWRpc2FibGVkU2VydmljZVBvcnROYW1lKQotICAgIEBBZGRyZXNzaW5nKGVuYWJsZWQ9ZmFsc2UpCi0gICAgQFN1Ym1pc3Npb25BZGRyZXNzaW5nKGVuYWJsZWQ9ZmFsc2UpCi0gICAgY2xhc3MgRGlzYWJsZWRTZXJ2aWNlIHsKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9cmVxdWlyZWRTZXJ2aWNlUG9ydE5hbWUpCi0gICAgQEFkZHJlc3NpbmcocmVxdWlyZWQ9dHJ1ZSkKLSAgICBAU3VibWlzc2lvbkFkZHJlc3NpbmcocmVxdWlyZWQ9dHJ1ZSkKLSAgICBjbGFzcyBSZXF1aXJlZFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1taXhlZFNlcnZpY2VQb3J0TmFtZSkKLSAgICBAQWRkcmVzc2luZyhyZXF1aXJlZD10cnVlKQotICAgIEBTdWJtaXNzaW9uQWRkcmVzc2luZyhlbmFibGVkPWZhbHNlKQotICAgIGNsYXNzIE1peGVkU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL01UT01GZWF0dXJlVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL01UT01GZWF0dXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxYzVjNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9NVE9NRmVhdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5mZWF0dXJlOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuTVRPTTsNCi0NCi1wdWJsaWMgY2xhc3MgTVRPTUZlYXR1cmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0gICAgDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBucyA9ICJodHRwOi8vamF4d3MuYXhpczIuYXBhY2hlLm9yZy9tZXRhZGF0YS9mZWF0dXJlL210b20iOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUgPSAiRGVmYXVsdFNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBsYWluU2VydmljZVBvcnROYW1lID0gIlBsYWluU2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUgPSAiRGlzYWJsZWRTZXJ2aWNlUG9ydCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0aHJlc2hvbGRTZXJ2aWNlUG9ydE5hbWUgPSAiVGhyZXNob2xkU2VydmljZVBvcnQiOw0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgYmFkVGhyZXNob2xkU2VydmljZVBvcnROYW1lID0gIkJhZFRocmVzaG9sZFNlcnZpY2VQb3J0IjsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0Fubm90YXRpb24oKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKERlZmF1bHRTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkZWZhdWx0U2VydmljZVBvcnROYW1lKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiBzaG91bGQgbm90IGJlIG51bGwuIiwgZWQgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIGJvb2xlYW4gbXRvbUVuYWJsZWQgPSBlZC5pc01UT01FbmFibGVkKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHNob3VsZCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0IiwgbXRvbUVuYWJsZWQgPT0gZmFsc2UpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhaW5Bbm5vdGF0aW9uKCkgew0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihQbGFpblNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHBsYWluU2VydmljZVBvcnROYW1lKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiBzaG91bGQgbm90IGJlIG51bGwuIiwgZWQgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIGJvb2xlYW4gbXRvbUVuYWJsZWQgPSBlZC5pc01UT01FbmFibGVkKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJATVRPTSBpbmNsdWRlZCwgYnV0IHdhcyBub3QgZW5hYmxlZC4iLCBtdG9tRW5hYmxlZCA9PSB0cnVlKTsNCi0gICAgICAgIA0KLSAgICAgICAgaW50IHRocmVzaG9sZCA9IGVkLmdldE1UT01UaHJlc2hvbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIk1UT00gdGhyZXNob2xkIHNob3VsZCBiZSAwIG9yIGxlc3MuIiwgdGhyZXNob2xkIDw9IDApOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWQoKSB7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKERpc2FibGVkU2VydmljZS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgbnVsbC4iLCBlZCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgYm9vbGVhbiBtdG9tRW5hYmxlZCA9IGVkLmlzTVRPTUVuYWJsZWQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIkBNVE9NIGluY2x1ZGVkLCBhbmQgc2hvdWxkIGJlIGRpc2FibGVkLiIsIG10b21FbmFibGVkID09IGZhbHNlKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFRocmVzaG9sZCgpIHsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oVGhyZXNob2xkU2VydmljZS5jbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgdGhyZXNob2xkU2VydmljZVBvcnROYW1lKSk7DQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgRW5kcG9pbnREZXNjcmlwdGlvbiBzaG91bGQgbm90IGJlIG51bGwuIiwgZWQgIT0gbnVsbCk7DQotICAgICAgICANCi0gICAgICAgIGludCB0aHJlc2hvbGQgPSBlZC5nZXRNVE9NVGhyZXNob2xkKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJNVE9NIHRocmVzaG9sZCBzaG91bGQgYmUgMjAwMC4iLCB0aHJlc2hvbGQgPT0gMjAwMDApOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkVGhyZXNob2xkKCkgew0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihCYWRUaHJlc2hvbGRTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBiYWRUaHJlc2hvbGRTZXJ2aWNlUG9ydE5hbWUpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgbnVsbC4iLCBlZCAhPSBudWxsKTsNCi0gICAgICAgIA0KLSAgICAgICAgaW50IHRocmVzaG9sZCA9IGVkLmdldE1UT01UaHJlc2hvbGQoKTsNCi0gICAgICAgIGFzc2VydFRydWUoIk1UT00gdGhyZXNob2xkIHNob3VsZCBiZSBbMF0sIGJ1dCB3YXMgWyIgKyB0aHJlc2hvbGQgKyAiXS4iLCB0aHJlc2hvbGQgPT0gMCk7DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSkNCi0gICAgY2xhc3MgRGVmYXVsdFNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7DQotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLCBwb3J0TmFtZT1wbGFpblNlcnZpY2VQb3J0TmFtZSkNCi0gICAgQE1UT00NCi0gICAgY2xhc3MgUGxhaW5TZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgew0KLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUpDQotICAgIEBNVE9NKGVuYWJsZWQ9ZmFsc2UpDQotICAgIGNsYXNzIERpc2FibGVkU2VydmljZSB7DQotICAgICAgICBwdWJsaWMgZG91YmxlIGdldFF1b3RlKFN0cmluZyBzeW1ib2wpIHsNCi0gICAgICAgICAgICByZXR1cm4gMTAxLjAxOw0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIA0KLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXRocmVzaG9sZFNlcnZpY2VQb3J0TmFtZSkNCi0gICAgQE1UT00odGhyZXNob2xkPTIwMDAwKQ0KLSAgICBjbGFzcyBUaHJlc2hvbGRTZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgew0KLSAgICAgICAgICAgIHJldHVybiAxMDEuMDE7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9YmFkVGhyZXNob2xkU2VydmljZVBvcnROYW1lKQ0KLSAgICBATVRPTSh0aHJlc2hvbGQ9LTEwMDApDQotICAgIGNsYXNzIEJhZFRocmVzaG9sZFNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXRRdW90ZShTdHJpbmcgc3ltYm9sKSB7DQotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9SZXNwZWN0QmluZGluZ0ZlYXR1cmVUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ZlYXR1cmUvUmVzcGVjdEJpbmRpbmdGZWF0dXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2Nzc4Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9SZXNwZWN0QmluZGluZ0ZlYXR1cmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uZmVhdHVyZTsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLmNvbnZlcnRlci5KYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy51dGlsLldTREw0SldyYXBwZXI7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmc7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBSZXNwZWN0QmluZGluZ0ZlYXR1cmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5zID0gImh0dHA6Ly9qYXh3cy5heGlzMi5hcGFjaGUub3JnL21ldGFkYXRhL2ZlYXR1cmUvcmVzcGVjdGJpbmRpbmciOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lID0gIkVjaG9NZXNzYWdlU2VydmljZSI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwb3J0VHlwZU5hbWUgPSAiRWNob01lc3NhZ2VQb3J0VHlwZSI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGxhaW5TZXJ2aWNlUG9ydE5hbWUgPSAiUGxhaW5TZXJ2aWNlUG9ydCI7DQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSA9ICJEaXNhYmxlZFNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUgPSAiRGVmYXVsdFNlcnZpY2VQb3J0IjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbXBsZXRlU2VydmljZVBvcnROYW1lID0gIkNvbXBsZXRlU2VydmljZVBvcnQiOw0KLSAgICANCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdzZGxMb2NhdGlvbiA9ICJ0ZXN0LXJlc291cmNlcy93c2RsL1Jlc3BlY3RCaW5kaW5nLndzZGwiOw0KLQ0KLSAgICAvKg0KLSAgICAgKiBSZXNwZWN0QmluZGluZyBwcm9jZXNzaW5nIHNob3VsZCBmYWlsIGJlY2F1c2UgYSBXU0RMIGZpbGUgd2FzIG5vdCBpbmNsdWRlZC4NCi0gICAgICovDQotDQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKFBsYWluU2VydmljZS5jbGFzcyk7DQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBtYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOw0KLSAgICAgICAgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbWFwLmdldChQbGFpblNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgVVJMIHdzZGxVcmwgPSBuZXcgVVJMKCJmaWxlOi4vIiArIHdzZGxMb2NhdGlvbik7DQotICAgICAgICBXU0RMNEpXcmFwcGVyIHdyYXBwZXIgPSBuZXcgV1NETDRKV3JhcHBlcih3c2RsVXJsLCBmYWxzZSwgMCk7DQotICAgICAgICANCi0gICAgICAgIGNvbXBvc2l0ZS5zZXR3c2RsVVJMKHdzZGxVcmwpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldFdzZGxEZWZpbml0aW9uKHdyYXBwZXIuZ2V0RGVmaW5pdGlvbigpKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNkTGlzdCA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHNkTGlzdCA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKG1hcCk7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAvLyBBbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQuDQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBTZXJ2aWNlRGVzY3JpcHRpb25zIHNob3VsZCBub3QgaGF2ZSBiZWVuIGJ1aWx0LiIsIHNkTGlzdCA9PSBudWxsKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3BlY3RCaW5kaW5nRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgICAgIEphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihEaXNhYmxlZFNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gbWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsNCi0gICAgICAgIA0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG1hcC5nZXQoRGlzYWJsZWRTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTCgiZmlsZTouLyIgKyB3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgV1NETDRKV3JhcHBlciB3cmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIod3NkbFVybCwgZmFsc2UsIDApOw0KLSAgICAgICAgDQotICAgICAgICBjb21wb3NpdGUuc2V0d3NkbFVSTCh3c2RsVXJsKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRXc2RsRGVmaW5pdGlvbih3cmFwcGVyLmdldERlZmluaXRpb24oKSk7DQotICAgICAgICANCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZExpc3QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChtYXApOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gc2RMaXN0LmdldCgwKTsNCi0gICAgICAgIA0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkaXNhYmxlZFNlcnZpY2VQb3J0TmFtZSkpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEVuZHBvaW50RGVzY3JpcHRpb24gc2hvdWxkIG5vdCBiZSBudWxsLiIsIGVkICE9IG51bGwpOw0KLQ0KLSAgICAgICAgYm9vbGVhbiByZXNwZWN0ID0gZWQucmVzcGVjdEJpbmRpbmcoKTsNCi0gICAgICAgIGFzc2VydEZhbHNlKCJTdHJpY3QgYmluZGluZyBzdXBwb3J0IHNob3VsZCBiZSBESVNBQkxFRC4iLCByZXNwZWN0KTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc3BlY3RCaW5kaW5nRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKERlZmF1bHRTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IG1hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7DQotICAgICAgICANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBtYXAuZ2V0KERlZmF1bHRTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7DQotICAgICAgICANCi0gICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTCgiZmlsZTouLyIgKyB3c2RsTG9jYXRpb24pOw0KLSAgICAgICAgV1NETDRKV3JhcHBlciB3cmFwcGVyID0gbmV3IFdTREw0SldyYXBwZXIod3NkbFVybCwgZmFsc2UsIDApOw0KLSAgICAgICAgDQotICAgICAgICBjb21wb3NpdGUuc2V0d3NkbFVSTCh3c2RsVXJsKTsNCi0gICAgICAgIGNvbXBvc2l0ZS5zZXRXc2RsRGVmaW5pdGlvbih3cmFwcGVyLmdldERlZmluaXRpb24oKSk7DQotICAgICAgICANCi0gICAgICAgIExpc3Q8U2VydmljZURlc2NyaXB0aW9uPiBzZExpc3QgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBzZExpc3QgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChtYXApOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gQW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkLg0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKCJUaGUgU2VydmljZURlc2NyaXB0aW9ucyBzaG91bGQgbm90IGhhdmUgYmVlbiBidWlsdC4iLCBzZExpc3QgPT0gbnVsbCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwZWN0QmluZGluZ0NvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIoQ29tcGxldGVTZXJ2aWNlLmNsYXNzKTsNCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IG1hcCA9IGNvbnZlcnRlci5wcm9kdWNlREJDKCk7DQotICAgICAgICANCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBtYXAuZ2V0KENvbXBsZXRlU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOw0KLSAgICAgICAgDQotICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoImZpbGU6Li8iICsgd3NkbExvY2F0aW9uKTsNCi0gICAgICAgIFdTREw0SldyYXBwZXIgd3JhcHBlciA9IG5ldyBXU0RMNEpXcmFwcGVyKHdzZGxVcmwsIGZhbHNlLCAwKTsNCi0gICAgICAgIA0KLSAgICAgICAgY29tcG9zaXRlLnNldHdzZGxVUkwod3NkbFVybCk7DQotICAgICAgICBjb21wb3NpdGUuc2V0V3NkbERlZmluaXRpb24od3JhcHBlci5nZXREZWZpbml0aW9uKCkpOw0KLSAgICAgICAgDQotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2RMaXN0ID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbkZyb21EQkNNYXAobWFwKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IHNkTGlzdC5nZXQoMCk7DQotICAgICAgICANCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZWQgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uKG5ldyBRTmFtZShucywgY29tcGxldGVTZXJ2aWNlUG9ydE5hbWUpKTsNCi0gICAgICAgIGFzc2VydFRydWUoIlRoZSBFbmRwb2ludERlc2NyaXB0aW9uIHNob3VsZCBub3QgYmUgbnVsbC4iLCBlZCAhPSBudWxsKTsNCi0NCi0gICAgICAgIGJvb2xlYW4gcmVzcGVjdCA9IGVkLnJlc3BlY3RCaW5kaW5nKCk7DQotICAgICAgICBhc3NlcnRUcnVlKCJTdHJpY3QgYmluZGluZyBzdXBwb3J0IHNob3VsZCBiZSBFTkFCTEVELiIsIHJlc3BlY3QpOw0KLSAgICB9DQotICAgIA0KLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXBsYWluU2VydmljZVBvcnROYW1lKQ0KLSAgICBAUmVzcGVjdEJpbmRpbmcNCi0gICAgY2xhc3MgUGxhaW5TZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgDQotICAgICAgICBzZXJ2aWNlTmFtZT1zZXJ2aWNlTmFtZSwNCi0gICAgICAgIHBvcnROYW1lPWRlZmF1bHRTZXJ2aWNlUG9ydE5hbWUsIA0KLSAgICAgICAgbmFtZT1wb3J0VHlwZU5hbWUsIA0KLSAgICAgICAgd3NkbExvY2F0aW9uPXdzZGxMb2NhdGlvbikNCi0gICAgQFJlc3BlY3RCaW5kaW5nDQotICAgIGNsYXNzIERlZmF1bHRTZXJ2aWNlIHsNCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywNCi0gICAgICAgIHNlcnZpY2VOYW1lPXNlcnZpY2VOYW1lLA0KLSAgICAgICAgcG9ydE5hbWU9ZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUsDQotICAgICAgICBuYW1lPXBvcnRUeXBlTmFtZSwNCi0gICAgICAgIHdzZGxMb2NhdGlvbj13c2RsTG9jYXRpb24pDQotICAgIEBSZXNwZWN0QmluZGluZyhlbmFibGVkPWZhbHNlKQ0KLSAgICBjbGFzcyBEaXNhYmxlZFNlcnZpY2Ugew0KLSAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgIHJldHVybiAiIjsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgQFdlYlNlcnZpY2UodGFyZ2V0TmFtZXNwYWNlPW5zLA0KLSAgICAgICAgc2VydmljZU5hbWU9c2VydmljZU5hbWUsDQotICAgICAgICBwb3J0TmFtZT1jb21wbGV0ZVNlcnZpY2VQb3J0TmFtZSwNCi0gICAgICAgIG5hbWU9cG9ydFR5cGVOYW1lLA0KLSAgICAgICAgd3NkbExvY2F0aW9uPXdzZGxMb2NhdGlvbikNCi0gICAgQFJlc3BlY3RCaW5kaW5nDQotICAgIEBBZGRyZXNzaW5nDQotICAgIGNsYXNzIENvbXBsZXRlU2VydmljZSB7DQotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGlucHV0KSB7DQotICAgICAgICAgICAgcmV0dXJuICIiOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL1N1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vZmVhdHVyZS9TdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzYwMTllLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9mZWF0dXJlL1N1Ym1pc3Npb25BZGRyZXNzaW5nRmVhdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmZlYXR1cmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcuU3VibWlzc2lvbkFkZHJlc3Npbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBTdWJtaXNzaW9uQWRkcmVzc2luZ0ZlYXR1cmVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbnMgPSAiaHR0cDovL2pheHdzLmF4aXMyLmFwYWNoZS5vcmcvbWV0YWRhdGEvZmVhdHVyZS9hZGRyZXNzaW5nIjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSA9ICJEZWZhdWx0U2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbGFpblNlcnZpY2VQb3J0TmFtZSA9ICJQbGFpblNlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlzYWJsZWRTZXJ2aWNlUG9ydE5hbWUgPSAiRGlzYWJsZWRTZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJlcXVpcmVkU2VydmljZVBvcnROYW1lID0gIlJlcXVpcmVkU2VydmljZVBvcnQiOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0Fubm90YXRpb24oKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCAgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKERlZmF1bHRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCBkZWZhdWx0U2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0TnVsbCh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBhc3NlcnROdWxsKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBhc3NlcnROdWxsKHJlcXVpcmVkUGFyYW0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhaW5Bbm5vdGF0aW9uKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihQbGFpblNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIHBsYWluU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLlN1Ym1pc3Npb24uV1NBX05BTUVTUEFDRSwgdmVyc2lvbik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmFsc2UiLCBkaXNhYmxlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfVU5TUEVDSUZJRUQsIHJlcXVpcmVkKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkKCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihEaXNhYmxlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVkID0gc2QuZ2V0RW5kcG9pbnREZXNjcmlwdGlvbihuZXcgUU5hbWUobnMsIGRpc2FibGVkU2VydmljZVBvcnROYW1lKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQpOwotICAgICAgICAKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBlZC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvblBhcmFtICA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLldTX0FERFJFU1NJTkdfVkVSU0lPTik7Ci0gICAgICAgIFBhcmFtZXRlciBkaXNhYmxlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuRElTQUJMRV9BRERSRVNTSU5HX0ZPUl9JTl9NRVNTQUdFUyk7Ci0gICAgICAgIFBhcmFtZXRlciByZXF1aXJlZFBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKEFkZHJlc3NpbmdDb25zdGFudHMuQUREUkVTU0lOR19SRVFVSVJFTUVOVF9QQVJBTUVURVIpOwotCi0gICAgICAgIFN0cmluZyB2ZXJzaW9uICA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKHZlcnNpb25QYXJhbSk7Ci0gICAgICAgIFN0cmluZyBkaXNhYmxlZCA9IFV0aWxzLmdldFBhcmFtZXRlclZhbHVlKGRpc2FibGVkUGFyYW0pOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShyZXF1aXJlZFBhcmFtKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhBZGRyZXNzaW5nQ29uc3RhbnRzLkZpbmFsLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1VOU1BFQ0lGSUVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZCgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkICA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oUmVxdWlyZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24obmV3IFFOYW1lKG5zLCByZXF1aXJlZFNlcnZpY2VQb3J0TmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVkKTsKLSAgICAgICAgCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gZWQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgUGFyYW1ldGVyIHZlcnNpb25QYXJhbSAgPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoQWRkcmVzc2luZ0NvbnN0YW50cy5XU19BRERSRVNTSU5HX1ZFUlNJT04pOwotICAgICAgICBQYXJhbWV0ZXIgZGlzYWJsZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkRJU0FCTEVfQUREUkVTU0lOR19GT1JfSU5fTUVTU0FHRVMpOwotICAgICAgICBQYXJhbWV0ZXIgcmVxdWlyZWRQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihBZGRyZXNzaW5nQ29uc3RhbnRzLkFERFJFU1NJTkdfUkVRVUlSRU1FTlRfUEFSQU1FVEVSKTsKLQotICAgICAgICBTdHJpbmcgdmVyc2lvbiAgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZSh2ZXJzaW9uUGFyYW0pOwotICAgICAgICBTdHJpbmcgZGlzYWJsZWQgPSBVdGlscy5nZXRQYXJhbWV0ZXJWYWx1ZShkaXNhYmxlZFBhcmFtKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gVXRpbHMuZ2V0UGFyYW1ldGVyVmFsdWUocmVxdWlyZWRQYXJhbSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5TdWJtaXNzaW9uLldTQV9OQU1FU1BBQ0UsIHZlcnNpb24pOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZhbHNlIiwgZGlzYWJsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQWRkcmVzc2luZ0NvbnN0YW50cy5BRERSRVNTSU5HX1JFUVVJUkVELCByZXF1aXJlZCk7Ci0gICAgfQotICAgIAotICAgIEBXZWJTZXJ2aWNlKHRhcmdldE5hbWVzcGFjZT1ucywgcG9ydE5hbWU9ZGVmYXVsdFNlcnZpY2VQb3J0TmFtZSkKLSAgICBjbGFzcyBEZWZhdWx0U2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXBsYWluU2VydmljZVBvcnROYW1lKQotICAgIEBTdWJtaXNzaW9uQWRkcmVzc2luZwotICAgIGNsYXNzIFBsYWluU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPWRpc2FibGVkU2VydmljZVBvcnROYW1lKQotICAgIEBTdWJtaXNzaW9uQWRkcmVzc2luZyhlbmFibGVkPWZhbHNlKQotICAgIGNsYXNzIERpc2FibGVkU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9bnMsIHBvcnROYW1lPXJlcXVpcmVkU2VydmljZVBvcnROYW1lKQotICAgIEBTdWJtaXNzaW9uQWRkcmVzc2luZyhyZXF1aXJlZD10cnVlKQotICAgIGNsYXNzIFJlcXVpcmVkU2VydmljZSB7Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0UXVvdGUoU3RyaW5nIHN5bWJvbCkgewotICAgICAgICAgICAgcmV0dXJuIDEwMS4wMTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0NsaWVudERCQ1N1cHBvcnRFbmRwb2ludFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9DbGllbnREQkNTdXBwb3J0RW5kcG9pbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDEwODVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0NsaWVudERCQ1N1cHBvcnRFbmRwb2ludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmkxOG4uTWVzc2FnZXM7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLS8qKg0KLSAqIFRlc3QgY2xpZW50IHNwYXJzZSBjb21wb3NpdGUgc3VwcG9ydCBpbiB0aGUgTURRIGxheWVyIGF0IHRoZSBFbmRwb2ludCBjcmVhdGlvbiBsZXZlbC4NCi0gKi8NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkNsaWVudERCQ1N1cHBvcnRFbmRwb2ludFRlc3RzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotICAgIHByaXZhdGUgU3RyaW5nIHBvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydCI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogVmVyaWZ5IHRoYXQgdGhlIGNvZGUgdGhhdCBkb2Vzbid0IHVzZSBhIGNvbXBvc2l0ZSBjb250aW51ZXMgdG8gd29yayBjb3JyZWN0bHkuIA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFByZURCQ0Z1bmN0aW9uYWxpdHkoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzY0ltcGwgPSAoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc3ZjRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gc3ZjRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgDQotICAgICAgICBDbGFzcyB0ZXN0U2VydmljZUNsYXNzID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdFNlcnZpY2VDbGFzcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzLCB0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHVwZGF0ZSB3aXRoIGFuIFNFSQ0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTRUkuY2xhc3MsIHBvcnRRTmFtZSwgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERlc2MpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZXBEZXNjSW1wbCA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgZXBEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGVwRGVzY0NvbXBvc2l0ZSA9IGVwRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBDbGFzcyBzZWlDbGFzcyA9IGVwRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTRUkuY2xhc3MsIHNlaUNsYXNzKTsNCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgb3ZlcndyaXRlIHRoZSBjbGFzcyBpbiB0aGUgU2VydmljZURlc2MgY29tcG9zaXRlDQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsNCi0gICAgICAgIA0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBWZXJpZnkgdGhhdCB0aGUgY29kZSB0aGF0IHVzZXMgYSBzaW1wbGUgZW1wdHkgc3BhcnNlIGNvbXBvc2l0ZSB0byBjcmVhdGUgYW4gZW5kcG9pbnQuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHNlcnZpY2VRTmFtZSwgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHN2Y0Rlc2NJbXBsID0gKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwpIHN2Y0Rlc2M7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY0NvbXBvc2l0ZSA9IHN2Y0Rlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIA0KLSAgICAgICAgQ2xhc3MgdGVzdFNlcnZpY2VDbGFzcyA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RTZXJ2aWNlQ2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNlcnZpY2VTdWJjbGFzcy5jbGFzcywgdGVzdFNlcnZpY2VDbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyB1cGRhdGUgd2l0aCBhbiBTRUkNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNldEVwRGVzY0NvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiS2V5MSI7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTRUkuY2xhc3MsIHBvcnRRTmFtZSwgRGVzY3JpcHRpb25GYWN0b3J5LlVwZGF0ZVR5cGUuR0VUX1BPUlQsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVwRGVzY0NvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVwRGVzY0ltcGwgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpIGVwRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERlc2NDb21wb3NpdGUgPSBlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgLy8gVGhlIHNwYXJzZSBjb21wb3NpdGUgc2hvdWxkIE5PVCBiZSBlcXVhbCB0byB0aGUgY29tcG9zaXRlIGluIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uDQotICAgICAgICAvLyBUaGUgc3BhcnNlIGNvbXBvc2l0ZSBTSE9VTEQgYmUgZXF1YWwgdG8gdGhlIHNwYXJzZSBjb21wb3NpdGUgY29udGFpbmVkIGluIHRoZSBFbmRwb2ludERlc2NyaXB0aW9uDQotICAgICAgICBhc3NlcnROb3RTYW1lKHNldEVwRGVzY0NvbXBvc2l0ZSwgZXBEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhzZXRFcERlc2NDb21wb3NpdGUsIGVwRGVzY0NvbXBvc2l0ZS5nZXRTcGFyc2VDb21wb3NpdGUoY29tcG9zaXRlS2V5KSk7DQotICAgICAgICBDbGFzcyBzZWlDbGFzcyA9IGVwRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTRUkuY2xhc3MsIHNlaUNsYXNzKTsNCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgb3ZlcndyaXRlIHRoZSBjbGFzcyBpbiB0aGUgU2VydmljZURlc2MgY29tcG9zaXRlDQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQSBjb21wb3NpdGUgY2FuIG5vdCBiZSBzcGVjaWZpZWQgd2hlbiBkb2luZyBhbiBBZGRQb3J0IA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFBvcnQoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzY0ltcGwgPSAoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc3ZjRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gc3ZjRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgDQotICAgICAgICBDbGFzcyB0ZXN0U2VydmljZUNsYXNzID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRDb3JyZXNwb25kaW5nQ2xhc3MoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwodGVzdFNlcnZpY2VDbGFzcyk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzLCB0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHVwZGF0ZSB3aXRoIGFuIFNFSQ0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2V0RXBEZXNjQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgT2JqZWN0IGNvbXBvc2l0ZUtleSA9ICJLZXkxIjsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2MgPSANCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5BRERfUE9SVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVwRGVzY0NvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgYW4gZXhjZXB0aW9uIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBDb21wb3NpdGUgY2FuIG5vdCBiZSBzcGVjaWZpZWQgd2l0aCBhIENSRUFURV9ESVNQQVRDSA0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURpc3BhdGNoKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHNlcnZpY2VRTmFtZSwgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U2VydmljZVN1YmNsYXNzLmNsYXNzKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsIHN2Y0Rlc2NJbXBsID0gKFNlcnZpY2VEZXNjcmlwdGlvbkltcGwpIHN2Y0Rlc2M7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY0NvbXBvc2l0ZSA9IHN2Y0Rlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIA0KLSAgICAgICAgQ2xhc3MgdGVzdFNlcnZpY2VDbGFzcyA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3RTZXJ2aWNlQ2xhc3MpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNlcnZpY2VTdWJjbGFzcy5jbGFzcywgdGVzdFNlcnZpY2VDbGFzcyk7DQotICAgICAgICANCi0gICAgICAgIC8vIE5vdyB1cGRhdGUgd2l0aCBhbiBTRUkNCi0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHBvcnRMb2NhbFBhcnQpOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNldEVwRGVzY0NvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiS2V5MSI7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjID0gDQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBudWxsIC8qIFNFSSBjYW4ndCBiZSBzcGVjaWZpZWQgKi8sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkNSRUFURV9ESVNQQVRDSCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEVwRGVzY0NvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBjYXVnaHQgYW4gZXhjZXB0aW9uIik7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aA0KLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBNZXNzYWdlcy5nZXRNZXNzYWdlKCJzZXJ2aWNlRGVzY0VycjYiKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGUudG9TdHJpbmcoKS5jb250YWlucyhtc2cpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFVwZGF0ZSBhIHBvcnQgdGhhdCB3YXMgY3JlYXRlZCBmcm9tIFdTREwgKGkuZS4gYSBkZWNsYXJlZCBwb3J0KSB3aXRoIGEgY29tcG9zaXRlLiAgVG8gZ2V0IA0KLSAgICAgKiBpbnRvIGEgc3RhdGUgd2hlcmUgYSBkZWNsYXJlZCBwb3J0IHdvdWxkIG5lZWQgdG8gYmUgdXBkYXRlZDoNCi0gICAgICogMSkgRG8gYSBDUkVBVEVfRElTUEFUQ0ggb24gYSBkZWNsYXJlZCB3c2RsIHBvcnQNCi0gICAgICogMikgRG8gYSBHRVRfUE9SVCBvbiB0aGF0IHBvcnQsIHByb3ZpZGluZyBhbiBTRUkuDQotICAgICAqIEluIHRoaXMgY2FzZSwgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gaXMgc2hhcmVkIGJldHdlZW4gdGhlIHR3bywgYnV0IHRoZSBzcGFyc2UgY29tcG9zaXRlDQotICAgICAqIHNwZWNpZmllZCBvbiB0aGUgR0VUX1BPUlQgc2hvdWxkIGJlIHVuaXF1ZSB0byBpdC4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWNsYXJlZFBvcnQoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgDQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24oZ2V0V3NkbFVSTCgpLCBzZXJ2aWNlUU5hbWUsIFNlcnZpY2UuY2xhc3MpOw0KLQ0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotDQotICAgICAgICAvLyBGaXJzdCB3ZSBkbyBhIENSRUFURV9ESVNQQVRDSCB0byBjcmVhdGUgdGhlIEVuZHBvaW50RGVzY3JpcHRpb24gZm9yIHRoZSBXU0RMIHBvcnQuDQotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3Qgc3BlY2lmeSBhIGNvbXBvc2l0ZSAoYmVjYXVzZSB0aGF0IGlzbid0IGFsbG93ZWQgZm9yIENSRUFURV9ESVNQQVRDSCkNCi0gICAgICAgIC8vIGFuZCBvbmUgd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBydW50aW1lDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0ZvckNyZWF0ZSA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBudWxsIC8qIFNFSSBjYW4ndCBiZSBzcGVjaWZpZWQgKi8sIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0UU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5DUkVBVEVfRElTUEFUQ0gpOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwgZXBEZXNjSW1wbCA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgZXBEZXNjRm9yQ3JlYXRlOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNyZWF0ZURpc3BhdGNoQ29tcG9zaXRlID0gZXBEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoY3JlYXRlRGlzcGF0Y2hDb21wb3NpdGUpOw0KLSAgICAgICAgLy8gVGhlcmUgcmVhbGx5IHNob3VsZG4ndCBiZSBhbnkgc3BhcnNlIGNvbXBvc2l0ZXMgYXQgdGhpcyBwb2ludDsgbWFrZSBzdXJlIGJ5IGNoZWNraW5nIGEgDQotICAgICAgICAvLyBjb3VwbGUgb2J2aW91cyB0aGluZ3MgdGhhdCBtaWdodCBiZSB1c2VkIGFzIGEga2V5Lg0KLSAgICAgICAgYXNzZXJ0TnVsbChlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShjcmVhdGVEaXNwYXRjaENvbXBvc2l0ZSkpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShudWxsKSk7DQotDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgdXBkYXRlRW5kcG9pbnRDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBPYmplY3QgY29tcG9zaXRlS2V5ID0gIktFWTEiOw0KLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlcERlc2NGb3JHZXRQb3J0ID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRW5kcG9pbnRDb21wb3NpdGUsIGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXBEZXNjRm9yQ3JlYXRlLCBlcERlc2NGb3JHZXRQb3J0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gVGhlIHVwZGF0ZSBuZWVkcyB0byBoYXZlIHNldCB0aGUgc3BhcnNlIGNvbXBvc2l0ZSAobGlrZSBmb3IgYSBnaXZlbiBTZXJ2aWNlRGVsZWdhdGUNCi0gICAgICAgIC8vIGluc3RhbmNlKSB3aXRob3V0IGhhdmluZyBsb3N0IHRoZSBkaWZmZXJlbnQgY29tcG9zaXRlIGZvciB0aGUgY3JlYXRlLiAgVGhlIEVuZHBvaW50RGVzY3JpcHRvbiANCi0gICAgICAgIC8vIGNhbiBiZSBzaGFyZWQsIGJ1dCB0aGUgc3BhcnNlIGNvbXBvc2l0ZSBvdmVycmlkZXMgdGhleSBjb250YWluIG5lZWQgdG8gYmUgdW5pcXVlIChsaWtlIHRvIHRoZSBTZXJ2aWNlRGVsZWdhdGVzKQ0KLSAgICAgICAgYXNzZXJ0VHJ1ZShjcmVhdGVEaXNwYXRjaENvbXBvc2l0ZSAhPSB1cGRhdGVFbmRwb2ludENvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRFcXVhbHModXBkYXRlRW5kcG9pbnRDb21wb3NpdGUsIGVwRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSkpOw0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgZGlkbid0IGNoYW5nZSBhbnkgb2YgdGhlIHNwYXJzZSBpbmZvcm1hdGlvbiAod2hpY2ggaXMgbm9uZSkgZm9yIHRoZSBwcmV2aW91cyBjcmVhdGUNCi0gICAgICAgIGFzc2VydE51bGwoZXBEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS5nZXRTcGFyc2VDb21wb3NpdGUoY3JlYXRlRGlzcGF0Y2hDb21wb3NpdGUpKTsNCi0gICAgICAgIGFzc2VydE51bGwoZXBEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKS5nZXRTcGFyc2VDb21wb3NpdGUobnVsbCkpOw0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBEbyBtdWx0aXBsZSBHRVRfUE9SVCBvbiB0aGUgc2FtZSBzZXJ2aWNlLiAgVGhpcyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgRW5kcG9pbnREZXNjcmlwdGlvbg0KLSAgICAgKiBidXQgdGhlIHNwYXJzZSBjb21wb3NpdGUgc3BlY2lmaWVkIG9uIEdFVF9QT1JUIHNob3VsZCBiZSB1bmlxdWUgdG8gZWFjaCBrZXkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVHZXRQb3J0KCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihnZXRXc2RsVVJMKCksIHNlcnZpY2VRTmFtZSwgU2VydmljZS5jbGFzcyk7DQotICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBwb3J0TG9jYWxQYXJ0KTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRG8gdGhlIGZpcnN0IEdldFBvcnQgdXNpbmcgc2QxIGFzIGEga2V5IGZvciB0aGUgc3BhcnNlIGNvbXBvc2l0ZQ0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHNkMUNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIE9iamVjdCBzZDEgPSAiU0QxIjsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb24gZXBEZXNjRm9yR2V0UG9ydDEgPSANCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnkudXBkYXRlRW5kcG9pbnQoc3ZjRGVzYywgQ2xpZW50REJDU3VwcG9ydEVuZHBvaW50U0VJLmNsYXNzLCBwb3J0UU5hbWUsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZDFDb21wb3NpdGUsIHNkMSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzY0ZvckdldFBvcnQxKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVwRGVzY0ltcGwxID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlcERlc2NGb3JHZXRQb3J0MTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhzZDFDb21wb3NpdGUsIGVwRGVzY0ltcGwxLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpLmdldFNwYXJzZUNvbXBvc2l0ZShzZDEpKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gRG8gdGhlIHNlY29uZCBHZXRQb3J0IHVzaW5nIHNkMiBhcyBhIGtleSBmb3IgdGhlIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZDJDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBPYmplY3Qgc2QyID0gIlNEMiI7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzY0ZvckdldFBvcnQyID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LnVwZGF0ZUVuZHBvaW50KHN2Y0Rlc2MsIENsaWVudERCQ1N1cHBvcnRFbmRwb2ludFNFSS5jbGFzcywgcG9ydFFOYW1lLCBEZXNjcmlwdGlvbkZhY3RvcnkuVXBkYXRlVHlwZS5HRVRfUE9SVCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QyQ29tcG9zaXRlLCBzZDIpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlcERlc2NGb3JHZXRQb3J0Mik7DQotICAgICAgICBhc3NlcnRFcXVhbHMoZXBEZXNjRm9yR2V0UG9ydDEsIGVwRGVzY0ZvckdldFBvcnQyKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVwRGVzY0ltcGwyID0gKEVuZHBvaW50RGVzY3JpcHRpb25JbXBsKSBlcERlc2NGb3JHZXRQb3J0MjsNCi0gICAgICAgIGFzc2VydE5vdFNhbWUoc2QxQ29tcG9zaXRlLCBzZDJDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNkMkNvbXBvc2l0ZSwgZXBEZXNjSW1wbDIuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKHNkMikpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNkMUNvbXBvc2l0ZSwgZXBEZXNjSW1wbDEuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCkuZ2V0U3BhcnNlQ29tcG9zaXRlKHNkMSkpOw0KLSAgICB9DQotICAgIA0KLSAgICBzdGF0aWMgVVJMIGdldFdzZGxVUkwoKSB7DQotICAgICAgICBVUkwgdXJsID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB0cnl7DQotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlRGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKS5nZXRDYW5vbmljYWxQYXRoKCk7DQotICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXcgRmlsZShiYXNlRGlyICsgIi90ZXN0LXJlc291cmNlcy93c2RsL0NsaWVudEVuZHBvaW50TWV0YWRhdGEud3NkbCIpLmdldEFic29sdXRlUGF0aCgpOw0KLSAgICAgICAgICAgIH1jYXRjaChFeGNlcHRpb24gZSl7DQotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBjcmVhdGluZyBGaWxlKFdTREwpOiAiICsgZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUod3NkbExvY2F0aW9uKTsNCi0gICAgICAgICAgICB1cmwgPSBmaWxlLnRvVVJMKCk7DQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGNvbnZlcnRpbmcgV1NETCBmaWxlIHRvIFVSTDogIiArIGUudG9TdHJpbmcoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdXJsOw0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KHRhcmdldE5hbWVzcGFjZT0ib3JpZ2luYWxUTlMiLCB3c2RsTG9jYXRpb249Im9yaWdpbmFsV3NkbExvY2F0aW9uIikNCi1jbGFzcyBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MgZXh0ZW5kcyBqYXZheC54bWwud3MuU2VydmljZSB7DQotDQotICAgIHByb3RlY3RlZCBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTZXJ2aWNlU3ViY2xhc3MoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLWludGVyZmFjZSBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8gKFN0cmluZyBzdHJpbmcpOw0KLX0NCi0NCi1AV2ViU2VydmljZShzZXJ2aWNlTmFtZSA9ICJFY2hvU2VydmljZSIsIGVuZHBvaW50SW50ZXJmYWNlPSJvcmcuYXBhY2hlLndzLmF4aXMyLnRlc3RzLkVjaG9Qb3J0IikNCi1jbGFzcyBDbGllbnREQkNTdXBwb3J0RW5kcG9pbnRFY2hvU2VydmljZUltcGxXaXRoU0VJIHsNCi0gICAgcHVibGljIHZvaWQgZWNobyhIb2xkZXI8U3RyaW5nPiB0ZXh0KSB7DQotICAgICAgICB0ZXh0LnZhbHVlID0gIkVjaG8gIiArIHRleHQudmFsdWU7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0NsaWVudERCQ1N1cHBvcnRIYW5kbGVyc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjY1MmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5EZXNjcmlwdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRW5kcG9pbnREZXNjcmlwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5TZXJ2aWNlRGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5EZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24ueG1sLmhhbmRsZXIuSGFuZGxlckNoYWluc1R5cGU7DQotDQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOw0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotLyoqDQotICogVGVzdCBjbGllbnQgY29tcG9zaXRlIHN1cHBvcnQgZm9yIGhhbmRsZXIgY2hhaW5zIHNwZWNpZmllZCB2aWEgc3BhcnNlIGNvbXBvc2l0ZXMNCi0gKiBhcHBsaWVkIHRvIHNlcnZpY2VzIGFuZCBwb3J0cy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9ICJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLkNsaWVudERCQ1N1cHBvcnRIYW5kbGVyc1Rlc3RzIjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3ZjTG9jYWxQYXJ0ID0gInN2Y0xvY2FsUGFydCI7DQotICAgIHByaXZhdGUgU3RyaW5nIHN2Y0xvY2FsUGFydDIgPSAic3ZjTG9jYWxQYXJ0MiI7DQotICAgIHByaXZhdGUgU3RyaW5nIHBvcnRMb2NhbFBhcnQgPSAicG9ydExvY2FsUGFydCI7DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYSBTZXJ2aWNlRGVzY3JpcHRpb24gc3BlY2lmeWluZyBhIEhhbmRsZXJDaGFpbnMgVHlwZSBpbiBhIHNwYXJzZSBjb21wb3NpdGUNCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyc09uU2VydmljZSgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICAvLyBDcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBhIEpBWEIgSGFuZGxlciBDb25maWcgDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudERCQ1N1cHBvcnRIYW5kbGVyc1NlcnZpY2UuY2xhc3MsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzYyk7DQotICAgICAgICAvLyBUaGVyZSBzaG91bGQgb25seSBiZSBhIGhhbmRsZXIgY2hhaW4gZm9yIHRoZSBnaXZlbiBrZXkuDQotICAgICAgICBhc3NlcnROdWxsKHN2Y0Rlc2MuZ2V0SGFuZGxlckNoYWluKCkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjLmdldEhhbmRsZXJDaGFpbigiQ29tcG9zaXRlS2V5IikpOw0KLSAgICAgICAgYXNzZXJ0TnVsbChzdmNEZXNjLmdldEhhbmRsZXJDaGFpbigiV3JvbmdLZXkiKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBFbmRwb2ludERlc2NyaXRvaW4gc3BlY2lmeWluZyBhIEhhbmRsZXJDaGFpbnNUeXBlIGluIGEgc3BhcnNlIGNvbXBvc2l0ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RIYW5kbGVyc09uRW5kcG9pbnQoKSB7DQotICAgICAgICAvLyBOb3RlIHRoYXQgVW5pdCB0ZXN0cyBpbiB0aGUgTWF2ZW4gZW52aXJvbm1lbnQgcnVuIHdpdGhpbiBhIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgSlZNDQotICAgICAgICAvLyB3aGljaCBtZWFucyB0aGF0IHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gY3JhdGVkIGJ5IHByZXZpb3VzIHRlc3RzIHN0aWxsIGV4aXN0cy4gIFNvDQotICAgICAgICAvLyB3ZSBoYXZlIHRvIHVzZSBhIGRpZmZlcmVudCBzZXJ2aWNlIFFOYW1lIHRvIGJlIHN1cmUgdG8gYWx3YXlzIGdldCBhIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb24NCi0gICAgICAgIC8vIG9yIHdlIGNvdWxkIHBpY2sgdXAgYSBzcGFyc2UgY29tcG9zaXRlIHdpdGgga2V5ICJDb21wb3NpdGVLZXkiIHNldCBvbiBhIFNlcnZpY2VEZXNjcmlwdGlvbg0KLSAgICAgICAgLy8gYnkgYW5vdGhlciB0ZXN0LCBjYXVzaW5nIHRoZSBhc3NlcnROdWxsKHN2Y0Rlc2MuZ2V0SGFuZGxlckNoYWluKCJDb21wb3NpdGVLZXkiKSkgYmVsb3cNCi0gICAgICAgIC8vIHRvIGZhaWwNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydDIpOw0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotDQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLQ0KLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGFuZGxlckNoYWluc1R5cGUgPSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldEhhbmRsZXJDaGFpbnNUeXBlKGhhbmRsZXJDaGFpbnNUeXBlKTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0NCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzU2VydmljZS5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgDQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBDbGllbnREQkNTdXBwb3J0SGFuZGxlcnNTRUkuY2xhc3MsIHBvcnRRTmFtZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JULA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUsIGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzYyk7DQotICAgICAgICANCi0gICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBoYW5kbGVyIGluZm8gb24gdGhlIFNlcnZpY2UsIGJ1dCB0aGVyZSBzaG91bGQgYmUgb24gdGhlIEVuZHBvaW50IA0KLSAgICAgICAgYXNzZXJ0TnVsbChzdmNEZXNjLmdldEhhbmRsZXJDaGFpbigpKTsNCi0gICAgICAgIGFzc2VydE51bGwoc3ZjRGVzYy5nZXRIYW5kbGVyQ2hhaW4oIkNvbXBvc2l0ZUtleSIpKTsNCi0gICAgICAgIGFzc2VydE51bGwoc3ZjRGVzYy5nZXRIYW5kbGVyQ2hhaW4oIldyb25nS2V5IikpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnROdWxsKGVwRGVzYy5nZXRIYW5kbGVyQ2hhaW4oKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKGVwRGVzYy5nZXRIYW5kbGVyQ2hhaW4oIkNvbXBvc2l0ZUtleSIpKTsNCi0gICAgICAgIGFzc2VydE51bGwoZXBEZXNjLmdldEhhbmRsZXJDaGFpbigiV3JvbmdLZXkiKSk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBIYW5kbGVyQ2hhaW5zVHlwZSBnZXRIYW5kbGVyQ2hhaW5zVHlwZSgpIHsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0WE1MRmlsZVN0cmVhbSgpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChpcyk7DQotICAgICAgICBIYW5kbGVyQ2hhaW5zVHlwZSByZXR1cm5IQ1QgPSBEZXNjcmlwdGlvblV0aWxzLmxvYWRIYW5kbGVyQ2hhaW5zKGlzLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybkhDVCk7DQotICAgICAgICByZXR1cm4gcmV0dXJuSENUOw0KLSAgICB9DQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0WE1MRmlsZVN0cmVhbSgpIHsNCi0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0gICAgICAgIFN0cmluZyBjb25maWdMb2MgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBTdHJpbmcgc2VwID0gIi8iOw0KLSAgICAgICAgICAgIGNvbmZpZ0xvYyA9IHNlcCArICJ0ZXN0LXJlc291cmNlcyIgKyBzZXAgKyAidGVzdC1oYW5kbGVyLnhtbCI7DQotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICBpcyA9IG5ldyBGaWxlKGJhc2VEaXIgKyBjb25maWdMb2MpLnRvVVJMKCkub3BlblN0cmVhbSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGlzOw0KLSAgICB9DQotDQotfQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50DQotY2xhc3MgQ2xpZW50REJDU3VwcG9ydEhhbmRsZXJzU2VydmljZSBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0gICAgcHJvdGVjdGVkIENsaWVudERCQ1N1cHBvcnRIYW5kbGVyc1NlcnZpY2UoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLWludGVyZmFjZSBDbGllbnREQkNTdXBwb3J0SGFuZGxlcnNTRUkgew0KLSAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHRvRWNobyk7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0NsaWVudERCQ1N1cHBvcnRUZXN0cy5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTg5YTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvQ2xpZW50REJDU3VwcG9ydFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uRGVzY3JpcHRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkRlc2NyaXB0aW9uVGVzdFV0aWxzOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLkVuZHBvaW50RGVzY3JpcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuV2ViU2VydmljZUNsaWVudEFubm90Ow0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi0vKioNCi0gKiBUZXN0IGNsaWVudCBzcGFyc2UgY29tcG9zaXRlIHN1cHBvcnQgaW4gdGhlIE1EUSBsYXllciBhdCB0aGUgU2VydmljZSBjcmVhdGlvbiBsZXZlbC4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ2xpZW50REJDU3VwcG9ydFRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAiaHR0cDovL29yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5DbGllbnREQkNTdXBwb3J0VGVzdHMiOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdmNMb2NhbFBhcnQgPSAic3ZjTG9jYWxQYXJ0IjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydExvY2FsUGFydCA9ICJwb3J0TG9jYWxQYXJ0IjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBUZXN0IHRoZSBwcmV2aW91cyB3YXkgb2YgY29uc3RydWN0aW5nIGEgU2VydmljZURlc2NyaXB0aW9uIGFuZCB0aGVuIHVwZGF0aW5nIGl0IHdpdGggYW4gDQotICAgICAqIEVuZHBvaW50LiAgVGhpcyBpcyB2ZXJpZnlpbmcgdGhhdCB0aGUgcHJldmlvdXMgQVBJcyB3b3JrIGFzIGV4cGVjdGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VBbmRTZWlDbGFzcygpIHsNCi0gICAgICAgIA0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIA0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHN2Y0Rlc2MgPSBEZXNjcmlwdGlvbkZhY3RvcnkuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHNlcnZpY2VRTmFtZSwgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2MpOw0KLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzdmNEZXNjSW1wbCA9IChTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKSBzdmNEZXNjOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NDb21wb3NpdGUgPSBzdmNEZXNjSW1wbC5nZXREZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICANCi0gICAgICAgIENsYXNzIHRlc3RTZXJ2aWNlQ2xhc3MgPSBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzLmNsYXNzLCB0ZXN0U2VydmljZUNsYXNzKTsNCi0gICAgICAgIA0KLSAgICAgICAgLy8gTm93IHVwZGF0ZSB3aXRoIGFuIFNFSQ0KLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgcG9ydExvY2FsUGFydCk7DQotICAgICAgICBFbmRwb2ludERlc2NyaXB0aW9uIGVwRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS51cGRhdGVFbmRwb2ludChzdmNEZXNjLCBDbGllbnREQkNTdXBwb3J0U0VJLmNsYXNzLCBwb3J0UU5hbWUsIERlc2NyaXB0aW9uRmFjdG9yeS5VcGRhdGVUeXBlLkdFVF9QT1JUKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoZXBEZXNjKTsNCi0gICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVwRGVzY0ltcGwgPSAoRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpIGVwRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBlcERlc2NDb21wb3NpdGUgPSBlcERlc2NJbXBsLmdldERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgQ2xhc3Mgc2VpQ2xhc3MgPSBlcERlc2NDb21wb3NpdGUuZ2V0Q29ycmVzcG9uZGluZ0NsYXNzKCk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoQ2xpZW50REJDU3VwcG9ydFNFSS5jbGFzcywgc2VpQ2xhc3MpOw0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRpZG4ndCBvdmVyd3JpdGUgdGhlIGNsYXNzIGluIHRoZSBTZXJ2aWNlRGVzYyBjb21wb3NpdGUNCi0gICAgICAgIGFzc2VydEVxdWFscyhDbGllbnREQkNTdXBwb3J0U2VydmljZVN1YmNsYXNzLmNsYXNzLCANCi0gICAgICAgICAgICAgICAgICAgICBzdmNEZXNjQ29tcG9zaXRlLmdldENvcnJlc3BvbmRpbmdDbGFzcygpKTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIFNlcnZpY2VEZXNjcmlwdGlvbiB3aXRoIGEgY29tcG9zaXRlLiAgTm90aGluZyBpbiB0aGUgY29tcG9zaXRlIGlzIG92ZXJyaWRlbjsgdmFsaWRhdGUNCi0gICAgICogdGhlIHZhbHVlcyBmcm9tIHRoZSBhbm5vdGlvbnMgaW4gdGhlIFNlcnZpY2UgY2xhc3MuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50U2VydmljZUNsYXNzQ29tcG9zaXRlKCkgew0KLSAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgc3ZjTG9jYWxQYXJ0KTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBPYmplY3QgY29tcG9zaXRlS2V5ID0gIkNvbXBvc2l0ZUtleSI7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IA0KLSAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKG51bGwsIHNlcnZpY2VRTmFtZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcy5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzY0ltcGwgPSAoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc3ZjRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gc3ZjRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShjb21wb3NpdGUsIHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSkpOw0KLSAgICAgICAgDQotICAgICAgICBXZWJTZXJ2aWNlQ2xpZW50IHdzQ2xpZW50ID0gc3ZjRGVzY0NvbXBvc2l0ZS5nZXRXZWJTZXJ2aWNlQ2xpZW50QW5ub3QoKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwod3NDbGllbnQpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJvcmlnaW5hbFdzZGxMb2NhdGlvbiIsIHdzQ2xpZW50LndzZGxMb2NhdGlvbigpKTsNCi0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7DQotICAgICAgICAvLyBXZSdyZSB0ZXN0aW5nIHRoZSBjb21wb3NpdGUsIG5vdCB0aGUgbWV0YWRhdGEgbGF5ZXIsIHNvIG5vbmUgb2YgdGhlIGRlZmF1bHRpbmcgbG9naWMNCi0gICAgICAgIC8vIGlzIGV4ZXJjaXNlZC4NCi0gICAgICAgIGFzc2VydEVxdWFscygiIiwgd3NDbGllbnQubmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGEgU2VydmljZURlc2NyaXB0aW9uIHVzaW5nIGEgc3BhcnNlIGNvbXBvc2l0ZSB0aGF0IG92ZXJyaWRlcyB0aGUgd3NkbExvY2F0aW9uIG9uIHRoZQ0KLSAgICAgKiBXZWJTZXJ2aWNlQ2xpZW50IGFubm90YXRpb24uICBWYWxpZGF0ZSB0aGUgb3ZlcnJpZGUgb25seSBhZmZlY3RzIHRoZSB3c2RsTG9jYXRpb24gYW5kIG5vdA0KLSAgICAgKiB0aGUgb3RoZXIgYW5ub3RhdGlvbnMgbWVtYmVycy4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlQ2xpZW50V1NETExvY2F0aW9uT3ZlcnJpZGUoKSB7DQotICAgICAgICBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBzdmNMb2NhbFBhcnQpOw0KLSAgICAgICAgLy8gQ3JlYXRlIGEgY29tcG9zaXRlIHdpdGggYSBXZWJTZXJ2aWNlQ2xpZW50IG92ZXJyaWRlIG9mIHRoZSBXU0RMIGxvY2F0aW9uLg0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsNCi0gICAgICAgIFN0cmluZyBvdmVycmlkZW5Xc2RsTG9jYXRpb24gPSBEZXNjcmlwdGlvblRlc3RVdGlscy5nZXRXU0RMTG9jYXRpb24oIkNsaWVudEVuZHBvaW50TWV0YWRhdGEud3NkbCIpOw0KLSAgICAgICAgV2ViU2VydmljZUNsaWVudEFubm90IHdzQ2xpZW50QW5ubyA9IFdlYlNlcnZpY2VDbGllbnRBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQ2xpZW50QW5ub3RJbXBsKG51bGwsIG51bGwsIG92ZXJyaWRlbldzZGxMb2NhdGlvbik7DQotICAgICAgICBjb21wb3NpdGUuc2V0V2ViU2VydmljZUNsaWVudEFubm90KHdzQ2xpZW50QW5ubyk7DQotICAgICAgICBPYmplY3QgY29tcG9zaXRlS2V5ID0gIkNvbXBvc2l0ZUtleSI7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IA0KLSAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKG51bGwsIHNlcnZpY2VRTmFtZSwgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcy5jbGFzcywgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLCBjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjKTsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc3ZjRGVzY0ltcGwgPSAoU2VydmljZURlc2NyaXB0aW9uSW1wbCkgc3ZjRGVzYzsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gc3ZjRGVzY0ltcGwuZ2V0RGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0Tm90U2FtZShjb21wb3NpdGUsIHN2Y0Rlc2NDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShjb21wb3NpdGUsIHN2Y0Rlc2NDb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSkpOw0KLSAgICAgICAgLy8gVGhlIGNsaWVudCBhbm5vdCB3ZSBzZXQgYXMgYSBzcGFyc2UgY29tcG9zaXRlIHNob3VsZCBiZSB0aGUgc2FtZS4NCi0gICAgICAgIGFzc2VydFNhbWUod3NDbGllbnRBbm5vLCBzdmNEZXNjQ29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShjb21wb3NpdGVLZXkpLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdCgpKTsNCi0gICAgICAgIC8vIFRoZSBXZWJTZXJ2aWNlQ2xpZW50IGFubm90IG9uIHRoZSBzZXJ2aWNlIGRlc2Mgc2hvdWxkIHJlcHJlc2VudCB0aGUgd3NkbCBvdmVycmlkZSBmcm9tIHRoZQ0KLSAgICAgICAgLy8gc3BhcnNlIGNvbXBvc2l0ZSANCi0gICAgICAgIFdlYlNlcnZpY2VDbGllbnQgd3NDbGllbnQgPSBzdmNEZXNjQ29tcG9zaXRlLmdldFdlYlNlcnZpY2VDbGllbnRBbm5vdChjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKG92ZXJyaWRlbldzZGxMb2NhdGlvbiwgd3NDbGllbnQud3NkbExvY2F0aW9uKCkpOw0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBub24tb3ZlcnJpZGRlbiB2YWx1ZXMgc3RpbGwgY29tZSBmcm9tIHRoZSBzZXJ2aWNlIGNsYXNzIGFubm90YXRpb24NCi0gICAgICAgIGFzc2VydEVxdWFscygib3JpZ2luYWxUTlMiLCB3c0NsaWVudC50YXJnZXROYW1lc3BhY2UoKSk7DQotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHdzQ2xpZW50Lm5hbWUoKSk7DQotICAgICAgICANCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlIGFiaWxpdHkgdG8gc2V0IGEgcHJlZmVyZWQgcG9ydCBvbiBhIHNlcnZpY2UgZGVzY3JpcHRpb24gdmlhICBhIHNwYXJzZSBjb21wb3NpdGUuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZmVycmVkUG9ydCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgUU5hbWUgcHJlZmVycmVkUG9ydCA9IG5ldyBRTmFtZSgicHJlZmVycmVkVE5TIiwgInByZWZlcnJlZExQIik7DQotICAgICAgICBjb21wb3NpdGUuc2V0UHJlZmVycmVkUG9ydChwcmVmZXJyZWRQb3J0KTsNCi0gICAgICAgIE9iamVjdCBjb21wb3NpdGVLZXkgPSAiQ29tcG9zaXRlS2V5IjsNCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzdmNEZXNjID0gDQotICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCBzZXJ2aWNlUU5hbWUsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcy5jbGFzcywNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSwgY29tcG9zaXRlS2V5KTsNCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzdmNEZXNjQ29tcG9zaXRlID0gRGVzY3JpcHRpb25UZXN0VXRpbHMuZ2V0U2VydmljZURlc2NyaXB0aW9uQ29tcG9zaXRlKHN2Y0Rlc2MpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjQ29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydE51bGwoc3ZjRGVzY0NvbXBvc2l0ZS5nZXRQcmVmZXJyZWRQb3J0KCkpOw0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN2Y0Rlc2NTcGFyc2VDb21wb3NpdGUgPSBzdmNEZXNjQ29tcG9zaXRlLmdldFNwYXJzZUNvbXBvc2l0ZShjb21wb3NpdGVLZXkpOw0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzdmNEZXNjU3BhcnNlQ29tcG9zaXRlKTsNCi0gICAgICAgIGFzc2VydFNhbWUocHJlZmVycmVkUG9ydCwgc3ZjRGVzY1NwYXJzZUNvbXBvc2l0ZS5nZXRQcmVmZXJyZWRQb3J0KCkpOw0KLSAgICAgICAgYXNzZXJ0U2FtZShwcmVmZXJyZWRQb3J0LCBzdmNEZXNjQ29tcG9zaXRlLmdldFByZWZlcnJlZFBvcnQoY29tcG9zaXRlS2V5KSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFRlc3QgdGhlIGFiaWxpdHkgdG8gc2V0IE1UT00gZW5hYmxlbWVudCBvbiBhIHNlcnZpY2UgZGVzY3JpcHRpb24gdmlhIGEgc3BhcnNlIGNvbXBvc2l0ZS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NRW5hYmxlbWVudCgpIHsNCi0gICAgICAgIFFOYW1lIHNlcnZpY2VRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIHN2Y0xvY2FsUGFydCk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldElzTVRPTUVuYWJsZWQodHJ1ZSk7DQotICAgICAgICBPYmplY3QgY29tcG9zaXRlS2V5ID0gIkNvbXBvc2l0ZUtleSI7DQotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc3ZjRGVzYyA9IA0KLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgc2VydmljZVFOYW1lLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudERCQ1N1cHBvcnRTZXJ2aWNlU3ViY2xhc3MuY2xhc3MsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUsIGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY0NvbXBvc2l0ZSA9IERlc2NyaXB0aW9uVGVzdFV0aWxzLmdldFNlcnZpY2VEZXNjcmlwdGlvbkNvbXBvc2l0ZShzdmNEZXNjKTsNCi0gICAgICAgIGFzc2VydE5vdE51bGwoc3ZjRGVzY0NvbXBvc2l0ZSk7DQotICAgICAgICBhc3NlcnRGYWxzZShzdmNEZXNjQ29tcG9zaXRlLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3ZjRGVzY1NwYXJzZUNvbXBvc2l0ZSA9IHN2Y0Rlc2NDb21wb3NpdGUuZ2V0U3BhcnNlQ29tcG9zaXRlKGNvbXBvc2l0ZUtleSk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHN2Y0Rlc2NTcGFyc2VDb21wb3NpdGUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzdmNEZXNjU3BhcnNlQ29tcG9zaXRlLmlzTVRPTUVuYWJsZWQoKSk7DQotICAgICAgICBhc3NlcnRUcnVlKHN2Y0Rlc2NDb21wb3NpdGUuaXNNVE9NRW5hYmxlZChjb21wb3NpdGVLZXkpKTsNCi0gICAgfQ0KLQ0KLX0NCi0NCi1AV2ViU2VydmljZUNsaWVudCh0YXJnZXROYW1lc3BhY2U9Im9yaWdpbmFsVE5TIiwgd3NkbExvY2F0aW9uPSJvcmlnaW5hbFdzZGxMb2NhdGlvbiIpDQotY2xhc3MgQ2xpZW50REJDU3VwcG9ydFNlcnZpY2VTdWJjbGFzcyBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsNCi0NCi0gICAgcHJvdGVjdGVkIENsaWVudERCQ1N1cHBvcnRTZXJ2aWNlU3ViY2xhc3MoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgew0KLSAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLX0NCi0NCi1AV2ViU2VydmljZQ0KLWludGVyZmFjZSBDbGllbnREQkNTdXBwb3J0U0VJIHsNCi0gICAgcHVibGljIFN0cmluZyBlY2hvIChTdHJpbmcgc3RyaW5nKTsNCi19DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2UiLCBlbmRwb2ludEludGVyZmFjZT0ib3JnLmFwYWNoZS53cy5heGlzMi50ZXN0cy5FY2hvUG9ydCIpDQotY2xhc3MgQ2xpZW50REJDU3VwcG9ydEVjaG9TZXJ2aWNlSW1wbFdpdGhTRUkgew0KLSAgICBwdWJsaWMgdm9pZCBlY2hvKEhvbGRlcjxTdHJpbmc+IHRleHQpIHsNCi0gICAgICAgIHRleHQudmFsdWUgPSAiRWNobyAiICsgdGV4dC52YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9EZXNjcmlwdGlvbkZhY3RvcnlJbXBsVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0Rlc2NyaXB0aW9uRmFjdG9yeUltcGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIzNzY0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL0Rlc2NyaXB0aW9uRmFjdG9yeUltcGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5FbmRwb2ludERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5DdXN0b21Bbm5vdGF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuY29udmVydGVyLkphdmFDbGFzc1RvREJDQ29udmVydGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5EZXNjcmlwdGlvbkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24udmFsaWRhdG9yLkVuZHBvaW50RGVzY3JpcHRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi54bWwuaGFuZGxlci5IYW5kbGVyQ2hhaW5zVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRpb25GYWN0b3J5SW1wbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPQotICAgICAgICAgICAgImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvblRlc3RzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpOwotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VEZXNjcmlwdGlvbkNhY2hpbmcoKSB7ICAgICAgICAKLSAgICAgICAgUU5hbWUgdW5pcXVlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQgKyAiX3Rlc3RWYWxpZFNlcnZpY2VTdWJjbGFzcyIpOwotICAgICAgICAKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2MxID0gCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZSwgU2VydmljZVN1YmNsYXNzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAvKgotICAgICAgICBpbnQgc2l6ZSA9IDU7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBkZXNjMjsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjMiA9IAotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHVuaXF1ZVFOYW1lLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic2VydmljZSBkZXNjcmlwdGlvbiB3YXMgbm90IHJldXNlZCIsIGRlc2MxID09IGRlc2MyKTsKLSAgICAgICAgfSAKLSAgICAgICAgKi8gICAgCi0gICAgfSAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyU2VydmljZURlc2NyaXB0aW9uQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsgICAgICAgIAotICAgICAgICBRTmFtZSB1bmlxdWVRTmFtZTEgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQgKyAiX3Rlc3RDbGVhckNhY2hlMSIpOwotICAgICAgICBRTmFtZSB1bmlxdWVRTmFtZTIgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQgKyAiX3Rlc3RDbGVhckNhY2hlMiIpOwotICAKLS8vICAgICAgICAvLyB0aGUgQ2xpZW50Q29uZmlnRmFjdG9yeSBpbnN0YW5jZSBpcyBzdG9yZWQgRGVzY3JpcHRpb25GYWN0b3J5SW1wbCBjbGllbnRDb25maWdGYWN0b3J5IAotLy8gICAgICAgIC8vIGZpZWxkIGFuZCBmb3IgdGhpcyB0ZXN0IHdlIG5lZWQgdG8gY2xlYXIgaXQsIHNvIHRoYXQgYSBjdXN0b20gdmVyc2lvbiBvZiAKLS8vICAgICAgICAvLyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSBjYW4gYmUgdXNlZC4KLS8vICAgICAgICByZXNldENsaWVudENvbmZpZ0ZhY3RvcnkoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGluc3RhbGwgY2FjaGluZyBmYWN0b3J5ICAgICAgICAKLSAgICAgICAgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnkgb2xkRmFjdG9yeSA9IAotICAgICAgICAgICAgKENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KU1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnkoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuY2xhc3MpOwotICAgICAgICBDYWNoaW5nQ2xpZW50Q29udGV4dEZhY3RvcnkgbmV3RmFjdG9yeSA9IG5ldyBDYWNoaW5nQ2xpZW50Q29udGV4dEZhY3RvcnkoKTsKLSAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgbmV3RmFjdG9yeSk7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2MxID0gCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgdW5pcXVlUU5hbWUxLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzIgPSAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZTEsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG5ld0ZhY3RvcnkucmVzZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2MzID0gCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgdW5pcXVlUU5hbWUyLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGRlc2MxID09IGRlc2MyKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZGVzYzEgIT0gZGVzYzMpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBzaG91bGQgY2xlYXIgb25lCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNsZWFyU2VydmljZURlc2NyaXB0aW9uQ2FjaGUoZGVzYzIuZ2V0QXhpc0NvbmZpZ0NvbnRleHQoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBkZXNjNCA9IAotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uKG51bGwsIHVuaXF1ZVFOYW1lMSwgU2VydmljZVN1YmNsYXNzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2M1ID0gCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgdW5pcXVlUU5hbWUyLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGRlc2MxICE9IGRlc2M0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZGVzYzMgPT0gZGVzYzUpOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNob3VsZCBjbGVhciBib3RoCi0gICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNsZWFyU2VydmljZURlc2NyaXB0aW9uQ2FjaGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIGRlc2M2ID0gCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb24obnVsbCwgdW5pcXVlUU5hbWUxLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gZGVzYzcgPSAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLmNyZWF0ZVNlcnZpY2VEZXNjcmlwdGlvbihudWxsLCB1bmlxdWVRTmFtZTIsIFNlcnZpY2VTdWJjbGFzcy5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydFRydWUoZGVzYzQgIT0gZGVzYzYpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXNjMyAhPSBkZXNjNyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGRvIG5vdGhpbmcKLSAgICAgICAgICAgIERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY2xlYXJTZXJ2aWNlRGVzY3JpcHRpb25DYWNoZShudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gcmVzdG9yZSBvbGQgZmFjdG9yeSBieSB1cGRhdGluZyB0aGUgcmVnaXN0cnkgVEhFTiBjbGVhcmluZyB0aGUgY2FjaGVkIGZhY3RvcnkKLSAgICAgICAgICAgIC8vIHNvIGl0IGlzIHJldHJpZXZlZCBmcm9tIHRoZSB0YWJsZSBhZ2Fpbi4KLSAgICAgICAgICAgIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LnNldEZhY3RvcnkoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuY2xhc3MsIG9sZEZhY3RvcnkpOwotLy8gICAgICAgICAgICByZXNldENsaWVudENvbmZpZ0ZhY3RvcnkoKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Bbm5vdGF0aW9uU3VwcG9ydCgpIHsKLSAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKEFubm90YXRlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gZGJjTWFwLmdldChBbm5vdGF0ZWRTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgU2FtcGxlQW5ub3RhdGlvbiBzYW1wbGVBbm5vdGF0aW9uID0gbmV3IFNhbXBsZUFubm90YXRpb24oKTsKLSAgICAgICAgc2FtcGxlQW5ub3RhdGlvbi5zZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKEN1c3RvbS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBkYmMuYWRkQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlKHNhbXBsZUFubm90YXRpb24pOwotICAgICAgICBTYW1wbGVBbm5vdGF0aW9uUHJvY2Vzc29yIHNhUHJvY2Vzc29yID0gbmV3IFNhbXBsZUFubm90YXRpb25Qcm9jZXNzb3IoKTsKLSAgICAgICAgc2FQcm9jZXNzb3Iuc2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKHNhbXBsZUFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBkYmMuYWRkQ3VzdG9tQW5ub3RhdGlvblByb2Nlc3NvcihzYVByb2Nlc3Nvcik7Ci0gICAgICAgIFdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGRiYy5nZXRXZWJTZXJ2aWNlQW5ub3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlKTsKLSAgICAgICAgU3RyaW5nIHBuID0gd2ViU2VydmljZS5wb3J0TmFtZSgpOwotICAgICAgICBTdHJpbmcgdG5zID0gd2ViU2VydmljZS50YXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwbik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG5zKTsKLSAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKHRucywgcG4pOwotICAgICAgICBMaXN0PFNlcnZpY2VEZXNjcmlwdGlvbj4gc2RMaXN0ID0gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jcmVhdGVTZXJ2aWNlRGVzY3JpcHRpb25Gcm9tREJDTWFwKGRiY01hcCwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc2RMaXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNkTGlzdC5zaXplKCksIDEpOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZExpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIC8vIGZvciB0ZXN0aW5nIHB1cnBvc2VzIHdlIHdhbnQgdG8gbWFrZSBhIGNhc3QgYi9jIHNvbWUgb2YgdGhlIG1ldGhvZHMKLSAgICAgICAgLy8gd2UgYXJlIGFjY2Vzc2luZyBhcmUgcHJvdGVjdGVkIGluIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsCi0gICAgICAgIGlmKGVkIGluc3RhbmNlb2YgRW5kcG9pbnREZXNjcmlwdGlvbkltcGwpIHsKLSAgICAgICAgICAgIEVuZHBvaW50RGVzY3JpcHRpb25JbXBsIGVkSW1wbCA9IChFbmRwb2ludERlc2NyaXB0aW9uSW1wbCkgZWQ7Ci0gICAgICAgICAgICBMaXN0PEN1c3RvbUFubm90YXRpb25JbnN0YW5jZT4gY3VzdG9tQW5ub3RhdGlvbkxpc3QgPSBlZEltcGwuZ2V0Q3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlcygpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXN0b21Bbm5vdGF0aW9uTGlzdCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VzdG9tQW5ub3RhdGlvbkxpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgICAgIEN1c3RvbUFubm90YXRpb25JbnN0YW5jZSBhbm5vdGF0aW9uSW5zdGFuY2UgPSBjdXN0b21Bbm5vdGF0aW9uTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb25JbnN0YW5jZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYW5ub3RhdGlvbkluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBTYW1wbGVBbm5vdGF0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IGVkSW1wbC5nZXRDdXN0b21Bbm5vdGF0aW9uUHJvY2Vzc29yKGFubm90YXRpb25JbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHByb2Nlc3Nvcik7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoU2FtcGxlQW5ub3RhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTYW1wbGVBbm5vdGF0aW9uUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEhhbmRsZXJDaGFpblR5cGUoKSB7Ci0gICAgCUphdmFDbGFzc1RvREJDQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBKYXZhQ2xhc3NUb0RCQ0NvbnZlcnRlcihBbm5vdGF0ZWRTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTWFwID0gY29udmVydGVyLnByb2R1Y2VEQkMoKTsKLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGRiYyA9IGRiY01hcC5nZXQoQW5ub3RhdGVkU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRiYyk7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0WE1MRmlsZVN0cmVhbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGlzKTsKLSAgICAgICAgSGFuZGxlckNoYWluc1R5cGUgaGN0ID0gRGVzY3JpcHRpb25VdGlscy5sb2FkSGFuZGxlckNoYWlucyhpcywgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICBkYmMuc2V0SGFuZGxlckNoYWluc1R5cGUoaGN0KTsKLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNkTGlzdCA9IERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkTGlzdCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2RMaXN0LnNpemUoKSA+IDApOwotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBzZExpc3QuZ2V0KDApOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb25zX0FzQ29sbGVjdGlvbigpKTsKLSAgICAgICAgQ29sbGVjdGlvbjxFbmRwb2ludERlc2NyaXB0aW9uPiBlZENvbGwgPSBzZC5nZXRFbmRwb2ludERlc2NyaXB0aW9uc19Bc0NvbGxlY3Rpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZENvbGwpOwotICAgICAgICBhc3NlcnRUcnVlKGVkQ29sbC5zaXplKCkgPiAwKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IGVkQ29sbC5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWQuZ2V0SGFuZGxlckNoYWluKCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgdmVyaWZ5IHRoYXQgcHJvcGVydGllcyBhcmUgY29ycmVjdGx5IGNvcGllZCBmcm9tIGEgREJDIHRvIGFuCi0gICAgICogRW5kcG9pbnREZXNjcmlwdGlvbiBpbnN0YW5jZSBieSBhIGhlbHBlciBtZXRob2QgaW4gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydGllc09uRW5kcG9pbnREZXNjKCkgewotICAgICAgICAKLSAgICAgICAgLy8gZmlyc3QgZ2V0IGFuIEVuZHBvaW50RGVzY3JpcHRpb24gaW5zdGFuY2UKLSAgICAgICAgSmF2YUNsYXNzVG9EQkNDb252ZXJ0ZXIgY29udmVydGVyID0gbmV3IEphdmFDbGFzc1RvREJDQ29udmVydGVyKEFubm90YXRlZFNlcnZpY2UuY2xhc3MpOwotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNNYXAgPSBjb252ZXJ0ZXIucHJvZHVjZURCQygpOwotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgZGJjID0gZGJjTWFwLmdldChBbm5vdGF0ZWRTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KCJ0ZXN0S2V5IiwgInRlc3RWYWx1ZSIpOwotICAgICAgICBkYmMuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgTGlzdDxTZXJ2aWNlRGVzY3JpcHRpb24+IHNkTGlzdCA9IERlc2NyaXB0aW9uRmFjdG9yeUltcGwuY3JlYXRlU2VydmljZURlc2NyaXB0aW9uRnJvbURCQ01hcChkYmNNYXAsIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNkTGlzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZExpc3Quc2l6ZSgpLCAxKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gc2RMaXN0LmdldCgwKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpKTsKLSAgICAgICAgU3RyaW5nIHBuID0gZGJjLmdldFdlYlNlcnZpY2VBbm5vdCgpLnBvcnROYW1lKCk7Ci0gICAgICAgIFN0cmluZyB0bnMgPSBkYmMuZ2V0V2ViU2VydmljZUFubm90KCkudGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocG4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRucyk7Ci0gICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSh0bnMsIHBuKTsKLSAgICAgICAgRW5kcG9pbnREZXNjcmlwdGlvbiBlZCA9IHNkLmdldEVuZHBvaW50RGVzY3JpcHRpb24ocG9ydFFOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBub3cgdGVzdCB0aGUgc2V0UHJvcGVydGllc09uRW5kcG9pbnREZXNjIG1ldGhvZAotICAgICAgICBEZXNjcmlwdGlvbkZhY3RvcnlJbXBsLnNldFByb3BlcnRpZXNPbkVuZHBvaW50RGVzYyhlZCwgZGJjKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlZC5nZXRQcm9wZXJ0eSgidGVzdEtleSIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVkLmdldFByb3BlcnR5KCJ0ZXN0S2V5IiksICJ0ZXN0VmFsdWUiKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0WE1MRmlsZVN0cmVhbSgpIHsKLSAgICAJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgIAlTdHJpbmcgY29uZmlnTG9jID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiLyI7Ci0gICAgICAgICAgICBjb25maWdMb2MgPSBzZXAgKyAidGVzdC1yZXNvdXJjZXMiICsgc2VwICsgInRlc3QtaGFuZGxlci54bWwiOwotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsKLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGUoYmFzZURpciArIGNvbmZpZ0xvYykudG9VUkwoKS5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAJcmV0dXJuIGlzOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVzZXRDbGllbnRDb25maWdGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpZWxkIGZpZWxkID0gRGVzY3JpcHRpb25GYWN0b3J5SW1wbC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJjbGllbnRDb25maWdGYWN0b3J5Iik7Ci0gICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIGZpZWxkLnNldChudWxsLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VydmljZVN1YmNsYXNzIGV4dGVuZHMgamF2YXgueG1sLndzLlNlcnZpY2UgewotCi0gICAgICAgIHByb3RlY3RlZCBTZXJ2aWNlU3ViY2xhc3MoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICAgICAgc3VwZXIod3NkbERvY3VtZW50TG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYWNoaW5nQ2xpZW50Q29udGV4dEZhY3RvcnkgZXh0ZW5kcyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeSB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbnRleHQ7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q2xpZW50Q29uZmlndXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IHN1cGVyLmdldENsaWVudENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgdmVyc2lvbiBvZiBDYWNoaW5nQ2xpZW50Q29udGV4dEZhY3Rvcnk6ICIgKyBjb250ZXh0KTsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBjbGFzcyBTYW1wbGVBbm5vdGF0aW9uIGltcGxlbWVudHMgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIHsKLQotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gZGF0YU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBFbGVtZW50VHlwZSBlbGVtZW50VHlwZTsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8U3RyaW5nPiBrbm93blBhcmFtTmFtZXM7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgICAgICAKLSAgICAgICAgU2FtcGxlQW5ub3RhdGlvbihMaXN0PFN0cmluZz4ga25vd25QYXJhbU5hbWVzKSB7Ci0gICAgICAgICAgICB0aGlzLmtub3duUGFyYW1OYW1lcyA9IGtub3duUGFyYW1OYW1lczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbkNsYXNzTmFtZShTdHJpbmcgYW5ub3RhdGlvbkNsYXNzTmFtZSkgewotICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3NOYW1lID0gYW5ub3RhdGlvbkNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uQ2xhc3NOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFNhbXBsZUFubm90YXRpb24oKSB7Ci0gICAgICAgICAgICBrbm93blBhcmFtTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIGtub3duUGFyYW1OYW1lcy5hZGQoIm5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUGFyYW1ldGVyRGF0YShTdHJpbmcgcGFyYW1OYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgY2hlY2tQYXJhbU5hbWUocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIGRhdGFNYXAucHV0KHBhcmFtTmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJhbWV0ZXJEYXRhKFN0cmluZyBwYXJhbU5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgY2hlY2tQYXJhbU5hbWUocGFyYW1OYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRhTWFwLmdldChwYXJhbU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFbGVtZW50VHlwZSBnZXRUYXJnZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtTmFtZShTdHJpbmcgcGFyYW1OYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmKGtub3duUGFyYW1OYW1lcyAhPSBudWxsIAotICAgICAgICAgICAgICAgICAgICAmJiAKLSAgICAgICAgICAgICAgICAgICAgIWtub3duUGFyYW1OYW1lcy5pc0VtcHR5KCkgCi0gICAgICAgICAgICAgICAgICAgICYmIAotICAgICAgICAgICAgICAgICAgICAha25vd25QYXJhbU5hbWVzLmNvbnRhaW5zKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyICIgKyBwYXJhbU5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIGFuIHVua25vd24gcGFyYW1ldGVyIGZvciB0aGUgQ3VzdG9tQW5ub3RhdGlvbiB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgU2FtcGxlQW5ub3RhdGlvblByb2Nlc3NvciBpbXBsZW1lbnRzIEN1c3RvbUFubm90YXRpb25Qcm9jZXNzb3IgewotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lOwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25JbnN0YW5jZUNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lKFN0cmluZyBhbm5vdGF0aW9uSW5zdGFuY2VDbGFzc05hbWUpIHsKLSAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lID0gYW5ub3RhdGlvbkluc3RhbmNlQ2xhc3NOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc1R5cGVMZXZlbEFubm90YXRpb24oRW5kcG9pbnREZXNjcmlwdGlvbiBlZCwgQ3VzdG9tQW5ub3RhdGlvbkluc3RhbmNlIGFubm90YXRpb24pIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGVkLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgaWYoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKFNhbXBsZUFubm90YXRpb24uY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVBbm5vdGF0aW9uUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goQXhpc0ZhdWx0IGFmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0KLSAgICBAaW50ZXJmYWNlIEN1c3RvbSB7Ci0gICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICB9Ci0KLSAgICBAV2ViU2VydmljZSh0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcuYXBhY2hlLmV4YW1wbGUiLCBzZXJ2aWNlTmFtZT0iQW5ub3RhdGVkU2VydmljZSIsIHBvcnROYW1lPSJBbm5vdGF0ZWRQb3J0IikKLSAgICBAQ3VzdG9tKG5hbWU9IkFubm90YXRlZFNlcnZpY2UiKQotICAgIGNsYXNzIEFubm90YXRlZFNlcnZpY2UgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGVjaG9TdHJpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiBlY2hvU3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1BhcmFtZXRlckRlc2NyaXB0aW9uSW1wbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Y2RlMGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uUGFyYW1ldGVyRGVzY3JpcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBUZXN0SW50ZXJmYWNlLmNsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICAgTWV0aG9kIG1ldGhvZDEgPSBtZXRob2RzWzBdOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbiBwZGMxID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uSW1wbCgwLCBtZXRob2QxLmdldFBhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDEuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDEuZ2V0QW5ub3RhdGlvbnMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocGRjMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhMaXN0W10uY2xhc3MsIHBkYzEuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gVGVzdEludGVyZmFjZS5jbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QyID0gbWV0aG9kc1sxXTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGRjMiA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwoMCwgbWV0aG9kMi5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QyLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QyLmdldEFubm90YXRpb25zKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYzIpOwotICAgICAgICAvLyBGSVhNRTogTmVlZCB0byBjaGFzZSB0aGlzIGRvd24gd2l0aCB0aGUgSGFybW9ueSBmb2xrcy4KLSAgICAgICAgaWYgKCEiRFJMVk0iLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0ubmFtZSIpKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZ1tdLmNsYXNzLCBwZGMyLmdldFBhcmFtZXRlckFjdHVhbFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IFRlc3RJbnRlcmZhY2UuY2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgICBNZXRob2QgbWV0aG9kMyA9IG1ldGhvZHNbMl07Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkYzMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25JbXBsKDAsIG1ldGhvZDMuZ2V0UGFyYW1ldGVyVHlwZXMoKVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kMy5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kMy5nZXRBbm5vdGF0aW9ucygpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RbXS5jbGFzcywgcGRjMy5nZXRQYXJhbWV0ZXJBY3R1YWxUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewotICAgICAgICBNZXRob2RbXSBtZXRob2RzID0gVGVzdEludGVyZmFjZS5jbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBtZXRob2Q0ID0gbWV0aG9kc1szXTsKLSAgICAgICAgUGFyYW1ldGVyRGVzY3JpcHRpb24gcGRjNCA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwoMCwgbWV0aG9kNC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q0LmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q0LmdldEFubm90YXRpb25zKCksIG51bGwpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHBkYzQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nW10uY2xhc3MsIHBkYzQuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IFRlc3RJbnRlcmZhY2UuY2xhc3MuZ2V0TWV0aG9kcygpOwotICAgICAgICBNZXRob2QgbWV0aG9kNSA9IG1ldGhvZHNbNF07Ci0gICAgICAgIFBhcmFtZXRlckRlc2NyaXB0aW9uIHBkYyA9IG5ldyBQYXJhbWV0ZXJEZXNjcmlwdGlvbkltcGwoMCwgbWV0aG9kNS5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDUuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kNS5nZXRBbm5vdGF0aW9ucygpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChwZGMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoTGlzdFtdLmNsYXNzLCBwZGMuZ2V0UGFyYW1ldGVyQWN0dWFsVHlwZSgpKTsKLSAgICB9Ci19Ci0KLWludGVyZmFjZSBUZXN0SW50ZXJmYWNlIHsKLSAgICBTdHJpbmcgbWV0aG9kMShIb2xkZXI8TGlzdDxTdHJpbmc+W10+IGZvbyk7Ci0KLSAgICBTdHJpbmcgbWV0aG9kMihIb2xkZXI8U3RyaW5nW10+IGZvbyk7Ci0KLSAgICBTdHJpbmcgbWV0aG9kMyhIb2xkZXI8TGlzdDw/PltdPiBmb28pOwotCi0gICAgU3RyaW5nIG1ldGhvZDQoU3RyaW5nW10gZm9vKTsKLQotICAgIFN0cmluZyBtZXRob2Q1KExpc3Q8U3RyaW5nPltdIGZvbyk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2ltcGwvU2VydmljZURlc2NyaXB0aW9uSW1wbFRlc3RzLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFkZDg3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uU2VydmljZURlc2NyaXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhpcyB0ZXN0IHZhbGlkYXRlcyB0aGUgZXJyb3IgY2hlY2tpbmcgYW5kIGludGVybmFsIGZ1bmN0aW9uaW5nIG9mIHRoZSBTZXJ2aWNlRGVzY3JpcHRpb24gY2xhc3MuCi0gKiBUaGVzZSB0ZXN0cyBhcmUgdGhlIGNvbnN0cnVjdGlvbiBvZiBhIGEgU2VydmljZURlc2NyaXB0aW9uLiAgRGlyZWN0IHRlc3RzIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mCi0gKiBhIFNlcnZpY2VEZXNjcmlwdGlvbiBhbmQgb3RoZXIgRGVzY3JpcHRpb24gY2xhc3NlcyBpcyBkb25lIGluIFdTRExEZXNjcmlwdGlvblRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZURlc2NyaXB0aW9uSW1wbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVUkkgPQotICAgICAgICAgICAgImh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLlNlcnZpY2VEZXNjcmlwdGlvblRlc3RzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9jYWxQYXJ0ID0gIkVjaG9TZXJ2aWNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRTmFtZSBzZXJ2aWNlUU5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlVVJJLCBsb2NhbFBhcnQpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxXU0RMKCkgewotCi0gICAgICAgIFFOYW1lIHVuaXF1ZVFOYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZVVSSSwgbG9jYWxQYXJ0ICsgIl90ZXN0TnVsbFdTREwiKTsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwobnVsbCwgdW5pcXVlUU5hbWUsIGphdmF4LnhtbC53cy5TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2VydmljZSBkZXNjcmlwdGlvbiBub3QgY3JlYXRlZCB3aXRoIG51bGwgV1NETCIsIHNlcnZpY2VEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bGxTZXJ2aWNlTmFtZSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKG51bGwsIG51bGwsIGphdmF4LnhtbC53cy5TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBmb3IgbnVsbCBTZXJ2aWNlIE5hbWUgbm90IHRocm93bi4iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoV2ViU2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgICAgICAvLyBUT0RPIE1lc3NhZ2UgdGV4dCBjaGFuZ2VkCi0gICAgICAgICAgICAvL2Fzc2VydEVxdWFscygiRGlkIG5vdCByZWNlaXZlIGNvcnJlY3QgZXhjZXB0aW9uIiwgIkludmFsaWQgU2VydmljZSBjbGFzcy4gIFRoZSBzZXJ2aWNlIFFOYW1lIGNhbm5vdCBiZSBudWxsLiIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU2VydmljZUNsYXNzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKG51bGwsIHNlcnZpY2VRTmFtZSwgT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBmb3IgaW52YWxpZCBTZXJ2aWNlIGNsYXNzIG5vdCB0aHJvd24uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcGF0aAotICAgICAgICAgICAgLy8gVE9ETyBNZXNzYWdlIHRleHQgY2hhbmdlZAotICAgICAgICAgICAgLy9hc3NlcnRFcXVhbHMoIkRpZCBub3QgcmVjZWl2ZSBjb3JyZWN0IGV4Y2VwdGlvbiIsICJJbnZhbGlkIFNlcnZpY2UgQ2xhc3M7IG11c3QgYmUgYXNzaWduYWJsZSB0byBqYXZheC54bWwud3MuU2VydmljZSIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsU2VydmljZUNsYXNzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNlcnZpY2VEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKG51bGwsIHNlcnZpY2VRTmFtZSwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZm9yIGludmFsaWQgU2VydmljZSBjbGFzcyBub3QgdGhyb3duLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgICAgIC8vIFRPRE8gTWVzc2FnZSB0ZXh0IGNoYW5nZWQKLSAgICAgICAgICAgIC8vYXNzZXJ0RXF1YWxzKCJEaWQgbm90IHJlY2VpdmUgY29ycmVjdCBleGNlcHRpb24iLCAiSW52YWxpZCBTZXJ2aWNlIENsYXNzOyBjYW5ub3QgYmUgbnVsbCIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkU2VydmljZVN1YmNsYXNzKCkgewotICAgICAgICBRTmFtZSB1bmlxdWVRTmFtZSA9IG5ldyBRTmFtZShuYW1lc3BhY2VVUkksIGxvY2FsUGFydCArICJfdGVzdFZhbGlkU2VydmljZVN1YmNsYXNzIik7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZXJ2aWNlRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVzY3JpcHRpb25JbXBsKG51bGwsIHVuaXF1ZVFOYW1lLCBTZXJ2aWNlU3ViY2xhc3MuY2xhc3MpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJTZXJ2aWNlIGRlc2NyaXB0aW9uIG5vdCBjcmVhdGVkIHdpdGggdmFsaWQgU2VydmljZSBzdWJjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgc2VydmljZURlc2NyaXB0aW9uKTsKLSAgICB9Ci19Ci0KLWNsYXNzIFNlcnZpY2VTdWJjbGFzcyBleHRlbmRzIGphdmF4LnhtbC53cy5TZXJ2aWNlIHsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlU3ViY2xhc3MoVVJMIHdzZGxEb2N1bWVudExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsRG9jdW1lbnRMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGxWYWxpZGF0aW9uVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9pbXBsL1NlcnZpY2VEZXNjcmlwdGlvbkltcGxWYWxpZGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkMmFlOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vaW1wbC9TZXJ2aWNlRGVzY3JpcHRpb25JbXBsVmFsaWRhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLkRlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmJ1aWxkZXIuTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5idWlsZGVyLlBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uYnVpbGRlci5XZWJTZXJ2aWNlQW5ub3Q7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VEZXNjcmlwdGlvbkltcGxWYWxpZGF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVJbXBsTWV0aG9kc1ZzU0VJKCkgewotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWlDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgc2VpTURDLnNldE1ldGhvZE5hbWUoInNlaU1ldGhvZCIpOwotICAgICAgICBzZWlDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoc2VpTURDKTsKLSAgICAgICAgV2ViU2VydmljZUFubm90IHNlaVdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIHNlaVdlYlNlcnZpY2VBbm5vdC5zZXROYW1lKG51bGwpOwotICAgICAgICBzZWlDb21wb3NpdGUuc2V0V2ViU2VydmljZUFubm90KHNlaVdlYlNlcnZpY2VBbm5vdCk7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlJbXBsIik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgaW1wbE1EQy5zZXRNZXRob2ROYW1lKCJub3RTZWlNZXRob2QiKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShpbXBsTURDKTsKLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXROYW1lKG51bGwpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0RW5kcG9pbnRJbnRlcmZhY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldElzSW50ZXJmYWNlKGZhbHNlKTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTGlzdC5wdXQoc2VpQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBzZWlDb21wb3NpdGUpOwotICAgICAgICBkYmNMaXN0LnB1dChpbXBsQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBpbXBsQ29tcG9zaXRlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY0ltcGwgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbChkYmNMaXN0LCBpbXBsQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCBleGNlcHRpb24gZm9yIHZhbGlkYXRpb24gZXJyb3JzIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU92ZXJsb2FkZWRJbXBsTWV0aG9kc1ZzU0VJKCkgewotICAgICAgICAKLSAgICAgICAgLy8gVGVzdHMgdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgdmFsaWRhdGUgY29ycmVjdGx5LiAgTm90ZSB0aGF0IHRoZSBtZXRob2RzIGFyZSAKLSAgICAgICAgLy8gaW50ZW50aW9uYWxseSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24gYW5kIHNlaSBpbiBhIGRpZmZlcmVudCBvcmRlciBzbyB0aGF0IHRoZXkKLSAgICAgICAgLy8gZG9uJ3QgY29pbmNpZGVudGx5IHBhc3MgdmFsaWRhdGlvbiBqdXN0IGJlY2F1c2UgdGhleSBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgaW4gYm90aAotICAgICAgICAvLyBjb2xsZWN0aW9ucy4KLSAgICAgICAgLy8gICBzZWlNZXRob2QoKQotICAgICAgICAvLyAgIHNlaU1ldGhvZChTdHJpbmcpCi0gICAgICAgIAotICAgICAgICAvLyBCdWlsZCB1cCB0aGUgU0VJCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWlDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHNlaU1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzZWlNREMuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShzZWlNREMpOwotICAgICAgICAKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc2VpTURDMiA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzZWlNREMyLnNldE1ldGhvZE5hbWUoInNlaU1ldGhvZCIpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlQREMgPSBuZXcgUGFyYW1ldGVyRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgc2VpUERDLnNldFBhcmFtZXRlclR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgc2VpTURDMi5hZGRQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZShzZWlQREMpOwotICAgICAgICBzZWlDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoc2VpTURDMik7Ci0gICAgICAgIAotICAgICAgICBXZWJTZXJ2aWNlQW5ub3Qgc2VpV2ViU2VydmljZUFubm90ID0gV2ViU2VydmljZUFubm90LmNyZWF0ZVdlYlNlcnZpY2VBbm5vdEltcGwoKTsKLSAgICAgICAgc2VpV2ViU2VydmljZUFubm90LnNldE5hbWUobnVsbCk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQW5ub3Qoc2VpV2ViU2VydmljZUFubm90KTsKLQotICAgICAgICAvLyBCdWlsZCB1cCB0aGUgSW1wbCwgYnV0IHB1dCB0aGUgb3ZlcmxvYWRlZCBNRENzIG9uIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhlIFNFSSAKLSAgICAgICAgLy8gc28gdGhleSBkb24ndCBqdXN0IGhhcHBlbiB0byBwYXNzIHZhbGlkYXRpb24KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIGltcGxDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlJbXBsIik7Ci0KLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgaW1wbE1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBpbXBsTURDLnNldE1ldGhvZE5hbWUoInNlaU1ldGhvZCIpOwotICAgICAgICBQYXJhbWV0ZXJEZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsUERDID0gbmV3IFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxQREMuc2V0UGFyYW1ldGVyVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBpbXBsTURDLmFkZFBhcmFtZXRlckRlc2NyaXB0aW9uQ29tcG9zaXRlKGltcGxQREMpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKGltcGxNREMpOwotCi0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIGltcGxNREMyID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxNREMyLnNldE1ldGhvZE5hbWUoInNlaU1ldGhvZCIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKGltcGxNREMyKTsKLSAgICAgICAgCi0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0TmFtZShudWxsKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldEVuZHBvaW50SW50ZXJmYWNlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlTRUkiKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRJc0ludGVyZmFjZShmYWxzZSk7Ci0KLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4gZGJjTGlzdCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+KCk7Ci0gICAgICAgIGRiY0xpc3QucHV0KHNlaUNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgc2VpQ29tcG9zaXRlKTsKLSAgICAgICAgZGJjTGlzdC5wdXQoaW1wbENvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgaW1wbENvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc2VydmljZURlc2NJbXBsID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoZGJjTGlzdCwgaW1wbENvbXBvc2l0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBOT1QgaGF2ZSBjYXVnaHQgZXhjZXB0aW9uIGZvciB2YWxpZGF0aW9uIGVycm9yczogIiArIGV4KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24gIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUltcGxNZXRob2RzVnNTRUlJbmhlcml0ZW5jZSgpIHsKLQotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc3VwZXJTZWlDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIHN1cGVyU2VpQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U3VwZXJTRUkiKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc3VwZXJTZWlNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgc3VwZXJTZWlNREMuc2V0TWV0aG9kTmFtZSgic3VwZXJTZWlNZXRob2QiKTsKLSAgICAgICAgc3VwZXJTZWlDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoc3VwZXJTZWlNREMpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBzZWlDb21wb3NpdGUgPSBuZXcgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaUNvbXBvc2l0ZS5zZXRDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBzZWlNREMgPSBuZXcgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoKTsKLSAgICAgICAgc2VpTURDLnNldE1ldGhvZE5hbWUoInNlaU1ldGhvZCIpOwotICAgICAgICBzZWlDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoc2VpTURDKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLnNldFN1cGVyQ2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlTdXBlclNFSSIpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBpbXBsQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15SW1wbCIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsTURDID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxNREMuc2V0TWV0aG9kTmFtZSgic3VwZXJTZWlNZXRob2QiKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShpbXBsTURDKTsKLSAgICAgICAgV2ViU2VydmljZUFubm90IHdlYlNlcnZpY2VBbm5vdCA9IFdlYlNlcnZpY2VBbm5vdC5jcmVhdGVXZWJTZXJ2aWNlQW5ub3RJbXBsKCk7Ci0gICAgICAgIHdlYlNlcnZpY2VBbm5vdC5zZXROYW1lKG51bGwpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0RW5kcG9pbnRJbnRlcmZhY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVNFSSIpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldFdlYlNlcnZpY2VBbm5vdCh3ZWJTZXJ2aWNlQW5ub3QpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldElzSW50ZXJmYWNlKGZhbHNlKTsKLQotICAgICAgICBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPiBkYmNMaXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZT4oKTsKLSAgICAgICAgZGJjTGlzdC5wdXQoc2VpQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBzZWlDb21wb3NpdGUpOwotICAgICAgICBkYmNMaXN0LnB1dChzdXBlclNlaUNvbXBvc2l0ZS5nZXRDbGFzc05hbWUoKSwgc3VwZXJTZWlDb21wb3NpdGUpOwotICAgICAgICBkYmNMaXN0LnB1dChpbXBsQ29tcG9zaXRlLmdldENsYXNzTmFtZSgpLCBpbXBsQ29tcG9zaXRlKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZURlc2NyaXB0aW9uSW1wbCBzZXJ2aWNlRGVzY0ltcGwgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmljZURlc2NyaXB0aW9uSW1wbChkYmNMaXN0LCBpbXBsQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGNhdWdodCB2YWxpZGF0aW9uIGZhaWx1cmUgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdlYlNlcnZpY2VFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIHBhdGgKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgd3JvbmcgZXhjZXB0aW9uICIgKyBleC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSB0ZXN0cyBiZWxvdyBwcm9ncmVzc2l2ZWx5IHNldHVwIGFuIGlkZW50aWNhbCBEQkMsIGdyYWR1YWxseSBzZXR0aW5nIG1vcmUgdmFsdWVzIHVudGlsCi0gICAgLy8gdGhlIGxhc3Qgb25lIGRvZXMgbm90IGNhdXNlIGEgdmFsaWRhdGlvbiBlcnJvci4KLQotICAgIC8vIEZBSUxVUkUgIzE6IE5vIFdlYk1ldGhvZCBhbm5vdGF0aW9uIHNldCBvbiB0aGUgU0VJCi0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWREQkMxKCkgewotICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUgc2VpQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBzZWlDb21wb3NpdGUuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlTRUkiKTsKLSAgICAgICAgTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUgc2VpTURDID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIHNlaU1EQy5zZXRNZXRob2ROYW1lKCJzZWlNZXRob2QiKTsKLSAgICAgICAgc2VpQ29tcG9zaXRlLmFkZE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKHNlaU1EQyk7Ci0KLSAgICAgICAgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlIHN1cGVySW1wbENvbXBvc2l0ZSA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGUoKTsKLSAgICAgICAgc3VwZXJJbXBsQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15U3VwZXJJbXBsIik7Ci0gICAgICAgIE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlIHN1cGVySW1wbE1EQyA9IG5ldyBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSgpOwotICAgICAgICBzdXBlckltcGxNREMuc2V0TWV0aG9kTmFtZSgic2VpTWV0aG9kIik7Ci0gICAgICAgIHN1cGVySW1wbENvbXBvc2l0ZS5hZGRNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZShzdXBlckltcGxNREMpOwotCi0gICAgICAgIERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSBpbXBsQ29tcG9zaXRlID0gbmV3IERlc2NyaXB0aW9uQnVpbGRlckNvbXBvc2l0ZSgpOwotICAgICAgICBpbXBsQ29tcG9zaXRlLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5kZXNjcmlwdGlvbi5pbXBsLk15SW1wbCIpOwotICAgICAgICBNZXRob2REZXNjcmlwdGlvbkNvbXBvc2l0ZSBpbXBsTURDID0gbmV3IE1ldGhvZERlc2NyaXB0aW9uQ29tcG9zaXRlKCk7Ci0gICAgICAgIGltcGxNREMuc2V0TWV0aG9kTmFtZSgibm90U2VpTWV0aG9kIik7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuYWRkTWV0aG9kRGVzY3JpcHRpb25Db21wb3NpdGUoaW1wbE1EQyk7Ci0gICAgICAgIFdlYlNlcnZpY2VBbm5vdCB3ZWJTZXJ2aWNlQW5ub3QgPSBXZWJTZXJ2aWNlQW5ub3QuY3JlYXRlV2ViU2VydmljZUFubm90SW1wbCgpOwotICAgICAgICB3ZWJTZXJ2aWNlQW5ub3Quc2V0TmFtZShudWxsKTsKLSAgICAgICAgd2ViU2VydmljZUFubm90LnNldEVuZHBvaW50SW50ZXJmYWNlKCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmRlc2NyaXB0aW9uLmltcGwuTXlTRUkiKTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRXZWJTZXJ2aWNlQW5ub3Qod2ViU2VydmljZUFubm90KTsKLSAgICAgICAgaW1wbENvbXBvc2l0ZS5zZXRJc0ludGVyZmFjZShmYWxzZSk7Ci0gICAgICAgIGltcGxDb21wb3NpdGUuc2V0U3VwZXJDbGFzc05hbWUoIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uaW1wbC5NeVN1cGVySW1wbCIpOwotCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdGlvbkJ1aWxkZXJDb21wb3NpdGU+IGRiY0xpc3QgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgRGVzY3JpcHRpb25CdWlsZGVyQ29tcG9zaXRlPigpOwotICAgICAgICBkYmNMaXN0LnB1dChzZWlDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIHNlaUNvbXBvc2l0ZSk7Ci0gICAgICAgIGRiY0xpc3QucHV0KGltcGxDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIGltcGxDb21wb3NpdGUpOwotICAgICAgICBkYmNMaXN0LnB1dChzdXBlckltcGxDb21wb3NpdGUuZ2V0Q2xhc3NOYW1lKCksIHN1cGVySW1wbENvbXBvc2l0ZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbkltcGwgc2VydmljZURlc2NJbXBsID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdGlvbkltcGwoZGJjTGlzdCwgaW1wbENvbXBvc2l0ZSk7Ci0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGNhdGNoIGV4cGVjdGVkIGV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXZWJTZXJ2aWNlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBFeHBlY3RlZCBwYXRoCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBleGNlcHRpb24gcmVjZWl2ZWQgIiArIGV4LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9qYXh3cy9TdWJQYWNrYWdlRXhjZXB0aW9uQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VFeGNlcHRpb25CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OGVjZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VFeGNlcHRpb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uamF4d3M7Ci0KLS8qKiBVc2VkIGJ5IFdyYXBwZWRQYWNrYWdlVGVzdHMgKi8KLXB1YmxpYyBjbGFzcyBTdWJQYWNrYWdlRXhjZXB0aW9uQmVhbiB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9qYXh3cy9TdWJQYWNrYWdlTWV0aG9kMS5qYXZhIGIvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VNZXRob2QxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDVmMTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2Rlc2NyaXB0aW9uL2pheHdzL1N1YlBhY2thZ2VNZXRob2QxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uamF4d3M7Ci0KLS8qKiBVc2VkIGJ5IFdyYXBwZWRQYWNrYWdlVGVzdHMgKi8KLXB1YmxpYyBjbGFzcyBTdWJQYWNrYWdlTWV0aG9kMSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9qYXh3cy9TdWJQYWNrYWdlTWV0aG9kMVJlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvamF4d3MvZGVzY3JpcHRpb24vamF4d3MvU3ViUGFja2FnZU1ldGhvZDFSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDUyMGIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9kZXNjcmlwdGlvbi9qYXh3cy9TdWJQYWNrYWdlTWV0aG9kMVJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuZGVzY3JpcHRpb24uamF4d3M7Ci0KLS8qKiBVc2VkIGJ5IFdyYXBwZWRQYWNrYWdlVGVzdHMgKi8KLXB1YmxpYyBjbGFzcyBTdWJQYWNrYWdlTWV0aG9kMVJlc3BvbnNlIHsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3JlZ2lzdHJ5L01ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5VGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL21ldGFkYXRhL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9tZXRhZGF0YS9yZWdpc3RyeS9NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMGIxOWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3JlZ2lzdHJ5L01ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV0YWRhdGEucmVnaXN0cnk7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy53c2RsLldTRExSZWFkZXJDb25maWd1cmF0b3I7DQotDQotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsNCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeVRlc3RzIGV4dGVuZHMgVGVzdENhc2Ugew0KLSAgICANCi0gICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25GaWxlKCkgew0KLSAgICAgICAgU3RyaW5nIGNvbmZpZ0xvYyA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIFN0cmluZyBzZXAgPSAiLyI7DQotICAgICAgICAgICAgY29uZmlnTG9jID0gc2VwICsgInRlc3QtcmVzb3VyY2VzIiArIHNlcCArICJNRVRBLUlORiIgKyBzZXAgKyAic2VydmljZXMiICsNCi0gICAgICAgICAgICBzZXAgKyAib3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeSI7DQotICAgICAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCIuIikpLmdldENhbm9uaWNhbFBhdGgoKTsNCi0gICAgICAgICAgICBjb25maWdMb2MgPSBuZXcgRmlsZShiYXNlRGlyICsgY29uZmlnTG9jKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmKGNvbmZpZ0xvYyAhPSBudWxsKSB7DQotICAgICAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0Q29uZmlndXJhdGlvbkZpbGVMb2NhdGlvbihjb25maWdMb2MpOw0KLSAgICAgICAgICAgIE9iamVjdCBvYmogPSBNZXRhZGF0YUZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5KFRlc3RJbnRlcmZhY2UuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob2JqKTsNCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMob2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBUZXN0SW1wbGVtZW50YXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsgDQotICAgICAgICB9DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlcldTRExSZWFkZXJDb25maWd1cmF0b3IoKSB7DQotICAgIAlFeGNlcHRpb24gZSA9IG51bGw7DQotICAgIAlXU0RMUmVhZGVyIHJlYWRlciA9IG51bGw7DQotICAgIAl0cnkgew0KLSAgICAJCVdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOw0KLSAgICAgICAgCXJlYWRlciA9IGZhY3RvcnkubmV3V1NETFJlYWRlcigpOw0KLSAgICAJfQ0KLSAgICAJY2F0Y2goRXhjZXB0aW9uIGUyKSB7DQotICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgCQllID0gZTI7DQotICAgIAl9DQotICAgIAlhc3NlcnROdWxsKGUpOw0KLSAgICAJYXNzZXJ0Tm90TnVsbChyZWFkZXIpOw0KLSAgICAJV1NETFJlYWRlckNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSAoV1NETFJlYWRlckNvbmZpZ3VyYXRvcikgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuDQotICAgIAkJZ2V0RmFjdG9yeShXU0RMUmVhZGVyQ29uZmlndXJhdG9yLmNsYXNzKTsNCi0gICAgCWFzc2VydE5vdE51bGwoY29uZmlndXJhdG9yKTsNCi0gICAgCXRyeSB7DQotICAgIAkJY29uZmlndXJhdG9yLmNvbmZpZ3VyZVJlYWRlckluc3RhbmNlKHJlYWRlcik7DQotICAgIAl9DQotICAgIAljYXRjaChFeGNlcHRpb24gZTIpIHsNCi0gICAgCQllID0gZTI7DQotICAgIAl9DQotICAgIAlhc3NlcnROdWxsKGUpOw0KLSAgICAJYXNzZXJ0RXF1YWxzKHJlYWRlci5nZXRGZWF0dXJlKGNvbS5pYm0ud3NkbC5Db25zdGFudHMuRkVBVFVSRV9WRVJCT1NFKSwgZmFsc2UpOw0KLSAgICB9DQotDQotICAgIC8vIFRoaXMgaW50ZXJmYWNlIGNsYXNzIHdpbGwgYmUgdXNlZCB0byB0ZXN0IHRoZSBmaWxlIGJhc2VkIHJlZ2lzdHJhdGlvbg0KLSAgICAvLyBvZiBjdXN0b20gaW1wbGVtZW50YXRpb25zIHdpdGggdGhlIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5DQotICAgIHB1YmxpYyBpbnRlcmZhY2UgVGVzdEludGVyZmFjZSB7DQotICAgICAgICBwdWJsaWMgdm9pZCBkb1NvbWV0aGluZygpOw0KLSAgICB9DQotICAgIA0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVnaXN0cnkvVGVzdEltcGxlbWVudGF0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXRhZGF0YS90ZXN0L29yZy9hcGFjaGUvYXhpczIvbWV0YWRhdGEvcmVnaXN0cnkvVGVzdEltcGxlbWVudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjUyMmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV0YWRhdGEvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL21ldGFkYXRhL3JlZ2lzdHJ5L1Rlc3RJbXBsZW1lbnRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIGEgbW9jayBpbXBlbGVtZW50YXRpb24gY2xhc3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8NCi0gKiB0ZXN0IHRoZSBmaWxlLWJhc2VkIHJlZ2lzdHJhdGlvbiBvZiBjbGFzc2VzIHdpdGggdGhlDQotICogTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuIFRoZSBmaWxlLWJhc2VkIHJlZ2lzdHJhdGlvbiBkb2VzDQotICogbm90IHN1cHBvcnQgaW5uZXIgaW1wbGVtZW50YXRpb24gY2xhc3NlcywgdGh1cyB0aGUgbmVlZCBmb3IgDQotICogdGhpcyBvdXRlciBjbGFzcy4NCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBUZXN0SW1wbGVtZW50YXRpb24gew0KLQ0KLSAgICBwdWJsaWMgVGVzdEltcGxlbWVudGF0aW9uKCkgew0KLSAgICAgICAgDQotICAgIH0NCi0gICAgDQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21leC9wb20ueG1sIGIvMV81L21vZHVsZXMvbWV4L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTMzNzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPm1leDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIE1FWDwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+V1MtTWV0YWRhdGEgRXhjaGFuZ2UgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL21leDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL21leDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvbWV4PC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT50ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Y29uZjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jaWVzPmZhbHNlPC9pbmNsdWRlRGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNsYXNzcGF0aC1tb2R1bGU8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5jbGFzc3BhdGgtbW9kdWxlPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhpcyBKQVIgaXMgdXNlZCBieSBSYW1wYXJ0OyBzZWUgQVhJUzItMzc0NSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5pbXBsPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+aW1wbDwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL21vZHVsZS54bWw8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9NRVRBLUlORi9tb2R1bGUueG1sIGIvMV81L21vZHVsZXMvbWV4L3NyYy9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDQ2MDE4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxtb2R1bGUgbmFtZT0ibWV0YWRhdGFFeGNoYW5nZSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIubWV4Lk1ldGFkYXRhRXhjaGFuZ2VNb2R1bGUiPg0KLSAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0TWV0YWRhdGEiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+DQotICAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5tZXguTWV4TWVzc2FnZVJlY2VpdmVyIi8+DQotDQotICAgICAgICA8IS0tIG5hbWVzcGFjZXMgZm9yIHRoZSAyMDA0LTA5IHNwZWMgLS0+DQotICAgICAgICANCi0gICAgICAgICA8YWN0aW9uTWFwcGluZz5odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leC9HZXRNZXRhZGF0YS9SZXF1ZXN0PC9hY3Rpb25NYXBwaW5nPg0KLSAgICAgICAgIDxvdXRwdXRBY3Rpb25NYXBwaW5nPmh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvbWV4L0dldE1ldGFkYXRhL1Jlc3BvbnNlPC9vdXRwdXRBY3Rpb25NYXBwaW5nPg0KLSAgICAgICANCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLQ0KLTwvbW9kdWxlPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV0YWRhdGFFeGNoYW5nZU1vZHVsZS5qYXZhIGIvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXRhZGF0YUV4Y2hhbmdlTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGUwN2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXRhZGF0YUV4Y2hhbmdlTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci0KLS8qKgotICogTWV0YWRhdGEgRXhjaGFuZ2UgTW9kdWxlIHRvIHN1cHBvcnQgV1MtTUVYIHNwZWNpZmljYXRpb24KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFFeGNoYW5nZU1vZHVsZSBpbXBsZW1lbnRzIE1vZHVsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWV0YWRhdGFFeGNoYW5nZU1vZHVsZS5jbGFzcyk7Ci0KLQlwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCWlmKGxvZy5pc0RlYnVnRW5hYmxlZCgpKXsKLQkJCWxvZy5kZWJ1ZygibWV0YWRhdGFFeGNoYW5nZSBtb2R1bGUgaGFzIGJlZW4gZW5nYWdlZCB0byBTZXJ2aWNlLiIgKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpCi0JCQl0aHJvd3MgQXhpc0ZhdWx0IHsKLQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkKLQkJCXRocm93cyBBeGlzRmF1bHQgewotCQotCi0JfQotCi0JcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0JCQkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXBwb3J0QXNzZXJ0aW9uKEFzc2VydGlvbiBhc3NlcnRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODNkMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4OwotCi0vKioKLSAqIENvbnRhaW5zIGFsbCB0aGUgTWV0YWRhdGFFeGNoYW5nZSBjb25zdGFudHMgZm9yIFdTLU1leC4KLSAqIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTWV4Q29uc3RhbnRzIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFNQRUNfVkVSU0lPTlMgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB2MV8wID0gIlNwZWNfMjAwNF8wOSI7Ci0JfQotICAgIHB1YmxpYyBpbnRlcmZhY2UgU3BlY18yMDA0XzA5IHsKLQkJCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leCI7Ci0KLQkgICAgcHVibGljIGludGVyZmFjZSBBY3Rpb25zIHsKLQkgICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9NRVRBREFUQV9SRVFVRVNUID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvbWV4L0dldE1ldGFkYXRhL1JlcXVlc3QiOwotCSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX01FVEFEQVRBX1JFU1BPTlNFID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvbWV4L0dldE1ldGFkYXRhL1Jlc3BvbnNlIjsKLQkJCQotCSAgICB9Ci0gICAgfQotICAgIAotICAKLSAgICBwdWJsaWMgaW50ZXJmYWNlIFNPQVBWZXJzaW9uIHsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdjFfMSA9IDE7Ci0KLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdjFfMiA9IDI7Ci0gICAgCi0JfQotICAgIAotICAgIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgU1BFQyB7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1BSRUZJWCA9ICJtZXgiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTUVUQURBVEEgPSAiR2V0TWV0YWRhdGEiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMRUNUID0gIkRpYWxlY3QiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSID0gIklkZW50aWZpZXIiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBREFUQSA9ICJNZXRhZGF0YSI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1NFQ1RJT04gPSAiTWV0YWRhdGFTZWN0aW9uIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfUkVGRVJFTkNFID0gIk1ldGFkYXRhUmVmZXJlbmNlIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT04gPSAiTG9jYXRpb24iOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotCQkKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTEVDVF9UWVBFX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMRUNUX1RZUEVfUE9MSUNZID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5IjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTEVDVF9UWVBFX1NDSEVNQSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxFQ1RfVFlQRV9NRVggPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9tZXgiOwotCQkKLQl9Ci0gICAgCi0KLSAgICAvKioKLSAgICAgKiBNRVggQ29uZmlndXJhdGlvbiAKLSAgICAgKiAKLSAgICAgKiBTYW1wbGUgbWV4IGNvbmZpZ3VyYXRpb246Ci0gICAgICogPHBhcmFtZXRlciBuYW1lPSJtZXRhZGF0YWV4Y2hhbmdlIj4KLSAgICAgKiAgICAgPG91dHB1dGZvcm0gZGlhbGVjdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIGZvcm1zPSJsb2NhdGlvbiIgLz4KLSAgICAgKiAgICAgPG91dHB1dGZvcm0gZm9ybXM9ImlubGluZSxyZWZlcmVuY2UsbG9jYXRpb24iIC8+Ci0gICAgICogPC9wYXJhbWV0ZXI+IAotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgTUVYX0NPTkZJR3sKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVYX1BBUk0gPSAibWV0YWRhdGFFeGNoYW5nZSI7Ci0gICAgCQotICAgIAkvLyBBbGxvdyB0byBkaXNhYmxlIE1FWCBmb3IgYSBTZXJ2aWNlIGlmIE1FWCBpcyBlbmdhZ2VkIGdsb2JhbGx5LiAKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX01FWCA9ICJlbmFibGUiOyAKLSAgICAgICAgCi0gICAgCS8vIE9uZSBvciBtb3JlIG91dHB1dGZvcm0gZWxlbWVudCBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBtZXggY29uZmlndXJhdGlvbgotICAgIAkvLyBvdXRwdXRmb3JtIGVsZW1lbnQgY29udGFpbnMgYW4gb3B0aW9uYWwgImRpYWxlY3QiIGF0dHJpYnV0ZSBhbmQgYW4KLSAgICAJLy8gcmVxdWlyZWQgZm9ybXMgYXR0cmlidXRlLiAKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPUk1fUEFSTSA9ICJvdXRwdXRmb3JtIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTEVDVF9QQVJNID0gImRpYWxlY3QiOwotICAgIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNU19QQVJNID0gImZvcm1zIjsKLSAgICAJCi0gICAgCS8vIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIgdmFsdWVzCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUiA9ICIsIjsKLSAgICAJLy8gcG9zc2libGUgImZvcm1zIiBhdHRyaWJ1dGUgdmFsdWVzCi0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OID0gImxvY2F0aW9uIjsKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5MSU5FID0gImlubGluZSI7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRSA9ICJyZWZlcmVuY2UiOwotICAgIAkKLSAgICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhEaXNhYmxlZEV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhEaXNhYmxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQzYTA4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4RGlzYWJsZWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXg7Ci0KLXB1YmxpYyBjbGFzcyBNZXhEaXNhYmxlZEV4Y2VwdGlvbiBleHRlbmRzIE1leEV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4OTA5NTI4NzE4Njc4ODA2MDZMOwotCi0gICAgcHVibGljIE1leERpc2FibGVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQotICB9CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L01leEV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3YzlkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L01leEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi0vKioKLSAqIEJhc2UgRXhjZXB0aW9uIHRvIHJlcG9ydCBwcm9ibGVtIGZyb20gaW1wbGVtZW50YXRpb24gY2xhc3NlcyBvZiAKLSAqIFdTLU1ldGFkYXRhRXhjaGFuZ2UuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV4RXhjZXB0aW9uIGV4dGVuZHMgQXhpc0ZhdWx0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMzOTg2OTIzNDQyNjY4Mzc2OTBMOwotCi0gICAgcHVibGljIE1leEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgTWV4RXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCXN1cGVyKGUpOwotCX0KLQotICAgIHB1YmxpYyBNZXhFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvTWV4TWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDFjNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9NZXhNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRGF0YVJldHJpZXZhbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRGF0YVJldHJpZXZhbFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLk91dHB1dEZvcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbS5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbS5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbS5NZXRhZGF0YVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbS5NZXRhZGF0YVNlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgub20uTWV4T01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgudXRpbC5NZXhVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogTWVzc2FnZSBSZWNlaXZlciBmb3IgcHJvY2Vzc2luZyBXUy1NRVggR2V0TWV0YWRhdGEgcmVxdWVzdC4gCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV4TWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dE1lc3NhZ2VSZWNlaXZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1leE1lc3NhZ2VSZWNlaXZlci5jbGFzcyk7Ci0JUGFyYW1ldGVyIGF4aXNDb25maWdNRVhQYXJtID0gbnVsbDsKLSAgICBQYXJhbWV0ZXIgc2VydmljZUNvbmZpZ01FWFBhcm0gPSBudWxsOwotCVN0cmluZyBtZXhOYW1lc3BhY2VWYWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9jZXNzIEdldE1ldGFkYXRhIHJlcXVlc3QKLSAgICAgICAgKi8KLQlwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0JCQlNZXNzYWdlQ29udGV4dCBuZXdtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJQXhpc1NlcnZpY2UgdGhlU2VydmljZSA9IG1zZ0NvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsgICAgICAgCi0JCWF4aXNDb25maWdNRVhQYXJtID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGFyYW1ldGVyKE1leENvbnN0YW50cy5NRVhfQ09ORklHLk1FWF9QQVJNKTsKLQkJc2VydmljZUNvbmZpZ01FWFBhcm0gPSB0aGVTZXJ2aWNlLmdldFBhcmFtZXRlcihNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5NRVhfUEFSTSk7Ci0JCQotCQljaGVja19NRVhfZGlzYWJsZWQoc2VydmljZUNvbmZpZ01FWFBhcm0pOwotCQkKLQkJdHJ5IHsKLQkJCU1ldGFkYXRhIG1ldGFkYXRhID0gaGFuZGxlUmVxdWVzdChtc2dDb250ZXh0KTsKLQkJICAgICAgICB0aGVTZXJ2aWNlLnNldEVuZHBvaW50VVJMKG1zZ0NvbnRleHQuZ2V0VG8oKS5nZXRBZGRyZXNzKCkpOwotCi0JCQlpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotCQkJCVNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG5ld21zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLQkJCQlpZiAoZW52ZWxvcGUgPT0gbnVsbCkgewotCQkJCQlTT0FQRmFjdG9yeSBmYWMgPSBnZXRTT0FQRmFjdG9yeShtc2dDb250ZXh0KTsKLQkJCQkJZW52ZWxvcGUgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0JCQkJfQotICAgICAgICAgICAKLQkJCQlPTUVsZW1lbnQgcmVzdWx0ID0gbWV0YWRhdGEudG9PTSgpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQlBeGlzU2VydmljZSBzZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotCQkJCQlyZXN1bHQuZGVjbGFyZU5hbWVzcGFjZShzZXJ2aWNlLmdldFRhcmdldE5hbWVzcGFjZSgpLAotCQkJCQkJCXNlcnZpY2UuZ2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkpOwotCQkJCQllbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQocmVzdWx0KTsKLQkJCQl9Ci0KLQkJCQluZXdtc2dDb250ZXh0LnNldEVudmVsb3BlKGVudmVsb3BlKTsKLQkJCX0KLQkJCS8vIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZy5pbmZvKGUpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXhFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoTWV4RXhjZXB0aW9uKSBlOwotCQkJfQotCQkJdGhyb3cgbmV3IE1leEV4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0KLQkvKgotCSAqIEhhbmRsZSBHZXRNZXRhZGF0YSBSZXF1ZXN0IAotCSAqIEludGVycHJldGUgR2V0TWV0YWRhdGEgcmVxdWVzdCBhbmQgcHJvY2VzcyByZXF1ZXN0LgotCSAqIEByZXR1cm5zIE1ldGFkYXRhIG9iamVjdAotCSAqLwotCXByaXZhdGUgTWV0YWRhdGEgaGFuZGxlUmVxdWVzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQkJTWV0YWRhdGEgbWV0YWRhdGEgPSBudWxsOwotCQlTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0KLQkJU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLQkJT01FbGVtZW50IGFSZXEgPSBib2R5LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkksCi0JCQkJTWV4Q29uc3RhbnRzLlNQRUMuR0VUX01FVEFEQVRBKSk7Ci0gICAgICAgIAotCQlMaXN0IG1ldGFkYXRhX3JlcXVlc3RfbGlzdDsKLQkJaWYgKGFSZXEgIT0gbnVsbCkgewotICAgICAgICAgICAgbWV4TmFtZXNwYWNlVmFsdWUgPSBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSTsKLQkJCW1ldGFkYXRhX3JlcXVlc3RfbGlzdCA9IGRldGVybWluZU1ldGFkYXRhVHlwZXMoYVJlcSk7Ci0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBNZXhFeGNlcHRpb24oIkludmFsaWQgTWV0YWRhdGEgcmVxdWVzdCIpOwotCQl9Ci0KLQkJbWV0YWRhdGEgPSBwcm9jZXNzUmVxdWVzdChtZXRhZGF0YV9yZXF1ZXN0X2xpc3QsIG1zZ0NvbnRleHQsIGFSZXEpOwotCi0JCXJldHVybiBtZXRhZGF0YTsKLQl9Ci0KLQkvKgotCSAqIFByb2Nlc3MgdGhlIHJlcXVlc3RzCi0JICogCi0JICogQHBhcmFtIG1ldGFkYXRhX3JlcXVlc3RfbGlzdCBsaXN0IG9mIG1leCBEaWFsZWN0IGZvciByZXF1ZXN0aW5nIGRhdGEKLQkgKiBAbXNnQ29udGV4dCBNZXNzYWdlQ29udGV4dAotCSAqIEBhUmVxIEdldE1ldGFkYXRhIHJlcXVlc3QgCi0gICAgICovCi0JCi0JcHVibGljIE1ldGFkYXRhIHByb2Nlc3NSZXF1ZXN0KExpc3QgbWV0YWRhdGFfcmVxdWVzdF9saXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT01FbGVtZW50IGFSZXEpIHRocm93cyBNZXhFeGNlcHRpb24gewotCQkKLQkgICAgLy8gIEluc3RhbnRpYXRlIE1ldGFkYXRhIGluc3RhbmNlIHRvIGJ1aWxkIHRoZSBXUy1NZXggTWV0YWRhdGEgZWxlbWVudAotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFN0cmluZyBzb2FwTmFtZXNwYWNlVVJJID0gZW52ZWxvcGUuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBNZXhVdGlsLmdldFNPQVBGYWN0b3J5KHNvYXBOYW1lc3BhY2VVUkkpOwotICAgICAgICAKLSAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoZmFjdG9yeSwgbWV4TmFtZXNwYWNlVmFsdWUpOwotCQlEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0T3B0aW9ucyA9IG5ldyBEYXRhUmV0cmlldmFsUmVxdWVzdCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSBudWxsOwotCQkvLyBDaGVjayBpZiBJZGVudGlmaWVyIGVsZW1lbnQgaW5jbHVkZWQgaW4gcmVxdWVzdAotICAgICAgICBPTUVsZW1lbnQgZGlhbGVjdEVsZW0gPSBhUmVxLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgbWV4TmFtZXNwYWNlVmFsdWUsIE1leENvbnN0YW50cy5TUEVDLkRJQUxFQ1QpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkaWFsZWN0RWxlbSAhPSBudWxsKSAgewotICAgIAkJT01FbGVtZW50IGlkZW50aWZpZXIgPSBkaWFsZWN0RWxlbS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKAotICAgICAgICAgICAgICAgICAgICBtZXhOYW1lc3BhY2VWYWx1ZSwgTWV4Q29uc3RhbnRzLlNQRUMuSURFTlRJRklFUikpOwotICAgICAgICAgICAgCi0gICAgCQlpZiAoaWRlbnRpZmllciAhPSBudWxsKSB7Ci0gICAgCQkJaWRlbnRpZmllcl92YWx1ZSA9IGlkZW50aWZpZXIuZ2V0VGV4dCgpOwotICAgIAkJCWlmIChpZGVudGlmaWVyX3ZhbHVlICE9IG51bGwgJiYgaWRlbnRpZmllcl92YWx1ZS5sZW5ndGgoKSA+IDApIHsKLSAgICAJCQkJcmVxdWVzdE9wdGlvbnMucHV0SWRlbnRpZmllcihpZGVudGlmaWVyX3ZhbHVlKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCS8vIFByb2Nlc3MgdGhlIHJlcXVlc3QgYW5kIGFwcGVuZCBNZXRhZGF0YVNlY3Rpb24gdG8gTWV0YWRhdGEKLQkJLy8gTG9vcCB0aHJvdWdoIHRoZSBtZXRhZGF0YV9yZXF1ZXN0X2xpc3QgZm9yIERpYWxlY3QocykpLCBhbmQgc2V0dXAgcmVxdWVzdE9wdGlvbnMuCi0JCS8vIEJhc2ljYWxseSwgb25lIHJlcXVlc3RPcHRpb25zIGlzIHNldHVwIGZvciBlYWNoIHN1cHBvcnRlZCBvdXRwdXRGb3JtIGZvciB0aGUgRGlhbGVjdAotCQkvLyBhbmQgSWRlbnRpZmllciBzcGVjaWZpZWQgaW4gdGhlIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0JCWludCBsZW4gPSBtZXRhZGF0YV9yZXF1ZXN0X2xpc3Quc2l6ZSgpOwotCQlPdXRwdXRGb3JtW10gb3V0cHV0Zm9ybXM7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7IC8vIG1ldGFkYXRhIHJlcXVlc3QKLQotICAgICAgICAgICAgU3RyaW5nIGRpYWxlY3QgPSAiIjsKLQkJCXRyeSB7Ci0JCQkJZGlhbGVjdCA9IChTdHJpbmcpIG1ldGFkYXRhX3JlcXVlc3RfbGlzdC5nZXQoaSk7Ci0KLQkJCQlyZXF1ZXN0T3B0aW9ucy5wdXREaWFsZWN0KGRpYWxlY3QpOwotCi0JCQkJb3V0cHV0Zm9ybXMgPSBNZXhVdGlsLmRldGVybWluZU91dHB1dEZvcm0oZGlhbGVjdCwgYXhpc0NvbmZpZ01FWFBhcm0sIHNlcnZpY2VDb25maWdNRVhQYXJtKTsKLQkJCQkvLyBMb29wIHRvIGNhbGwgQXhpc1NlcnZpY2U6OmdldERhdGEgQVBJIHRvIHJldHJpZXZlIGRhdGEKLQkJCQkvLyBmb3IgdGhlIERpYWxlY3QgYW5kIElkZW50aWZpZXIoaWYgc3BlY2lmaWVkKSBpbiB0aGUgcmVxdWVzdAotCQkJCS8vIGZvciBlYWNoCi0JCQkJLy8gc3VwcG9ydGVkIG91dHB1dCBmb3JtLgotCQkJCQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3V0cHV0Zm9ybXMubGVuZ3RoOyBqKyspIHsgLy8gb3V0cHV0IGZvcm0KLQkJCQkJcmVxdWVzdE9wdGlvbnMucHV0T3V0cHV0Rm9ybShvdXRwdXRmb3Jtc1tqXSk7Ci0KLQkJCQkJRGF0YVtdIHJlc3VsdCA9ICBtc2dDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkuZ2V0RGF0YShyZXF1ZXN0T3B0aW9ucywKLQkJCQkJCQltc2dDb250ZXh0KTsKLQotCQkJCQlBcnJheUxpc3Qgc2VjdGlvbnMgPSBwcm9jZXNzRGF0YShyZXN1bHQsIG91dHB1dGZvcm1zW2pdLCBkaWFsZWN0LAotCQkJCQkJCSAgIGlkZW50aWZpZXJfdmFsdWUsIGZhY3RvcnkpOwotCQkJCQltZXRhZGF0YS5hZGRNZXRhZGF0U2VjdGlvbnMoc2VjdGlvbnMpOwotCQkJCX0KLQotCQkJfSBjYXRjaCAoRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nLmVycm9yKCJEYXRhIFJldHJpZXZhbCBleGNlcHRpb24gZGV0ZWN0ZWQgZm9yIGRpYWxlY3QsICIgKyBkaWFsZWN0LCBlKTsKLQkJCQkKLQkJCQl0aHJvdyBuZXcgTWV4RXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkKLQkJCQlsb2cuZXJyb3IoIlRocm93YWJsZSBkZXRlY3RlZCBmb3IgZGlhbGVjdCwgIiArIGRpYWxlY3QgLCBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCi0JCQkJdGhyb3cgbmV3IE1leEV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBtZXRhZGF0YTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBNZXRhZGF0YVNlY3Rpb24gZm9yIGVhY2ggRGF0YSBlbGVtZW50LCBhbmQgYWRkIHRoZQotCSAqIE1ldGFkYXRhU2VjdGlvbnMgdG8gTWV0YWRhdGEuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJvY2Vzc0RhdGEoRGF0YVtdIGRhdGEsIE91dHB1dEZvcm0gb3V0cHV0Rm9ybSwKLQkJCVN0cmluZyBkaWFsZWN0LCBTdHJpbmcgaWRlbnRpZmllcl92YWx1ZSwgU09BUEZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIE1leEV4Y2VwdGlvbiB7Ci0JCU1ldGFkYXRhU2VjdGlvbiBzZWN0aW9uPW51bGw7Ci0JCUFycmF5TGlzdCBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCA9PSAwKSB7Ci0JCQlpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpCi0JCQkJbG9nCi0JCQkJCQkuZGVidWcoIk5vIHJlc3VsdCB3YXMgcmV0dXJuZWQgZnJvbSBnZXREYXRhIHJlcXVlc3QgZm9yIGRpYWxlY3QsIgotCQkJCQkJCQkrIGRpYWxlY3QKLQkJCQkJCQkJKyAiIEZvcm06ICIKLQkJCQkJCQkJKyBvdXRwdXRGb3JtLmdldFR5cGUoKQotCQkJCQkJCQkrICIuIE5vIE1ldGFkYXRhU2VjdGlvbiB3aWxsIGJlIGFkZGVkISIpOwotCi0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IGRhdGEubGVuZ3RoOyBrKyspIHsKLQotCQkJCXNlY3Rpb24gPSBjcmVhdGVNZXRhZGF0YVNlY3Rpb24ob3V0cHV0Rm9ybSwgZGF0YVtrXS5nZXREYXRhKCksCi0JCQkJCQlmYWN0b3J5LCBtZXhOYW1lc3BhY2VWYWx1ZSk7Ci0KLQkJCQlzZWN0aW9uLnNldERpYWxlY3QoZGlhbGVjdCk7Ci0JCQkJaWRlbnRpZmllcl92YWx1ZSA9IGRhdGFba10uZ2V0SWRlbnRpZmllcigpOwotCi0JCQkJaWYgKGlkZW50aWZpZXJfdmFsdWUgIT0gbnVsbCkgewotCQkJCQlzZWN0aW9uLnNldElkZW50aWZpZXIoaWRlbnRpZmllcl92YWx1ZSk7Ci0JCQkJfQotCQkJCXNlY3Rpb25zLmFkZChzZWN0aW9uKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBzZWN0aW9uczsKLQl9Ci0KLQlwcml2YXRlIE1ldGFkYXRhU2VjdGlvbiBjcmVhdGVNZXRhZGF0YVNlY3Rpb24oT3V0cHV0Rm9ybSBvdXRwdXRGb3JtLAotCQkJT2JqZWN0IHJlc3VsdCwgU09BUEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIG1leE5hbWVzcGFjZVZhbHVlKQotCQkJdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJTWV0YWRhdGFTZWN0aW9uIHNlY3Rpb24gPSBuZXcgTWV0YWRhdGFTZWN0aW9uKGZhY3RvcnksCi0JCQkJbWV4TmFtZXNwYWNlVmFsdWUpOwotCi0JCWlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pCi0JCQlzZWN0aW9uLnNldGlubGluZURhdGEocmVzdWx0KTsKLQkJZWxzZSBpZiAob3V0cHV0Rm9ybSA9PSBPdXRwdXRGb3JtLkxPQ0FUSU9OX0ZPUk0pCi0JCQlzZWN0aW9uLnNldExvY2F0aW9uKG5ldyBMb2NhdGlvbihmYWN0b3J5LCBtZXhOYW1lc3BhY2VWYWx1ZSwKLQkJCQkJKFN0cmluZykgcmVzdWx0KSk7Ci0JCWVsc2UgaWYgKG91dHB1dEZvcm0gPT0gT3V0cHV0Rm9ybS5SRUZFUkVOQ0VfRk9STSkgewotCQkJTWV0YWRhdGFSZWZlcmVuY2UgcmVmID0gbmV3IE1ldGFkYXRhUmVmZXJlbmNlKGZhY3RvcnksCi0JCQkJCW1leE5hbWVzcGFjZVZhbHVlKTsKLQkJCQotCQkJcmVmLnNldEVQUigoT01FbGVtZW50KSByZXN1bHQpOwotCQkJc2VjdGlvbi5zZXRNZXRhZGF0YVJlZmVyZW5jZShyZWYpOwotCQl9IGVsc2UgewotCi0JCQlzZWN0aW9uLnNldGlubGluZURhdGEoKE9NRWxlbWVudCkgcmVzdWx0KTsKLQkJfQotCi0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qCi0JICogVHJhdmVyc2UgYW5kIGludGVycHJldGUgdGhlIEdldE1ldGFkYXRhIE9NRWxlbWVudCBmb3IgRGlhbGVjdCBlbGVtZW50Ci0JICogdGhhdCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QuIEByZXR1cm5zIGEgTGlzdCB3aXRoIERpYWxlY3Qocykgb2YKLQkgKiBtZXRhZGF0YSByZXF1ZXN0ZWQuCi0JICogCi0JICovCi0JcHJpdmF0ZSBMaXN0IGRldGVybWluZU1ldGFkYXRhVHlwZXMoT01FbGVtZW50IGFSZXEpIHsKLQkJTGlzdCBtZXRhZGF0YV9yZXF1ZXN0X2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYm9vbGVhbiBhbGxUeXBlcyA9IGZhbHNlOwotCi0JCU9NRWxlbWVudCBkaWFsZWN0ID0gYVJlcS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKG1leE5hbWVzcGFjZVZhbHVlLAotCQkJCU1leENvbnN0YW50cy5TUEVDLkRJQUxFQ1QpKTsKLQkJaWYgKGRpYWxlY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIGRpYWxlY3RUZXh0ID0gZGlhbGVjdC5nZXRUZXh0KCk7Ci0JCQlpZiAoZGlhbGVjdFRleHQgIT0gbnVsbCAmJiBkaWFsZWN0VGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQltZXRhZGF0YV9yZXF1ZXN0X2xpc3QuYWRkKGRpYWxlY3RUZXh0LnRyaW0oKSk7Ci0JCQl9IGVsc2UgewotCQkJCWFsbFR5cGVzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQkJfSBlbHNlIHsKLQkJCWFsbFR5cGVzID0gdHJ1ZTsKLSAgICAgICAgfQotCi0JCWlmIChhbGxUeXBlcykgeyAvLyByZXRyaWV2ZSBhbGwgbWV0YWRhdGEKLQkJCW1ldGFkYXRhX3JlcXVlc3RfbGlzdC5hZGQoTWV4Q29uc3RhbnRzLlNQRUMuRElBTEVDVF9UWVBFX1BPTElDWSk7Ci0JCQltZXRhZGF0YV9yZXF1ZXN0X2xpc3QuYWRkKE1leENvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9TQ0hFTUEpOwotCQkJbWV0YWRhdGFfcmVxdWVzdF9saXN0LmFkZChNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfV1NETCk7Ci0JCX0KLQkJcmV0dXJuIG1ldGFkYXRhX3JlcXVlc3RfbGlzdDsKLQl9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja19NRVhfZGlzYWJsZWQgKFBhcmFtZXRlciBtZXhDb25maWcpIHRocm93cyBNZXhEaXNhYmxlZEV4Y2VwdGlvbnsKLSAgICAgICAgaWYgKE1leFV0aWwuaXNNZXhEaXNhYmxlZChtZXhDb25maWcpKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXhEaXNhYmxlZEV4Y2VwdGlvbigiJ21ldGFkYXRhZXhjaGFuZ2UnIHBhcmFtZXRlciBjb25maWd1cmVkIHRvIGRpc2FibGUgTUVYIGZvciB0aGUgc2VydmljZS4iKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0FueVVSSVR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vQW55VVJJVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM3MTc1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vQW55VVJJVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4Q29uc3RhbnRzOwotCi0vKioKLSAqIEJhc2UgQ2xhc3MgaW1wbGVtZW50ZWQgZm9yIGVsZW1lbnQocykgdGhhdCBvZiB0eXBlPSd4czphbnlVUkknIGRlZmluZWQgaW4gCi0gKiB0aGUgV1MtTUVYIHNwZWMuCi0gKgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbnlVUklUeXBlIGV4dGVuZHMgTWV4T00gaW1wbGVtZW50cyBJTWV4T00gewotICAgIHByaXZhdGUgU3RyaW5nIHVyaSA9IG51bGw7Ci0JcHJpdmF0ZSBPTUZhY3RvcnkgZGVmYXVsdEZhY3Rvcnk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSBudWxsOwotCQotCXB1YmxpYyBBbnlVUklUeXBlKE9NRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSwgU3RyaW5nIG5hbWVzcGFjZVZhbHVlLCBTdHJpbmcgdXJpKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlpZiAoIWlzTmFtZXNwYWNlU3VwcG9ydGVkKG5hbWVzcGFjZVZhbHVlKSkKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbiAoIlVuc3VwcG9ydGVkIG5hbWVzcGFjZSIpOwotCQkKLQkJdGhpcy5kZWZhdWx0RmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5OwotCQl0aGlzLm5hbWVzcGFjZVZhbHVlID0gbmFtZXNwYWNlVmFsdWU7Ci0JCXRoaXMudXJpID0gdXJpOwotCX0KLQkKLQotCS8qKgotCSAqIENvbnZlcnQgb2JqZWN0IGNvbnRlbnQgdG8gdGhlIE9NRWxlbWVudCByZXByZXNlbnRhdGlvbi4KLQkgKiBAcmV0dXJuIE9NRWxlbWVudCByZXByZXNlbnRhdGlvbiBvZiBzdWItY2xhc3Mgb2YgQW55VVJJVHlwZS4KLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0JCi0JcHVibGljIE9NRWxlbWVudCB0b09NKCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsIHx8IHVyaSA9PSAiIikgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJFeHBlY3RlZCBVUkkgdHlwZSBpcyBub3Qgc2V0IC4uICIpOwotCQl9Ci0JCQkKLQkJT01OYW1lc3BhY2UgbWV4TmFtZXNwYWNlID0gZGVmYXVsdEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlVmFsdWUsTWV4Q29uc3RhbnRzLlNQRUMuTlNfUFJFRklYKTsKLQkJT01FbGVtZW50ICBlbGVtZW50ID0gZGVmYXVsdEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGdldEVsZW1lbnROYW1lKCksIG1leE5hbWVzcGFjZSk7CQotCQllbGVtZW50LnNldFRleHQodXJpKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVSSShTdHJpbmcgdXJpKXsKLQkgICAgIHRoaXMudXJpID0gdXJpOwkKLQl9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRVUkkoKXsKLQkgICByZXR1cm4gdXJpOwkKLQl9Ci0JLyoKLQkgKiBDaGlsZCBjbGFzcyBtdXN0IGltcGxlbWVudCB0byBhbnN3ZXIgdGhlIGVsZW1lbnQgbmFtZS4KLQkgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9EaWFsZWN0LmphdmEgYi8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0RpYWxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxNTM1MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0RpYWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tZXgub207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci0KLS8qKgotICogQ2xhc3MgaW1wbGVtZW50ZWQgZm9yIERpYWxlY3QgZWxlbWVudCBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGlhbGVjdCBleHRlbmRzIEFueVVSSVR5cGUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gZGVmYXVsdEZhY3RvcnkKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVmFsdWUgbmFtZXNwYWNlIGluZm8KLQkgKiBAcGFyYW0gZGlhbGVjdCBEaWFsZWN0IGluIFVSSSByZXByZXNlbnRhdGlvbgotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRGlhbGVjdChPTUZhY3RvcnkgZGVmYXVsdEZhY3RvcnksIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSwgU3RyaW5nIGRpYWxlY3QpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmF1bHRGYWN0b3J5LCBuYW1lc3BhY2VWYWx1ZSwgZGlhbGVjdCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIHdpdGggZGVmYXVsdCBuYW1lc3BhY2UKLQkgKiBAcGFyYW0gZGVmYXVsdEZhY3RvcnkKLQkgKiBAcGFyYW0gZGlhbGVjdCAgRGlhbGVjdCBpbiBVUkkgcmVwcmVzZW50YXRpb24KLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0JcHVibGljIERpYWxlY3QoT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgZGlhbGVjdCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmYXVsdEZhY3RvcnksIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJLCBkaWFsZWN0ICk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gbmFtZSBvZiB0aGlzIGVsZW1lbnQKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLk1leC5PTS5BbnlVUklUeXBlI2dldEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROYW1lKCl7Ci0JCXJldHVybiBNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNUOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vSU1leE9NLmphdmEgYi8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0lNZXhPTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmFlN2JmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vSU1leE9NLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgaW1wbGVtZW50ZWQgZm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gCi0gKiB0aGUgV1MtTUVYIHNwZWMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1leE9NIHsKLSAgICBwdWJsaWMgT01FbGVtZW50IHRvT00oKSB0aHJvd3MgTWV4T01FeGNlcHRpb247Ci0gICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVZhbHVlKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZVN1cHBvcnRlZCAoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0lkZW50aWZpZXIuamF2YSBiLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWFiNDc4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vSWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leENvbnN0YW50czsKLQotLyoqCi0gKiBDbGFzcyBpbXBsZW1lbnRlZCBmb3IgSWRlbnRpZmllciBlbGVtZW50IGRlZmluZWQgaW4gCi0gKiB0aGUgV1MtTUVYIHNwZWMuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBJZGVudGlmaWVyIGV4dGVuZHMgQW55VVJJVHlwZSB7Ci0KLQlwdWJsaWMgSWRlbnRpZmllcihPTUZhY3RvcnkgZGVmYXVsdEZhY3RvcnksIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSwgU3RyaW5nIHVyaSkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJc3VwZXIoZGVmYXVsdEZhY3RvcnksIG5hbWVzcGFjZVZhbHVlLCB1cmkpOwotCX0KLQlwdWJsaWMgSWRlbnRpZmllcihPTUZhY3RvcnkgZGVmYXVsdEZhY3RvcnksIFN0cmluZyB1cmkpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmF1bHRGYWN0b3J5LCBNZXhDb25zdGFudHMuU3BlY18yMDA0XzA5Lk5TX1VSSSwgdXJpICk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gbmFtZSBvZiB0aGlzIGVsZW1lbnQKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLk1leC5PTS5BbnlVUklUeXBlI2dldEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROYW1lKCl7Ci0JCXJldHVybiBNZXhDb25zdGFudHMuU1BFQy5JREVOVElGSUVSOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTG9jYXRpb24uamF2YSBiLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTG9jYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg1YTkyZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL0xvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4LnV0aWwuTWV4VXRpbDsKLQotLyoqCi0gKiBDbGFzcyBpbXBsZW1lbnRlZCBmb3IgTG9jYXRpb24gZWxlbWVudCBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgTG9jYXRpb24gZXh0ZW5kcyBBbnlVUklUeXBlIHsKLQotCQotCS8qKgotCSAqIEBwYXJhbSB1cmkgIHZhbGlkIFVSTCB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgdXNpbmcgSFRUUCBHZXQKLQkgKiBAdGhyb3dzIE1leEV4Y2VwdGlvbiAKLSAgICAgICAgICoKLQkgKi8KLQlwdWJsaWMgTG9jYXRpb24oU3RyaW5nIHVyaSkgdGhyb3dzIE1leEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKE1leFV0aWwuZ2V0U09BUEZhY3RvcnkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSksIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJLCB1cmkpOwotCX0KLQkKLQlwdWJsaWMgTG9jYXRpb24oT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgbmFtZXNwYWNlVmFsdWUsIFN0cmluZyB1cmkpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGRlZmF1bHRGYWN0b3J5LCBuYW1lc3BhY2VWYWx1ZSwgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgTG9jYXRpb24oT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgdXJpKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlzdXBlcihkZWZhdWx0RmFjdG9yeSwgTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkksIHVyaSApOwotCX0KLQkKLQlwdWJsaWMgTG9jYXRpb24gZnJvbU9NKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgTWV4T01FeGNlcHRpb257Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiTnVsbCBlbGVtZW50IHBhc3NlZC4iKTsKLQkJfQotCQlpZiAoIWVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKE1leENvbnN0YW50cy5TUEVDLkxPQ0FUSU9OKSkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJJbnZhbGlkIGVsZW1lbnQgcGFzc2VkLiIpOwotCQl9Ci0JCXN1cGVyLnNldFVSSShlbGVtZW50LmdldFRleHQoKSk7Ci0JCQkKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIG5hbWUgb2YgdGhpcyBlbGVtZW50Ci0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5NZXguT00uQW55VVJJVHlwZSNnZXRFbGVtZW50TmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpewotCQlyZXR1cm4gTWV4Q29uc3RhbnRzLlNQRUMuTE9DQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXRhZGF0YS5qYXZhIGIvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM5MTQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZUhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuT3V0cHV0Rm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4LnV0aWwuTWV4VXRpbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogCi0gKiBDbGFzcyBpbXBsZW1lbnRpbmcgIG1leDpNZXRhZGF0YSBlbGVtZW50IAotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGEgZXh0ZW5kcyBNZXhPTSBpbXBsZW1lbnRzIElNZXhPTSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSBudWxsOwotCXByaXZhdGUgT01GYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBMaXN0ICBtZXRhZGF0YVNlY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOyAKLQlwcml2YXRlIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG51bGw7Ci0JCi0gICAgICAgIC8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHRocm93cyBNZXhFeGNlcHRpb24gCi0JICovCi0KLQlwdWJsaWMgTWV0YWRhdGEoKSB0aHJvd3MgTWV4RXhjZXB0aW9uICB7Ci0JCQotCQl0aGlzLmZhY3RvcnkgPSBNZXhVdGlsLmdldFNPQVBGYWN0b3J5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOzsKLQkJdGhpcy5uYW1lc3BhY2VWYWx1ZSA9IE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZWZhdWx0RmFjdG9yeQotCSAqIEBwYXJhbSBuYW1lc3BhY2VWYWx1ZQotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQotCXB1YmxpYyBNZXRhZGF0YShPTUZhY3RvcnkgZGVmYXVsdEZhY3RvcnksIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSkgdGhyb3dzIE1leE9NRXhjZXB0aW9uICB7Ci0JCXRoaXMuZmFjdG9yeSA9IGRlZmF1bHRGYWN0b3J5OwotCQl0aGlzLm5hbWVzcGFjZVZhbHVlID0gbmFtZXNwYWNlVmFsdWU7Ci0JfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiAKLSAgICAgICAgICogQHJldHVybiBBcnJheSBvZiBNZXRhZGF0YVNlY3Rpb24gb2YgbWV0YWRhdGEgdW5pdHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZXRhZGF0YVNlY3Rpb25bXSBnZXRNZXRhZGF0U2VjdGlvbnMoKSB7Ci0JCXJldHVybiAoTWV0YWRhdGFTZWN0aW9uW10pbWV0YWRhdGFTZWN0aW9ucy50b0FycmF5KG5ldyBNZXRhZGF0YVNlY3Rpb25bMF0pOwotCX0KLQotICAgICAgICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpYWxlY3QKLSAgICAgKiBAcGFyYW0gaWRlbnRpZmllcgotICAgICAqIEByZXR1cm4gQXJyYXkgb2YgTWV0YWRhdGFTZWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRpYWxlY3QgbWV0YWRhdGEgdHlwZSBhbmQgaWRlbnRpZmllciAgCi0gICAgICovCi0gICAgcHVibGljIE1ldGFkYXRhU2VjdGlvbltdIGdldE1ldGFkYXRhU2VjdGlvbihTdHJpbmcgZGlhbGVjdCwgU3RyaW5nIGlkZW50aWZpZXIpewotICAgIAlNZXRhZGF0YVNlY3Rpb25bXSBzZWN0aW9ucyA9IGdldE1ldGFkYXRhU2VjdGlvbihkaWFsZWN0LCBpZGVudGlmaWVyLCBudWxsKTsKLSAgICAJcmV0dXJuIHNlY3Rpb25zOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBBbnN3ZXJzIHRoZSBNZXRhZGF0YSBTZWN0aW9ucyB0aGF0IG1ldCB0aGUgY3JpdGVyaWEgc3BlY2lmaWVkIGluIHRoZSBkaWFsZWN0LCBpZGVudGlmaWVyLCBhbmQgZm9ybS4KLSAgICAgKiBOb3RlOiBOdWxsIHZhbHVlIHBhcmFtZXRlciB3aWxsIGJlIHRyZWF0ZWQgYXMgd2lsZCBjYXJkLgotICAgICAqIEBwYXJhbSBkaWFsZWN0Ci0gICAgICogQHBhcmFtIGlkZW50aWZpZXIKLSAgICAgKiBAcGFyYW0gZm9ybSBzcGVjaWZ5IHRoZSBmb3JtIG9mIG1ldGFkYXRhOiBpbmxpbmUgb3IgYnkgcmVmZXJlbmNlCi0gICAgICogICAgICAgIFNlZSA8Y29kZT5PdXRwdXRGb3JtPC9jb2RlPiBmb3IgdmFsaWQgb3V0cHV0IGZvcm1zLgotICAgICAqIEByZXR1cm4gQXJyYXkgb2YgTWV0YWRhdGFTZWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGRpYWxlY3QgbWV0YWRhdGEgdHlwZSBhbmQgaWRlbnRpZmllciBvZgotICAgICAqICAgICAgICAgdGhlIGZvcm0gc3BlY2lmaWVkLgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIE1ldGFkYXRhU2VjdGlvbltdIGdldE1ldGFkYXRhU2VjdGlvbihTdHJpbmcgZGlhbGVjdCwgU3RyaW5nIGlkZW50aWZpZXIsIE91dHB1dEZvcm0gZm9ybSApewotICAgICAgICAKLSAgICAJSXRlcmF0b3Igc2VjdGlvbnMgPSBtZXRhZGF0YVNlY3Rpb25zLml0ZXJhdG9yKCk7Ci0gICAgCUxpc3QgZm91bmRTZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJd2hpbGUgKHNlY3Rpb25zLmhhc05leHQoKSl7Ci0gICAgCQlNZXRhZGF0YVNlY3Rpb24gYVNlY3Rpb24gPSAoTWV0YWRhdGFTZWN0aW9uKSBzZWN0aW9ucy5uZXh0KCk7Ci0gICAgCQlpZiAoKGRpYWxlY3QgPT0gbnVsbCB8fCBkaWFsZWN0LmVxdWFscyhhU2VjdGlvbi5nZXREaWFsZWN0KCkpKSAmJgotICAgIAkJCShpZGVudGlmaWVyID09IG51bGwgfHwgZGlhbGVjdC5lcXVhbHMoYVNlY3Rpb24uZ2V0SWRlbnRpZmllcigpKSkgJiYKLSAgICAJCQltYXRjaE91dHB1dEZvcm0oYVNlY3Rpb24sIGZvcm0pKXsKLSAgICAJCQlmb3VuZFNlY3Rpb25zLmFkZChhU2VjdGlvbik7Ci0gICAgCQl9CQotICAgIAkJCi0gICAgCX0KLSAgICAJcmV0dXJuIChNZXRhZGF0YVNlY3Rpb25bXSlmb3VuZFNlY3Rpb25zLnRvQXJyYXkobmV3IE1ldGFkYXRhU2VjdGlvblswXSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIFBvcHVsYXRlcyBhbiBNZXRhZGF0YSBvYmplY3QgYmFzZWQgb24gdGhlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gcGFzc2VkLiAKLQkgKiBAcGFyYW0gaW5FbGVtZW50IG1leDpNZXRhZGF0YSBlbGVtZW50IG9yIGVsZW1lbnQgY29udGFpbnMgbWV4Ok1ldGFkYXRhIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGFkYXRhIAotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTWV0YWRhdGEgZnJvbU9NKE9NRWxlbWVudCBpbkVsZW1lbnQpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCQkKLQkJT01FbGVtZW50IG1leEVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoaW5FbGVtZW50ID09IG51bGwgKXsKLSAgICAgICAgCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiTnVsbCBlbGVtZW50IHBhc3NlZC4iKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGluRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEEpKXsKLSAgICAgICAgCW1leEVsZW1lbnQgPSBpbkVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluRWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkVuZHBvaW50UmVmZXJlbmNlIikpewotICAgICAgICAgICAgdHJ5IHsKLQkgICAgCSAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gRW5kcG9pbnRSZWZlcmVuY2VIZWxwZXIuZnJvbU9NKGluRWxlbWVudCk7Ci0JCQkJCi0JCSAgQXJyYXlMaXN0IG1ldGFkYXRhID0gZXByLmdldE1ldGFEYXRhKCk7Ci0JCSAgaWYgKG1ldGFkYXRhICE9IG51bGwpCi0JCSAgICAgIG1leEVsZW1lbnQgPSAoT01FbGVtZW50KW1ldGFkYXRhLmdldCgwKTsKLQkJICBlbHNlIHsKLQkJICAgICAgQXJyYXlMaXN0IHJlZlBhcm0gPSBlcHIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0JCSAgICAgIGZvciAoaW50IGk9MDsgaTxyZWZQYXJtLnNpemUoKTsgaSsrKXsKLQkJICAgICAgICAgIE9NRWxlbWVudCBlbGVtID0gKE9NRWxlbWVudClyZWZQYXJtLmdldChpKTsKLQkJCSAgaWYgKGVsZW0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKE1leENvbnN0YW50cy5TUEVDLk1FVEFEQVRBKSl7Ci0JCQkgICAgICBtZXhFbGVtZW50ID0gZWxlbTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgfQotCQkJfQotCQkJfQotCQl9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotCQkgICB0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oZSk7Ci0JCX0KLSAgICAgICAgCQotCSAgICAgICAgaWYgKG1leEVsZW1lbnQgPT0gbnVsbCkgewotCQkgICAgdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJNaXNzaW5nIGV4cGVjdGVkIE1ldGFkYXRhIGVsZW1lbnQgaW4gZWxlbWVudCBwYXNzZWQuIik7Ci0JCX0KLQkgICB9Ci0gICAgICAgICAgZWxzZSBtZXhFbGVtZW50ID0gaW5FbGVtZW50OwotICAgICAgICAKLQkgIE9NRmFjdG9yeSBhRmFjdG9yeSA9IG1leEVsZW1lbnQuZ2V0T01GYWN0b3J5KCk7Ci0JICBpZiAoYUZhY3RvcnkgPT0gbnVsbCkgewotCSAgICAgYUZhY3RvcnkgPSBmYWN0b3J5OwotCSAgIH0KLQkgICBJdGVyYXRvciBtZXhTZWN0aW9ucyA9IG1leEVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUobmFtZXNwYWNlVmFsdWUsIE1leENvbnN0YW50cy5TUEVDLk1FVEFEQVRBX1NFQ1RJT04pKTsKLSAgICAgICAgCi0gICAgICAgICAgIGlmIChtZXhTZWN0aW9ucyA9PSBudWxsKXsKLSAgICAgICAgIAl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIk1ldGFkYXRhIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBNZXRhZGF0YVNlY3Rpb24gZWxlbWVudC4iKTsKLSAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG1leFNlY3Rpb25zLmhhc05leHQoKSl7Ci0gICAgICAgIAlPTUVsZW1lbnQgYVNlY3Rpb24gPSAoT01FbGVtZW50KSBtZXhTZWN0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICBNZXRhZGF0YVNlY3Rpb24gbWV0YWRhdGFTZWN0aW9uID0gbmV3IE1ldGFkYXRhU2VjdGlvbihhRmFjdG9yeSwgbmFtZXNwYWNlVmFsdWUpOwotICAgICAgICAgICAgYWRkTWV0YWRhdFNlY3Rpb24obWV0YWRhdGFTZWN0aW9uLmZyb21PTShhU2VjdGlvbikpOyAKLSAgICAgICAgfQotICAgICAgICAKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotICAgICAgIC8qKgotICAgICAgICAqIAotICAgICAgICAqIEByZXR1cm4gQXJyYXkgb2YgTWV0YWRhdGFTZWN0aW9uIG9mIG1ldGFkYXRhIHVuaXRzCi0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPTUVsZW1lbnQgdG9PTSgpIHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCXsKLQkJT01OYW1lc3BhY2UgbWV4TmFtZXNwYWNlID0gZmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShuYW1lc3BhY2VWYWx1ZSxNZXhDb25zdGFudHMuU1BFQy5OU19QUkVGSVgpOwotCQlPTUVsZW1lbnQgbWV0YWRhdGEgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQSwgbWV4TmFtZXNwYWNlKTsKLQotCQlJdGVyYXRvciBzZWN0aW9ucyA9IG1ldGFkYXRhU2VjdGlvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHNlY3Rpb25zLmhhc05leHQoKSkgewotCQkJTWV0YWRhdGFTZWN0aW9uIGFTZWN0aW9uID0gKE1ldGFkYXRhU2VjdGlvbikgc2VjdGlvbnMubmV4dCgpOwotCQkJbWV0YWRhdGEuYWRkQ2hpbGQoYVNlY3Rpb24udG9PTSgpKTsKLQkJfQotCQlpZiAoYXR0cmlidXRlICE9IG51bGwpewotCQkJbWV0YWRhdGEuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZSk7IC8vPz8/Ci0JCX0KLQkJcmV0dXJuIG1ldGFkYXRhOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0U2VjdGlvbnMoTGlzdCBpbl9tZXRhZGF0YVNlY3Rpb25zKSB7Ci0JCW1ldGFkYXRhU2VjdGlvbnMgPSBpbl9tZXRhZGF0YVNlY3Rpb25zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNZXRhZGF0U2VjdGlvbnMoTGlzdCBpbl9tZXRhZGF0YVNlY3Rpb25zKSB7Ci0JCUl0ZXJhdG9yIHNlY3Rpb25zID0gaW5fbWV0YWRhdGFTZWN0aW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoc2VjdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQlhZGRNZXRhZGF0U2VjdGlvbigoTWV0YWRhdGFTZWN0aW9uKSBzZWN0aW9ucy5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWV0YWRhdFNlY3Rpb24oTWV0YWRhdGFTZWN0aW9uIHNlY3Rpb24pIHsKLQkJbWV0YWRhdGFTZWN0aW9ucy5hZGQoc2VjdGlvbik7Ci0JfQotCQotICAgICAgIAkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoT01BdHRyaWJ1dGUgaW5fYXR0cmlidXRlKSB7Ci0JCWF0dHJpYnV0ZSA9IGluX2F0dHJpYnV0ZTsKLQl9Ci0KLSAgCi0gICAgLy8gY2hlY2sgaWYgc2VjdGlvbiBjb250YWlucyBkYXRhIG1hdGNoaW5nIHRoZSBvdXRwdXQgZm9ybSByZXF1ZXN0ZWQKLSAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hPdXRwdXRGb3JtKE1ldGFkYXRhU2VjdGlvbiBzZWN0aW9uLAotCQkJT3V0cHV0Rm9ybSBvdXRwdXRGb3JtKSB7Ci0JCWJvb2xlYW4gbWF0Y2ggPSAob3V0cHV0Rm9ybSA9PSBudWxsKTsgIC8vIG5vIG1hdGNoaW5nIG5lZWRlZCBpbiBudWxsIG91dHB1dEZvcm0gaXMgcGFzc2VkCi0KLQkJaWYgKCFtYXRjaCkgewotCQkJaWYgKG91dHB1dEZvcm0gPT0gT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKSB7Ci0JCQkJbWF0Y2ggPSAoc2VjdGlvbi5nZXRMb2NhdGlvbigpICE9IG51bGwpOwotCQkJfSBlbHNlIGlmIChvdXRwdXRGb3JtID09IE91dHB1dEZvcm0uUkVGRVJFTkNFX0ZPUk0pIHsKLQkJCQltYXRjaCA9IChzZWN0aW9uLmdldE1ldGFkYXRhUmVmZXJlbmNlKCkgIT0gbnVsbCk7Ci0JCQl9IGVsc2UgaWYgKG91dHB1dEZvcm0gPT0gT3V0cHV0Rm9ybS5JTkxJTkVfRk9STSkgewotCQkJCW1hdGNoID0gKHNlY3Rpb24uZ2V0SW5saW5lRGF0YSgpICE9IG51bGwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1hdGNoOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXRhZGF0YVJlZmVyZW5jZS5qYXZhIGIvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXRhZGF0YVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM0MDhmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGFSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgudXRpbC5NZXhVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotLyoqCi0gKiBDbGFzcyBpbXBsZW1lbnRlZCBmb3IgTWV0YWRhdGFSZWZlcmVuY2UgZWxlbWVudCBkZWZpbmVkIGluIAotICogdGhlIFdTLU1ldGFkYXRhRXhjaGFuZ2Ugc3BlYy4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIE1ldGFkYXRhUmVmZXJlbmNlIGV4dGVuZHMgTWV4T00gaW1wbGVtZW50cyBJTWV4T00gewotCi0JcHJpdmF0ZSBPTUZhY3RvcnkgZmFjdG9yeTsKLQlwcml2YXRlIE9NRWxlbWVudCBlcHJFbGVtZW50ID0gbnVsbDsgCi0gICAgICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbnVsbDsKLSAJcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSBudWxsOwotCi0JIC8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHRocm93cyBNZXhFeGNlcHRpb24gCi0JICovCi0KLQlwdWJsaWMgTWV0YWRhdGFSZWZlcmVuY2UoKSB0aHJvd3MgTWV4RXhjZXB0aW9uICB7Ci0JCQotCQl0aGlzLmZhY3RvcnkgPSBNZXhVdGlsLmdldFNPQVBGYWN0b3J5KFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpOwotCQl0aGlzLm5hbWVzcGFjZVZhbHVlID0gTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGRlZmF1bHRGYWN0b3J5Ci0JICogQHBhcmFtIG5hbWVzcGFjZVZhbHVlCi0JICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCSAqLwotCi0JcHVibGljIE1ldGFkYXRhUmVmZXJlbmNlKE9NRmFjdG9yeSBkZWZhdWx0RmFjdG9yeSwgU3RyaW5nIG5hbWVzcGFjZVZhbHVlKQotCSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlpZiAoIWlzTmFtZXNwYWNlU3VwcG9ydGVkKG5hbWVzcGFjZVZhbHVlKSkKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgbmFtZXNwYWNlIik7Ci0KLQkJdGhpcy5mYWN0b3J5ID0gZGVmYXVsdEZhY3Rvcnk7Ci0JCXRoaXMubmFtZXNwYWNlVmFsdWUgPSBuYW1lc3BhY2VWYWx1ZTsKLQkJfQotCi0JIHB1YmxpYyBPTUVsZW1lbnQgZ2V0RVBSRWxlbWVudCgpIHsKLQkJCXJldHVybiBlcHJFbGVtZW50OwotCQl9Ci0JICAKLQlwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RVBSKCkgewotCQkJcmV0dXJuIGVwcjsKLQl9Ci0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBhbiBNZXRhZGF0YVJlZmVyZW5jZSBvYmplY3QgYmFzZWQgb24gdGhlIGVuZHBvaW50IHJlZmVyZW5jZSB0eXBlIDxjb2RlPk9NRWxlbWVudDwvY29kZT4gcGFzc2VkLiAKLQkgKiBAcGFyYW0gaW5FbGVtZW50IE1ldGFkYXRhUmVmZXJlbmNlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGFkYXRhUmVmZXJlbmNlIAotCSAqIEB0aHJvd3MgTWV4T01FeGNlcHRpb24KLQkgKi8KLQkKLQlwdWJsaWMgTWV0YWRhdGFSZWZlcmVuY2UgZnJvbU9NKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgTWV4T01FeGNlcHRpb257Ci0JCQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIk51bGwgZWxlbWVudCBwYXNzZWQuIik7Ci0JCX0KLQkJaWYgKCFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQV9SRUZFUkVOQ0UpKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIkludmFsaWQgZWxlbWVudCBwYXNzZWQuIik7Ci0JCX0KLQkJZXByRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRyeSB7Ci0JCQllcHIgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZWxlbWVudCk7Ci0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24gKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gdGhpczsKLQl9Ci0JLyoqCi0JICogQ29udmVydCBNZXRhZGF0UmVmZXJlbmNlIG9iamVjdCBjb250ZW50IHRvIHRoZSBPTUVsZW1lbnQgcmVwcmVzZW50YXRpb24uCi0JICogQHJldHVybiBPTUVsZW1lbnQgcmVwcmVzZW50YXRpb24gb2YgTWV0YWRhdFJlZmVyZW5jZS4KLQkgKiBAdGhyb3dzIE1leE9NRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9NRWxlbWVudCB0b09NKCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJaWYgKGVwckVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKAotCQkJCQkiTXVzdCBoYXZlIEVuZHBvaW50UmVmZXJlbmNlIGVsZW1lbnQgaW4gTWV0YWRhdGFSZWZlcmVuY2UiKTsKLQkJfQotCi0JCU9NRWxlbWVudCBtZXRhZGF0YVJlZiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRhZGF0YVJlZiA9IEVuZHBvaW50UmVmZXJlbmNlSGVscGVyLnRvT00oZmFjdG9yeSwgZXByLCBuZXcgUU5hbWUoCi0JCQkJCW5hbWVzcGFjZVZhbHVlLCBNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQV9SRUZFUkVOQ0UsCi0JCQkJCU1leENvbnN0YW50cy5TUEVDLk5TX1BSRUZJWCksIGVwckVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkKLQkJCQkJLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkKLQkJfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQotCQlyZXR1cm4gbWV0YWRhdGFSZWY7Ci0JfQotCQotCS8qKgotCSAqIFNldCBFUFIgCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgRW5kcG9pbnQgUmVmZXJlbmNlIFR5cGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVQUihPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIE1leE9NRXhjZXB0aW9uIHsKLQkJZXByRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRyeSB7Ci0JCQllcHIgPSBFbmRwb2ludFJlZmVyZW5jZUhlbHBlci5mcm9tT00oZXByRWxlbWVudCk7Ci0JCX0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24gKGUpOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBTZXQgRVBSIAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IEVuZHBvaW50IFJlZmVyZW5jZSBUeXBlIGVsZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFUFIoRW5kcG9pbnRSZWZlcmVuY2UgZW5kUmVmKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQllcHIgPSBlbmRSZWY7Ci0JCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGFTZWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01ldGFkYXRhU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTc2ZDQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvb20vTWV0YWRhdGFTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXgudXRpbC5NZXhVdGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIENsYXNzIGltcGxlbWVudGVkIGZvciBNZXRhZGF0YVNlY3Rpb24gZWxlbWVudCBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLiBBIHVuaXQgb2YgbWV0ZGF0YSBpLmUuIGEgTWV0YWRhdGFTZWN0aW9uIG1heSBiZSBpbmNsdWRlZCBpbi1saW5lIGRhdGEsIAotICogb3IgbWF5IGJlIGJ5IHJlZmVyZW5jZSBhcyBhbiBlbmRwb2ludCByZWZlcmVuY2UgKE1ldGFkYXRhUmVmZXJlbmNlKSBvciBhIFVSTCAoTG9jYXRpb24pLgotICogQW4gaW5zdGFuY2Ugb2YgTWV0YWRhdGFTZWN0aW9uIGNhbiBoYXZlIG9uZSBmb3JtIG9mIGRhdGE6IGlubGluZSwgbG9jYXRpb24sIG9yIHJlZmVyZW5jZS4KLSAqCi0gKi8KLQotcHVibGljICBjbGFzcyBNZXRhZGF0YVNlY3Rpb24gZXh0ZW5kcyBNZXhPTSBpbXBsZW1lbnRzIElNZXhPTSB7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSBudWxsOwotCXByaXZhdGUgT01GYWN0b3J5IGZhY3Rvcnk7Ci0JLy8gQ2hvaWNlcyBvZiBjb250ZW50OiBpbmxpbmUgbWV0YWRhdGEsIE1ldGFkYXRhUmVmZXJlbmNlLCBMb2NhdGlvbgotCXByaXZhdGUgU3RyaW5nIGFueUF0dHJpYnV0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBPTU5vZGUgaW5saW5lRGF0YSA9IG51bGw7Ci0JLy9wcml2YXRlIFN0cmluZyBpbmxpbmVEYXRhID0gbnVsbDsKLQlwcml2YXRlIExvY2F0aW9uIGxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIE1ldGFkYXRhUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0JCi0gICAgLy8gQXR0cmlidXRlcwotICAgIHByaXZhdGUgU3RyaW5nIGRpYWxlY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWRlbnRpZmllcjsKLSAgICAKLSAgICAKLSAgICAvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uIAotCSAqLwotCi0JcHVibGljIE1ldGFkYXRhU2VjdGlvbigpIHRocm93cyBNZXhFeGNlcHRpb24gIHsKLQkJCi0JCXRoaXMuZmFjdG9yeSA9IE1leFV0aWwuZ2V0U09BUEZhY3RvcnkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7OwotCQl0aGlzLm5hbWVzcGFjZVZhbHVlID0gTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIGRlZmF1bHRGYWN0b3J5Ci0gICAgICogQHBhcmFtIG5hbWVzcGFjZVZhbHVlCi0gICAgICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotICAgICAqLwotCXB1YmxpYyBNZXRhZGF0YVNlY3Rpb24oT01GYWN0b3J5IGRlZmF1bHRGYWN0b3J5LCBTdHJpbmcgbmFtZXNwYWNlVmFsdWUpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiAgewotCQl0aGlzLmZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeTsKLQkJdGhpcy5uYW1lc3BhY2VWYWx1ZSA9IG5hbWVzcGFjZVZhbHVlOwotCX0KLQkKLQkKLQkvKioKLQkgKiBQb3B1bGF0ZXMgYW4gTWV0YWRhdGFTZWN0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgPGNvZGU+T01FbGVtZW50PC9jb2RlPiBwYXNzZWQuIAotCSAqIEBwYXJhbSBpbkVsZW1lbnQgbWV4Ok1ldGFkYXRhU2VjdGlvbiBlbGVtZW50Ci0JICogQHJldHVybiBNZXRhZGF0YVNlY3Rpb24gCi0JICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCSAqLwotCQotCXB1YmxpYyBNZXRhZGF0YVNlY3Rpb24gZnJvbU9NKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTWV4T01FeGNlcHRpb24oIk51bGwgZWxlbWVudCBwYXNzZWQuIik7Ci0JCX0KLQkJaWYgKCFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQV9TRUNUSU9OKSkgewotCQkJdGhyb3cgbmV3IE1leE9NRXhjZXB0aW9uKCJJbnZhbGlkIGVsZW1lbnQgcGFzc2VkLiIpOwotCQl9Ci0JCU9NQXR0cmlidXRlIGRpYWxlY3RBdHRyICA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNUKSk7Ci0JCWlmIChkaWFsZWN0QXR0ciA9PSBudWxsKXsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiTWlzc2luZyBEaWFsZWN0IEF0dHJpYnV0ZSBpbiBNZXRhZGF0YVNlY3Rpb24uIik7Ci0JCX0KLQkJc2V0RGlhbGVjdChkaWFsZWN0QXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQkJT01BdHRyaWJ1dGUgaWRlbnRpZmllckF0dHIgID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKE1leENvbnN0YW50cy5TUEVDLklERU5USUZJRVIpKTsKLQkJaWYgKGlkZW50aWZpZXJBdHRyICE9IG51bGwpewotCQkJc2V0SWRlbnRpZmllcihpZGVudGlmaWVyQXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsJCQotCQl9Ci0JCS8vIHZhbGlkYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgbXVzdCBleGlzdDogTG9jYXRpb24sIE1ldGFkYXRhUmVmZXJlbmNlLCBpbmxpbmUgZGF0YQotCQlPTUVsZW1lbnQgbG9jYXRpb25FbGVtID0gZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKG5hbWVzcGFjZVZhbHVlLCBNZXhDb25zdGFudHMuU1BFQy5MT0NBVElPTikpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IG51bGw7Ci0JCU1ldGFkYXRhUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0JCQotCQlpZiAobG9jYXRpb25FbGVtICE9IG51bGwpewotCQkJbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oZmFjdG9yeSwgbmFtZXNwYWNlVmFsdWUpOwotCQkgICAgc2V0TG9jYXRpb24obG9jYXRpb24uZnJvbU9NKGxvY2F0aW9uRWxlbSkpOwkKLQkJfQotCQllbHNlIHsgLy8gY2hlY2sgZm9yIE1ldGFkYXRhUmVmZXJlbmNlCi0JCQlPTUVsZW1lbnQgcmVmRWxlbSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShuYW1lc3BhY2VWYWx1ZSwgTWV4Q29uc3RhbnRzLlNQRUMuTUVUQURBVEFfUkVGRVJFTkNFKSk7Ci0JCQlpZiAocmVmRWxlbSAhPSBudWxsICl7Ci0JCQkJcmVmID0gbmV3IE1ldGFkYXRhUmVmZXJlbmNlKGZhY3RvcnksIG5hbWVzcGFjZVZhbHVlKTsKLQkJCQlzZXRNZXRhZGF0YVJlZmVyZW5jZShyZWYuZnJvbU9NKHJlZkVsZW0pKTsKLQkJCX0KLQkJfQotCQlpZiAobG9jYXRpb24gPT0gbnVsbCAmJiByZWYgPT0gbnVsbCkgeyAvLyBjaGVjayBmb3IgaW5saW5lIGNvbnRlbnQKLQkJCU9NTm9kZSBpbmxpbmUgPSBlbGVtZW50LmdldEZpcnN0T01DaGlsZCgpOwotCQkgICAgaWYgKGlubGluZSAhPSBudWxsKQotCQkgICAgCXNldGlubGluZURhdGEoaW5saW5lKTsKLQkJICAgIGVsc2UgewotCQkgICAgCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiSW52YWxpZCBlbXB0eSBNZXRhZGF0YVNlY3Rpb24uIik7Ci0JCSAgICB9Ci0JCSAgICAKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IE1ldGFkYXRTZWN0aW9uIGNvbnRlbnQgdG8gdGhlIE9NRWxlbWVudCByZXByZXNlbnRhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIE9NRWxlbWVudCByZXByZXNlbnRhdGlvbiBvZiBNZXRhZGF0YVNlY3Rpb24uCi0JICogQHRocm93cyBNZXhPTUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBPTUVsZW1lbnQgdG9PTSgpIHRocm93cyBNZXhPTUV4Y2VwdGlvbiB7Ci0JCU9NTmFtZXNwYWNlIG1leE5hbWVzcGFjZSA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UobmFtZXNwYWNlVmFsdWUsCi0JCQkJTWV4Q29uc3RhbnRzLlNQRUMuTlNfUFJFRklYKTsKLQkJT01FbGVtZW50IG1ldGFkYXRhU2VjdGlvbiA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KAotCQkJCU1leENvbnN0YW50cy5TUEVDLk1FVEFEQVRBX1NFQ1RJT04sIG1leE5hbWVzcGFjZSk7Ci0KLQkJLy8gZGlhbGV0IGlzIHJlcXVpcmVkCi0JCWlmIChkaWFsZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBNZXhPTUV4Y2VwdGlvbigiRGlhbGV0IHdhcyBub3Qgc2V0LiBEaWFsZXQgbXVzdCBiZSBzZXQuIik7Ci0JCX0KLQkJT01BdHRyaWJ1dGUgZGlhbGV0QXR0cmliID0gZmFjdG9yeS5jcmVhdGVPTUF0dHJpYnV0ZSgKLQkJCQlNZXhDb25zdGFudHMuU1BFQy5ESUFMRUNULCBudWxsLCBkaWFsZWN0KTsKLQotCQltZXRhZGF0YVNlY3Rpb24uYWRkQXR0cmlidXRlKGRpYWxldEF0dHJpYik7Ci0KLQkJaWYgKGlkZW50aWZpZXIgIT0gbnVsbCAmJiBpZGVudGlmaWVyLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCU9NQXR0cmlidXRlIGlkZW50aWZpZXJBdHRyaWIgPSBmYWN0b3J5LmNyZWF0ZU9NQXR0cmlidXRlKAotCQkJCQlNZXhDb25zdGFudHMuU1BFQy5JREVOVElGSUVSLCBudWxsLCBpZGVudGlmaWVyKTsKLQotCQkJbWV0YWRhdGFTZWN0aW9uLmFkZEF0dHJpYnV0ZShpZGVudGlmaWVyQXR0cmliKTsKLQkJfQotCQlpZiAoYW55QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCU9NQXR0cmlidXRlIGFueUF0dHJpYiA9IGZhY3RvcnkuY3JlYXRlT01BdHRyaWJ1dGUoIkFueUF0dHJpYnV0ZSIsCi0JCQkJCW51bGwsIGFueUF0dHJpYnV0ZSk7Ci0KLQkJCW1ldGFkYXRhU2VjdGlvbi5hZGRBdHRyaWJ1dGUoYW55QXR0cmliKTsKLQkJfQotCi0JCWlmIChpbmxpbmVEYXRhICE9IG51bGwpIHsKLQkJCW1ldGFkYXRhU2VjdGlvbi5hZGRDaGlsZChpbmxpbmVEYXRhKTsKLQkJCQotCQl9Ci0KLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCW1ldGFkYXRhU2VjdGlvbi5hZGRDaGlsZChsb2NhdGlvbi50b09NKCkpOwotCQl9Ci0KLQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQltZXRhZGF0YVNlY3Rpb24uYWRkQ2hpbGQocmVmLnRvT00oKSk7Ci0JCX0KLQkJcmV0dXJuIG1ldGFkYXRhU2VjdGlvbjsKLQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERpYWxlY3QoKSB7Ci0JCXJldHVybiBkaWFsZWN0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldGFueUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGFueUF0dHJpYnV0ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIG1ldGFkYXRhIHVuaXQgaW4gVVJMIGZvcm0gaS5lLiBtZXg6TG9jYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExvY2F0aW9uIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBtZXRhZGF0YSB1bml0IGluIGlubGluZSBmb3JtIHN1Y2ggYXMgV1NETCBkZWZpbml0aW9ucywgWE1MIHNjaGVtYSBkb2N1bWVudCwgZXRjLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgT01Ob2RlIGdldElubGluZURhdGEoKSB7Ci0JCXJldHVybiBpbmxpbmVEYXRhOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gbWV0YWRhdGEgdW5pdCBpbiBlbmRwb2ludCByZWZlcmVuY2UgZm9ybSBpLmUuIG1leDpNZXRhZGF0YVJlZmVyZW5jZS4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1ldGFkYXRhUmVmZXJlbmNlIGdldE1ldGFkYXRhUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFN0cmluZyBpbl9pZGVudGlmaWVyKSB7Ci0JCWlkZW50aWZpZXIgPWluX2lkZW50aWZpZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpYWxlY3QoU3RyaW5nIGluX2RpYWxlY3QpIHsKLQkJZGlhbGVjdCA9IGluX2RpYWxlY3Q7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKExvY2F0aW9uIGluX2xvY2F0aW9uKSB7Ci0JCWxvY2F0aW9uID0gaW5fbG9jYXRpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldGlubGluZURhdGEoT2JqZWN0IGluX2lubGluZURhdGEpIHsKLQkJaW5saW5lRGF0YSA9IChPTU5vZGUpaW5faW5saW5lRGF0YTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFSZWZlcmVuY2UoTWV0YWRhdGFSZWZlcmVuY2UgaW5fcmVmKSB7Ci0JCXJlZiA9IGluX3JlZjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01leE9NLmphdmEgYi8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01leE9NLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDdmNTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXhPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lk1leENvbnN0YW50czsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBvYmplY3RzIGltcGxlbWVudGVkIGZvciBlbGVtZW50cyBkZWZpbmVkIGluIAotICogdGhlIFdTLU1FWCBzcGVjLgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXhPTSBpbXBsZW1lbnRzIElNZXhPTSB7Ci0KLQkKLQlwdWJsaWMgT01FbGVtZW50IHRvT00oKSB0aHJvd3MgTWV4T01FeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VWYWx1ZSgpewotCQlyZXR1cm4gTWV4Q29uc3RhbnRzLlNwZWNfMjAwNF8wOS5OU19VUkk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VTdXBwb3J0ZWQgKFN0cmluZyBuYW1lc3BhY2VOYW1lKSB7Ci0JCWJvb2xlYW4gc3VwcG9ydGVkID0gZmFsc2U7Ci0JCXN1cHBvcnRlZCA9IE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJLmVxdWFscyhuYW1lc3BhY2VOYW1lKTsKLQkJcmV0dXJuIHN1cHBvcnRlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01leE9NRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tZXgvc3JjL29yZy9hcGFjaGUvYXhpczIvbWV4L29tL01leE9NRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYjA3ODUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC9vbS9NZXhPTUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1leC5vbTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhFeGNlcHRpb247Ci0vKioKLSAqIEFuIEV4Y2VwdGlvbiB0byByZXBvcnQgcHJvYmxlbSBmcm9tIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZm9yIHRoZSAKLSAqIFdTLU1ldGFkYXRhRXhjaGFuZ2UgZGF0YSBlbGVtZW50cy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXhPTUV4Y2VwdGlvbiBleHRlbmRzIE1leEV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJvdGVjdGVkIE1leE9NRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCX0KLQlwcm90ZWN0ZWQgTWV4T01FeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCXByb3RlY3RlZCBNZXhPTUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIobWVzc2FnZSwgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC91dGlsL01leFV0aWwuamF2YSBiLzFfNS9tb2R1bGVzL21leC9zcmMvb3JnL2FwYWNoZS9heGlzMi9tZXgvdXRpbC9NZXhVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmQ1MDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbWV4L3NyYy9vcmcvYXBhY2hlL2F4aXMyL21leC91dGlsL01leFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWV4LnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5PTU5hbWVzcGFjZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuT3V0cHV0Rm9ybTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1leC5NZXhDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXguTWV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubWV4Lm9tLk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgTWV4VXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1leFV0aWwuY2xhc3MpOwotCS8qKgotCSAqIEFuc3dlciBTT0FQVmVyc2lvbiBmb3Igc3BlY2lmaWVkIGVudmVsb3BlCi0JICogQHBhcmFtIGVudmVsb3BlIFNPQVAgRW52ZWxvcGUKLQkgKiBAcmV0dXJuIHZlcnNpb24gb2YgU09BUAotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0U09BUFZlcnNpb24oU09BUEVudmVsb3BlIGVudmVsb3BlKSB0aHJvd3MgTWV4RXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5hbWVzcGFjZU5hbWUgPSBlbnZlbG9wZS5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJaWYgKG5hbWVzcGFjZU5hbWUuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKQotCQkJcmV0dXJuIE1leENvbnN0YW50cy5TT0FQVmVyc2lvbi52MV8xOwotCQllbHNlIGlmIChuYW1lc3BhY2VOYW1lLmVxdWFscyhTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKSkKLQkJCXJldHVybiBNZXhDb25zdGFudHMuU09BUFZlcnNpb24udjFfMjsKLQkJZWxzZQotCQkJdGhyb3cgbmV3IE1leEV4Y2VwdGlvbigiVW5rbm93biBTT0FQIHZlcnNpb24iKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgU09BUEZhY3RvcnkgY29ycmVzcG9uZGluZyB0byBzcGVjaWZpZWQgU09BUCBuYW1lc3BhY2UgVVJJCi0JICogQHBhcmFtIHNvYXBOYW1lU3BhY2VVUkkgc29hcCBuYW1lc3BhY2UgdXJpCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeShTdHJpbmcgc29hcE5hbWVTcGFjZVVSSSkgdGhyb3dzIE1leEV4Y2VwdGlvbiB7Ci0JCQlpZiAoc29hcE5hbWVTcGFjZVVSSS5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpCi0JCQlyZXR1cm4gIE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLQkJZWxzZSBpZiAoc29hcE5hbWVTcGFjZVVSSS5lcXVhbHMoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpCi0JCQlyZXR1cm4gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgTWV4RXhjZXB0aW9uKCJVbmtub3duIFNPQVAgc29hcE5hbWVTcGFjZVVSSSIpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgU09BUEZhY3RvcnkgY29ycmVzcG9uZGluZyB0byBzcGVjaWZpZWQgU09BUCBWZXJzaW9uCi0JICogQHBhcmFtIFNPQVBWZXJzaW9uIFNPQVAgdmVyc2lvbgotCSAqIEByZXR1cm4gU09BUEZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNPQVBGYWN0b3J5IGdldFNPQVBGYWN0b3J5KGludCBTT0FQVmVyc2lvbikgewotCi0JCWlmIChTT0FQVmVyc2lvbiA9PSBNZXhDb25zdGFudHMuU09BUFZlcnNpb24udjFfMSkKLQkJCXJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0KLQl9Ci0JCi0JCi0JLy8gUmV0dXJuIGFsbCBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1zCi0JcHVibGljIHN0YXRpYyBPdXRwdXRGb3JtW10gYWxsU3VwcG9ydGVkT3V0cHV0Rm9ybXMoKXsKLQkJT3V0cHV0Rm9ybVtdb3V0cHV0Zm9ybXMgPSBuZXcgT3V0cHV0Rm9ybVtdIHsKLQkJT3V0cHV0Rm9ybS5JTkxJTkVfRk9STSwKLQkJT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNLCAKLQkJT3V0cHV0Rm9ybS5SRUZFUkVOQ0VfRk9STX07Ci0JCXJldHVybiBvdXRwdXRmb3JtczsKLQl9Ci0JCi0JIHB1YmxpYyBzdGF0aWMgTWV0YWRhdGEgZnJvbUVQUihFbmRwb2ludFJlZmVyZW5jZSBlcHIpIHRocm93cyBNZXhFeGNlcHRpb24gewotCQlBcnJheUxpc3QgZXByTWV0ZGF0YSA9IGVwci5nZXRNZXRhRGF0YSgpOwotCQlPTUVsZW1lbnQgbWV4RWxlbWVudCA9IG51bGw7Ci0JCU1ldGFkYXRhIG1ldGFkYXRhID0gbnVsbDsKLQkJaWYgKGVwck1ldGRhdGEgIT0gbnVsbCkgewotCQkJbWV4RWxlbWVudCA9IChPTUVsZW1lbnQpIGVwck1ldGRhdGEuZ2V0KDApOwotCQl9IGVsc2UgewotCQkJQXJyYXlMaXN0IHJlZlBhcm0gPSBlcHIuZ2V0RXh0ZW5zaWJsZUVsZW1lbnRzKCk7Ci0JCQlpZiAocmVmUGFybSAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZQYXJtLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9NRWxlbWVudCBlbGVtID0gKE9NRWxlbWVudCkgcmVmUGFybS5nZXQoaSk7Ci0JCQkJCWlmIChlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhNZXhDb25zdGFudHMuU1BFQy5NRVRBREFUQSkpIHsKLQkJCQkJCW1leEVsZW1lbnQgPSBlbGVtOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1leEVsZW1lbnQgIT0gbnVsbCkKLQkJCW1ldGFkYXRhID0gZnJvbU9NKG1leEVsZW1lbnQsIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJKTsKLQkJcmV0dXJuIG1ldGFkYXRhOwotCX0JCi0JIAotCS8qKgotCSAqIEFuc3dlcnMgV1MtQWRkcmVzc2luZyBuYW1lc3BhY2UKLQkgKiAKLQkgKiBAcGFyYW0gdG9BZGRyZXNzCi0JICogICAgICAgICAgICBUbyBBZGRyZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE9NTmFtZXNwYWNlSW1wbCBXUy1BZGRyZXNzaW5nIG5hbWVzcGFjZQotCSAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0JICovCi0JCi0JIHB1YmxpYyBzdGF0aWMgT01OYW1lc3BhY2VJbXBsIGdldEFkZHJlc3NpbmdOYW1lU3BhY2UoT01FbGVtZW50IHRvQWRkcmVzcykKLQkJCXRocm93cyBNZXhFeGNlcHRpb24gewotCQlPTUZhY3RvcnkgZmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotCQlPTU5hbWVzcGFjZUltcGwgd3NhID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwcmVmaXggPSB0b0FkZHJlc3MuZ2V0TmFtZXNwYWNlKCkuZ2V0UHJlZml4KCk7Ci0JCQlTdHJpbmcgbnNVUkkgPSB0b0FkZHJlc3MuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQl3c2EgPSAoT01OYW1lc3BhY2VJbXBsKSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKG5zVVJJLCBwcmVmaXgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgdGhyb3cgbmV3IE1leEV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gd3NhOwotCi0JfQotCi0gICAgICAgLyoqCi0JICogQVBJIHRvIG1hcCBtZXg6TWV0YWRhdGEgZWxlbWVudCB0byBhIE1ldGFkYXRhIG9iamVjdCByZXByZXNlbnRhdGlvbi4gRGF0YSB2YWxpZGF0aW9uIHdpbGwgCi0JICogYmUgcGVyZm9ybWVkIG9uIG9tRWxlbWVudCBjb250ZW50LiBTZWUge0BsaW5rIE1ldGFkYXRhfSBmb3IgQVBJcyB0byBhY2Nlc3MgbWV0YWRhdGEgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb21FbGVtZW50IGFuIGVsZW1lbnQgc3VjaCBhcyBlbmRwb2ludCByZWZlcmVuY2UgdHlwZSB0aGF0IGNvbnRhaW5zIG1leDpNZXRhZGF0YSBvcgotCSAqICAgICAgICAgICAgICAgICAgYW4gbWV4Ok1ldGFkYXRhIGVsZW1lbnQgCi0JICogQHJldHVybiBNZXRhZGF0YSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgbWV4Ok1ldGFkYXRhIGVsZW1lbnQgcGFzc2VkLgotCSAqIEB0aHJvd3MgTWV4RXhjZXB0aW9uIGlmIGludmFsaWQgbWV4Ok1ldGFkYXRhIGVsZW1lbnQgY29udGVudCBpcyBkZXRlY3RlZCAKLQkgKi8gCi0KLQkgCi0gICAgcHVibGljIHN0YXRpYyBNZXRhZGF0YSBmcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCkgdGhyb3dzIE1leEV4Y2VwdGlvbnsKLQkgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IGZyb21PTShvbUVsZW1lbnQsIE1leENvbnN0YW50cy5TcGVjXzIwMDRfMDkuTlNfVVJJKTsKLQkgICAgICByZXR1cm4gbWV0YWRhdGE7Ci0JfQkKLQkKLSAgICAgICAgLyoqCi0JICogQVBJIHRvIG1hcCBtZXg6TWV0YWRhdGEgZWxlbWVudCB0byBhIE1ldGFkYXRhIG9iamVjdCByZXByZXNlbnRhdGlvbi4gRGF0YSB2YWxpZGF0aW9uIHdpbGwgCi0JICogYmUgcGVyZm9ybWVkIG9uIG9tRWxlbWVudCBjb250ZW50LiBTZWUge0BsaW5rIE1ldGFkYXRhfSBmb3IgQVBJcyB0byBhY2Nlc3MgbWV0YWRhdGEgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb21FbGVtZW50IGFuIGVsZW1lbnQgc3VjaCBhcyBlbmRwb2ludCByZWZlcmVuY2UgdHlwZSB0aGF0IGNvbnRhaW5zIG1leDpNZXRhZGF0YSBvcgotCSAqICAgICAgICAgICAgICAgICAgYW4gbWV4Ok1ldGFkYXRhIGVsZW1lbnQgCi0JICogQHBhcmFtIG1leE5hbWVzcGFjZVZhbHVlICB0aGUgbmFtZXNwYWNlIG9mIHRoZSBXUy1NRVggc3BlYyB0byBjb21wbHkgd2l0aC4KLQkgKiBAcmV0dXJuIE1ldGFkYXRhIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiBtZXg6TWV0YWRhdGEgZWxlbWVudCBwYXNzZWQuCi0JICogQHRocm93cyBNZXhFeGNlcHRpb24gaWYgaW52YWxpZCBtZXg6TWV0YWRhdGEgZWxlbWVudCBjb250ZW50IGlzIGRldGVjdGVkIAotCSAqLyAJCi0JcHVibGljIHN0YXRpYyBNZXRhZGF0YSBmcm9tT00oT01FbGVtZW50IG9tRWxlbWVudCwgU3RyaW5nIG1leE5hbWVzcGFjZVZhbHVlKSB0aHJvd3MgTWV4RXhjZXB0aW9uewotCQkKLQkJU09BUEZhY3RvcnkgZmFjdG9yeSA9IE1leFV0aWwuZ2V0U09BUEZhY3RvcnkoU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0JCU1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKGZhY3RvcnksIG1leE5hbWVzcGFjZVZhbHVlKTsKLQkJbWV0YWRhdGEgPSBtZXRhZGF0YS5mcm9tT00ob21FbGVtZW50KTsKLQkJcmV0dXJuIG1ldGFkYXRhOwotCX0KLQkKLQotICAgICAgIAotICAgIC8qKgotCSAqIENoZWNrIGlmIG1ldGFkYXRhIGV4Y2hhbmdlIGhhcyBiZWVuIGRpc2FibGVkIGZvciBhIHNlcnZpY2UuIAotCSAqIEBwYXJhbSBzZXJ2aWNlQ29uZmlnTUVYUGFybSBtZXRhZGF0YWV4Y2hhbmdlIGNvbmZpZ3VyZWQgaW4gc2VydmljZXMueG1sCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01leERpc2FibGVkKFBhcmFtZXRlciBzZXJ2aWNlQ29uZmlnTUVYUGFybSkgewotCQlib29sZWFuIGRpc2FibGVkID0gZmFsc2U7Ci0JCWlmIChzZXJ2aWNlQ29uZmlnTUVYUGFybSAhPSBudWxsKSB7Ci0JCQlPTUVsZW1lbnQgbWV4Q29uZmlnID0gc2VydmljZUNvbmZpZ01FWFBhcm0uZ2V0UGFyYW1ldGVyRWxlbWVudCgpOwotCQkJU3RyaW5nIGRpc2FibGUgPSBtZXhDb25maWcuZ2V0QXR0cmlidXRlVmFsdWUobmV3IFFOYW1lKAotCQkJCQlNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5FTkFCTEVfTUVYKSk7Ci0JCQlpZiAoZGlzYWJsZSAhPSBudWxsICYmIGRpc2FibGUuZXF1YWxzKCJmYWxzZSIpKQotCQkJCWRpc2FibGVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZGlzYWJsZWQ7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZSBvdXRwdXQgZm9ybXMgZm9yIHNwZWNpZmllZCBkaWFsZWN0IGJhc2VkIG9uICJtZXRhZGF0YWV4Y2hhbmdlIiBjb25maWd1cmVkIGluIAotCSAqIGF4aXMyLnhtbCBhbmQgc2VydmljZXMueG1sLgotCSAqIFRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGluIGRldGVybWluaW5nICBvdXRwdXQgZm9ybSBjb25maWd1cmVkOiAgCi0JICogICBhLiBkaWFsZWN0IHNwZWNpZmljIGF0IHNlcnZpY2UgbGV2ZWwuCi0JICogICBiLiBzZXJ2aWNlIGxldmVsICBpLmUuIHdpdGhvdXQgZGlhbGVjdCBhdHRyaWJ1dGUgc3BlY2lmaWVkCi0JICogICBjLiBkaWFsZWN0IHNwZWNpZmljIGF0IGdsb2JhbCBsZXZlbCBpLGUsIGNvbmZpZ3VyZWQgaW4gYXhpczIueG1sCi0JICogICBkLiBzZXJ2aWNlIGxldmVsICBpLmUuIHdpdGhvdXQgZGlhbGVjdCBhdHRyaWJ1dGUgc3BlY2lmaWVkCi0JICogICBlLiBkZWZhdWx0IG91dHB1dCBmb3JtcyB0byBhbGw6IGlubGluZSwgbG9jYXRpb24sIHJlZmVyZW5jZQotCSAqICAgCi0JICogQHBhcmFtIGRpYWxlY3QKLQkgKiBAcGFyYW0gYXhpc0NvbmZpZ01FWFBhcm0gIm1ldGFkYXRhZXhjaGFuZ2UiIHBhcmFtZXRlciBjb25maWd1cmVkIGluIGF4aXMyLnhtbAotCSAqIEBwYXJhbSBzZXJ2aWNlQ29uZmlnTUVYUGFybSAgIm1ldGFkYXRhZXhjaGFuZ2UiIHBhcmFtZXRlciBjb25maWd1cmVkIGluIHNlcnZpY2VzLnhtbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE91dHB1dEZvcm1bXSBkZXRlcm1pbmVPdXRwdXRGb3JtKFN0cmluZyBkaWFsZWN0LCBQYXJhbWV0ZXIgYXhpc0NvbmZpZ01FWFBhcm0sIFBhcmFtZXRlciBzZXJ2aWNlQ29uZmlnTUVYUGFybSl7Ci0JCQotCQlpZiAoYXhpc0NvbmZpZ01FWFBhcm0gPT0gbnVsbCAmJiBzZXJ2aWNlQ29uZmlnTUVYUGFybSA9PSBudWxsKXsKLQkJCXJldHVybiBhbGxTdXBwb3J0ZWRPdXRwdXRGb3JtcygpOwotCQl9Ci0JICAgIE91dHB1dEZvcm1bXSBvdXRwdXRmb3JtID0gbmV3IE91dHB1dEZvcm1bMF07Ci0JICAgIG91dHB1dGZvcm0gPSBkZXRlcm1pbmVPdXRwdXRGb3JtKGRpYWxlY3QsIHNlcnZpY2VDb25maWdNRVhQYXJtKTsKLQkgICAgCi0JICAgIGlmIChvdXRwdXRmb3JtLmxlbmd0aCA9PSAwKSB7IC8vIG91dHB1dCBmb3JtIG5vdCBjb25maWd1cmVkIGluIHNlcnZpY2UgbGV2ZWwgY29uZmlnCi0JICAgIAlvdXRwdXRmb3JtID0gZGV0ZXJtaW5lT3V0cHV0Rm9ybShkaWFsZWN0LCBheGlzQ29uZmlnTUVYUGFybSk7Ci0JICAgIH0KLQkJCi0JICAgIGlmIChvdXRwdXRmb3JtLmxlbmd0aCA9PSAwKXsKLQkgICAgCWxvZy5kZWJ1ZygiTm8gb3V0cHV0Zm9ybSBjb25maWd1cmVkLCB1c2UgZGVmYXVsdCBvdXRwdXQgZm9ybXMiKTsKLQkgICAgCW91dHB1dGZvcm0gPSBhbGxTdXBwb3J0ZWRPdXRwdXRGb3JtcygpOwotCSAgICB9Ci0JCXJldHVybiBvdXRwdXRmb3JtOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBPdXRwdXRGb3JtW10gZGV0ZXJtaW5lT3V0cHV0Rm9ybShTdHJpbmcgZGlhbGVjdCwgUGFyYW1ldGVyIG1leFBhcm0pIHsKLQkJT3V0cHV0Rm9ybVtdIGZvcm1zID0gbmV3IE91dHB1dEZvcm1bMF07Ci0JCWlmIChtZXhQYXJtID09IG51bGwpCi0JCQlyZXR1cm4gZm9ybXM7Ci0JCQotCQlPTUVsZW1lbnQgbWV4Q29uZmlnID0gbWV4UGFybS5nZXRQYXJhbWV0ZXJFbGVtZW50KCk7Ci0JCUl0ZXJhdG9yIGl0ZSA9IG1leENvbmZpZy5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZSgKLQkJCQlNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5PVVRQVVRfRk9STV9QQVJNKSk7Ci0JCVN0cmluZyBkaWFsZWN0Rm9ybV9jb25maWd1cmVkID0gbnVsbDsKLQkJU3RyaW5nIHNlcnZpY2VGb3JtX2NvbmZpZ3VyZWQgPSBudWxsOwotCQl3aGlsZSAoaXRlLmhhc05leHQoKSkgewotCQkJT01FbGVtZW50IGVsZW0gPSAoT01FbGVtZW50KSBpdGUubmV4dCgpOwotCQkJU3RyaW5nIGZvcm1fdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLQkJCQkJTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuRk9STVNfUEFSTSkpOwotCQkJU3RyaW5nIGRpYWxlY3RfdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZVZhbHVlKG5ldyBRTmFtZSgKLQkJCQkJTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuRElBTEVDVF9QQVJNKSk7Ci0JCQlpZiAoZGlhbGVjdF92YWx1ZSA9PSBudWxsKXsKLQkJCQlzZXJ2aWNlRm9ybV9jb25maWd1cmVkID0gZm9ybV92YWx1ZTsKLQkJCX0JCi0JCQllbHNlIGlmIChkaWFsZWN0X3ZhbHVlICE9IG51bGwKLQkJCQkJJiYgZGlhbGVjdF92YWx1ZS5lcXVhbHMoZGlhbGVjdCkpIHsKLQkJCQlkaWFsZWN0Rm9ybV9jb25maWd1cmVkID0gZm9ybV92YWx1ZTsKLQkJCX0JCi0JICAgICB9Ci0JCQkKLQkJaWYgKGRpYWxlY3RGb3JtX2NvbmZpZ3VyZWQgIT0gbnVsbCl7Ci0JCQlmb3JtcyA9IHBhcnNlRm9ybXMoZGlhbGVjdEZvcm1fY29uZmlndXJlZCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VydmljZUZvcm1fY29uZmlndXJlZCAhPSBudWxsKXsKLQkJCWZvcm1zID0gcGFyc2VGb3JtcyhzZXJ2aWNlRm9ybV9jb25maWd1cmVkKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZvcm1zOwotCX0JCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgT3V0cHV0Rm9ybVtdIHBhcnNlRm9ybXMoU3RyaW5nIGZvcm1fdmFsdWVzKSB7Ci0JCUxpc3QgZm9ybXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZm9ybV92YWx1ZXMsCi0JCQkJTWV4Q29uc3RhbnRzLk1FWF9DT05GSUcuREVMSU1JVEVSKTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rZW4uZXF1YWxzKE1leENvbnN0YW50cy5NRVhfQ09ORklHLklOTElORSkpCi0JCQkJZm9ybXMuYWRkKE91dHB1dEZvcm0uSU5MSU5FX0ZPUk0pOwotCQkJZWxzZSBpZiAodG9rZW4uZXF1YWxzKE1leENvbnN0YW50cy5NRVhfQ09ORklHLkxPQ0FUSU9OKSkKLQkJCQlmb3Jtcy5hZGQoT3V0cHV0Rm9ybS5MT0NBVElPTl9GT1JNKTsKLQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscyhNZXhDb25zdGFudHMuTUVYX0NPTkZJRy5SRUZFUkVOQ0UpKQotCQkJCWZvcm1zLmFkZChPdXRwdXRGb3JtLlJFRkVSRU5DRV9GT1JNKTsKLQkJCWVsc2UgewotICAgICAgICAgICAgICBsb2cuZGVidWcoIkludmFsaWQgZm9ybSBjb25maWd1cmVkLCAiICsgZm9ybV92YWx1ZXMpOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gKE91dHB1dEZvcm1bXSkgZm9ybXMudG9BcnJheShuZXcgT3V0cHV0Rm9ybVswXSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9wb20ueG1sIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRiYzgxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPm10b21wb2xpY3k8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gTVRPTSBQb2xpY3kgbW9kdWxlPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BeGlzMiA6IE1UT00gUG9saWN5IG1vZHVsZTwvZGVzY3JpcHRpb24+Ci0gICAgPHBhY2thZ2luZz5tYXI8L3BhY2thZ2luZz4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXI8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5LW1hcjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXI8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jaWVzPmZhbHNlPC9pbmNsdWRlRGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNWIwZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08bW9kdWxlIG5hbWU9Im10b21wb2xpY3kiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLm10b21wb2xpY3kuTVRPTVBvbGljeSI+Ci0gICAgPERlc2NyaXB0aW9uPgotICAgICAgVGhpcyBpcyB0aGUgTVRPTSBwb2xpY3kgbW9kdWxlLiBJdCBpcyBlbmdhZ2VkIHdoZW4gd2UgaGF2ZSBNVE9NIHBvbGljeSBhc3NlcnRpb24uCi0gICAgPC9EZXNjcmlwdGlvbj4KLSAgICA8c3VwcG9ydGVkLXBvbGljeS1uYW1lc3BhY2VzIG5hbWVzcGFjZXM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5L29wdGltaXplZG1pbWVzZXJpYWxpemF0aW9uIGh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5Ii8+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iTVRPTUluSGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIubXRvbXBvbGljeS5NVE9NSW5IYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJNVE9NT3V0SGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIubXRvbXBvbGljeS5NVE9NT3V0SGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9Ik1lc3NhZ2VPdXQiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0Rmxvdz4gICAgCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvTVRPTUluSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NSW5IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzE5OTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NSW5IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tcG9saWN5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuTVRPTUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWwuTVRPTUFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZG9lcyBhIE1UT00gdmFsaWRhdGlvbiBvZiB0aGUgbWVzc2FnZS4gSXQgY2hlY2tzIGlmIGl0IHNob3VsZCBiZSBNVE9NaXNlZCwgb3IgPC9icj4KLSAqIGlmIHRoZSBtZXNzYWdlIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBNVE9NIHBvbGljeSBzZXQuIAotICovCi1wdWJsaWMgY2xhc3MgTVRPTUluSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIE1UT01pc2VkLiBJZiBpdCBpcyBub3QgYnV0IHRoZSBwb2xpY3kgc3RhdGVzIHRoYXQgaXQgc2hvdWxkIGJlIDwvYnI+Ci0JICogdGhlbiBhbiB7QGxpbmsgQXhpc0ZhdWx0fSBpcyB0aHJvd24uCi0gICAgICogCi0gICAgICogQHBhcmFtIG1zZ0N0eCB0aGUge0BsaW5rIE1lc3NhZ2VDb250ZXh0fQotICAgICAqIAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IGlmIHRoZSBtZXNzYWdlIGlzIG5vdCBNVE9NaXNlZCwgYnV0IHRoZSBwb2xpY3kgc3RhdGVzIHNvLgotCSAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFBvbGljeSBwb2xpY3kgPSBtc2dDdHguZ2V0RWZmZWN0aXZlUG9saWN5KCk7Ci0gICAgICAgIGlmIChwb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PEFzc2VydGlvbj4gbGlzdCA9IChMaXN0PEFzc2VydGlvbj4pIHBvbGljeS5nZXRBbHRlcm5hdGl2ZXMoKQotICAgICAgICAgICAgICAgIC5uZXh0KCk7Ci0gICAgICAgIGZvciAoQXNzZXJ0aW9uIGFzc2VydGlvbiA6IGxpc3QpIHsKLSAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gKFN0cmluZykgbXNnQ3R4LmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhc3NlcnRpb24uaXNPcHRpb25hbCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IGNvbnRlbnRUeXBlLmluZGV4T2YoTVRPTUNvbnN0YW50cy5NVE9NX1RZUEUpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnQ3R4LmlzU2VydmVyU2lkZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIFNPQVAgUkVRVUVTVCBzZW50IGJ5IHRoZSBjbGllbnQgSVMgTk9UIE1UT01pemVkISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgU09BUCBSRVNQT05TRSBzZW50IGJ5IHRoZSBzZXJ2aWNlIElTIE5PVCBNVE9NaXplZCEiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NT3V0SGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9NVE9NT3V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWFmNTI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvTVRPTU91dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tcG9saWN5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWwuTVRPTUFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIFRoaXMgb3V0IGhhbmRsZXIgZG9lcyBhIGNoZWNrIG9mIHRoZSBlZmZlY3RpdmUgcG9saWN5IHNldC4gQmFzZWQgb24gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBNVE9NIHByb3BlcnR5IDwvYnI+Ci0gKiB2YWx1ZSBpcyBzZXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NT3V0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgc2V0IGFuZCBiYXNlZCBvbiBpdCB0aGUgPGNvZGU+ZW5hYmxlTVRPTTwvY29kZT4gaXMgc2V0IHRvIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZS48L2JyPgotCSAqIEUuZy4gaWYgdGhlIHBvbGljeSBzdGF0ZXMgdGhhdCBNVE9NIGlzIDxjb2RlPm9wdGlvbmFsPC9jb2RlPiB0aGVuIHRoZSA8Y29kZT5lbmFibGVNVE9NPC9jb2RlPiBpcyBzZXQgdG8gdGhpcyB2YWx1ZS4gIAotCSAqIAotCSAqIEBwYXJhbSBtc2dDdHggdGhlIHtAbGluayBNZXNzYWdlQ29udGV4dH0KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotCSAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgUG9saWN5IHBvbGljeSA9IG1zZ0N0eC5nZXRFZmZlY3RpdmVQb2xpY3koKTsKLQotICAgICAgICBpZiAocG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIFdoZW4gd2UgaGF2ZSBwb2xpY3kgYWx0ZXJuYXRpdmVzIHN1cHBvcnQgd2Ugd2lsbCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAvLyB0aGUgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIExpc3Q8QXNzZXJ0aW9uPiBsaXN0ID0gKExpc3Q8QXNzZXJ0aW9uPikgcG9saWN5LmdldEFsdGVybmF0aXZlcygpLm5leHQoKTsKLQotICAgICAgICBmb3IgKEFzc2VydGlvbiBhc3NlcnRpb24gOiBsaXN0KSB7Ci0gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbikgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPcHRpb25hbCA9IGFzc2VydGlvbi5pc09wdGlvbmFsKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNPcHRpb25hbCkgewotICAgICAgICAgICAgICAgICAgICBtc2dDdHguc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlZBTFVFX09QVElPTkFMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtc2dDdHguc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRU5BQkxFX01UT00sIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L01UT01Qb2xpY3kuamF2YSBiLzFfNS9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvTVRPTVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzQwZTdmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3ktbWFyL3NyYy9vcmcvYXBhY2hlL2F4aXMyL210b21wb2xpY3kvTVRPTVBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tcG9saWN5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWwuTVRPTUFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIFRoZSBtb2R1bGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBNVE9NIG1vZHVsZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NUG9saWN5IGltcGxlbWVudHMgTW9kdWxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNVE9NUG9saWN5LmNsYXNzKTsKLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImFwcGx5UG9saWN5KCkgY2FsbGVkIG9uIE1UT01Qb2xpY3kgbW9kdWxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuU3VwcG9ydEFzc2VydGlvbihBc3NlcnRpb24gYXNzZXJ0aW9uKSB7Ci0KLSAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoImNhblN1cHBvcnRBc3NlcnRpb24gY2FsbGVkIG9uIE1UT01Qb2xpY3kgbW9kdWxlIHdpdGggIgotICAgICAgICAgICAgICAgICAgICArIGFzc2VydGlvbi5nZXROYW1lKCkudG9TdHJpbmcoKSArICIgYXNzZXJ0aW9uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5nYWdlTm90aWZ5KEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJNVE9NUG9saWN5IG1vZHVsZSBoYXMgYmVlbiBlbmdhZ2VkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgKyBheGlzRGVzY3JpcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBVdGlscy5sb2NhdGVBeGlzU2VydmljZShheGlzRGVzY3JpcHRpb24pOwotCi0gICAgICAgIGlmIChheGlzU2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIk1UT01Qb2xpY3kgbW9kdWxlIGNvdWxkbid0IGZpbmQgdGhlIEF4aXMgU2VydmljZSAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNTZXJ2aWNlCi0gICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSk7Ci0KLSAgICAgICAgUG9saWN5IG10b21Qb2xpY3kgPSBVdGlscy5nZXRNVE9NUG9saWN5KHBhcmFtKTsKLQotICAgICAgICBpZiAobXRvbVBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBVdGlscy5hcHBseVBvbGljeVRvU09BUEJpbmRpbmdzKGF4aXNTZXJ2aWNlLCBtdG9tUG9saWN5KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LCBBeGlzTW9kdWxlIG1vZHVsZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiaW5pdCgpIGNhbGxlZCBvbiBNVE9NUG9saWN5IG1vZHVsZSIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1Zygic2h1dGRvd24oKSBjYWxsZWQgb24gTVRPTVBvbGljeSBtb2R1bGUiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L1V0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9tdG9tcG9saWN5LW1hci9zcmMvb3JnL2FwYWNoZS9heGlzMi9tdG9tcG9saWN5L1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OTA5MDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS1tYXIvc3JjL29yZy9hcGFjaGUvYXhpczIvbXRvbXBvbGljeS9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tdG9tcG9saWN5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc0JpbmRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NMTBBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWwuTVRPTUFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuUG9saWN5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotCi0vKioKLSAqIFRoaXMgaXMgYSBNVE9NIG1vZHVsZSB1dGlsaXR5IGNsYXNzLiBJdCBjb250YWlucyBzb21lIHVzZWZ1bCBtZXRob2RzIHVzZWQgaW50byB0aGUgTVRPTSBtb2R1bGUuIAotICovCi1wdWJsaWMgY2xhc3MgVXRpbHMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFV0aWxzLmNsYXNzKTsKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRPTV9BU1NFUlRJT05fQVBQTElFRCA9ICJNVE9NX0FTU0VSVElPTl9BUFBMSUVEIjsKLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIHRoZSBNVE9NIGFzc2VydGlvbiBvYmplY3QgaWYgaXQgaXMgZXhpc3RzIGludG8gdGhlIHBvbGljeSBiYXNlZCBvbiBhIGdpdmVuIHtAbGluayBBeGlzRGVzY3JpcHRpb259LgotICAgICAqIAotICAgICAqIEBwYXJhbSBheGlzRGVzY3JpcHRpb24gdGhlIHtAbGluayBBeGlzRGVzY3JpcHRpb259IG9iamVjdCB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZC4KLSAgICAgKiBAcmV0dXJuIHtAbGluayBNVE9NQXNzZXJ0aW9ufSAgdGhlIHtAbGluayBNVE9NQXNzZXJ0aW9ufSBmb3VuZC4gSWYgaXQgaXMgbm90IGZvdW5kICJudWxsIiBpcyByZXR1cm5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1UT01Bc3NlcnRpb24gZ2V0TVRPTUFzc2VydGlvbihBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB7Ci0KLSAgICAgICAgaWYgKGF4aXNEZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF4aXNEZXNjcmlwdGlvbiBwYXNzZWQgYXMgcGFyYW1ldGVyIGhhcyBhIFwibnVsbFwiIHZhbHVlLiIpOwotICAgICAgICAgICAgfSAgICAgICAgCQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3QgcG9saWN5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcG9saWN5TGlzdC5hZGRBbGwoYXhpc0Rlc2NyaXB0aW9uLmdldFBvbGljeVN1YmplY3QoKQotICAgICAgICAgICAgICAgIC5nZXRBdHRhY2hlZFBvbGljeUNvbXBvbmVudHMoKSk7Ci0KLSAgICAgICAgUG9saWN5IHBvbGljeSA9IFBvbGljeVV0aWwuZ2V0TWVyZ2VkUG9saWN5KHBvbGljeUxpc3QsIGF4aXNEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgaWYgKHBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8QXNzZXJ0aW9uPiBsaXN0ID0gKExpc3Q8QXNzZXJ0aW9uPikgcG9saWN5LmdldEFsdGVybmF0aXZlcygpCi0gICAgICAgICAgICAgICAgLm5leHQoKTsKLQotICAgICAgICBmb3IgKEFzc2VydGlvbiBhc3NlcnRpb24gOiBsaXN0KSB7Ci0gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiAoTVRPTUFzc2VydGlvbikgYXNzZXJ0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2NhdGVzIHRoZSB7QGxpbmsgQXhpc1NlcnZpY2V9IG9iamVjdCBzZWFyY2hpbmcgdXAgaW4gdGhlIGhpZXJhcmNoeSByZWN1cnNpdmVseSA8L2JyPgotICAgICAqIHRoZSB7QGxpbmsgQXhpc0Rlc2NyaXB0aW9ufSBvYmplY3QgcGFzc2VkLgotICAgICAqICAgCi0gICAgICogQHBhcmFtIGF4aXNEZXNjcmlwdGlvbiB0aGUge0BsaW5rIEF4aXNEZXNjcmlwdGlvbn0gb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGNoZWNrZWQuCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIEF4aXNTZXJ2aWNlfSBvYmplY3QgZm91bmQgb3IgIm51bGwiLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQXhpc1NlcnZpY2UgbG9jYXRlQXhpc1NlcnZpY2UoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgewotCi0gICAgICAgIGlmIChheGlzRGVzY3JpcHRpb24gPT0gbnVsbCB8fCBheGlzRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBBeGlzU2VydmljZSkgewotICAgICAgICAgICAgcmV0dXJuIChBeGlzU2VydmljZSkgYXhpc0Rlc2NyaXB0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGxvY2F0ZUF4aXNTZXJ2aWNlKGF4aXNEZXNjcmlwdGlvbi5nZXRQYXJlbnQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlZCBvbiB0aGUgcGFyYW1ldGVyIHBhc3NlZCBhIHtAbGluayBNVE9NMTBBc3NlcnRpb259IG9iamVjdCBpcyBjcmVhdGVkIGJ5IGRlZmF1bHQuIDwvYnI+Ci0gICAgICogVGhlbiBpdCBpcyBhZGRlZCB0byBhIHtAbGluayBQb2xpY3l9IG9iamVjdCBhbmQgcmV0dXJuZWQuIAotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbSB0aGUge0BsaW5rIFBhcmFtZXRlcn0gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSAiZW5hYmxlTVRPTSIgcGFyYW1ldGVyOiA8L2JyPgotICAgICAqICJ0cnVlIiBvciAib3B0aW9uYWwiLgotICAgICAqIEByZXR1cm4gVGhlIHtAbGluayBQb2xpY3l9IG9iamVjdCBmb3IgdGhlIE1UT00gYXNzZXJ0aW9uLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBvbGljeSBnZXRNVE9NUG9saWN5KFBhcmFtZXRlciBwYXJhbSkgewotCi0gICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gV2UgbmVlZCB0byBnaXZlIHRoZSB1c2VyIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkgaWYgTVRPTSAxLjAgb3IgTVRPTSAxLjEgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgIE1UT01Bc3NlcnRpb24gbXRvbTEwOwotCi0gICAgICAgIGlmIChDb25zdGFudHMuVkFMVUVfVFJVRS5lcXVhbHMocGFyYW0uZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgIG10b20xMCA9IG5ldyBNVE9NMTBBc3NlcnRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuVkFMVUVfT1BUSU9OQUwuZXF1YWxzKHBhcmFtLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICBtdG9tMTAgPSBuZXcgTVRPTTEwQXNzZXJ0aW9uKCk7Ci0gICAgICAgICAgICBtdG9tMTAuc2V0T3B0aW9uYWwodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFBvbGljeSBwb2xpY3kgPSBuZXcgUG9saWN5KCk7Ci0gICAgICAgIHBvbGljeS5hZGRBc3NlcnRpb24obXRvbTEwKTsKLQotICAgICAgICByZXR1cm4gcG9saWN5OwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGllcyB0aGUgTVRPTSBwb2xpY3kgdG8gdGhlIGJpbmRpbmcgbGV2ZWwgb2YgdGhlIHdlYiBzZXJ2aWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBheGlzU2VydmljZSB0aGUge0BsaW5rIEF4aXNTZXJ2aWNlfSB0byB3aG9tIGJpbmRpbmcgbGV2ZWwgdGhlIE1UT00gcG9saWN5IHNob3VsZCBiZSBhdHRhY2hlZC4KLSAgICAgKiBAcGFyYW0gcG9saWN5IHRoZSB7QGxpbmsgUG9saWN5fSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgTVRPTSBhc3NlcnRpb24uCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgdGhyb3duIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbG9ja2VkIG9uIGEgcGFyZW50IGxldmVsIC0gdGh1cyBpdCBjb3VsZCBub3QgYmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5UG9saWN5VG9TT0FQQmluZGluZ3MoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsCi0gICAgICAgICAgICBQb2xpY3kgcG9saWN5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihNVE9NX0FTU0VSVElPTl9BUFBMSUVEKTsKLQotICAgICAgICBpZiAoIHBvbGljeSA9PSBudWxsIHx8IChwYXJhbSAhPSBudWxsICYmIENvbnN0YW50cy5WQUxVRV9UUlVFLmVxdWFscyhwYXJhbS5nZXRWYWx1ZSgpKSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoT2JqZWN0IG9iaiA6IGF4aXNTZXJ2aWNlLmdldEVuZHBvaW50cygpLnZhbHVlcygpKSB7Ci0KLSAgICAgICAgICAgIEF4aXNFbmRwb2ludCBlbmRwb2ludCA9IChBeGlzRW5kcG9pbnQpIG9iajsKLSAgICAgICAgICAgIEF4aXNCaW5kaW5nIGJpbmRpbmcgPSBlbmRwb2ludC5nZXRCaW5kaW5nKCk7IAotICAgICAgICAgICAgaWYgKEphdmEyV1NETENvbnN0YW50cy5UUkFOU1BPUlRfVVJJLmVxdWFscyhiaW5kaW5nLmdldFR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgV1NETDJDb25zdGFudHMuVVJJX1dTREwyX1NPQVAuZXF1YWxzKGJpbmRpbmcuZ2V0VHlwZSgpKSkgewotICAgICAgICAgICAgICAgIGJpbmRpbmcuZ2V0UG9saWN5U3ViamVjdCgpLmF0dGFjaFBvbGljeShwb2xpY3kpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXhpc1NlcnZpY2UKLSAgICAgICAgICAgICAgICAuYWRkUGFyYW1ldGVyKCJNVE9NX0FTU0VSVElPTl9BUFBMSUVEIiwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3BvbS54bWwgYi8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWQzZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLW10b21wb2xpY3k8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gTVRPTSBQb2xpY3k8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIDogTVRPTSBQb2xpY3k8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvbXRvbXBvbGljeTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL210b21wb2xpY3k8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL210b21wb2xpY3k8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm5lZXRoaS5idWlsZGVycy5Bc3NlcnRpb25CdWlsZGVyIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS9zcmMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS5uZWV0aGkuYnVpbGRlcnMuQXNzZXJ0aW9uQnVpbGRlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyZTQ0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLm5lZXRoaS5idWlsZGVycy5Bc3NlcnRpb25CdWlsZGVyCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVycy5NVE9NMTBBc3NlcnRpb25CdWlsZGVyCi1vcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVycy5NVE9NMTFBc3NlcnRpb25CdWlsZGVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9idWlsZGVycy9NVE9NMTBBc3NlcnRpb25CdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9idWlsZGVycy9NVE9NMTBBc3NlcnRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmU5MWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS9zcmMvb3JnL2FwYWNoZS9heGlzMi9wb2xpY3kvYnVpbGRlcnMvTVRPTTEwQXNzZXJ0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucG9saWN5Lm1vZGVsLk1UT00xMEFzc2VydGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbkJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLmJ1aWxkZXJzLkFzc2VydGlvbkJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgTVRPTSBhc3NlcnRpb24gb2JqZWN0IDwvYnI+Ci0gKiAoY29tcGxpYW50IHdpdGggdGhlIFdTLU1UT01Qb2xpY3kgdmVyaW9uIDEuMCkuCi0gKiBUaGUgYnVpbGRlciB3aWxsIGJlIHBpY2tlZCBieSB0aGUKLSAqICJvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb25CdWlsZGVyRmFjdG9yeSIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NMTBBc3NlcnRpb25CdWlsZGVyIGltcGxlbWVudHMgQXNzZXJ0aW9uQnVpbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTVRPTTEwQXNzZXJ0aW9uQnVpbGRlci5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgQXNzZXJ0aW9uIGJ1aWxkKE9NRWxlbWVudCBlbGVtZW50LCBBc3NlcnRpb25CdWlsZGVyRmFjdG9yeSBmYWN0b3J5KQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Bc3NlcnRpb24gPSBuZXcgTVRPTTEwQXNzZXJ0aW9uKCk7Ci0KLSAgICAgICAgcHJvY2Vzc01UT00xMEFzc2VydGlvbihlbGVtZW50LCBtdG9tQXNzZXJ0aW9uKTsKLQotICAgICAgICByZXR1cm4gbXRvbUFzc2VydGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWVbXSBnZXRLbm93bkVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lW10geyBuZXcgUU5hbWUoTVRPTTEwQXNzZXJ0aW9uLk5TLAotICAgICAgICAgICAgICAgIE1UT00xMEFzc2VydGlvbi5NVE9NX1NFUklBTElaQVRJT05fQ09ORklHX0xOKSB9OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTVRPTTEwQXNzZXJ0aW9uKE9NRWxlbWVudCBlbGVtZW50LAotICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Bc3NlcnRpb24pIHsKLQotICAgICAgICAvLyBDaGVja2luZyB3c3A6T3B0aW9uYWwgYXR0cmlidXRlCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlFfRUxFTV9PUFRJT05BTF9BVFRSKTsKLSAgICAgICAgYm9vbGVhbiBpc09wdGlvbmFsID0gSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkodmFsdWUpOwotCi0gICAgICAgIG10b21Bc3NlcnRpb24uc2V0T3B0aW9uYWwoaXNPcHRpb25hbCk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L2J1aWxkZXJzL01UT00xMUFzc2VydGlvbkJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L2J1aWxkZXJzL01UT00xMUFzc2VydGlvbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhNzlkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9idWlsZGVycy9NVE9NMTFBc3NlcnRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5idWlsZGVyczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbC5NVE9NMTBBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWwuTVRPTTExQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucG9saWN5Lm1vZGVsLk1UT01Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uQnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLmJ1aWxkZXJzLkFzc2VydGlvbkJ1aWxkZXI7Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgY3JlYXRpb24gb2YgYSBNVE9NIGFzc2VydGlvbiBvYmplY3QgPC9icj4KLSAqIChjb21wbGlhbnQgd2l0aCB0aGUgV1MtTVRPTVBvbGljeSB2ZXJpb24gMS4xKS4KLSAqIFRoZSBidWlsZGVyIHdpbGwgYmUgcGlja2VkIGJ5IHRoZQotICogIm9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbkJ1aWxkZXJGYWN0b3J5Ii4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTVRPTTExQXNzZXJ0aW9uQnVpbGRlciBpbXBsZW1lbnRzIEFzc2VydGlvbkJ1aWxkZXJ7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1UT00xMEFzc2VydGlvbkJ1aWxkZXIuY2xhc3MpOwotCi0gICAgcHVibGljIEFzc2VydGlvbiBidWlsZChPTUVsZW1lbnQgZWxlbWVudCwgQXNzZXJ0aW9uQnVpbGRlckZhY3RvcnkgZmFjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCi0gICAgICAgIE1UT00xMUFzc2VydGlvbiBtdG9tQXNzZXJ0aW9uID0gbmV3IE1UT00xMUFzc2VydGlvbigpOwotCi0gICAgICAgIHByb2Nlc3NNVE9NMTFBc3NlcnRpb24oZWxlbWVudCwgbXRvbUFzc2VydGlvbik7Ci0KLSAgICAgICAgcmV0dXJuIG10b21Bc3NlcnRpb247Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lW10gZ2V0S25vd25FbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZVtdIHsgbmV3IFFOYW1lKE1UT00xMUFzc2VydGlvbi5OUywKLSAgICAgICAgICAgICAgICBNVE9NMTFBc3NlcnRpb24uTVRPTV9MTikgfTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc01UT00xMUFzc2VydGlvbihPTUVsZW1lbnQgZWxlbWVudCwKLSAgICAgICAgICAgIE1UT00xMUFzc2VydGlvbiBtdG9tQXNzZXJ0aW9uKSB7Ci0KLSAgICAgICAgLy8gQ2hlY2tpbmcgd3NwOk9wdGlvbmFsIGF0dHJpYnV0ZQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZVZhbHVlKENvbnN0YW50cy5RX0VMRU1fT1BUSU9OQUxfQVRUUik7Ci0gICAgICAgIGJvb2xlYW4gaXNPcHRpb25hbCA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHZhbHVlKTsKLQotICAgICAgICBtdG9tQXNzZXJ0aW9uLnNldE9wdGlvbmFsKGlzT3B0aW9uYWwpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NMTBBc3NlcnRpb24uamF2YSBiLzFfNS9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMEFzc2VydGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjdmMThmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMEFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLQotLyoqCi0gKiBBc3NlcnRpb24gdG8gcGljayB1cCB0aGUgUU5hbWUgJmx0d3NvbWE6T3B0aW1pemVkTWltZVNlcmlhbGl6YXRpb24KLSAqIHhtbG5zOndzb21hPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeS9vcHRpbWl6ZWRtaW1lc2VyaWFsaXphdGlvbiIvJmd0ICB3aGljaCBpcyBjb21wbGlhbnQgPGJyPgotICogd2l0aCB0aGUgV1MtTVRPTVBvbGljeSB2ZXJpb24gMS4wLgotICovCi1wdWJsaWMgY2xhc3MgTVRPTTEwQXNzZXJ0aW9uIGV4dGVuZHMgTVRPTUFzc2VydGlvbiB7Ci0KLSAgICAvLyBjcmVhdGluZyBhIGxvZ2dlciBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhNVE9NMTBBc3NlcnRpb24uY2xhc3MpOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kvb3B0aW1pemVkbWltZXNlcmlhbGl6YXRpb24iOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTVRPTV9TRVJJQUxJWkFUSU9OX0NPTkZJR19MTiA9ICJPcHRpbWl6ZWRNaW1lU2VyaWFsaXphdGlvbiI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVggPSAid3NvbWEiOwotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoTlMsIE1UT01fU0VSSUFMSVpBVElPTl9DT05GSUdfTE4pOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlRZUEVfQVNTRVJUSU9OOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsKFBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChOUyk7Ci0KLSAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBwcmVmaXggPSBQUkVGSVg7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KFBSRUZJWCwgTlMpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KFBSRUZJWCwgTVRPTV9TRVJJQUxJWkFUSU9OX0NPTkZJR19MTiwgTlMpOwotCi0gICAgICAgIGlmIChvcHRpb25hbCkgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1dTUCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlFfRUxFTV9PUFRJT05BTF9BVFRSLmdldExvY2FsUGFydCgpLCAidHJ1ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKFBSRUZJWCwgTlMpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9saWN5Q29tcG9uZW50IG5vcm1hbGl6ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NMTFBc3NlcnRpb24uamF2YSBiLzFfNS9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMUFzc2VydGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjczODI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvc3JjL29yZy9hcGFjaGUvYXhpczIvcG9saWN5L21vZGVsL01UT00xMUFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUNvbXBvbmVudDsKLQotLyoqCi0gKiBBc3NlcnRpb24gdG8gcGljayB1cCB0aGUgUU5hbWUgJmx0d3NvbWE6TVRPTQotICogeG1sbnM6d3NvbWE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5Ii8mZ3Qgd2hpY2ggaXMgY29tcGxpYW50IDwvYnI+Ci0gKiB3aXRoIHRoZSBXUy1NVE9NUG9saWN5IHZlcmlvbiAxLjEuCi0gKi8KLQotcHVibGljIGNsYXNzIE1UT00xMUFzc2VydGlvbiBleHRlbmRzIE1UT01Bc3NlcnRpb24gewotCi0gICAgLy8gY3JlYXRpbmcgYSBsb2dnZXIgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTVRPTTExQXNzZXJ0aW9uLmNsYXNzKTsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5IjsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1UT01fTE4gPSAiTVRPTSI7Ci0KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUkVGSVggPSAid3NvbWEiOwotCi0gICAgcHVibGljIFFOYW1lIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoTlMsIE1UT01fTE4pOwotICAgIH0KLQotICAgIHB1YmxpYyBQb2xpY3lDb21wb25lbnQgbm9ybWFsaXplKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KE5TKTsKLQotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHByZWZpeCA9IFBSRUZJWDsKLSAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgoUFJFRklYLCBOUyk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoUFJFRklYLCBNVE9NX0xOLCBOUyk7Ci0KLSAgICAgICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfV1NQLCBudWxsLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuUV9FTEVNX09QVElPTkFMX0FUVFIuZ2V0TG9jYWxQYXJ0KCksICJ0cnVlIik7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoUFJFRklYLCBOUyk7Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsKFBvbGljeUNvbXBvbmVudCBwb2xpY3lDb21wb25lbnQpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBDb25zdGFudHMuVFlQRV9BU1NFUlRJT047Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MTY0ZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS9zcmMvb3JnL2FwYWNoZS9heGlzMi9wb2xpY3kvbW9kZWwvTVRPTUFzc2VydGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnBvbGljeS5tb2RlbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLkFzc2VydGlvbjsKLQotLyoqCi0gKiAKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3Mgc3BlY2lmaWVzIHRoZSBjb21tb24gZmVhdHVyZXMgb2YgYSBNVE9NIGFzc2VydGlvbi4gCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTVRPTUFzc2VydGlvbiBpbXBsZW1lbnRzIEFzc2VydGlvbiB7Ci0KLQkvKiogU3BlY2lmaWVzIGlmIHRoZSBNVE9NIGFzc2VydGlvbiBpcyBvcHRpb25hbC4gVGhlIHJlcXVlc3QgY2FuIGJlIE1UT01pc2VkIG9yIG5vbi1NVE9NaXNlZCw8L2JyPgotCSAqICBidXQgdGhlIHJlc3BvbnNlIHdpbGwgYmUgTVRPTWlzZWQgb25seSBpZiByZXF1ZXN0IGlzIE1UT01pc2VkLiAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIG9wdGlvbmFsID0gZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBNVE9NIGFzc2VydGlvbiBpcyBvcHRpb25hbC4gVGhlIHJlcXVlc3QgY2FuIGJlIE1UT01pc2VkIG9yIG5vbi1NVE9NaXNlZCw8L2JyPgotCSAqIGJ1dCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBNVE9NaXNlZCBvbmx5IGlmIHJlcXVlc3QgaXMgTVRPTWlzZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgTVRPTSBhc3NlcnRpb24gaXMgb3B0aW9uYWwsIG90aGVyd2lzZSByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotICAgICAgICByZXR1cm4gb3B0aW9uYWw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIDxjb2RlPm9wdGlvbmFsPC9jb2RlPiBwYXJhbWV0ZXIuICAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaXNPcHRpb25hbCBzZXRzIGlmIHRoZSBNVE9NIGFzc2VydGlvbiBpcyBvcHRpb25hbCBvciBub3QuIElmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiA8L2JyPgotICAgICAqIHRoZW4gaWYgdGhlIHJlcXVlc3QgaXMgTVRPTWlzZWQgdGhlbiB0aGUgcmVzcG9uc2Ugc2hvdWxkIGJlIE1UT01pc2VkLCB0b28uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiBpc09wdGlvbmFsKSB7Ci0gICAgICAgIHRoaXMub3B0aW9uYWwgPSBpc09wdGlvbmFsOwotICAgIH0KLQotfQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20tb3B0aW9uYWwueG1sIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbS1vcHRpb25hbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjAxYTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvbXRvbXBvbGljeS90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbS1vcHRpb25hbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPHdzcDpQb2xpY3kgd3N1OklkPSJTaWdFbmNyIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiPgotCTx3c3A6RXhhY3RseU9uZT4KLQkJPHdzcDpBbGw+Ci0JCQk8d3NvbWE6T3B0aW1pemVkTWltZVNlcmlhbGl6YXRpb24geG1sbnM6d3NvbWE9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5L29wdGltaXplZG1pbWVzZXJpYWxpemF0aW9uIiB3c3A6T3B0aW9uYWw9InRydWUiLz4KLQkJPC93c3A6QWxsPgotCTwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tLXNlY3VyaXR5LnhtbCBiLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20tc2VjdXJpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ5MzlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20tc2VjdXJpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTx3c3A6UG9saWN5IHdzdTpJZD0iU2lnRW5jciIgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxuczp3c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5Ij4KLQk8d3NwOkV4YWN0bHlPbmU+Ci0JCTx3c3A6QWxsPgotCQkJPHNwOkFzeW1tZXRyaWNCaW5kaW5nIHhtbG5zOnNwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA3L3NlY3VyaXR5cG9saWN5Ij4KLQkJCQk8d3NwOlBvbGljeT4KLQkJCQkJPHNwOkluaXRpYXRvclRva2VuPgotCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJPHNwOlg1MDlUb2tlbiBzcDpJbmNsdWRlVG9rZW49Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kvSW5jbHVkZVRva2VuL0Fsd2F5c1RvUmVjaXBpZW50Ij4KLQkJCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJCQk8c3A6V3NzWDUwOVYzVG9rZW4xMC8+Ci0JCQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJCQk8L3NwOlg1MDlUb2tlbj4KLQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJPC9zcDpJbml0aWF0b3JUb2tlbj4KLQkJCQkJPHNwOlJlY2lwaWVudFRva2VuPgotCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJPHNwOlg1MDlUb2tlbiBzcDpJbmNsdWRlVG9rZW49Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kvSW5jbHVkZVRva2VuL05ldmVyIj4KLQkJCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJCQk8c3A6V3NzWDUwOVYzVG9rZW4xMC8+Ci0JCQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJCQk8L3NwOlg1MDlUb2tlbj4KLQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJPC9zcDpSZWNpcGllbnRUb2tlbj4KLQkJCQkJPHNwOkFsZ29yaXRobVN1aXRlPgotCQkJCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCQkJPHNwOlRyaXBsZURlc1JzYTE1Lz4KLQkJCQkJCTwvd3NwOlBvbGljeT4KLQkJCQkJPC9zcDpBbGdvcml0aG1TdWl0ZT4KLQkJCQkJPHNwOkxheW91dD4KLQkJCQkJCTx3c3A6UG9saWN5PgotCQkJCQkJCTxzcDpTdHJpY3QvPgotCQkJCQkJPC93c3A6UG9saWN5PgotCQkJCQk8L3NwOkxheW91dD4KLQkJCQkJPHNwOkluY2x1ZGVUaW1lc3RhbXAvPgotCQkJCQk8c3A6T25seVNpZ25FbnRpcmVIZWFkZXJzQW5kQm9keS8+Ci0JCQkJPC93c3A6UG9saWN5PgotCQkJPC9zcDpBc3ltbWV0cmljQmluZGluZz4KLQkJCTxzcDpXc3MxMCB4bWxuczpzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNy9zZWN1cml0eXBvbGljeSI+Ci0JCQkJPHdzcDpQb2xpY3k+Ci0JCQkJCTxzcDpNdXN0U3VwcG9ydFJlZktleUlkZW50aWZpZXIvPgotCQkJCQk8c3A6TXVzdFN1cHBvcnRSZWZJc3N1ZXJTZXJpYWwvPgotCQkJCTwvd3NwOlBvbGljeT4KLQkJCTwvc3A6V3NzMTA+Ci0JCQk8c3A6U2lnbmVkUGFydHMgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJCTxzcDpCb2R5Lz4KLQkJCTwvc3A6U2lnbmVkUGFydHM+Ci0JCQk8c3A6RW5jcnlwdGVkUGFydHMgeG1sbnM6c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDcvc2VjdXJpdHlwb2xpY3kiPgotCQkJCTxzcDpCb2R5Lz4KLQkJCTwvc3A6RW5jcnlwdGVkUGFydHM+Ci0KLQkJCTxyYW1wOlJhbXBhcnRDb25maWcgeG1sbnM6cmFtcD0iaHR0cDovL3dzLmFwYWNoZS5vcmcvcmFtcGFydC9wb2xpY3kiPiAKLQkJCQk8cmFtcDp1c2VyPmNsaWVudDwvcmFtcDp1c2VyPgotCQkJCTxyYW1wOmVuY3J5cHRpb25Vc2VyPnNlcnZpY2U8L3JhbXA6ZW5jcnlwdGlvblVzZXI+Ci0JCQkJPHJhbXA6cGFzc3dvcmRDYWxsYmFja0NsYXNzPm9yZy5hcGFjaGUucmFtcGFydC5zYW1wbGVzLnBvbGljeS5zYW1wbGUwMy5QV0NCSGFuZGxlcjwvcmFtcDpwYXNzd29yZENhbGxiYWNrQ2xhc3M+Ci0JCQkJCi0JCQkJPHJhbXA6c2lnbmF0dXJlQ3J5cHRvPgotCQkJCQk8cmFtcDpjcnlwdG8gcHJvdmlkZXI9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluIj4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS50eXBlIj5KS1M8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4uZmlsZSI+Y2xpZW50LmprczwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS5wYXNzd29yZCI+YXBhY2hlPC9yYW1wOnByb3BlcnR5PgotCQkJCQk8L3JhbXA6Y3J5cHRvPgotCQkJCTwvcmFtcDpzaWduYXR1cmVDcnlwdG8+Ci0JCQkJPHJhbXA6ZW5jcnlwdGlvbkN5cHRvPgotCQkJCQk8cmFtcDpjcnlwdG8gcHJvdmlkZXI9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY29tcG9uZW50cy5jcnlwdG8uTWVybGluIj4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS50eXBlIj5KS1M8L3JhbXA6cHJvcGVydHk+Ci0JCQkJCQk8cmFtcDpwcm9wZXJ0eSBuYW1lPSJvcmcuYXBhY2hlLndzLnNlY3VyaXR5LmNyeXB0by5tZXJsaW4uZmlsZSI+Y2xpZW50LmprczwvcmFtcDpwcm9wZXJ0eT4KLQkJCQkJCTxyYW1wOnByb3BlcnR5IG5hbWU9Im9yZy5hcGFjaGUud3Muc2VjdXJpdHkuY3J5cHRvLm1lcmxpbi5rZXlzdG9yZS5wYXNzd29yZCI+YXBhY2hlPC9yYW1wOnByb3BlcnR5PgotCQkJCQk8L3JhbXA6Y3J5cHRvPgotCQkJCTwvcmFtcDplbmNyeXB0aW9uQ3lwdG8+Ci0JCQk8L3JhbXA6UmFtcGFydENvbmZpZz4KLQkJCTx3c29tYTpPcHRpbWl6ZWRNaW1lU2VyaWFsaXphdGlvbiB4bWxuczp3c29tYT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kvb3B0aW1pemVkbWltZXNlcmlhbGl6YXRpb24iLz4KLQotCQk8L3dzcDpBbGw+Ci0JPC93c3A6RXhhY3RseU9uZT4KLTwvd3NwOlBvbGljeT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20xMS1vcHRpb25hbC54bWwgYi8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tMTEtb3B0aW9uYWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI1Yjc4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20xMS1vcHRpb25hbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotIAotPHdzcDpQb2xpY3kgd3N1OklkPSJNdG9tMTFPcHRpb25hbCIgeG1sbnM6d3N1PSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIiB4bWxuczp3c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5Ij4KLSAgICA8d3NwOkV4YWN0bHlPbmU+Ci0gICAgICAgIDx3c3A6QWxsPgotICAgICAgICAgICAgPHdzb21hOk1UT00geG1sbnM6d3NvbWE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgvc29hcDEyLW10b20tcG9saWN5IiB3c3A6T3B0aW9uYWw9InRydWUiLz4KLSAgICAgICAgPC93c3A6QWxsPgotICAgIDwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tMTEueG1sIGIvMV81L21vZHVsZXMvbXRvbXBvbGljeS90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbTExLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0ODA3Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tMTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTx3c3A6UG9saWN5IHdzdTpJZD0iTXRvbTExIiB4bWxuczp3c3U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiIHhtbG5zOndzcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNC8wOS9wb2xpY3kiPgotICAgIDx3c3A6RXhhY3RseU9uZT4KLSAgICAgICAgPHdzcDpBbGw+Ci0gICAgICAgICAgICA8d3NvbWE6TVRPTSB4bWxuczp3c29tYT0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC9zb2FwMTItbXRvbS1wb2xpY3kiLz4KLSAgICAgICAgPC93c3A6QWxsPgotICAgIDwvd3NwOkV4YWN0bHlPbmU+Ci08L3dzcDpQb2xpY3k+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9tdG9tcG9saWN5L3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9wb2xpY3kvbW9kZWwvTVRPTUFzc2VydGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA4NzlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL210b21wb2xpY3kvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3BvbGljeS9tb2RlbC9NVE9NQXNzZXJ0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5wb2xpY3kubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Bc3NlcnRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeUVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIE1UT01Bc3NlcnRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3ltbUJpbmRpbmcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQb2xpY3kgcCA9IHRoaXMuZ2V0UG9saWN5KFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzL3BvbGljeS1tdG9tLXNlY3VyaXR5LnhtbCIpOwotICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25zID0gKExpc3QpcC5nZXRBbHRlcm5hdGl2ZXMoKS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNVE9NQXNzZXJ0aW9uRm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXNzZXJ0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb24gYXNzZXJ0aW9uID0gKEFzc2VydGlvbilpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTTEwQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzTVRPTUFzc2VydGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTBBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1JTUUgU2VyaWFsaXphdGlvbiBhc3NlcnRpb24gbm90IHByb2Nlc3NlZCIsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRvbU1vZGVsLmlzT3B0aW9uYWwoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1RoZSBBc3ltbSBiaW5kaW5nIG1lYW4gaXMgbm90IGJ1aWx0IGluIHRoZSBwb2xpY3kgcHJvY2Vzc2luZyA6LSgKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk1UT00xMCBBc3NlcnRpb24gbm90IGZvdW5kLiIsIGlzTVRPTUFzc2VydGlvbkZvdW5kKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NMTBPcHRpb25hbCgpIHsKLSAgICAgICAgLy9UZXN0aW5nIHRoZSB3c3A6T3B0aW9uYWwgYXR0cmlidXRlIGluIFdTLU1UT01Qb2xpY3kgMS4wIGFzc2VydGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUG9saWN5IHAgPSB0aGlzLmdldFBvbGljeShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbS1vcHRpb25hbC54bWwiKTsKLSAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucyA9IChMaXN0KXAuZ2V0QWx0ZXJuYXRpdmVzKCkubmV4dCgpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NlcnRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NMTBBc3NlcnRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTBBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzcDpPcHRpb25hbCBhdHRyaWJ1dGUgaXMgbm90IHByb2Nlc3NlZCIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9tTW9kZWwuaXNPcHRpb25hbCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE1UT00xMUFzc2VydGlvbiAoKSB7Ci0gICAgICAgIC8vIFRlc3RpbmcgdGhlIFdTLU1UT01Qb2xpY3kgMS4xIGFzc2VydGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUG9saWN5IHAgPSB0aGlzLmdldFBvbGljeShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcy9wb2xpY3ktbXRvbTExLnhtbCIpOwotICAgICAgICAgICAgTGlzdCBhc3NlcnRpb25zID0gKExpc3QpcC5nZXRBbHRlcm5hdGl2ZXMoKS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNNVE9NQXNzZXJ0aW9uRm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXNzZXJ0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb24gYXNzZXJ0aW9uID0gKEFzc2VydGlvbilpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYXNzZXJ0aW9uIGluc3RhbmNlb2YgTVRPTTExQXNzZXJ0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzTVRPTUFzc2VydGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTExQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTFBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTVRPTTExIEFzc2VydGlvbiBub3QgZm91bmQuIiwgaXNNVE9NQXNzZXJ0aW9uRm91bmQpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NMTFBc3NlcnRpb25PcHRpb25hbCgpIHsKLSAgICAgIC8vVGVzdGluZyB0aGUgd3NwOk9wdGlvbmFsIGF0dHJpYnV0ZSBpbiBXUy1NVE9NUG9saWN5IDEuMCBhc3NlcnRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBvbGljeSBwID0gdGhpcy5nZXRQb2xpY3koU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGVzdC1yZXNvdXJjZXMvcG9saWN5LW10b20xMS1vcHRpb25hbC54bWwiKTsKLSAgICAgICAgICAgIExpc3QgYXNzZXJ0aW9ucyA9IChMaXN0KXAuZ2V0QWx0ZXJuYXRpdmVzKCkubmV4dCgpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NlcnRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEFzc2VydGlvbiBhc3NlcnRpb24gPSAoQXNzZXJ0aW9uKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChhc3NlcnRpb24gaW5zdGFuY2VvZiBNVE9NMTBBc3NlcnRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTVRPTTEwQXNzZXJ0aW9uIG10b21Nb2RlbCA9IChNVE9NMTBBc3NlcnRpb24pYXNzZXJ0aW9uOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndzcDpPcHRpb25hbCBhdHRyaWJ1dGUgaXMgbm90IHByb2Nlc3NlZCIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdG9tTW9kZWwuaXNPcHRpb25hbCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RNVE9NQXNzZXJ0aW9uSW5oZXJpdGFuY2UoKSB7Ci0gICAgICAgIAotICAgICAgICAvL1Rlc3RpbmcgdGhlIE1UT00xMEFzc2VydGlvbiwgTVRPTTExQXNzZXJ0aW9uIHNob3VsZCBiZSBzdWIgY2xhc3NlcyBvZiBNVE9NQXNzZXJ0aW9uCi0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzU3ViY2xhc3M7Ci0gICAgICAgIAotICAgICAgICBNVE9NMTBBc3NlcnRpb24gbXRvbTEwID0gbmV3IE1UT00xMEFzc2VydGlvbigpOwotICAgICAgICBpc1N1YmNsYXNzID0gbXRvbTEwIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbjsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiTVRPTTEwQXNzZXJ0aW9ucyBpcyBub3Qgc3ViY2xhc3Mgb2YgTVRPTUFzc2VydGlvbiIsdHJ1ZSwgaXNTdWJjbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBNVE9NMTFBc3NlcnRpb24gbXRvbTExID0gbmV3IE1UT00xMUFzc2VydGlvbigpOwotICAgICAgICBpc1N1YmNsYXNzID0gbXRvbTExIGluc3RhbmNlb2YgTVRPTUFzc2VydGlvbjsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygiTVRPTTEwQXNzZXJ0aW9ucyBpcyBub3Qgc3ViY2xhc3Mgb2YgTVRPTUFzc2VydGlvbiIsdHJ1ZSwgaXNTdWJjbGFzcyk7Ci0KLSAgICB9Ci0gICAgCi0KLSAgICBwcml2YXRlIFBvbGljeSBnZXRQb2xpY3koU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoZmlsZVBhdGgpOwotICAgICAgICBPTUVsZW1lbnQgZWxlbSA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBQb2xpY3lFbmdpbmUuZ2V0UG9saWN5KGVsZW0pOwotICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL29zZ2kvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL29zZ2kvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNTAxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmF4aXMyLm9zZ2k8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5idW5kbGU8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBPU0dpIEludGVncmF0aW9uPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5BcGFjaGUgQXhpczIgT1NHaSBJbnRlZ3JhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvb3NnaTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL29zZ2k8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL29zZ2k8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1WZXJzaW9uPjEuMC4wLiR7cG9tLnZlcnNpb259PC9CdW5kbGUtVmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT4ke3BvbS5hcnRpZmFjdElkfTwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVZlbmRvcj5BcGFjaGUgQXhpczIsIDIwMDg8L0J1bmRsZS1WZW5kb3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLURlc2NyaXB0aW9uPiR7cG9tLmRlc2NyaXB0aW9ufTwvQnVuZGxlLURlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+JHtwb20uYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9yZy5hcGFjaGUuYXhpczIub3NnaS5pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuKjsgdmVyc2lvbj0xLjAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLio7LXNwbGl0LXBhY2thZ2U6PW1lcmdlLWxhc3Q7IHZlcnNpb249MS41LAotICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhamF2YXgueG1sLm5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhb3JnLmFwYWNoZS5heGlzMi4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5uYW1lc3BhY2U7IHZlcnNpb249MC4wLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0Lmh0dHA7IHZlcnNpb249Mi40LjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgudHJhbnNhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5vc2dpLmZyYW1ld29yazsgdmVyc2lvbj0xLjMuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcub3NnaS5zZXJ2aWNlLmh0dHA7IHZlcnNpb249MS4yLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9zZ2kudXRpbC50cmFja2VyOyB2ZXJzaW9uPTEuMy4xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5vc2dpLnNlcnZpY2UubG9nOyB2ZXJzaW9uPTEuMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcub3NnaS5zZXJ2aWNlLmNtOyB2ZXJzaW9uPTEuMi4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5pYm0ud3NkbC51dGlsLnhtbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5hY3RpdmF0aW9uO3ZlcnNpb249IjEuMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzO3ZlcnNpb249IjIuMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguam1zO3ZlcnNpb249IjEuMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgubWFpbDt2ZXJzaW9uPSIxLjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lm1hbmFnZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgubWFpbC5pbnRlcm5ldDt2ZXJzaW9uPSIxLjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lm1haWwudXRpbDt2ZXJzaW9uPSIxLjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4Lm5hbWluZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5ybWk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmV4dGVuc2lvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC54bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbTtyZXNvbHV0aW9uOj1vcHRpb25hbDt2ZXJzaW9uPSIxLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm07cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5kb207cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW07cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLmVudGl0eTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHAuaW1wbDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLmltcGwuaW87cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLmlvO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC5wYXJhbXM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuaHR0cC51dGlsO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubmVldGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud29kZW4uKjt2ZXJzaW9uPSIwLjAuMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tO3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy54bWwuc2F4O3Jlc29sdXRpb246PW9wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgPC9JbXBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxQcml2YXRlLVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgPC9Qcml2YXRlLVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUFjdGl2YXRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuaW50ZXJuYWwuQWN0aXZhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICA8L0J1bmRsZS1BY3RpdmF0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVNlcnZpY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L0V4cG9ydC1TZXJ2aWNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyU0UtMS41Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50PgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5vc2dpLmNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXRyYW5zcG9ydC1odHRwPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLm9zZ2kuY29tcGVuZGl1bTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLm9zZ2kuZm91bmRhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL29zZ2kvcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L2F4aXMyLnhtbCBiLzFfNS9tb2R1bGVzL29zZ2kvcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmNDdkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3Jlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90dXBkYXRlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPg0KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJhdHRhY2htZW50RElSIj48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIHJlZHVjdGlvbiBvZiB0aGUgaW4tbWVtb3J5IGNhY2hlIG9mIFdTREwgZGVmaW5pdGlvbnMgLS0+DQotICAgIDwhLS1JbiBzb21lIHNlcnZlciBlbnZpcm9ubWVudHMsIHRoZSBhdmFpbGFibGUgbWVtb3J5IGhlYXAgaXMgbGltaXRlZCBhbmQgY2FuIGZpbGwgdXAgdW5kZXIgbG9hZCAtLT4NCi0gICAgPCEtLVNpbmNlIGluLW1lbW9yeSBjb3BpZXMgb2YgV1NETCBkZWZpbml0aW9ucyBjYW4gYmUgbGFyZ2UsIHNvbWUgc3RlcHMgY2FuIGJlIHRha2VuLS0+DQotICAgIDwhLS10byByZWR1Y2UgdGhlIG1lbW9yeSBuZWVkZWQgZm9yIHRoZSBjYWNoZWQgV1NETCBkZWZpbml0aW9ucy4gLS0+DQotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0icmVkdWNlV1NETE1lbW9yeUNhY2hlIj50cnVlPC9wYXJhbWV0ZXItLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gbWlsbGlzZWNvbmRzLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzAwMDA8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFjayB0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPg0KLSAgICA8IS0tdGhhdCBiZWhhdmlvci4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24tLT4NCi0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+DQotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4NCi0gICAgPCEtLWlzIHNldCwgdGhlbiBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+DQotICAgIDwhLS1TZXJ2aWNlc0RpcmVjdG9yeSBvbmx5IHdvcmtzIG9uIHRoZSBmb2xsb3dpbmcgY2FzZXMtLT4NCi0gICAgPCEtLS1GaWxlIGJhc2VkIGNvbmZpZ3VyYXRvciBhbmQgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBmaWxlIFVSTCAoaHR0cDovLyBub3QgYWxsb3dlZCktLT4NCi0gICAgPCEtLS1XaGVuIGNyZWF0aW5nIFVSTCBCYXNlZCBjb25maWd1cmF0b3Igd2l0aCBVUkwg4oCcZmlsZTovL+KAnSAgLS0+DQotICAgIDwhLS0tIFdhciBiYXNlZCBjb25maWd1cmF0b3Igd2l0aCBleHBhbmRlZCBjYXNlICwgLS0+DQotDQotICAgIDwhLS1BbGwgdGhlIG90aGVyIHNjZW5hcmlvcyBpdCB3aWxsIGJlIGlnbm9yZWQuLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPg0KLQ0KLQ0KLQ0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4NCi0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXVzaCB0aG9zZSBlbmRwb2ludHMtLT4NCi0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPg0KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlcnZpY2VQYXRoIj5zZXJ2aWNlczwvcGFyYW1ldGVyPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBjb21wbGV0ZWx5IGRpc2FibGUgUkVTVCBoYW5kbGluZyBpbiBBeGlzMi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIA0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzdXBwcmVzcyBnZW5lcmF0aW9uIG9mIFNPQVAgMS4yIGJpbmRpbmdzIGluIGF1dG8tZ2VuZXJhdGVkIFdTREwgZmlsZXMgLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNPQVAxMiIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tUE9KTyBkZXBsb3llciAsIHRoaXMgd2lsbCBhbG93IHVzZXJzIHRvIGRyb3AgLmNsYXNzIGZpbGUgYW5kIG1ha2UgdGhhdCBpbnRvIGEgc2VydmljZS0tPg0KLSAgICA8IS0tPGRlcGxveWVyIGV4dGVuc2lvbj0iLmNsYXNzIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuUE9KT0RlcGxveWVyIi8+LS0+DQotICAgIDwhLS08ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuanNhIiBkaXJlY3Rvcnk9InJtaXNlcnZpY2VzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LlJNSVNlcnZpY2VEZXBsb3llciIvPi0tPg0KLSAgICANCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiIGxvY2tlZD0idHJ1ZSI+bXlob3N0LmNvbTwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnQgZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+DQotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+DQotDQotDQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPg0KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPg0KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBkZWFmdWx0IE1lc3NhZ2VSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+DQotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4NCi0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+DQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJyaWRlIHRoaXMgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICAgPG1lc3NhZ2VSZWNlaXZlcnM+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnL25zL3dzZGwvcm9idXN0LWluLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvbnMvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5YRm9ybVVSTEVuY29kZWRGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5NdWx0aXBhcnRGb3JtRGF0YUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9zb2FwK3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4NCi0gICAgPC9tZXNzYWdlRm9ybWF0dGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgQnVpbGRlcnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4NCi0gICAgPCEtLWZvcm1hdHMgaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlQnVpbGRlcnM+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5BcHBsaWNhdGlvblhNTEJ1aWxkZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuWEZvcm1VUkxFbmNvZGVkQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLk11bHRpcGFydEZvcm1EYXRhQnVpbGRlciIvPg0KLSAgICA8L21lc3NhZ2VCdWlsZGVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLTx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjgwODA8L3BhcmFtZXRlcj4tLT4NCi0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6DQotICAgICAgICAgICAgcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0IDYwNjApDQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQ0KLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikNCi0gICAgICAgICAgICByZXF1ZXN0VGltZW91dDogIHZhbHVlIGluIG1pbGxpcyBvZiB0aW1lIHRoYXQgcmVxdWVzdHMgY2FuIHdhaXQgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDIwMDAwKQ0KLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMNCi0gICAgICAgICAgICByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgKHVubGVzcyBxdWV1ZSBmaWxscyB1cCkgIChkZWZhdWx0IDI1KQ0KLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVwICAgICAgICAgKGRlZmF1bHQgMTUwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5DQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZTogIHRpbWUgdG8ga2VlcCB0aHJlYWRzIGluIGV4Y2VzcyBvZiBjb3JlIHNpemUgYWxpdmUgd2hpbGUgaW5hY3RpdmUgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxODApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQ0KLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykNCi0gICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj5odHRwOi8vd3d3Lm15QXBwLmNvbS93czwvcGFyYW1ldGVyPiAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUaW1lb3V0Ij4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGNwTm9EZWxheSI+ZmFsc2U8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIj4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lIj4yNDAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCI+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+DQotICAgIDwhLS08L3RyYW5zcG9ydFJlY2VpdmVyPi0tPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+DQotICAgIDwhLS10cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiDQotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlci0tPj4NCi0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4NCi0gICAgICAgIDwhLS11bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBwYXJhbXRlciAsIGFuZCBzZXQgaXQgYXMgeW91IHJlcXVpcmVkLi0tPg0KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tIC90cmFuc3BvcnRSZWNlaXZlciAtLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4NCi0gICAgPCEtLQ0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFRyYW5zcG9ydFNlbmRlciIvPg0KLSAgICAtLT4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+DQotDQotICAgICAgICA8IS0tIElmIGZvbGxvd2luZyBpcyBzZXQgdG8gJ3RydWUnLCBvcHRpb25hbCBhY3Rpb24gcGFydCBvZiB0aGUgQ29udGVudC1UeXBlIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBTT0FQIDEuMiBtZXNzYWdlcyAtLT4NCi0gICAgICAgIDwhLS0gIDxwYXJhbWV0ZXIgbmFtZT0iT21pdFNPQVAxMkFjdGlvbiI+dHJ1ZTwvcGFyYW1ldGVyPiAgLS0+DQotICAgIDwvdHJhbnNwb3J0U2VuZGVyPg0KLQ0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+DQotICAgIDwvdHJhbnNwb3J0U2VuZGVyPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4NCi0gICAgPCEtLSA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAtLT4NCi0NCi0gICAgPCEtLUNvbmZpZ3VyaW5nIG1vZHVsZSAsIHByb3ZpZGluZyBwYXJhbWV0ZXJzIGZvciBtb2R1bGVzIHdoZXRoZXIgdGhleSByZWZlciBvciBub3QtLT4NCi0gICAgPCEtLTxtb2R1bGVDb25maWcgbmFtZT0iYWRkcmVzc2luZyI+LS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTwvbW9kdWxlQ29uZmlnPi0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ2x1c3RlcmluZyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBDb25maWd1cmUgYW5kIHVuY29tbWVudCBmb2xsb3dpbmcgZm9yIHByZXBhcmluZyBBeGlzMiB0byBhIGNsdXN0ZXJlZCBlbnZpcm9ubWVudCAtLT4NCi0gICAgPCEtLQ0KLSAgICA8Y2x1c3RlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLnRyaWJlcy5UcmliZXNDbHVzdGVyTWFuYWdlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBhcmFtMSI+dmFsdWUxPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImRvbWFpbiI+YXBhY2hlLmF4aXMyLmRvbWFpbjwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJzeW5jaHJvbml6ZUFsbCI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJtYXhSZXRyaWVzIj4xMDwvcGFyYW1ldGVyPg0KLSAgICAJPGNvbmZpZ3VyYXRpb25NYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5UcmliZXNDb25maWd1cmF0aW9uTWFuYWdlciI+DQotICAgIAkgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29uZmlndXJhdGlvbi5EZWZhdWx0Q29uZmlndXJhdGlvbk1hbmFnZXJMaXN0ZW5lciIvPg0KLSAgICAJPC9jb25maWd1cmF0aW9uTWFuYWdlcj4NCi0gICAgCTxjb250ZXh0TWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbnRleHQuVHJpYmVzQ29udGV4dE1hbmFnZXIiPg0KLSAgICAJICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbnRleHQuRGVmYXVsdENvbnRleHRNYW5hZ2VyTGlzdGVuZXIiLz4NCi0gICAgCTwvY29udGV4dE1hbmFnZXI+DQotICAgIDwvY2x1c3Rlcj4NCi0gICAgLS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQaGFzZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+DQotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwvaGFuZGxlcj4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+DQotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluRmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL29zZ2kvdXRpbC9Mb2dnZXIuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9vc2dpL3V0aWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGNkMjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL29zZ2kvdXRpbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLm9zZ2kudXRpbDsNCi0NCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7DQotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7DQotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsNCi0NCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIGV4dGVuZHMgU2VydmljZVRyYWNrZXIgew0KLSAgICBwdWJsaWMgTG9nZ2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCl7DQotICAgICAgICBzdXBlcihjb250ZXh0LCBMb2dTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7DQotICAgICAgICBvcGVuKCk7DQotICAgIH0NCi0gICAgDQotICAgIHB1YmxpYyBMb2dTZXJ2aWNlIGdldExvZ1NlcnZpY2UoKXsNCi0gICAgICAgIHJldHVybiAoTG9nU2VydmljZSl0aGlzLmdldFNlcnZpY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coaW50IGksIGphdmEubGFuZy5TdHJpbmcgcykgew0KLSAgICAgICAgTG9nU2VydmljZSBzZXJ2aWNlID0gZ2V0TG9nU2VydmljZSgpOw0KLSAgICAgICAgaWYoc2VydmljZSAhPSBudWxsKXsNCi0gICAgICAgICAgICBzZXJ2aWNlLmxvZyhpLCBzKTsNCi0gICAgICAgICAgICAvL3JldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHByaW50KGksIHMpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwcmludChpbnQgaSwgU3RyaW5nIHMpIHsNCi0gICAgICAgIHN3aXRjaChpKXsNCi0gICAgICAgICAgICAgICAgY2FzZSBMb2dTZXJ2aWNlLkxPR19FUlJPUjogDQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIltFUlJPUl0gICAiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBMb2dTZXJ2aWNlLkxPR19JTkZPOiANCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiW0lORk9dICAgICIpOw0KLSAgICAgICAgICAgICAgICBicmVhazsNCi0gICAgICAgICAgICBjYXNlIExvZ1NlcnZpY2UuTE9HX1dBUk5JTkc6IA0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJbV0FSTklOR10iKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgY2FzZSBMb2dTZXJ2aWNlLkxPR19ERUJVRzogDQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIltERUJVR10gICAiKTsNCi0gICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICB9DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiA6ICIgKyBzKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBsb2coaW50IGksIGphdmEubGFuZy5TdHJpbmcgcywgamF2YS5sYW5nLlRocm93YWJsZSB0aHJvd2FibGUpIHsNCi0gICAgICAgIExvZ1NlcnZpY2Ugc2VydmljZSA9IGdldExvZ1NlcnZpY2UoKTsNCi0gICAgICAgIGlmKHNlcnZpY2UgIT0gbnVsbCl7DQotICAgICAgICAgICAgc2VydmljZS5sb2coaSwgcywgdGhyb3dhYmxlKTsNCi0gICAgICAgICAgICAvL3JldHVybjsNCi0gICAgICAgIH0NCi0gICAgICAgIHByaW50KGksIHMpOw0KLSAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvT1NHaUF4aXNTZXJ2bGV0LmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvT1NHaUF4aXNTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWNhNGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL09TR2lBeGlzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2k7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5MaXN0aW5nQWdlbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBzZXJ2bGV0IGlzIHVzZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gb2YgSHR0cFNlcnZpY2UuCi0gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhbGwgcmVxdWVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPU0dpQXhpc1NlcnZsZXQgZXh0ZW5kcyBBeGlzU2VydmxldCB7Ci0KLSAgICBwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotICAgIC8qKgotICAgICAqIE9TR2lBeGlzU2VydmxldCBuZWVkcyBhbiByZWZlcmVuYyB0byBPU0dpIGVudmlyb25tZW50YgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgQnVuZGxlQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBPU0dpQXhpc1NlcnZsZXQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZsZXRDb25maWcgPSBzZXJ2bGV0Q29uZmlnOwotICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKENvbmZpZ3VyYXRpb25Db250ZXh0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJBbiBpbnN0YW5jZSBvZiBDb25maWd1cmF0aW9uQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIHRvIGNvbnRpbnVlIHRoZSBwcm9jY2Vzcy4iKTsKLSAgICAgICAgfQotICAgICAgICBjb25maWdDb250ZXh0ID0gKENvbmZpZ3VyYXRpb25Db250ZXh0KSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLSAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIGFnZW50ID0gbmV3IExpc3RpbmdBZ2VudChjb25maWdDb250ZXh0KTsKLSAgICAgICAgaW5pdFBhcmFtcygpOwotICAgICAgICBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCA9IHNlcnZsZXRDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgaWYgKHNlcnZsZXRDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZsZXRDb250ZXh0LnNldEF0dHJpYnV0ZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvU09BUFByb3ZpZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS9TT0FQUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZjJjNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS9TT0FQUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmNvcmUud2ViLldlYkFwcDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNPQVBQcm92aWRlciBpcyBhbiBpbnRlcmZhY2UgZm9yIGdlbmVyaWMgU09BUCBmdW5jdGlvbmFsaXR5LgotICogVXNlIHRoaXMgaW50ZXJmYWNlIHRvIHJlZ2lzdGVyIFNPQVBQcm92aWRlciBzZXJ2aWNlcyB3aXRoIHRoZSBPU0dpCi0gKiBydW50aW1lIHVzaW5nIHRoZSA8Y29kZT5CdW5kbGVDb250ZXh0LnJlZ2lzdGVyU2VydmljZSgpPC9jb2RlPiBtZXRob2RzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgU09BUFByb3ZpZGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBTT0FQUHJvdmlkZXIgaW1wbGVtZW50YXRpb24uIFVzZSB0aGlzIGFzIHRoZSBrZXkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgICAgKiB0aGUgc2VydmljZSdzIHByb3BlcnRpZXMgZm9yIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBPU0dpIHJ1bnRpbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfTkFNRSA9ICJOYW1lIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBTT0FQUHJvdmlkZXIgaW1wbGVtZW50YXRpb24uIFVzZSB0aGlzIGFzIHRoZSBrZXkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgICAgKiB0aGUgc2VydmljZSdzIHByb3BlcnRpZXMgZm9yIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSBPU0dpIHJ1bnRpbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfTUFKT1JfVkVSU0lPTiA9ICJNYWpvclZlcnNpb24iOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1pbm9yIHZlcnNpb24gb2YgdGhlIFNPQVBQcm92aWRlciBpbXBsZW1lbnRhdGlvbi4gVXNlIHRoaXMgYXMgdGhlIGtleSB3aGVuIGNvbnN0cnVjdGluZwotICAgICAqIHRoZSBzZXJ2aWNlJ3MgcHJvcGVydGllcyBmb3IgcmVnaXN0cmF0aW9uIHdpdGggdGhlIE9TR2kgcnVudGltZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9NSU5PUl9WRVJTSU9OID0gIk1pbm9yVmVyc2lvbiI7Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24ncyBwcm92aWRlciBuYW1lLiBUaGlzIG5hbWUgc2hvdWxkIGJlIHRoZSBzYW1lCi0gICAgICogYXMgdGhlIG9uZSB1c2VkIGR1cmluZyB0aGUgcmVnaXN0cmF0aW9uIG9mIHRoZSBTT0FQUHJvdmlkZXIgc2VydmljZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgUHJvdmlkZXIgTmFtZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24ncyB2ZXJzaW9uLiBUaGlzIG5hbWUgc2hvdWxkIGJlIGNvbnN0cnVjdGVkCi0gICAgICogZnJvbSB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb25zIHVzZWQgZHVyaW5nIHJlZ2lzdHJhdGlvbiBvZiB0aGUgU09BUFByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBQcm92aWRlciBWZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlclZlcnNpb24oKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvdmlkZXJFbmdpbmUoKTsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvdmlkZXJEZXBsb3llcigpOwotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm92aWRlckRlcGxveWVyKFdlYkFwcCB3ZWJBcHApOwotCi0gICAgLyoqCi0gICAgICogRGVwbG95cyBhbiBPYmplY3QgYXMgYSBXZWJTZXJ2aWNlIHVzaW5nIHRoZSBpbXBsZW1lbnRhdGlvbidzIGRlZmF1bHQgYmluZGluZyB0eXBlLgotICAgICAqIFRoZSBzZXJ2aWNlIGlzIGRlcGxveWVkIGludG8gdGhlIHByb3ZpZGVyJ3MgZGVmYXVsdCBhcHBsaWNhdGlvbiBjb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNydk5hbWUgICB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzZXJ2aWNlCi0gICAgICogQHBhcmFtIHNydkNsYXNzICB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGV4cG9zZWQuIFNwZWNpZnlpbmcgYW4gaW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICAgICAgICBhbGxvd3Mgb25seSB0aGUgZGVzaXJlZCBtZXRob2RzIG9mIHRoZSBzZXJ2aWNlIG9iamVjdCB0byBiZSBwdWJsaXNoZWQuCi0gICAgICogQHBhcmFtIHNydk9iamVjdCB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lTZXJ2aWNlKFN0cmluZyBzcnZOYW1lLCBDbGFzcyBzcnZDbGFzcywgT2JqZWN0IHNydk9iamVjdCwgU3RyaW5nIGhhbmRsZXJDaGFpbikgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlcGxveXMgYW4gT2JqZWN0IGFzIGEgV2ViU2VydmljZSB1c2luZyBhIHNwZWNpZmllZCBiaW5kaW5nIHR5cGUKLSAgICAgKiBUaGUgc2VydmljZSBpcyBkZXBsb3llZCBpbnRvIHRoZSBwcm92aWRlcidzIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcnZOYW1lICAgICB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzZXJ2aWNlCi0gICAgICogQHBhcmFtIGJpbmRpbmdUeXBlIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGJpbmRpbmcgdHlwZQotICAgICAqIEBwYXJhbSBzcnZDbGFzcyAgICB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgc2hvdWxkIGJlIGV4cG9zZWQuIFNwZWNpZnlpbmcgYW4gaW50ZXJmYWNlCi0gICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93cyBvbmx5IHRoZSBkZXNpcmVkIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugb2JqZWN0IHRvIGJlIHB1Ymxpc2hlZC4KLSAgICAgKiBAcGFyYW0gc3J2T2JqZWN0ICAgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGVwbG95U2VydmljZShTdHJpbmcgc3J2TmFtZSwgU3RyaW5nIGJpbmRpbmdUeXBlLCBDbGFzcyBzcnZDbGFzcywgT2JqZWN0IHNydk9iamVjdCwgU3RyaW5nIGhhbmRsZXJDaGFpbikgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIERlcGxveXMgYW4gT2JqZWN0IGFzIGEgV2ViU2VydmljZSB1c2luZyB0aGUgcHJvdmlkZXIncyBkZWZhdWx0IGJpbmRpbmcgdHlwZS4KLSAgICAgKiBUaGUgc2VydmljZSBpcyBkZXBsb3llZCBpbnRvIHRoZSBzcGVjaWZpZWQgPGNvZGU+V2ViQXBwPC9jb2RlPiBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gd2ViQXBwICAgIHRoZSB0YXJnZXQgd2ViIGFwcGxpY2F0aW9uIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gc3J2TmFtZSAgIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKiBAcGFyYW0gc3J2Q2xhc3MgIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZXhwb3NlZC4gU3BlY2lmeWluZyBhbiBpbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgIGFsbG93cyBvbmx5IHRoZSBkZXNpcmVkIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugb2JqZWN0IHRvIGJlIHB1Ymxpc2hlZC4KLSAgICAgKiBAcGFyYW0gc3J2T2JqZWN0IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlcGxveVNlcnZpY2UoV2ViQXBwIHdlYkFwcCwgU3RyaW5nIHNydk5hbWUsIENsYXNzIHNydkNsYXNzLCBPYmplY3Qgc3J2T2JqZWN0LCBTdHJpbmcgaGFuZGxlckNoYWluKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogRGVwbG95cyBhbiBPYmplY3QgYXMgYSBXZWJTZXJ2aWNlIHVzaW5nIGEgc3BlY2lmaWVkIGJpbmRpbmcgdHlwZQotICAgICAqIFRoZSBzZXJ2aWNlIGlzIGRlcGxveWVkIGludG8gdGhlIHNwZWNpZmllZCA8Y29kZT5XZWJBcHA8L2NvZGU+IGNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSB3ZWJBcHAgICAgICB0aGUgdGFyZ2V0IHdlYiBhcHBsaWNhdGlvbiBjb250ZXh0Ci0gICAgICogQHBhcmFtIHNydk5hbWUgICAgIHRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKiBAcGFyYW0gYmluZGluZ1R5cGUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgYmluZGluZyB0eXBlCi0gICAgICogQHBhcmFtIHNydkNsYXNzICAgIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgZXhwb3NlZC4gU3BlY2lmeWluZyBhbiBpbnRlcmZhY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgYWxsb3dzIG9ubHkgdGhlIGRlc2lyZWQgbWV0aG9kcyBvZiB0aGUgc2VydmljZSBvYmplY3QgdG8gYmUgcHVibGlzaGVkLgotICAgICAqIEBwYXJhbSBzcnZPYmplY3QgICB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lTZXJ2aWNlKFdlYkFwcCB3ZWJBcHAsIFN0cmluZyBzcnZOYW1lLCBTdHJpbmcgYmluZGluZ1R5cGUsIENsYXNzIHNydkNsYXNzLCBPYmplY3Qgc3J2T2JqZWN0LCBTdHJpbmcgaGFuZGxlckNoYWluKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHZvaWQgdW5kZXBsb3lTZXJ2aWNlKFN0cmluZyBzcnZOYW1lLCBDbGFzcyBzcnZDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHVuZGVwbG95U2VydmljZShXZWJBcHAgd2ViQXBwLCBTdHJpbmcgc3J2TmFtZSwgQ2xhc3Mgc3J2Q2xhc3MpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgd2ViIGFwcGxpY2F0aW9uIGZyb20gdGhlIHByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gY29udGV4dCBwYXRoLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHRQYXRoIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGRlc2lyZWQgV2ViQXBwCi0gICAgICogQHBhcmFtIGNyZWF0ZSAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgdGhlIFdlYkFwcCBpZiBpdCBkb2VzIG5vdCBleGl0cy4KLSAgICAgKiBAcmV0dXJuIHJldHVybiB0aGUgV2ViQXBwCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViQXBwIGdldFdlYkFwcChTdHJpbmcgY29udGV4dFBhdGgsIGJvb2xlYW4gY3JlYXRlKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHdlYiBhcHBsaWNhdGlvbiBmcm9tIHRoZSBwcm92aWRlciBmb3IgdGhlIGdpdmVuIGNvbnRleHQgcGF0aCwgdXNpbmcKLSAgICAgKiB0aGUgcHJvdmlkZWQgYnVuZGxlIGFzIHRoZSBsb2NhdGlvbiBmb3IgdGhlIGVuZ2luZSdzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCB0aGUgY29udGV4dCBwYXRoIG9mIHRoZSBkZXNpcmVkIFdlYkFwcAotICAgICAqIEBwYXJhbSBjcmVhdGUgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY3JlYXRlIHRoZSBXZWJBcHAgaWYgaXQgZG9lcyBub3QgZXhpdHMuCi0gICAgICogQHJldHVybiByZXR1cm4gdGhlIFdlYkFwcAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0JcHVibGljIFdlYkFwcCBnZXRXZWJBcHAoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNvbnRleHRQYXRoLCBib29sZWFuIGNyZWF0ZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1NlcnZsZXREZXNjcmlwdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvU2VydmxldERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZGMwNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvU2VydmxldERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmNvcmUud2ViOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICoKLSAqIFNlcnZsZXREZXNjcmlwdG9yIGEgdXRpbGl0eSBjbGFzcyBmb3IgZGVzY3JpYmluZyBTZXJ2bGV0cyB0byBiZSBkZXBsb3llZCBpbnRvIGEgV2ViQXBwCi0gKi8KLQotcHVibGljIGNsYXNzIFNlcnZsZXREZXNjcmlwdG9yIHsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGluaXRQYXJhbWV0ZXJzOwotCi0JcHJvdGVjdGVkIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1YkNvbnRleHQ7Ci0KLQlwdWJsaWMgU2VydmxldERlc2NyaXB0b3IoU3RyaW5nIHN1YkNvbnRleHQsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKLQkJdGhpcy5zdWJDb250ZXh0ID0gc3ViQ29udGV4dDsKLQkJdGhpcy5zZXJ2bGV0ID0gc2VydmxldDsKLQl9Ci0KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEluaXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gaW5pdFBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdFBhcmFtZXRlcnMoSGFzaHRhYmxlIGluaXRQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMuaW5pdFBhcmFtZXRlcnMgPSBpbml0UGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFNlcnZsZXQgZ2V0U2VydmxldCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZsZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmxldChIdHRwU2VydmxldCBzZXJ2bGV0KSB7Ci0gICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdWJDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gc3ViQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJDb250ZXh0KFN0cmluZyBzdWJDb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuc3ViQ29udGV4dCA9IHN1YkNvbnRleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1dlYkFwcC5qYXZhIGIvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1dlYkFwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NhNDI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9jb3JlL3dlYi9XZWJBcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5jb3JlLndlYjsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5IdHRwU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqCi0gKiBXZWJBcHAgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBkZXNjcmliaW5nIGEgV2ViQXBwbGljYXRpb24gdG8gYmUgZGVwbG95ZWQgaW50byBhbiBPU0dpCi0gKiBIVFRQIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uIFRoZSBXZWJBcHAgaW1wbGVtZW50YXRpb24gZXh0ZW5kcyB0aGUgT1NHaSA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHAgaW1wbGVtZW50cyBIdHRwQ29udGV4dCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBXZWJBcHBEZXNjcmlwdG9yIHdlYkFwcERlc2NyaXB0b3IgPSBudWxsOwotCi0JcHJvdGVjdGVkIEh0dHBTZXJ2aWNlIGh0dHBTZXJ2aWNlOwotCi0JcHJvdGVjdGVkIFNlcnZpY2VSZWZlcmVuY2Ugc1JlZjsKLQotCXB1YmxpYyBXZWJBcHAoV2ViQXBwRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXdlYkFwcERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCX0KLQotCS8vIFJldHVybiBudWxsIGFuZCBsZXQgdGhlIEhUVFAgZGV0ZXJtaW5lIHRoZSB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgcmVxRW50cnkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gR2V0IHRoZSByZXNvdXJjZSBmcm9tIHRoZSBqYXIgZmlsZSwgdXNlIHRoZSBjbGFzcyBsb2FkZXIgdG8gZG8gaXQKLQlwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKG5hbWUpOwotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlU2VjdXJpdHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0JCQlIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgV2ViQXBwCi0JICogQHBhcmFtIGJjIHRoZSBCdW5kbGVDb250ZXh0IG9mIHRoZSBXZWJBcHAgaG9zdAotCSAqIEB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBiYykgdGhyb3dzIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCWlmICgoc1JlZiA9IGJjLmdldFNlcnZpY2VSZWZlcmVuY2UoIm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5IdHRwU2VydmljZSIpKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBIdHRwU2VydmljZVJlZmVyZW5jZSIpOwotCQlpZiAoKGh0dHBTZXJ2aWNlID0gKEh0dHBTZXJ2aWNlKSBiYy5nZXRTZXJ2aWNlKHNSZWYpKSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBIdHRwU2VydmljZSIpOwotCQl0cnkgewotCQkJV2ViQXBwRGVzY3JpcHRvciB3YWQgPSB3ZWJBcHBEZXNjcmlwdG9yOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdhZC5zZXJ2bGV0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU2VydmxldERlc2NyaXB0b3Igc2VydmxldCA9IHdhZC5zZXJ2bGV0W2ldOwotCi0JCQkJaHR0cFNlcnZpY2UucmVnaXN0ZXJTZXJ2bGV0KHdhZC5jb250ZXh0ICsgc2VydmxldC5zdWJDb250ZXh0LAotCQkJCQkJc2VydmxldC5zZXJ2bGV0LCBzZXJ2bGV0LmluaXRQYXJhbWV0ZXJzLCB0aGlzKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aHJvdyBuZXcgQnVuZGxlRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVnaXN0ZXIgc2VydmxldHMiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSBXZWJBcHAKLQkgKiBAcGFyYW0gYmMgdGhlIEJ1bmRsZUNvbnRleHQgb2YgdGhlIFdlYkFwcCBob3N0Ci0JICogQHRocm93cyBCdW5kbGVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYmMpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWJBcHBEZXNjcmlwdG9yLnNlcnZsZXQubGVuZ3RoOyBpKyspIHsKLQkJCQlTZXJ2bGV0RGVzY3JpcHRvciBzZXJ2bGV0ID0gd2ViQXBwRGVzY3JpcHRvci5zZXJ2bGV0W2ldOwotCi0JCQkJaHR0cFNlcnZpY2UudW5yZWdpc3Rlcih3ZWJBcHBEZXNjcmlwdG9yLmNvbnRleHQKLQkJCQkJCSsgc2VydmxldC5zdWJDb250ZXh0KTsKLQkJCX0KLQkJCWJjLnVuZ2V0U2VydmljZShzUmVmKTsKLQkJCWh0dHBTZXJ2aWNlID0gbnVsbDsKLQkJCXdlYkFwcERlc2NyaXB0b3IgPSBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJ1bmRsZUV4Y2VwdGlvbigiRmFpbGVkIHRvIHVucmVnaXN0ZXIgcmVzb3VyY2VzIiwgZSk7Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFdlYkFwcERlc2NyaXB0b3IgZ2V0V2ViQXBwRGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIHdlYkFwcERlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFdlYkFwcERlc2NyaXB0b3IoV2ViQXBwRGVzY3JpcHRvciB3ZWJBcHBEZXNjcmlwdG9yKSB7Ci0gICAgICAgIFdlYkFwcC53ZWJBcHBEZXNjcmlwdG9yID0gd2ViQXBwRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFNlcnZpY2UgZ2V0SHR0cFNlcnZpY2UoKSB7Ci0gICAgICAgIHJldHVybiBodHRwU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIdHRwU2VydmljZShIdHRwU2VydmljZSBodHRwU2VydmljZSkgewotICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlID0gaHR0cFNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VSZWZlcmVuY2UgZ2V0U1JlZigpIHsKLSAgICAgICAgcmV0dXJuIHNSZWY7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U1JlZihTZXJ2aWNlUmVmZXJlbmNlIHNSZWYpIHsKLSAgICAgICAgdGhpcy5zUmVmID0gc1JlZjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvV2ViQXBwRGVzY3JpcHRvci5qYXZhIGIvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2NvcmUvd2ViL1dlYkFwcERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNTYxNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvY29yZS93ZWIvV2ViQXBwRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuY29yZS53ZWI7Ci0KLS8qKgotICoKLSAqIFdlYkFwcERlc2NyaXB0b3IgaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBjb250YWluaW5nIHRoZSBzdGF0aWMgaW5mb3JtYXRpb24KLSAqIHJlcXVpcmVkIGJ5IHRoZSBXZWJBcHAgY2xhc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgV2ViQXBwRGVzY3JpcHRvciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0OwotCi0JcHJvdGVjdGVkIFNlcnZsZXREZXNjcmlwdG9yW10gc2VydmxldDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBTZXJ2bGV0RGVzY3JpcHRvcltdIGdldFNlcnZsZXQoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2bGV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZsZXQoU2VydmxldERlc2NyaXB0b3JbXSBzZXJ2bGV0KSB7Ci0gICAgICAgIHRoaXMuc2VydmxldCA9IHNlcnZsZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvQWJzdHJhY3RSZWdpc3RyeS5qYXZhIGIvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvQWJzdHJhY3RSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTRhMmZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L0Fic3RyYWN0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi0vKioKLSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuUmVnaXN0cnkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVnaXN0cnk8Vj4gaW1wbGVtZW50cyBSZWdpc3RyeSB7Ci0KLSAgICBwcm90ZWN0ZWQgTWFwPEJ1bmRsZSwgTGlzdDxWPj4gcmVzb2x2ZWRCdW5kbGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEJ1bmRsZSwgTGlzdDxWPj4oKTsKLQotICAgIHByb3RlY3RlZCBMaXN0PEJ1bmRsZT4gdW5yZXNsb3ZlZEJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHJvdGVjdGVkIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotICAgIHByb3RlY3RlZCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RSZWdpc3RyeShCdW5kbGVDb250ZXh0IGNvbnRleHQsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB0aGlzLmNvbmZpZ0N0eCA9IGNvbmZpZ0N0eDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNvbHZlKCkgewotICAgICAgICAvL3RvIGF2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0gICAgICAgIEJ1bmRsZVtdIGJ1bmRsZXMgPSB1bnJlc2xvdmVkQnVuZGxlcy50b0FycmF5KG5ldyBCdW5kbGVbdW5yZXNsb3ZlZEJ1bmRsZXMuc2l6ZSgpXSk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZXMpIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyKGJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9CdW5kbGVDbGFzc0xvYWRlci5qYXZhIGIvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvQnVuZGxlQ2xhc3NMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0MDk3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9CdW5kbGVDbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQgd2l0aCBBeGlzU2VydmljZSwgQXhpc01vZHVsZSBldGMKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZUNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgYnVuZGxlOwotCi0gICAgcHVibGljIEJ1bmRsZUNsYXNzTG9hZGVyKEJ1bmRsZSBidW5kbGUsIENsYXNzTG9hZGVyIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICB0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlLmxvYWRDbGFzcyhuYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGFkZCB0aGUgcHJvcGVyIGxvZ2dpbmcKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRSZXNvdXJjZShuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZmluZFJlc291cmNlcyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZS5nZXRSZXNvdXJjZXMobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZmluZFJlc291cmNlKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyBjbGF6ejsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsYXp6ID0gZmluZENsYXNzKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvbHZlKSB7Ci0gICAgICAgICAgICByZXNvbHZlQ2xhc3MoY2xhenopOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsYXp6OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xhenogPSBmaW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNsYXp6OwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvTW9kdWxlUmVnaXN0cnkuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L01vZHVsZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjU4YjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvTW9kdWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuTW9kdWxlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1vZHVsZXMuTW9kdWxlOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQXhpczJDb25zdGFudHMuT1NHaV9CVU5ETEVfSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUxpc3RlbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVSZWdpc3RyeSBleHRlbmRzIEFic3RyYWN0UmVnaXN0cnk8QXhpc01vZHVsZT4gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1vZHVsZVJlZ2lzdHJ5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgUmVnaXN0cnkgc2VydmljZVJlZ2lzdHJ5OwotCi0gICAgcHVibGljIE1vZHVsZVJlZ2lzdHJ5KEJ1bmRsZUNvbnRleHQgY29udGV4dCwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyeSBzZXJ2aWNlUmVnaXN0cnkpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgY29uZmlnQ3R4KTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlUmVnaXN0cnkgPSBzZXJ2aWNlUmVnaXN0cnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZE1vZHVsZXMoYnVuZGxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuUmVnaXN0ZXIoQnVuZGxlIGJ1bmRsZSwgYm9vbGVhbiB1bmluc3RhbGwpIHsKLSAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIExpc3Q8QXhpc01vZHVsZT4gbW9kdWxlTGlzdCA9IHJlc29sdmVkQnVuZGxlcy5nZXQoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMaXN0PExvbmc+IHN0b3BCdW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxMb25nPigpOwotICAgICAgICAgICAgICAgIGZvciAoQXhpc01vZHVsZSBtb2R1bGUgOiBtb2R1bGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNDb25maWcuZ2V0U2VydmljZUdyb3VwcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXAuaXNFbmdhZ2VkKG1vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nIHZhbHVlID0gKExvbmcpIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyYW1ldGVyVmFsdWUoT1NHaV9CVU5ETEVfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdW5kbGVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgc2VydmljZU1hcCA9IGF4aXNDb25maWcuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiB2YWx1ZXMgPSBzZXJ2aWNlTWFwLnZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZTEgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSB2YWx1ZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UuaXNFbmdhZ2VkKG1vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nIHZhbHVlID0gKExvbmcpIGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKE9TR2lfQlVORExFX0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhc3RvcEJ1bmRsZUxpc3QuY29udGFpbnModmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdW5kbGVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7IGl0ZXJhdG9yMS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvcjEubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheGlzT3BlcmF0aW9uLmlzRW5nYWdlZChtb2R1bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgdmFsdWUgPSAoTG9uZykgYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXJWYWx1ZShPU0dpX0JVTkRMRV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmICFzdG9wQnVuZGxlTGlzdC5jb250YWlucyh2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BCdW5kbGVMaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTW9kdWxlIG1vZHVsZUludGVyZmFjZSA9IG1vZHVsZS5nZXRNb2R1bGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZUludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUludGVyZmFjZS5zaHV0ZG93bihjb25maWdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHNodXR0aW5nIGRvd24gdGhlIG1vZHVsZSA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZ2V0TmFtZSgpICsgIiA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZ2V0VmVyc2lvbigpICsgIiBtb2R1ZWwgaW4gQnVuZGxlIC0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLnJlbW92ZU1vZHVsZShtb2R1bGUuZ2V0TmFtZSgpLCBtb2R1bGUuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkQnVuZGxlcy5jb250YWluc0tleShidW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZEJ1bmRsZXMucmVtb3ZlKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIltBeGlzMi9PU0dpXSBTdG9wcGluZyA6IiArIG1vZHVsZS5nZXROYW1lKCkgKyAiIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5nZXRWZXJzaW9uKCkgKyAiIG1vZHVlbCBpbiBCdW5kbGUgLSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChMb25nIGJ1bmRsZUlkIDogc3RvcEJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVuZGxlIHVuUmVnQnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUoYnVuZGxlSWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodW5SZWdCdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVJlZ2lzdHJ5LnVuUmVnaXN0ZXIodW5SZWdCdW5kbGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXaGVuIHRoZSBidW5kbGUgaXMgYWN0aXZhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIGxvb2sgZm9yIHhtbCBmaWxlcyB0aGF0IGVuZHMgd2l0aCAibW9kdWxlLnhtbCIuCi0gICAgICogVGh1cywgYSBnaXZlbiBidW5kbGUgY2FuIGhhdmUgbiBudW1iZXIgb2YgQXhpczIgbW9kdWxlcyB3aXRoIGRpZmZlcmVuIG5hbWVzIHN1ZmZpeGVkIHdpdGggbW9kdWxlLnhtbC4KLSAgICAgKiBFeDogcmFtcGFydF9tb2R1bGUueG1sOyByYWhhc19tb2R1bGUueG1sIGFkZHJlc3Npbmdtb2R1bGUueG1sCi0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiBJZiB0aGVyZSBhcmUgbiBudW1iZXIgb2YgKm1vZHVsZS54bWwgYW5kIG91dCBvZiB3aGljaCBmYWlsZWQgbW9kdWxlcyB3aWxsIGJlIGlnbm9yZWQgYW5kIGFuZCBhbGwgdGhlCi0gICAgICogc3VjY2Vzc2Z1bCAqbW9kdWxlLnhtbCBmaWxlcyB3aWxsIHVzZSB0byBjcmF0ZSB0aGUgcHJvcGVyIEF4aXNNb2R1bGUuIEl0IGlzIHV0bW9zdCBpbXBvcnRhbnQgdGhhdAotICAgICAqIHRoYXQgaWYgbiBudW1iZXIgb2YgKm1vZHVsZS54bWwgZmlsZXMgYXJlIHByZXNlbnQsIG1vZHVsZSBzaG91bGQgYmUgZ2l2ZSBhIHByb3BlciBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBzdGFydGVkIGJ1bmRsZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRNb2R1bGVzKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKCFyZXNvbHZlZEJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBidW5kbGUuZmluZEVudHJpZXMoIk1FVEEtSU5GIiwgIiptb2R1bGUueG1sIiwgZmFsc2UpOwotICAgICAgICAgICAgTGlzdDxBeGlzTW9kdWxlPiBtb2R1bGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbnVtZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8QXhpc01vZHVsZT4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbiAhPSBudWxsICYmIGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc21vZHVsZSA9IG5ldyBBeGlzTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1bmRsZUNsYXNzTG9hZGVyKGJ1bmRsZSwgUmVnaXN0cnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNtb2R1bGUuc2V0TW9kdWxlQ2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBNb2R1bGVCdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNb2R1bGVCdWlsZGVyKHVybC5vcGVuU3RyZWFtKCksIGF4aXNtb2R1bGUsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5IGhlYWRlcnMgPSBidW5kbGUuZ2V0SGVhZGVycygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lID0gKFN0cmluZykgaGVhZGVycy5nZXQoIkJ1bmRsZS1TeW1ib2xpY05hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVN5bWJvbGljTmFtZSAhPSBudWxsICYmIGJ1bmRsZVN5bWJvbGljTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzbW9kdWxlLnNldE5hbWUoYnVuZGxlU3ltYm9saWNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlVmVyc2lvbiA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJCdW5kbGUtVmVyc2lvbiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlVmVyc2lvbiAhPSBudWxsICYmIGJ1bmRsZVZlcnNpb24ubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgdmVyc2lvbiBpcyBkZWZpbmVkIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA6Oj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3IoICcuJyBtaW5vciAoICcuJyBtaWNybyAoICcuJyBxdWFsaWZpZXIgKT8gKT8gKT8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3IgOjo9IG51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vciA6Oj0gbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvIDo6PSBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGlmaWVyIDo6PSAoIGFscGhhbnVtIHwg4oCZX+KAmSB8ICctJyApKwotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2ZXJzaW9uU3BsaXQgPSBidW5kbGVWZXJzaW9uLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGNvbXBvbmVudHMgPSBuZXcgaW50W01hdGgubWluKHZlcnNpb25TcGxpdC5sZW5ndGgsIDMpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9IEludGVnZXIucGFyc2VJbnQodmVyc2lvblNwbGl0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNtb2R1bGUuc2V0VmVyc2lvbihuZXcgVmVyc2lvbihjb21wb25lbnRzLCB2ZXJzaW9uU3BsaXQubGVuZ3RoID4gMyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TcGxpdFszXSA6IG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnBvcHVsYXRlTW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNtb2R1bGUuc2V0UGFyZW50KGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIG1vZHVsZSA9IGF4aXNDb25maWcuZ2V0TW9kdWxlKGF4aXNtb2R1bGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RW5naW5lLmFkZE5ld01vZHVsZShheGlzbW9kdWxlLCBheGlzQ29uZmlnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaW5pdGlhbHplIHRoZSBtb2R1bGUgaWYgdGhlIG1vZHVsZSBjb250YWlucyBNb2R1bGUgaW50ZXJmYWNlLgotICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlIG1vZHVsZU9iaiA9IGF4aXNtb2R1bGUuZ2V0TW9kdWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlT2JqICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVPYmouaW5pdChjb25maWdDdHgsIGF4aXNtb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTGlzdC5hZGQoYXhpc21vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiW0F4aXMyL09TR2ldIFN0YXJ0aW5nIGFueSBtb2R1bGVzIGluIEJ1bmRsZSAtICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpICsgIiAtIE1vZHVsZSBOYW1lIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzbW9kdWxlLmdldE5hbWUoKSArICIgLSBNb2R1bGUgVmVyc2lvbiA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc21vZHVsZS5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIltNb2R1bGVSZWdpc3RyeV0gTW9kdWxlIDogIiArIGF4aXNtb2R1bGUuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgYWxyZWFkeSBhdmFpbGFibGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluIGRlZmF1bHQgbWFwIGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgICAgICBVdGlscy5jYWxjdWxhdGVEZWZhdWx0TW9kdWxlVmVyc2lvbihheGlzQ29uZmlnLmdldE1vZHVsZXMoKSwgYXhpc0NvbmZpZyk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VSZWdpc3RyeS5yZXNvbHZlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHJlYWRpbmcgbW9kdWxlLnhtbCI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb2R1bGVMaXN0ICE9IG51bGwgJiYgbW9kdWxlTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRCdW5kbGVzLnB1dChidW5kbGUsIG1vZHVsZUxpc3QpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHVuUmVnaXN0ZXIoYnVuZGxlLCB0cnVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpQXhpczJDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lBeGlzMkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQxMWNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lBeGlzMkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudDsKLQotLyoqCi0gKiAgQ29udGFpbnMgdGhlIGxpc3Qgb2YgY29uc3RhbnRzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPU0dpQXhpczJDb25zdGFudHMgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTU9EVUxFX05PVF9GT1VORF9FUlJPUiA9ICJFcnJvciAxOiBSZXF1aXJlZCBtb2R1bGUgaXMgbm90IGZvdW5kLiBNb2R1bGUgbmFtZSA6ICI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9UT0NPTCA9ICJwcm90b2NvbCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVQID0gIm1lcCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyAgQVhJUzJfT1NHaV9ST09UX0NPTlRFWFQgPSAib3JnLmF4aXMyLm9zZ2kuc2VydmljZS5jb250ZXh0LnJvb3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1NHaV9CVU5ETEVfSUQgPSAiX09TR2lfQlVORExFX0lEXyI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzliYWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaUNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQudHJhY2tlci5CdW5kbGVUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50LnRyYWNrZXIuV1NUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS50eC5IdHRwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRTZW5kZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5jbS5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY20uTWFuYWdlZFNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi0vKioKLSAqIE9TR2lDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkgY3JlYXRlcyBDb25maWd1cmF0aW9uQ29udGV4dCwgd2hpY2ggaXMgdGhlIHVsdGltYXRlIEF4aXMyIGVudmlyb25tZW50LgotICogVGhpcyBjcmVhdGlvbiBpcyBoYW5kbGVkIGFzIGEgTWFuYWdlZFNlcnZpY2Ugc2VydmljZSwgdGh1cywgQ29uZmlndXJhaXRvbiBBZG1pbiBoYXMgY29udHJvbCBvdmVyIGl0LgotICovCi1wdWJsaWMgY2xhc3MgT1NHaUNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIE1hbmFnZWRTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhPU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNsYXNzKTsKLQotICAgIHByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIG1uZ1NlcnZpY2VSZWdpc3RyYXRpb247Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsKLQotICAgIHByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBjb25maWdDdHhTZXJ2aWNlUmVnaXN0cmF0aW9uOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVUcmFja2VyIGJ1bmRsZVRyYWNrZXI7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGJ1bmRsZVRyYWNrZXIgPSBuZXcgQnVuZGxlVHJhY2tlcihjb250ZXh0KTsKLSAgICAgICAgRGljdGlvbmFyeSBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9QSUQsICJvcmcuYXBhY2hlLmF4aXMyLm9zZ2kiKTsKLSAgICAgICAgbW5nU2VydmljZVJlZ2lzdHJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclNlcnZpY2UoTWFuYWdlZFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCB0aGlzLCBwcm9wcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtbmdTZXJ2aWNlUmVnaXN0cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1uZ1NlcnZpY2VSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZVRyYWNrZXIuY2xvc2UoKTsKLSAgICAgICAgaWYgKGNvbmZpZ0N0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC50ZXJtaW5hdGUoKTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHggPSBudWxsOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIENvbmZpZ3VyYXRpb25Db250ZXh0IGlzIHRlcm1pbmF0ZWQiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxvZy5pbmZvKCJBeGlzMiBlbnZpcm9ubWVudCBoYXMgc3RvcHBlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydENvbmZpZ3VyYXRpb25Db250ZXh0KERpY3Rpb25hcnkgZGljdGlvbmFyeSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IE9TR2lTZXJ2ZXJDb25maWd1cmF0b3IoY29udGV4dCk7Ci0gICAgICAgIGNvbmZpZ0N0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dChjb25maWd1cmF0b3IpOwotICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICBsaXN0ZW5lck1hbmFnZXIuaW5pdChjb25maWdDdHgpOwotICAgICAgICBsaXN0ZW5lck1hbmFnZXIuc3RhcnQoKTsKLSAgICAgICAgTGlzdGVuZXJNYW5hZ2VyLmRlZmF1bHRDb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ0N0eDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVkKERpY3Rpb25hcnkgZGljdGlvbmFyeSkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3RhcnRDb25maWd1cmF0aW9uQ29udGV4dChkaWN0aW9uYXJ5KTsKLSAgICAgICAgICAgIGlmIChjb25maWdDdHhTZXJ2aWNlUmVnaXN0cmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb25maWdDdHhTZXJ2aWNlUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vcmVnaXN0ZXIgQ29uZmlndXJhdGlvbkNvbnRleHQgYXMgYSBPU0dpIHNlcml2Y2UKLSAgICAgICAgICAgIGNvbmZpZ0N0eFNlcnZpY2VSZWdpc3RyYXRpb24gPQotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShDb25maWd1cmF0aW9uQ29udGV4dC5jbGFzcy5nZXROYW1lKCksIGNvbmZpZ0N0eCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIFJlZ2lzdHJ5IHNlcnZpY2VzUmVnaXN0cnkgPSBuZXcgU2VydmljZVJlZ2lzdHJ5KGNvbnRleHQsIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICBSZWdpc3RyeSBtb2R1bGVSZWdpc3RyeSA9IG5ldyBNb2R1bGVSZWdpc3RyeShjb250ZXh0LCBjb25maWdDdHgsIHNlcnZpY2VzUmVnaXN0cnkpOwotICAgICAgICAgICAgYnVuZGxlVHJhY2tlci5hZGRSZWdpc3RyeShzZXJ2aWNlc1JlZ2lzdHJ5KTsKLSAgICAgICAgICAgIGJ1bmRsZVRyYWNrZXIuYWRkUmVnaXN0cnkobW9kdWxlUmVnaXN0cnkpOwotICAgICAgICAgICAgYnVuZGxlVHJhY2tlci5vcGVuKCk7Ci0KLSAgICAgICAgICAgIG5ldyBXU1RyYWNrZXIoY29uZmlnQ3R4LCBjb250ZXh0KS5vcGVuKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKG5ldyBBeGlzQ29uZmlnU2VydmljZUxpc3RlbmVyKGNvbmZpZ0N0eCwgY29udGV4dCkpOwotCi0gICAgICAgICAgICBEaWN0aW9uYXJ5IHByb3AgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgcHJvcC5wdXQoUFJPVE9DT0wsICJodHRwIik7Ci0gICAgICAgICAgICAvL2FkZGluZyB0aGUgZGVmYXVsdCBsaXN0ZW5lcgotICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlclNlcnZpY2UoVHJhbnNwb3J0TGlzdGVuZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgSHR0cExpc3RlbmVyKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCk7Ci0gICAgICAgICAgICBsb2cuaW5mbygiQXhpczIgZW52aXJvbm1lbnQgaGFzIHN0YXJ0ZWQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIGNyZWF0aW5nIENvbmZpZ3VyYXRpb25Db250ZXh0IjsKLSAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24obXNnLCBtc2csIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlTGlzdGVuZXIKLSAgICAgKiAgICAgIDxwLz4KLSAgICAgKiAgICAgIEF4aXNDb25maWdTZXJ2aWNlTGlzdGVuZXIgaXMgYSBTZXJ2aWNlTGlzdGVuZXIuIFRoaXMgY2xhc3MgbGlzdGVuIHRvIE9TR2kgc2VydmljZXMgYW5kCi0gICAgICogICAgICBidWlsZCB0aGUgYXBwcm9wcmlhdGUgQXhpc0NvbmZpZ3VyYXRpb24gcGx1Z2lucy4gVGhlc2UgcGx1Z2lucyBpbmNsdWRlLCBtZXNzYWdlIHJlY2VpdmVycywKLSAgICAgKiAgICAgIHRyYW5zcG9ydCBsaXN0ZW5lcnMsIHRyYW5zcG9ydCBzZW5kZXJzLCBtZXNzYWdlIGZvcm1hdHRlcnMgJiBidWlsZGVycywgZXRjLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF4aXNDb25maWdTZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBTZXJ2aWNlTGlzdGVuZXIgewotCi0gICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4OwotCi0gICAgICAgIHByaXZhdGUgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZzsKLQotICAgICAgICBwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotICAgICAgICBwcml2YXRlIExvY2sgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7Ci0KLSAgICAgICAgcHVibGljIEF4aXNDb25maWdTZXJ2aWNlTGlzdGVuZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHRoaXMuY29uZmlnQ3R4ID0gY29uZmlnQ3R4OwotICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGV2ZW50LmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKLSAgICAgICAgICAgIE9iamVjdCBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFRyYW5zcG9ydExpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KFBST1RPQ09MKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gbnVsbCB8fCBwcm90b2NvbC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvdG9jb2wgaXMgbm90IGZvdW5kIGZvciB0aGUgdHJuYXNwb3J0IG9iamVjdCI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydExpc3RlbmVyIHR4TGlzdGVuZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUcmFuc3BvcnRMaXN0ZW5lcikgc2VydmljZTsKLQotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHR4SW5EZXMgPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbihwcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgICAgIHR4SW5EZXMuc2V0UmVjZWl2ZXIodHhMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGtleXMgPSByZWZlcmVuY2UuZ2V0UHJvcGVydHlLZXlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhQUk9UT0NPTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogYXNzdW1lIFN0cmluZyBwcm9wZXJ0aWVzIGF0IHRoaXMgbW9tZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wT2JqID0gcmVmZXJlbmNlLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wT2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtID0gbmV3IFBhcmFtZXRlcihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4SW5EZXMuYWRkUGFyYW1ldGVyKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgcmVhZGluZyB0cmFuc3BvcnQgcHJvcGVydGllcyBmcm9tIDoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4TGlzdGVuZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0TGlzdGVuZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIodHhJbkRlcywgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3cgdXBkYXRlIHRoZSBBeGlzU2VydmljZSBlbmRwb2ludCBtYXAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXhpc0NvbmZpZy5nZXRTZXJ2aWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBheGlzQ29uZmlnLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5hZGRFbmRwb2ludHNUb1NlcnZpY2UoYXhpc1NlcnZpY2UsIGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgaW50aWF0aW5nIGFuZCBzdGFydGluZyB0aGUgbGlzdGVuZXIiOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2csIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBCdWlsZGVyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRUeXBlID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KENPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IG51bGwgfHwgY29udGV4dFR5cGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gQ09OVEVOVF9UWVBFICsgIiBpcyBtaXNzaW5nIGZyb20gYnVpbGRlciBvYmplY3QiOwotICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBTZXJ2aWNlRXZlbnQuUkVHSVNURVJFRCB8fCBldmVudC5nZXRUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VFdmVudC5NT0RJRklFRCkgewotICAgICAgICAgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSAoQnVpbGRlcikgc2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VCdWlsZGVyKGNvbnRleHRUeXBlLCBidWlsZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBNZXNzYWdlRm9ybWF0dGVyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRUeXBlID0gKFN0cmluZykgcmVmZXJlbmNlLmdldFByb3BlcnR5KENPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRUeXBlID09IG51bGwgfHwgY29udGV4dFR5cGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gQ09OVEVOVF9UWVBFICsgIiBpcyBtaXNzaW5nIGZyb20gZm9ybWF0dGVyIG9iamVjdCI7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIHx8IGV2ZW50LmdldFR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUV2ZW50Lk1PRElGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKE1lc3NhZ2VGb3JtYXR0ZXIpIHNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRNZXNzYWdlRm9ybWF0dGVyKGNvbnRleHRUeXBlLCBmb3JtYXR0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydmljZSBpbnN0YW5jZW9mIE1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXAgPSAoU3RyaW5nKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoTUVQKTsKLSAgICAgICAgICAgICAgICBpZiAobWVwID09IG51bGwgfHwgbWVwLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IE1FUCArICIgaXMgbWlzc2luZyBmcm9tIG1lc3NhZ2UgcmVjZWl2ZXIgb2JqZWN0IjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gU2VydmljZUV2ZW50LlJFR0lTVEVSRUQgfHwgZXZlbnQuZ2V0VHlwZSgpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRXZlbnQuTU9ESUZJRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVJlY2VpdmVyIG1yID0gKE1lc3NhZ2VSZWNlaXZlcikgc2VydmljZTsKLSAgICAgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlnLmFkZE1lc3NhZ2VSZWNlaXZlcihtZXAsIG1yKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBBeGlzT2JzZXJ2ZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIHx8IGV2ZW50LmdldFR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUV2ZW50Lk1PRElGSUVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPYnNlcnZlciBheGlzT2JzZXJ2ZXIgPSAoQXhpc09ic2VydmVyKSBzZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNPYnNlcnZlci5pbml0KGF4aXNDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0NvbmZpZy5hZGRPYnNlcnZlcnMoYXhpc09ic2VydmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBUcmFuc3BvcnRTZW5kZXIpIHsKLSAgICAgICAgICAgICAgICAvL1RPRE86IFRCRAotICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlIGluc3RhbmNlb2YgRGVwbG95ZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBUQkQsIHRoZXJlIGlzIG5vIEF4aXMyIEFQSSB5ZXQgYXZhaWxhYmxlIHRvIGFkZCBkZXBsb3llcnMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lTZXJ2ZXJDb25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lTZXJ2ZXJDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwMmIwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpU2VydmVyQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkF4aXNDb25maWdCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBoZWFydCBvZiB0aGUgT1NHaSBkZXBsb3ltZW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPU0dpU2VydmVyQ29uZmlndXJhdG9yIGV4dGVuZHMgRGVwbG95bWVudEVuZ2luZSBpbXBsZW1lbnRzIEF4aXNDb25maWd1cmF0b3IgewotCi0gICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFVSTCBheGlzMlhtbFVybDsKLQotICAgIHB1YmxpYyBPU0dpU2VydmVyQ29uZmlndXJhdG9yKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gdGhpcy5jb250ZXh0LmdldEJ1bmRsZSgpCi0gICAgICAgICAgICAgICAgLmZpbmRFbnRyaWVzKCJvcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudCIsICJheGlzMi54bWwiLCBmYWxzZSk7Ci0gICAgICAgIGlmIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgYXhpczJYbWxVcmwgPSAoVVJMKWVudHJpZXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE9TR2lTZXJ2ZXJDb25maWd1cmF0b3Igd2lsbCBjcmVhdGUgYW4gc3BlY2lmaWN0IEF4aXNDb25maWd1cmF0aW9uIGJhc2VkIG9uIGF4aXMyLnhtbCB3aGljaAotICAgICAqIGlzIGF2YWlsYWJsZSBpbiBvcmcvYXBhY2hlL2F4aXMyLm9zZ2kvZGVwbG95bWVudCBkaXJlY3RvcnkuIFRoaXMgYXhpczIueG1sIGRvZXNuJ3QgY29udGFpbgotICAgICAqIGFueSBsaXN0ZW5lcnMuIExpc3RlbmVycyBzaG91bGQgYmUgYWRkZWQgYXMgc2VydmljZXMgdG8gQXhpc0NvbmZpZ3VyYXRpb24gc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQXhpc0NvbmZpZ3VyYXRpb247IGFuIGluc3RhbmNlIG9mIEF4aXNDb25maWd1cmF0aW9uIGlzIHJldHVybgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0OyBBeGlzRmF1bHQgd2lsbCBiZSB0aHJvd24gd3JhcHBpbmcgYW55IG9mIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIGdldEF4aXNDb25maWd1cmF0aW9uKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGF4aXMyWG1sVXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgYXhpc0NvbmZpZy52YWxpZGF0ZVN5c3RlbVByZWRlZmluZWRQaGFzZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBheGlzQ29uZmlnOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIG9jY3VyZWQgd2hpbGUgY3JlYXRpbmcgYXhpc0NvbmZpZ3VyYXRpb24iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChtc2csIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VHbG9iYWxNb2R1bGVzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vVE9ETzsgVEJECi0gICAgfQotCi0gICAgcHVibGljIEF4aXNDb25maWd1cmF0aW9uIHBvcHVsYXRlQXhpc0NvbmZpZ3VyYXRpb24oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBBeGlzQ29uZmlnQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQXhpc0NvbmZpZ0J1aWxkZXIoaW4sIGF4aXNDb25maWcsIHRoaXMpOwotICAgICAgICBidWlsZGVyLnBvcHVsYXRlQ29uZmlnKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3IgaW4gY2xvc2luZyBpbnB1dCBzdHJlYW0iOwotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24obXNnLCBlKTsKLSAgICAgICAgfQotICAgICAgICAvL1RPRE86IGlmIG1vZHVsZSBkZXBsb3llciBuZWVkZSB0byBzZXQgaXQgc2hvdWxkIGJlIHNldCBoZXJlLgotICAgICAgICByZXR1cm4gYXhpc0NvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkU2VydmljZXMoKSB7Ci0gICAgICAgIC8vVE9ETzsgVEJECi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaVNlcnZpY2VCdWlsZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpU2VydmljZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDIyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9PU0dpU2VydmljZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQXhpczJDb25zdGFudHMuTU9EVUxFX05PVF9GT1VORF9FUlJPUjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU2VydmljZUJ1aWxkZXIKLSAqICAgICAgT1NHaVNlcnZpY2VCdWlsZGVyIGJ1aWxkcyBBeGlzU2VydmljZSBmcm9tIHNlcnZpY2VzLnhtbCBmb3VuZAotICogICAgICBpbiBhIGJ1bmRsZS4gQnVpbGRlciB3b3VsZCBvbmx5IHN1Y2Nlc3MgaWYgdGhlIHJlbGVhdGlvbnNoaXAgYmV0d2VlbiBtb2R1ZWxzIGFuZCBzZXJ2aWNlcwotICogICAgICB3b3VsZCBtZWV0LgotICovCi1wdWJsaWMgY2xhc3MgT1NHaVNlcnZpY2VCdWlsZGVyIGV4dGVuZHMgU2VydmljZUJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBBeGlzU2VydmljZSBzZXJ2aWNlOwotCi0gICAgcHVibGljIE9TR2lTZXJ2aWNlQnVpbGRlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHgsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgc3VwZXIoY29uZmlnQ3R4LCBzZXJ2aWNlKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT1NHaVNlcnZpY2VCdWlsZGVyKElucHV0U3RyZWFtIHNlcnZpY2VJbnB1dFN0cmVhbSwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihzZXJ2aWNlSW5wdXRTdHJlYW0sIGNvbmZpZ0N0eCwgc2VydmljZSk7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBtb2R1bGVzIHRoYXQgaXMgcmVxdWlyZWQgdG8gYmUgZW5nYWdlZCBnbG9iYWxseS4KLSAgICAgKiBJZiB0aGUgcmVxdWlyZWQgbW9kdWxlIGlzIG5vdCBmb3VuZCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBlcnJvciBjb2RlIDE6IHdoaWNoIGlzCi0gICAgICogIkVycm9yIDE6IFJlcXVpcmVkIG1vZHVsZSBpcyBub3QgZm91bmQiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbW9kdWxlUmVmcyA8Y29kZT5qYXZhLnV0aWwuSXRlcmF0b3I8L2NvZGU+Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgIDxjb2RlPkRlcGxveW1lbnRFeGNlcHRpb248L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01vZHVsZVJlZnMoSXRlcmF0b3IgbW9kdWxlUmVmcykKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShuZXcgUU5hbWUoVEFHX1JFRkVSRU5DRSkpOwotCi0gICAgICAgICAgICBpZiAobW9kdWxlUmVmQXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVmTmFtZSA9IG1vZHVsZVJlZkF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF4aXNDb25maWcuZ2V0TW9kdWxlKHJlZk5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oTU9EVUxFX05PVF9GT1VORF9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRNb2R1bGVyZWYocmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHJlcXVpcmVkIG1vZHVsZSBpcyBub3QgZm91bmQgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IgY29kZSAxOiB3aGljaCBpcwotICAgICAqICJFcnJvciAxOiBSZXF1aXJlZCBtb2R1bGUgaXMgbm90IGZvdW5kIgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZVJlZnMgbW9kdWxlUmVmcwotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gIG9wZXJhdGlvbgotICAgICAqIEB0aHJvd3MgRGVwbG95bWVudEV4Y2VwdGlvbiBEZXBsb3ltZW50RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc09wZXJhdGlvbk1vZHVsZVJlZnMoSXRlcmF0b3IgbW9kdWxlUmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIG9wZXJhdGlvbikgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICB3aGlsZSAobW9kdWxlUmVmcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBtb2R1bGVyZWYgPSAoT01FbGVtZW50KSBtb2R1bGVSZWZzLm5leHQoKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIG1vZHVsZVJlZkF0dHJpYnV0ZSA9IG1vZHVsZXJlZgotICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVSZWZBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZWZOYW1lID0gbW9kdWxlUmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNT0RVTEVfTk9UX0ZPVU5EX0VSUk9SICsgcmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFkZE1vZHVsZShyZWZOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaVNlcnZpY2VHcm91cEJ1aWxkZXIuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L09TR2lTZXJ2aWNlR3JvdXBCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzBkZmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvT1NHaVNlcnZpY2VHcm91cEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFcnJvck1zZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlNlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5TZXJ2aWNlR3JvdXBCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLk1PRFVMRV9OT1RfRk9VTkRfRVJST1I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuU2VydmljZUdyb3VwQnVpbGRlcgotICogICAgICBPU0dpU2VydmljZUdyb3VwQnVpbGRlciBidWlsZHMgQXhpc1NlcnZpY2VHcm91cCBmcm9tIHNlcnZpY2VzLnhtbCBmb3VuZAotICogICAgICBpbiBhIGJ1bmRsZS4gQnVpbGRlciB3b3VsZCBvbmx5IHN1Y2Nlc3MgaWYgdGhlIHJlbGVhdGlvbnNoaXAgYmV0d2VlbiBtb2R1ZWxzIGFuZCBzZXJ2aWNlcwotICogICAgICB3b3VsZCBtZWV0LgotICovCi1wdWJsaWMgY2xhc3MgT1NHaVNlcnZpY2VHcm91cEJ1aWxkZXIgZXh0ZW5kcyBTZXJ2aWNlR3JvdXBCdWlsZGVyIHsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IHNlcnZpY2VFbGVtZW50OwotCi0gICAgcHJpdmF0ZSBNYXAgd3NkbFNlcnZpY2VzOwotCi0gICAgcHVibGljIE9TR2lTZXJ2aWNlR3JvdXBCdWlsZGVyKE9NRWxlbWVudCBzZXJ2aWNlRWxlbWVudCwgSGFzaE1hcCB3c2RsU2VydmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBzdXBlcihzZXJ2aWNlRWxlbWVudCwgd3NkbFNlcnZpY2VzLCBjb25maWdDdHgpOwotICAgICAgICB0aGlzLnNlcnZpY2VFbGVtZW50ID0gc2VydmljZUVsZW1lbnQ7Ci0gICAgICAgIHRoaXMud3NkbFNlcnZpY2VzID0gd3NkbFNlcnZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgcG9wdWxhdGVTZXJ2aWNlR3JvdXAoQXhpc1NlcnZpY2VHcm91cCBheGlzU2VydmljZUdyb3VwKQotICAgICAgICAgICAgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3Qgc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBzZXJ2aWNlIGxldmVsIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ciA9IHNlcnZpY2VFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19QQVJBTUVURVIpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc1BhcmFtZXRlcnMoaXRyLCBheGlzU2VydmljZUdyb3VwLCBheGlzU2VydmljZUdyb3VwLmdldFBhcmVudCgpKTsKLQotICAgICAgICAgICAgSXRlcmF0b3IgbW9kdWxlQ29uZmlncyA9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VFbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKFRBR19NT0RVTEVfQ09ORklHKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NTZXJ2aWNlTW9kdWxlQ29uZmlnKG1vZHVsZUNvbmZpZ3MsIGF4aXNTZXJ2aWNlR3JvdXAuZ2V0UGFyZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzU2VydmljZUdyb3VwKTsKLQotICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBzZXJ2aWNlLXdpZGUgbW9kdWxlcyB3aGljaCByZXF1aXJlZCB0byBlbmdhZ2UgZ2xvYmFsbHkKLSAgICAgICAgICAgIEl0ZXJhdG9yIG1vZHVsZVJlZnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfTU9EVUxFKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NNb2R1bGVSZWZzKG1vZHVsZVJlZnMsIGF4aXNTZXJ2aWNlR3JvdXApOwotCi0gICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlaXRyID0gc2VydmljZUVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShuZXcgUU5hbWUoVEFHX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHNlcnZpY2UgPSAoT01FbGVtZW50KSBzZXJ2aWNlaXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBPTUF0dHJpYnV0ZSBzZXJ2aWNlTmFtZWF0dCA9IHNlcnZpY2UuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShBVFRSSUJVVEVfTkFNRSkpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZWF0dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX05BTUVfRVJST1IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gc2VydmljZU5hbWVhdHQuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZShEZXBsb3ltZW50RXJyb3JNc2dzLlNFUlZJQ0VfTkFNRV9FUlJPUikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSB3c2RsU2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYXhpc1NlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0V3NkbEZvdW5kKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q3VzdG9tV3NkbCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2aWNlIHRoYXQgaGFzIHRvIGJlIGRlcGxveWVkCi0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFBhcmVudChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIoYXhpc1NlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcigpKTsKLQotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlQnVpbGRlciBzZXJ2aWNlQnVpbGRlciA9IG5ldyBPU0dpU2VydmljZUJ1aWxkZXIoY29uZmlnQ3R4LCBheGlzU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gc2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTGlzdC5hZGQoYXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGlzIHJlcXVpcmVkIHRvIGJlIGVuZ2FnZWQgZ2xvYmFsbHkuCi0gICAgICogSWYgdGhlIHJlcXVpcmVkIG1vZHVsZSBpcyBub3QgZm91bmQgdGhpcyB3aWxsIHJldHVybiB0aGUgZXJyb3IgY29kZSAxOiB3aGljaCBpcwotICAgICAqICJFcnJvciAxOiBSZXF1aXJlZCBtb2R1bGUgaXMgbm90IGZvdW5kIgotICAgICAqCi0gICAgICogQHBhcmFtIG1vZHVsZVJlZnMgPGNvZGU+amF2YS51dGlsLkl0ZXJhdG9yPC9jb2RlPgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICA8Y29kZT5EZXBsb3ltZW50RXhjZXB0aW9uPC9jb2RlPgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNb2R1bGVSZWZzKEl0ZXJhdG9yIG1vZHVsZVJlZnMsIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCkKLSAgICAgICAgICAgIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKG1vZHVsZVJlZnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbW9kdWxlcmVmID0gKE9NRWxlbWVudCkgbW9kdWxlUmVmcy5uZXh0KCk7Ci0gICAgICAgICAgICBPTUF0dHJpYnV0ZSBtb2R1bGVSZWZBdHRyaWJ1dGUgPSBtb2R1bGVyZWYuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShUQUdfUkVGRVJFTkNFKSk7Ci0KLSAgICAgICAgICAgIGlmIChtb2R1bGVSZWZBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyByZWZOYW1lID0gbW9kdWxlUmVmQXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYXhpc0NvbmZpZy5nZXRNb2R1bGUocmVmTmFtZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbihNT0RVTEVfTk9UX0ZPVU5EX0VSUk9SICsgcmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5hZGRNb2R1bGVyZWYocmVmTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvUmVnaXN0cnkuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L1JlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjQxNDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQ7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqICBUaGlzIGludGVyZmFjZSB3aWxsIGJlIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGV4dGVuc2lvbi9maWxlCi0gKiB0aGF0IG5lZWRlZCBiZSBwcm9jZXNzZWQgYW5kIGNyZWF0ZSB0aGUgcmVsZXZhbnQgQXhpcyogb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5ewotCi0gICAgdm9pZCByZWdpc3RlcihCdW5kbGUgYnVuZGxlKTsKLQotICAgIHZvaWQgdW5SZWdpc3RlcihCdW5kbGUgYnVuZGxlLCBib29sZWFuIHVuaW5zdGFsbCk7Ci0KLSAgICB2b2lkIHJlc29sdmUoKTsKLQotICAgIHZvaWQgcmVtb3ZlKEJ1bmRsZSBidW5kbGUpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL2RlcGxveW1lbnQvU2VydmljZVJlZ2lzdHJ5LmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9TZXJ2aWNlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzZWNkMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC9TZXJ2aWNlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5PU0dpQXhpczJDb25zdGFudHMuTU9EVUxFX05PVF9GT1VORF9FUlJPUjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLk9TR2lfQlVORExFX0lEOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBDcmVhdGVzIHByb3BlciBBeGlzU2VydmljZUdyb3VwL0F4aXNTZXJ2aWNlIGxvb2tpbmcgaW50byBidW5kbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUmVnaXN0cnkgZXh0ZW5kcyBBYnN0cmFjdFJlZ2lzdHJ5PEF4aXNTZXJ2aWNlR3JvdXA+IHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTZXJ2aWNlUmVnaXN0cnkuY2xhc3MpOwotCi0gICAgcHVibGljIFNlcnZpY2VSZWdpc3RyeShCdW5kbGVDb250ZXh0IGNvbnRleHQsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBjb25maWdDdHgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGRTZXJ2aWNlcyhidW5kbGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gYSBidW5kbGUgaXMgc3RhcnRlZCB0aGlzIG1ldGhvZCB3aWxsIGxvb2sgZm9yIHhtbCBmaWxlcyB0aGF0IHN1ZmZpeCB3aXRoICJzZXJ2aWNlcy54bWwiLgotICAgICAqIFRodXMsIGEgZ2l2ZW4gYnVuZGxlIGNhbiBoYXZlIG4gbnVtYmVyIG9mICpzZXJ2aWNlcy54bWwuCi0gICAgICogRXg6IG15MXNlcnZpY2VzLnhtbCBhbmQgbXkyX3NlcnZpY2VzLnhtbC4KLSAgICAgKiA8cC8+Ci0gICAgICogRHVlIHRvIHNlY3VyaXR5IGNvbnNpZGVyYXRpb24sIGlmIG9uZSAqc2VydmljZXMueG1sIGZhaWwsIGFsbCB0aGUgc2VydmljZXMgd2lsbCB0cmVhdGVkIGFzIGZhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIHJlZ2lzdGVyZWQgYnVuZGxlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNlcnZpY2VzKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKCFyZXNvbHZlZEJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBidW5kbGUuZmluZEVudHJpZXMoIk1FVEEtSU5GIiwgIipzZXJ2aWNlcy54bWwiLCBmYWxzZSk7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBMaXN0PEF4aXNTZXJ2aWNlR3JvdXA+IGF4aXNTZXJ2aWNlR3JvdXBMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbnVtZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cExpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlR3JvdXA+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoZW51bWVyYXRpb24gIT0gbnVsbCAmJiBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIHNlcnZpY2VHcm91cCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF4aXNTZXJ2aWNlR3JvdXAoY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuYWRkUGFyYW1ldGVyKCJsYXN0LnVwZGF0ZWQiLCBidW5kbGUuZ2V0TGFzdE1vZGlmaWVkKCkpOwotICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdW5kbGVDbGFzc0xvYWRlcihidW5kbGUsIFJlZ2lzdHJ5LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwQ2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEZXNjcmlwdGlvbkJ1aWxkZXIoaW5wdXRTdHJlYW0sIGNvbmZpZ0N0eCk7Ci0gICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCByb290RWxlbWVudCA9IGJ1aWxkZXIuYnVpbGRPTSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSByb290RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeSBoZWFkZXJzID0gYnVuZGxlLmdldEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KCJCdW5kbGUtU3ltYm9saWNOYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZVN5bWJvbGljTmFtZSA9IGJ1bmRsZVN5bWJvbGljTmFtZSArICJfIiArIGk7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBOYW1lKGJ1bmRsZVN5bWJvbGljTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgd3NkbFNlcnZpY2VzTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlcGxveW1lbnRDb25zdGFudHMuVEFHX1NFUlZJQ0UuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBuZXcgQXhpc1NlcnZpY2UoYnVuZGxlU3ltYm9saWNOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldFBhcmVudChzZXJ2aWNlR3JvdXApOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0Q2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VCdWlsZGVyIHNlcnZpY2VCdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9TR2lTZXJ2aWNlQnVpbGRlcihjb25maWdDdHgsIGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VCdWlsZGVyLnNldFdzZGxTZXJ2aWNlTWFwKHdzZGxTZXJ2aWNlc01hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlKHJvb3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxBeGlzU2VydmljZT4gc2VydmljZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEF4aXNTZXJ2aWNlPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QuYWRkKHNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgRGVwbG95bWVudEVuZ2luZS5hZGRTZXJ2aWNlR3JvdXAoc2VydmljZUdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJbQXhpczIvT1NHaV0gRGVwbG95ZWQgYXhpczIgc2VydmljZToiICsgc2VydmljZS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiBCdW5kbGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEZXBsb3ltZW50Q29uc3RhbnRzLlRBR19TRVJWSUNFX0dST1VQLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VHcm91cEJ1aWxkZXIgZ3JvdXBCdWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9TR2lTZXJ2aWNlR3JvdXBCdWlsZGVyKHJvb3RFbGVtZW50LCB3c2RsU2VydmljZXNNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VMaXN0ID0gZ3JvdXBCdWlsZGVyLnBvcHVsYXRlU2VydmljZUdyb3VwKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZXBsb3ltZW50RW5naW5lLmFkZFNlcnZpY2VHcm91cChzZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIltBeGlzMi9PU0dpXSBEZXBsb3llZCBheGlzMiBzZXJ2aWNlIGdyb3VwOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSArICIgaW4gQnVuZGxlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9idW5kbGUgSWQga2VlcHMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYnVuZGxlIGFuZCBheGlzU2VydmljZSBncm91cCBmb3IgbGF0ZXIgdXNlCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VHcm91cC5hZGRQYXJhbWV0ZXIoT1NHaV9CVU5ETEVfSUQsIGJ1bmRsZS5nZXRCdW5kbGVJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cExpc3QuYWRkKHNlcnZpY2VHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vbWFya2VkIGFzIHJlc29sdmVkLgotICAgICAgICAgICAgICAgICAgICBpZiAodW5yZXNsb3ZlZEJ1bmRsZXMuY29udGFpbnMoYnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNsb3ZlZEJ1bmRsZXMucmVtb3ZlKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIHRoZSBidW5kbGUiOwotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIERlcGxveW1lbnRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmluZGV4T2YoTU9EVUxFX05PVF9GT1VORF9FUlJPUikgPiAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVucmVzbG92ZWRCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJBIHNlcnZpY2UgYmVpbmcgZm91bmQgd2l0aCB1bm1lYW50IG1vZHVsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXBlbmRlbmN5LiBIZW5jZSwgbW92ZWQgaXQgdG8gVU5SRVNPTFZFRCBzdGF0ZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVzbG92ZWRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkEgc2VydmljZSBiZWluZyBmb3VuZCBpbiBVTlJFU09MVkVEIHN0YXRlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXBMaXN0ICE9IG51bGwgJiYgYXhpc1NlcnZpY2VHcm91cExpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHJlc29sdmVkQnVuZGxlcy5wdXQoYnVuZGxlLCBheGlzU2VydmljZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuUmVnaXN0ZXIoQnVuZGxlIGJ1bmRsZSwgYm9vbGVhbiB1bmluc3RhbGwpIHsKLSAgICAgICAgbG9jay5sb2NrKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PEF4aXNTZXJ2aWNlR3JvdXA+IGF4aXNTZXJ2aWNlR3JvdXBMaXN0ID0gcmVzb2x2ZWRCdW5kbGVzLmdldChidW5kbGUpOwotICAgICAgICAgICAgaWYgKGF4aXNTZXJ2aWNlR3JvdXBMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA6IGF4aXNTZXJ2aWNlR3JvdXBMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEJ1bmRsZXMuY29udGFpbnNLZXkoYnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRCdW5kbGVzLnJlbW92ZShidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdW5yZXNsb3ZlZEJ1bmRsZXMuY29udGFpbnMoYnVuZGxlKSAmJiAhdW5pbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnJlc2xvdmVkQnVuZGxlcy5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiW0F4aXMyL09TR2ldIFNlcnZpY2UgLSAiICsgc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZVNlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiW0F4aXMyL09TR2ldIFN0b3BwaW5nICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5nZXRTZXJ2aWNlR3JvdXBOYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzZXJ2aWNlIGdyb3VwIGluIEJ1bmRsZSAtICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igd2hpbGUgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgZ3JvdXAiOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICB1blJlZ2lzdGVyKGJ1bmRsZSwgdHJ1ZSk7Ci0gICAgICAgIGxvY2subG9jaygpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHJlc29sdmVkQnVuZGxlcy5jb250YWluc0tleShidW5kbGUpKSB7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRCdW5kbGVzLnJlbW92ZShidW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVucmVzbG92ZWRCdW5kbGVzLmNvbnRhaW5zKGJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICB1bnJlc2xvdmVkQnVuZGxlcy5yZW1vdmUoYnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC90cmFja2VyL0J1bmRsZVRyYWNrZXIuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvQnVuZGxlVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWUxNjNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvQnVuZGxlVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCwyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQudHJhY2tlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50LlJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV2ZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi0vKioKLSAqIEJ1bmRsZVRyYWNrZXIgbGlzdGVuIHRvIGJ1bmRsZSBldmVudHMgYW5kIGNsYXNzIHRoZSByZWdpc3RlcmVkIFJlZ2lzdHJ5Ci0gKiBvYmplY3RzIHRvIGRlYWwgd2l0aCB0aGVtLiBPbmUgYmUgYWJsZSB0byBhZGQgUmVnaXN0cnkgb2JqZWN0cyB0byBCdW5kbGVUcmFja2VyIGFuZCByZW1vdmUKLSAqIHRoZW0gYXMgbmVjZXNzYXJ5LiBXaGVuIG9wZW4oKSBpcyBjYWxsZWQgQnVuZGxlVHJhY2tlciB3aWxsIG9wZW4gdGhlIHRyYWNraW5nIGFuZCB3aGVuIGNsb3NlKCkKLSAqIGlzIGNhbGxlZCBjbG9zZSB0aGUgdHJhY2tpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVUcmFja2VyIHsKLQotICAgIHByaXZhdGUgTGlzdDxSZWdpc3RyeT4gcmVnaXN0cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxSZWdpc3RyeT4oKTsKLQotICAgIHByaXZhdGUgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIEJ1bmRsZUxpc3RlbmVyIGJ1bmRsZUxpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJ1bmRsZVRyYWNrZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHVibGljIEJ1bmRsZVRyYWNrZXIoZmluYWwgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGJ1bmRsZUxpc3RlbmVyID0gbmV3IEJ1bmRsZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChCdW5kbGVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGxvY2subG9jaygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghb3BlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBldmVudC5nZXRCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQnVuZGxlRXZlbnQuU1RBUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1bmRsZUxpc3QuY29udGFpbnMoZXZlbnQuZ2V0QnVuZGxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGV2ZW50LmdldEJ1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9naWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWdpc3RyeSByZWdpc3RyeSA6IHJlZ2lzdHJ5TGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVnaXN0ZXIoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQnVuZGxlRXZlbnQuU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRCdW5kbGUoKSAhPSBidW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUxpc3QuY29udGFpbnMoZXZlbnQuZ2V0QnVuZGxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LnJlbW92ZShldmVudC5nZXRCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZ2ljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZ2lzdHJ5IHJlZ2lzdHJ5IDogcmVnaXN0cnlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkudW5SZWdpc3RlcihidW5kbGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBCdW5kbGVFdmVudC5VTklOU1RBTExFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRCdW5kbGUoKSAhPSBidW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUxpc3QuY29udGFpbnMoZXZlbnQuZ2V0QnVuZGxlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LnJlbW92ZShldmVudC5nZXRCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xvZ2ljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZ2lzdHJ5IHJlZ2lzdHJ5IDogcmVnaXN0cnlMaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkucmVtb3ZlKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZWdpc3RyeShSZWdpc3RyeSByZWdpc3RyeSkgewotICAgICAgICByZWdpc3RyeUxpc3QuYWRkKHJlZ2lzdHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuKCkgewotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghb3BlbikgewotICAgICAgICAgICAgICAgIG9wZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJCdW5kbGUgdHJhY2tlciBpcyBvcGVuZWQiKTsKLSAgICAgICAgICAgICAgICBCdW5kbGVbXSBidW5kbGVzID0gY29udGV4dC5nZXRCdW5kbGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogYnVuZGxlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVnaXN0cnkgcmVnaXN0cnkgOiByZWdpc3RyeUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5yZWdpc3RlcihidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkQnVuZGxlTGlzdGVuZXIoYnVuZGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChvcGVuKSB7Ci0gICAgICAgICAgICAgICAgb3BlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGNvbnRleHQucmVtb3ZlQnVuZGxlTGlzdGVuZXIoYnVuZGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIEJ1bmRsZVtdIGJ1bmRsZXMgPSBidW5kbGVMaXN0LnRvQXJyYXkobmV3IEJ1bmRsZVtidW5kbGVMaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUxpc3QucmVtb3ZlKGJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUmVnaXN0cnkgcmVnaXN0cnkgOiByZWdpc3RyeUxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeS5yZW1vdmUoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQnVuZGxlIHRyYWNrZXIgaXMgY2xvc2VkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBsb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvV1NUcmFja2VyLmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvZGVwbG95bWVudC90cmFja2VyL1dTVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ3YzUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9kZXBsb3ltZW50L3RyYWNrZXIvV1NUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC50cmFja2VyOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuZGVwbG95bWVudC5CdW5kbGVDbGFzc0xvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBXU1RyYWNrZXIgd2lsbCBsaXN0ZW4gdG8gcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhbmQgZXhwb3NlIHRoZW0gYXMgV2ViIFNlcnZpY2VzIChBeGlzU2VydmljZSkKLSAqIGlmIGFuZCBvbmx5IGlmIHRoZSBhdHRhY2hlZCBEaXJlY3Rvcnkgb2JqZWN0IGNvbnRhaW5zIHRoZSBuYW1lL3ZhbHVlIHBhaXIgIm9yZy5hcGFjaGUuYXhpczIud3MiLgotICogSW4gYWRkaXRpb24gdG8gdGhpcyBXU1RyYWNrZXIgdXNlcyBkaWZmZXJlbnQgbmFtZS92YWx1ZSBwYWlycyB0byBtYW5pcHVsYXRlIEF4aXNTZXJ2aWNlIGFzIHJlcXVpcmVkLgotICovCi1wdWJsaWMgY2xhc3MgV1NUcmFja2VyIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0gICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VMaXN0ZW5lciBzZXJ2aWNlTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coV1NUcmFja2VyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZT4oKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFYSVMyX1dTID0gIm9yZy5hcGFjaGUuYXhpczIub3NnaS53cyI7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eDsKLQotICAgIHB1YmxpYyBXU1RyYWNrZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7Ci0gICAgICAgIHRoaXMuc2VydmljZUxpc3RlbmVyID0gbmV3IFNlcnZpY2VMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaW50IHNlcnZpY2VUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VydmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU2VydmljZUV2ZW50LlJFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlV1MocmVmZXJlbmNlLmdldEJ1bmRsZSgpLCBldmVudC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2aWNlRXZlbnQuVU5SRUdJU1RFUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gcmVtb3ZlIHdlYiBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIGNyZWF0aW5nIEF4aXNTZXJ2aWNlIjsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3BlbigpIHsKLSAgICAgICAgaWYgKG9wZW4pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBvcGVuID0gdHJ1ZTsKLSAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogY29udGV4dC5nZXRCdW5kbGVzKCkpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgIT0gY29udGV4dC5nZXRCdW5kbGUoKSkgewotICAgICAgICAgICAgICAgIFNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gYnVuZGxlLmdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVdTKGJ1bmRsZSwgcmVmZXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFcnJvciB3aGlsZSBjcmVhdGluZyBBeGlzU2VydmljZSBmcm9tIGJ1bmRsZSA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmdldEJ1bmRsZUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChidW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHNlcnZpY2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VydmljZVJlZmVyZWNlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHdlYiBzZXJ2aWNlIGJhc2VkIG9uIERpcmVjdG9yeSBvYmplY3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZTsgICAgIGFzc29jaWF0ZWQgYnVuZGxlIHRvIG9idGFpbiBtZXRhIGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZXM7IFNlcnZpY2VSZWZlcmVuY2VzIGFycmF5Ci0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB3aWxsIGJlIHRocm93bgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXUyhCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVmZXJlbmNlW10gcmVmZXJlbmNlcykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCAmJiByZWZlcmVuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgOiByZWZlcmVuY2VzKSB7Ci0gICAgICAgICAgICAgICAgY3JlYXRlV1MoYnVuZGxlLCByZWZlcmVuY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogVGhpcyBtZXRob2QgbmVlZCBtb3JlIG1vZGlmaWNhdGlvbnMKLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgICAgYnVuZGxlCi0gICAgICogQHBhcmFtIHJlZmVyZW5jZSByZWZlcmVuY2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCB3aWxsIGJlIHRocm93bgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXUyhCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCAmJiByZWZlcmVuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgT2JqZWN0IGF4aXMyV3MgPSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoQVhJUzJfV1MpOwotICAgICAgICAgICAgaWYgKGF4aXMyV3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB3c05hbWUgPSBheGlzMldzLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBsb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2UgPSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IEF4aXNTZXJ2aWNlLmNyZWF0ZVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0TWVzc2FnZVJlY2VpdmVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVuZGxlQ2xhc3NMb2FkZXIoYnVuZGxlLCBXU1RyYWNrZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldE5hbWUod3NOYW1lKTsKLSAgICAgICAgICAgICAgICBjb25maWdDdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQWRkZWQgbmV3IFdTIGZyb20gU2VydmljZVJlZmVyZW5jZSA6ICIgKyBzZXJ2aWNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWFwIGNyZWF0ZURlZmF1bHRNZXNzYWdlUmVjZWl2ZXJzKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1lc3NhZ2VSZWNlaXZlcj4gbWVzc2FnZVJlY2l2ZXJNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1lc3NhZ2VSZWNlaXZlcj4oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtZXNzYWdlUmVjZWl2ZXIgPSBSUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIuY2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX0lOX09OTFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgICAgIE1lc3NhZ2VSZWNlaXZlciBpbk91dG1lc3NhZ2VSZWNlaXZlciA9IFJQQ01lc3NhZ2VSZWNlaXZlci5jbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgbWVzc2FnZVJlY2l2ZXJNYXAucHV0KFdTREwyQ29uc3RhbnRzLk1FUF9VUklfSU5fT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgICAgIG1lc3NhZ2VSZWNpdmVyTWFwLnB1dChXU0RMMkNvbnN0YW50cy5NRVBfVVJJX1JPQlVTVF9JTl9PTkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3V0bWVzc2FnZVJlY2VpdmVyKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIk1lc3NhZ2UgcmVjZWl2ZXJzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiOwotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZywgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJbGxlZ2FsIGFjY2VzcyI7Ci0gICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXNnLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVzc2FnZVJlY2l2ZXJNYXA7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL29zZ2kvc3JjL29yZy9hcGFjaGUvYXhpczIvb3NnaS9pbnRlcm5hbC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmOTdjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvaW50ZXJuYWwvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5vc2dpLk9TR2lBeGlzU2VydmxldDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5heGlzMi5vc2dpLmRlcGxveW1lbnQuT1NHaUF4aXMyQ29uc3RhbnRzLkFYSVMyX09TR2lfUk9PVF9DT05URVhUOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIub3NnaS5kZXBsb3ltZW50Lk9TR2lDb25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLkh0dHBTZXJ2aWNlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5OYW1lc3BhY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotCi0vKioKLSAqIEFjdGl2YXRvciB3aWxsIHNldCB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgdGhhdCBpbml0aWF0ZSBBeGlzMiBPU0dpIGludGVncmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3J7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWN0aXZhdG9yLmNsYXNzKTsKLQotICAgIHByaXZhdGUgSHR0cFNlcnZpY2VUcmFja2VyIHRyYWNrZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9TR2lDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkgbWFuYWdlZFNlcnZpY2U7Ci0KLSAgICBwdWJsaWMgQWN0aXZhdG9yKCkgewotICAgICAgICBtYW5hZ2VkU2VydmljZSA9IG5ldyBPU0dpQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWFuYWdlZFNlcnZpY2Uuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIG1hbmFnZWRTZXJ2aWNlLnVwZGF0ZWQobnVsbCk7Ci0gICAgICAgIHRyYWNrZXIgPSBuZXcgSHR0cFNlcnZpY2VUcmFja2VyKGNvbnRleHQpOwotICAgICAgICB0cmFja2VyLm9wZW4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cmFja2VyLmNsb3NlKCk7Ci0gICAgICAgIG1hbmFnZWRTZXJ2aWNlLnN0b3AoKTsKLSAgICAgICAgLy91bmdldFNlcnZpY2UgQ29uZmlndXJhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpCi0gICAgICAgIFNlcnZpY2VSZWZlcmVuY2UgY29uZmlnQ3R4UmVmID0KLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoQ29uZmlndXJhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKGNvbmZpZ0N0eFJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnVuZ2V0U2VydmljZShjb25maWdDdHhSZWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9IdHRwU2VydmljZVRyYWNrZXIKLQotICAgIGNsYXNzIEh0dHBTZXJ2aWNlVHJhY2tlciBleHRlbmRzIFNlcnZpY2VUcmFja2VyIHsKLQotICAgICAgICBwdWJsaWMgSHR0cFNlcnZpY2VUcmFja2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgSHR0cFNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UpIHsKLQotICAgICAgICAgICAgSHR0cFNlcnZpY2UgaHR0cFNlcnZpY2UgPSAoSHR0cFNlcnZpY2UpIGNvbnRleHQuZ2V0U2VydmljZShzZXJ2aWNlUmVmZXJlbmNlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT1NHaUF4aXNTZXJ2bGV0IGF4aXNTZXJ2bGV0ID0gbmV3IE9TR2lBeGlzU2VydmxldChjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIGNvbmZpZ0N0eFJlZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoQ29uZmlndXJhdGlvbkNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgKENvbmZpZ3VyYXRpb25Db250ZXh0KSBjb250ZXh0LmdldFNlcnZpY2UoY29uZmlnQ3R4UmVmKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcFNlcnZpY2VDb250ZXh0Um9vdCA9IGNvbnRleHQuZ2V0UHJvcGVydHkoQVhJUzJfT1NHaV9ST09UX0NPTlRFWFQpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlQ29udGV4dFJvb3QgPSAic2VydmljZXMiOwotICAgICAgICAgICAgICAgIGlmIChwcm9wU2VydmljZUNvbnRleHRSb290ICE9IG51bGwgJiYgcHJvcFNlcnZpY2VDb250ZXh0Um9vdC5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wU2VydmljZUNvbnRleHRSb290LnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUNvbnRleHRSb290ID0gcHJvcFNlcnZpY2VDb250ZXh0Um9vdC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQ29udGV4dFJvb3QgPSBwcm9wU2VydmljZUNvbnRleHRSb290OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5zZXRTZXJ2aWNlUGF0aChzZXJ2aWNlQ29udGV4dFJvb3QpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0Um9vdCA9ICIvIiArIHNlcnZpY2VDb250ZXh0Um9vdDsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVnaXN0ZXJpbmcgU09BUCBtZXNzYWdlIGxpc3RlbmVyIHNlcnZsZXQgdG8gY29udGV4dCA6ICIgKyBjb250ZXh0Um9vdCk7Ci0gICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UucmVnaXN0ZXJTZXJ2bGV0KGNvbnRleHRSb290LCBheGlzU2VydmxldCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIHNlcnZsZXRzIjsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVzcGFjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJOYW1lc3BhY2UgbWlzc21hdGNoIHdoZW4gcmVnaXN0ZXJpbmcgc2VydmxldHMiOwotICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvdHgvSHR0cExpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy9vc2dpL3NyYy9vcmcvYXBhY2hlL2F4aXMyL29zZ2kvdHgvSHR0cExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMTNlNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvb3NnaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9vc2dpL3R4L0h0dHBMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDA0LDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm9zZ2kudHg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlc3Npb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIERlZmF1bHQgSHR0cExpc3RlbmVyIHRoYXQgc3luY2ggd2l0aCB0aGUgdW5kZXJseWluZyBsaXN0ZXJuZXIgZnJhbWV3b3Jrcy4KLSAqIFRoaXMgaW1wbGVtZW5hdGlvbiB1c2VzIG9yZy5vc2dpLnNlcnZpY2UuaHR0cC5wb3J0IHByb3BlcnR5IHRvIGZpbmQgdGhlIHBvcnQuCi0gKiA8cC8+Ci0gKiBBdCB0aGUgbW9tZW50IHRoaXMgd2lsbCBhc3N1bWUgdGhlIHVuZGVybHlpbmcgZXZuIGlzIEVxdWlub3guIGlmIHRoZSBwcmlvciBwcm9wZXJ0eSBpcyBub3Qgc2V0Ci0gKiB0aGlzIHdpbGwgZGVmYXVsdCB0byA4MC4KLSAqLwotcHVibGljIGNsYXNzIEh0dHBMaXN0ZW5lciBpbXBsZW1lbnRzIFRyYW5zcG9ydExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDdHg7Ci0KLSAgICBwdWJsaWMgSHR0cExpc3RlbmVyKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4LCBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcHJ0SW4pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5jb25maWdDdHggPSBjb25maWdDdHg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy9pZ25vcmUKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vaWdub3JlCi0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUkZvclNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaXApIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gY2FsY3VsYXRlRW5kcG9pbnQoImh0dHAiLCBzZXJ2aWNlTmFtZSwgaXApOwotICAgIH0KLQotICAgIHB1YmxpYyBFbmRwb2ludFJlZmVyZW5jZVtdIGdldEVQUnNGb3JTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlTmFtZSwgU3RyaW5nIGlwKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZmVyZW5jZVtde2NhbGN1bGF0ZUVuZHBvaW50KCJodHRwIiwgc2VydmljZU5hbWUsIGlwKX07Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIC8vaWdub3JlIGZvciB0aGUgbW9tZW50LiBUaGlzIHNob3VsZCBiZSBhYmxlIHRvIHRha2UgdGhlIEh0dHBTZXJ2aWNlIGFuZCBhdHRhY2hlZCB0byBpdC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLQotICAgIH0KLQotICAgIHByaXZhdGUgRW5kcG9pbnRSZWZlcmVuY2UgY2FsY3VsYXRlRW5kcG9pbnQoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgewotICAgICAgICBTdHJpbmcgcG9ydFMgPSBjb250ZXh0LmdldFByb3BlcnR5KCJvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydCIpOwotICAgICAgICBpbnQgcG9ydCA9IDgwOwotICAgICAgICBpZiAocG9ydFMgIT0gbnVsbCAmJiBwb3J0Uy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBvcnRTKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ly9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgc2VydmljZVBhdGggPSBjb25maWdDdHguZ2V0U2VydmljZVBhdGgoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICAgICAgc2VydmljZVBhdGggPSBzZXJ2aWNlUGF0aC5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGNvbnRleHRSb290ID0gY29uZmlnQ3R4LmdldENvbnRleHRSb290KCk7Ci0gICAgICAgIGlmIChjb250ZXh0Um9vdC5lcXVhbHMoIi8iKSB8fCBjb250ZXh0Um9vdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZXh0Um9vdCA9ICIiOyAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVmZXJlbmNlKHByb3RvY29sICsgIjovLyIgKyBpcCArICI6IiArIHBvcnQgKyBjb250ZXh0Um9vdCArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBhdGggKyAiLyIgKyBzZXJ2aWNlTmFtZSArICIvIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcGFyZW50L3BvbS54bWwgYi8xXzUvbW9kdWxlcy9wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiY2Q2Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjc8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gUGFyZW50PC9uYW1lPgotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIGlzIGFuIGVmZm9ydCB0byByZS1kZXNpZ24gYW5kIHRvdGFsbHkgcmUtaW1wbGVtZW50IGJvdGggQXhpcy9KYXZhIGFuZAotICAgICAgICAoZXZlbnR1YWxseSkgQXhpcy9DKysgb24gYSBuZXcgYXJjaGl0ZWN0dXJlLiBFdm9sdmluZyBmcm9tIHRoZSBub3cgc3RhbmRhcmQgImhhbmRsZXIgY2hhaW4iCi0gICAgICAgIG1vZGVsIHdoaWNoIEF4aXMxIHBpb25lZXJlZCwgQXhpczIgaXMgZGV2ZWxvcGluZyBhIG1vcmUgZmxleGlibGUgcGlwZWxpbmUgYXJjaGl0ZWN0dXJlIHdoaWNoCi0gICAgICAgIGNhbiB5ZXQgYmUgbWFuYWdlZCBhbmQgcGFja2FnZWQgaW4gYSBtb3JlIG9yZ2FuaXplZCBtYW5uZXIuIFRoaXMgbmV3IGRlc2lnbiBhY2tub3dsZWRnZXMgdGhlCi0gICAgICAgIG1hdHVyaW5nIG9mIHRoZSBXZWIgc2VydmljZXMgc3BhY2UgaW4gdGVybXMgb2YgbmV3IHByb3RvY29scyBzdWNoIGFzIFdTLVJlbGlhYmxlTWVzc2FnaW5nLAotICAgICAgICBXUy1TZWN1cml0eSBhbmQgV1MtQWRkcmVzc2luZyB0aGF0IGFyZSBidWlsdCBvbiB0b3Agb2YgdGhlIGJhc2UgU09BUCBzeXN0ZW0uIEF0IHRoZSB0aW1lCi0gICAgICAgIEF4aXMxIHdhcyBkZXNpZ25lZCwgd2hpbGUgaXQgd2FzIGZ1bGx5IGV4cGVjdGVkIHRoYXQgb3RoZXIgcHJvdG9jb2xzIHN1Y2ggYXMKLSAgICAgICAgV1MtUmVsaWFibGVNZXNzYWdpbmcgd291bGQgYmUgYnVpbHQgb24gdG9wIG9mIGl0LCB0aGVyZSB3YXMgbm90IGEgcHJvcGVyIGV4dGVuc2lvbgotICAgICAgICBhcmNoaXRlY3R1cmUgZGVmaW5lZCB0byBlbmFibGUgY2xlYW4gY29tcG9zaXRpb24gb2Ygc3VjaCBsYXllcnMuIFRodXMsIG9uZSBvZiB0aGUga2V5Ci0gICAgICAgIG1vdGl2YXRpb25zIGZvciBBeGlzMiBpcyB0byBwcm92aWRlIGEgY2xlYW4gYW5kIHNpbXBsZSBlbnZpcm9ubWVudCBmb3IgbGlrZSBBcGFjaGUgU2FuZGVzaGEKLSAgICAgICAgYW5kIEFwYWNoZSBXU1M0SiB0byBsYXllciBvbiB0b3Agb2YgdGhlIGJhc2UgU09BUCBzeXN0ZW0uIEFub3RoZXIgZHJpdmluZyBmb3JjZSBmb3IgQXhpczIgYXMKLSAgICAgICAgd2VsbCBhcyB0aGUgbW92ZSBhd2F5IGZyb20gUlBDIG9yaWVudGVkIFdlYiBzZXJ2aWNlcyB0b3dhcmRzIG1vcmUgZG9jdW1lbnQtb3JpZW50ZWQsIG1lc3NhZ2UKLSAgICAgICAgc3R5bGUgYXN5bmNocm9ub3VzIHNlcnZpY2UgaW50ZXJhY3Rpb25zLiBUaGUgQXhpczIgcHJvamVjdCBpcyBjZW50ZXJlZCBvbiBhIG5ldwotICAgICAgICByZXByZXNlbnRhdGlvbiBmb3IgU09BUCBtZXNzYWdlcyBjYWxsZWQgQVhJT00gKEFYSXMgT2JqZWN0IE1vZGVsKS4gQVhJT00gY29uc2lzdHMgb2YgdHdvCi0gICAgICAgIHBhcnRzOiBhIGNvbXBsZXRlIFhNTCBJbmZvc2V0IHJlcHJlc2VudGF0aW9uIGFuZCBhIFNPQVAgSW5mb3NldCByZXByZXNlbnRhdGlvbiBvbiB0b3Agb2YKLSAgICAgICAgdGhhdC4gVGhlIFhNTCBJbmZvc2V0IHJlcHJlc2VudGF0aW9uIHByb3ZpZGVzIGEgSkRPTS1saWtlIHNpbXBsZSBBUEkgYnV0IGlzIGJ1aWx0IG9uIGEKLSAgICAgICAgZGVmZXJyZWQgbW9kZWwgdmlhIGEgU3RBWC1iYXNlZCAoU3RyZWFtaW5nIEFQSSBmb3IgWE1MKSBwdWxsIHBhcnNpbmcgQVBJLiBBIGtleSBmZWF0dXJlIG9mCi0gICAgICAgIEFYSU9NIGlzIHRoYXQgaXQgYWxsb3dzIG9uZSB0byBzdG9wIGJ1aWxkaW5nIHRoZSBYTUwgdHJlZSBhbmQganVzdCBhY2Nlc3MgdGhlIHB1bGwgc3RyZWFtCi0gICAgICAgIGRpcmVjdGx5OyB0aHVzIGVuYWJsaW5nIGJvdGggbWF4aW11bSBmbGV4aWJpbGl0eSBhbmQgbWF4aW11bSBwZXJmb3JtYW5jZS4gVGhpcyBhcHByb2FjaAotICAgICAgICBhbGxvd3MgdXMgdG8gc3VwcG9ydCBtdWx0aXBsZSBsZXZlbHMgb2YgYWJzdHJhY3Rpb24gZm9yIGNvbnN1bWluZyBhbmQgb2ZmZXJpbmcgV2ViIHNlcnZpY2VzOgotICAgICAgICB1c2luZyBwbGFpbiBBWElPTSwgdXNpbmcgZ2VuZXJhdGVkIGNvZGUgYW5kIHN0YXRpY2FsbHkgZGF0YS1ib3VuZCBkYXRhIHR5cGVzIGFuZCBzbyBvbi4gQXQKLSAgICAgICAgdGhlIHRpbWUgb2YgQXhpczEncyBkZXNpZ24sIFJQQy1zdHlsZSwgc3luY2hyb25vdXMsIHJlcXVlc3QtcmVzcG9uc2UgaW50ZXJhY3Rpb25zIHdlcmUgdGhlCi0gICAgICAgIG9yZGVyIG9mIHRoZSBkYXkgZm9yIFdlYiBzZXJ2aWNlcy4gVG9kYXkgc2VydmljZSBpbnRlcmFjdGlvbnMgYXJlIG11Y2ggbW9yZSBtZXNzYWdlCi0gICAgICAgIC1vcmllbnRlZCBhbmQgZXhwbG9pdCBtYW55IGRpZmZlcmVudCBtZXNzYWdlIGV4Y2hhbmdlIHBhdHRlcm5zLiBUaGUgQXhpczIgZW5naW5lCi0gICAgICAgIGFyY2hpdGVjdHVyZSBpcyBjYXJlZnVsIHRvIG5vdCBidWlsZCBpbiBhbnkgYXNzdW1wdGlvbnMgb2YgcmVxdWVzdC1yZXNwb25zZSBwYXR0ZXJucyB0bwotICAgICAgICBlbnN1cmUgdGhhdCBpdCBjYW4gYmUgdXNlZCBlYXNpbHkgdG8gc3VwcG9ydCBhcmJpdHJhcnkgbWVzc2FnZSBleGNoYW5nZQotICAgICAgICBwYXR0ZXJucy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDx1cmw+aHR0cDovL2F4aXMuYXBhY2hlLm9yZy9heGlzMi9qYXZhL2NvcmUvPC91cmw+Ci0gICAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICAgICAgPHN5c3RlbT5qaXJhPC9zeXN0ZW0+Ci0gICAgICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0FYSVMyPC91cmw+Ci0gICAgPC9pc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxhbnQudmVyc2lvbj4xLjcuMDwvYW50LnZlcnNpb24+Ci0gICAgICAgIDxhbnRsci52ZXJzaW9uPjIuNy43PC9hbnRsci52ZXJzaW9uPgotICAgICAgICA8YXhpb20udmVyc2lvbj4xLjIuOTwvYXhpb20udmVyc2lvbj4KLSAgICAgICAgPGJzZi52ZXJzaW9uPjIuNC4wPC9ic2YudmVyc2lvbj4KLSAgICAgICAgPGNvbW1vbnMuY29kZWMudmVyc2lvbj4xLjM8L2NvbW1vbnMuY29kZWMudmVyc2lvbj4KLSAgICAgICAgPGNvbW1vbnMuZmlsZXVwbG9hZC52ZXJzaW9uPjEuMjwvY29tbW9ucy5maWxldXBsb2FkLnZlcnNpb24+Ci0gICAgICAgIDxjb21tb25zLmh0dHBjbGllbnQudmVyc2lvbj4zLjE8L2NvbW1vbnMuaHR0cGNsaWVudC52ZXJzaW9uPgotICAgICAgICA8Y29tbW9ucy5pby52ZXJzaW9uPjEuNDwvY29tbW9ucy5pby52ZXJzaW9uPgotICAgICAgICA8Y29tbW9ucy5sb2dnaW5nLnZlcnNpb24+MS4xLjE8L2NvbW1vbnMubG9nZ2luZy52ZXJzaW9uPgotICAgICAgICA8ZWNsaXBzZS52ZXJzaW9uPjMuMi4wPC9lY2xpcHNlLnZlcnNpb24+Ci0gICAgICAgIDxmaS52ZXJzaW9uPjEuMi43PC9maS52ZXJzaW9uPgotICAgICAgICA8Z2Vyb25pbW8uc3BlYy5hY3RpdmF0aW9uLnZlcnNpb24+MS4wLjI8L2dlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9uPgotICAgICAgICA8Z2Vyb25pbW8uc3BlYy5hbm5vdGF0aW9uLnZlcnNpb24+MS4xPC9nZXJvbmltby5zcGVjLmFubm90YXRpb24udmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMuamF2YW1haWwudmVyc2lvbj4xLjY8L2dlcm9uaW1vLnNwZWMuamF2YW1haWwudmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMuc3RheC52ZXJzaW9uPjEuMC4xPC9nZXJvbmltby5zcGVjLnN0YXgudmVyc2lvbj4KLSAgICAgICAgPGdlcm9uaW1vLnNwZWMubWV0YWRhdGEudmVyc2lvbj4xLjEuMjwvZ2Vyb25pbW8uc3BlYy5tZXRhZGF0YS52ZXJzaW9uPgotICAgICAgICA8Z2Vyb25pbW8uc3BlYy5zYWFqLnZlcnNpb24+MS4wLjE8L2dlcm9uaW1vLnNwZWMuc2Fhai52ZXJzaW9uPgotICAgICAgICA8Z2Vyb25pbW8uc3BlYy5qYXh3cy52ZXJzaW9uPjEuMDwvZ2Vyb25pbW8uc3BlYy5qYXh3cy52ZXJzaW9uPgotICAgICAgICA8aHR0cGNvcmUudmVyc2lvbj40LjA8L2h0dHBjb3JlLnZlcnNpb24+Ci0gICAgICAgIDxpbnRlbGxpai52ZXJzaW9uPjUuMDwvaW50ZWxsaWoudmVyc2lvbj4KLSAgICAgICAgPGphbG9weS52ZXJzaW9uPjEuNXJjMzwvamFsb3B5LnZlcnNpb24+Ci0gICAgICAgIDxqYXhiLmFwaS52ZXJzaW9uPjIuMTwvamF4Yi5hcGkudmVyc2lvbj4KLSAgICAgICAgPGpheGJyaS52ZXJzaW9uPjIuMS43PC9qYXhicmkudmVyc2lvbj4KLSAgICAgICAgPGpheGVuLnZlcnNpb24+MS4xLjE8L2pheGVuLnZlcnNpb24+Ci0gICAgICAgIDxqZXR0aXNvbi52ZXJzaW9uPjEuMC1SQzI8L2pldHRpc29uLnZlcnNpb24+Ci0gICAgICAgIDxqaWJ4LnZlcnNpb24+MS4yLjE8L2ppYngudmVyc2lvbj4KLSAgICAgICAgPGp1bml0LnZlcnNpb24tamRrMS40PjMuOC4yPC9qdW5pdC52ZXJzaW9uLWpkazEuND4KLSAgICAgICAgPGp1bml0LnZlcnNpb24+NC40PC9qdW5pdC52ZXJzaW9uPgotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTU8L2xvZzRqLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi5hcmNoaXZlci52ZXJzaW9uPjIuMjwvbWF2ZW4uYXJjaGl2ZXIudmVyc2lvbj4KLSAgICAgICAgPG1hdmVuLmFydGlmYWN0LnZlcnNpb24+Mi4wLjg8L21hdmVuLmFydGlmYWN0LnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi5wbHVnaW4udmVyc2lvbj4yLjU8L21hdmVuLnBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8bWF2ZW4ucGx1Z2luLnRlc3RpbmcudmVyc2lvbj4xLjE8L21hdmVuLnBsdWdpbi50ZXN0aW5nLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi52ZXJzaW9uPjIuMC43PC9tYXZlbi52ZXJzaW9uPgotICAgICAgICA8bmVldGhpLnZlcnNpb24+Mi4wLjQ8L25lZXRoaS52ZXJzaW9uPgotICAgICAgICA8cGxleHVzLnV0aWxzLnZlcnNpb24+MS40Ljk8L3BsZXh1cy51dGlscy52ZXJzaW9uPgotICAgICAgICA8cmhpbm8udmVyc2lvbj4xLjZSNzwvcmhpbm8udmVyc2lvbj4KLSAgICAgICAgPHNlcnZsZXQuYXBpLnZlcnNpb24+Mi4zPC9zZXJ2bGV0LmFwaS52ZXJzaW9uPgotICAgICAgICA8c3ByaW5nLnZlcnNpb24+Mi41LjE8L3NwcmluZy52ZXJzaW9uPgotICAgICAgICA8c3RheC5hcGkudmVyc2lvbj4xLjAuMTwvc3RheC5hcGkudmVyc2lvbj4KLSAgICAgICAgPHN0YXguaW1wbC5hcnRpZmFjdD53c3R4LWFzbDwvc3RheC5pbXBsLmFydGlmYWN0PgotICAgICAgICA8c3RheC5pbXBsLmdyb3VwaWQ+b3JnLmNvZGVoYXVzLndvb2RzdG94PC9zdGF4LmltcGwuZ3JvdXBpZD4KLSAgICAgICAgPHN0YXguaW1wbC52ZXJzaW9uPjMuMi45PC9zdGF4LmltcGwudmVyc2lvbj4KLSAgICAgICAgPHRvbWNhdC52ZXJzaW9uPjYuMC4xNjwvdG9tY2F0LnZlcnNpb24+Ci0gICAgICAgIDx3b2Rlbi52ZXJzaW9uPjEuME04PC93b2Rlbi52ZXJzaW9uPgotICAgICAgICA8d3NkbDRqLnZlcnNpb24+MS42LjI8L3dzZGw0ai52ZXJzaW9uPgotICAgICAgICA8eGFsYW4udmVyc2lvbj4yLjcuMDwveGFsYW4udmVyc2lvbj4KLSAgICAgICAgPHhtbGJlYW5zLnZlcnNpb24+Mi4zLjA8L3htbGJlYW5zLnZlcnNpb24+Ci0gICAgICAgIDx4bWxfcmVzb2x2ZXIudmVyc2lvbj4xLjI8L3htbF9yZXNvbHZlci52ZXJzaW9uPgotICAgICAgICA8eG1sc2NoZW1hLnZlcnNpb24+MS40LjM8L3htbHNjaGVtYS52ZXJzaW9uPgotICAgICAgICA8eG1sdW5pdC52ZXJzaW9uPjEuMTwveG1sdW5pdC52ZXJzaW9uPgotICAgICAgICA8Y29tbW9ucy5sYW5nLnZlcnNpb24+Mi4zPC9jb21tb25zLmxhbmcudmVyc2lvbj4KLSAgICAgICAgPGphdmF4Lm1haWwudmVyc2lvbj4xLjQ8L2phdmF4Lm1haWwudmVyc2lvbj4KLSAgICAgICAgPCEtLSBUaGUgYnVpbGQgZmFpbGluZyBpZiB0ZXN0cyBhcmUgc2tpcHBlZCBpcyB2ZXJ5IGFubm95aW5nIC0tPgotICAgICAgICA8ZmFpbElmTm9UZXN0cz5mYWxzZTwvZmFpbElmTm9UZXN0cz4KLSAgICAgICAgPG0yUmVwb3NpdG9yeT4nJHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9JzwvbTJSZXBvc2l0b3J5PgotICAgICAgICA8Z2Vyb25pbW8tc3BlYy5qdGEudmVyc2lvbj4xLjE8L2dlcm9uaW1vLXNwZWMuanRhLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotICAgIDxtYWlsaW5nTGlzdHM+Ci0gICAgICAgIDxtYWlsaW5nTGlzdD4KLSAgICAgICAgICAgIDxuYW1lPkF4aXMyIERldmVsb3BlciBMaXN0PC9uYW1lPgotICAgICAgICAgICAgPHN1YnNjcmliZT5qYXZhLWRldi1zdWJzY3JpYmVAYXhpcy5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8dW5zdWJzY3JpYmU+amF2YS1kZXYtdW5zdWJzY3JpYmVAYXhpcy5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KLSAgICAgICAgICAgIDxwb3N0PmphdmEtZGV2QGF4aXMuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYXhpcy1qYXZhLWRldi88L2FyY2hpdmU+Ci0gICAgICAgICAgICA8b3RoZXJBcmNoaXZlcz4KLSAgICAgICAgICAgICAgICA8b3RoZXJBcmNoaXZlPmh0dHA6Ly9tYXJrbWFpbC5vcmcvc2VhcmNoL2xpc3Q6b3JnLmFwYWNoZS53cy5heGlzLWRldjwvb3RoZXJBcmNoaXZlPgotICAgICAgICAgICAgPC9vdGhlckFyY2hpdmVzPgotICAgICAgICA8L21haWxpbmdMaXN0PgotICAgICAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICAgICAgICA8bmFtZT5BeGlzMiBVc2VyIExpc3Q8L25hbWU+Ci0gICAgICAgICAgICA8c3Vic2NyaWJlPmphdmEtdXNlci1zdWJzY3JpYmVAYXhpcy5hcGFjaGUub3JnPC9zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8dW5zdWJzY3JpYmU+amF2YS11c2VyLXVuc3Vic2NyaWJlQGF4aXMuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8cG9zdD5qYXZhLXVzZXJAYXhpcy5hcGFjaGUub3JnPC9wb3N0PgotICAgICAgICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9heGlzLWphdmEtdXNlci88L2FyY2hpdmU+Ci0gICAgICAgICAgICA8b3RoZXJBcmNoaXZlcz4KLSAgICAgICAgICAgICAgICA8b3RoZXJBcmNoaXZlPmh0dHA6Ly9tYXJrbWFpbC5vcmcvc2VhcmNoL2xpc3Q6b3JnLmFwYWNoZS53cy5heGlzLXVzZXI8L290aGVyQXJjaGl2ZT4KLSAgICAgICAgICAgIDwvb3RoZXJBcmNoaXZlcz4KLSAgICAgICAgPC9tYWlsaW5nTGlzdD4KLSAgICA8L21haWxpbmdMaXN0cz4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPlNhbWluZGEgQWJleXJ1d2FuPC9uYW1lPgotICAgICAgICAgICAgPGlkPnNhbWluZGE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnNhbWluZGEgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QWZraGFtIEF6ZWV6PC9uYW1lPgotICAgICAgICAgICAgPGlkPmF6ZWV6PC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5hemVleiBBVCB3c28yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL35hemVlejwvdXJsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkplZmYgQmFycmV0dDwvbmFtZT4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+RXJhbiBDaGludGhha2E8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+Y2hpbnRoYWthPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5jaGludGhha2EgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+Y2hpbnRoYWthPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+R2xlbiBEYW5pZWxzPC9uYW1lPgotICAgICAgICAgICAgPGlkPmdkYW5pZWxzPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5nZGFuaWVscyBBVCBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+U29uaWMgU29mdHdhcmU8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5CcmlhbiBEZVByYWRpbmU8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+cHJhZGluZTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+cHJhZGluZSBBVCB1ay5pYm0uY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+SmFsaXlhIEVrYW5heWFrZTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5qYWxpeWE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmphbGl5YSBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SW5kaWFuYSBVbml2ZXJzaXR5LCBVU0E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL35qYWxpeWE8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5SdWNoaXRoIEZlcm5hbmRvPC9uYW1lPgotICAgICAgICAgICAgPGlkPnJ1Y2hpdGhmPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5ydWNoaXRoIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPk5pY2hvbGFzIEdhbGxhcmRvPC9uYW1lPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JQk08L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5UaGlsaW5hIEd1bmFyYXRobmU8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+dGhpbGluYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+dGhpbGluYSBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkNoYXRodXJhIEhlcmF0aDwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5jaGF0aHVyYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Y2hhdGh1cmEgQVQgb3BlbnNvdXJjZS5sazwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkluZGlhbmEgVW5pdmVyc2l0eSwgVVNBPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPnd3dy5hcGFjaGUub3JnL35jaGF0aHVyYTwvdXJsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkRhdmlkIElsbHNsZXk8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+ZGF2aWRpbGxzbGV5PC9pZD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuaWxsc2xleS5vcmc8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5EZWVwYWwgSmF5YXNpbmdoZTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5kZWVwYWw8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmRlZXBhbCBBVCB3c28yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL35kZWVwYWw8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5Sb2JlcnQgTGF6YXJza2k8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+cm9iZXJ0bGF6YXJza2k8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnJvYmVydGxhemFyc2tpIEFUIGdtYWlsLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkJyYXppbCBPdXRzb3VyY2U8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5TdGV2ZSBMb3VnaHJhbjwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5zdGV2ZWw8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnN0ZXZlbCBBVCBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SFAgbGFiczwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkJpbGwgTmFneTwvbmFtZT4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+Q2hhdHJhIE5ha2thd2l0YTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5jaGF0cmE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmNoYXRyYSBBVCBXU08yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5TdW1lZGhhIFJ1YmFzaW5naGU8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+c3VtZWRoYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+c3VtZWRoYSBBVCBXU08yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5DaGFyaXRoYSBLYW1rYW5hbWdlPC9uYW1lPgotICAgICAgICAgICAgPGlkPmNoYXJpdGhhPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5jaGFyaXRoYSBBVCBXU08yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5TcmluYXRoIFBlcmVyYTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5oZW1hcGFuaTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+aGVtYXBhbmkgQVQgYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkluZGlhbmEgVW5pdmVyc2l0eSwgVVNBPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+aGVtYXBhbmk8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5Baml0aCBSYW5hYmFodTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5haml0aDwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+YWppdGggQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+YWppdGg8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5WZW5rYXQgUmVkZHk8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+dmVua2F0PC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD52cmVkZHlwIEFUIGdtYWlsLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkNvbXB1dGVyIEFzc29jaWF0ZXM8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5NaWNoYWVsIFJoZWluaGVpbWVyPC9uYW1lPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JQk08L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5Bbm4gUm9iaW5zb248L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPlNhbmthIFNhbWFyYW5heWFrZTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5zYW5rYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+c2Fua2EgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+UmljaCBTY2hldWVybGU8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+c2NoZXU8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnNjaGV1IEFUIHVzLmlibS5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JQk08L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5Bc2h1dG9zaCBTaGFoaTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5hc2h1PC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5Bc2h1dG9zaC5TaGFoaSBBVCBjYS5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Db21wdXRlciBBc3NvY2lhdGVzPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QWxla3NhbmRlciBTbG9taW5za2k8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+YWxlazwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+YXNsb20gQVQgY3MuaW5kaWFuYS5lZHU8L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JbmRpYW5hIFVuaXZlcnNpdHkgRXh0cmVtZSEgQ29tcHV0aW5nIExhYjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkRlbm5pcyBTb3Nub3NraTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5kc29zbm9za2k8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmRtcyBBVCBzb3Nub3NraS5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Tb3Nub3NraSBTb2Z0d2FyZTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkRhdmFudW0gU3Jpbml2YXM8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+ZGltczwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+ZGF2YW51bSBBVCBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkpheWFjaGFuZHJhIFNla2hhcmEgUmFvIFN1bmthcmE8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+amF5YTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+amF5YWNoYW5kcmEgQVQgZ21haWwuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Q29tcHV0ZXIgQXNzb2NpYXRlczwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPk5hbmRhbmEgTWloaW5kdWt1bGFzb29yaXlhPC9uYW1lPgotICAgICAgICAgICAgPGlkPm5hbmRhbmE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPm5hbmRhbmEgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+TmlraGlsIFRoYWtlcjwvbmFtZT4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+Q2hhbWlsIFRoYW50aHJpbXVkYWxpZ2U8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+Y2hhbWlsPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5jaGFtaWwgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+RGFzYXJhdGggV2VlcmF0aHVuZ2E8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+ZGFzYXJhdGg8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmRhc2FyYXRoIEFUIG9wZW5zb3VyY2UubGs8L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5QdXJkdWUgVW5pdmVyc2l0eSwgVVNBPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+RXJhbmdhIEpheWFzdW5kZXJhPC9uYW1lPgotICAgICAgICAgICAgPGlkPmVyYW5nYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+ZXJhbmdhIEFUIGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPlNhbmppdmEgV2VlcmF3YXJhbmE8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+c2Fuaml2YTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+c2Fuaml2YSBBVCB3c28yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5LZWl0aCBDaGFwbWFuPC9uYW1lPgotICAgICAgICAgICAgPGlkPmtlaXRoYzwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+a2VpdGggQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QW5kcmVhcyBWZWl0aGVuPC9uYW1lPgotICAgICAgICAgICAgPGlkPnZlaXRoZW48L2lkPgotICAgICAgICAgICAgPGVtYWlsPnZlaXRoZW4gQVQgYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cubGlua2VkaW4uY29tL2luL2F2ZWl0aGVuPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgIDwvZGV2ZWxvcGVycz4KLSAgICA8Y29udHJpYnV0b3JzPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5HYXlhbiBBc2Fua2E8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+Z2F5YW4gQVQgb3BlbnNvdXJjZS5sazwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxhbmthIFNvZnR3YXJlIEZvdW5kYXRpb248L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+RGhhcnNoYW5hIERpYXM8L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxhbmthIFNvZnR3YXJlIEZvdW5kYXRpb24gLyBVbml2ZXJzaXR5IG9mIE1vcmF0dXdhPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvY29udHJpYnV0b3I+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPk5hZGFuYSBHdW5hcmF0aG5hPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPm5hZGFuYSBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5UaGlsaW5pIEd1bmF3YXJkaGFuYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD50aGlsaW5pIEFUIFdTTzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5BbnVzaGthIEt1bWFyYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5hbnVzaGtha3VtYXIgQVQgZ21haWwuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbiAvIFVuaXZlcnNpdHkgb2YgTW9yYXR1d2E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+RmFyaGFhbiBNb2hpZGVlbjwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5mbW9oaWRlZW4gQVQgdmFsaXN0YS5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5MYW5rYSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvY29udHJpYnV0b3I+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPkNoaW50aGFrYSBUaGlsYWthcmF0aG5lPC9uYW1lPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5MYW5rYSBTb2Z0d2FyZSBGb3VuZGF0aW9uIC8gVW5pdmVyc2l0eSBvZiBNb3JhdHV3YTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotCi0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPlNoaXZhbnRoYSBIdXJ1Z2dhbXV3YTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5zaGl2YW50aGFoIEFUIGdtYWlsLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPlVuaXZlcnNpdHkgT2YgUGVyYWRlbml5YSAsIFNyaSBMYW5rYTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotCi0gICAgPC9jb250cmlidXRvcnM+Ci0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPCEtLQotICAgICAgICAgIENoZWNraW5nIHJlcG9zaXRvcmVzIHRha2VzIGxvdHMgb2YgdGltZS4KLSAgICAgICAgICBSZXBvc2l0b3JpZXMgd2hpY2ggc2hvdWxkIE5PVCBiZSBwdXQgaW4gaGVyZS4KLQotICAgICAgICAgICBodHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5LwotICAgICAgICAgICAgICAgRXhpc3RzIGluIHRoZSBvcmcuYXBhY2hlLmFwYWNoZSBwYXJlbnQgcG9tCi0KLSAgICAgICAgICAgaHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvIGFrYSAnQ2VudHJhbCcKLSAgICAgICAgICAgICAgIEV4aXN0cyBpbiB0aGUgbWF2ZW4gJ1N1cGVyIFBPTScgd2hpY2ggYWxsIHBvbXMgZXh0ZW5kCi0KLSAgICAgICAgICAgaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5LwotICAgICAgICAgICAgICAgRXZlcnl0aGluZyBpbiBoZXJlIHNob3VsZCBiZSBpbiAnQ2VudHJhbCcKLQotICAgICAgICAgIENoZWNrc3VtIHBvbGljeSB3aGVuIG5vdCBzcGVjaWZpZWQgYWx3YXlzIGRlZmF1bHRzIHRvICd3YXJuJwotICAgICAgICAgIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4KLSAgICAgICAtLT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+ZWNsaXBzZS1yZXBvPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPmVjbGlwc2UgbWF2ZW4gcmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9lY2xpcHNlPC91cmw+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgICAgICA8dXBkYXRlUG9saWN5PmFsd2F5czwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8yLzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5kZWZhdWx0PC9sYXlvdXQ+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLSAgICA8cGx1Z2luUmVwb3NpdG9yaWVzPgotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBTbmFwc2hvdHMgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5kZWZhdWx0PC9sYXlvdXQ+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICAgICAgPHVwZGF0ZVBvbGljeT5kYWlseTwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvc25hcHNob3RzPC91cmw+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICAgICAgPHVwZGF0ZVBvbGljeT5kYWlseTwvdXBkYXRlUG9saWN5PgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0gICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5mYXN0aW5mb3NldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5GYXN0SW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2ZpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dHJpYmVzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dG9tY2F0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVsaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RvbWNhdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPnhtbC1yZXNvbHZlcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtcmVzb2x2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt4bWxfcmVzb2x2ZXIudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD54YWxhbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54YWxhbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3hhbGFuLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLWFwaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXhicmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGIteGpjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4YnJpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXhiLmFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5zdHJlYW08L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hY3RpdmF0aW9uPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWN0aXZhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c3ByaW5nLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0LmFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qZXR0aXNvbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pldHRpc29uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamlieDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qaWJ4LWJpbmQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqaWJ4LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmppYng8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amlieC1ydW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqaWJ4LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLndvb2RzdG94PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3N0eC1hc2w8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudC1sYXVuY2hlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2FudC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtheGlvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhtbC1hcGlzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLWFwaXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtheGlvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtheGlvbS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWE8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+WG1sU2NoZW1hPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7eG1sc2NoZW1hLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5uZWV0aGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bmVldGhpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YW50LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMubG9nZ2luZy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMuY29kZWMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD4ke3N0YXguaW1wbC5ncm91cGlkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD4ke3N0YXguaW1wbC5hcnRpZmFjdH08L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzdGF4LmltcGwudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlcm9uaW1vLnNwZWMuc3RheC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlcm9uaW1vLnNwZWMuYWN0aXZhdGlvbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZXJvbmltby5zcGVjLmphdmFtYWlsLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hbm5vdGF0aW9uXzEuMF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2Vyb25pbW8uc3BlYy5hbm5vdGF0aW9uLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby13cy1tZXRhZGF0YV8yLjBfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dlcm9uaW1vLnNwZWMubWV0YWRhdGEudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLXNhYWpfMS4zX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZXJvbmltby5zcGVjLnNhYWoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWpheHdzXzIuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2Vyb25pbW8uc3BlYy5qYXh3cy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF4ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4ZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXhlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmh0dHBjbGllbnQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjb21tb25zLmlvLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2h0dHBjb3JlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1maWxldXBsb2FkPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMuZmlsZXVwbG9hZC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPndzZGw0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt3c2RsNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndvZGVuLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3dvZGVuLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLndvb2RzdG94PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3N0eC1hc2w8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sUGFyc2VyQVBJczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1hcGlzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHt3b2Rlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy53b29kc3RveDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndzdHgtYXNsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbFBhcnNlckFQSXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eG1sLWFwaXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtYXBpczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gRm9yIHRoZSBtb21lbnQsIHdvZGVuLWltcGwtZG9tIHJlYWxseSBkZXBlbmRzIG9uIFhlcmNlczsgc2VlIFdPREVOLTE1Mi4KLSAgICAgICAgICAgICAgICAgICAgICAgICBPbmNlIHRoaXMgaXMgZml4ZWQsIHdlIGNhbiBhbHNvIGV4Y2x1ZGUgeGVyY2VzOnhlcmNlc0ltcGwuIC0tPgotICAgICAgICAgICAgICAgICAgICA8IS0tIGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uIC0tPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3htbHVuaXQudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqdW5pdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnhtbGJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbGJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7eG1sYmVhbnMudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4udmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFydGlmYWN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uYXJ0aWZhY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFyY2hpdmVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uYXJjaGl2ZXIudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3BsZXh1cy51dGlscy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4ucGx1Z2luLnRlc3RpbmcudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgubWFpbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1haWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguam1zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+am1zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamRtazwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpteHRvb2xzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uam14PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+am14cmk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JvPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JvPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5qb2JzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7ZWNsaXBzZS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtlY2xpcHNlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtlY2xpcHNlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuZXF1aW5veDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2VjbGlwc2UudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZmFjZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZmFjZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2VjbGlwc2UudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2dpPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zZ2k8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtlY2xpcHNlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uuc3d0PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnN3dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2VjbGlwc2UudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zd3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2VjbGlwc2UudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51aTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51aS5pZGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtlY2xpcHNlLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmludGVsbGlqPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW5hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtpbnRlbGxpai52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5pbnRlbGxpajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leHRlbnNpb25zPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7aW50ZWxsaWoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaGlubzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3JoaW5vLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+YnNmPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJzZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2JzZi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmphbG9weTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWxvcHk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWxvcHkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y29tbW9ucy5sYW5nLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qdGFfMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHtnZXJvbmltby1zcGVjLmp0YS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLQotCi0gICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNTwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNTwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8IS0tIEp1bml0IHRlc3RpbmcgZW52aXJvbm1lbnQtLT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphdmExNjwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8IS0tIEp1bml0IHRlc3RpbmcgZW52aXJvbm1lbnQtLT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9wYXJlbnQ8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9wYXJlbnQ8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3BhcmVudDwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgICAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHMuaHR0cHM8L2lkPgotICAgICAgICAgICAgPG5hbWU+JHtkaXN0TWdtdFNuYXBzaG90c05hbWV9PC9uYW1lPgotICAgICAgICAgICAgPHVybD4ke2Rpc3RNZ210U25hcHNob3RzVXJsfTwvdXJsPgotICAgICAgICAgICAgPHVuaXF1ZVZlcnNpb24+ZmFsc2U8L3VuaXF1ZVZlcnNpb24+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBNaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gaGVyZSBpcyAyLjItYmV0YS00IGJlY2F1c2Ugb3JnLmFwYWNoZTphcGFjaGU6NyB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJ1bk9ubHlBdEV4ZWN1dGlvblJvb3QgcGFyYW1ldGVyIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZWFybGllcgotICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLWJldGEtNTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMy4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWpiLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC1iZXRhLTY8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjEtYmV0YS0xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5nbWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdtYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8IS0tIE5lZWQgMS4xIHRvIGF2b2lkIE1HUEctMTcgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDwhLS0gVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgdGhlIDEuNS4xIHZlcnNpb25zIGhlcmUgYmVjYXVzZSB0aGlzIHdvdWxkIHJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgaW4gY29ycnVwdGlvbiBvZiB0aGUgbG9jYWwgTWF2ZW4gcmVwb3NpdG9yeS4gVGhlIHJlYXNvbiBpcyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICB0aGUgUE9NcyBvZiB0aGUgMS41LjEgcGx1Z2lucyByZWZlciB0byBhbiBpbmNvcnJlY3QgamF2YS5uZXQKLSAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuIFdoZW4gTWF2ZW4gbG9hZHMgb25lIG9mIHRoZXNlIHBsdWdpbnMsIGl0IHdpbGwKLSAgICAgICAgICAgICAgICAgICAgIGxvYWQgZGVwZW5kZW5jaWVzIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSBhbmQgdGhlc2UgYXJ0aWZhY3RzCi0gICAgICAgICAgICAgICAgICAgICBhcmUgY29ycnVwdGVkICh0aGV5IGFyZSByZXBsYWNlZCBieSBhbiBIVE1MIHBhZ2UpLiBOb3RlIHRoYXQgd2UgbWF5Ci0gICAgICAgICAgICAgICAgICAgICBsYXRlciB1c2UgMS41LjIgKG9uY2UgdGhhdCB2ZXJzaW9uIGlzIHJlbGVhc2VkKSBoZXJlIHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICB0aGUgY2hpY2tlbiBhbmQgZWdnIHByb2JsZW0uIC0tPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFhci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPCEtLSBObyBjaGlja2VuIGFuZCBlZ2cgcHJvYmxlbSBoZXJlIGJlY2F1c2UgdGhlIHBsdWdpbiBkb2Vzbid0IGV4cG9zZQotICAgICAgICAgICAgICAgICAgICAgYW55IGV4dGVuc2lvbi4gV2UgY2FuIGFsd2F5cyB1c2UgdGhlIHZlcnNpb24gZnJvbSB0aGUgY3VycmVudCBidWlsZC4gLS0+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcmVwby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmYWlsT25FcnJvcj5mYWxzZTwvZmFpbE9uRXJyb3I+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJlZGlyZWN0VGVzdE91dHB1dFRvRmlsZT50cnVlPC9yZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcGluZy9wb20ueG1sIGIvMV81L21vZHVsZXMvcGluZy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y5MmEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3BpbmcvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5waW5nPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWFyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gUGluZzwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+UGluZ2luZyBjYXBhYmlsaXR5IHRvIHNlcnZpY2VzIGRlcGxveWVkIGluIEF4aXMyPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9waW5nPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvcGluZzwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvcGluZzwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbWFyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZURlcGVuZGVuY2llcz5mYWxzZTwvaW5jbHVkZURlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9waW5nL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sIGIvMV81L21vZHVsZXMvcGluZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NTk2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9waW5nL3NyYy9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9InBpbmciPgotICAgPG9wZXJhdGlvbiBuYW1lPSJwaW5nU2VydmljZSIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0Ij4KLSAgICAgICAgPGFjdGlvbk1hcHBpbmc+aHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9waW5nPC9hY3Rpb25NYXBwaW5nPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnBpbmcuUGluZ01lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvb3BlcmF0aW9uPgotPC9tb2R1bGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9waW5nL1BpbmdDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjg0Y2UuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9waW5nL1BpbmdDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5waW5nOwotCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdDb25zdGFudHMgewotICAgIFN0cmluZyBQSU5HX1NPQVBBQ1RJT04gPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9waW5nIjsKLSAgICBTdHJpbmcgUElOR19NRVRIT0RfTkFNRSA9ICJwaW5nIjsKLSAgICBTdHJpbmcgUElOR19OQU1FU1BBQ0UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy9waW5nL3hzZCI7Ci0KLSAgICBTdHJpbmcgVFlQRV9QSU5HX1JFUVVFU1QgPSAicGluZ1JlcXVlc3QiOwotICAgIFN0cmluZyBUWVBFX1BJTkdfUkVTUE9OU0UgPSAicGluZ1Jlc3BvbnNlIjsKLQotICAgIFN0cmluZyBUQUdfU0VSVklDRSA9ICJzZXJ2aWNlIjsKLSAgICBTdHJpbmcgVEFHX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICAgIFN0cmluZyBUQUdfT1BFUkFUSU9OX1NUQVRVUyA9ICJvcGVyYXRpb25TdGF0dXMiOwotICAgIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICAgIFN0cmluZyBUQUdfU1RBVFVTID0gInN0YXR1cyI7Ci0KLSAgICBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAibmFtZSI7Ci0KLSAgICBTdHJpbmcgUElOR19GQUlMRF9TVFIgPSAiRmFpbGVkIHRvIHBpbmcgdGhlIG9wZXJhdGlvbiI7Ci0gICAgU3RyaW5nIFBJTkdfTU9EVUxFX0xFVkVMX1NUUiA9ICJTdWNjZXNzZnVsIHdpdGhpbiB0aGUgbW9kdWxlIGxldmVsLiBQaW5nYWJsZSBpbnRlcmZhY2UgIiArCi0gICAgICAgICAgICAibWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgTWVzc2FnZVJlY2VpdmVyIG9mIHRoZSBvcGVyYXRpb24iOwotICAgIFN0cmluZyBQSU5HX01SX0xFVkVMX1NUUiA9ICJTdWNjZXNzZnVsIHdpdGhpbiB0aGUgTWVzc2FnZVJlY2VpdmVyIG9mIHRoZSBvcGVyYXRpb24uIFBpbmdhYmxlICIgKwotICAgICAgICAgICAgImludGVyZmFjZSBtYXkgbm90IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBTZXJ2aWNlIGNsYXNzIG9mIHRoZSBvcGVyYXRpb24iOwotICAgIFN0cmluZyBQSU5HX1NVQ0NFU1NGVUxfU1RSID0gIlBpbmcgaXMgc3VjY2Vzc2Z1bCBmb3IgdGhlIG9wZXJhdGlvbiI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9waW5nL1BpbmdNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nTWVzc2FnZVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYzAwZDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9waW5nL1BpbmdNZXNzYWdlUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5NZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuUGluZ2FibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUGluZ01lc3NhZ2VSZWNlaXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyIGltcGxlbWVudHMgUGluZ0NvbnN0YW50cyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFBpbmdNZXNzYWdlUmVjZWl2ZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UsIE1lc3NhZ2VDb250ZXh0IG91dE1lc3NhZ2UpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgb3BlcmF0aW9uU3RhdHVzOwotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgICAgICAgICAgUGluZ1Jlc3BvbnNlIHBpbmdSZXNwb25zZSA9IG5ldyBQaW5nUmVzcG9uc2UoKTsKLSAgICAgICAgICAgIHBpbmdSZXNwb25zZS5pbml0UGluZ1Jlc3BvbnNlKGluTWVzc2FnZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBvcExpc3RJdGVyYXRvciA9IGdldEF4aXNPcGVyYXRpb25zKGluTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChvcExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmICghUElOR19NRVRIT0RfTkFNRS5lcXVhbHMoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvblN0YXR1cyA9IGludm9rZVBpbmdhYmxlTVIoaW5NZXNzYWdlLCBheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcGluZ1Jlc3BvbnNlLmFkZE9wZXJhdGlvblN0YXR1cyhheGlzT3BlcmF0aW9uLCBvcGVyYXRpb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gcGluZ1Jlc3BvbnNlLmdldFJlc3Bvc2VFbnZlbG9wZSgpOwotICAgICAgICAgICAgb3V0TWVzc2FnZS5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBwaW5nIHRoZSBzZXJ2aWNlIiArCi0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgbG9nLmVycm9yKG1zZywgZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KG1zZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpZGVudGlmaWVzIHdoZXRoZXIgdGhlIHBpbmcgcmVxdWVzdCBpcyBhbiBvcGVyYXRpb24gbGV2ZWwgb3IgYSBzZXJ2aWNlIGxldmVsIG9uZS4KLSAgICAgKiBJZiBpdCBpcyBzZXJ2aWNlbCBsZXZlbCwgcmV0dXJucyB0aGUgb3BlcmF0aW9uIGl0ZXJhdG9yIGZyb20gdGhlIEF4aXNTZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5NZXNzYWdlCi0gICAgICogQHJldHVybiBJdGVyYXRvciBmb3IgdGhlIGxpc3Qgb2YgQXhpc09wZXJhdGlvbnMKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHByaXZhdGUgSXRlcmF0b3IgZ2V0QXhpc09wZXJhdGlvbnMoTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgYm9vbGVhbiBzZXJ2aWNlTGV2ZWwgPSBmYWxzZTsKLSAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9uc0l0ZXJhdG9yOwotCi0gICAgICAgIE9NRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgT01FbGVtZW50IHBpbmdSZXF1ZXN0RWxlbWVudCA9IGluTWVzc2FnZS5nZXRFbnZlbG9wZSgpLgotICAgICAgICAgICAgICAgIGdldEJvZHkoKS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFRZUEVfUElOR19SRVFVRVNUKSk7Ci0KLSAgICAgICAgaWYgKHBpbmdSZXF1ZXN0RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL3Rocm93IG5ldyBBeGlzRmF1bHQoIlBpbmcgUmVxdWVzdCBpcyBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAvL1NPQVAgYm9keSBpcyBudWxsIG9yIHBpbmcgcmVxdWVzdCBpcyBub3Qgc3BlY2lmaWVkCi0gICAgICAgICAgICAvL1RoaXMgaXMgY29uc2lkZXJlZCBhcyBhIHNlcnZpY2UgbGV2ZWwgcGluZy4KLSAgICAgICAgICAgIHNlcnZpY2VMZXZlbCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtZW50ID0gcGluZ1JlcXVlc3RFbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoVEFHX09QRVJBVElPTikpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoIXNlcnZpY2VMZXZlbCAmJiBlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vT3BlcmF0aW9ucyB0byBiZSBwaW5nZWQgaGFzIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBwaW5nIHJlcXVlc3QKLSAgICAgICAgICAgIEl0ZXJhdG9yIGVsZW1lbnRJdGVyYXRvciA9IHBpbmdSZXF1ZXN0RWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKG5ldyBRTmFtZShUQUdfT1BFUkFUSU9OKSk7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgb3BlcmF0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbjsKLQotICAgICAgICAgICAgd2hpbGUgKGVsZW1lbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb3BFbGVtZW50ID0gKE9NRWxlbWVudCkgZWxlbWVudEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wRWxlbWVudC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXhpc09wZXJhdGlvbiA9IGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpLmdldE9wZXJhdGlvbihuZXcgUU5hbWUob3BlcmF0aW9uTmFtZSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGF4aXNPcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25MaXN0LmFkZChheGlzT3BlcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIk9wZXJhdGlvbiBub3QgZm91bmQ6ICIgKyBvcGVyYXRpb25OYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNwZWNpZmllZCBpbiB0aGUgcGluZyByZXF1ZXN0IGZvciB0aGUgc2VydmljZSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZS5nZXRBeGlzU2VydmljZSgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQobXNnKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcGVyYXRpb25zSXRlcmF0b3IgPSBvcGVyYXRpb25MaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL05vIG9wZXJhdGlvbiBpcyBtZW50aW9uZWQgaW4gdGhlIHJlcXVlc3QuLiBTbyB0aGlzIGlzIGEgc2VydmljZSBsZXZlbCBwaW5nCi0gICAgICAgICAgICBvcGVyYXRpb25zSXRlcmF0b3IgPSBpbk1lc3NhZ2UuZ2V0QXhpc1NlcnZpY2UoKS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnNJdGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgTWVzc2FnZVJlY2VpdmVyIGlzIFBpbmdhYmxlCi0gICAgICogSWYgaXQgaXMgUGluZ2FibGUgaW52b2tlIHRoZSBwaW5nKCkgbWV0aG9kIGFmdGVyIHNldHRpbmcgdGhlIG9wZXJhdGlvbiBuYW1lIHRvIGJlIHBpbmdlZCBhcyBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzT3BlcmF0aW9uCi0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW52b2tlUGluZ2FibGVNUihNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2UsIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VSZWNlaXZlciBtc2dSZWNlaXZlciA9IGF4aXNPcGVyYXRpb24uZ2V0TWVzc2FnZVJlY2VpdmVyKCk7Ci0KLSAgICAgICAgaWYgKG1zZ1JlY2VpdmVyICE9IG51bGwgJiYgbXNnUmVjZWl2ZXIgaW5zdGFuY2VvZiBQaW5nYWJsZSkgewotICAgICAgICAgICAgUGluZ2FibGUgcGluZ2FibGVNUiA9IChQaW5nYWJsZSkgbXNnUmVjZWl2ZXI7Ci0gICAgICAgICAgICAvL0FkZGluZyB0aGUgb3BlcmF0aW9uIG5hbWUgdG8gYmUgcGluZ2VkIGFzIGEgcHJvcGVydHkKLSAgICAgICAgICAgIGluTWVzc2FnZS5zZXRQcm9wZXJ0eShQaW5nYWJsZS5PUEVSQVRJT05fVE9fUElORywgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgcmV0dXJuIHBpbmdhYmxlTVIucGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIFBpbmdhYmxlLlBJTkdfTU9EVUxFX0xFVkVMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nUmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL3Bpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvcGluZy9QaW5nUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3MDJhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9waW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3BpbmcvUGluZ1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotcHVibGljIGNsYXNzIFBpbmdSZXNwb25zZSBpbXBsZW1lbnRzIFBpbmdDb25zdGFudHMgewotCi0gICAgcHJpdmF0ZSBPTUVsZW1lbnQgcGluZ1Jlc3BvbnNlOwotICAgIHByaXZhdGUgU09BUEZhY3Rvcnkgc29hcEZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBPTU5hbWVzcGFjZSBwaW5nTmFtZXNwYWNlOwotCi0gICAgcHVibGljIFBpbmdSZXNwb25zZSgpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRQaW5nUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBpZiAobXNnQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgT01FbGVtZW50IHBpbmdSZXF1ZXN0RWxlbWVudCA9IG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKS4KLSAgICAgICAgICAgICAgICBnZXRCb2R5KCkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShUWVBFX1BJTkdfUkVRVUVTVCkpOwotCi0gICAgICAgIGlmIChwaW5nUmVxdWVzdEVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcGluZ05hbWVzcGFjZSA9IHBpbmdSZXF1ZXN0RWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBpbmdOYW1lc3BhY2UgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShQSU5HX05BTUVTUEFDRSwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwaW5nUmVzcG9uc2UgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQoVFlQRV9QSU5HX1JFU1BPTlNFLCBwaW5nTmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb25TdGF0dXMoU3RyaW5nIG9wZXJhdGlvbk5hbWUsIGludCBvcFN0YXR1cykgewotICAgICAgICBPTUVsZW1lbnQgc3RhdHVzID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFRBR19TVEFUVVMsIHBpbmdOYW1lc3BhY2UpOwotICAgICAgICAvL1RPRE8gU2VuZCB0aGUgaW50ZWdlciB2YWx1ZSBvciB0aGUgc3RyaW5nIGRlc2NyaXB0aW9uCi0gICAgICAgIHN0YXR1cy5hZGRDaGlsZChzb2FwRmFjdG9yeS5jcmVhdGVPTVRleHQoSW50ZWdlci50b1N0cmluZyhvcFN0YXR1cykpKTsKLQotICAgICAgICBPTUVsZW1lbnQgb3BlcmF0aW9uID0gc29hcEZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFRBR19PUEVSQVRJT05fU1RBVFVTLCBwaW5nTmFtZXNwYWNlKTsKLSAgICAgICAgb3BlcmF0aW9uLmFkZEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgb3BlcmF0aW9uTmFtZSwgcGluZ05hbWVzcGFjZSk7Ci0gICAgICAgIG9wZXJhdGlvbi5hZGRDaGlsZChzdGF0dXMpOwotCi0gICAgICAgIHBpbmdSZXNwb25zZS5hZGRDaGlsZChvcGVyYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE9wZXJhdGlvblN0YXR1cyhBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24sIGludCBvcFN0YXR1cykgewotICAgICAgICBhZGRPcGVyYXRpb25TdGF0dXMoYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIG9wU3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVudmVsb3BlIGdldFJlc3Bvc2VFbnZlbG9wZSgpIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChwaW5nUmVzcG9uc2UpOwotICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZS9wb20ueG1sIGIvMV81L21vZHVsZXMvcmVzb3VyY2UtYnVuZGxlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4OGE2YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcmVzb3VyY2UtYnVuZGxlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItcmVzb3VyY2UtYnVuZGxlPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFJlc291cmNlIGJ1bmRsZTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+Q29udGFpbnMgdGhlIGxlZ2FsIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgYXJ0aWZhY3RzPC9kZXNjcmlwdGlvbj4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9yZXNvdXJjZS1idW5kbGU8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9yZXNvdXJjZS1idW5kbGU8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmJ1bmRsZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQudm0gYi8xXzUvbW9kdWxlcy9yZXNvdXJjZS1idW5kbGUvc3JjL21haW4vcmVzb3VyY2VzL0xJQ0VOU0UudHh0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTElDRU5TRS50eHQudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcmVzb3VyY2UtYnVuZGxlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnZtIGIvMV81L21vZHVsZXMvcmVzb3VyY2UtYnVuZGxlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjBiMTI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS52bQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9yZXNvdXJjZS1idW5kbGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS52bSBiLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM5NjkzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY3Rpb24gNCBkIG9mICAgICAgICAgICAgICAgICAgICA9PQotPT0gIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotPT0gIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBBeGlzMiBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLgotUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDUtMjAwNyBXU08yLCBJbmMuCi0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIHNjaGVtYXMgYW5kIHNwZWNpZmljYXRpb24gZGV2ZWxvcGVkIGJ5Og0KLS0gdGhlIFczQyBjb25zb3J0aXVtIChodHRwOi8vd3d3LnczYy5vcmcpDQotDQotVGhpcyBwcm9kdWN0IGFsc28gaW5jbHVkZXMgV1MtKiBzY2hlbWFzIGRldmVsb3BlZCBieSBJbnRlcm5hdGlvbmFsDQotQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgQkVBIFN5c3RlbXMsIA0KLVRJQkNPIFNvZnR3YXJlLCBTQVAgQUcsIFNvbmljIFNvZnR3YXJlLCBhbmQgVmVyaVNpZ24NCi0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIGEgV1NETCBkZXZlbG9wZWQgYnkgc2FsZXNmb3JjZS5jb20KLS0gQ29weXJpZ2h0IDE5OTktMjAwNiBzYWxlc2ZvcmNlLmNvbSwgaW5jLg0KLQ0KLVBvcnRpb25zIG9mIHRoZSBpbmNsdWRlZCB4bWxiZWFucyBsaWJyYXJ5IHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOg0KLS0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMsIEJFQSBTeXN0ZW1zLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uDQotCi1QbGVhc2UgcmVhZCB0aGUgZGlmZmVyZW50IExJQ0VOU0UgZmlsZXMgcHJlc2VudCBpbiB0aGUgbGliIGRpcmVjdG9yeSBvZgotdGhpcyBkaXN0cmlidXRpb24uCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9yZXNvdXJjZS1idW5kbGUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQudm0gYi8xXzUvbW9kdWxlcy9yZXNvdXJjZS1idW5kbGUvc3JjL21haW4vcmVzb3VyY2VzL05PVElDRS50eHQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzk2OTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcmVzb3VyY2UtYnVuZGxlL3NyYy9tYWluL3Jlc291cmNlcy9OT1RJQ0UudHh0LnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY3Rpb24gNCBkIG9mICAgICAgICAgICAgICAgICAgICA9PQotPT0gIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotPT0gIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBBeGlzMiBkaXN0cmlidXRpb24uICAgICAgICAgICAgICAgICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDYgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLgotUG9ydGlvbnMgQ29weXJpZ2h0IDIwMDUtMjAwNyBXU08yLCBJbmMuCi0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIHNjaGVtYXMgYW5kIHNwZWNpZmljYXRpb24gZGV2ZWxvcGVkIGJ5Og0KLS0gdGhlIFczQyBjb25zb3J0aXVtIChodHRwOi8vd3d3LnczYy5vcmcpDQotDQotVGhpcyBwcm9kdWN0IGFsc28gaW5jbHVkZXMgV1MtKiBzY2hlbWFzIGRldmVsb3BlZCBieSBJbnRlcm5hdGlvbmFsDQotQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbiwgQkVBIFN5c3RlbXMsIA0KLVRJQkNPIFNvZnR3YXJlLCBTQVAgQUcsIFNvbmljIFNvZnR3YXJlLCBhbmQgVmVyaVNpZ24NCi0KLVRoaXMgcHJvZHVjdCBhbHNvIGluY2x1ZGVzIGEgV1NETCBkZXZlbG9wZWQgYnkgc2FsZXNmb3JjZS5jb20KLS0gQ29weXJpZ2h0IDE5OTktMjAwNiBzYWxlc2ZvcmNlLmNvbSwgaW5jLg0KLQ0KLVBvcnRpb25zIG9mIHRoZSBpbmNsdWRlZCB4bWxiZWFucyBsaWJyYXJ5IHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOg0KLS0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDMsIEJFQSBTeXN0ZW1zLCA8aHR0cDovL3d3dy5iZWEuY29tLz4uDQotCi1QbGVhc2UgcmVhZCB0aGUgZGlmZmVyZW50IExJQ0VOU0UgZmlsZXMgcHJlc2VudCBpbiB0aGUgbGliIGRpcmVjdG9yeSBvZgotdGhpcyBkaXN0cmlidXRpb24uCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3JtaS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZjYjM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdAotICAgICAgICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+YXhpczItcm1pPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFJlbW90ZSBNZXRob2QgSW52b2NhdGlvbjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgUmVtb3RlIE1ldGhvZCBJbnZvY2F0aW9uPC9kZXNjcmlwdGlvbj4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj4KLSAgICAgICAgICAgIHNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi93ZWJzZXJ2aWNlcy9heGlzMi90cnVuay9qYXZhL21vZHVsZXMvcm1pCi0gICAgICAgIDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3dlYnNlcnZpY2VzL2F4aXMyL3RydW5rL2phdmEvbW9kdWxlcy9ybWkKLSAgICAgICAgPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvamF2YS9tb2R1bGVzL3JtaTwvdXJsPgotICAgIDwvc2NtPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9STUlDbGllbnRTZXJ2aWNlMVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1NlcnZlclRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL0RhdGFCaW5kVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljOGYzYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUsIExPR0ZJTEUKLQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTAotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTAotCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9Db25maWd1cmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOWVjNTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9Db25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5TaW1wbGVUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCBhbGwgdGhlCi0gKiB1c2VyIGRlZmluZWQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0b3IgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQmFyZTsKLSAgICBwcml2YXRlIExpc3QgZXh0ZW5zaW9uQ2xhc3NlczsKLSAgICBwcml2YXRlIE1hcCBwYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci0gICAgcHJpdmF0ZSBTaW1wbGVUeXBlSGFuZGxlciBzaW1wbGVUeXBlSGFuZGxlcjsKLSAgICAvKioKLSAgICAgKiB0aGlzIG1hcCBjb250YWlucyBjdXN0b20gZGV0YWlscyBvZiB0aGUgY2xhc3NlcwotICAgICAqLwotICAgIHByaXZhdGUgTWFwIGNsYXNzSW5mb01hcDsKLQotICAgIHB1YmxpYyBDb25maWd1cmF0b3IoKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLmNsYXNzSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgcG9wdWxhdGVEZWZ1YWx0VmFsdWVzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGVmdWFsdFZhbHVlcygpewotICAgICAgICAvLyB3ZSB3YW50IHRvIGtlZXAga2V5IGFuZCB2YWx1ZSBhdHRyaWJ1dGVzIGluIG51bGwgbmFtZXMgcGFjZS4KLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAucHV0KCJvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlcyIsIENvbnN0YW50cy5STUlfVFlQRV9OQU1TUEFDRSk7Ci0gICAgICAgIHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIgPSBuZXcgU2ltcGxlVHlwZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZShTdHJpbmcgcGFja2FnZU5hbWUpewotICAgICAgIGlmICh0aGlzLnBhY2thZ2VUb05hbWVzcGFjZU1hcC5jb250YWluc0tleShwYWNrYWdlTmFtZSkpewotICAgICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAuZ2V0KHBhY2thZ2VOYW1lKTsKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICByZXR1cm4gInVybjoiICsgcGFja2FnZU5hbWU7Ci0gICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEV4dGVuc2lvbihDbGFzcyBleHRlbnNpb25DbGFzcyl7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3Nlcy5hZGQoZXh0ZW5zaW9uQ2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZyhTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UpewotICAgICAgICB0aGlzLnBhY2thZ2VUb05hbWVzcGFjZU1hcC5wdXQocGFja2FnZU5hbWUsbmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0luZm8oQ2xhc3NJbmZvIGNsYXNzSW5mbyl7Ci0gICAgICAgIHRoaXMuY2xhc3NJbmZvTWFwLnB1dChjbGFzc0luZm8uZ2V0SmF2YUNsYXNzKCksY2xhc3NJbmZvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NJbmZvIGdldENsYXNzSW5mbyhDbGFzcyBqYXZhQ2xhc3MpewotICAgICAgICByZXR1cm4gKENsYXNzSW5mbykgdGhpcy5jbGFzc0luZm9NYXAuZ2V0KGphdmFDbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCYXJlKCkgewotICAgICAgICByZXR1cm4gaXNCYXJlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhcmUoYm9vbGVhbiBiYXJlKSB7Ci0gICAgICAgIGlzQmFyZSA9IGJhcmU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9uQ2xhc3NlcygpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uQ2xhc3NlcyhMaXN0IGV4dGVuc2lvbkNsYXNzZXMpIHsKLSAgICAgICAgdGhpcy5leHRlbnNpb25DbGFzc2VzID0gZXh0ZW5zaW9uQ2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2ltcGxlVHlwZUhhbmRsZXIgZ2V0U2ltcGxlVHlwZUhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBzaW1wbGVUeXBlSGFuZGxlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlSGFuZGxlcihTaW1wbGVUeXBlSGFuZGxlciBzaW1wbGVUeXBlSGFuZGxlcikgewotICAgICAgICB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyID0gc2ltcGxlVHlwZUhhbmRsZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUHJveHlJbnZvY2F0aW9uSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUHJveHlJbnZvY2F0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI3ZDY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1Byb3h5SW52b2NhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0KLXB1YmxpYyBjbGFzcyBQcm94eUludm9jYXRpb25IYW5kbGVyIGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBSTUlDbGllbnQgcm1pQ2xpZW50OwotCi0gICAgcHVibGljIFByb3h5SW52b2NhdGlvbkhhbmRsZXIoQ2xhc3MgaW50ZXJmYWNlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXByKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5ybWlDbGllbnQgPSBuZXcgUk1JQ2xpZW50KGludGVyZmFjZUNsYXNzLGNvbmZpZ3VyYXRvcixlcHIpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIGludm9rZSB0aGUgcm1pY2xpZW50IG9iamVjdAotICAgICAgICByZXR1cm4gdGhpcy5ybWlDbGllbnQuaW52b2tlTWV0aG9kKG1ldGhvZC5nZXROYW1lKCksYXJncyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUk1JQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2NsaWVudC9STUlDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwMjllOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2NsaWVudC9STUlDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01Tb3VyY2VkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5KYXZhT2JqZWN0U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5STUlEYXRhU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlhtbFN0cmVhbVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxFbGVtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLXB1YmxpYyBjbGFzcyBSTUlDbGllbnQgZXh0ZW5kcyBTZXJ2aWNlQ2xpZW50IHsKLQotICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBYbWxTdHJlYW1QYXJzZXIgeG1sU3RyZWFtUGFyc2VyOwotCi0gICAgcHVibGljIFJNSUNsaWVudChDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgc3VwZXIoY29uZmlnQ29udGV4dCwgYXhpc1NlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBSTUlDbGllbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbDRqRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBzdXBlcihjb25maWdDb250ZXh0LCB3c2RsNGpEZWZpbml0aW9uLCB3c2RsU2VydmljZU5hbWUsIHBvcnROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUk1JQ2xpZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBVUkwgd3NkbFVSTCwKLSAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHdzZGxTZXJ2aWNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHN1cGVyKGNvbmZpZ0NvbnRleHQsIHdzZGxVUkwsIHdzZGxTZXJ2aWNlTmFtZSwgcG9ydE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBSTUlDbGllbnQoQ2xhc3Mgc2VydmljZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcHIpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBuZXcgU2VydmljZShzZXJ2aWNlQ2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRoaXMuc2V0VGFyZ2V0RVBSKG5ldyBFbmRwb2ludFJlZmVyZW5jZShlcHIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZS5wb3B1bGF0ZU1ldGFEYXRhKCk7Ci0gICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIHRoaXMuamF2YU9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIoCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldFNjaGVtYU1hcCgpKTsKLSAgICAgICAgICAgIHRoaXMueG1sU3RyZWFtUGFyc2VyID0gbmV3IFhtbFN0cmVhbVBhcnNlcigKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldFByb2Nlc3NlZFR5cGVNYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0U2NoZW1hTWFwKCkpOwotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBSTUlDbGllbnQoQ2xhc3Mgc2VydmljZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVwcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMoc2VydmljZUNsYXNzLCBuZXcgQ29uZmlndXJhdG9yKCksIGVwcik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBpbnZva2VNZXRob2QoU3RyaW5nIG9wZXJhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gaW5wdXRPYmplY3RzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbihvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgT01FbGVtZW50IGlucHV0T01FbGVtZW50ID0gZ2V0SW5wdXRPTUVsZW1lbnQoaW5wdXRPYmplY3RzLAotICAgICAgICAgICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICB0aGlzLmphdmFPYmplY3RTZXJpYWxpemVyLAotICAgICAgICAgICAgICAgIE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgdGhpcy5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJ1cm46IiArIG9wZXJhdGlvbk5hbWUpOwotICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgT01FbGVtZW50IHJldHVybk9NRWxlbWVudCA9IHRoaXMuc2VuZFJlY2VpdmUoaW5wdXRPTUVsZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gdGhpcy54bWxTdHJlYW1QYXJzZXIuZ2V0T3V0cHV0T2JqZWN0KAotICAgICAgICAgICAgICAgICAgICByZXR1cm5PTUVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhtbFBhcnNpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCl7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZGV0YWlsRWxlbWVudCA9IGF4aXNGYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgICAgIGlmIChkZXRhaWxFbGVtZW50ICE9IG51bGwpewotICAgICAgICAgICAgICAgUU5hbWUgZWxlbWVudFFOYW1lID0gZGV0YWlsRWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHRoaXMuc2VydmljZS5nZXRFeGNlcHRpb25QYXJhbWV0ZXIoZWxlbWVudFFOYW1lKTsKLSAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGN1c3RvbUV4Y2VwdGlvbiA9IChFeGNlcHRpb24pIHRoaXMueG1sU3RyZWFtUGFyc2VyLmdldE9iamVjdEZvclBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbEVsZW1lbnQuZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcik7Ci0gICAgICAgICAgICAgICAgICAgdGhyb3cgY3VzdG9tRXhjZXB0aW9uOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9NRWxlbWVudCBnZXRJbnB1dE9NRWxlbWVudChmaW5hbCBPYmplY3RbXSBpbnB1dE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUZhY3Rvcnkgb21GYWN0b3J5KSB7Ci0gICAgICAgIE9NRGF0YVNvdXJjZSBvbURhdGFTb3VyY2UgPSBuZXcgUk1JRGF0YVNvdXJjZSgpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZUlucHV0RWxlbWVudChpbnB1dE9iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRJbnB1dFBhcmFtZXRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiUHJvYmxlbSBpbiBzZXJpYWxpemluZyB0aGUgcmV0dXJuIG9iamVjdCIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgWG1sRWxlbWVudCBpbnB1dFhtbEVsZW1lbnQgPSBvcGVyYXRpb24uZ2V0SW5wdXRFbGVtZW50KCk7Ci0gICAgICAgIFFOYW1lIGlucHV0RWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKGlucHV0WG1sRWxlbWVudC5nZXROYW1lc3BhY2UoKSwgaW5wdXRYbWxFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgT01Tb3VyY2VkRWxlbWVudEltcGwoaW5wdXRFbGVtZW50UU5hbWUsIG9tRmFjdG9yeSwgb21EYXRhU291cmNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1JNSUNsaWVudFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2NsaWVudC9STUlDbGllbnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzIxMjAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1JNSUNsaWVudFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcHJveHkgY2xpZW50cy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUk1JQ2xpZW50UHJveHkgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVByb3h5KENsYXNzIGludGVyZmFjZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVwcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEludm9jYXRpb25IYW5kbGVyIGludm9jYXRpb25IYW5kbGVyID0gbmV3IFByb3h5SW52b2NhdGlvbkhhbmRsZXIoaW50ZXJmYWNlQ2xhc3MsY29uZmlndXJhdG9yLGVwcik7Ci0gICAgICAgIE9iamVjdCBwcm94eSA9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXtpbnRlcmZhY2VDbGFzc30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkhhbmRsZXIpOwotICAgICAgICByZXR1cm4gcHJveHk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVQcm94eShDbGFzcyBpbnRlcmZhY2VDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXByKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVByb3h5KGludGVyZmFjZUNsYXNzLG5ldyBDb25maWd1cmF0b3IoKSxlcHIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY29uZmlnL0NsYXNzSW5mby5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvQ2xhc3NJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTZhOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBpcyB1c2VkIHRvIGtlZXAgdGhlIGN1c3RvbWUgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NJbmZvIHsKLQotICAgIHByaXZhdGUgTWFwIGZpZWxkSW5mb01hcDsKLSAgICBwcml2YXRlIENsYXNzIGphdmFDbGFzczsKLQotICAgIHB1YmxpYyBDbGFzc0luZm8oQ2xhc3MgamF2YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzSW5mbygpIHsKLSAgICAgICAgZmllbGRJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWVsZEluZm8oRmllbGRJbmZvIGZpZWxkSW5mbyl7Ci0gICAgICAgIGZpZWxkSW5mb01hcC5wdXQoZmllbGRJbmZvLmdldEphdmFOYW1lKCksZmllbGRJbmZvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmllbGRJbmZvIGdldEZpZWxkSW5mbyhTdHJpbmcgamF2YU5hbWUpewotICAgICAgICByZXR1cm4gKEZpZWxkSW5mbykgZmllbGRJbmZvTWFwLmdldChqYXZhTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzIGdldEphdmFDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoQ2xhc3MgamF2YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gamF2YUNsYXNzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY29uZmlnL0ZpZWxkSW5mby5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvRmllbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOTZkOTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jb25maWcvRmllbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZzsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gYWJvdXQKLSAqIHRoZSBjbGFzcyBmaWxlZAotICovCi1wdWJsaWMgY2xhc3MgRmllbGRJbmZvIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGphdmFOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHhtbE5hbWU7Ci0gICAgLy8gc2V0IHRoZSBkZWZhdWx0IGVsZW1lbnQgdmFsdWUgdG8gdHJ1ZQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQgPSB0cnVlOwotCi0gICAgcHVibGljIEZpZWxkSW5mbygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmllbGRJbmZvKFN0cmluZyBqYXZhTmFtZSkgewotICAgICAgICB0aGlzLmphdmFOYW1lID0gamF2YU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIEZpZWxkSW5mbyhTdHJpbmcgamF2YU5hbWUsIFN0cmluZyB4bWxOYW1lLCBib29sZWFuIGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lOwotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgICAgICBpc0VsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhTmFtZShTdHJpbmcgamF2YU5hbWUpIHsKLSAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sTmFtZShTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGlzRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KGJvb2xlYW4gZWxlbWVudCkgewotICAgICAgICBpc0VsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY3VzdG9tYmVhbnMvRG9tRWxlbWVudEJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvY3VzdG9tYmVhbnMvRG9tRWxlbWVudEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YjUwNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2N1c3RvbWJlYW5zL0RvbUVsZW1lbnRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jdXN0b21iZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLkFic3RyYWN0Uk1JQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5KYXZhT2JqZWN0U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5YbWxTdHJlYW1QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFBhcnNpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGhhbmRsZSBkb20gZWxlbWVudCByZWxhdGVkIHRoaW5ncy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRG9tRWxlbWVudEJlYW4gZXh0ZW5kcyBBYnN0cmFjdFJNSUJlYW4gewotCi0gICAgcHJpdmF0ZSBFbGVtZW50IGRvbUVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgRG9tRWxlbWVudEJlYW4oRWxlbWVudCBkb21FbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3RTZXJpYWxpemVyIHNlcmlhbGl6ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudCBmb3IgcGFyZW50Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KHdyaXRlciwKLSAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICBzZXJpYWxpemVEb21FbGVtZW50KHRoaXMuZG9tRWxlbWVudCx3cml0ZXIsbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTdHJlYW1QYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHRoaXMgbXVzdCBiZSBpbiB0aGUgc3RhcnQgc3RhdGUKLSAgICAgICAgd2hpbGUoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIEVsZW1lbnQgZG9tRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIG51bGwgb3Igbm90Ci0gICAgICAgICAgICBTdHJpbmcgbmlsbGFibGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksIm5pbCIpOwotICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGFibGUpIHx8ICIxIi5lcXVhbHMobmlsbGFibGUpKXsKLSAgICAgICAgICAgICAgICB3aGlsZSghcmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudAotICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYSBkb2N1bWVudCBlbGVtZW50IHJlYWRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBlbGVtZW50IG9mIHRoZQotICAgICAgICAgICAgICAgLy8gZG9tIGRvY3VtZW50Ci0gICAgICAgICAgICAgICBpZiAocmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpewotICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCA9IGdldERPTUVsZW1lbnQocmVhZGVyLGRvY3VtZW50LG5ldyBIYXNoTWFwKCksbmV3IE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiRG9tIGVsZW1lbnQgaXMgbm90IHBvaW50IHRvIGEgc3RhcnQgZWxlbWVudCIpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnQgZmFjdG9yeSAiLGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb21FbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljICBFbGVtZW50IGdldERPTUVsZW1lbnQoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZVRvUHJlZml4TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotICAgICAgICAvLyByZWFkZXIgbXVzdCBiZSBhdCBhIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgd2hpbGUoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuYW1lc3BhY2VUb1ByZWZpeE1hcC5jb250YWluc0tleShyZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgIG5hbWVzcGFjZVRvUHJlZml4TWFwLnB1dChyZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCkpOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VUb1ByZWZpeE1hcC5nZXQocmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHJlYWRlci5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBwcmVmaXggKyAiOiIgKyByZWFkZXIuZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAgIC8vIHNldCB0aGUgYXR0cmlidXRlcwotICAgICAgICBBdHRyIGF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlUHJlZml4ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOwotICAgICAgICAgICAgaWYgKChhdHRyaWJ1dGVOYW1lc3BhY2UgPT0gbnVsbCkgfHwgYXR0cmlidXRlTmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8gbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUocmVhZGVyLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShpKSxyZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lc3BhY2UgPSByZWFkZXIuZ2V0QXR0cmlidXRlTmFtZXNwYWNlKGkpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlVG9QcmVmaXhNYXAuY29udGFpbnNLZXkoYXR0cmlidXRlTmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VUb1ByZWZpeE1hcC5wdXQoYXR0cmlidXRlTmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VUb1ByZWZpeE1hcC5nZXQoYXR0cmlidXRlTmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKGF0dHJpYnV0ZU5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVByZWZpeCArICI6IiArIHJlYWRlci5nZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgaW50IHN0YXRlOwotICAgICAgICAvLyBhdCB0aGUgZW5kIHdlIGhhdmUgdG8gcG9pbnQgdGhlIHJlYWRlciB0byBlbmQgb2YgdGhpcyBlbGVtZW50LgotICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSB8fCAhcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgewotICAgICAgICAgICAgc3RhdGUgPSByZWFkZXIuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQpIHsKLSAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGdldERPTUVsZW1lbnQocmVhZGVyLCBkb2N1bWVudCwgbmFtZXNwYWNlVG9QcmVmaXhNYXAsIG5hbWVzcGFjZVByZWZpeCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBYTUxTdHJlYW1Db25zdGFudHMuQ0hBUkFDVEVSUykgewotICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocmVhZGVyLmdldFRleHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplRG9tRWxlbWVudChFbGVtZW50IGRvbUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZmlyc3Qgd3JpdGUgdGhlIHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLGRvbUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSxuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAvLyB3cml0ZSB0aGUgYXR0cmlidXRlcyB3cml0ZXIgbm93IGF0IHRoZSBzdGFydCBlbGVtZW50Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlOwotICAgICAgICBRTmFtZSBhdHRyaWJ1dGVRTmFtZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZSA9IChBdHRyKSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVRTmFtZSA9IG5ldyBRTmFtZShhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCksIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVBdHRyaWJ1dGUod3JpdGVyLCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSwgYXR0cmlidXRlUU5hbWUsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3cml0ZSB0aGUgb3RoZXIgY2hpbGRyZW4KLSAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb21FbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTm9kZSBub2RlOwotICAgICAgICBUZXh0IHRleHROb2RlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGVsZW1lbnQKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVEb21FbGVtZW50KChFbGVtZW50KSBub2RlLCB3cml0ZXIsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgdGV4dE5vZGUgPSAoVGV4dCkgbm9kZTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKHRleHROb2RlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCJVbmtub3duIGRvbSBlbGVtZW50IG5vZGUgZm91bmQgbm9kZSB0eXBlID09PiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbm9kZS5nZXROb2RlVHlwZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9BYnN0cmFjdFJNSUJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQWJzdHJhY3RSTUlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OGVkMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9BYnN0cmFjdFJNSUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSTUlCZWFuIGltcGxlbWVudHMgUk1JQmVhbiB7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YU9iamVjdFNlcmlhbGl6ZXIgc2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlU3RhcnRFbGVtZW50KFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KHByZWZpeCwgbG9jYWxQYXJ0LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZU5hbWVzcGFjZShwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChuYW1lc3BhY2UsIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlVHlwZUF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSB0eXBlUW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhzaVByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICBpZiAoeHNpUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHhzaVByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoeHNpUHJlZml4LCBDb25zdGFudHMuVVJJX0RFRkFVTFRfU0NIRU1BX1hTSSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHhzaVByZWZpeCwgQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmICh0eXBlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGVQcmVmaXggPSAibnMiICsgbmFtZXNwYWNlUHJlZml4LmdldE5hbWVzYXBjZVByZWZpeCgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSB0eXBlUW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmICghdHlwZVByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHR5cGVQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksICJ0eXBlIiwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlTnVsbEF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIGF0dHJpYnV0ZVFOYW1lID0gbmV3IFFOYW1lKENvbnN0YW50cy5VUklfREVGQVVMVF9TQ0hFTUFfWFNJLCAibmlsIik7Ci0gICAgICAgIHdyaXRlQXR0cmlidXRlKHdyaXRlciwgIjEiLCBhdHRyaWJ1dGVRTmFtZSwgbmFtZXNwYWNlUHJlZml4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCB3cnRlcyB0aGUgc2ltcGxlIGF0dHJpYnV0ZSB0byB0aGUgd3JpdGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZQotICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVRTmFtZQotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VQcmVmaXgKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQXR0cmlidXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoKGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpICYmICFhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIm5zIiArIG5hbWVzcGFjZVByZWZpeC5nZXROYW1lc2FwY2VQcmVmaXgoKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsIGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKGF0dHJpYnV0ZVFOYW1lLmdldExvY2FsUGFydCgpLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUF0dHJpYnV0ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGF0dHJpYnV0ZVFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlU3RyaW5nVmF1bGUgPSBhdHRyaWJ1dGVWYWx1ZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgaWYgKChhdHRyaWJ1dGVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSAmJiAoYXR0cmlidXRlVmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCkudHJpbSgpLmVxdWFscygiIikpKXsKLSAgICAgICAgICAgIC8vIGkuZS4gdGhpcyBpcyBhIHFuYW1lCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCxhdHRyaWJ1dGVWYWx1ZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLnNldFByZWZpeChwcmVmaXgsYXR0cmlidXRlVmFsdWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwcmVmaXgpKXsKLSAgICAgICAgICAgICAgYXR0cmlidXRlU3RyaW5nVmF1bGUgPSBwcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVTdHJpbmdWYXVsZTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSAmJiAhYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVTdHJpbmdWYXVsZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKSwgYXR0cmlidXRlU3RyaW5nVmF1bGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9KYXZhT2JqZWN0U2VyaWFsaXplci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9KYXZhT2JqZWN0U2VyaWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2IyMDVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvSmF2YU9iamVjdFNlcmlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BdHRyaWJ1dGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5FbGVtZW50RmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlcy5NYXBUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHNlcmlhbGl6ZXMgYSBnaXZlbiBqYXZhIG9iamVjdCB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0gKiB0eXBlIG9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgSmF2YU9iamVjdFNlcmlhbGl6ZXIgewotCi0gICAgcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkVHlwZU1hcDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0gICAgcHJpdmF0ZSBNYXAgc2NoZW1hTWFwOwotICAgIHByaXZhdGUgU2ltcGxlVHlwZUhhbmRsZXIgc2ltcGxlVHlwZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBDbGFzcyBzaW1wbGVUeXBlSGFuZGxlckNsYXNzOwotCi0gICAgcHVibGljIEphdmFPYmplY3RTZXJpYWxpemVyKE1hcCBwcm9jZXNzZWRUeXBlTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKSB7Ci0gICAgICAgIHRoaXMucHJvY2Vzc2VkVHlwZU1hcCA9IHByb2Nlc3NlZFR5cGVNYXA7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IHNjaGVtYU1hcDsKLSAgICAgICAgdGhpcy5zaW1wbGVUeXBlSGFuZGxlciA9IHRoaXMuY29uZmlndXJhdG9yLmdldFNpbXBsZVR5cGVIYW5kbGVyKCk7Ci0gICAgICAgIHRoaXMuc2ltcGxlVHlwZUhhbmRsZXJDbGFzcyA9IHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIuZ2V0Q2xhc3MoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXJpYWxpemUgYWxsIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgICogQHBhcmFtIG9iamVjdHMKLSAgICAgKiBAcGFyYW0gaW5wdXRYbWxFbGVtZW50Ci0gICAgICogQHBhcmFtIGlucHV0UGFyYW1ldGVycwotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUlucHV0RWxlbWVudChPYmplY3RbXSBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGlucHV0WG1sRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBpbnB1dFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXggPSBuZXcgTmFtZXNwYWNlUHJlZml4KCk7Ci0gICAgICAgIHdyaXRlU3RhcnRFbGVtZW50KHdyaXRlciwKLSAgICAgICAgICAgICAgICBpbnB1dFhtbEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgaW5wdXRYbWxFbGVtZW50LmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAvLyBpbnB1dCBvYmplY3RzIG51bGwgbWVhbnMgbm8gcGFyYW1ldGVycwotICAgICAgICBpZiAob2JqZWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVQYXJhbWV0ZXIob2JqZWN0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChQYXJhbWV0ZXIpIGlucHV0UGFyYW1ldGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlcmlhbGl6ZSB0aGUgb3V0IHB1dCBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gb2JqZWN0Ci0gICAgICogQHBhcmFtIG91dHB1dFhtbEVsZW1lbnQKLSAgICAgKiBAcGFyYW0gb3V0cHV0UGFyYW1ldGVyCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplT3V0cHV0RWxlbWVudChPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBvdXRwdXRYbWxFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIG91dHB1dFBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXggPSBuZXcgTmFtZXNwYWNlUHJlZml4KCk7Ci0gICAgICAgIC8vd3JpdGUgb3V0cHV0IHN0YXJ0IGVsZW1lbnQKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLAotICAgICAgICAgICAgICAgIG91dHB1dFhtbEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgb3V0cHV0WG1sRWxlbWVudC5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgaWYgKG91dHB1dFBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBudWxsIG1lYW5zIHRoaXMgaXMgdGhlIHZvaWQgdHlwZQotICAgICAgICAgICAgc2VyaWFsaXplUGFyYW1ldGVyKG9iamVjdCwgb3V0cHV0UGFyYW1ldGVyLCB3cml0ZXIsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNlcmFpbGl6ZSB0aGUgcGFyYW1ldGVyIG9iamVjdC4gcGFyYW1ldGVyIHJlcHJlc2VudHMgYW4geG1sIGVsZW1lbnQuCi0gICAgICogc28gaXQgYmFzaWNhbGx5IGNhbGxzIHRvIHRoZSBzZXJpYWxpemUgZWxlbWVudCBtZXRob2QuCi0gICAgICogQHBhcmFtIHBhcmFtZXRlclZhbHVlCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlUHJlZml4Ci0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplUGFyYW1ldGVyKE9iamVjdCBwYXJhbWV0ZXJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sCi0gICAgICAgICAgICBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIFFOYW1lIHBhcmFtZXRlclFOYW1lID0gbmV3IFFOYW1lKHBhcmFtZXRlci5nZXROYW1lc3BhY2UoKSwgcGFyYW1ldGVyLmdldE5hbWUoKSk7Ci0gICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQocGFyYW1ldGVyVmFsdWUsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyUU5hbWUsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4LAotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5pc0FycmF5KCksCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldENsYXNzVHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXJhaWxpemVzIGFuIGVsZW1lbnQuIGVsZW1lbnRzIGNhbiBlaXRoZXIgYmUgcGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gZWxlbWVudFZhbHVlCi0gICAgICogQHBhcmFtIGVsZW1lbnRRTmFtZQotICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZQotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlUHJlZml4Ci0gICAgICogQHBhcmFtIGlzQXJyYXkKLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlCi0gICAgICogQHRocm93cyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplRWxlbWVudChPYmplY3QgZWxlbWVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGVsZW1lbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsYXNzVHlwZSkKLSAgICAgICAgICAgIHRocm93cyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiwgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChlbGVtZW50VmFsdWUgPT0gbnVsbCkgfHwgIWlzQXJyYXkpIHsKLSAgICAgICAgICAgIC8vIHRoZW4gd2UgY2FuIHNlcmlhbGl6ZUlucHV0RWxlbWVudCBpdCBkaXJlY3RseSBlaXRoZXIgaXQgaXMgYXJyYXkgb3Igbm90Ci0gICAgICAgICAgICBzZXJpYWxpemUoZWxlbWVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIGlmICgoY2xhc3NUeXBlICYgQ29uc3RhbnRzLk1BUF9UWVBFKSA9PSBDb25zdGFudHMuTUFQX1RZUEUpIHsKLSAgICAgICAgICAgICAgICBNYXAgZWxlbWVudE1hcCA9IChNYXApIGVsZW1lbnRWYWx1ZTsKLSAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKG5ldyBNYXBUeXBlKGtleSwgZWxlbWVudE1hcC5nZXQoa2V5KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNsYXNzVHlwZSAmIENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUpID09IENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGEgTGlzdCB3ZSBjb252ZXJ0IHRoaXMgdG8gYW4gT2JqZWN0IGFycmF5Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBlbGVtZW50VmFsdWU7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudENvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZShpdGVyLm5leHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKGVsZW1lbnRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9iamVjdCA9IEFycmF5LmdldChlbGVtZW50VmFsdWUsIGkpOwotICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUob2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNlcmFpbGl6ZXMgdGhlIGdpdmVuIG9iamVjdCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgaW5mb3JtYXRpb24KLSAgICAgKiBnaXZlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QKLSAgICAgKiBAcGFyYW0gdHlwZQotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUk1JQmVhbikgewotICAgICAgICAgICAgUk1JQmVhbiBybWlCZWFuID0gKFJNSUJlYW4pIG9iamVjdDsKLSAgICAgICAgICAgIHJtaUJlYW4uc2VyaWFsaXplKHdyaXRlciwgdGhpcywgcGFyZW50UU5hbWUsIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudAotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cml0ZU51bGxBdHRyaWJ1dGUod3JpdGVyLCBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZXh0ZW5zaW9ucyBoZXJlLgotICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSBjYW4gbm90IGhhdmUgZXhjZW50ZWQgdHlwZXMKLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5nZXRDbGFzcygpLmVxdWFscyh0eXBlLmdldEphdmFDbGFzcygpKSAmJiAhdHlwZS5nZXRKYXZhQ2xhc3MoKS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NlZFR5cGVNYXAuY29udGFpbnNLZXkob2JqZWN0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUeXBlIG5ld1R5cGUgPSBuZXcgVHlwZUltcGwob2JqZWN0LmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQob2JqZWN0LmdldENsYXNzKCksIG5ld1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUeXBlLnBvcHVsYXRlTWV0YURhdGEodGhpcy5jb25maWd1cmF0b3IsIHRoaXMucHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZS5nZW5lcmF0ZVNjaGVtYSh0aGlzLmNvbmZpZ3VyYXRvciwgdGhpcy5zY2hlbWFNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCJQcm9ibGVtIGluIHByb2Nlc3NpbmcgbmV3IHR5cGUiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbigiUHJvYmxlbSBpbiBwcm9jZXNzaW5nIG5ldyB0eXBlIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChUeXBlKSBwcm9jZXNzZWRUeXBlTWFwLmdldChvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlVHlwZUF0dHJpYnV0ZSh3cml0ZXIsIHR5cGUuZ2V0WG1sVHlwZSgpLmdldFFuYW1lKCksIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0WG1sVHlwZSgpLmlzU2ltcGxlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBrbm93IHR5cGUgZm9yIHVzCi0gICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgc3RyaW5nIHJlcHJlc2VuYXRpb24gb2YgdGhpcyBvYmplY3QgdXNpbmcgY29udmVydGVyIHV0aWwgY2xhc3MuCi0gICAgICAgICAgICAgICAgICAgIGlmICghdHlwZS5nZXRKYXZhQ2xhc3MoKS5lcXVhbHMoT2JqZWN0LmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhnZXRTaW1wbGVUeXBlU3RyaW5nVmFsdWUodHlwZSwgb2JqZWN0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb21wbGV4IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRmllbGQgYXR0cmlidXRlRmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgZ2V0dGVyTWV0aG9kOwotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGF0dHJpYnV0ZUZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBhdHRyaWJ1dGVRTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGUuZ2V0QWxsQXR0cmlidXRlRmllbGRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlRmllbGQgPSAoQXR0cmlidXRlRmllbGQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlck1ldGhvZCA9IGF0dHJpYnV0ZUZpZWxkLmdldEdldHRlck1ldGhvZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpZWxkVmFsdWUgPSBnZXR0ZXJNZXRob2QuaW52b2tlKG9iamVjdCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lID0gbmV3IFFOYW1lKGF0dHJpYnV0ZUZpZWxkLmdldE5hbWVzcGFjZSgpLCBhdHRyaWJ1dGVGaWVsZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRvIHdyaXRlIGF0dHJpYnV0ZS4gZm9yIGF0dHJpYnV0ZXMgd2UgY2FuIGhhdmUgb25seSBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlRmllbGRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXR0cmlidXRlKHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaW1wbGVUeXBlU3RyaW5nVmFsdWUoYXR0cmlidXRlRmllbGQuZ2V0VHlwZSgpLCBhdHRyaWJ1dGVGaWVsZFZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlRmllbGQuaXNSZXF1cmllZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbigiQXR0cmlidXRlIHZhbHVlIGZvciBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlRmllbGQuZ2V0TmFtZSgpICsgIiBpcyByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgZWxlbWVudCBmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudEZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlLmdldEFsbEVsZW1lbnRGaWVsZHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQgPSAoRWxlbWVudEZpZWxkKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0ZXJNZXRob2QgPSBlbGVtZW50RmllbGQuZ2V0R2V0dGVyTWV0aG9kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkVmFsdWUgPSBnZXR0ZXJNZXRob2QuaW52b2tlKG9iamVjdCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnRGaWVsZChlbGVtZW50RmllbGRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oInByb2JsZW0gd2l0aCBtZXRob2QgaW5vdm9jYXRpb24gIiArIHR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oInByb2JsZW0gd2l0aCBtZXRob2QgaW5vdm9jYXRpb24gIiArIHR5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2ltcGxlVHlwZVN0cmluZ1ZhbHVlKFR5cGUgdHlwZSwgT2JqZWN0IG9iamVjdCkgdGhyb3dzIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2RUb0ludm9rZSA9IHRoaXMuc2ltcGxlVHlwZUhhbmRsZXJDbGFzcy5nZXRNZXRob2QoImNvbnZlcnRUb1N0cmluZyIsIG5ldyBDbGFzc1tde3R5cGUuZ2V0SmF2YUNsYXNzKCl9KTsKLSAgICAgICAgICAgIC8vIHRoZXNlIG1ldGhvZHMgYXJlIHN0YXRpYyBzbyB1c2UgbnVsbCBhcyB0aGUgb2JqZWN0IGFyZ3VtZW50Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbWV0aG9kVG9JbnZva2UuaW52b2tlKHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIsIG5ldyBPYmplY3RbXXtvYmplY3R9KTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbigiQ2FuIG5vdCBpbnZva2UgY29udmVydGVyIHV0aWwgbWV0aG9kIGNvbnZlcnRUb1N0cmluZyBmb3IgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICArIHR5cGUuZ2V0SmF2YUNsYXNzKCkuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oIkNhbiBub3QgaW52b2tlIGNvbnZlcnRlciB1dGlsIG1ldGhvZCBjb252ZXJ0VG9TdHJpbmcgZm9yIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgKyB0eXBlLmdldEphdmFDbGFzcygpLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSBjb252ZXJ0ZXIgdXRpbCBtZXRob2QgY29udmVydFRvU3RyaW5nIGZvciBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICsgdHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2Qgc2VyaWFsaXplcyB0aGUgYXR0cmlidXRlcyBieSBjYWxsaW5nIHRvIHNlcmlhbGl6ZSBlbGVtZW50IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbGVtZW50RmllbGRWYWx1ZQotICAgICAqIEBwYXJhbSBlbGVtZW50RmllbGQKLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVByZWZpeAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXJpYWxpemVFbGVtZW50RmllbGQoT2JqZWN0IGVsZW1lbnRGaWVsZFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudEZpZWxkIGVsZW1lbnRGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gewotCi0gICAgICAgIFFOYW1lIGVsZW1lbnRGaWVsZFFOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRGaWVsZC5nZXRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudEZpZWxkVmFsdWUsCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkUU5hbWUsCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldFR5cGUoKSwKLSAgICAgICAgICAgICAgICB3cml0ZXIsCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4LAotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZC5pc0FycmF5KCksCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldENsYXNzVHlwZSgpKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVN0YXJ0RWxlbWVudChYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMiICsgbmFtZXNwYWNlUHJlZml4LmdldE5hbWVzYXBjZVByZWZpeCgpOwotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsIGxvY2FsUGFydCwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGxvY2FsUGFydCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZVR5cGVBdHRyaWJ1dGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHR5cGVRbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHhzaVByZWZpeCA9IHdyaXRlci5nZXRQcmVmaXgoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICBpZiAoeHNpUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHhzaVByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVOYW1lc3BhY2UoeHNpUHJlZml4LCBDb25zdGFudHMuVVJJX0RFRkFVTFRfU0NIRU1BX1hTSSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHhzaVByZWZpeCwgQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0kpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSB3cml0ZXIuZ2V0UHJlZml4KHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGlmICh0eXBlUHJlZml4ID09IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGVQcmVmaXggPSAibnMiICsgbmFtZXNwYWNlUHJlZml4LmdldE5hbWVzYXBjZVByZWZpeCgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuc2V0UHJlZml4KHR5cGVQcmVmaXgsIHR5cGVRbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSB0eXBlUW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIGlmICghdHlwZVByZWZpeC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9IHR5cGVQcmVmaXggKyAiOiIgKyBhdHRyaWJ1dGVWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksICJ0eXBlIiwgYXR0cmlidXRlVmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZU51bGxBdHRyaWJ1dGUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUgPSBuZXcgUU5hbWUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksIm5pbCIpOwotICAgICAgICB3cml0ZUF0dHJpYnV0ZSh3cml0ZXIsIjEiLGF0dHJpYnV0ZVFOYW1lLG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBtZXRob2Qgd3J0ZXMgdGhlIHNpbXBsZSBhdHRyaWJ1dGUgdG8gdGhlIHdyaXRlci4KLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVZhbHVlCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZVFOYW1lCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVByZWZpeAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXR0cmlidXRlKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgYXR0cmlidXRlUU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBpZiAoKGF0dHJpYnV0ZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpICYmICFhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKS50cmltKCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gd3JpdGVyLmdldFByZWZpeChhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyIgKyBuYW1lc3BhY2VQcmVmaXguZ2V0TmFtZXNhcGNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKHByZWZpeCwgYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQcmVmaXgocHJlZml4LCBhdHRyaWJ1dGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoYXR0cmlidXRlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVRTmFtZS5nZXRMb2NhbFBhcnQoKSxhdHRyaWJ1dGVWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvT01FbGVtZW50Q3JlYXRvci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9PTUVsZW1lbnRDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDQyYzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9PTUVsZW1lbnRDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFiaW5kaW5nLnV0aWxzLndyaXRlci5NVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5PTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgb21FbGVtZW50cyBmcm9tIHRoZQotICogZGlmZmVyZXQgdHlwZXMgb2YgamF2YSBiZWFucwotICovCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50Q3JlYXRvciB7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldE9NRWxlbWVudChmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB0aHJvd3MgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIE9NRWxlbWVudCByZXR1cm5PTUVsZW1lbnQgPSBudWxsOwotICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIE1hcCBwcm9jZXNzZWRTY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgcGFyYW1ldGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkU2NoZW1hTWFwKTsKLQotICAgICAgICAgICAgZmluYWwgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIocHJvY2Vzc2VkU2NoZW1hTWFwLCBjb25maWd1cmF0b3IsIHByb2Nlc3NlZFNjaGVtYU1hcCk7Ci0KLSAgICAgICAgICAgIE9NRGF0YVNvdXJjZSBvbURhdGFTb3VyY2UgPSBuZXcgUk1JRGF0YVNvdXJjZSgpIHsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZVBhcmFtZXRlcih2YWx1ZSwgcGFyYW1ldGVyLCB4bWxXcml0ZXIsIG5ldyBOYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIlByb2JsZW0gaW4gcGFyc2luZyB0aGUgeG1sIHN0cmVhbSIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUocGFyYW1ldGVyLmdldE5hbWVzcGFjZSgpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybk9NRWxlbWVudCA9IG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChxbmFtZSwgT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksIG9tRGF0YVNvdXJjZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24oIlByb2JsZW0gaW4gbWV0YSBkYXRhIHBvcHVsYXRpb24iLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24oIlByb2JsZW0gaW4gU2NoZW1hIGdlbmVyYXRpb24iLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXR1cm5PTUVsZW1lbnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JNSUJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUk1JQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzY5NjMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUk1JQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLk5hbWVzcGFjZVByZWZpeDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLS8qKgotICogdGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBjdXN0b21pemUgdGhlCi0gKiB0aGUgZGVmYXVsdCB3YXkgYXhpczIgcm1pIHdvcmtzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUk1JQmVhbiB7Ci0KLSAgICAvKioKLSAgICAgKiBzZXJpYWxpemUgdGhlIGNsYXNzIGFjY29yZGluZ2x5LgotICAgICAqIHRoaXMgbWV0aG9kIHN1cHBvc2VkIHRvIHNlcmlhbGl6ZSB0aGlzIG9iamVjdCB0byB0aGUKLSAgICAgKiB3cml0ZXIuIFBhcmVudFFuYW1lIGlzIHBhc3NlZCBzbyB0aGF0IHRoaXMgbWV0aG9kIHNob3VsZCB3aXJ0ZQotICAgICAqIHRoZSBzdGFydCBhbmQgZW5kIGVsZW1lbnRzIGZvciB0aGUgYmVhbiBhcyB3ZWxsLgotICAgICAqIEBwYXJhbSB3cml0ZXIKLSAgICAgKiBAcGFyYW0gcGFyZW50UU5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBzZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9STUlEYXRhU291cmNlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JNSURhdGFTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4NTkzNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JNSURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMud3JpdGVyLk1UT01Bd2FyZVhNTFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJNSURhdGFTb3VyY2UgaW1wbGVtZW50cyBPTURhdGFTb3VyY2UgewotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIFhNTFN0cmVhbVdyaXRlciB4bWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIHNlcmlhbGl6ZSh4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgb21PdXRwdXRGb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBzZXJpYWxpemUoU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1UT01Bd2FyZVhNTFN0cmVhbVdyaXRlciBtdG9tQXdhcmVYTUxTdHJlYW1Xcml0ZXIgPSBuZXcgTVRPTUF3YXJlWE1MU2VyaWFsaXplcih4bWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICBzZXJpYWxpemUobXRvbUF3YXJlWE1MU3RyZWFtV3JpdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvLyBzaW5jZSBvbmx5IEFEQkJlYW5zIHJlbGF0ZWQgdG8gZWxlbWVudHMgY2FuIGJlIHNlcmlhbGl6ZWQKLSAgICAgICAgLy8gd2UgYXJlIHNhZmUgaW4gcGFzc2luZyBudWxsIGhlcmUuCi0gICAgICAgIE1UT01Bd2FyZU9NQnVpbGRlciBtdG9tQXdhcmVPTUJ1aWxkZXIgPSBuZXcgTVRPTUF3YXJlT01CdWlsZGVyKCk7Ci0gICAgICAgIHNlcmlhbGl6ZShtdG9tQXdhcmVPTUJ1aWxkZXIpOwotICAgICAgICByZXR1cm4gbXRvbUF3YXJlT01CdWlsZGVyLmdldE9NRWxlbWVudCgpLmdldFhNTFN0cmVhbVJlYWRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVUeXBlSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQxMWI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5Db252ZXJ0ZXJVdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIHRoaXMgY2xhc3MgaXMgdXNlZCB0byBoYW5kbGUgc2ltcGxlIHR5cGVzIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlSGFuZGxlciB7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8KLSAgICAvLyAgY29udmVydFRvU3RyaW5nIG1laHRvZHMKLSAgICAvLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGludCBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhmbG9hdCBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhsb25nIGkpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGRvdWJsZSBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhieXRlIGkpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKGNoYXIgaSkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoc2hvcnQgaSkgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcoaSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoYm9vbGVhbiBpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEYXRlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhCeXRlIG8pIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvU3RyaW5nKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEludGVnZXIgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoTG9uZyBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTaG9ydCBvKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEb3VibGUgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRmxvYXQgbykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9TdHJpbmcobyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vCi0gICAgLy8gIGNvbnZlcnRGcm9tU3RyaW5nIG1laHRvZHMKLSAgICAvLwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyBpbnQgY29udmVydFRvSW50KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0ludChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGNvbnZlcnRUb0RvdWJsZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9Eb3VibGUocyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGNvbnZlcnRUb0Zsb2F0KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0Zsb2F0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1N0cmluZyhzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBjb252ZXJ0VG9Mb25nKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0xvbmcocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHNob3J0IGNvbnZlcnRUb1Nob3J0KFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb1Nob3J0KHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNvbnZlcnRUb0Jvb2xlYW4oU3RyaW5nIHMpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRlclV0aWwuY29udmVydFRvQm9vbGVhbihzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZSBjb252ZXJ0VG9CeXRlKFN0cmluZyBzKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0ZXJVdGlsLmNvbnZlcnRUb0J5dGUocyk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgY29udmVydFRvRGF0ZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlKHMpOwotICAgIH0KLQotICAgIHB1YmxpYyBDYWxlbmRhciBjb252ZXJ0VG9EYXRlVGltZShTdHJpbmcgcykgewotICAgICAgICByZXR1cm4gQ29udmVydGVyVXRpbC5jb252ZXJ0VG9EYXRlVGltZShzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0OTE2Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1N0YXRlZnVsWE1MU3RyZWFtUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5Mb2NhdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7DQotDQotLyoqDQotICogU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgY2xhc3MgdGhhdCBwcmltYXJpbHkgZGVsZWdhdGVzIHRvIHRoZSBpbml0aWFsIHJlYWRlci4gSG93ZXZlciwgaW4gDQotICogYWRkaXRpb24gdG8gdGhlIG5vcm1hbCBmdW5jdGlvbnMgcGVyZm9ybWVkIGJ5IHRoZSBpbml0aWFsIHJlYWRlciwgYSBzdGFjayBpcyBhbHNvIG1haW50YWluZWQNCi0gKiB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc3RhdGUuDQotICovDQotcHVibGljIGNsYXNzIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIGltcGxlbWVudHMgWE1MU3RyZWFtUmVhZGVyIHsNCi0NCi0gICAgcHJvdGVjdGVkIFhNTFN0cmVhbVJlYWRlciBkZWxlZ2F0ZTsNCi0gICAgcHJpdmF0ZSBTdGFjayB0YWdTdGFjazsNCi0gICAgcHJpdmF0ZSBib29sZWFuIHByaW9yQWNjZXNzOw0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0IGEgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIuICBEbyBub3QgYXNzdW1lIHRoYXQgdGhlIHJlYWRlciBpcyBiZWluZw0KLSAgICAgKiBjb252ZXJ0ZWQgcHJpb3IgdG8gYWNjZXNzZWQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZWFkZXIgWE1MU3RyZWFtUmVhZGVyIGZvciB3aGljaCBhIHN0YXRlIGlzIGFsc28gbmVlZGVkLg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHsNCi0gICAgICAgIGRlbGVnYXRlID0gcmVhZGVyOw0KLSAgICAgICAgdGFnU3RhY2sgPSBuZXcgU3RhY2soKTsNCi0gICAgICAgIHByaW9yQWNjZXNzID0gdHJ1ZTsNCi0gICAgfQ0KLSAgICANCi0gICAgLyoqDQotICAgICAqIENvbnN0cnVjdCBhIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIFhNTFN0cmVhbVJlYWRlciBmb3Igd2hpY2ggYSBzdGF0ZSBpcyBhbHNvIG5lZWRlZC4NCi0gICAgICogQHBhcmFtIGF0MCBpbmRpY2F0ZXMgd2hldGhlciByZWFkZXIgaGFzIGJlZW4gYWR2YW5jZWQsIHdoaWNoIGluIHR1cm4gDQotICAgICAqICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGUgWE1MIHBhcnNpbmcgaXMgYXQgYW4gaW50ZXJtZWRpYXRlIHN0YXRlDQotICAgICAqICAgICAgICBwcmlvciB0byBiZWluZyBjb252ZXJ0ZWQgdG8gYSBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgKi8NCi0gICAgcHVibGljIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIGJvb2xlYW4gYXQwKSB7DQotICAgICAgICBkZWxlZ2F0ZSA9IHJlYWRlcjsNCi0gICAgICAgIHRhZ1N0YWNrID0gbmV3IFN0YWNrKCk7DQotICAgICAgICBwcmlvckFjY2VzcyA9ICFhdDA7DQotICAgIH0gICAgDQotDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlQ291bnQoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlQ291bnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUxvY2FsTmFtZShpbnQgYXJnMCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZUxvY2FsTmFtZShhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0QXR0cmlidXRlTmFtZShpbnQgYXJnMCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEF0dHJpYnV0ZU5hbWUoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lc3BhY2UoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVOYW1lc3BhY2UoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVQcmVmaXgoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVQcmVmaXgoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKGludCBhcmcwKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlVHlwZShhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKGludCBhcmcwKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QXR0cmlidXRlVmFsdWUoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBdHRyaWJ1dGVWYWx1ZShhcmcwLCBhcmcxKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENoYXJhY3RlckVuY29kaW5nU2NoZW1lKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50VGV4dCgpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEVsZW1lbnRUZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRFbmNvZGluZygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV2ZW50VHlwZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldExvY2FsTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBMb2NhdGlvbiBnZXRMb2NhdGlvbigpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRMb2NhdGlvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBRTmFtZSBnZXROYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgTmFtZXNwYWNlQ29udGV4dCBnZXROYW1lc3BhY2VDb250ZXh0KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZUNvbnRleHQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldE5hbWVzcGFjZUNvdW50KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE5hbWVzcGFjZUNvdW50KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VQcmVmaXgoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VQcmVmaXgoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TmFtZXNwYWNlVVJJKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXROYW1lc3BhY2VVUkkoYXJnMCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQSURhdGEoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UElEYXRhKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRQSVRhcmdldCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQSVRhcmdldCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByZWZpeCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGFyZzApIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFByb3BlcnR5KGFyZzApOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGNoYXJbXSBnZXRUZXh0Q2hhcmFjdGVycygpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0Q2hhcmFjdGVycygpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgZ2V0VGV4dENoYXJhY3RlcnMoaW50IGFyZzAsIGNoYXJbXSBhcmcxLCBpbnQgYXJnMiwgaW50IGFyZzMpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dENoYXJhY3RlcnMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFRleHRMZW5ndGgoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IGdldFRleHRTdGFydCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0U3RhcnQoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmVyc2lvbigpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWUoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGFzTmFtZSgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNOZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNUZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVTcGVjaWZpZWQoaW50IGFyZzApIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0F0dHJpYnV0ZVNwZWNpZmllZChhcmcwKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoYXJhY3RlcnMoKSB7DQotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNDaGFyYWN0ZXJzKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmRFbGVtZW50KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzRW5kRWxlbWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbmRhbG9uZSgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1N0YW5kYWxvbmUoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N0YXJ0RWxlbWVudCgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1N0YXJ0RWxlbWVudCgpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBib29sZWFuIGlzV2hpdGVTcGFjZSgpIHsNCi0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1doaXRlU3BhY2UoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgIGludCByZXR1cm5WYWx1ZSA9IGRlbGVnYXRlLm5leHQoKTsNCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGRlbGVnYXRlLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgUU5hbWUgdG9wID0gKFFOYW1lKSB0YWdTdGFjay5wZWVrKCk7DQotICAgICAgICAgICAgaWYgKCEoZGVsZWdhdGUuZ2V0TmFtZSgpLmVxdWFscyh0b3ApKSAmJiAhcHJpb3JBY2Nlc3MpIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGVuZCBlbGVtZW50ICgiICsgZGVsZWdhdGUuZ2V0TmFtZSgpICsgIikgZG9lcyBub3QgIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgImNvcnJlc3BvbmQgdG8gdGhlIGN1cnJlbnQgc3RhcnQgZWxlbWVudCAoIiArIHRvcCArICIpLiIpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBpZiAodGFnU3RhY2suc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgICAgICB0YWdTdGFjay5wb3AoKTsgICAgICAgIA0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXByaW9yQWNjZXNzKSB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFuIGVuZCBlbGVtZW50IHdhcyBlbmNvdW50ZXJlZCBmb3Igd2hpY2ggIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICsgInRoZXJlIHdhcyBub3QgYSBjb3JyZXNwb25kaW5nIHN0YXJ0IGVsZW1lbnQuIik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBlbHNlIGlmIChkZWxlZ2F0ZS5pc1N0YXJ0RWxlbWVudCgpKSB7DQotICAgICAgICAgICAgdGFnU3RhY2sucHVzaChkZWxlZ2F0ZS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBpbnQgbmV4dFRhZygpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm5leHRUYWcoKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXF1aXJlKGludCBhcmcwLCBTdHJpbmcgYXJnMSwgU3RyaW5nIGFyZzIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgZGVsZWdhdGUucmVxdWlyZShhcmcwLCBhcmcxLCBhcmcyKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgYm9vbGVhbiBzdGFuZGFsb25lU2V0KCkgew0KLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnN0YW5kYWxvbmVTZXQoKTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIGludCBnZXREZXB0aCgpIHsNCi0gICAgICAgIHJldHVybiB0YWdTdGFjay5zaXplKCk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9YbWxTdHJlYW1QYXJzZXIuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvWG1sU3RyZWFtUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2E4OWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9YbWxTdHJlYW1QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BdHRyaWJ1dGVGaWVsZDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuRWxlbWVudEZpZWxkOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5PcGVyYXRpb247DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudHlwZXMuTWFwVHlwZTsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuSmF2YVR5cGVUb1FOYW1lTWFwOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5Ow0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1wdWJsaWMgY2xhc3MgWG1sU3RyZWFtUGFyc2VyIHsNCi0NCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOw0KLSAgICBwcml2YXRlIE1hcCBxTmFtZVRvVHlwZU1hcDsNCi0gICAgcHJpdmF0ZSBTaW1wbGVUeXBlSGFuZGxlciBzaW1wbGVUeXBlSGFuZGxlcjsNCi0gICAgcHJpdmF0ZSBDbGFzcyBzaW1wbGVUeXBlSGFuZGxlckNsYXNzOw0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVhZGVyUHJpb3JBY2Nlc3M7DQotICAgIHByaXZhdGUgYm9vbGVhbiBwcmlvckFjY2Vzc0RldGVybWluZWQgPSBmYWxzZTsNCi0NCi0gICAgcHVibGljIFhtbFN0cmVhbVBhcnNlcihNYXAgcHJvY2Vzc2VkVHlwZU1hcCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXApIHsNCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOw0KLSAgICAgICAgdGhpcy5zaW1wbGVUeXBlSGFuZGxlciA9IHRoaXMuY29uZmlndXJhdG9yLmdldFNpbXBsZVR5cGVIYW5kbGVyKCk7DQotICAgICAgICB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyQ2xhc3MgPSB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyLmdldENsYXNzKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHBvcHVsYXRlUU5hbWVUb1R5cGVNYXAocHJvY2Vzc2VkVHlwZU1hcCwgc2NoZW1hTWFwKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gdGhpcyBleGNlcHRpb25zIGlzIG5vdCBnb2luZyB0byBoYXBwZW4NCi0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgdG8gZG8gdGhpcyBleGNlcHRpb25zIGlzIG5vdCBnb2luZyB0byBoYXBwZW4NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVRTmFtZVRvVHlwZU1hcChNYXAgcHJvY2Vzc2VkVHlwZU1hcCwgTWFwIHNjaGVtYU1hcCkNCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiwNCi0gICAgICAgICAgICBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsNCi0gICAgICAgIC8vIGZpcnN0IGFkZCBhbGwgdGhlIHByb2NlY2VkIHR5cGUgbWFwIHZhbHVlcw0KLSAgICAgICAgU2V0IGRlZmF1bHRUeXBlTWFwS2V5cyA9IEphdmFUeXBlVG9RTmFtZU1hcC5nZXRLZXlzKCk7DQotICAgICAgICBDbGFzcyB0eXBlQ2xhc3M7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWZhdWx0VHlwZU1hcEtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgdHlwZUNsYXNzID0gKENsYXNzKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICBpZiAoIXByb2Nlc3NlZFR5cGVNYXAuY29udGFpbnNLZXkodHlwZUNsYXNzKSkgew0KLSAgICAgICAgICAgICAgICBUeXBlIG5ld1R5cGUgPSBuZXcgVHlwZUltcGwodHlwZUNsYXNzKTsNCi0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQodHlwZUNsYXNzLCBuZXdUeXBlKTsNCi0gICAgICAgICAgICAgICAgbmV3VHlwZS5wb3B1bGF0ZU1ldGFEYXRhKHRoaXMuY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsNCi0gICAgICAgICAgICAgICAgbmV3VHlwZS5nZW5lcmF0ZVNjaGVtYSh0aGlzLmNvbmZpZ3VyYXRvciwgc2NoZW1hTWFwKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICB0aGlzLnFOYW1lVG9UeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIFR5cGUgdHlwZSA9IG51bGw7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jZXNzZWRUeXBlTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgIHR5cGUgPSAoVHlwZSkgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgdGhpcy5xTmFtZVRvVHlwZU1hcC5wdXQodHlwZS5nZXRYbWxUeXBlKCkuZ2V0UW5hbWUoKSwgdHlwZSk7DQotICAgICAgICB9DQotDQotICAgIH0NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPdXRwdXRPYmplY3QoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbikNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxQYXJzaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBudWxsOw0KLSAgICAgICAgDQotICAgICAgICBkZXRlcm1pbmVQcmlvckFjY2VzcyhyZWFkZXJfaW4pOw0KLSAgICAgICAgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZ2V0U3RhdGVmdWxSZWFkZXIocmVhZGVyX2luKTsNCi0gICAgICAgIA0KLSAgICAgICAgYWR2YW5jZVRvRmlyc3RFbGVtZW50KHJlYWRlcik7DQotDQotICAgICAgICAvLyBmaXJzdCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZ290IHRoZSBjb3JyZWN0IGlucHV0IGVsZW1lbnQgb3Igbm90DQotICAgICAgICBpZiAocmVhZGVyLmdldExvY2FsTmFtZSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWUoKSkgJiYNCi0gICAgICAgICAgICAgICAgcmVhZGVyLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWVzcGFjZSgpKSkgew0KLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRPdXRwdXRQYXJhbWV0ZXIoKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIG5vdCBhIHZvaWQgcmV0dXJuIHR5cGUNCi0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yUGFyYW1ldGVyKHJlYWRlciwgb3BlcmF0aW9uLmdldE91dHB1dFBhcmFtZXRlcigpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRJbnB1dFBhcmFtZXRlcnMoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKQ0KLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sDQotICAgICAgICAgICAgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7DQotDQotICAgICAgICBkZXRlcm1pbmVQcmlvckFjY2VzcyhyZWFkZXJfaW4pOw0KLSAgICAgICAgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gZ2V0U3RhdGVmdWxSZWFkZXIocmVhZGVyX2luKTsNCi0gICAgICAgIA0KLSAgICAgICAgTGlzdCByZXR1cm5PYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgYWR2YW5jZVRvRmlyc3RFbGVtZW50KHJlYWRlcik7DQotDQotICAgICAgICAvLyBmaXJzdCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZ290IHRoZSBjb3JyZWN0IGlucHV0IGVsZW1lbnQgb3Igbm90DQotICAgICAgICBpZiAocmVhZGVyLmdldExvY2FsTmFtZSgpLmVxdWFscyhvcGVyYXRpb24uZ2V0SW5wdXRFbGVtZW50KCkuZ2V0TmFtZSgpKSAmJg0KLSAgICAgICAgICAgICAgICByZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG9wZXJhdGlvbi5nZXRJbnB1dEVsZW1lbnQoKS5nZXROYW1lc3BhY2UoKSkpIHsNCi0gICAgICAgICAgICAvLyBwb2ludCB0aGUgcmVhZGVyIHRvIHBhcmFtZXRlcnMNCi0gICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBudWxsOw0KLSAgICAgICAgICAgIExpc3QgaW5wdXRQYXJhbWV0ZXJzID0gb3BlcmF0aW9uLmdldElucHV0UGFyYW1ldGVycygpOw0KLSAgICAgICAgICAgIFFOYW1lIHBhcmFtZXRlclFOYW1lID0gbnVsbDsNCi0gICAgICAgICAgICBpbnQgc3RhcnREZXB0aCA9IHJlYWRlci5nZXREZXB0aCgpOw0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGlucHV0UGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyID0gKFBhcmFtZXRlcikgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIHBhcmFtZXRlclFOYW1lID0gbmV3IFFOYW1lKHBhcmFtZXRlci5nZXROYW1lc3BhY2UoKSwgcGFyYW1ldGVyLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdHMuYWRkKGdldE9iamVjdEZvclBhcmFtZXRlcihyZWFkZXIsIHBhcmFtZXRlcikpOw0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBwYXJhbWV0ZXINCi0gICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSBtb3ZlIGl0IHRvIG5leHQgZWxlbWVudC4NCi0gICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSAmJiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhwYXJhbWV0ZXJRTmFtZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVhZGVyUHJpb3JBY2Nlc3MgfHwgcmVhZGVyLmdldERlcHRoKCkgPT0gc3RhcnREZXB0aCAtIDEpKXsNCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJVbmV4cGVjdGVkIFN1YmVsZW1lbnQgIiArIHJlYWRlci5nZXROYW1lKCkgKyAiIGJ1dCAiICsNCi0gICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAiICsgb3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLmdldE5hbWUoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0cy50b0FycmF5KCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbG9naWMgYXMgdGhlIGF0dHJpYnV0ZS4gc28gcmVhZGVyIHByZSBhbmQgcG9zdCBjb25kaXRpb25zIHNhbWUuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZWFkZXINCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcg0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgWG1sUGFyc2luZ0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3RGb3JQYXJhbWV0ZXIoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlcikNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgUU5hbWUgcGFyYW1ldGVyUU5hbWUgPSBuZXcgUU5hbWUocGFyYW1ldGVyLmdldE5hbWVzcGFjZSgpLCBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsNCi0gICAgICAgIA0KLSAgICAgICAgZGV0ZXJtaW5lUHJpb3JBY2Nlc3MocmVhZGVyX2luKTsNCi0gICAgICAgIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGdldFN0YXRlZnVsUmVhZGVyKHJlYWRlcl9pbik7DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBnZXRPYmplY3RGb3JFbGVtZW50KHJlYWRlciwNCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVyUU5hbWUsDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRUeXBlKCksDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5pc0FycmF5KCksDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRFbGVtZW50KCkuaXNOaWxsYWJsZSgpLA0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0RWxlbWVudCgpLmlzTWluT2NjdXJzMCgpLA0KLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0Q2xhc3NUeXBlKCksDQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRKYXZhQ2xhc3MoKSk7DQotDQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHdoZW4gY2FsbHMgdG8gdGhpcyBtZXRob2QgcmVhZGVyIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0eXBlLg0KLSAgICAgKiBpZiBpdCBpcyBhIHNpbXBsZSB0eXBlIGl0IHBvaW50cyB0aGUgdGhlIHRleHQNCi0gICAgICogaWYgaXQgaXMgYSBjb21wbGV4IHR5cGUgaXQgcG9pbnRzIHRvIHRoZSBzdGFydCBlbGVtZW50IG9mIHRoZSBmaXJzdCBhdHRyaWJ1dGUuIGFuZCB3ZSByZXR1cm5pbmcNCi0gICAgICogZnJvbSB0aGUgbWV0aG9kIGl0IHNob3VsZCBwb2ludCB0byB0aGUgZW5kIGVsZW1lbnQgb2YgdGhlIGxhc3QgcGFyYW1ldGVyLg0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyDQotICAgICAqIEBwYXJhbSB0eXBlDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uDQotICAgICAqLw0KLQ0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEZvclR5cGUoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcl9pbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSkNCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLA0KLSAgICAgICAgICAgIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICBkZXRlcm1pbmVQcmlvckFjY2VzcyhyZWFkZXJfaW4pOw0KLSAgICAgICAgICAgIFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciA9IGdldFN0YXRlZnVsUmVhZGVyKHJlYWRlcl9pbik7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdCA9IG51bGw7DQotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0WG1sVHlwZSgpLmlzU2ltcGxlVHlwZSgpKSB7DQotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzaW1wbGUga25vd24gdHlwZSBmb3IgdXMNCi0gICAgICAgICAgICAgICAgLy8gY29uc3RydWN0b3Igc2hvdWxkIGJlIGFibGUgdG8gaW52b2tlIHdpdGggdGhlIHN0cmluZy4NCi0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKE9iamVjdC5jbGFzcykpIHsNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IG5ldyBPYmplY3QoKTsNCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIG9iamVjdCBmb3IgdGhpcyBzdHJpbmcgdXNpbmcgY29udmVydGVyIHV0aWwgY2xhc3Nlcw0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0U2ltcGxlVHlwZU9iamVjdCh0eXBlLCByZWFkZXIsIHJlYWRlci5nZXRUZXh0KCkpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgLy8gZmlyc3Qgd2UgaGF2ZSB0byBwb2ludCB0byB0aGUgcmVhZGVyIHRvIHRoZSBiZWdpbm5pbmcgZm9yIHRoZSBlbGVtZW50DQotICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBpbnQgc3RhcnREZXB0aCA9IHJlYWRlci5nZXREZXB0aCgpOw0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgY29tcGxleCB0eXBlDQotICAgICAgICAgICAgICAgIHJldHVybk9iamVjdCA9IHR5cGUuZ2V0SmF2YUNsYXNzKCkubmV3SW5zdGFuY2UoKTsNCi0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBnZXQgYWxsIHRoZSBlbGVtZW50RmllbGQgYW5kIHBvcHVsYXRlIHRoZW0NCi0gICAgICAgICAgICAgICAgTGlzdCBlbGVtZW50RmllbGRzID0gdHlwZS5nZXRBbGxFbGVtZW50RmllbGRzKCk7DQotICAgICAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQ7DQotICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50RmllbGRPYmplY3Q7DQotICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRGaWVsZFFOYW1lID0gbnVsbDsNCi0NCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEZpZWxkcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCA9IChFbGVtZW50RmllbGQpIGl0ZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yRWxlbWVudEZpZWxkKHJlYWRlciwgZWxlbWVudEZpZWxkKTsNCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZFFOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRGaWVsZC5nZXROYW1lc3BhY2UoKSwgZWxlbWVudEZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEZpZWxkT2JqZWN0ICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0U2V0dGVyTWV0aG9kKCkuaW52b2tlKHJldHVybk9iamVjdCwgbmV3IE9iamVjdFtde2VsZW1lbnRGaWVsZE9iamVjdH0pOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlYWRlciBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudEZpZWxkDQotICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIG1vdmUgaXQgdG8gbmV4dCBlbGVtZW50Lg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSAmJiByZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50RmllbGRRTmFtZSkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChyZWFkZXJQcmlvckFjY2VzcyB8fCByZWFkZXIuZ2V0RGVwdGgoKSA9PSBzdGFydERlcHRoIC0gMSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIHJldHVybk9iamVjdDsNCi0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDb25zdHJ1Y3RvciBpbnZva2luZyBleGNlcHRpb24gZm9yIHR5cGUgIiArIHR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDb25zdHJ1Y3RvciBpbnZva2luZyBleGNlcHRpb24gZm9yIHR5cGUgIiArIHR5cGUuZ2V0TmFtZSgpKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkNvbnN0cnVjdG9yIGludm9raW5nIGV4Y2VwdGlvbiBmb3IgdHlwZSAiICsgdHlwZS5nZXROYW1lKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgT2JqZWN0IGdldFNpbXBsZVR5cGVPYmplY3QoVHlwZSB0eXBlLCBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIFN0cmluZyB2YWx1ZSkNCi0gICAgICAgICAgICB0aHJvd3MgIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdDsNCi0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbnVsbDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IGdldE1ldGhvZE5hbWUodHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCkpOw0KLSAgICAgICAgICAgIE1ldGhvZCAgbWV0aG9kVG9JbnZva2UgPSB0aGlzLnNpbXBsZVR5cGVIYW5kbGVyQ2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsbmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7DQotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gbWV0aG9kVG9JbnZva2UuaW52b2tlKHRoaXMuc2ltcGxlVHlwZUhhbmRsZXIsbmV3IE9iamVjdFtde3ZhbHVlfSk7DQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSB0aGUgY29udmVydGVyIHV0aWwgY2xhc3MgbWV0aG9kICIgKyBtZXRob2ROYW1lLCBlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7DQotICAgICAgICAvLyBmaXJzdCBoYW5kbGUgc29tZSBleGNlcHRpb25hbCBjbGFzc2VzDQotICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpIHsNCi0gICAgICAgICAgICByZXR1cm4gImNvbnZlcnRUb0ludCI7DQotICAgICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZS5lcXVhbHMoQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpKSkgew0KLSAgICAgICAgICAgIHJldHVybiAiY29udmVydFRvRGF0ZVRpbWUiOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCIuIikgPiAtMSkgew0KLSAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsNCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHByaW1pdGl2ZSB0eXBlIGNsYXNzDQotICAgICAgICAgICAgLy8gc28gY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyDQotICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgY2xhc3NOYW1lLnN1YnN0cmluZygxKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiAiY29udmVydFRvIiArIGNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogZ2l2ZSB0aGUgcmVsZXZhbnQgb2JqZWN0IGZvciBlbGVtZW50RmllbGQuDQotICAgICAqDQotICAgICAqIEBwYXJhbSByZWFkZXINCi0gICAgICogQHBhcmFtIGVsZW1lbnRGaWVsZA0KLSAgICAgKiBAcmV0dXJuDQotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uDQotICAgICAqIEB0aHJvd3MgWG1sUGFyc2luZ0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0Rm9yRWxlbWVudEZpZWxkKFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQpDQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwNCi0gICAgICAgICAgICBYbWxQYXJzaW5nRXhjZXB0aW9uIHsNCi0gICAgICAgIFFOYW1lIGVsZW1lbnRGaWVsZFFOYW1lID0gbmV3IFFOYW1lKGVsZW1lbnRGaWVsZC5nZXROYW1lc3BhY2UoKSwgZWxlbWVudEZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICByZXR1cm4gZ2V0T2JqZWN0Rm9yRWxlbWVudChyZWFkZXIsDQotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZFFOYW1lLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0VHlwZSgpLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuaXNBcnJheSgpLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0RWxlbWVudCgpLmlzTmlsbGFibGUoKSwNCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldEVsZW1lbnQoKS5pc01pbk9jY3VyczAoKSwNCi0gICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdldENsYXNzVHlwZSgpLA0KLSAgICAgICAgICAgICAgICBlbGVtZW50RmllbGQuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuZ2V0UHJvcGVydHlUeXBlKCkpOw0KLQ0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBlbGVtZW50IHBhcnNlciBjb3JyZXNwb25kcyB0byBwYXJzZSB0aGUgZWxlbWVudCAoZm9yIGFuIGF0dHJpYnV0ZSBvciBwYXJhbWV0ZXIpIGNvcnJlY3RseS4NCi0gICAgICogd2hlbiBjYWxsaW5nIHRvIHRoaXMgbWV0aG9kIHJlYWRlciBtdXN0IHBvaW50IHRvIHRoZSBzdGFydCBlbGVtZW50IG9mIHRoZSBlbGVtZW50LiBhbmQgd2hlbiByZXR1cm5pbmcNCi0gICAgICogaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIGVuZCBlbGVtZW50IG9mIHRoZSBlbGVtZW50Lg0KLSAgICAgKiBpZiB0aGUgZWxlbWVudCBpcyBhbiBhcnJheSBpdCBtYXkgcG9pbnQgdG8gdGhlIHN0YXJ0IGVsZW1lbnQgb2YgdGhlIG5leHQgZWxlbWVudC4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHJlYWRlcg0KLSAgICAgKiBAcGFyYW0gZWxlbWVudFFOYW1lDQotICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZQ0KLSAgICAgKiBAcGFyYW0gaXNBcnJheQ0KLSAgICAgKiBAcGFyYW0gY2xhc3NUeXBlDQotICAgICAqIEBwYXJhbSBqYXZhQ2xhc3MgLSBpZiB0aGlzIGlzIGEgbGlzdCBqYXZhQ2xhc3MgZm9yIHRoZSBsaXN0DQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24NCi0gICAgICogQHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uDQotICAgICAqLw0KLQ0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRPYmplY3RGb3JFbGVtZW50KFN0YXRlZnVsWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50UU5hbWUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBlbGVtZW50VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQXJyYXksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc05pbGxhYmxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNNaW5PY2N1cnMwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGFzc1R5cGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgamF2YUNsYXNzKQ0KLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sDQotICAgICAgICAgICAgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7DQotICAgICAgICAvLyBmaXJzdCB3ZSBoYXZlIHRvIHBvaW50IHRvIHRoZSByZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBmb3IgdGhlIGVsZW1lbnQNCi0gICAgICAgIHdoaWxlICghcmVhZGVyLmlzU3RhcnRFbGVtZW50KCkgJiYgIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLyBmaXJzdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlDQotICAgICAgICBpZiAocmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgew0KLQ0KLSAgICAgICAgICAgIFN0cmluZyBuaWxsYmxlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKENvbnN0YW50cy5VUklfREVGQVVMVF9TQ0hFTUFfWFNJLCAibmlsIik7DQotICAgICAgICAgICAgLy8gYWN0dWFsIGVsZW1lbnQgdHlwZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGVsZW1lbnQgdHlwZSBnaXZlbg0KLSAgICAgICAgICAgIC8vIGlmIGV4dGVuc2lvbnMgaGFzIHVzZWQuDQotICAgICAgICAgICAgVHlwZSBhY3R1YWxFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOw0KLSAgICAgICAgICAgIFFOYW1lIHR5cGVRTmFtZSA9IGdldFR5cGVRTmFtZShyZWFkZXIpOw0KLSAgICAgICAgICAgIGlmICgodHlwZVFOYW1lICE9IG51bGwpICYmICFlbGVtZW50VHlwZS5nZXRYbWxUeXBlKCkuZ2V0UW5hbWUoKS5lcXVhbHModHlwZVFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyBhbiBleHRlbnNpb24gdHlwZQ0KLSAgICAgICAgICAgICAgICBpZiAodGhpcy5xTmFtZVRvVHlwZU1hcC5jb250YWluc0tleSh0eXBlUU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICBhY3R1YWxFbGVtZW50VHlwZSA9IChUeXBlKSB0aGlzLnFOYW1lVG9UeXBlTWFwLmdldCh0eXBlUU5hbWUpOw0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVua25vd24gdHlwZSBmb3VuZCA9PT4gIiArIHR5cGVRTmFtZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGNvbXBsZXggdHlwZSBlbGVtZW50cw0KLSAgICAgICAgICAgIGlmIChpc0FycmF5KSB7DQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gb2JqZWN0c0NvbGxlY3Rpb24gPSBnZXRDb2xsZWN0aW9uT2JqZWN0KGNsYXNzVHlwZSwgamF2YUNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhuaWxsYmxlKSB8fCAiMSIuZXF1YWxzKG5pbGxibGUpKSB7DQotICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbmlsbCBhdHRyaWJ1dGUNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc05pbGxhYmxlKXsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uLmFkZChudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiRWxlbWVudCAiICsgZWxlbWVudFFOYW1lICsgIiBjYW4gbm90IGJlIG51bGwiKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0NCi0gICAgICAgICAgICAgICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBnZXRFbGVtZW50T2JqZWN0RnJvbVJlYWRlcihhY3R1YWxFbGVtZW50VHlwZSwgcmVhZGVyKTsNCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uLmFkZChyZXR1cm5PYmplY3QpOw0KLQ0KLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBtb3ZlIHRoZSBjdXJzb3IgdW50aWwgdGhlIGVuZCBlbGVtZW50IG9mIHRoaXMgYXR0cmlidXRlDQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSB8fCAhcmVhZGVyLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFFOYW1lKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsb29wID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgd2hpbGUgKGxvb3ApIHsNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgYXJlIGF0IHRoZSBlbmQgZWxlbWVudCBvZiB0aGUgZmlyc3QgZWxlbWVudA0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNTdGFydEVsZW1lbnQoKSAmJiAhcmVhZGVyLmlzRW5kRWxlbWVudCgpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgc3RlcCBpZiBpdCBpcyBhbiBlbmQgZWxlbWVudCB3ZSBoYXZlIGZvdW5kIGFuIGVuZCBlbGVtZW50DQotICAgICAgICAgICAgICAgICAgICAvLyBzbyBoYXZlIHRvIGV4aXQgZnJvbSB0aGUgbG9vcA0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgPSBmYWxzZTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGl0IHNob3VsZCBiZSBpbiBhIHN0YXJ0IGVsZW1lbnQNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHN0aWxsIHdlIHJlYWQgdGhlIG9yaWdpbmFsIGVsZW1lbnQgYXR0cmlidXRlcy4gb3RoZXJ3aXNlIHJldHVybg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50UU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbGxibGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoQ29uc3RhbnRzLlVSSV9ERUZBVUxUX1NDSEVNQV9YU0ksICJuaWwiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhIG5ldyBlbGVtZW50IHdlIGNoZWNrIGZvciBleHRlbnNpb25zDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVRTmFtZSA9IGdldFR5cGVRTmFtZShyZWFkZXIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGVRTmFtZSAhPSBudWxsKSAmJiAhZWxlbWVudFR5cGUuZ2V0WG1sVHlwZSgpLmdldFFuYW1lKCkuZXF1YWxzKHR5cGVRTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiB0eXBlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5xTmFtZVRvVHlwZU1hcC5jb250YWluc0tleSh0eXBlUU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRWxlbWVudFR5cGUgPSAoVHlwZSkgdGhpcy5xTmFtZVRvVHlwZU1hcC5nZXQodHlwZVFOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVua25vd24gdHlwZSBmb3VuZCA9PT4gIiArIHR5cGVRTmFtZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGJsZSkgfHwgIjEiLmVxdWFscyhuaWxsYmxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5pbGwgYXR0cmlidXRlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOaWxsYWJsZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uLmFkZChudWxsKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkVsZW1lbnQgIiArIGVsZW1lbnRRTmFtZSArICIgY2FuIG5vdCBiZSBudWxsIik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0RWxlbWVudE9iamVjdEZyb21SZWFkZXIoYWN0dWFsRWxlbWVudFR5cGUsIHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzQ29sbGVjdGlvbi5hZGQocmV0dXJuT2JqZWN0KTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gbW92ZSB0aGUgY3Vyc29yIHVudGlsIHRoZSBlbmQgZWxlbWVudCBvZiB0aGlzIGF0dHJpYnV0ZQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkgfHwgIXJlYWRlci5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRRTmFtZSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHZlcnkgaW1wb3J0YW50IGluIGhhbmRsaW5nIHByaW1pdGl2ZXMNCi0gICAgICAgICAgICAgICAgLy8gdGhleSBjYW4gbm90IGhhdmUgbnVsbCB2YWx1ZXMgc28gaWYgYXJyYXkgdGhlbiB3ZSBoYXZlIHRvIHJldHVybiB0aGUNCi0gICAgICAgICAgICAgICAgLy8gYXJyYXkgb2JqZWN0IGlzIG51bGwNCi0gICAgICAgICAgICAgICAgLy8gZm9yIG90aGVyIGFsc28gaXQgaXMgY29udmVuaWVudCB0byBhc3N1bWUgbGlrZSB0aGF0Lg0KLSAgICAgICAgICAgICAgICBpZiAoKENvbnN0YW50cy5PVEhFUl9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuT1RIRVJfVFlQRSl7DQotICAgICAgICAgICAgICAgICAgICAvLyBpLmUgdGhpcyBpcyBub3QgYSBjb2xsZWN0aW9uIHR5cGUNCi0gICAgICAgICAgICAgICAgICAgIExpc3Qgb2JqZWN0c0xpc3QgPSAoTGlzdCkgb2JqZWN0c0NvbGxlY3Rpb247DQotICAgICAgICAgICAgICAgICAgICBpZiAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAxKSAmJiAob2JqZWN0c0xpc3QuZ2V0KDApID09IG51bGwpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gYXJyYXkgd2l0aCB0aGUgb3JpZ2luYWwgZWxlbWVudCB0eXBlDQotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdEFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoZWxlbWVudFR5cGUuZ2V0SmF2YUNsYXNzKCksIG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzQ29sbGVjdGlvbi5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zZXQob2JqZWN0QXJyYXksIGksIG9iamVjdHNMaXN0LmdldChpKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RBcnJheTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSAmIGNsYXNzVHlwZSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSl7DQotICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmplY3RzQ29sbGVjdGlvbi5zaXplKCkgPT0gMCkgfHwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob2JqZWN0c0NvbGxlY3Rpb24uc2l6ZSgpID09IDEpICYmIChvYmplY3RzQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSA9PSBudWxsKSkpew0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0c0NvbGxlY3Rpb247DQotICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChDb25zdGFudHMuTUFQX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5NQVBfVFlQRSl7DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB8fA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9iamVjdHNDb2xsZWN0aW9uLnNpemUoKSA9PSAxKSAmJiAob2JqZWN0c0NvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkgPT0gbnVsbCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotDQotICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgbWFwT2JqZWN0c0xpc3QgPSAoTGlzdCkgb2JqZWN0c0NvbGxlY3Rpb247DQotICAgICAgICAgICAgICAgICAgICAgICAgTWFwVHlwZSBtYXBUeXBlID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAgbWFwT2JqZWN0ID0gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamF2YUNsYXNzLmlzSW50ZXJmYWNlKCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2JqZWN0ID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2JqZWN0ID0gKE1hcCkgamF2YUNsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkNhbiBub3QgaW5zdGFudGlhdGUgdGhlIGphdmEgY2xhc3MgIiArIGphdmFDbGFzcy5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IGluc3RhbnRpYXRlIHRoZSBqYXZhIGNsYXNzICIgKyBqYXZhQ2xhc3MuZ2V0TmFtZSgpLCBlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXBPYmplY3RzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVHlwZSA9IChNYXBUeXBlKSBpdGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwT2JqZWN0LnB1dChtYXBUeXBlLmdldEtleSgpLCBtYXBUeXBlLmdldFZhbHVlKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwT2JqZWN0Ow0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVua25vdyBjbGFzcyB0eXBlICIgKyBjbGFzc1R5cGUpOw0KLSAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMobmlsbGJsZSkgfHwgIjEiLmVxdWFscyhuaWxsYmxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIG5pbGwgYXR0cmlidXRlDQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmlsbGFibGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkVsZW1lbnQgIiArIGVsZW1lbnRRTmFtZSArICIgY2FuIG5vdCBiZSBudWxsIik7DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotDQotICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0RWxlbWVudE9iamVjdEZyb21SZWFkZXIoYWN0dWFsRWxlbWVudFR5cGUsIHJlYWRlcik7DQotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIG1vdmUgdGhlIGN1cnNvciB1bnRpbCB0aGUgZW5kIGVsZW1lbnQgb2YgdGhpcyBhdHRyaWJ1dGUNCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghcmVhZGVyLmlzRW5kRWxlbWVudCgpIHx8ICFyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50UU5hbWUpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5PYmplY3Q7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGlmIChpc01pbk9jY3VyczApIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlVuZXhwZWN0ZWQgU3ViZWxlbWVudCAiICsgcmVhZGVyLmdldE5hbWUoKSArICIgYnV0ICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAiICsgZWxlbWVudFFOYW1lLmdldExvY2FsUGFydCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0RWxlbWVudE9iamVjdEZyb21SZWFkZXIoVHlwZSBlbGVtZW50VHlwZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKQ0KLSAgICAgICAgICAgIHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgT2JqZWN0IHJldHVybk9iamVjdCA9IG51bGw7DQotICAgICAgICBpZiAoUk1JQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGVsZW1lbnRUeXBlLmdldEphdmFDbGFzcygpKSkgew0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gcm1pIGJlYW4NCi0gICAgICAgICAgICAvLyBzbyBpbnZva2UgdGhlIHN0YXRpYyBwYXJzZSBtZXRob2QNCi0gICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICBNZXRob2QgcGFyc2VNZXRob2QgPSBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXRNZXRob2QoInBhcnNlIiwgbmV3IENsYXNzW117WE1MU3RyZWFtUmVhZGVyLmNsYXNzLCBYbWxTdHJlYW1QYXJzZXIuY2xhc3N9KTsNCi0gICAgICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gcGFyc2VNZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtyZWFkZXIsIHRoaXN9KTsNCi0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigicGFyc2UgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCBjb3JyZWN0bHkgZm9yIHRoZSBybWkgYmVhbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiY2FuIG5vdCBhY2Nlc3MgcGFyc2UgbWV0aG9kIG9mIHRoZSBybWkgYmVhbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiY2FuIG5vdCBpbnZva2UgcGFyc2UgbWV0aG9kIG9mIHRoZSBybWkgYmVhbiAiDQotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGVtZW50VHlwZS5nZXRKYXZhQ2xhc3MoKS5nZXROYW1lKCksIGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgLy8gcmVhZCB0aGUgYXR0cmlidXRlcy4NCi0gICAgICAgICAgICBNYXAgamF2YU1ldGhvZFRvVmFsdWVNYXAgPSBnZXRKYXZhTWV0aG9kVmFsdWVIYXNoTWFwKGVsZW1lbnRUeXBlLCByZWFkZXIpOw0KLSAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7DQotICAgICAgICAgICAgcmV0dXJuT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yVHlwZShyZWFkZXIsIGVsZW1lbnRUeXBlKTsNCi0gICAgICAgICAgICBwb3B1bGF0ZU9iamVjdEF0dHJpYnV0ZXMoamF2YU1ldGhvZFRvVmFsdWVNYXAsIHJldHVybk9iamVjdCk7DQotICAgICAgICB9DQotDQotICAgICAgICByZXR1cm4gcmV0dXJuT2JqZWN0Ow0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZU9iamVjdEF0dHJpYnV0ZXMoTWFwIGphdmFNZXRob2RUb1ZhbHVlTWFwLCBPYmplY3QgcmV0dXJuT2JqZWN0KSB0aHJvd3MgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7DQotICAgICAgICBNZXRob2QgamF2YU1laHRvZDsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gamF2YU1ldGhvZFRvVmFsdWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspew0KLSAgICAgICAgICAgICAgICBqYXZhTWVodG9kID0gKE1ldGhvZCkgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgIGphdmFNZWh0b2QuaW52b2tlKHJldHVybk9iamVjdCxuZXcgT2JqZWN0W117amF2YU1ldGhvZFRvVmFsdWVNYXAuZ2V0KGphdmFNZWh0b2QpfSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIkNhbiBub3Qgc2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUiKTsNCi0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJDYW4gbm90IHNldCB0aGUgYXR0cmlidXRlIHZhbHVlIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXAgZ2V0SmF2YU1ldGhvZFZhbHVlSGFzaE1hcChUeXBlIGFjdHVhbEVsZW1lbnRUeXBlLCBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciByZWFkZXIpDQotICAgICAgICAgICAgdGhyb3dzIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLSAgICAgICAgQXR0cmlidXRlRmllbGQgYXR0cmlidXRlRmllbGQ7DQotICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmxhdWU7DQotICAgICAgICBPYmplY3QgYXR0cmlidXRlT2JqZWN0Ow0KLSAgICAgICAgTWFwIGphdmFNZXRob2RUb1ZhbHVlTWFwID0gbmV3IEhhc2hNYXAoKTsNCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFjdHVhbEVsZW1lbnRUeXBlLmdldEFsbEF0dHJpYnV0ZUZpZWxkcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsNCi0gICAgICAgICAgICBhdHRyaWJ1dGVGaWVsZCA9IChBdHRyaWJ1dGVGaWVsZCkgaXRlci5uZXh0KCk7DQotICAgICAgICAgICAgYXR0cmlidXRlVmxhdWUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlRmllbGQuZ2V0TmFtZXNwYWNlKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpZWxkLmdldE5hbWUoKSk7DQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVZsYXVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgYXR0cmlidXRlT2JqZWN0ID0gZ2V0U2ltcGxlVHlwZU9iamVjdChhdHRyaWJ1dGVGaWVsZC5nZXRUeXBlKCksIHJlYWRlciwgYXR0cmlidXRlVmxhdWUpOw0KLSAgICAgICAgICAgICAgICBqYXZhTWV0aG9kVG9WYWx1ZU1hcC5wdXQoYXR0cmlidXRlRmllbGQuZ2V0U2V0dGVyTWV0aG9kKCksIGF0dHJpYnV0ZU9iamVjdCk7DQotICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVGaWVsZC5pc1JlcXVyaWVkKCkpew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUGFyc2luZ0V4Y2VwdGlvbigiUmVxdWlyZWQgYXR0cmlidXRlICIgKyBhdHRyaWJ1dGVGaWVsZC5nZXROYW1lKCkgKyAiIGlzIG1pc3NpbmciKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gamF2YU1ldGhvZFRvVmFsdWVNYXA7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2JqZWN0IGFjY29yZGluZyB0byB0aGUgdHlwZS4NCi0gICAgICogQHBhcmFtIGNsYXNzVHlwZQ0KLSAgICAgKiBAcGFyYW0gamF2YUNsYXNzDQotICAgICAqIEByZXR1cm4NCi0gICAgICogQHRocm93cyBYbWxQYXJzaW5nRXhjZXB0aW9uDQotICAgICAqLw0KLQ0KLSAgICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q29sbGVjdGlvbk9iamVjdChpbnQgY2xhc3NUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBqYXZhQ2xhc3MpDQotICAgICAgICAgICAgdGhyb3dzIFhtbFBhcnNpbmdFeGNlcHRpb24gew0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbiBvYmplY3RzQ29sbGVjdGlvbiA9IG51bGw7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIGlmICgoQ29uc3RhbnRzLk9USEVSX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5PVEhFUl9UWVBFKSB7DQotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIG5vdCBhIGxpc3Qgb3IgYSBtYXANCi0gICAgICAgICAgICAgICAgb2JqZWN0c0NvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7DQotICAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgICAgaWYgKGphdmFDbGFzcy5pc0ludGVyZmFjZSgpKSB7DQotICAgICAgICAgICAgICAgICAgICBpZiAoKENvbnN0YW50cy5MSVNUX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5MSVNUX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ29uc3RhbnRzLlNFVF9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuU0VUX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5DT0xMRUNUSU9OX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ29uc3RhbnRzLk1BUF9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuTUFQX1RZUEUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFICYgY2xhc3NUeXBlKSA9PSBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0c0NvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgamF2YUNsYXNzLm5ld0luc3RhbmNlKCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChDb25zdGFudHMuTUFQX1RZUEUgJiBjbGFzc1R5cGUpID09IENvbnN0YW50cy5NQVBfVFlQRSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHNDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFhtbFBhcnNpbmdFeGNlcHRpb24oIlByb2JsZW0gd2l0aCBpbnN0YW5jaWF0aW5nIHRoZSBlbGVtZW50IGNsYXNzICIgKw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFDbGFzcy5nZXROYW1lKCkgLCBlKTsNCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBYbWxQYXJzaW5nRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggaW5zdGFuY2lhdGluZyB0aGUgZWxlbWVudCBjbGFzcyAiICsNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhQ2xhc3MuZ2V0TmFtZSgpICwgZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gb2JqZWN0c0NvbGxlY3Rpb247DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIHJlYWRlciBtdXN0IGJlIGF0IHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gcmVhZGVyDQotICAgICAqIEByZXR1cm4gcU5hbWUgZm9yIHRoZSB0eXBlIGF0dHJpYnV0ZQ0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRUeXBlUU5hbWUoU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB7DQotICAgICAgICBRTmFtZSB0eXBlUU5hbWUgPSBudWxsOw0KLSAgICAgICAgU3RyaW5nIHR5cGVWYWx1ZSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSSwgInR5cGUiKTsNCi0gICAgICAgIGlmICgodHlwZVZhbHVlICE9IG51bGwpICYmICF0eXBlVmFsdWUuZXF1YWxzKCIiKSkgew0KLSAgICAgICAgICAgIGludCBpbmRleCA9IHR5cGVWYWx1ZS5pbmRleE9mKCI6Iik7DQotICAgICAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gIiI7DQotICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsNCi0gICAgICAgICAgICAgICAgbnNQcmVmaXggPSB0eXBlVmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHR5cGVWYWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsNCi0gICAgICAgICAgICB0eXBlUU5hbWUgPSBuZXcgUU5hbWUocmVhZGVyLmdldE5hbWVzcGFjZVVSSShuc1ByZWZpeCksIGxvY2FsUGFydCk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gdHlwZVFOYW1lOw0KLSAgICB9DQotDQotICAgIC8qKiANCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSByZWFkZXIgaGFzIGJlZW4gYWR2YW5jZWQgYmV5b25kIGl0cyBpbml0aWFsIGxvY2F0aW9uLCBwcmlvciANCi0gICAgICogdG8gdGhlIG1ldGhvZHMgd2l0aGluIFhtbFN0cmVhbVBhcnNlciBiZWluZyBjYWxsZWQuDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIFRoZSBYTUxTdHJlYW1SZWFkZXIgb24gd2hpY2ggdGhlIFhtbFN0cmVhbVBhcnNlciBpcyBhY3RpbmcuDQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZGVyIGhhcyBiZWVuIGFkdmFuY2VkIGJleW9uZCBpdHMgaW5pdGlhbCBsb2NhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlDQotICAgICAqLw0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGV0ZXJtaW5lUHJpb3JBY2Nlc3MoWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgew0KLSAgICAgICAgaWYgKCFwcmlvckFjY2Vzc0RldGVybWluZWQpIHsNCi0gICAgICAgICAgICBpZiAocmVhZGVyLmdldExvY2F0aW9uKCkuZ2V0Q2hhcmFjdGVyT2Zmc2V0KCkgPT0gMCkNCi0gICAgICAgICAgICAgICAgcmVhZGVyUHJpb3JBY2Nlc3MgPSBmYWxzZTsNCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgIHJlYWRlclByaW9yQWNjZXNzID0gdHJ1ZTsNCi0NCi0gICAgICAgICAgICBwcmlvckFjY2Vzc0RldGVybWluZWQgPSB0cnVlOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIHJlYWRlclByaW9yQWNjZXNzOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBQcm92aWRlIGEgbWVjaGFuaXNtIChhIHN0YWNrKSB0byB0cmFjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MU3RyZWFtDQotICAgICAqIA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyX2luIHRoZSBYTUxTdHJlYW1SZWFkZXIgdGhhdCB0aGUgWG1sU3RyZWFtUGFyc2VyIGlzIGFjdGluZyBvbg0KLSAgICAgKiBAcmV0dXJuIGEgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgdG8gbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlIFhNTFN0cmVhbVJlYWRlcg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciBnZXRTdGF0ZWZ1bFJlYWRlcihYTUxTdHJlYW1SZWFkZXIgcmVhZGVyX2luKSB7DQotICAgICAgICBpZiAocmVhZGVyX2luIGluc3RhbmNlb2YgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIpICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0dXJuIChTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlcikgcmVhZGVyX2luOw0KLSAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIocmVhZGVyX2luLCByZWFkZXJQcmlvckFjY2Vzcyk7DQotICAgIH0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBBZHZhbmNlIHRoZSByZWFkZXIgdG8gcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZWxlbWVudA0KLSAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBTdGF0ZWZ1bFhNTFN0cmVhbVJlYWRlciB3ZSBhcmUgdXNpbmcgdG8gcGFyc2UgdGhlIFhNTFN0cmVhbQ0KLSAgICAgKi8NCi0gICAgDQotICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlVG9GaXJzdEVsZW1lbnQoU3RhdGVmdWxYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgDQotICAgICAgICBpZiAocmVhZGVyUHJpb3JBY2Nlc3MpIHsNCi0gICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpICYmICFyZWFkZXIuaXNFbmRFbGVtZW50KCkgJiYgcmVhZGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5nZXREZXB0aCgpID09IDAgJiYgcmVhZGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICByZWFkZXIubmV4dCgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9DbGFzc0RlcGxveWVyLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9DbGFzc0RlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODY4NTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvQ2xhc3NEZXBsb3llci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnJlY2VpdmVyLlJNSU1lc3NhZ2VSZWNpZXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc0RlcGxveWVyIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLSAgICBwdWJsaWMgQ2xhc3NEZXBsb3llcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBjbGFzc0xvYWRlciwgbmV3IENvbmZpZ3VyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NEZXBsb3llcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3NEZXBsb3llcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICB0aGlzKGNvbmZpZ3VyYXRpb25Db250ZXh0LCBuZXcgQ29uZmlndXJhdG9yKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc0RlcGxveWVyKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lDbGFzcyhDbGFzcyBzZXJ2aWNlQ2xhc3MpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShzZXJ2aWNlQ2xhc3MsIHRoaXMuY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihkZWZpbml0aW9uLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnNldENsYXNzTG9hZGVyKHRoaXMuY2xhc3NMb2FkZXIpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoInVzZU9yaWdpbmFsd3NkbCIsICJ0cnVlIikpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoIm1vZGlmeVVzZXJXU0RMUG9ydEFkZHJlc3MiLCAidHJ1ZSIpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gc2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBSTUlNZXNzYWdlUmVjaWV2ZXIgbWVzc2FnZVJlY2lldmVyID0gbmV3IFJNSU1lc3NhZ2VSZWNpZXZlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcU5hbWUgPSBuZXcgUU5hbWUob3BlcmF0aW9uLmdldE5hbWVzcGFjZSgpLCBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9uKHFOYW1lKTsKLSAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLnNldE1lc3NhZ2VSZWNlaXZlcihtZXNzYWdlUmVjaWV2ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5kZXBsb3lTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvUk1JU2VydmljZURlcGxveWVyLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9STUlTZXJ2aWNlRGVwbG95ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1MmI0ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9STUlTZXJ2aWNlRGVwbG95ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3llcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQucmVwb3NpdG9yeS51dGlsLkRlcGxveW1lbnRGaWxlRGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuU2ltcGxlVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuQ3VzdG9tQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuRmllbGRJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuUGFja2FnZVRvTmFtZXNwYWNlTWFwOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFBhcnNpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Mb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIFJNSVNlcnZpY2VEZXBsb3llciBpbXBsZW1lbnRzIERlcGxveWVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhSTUlTZXJ2aWNlRGVwbG95ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ3R4KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWdDdHg7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZ3VyYXRpb24gPSB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3koRGVwbG95bWVudEZpbGVEYXRhIGRlcGxveW1lbnRGaWxlRGF0YSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIGlzRGlyZWN0b3J5ID0gZGVwbG95bWVudEZpbGVEYXRhLmdldEZpbGUoKS5pc0RpcmVjdG9yeSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGVwbG95bWVudEZpbGVEYXRhLnNldENsYXNzTG9hZGVyKGlzRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhpc0NvbmZpZ3VyYXRpb24uZ2V0U2VydmljZUNsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgIChGaWxlKXRoaXMuYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyVmFsdWUoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVJUSUZBQ1RTX1RFTVBfRElSKSk7Ci0KLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGRlcGxveW1lbnRDbGFzc0xvYWRlciA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgU3RyaW5nIGFic29sdXRlUGF0aCA9IGRlcGxveW1lbnRGaWxlRGF0YS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldHR0aW5nIHRoZSBmaWxlIHJlYWRlciBmb3IgemlwaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICBDb25maWcgY29uZmlnT2JqZWN0ID0gZ2V0Q29uZmlnKGFic29sdXRlUGF0aCk7Ci0KLSAgICAgICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBnZXRDb25maWd1cmF0b3IoY29uZmlnT2JqZWN0LCBkZXBsb3ltZW50Q2xhc3NMb2FkZXIpOwotCi0gICAgICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBjb25maWdPYmplY3QuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBDbGFzc0RlcGxveWVyIGNsYXNzRGVwbG95ZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NEZXBsb3llcihjb25maWd1cmF0aW9uQ29udGV4dCwgZGVwbG95bWVudENsYXNzTG9hZGVyLCBjb25maWd1cmF0b3IpOwotICAgICAgICAgICAgQ2xhc3Mgc2VydmljZUNsYXNzOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNsYXNzID0gTG9hZGVyLmxvYWRDbGFzcyhkZXBsb3ltZW50Q2xhc3NMb2FkZXIsIHNlcnZpY2VzW2ldLmdldFNlcnZpY2VDbGFzcygpKTsKLSAgICAgICAgICAgICAgICBjbGFzc0RlcGxveWVyLmRlcGxveUNsYXNzKHNlcnZpY2VDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2cuaW5mbygiRGVwbG95ZWQgUk1JIFNlcnZpY2VzIHdpdGggZGVwbG95bWVudCBmaWxlICIgKyBkZXBsb3ltZW50RmlsZURhdGEuZ2V0TmFtZSgpKTsKLQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJTZXJ2aWNlIGNsYXNzIG5vdCBmb3VuZCIsIGUpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigiYXhpcyBmYXVsdCIsIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJ6aXAgZmlsZSBub3QgZm91bmQiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oImNvbmZpZyBmaWxlIHJlYWRpbmcgcHJvYmxlbSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25maWd1cmF0b3IgZ2V0Q29uZmlndXJhdG9yKENvbmZpZyBjb25maWdPYmplY3QsIENsYXNzTG9hZGVyIGRlcGxveW1lbnRDbGFzc0xvYWRlcikKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLQotICAgICAgICBpZiAoY29uZmlnT2JqZWN0LmdldEV4dGVuc2lvbkNsYXNzZXMoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBleHRlbnNpb25DbGFzc2VzID0gY29uZmlnT2JqZWN0LmdldEV4dGVuc2lvbkNsYXNzZXMoKS5nZXRFeHRlbnNpb25DbGFzcygpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbkNsYXNzZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENsYXNzIGV4dGVuc2lvbkNsYXNzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25DbGFzcyA9IExvYWRlci5sb2FkQ2xhc3MoZGVwbG95bWVudENsYXNzTG9hZGVyLCBleHRlbnNpb25DbGFzc2VzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdG9yLmFkZEV4dGVuc2lvbihleHRlbnNpb25DbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmZpZ09iamVjdC5nZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgUGFja2FnZVRvTmFtZXNwYWNlTWFwW10gcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdC5nZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzKCkuZ2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcocGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nc1tpXS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3NbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldCB0aGUgc2ltcGxlIHR5cGUgZGF0YSBoYW5kbGVyIGlmIGl0IGlzIHNldAotICAgICAgICBpZiAoKGNvbmZpZ09iamVjdC5nZXRTaW1wbGVEYXRhSGFuZGxlckNsYXNzKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAoY29uZmlnT2JqZWN0LmdldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoKS50cmltKCkubGVuZ3RoKCkgPiAwKSl7Ci0gICAgICAgICAgICBDbGFzcyBzaW1wbGVUeXBlSGFuZGxlckNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgTG9hZGVyLmxvYWRDbGFzcyhkZXBsb3ltZW50Q2xhc3NMb2FkZXIsY29uZmlnT2JqZWN0LmdldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNpbXBsZVR5cGVIYW5kbGVyIHNpbXBsZVR5cGVIYW5kbGVyID0gKFNpbXBsZVR5cGVIYW5kbGVyKSBzaW1wbGVUeXBlSGFuZGxlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdG9yLnNldFNpbXBsZVR5cGVIYW5kbGVyKHNpbXBsZVR5cGVIYW5kbGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBsb3ltZW50RXhjZXB0aW9uKCJDYW4gbm90IGluc3RhbnRpYXRlIHNpbXBsZSB0eXBlIGhhbmRsZXIiLGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGxveW1lbnRFeGNlcHRpb24oIkNhbiBub3QgaW5zdGFudGlhdGUgc2ltcGxlIHR5cGUgaGFuZGxlciIsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXR0aW5nIHRoZSBjdXN0b20gY2xhc3MgaW5mbwotICAgICAgICBDbGFzc0luZm9bXSBjbGFzc0luZm9zID0gbnVsbDsKLSAgICAgICAgRmllbGRJbmZvW10gZmlsc0luZm9zID0gbnVsbDsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyBjbGFzc0luZm87Ci0gICAgICAgIENsYXNzIGN1c3RvbUNsYXNzID0gbnVsbDsKLSAgICAgICAgaWYgKGNvbmZpZ09iamVjdC5nZXRDdXN0b21DbGFzc0luZm8oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDdXN0b21DbGFzc0luZm8gY3VzdG9tQ2xhc3NJbmZvID0gY29uZmlnT2JqZWN0LmdldEN1c3RvbUNsYXNzSW5mbygpOwotICAgICAgICAgICAgaWYgKChjdXN0b21DbGFzc0luZm8uZ2V0Q2xhc3NJbmZvKCkgIT0gbnVsbCkgJiYgKGN1c3RvbUNsYXNzSW5mby5nZXRDbGFzc0luZm8oKS5sZW5ndGggPiAwKSkgewotICAgICAgICAgICAgICAgIGNsYXNzSW5mb3MgPSBjdXN0b21DbGFzc0luZm8uZ2V0Q2xhc3NJbmZvKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc0luZm9zLmxlbmd0aDsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChjbGFzc0luZm9zW2ldLmdldEZpZWxkSW5mbygpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsYXNzSW5mb3NbaV0uZ2V0RmllbGRJbmZvKCkubGVuZ3RoID4gMCkpewotICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xhc3MgPSBMb2FkZXIubG9hZENsYXNzKGRlcGxveW1lbnRDbGFzc0xvYWRlcixjbGFzc0luZm9zW2ldLmdldENsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5mbyA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuQ2xhc3NJbmZvKGN1c3RvbUNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbHNJbmZvcyA9IGNsYXNzSW5mb3NbaV0uZ2V0RmllbGRJbmZvKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbHNJbmZvcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsc0luZm9zW2pdLmdldEphdmFOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsc0luZm9zW2pdLmdldFhtbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxzSW5mb3Nbal0uaXNFbGVtZW50KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZmlndXJhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29uZmlnIGdldENvbmZpZyhTdHJpbmcgemlwRmlsZVBhdGgpIHRocm93cyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBjb25maWdGaWxlSW5wdXRTdHJlYW0gPSBnZXRDb25maWdGaWxlSW5wdXRTdHJlYW0oemlwRmlsZVBhdGgpOwotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoY29uZmlnRmlsZUlucHV0U3RyZWFtKTsKLQotICAgICAgICAgICAgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoIm9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWciLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIik7Ci0KLSAgICAgICAgICAgIC8vIGFkZCBjb25maWd1cmF0b3IgZGV0YWlscyB0byBoYW5kbGUgY3VzdG9tIGNsYXNzIGluZm8KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm8gY2xhc3NJbmZvID0gbmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm8oRmllbGRJbmZvLmNsYXNzKTsKLSAgICAgICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oImphdmFOYW1lIiwgbnVsbCwgZmFsc2UpKTsKLSAgICAgICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oInhtbE5hbWUiLCBudWxsLCBmYWxzZSkpOwotICAgICAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbygiZWxlbWVudCIsICJpc0VsZW1lbnQiLCBmYWxzZSkpOwotICAgICAgICAgICAgY29uZmlndXJhdG9yLmFkZENsYXNzSW5mbyhjbGFzc0luZm8pOwotCi0gICAgICAgICAgICBjbGFzc0luZm8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyhDbGFzc0luZm8uY2xhc3MpOwotICAgICAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbygiY2xhc3NOYW1lIiwgbnVsbCwgZmFsc2UpKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLQotCi0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBNYXAgcHJvY2Vzc2VkU2NoZW1hTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKENvbmZpZy5jbGFzcywgImNvbmZpZyIpOwotICAgICAgICAgICAgcGFyYW1ldGVyLnNldE5hbWVzcGFjZSgiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgcGFyYW1ldGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkU2NoZW1hTWFwKTsKLQotICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIocHJvY2Vzc2VkVHlwZU1hcCwgY29uZmlndXJhdG9yLCBwcm9jZXNzZWRTY2hlbWFNYXApOwotICAgICAgICAgICAgcmV0dXJuIChDb25maWcpIHhtbFN0cmVhbVBhcnNlci5nZXRPYmplY3RGb3JQYXJhbWV0ZXIoeG1sUmVhZGVyLCBwYXJhbWV0ZXIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oIkNhbiBub3QgcmVhZCBjb25maWd1cmF0aW9uIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbigieG1sIHN0cmVhbSBleGNlcHRpb24gd2l0aCBjb25maWd1cmF0aW9uIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oIm1ldGFkYXRhIHBvcHVsYXRpb24gcHJvYmxlbSB3aXRoIGNvbmZpZ3VyYXRpb24gZmlsZSIsIGUpOwotICAgICAgICB9IGNhdGNoIChYbWxQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbigieG1sIHN0cmVhbSByZWFkaW5nIHByb2JsZW0gd2l0aCBjb25maWd1cmF0aW9uIGZpbGUiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oInByb2JsZW0gaW4gZ2VuZXJhdGluZyBzY2hlbWEiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0Q29uZmlnRmlsZUlucHV0U3RyZWFtKFN0cmluZyB6aXBGaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBaaXBJbnB1dFN0cmVhbSB6aXBJbnB1dFN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGVQYXRoKSk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFppcEVudHJ5IHppcEVudHJ5OwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIGludCByZWFkOwotICAgICAgICB3aGlsZSAoKHppcEVudHJ5ID0gemlwSW5wdXRTdHJlYW0uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh6aXBFbnRyeS5nZXROYW1lKCkuZXF1YWxzKCJNRVRBLUlORiIgKyBGaWxlLnNlcGFyYXRvciArICJjb25maWcueG1sIikpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSB6aXBJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeSkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVuRGVwbG95KFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIERlcGxveW1lbnRFeGNlcHRpb24gewotICAgICAgIC8vVE9ETzogaW1wbGVtZW50IHVuZGVwbG95Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0NsYXNzSW5mby5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0NsYXNzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JlY2ZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9DbGFzc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotCi1wdWJsaWMgY2xhc3MgQ2xhc3NJbmZvIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBwcml2YXRlIEZpZWxkSW5mb1tdIGZpZWxkSW5mbzsKLQotICAgIHB1YmxpYyBGaWVsZEluZm9bXSBnZXRGaWVsZEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZEluZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmllbGRJbmZvKEZpZWxkSW5mb1tdIGZpZWxkSW5mbykgewotICAgICAgICB0aGlzLmZpZWxkSW5mbyA9IGZpZWxkSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvQ29uZmlnLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NzA3ZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0NvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnIHsKLQotICAgcHJpdmF0ZSBTZXJ2aWNlcyBzZXJ2aWNlczsKLSAgIHByaXZhdGUgRXh0ZW5zaW9uQ2xhc3NlcyBleHRlbnNpb25DbGFzc2VzOwotICAgcHJpdmF0ZSBQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M7Ci0gICBwcml2YXRlIFN0cmluZyBzaW1wbGVEYXRhSGFuZGxlckNsYXNzOwotICAgcHJpdmF0ZSBDdXN0b21DbGFzc0luZm8gY3VzdG9tQ2xhc3NJbmZvOwotCi0gICAgcHVibGljIFNlcnZpY2VzIGdldFNlcnZpY2VzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZXMoU2VydmljZXMgc2VydmljZXMpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHNlcnZpY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyBFeHRlbnNpb25DbGFzc2VzIGdldEV4dGVuc2lvbkNsYXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25DbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkNsYXNzZXMoRXh0ZW5zaW9uQ2xhc3NlcyBleHRlbnNpb25DbGFzc2VzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3NlcyA9IGV4dGVuc2lvbkNsYXNzZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MgZ2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncygpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyhQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzIHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzID0gcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBzaW1wbGVEYXRhSGFuZGxlckNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZURhdGFIYW5kbGVyQ2xhc3MoU3RyaW5nIHNpbXBsZURhdGFIYW5kbGVyQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5zaW1wbGVEYXRhSGFuZGxlckNsYXNzID0gc2ltcGxlRGF0YUhhbmRsZXJDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ3VzdG9tQ2xhc3NJbmZvIGdldEN1c3RvbUNsYXNzSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGN1c3RvbUNsYXNzSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21DbGFzc0luZm8oQ3VzdG9tQ2xhc3NJbmZvIGN1c3RvbUNsYXNzSW5mbykgewotICAgICAgICB0aGlzLmN1c3RvbUNsYXNzSW5mbyA9IGN1c3RvbUNsYXNzSW5mbzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9DdXN0b21DbGFzc0luZm8uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9DdXN0b21DbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNDA0MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvQ3VzdG9tQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWc7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbUNsYXNzSW5mbyB7Ci0KLSAgICBwcml2YXRlIENsYXNzSW5mb1tdIGNsYXNzSW5mbzsKLQotICAgIHB1YmxpYyBDbGFzc0luZm9bXSBnZXRDbGFzc0luZm8oKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0luZm87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NJbmZvKENsYXNzSW5mb1tdIGNsYXNzSW5mbykgewotICAgICAgICB0aGlzLmNsYXNzSW5mbyA9IGNsYXNzSW5mbzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9FeHRlbnNpb25DbGFzc2VzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvRXh0ZW5zaW9uQ2xhc3Nlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmFkZGQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9FeHRlbnNpb25DbGFzc2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWc7Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2lvbkNsYXNzZXMgewotCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBleHRlbnNpb25DbGFzczsKLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbkNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbkNsYXNzKFN0cmluZ1tdIGV4dGVuc2lvbkNsYXNzKSB7Ci0gICAgICAgIHRoaXMuZXh0ZW5zaW9uQ2xhc3MgPSBleHRlbnNpb25DbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvRmllbGRJbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvRmllbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzE5ZTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL0ZpZWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnOwotCi0KLXB1YmxpYyBjbGFzcyBGaWVsZEluZm8gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgamF2YU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgeG1sTmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50ID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhTmFtZShTdHJpbmcgamF2YU5hbWUpIHsKLSAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHhtbE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sTmFtZShTdHJpbmcgeG1sTmFtZSkgewotICAgICAgICB0aGlzLnhtbE5hbWUgPSB4bWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGlzRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KGJvb2xlYW4gZWxlbWVudCkgewotICAgICAgICBpc0VsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9QYWNrYWdlVG9OYW1lc3BhY2VNYXAuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9QYWNrYWdlVG9OYW1lc3BhY2VNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmOGZlYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvUGFja2FnZVRvTmFtZXNwYWNlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWc7Ci0KLQotcHVibGljIGNsYXNzIFBhY2thZ2VUb05hbWVzcGFjZU1hcCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGVwbG95L2NvbmZpZy9QYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDYzMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotCi1wdWJsaWMgY2xhc3MgUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyB7Ci0gICAgCi0gICAgcHJpdmF0ZSBQYWNrYWdlVG9OYW1lc3BhY2VNYXBbXSBwYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci0KLSAgICBwdWJsaWMgUGFja2FnZVRvTmFtZXNwYWNlTWFwW10gZ2V0UGFja2FnZVRvTmFtZXNwYWNlTWFwKCkgewotICAgICAgICByZXR1cm4gcGFja2FnZVRvTmFtZXNwYWNlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VUb05hbWVzcGFjZU1hcChQYWNrYWdlVG9OYW1lc3BhY2VNYXBbXSBwYWNrYWdlVG9OYW1lc3BhY2VNYXApIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlVG9OYW1lc3BhY2VNYXAgPSBwYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1JNSUJlYW5JbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvUk1JQmVhbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NjE5OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvUk1JQmVhbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotCi1wdWJsaWMgY2xhc3MgUk1JQmVhbkluZm8gewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVhbkNsYXNzOwotICAgIHByaXZhdGUgU3RyaW5nIGJlYW5UeXBlQ2xhc3M7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5DbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIGJlYW5DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCZWFuQ2xhc3MoU3RyaW5nIGJlYW5DbGFzcykgewotICAgICAgICB0aGlzLmJlYW5DbGFzcyA9IGJlYW5DbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEJlYW5UeXBlQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBiZWFuVHlwZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5UeXBlQ2xhc3MoU3RyaW5nIGJlYW5UeXBlQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5iZWFuVHlwZUNsYXNzID0gYmVhblR5cGVDbGFzczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0Y2E0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VDbGFzczsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VDbGFzcyhTdHJpbmcgc2VydmljZUNsYXNzKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZUNsYXNzID0gc2VydmljZUNsYXNzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kZXBsb3kvY29uZmlnL1NlcnZpY2VzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyNDVkMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2RlcGxveS9jb25maWcvU2VydmljZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZzsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VzIHsKLQotICAgcHJpdmF0ZSBTZXJ2aWNlW10gc2VydmljZTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlW10gZ2V0U2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlW10gc2VydmljZSkgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL0NvbmZpZ0ZpbGVSZWFkaW5nRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9Db25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhlMDI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL0NvbmZpZ0ZpbGVSZWFkaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIENvbmZpZ0ZpbGVSZWFkaW5nRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25maWdGaWxlUmVhZGluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlnRmlsZVJlYWRpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9leGNlcHRpb24vTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9leGNlcHRpb24vTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk5ZDQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL01ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL09NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9PTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjAxYWRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL09NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIAotICAgIHB1YmxpYyBPTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50Q3JlYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1NjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1NjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1Mjc5OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFBhcnNpbmdFeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFBhcnNpbmdFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxYjU3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9YbWxQYXJzaW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sUGFyc2luZ0V4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIFhtbFBhcnNpbmdFeGNlcHRpb24oKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFBhcnNpbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFBhcnNpbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sUGFyc2luZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFNlcmlhbGl6aW5nRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL2V4Y2VwdGlvbi9YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWYwMjBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvZXhjZXB0aW9uL1htbFNlcmlhbGl6aW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gICAgcHVibGljIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9BYnN0cmFjdFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQWJzdHJhY3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjhmMGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9BYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR5cGUgaW1wbGVtZW50cyBUeXBlIHsKLQotICAgIC8qKgotICAgICAqIGphdmEgY2xhc3MgY29ycmVzcG9uZHMgdG8gdGhpcyBYbWxUeXBlIG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBDbGFzcyBqYXZhQ2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGVsZW1lbnQgRmllbGQgb2JqZWN0cyBmb3IgdGhpcyBqYXZhIGNsYXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZWxlbWVudEZpZWxkczsKLQotICAgIC8qKgotICAgICAqIGxpc3Qgb2YgYXR0cmlidXRlIEZpZWxkIG9iamVjdHMgZm9yIHRoaXMgamF2YSBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGF0dHJpYnV0ZUZpZWxkczsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIFR5cGUgOiBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogbmFtZXNwYWNlIG9mIHRoZSB0eXBlIDogZGVwZW5kcyBvbiB0aGUgcGFja2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogcGFyZW50IHR5cGUgZm9yIHRoaXMgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlIHBhcmVudFR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiB4bWwgbWV0YWRhdGEgdHlwZSBjb3JyZXBvbmRpbmcgdG8gdGhpcyB0eXBlIG9iamVjdAotICAgICAqLwotICAgIHByb3RlY3RlZCBYbWxUeXBlIHhtbFR5cGU7Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZDsKLQotCi0gICAgLyoqCi0gICAgICogcG9wdWFsYXRlIHRoZSBtZXRhIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIHhtbFR5cGUgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBpbnZva2VkCi0gICAgICogaWYgaXQgaGFzIG5vdCBhbHJlYWR5IHByb2Nlc3NlZAotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKiBAcGFyYW0gc2NoZW1hTWFwCi0gICAgICovCi0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZVNjaGVtYShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBzY2hlbWFNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHNMaXN0KXsKLSAgICAgICAgLy8gd2UgaGF2ZSB0byBmaXJzdCBhZGQgdGhlIHBhcmVudCBkZXRhaWxzIHRvIGtlZXAgdGhlIG9yZGVyLgotICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpewotICAgICAgICAgICAgdGhpcy5wYXJlbnRUeXBlLnBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhlbGVtZW50RmllbGRzTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudEZpZWxkc0xpc3QuYWRkQWxsKHRoaXMuZWxlbWVudEZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVBbGxBdHRyaWJ1dGVGaWVsZHMoTGlzdCBhdHRyaWJ1dGVGaWVsZHNMaXN0KSB7Ci0gICAgICAgIC8vIHdlIGhhdmUgdG8gZmlyc3QgYWRkIHRoZSBwYXJlbnQgZGV0YWlscyB0byBrZWVwIHRoZSBvcmRlci4KLSAgICAgICAgaWYgKHRoaXMucGFyZW50VHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMucGFyZW50VHlwZS5wb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhdHRyaWJ1dGVGaWVsZHNMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVGaWVsZHNMaXN0LmFkZEFsbCh0aGlzLmF0dHJpYnV0ZUZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudEZpZWxkcygpewotICAgICAgICBMaXN0IGFsbEVsZW1lbnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcG9wdWxhdGVBbGxFbGVtZW50RmllbGRzKGFsbEVsZW1lbnRzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxFbGVtZW50c0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsQXR0cmlidXRlRmllbGRzKCkgewotICAgICAgICBMaXN0IGFsbEF0dHJpYnV0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhbGxBdHRyaWJ1dGVzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxBdHRyaWJ1dGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlclhtbFR5cGUoTWFwIHNjaGVtYU1hcCkgewotICAgICAgICBpZiAoc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG5hbWVzcGFjZSBmb3IgdGhpcyBzY2hlbWEKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGhpcy5uYW1lc3BhY2UsIG5ldyBYbWxTY2hlbWEodGhpcy5uYW1lc3BhY2UpKTsKLSAgICAgICAgfQotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSk7Ci0gICAgICAgIHhtbFNjaGVtYS5hZGRDb21wbGV4VHlwZSh0aGlzLnhtbFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2NoZW1hR2VuZXJhdGVkKCkgewotICAgICAgICByZXR1cm4gaXNTY2hlbWFHZW5lcmF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR2VuZXJhdGVkKGJvb2xlYW4gc2NoZW1hR2VuZXJhdGVkKSB7Ci0gICAgICAgIGlzU2NoZW1hR2VuZXJhdGVkID0gc2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKENsYXNzIGphdmFDbGFzcykgewotICAgICAgICB0aGlzLmphdmFDbGFzcyA9IGphdmFDbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRFbGVtZW50RmllbGRzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudEZpZWxkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RmllbGRzKExpc3QgZWxlbWVudEZpZWxkcykgewotICAgICAgICB0aGlzLmVsZW1lbnRGaWVsZHMgPSBlbGVtZW50RmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxUeXBlIGdldFhtbFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB4bWxUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhtbFR5cGUoWG1sVHlwZSB4bWxUeXBlKSB7Ci0gICAgICAgIHRoaXMueG1sVHlwZSA9IHhtbFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50VHlwZShUeXBlIHBhcmVudFR5cGUpIHsKLSAgICAgICAgdGhpcy5wYXJlbnRUeXBlID0gcGFyZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVGaWVsZHMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVGaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlRmllbGRzKExpc3QgYXR0cmlidXRlRmllbGRzKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlRmllbGRzID0gYXR0cmlidXRlRmllbGRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0F0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI5YWRiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5pbXBsLlR5cGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5pbXBsLlhtbEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnR5cGVzLk1hcFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgewotCi0gICAgLyoqCi0gICAgICogcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhpcyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgLyoqCi0gICAgICogbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIFhtbEVsZW1lbnQgYXMgd2VsbAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lc3BjZSBvZiB0aGlzIGF0dHJpYnV0ZQotICAgICAqIHRoaXMgaXMgYWx3YXlzIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHBhcmVudCB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogZ2V0dGVyIG1ldGhvZCBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0dGVyTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogc2V0dGVyIG1ldGhvZCBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXRob2Qgc2V0dGVyTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogYXR0cmlidXRlIG1ldGFkYXRhIHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFR5cGUgdHlwZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgYXR0cmlidXRlIGFuIGFycmF5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgKiBzY2htZW1hIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGF0dHJpYnV0ZQotICAgICAqIGFsd2F5cyBhbiBhdHRyaWJ1dGUgcmVmZXIgdG8gYW5kIHNjaGVtYSBYbWxFbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBib29sZWFuIHZhcmlhYmxlIHRvIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGdlbmVyYXRlZCB0aGUKLSAgICAgKiBlbGVtZW50IGZvciB0aGlzIHNjaGVtYS4KLSAgICAgKiBhbHRob3VnaCB3ZSBjYW4gY2hlY2sgZm9yIG51bGwgdmFsdWUgb2YgdGhlIGVsZW1lbnQgd2UgcHJlZmVyCi0gICAgICogdG8ga2VlcCBhIHNlcGVyYXRlIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZDsKLQotICAgIC8qKgotICAgICAqIGNsYXNzIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNsYXNzVHlwZTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdG9yIHdpdGggdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eURlc2NyaXB0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0cmlidXRlKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yOwotICAgICAgICBpZiAoQ29uc3RhbnRzLlJNSV9UWVBFX05BTVNQQUNFLmVxdWFscyhuYW1lc3BhY2UpKXsKLSAgICAgICAgICAgIC8vIGZvciBybWkgZGVmaW5lZCB0eXBlIGVsZW1lbnRzIHdlIGtlZXAgYXR0cmlidXRlcyBhcyB1bnF1YWxpZmllZAotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMubmFtZSA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgdGhpcy5nZXR0ZXJNZXRob2QgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRSZWFkTWV0aG9kKCk7Ci0gICAgICAgIHRoaXMuc2V0dGVyTWV0aG9kID0gdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0V3JpdGVNZXRob2QoKTsKLSAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NUeXBlID0gVXRpbC5nZXRDbGFzc1R5cGUodGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSl7Ci0gICAgICAgICAgICAgICAvLyBpLmUuIGlmIHRoaXMgaXMgY29sbGVjdGlvbiB0eXBlCi0gICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gT2JqZWN0LmNsYXNzOwotICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5jbGFzc1R5cGUgJiBDb25zdGFudHMuTUFQX1RZUEUpID09IENvbnN0YW50cy5NQVBfVFlQRSl7Ci0gICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG1lcCB0eXBlIHdlIHNldCBhIGN1c3RvbSB0eXBlIGZvciBpdC4KLSAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSBNYXBUeXBlLmNsYXNzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpKXsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAoVHlwZSkgcHJvY2Vzc2VkVHlwZU1hcC5nZXQoYmFzZUNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbmV3IFR5cGVJbXBsKGJhc2VDbGFzcyk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQoYmFzZUNsYXNzLCB0aGlzLnR5cGUpOwotICAgICAgICAgICAgICAgIHRoaXMudHlwZS5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIkNhbiBub3QgaW5zdGF0YWl0ZSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICsgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiQ2FuIG5vdCBpbnN0YXRhaXRlIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIFhNTEVsZW1lbnQgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLSAgICAgKiBpZiB0aGlzIGlzIG5vdCBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqIEB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNjaGVtYU1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gaGVyZSB3ZSBoYXZlIHRvIHNlbmQgdGhlIFhtbEVsZW1lbnQgY29ycmVjdGx5Ci0gICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFhtbEVsZW1lbnRJbXBsKCF0aGlzLmlzQXJyYXkgJiYgdGhpcy50eXBlLmdldEphdmFDbGFzcygpLmlzUHJpbWl0aXZlKCkpOwotICAgICAgIHRoaXMuZWxlbWVudC5zZXROYW1lKHRoaXMubmFtZSk7Ci0gICAgICAgdGhpcy5lbGVtZW50LnNldE5hbWVzcGFjZSh0aGlzLm5hbWVzcGFjZSk7Ci0gICAgICAgdGhpcy5lbGVtZW50LnNldFRvcEVsZW1lbnQoZmFsc2UpOwotCi0gICAgICAgaWYgKCF0aGlzLnR5cGUuaXNTY2hlbWFHZW5lcmF0ZWQoKSl7Ci0gICAgICAgICAgdGhpcy50eXBlLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgIH0KLSAgICAgICB0aGlzLmVsZW1lbnQuc2V0VHlwZSh0aGlzLnR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICB0aGlzLmVsZW1lbnQuc2V0QXJyYXkodGhpcy5pc0FycmF5KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RGVzY3JpcHRvcihQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yID0gcHJvcGVydHlEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0R2V0dGVyTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gZ2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChNZXRob2QgZ2V0dGVyTWV0aG9kKSB7Ci0gICAgICAgIHRoaXMuZ2V0dGVyTWV0aG9kID0gZ2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgZ2V0U2V0dGVyTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gc2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNldHRlck1ldGhvZChNZXRob2Qgc2V0dGVyTWV0aG9kKSB7Ci0gICAgICAgIHRoaXMuc2V0dGVyTWV0aG9kID0gc2V0dGVyTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXkoYm9vbGVhbiBhcnJheSkgewotICAgICAgICBpc0FycmF5ID0gYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChYbWxFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENsYXNzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1R5cGUoaW50IGNsYXNzVHlwZSkgewotICAgICAgICB0aGlzLmNsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlRmllbGQuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQXR0cmlidXRlRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4ZjNhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0F0dHJpYnV0ZUZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5STUlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLmltcGwuVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuaW1wbC5YbWxBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuSmF2YVR5cGVUb1FOYW1lTWFwOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRmllbGQgZXh0ZW5kcyBGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiB4bWwgYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGlzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBYbWxBdHRyaWJ1dGUgYXR0cmlidXRlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdXJpZWQ7Ci0KLSAgICBwdWJsaWMgQXR0cmlidXRlRmllbGQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEF0dHJpYnV0ZUZpZWxkKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IsIFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgc3VwZXIocHJvcGVydHlEZXNjcmlwdG9yLCBuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgaWYgKCF0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIENsYXNzIGJhc2VDbGFzcyA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpOwotICAgICAgICAgICAgaWYgKEphdmFUeXBlVG9RTmFtZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFJNSUJlYW4uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiYXNlQ2xhc3MpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IChUeXBlKSBwcm9jZXNzZWRUeXBlTWFwLmdldChiYXNlQ2xhc3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUk1JQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJhc2VDbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBiZWFuIGlzIGFuIFJNSUJlYW4gd2UgaGF2ZSB0byB1c2UgdGhlIHR5cGUgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhhdCBiZWFuLgotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGdldEJlYW5DbGFzc01ldGhvZCA9IGJhc2VDbGFzcy5nZXRNZXRob2QoImdldEJlYW5DbGFzcyIsIG5ldyBDbGFzc1tde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgcm1pQmVhblR5cGUgPSAoQ2xhc3MpIGdldEJlYW5DbGFzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJtaUJlYW5UeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAoVHlwZSkgcm1pQmVhblR5cGUubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oInRoZXJlIGlzIG5vIHR5cGUgY2xhc3MgZm9yIHJtaSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIk5vIGdldEJlYW5DbGFzcyBtZXRob2QgaXMgbm90IGRlZmluZWQgZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJtaSBiZWFuIGNsYXNzICIgKyBiYXNlQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcm1pIGJlYW4gY2xhc3MgIiArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJDYW4gbm90IGludm9rZSBybWkgYmVhbiBjbGFzcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIkNhbiBub3QgaW5zdGFudGlhdGUgUk1JIGJlYW4gY2xhc3MgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbmV3IFR5cGVJbXBsKGJhc2VDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNYXAucHV0KGJhc2VDbGFzcywgdGhpcy50eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgZWxlbWVudCBtdXN0IGhhdmUgYSBrbm93biBzaW1wZSB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJBdHRyaWJ1dGUgZWxlbWVudCBjYW4gbm90IGJlIGFuIGFycmF5IHR5cGUiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwgTWFwIHNjaGVtYU1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IG5ldyBYbWxBdHRyaWJ1dGVJbXBsKHRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCkuZ2V0UHJvcGVydHlUeXBlKCkuaXNQcmltaXRpdmUoKSk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlLnNldE5hbWUodGhpcy5uYW1lKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0TmFtZXNwYWNlKHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0VHlwZSh0aGlzLnR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0UmVxdWlyZWQodGhpcy5pc1JlcXVyaWVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sQXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoWG1sQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVyaWVkKCkgewotICAgICAgICByZXR1cm4gaXNSZXF1cmllZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1cmllZChib29sZWFuIHJlcXVyaWVkKSB7Ci0gICAgICAgIGlzUmVxdXJpZWQgPSByZXF1cmllZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRWxlbWVudEZpZWxkLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0VsZW1lbnRGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM1YTMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRWxlbWVudEZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5STUlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLmltcGwuVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudHlwZXMuTWFwVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBFbGVtZW50RmllbGQgZXh0ZW5kcyBGaWVsZCB7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIGF0dHJpYnV0ZSBhbiBhcnJheQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgKiBjbGFzcyB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgY2xhc3MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNsYXNzVHlwZTsKLQotICAgIC8qKgotICAgICAqIHNjaG1lbWEgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYXR0cmlidXRlCi0gICAgICogYWx3YXlzIGFuIGF0dHJpYnV0ZSByZWZlciB0byBhbmQgc2NoZW1hIFhtbEVsZW1lbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWG1sRWxlbWVudCBlbGVtZW50OwotCi0KLSAgICBwdWJsaWMgRWxlbWVudEZpZWxkKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50RmllbGQoUHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5RGVzY3JpcHRvciwgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBzdXBlcihwcm9wZXJ0eURlc2NyaXB0b3IsIG5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgQ2xhc3MgYmFzZUNsYXNzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NUeXBlID0gVXRpbC5nZXRDbGFzc1R5cGUodGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlUeXBlKCkpOwotCi0gICAgICAgICAgICBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgewotICAgICAgICAgICAgICAgIC8vIGkuZS4gaWYgdGhpcyBpcyBjb2xsZWN0aW9uIHR5cGUKLSAgICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IE9iamVjdC5jbGFzczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLk1BUF9UWVBFKSA9PSBDb25zdGFudHMuTUFQX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG1lcCB0eXBlIHdlIHNldCBhIGN1c3RvbSB0eXBlIGZvciBpdC4KLSAgICAgICAgICAgICAgICB0aGlzLmlzQXJyYXkgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IE1hcFR5cGUuY2xhc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmlzQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhc2VDbGFzcyA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9jZXNzZWRUeXBlTWFwLmNvbnRhaW5zS2V5KGJhc2VDbGFzcykpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAoVHlwZSkgcHJvY2Vzc2VkVHlwZU1hcC5nZXQoYmFzZUNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoUk1JQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJhc2VDbGFzcykpewotICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgYmVhbiBpcyBhbiBSTUlCZWFuIHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHJldHVybgotICAgICAgICAgICAgICAgIC8vIGZyb20gdGhhdCBiZWFuLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCBnZXRCZWFuQ2xhc3NNZXRob2QgPSBiYXNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRCZWFuQ2xhc3MiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgcm1pQmVhblR5cGUgPSAoQ2xhc3MpIGdldEJlYW5DbGFzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICBpZiAocm1pQmVhblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gKFR5cGUpIHJtaUJlYW5UeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oInRoZXJlIGlzIG5vIHR5cGUgY2xhc3MgZm9yIHJtaSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICIgcm1pIGJlYW4gY2xhc3MgIiArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICIgcm1pIGJlYW4gY2xhc3MgIiArIGJhc2VDbGFzcy5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBuZXcgVHlwZUltcGwoYmFzZUNsYXNzKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiQ2FuIG5vdCBpbnN0YXRhaXRlIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgKyB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKS5nZXROYW1lKCksIGUpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJDYW4gbm90IGluc3RhdGFpdGUgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VHlwZSgpLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVNjaGVtYShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLCBNYXAgc2NoZW1hTWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgc2NoZW1hTWFwKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFhtbEVsZW1lbnRJbXBsKCF0aGlzLmlzQXJyYXkgJiYgdGhpcy50eXBlLmdldEphdmFDbGFzcygpLmlzUHJpbWl0aXZlKCkpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZSh0aGlzLm5hbWUpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZXNwYWNlKHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldFRvcEVsZW1lbnQoZmFsc2UpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0VHlwZSh0aGlzLnR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldEFycmF5KHRoaXMuaXNBcnJheSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotICAgICAgICByZXR1cm4gaXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShib29sZWFuIGFycmF5KSB7Ci0gICAgICAgIGlzQXJyYXkgPSBhcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sRWxlbWVudCBnZXRFbGVtZW50KCkgewotICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KFhtbEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Q2xhc3NUeXBlKCkgewotICAgICAgICByZXR1cm4gY2xhc3NUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzVHlwZShpbnQgY2xhc3NUeXBlKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NUeXBlID0gY2xhc3NUeXBlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GaWVsZC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDMxZjhiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpZWxkIHsKLQotICAgIC8qKgotICAgICAqIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgLyoqCi0gICAgICogbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIFhtbEVsZW1lbnQgYXMgd2VsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIG5hbWVzcGNlIG9mIHRoaXMgYXR0cmlidXRlCi0gICAgICogdGhpcyBpcyBhbHdheXMgdGhlIG5hbWVzcGFjZSBvZiB0aGUgcGFyZW50IHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIGdldHRlciBtZXRob2Qgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXRob2QgZ2V0dGVyTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogc2V0dGVyIG1ldGhvZCBvZiB0aGUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1ldGhvZCBzZXR0ZXJNZXRob2Q7Ci0KLSAgICAvKioKLSAgICAgKiBhdHRyaWJ1dGUgbWV0YWRhdGEgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBib29sZWFuIHZhcmlhYmxlIHRvIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlIGdlbmVyYXRlZCB0aGUKLSAgICAgKiBlbGVtZW50IGZvciB0aGlzIHNjaGVtYS4KLSAgICAgKiBhbHRob3VnaCB3ZSBjYW4gY2hlY2sgZm9yIG51bGwgdmFsdWUgb2YgdGhlIGVsZW1lbnQgd2UgcHJlZmVyCi0gICAgICogdG8ga2VlcCBhIHNlcGVyYXRlIHZhcmlhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2NoZW1hR2VuZXJhdGVkOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjb25zdHJ1Y3RvciB3aXRoIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlEZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgICAgIGlmIChDb25zdGFudHMuUk1JX1RZUEVfTkFNU1BBQ0UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgIC8vIGZvciBybWkgZGVmaW5lZCB0eXBlIGVsZW1lbnRzIHdlIGtlZXAgYXR0cmlidXRlcyBhcyB1bnF1YWxpZmllZAotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRUeXBlTWFwKQotICAgICAgICAgICAgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLnByb3BlcnR5RGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgIHRoaXMuZ2V0dGVyTWV0aG9kID0gdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgICB0aGlzLnNldHRlck1ldGhvZCA9IHRoaXMucHJvcGVydHlEZXNjcmlwdG9yLmdldFdyaXRlTWV0aG9kKCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIFhNTEVsZW1lbnQgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLSAgICAgKiBpZiB0aGlzIGlzIG5vdCBwcm9jZXNzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKiBAcGFyYW0gc2NoZW1hTWFwCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgdG8gc2VuZCB0aGUgWG1sRWxlbWVudCBjb3JyZWN0bHkKLSAgICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgaWYgKCF0aGlzLnR5cGUuaXNTY2hlbWFHZW5lcmF0ZWQoKSkgewotICAgICAgICAgICAgdGhpcy50eXBlLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvciwgc2NoZW1hTWFwKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlEZXNjcmlwdG9yKFByb3BlcnR5RGVzY3JpcHRvciBwcm9wZXJ0eURlc2NyaXB0b3IpIHsKLSAgICAgICAgdGhpcy5wcm9wZXJ0eURlc2NyaXB0b3IgPSBwcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZCBnZXRHZXR0ZXJNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBnZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2V0dGVyTWV0aG9kKE1ldGhvZCBnZXR0ZXJNZXRob2QpIHsKLSAgICAgICAgdGhpcy5nZXR0ZXJNZXRob2QgPSBnZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZCBnZXRTZXR0ZXJNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBzZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2V0dGVyTWV0aG9kKE1ldGhvZCBzZXR0ZXJNZXRob2QpIHsKLSAgICAgICAgdGhpcy5zZXR0ZXJNZXRob2QgPSBzZXR0ZXJNZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvT3BlcmF0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmI3NzgwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uIHsKLQotICAgIC8qKgotICAgICAqIGphdmFNZXRob2QgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2UgdG8gd2hpY2ggamF2YU1ldGhvZCBiZWxvbmdzCi0gICAgICogbW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzIHNhbWUgYXMgdGhlIHNlcnZpY2UgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotICAgIC8qKgotICAgICAqIHNlcnZpY2UgY2xhc3MgbWV0aG9kIGZvciB0aGlzIGphdmFNZXRob2QKLSAgICAgKi8KLSAgICBwcml2YXRlIE1ldGhvZCBqYXZhTWV0aG9kOwotCi0gICAgLyoqCi0gICAgICogaW5wdXQgcGFyYW1ldGVycyBsaXN0IGZvciB0aGlzIG1ldGhvZChqYXZhTWV0aG9kKQotICAgICAqIHRoaXMgY29uc2lzdHMgb2YgYSBsaXN0IG9mIFBhcmFtZXRlciBvYmplY3RzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGlucHV0UGFyYW1ldGVyczsKLQotICAgIC8qKgotICAgICAqIHJldHVybiB0eXBlIG9mIHRoZSBqYXZhTWV0aG9kCi0gICAgICovCi0gICAgcHJpdmF0ZSBQYXJhbWV0ZXIgb3V0cHV0UGFyYW1ldGVyOwotCi0gICAgLyoqCi0gICAgICogZ2VuZXJhdGVkIFhtbEVsZW1lbnQgZm9yIHRoZSBpbnB1dAotICAgICAqLwotICAgIHByaXZhdGUgWG1sRWxlbWVudCBpbnB1dEVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiBnZW5lcmF0ZWQgWG1sRWxlbWVudCBmb3IgdGhlIG91dHB1dAotICAgICAqLwotICAgIHByaXZhdGUgWG1sRWxlbWVudCBvdXRQdXRFbGVtZW50OwotCi0KLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uKCkgewotICAgICAgICB0aGlzLmlucHV0UGFyYW1ldGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdG9yIHdpdGggdGhlIGphdmEgbWV0aG9kIGZvciB0aGlzIGphdmFNZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgT3BlcmF0aW9uKE1ldGhvZCBvcGVyYXRpb24pIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLmphdmFNZXRob2QgPSBvcGVyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcCkKLSAgICAgICAgICAgIHRocm93cyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2V0IHRoZSBuYW1lLiBuYW1lc3BhY2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzZXQgYnkgdGhlIHNlcnZpY2UKLSAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5qYXZhTWV0aG9kLmdldE5hbWUoKTsKLQotICAgICAgICAvL3BvcHVsYXRlIGlucHV0IHBhcmFtZXRlcnMKLSAgICAgICAgQ2xhc3NbXSBpbnB1dFR5cGVzID0gdGhpcy5qYXZhTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihpbnB1dFR5cGVzW2ldLCJwYXJhbSIgKyBpKTsKLSAgICAgICAgICAgIHBhcmFtZXRlci5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICB0aGlzLmlucHV0UGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBvcHVsYXRlIG91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSA9IHRoaXMuamF2YU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmICghcmV0dXJuVHlwZS5lcXVhbHModm9pZC5jbGFzcykpIHsKLSAgICAgICAgICAgIC8vIGkuZS4gd2UgaGF2ZSBhIHJldHVybiB0eXBlCi0gICAgICAgICAgICB0aGlzLm91dHB1dFBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIocmV0dXJuVHlwZSwgInJldHVybiIpOwotICAgICAgICAgICAgdGhpcy5vdXRwdXRQYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcG9wdWxhdGUgZXhjZXB0aW9uIGRhdGEKLSAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25UeXBlID0gdGhpcy5qYXZhTWV0aG9kLmdldEV4Y2VwdGlvblR5cGVzKCk7Ci0gICAgICAgIFN0cmluZyBleGNlcHRpb25OYW1lOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlOwotICAgICAgICBmb3IgKGludCBpPTA7aTxleGNlcHRpb25UeXBlLmxlbmd0aDtpKyspewotICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9IGV4Y2VwdGlvblR5cGVbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgZXhjZXB0aW9uTmFtZSA9IGV4Y2VwdGlvbk5hbWUuc3Vic3RyaW5nKGV4Y2VwdGlvbk5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICAgICAgbmFtZXNwYWNlID0gY29uZmlndXJhdG9yLmdldE5hbWVzcGFjZShleGNlcHRpb25UeXBlW2ldLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihleGNlcHRpb25UeXBlW2ldLGV4Y2VwdGlvbk5hbWUsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgIHBhcmFtZXRlci5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvcixwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgIGlmICghZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcC5jb250YWluc0tleShleGNlcHRpb25UeXBlW2ldKSl7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcC5wdXQoZXhjZXB0aW9uVHlwZVtpXSxwYXJhbWV0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBleGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlIGlucHV0IGVsZW1lbnQgYW5kIG91dCBwdXQgZWxlbWVudHMKLSAgICAgICAgLy8gcHV0dGluZyB0aGUgb3RoZXIgcmVsYXZlbnQgc2NoZW1hIHBhcnRzIHRvIHRoZSBzY2hlbWFNYXAKLQotICAgICAgICAvLyBnZXQgdGhlIHNjaGVtYSB0byBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICBpZiAoc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG5hbWVzcGFjZSBmb3IgdGhpcyBzY2hlbWEKLSAgICAgICAgICAgIHNjaGVtYU1hcC5wdXQodGhpcy5uYW1lc3BhY2UsIG5ldyBYbWxTY2hlbWEodGhpcy5uYW1lc3BhY2UpKTsKLSAgICAgICAgfQotICAgICAgICBYbWxTY2hlbWEgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hTWFwLmdldCh0aGlzLm5hbWVzcGFjZSk7Ci0KLQotICAgICAgICBpZiAoIWNvbmZpZ3VyYXRvci5pc0JhcmUoKSkgewotCi0gICAgICAgICAgICAvLyBnZW5lcmF0aW5nIHRoZSBpbnB1dCBlbGVtZW50Ci0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudCA9IG5ldyBYbWxFbGVtZW50SW1wbChmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZXROYW1lKHRoaXMubmFtZSk7Ci0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZXROYW1lc3BhY2UodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2V0VG9wRWxlbWVudCh0cnVlKTsKLSAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRFbGVtZW50KHRoaXMuaW5wdXRFbGVtZW50KTsKLQotICAgICAgICAgICAgLy8gc2V0IHRoZSBjb21wbGV4IHR5cGUgZm9yIHRoaXMgZWxlbWVudAotICAgICAgICAgICAgWG1sVHlwZSB4bWxUeXBlID0gbmV3IFhtbFR5cGVJbXBsKCk7Ci0gICAgICAgICAgICB4bWxUeXBlLnNldEFub255bW91cyh0cnVlKTsKLSAgICAgICAgICAgIHhtbFR5cGUuc2V0U2ltcGxlVHlwZShmYWxzZSk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXI7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmlucHV0UGFyYW1ldGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlci5pc1NjaGVtYUdlbmVyYXRlZCgpKXsKLSAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLHNjaGVtYU1hcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRFbGVtZW50KCkuc2V0VG9wRWxlbWVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgeG1sVHlwZS5hZGRFbGVtZW50KHBhcmFtZXRlci5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIFFOYW1lIGVsZW1lbnRUeXBlUU5hbWUgPSBwYXJhbWV0ZXIuZ2V0RWxlbWVudCgpLmdldFR5cGUoKS5nZXRRbmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmNvbnRhaW5zTmFtZXNwYWNlKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBhZGQgaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZXRUeXBlKHhtbFR5cGUpOwotCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgb3V0cHV0IEVsZW1lbnQKLSAgICAgICAgICAgIHRoaXMub3V0UHV0RWxlbWVudCA9IG5ldyBYbWxFbGVtZW50SW1wbChmYWxzZSk7Ci0gICAgICAgICAgICB0aGlzLm91dFB1dEVsZW1lbnQuc2V0TmFtZSh0aGlzLm5hbWUgKyAiUmVzcG9uc2UiKTsKLSAgICAgICAgICAgIHRoaXMub3V0UHV0RWxlbWVudC5zZXROYW1lc3BhY2UodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgdGhpcy5vdXRQdXRFbGVtZW50LnNldFRvcEVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuYWRkRWxlbWVudCh0aGlzLm91dFB1dEVsZW1lbnQpOwotCi0gICAgICAgICAgICB4bWxUeXBlID0gbmV3IFhtbFR5cGVJbXBsKCk7Ci0gICAgICAgICAgICB4bWxUeXBlLnNldEFub255bW91cyh0cnVlKTsKLSAgICAgICAgICAgIHhtbFR5cGUuc2V0U2ltcGxlVHlwZShmYWxzZSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5vdXRwdXRQYXJhbWV0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghdGhpcy5vdXRwdXRQYXJhbWV0ZXIuaXNTY2hlbWFHZW5lcmF0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0UGFyYW1ldGVyLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxUeXBlLmFkZEVsZW1lbnQodGhpcy5vdXRwdXRQYXJhbWV0ZXIuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50VHlwZVFOYW1lID0gdGhpcy5vdXRwdXRQYXJhbWV0ZXIuZ2V0RWxlbWVudCgpLmdldFR5cGUoKS5nZXRRbmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmNvbnRhaW5zTmFtZXNwYWNlKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBhZGQgaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5vdXRQdXRFbGVtZW50LnNldFR5cGUoeG1sVHlwZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vVE9ETzogZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIGJhcmUgY2FzZQotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0T3V0cHV0UGFyYW1ldGVyKCkgewotICAgICAgICByZXR1cm4gb3V0cHV0UGFyYW1ldGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dFBhcmFtZXRlcihQYXJhbWV0ZXIgb3V0cHV0UGFyYW1ldGVyKSB7Ci0gICAgICAgIHRoaXMub3V0cHV0UGFyYW1ldGVyID0gb3V0cHV0UGFyYW1ldGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxFbGVtZW50IGdldElucHV0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dEVsZW1lbnQoWG1sRWxlbWVudCBpbnB1dEVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQgPSBpbnB1dEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVsZW1lbnQgZ2V0T3V0UHV0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG91dFB1dEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0UHV0RWxlbWVudChYbWxFbGVtZW50IG91dFB1dEVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5vdXRQdXRFbGVtZW50ID0gb3V0UHV0RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kIGdldEphdmFNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhTWV0aG9kOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFNZXRob2QoTWV0aG9kIGphdmFNZXRob2QpIHsKLSAgICAgICAgdGhpcy5qYXZhTWV0aG9kID0gamF2YU1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRJbnB1dFBhcmFtZXRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dFBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5wdXRQYXJhbWV0ZXJzKExpc3QgaW5wdXRQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIHRoaXMuaW5wdXRQYXJhbWV0ZXJzID0gaW5wdXRQYXJhbWV0ZXJzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9QYXJhbWV0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjM3MmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9QYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuaW1wbC5YbWxFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlcy5NYXBUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGtlZXAgdGhlIFBhcmFtZXRlciBkZXRhaWxzIG9mIGEgamF2YSBtZXRob2QKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtZXRlciB7Ci0KLSAgICAvKioKLSAgICAgKiBqYXZhIGNsYXNzIHJlcHJlc2VudHMgdGhpcyBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGphdmFDbGFzczsKLSAgICAvKioKLSAgICAgKiBwYXJhbWV0ZXIgbmFtZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2Ugb2YgdGhpcyBwYXJhbWV0ZXIKLSAgICAgKiB0aGlzIHNob3VsZCBhbHdheXMgbnVsbC4gaS5lIG5vIG5hbWVzcGFjZSBmb3IgYW4gcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0gICAgLyoqCi0gICAgICogWG1sVHlwZSBvZiB0aGUgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIHBhcmFtZXRlciBpcyBhcnJheSB0eXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXk7Ci0KLSAgICAvKioKLSAgICAgKiB4bWwgRWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICAvKioKLSAgICAgKiB3aGV0aGVyIHRoZSBzY2hlbWEgaXMgZ2VuZXJhdGVkIG9yIG5vdAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZDsKLQotICAgIC8qKgotICAgICAqIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNsYXNzVHlwZTsKLQotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBQYXJhbWV0ZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmFtZXRlcihDbGFzcyBqYXZhQ2xhc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gamF2YUNsYXNzOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIoQ2xhc3MgamF2YUNsYXNzLCBTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzKGphdmFDbGFzcywgbmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ2xhc3MgYmFzZUNsYXNzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5jbGFzc1R5cGUgPSBVdGlsLmdldENsYXNzVHlwZSh0aGlzLmphdmFDbGFzcyk7Ci0gICAgICAgICAgICBpZiAoKHRoaXMuY2xhc3NUeXBlICYgQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgPT0gQ29uc3RhbnRzLkNPTExFQ1RJT05fVFlQRSkgewotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGEgY29sbGVjdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gT2JqZWN0LmNsYXNzOwotICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5jbGFzc1R5cGUgJiBDb25zdGFudHMuTUFQX1RZUEUpID09IENvbnN0YW50cy5NQVBfVFlQRSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbWVwIHR5cGUgd2Ugc2V0IGEgY3VzdG9tIHR5cGUgZm9yIGl0LgotICAgICAgICAgICAgICAgIHRoaXMuaXNBcnJheSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gTWFwVHlwZS5jbGFzczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgdGhpcy5pc0FycmF5ID0gdGhpcy5qYXZhQ2xhc3MuaXNBcnJheSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgPSB0aGlzLmphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gdGhpcy5qYXZhQ2xhc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvY2Vzc2VkVHlwZU1hcC5jb250YWluc0tleShiYXNlQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaS5lIHdlIGhhdmUgYWxyZWFkeSBwcm9jZXNzIHRoaXMgdHlwZQotICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IChUeXBlKSBwcm9jZXNzZWRUeXBlTWFwLmdldChiYXNlQ2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChSTUlCZWFuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmFzZUNsYXNzKSkgewotICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgYmVhbiBpcyBhbiBSTUlCZWFuIHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHJldHVybgotICAgICAgICAgICAgICAgIC8vIGZyb20gdGhhdCBiZWFuLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIE1ldGhvZCBnZXRCZWFuQ2xhc3NNZXRob2QgPSBiYXNlQ2xhc3MuZ2V0TWV0aG9kKCJnZXRCZWFuQ2xhc3MiLCBuZXcgQ2xhc3NbXXt9KTsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3Mgcm1pQmVhblR5cGUgPSAoQ2xhc3MpIGdldEJlYW5DbGFzc01ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde30pOwotICAgICAgICAgICAgICAgICAgICBpZiAocm1pQmVhblR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gKFR5cGUpIHJtaUJlYW5UeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlTWFwLnB1dChiYXNlQ2xhc3MsIHRoaXMudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oInRoZXJlIGlzIG5vIHR5cGUgY2xhc3MgZm9yIHJtaSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbigiTm8gZ2V0QmVhbkNsYXNzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBybWkgYmVhbiBjbGFzcyAiICsgYmFzZUNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJObyBnZXRCZWFuQ2xhc3MgbWV0aG9kIGlzIG5vdCBkZWZpbmVkIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJtaSBiZWFuIGNsYXNzICIgKyBiYXNlQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG5ldyBUeXBlSW1wbChiYXNlQ2xhc3MpOwotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gZG8gdGhpcyBiZWZvcmUgY2FsbGluZyB0byBwb3B1bGF0ZSBtZXRhIGRhdGEKLSAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBjaXJlY3VsYXIgcmVmZXJlbmNlcwotICAgICAgICAgICAgICAgIHByb2Nlc3NlZFR5cGVNYXAucHV0KGJhc2VDbGFzcywgdGhpcy50eXBlKTsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKCJDYW4gbm90IGluc3RhdGFpdGUgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMuamF2YUNsYXNzLmdldE5hbWUoKSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24oIkNhbiBub3QgaW5zdGF0YWl0ZSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICsgdGhpcy5qYXZhQ2xhc3MuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHNldHMgdGhlIFhNTEVsZW1lbnQgY29ycmVjdGx5LiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkKLSAgICAgKiBpZiB0aGlzIGlzIG5vdCBwcm9jZXNzZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3IKLSAgICAgKiBAcGFyYW0gc2NoZW1hTWFwCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgdG8gc2VuZCB0aGUgWG1sRWxlbWVudCBjb3JyZWN0bHkKLQotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLQotICAgICAgICBpZiAoIXRoaXMudHlwZS5pc1NjaGVtYUdlbmVyYXRlZCgpKSB7Ci0gICAgICAgICAgICB0aGlzLnR5cGUuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IFhtbEVsZW1lbnRJbXBsKCF0aGlzLmlzQXJyYXkgJiYgdGhpcy50eXBlLmdldEphdmFDbGFzcygpLmlzUHJpbWl0aXZlKCkpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZSh0aGlzLm5hbWUpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TmFtZXNwYWNlKHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgdGhpcy5lbGVtZW50LnNldFR5cGUodGhpcy50eXBlLmdldFhtbFR5cGUoKSk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBcnJheSh0aGlzLmlzQXJyYXkpOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLSAgICAgICAgcmV0dXJuIGlzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJyYXkoYm9vbGVhbiBhcnJheSkgewotICAgICAgICBpc0FycmF5ID0gYXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFhtbEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChYbWxFbGVtZW50IGVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENsYXNzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1R5cGUoaW50IGNsYXNzVHlwZSkgewotICAgICAgICB0aGlzLmNsYXNzVHlwZSA9IGNsYXNzVHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjMwMDZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlIHsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICAvKioKLSAgICAgKiBqYXZhIGNsYXNzIGZvciB3aGljaCB3ZSBnb2luZyB0byBjcmVhdGUgdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIENsYXNzIGphdmFDbGFzczsKLQotICAgIC8qKgotICAgICAqIHRoaXMgbGlzdCBjb250YWlucyBhIExpc3Qgb2YgT3BlcmF0aW9uIG9iamVjdHMgcmVwcmVzZW50aW5nCi0gICAgICogb3BlcmF0aW9ucyBvZiB0aGUgamF2YSBjbGFzcwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBvcGVyYXRpb25zOwotCi0gICAgcHJpdmF0ZSBNYXAgcHJvY2Vzc2VkVHlwZU1hcDsKLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0gICAgcHJpdmF0ZSBNYXAgc2NoZW1hTWFwOwotCi0gICAgLyoqCi0gICAgICogdGhpcyBtYXAga2VlcHMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBuYW1lIGFuZCBleGNlcHRpb24gcmVsYXZlbnQgcGFyYW1ldGVyCi0gICAgICogdXNlZCBpbiBzZXJpYWxpemF0aW9uLiB3ZSBuZWVkIHRvIGtlZXAgdGhlIG1lc3NhZ2UgbmFtZSB1bmlxdWUgd2l0aGluIHRoZQotICAgICAqIHNlcnZpY2UuIHNvIGV4Y2VwdGlvbmNsYXNzIG1hcCBzaG91bGQgYmUgZ2xvYmFsCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcDsKLQotICAgIC8qKgotICAgICAqIHRoaXMgbWFwIGtlZXBzIHRoZSBleGNlcHRpb24gUU5hbWUgYW5kIGV4Y2VwdGlvbiByZWxhdmVudCBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBleGNlcHRpb25RTmFtZVRvUGFyYW1ldGVyTWFwOwotCi0gICAgLyoqCi0gICAgICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlKCkgewotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuZXhjZXB0aW9uUU5hbWVUb1BhcmFtZXRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY29uc3RyYWN1dG9yIHdpdGggdGhlIGphdmEgY2xhc3MgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIGphdmFDbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlKENsYXNzIGphdmFDbGFzcywgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gamF2YUNsYXNzOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIHRoaXMgbWV0aG9kIHN1cHBvc2UgdG8gZmlsbCBhbGwgdGhlIG9wZXJhdGlvbnMgZGF0YSB1c2luZyB0aGUgamF2YQotICAgICAqIGNsYXNzIGdpdmVuLiBoZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSBqYXZhQ2xhc3MgaXMgcHJvcGVybHkgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoKSB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNldCB0aGUgc2VydmljZSBuYW1lIHVzaW5nIHRoZSBqYXZhIGNsYXNzIG5hbWUKLSAgICAgICAgdGhpcy5uYW1lID0gamF2YUNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBwYWNrYWdlIHBhcnQKLSAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5uYW1lLnN1YnN0cmluZyh0aGlzLm5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IGNvbmZpZ3VyYXRvci5nZXROYW1lc3BhY2UoamF2YUNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotICAgICAgICB0aGlzLnByb2Nlc3NlZFR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vIHBvcHVsYXRlIG9wZXJhdGlvbnMKLSAgICAgICAgLy9UT0RPOiB0aGlzIG1ldGhvZCByZXR1cm5zIHVuaW5oZXJpdGVkIG1ldGhvZHMgZmluZCBhIHdheSB0byBnZXQgdGhlbSBhcyB3ZWxsCi0gICAgICAgIE1ldGhvZFtdIGphdmFNZXRob2RzID0gdGhpcy5qYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgIE1ldGhvZCBqYXZhTWV0aG9kOwotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGphdmFNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBqYXZhTWV0aG9kID0gamF2YU1ldGhvZHNbaV07Ci0gICAgICAgICAgICAvLyB3ZSBnZW5lcmF0ZSBvcHJhdGlvbnMgb25seSBmcm9tIHRoZSBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgLy9UT0RPIDogcmVtb3ZlIG92ZXJsb2FkIG1ldGhvZHMKLSAgICAgICAgICAgIGlmICh0aGlzLmphdmFDbGFzcy5pc0ludGVyZmFjZSgpIHx8IChNb2RpZmllci5pc1B1YmxpYyhqYXZhTWV0aG9kLmdldE1vZGlmaWVycygpKSAmJgotICAgICAgICAgICAgICAgICAgICAhTW9kaWZpZXIuaXNBYnN0cmFjdChqYXZhTWV0aG9kLmdldE1vZGlmaWVycygpKSkpIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKGphdmFNZXRob2QpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXROYW1lc3BhY2UodGhpcy5uYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgdGhpcy5wcm9jZXNzZWRUeXBlTWFwLCB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXApOwotICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9ucy5hZGQob3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCB0aGUgZXh0ZW5zaW9uIGNsYXNzZXMgaWYgdGhleSBoYXZlIG5vdCBhbHJlYWR5IHBvcHVsYXRlZAotICAgICAgICBDbGFzcyBleHRlbnNpb25DbGFzcyA9IG51bGw7Ci0gICAgICAgIFR5cGUgZXh0ZW5zaW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuY29uZmlndXJhdG9yLmdldEV4dGVuc2lvbkNsYXNzZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4dGVuc2lvbkNsYXNzID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzZWRUeXBlTWFwLmNvbnRhaW5zS2V5KGV4dGVuc2lvbkNsYXNzKSkgewotICAgICAgICAgICAgICAgIGV4dGVuc2lvblR5cGUgPSBuZXcgVHlwZUltcGwoZXh0ZW5zaW9uQ2xhc3MpOwotICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVHlwZU1hcC5wdXQoZXh0ZW5zaW9uQ2xhc3MsIGV4dGVuc2lvblR5cGUpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvblR5cGUucG9wdWxhdGVNZXRhRGF0YSh0aGlzLmNvbmZpZ3VyYXRvciwgdGhpcy5wcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAvL2ZpcnN0IHdlIGhhdmUgdG8gZ2VuZXJhdGUgdGhlIGlucHV0IGFuZCBvdXRwdXQgZWxlbWVudHMKLSAgICAgICAgLy8gdG8gb3BlcmF0aW9ucwotCi0gICAgICAgIC8vIGNyZWF0ZSBzY2hlbWEgbWFwIG9iamVjdCBhbmQgYWRkIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9iamVjdAotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuc2NoZW1hTWFwLnB1dCh0aGlzLm5hbWVzcGFjZSwgbmV3IFhtbFNjaGVtYSh0aGlzLm5hbWVzcGFjZSkpOwotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5nZW5lcmF0ZVNjaGVtYShjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hTWFwLAotICAgICAgICAgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGV4Y2VwdGlvbiBjbGFzcyBlbGVtZW50cyB0byB0aGUgc2NoZW1hCi0gICAgICAgIGdlbmVyYXRlU2NoZW1hRm9yRXhjZXB0aW9uUGFyYW1ldGVycygpOwotCi0gICAgICAgIC8vIGdlbmVyYXRlIHRoZSBzY2hlbWEgZm9yIG90aGVyIGV4dGVuc2lvbiBjbGFzc2VzCi0gICAgICAgIENsYXNzIGV4dGVuc2lvbkNsYXNzID0gbnVsbDsKLSAgICAgICAgVHlwZSBleHRlbnNpb25UeXBlID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5jb25maWd1cmF0b3IuZ2V0RXh0ZW5zaW9uQ2xhc3NlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZXh0ZW5zaW9uQ2xhc3MgPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZSA9IChUeXBlKSB0aGlzLnByb2Nlc3NlZFR5cGVNYXAuZ2V0KGV4dGVuc2lvbkNsYXNzKTsKLSAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uVHlwZS5pc1NjaGVtYUdlbmVyYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uVHlwZS5nZW5lcmF0ZVNjaGVtYSh0aGlzLmNvbmZpZ3VyYXRvciwgdGhpcy5zY2hlbWFNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVTY2hlbWFGb3JFeGNlcHRpb25QYXJhbWV0ZXJzKCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghcGFyYW1ldGVyLmlzU2NoZW1hR2VuZXJhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUU5hbWUgZWxlbWVudFR5cGVRTmFtZSA9IHBhcmFtZXRlci5nZXRFbGVtZW50KCkuZ2V0VHlwZSgpLmdldFFuYW1lKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdGhlIHNjaGVtYSB0byBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgaWYgKHNjaGVtYU1hcC5nZXQoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBuYW1lc3BhY2UgZm9yIHRoaXMgc2NoZW1hCi0gICAgICAgICAgICAgICAgc2NoZW1hTWFwLnB1dChlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuZXcgWG1sU2NoZW1hKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFhtbFNjaGVtYSB4bWxTY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFNYXAuZ2V0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgaWYgKCF4bWxTY2hlbWEuY29udGFpbnNOYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKSkgewotICAgICAgICAgICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0ID0gbmV3IFhtbEltcG9ydChlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxTY2hlbWEuYWRkTmFtZXNwYWNlKGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1ldGVyLmdldEVsZW1lbnQoKS5zZXRUb3BFbGVtZW50KHRydWUpOwotICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEVsZW1lbnQocGFyYW1ldGVyLmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvblFOYW1lVG9QYXJhbWV0ZXJNYXAucHV0KGVsZW1lbnRUeXBlUU5hbWUsIHBhcmFtZXRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvcGVyYXRpb24gZm9yIHRoZSBnaXZlbiBuYW1lIGlmIGZvdW5kCi0gICAgICogb3RoZXJ3aXNlIHJldHVybiBudWxsCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uTmFtZQotICAgICAqIEByZXR1cm4gb3BlcmF0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgT3BlcmF0aW9uIGdldE9wZXJhdGlvbihTdHJpbmcgb3BlcmF0aW9uTmFtZSkgewotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBvcGVyYXRpb25Gb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvcGVyYXRpb25OYW1lKSkgewotICAgICAgICAgICAgICAgIG9wZXJhdGlvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAob3BlcmF0aW9uRm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBQYXJhbWV0ZXIgZ2V0RXhjZXB0aW9uUGFyYW1ldGVyKENsYXNzIGV4Y2VwdGlvbkNsYXNzKSB7Ci0gICAgICAgIHJldHVybiAoUGFyYW1ldGVyKSB0aGlzLmV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAuZ2V0KGV4Y2VwdGlvbkNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldEV4Y2VwdGlvblBhcmFtZXRlcihRTmFtZSBleGNlcHRpb25FbGVtZW50UW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChQYXJhbWV0ZXIpIHRoaXMuZXhjZXB0aW9uUU5hbWVUb1BhcmFtZXRlck1hcC5nZXQoZXhjZXB0aW9uRWxlbWVudFFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0T3BlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9ucyhMaXN0IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFByb2Nlc3NlZFR5cGVNYXAoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzZWRUeXBlTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NlZFR5cGVNYXAoTWFwIHByb2Nlc3NlZFR5cGVNYXApIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRUeXBlTWFwID0gcHJvY2Vzc2VkVHlwZU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0b3IoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldFNjaGVtYU1hcCgpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFNYXAoTWFwIHNjaGVtYU1hcCkgewotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IHNjaGVtYU1hcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAoKSB7Ci0gICAgICAgIHJldHVybiBleGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAoTWFwIGV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXApIHsKLSAgICAgICAgdGhpcy5leGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwID0gZXhjZXB0aW9uQ2xhc3NUb1BhcmFtZXRlck1hcDsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9UeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlYzAxMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGUgewotCi0gICAgLyoqCi0gICAgICogcG9wdWFsYXRlIHRoZSBtZXRhIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLCBNYXAgcHJvY2Vzc2VkVHlwZU1hcCkgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCBzZXRzIHRoZSB4bWxUeXBlIGNvcnJlY3RseS4gdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAotICAgICAqIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwgTWFwIHNjaGVtYU1hcCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUFsbEVsZW1lbnRGaWVsZHMoTGlzdCBlbGVtZW50RmllbGRzTGlzdCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhMaXN0IGF0dHJpYnV0ZUZpZWxkc0xpc3QpOwotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudEZpZWxkcygpOwotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsQXR0cmlidXRlRmllbGRzKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hR2VuZXJhdGVkKGJvb2xlYW4gc2NoZW1hR2VuZXJhdGVkKTsKLQotICAgIHB1YmxpYyBDbGFzcyBnZXRKYXZhQ2xhc3MoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpOwotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudEZpZWxkcygpOwotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHMpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSk7Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRYbWxUeXBlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxUeXBlKFhtbFR5cGUgeG1sVHlwZSk7Ci0KLSAgICBwdWJsaWMgVHlwZSBnZXRQYXJlbnRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRUeXBlKFR5cGUgcGFyZW50VHlwZSk7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVGaWVsZHMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUZpZWxkcyhMaXN0IGF0dHJpYnV0ZUZpZWxkcyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvaW1wbC9UeXBlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9pbXBsL1R5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWJlZjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9pbXBsL1R5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BdHRyaWJ1dGVGaWVsZDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5FbGVtZW50RmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sSW1wb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGwuWG1sVHlwZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5KYXZhVHlwZVRvUU5hbWVNYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFR5cGVJbXBsIGltcGxlbWVudHMgVHlwZSB7Ci0gICAgLyoqCi0gICAgICogamF2YSBjbGFzcyBjb3JyZXNwb25kcyB0byB0aGlzIFhtbFR5cGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBqYXZhQ2xhc3M7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGVsZW1lbnQgRmllbGQgb2JqZWN0cyBmb3IgdGhpcyBqYXZhIGNsYXNzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGVsZW1lbnRGaWVsZHM7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGF0dHJpYnV0ZSBGaWVsZCBvYmplY3RzIGZvciB0aGlzIGphdmEgY2xhc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgYXR0cmlidXRlRmllbGRzOwotCi0gICAgLyoqCi0gICAgICogbmFtZSBvZiB0aGUgVHlwZSA6IGNsYXNzIG5hbWUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgLyoqCi0gICAgICogbmFtZXNwYWNlIG9mIHRoZSB0eXBlIDogZGVwZW5kcyBvbiB0aGUgcGFja2FnZQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIHBhcmVudCB0eXBlIGZvciB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFR5cGUgcGFyZW50VHlwZTsKLQotICAgIC8qKgotICAgICAqIHhtbCBtZXRhZGF0YSB0eXBlIGNvcnJlcG9uZGluZyB0byB0aGlzIHR5cGUgb2JqZWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHhtbFR5cGU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTY2hlbWFHZW5lcmF0ZWQ7Ci0KLQotICAgIHB1YmxpYyBUeXBlSW1wbCgpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50RmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZUZpZWxkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHlwZUltcGwoQ2xhc3MgamF2YUNsYXNzKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcG9wdWFsYXRlIHRoZSBtZXRhIGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGphdmEgY2xhc3Mgc2hvdWxkIGFscmFkeSBoYXZlIHBvcHVsYXRlZC4KLQotICAgICAgICAvLyBpZiBqYXZhVHlwZVRvUU5hbWVNYXAgY29udGFpbnMgdGhpcyBrZXkgdGhlbiB0aGlzIGlzIGFuIGVpdGhlcgotICAgICAgICAvLyBwcmltaXRpdmUgdHlwZSBvciBhIFNpbXBsZSBrbm93biB0eXBlLiB3ZSBkb24ndCBoYXZlIHRvIHBvcHVsYXRlCi0gICAgICAgIC8vIHRoZSBhdHRyaWJ1ZXMKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghSmF2YVR5cGVUb1FOYW1lTWFwLmNvbnRhaW5zS2V5KHRoaXMuamF2YUNsYXNzKSkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuamF2YUNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLm5hbWUuc3Vic3RyaW5nKHRoaXMubmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBjb25maWd1cmF0b3IuZ2V0TmFtZXNwYWNlKHRoaXMuamF2YUNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgQ2xhc3Mgc3VwZXJDbGFzcyA9IHRoaXMuamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdXBwZXIgY2xhc3MgaXMgT2JqZWN0IGNsYXNzIG5vdGhpbmcgdG8gd2FycnkKLSAgICAgICAgICAgICAgICBpZiAoIXN1cGVyQ2xhc3MuZXF1YWxzKE9iamVjdC5jbGFzcykgJiYgIXN1cGVyQ2xhc3MuZXF1YWxzKEV4Y2VwdGlvbi5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGlzIGlzIGFuIGV4dGVuc2lvbiBjbGFzcyBhbmQgd2UgaGF2ZSB0byBwcm9jZXNzaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzZWRUeXBlTWFwLmNvbnRhaW5zS2V5KHN1cGVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHN1cGVyQ2xhc3NUeXBlID0gbmV3IFR5cGVJbXBsKHN1cGVyQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkVHlwZU1hcC5wdXQoc3VwZXJDbGFzcywgc3VwZXJDbGFzc1R5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzc1R5cGUucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFyZW50VHlwZSgoVHlwZSkgcHJvY2Vzc2VkVHlwZU1hcC5nZXQoc3VwZXJDbGFzcykpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaW5mb3JtYXRpbiBvbmx5IGFib3V0IHRoaXMgY2xhc3MKLSAgICAgICAgICAgICAgICAvLyBzdXBwZXIgY2xhc3MgaW5mb3JtYXRpb24gaXMgcHJvY2Vzc2VkIGluIHRoZSBzdXBlciBjbGFzcyB0eXBlCi0gICAgICAgICAgICAgICAgQ2xhc3NJbmZvIGN1c3RvbUNsYXNzSW5mbyA9IGNvbmZpZ3VyYXRvci5nZXRDbGFzc0luZm8odGhpcy5qYXZhQ2xhc3MpOwotICAgICAgICAgICAgICAgIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKHRoaXMuamF2YUNsYXNzLCB0aGlzLmphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCkpOwotICAgICAgICAgICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHByb3BlcnR5RGVzY3JpcHRvcnMgPSBiZWFuSW5mby5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0gICAgICAgICAgICAgICAgRmllbGQgZmllbGQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eURlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2xhc3MgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBpZiAoKGN1c3RvbUNsYXNzSW5mbyAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXN0b21DbGFzc0luZm8uZ2V0RmllbGRJbmZvKHByb3BlcnR5RGVzY3JpcHRvcnNbaV0uZ2V0TmFtZSgpKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRJbmZvIGZpZWxkSW5mbyA9IGN1c3RvbUNsYXNzSW5mby5nZXRGaWVsZEluZm8ocHJvcGVydHlEZXNjcmlwdG9yc1tpXS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSW5mby5pc0VsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkID0gbmV3IEVsZW1lbnRGaWVsZChwcm9wZXJ0eURlc2NyaXB0b3JzW2ldLCB0aGlzLm5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZFR5cGVNYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgdGhlIGF0dHJpYnV0ZSBuYW1lIHNwYWNlIGFzIG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IG5ldyBBdHRyaWJ1dGVGaWVsZChwcm9wZXJ0eURlc2NyaXB0b3JzW2ldLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvciwgcHJvY2Vzc2VkVHlwZU1hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVGaWVsZHMuYWRkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZEluZm8uZ2V0WG1sTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5zZXROYW1lKGZpZWxkSW5mby5nZXRYbWxOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBuZXcgRWxlbWVudEZpZWxkKHByb3BlcnR5RGVzY3JpcHRvcnNbaV0sIHRoaXMubmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLnBvcHVsYXRlTWV0YURhdGEoY29uZmlndXJhdG9yLCBwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEZpZWxkcy5hZGQoZmllbGQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgT2NjdXJlZCB3aGlsZSBnZXR0aW5nIHRoZSBCZWFuIGluZm8gb2YgdGhlIGNsYXNzICIgKyB0aGlzLmphdmFDbGFzcy5nZXROYW1lKCksIGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIG1ldGhvZCBzZXRzIHRoZSB4bWxUeXBlIGNvcnJlY3RseS4gdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAotICAgICAqIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBwcm9jZXNzZWQKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdG9yCi0gICAgICogQHBhcmFtIHNjaGVtYU1hcAotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0byBwb3B1bGF0ZSB0aGUgeG1sVHlwZSBvYmplY3QgcHJvcGVybHkKLSAgICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgIGlmIChKYXZhVHlwZVRvUU5hbWVNYXAuY29udGFpbnNLZXkodGhpcy5qYXZhQ2xhc3MpKXsKLSAgICAgICAgICAgIC8vIGkuZS4gdGhpcyBpcyBhIGJhc2ljIHR5cGUKLSAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VzcyBvciBhZGQgdGhpcyB0byBzY2hlbWEgbGlzdAotICAgICAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFhtbFR5cGVJbXBsKEphdmFUeXBlVG9RTmFtZU1hcC5nZXRUeXBlUU5hbWUodGhpcy5qYXZhQ2xhc3MpKTsKLSAgICAgICAgICAgIHRoaXMueG1sVHlwZS5zZXRTaW1wbGVUeXBlKHRydWUpOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAvLyBnZXQgdGhlIHNjaGVtYSB0byBhZGQgdGhlIGNvbXBsZXggdHlwZQotICAgICAgICAgICAgaWYgKHNjaGVtYU1hcC5nZXQodGhpcy5uYW1lc3BhY2UpID09IG51bGwpewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBuYW1lc3BhY2UgZm9yIHRoaXMgc2NoZW1hCi0gICAgICAgICAgICAgICAgc2NoZW1hTWFwLnB1dCh0aGlzLm5hbWVzcGFjZSwgbmV3IFhtbFNjaGVtYSh0aGlzLm5hbWVzcGFjZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYSA9IChYbWxTY2hlbWEpIHNjaGVtYU1hcC5nZXQodGhpcy5uYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGdlbmVyYXRlIGEgY29tcGxleCB0eXBlIGZvciB0aGlzCi0gICAgICAgICAgICB0aGlzLnhtbFR5cGUgPSBuZXcgWG1sVHlwZUltcGwobmV3IFFOYW1lKHRoaXMubmFtZXNwYWNlLHRoaXMubmFtZSkpOwotICAgICAgICAgICAgdGhpcy54bWxUeXBlLnNldFNpbXBsZVR5cGUoZmFsc2UpOwotCi0gICAgICAgICAgICAgLy8gc2V0IHRoZSBwYXJlbnQgdHlwZSBmb3IgdGhpcyB0eXBlCi0gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpewotICAgICAgICAgICAgICAgIFR5cGUgcGFyZW50VHlwZSA9IHRoaXMucGFyZW50VHlwZTsKLSAgICAgICAgICAgICAgICBpZiAoIXBhcmVudFR5cGUuaXNTY2hlbWFHZW5lcmF0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudFR5cGUuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLHNjaGVtYU1hcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMueG1sVHlwZS5zZXRQYXJlbnRUeXBlKHBhcmVudFR5cGUuZ2V0WG1sVHlwZSgpKTsKLSAgICAgICAgICAgICAgICAvLyBpbXBvcnQgdGhlIGNvbXBsZXggdHlwZSBuYW1lc3BhY2UgaWYgbmVlZGVkLgotICAgICAgICAgICAgICAgIGlmICgheG1sU2NoZW1hLmNvbnRhaW5zTmFtZXNwYWNlKHRoaXMueG1sVHlwZS5nZXRQYXJlbnRUeXBlKCkuZ2V0UW5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSkpewotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBuYW1lc3BhY2UgZG9lcyBub3QgZXhpc3RzIHdlIGhhdmUgdG8gYWRkIGl0Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy54bWxUeXBlLmdldFBhcmVudFR5cGUoKS5nZXRRbmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KHRoaXMueG1sVHlwZS5nZXRQYXJlbnRUeXBlKCkuZ2V0UW5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWxTY2hlbWEuYWRkSW1wb3J0KHhtbEltcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZE5hbWVzcGFjZSh0aGlzLnhtbFR5cGUuZ2V0UGFyZW50VHlwZSgpLmdldFFuYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhZGQgZWxlbWVudHMgb2YgdGhlIGVsZW1lbnRGaWVsZHMKLSAgICAgICAgICAgIEVsZW1lbnRGaWVsZCBlbGVtZW50RmllbGQ7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmVsZW1lbnRGaWVsZHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgIGVsZW1lbnRGaWVsZCA9IChFbGVtZW50RmllbGQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmICghZWxlbWVudEZpZWxkLmlzU2NoZW1hR2VuZXJhdGVkKCkpewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgYWxyZWFkeSBwcm9jZXNzZWQgcHJvY2VzcyBpdC4KLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZpZWxkLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLnhtbFR5cGUuYWRkRWxlbWVudChlbGVtZW50RmllbGQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbmFtZXNwYWNlcyBvZiB0aGVzZSBlbGVtZW50IGNvbXBsZXggdHlwZXMgcHJvcGVybHkKLSAgICAgICAgICAgICAgICBRTmFtZSBlbGVtZW50VHlwZVFOYW1lID0gZWxlbWVudEZpZWxkLmdldEVsZW1lbnQoKS5nZXRUeXBlKCkuZ2V0UW5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFNjaGVtYS5jb250YWluc05hbWVzcGFjZShlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IG5hbWVzcGFjZSBkb2VzIG5vdCBleGlzdHMgd2UgaGF2ZSB0byBhZGQgaXQKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbEltcG9ydCB4bWxJbXBvcnQgPSBuZXcgWG1sSW1wb3J0KGVsZW1lbnRUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoZWxlbWVudFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vYWRkIGF0dHJpYnV0ZSBmaWVsZHMKLSAgICAgICAgICAgIEF0dHJpYnV0ZUZpZWxkIGF0dHJpYnV0ZUZpZWxkOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5hdHRyaWJ1dGVGaWVsZHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGaWVsZCA9IChBdHRyaWJ1dGVGaWVsZCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVGaWVsZC5pc1NjaGVtYUdlbmVyYXRlZCgpKXsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IGFscmVhZHkgcHJvY2Vzc2VkIHByb2Nlc3MgaXQuCi0gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpZWxkLmdlbmVyYXRlU2NoZW1hKGNvbmZpZ3VyYXRvcixzY2hlbWFNYXApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLnhtbFR5cGUuYWRkQXR0cmlidXRlKGF0dHJpYnV0ZUZpZWxkLmdldEF0dHJpYnV0ZSgpKTsKLSAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIHNldCB0aGUgbmFtZXNwYWNlcyBvZiB0aGVzZSBlbGVtZW50IGNvbXBsZXggdHlwZXMgcHJvcGVybHkKLSAgICAgICAgICAgICAgICBRTmFtZSBhdHRyaWJ1dGVUeXBlUU5hbWUgPSBhdHRyaWJ1dGVGaWVsZC5nZXRBdHRyaWJ1dGUoKS5nZXRUeXBlKCkuZ2V0UW5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFNjaGVtYS5jb250YWluc05hbWVzcGFjZShhdHRyaWJ1dGVUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgbmFtZXNwYWNlIGRvZXMgbm90IGV4aXN0cyB3ZSBoYXZlIHRvIGFkZCBpdAotICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZVR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0ID0gbmV3IFhtbEltcG9ydChhdHRyaWJ1dGVUeXBlUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2NoZW1hLmFkZEltcG9ydCh4bWxJbXBvcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhtbFNjaGVtYS5hZGROYW1lc3BhY2UoYXR0cmlidXRlVHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZpbmFsbHkgYWRkIHRoaXMgY29tcGxleCB0eXBlIHRvIHNjaGVtYSBtYXAKLSAgICAgICAgICAgIHhtbFNjaGVtYS5hZGRDb21wbGV4VHlwZSh0aGlzLnhtbFR5cGUpOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHNMaXN0KXsKLSAgICAgICAgLy8gd2UgaGF2ZSB0byBmaXJzdCBhZGQgdGhlIHBhcmVudCBkZXRhaWxzIHRvIGtlZXAgdGhlIG9yZGVyLgotICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpewotICAgICAgICAgICAgdGhpcy5wYXJlbnRUeXBlLnBvcHVsYXRlQWxsRWxlbWVudEZpZWxkcyhlbGVtZW50RmllbGRzTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudEZpZWxkc0xpc3QuYWRkQWxsKHRoaXMuZWxlbWVudEZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVBbGxBdHRyaWJ1dGVGaWVsZHMoTGlzdCBhdHRyaWJ1dGVGaWVsZHNMaXN0KSB7Ci0gICAgICAgIC8vIHdlIGhhdmUgdG8gZmlyc3QgYWRkIHRoZSBwYXJlbnQgZGV0YWlscyB0byBrZWVwIHRoZSBvcmRlci4KLSAgICAgICAgaWYgKHRoaXMucGFyZW50VHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMucGFyZW50VHlwZS5wb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhdHRyaWJ1dGVGaWVsZHNMaXN0KTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVGaWVsZHNMaXN0LmFkZEFsbCh0aGlzLmF0dHJpYnV0ZUZpZWxkcyk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudEZpZWxkcygpewotICAgICAgICBMaXN0IGFsbEVsZW1lbnRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgcG9wdWxhdGVBbGxFbGVtZW50RmllbGRzKGFsbEVsZW1lbnRzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxFbGVtZW50c0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QWxsQXR0cmlidXRlRmllbGRzKCkgewotICAgICAgICBMaXN0IGFsbEF0dHJpYnV0ZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwb3B1bGF0ZUFsbEF0dHJpYnV0ZUZpZWxkcyhhbGxBdHRyaWJ1dGVzTGlzdCk7Ci0gICAgICAgIHJldHVybiBhbGxBdHRyaWJ1dGVzTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NjaGVtYUdlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2NoZW1hR2VuZXJhdGVkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUdlbmVyYXRlZChib29sZWFuIHNjaGVtYUdlbmVyYXRlZCkgewotICAgICAgICBpc1NjaGVtYUdlbmVyYXRlZCA9IHNjaGVtYUdlbmVyYXRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotICAgICAgICByZXR1cm4gamF2YUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhDbGFzcyBqYXZhQ2xhc3MpIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBqYXZhQ2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnRGaWVsZHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEZpZWxkcyhMaXN0IGVsZW1lbnRGaWVsZHMpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50RmllbGRzID0gZWxlbWVudEZpZWxkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRYbWxUeXBlKCkgewotICAgICAgICByZXR1cm4geG1sVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYbWxUeXBlKFhtbFR5cGUgeG1sVHlwZSkgewotICAgICAgICB0aGlzLnhtbFR5cGUgPSB4bWxUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudFR5cGUoVHlwZSBwYXJlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMucGFyZW50VHlwZSA9IHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlRmllbGRzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlRmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUZpZWxkcyhMaXN0IGF0dHJpYnV0ZUZpZWxkcykgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZUZpZWxkcyA9IGF0dHJpYnV0ZUZpZWxkczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9BYnN0cmFjdFhtbFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL0Fic3RyYWN0WG1sVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTViOTg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL0Fic3RyYWN0WG1sVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxUeXBlIGltcGxlbWVudHMgWG1sVHlwZXsKLQotICAgIC8qKgotICAgICAqIFF1YWxpZmllZCBuYW1lIG9mIHRoZSB4bWxUeXBlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFFOYW1lIHFuYW1lOwotCi0gICAgLyoqCi0gICAgICogaXMgdGhpcyBhbiBhbkFub255bW91cyB0eXBlIHRoaXMgY2FzZSBxbmFtZSBjYW4gYmUgbnVsbAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5vbnltb3VzOwotCi0gICAgLyoqCi0gICAgICogaXMgdGhpcyBpcyBhIGJhc2ljIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbXBsZVR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZWxlbWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGNoaWxkIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBhdHRyaWJ1dGVzOwotCi0gICAgLyoqCi0gICAgICogY29tcGxleCB0eXBlIGVsZW1lbnQgZm9yIHRoaXMgWG1sVHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCBFbGVtZW50IHR5cGVFbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogcGFyZW50IHR5cGUgZm9yIHRoaXMgeG1sIHR5cGUgaWYgaXQgaXMgYW4gZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhtbFR5cGUgcGFyZW50VHlwZTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoWG1sRWxlbWVudCB4bWxFbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMuYWRkKHhtbEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShYbWxBdHRyaWJ1dGUgeG1sQXR0cmlidXRlKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcy5hZGQoeG1sQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0aGlzIGdlbmVyYXRlcyB0aGUgY29tcGxleCB0eXBlIG9ubHkgaWYgaXQgaXMgYW5ub255bW91cyBhbmQKLSAgICAgKiBpcyBub3QgYSBzaW1wbGUgdHlwZQotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAgICogQHBhcmFtIG5hbWVzcGFjZXNUb1ByZWZpeE1hcAotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotCi0gICAgcHVibGljIFFOYW1lIGdldFFuYW1lKCkgewotICAgICAgICByZXR1cm4gcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UW5hbWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgdGhpcy5xbmFtZSA9IHFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5vbnltb3VzKCkgewotICAgICAgICByZXR1cm4gaXNBbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5vbnltb3VzKGJvb2xlYW4gYW5vbnltb3VzKSB7Ci0gICAgICAgIGlzQW5vbnltb3VzID0gYW5vbnltb3VzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2ltcGxlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2ltcGxlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVUeXBlKGJvb2xlYW4gc2ltcGxlVHlwZSkgewotICAgICAgICBpc1NpbXBsZVR5cGUgPSBzaW1wbGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RWxlbWVudHMoTGlzdCBlbGVtZW50cykgewotICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0VHlwZUVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB0eXBlRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlRWxlbWVudChFbGVtZW50IHR5cGVFbGVtZW50KSB7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQgPSB0eXBlRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRQYXJlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gcGFyZW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRUeXBlKFhtbFR5cGUgcGFyZW50VHlwZSkgewotICAgICAgICB0aGlzLnBhcmVudFR5cGUgPSBwYXJlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sQXR0cmlidXRlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxNDBlZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyByZXByZXNlbnRzIGFuZCB4bWwgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlIHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlZCk7Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRUeXBlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbFR5cGUgdHlwZSk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0QXR0cmlidXRlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoRWxlbWVudCBhdHRyaWJ1dGUpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxFbGVtZW50LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Mzg3NjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50IHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmlsbGFibGUoYm9vbGVhbiBuaWxsYWJsZSk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShib29sZWFuIGFycmF5KTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzVG9wRWxlbWVudCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wRWxlbWVudChib29sZWFuIHRvcEVsZW1lbnQpOwotCi0gICAgcHVibGljIFhtbFR5cGUgZ2V0VHlwZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShYbWxUeXBlIHR5cGUpOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzTWluT2NjdXJzMCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0TWluT2NjdXJzMChib29sZWFuIG1pbk9jY3VyczApOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxJbXBvcnQuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL1htbEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWY2ZGNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL1htbEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWw7Ci0KLXB1YmxpYyBjbGFzcyBYbWxJbXBvcnQgewotCi0gICAgLyoqCi0gICAgICogbmFtZXNwYWNlIHRvIGltcG9ydAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIHNjaGVtYSBsb2NhdGlvbiBmb3IgaW1wb3J0IHNjaGVtYQotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUxvY2F0aW9uOwotCi0gICAgcHVibGljIFhtbEltcG9ydCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sSW1wb3J0KFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHNjaGVtYUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9uKFN0cmluZyBzY2hlbWFMb2NhdGlvbikgewotICAgICAgICB0aGlzLnNjaGVtYUxvY2F0aW9uID0gc2NoZW1hTG9jYXRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sU2NoZW1hLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxTY2hlbWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzZGNiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9YbWxTY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFhtbFNjaGVtYSB7Ci0KLSAgICAvKioKLSAgICAgKiB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBvdGhlciBkZWNsYXJlZCBuYW1lc3BhY2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IG5hbWVzcGFjZXM7Ci0KLSAgICAvKioKLSAgICAgKiB0b3AgbGV2ZWwgZWxlbWVudHMgZm9yIHRoaXMgc2NoZW1hCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0gICAgLyoqCi0gICAgICogdG9wIGxldmVsIGNvbXBsZXggdHlwZXMgZm9yIHRoaXMgc2NoZW1hCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGNvbXBsZXhUeXBlczsKLQotICAgIC8qKgotICAgICAqIG90aGVyIHNjaGVtYSBpbXBvcnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGltcG9ydHM7Ci0KLSAgICAvKioKLSAgICAgKiB3c2RsIHNjaGVtYSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzY2hlbWEgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU2NoZW1hIHdzZGxTY2hlbWE7Ci0KLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIFhtbFNjaGVtYSgpIHsKLSAgICAgICAgdGhpcy5lbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5jb21wbGV4VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGhpcy5pbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNvbnN0cnVjdG9yIHdpdGggdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sU2NoZW1hKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcygpOwotICAgICAgICB0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2VzLmFkZCh0aGlzLnRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0cyB0aGUgd3NkbCBzY2hlbWEgZm9yIHRoaXMgc2NoZW1hIG9iamVjdAotICAgICAqIEB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYSgpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3UG9wdWxhdGVkRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIHRoaXMud3NkbFNjaGVtYSA9IChTY2hlbWEpIGV4dGVuc2lvblJlZ2lzdHJ5LmNyZWF0ZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgVHlwZXMuY2xhc3MsIG5ldyBRTmFtZShDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNjaGVtYSIpKTsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzY2hlbWEgZWxlbWVudAotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOnNjaGVtYSIpOwotCi0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZU5TKENvbnN0YW50cy5YTUxOU19BVFRSSUJVVEVfTlNfVVJJLCJ4bWxuczp4c2QiLENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLQotICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBuYW1lc3BhY2VzVG9QcmVmaXhNYXAucHV0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCJ4c2QiKTsKLSAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IG5hbWVzcGFjZSBhdHRyaWJ1dGUKLQotICAgICAgICAgICAgdGhpcy53c2RsU2NoZW1hLnNldEVsZW1lbnQoc2NoZW1hRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIC8vc2V0IHRoZSB0YXJnZXQgbmFtZXNhcGNlIGFuZCBvdGhlciBuYW1lc3BhY2VzCi0gICAgICAgICAgICBzY2hlbWFFbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGhpcy50YXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgc2NoZW1hRWxlbWVudC5zZXRBdHRyaWJ1dGUoImVsZW1lbnRGb3JtRGVmYXVsdCIsICJxdWFsaWZpZWQiKTsKLQotICAgICAgICAgICAgLy8gYWRkIG90aGVyIG5hbWVzYXBjZXMKLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5uYW1lc3BhY2VzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWVzcGFjZXNUb1ByZWZpeE1hcC5jb250YWluc0tleShuYW1lc3BhY2UpKXsKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gVXRpbC5nZXROZXh0TmFtZXNwYWNlUHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLlhNTE5TX0FUVFJJQlVURV9OU19VUkksInhtbG5zOiIgKyBwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlc1RvUHJlZml4TWFwLnB1dChuYW1lc3BhY2UscHJlZml4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCBpbXBvcnRzCi0gICAgICAgICAgICBYbWxJbXBvcnQgeG1sSW1wb3J0OwotICAgICAgICAgICAgRWxlbWVudCBpbXBvcnRFbGVtZW50OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5pbXBvcnRzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICB4bWxJbXBvcnQgPSAoWG1sSW1wb3J0KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAieHNkOmltcG9ydCIpOwotICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCB4bWxJbXBvcnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoaW1wb3J0RWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy8gY3JlYXRlIGNvbXBsZXggdHlwZSBlbGVtZW50cwotICAgICAgICAgICAgWG1sVHlwZSB4bWxUeXBlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5jb21wbGV4VHlwZXMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgICAgICB4bWxUeXBlID0gKFhtbFR5cGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICBpZiAoIXhtbFR5cGUuaXNBbm9ueW1vdXMoKSAmJiAheG1sVHlwZS5pc1NpbXBsZVR5cGUoKSl7Ci0gICAgICAgICAgICAgICAgICAgICB4bWxUeXBlLmdlbmVyYXRlV1NETFNjaGVtYShkb2N1bWVudCwgbmFtZXNwYWNlc1RvUHJlZml4TWFwKTsKLSAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sVHlwZS5nZXRUeXBlRWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBjcmVhdGUgZWxlbWVudHMKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgeG1sRWxlbWVudDsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICAgeG1sRWxlbWVudCA9IChYbWxFbGVtZW50KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgeG1sRWxlbWVudC5nZW5lcmF0ZVdTRExTY2hlbWEoZG9jdW1lbnQsIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCk7Ci0gICAgICAgICAgICAgICAgIHNjaGVtYUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBleHRlbnNpb24gcmVnaXN0cnkiLGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCl7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMuYWRkKHhtbEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbXBsZXhUeXBlKFhtbFR5cGUgeG1sVHlwZSl7Ci0gICAgICAgIHRoaXMuY29tcGxleFR5cGVzLmFkZCh4bWxUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlcy5hZGQobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoWG1sSW1wb3J0IHhtbEltcG9ydCl7Ci0gICAgICAgIHRoaXMuaW1wb3J0cy5hZGQoeG1sSW1wb3J0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc05hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKXsKLSAgICAgICAgcmV0dXJuIHRoaXMubmFtZXNwYWNlcy5jb250YWlucyhuYW1lc3BhY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZXMoTGlzdCBuYW1lc3BhY2VzKSB7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRDb21wbGV4VHlwZXMoKSB7Ci0gICAgICAgIHJldHVybiBjb21wbGV4VHlwZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGxleFR5cGVzKExpc3QgY29tcGxleFR5cGVzKSB7Ci0gICAgICAgIHRoaXMuY29tcGxleFR5cGVzID0gY29tcGxleFR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBpbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEltcG9ydHMoTGlzdCBpbXBvcnRzKSB7Ci0gICAgICAgIHRoaXMuaW1wb3J0cyA9IGltcG9ydHM7Ci0gICAgfQotCi0gICAgcHVibGljIFNjaGVtYSBnZXRXc2RsU2NoZW1hKCkgewotICAgICAgICByZXR1cm4gd3NkbFNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsU2NoZW1hKFNjaGVtYSB3c2RsU2NoZW1hKSB7Ci0gICAgICAgIHRoaXMud3NkbFNjaGVtYSA9IHdzZGxTY2hlbWE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvWG1sVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRkMWY1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL1htbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChYbWxFbGVtZW50IHhtbEVsZW1lbnQpOwotCi0gICAgcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFhtbEF0dHJpYnV0ZSB4bWxBdHRyaWJ1dGUpOwotCi0gICAgLyoqCi0gICAgICogdGhpcyBnZW5lcmF0ZXMgdGhlIGNvbXBsZXggdHlwZSBvbmx5IGlmIGl0IGlzIGFubm9ueW1vdXMgYW5kCi0gICAgICogaXMgbm90IGEgc2ltcGxlIHR5cGUKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnQKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlc1RvUHJlZml4TWFwCi0gICAgICogQHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMU2NoZW1hKERvY3VtZW50IGRvY3VtZW50LCBNYXAgbmFtZXNwYWNlc1RvUHJlZml4TWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBRTmFtZSBnZXRRbmFtZSgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0UW5hbWUoUU5hbWUgcW5hbWUpOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEFub255bW91cyhib29sZWFuIGFub255bW91cyk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZVR5cGUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZVR5cGUoYm9vbGVhbiBzaW1wbGVUeXBlKTsKLQotICAgIHB1YmxpYyBMaXN0IGdldEVsZW1lbnRzKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKTsKLQotICAgIHB1YmxpYyBFbGVtZW50IGdldFR5cGVFbGVtZW50KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlRWxlbWVudChFbGVtZW50IHR5cGVFbGVtZW50KTsKLQotICAgIHB1YmxpYyBYbWxUeXBlIGdldFBhcmVudFR5cGUoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudFR5cGUoWG1sVHlwZSBwYXJlbnRUeXBlKTsKLQotICAgIHB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZXMoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoTGlzdCBhdHRyaWJ1dGVzKTsKLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL2ltcGwvWG1sQXR0cmlidXRlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxBdHRyaWJ1dGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmYzNzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuaW1wbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBYbWxBdHRyaWJ1dGVJbXBsIGltcGxlbWVudHMgWG1sQXR0cmlidXRlIHsKLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2UgZm9yIHRoaXMgYXR0cmlidXRlIGlmIGl0IGlzIGFuIHRvcCBsZXZlbCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBuYW1lIG9mIHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgYXR0cmlidXRlIG5pbGxhYmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZWQ7Ci0KLSAgICAvKioKLSAgICAgKiB4bWxUeXBlIG9mIHRoaXMgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlbWEgYXR0cmlidXRlIGZvciB0aGlzIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHByaXZhdGUgRWxlbWVudCBhdHRyaWJ1dGU7Ci0KLSAgICBwdWJsaWMgWG1sQXR0cmlidXRlSW1wbChib29sZWFuIGlzUHJpbWl0aXZlKSB7Ci0gICAgICAgIC8vIHNldCB0aGUgbmlsbGFibGUgdmFsdWUgdG8gdHJ1ZQotICAgICAgICB0aGlzLmlzUmVxdWlyZWQgPSBpc1ByaW1pdGl2ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTRExTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJhdHRyaWJ1dGUiKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlLnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMubmFtZSk7Ci0KLQotICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7Ci0gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZS5zZXRBdHRyaWJ1dGUoInVzZSIsICJyZXF1aXJlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBudWxsKXsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKXsKLSAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCB4c2RQcmVmaXggKyAiOiIgKyB0eXBlLmdldFFuYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiQXR0cmlidXRlIHR5cGUgbXVzdCBiZSBhIHNpbXBsZSB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiVHlwZSBjYW4gbm90IGJlIG51bGwgZm9yIGFuIGF0dHJpYnV0ZSIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIHJlcXVpcmVkKSB7Ci0gICAgICAgIGlzUmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbFR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoRWxlbWVudCBhdHRyaWJ1dGUpIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9pbXBsL1htbEVsZW1lbnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3htbC9pbXBsL1htbEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZmJlNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLmltcGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudEltcGwgaW1wbGVtZW50cyBYbWxFbGVtZW50IHsKLSAgICAvKioKLSAgICAgKiBuYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudCBpZiBpdCBpcyBhbiB0b3AgbGV2ZWwgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotICAgIC8qKgotICAgICAqIG5hbWUgb2YgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgZWxlbWVudCBuaWxsYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc05pbGxhYmxlOwotCi0gICAgLyoqCi0gICAgICogaXMgbWluT2NjdXJlcyB6ZXJvIGZvciB0aGlzIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNNaW5PY2N1cnMwOwotCi0gICAgLyoqCi0gICAgICogaXMgQXJyYXkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcnJheTsKLQotICAgIC8qKgotICAgICAqIGlmIHRoaXMgaXMgYW4gc2NoZW1hIHRvcCBsZXZlbCBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVG9wRWxlbWVudDsKLQotICAgIC8qKgotICAgICAqIHhtbFR5cGUgb2YgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlbWEgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgICBwdWJsaWMgWG1sRWxlbWVudEltcGwoYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUpIHsKLSAgICAgICAgLy8gc2V0IHRoZSBuaWxsYWJsZSB2YWx1ZSB0byB0cnVlCi0gICAgICAgIHRoaXMuaXNOaWxsYWJsZSA9ICFpc1ByaW1pdGl2ZVR5cGU7Ci0gICAgICAgIHRoaXMuaXNNaW5PY2N1cnMwID0gIWlzUHJpbWl0aXZlVHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTRExTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgdGhpcy5lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZWxlbWVudCIpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGlzLm5hbWUpOwotCi0KLSAgICAgICAgaWYgKHRoaXMuaXNBcnJheSAmJiAhdGhpcy5pc1RvcEVsZW1lbnQpIHsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1heE9jY3VycyIsICJ1bmJvdW5kZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0aGlzLm5hbWVzcGFjZSA9PSBudWxsKXsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImZvcm0iLCAidW5xdWFsaWZpZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNldHRpbmcgdGhlIHR5cGUKLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgY29ycmVzcG9uZHMgdG8gYW4gdm9pZCB0eXBlIHNvIGdlbmVyYXRlIGEgZW1wdHkgYW5ub255IG1vdXMgY29tcGxleCB0eXBlCi0gICAgICAgICAgICBFbGVtZW50IGNvbXBsZXhFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiY29tcGxleFR5cGUiKTsKLSAgICAgICAgICAgIGNvbXBsZXhFbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotCi0gICAgICAgICAgICBFbGVtZW50IHNlcXVlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICBjb21wbGV4RWxlbWVudC5hcHBlbmRDaGlsZChzZXF1ZW5jZUVsZW1lbnQpOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbXBsZXhFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzU2ltcGxlVHlwZSgpKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIHNpbXBsZSB0eXBlIGVsZW1lbnQKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCB4c2RQcmVmaXggKyAiOiIgKyB0eXBlLmdldFFuYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgaWYgKHRoaXMuaXNOaWxsYWJsZSkgewotICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5pbGxhYmxlIiwgInRydWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGlzLmlzTWluT2NjdXJzMCAmJiAhdGhpcy5pc1RvcEVsZW1lbnQpewotICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1pbk9jY3VycyIsIjAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghdHlwZS5pc0Fub255bW91cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldCh0eXBlLmdldFFuYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsIHByZWZpeCArICI6IiArIHR5cGUuZ2V0UW5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBpZiAodGhpcy5pc05pbGxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgibmlsbGFibGUiLCAidHJ1ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoaXMuaXNNaW5PY2N1cnMwICYmICF0aGlzLmlzVG9wRWxlbWVudCl7Ci0gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgibWluT2NjdXJzIiwiMCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaS5lIHRoaXMgaXMgYW5kIGFubm9ueW1vdXMgY29tcGxleCB0eXBlCi0gICAgICAgICAgICB0eXBlLmdlbmVyYXRlV1NETFNjaGVtYShkb2N1bWVudCwgbmFtZXNwYWNlc1RvUHJlZml4TWFwKTsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0eXBlLmdldFR5cGVFbGVtZW50KCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkgewotICAgICAgICByZXR1cm4gaXNOaWxsYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShib29sZWFuIG5pbGxhYmxlKSB7Ci0gICAgICAgIGlzTmlsbGFibGUgPSBuaWxsYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotICAgICAgICByZXR1cm4gaXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShib29sZWFuIGFycmF5KSB7Ci0gICAgICAgIGlzQXJyYXkgPSBhcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RvcEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBpc1RvcEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VG9wRWxlbWVudChib29sZWFuIHRvcEVsZW1lbnQpIHsKLSAgICAgICAgaXNUb3BFbGVtZW50ID0gdG9wRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sVHlwZSBnZXRUeXBlKCkgewotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKFhtbFR5cGUgdHlwZSkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNNaW5PY2N1cnMwKCkgewotICAgICAgICByZXR1cm4gaXNNaW5PY2N1cnMwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VyczAoYm9vbGVhbiBtaW5PY2N1cnMwKSB7Ci0gICAgICAgIGlzTWluT2NjdXJzMCA9IG1pbk9jY3VyczA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxUeXBlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS94bWwvaW1wbC9YbWxUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzAzODJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEveG1sL2ltcGwvWG1sVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5pbXBsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLlhtbEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxUeXBlSW1wbCBpbXBsZW1lbnRzIFhtbFR5cGUgewotICAgIC8qKgotICAgICAqIFF1YWxpZmllZCBuYW1lIG9mIHRoZSB4bWxUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBRTmFtZSBxbmFtZTsKLQotICAgIC8qKgotICAgICAqIGlzIHRoaXMgYW4gYW5Bbm9ueW1vdXMgdHlwZSB0aGlzIGNhc2UgcW5hbWUgY2FuIGJlIG51bGwKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBbm9ueW1vdXM7Ci0KLSAgICAvKioKLSAgICAgKiBpcyB0aGlzIGlzIGEgYmFzaWMgdHlwZQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpbXBsZVR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBsaXN0IG9mIGNoaWxkIGVsZW1lbnRzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGVsZW1lbnRzOwotCi0gICAgLyoqCi0gICAgICogbGlzdCBvZiBjaGlsZCBhdHRyaWJ1dGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGF0dHJpYnV0ZXM7Ci0KLSAgICAvKioKLSAgICAgKiBjb21wbGV4IHR5cGUgZWxlbWVudCBmb3IgdGhpcyBYbWxUeXBlCi0gICAgICovCi0gICAgcHJpdmF0ZSBFbGVtZW50IHR5cGVFbGVtZW50OwotCi0gICAgLyoqCi0gICAgICogcGFyZW50IHR5cGUgZm9yIHRoaXMgeG1sIHR5cGUgaWYgaXQgaXMgYW4gZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBYbWxUeXBlIHBhcmVudFR5cGU7Ci0KLSAgICBwdWJsaWMgWG1sVHlwZUltcGwoKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCkgewotICAgICAgICB0aGlzLmVsZW1lbnRzLmFkZCh4bWxFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoWG1sQXR0cmlidXRlIHhtbEF0dHJpYnV0ZSkgewotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuYWRkKHhtbEF0dHJpYnV0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogdGhpcyBnZW5lcmF0ZXMgdGhlIGNvbXBsZXggdHlwZSBvbmx5IGlmIGl0IGlzIGFubm9ueW1vdXMgYW5kCi0gICAgICogaXMgbm90IGEgc2ltcGxlIHR5cGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2N1bWVudAotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAKLSAgICAgKiBAdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTRExTY2hlbWEoRG9jdW1lbnQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGhlcmUgd2UgaGF2ZSB0byBnZW5lcmF0ZSB0aGUgY29tcGxleCB0eXBlIGVsZW1lbnQgZm9yIHRoaXMgeG1sVHlwZQotICAgICAgICBpZiAoIXRoaXMuaXNTaW1wbGVUeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0gICAgICAgICAgICB0aGlzLnR5cGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiY29tcGxleFR5cGUiKTsKLSAgICAgICAgICAgIHRoaXMudHlwZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuaXNBbm9ueW1vdXMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMucW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFbGVtZW50IHNlcXVlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNlcXVlbmNlIik7Ci0gICAgICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgZXh0ZW5zaW9uIGRldGFpbHMgaWYgdGhlcmUgYXJlCi0gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRUeXBlICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIC8vIGkuZSB0aGlzIGlzIGFuIGV4dGVuc2lvbiB0eXBlCi0gICAgICAgICAgICAgICAgRWxlbWVudCBjb21wbGV4Q29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImNvbXBsZXhDb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgY29tcGxleENvbnRlbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICAgICAgdGhpcy50eXBlRWxlbWVudC5hcHBlbmRDaGlsZChjb21wbGV4Q29udGVudCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGV4dGVuc2lvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImV4dGVuc2lvbiIpOwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgICAgICBjb21wbGV4Q29udGVudC5hcHBlbmRDaGlsZChleHRlbnNpb24pOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGV4dGVuc2lvblByZWZpeCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KHRoaXMucGFyZW50VHlwZS5nZXRRbmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gdGhpcy5wYXJlbnRUeXBlLmdldFFuYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKChleHRlbnNpb25QcmVmaXggPT0gbnVsbCkgfHwgZXh0ZW5zaW9uUHJlZml4LmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEF0dHJpYnV0ZSgiYmFzZSIsIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnNldEF0dHJpYnV0ZSgiYmFzZSIsIGV4dGVuc2lvblByZWZpeCArICI6IiArIGxvY2FsUGFydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5hcHBlbmRDaGlsZChzZXF1ZW5jZUVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHNlcXVlbmNlRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgb3RoZXIgZWxlbWVudCBjaGlsZHJlbgotICAgICAgICAgICAgWG1sRWxlbWVudCB4bWxFbGVtZW50OwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5lbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB4bWxFbGVtZW50ID0gKFhtbEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIHhtbEVsZW1lbnQuZ2VuZXJhdGVXU0RMU2NoZW1hKGRvY3VtZW50LCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApOwotICAgICAgICAgICAgICAgIHNlcXVlbmNlRWxlbWVudC5hcHBlbmRDaGlsZCh4bWxFbGVtZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCB0aGUgYXR0cmlidXRlcwotICAgICAgICAgICAgWG1sQXR0cmlidXRlIHhtbEF0dHJpYnV0ZTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuYXR0cmlidXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICB4bWxBdHRyaWJ1dGUgPSAoWG1sQXR0cmlidXRlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB4bWxBdHRyaWJ1dGUuZ2VuZXJhdGVXU0RMU2NoZW1hKGRvY3VtZW50LCBuYW1lc3BhY2VzVG9QcmVmaXhNYXApOwotICAgICAgICAgICAgICAgIHRoaXMudHlwZUVsZW1lbnQuYXBwZW5kQ2hpbGQoeG1sQXR0cmlidXRlLmdldEF0dHJpYnV0ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBYbWxUeXBlSW1wbChRTmFtZSBxbmFtZSkgewotICAgICAgICB0aGlzKCk7Ci0gICAgICAgIHRoaXMucW5hbWUgPSBxbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0UW5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBxbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRRbmFtZShRTmFtZSBxbmFtZSkgewotICAgICAgICB0aGlzLnFuYW1lID0gcW5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoKSB7Ci0gICAgICAgIHJldHVybiBpc0Fub255bW91czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm9ueW1vdXMoYm9vbGVhbiBhbm9ueW1vdXMpIHsKLSAgICAgICAgaXNBbm9ueW1vdXMgPSBhbm9ueW1vdXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGVUeXBlKCkgewotICAgICAgICByZXR1cm4gaXNTaW1wbGVUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZVR5cGUoYm9vbGVhbiBzaW1wbGVUeXBlKSB7Ci0gICAgICAgIGlzU2ltcGxlVHlwZSA9IHNpbXBsZVR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0RWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhMaXN0IGVsZW1lbnRzKSB7Ci0gICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRUeXBlRWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGVFbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVFbGVtZW50KEVsZW1lbnQgdHlwZUVsZW1lbnQpIHsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudCA9IHR5cGVFbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBYbWxUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudFR5cGUoWG1sVHlwZSBwYXJlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMucGFyZW50VHlwZSA9IHBhcmVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhMaXN0IGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3JlY2VpdmVyL1JNSU1lc3NhZ2VSZWNpZXZlci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS9yZWNlaXZlci9STUlNZXNzYWdlUmVjaWV2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZDY4NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3JlY2VpdmVyL1JNSU1lc3NhZ2VSZWNpZXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkucmVjZWl2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy53cml0ZXIuTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuUk1JRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5YbWxTdHJlYW1QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFBhcnNpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLk5hbWVzcGFjZVByZWZpeDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLQotcHVibGljIGNsYXNzIFJNSU1lc3NhZ2VSZWNpZXZlciBleHRlbmRzIEFic3RyYWN0SW5PdXRNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgLy8gdGhpcyBjb250YWlucyBhbGwgdGhlIGRhdGEgcmVnYXJkaW5nIHRoZSBzZXJ2aWNlLgotICAgIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAgIHByaXZhdGUgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXI7Ci0gICAgcHJpdmF0ZSBYbWxTdHJlYW1QYXJzZXIgeG1sU3RyZWFtUGFyc2VyOwotCi0gICAgcHVibGljIFJNSU1lc3NhZ2VSZWNpZXZlcihTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLSAgICAgICAgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplciA9IG5ldyBKYXZhT2JqZWN0U2VyaWFsaXplcigKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFByb2Nlc3NlZFR5cGVNYXAoKSwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldENvbmZpZ3VyYXRvcigpLAotICAgICAgICAgICAgICAgIHNlcnZpY2UuZ2V0U2NoZW1hTWFwKCkpOwotICAgICAgICB0aGlzLnhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIoCi0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgc2VydmljZS5nZXRDb25maWd1cmF0b3IoKSwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYU1hcCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnZva2VCdXNpbmVzc0xvZ2ljKE1lc3NhZ2VDb250ZXh0IGlucHV0TWVzc2FnZUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBvdXRwdXRNZXNzYWdlQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBpbnB1dE1lc3NhZ2VDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzT3BlcmF0aW9uKCkuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gc2VydmljZS5nZXRPcGVyYXRpb24ob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBpbnB1dE1lc3NhZ2VDb250ZXh0LmdldEVudmVsb3BlKCkuZ2V0Qm9keSgpLmdldEZpcnN0RWxlbWVudCgpLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gZ2V0U09BUEZhY3RvcnkoaW5wdXRNZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaW52b2tlIHRoZSBtZXRob2QKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHNlcnZpY2VPYmplY3QgPSBzZXJ2aWNlLmdldEphdmFDbGFzcygpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgTWV0aG9kIGphdmFPcGVyYXRpb24gPSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpOwotICAgICAgICAgICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBqYXZhT3BlcmF0aW9uLmludm9rZShzZXJ2aWNlT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54bWxTdHJlYW1QYXJzZXIuZ2V0SW5wdXRQYXJhbWV0ZXJzKHJlYWRlciwgb3BlcmF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgT01FbGVtZW50IHJldHVybk9NRWxlbWVudCA9IGdldE91dHB1dE9NRWxlbWVudChyZXR1cm5PYmplY3QsIG9wZXJhdGlvbiwgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplciwgc29hcEZhY3RvcnkpOwotICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBzb2FwRmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpLmFkZENoaWxkKHJldHVybk9NRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0TWVzc2FnZUNvbnRleHQuc2V0RW52ZWxvcGUoc29hcEVudmVsb3BlKTsKLSAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIG91dCBwdXQgZWxlbWVudCB0byBtZXNzYWdlIGNvbnRleHQKLQotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHRoaXMuc2VydmljZS5nZXRFeGNlcHRpb25QYXJhbWV0ZXIodGFyZ2V0RXhjZXB0aW9uLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNGYXVsdCBheGlzRmF1bHQgPSBuZXcgQXhpc0ZhdWx0KHRhcmdldEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc0ZhdWx0LnNldERldGFpbChnZXRQYXJhbWV0ZXJPTUVsZW1lbnQodGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBheGlzRmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFBhcnNpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNhbiBub3QgZmluZCB0aGUgb3BlcmF0aW9uIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0T3V0cHV0T01FbGVtZW50KGZpbmFsIE9iamVjdCByZXR1cm5PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSkgewotICAgICAgICBPTURhdGFTb3VyY2Ugb21EYXRhU291cmNlID0gbmV3IFJNSURhdGFTb3VyY2UoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNVE9NQXdhcmVYTUxTdHJlYW1Xcml0ZXIgeG1sV3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBqYXZhT2JqZWN0U2VyaWFsaXplci5zZXJpYWxpemVPdXRwdXRFbGVtZW50KHJldHVybk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRPdXRwdXRQYXJhbWV0ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxXcml0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiUHJvYmxlbSBpbiBzZXJpYWxpemluZyB0aGUgcmV0dXJuIG9iamVjdCIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgWG1sRWxlbWVudCBvdXRYbWxFbGVtZW50ID0gb3BlcmF0aW9uLmdldE91dFB1dEVsZW1lbnQoKTsKLSAgICAgICAgUU5hbWUgb3V0RWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKG91dFhtbEVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksIG91dFhtbEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChvdXRFbGVtZW50UU5hbWUsIHNvYXBGYWN0b3J5LCBvbURhdGFTb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZ2V0UGFyYW1ldGVyT01FbGVtZW50KGZpbmFsIE9iamVjdCBleGNlcHRpb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSl7Ci0gICAgICAgIE9NRGF0YVNvdXJjZSBvbURhdGFTb3VyY2UgPSBuZXcgUk1JRGF0YVNvdXJjZSgpewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoTVRPTUF3YXJlWE1MU3RyZWFtV3JpdGVyIHhtbFdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgamF2YU9iamVjdFNlcmlhbGl6ZXIuc2VyaWFsaXplUGFyYW1ldGVyKGV4Y2VwdGlvbk9iamVjdCxwYXJhbWV0ZXIseG1sV3JpdGVyLCBuZXcgTmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigicHJvYmxlbSBpbiBzZXJpYWxpemluZyB0aGUgZXhjZXB0aW9uIG9iamVjdCAiLGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgWG1sRWxlbWVudCBleGNlcHRpb25FbGVtZW50ID0gcGFyYW1ldGVyLmdldEVsZW1lbnQoKTsKLSAgICAgICAgUU5hbWUgb3V0RWxlbWVudFFOYW1lID0gbmV3IFFOYW1lKGV4Y2VwdGlvbkVsZW1lbnQuZ2V0TmFtZXNwYWNlKCksIGV4Y2VwdGlvbkVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG5ldyBPTVNvdXJjZWRFbGVtZW50SW1wbChvdXRFbGVtZW50UU5hbWUsIHNvYXBGYWN0b3J5LCBvbURhdGFTb3VyY2UpOwotICAgICAgICByZXR1cm4gb21FbGVtZW50OwotICAgIH0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS90eXBlcy9Eb21UeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3R5cGVzL0RvbVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMmIzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3R5cGVzL0RvbVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkudHlwZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuQWJzdHJhY3RUeXBlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVzZWQgYXMgdGhlIHR5cGUgZm9yIGRvbSBkb2N1bWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvbVR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRUeXBlTWFwKQotICAgICAgICAgICAgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3R5cGVzL01hcFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdHlwZXMvTWFwVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmE4NzhlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdHlwZXMvTWFwVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS50eXBlczsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlzIHVlc2QgdG8gcmVwcmVzZW50IGEgbWFwIHR5cGUgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBUeXBlIHsKLQotICAgIHB1YmxpYyBPYmplY3Qga2V5OwotICAgIHB1YmxpYyBPYmplY3QgdmFsdWU7Ci0KLSAgICBwdWJsaWMgTWFwVHlwZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwVHlwZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRLZXkoT2JqZWN0IGtleSkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZjNiZDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOU19BVFRSSUJVVEVfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV8yMDAxX1NDSEVNQV9YU0kgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCA9IENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9ERUZBVUxUX1NDSEVNQV9YU0kgPSBDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NUUklORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAic3RyaW5nIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQk9PTEVBTiA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiYm9vbGVhbiIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0RPVUJMRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZG91YmxlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfRkxPQVQgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImZsb2F0Iik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfSU5UID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnQiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9JTlRFR0VSID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJpbnRlZ2VyIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfTE9ORyA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAibG9uZyIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX1NIT1JUID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJzaG9ydCIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0JZVEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImJ5dGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9ERUNJTUFMID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkZWNpbWFsIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQkFTRTY0ID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJiYXNlNjRCaW5hcnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9IRVhCSU4gPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImhleEJpbmFyeSIpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgWFNEX0FOWVNJTVBMRVRZUEUgPSBuZXcgUU5hbWUoVVJJX0RFRkFVTFRfU0NIRU1BX1hTRCwgImFueVNpbXBsZVR5cGUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9BTllUWVBFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnlUeXBlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfQU5ZID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJhbnkiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9RTkFNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiUU5hbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAiZGF0ZVRpbWUiKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFhTRF9EQVRFID0gbmV3IFFOYW1lKFVSSV9ERUZBVUxUX1NDSEVNQV9YU0QsICJkYXRlIik7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBYU0RfVElNRSA9IG5ldyBRTmFtZShVUklfREVGQVVMVF9TQ0hFTUFfWFNELCAidGltZSIpOwotCi0gICAgLy8gYXR0cmlidXRlIHR5cGVzIHVzZWQgaW4gY29sbGVjdGlvbiBhcGkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xMRUNUSU9OX1RZUEUgPSAweDAwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9UWVBFID0gMHgwMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFVF9UWVBFID0gMHgwMDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUF9UWVBFID0gMHgwMDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9USEVSX1RZUEUgPSAweDAwMTA7Ci0KLSAgICAvL3JtaSBuYW1lc3BhY2VzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1JX1RZUEVfTkFNU1BBQ0UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvcm1pL3R5cGVzIjsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL0phdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL0phdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDhkZWZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdXRpbC9KYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbnN0cnVjdG9yIGdldENvbnN0cnVjdG9yKENsYXNzIGtleSkgewotICAgICAgICByZXR1cm4gKENvbnN0cnVjdG9yKSBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zS2V5KENsYXNzIGtleSkgewotICAgICAgICByZXR1cm4gamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgLy8gcHVwdWFsdGUgdGhlIG1hcAotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChCb29sZWFuLmNsYXNzLCBCb29sZWFuLmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pKTsKLSAgICAgICAgICAgIGphdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5wdXQoZG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChEb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KEZsb2F0LmNsYXNzLCBGbG9hdC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGludC5jbGFzcywgSW50ZWdlci5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KEludGVnZXIuY2xhc3MsIEludGVnZXIuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChsb25nLmNsYXNzLCBMb25nLmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pKTsKLSAgICAgICAgICAgIGphdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5wdXQoTG9uZy5jbGFzcywgTG9uZy5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KHNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KFNob3J0LmNsYXNzLCBTaG9ydC5jbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KSk7Ci0gICAgICAgICAgICBqYXZhVHlwZVRvQ29uc3RydWN0b3JNYXAucHV0KGJ5dGUuY2xhc3MsIEJ5dGUuY2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSkpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChCeXRlLmNsYXNzLCBCeXRlLmNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde1N0cmluZy5jbGFzc30pKTsKLSAgICAgICAgICAgIGphdmFUeXBlVG9Db25zdHJ1Y3Rvck1hcC5wdXQoQ2FsZW5kYXIuY2xhc3MsIENvbnN0YW50cy5YU0RfREFURVRJTUUpOwotICAgICAgICAgICAgamF2YVR5cGVUb0NvbnN0cnVjdG9yTWFwLnB1dChEYXRlLmNsYXNzLCBDb25zdGFudHMuWFNEX0RBVEUpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gdGhpcyBleGNlcHRpb24gc2hvdWxkIG5vdCBvY2N1ciBzaW5jZSB3ZSBkZWFsaW5nIHdpdGgga25vdyBjbGFzcwotICAgICAgICAgICAgLy8gcHJpbnQgdGhlIHN0YWNrdHJhY2UgZm9yIGRlYnVnaW5nIHB1cnBvc2VzCi0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdXRpbC9KYXZhVHlwZVRvUU5hbWVNYXAuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvdXRpbC9KYXZhVHlwZVRvUU5hbWVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjODlmOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvSmF2YVR5cGVUb1FOYW1lTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUb1FOYW1lTWFwIHsKLQotICAgIHByaXZhdGUgc3RhdGljIE1hcCBqYXZhVHlwZVRvUU5hbWVNYXA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldFR5cGVRTmFtZShDbGFzcyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIChRTmFtZSkgamF2YVR5cGVUb1FOYW1lTWFwLmdldChrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0tleShDbGFzcyBrZXkpIHsKLSAgICAgICAgcmV0dXJuIGphdmFUeXBlVG9RTmFtZU1hcC5jb250YWluc0tleShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGdldEtleXMoKXsKLSAgICAgICAgcmV0dXJuIGphdmFUeXBlVG9RTmFtZU1hcC5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvLyBwdXB1YWx0ZSB0aGUgbWFwCi0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoU3RyaW5nLmNsYXNzLCBDb25zdGFudHMuWFNEX1NUUklORyk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoYm9vbGVhbi5jbGFzcywgQ29uc3RhbnRzLlhTRF9CT09MRUFOKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChCb29sZWFuLmNsYXNzLCBDb25zdGFudHMuWFNEX0JPT0xFQU4pOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGRvdWJsZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9ET1VCTEUpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KERvdWJsZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9ET1VCTEUpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGZsb2F0LmNsYXNzLCBDb25zdGFudHMuWFNEX0ZMT0FUKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChGbG9hdC5jbGFzcywgQ29uc3RhbnRzLlhTRF9GTE9BVCk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoaW50LmNsYXNzLCBDb25zdGFudHMuWFNEX0lOVCk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoSW50ZWdlci5jbGFzcywgQ29uc3RhbnRzLlhTRF9JTlQpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGxvbmcuY2xhc3MsIENvbnN0YW50cy5YU0RfTE9ORyk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoTG9uZy5jbGFzcywgQ29uc3RhbnRzLlhTRF9MT05HKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChzaG9ydC5jbGFzcywgQ29uc3RhbnRzLlhTRF9TSE9SVCk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoU2hvcnQuY2xhc3MsIENvbnN0YW50cy5YU0RfU0hPUlQpOwotICAgICAgICBqYXZhVHlwZVRvUU5hbWVNYXAucHV0KGJ5dGUuY2xhc3MsIENvbnN0YW50cy5YU0RfQllURSk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoQnl0ZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9CWVRFKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChDYWxlbmRhci5jbGFzcywgQ29uc3RhbnRzLlhTRF9EQVRFVElNRSk7Ci0gICAgICAgIGphdmFUeXBlVG9RTmFtZU1hcC5wdXQoRGF0ZS5jbGFzcywgQ29uc3RhbnRzLlhTRF9EQVRFKTsKLSAgICAgICAgamF2YVR5cGVUb1FOYW1lTWFwLnB1dChPYmplY3QuY2xhc3MsIENvbnN0YW50cy5YU0RfQU5ZVFlQRSk7Ci0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvTmFtZXNwYWNlUHJlZml4LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvTmFtZXNwYWNlUHJlZml4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMjk1ZWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL05hbWVzcGFjZVByZWZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsOwotCi0vKioKLSAqIHVzZWQgdG8ga2VlcCB0aGUgbmFtZXNwYWNlIHByZWZpeGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VQcmVmaXggewotCi0gICAgcHJpdmF0ZSBpbnQgbmFtZXNwYWNlUHJlZml4ID0gMDsKLQotICAgIHB1YmxpYyBpbnQgZ2V0TmFtZXNhcGNlUHJlZml4KCl7Ci0gICAgICAgIHJldHVybiArK25hbWVzcGFjZVByZWZpeDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvVXRpbC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS91dGlsL1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjZTgxOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvc3JjL29yZy9hcGFjaGUvYXhpczIvcm1pL3V0aWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaSA9IDA7Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dE5hbWVzcGFjZVByZWZpeCgpIHsKLSAgICAgICAgaWYgKGkgPiAxMDAwKSB7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm5zIiArICsraTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQgcHJpbWl0aXZlczsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHByaW1pdGl2ZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChpbnQuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChsb25nLmNsYXNzKTsKLSAgICAgICAgcHJpbWl0aXZlcy5hZGQoZmxvYXQuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChkb3VibGUuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChzaG9ydC5jbGFzcyk7Ci0gICAgICAgIHByaW1pdGl2ZXMuYWRkKGJ5dGUuY2xhc3MpOwotICAgICAgICBwcmltaXRpdmVzLmFkZChib29sZWFuLmNsYXNzKTsKLSAgICAgICAgcHJpbWl0aXZlcy5hZGQoY2hhci5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gcHJpbWl0aXZlcy5jb250YWlucyh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDbGFzc1R5cGUoQ2xhc3MgY2xhc3NOYW1lKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHR5cGUgPSBDb25zdGFudHMuT1RIRVJfVFlQRTsKLSAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXkgdGhlbiBpdCBjYW4gbm90IGJlIGEgY29sbGVjdGlvbiB0eXBlCi0gICAgICAgIGlmIChMaXN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgdHlwZSA9IENvbnN0YW50cy5MSVNUX1RZUEUgfCBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFOwotICAgICAgICB9IGVsc2UgaWYgKFNldC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBDb25zdGFudHMuU0VUX1RZUEUgfCBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFOwotICAgICAgICB9IGVsc2UgaWYgKE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBDb25zdGFudHMuTUFQX1RZUEU7Ci0gICAgICAgIH0gZWxzZSBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgIHR5cGUgPSBDb25zdGFudHMuQ09MTEVDVElPTl9UWVBFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS9zcmMvb3JnL2FwYWNoZS9heGlzMi9ybWkvd3NkbC9XU0RMMTFEZWZpbml0aW9uQnVpbGRlci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS93c2RsL1dTREwxMURlZmluaXRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjY2YmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3JtaS93c2RsL1dTREwxMURlZmluaXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgd3NkbDExIG9iamVjdCBzdHVyY3R1cmUgZnJvbSB0aGUKLSAqIHNlcnZpY2Ugb2JqZWN0IHN0cnVjdHVyZS4KLSAqLwotcHVibGljIGNsYXNzIFdTREwxMURlZmluaXRpb25CdWlsZGVyIHsKLQotICAgIC8qKgotICAgICAqIHNlcnZpY2UgdG8gZ2VuZXJhdGUgdGhlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXJ2aWNlIHNlcnZpY2U7Ci0KLSAgICAvKioKLSAgICAgKiB3c2RsIGRlZmluaXRpb24gb2JqZWN0IHRvIHBvcHVsYXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uOwotCi0gICAgLyoqCi0gICAgICogcG9ydCB0eXBlIGZvciB0aGlzIHdzZGwKLSAgICAgKi8KLSAgICBwcml2YXRlIFBvcnRUeXBlIHBvcnRUeXBlOwotCi0gICAgcHJpdmF0ZSBCaW5kaW5nIGh0dHBTb2FwQmluZGluZzsKLQotICAgIC8vVE9ETzogZ2VuZXJhdGUgY29kZSBmb3IgdGhpcyBiaW5kaW5nLgotICAgIHByaXZhdGUgQmluZGluZyBodHRwU29hcDEyQmluZGluZzsKLQotCi0gICAgcHVibGljIFdTREwxMURlZmluaXRpb25CdWlsZGVyKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdlbmVyYXRlcyB0aGUgd3NkbCBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmaW5pdGlvbiBnZW5lcmF0ZVdTREwoKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAvL1RPRE86IGtlZXAgdGhlIG5hbWVzcGFjZSBwcmVmaXggbWFwIGlmIG5lZWRlZAotICAgICAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoVXRpbC5nZXROZXh0TmFtZXNwYWNlUHJlZml4KCksIHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE5hbWVzcGFjZShVdGlsLmdldE5leHROYW1lc3BhY2VQcmVmaXgoKSwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKTsKLSAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICAvLyBmaXJzdCBnZW5lcmF0ZSB0aGUgc2NoZW1hcwotICAgICAgICAgICAgZ2VuZXJhdGVUeXBlcygpOwotICAgICAgICAgICAgZ2VuZXJhdGVQb3J0VHlwZSgpOwotICAgICAgICAgICAgZ2VuZXJhdGVCaW5kaW5ncygpOwotICAgICAgICAgICAgZ2VuZXJhdGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBnZW5lcmF0ZU9wZXJhdGlvbnNBbmRNZXNzYWdlcygpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXMud3NkbERlZmluaXRpb247Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkVycm9yIGluIGNyZWF0aW5nIGEgbmV3IHdzZGwgZGVmaW5pdGlvbiIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2VuZXJhdGVzIHRoZSBzY2hlbWFzIGZvciB0aGUgd3NkbAotICAgICAqCi0gICAgICogQHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVHlwZXMoKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFR5cGVzIHR5cGVzID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVUeXBlcygpOwotICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsKLSAgICAgICAgWG1sU2NoZW1hIHhtbFNjaGVtYTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5zZXJ2aWNlLmdldFNjaGVtYU1hcCgpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgeG1sU2NoZW1hID0gKFhtbFNjaGVtYSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB4bWxTY2hlbWEuZ2VuZXJhdGVXU0RMU2NoZW1hKCk7Ci0gICAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCh4bWxTY2hlbWEuZ2V0V3NkbFNjaGVtYSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdlbmVyYXRlcyB0aGUgcG9ydCB0eXBlIGZvciB0aGUgd3NkbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVBvcnRUeXBlKCkgewotICAgICAgICB0aGlzLnBvcnRUeXBlID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICB0aGlzLnBvcnRUeXBlLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIHRoaXMucG9ydFR5cGUuc2V0UU5hbWUobmV3IFFOYW1lKHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5zZXJ2aWNlLmdldE5hbWUoKSArICJQb3J0VHlwZSIpKTsKLSAgICAgICAgdGhpcy53c2RsRGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQmluZGluZ3MoKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZSh0aGlzLnNlcnZpY2UuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldE5hbWUoKSArICJIdHRwU29hcEJpbmRpbmciKSk7Ci0gICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLnNldFBvcnRUeXBlKHRoaXMucG9ydFR5cGUpOwotICAgICAgICAvLyBhZGQgc29hcCB0cmFuc3BvcnQgcGFydHMKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1BvcHVsYXRlZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IChTT0FQQmluZGluZykgZXh0ZW5zaW9uUmVnaXN0cnkuY3JlYXRlRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBCaW5kaW5nLmNsYXNzLCBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAiYmluZGluZyIpKTsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nLnNldFRyYW5zcG9ydFVSSSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gICAgICAgICAgICBzb2FwQmluZGluZy5zZXRTdHlsZSgiZG9jdW1lbnQiKTsKLSAgICAgICAgICAgIHRoaXMuaHR0cFNvYXBCaW5kaW5nLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCaW5kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBjcmV0ZSBhIHdzZGwgZmFjdG9yeSIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uYWRkQmluZGluZyh0aGlzLmh0dHBTb2FwQmluZGluZyk7Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uZ2V0QmluZGluZ3MoKS5wdXQodGhpcy5odHRwU29hcEJpbmRpbmcuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICB0aGlzLmh0dHBTb2FwQmluZGluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2VydmljZSgpCi0gICAgICAgICAgICB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIG5vdyBhZGQgdGhlIGJpbmRpbmcgcG9ydFR5cGUgYW5kIG1lc3NhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gZXZlcnkgb3BlcmF0aW9uCi0gICAgICAgIGphdmF4LndzZGwuU2VydmljZSBzZXJ2aWNlID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgICAgIHNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKHRoaXMuc2VydmljZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5zZXJ2aWNlLmdldE5hbWUoKSkpOwotCi0gICAgICAgIFBvcnQgcG9ydCA9IHRoaXMud3NkbERlZmluaXRpb24uY3JlYXRlUG9ydCgpOwotICAgICAgICBwb3J0LnNldE5hbWUodGhpcy5zZXJ2aWNlLmdldE5hbWUoKSArICJIdHRwU29hcFBvcnQiKTsKLSAgICAgICAgcG9ydC5zZXRCaW5kaW5nKHRoaXMuaHR0cFNvYXBCaW5kaW5nKTsKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1BvcHVsYXRlZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcykgZXh0ZW5zaW9uUmVnaXN0cnkuY3JlYXRlRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBQb3J0LmNsYXNzLCBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAiYWRkcmVzcyIpKTsKLSAgICAgICAgICAgIHNvYXBBZGRyZXNzLnNldExvY2F0aW9uVVJJKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvIiArIHRoaXMuc2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgcG9ydC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgY3JldGUgYSB3c2RsIGZhY3RvcnkiKTsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlLmFkZFBvcnQocG9ydCk7Ci0gICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVPcGVyYXRpb25zQW5kTWVzc2FnZXMoKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbiBvcGVyYXRpb247Ci0gICAgICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlOwotICAgICAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2U7Ci0gICAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIHdzZGxPcGVyYXRpb247Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLQotICAgICAgICAvL2dlbmVyYXRlIG1lc3NhZ2VzIGZvciBleGNlcHRpb25zCi0gICAgICAgIE1hcCBleGNlcHRpb25NZXNzYWdlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIENsYXNzIGV4Y2VwdGlvbkNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyOwotICAgICAgICBNZXNzYWdlIGZhdWx0TWVzc2FnZTsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VOYW1lOwotICAgICAgICBQYXJ0IHBhcnQ7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gdGhpcy5zZXJ2aWNlLmdldEV4Y2VwdGlvbkNsYXNzVG9QYXJhbWV0ZXJNYXAoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbkNsYXNzID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIHRoaXMuc2VydmljZS5nZXRFeGNlcHRpb25DbGFzc1RvUGFyYW1ldGVyTWFwKCkuZ2V0KGV4Y2VwdGlvbkNsYXNzKTsKLSAgICAgICAgICAgIG1lc3NhZ2VOYW1lID0gZXhjZXB0aW9uQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICAgICAgbWVzc2FnZU5hbWUgPSBtZXNzYWdlTmFtZS5zdWJzdHJpbmcobWVzc2FnZU5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICAgICAgZmF1bHRNZXNzYWdlID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2Uuc2V0VW5kZWZpbmVkKGZhbHNlKTsKLSAgICAgICAgICAgIGZhdWx0TWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUodGhpcy5zZXJ2aWNlLmdldE5hbWVzcGFjZSgpLCBtZXNzYWdlTmFtZSkpOwotCi0gICAgICAgICAgICBwYXJ0ID0gdGhpcy53c2RsRGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgICAgICBwYXJ0LnNldE5hbWUoImZhdWx0Iik7Ci0gICAgICAgICAgICAvLyBhZGQgdGhpcyBlbGVtZW50IG5hbWVzcGFjZSB0byB0aGUgZGVmaW5pdGlvbgotICAgICAgICAgICAgaWYgKHRoaXMud3NkbERlZmluaXRpb24uZ2V0UHJlZml4KHBhcmFtZXRlci5nZXRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlKCkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE5hbWVzcGFjZShVdGlsLmdldE5leHROYW1lc3BhY2VQcmVmaXgoKSwgcGFyYW1ldGVyLmdldEVsZW1lbnQoKS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJ0LnNldEVsZW1lbnROYW1lKHBhcmFtZXRlci5nZXRFbGVtZW50KCkuZ2V0VHlwZSgpLmdldFFuYW1lKCkpOwotICAgICAgICAgICAgZmF1bHRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlc01hcC5wdXQoZXhjZXB0aW9uQ2xhc3MsIGZhdWx0TWVzc2FnZSk7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE1lc3NhZ2UoZmF1bHRNZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBvcGVyYXRpb24gPSAob3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIC8vIGFkZCBpbnB1dCBhbmQgb3V0IHB1dCBtZXNzYWdlcwotICAgICAgICAgICAgaW5wdXRNZXNzYWdlID0gZ2V0V1NETElucHV0TWVzc2FnZSh0aGlzLndzZGxEZWZpbml0aW9uLCBvcGVyYXRpb24pOwotICAgICAgICAgICAgb3V0cHV0TWVzc2FnZSA9IGdldFdTRExPdXRwdXRNZXNzYWdlKHRoaXMud3NkbERlZmluaXRpb24sIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB0aGlzLndzZGxEZWZpbml0aW9uLmFkZE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLSAgICAgICAgICAgIHRoaXMud3NkbERlZmluaXRpb24uYWRkTWVzc2FnZShvdXRwdXRNZXNzYWdlKTsKLQotICAgICAgICAgICAgd3NkbE9wZXJhdGlvbiA9IGdldFdTRExPcGVyYXRpb24odGhpcy53c2RsRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgaW5wdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlc01hcCwKLSAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgIHRoaXMucG9ydFR5cGUuYWRkT3BlcmF0aW9uKHdzZGxPcGVyYXRpb24pOwotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbiA9IGdldFdTRExCaW5kaW5nT3BlcmF0aW9uKHRoaXMud3NkbERlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIHdzZGxPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbik7Ci0gICAgICAgICAgICB0aGlzLmh0dHBTb2FwQmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBjcmVhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHdzZGwgbWVzc2FnZSBmb3IgaW5wdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHJldHVybiBpbnB1dCBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0V1NETElucHV0TWVzc2FnZShEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gZGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIGlucHV0TWVzc2FnZS5zZXRVbmRlZmluZWQoZmFsc2UpOwotICAgICAgICBpbnB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKG9wZXJhdGlvbi5nZXROYW1lc3BhY2UoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXF1ZXN0TWVzc2FnZSIpKTsKLSAgICAgICAgUGFydCBwYXJ0ID0gZGVmaW5pdGlvbi5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgIHBhcnQuc2V0TmFtZSgiaW5wdXQiKTsKLSAgICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShuZXcgUU5hbWUob3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLmdldE5hbWVzcGFjZSgpLCBvcGVyYXRpb24uZ2V0SW5wdXRFbGVtZW50KCkuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGlucHV0TWVzc2FnZS5hZGRQYXJ0KHBhcnQpOwotICAgICAgICByZXR1cm4gaW5wdXRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGNyZWF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbCBtZXNzYWdlIGZvciBvdXRwdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAgICogQHJldHVybiBvdXRwdXQgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBNZXNzYWdlIGdldFdTRExPdXRwdXRNZXNzYWdlKERlZmluaXRpb24gZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZSA9IGRlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBvdXRwdXRNZXNzYWdlLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIG91dHB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKG9wZXJhdGlvbi5nZXROYW1lc3BhY2UoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSArICJSZXNwb25zZU1lc3NhZ2UiKSk7Ci0gICAgICAgIFBhcnQgcGFydCA9IGRlZmluaXRpb24uY3JlYXRlUGFydCgpOwotICAgICAgICBwYXJ0LnNldE5hbWUoIm91dHB1dCIpOwotICAgICAgICBwYXJ0LnNldEVsZW1lbnROYW1lKG5ldyBRTmFtZShvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWVzcGFjZSgpLCBvcGVyYXRpb24uZ2V0T3V0UHV0RWxlbWVudCgpLmdldE5hbWUoKSkpOwotICAgICAgICBvdXRwdXRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgICAgIHJldHVybiBvdXRwdXRNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdlbmVyYXRlcyB0aGUgd3NkbCBvcGVyYXRpb24gZm9yIHRoZSBybWkgb3BlcmF0aW9uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSBpbnB1dE1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gb3V0cHV0TWVzc2FnZQotICAgICAqIEBwYXJhbSBmYXVsdE1lc3NhZ2VNYXAKLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uCi0gICAgICogQHJldHVybiB3c2RsIG9wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBqYXZheC53c2RsLk9wZXJhdGlvbiBnZXRXU0RMT3BlcmF0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIGZhdWx0TWVzc2FnZU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgICAgIGphdmF4LndzZGwuT3BlcmF0aW9uIHdzZGxPcGVyYXRpb24gPSBkZWZpbml0aW9uLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICB3c2RsT3BlcmF0aW9uLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgSW5wdXQgaW5wdXQgPSBkZWZpbml0aW9uLmNyZWF0ZUlucHV0KCk7Ci0gICAgICAgIGlucHV0LnNldE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLSAgICAgICAgaW5wdXQuc2V0TmFtZSgiaW5wdXQiKTsKLQotICAgICAgICBPdXRwdXQgb3V0cHV0ID0gZGVmaW5pdGlvbi5jcmVhdGVPdXRwdXQoKTsKLSAgICAgICAgb3V0cHV0LnNldE1lc3NhZ2Uob3V0cHV0TWVzc2FnZSk7Ci0gICAgICAgIG91dHB1dC5zZXROYW1lKCJvdXRwdXQiKTsKLSAgICAgICAgd3NkbE9wZXJhdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb24uc2V0T3V0cHV0KG91dHB1dCk7Ci0gICAgICAgIHdzZGxPcGVyYXRpb24uc2V0U3R5bGUoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKTsKLQotICAgICAgICAvLyBhZGQgZmF1bHQgbWVzc2FnZXMKLSAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25DbGFzc2VzID0gb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICBNZXNzYWdlIGZhdWx0TWVzc2FnZTsKLSAgICAgICAgRmF1bHQgZmF1bHQ7Ci0gICAgICAgIFN0cmluZyBmYXVsdE5hbWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmF1bHROYW1lID0gZXhjZXB0aW9uQ2xhc3Nlc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBmYXVsdE5hbWUgPSBmYXVsdE5hbWUuc3Vic3RyaW5nKGZhdWx0TmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICBmYXVsdE1lc3NhZ2UgPSAoTWVzc2FnZSkgZmF1bHRNZXNzYWdlTWFwLmdldChleGNlcHRpb25DbGFzc2VzW2ldKTsKLSAgICAgICAgICAgIGZhdWx0ID0gZGVmaW5pdGlvbi5jcmVhdGVGYXVsdCgpOwotICAgICAgICAgICAgZmF1bHQuc2V0TWVzc2FnZShmYXVsdE1lc3NhZ2UpOwotICAgICAgICAgICAgZmF1bHQuc2V0TmFtZSgiZmF1bHQiICsgZmF1bHROYW1lKTsKLSAgICAgICAgICAgIHdzZGxPcGVyYXRpb24uYWRkRmF1bHQoZmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHdzZGxPcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2VuZXJhdGVzIHRoZSBzb2FwMTEgYmluZGluZyBvcGVyYXRpb24gZm9yIHRoZSBzb2FwIDExIGJpbmRpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgICAqIEBwYXJhbSB3c2RsT3BlcmF0aW9uCi0gICAgICogQHBhcmFtIG9wZXJhdGlvbgotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRXU0RMQmluZGluZ09wZXJhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC5PcGVyYXRpb24gd3NkbE9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBkZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbih3c2RsT3BlcmF0aW9uKTsKLQotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gZGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQoYmluZGluZ0lucHV0KTsKLQotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBkZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nT3V0cHV0KGJpbmRpbmdPdXRwdXQpOwotCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdQb3B1bGF0ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gKFNPQVBPcGVyYXRpb24pIGV4dGVuc2lvblJlZ2lzdHJ5LmNyZWF0ZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgQmluZGluZ09wZXJhdGlvbi5jbGFzcywgbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiwgIm9wZXJhdGlvbiIpKTsKLSAgICAgICAgICAgIHNvYXBPcGVyYXRpb24uc2V0U29hcEFjdGlvblVSSSgidXJuOiIgKyBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNvYXBPcGVyYXRpb24uc2V0U3R5bGUoImRvY3VtZW50Iik7Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBTT0FQQm9keSBpbnB1dFNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRlbnNpb25SZWdpc3RyeS5jcmVhdGVFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgICAgIEJpbmRpbmdJbnB1dC5jbGFzcywgbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiwgImJvZHkiKSk7Ci0gICAgICAgICAgICBpbnB1dFNvYXBCb2R5LnNldFVzZSgibGl0ZXJhbCIpOwotICAgICAgICAgICAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGlucHV0U29hcEJvZHkpOwotCi0gICAgICAgICAgICBTT0FQQm9keSBvdXRwdXRTb2FwQm9keSA9IChTT0FQQm9keSkgZXh0ZW5zaW9uUmVnaXN0cnkuY3JlYXRlRXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgICAgICBCaW5kaW5nT3V0cHV0LmNsYXNzLCBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAiYm9keSIpKTsKLSAgICAgICAgICAgIG91dHB1dFNvYXBCb2R5LnNldFVzZSgibGl0ZXJhbCIpOwotICAgICAgICAgICAgYmluZGluZ091dHB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChvdXRwdXRTb2FwQm9keSk7Ci0KLSAgICAgICAgICAgIC8vIGFkZGluZyBmYXVsdCBtZXNzYWdlcwotICAgICAgICAgICAgQ2xhc3NbXSBleGNlcHRpb25DbGFzc2VzID0gb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5nZXRFeGNlcHRpb25UeXBlcygpOwotICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdDsKLSAgICAgICAgICAgIFN0cmluZyBmYXVsdE5hbWU7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmYXVsdE5hbWUgPSBleGNlcHRpb25DbGFzc2VzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBmYXVsdE5hbWUgPSBmYXVsdE5hbWUuc3Vic3RyaW5nKGZhdWx0TmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0ZhdWx0ID0gZGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmF1bHQuc2V0TmFtZSgiZmF1bHQiICsgZmF1bHROYW1lKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotCi0gICAgICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IChTT0FQRmF1bHQpIGV4dGVuc2lvblJlZ2lzdHJ5LmNyZWF0ZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdGYXVsdC5jbGFzcywgbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiwgImZhdWx0IikpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRVc2UoImxpdGVyYWwiKTsKLSAgICAgICAgICAgICAgICBzb2FwRmF1bHQuc2V0TmFtZSgiZmF1bHQiICsgZmF1bHROYW1lKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmF1bHQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24oIkNhbiBub3QgY3JldGUgYSB3c2RsIGZhY3RvcnkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUk1JQ2xpZW50U2VydmljZTFUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jbGllbnQvUk1JQ2xpZW50U2VydmljZTFUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmM4ZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvY2xpZW50L1JNSUNsaWVudFNlcnZpY2UxVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlcy5TZXJ2aWNlMUludGVyZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFJNSUNsaWVudFNlcnZpY2UxVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0gKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4NS9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMSIpOwotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDEoIkhlbGxvdyB3b3JsZCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgIkhlbGxvdyB3b3JsZCIpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTFJbnRlcmZhY2UgcHJveHkgPSAoU2VydmljZTFJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UxSW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDg1L2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcHJveHkubWV0aG9kMShudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMUludGVyZmFjZSBwcm94eSA9IChTZXJ2aWNlMUludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTFJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODUvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIobmV3IFN0cmluZ1tdeyJwYXJhbTEiLCJwYXJhbTIifSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0WzBdLCAicGFyYW0xIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0WzFdLCAicGFyYW0yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMUludGVyZmFjZSBwcm94eSA9IChTZXJ2aWNlMUludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTFJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODUvYXhpczIvc2VydmljZXMvU2VydmljZTEiKTsKLSAgICAgICAgICAgIE1hcCBwYXJhbTEgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgcGFyYW0xLnB1dCgia2V5MSIsICJ2YWx1ZTEiKTsKLSAgICAgICAgICAgIHBhcmFtMS5wdXQoImtleTIiLCAidmFsdWUyIik7Ci0gICAgICAgICAgICBNYXAgcmVzdWx0ID0gcHJveHkubWV0aG9kNShwYXJhbTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnNLZXkoImtleTEiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5jb250YWluc0tleSgia2V5MiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0KCJrZXkxIiksICJ2YWx1ZTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0KCJrZXkyIiksICJ2YWx1ZTIiKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDYoKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0gKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4NS9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMSIpOwotCi0gICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgRGF0ZSByZXN1bHQgPSBwcm94eS5tZXRob2Q2KGRhdGUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGUuZ2V0RGF0ZSgpLCByZXN1bHQuZ2V0RGF0ZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvY3VzdG9tYmVhbnMvRG9tRWxlbWVudEJlYW5UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jdXN0b21iZWFucy9Eb21FbGVtZW50QmVhblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyYWI5Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9jdXN0b21iZWFucy9Eb21FbGVtZW50QmVhblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuY3VzdG9tYmVhbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRG9tRWxlbWVudEJlYW5UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhcnNlKCl7Ci0gICAgICAgICBTdHJpbmcgeG1sU3RyaW5nID0gIjxzdGFydHRhZz48eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vd3MuYXBhY2hlLm9yZy9ybWkvdHlwZXNcIiB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiPiIgKwotICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiTWFwVHlwZVwiPiIgKwotICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBmb3JtPVwidW5xdWFsaWZpZWRcIiBtaW5PY2N1cnM9XCIwXCIgbmFtZT1cImtleVwiIG5pbGxhYmxlPVwidHJ1ZVwiIHR5cGU9XCJ4c2Q6YW55VHlwZVwiLz4iICsKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGZvcm09XCJ1bnF1YWxpZmllZFwiIG1pbk9jY3Vycz1cIjBcIiBuYW1lPVwidmFsdWVcIiBuaWxsYWJsZT1cInRydWVcIiB0eXBlPVwieHNkOmFueVR5cGVcIi8+IiArCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+IiArCi0gICAgICAgICAgICAgICAgICIgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4iICsKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgPC94c2Q6c2NoZW1hPjwvc3RhcnR0YWc+IjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHJpbmcuZ2V0Qnl0ZXMoKSkpOwotCi0gICAgICAgICAgICBFbGVtZW50IGRvbUVsZW1lbnQgPSAoRWxlbWVudCkgRG9tRWxlbWVudEJlYW4ucGFyc2UocmVhZGVyLG51bGwpOwotCi0gICAgICAgICAgICAvLyBzZXJpYWxpemluZyB0aGUgZG9jdW1lbnQKLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihzdHJpbmdXcml0ZXIpOwotICAgICAgICAgICAgRG9tRWxlbWVudEJlYW4gZG9tRWxlbWVudEJlYW4gPSBuZXcgRG9tRWxlbWVudEJlYW4oZG9tRWxlbWVudCk7Ci0gICAgICAgICAgICBkb21FbGVtZW50QmVhbi5zZXJpYWxpemUoeG1sU3RyZWFtV3JpdGVyLG51bGwsbmV3IFFOYW1lKCJodHRwOi8vdGVzdCIsInN0YXJ0dGFnIiksbmV3IE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ4bWwgc3RyaW5nID09PiIgKyBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9LIik7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9IGNhdGNoIChYbWxQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0gY2F0Y2ggKFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db2xsZWN0aW9uVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29sbGVjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyZjYzMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db2xsZWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVGVzdCBleHRlbmRzIERhdGFCaW5kVGVzdCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTExKCl7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTEuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMSB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczExKCk7Ci0gICAgICAgIExpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmciKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdExpc3QpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldCgwKSwgIlRlc3QgU3RyaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExMigpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBMaXN0IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0ZXN0TGlzdC5hZGQoIlRlc3QgU3RyaW5nMCIpOwotICAgICAgICB0ZXN0TGlzdC5hZGQoIlRlc3QgU3RyaW5nMSIpOwotICAgICAgICB0ZXN0TGlzdC5hZGQobnVsbCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmczIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChudWxsKTsKLQotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMSh0ZXN0TGlzdCk7Ci0gICAgICAgIFRlc3RDbGFzczExIHJlc3VsdCA9IChUZXN0Q2xhc3MxMSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0KDApLCAiVGVzdCBTdHJpbmcwIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0KDEpLCAiVGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0KDIpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoMyksICJUZXN0IFN0cmluZzMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoNCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMTMoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMS5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczExIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTEoKTsKLSAgICAgICAgTGlzdCB0ZXN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdExpc3QpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCBudWxsKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMTQoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMS5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczExIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTEoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobnVsbCk7Ci0gICAgICAgIFRlc3RDbGFzczExIHJlc3VsdCA9IChUZXN0Q2xhc3MxMSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExNSgpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmciKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIodGVzdExpc3QpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLmdldCgwKSwgIlRlc3QgU3RyaW5nIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExNigpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmcwIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZCgiVGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChudWxsKTsKLSAgICAgICAgdGVzdExpc3QuYWRkKCJUZXN0IFN0cmluZzMiKTsKLSAgICAgICAgdGVzdExpc3QuYWRkKG51bGwpOwotCi0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHRlc3RMaXN0KTsKLSAgICAgICAgVGVzdENsYXNzMTEgcmVzdWx0ID0gKFRlc3RDbGFzczExKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoMCksICJUZXN0IFN0cmluZzAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoMSksICJUZXN0IFN0cmluZzEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoMiksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLmdldCgzKSwgIlRlc3QgU3RyaW5nMyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLmdldCg0KSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRlc3RDbGFzczExNygpewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczExLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBBcnJheUxpc3QgdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHRlc3RMaXN0KTsKLSAgICAgICAgVGVzdENsYXNzMTEgcmVzdWx0ID0gKFRlc3RDbGFzczExKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbnVsbCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTE4KCl7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTEuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMSB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczExKCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKG51bGwpOwotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMTkoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMS5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0KLSAgICAgICAgVGVzdENsYXNzMTEgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMSgpOwotICAgICAgICBMaXN0IHRlc3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0ZXN0TGlzdC5hZGQoInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgIHRlc3RMaXN0LmFkZChudWxsKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdExpc3QpOwotCi0gICAgICAgIFNldCB0ZXN0U2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgdGVzdFNldC5hZGQoInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgIHRlc3RTZXQuYWRkKG51bGwpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMyh0ZXN0U2V0KTsKLQotICAgICAgICBUZXN0Q2xhc3MxMSByZXN1bHQgPSAoVGVzdENsYXNzMTEpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldCgwKSwidGVzdCBzdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoMSksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0zKCkuY29udGFpbnMoInRlc3Qgc3RyaW5nIikpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTMoKS5jb250YWlucyhudWxsKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29tcGxleEFycmF5VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29tcGxleEFycmF5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE3NTgwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbXBsZXhBcnJheVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4QXJyYXlUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3M3KCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M3LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzNyB0ZXN0T2JqZWN0ID0gbnVsbDsKLSAgICAgICAgVGVzdENsYXNzNyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNygpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczcoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IFRlc3RDbGFzczRbXXtudWxsLCBudWxsfSk7Ci0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3M3KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLQotICAgICAgICBUZXN0Q2xhc3M0W10gdGVzZUNsYXNzQXJyYXkgPSBuZXcgVGVzdENsYXNzNFszXTsKLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMF0gPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVswXS5zZXRQYXJhbTEobmV3IGludFtdezUsIDZ9KTsKLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMF0uc2V0UGFyYW0yKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSk7Ci0gICAgICAgIHRlc2VDbGFzc0FycmF5WzBdLnNldFBhcmFtMyhuZXcgU3RyaW5nW117InRlc3QgU3RyaW5nIn0pOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVswXS5zZXRQYXJhbTQobmV3IGZsb2F0W117NS41NmZ9KTsKLQotICAgICAgICB0ZXNlQ2xhc3NBcnJheVsxXSA9IG51bGw7Ci0KLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMl0gPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVsyXS5zZXRQYXJhbTEobmV3IGludFtdezUsIDZ9KTsKLSAgICAgICAgdGVzZUNsYXNzQXJyYXlbMl0uc2V0UGFyYW0yKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSk7Ci0gICAgICAgIHRlc2VDbGFzc0FycmF5WzJdLnNldFBhcmFtMyhuZXcgU3RyaW5nW117InRlc3QgU3RyaW5nIn0pOwotICAgICAgICB0ZXNlQ2xhc3NBcnJheVsyXS5zZXRQYXJhbTQobmV3IGZsb2F0W117NS41NmZ9KTsKLQotICAgICAgICBUZXN0Q2xhc3MzIHRlc3RDbGFzczMgPSBuZXcgVGVzdENsYXNzMygpOwotICAgICAgICB0ZXN0Q2xhc3MzLnNldFBhcmFtMShuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgIHRlc3RDbGFzczMuc2V0UGFyYW0yKG5ldyBGbG9hdCg0NS42KSk7Ci0gICAgICAgIHRlc3RDbGFzczMuc2V0UGFyYW0zKG5ldyBEb3VibGUoMykpOwotICAgICAgICB0ZXN0Q2xhc3MzLnNldFBhcmFtNCgidGVzdCBTdHJpbmciKTsKLQotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNygpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMSh0ZXNlQ2xhc3NBcnJheSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHRlc3RDbGFzczMpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTEoKVswXSwgNSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0xKClbMV0sIDYpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpWzBdLmludFZhbHVlKCksIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpWzFdLmludFZhbHVlKCksIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMygpWzBdLCAidGVzdCBTdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW00KClbMF0gPT0gNS41NmYpOwotCi0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldFBhcmFtMSgpWzFdKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzJdLmdldFBhcmFtMSgpWzBdLCA1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTEoKVsxXSwgNik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0yKClbMF0uaW50VmFsdWUoKSwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0yKClbMV0uaW50VmFsdWUoKSwgMyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0zKClbMF0sICJ0ZXN0IFN0cmluZyIpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTQoKVswXSA9PSA1LjU2Zik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXRQYXJhbTEoKS5pbnRWYWx1ZSgpLCAyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0yKCkuZ2V0UGFyYW0yKCkuZmxvYXRWYWx1ZSgpID09IDQ1LjZmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0yKCkuZ2V0UGFyYW0zKCkuZG91YmxlVmFsdWUoKSA9PSAzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXRQYXJhbTQoKSwgInRlc3QgU3RyaW5nIik7Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczkxKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M5LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLQotICAgICAgICBUZXN0Q2xhc3M5IHRlc3RDbGFzczkgPSBuZXcgVGVzdENsYXNzOSgpOwotCi0gICAgICAgIFRlc3RDbGFzczJbXSB0ZXN0Q2xhc3MyID0gbmV3IFRlc3RDbGFzczJbM107Ci0gICAgICAgIHRlc3RDbGFzczJbMF0gPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdENsYXNzMlswXS5zZXRQYXJhbTIoMjMuNDVmKTsKLSAgICAgICAgdGVzdENsYXNzMlswXS5zZXRQYXJhbTMoNDUpOwotCi0gICAgICAgIHRlc3RDbGFzczJbMV0gPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0Q2xhc3MyWzFdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdENsYXNzMlsxXS5zZXRQYXJhbTIoMjMuNDVmKTsKLSAgICAgICAgdGVzdENsYXNzMlsxXS5zZXRQYXJhbTMoNDUpOwotCi0gICAgICAgIHRlc3RDbGFzczJbMl0gPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdENsYXNzMlsyXS5zZXRQYXJhbTIoMjMuNDVmKTsKLSAgICAgICAgdGVzdENsYXNzMlsyXS5zZXRQYXJhbTMoNDUpOwotCi0gICAgICAgIHRlc3RDbGFzczkuc2V0UGFyYW0xKHRlc3RDbGFzczIpOwotCi0gICAgICAgIFRlc3RDbGFzczkgcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczkpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RDbGFzczkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0xKCksIDUpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTIoKSA9PSAyMy40NWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTMoKSA9PSA0NSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTEoKSwgNSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMigpID09IDIzLjQ1Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMygpID09IDQ1LjBkKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzJdLmdldFBhcmFtMSgpLCA1KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0yKCkgPT0gMjMuNDVmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0zKCkgPT0gNDUuMGQpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzOTIoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczkuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDbGFzczkgdGVzdENsYXNzOSA9IG5ldyBUZXN0Q2xhc3M5KCk7Ci0KLSAgICAgICAgVGVzdENsYXNzMltdIHRlc3RDbGFzczIgPSBuZXcgVGVzdENsYXNzMlszXTsKLSAgICAgICAgdGVzdENsYXNzMlswXSA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgIHRlc3RDbGFzczJbMF0uc2V0UGFyYW0xKDUpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMigyMy40NWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMyg0NSk7Ci0KLSAgICAgICAgdGVzdENsYXNzMlsxXSA9IG51bGw7Ci0KLSAgICAgICAgdGVzdENsYXNzMlsyXSA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgIHRlc3RDbGFzczJbMl0uc2V0UGFyYW0xKDUpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMigyMy40NWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMyg0NSk7Ci0KLSAgICAgICAgdGVzdENsYXNzOS5zZXRQYXJhbTEodGVzdENsYXNzMik7Ci0KLSAgICAgICAgVGVzdENsYXNzOSByZXR1cm5PYmplY3QgPSAoVGVzdENsYXNzOSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdENsYXNzOSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTEoKSwgNSk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpID09IDIzLjQ1Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMygpID09IDQ1KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LmdldFBhcmFtMSgpWzFdLG51bGwpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0xKCksIDUpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTIoKSA9PSAyMy40NWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTMoKSA9PSA0NS4wZCk7Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbXBsZXhEYXRhQmluZFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbXBsZXhEYXRhQmluZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2MGM4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db21wbGV4RGF0YUJpbmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb21wbGV4RGF0YUJpbmRUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczUoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M1LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M1IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNSgpOwotCi0gICAgICAgIFRlc3RDbGFzczUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgcmVzdWx0ID0gKFRlc3RDbGFzczUpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksbnVsbCk7Ci0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IFRlc3RDbGFzczEoKSk7Ci0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3M1KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M2KCl7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczYuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywiUGFyYW0xIik7Ci0KLSAgICAgICAgVGVzdENsYXNzNiByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIFRlc3RDbGFzczYgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3M2KCk7Ci0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3M2KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpLDApOwotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNigpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgVGVzdENsYXNzMigpKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIoInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKDUpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0UGFyYW0xKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCJ0ZXN0IFN0cmluZyIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpLDUpOwotCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNigpOwotCi0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKG5ldyBUZXN0Q2xhc3MyKCkpOwotICAgICAgICB0ZXN0T2JqZWN0LmdldFBhcmFtMSgpLnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdE9iamVjdC5nZXRQYXJhbTEoKS5zZXRQYXJhbTIoMzQuNWYpOwotICAgICAgICB0ZXN0T2JqZWN0LmdldFBhcmFtMSgpLnNldFBhcmFtMygzMi41KTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIoInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKDUpOwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzNikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKSw1KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0yKCkgPT0gMzQuNWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTMoKSA9PSAzMi41KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwidGVzdCBTdHJpbmciKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSw1KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db21wbGV4UmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29tcGxleFJlcXVlc3RSZXNwb25zZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwYzc3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9Db21wbGV4UmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5zZXJ2aWNlLlNlcnZpY2UyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLk9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENvbXBsZXhSZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgUmVxdWVzdFJlc3BvbnNlVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IFNlcnZpY2UyLmNsYXNzOwotICAgICAgICB0aGlzLnNlcnZpY2VPYmplY3QgPSBuZXcgU2VydmljZTIoKTsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMSIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBUZXN0Q2xhc3MxKCkpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMSBvYmplY3QgPSAoVGVzdENsYXNzMSkgb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIFRlc3RDbGFzczEgcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczEpIGdldFJldHVybk9iamVjdChvYmplY3QsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0dXJuT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMiIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBUZXN0Q2xhc3MxW117bmV3IFRlc3RDbGFzczEoKSwgbmV3IFRlc3RDbGFzczEoKX0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMVtdIG9iamVjdCA9IChUZXN0Q2xhc3MxW10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MxW10gcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczFbXSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMV0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMiIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBUZXN0Q2xhc3MxW117bmV3IFRlc3RDbGFzczEoKSwgbnVsbCwgbmV3IFRlc3RDbGFzczEoKX0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMVtdIG9iamVjdCA9IChUZXN0Q2xhc3MxW10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MxW10gcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczFbXSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMF0pOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXR1cm5PYmplY3RbMV0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXR1cm5PYmplY3RbMl0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMyIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MyIHRlc3RDbGFzczIgPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICAgICAgdGVzdENsYXNzMi5zZXRQYXJhbTEoMSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMigzNC41Zik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMygyMy41KTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQodGVzdENsYXNzMik7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBUZXN0Q2xhc3MyIG9iamVjdCA9IChUZXN0Q2xhc3MyKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgVGVzdENsYXNzMiByZXR1cm5PYmplY3QgPSAoVGVzdENsYXNzMikgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdC5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMyIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG51bGwpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMiBvYmplY3QgPSAoVGVzdENsYXNzMikgb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIFRlc3RDbGFzczIgcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczIpIGdldFJldHVybk9iamVjdChvYmplY3QsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwocmV0dXJuT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q0MSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kNCIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczIgdGVzdENsYXNzMjEgPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICAgICAgdGVzdENsYXNzMjEuc2V0UGFyYW0xKDEpOwotICAgICAgICAgICAgdGVzdENsYXNzMjEuc2V0UGFyYW0yKDM0LjVmKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIxLnNldFBhcmFtMygyMy41KTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMiB0ZXN0Q2xhc3MyMiA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyMi5zZXRQYXJhbTEoMSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyMi5zZXRQYXJhbTIoMzQuNWYpOwotICAgICAgICAgICAgdGVzdENsYXNzMjIuc2V0UGFyYW0zKDIzLjUpOwotCi0gICAgICAgICAgICBUZXN0Q2xhc3MyIHRlc3RDbGFzczIzID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIzLnNldFBhcmFtMSgxKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIzLnNldFBhcmFtMigzNC41Zik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyMy5zZXRQYXJhbTMoMjMuNSk7Ci0KLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQobmV3IFRlc3RDbGFzczJbXXt0ZXN0Q2xhc3MyMSx0ZXN0Q2xhc3MyMix0ZXN0Q2xhc3MyM30pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgVGVzdENsYXNzMltdIG9iamVjdCA9IChUZXN0Q2xhc3MyW10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MyW10gcmV0dXJuT2JqZWN0ID0gKFRlc3RDbGFzczJbXSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFswXS5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFswXS5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFswXS5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsxXS5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsxXS5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsxXS5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsyXS5nZXRQYXJhbTEoKSwgMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsyXS5nZXRQYXJhbTIoKSA9PSAzNC41Zik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJldHVybk9iamVjdFsyXS5nZXRQYXJhbTMoKSA9PSAyMy41KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29uZmlnT2JqZWN0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ29uZmlnT2JqZWN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkzNzAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0NvbmZpZ09iamVjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkNsYXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkN1c3RvbUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLkV4dGVuc2lvbkNsYXNzZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZy5GaWVsZEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZy5QYWNrYWdlVG9OYW1lc3BhY2VNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LmNvbmZpZy5QYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWcuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kZXBsb3kuY29uZmlnLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBDb25maWdPYmplY3RUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdPYmplY3QoKSB7Ci0KLSAgICAgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcoKTsKLQotICAgICAgICAvLyBhZGRpbmcgdXN0b20gbWFwcGluZ3MKLSAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyhGaWVsZEluZm8uY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuRmllbGRJbmZvKCJqYXZhTmFtZSIsbnVsbCxmYWxzZSkpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuRmllbGRJbmZvKCJ4bWxOYW1lIixudWxsLGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm8oImVsZW1lbnQiLCJpc0VsZW1lbnQiLGZhbHNlKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLQotICAgICAgICBjbGFzc0luZm8gPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkNsYXNzSW5mbyhDbGFzc0luZm8uY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuRmllbGRJbmZvKCJjbGFzc05hbWUiLG51bGwsZmFsc2UpKTsKLSAgICAgICAgY29uZmlndXJhdG9yLmFkZENsYXNzSW5mbyhjbGFzc0luZm8pOwotCi0KLQotICAgICAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBuZXcgU2VydmljZVsyXTsKLSAgICAgICAgc2VydmljZXNbMF0gPSBuZXcgU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlc1swXS5zZXRTZXJ2aWNlQ2xhc3MoIlNlcnZpY2UxIik7Ci0KLSAgICAgICAgc2VydmljZXNbMV0gPSBuZXcgU2VydmljZSgpOwotICAgICAgICBzZXJ2aWNlc1sxXS5zZXRTZXJ2aWNlQ2xhc3MoIlNlcnZpY2UyIik7Ci0KLSAgICAgICAgU2VydmljZXMgdGVzdFNlcnZpY2VzID0gbmV3IFNlcnZpY2VzKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlcy5zZXRTZXJ2aWNlKHNlcnZpY2VzKTsKLSAgICAgICAgY29uZmlnLnNldFNlcnZpY2VzKHRlc3RTZXJ2aWNlcyk7Ci0KLSAgICAgICAgRXh0ZW5zaW9uQ2xhc3NlcyBleHRlbnNpb25DbGFzc2VzID0gbmV3IEV4dGVuc2lvbkNsYXNzZXMoKTsKLSAgICAgICAgZXh0ZW5zaW9uQ2xhc3Nlcy5zZXRFeHRlbnNpb25DbGFzcyhuZXcgU3RyaW5nW117ImV4dGVuc2lvbjEiLCAiZXh0ZW5zaW9uMiJ9KTsKLSAgICAgICAgY29uZmlnLnNldEV4dGVuc2lvbkNsYXNzZXMoZXh0ZW5zaW9uQ2xhc3Nlcyk7Ci0KLSAgICAgICAgUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncyBwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzID0gbmV3IFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MoKTsKLQotICAgICAgICBQYWNrYWdlVG9OYW1lc3BhY2VNYXBbXSBwYWNrYWdlVG9OYW1lc3BhY2VNYXBzID0gbmV3IFBhY2thZ2VUb05hbWVzcGFjZU1hcFsyXTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwc1swXSA9IG5ldyBQYWNrYWdlVG9OYW1lc3BhY2VNYXAoKTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwc1swXS5zZXROYW1lc3BhY2UoIm5zMSIpOwotICAgICAgICBwYWNrYWdlVG9OYW1lc3BhY2VNYXBzWzBdLnNldFBhY2thZ2VOYW1lKCJwYWNrYWdlMSIpOwotCi0gICAgICAgIHBhY2thZ2VUb05hbWVzcGFjZU1hcHNbMV0gPSBuZXcgUGFja2FnZVRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICAgIHBhY2thZ2VUb05hbWVzcGFjZU1hcHNbMV0uc2V0TmFtZXNwYWNlKCJuczIiKTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwc1sxXS5zZXRQYWNrYWdlTmFtZSgicGFja2FnZTIiKTsKLSAgICAgICAgcGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncy5zZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXAocGFja2FnZVRvTmFtZXNwYWNlTWFwcyk7Ci0gICAgICAgIGNvbmZpZy5zZXRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzKHBhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3MpOwotICAgICAgICBjb25maWcuc2V0U2ltcGxlRGF0YUhhbmRsZXJDbGFzcygidGVzdCIpOwotCi0gICAgICAgIC8vYWRkaW5nIGN1c3RvbWNsYXNzIGluZm8KLSAgICAgICAgQ3VzdG9tQ2xhc3NJbmZvIGN1c3RvbUNsYXNzSW5mbyA9IG5ldyBDdXN0b21DbGFzc0luZm8oKTsKLSAgICAgICAgQ2xhc3NJbmZvW10gY2xhc3NJbmZvcyA9IG5ldyBDbGFzc0luZm9bMV07Ci0gICAgICAgIGNsYXNzSW5mb3NbMF0gPSBuZXcgQ2xhc3NJbmZvKCk7Ci0KLSAgICAgICAgRmllbGRJbmZvW10gZmlsZWRJbmZvcyA9IG5ldyBGaWVsZEluZm9bMV07Ci0gICAgICAgIGZpbGVkSW5mb3NbMF0gPSBuZXcgRmllbGRJbmZvKCk7Ci0gICAgICAgIGZpbGVkSW5mb3NbMF0uc2V0RWxlbWVudChmYWxzZSk7Ci0gICAgICAgIGZpbGVkSW5mb3NbMF0uc2V0SmF2YU5hbWUoInBhcmFtMSIpOwotICAgICAgICBmaWxlZEluZm9zWzBdLnNldFhtbE5hbWUoInhtbFBhcmFtMSIpOwotCi0gICAgICAgIGNsYXNzSW5mb3NbMF0uc2V0RmllbGRJbmZvKGZpbGVkSW5mb3MpOwotICAgICAgICBjbGFzc0luZm9zWzBdLnNldENsYXNzTmFtZSgidGVzdCIpOwotCi0gICAgICAgIGN1c3RvbUNsYXNzSW5mby5zZXRDbGFzc0luZm8oY2xhc3NJbmZvcyk7Ci0KLSAgICAgICAgY29uZmlnLnNldEN1c3RvbUNsYXNzSW5mbyhjdXN0b21DbGFzc0luZm8pOwotCi0KLQotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKENvbmZpZy5jbGFzcywgImNvbmZpZyIpOwotICAgICAgICBwYXJhbWV0ZXIuc2V0TmFtZXNwYWNlKCJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkiKTsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoIm9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5jb25maWciLAotICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZE1hcCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIGNvbmZpZ1htbFdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKGNvbmZpZ1htbFdyaXRlcik7Ci0gICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBqYXZhT2JqZWN0U2VyaWFsaXplciA9IG5ldyBKYXZhT2JqZWN0U2VyaWFsaXplcih0aGlzLnByb2Nlc3NlZE1hcCwgdGhpcy5jb25maWd1cmF0b3IsIHRoaXMuc2NoZW1hTWFwKTsKLSAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZVBhcmFtZXRlcihjb25maWcsIHBhcmFtZXRlciwgd3JpdGVyLCBuZXcgTmFtZXNwYWNlUHJlZml4KCkpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb25maWdYbWxTdHJpbmcgPSBjb25maWdYbWxXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29uZmlnID09PiAiICsgY29uZmlnWG1sU3RyaW5nKTsKLQotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbmZpZ1htbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgICBYbWxTdHJlYW1QYXJzZXIgeG1sU3RyZWFtUGFyc2VyID0gbmV3IFhtbFN0cmVhbVBhcnNlcih0aGlzLnByb2Nlc3NlZE1hcCwgdGhpcy5jb25maWd1cmF0b3IsIHRoaXMuc2NoZW1hTWFwKTsKLSAgICAgICAgICAgIENvbmZpZyByZXN1bHQgPSAoQ29uZmlnKSB4bWxTdHJlYW1QYXJzZXIuZ2V0T2JqZWN0Rm9yUGFyYW1ldGVyKHhtbFJlYWRlciwgcGFyYW1ldGVyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhtbFBhcnNpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0N1c3RvbU1hcHBpbmdzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ3VzdG9tTWFwcGluZ3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDAwZGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ3VzdG9tTWFwcGluZ3NUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzOTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbU1hcHBpbmdzVGVzdCBleHRlbmRzIERhdGFCaW5kVGVzdCB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMigpewotCi0gICAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKFRlc3RDbGFzczIuY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMSIsInhtbHBhcmFtMSIsZmFsc2UpKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgRmllbGRJbmZvKCJwYXJhbTIiLCJ4bWxwYXJhbTIiLGZhbHNlKSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLQotICAgICAgICBUZXN0Q2xhc3MyIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMigpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMSg1KTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTIoMzQuNWYpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMygzNC41KTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihUZXN0Q2xhc3MyLmNsYXNzLCJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMiByZXN1bHQgPSAoVGVzdENsYXNzMikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSw1KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0yKCkgPT0gMzQuNWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTMoKSA9PSAzNC41KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3M5KCl7Ci0gICAgICAgIAotICAgICAgICBDbGFzc0luZm8gY2xhc3NJbmZvID0gbmV3IENsYXNzSW5mbyhUZXN0Q2xhc3MyLmNsYXNzKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgRmllbGRJbmZvKCJwYXJhbTEiLCJ4bWxwYXJhbTEiLGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0yIiwieG1scGFyYW0yIixmYWxzZSkpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMyIsInhtbHBhcmFtMyIsdHJ1ZSkpOwotICAgICAgICBjb25maWd1cmF0b3IuYWRkQ2xhc3NJbmZvKGNsYXNzSW5mbyk7Ci0KLSAgICAgICAgY2xhc3NJbmZvID0gbmV3IENsYXNzSW5mbyhUZXN0Q2xhc3M5LmNsYXNzKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhuZXcgRmllbGRJbmZvKCJwYXJhbTEiLCJ4bWxwYXJhbTEiLHRydWUpKTsKLQotICAgICAgICBjb25maWd1cmF0b3IuYWRkQ2xhc3NJbmZvKGNsYXNzSW5mbyk7Ci0KLSAgICAgICAgVGVzdENsYXNzOSB0ZXN0Q2xhc3M5ID0gbmV3IFRlc3RDbGFzczkoKTsKLQotICAgICAgICBUZXN0Q2xhc3MyW10gdGVzdENsYXNzMiA9IG5ldyBUZXN0Q2xhc3MyWzNdOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgdGVzdENsYXNzMlswXS5zZXRQYXJhbTEoNik7Ci0gICAgICAgIHRlc3RDbGFzczJbMF0uc2V0UGFyYW0yKDQuNWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzBdLnNldFBhcmFtMyg1Ni41KTsKLQotICAgICAgICB0ZXN0Q2xhc3MyWzFdID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgdGVzdENsYXNzMlsxXS5zZXRQYXJhbTEoNik7Ci0gICAgICAgIHRlc3RDbGFzczJbMV0uc2V0UGFyYW0yKDQuNWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzFdLnNldFBhcmFtMyg1Ni41KTsKLQotICAgICAgICB0ZXN0Q2xhc3MyWzJdID0gbmV3IFRlc3RDbGFzczIoKTsKLSAgICAgICAgdGVzdENsYXNzMlsyXS5zZXRQYXJhbTEoNik7Ci0gICAgICAgIHRlc3RDbGFzczJbMl0uc2V0UGFyYW0yKDQuNWYpOwotICAgICAgICB0ZXN0Q2xhc3MyWzJdLnNldFBhcmFtMyg1Ni41KTsKLQotICAgICAgICB0ZXN0Q2xhc3M5LnNldFBhcmFtMSh0ZXN0Q2xhc3MyKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihUZXN0Q2xhc3M5LmNsYXNzLCJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzOSByZXN1bHQgPSAoVGVzdENsYXNzOSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlcix0ZXN0Q2xhc3M5KTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMSgpLDYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTIoKSA9PSA0LjVmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0zKCkgPT0gNTYuNSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTEoKSw2KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKClbMV0uZ2V0UGFyYW0yKCkgPT0gNC41Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMygpID09IDU2LjUpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMl0uZ2V0UGFyYW0xKCksNik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpWzJdLmdldFBhcmFtMigpID09IDQuNWYpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKVsyXS5nZXRQYXJhbTMoKSA9PSA1Ni41KTsKLQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9DdXN0b21UeXBlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvQ3VzdG9tVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmZDZjMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9DdXN0b21UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0Q2xhc3MxMzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdFJlc3RyaWN0aW9uQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbVR5cGVUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMzEoKSB7Ci0KLSAgICAgICAgVGVzdENsYXNzMTMgdGVzdENsYXNzMTMgPSBuZXcgVGVzdENsYXNzMTMoKTsKLSAgICAgICAgVGVzdFJlc3RyaWN0aW9uQmVhbiB0ZXN0UmVzdHJpY3Rpb25CZWFuID0gbmV3IFRlc3RSZXN0cmljdGlvbkJlYW4oInRlc3Qgc3RyaW5nIik7Ci0gICAgICAgIHRlc3RDbGFzczEzLnNldFBhcmFtMSh0ZXN0UmVzdHJpY3Rpb25CZWFuKTsKLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihUZXN0Q2xhc3MxMy5jbGFzcywgIlBhcmFtMSIpOwotCi0gICAgICAgIFRlc3RDbGFzczEzIHJlc3VsdCA9IChUZXN0Q2xhc3MxMykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdENsYXNzMTMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpLCAidGVzdCBzdHJpbmciKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMzIoKSB7Ci0KLSAgICAgICAgVGVzdENsYXNzMTMgdGVzdENsYXNzMTMgPSBuZXcgVGVzdENsYXNzMTMoKTsKLSAgICAgICAgVGVzdFJlc3RyaWN0aW9uQmVhbltdIHRlc3RSZXN0cmljdGlvbkJlYW5zID0gbmV3IFRlc3RSZXN0cmljdGlvbkJlYW5bM107Ci0gICAgICAgIHRlc3RSZXN0cmljdGlvbkJlYW5zWzBdID0gbmV3IFRlc3RSZXN0cmljdGlvbkJlYW4oInRlc3Qgc3RyaW5nIDEiKTsKLSAgICAgICAgdGVzdFJlc3RyaWN0aW9uQmVhbnNbMV0gPSBuZXcgVGVzdFJlc3RyaWN0aW9uQmVhbigidGVzdCBzdHJpbmcgMiIpOwotICAgICAgICB0ZXN0UmVzdHJpY3Rpb25CZWFuc1syXSA9IG5ldyBUZXN0UmVzdHJpY3Rpb25CZWFuKCJ0ZXN0IHN0cmluZyAzIik7Ci0gICAgICAgIHRlc3RDbGFzczEzLnNldFBhcmFtMih0ZXN0UmVzdHJpY3Rpb25CZWFucyk7Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIoVGVzdENsYXNzMTMuY2xhc3MsICJQYXJhbTEiKTsKLQotICAgICAgICBUZXN0Q2xhc3MxMyByZXN1bHQgPSAoVGVzdENsYXNzMTMpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RDbGFzczEzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVswXS5nZXRQYXJhbTEoKSwgInRlc3Qgc3RyaW5nIDEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsxXS5nZXRQYXJhbTEoKSwgInRlc3Qgc3RyaW5nIDIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsyXS5nZXRQYXJhbTEoKSwgInRlc3Qgc3RyaW5nIDMiKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0RhdGFCaW5kVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRGF0YUJpbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMWMxOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRGF0YUJpbmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20udXRpbC5TdEFYVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhQmluZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSmF2YU9iamVjdFNlcmlhbGl6ZXIgamF2YU9iamVjdFNlcmlhbGl6ZXI7Ci0gICAgcHJvdGVjdGVkIFhtbFN0cmVhbVBhcnNlciB4bWxTdHJlYW1QYXJzZXI7Ci0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0gICAgcHJvdGVjdGVkIE1hcCBwcm9jZXNzZWRNYXA7Ci0gICAgcHJvdGVjdGVkIE1hcCBzY2hlbWFNYXA7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5wcm9jZXNzZWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB0aGlzLnNjaGVtYU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMuamF2YU9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIodGhpcy5wcm9jZXNzZWRNYXAsdGhpcy5jb25maWd1cmF0b3IsdGhpcy5zY2hlbWFNYXApOwotICAgICAgICB0aGlzLnhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIodGhpcy5wcm9jZXNzZWRNYXAsdGhpcy5jb25maWd1cmF0b3IsdGhpcy5zY2hlbWFNYXApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UmV0dXJuT2JqZWN0KFBhcmFtZXRlciBwYXJhbWV0ZXIsIE9iamVjdCBpbnB1dE9iamVjdCkgewotCi0gICAgICAgIE9iamVjdCByZXV0bk9iamVjdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIucG9wdWxhdGVNZXRhRGF0YShjb25maWd1cmF0b3IsIHByb2Nlc3NlZE1hcCk7Ci0gICAgICAgICAgICBwYXJhbWV0ZXIuZ2VuZXJhdGVTY2hlbWEoY29uZmlndXJhdG9yLCBzY2hlbWFNYXApOwotCi0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHhtbFN0cmVhbVdyaXRlciA9IFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoc3RyaW5nV3JpdGVyKTsKLSAgICAgICAgICAgIGphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZVBhcmFtZXRlcihpbnB1dE9iamVjdCwgcGFyYW1ldGVyLCB4bWxTdHJlYW1Xcml0ZXIsIG5ldyBOYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIFN0cmluZyB4bWxTdHJpbmcgPSBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiWG1sIFN0cmluZyA9PT4gIiArIHhtbFN0cmluZyk7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIHJldXRuT2JqZWN0ID0geG1sU3RyZWFtUGFyc2VyLmdldE9iamVjdEZvclBhcmFtZXRlcihyZWFkZXIsIHBhcmFtZXRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChYbWxQYXJzaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldXRuT2JqZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQyMWE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0V4dGVuc2lvblJlcXVlc3RSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5DaGlsZENsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnNlcnZpY2UuU2VydmljZTM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25SZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgUmVxdWVzdFJlc3BvbnNlVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IFNlcnZpY2UzLmNsYXNzOwotICAgICAgICB0aGlzLnNlcnZpY2VPYmplY3QgPSBuZXcgU2VydmljZTMoKTsKLQotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkRXh0ZW5zaW9uKENoaWxkQ2xhc3MuY2xhc3MpOwotCi0gICAgICAgIHRoaXMucHJvY2Vzc2VkTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy5zY2hlbWFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBTZXJ2aWNlKHRoaXMuc2VydmljZUNsYXNzLCB0aGlzLmNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRoaXMuc2VydmljZS5wb3B1bGF0ZU1ldGFEYXRhKCk7Ci0gICAgICAgIHRoaXMuc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICB0aGlzLmphdmFPYmplY3RTZXJpYWxpemVyID0gbmV3IEphdmFPYmplY3RTZXJpYWxpemVyKHNlcnZpY2UuZ2V0UHJvY2Vzc2VkVHlwZU1hcCgpLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRDb25maWd1cmF0b3IoKSwKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0U2NoZW1hTWFwKCkpOwotICAgICAgICB0aGlzLnhtbFN0cmVhbVBhcnNlciA9IG5ldyBYbWxTdHJlYW1QYXJzZXIoc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldENvbmZpZ3VyYXRvcigpLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRTY2hlbWFNYXAoKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMSgpewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMSIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBDaGlsZENsYXNzIGNoaWxkQ2xhc3MgPSBuZXcgQ2hpbGRDbGFzcygpOwotICAgICAgICAgICAgY2hpbGRDbGFzcy5zZXRQYXJhbTEoInRlc3QgcGFyYW0xIik7Ci0gICAgICAgICAgICBjaGlsZENsYXNzLnNldFBhcmFtMig1KTsKLSAgICAgICAgICAgIGNoaWxkQ2xhc3Muc2V0UGFyYW0zKDIzLjQ1Zik7Ci0gICAgICAgICAgICBjaGlsZENsYXNzLnNldFBhcmFtNCgzNC41KTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQoY2hpbGRDbGFzcyk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBDaGlsZENsYXNzIG9iamVjdCA9IChDaGlsZENsYXNzKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgQ2hpbGRDbGFzcyByZXR1cm5PYmplY3QgPSAoQ2hpbGRDbGFzcykgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXRQYXJhbTEoKSwidGVzdCBwYXJhbTEiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3QuZ2V0UGFyYW0yKCksNSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGNoaWxkQ2xhc3MuZ2V0UGFyYW0zKCkgPT0gMjMuNDVmKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoY2hpbGRDbGFzcy5nZXRQYXJhbTQoKSA9PSAzNC41KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyMSgpewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMiIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBPYmplY3QoKSk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5PYmplY3QgPSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJldHVybk9iamVjdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMjIoKXsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDIiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQoZGF0ZSk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBEYXRlIG9iamVjdCA9IChEYXRlKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgRGF0ZSByZXR1cm5PYmplY3QgPSAoRGF0ZSkgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5nZXREYXRlKCksZGF0ZS5nZXREYXRlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvRXh0ZW5zaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmYyODEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL0V4dGVuc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25UZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMDEoKSB7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTAuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczEwKCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKCJUZXN0IFN0cmluZyIpOwotICAgICAgICBUZXN0Q2xhc3MxMCByZXN1bHQgPSAoVGVzdENsYXNzMTApIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCAiVGVzdCBTdHJpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTAyKCkgewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczEwLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTAgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgSW50ZWdlcig1KSk7Ci0gICAgICAgIFRlc3RDbGFzczEwIHJlc3VsdCA9IChUZXN0Q2xhc3MxMCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG5ldyBJbnRlZ2VyKDUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTAzKCkgewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczEwLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzMTAgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxMCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMihuZXcgT2JqZWN0W117InRlc3QgU3RyaW5nIiwgbmV3IEludGVnZXIoNSl9KTsKLSAgICAgICAgVGVzdENsYXNzMTAgcmVzdWx0ID0gKFRlc3RDbGFzczEwKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVswXSwgInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbMV0sIG5ldyBJbnRlZ2VyKDUpKTsKLQotICAgIH0KLQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvTWFwVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvTWFwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRmZTU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL01hcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBNYXBUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMTIxKCl7Ci0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTIuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxMiB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczEyKCk7Ci0gICAgICAgIE1hcCBwYXJhbTEgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwYXJhbTEucHV0KCJrZXkxIiwidmFsdWUxIik7Ci0gICAgICAgIHBhcmFtMS5wdXQoImtleTIiLCJ2YWx1ZTIiKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEocGFyYW0xKTsKLSAgICAgICAgVGVzdENsYXNzMTIgcmVzdWx0ID0gKFRlc3RDbGFzczEyKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuY29udGFpbnNLZXkoImtleTEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmNvbnRhaW5zS2V5KCJrZXkyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLmdldCgia2V5MSIpLCJ2YWx1ZTEiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXQoImtleTIiKSwidmFsdWUyIik7Ci0gICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxMjIoKXsKLQotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxMi5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczEyIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTIoKTsKLSAgICAgICAgSGFzaHRhYmxlIHBhcmFtMiA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgcGFyYW0yLnB1dCgia2V5MSIsInZhbHVlMSIpOwotICAgICAgICBwYXJhbTIucHV0KCJrZXkyIiwidmFsdWUyIik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKHBhcmFtMik7Ci0gICAgICAgIFRlc3RDbGFzczEyIHJlc3VsdCA9IChUZXN0Q2xhc3MxMikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMigpLmNvbnRhaW5zS2V5KCJrZXkxIikpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTIoKS5jb250YWluc0tleSgia2V5MiIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKS5nZXQoImtleTEiKSwidmFsdWUxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKCkuZ2V0KCJrZXkyIiksInZhbHVlMiIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvT01FbGVtZW50Q3JlYXRvclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL09NRWxlbWVudENyZWF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmZjMGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvT01FbGVtZW50Q3JlYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5BY3RpdmF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5PTUVsZW1lbnRDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLQotcHVibGljIGNsYXNzIE9NRWxlbWVudENyZWF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBY3RpdmF0ZU9iamVjdCgpewotICAgICAgICBBY3RpdmF0ZSBhY3RpdmF0ZSA9IG5ldyBBY3RpdmF0ZSgpOwotICAgICAgICBDYW5jZWxXb3JrZmxvd1JlcXVlc3QgY2FuY2VsV29ya2Zsb3dSZXF1ZXN0ID0gbmV3IENhbmNlbFdvcmtmbG93UmVxdWVzdCgpOwotICAgICAgICBjYW5jZWxXb3JrZmxvd1JlcXVlc3Quc2V0SVdGSUQoNSk7Ci0gICAgICAgIGNhbmNlbFdvcmtmbG93UmVxdWVzdC5zZXRSZXN0YXJ0KDEwKTsKLQotICAgICAgICBhY3RpdmF0ZS5zZXRDYW5jZWxXb3JrZmxvd1JlcXVlc3QoY2FuY2VsV29ya2Zsb3dSZXF1ZXN0KTsKLQotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotCi0gICAgICAgIGNvbmZpZ3VyYXRvci5hZGRQYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmcoIm9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0byIsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9waG9lbml4LmVzYi5pbmZyYXN0cnVjdHVyZS5iaXp0YWxrLnNjaGVtYXMuY2FuY2Vsd29ya2Zsb3dyZXF1ZXN0LyIpOwotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKEFjdGl2YXRlLmNsYXNzLCAiQWN0aXZhdGUiKTsKLSAgICAgICAgcGFyYW1ldGVyLnNldE5hbWVzcGFjZSgiaHR0cDovL3Bob2VuaXguY28uaWwvRVNCL0luZnJhc3RydWN0dXJlIik7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudENyZWF0b3Igb21FbGVtZW50Q3JlYXRvciA9IG5ldyBPTUVsZW1lbnRDcmVhdG9yKCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gb21FbGVtZW50Q3JlYXRvci5nZXRPTUVsZW1lbnQoYWN0aXZhdGUscGFyYW1ldGVyLGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9NIEVsZW1lbnQgPT0+ICIgKyBvbUVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9NRWxlbWVudENyZWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7ICAvL1RvIGNoYW5nZSBib2R5IG9mIGNhdGNoIHN0YXRlbWVudCB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gICAgICAgIH0KLSAgICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNhOTVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1JlcXVlc3RSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuU3RBWFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgcHJvdGVjdGVkIE9iamVjdCBzZXJ2aWNlT2JqZWN0OwotICAgIHByb3RlY3RlZCBDbGFzcyBzZXJ2aWNlQ2xhc3M7Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBTZXJ2aWNlKHRoaXMuc2VydmljZUNsYXNzLHRoaXMuY29uZmlndXJhdG9yKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlLmdlbmVyYXRlU2NoZW1hKCk7Ci0gICAgICAgIHRoaXMuamF2YU9iamVjdFNlcmlhbGl6ZXIgPSBuZXcgSmF2YU9iamVjdFNlcmlhbGl6ZXIoc2VydmljZS5nZXRQcm9jZXNzZWRUeXBlTWFwKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldENvbmZpZ3VyYXRvcigpLAotICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZS5nZXRTY2hlbWFNYXAoKSk7Ci0gICAgICAgIHRoaXMueG1sU3RyZWFtUGFyc2VyID0gbmV3IFhtbFN0cmVhbVBhcnNlcihzZXJ2aWNlLmdldFByb2Nlc3NlZFR5cGVNYXAoKSwKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0Q29uZmlndXJhdG9yKCksCi0gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldFNjaGVtYU1hcCgpKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXRJbnB1dE9iamVjdChMaXN0IGlucHV0T2JqZWN0cywgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotICAgICAgICAgIFN0cmluZ1dyaXRlciBpbnB1dFN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgaW5wdXRYbWxTdHJlYW1Xcml0ZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKGlucHV0U3RyaW5nV3JpdGVyKTsKLSAgICAgICAgICB0aGlzLmphdmFPYmplY3RTZXJpYWxpemVyLnNlcmlhbGl6ZUlucHV0RWxlbWVudChpbnB1dE9iamVjdHMudG9BcnJheSgpLAotICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldElucHV0RWxlbWVudCgpLAotICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmdldElucHV0UGFyYW1ldGVycygpLAotICAgICAgICAgICAgICAgICAgaW5wdXRYbWxTdHJlYW1Xcml0ZXIpOwotICAgICAgICAgIGlucHV0WG1sU3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgU3RyaW5nIGlucHV0WG1sU3RyaW5nID0gaW5wdXRTdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaW5wdXQgWG1sIFN0cmluZyA9PT4gIiArIGlucHV0WG1sU3RyaW5nKTsKLQotICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxSZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dFhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IHRoaXMueG1sU3RyZWFtUGFyc2VyLmdldElucHV0UGFyYW1ldGVycyh4bWxSZWFkZXIsIG9wZXJhdGlvbik7Ci0gICAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0UmV0dXJuT2JqZWN0KE9iamVjdCByZXR1cm5PYmplY3QsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uLCBYbWxQYXJzaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIHJlc3BvbnNlIHhtbCBzZXJpYWxpemVyCi0gICAgICAgICAgU3RyaW5nV3JpdGVyIG91dHB1dFN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgb3V0cHV0WE1MU3RyaW5nV3JpdGVyID0gU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXRwdXRTdHJpbmdXcml0ZXIpOwotCi0gICAgICAgICAgdGhpcy5qYXZhT2JqZWN0U2VyaWFsaXplci5zZXJpYWxpemVPdXRwdXRFbGVtZW50KHJldHVybk9iamVjdCwKLSAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5nZXRPdXRQdXRFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0T3V0cHV0UGFyYW1ldGVyKCksCi0gICAgICAgICAgICAgICAgICBvdXRwdXRYTUxTdHJpbmdXcml0ZXIpOwotICAgICAgICAgIG91dHB1dFhNTFN0cmluZ1dyaXRlci5mbHVzaCgpOwotICAgICAgICAgIFN0cmluZyBvdXRwdXRYbWxTdHJpbmcgPSBvdXRwdXRTdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIm91dHB1dCBYbWwgU3RyaW5nID09PiAiICsgb3V0cHV0WG1sU3RyaW5nKTsKLQotICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciBvdXRwdXRYbWxSZWFkZXIgPQotICAgICAgICAgICAgICAgICAgU3RBWFV0aWxzLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0WG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLQotICAgICAgICAgIHJldHVybiB0aGlzLnhtbFN0cmVhbVBhcnNlci5nZXRPdXRwdXRPYmplY3Qob3V0cHV0WG1sUmVhZGVyLCBvcGVyYXRpb24pOwotICAgICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NhbWVQYXJhbU5hbWVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TYW1lUGFyYW1OYW1lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYzNGM2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NhbWVQYXJhbU5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0Q2xhc3MxNDsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczE1Ow0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsNCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczk7DQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLlBhcmFtZXRlcjsNCi0NCi1wdWJsaWMgY2xhc3MgU2FtZVBhcmFtTmFtZVRlc3QgZXh0ZW5kcyBEYXRhQmluZFRlc3Qgew0KLQ0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudEFycmF5KCkgew0KLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMTQuY2xhc3M7DQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsNCi0gICAgICAgIFRlc3RDbGFzczE0IHRlc3RPYmplY3QgPSBudWxsOw0KLSAgICAgICAgVGVzdENsYXNzMTQgcmVzdWx0ID0gbnVsbDsNCi0NCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTQoKTsNCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICBhc3NlcnROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7DQotDQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczE0KCk7DQotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgVGVzdENsYXNzOSgpKTsNCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7DQotDQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczE0KCk7DQotICAgICAgICBUZXN0Q2xhc3MyW10gdGVzdENsYXNzMkFycmF5ID0gbmV3IFRlc3RDbGFzczJbMl07DQotDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMF0gPSBuZXcgVGVzdENsYXNzMigpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMSg1KTsgICANCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVswXS5zZXRQYXJhbTIoKGZsb2F0KSA2LjEpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMyg3LjIpOw0KLSAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzFdID0gbmV3IFRlc3RDbGFzczIoKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTEoMSk7ICAgDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMV0uc2V0UGFyYW0yKChmbG9hdCkgMi4xKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTMoMy4yKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsYXNzOSB0ZXN0Q2xhc3M5T2JqZWN0ID0gbmV3IFRlc3RDbGFzczkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzOU9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzMkFycmF5KTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzOU9iamVjdCk7DQotICAgICAgICANCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICANCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMSgpID09IDUpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0yKCkgPT0gNi4xZik7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTMoKSA9PSA3LjIpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTEoKSA9PSAxKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMigpID09IDIuMWYpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMV0uZ2V0UGFyYW0zKCkgPT0gMy4yKTsNCi0gICAgICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudEVsZW1lbnQoKSB7DQotICAgIAlDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MxNS5jbGFzczsNCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOw0KLSAgICAgICAgVGVzdENsYXNzMTUgdGVzdE9iamVjdCA9IG51bGw7DQotICAgICAgICBUZXN0Q2xhc3MxNSByZXN1bHQgPSBudWxsOw0KLQ0KLSAgICAgICAgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MxNSgpOw0KLSAgICAgICAgcmVzdWx0ID0gKFRlc3RDbGFzczE1KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsNCi0gICAgICAgIGFzc2VydE51bGwocmVzdWx0LmdldFBhcmFtMSgpKTsNCi0NCi0gICAgICAgIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMTUoKTsNCi0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKG5ldyBUZXN0Q2xhc3MxNCgpKTsNCi0gICAgICAgIHJlc3VsdCA9IChUZXN0Q2xhc3MxNSkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7DQotICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRQYXJhbTEoKSk7DQotDQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczE1KCk7DQotICAgICAgICBUZXN0Q2xhc3MyW10gdGVzdENsYXNzMkFycmF5ID0gbmV3IFRlc3RDbGFzczJbMl07DQotDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMF0gPSBuZXcgVGVzdENsYXNzMigpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMSg1KTsgICANCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVswXS5zZXRQYXJhbTIoKGZsb2F0KSA2LjEpOw0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzBdLnNldFBhcmFtMyg3LjIpOw0KLSAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzMkFycmF5WzFdID0gbmV3IFRlc3RDbGFzczIoKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTEoMSk7ICAgDQotICAgICAgICB0ZXN0Q2xhc3MyQXJyYXlbMV0uc2V0UGFyYW0yKChmbG9hdCkgMi4xKTsNCi0gICAgICAgIHRlc3RDbGFzczJBcnJheVsxXS5zZXRQYXJhbTMoMy4yKTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsYXNzOSB0ZXN0Q2xhc3M5T2JqZWN0ID0gbmV3IFRlc3RDbGFzczkoKTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdENsYXNzOU9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzMkFycmF5KTsNCi0gICAgICAgIA0KLSAgICAgICAgVGVzdENsYXNzMTQgdGVzdENsYXNzMTRPYmplY3QgPSBuZXcgVGVzdENsYXNzMTQoKTsNCi0gICAgICAgIHRlc3RDbGFzczE0T2JqZWN0LnNldFBhcmFtMSh0ZXN0Q2xhc3M5T2JqZWN0KTsNCi0gICAgICAgIA0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEodGVzdENsYXNzMTRPYmplY3QpOw0KLSAgICAgICAgDQotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzMTUpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOw0KLSAgICAgICAgDQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVswXS5nZXRQYXJhbTEoKSA9PSA1KTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzBdLmdldFBhcmFtMigpID09IDYuMWYpOw0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMF0uZ2V0UGFyYW0zKCkgPT0gNy4yKTsNCi0gICAgICAgIA0KLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKCkuZ2V0UGFyYW0xKClbMV0uZ2V0UGFyYW0xKCkgPT0gMSk7DQotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKS5nZXRQYXJhbTEoKVsxXS5nZXRQYXJhbTIoKSA9PSAyLjFmKTsNCi0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMSgpLmdldFBhcmFtMSgpLmdldFBhcmFtMSgpWzFdLmdldFBhcmFtMygpID09IDMuMik7DQotICAgICAgICANCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVBcnJheXNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9TaW1wbGVBcnJheXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTBlZWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlQXJyYXlzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzNDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzODsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5QYXJhbWV0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnJheXNUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczQxKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M0LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzNCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczQoKTsKLSAgICAgICAgVGVzdENsYXNzNCByZXN1bHQgPSAoVGVzdENsYXNzNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzNDIoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczQuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M0IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMShuZXcgaW50W117MiwgM30pOwotICAgICAgICBUZXN0Q2xhc3M0IHJlc3VsdCA9IChUZXN0Q2xhc3M0KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVswXSwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKClbMV0sIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzNDMoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczQuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M0IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzNCgpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMihuZXcgSW50ZWdlcltde25ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigzKSwgbnVsbCwgbmV3IEludGVnZXIoNCl9KTsKLSAgICAgICAgVGVzdENsYXNzNCByZXN1bHQgPSAoVGVzdENsYXNzNCkgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMigpWzBdLCBuZXcgSW50ZWdlcigyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbMV0sIG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsyXSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbM10sIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW00KCksIG51bGwpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsYXNzNDMyKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M4LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzOCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczgoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IEludGVnZXJbXXtudWxsLCBudWxsfSk7Ci0gICAgICAgIFRlc3RDbGFzczggcmVzdWx0ID0gKFRlc3RDbGFzczgpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwgbnVsbCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M0MzMoKSB7Ci0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczguY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3M4IHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzOCgpOwotICAgICAgICBUZXN0Q2xhc3M4IHJlc3VsdCA9IChUZXN0Q2xhc3M4KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKCksIG51bGwpOwotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M0NCgpIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzNC5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczQgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3M0KCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKG5ldyBTdHJpbmdbXXsidGVzdCBTdHJpbmcxIiwgbnVsbCxudWxsLCAidGVzdCBTdHJpbmcyIn0pOwotICAgICAgICBUZXN0Q2xhc3M0IHJlc3VsdCA9IChUZXN0Q2xhc3M0KSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpWzBdLCAidGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKClbMV0sIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpWzJdLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTMoKVszXSwgInRlc3QgU3RyaW5nMiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNCgpLCBudWxsKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzczQ1KCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3M0LmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbTEiKTsKLSAgICAgICAgVGVzdENsYXNzNCB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczQoKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTQobmV3IGZsb2F0W117MzQuNWYsIDQ0LjVmfSk7Ci0gICAgICAgIFRlc3RDbGFzczQgcmVzdWx0ID0gKFRlc3RDbGFzczQpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKCksIG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTQoKVswXSA9PSAzNC41KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW00KClbMV0gPT0gNDQuNSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3M0NigpIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzNC5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczQgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3M0KCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKG5ldyBpbnRbXXsyLCAzfSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0yKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoMiksIG5ldyBJbnRlZ2VyKDMpfSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKG5ldyBTdHJpbmdbXXsidGVzdCBTdHJpbmcxIiwgInRlc3QgU3RyaW5nMiJ9KTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTQobmV3IGZsb2F0W117MzQuNWYsIDQ0LjVmfSk7Ci0gICAgICAgIFRlc3RDbGFzczQgcmVzdWx0ID0gKFRlc3RDbGFzczQpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpWzBdLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTEoKVsxXSwgMyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0yKClbMF0sIG5ldyBJbnRlZ2VyKDIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKVsxXSwgbmV3IEludGVnZXIoMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMygpWzBdLCAidGVzdCBTdHJpbmcxIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKClbMV0sICJ0ZXN0IFN0cmluZzIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW00KClbMF0gPT0gMzQuNSk7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtNCgpWzFdID09IDQ0LjUpOwotCi0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NpbXBsZURhdGFCaW5kVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlRGF0YUJpbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZTFhNTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlRGF0YUJpbmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlRlc3RDbGFzczM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuUGFyYW1ldGVyOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGF0YUJpbmRUZXN0IGV4dGVuZHMgRGF0YUJpbmRUZXN0IHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MxKCkgewotCi0gICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IFRlc3RDbGFzczEuY2xhc3M7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKHRlc3RDbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBUZXN0Q2xhc3MxIHRlc3RPYmplY3QgPSBuZXcgVGVzdENsYXNzMSgpOwotICAgICAgICBUZXN0Q2xhc3MxIHJlc3VsdCA9IChUZXN0Q2xhc3MxKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCB0ZXN0T2JqZWN0KTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0SW50KCkgewotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKGludC5jbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IChJbnRlZ2VyKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCBuZXcgSW50ZWdlcigzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIG5ldyBJbnRlZ2VyKDMpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0U3RyaW5nKCkgewotCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgUGFyYW1ldGVyKFN0cmluZy5jbGFzcywgIlBhcmFtMSIpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgInRlc3QgU3RyaW5nIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsICJ0ZXN0IFN0cmluZyIpOwotICAgICAgICByZXN1bHQgPSAoU3RyaW5nKSBnZXRSZXR1cm5PYmplY3QocGFyYW1ldGVyLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgbnVsbCk7Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3MyKCkgewotICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBUZXN0Q2xhc3MyLmNsYXNzOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcih0ZXN0Q2xhc3MsICJQYXJhbWV0ZXIxIik7Ci0gICAgICAgIFRlc3RDbGFzczIgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0xKDMpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMigzLjQ1Zik7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW0zKDQuNTY3OCk7Ci0KLSAgICAgICAgVGVzdENsYXNzMiByZXN1bHQgPSAoVGVzdENsYXNzMikgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIDMpOwotICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5nZXRQYXJhbTIoKSA9PSAzLjQ1Zik7Ci0gICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtMygpID09IDQuNTY3OCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdENsYXNzMygpIHsKLSAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gVGVzdENsYXNzMy5jbGFzczsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IG5ldyBQYXJhbWV0ZXIodGVzdENsYXNzLCAiUGFyYW0xIik7Ci0gICAgICAgIFRlc3RDbGFzczMgdGVzdE9iamVjdCA9IG5ldyBUZXN0Q2xhc3MzKCk7Ci0KLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTEobmV3IEludGVnZXIoMykpOwotICAgICAgICB0ZXN0T2JqZWN0LnNldFBhcmFtMihuZXcgRmxvYXQoMzQuNWYpKTsKLSAgICAgICAgdGVzdE9iamVjdC5zZXRQYXJhbTMobmV3IERvdWJsZSgyMy40KSk7Ci0gICAgICAgIHRlc3RPYmplY3Quc2V0UGFyYW00KCJ0ZXN0IFN0cmluZyIpOwotCi0gICAgICAgIFRlc3RDbGFzczMgcmVzdWx0OwotICAgICAgICByZXN1bHQgPSAoVGVzdENsYXNzMykgZ2V0UmV0dXJuT2JqZWN0KHBhcmFtZXRlciwgdGVzdE9iamVjdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0xKCksIG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbmV3IEZsb2F0KDM0LjVmKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKCksIG5ldyBEb3VibGUoMjMuNCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNCgpLCAidGVzdCBTdHJpbmciKTsKLQotICAgICAgICB0ZXN0T2JqZWN0ID0gbmV3IFRlc3RDbGFzczMoKTsKLSAgICAgICAgcmVzdWx0ID0gKFRlc3RDbGFzczMpIGdldFJldHVybk9iamVjdChwYXJhbWV0ZXIsIHRlc3RPYmplY3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtMSgpLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbTIoKSwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW0zKCksIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtNCgpLCBudWxsKTsKLQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvU2ltcGxlUmVxdWVzdFJlc3BvbnNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTgwMGFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL1NpbXBsZVJlcXVlc3RSZXNwb25zZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuc2VydmljZS5TZXJ2aWNlMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5PcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXF1ZXN0UmVzcG9uc2VUZXN0IGV4dGVuZHMgUmVxdWVzdFJlc3BvbnNlVGVzdCB7Ci0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICB0aGlzLnNlcnZpY2VDbGFzcyA9IFNlcnZpY2UxLmNsYXNzOwotICAgICAgIHRoaXMuc2VydmljZU9iamVjdCA9IG5ldyBTZXJ2aWNlMSgpOwotICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDEoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDEiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXR1cm5PYmplY3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDIoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDIiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaW5wdXRPYmplY3RzLmFkZChuZXcgSW50ZWdlcigzKSk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBJbnRlZ2VyIG9iamVjdCA9IChJbnRlZ2VyKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgSW50ZWdlciByZXR1cm5PYmplY3QgPSAoSW50ZWdlcikgZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdC5pbnRWYWx1ZSgpLCAzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kMyIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG51bGwpOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBPYmplY3QgcmV0dXJuT2JqZWN0ID0gZ2V0UmV0dXJuT2JqZWN0KG9iamVjdCwgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXR1cm5PYmplY3QpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDMyKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjcmVhdGUgc2VydmljZSBkYXRhCi0KLSAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0T3BlcmF0aW9uKCJtZXRob2QzIik7Ci0gICAgICAgICAgICAvLyBnZXQgb2JqZWN0cyBhZnRlciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi0gICAgICAgICAgICAvLyB0aGlzIHJldHVybmVkIG9iamVjdHMgbXVzdGJlIGlkZW50aWNhbCB3aXRoIHRoZSBvcmlnaW5hbCBhcnJheSBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAgICBMaXN0IGlucHV0T2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQoInRlc3QgU3RyaW5nIik7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBTdHJpbmcgb2JqZWN0ID0gKFN0cmluZykgb3BlcmF0aW9uLmdldEphdmFNZXRob2QoKS5pbnZva2UodGhpcy5zZXJ2aWNlT2JqZWN0LCBvYmplY3RzKTsKLSAgICAgICAgICAgIFN0cmluZyByZXR1cm5PYmplY3QgPSAoU3RyaW5nKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0LCAidGVzdCBTdHJpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDQiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaW5wdXRPYmplY3RzLmFkZChuZXcgaW50W117MiwgMywgNX0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgaW50W10gb2JqZWN0ID0gKGludFtdKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgaW50W10gcmV0dXJuT2JqZWN0ID0gKGludFtdKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzBdLCAyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbMV0sIDMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsyXSwgNSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kNDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCBjcmVhdGUgc2VydmljZSBkYXRhCi0KLSAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSB0aGlzLnNlcnZpY2UuZ2V0T3BlcmF0aW9uKCJtZXRob2Q0Iik7Ci0gICAgICAgICAgICAvLyBnZXQgb2JqZWN0cyBhZnRlciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24uCi0gICAgICAgICAgICAvLyB0aGlzIHJldHVybmVkIG9iamVjdHMgbXVzdGJlIGlkZW50aWNhbCB3aXRoIHRoZSBvcmlnaW5hbCBhcnJheSBsaXN0IGVsZW1lbnRzCi0gICAgICAgICAgICBMaXN0IGlucHV0T2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGlucHV0T2JqZWN0cy5hZGQobnVsbCk7Ci0gICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZ2V0SW5wdXRPYmplY3QoaW5wdXRPYmplY3RzLCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBpbnRbXSBvYmplY3QgPSAoaW50W10pIG9wZXJhdGlvbi5nZXRKYXZhTWV0aG9kKCkuaW52b2tlKHRoaXMuc2VydmljZU9iamVjdCwgb2JqZWN0cyk7Ci0gICAgICAgICAgICBpbnRbXSByZXR1cm5PYmplY3QgPSAoaW50W10pIGdldFJldHVybk9iamVjdChvYmplY3QsIG9wZXJhdGlvbik7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwocmV0dXJuT2JqZWN0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q1MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGZpcnN0IGNyZWF0ZSBzZXJ2aWNlIGRhdGEKLQotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRoaXMuc2VydmljZS5nZXRPcGVyYXRpb24oIm1ldGhvZDUiKTsKLSAgICAgICAgICAgIC8vIGdldCBvYmplY3RzIGFmdGVyIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KLSAgICAgICAgICAgIC8vIHRoaXMgcmV0dXJuZWQgb2JqZWN0cyBtdXN0YmUgaWRlbnRpY2FsIHdpdGggdGhlIG9yaWdpbmFsIGFycmF5IGxpc3QgZWxlbWVudHMKLSAgICAgICAgICAgIExpc3QgaW5wdXRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgaW5wdXRPYmplY3RzLmFkZChuZXcgU3RyaW5nW117InN0cmluZzEiLCAic3RyaW5nMiIsICJzdHJpbmczIn0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gb2JqZWN0ID0gKFN0cmluZ1tdKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gKFN0cmluZ1tdKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzBdLCAic3RyaW5nMSIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybk9iamVjdFsxXSwgInN0cmluZzIiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbMl0sICJzdHJpbmczIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDUyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZmlyc3QgY3JlYXRlIHNlcnZpY2UgZGF0YQotCi0gICAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gdGhpcy5zZXJ2aWNlLmdldE9wZXJhdGlvbigibWV0aG9kNSIpOwotICAgICAgICAgICAgLy8gZ2V0IG9iamVjdHMgYWZ0ZXIgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgICAgICAgICAgLy8gdGhpcyByZXR1cm5lZCBvYmplY3RzIG11c3RiZSBpZGVudGljYWwgd2l0aCB0aGUgb3JpZ2luYWwgYXJyYXkgbGlzdCBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBpbnB1dE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpbnB1dE9iamVjdHMuYWRkKG5ldyBTdHJpbmdbXXtudWxsLCAic3RyaW5nMiIsIG51bGwsICJzdHJpbmc0In0pOwotICAgICAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IGdldElucHV0T2JqZWN0KGlucHV0T2JqZWN0cywgb3BlcmF0aW9uKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gb2JqZWN0ID0gKFN0cmluZ1tdKSBvcGVyYXRpb24uZ2V0SmF2YU1ldGhvZCgpLmludm9rZSh0aGlzLnNlcnZpY2VPYmplY3QsIG9iamVjdHMpOwotICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuT2JqZWN0ID0gKFN0cmluZ1tdKSBnZXRSZXR1cm5PYmplY3Qob2JqZWN0LCBvcGVyYXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzBdLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbMV0sICJzdHJpbmcyIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuT2JqZWN0WzJdLCBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXR1cm5PYmplY3RbM10sICJzdHJpbmc0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQWN0aXZhdGUuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9BY3RpdmF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODUzYzU4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9BY3RpdmF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIEFjdGl2YXRlIHsKLQotICAgIHByaXZhdGUgQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0IENhbmNlbFdvcmtmbG93UmVxdWVzdDsKLQotICAgIHB1YmxpYyBDYW5jZWxXb3JrZmxvd1JlcXVlc3QgZ2V0Q2FuY2VsV29ya2Zsb3dSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbFdvcmtmbG93UmVxdWVzdChDYW5jZWxXb3JrZmxvd1JlcXVlc3QgY2FuY2VsV29ya2Zsb3dSZXF1ZXN0KSB7Ci0gICAgICAgIENhbmNlbFdvcmtmbG93UmVxdWVzdCA9IGNhbmNlbFdvcmtmbG93UmVxdWVzdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YzY5YTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL0NhbmNlbFdvcmtmbG93UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIENhbmNlbFdvcmtmbG93UmVxdWVzdCB7Ci0KLSAgICBwcml2YXRlIGludCBJV0ZJRDsKLSAgICBwcml2YXRlIGludCBSZXN0YXJ0OwotCi0gICAgcHVibGljIGludCBnZXRJV0ZJRCgpIHsKLSAgICAgICAgcmV0dXJuIElXRklEOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElXRklEKGludCBJV0ZJRCkgewotICAgICAgICB0aGlzLklXRklEID0gSVdGSUQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSZXN0YXJ0KCkgewotICAgICAgICByZXR1cm4gUmVzdGFydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXN0YXJ0KGludCByZXN0YXJ0KSB7Ci0gICAgICAgIFJlc3RhcnQgPSByZXN0YXJ0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9DaGlsZENsYXNzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vQ2hpbGRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTk3YjViLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9DaGlsZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ2hpbGRDbGFzcyBleHRlbmRzIFBhcmVudENsYXNzewotCi0gICAgcHJpdmF0ZSBmbG9hdCBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBkb3VibGUgcGFyYW00OwotCi0gICAgcHVibGljIGZsb2F0IGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoZmxvYXQgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBkb3VibGUgZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChkb3VibGUgcGFyYW00KSB7Ci0gICAgICAgIHRoaXMucGFyYW00ID0gcGFyYW00OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9QYXJlbnRDbGFzcy5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1BhcmVudENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxY2M3ZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1BhcmVudENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgUGFyZW50Q2xhc3MgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW0xOwotICAgIHByaXZhdGUgaW50IHBhcmFtMjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0yKCkgewotICAgICAgICByZXR1cm4gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMihpbnQgcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzVlZDJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTAuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWRhYWE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczEwIHsKLQotICAgIHByaXZhdGUgT2JqZWN0IHBhcmFtMTsKLSAgICBwcml2YXRlIE9iamVjdFtdIHBhcmFtMjsKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShPYmplY3QgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKE9iamVjdFtdIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTEuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc1ODg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczExIHsKLQotICAgIHByaXZhdGUgTGlzdCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcGFyYW0yOwotICAgIHByaXZhdGUgU2V0IHBhcmFtMzsKLQotICAgIHB1YmxpYyBMaXN0IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoTGlzdCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKEFycmF5TGlzdCBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKFNldCBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczEyLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxN2ZkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxMiB7Ci0KLSAgICBwcml2YXRlIE1hcCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgcGFyYW0yOwotCi0gICAgcHVibGljIE1hcCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKE1hcCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIEhhc2h0YWJsZSBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKEhhc2h0YWJsZSBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTMuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWMwN2YyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczEzIHsKLQotICAgIHByaXZhdGUgVGVzdFJlc3RyaWN0aW9uQmVhbiBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBUZXN0UmVzdHJpY3Rpb25CZWFuW10gcGFyYW0yOwotCi0gICAgcHVibGljIFRlc3RSZXN0cmljdGlvbkJlYW4gZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShUZXN0UmVzdHJpY3Rpb25CZWFuIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFJlc3RyaWN0aW9uQmVhbltdIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoVGVzdFJlc3RyaWN0aW9uQmVhbltdIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMTQuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc0NGUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3MxNCB7DQotICAgIA0KLSAgICBwcml2YXRlIFRlc3RDbGFzczkgcGFyYW0xOw0KLQ0KLSAgICBwdWJsaWMgVGVzdENsYXNzOSBnZXRQYXJhbTEoKSB7DQotICAgICAgICByZXR1cm4gcGFyYW0xOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShUZXN0Q2xhc3M5IHBhcmFtMSkgew0KLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7DQotICAgIH0gICAgDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MxNS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzI2NTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87DQotDQotcHVibGljIGNsYXNzIFRlc3RDbGFzczE1IHsNCi0gICAgDQotICAgIHByaXZhdGUgVGVzdENsYXNzMTQgcGFyYW0xOw0KLQ0KLSAgICBwdWJsaWMgVGVzdENsYXNzMTQgZ2V0UGFyYW0xKCkgew0KLSAgICAgICAgcmV0dXJuIHBhcmFtMTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoVGVzdENsYXNzMTQgcGFyYW0xKSB7DQotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsNCi0gICAgfSAgICANCi19DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczIuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwY2E1NGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOwotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgcGFyYW0xOwotICAgIHByaXZhdGUgZmxvYXQgcGFyYW0yOwotICAgIHByaXZhdGUgZG91YmxlIHBhcmFtMzsKLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShpbnQgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKGZsb2F0IHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoZG91YmxlIHBhcmFtMykgewotICAgICAgICB0aGlzLnBhcmFtMyA9IHBhcmFtMzsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMy5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkYzM2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczMgewotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmFtMTsKLSAgICBwcml2YXRlIEZsb2F0IHBhcmFtMjsKLSAgICBwcml2YXRlIERvdWJsZSBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW00OwotCi0gICAgcHVibGljIEludGVnZXIgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShJbnRlZ2VyIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxvYXQgZ2V0UGFyYW0yKCkgewotICAgICAgICByZXR1cm4gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMihGbG9hdCBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKERvdWJsZSBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW00KFN0cmluZyBwYXJhbTQpIHsKLSAgICAgICAgdGhpcy5wYXJhbTQgPSBwYXJhbTQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczQuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzlmODguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvOwotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzNCB7Ci0KLSAgICBwcml2YXRlIGludFtdIHBhcmFtMTsKLSAgICBwcml2YXRlIEludGVnZXJbXSBwYXJhbTI7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIHBhcmFtNDsKLQotICAgIHB1YmxpYyBpbnRbXSBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludFtdIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlcltdIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoSW50ZWdlcltdIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW0zKCkgewotICAgICAgICByZXR1cm4gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMyhTdHJpbmdbXSBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0W10gZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChmbG9hdFtdIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RDbGFzczUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNGQ1ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2xhc3M1IHsKLQotICAgIHByaXZhdGUgVGVzdENsYXNzMSBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMSBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKFRlc3RDbGFzczEgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M2LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDEzNGZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzNiB7Ci0KLSAgICBwcml2YXRlIFRlc3RDbGFzczIgcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMjsKLSAgICBwcml2YXRlIGludCBwYXJhbTM7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMiBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKFRlc3RDbGFzczIgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0yKCkgewotICAgICAgICByZXR1cm4gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMihTdHJpbmcgcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGFyYW0zKCkgewotICAgICAgICByZXR1cm4gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMyhpbnQgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M3LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTFlYWQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczcgewotCi0gICAgcHJpdmF0ZSBUZXN0Q2xhc3M0W10gcGFyYW0xOwotICAgIHByaXZhdGUgVGVzdENsYXNzMyBwYXJhbTI7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzNFtdIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoVGVzdENsYXNzNFtdIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFRlc3RDbGFzczMgcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M4LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQxZjY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczggewotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyW10gcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nW10gcGFyYW0yOwotCi0gICAgcHVibGljIEludGVnZXJbXSBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKEludGVnZXJbXSBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoU3RyaW5nW10gcGFyYW0yKSB7Ci0gICAgICAgIHRoaXMucGFyYW0yID0gcGFyYW0yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M5LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdENsYXNzOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWIzMWE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL2R0by9UZXN0Q2xhc3M5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzOSB7Ci0KLSAgICBwcml2YXRlIFRlc3RDbGFzczJbXSBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMltdIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoVGVzdENsYXNzMltdIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvZHRvL1Rlc3RSZXN0cmljdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1Njg3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5BYnN0cmFjdFJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnR5cGUuVGVzdFJlc3RyaWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25CZWFuIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMTsKLQotICAgIHB1YmxpYyBUZXN0UmVzdHJpY3Rpb25CZWFuKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFPYmplY3RTZXJpYWxpemVyIHNlcmlhbGl6ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHBhcmVudFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lc3BhY2VQcmVmaXggbmFtZXNwYWNlUHJlZml4KQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gewotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCh3cml0ZXIsIHBhcmVudFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBwYXJlbnRRTmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwYXJhbTEpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbGFzcyBnZXRCZWFuQ2xhc3MoKXsKLSAgICAgICAgcmV0dXJuIFRlc3RSZXN0cmljdGlvblR5cGUuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgcGFyc2UoWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYbWxTdHJlYW1QYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sUGFyc2luZ0V4Y2VwdGlvbiB7Ci0KLSAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgIFRlc3RSZXN0cmljdGlvbkJlYW4gdGVzdFJlc3RyaWN0aW9uQmVhbiA9IG5ldyBUZXN0UmVzdHJpY3Rpb25CZWFuKHJlYWRlci5nZXRUZXh0KCkpOwotICAgICAgIHdoaWxlIChyZWFkZXIuaXNFbmRFbGVtZW50KCkpewotICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgIH0KLSAgICAgICByZXR1cm4gdGVzdFJlc3RyaWN0aW9uQmVhbjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTEuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxOTY2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnNlcnZpY2U7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIHsKLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWV0aG9kMSBpbnZva2VkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2QyKGludCBwYXJhbTEpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgaW50ID09PiAiICsgcGFyYW0xKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDMoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCBTdHJpbmcgPT0+ICIgKyBwYXJhbTEpOwotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBtZXRob2Q0KGludFtdIHBhcmFtMSkgewotICAgICAgICBpZiAocGFyYW0xICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGludCA9PT4gIiArIHBhcmFtMS5sZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgYSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBtZXRob2Q1KFN0cmluZ1tdIHBhcmFtMSkgewotICAgICAgICBpZiAocGFyYW0xICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IFN0cmluZyA9PT4gIiArIHBhcmFtMS5sZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgYSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTIuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3NlcnZpY2UvU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzZDAyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5kdG8uVGVzdENsYXNzMjsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZTIgewotCi0gICAgcHVibGljIFRlc3RDbGFzczEgbWV0aG9kMShUZXN0Q2xhc3MxIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDbGFzczFbXSBtZXRob2QyKFRlc3RDbGFzczFbXSBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MyIG1ldGhvZDMoVGVzdENsYXNzMiBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MyW10gbWV0aG9kNChUZXN0Q2xhc3MyW10gcGFyYW0xKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC9zZXJ2aWNlL1NlcnZpY2UzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNThmMmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvc2VydmljZS9TZXJ2aWNlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuZHRvLlBhcmVudENsYXNzOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMyB7Ci0KLSAgICBwdWJsaWMgUGFyZW50Q2xhc3MgbWV0aG9kMShQYXJlbnRDbGFzcyBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kMihPYmplY3QgcGFyYW0xKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9kYXRhYmluZC90eXBlL1Rlc3RSZXN0cmljdGlvblR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3R5cGUvVGVzdFJlc3RyaWN0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkzZDQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3R5cGUvVGVzdFJlc3RyaWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC50eXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0UmVzdHJpY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS50eXBlLnhtbC5TaW1wbGVSZXN0cmljdGlvblhtbFR5cGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RSZXN0cmljdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gVGVzdFJlc3RyaWN0aW9uQmVhbi5jbGFzczsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pL3NpbXBsZXR5cGVzIjsKLSAgICAgICAgdGhpcy5uYW1lID0gInNpbXBsZVJlc3RyaWN0aW9uIjsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlU2NoZW1hKENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHNjaGVtYU1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFNpbXBsZVJlc3RyaWN0aW9uWG1sVHlwZSgpOwotICAgICAgICB0aGlzLnhtbFR5cGUuc2V0UW5hbWUobmV3IFFOYW1lKHRoaXMubmFtZXNwYWNlLCB0aGlzLm5hbWUpKTsKLSAgICAgICAgLy8gYWRkIHRoaXMgdG8gdGhlIHNjaGVtYSBtYXAKLSAgICAgICAgLy8gZ2V0IHRoZSBzY2hlbWEgdG8gYWRkIHRoZSBjb21wbGV4IHR5cGUKLSAgICAgICAgcmVnaXN0ZXJYbWxUeXBlKHNjaGVtYU1hcCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3R5cGUvVGVzdFJlc3RyaWN0aW9uWG1sVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzhlZTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLnR5cGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuQWJzdHJhY3RYbWxUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25YbWxUeXBlIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlIHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIHNpbXBsZSB0eXBlIEVsZW1lbnQgaGVyZQotICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJzaW1wbGVUeXBlIik7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgdGhpcy5xbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgRWxlbWVudCByZXN0cmljdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJyZXN0cmljdGlvbiIpOwotICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHJlc3RyaWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoImJhc2UiLCB4c2RQcmVmaXggKyAiOnN0cmluZyIpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHJlc3RyaWN0aW9uRWxlbWVudCk7Ci0KLSAgICAgICAgRWxlbWVudCBlbnVtZXJhdGlvbkVsZW1lbnQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgZW51bWVyYXRpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAiZW51bWVyYXRpb24iKTsKLSAgICAgICAgICAgIGVudW1lcmF0aW9uRWxlbWVudC5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgICAgIGVudW1lcmF0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgInRlc3RWYWx1ZSIgKyBpKTsKLSAgICAgICAgICAgIHJlc3RyaWN0aW9uRWxlbWVudC5hcHBlbmRDaGlsZChlbnVtZXJhdGlvbkVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdXRpbC9DdXN0b21TaW1wbGVUeXBlSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvZGF0YWJpbmQvdXRpbC9DdXN0b21TaW1wbGVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZkYWJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL2RhdGFiaW5kL3V0aWwvQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlNpbXBsZVR5cGVIYW5kbGVyOwotCi1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBjbGFzcyBDdXN0b21TaW1wbGVUeXBlSGFuZGxlciBleHRlbmRzIFNpbXBsZVR5cGVIYW5kbGVyIHsKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhEYXRlIHZhbHVlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29udmVydGluZyBkYXRlID09PiAiICsgdmFsdWUpOwotICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNpbXBsZURhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZFoiKTsKLSAgICAgICAgcmV0dXJuIHNpbXBsZURhdGVGb3JtYXQuZm9ybWF0KHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9CYXNpY1NlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9CYXNpY1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWMwMWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQmFzaWNTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5CYXNpY1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkud3NkbC5XU0RMMTFEZWZpbml0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEJhc2ljU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UG9wdWxhdGVNZXRhRGF0YSgpewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoQmFzaWNTZXJ2aWNlLmNsYXNzLGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVNjaGVtYSgpewotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShCYXNpY1NlcnZpY2UuY2xhc3MsY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVsZGVyID0gbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKGRlZmluaXRpb24sbnVsbCxudWxsKTsKLSAgICAgICAgICAgIGJ1bGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMRGVmaW5pdGlvbk9iamVjdHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPQotICAgICAgICAgICAgICAgICAgICBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1BvcHVsYXRlZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSAoU2NoZW1hKSBleHRlbnNpb25SZWdpc3RyeS5jcmVhdGVFeHRlbnNpb24oVHlwZXMuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCJzY2hlbWEiKSk7Ci0gICAgICAgICAgICBzY2hlbWEuc2V0RG9jdW1lbnRCYXNlVVJJKCJ1cm46dGVzdCIpOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsInNjaGVtYSIpOwotICAgICAgICAgICAgZWxlbWVudC5zZXRQcmVmaXgoInRzdCIpOwotICAgICAgICAgICAgc2NoZW1hLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgICAgICBzY2hlbWEuc2V0RWxlbWVudFR5cGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsInNjaGVtYSIpKTsKLSAgICAgICAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5jcmVhdGVUeXBlcygpOwotICAgICAgICAgICAgZGVmaW5pdGlvbi5zZXRUeXBlcyh0eXBlcyk7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLmdldFR5cGVzKCkuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc2NoZW1hKTsKLQotICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgICAgICAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9DdXN0b21CZWFuVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQ3VzdG9tQmVhblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1MzVkOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9DdXN0b21CZWFuVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLkN1c3RvbUJlYW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLndzZGwuV1NETDExRGVmaW5pdGlvbkJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQmVhblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVTY2hlbWEoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoQ3VzdG9tQmVhblNlcnZpY2UuY2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIFdTREwxMURlZmluaXRpb25CdWlsZGVyIGRlZmluaXRpb25CdWlsZGVyID0gbmV3IFdTREwxMURlZmluaXRpb25CdWlsZGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZGVmaW5pdGlvbkJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0KLS8vICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0vLyAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIFN5c3RlbS5vdXQpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBidWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0N1c3RvbU1hcHBpbmdTZXJ2aWNlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQ3VzdG9tTWFwcGluZ1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjJmMDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvQ3VzdG9tTWFwcGluZ1NlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5DbGFzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY29uZmlnLkZpZWxkSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLkN1c3RvbU1hcHBpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvLkNvbXBsZXhUeXBlMzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEN1c3RvbU1hcHBpbmdTZXJ2aWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVNjaGVtYSgpIHsKLQotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotCi0gICAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKENvbXBsZXhUeXBlMy5jbGFzcyk7Ci0gICAgICAgIEZpZWxkSW5mbyBmaWVsZEluZm8gPSBuZXcgRmllbGRJbmZvKCJwYXJhbTEiLCJ4bWxwYXJhbTEiLGZhbHNlKTsKLSAgICAgICAgY2xhc3NJbmZvLmFkZEZpZWxkSW5mbyhmaWVsZEluZm8pOwotICAgICAgICBjb25maWd1cmF0b3IuYWRkQ2xhc3NJbmZvKGNsYXNzSW5mbyk7Ci0KLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoQ3VzdG9tTWFwcGluZ1NlcnZpY2UuY2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIFdTREwxMURlZmluaXRpb25CdWlsZGVyIGRlZmluaXRpb25CdWlsZGVyID0gbmV3IFdTREwxMURlZmluaXRpb25CdWlsZGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZGVmaW5pdGlvbkJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0KLS8vICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0vLyAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIFN5c3RlbS5vdXQpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBidWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0V4dGVuc2lvblNlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9FeHRlbnNpb25TZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTg3MTgzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL0V4dGVuc2lvblNlcnZpY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5NZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuRXh0ZW5zaW9uU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0by5DaGlsZENsYXNzMjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2lvblNlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlU2NoZW1hKCkgewotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBjb25maWd1cmF0b3IuYWRkRXh0ZW5zaW9uKENoaWxkQ2xhc3MyLmNsYXNzKTsKLSAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoRXh0ZW5zaW9uU2VydmljZS5jbGFzcywgY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBXU0RMMTFEZWZpbml0aW9uQnVpbGRlciBkZWZpbml0aW9uQnVpbGRlciA9IG5ldyBXU0RMMTFEZWZpbml0aW9uQnVpbGRlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGRlZmluaXRpb25CdWlsZGVyLmdlbmVyYXRlV1NETCgpOwotCi0gICAgICAgICAgICBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlciBidWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIoZGVmaW5pdGlvbiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBidWxkZXIucG9wdWxhdGVTZXJ2aWNlKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GYXVsdFNlcnZpY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9GYXVsdFNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNTIzMGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvRmF1bHRTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLkZhdWx0U2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEZhdWx0U2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVTY2hlbWEoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKEZhdWx0U2VydmljZS5jbGFzcywgY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVsZGVyID0gbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKGRlZmluaXRpb24sIG51bGwsIG51bGwpOwotICAgICAgICAgICAgYnVsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotCi0gICAgICAgIH0gY2F0Y2ggKE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvTWFwU2VydmljZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL01hcFNlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzk1YzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvTWFwU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5NYXBTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLndzZGwuV1NETDExRGVmaW5pdGlvbkJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTWFwU2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVTY2hlbWEoKSB7Ci0gICAgICAgIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG5ldyBTZXJ2aWNlKE1hcFNlcnZpY2UuY2xhc3MsIGNvbmZpZ3VyYXRvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXJ2aWNlLnBvcHVsYXRlTWV0YURhdGEoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuZ2VuZXJhdGVTY2hlbWEoKTsKLSAgICAgICAgICAgIFdTREwxMURlZmluaXRpb25CdWlsZGVyIGRlZmluaXRpb25CdWlsZGVyID0gbmV3IFdTREwxMURlZmluaXRpb25CdWlsZGVyKHNlcnZpY2UpOwotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZGVmaW5pdGlvbkJ1aWxkZXIuZ2VuZXJhdGVXU0RMKCk7Ci0KLSAgICAgICAgICAgIFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1bGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihkZWZpbml0aW9uLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIGJ1bGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvVGVzdFJlZmxlY3Rpb24uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL1Rlc3RSZWZsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWIyNDQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvVGVzdFJlZmxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5CYXNpY1NlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFJlZmxlY3Rpb24gZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlKCl7Ci0gICAgICAgIENsYXNzIGJhc2ljU2VydmljZUNsYXNzID0gQmFzaWNTZXJ2aWNlLmNsYXNzOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kMiA9IGJhc2ljU2VydmljZUNsYXNzLmdldE1ldGhvZCgibWV0aG9kMiIsbmV3IENsYXNzW117aW50LmNsYXNzfSk7Ci0gICAgICAgICAgICBPYmplY3QgYmFzaWNTZXJ2aWNlID0gYmFzaWNTZXJ2aWNlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgbWV0aG9kMi5pbnZva2UoYmFzaWNTZXJ2aWNlLG5ldyBPYmplY3RbXXtuZXcgSW50ZWdlcigxKX0pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPSyIpOwotCi0gICAgICAgICAgICBDbGFzcyBpbnRlZ2VyQ2xhc3MgPSBJbnRlZ2VyLmNsYXNzOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBpbnRlZ2VyQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117U3RyaW5nLmNsYXNzfSk7Ci0gICAgICAgICAgICBPYmplY3QgaW50ZWdlck9iamVjdCA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXsiNSJ9KTsKLSAgICAgICAgICAgIE9iamVjdCBpbnRlZ2VyID0gaW50ZWdlckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9UeXBlVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0YTkwOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuaW1wbC5UeXBlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0by5DaGlsZENsYXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgVHlwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRDbGFzcygpIHsKLQotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgVHlwZSB0eXBlID0gbmV3IFR5cGVJbXBsKENoaWxkQ2xhc3MuY2xhc3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHlwZS5wb3B1bGF0ZU1ldGFEYXRhKGNvbmZpZ3VyYXRvcixwcm9jZXNzZWRUeXBlTWFwKTsKLSAgICAgICAgfSBjYXRjaCAoTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0Jhc2ljU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9CYXNpY1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4NmNjYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0Jhc2ljU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG8uQ29tcGxleFR5cGUxOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNTZXJ2aWNlIHsKLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXRob2QyKGludCBwYXJhbTEpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdm9rZWQgd2l0aCAiICsgcGFyYW0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtZXRob2QzKFN0cmluZyBwYXJhbTEpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDQoQ29tcGxleFR5cGUxIGNvbXBsZXhUeXBlMSkgewotCi0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2Q1KGludCBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2Q2KFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wbGV4VHlwZTEgbWV0aG9kNyhDb21wbGV4VHlwZTEgY29tcGxleFR5cGUxKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGUxKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIG1ldGhvZDgoaW50W10gcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBuZXcgaW50WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBtZXRob2Q5KFN0cmluZ1tdIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUxW10gbWV0aG9kMTAoQ29tcGxleFR5cGUxW10gY29tcGxleFR5cGUxKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGUxWzBdOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDExKGludCBwYXJhbTEsIFN0cmluZyBwYXJhbTIsIENvbXBsZXhUeXBlMSBjb21wbGV4VHlwZTEpIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEyKGludFtdIHBhcmFtMSwgU3RyaW5nW10gcGFyYW0yLCBDb21wbGV4VHlwZTFbXSBjb21wbGV4VHlwZTEpIHsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9DdXN0b21CZWFuU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9DdXN0b21CZWFuU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWUzNTc0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvQ3VzdG9tQmVhblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvLkN1c3RvbUJlYW5DbGFzczsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQmVhblNlcnZpY2UgewotICAgIAotICAgICBwdWJsaWMgQ3VzdG9tQmVhbkNsYXNzIG1ldGhvZDEoQ3VzdG9tQmVhbkNsYXNzIHBhcmFtMSl7Ci0gICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0N1c3RvbU1hcHBpbmdTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0N1c3RvbU1hcHBpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2EwZTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9DdXN0b21NYXBwaW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG8uQ29tcGxleFR5cGUzOwotCi0KLXB1YmxpYyBjbGFzcyBDdXN0b21NYXBwaW5nU2VydmljZSB7Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUzIG1ldGhvZDEoQ29tcGxleFR5cGUzIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvRXh0ZW5zaW9uU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9FeHRlbnNpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGEyMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9FeHRlbnNpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0by5DaGlsZENsYXNzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvLlBhcmVudENsYXNzOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25TZXJ2aWNlIHsKLQotICAgIHB1YmxpYyBPYmplY3QgbWV0aG9kMShPYmplY3QgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFBhcmVudENsYXNzIG1ldGhvZDIoUGFyZW50Q2xhc3MgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIENoaWxkQ2xhc3MgbWV0aG9kMyhDaGlsZENsYXNzIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvRmF1bHRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL0ZhdWx0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmU5M2YzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvRmF1bHRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmV4Y2VwdGlvbi5FeGNlcHRpb24xOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uLkV4Y2VwdGlvbjI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5leGNlcHRpb24uRXhjZXB0aW9uMzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmV4Y2VwdGlvbi5FeGNlcHRpb240OwotCi0KLXB1YmxpYyBjbGFzcyBGYXVsdFNlcnZpY2UgewotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMSgpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uMSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24xKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyKFN0cmluZyBwYXJhbTEpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uMiB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2QzKGludCBwYXJhbTEpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uMSwgRXhjZXB0aW9uMiB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24xKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kNChpbnQgcGFyYW0xKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjEsIEV4Y2VwdGlvbjIsIEV4Y2VwdGlvbjMsIEV4Y2VwdGlvbjQgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uMygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9NYXBTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL01hcFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjNDJhMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL01hcFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIE1hcFNlcnZpY2UgewotCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMShNYXAgcGFyYW0xKXsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjNTZkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9DaGlsZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBDaGlsZENsYXNzIGV4dGVuZHMgUGFyZW50Q2xhc3MgewotCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmFtMzsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTQ7Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKEludGVnZXIgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW00KCkgewotICAgICAgICByZXR1cm4gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNChTdHJpbmcgcGFyYW00KSB7Ci0gICAgICAgIHRoaXMucGFyYW00ID0gcGFyYW00OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MyLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9DaGlsZENsYXNzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY3ZGU5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NoaWxkQ2xhc3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBDaGlsZENsYXNzMiBleHRlbmRzIFBhcmVudENsYXNzIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMzsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTQ7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoU3RyaW5nIHBhcmFtMykgewotICAgICAgICB0aGlzLnBhcmFtMyA9IHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtNCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTQoU3RyaW5nIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9Db21wbGV4VHlwZTEuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NvbXBsZXhUeXBlMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjk4ZGNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NvbXBsZXhUeXBlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcGxleFR5cGUxIHsKLQotICAgIHByaXZhdGUgaW50IHBhcmFtMTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTI7Ci0gICAgcHJpdmF0ZSBDb21wbGV4VHlwZTIgcGFyYW0zOwotICAgIHByaXZhdGUgaW50W10gcGFyYW00OwotICAgIHByaXZhdGUgU3RyaW5nW10gcGFyYW01OwotICAgIHByaXZhdGUgQ29tcGxleFR5cGUyW10gcGFyYW02OwotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBsZXhUeXBlMiBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKENvbXBsZXhUeXBlMiBwYXJhbTMpIHsKLSAgICAgICAgdGhpcy5wYXJhbTMgPSBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIGdldFBhcmFtNCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTQoaW50W10gcGFyYW00KSB7Ci0gICAgICAgIHRoaXMucGFyYW00ID0gcGFyYW00OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbTUoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW01KFN0cmluZ1tdIHBhcmFtNSkgewotICAgICAgICB0aGlzLnBhcmFtNSA9IHBhcmFtNTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUyW10gZ2V0UGFyYW02KCkgewotICAgICAgICByZXR1cm4gcGFyYW02OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNihDb21wbGV4VHlwZTJbXSBwYXJhbTYpIHsKLSAgICAgICAgdGhpcy5wYXJhbTYgPSBwYXJhbTY7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0NvbXBsZXhUeXBlMi5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vQ29tcGxleFR5cGUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTJjOGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vQ29tcGxleFR5cGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi1wdWJsaWMgY2xhc3MgQ29tcGxleFR5cGUyIHsKLQotICAgIHByaXZhdGUgaW50IHBhcmFtMTsKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTI7Ci0gICAgcHJpdmF0ZSBpbnRbXSBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJhbTQ7Ci0gICAgcHJpdmF0ZSBDb21wbGV4VHlwZTIgcGFyYW01OwotICAgIHByaXZhdGUgQ29tcGxleFR5cGUyW10gcGFyYW02OwotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIGludFtdIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoaW50W10gcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbTQoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW00KFN0cmluZ1tdIHBhcmFtNCkgewotICAgICAgICB0aGlzLnBhcmFtNCA9IHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUyIGdldFBhcmFtNSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTUoQ29tcGxleFR5cGUyIHBhcmFtNSkgewotICAgICAgICB0aGlzLnBhcmFtNSA9IHBhcmFtNTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGxleFR5cGUyW10gZ2V0UGFyYW02KCkgewotICAgICAgICByZXR1cm4gcGFyYW02OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtNihDb21wbGV4VHlwZTJbXSBwYXJhbTYpIHsKLSAgICAgICAgdGhpcy5wYXJhbTYgPSBwYXJhbTY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vQ29tcGxleFR5cGUzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9Db21wbGV4VHlwZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTBlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9Db21wbGV4VHlwZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG87Ci0KLQotcHVibGljIGNsYXNzIENvbXBsZXhUeXBlMyB7Ci0KLSAgICBwcml2YXRlIGludCBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoaW50IHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9DdXN0b21CZWFuQ2xhc3MuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0N1c3RvbUJlYW5DbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjFjZWRlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL0N1c3RvbUJlYW5DbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQmVhbkNsYXNzIHsKLQotICAgIHByaXZhdGUgU2ltcGxlUmVzdHJpY3Rpb24gcGFyYW0xOwotCi0gICAgcHVibGljIFNpbXBsZVJlc3RyaWN0aW9uIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoU2ltcGxlUmVzdHJpY3Rpb24gcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL1BhcmVudENsYXNzLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2R0by9QYXJlbnRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzAzMThmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL1BhcmVudENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZHRvOwotCi0KLXB1YmxpYyBjbGFzcyBQYXJlbnRDbGFzcyB7Ci0KLSAgICBwcml2YXRlIGludCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW0yOwotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vU2ltcGxlUmVzdHJpY3Rpb24uamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZHRvL1NpbXBsZVJlc3RyaWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTYyMGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9kdG8vU2ltcGxlUmVzdHJpY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5BYnN0cmFjdFJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxQYXJzaW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS50eXBlLlNpbXBsZVJlc3RyaWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS51dGlsLk5hbWVzcGFjZVByZWZpeDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVJlc3RyaWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuCi17Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSmF2YU9iamVjdFNlcmlhbGl6ZXIgc2VyaWFsaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUU5hbWUgcGFyZW50UU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZVByZWZpeCBuYW1lc3BhY2VQcmVmaXgpCi0gICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBYbWxTZXJpYWxpemluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vd3JpdGUgdGhlIHN0YXIgZWxlbWVudAotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCh3cml0ZXIscGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkscGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhwYXJhbTEpOwotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEJlYW5DbGFzcygpewotICAgICAgICByZXR1cm4gU2ltcGxlUmVzdHJpY3Rpb25UeXBlLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotCi0gICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICBTaW1wbGVSZXN0cmljdGlvbiBzaW1wbGVSZXN0cmljdGlvbiA9IG5ldyBTaW1wbGVSZXN0cmljdGlvbigpOwotICAgICAgIHNpbXBsZVJlc3RyaWN0aW9uLnNldFBhcmFtMShyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICB3aGlsZSAocmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHNpbXBsZVJlc3RyaWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0xKCkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMShTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlMDg0Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb24xIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICAKLSAgICBwdWJsaWMgRXhjZXB0aW9uMSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24xKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjIuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlZmE2OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb24yIGV4dGVuZHMgRXhjZXB0aW9uewotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjIoVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjk4M2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvc2VydmljZS9leGNlcHRpb24vRXhjZXB0aW9uMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5zZXJ2aWNlLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uMyBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMyhTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMyhUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24zKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjQuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3NlcnZpY2UvZXhjZXB0aW9uL0V4Y2VwdGlvbjQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiMjJiNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS9zZXJ2aWNlL2V4Y2VwdGlvbi9FeGNlcHRpb240LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnNlcnZpY2UuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb240IGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAgIHB1YmxpYyBFeGNlcHRpb240KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb240KFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb240KFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjQoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvdHlwZS9TaW1wbGVSZXN0cmljdGlvblR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL21ldGFkYXRhL3R5cGUvU2ltcGxlUmVzdHJpY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzBlYTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvdHlwZS9TaW1wbGVSZXN0cmljdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEuc2VydmljZS5kdG8uU2ltcGxlUmVzdHJpY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEudHlwZS54bWwuU2ltcGxlUmVzdHJpY3Rpb25YbWxUeXBlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXN0cmljdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVNZXRhRGF0YShDb25maWd1cmF0b3IgY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHByb2Nlc3NlZFR5cGVNYXApCi0gICAgICAgICAgICB0aHJvd3MgTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuamF2YUNsYXNzID0gU2ltcGxlUmVzdHJpY3Rpb24uY2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3JtaS9zaW1wbGV0eXBlcyI7Ci0gICAgICAgIHRoaXMubmFtZSA9ICJzaW1wbGVSZXN0cmljdGlvbiI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdGhpcy5pc1NjaGVtYUdlbmVyYXRlZCA9IHRydWU7Ci0gICAgICAgIHRoaXMueG1sVHlwZSA9IG5ldyBTaW1wbGVSZXN0cmljdGlvblhtbFR5cGUoKTsKLSAgICAgICAgdGhpcy54bWxUeXBlLnNldFFuYW1lKG5ldyBRTmFtZSh0aGlzLm5hbWVzcGFjZSx0aGlzLm5hbWUpKTsKLSAgICAgICAgcmVnaXN0ZXJYbWxUeXBlKHNjaGVtYU1hcCk7Ci0gICAgICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvbWV0YWRhdGEvdHlwZS94bWwvU2ltcGxlUmVzdHJpY3Rpb25YbWxUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS90eXBlL3htbC9TaW1wbGVSZXN0cmljdGlvblhtbFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzYzJmMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9tZXRhZGF0YS90eXBlL3htbC9TaW1wbGVSZXN0cmljdGlvblhtbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEudHlwZS54bWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuQWJzdHJhY3RYbWxUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVSZXN0cmljdGlvblhtbFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGUgewotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVXU0RMU2NoZW1hKERvY3VtZW50IGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgbmFtZXNwYWNlc1RvUHJlZml4TWFwKSB0aHJvd3MgU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgc2ltcGxlIHR5cGUgRWxlbWVudCBoZXJlCi0gICAgICAgIFN0cmluZyB4c2RQcmVmaXggPSAoU3RyaW5nKSBuYW1lc3BhY2VzVG9QcmVmaXhNYXAuZ2V0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNEKTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNpbXBsZVR5cGUiKTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudC5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLHRoaXMucW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCJyZXN0cmljdGlvbiIpOwotICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgIHJlc3RyaWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoImJhc2UiLHhzZFByZWZpeCArICI6c3RyaW5nIik7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdHJpY3Rpb25FbGVtZW50KTsKLQotICAgICAgICBFbGVtZW50IGVudW1lcmF0aW9uRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBlbnVtZXJhdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJlbnVtZXJhdGlvbiIpOwotICAgICAgICAgICAgZW51bWVyYXRpb25FbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICAgICAgZW51bWVyYXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgidmFsdWUiLCAidGVzdFZhbHVlIiArIGkpOwotICAgICAgICAgICAgcmVzdHJpY3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKGVudW1lcmF0aW9uRWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9TZXJ2ZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9ybWkvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3JtaS9zZXJ2ZXIvU2VydmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVhN2M2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9TZXJ2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uTWV0YURhdGFQb3B1bGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uU2NoZW1hR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlcy5TZXJ2aWNlMTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS53c2RsLldTREwxMURlZmluaXRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlclRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJUzJfQ09ORklHX0ZJTEUgPSAibW9kdWxlcy9ybWkvY29uZi9heGlzMi54bWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVMyX1JFUE9TSVRPUllfTE9DQVRJT04gPSAibW9kdWxlcy9ybWkvcmVwb3NpdG9yeSI7Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXBsb3lBbmRTdGFydFNlcnZpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFYSVMyX1JFUE9TSVRPUllfTE9DQVRJT04sIEFYSVMyX0NPTkZJR19GSUxFKTsKLSAgICAgICAgICAgIC8vIGFkZCB0aGUgc2VydmljZQotLy8gICAgICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotLy8gICAgICAgICAgICBDbGFzc0RlcGxveWVyIGNsYXNzRGVwbG95ZXIgPSBuZXcgQ2xhc3NEZXBsb3llcihjb25mQ29udGV4dCwgY29uZmlndXJhdG9yKTsKLS8vICAgICAgICAgICAgY2xhc3NEZXBsb3llci5kZXBsb3lDbGFzcyhTZXJ2aWNlMi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIFNpbXBsZUhUVFBTZXJ2ZXIgc2ltcGxlSHR0cFNlcnZlciA9IG5ldyBTaW1wbGVIVFRQU2VydmVyKGNvbmZDb250ZXh0LCA1NTU1KTsKLSAgICAgICAgICAgIHNpbXBsZUh0dHBTZXJ2ZXIuc3RhcnQoKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgc3RhcnRlZCBvbiBwb3J0IDU1NTUgIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOyAgLy9UbyBjaGFuZ2UgYm9keSBvZiBjYXRjaCBzdGF0ZW1lbnQgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RXU0RMKCkgewotICAgICAgICBDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgU2VydmljZShTZXJ2aWNlMS5jbGFzcywgY29uZmlndXJhdG9yKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2UucG9wdWxhdGVNZXRhRGF0YSgpOwotICAgICAgICAgICAgc2VydmljZS5nZW5lcmF0ZVNjaGVtYSgpOwotICAgICAgICAgICAgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIgZGVmaW5pdGlvbkJ1aWxkZXIgPSBuZXcgV1NETDExRGVmaW5pdGlvbkJ1aWxkZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBkZWZpbml0aW9uQnVpbGRlci5nZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAgICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMV3JpdGVyKCk7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIGZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcigidGVzdC53c2RsIik7Ci0gICAgICAgICAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBmaWxlV3JpdGVyKTsKLQotICAgICAgICB9IGNhdGNoIChNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIG5ldyBTZXJ2ZXJUZXN0KCkuZGVwbG95QW5kU3RhcnRTZXJ2aWNlKCk7Ci0vLyAgICAgICAgbmV3IFNlcnZlclRlc3QoKS50ZXN0V1NETCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9zZXJ2aWNlcy9TZXJ2aWNlMS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlY2E2MzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIGltcGxlbWVudHMgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gbWV0aG9kMihTdHJpbmdbXSBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG1laHRvZDMoaW50IHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnRbXSBtZWh0b2Q0KGludFtdIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgbWV0aG9kNShNYXAgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgbWV0aG9kNihEYXRlIHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9zZXJ2aWNlcy9TZXJ2aWNlMUludGVyZmFjZS5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWU3Y2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QxKFN0cmluZyBwYXJhbTEpOwotCi0gICAgcHVibGljIFN0cmluZ1tdIG1ldGhvZDIoU3RyaW5nW10gcGFyYW0xKTsKLQotICAgIHB1YmxpYyBpbnQgbWVodG9kMyhpbnQgcGFyYW0xKTsKLQotICAgIHB1YmxpYyBpbnRbXSBtZWh0b2Q0KGludFtdIHBhcmFtMSk7Ci0KLSAgICBwdWJsaWMgTWFwIG1ldGhvZDUoTWFwIHBhcmFtMSk7Ci0KLSAgICBwdWJsaWMgRGF0ZSBtZXRob2Q2KERhdGUgcGFyYW0xKTsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3JtaS90ZXN0L29yZy9hcGFjaGUvYXhpczIvcm1pL3NlcnZlci9zZXJ2aWNlcy9TZXJ2aWNlMi5qYXZhIGIvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMThlZjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvcm1pL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9ybWkvc2VydmVyL3NlcnZpY2VzL1NlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIucm1pLnNlcnZlci5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLmR0by5UZXN0UmVzdHJpY3Rpb25CZWFuOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMiB7Ci0gICAgCi0gICAgcHVibGljIFRlc3RSZXN0cmljdGlvbkJlYW4gbWV0aG9kNyhUZXN0UmVzdHJpY3Rpb25CZWFuIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeSBiLzFfNS9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzNTIzOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLnNhYWouTWVzc2FnZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuTWV0YUZhY3RvcnkgYi8xXzUvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuTWV0YUZhY3RvcnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmQzMDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9jb25mL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5zb2FwLk1ldGFGYWN0b3J5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmFwYWNoZS5heGlzMi5zYWFqLlNBQUpNZXRhRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3RvcnkgYi8xXzUvbW9kdWxlcy9zYWFqL2NvbmYvTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb25GYWN0b3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjhiZmI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3RvcnkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUENvbm5lY3Rpb25GYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9jb25mL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5IGIvMV81L21vZHVsZXMvc2Fhai9jb25mL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzEyNWVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovY29uZi9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3NhYWovcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiZDJjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXNhYWo8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gU0FBSjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXhpczIgU0FBSiBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc2FhajwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3NhYWo8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3NhYWo8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1zYWFqXzEuM19zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtaHR0cDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT50ZXN0LXJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+YXhpczIueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+Li4vdGVzdC1yZXNvdXJjZXMvc2Fhai1yZXBvPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyouKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGZvcmtNb2RlPm9uY2U8L2ZvcmtNb2RlPgotICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tRGphdmEuZW5kb3JzZWQuZGlycz0ke20yUmVwb3NpdG9yeX0vb3JnL2FwYWNoZS9nZXJvbmltby9zcGVjcy9nZXJvbmltby1zYWFqXzEuM19zcGVjLyR7Z2Vyb25pbW8uc3BlYy5zYWFqLnZlcnNpb259LzwvYXJnTGluZT4KLSAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5hcGFjaGUuYXhpczIuc2Fhai5NZXNzYWdlRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBGYWN0b3J5SW1wbDwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBDb25uZWN0aW9uRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZheC54bWwuc29hcC5NZXRhRmFjdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5heGlzMi5zYWFqLlNBQUpNZXRhRmFjdG9yeUltcGw8L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHJldmVudCBNYWMgT1MgWCBmcm9tIHNob3dpbmcgYW4gaWNvbiBpbiB0aGUgZG9jayBkdXJpbmcgdGhlIHRlc3QgcnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmEuYXd0LmhlYWRsZXNzPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQXR0YWNobWVudFBhcnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQXR0YWNobWVudFBhcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWQ2ZTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0F0dGFjaG1lbnRQYXJ0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5ET09NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLkJhc2U2NDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbC5TQUFKRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50UGFydEltcGwgZXh0ZW5kcyBBdHRhY2htZW50UGFydCB7Ci0gICAgcHJpdmF0ZSBEYXRhSGFuZGxlciBkYXRhSGFuZGxlcjsKLQotICAgIHByaXZhdGUgTWltZUhlYWRlcnMgbWltZUhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICBwcml2YXRlIFN0cmluZyBhdHRhY2htZW50RmlsZTsKLQotICAgIHByaXZhdGUgT01UZXh0IG9tVGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBdHRhY2htZW50UmVmZXJlbmNlZDsKLQotICAgIC8qKgotICAgICAqIENoZWNrIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG9mIHRoZSBoZWFkZXJzIG9mIHRoaXMgb2JqZWN0IG1hdGNoZXMgYSBwcm92aWRlZCBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXJzCi0gICAgICogQHJldHVybiA8Yj50cnVlPC9iPiBpZiBhdCBsZWFzdCBvbmUgaGVhZGVyIG9mIHRoaXMgQXR0YWNobWVudFBhcnQgbWF0Y2hlcyBhIGhlYWRlciBpbiB0aGUKLSAgICAgKiAgICAgICAgIHByb3ZpZGVkIDxjb2RlPmhlYWRlcnM8L2NvZGU+IHBhcmFtZXRlciwgPGI+ZmFsc2U8L2I+IGlmIG5vbmUgb2YgdGhlIGhlYWRlcnMgb2YgdGhpcwotICAgICAqICAgICAgICAgQXR0YWNobWVudFBhcnQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIGhlYWRlciBpbiB0aGUgcHJvdmlkZWQKLSAgICAgKiAgICAgICAgIDxjb2RlPmhlYWRlcnM8L2NvZGU+IHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoTWltZUhlYWRlcnMgaGVhZGVycykgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBoZWFkZXJzLmdldEFsbEhlYWRlcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBNaW1lSGVhZGVyIGhkciA9IChqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyKWkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlc1tdID0gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKGhkci5nZXROYW1lKCkpOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFoZHIuZ2V0VmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlc1tqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dGFjaG1lbnRSZWZlcmVuY2VkKCkgewotICAgICAgICByZXR1cm4gaXNBdHRhY2htZW50UmVmZXJlbmNlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50UmVmZXJlbmNlZChib29sZWFuIGF0dGFjaG1lbnRSZWZlcmVuY2VkKSB7Ci0gICAgICAgIGlzQXR0YWNobWVudFJlZmVyZW5jZWQgPSBhdHRhY2htZW50UmVmZXJlbmNlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyA8Q09ERT4gQXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0IGluIGJ5dGVzIG9yIC0xIGlmIHRoZSBzaXplIGNhbm5vdAotICAgICAqICAgICAgICAgYmUgZGV0ZXJtaW5lZAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudCBvZiB0aGlzIGF0dGFjaG1lbnQgaXMgY29ycnVwdGVkIG9mIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIGRldGVybWluZSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNpemUoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkYXRhSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGFIYW5kbGVyLndyaXRlVG8oYm91dCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBib3V0LnNpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgb3V0IHRoZSBjb250ZW50IG9mIHRoaXMgPENPREU+IEF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QuIFRoZSBNSU1FIGhlYWRlciBwb3J0aW9uCi0gICAgICogaXMgbGVmdCB1bnRvdWNoZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJDb250ZW50KCkgewotICAgICAgICBkYXRhSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG9tVGV4dCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGVudCBvZiB0aGlzIDxjb2RlPkF0dGFjaG1lbnRQYXJ0PC9jb2RlPiBvYmplY3QgYXMgYSBKYXZhIG9iamVjdC4gVGhlIHR5cGUgb2YgdGhlCi0gICAgICogcmV0dXJuZWQgSmF2YSBvYmplY3QgZGVwZW5kcyBvbiA8b2w+IDxsaT4gdGhlIDxjb2RlPkRhdGFDb250ZW50SGFuZGxlcjwvY29kZT4gb2JqZWN0IHRoYXQgaXMKLSAgICAgKiB1c2VkIHRvIGludGVycHJldCB0aGUgYnl0ZXMgPC9saT4gPGxpPiB0aGUgPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPiBnaXZlbiBpbiB0aGUgaGVhZGVyPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDxwLz4KLSAgICAgKiBGb3IgdGhlIE1JTUUgY29udGVudCB0eXBlcyAidGV4dC9wbGFpbiIsICJ0ZXh0L2h0bWwiIGFuZCAidGV4dC94bWwiLCB0aGUKLSAgICAgKiA8Y29kZT5EYXRhQ29udGVudEhhbmRsZXI8L2NvZGU+IG9iamVjdCBkb2VzIHRoZSBjb252ZXJzaW9ucyB0byBhbmQgZnJvbSB0aGUgSmF2YSB0eXBlcwotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIE1JTUUgdHlwZXMuIEZvciBvdGhlciBNSU1FIHR5cGVzLHRoZSA8Y29kZT5EYXRhQ29udGVudEhhbmRsZXI8L2NvZGU+Ci0gICAgICogb2JqZWN0IGNhbiByZXR1cm4gYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50IGRhdGEgYXMgcmF3Ci0gICAgICogYnl0ZXMuCi0gICAgICogPHAvPgotICAgICAqIEEgSkFYTS1jb21wbGlhbnQgaW1wbGVtZW50YXRpb24gbXVzdCwgYXMgYSBtaW5pbXVtLCByZXR1cm4gYSA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPgotICAgICAqIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGFueSBjb250ZW50IHN0cmVhbSB3aXRoIGEgPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPiB2YWx1ZSBvZgotICAgICAqIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LCBhIDxjb2RlPmphdmF4LnhtbC50cmFuc2Zvcm0uU3RyZWFtU291cmNlPC9jb2RlPiBvYmplY3QgY29ycmVzcG9uZGluZwotICAgICAqIHRvIGEgY29udGVudCBzdHJlYW0gd2l0aCBhIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4gdmFsdWUgb2YgPGNvZGU+dGV4dC94bWw8L2NvZGU+LCBhCi0gICAgICogPGNvZGU+amF2YS5hd3QuSW1hZ2U8L2NvZGU+IG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEgY29udGVudCBzdHJlYW0gd2l0aCBhCi0gICAgICogPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPiB2YWx1ZSBvZiA8Y29kZT5pbWFnZS9naWY8L2NvZGU+IG9yIDxjb2RlPmltYWdlL2pwZWc8L2NvZGU+LiAgRm9yCi0gICAgICogdGhvc2UgY29udGVudCB0eXBlcyB0aGF0IGFuIGluc3RhbGxlZCA8Y29kZT5EYXRhQ29udGVudEhhbmRsZXI8L2NvZGU+IG9iamVjdCBkb2VzIG5vdAotICAgICAqIHVuZGVyc3RhbmQsIHRoZSA8Y29kZT5EYXRhQ29udGVudEhhbmRsZXI8L2NvZGU+IG9iamVjdCBpcyByZXF1aXJlZCB0byByZXR1cm4gYQotICAgICAqIDxjb2RlPmphdmEuaW8uSW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdCB3aXRoIHRoZSByYXcgYnl0ZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgSmF2YSBvYmplY3Qgd2l0aCB0aGUgY29udGVudCBvZiB0aGlzIDxDT0RFPiBBdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGNvbnRlbnQgc2V0IGludG8gdGhpcyA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yIGlmIHRoZXJlIHdhcyBhIGRhdGEgdHJhbnNmb3JtYXRpb24gZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldENvbnRlbnQoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkYXRhSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiTm8gY29udGVudCBpcyBwcmVzZW50IGluIHRoaXMgQXR0YWNobWVudFBhcnQiKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gZGF0YUhhbmRsZXIuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1RFWFRfWE1MKSB8fAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5lcXVhbHMoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTCkpIHsKLSAgICAgICAgICAgICAgICBTdHJlYW1Tb3VyY2Ugc3RyZWFtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgpOwotICAgICAgICAgICAgICAgIHN0cmVhbVNvdXJjZS5zZXRJbnB1dFN0cmVhbShkYXRhSGFuZGxlci5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtU291cmNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoInRleHQvcGxhaW4iKSB8fAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5lcXVhbHMoInRleHQvaHRtbCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpZGF0YUhhbmRsZXIuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXIuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vSWYgdGhlIHVuZGVybHlpbmcgRGF0YUNvbnRlbnRIYW5kbGVyIGNhbid0IGhhbmRsZSB0aGUgb2JqZWN0IGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAvL3dlIHdpbGwgcmV0dXJuIGFuIGlucHV0c3RyZWFtIG9mIHJhdyBieXRlcyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgZGF0YQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXIuZ2V0RGF0YVNvdXJjZSgpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgYXR0YWNobWVudCBwYXJ0IHRvIHRoYXQgb2YgdGhlIGdpdmVuIDxDT0RFPk9iamVjdDwvQ09ERT4gYW5kIHNldHMKLSAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIDxDT0RFPiBDb250ZW50LVR5cGU8L0NPREU+IGhlYWRlciB0byB0aGUgZ2l2ZW4gdHlwZS4gVGhlIHR5cGUgb2YgdGhlCi0gICAgICogPENPREU+T2JqZWN0PC9DT0RFPiBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgdmFsdWUgZ2l2ZW4gZm9yIHRoZSA8Q09ERT5Db250ZW50LVR5cGU8L0NPREU+LgotICAgICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgcGFydGljdWxhciBzZXQgb2YgPENPREU+RGF0YUNvbnRlbnRIYW5kbGVyPC9DT0RFPiBvYmplY3RzIGluIHVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvYmplY3QgICAgICB0aGUgSmF2YSBvYmplY3QgdGhhdCBtYWtlcyB1cCB0aGUgY29udGVudCBmb3IgdGhpcyBhdHRhY2htZW50IHBhcnQKLSAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIE1JTUUgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBjb250ZW50Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnRUeXBlIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBjb250ZW50Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LCBvciBpZiB0aGVyZSB3YXMgbm8gPENPREU+IERhdGFDb250ZW50SGFuZGxlcjwvQ09ERT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoaXMgY29udGVudCBvYmplY3QKLSAgICAgKiBAc2VlICNnZXRDb250ZW50KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KE9iamVjdCBvYmplY3QsIFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICBTQUFKRGF0YVNvdXJjZSBzb3VyY2U7Ci0gICAgICAgIHNldE1pbWVIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCBjb250ZW50VHlwZSk7Ci0gICAgICAgIE9iamVjdCBjb250ZW50T2JqZWN0OwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzID0gKFN0cmluZylvYmplY3Q7Ci0gICAgICAgICAgICAgICAgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgU0FBSkRhdGFTb3VyY2UoYmFpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FBSkRhdGFTb3VyY2UuTUFYX01FTU9SWV9ESVNLX0NBQ0hFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUsIHRydWUpOwotICAgICAgICAgICAgICAgIGV4dHJhY3RGaWxlbmFtZShzb3VyY2UpOwotICAgICAgICAgICAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIoc291cmNlKTsKLSAgICAgICAgICAgICAgICBjb250ZW50T2JqZWN0ID0gb2JqZWN0OwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpbykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEFyZ3VtZW50Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgamF2YS5pby5JbnB1dFN0cmVhbSkgewotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBTQUFKRGF0YVNvdXJjZSgoamF2YS5pby5JbnB1dFN0cmVhbSlvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBQUpEYXRhU291cmNlLk1JTl9NRU1PUllfRElTS19DQUNIRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBleHRyYWN0RmlsZW5hbWUoc291cmNlKTsKLSAgICAgICAgICAgICAgICB0aGlzLmRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY29udGVudE9iamVjdCA9IG51bGw7IC8vIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29uc3VtZWQKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW8pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBBcmd1bWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgU0FBSkRhdGFTb3VyY2UoKChTdHJlYW1Tb3VyY2Upb2JqZWN0KS5nZXRJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUFKRGF0YVNvdXJjZS5NQVhfTUVNT1JZX0RJU0tfQ0FDSEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdEZpbGVuYW1lKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5kYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihzb3VyY2UpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRPYmplY3QgPSBudWxsOyAvLyB0aGUgc3RyZWFtIGhhcyBiZWVuIGNvbnN1bWVkCi0gICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGlvKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgQXJndW1lbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCdWZmZXJlZEltYWdlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRoaXMuZGF0YUhhbmRsZXIgPSBuZXcgRGF0YUhhbmRsZXIob2JqZWN0LCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgY29udGVudE9iamVjdCA9IG51bGw7IC8vIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29uc3VtZWQKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb250ZW50T2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oKGJ5dGVbXSlvYmplY3QpOwotICAgICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBTQUFKRGF0YVNvdXJjZShiYWlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUFKRGF0YVNvdXJjZS5NQVhfTUVNT1JZX0RJU0tfQ0FDSEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZXh0cmFjdEZpbGVuYW1lKHNvdXJjZSk7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLmRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgY29udGVudE9iamVjdCA9IG9iamVjdDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgQXJndW1lbnQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPkRhdGFIYW5kbGVyPC9DT0RFPiBvYmplY3QgZm9yIHRoaXMgPENPREU+IEF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Q09ERT5EYXRhSGFuZGxlcjwvQ09ERT4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPgotICAgICAqICAgICAgICAgb2JqZWN0Ci0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGRhdGEgaW4gdGhpcyA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIERhdGFIYW5kbGVyIGdldERhdGFIYW5kbGVyKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAvL2lmIChnZXRDb250ZW50KCkgPT0gbnVsbCkgewotICAgICAgICAvLyAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiTm8gQ29udGVudCBwcmVzZW50IGluIHRoZSBBdHRhY2htZW50IHBhcnQiKTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vY29tbWVudGVkIHRvIGZpeCBBWElTMi03NzgKLSAgICAgICAgaWYgKGRhdGFIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJObyBDb250ZW50IHByZXNlbnQgaW4gdGhlIEF0dGFjaG1lbnQgcGFydCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRhdGFIYW5kbGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGdpdmVuIDxDT0RFPkRhdGFIYW5kbGVyPC9DT0RFPiBvYmplY3QgYXMgdGhlIGRhdGEgaGFuZGxlciBmb3IgdGhpcwotICAgICAqIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QuIFR5cGljYWxseSwgb24gYW4gaW5jb21pbmcgbWVzc2FnZSwgdGhlIGRhdGEgaGFuZGxlciBpcwotICAgICAqIGF1dG9tYXRpY2FsbHkgc2V0LiBXaGVuIGEgbWVzc2FnZSBpcyBiZWluZyBjcmVhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCBjb250ZW50LCB0aGUKLSAgICAgKiA8Q09ERT5zZXREYXRhSGFuZGxlcjwvQ09ERT4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBkYXRhIGZyb20gdmFyaW91cyBkYXRhIHNvdXJjZXMgaW50byB0aGUKLSAgICAgKiBtZXNzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGFoYW5kbGVyIDxDT0RFPkRhdGFIYW5kbGVyPC9DT0RFPiBvYmplY3QgdG8gYmUgc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBzcGVjaWZpZWQgPENPREU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUhhbmRsZXI8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGFIYW5kbGVyKERhdGFIYW5kbGVyIGRhdGFoYW5kbGVyKSB7Ci0gICAgICAgIGlmIChkYXRhaGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmRhdGFIYW5kbGVyID0gZGF0YWhhbmRsZXI7Ci0gICAgICAgICAgICBzZXRNaW1lSGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgZGF0YWhhbmRsZXIuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgICAgICBvbVRleHQgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NVGV4dChkYXRhaGFuZGxlciwgdHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc2V0IG51bGwgRGF0YUhhbmRsZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYWxsIE1JTUUgaGVhZGVycyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGhlYWRlciAtIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgTUlNRSBoZWFkZXIvcyB0byBiZSByZW1vdmVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTWltZUhlYWRlcihTdHJpbmcgaGVhZGVyKSB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLnJlbW92ZUhlYWRlcihoZWFkZXIpOwotICAgIH0KLQotICAgIC8qKiBSZW1vdmVzIGFsbCB0aGUgTUlNRSBoZWFkZXIgZW50cmllcy4gKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGxNaW1lSGVhZGVycygpIHsKLSAgICAgICAgbWltZUhlYWRlcnMucmVtb3ZlQWxsSGVhZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYWxsIHRoZSB2YWx1ZXMgb2YgdGhlIGhlYWRlciBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiA8Q09ERT5TdHJpbmc8L0NPREU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGhlYWRlcjsgZXhhbXBsZTogIkNvbnRlbnQtVHlwZSIKLSAgICAgKiBAcmV0dXJuIGEgPENPREU+U3RyaW5nPC9DT0RFPiBhcnJheSBnaXZpbmcgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGhlYWRlcgotICAgICAqIEBzZWUgI3NldE1pbWVIZWFkZXIoU3RyaW5nLCBTdHJpbmcpIHNldE1pbWVIZWFkZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWltZUhlYWRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIGZpcnN0IGhlYWRlciBlbnRyeSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgdG8gdGhlIGdpdmVuIHZhbHVlLCBhZGRpbmcgYSBuZXcKLSAgICAgKiBoZWFkZXIgaWYgbm8gZXhpc3RpbmcgaGVhZGVyIG1hdGNoZXMuIFRoaXMgbWV0aG9kIGFsc28gcmVtb3ZlcyBhbGwgbWF0Y2hpbmcgaGVhZGVycyBidXQgdGhlCi0gICAgICogZmlyc3QuCi0gICAgICogPHAvPgotICAgICAqIDxQPk5vdGUgdGhhdCBSRkM4MjIgaGVhZGVycyBjYW4gb25seSBjb250YWluIFVTLUFTQ0lJIGNoYXJhY3RlcnMuPC9QPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmb3Igd2hpY2ggdG8gc2VhcmNoCi0gICAgICogQHBhcmFtIHZhbHVlIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIHZhbHVlIHRvIGJlIHNldCBmb3IgdGhlIGhlYWRlciB3aG9zZSBuYW1lCi0gICAgICogICAgICAgICAgICAgIG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHNwZWNpZmllZCBtaW1lIGhlYWRlciBuYW1lCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdmFsdWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRNaW1lSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgbWltZUhlYWRlcnMuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgTUlNRSBoZWFkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlIHRvIHRoaXMgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+Ci0gICAgICogb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5Ob3RlIHRoYXQgUkZDODIyIGhlYWRlcnMgY2FuIGNvbnRhaW4gb25seSBVUy1BU0NJSSBjaGFyYWN0ZXJzLjwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lICBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gdmFsdWUgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciB0byBiZSBhZGRlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIG1pbWUgaGVhZGVyIG5hbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1pbWVIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIGhlYWRlcnMgZm9yIHRoaXMgPENPREU+IEF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QgYXMgYW4gaXRlcmF0b3Igb3ZlcgotICAgICAqIHRoZSA8Q09ERT4gTWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gPENPREU+SXRlcmF0b3I8L0NPREU+IG9iamVjdCB3aXRoIGFsbCBvZiB0aGUgTWltZSBoZWFkZXJzIGZvciB0aGlzCi0gICAgICogICAgICAgICA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEFsbE1pbWVIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gbWltZUhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cyB0aGF0IG1hdGNoIGEgbmFtZSBpbiB0aGUgZ2l2ZW4gYXJyYXkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXMgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGFycmF5IHdpdGggdGhlIG5hbWUocykgb2YgdGhlIE1JTUUgaGVhZGVycyB0byBiZSByZXR1cm5lZAotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSBNSU1FIGhlYWRlcnMgdGhhdCBtYXRjaCBvbmUgb2YgdGhlIG5hbWVzIGluIHRoZSBnaXZlbiBhcnJheSBhcyBhbgotICAgICAqICAgICAgICAgPENPREU+SXRlcmF0b3I8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRNYXRjaGluZ01pbWVIZWFkZXJzKFN0cmluZyBuYW1lc1tdKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXRNYXRjaGluZ0hlYWRlcnMobmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cyB3aG9zZSBuYW1lIGRvZXMgbm90IG1hdGNoIGEgbmFtZSBpbiB0aGUgZ2l2ZW4KLSAgICAgKiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gYXJyYXkgd2l0aCB0aGUgbmFtZShzKSBvZiB0aGUgTUlNRSBoZWFkZXJzIG5vdCB0byBiZQotICAgICAqICAgICAgICAgICAgICByZXR1cm5lZAotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSBNSU1FIGhlYWRlcnMgaW4gdGhpcyA8Q09ERT4gQXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdCBleGNlcHQgdGhvc2UgdGhhdAotICAgICAqICAgICAgICAgbWF0Y2ggb25lIG9mIHRoZSBuYW1lcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBub25tYXRjaGluZyBNSU1FIGhlYWRlcnMgYXJlIHJldHVybmVkCi0gICAgICogICAgICAgICBhcyBhbiA8Q09ERT5JdGVyYXRvcjwvQ09ERT4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXROb25NYXRjaGluZ01pbWVIZWFkZXJzKFN0cmluZyBuYW1lc1tdKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXROb25NYXRjaGluZ0hlYWRlcnMobmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRCYXNlNjRDb250ZW50KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBieXRlW10gcmF3RGF0YSA9IGdldFJhd0NvbnRlbnRCeXRlcygpOwotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQmFzZTY0LmVuY29kZShyYXdEYXRhLCAwLCByYXdEYXRhLmxlbmd0aCwgb3V0KTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGVudCBvZiB0aGlzIEF0dGFjaG1lbnRQYXJ0IG9iamVjdCBhcyBhbiBJbnB1dFN0cmVhbSBhcyBpZiBhIGNhbGwgaGFkIGJlZW4gbWFkZQotICAgICAqIHRvIGdldENvbnRlbnQgYW5kIG5vIERhdGFDb250ZW50SGFuZGxlciBoYWQgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgY29udGVudC10eXBlIG9mIHRoaXMKLSAgICAgKiBBdHRhY2htZW50UGFydC5Ob3RlIHRoYXQgcmVhZGluZyBmcm9tIHRoZSByZXR1cm5lZCBJbnB1dFN0cmVhbSB3b3VsZCByZXN1bHQgaW4gY29uc3VtaW5nIHRoZQotICAgICAqIGRhdGEgaW4gdGhlIHN0cmVhbS4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gcmVzZXQgdGhlIElucHV0U3RyZWFtCi0gICAgICogYXBwcm9wcmlhdGVseSBiZWZvcmUgY2FsbGluZyBhIFN1YnNlcXVlbnQgQVBJLiBJZiBhIGNvcHkgb2YgdGhlIHJhdyBhdHRhY2htZW50IGNvbnRlbnQgaXMKLSAgICAgKiByZXF1aXJlZCB0aGVuIHRoZSBnZXRSYXdDb250ZW50Qnl0ZXMoKSBBUEkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gZnJvbSB3aGljaCB0aGUgcmF3IGRhdGEgY29udGFpbmVkIGJ5IHRoZSBBdHRhY2htZW50UGFydCBjYW4gYmUKLSAgICAgKiAgICAgICAgIGFjY2Vzc2VkLgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIG5vIGNvbnRlbnQgc2V0IGludG8gdGhpcyBBdHRhY2htZW50UGFydCBvYmplY3Qgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgd2FzIGEgZGF0YSB0cmFuc2Zvcm1hdGlvbiBlcnJvci4KLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmF3Q29udGVudCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkYXRhSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5vIGNvbnRlbnQgc2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGF0YUhhbmRsZXIuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgQXR0YWNobWVudFBhcnQgb2JqZWN0IGFzIGEgYnl0ZVtdIGFycmF5IGFzIGlmIGEgY2FsbCBoYWQgYmVlbiBtYWRlCi0gICAgICogdG8gZ2V0Q29udGVudCBhbmQgbm8gRGF0YUNvbnRlbnRIYW5kbGVyIGhhZCBiZWVuIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50LXR5cGUgb2YgdGhpcwotICAgICAqIEF0dGFjaG1lbnRQYXJ0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIGJ5dGVbXSBhcnJheSBjb250YWluaW5nIHRoZSByYXcgZGF0YSBvZiB0aGUgQXR0YWNobWVudFBhcnQuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgaXMgbm8gY29udGVudCBzZXQgaW50byB0aGlzIEF0dGFjaG1lbnRQYXJ0IG9iamVjdCBvciBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSB3YXMgYSBkYXRhIHRyYW5zZm9ybWF0aW9uIGVycm9yLgotICAgICAqIEBzaW5jZSBTQUFKIDEuMwotICAgICAqLwotICAgIHB1YmxpYyBieXRlW10gZ2V0UmF3Q29udGVudEJ5dGVzKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoZGF0YUhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkNvbnRlbnQgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZGF0YUhhbmRsZXIud3JpdGVUbyhib3V0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvdXQudG9CeXRlQXJyYXkoKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBhdHRhY2htZW50IHBhcnQgZnJvbSB0aGUgQmFzZTY0IHNvdXJjZSBJbnB1dFN0cmVhbSBhbmQgc2V0cyB0aGUKLSAgICAgKiB2YWx1ZSBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciB0byB0aGUgdmFsdWUgY29udGFpbmVkIGluIGNvbnRlbnRUeXBlLCBUaGlzIG1ldGhvZCB3b3VsZAotICAgICAqIGZpcnN0IGRlY29kZSB0aGUgYmFzZTY0IGlucHV0IGFuZCB3cml0ZSB0aGUgcmVzdWx0aW5nIHJhdyBieXRlcyB0byB0aGUgYXR0YWNobWVudC4gQQotICAgICAqIHN1YnNlcXVlbnQgY2FsbCB0byBnZXRTaXplKCkgbWF5IG5vdCBiZSBhbiBleGFjdCBtZWFzdXJlIG9mIHRoZSBjb250ZW50IHNpemUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudCAtIHRoZSBiYXNlNjQgZW5jb2RlZCBkYXRhIHRvIGFkZCB0byB0aGUgYXR0YWNobWVudCBwYXJ0IGNvbnRlbnRUeXBlIC0gdGhlCi0gICAgICogICAgICAgICAgICAgICAgdmFsdWUgdG8gc2V0IGludG8gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBzZXR0aW5nIHRoZSBjb250ZW50IGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAtIGlmIGNvbnRlbnQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJhc2U2NENvbnRlbnQoSW5wdXRTdHJlYW0gY29udGVudCwgU3RyaW5nIGNvbnRlbnRUeXBlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJDb250ZW50IGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIGludCByZWFkOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gY29udGVudC5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpID4gMCkgewotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIHJlYWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRTdHJpbmcgPSBvdXRwdXRTdHJlYW0udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChCYXNlNjQuaXNWYWxpZEJhc2U2NEVuY29kaW5nKGNvbnRlbnRTdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgc2V0Q29udGVudChCYXNlNjQuZGVjb2RlKGNvbnRlbnRTdHJpbmcpLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJOb3QgYSB2YWxpZCBCYXNlNjQgZW5jb2RpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBhdHRhY2htZW50IHBhcnQgdG8gdGhhdCBjb250YWluZWQgYnkgdGhlIElucHV0U3RyZWFtIGNvbnRlbnQgYW5kCi0gICAgICogc2V0cyB0aGUgdmFsdWUgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiBjb250ZW50VHlwZS5BIHN1YnNlcXVlbnQKLSAgICAgKiBjYWxsIHRvIGdldFNpemUoKSBtYXkgbm90IGJlIGFuIGV4YWN0IG1lYXN1cmUgb2YgdGhlIGNvbnRlbnQgc2l6ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50IC0gdGhlIHJhdyBkYXRhIHRvIGFkZCB0byB0aGUgYXR0YWNobWVudCBwYXJ0IGNvbnRlbnRUeXBlIC0gdGhlIHZhbHVlIHRvIHNldAotICAgICAqICAgICAgICAgICAgICAgIGludG8gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBzZXR0aW5nIHRoZSBjb250ZW50IGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAtIGlmIGNvbnRlbnQgaXMgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJhd0NvbnRlbnQoSW5wdXRTdHJlYW0gY29udGVudCwgU3RyaW5nIGNvbnRlbnRUeXBlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJjb250ZW50IGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50KGNvbnRlbnQsIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBhdHRhY2htZW50IHBhcnQgdG8gdGhhdCBjb250YWluZWQgYnkgdGhlIGJ5dGVbXSBhcnJheSBjb250ZW50IGFuZAotICAgICAqIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIHRvIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gY29udGVudFR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudCAtIHRoZSByYXcgZGF0YSB0byBhZGQgdG8gdGhlIGF0dGFjaG1lbnQgcGFydCBjb250ZW50VHlwZSAtIHRoZSB2YWx1ZSB0byBzZXQKLSAgICAgKiAgICAgICAgICAgICAgICBpbnRvIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIG9mZnNldCAtIHRoZSBvZmZzZXQgaW4gdGhlIGJ5dGUgYXJyYXkgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgICAgY29udGVudCBsZW4gLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgZm9ybSB0aGUgY29udGVudAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIGFuIHRoZXJlIGlzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIGNvbnRlbnQgb3IgY29udGVudCBpcyBudWxsCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRSYXdDb250ZW50Qnl0ZXMoYnl0ZVtdIGNvbnRlbnQsIGludCBvZmZzZXQsIGludCBsZW4sIFN0cmluZyBjb250ZW50VHlwZSkKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPIC0gaG93IHRvIHVzZSBvZmZzZXQgJiBsZW4/Ci0gICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJDb250ZW50IGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50KGNvbnRlbnQsIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgT01UZXh0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBPTVRleHQKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gSWYgb21UZXh0IGlzIG5vdCBhdmFpbGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgT01UZXh0IGdldE9NVGV4dCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9tVGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiT01UZXh0IHNldCB0byBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9tVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGV4dEltcGwgZ2V0VGV4dChEb2N1bWVudEltcGwgZG9jKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGV4dEltcGwoZG9jLCBvbVRleHQuZ2V0VGV4dCgpLCBkb2MuZ2V0T01GYWN0b3J5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmlsZW5hbWUgb2YgdGhpcyBhdHRhY2htZW50IHBhcnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aCB0aGUgbmV3IGZpbGUgcGF0aAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEF0dGFjaG1lbnRGaWxlKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIGF0dGFjaG1lbnRGaWxlID0gcGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRhY2ggdGhlIGF0dGFjaG1lbnQgZmlsZSBmcm9tIHRoaXMgY2xhc3MsIHNvIGl0IGlzIG5vdCBjbGVhbmVkIHVwLiBUaGlzIGhhcyB0aGUgc2lkZS1lZmZlY3QKLSAgICAgKiBvZiBtYWtpbmcgc3Vic2VxdWVudCBjYWxscyB0byBnZXRBdHRhY2htZW50RmlsZSgpIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXRhY2hBdHRhY2htZW50RmlsZSgpIHsKLSAgICAgICAgYXR0YWNobWVudEZpbGUgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsZW5hbWUgb2YgdGhpcyBhdHRhY2htZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgb3IgbnVsbCBmb3IgYW4gdW5jYWNoZWQgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0YWNobWVudEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBhdHRhY2htZW50RmlsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEZpbGVuYW1lKFNBQUpEYXRhU291cmNlIHNvdXJjZSkgewotICAgICAgICBpZiAoc291cmNlLmdldERpc2tDYWNoZUZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHNvdXJjZS5nZXREaXNrQ2FjaGVGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICBzZXRBdHRhY2htZW50RmlsZShwYXRoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9Db21tZW50SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDAwNGEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0NvbW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5UZXh0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLQotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsIGV4dGVuZHMgVGV4dEltcGxFeCBpbXBsZW1lbnRzIENvbW1lbnQgewotCi0gICAgcHVibGljIENvbW1lbnRJbXBsKFN0cmluZyBkYXRhLCBTT0FQRWxlbWVudCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIoZGF0YSwgcGFyZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbWVudEltcGwoU3RyaW5nIGRhdGEsIFNPQVBFbGVtZW50IHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBwcmV2U2libGluZywgb3JnLnczYy5kb20uTm9kZSBuZXh0U2libGluZykgewotICAgICAgICBzdXBlcihkYXRhLCBwYXJlbnQsIHByZXZTaWJsaW5nLCBuZXh0U2libGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotICAgICAgICByZXR1cm4gIiNjb21tZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBUZXh0LkNPTU1FTlRfTk9ERTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovRGV0YWlsRW50cnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovRGV0YWlsRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDFkMGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0RldGFpbEVudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgY29udGVudCBmb3IgYSBEZXRhaWwgb2JqZWN0LCBnaXZpbmcgZGV0YWlscyBmb3IgYSBTT0FQRmF1bHQgb2JqZWN0LiBBIERldGFpbEVudHJ5IG9iamVjdCwKLSAqIHdoaWNoIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzIHJlbGF0ZWQgdG8gdGhlIFNPQVBCb2R5ICBvYmplY3QgdGhhdCBjb250YWlucyBpdCwgaXMKLSAqIGFwcGxpY2F0aW9uLXNwZWNpZmljLgotICovCi1wdWJsaWMgY2xhc3MgRGV0YWlsRW50cnlJbXBsIGV4dGVuZHMgU09BUEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGV0YWlsRW50cnkgewotCi0gICAgLyoqIEBwYXJhbSBlbGVtZW50ICAqLwotICAgIHB1YmxpYyBEZXRhaWxFbnRyeUltcGwoRWxlbWVudEltcGwgZWxlbWVudCkgewotICAgICAgICBzdXBlcihlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQXR0cmlidXRlKFFOYW1lIHFuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZEF0dHJpYnV0ZShxbmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZENoaWxkRWxlbWVudChxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFFOYW1lIGNyZWF0ZVFOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVFOYW1lKGxvY2FsTmFtZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QWxsQXR0cmlidXRlc0FzUU5hbWVzKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QWxsQXR0cmlidXRlc0FzUU5hbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShRTmFtZSBxbmFtZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlVmFsdWUocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEVsZW1lbnRzKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRDaGlsZEVsZW1lbnRzKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVBdHRyaWJ1dGUocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBzZXRFbGVtZW50UU5hbWUoUU5hbWUgbmV3TmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuc2V0RWxlbWVudFFOYW1lKG5ld05hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9EZXRhaWxJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovRGV0YWlsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA1NWVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9EZXRhaWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHREZXRhaWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWxFbnRyeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQSBjb250YWluZXIgZm9yIDxjb2RlPkRldGFpbEVudHJ5PC9jb2RlPiBvYmplY3RzLiA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0cyBnaXZlIGRldGFpbGVkCi0gKiBlcnJvciBpbmZvcm1hdGlvbiB0aGF0IGlzIGFwcGxpY2F0aW9uLXNwZWNpZmljIGFuZCByZWxhdGVkIHRvIHRoZSA8Y29kZT5TT0FQQm9keTwvY29kZT4gb2JqZWN0Ci0gKiB0aGF0IGNvbnRhaW5zIGl0LgotICogPHAvPgotICogQSA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdCwgd2hpY2ggaXMgcGFydCBvZiBhIDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0LCBjYW4gYmUgcmV0cmlldmVkCi0gKiB1c2luZyB0aGUgbWV0aG9kIDxjb2RlPlNPQVBGYXVsdC5nZXREZXRhaWw8L2NvZGU+LiBUaGUgPGNvZGU+RGV0YWlsPC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgdHdvCi0gKiBtZXRob2RzLiBPbmUgY3JlYXRlcyBhIG5ldyA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0IGFuZCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRkcyBpdCB0byB0aGUKLSAqIDxjb2RlPkRldGFpbDwvY29kZT4gb2JqZWN0LiBUaGUgc2Vjb25kIG1ldGhvZCBnZXRzIGEgbGlzdCBvZiB0aGUgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdHMKLSAqIGNvbnRhaW5lZCBpbiBhIDxjb2RlPkRldGFpbDwvY29kZT4gb2JqZWN0LgotICogPHAvPgotICogVGhlIGZvbGxvd2luZyBjb2RlIGZyYWdtZW50LCBpbiB3aGljaCA8aT5zZjwvaT4gaXMgYSA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCwgZ2V0cyBpdHMKLSAqIDxjb2RlPkRldGFpbDwvY29kZT4gb2JqZWN0ICg8aT5kPC9pPiksIGFkZHMgYSBuZXcgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdCB0byA8aT5kPC9pPiwKLSAqIGFuZCB0aGVuIGdldHMgYSBsaXN0IG9mIGFsbCB0aGUgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdHMgaW4gPGk+ZDwvaT4uIFRoZSBjb2RlIGFsc28KLSAqIGNyZWF0ZXMgYSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgdG8gcGFzcyB0byB0aGUgbWV0aG9kIDxjb2RlPmFkZERldGFpbEVudHJ5PC9jb2RlPi4gVGhlCi0gKiB2YXJpYWJsZSA8aT5zZTwvaT4sIHVzZWQgdG8gY3JlYXRlIHRoZSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QsIGlzIGEgPGNvZGU+U09BUEVudmVsb3BlPC9jb2RlPgotICogb2JqZWN0LiA8UFJFPiBEZXRhaWwgZCA9IHNmLmdldERldGFpbCgpOyBOYW1lIG5hbWUgPSBzZS5jcmVhdGVOYW1lKCJHZXRMYXN0VHJhZGVQcmljZSIsICJXT01CQVQiLAotICogImh0dHA6Ly93d3cud29tYmF0Lm9yZy90cmFkZXIiKTsgZC5hZGREZXRhaWxFbnRyeShuYW1lKTsgSXRlcmF0b3IgaXQgPSBkLmdldERldGFpbEVudHJpZXMoKTsKLSAqIDwvUFJFPgotICovCi1wdWJsaWMgY2xhc3MgRGV0YWlsSW1wbCBleHRlbmRzIFNPQVBGYXVsdEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGV0YWlsIHsKLQotLy8gICAgcHJpdmF0ZSBTT0FQRmF1bHREZXRhaWwgZmF1bHREZXRhaWw7Ci0KLSAgICAvKiogQHBhcmFtIGVsZW1lbnQgICovCi0gICAgcHVibGljIERldGFpbEltcGwoU09BUEZhdWx0RGV0YWlsIGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoKEVsZW1lbnRJbXBsKWVsZW1lbnQpOwotLy8gICAgICAgIGZhdWx0RGV0YWlsID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRldGFpbEVudHJ5PC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgYWRkcyBpdCB0byB0aGlzCi0gICAgICogPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBpZGVudGlmeWluZyB0aGUgbmV3IDxjb2RlPkRldGFpbEVudHJ5PC9jb2RlPiBvYmplY3QKLSAgICAgKiBAcmV0dXJuIERldGFpbEVudHJ5LgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiB0aHJvd24gd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gYWRkaW5nIGEgRGV0YWlsRW50cnkgb2JqZWN0IHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgRGV0YWlsIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGV0YWlsRW50cnkgYWRkRGV0YWlsRW50cnkoTmFtZSBuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbGVtZW50SW1wbCBjaGlsZEVsZW1lbnQgPSAoU09BUEVsZW1lbnRJbXBsKWFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgRGV0YWlsRW50cnlJbXBsIGRldGFpbEVudHJ5ID0gbmV3IERldGFpbEVudHJ5SW1wbChjaGlsZEVsZW1lbnQuZWxlbWVudCk7Ci0gICAgICAgIGNoaWxkRWxlbWVudC5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgZGV0YWlsRW50cnksIG51bGwpOwotICAgICAgICByZXR1cm4gZGV0YWlsRW50cnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGxpc3Qgb2YgdGhlIGRldGFpbCBlbnRyaWVzIGluIHRoaXMgPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvYmplY3Qgb3ZlciB0aGUgPGNvZGU+RGV0YWlsRW50cnk8L2NvZGU+IG9iamVjdHMgaW4gdGhpcwotICAgICAqICAgICAgICAgPGNvZGU+RGV0YWlsPC9jb2RlPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0RGV0YWlsRW50cmllcygpIHsKLSAgICAgICAgZmluYWwgSXRlcmF0b3IgZGV0YWlsRW50cmllc0l0ZXIgPSBlbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBkZXRhaWxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoZGV0YWlsRW50cmllc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBkZXRhaWxzLmFkZChuZXcgRGV0YWlsRW50cnlJbXBsKChFbGVtZW50SW1wbClkZXRhaWxFbnRyaWVzSXRlci5uZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGV0YWlscy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgRGV0YWlsRW50cnkgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGFkZHMgaXQgdG8gdGhpcyBEZXRhaWwgb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgLSBhIE5hbWUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBuZXcgRGV0YWlsRW50cnkgb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gdGhyb3duIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtIGluIGFkZGluZyBhIERldGFpbEVudHJ5IG9iamVjdCB0byB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIERldGFpbCBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIERldGFpbEVudHJ5IGFkZERldGFpbEVudHJ5KFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbGVtZW50SW1wbCBjaGlsZEVsZW1lbnQgPSAoU09BUEVsZW1lbnRJbXBsKWFkZENoaWxkRWxlbWVudChxbmFtZSk7Ci0gICAgICAgIERldGFpbEVudHJ5SW1wbCBkZXRhaWxFbnRyeSA9IG5ldyBEZXRhaWxFbnRyeUltcGwoY2hpbGRFbGVtZW50LmVsZW1lbnQpOwotICAgICAgICBjaGlsZEVsZW1lbnQuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGRldGFpbEVudHJ5LCBudWxsKTsKLSAgICAgICAgcmV0dXJuIGRldGFpbEVudHJ5OwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRBdHRyaWJ1dGUoUU5hbWUgcW5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkQXR0cmlidXRlKHFuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGRFbGVtZW50KHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlUU5hbWUobG9jYWxOYW1lLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVWYWx1ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENoaWxkRWxlbWVudHMocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50UU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHNldEVsZW1lbnRRTmFtZShRTmFtZSBuZXdOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRFbGVtZW50UU5hbWUobmV3TmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01lc3NhZ2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGE0ZGE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9NZXNzYWdlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIDxQPkEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdHMuPC9QPgotICogPHAvPgotICogPFA+QSBKQVhNIGNsaWVudCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGNyZWF0ZSBhIG1lc3NhZ2UuPC9QPgotICogPHAvPgotICogPFVMPiA8TEk+IENyZWF0ZXMgYSA8Q09ERT5NZXNzYWdlRmFjdG9yeTwvQ09ERT4gb2JqZWN0IGZyb20gYSA8Q09ERT4gUHJvdmlkZXJDb25uZWN0aW9uPC9DT0RFPgotICogb2JqZWN0ICg8Q09ERT5jb248L0NPREU+IGluIHRoZSBmb2xsb3dpbmcgbGluZSBvZiBjb2RlKS4gVGhlIDxDT0RFPlN0cmluZzwvQ09ERT4gcGFzc2VkIHRvIHRoZQotICogPENPREU+Y3JlYXRlTWVzc2FnZUZhY3Rvcnk8L0NPREU+IG1ldGhvZCBpcyB0aGUgbmFtZSBvZiBvZiBhIG1lc3NhZ2luZyBwcm9maWxlLCB3aGljaCBtdXN0IGJlIHRoZQotICogVVJMIGZvciB0aGUgc2NoZW1hLiA8UFJFPiBNZXNzYWdlRmFjdG9yeSBtZiA9IGNvbi5jcmVhdGVNZXNzYWdlRmFjdG9yeShzY2hlbWFVUkwpOyA8L1BSRT4gPC9MST4KLSAqIDxwLz4KLSAqIDxMST4gQ2FsbHMgdGhlIG1ldGhvZCA8Q09ERT5jcmVhdGVNZXNzYWdlPC9DT0RFPiBvbiB0aGUgPENPREU+IE1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBvYmplY3QuIEFsbAotICogbWVzc2FnZXMgcHJvZHVjZWQgYnkgdGhpcyA8Q09ERT5NZXNzYWdlRmFjdG9yeTwvQ09ERT4gb2JqZWN0IHdpbGwgaGF2ZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uCi0gKiBhcHByb3ByaWF0ZSBmb3IgdGhlIG1lc3NhZ2luZyBwcm9maWxlIHRoYXQgd2FzIHNwZWNpZmllZCB3aGVuIHRoZSA8Q09ERT5NZXNzYWdlRmFjdG9yeTwvQ09ERT4KLSAqIG9iamVjdCB3YXMgY3JlYXRlZC4gPFBSRT4gU09BUE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsgPC9QUkU+IDwvTEk+IDwvVUw+IEl0IGlzIGFsc28KLSAqIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBvYmplY3QgdXNpbmcgdGhlIG1ldGhvZAotICogPENPREU+bmV3SW5zdGFuY2U8L0NPREU+LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGxpbmUgb2YgY29kZS4gPFBSRT4gTWVzc2FnZUZhY3RvcnkgbWYgPQotICogTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsgPC9QUkU+IEEgc3RhbmRhbG9uZSBjbGllbnQgKGEgY2xpZW50IHRoYXQgaXMgbm90IHJ1bm5pbmcgaW4gYQotICogY29udGFpbmVyKSBjYW4gdXNlIHRoZSA8Q09ERT5uZXdJbnN0YW5jZTwvQ09ERT4gbWV0aG9kIHRvIGNyZWF0ZSBhIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPgotICogb2JqZWN0LgotICogPHAvPgotICogPFA+QWxsIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBvYmplY3RzLCByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBjcmVhdGVkLCB3aWxsIHByb2R1Y2UKLSAqIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3RzIHRoYXQgaGF2ZSB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGJ5IGRlZmF1bHQ6PC9QPgotICogPHAvPgotICogPFVMPiA8TEk+QSA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0PC9MST4KLSAqIDxwLz4KLSAqIDxMST5BIDxDT0RFPlNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0PC9MST4KLSAqIDxwLz4KLSAqIDxMST5BIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3Q8L0xJPgotICogPHAvPgotICogPExJPkEgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0PC9MST4gPC9VTD4gSWYgYSA8Q09ERT5NZXNzYWdlRmFjdG9yeTwvQ09ERT4gb2JqZWN0IHdhcwotICogY3JlYXRlZCB1c2luZyBhIDxDT0RFPlByb3ZpZGVyQ29ubmVjdGlvbjwvQ09ERT4gb2JqZWN0LCB3aGljaCBtZWFucyB0aGF0IGl0IHdhcyBpbml0aWFsaXplZCB3aXRoCi0gKiBhIHNwZWNpZmllZCBwcm9maWxlLCBpdCB3aWxsIHByb2R1Y2UgbWVzc2FnZXMgdGhhdCBhbHNvIGNvbWUgcHJlcG9wdWxhdGVkIHdpdGggYWRkaXRpb25hbCBlbnRyaWVzCi0gKiBpbiB0aGUgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0IGFuZCB0aGUgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdC4gVGhlIGNvbnRlbnQgb2YgYSBuZXcKLSAqIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgZGVwZW5kcyBvbiB3aGljaCBvZiB0aGUgdHdvIDxDT0RFPk1lc3NhZ2VGYWN0b3J5PC9DT0RFPiBtZXRob2RzCi0gKiBpcyB1c2VkIHRvIGNyZWF0ZSBpdC4KLSAqIDxwLz4KLSAqIDxVTD4gPExJPjxDT0RFPmNyZWF0ZU1lc3NhZ2UoKTwvQ09ERT4gLS0gbWVzc2FnZSBoYXMgbm8gY29udGVudDxCUj4gVGhpcyBpcyB0aGUgbWV0aG9kIGNsaWVudHMKLSAqIHdvdWxkIG5vcm1hbGx5IHVzZSB0byBjcmVhdGUgYSByZXF1ZXN0IG1lc3NhZ2UuPC9MST4KLSAqIDxwLz4KLSAqIDxMST48Q09ERT5jcmVhdGVNZXNzYWdlKE1pbWVIZWFkZXJzLCBqYXZhLmlvLklucHV0U3RyZWFtKTwvQ09ERT4gLS0gbWVzc2FnZSBoYXMgY29udGVudCBmcm9tIHRoZQotICogPENPREU+SW5wdXRTdHJlYW08L0NPREU+IG9iamVjdCBhbmQgaGVhZGVycyBmcm9tIHRoZSA8Q09ERT4gTWltZUhlYWRlcnM8L0NPREU+IG9iamVjdDxCUj4gVGhpcwotICogbWV0aG9kIGNhbiBiZSB1c2VkIGludGVybmFsbHkgYnkgYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSBhIG1lc3NhZ2UgdGhhdCBpcyBhIHJlc3BvbnNlCi0gKiB0byBhIHJlcXVlc3QuPC9MST4gPC9VTD4KLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VGYWN0b3J5SW1wbCBleHRlbmRzIE1lc3NhZ2VGYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgc29hcFZlcnNpb24gPSBTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgPENPREU+U09BUFBhcnQ8L0NPREU+LAotICAgICAqIDxDT0RFPlNPQVBFbnZlbG9wZTwvQ09ERT4sIDxDT0RFPlNPQVBCb2R5PC9DT0RFPiwgYW5kIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdHMuCi0gICAgICogUHJvZmlsZS1zcGVjaWZpYyBtZXNzYWdlIGZhY3RvcmllcyBjYW4gY2hvb3NlIHRvIHByZXBvcHVsYXRlIHRoZSA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4KLSAgICAgKiBvYmplY3Qgd2l0aCBwcm9maWxlLXNwZWNpZmljIGhlYWRlcnMuCi0gICAgICogPHAvPgotICAgICAqIDxQPkNvbnRlbnQgY2FuIGJlIGFkZGVkIHRvIHRoaXMgbWVzc2FnZSdzIDxDT0RFPiBTT0FQUGFydDwvQ09ERT4gb2JqZWN0LCBhbmQgdGhlIG1lc3NhZ2UgY2FuCi0gICAgICogYmUgc2VudCAiYXMgaXMiIHdoZW4gYSBtZXNzYWdlIGNvbnRhaW5pbmcgb25seSBhIFNPQVAgcGFydCBpcyBzdWZmaWNpZW50LiBPdGhlcndpc2UsIHRoZQotICAgICAqIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgbmVlZHMgdG8gY3JlYXRlIG9uZSBvciBtb3JlIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPgotICAgICAqIG9iamVjdHMgYW5kIGFkZCB0aGVtIHRvIGl0c2VsZi4gQW55IGNvbnRlbnQgdGhhdCBpcyBub3QgaW4gWE1MIGZvcm1hdCBtdXN0IGJlIGluIGFuCi0gICAgICogPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdC48L1A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgYSBTT0FQIGVycm9yIG9jY3VycyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgb2YgdGhpcyBNZXNzYWdlRmFjdG9yeSBpbnN0YW5jZSBpcyBEWU5BTUlDX1NPQVBfUFJPVE9DT0wKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlSW1wbCBzb2FwRW52ZWxvcGU7Ci0gICAgICAgIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkpIHsKLSAgICAgICAgICAgIHNvYXBFbnZlbG9wZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQRW52ZWxvcGVJbXBsKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU09BUDEyRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb2FwVmVyc2lvbi5lcXVhbHMoU09BUENvbnN0YW50cy5EWU5BTUlDX1NPQVBfUFJPVE9DT0wpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNyZWF0ZU1lc3NhZ2UoKSBpcyBub3Qgc3VwcG9ydGVkIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgIkRZTkFNSUNfU09BUF9QUk9UT0NPTCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy9TT0FQIDEuMQotICAgICAgICAgICAgc29hcEVudmVsb3BlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVBFbnZlbG9wZUltcGwoKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTFGYWN0b3J5KCkuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBNZXNzYWdlSW1wbCBzb2FwTWVzc2FnZSA9IG5ldyBTT0FQTWVzc2FnZUltcGwoc29hcEVudmVsb3BlKTsKLSAgICAgICAgc29hcE1lc3NhZ2Uuc2V0U2F2ZVJlcXVpcmVkKCk7Ci0gICAgICAgIHJldHVybiBzb2FwTWVzc2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbGl6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiA8Q09ERT4gSW5wdXRTdHJlYW08L0NPREU+IG9iamVjdCBpbnRvIGEgbmV3Ci0gICAgICogPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBhbmQgcmV0dXJucyB0aGUgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtaW1laGVhZGVycyB0aGUgdHJhbnNwb3J0LXNwZWNpZmljIGhlYWRlcnMgcGFzc2VkIHRvIHRoZSBtZXNzYWdlIGluIGEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LWluZGVwZW5kZW50IGZhc2hpb24gZm9yIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIGlucHV0c3RyZWFtIHRoZSA8Q09ERT5JbnB1dFN0cmVhbTwvQ09ERT4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIGEgbWVzc2FnZQotICAgICAqIEByZXR1cm4gYSBuZXcgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuCi0gICAgICogICAgICAgICA8Q09ERT5JbnB1dFN0cmVhbTwvQ09ERT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiByZWFkaW5nIGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShNaW1lSGVhZGVycyBtaW1laGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUE1lc3NhZ2VJbXBsIHNvYXBNZXNzYWdlID0gbmV3IFNPQVBNZXNzYWdlSW1wbChpbnB1dHN0cmVhbSwgbWltZWhlYWRlcnMpOwotICAgICAgICBzb2FwTWVzc2FnZS5zZXRTYXZlUmVxdWlyZWQoKTsKLSAgICAgICAgcmV0dXJuIHNvYXBNZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNPQVBWZXJzaW9uKFN0cmluZyBzb2FwVmVyc2lvbikgewotICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gc29hcFZlcnNpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01pbWVIZWFkZXJzRXguamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9NaW1lSGVhZGVyc0V4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYjZiMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01pbWVIZWFkZXJzRXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNaW1lSGVhZGVyc0V4IGV4dGVuZHMgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnMgewotICAgIHB1YmxpYyBNaW1lSGVhZGVyc0V4KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBNaW1lSGVhZGVyc0V4KGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWltZUhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNaW1lSGVhZGVyIGhkciA9IChNaW1lSGVhZGVyKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGFkZEhlYWRlcihoZHIuZ2V0TmFtZSgpLCBoZHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZUltcGxFeC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL05vZGVJbXBsRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5ZDNjMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZUltcGxFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEJvZHlJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5UeXBlSW5mbzsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgbm9kZSAoZWxlbWVudCkgaW4gYSBET00gcmVwcmVzZW50YXRpb24gb2YgYW4gWE1MIGRvY3VtZW50IHRoYXQgcHJvdmlkZXMKLSAqIHNvbWUgdHJlZSBtYW5pcHVsYXRpb24gbWV0aG9kcy4gVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyBmb3IgZ2V0dGluZyB0aGUgdmFsdWUgb2YgYSBub2RlLAotICogZm9yIGdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHBhcmVudCBvZiBhIG5vZGUsIGFuZCBmb3IgcmVtb3ZpbmcgYSBub2RlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUltcGxFeCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm9kZSB7Ci0KLSAgICAvKiogQHBhcmFtIGZhY3RvcnkgICovCi0gICAgcHJvdGVjdGVkIE5vZGVJbXBsRXgoT01GYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgc3VwZXIoZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNPQVBFbGVtZW50IHBhcmVudEVsZW1lbnQ7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTQUFKX05PREUgPSAic2Fhai5ub2RlIjsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgZnJvbSB0aGUgdHJlZS4gT25jZSByZW1vdmVkLCB0aGlzIG5vZGUgY2FuIGJlIGdhcmJhZ2UKLSAgICAgKiBjb2xsZWN0ZWQgaWYgdGhlcmUgYXJlIG5vIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMgdG8gaXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGV0YWNoTm9kZSgpIHsKLSAgICAgICAgdGhpcy5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01Ob2RlIGRldGFjaCgpIHsKLSAgICAgICAgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgZnJvbSB0aGUgdHJlZS4gT25jZSByZW1vdmVkLCB0aGlzIG5vZGUgY2FuIGJlIGdhcmJhZ2UKLSAgICAgKiBjb2xsZWN0ZWQgaWYgdGhlcmUgYXJlIG5vIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMgdG8gaXQuCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9NQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuIChPTUNvbnRhaW5lcil0aGlzLnBhcmVudEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyogcHVibGljIE9NTm9kZSBnZXRPTU5vZGUoKSB7Ci0gICAgICAgIHJldHVybiBvbU5vZGU7Ci0gICAgfSovCi0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aGUgdmFsdWUgb2YgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+IG9iamVjdCBpZiBhIGNoaWxkCi0gICAgICogZXhpc3RzIGFuZCBpdHMgdmFsdSBlIGlzIHRleHQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB3aXRoIHRoZSB0ZXh0IG9mIHRoZSBpbW1lZGlhdGUgY2hpbGQgb2YgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPgotICAgICAqICAgICAgICAgb2JqZWN0IGlmICgxKSB0aGVyZSBpcyBhIGNoaWxkIGFuZCAoMikgdGhlIGNoaWxkIGlzIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0OwotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChOb2RlSW1wbEV4KSgoKE9NRWxlbWVudCl0aGlzKS5nZXRGaXJzdE9NQ2hpbGQoKSkpLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTm90aWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIHRoYXQgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgdGhlCi0gICAgICogYXBwbGljYXRpb24gYW5kIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gcmV1c2UgdGhpcyBvYmplY3QgZm9yIG5vZGVzIHRoYXQgbWF5IGJlCi0gICAgICogY3JlYXRlZCBsYXRlci4KLSAgICAgKiA8cC8+Ci0gICAgICogQ2FsbGluZyB0aGUgbWV0aG9kIDxjb2RlPnJlY3ljbGVOb2RlPC9jb2RlPiBpbXBsaWVzIHRoYXQgdGhlIG1ldGhvZCA8Y29kZT5kZXRhY2hOb2RlPC9jb2RlPgotICAgICAqIGhhcyBiZWVuIGNhbGxlZCBwcmV2aW91c2x5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlY3ljbGVOb2RlKCkgewotICAgICAgICAvLyBObyBjb3JyZXNwb25kaW5nIGltcGxlbWVudGF0aW9uIGluIE9NCi0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIGluIEF4aXMgMS4yIGFsc28KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgdG8gdGhlIGdpdmVuIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPgotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgdG8gYmUgc2V0IGFzIHRoZSBwYXJlbnQgb2YgdGhpcwotICAgICAqICAgICAgICAgICAgICAgPGNvZGU+Tm9kZTwvY29kZT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiBzZXR0aW5nIHRoZSBwYXJlbnQgdG8gdGhlIGdpdmVuIGVsZW1lbnQKLSAgICAgKiBAc2VlICNnZXRQYXJlbnRFbGVtZW50KCkgZ2V0UGFyZW50RWxlbWVudCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5vZGVUeXBlKSB0aHJvd3MgT01FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGVUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFR5cGVJbmZvIGdldFNjaGVtYVR5cGVJbmZvKCkgewotICAgICAgICAvLyBUT0RPIC0gRml4bWUuCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlKFN0cmluZyBuYW1lLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIC0gRml4bWUuCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElkQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgYm9vbGVhbiBpc0lkKQotICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIFRPRE8gLSBGaXhtZS4KLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUT0RPIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIC0gRml4bWUuCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIG9yIGV4dHJhY3RzIHRoZSBTQUFKIG5vZGUgZnJvbSB0aGUgZ2l2ZW4gRE9NIE5vZGUgKGRvbU5vZGUpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZG9tTm9kZQotICAgICAqIEByZXR1cm4gdGhlIFNBQUogTm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkb21Ob2RlCi0gICAgICovCi0gICAgamF2YXgueG1sLnNvYXAuTm9kZSB0b1NBQUpOb2RlKG9yZy53M2MuZG9tLk5vZGUgZG9tTm9kZSkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShkb21Ob2RlLCB0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgb3IgZXh0cmFjdHMgdGhlIFNBQUogbm9kZSBmcm9tIHRoZSBnaXZlbiBET00gTm9kZSAoZG9tTm9kZSkKLSAgICAgKgotICAgICAqIEBwYXJhbSBkb21Ob2RlCi0gICAgICogQHJldHVybiB0aGUgU0FBSiBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRvbU5vZGUKLSAgICAgKi8KLSAgICBzdGF0aWMgamF2YXgueG1sLnNvYXAuTm9kZSB0b1NBQUpOb2RlKG9yZy53M2MuZG9tLk5vZGUgZG9tTm9kZSwgTm9kZSBwYXJlbnROb2RlKSB7Ci0gICAgICAgIGlmIChkb21Ob2RlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIE5vZGUgc2Fhak5vZGUgPSAoTm9kZSkoKE5vZGVJbXBsKWRvbU5vZGUpLmdldFVzZXJEYXRhKFNBQUpfTk9ERSk7Ci0gICAgICAgIGlmIChzYWFqTm9kZSA9PSBudWxsKSB7ICAvLyBpZiBTQUFKIG5vZGUgaGFzIG5vdCBiZWVuIHNldCBpbiB1c2VyRGF0YSwgdHJ5IHRvIGNvbnN0cnVjdCBpdAotICAgICAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUyKGRvbU5vZGUsIHBhcmVudE5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHVwZGF0ZSBzaWJsaW5ncyBmb3IgdGV4dCBub2RlcwotICAgICAgICBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLlRleHQgfHwgZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLkNvbW1lbnQpIHsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgcHJldlNpYmxpbmdET01Ob2RlID0gZG9tTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgbmV4dFNpYmxpbmdET01Ob2RlID0gZG9tTm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBUZXh0SW1wbEV4IHNhYWpUZXh0Tm9kZSA9IChUZXh0SW1wbEV4KXNhYWpOb2RlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzYWFqVGV4dE5vZGUuc2V0UHJldmlvdXNTaWJsaW5nKHByZXZTaWJsaW5nRE9NTm9kZSk7Ci0gICAgICAgICAgICBzYWFqVGV4dE5vZGUuc2V0TmV4dFNpYmxpbmcobmV4dFNpYmxpbmdET01Ob2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Fhak5vZGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgamF2YXgueG1sLnNvYXAuTm9kZSB0b1NBQUpOb2RlMihvcmcudzNjLmRvbS5Ob2RlIGRvbU5vZGUsIE5vZGUgcGFyZW50Tm9kZSkgewotICAgICAgICBpZiAoZG9tTm9kZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLlRleHQpIHsKLSAgICAgICAgICAgIFRleHQgdGV4dCA9IChUZXh0KWRvbU5vZGU7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIHByZXZTaWJsaW5nRE9NTm9kZSA9IHRleHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIG5leHRTaWJsaW5nRE9NTm9kZSA9IHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50SW1wbCBwYXJlbnQgPSBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClkb21Ob2RlLmdldFBhcmVudE5vZGUoKSk7Ci0gICAgICAgICAgICBUZXh0SW1wbEV4IHNhYWpUZXh0Tm9kZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0SW1wbEV4KHRleHQuZ2V0RGF0YSgpLCBwYXJlbnQsIHByZXZTaWJsaW5nRE9NTm9kZSwgbmV4dFNpYmxpbmdET01Ob2RlKTsKLSAgICAgICAgICAgICgoTm9kZUltcGwpZG9tTm9kZSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqVGV4dE5vZGUsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpUZXh0Tm9kZTsKLSAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uQ29tbWVudCkgewotICAgICAgICAgICAgQ29tbWVudCBjb21tZW50ID0gKENvbW1lbnQpZG9tTm9kZTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgcHJldlNpYmxpbmdET01Ob2RlID0gY29tbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgbmV4dFNpYmxpbmdET01Ob2RlID0gY29tbWVudC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgU09BUEVsZW1lbnRJbXBsIHBhcmVudCA9IG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIENvbW1lbnRJbXBsIHNhYWpUZXh0Tm9kZSA9IG5ldyBDb21tZW50SW1wbChjb21tZW50LmdldERhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBwcmV2U2libGluZ0RPTU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTaWJsaW5nRE9NTm9kZSk7Ci0gICAgICAgICAgICAoKE5vZGVJbXBsKWRvbU5vZGUpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalRleHROb2RlLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqVGV4dE5vZGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQQm9keUltcGwpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQQm9keUltcGwgZG9vbVNPQVBCb2R5ID0gKFNPQVBCb2R5SW1wbClkb21Ob2RlOwotICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEJvZHkgc2FhalNPQVBCb2R5ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQQm9keUltcGwoZG9vbVNPQVBCb2R5KTsKLSAgICAgICAgICAgIGRvb21TT0FQQm9keS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQQm9keSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhalNPQVBCb2R5OwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBFbnZlbG9wZUltcGwgZG9vbVNPQVBFbnYKLSAgICAgICAgICAgICAgICAgICAgPSAoU09BUEVudmVsb3BlSW1wbClkb21Ob2RlOwotICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHNhYWpFbnZlbG9wZQotICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEVudmVsb3BlSW1wbChkb29tU09BUEVudik7Ci0gICAgICAgICAgICBkb29tU09BUEVudi5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpFbnZlbG9wZSwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhakVudmVsb3BlOwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0Tm9kZUltcGwpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHROb2RlSW1wbCBkb29tU09BUEZhdWx0Tm9kZQotICAgICAgICAgICAgICAgICAgICA9IChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0Tm9kZUltcGwpZG9tTm9kZTsKLSAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdEVsZW1lbnQgc2FhalNPQVBGYXVsdEVsZQotICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEZhdWx0RWxlbWVudEltcGwoZG9vbVNPQVBGYXVsdE5vZGUpOwotICAgICAgICAgICAgZG9vbVNPQVBGYXVsdE5vZGUuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqU09BUEZhdWx0RWxlLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEZhdWx0RWxlOwotICAgICAgICB9IGVsc2UgaWYgKGRvbU5vZGUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0RGV0YWlsSW1wbCkgewotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBGYXVsdERldGFpbEltcGwgZG9vbVNPQVBGYXVsdERldGFpbAotICAgICAgICAgICAgICAgICAgICA9IChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEZhdWx0RGV0YWlsSW1wbClkb21Ob2RlOwotICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuRGV0YWlsIHNhYWpEZXRhaWwKLSAgICAgICAgICAgICAgICAgICAgPSBuZXcgb3JnLmFwYWNoZS5heGlzMi5zYWFqLkRldGFpbEltcGwoZG9vbVNPQVBGYXVsdERldGFpbCk7Ci0gICAgICAgICAgICBkb29tU09BUEZhdWx0RGV0YWlsLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhakRldGFpbCwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gc2FhakRldGFpbDsKLSAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBGYXVsdEltcGwpIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHRJbXBsIGRvb21TT0FQRmF1bHQKLSAgICAgICAgICAgICAgICAgICAgPSAob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBGYXVsdEltcGwpZG9tTm9kZTsKLSAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCBzYWFqU09BUEZhdWx0Ci0gICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRmF1bHRJbXBsKGRvb21TT0FQRmF1bHQpOwotICAgICAgICAgICAgZG9vbVNPQVBGYXVsdC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQRmF1bHQsIG51bGwpOwotICAgICAgICAgICAgcmV0dXJuIHNhYWpTT0FQRmF1bHQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQSGVhZGVyQmxvY2tJbXBsKSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEhlYWRlckJsb2NrSW1wbCBkb29tU09BUEhlYWRlckJsb2NrCi0gICAgICAgICAgICAgICAgICAgID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQSGVhZGVyQmxvY2tJbXBsKWRvbU5vZGU7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudCBzYWFqU09BUEhlYWRlckVsZQotICAgICAgICAgICAgICAgICAgICA9IG5ldyBvcmcuYXBhY2hlLmF4aXMyLnNhYWouU09BUEhlYWRlckVsZW1lbnRJbXBsKGRvb21TT0FQSGVhZGVyQmxvY2spOwotICAgICAgICAgICAgZG9vbVNPQVBIZWFkZXJCbG9jay5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQSGVhZGVyRWxlLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEhlYWRlckVsZTsKLSAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBIZWFkZXJJbXBsKSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEhlYWRlckltcGwgZG9vbVNPQVBIZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgPSAob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBIZWFkZXJJbXBsKWRvbU5vZGU7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyIHNhYWpTT0FQSGVhZGVyCi0gICAgICAgICAgICAgICAgICAgID0gbmV3IG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQSGVhZGVySW1wbChkb29tU09BUEhlYWRlcik7Ci0gICAgICAgICAgICBkb29tU09BUEhlYWRlci5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQSGVhZGVyLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEhlYWRlcjsKLSAgICAgICAgfSBlbHNlIGlmIChkb21Ob2RlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Eb2N1bWVudEltcGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTXVzdCBiZSBhIFNPQVBFbnZlbG9wZQotICAgICAgICAgICAgaWYgKCEocGFyZW50Tm9kZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRW52ZWxvcGVJbXBsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Eb2N1bWVudEltcGwgZG9vbURvY3VtZW50Ci0gICAgICAgICAgICAgICAgPSAob3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Eb2N1bWVudEltcGwpZG9tTm9kZTsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5TT0FQRW52ZWxvcGVJbXBsIHNhYWpFbnYgPSAKLSAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlzMi5zYWFqLlNPQVBFbnZlbG9wZUltcGwpIHBhcmVudE5vZGU7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQUGFydCBzYWFqU09BUFBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHNhYWpFbnYuZ2V0U09BUFBhcnRQYXJlbnQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIGV4aXN0aW5nIFNPQVBQYXJ0Ci0gICAgICAgICAgICAgICAgc2FhalNPQVBQYXJ0ID0gc2FhakVudi5nZXRTT0FQUGFydFBhcmVudCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgTWVzc2FnZSBhbmQgU09BUFBhcnQKLSAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZUltcGwgc2FhalNPQVBNZXNzYWdlID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU09BUE1lc3NhZ2VJbXBsKHNhYWpFbnYpOwotICAgICAgICAgICAgICAgIHNhYWpTT0FQUGFydCA9IHNhYWpTT0FQTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBkb21Ob2RlLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBQYXJ0LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUFBhcnQ7Ci0gICAgICAgIH0gZWxzZSB7IC8vIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlzMi5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbAotICAgICAgICAgICAgRWxlbWVudEltcGwgZG9vbUVsZW1lbnQgPSAoRWxlbWVudEltcGwpZG9tTm9kZTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50SW1wbCBzYWFqU09BUEVsZW1lbnQgPSBuZXcgU09BUEVsZW1lbnRJbXBsKGRvb21FbGVtZW50KTsKLSAgICAgICAgICAgIGRvb21FbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBFbGVtZW50LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZUxpc3RJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlY2RiZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL05vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhlIDxjb2RlPk5vZGVMaXN0PC9jb2RlPiBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGFic3RyYWN0aW9uIG9mIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBub2RlcywKLSAqIHdpdGhvdXQgZGVmaW5pbmcgb3IgY29uc3RyYWluaW5nIGhvdyB0aGlzIGNvbGxlY3Rpb24gaXMgaW1wbGVtZW50ZWQuIDxjb2RlPk5vZGVMaXN0PC9jb2RlPgotICogb2JqZWN0cyBpbiB0aGUgRE9NIGFyZSBsaXZlLiA8cD5UaGUgaXRlbXMgaW4gdGhlIDxjb2RlPk5vZGVMaXN0PC9jb2RlPiBhcmUgYWNjZXNzaWJsZSB2aWEgYW4KLSAqIGludGVncmFsIGluZGV4LCBzdGFydGluZyBmcm9tIDAuIDxwPlNlZSBhbHNvIHRoZSA8YSBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1Db3JlLTIwMDAxMTEzJz5Eb2N1bWVudAotICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgQ29yZSBTcGVjaWZpY2F0aW9uPC9hPi4KLSAqLwotcHVibGljIGNsYXNzIE5vZGVMaXN0SW1wbCBpbXBsZW1lbnRzIE5vZGVMaXN0IHsKLQotICAgIExpc3QgbU5vZGVzOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOb2RlTGlzdCBFTVBUWV9OT0RFTElTVCA9IG5ldyBOb2RlTGlzdEltcGwoCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQotICAgIC8qKiBDb25zdHJ1Y3RvciBhbmQgU2V0dGVyIGlzIGludGVuc2lvbmFsbHkgbWFkZSBwYWNrYWdlIGFjY2VzcyBvbmx5LiAqLwotICAgIE5vZGVMaXN0SW1wbCgpIHsKLSAgICAgICAgbU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIE5vZGVMaXN0SW1wbChMaXN0IG5vZGVzKSB7Ci0gICAgICAgIHRoaXMoKTsKLSAgICAgICAgbU5vZGVzLmFkZEFsbChub2Rlcyk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGROb2RlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSkgewotICAgICAgICBtTm9kZXMuYWRkKG5vZGUpOwotICAgIH0KLQotICAgIHZvaWQgYWRkTm9kZUxpc3Qob3JnLnczYy5kb20uTm9kZUxpc3Qgbm9kZXMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTm9kZXMuYWRkKG5vZGVzLml0ZW0oaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+aW5kZXg8L2NvZGU+dGggaXRlbSBpbiB0aGUgY29sbGVjdGlvbi4gSWYgPGNvZGU+aW5kZXg8L2NvZGU+IGlzIGdyZWF0ZXIKLSAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxpc3QsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCBpbnRvIHRoZSBjb2xsZWN0aW9uLgotICAgICAqIEByZXR1cm4gVGhlIG5vZGUgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPnRoIHBvc2l0aW9uIGluIHRoZSA8Y29kZT5Ob2RlTGlzdDwvY29kZT4sIG9yCi0gICAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzIG5vdCBhIHZhbGlkIGluZGV4LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0gICAgICAgIGlmIChtTm9kZXMgIT0gbnVsbCAmJiBtTm9kZXMuc2l6ZSgpID4gaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiAoTm9kZSltTm9kZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgbGlzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIGNoaWxkIG5vZGUgaW5kaWNlcyBpcyAwIHRvCi0gICAgICogPGNvZGU+bGVuZ3RoLTE8L2NvZGU+IGluY2x1c2l2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ob2Rlcy5zaXplKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovUHJlZml4ZWRRTmFtZS5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1ByZWZpeGVkUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2OWFlNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovUHJlZml4ZWRRTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotCi0vKioKLSAqIENsYXNzIFByZWZpeGVkIFFOYW1lCi0gKiA8cC8+Ci0gKiBUb29rIHRoaXMgaW1wbGVtZW50YXRpb24gZnJvbSBBeGlzIDEuMiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmaXhlZFFOYW1lIGltcGxlbWVudHMgTmFtZSB7Ci0gICAgLyoqIGNvbW1lbnQvc2hhcmVkIGVtcHR5IHN0cmluZyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIi5pbnRlcm4oKTsKLQotICAgIC8qKiBGaWVsZCBwcmVmaXggKi8KLSAgICBwcml2YXRlIFN0cmluZyBwcmVmaXg7Ci0gICAgLyoqIEZpZWxkIHFOYW1lICovCi0gICAgcHJpdmF0ZSBRTmFtZSBxTmFtZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIFByZWZpeGVkUU5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgICAqIEBwYXJhbSBwcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZml4ZWRRTmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHFOYW1lID0gbmV3IFFOYW1lKHVyaSwgbG9jYWxOYW1lKTsKLSAgICAgICAgdGhpcy5wcmVmaXggPSAocHJlZml4ID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyBFTVBUWV9TVFJJTkcKLSAgICAgICAgICAgICAgICA6IHByZWZpeC5pbnRlcm4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBQcmVmaXhlZFFOYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgUHJlZml4ZWRRTmFtZShRTmFtZSBxbmFtZSkgewotICAgICAgICB0aGlzLnFOYW1lID0gcW5hbWU7Ci0gICAgICAgIHRoaXMucHJlZml4ID0gKHFuYW1lLmdldFByZWZpeCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgPyBFTVBUWV9TVFJJTkcKLSAgICAgICAgICAgICAgICA6IHFuYW1lLmdldFByZWZpeCgpLmludGVybigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxvY2FsIG5hbWUgcGFydCBvZiB0aGUgWE1MIG5hbWUgdGhhdCB0aGlzIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCByZXByZXNlbnRzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhbCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotICAgICAgICByZXR1cm4gcU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lIG9mIHRoZSBYTUwgbmFtZSB0aGF0IHRoaXMgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0Ci0gICAgICogcmVwcmVzZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZXNwYWNlLXF1YWxpZmllZCBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4KTsKLSAgICAgICAgaWYgKCFwcmVmaXguZXF1YWxzKEVNUFRZX1NUUklORykpCi0gICAgICAgICAgICBidWYuYXBwZW5kKCc6Jyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQocU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBYTUwgbmFtZSB0aGF0IHRoaXMgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0Ci0gICAgICogcmVwcmVzZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgVVJJIGFzIGEgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotICAgICAgICByZXR1cm4gcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlZml4IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZXNwYWNlIGZvciB0aGUgWE1MIG5hbWUgdGhhdCB0aGlzIDxjb2RlPk5hbWU8L2NvZGU+Ci0gICAgICogb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByZWZpeCBhcyBhIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFByZWZpeGVkUU5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFxTmFtZS5lcXVhbHMoKChQcmVmaXhlZFFOYW1lKW9iaikucU5hbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIC8vSXMgdGhpcyBjb3JyZWN0PwotICAgICAgICAvL3JldHVybiBwcmVmaXguZXF1YWxzKCgoUHJlZml4ZWRRTmFtZSkgb2JqKS5wcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBwcmVmaXguaGFzaENvZGUoKSArIHFOYW1lLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpNZXRhRmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TQUFKTWV0YUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjQ4ZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpNZXRhRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU0FBSk1ldGFGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFNBQUpNZXRhRmFjdG9yeUltcGwgZXh0ZW5kcyBTQUFKTWV0YUZhY3RvcnkgewotICAgIHByb3RlY3RlZCBNZXNzYWdlRmFjdG9yeSBuZXdNZXNzYWdlRmFjdG9yeShTdHJpbmcgc29hcFZlcnNpb24pIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEoU09BUENvbnN0YW50cy5TT0FQXzFfMV9QUk9UT0NPTC5lcXVhbHMoc29hcFZlcnNpb24pIHx8Ci0gICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTC5lcXVhbHMoc29hcFZlcnNpb24pIHx8Ci0gICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5EWU5BTUlDX1NPQVBfUFJPVE9DT0wuZXF1YWxzKHNvYXBWZXJzaW9uKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJJbnZhbGlkIFNPQVAgUHJvdG9jb2wgVmVyc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5SW1wbCBmYWN0b3J5ID0gbmV3IE1lc3NhZ2VGYWN0b3J5SW1wbCgpOwotICAgICAgICBmYWN0b3J5LnNldFNPQVBWZXJzaW9uKHNvYXBWZXJzaW9uKTsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFNPQVBGYWN0b3J5IG5ld1NPQVBGYWN0b3J5KFN0cmluZyBzb2FwVmVyc2lvbikgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoIShTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MLmVxdWFscyhzb2FwVmVyc2lvbikgfHwKLSAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MLmVxdWFscyhzb2FwVmVyc2lvbikgfHwKLSAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLkRZTkFNSUNfU09BUF9QUk9UT0NPTC5lcXVhbHMoc29hcFZlcnNpb24pKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkludmFsaWQgU09BUCBQcm90b2NvbCBWZXJzaW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgU09BUEZhY3RvcnlJbXBsKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0U09BUFZlcnNpb24oc29hcFZlcnNpb24pOwotICAgICAgICByZXR1cm4gZmFjdG9yeTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlFbGVtZW50SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBCb2R5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3NzgyOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQm9keUVsZW1lbnRJbXBsIGV4dGVuZHMgU09BUEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEJvZHlFbGVtZW50IHsKLQotICAgIC8qKiBAcGFyYW0gZWxlbWVudCAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHlFbGVtZW50SW1wbChFbGVtZW50SW1wbCBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKGVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnQoU09BUEVsZW1lbnQgcGFyZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFyZW50IGlzIG5vdCBhIFNPQVBCb2R5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRBdHRyaWJ1dGUoUU5hbWUgcW5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkQXR0cmlidXRlKHFuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGRFbGVtZW50KHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlUU5hbWUobG9jYWxOYW1lLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVWYWx1ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENoaWxkRWxlbWVudHMocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50UU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHNldEVsZW1lbnRRTmFtZShRTmFtZSBuZXdOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRFbGVtZW50UU5hbWUobmV3TmFtZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBCb2R5SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBCb2R5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmVkM2QwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQm9keUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5hbWVzcGFjZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Ob2RlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmF1bHRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhdWx0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotcHVibGljIGNsYXNzIFNPQVBCb2R5SW1wbCBleHRlbmRzIFNPQVBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBCb2R5IHsKLQotICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBCb2R5IG9tU09BUEJvZHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzQm9keUVsZW1lbnRBZGRlZDsKLQotICAgIC8qKiBAcGFyYW0gb21TT0FQQm9keSAgKi8KLSAgICBwdWJsaWMgU09BUEJvZHlJbXBsKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keSBvbVNPQVBCb2R5KSB7Ci0gICAgICAgIHN1cGVyKChFbGVtZW50SW1wbClvbVNPQVBCb2R5KTsKLSAgICAgICAgdGhpcy5vbVNPQVBCb2R5ID0gb21TT0FQQm9keTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nKQotICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChvbVNPQVBCb2R5Lmhhc0ZhdWx0KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJBIFNPQVBGYXVsdCBoYXMgYmVlbiBhbHJlYWR5IGFkZGVkIHRvIHRoaXMgU09BUEJvZHkiKTsKLSAgICAgICAgfQotICAgICAgICBTT0FQQm9keUVsZW1lbnRJbXBsIGNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKSk7Ci0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGUuZWxlbWVudCk7Ci0gICAgICAgICgoTm9kZUltcGwpY2hpbGRFbGUuZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIGlzQm9keUVsZW1lbnRBZGRlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5hbWVzcGFjZSBub3QgZGVjbGFyZWQgZm9yIHRoZSBnaXZlIHByZWZpeDogIiArIHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEJvZHlFbGVtZW50SW1wbCBjaGlsZEVsZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbE5hbWUpKTsKLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXROYW1lc3BhY2UoY2hpbGRFbGUuZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG5hbWVzcGFjZVVSSSwgcHJlZml4KSk7Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGUuZWxlbWVudCk7Ci0gICAgICAgICgoTm9kZUltcGwpY2hpbGRFbGUuZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIGNoaWxkRWxlLnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBhcHBlbmRFbGVtZW50KEVsZW1lbnRJbXBsIGNoaWxkKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7ICAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBjaGlsZC5nZXRQcmVmaXgoKTsKLQotICAgICAgICBTT0FQQm9keUVsZW1lbnRJbXBsIGNoaWxkRWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoY2hpbGQpOwotCi0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXROYW1lc3BhY2UoY2hpbGRFbGUuZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG5hbWVzcGFjZVVSSSwgcHJlZml4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFNPQVBFbGVtZW50IHNvYXBFbGVtZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNvYXBFbGVtZW50LmdldFByZWZpeCgpOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgU09BUEJvZHlFbGVtZW50SW1wbCBjaGlsZEVsZTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY2hpbGRFbGUgPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KGxvY2FsTmFtZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKG5hbWVzcGFjZVVSSSwgcHJlZml4KTsKLSAgICAgICAgICAgIGNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSkpOyAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gc29hcEVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgY2hpbGRFbGUuYWRkQXR0cmlidXRlKG5hbWUsIHNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNvYXBFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGUuYWRkVGV4dE5vZGUoKChUZXh0KW8pLmdldERhdGEoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlLmFkZENoaWxkRWxlbWVudCgoU09BUEVsZW1lbnQpbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgY2hpbGRFbGUsIG51bGwpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0TmFtZXNwYWNlKGNoaWxkRWxlLmVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZShuYW1lc3BhY2VVUkksIHByZWZpeCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGUuZWxlbWVudCk7Ci0gICAgICAgICgoTm9kZUltcGwpY2hpbGRFbGUuZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIGNoaWxkRWxlLnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAob21TT0FQQm9keS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQSBTT0FQRmF1bHQgaGFzIGJlZW4gYWxyZWFkeSBhZGRlZCB0byB0aGlzIFNPQVBCb2R5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEJvZHlFbGVtZW50SW1wbCBjaGlsZEVsZTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8ICIiLmVxdWFscyh1cmkpKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZSA9IG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocHJlZml4ID09IG51bGwgfHwgIiIuZXF1YWxzKHByZWZpeCkpIHsKLSAgICAgICAgICAgIGNoaWxkRWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlModXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hpbGRFbGUgPSBuZXcgU09BUEJvZHlFbGVtZW50SW1wbCgKLSAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlModXJpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgY2hpbGRFbGUsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UodXJpLCBwcmVmaXgpKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgaXNCb2R5RWxlbWVudEFkZGVkID0gdHJ1ZTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhpcyA8Y29kZT5TT0FQQm9keTwvY29kZT4KLSAgICAgKiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdCBhZGRGYXVsdCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzQm9keUVsZW1lbnRBZGRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkEgU09BUEJvZHlFbGVtZW50IGhhcyBiZWVuIGFscmVhZHkgYWRkZWQgdG8gdGhpcyBTT0FQQm9keSIpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdEltcGwgc2FhalNPQVBGYXVsdCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIFNPQVAxMUZhdWx0SW1wbCBmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTFGYXVsdEltcGwob21TT0FQQm9keSwgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBzYWFqU09BUEZhdWx0ID0gbmV3IFNPQVBGYXVsdEltcGwoZmF1bHQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIFNPQVAxMkZhdWx0SW1wbCBmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTJGYXVsdEltcGwob21TT0FQQm9keSwgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBzYWFqU09BUEZhdWx0ID0gbmV3IFNPQVBGYXVsdEltcGwoZmF1bHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHNldCBkZWZhdWx0IGZhdWx0IGNvZGUgYW5kIHN0cmluZwotICAgICAgICBzYWFqU09BUEZhdWx0LnNldERlZmF1bHRzKCk7Ci0gICAgICAgIAotICAgICAgICAoKE5vZGVJbXBsKW9tU09BUEJvZHkuZ2V0RmF1bHQoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqU09BUEZhdWx0LCBudWxsKTsKLSAgICAgICAgcmV0dXJuIHNhYWpTT0FQRmF1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYSA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBleGlzdHMgaW4gdGhpcyA8Y29kZT5TT0FQQm9keTwvY29kZT4KLSAgICAgKiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QgZXhpc3RzIGluIHRoaXMKLSAgICAgKiAgICAgICAgIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIG9tU09BUEJvZHkuaGFzRmF1bHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBpbiB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdCBpbiB0aGlzIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0IGdldEZhdWx0KCkgewotICAgICAgICBpZiAob21TT0FQQm9keS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFNPQVBGYXVsdCl0b1NBQUpOb2RlKChvcmcudzNjLmRvbS5Ob2RlKW9tU09BUEJvZHkuZ2V0RmF1bHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYWRkcyBpdCB0byB0aGlzCi0gICAgICogPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGEgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIG5hbWUgZm9yIHRoZSBuZXcgPGNvZGU+U09BUEJvZHlFbGVtZW50PC9jb2RlPgotICAgICAqICAgICAgICAgICAgIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5TT0FQQm9keUVsZW1lbnQ8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiBhIFNPQVAgZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIFNPQVBCb2R5RWxlbWVudCBhZGRCb2R5RWxlbWVudChOYW1lIG5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTT0FQQm9keUVsZW1lbnQpYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhpcyA8Y29kZT5TT0FQQm9keTwvY29kZT4gb2JqZWN0LgotICAgICAqIFRoZSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiB3aWxsIGhhdmUgYSA8Y29kZT5mYXVsdGNvZGU8L2NvZGU+IGVsZW1lbnQgdGhhdCBpcyBzZXQgdG8gdGhlCi0gICAgICogPGNvZGU+ZmF1bHRDb2RlPC9jb2RlPiBwYXJhbWV0ZXIgYW5kIGEgPGNvZGU+ZmF1bHRzdHJpbmc8L2NvZGU+IHNldCB0bwotICAgICAqIDxjb2RlPmZhdWx0c3RyaW5nPC9jb2RlPiBhbmQgbG9jYWxpemVkIHRvIDxjb2RlPmxvY2FsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgYSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgZ2l2aW5nIHRoZSBmYXVsdCBjb2RlIHRvIGJlIHNldDsgbXVzdCBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGZhdWx0IGNvZGVzIGRlZmluZWQgaW4gdGhlIFNPQVAgMS4xIHNwZWNpZmljYXRpb24gYW5kIG9mIHR5cGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gZmF1bHRTdHJpbmcgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZmF1bHQKLSAgICAgKiBAcGFyYW0gbG9jYWxlICAgICAgYSA8Y29kZT5Mb2NhbGU8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBuYXRpdmUgbGFuZ3VhZ2Ugb2YgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgIDxvY2RlPmZhdWx0U3RyaW5nPC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Y29kZT5TT0FQRmF1bHQ8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEZhdWx0IGFkZEZhdWx0KE5hbWUgZmF1bHRDb2RlLCBTdHJpbmcgZmF1bHRTdHJpbmcsIExvY2FsZSBsb2NhbGUpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQgZmF1bHQ7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBmYXVsdCA9IG5ldyBTT0FQMTFGYXVsdEltcGwob21TT0FQQm9keSwgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcpLCAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhdWx0ID0gbmV3IFNPQVAxMkZhdWx0SW1wbChvbVNPQVBCb2R5LCBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyksIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBGYXVsdEltcGwgZmF1bHRJbXBsID0gbmV3IFNPQVBGYXVsdEltcGwoZmF1bHQpOwotICAgICAgICBmYXVsdEltcGwuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0KLSAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYXVsdEltcGwuc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcsIGxvY2FsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYXVsdEltcGwuc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhdWx0SW1wbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoaXMgPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdC4KLSAgICAgKiBUaGUgbmV3IDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gd2lsbCBoYXZlIGEgPGNvZGU+ZmF1bHRjb2RlPC9jb2RlPiBlbGVtZW50IHRoYXQgaXMgc2V0IHRvIHRoZQotICAgICAqIDxjb2RlPmZhdWx0Q29kZTwvY29kZT4gcGFyYW1ldGVyIGFuZCBhIDxjb2RlPmZhdWx0c3RyaW5nPC9jb2RlPiBzZXQgdG8KLSAgICAgKiA8Y29kZT5mYXVsdHN0cmluZzwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgYSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgZ2l2aW5nIHRoZSBmYXVsdCBjb2RlIHRvIGJlIHNldDsgbXVzdCBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGZhdWx0IGNvZGVzIGRlZmluZWQgaW4gdGhlIFNPQVAgMS4xIHNwZWNpZmljYXRpb24gYW5kIG9mIHR5cGUgUU5hbWUKLSAgICAgKiBAcGFyYW0gZmF1bHRTdHJpbmcgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZmF1bHQKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdCBhZGRGYXVsdChOYW1lIGZhdWx0Q29kZSwgU3RyaW5nIGZhdWx0U3RyaW5nKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBhZGRGYXVsdChmYXVsdENvZGUsIGZhdWx0U3RyaW5nLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSByb290IG5vZGUgb2YgdGhlIERPTSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gdG8gdGhpcyA8Y29kZT5TT0FQQm9keTwvY29kZT4gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGludmFsaWRhdGVzIHRoZSA8Y29kZT5kb2N1bWVudDwvY29kZT4gcGFyYW1ldGVyLiBUaGUgY2xpZW50IGFwcGxpY2F0aW9uCi0gICAgICogc2hvdWxkIGRpc2NhcmQgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyA8Y29kZT5Eb2N1bWVudDwvY29kZT4gYW5kIGl0cyBjb250ZW50cyB1cG9uIGNhbGxpbmcKLSAgICAgKiA8Y29kZT5hZGREb2N1bWVudDwvY29kZT4uIFRoZSBiZWhhdmlvciBvZiBhbiBhcHBsaWNhdGlvbiB0aGF0IGNvbnRpbnVlcyB0byB1c2Ugc3VjaAotICAgICAqIHJlZmVyZW5jZXMgaXMgdW5kZWZpbmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRvY3VtZW50IHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IHdob3NlIHJvb3Qgbm9kZSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgPGNvZGU+U09BUEJvZHk8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgPGNvZGU+U09BUEJvZHlFbGVtZW50PC9jb2RlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3Qgbm9kZSB0aGF0IHdhcyBhZGRlZAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IGNhbm5vdCBiZSBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQm9keUVsZW1lbnQgYWRkRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudCBkb2NFbGUgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBzYWFqU09BUEVsZSA9IChTT0FQRWxlbWVudCl0b1NBQUpOb2RlKGRvY0VsZSwgdGhpcyk7Ci0gICAgICAgIFNPQVBCb2R5RWxlbWVudEltcGwgYm9keUVsZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoKChTT0FQRWxlbWVudEltcGwpc2FhalNPQVBFbGUpLmVsZW1lbnQpOwotICAgICAgICBhZGRDaGlsZEVsZW1lbnQoYm9keUVsZSk7Ci0gICAgICAgIHJldHVybiBib2R5RWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U09BUEJvZHlFbGVtZW50PC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFkZHMgaXQgdG8gdGhpcwotICAgICAqIDxjb2RlPlNPQVBCb2R5PC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcW5hbWUgYSA8Y29kZT5RTmFtZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIG5hbWUgZm9yIHRoZSBuZXcgPGNvZGU+U09BUEJvZHlFbGVtZW50PC9jb2RlPgotICAgICAqICAgICAgICAgICAgICBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+U09BUEJvZHlFbGVtZW50PC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgYSBTT0FQIGVycm9yIG9jY3VycwotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQm9keUVsZW1lbnQgYWRkQm9keUVsZW1lbnQoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTT0FQQm9keUVsZW1lbnQpYWRkQ2hpbGRFbGVtZW50KHFuYW1lKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTT0FQRmF1bHQgYWRkRmF1bHQoUU5hbWUgZmF1bHRjb2RlLCBTdHJpbmcgZmF1bHRTdHJpbmcpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGFkZEZhdWx0KGZhdWx0Y29kZSwgZmF1bHRTdHJpbmcsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhpcyA8Y29kZT5TT0FQQm9keTwvY29kZT4gb2JqZWN0LgotICAgICAqIFRoZSBuZXcgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiB3aWxsIGhhdmUgYSA8Y29kZT5mYXVsdGNvZGU8L2NvZGU+IGVsZW1lbnQgdGhhdCBpcyBzZXQgdG8gdGhlCi0gICAgICogPGNvZGU+ZmF1bHRDb2RlPC9jb2RlPiBwYXJhbWV0ZXIgYW5kIGEgPGNvZGU+ZmF1bHRzdHJpbmc8L2NvZGU+IHNldCB0bwotICAgICAqIDxjb2RlPmZhdWx0c3RyaW5nPC9jb2RlPiBhbmQgbG9jYWxpemVkIHRvIDxjb2RlPmxvY2FsZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlICAgYSA8Y29kZT5RTmFtZTwvY29kZT4gb2JqZWN0IGdpdmluZyB0aGUgZmF1bHQgY29kZSB0byBiZQotICAgICAqIEBwYXJhbSBmYXVsdFN0cmluZyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZ2l2aW5nIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmYXVsdAotICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICBhIDxjb2RlPkxvY2FsZTwvY29kZT4gb2JqZWN0IGluZGljYXRpbmcgdGhlIG5hdGl2ZSBsYW5ndWFnZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgPG9jZGU+ZmF1bHRTdHJpbmc8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IDxjb2RlPlNPQVBGYXVsdDwvY29kZT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHQgYWRkRmF1bHQoUU5hbWUgZmF1bHRDb2RlLCBTdHJpbmcgZmF1bHRTdHJpbmcsIExvY2FsZSBsb2NhbGUpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBGYXVsdEltcGwgZmF1bHRJbXBsID0gbnVsbDsKLQotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgU09BUDExRmF1bHRJbXBsIGZhdWx0ID0gbmV3IFNPQVAxMUZhdWx0SW1wbChvbVNPQVBCb2R5LCBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBmYXVsdFN0cmluZyksIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgZmF1bHRJbXBsID0gbmV3IFNPQVBGYXVsdEltcGwoZmF1bHQpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIFNPQVAxMkZhdWx0SW1wbCBmYXVsdCA9IG5ldyBTT0FQMTJGYXVsdEltcGwob21TT0FQQm9keSwgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgZmF1bHRTdHJpbmcpLCAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGZhdWx0SW1wbCA9IG5ldyBTT0FQRmF1bHRJbXBsKGZhdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYXVsdEltcGwgIT0gbnVsbCkgewotICAgICAgICAgICAgZmF1bHRJbXBsLnNldEZhdWx0Q29kZShmYXVsdENvZGUpOwotICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmF1bHRJbXBsLnNldEZhdWx0U3RyaW5nKGZhdWx0U3RyaW5nLCBsb2NhbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmYXVsdEltcGwuc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYXVsdEltcGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBET00gb3JnLnczYy5kb20uRG9jdW1lbnQgYW5kIHNldHMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgU09BUEJvZHkgYXMgaXRzCi0gICAgICogZG9jdW1lbnQgZWxlbWVudC4gVGhlIGNoaWxkIFNPQVBFbGVtZW50IGlzIHJlbW92ZWQgYXMgcGFydCBvZiB0aGUgcHJvY2Vzcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTT0FQQm9keSBjb250ZW50LgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBjaGlsZCBTT0FQRWxlbWVudCBvZiB0aGUgU09BUEJvZHkuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50IGV4dHJhY3RDb250ZW50QXNEb2N1bWVudCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3IgY2hpbGRFbGVtZW50cyA9IHRoaXMuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGRvbU5vZGUgPSBudWxsOwotICAgICAgICBpbnQgY2hpbGRDb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChjaGlsZEVsZW1lbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgZG9tTm9kZSA9IChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkRWxlbWVudHMubmV4dCgpOwotICAgICAgICAgICAgY2hpbGRDb3VudCsrOwotICAgICAgICAgICAgaWYgKGNoaWxkQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIlNPQVBCb2R5IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2hpbGQgZWxlbWVudCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vVGhlIGNoaWxkIFNPQVBFbGVtZW50IGlzIHJlbW92ZWQgYXMgcGFydCBvZiB0aGUgcHJvY2VzcwotICAgICAgICB0aGlzLnJlbW92ZUNvbnRlbnRzKCk7Ci0KLQotICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkb21Ob2RlLmdldE5hbWVzcGFjZVVSSSgpLCBkb21Ob2RlLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0Tm9kZVZhbHVlKGRvbU5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRvY3VtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgamF2YXgueG1sLnNvYXAuTm9kZSB0b1NBQUpOb2RlKG9yZy53M2MuZG9tLk5vZGUgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5UZXh0KSB7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IGRvbVRleHQgPSAob3JnLnczYy5kb20uVGV4dClub2RlOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXh0SW1wbEV4KGRvbVRleHQuZ2V0RGF0YSgpLCBwYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uQ29tbWVudCkgewotICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudCBkb21UZXh0ID0gKG9yZy53M2MuZG9tLkNvbW1lbnQpbm9kZTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbWVudEltcGwoZG9tVGV4dC5nZXREYXRhKCksIHBhcmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgRWxlbWVudCBkb21FbGUgPSAoKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGludCBpbmRleE9mQ29sb24gPSBkb21FbGUuZ2V0VGFnTmFtZSgpLmluZGV4T2YoIjoiKTsKLSAgICAgICAgTmFtZXNwYWNlSW1wbCBuczsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZTsKLSAgICAgICAgaWYgKGluZGV4T2ZDb2xvbiAhPSAtMSkgewotICAgICAgICAgICAgbG9jYWxOYW1lID0gZG9tRWxlLmdldFRhZ05hbWUoKS5zdWJzdHJpbmcoaW5kZXhPZkNvbG9uICsgMSk7Ci0gICAgICAgICAgICBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKGRvbUVsZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tRWxlLmdldFRhZ05hbWUoKS5zdWJzdHJpbmcoMCwgaW5kZXhPZkNvbG9uKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2NhbE5hbWUgPSBkb21FbGUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpIHsgIC8vaXQgaXMgcG9zc2libGUgdGhhdCBsb2NhbG5hbWUgaXNuJ3Qgc2V0IGJ1dCBuYW1lIGlzIHNldAotICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IGRvbUVsZS5nZXRUYWdOYW1lKCk7Ci0gICAgICAgICAgICB9ICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGRvbUVsZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIGlmKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZG9tRWxlLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKGRvbUVsZS5nZXROYW1lc3BhY2VVUkkoKSwgcHJlZml4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5zID0gbmV3IE5hbWVzcGFjZUltcGwoIiIsIHByZWZpeCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbnMgPSBuZXcgTmFtZXNwYWNlSW1wbCgiIiwgIiIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRWxlbWVudEltcGwgZWxlSW1wbCA9Ci0gICAgICAgICAgICAgICAgbmV3IEVsZW1lbnRJbXBsKChEb2N1bWVudEltcGwpdGhpcy5nZXRPd25lckRvY3VtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSwgbnMsIHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIHNhYWpFbGUgPSBuZXcgU09BUEVsZW1lbnRJbXBsKGVsZUltcGwpOwotCi0gICAgICAgIHNhYWpFbGUuc2V0UGFyZW50RWxlbWVudChwYXJlbnQpOwotICAgICAgICBOYW1lZE5vZGVNYXAgZG9tQXR0cnMgPSBkb21FbGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvbUF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUgYXR0ck5vZGUgPSBkb21BdHRycy5pdGVtKGkpOwotICAgICAgICAgICAgU3RyaW5nIGF0dHJMb2NhbE5hbWUgPSBhdHRyTm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhdHRyTG9jYWxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhdHRyTG9jYWxOYW1lID0gYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyTG9jYWxOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL2xvY2FsIHBhcnQgaXMgcmVxdWlyZWQuICAiIiBpcyBhbGxvd2VkIHRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCBRTmFtZSAxLjAKLSAgICAgICAgICAgICAgICBhdHRyTG9jYWxOYW1lID0gIiI7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgc2FhakVsZS5hZGRBdHRyaWJ1dGUobmV3IFByZWZpeGVkUU5hbWUoYXR0ck5vZGUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTG9jYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5vZGUuZ2V0UHJlZml4KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGRTQUFKTm9kZSA9IHRvU0FBSk5vZGUoY2hpbGROb2Rlcy5pdGVtKGkpLCBzYWFqRWxlKTsKLSAgICAgICAgICAgIGlmIChjaGlsZFNBQUpOb2RlIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuVGV4dCkgewotICAgICAgICAgICAgICAgIHNhYWpFbGUuYWRkVGV4dE5vZGUoY2hpbGRTQUFKTm9kZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FhakVsZS5hZGRDaGlsZEVsZW1lbnQoKGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KWNoaWxkU0FBSk5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYWFqRWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRldGFjaE5vZGUoKSB7Ci0gICAgICAgIHRoaXMuZGV0YWNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9NTm9kZSBkZXRhY2goKSB7Ci0gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuZGV0YWNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoTmFtZSBuYW1lKSB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gbmV3IFFOYW1lKG5hbWUuZ2V0VVJJKCksIG5hbWUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudC5nZXRDaGlsZHJlbldpdGhOYW1lKHFOYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZEF0dHJpYnV0ZShRTmFtZSBxbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gbnVsbDsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3Rvcnk7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IG5ldyBTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgICAgICBvbU5hbWVzcGFjZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBuZXcgU09BUDEyRmFjdG9yeSgpOwotICAgICAgICAgICAgb21OYW1lc3BhY2UgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTU5hbWVzcGFjZShxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0UHJlZml4KCkpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuZWxlbWVudC5hZGRBdHRyaWJ1dGUocW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHZhbHVlLCBvbU5hbWVzcGFjZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9tU09BUEJvZHkuaGFzRmF1bHQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkEgU09BUEZhdWx0IGhhcyBiZWVuIGFscmVhZHkgYWRkZWQgdG8gdGhpcyBTT0FQQm9keSIpOwotICAgICAgICB9Ci0gICAgICAgIFNPQVBCb2R5RWxlbWVudEltcGwgY2hpbGRFbGU7Ci0gICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8ICIiLmVxdWFscyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpIHsKLSAgICAgICAgICAgIGNoaWxkRWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoCi0gICAgICAgICAgICAgICAgICAgIChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChxbmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICB9ZWxzZSBpZihudWxsID09IHFuYW1lLmdldFByZWZpeCgpIHx8ICIiLmVxdWFscyhxbmFtZS5nZXRQcmVmaXgoKS50cmltKCkpKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZSA9IG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICBjaGlsZEVsZSA9IG5ldyBTT0FQQm9keUVsZW1lbnRJbXBsKAotICAgICAgICAgICAgICAgICAgICAoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnROUyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0UHJlZml4KCkgKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXROYW1lc3BhY2UoY2hpbGRFbGUuZWxlbWVudC5kZWNsYXJlTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRQcmVmaXgoKSkpOwotCi0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGUuZWxlbWVudCk7Ci0gICAgICAgICgoTm9kZUltcGwpY2hpbGRFbGUuZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIGlzQm9keUVsZW1lbnRBZGRlZCA9IHRydWU7Ci0gICAgICAgIGNoaWxkRWxlLnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVFOYW1lKGxvY2FsTmFtZSwgcHJlZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmZpbmROYW1lc3BhY2VVUkkocHJlZml4KSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk9ubHkgTmFtZXNwYWNlIFF1YWxpZmllZCBlbGVtZW50cyBhcmUgYWxsb3dlZCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlUU5hbWUobG9jYWxOYW1lLCBwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVWYWx1ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENoaWxkRWxlbWVudHMocW5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50UU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50UU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBdHRyaWJ1dGUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHNldEVsZW1lbnRRTmFtZShRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gc3VwZXIuc2V0RWxlbWVudFFOYW1lKHFuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZFRleHROb2RlKFN0cmluZyB0ZXh0KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBzdXBlci5hZGRUZXh0Tm9kZSh0ZXh0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGdldENoaWxkcmVuKEl0ZXJhdG9yIGNoaWxkSXRlcikgewotICAgICAgICBDb2xsZWN0aW9uIGNoaWxkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGRvbU5vZGUgPSAob3JnLnczYy5kb20uTm9kZSljaGlsZEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgTm9kZSBzYWFqTm9kZSA9IHRvU0FBSk5vZGUoZG9tTm9kZSk7Ci0gICAgICAgICAgICBpZiAoc2Fhak5vZGUgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5UZXh0KSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoc2Fhak5vZGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghKHNhYWpOb2RlIGluc3RhbmNlb2YgU09BUEJvZHlFbGVtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IHJlcGxhY2Ugbm9kZSwgYXMgcGVyIHNhYWogMS4yIHNwZWMKLSAgICAgICAgICAgICAgICBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvbVNPQVBCb2R5Lmhhc0ZhdWx0KCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhY3Rvcnkgb21GYWN0b3J5ID0gKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQgZmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob21GYWN0b3J5IGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0ID0gbmV3IFNPQVAxMUZhdWx0SW1wbChvbVNPQVBCb2R5LCBvbUZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdCA9IG5ldyBTT0FQMTJGYXVsdEltcGwob21TT0FQQm9keSwgb21GYWN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdEltcGwgc2FhalNPQVBGYXVsdCA9IG5ldyBTT0FQRmF1bHRJbXBsKGZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoTm9kZUltcGwpb21TT0FQQm9keS5nZXRGYXVsdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzYWFqU09BUEZhdWx0LCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKHNhYWpTT0FQRmF1bHQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEJvZHlFbGVtZW50IHNhYWpCb2R5RWxlID0gbmV3IFNPQVBCb2R5RWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWRvbU5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChOb2RlSW1wbClkb21Ob2RlKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpCb2R5RWxlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKHNhYWpCb2R5RWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoc2Fhak5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uRmFjdG9yeUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQ29ubmVjdGlvbkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDNlZDAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb25GYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQ29ubmVjdGlvbkZhY3RvcnlJbXBsIGV4dGVuZHMgU09BUENvbm5lY3Rpb25GYWN0b3J5IHsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgPENPREU+U09BUENvbm5lY3Rpb248L0NPREU+LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IDxDT0RFPlNPQVBDb25uZWN0aW9uPC9DT0RFPiBvYmplY3QuCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gY3JlYXRpbmcgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDT0RFPlNPQVBDb25uZWN0aW9uPC9DT0RFPiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFNPQVBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24oKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU09BUENvbm5lY3Rpb25JbXBsKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBDb25uZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzYyYTc4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQ29ubmVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTVRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmxsb20uT01UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbC5JREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbC5TQUFKVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbC5VbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQ29ubmVjdGlvbkltcGwgZXh0ZW5kcyBTT0FQQ29ubmVjdGlvbiB7Ci0KLSAgICAvKiogQXR0cmlidXRlIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50OwotICAgIHByaXZhdGUgSGFzaE1hcCB1bmFjY2Vzc2VkQXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOwotCi0KLSAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGVuZHBvaW50IGFuZCBibG9ja3MgdW50aWwgaXQgaGFzIHJldHVybmVkIHRoZQotICAgICAqIHJlc3BvbnNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgIHRoZSA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IHRvIGJlIHNlbnQKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnQgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB0aGF0IGlkZW50aWZpZXMgd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQuIEl0Ci0gICAgICogICAgICAgICAgICAgICAgIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgT2JqZWN0cyBvZiB0eXBlIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+LAotICAgICAqICAgICAgICAgICAgICAgICA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+LCBhbmQgd2hlbiBKQVhNIGlzIHByZXNlbnQgPGNvZGU+amF2YXgueG1sLm1lc3NhZ2luZy5VUkxFbmRwb2ludDwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IHRoYXQgaXMgdGhlIHJlc3BvbnNlIHRvIHRoZSBtZXNzYWdlIHRoYXQgd2FzCi0gICAgICogICAgICAgICBzZW50Ci0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvciwgb3IgdGhpcyBTT0FQQ29ubmVjdGlvbiBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGNsb3NlZAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBjYWxsKFNPQVBNZXNzYWdlIHJlcXVlc3QsIE9iamVjdCBlbmRwb2ludCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoY2xvc2VkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiU09BUENvbm5lY3Rpb24gY2xvc2VkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0aWFsaXplIFVSTAotICAgICAgICBVUkwgdXJsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gKGVuZHBvaW50IGluc3RhbmNlb2YgVVJMKSA/IChVUkwpZW5kcG9pbnQgOiBuZXcgVVJMKGVuZHBvaW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaW5pdGlhbGl6ZSBhbmQgc2V0IE9wdGlvbnMKLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UodXJsLnRvU3RyaW5nKCkpKTsKLQotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBTZW5kZXIKLSAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpZW50OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7ICAgCi0gICAgICAgICAgICBkaXNhYmxlTXVzdFVuZGVyc3RhbmRQcm9jZXNzaW5nKHNlcnZpY2VDbGllbnQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBvcENsaWVudCA9IHNlcnZpY2VDbGllbnQuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UHJvcGVydHkoU09BUE1lc3NhZ2UuQ0hBUkFDVEVSX1NFVF9FTkNPRElORykpOwotCi0gICAgICAgIG9wQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgaWYgKHJlcXVlc3QuY291bnRBdHRhY2htZW50cygpICE9IDApIHsgLy8gU09BUE1lc3NhZ2Ugd2l0aCBhdHRhY2htZW50cwotICAgICAgICAgICAgb3BDbGllbnQuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9NVE9NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5WQUxVRV9UUlVFKTsKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVTT0FQTWVzc2FnZShyZXF1ZXN0LCBvcENsaWVudCk7Ci0gICAgICAgIH0gZWxzZSB7IC8vIHNpbXBsZSBTT0FQTWVzc2FnZQotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVNPQVBNZXNzYWdlKHJlcXVlc3QsIG9wQ2xpZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5zdGFsbHMgVW5kZXJzdGFuZEFsbEhlYWRlcnNIYW5kbGVyIHRoYXQgbWFya3MgYWxsIGhlYWRlcnMgYXMgcHJvY2Vzc2VkIAotICAgICAqIGJlY2F1c2UgTVUgdmFsaWRhdGlvbiBzaG91bGQgbm90IGJlIGRvbmUgZm9yIFNBQUogY2xpZW50cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZU11c3RVbmRlcnN0YW5kUHJvY2Vzc2luZyhBeGlzQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAgICAgRGlzcGF0Y2hQaGFzZSBwaGFzZTsKLSAgICAgICAgcGhhc2UgPSBnZXREaXNwYXRjaFBoYXNlKHNlcnZpY2VDbGllbnQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZsb3dQaGFzZXMoKSk7Ci0gICAgICAgIGlmIChwaGFzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwaGFzZS5hZGRIYW5kbGVyKG5ldyBVbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcGhhc2UgPSBnZXREaXNwYXRjaFBoYXNlKHNlcnZpY2VDbGllbnQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpKTsKLSAgICAgICAgaWYgKHBoYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBoYXNlLmFkZEhhbmRsZXIobmV3IFVuZGVyc3RhbmRBbGxIZWFkZXJzSGFuZGxlcigpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBEaXNwYXRjaFBoYXNlIGdldERpc3BhdGNoUGhhc2UoTGlzdCBwaGFzZXMpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IHBoYXNlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IHBoYXNlID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAocGhhc2UgaW5zdGFuY2VvZiBEaXNwYXRjaFBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChEaXNwYXRjaFBoYXNlKXBoYXNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENsb3NlcyB0aGlzIDxDT0RFPlNPQVBDb25uZWN0aW9uPC9DT0RFPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yLCBvciB0aGlzIFNPQVBDb25uZWN0aW9uIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgY2xvc2VkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzZXJ2aWNlQ2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZUNsaWVudC5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsb3NlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIlNPQVBDb25uZWN0aW9uIENsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBoYW5kbGVTT0FQTWVzc2FnZShTT0FQTWVzc2FnZSByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uQ2xpZW50IG9wQ2xpZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTWVzc2FnZUNvbnRleHQgcmVxdWVzdE1zZ0N0eCA9IG5ldyBNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVxdWVzdE1zZ0N0eC5zZXRFbnZlbG9wZSh0b09NU09BUEVudmVsb3BlKHJlcXVlc3QpKTsKLSAgICAgICAgICAgIG9wQ2xpZW50LmFkZE1lc3NhZ2VDb250ZXh0KHJlcXVlc3RNc2dDdHgpOwotICAgICAgICAgICAgb3BDbGllbnQuZXhlY3V0ZSh0cnVlKTsKLQotICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4ID0KLSAgICAgICAgICAgICAgICAgICAgb3BDbGllbnQuZ2V0TWVzc2FnZUNvbnRleHQoV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX0lOX1ZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRTT0FQTWVzc2FnZShtc2dDdHguZ2V0RW52ZWxvcGUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RNc2dDdHguZ2V0VHJhbnNwb3J0T3V0KCkuZ2V0U2VuZGVyKCkuY2xlYW51cChyZXF1ZXN0TXNnQ3R4KTsgICAgICAKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBlcnJvciwgYmV0dGVyIHRvIGxvZyBzb21ld2hlcmUgaWYgcG9zc2libGUuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIG9mIGFuIE9NIFNPQVAgRW52ZWxvcGUgdG8gYSBTQUFKIFNPQVBNZXNzYWdlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzcE9NU29hcEVudgotICAgICAqIEByZXR1cm4gdGhlIFNBQUogU09BUE1lc3NhZ2UKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgdGhpcyBjb252ZXJzaW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBnZXRTT0FQTWVzc2FnZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHJlc3BPTVNvYXBFbnYpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBiYXNpYyBTT0FQIE1lc3NhZ2UKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc1BhcnQgPSByZXNwb25zZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgZW52ID0gc1BhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudi5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52LmdldEhlYWRlcigpOwotCi0gICAgICAgIC8vIENvbnZlcnQgYWxsIGhlYWRlciBibG9ja3MKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyMiA9IHJlc3BPTVNvYXBFbnYuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGlmIChoZWFkZXIyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaGJJdGVyID0gaGVhZGVyMi5leGFtaW5lQWxsSGVhZGVyQmxvY2tzKCk7IGhiSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBhIHNpbmdsZSBPTSBTT0FQIEhlYWRlckJsb2NrIHRvIGEgU0FBSiBTT0FQCi0gICAgICAgICAgICAgICAgLy8gSGVhZGVyQmxvY2sKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlckJsb2NrIGhiID0gKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2spCi0gICAgICAgICAgICAgICAgICAgICAgICBoYkl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lIGhiUU5hbWUgPSBoYi5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFNPQVBIZWFkZXJFbGVtZW50IGhlYWRlckVsZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGVudi5jcmVhdGVOYW1lKGhiUU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRMb2NhbFBhcnQoKSwgaGJRTmFtZS5nZXRQcmVmaXgoKSwgaGJRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSkpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgYXR0cmliSXRlciA9IGhiLmdldEFsbEF0dHJpYnV0ZXMoKTsgYXR0cmliSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHIgPSAoT01BdHRyaWJ1dGUpYXR0cmliSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lIGF0dHJRTmFtZSA9IGF0dHIuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyRWxlLmFkZEF0dHJpYnV0ZShlbnYuY3JlYXRlTmFtZShhdHRyUU5hbWUuZ2V0TG9jYWxQYXJ0KCksIGF0dHJRTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgoKSwgYXR0clFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKSwgYXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJvbGUgPSBoYi5nZXRSb2xlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGUuc2V0QWN0b3Iocm9sZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhlYWRlckVsZS5zZXRNdXN0VW5kZXJzdGFuZChoYi5nZXRNdXN0VW5kZXJzdGFuZCgpKTsKLQotICAgICAgICAgICAgICAgIHRvU0FBSkVsZW1lbnQoaGVhZGVyRWxlLCBoYiwgcmVzcG9uc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgYm9keQotICAgICAgICB0b1NBQUpFbGVtZW50KGJvZHksIHJlc3BPTVNvYXBFbnYuZ2V0Qm9keSgpLCByZXNwb25zZSk7Ci0gICAgICAgIC8vIGlmIHRoZXJlIGFyZSB1bnJlZmZlcmVuY2VkIGF0dGFjaG1lbnRzLCBhZGQgdGhhdCB0byByZXNwb25zZQotICAgICAgICBpZiAoIXVuYWNjZXNzZWRBdHRhY2htZW50cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb24gYXR0YWNobWVudHMgPSB1bmFjY2Vzc2VkQXR0YWNobWVudHMudmFsdWVzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBhdHRhY2hlbWVudHNJdGVyYXRvciA9IGF0dGFjaG1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoYXR0YWNoZW1lbnRzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudCA9IChBdHRhY2htZW50UGFydClhdHRhY2hlbWVudHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzcG9uc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgYW4gT01Ob2RlIGludG8gYSBTQUFKIFNPQVBFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2FhakVsZQotICAgICAqIEBwYXJhbSBvbU5vZGUKLSAgICAgKiBAcGFyYW0gc2FhalNPQVBNc2cKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gSWYgY29udmVyc2lvbiBmYWlscwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB0b1NBQUpFbGVtZW50KFNPQVBFbGVtZW50IHNhYWpFbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01Ob2RlIG9tTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzYWFqU09BUE1zZykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChvbU5vZGUgaW5zdGFuY2VvZiBPTVRleHQpIHsKLSAgICAgICAgICAgIHJldHVybjsgLy8gc2ltcGx5IHJldHVybiBzaW5jZSB0aGUgdGV4dCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHNhYWpFbGUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbU5vZGUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZSA9IChPTUVsZW1lbnQpb21Ob2RlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBjaGlsZEl0ZXIgPSBvbUVsZS5nZXRDaGlsZHJlbigpOyBjaGlsZEl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE9NTm9kZSBvbUNoaWxkTm9kZSA9IChPTU5vZGUpY2hpbGRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBzYWFqQ2hpbGRFbGUgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgaWYgKG9tQ2hpbGROb2RlIGluc3RhbmNlb2YgT01UZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIG9tdGV4dCByZWZlcnMgdG8gYW4gYXR0YWNobWVudAotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9NVGV4dCBvbVRleHQgPSAoT01UZXh0KW9tQ2hpbGROb2RlOwotICAgICAgICAgICAgICAgICAgICBpZiAob21UZXh0LmlzT3B0aW1pemVkKCkpIHsgLy8gaXMgdGhpcyBhbiBhdHRhY2htZW50PwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGF0YUhhbmRsZXIgZGF0YWhhbmRsZXIgPSAoRGF0YUhhbmRsZXIpb21UZXh0LmdldERhdGFIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50ID0gc2FhalNPQVBNc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoZGF0YWhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gSURHZW5lcmF0b3IuZ2VuZXJhdGVJRCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5zZXRDb250ZW50SWQoaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5zZXRDb250ZW50VHlwZShkYXRhaGFuZGxlci5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhYWpTT0FQTXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGF0dGFjaG1lbnQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzYWFqRWxlLmFkZEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FhalNPQVBNc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpLmNyZWF0ZU5hbWUoImhyZWYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNpZDoiICsgaWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2FhakNoaWxkRWxlID0gc2FhakVsZS5hZGRUZXh0Tm9kZShvbVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob21DaGlsZE5vZGUgaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tQ2hpbGRFbGUgPSAoT01FbGVtZW50KW9tQ2hpbGROb2RlOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBRTmFtZSBvbUNoaWxkUU5hbWUgPSBvbUNoaWxkRWxlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNhYWpDaGlsZEVsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FhakVsZS5hZGRDaGlsZEVsZW1lbnQob21DaGlsZFFOYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tQ2hpbGRRTmFtZS5nZXRQcmVmaXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbUNoaWxkUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGF0dHJpYkl0ZXIgPSBvbUNoaWxkRWxlLmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJJdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9NQXR0cmlidXRlIGF0dHIgPSAoT01BdHRyaWJ1dGUpYXR0cmliSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBRTmFtZSBhdHRyUU5hbWUgPSBhdHRyLmdldFFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYWFqQ2hpbGRFbGUuYWRkQXR0cmlidXRlKHNhYWpTT0FQTXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTmFtZShhdHRyUU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0clFOYW1lLmdldFByZWZpeCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0QXR0cmlidXRlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBnbyBkb3duIHRoZSB0cmVlIGFkZGluZyBjaGlsZCBlbGVtZW50cywgdGlsbCB1IHJlYWNoIGEgbGVhZihpLmUuIHRleHQgZWxlbWVudCkKLSAgICAgICAgICAgICAgICB0b1NBQUpFbGVtZW50KHNhYWpDaGlsZEVsZSwgb21DaGlsZE5vZGUsIHNhYWpTT0FQTXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgU0FBSiBTT0FQTWVzc2FnZSB0byBhbiBPTSBTT0FQRW52ZWxvcGUKLSAgICAgKgotICAgICAqIEBwYXJhbSBzYWFqU09BUE1zZwotICAgICAqIEByZXR1cm4KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b09NU09BUEVudmVsb3BlKFNPQVBNZXNzYWdlIHNhYWpTT0FQTXNnKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotCi0gICAgICAgIGZpbmFsIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgb21TT0FQRW52ID0KLSAgICAgICAgICAgICAgICBTQUFKVXRpbC50b09NU09BUEVudmVsb3BlKHNhYWpTT0FQTXNnLmdldFNPQVBQYXJ0KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCi0KLSAgICAgICAgTWFwIGF0dGFjaG1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmaW5hbCBJdGVyYXRvciBhdHRhY2htZW50cyA9IHNhYWpTT0FQTXNnLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChhdHRhY2htZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQgPSAoQXR0YWNobWVudFBhcnQpYXR0YWNobWVudHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnQuZ2V0Q29udGVudElkKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LmdldENvbnRlbnRJZCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudC5zZXRDb250ZW50SWQoSURHZW5lcmF0b3IuZ2VuZXJhdGVJRCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJBdHRhY2htZW50IHdpdGggTlVMTCBEYXRhSGFuZGxlciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0YWNobWVudE1hcC5wdXQoYXR0YWNobWVudC5nZXRDb250ZW50SWQoKSwgYXR0YWNobWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0dldCBrZXlzIG9mIGF0dGFjaG1lbnRzIHRvIGEgaGFzaG1hcAotICAgICAgICAvL1RoaXMgaGFzaG1hcCB3aWxsIGJlIHVwZGF0ZWQgd2hlbiBhdHRhY2htZW50IGlzIGFjY2Vzc2VkIGF0bGVhc3Qgb25jZS4KLSAgICAgICAgLy9Eb2luZyB0aGlzIGhlcmUgaW5zdGVhZCBvZiBpbnNpZGUgaW5zZXJ0QXR0YWNobWVudE5vZGVzKClpcyBtdWNoIHNpbXBsZXIKLSAgICAgICAgLy9hcyBpbnNlcnRBdHRhY2htZW50Tm9kZXMoKSBoYXMgcmVjdXJzaXZlIGNhbGxzCi0gICAgICAgIFNldCBrZXlTZXQgPSBhdHRhY2htZW50TWFwLmtleVNldCgpOwotICAgICAgICBJdGVyYXRvciBrZXlTZXRJdHIgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgSGFzaE1hcCBrZXlBY2Nlc3NTdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICB3aGlsZSAoa2V5U2V0SXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5U2V0SXRyLm5leHQoKTsKLSAgICAgICAgICAgIGtleUFjY2Vzc1N0YXR1cy5wdXQoa2V5LCAibm90LWFjY2Vzc2VkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnNlcnRBdHRhY2htZW50Tm9kZXMoYXR0YWNobWVudE1hcCwgb21TT0FQRW52LCBrZXlBY2Nlc3NTdGF0dXMpOwotICAgICAgICB1bmFjY2Vzc2VkQXR0YWNobWVudHMgPQotICAgICAgICAgICAgICAgIGdldFVuUmVmZXJlbmNlZEF0dGFjaG1lbnROb2RlcyhhdHRhY2htZW50TWFwLCBvbVNPQVBFbnYsIGtleUFjY2Vzc1N0YXR1cyk7Ci0KLSAgICAgICAgcmV0dXJuIG9tU09BUEVudjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBhdHRhY2htZW50cyBpbiB0aGUgcHJvcGVyIHBsYWNlcwotICAgICAqCi0gICAgICogQHBhcmFtIGF0dGFjaG1lbnRzCi0gICAgICogQHBhcmFtIG9tRW52ZWxvcGUKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QXR0YWNobWVudE5vZGVzKE1hcCBhdHRhY2htZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVudmVsb3BlLCBIYXNoTWFwIGtleUFjY2Vzc1N0YXR1cykKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLQotICAgICAgICBJdGVyYXRvciBjaGlsZEl0ZXIgPSBvbUVudmVsb3BlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBjaGlsZCA9IChPTUVsZW1lbnQpY2hpbGRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZpbmFsIE9NQXR0cmlidXRlIGhyZWZBdHRyID0gY2hpbGQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgiaHJlZiIpKTsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50SUQgPSBnZXRDb250ZW50SUQoaHJlZkF0dHIpOwotCi0gICAgICAgICAgICBpZiAoY29udGVudElEICE9IG51bGwpIHsvL1RoaXMgaXMgYW4gb21FbnZlbG9wZSByZWZlcmVuY2luZyBhbiBhdHRhY2htZW50Ci0gICAgICAgICAgICAgICAgY2hpbGQuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9ICgoQXR0YWNobWVudFBhcnQpYXR0YWNobWVudHMuZ2V0KGNvbnRlbnRJRC50cmltKCkpKTsKLSAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUga2V5IHN0YXR1cyBhcyBhY2Nlc3NlZAotICAgICAgICAgICAgICAgIGtleUFjY2Vzc1N0YXR1cy5wdXQoY29udGVudElELnRyaW0oKSwgImFjY2Vzc2VkIik7Ci0gICAgICAgICAgICAgICAgT01UZXh0IHRleHQgPSBuZXcgT01UZXh0SW1wbChhcC5nZXREYXRhSGFuZGxlcigpLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21FbnZlbG9wZS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKGhyZWZBdHRyKTsKLSAgICAgICAgICAgICAgICBjaGlsZC5hZGRDaGlsZCh0ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9wb3NzaWJseSB0aGVyZSBjYW4gYmUgcmVmZXJlbmNlcyBpbiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBvbUVudmVsb3BlCi0gICAgICAgICAgICAgICAgLy9zbyByZWN1cnNlIHRocm91Z2guCi0gICAgICAgICAgICAgICAgaW5zZXJ0QXR0YWNobWVudE5vZGVzKGF0dGFjaG1lbnRzLCBjaGlsZCwga2V5QWNjZXNzU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGdldFVuUmVmZXJlbmNlZEF0dGFjaG1lbnROb2RlcyhNYXAgYXR0YWNobWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbnZlbG9wZSwgSGFzaE1hcCBrZXlBY2Nlc3NTdGF0dXMpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSGFzaE1hcCB1bmFjY2Vzc2VkQXR0YWNobWVudHMgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL25vdyBjaGVjayBmb3IgdW5hY2Nlc3NlZCBrZXlzCi0gICAgICAgIFNldCBrZXlTZXQgPSBrZXlBY2Nlc3NTdGF0dXMua2V5U2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGtleVNldEl0ciA9IGtleVNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoa2V5U2V0SXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5U2V0SXRyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXlTdGF0dXMgPSAoU3RyaW5nKWtleUFjY2Vzc1N0YXR1cy5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmICgibm90LWFjY2Vzc2VkIi5lcXVhbHMoa2V5U3RhdHVzKSkgewotICAgICAgICAgICAgICAgIC8vVGhlIHZhbHVlIGZvciB0aGlzIGtleSBoYXMgbm90IGJlZW4gYWNjZXNzZWQgaW4gdGhlCi0gICAgICAgICAgICAgICAgLy9yZWZlcmVuY2luZyBhdHRhY2htZW50IHNjZW5hcmlvLkhlbmNlIGl0IG11c3QgYmUgYW4KLSAgICAgICAgICAgICAgICAvL3VucmVmZXJlbmNlZCBvbmUuCi0gICAgICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAgPSAoKEF0dGFjaG1lbnRQYXJ0KWF0dGFjaG1lbnRzLmdldChrZXkpKTsKLSAgICAgICAgICAgICAgICB1bmFjY2Vzc2VkQXR0YWNobWVudHMucHV0KGtleSwgYXApOwotICAgICAgICAgICAgICAgIGtleUFjY2Vzc1N0YXR1cy5wdXQoa2V5LCAiYWNjZXNzZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdW5hY2Nlc3NlZEF0dGFjaG1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGUgdmFsdWUgb2YgYXR0cmlidXRlIGFuZCBpZiBpdCBpcyBhIHZhbGlkIENJRCB0aGVuIHJldHVybnMgdGhlIGNvbnRlbnRJRAotICAgICAqICh3aXRoIGNpZDogcHJlZml4IHN0cmlwcGVkIG9mZikgb3IgZWxzZSByZXR1cm5zIG51bGwuIEEgbnVsbCByZXR1cm4gdmFsdWUgY2FuIGJlIGFzc3VtZWQgdGhhdAotICAgICAqIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhbiBhdHRhY2htZW50IHJlZmVyZW5jaW5nIGF0dHJpYnV0ZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgQ29udGVudElECi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudElEKE9NQXR0cmlidXRlIGF0dHIpIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRJZDsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29udGVudElkID0gYXR0ci5nZXRBdHRyaWJ1dGVWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudElkLnN0YXJ0c1dpdGgoImNpZDoiKSkgewotICAgICAgICAgICAgY29udGVudElkID0gY29udGVudElkLnN1YnN0cmluZyg0KTsKLSAgICAgICAgICAgIHJldHVybiBjb250ZW50SWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqIG92ZXJyaWRlZCBTT0FQQ29ubmVjdGlvbidzIGdldCgpIG1ldGhvZCAqLwotCi0gICAgcHVibGljIFNPQVBNZXNzYWdlIGdldChPYmplY3QgdG8pIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1cmwgPSAodG8gaW5zdGFuY2VvZiBVUkwpID8gKFVSTCl0byA6IG5ldyBVUkwodG8udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCByZXNwb25zZUNvZGU7Ci0gICAgICAgIGJvb2xlYW4gaXNGYWlsdXJlID0gZmFsc2U7Ci0gICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGh0dHBDb24gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaHR0cENvbiA9IChIdHRwVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIGh0dHBDb24uc2V0RG9PdXRwdXQodHJ1ZSk7Ci0gICAgICAgICAgICBodHRwQ29uLnNldERvSW5wdXQodHJ1ZSk7Ci0gICAgICAgICAgICBodHRwQ29uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0gICAgICAgICAgICBodHRwQ29uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOwotICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKHRydWUpOwotCi0gICAgICAgICAgICBodHRwQ29uLmNvbm5lY3QoKTsKLSAgICAgICAgICAgIHJlc3BvbnNlQ29kZSA9IGh0dHBDb24uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0gICAgICAgICAgICAvLyA1MDAgaXMgYWxsb3dlZCBmb3IgU09BUCBmYXVsdHMKLSAgICAgICAgICAgIGlmIChyZXNwb25zZUNvZGUgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9JTlRFUk5BTF9FUlJPUikgewotICAgICAgICAgICAgICAgIGlzRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChyZXNwb25zZUNvZGUgLyAxMDApICE9IDIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiRXJyb3IgcmVzcG9uc2U6ICgiICsgcmVzcG9uc2VDb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICArIGh0dHBDb24uZ2V0UmVzcG9uc2VNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vQ29uc3RydWN0IHRoZSBzb2FwbWVzc2FnZSBmcm9tIGh0dHAgcmVzcG9uc2UKLSAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAocmVzcG9uc2VDb2RlID09IEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfT0spIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy9yZWFkIGh0dHAgaGVhZGVycyAmIGxvYWQgbWltZWhlYWRlcnMKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVycyBtaW1lSGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgICAgIFN0cmluZyBrZXksIHZhbHVlOwotICAgICAgICAgICAgICAgIC8vIHNraXAgc3RhdHVzIGxpbmUKLSAgICAgICAgICAgICAgICBpbnQgaSA9IDE7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gaHR0cENvbi5nZXRIZWFkZXJGaWVsZEtleShpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBodHRwQ29uLmdldEhlYWRlckZpZWxkKGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwgJiYgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB2YWx1ZXMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoa2V5LCB2YWx1ZXMubmV4dFRva2VuKCkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGh0dHBJbnB1dFN0cmVhbTsKLSAgICAgICAgICAgICAgICBpZiAoaXNGYWlsdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBJbnB1dFN0cmVhbSA9IGh0dHBDb24uZ2V0RXJyb3JTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBodHRwSW5wdXRTdHJlYW0gPSBodHRwQ29uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UgPSBuZXcgU09BUE1lc3NhZ2VJbXBsKGh0dHBJbnB1dFN0cmVhbSwgbWltZUhlYWRlcnMpOwotICAgICAgICAgICAgICAgIGh0dHBJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGh0dHBDb24uZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNvYXBNZXNzYWdlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBFbGVtZW50SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEyMzM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTmFtZXNwYWNlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5UZXh0SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEVsZW1lbnRJbXBsIGV4dGVuZHMgTm9kZUltcGxFeCBpbXBsZW1lbnRzIFNPQVBFbGVtZW50IHsKLQotICAgIC8qKgotICAgICAqIFVzaW5nIGEgZGVsZWdhdGUgYmVjYXVzZSB3ZSBjYW4ndCBleHRlbmQgZnJvbSBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsIHNpbmNlCi0gICAgICogdGhpcyBjbGFzcyBtdXN0IGV4dGVuZCBTTm9kZUltcGwKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRWxlbWVudEltcGwgZWxlbWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZ1N0eWxlOwotCi0gICAgcHVibGljIFNPQVBFbGVtZW50SW1wbChFbGVtZW50SW1wbCBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKGVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZSNkaXNjYXJkKCkKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzY2FyZCgpIHRocm93cyBPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGVsZW1lbnQuZGlzY2FyZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsU2VyaWFsaXplKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgYm9vbGVhbiBjYWNoZSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LmludGVybmFsU2VyaWFsaXplKHdyaXRlciwgY2FjaGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gYXR0cmlidXRlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB2YWx1ZSB0byB0aGlzIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIGEgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gZ2l2aW5nIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCBpbnRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgd2FzIGluc2VydGVkCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIGNyZWF0aW5nIHRoZSBBdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQXR0cmlidXRlKE5hbWUgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuYW1lLmdldFVSSSgpID09IG51bGwgfHwgbmFtZS5nZXRVUkkoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZS5nZXRMb2NhbE5hbWUoKSwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhuYW1lLmdldFVSSSgpLCBuYW1lLmdldFByZWZpeCgpICsgIjoiICsgbmFtZS5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YXgueG1sLnNvYXAuTmFtZSkKLSAgICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChOYW1lIG5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IG5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIHJldHVybiBhZGRDaGlsZEVsZW1lbnQobmFtZS5nZXRMb2NhbE5hbWUoKSwgIiIuZXF1YWxzKHByZWZpeCkgPyBudWxsIDogcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0VVJJKCkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpCi0gICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoU09BUEVsZW1lbnQgc29hcEVsZW1lbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gc29hcEVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQotICAgICAgICBTT0FQRWxlbWVudEltcGwgY2hpbGRFbGU7ICAgICAgICAKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgY2hpbGRFbGUgPSAgbmV3IFNPQVBFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpOwotICAgICAgICAgICAgY2hpbGRFbGUgPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNvYXBFbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGNoaWxkRWxlLmFkZEF0dHJpYnV0ZShuYW1lLCBzb2FwRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlLmFkZFRleHROb2RlKCgoVGV4dClvKS5nZXREYXRhKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZS5hZGRDaGlsZEVsZW1lbnQoKFNPQVBFbGVtZW50KW8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsICYmIG5hbWVzcGFjZVVSSS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldE5hbWVzcGFjZShjaGlsZEVsZS5lbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UobmFtZXNwYWNlVVJJLCBwcmVmaXgpKTsKLSAgICAgICAgfQotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlLmVsZW1lbnQpOwotICAgICAgICAoKE5vZGVJbXBsKWNoaWxkRWxlLmVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gY2hpbGRFbGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogT3ZlcmlkZGVuIGluIEVsZW1lbnRJbXBsIGFuZCBBdHRySW1wbC4KLSAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZENoaWxkRWxlbWVudChTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICAgICAgICAgICAgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBPTU5hbWVzcGFjZSBvbU5hbWVzcGFjZSA9IGVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZSh1cmksIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBhZGRDaGlsZEVsZW1lbnQobG9jYWxOYW1lLCBvbU5hbWVzcGFjZS5nZXRQcmVmaXgoKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGdldE5hbWVzcGFjZVVSSShwcmVmaXgpOwotCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIk5hbWVzcGFjZSBub3QgZGVjbGFyZWQgZm9yIHRoZSBnaXZlIHByZWZpeDogIiArIHByZWZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQRWxlbWVudEltcGwgY2hpbGRFbGUgPQotICAgICAgICAgICAgICAgIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKWdldE93bmVyRG9jdW1lbnQoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHByZWZpeCArICI6IiArIGxvY2FsTmFtZSkpOwotCi0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBjaGlsZEVsZSwgbnVsbCk7Ci0gICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0TmFtZXNwYWNlKGNoaWxkRWxlLmVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZShuYW1lc3BhY2VVUkksIHByZWZpeCkpOwotICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlLmVsZW1lbnQpOwotICAgICAgICAoKE5vZGVJbXBsKWNoaWxkRWxlLmVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICBjaGlsZEVsZS5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gY2hpbGRFbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIGNoaWxkRWxlID0KLSAgICAgICAgICAgICAgICBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChsb2NhbE5hbWUpKTsKLSAgICAgICAgY2hpbGRFbGUuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIGNoaWxkRWxlLCBudWxsKTsKLSAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZS5lbGVtZW50KTsKLSAgICAgICAgKChOb2RlSW1wbCljaGlsZEVsZS5lbGVtZW50LmdldFBhcmVudE5vZGUoKSkuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgY2hpbGRFbGUuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGROYW1lc3BhY2VEZWNsYXJhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LmRlY2xhcmVOYW1lc3BhY2UodXJpLCBwcmVmaXgpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiA8Y29kZT5TdHJpbmc8L2NvZGU+IGFuZAotICAgICAqIGFkZHMgaXQgdG8gdGhpcyA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSB0ZXh0dWFsIGNvbnRlbnQgdG8gYmUgYWRkZWQKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4gb2JqZWN0IGludG8gd2hpY2ggdGhlIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3Qgd2FzCi0gICAgICogICAgICAgICBpbnNlcnRlZAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGluZyB0aGUgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRUZXh0Tm9kZShTdHJpbmcgdGV4dCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICAvL09tRWxlbWVudC5zZXRUZXh0KCkgd2lsbCByZW1vdmUgYWxsIHRoZSBvdGhlciB0ZXh0IG5vZGVzIHRoYXQgaXQgY29udGFpbnMKLSAgICAgICAgLy9UaGVyZWZvcmUgY3JlYXRlIGEgdGV4dCBub2RlIGFuZCBhZGQgaXQKLSAgICAgICAgLy9UT0RPOiBNYXkgbmVlZCB0byBhZGRyZXNzIHRoZSBzaXR1YXRpb24gd2hlcmUgdGhlIHByZXYgc2libGluZyBvZiB0aGUgdGV4dG5vZGUgaXRzZWxmIGlzIGEgdGV4dG5vZGUKLSAgICAgICAgVGV4dCB0ZXh0Tm9kZSA9IGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKLSAgICAgICAgTm9kZUltcGwgbm9kZSA9ICgoTm9kZUltcGwpZWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSkpOwotICAgICAgICBUZXh0SW1wbEV4IHNhYWpUZXh0Tm9kZSA9IG5ldyBUZXh0SW1wbEV4KHRleHQsIHRoaXMpOwotICAgICAgICBub2RlLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalRleHROb2RlLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIGFsbCBvZiB0aGUgYXR0cmlidXRlIG5hbWVzIGluIHRoaXMgPENPREU+U09BUEVsZW1lbnQ8L0NPREU+IG9iamVjdC4KLSAgICAgKiBUaGUgaXRlcmF0b3IgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgbmFtZXMsIHdoaWNoIGNhbiB0aGVuIGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kCi0gICAgICogPENPREU+Z2V0QXR0cmlidXRlVmFsdWU8L0NPREU+IHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBlYWNoIGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QWxsQXR0cmlidXRlcygpIHsKLSAgICAgICAgZmluYWwgSXRlcmF0b3IgYXR0cmliSXRlciA9IGVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICBDb2xsZWN0aW9uIGF0dHJpYk5hbWUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEF0dHIgYXR0cjsKLSAgICAgICAgd2hpbGUgKGF0dHJpYkl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBhdHRyID0gKEF0dHIpYXR0cmliSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBQcmVmaXhlZFFOYW1lIHFuYW1lOwotICAgICAgICAgICAgaWYgKGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBhdHRyLmdldE5hbWVzcGFjZVVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcW5hbWUgPSBuZXcgUHJlZml4ZWRRTmFtZShhdHRyLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcW5hbWUgPSBuZXcgUHJlZml4ZWRRTmFtZShhdHRyLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0cmliTmFtZS5hZGQocW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRyaWJOYW1lLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldEF0dHJpYnV0ZVZhbHVlKGphdmF4LnhtbC5zb2FwLk5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoTmFtZSBuYW1lKSB7Ci0gICAgICAgIC8vVGhpcyBtZXRob2QgaXMgd2FpdGluZyBvbiB0aGUgZmluYWxpemF0aW9uIG9mIHRoZSBuYW1lIGZvciBhIG1ldGhvZAotICAgICAgICAvL2luIE9NRWxlbWVudCB0aGF0IHJldHVybnMgYSBPTUF0dHJpYnV0ZSBmcm9tIGFuIGlucHV0IFFOYW1lCi0gICAgICAgIGZpbmFsIE9NQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZShuYW1lLmdldFVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuZ2V0UHJlZml4KCkpKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgaW1tZWRpYXRlIGNvbnRlbnQgb2YgdGhpcyBlbGVtZW50LiBUaGlzIGluY2x1ZGVzCi0gICAgICogPENPREU+VGV4dDwvQ09ERT4gb2JqZWN0cyBhcyB3ZWxsIGFzIDxDT0RFPlNPQVBFbGVtZW50PC9DT0RFPiBvYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIDxDT0RFPlRleHQ8L0NPREU+IGFuZCA8Q09ERT5TT0FQRWxlbWVudDwvQ09ERT4gY29udGFpbmVkIHdpdGhpbiB0aGlzCi0gICAgICogICAgICAgICA8Q09ERT5TT0FQRWxlbWVudDwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldENoaWxkRWxlbWVudHMoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGNoaWxkSXRlciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgQ29sbGVjdGlvbiBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoY2hpbGRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQodG9TQUFKTm9kZSgob3JnLnczYy5kb20uTm9kZSljaGlsZEl0ZXIubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjZ2V0Q2hpbGRFbGVtZW50cyhqYXZheC54bWwuc29hcC5OYW1lKQotICAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhOYW1lIG5hbWUpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobmFtZS5nZXRVUkkoKSwgbmFtZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGNoaWxkSXRlciA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShxTmFtZSk7Ci0gICAgICAgIENvbGxlY3Rpb24gY2hpbGRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKHRvU0FBSk5vZGUoKG9yZy53M2MuZG9tLk5vZGUpY2hpbGRJdGVyLm5leHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldEVsZW1lbnROYW1lKCkKLSAgICAgICovCi0gICAgcHVibGljIE5hbWUgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgIFFOYW1lIHFOYW1lID0gZWxlbWVudC5nZXRRTmFtZSgpOwotICAgICAgICByZXR1cm4gbmV3IFByZWZpeGVkUU5hbWUocU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxTmFtZS5nZXRMb2NhbFBhcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFOYW1lLmdldFByZWZpeCgpKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjZ2V0RW5jb2RpbmdTdHlsZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdTdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjZ2V0TmFtZXNwYWNlUHJlZml4ZXMoKQotICAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0TmFtZXNwYWNlUHJlZml4ZXMoKSB7Ci0gICAgICAgIC8vR2V0IGFsbCBkZWNsYXJlZCBuYW1lc3BhY2UsIG1ha2UgYSBsaXN0IG9mIHRoZWlyIHByZWZpeGVzIGFuZCByZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGF0IGxpc3QKLSAgICAgICAgQXJyYXlMaXN0IHByZWZpeExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIG5zSXRlciA9IGVsZW1lbnQuZ2V0QWxsRGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIHdoaWxlIChuc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IG5zSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UpIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlIG5zID0gKG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UpbzsKLSAgICAgICAgICAgICAgICBwcmVmaXhMaXN0LmFkZChucy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByZWZpeExpc3QuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjZ2V0TmFtZXNwYWNlVVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2dldFZpc2libGVOYW1lc3BhY2VQcmVmaXhlcygpCi0gICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRWaXNpYmxlTmFtZXNwYWNlUHJlZml4ZXMoKSB7Ci0gICAgICAgIC8vSSdsbCByZWN1cnNpdmVseSByZXR1cm4gYWxsIHRoZSBkZWNsYXJlZCBuYW1lc3BhY2VzIHRpbGwgdGhpcyBub2RlLCBpbmNsdWRpbmcgaXRzIHBhcmVudHMgZXRjLgotICAgICAgICBJdGVyYXRvciBuYW1lc3BhY2VzSXRlciA9IGVsZW1lbnQuZ2V0QWxsRGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgIEFycmF5TGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAobmFtZXNwYWNlc0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IG5hbWVzcGFjZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgT01OYW1lc3BhY2UpIHsKLSAgICAgICAgICAgICAgICBPTU5hbWVzcGFjZSBucyA9IChPTU5hbWVzcGFjZSlvOwotICAgICAgICAgICAgICAgIGlmIChucy5nZXRQcmVmaXgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybkxpc3QuYWRkKG5zLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy90YWtlbiBjYXJlIG9mIGFkZGluZyBuYW1lc3BhY2VzIG9mIHRoaXMgbm9kZS4KLSAgICAgICAgLy9ub3cgd2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgYWRkaW5nIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGluIHRoZSBzY29wZSB0aWxsIHRoZSBsZXZlbCBvZgotICAgICAgICAvL3RoaXMgbm9kZXMnIHBhcmVudC4KLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lciBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHBhcmVudFNjb3BlTmFtZXNwYWNlc0l0ZXIgPQotICAgICAgICAgICAgICAgICAgICAoKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50KXBhcmVudCkuZ2V0QWxsRGVjbGFyZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICB3aGlsZSAocGFyZW50U2NvcGVOYW1lc3BhY2VzSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHBhcmVudFNjb3BlTmFtZXNwYWNlc0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgT01OYW1lc3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgT01OYW1lc3BhY2UgbnMgPSAoT01OYW1lc3BhY2UpbzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5zLmdldFByZWZpeCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkxpc3QuYWRkKG5zLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuTGlzdC5pdGVyYXRvcigpOwotICAgIH0KLQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZEF0dHJpYnV0ZShRTmFtZSBxbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIHx8IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShxbmFtZS5nZXRMb2NhbFBhcnQoKSwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcW5hbWUuZ2V0UHJlZml4KCkgKyAiOiIgKwotICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRMb2NhbFBhcnQoKSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IHFuYW1lLmdldFByZWZpeCgpOwotICAgICAgICByZXR1cm4gYWRkQ2hpbGRFbGVtZW50KHFuYW1lLmdldExvY2FsUGFydCgpLCAiIi5lcXVhbHMocHJlZml4KSA/Ci0gICAgICAgICAgICAgICAgbnVsbCA6IHByZWZpeCwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBRTmFtZSB3aG9zZSBuYW1lc3BhY2UgVVJJIGlzIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXJhbWV0ZXIsIHByZWZpeCwgaW4gdGhlCi0gICAgICogY29udGV4dCBvZiB0aGlzIFNPQVBFbGVtZW50LiBUaGUgcmVtYWluaW5nIGVsZW1lbnRzIG9mIHRoZSBuZXcgUU5hbWUgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20KLSAgICAgKiB0aGUgcGFyYW1ldGVycywgbG9jYWxOYW1lIGFuZCBwcmVmaXguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIC0gYSBTdHJpbmcgY29udGFpbmluZyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgbmFtZS4gcHJlZml4IC0gYSBTdHJpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHByZWZpeCBmb3IgdGhlIG5hbWUuCi0gICAgICogQHJldHVybiBhIFFOYW1lIHdpdGggdGhlIHNwZWNpZmllZCBsb2NhbE5hbWUgYW5kIHByZWZpeCwgYW5kIHdpdGggYSBuYW1lc3BhY2UgdGhhdCBpcwotICAgICAqICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVmaXggaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBTT0FQRWxlbWVudC4gVGhpcyBuYW1lc3BhY2Ugd2lsbCBiZQotICAgICAqICAgICAgICAgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IGdldE5hbWVzcGFjZVVSSShTdHJpbmcpIGlmIGl0IHdlcmUKLSAgICAgKiAgICAgICAgIGdpdmVuIHByZWZpeCBhcyBpdHMgcGFyYW1ldGVyLgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZSBRTmFtZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgUU5hbWUgY3JlYXRlUU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJJbnZhbGlkIHByZWZpeCIpOwotICAgICAgICB9Ci0gICAgICAgIFFOYW1lIHFuYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkksIGxvY2FsTmFtZSwgcHJlZml4KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBxbmFtZSA9IG5ldyBRTmFtZShTT0FQMTJDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJLCBsb2NhbE5hbWUsIHByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHFuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBbGxBdHRyaWJ1dGVzQXNRTmFtZXMoKSB7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGF0dHJpYkl0ZXIgPSBlbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBhdHRyaWJ1dGVzQXNRTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEF0dHIgYXR0cjsKLSAgICAgICAgUU5hbWUgcW5hbWU7Ci0gICAgICAgIHdoaWxlIChhdHRyaWJJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgYXR0ciA9IChBdHRyKWF0dHJpYkl0ZXIubmV4dCgpOwotICAgICAgICAgICAgLy9DaGVjayA6IGF0dHIuZ2V0TG9jYWxOYW1lKCkgfCBhdHRyLmdldE5hbWUoKQotICAgICAgICAgICAgcW5hbWUgPSBuZXcgUU5hbWUoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSwgYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgYXR0cmlidXRlc0FzUU5hbWVzLmFkZChxbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNBc1FOYW1lcy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoUU5hbWUgcW5hbWUpIHsKLSAgICAgICAgZmluYWwgT01BdHRyaWJ1dGUgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUocW5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlVmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhRTmFtZSBxbmFtZSkgewotICAgICAgICBJdGVyYXRvciBjaGlsZEl0ZXIgPSBlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUocW5hbWUpOwotICAgICAgICBDb2xsZWN0aW9uIGNoaWxkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZCh0b1NBQUpOb2RlKChvcmcudzNjLmRvbS5Ob2RlKWNoaWxkSXRlci5uZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50UU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldFFOYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQXR0cmlidXRlKFFOYW1lIHFuYW1lKSB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGUgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHFuYW1lKTsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgewotICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IHNldEVsZW1lbnRRTmFtZShRTmFtZSBuZXdOYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSB0aGlzLmVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIGlmIChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50cy5CT0RZX0xPQ0FMX05BTUUuZXF1YWxzKGxvY2FsTmFtZSkKLSAgICAgICAgICAgICAgICB8fCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUENvbnN0YW50cy5IRUFERVJfTE9DQUxfTkFNRS5lcXVhbHMobG9jYWxOYW1lKQotICAgICAgICAgICAgICAgIHx8IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQ29uc3RhbnRzLlNPQVBFTlZFTE9QRV9MT0NBTF9OQU1FIC5lcXVhbHMobG9jYWxOYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oImNoYW5naW5nIHRoaXMgZWxlbWVudCBuYW1lIGlzIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPQotICAgICAgICAgICAgICAgIG5ldyBPTU5hbWVzcGFjZUltcGwobmV3TmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmV3TmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zZXROYW1lc3BhY2Uob21OYW1lc3BhY2UpOwotICAgICAgICB0aGlzLmVsZW1lbnQuc2V0TG9jYWxOYW1lKG5ld05hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjcmVtb3ZlQXR0cmlidXRlKGphdmF4LnhtbC5zb2FwLk5hbWUpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUF0dHJpYnV0ZShOYW1lIG5hbWUpIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUF0dHJpYnV0ZSBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobmV3IFFOYW1lKG5hbWUuZ2V0VVJJKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5nZXRQcmVmaXgoKSkpOwotICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjcmVtb3ZlQ29udGVudHMoKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDb250ZW50cygpIHsKLSAgICAgICAgLy9XZSB3aWxsIGdldCBhbGwgdGhlIGNoaWxkcmVuIGFuZCBpdGVyYXRpdmVseSBjYWxsIHRoZSBkZXRhY2goKSBvbiBhbGwgb2YgJ2VtLgotICAgICAgICBJdGVyYXRvciBjaGlsZEl0ZXIgPSBlbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGNoaWxkSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gY2hpbGRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGUpIHsKLSAgICAgICAgICAgICAgICAoKG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlKW8pLmRldGFjaCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I3JlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQucmVtb3ZlTmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBlbmNvZGluZyBzdHlsZSBmb3IgdGhpcyBTT0FQRWxlbWVudCBvYmplY3QgdG8gb25lIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmNvZGluZ1N0eWxlIC0gYSBTdHJpbmcgZ2l2aW5nIHRoZSBlbmNvZGluZyBzdHlsZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgLSBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIGluIHRoZSBlbmNvZGluZyBzdHlsZSBiZWluZyBzZXQuIFNPQVBFeGNlcHRpb24gLSBpZiBzZXR0aW5nCi0gICAgICogICAgICAgICAgdGhlIGVuY29kaW5nU3R5bGUgaXMgaW52YWxpZCBmb3IgdGhpcyBTT0FQRWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZ1N0eWxlKFN0cmluZyBlbmNvZGluZ1N0eWxlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFVSSSB1cmkgPSBuZXcgVVJJKGVuY29kaW5nU3R5bGUpOwotICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmdTdHlsZS5lcXVhbHMoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF9FTkNPRElORykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEVuY29kaW5nIHN0eWxlIDogIiArIGVuY29kaW5nU3R5bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuZW5jb2RpbmdTdHlsZSA9IGVuY29kaW5nU3R5bGU7Ci0gICAgICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgRW5jb2Rpbmcgc3R5bGUgOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGVuY29kaW5nU3R5bGUgKyAiOiIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNPQVBIZWFkZXIgfHwgdGhpcyBpbnN0YW5jZW9mIFNPQVBCb2R5IHx8Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMgaW5zdGFuY2VvZiBTT0FQRmF1bHQgfHwKLSAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZW9mIFNPQVBGYXVsdEVsZW1lbnQgfHwgdGhpcyBpbnN0YW5jZW9mIFNPQVBFbnZlbG9wZSB8fAotICAgICAgICAgICAgICAgICAgICB0aGlzIGluc3RhbmNlb2YgRGV0YWlsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkVuY29kaW5nU3R5bGUgYXR0cmlidXRlIGNhbm5vdCBhcHBlYXIgaW4gOiAiICsgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTm9kZUV4I3NldFBhcmVudChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29udGFpbmVyKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT01Db250YWluZXIgcGFyZW50RWxlbWVudCkgewotICAgICAgICBlbGVtZW50LnNldFBhcmVudChwYXJlbnRFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2dldEF0dHJpYnV0ZU5vZGUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIEF0dHIgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2dldEF0dHJpYnV0ZU5vZGVOUyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAgKi8KLSAgICBwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2dldEF0dHJpYnV0ZU5TKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjZ2V0RWxlbWVudHNCeVRhZ05hbWUoamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I2dldEVsZW1lbnRzQnlUYWdOYW1lTlMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNnZXRUYWdOYW1lKCkKLSAgICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjaGFzQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjaGFzQXR0cmlidXRlTlMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjcmVtb3ZlQXR0cmlidXRlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I3JlbW92ZUF0dHJpYnV0ZU5vZGUob3JnLnczYy5kb20uQXR0cikKLSAgICAgICovCi0gICAgcHVibGljIEF0dHIgcmVtb3ZlQXR0cmlidXRlTm9kZShBdHRyIGF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50I3JlbW92ZUF0dHJpYnV0ZU5TKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uRWxlbWVudCNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjc2V0QXR0cmlidXRlTm9kZShvcmcudzNjLmRvbS5BdHRyKQotICAgICAgKi8KLSAgICBwdWJsaWMgQXR0ciBzZXRBdHRyaWJ1dGVOb2RlKEF0dHIgYXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjc2V0QXR0cmlidXRlTm9kZU5TKG9yZy53M2MuZG9tLkF0dHIpCi0gICAgICAqLwotICAgIHB1YmxpYyBBdHRyIHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyIGF0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlTlMoYXR0cik7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQjc2V0QXR0cmlidXRlTlMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLnczYy5kb20uTm9kZSNnZXROb2RlTmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUjZ2V0Tm9kZVR5cGUoKQotICAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBOb2RlLkVMRU1FTlRfTk9ERTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudEltcGwgZ2V0RWxlbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QuIFRoaXMgbWV0aG9kIGNhbiB0aHJvdyBhbgotICAgICAqIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBpZiB0aGUgdHJlZSBpcyBub3Qga2VwdCBpbiBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHBhcmVudCBvZiB0aGlzIDxjb2RlPk5vZGU8L2NvZGU+Ci0gICAgICogICAgICAgICBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyA8Y29kZT5Ob2RlPC9jb2RlPiBvYmplY3QgaXMgcm9vdAotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHdob2xlIHRyZWUgaXMgbm90IGtlcHQgaW4gbWVtb3J5Ci0gICAgICogQHNlZSAjc2V0UGFyZW50RWxlbWVudChqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCkgc2V0UGFyZW50RWxlbWVudChqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCgpIHsKLSAgICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBqYXZheC54bWwuc29hcC5Ob2RlIHBhcmVudE5vZGUgPSB0b1NBQUpOb2RlKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgU09BUEVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50KFNPQVBFbGVtZW50IHBhcmVudCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuZWxlbWVudC5zZXRQYXJlbnQoKChTT0FQRWxlbWVudEltcGwpcGFyZW50KS5lbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBEb2N1bWVudCB0aGF0IHRoaXMgTm9kZSBiZWxvbmdzIHRvICh0aGUgZG9jdW1lbnQgaW4gd2hvc2UgY29udGV4dCB0aGUgTm9kZSB3YXMKLSAgICAgKiBjcmVhdGVkKS4gVGhlIE5vZGUgbWF5IG9yIG1heSBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHRoZSB2YWx1ZSBvZiB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgPGNvZGU+Tm9kZTwvY29kZT4gb2JqZWN0IGlmIGEgY2hpbGQKLSAgICAgKiBleGlzdHMgYW5kIGl0cyB2YWx1ZSBpcyB0ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gd2l0aCB0aGUgdGV4dCBvZiB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgPGNvZGU+Tm9kZTwvY29kZT4KLSAgICAgKiAgICAgICAgIG9iamVjdCBpZiAoMSkgdGhlcmUgaXMgYSBjaGlsZCBhbmQgKDIpIHRoZSBjaGlsZCBpcyBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdDsKLSAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIGlmIChlbGVtZW50LmdldFR5cGUoKSA9PSBPTU5vZGUuVEVYVF9OT0RFKSB7Ci0gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRUZXh0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRUeXBlKCkgPT0gT01Ob2RlLkVMRU1FTlRfTk9ERSkgewotICAgICAgICAgICAgZmluYWwgT01Ob2RlIGZpcnN0T01DaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RPTUNoaWxkKCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RPTUNoaWxkIGluc3RhbmNlb2YgVGV4dEltcGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChUZXh0SW1wbClmaXJzdE9NQ2hpbGQpLmdldERhdGEoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RPTUNoaWxkIGluc3RhbmNlb2YgU09BUEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoU09BUEVsZW1lbnRJbXBsKWZpcnN0T01DaGlsZCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0TGFzdENoaWxkCi0gICAgICoKLSAgICAgKiBAc2VlIG9yZy53M2MuZG9tLk5vZGUjZ2V0TGFzdENoaWxkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGVsZW1lbnQuZ2V0TGFzdENoaWxkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0gICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHRvU0FBSk5vZGUoZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCkgewotICAgICAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IChTT0FQRWxlbWVudCkgcGFyZW50Tm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmVudE5vZGUgPSB0aGlzLnBhcmVudEVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmVudE5vZGU7Ci0gICAgfQotCi0gICAgLyoqIGRvbSBOb2RlIG1ldGhvZCAqLwotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5Ob2RlIGdldE5leHRTaWJsaW5nKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShlbGVtZW50LmdldE5leHRTaWJsaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLSAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUoZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTm9kZUxpc3RJbXBsIG5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub2Rlcy5hZGROb2RlKHRvU0FBSk5vZGUoY2hpbGROb2Rlcy5pdGVtKGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5vZGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIGlzIGEgVGV4dCBub2RlIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBzZXQgaXRzIHZhbHVlLCBvdGhlcndpc2UgaXQgc2V0cyB0aGUgdmFsdWUgb2YKLSAgICAgKiB0aGUgaW1tZWRpYXRlIChUZXh0KSBjaGlsZCBvZiB0aGlzIG5vZGUuIFRoZSB2YWx1ZSBvZiB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgbm9kZSBjYW4gYmUKLSAgICAgKiBzZXQgb25seSBpZiwgdGhlcmUgaXMgb25lIGNoaWxkIG5vZGUgYW5kIHRoYXQgbm9kZSBpcyBhIFRleHQgbm9kZSwgb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogY2hpbGRyZW4gaW4gd2hpY2ggY2FzZSBhIGNoaWxkIFRleHQgbm9kZSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHRleHQgdG8gc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5vZGUgaXMgbm90IGEgVGV4dCAgbm9kZSBhbmQgZWl0aGVyIGhhcyBtb3JlIHRoYW4gb25lCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgbm9kZSBvciBoYXMgYSBjaGlsZCBub2RlIHRoYXQgaXMgbm90IGEgVGV4dCBub2RlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE9NTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdE9NQ2hpbGQoKTsKLSAgICAgICAgaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0aGlzLmFkZFRleHROb2RlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgYWRkIHRleHQgbm9kZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCgob3JnLnczYy5kb20uTm9kZSlmaXJzdENoaWxkKS5nZXROb2RlVHlwZSgpID09IGphdmF4LnhtbC5zb2FwLk5vZGUuVEVYVF9OT0RFCi0gICAgICAgICAgICAgICAgJiYgZmlyc3RDaGlsZC5nZXROZXh0T01TaWJsaW5nKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgKChvcmcudzNjLmRvbS5UZXh0KWZpcnN0Q2hpbGQpLnNldERhdGEodmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBub2RlIGlzIG5vdCBhIFRleHQgIG5vZGUgYW5kICIgKwotICAgICAgICAgICAgICAgICAgICAiZWl0aGVyIGhhcyBtb3JlIHRoYW4gb25lIGNoaWxkIG5vZGUgb3IgaGFzIGEgY2hpbGQgIiArCi0gICAgICAgICAgICAgICAgICAgICJub2RlIHRoYXQgaXMgbm90IGEgVGV4dCBub2RlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXRhY2hOb2RlKCkgewotICAgICAgICB0aGlzLmRldGFjaCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPTU5vZGUgZGV0YWNoKCkgewotICAgICAgICBPTU5vZGUgb21Ob2RlID0gdGhpcy5lbGVtZW50LmRldGFjaCgpOwotICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgICByZXR1cm4gb21Ob2RlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLCBvciBudWxsIGlmIG5vbmUuIEF0IHRoaXMKLSAgICAgKiB3cml0aW5nLCBFbGVtZW50IGlzIHRoZSBvbmx5IHR5cGUgb2Ygbm9kZSB3aGljaCB3aWxsIGV2ZXIgaGF2ZSBhdHRyaWJ1dGVzLgotICAgICAqCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsCi0gICAgICovCi0gICAgcHVibGljIE5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9sZENoaWxkIGluc3RhbmNlb2YgU09BUEVsZW1lbnRJbXBsKSB7Ci0gICAgICAgICAgICBvbGRDaGlsZCA9ICgoU09BUEVsZW1lbnRJbXBsKW9sZENoaWxkKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQ2hpbGQgaW5zdGFuY2VvZiBUZXh0SW1wbEV4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgdGV4dCBub2RlcyBzb21laG93Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnQucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIGNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsgICAgICAgIAotICAgICAgICBpZiAoZ2V0T3duZXJEb2N1bWVudCgpICE9IGNoaWxkLmdldE93bmVyRG9jdW1lbnQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uV1JPTkdfRE9DVU1FTlRfRVJSLCAiV3JvbmcgZG9jdW1lbnQiKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhcHBlbmRUZXh0KChUZXh0KWNoaWxkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50SW1wbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhcHBlbmRFbGVtZW50KChFbGVtZW50SW1wbCljaGlsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgRE9NRXhjZXB0aW9uIGV4ID0gCi0gICAgICAgICAgICAgICAgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBleC5pbml0Q2F1c2UoZSk7Ci0gICAgICAgICAgICB0aHJvdyBleDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHN1cGVyLmFwcGVuZENoaWxkKGNoaWxkKTsgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgVGV4dCBhcHBlbmRUZXh0KFRleHQgY2hpbGQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSBjaGlsZC5nZXREYXRhKCk7Ci0gICAgICAgIFRleHQgdGV4dE5vZGUgPSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7Ci0gICAgICAgIE5vZGVJbXBsIG5vZGUgPSAoKE5vZGVJbXBsKWVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpKTsKLSAgICAgICAgVGV4dEltcGxFeCBzYWFqVGV4dE5vZGUgPSBuZXcgVGV4dEltcGxFeCh0ZXh0LCB0aGlzKTsKLSAgICAgICAgbm9kZS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpUZXh0Tm9kZSwgbnVsbCk7Ci0gICAgICAgIHJldHVybiBzYWFqVGV4dE5vZGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFbGVtZW50IGFwcGVuZEVsZW1lbnQoRWxlbWVudEltcGwgY2hpbGQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gY2hpbGQuZ2V0UHJlZml4KCk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnRJbXBsIGNoaWxkRWxlID0gbmV3IFNPQVBFbGVtZW50SW1wbChjaGlsZCk7Ci0gICAgICAgIAotICAgICAgICBjaGlsZEVsZS5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgY2hpbGRFbGUsIG51bGwpOwotICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGNoaWxkRWxlLmVsZW1lbnQuc2V0TmFtZXNwYWNlKGNoaWxkRWxlLmVsZW1lbnQuZGVjbGFyZU5hbWVzcGFjZShuYW1lc3BhY2VVUkksIHByZWZpeCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGRFbGUuZWxlbWVudCk7Ci0gICAgICAgICgoTm9kZUltcGwpY2hpbGRFbGUuZWxlbWVudC5nZXRQYXJlbnROb2RlKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIGNoaWxkRWxlLnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weUNvbnRlbnRzKFNPQVBFbGVtZW50SW1wbCBjaGlsZEVsZSwgTm9kZSBjaGlsZCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGNoaWxkLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIEF0dHIgbm9kZSA9IChBdHRyKWF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgICAgICAgIFFOYW1lIG5hbWU7Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXRQcmVmaXgoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBRTmFtZShub2RlLmdldE5hbWVzcGFjZVVSSSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gbmV3IFFOYW1lKG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGRFbGUuYWRkQXR0cmlidXRlKG5hbWUsIG5vZGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGNoaWxkLmdldENoaWxkTm9kZXMoKTsgICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICAgICAgICBjaGlsZEVsZS5hcHBlbmRDaGlsZChub2RlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRW52ZWxvcGVJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVudmVsb3BlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQ1MzJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRW52ZWxvcGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uVGV4dEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExQm9keUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExSGVhZGVySW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJIZWFkZXJJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU09BUEVudmVsb3BlSW1wbCBleHRlbmRzIFNPQVBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSB7Ci0KLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsIG9tU09BUEVudmVsb3BlOwotICAgIHByaXZhdGUgU09BUFBhcnRJbXBsIHNvYXBQYXJ0OwotCi0gICAgcHVibGljIFNPQVBFbnZlbG9wZUltcGwoZmluYWwgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBFbnZlbG9wZUltcGwgZW52ZWxvcGUpIHsKLSAgICAgICAgc3VwZXIoZW52ZWxvcGUpOwotICAgICAgICBvbVNPQVBFbnZlbG9wZSA9IGVudmVsb3BlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgc3VwZXIuc2V0T3duZXJEb2N1bWVudCgoRG9jdW1lbnRJbXBsKWRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBnZXRPTUVudmVsb3BlKCkgewotICAgICAgICByZXR1cm4gb21TT0FQRW52ZWxvcGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Q09ERT5OYW1lPC9DT0RFPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZSwgbmFtZXNwYWNlCi0gICAgICogcHJlZml4LCBhbmQgbmFtZXNwYWNlIFVSSS4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+VGhpcyBmYWN0b3J5IG1ldGhvZCBjcmVhdGVzIDxDT0RFPk5hbWU8L0NPREU+IG9iamVjdHMgZm9yIHVzZSBpbiB0aGUgU09BUC9YTUwgZG9jdW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9jYWxOYW1lIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIGxvY2FsIG5hbWUKLSAgICAgKiBAcGFyYW0gcHJlZml4ICAgIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIHByZWZpeCBvZiB0aGUgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIHVyaSAgICAgICBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBVUkkgb2YgdGhlIG5hbWVzcGFjZQotICAgICAqIEByZXR1cm4gYSA8Q09ERT5OYW1lPC9DT0RFPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZSwgbmFtZXNwYWNlIHByZWZpeCwKLSAgICAgKiAgICAgICAgIGFuZCBuYW1lc3BhY2UgVVJJCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBOYW1lIGNyZWF0ZU5hbWUoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhlZFFOYW1lKHVyaSwgbG9jYWxOYW1lLCBwcmVmaXgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxDT0RFPk5hbWU8L0NPREU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5UaGlzIGZhY3RvcnkgbWV0aG9kIGNyZWF0ZXMgPENPREU+TmFtZTwvQ09ERT4gb2JqZWN0cyBmb3IgdXNlIGluIHRoZSBTT0FQL1hNTCBkb2N1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgbG9jYWwgbmFtZQotICAgICAqIEByZXR1cm4gYSA8Q09ERT5OYW1lPC9DT0RFPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZQotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUHJlZml4ZWRRTmFtZShudWxsLCBsb2NhbE5hbWUsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QgZm9yIHRoaXMgPENPREU+IFNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5BIG5ldyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IGlzIGJ5IGRlZmF1bHQgY3JlYXRlZCB3aXRoIGEKLSAgICAgKiA8Q09ERT5TT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFuIGVtcHR5IDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdC4gQXMgYQotICAgICAqIHJlc3VsdCwgdGhlIG1ldGhvZCA8Q09ERT5nZXRIZWFkZXI8L0NPREU+IHdpbGwgYWx3YXlzIHJldHVybiBhIDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdAotICAgICAqIHVubGVzcyB0aGUgaGVhZGVyIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGEgbmV3IG9uZSBoYXMgbm90IGJlZW4gYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3Qgb3IgPENPREU+IG51bGw8L0NPREU+IGlmIHRoZXJlIGlzIG5vbmUKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIG9idGFpbmluZyB0aGUgPENPREU+U09BUEhlYWRlcjwvQ09ERT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXIgZ2V0SGVhZGVyKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKFNPQVBIZWFkZXIpdG9TQUFKTm9kZSgob3JnLnczYy5kb20uTm9kZSlvbVNPQVBFbnZlbG9wZS5nZXRIZWFkZXIoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Q09ERT5TT0FQRW52ZWxvcGU8L0NPREU+Ci0gICAgICogb2JqZWN0LgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5BIG5ldyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IGlzIGJ5IGRlZmF1bHQgY3JlYXRlZCB3aXRoIGEKLSAgICAgKiA8Q09ERT5TT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFuIGVtcHR5IDxDT0RFPlNPQVBCb2R5PC9DT0RFPiBvYmplY3QuIEFzIGEKLSAgICAgKiByZXN1bHQsIHRoZSBtZXRob2QgPENPREU+Z2V0Qm9keTwvQ09ERT4gd2lsbCBhbHdheXMgcmV0dXJuIGEgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdAotICAgICAqIHVubGVzcyB0aGUgYm9keSBoYXMgYmVlbiByZW1vdmVkIGFuZCBhIG5ldyBvbmUgaGFzIG5vdCBiZWVuIGFkZGVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdCBmb3IgdGhpcyA8Q09ERT4gU09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3Qgb3IKLSAgICAgKiAgICAgICAgIDxDT0RFPm51bGw8L0NPREU+IGlmIHRoZXJlIGlzIG5vbmUKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIG9idGFpbmluZyB0aGUgPENPREU+U09BUEJvZHk8L0NPREU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQm9keSBnZXRCb2R5KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKFNPQVBCb2R5KXRvU0FBSk5vZGUoKG9yZy53M2MuZG9tLk5vZGUpb21TT0FQRW52ZWxvcGUuZ2V0Qm9keSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0IGFuZCBzZXRzIGl0IGFzIHRoZSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QKLSAgICAgKiBmb3IgdGhpcyA8Q09ERT4gU09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIDxQPkl0IGlzIGlsbGVnYWwgdG8gYWRkIGEgaGVhZGVyIHdoZW4gdGhlIGVudmVsb3BlIGFscmVhZHkgY29udGFpbnMgYSBoZWFkZXIuIFRoZXJlZm9yZSwgdGhpcwotICAgICAqIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgdGhlIGV4aXN0aW5nIGhlYWRlciBoYXMgYmVlbiByZW1vdmVkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbmV3IDxDT0RFPlNPQVBIZWFkZXI8L0NPREU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGlzIDxDT0RFPiBTT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdCBhbHJlYWR5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGEgdmFsaWQgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXIgYWRkSGVhZGVyKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEhlYWRlciBoZWFkZXIgPSBvbVNPQVBFbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVySW1wbCBzYWFqU09BUEhlYWRlcjsKLSAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyID0gbmV3IFNPQVAxMUhlYWRlckltcGwob21TT0FQRW52ZWxvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICAgICAgc2FhalNPQVBIZWFkZXIgPSBuZXcgU09BUEhlYWRlckltcGwoaGVhZGVyKTsKLSAgICAgICAgICAgICAgICBzYWFqU09BUEhlYWRlci5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgU09BUDEySGVhZGVySW1wbChvbVNPQVBFbnZlbG9wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBzYWFqU09BUEhlYWRlciA9IG5ldyBTT0FQSGVhZGVySW1wbChoZWFkZXIpOwotICAgICAgICAgICAgICAgIHNhYWpTT0FQSGVhZGVyLnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKE5vZGVJbXBsKW9tU09BUEVudmVsb3BlLmdldEhlYWRlcigpKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNhYWpTT0FQSGVhZGVyLCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEhlYWRlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJIZWFkZXIgYWxyZWFkeSBwcmVzZW50LCBjYW4ndCBzZXQgaGVhZGVyIGFnYWluIHdpdGhvdXQgIiArCi0gICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUgZXhpc3RpbmcgaGVhZGVyLiAiICsKLSAgICAgICAgICAgICAgICAgICAgIlVzZSBnZXRIZWFkZXIoKSBtZXRob2QgYW5kIGRldGFjaCB0aGUgaGVhZGVyIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdCBhbmQgc2V0cyBpdCBhcyB0aGUgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdCBmb3IKLSAgICAgKiB0aGlzIDxDT0RFPiBTT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+SXQgaXMgaWxsZWdhbCB0byBhZGQgYSBib2R5IHdoZW4gdGhlIGVudmVsb3BlIGFscmVhZHkgY29udGFpbnMgYSBib2R5LiBUaGVyZWZvcmUsIHRoaXMKLSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBleGlzdGluZyBib2R5IGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGlzIDxDT0RFPiBTT0FQRW52ZWxvcGU8L0NPREU+IG9iamVjdCBhbHJlYWR5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGEgdmFsaWQgPENPREU+U09BUEJvZHk8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQm9keSBhZGRCb2R5KCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEJvZHkgYm9keSA9IG9tU09BUEVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkgewotICAgICAgICAgICAgYm9keSA9IG5ldyBTT0FQMTFCb2R5SW1wbChvbVNPQVBFbnZlbG9wZSwgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgICAgICBTT0FQQm9keUltcGwgc2FhalNPQVBCb2R5ID0gbmV3IFNPQVBCb2R5SW1wbChib2R5KTsKLSAgICAgICAgICAgIHNhYWpTT0FQQm9keS5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICAgICAgKChOb2RlSW1wbClvbVNPQVBFbnZlbG9wZS5nZXRCb2R5KCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhalNPQVBCb2R5LCBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBzYWFqU09BUEJvZHk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQm9keSBhbHJlYWR5IHByZXNlbnQsIGNhbid0IHNldCBib2R5IGFnYWluIHdpdGhvdXQgIiArCi0gICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUgZXhpc3RpbmcgYm9keS4gVXNlIGdldEJvZHkoKSBtZXRob2QgaW5zdGVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRUZXh0Tm9kZShTdHJpbmcgdGV4dCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBOb2RlIGZpcnN0Q2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKGZpcnN0Q2hpbGQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5UZXh0KSB7Ci0gICAgICAgICAgICAoKG9yZy53M2MuZG9tLlRleHQpZmlyc3RDaGlsZCkuc2V0RGF0YSh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEVsc2UgdGhpcyBpcyBhIGhlYWRlcgotICAgICAgICAgICAgVGV4dEltcGwgZG9vbVRleHQgPSBuZXcgVGV4dEltcGwodGV4dCwgdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgIGRvb21UZXh0LnNldE5leHRPTVNpYmxpbmcoKE5vZGVJbXBsKWZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgZG9vbVRleHQuc2V0UHJldmlvdXNPTVNpYmxpbmcobnVsbCk7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEZpcnN0Q2hpbGQoZG9vbVRleHQpOwotICAgICAgICAgICAgKChOb2RlSW1wbClmaXJzdENoaWxkKS5zZXRQcmV2aW91c09NU2libGluZyhkb29tVGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgU09BUEVsZW1lbnQuYWRkQXR0cmlidXRlIFNPQVAxLjIgc2hvdWxkIG5vdCBhbGxvdyBlbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZSB0byBiZSBzZXQKLSAgICAgKiBvbiBFbnZlbG9wCi0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGFkZEF0dHJpYnV0ZShOYW1lIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgaWYgKCJlbmNvZGluZ1N0eWxlIi5lcXVhbHMobmFtZS5nZXRMb2NhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJTT0FQMS4yIGRvZXMgbm90IGFsbG93IGVuY29kaW5nU3R5bGUgYXR0cmlidXRlIHRvIGJlIHNldCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIEVudmVsb3BlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT3ZlcnJpZGUgU09BUEVsZW1lbnQuYWRkQ2hpbGRFbGVtZW50IFNPQVAgMS4yIHNob3VsZCBub3QgYWxsb3cgZWxlbWVudCB0byBiZSBhZGRlZCBhZnRlciBib2R5Ci0gICAgICogZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoTmFtZSBuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBlbGVtZW50cyBhZnRlciBib2R5IGVsZW1lbnQiKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAvL0xldCBlbGVtZW50cyB0byBiZSBhZGRlZCBhbnkgd2hlcmUuCi0gICAgICAgICAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXQgU09BUFBhcnQgcGFyZW50Ci0gICAgICogQHBhcmFtIHNwCi0gICAgICovCi0gICAgdm9pZCBzZXRTT0FQUGFydFBhcmVudChTT0FQUGFydEltcGwgc3ApIHsKLSAgICAgICAgdGhpcy5zb2FwUGFydCA9IHNwOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFNPQVBQYXJ0Ci0gICAgICovCi0gICAgU09BUFBhcnRJbXBsIGdldFNPQVBQYXJ0UGFyZW50KCkgewotICAgICAgICByZXR1cm4gdGhpcy5zb2FwUGFydDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhY3RvcnlJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOGFmNjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkRPT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLmZhY3RvcnkuT01ET01GYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNPQVBGYWN0b3J5SW1wbCBleHRlbmRzIFNPQVBGYWN0b3J5IHsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgc29hcFZlcnNpb24gPSBTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiA8Y29kZT5OYW1lPC9jb2RlPgotICAgICAqIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGEgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIFhNTCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIGNyZWF0aW5nIHRoZSA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoTmFtZSBuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuYW1lLmdldExvY2FsTmFtZSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWUuZ2V0VVJJKCk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoc29hcFZlcnNpb24uZXF1YWxzKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpKSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQobG9jYWxOYW1lCi0gICAgICAgICAgICAgICAgICAgICwgdXJpLCBwcmVmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb21FbGVtZW50ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZQotICAgICAgICAgICAgICAgICAgICAsIHVyaSwgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICBET09NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NRWxlbWVudChsb2NhbE5hbWUsIHVyaSwgcHJlZml4KTsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKW9tRWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIGxvY2FsTmFtZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gZ2l2aW5nIHRoZSBsb2NhbCBuYW1lIGZvciB0aGUgbmV3IGVsZW1lbnQKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkCi0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIGNyZWF0aW5nIHRoZSA8Y29kZT5TT0FQRWxlbWVudDwvY29kZT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBPTURPTUZhY3Rvcnkgb21kb21GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgb21kb21GYWN0b3J5ID0gKE9NRE9NRmFjdG9yeSlET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tZG9tRmFjdG9yeSA9IChPTURPTUZhY3RvcnkpRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IG9tZG9tRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQobmV3IFFOYW1lKGxvY2FsTmFtZSkpOwotICAgICAgICByZXR1cm4gbmV3IFNPQVBFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpb21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLCBwcmVmaXggYW5kIHVyaS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgbG9jYWwgbmFtZSBmb3IgdGhlIG5ldyBlbGVtZW50Ci0gICAgICogQHBhcmFtIHByZWZpeCAgICB0aGUgcHJlZml4IGZvciB0aGlzIDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPgotICAgICAqIEBwYXJhbSB1cmkgICAgICAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgVVJJIG9mIHRoZSBuYW1lc3BhY2UgdG8gd2hpY2ggdGhlIG5ldwotICAgICAqICAgICAgICAgICAgICAgICAgZWxlbWVudCBiZWxvbmdzCi0gICAgICogQHJldHVybiB0aGUgbmV3IDxjb2RlPlNPQVBFbGVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBjcmVhdGluZyB0aGUgPGNvZGU+U09BUEVsZW1lbnQ8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoc29hcFZlcnNpb24uZXF1YWxzKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpKSB7Ci0gICAgICAgICAgICBvbUVsZW1lbnQgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQobG9jYWxOYW1lCi0gICAgICAgICAgICAgICAgICAgICwgdXJpLCBwcmVmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb21FbGVtZW50ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkuY3JlYXRlT01FbGVtZW50KGxvY2FsTmFtZQotICAgICAgICAgICAgICAgICAgICAsIHVyaSwgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFNPQVBFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpb21FbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRldGFpbDwvY29kZT4gb2JqZWN0IHdoaWNoIHNlcnZlcyBhcyBhIGNvbnRhaW5lciBmb3IKLSAgICAgKiA8Y29kZT5EZXRhaWxFbnRyeTwvY29kZT4gb2JqZWN0cy4KLSAgICAgKiA8cC8+Ci0gICAgICogVGhpcyBmYWN0b3J5IG1ldGhvZCBjcmVhdGVzIDxjb2RlPkRldGFpbDwvY29kZT4gb2JqZWN0cyBmb3IgdXNlIGluIHNpdHVhdGlvbnMgd2hlcmUgaXQgaXMgbm90Ci0gICAgICogcHJhY3RpY2FsIHRvIHVzZSB0aGUgPGNvZGU+U09BUEZhdWx0PC9jb2RlPiBhYnN0cmFjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSA8Y29kZT5EZXRhaWw8L2NvZGU+IG9iamVjdAotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgRGV0YWlsIGNyZWF0ZURldGFpbCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXRhaWxJbXBsKERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpLmNyZWF0ZVNPQVBGYXVsdERldGFpbCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGV0YWlsSW1wbChET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKS5jcmVhdGVTT0FQRmF1bHREZXRhaWwoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLCBuYW1lc3BhY2UKLSAgICAgKiBwcmVmaXgsIGFuZCBuYW1lc3BhY2UgVVJJLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIGNyZWF0ZXMgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0cyBmb3IgdXNlIGluIHNpdHVhdGlvbnMgd2hlcmUgaXQgaXMgbm90Ci0gICAgICogcHJhY3RpY2FsIHRvIHVzZSB0aGUgPGNvZGU+U09BUEVudmVsb3BlPC9jb2RlPiBhYnN0cmFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgbG9jYWwgbmFtZQotICAgICAqIEBwYXJhbSBwcmVmaXggICAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgcHJlZml4IG9mIHRoZSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gdXJpICAgICAgIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBnaXZpbmcgdGhlIFVSSSBvZiB0aGUgbmFtZXNwYWNlCi0gICAgICogQHJldHVybiBhIDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLCBuYW1lc3BhY2UgcHJlZml4LAotICAgICAqICAgICAgICAgYW5kIG5hbWVzcGFjZSBVUkkKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIE5hbWUgY3JlYXRlTmFtZShTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJlZml4ZWRRTmFtZSh1cmksIGxvY2FsTmFtZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5hbWU8L2NvZGU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIGNyZWF0ZXMgPGNvZGU+TmFtZTwvY29kZT4gb2JqZWN0cyBmb3IgdXNlIGluIHNpdHVhdGlvbnMgd2hlcmUgaXQgaXMgbm90Ci0gICAgICogcHJhY3RpY2FsIHRvIHVzZSB0aGUgPGNvZGU+U09BUEVudmVsb3BlPC9jb2RlPiBhYnN0cmFjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgbG9jYWwgbmFtZQotICAgICAqIEByZXR1cm4gYSA8Y29kZT5OYW1lPC9jb2RlPiBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9jYWwgbmFtZQotICAgICAqIEB0aHJvd3MgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIFNPQVAgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgTmFtZSBjcmVhdGVOYW1lKFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhlZFFOYW1lKG51bGwsIGxvY2FsTmFtZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBkZWZhdWx0IFNPQVBGYXVsdCBvYmplY3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgaXMgYSBTT0FQIGVycm9yCi0gICAgICovCi0gICAgcHVibGljIFNPQVBGYXVsdCBjcmVhdGVGYXVsdCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5OwotICAgICAgICBpZiAoc29hcFZlcnNpb24uZXF1YWxzKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpKSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQRmF1bHRJbXBsKHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNPQVBGYXVsdEltcGwoc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBTT0FQRmF1bHQgb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHJlYXNvblRleHQgYW5kIGZhdWx0Q29kZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvblRleHQgLSB0aGUgUmVhc29uVGV4dC9GYXVsdFN0cmluZyBmb3IgdGhlIGZhdWx0IGZhdWx0Q29kZSAtIHRoZSBGYXVsdENvZGUgZm9yCi0gICAgICogICAgICAgICAgICAgICAgICAgdGhlIGZhdWx0Ci0gICAgICogQHJldHVybjogYSBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICogQHRocm93czogU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHQgY3JlYXRlRmF1bHQoU3RyaW5nIHJlYXNvblRleHQsIFFOYW1lIGZhdWx0Q29kZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0OwotICAgICAgICBpZiAoc29hcFZlcnNpb24uZXF1YWxzKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpKSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHQgPSBuZXcgU09BUEZhdWx0SW1wbChET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlU09BUEZhdWx0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEZhdWx0ID0gbmV3IFNPQVBGYXVsdEltcGwoRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVNPQVBGYXVsdCgpKTsKLSAgICAgICAgfQotICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRDb2RlKGZhdWx0Q29kZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KHJlYXNvblRleHQsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcEZhdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNPQVBWZXJzaW9uKFN0cmluZyBzb2FwVmVyc2lvbikgewotICAgICAgICB0aGlzLnNvYXBWZXJzaW9uID0gc29hcFZlcnNpb247Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgY3JlYXRlRWxlbWVudChRTmFtZSBxbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBxbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKS5jcmVhdGVPTUVsZW1lbnQobG9jYWxOYW1lCi0gICAgICAgICAgICAgICAgLCB1cmksIHByZWZpeCk7Ci0gICAgICAgIHJldHVybiBuZXcgU09BUEVsZW1lbnRJbXBsKChFbGVtZW50SW1wbClvbUVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBjcmVhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBPTURPTUZhY3Rvcnkgb21kb21GYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgaWYgKHNvYXBWZXJzaW9uLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKSkgewotICAgICAgICAgICAgb21kb21GYWN0b3J5ID0gKE9NRE9NRmFjdG9yeSlET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9tZG9tRmFjdG9yeSA9IChPTURPTUZhY3RvcnkpRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBvbWRvbUZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICwgZWxlbWVudC5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSBvbWRvbUZhY3RvcnkuY3JlYXRlT01FbGVtZW50KGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIG5zKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTT0FQRWxlbWVudEltcGwoKEVsZW1lbnRJbXBsKW9tRWxlbWVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0RWxlbWVudEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmF1bHRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWIxNTI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmF1bHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNPQVBGYXVsdEVsZW1lbnRJbXBsIGV4dGVuZHMgU09BUEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLSAgICAgICAgU09BUEZhdWx0RWxlbWVudCB7Ci0KLSAgICAvKiogQHBhcmFtIGVsZW1lbnQgICovCi0gICAgcHVibGljIFNPQVBGYXVsdEVsZW1lbnRJbXBsKEVsZW1lbnRJbXBsIGVsZW1lbnQpIHsKLSAgICAgICAgc3VwZXIoZWxlbWVudCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzMTFiNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEZhdWx0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01OYW1lc3BhY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRE9PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0Q29kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhdWx0RGV0YWlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHROb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRSZWFzb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFJvbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFN1YkNvZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdFZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRmF1bHRWYWx1ZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmF1bHREZXRhaWxJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmF1bHRSZWFzb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmF1bHRSb2xlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJGYXVsdERldGFpbEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMi5TT0FQMTJGYXVsdFJvbGVJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmF1bHRWYWx1ZUltcGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHRFbGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRmF1bHRJbXBsIGV4dGVuZHMgU09BUEJvZHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBGYXVsdCB7Ci0KLSAgICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYXVsdCBmYXVsdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNEZXRhaWxBZGRlZDsKLSAgICBwcml2YXRlIExvY2FsZSBmYXVsdFJlYXNvbkxvY2FsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdHNTZXQ7Ci0KLSAgICAvKiogQHBhcmFtIGZhdWx0ICAqLwotICAgIHB1YmxpYyBTT0FQRmF1bHRJbXBsKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHQgZmF1bHQpIHsKLSAgICAgICAgc3VwZXIoKEVsZW1lbnRJbXBsKWZhdWx0KTsKLSAgICAgICAgdGhpcy5mYXVsdCA9IGZhdWx0OwotICAgIH0KLQotICAgIHZvaWQgc2V0RGVmYXVsdHMoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzZXRGYXVsdENvZGUoU09BUDExQ29uc3RhbnRzLlFOQU1FX1NFTkRFUl9GQVVMVENPREUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0RmF1bHRDb2RlKFNPQVAxMkNvbnN0YW50cy5RTkFNRV9TRU5ERVJfRkFVTFRDT0RFKTsKLSAgICAgICAgfQotICAgICAgICBzZXRGYXVsdFN0cmluZygiRmF1bHQgc3RyaW5nLCBhbmQgcG9zc2libHkgZmF1bHQgY29kZSwgbm90IHNldCIpOwotICAgICAgICBkZWZhdWx0c1NldCA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVtb3ZlRGVmYXVsdHMoKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0c1NldCkgewotICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHJlYXNvbiA9IHRoaXMuZmF1bHQuZ2V0UmVhc29uKCk7Ci0gICAgICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWFzb24uZGV0YWNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0c1NldCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyA8Q09ERT5TT0FQRmF1bHQ8L0NPREU+IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBmYXVsdCBjb2RlLgotICAgICAqIDxwLz4KLSAgICAgKiBGYXVsdCBjb2Rlcywgd2hpY2ggZ2l2ZW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZhdWx0LCBhcmUgZGVmaW5lZCBpbiB0aGUgU09BUCAxLjEKLSAgICAgKiBzcGVjaWZpY2F0aW9uLiBUaGlzIGVsZW1lbnQgaXMgbWFuZGF0b3J5IGluIFNPQVAgMS4xLiBCZWNhdXNlIHRoZSBmYXVsdCBjb2RlIGlzIHJlcXVpcmVkIHRvCi0gICAgICogYmUgYSBRTmFtZSBpdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgc2V0RmF1bHRDb2RlKE5hbWUpZm9ybSBvZiB0aGlzIG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdENvZGUgLSBhIFN0cmluZyBnaXZpbmcgdGhlIGZhdWx0IGNvZGUgdG8gYmUgc2V0LiBJdCBtdXN0IGJlIG9mIHRoZSBmb3JtCi0gICAgICogICAgICAgICAgICAgICAgICAicHJlZml4OmxvY2FsTmFtZSIgd2hlcmUgdGhlIHByZWZpeCBoYXMgYmVlbiBkZWZpbmVkIGluIGEgbmFtZXNwYWNlCi0gICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi4KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gYWRkaW5nIHRoZSBmYXVsdENvZGUgdG8gdGhlIHVuZGVybHlpbmcgWE1MCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHRyZWUuCi0gICAgICogQHNlZSBzZXRGYXVsdENvZGUoTmFtZSksIGdldEZhdWx0Q29kZSgpLFNPQVBFbGVtZW50LmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKFN0cmluZywgU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0Q29kZShTdHJpbmcgZmF1bHRDb2RlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZSA9IG51bGw7Ci0KLSAgICAgICAgLy9JdCBtdXN0IGJlIG9mIHRoZSBmb3JtICJwcmVmaXg6bG9jYWxOYW1lIiB3aGVyZSB0aGUgcHJlZml4IGhhcyBiZWVuIGRlZmluZWQgaW4gYQotICAgICAgICAvL25hbWVzcGFjZSBkZWNsYXJhdGlvbi4KLSAgICAgICAgaWYgKGZhdWx0Q29kZS5pbmRleE9mKCI6IikgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJmYXVsdENvZGUgbXVzdCBiZSBvZiB0aGUgZm9ybSBwcmVmaXg6bG9jYWxOYW1lIik7Ci0gICAgICAgIH0KLS8vICAgICAgICAJZWxzZXsKLS8vICAgICAgICAgICAgCVN0cmluZyBwcmVmaXgsbG9jYWxOYW1lID0iIjsKLS8vICAgICAgICAJCXByZWZpeCA9IGZhdWx0Q29kZS5zdWJzdHJpbmcoMCwgZmF1bHRDb2RlLmluZGV4T2YoIjoiKSk7Ci0vLyAgICAgICAgCQlsb2NhbE5hbWUgPSBmYXVsdENvZGUuc3Vic3RyaW5nKGZhdWx0Q29kZS5pbmRleE9mKCI6IikrMSk7Ci0vLyAgICAgICAgCX0KLQotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSAoU09BUDExRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZShmYXVsdCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlLnNldFRleHQoZmF1bHRDb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IChTT0FQMTJGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdENvZGUgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRDb2RlKGZhdWx0KTsKLSAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFZhbHVlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VmFsdWUoc29hcEZhdWx0Q29kZSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlLnNldFZhbHVlKHNvYXBGYXVsdFZhbHVlKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdFZhbHVlLnNldFRleHQoZmF1bHRDb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMuZmF1bHQuc2V0Q29kZShzb2FwRmF1bHRDb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBmYXVsdCBjb2RlIGZvciB0aGlzIDxDT0RFPlNPQVBGYXVsdDwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIDxDT0RFPlN0cmluZzwvQ09ERT4gd2l0aCB0aGUgZmF1bHQgY29kZQotICAgICAqIEBzZWUgI3NldEZhdWx0Q29kZShTdHJpbmcpIHNldEZhdWx0Q29kZShqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRDb2RlKCkgewotICAgICAgICBpZiAoZmF1bHQgIT0gbnVsbCAmJiBmYXVsdC5nZXRDb2RlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmF1bHQuZ2V0Q29kZSgpLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYXVsdC5nZXRDb2RlKCkuZ2V0VmFsdWUoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBTT0FQRmF1bHQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGZhdWx0IGFjdG9yLlRoZSBmYXVsdCBhY3RvciBpcyB0aGUgcmVjaXBpZW50IGluIHRoZQotICAgICAqIG1lc3NhZ2UgcGF0aCB3aG8gY2F1c2VkIHRoZSBmYXVsdCB0byBoYXBwZW4uIElmIHRoaXMgU09BUEZhdWx0IHN1cHBvcnRzIFNPQVAgMS4yIHRoZW4gdGhpcwotICAgICAqIGNhbGwgaXMgZXF1aXZhbGVudCB0byBzZXRGYXVsdFJvbGUoU3RyaW5nKQotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0QWN0b3IgLSBhIFN0cmluZyBpZGVudGlmeWluZyB0aGUgYWN0b3IgdGhhdCBjYXVzZWQgdGhpcyBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIGFkZGluZyB0aGUgZmF1bHRBY3RvciB0byB0aGUgdW5kZXJseWluZyBYTUwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdHJlZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYXVsdEFjdG9yKFN0cmluZyBmYXVsdEFjdG9yKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmZhdWx0LmdldFJvbGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU09BUDExRmF1bHRSb2xlSW1wbCBmYXVsdFJvbGVJbXBsID0gbmV3IFNPQVAxMUZhdWx0Um9sZUltcGwoCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhdWx0LCAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLQotICAgICAgICAgICAgICAgIGZhdWx0Um9sZUltcGwuc2V0Um9sZVZhbHVlKGZhdWx0QWN0b3IpOwotICAgICAgICAgICAgICAgIHRoaXMuZmF1bHQuc2V0Um9sZShmYXVsdFJvbGVJbXBsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0Um9sZSByb2xlID0gdGhpcy5mYXVsdC5nZXRSb2xlKCk7Ci0gICAgICAgICAgICAgICAgcm9sZS5zZXRSb2xlVmFsdWUoZmF1bHRBY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgaWYgKHRoaXMuZmF1bHQuZ2V0Um9sZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJGYXVsdFJvbGVJbXBsIGZhdWx0Um9sZUltcGwgPSBuZXcgU09BUDEyRmF1bHRSb2xlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmF1bHQsIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgICAgICAgICAgICAgZmF1bHRSb2xlSW1wbC5zZXRSb2xlVmFsdWUoZmF1bHRBY3Rvcik7Ci0gICAgICAgICAgICAgICAgdGhpcy5mYXVsdC5zZXRSb2xlKGZhdWx0Um9sZUltcGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTT0FQRmF1bHRSb2xlIHJvbGUgPSB0aGlzLmZhdWx0LmdldFJvbGUoKTsKLSAgICAgICAgICAgICAgICByb2xlLnNldFJvbGVWYWx1ZShmYXVsdEFjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQjZ2V0RmF1bHRBY3RvcigpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRBY3RvcigpIHsKLSAgICAgICAgaWYgKHRoaXMuZmF1bHQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhdWx0LmdldFJvbGUoKS5nZXRSb2xlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmYXVsdCBzdHJpbmcgZm9yIHRoaXMgPENPREU+U09BUEZhdWx0PC9DT0RFPiBvYmplY3QgdG8gdGhlIGdpdmVuIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYXVsdFN0cmluZyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmYXVsdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gYWRkaW5nIHRoZSA8Q09ERT5mYXVsdFN0cmluZzwvQ09ERT4gdG8gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgWE1MIHRyZWUuCi0gICAgICogQHNlZSAjZ2V0RmF1bHRTdHJpbmcoKSBnZXRGYXVsdFN0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRTdHJpbmcoU3RyaW5nIGZhdWx0U3RyaW5nKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzZXRGYXVsdFN0cmluZyhmYXVsdFN0cmluZywgbnVsbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgc2V0RmF1bHRTdHJpbmcoZmF1bHRTdHJpbmcsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBGYXVsdCNnZXRGYXVsdFN0cmluZygpCi0gICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRTdHJpbmcoKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZmF1bHQuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgIFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mYXVsdC5nZXRSZWFzb24oKS5nZXRUZXh0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5mYXVsdC5nZXRSZWFzb24oKSAhPSBudWxsICYmIHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkuZ2V0Rmlyc3RTT0FQVGV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkuZ2V0Rmlyc3RTT0FQVGV4dCgpLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0I2dldERldGFpbCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBEZXRhaWwgZ2V0RGV0YWlsKCkgewotICAgICAgICByZXR1cm4gKERldGFpbCl0b1NBQUpOb2RlKChvcmcudzNjLmRvbS5Ob2RlKWZhdWx0LmdldERldGFpbCgpKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhpcyBTT0FQRmF1bHQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGZhdWx0IGNvZGUuRmF1bHQgY29kZXMsIHdoaWNoIGdpdmUgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgZmF1bHQsIGFyZSBkZWZpbmVkIGluIHRoZSBTT0FQIDEuMSBzcGVjaWZpY2F0aW9uLiBBIGZhdWx0IGNvZGUgaXMgbWFuZGF0b3J5IGFuZAotICAgICAqIG11c3QgYmUgb2YgdHlwZSBRTmFtZS4gVGhpcyBtZXRob2QgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBzZXQgYSBmYXVsdCBjb2RlLiBGb3IKLSAgICAgKiBleGFtcGxlLAotICAgICAqIDxwLz4KLSAgICAgKiBTT0FQRW52ZWxvcGUgc2UgPSAuLi47IC8vIENyZWF0ZSBhIHF1YWxpZmllZCBuYW1lIGluIHRoZSBTT0FQIG5hbWVzcGFjZSB3aXRoIGEgbG9jYWxOYW1lIC8vCi0gICAgICogb2YgQ2xpZW50LiBOb3RlIHRoYXQgcHJlZml4IHBhcmFtZXRlciBpcyBvcHRpb25hbCBhbmQgaXMgbnVsbCAvLyBoZXJlIHdoaWNoIGNhdXNlcyB0aGUKLSAgICAgKiBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYW4gYXBwcm9wcmlhdGUgcHJlZml4LiBOYW1lIHFuYW1lID0gc2UuY3JlYXRlTmFtZShDbGllbnQsCi0gICAgICogbnVsbCxTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQX0VOVkVMT1BFKTsgU09BUEZhdWx0IGZhdWx0ID0gLi4uOyBmYXVsdC5zZXRGYXVsdENvZGUocW5hbWUpOwotICAgICAqIDxwLz4KLSAgICAgKiBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGlzIG1ldGhvZCBvdmVyIHNldEZhdWx0Q29kZShTdHJpbmcpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0Q29kZVFOYW1lIC0gYSBOYW1lIG9iamVjdCBnaXZpbmcgdGhlIGZhdWx0IGNvZGUgdG8gYmUgc2V0LiBJdCBtdXN0IGJlIG5hbWVzcGFjZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIGFkZGluZyB0aGUgZmF1bHRjb2RlIGVsZW1lbnQgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgWE1MIHRyZWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRDb2RlKE5hbWUgZmF1bHRDb2RlTmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoZmF1bHRDb2RlTmFtZS5nZXRVUkkoKSA9PSBudWxsIHx8IGZhdWx0Q29kZU5hbWUuZ2V0VVJJKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJmYXVsdENvZGVRTmFtZSBtdXN0IGJlIG5hbWVzcGFjZSBxdWFsaWZpZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgUU5hbWUgZmF1bHRDb2RlUU5hbWUgPSAKLSAgICAgICAgICAgIG5ldyBRTmFtZShmYXVsdENvZGVOYW1lLmdldFVSSSgpLCBmYXVsdENvZGVOYW1lLmdldExvY2FsTmFtZSgpLCBmYXVsdENvZGVOYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgc2V0RmF1bHRDb2RlKGZhdWx0Q29kZVFOYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0I2FkZERldGFpbCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBEZXRhaWwgYWRkRGV0YWlsKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNEZXRhaWxBZGRlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIlRoaXMgU09BUEZhdWx0IGFscmVhZHkgY29udGFpbnMgYSBEZXRhaWwgZWxlbWVudC4gIiArCi0gICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVtb3ZlIHRoZSBleGlzdGluZyBEZXRhaWwgZWxlbWVudCBiZWZvcmUgIiArCi0gICAgICAgICAgICAgICAgICAgICJjYWxsaW5nIGFkZERldGFpbCgpIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQRmF1bHREZXRhaWwgb21EZXRhaWw7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIG9tRGV0YWlsID0gbmV3IFNPQVAxMUZhdWx0RGV0YWlsSW1wbCh0aGlzLmZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb21EZXRhaWwgPSBuZXcgU09BUDEyRmF1bHREZXRhaWxJbXBsKHRoaXMuZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgICAgRGV0YWlsIHNhYWpEZXRhaWwgPSBuZXcgRGV0YWlsSW1wbChvbURldGFpbCk7Ci0gICAgICAgICgoTm9kZUltcGwpZmF1bHQuZ2V0RGV0YWlsKCkpLnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc2FhakRldGFpbCwgbnVsbCk7Ci0gICAgICAgIGlzRGV0YWlsQWRkZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gc2FhakRldGFpbDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0I2dldEZhdWx0Q29kZUFzTmFtZSgpCi0gICAgICAqLwotICAgIHB1YmxpYyBOYW1lIGdldEZhdWx0Q29kZUFzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhlZFFOYW1lKGdldEZhdWx0Q29kZUFzUU5hbWUoKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBmYXVsdCBzdHJpbmcgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdCB0byB0aGUgZ2l2ZW4gc3RyaW5nLiBJZiB0aGlzIFNPQVBGYXVsdCBpcwotICAgICAqIHBhcnQgb2YgYSBtZXNzYWdlIHRoYXQgc3VwcG9ydHMgU09BUCAxLjIgdGhlbiB0aGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0bzoKLSAgICAgKiBhZGRGYXVsdFJlYXNvblRleHQoZmF1bHRTdHJpbmcsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAqCi0gICAgICogQHBhcmFtIGZhdWx0U3RyaW5nIC0gYSBTdHJpbmcgZ2l2aW5nIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmYXVsdAotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhZGRpbmcgdGhlIGZhdWx0U3RyaW5nIHRvIHRoZSB1bmRlcmx5aW5nIFhNTAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICB0cmVlLgotICAgICAqIEBzZWUgZ2V0RmF1bHRTdHJpbmcoKQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRTdHJpbmcoU3RyaW5nIGZhdWx0U3RyaW5nLCBMb2NhbGUgbG9jYWxlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmZhdWx0LmdldFJlYXNvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiByZWFzb24gPSB0aGlzLmZhdWx0LmdldFJlYXNvbigpOwotICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICByZWFzb24uc2V0VGV4dChmYXVsdFN0cmluZyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBhZGRGYXVsdFJlYXNvblRleHQoZmF1bHRTdHJpbmcsIGxvY2FsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiByZWFzb24gPSBuZXcgU09BUDExRmF1bHRSZWFzb25JbXBsKHRoaXMuZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICByZWFzb24uc2V0VGV4dChmYXVsdFN0cmluZyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBhZGRGYXVsdFJlYXNvblRleHQoZmF1bHRTdHJpbmcsIGxvY2FsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5mYXVsdFJlYXNvbkxvY2FsZSA9IGxvY2FsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsb2NhbGUgb2YgdGhlIGZhdWx0IHN0cmluZyBmb3IgdGhpcyBTT0FQRmF1bHQgb2JqZWN0LiBJZiB0aGlzIFNPQVBGYXVsdCBpcyBwYXJ0IG9mIGEKLSAgICAgKiBtZXNzYWdlIHRoYXQgc3VwcG9ydHMgU09BUCAxLjIgdGhlbiB0aGlzIGNhbGwgaXMgZXF1aXZhbGVudCB0bzoKLSAgICAgKiA8cC8+Ci0gICAgICogTG9jYWxlIGxvY2FsZSA9IG51bGw7IHRyeSB7IGxvY2FsZSA9IChMb2NhbGUpIGdldEZhdWx0UmVhc29uTG9jYWxlcygpLm5leHQoKTsgfSBjYXRjaAotICAgICAqIChTT0FQRXhjZXB0aW9uIGUpIHt9IHJldHVybiBsb2NhbGU7Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgTG9jYWxlIG9iamVjdCBpbmRpY2F0aW5nIHRoZSBuYXRpdmUgbGFuZ3VhZ2Ugb2YgdGhlIGZhdWx0IHN0cmluZyBvciBudWxsIGlmIG5vCi0gICAgICogICAgICAgICBsb2NhbGUgd2FzIHNwZWNpZmllZAotICAgICAqIEBzZWUgc2V0RmF1bHRTdHJpbmcoU3RyaW5nLCBMb2NhbGUpCi0gICAgICogQHNpbmNlIFNBQUogMS4yCi0gICAgICovCi0gICAgcHVibGljIExvY2FsZSBnZXRGYXVsdFN0cmluZ0xvY2FsZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLmZhdWx0UmVhc29uTG9jYWxlOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0RmF1bHRSZWFzb25Mb2NhbGVzKCkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IChMb2NhbGUpZ2V0RmF1bHRSZWFzb25Mb2NhbGVzKCkubmV4dCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIG9yIHJlcGxhY2VzIGEgUmVhc29uIFRleHQgaXRlbSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgdGV4dCBtZXNzYWdlIGFuZCBhbiB4bWw6bGFuZwotICAgICAqIGRlcml2ZWQgZnJvbSBsb2NhbGUuIElmIGEgUmVhc29uIFRleHQgaXRlbSB3aXRoIHRoaXMgeG1sOmxhbmcgYWxyZWFkeSBleGlzdHMgaXRzIHRleHQgdmFsdWUKLSAgICAgKiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGV4dC4gVGhlIGxvY2FsZSBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBudWxsIENvZGUgc2FtcGxlOiBTT0FQRmF1bHQKLSAgICAgKiBmYXVsdCA9IC4uLjsgZmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KFZlcnNpb24gTWlzbWF0Y2gsIExvY2FsZS5FTkdMSVNIKTsKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IC0gcmVhc29uIG1lc3NhZ2Ugc3RyaW5nIGxvY2FsZSAtIExvY2FsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2NhbGUgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgbWVzc2FnZQotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhZGRpbmcgdGhlIFJlYXNvbiB0ZXh0IG9yIHRoZSBsb2NhbGUgcGFzc2VkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHdhcyBudWxsLiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZiB0aGlzIG1lc3NhZ2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRmF1bHRSZWFzb25UZXh0KFN0cmluZyB0ZXh0LCBMb2NhbGUgbG9jYWxlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIlJlY2VpdmVkIG51bGwgZm9yIGxvY2FsZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgaW4gU09BUCAxLjEiKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICByZW1vdmVEZWZhdWx0cygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgZXhpc3RpbmdSZWFzb25UZXh0ID0gZ2V0RmF1bHRSZWFzb25UZXh0KGxvY2FsZSk7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdSZWFzb25UZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBudWxsOwotICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gKFNPQVAxMkZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmZhdWx0LmdldFJlYXNvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0UmVhc29uIHNvYXBGYXVsdFJlYXNvbiA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFJlYXNvbih0aGlzLmZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXVsdC5zZXRSZWFzb24oc29hcEZhdWx0UmVhc29uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFRleHQodGhpcy5mYXVsdC5nZXRSZWFzb24oKSk7Ci0gICAgICAgICAgICAgICAgc29hcEZhdWx0VGV4dC5zZXRUZXh0KHRleHQpOwotICAgICAgICAgICAgICAgIHNvYXBGYXVsdFRleHQuc2V0TGFuZyhsb2NhbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSB0ZXh0Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igc29hcFRleHRzSXRyID0gdGhpcy5mYXVsdC5nZXRSZWFzb24oKS5nZXRBbGxTb2FwVGV4dHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChzb2FwVGV4dHNJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBGYXVsdFRleHQgc29hcEZhdWx0VGV4dCA9IChTT0FQRmF1bHRUZXh0KXNvYXBUZXh0c0l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzb2FwRmF1bHRUZXh0LmdldExhbmcoKS5lcXVhbHMobG9jYWxlLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwRmF1bHRUZXh0LnNldFRleHQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIFN1YmNvZGUgdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2Ugb2YgU3ViY29kZXMgY29udGFpbmVkIGJ5IHRoaXMgU09BUEZhdWx0LiBTdWJjb2RlcywKLSAgICAgKiB3aGljaCB3ZXJlIGludHJvZHVjZWQgaW4gU09BUCAxLjIsIGFyZSByZXByZXNlbnRlZCBieSBhIHJlY3Vyc2l2ZSBzZXF1ZW5jZSBvZiBzdWJlbGVtZW50cwotICAgICAqIHJvb3RlZCBpbiB0aGUgbWFuZGF0b3J5IENvZGUgc3ViZWxlbWVudCBvZiBhIFNPQVAgRmF1bHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3ViY29kZSAtIGEgUU5hbWUgY29udGFpbmluZyB0aGUgVmFsdWUgb2YgdGhlIFN1YmNvZGUuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIFN1YmNvZGUgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgU3ViY29kZS4KLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIGFwcGVuZEZhdWx0U3ViY29kZShRTmFtZSBzdWJjb2RlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc29hcEZhdWx0U3ViQ29kZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKHN1YmNvZGUuZ2V0TmFtZXNwYWNlVVJJKCkgPT0gbnVsbCB8fCBzdWJjb2RlLmdldE5hbWVzcGFjZVVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiVW5xdWFsaWZpZWQgUU5hbWUgb2JqZWN0IDogIiArIHN1YmNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBzb2FwRmFjdG9yeSA9IERPT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDEyRmFjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMuZmF1bHQuZ2V0Q29kZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdENvZGUodGhpcy5mYXVsdCk7Ci0gICAgICAgICAgICAvL2lmIFNPQVBGYXVsdCBpcyBudWxsLCB0aGVyZSBjYW5ub3QgYmUgYSBzdWJjb2RlLgotICAgICAgICAgICAgLy9IZW5jZSBzaG91bGQgY3JlYXRlIG9uZQotICAgICAgICAgICAgc29hcEZhdWx0U3ViQ29kZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdFN1YkNvZGUodGhpcy5mYXVsdC5nZXRDb2RlKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmF1bHQuZ2V0Q29kZSgpLmdldFN1YkNvZGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvL2ZpbmQgdGhlIGxhc3Qgc3ViY29kZS5wYXJlbnQgb2YgdGhlIG5ldyBzdWJjb2RlIHNob3VsZCBiZSB0aGUgdGhpcyBsYXN0IHN1YmNvZGUKLSAgICAgICAgICAgIHNvYXBGYXVsdFN1YkNvZGUgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHRTdWJDb2RlKAotICAgICAgICAgICAgICAgICAgICBnZXRMYXN0U3ViQ29kZSh0aGlzLmZhdWx0LmdldENvZGUoKS5nZXRTdWJDb2RlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vRmF1bHRDb2RlIGlzIHRoZXJlLCBidXQgbm8gRmF1bHRTdWJDb2RlCi0gICAgICAgICAgICBzb2FwRmF1bHRTdWJDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0U3ViQ29kZSh0aGlzLmZhdWx0LmdldENvZGUoKSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmIChzb2FwRmF1bHRTdWJDb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlSW1wbCBzb2FwRmF1bHRWYWx1ZWltcGwgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU09BUDEyRmF1bHRWYWx1ZUltcGwoc29hcEZhdWx0U3ViQ29kZSwgc29hcEZhY3RvcnkpOwotICAgICAgICAgICAgc29hcEZhdWx0VmFsdWVpbXBsLnNldFRleHQoc3ViY29kZS5nZXRQcmVmaXgoKSArICI6IiArIHN1YmNvZGUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgc29hcEZhdWx0VmFsdWVpbXBsLmRlY2xhcmVOYW1lc3BhY2Uoc3ViY29kZS5nZXROYW1lc3BhY2VVUkkoKSwgc3ViY29kZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNPQVBGYXVsdFN1YkNvZGUgZ2V0TGFzdFN1YkNvZGUoU09BUEZhdWx0U3ViQ29kZSBmaXJzdFN1YkNvZGVFbGVtZW50KSB7Ci0gICAgICAgIFNPQVBGYXVsdFN1YkNvZGUgc29hcEZhdWx0U3ViQ29kZSA9IGZpcnN0U3ViQ29kZUVsZW1lbnQuZ2V0U3ViQ29kZSgpOwotICAgICAgICBpZiAoc29hcEZhdWx0U3ViQ29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0TGFzdFN1YkNvZGUoc29hcEZhdWx0U3ViQ29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpcnN0U3ViQ29kZUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZmF1bHQgY29kZSBmb3IgdGhpcyBTT0FQRmF1bHQgb2JqZWN0IGFzIGEgPENPREU+UU5hbWU8L0NPREU+IG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICovCi0gICAgcHVibGljIFFOYW1lIGdldEZhdWx0Q29kZUFzUU5hbWUoKSB7Ci0gICAgICAgIFNPQVBGYXVsdENvZGUgc29hcEZhdWx0Q29kZSA9IHRoaXMuZmF1bHQuZ2V0Q29kZSgpOwotICAgICAgICBpZiAoc29hcEZhdWx0Q29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzb2FwRmF1bHRDb2RlLmdldFRleHRBc1FOYW1lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzb2FwRmF1bHRDb2RlLmdldFZhbHVlKCkuZ2V0VGV4dEFzUU5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBOb2RlIGVsZW1lbnQgdmFsdWUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdC4gVGhlIE5vZGUgZWxlbWVudCBpcwotICAgICAqIG9wdGlvbmFsIGluIFNPQVAgMS4yLgotICAgICAqCi0gICAgICogQHJldHVybiBDb250ZW50IG9mIHRoZSBlbnY6RmF1bHQvZW52Ok5vZGUgZWxlbWVudCBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vbmUKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBOb2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHROb2RlKCkgewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAiU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBOb2RlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmF1bHQgIT0gbnVsbCAmJiBmYXVsdC5nZXROb2RlKCkgIT0gbnVsbCAmJiBmYXVsdC5nZXROb2RlKCkuZ2V0VGV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmF1bHQuZ2V0Tm9kZSgpLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb3ZlciBhIGRpc3RpbmN0IHNlcXVlbmNlIG9mIExvY2FsZXMgZm9yIHdoaWNoIHRoZXJlIGFyZSBhc3NvY2lhdGVkIFJlYXNvbgotICAgICAqIFRleHQgaXRlbXMuIEFueSBvZiB0aGVzZSBMb2NhbGVzIGNhbiBiZSB1c2VkIGluIGEgY2FsbCB0byBnZXRGYXVsdFJlYXNvblRleHQgaW4gb3JkZXIgdG8KLSAgICAgKiBvYnRhaW4gYSBsb2NhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgUmVhc29uIFRleHQgc3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvdmVyIGEgc2VxdWVuY2Ugb2YgTG9jYWxlIG9iamVjdHMgZm9yIHdoaWNoIHRoZXJlIGFyZSBhc3NvY2lhdGVkIFJlYXNvbgotICAgICAqICAgICAgICAgVGV4dCBpdGVtcy4KLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gcmV0cmlldmluZyB0aGUgZmF1bHQgUmVhc29uIGxvY2FsZXMuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IFJlYXNvbi4KLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0RmF1bHRSZWFzb25Mb2NhbGVzKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAiU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBmYXVsdFJlYXNvbkxvY2FsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBMaXN0IHNvYXBUZXh0TGlzdCA9IHRoaXMuZmF1bHQuZ2V0UmVhc29uKCkuZ2V0QWxsU29hcFRleHRzKCk7Ci0gICAgICAgICAgICBpZiAoc29hcFRleHRMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBmYXVsdFJlYXNvbnMgPSBzb2FwVGV4dExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZmF1bHRSZWFzb25zLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBGYXVsdFRleHQgPSAoU09BUEZhdWx0VGV4dClmYXVsdFJlYXNvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZyA9IHNvYXBGYXVsdFRleHQuZ2V0TGFuZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGFuZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYXVsdFJlYXNvbkxvY2FsZXMuYWRkKExvY2FsZS5nZXREZWZhdWx0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcuaW5kZXhPZigiXyIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbGFuZy5zdWJzdHJpbmcoMCwgbGFuZy5pbmRleE9mKCJfIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbGFuZy5zdWJzdHJpbmcobGFuZy5pbmRleE9mKCJfIikgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXVsdFJlYXNvbkxvY2FsZXMuYWRkKG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRSZWFzb25Mb2NhbGVzLmFkZChuZXcgTG9jYWxlKGxhbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYXVsdFJlYXNvbkxvY2FsZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFJlYXNvbiBUZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTG9jYWxlLiBJZiBtb3JlIHRoYW4gb25lIHN1Y2ggUmVhc29uIFRleHQKLSAgICAgKiBleGlzdHMgdGhlIGZpcnN0IG1hdGNoaW5nIFRleHQgaXMgcmV0dXJuZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhbGUgLSB0aGUgTG9jYWxlIGZvciB3aGljaCBhIGxvY2FsaXplZCBSZWFzb24gVGV4dCBpcyBkZXNpcmVkCi0gICAgICogQHJldHVybiB0aGUgUmVhc29uIFRleHQgYXNzb2NpYXRlZCB3aXRoIGxvY2FsZQotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbiByZXRyaWV2aW5nIHRoZSBmYXVsdCBSZWFzb24gdGV4dCBmb3IgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBsb2NhbGUuIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmIHRoaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IFJlYXNvbi4KLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhdWx0UmVhc29uVGV4dChMb2NhbGUgbG9jYWxlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICJTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IFJlYXNvbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSXRlcmF0b3Igc29hcFRleHRzSXRyID0gbnVsbDsKLSAgICAgICAgICAgIFNPQVBGYXVsdFJlYXNvbiBzb2FwRmF1bHRSZWFzb24gPSB0aGlzLmZhdWx0LmdldFJlYXNvbigpOwotICAgICAgICAgICAgaWYgKHNvYXBGYXVsdFJlYXNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBzb2FwVGV4dHMgPSBzb2FwRmF1bHRSZWFzb24uZ2V0QWxsU29hcFRleHRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBUZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBUZXh0c0l0ciA9IHNvYXBUZXh0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc29hcFRleHRzSXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU09BUEZhdWx0VGV4dCBzb2FwRmF1bHRUZXh0ID0gKFNPQVBGYXVsdFRleHQpc29hcFRleHRzSXRyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb2FwRmF1bHRUZXh0LmdldExhbmcoKS5lcXVhbHMobG9jYWxlLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvYXBGYXVsdFRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gSXRlcmF0b3Igb3ZlciBhIHNlcXVlbmNlIG9mIFN0cmluZyBvYmplY3RzIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBSZWFzb24gVGV4dCBpdGVtcwotICAgICAqIGZvciB0aGlzIFNPQVBGYXVsdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiByZXRyaWV2aW5nIHRleHRzIGZvciBSZWFzb24gb2JqZWN0cwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24uCi0gICAgICovCi0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0RmF1bHRSZWFzb25UZXh0cygpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3Igc29hcFRleHRzSXRyID0gdGhpcy5mYXVsdC5nZXRSZWFzb24oKS5nZXRBbGxTb2FwVGV4dHMoKS5pdGVyYXRvcigpOwotICAgICAgICBBcnJheUxpc3QgcmVhc29uVGV4dHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChzb2FwVGV4dHNJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTT0FQRmF1bHRUZXh0IHNvYXBGYXVsdFRleHQgPSAoU09BUEZhdWx0VGV4dClzb2FwVGV4dHNJdHIubmV4dCgpOwotICAgICAgICAgICAgcmVhc29uVGV4dHMuYWRkKHNvYXBGYXVsdFRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVhc29uVGV4dHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBSb2xlIGVsZW1lbnQgdmFsdWUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdC4gVGhlIFJvbGUgZWxlbWVudCBpcwotICAgICAqIG9wdGlvbmFsIGluIFNPQVAgMS4yLgotICAgICAqCi0gICAgICogQHJldHVybiBDb250ZW50IG9mIHRoZSBlbnY6RmF1bHQvZW52OlJvbGUgZWxlbWVudCBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vbmUKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSb2xlLgotICAgICAqIEBzaW5jZSBTQUFKIDEuMwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmF1bHRSb2xlKCkgewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJNZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlICIgKwotICAgICAgICAgICAgICAgICAgICAiU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBSZWFzb24iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0aGlzLmZhdWx0LmdldFJvbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmF1bHQuZ2V0Um9sZSgpLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTdWJjb2RlcyBmb3IgdGhpcyBTT0FQRmF1bHQgYXMgYW4gaXRlcmF0b3Igb3ZlciBRTmFtZXMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIHRoYXQgYWNjZXNzZXMgYSBzZXF1ZW5jZSBvZiBRTmFtZXMuIFRoaXMgSXRlcmF0b3Igc2hvdWxkIG5vdCBzdXBwb3J0IHRoZQotICAgICAqICAgICAgICAgb3B0aW9uYWwgcmVtb3ZlIG1ldGhvZC4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBTdWJjb2RlcyBhcmUgcmV0dXJuZWQgcmVmbGVjdHMgdGhlCi0gICAgICogICAgICAgICBoaWVyYXJjaHkgb2YgU3ViY29kZXMgcHJlc2VudCBpbiB0aGUgZmF1bHQgZnJvbSB0b3AgdG8gYm90dG9tLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIFN1YmNvZGUuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldEZhdWx0U3ViY29kZXMoKSB7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBBcnJheUxpc3QgZmF1bHRTdWJjb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgU09BUEZhdWx0U3ViQ29kZSBzdWJDb2RlRWxlbWVudCA9IHRoaXMuZmF1bHQuZ2V0Q29kZSgpLmdldFN1YkNvZGUoKTsKLSAgICAgICAgd2hpbGUgKHN1YkNvZGVFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gc3ViQ29kZUVsZW1lbnQuZ2V0VmFsdWUoKS5nZXRUZXh0QXNRTmFtZSgpOwotICAgICAgICAgICAgZmF1bHRTdWJjb2Rlcy5hZGQocW5hbWUpOwotICAgICAgICAgICAgc3ViQ29kZUVsZW1lbnQgPSBzdWJDb2RlRWxlbWVudC5nZXRTdWJDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhdWx0U3ViY29kZXMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoaXMgU09BUEZhdWx0IGhhcyBhIERldGFpbCBzdWJlbGVtZW50IGFuZCBmYWxzZSBvdGhlcndpc2UuICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRGV0YWlsKCkgewotICAgICAgICBpZiAodGhpcy5mYXVsdC5nZXREZXRhaWwoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbnkgU3ViY29kZXMgdGhhdCBtYXkgYmUgY29udGFpbmVkIGJ5IHRoaXMgU09BUEZhdWx0LiBTdWJzZXF1ZW50IGNhbGxzIHRvCi0gICAgICogZ2V0RmF1bHRTdWJjb2RlcyB3aWxsIHJldHVybiBhbiBlbXB0eSBpdGVyYXRvciB1bnRpbCBhIGNhbGwgdG8gYXBwZW5kRmF1bHRTdWJjb2RlIGlzIG1hZGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgLSBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBTdWJjb2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFsbEZhdWx0U3ViY29kZXMoKSB7Ci0gICAgICAgIGlmIChmYWN0b3J5IGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYXVsdC5nZXRDb2RlKCkuZ2V0U3ViQ29kZSgpLmRldGFjaCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoaXMgU09BUEZhdWx0IG9iamVjdCB3aXRoIHRoZSBnaXZlbiBmYXVsdCBjb2RlLiBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGlzIG1ldGhvZAotICAgICAqIG92ZXIgc2V0RmF1bHRDb2RlKE5hbWUpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmF1bHRDb2RlUU5hbWUgLSBhIFFOYW1lIG9iamVjdCBnaXZpbmcgdGhlIGZhdWx0IGNvZGUgdG8gYmUgc2V0LiBJdCBtdXN0IGJlIG5hbWVzcGFjZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWQuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIGFkZGluZyB0aGUgZmF1bHRjb2RlIGVsZW1lbnQgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgWE1MIHRyZWUuCi0gICAgICogQHNlZSBnZXRGYXVsdENvZGVBc1FOYW1lKCksIHNldEZhdWx0Q29kZShOYW1lKSwgZ2V0RmF1bHRDb2RlQXNRTmFtZSgpCi0gICAgICogQHNpbmNlIFNBQUogMS4zCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRDb2RlKFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKCJVbnF1YWxpZmllZCBRTmFtZSBvYmplY3QgOiAiICsgcW5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICBpZiAoIShxbmFtZS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiSW5jb3JyZWN0IFVSSSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkludmFsaWQgU09BUCB2ZXJzaW9uIik7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhdWx0Q29kZSBzb2FwRmF1bHRDb2RlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Q29kZSh0aGlzLmZhdWx0KTsKLQotICAgICAgICBTdHJpbmcgcHJlZml4ID0gKChxbmFtZS5nZXRQcmVmaXgoKSAhPSBudWxsKSAmJiAhcW5hbWUuZ2V0UHJlZml4KCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKCIiKSkgPyBxbmFtZS5nZXRQcmVmaXgoKSA6IHRoaXMuZmF1bHQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgICAgIC5nZXRQcmVmaXgoKTsKLQotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgc29hcEZhdWx0Q29kZS5zZXRUZXh0KHByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIE9NTmFtZXNwYWNlIG9tTmFtZXNwYWNlID0gbmV3IE9NTmFtZXNwYWNlSW1wbChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHRDb2RlLmRlY2xhcmVOYW1lc3BhY2Uob21OYW1lc3BhY2UpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIFNPQVBGYXVsdFZhbHVlIHNvYXBGYXVsdFZhbHVlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0VmFsdWUoc29hcEZhdWx0Q29kZSk7Ci0gICAgICAgICAgICAvLyBkb24ndCBqdXN0IHVzZSB0aGUgZGVmYXVsdCBwcmVmaXgsIHVzZSB0aGUgcGFzc2VkIG9uZSBvciB0aGUgcGFyZW50J3MKLSAgICAgICAgICAgIHNvYXBGYXVsdFZhbHVlLnNldFRleHQocHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgT01OYW1lc3BhY2Ugb21OYW1lc3BhY2UgPSBuZXcgT01OYW1lc3BhY2VJbXBsKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdFZhbHVlLmRlY2xhcmVOYW1lc3BhY2Uob21OYW1lc3BhY2UpOwotICAgICAgICAgICAgc29hcEZhdWx0Q29kZS5zZXRWYWx1ZShzb2FwRmF1bHRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRoaXMuZmF1bHQuc2V0Q29kZShzb2FwRmF1bHRDb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIG9yIHJlcGxhY2VzIGFueSBleGlzdGluZyBOb2RlIGVsZW1lbnQgdmFsdWUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdC4gVGhlIE5vZGUKLSAgICAgKiBlbGVtZW50IGlzIG9wdGlvbmFsIGluIFNPQVAgMS4yLgotICAgICAqCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIE5vZGUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgTm9kZS4KLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldEZhdWx0Tm9kZShTdHJpbmcgcykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJtZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aGUgU09BUCAxLjIgY29uY2VwdCBvZiBGYXVsdCBOb2RlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgc29hcEZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICBTT0FQRmF1bHROb2RlIHNvYXBGYXVsdE5vZGUgPSBzb2FwRmFjdG9yeS5jcmVhdGVTT0FQRmF1bHROb2RlKHRoaXMuZmF1bHQpOwotICAgICAgICBzb2FwRmF1bHROb2RlLnNldFRleHQocyk7Ci0gICAgICAgIHRoaXMuZmF1bHQuc2V0Tm9kZShzb2FwRmF1bHROb2RlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIG9yIHJlcGxhY2VzIGFueSBleGlzdGluZyBSb2xlIGVsZW1lbnQgdmFsdWUgZm9yIHRoaXMgU09BUEZhdWx0IG9iamVjdC4gVGhlIFJvbGUKLSAgICAgKiBlbGVtZW50IGlzIG9wdGlvbmFsIGluIFNPQVAgMS4yLgotICAgICAqCi0gICAgICogQHBhcmFtIHVyaSAtIHRoZSBVUkkgb2YgdGhlIFJvbGUKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gLSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gc2V0dGluZyB0aGUgUm9sZSBmb3IgdGhpcyBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmIHRoaXMgbWVzc2FnZSBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBTT0FQIDEuMiBjb25jZXB0IG9mIEZhdWx0IFJvbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRSb2xlKFN0cmluZyB1cmkpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigibWVzc2FnZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUm9sZSIpOwotICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTJGYWN0b3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEZhdWx0Um9sZSBzb2FwRmF1bHRSb2xlID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEZhdWx0Um9sZSh0aGlzLmZhdWx0KTsKLSAgICAgICAgc29hcEZhdWx0Um9sZS5zZXRSb2xlVmFsdWUodXJpKTsKLSAgICAgICAgdGhpcy5mYXVsdC5zZXRSb2xlKHNvYXBGYXVsdFJvbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEVsZW1lbnRzKE5hbWUgbmFtZSkgewotICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShuYW1lLmdldFVSSSgpLCBuYW1lLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQuZ2V0Q2hpbGRyZW5XaXRoTmFtZShxTmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRDaGlsZEVsZW1lbnRzKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudC5nZXRDaGlsZHJlbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEl0ZXJhdG9yIGdldENoaWxkcmVuKEl0ZXJhdG9yIGNoaWxkSXRlcikgewotICAgICAgICBDb2xsZWN0aW9uIGNoaWxkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChjaGlsZEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGRvbU5vZGUgPSAob3JnLnczYy5kb20uTm9kZSljaGlsZEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgTm9kZSBzYWFqTm9kZSA9IHRvU0FBSk5vZGUoZG9tTm9kZSk7Ci0gICAgICAgICAgICBpZiAoIShzYWFqTm9kZSBpbnN0YW5jZW9mIFNPQVBGYXVsdEVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2lsZW50bHkgcmVwbGFjZSBub2RlLCBhcyBwZXIgc2FhaiAxLjIgc3BlYwotICAgICAgICAgICAgICAgIFNPQVBGYXVsdEVsZW1lbnQgYm9keUVsZSA9IG5ldyBTT0FQRmF1bHRFbGVtZW50SW1wbCgoRWxlbWVudEltcGwpZG9tTm9kZSk7Ci0gICAgICAgICAgICAgICAgKChOb2RlSW1wbClkb21Ob2RlKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIGJvZHlFbGUsIG51bGwpOwotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKGJvZHlFbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRzLmFkZChzYWFqTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVyRWxlbWVudEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVyRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4Mzc5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEhlYWRlckVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXJFbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckVsZW1lbnRJbXBsIGV4dGVuZHMgU09BUEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEhlYWRlckVsZW1lbnQgewotCi0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyRWxlbTsKLQotICAgIC8qKiBAcGFyYW0gZWxlbWVudCAgKi8KLSAgICBwdWJsaWMgU09BUEhlYWRlckVsZW1lbnRJbXBsKFNPQVBIZWFkZXJCbG9jayBlbGVtZW50KSB7Ci0gICAgICAgIHN1cGVyKChFbGVtZW50SW1wbCllbGVtZW50KTsKLSAgICAgICAgdGhpcy5oZWFkZXJFbGVtID0gZWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBhY3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Q09ERT4gU09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdCB0byB0aGUgc3BlY2lmaWVkCi0gICAgICogYWN0b3IuIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGFuIGFjdG9yIGlzOiA8Q09ERT4gU09BUENvbnN0YW50cy5VUklfU09BUF9BQ1RPUl9ORVhUPC9DT0RFPgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdG9yVVJJIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIFVSSSBvZiB0aGUgYWN0b3IgdG8gc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICBpZiB0aGVyZSBpcyBhIHByb2JsZW0gaW4gc2V0dGluZyB0aGUgYWN0b3IuCi0gICAgICogQHNlZSAjZ2V0QWN0b3IoKSBnZXRBY3RvcigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0b3IoU3RyaW5nIGFjdG9yVVJJKSB7Ci0gICAgICAgIHRoaXMuaGVhZGVyRWxlbS5zZXRSb2xlKGFjdG9yVVJJKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1cmkgb2YgdGhlIGFjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxDT0RFPiBTT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBVUkkgb2YgdGhlIGFjdG9yCi0gICAgICogQHNlZSAjc2V0QWN0b3IoU3RyaW5nKSBzZXRBY3RvcihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckVsZW0uZ2V0Um9sZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBmb3IgdGhpcyA8Q09ERT4gU09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdCB0byBiZSBvbiBvcgotICAgICAqIG9mZi4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+SWYgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBpcyBvbiwgdGhlIGFjdG9yIHdobyByZWNlaXZlcyB0aGUKLSAgICAgKiA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gbXVzdCBwcm9jZXNzIGl0IGNvcnJlY3RseS4gVGhpcyBlbnN1cmVzLCBmb3IgZXhhbXBsZSwgdGhhdCBpZgotICAgICAqIHRoZSA8Q09ERT4gU09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdCBtb2RpZmllcyB0aGUgbWVzc2FnZSwgdGhhdCB0aGUgbWVzc2FnZSBpcyBiZWluZwotICAgICAqIG1vZGlmaWVkIGNvcnJlY3RseS48L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbXVzdFVuZGVyc3RhbmQgPENPREU+dHJ1ZTwvQ09ERT4gdG8gc2V0IHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgb247Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgIDxDT0RFPmZhbHNlPC9DT0RFPiB0byB0dXJuIGlmIG9mZgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHNldHRpbmcgdGhlIGFjdG9yLgotICAgICAqIEBzZWUgI2dldE11c3RVbmRlcnN0YW5kKCkgZ2V0TXVzdFVuZGVyc3RhbmQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE11c3RVbmRlcnN0YW5kKGJvb2xlYW4gbXVzdFVuZGVyc3RhbmQpIHsKLSAgICAgICAgdGhpcy5oZWFkZXJFbGVtLnNldE11c3RVbmRlcnN0YW5kKG11c3RVbmRlcnN0YW5kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBmb3IgdGhpcyA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0Ci0gICAgICogaXMgdHVybmVkIG9uLgotICAgICAqCi0gICAgICogQHJldHVybiA8Q09ERT50cnVlPC9DT0RFPiBpZiB0aGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIG9mIHRoaXMKLSAgICAgKiAgICAgICAgIDxDT0RFPlNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3QgaXMgdHVybmVkIG9uOyA8Q09ERT5mYWxzZTwvQ09ERT4gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TXVzdFVuZGVyc3RhbmQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmhlYWRlckVsZW0uZ2V0TXVzdFVuZGVyc3RhbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBSb2xlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNPQVBIZWFkZXJFbGVtZW50IG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIFJvbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJpIC0gdGhlIFVSSSBvZiB0aGUgUm9sZQotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHNldHRpbmcgdGhlIHJvbGUgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90IHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgRmF1bHQgUm9sZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb2xlKFN0cmluZyB1cmkpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5oZWFkZXJFbGVtLnNldFJvbGUodXJpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9sZSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyRWxlbS5nZXRSb2xlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSByZWxheSBhdHRyaWJ1dGUgZm9yIHRoaXMgU09BUEhlYWRlckVsZW1lbnQgdG8gYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UuIFRoZSBTT0FQCi0gICAgICogcmVsYXkgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIFNPQVAgaGVhZGVyIGJsb2NrIG11c3QgYmUgcmVsYXllZCBieSBhbnkKLSAgICAgKiBub2RlIHRoYXQgaXMgdGFyZ2V0ZWQgYnkgdGhlIGhlYWRlciBibG9jayBidXQgbm90IGFjdHVhbGx5IHByb2Nlc3MgaXQuIFRoaXMgYXR0cmlidXRlIGlzCi0gICAgICogaWdub3JlZCBvbiBoZWFkZXIgYmxvY2tzIHdob3NlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvciB0aGF0IGFyZSB0YXJnZXRlZAotICAgICAqIGF0IHRoZSB1bHRpbWF0ZSByZWNpZXZlciAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcwotICAgICAqIGZhbHNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbGF5IC0gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcmVsYXkgYXR0cmlidXRlCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHNldHRpbmcgdGhlIHJlbGF5IGF0dHJpYnV0ZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIC0gaWYgdGhpcyBtZXNzYWdlIGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIFNPQVAgMS4yIGNvbmNlcHQgb2YgUmVsYXkgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbGF5KGJvb2xlYW4gZmxhZykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmhlYWRlckVsZW0uc2V0UmVsYXkoZmxhZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWxheSgpIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyRWxlbS5nZXRSZWxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEocGFyZW50IGluc3RhbmNlb2YgU09BUEhlYWRlcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmVudCBpcyBub3QgYSBTT0FQSGVhZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0UGFyZW50RWxlbWVudChwYXJlbnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVySW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBIZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmIwNGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBIZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5OYW1lc3BhY2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExSGVhZGVyQmxvY2tJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uc29hcDEyLlNPQVAxMkhlYWRlckJsb2NrSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm5hbWVzcGFjZS5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJJbXBsIGV4dGVuZHMgU09BUEVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEhlYWRlciB7Ci0KLSAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyIG9tU09BUEhlYWRlcjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyCi0gICAgICovCi0gICAgcHVibGljIFNPQVBIZWFkZXJJbXBsKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyIGhlYWRlcikgewotICAgICAgICBzdXBlcigoRWxlbWVudEltcGwpaGVhZGVyKTsKLSAgICAgICAgb21TT0FQSGVhZGVyID0gaGVhZGVyOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGFkZEhlYWRlckVsZW1lbnQobmV3IFByZWZpeGVkUU5hbWUobnVsbCwgbG9jYWxOYW1lLCBudWxsKSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCNhZGRDaGlsZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHByZWZpeCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gZ2V0TmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0KLSAgICAgICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiTmFtZXNwYWNlIG5vdCBkZWNsYXJlZCBmb3IgdGhlIGdpdmUgcHJlZml4OiAiICsgcHJlZml4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWRkQ2hpbGRFbGVtZW50KGxvY2FsTmFtZSwgcHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpCi0gICAgICAgICAgICB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gbmV3IE5hbWVzcGFjZUltcGwodXJpLCBwcmVmaXgpOwotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgU09BUDExSGVhZGVyQmxvY2tJbXBsKGxvY2FsTmFtZSwgbnMsIG9tU09BUEhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrID0gbmV3IFNPQVAxMkhlYWRlckJsb2NrSW1wbChsb2NhbE5hbWUsIG5zLCBvbVNPQVBIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnRJbXBsIHNvYXBIZWFkZXJFbGVtZW50ID0gbmV3IFNPQVBIZWFkZXJFbGVtZW50SW1wbChoZWFkZXJCbG9jayk7Ci0gICAgICAgIGVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNvYXBIZWFkZXJFbGVtZW50LCBudWxsKTsKLSAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJFbGVtZW50OwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAqIEBzZWUgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQjYWRkQ2hpbGRFbGVtZW50KGphdmF4LnhtbC5zb2FwLk5hbWUpCi0gICAgKi8KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkQ2hpbGRFbGVtZW50KE5hbWUgbmFtZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gYWRkSGVhZGVyRWxlbWVudChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgKiBAc2VlIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50I2FkZENoaWxkRWxlbWVudChqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCkKLSAgICAqLwotICAgIHB1YmxpYyBTT0FQRWxlbWVudCBhZGRDaGlsZEVsZW1lbnQoU09BUEVsZW1lbnQgc29hcEVsZW1lbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgT01OYW1lc3BhY2UgbnMgPSBuZXcgTmFtZXNwYWNlSW1wbChzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwRWxlbWVudC5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBoZWFkZXJCbG9jayA9IG51bGw7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICBoZWFkZXJCbG9jayA9IG5ldyBTT0FQMTFIZWFkZXJCbG9ja0ltcGwoc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksIG5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tU09BUEhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrID0gbmV3IFNPQVAxMkhlYWRlckJsb2NrSW1wbChzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSwgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21TT0FQSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnRJbXBsIHNvYXBIZWFkZXJFbGVtZW50ID0gbmV3IFNPQVBIZWFkZXJFbGVtZW50SW1wbChoZWFkZXJCbG9jayk7Ci0gICAgICAgIGVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCB0aGlzLCBudWxsKTsKLSAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHNvYXBIZWFkZXJFbGVtZW50LCBudWxsKTsKLSAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuc2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgICAgICAgcmV0dXJuIHNvYXBIZWFkZXJFbGVtZW50OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFbGVtZW50IGFwcGVuZEVsZW1lbnQoRWxlbWVudEltcGwgY2hpbGQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsgICAgIAotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldFByZWZpeCgpKTsKLSAgICAgICAgU09BUEhlYWRlckJsb2NrIGhlYWRlckJsb2NrID0gbnVsbDsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIGhlYWRlckJsb2NrID0gbmV3IFNPQVAxMUhlYWRlckJsb2NrSW1wbChjaGlsZC5nZXRMb2NhbE5hbWUoKSwgbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21TT0FQSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgU09BUDEySGVhZGVyQmxvY2tJbXBsKGNoaWxkLmdldExvY2FsTmFtZSgpLCBucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbVNPQVBIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0KLSAgICAgICAgfQotICAgICAKLSAgICAgICAgZWxlbWVudC5zZXRVc2VyRGF0YShTQUFKX05PREUsIHRoaXMsIG51bGwpOwotICAgICAgICAKLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnRJbXBsIHNvYXBIZWFkZXJFbGVtZW50ID0gbmV3IFNPQVBIZWFkZXJFbGVtZW50SW1wbChoZWFkZXJCbG9jayk7Ci0gICAgICAgIGNvcHlDb250ZW50cyhzb2FwSGVhZGVyRWxlbWVudCwgY2hpbGQpOwotICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5lbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgc29hcEhlYWRlckVsZW1lbnQsIG51bGwpOwotICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5zZXRQYXJlbnRFbGVtZW50KHRoaXMpOwotICAgICAgICByZXR1cm4gc29hcEhlYWRlckVsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPENPREU+U09BUEhlYWRlckVsZW1lbnQ8L0NPREU+IG9iamVjdCBpbml0aWFsaXplZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKLSAgICAgKiBhZGRzIGl0IHRvIHRoaXMgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgYSA8Q09ERT5OYW1lPC9DT0RFPiBvYmplY3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbmV3IDxDT0RFPlNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPgotICAgICAqICAgICAgICAgICAgIG9iamVjdAotICAgICAqIEByZXR1cm4gdGhlIG5ldyA8Q09ERT5TT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0IHRoYXQgd2FzIGluc2VydGVkIGludG8gdGhpcwotICAgICAqICAgICAgICAgPENPREU+U09BUEhlYWRlcjwvQ09ERT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIGEgU09BUCBlcnJvciBvY2N1cnMKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEhlYWRlckVsZW1lbnQgYWRkSGVhZGVyRWxlbWVudChOYW1lIG5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChuYW1lLmdldFVSSSgpID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCBuYW1lLmdldFVSSSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiU09BUDEuMSBhbmQgU09BUDEuMiByZXF1aXJlcyBhbGwgSGVhZGVyRWxlbWVudHMgdG8gaGF2ZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImEgbmFtZXNwYWNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBuYW1lLmdldFByZWZpeCgpID09IG51bGwgPyAiIiA6IG5hbWUuZ2V0UHJlZml4KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG5zID0gbmV3IE5hbWVzcGFjZUltcGwobmFtZS5nZXRVUkkoKSwgcHJlZml4KTsKLQotICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSBudWxsOwotICAgICAgICBpZiAodGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgaGVhZGVyQmxvY2sgPSBuZXcgU09BUDExSGVhZGVyQmxvY2tJbXBsKG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5zLCBvbVNPQVBIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBGYWN0b3J5KXRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoZWFkZXJCbG9jayA9IG5ldyBTT0FQMTJIZWFkZXJCbG9ja0ltcGwobmFtZS5nZXRMb2NhbE5hbWUoKSwgbnMsIG9tU09BUEhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50SW1wbCBzb2FwSGVhZGVyRWxlbWVudCA9IG5ldyBTT0FQSGVhZGVyRWxlbWVudEltcGwoaGVhZGVyQmxvY2spOwotICAgICAgICBlbGVtZW50LnNldFVzZXJEYXRhKFNBQUpfTk9ERSwgdGhpcywgbnVsbCk7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LmVsZW1lbnQuc2V0VXNlckRhdGEoU0FBSl9OT0RFLCBzb2FwSGVhZGVyRWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LnNldFBhcmVudEVsZW1lbnQodGhpcyk7Ci0gICAgICAgIHJldHVybiBzb2FwSGVhZGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIDxDT0RFPlNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3RzIGluIHRoaXMKLSAgICAgKiA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QgdGhhdCBoYXZlIHRoZSB0aGUgc3BlY2lmaWVkIGFjdG9yLiBBbiBhY3RvciBpcyBhIGdsb2JhbAotICAgICAqIGF0dHJpYnV0ZSB0aGF0IGluZGljYXRlcyB0aGUgaW50ZXJtZWRpYXRlIHBhcnRpZXMgdG8gd2hvbSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgc2VudC4gQW4KLSAgICAgKiBhY3RvciByZWNlaXZlcyB0aGUgbWVzc2FnZSBhbmQgdGhlbiBzZW5kcyBpdCB0byB0aGUgbmV4dCBhY3Rvci4gVGhlIGRlZmF1bHQgYWN0b3IgaXMgdGhlCi0gICAgICogdWx0aW1hdGUgaW50ZW5kZWQgcmVjaXBpZW50IGZvciB0aGUgbWVzc2FnZSwgc28gaWYgbm8gYWN0b3IgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGluIGEKLSAgICAgKiA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QsIHRoZSBtZXNzYWdlIGlzIHNlbnQgdG8gaXRzIHVsdGltYXRlIGRlc3RpbmF0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGFjdG9yIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIFVSSSBvZiB0aGUgYWN0b3IgZm9yIHdoaWNoIHRvIHNlYXJjaAotICAgICAqIEByZXR1cm4gYW4gPENPREU+SXRlcmF0b3I8L0NPREU+IG9iamVjdCBvdmVyIGFsbCB0aGUgPENPREU+IFNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3RzCi0gICAgICogICAgICAgICB0aGF0IGNvbnRhaW4gdGhlIHNwZWNpZmllZCBhY3RvcgotICAgICAqIEBzZWUgI2V4dHJhY3RIZWFkZXJFbGVtZW50cyhTdHJpbmcpIGV4dHJhY3RIZWFkZXJFbGVtZW50cyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBleGFtaW5lSGVhZGVyRWxlbWVudHMoU3RyaW5nIGFjdG9yKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvbVNPQVBIZWFkZXIuZXhhbWluZUhlYWRlckJsb2NrcyhhY3Rvcik7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGVsZW1lbnRzLmFkZCh0b1NBQUpOb2RlKChOb2RlSW1wbClpdGVyYXRvci5uZXh0KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIDxDT0RFPlNPQVBIZWFkZXJFbGVtZW50PC9DT0RFPiBvYmplY3RzIGluIHRoaXMKLSAgICAgKiA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QgdGhhdCBoYXZlIHRoZSB0aGUgc3BlY2lmaWVkIGFjdG9yIGFuZCBkZXRhY2hlcyB0aGVtIGZyb20gdGhpcwotICAgICAqIDxDT0RFPiBTT0FQSGVhZGVyPC9DT0RFPiBvYmplY3QuCi0gICAgICogPHAvPgotICAgICAqIDxQPlRoaXMgbWV0aG9kIGFsbG93cyBhbiBhY3RvciB0byBwcm9jZXNzIG9ubHkgdGhlIHBhcnRzIG9mIHRoZSA8Q09ERT5TT0FQSGVhZGVyPC9DT0RFPgotICAgICAqIG9iamVjdCB0aGF0IGFwcGx5IHRvIGl0IGFuZCB0byByZW1vdmUgdGhlbSBiZWZvcmUgcGFzc2luZyB0aGUgbWVzc2FnZSBvbiB0byB0aGUgbmV4dCBhY3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3RvciBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSBVUkkgb2YgdGhlIGFjdG9yIGZvciB3aGljaCB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGFuIDxDT0RFPkl0ZXJhdG9yPC9DT0RFPiBvYmplY3Qgb3ZlciBhbGwgdGhlIDxDT0RFPiBTT0FQSGVhZGVyRWxlbWVudDwvQ09ERT4gb2JqZWN0cwotICAgICAqICAgICAgICAgdGhhdCBjb250YWluIHRoZSBzcGVjaWZpZWQgYWN0b3IKLSAgICAgKiBAc2VlICNleGFtaW5lSGVhZGVyRWxlbWVudHMoU3RyaW5nKSBleGFtaW5lSGVhZGVyRWxlbWVudHMoamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXh0cmFjdEhlYWRlckVsZW1lbnRzKFN0cmluZyBhY3RvcikgewotICAgICAgICBDb2xsZWN0aW9uIGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb21TT0FQSGVhZGVyLmV4dHJhY3RIZWFkZXJCbG9ja3MoYWN0b3IpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbGVtZW50cy5hZGQodG9TQUFKTm9kZSgoTm9kZUltcGwpaXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciBhbGwgdGhlIDxjb2RlPlNPQVBIZWFkZXJFbGVtZW50PC9jb2RlPiBvYmplY3RzIGluIHRoaXMKLSAgICAgKiA8Y29kZT5TT0FQSGVhZGVyPC9jb2RlPiBvYmplY3QgdGhhdCBoYXZlIHRoZSBzcGVjaWZpZWQgYWN0b3IgYW5kIHRoYXQgaGF2ZSBhIE11c3RVbmRlcnN0YW5kCi0gICAgICogYXR0cmlidXRlIHdob3NlIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0b3IgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGdpdmluZyB0aGUgVVJJIG9mIHRoZSBhY3RvciBmb3Igd2hpY2ggdG8gc2VhcmNoCi0gICAgICogQHJldHVybiBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb2JqZWN0IG92ZXIgYWxsIHRoZSA8Y29kZT5TT0FQSGVhZGVyRWxlbWVudDwvY29kZT4gb2JqZWN0cwotICAgICAqICAgICAgICAgdGhhdCBjb250YWluIHRoZSBzcGVjaWZpZWQgYWN0b3IgYW5kIGFyZSBtYXJrZWQgYXMgTXVzdFVuZGVyc3RhbmQKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZXhhbWluZU11c3RVbmRlcnN0YW5kSGVhZGVyRWxlbWVudHMoU3RyaW5nIGFjdG9yKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvbVNPQVBIZWFkZXIuZXhhbWluZU11c3RVbmRlcnN0YW5kSGVhZGVyQmxvY2tzKGFjdG9yKTsKLSAgICAgICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbGVtZW50cy5hZGQodG9TQUFKTm9kZSgoTm9kZUltcGwpaXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciBhbGwgdGhlIDxjb2RlPlNPQVBIZWFkZXJFbGVtZW50PC9jb2RlPiBvYmplY3RzIGluIHRoaXMKLSAgICAgKiA8Y29kZT5TT0FQSGVhZGVyPC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvYmplY3Qgb3ZlciBhbGwgdGhlIDxjb2RlPlNPQVBIZWFkZXJFbGVtZW50PC9jb2RlPiBvYmplY3RzCi0gICAgICogICAgICAgICBjb250YWluZWQgYnkgdGhpcyA8Y29kZT5TT0FQSGVhZGVyPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBleGFtaW5lQWxsSGVhZGVyRWxlbWVudHMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvbVNPQVBIZWFkZXIuZXhhbWluZUFsbEhlYWRlckJsb2NrcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbGVtZW50cy5hZGQodG9TQUFKTm9kZSgoTm9kZUltcGwpaXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciBhbGwgdGhlIDxjb2RlPlNPQVBIZWFkZXJFbGVtZW50PC9jb2RlPiBvYmplY3RzIGluIHRoaXMKLSAgICAgKiA8Y29kZT5TT0FQSGVhZGVyIDwvY29kZT4gb2JqZWN0IGFuZCBkZXRhY2hlcyB0aGVtIGZyb20gdGhpcyA8Y29kZT5TT0FQSGVhZGVyPC9jb2RlPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvYmplY3Qgb3ZlciBhbGwgdGhlIDxjb2RlPlNPQVBIZWFkZXJFbGVtZW50PC9jb2RlPiBvYmplY3RzCi0gICAgICogICAgICAgICBjb250YWluZWQgYnkgdGhpcyA8Y29kZT5TT0FQSGVhZGVyPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBleHRyYWN0QWxsSGVhZGVyRWxlbWVudHMoKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvbVNPQVBIZWFkZXIuZXh0cmFjdEFsbEhlYWRlckJsb2NrcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBlbGVtZW50cy5hZGQodG9TQUFKTm9kZSgoTm9kZUltcGwpaXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBIZWFkZXJFbGVtZW50IGFkZEhlYWRlckVsZW1lbnQoUU5hbWUgcW5hbWUpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChTT0FQSGVhZGVyRWxlbWVudClhZGRDaGlsZEVsZW1lbnQocW5hbWUuZ2V0TG9jYWxQYXJ0KCksIHFuYW1lLmdldFByZWZpeCgpCi0gICAgICAgICAgICAgICAgLCBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IE5vdFVuZGVyc3Rvb2QgU09BUEhlYWRlckVsZW1lbnQgb2JqZWN0IGluaXRpYWxpemVkIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZAotICAgICAqIGFkZHMgaXQgdG8gdGhpcyBTT0FQSGVhZGVyIG9iamVjdC4gVGhpcyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkIG9ubHkgYnkgU09BUCAxLjIKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIC0gYSBRTmFtZSBvYmplY3Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgU09BUEhlYWRlckVsZW1lbnQgb2JqZWN0IHRoYXQgd2FzIG5vdAotICAgICAqICAgICAgICAgICAgIHVuZGVyc3Rvb2QuCi0gICAgICogQHJldHVybiB0aGUgbmV3IFNPQVBIZWFkZXJFbGVtZW50IG9iamVjdCB0aGF0IHdhcyBpbnNlcnRlZCBpbnRvIHRoaXMgU09BUEhlYWRlciBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24tIGlmIGEgU09BUCBlcnJvciBvY2N1cnMuIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiAtIGlmCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIGEgU09BUCAxLjEgSGVhZGVyLgotICAgICAqLwotCi0gICAgcHVibGljIFNPQVBIZWFkZXJFbGVtZW50IGFkZE5vdFVuZGVyc3Rvb2RIZWFkZXJFbGVtZW50KFFOYW1lIHFuYW1lKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBIZWFkZXJCbG9jayBzb2FwSGVhZGVyQmxvY2sgPSBudWxsOwotICAgICAgICBPTU5hbWVzcGFjZSBucyA9IG5ldyBOYW1lc3BhY2VJbXBsKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJCbG9jayA9IHRoaXMub21TT0FQSGVhZGVyLmFkZEhlYWRlckJsb2NrKAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuRUxFTV9OT1RVTkRFUlNUT09ELCB0aGlzLmVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgc29hcEhlYWRlckJsb2NrLmFkZEF0dHJpYnV0ZShxbmFtZS5nZXRMb2NhbFBhcnQoKSwgcW5hbWUuZ2V0UHJlZml4KCksIG5zKTsKLSAgICAgICAgfQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudEltcGwgc29hcEhlYWRlckVsZW1lbnRJbXBsID0gbmV3IFNPQVBIZWFkZXJFbGVtZW50SW1wbChzb2FwSGVhZGVyQmxvY2spOwotICAgICAgICByZXR1cm4gc29hcEhlYWRlckVsZW1lbnRJbXBsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgVXBncmFkZSBTT0FQSGVhZGVyRWxlbWVudCBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIExpc3Qgb2YKLSAgICAgKiBzdXBwb3J0ZWQgU09BUCBVUklzIGFuZCBhZGRzIGl0IHRvIHRoaXMgU09BUEhlYWRlciBvYmplY3QuIFRoaXMgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAqIGJvdGggU09BUCAxLjEgYW5kIFNPQVAgMS4yIGhlYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdXBwb3J0ZWRTT0FQVVJJcyAtIGFuIEl0ZXJhdG9yIG9iamVjdCB3aXRoIHRoZSBVUklzIG9mIFNPQVAgdmVyc2lvbnMgc3VwcG9ydGVkLgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBTT0FQSGVhZGVyRWxlbWVudCBvYmplY3QgdGhhdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGlzIFNPQVBIZWFkZXIgb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIC0gaWYgYSBTT0FQIGVycm9yIG9jY3Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEhlYWRlckVsZW1lbnQgYWRkVXBncmFkZUhlYWRlckVsZW1lbnQoSXRlcmF0b3IgaXRlcmF0b3IpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEhlYWRlckJsb2NrIHVwZ3JhZGUgPSB0aGlzLm9tU09BUEhlYWRlci5hZGRIZWFkZXJCbG9jaygKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuRUxFTV9VUEdSQURFLCB0aGlzLmVsZW1lbnQuZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAibnMiOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgU3RyaW5nIHN1cHBvcnRlZCA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBPTU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBuZXcgTmFtZXNwYWNlSW1wbChzdXBwb3J0ZWQsIHByZWZpeCArIGluZGV4KTsKLQotICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTFIZWFkZXJCbG9ja0ltcGwgc3VwcG9ydGVkRW52ZWxvcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU09BUDExSGVhZGVyQmxvY2tJbXBsKENvbnN0YW50cy5FTEVNX1NVUFBPUlRFREVOVkVMT1BFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTT0FQRmFjdG9yeSl0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRlZEVudmVsb3AuYWRkQXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1FOQU1FLCBwcmVmaXggKyBpbmRleCArICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBDb25zdGFudHMuRUxFTV9FTlZFTE9QRSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgdXBncmFkZS5hZGRDaGlsZChzdXBwb3J0ZWRFbnZlbG9wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU09BUDEySGVhZGVyQmxvY2tJbXBsIHN1cHBvcnRlZEVudmVsb3AgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMkhlYWRlckJsb2NrSW1wbChDb25zdGFudHMuRUxFTV9TVVBQT1JURURFTlZFTE9QRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUEZhY3RvcnkpdGhpcy5lbGVtZW50LmdldE9NRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRFbnZlbG9wLmFkZEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9RTkFNRSwgcHJlZml4ICsgaW5kZXggKyAiOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgQ29uc3RhbnRzLkVMRU1fRU5WRUxPUEUsIG51bGwpOwotICAgICAgICAgICAgICAgIHVwZ3JhZGUuYWRkQ2hpbGQoc3VwcG9ydGVkRW52ZWxvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnRJbXBsIHNvYXBIZWFkZXJFbGVtZW50SW1wbCA9IG5ldyBTT0FQSGVhZGVyRWxlbWVudEltcGwodXBncmFkZSk7Ci0gICAgICAgIHJldHVybiBzb2FwSGVhZGVyRWxlbWVudEltcGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBIZWFkZXJFbGVtZW50IGFkZFVwZ3JhZGVIZWFkZXJFbGVtZW50KFN0cmluZ1tdIGFzKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5TGlzdCBzdXBwb3J0ZWRFbnZlbG9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgYSA9IDA7IGEgPCBhcy5sZW5ndGg7IGErKykgewotICAgICAgICAgICAgU3RyaW5nIHN1cHBvcnRlZCA9IChTdHJpbmcpYXNbYV07Ci0gICAgICAgICAgICBzdXBwb3J0ZWRFbnZlbG9wcy5hZGQoc3VwcG9ydGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3VwcG9ydGVkRW52ZWxvcHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFkZFVwZ3JhZGVIZWFkZXJFbGVtZW50KHN1cHBvcnRlZEVudmVsb3BzLml0ZXJhdG9yKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTT0FQSGVhZGVyRWxlbWVudCBhZGRVcGdyYWRlSGVhZGVyRWxlbWVudChTdHJpbmcgcykgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBpZiAocyA9PSBudWxsICYmIHMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgQXJyYXlMaXN0IHN1cHBvcnRlZEVudmVsb3BzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBzdXBwb3J0ZWRFbnZlbG9wcy5hZGQocyk7Ci0gICAgICAgIHJldHVybiBhZGRVcGdyYWRlSGVhZGVyRWxlbWVudChzdXBwb3J0ZWRFbnZlbG9wcy5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUEVsZW1lbnQgYWRkVGV4dE5vZGUoU3RyaW5nIHRleHQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5hZGRUZXh0Tm9kZSh0ZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTJGYWN0b3J5KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbigiQ2Fubm90IGFkZCB0ZXh0IG5vZGUgdG8gU09BUEhlYWRlciIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cyhOYW1lIG5hbWUpIHsKLSAgICAgICAgUU5hbWUgcU5hbWUgPSBuZXcgUU5hbWUobmFtZS5nZXRVUkkoKSwgbmFtZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUocU5hbWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJdGVyYXRvciBnZXRDaGlsZHJlbihJdGVyYXRvciBjaGlsZEl0ZXIpIHsKLSAgICAgICAgQ29sbGVjdGlvbiBjaGlsZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB3aGlsZSAoY2hpbGRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBkb21Ob2RlID0gKG9yZy53M2MuZG9tLk5vZGUpY2hpbGRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIE5vZGUgc2Fhak5vZGUgPSB0b1NBQUpOb2RlKGRvbU5vZGUpOwotICAgICAgICAgICAgaWYgKHNhYWpOb2RlIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuVGV4dCkgewotICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudHMuYWRkKHNhYWpOb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShzYWFqTm9kZSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KSkgewotICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IHJlcGxhY2Ugbm9kZSwgYXMgcGVyIHNhYWogMS4yIHNwZWMKLSAgICAgICAgICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBoZWFkZXJFbGUgPSBuZXcgU09BUEhlYWRlckVsZW1lbnRJbXBsKChTT0FQSGVhZGVyQmxvY2spZG9tTm9kZSk7Ci0gICAgICAgICAgICAgICAgKChOb2RlSW1wbClkb21Ob2RlKS5zZXRVc2VyRGF0YShTQUFKX05PREUsIGhlYWRlckVsZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoaGVhZGVyRWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQoc2Fhak5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGV0YWNoTm9kZSgpIHsKLSAgICAgICAgdGhpcy5kZXRhY2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01Ob2RlIGRldGFjaCgpIHsKLSAgICAgICAgT01Ob2RlIG9tTm9kZSA9IG9tU09BUEhlYWRlci5kZXRhY2goKTsKLSAgICAgICAgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gICAgICAgIHJldHVybiBvbU5vZGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBNZXNzYWdlSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBNZXNzYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzU0NDA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQnl0ZUFycmF5RGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NSU1FT3V0cHV0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkF0dGFjaG1lbnRQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlSW1wbCBleHRlbmRzIFNPQVBNZXNzYWdlIHsKLQotICAgIHByaXZhdGUgU09BUFBhcnQgc29hcFBhcnQ7Ci0gICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEF0dGFjaG1lbnRQYXJ0PiBhdHRhY2htZW50UGFydHMgPSBuZXcgQXJyYXlMaXN0PEF0dGFjaG1lbnRQYXJ0PigpOwotICAgIHByaXZhdGUgTWltZUhlYWRlcnNFeCBtaW1lSGVhZGVyczsKLQotICAgIHByaXZhdGUgTWFwIHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlUmVxdWlyZWQ7Ci0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2VJbXBsKFNPQVBFbnZlbG9wZUltcGwgc29hcEVudmVsb3BlKSB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0KLQotICAgICAgICBpZiAobWltZUhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlc1tdID0gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKEhUVFBDb25zdGFudHMuQ09OVEVOVF9UWVBFKTsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gKGNvbnRlbnRUeXBlcyAhPSBudWxsKSA/IGNvbnRlbnRUeXBlc1swXSA6IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLm1pbWVIZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzRXgoKTsKLSAgICAgICAgICAgIGlmIChzb2FwRW52ZWxvcGUuZ2V0T01GYWN0b3J5KCkgaW5zdGFuY2VvZiBTT0FQMTFGYWN0b3J5KSB7Ci0gICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBIVFRQQ29uc3RhbnRzLk1FRElBX1RZUEVfVEVYVF9YTUw7Ci0gICAgICAgICAgICAgICAgdGhpcy5taW1lSGVhZGVycy5hZGRIZWFkZXIoImNvbnRlbnQtdHlwZSIsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc29hcEVudmVsb3BlLmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDEyRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1NPQVBfWE1MOwotICAgICAgICAgICAgICAgIHRoaXMubWltZUhlYWRlcnMuYWRkSGVhZGVyKCJjb250ZW50LXR5cGUiLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDaGFyc2V0RW5jb2RpbmcoY29udGVudFR5cGUpOwotICAgICAgICBzb2FwUGFydCA9IG5ldyBTT0FQUGFydEltcGwodGhpcywgc29hcEVudmVsb3BlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUE1lc3NhZ2VJbXBsKElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyBtaW1lSGVhZGVycykKLSAgICAgICAgICAgIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHRtcENvbnRlbnRUeXBlID0gIiI7Ci0gICAgICAgIGlmIChtaW1lSGVhZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGVzW10gPSBtaW1lSGVhZGVycy5nZXRIZWFkZXIoSFRUUENvbnN0YW50cy5DT05URU5UX1RZUEUpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlcyAhPSBudWxsICYmIGNvbnRlbnRUeXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgdG1wQ29udGVudFR5cGUgPSBjb250ZW50VHlwZXNbMF07Ci0gICAgICAgICAgICAgICAgLy90bXBDb250ZW50VHlwZSBjYW4gYmUgbGlrZSAnYXBwbGljYXRpb24vc29hcCt4bWw7IGNoYXJzZXQ9VVRGLTg7JwotICAgICAgICAgICAgICAgIC8vT25seSB0aGUgZmlyc3QgcGFydCBpcyBpbXBvcnRhbnQKLSAgICAgICAgICAgICAgICBpZiAodG1wQ29udGVudFR5cGUuaW5kZXhPZigiOyIpID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSB0bXBDb250ZW50VHlwZS5zdWJzdHJpbmcoMCwgdG1wQ29udGVudFR5cGUuaW5kZXhPZigiOyIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IHRtcENvbnRlbnRUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL1NldHRpbmcgdGhlIHdob2xlIGNvbnRlbnQtdHlwZSBzdHJpbmcgdG8gQ2hhcnNldEVuY29kaW5nLgotICAgICAgICAvL0lzIHRoaXMgY29ycmVjdD8KLSAgICAgICAgc2V0Q2hhcnNldEVuY29kaW5nKHRtcENvbnRlbnRUeXBlKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXBQYXJ0ID0gbmV3IFNPQVBQYXJ0SW1wbCh0aGlzLCBpbnB1dHN0cmVhbSwgbWltZUhlYWRlcnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcFBhcnQgPSBuZXcgU09BUFBhcnRJbXBsKHRoaXMsIGlucHV0c3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMubWltZUhlYWRlcnMgPSAobWltZUhlYWRlcnMgPT0gbnVsbCkgPwotICAgICAgICAgICAgICAgIG5ldyBNaW1lSGVhZGVyc0V4KCkgOgotICAgICAgICAgICAgICAgIG5ldyBNaW1lSGVhZGVyc0V4KG1pbWVIZWFkZXJzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QncyBjb250ZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZGVzY3JpYmluZyB0aGUgY29udGVudCBvZiB0aGlzIG1lc3NhZ2Ugb3IgPENPREU+bnVsbDwvQ09ERT4gaWYKLSAgICAgKiAgICAgICAgIG5vIGRlc2NyaXB0aW9uIGhhcyBiZWVuIHNldAotICAgICAqIEBzZWUgI3NldENvbnRlbnREZXNjcmlwdGlvbihTdHJpbmcpIHNldENvbnRlbnREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotICAgICAgICBTdHJpbmcgdmFsdWVzW10gPSBtaW1lSGVhZGVycy5nZXRIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9ERVNDUklQVElPTik7Ci0gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1swXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QncyBjb250ZW50IHdpdGggdGhlIGdpdmVuCi0gICAgICogZGVzY3JpcHRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gYSA8Q09ERT5TdHJpbmc8L0NPREU+IGRlc2NyaWJpbmcgdGhlIGNvbnRlbnQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLnNldEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgU09BUCBwYXJ0IG9mIHRoaXMgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogPHAvPgotICAgICAqIDxQPklmIGEgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBjb250YWlucyBvbmUgb3IgbW9yZSBhdHRhY2htZW50cywgdGhlIFNPQVAgUGFydCBtdXN0Ci0gICAgICogYmUgdGhlIGZpcnN0IE1JTUUgYm9keSBwYXJ0IGluIHRoZSBtZXNzYWdlLjwvUD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxDT0RFPlNPQVBQYXJ0PC9DT0RFPiBvYmplY3QgZm9yIHRoaXMgPENPREU+IFNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUFBhcnQgZ2V0U09BUFBhcnQoKSB7Ci0gICAgICAgIHJldHVybiBzb2FwUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzCi0gICAgICogPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdC4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+VGhpcyBtZXRob2QgZG9lcyBub3QgdG91Y2ggdGhlIFNPQVAgcGFydC48L1A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsQXR0YWNobWVudHMoKSB7Ci0gICAgICAgIGF0dGFjaG1lbnRQYXJ0cy5jbGVhcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF0dGFjaG1lbnRzIGluIHRoaXMgbWVzc2FnZS4gVGhpcyBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIHRoZQotICAgICAqIFNPQVAgcGFydC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMKLSAgICAgKiAgICAgICAgIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvdW50QXR0YWNobWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRhY2htZW50UGFydHMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgdGhlIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3RzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcwotICAgICAqIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSBhdHRhY2htZW50cyBpbiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QXR0YWNobWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBhdHRhY2htZW50UGFydHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSBBdHRhY2htZW50UGFydCBvYmplY3RzIHRoYXQgaGF2ZSBoZWFkZXIgZW50cmllcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQKLSAgICAgKiBoZWFkZXJzLiBOb3RlIHRoYXQgYSByZXR1cm5lZCBhdHRhY2htZW50IGNvdWxkIGhhdmUgaGVhZGVycyBpbiBhZGRpdGlvbiB0byB0aG9zZSBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVycyBhIHtAbGluayBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyc30gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE1JTUUgaGVhZGVycyBmb3IKLSAgICAgKiAgICAgICAgICAgICAgICB3aGljaCB0byBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIGF0dGFjaG1lbnRzKHtAbGluayBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydH0pIHRoYXQgaGF2ZSBhCi0gICAgICogICAgICAgICBoZWFkZXIgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGUgZ2l2ZW4gaGVhZGVycwotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRBdHRhY2htZW50cyhqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyBoZWFkZXJzKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gbWF0Y2hpbmdBdHRhY2htZW50UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgewotICAgICAgICAgICAgQXR0YWNobWVudFBhcnRJbXBsIHBhcnQ7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcGFydCA9IChBdHRhY2htZW50UGFydEltcGwpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0Lm1hdGNoZXMoaGVhZGVycykpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdBdHRhY2htZW50UGFydHMuYWRkKHBhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hpbmdBdHRhY2htZW50UGFydHMuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4gb2JqZWN0IHRvIHRoaXMgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdC4gQW4KLSAgICAgKiA8Q09ERT4gQXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIGl0IGNhbiBiZSBhZGRlZCB0byBhIG1lc3NhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0YWNobWVudFBhcnQgYW4gPENPREU+IEF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QgdGhhdCBpcyB0byBiZWNvbWUgcGFydCBvZiB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAqCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQXR0YWNobWVudFBhcnQoQXR0YWNobWVudFBhcnQgYXR0YWNobWVudFBhcnQpIHsKLSAgICAgICAgaWYgKGF0dGFjaG1lbnRQYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGF0dGFjaG1lbnRQYXJ0cy5hZGQoYXR0YWNobWVudFBhcnQpOwotICAgICAgICAgICAgbWltZUhlYWRlcnMuc2V0SGVhZGVyKEhUVFBDb25zdGFudHMuQ09OVEVOVF9UWVBFLCAibXVsdGlwYXJ0L3JlbGF0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgPENPREU+QXR0YWNobWVudFBhcnQ8L0NPREU+IG9iamVjdC4gTm90ZSB0aGF0IHRoZSBtZXRob2QKLSAgICAgKiA8Q09ERT5hZGRBdHRhY2htZW50UGFydDwvQ09ERT4gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGlzIG5ldyA8Q09ERT5BdHRhY2htZW50UGFydDwvQ09ERT4KLSAgICAgKiBvYmplY3QgYXMgdGhlIHBhcmFtZXRlciBpbiBvcmRlciBmb3IgaXQgdG8gYmVjb21lIGFuIGF0dGFjaG1lbnQgdG8gdGhpcwotICAgICAqIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbmV3IDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3QgdGhhdCBjYW4gYmUgcG9wdWxhdGVkIGFuZCBhZGRlZCB0byB0aGlzCi0gICAgICogICAgICAgICA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIEF0dGFjaG1lbnRQYXJ0IGNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCkgewotICAgICAgICByZXR1cm4gbmV3IEF0dGFjaG1lbnRQYXJ0SW1wbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYWxsIHRoZSB0cmFuc3BvcnQtc3BlY2lmaWMgTUlNRSBoZWFkZXJzIGZvciB0aGlzIDxDT0RFPlNPQVBNZXNzYWdlPC9DT0RFPiBvYmplY3QgaW4gYQotICAgICAqIHRyYW5zcG9ydC1pbmRlcGVuZGVudCBmYXNoaW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBhIDxDT0RFPk1pbWVIZWFkZXJzPC9DT0RFPiBvYmplY3QgY29udGFpbmluZyB0aGUgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyBnZXRNaW1lSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIG1pbWVIZWFkZXJzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhpcyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IHdpdGggYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgdG8gaXQuCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBvciB3cml0dGVuIHRvIGJ5IHRoZSBtZXRob2RzCi0gICAgICogPENPREU+UHJvdmlkZXJDb25uZWN0aW9uLnNlbmQ8L0NPREU+LCA8Q09ERT4gU09BUENvbm5lY3Rpb24uY2FsbDwvQ09ERT4sIG9yIDxDT0RFPgotICAgICAqIFNPQVBNZXNzYWdlLndyaXRlVG88L0NPREU+LiBIb3dldmVyLCBpZiBjaGFuZ2VzIGFyZSBtYWRlIHRvIGEgbWVzc2FnZSB0aGF0IHdhcyByZWNlaXZlZCBvciB0bwotICAgICAqIG9uZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gc2VudCwgdGhlIG1ldGhvZCA8Q09ERT5zYXZlQ2hhbmdlczwvQ09ERT4gbmVlZHMgdG8gYmUgY2FsbGVkCi0gICAgICogZXhwbGljaXRseSBpbiBvcmRlciB0byBzYXZlIHRoZSBjaGFuZ2VzLiBUaGUgbWV0aG9kIDxDT0RFPnNhdmVDaGFuZ2VzPC9DT0RFPiBhbHNvIGdlbmVyYXRlcwotICAgICAqIGFueSBjaGFuZ2VzIHRoYXQgY2FuIGJlIHJlYWQgYmFjayAoZm9yIGV4YW1wbGUsIGEgTWVzc2FnZUlkIGluIHByb2ZpbGVzIHRoYXQgc3VwcG9ydCBhCi0gICAgICogbWVzc2FnZSBpZCkuIEFsbCBNSU1FIGhlYWRlcnMgaW4gYSBtZXNzYWdlIHRoYXQgaXMgY3JlYXRlZCBmb3Igc2VuZGluZyBwdXJwb3NlcyBhcmUKLSAgICAgKiBndWFyYW50ZWVkIHRvIGhhdmUgdmFsaWQgdmFsdWVzIG9ubHkgYWZ0ZXIgPENPREU+c2F2ZUNoYW5nZXM8L0NPREU+IGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+SW4gYWRkaXRpb24sIHRoaXMgbWV0aG9kIG1hcmtzIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgZGF0YSBmcm9tIGFsbCBjb25zdGl0dWVudAotICAgICAqIDxDT0RFPkF0dGFjaG1lbnRQYXJ0PC9DT0RFPiBvYmplY3RzIGFyZSBwdWxsZWQgaW50byB0aGUgbWVzc2FnZS48L1A+Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBzYXZpbmcgY2hhbmdlcyB0byB0aGlzIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2F2ZUNoYW5nZXMoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNhdmVSZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAvLyBUT0RPIG5vdCBzdXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNhdmVSZXF1aXJlZCgpIHsKLSAgICAgICAgdGhpcy5zYXZlUmVxdWlyZWQgPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdCBoYXMgaGFkIHRoZSBtZXRob2Qge0BsaW5rCi0gICAgICogI3NhdmVDaGFuZ2VzKCl9IGNhbGxlZCBvbiBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPENPREU+dHJ1ZTwvQ09ERT4gaWYgPENPREU+c2F2ZUNoYW5nZXM8L0NPREU+IGhhcyBiZWVuIGNhbGxlZCBvbiB0aGlzIG1lc3NhZ2UgYXQKLSAgICAgKiAgICAgICAgIGxlYXN0IG9uY2U7IDxDT0RFPiBmYWxzZTwvQ09ERT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNhdmVSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIHNhdmVSZXF1aXJlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhpcyA8Q09ERT5TT0FQTWVzc2FnZTwvQ09ERT4gb2JqZWN0IHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLiBUaGUgZXh0ZXJuYWxpemF0aW9uCi0gICAgICogZm9ybWF0IGlzIGFzIGRlZmluZWQgYnkgdGhlIFNPQVAgMS4xIHdpdGggQXR0YWNobWVudHMgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+SWYgdGhlcmUgYXJlIG5vIGF0dGFjaG1lbnRzLCBqdXN0IGFuIFhNTCBzdHJlYW0gaXMgd3JpdHRlbiBvdXQuIEZvciB0aG9zZSBtZXNzYWdlcyB0aGF0Ci0gICAgICogaGF2ZSBhdHRhY2htZW50cywgPENPREU+d3JpdGVUbzwvQ09ERT4gd3JpdGVzIGEgTUlNRS1lbmNvZGVkIGJ5dGUgc3RyZWFtLjwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdXQgdGhlIDxDT0RFPk91dHB1dFN0cmVhbTwvQ09ERT4gb2JqZWN0IHRvIHdoaWNoIHRoaXMgPENPREU+U09BUE1lc3NhZ2U8L0NPREU+IG9iamVjdAotICAgICAqICAgICAgICAgICAgd2lsbCBiZSB3cml0dGVuCi0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gaW4gZXh0ZXJuYWxpemluZyB0aGlzIFNPQVAgbWVzc2FnZQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01PdXRwdXRGb3JtYXQgZm9ybWF0ID0gbmV3IE9NT3V0cHV0Rm9ybWF0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZW5jID0gKFN0cmluZylnZXRQcm9wZXJ0eShDSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLSAgICAgICAgICAgIGZvcm1hdC5zZXRDaGFyU2V0RW5jb2RpbmcoZW5jICE9IG51bGwgPyBlbmMgOiBPTU91dHB1dEZvcm1hdC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HKTsKLSAgICAgICAgICAgIFN0cmluZyB3cml0ZVhtbERlY2wgPSAoU3RyaW5nKWdldFByb3BlcnR5KFdSSVRFX1hNTF9ERUNMQVJBVElPTik7Ci0gICAgICAgICAgICBpZiAod3JpdGVYbWxEZWNsID09IG51bGwgfHwgd3JpdGVYbWxEZWNsLmVxdWFscygiZmFsc2UiKSkgewotCi0gICAgICAgICAgICAgICAgLy9TQUFKIGRlZmF1bHQgY2FzZSBkb2Vzbid0IHNlbmQgWE1MIGRlY2wKLSAgICAgICAgICAgICAgICBmb3JtYXQuc2V0SWdub3JlWE1MRGVjbGFyYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9ICgoU09BUEVudmVsb3BlSW1wbClzb2FwUGFydC5nZXRFbnZlbG9wZSgpKS5nZXRPTUVudmVsb3BlKCk7Ci0gICAgICAgICAgICBpZiAoYXR0YWNobWVudFBhcnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGVudmVsb3BlLnNlcmlhbGl6ZShvdXQsIGZvcm1hdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdC5zZXRTT0FQMTEoKChTT0FQRW52ZWxvcGVJbXBsKXNvYXBQYXJ0LmdldEVudmVsb3BlKCkpLmdldE9NRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZW9mIFNPQVAxMUZhY3RvcnkpOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsRGF0YUhhbmRsZXI+IGF0dGFjaG1lbnRzTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLERhdGFIYW5kbGVyPigpOwotICAgICAgICAgICAgICAgIGZvciAoQXR0YWNobWVudFBhcnQgYXAgOiBhdHRhY2htZW50UGFydHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHNNYXAucHV0KGFwLmdldENvbnRlbnRJZCgpLCBhcC5nZXREYXRhSGFuZGxlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgZW52ZWxvcGUuc2VyaWFsaXplKGJhb3MpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0LmlzU09BUDExKCkgPyBTT0FQMTFDb25zdGFudHMuU09BUF8xMV9DT05URU5UX1RZUEUgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfMTJfQ09OVEVOVF9UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBjaGFyc2V0PSIgKyBmb3JtYXQuZ2V0Q2hhclNldEVuY29kaW5nKCk7Ci0gICAgICAgICAgICAgICAgRGF0YUhhbmRsZXIgcm9vdERhdGFIYW5kbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhSGFuZGxlcihuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZShiYW9zLnRvQnl0ZUFycmF5KCksIGNvbnRlbnRUeXBlKSk7Ci0gICAgICAgICAgICAgICAgTUlNRU91dHB1dFV0aWxzLndyaXRlRGF0YUhhbmRsZXJXaXRoQXR0YWNobWVudHNNZXNzYWdlKHJvb3REYXRhSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLCBvdXQsIGF0dGFjaG1lbnRzTWFwLCBmb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gSWYgdGhlcmUgd2FzIGFscmVhZHkgYSB2YWx1ZQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb3BlcnR5LCB0aGUgb2xkIHZhbHVlIGlzIHJlcGxhY2VkLgotICAgICAqIDxwLz4KLSAgICAgKiBUaGUgdmFsaWQgcHJvcGVydHkgbmFtZXMgaW5jbHVkZSA8Y29kZT5XUklURV9YTUxfREVDTEFSQVRJT048L2NvZGU+IGFuZAotICAgICAqIDxjb2RlPkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkc8L2NvZGU+LiBBbGwgb2YgdGhlc2Ugc3RhbmRhcmQgU0FBSiBwcm9wZXJ0aWVzIGFyZSBwcmVmaXhlZCBieQotICAgICAqICJqYXZheC54bWwuc29hcCIuIFZlbmRvcnMgbWF5IGFsc28gYWRkIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHByb3BlcnRpZXMuIFRoZXNlIHByb3BlcnRpZXMKLSAgICAgKiBtdXN0IGJlIHByZWZpeGVkIHdpdGggcGFja2FnZSBuYW1lcyB0aGF0IGFyZSB1bmlxdWUgdG8gdGhlIHZlbmRvci4KLSAgICAgKiA8cC8+Ci0gICAgICogU2V0dGluZyB0aGUgcHJvcGVydHkgPGNvZGU+V1JJVEVfWE1MX0RFQ0xBUkFUSU9OPC9jb2RlPiB0byA8Y29kZT4idHJ1ZSI8L2NvZGU+IHdpbGwgY2F1c2UgYW4KLSAgICAgKiBYTUwgRGVjbGFyYXRpb24gdG8gYmUgd3JpdHRlbiBvdXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBTT0FQIG1lc3NhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCi0gICAgICogImZhbHNlIiBzdXBwcmVzc2VzIHRoaXMgZGVjbGFyYXRpb24uCi0gICAgICogPHAvPgotICAgICAqIFRoZSBwcm9wZXJ0eSA8Y29kZT5DSEFSQUNURVJfU0VUX0VOQ09ESU5HPC9jb2RlPiBkZWZhdWx0cyB0byB0aGUgdmFsdWUgPGNvZGU+InV0Zi04IjwvY29kZT4KLSAgICAgKiB3aGljaCBjYXVzZXMgdGhlIFNPQVAgbWVzc2FnZSB0byBiZSBlbmNvZGVkIHVzaW5nIFVURi04LiBTZXR0aW5nCi0gICAgICogPGNvZGU+Q0hBUkFDVEVSX1NFVF9FTkNPRElORzwvY29kZT4gdG8gPGNvZGU+InV0Zi0xNiI8L2NvZGU+IGNhdXNlcyB0aGUgU09BUCBtZXNzYWdlIHRvIGJlCi0gICAgICogZW5jb2RlZCB1c2luZyBVVEYtMTYuCi0gICAgICogPHAvPgotICAgICAqIFNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBhbGxvdyBlbmNvZGluZ3MgaW4gYWRkaXRpb24gdG8gVVRGLTggYW5kIFVURi0xNi4gUmVmZXIgdG8geW91cgotICAgICAqIHZlbmRvcidzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkCi0gICAgICogQHBhcmFtIHZhbHVlICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHByb3BzLnB1dChwcm9wZXJ0eSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXRyaWV2ZQotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWNoIHByb3BlcnR5IGV4aXN0cwotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgbmFtZSBpcyBub3QgcmVjb2duaXplZAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwcm9wcy5nZXQocHJvcGVydHkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gQXR0YWNobWVudFBhcnQgb2JqZWN0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGF0dGFjaG1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5Ci0gICAgICogdGhpcyBTT0FQRWxlbWVudCBvciBudWxsIGlmIG5vIHN1Y2ggYXR0YWNobWVudCBleGlzdHMuIFJlZmVyZW5jZXMgY2FuIGJlIG1hZGUgdmlhIGFuIGhyZWYKLSAgICAgKiBhdHRyaWJ1dGUgYXMgZGVzY3JpYmVkIGluIFNPQVAgTWVzc2FnZXMgd2l0aCBBdHRhY2htZW50cyAoaHR0cDovL3d3dy53My5vcmcvVFIvU09BUGF0dGFjaG1lbnRzI1NPQVBSZWZlcmVuY2VUb0F0dGFjaGVtZW50cykKLSAgICAgKiAsIG9yIHZpYSBhIHNpbmdsZSBUZXh0IGNoaWxkIG5vZGUgY29udGFpbmluZyBhIFVSSSBhcyBkZXNjcmliZWQgaW4gdGhlIFdTLUkgQXR0YWNobWVudHMKLSAgICAgKiBQcm9maWxlIDEuMCBmb3IgZWxlbWVudHMgb2Ygc2NoZW1hIHR5cGUgcmVmOnN3YVJlZihyZWY6c3dhUmVmIChodHRwOi8vd3d3LndzaS5vcmcvUHJvZmlsZXMvQXR0YWNobWVudHNQcm9maWxlLTEuMC0yMDA0LTA4LTI0Lmh0bWwiKQotICAgICAqICkuIFRoZXNlIHR3byBtZWNoYW5pc21zIG11c3QgYmUgc3VwcG9ydGVkLiBUaGUgc3VwcG9ydCBmb3IgcmVmZXJlbmNlcyB2aWEgaHJlZiBhdHRyaWJ1dGUgYWxzbwotICAgICAqIGltcGxpZXMgdGhhdCB0aGlzIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBzdXBwb3J0ZWQgb24gYW4gZWxlbWVudCB0aGF0IGlzIGFuIHhvcDpJbmNsdWRlCi0gICAgICogZWxlbWVudCAoWE9QIChodHRwOi8vd3d3LnczLm9yZy8yMDAwL3hwL0dyb3VwLzMvMDYvQXR0YWNobWVudHMvWE9QLmh0bWwpICkuIG90aGVyIHJlZmVyZW5jZQotICAgICAqIG1lY2hhbmlzbXMgbWF5IGJlIHN1cHBvcnRlZCBieSBpbmRpdmlkdWFsIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHN0YW5kYXJkLiBDb250YWN0IHlvdXIKLSAgICAgKiB2ZW5kb3IgZm9yIGRldGFpbHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBTT0FQRWxlbWVudCBjb250YWluaW5nIHRoZSByZWZlcmVuY2UgdG8gYW4gQXR0YWNobWVudAotICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgQXR0YWNobWVudFBhcnQgb3IgbnVsbCBpZiBubyBzdWNoIEF0dGFjaG1lbnRQYXJ0IGV4aXN0cyBvciBubwotICAgICAqICAgICAgICAgcmVmZXJlbmNlIGNhbiBiZSBmb3VuZCBpbiB0aGlzIFNPQVBFbGVtZW50LgotICAgICAqIEB0aHJvd3MgU09BUEV4Y2VwdGlvbiAtIGlmIHRoZXJlIGlzIGFuIGVycm9yIGluIHRoZSBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgYXR0YWNobWVudAotICAgICAqLwotICAgIHB1YmxpYyBBdHRhY2htZW50UGFydCBnZXRBdHRhY2htZW50KFNPQVBFbGVtZW50IHNvYXBlbGVtZW50KSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vVE9ETyByZWFkIHN0cmluZ3MgZnJvbSBjb25zdGFudHMKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRBdHRhY2htZW50cygpOwotICAgICAgICB7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydEltcGwgYXR0YWNobWVudFBhcnQ7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnRJbXBsKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb250ZW50SWRzID0gYXR0YWNobWVudFBhcnQuZ2V0TWltZUhlYWRlcigiQ29udGVudC1JZCIpOwotCi0gICAgICAgICAgICAgICAgLy9SZWZlcmVuY2VzIGNhbiBiZSBtYWRlIHZpYSBhbiBocmVmIGF0dHJpYnV0ZSBhcyBkZXNjcmliZWQgaW4gU09BUCBNZXNzYWdlcwotICAgICAgICAgICAgICAgIC8vd2l0aCBBdHRhY2htZW50cyBvciB2aWEgYSBzaW5nbGUgVGV4dCBjaGlsZCBub2RlIGNvbnRhaW5pbmcgYSBVUkkKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlID0gc29hcGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsIHx8IHJlZmVyZW5jZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UgPSBzb2FwZWxlbWVudC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlID09IG51bGwgfHwgcmVmZXJlbmNlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGEgPSAwOyBhIDwgY29udGVudElkcy5sZW5ndGg7IGErKykgewotICAgICAgICAgICAgICAgICAgICAvL2VnOiBjaWQ6Z2lmSW1hZ2Ugc2NlbmFyaW8KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkUGFydCA9IHJlZmVyZW5jZS5zdWJzdHJpbmcocmVmZXJlbmNlLmluZGV4T2YoIjoiKSArIDEpOwotICAgICAgICAgICAgICAgICAgICBpZFBhcnQgPSAiPCIgKyBpZFBhcnQgKyAiPiI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpZFBhcnQuZXF1YWxzKGNvbnRlbnRJZHNbYV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0YWNobWVudFBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb250ZW50TG9jYXRpb25zID0gYXR0YWNobWVudFBhcnQuZ2V0TWltZUhlYWRlcigiQ29udGVudC1Mb2NhdGlvbiIpOwotICAgICAgICAgICAgICAgIGlmICghKGNvbnRlbnRMb2NhdGlvbnMgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy91cmkgc2NlbmFyaW8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBjb250ZW50TG9jYXRpb25zLmxlbmd0aDsgYisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlLmVxdWFscyhjb250ZW50TG9jYXRpb25zW2JdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRhY2htZW50UGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCB0aGUgQXR0YWNobWVudFBhcnQgb2JqZWN0cyB0aGF0IGhhdmUgaGVhZGVyIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkCi0gICAgICogaGVhZGVycy4gTm90ZSB0aGF0IHRoZSByZW1vdmVkIGF0dGFjaG1lbnQgY291bGQgaGF2ZSBoZWFkZXJzIGluIGFkZGl0aW9uIHRvIHRob3NlIHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXJzIC0gYSBNaW1lSGVhZGVycyBvYmplY3QgY29udGFpbmluZyB0aGUgTUlNRSBoZWFkZXJzIGZvciB3aGljaCB0byBzZWFyY2gKLSAgICAgKiBAc2luY2UgU0FBSiAxLjMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRhY2htZW50cyhNaW1lSGVhZGVycyBoZWFkZXJzKSB7Ci0gICAgICAgIENvbGxlY3Rpb24gbmV3QXR0YWNobWVudFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBhdHRhY2htZW50UGFydHNJdHIgPSBhdHRhY2htZW50UGFydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudFBhcnRzSXRyOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnRQYXJ0ID0gKEF0dGFjaG1lbnRQYXJ0KWl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICAvL0dldCBhbGwgdGhlIGhlYWRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGFsbE1JTUVIZWFkZXJzID0gaGVhZGVycy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsTUlNRUhlYWRlcnM7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBNaW1lSGVhZGVyIG1pbWVIZWFkZXIgPSAoTWltZUhlYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gaGVhZGVyVmFsdWVzID0gYXR0YWNobWVudFBhcnQuZ2V0TWltZUhlYWRlcihtaW1lSGVhZGVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgLy9pZiB2YWx1ZXMgZm9yIHRoaXMgaGVhZGVyIG5hbWUsIGRvIG5vdCByZW1vdmUgaXQKLSAgICAgICAgICAgICAgICBpZiAoaGVhZGVyVmFsdWVzLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGhlYWRlclZhbHVlc1swXS5lcXVhbHMobWltZUhlYWRlci5nZXRWYWx1ZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dGFjaG1lbnRQYXJ0cy5hZGQoYXR0YWNobWVudFBhcnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF0dGFjaG1lbnRQYXJ0cy5jbGVhcigpOwotICAgICAgICB0aGlzLmF0dGFjaG1lbnRQYXJ0cyA9IG5ld0F0dGFjaG1lbnRQYXJ0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBTT0FQIEhlYWRlciBjb250YWluZWQgaW4gdGhpcyA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+U09BUEhlYWRlcjwvY29kZT4gb2JqZWN0IGNvbnRhaW5lZCBieSB0aGlzIDxjb2RlPlNPQVBNZXNzYWdlPC9jb2RlPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb24gaWYgdGhlIFNPQVAgSGVhZGVyIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEhlYWRlciBnZXRTT0FQSGVhZGVyKCkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGhpcy5zb2FwUGFydC5nZXRFbnZlbG9wZSgpLmdldEhlYWRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIFNPQVAgQm9keSBjb250YWluZWQgaW4gdGhpcyA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgPGNvZGU+U09BUEJvZHk8L2NvZGU+IG9iamVjdCBjb250YWluZWQgYnkgdGhpcyA8Y29kZT5TT0FQTWVzc2FnZTwvY29kZT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uIGlmIHRoZSBTT0FQIEJvZHkgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIHJldHJpZXZlZAotICAgICAqLwotICAgIHB1YmxpYyBTT0FQQm9keSBnZXRTT0FQQm9keSgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc29hcFBhcnQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgYmFzZWQgb24gdGhlIDxjb2RlPmNvbnRlbnRUeXBlPC9jb2RlPiBwYXJhbWV0ZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRDaGFyc2V0RW5jb2RpbmcoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgZGVsaW1pdGVySW5kZXggPSBjb250ZW50VHlwZS5sYXN0SW5kZXhPZigiY2hhcnNldCIpOwotICAgICAgICAgICAgaWYgKGRlbGltaXRlckluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyc2V0UGFydCA9IGNvbnRlbnRUeXBlLnN1YnN0cmluZyhkZWxpbWl0ZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaW50IGNoYXJzZXRJbmRleCA9IGNoYXJzZXRQYXJ0LmluZGV4T2YoJz0nKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2hhcnNldCA9IGNoYXJzZXRQYXJ0LnN1YnN0cmluZyhjaGFyc2V0SW5kZXggKyAxKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFyc2V0LnN0YXJ0c1dpdGgoIlwiIikgfHwgY2hhcnNldC5zdGFydHNXaXRoKCJcJyIpKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gY2hhcnNldC5zdWJzdHJpbmcoMSwgY2hhcnNldC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhcnNldC5lbmRzV2l0aCgiXCIiKSB8fCBjaGFyc2V0LmVuZHNXaXRoKCJcJyIpKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gY2hhcnNldC5zdWJzdHJpbmcoMCwgY2hhcnNldC5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBjaGFyc2V0LmluZGV4T2YoJzsnKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGNoYXJzZXQuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoU09BUE1lc3NhZ2UuQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgY2hhcnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUFBhcnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUFBhcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4Zjc2OTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBQYXJ0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk1UT01Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmJ1aWxkZXIuU3RBWFNPQVBNb2RlbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTIuU09BUDEyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zYWFqLnV0aWwuSURHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTElucHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBQYXJ0SW1wbCBleHRlbmRzIFNPQVBQYXJ0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQUGFydEltcGwuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlOwotICAgIHByaXZhdGUgU09BUEVudmVsb3BlSW1wbCBlbnZlbG9wZTsKLSAgICBwcml2YXRlIE1pbWVIZWFkZXJzRXggbWltZUhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnNFeCgpOwotCi0gICAgcHJpdmF0ZSBTb3VyY2Ugc291cmNlOwotCi0gICAgcHVibGljIFNPQVBQYXJ0SW1wbChTT0FQTWVzc2FnZUltcGwgcGFyZW50U29hcE1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBFbnZlbG9wZUltcGwgc29hcEVudmVsb3BlKSB7Ci0gICAgICAgIC8vc2V0TWltZUhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lELCBJREdlbmVyYXRvci5nZW5lcmF0ZUlEKCkpOwotICAgICAgICAvL3NldE1pbWVIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAidGV4dC94bWwiKTsKLSAgICAgICAgdGhpcy5taW1lSGVhZGVycyA9IChNaW1lSGVhZGVyc0V4KXBhcmVudFNvYXBNc2cuZ2V0TWltZUhlYWRlcnMoKTsKLSAgICAgICAgc29hcE1lc3NhZ2UgPSBwYXJlbnRTb2FwTXNnOwotICAgICAgICBlbnZlbG9wZSA9IHNvYXBFbnZlbG9wZTsKLSAgICAgICAgZG9jdW1lbnQgPSBzb2FwRW52ZWxvcGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICBlbnZlbG9wZS5zZXRTT0FQUGFydFBhcmVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU09BUFBhcnRJbXBsKFNPQVBNZXNzYWdlSW1wbCBwYXJlbnRTb2FwTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzCi0gICAgKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9ICIiOwotICAgICAgICBTdHJpbmcgZnVsbENvbnRlbnRUeXBlU3RyID0gIiI7Ci0gICAgICAgIGlmIChtaW1lSGVhZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvL1RPRE8gOiByZWFkIHN0cmluZyBmcm9tIGNvbnN0YW50cwotICAgICAgICAgICAgbWltZUhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1JRCIsIElER2VuZXJhdG9yLmdlbmVyYXRlSUQoKSk7Ci0gICAgICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoImNvbnRlbnQtdHlwZSIsIEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9BUFBMSUNBVElPTl9TT0FQX1hNTCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGVzW10gPSBtaW1lSGVhZGVycy5nZXRIZWFkZXIoSFRUUENvbnN0YW50cy5DT05URU5UX1RZUEUpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlcyAhPSBudWxsICYmIGNvbnRlbnRUeXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZnVsbENvbnRlbnRUeXBlU3RyID0gY29udGVudFR5cGVzWzBdOwotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gZXh0cmFjdEZpcnN0UGFydChmdWxsQ29udGVudFR5cGVTdHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgSXRlcmF0b3IgbWltZUhlYWRlckl0ZXJhdG9yID0gbWltZUhlYWRlcnMuZ2V0QWxsSGVhZGVycygpOwotICAgICAgICB3aGlsZSAobWltZUhlYWRlckl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWltZUhlYWRlciBtaW1lSGVhZGVyID0gKE1pbWVIZWFkZXIpbWltZUhlYWRlckl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1pbWVIZWFkZXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHNldE1pbWVIZWFkZXIobWltZUhlYWRlci5nZXROYW1lKCksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBzb2FwTWVzc2FnZSA9IHBhcmVudFNvYXBNc2c7Ci0KLSAgICAgICAgU3RyaW5nIGtub3duRW5jb2RpbmcgPSAoU3RyaW5nKSBzb2FwTWVzc2FnZS5nZXRQcm9wZXJ0eShTT0FQTWVzc2FnZS5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFJlYWRlciA9IG51bGw7Ci0gICAgICAKLSAgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIG1vZGlmaWVkSW5wdXRTdHJlYW0gPSBudWxsOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNSZWFkZXIgPSBudWxsOwotCi0gICAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCJtdWx0aXBhcnQvcmVsYXRlZCIpID09IDApIHsKLSAgICAgICAgICAgIC8vVGhpcyBjb250YWlucyBhdHRhY2hlbWVudHMKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQXR0YWNobWVudHMgYXR0YWNobWVudHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF0dGFjaG1lbnRzKGlucHV0U3RyZWFtLCBmdWxsQ29udGVudFR5cGVTdHIsIGZhbHNlLCAiIiwgIiIpOwotICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5wdXRTdHJlYW0gPSBhdHRhY2htZW50cy5nZXRTT0FQUGFydElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAJaXNSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobW9kaWZpZWRJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAKLQotICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkgPQotICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlclV0aWwuZ2V0RW52ZWxvcGVOYW1lc3BhY2UoZnVsbENvbnRlbnRUeXBlU3RyKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPQotICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlclV0aWwuZ2V0Q2hhclNldEVuY29kaW5nKGF0dGFjaG1lbnRzLmdldFNPQVBQYXJ0Q29udGVudFR5cGUoKSk7Ci0KLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0QVhVdGlscy5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoQnVpbGRlclV0aWwuZ2V0UmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50cy5nZXRTT0FQUGFydElucHV0U3RyZWFtKCksIGNoYXJTZXRFbmNvZGluZykpOwotCi0gICAgICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeTsKLSAgICAgICAgICAgICAgICBpZiAoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSS5lcXVhbHMoc29hcEVudmVsb3BlTmFtZXNwYWNlVVJJKSkgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gbmV3IFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gbmV3IFNPQVAxMkZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRzLmdldEF0dGFjaG1lbnRTcGVjVHlwZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgIE1UT01Db25zdGFudHMuTVRPTV9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAvL0NyZWF0ZXMgdGhlIE1UT00gc3BlY2lmaWMgTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgTVRPTVN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBNVE9NQ29uc3RhbnRzLlNXQV9UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50cy5nZXRBdHRhY2htZW50U3BlY1R5cGUoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBNVE9NQ29uc3RhbnRzLlNXQV9UWVBFXzEyKSkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHN0cmVhbVJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbW9kaWZpZWRJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpc1JlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihtb2RpZmllZElucHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgc3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZihrbm93bkVuY29kaW5nICE9IG51bGwpewotICAgICAgICAgICAgICAgIAlzdHJlYW1SZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG1vZGlmaWVkSW5wdXRTdHJlYW0sIGtub3duRW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIAlzdHJlYW1SZWFkZXIgPSBTdEFYVXRpbHMuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG1vZGlmaWVkSW5wdXRTdHJlYW0pOyAgICAgICAgICAgICAgICAJCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9URVhUX1hNTC5lcXVhbHMoY29udGVudFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTFGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9BUFBMSUNBVElPTl9TT0FQX1hNTC5lcXVhbHMoY29udGVudFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTJGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9NVUxUSVBBUlRfUkVMQVRFRC5lcXVhbHMoY29udGVudFR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoc3RyZWFtUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTT0FQMTFGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihzdHJlYW1SZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNPQVAxMUZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IGJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZSA9IG5ldyBTT0FQRW52ZWxvcGVJbXBsKAotICAgICAgICAgICAgICAgICAgICAob3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBFbnZlbG9wZUltcGwpc29hcEVudmVsb3BlKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBlbnZlbG9wZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5zZXRTT0FQUGFydFBhcmVudCh0aGlzKTsKLSAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIHhtbFNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2UoIGlzUmVhZGVyKTsKLSAgICAgICAgICAgIHRoaXMuc291cmNlID0geG1sU291cmNlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0Rmlyc3RQYXJ0KFN0cmluZyBmdWxsQ29udGVudFR5cGVTdHIpIHsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlOy8vdG1wQ29udGVudFR5cGUgY2FuIGJlIGxpa2UgJ2FwcGxpY2F0aW9uL3NvYXAreG1sOyBjaGFyc2V0PVVURi04OycKLSAgICAgICAgLy9Pbmx5IHRoZSBmaXJzdCBwYXJ0IGlzIGltcG9ydGFudAotICAgICAgICBpZiAoZnVsbENvbnRlbnRUeXBlU3RyLmluZGV4T2YoIjsiKSA+IC0xKSB7Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9IGZ1bGxDb250ZW50VHlwZVN0ci5zdWJzdHJpbmcoMCwgZnVsbENvbnRlbnRUeXBlU3RyLmluZGV4T2YoIjsiKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9IGZ1bGxDb250ZW50VHlwZVN0cjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU09BUFBhcnRJbXBsKFNPQVBNZXNzYWdlSW1wbCBwYXJlbnRTb2FwTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcyhwYXJlbnRTb2FwTXNnLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT2J0YWluIHRoZSBTT0FQTWVzc2FnZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVsYXRlZCBTT0FQTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTWVzc2FnZSBnZXRTb2FwTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvYXBNZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIDxDT0RFPlNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxDT0RFPlNPQVBQYXJ0PC9DT0RFPiBvYmplY3QuCi0gICAgICogT25jZSB0aGUgU09BUCBlbnZlbG9wZSBpcyBvYnRhaW5lZCwgaXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGl0cyBjb250ZW50cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxDT0RFPlNPQVBFbnZlbG9wZTwvQ09ERT4gb2JqZWN0IGZvciB0aGlzIDxDT0RFPiBTT0FQUGFydDwvQ09ERT4gb2JqZWN0Ci0gICAgICogQHRocm93cyBTT0FQRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgU09BUCBlcnJvcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGUgZ2V0RW52ZWxvcGUoKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBlbnZlbG9wZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBNSU1FIGhlYWRlcnMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgbmFtZSBvZiB0aGUgTUlNRSBoZWFkZXIocykgdG8gYmUgcmVtb3ZlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU1pbWVIZWFkZXIoU3RyaW5nIGhlYWRlcikgewotICAgICAgICBtaW1lSGVhZGVycy5yZW1vdmVIZWFkZXIoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICAvKiogUmVtb3ZlcyBhbGwgdGhlIDxDT0RFPk1pbWVIZWFkZXI8L0NPREU+IG9iamVjdHMgZm9yIHRoaXMgPENPREU+U09BUEVudmVsb3BlPC9DT0RFPiBvYmplY3QuICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsTWltZUhlYWRlcnMoKSB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLnJlbW92ZUFsbEhlYWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFsbCB0aGUgdmFsdWVzIG9mIHRoZSA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3QgaW4gdGhpcyA8Q09ERT5TT0FQUGFydDwvQ09ERT4KLSAgICAgKiBvYmplY3QgdGhhdCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiA8Q09ERT5TdHJpbmc8L0NPREU+LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGhlYWRlcjsgZXhhbXBsZTogIkNvbnRlbnQtVHlwZSIKLSAgICAgKiBAcmV0dXJuIGEgPENPREU+U3RyaW5nPC9DT0RFPiBhcnJheSBnaXZpbmcgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBzcGVjaWZpZWQgaGVhZGVyCi0gICAgICogQHNlZSAjc2V0TWltZUhlYWRlcihTdHJpbmcsIFN0cmluZykgc2V0TWltZUhlYWRlcihqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWltZUhlYWRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbWltZUhlYWRlcnMuZ2V0SGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoYW5nZXMgdGhlIGZpcnN0IGhlYWRlciBlbnRyeSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIGhlYWRlciBuYW1lIHNvIHRoYXQgaXRzIHZhbHVlIGlzIHRoZQotICAgICAqIGdpdmVuIHZhbHVlLCBhZGRpbmcgYSBuZXcgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlIGlmIG5vIGV4aXN0aW5nIGhlYWRlciBpcyBhCi0gICAgICogbWF0Y2guIElmIHRoZXJlIGlzIGEgbWF0Y2gsIHRoaXMgbWV0aG9kIGNsZWFycyBhbGwgZXhpc3RpbmcgdmFsdWVzIGZvciB0aGUgZmlyc3QgaGVhZGVyIHRoYXQKLSAgICAgKiBtYXRjaGVzIGFuZCBzZXRzIHRoZSBnaXZlbiB2YWx1ZSBpbnN0ZWFkLiBJZiBtb3JlIHRoYW4gb25lIGhlYWRlciBoYXMgdGhlIGdpdmVuIG5hbWUsIHRoaXMKLSAgICAgKiBtZXRob2QgcmVtb3ZlcyBhbGwgb2YgdGhlIG1hdGNoaW5nIGhlYWRlcnMgYWZ0ZXIgdGhlIGZpcnN0IG9uZS4KLSAgICAgKiA8cC8+Ci0gICAgICogPFA+Tm90ZSB0aGF0IFJGQzgyMiBoZWFkZXJzIGNhbiBjb250YWluIG9ubHkgVVMtQVNDSUkgY2hhcmFjdGVycy48L1A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgaGVhZGVyIG5hbWUgZm9yIHdoaWNoIHRvIHNlYXJjaAotICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxDT0RFPlN0cmluZzwvQ09ERT4gZ2l2aW5nIHRoZSB2YWx1ZSB0byBiZSBzZXQuIFRoaXMgdmFsdWUgd2lsbCBiZSBzdWJzdGl0dXRlZAotICAgICAqICAgICAgICAgICAgICBmb3IgdGhlIGN1cnJlbnQgdmFsdWUocykgb2YgdGhlIGZpcnN0IGhlYWRlciB0aGF0IGlzIGEgbWF0Y2ggaWYgdGhlcmUgaXMgb25lLiBJZgotICAgICAqICAgICAgICAgICAgICB0aGVyZSBpcyBubyBtYXRjaCwgdGhpcyB2YWx1ZSB3aWxsIGJlIHRoZSB2YWx1ZSBmb3IgYSBuZXcKLSAgICAgKiAgICAgICAgICAgICAgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBzcGVjaWZpZWQgbWltZSBoZWFkZXIgbmFtZSBvciB2YWx1ZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICogICAgICAgICAgaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBzcGVjaWZpZWQgbWltZSBoZWFkZXIgbmFtZSBvciB2YWx1ZQotICAgICAqIEBzZWUgI2dldE1pbWVIZWFkZXIoU3RyaW5nKSBnZXRNaW1lSGVhZGVyKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWltZUhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLnNldEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIDxDT0RFPk1pbWVIZWFkZXI8L0NPREU+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUgYW5kIGFkZHMgaXQgdG8KLSAgICAgKiB0aGlzIDxDT0RFPlNPQVBQYXJ0PC9DT0RFPiBvYmplY3QuIElmIGEgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKiBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2QgYWRkcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIHZhbHVlKHMpLgotICAgICAqIDxwLz4KLSAgICAgKiA8UD5Ob3RlIHRoYXQgUkZDODIyIGhlYWRlcnMgY2FuIGNvbnRhaW4gb25seSBVUy1BU0NJSSBjaGFyYWN0ZXJzLjwvUD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgYSA8Q09ERT5TdHJpbmc8L0NPREU+IGdpdmluZyB0aGUgaGVhZGVyIG5hbWUKLSAgICAgKiBAcGFyYW0gdmFsdWUgIGEgPENPREU+U3RyaW5nPC9DT0RFPiBnaXZpbmcgdGhlIHZhbHVlIHRvIGJlIHNldCBvciBhZGRlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2l0aCB0aGUgc3BlY2lmaWVkIG1pbWUgaGVhZGVyIG5hbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB2YWx1ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1pbWVIZWFkZXIoU3RyaW5nIGhlYWRlciwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLmFkZEhlYWRlcihoZWFkZXIsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgYWxsIHRoZSBoZWFkZXJzIGZvciB0aGlzIDxDT0RFPlNPQVBQYXJ0PC9DT0RFPiBvYmplY3QgYXMgYW4gaXRlcmF0b3Igb3ZlciB0aGUKLSAgICAgKiA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbiA8Q09ERT5JdGVyYXRvcjwvQ09ERT4gb2JqZWN0IHdpdGggYWxsIG9mIHRoZSBNaW1lIGhlYWRlcnMgZm9yIHRoaXMKLSAgICAgKiAgICAgICAgIDxDT0RFPlNPQVBQYXJ0PC9DT0RFPiBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0QWxsTWltZUhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIGFsbCA8Q09ERT5NaW1lSGVhZGVyPC9DT0RFPiBvYmplY3RzIHRoYXQgbWF0Y2ggYSBuYW1lIGluIHRoZSBnaXZlbiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gYXJyYXkgd2l0aCB0aGUgbmFtZShzKSBvZiB0aGUgTUlNRSBoZWFkZXJzIHRvIGJlIHJldHVybmVkCi0gICAgICogQHJldHVybiBhbGwgb2YgdGhlIE1JTUUgaGVhZGVycyB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgbmFtZXMgaW4gdGhlIGdpdmVuIGFycmF5LCByZXR1cm5lZCBhcwotICAgICAqICAgICAgICAgYW4gPENPREU+SXRlcmF0b3I8L0NPREU+IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBnZXRNYXRjaGluZ01pbWVIZWFkZXJzKFN0cmluZ1tdIG5hbWVzKSB7Ci0gICAgICAgIHJldHVybiBtaW1lSGVhZGVycy5nZXRNYXRjaGluZ0hlYWRlcnMobmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyBhbGwgPENPREU+TWltZUhlYWRlcjwvQ09ERT4gb2JqZWN0cyB3aG9zZSBuYW1lIGRvZXMgbm90IG1hdGNoIGEgbmFtZSBpbiB0aGUgZ2l2ZW4KLSAgICAgKiBhcnJheS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lcyBhIDxDT0RFPlN0cmluZzwvQ09ERT4gYXJyYXkgd2l0aCB0aGUgbmFtZShzKSBvZiB0aGUgTUlNRSBoZWFkZXJzIG5vdCB0byBiZQotICAgICAqICAgICAgICAgICAgICByZXR1cm5lZAotICAgICAqIEByZXR1cm4gYWxsIG9mIHRoZSBNSU1FIGhlYWRlcnMgaW4gdGhpcyA8Q09ERT5TT0FQUGFydDwvQ09ERT4gb2JqZWN0IGV4Y2VwdCB0aG9zZSB0aGF0IG1hdGNoCi0gICAgICogICAgICAgICBvbmUgb2YgdGhlIG5hbWVzIGluIHRoZSBnaXZlbiBhcnJheS4gVGhlIG5vbm1hdGNoaW5nIE1JTUUgaGVhZGVycyBhcmUgcmV0dXJuZWQgYXMgYW4KLSAgICAgKiAgICAgICAgIDxDT0RFPkl0ZXJhdG9yPC9DT0RFPiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yIGdldE5vbk1hdGNoaW5nTWltZUhlYWRlcnMoU3RyaW5nW10gbmFtZXMpIHsKLSAgICAgICAgcmV0dXJuIG1pbWVIZWFkZXJzLmdldE5vbk1hdGNoaW5nSGVhZGVycyhuYW1lcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTb3VyY2Ugc291cmNlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIFhNTElucHV0RmFjdG9yeSBpbnB1dEZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXI7Ci0KLSAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UpIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBpbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKHNvdXJjZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgICAgIHhmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgIHJlYWRlciA9IGlucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBidWlsZGVyMSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodGhpcy5lbnZlbG9wZS5lbGVtZW50LmdldE9NRmFjdG9yeSgpIGluc3RhbmNlb2YgU09BUDExRmFjdG9yeSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIxID0gbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKHJlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU09BUDExRmFjdG9yeSl0aGlzLmVudmVsb3BlLmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPTUZhY3RvcnkoKSwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW52ZWxvcGUuZWxlbWVudC5nZXRPTUZhY3RvcnkoKSBpbnN0YW5jZW9mIFNPQVAxMkZhY3RvcnkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyMSA9IG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihyZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVAxMkZhY3RvcnkpdGhpcy5lbnZlbG9wZS5lbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0T01GYWN0b3J5KCksIG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IGJ1aWxkZXIxLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICAgICAgZW52ZWxvcGUgPSBuZXcgU09BUEVudmVsb3BlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5TT0FQRW52ZWxvcGVJbXBsKXNvYXBFbnZlbG9wZSk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5lbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgICAgICB0aGlzLmRvY3VtZW50ID0gZW52ZWxvcGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgZW52ZWxvcGUuc2V0U09BUFBhcnRQYXJlbnQodGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU09BUEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBTT0FQRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgU09BUEVudmVsb3BlIGFzIGEgSkFYUCA8Q09ERT4gU291cmNlPC9DT0RFPiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGFzIGEgPENPREU+IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlPC9DT0RFPiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIFNPQVBFeGNlcHRpb24gaWYgdGhlIGltcGxlbWVudGF0aW9uIGNhbm5vdCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgPENPREU+U291cmNlPC9DT0RFPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QKLSAgICAgKiBAc2VlICNzZXRDb250ZW50KGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlKSBzZXRDb250ZW50KGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlKQotICAgICAqLwotICAgIHB1YmxpYyBTb3VyY2UgZ2V0Q29udGVudCgpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UodGhpcy5kb2N1bWVudCk7Ci0gICAgICAgIHRoaXMuc291cmNlID0gZG9tU291cmNlOwotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uIChzZWUgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPikgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuCi0gICAgICogRm9yIEhUTUwgZG9jdW1lbnRzIGFzIHdlbGwgYXMgWE1MIGRvY3VtZW50cyB3aXRob3V0IGEgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiB0aGlzIHJldHVybnMKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIERPTSBMZXZlbCAyIGRvZXMgbm90IHN1cHBvcnQgZWRpdGluZyB0aGUgRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbi4KLSAgICAgKiA8Y29kZT5kb2NUeXBlPC9jb2RlPiBjYW5ub3QgYmUgYWx0ZXJlZCBpbiBhbnkgd2F5LCBpbmNsdWRpbmcgdGhyb3VnaCB0aGUgdXNlIG9mIG1ldGhvZHMKLSAgICAgKiBpbmhlcml0ZWQgZnJvbSB0aGUgPGNvZGU+Tm9kZTwvY29kZT4gaW50ZXJmYWNlLCBzdWNoIGFzIDxjb2RlPmluc2VydE5vZGU8L2NvZGU+IG9yCi0gICAgICogPGNvZGU+cmVtb3ZlTm9kZTwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50VHlwZSBnZXREb2N0eXBlKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSA8Y29kZT5ET01JbXBsZW1lbnRhdGlvbjwvY29kZT4gb2JqZWN0IHRoYXQgaGFuZGxlcyB0aGlzIGRvY3VtZW50LiBBIERPTSBhcHBsaWNhdGlvbiBtYXkKLSAgICAgKiB1c2Ugb2JqZWN0cyBmcm9tIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgRE9NSW1wbGVtZW50YXRpb24gZ2V0SW1wbGVtZW50YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBhdHRyaWJ1dGUgdGhhdCBhbGxvd3MgZGlyZWN0IGFjY2VzcyB0byB0aGUgY2hpbGQgbm9kZSB0aGF0IGlzIHRoZSByb290Ci0gICAgICogZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuIEZvciBIVE1MIGRvY3VtZW50cywgdGhpcyBpcyB0aGUgZWxlbWVudCB3aXRoIHRoZSB0YWdOYW1lICJIVE1MIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgb2YgdGhlIHR5cGUgc3BlY2lmaWVkLiBOb3RlIHRoYXQgdGhlIGluc3RhbmNlIHJldHVybmVkIGltcGxlbWVudHMgdGhlCi0gICAgICogPGNvZGU+RWxlbWVudDwvY29kZT4gaW50ZXJmYWNlLCBzbyBhdHRyaWJ1dGVzIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIHJldHVybmVkCi0gICAgICogb2JqZWN0LiA8YnI+SW4gYWRkaXRpb24sIGlmIHRoZXJlIGFyZSBrbm93biBhdHRyaWJ1dGVzIHdpdGggZGVmYXVsdCB2YWx1ZXMsIDxjb2RlPkF0dHI8L2NvZGU+Ci0gICAgICogbm9kZXMgcmVwcmVzZW50aW5nIHRoZW0gYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIGVsZW1lbnQuIDxicj5UbyBjcmVhdGUKLSAgICAgKiBhbiBlbGVtZW50IHdpdGggYSBxdWFsaWZpZWQgbmFtZSBhbmQgbmFtZXNwYWNlIFVSSSwgdXNlIHRoZSA8Y29kZT5jcmVhdGVFbGVtZW50TlM8L2NvZGU+Ci0gICAgICogbWV0aG9kLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSB0byBpbnN0YW50aWF0ZS4gRm9yIFhNTCwgdGhpcyBpcyBjYXNlLXNlbnNpdGl2ZS4KLSAgICAgKiAgICAgICAgICAgICAgICBGb3IgSFRNTCwgdGhlIDxjb2RlPnRhZ05hbWU8L2NvZGU+IHBhcmFtZXRlciBtYXkgYmUgcHJvdmlkZWQgaW4gYW55IGNhc2UsIGJ1dAotICAgICAqICAgICAgICAgICAgICAgIGl0IG11c3QgYmUgbWFwcGVkIHRvIHRoZSBjYW5vbmljYWwgdXBwZXJjYXNlIGZvcm0gYnkgdGhlIERPTSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkVsZW1lbnQ8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSA8Y29kZT5ub2RlTmFtZTwvY29kZT4gYXR0cmlidXRlIHNldCB0bwotICAgICAqICAgICAgICAgPGNvZGU+dGFnTmFtZTwvY29kZT4sIGFuZCA8Y29kZT5sb2NhbE5hbWU8L2NvZGU+LCA8Y29kZT5wcmVmaXg8L2NvZGU+LCBhbmQKLSAgICAgKiAgICAgICAgIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+IG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50RnJhZ21lbnQgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBnaXZlbiB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGZvciB0aGUgbm9kZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPiBub2RlIHdob3NlIHZhbHVlIGlzIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgZm9yIHRoZSA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IGNvbnRlbnRzLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG9iamVjdC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBOT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoaXMgZG9jdW1lbnQgaXMgYW4gSFRNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KFN0cmluZyBkYXRhKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGUgd2hvc2UgdmFsdWUgaXMgdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBmb3IgdGhlIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gY29udGVudHMuCi0gICAgICogQHJldHVybiBUaGUgbmV3IDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gb2JqZWN0LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PVF9TVVBQT1JURURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkb2N1bWVudCBpcyBhbiBIVE1MIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDREFUQVNlY3Rpb24gY3JlYXRlQ0RBVEFTZWN0aW9uKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNEQVRBU2VjdGlvbihkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgPGNvZGU+UHJvY2Vzc2luZ0luc3RydWN0aW9uPC9jb2RlPiBub2RlIGdpdmVuIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgZGF0YSBzdHJpbmdzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHBhcnQgb2YgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0gICAgICogQHBhcmFtIGRhdGEgICBUaGUgZGF0YSBmb3IgdGhlIG5vZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IDxjb2RlPlByb2Nlc3NpbmdJbnN0cnVjdGlvbjwvY29kZT4gb2JqZWN0LgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGNvbnRhaW5zIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIuIDxicj5OT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoaXMgZG9jdW1lbnQgaXMgYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBIVE1MIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKQotICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIDxjb2RlPkF0dHI8L2NvZGU+IG9mIHRoZSBnaXZlbiBuYW1lLiBOb3RlIHRoYXQgdGhlIDxjb2RlPkF0dHI8L2NvZGU+IGluc3RhbmNlIGNhbgotICAgICAqIHRoZW4gYmUgc2V0IG9uIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IHVzaW5nIHRoZSA8Y29kZT5zZXRBdHRyaWJ1dGVOb2RlPC9jb2RlPiBtZXRob2QuIDxicj5UbwotICAgICAqIGNyZWF0ZSBhbiBhdHRyaWJ1dGUgd2l0aCBhIHF1YWxpZmllZCBuYW1lIGFuZCBuYW1lc3BhY2UgVVJJLCB1c2UgdGhlCi0gICAgICogPGNvZGU+Y3JlYXRlQXR0cmlidXRlTlM8L2NvZGU+IG1ldGhvZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICogQHJldHVybiBBIG5ldyA8Y29kZT5BdHRyPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgPGNvZGU+bm9kZU5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBzZXQgdG8KLSAgICAgKiAgICAgICAgIDxjb2RlPm5hbWU8L2NvZGU+LCBhbmQgPGNvZGU+bG9jYWxOYW1lPC9jb2RlPiwgPGNvZGU+cHJlZml4PC9jb2RlPiwgYW5kCi0gICAgICogICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgdGhlCi0gICAgICogICAgICAgICBlbXB0eSBzdHJpbmcuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIuCi0gICAgICovCi0gICAgcHVibGljIEF0dHIgY3JlYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0LiBJbiBhZGRpdGlvbiwgaWYgdGhlIHJlZmVyZW5jZWQgZW50aXR5IGlzCi0gICAgICoga25vd24sIHRoZSBjaGlsZCBsaXN0IG9mIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUgaXMgbWFkZSB0aGUgc2FtZSBhcyB0aGF0IG9mCi0gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+RW50aXR5PC9jb2RlPiBub2RlLklmIGFueSBkZXNjZW5kYW50IG9mIHRoZSA8Y29kZT5FbnRpdHk8L2NvZGU+IG5vZGUKLSAgICAgKiBoYXMgYW4gdW5ib3VuZCBuYW1lc3BhY2UgcHJlZml4LCB0aGUgY29ycmVzcG9uZGluZyBkZXNjZW5kYW50IG9mIHRoZSBjcmVhdGVkCi0gICAgICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBub2RlIGlzIGFsc28gdW5ib3VuZDsgKGl0cyA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4pLiBUaGUgRE9NIExldmVsIDIgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbWVjaGFuaXNtIHRvIHJlc29sdmUgbmFtZXNwYWNlCi0gICAgICogcHJlZml4ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZW50aXR5IHRvIHJlZmVyZW5jZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiBvYmplY3QuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIuIDxicj5OT1RfU1VQUE9SVEVEX0VSUjogUmFpc2VkIGlmIHRoaXMgZG9jdW1lbnQgaXMgYW4gSFRNTAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBFbnRpdHlSZWZlcmVuY2UgY3JlYXRlRW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVudGl0eVJlZmVyZW5jZShuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IG9mIGFsbCB0aGUgPGNvZGU+RWxlbWVudHM8L2NvZGU+IHdpdGggYSBnaXZlbiB0YWcgbmFtZSBpbiB0aGUKLSAgICAgKiBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBlbmNvdW50ZXJlZCBpbiBhIHByZW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+Ci0gICAgICogdHJlZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0YWduYW1lIFRoZSBuYW1lIG9mIHRoZSB0YWcgdG8gbWF0Y2ggb24uIFRoZSBzcGVjaWFsIHZhbHVlICIqIiBtYXRjaGVzIGFsbCB0YWdzLgotICAgICAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgbWF0Y2hlZCA8Y29kZT5FbGVtZW50czwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWduYW1lKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWduYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBvcnRzIGEgbm9kZSBmcm9tIGFub3RoZXIgZG9jdW1lbnQgdG8gdGhpcyBkb2N1bWVudC4gVGhlIHJldHVybmVkIG5vZGUgaGFzIG5vIHBhcmVudDsKLSAgICAgKiAoPGNvZGU+cGFyZW50Tm9kZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4pLiBUaGUgc291cmNlIG5vZGUgaXMgbm90IGFsdGVyZWQgb3IgcmVtb3ZlZAotICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIGRvY3VtZW50OyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGNvcHkgb2YgdGhlIHNvdXJjZSBub2RlLiA8YnI+Rm9yIGFsbAotICAgICAqIG5vZGVzLCBpbXBvcnRpbmcgYSBub2RlIGNyZWF0ZXMgYSBub2RlIG9iamVjdCBvd25lZCBieSB0aGUgaW1wb3J0aW5nIGRvY3VtZW50LCB3aXRoIGF0dHJpYnV0ZQotICAgICAqIHZhbHVlcyBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBub2RlJ3MgPGNvZGU+bm9kZU5hbWU8L2NvZGU+IGFuZCA8Y29kZT5ub2RlVHlwZTwvY29kZT4sIHBsdXMKLSAgICAgKiB0aGUgYXR0cmlidXRlcyByZWxhdGVkIHRvIG5hbWVzcGFjZXMgKDxjb2RlPnByZWZpeDwvY29kZT4sIDxjb2RlPmxvY2FsTmFtZTwvY29kZT4sIGFuZAotICAgICAqIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4pLiBBcyBpbiB0aGUgPGNvZGU+Y2xvbmVOb2RlPC9jb2RlPiBvcGVyYXRpb24gb24gYQotICAgICAqIDxjb2RlPk5vZGU8L2NvZGU+LCB0aGUgc291cmNlIG5vZGUgaXMgbm90IGFsdGVyZWQuIDxicj5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIGNvcGllZCBhcwotICAgICAqIGFwcHJvcHJpYXRlIHRvIHRoZSA8Y29kZT5ub2RlVHlwZTwvY29kZT4sIGF0dGVtcHRpbmcgdG8gbWlycm9yIHRoZSBiZWhhdmlvciBleHBlY3RlZCBpZiBhCi0gICAgICogZnJhZ21lbnQgb2YgWE1MIG9yIEhUTUwgc291cmNlIHdhcyBjb3BpZWQgZnJvbSBvbmUgZG9jdW1lbnQgdG8gYW5vdGhlciwgcmVjb2duaXppbmcgdGhhdCB0aGUKLSAgICAgKiB0d28gZG9jdW1lbnRzIG1heSBoYXZlIGRpZmZlcmVudCBEVERzIGluIHRoZSBYTUwgY2FzZS4gVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUKLSAgICAgKiBzcGVjaWZpY3MgZm9yIGVhY2ggdHlwZSBvZiBub2RlLiA8ZGw+IDxkdD5BVFRSSUJVVEVfTk9ERTwvZHQ+IDxkZD5UaGUKLSAgICAgKiA8Y29kZT5vd25lckVsZW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZQotICAgICAqIDxjb2RlPnNwZWNpZmllZDwvY29kZT4gZmxhZyBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gb24gdGhlIGdlbmVyYXRlZCA8Y29kZT5BdHRyPC9jb2RlPi4KLSAgICAgKiBUaGUgZGVzY2VuZGFudHMgb2YgdGhlIHNvdXJjZSA8Y29kZT5BdHRyPC9jb2RlPiBhcmUgcmVjdXJzaXZlbHkgaW1wb3J0ZWQgYW5kIHRoZSByZXN1bHRpbmcKLSAgICAgKiBub2RlcyByZWFzc2VtYmxlZCB0byBmb3JtIHRoZSBjb3JyZXNwb25kaW5nIHN1YnRyZWUuIE5vdGUgdGhhdCB0aGUgPGNvZGU+ZGVlcDwvY29kZT4KLSAgICAgKiBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdCBvbiA8Y29kZT5BdHRyPC9jb2RlPiBub2RlczsgdGhleSBhbHdheXMgY2FycnkgdGhlaXIgY2hpbGRyZW4gd2l0aAotICAgICAqIHRoZW0gd2hlbiBpbXBvcnRlZC48L2RkPiA8ZHQ+RE9DVU1FTlRfRlJBR01FTlRfTk9ERTwvZHQ+IDxkZD5JZiB0aGUgPGNvZGU+ZGVlcDwvY29kZT4gb3B0aW9uCi0gICAgICogd2FzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2UgZWxlbWVudCBhcmUgcmVjdXJzaXZlbHkgaW1wb3J0ZWQKLSAgICAgKiBhbmQgdGhlIHJlc3VsdGluZyBub2RlcyByZWFzc2VtYmxlZCB0byBmb3JtIHRoZSBjb3JyZXNwb25kaW5nIHN1YnRyZWUuIE90aGVyd2lzZSwgdGhpcyBzaW1wbHkKLSAgICAgKiBnZW5lcmF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnRGcmFnbWVudDwvY29kZT4uPC9kZD4gPGR0PkRPQ1VNRU5UX05PREU8L2R0PgotICAgICAqIDxkZD48Y29kZT5Eb2N1bWVudDwvY29kZT4gbm9kZXMgY2Fubm90IGJlIGltcG9ydGVkLjwvZGQ+IDxkdD5ET0NVTUVOVF9UWVBFX05PREU8L2R0PgotICAgICAqIDxkZD48Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBpbXBvcnRlZC48L2RkPiA8ZHQ+RUxFTUVOVF9OT0RFPC9kdD4KLSAgICAgKiA8ZGQ+U3BlY2lmaWVkIGF0dHJpYnV0ZSBub2RlcyBvZiB0aGUgc291cmNlIGVsZW1lbnQgYXJlIGltcG9ydGVkLCBhbmQgdGhlIGdlbmVyYXRlZAotICAgICAqIDxjb2RlPkF0dHI8L2NvZGU+IG5vZGVzIGFyZSBhdHRhY2hlZCB0byB0aGUgZ2VuZXJhdGVkIDxjb2RlPkVsZW1lbnQ8L2NvZGU+LiBEZWZhdWx0Ci0gICAgICogYXR0cmlidXRlcyBhcmUgbm90IGNvcGllZCwgdGhvdWdoIGlmIHRoZSBkb2N1bWVudCBiZWluZyBpbXBvcnRlZCBpbnRvIGRlZmluZXMgZGVmYXVsdAotICAgICAqIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBuYW1lLCB0aG9zZSBhcmUgYXNzaWduZWQuIElmIHRoZSA8Y29kZT5pbXBvcnROb2RlPC9jb2RlPgotICAgICAqIDxjb2RlPmRlZXA8L2NvZGU+IHBhcmFtZXRlciB3YXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgZGVzY2VuZGFudHMgb2YgdGhlIHNvdXJjZQotICAgICAqIGVsZW1lbnQgYXJlIHJlY3Vyc2l2ZWx5IGltcG9ydGVkIGFuZCB0aGUgcmVzdWx0aW5nIG5vZGVzIHJlYXNzZW1ibGVkIHRvIGZvcm0gdGhlCi0gICAgICogY29ycmVzcG9uZGluZyBzdWJ0cmVlLjwvZGQ+IDxkdD5FTlRJVFlfTk9ERTwvZHQ+IDxkZD48Y29kZT5FbnRpdHk8L2NvZGU+IG5vZGVzIGNhbiBiZQotICAgICAqIGltcG9ydGVkLCBob3dldmVyIGluIHRoZSBjdXJyZW50IHJlbGVhc2Ugb2YgdGhlIERPTSB0aGUgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBpcwotICAgICAqIHJlYWRvbmx5LiBBYmlsaXR5IHRvIGFkZCB0aGVzZSBpbXBvcnRlZCBub2RlcyB0byBhIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gd2lsbCBiZQotICAgICAqIGNvbnNpZGVyZWQgZm9yIGFkZGl0aW9uIHRvIGEgZnV0dXJlIHJlbGVhc2Ugb2YgdGhlIERPTS5PbiBpbXBvcnQsIHRoZSA8Y29kZT5wdWJsaWNJZDwvY29kZT4sCi0gICAgICogPGNvZGU+c3lzdGVtSWQ8L2NvZGU+LCBhbmQgPGNvZGU+bm90YXRpb25OYW1lPC9jb2RlPiBhdHRyaWJ1dGVzIGFyZSBjb3BpZWQuIElmIGEKLSAgICAgKiA8Y29kZT5kZWVwPC9jb2RlPiBpbXBvcnQgaXMgcmVxdWVzdGVkLCB0aGUgZGVzY2VuZGFudHMgb2YgdGhlIHRoZSBzb3VyY2UgPGNvZGU+RW50aXR5PC9jb2RlPgotICAgICAqIGFyZSByZWN1cnNpdmVseSBpbXBvcnRlZCBhbmQgdGhlIHJlc3VsdGluZyBub2RlcyByZWFzc2VtYmxlZCB0byBmb3JtIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICogc3VidHJlZS48L2RkPiA8ZHQ+IEVOVElUWV9SRUZFUkVOQ0VfTk9ERTwvZHQ+IDxkZD5Pbmx5IHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+Ci0gICAgICogaXRzZWxmIGlzIGNvcGllZCwgZXZlbiBpZiBhIDxjb2RlPmRlZXA8L2NvZGU+IGltcG9ydCBpcyByZXF1ZXN0ZWQsIHNpbmNlIHRoZSBzb3VyY2UgYW5kCi0gICAgICogZGVzdGluYXRpb24gZG9jdW1lbnRzIG1pZ2h0IGhhdmUgZGVmaW5lZCB0aGUgZW50aXR5IGRpZmZlcmVudGx5LiBJZiB0aGUgZG9jdW1lbnQgYmVpbmcKLSAgICAgKiBpbXBvcnRlZCBpbnRvIHByb3ZpZGVzIGEgZGVmaW5pdGlvbiBmb3IgdGhpcyBlbnRpdHkgbmFtZSwgaXRzIHZhbHVlIGlzIGFzc2lnbmVkLjwvZGQ+Ci0gICAgICogPGR0Pk5PVEFUSU9OX05PREU8L2R0PiA8ZGQ+IDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlcyBjYW4gYmUgaW1wb3J0ZWQsIGhvd2V2ZXIgaW4gdGhlCi0gICAgICogY3VycmVudCByZWxlYXNlIG9mIHRoZSBET00gdGhlIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gaXMgcmVhZG9ubHkuIEFiaWxpdHkgdG8gYWRkIHRoZXNlCi0gICAgICogaW1wb3J0ZWQgbm9kZXMgdG8gYSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYWRkaXRpb24gdG8gYSBmdXR1cmUKLSAgICAgKiByZWxlYXNlIG9mIHRoZSBET00uT24gaW1wb3J0LCB0aGUgPGNvZGU+cHVibGljSWQ8L2NvZGU+IGFuZCA8Y29kZT5zeXN0ZW1JZDwvY29kZT4gYXR0cmlidXRlcwotICAgICAqIGFyZSBjb3BpZWQuIE5vdGUgdGhhdCB0aGUgPGNvZGU+ZGVlcDwvY29kZT4gcGFyYW1ldGVyIGhhcyBubyBlZmZlY3Qgb24gPGNvZGU+Tm90YXRpb248L2NvZGU+Ci0gICAgICogbm9kZXMgc2luY2UgdGhleSBuZXZlciBoYXZlIGFueSBjaGlsZHJlbi48L2RkPiA8ZHQ+IFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTwvZHQ+IDxkZD5UaGUKLSAgICAgKiBpbXBvcnRlZCBub2RlIGNvcGllcyBpdHMgPGNvZGU+dGFyZ2V0PC9jb2RlPiBhbmQgPGNvZGU+ZGF0YTwvY29kZT4gdmFsdWVzIGZyb20gdGhvc2Ugb2YgdGhlCi0gICAgICogc291cmNlIG5vZGUuPC9kZD4gPGR0PlRFWFRfTk9ERSwgQ0RBVEFfU0VDVElPTl9OT0RFLCBDT01NRU5UX05PREU8L2R0PiA8ZGQ+VGhlc2UgdGhyZWUgdHlwZXMKLSAgICAgKiBvZiBub2RlcyBpbmhlcml0aW5nIGZyb20gPGNvZGU+Q2hhcmFjdGVyRGF0YTwvY29kZT4gY29weSB0aGVpciA8Y29kZT5kYXRhPC9jb2RlPiBhbmQKLSAgICAgKiA8Y29kZT5sZW5ndGg8L2NvZGU+IGF0dHJpYnV0ZXMgZnJvbSB0aG9zZSBvZiB0aGUgc291cmNlIG5vZGUuPC9kZD4gPC9kbD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbXBvcnRlZE5vZGUgVGhlIG5vZGUgdG8gaW1wb3J0LgotICAgICAqIEBwYXJhbSBkZWVwICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2l2ZWx5IGltcG9ydCB0aGUgc3VidHJlZSB1bmRlciB0aGUgc3BlY2lmaWVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICBub2RlOyBpZiA8Y29kZT5mYWxzZTwvY29kZT4sIGltcG9ydCBvbmx5IHRoZSBub2RlIGl0c2VsZiwgYXMgZXhwbGFpbmVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICBhYm92ZS4gVGhpcyBoYXMgbm8gZWZmZWN0IG9uIDxjb2RlPkF0dHI8L2NvZGU+ICwgPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCA8Y29kZT5Ob3RhdGlvbjwvY29kZT4gbm9kZXMuCi0gICAgICogQHJldHVybiBUaGUgaW1wb3J0ZWQgbm9kZSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyA8Y29kZT5Eb2N1bWVudDwvY29kZT4uCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgdHlwZSBvZiBub2RlIGJlaW5nIGltcG9ydGVkIGlzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC4KLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBpbXBvcnROb2RlKE5vZGUgaW1wb3J0ZWROb2RlLCBib29sZWFuIGRlZXApIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShpbXBvcnRlZE5vZGUsIGRlZXApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gZWxlbWVudCBvZiB0aGUgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUgYW5kIG5hbWVzcGFjZSBVUkkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJICBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgZWxlbWVudCB0byBjcmVhdGUuCi0gICAgICogQHBhcmFtIHF1YWxpZmllZE5hbWUgVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUgdG8gaW5zdGFudGlhdGUuCi0gICAgICogQHJldHVybiBBIG5ldyA8Y29kZT5FbGVtZW50PC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6IDx0YWJsZSBib3JkZXI9JzEnCi0gICAgICogICAgICAgICBzdW1tYXJ5PSJEZXNjcmlwdGlvbiBvZiBhdHRyaWJ1dGVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBuZXcgRWxlbWVudCBvYmplY3QiPiA8dHI+Ci0gICAgICogICAgICAgICA8dGg+QXR0cmlidXRlPC90aD4gPHRoPlZhbHVlPC90aD4gPC90cj4gPHRyPiA8dGQgdmFsaWduPSd0b3AnPjxjb2RlPk5vZGUubm9kZU5hbWU8L2NvZGU+PC90ZD4KLSAgICAgKiAgICAgICAgIDx0ZCB2YWxpZ249J3RvcCc+IDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+PC90ZD4gPC90cj4gPHRyPiA8dGQKLSAgICAgKiAgICAgICAgIHZhbGlnbj0ndG9wJz48Y29kZT5Ob2RlLm5hbWVzcGFjZVVSSTwvY29kZT48L3RkPiA8dGQgdmFsaWduPSd0b3AnPgotICAgICAqICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPjwvdGQ+IDwvdHI+IDx0cj4gPHRkIHZhbGlnbj0ndG9wJz48Y29kZT5Ob2RlLnByZWZpeDwvY29kZT48L3RkPgotICAgICAqICAgICAgICAgPHRkIHZhbGlnbj0ndG9wJz5wcmVmaXgsIGV4dHJhY3RlZCBmcm9tIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+LCBvcgotICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gcHJlZml4PC90ZD4gPC90cj4gPHRyPiA8dGQKLSAgICAgKiAgICAgICAgIHZhbGlnbj0ndG9wJz48Y29kZT5Ob2RlLmxvY2FsTmFtZTwvY29kZT48L3RkPiA8dGQgdmFsaWduPSd0b3AnPmxvY2FsIG5hbWUsIGV4dHJhY3RlZAotICAgICAqICAgICAgICAgZnJvbSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPjwvdGQ+IDwvdHI+IDx0cj4gPHRkIHZhbGlnbj0ndG9wJz48Y29kZT5FbGVtZW50LnRhZ05hbWU8L2NvZGU+PC90ZD4KLSAgICAgKiAgICAgICAgIDx0ZCB2YWxpZ249J3RvcCc+IDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+PC90ZD4gPC90cj4gPC90YWJsZT4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIGNvbnRhaW5zCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYW4gaWxsZWdhbCBjaGFyYWN0ZXIsIHBlciB0aGUgWE1MIDEuMCBzcGVjaWZpY2F0aW9uIC4gPGJyPk5BTUVTUEFDRV9FUlI6Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgUmFpc2VkIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBpcyBtYWxmb3JtZWQgcGVyIHRoZSBOYW1lc3BhY2VzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gWE1MIHNwZWNpZmljYXRpb24sIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYSBwcmVmaXggYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4sIG9yIGlmIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGhhcyBhIHByZWZpeCB0aGF0IGlzICJ4bWwiIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tICIgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIC4gPGJyPk5PVF9TVVBQT1JURURfRVJSOiBBbHdheXMgdGhyb3duIGlmIHRoZSBjdXJyZW50IGRvY3VtZW50IGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgPGNvZGU+IlhNTCI8L2NvZGU+IGZlYXR1cmUsIHNpbmNlIG5hbWVzcGFjZXMgd2VyZSBkZWZpbmVkIGJ5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgWE1MLgotICAgICAqIEBzaW5jZSBET00gTGV2ZWwgMgotICAgICAqLwotICAgIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUgYW5kIG5hbWVzcGFjZSBVUkkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJICBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGUgYXR0cmlidXRlIHRvIGNyZWF0ZS4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSBUaGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBpbnN0YW50aWF0ZS4KLSAgICAgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkF0dHI8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczogPHRhYmxlIGJvcmRlcj0nMScKLSAgICAgKiAgICAgICAgIHN1bW1hcnk9IkRlc2NyaXB0aW9uIG9mIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcyBmb3IgdGhlIG5ldyBBdHRyIG9iamVjdCI+IDx0cj4gPHRoPgotICAgICAqICAgICAgICAgQXR0cmlidXRlPC90aD4gPHRoPlZhbHVlPC90aD4gPC90cj4gPHRyPiA8dGQgdmFsaWduPSd0b3AnPjxjb2RlPk5vZGUubm9kZU5hbWU8L2NvZGU+PC90ZD4KLSAgICAgKiAgICAgICAgIDx0ZCB2YWxpZ249J3RvcCc+cXVhbGlmaWVkTmFtZTwvdGQ+IDwvdHI+IDx0cj4gPHRkIHZhbGlnbj0ndG9wJz4KLSAgICAgKiAgICAgICAgIDxjb2RlPk5vZGUubmFtZXNwYWNlVVJJPC9jb2RlPjwvdGQ+IDx0ZCB2YWxpZ249J3RvcCc+PGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPjwvdGQ+Ci0gICAgICogICAgICAgICA8L3RyPiA8dHI+IDx0ZCB2YWxpZ249J3RvcCc+IDxjb2RlPk5vZGUucHJlZml4PC9jb2RlPjwvdGQ+IDx0ZCB2YWxpZ249J3RvcCc+cHJlZml4LAotICAgICAqICAgICAgICAgZXh0cmFjdGVkIGZyb20gPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCi0gICAgICogICAgICAgICBwcmVmaXg8L3RkPiA8L3RyPiA8dHI+IDx0ZCB2YWxpZ249J3RvcCc+PGNvZGU+Tm9kZS5sb2NhbE5hbWU8L2NvZGU+PC90ZD4gPHRkCi0gICAgICogICAgICAgICB2YWxpZ249J3RvcCc+bG9jYWwgbmFtZSwgZXh0cmFjdGVkIGZyb20gPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT48L3RkPiA8L3RyPiA8dHI+Ci0gICAgICogICAgICAgICA8dGQgdmFsaWduPSd0b3AnPjxjb2RlPkF0dHIubmFtZTwvY29kZT48L3RkPiA8dGQgdmFsaWduPSd0b3AnPgotICAgICAqICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT48L3RkPiA8L3RyPiA8dHI+IDx0ZCB2YWxpZ249J3RvcCc+PGNvZGU+Tm9kZS5ub2RlVmFsdWU8L2NvZGU+PC90ZD4KLSAgICAgKiAgICAgICAgIDx0ZCB2YWxpZ249J3RvcCc+dGhlIGVtcHR5IHN0cmluZzwvdGQ+IDwvdHI+IDwvdGFibGU+Ci0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBjb250YWlucwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuIGlsbGVnYWwgY2hhcmFjdGVyLCBwZXIgdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbiAuIDxicj5OQU1FU1BBQ0VfRVJSOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaXMgbWFsZm9ybWVkIHBlciB0aGUgTmFtZXNwYWNlcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIFhNTCBzcGVjaWZpY2F0aW9uLCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IGFuZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LCBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYSBwcmVmaXggdGhhdCBpcyAieG1sIiBhbmQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSAiIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+LCBvciBpdHMgcHJlZml4LCBpcyAieG1sbnMiIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tICIgaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT1RfU1VQUE9SVEVEX0VSUjogQWx3YXlzIHRocm93biBpZiB0aGUgY3VycmVudCBkb2N1bWVudCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQgdGhlIDxjb2RlPiJYTUwiPC9jb2RlPiBmZWF0dXJlLCBzaW5jZSBuYW1lc3BhY2VzIHdlcmUgZGVmaW5lZCBieQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFhNTC4KLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSA8Y29kZT5Ob2RlTGlzdDwvY29kZT4gb2YgYWxsIHRoZSA8Y29kZT5FbGVtZW50czwvY29kZT4gd2l0aCBhIGdpdmVuIGxvY2FsIG5hbWUgYW5kCi0gICAgICogbmFtZXNwYWNlIFVSSSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZW5jb3VudGVyZWQgaW4gYSBwcmVvcmRlciB0cmF2ZXJzYWwgb2YgdGhlCi0gICAgICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IHRyZWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIFRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50cyB0byBtYXRjaCBvbi4gVGhlIHNwZWNpYWwgdmFsdWUgIioiCi0gICAgICogICAgICAgICAgICAgICAgICAgICBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLgotICAgICAqIEBwYXJhbSBsb2NhbE5hbWUgICAgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnRzIHRvIG1hdGNoIG9uLiBUaGUgc3BlY2lhbCB2YWx1ZSAiKiIgbWF0Y2hlcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgYWxsIGxvY2FsIG5hbWVzLgotICAgICAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IG9iamVjdCBjb250YWluaW5nIGFsbCB0aGUgbWF0Y2hlZCA8Y29kZT5FbGVtZW50czwvY29kZT4uCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gd2hvc2UgPGNvZGU+SUQ8L2NvZGU+IGlzIGdpdmVuIGJ5IDxjb2RlPmVsZW1lbnRJZDwvY29kZT4uIElmCi0gICAgICogbm8gc3VjaCBlbGVtZW50IGV4aXN0cywgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gQmVoYXZpb3IgaXMgbm90IGRlZmluZWQgaWYgbW9yZSB0aGFuIG9uZQotICAgICAqIGVsZW1lbnQgaGFzIHRoaXMgPGNvZGU+SUQ8L2NvZGU+LiBUaGUgRE9NIGltcGxlbWVudGF0aW9uIG11c3QgaGF2ZSBpbmZvcm1hdGlvbiB0aGF0IHNheXMKLSAgICAgKiB3aGljaCBhdHRyaWJ1dGVzIGFyZSBvZiB0eXBlIElELiBBdHRyaWJ1dGVzIHdpdGggdGhlIG5hbWUgIklEIiBhcmUgbm90IG9mIHR5cGUgSUQgdW5sZXNzIHNvCi0gICAgICogZGVmaW5lZC4gSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IGtub3cgd2hldGhlciBhdHRyaWJ1dGVzIGFyZSBvZiB0eXBlIElEIG9yIG5vdCBhcmUKLSAgICAgKiBleHBlY3RlZCB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudElkIFRoZSB1bmlxdWUgPGNvZGU+aWQ8L2NvZGU+IHZhbHVlIGZvciBhbiBlbGVtZW50LgotICAgICAqIEByZXR1cm4gVGhlIG1hdGNoaW5nIGVsZW1lbnQuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEJ5SWQoU3RyaW5nIGVsZW1lbnRJZCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucHV0RW5jb2RpbmcoKSB7Ci0gICAgICAgIC8vcmV0dXJuICgoRGVmZXJyZWREb2N1bWVudEltcGwpKCgoRE9NU291cmNlKXRoaXMuc291cmNlKS5nZXROb2RlKCkpKS5nZXRJbnB1dEVuY29kaW5nKCk7Ci0gICAgICAgIHJldHVybiB0aGlzLmVudmVsb3BlLmdldEVuY29kaW5nU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0WG1sRW5jb2RpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRYbWxTdGFuZGFsb25lKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0WG1sU3RhbmRhbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhtbFN0YW5kYWxvbmUoYm9vbGVhbiB4bWxTdGFuZGFsb25lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgZG9jdW1lbnQuc2V0WG1sU3RhbmRhbG9uZSh4bWxTdGFuZGFsb25lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRYbWxWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WG1sVmVyc2lvbihTdHJpbmcgeG1sVmVyc2lvbikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvY3VtZW50LnNldFhtbFZlcnNpb24oeG1sVmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0U3RyaWN0RXJyb3JDaGVja2luZygpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldFN0cmljdEVycm9yQ2hlY2tpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3RFcnJvckNoZWNraW5nKGJvb2xlYW4gc3RyaWN0RXJyb3JDaGVja2luZykgewotICAgICAgICBkb2N1bWVudC5zZXRTdHJpY3RFcnJvckNoZWNraW5nKHN0cmljdEVycm9yQ2hlY2tpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRVUkkoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXREb2N1bWVudFVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERvY3VtZW50VVJJKFN0cmluZyBkb2N1bWVudFVSSSkgewotICAgICAgICBkb2N1bWVudC5zZXREb2N1bWVudFVSSShkb2N1bWVudFVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgYWRvcHROb2RlKE5vZGUgc291cmNlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFkb3B0Tm9kZShzb3VyY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBET01Db25maWd1cmF0aW9uIGdldERvbUNvbmZpZygpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldERvbUNvbmZpZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotICAgICAgICBkb2N1bWVudC5ub3JtYWxpemVEb2N1bWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIHJlbmFtZU5vZGUoTm9kZSBuLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5yZW5hbWVOb2RlKG4sIG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgbm9kZSwgZGVwZW5kaW5nIG9uIGl0cyB0eXBlOyBzZWUgdGhlIHRhYmxlIGFib3ZlLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXROb2RlTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUsIGRlcGVuZGluZyBvbiBpdHMgdHlwZTsgc2VlIHRoZSB0YWJsZSBhYm92ZS4gV2hlbiBpdCBpcyBkZWZpbmVkIHRvIGJlCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHNldHRpbmcgaXQgaGFzIG5vIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIHdoZW4gdGhlIG5vZGUgaXMgcmVhZG9ubHkuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gRE9NU1RSSU5HX1NJWkVfRVJSOiBSYWlzZWQgd2hlbiBpdCB3b3VsZCByZXR1cm4gbW9yZSBjaGFyYWN0ZXJzIHRoYW4gZml0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gYSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+IHZhcmlhYmxlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHZhbHVlIG9mIHRoaXMgbm9kZSwgZGVwZW5kaW5nIG9uIGl0cyB0eXBlOyBzZWUgdGhlIHRhYmxlIGFib3ZlLiBXaGVuIGl0IGlzIGRlZmluZWQgdG8gYmUKLSAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgc2V0dGluZyBpdCBoYXMgbm8gZWZmZWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBET01TVFJJTkdfU0laRV9FUlI6IFJhaXNlZCB3aGVuIGl0IHdvdWxkIHJldHVybiBtb3JlIGNoYXJhY3RlcnMgdGhhbiBmaXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIDxjb2RlPkRPTVN0cmluZzwvY29kZT4gdmFyaWFibGUgb24gdGhlIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgYXJnMCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIGRvY3VtZW50LnNldE5vZGVWYWx1ZShhcmcwKTsKLSAgICB9Ci0KLSAgICAvKiogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBvYmplY3QsIGFzIGRlZmluZWQgYWJvdmUuICovCi0gICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0Tm9kZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcGFyZW50IG9mIHRoaXMgbm9kZS4gQWxsIG5vZGVzLCBleGNlcHQgPGNvZGU+QXR0cjwvY29kZT4sIDxjb2RlPkRvY3VtZW50PC9jb2RlPiwKLSAgICAgKiA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiwgPGNvZGU+RW50aXR5PC9jb2RlPiwgYW5kIDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBtYXkgaGF2ZSBhCi0gICAgICogcGFyZW50LiBIb3dldmVyLCBpZiBhIG5vZGUgaGFzIGp1c3QgYmVlbiBjcmVhdGVkIGFuZCBub3QgeWV0IGFkZGVkIHRvIHRoZSB0cmVlLCBvciBpZiBpdCBoYXMKLSAgICAgKiBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSwgdGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXRQYXJlbnROb2RlKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShkb2N1bWVudC5nZXRQYXJlbnROb2RlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgPGNvZGU+Tm9kZUxpc3Q8L2NvZGU+IHRoYXQgY29udGFpbnMgYWxsIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4gSWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVuLAotICAgICAqIHRoaXMgaXMgYSA8Y29kZT5Ob2RlTGlzdDwvY29kZT4gY29udGFpbmluZyBubyBub2Rlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTm9kZUxpc3RJbXBsIG5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgbm9kZXMuYWRkTm9kZSh0b1NBQUpOb2RlKGNoaWxkTm9kZXMuaXRlbShpKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBub2RlczsKLSAgICB9Ci0KLSAgICAvKiogVGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgbm9kZS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBub2RlLCB0aGlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uICovCi0gICAgcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLSAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUoZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICB9Ci0KLSAgICAvKiogVGhlIGxhc3QgY2hpbGQgb2YgdGhpcyBub2RlLiBJZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUsIHRoaXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gKi8KLSAgICBwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGRvY3VtZW50LmdldExhc3RDaGlsZCgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbm9kZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhpcyBub2RlLiBJZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUsIHRoaXMgcmV0dXJucwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLSAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUoZG9jdW1lbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBub2RlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIG5vZGUuIElmIHRoZXJlIGlzIG5vIHN1Y2ggbm9kZSwgdGhpcyByZXR1cm5zCi0gICAgICogPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgZ2V0TmV4dFNpYmxpbmcoKSB7Ci0gICAgICAgIHJldHVybiB0b1NBQUpOb2RlKGRvY3VtZW50LmdldE5leHRTaWJsaW5nKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgPGNvZGU+TmFtZWROb2RlTWFwPC9jb2RlPiBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgbm9kZSAoaWYgaXQgaXMgYW4KLSAgICAgKiA8Y29kZT5FbGVtZW50PC9jb2RlPikgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLiBUaGlzIGlzIGFsc28gdGhlCi0gICAgICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBuZXcgbm9kZXMuIFdoZW4gdGhpcyBub2RlIGlzIGEKLSAgICAgKiA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb3IgYSA8Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IHdoaWNoIGlzIG5vdCB1c2VkIHdpdGggYW55Ci0gICAgICogPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IHlldCwgdGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIHRoZSBub2RlIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiBiZWZvcmUgdGhlIGV4aXN0aW5nIGNoaWxkIG5vZGUgPGNvZGU+cmVmQ2hpbGQ8L2NvZGU+LgotICAgICAqIElmIDxjb2RlPnJlZkNoaWxkPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgaW5zZXJ0IDxjb2RlPm5ld0NoaWxkPC9jb2RlPiBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAqIGxpc3Qgb2YgY2hpbGRyZW4uIDxicj5JZiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gaXMgYSA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBvYmplY3QsIGFsbAotICAgICAqIG9mIGl0cyBjaGlsZHJlbiBhcmUgaW5zZXJ0ZWQsIGluIHRoZSBzYW1lIG9yZGVyLCBiZWZvcmUgPGNvZGU+cmVmQ2hpbGQ8L2NvZGU+LiBJZiB0aGUKLSAgICAgKiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gaXMgYWxyZWFkeSBpbiB0aGUgdHJlZSwgaXQgaXMgZmlyc3QgcmVtb3ZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdDaGlsZCBUaGUgbm9kZSB0byBpbnNlcnQuCi0gICAgICogQHBhcmFtIHJlZkNoaWxkIFRoZSByZWZlcmVuY2Ugbm9kZSwgaS5lLiwgdGhlIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgbm9kZSBtdXN0IGJlCi0gICAgICogICAgICAgICAgICAgICAgIGluc2VydGVkLgotICAgICAqIEByZXR1cm4gVGhlIG5vZGUgYmVpbmcgaW5zZXJ0ZWQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgYWxsb3cgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgdGhlIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiBub2RlLCBvciBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub2RlIHRvIGluc2VydCBpcyBvbmUgb2YgdGhpcyBub2RlJ3MgYW5jZXN0b3JzIG9yIHRoaXMgbm9kZSBpdHNlbGYuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPldST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiB3YXMgY3JlYXRlZCBmcm9tCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGlzIG5vZGUuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seSBvciBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUgYmVpbmcgaW5zZXJ0ZWQgaXMgcmVhZG9ubHkuIDxicj5OT1RfRk9VTkRfRVJSOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJhaXNlZCBpZiA8Y29kZT5yZWZDaGlsZDwvY29kZT4gaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50Lmluc2VydEJlZm9yZShuZXdDaGlsZCwgcmVmQ2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2VzIHRoZSBjaGlsZCBub2RlIDxjb2RlPm9sZENoaWxkPC9jb2RlPiB3aXRoIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiBpbiB0aGUgbGlzdCBvZgotICAgICAqIGNoaWxkcmVuLCBhbmQgcmV0dXJucyB0aGUgPGNvZGU+b2xkQ2hpbGQ8L2NvZGU+IG5vZGUuIDxicj5JZiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gaXMgYQotICAgICAqIDxjb2RlPkRvY3VtZW50RnJhZ21lbnQ8L2NvZGU+IG9iamVjdCwgPGNvZGU+b2xkQ2hpbGQ8L2NvZGU+IGlzIHJlcGxhY2VkIGJ5IGFsbCBvZiB0aGUKLSAgICAgKiA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBjaGlsZHJlbiwgd2hpY2ggYXJlIGluc2VydGVkIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gaXMgYWxyZWFkeSBpbiB0aGUgdHJlZSwgaXQgaXMgZmlyc3QgcmVtb3ZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdDaGlsZCBUaGUgbmV3IG5vZGUgdG8gcHV0IGluIHRoZSBjaGlsZCBsaXN0LgotICAgICAqIEBwYXJhbSBvbGRDaGlsZCBUaGUgbm9kZSBiZWluZyByZXBsYWNlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiBAcmV0dXJuIFRoZSBub2RlIHJlcGxhY2VkLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbG93IGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIHRoZSA8Y29kZT5uZXdDaGlsZDwvY29kZT4gbm9kZSwgb3IgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbm9kZSB0byBwdXQgaW4gaXMgb25lIG9mIHRoaXMgbm9kZSdzIGFuY2VzdG9ycyBvciB0aGlzIG5vZGUgaXRzZWxmLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5XUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gd2FzIGNyZWF0ZWQgZnJvbQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGEgZGlmZmVyZW50IGRvY3VtZW50IHRoYW4gdGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhpcyBub2RlLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG5vZGUgb3IgdGhlIHBhcmVudCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgbm9kZSBpcyByZWFkb25seS4gPGJyPk5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm9sZENoaWxkPC9jb2RlPiBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgcmVwbGFjZUNoaWxkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgY2hpbGQgbm9kZSBpbmRpY2F0ZWQgYnkgPGNvZGU+b2xkQ2hpbGQ8L2NvZGU+IGZyb20gdGhlIGxpc3Qgb2YgY2hpbGRyZW4sIGFuZAotICAgICAqIHJldHVybnMgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2xkQ2hpbGQgVGhlIG5vZGUgYmVpbmcgcmVtb3ZlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSBub2RlIHJlbW92ZWQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OT1RfRk9VTkRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2xkQ2hpbGQ8L2NvZGU+IGlzIG5vdCBhIGNoaWxkIG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgb2xkQ2hpbGQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBpZiAob2xkQ2hpbGQgaW5zdGFuY2VvZiBTT0FQRWxlbWVudEltcGwpIHsKLSAgICAgICAgICAgIG9sZENoaWxkID0gKChTT0FQRWxlbWVudEltcGwpb2xkQ2hpbGQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRDaGlsZCBpbnN0YW5jZW9mIFRleHRJbXBsRXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSB0ZXh0IG5vZGVzIHNvbWVob3cKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgdGhlIG5vZGUgPGNvZGU+bmV3Q2hpbGQ8L2NvZGU+IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBub2RlLiBJZiB0aGUKLSAgICAgKiA8Y29kZT5uZXdDaGlsZDwvY29kZT4gaXMgYWxyZWFkeSBpbiB0aGUgdHJlZSwgaXQgaXMgZmlyc3QgcmVtb3ZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdDaGlsZCBUaGUgbm9kZSB0byBhZGQuSWYgaXQgaXMgYSA8Y29kZT5Eb2N1bWVudEZyYWdtZW50PC9jb2RlPiBvYmplY3QsIHRoZSBlbnRpcmUKLSAgICAgKiAgICAgICAgICAgICAgICAgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGZyYWdtZW50IGFyZSBtb3ZlZCBpbnRvIHRoZSBjaGlsZCBsaXN0IG9mIHRoaXMgbm9kZQotICAgICAqIEByZXR1cm4gVGhlIG5vZGUgYWRkZWQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgYWxsb3cgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgdGhlIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiBub2RlLCBvciBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub2RlIHRvIGFwcGVuZCBpcyBvbmUgb2YgdGhpcyBub2RlJ3MgYW5jZXN0b3JzIG9yIHRoaXMgbm9kZSBpdHNlbGYuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPldST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld0NoaWxkPC9jb2RlPiB3YXMgY3JlYXRlZCBmcm9tCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgYSBkaWZmZXJlbnQgZG9jdW1lbnQgdGhhbiB0aGUgb25lIHRoYXQgY3JlYXRlZCB0aGlzIG5vZGUuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seSBvciBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcmV2aW91cyBwYXJlbnQgb2YgdGhlIG5vZGUgYmVpbmcgaW5zZXJ0ZWQgaXMgcmVhZG9ubHkuCi0gICAgICovCi0gICAgcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5hcHBlbmRDaGlsZChuZXdDaGlsZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbm9kZSBoYXMgYW55IGNoaWxkcmVuLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG5vZGUgaGFzIGFueSBjaGlsZHJlbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBkdXBsaWNhdGUgb2YgdGhpcyBub2RlLCBpLmUuLCBzZXJ2ZXMgYXMgYSBnZW5lcmljIGNvcHkgY29uc3RydWN0b3IgZm9yIG5vZGVzLiBUaGUKLSAgICAgKiBkdXBsaWNhdGUgbm9kZSBoYXMgbm8gcGFyZW50OyAoIDxjb2RlPnBhcmVudE5vZGU8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LikuIDxicj5DbG9uaW5nCi0gICAgICogYW4gPGNvZGU+RWxlbWVudDwvY29kZT4gY29waWVzIGFsbCBhdHRyaWJ1dGVzIGFuZCB0aGVpciB2YWx1ZXMsIGluY2x1ZGluZyB0aG9zZSBnZW5lcmF0ZWQgYnkKLSAgICAgKiB0aGUgWE1MIHByb2Nlc3NvciB0byByZXByZXNlbnQgZGVmYXVsdGVkIGF0dHJpYnV0ZXMsIGJ1dCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBjb3B5IGFueSB0ZXh0Ci0gICAgICogaXQgY29udGFpbnMgdW5sZXNzIGl0IGlzIGEgZGVlcCBjbG9uZSwgc2luY2UgdGhlIHRleHQgaXMgY29udGFpbmVkIGluIGEgY2hpbGQKLSAgICAgKiA8Y29kZT5UZXh0PC9jb2RlPiBub2RlLiBDbG9uaW5nIGFuIDxjb2RlPkF0dHJpYnV0ZTwvY29kZT4gZGlyZWN0bHksIGFzIG9wcG9zZWQgdG8gYmUgY2xvbmVkCi0gICAgICogYXMgcGFydCBvZiBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBjbG9uaW5nIG9wZXJhdGlvbiwgcmV0dXJucyBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgKAotICAgICAqIDxjb2RlPnNwZWNpZmllZDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4pLiBDbG9uaW5nIGFueSBvdGhlciB0eXBlIG9mIG5vZGUgc2ltcGx5IHJldHVybnMgYQotICAgICAqIGNvcHkgb2YgdGhpcyBub2RlLiA8YnI+Tm90ZSB0aGF0IGNsb25pbmcgYW4gaW1tdXRhYmxlIHN1YnRyZWUgcmVzdWx0cyBpbiBhIG11dGFibGUgY29weSwgYnV0Ci0gICAgICogdGhlIGNoaWxkcmVuIG9mIGFuIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gY2xvbmUgYXJlIHJlYWRvbmx5IC4gSW4gYWRkaXRpb24sIGNsb25lcyBvZgotICAgICAqIHVuc3BlY2lmaWVkIDxjb2RlPkF0dHI8L2NvZGU+IG5vZGVzIGFyZSBzcGVjaWZpZWQuIEFuZCwgY2xvbmluZyA8Y29kZT5Eb2N1bWVudDwvY29kZT4sCi0gICAgICogPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiwgPGNvZGU+RW50aXR5PC9jb2RlPiwgYW5kIDxjb2RlPk5vdGF0aW9uPC9jb2RlPiBub2RlcyBpcwotICAgICAqIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWVwIElmIDxjb2RlPnRydWU8L2NvZGU+LCByZWN1cnNpdmVseSBjbG9uZSB0aGUgc3VidHJlZSB1bmRlciB0aGUgc3BlY2lmaWVkIG5vZGU7IGlmCi0gICAgICogICAgICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBjbG9uZSBvbmx5IHRoZSBub2RlIGl0c2VsZiAoYW5kIGl0cyBhdHRyaWJ1dGVzLCBpZiBpdCBpcyBhbgotICAgICAqICAgICAgICAgICAgIDxjb2RlPkVsZW1lbnQ8L2NvZGU+KS4KLSAgICAgKiBAcmV0dXJuIFRoZSBkdXBsaWNhdGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5jbG9uZU5vZGUoZGVlcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0cyBhbGwgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMgaW4gdGhlIGZ1bGwgZGVwdGggb2YgdGhlIHN1Yi10cmVlIHVuZGVybmVhdGggdGhpcwotICAgICAqIDxjb2RlPk5vZGU8L2NvZGU+LCBpbmNsdWRpbmcgYXR0cmlidXRlIG5vZGVzLCBpbnRvIGEgIm5vcm1hbCIgZm9ybSB3aGVyZSBvbmx5IHN0cnVjdHVyZQotICAgICAqIChlLmcuLCBlbGVtZW50cywgY29tbWVudHMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBDREFUQSBzZWN0aW9ucywgYW5kIGVudGl0eSByZWZlcmVuY2VzKQotICAgICAqIHNlcGFyYXRlcyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcywgaS5lLiwgdGhlcmUgYXJlIG5laXRoZXIgYWRqYWNlbnQgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMKLSAgICAgKiBub3IgZW1wdHkgPGNvZGU+VGV4dDwvY29kZT4gbm9kZXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIERPTSB2aWV3IG9mIGEgZG9jdW1lbnQKLSAgICAgKiBpcyB0aGUgc2FtZSBhcyBpZiBpdCB3ZXJlIHNhdmVkIGFuZCByZS1sb2FkZWQsIGFuZCBpcyB1c2VmdWwgd2hlbiBvcGVyYXRpb25zIChzdWNoIGFzCi0gICAgICogWFBvaW50ZXIgIGxvb2t1cHMpIHRoYXQgZGVwZW5kIG9uIGEgcGFydGljdWxhciBkb2N1bWVudCB0cmVlIHN0cnVjdHVyZSBhcmUgdG8gYmUgdXNlZC5JbgotICAgICAqIGNhc2VzIHdoZXJlIHRoZSBkb2N1bWVudCBjb250YWlucyA8Y29kZT5DREFUQVNlY3Rpb25zPC9jb2RlPiwgdGhlIG5vcm1hbGl6ZSBvcGVyYXRpb24gYWxvbmUKLSAgICAgKiBtYXkgbm90IGJlIHN1ZmZpY2llbnQsIHNpbmNlIFhQb2ludGVycyBkbyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzCi0gICAgICogYW5kIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gbm9kZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm9ybWFsaXplKCkgewotICAgICAgICBkb2N1bWVudC5ub3JtYWxpemUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBET00gaW1wbGVtZW50YXRpb24gaW1wbGVtZW50cyBhIHNwZWNpZmljIGZlYXR1cmUgYW5kIHRoYXQgZmVhdHVyZSBpcwotICAgICAqIHN1cHBvcnRlZCBieSB0aGlzIG5vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmVhdHVyZSBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LiBUaGlzIGlzIHRoZSBzYW1lIG5hbWUgd2hpY2ggY2FuIGJlIHBhc3NlZCB0bwotICAgICAqICAgICAgICAgICAgICAgIHRoZSBtZXRob2QgPGNvZGU+aGFzRmVhdHVyZTwvY29kZT4gb24gPGNvZGU+RE9NSW1wbGVtZW50YXRpb248L2NvZGU+LgotICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoaXMgaXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QuIEluIExldmVsIDIsIHZlcnNpb24gMSwgdGhpcwotICAgICAqICAgICAgICAgICAgICAgIGlzIHRoZSBzdHJpbmcgIjIuMCIuIElmIHRoZSB2ZXJzaW9uIGlzIG5vdCBzcGVjaWZpZWQsIHN1cHBvcnRpbmcgYW55IHZlcnNpb24KLSAgICAgKiAgICAgICAgICAgICAgICBvZiB0aGUgZmVhdHVyZSB3aWxsIGNhdXNlIHRoZSBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIEByZXR1cm4gUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaXMgc3VwcG9ydGVkIG9uIHRoaXMgbm9kZSwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5pc1N1cHBvcnRlZChmZWF0dXJlLCB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZXNwYWNlIFVSSSBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIHVuc3BlY2lmaWVkLiA8YnI+VGhpcyBpcyBub3QgYQotICAgICAqIGNvbXB1dGVkIHZhbHVlIHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBhIG5hbWVzcGFjZSBsb29rdXAgYmFzZWQgb24gYW4gZXhhbWluYXRpb24gb2YgdGhlCi0gICAgICogbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBpbiBzY29wZS4gSXQgaXMgbWVyZWx5IHRoZSBuYW1lc3BhY2UgVVJJIGdpdmVuIGF0IGNyZWF0aW9uIHRpbWUuCi0gICAgICogPGJyPkZvciBub2RlcyBvZiBhbnkgdHlwZSBvdGhlciB0aGFuIDxjb2RlPkVMRU1FTlRfTk9ERTwvY29kZT4gYW5kCi0gICAgICogPGNvZGU+QVRUUklCVVRFX05PREU8L2NvZGU+IGFuZCBub2RlcyBjcmVhdGVkIHdpdGggYSBET00gTGV2ZWwgMSBtZXRob2QsIHN1Y2ggYXMKLSAgICAgKiA8Y29kZT5jcmVhdGVFbGVtZW50PC9jb2RlPiBmcm9tIHRoZSA8Y29kZT5Eb2N1bWVudDwvY29kZT4gaW50ZXJmYWNlLCB0aGlzIGlzIGFsd2F5cwotICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LlBlciB0aGUgTmFtZXNwYWNlcyBpbiBYTUwgU3BlY2lmaWNhdGlvbiAgYW4gYXR0cmlidXRlIGRvZXMgbm90IGluaGVyaXQgaXRzCi0gICAgICogbmFtZXNwYWNlIGZyb20gdGhlIGVsZW1lbnQgaXQgaXMgYXR0YWNoZWQgdG8uIElmIGFuIGF0dHJpYnV0ZSBpcyBub3QgZXhwbGljaXRseSBnaXZlbiBhCi0gICAgICogbmFtZXNwYWNlLCBpdCBzaW1wbHkgaGFzIG5vIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSBET00gTGV2ZWwgMgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWVzcGFjZSBwcmVmaXggb2YgdGhpcyBub2RlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyB1bnNwZWNpZmllZC4gPGJyPk5vdGUgdGhhdAotICAgICAqIHNldHRpbmcgdGhpcyBhdHRyaWJ1dGUsIHdoZW4gcGVybWl0dGVkLCBjaGFuZ2VzIHRoZSA8Y29kZT5ub2RlTmFtZTwvY29kZT4gYXR0cmlidXRlLCB3aGljaAotICAgICAqIGhvbGRzIHRoZSBxdWFsaWZpZWQgbmFtZSwgYXMgd2VsbCBhcyB0aGUgPGNvZGU+dGFnTmFtZTwvY29kZT4gYW5kIDxjb2RlPm5hbWU8L2NvZGU+Ci0gICAgICogYXR0cmlidXRlcyBvZiB0aGUgPGNvZGU+RWxlbWVudDwvY29kZT4gYW5kIDxjb2RlPkF0dHI8L2NvZGU+IGludGVyZmFjZXMsIHdoZW4gYXBwbGljYWJsZS4KLSAgICAgKiA8YnI+Tm90ZSBhbHNvIHRoYXQgY2hhbmdpbmcgdGhlIHByZWZpeCBvZiBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBrbm93biB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwKLSAgICAgKiBkb2VzIG5vdCBtYWtlIGEgbmV3IGF0dHJpYnV0ZSB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB0aGUgb3JpZ2luYWwgcHJlZml4IGFwcGVhciwgc2luY2UKLSAgICAgKiB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBhbmQgPGNvZGU+bG9jYWxOYW1lPC9jb2RlPiBkbyBub3QgY2hhbmdlLiA8YnI+Rm9yIG5vZGVzIG9mIGFueQotICAgICAqIHR5cGUgb3RoZXIgdGhhbiA8Y29kZT5FTEVNRU5UX05PREU8L2NvZGU+IGFuZCA8Y29kZT5BVFRSSUJVVEVfTk9ERTwvY29kZT4gYW5kIG5vZGVzIGNyZWF0ZWQKLSAgICAgKiB3aXRoIGEgRE9NIExldmVsIDEgbWV0aG9kLCBzdWNoIGFzIDxjb2RlPmNyZWF0ZUVsZW1lbnQ8L2NvZGU+IGZyb20gdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPgotICAgICAqIGludGVyZmFjZSwgdGhpcyBpcyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHByZWZpeCBjb250YWlucyBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVyLCBwZXIgdGhlIFhNTCAxLjAgc3BlY2lmaWNhdGlvbiAuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+TkFNRVNQQUNFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+cHJlZml4PC9jb2RlPiBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG1hbGZvcm1lZCBwZXIgdGhlIE5hbWVzcGFjZXMgaW4gWE1MIHNwZWNpZmljYXRpb24sIGlmIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gb2YgdGhpcyBub2RlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBpZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgcHJlZml4IGlzICJ4bWwiIGFuZCB0aGUgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBvZiB0aGlzIG5vZGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBkaWZmZXJlbnQgZnJvbSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgaWYgdGhpcyBub2RlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaXMgYW4gYXR0cmlidXRlIGFuZCB0aGUgc3BlY2lmaWVkIHByZWZpeCBpcyAieG1sbnMiIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IG9mIHRoaXMgbm9kZSBpcyBkaWZmZXJlbnQgZnJvbSAiCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLCBvciBpZiB0aGlzIG5vZGUgaXMgYW4gYXR0cmlidXRlIGFuZCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBvZiB0aGlzIG5vZGUgaXMgInhtbG5zIiAuCi0gICAgICogQHNpbmNlIERPTSBMZXZlbCAyCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRQcmVmaXgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZXNwYWNlIHByZWZpeCBvZiB0aGlzIG5vZGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIHVuc3BlY2lmaWVkLiA8YnI+Tm90ZSB0aGF0Ci0gICAgICogc2V0dGluZyB0aGlzIGF0dHJpYnV0ZSwgd2hlbiBwZXJtaXR0ZWQsIGNoYW5nZXMgdGhlIDxjb2RlPm5vZGVOYW1lPC9jb2RlPiBhdHRyaWJ1dGUsIHdoaWNoCi0gICAgICogaG9sZHMgdGhlIHF1YWxpZmllZCBuYW1lLCBhcyB3ZWxsIGFzIHRoZSA8Y29kZT50YWdOYW1lPC9jb2RlPiBhbmQgPGNvZGU+bmFtZTwvY29kZT4KLSAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSA8Y29kZT5FbGVtZW50PC9jb2RlPiBhbmQgPGNvZGU+QXR0cjwvY29kZT4gaW50ZXJmYWNlcywgd2hlbiBhcHBsaWNhYmxlLgotICAgICAqIDxicj5Ob3RlIGFsc28gdGhhdCBjaGFuZ2luZyB0aGUgcHJlZml4IG9mIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIGtub3duIHRvIGhhdmUgYSBkZWZhdWx0IHZhbHVlLAotICAgICAqIGRvZXMgbm90IG1ha2UgYSBuZXcgYXR0cmlidXRlIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHRoZSBvcmlnaW5hbCBwcmVmaXggYXBwZWFyLCBzaW5jZQotICAgICAqIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IGFuZCA8Y29kZT5sb2NhbE5hbWU8L2NvZGU+IGRvIG5vdCBjaGFuZ2UuIDxicj5Gb3Igbm9kZXMgb2YgYW55Ci0gICAgICogdHlwZSBvdGhlciB0aGFuIDxjb2RlPkVMRU1FTlRfTk9ERTwvY29kZT4gYW5kIDxjb2RlPkFUVFJJQlVURV9OT0RFPC9jb2RlPiBhbmQgbm9kZXMgY3JlYXRlZAotICAgICAqIHdpdGggYSBET00gTGV2ZWwgMSBtZXRob2QsIHN1Y2ggYXMgPGNvZGU+Y3JlYXRlRWxlbWVudDwvY29kZT4gZnJvbSB0aGUgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+Ci0gICAgICogaW50ZXJmYWNlLCB0aGlzIGlzIGFsd2F5cyA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcHJlZml4IGNvbnRhaW5zIGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXIsIHBlciB0aGUgWE1MIDEuMCBzcGVjaWZpY2F0aW9uIC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxicj5OQU1FU1BBQ0VfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5wcmVmaXg8L2NvZGU+IGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbWFsZm9ybWVkIHBlciB0aGUgTmFtZXNwYWNlcyBpbiBYTUwgc3BlY2lmaWNhdGlvbiwgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bmFtZXNwYWNlVVJJPC9jb2RlPiBvZiB0aGlzIG5vZGUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBwcmVmaXggaXMgInhtbCIgYW5kIHRoZSA8Y29kZT5uYW1lc3BhY2VVUkk8L2NvZGU+IG9mIHRoaXMgbm9kZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGRpZmZlcmVudCBmcm9tICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLCBpZiB0aGlzIG5vZGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBhdHRyaWJ1dGUgYW5kIHRoZSBzcGVjaWZpZWQgcHJlZml4IGlzICJ4bWxucyIgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gb2YgdGhpcyBub2RlIGlzIGRpZmZlcmVudCBmcm9tICIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIsIG9yIGlmIHRoaXMgbm9kZSBpcyBhbiBhdHRyaWJ1dGUgYW5kIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IG9mIHRoaXMgbm9kZSBpcyAieG1sbnMiIC4KLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIGFyZzApIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBkb2N1bWVudC5zZXRQcmVmaXgoYXJnMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBub2RlLiA8YnI+Rm9yIG5vZGVzIG9mIGFueSB0eXBlIG90aGVyCi0gICAgICogdGhhbiA8Y29kZT5FTEVNRU5UX05PREU8L2NvZGU+IGFuZCA8Y29kZT5BVFRSSUJVVEVfTk9ERTwvY29kZT4gYW5kIG5vZGVzIGNyZWF0ZWQgd2l0aCBhIERPTQotICAgICAqIExldmVsIDEgbWV0aG9kLCBzdWNoIGFzIDxjb2RlPmNyZWF0ZUVsZW1lbnQ8L2NvZGU+IGZyb20gdGhlIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBpbnRlcmZhY2UsCi0gICAgICogdGhpcyBpcyBhbHdheXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICoKLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldExvY2FsTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIG5vZGUgKGlmIGl0IGlzIGFuIGVsZW1lbnQpIGhhcyBhbnkgYXR0cmlidXRlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBub2RlIGhhcyBhbnkgYXR0cmlidXRlcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKiBAc2luY2UgRE9NIExldmVsIDIKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaGFzQXR0cmlidXRlcygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2UoU09BUE1lc3NhZ2VJbXBsIG1lc3NhZ2UpIHsKLSAgICAgICAgc29hcE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRE9NLUxldmVsIDMgbWV0aG9kcwotICAgICAqLwotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0QmFzZVVSSSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzaG9ydCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbihOb2RlIG5vZGUpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0VGV4dENvbnRlbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXh0Q29udGVudChTdHJpbmcgdGV4dENvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICBkb2N1bWVudC5zZXRUZXh0Q29udGVudCh0ZXh0Q29udGVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5pc1NhbWVOb2RlKG90aGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5sb29rdXBQcmVmaXgobmFtZXNwYWNlVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuaXNEZWZhdWx0TmFtZXNwYWNlKG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQubG9va3VwTmFtZXNwYWNlVVJJKHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBub2RlKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5pc0VxdWFsTm9kZShub2RlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3Qgc2V0VXNlckRhdGEoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEsIFVzZXJEYXRhSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBkb2N1bWVudC5zZXRVc2VyRGF0YShrZXksIGRhdGEsIGhhbmRsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0VXNlckRhdGEoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotICAgIAkvL1RoZXJlIGFyZSBubyBpbW1lZGlhdGUgY2hpbGQgdGV4dCBub2RlcyB0byBzb2FwIHBhcnQKLSAgICAgICAgcmV0dXJuIG51bGw7ICAgICAgICAKLSAgICB9ICAgICAgICAKLQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyZW50RWxlbWVudChTT0FQRWxlbWVudCBwYXJlbnQpIHRocm93cyBTT0FQRXhjZXB0aW9uIHsKLSAgICAJdGhyb3cgbmV3IFNPQVBFeGNlcHRpb24oIkNhbm5vdCBzZXQgdGhlIHBhcmVudCBlbGVtZW50IG9mIFNPQVBQYXJ0Iik7Ci0gICAgfQotCi0gICAgcHVibGljIFNPQVBFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOyAgLy9TT0FQIHBhcnQgaXMgdGhlIHJvb3QgZWxlbWVudAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRldGFjaE5vZGUoKSB7Ci0gICAgICAgIC8vbm90aGluZyB0byBkbyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjeWNsZU5vZGUoKSB7Ci0gICAgICAgIC8vbm90aGluZyB0byBkbyBoZXJlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBzZXQgdmFsdWUgb2YgU09BUFBhcnQuIik7Ci0gICAgfQotICAgIAotICAgIGphdmF4LnhtbC5zb2FwLk5vZGUgdG9TQUFKTm9kZShvcmcudzNjLmRvbS5Ob2RlIGRvbU5vZGUpIHsKLSAgICAgICAgcmV0dXJuIE5vZGVJbXBsRXgudG9TQUFKTm9kZShkb21Ob2RlLCB0aGlzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovVGV4dEltcGxFeC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1RleHRJbXBsRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4NmIzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovVGV4dEltcGxFeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRE9PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuZG9tLlRleHRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXh0SW1wbEV4IGV4dGVuZHMgTm9kZUltcGxFeCBpbXBsZW1lbnRzIFRleHQgewotCi0gICAgLy9UT0RPOiBhc3NpZ24gdGV4dE5vZGUKLQotICAgIHByaXZhdGUgVGV4dEltcGwgdGV4dE5vZGU7Ci0KLSAgICBwcml2YXRlIG9yZy53M2MuZG9tLk5vZGUgcHJldmlvdXNTaWJsaW5nOwotICAgIHByaXZhdGUgb3JnLnczYy5kb20uTm9kZSBuZXh0U2libGluZzsKLQotICAgIHB1YmxpYyBUZXh0SW1wbEV4KFN0cmluZyBkYXRhLCBTT0FQRWxlbWVudCBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIoKChTT0FQRWxlbWVudEltcGwpcGFyZW50KS5nZXRPTUZhY3RvcnkoKSk7Ci0gICAgICAgIHRleHROb2RlID0gKFRleHRJbXBsKURPT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCkuY3JlYXRlT01UZXh0KGRhdGEpOwotICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFRleHRJbXBsRXgoU3RyaW5nIGRhdGEsIFNPQVBFbGVtZW50IHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIHByZXZTaWJsaW5nLCBvcmcudzNjLmRvbS5Ob2RlIG5leHRTaWJsaW5nKSB7Ci0gICAgICAgIHN1cGVyKCgoU09BUEVsZW1lbnRJbXBsKXBhcmVudCkuZ2V0T01GYWN0b3J5KCkpOwotICAgICAgICB0ZXh0Tm9kZSA9IChUZXh0SW1wbClET09NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLmNyZWF0ZU9NVGV4dChkYXRhKTsKLSAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50OwotICAgICAgICB0aGlzLnByZXZpb3VzU2libGluZyA9IHByZXZTaWJsaW5nOwotICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmV4dFNpYmxpbmcob3JnLnczYy5kb20uTm9kZSBuZXh0U2libGluZykgewotICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKG9yZy53M2MuZG9tLk5vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0gICAgICAgIHRoaXMucHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlcyB3aGV0aGVyIHRoaXMgPENPREU+VGV4dDwvQ09ERT4gb2JqZWN0IHJlcHJlc2VudHMgYSBjb21tZW50LgotICAgICAqCi0gICAgICogQHJldHVybiA8Q09ERT50cnVlPC9DT0RFPiBpZiB0aGlzIDxDT0RFPlRleHQ8L0NPREU+IG9iamVjdCBpcyBhIGNvbW1lbnQ7IDxDT0RFPmZhbHNlPC9DT0RFPgotICAgICAqICAgICAgICAgb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KCkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSB0ZXh0Tm9kZS5nZXRUZXh0KCk7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5zdGFydHNXaXRoKCI8IS0tIikgJiYgdmFsdWUuZW5kc1dpdGgoIi0tPiIpOwotICAgIH0KLQotICAgIC8qKiBUaGUgbmFtZSBvZiB0aGlzIG5vZGUsIGRlcGVuZGluZyBvbiBpdHMgdHlwZTsgc2VlIHRoZSB0YWJsZSBhYm92ZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBvYmplY3QsIGFzIGRlZmluZWQgYWJvdmUuICovCi0gICAgcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCcmVha3MgdGhpcyBub2RlIGludG8gdHdvIG5vZGVzIGF0IHRoZSBzcGVjaWZpZWQgPGNvZGU+b2Zmc2V0PC9jb2RlPiwga2VlcGluZyBib3RoIGluIHRoZQotICAgICAqIHRyZWUgYXMgc2libGluZ3MuIEFmdGVyIGJlaW5nIHNwbGl0LCB0aGlzIG5vZGUgd2lsbCBjb250YWluIGFsbCB0aGUgY29udGVudCB1cCB0byB0aGUKLSAgICAgKiA8Y29kZT5vZmZzZXQ8L2NvZGU+IHBvaW50LiBBIG5ldyBub2RlIG9mIHRoZSBzYW1lIHR5cGUsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgY29udGVudCBhdCBhbmQKLSAgICAgKiBhZnRlciB0aGUgPGNvZGU+b2Zmc2V0PC9jb2RlPiBwb2ludCwgaXMgcmV0dXJuZWQuIElmIHRoZSBvcmlnaW5hbCBub2RlIGhhZCBhIHBhcmVudCBub2RlLCB0aGUKLSAgICAgKiBuZXcgbm9kZSBpcyBpbnNlcnRlZCBhcyB0aGUgbmV4dCBzaWJsaW5nIG9mIHRoZSBvcmlnaW5hbCBub2RlLiBXaGVuIHRoZSA8Y29kZT5vZmZzZXQ8L2NvZGU+Ci0gICAgICogaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG5vZGUsIHRoZSBuZXcgbm9kZSBoYXMgbm8gZGF0YS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIDE2LWJpdCB1bml0IG9mZnNldCBhdCB3aGljaCB0byBzcGxpdCwgc3RhcnRpbmcgZnJvbSA8Y29kZT4wPC9jb2RlPi4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgbm9kZSwgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG5vZGUuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIG9mZnNldCBpcyBuZWdhdGl2ZSBvciBncmVhdGVyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdGhhbiB0aGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyBpbiA8Y29kZT5kYXRhPC9jb2RlPi4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICA8YnI+Tk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5UZXh0IHNwbGl0VGV4dChpbnQgb2Zmc2V0KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRleHROb2RlLnNwbGl0VGV4dChvZmZzZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkgewotICAgICAgICAvLyBUT0RPIC0gRml4bWUuCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2hvbGVUZXh0KCkgewotICAgICAgICAvLyBUT0RPIC0gRml4bWUuCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBvcmcudzNjLmRvbS5UZXh0IHJlcGxhY2VXaG9sZVRleHQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICAvLyBUT0RPIC0gRml4bWUuCi0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVE9ETyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyYWN0ZXIgZGF0YSBvZiB0aGUgbm9kZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuIFRoZSBET00gaW1wbGVtZW50YXRpb24gbWF5IG5vdAotICAgICAqIHB1dCBhcmJpdHJhcnkgbGltaXRzIG9uIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSBzdG9yZWQgaW4gYSA8Y29kZT5DaGFyYWN0ZXJEYXRhPC9jb2RlPgotICAgICAqIG5vZGUuIEhvd2V2ZXIsIGltcGxlbWVudGF0aW9uIGxpbWl0cyBtYXkgbWVhbiB0aGF0IHRoZSBlbnRpcmV0eSBvZiBhIG5vZGUncyBkYXRhIG1heSBub3QgZml0Ci0gICAgICogaW50byBhIHNpbmdsZSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+LiBJbiBzdWNoIGNhc2VzLCB0aGUgdXNlciBtYXkgY2FsbAotICAgICAqIDxjb2RlPnN1YnN0cmluZ0RhdGE8L2NvZGU+IHRvIHJldHJpZXZlIHRoZSBkYXRhIGluIGFwcHJvcHJpYXRlbHkgc2l6ZWQgcGllY2VzLgotICAgICAqCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBET01TVFJJTkdfU0laRV9FUlI6IFJhaXNlZCB3aGVuIGl0IHdvdWxkIHJldHVybiBtb3JlIGNoYXJhY3RlcnMgdGhhbiBmaXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIDxjb2RlPkRPTVN0cmluZzwvY29kZT4gdmFyaWFibGUgb24gdGhlIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdGV4dE5vZGUuZ2V0RGF0YSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBjaGFyYWN0ZXIgZGF0YSBvZiB0aGUgbm9kZSB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuIFRoZSBET00gaW1wbGVtZW50YXRpb24gbWF5IG5vdAotICAgICAqIHB1dCBhcmJpdHJhcnkgbGltaXRzIG9uIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSBzdG9yZWQgaW4gYSA8Y29kZT5DaGFyYWN0ZXJEYXRhPC9jb2RlPgotICAgICAqIG5vZGUuIEhvd2V2ZXIsIGltcGxlbWVudGF0aW9uIGxpbWl0cyBtYXkgbWVhbiB0aGF0IHRoZSBlbnRpcmV0eSBvZiBhIG5vZGUncyBkYXRhIG1heSBub3QgZml0Ci0gICAgICogaW50byBhIHNpbmdsZSA8Y29kZT5ET01TdHJpbmc8L2NvZGU+LiBJbiBzdWNoIGNhc2VzLCB0aGUgdXNlciBtYXkgY2FsbAotICAgICAqIDxjb2RlPnN1YnN0cmluZ0RhdGE8L2NvZGU+IHRvIHJldHJpZXZlIHRoZSBkYXRhIGluIGFwcHJvcHJpYXRlbHkgc2l6ZWQgcGllY2VzLgotICAgICAqCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBET01TVFJJTkdfU0laRV9FUlI6IFJhaXNlZCB3aGVuIGl0IHdvdWxkIHJldHVybiBtb3JlIGNoYXJhY3RlcnMgdGhhbiBmaXQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiBhIDxjb2RlPkRPTVN0cmluZzwvY29kZT4gdmFyaWFibGUgb24gdGhlIGltcGxlbWVudGF0aW9uIHBsYXRmb3JtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0ZXh0Tm9kZS5zZXREYXRhKGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4dHJhY3RzIGEgcmFuZ2Ugb2YgZGF0YSBmcm9tIHRoZSBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBTdGFydCBvZmZzZXQgb2Ygc3Vic3RyaW5nIHRvIGV4dHJhY3QuCi0gICAgICogQHBhcmFtIGNvdW50ICBUaGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyB0byBleHRyYWN0LgotICAgICAqIEByZXR1cm4gVGhlIHNwZWNpZmllZCBzdWJzdHJpbmcuIElmIHRoZSBzdW0gb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiBhbmQgPGNvZGU+Y291bnQ8L2NvZGU+Ci0gICAgICogICAgICAgICBleGNlZWRzIHRoZSA8Y29kZT5sZW5ndGg8L2NvZGU+LCB0aGVuIGFsbCAxNi1iaXQgdW5pdHMgdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSBhcmUKLSAgICAgKiAgICAgICAgIHJldHVybmVkLgotICAgICAqIEB0aHJvd3MgRE9NRXhjZXB0aW9uIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIG5lZ2F0aXZlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgMTYtYml0IHVuaXRzIGluIDxjb2RlPmRhdGE8L2NvZGU+LCBvciBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgPGNvZGU+Y291bnQ8L2NvZGU+IGlzIG5lZ2F0aXZlLiA8YnI+RE9NU1RSSU5HX1NJWkVfRVJSOgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRleHQgZG9lcyBub3QgZml0IGludG8gYQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkRPTVN0cmluZzwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzdWJzdHJpbmdEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiB0ZXh0Tm9kZS5zdWJzdHJpbmdEYXRhKG9mZnNldCwgY291bnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGNoYXJhY3RlciBkYXRhIG9mIHRoZSBub2RlLiBVcG9uIHN1Y2Nlc3MsCi0gICAgICogPGNvZGU+ZGF0YTwvY29kZT4gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIDxjb2RlPmRhdGE8L2NvZGU+IGFuZCB0aGUKLSAgICAgKiA8Y29kZT5ET01TdHJpbmc8L2NvZGU+IHNwZWNpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgPGNvZGU+RE9NU3RyaW5nPC9jb2RlPiB0byBhcHBlbmQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUuYXBwZW5kRGF0YSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zZXJ0IGEgc3RyaW5nIGF0IHRoZSBzcGVjaWZpZWQgMTYtYml0IHVuaXQgb2Zmc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgY2hhcmFjdGVyIG9mZnNldCBhdCB3aGljaCB0byBpbnNlcnQuCi0gICAgICogQHBhcmFtIGRhdGEgICBUaGUgPGNvZGU+RE9NU3RyaW5nPC9jb2RlPiB0byBpbnNlcnQuCi0gICAgICogQHRocm93cyBET01FeGNlcHRpb24gSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgbmVnYXRpdmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiAxNi1iaXQgdW5pdHMgaW4gPGNvZGU+ZGF0YTwvY29kZT4uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgbm9kZSBpcyByZWFkb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnREYXRhKGludCBvZmZzZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUuaW5zZXJ0RGF0YShvZmZzZXQsIGRhdGEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSBhIHJhbmdlIG9mIDE2LWJpdCB1bml0cyBmcm9tIHRoZSBub2RlLiBVcG9uIHN1Y2Nlc3MsIDxjb2RlPmRhdGE8L2NvZGU+IGFuZAotICAgICAqIDxjb2RlPmxlbmd0aDwvY29kZT4gcmVmbGVjdCB0aGUgY2hhbmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGZyb20gd2hpY2ggdG8gc3RhcnQgcmVtb3ZpbmcuCi0gICAgICogQHBhcmFtIGNvdW50ICBUaGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyB0byBkZWxldGUuIElmIHRoZSBzdW0gb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgICAgICAgIDxjb2RlPmNvdW50PC9jb2RlPiBleGNlZWRzIDxjb2RlPmxlbmd0aDwvY29kZT4gdGhlbiBhbGwgMTYtYml0IHVuaXRzIGZyb20KLSAgICAgKiAgICAgICAgICAgICAgIDxjb2RlPm9mZnNldDwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgZGF0YSBhcmUgZGVsZXRlZC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBuZWdhdGl2ZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyBpbiA8Y29kZT5kYXRhPC9jb2RlPiwgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIDxjb2RlPmNvdW50PC9jb2RlPiBpcyBuZWdhdGl2ZS4gPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLSAgICAgICAgdGV4dE5vZGUuZGVsZXRlRGF0YShvZmZzZXQsIGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIHRoZSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgMTYtYml0IHVuaXQgb2Zmc2V0IHdpdGggdGhlIHNwZWNpZmllZAotICAgICAqIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlcGxhY2luZy4KLSAgICAgKiBAcGFyYW0gY291bnQgIFRoZSBudW1iZXIgb2YgMTYtYml0IHVuaXRzIHRvIHJlcGxhY2UuIElmIHRoZSBzdW0gb2YgPGNvZGU+b2Zmc2V0PC9jb2RlPiBhbmQKLSAgICAgKiAgICAgICAgICAgICAgIDxjb2RlPmNvdW50PC9jb2RlPiBleGNlZWRzIDxjb2RlPmxlbmd0aDwvY29kZT4sIHRoZW4gYWxsIDE2LWJpdCB1bml0cyB0byB0aGUKLSAgICAgKiAgICAgICAgICAgICAgIGVuZCBvZiB0aGUgZGF0YSBhcmUgcmVwbGFjZWQ7IChpLmUuLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGEKLSAgICAgKiAgICAgICAgICAgICAgIDxjb2RlPnJlbW92ZTwvY29kZT4gbWV0aG9kIGNhbGwgd2l0aCB0aGUgc2FtZSByYW5nZSwgZm9sbG93ZWQgYnkgYW4KLSAgICAgKiAgICAgICAgICAgICAgIDxjb2RlPmFwcGVuZDwvY29kZT4gbWV0aG9kIGludm9jYXRpb24pLgotICAgICAqIEBwYXJhbSBkYXRhICAgVGhlIDxjb2RlPkRPTVN0cmluZzwvY29kZT4gd2l0aCB3aGljaCB0aGUgcmFuZ2UgbXVzdCBiZSByZXBsYWNlZC4KLSAgICAgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbiBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBuZWdhdGl2ZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIDE2LWJpdCB1bml0cyBpbiA8Y29kZT5kYXRhPC9jb2RlPiwgb3IgaWYKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIDxjb2RlPmNvdW50PC9jb2RlPiBpcyBuZWdhdGl2ZS4gPGJyPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICBSYWlzZWQgaWYgdGhpcyBub2RlIGlzIHJlYWRvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotICAgICAgICB0ZXh0Tm9kZS5yZXBsYWNlRGF0YShvZmZzZXQsIGNvdW50LCBkYXRhKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLk9NTm9kZUV4I3NldFBhcmVudChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQ29udGFpbmVyKQotICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT01Db250YWluZXIgZWxlbWVudCkgewotICAgICAgICB0ZXh0Tm9kZS5zZXRQYXJlbnQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlI2dldFBhcmVudCgpCi0gICAgICAqLwotICAgIHB1YmxpYyBPTUNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0gICAgICAgIHJldHVybiB0ZXh0Tm9kZS5nZXRQYXJlbnQoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5vZGUjZGlzY2FyZCgpCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2NhcmQoKSB0aHJvd3MgT01FeGNlcHRpb24gewotICAgICAgICB0ZXh0Tm9kZS5kaXNjYXJkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxTZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBib29sZWFuIGNhY2hlKQotICAgICAgICAgICAgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIHRleHROb2RlLmludGVybmFsU2VyaWFsaXplKHdyaXRlciwgY2FjaGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIHRoZSB0ZXh0IHZhbHVlIChkYXRhKSBvZiB0aGlzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0ZXh0IHZhbHVlIChkYXRhKSBvZiB0aGlzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRleHROb2RlLmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRleHROb2RlLmdldERhdGEoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIGlzIGEgVGV4dCBub2RlIHRoZW4gdGhpcyBtZXRob2Qgd2lsbCBzZXQgaXRzIHZhbHVlLCBvdGhlcndpc2UgaXQgc2V0cyB0aGUgdmFsdWUgb2YKLSAgICAgKiB0aGUgaW1tZWRpYXRlIChUZXh0KSBjaGlsZCBvZiB0aGlzIG5vZGUuIFRoZSB2YWx1ZSBvZiB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIHRoaXMgbm9kZSBjYW4gYmUKLSAgICAgKiBzZXQgb25seSBpZiwgdGhlcmUgaXMgb25lIGNoaWxkIG5vZGUgYW5kIHRoYXQgbm9kZSBpcyBhIFRleHQgbm9kZSwgb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogY2hpbGRyZW4gaW4gd2hpY2ggY2FzZSBhIGNoaWxkIFRleHQgbm9kZSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHRleHQgdG8gc2V0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIG5vZGUgaXMgbm90IGEgVGV4dCAgbm9kZSBhbmQgZWl0aGVyIGhhcyBtb3JlIHRoYW4gb25lCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgbm9kZSBvciBoYXMgYSBjaGlsZCBub2RlIHRoYXQgaXMgbm90IGEgVGV4dCBub2RlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRleHROb2RlLnNldERhdGEodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGV4dE5vZGUuc2V0RGF0YSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgb3JnLnczYy5kb20uTm9kZSBnZXROZXh0U2libGluZygpIHsKLSAgICAgICAgcmV0dXJuIHRvU0FBSk5vZGUobmV4dFNpYmxpbmcpOwotICAgIH0KLQotCi0gICAgcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UHJldmlvdXNTaWJsaW5nKCkgewotICAgICAgICByZXR1cm4gdG9TQUFKTm9kZShwcmV2aW91c1NpYmxpbmcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL0lER2VuZXJhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9JREdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGUxODgwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL0lER2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqIENvZGUgYm9ycm93ZWQgZnJvbSBBdXRoZW50aWNhdG9yQmFzZS5qYXZhIGZvciBnZW5lcmF0aW5nIGEgc2VjdXJlIGlkJ3MuICovCi1wdWJsaWMgY2xhc3MgSURHZW5lcmF0b3IgewotCi0gICAgLyoqIFRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGluY2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgc2Vzc2lvbiBpZGVudGlmaWVyLiAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNFU1NJT05fSURfQllURVMgPSAxNjsKLQotICAgIC8qKiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbiBpZGVudGlmaWVycy4gKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJhbmRvbSByYW5kb20gPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgY2xhc3MgdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgc2Vzc2lvbgotICAgICAqIGlkZW50aWZpZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJhbmRvbUNsYXNzID0gImphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tIjsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIGFuZCByZXR1cm4gYSBuZXcgc2Vzc2lvbiBpZGVudGlmaWVyLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBzZXNzaW9uIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdlbmVyYXRlSUQoKSB7Ci0gICAgICAgIC8vIEdlbmVyYXRlIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIGEgc2Vzc2lvbiBpZGVudGlmaWVyCi0gICAgICAgIGJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlW1NFU1NJT05fSURfQllURVNdOwotCi0gICAgICAgIGdldFJhbmRvbSgpLm5leHRCeXRlcyhieXRlcyk7Ci0KLSAgICAgICAgLy8gUmVuZGVyIHRoZSByZXN1bHQgYXMgYSBTdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnl0ZSBiMSA9IChieXRlKSgoYnl0ZXNbaV0gJiAweGYwKSA+PiA0KTsKLSAgICAgICAgICAgIGJ5dGUgYjIgPSAoYnl0ZSkoYnl0ZXNbaV0gJiAweDBmKTsKLQotICAgICAgICAgICAgaWYgKGIxIDwgMTApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChjaGFyKSgnMCcgKyBiMSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChjaGFyKSgnQScgKyAoYjEgLSAxMCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiMiA8IDEwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikoJzAnICsgYjIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoY2hhcikoJ0EnICsgKGIyIC0gMTApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChyZXN1bHQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlIGZvciBnZW5lcmF0aW5nIHNlc3Npb24gaWRlbnRpZmllcnMuCi0gICAgICogSWYgdGhlcmUgaXMgbm8gc3VjaCBnZW5lcmF0b3IgY3VycmVudGx5IGRlZmluZWQsIGNvbnN0cnVjdCBhbmQgc2VlZCBhIG5ldyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJhbmRvbSBvYmplY3QKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgUmFuZG9tIGdldFJhbmRvbSgpIHsKLSAgICAgICAgaWYgKHJhbmRvbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShyYW5kb21DbGFzcyk7Ci0gICAgICAgICAgICAgICAgcmFuZG9tID0gKFJhbmRvbSljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByYW5kb20gPSBuZXcgamF2YS51dGlsLlJhbmRvbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAocmFuZG9tKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvU0FBSkRhdGFTb3VyY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL1NBQUpEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDVlOTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvU0FBSkRhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2Fhai51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTQUFKRGF0YVNvdXJjZSBpbXBsZW1lbnRzIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSB7Ci0KLSAgICAvKiogVGhlIGNvbnRlbnQgdHlwZS4gVGhpcyBkZWZhdWx0cyB0byA8Y29kZT5hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW08L2NvZGU+LiAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY29udGVudFR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKLQotICAgIC8qKiBUaGUgaW5jb21pbmcgc291cmNlIHN0cmVhbS4gKi8KLSAgICBwcml2YXRlIElucHV0U3RyZWFtIHNzOwotCi0gICAgLyoqIEZpZWxkIE1JTl9NRU1PUllfRElTS19DQUNIRUQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fTUVNT1JZX0RJU0tfQ0FDSEVEID0gLTE7Ci0KLSAgICAvKiogRmllbGQgTUFYX01FTU9SWV9ESVNLX0NBQ0hFRCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9NRU1PUllfRElTS19DQUNIRUQgPSAxNiAqIDEwMjQ7Ci0KLSAgICAvKiogRmllbGQgbWF4Q2FjaGVkICovCi0gICAgcHJvdGVjdGVkIGludCBtYXhDYWNoZWQgPSBNQVhfTUVNT1JZX0RJU0tfQ0FDSEVEOyAgICAgICAvLyBtYXggaW4gbWVtb3J5IGNhY2hlZC4gRGVmYXVsdC4KLQotICAgIC8qKiBGaWVsZCBkaXNrQ2FjaGVGaWxlICovCi0gICAgcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBkaXNrQ2FjaGVGaWxlID0gbnVsbDsKLQotICAgIC8vIEEgbGlzdCBvZiBvcGVuIGlucHV0IFN0cmVhbXMuCi0KLSAgICAvKiogRmllbGQgcmVhZGVycyAqLwotICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuV2Vha0hhc2hNYXAgcmVhZGVycyA9IG5ldyBqYXZhLnV0aWwuV2Vha0hhc2hNYXAoKTsKLQotICAgIC8qKiBGbGFnIHRvIHNob3cgaWYgdGhlIHJlc291cmNlcyBiZWhpbmQgdGhpcyBoYXZlIGJlZW4gZGVsZXRlZC4gKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVkOwotCi0gICAgLyoqIEZpZWxkIFJFQURfQ0hVTktfU1ogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX0NIVU5LX1NaID0gMzIgKiAxMDI0OwotCi0KLSAgICAvKiogVGhlIGxpbmtlZCBsaXN0IHRvIGhvbGQgdGhlIGluIG1lbW9yeSBidWZmZXJzLiAqLwotICAgIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlua2VkTGlzdCBtZW1vcnlidWZsaXN0ID0gbmV3IGphdmEudXRpbC5MaW5rZWRMaXN0KCk7Ci0KLSAgICAvKiogSG9sZCB0aGUgbGFzdCBtZW1vcnkgYnVmZmVyLiAqLwotICAgIHByb3RlY3RlZCBieXRlW10gY3VycmVudE1lbW9yeUJ1ZiA9IG51bGw7Ci0KLSAgICAvKiogVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoZSBhYm92ZSBidWZmZXIuICovCi0gICAgcHJvdGVjdGVkIGludCBjdXJyZW50TWVtb3J5QnVmU3o7Ci0KLSAgICAvKiogVGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgaW4gdGhpcyBkYXRhIHNvdXJjZS4gKi8KLSAgICBwcm90ZWN0ZWQgbG9uZyB0b3RhbHN6OwotCi0gICAgLyoqIFRoaXMgaXMgdGhlIGNhY2hlZCBkaXNrIHN0cmVhbS4gKi8KLSAgICBwcm90ZWN0ZWQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbSBjYWNoZWRpc2tzdHJlYW07Ci0KLSAgICAvKiogSWYgdHJ1ZSB0aGUgc291cmNlIGlucHV0IHN0cmVhbSBpcyBub3cgY2xvc2VkLiAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCi0gICAgLyoqIENvbnN0cnVjdG9yIFNBQUpEYXRhU291cmNlLiAqLwotICAgIHByb3RlY3RlZCBTQUFKRGF0YVNvdXJjZSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgYm91bmRhcnkgc3RyZWFtLgotICAgICAqCi0gICAgICogQHBhcmFtIHNzICAgICAgICAgIGlzIHRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtIHRoYXQgaXMgdXNlZCB0byBjcmVhdGUgdGhpcyBkYXRhIHNvdXJjZS4KLSAgICAgKiBAcGFyYW0gbWF4Q2FjaGVkICAgVGhpcyBpcyB0aGUgbWF4IG1lbW9yeSB0aGF0IGlzIHRvIGJlIHVzZWQgdG8gY2FjaGUgdGhlIGRhdGEuCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIHRoZSBtaW1lIHR5cGUgZm9yIHRoaXMgZGF0YSBzdHJlYW0uIGJ5IGJ1ZmZlcmluZyB5b3UgY2FuIHNvbWUgZWZmaWVuY3kgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgc2VhcmNoaW5nLgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTQUFKRGF0YVNvdXJjZShJbnB1dFN0cmVhbSBzcywgaW50IG1heENhY2hlZCwgU3RyaW5nIGNvbnRlbnRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzKHNzLCBtYXhDYWNoZWQsIGNvbnRlbnRUeXBlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IGJvdW5kYXJ5IHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcyAgICAgICAgICBpcyB0aGUgc291cmNlIGlucHV0IHN0cmVhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHRoaXMgZGF0YSBzb3VyY2UuCi0gICAgICogQHBhcmFtIG1heENhY2hlZCAgIFRoaXMgaXMgdGhlIG1heCBtZW1vcnkgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGNhY2hlIHRoZSBkYXRhLgotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgbWltZSB0eXBlIGZvciB0aGlzIGRhdGEgc3RyZWFtLiBieSBidWZmZXJpbmcgeW91IGNhbiBzb21lIGVmZmllbmN5IGluCi0gICAgICogICAgICAgICAgICAgICAgICAgIHNlYXJjaGluZy4KLSAgICAgKiBAcGFyYW0gcmVhZGFsbCAgICAgaWYgdHJ1ZSB3aWxsIHJlYWQgaW4gdGhlIHdob2xlIHNvdXJjZS4KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU0FBSkRhdGFTb3VyY2UoSW5wdXRTdHJlYW0gc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhDYWNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSwgYm9vbGVhbiByZWFkYWxsKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKHNzIGluc3RhbmNlb2YgQnVmZmVyZWRJbnB1dFN0cmVhbSkgewotICAgICAgICAgICAgdGhpcy5zcyA9IHNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5zcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNzKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLm1heENhY2hlZCA9IG1heENhY2hlZDsKLSAgICAgICAgaWYgKChudWxsICE9IGNvbnRlbnRUeXBlKSAmJiAoY29udGVudFR5cGUubGVuZ3RoKCkgIT0gMCkpIHsKLSAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4Q2FjaGVkIDwgTUlOX01FTU9SWV9ESVNLX0NBQ0hFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkTWF4Q2FjaGVkICIgKyBtYXhDYWNoZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9yIG5vdyByZWFkIGFsbCBpbiB0byBkaXNrLgotICAgICAgICBpZiAocmVhZGFsbCkgewotICAgICAgICAgICAgYnl0ZVtdIHJlYWRidWZmZXIgPSBuZXcgYnl0ZVtSRUFEX0NIVU5LX1NaXTsKLQotICAgICAgICAgICAgaW50IHJlYWQgPSAwOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHJlYWQgPSBzcy5yZWFkKHJlYWRidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlYWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlVG9NZW1vcnkocmVhZGJ1ZmZlciwgcmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAocmVhZCA+IC0xKTsKLSAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIGxvdyBsZXZlbCB3cml0ZS4gQ2xvc2UgdGhlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoIWNsb3NlZCkgewotICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgIC8vIE1hcmtpdCBhcyBjbG9zZWQuCi0gICAgICAgICAgICBpZiAobnVsbCAhPSBjYWNoZWRpc2tzdHJlYW0pIHsgICAgLy8gY2xvc2UgdGhlIGRpc2sgY2FjaGUuCi0gICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG51bGwgIT0gbWVtb3J5YnVmbGlzdCkgeyAgICAgIC8vIFRoZXJlIGlzIGEgbWVtb3J5IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudE1lbW9yeUJ1ZlN6ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBieXRlW10gdG1wID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYnl0ZVtjdXJyZW50TWVtb3J5QnVmU3pdOyAgICAvLyBHZXQgdGhlIGxhc3QgYnVmZmVyIGFuZCBtYWtlIGl0IHRoZSBzaXplb2YgdGhlIGFjdHVhbCBkYXRhLgotCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudE1lbW9yeUJ1ZiwgMCwgdG1wLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWZTeik7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeWJ1Zmxpc3Quc2V0KG1lbW9yeWJ1Zmxpc3Quc2l6ZSgpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wKTsgICAgICAgICAgICAgICAgIC8vIE5vdyByZXBsYWNlIHRoZSBsYXN0IGJ1ZmZlciB3aXRoIHRoaXMgc2l6ZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZiA9IG51bGw7ICAgICAgLy8gTm8gbmVlZCBmb3IgdGhpcyBhbnltb3JlLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUm91dGluZSB0byBmbHVzaCBkYXRhIHRvIGRpc2sgaWYgaXMgaW4gbWVtb3J5LgotICAgICAqCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZsdXNoVG9EaXNrKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBMaW5rZWRMaXN0IG1sID0gbWVtb3J5YnVmbGlzdDsKLSAgICAgICAgaWYgKG1sICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChudWxsID09IGNhY2hlZGlza3N0cmVhbSkgeyAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIGRpc2sgY2FjaGUKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvKiBNZXNzYWdlQ29udGV4dCBtYyA9IE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgYXR0ZGlyID0gKG1jID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYy5nZXRTdHJQcm9wKAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dC5BVFRBQ0hNRU5UU19ESVIpOyovCi0KLQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0YWNoZW1lbnREaXIgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgYXR0YWNoZW1lbnREaXIgPSAoU3RyaW5nKW1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkFUVEFDSE1FTlRfVEVNUF9ESVIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlbWVudERpci5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSAoUGFyYW1ldGVyKW1lc3NhZ2VDb250ZXh0LmdldFBhcmFtZXRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQVRUQUNITUVOVF9URU1QX0RJUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVtZW50RGlyID0gKFN0cmluZylwYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZGlza0NhY2hlRmlsZSA9IGphdmEuaW8uRmlsZS5jcmVhdGVUZW1wRmlsZSgiQXhpcyIsICIuYXR0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0YWNoZW1lbnREaXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVtZW50RGlyKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkaXNrQ2FjaGVGaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaXN0c3ogPSBtbC5zaXplKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBlbnRpcmUgbWVtb3J5IGhlbGQgc3RvcmUgdG8gZGlzay4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBtbC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByYnVmID0gKGJ5dGVbXSlpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYndyaXRlID0gKGxpc3Rzei0tID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3VycmVudE1lbW9yeUJ1ZlN6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmJ1Zi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0ud3JpdGUocmJ1ZiwgMCwgYndyaXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeWJ1Zmxpc3QgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgICAgICAgICBkaXNrQ2FjaGVGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVkaXNrc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgbWF4Q2FjaGVkID0gamF2YS5sYW5nLkludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlIGJ5dGVzIHRvIHRoZSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBhbGwgYnl0ZXMgb2YgdGhpcyBhcnJheSBhcmUgd3JpdHRlbiB0byB0aGUgc3RyZWFtCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd3JpdGluZyB0aGUgZGF0YQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdyaXRlKGRhdGEsIGRhdGEubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBhIGxvdyBsZXZlbCB3cml0ZS4gTm90ZSBpdCBpcyBkZXNpZ25lZCB0byBpbiB0aGUgZnV0dXJlIHRvIGFsbG93IHN0cmVhbWluZyB0bwotICAgICAqIGJvdGggbWVtb3J5IEFORCB0byBkaXNrIHNpbXVsdGFuZW91c2x5LgotICAgICAqCi0gICAgICogQHBhcmFtIGRhdGEKLSAgICAgKiBAcGFyYW0gbGVuZ3RoCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNsb3NlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oInN0cmVhbUNsb3NlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJ5dGVzd3JpdHRlbiA9IDA7Ci0KLSAgICAgICAgaWYgKChudWxsICE9IG1lbW9yeWJ1Zmxpc3QpCi0gICAgICAgICAgICAgICAgJiYgKHRvdGFsc3ogKyBsZW5ndGggPiBtYXhDYWNoZWQpKSB7ICAgIC8vIENhY2hlIHRvIGRpc2suCi0gICAgICAgICAgICBpZiAobnVsbCA9PSBjYWNoZWRpc2tzdHJlYW0pIHsgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIGRpc2sgY2FjaGUKLSAgICAgICAgICAgICAgICBmbHVzaFRvRGlzaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1lbW9yeWJ1Zmxpc3QgIT0gbnVsbCkgeyAgICAvLyBDYW4gd3JpdGUgdG8gbWVtb3J5LgotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRNZW1vcnlCdWYpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZiA9IG5ldyBieXRlW1JFQURfQ0hVTktfU1pdOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3ogPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIG1lbW9yeWJ1Zmxpc3QuYWRkKGN1cnJlbnRNZW1vcnlCdWYpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGJ5dGVzIHRvIHdyaXRlIGlzIHRoZSBtaW4uIGJldHdlZW4gdGhlIHJlbWFpbmluZyBieXRlcyBhbmQgd2hhdCBpcyBsZWZ0IGluIHRoaXMgYnVmZmVyLgotICAgICAgICAgICAgICAgIGludCBieXRlczJ3cml0ZSA9IE1hdGgubWluKChsZW5ndGggLSBieXRlc3dyaXR0ZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50TWVtb3J5QnVmLmxlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBjdXJyZW50TWVtb3J5QnVmU3opKTsKLQotICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIGRhdGEuCi0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCBieXRlc3dyaXR0ZW4sIGN1cnJlbnRNZW1vcnlCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3osIGJ5dGVzMndyaXRlKTsKLQotICAgICAgICAgICAgICAgIGJ5dGVzd3JpdHRlbiArPSBieXRlczJ3cml0ZTsKLSAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3ogKz0gYnl0ZXMyd3JpdGU7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXN3cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICA8IGxlbmd0aCkgeyAgICAvLyBvbmx5IGdldCBtb3JlIGlmIHdlIHJlYWxseSBuZWVkIGl0LgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmID0gbmV3IGJ5dGVbUkVBRF9DSFVOS19TWl07Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWZTeiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW9yeWJ1Zmxpc3QuYWRkKGN1cnJlbnRNZW1vcnlCdWYpOyAgICAvLyBhZGQgaXQgdG8gdGhlIGNoYWluLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKGJ5dGVzd3JpdHRlbiA8IGxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSBjYWNoZWRpc2tzdHJlYW0pIHsgICAgLy8gV3JpdGUgdG8gdGhlIG91dCBnb2luZyBzdHJlYW0uCi0gICAgICAgICAgICBjYWNoZWRpc2tzdHJlYW0ud3JpdGUoZGF0YSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbHN6ICs9IGxlbmd0aDsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGEgbG93IGxldmVsIHdyaXRlLiBXcml0ZXMgb25seSB0byBtZW1vcnkKLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhCi0gICAgICogQHBhcmFtIGxlbmd0aAotICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZVRvTWVtb3J5KGJ5dGVbXSBkYXRhLCBpbnQgbGVuZ3RoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGNsb3NlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oInN0cmVhbUNsb3NlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGJ5dGVzd3JpdHRlbiA9IDA7Ci0gICAgICAgIGlmIChtZW1vcnlidWZsaXN0ICE9IG51bGwpIHsgICAgLy8gQ2FuIHdyaXRlIHRvIG1lbW9yeS4KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBjdXJyZW50TWVtb3J5QnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRNZW1vcnlCdWYgPSBuZXcgYnl0ZVtSRUFEX0NIVU5LX1NaXTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZlN6ID0gMDsKLQotICAgICAgICAgICAgICAgICAgICBtZW1vcnlidWZsaXN0LmFkZChjdXJyZW50TWVtb3J5QnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBieXRlcyB0byB3cml0ZSBpcyB0aGUgbWluLiBiZXR3ZWVuIHRoZSByZW1haW5pbmcgYnl0ZXMgYW5kIHdoYXQgaXMgbGVmdCBpbiB0aGlzIGJ1ZmZlci4KLSAgICAgICAgICAgICAgICBpbnQgYnl0ZXMyd3JpdGUgPSBNYXRoLm1pbigobGVuZ3RoIC0gYnl0ZXN3cml0dGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudE1lbW9yeUJ1Zi5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY3VycmVudE1lbW9yeUJ1ZlN6KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjb3B5IHRoZSBkYXRhLgotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgYnl0ZXN3cml0dGVuLCBjdXJyZW50TWVtb3J5QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZlN6LCBieXRlczJ3cml0ZSk7Ci0KLSAgICAgICAgICAgICAgICBieXRlc3dyaXR0ZW4gKz0gYnl0ZXMyd3JpdGU7Ci0gICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZlN6ICs9IGJ5dGVzMndyaXRlOwotCi0gICAgICAgICAgICAgICAgaWYgKGJ5dGVzd3JpdHRlbgotICAgICAgICAgICAgICAgICAgICAgICAgPCBsZW5ndGgpIHsgICAgLy8gb25seSBnZXQgbW9yZSBpZiB3ZSByZWFsbHkgbmVlZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbW9yeUJ1ZiA9IG5ldyBieXRlW1JFQURfQ0hVTktfU1pdOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWVtb3J5QnVmU3ogPSAwOwotICAgICAgICAgICAgICAgICAgICBtZW1vcnlidWZsaXN0LmFkZChjdXJyZW50TWVtb3J5QnVmKTsgICAgLy8gYWRkIGl0IHRvIHRoZSBjaGFpbi4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChieXRlc3dyaXR0ZW4gPCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsc3ogKz0gbGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgZmlsZW5hbWUgb2YgdGhlIGNvbnRlbnQgaWYgaXQgaXMgY2FjaGVkIHRvIGRpc2suCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGZpbGUgb2JqZWN0IHBvaW50aW5nIHRvIGZpbGUsIG9yIG51bGwgZm9yIG1lbW9yeS1zdG9yZWQgY29udGVudAotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldERpc2tDYWNoZUZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBkaXNrQ2FjaGVGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgU0FBSklucHV0U3RyZWFtKCk7ICAgIC8vIFJldHVybiB0aGUgbWVtb3J5IGhlbGQgc3RyZWFtLgotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy9UT0RPOiBNZXRob2QgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmbHVzaFRvRGlzaygpOwotICAgICAgICAgICAgaWYgKGRpc2tDYWNoZUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldCA9IGRpc2tDYWNoZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkaXNrQ2FjaGVGaWxlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogSW5uZXIgY2xhc3MgdG8gaGFuZGxlIGdldHRpbmcgYW4gaW5wdXQgc3RyZWFtIHRvIHRoaXMgZGF0YSBzb3VyY2UgSGFuZGxlcyBjcmVhdGluZyBhbiBpbnB1dAotICAgICAqIHN0cmVhbSB0byB0aGUgc291cmNlLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU0FBSklucHV0U3RyZWFtIGV4dGVuZHMgamF2YS5pby5JbnB1dFN0cmVhbSB7Ci0KLSAgICAgICAgLyoqIGJ5dGVzIHJlYWQuICovCi0gICAgICAgIHByb3RlY3RlZCBsb25nIGJyZWFkID0gMDsKLQotICAgICAgICAvKiogVGhlIHJlYWwgc3RyZWFtLiAqLwotICAgICAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbSBmaWxlSVM7Ci0KLSAgICAgICAgLyoqIFRoZSBwb3NpdGlvbiBpbiB0aGUgbGlzdCB3ZXJlIHdlIGFyZSByZWFkaW5nIGZyb20uICovCi0gICAgICAgIGludCBjdXJyZW50SW5kZXg7Ci0KLSAgICAgICAgLyoqIHRoZSBidWZmZXIgd2UgYXJlIGN1cnJlbnRseSByZWFkaW5nIGZyb20uICovCi0gICAgICAgIGJ5dGVbXSBjdXJyZW50QnVmOwotCi0gICAgICAgIC8qKiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGVyZS4gKi8KLSAgICAgICAgaW50IGN1cnJlbnRCdWZQb3M7Ci0KLSAgICAgICAgLyoqIFRoZSByZWFkIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuICovCi0gICAgICAgIGJvb2xlYW4gcmVhZENsb3NlZDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgSW5zdHJlYW0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGUgSW5zdHJlYW0gY291bGQgbm90IGJlIGNyZWF0ZWQgb3IgaWYgdGhlIGRhdGEgc291cmNlCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZWxldGVkCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgU0FBSklucHV0U3RyZWFtKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigicmVzb3VyY2VEZWxldGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWFkZXJzLnB1dCh0aGlzLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBRdWVyeSBmb3IgdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0Ci0gICAgICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGlzIHN0cmVhbSBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IHN1cHBvcnRzIHJlYWRpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigicmVzb3VyY2VEZWxldGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhZENsb3NlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJzdHJlYW1DbG9zZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhNYXRoLm1pbihJbnRlZ2VyLk1BWF9WQUxVRSwgdG90YWxzeiAtIGJyZWFkKSkuaW50VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgYnl0ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gYnl0ZSByZWFkIG9yIC0xIGlmIG5vIG1vcmUgZGF0YS4KLSAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFNBQUpEYXRhU291cmNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmV0YiA9IG5ldyBieXRlWzFdOwotICAgICAgICAgICAgICAgIGludCBiciA9IHJlYWQocmV0YiwgMCwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJyID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDB4RkYgJiByZXRiWzBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIE5vdCBzdXBwb3J0ZWQuICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTm90IHN1cHBvcnRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlYWRsaW1pdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTm90IHN1cHBvcnRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIm5vUmVzZXRNYXJrIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgc2tpcHBlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKGRlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInJlc291cmNlRGVsZXRlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVhZENsb3NlZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic3RyZWFtQ2xvc2VkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChza2lwcGVkIDwgMSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAvLyBub3RoaW5nIHRvIHNraXAuCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU0FBSkRhdGFTb3VyY2UudGhpcykgewotICAgICAgICAgICAgICAgIHNraXBwZWQgPSBNYXRoLm1pbihza2lwcGVkLCB0b3RhbHN6IC0gYnJlYWQpOyAgICAvLyBvbmx5IHNraXAgd2hhdCB3ZSd2ZSByZWFkLgotICAgICAgICAgICAgICAgIGlmIChza2lwcGVkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExpc3QgbWwgPSBtZW1vcnlidWZsaXN0OyAgICAvLyBob2xkIHRoZSBtZW1vcnkgbGlzdC4KLSAgICAgICAgICAgICAgICBpbnQgYndyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgIGlmIChtbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGN1cnJlbnRCdWYpIHsgICAgLy8gZ2V0IHRoZSBidWZmZXIgd2UgbmVlZCB0byByZWFkIGZyb20uCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmID0gKGJ5dGVbXSltbC5nZXQoY3VycmVudEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZQb3MgPSAwOyAgICAvLyBzdGFydCByZWFkaW5nIGZyb20gdGhlIGJlZ2luaW5nLgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmNvcHkgPSBNYXRoLm1pbihjdXJyZW50QnVmLmxlbmd0aCAtIGN1cnJlbnRCdWZQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCAtIGJ3cml0dGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYndyaXR0ZW4gKz0gYmNvcHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmUG9zICs9IGJjb3B5OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ3cml0dGVuIDwgc2tpcHBlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWYgPSAoYnl0ZVtdKW1sLmdldCgrK2N1cnJlbnRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGJ3cml0dGVuIDwgc2tpcHBlZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZmlsZUlTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVJUy5za2lwKHNraXBwZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFkICs9IHNraXBwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2tpcHBlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChkZWxldGVkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJyZXNvdXJjZURlbGV0ZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlYWRDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInN0cmVhbUNsb3NlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm51bGxJbnB1dCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2ZmIDwgMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJuZWdPZmZzZXQgIiArIG9mZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oImxlbmd0aCAiICsgbGVuKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxlbiArIG9mZiA+IGIubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIndyaXRlQmV5b25kIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgYndyaXR0ZW4gPSAwOwotCi0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFNBQUpEYXRhU291cmNlLnRoaXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnJlYWQgPT0gdG90YWxzeikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExpc3QgbWwgPSBtZW1vcnlidWZsaXN0OwotICAgICAgICAgICAgICAgIGxvbmcgbG9uZ2xlbiA9IGxlbjsKLSAgICAgICAgICAgICAgICBsb25nbGVuID0gTWF0aC5taW4obG9uZ2xlbiwgdG90YWxzeiAtCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhZCk7ICAgIC8vIE9ubHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRhdGEgc3RvcmUgdGhhdCBpcyBsZWZ0LgotICAgICAgICAgICAgICAgIGxlbiA9IG5ldyBMb25nKGxvbmdsZW4pLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1sICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY3VycmVudEJ1ZikgeyAgICAvLyBHZXQgdGhlIGJ1ZmZlciB3ZSBuZWVkIHRvIHJlYWQgZnJvbS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWYgPSAoYnl0ZVtdKW1sLmdldChjdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZlBvcyA9IDA7ICAgIC8vIE5ldyBidWZmZXIgc3RhcnQgZnJvbSB0aGUgYmVnaW5pbmcuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZG8gewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYnl0ZXMgdG8gY29weSwgdGhlIG1pbmltdW0gb2YgdGhlIGJ5dGVzIGxlZnQgaW4gdGhpcyBidWZmZXIgb3IgYnl0ZXMgcmVtYWluaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJjb3B5ID0gTWF0aC5taW4oY3VycmVudEJ1Zi5sZW5ndGggLSBjdXJyZW50QnVmUG9zLCBsZW4gLSBid3JpdHRlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnRCdWYsIGN1cnJlbnRCdWZQb3MsIGIsIG9mZiArIGJ3cml0dGVuLCBiY29weSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBid3JpdHRlbiArPSBiY29weTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZQb3MgKz0gYmNvcHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYndyaXR0ZW4gPCBsZW4pIHsgICAgLy8gR2V0IHRoZSBuZXh0IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmID0gKGJ5dGVbXSltbC5nZXQoKytjdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZQb3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChid3JpdHRlbiA8IGxlbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKChid3JpdHRlbiA9PSAwKSAmJiAobnVsbCAhPSBkaXNrQ2FjaGVGaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBmaWxlSVMpIHsgICAgICAgICAgIC8vIHdlIGFyZSBub3cgcmVhZGluZyBmcm9tIGRpc2suCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlSVMgPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZGlza0NhY2hlRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmVhZCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlSVMuc2tpcChicmVhZCk7ICAgICAvLyBTa2lwIHdoYXQgd2UndmUgcmVhZCBzbyBmYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkaXNrc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZGlza3N0cmVhbS5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ3cml0dGVuID0gZmlsZUlTLnJlYWQoYiwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChid3JpdHRlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWQgKz0gYndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ3cml0dGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNsb3NlIHRoZSBzdHJlYW0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoIXJlYWRDbG9zZWQpIHsKLSAgICAgICAgICAgICAgICByZWFkZXJzLnJlbW92ZSh0aGlzKTsKLSAgICAgICAgICAgICAgICByZWFkQ2xvc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZUlTICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZUlTLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmlsZUlTID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL1NBQUpVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9TQUFKVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RlNzkzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovc3JjL29yZy9hcGFjaGUvYXhpczIvc2Fhai91dGlsL1NBQUpVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5kb20uRE9PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuYnVpbGRlci5TdEFYU09BUE1vZGVsQnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0vKiogVXRpbGl0eSBjbGFzcyBmb3IgdGhlIEF4aXMyLVdTUzRKIE1vZHVsZSAqLwotcHVibGljIGNsYXNzIFNBQUpVdGlsIHsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIERPTSBEb2N1bWVudCB1c2luZyB0aGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZQotICAgICAqCi0gICAgICogQHBhcmFtIGVudiBBbiBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGluc3RhbmNlCi0gICAgICogQHJldHVybiB0aGUgRE9NIERvY3VtZW50IG9mIHRoZSBnaXZlbiBTT0FQIEVudmVsb3BlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudEZyb21TT0FQRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnYpIHsKLSAgICAgICAgZW52LmJ1aWxkKCk7Ci0KLSAgICAgICAgLy9DaGVjayB0aGUgbmFtZXNwYWNlIGFuZCBmaW5kIFNPQVAgdmVyc2lvbiBhbmQgZmFjdG9yeQotICAgICAgICBTdHJpbmcgbnNVUkk7Ci0gICAgICAgIFNPQVBGYWN0b3J5IGZhY3Rvcnk7Ci0gICAgICAgIGlmIChlbnYuZ2V0TmFtZXNwYWNlKCkuZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICAgICAgICAuZXF1YWxzKFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkkpKSB7Ci0gICAgICAgICAgICBuc1VSSSA9IFNPQVAxMUNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuc1VSSSA9IFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkk7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gRE9PTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBzdEFYU09BUE1vZGVsQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGVudi5nZXRYTUxTdHJlYW1SZWFkZXIoKSwgZmFjdG9yeSwgbnNVUkkpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSAoc3RBWFNPQVBNb2RlbEJ1aWxkZXIpLmdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5idWlsZCgpOwotCi0gICAgICAgIEVsZW1lbnQgZW52RWxlbSA9IChFbGVtZW50KWVudmVsb3BlOwotICAgICAgICByZXR1cm4gZW52RWxlbS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgRE9NIERvY3VtZW50IHVzaW5nIHRoZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW52IEFuIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgaW5zdGFuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCBvZiB0aGUgZ2l2ZW4gU09BUCBFbnZlbG9wZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5heGlvbS5zb2FwLmltcGwuZG9tLlNPQVBFbnZlbG9wZUltcGwKLSAgICAgICAgICAgIHRvRE9PTVNPQVBFbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudikgewotICAgICAgICBlbnYuYnVpbGQoKTsKLQotICAgICAgICAvL0NoZWNrIHRoZSBuYW1lc3BhY2UgYW5kIGZpbmQgU09BUCB2ZXJzaW9uIGFuZCBmYWN0b3J5Ci0gICAgICAgIFN0cmluZyBuc1VSSTsKLSAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeTsKLSAgICAgICAgaWYgKGVudi5nZXROYW1lc3BhY2UoKS5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSSkpIHsKLSAgICAgICAgICAgIG5zVVJJID0gU09BUDExQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5zVVJJID0gU09BUDEyQ29uc3RhbnRzLlNPQVBfRU5WRUxPUEVfTkFNRVNQQUNFX1VSSTsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBET09NQWJzdHJhY3RGYWN0b3J5LmdldFNPQVAxMUZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0QVhTT0FQTW9kZWxCdWlsZGVyIHN0QVhTT0FQTW9kZWxCdWlsZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU3RBWFNPQVBNb2RlbEJ1aWxkZXIoZW52LmdldFhNTFN0cmVhbVJlYWRlcigpLCBmYWN0b3J5LCBuc1VSSSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChzdEFYU09BUE1vZGVsQnVpbGRlcikuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmJ1aWxkKCk7Ci0KLSAgICAgICAgcmV0dXJuIChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbCllbnZlbG9wZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUKLSAgICAgICAgICAgIGdldFNPQVBFbnZlbG9wZUZyb21ET09NRG9jdW1lbnQob3JnLnczYy5kb20uRG9jdW1lbnQgZG9jKSB7Ci0KLSAgICAgICAgT01FbGVtZW50IGRvY0VsZW0gPSAoT01FbGVtZW50KWRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgU3RBWFNPQVBNb2RlbEJ1aWxkZXIgc3RBWFNPQVBNb2RlbEJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBTdEFYU09BUE1vZGVsQnVpbGRlcihkb2NFbGVtLmdldFhNTFN0cmVhbVJlYWRlcigpLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIHN0QVhTT0FQTW9kZWxCdWlsZGVyLmdldFNPQVBFbnZlbG9wZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlCi0gICAgICAgICAgICB0b09NU09BUEVudmVsb3BlKG9yZy53M2MuZG9tLkVsZW1lbnQgZWxlbSkgewotCi0gICAgICAgIE9NRWxlbWVudCBkb2NFbGVtID0gKE9NRWxlbWVudCllbGVtOwotICAgICAgICBTdEFYU09BUE1vZGVsQnVpbGRlciBzdEFYU09BUE1vZGVsQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0QVhTT0FQTW9kZWxCdWlsZGVyKGRvY0VsZW0uZ2V0WE1MU3RyZWFtUmVhZGVyKCksIG51bGwpOwotICAgICAgICByZXR1cm4gc3RBWFNPQVBNb2RlbEJ1aWxkZXIuZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBhIGdpdmVuIE9NRWxlbWVudCB0byBhIERPTSBFbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEByZXR1cm4gRE9NIEVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLkVsZW1lbnQgdG9ET00oT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZShiYW9zKTsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgcmV0dXJuIGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoYmFpcykuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai9zcmMvb3JnL2FwYWNoZS9heGlzMi9zYWFqL3V0aWwvVW5kZXJzdGFuZEFsbEhlYWRlcnNIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9VbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMjBhZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NhYWovdXRpbC9VbmRlcnN0YW5kQWxsSGVhZGVyc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQSGVhZGVyQmxvY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIE1hcmtzIGFsbCBTT0FQIGhlYWRlcnMgYXMgcHJvY2Vzc2VkLgotICovCi1wdWJsaWMgY2xhc3MgVW5kZXJzdGFuZEFsbEhlYWRlcnNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAobXNnQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgICAgICB9IAotICAgICAgICAgICAgICAgIAotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2dDb250ZXh0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGlmIChlbnZlbG9wZS5nZXRIZWFkZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gUGFzc2luZyBpbiBudWxsIHdpbGwgZ2V0IGhlYWRlcnMgdGFyZ2V0ZWQgZm9yIE5FWFQgYW5kIFVMVElNQVRFIFJFQ0VJVkVSCi0gICAgICAgIEl0ZXJhdG9yIGhlYWRlckJsb2NrcyA9IGVudmVsb3BlLmdldEhlYWRlcigpLmdldEhlYWRlcnNUb1Byb2Nlc3MobnVsbCk7Ci0gICAgICAgIHdoaWxlIChoZWFkZXJCbG9ja3MuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyQmxvY2sgaGVhZGVyQmxvY2sgPSAoU09BUEhlYWRlckJsb2NrKSBoZWFkZXJCbG9ja3MubmV4dCgpOwotICAgICAgICAgICAgaGVhZGVyQmxvY2suc2V0UHJvY2Vzc2VkKCk7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsgICAgICAgIAotICAgIH0KLSAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC5naWYgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDAzMjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9hdHRhY2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9hdHRhY2gudHh0IGIvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9hdHRhY2gudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQ0YTlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXR0YWNoLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgaXMgYSB0ZXN0IGZpbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC54bWwgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F0dGFjaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWZkZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9hdHRhY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgUHJvdmlkZXJDb25maWcKLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKQVhNIFByb3ZpZGVyLy9FTiIKLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvZHRkcy9qYXhtX3Byb3ZpZGVyXzFfMC5kdGQiPgotCi08UHJvdmlkZXJDb25maWc+Ci0gIDxQcm9maWxlIHByb2ZpbGVJZD0iZWJ4bWwiPgotICAgIDxUcmFuc3BvcnQ+Ci0gICAgICA8UHJvdG9jb2w+Ci0gICAgICAgICAgaHR0cAotICAgICAgPC9Qcm90b2NvbD4KLQotICAgICAgPEVuZHBvaW50PgotCSAgPFVSST4KLQkgICAgIGh0dHA6Ly93d3cud29tYmF0cy5jb20vcmVtb3RlL3NlbmRlcgotCSAgPC9VUkk+Ci0JICA8VVJMPgotCSAgICAgaHR0cDovLzEyNy4wLjAuMTo4MDgxL2pheG0tcHJvdmlkZXIvcmVjZWl2ZXIvZWJ4bWwKLQkgIDwvVVJMPgotICAgICAgPC9FbmRwb2ludD4KLQotICAgICA8RXJyb3JIYW5kbGluZz4KLSAgICAgICAgPFJldHJ5PgotICAgICAgICAgICA8TWF4UmV0cmllcz4KLQkJNQotICAgICAgIAkgICA8L01heFJldHJpZXM+Ci0gIAkgICA8UmV0cnlJbnRlcnZhbD4KLQkJMjAwMAotCSAgIDwvUmV0cnlJbnRlcnZhbD4KLSAgICAgICAgPC9SZXRyeT4KLSAgICA8L0Vycm9ySGFuZGxpbmc+Ci0KLSAgICA8UGVyc2lzdGVuY2U+Ci0gICAgICA8RGlyZWN0b3J5PgotICAgICAgICAgZWJ4bWwvCi0gICAgICA8L0RpcmVjdG9yeT4KLSAgICAgIDxSZWNvcmRzUGVyRmlsZT4KLSAgICAgICAgICAgMTAKLSAgICAgIDwvUmVjb3Jkc1BlckZpbGU+Ci0gICAgPC9QZXJzaXN0ZW5jZT4KLSAgICA8L1RyYW5zcG9ydD4KLQotICAgIDxUcmFuc3BvcnQ+Ci0gICAgICA8UHJvdG9jb2w+Ci0gICAgICAgICAgaHR0cHMKLSAgICAgIDwvUHJvdG9jb2w+Ci0KLSAgICAgIDxFbmRwb2ludD4KLQkgIDxVUkk+Ci0JICAgICBqYXhtLmR1bW15LnVyaQotCSAgPC9VUkk+Ci0JICA8VVJMPgotCSAgICAgaHR0cHM6Ly8xMjcuMC4wLjE6ODQ0My9qYXhtL2R1bW15LwotCSAgPC9VUkw+Ci0gICAgICA8L0VuZHBvaW50PgotCi0gICAgPFBlcnNpc3RlbmNlPgotICAgICAgPERpcmVjdG9yeT4KLSAgICAgICAgIGVieG1sLWh0dHBzLwotICAgICAgPC9EaXJlY3Rvcnk+Ci0gICAgICA8UmVjb3Jkc1BlckZpbGU+Ci0gICAgICAgICAgIDEwCi0gICAgICA8L1JlY29yZHNQZXJGaWxlPgotICAgIDwvUGVyc2lzdGVuY2U+Ci0KLSAgICA8L1RyYW5zcG9ydD4KLSAgPC9Qcm9maWxlPgotCi0gIDxQcm9maWxlIHByb2ZpbGVJZD0ic29hcHJwIj4KLSAgICA8VHJhbnNwb3J0PgotICAgICAgPFByb3RvY29sPgotICAgICAgICAgIGh0dHAKLSAgICAgIDwvUHJvdG9jb2w+Ci0KLSAgICAgIDxFbmRwb2ludD4KLQkgIDxVUkk+Ci0JICAgICBodHRwOi8vd3d3LndvbWJhdHMuY29tL3NvYXBycC9zZW5kZXIKLQkgIDwvVVJJPgotCSAgPFVSTD4KLQkgICAgIGh0dHA6Ly8xMjcuMC4wLjE6ODA4MS9qYXhtLXByb3ZpZGVyL3JlY2VpdmVyL3NvYXBycAotCSAgPC9VUkw+Ci0gICAgICA8L0VuZHBvaW50PgotCi0gICAgIDxFcnJvckhhbmRsaW5nPgotICAgICAgICA8UmV0cnk+Ci0gICAgICAgICAgIDxNYXhSZXRyaWVzPgotCQkzCi0gICAgICAgCSAgIDwvTWF4UmV0cmllcz4KLSAgCSAgIDxSZXRyeUludGVydmFsPgotCQkyMDAwCi0JICAgPC9SZXRyeUludGVydmFsPgotICAgICAgICA8L1JldHJ5PgotICAgIDwvRXJyb3JIYW5kbGluZz4KLQotICAgICAgPFBlcnNpc3RlbmNlPgotICAgICAgICA8RGlyZWN0b3J5PgotICAgICAgICAgICBzb2FwcnAvCi0gICAgICAgIDwvRGlyZWN0b3J5PgotICAgICAgICA8UmVjb3Jkc1BlckZpbGU+Ci0gICAgICAgICAgICAyMAotICAgICAgICA8L1JlY29yZHNQZXJGaWxlPgotICAgICAgPC9QZXJzaXN0ZW5jZT4KLSAgICA8L1RyYW5zcG9ydD4KLQotICAgIDxUcmFuc3BvcnQ+Ci0gICAgICA8UHJvdG9jb2w+Ci0gICAgICAgICAgaHR0cHMKLSAgICAgIDwvUHJvdG9jb2w+Ci0KLSAgICA8RW5kcG9pbnQ+Ci0JICA8VVJJPgotCSAgICAgamF4bS5kdW1teS51cmkKLQkgIDwvVVJJPgotCSAgPFVSTD4KLQkgICAgIGh0dHBzOi8vMTI3LjAuMC4xOjg0NDMvamF4bS9kdW1teQotCSAgPC9VUkw+Ci0gICAgICA8L0VuZHBvaW50PgotICAgIDwvVHJhbnNwb3J0PgotICA8L1Byb2ZpbGU+Ci0KLSAgICAgPEVycm9ySGFuZGxpbmc+Ci0gICAgICAgIDxSZXRyeT4KLSAgICAgICAgICAgPE1heFJldHJpZXM+Ci0JCTMKLSAgICAgICAJICAgPC9NYXhSZXRyaWVzPgotICAJICAgPFJldHJ5SW50ZXJ2YWw+Ci0JCTIwMDAKLQkgICA8L1JldHJ5SW50ZXJ2YWw+Ci0gICAgICAgIDwvUmV0cnk+Ci0gICAgPC9FcnJvckhhbmRsaW5nPgotCi0gICAgPFBlcnNpc3RlbmNlPgotICAgICAgPERpcmVjdG9yeT4KLSAgICAgICAgIHRlbXBkaXIvCi0gICAgICA8L0RpcmVjdG9yeT4KLSAgICAgIDxSZWNvcmRzUGVyRmlsZT4KLSAgICAgICAgICAgMTEKLSAgICAgIDwvUmVjb3Jkc1BlckZpbGU+Ci0gICAgPC9QZXJzaXN0ZW5jZT4KLTwvUHJvdmlkZXJDb25maWc+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLmpwZyBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXhpczIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzdlZjhjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvYXhpczIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmYWFiMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBlbmFibGUgUkVTVCBzdXBwb3J0IC0tPgotICAgIDwhLS0gICAgPHBhcmFtZXRlciBuYW1lPSJlYW5ibGVSRVNUIj50cnVlPC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotCi0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBUaGlzIGlzIHRoZSBEZWFmdWx0IE1lc3NhZ2UgUmVjZWl2ZXIgZm9yIHRoZSBSZXF1ZXN0IFJlc3BvbnNlIHN0eWxlIE9wZXJhdGlvbnMgLS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9IklOT1VUIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBJbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyIj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij42MDYwPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmxvY2FsLkxvY2FsVHJhbnNwb3J0U2VuZGVyIi8+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gZW5hYmxlIEFkZHJlc3NpbmcKLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPiAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmUgZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnRJbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmxvdyI+Ci0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9InVzZXJwaGFzZTEiLz4KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+Ci0gICAgICAgIDwhLS10aGVzZSBwaGFzZSB3aWxsIHJ1biBpcnJlc3BlY3RpdmUgb2YgdGhlIHNlcnZpY2UtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik1lc3NhZ2VPdXQiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiLz4KLQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGYXVsdEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJ1c2VycGhhc2UxIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZGQwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotDQotIyBUaGlzIGlzIHRoZSBsb2dnaW5nIHByb3BlcnRpZXMgdGhhdCBnb2VzIHRvIHRoZSB3YXIsIHRoZXJlIGFyZSB0d28gbG9nZ2luZyBjb25mIGtlcHQgYXQgdGhlIA0KLSMgc3ZuLCBvbmUgZm9yIGRldmVsb3BlbWVudCAob25lIGF0IHNyYy90ZXN0LXJlc291cmNlcykgYW5kIG90aGVyIGZvciBwcm9kdWNhdGlvbg0KLSANCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGRpc2FibGUgYWxsIGxvZ2dpbmcuDQotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLk5vT3BMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSB0aGUgc2ltcGxlIGxvZyBiYXNlZCBsb2dnaW5nDQotI29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLlNpbXBsZUxvZw0KLQ0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIGxvZzRqIGJhc2VkIGxvZ2dpbmcNCi1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3ZjA0Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0jIFNldCByb290IGNhdGVnb3J5IHByaW9yaXR5IHRvIElORk8gYW5kIGl0cyBvbmx5IGFwcGVuZGVyIHRvIENPTlNPTEUuDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1ERUJVRywgQ09OU09MRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9REVCVUcsIExPR0ZJTEUNCi1sb2c0ai5yb290Q2F0ZWdvcnk9RVJST1IsIENPTlNPTEUNCi0NCi0NCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMDQotbG9nNGoubG9nZ2VyLmRlLmh1bnNpY2tlci5qYWxvcHkuaW89RkFUQUwNCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTA0KLQ0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbg0KLQ0KLSMgTE9HRklMRSBpcyBzZXQgdG8gYmUgYSBGaWxlIGFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZw0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuQXBwZW5kPXRydWUNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9tZXNzYWdlLmJpbiBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvbWVzc2FnZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2VkOWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9tZXNzYWdlLmJpbgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS0tTUlNRUJvdW5kYXJ5dXJuOnV1aWQ6RjAyRUNDMTg4NzNDRkI3M0UyMTE0MTI3NDg5MDkzMDcKLWNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veG9wK3htbDsgY2hhcnNldD1VVEYtODsgdHlwZT0idGV4dC94bWwiOwotY29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmluYXJ5Ci1jb250ZW50LWlkOiA8MC51cm46dXVpZDpGMDJFQ0MxODg3M0NGQjczRTIxMTQxMjc0ODkwOTMwOEBhcGFjaGUub3JnPgotCi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIj48c29hcGVudjpIZWFkZXI+PG5zLXByZWZpeDpIZWFkZXIxIHhtbG5zOm5zLXByZWZpeD0ibnMtdXJpIiB4bWxuczptdXN0VW5kZXJzdGFuZD0iMSIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMSI+VGhpcyBpcyBIZWFkZXIxPC9ucy1wcmVmaXg6SGVhZGVyMT48bnMtcHJlZml4OkhlYWRlcjIgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHhtbG5zOm11c3RVbmRlcnN0YW5kPSIwIiBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIwIj5UaGlzIGlzIEhlYWRlcjI8L25zLXByZWZpeDpIZWFkZXIyPjxucy1wcmVmaXg6SGVhZGVyMyB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSIgeG1sbnM6bXVzdFVuZGVyc3RhbmQ9IjEiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPlRoaXMgaXMgSGVhZGVyMzwvbnMtcHJlZml4OkhlYWRlcjM+PG5zLXByZWZpeDpIZWFkZXI0IHhtbG5zOm5zLXByZWZpeD0ibnMtdXJpIiB4bWxuczptdXN0VW5kZXJzdGFuZD0iMCIgc29hcGVudjptdXN0VW5kZXJzdGFuZD0iMCI+VGhpcyBpcyBIZWFkZXI0PC9ucy1wcmVmaXg6SGVhZGVyND48L3NvYXBlbnY6SGVhZGVyPjxzb2FwZW52OkJvZHk+PG5zLXByZWZpeDpCb2R5MSB4bWxuczpucy1wcmVmaXg9Im5zLXVyaSI+PG5zLXByZWZpeDpDaGlsZDE+VGhpcyBpcyBDaGlsZDE8L25zLXByZWZpeDpDaGlsZDE+PG5zLXByZWZpeDpDaGlsZDI+VGhpcyBpcyBDaGlsZDI8L25zLXByZWZpeDpDaGlsZDI+PC9ucy1wcmVmaXg6Qm9keTE+PHN3YTplY2hvIHhtbG5zOnN3YT0iaHR0cDovL2Zha2VOYW1lc3BhY2Uub3JnIj48aW50ZXJuYWwgeG1sbnM9IiI+PHRleHQgeG1sbnM9IiI+PHhvcDpJbmNsdWRlIGhyZWY9ImNpZDoxLnVybjp1dWlkOkYwMkVDQzE4ODczQ0ZCNzNFMjExNDEyNzQ4OTA5MzQ5QGFwYWNoZS5vcmciIHhtbG5zOnhvcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC94b3AvaW5jbHVkZSIgLz48L3RleHQ+PC9pbnRlcm5hbD48L3N3YTplY2hvPjwvc29hcGVudjpCb2R5Pjwvc29hcGVudjpFbnZlbG9wZT4KLS0tTUlNRUJvdW5kYXJ5dXJuOnV1aWQ6RjAyRUNDMTg4NzNDRkI3M0UyMTE0MTI3NDg5MDkzMDcKLWNvbnRlbnQtdHlwZTogdGV4dC94bWwKLWNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6IGJpbmFyeQotY29udGVudC1pZDogPDEudXJuOnV1aWQ6RjAyRUNDMTg4NzNDRkI3M0UyMTE0MTI3NDg5MDkzNDlAYXBhY2hlLm9yZz4KLQotVEFUQQotCi0tLU1JTUVCb3VuZGFyeXVybjp1dWlkOkYwMkVDQzE4ODczQ0ZCNzNFMjExNDEyNzQ4OTA5MzA3LS0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1ib2R5LnhtbCBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1ib2R5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2MjJkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtYm9keS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzaHc6QWRkcmVzcyBzaHc6dD0ndGVzdCcgeG1sbnM6c2h3PSJodHRwOi8vd3d3Lmpjb21tZXJjZS5uZXQvc29hcC9ucy9TT0FQSGVsbG9Xb3JsZCI+Ci0gICAgPHNodzpOdW1iZXI+MTI8L3NodzpOdW1iZXI+Ci0gICAgPHNodzpDaXR5PgotICAgICAgICA8c2h3Ono+RGVoaXdlbGE8L3Nodzp6PgotICAgIDwvc2h3OkNpdHk+Ci0gICAgPHNodzpDb3VudHJ5PgotICAgICAgICA8c2h3Onk+U3JpIExhbmthPC9zaHc6eT4KLSAgICA8L3NodzpDb3VudHJ5PgotPC9zaHc6QWRkcmVzcz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1wYXJ0LWlzby04ODU5LTEueG1sIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLXBhcnQtaXNvLTg4NTktMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYWQ4ZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLXBhcnQtaXNvLTg4NTktMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0JPHNvYXBlbnY6SGVhZGVyPgotCQk8cHJlZjpIZWFkZXIxIHhtbG5zOnByZWY9Imh0dHA6Ly90ZXN0LmFwYWNoLm9yZy90ZXN0Ij5UaGlzIGlzIGhlYWRlcjE8L3ByZWY6SGVhZGVyMT4KLQk8L3NvYXBlbnY6SGVhZGVyPgotCTxzb2FwZW52OkJvZHk+Ci0JCTxzd2EyOmVjaG8geG1sbnM6c3dhMj0iaHR0cDovL2Zha2VOYW1lc3BhY2UyLm9yZyI+Ci0JCQk8c29tZXRoaW5nPlRoaXMgaXMgc29tZSB0ZXh0LkhlcmUgYXJlIHNvbWUgc3BlY2lhbCBjaGFycyA6IPbG2q6kPC9zb21ldGhpbmc+Ci0JCTwvc3dhMjplY2hvPgotCTwvc29hcGVudjpCb2R5PgotPC9zb2FwZW52OkVudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1wYXJ0LnhtbCBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC1yZXNvdXJjZXMvc29hcC1wYXJ0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2YzY0Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtcGFydC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgPHNodzpIZWxsbyB4bWxuczpzaHc9Imh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkIj4KLSAgICAgICAgICAgIDxzaHc6TXluYW1lPlRvbnk8L3NodzpNeW5hbWU+Ci0gICAgICAgIDwvc2h3OkhlbGxvPgotICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgPHNvYXBlbnY6Qm9keT4KLSAgICAgICAgPHNodzpBZGRyZXNzIHNodzp0PSd0ZXN0JyB4bWxuczpzaHc9Imh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkIj4KLSAgICAgICAgICAgIDxzaHc6Q2l0eT5HRU5UPC9zaHc6Q2l0eT4KLSAgICAgICAgPC9zaHc6QWRkcmVzcz4KLSAgICA8L3NvYXBlbnY6Qm9keT4KLTwvc29hcGVudjpFbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtcGFydDMueG1sIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0LXJlc291cmNlcy9zb2FwLXBhcnQzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmExOTc4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3QtcmVzb3VyY2VzL3NvYXAtcGFydDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI+Ci08c29hcGVudjpIZWFkZXI+Ci08bnMtcHJlZml4OkhlYWRlcjEgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPlRoaXMgaXMgSGVhZGVyMTwvbnMtcHJlZml4OkhlYWRlcjE+Ci08bnMtcHJlZml4OkhlYWRlcjIgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPlRoaXMgaXMgSGVhZGVyMjwvbnMtcHJlZml4OkhlYWRlcjI+Ci08bnMtcHJlZml4OkhlYWRlcjMgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjEiPlRoaXMgaXMgSGVhZGVyMzwvbnMtcHJlZml4OkhlYWRlcjM+Ci08bnMtcHJlZml4OkhlYWRlcjQgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiIHNvYXBlbnY6bXVzdFVuZGVyc3RhbmQ9IjAiPlRoaXMgaXMgSGVhZGVyNDwvbnMtcHJlZml4OkhlYWRlcjQ+Ci08L3NvYXBlbnY6SGVhZGVyPgotPHNvYXBlbnY6Qm9keT4KLTxucy1wcmVmaXg6Qm9keTEgeG1sbnM6bnMtcHJlZml4PSJucy11cmkiPgotPG5zLXByZWZpeDpDaGlsZDE+VGhpcyBpcyBDaGlsZDE8L25zLXByZWZpeDpDaGlsZDE+Ci08bnMtcHJlZml4OkNoaWxkMj5UaGlzIGlzIENoaWxkMjwvbnMtcHJlZml4OkNoaWxkMj4KLTwvbnMtcHJlZml4OkJvZHkxPgotPC9zb2FwZW52OkJvZHk+Ci08L3NvYXBlbnY6RW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9BdHRhY2htZW50U2VyaWFsaXphdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovQXR0YWNobWVudFNlcmlhbGl6YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmNmY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9BdHRhY2htZW50U2VyaWFsaXphdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5GaWxlRGF0YVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFNlcmlhbGl6YXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCA9ICJtdWx0aXBhcnQvcmVsYXRlZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9BUFBMSUNBVElPTl9ESU1FID0gImFwcGxpY2F0aW9uL2RpbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1BSRUZJWCA9ICJqYXhtdHN0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUkkgPSAiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvamF4bS9UZXN0SmF4bSI7Ci0KLSAgICBwdWJsaWMgQXR0YWNobWVudFNlcmlhbGl6YXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRhY2htZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBzYXZlTXNnV2l0aEF0dGFjaG1lbnRzKGJhaXMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LCAyKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2F2ZU1zZ1dpdGhBdHRhY2htZW50cyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgIFNPQVBFbGVtZW50IGVsID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgiZmllbGQ0IiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBlbDIgPSBlbC5hZGRDaGlsZEVsZW1lbnQoImZpZWxkNGIiLCBOU19QUkVGSVgpOwotICAgICAgICBlbDIuYWRkVGV4dE5vZGUoImZpZWxkNHZhbHVlIik7Ci0KLSAgICAgICAgZWwgPSBib2R5LmFkZEJvZHlFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImJvZHlmaWVsZDMiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotICAgICAgICBlbDIgPSBlbC5hZGRDaGlsZEVsZW1lbnQoImJvZHlmaWVsZDNhIiwgTlNfUFJFRklYKTsKLSAgICAgICAgZWwyLmFkZFRleHROb2RlKCJib2R5dmFsdWUzYSIpOwotICAgICAgICBlbDIgPSBlbC5hZGRDaGlsZEVsZW1lbnQoImJvZHlmaWVsZDNiIiwgTlNfUFJFRklYKTsKLSAgICAgICAgZWwyLmFkZFRleHROb2RlKCJib2R5dmFsdWUzYiIpOwotICAgICAgICBlbC5hZGRDaGlsZEVsZW1lbnQoImRhdGVmaWVsZCIsIE5TX1BSRUZJWCk7Ci0KLSAgICAgICAgLy8gRmlyc3QgQXR0YWNobWVudAotICAgICAgICBBdHRhY2htZW50UGFydCBhcCA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFRleHQgPSAic29tZSBhdHRhY2htZW50IHRleHQuLi4iOwotICAgICAgICBhcC5zZXRDb250ZW50KHRlc3RUZXh0LCAidGV4dC9wbGFpbiIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXApOwotCi0gICAgICAgIC8vIFNlY29uZCBhdHRhY2htZW50Ci0gICAgICAgIFN0cmluZyBqcGdmaWxlbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKyAidGVzdC1yZXNvdXJjZXMvYXhpczIuanBnIjsKLSAgICAgICAgRmlsZSBteWZpbGUgPSBuZXcgRmlsZShqcGdmaWxlbmFtZSk7Ci0gICAgICAgIEZpbGVEYXRhU291cmNlIGZkcyA9IG5ldyBGaWxlRGF0YVNvdXJjZShteWZpbGUpOwotICAgICAgICBEYXRhSGFuZGxlciBkaCA9IG5ldyBEYXRhSGFuZGxlcihmZHMpOwotICAgICAgICBBdHRhY2htZW50UGFydCBhcDIgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoZGgpOwotICAgICAgICBhcDIuc2V0Q29udGVudFR5cGUoImltYWdlL2pwZyIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAyKTsKLQotICAgICAgICBNaW1lSGVhZGVycyBoZWFkZXJzID0gbXNnLmdldE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaGVhZGVycyAhPSBudWxsKTsKLSAgICAgICAgU3RyaW5nIFtdIGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIpOwotICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnRUeXBlICE9IG51bGwpOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbXNnLmdldEF0dGFjaG1lbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudFBhcnQgPSAoQXR0YWNobWVudFBhcnQpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgY29udGVudCA9IGF0dGFjaG1lbnRQYXJ0LmdldERhdGFIYW5kbGVyKCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdFRleHQsIChTdHJpbmcpY29udGVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBGaWxlSW5wdXRTdHJlYW0pIHsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byB3cml0ZSB0byBhIEZpbGUgYW5kIGNoZWNrIHdoZXRoZXIgaXQgaXMgb2sKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlSW5wdXRTdHJlYW0gZmlzID0gKEZpbGVJbnB1dFN0cmVhbSljb250ZW50OwotICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTUwMDBdOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGhSZWFkID0gZmlzLnJlYWQoYik7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvYXR0cy1vcCIgKyAoaSsrKSArICIuanBnIikpOwotICAgICAgICAgICAgICAgIGZvcy53cml0ZShiLCAwLCBsZW5ndGhSZWFkKTsKLSAgICAgICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1zZy53cml0ZVRvKG9zKTsKLSAgICAgICAgb3MuZmx1c2goKTsKLSAgICAgICAgcmV0dXJuIG1zZy5jb3VudEF0dGFjaG1lbnRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBsb2FkTXNnV2l0aEF0dGFjaG1lbnRzKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICBoZWFkZXJzLnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRCk7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gbWYuY3JlYXRlTWVzc2FnZShoZWFkZXJzLCBpcyk7Ci0KLSAgICAgICAgU09BUFBhcnQgc3AgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzcCAhPSBudWxsKTsKLQotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlICE9IG51bGwpOwotICAgICAgICByZXR1cm4gbXNnLmNvdW50QXR0YWNobWVudHMoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0F0dGFjaG1lbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL0F0dGFjaG1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjk5ZDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9BdHRhY2htZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMudXRpbHMuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuQmFzZTY0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LkRlZmF1bHRIdHRwTWV0aG9kUmV0cnlIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuR2V0TWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcy5IdHRwTWV0aG9kUGFyYW1zOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuQXR0YWNobWVudFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgQXR0YWNobWVudFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXR0YWNobWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIEF0dGFjaG1lbnRQYXJ0IGF0dGFjaG1lbnQgPSBtZXNzYWdlLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdDb250ZW50ID0gIlVwZGF0ZSBhZGRyZXNzIGZvciBTdW5ueSBTa2llcyAiICsKLSAgICAgICAgICAgICAgICAiSW5jLiwgdG8gMTAgVXBiZWF0IFN0cmVldCwgUGxlYXNhbnQgR3JvdmUsIENBIDk1NDM5IjsKLQotICAgICAgICBhdHRhY2htZW50LnNldENvbnRlbnQoc3RyaW5nQ29udGVudCwgInRleHQvcGxhaW4iKTsKLSAgICAgICAgYXR0YWNobWVudC5zZXRDb250ZW50SWQoInVwZGF0ZV9hZGRyZXNzIik7Ci0gICAgICAgIG1lc3NhZ2UuYWRkQXR0YWNobWVudFBhcnQoYXR0YWNobWVudCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvdW50QXR0YWNobWVudHMoKSA9PSAxKTsKLQotICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBtZXNzYWdlLmdldEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGF0dGFjaG1lbnQgPSAoQXR0YWNobWVudFBhcnQpaXQubmV4dCgpOwotICAgICAgICAgICAgT2JqZWN0IGNvbnRlbnQgPSBhdHRhY2htZW50LmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBpZCA9IGF0dGFjaG1lbnQuZ2V0Q29udGVudElkKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudCwgc3RyaW5nQ29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZS5yZW1vdmVBbGxBdHRhY2htZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY291bnRBdHRhY2htZW50cygpID09IDApOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXR0YWNobWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIGphdmEubmV0LlVSTCB1cmwxID0gbmV3IGphdmEubmV0LlVSTCgiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiKTsKLSAgICAgICAgamF2YS5uZXQuVVJMIHVybDIgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0Iik7Ci0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYTEgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIodXJsMSkpOwotICAgICAgICBhMS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGExKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgYTIgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIodXJsMSkpOwotICAgICAgICBhMi5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGEyKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgYTMgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIodXJsMikpOwotICAgICAgICBhMy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYTMpOwotCi0gICAgICAgIGFzc2VydFRydWUobXNnLmNvdW50QXR0YWNobWVudHMoKSA9PSAzKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyBtaW1lSGVhZGVycyA9IG5ldyBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycygpOwotICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpOwotCi0gICAgICAgIGludCBuQXR0YWNobWVudHMgPSAwOwotICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IgPSBtc2cuZ2V0QXR0YWNobWVudHMobWltZUhlYWRlcnMpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBuQXR0YWNobWVudHMrKzsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXAuZXF1YWxzKGExKSB8fCBhcC5lcXVhbHMoYTIpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKG5BdHRhY2htZW50cyA9PSAyKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUF0dGFjaG1lbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIGphdmEubmV0LlVSTCB1cmwxID0gbmV3IGphdmEubmV0LlVSTCgiaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiKTsKLSAgICAgICAgamF2YS5uZXQuVVJMIHVybDIgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0Iik7Ci0KLSAgICAgICAgQXR0YWNobWVudFBhcnQgYTEgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIodXJsMSkpOwotICAgICAgICBhMS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGExKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgYTIgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIodXJsMSkpOwotICAgICAgICBhMi5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGEyKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgYTMgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIodXJsMikpOwotICAgICAgICBhMy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYTMpOwotCi0gICAgICAgIGFzc2VydFRydWUobXNnLmNvdW50QXR0YWNobWVudHMoKSA9PSAzKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycyBtaW1lSGVhZGVycyA9IG5ldyBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVycygpOwotICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpOwotCi0gICAgICAgIGludCBuQXR0YWNobWVudHMgPSAwOwotICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IgaXRlcmF0b3IgPSBtc2cuZ2V0QXR0YWNobWVudHMobWltZUhlYWRlcnMpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBuQXR0YWNobWVudHMrKzsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYXAuZXF1YWxzKGExKSB8fCBhcC5lcXVhbHMoYTIpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKG5BdHRhY2htZW50cyA9PSAyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkQXR0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlucyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVs1XSk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gbmV3IERhdGFIYW5kbGVyKG5ldyBTcmMoaW5zLCAidGV4dC9wbGFpbiIpKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgcGFydCA9IG1lc3NhZ2UuY3JlYXRlQXR0YWNobWVudFBhcnQoZGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlNpemUgc2hvdWxkIG1hdGNoIiwgNSwgcGFydC5nZXRTaXplKCkpOwotICAgIH0KLQotICAgIGNsYXNzIFNyYyBpbXBsZW1lbnRzIERhdGFTb3VyY2UgewotICAgICAgICBJbnB1dFN0cmVhbSBtX3NyYzsKLSAgICAgICAgU3RyaW5nIG1fdHlwZTsKLQotICAgICAgICBwdWJsaWMgU3JjKElucHV0U3RyZWFtIGRhdGEsIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgICAgICBtX3NyYyA9IGRhdGE7Ci0gICAgICAgICAgICBtX3R5cGUgPSB0eXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtX3R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbV9zcmMucmVzZXQoKTsKLSAgICAgICAgICAgIHJldHVybiBtX3NyYzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAiU29tZS1EYXRhIjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJJIGRvbid0IGdpdmUgb3V0cHV0IHN0cmVhbXMiKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsZWFyQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4xID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJhdHRhY2gueG1sIikpOwotCi0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbWVzc2FnZS5jcmVhdGVBdHRhY2htZW50UGFydCgpOwotICAgICAgICAgICAgTWltZUhlYWRlciBtaCA9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vU2V0dGluZyBNaW1lIEhlYWRlcgotICAgICAgICAgICAgYXAuc2V0TWltZUhlYWRlcigiQ29udGVudC1EZXNjcmlwdGlvbiIsICJzb21lIHRleHQiKTsKLQotICAgICAgICAgICAgLy9TZXR0aW5nIENvbnRlbnQgSWQgSGVhZGVyCi0gICAgICAgICAgICBhcC5zZXRDb250ZW50SWQoImlkQGFiYy5jb20iKTsKLQotICAgICAgICAgICAgLy9TZXR0aW5nIENvbnRlbnQKLSAgICAgICAgICAgIGFwLnNldENvbnRlbnQobmV3IFN0cmVhbVNvdXJjZShpbjEpLCAidGV4dC94bWwiKTsKLQotICAgICAgICAgICAgLy9DbGVhcmluZyBDb250ZW50Ci0gICAgICAgICAgICBhcC5jbGVhckNvbnRlbnQoKTsKLQotICAgICAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgICAgIC8vR2V0dGluZyBDb250ZW50Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSAoSW5wdXRTdHJlYW0pYXAuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yOiBTT0FQRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL0Vycm9yIHRocm93bi4oZXhwZWN0ZWQpCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXAuZ2V0QWxsTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIGludCBjbnQgPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEhlYWRlcjEgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRIZWFkZXIyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kRGVmYXVsdEhlYWRlciA9IGZhbHNlOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIG1oID0gKE1pbWVIZWFkZXIpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWguZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1oLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJDb250ZW50LURlc2NyaXB0aW9uIikgJiYgdmFsdWUuZXF1YWxzKCJzb21lIHRleHQiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSGVhZGVyMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRIZWFkZXIxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vTWltZUhlYWRlcnMgZG8gbWF0Y2ggZm9yIGhlYWRlcjEKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yOiBSZWNlaXZlZCB0aGUgc2FtZSBoZWFkZXIxIGhlYWRlciB0d2ljZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtSWQiKSAmJiB2YWx1ZS5lcXVhbHMoImlkQGFiYy5jb20iKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSGVhZGVyMikgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRIZWFkZXIyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vTWltZUhlYWRlcnMgZG8gbWF0Y2ggZm9yIGhlYWRlcjIKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yOiBSZWNlaXZlZCB0aGUgc2FtZSBoZWFkZXIyIGhlYWRlciB0d2ljZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiQ29udGVudC1UeXBlIikgJiYgdmFsdWUuZXF1YWxzKCJ0ZXh0L3htbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmREZWZhdWx0SGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZERlZmF1bHRIZWFkZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9NaW1lSGVhZGVycyBkbyBtYXRjaCBmb3IgZGVmYXVsdCBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yOiBSZWNlaXZlZCB0aGUgc2FtZSBkZWZhdWx0IGhlYWRlciBoZWFkZXIgdHdpY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkVycm9yOiBSZWNlaXZlZCBhbiBpbnZhbGlkIGhlYWRlciIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCEoZm91bmRIZWFkZXIxICYmIGZvdW5kSGVhZGVyMikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJFcnJvcjogZGlkIG5vdCByZWNlaXZlIGJvdGggaGVhZGVycyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0gICAgICAgICAgICBJbWFnZSBpbWFnZSA9IGphdmF4LmltYWdlaW8uSW1hZ2VJTy5yZWFkKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImF0dGFjaC5naWYiKSk7Ci0gICAgICAgICAgICBhcCA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChpbWFnZSwgImltYWdlL2dpZiIpOwotCi0gICAgICAgICAgICAvL0dldHRpbmcgQ29udGVudCBzaG91bGQgcmV0dXJuIGFuIEltYWdlIG9iamVjdAotICAgICAgICAgICAgT2JqZWN0IG8gPSBhcC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJbWFnZSkgewotICAgICAgICAgICAgICAgICAgICAvL0ltYWdlIG9iamVjdCB3YXMgcmV0dXJuZWQgKG9rKQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgb2JqZWN0IHdhcyByZXR1cm5lZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFJhd0NvbnRlbnRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0gICAgICAgICAgICBhcCA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydCgpOwotICAgICAgICAgICAgYnl0ZSBkYXRhMVtdID0gbnVsbDsKLSAgICAgICAgICAgIGRhdGExID0gYXAuZ2V0UmF3Q29udGVudEJ5dGVzKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCYXNlNjRDb250ZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSAiaHR0cDovL3dzLmFwYWNoZS5vcmcvaW1hZ2VzL3Byb2plY3QtbG9nby5qcGciOwotICAgICAgICAgICAgaWYgKGlzTmV0d29ya2VkUmVzb3VyY2VBdmFpbGFibGUodXJsU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBuZXcgRGF0YUhhbmRsZXIodXJsKTsKLSAgICAgICAgICAgICAgICAvL0NyZWF0ZSBJbnB1dFN0cmVhbSBmcm9tIERhdGFIYW5kbGVyJ3MgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGRoLmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgICAgICBieXRlIGJ1ZltdID0gSU9VdGlscy5nZXRTdHJlYW1Bc0J5dGVBcnJheShpcyk7Ci0gICAgICAgICAgICAgICAgLy9TZXR0aW5nIENvbnRlbnQgdmlhIElucHV0U3RyZWFtIGZvciBpbWFnZS9qcGVnIG1pbWUgdHlwZQotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQmFzZTY0LmVuY29kZShidWYsIDAsIGJ1Zi5sZW5ndGgsIGJvcyk7Ci0gICAgICAgICAgICAgICAgYnVmID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1Zik7Ci0gICAgICAgICAgICAgICAgYXAuc2V0QmFzZTY0Q29udGVudChzdHJlYW0sICJpbWFnZS9qcGVnIik7Ci0KLSAgICAgICAgICAgICAgICAvL0dldHRpbmcgQ29udGVudC4uIHNob3VsZCByZXR1cm4gSW5wdXRTdHJlYW0gb2JqZWN0Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gciA9IGFwLmdldEJhc2U2NENvbnRlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyIGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vSW5wdXRTdHJlYW0gb2JqZWN0IHdhcyByZXR1cm5lZCAob2spCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIG9iamVjdCB3YXMgcmV0dXJuZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTmV0d29ya2VkUmVzb3VyY2VBdmFpbGFibGUoU3RyaW5nIHVybCkgewotICAgICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7Ci0gICAgICAgIEdldE1ldGhvZCBtZXRob2QgPSBuZXcgR2V0TWV0aG9kKHVybCk7Ci0gICAgICAgIGNsaWVudC5nZXRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoKS5nZXRQYXJhbXMoKS5zZXRDb25uZWN0aW9uVGltZW91dCgxMDAwKTsKLSAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKEh0dHBNZXRob2RQYXJhbXMuUkVUUllfSEFORExFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEh0dHBNZXRob2RSZXRyeUhhbmRsZXIoMSwgZmFsc2UpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSBjbGllbnQuZXhlY3V0ZU1ldGhvZChtZXRob2QpOwotICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5TQ19PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vYnl0ZVtdIHJlc3BvbnNlQm9keSA9IG1ldGhvZC5nZXRSZXNwb25zZUJvZHkoKTsKLSAgICAgICAgfSBjYXRjaCAoSHR0cEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbWV0aG9kLnJlbGVhc2VDb25uZWN0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWVzc2FnZUZhY3RvcnlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL01lc3NhZ2VGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRkNDIwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovTWVzc2FnZUZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUZhY3RvcnlUZXN0IGV4dGVuZHMgWE1MVGVzdENhc2UgewotICAgIHByaXZhdGUgTWVzc2FnZUZhY3RvcnkgbWYgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZXNzYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cxID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgbXNnMS53cml0ZVRvKGJhb3MxKTsKLQotICAgICAgICAgICAgTWltZUhlYWRlcnMgaGVhZGVycyA9IG5ldyBNaW1lSGVhZGVycygpOwotICAgICAgICAgICAgaGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgU09BUE1lc3NhZ2UgZnJvbSBNZXNzYWdlRmFjdG9yeSBvYmplY3QgdXNpbmcgSW5wdXRTdHJlYW0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZzIgPSBtZi5jcmVhdGVNZXNzYWdlKGhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhb3MxLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgaWYgKG1zZzIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZzIud3JpdGVUbyhiYW9zMik7Ci0KLSAgICAgICAgICAgIGlmICghKGJhb3MxLnRvU3RyaW5nKCkuZXF1YWxzKGJhb3MyLnRvU3RyaW5nKCkpKSkgewotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZXNzYWdlMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zMSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zMiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIFhNTF9TVFJJTkcgPQotICAgICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCJcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA8c2h3OkhlbGxvIHhtbG5zOnNodz1cImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIDxzaHc6TXluYW1lPlRvbnk8L3NodzpNeW5hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA8L3NodzpIZWxsbz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPC9zb2FwZW52OkhlYWRlcj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c2h3OkFkZHJlc3Mgc2h3OnQ9J3Rlc3QnIHhtbG5zOnNodz1cImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNodzpDaXR5PkdFTlQ8L3NodzpDaXR5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc2h3OkFkZHJlc3M+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgICAgIE1pbWVIZWFkZXJzIGhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIGhlYWRlcnMuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC94bWwiKTsKLQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnMSA9Ci0gICAgICAgICAgICAgICAgICAgIG1mLmNyZWF0ZU1lc3NhZ2UoaGVhZGVycywgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFhNTF9TVFJJTkcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgbXNnMS53cml0ZVRvKGJhb3MxKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIFNPQVBNZXNzYWdlIGZyb20gTWVzc2FnZUZhY3Rvcnkgb2JqZWN0IHVzaW5nIElucHV0U3RyZWFtCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cyID0gbWYuY3JlYXRlTWVzc2FnZShoZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW9zMS50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgICAgIGlmIChtc2cyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtc2cyLndyaXRlVG8oYmFvczIpOwotCi0gICAgICAgICAgICB0aGlzLmFzc2VydFhNTEVxdWFsKGJhb3MxLnRvU3RyaW5nKCksIGJhb3MyLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1mKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zMSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnMSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIG1zZzEud3JpdGVUbyhiYW9zMSk7Ci0KLSAgICAgICAgICAgIE1pbWVIZWFkZXJzIGhlYWRlcnMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIGhlYWRlcnMuYWRkSGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC94bWwiKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL05vZGVUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL05vZGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDBjNmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9Ob2RlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTm9kZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBtc2cgPSBudWxsOwotICAgIHByaXZhdGUgU09BUFBhcnQgc3AgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEJvZHkgYm9keSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEhlYWRlciBoZWFkZXIgPSBudWxsOwotICAgIHByaXZhdGUgU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyRWxlID0gbnVsbDsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBzcCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICBlbnZlbG9wZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIGhlYWRlciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotICAgICAgICBoZWFkZXJFbGUgPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKCJmb28iLCAiZiIsICJmb28tVVJJIikpOwotICAgICAgICBoZWFkZXJFbGUuc2V0QWN0b3IoImFjdG9yLVVSSSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhY2hOb2RlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVhZGVyRWxlLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaGVhZGVyLmV4YW1pbmVIZWFkZXJFbGVtZW50cygiYWN0b3ItVVJJIik7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgiU09BUEhlYWRlciBlbGVtZW50IGlzIG5vdCBkZXRhY2hlZCAtIHVuZXhwZWN0ZWQiLCBpdGVyYXRvci5oYXNOZXh0KCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyZW50RWxlbWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhlYWRlckVsZS5kZXRhY2hOb2RlKCk7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gaGVhZGVyRWxlLmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoIlBhcmVudCBpcyBub3QgbnVsbCA6ICIgKyBwYXJlbnRFbGVtZW50LCBwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFBhcmVudEVsZW1lbnQxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVhZGVyRWxlLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgIGhlYWRlckVsZS5zZXRQYXJlbnRFbGVtZW50KGhlYWRlcik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGhlYWRlckVsZS5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJTT0FQSGVhZGVyIGVsZW1lbnQgbm90IHJldHVybmVkIC0gdW5leHBlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlIGluc3RhbmNlb2YgU09BUEhlYWRlcik7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIHNoID0gKFNPQVBIZWFkZXIpc2U7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJTT0FQSGVhZGVyIGVsZW1lbnQgZG9lcyBub3QgbWF0Y2giLCBzaC5lcXVhbHMoaGVhZGVyKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQYXJlbnRFbGVtZW50MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaGVhZGVyRWxlLnNldFBhcmVudEVsZW1lbnQoYm9keSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9jY3VycmVkIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhlYWRlckVsZS5hZGRUZXh0Tm9kZSgiZm9vLWJhciIpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaGVhZGVyRWxlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHZhbHVlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vLWJhciIsIHZhbHVlKTsKLQotICAgICAgICAgICAgaGVhZGVyRWxlLnNldFZhbHVlKCJmb28tYmFyMiIpOwotICAgICAgICAgICAgdmFsdWUgPSBoZWFkZXJFbGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28tYmFyMiIsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovUHJlZml4ZXNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1ByZWZpeGVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmNhMGQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovUHJlZml4ZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQcmVmaXhlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgUHJlZml4ZXNUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdQcmVmaXhlc0ZvckNoaWxkRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzcCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBzYiA9IHNlLmdldEJvZHkoKTsKLSAgICAgICAgU09BUEVsZW1lbnQgZWwxID0gc2IuYWRkQm9keUVsZW1lbnQoc2UuY3JlYXRlTmFtZSgiZWxlbWVudDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmaXgxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5zdW4uY29tIikpOwotICAgICAgICBlbDEuYWRkQ2hpbGRFbGVtZW50KHNlLmNyZWF0ZU5hbWUoImVsZW1lbnQyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVmaXgyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LmFwYWNoZS5vcmciKSk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIG1zZy53cml0ZVRvKGJhb3MpOwotCi0gICAgICAgIFN0cmluZyB4bWwgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoeG1sLmluZGV4T2YoInByZWZpeDEiKSAhPSAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoeG1sLmluZGV4T2YoInByZWZpeDIiKSAhPSAtMSk7Ci0gICAgICAgIGFzc2VydFRydWUoeG1sLmluZGV4T2YoImh0dHA6Ly93d3cuc3VuLmNvbSIpICE9IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigiaHR0cDovL3d3dy5hcGFjaGUub3JnIikgIT0gLTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNvYXBwYWNrZXQgPQotICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52ID1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCJcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgIDxzb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgPHQ6aGVsbG93b3JsZCB0Om5hbWU9XCJ0ZXN0XCIgeG1sbnM6dD0naHR0cDovL3Rlc3Qub3JnL1Rlc3QnPkhlbGxvPC90OmhlbGxvd29ybGQ+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICA8L3NvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwvc29hcGVudjpFbnZlbG9wZT4iOwotCi0gICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcHBhY2tldC5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKTsKLSAgICAgICAgdmFsaWRhdGVCb2R5KGJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCb2R5KEl0ZXJhdG9yIGl0ZXIpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJcbi0gVGV4dCBJZ25vcmVkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTT0FQRWxlbWVudCBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgYXR0SXRlciA9IHNvYXBFbGVtZW50LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYXR0SXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTmFtZSBuYW1lID0gKE5hbWUpYXR0SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHNvYXBFbGVtZW50LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0IiwgbmFtZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidDpuYW1lIiwgbmFtZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC5vcmcvVGVzdCIsIG5hbWUuZ2V0VVJJKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGNoaWxkRWxlbWVudEl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoaWxkRWxlbWVudEl0ZXIgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgICAgIHZhbGlkYXRlQm9keShjaGlsZEVsZW1lbnRJdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyUHJpZml4KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnYgPSBtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBtc2cuZ2V0U09BUEhlYWRlcigpOwotCi0gICAgICAgICAgICBOYW1lIG5hbWUgPSBlbnYuY3JlYXRlTmFtZSgiTG9jYWwiLCAicHJlMSIsICJodHRwOi8vdGVzdDEiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGxvY2FsID0gaGVhZGVyLmFkZENoaWxkRWxlbWVudChuYW1lKTsKLQotICAgICAgICAgICAgTmFtZSBuYW1lMiA9IGVudi5jcmVhdGVOYW1lKCJMb2NhbDEiLCAicHJlMSIsICJodHRwOi8vdGVzdDEiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGxvY2FsMiA9IGxvY2FsLmFkZENoaWxkRWxlbWVudChuYW1lMik7Ci0KLSAgICAgICAgICAgIE5hbWUgYU5hbWUgPSBlbnYuY3JlYXRlTmFtZSgiYXR0cmliIiwgInByZTEiLCAiaHR0cDovL3Rlc3QxIik7Ci0gICAgICAgICAgICBsb2NhbDIuYWRkQXR0cmlidXRlKGFOYW1lLCAidmFsdWUiKTsKLQotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBtc2cud3JpdGVUbyhiYW9zKTsKLQotICAgICAgICAgICAgU3RyaW5nIHhtbCA9IG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigieG1sbnM6aHR0cDovL3Rlc3QxIikgPT0gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigicHJlMTphdHRyaWI9XCJ2YWx1ZVwiIikgPiAwKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TQUFKRGV0YWlsVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TQUFKRGV0YWlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGQ2NmYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU0FBSkRldGFpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5EZXRhaWw7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTQUFKRGV0YWlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIG1zZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQUGFydCBzcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQQm9keSBib2R5ID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyIGhlYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyRWxlbWVudCBoZWFkZXJFbGUgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIGVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGhlYWRlckVsZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImZvbyIsICJmIiwgImZvby1VUkkiKSk7Ci0gICAgICAgIGhlYWRlckVsZS5zZXRBY3RvcigiYWN0b3ItVVJJIik7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICogZm9yIHNvYXAgdmVyc2lvbiAxLjEKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREZXRhaWxFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL0FkZCBhIFNPQVBGYXVsdCBvYmplY3QgdG8gdGhlIFNPQVBCb2R5Ci0gICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgLy9BZGQgYSBEZXRhaWwgb2JqZWN0IHRvIHRoZSBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICAgIERldGFpbCBkID0gc2YuYWRkRGV0YWlsKCk7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cud29tYmF0Lm9yZy90cmFkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRMYXN0VHJhZGVQcmljZSIsICJXT01CQVQiKTsKLSAgICAgICAgLy9BZGQgYSBEZXRhaWxFbnRyeSBvYmplY3QgdG8gdGhlIERldGFpbCBvYmplY3QKLSAgICAgICAgRGV0YWlsRW50cnkgZGUgPSBkLmFkZERldGFpbEVudHJ5KG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGRlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkZSBpbnN0YW5jZW9mIERldGFpbEVudHJ5KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGZvciBzb2FwIHZlcnNpb24gMS4yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZERldGFpbEVudHJ5MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIGVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICAvL0FkZCBhIFNPQVBGYXVsdCBvYmplY3QgdG8gdGhlIFNPQVBCb2R5Ci0gICAgICAgIFNPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgLy9BZGQgYSBEZXRhaWwgb2JqZWN0IHRvIHRoZSBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICAgIERldGFpbCBkID0gc2YuYWRkRGV0YWlsKCk7Ci0gICAgICAgIFFOYW1lIG5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly93d3cud29tYmF0Lm9yZy90cmFkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRMYXN0VHJhZGVQcmljZSIsICJXT01CQVQiKTsKLSAgICAgICAgLy9BZGQgYSBEZXRhaWxFbnRyeSBvYmplY3QgdG8gdGhlIERldGFpbCBvYmplY3QKLSAgICAgICAgRGV0YWlsRW50cnkgZGUgPSBkLmFkZERldGFpbEVudHJ5KG5hbWUpOwotICAgICAgICAvL1N1Y2Nlc3NmdWxseSBjcmVhdGVkIERldGFpbEVudHJ5IG9iamVjdAotICAgICAgICBhc3NlcnROb3ROdWxsKGRlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkZSBpbnN0YW5jZW9mIERldGFpbEVudHJ5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpSZXN1bHRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NBQUpSZXN1bHRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJiYjg5ODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TQUFKUmVzdWx0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNBQUpSZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTQUFKUmVzdWx0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFNPQVBNZXNzYWdlIG1zZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQUGFydCBzcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQQm9keSBib2R5ID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyIGhlYWRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyRWxlbWVudCBoZWFkZXJFbGUgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIGVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgaGVhZGVyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGhlYWRlckVsZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImZvbyIsICJmIiwgImZvby1VUkkiKSk7Ci0gICAgICAgIGhlYWRlckVsZS5zZXRBY3RvcigiYWN0b3ItVVJJIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgU0FBSlJlc3VsdCBzciA9IG5ldyBTQUFKUmVzdWx0KCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHNyLmdldFJlc3VsdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG5vZGUpOwotICAgIH0KLSAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFJlc3VsdFNPQVBNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAJU0FBSlJlc3VsdCBzciA9IG5ldyBTQUFKUmVzdWx0KG1zZyk7Ci0gICAgCU5vZGUgbm9kZSA9IHNyLmdldFJlc3VsdCgpOwotICAgIAlhc3NlcnROb3ROdWxsKG5vZGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBCb2R5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODdlZTJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEJvZHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5Ob2RlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5UZXh0OwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQm9keVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2Qgc3VpdGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICAvKiAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKHRlc3QubWVzc2FnZS5UZXN0U09BUEJvZHkuY2xhc3MpOwotICAgICAgfQotICAgICovCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBUZXN0U09BUEJvZHkKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFNPQVBCb2R5VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgdGVzdFNvYXBCb2R5QlVHCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTb2FwQm9keSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGVJbXBsIGVudiA9IChTT0FQRW52ZWxvcGVJbXBsKXNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gZW52LmdldEhlYWRlcigpOwotICAgICAgICBOYW1lIGhucyA9IGVudi5jcmVhdGVOYW1lKCJIZWxsbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNodyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGhlYWRFbG1udCA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGhucyk7Ci0gICAgICAgIE5hbWUgaG5zMSA9IGVudi5jcmVhdGVOYW1lKCJNeW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2h3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IG15TmFtZSA9IGhlYWRFbG1udC5hZGRDaGlsZEVsZW1lbnQoaG5zMSk7Ci0gICAgICAgIG15TmFtZS5hZGRUZXh0Tm9kZSgiVG9ueSIpOwotICAgICAgICBOYW1lIG5zID0gZW52LmNyZWF0ZU5hbWUoIkFkZHJlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNodyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudi5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IGJvZHlFbG1udCA9IGJvZHkuYWRkQm9keUVsZW1lbnQobnMpOwotICAgICAgICBOYW1lIG5zMSA9IGVudi5jcmVhdGVOYW1lKCJDaXR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2h3IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgY2l0eSA9IGJvZHlFbG1udC5hZGRDaGlsZEVsZW1lbnQobnMxKTsKLSAgICAgICAgY2l0eS5hZGRUZXh0Tm9kZSgiR0VOVCIpOwotCi0gICAgICAgIFNPQVBFbGVtZW50IGNpdHkyID0gYm9keS5hZGRDaGlsZEVsZW1lbnQobnMxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjaXR5MiBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7Ci0gICAgICAgIGNpdHkyLmFkZFRleHROb2RlKCJDSVQyIik7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXQgPSBib2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLQotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFNPQVBCb2R5RWxlbWVudCk7Ci0gICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgYm9keUVsZW1lbnQgPSAoU09BUEJvZHlFbGVtZW50KW87Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib2R5RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNodyIsIGJvZHlFbGVtZW50LmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYm9keUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJDaXR5IikgfHwKLSAgICAgICAgICAgICAgICAgICAgYm9keUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJBZGRyZXNzIikpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY291bnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0QWRkRG9jdW1lbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCi0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICJ0ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJzb2FwLWJvZHkueG1sIikpOwotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuZ2V0U09BUEhlYWRlcigpLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgIC8vIGFzc2VydE51bGwobWVzc2FnZS5nZXRTT0FQSGVhZGVyKCkpOyAgICAKLSAgICAgICAgICAgIC8vIFRPRE86dGhpcyBmYWlscy4gSGVhZGVyIGlzIGFsd2F5cyBiZWluZyBjcmVhdGVkIGlmIGl0IGRvZXNudCBleGlzdCBpbiBET09NCi0KLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgc29hcEJvZHkuYWRkRG9jdW1lbnQoZG9jdW1lbnQpOwotICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICAvLyBHZXQgY29udGVudHMgdXNpbmcgU0FBSiBBUElzCi0gICAgICAgICAgICBJdGVyYXRvciBpdGVyMSA9IHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGdldENvbnRlbnRzKGl0ZXIxLCAiIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0Q29udGVudHMoSXRlcmF0b3IgaXRlcmF0b3IsIFN0cmluZyBpbmRlbnQpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICBUZXh0IHRleHQgPSBudWxsOwotCi0gICAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudCA9IChTT0FQRWxlbWVudClub2RlOwotICAgICAgICAgICAgICAgIE5hbWUgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRycyA9IGVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWUgYXR0ck5hbWUgPSAoTmFtZSkgYXR0cnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5kZW50ICsgIiBBdHRyaWJ1dGUgbmFtZSBpcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbmRlbnQgKyAiIEF0dHJpYnV0ZSB2YWx1ZSBpcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIyID0gZWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGVudHMoaXRlcjIsIGluZGVudCArICIgIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRleHQgPSAoVGV4dClub2RlOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvL1RPRE8gOiBmaXgKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdENvbnRlbnRBc0RvY3VtZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLQotICAgICAgICAgICAgUU5hbWUgcW5hbWUxID0gbmV3IFFOYW1lKCJodHRwOi8vd29tYmF0Lnp0cmFkZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRMYXN0VHJhZGVQcmljZSIsICJ6dHJhZGUiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGNoaWxkMSA9IHNvYXBCb2R5LmFkZENoaWxkRWxlbWVudChxbmFtZTEpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBzb2FwQm9keS5leHRyYWN0Q29udGVudEFzRG9jdW1lbnQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChkb2N1bWVudCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnQpOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQotICAgICAgICAgICAgLy9SZXRyZWl2ZSB0aGUgY2hpbGRyZW4gb2YgdGhlIFNPQVBCb2R5IChzaG91bGQgYmUgbm9uZSkKLSAgICAgICAgICAgIEl0ZXJhdG9yIGNoaWxkRWxlbWVudHMgPSBzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gY2hpbGRFbGVtZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoaWxkQ291bnQsIDApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZvciBTT0FQIDEuMSBtZXNzYWdlIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgIkNoaWxkMSIsICJjaCIpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIk15VmFsdWUxIjsKLSAgICAgICAgICAgIHNvYXBCb2R5LmFkZEF0dHJpYnV0ZShxbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRm9yIFNPQVAgMS4yIG1lc3NhZ2UgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEF0dHJpYnV0ZTIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIsICJDaGlsZDEiLCAiY2giKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJNeVZhbHVlMSI7Ci0gICAgICAgICAgICBzb2FwQm9keS5hZGRBdHRyaWJ1dGUocW5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIG1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEZvciBTT0FQIDEuMiBtZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRmF1bHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBFbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIsICJDaGlsZDEiLCAiY2giKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJNeUZhdWx0IjsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzb2FwQm9keS5hZGRGYXVsdChxbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb2FwRmF1bHQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb2FwRmF1bHQgaW5zdGFuY2VvZiBTT0FQRmF1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc29hcEJvZHkuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIERvY3VtZW50IGRvYyA9IHNvYXBCb2R5LmdldE93bmVyRG9jdW1lbnQoKTsgICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly9leGFtcGxlLmNvbSI7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAiR2V0TGFzdFRyYWRlUHJpY2UiOwotICAgICAgICBFbGVtZW50IGdldExhc3RUcmFkZVByaWNlID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIGxvY2FsTmFtZSk7ICAgICAgICAKLSAgICAgICAgRWxlbWVudCBzeW1ib2wgPSBkb2MuY3JlYXRlRWxlbWVudCgic3ltYm9sIik7Ci0gICAgICAgIHN5bWJvbC5zZXRBdHRyaWJ1dGUoImZvbyIsICJiYXIiKTsKLSAgICAgICAgZ2V0TGFzdFRyYWRlUHJpY2UuYXBwZW5kQ2hpbGQoc3ltYm9sKTsKLSAgICAgICAgb3JnLnczYy5kb20uVGV4dCBkZWYgPSBkb2MuY3JlYXRlVGV4dE5vZGUoIkRFRiIpOwotICAgICAgICBzeW1ib2wuYXBwZW5kQ2hpbGQoZGVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBzb2FwQm9keS5hcHBlbmRDaGlsZChnZXRMYXN0VHJhZGVQcmljZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc29hcEJvZHkuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7IAotICAgICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIC8vIG11c3QgYmUgU09BUEJvZHlFbGVtZW50Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEJvZHlFbGVtZW50KTsgIAotICAgICAgICBTT0FQRWxlbWVudCBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lc3BhY2UsIHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsTmFtZSwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsgIAotICAgICAgICBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3ltYm9sIiwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFRleHQpOyAgCi0gICAgICAgIFRleHQgdGV4dCA9IChUZXh0KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUYiLCB0ZXh0LmdldERhdGEoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsgICAKLSAgICB9Ci0gICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQ29ubmVjdGlvblRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUENvbm5lY3Rpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMWZmZmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQQ29ubmVjdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5EZWZhdWx0SHR0cE1ldGhvZFJldHJ5SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkdldE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wYXJhbXMuSHR0cE1ldGhvZFBhcmFtczsKLQotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBDb25uZWN0aW9uRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU09BUENvbm5lY3Rpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBzQ29uLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENsb3NlVHdpY2UoKSB7Ci0gICAgICAgIFNPQVBDb25uZWN0aW9uRmFjdG9yeSBzb2FwQ29ubmVjdGlvbkZhY3RvcnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcENvbm5lY3Rpb25GYWN0b3J5ID0gU09BUENvbm5lY3Rpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU09BUENvbm5lY3Rpb24gc0NvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzQ29uID0gc29hcENvbm5lY3Rpb25GYWN0b3J5LmNyZWF0ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIHNDb24uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIGRpZCBub3Qgb2NjdXIiKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENhbGxPbkNsb3NlQ29ubmVjdGlvbigpIHsKLSAgICAgICAgU09BUENvbm5lY3Rpb25GYWN0b3J5IHNvYXBDb25uZWN0aW9uRmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzb2FwQ29ubmVjdGlvbkZhY3RvcnkgPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTT0FQQ29ubmVjdGlvbiBzQ29uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNDb24gPSBzb2FwQ29ubmVjdGlvbkZhY3RvcnkuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzQ29uLmNhbGwobnVsbCwgbmV3IE9iamVjdCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLSAgICAJaWYoaXNOZXR3b3JrZWRSZXNvdXJjZUF2YWlsYWJsZSgiaHR0cDovL2phdmEuc3VuLmNvbS9pbmRleC5odG1sIikpewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTT0FQQ29ubmVjdGlvbkZhY3Rvcnkgc2YgPSBuZXcgU09BUENvbm5lY3Rpb25GYWN0b3J5SW1wbCgpOwotICAgICAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uIGNvbiA9IHNmLmNyZWF0ZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAvL0NyZWF0ZSBhIHZhbGlkIG5vbiB3ZWJzZXJ2aWNlIGVuZHBvaW50IGZvciBpbnZva2luZyBIVFRQLUdFVAotICAgICAgICAgICAgICAgIFVSTCB1cmxFbmRwb2ludCA9IG5ldyBVUkwoImh0dHAiLCAiamF2YS5zdW4uY29tIiwgODAsICIvaW5kZXguaHRtbCIpOwotICAgICAgICAgICAgICAgIC8vaW52b2tpbmcgSFRUUC1HRVQgd2l0aCBhIHZhbGlkIG5vbiB3ZWJzZXJ2aWNlIGVuZHBvaW50IHNob3VsZCB0aHJvdyBhIFNPQVBFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBTT0FQTWVzc2FnZSByZXBseSA9IGNvbi5nZXQodXJsRW5kcG9pbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBTT0FQRXhjZXB0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAJfWVsc2V7Ci0gICAgCQkvL0lmIHJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUgb25saW5lLCBkbyBhIG1vY2sgdGVzdAotICAgIAkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXR3b3JrZWRSZXNvdXJjZUF2YWlsYWJsZShTdHJpbmcgdXJsKSB7Ci0gICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKLSAgICAgICAgR2V0TWV0aG9kIG1ldGhvZCA9IG5ldyBHZXRNZXRob2QodXJsKTsKLSAgICAgICAgY2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldENvbm5lY3Rpb25UaW1lb3V0KDEwMDApOwotICAgICAgICBtZXRob2QuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKEh0dHBNZXRob2RQYXJhbXMuUkVUUllfSEFORExFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdEh0dHBNZXRob2RSZXRyeUhhbmRsZXIoMSwgZmFsc2UpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSBjbGllbnQuZXhlY3V0ZU1ldGhvZChtZXRob2QpOwotICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT0gSHR0cFN0YXR1cy5TQ19PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChIdHRwRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBtZXRob2QucmVsZWFzZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVsZW1lbnRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBFbGVtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTExZjk4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVsZW1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmRvbS5Ob2RlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5vZGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBQYXJ0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU09BUEVsZW1lbnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHJpdmF0ZSBTT0FQRWxlbWVudCBzb2FwRWxlOwotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc29hcEVsZSA9Ci0gICAgICAgICAgICAgICAgU09BUEZhY3RvcnlJbXBsLm5ld0luc3RhbmNlKCkuY3JlYXRlRWxlbWVudCgiVGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVGV4dE5vZGUoKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc29hcEVsZSk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9ICJmb28iOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEVsZS5hZGRUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgc29hcEVsZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgVGV4dEltcGxFeCB0ZXh0ID0gYXNzZXJ0Q29udGFpbnNUZXh0KHNvYXBFbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHRleHQuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENoaWxkcmVuKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEVsZS5hZGRUZXh0Tm9kZSgiZm9vIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBjaGlsZEVsZTEgPQotICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KCJDaGlsZDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBjaGlsZEVsZTIgPQotICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KCJDaGlsZDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudChjaGlsZEVsZTEpOwotICAgICAgICAgICAgc29hcEVsZS5hZGRDaGlsZEVsZW1lbnQoY2hpbGRFbGUyKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgbyA9IHNvYXBFbGUuZ2V0Q2hpbGRFbGVtZW50cygpLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IG8yID0gc29hcEVsZS5nZXRDaGlsZEVsZW1lbnRzKCkubmV4dCgpOwotCi0gICAgICAgIGFzc2VydFNhbWUobywgbzIpOyAvLyBib3RoIGVsZW1lbnRzIHNob3VsZCBiZSB0aGUgc2FtZSBTQUFKIE5vZGUKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoamF2YXgueG1sLnNvYXAuVGV4dClvKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgKChqYXZheC54bWwuc29hcC5UZXh0KW8yKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBpbnQgY2hpbGRyZW5Db3VudCA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNvYXBFbGUuZ2V0Q2hpbGRFbGVtZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgY2hpbGRyZW5Db3VudCArKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgY2hpbGRyZW5Db3VudCk7Ci0KLSAgICAgICAgT2JqZWN0IHoxID0gc29hcEVsZS5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKTsKLSAgICAgICAgT2JqZWN0IHoyID0gc29hcEVsZS5nZXRGaXJzdENoaWxkKCk7Ci0KLSAgICAgICAgYXNzZXJ0U2FtZShvLCB6MSk7ICAgLy8gc2hvdWxkIGJlIHNhbWUgU0FBSiBOb2RlCi0gICAgICAgIGFzc2VydFNhbWUoejEsIHoyKTsgIC8vIHNob3VsZCBiZSBzYW1lIFNBQUogTm9kZQotCi0gICAgICAgIGFzc2VydEVxdWFscygoKGphdmF4LnhtbC5zb2FwLlRleHQpejEpLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAoKGphdmF4LnhtbC5zb2FwLlRleHQpejIpLmdldFZhbHVlKCkpOwotCi0gICAgICAgIE5vZGUgbGFzdENoaWxkTm9kZSA9IChOb2RlKXNvYXBFbGUuZ2V0TGFzdENoaWxkKCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IGxhc3RDaGlsZFNPQVBFbGUgPSAoU09BUEVsZW1lbnQpbGFzdENoaWxkTm9kZTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNoaWxkMiIsIGxhc3RDaGlsZFNPQVBFbGUuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgbGFzdENoaWxkU09BUEVsZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2giLCBsYXN0Q2hpbGRTT0FQRWxlLmdldFByZWZpeCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5BbmRTaWJsaW5ncygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkVGV4dE5vZGUoImZvbyIpOwotICAgICAgICAgICAgc29hcEVsZS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkMSIsICJjaCIsICJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIpOwotICAgICAgICAgICAgc29hcEVsZS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkMiIsICJjaCIsICJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIE9iamVjdCBvID0gc29hcEVsZS5nZXRDaGlsZEVsZW1lbnRzKCkubmV4dCgpOwotICAgICAgICBPYmplY3QgbzIgPSBzb2FwRWxlLmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFNhbWUobywgbzIpOyAvLyBib3RoIGVsZW1lbnRzIHNob3VsZCBiZSB0aGUgc2FtZSBTQUFKIE5vZGUKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoamF2YXgueG1sLnNvYXAuVGV4dClvKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgKChqYXZheC54bWwuc29hcC5UZXh0KW8yKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICBpbnQgY2hpbGRyZW5Db3VudCA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHNvYXBFbGUuZ2V0Q2hpbGRFbGVtZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgY2hpbGRyZW5Db3VudCArKzsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgY2hpbGRyZW5Db3VudCk7Ci0KLSAgICAgICAgT2JqZWN0IHoxID0gc29hcEVsZS5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKTsKLSAgICAgICAgT2JqZWN0IHoyID0gc29hcEVsZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydFNhbWUobywgejEpOyAgIC8vIHNob3VsZCBiZSBzYW1lIFNBQUogTm9kZQotICAgICAgICBhc3NlcnRTYW1lKHoxLCB6Mik7ICAvLyBzaG91bGQgYmUgc2FtZSBTQUFKIE5vZGUKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCgoamF2YXgueG1sLnNvYXAuVGV4dCl6MSkuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICgoamF2YXgueG1sLnNvYXAuVGV4dCl6MikuZ2V0VmFsdWUoKSk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgbGFzdENoaWxkU09BUEVsZSA9IChTT0FQRWxlbWVudClzb2FwRWxlLmdldExhc3RDaGlsZCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiQ2hpbGQyIiwgbGFzdENoaWxkU09BUEVsZS5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2g6Q2hpbGQyIiwgbGFzdENoaWxkU09BUEVsZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIsIGxhc3RDaGlsZFNPQVBFbGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNoIiwgbGFzdENoaWxkU09BUEVsZS5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwobGFzdENoaWxkU09BUEVsZS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGxhc3RDaGlsZFNPQVBFbGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgaW5zdGFuY2VvZiBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydE51bGwobGFzdENoaWxkU09BUEVsZS5nZXROZXh0U2libGluZygpKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5Ob2RlIGZpcnN0Q2hpbGQgPSAoamF2YXgueG1sLnNvYXAuTm9kZSlzb2FwRWxlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuTm9kZSBuZXh0U2libGluZyA9IChqYXZheC54bWwuc29hcC5Ob2RlKShmaXJzdENoaWxkLmdldE5leHRTaWJsaW5nKCkpOwotICAgICAgICBhc3NlcnROdWxsKGZpcnN0Q2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoZmlyc3RDaGlsZCBpbnN0YW5jZW9mIGphdmF4LnhtbC5zb2FwLlRleHQpOwotICAgICAgICBhc3NlcnRUcnVlKG5leHRTaWJsaW5nIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKG5leHRTaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuVGV4dCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2hpbGQxIiwgbmV4dFNpYmxpbmcuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNoOkNoaWxkMSIsIG5leHRTaWJsaW5nLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIiwgbmV4dFNpYmxpbmcuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNoIiwgbmV4dFNpYmxpbmcuZ2V0UHJlZml4KCkpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLk5vZGUgbmV4dFNpYmxpbmcyID0gKGphdmF4LnhtbC5zb2FwLk5vZGUpbmV4dFNpYmxpbmcuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaGlsZDIiLCBuZXh0U2libGluZzIuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNoOkNoaWxkMiIsIG5leHRTaWJsaW5nMi5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC5hcGFjaGUub3JnLyIsIGxhc3RDaGlsZFNPQVBFbGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImNoIiwgbmV4dFNpYmxpbmcyLmdldFByZWZpeCgpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChuZXh0U2libGluZzIuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbW1lbnRTaWJsaW5nKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEVsZS5hZGRUZXh0Tm9kZSgiZm9vIik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudCgiQ2hpbGQxIiwgImNoIiwgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKCI8IS0tIFRoaXMgaXMgYSBDb21tZW50LS0+Iik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudCgiQ2hpbGQyIiwgImNoIiwgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKFRleHQpc29hcEVsZS5nZXRGaXJzdENoaWxkKCkuZ2V0TmV4dFNpYmxpbmcoKS5nZXROZXh0U2libGluZygpKS5pc0NvbW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoKChUZXh0KXNvYXBFbGUuZ2V0TGFzdENoaWxkKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpLmlzQ29tbWVudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudFNpYmxpbmcyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcEVsZS5hZGRUZXh0Tm9kZSgiZm9vIik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKCI8IS0tIFRoaXMgaXMgYSBDb21tZW50LS0+Iik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZFRleHROb2RlKCJiYXIiKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KCJDaGlsZDEiLCAiY2giLCAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQ2hpbGRFbGVtZW50KCJDaGlsZDIiLCAiY2giLCAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCgoVGV4dClzb2FwRWxlLmdldEZpcnN0Q2hpbGQoKS5nZXROZXh0U2libGluZygpKS5pc0NvbW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoVGV4dClzb2FwRWxlLmdldExhc3RDaGlsZCgpLmdldFByZXZpb3VzU2libGluZygpCi0gICAgICAgICAgICAgICAgLmdldFByZXZpb3VzU2libGluZygpKS5pc0NvbW1lbnQoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCgoVGV4dClzb2FwRWxlLmdldExhc3RDaGlsZCgpLmdldFByZXZpb3VzU2libGluZygpCi0gICAgICAgICAgICAgICAgLmdldFByZXZpb3VzU2libGluZygpKS5pc0NvbW1lbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZENoaWxkRWxlbWVudCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gIk15TmFtZTEiOwotICAgICAgICAgICAgU3RyaW5nIHAgPSAiTXlQcmVmaXgxIjsKLSAgICAgICAgICAgIFN0cmluZyB1ID0gIm15VVJJIjsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgbXlzZSA9IGJvZHkuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24ocCwgdSk7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGJvZHkuYWRkQ2hpbGRFbGVtZW50KHMsIHApOwotICAgICAgICAgICAgaWYgKHNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTT0FQRWxlbWVudCB3YXMgbnVsbCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gZ2V0SXRlcmF0b3JDb3VudChpKTsKLSAgICAgICAgICAgICAgICBpID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiV3JvbmcgaXRlcmF0b3IgY291bnQgcmV0dXJuZWQgb2YgIiArIGNvdW50ICsgIiwgZXhwZWN0ZWQgMSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlMiA9IChTT0FQRWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZS5lcXVhbHMoc2UyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiRWxlbWVudHMgbm90IGVxdWFsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBzZS5nZXRFbGVtZW50TmFtZSgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgICAgICAgIE5hbWUgbiA9IHNlLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHNlLmdldEVsZW1lbnROYW1lKCkuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhzKSB8fCAhcHJlZml4LmVxdWFscyhwKSkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKCJhZGRDaGlsZEVsZW1lbnQoKSBkaWQgbm90IHJldHVybiBjb3JyZWN0IGxvY2FsIG5hbWUgYW5kIHByZWZpeCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDaGlsZEVsZW1lbnQyKCkgewotICAgICAgICBib29sZWFuIHBhc3MgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0KLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbXNnLmdldFNPQVBCb2R5KCk7Ci0KLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IHNvYXBFbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUNoaWxkMSIpOwotICAgICAgICAgICAgLy9BZGQgY2hpbGQgZWxlbWVudCBOYW1lIG9iamVjdCB3aXRoIGxvY2FsTmFtZT1NeUNoaWxkMQotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBib2R5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgIGlmIChzZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiYWRkQ2hpbGRFbGVtZW50KCkgZGlkIG5vdCByZXR1cm4gU09BUEVsZW1lbnQiKTsKLSAgICAgICAgICAgICAgICAvL3Bhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9GaW5kIHRoZSBjaGlsZCBlbGVtZW50IGp1c3QgYWRkZWQKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBjaGlsZHMgPSBib2R5LmdldENoaWxkRWxlbWVudHMobmFtZSk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gKE9iamVjdCljaGlsZHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoaWxkcyA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cyhuYW1lKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50ID09IDEpOwotCi0gICAgICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UyID0gKFNPQVBFbGVtZW50KWNoaWxkcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlLCBzZTIpOwotICAgICAgICAgICAgICAgIC8vc2UgPSBzZTIgKGV4cGVjdGVkKQotCi0gICAgICAgICAgICAgICAgLy9SZXRyaWV2ZSB0aGUgU09BUEVsZW1lbnQgTmFtZQotICAgICAgICAgICAgICAgIE5hbWUgbiA9IHNlLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsTmFtZT0iK24uZ2V0TG9jYWxOYW1lKCkrIiBwcmVmaXg9IgotICAgICAgICAgICAgICAgIC8vCQkJK24uZ2V0UHJlZml4KCkrIiBVUkk9IituLmdldFVSSSgpKyIgcXVhbGlmaWVkTmFtZT0iCi0gICAgICAgICAgICAgICAgLy8JCQkrbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhuLCBuYW1lKTsKLSAgICAgICAgICAgICAgICAvL2lmICghbi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiTmFtZSBvYmplY3RzIGFyZSBub3QgZXF1YWwgKHVuZXhwZWN0ZWQpIik7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImFkZENoaWxkRWxlbWVudCgpIGRpZCBub3QgcmV0dXJuICIgKwotICAgICAgICAgICAgICAgIC8vImNvcnJlY3QgTmFtZSBvYmplY3QgZXhwZWN0ZWQgbG9jYWxOYW1lPSIgKwotICAgICAgICAgICAgICAgIC8vbmFtZS5nZXRMb2NhbE5hbWUoKSArICIsIGdvdCBsb2NhbE5hbWU9IgotICAgICAgICAgICAgICAgIC8vKyBuLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgICAgIC8vTmFtZSBvYmplY3RzIGFyZSBlcXVhbCAoZXhwZWN0ZWQpCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFRleHROb2RlMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpU3RhcnQgPSBlbnZlbG9wZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpbnQgY291bnRTdGFydCA9IGdldEl0ZXJhdG9yQ291bnQoaVN0YXJ0KTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gZW52ZWxvcGUuYWRkVGV4dE5vZGUoIjx0eHQ+VGhpcyBpcyB0ZXh0PC90eHQ+Iik7Ci0gICAgICAgICAgICBpZiAoc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoImFkZFRleHROb2RlKCkgZGlkIG5vdCByZXR1cm4gU09BUEVsZW1lbnQiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVudmVsb3BlLmdldFZhbHVlKCkuZXF1YWxzKCI8dHh0PlRoaXMgaXMgdGV4dDwvdHh0PiIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBib2R5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiYWRkVGV4dE5vZGUoKSBkaWQgbm90IHJldHVybiBleHBlY3RlZCB0ZXh0LCBSZXR1cm5lZCAiICsgcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBFeHBlY3RlZCA8dHh0PlRoaXMgaXMgdGV4dDwvdHh0PiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IGVudmVsb3BlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IGdldEl0ZXJhdG9yQ291bnQoaSk7Ci0gICAgICAgICAgICBpID0gZW52ZWxvcGUuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgaWYgKGNvdW50ICE9ICsrY291bnRTdGFydCkgewotICAgICAgICAgICAgICAgIGZhaWwoIldyb25nIGl0ZXJhdG9yIGNvdW50IHJldHVybmVkIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKyAiLCBleHBlY3RlZCAiICsgY291bnRTdGFydCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBudWxsOwotICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBvYmogPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFRleHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIm9iaiBpcyBub3QgaW5zdGFuY2VvZiBUZXh0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXR0cmlidXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIk15QXR0cjEiKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJNeVZhbHVlMSI7Ci0gICAgICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInJlbW92ZUF0dHJpYnV0ZSgpIGRpZCBub3QgcmV0dXJuIHRydWUiLCBiKTsKLSAgICAgICAgICAgIGIgPSBib2R5LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCJyZW1vdmVBdHRyaWJ1dGUoKSBkaWQgbm90IHJldHVybiBmYWxzZSIsIGIpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dHJpYnV0ZTIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJNeUF0dHIxIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiTXlWYWx1ZTEiOwotICAgICAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgYm9vbGVhbiBiID0gYm9keS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGIpOwotCi0gICAgICAgICAgICBiID0gYm9keS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoYikgewotICAgICAgICAgICAgICAgIC8vcmVtb3ZlQXR0cmlidXRlKCkgZGlkIG5vdCByZXR1cm4gZmFsc2UKLSAgICAgICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2dldEF0dHJpYnV0ZVZhbHVlIHNob3VsZCByZXR1cm4gbnVsbAotICAgICAgICAgICAgYXNzZXJ0TnVsbChib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dHJpYnV0ZU5hbWUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBOYW1lIG5hbWUgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIxIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiTXlWYWx1ZTEiOwotICAgICAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgYm9vbGVhbiBiID0gYm9keS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGIpOwotCi0gICAgICAgICAgICBiID0gYm9keS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCFiKTsKLQotICAgICAgICAgICAgU3RyaW5nIHMgPSBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChzKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkZhaWxlZCA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RSZW1vdmVBdHRyaWJ1dGVRTmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJNeUF0dHIxIik7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiTXlWYWx1ZTEiOwotICAgICAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgYm9vbGVhbiBiID0gYm9keS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGIpOwotICAgICAgICAgICAgYiA9IGJvZHkucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghYik7Ci0KLSAgICAgICAgICAgIGFzc2VydE51bGwoYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lc3BhY2VEZWNsYXJhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAibXlQcmVmaXgiOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9ICJteVVSSSI7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG1zZy5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgYm9keS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihwcmVmaXgsIHVyaSk7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSBib2R5LnJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKHByZWZpeCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJyZW1vdmVOYW1lc3BhY2VEZWNsYXJhdGlvbigpIGRpZCBub3QgcmV0dXJuIHRydWUiLCBiKTsKLSAgICAgICAgICAgIGIgPSBib2R5LnJlbW92ZU5hbWVzcGFjZURlY2xhcmF0aW9uKHByZWZpeCk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSgicmVtb3ZlTmFtZXNwYWNlRGVjbGFyYXRpb24oKSBkaWQgbm90IHJldHVybiBmYWxzZSIsIGIpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChib2R5LmdldE5hbWVzcGFjZVVSSShwcmVmaXgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RTZXRFbmNvZGluZ1N0eWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIGJvZHkuc2V0RW5jb2RpbmdTdHlsZShTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQX0VOQ09ESU5HKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9keS5zZXRFbmNvZGluZ1N0eWxlKCJCT0dVUyIpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIEV4Y2VwdGlvbiBvY2N1cnJlZCIsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRJdGVyYXRvckNvdW50KEl0ZXJhdG9yIGl0ZXIpIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGNvdW50ICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRleHRJbXBsRXggYXNzZXJ0Q29udGFpbnNUZXh0KFNPQVBFbGVtZW50IHNvYXBFbGVtKSB7Ci0gICAgICAgIGFzc2VydFRydWUoc29hcEVsZW0uaGFzQ2hpbGROb2RlcygpKTsKLSAgICAgICAgTGlzdCBjaGlsZEVsZW1zID0gdG9MaXN0KHNvYXBFbGVtLmdldENoaWxkRWxlbWVudHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2hpbGRFbGVtcy5zaXplKCkgPT0gMSk7Ci0gICAgICAgIE5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpY2hpbGRFbGVtcy5nZXQoMCk7Ci0gICAgICAgIGFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIFRleHRJbXBsRXgpOwotICAgICAgICByZXR1cm4gKFRleHRJbXBsRXgpbm9kZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3QgdG9MaXN0KGphdmEudXRpbC5JdGVyYXRvciBpdGVyKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgbGlzdC5hZGQoaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotCi0gICAgLyoKLSAgICAqIHRlc3QgZm9yIGFkZENoaWxkRWxlbWVudChRTmFtZSBxbmFtZSkKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDaGlsZEVsZW1lbnQzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zYW1wbGUuYXBhY2hlLm9yZy90cmFkZXIiLCAiR2V0U3RvY2tRdW90ZSIsICJ3Iik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudChxbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBFbGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEF0dHJpYnV0ZVZhbHVlKCkgewotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBFbGUpOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSAiMjM0LjUwIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vc2FtcGxlLmFwYWNoZS5vcmcvdHJhZGVyIiwgIkdldFN0b2NrUXVvdGUiLCAidyIpOwotICAgICAgICAgICAgc29hcEVsZS5hZGRBdHRyaWJ1dGUocW5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZVJldHVybmVkID0gc29hcEVsZS5nZXRBdHRyaWJ1dGVWYWx1ZShxbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHZhbHVlUmV0dXJuZWQpOwotCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEdldENoaWxkRWxlbWVudHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBjaGlsZEVsZTEgPQotICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KCJDaGlsZDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBjaGlsZEVsZTIgPQotICAgICAgICAgICAgICAgICAgICBTT0FQRmFjdG9yeUltcGwubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KCJDaGlsZDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmcvIik7Ci0gICAgICAgICAgICBjaGlsZEVsZTEuYWRkQ2hpbGRFbGVtZW50KGNoaWxkRWxlMik7Ci0gICAgICAgICAgICBzb2FwRWxlLmFkZENoaWxkRWxlbWVudChjaGlsZEVsZTEpOwotCi0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZy8iLCAiQ2hpbGQxIiwgImNoIik7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gc29hcEVsZS5nZXRDaGlsZEVsZW1lbnRzKHFuYW1lKTsKLQotCi0gICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSljaGlsZEVsZW1lbnRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZENvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hpbGRDb3VudCwgMik7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy9UT0RPIDogY2hlY2sgd2h5IHRoaXMgaXMgZmFpbGluZwotICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0Q2hpbGRFbGVtZW50czIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIHNvYXBFbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBFbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IHNvYXBFbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUNoaWxkMSIpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBzb2FwQm9keS5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzQ291bnQgPSBzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotCi0gICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50c0NvdW50Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWNoaWxkRWxlbWVudHNDb3VudC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoaWxkQ291bnQsIDEpOwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UyID0gKFNPQVBFbGVtZW50KWNoaWxkRWxlbWVudHMubmV4dCgpOwotICAgICAgICAgICAgaWYgKCFzZS5lcXVhbHMoc2UyKSkgewotICAgICAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTT0FQRWxlbWVudCBzZSA9IHNlMiAoZXhwZWN0ZWQpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE5hbWUgbiA9IHNlLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobiwgbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldENoaWxkRWxlbWVudHMzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBzb2FwRW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICAvL05hbWUgbmFtZSA9IHNvYXBFbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUNoaWxkMSIpOwotICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiTXlDaGlsZDEiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gc29hcEJvZHkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRFbGVtZW50c0NvdW50ID0gc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgSXRlcmF0b3IgY2hpbGRFbGVtZW50cyA9IHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKTsKLQotICAgICAgICAgICAgaW50IGNoaWxkQ291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkRWxlbWVudHNDb3VudC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSljaGlsZEVsZW1lbnRzQ291bnQubmV4dCgpOwotICAgICAgICAgICAgICAgIGNoaWxkQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGlsZENvdW50LCAxKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlMiA9IChTT0FQRWxlbWVudCljaGlsZEVsZW1lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzZSwgc2UyKTsKLQotICAgICAgICAgICAgUU5hbWUgbiA9IHNlLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG4sIG5hbWUpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVtb3ZlQXR0cmlidXRlMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vY2hpbGQxLmFwYWNoZS5vcmcvIiwgIkNoaWxkMSIsICJjaCIpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gIk15VmFsdWUxIjsKLSAgICAgICAgICAgIHNvYXBFbGUuYWRkQXR0cmlidXRlKHFuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSBzb2FwRWxlLnJlbW92ZUF0dHJpYnV0ZShxbmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJyZW1vdmVBdHRyaWJ1dGUoKSBkaWQgbm90IHJldHVybiB0cnVlIiwgYik7Ci0gICAgICAgICAgICBiID0gc29hcEVsZS5yZW1vdmVBdHRyaWJ1dGUocW5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoInJlbW92ZUF0dHJpYnV0ZSgpIGRpZCBub3QgcmV0dXJuIGZhbHNlIiwgYik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKHNvYXBFbGUuZ2V0QXR0cmlidXRlVmFsdWUocW5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0U2V0RWxlbWVudFFOYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jaGlsZDEuYXBhY2hlLm9yZy8iLCAibmV3TmFtZSIsICJjaCIpOwotICAgICAgICAgICAgc29hcEVsZS5zZXRFbGVtZW50UU5hbWUocW5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbChzb2FwRWxlLmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxOYW1lKCksICJuZXdOYW1lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdENyZWF0ZVFOYW1lKCkgewotICAgICAgICBTdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL1NPQVBNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IGVudmVsb3BlLmNyZWF0ZVFOYW1lKCJxbmFtZSIsIHByZWZpeCk7Ci0gICAgICAgICAgICBTdHJpbmcgdHByZWZpeCA9IHFuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgU3RyaW5nIHR1cmkgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIFN0cmluZyB0bmFtZSA9IHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgaWYgKCF0cHJlZml4LmVxdWFscyhwcmVmaXgpIHx8ICF0dXJpLmVxdWFscyhlbnZlbG9wZS5nZXRFbGVtZW50TmFtZSgpLmdldFVSSSgpKSkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZVFOYW1lKCkgZGlkIG5vdCBjcmVhdGUgY29ycmVjdCBxbmFtZVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQ6IDx1cmk9IiArIGVudmVsb3BlLmdldEVsZW1lbnROYW1lKCkuZ2V0VVJJKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgcHJlZml4PSIgKyBwcmVmaXggKyAiLCBsb2NhbHBhcnQ9cW5hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJnb3Q6ICAgICAgPHVyaT0iICsgdHVyaSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBwcmVmaXg9IiArIHRwcmVmaXggKyAiLCBsb2NhbHBhcnQ9IiArIHRuYW1lICsgIj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHFuYW1lID0gYm9keS5jcmVhdGVRTmFtZSgicW5hbWUiLCBib2R5LmdldEVsZW1lbnROYW1lKCkuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgdHByZWZpeCA9IHFuYW1lLmdldFByZWZpeCgpOwotICAgICAgICAgICAgdHVyaSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgdG5hbWUgPSBxbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIGlmICghdHByZWZpeC5lcXVhbHMoYm9keS5nZXRFbGVtZW50TmFtZSgpLmdldFByZWZpeCgpKSB8fAotICAgICAgICAgICAgICAgICAgICAhdHVyaS5lcXVhbHMoYm9keS5nZXRFbGVtZW50TmFtZSgpLmdldFVSSSgpKSkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZVFOYW1lKCkgZGlkIG5vdCBjcmVhdGUgY29ycmVjdCBxbmFtZVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQ6IDx1cmk9IiArIGJvZHkuZ2V0RWxlbWVudE5hbWUoKS5nZXRVUkkoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLCBwcmVmaXg9IiArIGJvZHkuZ2V0RWxlbWVudE5hbWUoKS5nZXRQcmVmaXgoKSArICIsIGxvY2FscGFydD1xbmFtZT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImdvdDogICAgICA8dXJpPSIgKyB0dXJpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIsIHByZWZpeD0iICsgdHByZWZpeCArICIsIGxvY2FscGFydD0iICsgdG5hbWUgKyAiPiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRmFpbGVkICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250ZW50KCkgewotICAgICAgICBib29sZWFuIHBhc3MgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBOYW1lIG5hbWUgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUNoaWxkIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGJvZHkuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBjaGlsZHMgPSBib2R5LmdldENoaWxkRWxlbWVudHMobmFtZSk7Ci0gICAgICAgICAgICBpbnQgY2hpbGRFbGVtZW50Q291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgYSA9IDA7IGNoaWxkcy5oYXNOZXh0KCk7IGErKykgewotICAgICAgICAgICAgICAgIGNoaWxkcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50Q291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoaWxkcyA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cyhuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaGlsZEVsZW1lbnRDb3VudCwgMSk7Ci0KLSAgICAgICAgICAgIE5hbWUgbiA9IHNlLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobiwgbmFtZSk7Ci0gICAgICAgICAgICAvL0NoaWxkIGFkZGl0aW9uIHZlcmlmaWVkLCBub3cgY2FsbCByZW1vdmVDb250ZW50cyB0byBkZWxldGUgaXQKLSAgICAgICAgICAgIHNlLnJlbW92ZUNvbnRlbnRzKCk7Ci0gICAgICAgICAgICBjaGlsZHMgPSBzZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnRDb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBhID0gMDsgY2hpbGRzLmhhc05leHQoKTsgYSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnRDb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNoaWxkRWxlbWVudENvdW50LCAwKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEVsZW1lbnRRTmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIFFOYW1lIHFuYW1lMSA9IG5ldyBRTmFtZSgiaHR0cDovL2Zvb1VSSS5jb20iLCAiZm9vRWxlbWVudCIsICJmb28iKTsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lMiA9IG5ldyBRTmFtZSgiaHR0cDovL2ZvbzJVUkkuY29tIiwgImZvb0VsZW1lbnQyIiwgImZvbzIiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gYm9keS5hZGRDaGlsZEVsZW1lbnQocW5hbWUxKTsKLSAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gc2UuZ2V0RWxlbWVudFFOYW1lKCk7Ci0gICAgICAgICAgICBzZSA9IHNlLnNldEVsZW1lbnRRTmFtZShxbmFtZTIpOwotICAgICAgICAgICAgcW5hbWUgPSBzZS5nZXRFbGVtZW50UU5hbWUoKTsKLQotICAgICAgICAgICAgaWYgKCFxbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocW5hbWUyLmdldE5hbWVzcGFjZVVSSSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAhcW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKHFuYW1lMi5nZXRMb2NhbFBhcnQoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIXFuYW1lLmdldFByZWZpeCgpLmVxdWFscyhxbmFtZTIuZ2V0UHJlZml4KCkpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXRFbGVtZW50UU5hbWUoKSBkaWQgbm90IHJlc2V0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnQgcW5hbWVcbmV4cGVjdGVkOiA8VVJJPSIgKyBxbmFtZTIuZ2V0TmFtZXNwYWNlVVJJKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgcHJlZml4PSIgKyBxbmFtZTIuZ2V0UHJlZml4KCkgKyAiLCBsb2NhbHBhcnQ9IiArIHFuYW1lMi5nZXRMb2NhbFBhcnQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPlxuZ290OiAgICAgIDxVUkk9IiArIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIiwgcHJlZml4PSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0UHJlZml4KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiwgbG9jYWxwYXJ0PSIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSArICI+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciA6IiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEVsZW1lbnRRTmFtZTIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotCi0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgicW5hbWUiKTsKLSAgICAgICAgICAgIC8vVHJ5IGFuZCBjaGFuZ2UgZWxlbWVudCBuYW1lIG9mIFNPQVBFbnZlbG9wZSAoZXhwZWN0IFNPQVBFeGNlcHRpb24pCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVudmVsb3BlLnNldEVsZW1lbnRRTmFtZShxbmFtZSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTT0FQRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vVHJ5IGFuZCBjaGFuZ2UgZWxlbWVudCBuYW1lIG9mIFNPQVBIZWFkZXIgKGV4cGVjdCBTT0FQRXhjZXB0aW9uKQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBoZWFkZXIuc2V0RWxlbWVudFFOYW1lKHFuYW1lKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vQ2F1Z2h0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9UcnkgYW5kIGNoYW5nZSBlbGVtZW50IG5hbWUgb2YgU09BUEJvZHkgKGV4cGVjdCBTT0FQRXhjZXB0aW9uKQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBib2R5LnNldEVsZW1lbnRRTmFtZShxbmFtZSk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTT0FQRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFcnJvciA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kQ2hpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0KLSAgICAgICAgUU5hbWUgcW5hbWUxID0gbmV3IFFOYW1lKCJodHRwOi8vd29tYmF0Lnp0cmFkZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RUcmFkZVByaWNlIiwgInp0cmFkZSIpOwotICAgICAgICBTT0FQRWxlbWVudCBjaGlsZCA9IHNvYXBCb2R5LmFkZENoaWxkRWxlbWVudChxbmFtZTEpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmFsc2UoY2hpbGQuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBEb2N1bWVudCBkb2MgPSBjaGlsZC5nZXRPd25lckRvY3VtZW50KCk7ICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vZXhhbXBsZS5jb20iOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gIkdldExhc3RUcmFkZVByaWNlIjsKLSAgICAgICAgRWxlbWVudCBnZXRMYXN0VHJhZGVQcmljZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBsb2NhbE5hbWUpOyAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgc3ltYm9sID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN5bWJvbCIpOwotICAgICAgICBzeW1ib2wuc2V0QXR0cmlidXRlKCJmb28iLCAiYmFyIik7Ci0gICAgICAgIGdldExhc3RUcmFkZVByaWNlLmFwcGVuZENoaWxkKHN5bWJvbCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLlRleHQgZGVmID0gZG9jLmNyZWF0ZVRleHROb2RlKCJERUYiKTsKLSAgICAgICAgc3ltYm9sLmFwcGVuZENoaWxkKGRlZik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIGNoaWxkLmFwcGVuZENoaWxkKGdldExhc3RUcmFkZVByaWNlKTsKLSAgICAgICAgCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsgIAotICAgICAgICBTT0FQRWxlbWVudCBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lc3BhY2UsIHNvYXBFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsTmFtZSwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsgIAotICAgICAgICBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3ltYm9sIiwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFRleHQpOyAgCi0gICAgICAgIFRleHQgdGV4dCA9IChUZXh0KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUYiLCB0ZXh0LmdldERhdGEoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoaWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKHNvYXBCb2R5LmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgUU5hbWUgcW5hbWUxID0gbmV3IFFOYW1lKCJodHRwOi8vd29tYmF0Lnp0cmFkZS5jb20iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldExhc3RUcmFkZVByaWNlIiwgInp0cmFkZSIpOwotICAgICAgICBTT0FQRWxlbWVudCBjaGlsZCA9IHNvYXBCb2R5LmFkZENoaWxkRWxlbWVudChxbmFtZTEpOwotICAgICAgICBjaGlsZC5hZGRUZXh0Tm9kZSgiZm9vIik7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKGNoaWxkLmdldENoaWxkRWxlbWVudHMoKS5oYXNOZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgTm9kZSB0ZXh0Tm9kZSA9IChOb2RlKWNoaWxkLmdldENoaWxkRWxlbWVudHMoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUodGV4dE5vZGUgaW5zdGFuY2VvZiBUZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8qIAotICAgICAgICBjaGlsZC5yZW1vdmVDaGlsZCh0ZXh0Tm9kZSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZShjaGlsZC5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoc29hcEJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBzb2FwQm9keS5yZW1vdmVDaGlsZChjaGlsZCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRGYWxzZShzb2FwQm9keS5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBFbnZlbG9wZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVudmVsb3BlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE5NDExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEVudmVsb3BlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbEVudHJ5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1pbWVIZWFkZXJzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTm9kZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5UZXh0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OyAgCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsgCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBFbnZlbG9wZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NUUklORyA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9XCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlL1wiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiXG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6SGVhZGVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgIDxzaHc6SGVsbG8geG1sbnM6c2h3PVwiaHR0cDovL3d3dy5qY29tbWVyY2UubmV0L3NvYXAvbnMvU09BUEhlbGxvV29ybGRcIj5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgIDxzaHc6TXluYW1lPlRvbnk8L3NodzpNeW5hbWU+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgPC9zaHc6SGVsbG8+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIiA8L3NvYXBlbnY6SGVhZGVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAiPHNodzpBZGRyZXNzIHNodzp0PSd0ZXN0JyB4bWxuczpzaHc9XCJodHRwOi8vd3d3Lmpjb21tZXJjZS5uZXQvc29hcC9ucy9TT0FQSGVsbG9Xb3JsZFwiPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICI8c2h3OkNpdHk+R0VOVDwvc2h3OkNpdHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvc2h3OkFkZHJlc3M+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgIjwvc29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0lOUFVUXzEgPSAiPHJvb3Q+PGE+PCEtLSB0aGlzIGlzIGEgdGVzdCB3aXRoIGEgY29tbWVudCBub2RlIC0tPjwvYT48L3Jvb3Q+IjsKLQotICAgIHB1YmxpYyBTT0FQRW52ZWxvcGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHNtc2cgPQotICAgICAgICAgICAgICAgIG1mLmNyZWF0ZU1lc3NhZ2UobmV3IE1pbWVIZWFkZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oWE1MX1NUUklORy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFNPQVBQYXJ0IHNwID0gc21zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBhc3NlcnRUcnVlKHNlICE9IG51bGwpOwotCi0gICAgICAgIC8vIHZhbGlkYXRlIHRoZSBib2R5Ci0gICAgICAgIGZpbmFsIFNPQVBCb2R5IGJvZHkgPSBzcC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKTsKLSAgICAgICAgdmFsaWRhdGVCb2R5KGJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWNoSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc21zZyA9Ci0gICAgICAgICAgICAgICAgbWYuY3JlYXRlTWVzc2FnZShuZXcgTWltZUhlYWRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShYTUxfU1RSSU5HLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU09BUFBhcnQgc3AgPSBzbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2UgIT0gbnVsbCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gc2UuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVyKTsKLSAgICAgICAgaGVhZGVyLmRldGFjaE5vZGUoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChzZS5nZXRIZWFkZXIoKSk7Ci0gICAgICAgIGFzc2VydE51bGwoc21zZy5nZXRTT0FQSGVhZGVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhY2hCb2R5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc21zZyA9Ci0gICAgICAgICAgICAgICAgICAgIG1mLmNyZWF0ZU1lc3NhZ2UobmV3IE1pbWVIZWFkZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFhNTF9TVFJJTkcuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgU09BUFBhcnQgc3AgPSBzbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgc2UgPSBzcC5nZXRFbnZlbG9wZSgpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlLmFkZEJvZHkoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gZGlkIG5vdCBvY2N1ciIpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2UuZ2V0Qm9keSgpLmRldGFjaE5vZGUoKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoc2UuZ2V0Qm9keSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2UuYWRkQm9keSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiBvY2N1cnJlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZlbG9wZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYUlTID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFhNTF9TVFJJTkcuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIGZpbmFsIE1pbWVIZWFkZXJzIG1pbWVoZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgIG1pbWVoZWFkZXJzLmFkZEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQveG1sIik7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHNtc2cgPQotICAgICAgICAgICAgICAgIG1mLmNyZWF0ZU1lc3NhZ2UobWltZWhlYWRlcnMsIGJhSVMpOwotCi0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNtc2cuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBhc3NlcnRUcnVlKGJvZHkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogVGhpcyB0ZXN0IGZhaWxzIGR1ZSB0byBzb21lIGlzc3VlcyBpbiBPTS4gTmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIHRlc3Qgc3VpdGUKLSAgICAvLyAgIHRoYXQgaXNzdWUgaXMgZml4ZWQKLSAgICBwdWJsaWMgdm9pZCBfdGVzdEVudmVsb3BlV2l0aExlYWRpbmdDb21tZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZVdpdGhMZWFkaW5nQ29tbWVudCA9Ci0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPCEtLSBDb21tZW50IC0tPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjxlbnY6RW52ZWxvcGUgeG1sbnM6ZW52PSdodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyc+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPGVudjpCb2R5PjxlY2hvPjxhcmcwPkhlbGxvPC9hcmcwPjwvZWNobz48L2VudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwvZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgTWltZUhlYWRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlV2l0aExlYWRpbmdDb21tZW50LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU09BUFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gcGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBtZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUuZ2V0Qm9keSgpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZlbG9wZVdpdGhDb21tZW50SW5FbnZlbG9wZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBzb2FwTWVzc2FnZVdpdGhMZWFkaW5nQ29tbWVudCA9Ci0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSAgeG1sbnM9J2h0dHA6Ly9zb21ld2hlcmUuY29tL2h0bWwnXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcGVudj0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwhLS0gQ29tbWVudCAtLT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8ZWNobz48YXJnMD5IZWxsbzwvYXJnMD48L2VjaG8+IiArCi0vLyAgICAgICAgICAgICAgICAiICAgIDx0OmVjaG8geG1sbnM6dD0naHR0cDovL3Rlc3Qub3JnL1Rlc3QnPjx0OmFyZzA+SGVsbG88L3Q6YXJnMD48L3Q6ZWNobz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPC9zb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2VXaXRoTGVhZGluZ0NvbW1lbnQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBwYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUuZ2V0Qm9keSgpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZlbG9wZVdpdGhDb21tZW50SW5Cb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHNvYXBNZXNzYWdlV2l0aExlYWRpbmdDb21tZW50ID0KLSAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvJ1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEnXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSc+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6Qm9keT5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIjwhLS0gQ29tbWVudCAtLT4iICsKLS8vICAgICAgICAgICAgICAgICIgICAgPGVjaG8+PGFyZzA+SGVsbG88L2FyZzA+PC9lY2hvPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICA8dDplY2hvIHhtbG5zOnQ9J2h0dHA6Ly90ZXN0Lm9yZy9UZXN0Jz48dDphcmcwPkhlbGxvPC90OmFyZzA+PC90OmVjaG8+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIDwvc29hcGVudjpCb2R5PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdG9yeSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgTWltZUhlYWRlcnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlV2l0aExlYWRpbmdDb21tZW50LmdldEJ5dGVzKCkpKTsKLSAgICAgICAgU09BUFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gcGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGVudmVsb3BlLmdldEJvZHkoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW52ZWxvcGVXaXRoQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgc29hcE1lc3NhZ2VXaXRoTGVhZGluZ0NvbW1lbnQgPQotICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8nXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSdcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA8c29hcGVudjpIZWFkZXI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8IS0tIENvbW1lbnQgLS0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICA8c2h3OkhlbGxvIHhtbG5zOnNodz1cImh0dHA6Ly93d3cuamNvbW1lcmNlLm5ldC9zb2FwL25zL1NPQVBIZWxsb1dvcmxkXCI+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8IS0tIENvbW1lbnQgLS0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgIDxzaHc6TXluYW1lPjwhLS0gQ29tbWVudCAtLT5Ub255PC9zaHc6TXluYW1lPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICA8L3NodzpIZWxsbz5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA8L3NvYXBlbnY6SGVhZGVyPlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIDxzb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8IS0tIENvbW1lbnQgLS0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiICAgIDx0OmVjaG8geG1sbnM6dD0naHR0cDovL3Rlc3Qub3JnL1Rlc3QnPjx0OmFyZzA+SGVsbG88L3Q6YXJnMD48L3Q6ZWNobz4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgPC9zb2FwZW52OkJvZHk+XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgZmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcE1lc3NhZ2VXaXRoTGVhZGluZ0NvbW1lbnQuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICBTT0FQUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBwYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoZW52ZWxvcGUuZ2V0Qm9keSgpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0RmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgIGFzc2VydEZhbHNlKGJvZHkuaGFzRmF1bHQoKSk7Ci0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdFN0cmluZygibXlGYXVsdCIpOwotICAgICAgICBzb2FwRmF1bHQuc2V0RmF1bHRDb2RlKCJDT0RFIik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShib2R5Lmhhc0ZhdWx0KCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGJvZHkuZ2V0RmF1bHQoKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoc29hcEZhdWx0LCBib2R5LmdldEZhdWx0KCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygibXlGYXVsdCIsIHNvYXBGYXVsdC5nZXRGYXVsdFN0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDT0RFIiwgc29hcEZhdWx0LmdldEZhdWx0Q29kZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdEZhdWx0czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGJvZHkuZ2V0RmF1bHQoKSAhPSBudWxsKTsKLQotICAgICAgICBEZXRhaWwgZDEgPSBmYXVsdC5hZGREZXRhaWwoKTsKLSAgICAgICAgTmFtZSBuYW1lID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiR2V0TGFzdFRyYWRlUHJpY2UiLCAiV09NQkFUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53b21iYXQub3JnL3RyYWRlciIpOwotICAgICAgICBkMS5hZGREZXRhaWxFbnRyeShuYW1lKTsKLQotICAgICAgICBEZXRhaWwgZDIgPSBmYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShkMiAhPSBudWxsKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGQyLmdldERldGFpbEVudHJpZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRJdGVyYXRvckNvdW50KGkpID09IDEpOwotICAgICAgICBpID0gZDIuZ2V0RGV0YWlsRW50cmllcygpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIERldGFpbEVudHJ5IGRlID0gKERldGFpbEVudHJ5KWkubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRlLmdldEVsZW1lbnROYW1lKCksIG5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IGVudmVsb3BlLmdldEhlYWRlcigpOwotCi0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGhlYWRlckVsZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImZvbzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbzEtVVJJIikpOwotICAgICAgICBoZWFkZXJFbGUuc2V0QWN0b3IoImFjdG9yLVVSSSIpOwotICAgICAgICBoZWFkZXJFbGUuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBoZWFkZXIuZXh0cmFjdEhlYWRlckVsZW1lbnRzKCJhY3Rvci1VUkkiKTsKLSAgICAgICAgaW50IGNudCA9IDA7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgcmVzdWx0SGVhZGVyRWxlID0gKFNPQVBIZWFkZXJFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGhlYWRlckVsZS5nZXRBY3RvcigpLCByZXN1bHRIZWFkZXJFbGUuZ2V0QWN0b3IoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0SGVhZGVyRWxlLmdldE11c3RVbmRlcnN0YW5kKCksIGhlYWRlckVsZS5nZXRNdXN0VW5kZXJzdGFuZCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGNudCA9PSAxKTsKLSAgICAgICAgaXRlcmF0b3IgPSBoZWFkZXIuZXh0cmFjdEhlYWRlckVsZW1lbnRzKCJhY3Rvci1VUkkiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgSXRlcmF0b3IgaVN0YXJ0ID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGludCBjb3VudFN0YXJ0ID0gZ2V0SXRlcmF0b3JDb3VudChpU3RhcnQpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBib2R5VGV4dCA9ICJUaGlzIGlzIHRoZSBib2R5IHRleHQiOwotCi0gICAgICAgIFNPQVBFbGVtZW50IHNlID0gYm9keS5hZGRDaGlsZEVsZW1lbnQoIkNoaWxkIik7Ci0gICAgICAgIGFzc2VydFRydWUoc2UgIT0gbnVsbCk7Ci0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gc2UuYWRkVGV4dE5vZGUoYm9keVRleHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoYm9keVRleHQsIHNvYXBFbGVtZW50LmdldFZhbHVlKCkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGkgPSBib2R5LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gZ2V0SXRlcmF0b3JDb3VudChpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudCA9PSBjb3VudFN0YXJ0ICsgMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vbkNvbW1lbnRUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGJvZHkuYWRkQ2hpbGRFbGVtZW50KCJDaGlsZCIpOwotICAgICAgICBzZS5hZGRUZXh0Tm9kZSgiVGhpcyBpcyB0ZXh0Iik7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2UuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBPYmplY3QgbyA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKG8gaW5zdGFuY2VvZiBUZXh0KTsKLSAgICAgICAgVGV4dCB0ID0gKFRleHQpbzsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghdC5pc0NvbW1lbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbW1lbnRUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRWxlbWVudCBzZSA9IGJvZHkuYWRkQ2hpbGRFbGVtZW50KCJDaGlsZCIpOwotICAgICAgICBzZS5hZGRUZXh0Tm9kZSgiPCEtLSBUaGlzIGlzIGEgY29tbWVudCAtLT4iKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIE5vZGUgbiA9IG51bGw7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG4gPSAoTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKG4gaW5zdGFuY2VvZiBUZXh0KTsKLSAgICAgICAgVGV4dCB0ID0gKFRleHQpbjsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0LmlzQ29tbWVudCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBnZXRTT0FQRW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICBOYW1lIG5hbWUxID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMSIpOwotICAgICAgICBTdHJpbmcgdmFsdWUxID0gIk15VmFsdWUxIjsKLQotICAgICAgICBOYW1lIG5hbWUyID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMiIpOwotICAgICAgICBTdHJpbmcgdmFsdWUyID0gIk15VmFsdWUyIjsKLQotICAgICAgICBOYW1lIG5hbWUzID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMyIpOwotICAgICAgICBTdHJpbmcgdmFsdWUzID0gIk15VmFsdWUzIjsKLQotICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lMSwgdmFsdWUxKTsKLSAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZTIsIHZhbHVlMik7Ci0gICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUzLCB2YWx1ZTMpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYm9keS5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SXRlcmF0b3JDb3VudChpdGVyYXRvcikgPT0gMyk7Ci0gICAgICAgIGl0ZXJhdG9yID0gYm9keS5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZE5hbWUxID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmROYW1lMiA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kTmFtZTMgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5hbWUxKSkgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZTEsIGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhuYW1lMikpIHsKLSAgICAgICAgICAgICAgICBmb3VuZE5hbWUyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUyLCBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMobmFtZTMpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMywgYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZE5hbWUxICYmIGZvdW5kTmFtZTIgJiYgZm91bmROYW1lMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgIE5hbWUgbmFtZTEgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIxIiwgImF0dCIsICJodHRwOi8vdGVzdC5jb20vQXR0ciIpOwotICAgICAgICBTdHJpbmcgdmFsdWUxID0gIk15VmFsdWUxIjsKLQotICAgICAgICBOYW1lIG5hbWUyID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMiIpOwotICAgICAgICBTdHJpbmcgdmFsdWUyID0gIk15VmFsdWUyIjsKLQotICAgICAgICBOYW1lIG5hbWUzID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMyIpOwotICAgICAgICBTdHJpbmcgdmFsdWUzID0gIk15VmFsdWUzIjsKLQotICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lMSwgdmFsdWUxKTsKLSAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZTIsIHZhbHVlMik7Ci0gICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUzLCB2YWx1ZTMpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYm9keS5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0SXRlcmF0b3JDb3VudChpdGVyYXRvcikgPT0gMyk7Ci0gICAgICAgIGl0ZXJhdG9yID0gYm9keS5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZE5hbWUxID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmROYW1lMiA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kTmFtZTMgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG5hbWUxKSkgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZTEgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZTEsIGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhuYW1lMikpIHsKLSAgICAgICAgICAgICAgICBmb3VuZE5hbWUyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUyLCBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMobmFtZTMpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMywgYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShmb3VuZE5hbWUxICYmIGZvdW5kTmFtZTIgJiYgZm91bmROYW1lMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgIE5hbWUgbmFtZTEgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJNeUF0dHIxIiwgImF0dCIsICJodHRwOi8vdGVzdC5jb20vQXR0ciIpOwotICAgICAgICBTdHJpbmcgdmFsdWUxID0gIk15VmFsdWUxIjsKLQotICAgICAgICBOYW1lIG5hbWUyID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiTXlBdHRyMiIsICJhdHQiLCAiaHR0cDovL3Rlc3QuY29tL0F0dHIiKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlMiA9ICJNeVZhbHVlMiI7Ci0KLSAgICAgICAgTmFtZSBuYW1lMyA9IGVudmVsb3BlLmNyZWF0ZU5hbWUoIk15QXR0cjMiLCAiYXR0IiwgImh0dHA6Ly90ZXN0LmNvbS9BdHRyIik7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTMgPSAiTXlWYWx1ZTMiOwotCi0gICAgICAgIGJvZHkuYWRkQXR0cmlidXRlKG5hbWUxLCB2YWx1ZTEpOwotICAgICAgICBib2R5LmFkZEF0dHJpYnV0ZShuYW1lMiwgdmFsdWUyKTsKLSAgICAgICAgYm9keS5hZGRBdHRyaWJ1dGUobmFtZTMsIHZhbHVlMyk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBib2R5LmdldEFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShnZXRJdGVyYXRvckNvdW50KGl0ZXJhdG9yKSA9PSAzKTsKLSAgICAgICAgaXRlcmF0b3IgPSBib2R5LmdldEFsbEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBib29sZWFuIGZvdW5kTmFtZTEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE5hbWUyID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmROYW1lMyA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMobmFtZTEpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmROYW1lMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlMSwgYm9keS5nZXRBdHRyaWJ1dGVWYWx1ZShuYW1lKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKG5hbWUyKSkgewotICAgICAgICAgICAgICAgIGZvdW5kTmFtZTIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZTIsIGJvZHkuZ2V0QXR0cmlidXRlVmFsdWUobmFtZSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhuYW1lMykpIHsKLSAgICAgICAgICAgICAgICBmb3VuZE5hbWUzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUzLCBib2R5LmdldEF0dHJpYnV0ZVZhbHVlKG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kTmFtZTEgJiYgZm91bmROYW1lMiAmJiBmb3VuZE5hbWUzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkSGVhZGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVudmVsb3BlLmFkZEhlYWRlcigpOwotICAgICAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZ2V0IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkdvdCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbnZlbG9wZS5nZXRIZWFkZXIoKS5kZXRhY2hOb2RlKCk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKGVudmVsb3BlLmdldEhlYWRlcigpKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgbXloZHI7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbXloZHIgPSBlbnZlbG9wZS5hZGRIZWFkZXIoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTT0FQSGVhZGVyIHJldHVybiB2YWx1ZSBpcyBudWxsIiwgbXloZHIpOwotICAgICAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBTT0FQRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTT0FQRW52ZWxvcGUgZ2V0U09BUEVudmVsb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRJdGVyYXRvckNvdW50KGphdmEudXRpbC5JdGVyYXRvciBpKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIGkubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVCb2R5KEl0ZXJhdG9yIGl0ZXIpIHsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVGV4dCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhID0gKChUZXh0KW9iaikuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlxuIi5lcXVhbHMoZGF0YSkgfHwgIkdFTlQiLmVxdWFscyhkYXRhKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBhdHRJdGVyID0gc29hcEVsZW1lbnQuZ2V0QWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChhdHRJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbyA9IGF0dEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBzb2FwRWxlbWVudC5nZXRBdHRyaWJ1dGVWYWx1ZSgoTmFtZSlvKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgY2hpbGRFbGVtZW50SXRlciA9IHNvYXBFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50SXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVCb2R5KGNoaWxkRWxlbWVudEl0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEVuY29kaW5nU3R5bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gZ2V0U09BUEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLnNldEVuY29kaW5nU3R5bGUoImh0dHA6Ly9leGFtcGxlLmNvbS9NeUVuY29kaW5ncyIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVudmVsb3BlLmdldEVuY29kaW5nU3R5bGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2V4YW1wbGUuY29tL015RW5jb2RpbmdzIixlbnZlbG9wZS5nZXRFbmNvZGluZ1N0eWxlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50QWZ0ZXJCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9TT0FQMS4yIGRvZXMgbm90IGFsbG93IHRyYWlsaW5nIGJsb2NrcyBhZnRlciB0aGUgQm9keQotICAgICAgICAgICAgLy9DYWxsIFNPQVBFbnZlbG9wZS5hZGRDaGlsZEVsZW1lbnQoKSBhbmQgKGV4cGVjdCBTT0FQRXhjZXB0aW9uKQotICAgICAgICAgICAgTmFtZSBlbGVtZW50QWZ0ZXJCb2R5ID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiQWZ0ZXJCb2R5IiwgImUiLCAic29tZS11cmkiKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZENoaWxkRWxlbWVudChlbGVtZW50QWZ0ZXJCb2R5KTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vRGlkIHRocm93IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGNyZWF0ZURvY3VtZW50KCkpOwotICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IERPTVJlc3VsdChib2R5KTsKLSAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJvZHkuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBTT0FQQm9keUVsZW1lbnQpOyAgCi0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vZXhhbXBsZS5jb20iLCBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiR2V0TGFzdFRyYWRlUHJpY2UiLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsgIAotICAgICAgICBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydE51bGwoc29hcEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInN5bWJvbCIsIHNvYXBFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOwotICAgICAgICAKLSAgICAgICAgaXRlciA9IHNvYXBFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7IAotICAgICAgICBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBUZXh0KTsgIAotICAgICAgICBUZXh0IHRleHQgPSAoVGV4dClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscygiREVGIiwgdGV4dC5nZXREYXRhKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgRWxlbWVudCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IGdldExhc3RUcmFkZVByaWNlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vZXhhbXBsZS5jb20iLCAibTpHZXRMYXN0VHJhZGVQcmljZSIpOyAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgc3ltYm9sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ltYm9sIik7Ci0gICAgICAgIGdldExhc3RUcmFkZVByaWNlLmFwcGVuZENoaWxkKHN5bWJvbCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLlRleHQgZGVmID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIkRFRiIpOwotICAgICAgICBzeW1ib2wuYXBwZW5kQ2hpbGQoZGVmKTsKLSAgICAgICAgZG9jdW1lbnQuYXBwZW5kQ2hpbGQoZ2V0TGFzdFRyYWRlUHJpY2UpOwotICAgICAgICByZXR1cm4gZ2V0TGFzdFRyYWRlUHJpY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1XaXRoQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjdCA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBTQVhTb3VyY2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoWE1MX0lOUFVUXzEpKSk7Ci0gICAgICAgIERPTVJlc3VsdCByZXN1bHQgPSBuZXcgRE9NUmVzdWx0KGJvZHkpOwotICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IERPTQotICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIHJvb3ROb2RlID0gcmVzdWx0LmdldE5vZGUoKTsKLSAgICAgICAgb3JnLnczYy5kb20uTm9kZSBub2RlID0gcm9vdE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290Iiwgbm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIG5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlIGluc3RhbmNlb2YgRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYSIsIG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBub2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXMgaXMgYSB0ZXN0IHdpdGggYSBjb21tZW50IG5vZGUiLCBub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKSk7Ci0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IFNBQUoKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJvZHkuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlciA9IGJvZHkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBTT0FQQm9keUVsZW1lbnQpOyAgCi0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290Iiwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgaXRlciA9IHNvYXBFbGVtZW50LmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShpdGVyLmhhc05leHQoKSk7IAotICAgICAgICBvYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvYmogaW5zdGFuY2VvZiBTT0FQRWxlbWVudCk7ICAKLSAgICAgICAgc29hcEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIGl0ZXIgPSBzb2FwRWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgVGV4dCk7ICAKLSAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpb2JqOwotICAgICAgICBhc3NlcnRUcnVlKHRleHQuaXNDb21tZW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXMgaXMgYSB0ZXN0IHdpdGggYSBjb21tZW50IG5vZGUiLCB0ZXh0LmdldERhdGEoKS50cmltKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7ICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYWN0b3J5VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhODU2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQRmFjdG9yeVRlc3QuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURldGFpbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGlmIChzZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU09BUEZhY3Rvcnkgd2FzIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERldGFpbCBkID0gc2YuY3JlYXRlRGV0YWlsKCk7Ci0gICAgICAgICAgICBpZiAoZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiRGV0YWlsIHdhcyBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL1NPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBpZiAoc2YgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZUVsZW1lbnRUZXN0NCgpIGNvdWxkIG5vdCBjcmVhdGUgU09BUEZhY3Rvcnkgb2JqZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NyZWF0ZSBRTmFtZSBvYmplY3Qgd2l0aCBsb2NhbE5hbWU9TXlOYW1lMSxwcmVmaXg9TXlQcmVmaXgxLCB1cmk9TXlVcmkxCi0gICAgICAgICAgICBRTmFtZSBuYW1lID0gbmV3IFFOYW1lKCJNeVVyaTEiLCAiTXlOYW1lMSIsICJNeVByZWZpeDEiKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gc2YuY3JlYXRlRWxlbWVudChuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2UpOwotICAgICAgICAgICAgbmFtZSA9IHNlLmdldEVsZW1lbnRRTmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbmFtZS5nZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgibG9jYWxOYW1lIGlzIG51bGwgKGV4cGVjdGVkIE15TmFtZTEpIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFsb2NhbE5hbWUuZXF1YWxzKCJNeU5hbWUxIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJsb2NhbE5hbWUgaXMgd3JvbmcgKGV4cGVjdGVkIE15TmFtZTEpIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgicHJlZml4IGlzIG51bGwgKGV4cGVjdGVkIE15UHJlZml4MSkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXByZWZpeC5lcXVhbHMoIk15UHJlZml4MSIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgicHJlZml4IGlzIHdyb25nIChleHBlY3RlZCBNeVByZWZpeDEpIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgidXJpIGlzIG51bGwgKGV4cGVjdGVkIE15VXJpMSkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXVyaS5lcXVhbHMoIk15VXJpMSIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgidXJpIGlzIHdyb25nIChleHBlY3RlZCBNeVVyaTEpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbGVtZW50MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IHNmID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIC8vU09BUEZhY3Rvcnkgc2YgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIGlmIChzZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY291bGQgbm90IGNyZWF0ZSBTT0FQRmFjdG9yeSBvYmplY3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGUgYSBET01FbGVtZW50Iik7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZGJmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICAgICAgICBFbGVtZW50IGRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vTXlOYW1lc3BhY2Uub3JnLyIsICJNeVRhZyIpOwotICAgICAgICAgICAgLy9DYWxsaW5nIFNPQVBGYWN0b3J5LmNyZWF0ZUVsZW1lbnQob3JnLnczYy5kb20uRWxlbWVudCkKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gc2YuY3JlYXRlRWxlbWVudChkZSk7Ci0gICAgICAgICAgICBpZiAoIWRlLmdldE5vZGVOYW1lKCkuZXF1YWxzKHNlLmdldE5vZGVOYW1lKCkpIHx8ICFkZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIHNlLmdldE5hbWVzcGFjZVVSSSgpKSkgewotICAgICAgICAgICAgICAgIC8vTm9kZSBuYW1lcyBhcmUgbm90IGVxdWFsCi0gICAgICAgICAgICAgICAgZmFpbCgiR290OiA8VVJJPSIgKyBzZS5nZXROYW1lc3BhY2VVUkkoKSArICIsIFBSRUZJWD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlLmdldFByZWZpeCgpICsgIiwgTkFNRT0iICsgc2UuZ2V0Tm9kZU5hbWUoKSArICI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDxVUkk9IiArIGRlLmdldE5hbWVzcGFjZVVSSSgpICsgIiwgUFJFRklYPSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgZGUuZ2V0UHJlZml4KCkgKyAiLCBOQU1FPSIgKyBkZS5nZXROb2RlTmFtZSgpICsgIj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVsZW1lbnQzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiY3JlYXRlRmF1bHRUZXN0MSgpIGNvdWxkIG5vdCBjcmVhdGUgU09BUEZhY3Rvcnkgb2JqZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCk7Ci0gICAgICAgICAgICBpZiAoc2YgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZUZhdWx0KCkgcmV0dXJuZWQgbnVsbCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghKHNmIGluc3RhbmNlb2YgU09BUEZhdWx0KSkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZUZhdWx0KCkgZGlkIG5vdCBjcmVhdGUgYSBTT0FQRmF1bHQgb2JqZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRWxlbWVudDQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBzZiA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBpZiAoc2YgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoImNyZWF0ZUVsZW1lbnRUZXN0NigpIGNvdWxkIG5vdCBjcmVhdGUgU09BUEZhY3Rvcnkgb2JqZWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL015TmFtZXNwYWNlLm9yZy8iLCAiTXlUYWciKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlMSA9IHNmLmNyZWF0ZUVsZW1lbnQocW5hbWUpOwotICAgICAgICAgICAgLy9DcmVhdGUgc2Vjb25kIFNPQVBFbGVtZW50IGZyb20gZmlyc3QgU09BUEVsZW1lbnQKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlMiA9IHNmLmNyZWF0ZUVsZW1lbnQoc2UxKTsKLSAgICAgICAgICAgIC8vY29tbWVudGVkIHRvIHN1cHBvcnQgamRrIDEuNCBidWlsZAotICAgICAgICAgICAgLy8gICAgCQlpZighc2UxLmlzRXF1YWxOb2RlKHNlMikgJiYgIXNlMS5pc1NhbWVOb2RlKHNlMikpIHsKLSAgICAgICAgICAgIC8vICAgIAkJCWZhaWwoIlRoZSBTT0FQRWxlbWVudCdzIGFyZSBub3QgZXF1YWwgYW5kIG5vdCB0aGUgc2FtZSAodW5leHBlY3RlZCkiKTsKLSAgICAgICAgICAgIC8vICAgIAkJfQotICAgICAgICAgICAgaWYgKCFzZTEuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoc2UyLmdldE5vZGVOYW1lKCkpIHx8ICFzZTEuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICBzZTIuZ2V0TmFtZXNwYWNlVVJJKCkpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiR290OiA8VVJJPSIgKyBzZTEuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiLCBQUkVGSVg9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICBzZTEuZ2V0UHJlZml4KCkgKyAiLCBOQU1FPSIgKyBzZTEuZ2V0Tm9kZU5hbWUoKSArICI+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IDxVUkk9IiArIHNlMi5nZXROYW1lc3BhY2VVUkkoKSArICIsIFBSRUZJWD0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlMi5nZXRQcmVmaXgoKSArICIsIE5BTUU9IiArIHNlMi5nZXROb2RlTmFtZSgpICsgIj4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGYXVsdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIC8vU09BUEZhY3RvcnkgZmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCJUaGlzIGlzIHRoZSBmYXVsdCByZWFzb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQX1JFQ0VJVkVSX0ZBVUxUKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2YpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZiBpbnN0YW5jZW9mIFNPQVBGYXVsdCk7Ci0gICAgICAgICAgICBRTmFtZSBmYyA9IHNmLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsKLSAgICAgICAgICAgIC8vRXhwZWN0IEZhdWx0Q29kZT0iK1NPQVBDb25zdGFudHMuU09BUF9SRUNFSVZFUl9GQVVMVAotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNmLmdldEZhdWx0UmVhc29uVGV4dHMoKTsKLSAgICAgICAgICAgIGlmIChpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2cuaW5mbygiQ2FsbCB0byBnZXRGYXVsdFJlYXNvblRleHRzKCkgcmV0dXJuZWQgbnVsbCBpdGVyYXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9ICIiOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVhc29uICs9IChTdHJpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlYXNvbik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlYXNvbi5pbmRleE9mKCJUaGlzIGlzIHRoZSBmYXVsdCByZWFzb24uIikgPiAtMSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZjLmVxdWFscyhTT0FQQ29uc3RhbnRzLlNPQVBfUkVDRUlWRVJfRkFVTFQpKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJDYXVnaHQgdW5leHBlY3RlZCBTT0FQRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRmF1bHQxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9TT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGZhY3RvcnkuY3JlYXRlRmF1bHQoIlRoaXMgaXMgdGhlIGZhdWx0IHJlYXNvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0FQQ29uc3RhbnRzLlNPQVBfUkVDRUlWRVJfRkFVTFQpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzZik7Ci0gICAgICAgICAgICBRTmFtZSBmYyA9IHNmLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzZi5nZXRGYXVsdFJlYXNvblRleHRzKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZWFzb24gPSAiIjsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHJlYXNvbiArPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nLmluZm8oIkFjdHVhbCBSZWFzb25UZXh0PSIgKyByZWFzb24pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWFzb24pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFzb24uaW5kZXhPZigiVGhpcyBpcyB0aGUgZmF1bHQgcmVhc29uLiIpID4gLTEpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmYy5lcXVhbHMoU09BUENvbnN0YW50cy5TT0FQX1JFQ0VJVkVSX0ZBVUxUKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9DYXVnaHQgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogZm9yIHNvYXAgMS4xICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBGYXVsdEV4Y2VwdGlvbjEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBmYWN0b3J5LmNyZWF0ZUZhdWx0KCJUaGlzIGlzIHRoZSBmYXVsdCByZWFzb24uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKCJodHRwOi8vTXlOYW1lc3BhY2VVUkkub3JnLyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXkgRmF1bHQgQ29kZSIpKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9DYXVnaHQgZXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIGZvciBzb2FwIDEuMiAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQRmF1bHRFeGNlcHRpb24yKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU09BUEZhY3RvcnkgZmFjdG9yeSA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZmFjdG9yeS5jcmVhdGVGYXVsdCgiVGhpcyBpcyB0aGUgZmF1bHQgcmVhc29uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL015TmFtZXNwYWNlVVJJLm9yZy8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15IEZhdWx0IENvZGUiKSk7Ci0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IGV4cGVjdGVkIFNPQVBFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9DYXVnaHQgZXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBTT0FQRXhjZXB0aW9uCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0NhdWdodCBleHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmF1bHREZXRhaWxUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdERldGFpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMGFhOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdERldGFpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsRW50cnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWltZUhlYWRlcnM7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0RGV0YWlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBTT0FQRmF1bHREZXRhaWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHhtbFN0cmluZyA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiArCi0gICAgICAgICAgICAgICAgICAgICI8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PVwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS9cIiB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCI+IiArCi0gICAgICAgICAgICAgICAgICAgICIgPHNvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgPHNvYXBlbnY6RmF1bHQ+IiArCi0gICAgICAgICAgICAgICAgICAgICIgICA8ZmF1bHRjb2RlPnNvYXBlbnY6U2VydmVyLmdlbmVyYWxFeGNlcHRpb248L2ZhdWx0Y29kZT4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgIDxmYXVsdHN0cmluZz48L2ZhdWx0c3RyaW5nPiIgKwotICAgICAgICAgICAgICAgICAgICAiICAgPGRldGFpbD4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgICA8dGlja2VyU3ltYm9sIHhzaTp0eXBlPVwieHNkOnN0cmluZ1wiPk1BQ1I8L3RpY2tlclN5bWJvbD4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgIDxuczE6ZXhjZXB0aW9uTmFtZSB4bWxuczpuczE9XCJodHRwOi8veG1sLmFwYWNoZS5vcmcvYXhpczIvXCI+dGVzdC53c2RsLmZhdWx0cy5JbnZhbGlkVGlja2VyRmF1bHRNZXNzYWdlPC9uczE6ZXhjZXB0aW9uTmFtZT4iICsKLSAgICAgICAgICAgICAgICAgICAgIiAgIDwvZGV0YWlsPiIgKwotICAgICAgICAgICAgICAgICAgICAiICA8L3NvYXBlbnY6RmF1bHQ+IiArCi0gICAgICAgICAgICAgICAgICAgICIgPC9zb2FwZW52OkJvZHk+IiArCi0gICAgICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6RW52ZWxvcGU+IjsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc21zZyA9Ci0gICAgICAgICAgICAgICAgbWYuY3JlYXRlTWVzc2FnZShuZXcgTWltZUhlYWRlcnMoKSwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0cmluZy5nZXRCeXRlcygpKSk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBzbXNnLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgIC8vc21zZy53cml0ZVRvKFN5c3RlbS5vdXQpOwotICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmdldEZhdWx0KCk7Ci0gICAgICAgIGZhdWx0LmFkZERldGFpbCgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5EZXRhaWwgZCA9IGZhdWx0LmdldERldGFpbCgpOwotICAgICAgICBJdGVyYXRvciBpID0gZC5nZXREZXRhaWxFbnRyaWVzKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgRGV0YWlsRW50cnkgZW50cnkgPSAoRGV0YWlsRW50cnkpaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoInRpY2tlclN5bWJvbCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGUgdmFsdWUgb2YgdGhlIHRpY2tlclN5bWJvbCBlbGVtZW50IGRpZG4ndCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQUNSIiwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJleGNlcHRpb25OYW1lIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRoZSB2YWx1ZSBvZiB0aGUgZXhjZXB0aW9uTmFtZSBlbGVtZW50IGRpZG4ndCBtYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0LndzZGwuZmF1bHRzLkludmFsaWRUaWNrZXJGYXVsdE1lc3NhZ2UiLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIGRldGFpbHMgZWxlbWVudCBuYW1lIG9mICd0aWNrZXJTeW1ib2wnIG9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIidleHBjZXB0aW9uTmFtZScgLSBJIGZvdW5kIDoiICsgbmFtZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQRmF1bHRUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcyMGUzMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBGYXVsdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuRGV0YWlsOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLkRldGFpbEVudHJ5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLk5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUENvbnN0YW50czsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotcHVibGljIGNsYXNzIFNPQVBGYXVsdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgU09BUEZhdWx0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFNPQVBGYXVsdFdpdGhEZXRhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qIFdlIGFyZSB0cnlpbmcgdG8gZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBTT0FQRmF1bHQKLQotICAgICAgICA8c29hcGVudjpFbnZlbG9wZSB4bWxuczpzb2FwZW52PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgeG1sbnM6Y3dtcD0iaHR0cDovL2N3bXAuY29tIj4KLSAgICAgICAgIDxzb2FwZW52OkhlYWRlcj4KLSAgICAgICAgICA8Y3dtcDpJRCBzb2FwZW52Om11c3RVbmRlcnN0YW5kPSIxIj5IRUFERVJJRC03ODY3Njdjb21tCi0gICAgICAgICAgODwvY3dtcDpJRD4KLSAgICAgICAgIDwvc29hcGVudjpIZWFkZXI+Ci0gICAgICAgICA8c29hcGVudjpCb2R5PgotICAgICAgICAgIDxzb2FwZW52OkZhdWx0PgotICAgICAgICAgICA8ZmF1bHRjb2RlPkNsaWVudDwvZmF1bHRjb2RlPgotICAgICAgICAgICA8ZmF1bHRzdHJpbmc+Q1dNUCBmYXVsdDwvZmF1bHRzdHJpbmc+Ci0gICAgICAgICAgIDxmYXVsdGFjdG9yPmh0dHA6Ly9naXptb3MuY29tL29yZGVyPC9mYXVsdGFjdG9yPgotICAgICAgICAgICA8ZGV0YWlsPgotICAgICAgICAgICAgPGN3bXA6RmF1bHQ+Ci0gICAgICAgICAgICAgPGN3bXA6RmF1bHRDb2RlPlRoaXMgaXMgdGhlIGZhdWx0IGNvZGU8L2N3bXA6RmF1bHRDb2RlPgotICAgICAgICAgICAgIDxjd21wOkZhdWx0U3RyaW5nPkZhdWx0IE1lc3NhZ2U8L2N3bXA6RmF1bHRTdHJpbmc+Ci0gICAgICAgICAgICAgPGN3bXA6TWVzc2FnZT5UaGlzIGlzIGEgdGVzdCBmYXVsdDwvY3dtcDpGYXVsdFN0cmluZz4KLSAgICAgICAgICAgIDwvY3dtcDpGYXVsdD4KLSAgICAgICAgICAgPC9kZXRhaWw+Ci0gICAgICAgICAgPC9zb2FwZW52OkZhdWx0PgotICAgICAgICAgPC9zb2FwZW52OkJvZHk+Ci0gICAgICAgIDwvc29hcGVudjpFbnZlbG9wZT4KLQotICAgICAgICAqLwotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIHJlc3BvbnNlIHRvIHRoZSBtZXNzYWdlCi0gICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgTmFtZSBpZE5hbWUgPSBlbnZlbG9wZS5jcmVhdGVOYW1lKCJJRCIsICJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBpZCA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGlkTmFtZSk7Ci0gICAgICAgIGlkLnNldE11c3RVbmRlcnN0YW5kKHRydWUpOwotICAgICAgICBpZC5hZGRUZXh0Tm9kZSgiSEVBREVSSUQtNzg2NzY3OCIpOwotCi0gICAgICAgIC8vQ3JlYXRlIHRoZSBTT0FQRmF1bHQgb2JqZWN0Ci0gICAgICAgIFNPQVBGYXVsdCBmYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKCJDbGllbnQiKTsKLSAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoIkNXTVAgZmF1bHQiKTsKLSAgICAgICAgZmF1bHQuc2V0RmF1bHRBY3RvcigiaHR0cDovL2dpem1vcy5jb20vb3JkZXIiKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNsaWVudCIsIGZhdWx0LmdldEZhdWx0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDV01QIGZhdWx0IiwgZmF1bHQuZ2V0RmF1bHRTdHJpbmcoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2dpem1vcy5jb20vb3JkZXIiLCBmYXVsdC5nZXRGYXVsdEFjdG9yKCkpOwotCi0gICAgICAgIC8vQWRkIEZhdWx0IERldGFpbCBpbmZvcm1hdGlvbgotICAgICAgICBEZXRhaWwgZmF1bHREZXRhaWwgPSBmYXVsdC5hZGREZXRhaWwoKTsKLSAgICAgICAgTmFtZSBjd21wRmF1bHROYW1lID0gZW52ZWxvcGUuY3JlYXRlTmFtZSgiRmF1bHQiLCAiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgRGV0YWlsRW50cnkgZmF1bHREZXRhaWxFbnRyeSA9IGZhdWx0RGV0YWlsLmFkZERldGFpbEVudHJ5KGN3bXBGYXVsdE5hbWUpOwotICAgICAgICBTT0FQRWxlbWVudCBlID0gZmF1bHREZXRhaWxFbnRyeS5hZGRDaGlsZEVsZW1lbnQoIkZhdWx0Q29kZSIpOwotCi0gICAgICAgIGUuYWRkVGV4dE5vZGUoIlRoaXMgaXMgdGhlIGZhdWx0IGNvZGUiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgZTIgPSBmYXVsdERldGFpbEVudHJ5LmFkZENoaWxkRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKCJGYXVsdFN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3dtcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2N3bXAuY29tIikpOwotICAgICAgICBlMi5hZGRUZXh0Tm9kZSgiRmF1bHQgTWVzc2FnZSIpOwotCi0gICAgICAgIFNPQVBFbGVtZW50IGUzID0gZmF1bHREZXRhaWxFbnRyeS5hZGRDaGlsZEVsZW1lbnQoIk1lc3NhZ2UiKTsKLSAgICAgICAgZTMuYWRkVGV4dE5vZGUoIlRoaXMgaXMgYSB0ZXN0IGZhdWx0Iik7Ci0KLSAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tIFZhbGlkYXRlIHRoZSBjb250ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIGZpbmFsIERldGFpbCBkZXRhaWwgPSBmYXVsdC5nZXREZXRhaWwoKTsKLSAgICAgICAgZmluYWwgSXRlcmF0b3IgZGV0YWlsRW50cnlJdGVyID0gZGV0YWlsLmdldERldGFpbEVudHJpZXMoKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZEZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRTZWNvbmQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZFRoaXJkID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChkZXRhaWxFbnRyeUl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBEZXRhaWxFbnRyeSBkZXRhaWxFbnRyeSA9IChEZXRhaWxFbnRyeSlkZXRhaWxFbnRyeUl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgY2hpbGRFbGVtZW50c0l0ZXIgPSBkZXRhaWxFbnRyeS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGRFbGVtZW50c0l0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSAoU09BUEVsZW1lbnQpY2hpbGRFbGVtZW50c0l0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChzb2FwRWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzKCJGYXVsdENvZGUiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEVsZW1lbnQuZ2V0VmFsdWUoKS5lcXVhbHMoIlRoaXMgaXMgdGhlIGZhdWx0IGNvZGUiKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZEZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXBFbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoImN3bXA6RmF1bHRTdHJpbmciKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc29hcEVsZW1lbnQuZ2V0VmFsdWUoKS5lcXVhbHMoIkZhdWx0IE1lc3NhZ2UiKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFNlY29uZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzb2FwRWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzKCJNZXNzYWdlIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvYXBFbGVtZW50LmdldFZhbHVlKCkuZXF1YWxzKCJUaGlzIGlzIGEgdGVzdCBmYXVsdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kVGhpcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGZvdW5kRmlyc3QgJiYgZm91bmRTZWNvbmQgJiYgZm91bmRUaGlyZCk7Ci0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgZmF1bHQgaXMgYmVpbmcgc2VyaWFsaXplZCBwcm9wZXJseQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgc29hcE1lc3NhZ2Uud3JpdGVUbyhiYW9zKTsKLSAgICAgICAgU3RyaW5nIHhtbCA9IG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCI8ZmF1bHRjb2RlPkNsaWVudDwvZmF1bHRjb2RlPiIpICE9IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigiPGZhdWx0c3RyaW5nPkNXTVAgZmF1bHQ8L2ZhdWx0c3RyaW5nPiIpICE9IC0xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh4bWwuaW5kZXhPZigiPGZhdWx0YWN0b3I+aHR0cDovL2dpem1vcy5jb20vb3JkZXI8L2ZhdWx0YWN0b3I+IikgIT0gLTEpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREZXRhaWxzVHdpY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgcmVzcG9uc2UgdG8gdGhlIG1lc3NhZ2UKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0KLSAgICAgICAgICAgIGJvZHkuYWRkRmF1bHQoKS5hZGREZXRhaWwoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9keS5nZXRGYXVsdCgpLmFkZERldGFpbCgpOwotICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBkaWQgbm90IG9jY3VyIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gT2NjdXJyZWQgOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdFF1aWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1zZ2ZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQRmFjdG9yeSBmYWN0b3J5ID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugb3V0cHV0bXNnID0gbXNnZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFN0cmluZyB2YWx1ZUNvZGUgPSAiZmF1bHRjb2RlIjsKLSAgICAgICAgU3RyaW5nIHZhbHVlU3RyaW5nID0gImZhdWx0U3RyaW5nIjsKLSAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gb3V0cHV0bXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuYWRkRmF1bHQoKTsKLSAgICAgICAgZmF1bHQuc2V0RmF1bHRDb2RlKHZhbHVlQ29kZSk7Ci0gICAgICAgIGZhdWx0LnNldEZhdWx0U3RyaW5nKHZhbHVlU3RyaW5nKTsKLSAgICAgICAgRGV0YWlsIGRldGFpbCA9IGZhdWx0LmFkZERldGFpbCgpOwotICAgICAgICBkZXRhaWwuYWRkRGV0YWlsRW50cnkoZmFjdG9yeS5jcmVhdGVOYW1lKCJIZWxsbyIpKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGlmIChvdXRwdXRtc2cuc2F2ZVJlcXVpcmVkKCkpIHsKLSAgICAgICAgICAgIG91dHB1dG1zZy5zYXZlQ2hhbmdlcygpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dG1zZy53cml0ZVRvKGJhb3MpOwotICAgICAgICBTdHJpbmcgeG1sID0gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICBhc3NlcnRUcnVlKHhtbC5pbmRleE9mKCJIZWxsbyIpICE9IC0xKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBtZXNzYWdlLmdldFNPQVBCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgZmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIE5hbWUgZmF1bHROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiQ2xpZW50IiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5VUklfTlNfU09BUF9FTlZFTE9QRSk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRGYXVsdENvZGUoZmF1bHROYW1lKTsKLQotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRTdHJpbmcoIk1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBuZWNlc3NhcnkgaW5mbyIpOwotICAgICAgICAgICAgZmF1bHQuc2V0RmF1bHRBY3RvcigiaHR0cDovL2dpem1vcy5jb20vb3JkZXIiKTsKLQotICAgICAgICAgICAgRGV0YWlsIGRldGFpbCA9IGZhdWx0LmFkZERldGFpbCgpOwotCi0gICAgICAgICAgICBOYW1lIGVudHJ5TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIm9yZGVyIiwgIlBPIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2dpem1vcy5jb20vb3JkZXJzLyIpOwotICAgICAgICAgICAgRGV0YWlsRW50cnkgZW50cnkgPSBkZXRhaWwuYWRkRGV0YWlsRW50cnkoZW50cnlOYW1lKTsKLSAgICAgICAgICAgIGVudHJ5LmFkZFRleHROb2RlKCJRdWFudGl0eSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSIpOwotCi0gICAgICAgICAgICBOYW1lIGVudHJ5TmFtZTIgPQotICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJjb25maXJtYXRpb24iLCAiUE8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZ2l6bW9zLmNvbS9jb25maXJtIik7Ci0gICAgICAgICAgICBEZXRhaWxFbnRyeSBlbnRyeTIgPSBkZXRhaWwuYWRkRGV0YWlsRW50cnkoZW50cnlOYW1lMik7Ci0gICAgICAgICAgICBlbnRyeTIuYWRkVGV4dE5vZGUoIkluY29tcGxldGUgYWRkcmVzczogIiArICJubyB6aXAgY29kZSIpOwotCi0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgICAgICAvL21lc3NhZ2Uud3JpdGVUbyhTeXN0ZW0ub3V0KTsKLQotICAgICAgICAgICAgLy8gTm93IHJldHJpZXZlIHRoZSBTT0FQRmF1bHQgb2JqZWN0IGFuZAotICAgICAgICAgICAgLy8gaXRzIGNvbnRlbnRzLCBhZnRlciBjaGVja2luZyB0byBzZWUgdGhhdAotICAgICAgICAgICAgLy8gdGhlcmUgaXMgb25lCi0gICAgICAgICAgICBpZiAoYm9keS5oYXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgU09BUEZhdWx0IG5ld0ZhdWx0ID0gYm9keS5nZXRGYXVsdCgpOwotCi0gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZmF1bHQgY29kZQotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmV3RmF1bHQuZ2V0RmF1bHRDb2RlQXNOYW1lKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmV3RmF1bHQuZ2V0RmF1bHRTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXdGYXVsdC5nZXRGYXVsdEFjdG9yKCkpOwotICAgICAgICAgICAgICAgIERldGFpbCBuZXdEZXRhaWwgPSBuZXdGYXVsdC5nZXREZXRhaWwoKTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXdEZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBlbnRyaWVzID0gbmV3RGV0YWlsLmdldERldGFpbEVudHJpZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbEVudHJ5IG5ld0VudHJ5ID0gKERldGFpbEVudHJ5KWVudHJpZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbmV3RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmF1bHRBY3RvcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gbXNnLmdldFNPQVBCb2R5KCkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIHNmLnNldEZhdWx0QWN0b3IoIi9mYXVsdEFjdG9yVVJJIik7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdEFjdG9yKCIvZmF1bHRBY3RvclVSSTIiKTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZi5nZXRGYXVsdEFjdG9yKCk7Ci0KLSAgICAgICAgICAgIGlmICghcmVzdWx0LmVxdWFscygiL2ZhdWx0QWN0b3JVUkkyIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJGYXVsdCBBY3RvciBub3QgcHJvcGVybHkgc2V0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGYXVsdFN0cmluZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gbXNnLmdldFNPQVBCb2R5KCkuYWRkRmF1bHQoKTsKLQotICAgICAgICAgICAgc2Yuc2V0RmF1bHRTdHJpbmcoIjFzdCBGYXVsdCBTdHJpbmciKTsKLSAgICAgICAgICAgIHNmLnNldEZhdWx0U3RyaW5nKCIybmQgRmF1bHQgU3RyaW5nIik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2YuZ2V0RmF1bHRTdHJpbmcoKTsKLQotICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXF1YWxzKCIybmQgRmF1bHQgU3RyaW5nIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJGYXVsdCBTdHJpbmcgbm90IHByb3Blcmx5IHNldCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kU3ViQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2V4YW1wbGUuY29tIiwgIm15ZmF1bHQxIiwgImZsdDEiKTsKLSAgICAgICAgc29hcEZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShxbmFtZSk7Ci0KLSAgICAgICAgUU5hbWUgcW5hbWUyID0gbmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZTIuY29tIiwgIm15ZmF1bHQyIiwgImZsdDIiKTsKLSAgICAgICAgc29hcEZhdWx0LmFwcGVuZEZhdWx0U3ViY29kZShxbmFtZTIpOwotCi0gICAgICAgIFFOYW1lIHFuYW1lMyA9IG5ldyBRTmFtZSgiaHR0cDovL2V4YW1wbGUzLmNvbSIsICJteWZhdWx0MyIsICJmbHQzIik7Ci0gICAgICAgIHNvYXBGYXVsdC5hcHBlbmRGYXVsdFN1YmNvZGUocW5hbWUzKTsKLQotICAgICAgICBzb2FwTWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgIEl0ZXJhdG9yIGZhdWx0U3ViQ29kZXMgPSBzb2FwRmF1bHQuZ2V0RmF1bHRTdWJjb2RlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZhdWx0U3ViQ29kZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRGYXVsdFN1YkNvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotCi0gICAgICAgIFFOYW1lIGV4cGVjdGVkMSA9IG5ldyBRTmFtZSgiaHR0cDovL2V4YW1wbGUuY29tIiwgIm15ZmF1bHQxIiwgImZsdDEiKTsKLSAgICAgICAgUU5hbWUgZXhwZWN0ZWQyID0gbmV3IFFOYW1lKCJodHRwOi8vZXhhbXBsZS5jb20iLCAibXlmYXVsdDIiLCAiZmx0MiIpOwotICAgICAgICBib29sZWFuIGZvdW5kMSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kMiA9IGZhbHNlOwotCi0gICAgICAgIC8vQXBwZW5kaW5nIGZhdWx0IFN1YmNvZGUKLSAgICAgICAgc2YuYXBwZW5kRmF1bHRTdWJjb2RlKGV4cGVjdGVkMSk7Ci0gICAgICAgIC8vQXBwZW5kaW5nIGEgc2Vjb25kIGZhdWx0IFN1YmNvZGUKLSAgICAgICAgc2YuYXBwZW5kRmF1bHRTdWJjb2RlKGV4cGVjdGVkMik7Ci0KLSAgICAgICAgLy9HZXR0aW5nIEZhdWx0U3ViQ29kZXMgZnJvbSBTT0FQRmF1bHQKLSAgICAgICAgSXRlcmF0b3IgaSA9IHNmLmdldEZhdWx0U3ViY29kZXMoKTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBRTmFtZSkgewotICAgICAgICAgICAgICAgIFFOYW1lIGFjdHVhbCA9IChRTmFtZSlvOwotICAgICAgICAgICAgICAgIGlmIChhY3R1YWwuZXF1YWxzKGV4cGVjdGVkMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU3ViY29kZT0gJyIrYWN0dWFsKyInIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgYSBkdXBsaWNhdGUgU3ViY29kZSA6JyIrYWN0dWFsKyInIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQyKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kMikgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTdWJjb2RlPSAnIithY3R1YWwrIiciKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJSZWNlaXZlZCBhIGR1cGxpY2F0ZSBTdWJjb2RlIDonIithY3R1YWwrIiciKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA8IDEpIHsKLSAgICAgICAgICAgIGZhaWwoIk5vIFN1YmNvZGUgd2FzIHJldHVybmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPiAyKSB7Ci0gICAgICAgICAgICBmYWlsKCJNb3JlIHRoYW4gdHdvIFN1YmNvZGVzIHdlcmUgcmV0dXJuZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kMSkgewotICAgICAgICAgICAgZmFpbCgiVGhlIGZvbGxvd2luZyBTdWJjb2RlIHdhcyBub3QgcmVjZWl2ZWQ6ICciICsgZXhwZWN0ZWQxICsgIiciKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kMikgewotICAgICAgICAgICAgZmFpbCgiVGhlIGZvbGxvd2luZyBTdWJjb2RlIHdhcyBub3QgcmVjZWl2ZWQ6ICciICsgZXhwZWN0ZWQyICsgIiciKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0RmF1bHRSZWFzb25UZXh0cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgibXlSZWFzb24iLCBuZXcgTG9jYWxlKCJlbiIpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoImRlLW15UmVhc29uIiwgbmV3IExvY2FsZSgiZGUiKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJzaS1teVJlYXNvbiIsIG5ldyBMb2NhbGUoInNpIikpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHJlYXNvblRleHRzID0gc29hcEZhdWx0LmdldEZhdWx0UmVhc29uVGV4dHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWFzb25UZXh0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uVGV4dCA9IChTdHJpbmcpcmVhc29uVGV4dHMubmV4dCgpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVhc29uVGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RBZGRGYXVsdFJlYXNvblRleHQxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIGVudmVsb3BlLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCJjd21wIiwgImh0dHA6Ly9jd21wLmNvbSIpOwotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJteVJlYXNvbiIsIExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgIHNvYXBNZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiBPY2N1cnJlZCA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGYXVsdFJlYXNvblRleHQyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgibXlSZWFzb24iLCBuZXcgTG9jYWxlKCJlbiIpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoImRlLW15UmVhc29uIiwgbmV3IExvY2FsZSgiZGUiKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJzaS1teVJlYXNvbiIsIG5ldyBMb2NhbGUoInNpIikpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIE9jY3VycmVkIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEZhdWx0UmVhc29uVGV4dDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJJdHMgbXkgZmF1bHQgYWdhaW4iOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgc2YuYWRkRmF1bHRSZWFzb25UZXh0KCJJdHMgbXkgZmF1bHQiLCBMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICBzZi5hZGRGYXVsdFJlYXNvblRleHQoZXhwZWN0ZWQsIExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzZi5nZXRGYXVsdFJlYXNvblRleHRzKCk7Ci0gICAgICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsID0gKFN0cmluZylvOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsLmVxdWFscyhleHBlY3RlZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogPCAxKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiTm8gcmVhc29uIHRleHQgd2FzIHJldHVybmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaiA+IDEpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJNb3JlIHRoYW4gb25lIHJlYXNvbiB0ZXh0IHdhcyByZXR1cm5lZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBmb2xsb3dpbmcgUmVhc29uIHRleHQgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZCArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gT2NjdXJyZWQgOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGYXVsdFJlYXNvblRleHQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLSAgICAgICAgU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkMSA9ICJJdHMgbXkgZmF1bHQiOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQyID0gIkl0cyBteSBmYXVsdCBhZ2FpbiI7Ci0KLSAgICAgICAgYm9vbGVhbiBmb3VuZDEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsKLSAgICAgICAgc2YuYWRkRmF1bHRSZWFzb25UZXh0KGV4cGVjdGVkMSwgTG9jYWxlLlVLKTsKLSAgICAgICAgc2YuYWRkRmF1bHRSZWFzb25UZXh0KGV4cGVjdGVkMiwgTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICBJdGVyYXRvciBpID0gc2YuZ2V0RmF1bHRSZWFzb25UZXh0cygpOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWwgPSAoU3RyaW5nKW87Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQxKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQxID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsLmVxdWFscyhleHBlY3RlZDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaisrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqIDwgMSkgewotICAgICAgICAgICAgZmFpbCgiTm8gcmVhc29uIHRleHQgd2FzIHJldHVybmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGogPiAyKSB7Ci0gICAgICAgICAgICBmYWlsKCJNb3JlIHRoYW4gdHdvIHJlYXNvbiB0ZXh0cyB3ZXJlIHJldHVybmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZDEpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoZSBmb2xsb3dpbmcgUmVhc29uIHRleHQgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZDEgKyAiJyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZm91bmQyKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgZm9sbG93aW5nIFJlYXNvbiB0ZXh0IHdhcyBub3QgcmVjZWl2ZWQ6ICciICsgZXhwZWN0ZWQyICsgIiciKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEZhdWx0Um9sZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0Um9sZSgidGVzdCIpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIE9jY3VycmVkIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEZhdWx0Tm9kZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc29hcEZhdWx0LnNldEZhdWx0Tm9kZSgidGVzdCIpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIE9jY3VycmVkIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgX3Rlc3RHZXRGYXVsdFJlYXNvblRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLQotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotCi0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzb2FwUGFydC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgZW52ZWxvcGUuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb24oImN3bXAiLCAiaHR0cDovL2N3bXAuY29tIik7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5hZGRGYXVsdFJlYXNvblRleHQoIm15UmVhc29uIiwgbmV3IExvY2FsZSgiZW4iKSk7Ci0gICAgICAgICAgICBzb2FwRmF1bHQuYWRkRmF1bHRSZWFzb25UZXh0KCJkZS1teVJlYXNvbiIsIG5ldyBMb2NhbGUoImRlIikpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgic2ktbXlSZWFzb24iLCBuZXcgTG9jYWxlKCJzaSIpKTsKLSAgICAgICAgICAgIHNvYXBNZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmYXVsdFJlYXNvblRleHQgPSBzb2FwRmF1bHQuZ2V0RmF1bHRSZWFzb25UZXh0KG5ldyBMb2NhbGUoInNpIikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmYXVsdFJlYXNvblRleHQpOwotICAgICAgICAgICAgZmF1bHRSZWFzb25UZXh0ID0gc29hcEZhdWx0LmdldEZhdWx0UmVhc29uVGV4dChuZXcgTG9jYWxlKCJqYSIpKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwoZmF1bHRSZWFzb25UZXh0KTsKLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0RmF1bHRDb2RlQXNRTmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgc29hcEZhdWx0LmFkZEZhdWx0UmVhc29uVGV4dCgibXlSZWFzb24iLCBuZXcgTG9jYWxlKCJlbiIpKTsKLSAgICAgICAgICAgIHNvYXBGYXVsdC5zZXRGYXVsdENvZGUoIm15Y29kZSIpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBzb2FwRmF1bHQuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChxbmFtZSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEhhc0RldGFpbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBlbnZlbG9wZS5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbigiY3dtcCIsICJodHRwOi8vY3dtcC5jb20iKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgRGV0YWlsIGRldGFpbCA9IHNvYXBGYXVsdC5hZGREZXRhaWwoKTsKLSAgICAgICAgICAgIGRldGFpbC5zZXRBdHRyaWJ1dGUoInRlc3QiLCAibXl2YWx1ZSIpOwotICAgICAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0UmVhc29uTG9jYWxlcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICAvL1NPQVBGYXVsdCBzZiA9IGJvZHkuYWRkRmF1bHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTG9jYWxlIGV4cGVjdGVkMSA9IExvY2FsZS5FTkdMSVNIOwotICAgICAgICAgICAgTG9jYWxlIGV4cGVjdGVkMiA9IExvY2FsZS5VSzsKLSAgICAgICAgICAgIExvY2FsZSBleHBlY3RlZDMgPSBMb2NhbGUuR0VSTUFOOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZDEgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kMyA9IGZhbHNlOwotCi0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KFNPQVBDb25zdGFudHMuU09BUF9SRUNFSVZFUl9GQVVMVCwgIkl0cyBteSBmYXVsdDEiLCBleHBlY3RlZDEpOwotICAgICAgICAgICAgc2YuYWRkRmF1bHRSZWFzb25UZXh0KCJJdHMgbXkgZmF1bHQxIiwgZXhwZWN0ZWQxKTsKLSAgICAgICAgICAgIHNmLmFkZEZhdWx0UmVhc29uVGV4dCgiSXRzIG15IGZhdWx0MiIsIGV4cGVjdGVkMik7Ci0gICAgICAgICAgICBzZi5hZGRGYXVsdFJlYXNvblRleHQoIkl0cyBteSBmYXVsdDMiLCBleHBlY3RlZDMpOwotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNmLmdldEZhdWx0UmVhc29uTG9jYWxlcygpOwotCi0gICAgICAgICAgICBpbnQgbG9jYWxlQ291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxlQ291bnQrKzsKLSAgICAgICAgICAgICAgICBpLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaSA9IHNmLmdldEZhdWx0UmVhc29uTG9jYWxlcygpOwotICAgICAgICAgICAgaW50IGogPSAwOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIExvY2FsZSkgewotICAgICAgICAgICAgICAgICAgICBMb2NhbGUgYWN0dWFsID0gKExvY2FsZSlvOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwuZXF1YWxzKGV4cGVjdGVkMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDEgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsLmVxdWFscyhleHBlY3RlZDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChqIDwgMSkgewotICAgICAgICAgICAgICAgIGZhaWwoIk5vIHJlYXNvbiB0ZXh0IHdhcyByZXR1cm5lZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogPiAzKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiTW9yZSB0aGFuIDMgTG9jYWxlcyB3ZXJlIHJldHVybmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kMSkgewotICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBmb2xsb3dpbmcgTG9jYWxlIHdhcyBub3QgcmVjZWl2ZWQ6ICciICsgZXhwZWN0ZWQxICsgIiciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQyKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVGhlIGZvbGxvd2luZyBMb2NhbGUgd2FzIG5vdCByZWNlaXZlZDogJyIgKyBleHBlY3RlZDIgKyAiJyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZDMpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJUaGUgZm9sbG93aW5nIExvY2FsZSB3YXMgbm90IHJlY2VpdmVkOiAnIiArIGV4cGVjdGVkMyArICInIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdFN0cmluZ0xvY2FsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIC8vU2V0dGluZyBmYXVsdCBzdHJpbmcgd2l0aCBubyBMb2NhbGUKLSAgICAgICAgICAgIHNmLnNldEZhdWx0U3RyaW5nKCJ0aGlzIGlzIHRoZSBmYXVsdCBzdHJpbmciKTsKLSAgICAgICAgICAgIExvY2FsZSByZXN1bHQgPSBzZi5nZXRGYXVsdFN0cmluZ0xvY2FsZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdFN0cmluZ0xvY2FsZTIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotCi0gICAgICAgICAgICBzZi5zZXRGYXVsdFN0cmluZygidGhpcyBpcyB0aGUgZmF1bHQgc3RyaW5nIik7Ci0gICAgICAgICAgICBMb2NhbGUgcmVzdWx0ID0gc2YuZ2V0RmF1bHRTdHJpbmdMb2NhbGUoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmVxdWFscyhMb2NhbGUuZ2V0RGVmYXVsdCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGYXVsdFN0cmluZ0xvY2FsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIExvY2FsZSBleHBlY3RlZCA9IExvY2FsZS5FTkdMSVNIOwotICAgICAgICAgICAgc2Yuc2V0RmF1bHRTdHJpbmcoInRoaXMgaXMgdGhlIGZhdWx0IHN0cmluZyIsIGV4cGVjdGVkKTsKLSAgICAgICAgICAgIExvY2FsZSByZXN1bHQgPSBzZi5nZXRGYXVsdFN0cmluZ0xvY2FsZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZXF1YWxzKGV4cGVjdGVkKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0Q29kZVdpdGhQcmVmaXgxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0gZmFjLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gYm9keS5hZGRGYXVsdCgpOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gIndzbzIiOwotICAgICAgICAgICAgc2Yuc2V0RmF1bHRDb2RlKHByZWZpeCArICI6U2VydmVyIik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2YuZ2V0RmF1bHRDb2RlKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXggKyAiOlNlcnZlciIsIHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGYXVsdENvZGVXaXRoUHJlZml4MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAid3NvMiI7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdENvZGUocHJlZml4ICsgIjpTZXJ2ZXIiKTsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBzZi5nZXRGYXVsdENvZGUoKTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeCArICI6U2VydmVyIiwgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEdldEZhdWx0Q29kZUFzTmFtZTEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGZhYy5jcmVhdGVGYXVsdCgpOwotCi0gICAgICAgICAgICBOYW1lIG5hbWUgPSBmYWMuY3JlYXRlTmFtZSgibXlmYXVsdCIsICJmbHQiLCAiaHR0cDovL2V4YW1wbGUuY29tIik7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdENvZGUobmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5hbWUgbmFtZTIgPSBzZi5nZXRGYXVsdENvZGVBc05hbWUoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZTIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5hbWUyLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFByZWZpeCgpLCBuYW1lMi5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRVUkkoKSwgbmFtZTIuZ2V0VVJJKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBRTmFtZSBuYW1lMyA9IHNmLmdldEZhdWx0Q29kZUFzUU5hbWUoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZTMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxOYW1lKCksIG5hbWUzLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFByZWZpeCgpLCBuYW1lMy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRVUkkoKSwgbmFtZTMuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldEdldEZhdWx0Q29kZUFzTmFtZTIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRTmFtZSBxbmFtZSA9IFNPQVBDb25zdGFudHMuU09BUF9TRU5ERVJfRkFVTFQ7Ci0gICAgICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIE5hbWUgbmFtZSA9IGZhYy5jcmVhdGVOYW1lKHFuYW1lLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWUuZ2V0UHJlZml4KCksIHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgIFNPQVBGYXVsdCBzZiA9IGZhYy5jcmVhdGVGYXVsdCgpOwotICAgICAgICAgICAgc2Yuc2V0RmF1bHRDb2RlKG5hbWUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBOYW1lIG5hbWUyID0gc2YuZ2V0RmF1bHRDb2RlQXNOYW1lKCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUyKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldExvY2FsTmFtZSgpLCBuYW1lMi5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRQcmVmaXgoKSwgbmFtZTIuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0VVJJKCksIG5hbWUyLmdldFVSSSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUU5hbWUgbmFtZTMgPSBzZi5nZXRGYXVsdENvZGVBc1FOYW1lKCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldExvY2FsTmFtZSgpLCBuYW1lMy5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRQcmVmaXgoKSwgbmFtZTMuZ2V0UHJlZml4KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0VVJJKCksIG5hbWUzLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXRGYXVsdENvZGVBc1FOYW1lMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTT0FQRmFjdG9yeSBmYWMgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8xX1BST1RPQ09MKTsKLSAgICAgICAgU09BUEZhdWx0IHNmID0gZmFjLmNyZWF0ZUZhdWx0KCk7Ci0KLSAgICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL2V4YW1wbGUuY29tIiwgIm15ZmF1bHQiLCAiZmx0Iik7Ci0gICAgICAgIHNmLnNldEZhdWx0Q29kZShuYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFFOYW1lIG5hbWUyID0gc2YuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWUyLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUyLmdldFByZWZpeCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIG5hbWUyLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgCi0gICAgICAgIE5hbWUgbmFtZTMgPSBzZi5nZXRGYXVsdENvZGVBc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lMyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpLCBuYW1lMy5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFByZWZpeCgpLCBuYW1lMy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lMy5nZXRVUkkoKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0RmF1bHRDb2RlQXNRTmFtZTIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBRTmFtZSBuYW1lID0gU09BUENvbnN0YW50cy5TT0FQX1NFTkRFUl9GQVVMVDsKLSAgICAgICAgICAgIFNPQVBGYWN0b3J5IGZhYyA9IFNPQVBGYWN0b3J5Lm5ld0luc3RhbmNlKFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpOwotICAgICAgICAgICAgU09BUEZhdWx0IHNmID0gZmFjLmNyZWF0ZUZhdWx0KCk7Ci0gICAgICAgICAgICBzZi5zZXRGYXVsdENvZGUobmFtZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFFOYW1lIG5hbWUyID0gc2YuZ2V0RmF1bHRDb2RlQXNRTmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChuYW1lMik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXRMb2NhbFBhcnQoKSwgbmFtZTIuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0UHJlZml4KCksIG5hbWUyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lMi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE5hbWUgbmFtZTMgPSBzZi5nZXRGYXVsdENvZGVBc05hbWUoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobmFtZTMpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWUzLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLmdldFByZWZpeCgpLCBuYW1lMy5nZXRQcmVmaXgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbmFtZTMuZ2V0VVJJKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmF1bHQxMkRlZmF1bHRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmYXVsdC5nZXRGYXVsdENvZGVBc1FOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmYXVsdC5nZXRGYXVsdFN0cmluZygpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZhdWx0MTFEZWZhdWx0cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1lc3NhZ2VGYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICAgICAgU09BUEZhdWx0IGZhdWx0ID0gYm9keS5hZGRGYXVsdCgpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZhdWx0LmdldEZhdWx0Q29kZUFzUU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZhdWx0LmdldEZhdWx0U3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQSGVhZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTM0NTQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUEhlYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlckVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUFBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuVGV4dDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFNPQVBIZWFkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAgIHByaXZhdGUgTWVzc2FnZUZhY3RvcnkgbWYgPSBudWxsOwotICAgIHByaXZhdGUgU09BUE1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBQYXJ0IHNwID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyIGhkciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTT0FQSGVhZGVyRWxlbWVudCBzaGUxID0gbnVsbDsKLSAgICBwcml2YXRlIFNPQVBIZWFkZXJFbGVtZW50IHNoZTIgPSBudWxsOwotCi0gICAgcHVibGljIFNPQVBIZWFkZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRIZWFkZXJFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzb2FwTWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc29hcEVudi5nZXRIZWFkZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhlYWRlci5hZGRDaGlsZEVsZW1lbnQoImVieG1sbXMxIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUgaW5zdGFuY2VvZiBTT0FQRXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoaGVhZGVyLmFkZENoaWxkRWxlbWVudCgiZWJ4bWxtczEiLCAibnMtcHJlZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdC5hcGFjaGUub3JnIikgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRWxlbWVudCk7Ci0gICAgICAgICgoU09BUEhlYWRlckVsZW1lbnQpaGVhZGVyLmdldEZpcnN0Q2hpbGQoKSkuYWRkVGV4dE5vZGUoInRlc3QgYWRkIik7Ci0KLQotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIHNvYXBFbnYuY3JlYXRlTmFtZSgiZWJ4bWxtczIiLCAibnMtcHJlZml4IiwgImh0dHA6Ly90ZXN0Mi5hcGFjaGUub3JnIikpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBQcmVmaXhlZFFOYW1lKCJodHRwOi8vdGVzdDMuYXBhY2hlLm9yZyIsICJlYnhtbG1zMyIsICJucy1wcmVmaXgiKSkgIT0gbnVsbCk7Ci0KLQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBmaXJzdENoaWxkID0gKFNPQVBIZWFkZXJFbGVtZW50KWhlYWRlci5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZWJ4bWxtczEiLCBmaXJzdENoaWxkLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJucy1wcmVmaXgiLCBmaXJzdENoaWxkLmdldFByZWZpeCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdC5hcGFjaGUub3JnIiwgZmlyc3RDaGlsZC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc2Vjb25kQ2hpbGQgPSAoU09BUEhlYWRlckVsZW1lbnQpZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImVieG1sbXMyIiwgc2Vjb25kQ2hpbGQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5zLXByZWZpeCIsIHNlY29uZENoaWxkLmdldFByZWZpeCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vdGVzdDIuYXBhY2hlLm9yZyIsIHNlY29uZENoaWxkLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBsYXN0Q2hpbGQgPSAoU09BUEhlYWRlckVsZW1lbnQpaGVhZGVyLmdldExhc3RDaGlsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImVieG1sbXMzIiwgbGFzdENoaWxkLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJucy1wcmVmaXgiLCBsYXN0Q2hpbGQuZ2V0UHJlZml4KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0My5hcGFjaGUub3JnIiwgbGFzdENoaWxkLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBmb3VydGhDaGlsZCA9IChTT0FQSGVhZGVyRWxlbWVudClsYXN0Q2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZWJ4bWxtczIiLCBmb3VydGhDaGlsZC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygibnMtcHJlZml4IiwgZm91cnRoQ2hpbGQuZ2V0UHJlZml4KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0Mi5hcGFjaGUub3JnIiwgZm91cnRoQ2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaGVhZGVyLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgaW50IG51bU9mSGVhZGVyRWxlbWVudHMgPSAwOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobyBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGVsID0gKFNPQVBIZWFkZXJFbGVtZW50KW87Ci0gICAgICAgICAgICBTdHJpbmcgbE5hbWUgPSBlbC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobE5hbWUuZXF1YWxzKCJlYnhtbG1zIiArICsrbnVtT2ZIZWFkZXJFbGVtZW50cykpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBudW1PZkhlYWRlckVsZW1lbnRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVycygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBtZXNzYWdlIGZhY3RvcnkgYW5kIFNPQVAgZmFjdG9yeQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWVzc2FnZUZhY3RvcnkgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBtZXNzYWdlCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIFNPQVAgaGVhZGVyIGZyb20gdGhlIG1lc3NhZ2UgYW5kCi0gICAgICAgICAgICAvLyAgYWRkIGhlYWRlcnMgdG8gaXQKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gbWVzc2FnZS5nZXRTT0FQSGVhZGVyKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lU3BhY2UgPSAibnMiOwotICAgICAgICAgICAgU3RyaW5nIG5hbWVTcGFjZVVSSSA9ICJodHRwOi8vZ2l6bW9zLmNvbS9OU1VSSSI7Ci0KLSAgICAgICAgICAgIE5hbWUgb3JkZXIgPQotICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJvcmRlckRlc2siLCBuYW1lU3BhY2UsIG5hbWVTcGFjZVVSSSk7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBvcmRlckhlYWRlciA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KG9yZGVyKTsKLSAgICAgICAgICAgIG9yZGVySGVhZGVyLnNldEFjdG9yKCJodHRwOi8vZ2l6bW9zLmNvbS9vcmRlcnMiKTsKLQotICAgICAgICAgICAgTmFtZSBzaGlwcGluZyA9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoInNoaXBwaW5nRGVzayIsIG5hbWVTcGFjZSwgbmFtZVNwYWNlVVJJKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IHNoaXBwaW5nSGVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoc2hpcHBpbmcpOwotICAgICAgICAgICAgc2hpcHBpbmdIZWFkZXIuc2V0QWN0b3IoImh0dHA6Ly9naXptb3MuY29tL3NoaXBwaW5nIik7Ci0KLSAgICAgICAgICAgIE5hbWUgY29uZmlybWF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiY29uZmlybWF0aW9uRGVzayIsIG5hbWVTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VVUkkpOwotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgY29uZmlybWF0aW9uSGVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoY29uZmlybWF0aW9uKTsKLSAgICAgICAgICAgIGNvbmZpcm1hdGlvbkhlYWRlci5zZXRBY3RvcigiaHR0cDovL2dpem1vcy5jb20vY29uZmlybWF0aW9ucyIpOwotCi0gICAgICAgICAgICBOYW1lIGJpbGxpbmcgPQotICAgICAgICAgICAgICAgICAgICBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJiaWxsaW5nRGVzayIsIG5hbWVTcGFjZSwgbmFtZVNwYWNlVVJJKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGJpbGxpbmdIZWFkZXIgPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudChiaWxsaW5nKTsKLSAgICAgICAgICAgIGJpbGxpbmdIZWFkZXIuc2V0QWN0b3IoImh0dHA6Ly9naXptb3MuY29tL2JpbGxpbmciKTsKLQotICAgICAgICAgICAgLy8gQWRkIGhlYWRlciB3aXRoIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZQotICAgICAgICAgICAgTmFtZSB0TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlRyYW5zYWN0aW9uIiwgInQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZ2l6bW9zLmNvbS9vcmRlcnMiKTsKLQotICAgICAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgdHJhbnNhY3Rpb24gPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudCh0TmFtZSk7Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbi5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9uLmFkZFRleHROb2RlKCI1Iik7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgU09BUCBib2R5IGZyb20gdGhlIG1lc3NhZ2UgYnV0IGxlYXZlCi0gICAgICAgICAgICAvLyBpdCBlbXB0eQotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLQotICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICAvLyBEaXNwbGF5IHRoZSBtZXNzYWdlIHRoYXQgd291bGQgYmUgc2VudAotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlxuLS0tLS0gUmVxdWVzdCBNZXNzYWdlIC0tLS1cbiIpOwotICAgICAgICAgICAgLy9tZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7Ci0KLSAgICAgICAgICAgIC8vIExvb2sgYXQgdGhlIGhlYWRlcnMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGFsbEhlYWRlcnMgPSBoZWFkZXIuZXhhbWluZUFsbEhlYWRlckVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChhbGxIZWFkZXJzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IGhlYWRlckVsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKFNPQVBIZWFkZXJFbGVtZW50KWFsbEhlYWRlcnMubmV4dCgpOwotICAgICAgICAgICAgICAgIE5hbWUgaGVhZGVyTmFtZSA9IGhlYWRlckVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiXG5IZWFkZXIgbmFtZSBpcyAiICsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkFjdG9yIGlzICIgKyBoZWFkZXJFbGVtZW50LmdldEFjdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJtdXN0VW5kZXJzdGFuZCBpcyAiICsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGVtZW50LmdldE11c3RVbmRlcnN0YW5kKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRW5leHBlY3RlZCBFeGNlcHRpb24gIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbXNnID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIGVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgaGRyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4YW1pbmVIZWFkZXIoKSB7Ci0gICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IHNoZSA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNoZTEgPSBoZHIuYWRkSGVhZGVyRWxlbWVudChlbnZlbG9wZS5jcmVhdGVOYW1lKCJmb28xIiwgImYxIiwgImZvbzEtVVJJIikpOwotICAgICAgICAgICAgc2hlMS5zZXRBY3RvcigiYWN0b3ItVVJJIik7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGhkci5leGFtaW5lQWxsSGVhZGVyRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGludCBjbnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzaGUuZXF1YWxzKHNoZTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIlNPQVAgSGVhZGVyIEVsZW1lbnRzIGRvIG5vdCBtYXRjaCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNudCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU09BUEhlYWRlckVsZW1lbnQgY291bnQgbWlzbWF0Y2g6IGV4cGVjdGVkIDEsIHJlY2VpdmVkICIgKyBjbnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpdGVyYXRvciA9IGhkci5leGFtaW5lQWxsSGVhZGVyRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgibm8gZWxlbWVudHMgaW4gaXRlcmF0b3IgLSB1bmV4cGVjdGVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTm90VW5kZXJzdG9vZEhlYWRlckVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc29hcEVudi5nZXRIZWFkZXIoKTsKLQotICAgICAgICBTT0FQRWxlbWVudCBzb2FwRWxlbWVudCA9IGhlYWRlci5hZGROb3RVbmRlcnN0b29kSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoImh0dHA6Ly9mb28ub3JnIiwgImZvbyIsICJmIikpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoc29hcEVsZW1lbnQpOwotICAgICAgICBOYW1lIG5hbWUgPSBzb2FwRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICBTdHJpbmcgdXJpID0gbmFtZS5nZXRVUkkoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG5hbWUuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSwgdXJpKTsKLSAgICAgICAgLy9WYWxpZGF0ZSB0aGUgTG9jYWxOYW1lIHdoaWNoIG11c3QgYmUgTm90VW5kZXJzdG9vZAotICAgICAgICBhc3NlcnRFcXVhbHMoIk5vdFVuZGVyc3Rvb2QiLCBsb2NhbE5hbWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFVwZ3JhZGVIZWFkZXJFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgc29hcEVudiA9Ci0gICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyIGhlYWRlciA9IHNvYXBFbnYuZ2V0SGVhZGVyKCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgVVJJcy4KLSAgICAgICAgQXJyYXlMaXN0IHN1cHBvcnRlZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgc3VwcG9ydGVkLmFkZChTT0FQQ29uc3RhbnRzLlVSSV9OU19TT0FQXzFfMl9FTlZFTE9QRSk7Ci0gICAgICAgIHN1cHBvcnRlZC5hZGQoU09BUENvbnN0YW50cy5VUklfTlNfU09BUF9FTlZFTE9QRSk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgc29hcEVsZW1lbnQgPSBoZWFkZXIuYWRkVXBncmFkZUhlYWRlckVsZW1lbnQoc3VwcG9ydGVkLml0ZXJhdG9yKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBFbGVtZW50KTsKLSAgICAgICAgTmFtZSBuYW1lID0gc29hcEVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IG5hbWUuZ2V0VVJJKCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSBuYW1lLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAgIC8vVmFsaWRhdGUgdGhlIFVSSSB3aGljaCBtdXN0IGJlIFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh1cmkuZXF1YWxzKFNPQVBDb25zdGFudHMuVVJJX05TX1NPQVBfMV8yX0VOVkVMT1BFKSk7Ci0gICAgICAgIGFzc2VydFRydWUobG9jYWxOYW1lLmVxdWFscygiVXBncmFkZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhhbWluZUhlYWRlckVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVBDb25zdGFudHMuU09BUF8xXzJfUFJPVE9DT0wpLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgc29hcEVudiA9Ci0gICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyIGhlYWRlciA9IHNvYXBFbnYuZ2V0SGVhZGVyKCk7Ci0KLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc29hcEhlYWRlckVsZW1lbnQgPQotICAgICAgICAgICAgICAgIGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoImZvbzEiLCAiZjEiLCAiZm9vMS1VUkkiKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5zZXRSb2xlKCJyb2xlLVVSSSIpOwotCi0gICAgICAgIGl0ZXJhdG9yID0gaGVhZGVyLmV4YW1pbmVIZWFkZXJFbGVtZW50cygicm9sZTEtVVJJIik7Ci0KLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnQpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4YW1pbmVIZWFkZXJFbGVtZW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZSBzb2FwRW52ID0KLSAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBIZWFkZXIgaGVhZGVyID0gc29hcEVudi5nZXRIZWFkZXIoKTsKLSAgICAgICAgU09BUEhlYWRlckVsZW1lbnQgc29hcEhlYWRlckVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBBZGQgc29tZSBzb2FwIGhlYWRlciBlbGVtZW50cwotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBoZWFkZXIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiSGVhZGVyMSIsICJwcmVmaXgiLCAiaHR0cDovL215dXJpIikpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBIZWFkZXIxIik7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudCA9IChTT0FQSGVhZGVyRWxlbWVudClzZTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50LnNldE11c3RVbmRlcnN0YW5kKHRydWUpOwotCi0gICAgICAgICAgICBzZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJIZWFkZXIyIiwgInByZWZpeCIsICJodHRwOi8vbXl1cmkiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjIiKTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50ID0gKFNPQVBIZWFkZXJFbGVtZW50KXNlOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuc2V0TXVzdFVuZGVyc3RhbmQoZmFsc2UpOwotCi0gICAgICAgICAgICBzZSA9IGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJIZWFkZXIzIiwgInByZWZpeCIsICJodHRwOi8vbXl1cmkiKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjMiKTsKLSAgICAgICAgICAgIHNvYXBIZWFkZXJFbGVtZW50ID0gKFNPQVBIZWFkZXJFbGVtZW50KXNlOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNlID0gaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkhlYWRlcjQiLCAicHJlZml4IiwgImh0dHA6Ly9teXVyaSIpKQotICAgICAgICAgICAgICAgICAgICAuYWRkVGV4dE5vZGUoIlRoaXMgaXMgSGVhZGVyNCIpOwotICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQgPSAoU09BUEhlYWRlckVsZW1lbnQpc2U7Ci0gICAgICAgICAgICBzb2FwSGVhZGVyRWxlbWVudC5zZXRNdXN0VW5kZXJzdGFuZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaGVhZGVyLmV4YW1pbmVBbGxIZWFkZXJFbGVtZW50cygpOwotCi0gICAgICAgICAgICAvL3ZhbGlkYXRpbmcgSXRlcmF0b3IgY291bnQgLi4uLiBzaG91bGQgYmUgNCIpOwotICAgICAgICAgICAgaW50IGNudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQgPSAoU09BUEhlYWRlckVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNudCwgNCk7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IGhlYWRlci5leGFtaW5lSGVhZGVyRWxlbWVudHMoU09BUENvbnN0YW50cy5VUklfU09BUF9BQ1RPUl9ORVhUKTsKLSAgICAgICAgICAgIGNudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgY250Kys7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckVsZW1lbnQgPSAoU09BUEhlYWRlckVsZW1lbnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNudCwgMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFFOYW1lc09uSGVhZGVyKCkgewotICAgICAgICBTT0FQSGVhZGVyRWxlbWVudCBoZWFkZXJFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vU09BUDEuMSBhbmQgU09BUDEuMiByZXF1aXJlcyBhbGwgSGVhZGVyRWxlbWVudHMgdG8gYmUgbmFtZXNwYWNlIHF1YWxpZmllZAotICAgICAgICAgICAgLy9UcnkgYWRkaW5nIEhlYWRlckVsZW1lbnQgd2l0aCB1bnF1YWxpZmllZCBRTmFtZSBub3QgYmVsb25naW5nIHRvIGFueSBuYW1lc3BhY2UKLSAgICAgICAgICAgIC8vKGV4cGVjdCBTT0FQRXhjZXB0aW9uKQotICAgICAgICAgICAgaGVhZGVyRWxlbWVudCA9IGhkci5hZGRIZWFkZXJFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoIlRyYW5zYWN0aW9uIikpOwotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleHBlY3RlZCBTT0FQRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9EaWQgdGhyb3cgZXhwZWN0ZWQgU09BUEV4Y2VwdGlvbgotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZENoaWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBIZWFkZXIgc29hcEhlYWRlciA9IG1lc3NhZ2UuZ2V0U09BUEhlYWRlcigpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNvYXBIZWFkZXIuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc29hcEhlYWRlci5nZXRDaGlsZEVsZW1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgCi0gICAgICAgIERvY3VtZW50IGRvYyA9IHNvYXBIZWFkZXIuZ2V0T3duZXJEb2N1bWVudCgpOyAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL2V4YW1wbGUuY29tIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9ICJHZXRMYXN0VHJhZGVQcmljZSI7Ci0gICAgICAgIEVsZW1lbnQgZ2V0TGFzdFRyYWRlUHJpY2UgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsgICAgICAgIAotICAgICAgICBFbGVtZW50IHN5bWJvbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzeW1ib2wiKTsKLSAgICAgICAgc3ltYm9sLnNldEF0dHJpYnV0ZSgiZm9vIiwgImJhciIpOwotICAgICAgICBnZXRMYXN0VHJhZGVQcmljZS5hcHBlbmRDaGlsZChzeW1ib2wpOwotICAgICAgICBvcmcudzNjLmRvbS5UZXh0IGRlZiA9IGRvYy5jcmVhdGVUZXh0Tm9kZSgiREVGIik7Ci0gICAgICAgIHN5bWJvbC5hcHBlbmRDaGlsZChkZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIHNvYXBIZWFkZXIuYXBwZW5kQ2hpbGQoZ2V0TGFzdFRyYWRlUHJpY2UpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc29hcEhlYWRlci5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBJdGVyYXRvciBpdGVyID0gc29hcEhlYWRlci5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoaXRlci5oYXNOZXh0KCkpOyAKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICAvLyBtdXN0IGJlIFNPQVBIZWFkZXJFbGVtZW50Ci0gICAgICAgIGFzc2VydFRydWUob2JqIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOyAgCi0gICAgICAgIFNPQVBFbGVtZW50IHNvYXBFbGVtZW50ID0gKFNPQVBFbGVtZW50KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWVzcGFjZSwgc29hcEVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxOYW1lLCBzb2FwRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFNPQVBFbGVtZW50KTsgIAotICAgICAgICBzb2FwRWxlbWVudCA9IChTT0FQRWxlbWVudClvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBzb2FwRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic3ltYm9sIiwgc29hcEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZShpdGVyLmhhc05leHQoKSk7Ci0gICAgICAgIAotICAgICAgICBpdGVyID0gc29hcEVsZW1lbnQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBhc3NlcnRUcnVlKGl0ZXIuaGFzTmV4dCgpKTsgCi0gICAgICAgIG9iaiA9IGl0ZXIubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKG9iaiBpbnN0YW5jZW9mIFRleHQpOyAgCi0gICAgICAgIFRleHQgdGV4dCA9IChUZXh0KW9iajsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUYiLCB0ZXh0LmdldERhdGEoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsgICAKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTWVzc2FnZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovU09BUE1lc3NhZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODczMGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTWVzc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNhYWoudXRpbC5TQUFKRGF0YVNvdXJjZTsKLQotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBTT0FQTWVzc2FnZSBtc2c7Ci0KLS8vICAgIHN0YXRpYyBpbnQgcG9ydDsKLS8vICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgU0VSVklDRV9OQU1FID0gbmV3IFFOYW1lKCJFY2hvIik7Ci0vLyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIE9QRVJBVElPTl9OQU1FID0gbmV3IFFOYW1lKCJlY2hvIik7Ci0vLwotLy8gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FBSl9SRVBPID0KLS8vICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvc2Fhai1yZXBvIjsKLS8vCi0vLyAgICBwdWJsaWMgU09BUE1lc3NhZ2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0vLyAgICAgICAgc3VwZXIobmFtZSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKLS8vICAgICAgICByZXR1cm4gImh0dHA6Ly8xMjcuMC4wLjE6IiArCi0vLyAgICAgICAgICAgICAgICBwb3J0ICsKLS8vICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvRWNobyI7Ci0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLS8vICAgICAgICByZXR1cm4gbmV3IFRlc3RTZXR1cChuZXcgVGVzdFN1aXRlKEludGVncmF0aW9uVGVzdC5jbGFzcykpIHsKLS8vICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgICAgIHBvcnQgPSBVdGlsU2VydmVyLnN0YXJ0KFNBQUpfUkVQTyk7Ci0vLyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgZW5lYmxlbXRvbSA9IG5ldyBQYXJhbWV0ZXIoImVuYWJsZU1UT00iLCAidHJ1ZSIpOwotLy8gICAgICAgICAgICAgICAgVXRpbFNlcnZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcmFtZXRlcihlbmVibGVtdG9tKTsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICAgICAgICAgIFV0aWxTZXJ2ZXIuc3RvcCgpOwotLy8gICAgICAgICAgICB9Ci0vLyAgICAgICAgfTsKLS8vICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgZmluYWwgQXhpc1NlcnZpY2Ugc2VydmljZSA9IFV0aWxzLmNyZWF0ZVNpbXBsZVNlcnZpY2UoU0VSVklDRV9OQU1FLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG9TZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVSQVRJT05fTkFNRSk7Ci0vLyAgICAgICAgVXRpbFNlcnZlci5kZXBsb3lTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0KLS8vICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UoU0VSVklDRV9OQU1FKTsKLS8vICAgICAgICBVdGlsU2VydmVyLnVuRGVwbG95Q2xpZW50U2VydmljZSgpOwotLy8gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmVSZXF1aXJlZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlNhdmUgUmVxdWlyZWQgaXMgRmFsc2UiLCBtc2cuc2F2ZVJlcXVpcmVkKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZVJlcXVpcmVkMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1zZy5zYXZlQ2hhbmdlcygpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlNhdmUgUmVxdWlyZWQgaXMgVHJ1ZSIsIG1zZy5zYXZlUmVxdWlyZWQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dGFjaGVtZW50cygpIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotICAgICAgICBBdHRhY2htZW50UGFydCBhcDEgPSBudWxsOwotICAgICAgICBBdHRhY2htZW50UGFydCBhcDIgPSBudWxsOwotICAgICAgICBBdHRhY2htZW50UGFydCBhcDMgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIC8vTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcFBhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQRmF1bHQgc2YgPSBib2R5LmFkZEZhdWx0KCk7Ci0KLQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4xID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90YXJnZXQvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiYXR0YWNoLnhtbCIpKTsKLSAgICAgICAgICAgIGFwMSA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChpbjEsICJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwMSk7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluMiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImF4aXMyLnhtbCIpKTsKLSAgICAgICAgICAgIGFwMiA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChpbjIsICJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwMik7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluMyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArCi0gICAgICAgICAgICAgICAgICAgICIvdGFyZ2V0L3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgImF4aXMyLnhtbCIpKTsKLSAgICAgICAgICAgIGFwMyA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChpbjMsICJ0ZXh0L3BsYWluIik7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAzKTsKLQotICAgICAgICAgICAgLy9nZXQgYWxsIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBpdGVyYXRvciA9IG1zZy5nZXRBdHRhY2htZW50cygpOwotCi0gICAgICAgICAgICBpbnQgY250ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBjbnQrKzsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY250LCAzKTsKLSAgICAgICAgICAgIC8vcmVtb3ZlIGp1c3QgdGhlIHRleHQveG1sIGF0dGFjaG1lbnRzCi0gICAgICAgICAgICBNaW1lSGVhZGVycyBtaHMgPSBuZXcgTWltZUhlYWRlcnMoKTsKLSAgICAgICAgICAgIG1ocy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgbXNnLnJlbW92ZUF0dGFjaG1lbnRzKG1ocyk7Ci0KLSAgICAgICAgICAgIC8vZ2V0IGFsbCBhdHRhY2htZW50cwotICAgICAgICAgICAgaXRlcmF0b3IgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgICAgIGNudCA9IDA7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG1zZy5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjbnQsIDEpOwotICAgICAgICAgICAgaXRlcmF0b3IgPSBtc2cuZ2V0QXR0YWNobWVudHMoKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gKEF0dGFjaG1lbnRQYXJ0KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBjdHlwZSA9IGFwLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGN0eXBlLmVxdWFscygidGV4dC9wbGFpbiIpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoU09BUENvbnN0YW50cy5TT0FQXzFfMl9QUk9UT0NPTCk7Ci0gICAgICAgICAgICAvL01lc3NhZ2VGYWN0b3J5IGZhYyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBmYWMuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtc2cuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IHNvYXBQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotCi0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDsKLQotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAgICAgICAgICJhdHRhY2gueG1sIikpOwotICAgICAgICAgICAgYXAgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQoaW5wdXRTdHJlYW0sICJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgRGF0YUhhbmRsZXIgZGggPQotICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YUhhbmRsZXIobmV3IFNBQUpEYXRhU291cmNlKGlucHV0U3RyZWFtLCAxMDAwLCAidGV4dC94bWwiLCB0cnVlKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYjEgPSBjb3B5VG9CdWZmZXIoZGguZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFwKTsKLQotICAgICAgICAgICAgLy9WZXJpZnkgYXR0YWNobWVudCBwYXJ0IGlzIG5vdCBlbXB0eSBhbmQgY29udGVudHMgYXJlIGNvcnJlY3QKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBhcC5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwobyk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJlYW1Tb3VyY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyZWFtU291cmNlIHNzID0gKFN0cmVhbVNvdXJjZSlvOwotICAgICAgICAgICAgICAgICAgICBpcyA9IHNzLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbCgiZ290IG9iamVjdDogIiArIG8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGV4cGVjdGVkIG9iamVjdDogamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiYXR0YWNobWVudCBoYXMgbm8gY29udGVudCAtIHVuZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBjb3B5VG9CdWZmZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHM7Ci0gICAgICAgICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHN0cmluZ1dyaXRlci53cml0ZShzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZ1dyaXRlci5nZXRCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBEbyBub3QgYWRkIHRoaXMgdGVzdCB1bmxlc3MgYmVsb3cgbWVudGlvbmVkIHJlc291cmNlcyBhcmUgYWNjZXNzaWJsZQotICAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0QXR0YWNobWVudHNCeUhSRUYoKSB7Ci0gICAgICAgIFN0cmluZyBOU19QUkVGSVggPSAibXlwcmUiOwotICAgICAgICBTdHJpbmcgTlNfVVJJID0gImh0dHA6Ly9teXVyaS5vcmcvIjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy9NZXNzYWdlRmFjdG9yeSBmYWMgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZShTT0FQQ29uc3RhbnRzLlNPQVBfMV8yX1BST1RPQ09MKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAvLyBNZXNzYWdlIGNyZWF0aW9uIHRha2VzIGNhcmUgb2YgY3JlYXRpbmcgdGhlIFNPQVBQYXJ0IC0gYQotICAgICAgICAgICAgLy8gcmVxdWlyZWQgcGFydCBvZiB0aGUgbWVzc2FnZSBhcyBwZXIgdGhlIFNPQVAgMS4xIHNwZWMuCi0gICAgICAgICAgICBTT0FQUGFydCBzcCA9IG1zZy5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc3AuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGRyID0gZW52ZWxvcGUuZ2V0SGVhZGVyKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBiZHkgPSBlbnZlbG9wZS5nZXRCb2R5KCk7Ci0gICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2JlMSA9IGJkeS5hZGRCb2R5RWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiQm9keTEiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotICAgICAgICAgICAgc2JlMS5hZGRDaGlsZEVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIlRoZUdpZkF0dGFjaG1lbnQiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotICAgICAgICAgICAgc2JlMS5zZXRBdHRyaWJ1dGUoImhyZWYiLCAiY2lkOlRIRUdJRiIpOwotICAgICAgICAgICAgU09BUEJvZHlFbGVtZW50IHNiZTIgPSBiZHkuYWRkQm9keUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkJvZHkyIiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLSAgICAgICAgICAgIHNiZTIuYWRkQ2hpbGRFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJUaGVYbWxBdHRhY2htZW50IiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLSAgICAgICAgICAgIHNiZTIuc2V0QXR0cmlidXRlKCJocmVmIiwgImNpZDpUSEVYTUwiKTsKLQotICAgICAgICAgICAgVVJMIHVybDEgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLnhtbCIpOwotICAgICAgICAgICAgVVJMIHVybDIgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLmdpZiIpOwotICAgICAgICAgICAgVVJMIHVybDMgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLnR4dCIpOwotICAgICAgICAgICAgVVJMIHVybDQgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLmh0bWwiKTsKLSAgICAgICAgICAgIFVSTCB1cmw1ID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NPQVBNZXNzYWdlL2F0dGFjaC5qcGVnIik7Ci0KLSAgICAgICAgICAgIC8vQWRkIHZhcmlvdXMgbWltZSB0eXBlIGF0dGFjaG1lbnRzIHRvIFNPQVAgbWVzc2FnZQotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAxID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDIgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDIpKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMyA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgRGF0YUhhbmRsZXIodXJsMykpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXA0ID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmw0KSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDUgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDUpKTsKLQotICAgICAgICAgICAgYXAxLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgYXAxLnNldENvbnRlbnRJZCgiPFRIRVhNTD4iKTsKLSAgICAgICAgICAgIGFwMi5zZXRDb250ZW50VHlwZSgiaW1hZ2UvZ2lmIik7Ci0gICAgICAgICAgICBhcDIuc2V0Q29udGVudElkKCI8VEhFR0lGPiIpOwotICAgICAgICAgICAgYXAzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICAgICAgICBhcDMuc2V0Q29udGVudElkKCI8VEhFUExBSU4+Iik7Ci0gICAgICAgICAgICBhcDQuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgICAgICAgICAgYXA0LnNldENvbnRlbnRJZCgiPFRIRUhUTUw+Iik7Ci0gICAgICAgICAgICBhcDUuc2V0Q29udGVudFR5cGUoImltYWdlL2pwZWciKTsKLSAgICAgICAgICAgIGFwNS5zZXRDb250ZW50SWQoIjxUSEVKUEVHPiIpOwotCi0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAxKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDIpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwMyk7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXA0KTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDUpOwotICAgICAgICAgICAgbXNnLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgICAgIC8vUmV0cmlldmUgYXR0YWNobWVudCB3aXRoIGhyZWY9Y2lkOlRIRUdJRgotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgbXlhcCA9IG1zZy5nZXRBdHRhY2htZW50KHNiZTEpOwotICAgICAgICAgICAgaWYgKG15YXAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZhaWwoIlJldHVybmVkIG51bGwgKHVuZXhwZWN0ZWQpIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFteWFwLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJpbWFnZS9naWYiKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIldyb25nIGF0dGFjaG1lbnQgd2FzIHJldHVybmVkOiBHb3QgQ29udGVudC1UeXBlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbXlhcC5nZXRDb250ZW50VHlwZSgpICsgIiwgRXhwZWN0ZWQgQ29udGVudC1UeXBlIG9mIGltYWdlL2dpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9SZXRyaWV2ZSBhdHRhY2htZW50IHdpdGggaHJlZj1jaWQ6VEhFWE1MCi0gICAgICAgICAgICBteWFwID0gbXNnLmdldEF0dGFjaG1lbnQoc2JlMik7Ci0gICAgICAgICAgICBpZiAobXlhcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiUmV0dXJuZWQgbnVsbCAodW5leHBlY3RlZCkiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW15YXAuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHMoInRleHQveG1sIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJXcm9uZyBhdHRhY2htZW50IHdhcyByZXR1cm5lZDogR290IENvbnRlbnQtVHlwZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG15YXAuZ2V0Q29udGVudFR5cGUoKSArICIsIEV4cGVjdGVkIENvbnRlbnQtVHlwZSBvZiB0ZXh0L3htbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9SZXRyaWV2ZSBhdHRhY2htZW50IHdpdGggaHJlZj1jaWQ6Ym9vLWhvbyAoZXhwZWN0IG51bGwpCi0gICAgICAgICAgICBRTmFtZSBteXFuYW1lID0gbmV3IFFOYW1lKCJib28taG9vIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBteXNlID0gU09BUEZhY3RvcnlJbXBsLm5ld0luc3RhbmNlKCkuY3JlYXRlRWxlbWVudChteXFuYW1lKTsKLSAgICAgICAgICAgIG15c2UuYWRkVGV4dE5vZGUoIjx0aGVCb29Ib29BdHRhY2htZW50IGhyZWY9XCJjaWQ6Ym9vLWhvb1wiLz4iKTsKLSAgICAgICAgICAgIG15YXAgPSBtc2cuZ2V0QXR0YWNobWVudChteXNlKTsKLSAgICAgICAgICAgIGFzc2VydE51bGwobXlhcCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIkVycm9yIDoiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICAqIERvIG5vdCBhZGQgdGhpcyB0ZXN0IHVubGVzcyBiZWxvdyBtZW50aW9uZWQgcmVzb3VyY2VzIGFyZSBhY2Nlc3NpYmxlCi0gICAgICAqLwotICAgIHB1YmxpYyB2b2lkIF90ZXN0R2V0QXR0YWNobWVudEJ5SFJFRjIoKSB7Ci0gICAgICAgIFN0cmluZyBOU19QUkVGSVggPSAibXlwcmUiOwotICAgICAgICBTdHJpbmcgTlNfVVJJID0gImh0dHA6Ly9teXVyaS5vcmcvIjsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIC8vIE1lc3NhZ2UgY3JlYXRpb24gdGFrZXMgY2FyZSBvZiBjcmVhdGluZyB0aGUgU09BUFBhcnQgLSBhCi0gICAgICAgICAgICAvLyByZXF1aXJlZCBwYXJ0IG9mIHRoZSBtZXNzYWdlIGFzIHBlciB0aGUgU09BUCAxLjEgc3BlYy4KLSAgICAgICAgICAgIFNPQVBQYXJ0IHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEhlYWRlciBoZHIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLQotICAgICAgICAgICAgU09BUEJvZHkgYmR5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgU09BUEJvZHlFbGVtZW50IHNiZTEgPSBiZHkuYWRkQm9keUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkJvZHkxIiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLSAgICAgICAgICAgIHNiZTEuYWRkQ2hpbGRFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJUaGVHaWZBdHRhY2htZW50IiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLQotICAgICAgICAgICAgU09BUEJvZHlFbGVtZW50IHNiZTIgPSBiZHkuYWRkQm9keUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkJvZHkyIiwgTlNfUFJFRklYLCBOU19VUkkpKTsKLQotICAgICAgICAgICAgc2JlMi5hZGRDaGlsZEVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIlRoZVhtbEF0dGFjaG1lbnQiLCBOU19QUkVGSVgsIE5TX1VSSSkpOwotCi0gICAgICAgICAgICBVUkwgdXJsMSA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2gueG1sIik7Ci0gICAgICAgICAgICBVUkwgdXJsMiA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2guZ2lmIik7Ci0gICAgICAgICAgICBVUkwgdXJsMyA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2gudHh0Iik7Ci0gICAgICAgICAgICBVUkwgdXJsNCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9TT0FQTWVzc2FnZS9hdHRhY2guaHRtbCIpOwotICAgICAgICAgICAgVVJMIHVybDUgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvU09BUE1lc3NhZ2UvYXR0YWNoLmpwZWciKTsKLQotICAgICAgICAgICAgLy8gU2V0IGhyZWYgb24gYm9keSBlbGVtZW50cyB1c2luZyBDb250ZW50LUxvY2F0aW9uIGhlYWRlcnMgYW5kIHJlbGF0aXZlIFVSSSdzCi0gICAgICAgICAgICBzYmUxLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHVybDIudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzYmUyLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHVybDEudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwMSA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgRGF0YUhhbmRsZXIodXJsMSkpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXAyID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmwyKSk7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhcDMgPSBtc2cuY3JlYXRlQXR0YWNobWVudFBhcnQobmV3IERhdGFIYW5kbGVyKHVybDMpKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwNCA9IG1zZy5jcmVhdGVBdHRhY2htZW50UGFydChuZXcgRGF0YUhhbmRsZXIodXJsNCkpOwotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXA1ID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmw1KSk7Ci0KLSAgICAgICAgICAgIGFwMS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgIGFwMS5zZXRDb250ZW50SWQoIjxUSEVYTUw+Iik7Ci0gICAgICAgICAgICBhcDEuc2V0Q29udGVudExvY2F0aW9uKHVybDEudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBhcDIuc2V0Q29udGVudFR5cGUoImltYWdlL2dpZiIpOwotICAgICAgICAgICAgYXAyLnNldENvbnRlbnRJZCgiPFRIRUdJRj4iKTsKLSAgICAgICAgICAgIGFwMi5zZXRDb250ZW50TG9jYXRpb24odXJsMi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGFwMy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgICAgICAgYXAzLnNldENvbnRlbnRJZCgiPFRIRVBMQUlOPiIpOwotICAgICAgICAgICAgYXAzLnNldENvbnRlbnRMb2NhdGlvbih1cmwzLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYXA0LnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgICAgIGFwNC5zZXRDb250ZW50SWQoIjxUSEVIVE1MPiIpOwotICAgICAgICAgICAgYXA0LnNldENvbnRlbnRMb2NhdGlvbih1cmw0LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYXA1LnNldENvbnRlbnRUeXBlKCJpbWFnZS9qcGVnIik7Ci0gICAgICAgICAgICBhcDUuc2V0Q29udGVudElkKCI8VEhFSlBFRz4iKTsKLSAgICAgICAgICAgIGFwNS5zZXRDb250ZW50TG9jYXRpb24odXJsNS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBhdHRhY2htZW50cyB0byB0aGUgbWVzc2FnZS4KLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDEpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwMik7Ci0gICAgICAgICAgICBtc2cuYWRkQXR0YWNobWVudFBhcnQoYXAzKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcDQpOwotICAgICAgICAgICAgbXNnLmFkZEF0dGFjaG1lbnRQYXJ0KGFwNSk7Ci0gICAgICAgICAgICBtc2cuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAgICAgLy9SZXRyaWV2ZSBhdHRhY2htZW50IHdpdGggaHJlZj1USEVHSUYKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IG15YXAgPSBtc2cuZ2V0QXR0YWNobWVudChzYmUxKTsKLSAgICAgICAgICAgIGlmIChteWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJSZXR1cm5lZCBudWxsICh1bmV4cGVjdGVkKSIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbXlhcC5nZXRDb250ZW50VHlwZSgpLmVxdWFscygiaW1hZ2UvZ2lmIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJXcm9uZyBhdHRhY2htZW50IHdhcyByZXR1cm5lZDogR290IENvbnRlbnQtVHlwZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG15YXAuZ2V0Q29udGVudFR5cGUoKSArICIsIEV4cGVjdGVkIENvbnRlbnQtVHlwZSBvZiBpbWFnZS9naWYiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9SZXRyaWV2ZSBhdHRhY2htZW50IHdpdGggaHJlZj1USEVYTUwKLSAgICAgICAgICAgIG15YXAgPSBtc2cuZ2V0QXR0YWNobWVudChzYmUyKTsKLSAgICAgICAgICAgIGlmIChteWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJSZXR1cm5lZCBudWxsICh1bmV4cGVjdGVkKSIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbXlhcC5nZXRDb250ZW50VHlwZSgpLmVxdWFscygidGV4dC94bWwiKSkgewotICAgICAgICAgICAgICAgIGZhaWwoIldyb25nIGF0dGFjaG1lbnQgd2FzIHJldHVybmVkOiBHb3QgQ29udGVudC1UeXBlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbXlhcC5nZXRDb250ZW50VHlwZSgpICsgIiwgRXhwZWN0ZWQgQ29udGVudC1UeXBlIG9mIHRleHQveG1sIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vUmV0cmlldmUgYXR0YWNobWVudCB3aXRoIGhyZWY9Ym9vLWhvbyAoZXhwZWN0IG51bGwpCi0gICAgICAgICAgICBRTmFtZSBteXFuYW1lID0gbmV3IFFOYW1lKCJib28taG9vIik7Ci0gICAgICAgICAgICBTT0FQRWxlbWVudCBteXNlID0gU09BUEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVFbGVtZW50KG15cW5hbWUpOwotICAgICAgICAgICAgbXlzZS5hZGRUZXh0Tm9kZSgiPHRoZUJvb0hvb0F0dGFjaG1lbnQgaHJlZj1cImJvby1ob29cIi8+Iik7Ci0gICAgICAgICAgICBteWFwID0gbXNnLmdldEF0dGFjaG1lbnQobXlzZSk7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKG15YXApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBfdGVzdE1lc3NhZ2VDcmVhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBOU19QUkVGSVggPSAibnMtcHJlZml4IjsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBOU19VUkkgPSAibnMtdXJpIjsKLQotICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkgZmFjID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1zZyA9IGZhYy5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIFNPQVBQYXJ0IHNwID0gbXNnLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBzcC5nZXRFbnZlbG9wZSgpOwotICAgICAgICAgICAgU09BUEhlYWRlciBoZHIgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKTsKLSAgICAgICAgICAgIFNPQVBCb2R5IGJkeSA9IGVudmVsb3BlLmdldEJvZHkoKTsKLQotICAgICAgICAgICAgU09BUEVsZW1lbnQgc2UgPSBoZHIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiSGVhZGVyMSIsIE5TX1BSRUZJWCwgTlNfVVJJKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjEiKTsKLSAgICAgICAgICAgIFNPQVBIZWFkZXJFbGVtZW50IHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudClzZTsKLSAgICAgICAgICAgIHNoZS5zZXRNdXN0VW5kZXJzdGFuZCh0cnVlKTsKLQotICAgICAgICAgICAgc2UgPSBoZHIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGUuY3JlYXRlTmFtZSgiSGVhZGVyMiIsIE5TX1BSRUZJWCwgTlNfVVJJKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFRleHROb2RlKCJUaGlzIGlzIEhlYWRlcjIiKTsKLSAgICAgICAgICAgIHNoZSA9IChTT0FQSGVhZGVyRWxlbWVudClzZTsKLSAgICAgICAgICAgIHNoZS5zZXRNdXN0VW5kZXJzdGFuZChmYWxzZSk7Ci0KLSAgICAgICAgICAgIHNlID0gaGRyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkhlYWRlcjMiLCBOU19QUkVGSVgsIE5TX1VSSSkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBIZWFkZXIzIik7Ci0gICAgICAgICAgICBzaGUgPSAoU09BUEhlYWRlckVsZW1lbnQpc2U7Ci0gICAgICAgICAgICBzaGUuc2V0TXVzdFVuZGVyc3RhbmQodHJ1ZSk7Ci0KLSAgICAgICAgICAgIHNlID0gaGRyLmFkZEhlYWRlckVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmNyZWF0ZU5hbWUoIkhlYWRlcjQiLCBOU19QUkVGSVgsIE5TX1VSSSkpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBIZWFkZXI0Iik7Ci0gICAgICAgICAgICBzaGUgPSAoU09BUEhlYWRlckVsZW1lbnQpc2U7Ci0gICAgICAgICAgICBzaGUuc2V0TXVzdFVuZGVyc3RhbmQoZmFsc2UpOwotCi0gICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2JlID0gYmR5LmFkZEJvZHlFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5jcmVhdGVOYW1lKCJCb2R5MSIsIE5TX1BSRUZJWCwgTlNfVVJJKSk7Ci0KLSAgICAgICAgICAgIHNiZS5hZGRDaGlsZEVsZW1lbnQoZW52ZWxvcGUuY3JlYXRlTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgIkNoaWxkMSIsIE5TX1BSRUZJWCwgTlNfVVJJKSkuYWRkVGV4dE5vZGUoIlRoaXMgaXMgQ2hpbGQxIik7Ci0gICAgICAgICAgICBzYmUuYWRkQ2hpbGRFbGVtZW50KGVudmVsb3BlLmNyZWF0ZU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICJDaGlsZDIiLCBOU19QUkVGSVgsIE5TX1VSSSkpLmFkZFRleHROb2RlKCJUaGlzIGlzIENoaWxkMiIpOwotCi0KLSAgICAgICAgICAgIFVSTCB1cmwxID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1NPQVBNZXNzYWdlL2F0dGFjaC54bWwiKTsKLSAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGFwID0gbXNnLmNyZWF0ZUF0dGFjaG1lbnRQYXJ0KG5ldyBEYXRhSGFuZGxlcih1cmwxKSk7Ci0gICAgICAgICAgICBhcC5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgIG1zZy5hZGRBdHRhY2htZW50UGFydChhcCk7Ci0gICAgICAgICAgICBtc2cuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdXJsIGVuZHBvaW50IGZvciB0aGUgcmVjaXBpZW50IG9mIHRoZSBtZXNzYWdlLgotICAgICAgICAgICAgVVJMIHVybEVuZHBvaW50ID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL1JlY2VpdmluZ1NPQVAxMVNlcnZsZXQiKTsKLQotICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgZW5kcG9pbnQgdXNpbmcgdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgICAgICBTT0FQQ29ubmVjdGlvbiBjb24gPSBuZXcgU09BUENvbm5lY3Rpb25JbXBsKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXBseW1zZyA9IGNvbi5jYWxsKG1zZywgdXJsRW5kcG9pbnQpOwotCi0gICAgICAgICAgICAvLyBDaGVjayBpZiByZXBseSBtZXNzYWdlCi0gICAgICAgICAgICBpZiAoIXZhbGlkYXRlUmVwbHlNZXNzYWdlKHJlcGx5bXNnLCAxKSkgewotICAgICAgICAgICAgICAgIC8vUmVwbHkgbWVzc2FnZSBpcyBjb3JyZWN0Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vVGVzdFV0aWwubG9nRXJyKCJSZXBseSBtZXNzYWdlIGlzIGluY29ycmVjdCAoRkFJTEVEKSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlbmRTeW5jUmVxUmVzcE1zZ1Rlc3QyIEV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVSZXBseU1lc3NhZ2UoU09BUE1lc3NhZ2UgbXNnLCBpbnQgbnVtKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHBhc3MgPSB0cnVlOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbXNnLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEhlYWRlcjEgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRIZWFkZXIyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGZvdW5kSGVhZGVyMyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZEhlYWRlcjQgPSBmYWxzZTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBlbnZlbG9wZS5nZXRIZWFkZXIoKS5leGFtaW5lQWxsSGVhZGVyRWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFNPQVBFbGVtZW50IHNlID0gKFNPQVBFbGVtZW50KWkubmV4dCgpOwotICAgICAgICAgICAgICAgIE5hbWUgbmFtZSA9IHNlLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gc2UuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBuYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygiVGhpcyBpcyBIZWFkZXIxIikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJIZWFkZXIxIikpCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kSGVhZGVyMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJUaGlzIGlzIEhlYWRlcjIiKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkhlYWRlcjIiKSkKLSAgICAgICAgICAgICAgICAgICAgZm91bmRIZWFkZXIyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoIlRoaXMgaXMgSGVhZGVyMyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBuYW1lLmdldExvY2FsTmFtZSgpLmVxdWFscygiSGVhZGVyMyIpKQotICAgICAgICAgICAgICAgICAgICBmb3VuZEhlYWRlcjMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygiVGhpcyBpcyBIZWFkZXI0IikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJIZWFkZXI0IikpCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kSGVhZGVyNCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kSGVhZGVyMSB8fCAhZm91bmRIZWFkZXIyIHx8Ci0gICAgICAgICAgICAgICAgICAgICFmb3VuZEhlYWRlcjMgfHwgIWZvdW5kSGVhZGVyNCkgewotICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQgc29hcCBoZWFkZXJzIGluIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vZXhwZWN0ZWQgc29hcCBoZWFkZXJzIGluIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRCb2R5MSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZENoaWxkMSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZENoaWxkMiA9IGZhbHNlOwotICAgICAgICAgICAgU09BUEJvZHkgYmR5ID0gZW52ZWxvcGUuZ2V0Qm9keSgpOwotICAgICAgICAgICAgaSA9IGJkeS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTT0FQQm9keUVsZW1lbnQgc2JlID0gKFNPQVBCb2R5RWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBOYW1lIG5hbWUgPSBzYmUuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoIkJvZHkxIikpCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kQm9keTEgPSB0cnVlOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGMgPSBzYmUuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChjLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBTT0FQRWxlbWVudCBzZSA9IChTT0FQRWxlbWVudCljLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHNlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoIlRoaXMgaXMgQ2hpbGQxIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuYW1lLmdldExvY2FsTmFtZSgpLmVxdWFscygiQ2hpbGQxIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZENoaWxkMSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmVxdWFscygiVGhpcyBpcyBDaGlsZDIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJDaGlsZDIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kQ2hpbGQyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kQm9keTEpIHsKLSAgICAgICAgICAgICAgICAvL2V4cGVjdGVkIHNvYXAgYm9keSBpbiByZXBseSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKCFmb3VuZENoaWxkMSB8fCAhZm91bmRDaGlsZDIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vRGlkIGZpbmQgZXhwZWN0ZWQgc29hcCBib2R5IGNoaWxkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvdW50ID0gbXNnLmNvdW50QXR0YWNobWVudHMoKTsKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSBudW0pIHsKLSAgICAgICAgICAgICAgICAvL3JlY2VpdmVkIGV4cGVjdGVkIG51bWJlciBvZiBhdHRhY2htZW50cyBpbiByZXBseSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgaSA9IG1zZy5nZXRBdHRhY2htZW50cygpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZ2lmRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHhtbEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB0ZXh0Rm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGh0bWxGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2xlYW4ganBlZ0ZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRQYXJ0IGEgPSAoQXR0YWNobWVudFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gYS5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHMoImltYWdlL2dpZiIpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ2lmRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlLmVxdWFscygidGV4dC94bWwiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoInRleHQvcGxhaW4iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJ0ZXh0L2h0bWwiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKCJpbWFnZS9qcGVnIikpCi0gICAgICAgICAgICAgICAgICAgICAgICBqcGVnRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vR290IHVuZXhwZWN0ZWQgTUlNRSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy9EaWQgbm90IGZpbmQgZXhwZWN0ZWQgTUlNRSB0eXBlcyBpbiByZXBseSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhc3M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vR290IHVuZXhwZWN0ZWQgbnVtYmVyIG9mIGF0dGFjaG1lbnRzIGluIHJlcGx5IG1lc3NhZ2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBOYW1lc3BhY2VUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBOYW1lc3BhY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDg1YjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQTmFtZXNwYWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNhYWo7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi0vKiogUmVmOiBKSVJBLSBBeGlzMi01MTcgKi8KLXB1YmxpYyBjbGFzcyBTT0FQTmFtZXNwYWNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBTT0FQTmFtZXNwYWNlVGVzdChTdHJpbmcgYXJnMCkgewotICAgICAgICBzdXBlcihhcmcwKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgeG1sID0KLSAgICAgICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgPz48ZW52OkVudmVsb3BlIHhtbG5zOmVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+PGVudjpCb2R5Lz48L2VudjpFbnZlbG9wZT4iOwotCi0gICAgICAgICAgICBTT0FQTWVzc2FnZSBtc2cgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVNZXNzYWdlKG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWwuZ2V0Qnl0ZXMoKSkpOwotICAgICAgICAgICAgbXNnLnNldFByb3BlcnR5KFNPQVBNZXNzYWdlLldSSVRFX1hNTF9ERUNMQVJBVElPTiwgInRydWUiKTsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgbXNnLndyaXRlVG8oYmFvcyk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvZHVjZWRNYWcgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgW10gc3BsaXRQYXJ0cyA9IHByb2R1Y2VkTWFnLnNwbGl0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4dHJhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiIsIDIsIHNwbGl0UGFydHMubGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBQYXJ0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9TT0FQUGFydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyODU1My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL1NPQVBQYXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmRvbS5zb2FwMTEuU09BUDExRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTWVzc2FnZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5UZXh0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU09BUFBhcnRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZSgpIHsKLSAgICAgICAgRE9NU291cmNlIGRvbVNvdXJjZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBGaWxlUmVhZGVyIHRlc3RGaWxlID0gbmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwiLiIpKyIvdGVzdC1yZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAic29hcC1wYXJ0LnhtbCIpKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgc3RBWE9NQnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgICAgIE9NWE1MQnVpbGRlckZhY3RvcnkuY3JlYXRlU3RBWE9NQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZpbGUpKTsKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgInNvYXAtcGFydC54bWwiKSk7Ci0gICAgICAgICAgICBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQotICAgICAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIFNPQVAgcGFydCBhbmQgc2V0IGl0cyBjb250ZW50IHRvIGRvbVNvdXJjZQotICAgICAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBtZXNzYWdlLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgICAgICBzb2FwUGFydC5zZXRDb250ZW50KGRvbVNvdXJjZSk7Ci0gICAgICAgICAgICBtZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gbWVzc2FnZS5nZXRTT0FQSGVhZGVyKCk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyMSA9IGhlYWRlci5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGVudHMoaXRlcjEsICIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU09BUEJvZHkgYm9keSA9IG1lc3NhZ2UuZ2V0U09BUEJvZHkoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIyID0gYm9keS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBnZXRDb250ZW50cyhpdGVyMiwgIiIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiA6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldENvbnRlbnRzKEl0ZXJhdG9yIGl0ZXJhdG9yLCBTdHJpbmcgaW5kZW50KSB7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFNPQVBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgVGV4dCB0ZXh0ID0gbnVsbDsKLQotICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTT0FQRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGVsZW1lbnQgPSAoU09BUEVsZW1lbnQpbm9kZTsKLQotICAgICAgICAgICAgICAgIE5hbWUgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGF0dHJzID0gZWxlbWVudC5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5hbWUgYXR0ck5hbWUgPSAoTmFtZSlhdHRycy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXR0ck5hbWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIyID0gZWxlbWVudC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGVudHMoaXRlcjIsIGluZGVudCArICIgIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRleHQgPSAoVGV4dClub2RlOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gdGV4dC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2UyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIHNvYXBNZXNzYWdlID0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlIHNvYXBFbnYgPQotICAgICAgICAgICAgICAgIHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlciBoZWFkZXIgPSBzb2FwRW52LmdldEhlYWRlcigpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQQm9keSBib2R5ID0gc29hcEVudi5nZXRCb2R5KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXIuYWRkQ2hpbGRFbGVtZW50KCJlYnhtbG1zMSIsICJjaDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly90ZXN0LmFwYWNoZS5vcmciKSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJFbGVtZW50KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICBzb2FwRW52LmNyZWF0ZU5hbWUoImVieG1sbXMyIiwgImNoMyIsICJodHRwOi8vdGVzdDIuYXBhY2hlLm9yZyIpKSAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXIuYWRkSGVhZGVyRWxlbWVudCgKLSAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRRTmFtZSgiaHR0cDovL3Rlc3QzLmFwYWNoZS5vcmciLCAiZWJ4bWxtczMiLCAiY2g1IikpICE9IG51bGwpOwotCi0gICAgICAgIGJvZHkuYWRkQ2hpbGRFbGVtZW50KCJib2R5RWxlMSIsICJlbGUxIiwgImh0dHA6Ly93cy5hcGFjaGUub3JnIik7Ci0gICAgICAgIHNvYXBNZXNzYWdlLnNhdmVDaGFuZ2VzKCk7Ci0KLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UyID0KLSAgICAgICAgICAgICAgICBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc29hcFBhcnQgPSBzb2FwTWVzc2FnZTIuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgc29hcFBhcnQuc2V0Q29udGVudChzb2FwTWVzc2FnZS5nZXRTT0FQUGFydCgpLmdldENvbnRlbnQoKSk7Ci0gICAgICAgIHNvYXBNZXNzYWdlMi5zYXZlQ2hhbmdlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHNvYXBNZXNzYWdlMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugc29hcE1lc3NhZ2UgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQRW52ZWxvcGUgc29hcEVudiA9Ci0gICAgICAgICAgICAgICAgc29hcE1lc3NhZ2UuZ2V0U09BUFBhcnQoKS5nZXRFbnZlbG9wZSgpOwotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyIGhlYWRlciA9IHNvYXBFbnYuZ2V0SGVhZGVyKCk7Ci0gICAgICAgIGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5IGJvZHkgPSBzb2FwRW52LmdldEJvZHkoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRDaGlsZEVsZW1lbnQoImVieG1sbXMxIiwgImNoMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3Rlc3QuYXBhY2hlLm9yZyIpIGluc3RhbmNlb2YgU09BUEhlYWRlckVsZW1lbnQpOwotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIHNvYXBFbnYuY3JlYXRlTmFtZSgiZWJ4bWxtczIiLCAiY2gzIiwgImh0dHA6Ly90ZXN0Mi5hcGFjaGUub3JnIikpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKGhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgIG5ldyBQcmVmaXhlZFFOYW1lKCJodHRwOi8vdGVzdDMuYXBhY2hlLm9yZyIsICJlYnhtbG1zMyIsICJjaDUiKSkgIT0gbnVsbCk7Ci0KLSAgICAgICAgYm9keS5hZGRDaGlsZEVsZW1lbnQoImJvZHlFbGUxIiwgImVsZTEiLCAiaHR0cDovL3dzLmFwYWNoZS5vcmciKTsKLSAgICAgICAgc29hcE1lc3NhZ2Uuc2F2ZUNoYW5nZXMoKTsKLQotICAgICAgICBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZSBzb2FwTWVzc2FnZTIgPQotICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zb2FwLk1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IHNvYXBNZXNzYWdlMi5nZXRTT0FQUGFydCgpOwotICAgICAgICBzb2FwUGFydC5zZXRDb250ZW50KHNvYXBNZXNzYWdlLmdldFNPQVBQYXJ0KCkuZ2V0Q29udGVudCgpKTsKLSAgICAgICAgc29hcE1lc3NhZ2UyLnNhdmVDaGFuZ2VzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoc29hcE1lc3NhZ2UyKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIF90ZXN0SW5wdXRFbmNvZGluZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2U7Ci0gICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsKLSAgICAgICAgICAgICAgICAgICAgIi90ZXN0LXJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJzb2FwLXBhcnQueG1sIikpOwotICAgICAgICAgICAgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2N1bWVudCk7Ci0KLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBTT0FQIHBhcnQgYW5kIHNldCBpdHMgY29udGVudCB0byBkb21Tb3VyY2UKLSAgICAgICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgc29hcFBhcnQuc2V0Q29udGVudChkb21Tb3VyY2UpOwotICAgICAgICAgICAgbWVzc2FnZS5zYXZlQ2hhbmdlcygpOwotCi0gICAgICAgICAgICBTT0FQUGFydCBzcCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLQotLy8gICAgICAgICAgICBTdHJpbmcgaW5wdXRFbmNvZGluZyA9IHNwLmdldElucHV0RW5jb2RpbmcoKTsKLS8vICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnB1dEVuY29kaW5nKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBwYXJlbnQgcHJvY2Vzc2luZyBvZiBTT0FQTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyZW50QWNjZXNzMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc3AgPSBtLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHNwLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlID09IG51bGwpOwotICAgICAgICAKLSAgICAgICAgU09BUEVsZW1lbnQgZSA9IHNwLmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlID09IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBwYXJlbnQgcHJvY2Vzc2luZyBvZiBTT0FQTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyZW50QWNjZXNzMigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbSA9IG1mLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgU09BUFBhcnQgc3AgPSBtLmdldFNPQVBQYXJ0KCk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBzZSA9IHNwLmdldEVudmVsb3BlKCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHNlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlID09IHNwKTsKLSAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gbnVsbCk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgZSA9IHNlLmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlID09IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBwYXJlbnQgcHJvY2Vzc2luZyBvZiBTT0FQTWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RfcGFyZW50QWNjZXNzMygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFNPQVAxMUZhY3RvcnkgYXhpb21TRiA9IG5ldyBTT0FQMTFGYWN0b3J5KCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgYXhpb21TRSA9IGF4aW9tU0YuY3JlYXRlU09BUEVudmVsb3BlKCk7Ci0gICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQTWVzc2FnZSBheGlvbVNNID0gYXhpb21TRi5jcmVhdGVTT0FQTWVzc2FnZShheGlvbVNFLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIFNPQVBFbnZlbG9wZUltcGwgc2UgPSAKLSAgICAgICAgICAgIG5ldyBTT0FQRW52ZWxvcGVJbXBsKChvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5kb20uU09BUEVudmVsb3BlSW1wbClheGlvbVNFKTsKLSAgICAgICAgU09BUE1lc3NhZ2VJbXBsIHNtID0gbmV3IFNPQVBNZXNzYWdlSW1wbChzZSk7Ci0gICAgICAgIFNPQVBQYXJ0SW1wbCBzcCA9IG5ldyBTT0FQUGFydEltcGwoc20sIHNlKTsKLSAgICAgICAgCi0gICAgICAgIE5vZGUgbm9kZSA9IHNlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlID09IHNwKTsKLSAgICAgICAgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBhc3NlcnRUcnVlKG5vZGUgPT0gbnVsbCk7Ci0KLSAgICAgICAgU09BUEVsZW1lbnQgZSA9IHNlLmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShub2RlID09IG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZVR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE1lc3NhZ2VGYWN0b3J5IGZhY3QgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0gZmFjdC5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIFNPQVBQYXJ0IHNvYXBQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOyAgICAgCi0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlyc3QgY2hpbGQiLCBzb2FwUGFydC5nZXRGaXJzdENoaWxkKCkgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJsYXN0IGNoaWxkIiwgc29hcFBhcnQuZ2V0TGFzdENoaWxkKCkgaW5zdGFuY2VvZiBTT0FQRW52ZWxvcGUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBOb2RlTGlzdCBub2RlcyA9IHNvYXBQYXJ0LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBub2Rlcy5nZXRMZW5ndGgoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShub2Rlcy5pdGVtKGkpIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKTsKLSAgICAgICAgfSAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoaWxkMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic29hcCBlbnYgYmVmb3JlIiwgc29hcFBhcnQuZ2V0Rmlyc3RDaGlsZCgpIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKTsKLSAgICAgICAgCi0gICAgICAgIHNvYXBQYXJ0LnJlbW92ZUNoaWxkKHNvYXBQYXJ0LmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRUcnVlKCJzb2FwIGVudiBhZnRlciIsIHNvYXBQYXJ0LmdldEZpcnN0Q2hpbGQoKSA9PSBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoaWxkMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3QuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQUGFydCBzb2FwUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic29hcCBlbnYgYmVmb3JlIiwgc29hcFBhcnQuZ2V0Rmlyc3RDaGlsZCgpIGluc3RhbmNlb2YgU09BUEVudmVsb3BlKTsKLSAgICAgICAgCi0gICAgICAgIHNvYXBQYXJ0LnJlbW92ZUNoaWxkKHNvYXBQYXJ0LmdldEVudmVsb3BlKCkpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic29hcCBlbnYgYWZ0ZXIiLCBzb2FwUGFydC5nZXRGaXJzdENoaWxkKCkgPT0gbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9UZXh0VGVzdC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9UZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM3MzJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovVGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2FhajsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlRleHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGV4dFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgVGV4dFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLy9UZXN0IFNBQUogYWRkVGV4dE5vZGUgcGVyZm9ybWFuY2UKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVGV4dE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBTT0FQRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRmFjdG9yeSBmYWN0b3J5ID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgYmFzZSBlbGVtZW50Ci0gICAgICAgIE5hbWUgYm9keU5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJWQkdlblJlY2VpdmVyIiwgInhzaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpOwotICAgICAgICBTT0FQQm9keUVsZW1lbnQgYm9keUVsZW1lbnQgPSBib2R5LmFkZEJvZHlFbGVtZW50KGJvZHlOYW1lKTsKLQotICAgICAgICAvLyBDcmVhdGUgdGhlIE1ldGFEYXRhIFRhZwotICAgICAgICBOYW1lIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJNZXRhRGF0YSIpOwotICAgICAgICBTT0FQRWxlbWVudCBtZXRhRGF0YSA9IGJvZHlFbGVtZW50LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLQotICAgICAgICAvL0NyZWF0ZSB0aGUgU0tleSBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlNLZXkiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgc0tleSA9IG1ldGFEYXRhLmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgc0tleS5hZGRUZXh0Tm9kZSgiU0tFWTAwMSIpOwotCi0gICAgICAgIC8vQ3JlYXRlIE9iamVjdCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIk9iamVjdCIpOwotICAgICAgICBTT0FQRWxlbWVudCBvYmplY3QgPSBib2R5RWxlbWVudC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0KLSAgICAgICAgLy9DcmVhdGUgQm9vayBJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkJvb2tJRCIpOwotICAgICAgICBTT0FQRWxlbWVudCBib29rSUQgPSBvYmplY3QuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBib29rSUQuYWRkVGV4dE5vZGUoIkJvb2tJRDAwMiIpOwotCi0gICAgICAgIC8vQ3JlYXRlIE9yZGVySUQgdGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJPcmRlcklEIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IG9yZGVySUQgPSBvYmplY3QuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBvcmRlcklELmFkZFRleHROb2RlKCJPcmRlcklEMDAzIik7Ci0KLSAgICAgICAgLy9jcmVhdGUgUHVyY2hhc2VJRCB0YWdlCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJQdXJjaGFzZUlEIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IHB1cmNoYXNlSUQgPSBvYmplY3QuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBwdXJjaGFzZUlELmFkZFRleHROb2RlKCJQdXJjaGFzZUlEMDA1Iik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkxhbmd1YWdlSUQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgbGFuZ3VhZ2VJRCA9IG9iamVjdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGxhbmd1YWdlSUQuYWRkVGV4dE5vZGUoIkxhbmd1YWdlSUQwMDQiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiTGFuZ3VhZ2VOYW1lIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGxhbmd1YWdlTmFtZSA9IG9iamVjdC5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGxhbmd1YWdlTmFtZS5hZGRUZXh0Tm9kZSgiTGFuZ3VhZ2VOYW1lMDA2Iik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlRpdGxlIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IHRpdGxlID0gb2JqZWN0LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgdGl0bGUuYWRkVGV4dE5vZGUoIlRpdGxlMDA3Iik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkF1dGhvciIpOwotICAgICAgICBTT0FQRWxlbWVudCBhdXRob3IgPSBvYmplY3QuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBhdXRob3IuYWRkVGV4dE5vZGUoIkF1dGhvcjAwOCIpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJGb3JtYXQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgZm9ybWF0ID0gYm9keUVsZW1lbnQuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJUeXBlIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGZvcm1hdFR5cGUgPSBmb3JtYXQuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotICAgICAgICBmb3JtYXRUeXBlLmFkZFRleHROb2RlKCJUeXBlMDA5Iik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkRlbGl2ZXJ5Iik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGRlbGl2ZXJ5ID0gYm9keUVsZW1lbnQuYWRkQ2hpbGRFbGVtZW50KG5hbWUpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJOYW1lIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IGRlbE5hbWUgPSBkZWxpdmVyeS5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGRlbE5hbWUuYWRkVGV4dE5vZGUoIk5hbWUwMTAiKTsKLQotICAgICAgICAvL2NyZWF0ZSBMYW5ndWFnZUlEIFRhZwotICAgICAgICBuYW1lID0gc29hcEZhY3RvcnkuY3JlYXRlTmFtZSgiQWRkcmVzczEiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgYWRkcmVzczEgPSBkZWxpdmVyeS5hZGRDaGlsZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgIGFkZHJlc3MxLmFkZFRleHROb2RlKCJBZGRyZXNzMTAxMSIpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJBZGRyZXNzMiIpOwotICAgICAgICBTT0FQRWxlbWVudCBhZGRyZXNzMiA9IGRlbGl2ZXJ5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgYWRkcmVzczIuYWRkVGV4dE5vZGUoIkFkZHJlc3MyMDEyIik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIkNpdHkiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgY2l0eSA9IGRlbGl2ZXJ5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgY2l0eS5hZGRUZXh0Tm9kZSgiQ2l0eTAxMyIpOwotCi0gICAgICAgIC8vY3JlYXRlIExhbmd1YWdlSUQgVGFnCi0gICAgICAgIG5hbWUgPSBzb2FwRmFjdG9yeS5jcmVhdGVOYW1lKCJTdGF0ZSIpOwotICAgICAgICBTT0FQRWxlbWVudCBzdGF0ZSA9IGRlbGl2ZXJ5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgc3RhdGUuYWRkVGV4dE5vZGUoIlN0YXRlMDE0Iik7Ci0KLSAgICAgICAgLy9jcmVhdGUgTGFuZ3VhZ2VJRCBUYWcKLSAgICAgICAgbmFtZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU5hbWUoIlBvc3RhbENvZGUiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgcG9zdGFsQ29kZSA9IGRlbGl2ZXJ5LmFkZENoaWxkRWxlbWVudChuYW1lKTsKLSAgICAgICAgcG9zdGFsQ29kZS5hZGRUZXh0Tm9kZSgiUG9zdGFsQ29kZTAxNSIpOwotCi0gICAgICAgIC8vbWVzc2FnZS53cml0ZVRvKFN5c3RlbS5vdXQpOwotICAgICAgICAvL1N5c3RlbS5vdXQuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudCgpIHRocm93cyBTT0FQRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIHhtbFN0cmluZyA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/PiAiICsKLSAgICAgICAgICAgICAgICAiPHNvYXBlbnY6RW52ZWxvcGUgeG1sbnM6c29hcGVudj1cImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvXCI+IiArCi0gICAgICAgICAgICAgICAgIjxzb2FwZW52OkhlYWRlcj48L3NvYXBlbnY6SGVhZGVyPiIgKwotICAgICAgICAgICAgICAgICI8c29hcGVudjpCb2R5PiIgKwotICAgICAgICAgICAgICAgICI8Tm9kZTphYmMgeG1sbnM6Tm9kZT1cImh0dHA6Ly93d3cuc2ltcGxldGVzdC5vcmdcIj4iICsKLSAgICAgICAgICAgICAgICAiVGhpcyBpcyBzb21lIHRleHQiICsKLSAgICAgICAgICAgICAgICAiPCEtLVRoaXMgaXMgY29tbWVudC0tPlRoaXMgaXMgb3RoZXIgdGV4dCIgKwotICAgICAgICAgICAgICAgICI8IS0tVGhpcyBpcyBhbm90aGVyIGNvbW1lbnQtLT5UaGlzIGlzIHNvbWUgb3RoZXIgdGV4dCIgKwotICAgICAgICAgICAgICAgICI8L05vZGU6YWJjPiIgKwotICAgICAgICAgICAgICAgICI8L3NvYXBlbnY6Qm9keT4iICsKLSAgICAgICAgICAgICAgICAiPC9zb2FwZW52OkVudmVsb3BlPiI7Ci0KLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICBtZi5jcmVhdGVNZXNzYWdlKG5ldyBNaW1lSGVhZGVycygpLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyaW5nLmdldEJ5dGVzKCkpKTsKLQotICAgICAgICBTT0FQQm9keSBib2R5ID0gbWVzc2FnZS5nZXRTT0FQQm9keSgpOwotICAgICAgICBOb2RlIGJvZHlFbGVtZW50ID0gYm9keS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIE5vZGVMaXN0IHRleHROb2RlcyA9IGJvZHlFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgdGV4dE5vZGVzLmdldExlbmd0aCgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSB0ZXh0Tm9kZXMuaXRlbShpKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb21tZW50OwotICAgICAgICAgICAgaXNDb21tZW50ID0gKChUZXh0KW5vZGUpLmlzQ29tbWVudCgpOwotICAgICAgICAgICAgaWYgKGkgPT0gMSB8fCBpID09IDMpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgaXNDb21tZW50KTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBpc0NvbW1lbnQpOwotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG5vZGUgaW5zdGFuY2VvZiBDb21tZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovaW50ZWdyYXRpb24vRWNob1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhYWovdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NhYWovaW50ZWdyYXRpb24vRWNob1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2ZmNhYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL0VjaG9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZSB7Ci0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgLy9QcmFwYXJpbmcgdGhlIE9NRWxlbWVudCBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZCB0byBhbm90aGVyIE9NIFRyZWUuCi0gICAgICAgIC8vRmlyc3QgdGhlIE9NRWxlbWVudCBzaG91bGQgYmUgY29tcGxldGVseSBidWlsdCBpbiBjYXNlIGl0IGlzIG5vdCBmdWxseSBidWlsdCBhbmQgc3RpbGwKLSAgICAgICAgLy9zb21lIG9mIHRoZSB4bWwgaXMgaW4gdGhlIHN0cmVhbS4KLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICAvL1NlY29uZGx5IHRoZSBPTUVsZW1lbnQgc2hvdWxkIGJlIGRldGFjaGVkIGZyb20gdGhlIGN1cnJlbnQgT01UcmVlIHNvIHRoYXQgaXQgY2FuIGJlIGF0dGFjaGVkCi0gICAgICAgIC8vc29tZSBvdGhlciBPTSBUcmVlLiBPbmNlIGRldGFjaGVkIHRoZSBPbVRyZWUgd2lsbCByZW1vdmUgaXRzIGNvbm5lY3Rpb25zIHRvIHRoaXMgT01FbGVtZW50LgotICAgICAgICAvL2VsZW1lbnQuZGV0YWNoKCk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL0ludGVncmF0aW9uVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9pbnRlZ3JhdGlvbi9JbnRlZ3JhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkZDUwMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL0ludGVncmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zYWFqLmludGVncmF0aW9uOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5BdHRhY2htZW50UGFydDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NZXNzYWdlRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5NaW1lSGVhZGVyczsKLWltcG9ydCBqYXZheC54bWwuc29hcC5OYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBCb2R5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQQ29ubmVjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IGphdmF4LnhtbC5zb2FwLlNPQVBFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQSGVhZGVyRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsKLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQUGFydDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlZ3JhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBzdGF0aWMgaW50IHBvcnQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBTRVJWSUNFX05BTUUgPSBuZXcgUU5hbWUoIkVjaG8iKTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIE9QRVJBVElPTl9OQU1FID0gbmV3IFFOYW1lKCJlY2hvIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQUFKX1JFUE8gPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvIiArICJ0YXJnZXQvdGVzdC1yZXNvdXJjZXMvc2Fhai1yZXBvIjsKLQotICAgIHB1YmxpYyBJbnRlZ3JhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vMTI3LjAuMC4xOiIgKwotICAgICAgICAgICAgICAgIHBvcnQgKwotICAgICAgICAgICAgICAgICIvYXhpczIvc2VydmljZXMvRWNobyI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U2V0dXAobmV3IFRlc3RTdWl0ZShJbnRlZ3JhdGlvblRlc3QuY2xhc3MpKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHBvcnQgPSBVdGlsU2VydmVyLnN0YXJ0KFNBQUpfUkVQTyk7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGVuZWJsZW10b20gPSBuZXcgUGFyYW1ldGVyKCJlbmFibGVNVE9NIiwgInRydWUiKTsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcmFtZXRlcihlbmVibGVtdG9tKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBVdGlsU2VydmVyLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBBeGlzU2VydmljZSBzZXJ2aWNlID0gVXRpbHMuY3JlYXRlU2ltcGxlU2VydmljZShTRVJWSUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG9TZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICBVdGlsU2VydmVyLmRlcGxveVNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveVNlcnZpY2UoU0VSVklDRV9OQU1FKTsKLSAgICAgICAgVXRpbFNlcnZlci51bkRlcGxveUNsaWVudFNlcnZpY2UoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kUmVjZWl2ZU1lc3NhZ2VXaXRoRW1wdHlOU1ByZWZpeCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBtZi5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIFNPQVBQYXJ0IHNQYXJ0ID0gcmVxdWVzdC5nZXRTT0FQUGFydCgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHNQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBTT0FQQm9keSBib2R5ID0gZW52LmdldEJvZHkoKTsKLQotICAgICAgICAgICAgLy9OYW1lc3BhY2UgcHJlZml4IGlzIGVtcHR5Ci0gICAgICAgICAgICBib2R5LmFkZEJvZHlFbGVtZW50KG5ldyBRTmFtZSgiaHR0cDovL2Zha2VOYW1lc3BhY2UyLm9yZyIsImVjaG8iKSkKLSAgICAgICAgICAgIAkJCQkJCQkuYWRkVGV4dE5vZGUoIlRoaXMgaXMgc29tZSB0ZXh0Iik7Ci0KLSAgICAgICAgICAgIFNPQVBDb25uZWN0aW9uIHNDb24gPSBTT0FQQ29ubmVjdGlvbkZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IHNDb24uY2FsbChyZXF1ZXN0LCBnZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuZ2V0QXR0YWNobWVudHMoKS5oYXNOZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3BvbnNlLmNvdW50QXR0YWNobWVudHMoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0U3RyID0gcHJpbnRTT0FQTWVzc2FnZShyZXF1ZXN0KTsKLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZVN0ciA9IHByaW50U09BUE1lc3NhZ2UocmVzcG9uc2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVN0ci5pbmRleE9mKCJlY2hvIikgPiAtMSk7Ci0gICAgICAgICAgICBzQ29uLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNPQVBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIHdoaWxlIHJ1bm5pbmcgdGVzdDogIiArIGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHRlc3Q6ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFJlY2VpdmVTaW1wbGVTT0FQTWVzc2FnZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5IG1mID0gTWVzc2FnZUZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBtZi5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgICAgIGNyZWF0ZVNpbXBsZVNPQVBQYXJ0KHJlcXVlc3QpOwotCi0gICAgICAgICAgICBTT0FQQ29ubmVjdGlvbiBzQ29uID0gU09BUENvbm5lY3Rpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBzQ29uLmNhbGwocmVxdWVzdCwgZ2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmdldEF0dGFjaG1lbnRzKCkuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZXNwb25zZS5jb3VudEF0dGFjaG1lbnRzKCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFN0ciA9IHByaW50U09BUE1lc3NhZ2UocmVxdWVzdCk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VTdHIgPSBwcmludFNPQVBNZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VTdHIuaW5kZXhPZigiZWNobyIpICE9IC0xKTsKLSAgICAgICAgICAgIHNDb24uY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoU09BUEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2hpbGUgcnVubmluZyB0ZXN0OiAiICsgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uIHdoaWxlIHJ1bm5pbmcgdGVzdDogIiArIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVE9ETzogaXQgaXMgbm90IGNsZWFyIGhvdyB0aGlzIG1ldGhvZCBjYW4gZ2l2ZSBwcmVkaWN0YWJsZSByZXN1bHRzLAotICAgIC8vICAgICAgIGdpdmVuIHRoYXQgQnl0ZUFycmF5T3V0cHV0U3RyZWFtI3RvU3RyaW5nIHVzZXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQgY2hhcnNldAotICAgIC8vICAgICAgIGVuY29kaW5nIHdoaWxlIFNPQVBNZXNzYWdlI3dyaXRlVG8gbWF5IHVzZSBhbm90aGVyIGVuY29kaW5nISEhCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJpbnRTT0FQTWVzc2FnZShmaW5hbCBTT0FQTWVzc2FnZSBtc2cpIHRocm93cyBTT0FQRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBtc2cud3JpdGVUbyhiYW9zKTsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlU3RyID0gYmFvcy50b1N0cmluZygpOwotCi0gICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VTdHIuaW5kZXhPZigiVGhpcyBpcyBzb21lIHRleHQiKSAhPSAtMSk7Ci0gICAgICAgIHJldHVybiByZXNwb25zZVN0cjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZFJlY2VpdmVNZXNzYWdlV2l0aEF0dGFjaG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUZhY3RvcnkgbWYgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXF1ZXN0ID0gbWYuY3JlYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIC8vY3JlYXRlIHRoZSBTT0FQUGFydAotICAgICAgICBjcmVhdGVTT0FQUGFydChyZXF1ZXN0KTsKLQotICAgICAgICAvL0F0dGFjaCBhIHRleHQvcGxhaW4gb2JqZWN0IHdpdGggdGhlIFNPQVAgcmVxdWVzdAotICAgICAgICBTdHJpbmcgc2FtcGxlTWVzc2FnZSA9ICJTYW1wbGUgTWVzc2FnZTogSGVsbG8gV29ybGQhIjsKLSAgICAgICAgQXR0YWNobWVudFBhcnQgdGV4dEF0dGFjaCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoc2FtcGxlTWVzc2FnZSwgInRleHQvcGxhaW4iKTsKLSAgICAgICAgdGV4dEF0dGFjaC5hZGRNaW1lSGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwgImJpbmFyeSIpOwotICAgICAgICB0ZXh0QXR0YWNoLnNldENvbnRlbnRJZCgic3VibWl0U2FtcGxlVGV4dEBhcGFjaGUub3JnIik7Ci0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQodGV4dEF0dGFjaCk7Ci0KLSAgICAgICAgLy9BdHRhY2ggYSBqYXZhLmF3dC5JbWFnZSBvYmplY3QgdG8gdGhlIFNPQVAgcmVxdWVzdAotICAgICAgICBTdHJpbmcganBnZmlsZW5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRlc3QtcmVzb3VyY2VzL2F4aXMyLmpwZyI7Ci0gICAgICAgIEZpbGUgbXlmaWxlID0gbmV3IEZpbGUoanBnZmlsZW5hbWUpOwotICAgICAgICBGaWxlRGF0YVNvdXJjZSBmZHMgPSBuZXcgRmlsZURhdGFTb3VyY2UobXlmaWxlKTsKLSAgICAgICAgRGF0YUhhbmRsZXIgaW1hZ2VESCA9IG5ldyBEYXRhSGFuZGxlcihmZHMpOwotICAgICAgICBBdHRhY2htZW50UGFydCBqcGVnQXR0YWNoID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChpbWFnZURIKTsKLSAgICAgICAganBlZ0F0dGFjaC5hZGRNaW1lSGVhZGVyKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwgImJpbmFyeSIpOwotICAgICAgICBqcGVnQXR0YWNoLnNldENvbnRlbnRJZCgic3VibWl0U2FtcGxlSW1hZ2VAYXBhY2hlLm9yZyIpOwotICAgICAgICBqcGVnQXR0YWNoLnNldENvbnRlbnRUeXBlKCJpbWFnZS9qcGciKTsKLSAgICAgICAgcmVxdWVzdC5hZGRBdHRhY2htZW50UGFydChqcGVnQXR0YWNoKTsKLQotICAgICAgICBTT0FQQ29ubmVjdGlvbiBzQ29uID0gU09BUENvbm5lY3Rpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IHNDb24uY2FsbChyZXF1ZXN0LCBnZXRBZGRyZXNzKCkpOwotCi0gICAgICAgIGludCBhdHRhY2htZW50Q291bnQgPSByZXNwb25zZS5jb3VudEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudENvdW50ID09IDIpOwotCi0gICAgICAgIEl0ZXJhdG9yIGF0dGFjaEl0ZXIgPSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpOwotCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUgKGF0dGFjaEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBdHRhY2htZW50UGFydCBhdHRhY2htZW50ID0gKEF0dGFjaG1lbnRQYXJ0KWF0dGFjaEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbnRlbnQgPSBhdHRhY2htZW50LmdldERhdGFIYW5kbGVyKCkuZ2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2FtcGxlTWVzc2FnZSwgKFN0cmluZyljb250ZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIEJ5dGVBcnJheUlucHV0U3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IChCeXRlQXJyYXlJbnB1dFN0cmVhbSljb250ZW50OwotICAgICAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTUwMDBdOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGhSZWFkID0gYmFpcy5yZWFkKGIpOwotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiLyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0L3Rlc3QtcmVzb3VyY2VzL3Jlc3VsdCIgKyAoaSsrKSArICIuanBnIikpOwotICAgICAgICAgICAgICAgIGZvcy53cml0ZShiLCAwLCBsZW5ndGhSZWFkKTsKLSAgICAgICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudC5nZXRDb250ZW50VHlwZSgpLmVxdWFscygiaW1hZ2UvanBlZyIpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBhdHRhY2htZW50LmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJ0ZXh0L3BsYWluIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc0Nvbi5jbG9zZSgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbmRSZWNlaXZlTm9uUmVmQXR0YWNobWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBNZXNzYWdlRmFjdG9yeSBtZiA9IE1lc3NhZ2VGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIFNPQVBNZXNzYWdlIHJlcXVlc3QgPSBtZi5jcmVhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgLy9jcmVhdGUgdGhlIFNPQVBQYXJ0Ci0gICAgICAgIGNyZWF0ZVNpbXBsZVNPQVBQYXJ0KHJlcXVlc3QpOwotCi0gICAgICAgIC8vQXR0YWNoIGEgdGV4dC9wbGFpbiBvYmplY3Qgd2l0aCB0aGUgU09BUCByZXF1ZXN0Ci0gICAgICAgIFN0cmluZyBzYW1wbGVNZXNzYWdlID0gIlNhbXBsZSBNZXNzYWdlOiBIZWxsbyBXb3JsZCEiOwotICAgICAgICBBdHRhY2htZW50UGFydCB0ZXh0QXR0YWNoID0gcmVxdWVzdC5jcmVhdGVBdHRhY2htZW50UGFydChzYW1wbGVNZXNzYWdlLCAidGV4dC9wbGFpbiIpOwotICAgICAgICByZXF1ZXN0LmFkZEF0dGFjaG1lbnRQYXJ0KHRleHRBdHRhY2gpOwotCi0gICAgICAgIC8vQXR0YWNoIGEgamF2YS5hd3QuSW1hZ2Ugb2JqZWN0IHRvIHRoZSBTT0FQIHJlcXVlc3QKLSAgICAgICAgU3RyaW5nIGpwZ2ZpbGVuYW1lID0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsgInRhcmdldC90ZXN0LXJlc291cmNlcy9heGlzMi5qcGciOwotICAgICAgICBGaWxlIG15ZmlsZSA9IG5ldyBGaWxlKGpwZ2ZpbGVuYW1lKTsKLSAgICAgICAgRmlsZURhdGFTb3VyY2UgZmRzID0gbmV3IEZpbGVEYXRhU291cmNlKG15ZmlsZSk7Ci0gICAgICAgIERhdGFIYW5kbGVyIGltYWdlREggPSBuZXcgRGF0YUhhbmRsZXIoZmRzKTsKLSAgICAgICAgQXR0YWNobWVudFBhcnQganBlZ0F0dGFjaCA9IHJlcXVlc3QuY3JlYXRlQXR0YWNobWVudFBhcnQoaW1hZ2VESCk7Ci0gICAgICAgIGpwZWdBdHRhY2guYWRkTWltZUhlYWRlcigiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIsICJiaW5hcnkiKTsKLSAgICAgICAganBlZ0F0dGFjaC5zZXRDb250ZW50VHlwZSgiaW1hZ2UvanBnIik7Ci0gICAgICAgIHJlcXVlc3QuYWRkQXR0YWNobWVudFBhcnQoanBlZ0F0dGFjaCk7Ci0KLQotICAgICAgICBTT0FQQ29ubmVjdGlvbiBzQ29uID0gU09BUENvbm5lY3Rpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICBTT0FQTWVzc2FnZSByZXNwb25zZSA9IHNDb24uY2FsbChyZXF1ZXN0LCBnZXRBZGRyZXNzKCkpOwotCi0gICAgICAgIGludCBhdHRhY2htZW50Q291bnQgPSByZXNwb25zZS5jb3VudEF0dGFjaG1lbnRzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudENvdW50ID09IDIpOwotCi0gICAgICAgIEl0ZXJhdG9yIGF0dGFjaEl0ZXIgPSByZXNwb25zZS5nZXRBdHRhY2htZW50cygpOwotCi0gICAgICAgIHdoaWxlIChhdHRhY2hJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgQXR0YWNobWVudFBhcnQgYXR0YWNobWVudCA9IChBdHRhY2htZW50UGFydClhdHRhY2hJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb250ZW50ID0gYXR0YWNobWVudC5nZXREYXRhSGFuZGxlcigpLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNhbXBsZU1lc3NhZ2UsIChTdHJpbmcpY29udGVudCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBCeXRlQXJyYXlJbnB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSAoQnl0ZUFycmF5SW5wdXRTdHJlYW0pY29udGVudDsKLSAgICAgICAgICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzE1MDAwXTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoUmVhZCA9IGJhaXMucmVhZChiKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi8iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldC90YXJnZXQvdGVzdC1yZXNvdXJjZXMvYXhpczIuanBnIikpOwotICAgICAgICAgICAgICAgIGZvcy53cml0ZShiLCAwLCBsZW5ndGhSZWFkKTsKLSAgICAgICAgICAgICAgICBmb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKLQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYXR0YWNobWVudC5nZXRDb250ZW50VHlwZSgpLmVxdWFscygiaW1hZ2UvanBlZyIpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBhdHRhY2htZW50LmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKCJ0ZXh0L3BsYWluIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTT0FQUGFydChTT0FQTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgU09BUEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNPQVBQYXJ0IHNQYXJ0ID0gbWVzc2FnZS5nZXRTT0FQUGFydCgpOwotICAgICAgICBTT0FQRW52ZWxvcGUgZW52ID0gc1BhcnQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgU09BUEJvZHkgYm9keSA9IGVudi5nZXRCb2R5KCk7Ci0KLSAgICAgICAgZmluYWwgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gZW52LmdldEhlYWRlcigpOwotICAgICAgICBzb2FwSGVhZGVyCi0gICAgICAgICAgICAgICAgLmFkZEhlYWRlckVsZW1lbnQoZW52LmNyZWF0ZU5hbWUoIlRlc3RIZWFkZXIxIiwgInN3YSIsICJodHRwOi8vZmFrZU5hbWVzcGFjZS5vcmciKSk7Ci0gICAgICAgIHNvYXBIZWFkZXIKLSAgICAgICAgICAgICAgICAuYWRkSGVhZGVyRWxlbWVudChlbnYuY3JlYXRlTmFtZSgiVGVzdEhlYWRlcjIiLCAic3dhIiwgImh0dHA6Ly9mYWtlTmFtZXNwYWNlLm9yZyIpKTsKLSAgICAgICAgZmluYWwgU09BUEhlYWRlckVsZW1lbnQgaGVhZGVyRWxlMyA9Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlci5hZGRIZWFkZXJFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgZW52LmNyZWF0ZU5hbWUoIlRlc3RIZWFkZXIzIiwgInN3YSIsICJodHRwOi8vZmFrZU5hbWVzcGFjZS5vcmciKSk7Ci0gICAgICAgIGZpbmFsIFNPQVBFbGVtZW50IGNoMSA9IGhlYWRlckVsZTMuYWRkQ2hpbGRFbGVtZW50KCJoZTMiLCAic3dhIik7Ci0gICAgICAgIGNoMS5hZGRUZXh0Tm9kZSgiSW0gSGVhZGVyIEVsZW1lbnQgb2YgaGVhZGVyMyIpOwotCi0gICAgICAgIE5hbWUgbnMgPSBlbnYuY3JlYXRlTmFtZSgiZWNobyIsICJzd2EiLCAiaHR0cDovL2Zha2VOYW1lc3BhY2Uub3JnIik7Ci0gICAgICAgIFNPQVBCb2R5RWxlbWVudCBib2R5RWxlbWVudCA9IGJvZHkuYWRkQm9keUVsZW1lbnQobnMpOwotCi0gICAgICAgIE5hbWUgbmFtZU1haW4gPSBlbnYuY3JlYXRlTmFtZSgiaW50ZXJuYWwiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgbWFpbkNoaWxkRWxlID0gYm9keUVsZW1lbnQuYWRkQ2hpbGRFbGVtZW50KG5hbWVNYWluKTsKLQotICAgICAgICBOYW1lIG5zMiA9IGVudi5jcmVhdGVOYW1lKCJ0ZXh0Iik7Ci0gICAgICAgIFNPQVBFbGVtZW50IHRleHRSZWZlcmVuY2UgPSBtYWluQ2hpbGRFbGUuYWRkQ2hpbGRFbGVtZW50KG5zMik7Ci0gICAgICAgIE5hbWUgaHJlZkF0dHIgPSBlbnYuY3JlYXRlTmFtZSgiaHJlZiIpOwotICAgICAgICB0ZXh0UmVmZXJlbmNlLmFkZEF0dHJpYnV0ZShocmVmQXR0ciwgImNpZDpzdWJtaXRTYW1wbGVUZXh0QGFwYWNoZS5vcmciKTsKLQotICAgICAgICBOYW1lIG5zMyA9IGVudi5jcmVhdGVOYW1lKCJpbWFnZSIpOwotICAgICAgICBTT0FQRWxlbWVudCBpbWFnZVJlZmVyZW5jZSA9IG1haW5DaGlsZEVsZS5hZGRDaGlsZEVsZW1lbnQobnMzKTsKLSAgICAgICAgTmFtZSBuczMxID0gZW52LmNyZWF0ZU5hbWUoImlubmVyIik7Ci0gICAgICAgIGZpbmFsIFNPQVBFbGVtZW50IGltZyA9IGltYWdlUmVmZXJlbmNlLmFkZENoaWxkRWxlbWVudChuczMxKTsKLSAgICAgICAgaW1nLmFkZEF0dHJpYnV0ZShocmVmQXR0ciwgImNpZDpzdWJtaXRTYW1wbGVJbWFnZUBhcGFjaGUub3JnIik7Ci0KLSAgICAgICAgTmFtZSBuczQgPSBlbnYuY3JlYXRlTmFtZSgicGxhaW50eHQiKTsKLSAgICAgICAgU09BUEVsZW1lbnQgcGxhaW5UeHQgPSBtYWluQ2hpbGRFbGUuYWRkQ2hpbGRFbGVtZW50KG5zNCk7Ci0gICAgICAgIHBsYWluVHh0LmFkZFRleHROb2RlKCJUaGlzIGlzIHNpbXBsZSBwbGFpbiB0ZXh0Iik7Ci0KLSAgICAgICAgTmFtZSBuczUgPSBlbnYuY3JlYXRlTmFtZSgibmVzdGVkIik7Ci0gICAgICAgIFNPQVBFbGVtZW50IG5lc3RlZCA9IG1haW5DaGlsZEVsZS5hZGRDaGlsZEVsZW1lbnQobnM1KTsKLSAgICAgICAgbmVzdGVkLmFkZFRleHROb2RlKCJOZXN0ZWQxIFBsYWluIFRleHQiKTsKLSAgICAgICAgTmFtZSBuczYgPSBlbnYuY3JlYXRlTmFtZSgibmVzdGVkMiIpOwotICAgICAgICBTT0FQRWxlbWVudCBuZXN0ZWQyID0gbmVzdGVkLmFkZENoaWxkRWxlbWVudChuczYpOwotICAgICAgICBuZXN0ZWQyLmFkZFRleHROb2RlKCJOZXN0ZWQyIFBsYWluIFRleHQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2ltcGxlU09BUFBhcnQoU09BUE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFNPQVBFeGNlcHRpb24gewotICAgICAgICBTT0FQUGFydCBzUGFydCA9IG1lc3NhZ2UuZ2V0U09BUFBhcnQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudiA9IHNQYXJ0LmdldEVudmVsb3BlKCk7Ci0gICAgICAgIFNPQVBCb2R5IGJvZHkgPSBlbnYuZ2V0Qm9keSgpOwotICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IGVudi5nZXRIZWFkZXIoKTsKLSAgICAgICAgaGVhZGVyLmFkZEhlYWRlckVsZW1lbnQoZW52LmNyZWF0ZU5hbWUoIkhlYWRlcjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vdGVzdC5hcGFjaC5vcmcvdGVzdCIpKQotICAgICAgICAgICAgICAgIC5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBoZWFkZXIxIik7Ci0KLSAgICAgICAgTmFtZSBucyA9IGVudi5jcmVhdGVOYW1lKCJlY2hvIiwgInN3YTIiLCAiaHR0cDovL2Zha2VOYW1lc3BhY2UyLm9yZyIpOwotICAgICAgICBmaW5hbCBTT0FQQm9keUVsZW1lbnQgYm9keUVsZW1lbnQgPSBib2R5LmFkZEJvZHlFbGVtZW50KG5zKTsKLSAgICAgICAgTmFtZSBuczIgPSBlbnYuY3JlYXRlTmFtZSgic29tZXRoaW5nIik7Ci0gICAgICAgIGZpbmFsIFNPQVBFbGVtZW50IGVsZTEgPSBib2R5RWxlbWVudC5hZGRDaGlsZEVsZW1lbnQobnMyKTsKLSAgICAgICAgZWxlMS5hZGRUZXh0Tm9kZSgiVGhpcyBpcyBzb21lIHRleHQiKTsKLQotICAgICAgICBOYW1lIG5zMyA9IGVudi5jcmVhdGVOYW1lKCJwaW5nIiwgInN3YTMiLCAiaHR0cDovL2Zha2VOYW1lc3BhY2UzLm9yZyIpOwotICAgICAgICBmaW5hbCBTT0FQQm9keUVsZW1lbnQgYm9keUVsZW1lbnQyID0gYm9keS5hZGRCb2R5RWxlbWVudChuczMpOwotICAgICAgICBOYW1lIG5zNCA9IGVudi5jcmVhdGVOYW1lKCJhbm90aGVyIik7Ci0gICAgICAgIGZpbmFsIFNPQVBFbGVtZW50IGVsZTIgPSBib2R5RWxlbWVudDIuYWRkQ2hpbGRFbGVtZW50KG5zNCk7Ci0gICAgICAgIGVsZTIuYWRkVGV4dE5vZGUoIlRoaXMgaXMgYW5vdGhlciB0ZXh0Iik7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kUmVjZWl2ZV9JU084ODU5MV9FbmNvZGVkU09BUE1lc3NhZ2UoKSB7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgCU1pbWVIZWFkZXJzIG1pbWVIZWFkZXJzID0gbmV3IE1pbWVIZWFkZXJzKCk7Ci0gICAgICAgICAgICBtaW1lSGVhZGVycy5hZGRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbDsgY2hhcnNldD1pc28tODg1OS0xIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKwotICAgICAgICAgICAgICAgICAgICAiL3Rlc3QtcmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yICsgInNvYXAtcGFydC1pc28tODg1OS0xLnhtbCIpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVxdWVzdE1lc3NhZ2UgPSBNZXNzYWdlRmFjdG9yeS5uZXdJbnN0YW5jZSgpLmNyZWF0ZU1lc3NhZ2UobWltZUhlYWRlcnMsZmlsZUlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICBTT0FQQ29ubmVjdGlvbiBzQ29uID0gU09BUENvbm5lY3Rpb25GYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgU09BUE1lc3NhZ2UgcmVzcG9uc2UgPSBzQ29uLmNhbGwocmVxdWVzdE1lc3NhZ2UsIGdldEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5nZXRBdHRhY2htZW50cygpLmhhc05leHQoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2UuY291bnRBdHRhY2htZW50cygpKTsKLQotICAgICAgICAgICAgcHJpbnRTT0FQTWVzc2FnZShyZXF1ZXN0TWVzc2FnZSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2VTdHIgPSBwcmludFNPQVBNZXNzYWdlKHJlc3BvbnNlKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBpcyBzb21lIHRleHQuSGVyZSBhcmUgc29tZSBzcGVjaWFsIGNoYXJzIDogXHUwMEY2XHUwMEM2XHUwMERBXHUwMEFFXHUwMEE0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRTT0FQQm9keSgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb21ldGhpbmciKS5pdGVtKDApLmdldFRleHRDb250ZW50KCkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZVN0ci5pbmRleE9mKCJlY2hvIikgIT0gLTEpOwotICAgICAgICAgICAgc0Nvbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChTT0FQRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbiB3aGlsZSBydW5uaW5nIHRlc3Q6ICIgKyBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb24gd2hpbGUgcnVubmluZyB0ZXN0OiAiICsgZSk7Ci0gICAgICAgIH0KLSAgICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2Fhai90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2Fhai9pbnRlZ3JhdGlvbi9VdGlsU2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4M2E1Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYWFqL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zYWFqL2ludGVncmF0aW9uL1V0aWxTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2Fhai5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TaW1wbGVIVFRQU2VydmVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsU2VydmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgY291bnQgPSAwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2ltcGxlSFRUUFNlcnZlciByZWNlaXZlcjsKLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgZGVwbG95U2VydmljZShBeGlzU2VydmljZSBzZXJ2aWNlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bkRlcGxveVNlcnZpY2UoUU5hbWUgc2VydmljZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS4KLSAgICAgICAgICAgICAgICByZW1vdmVTZXJ2aWNlKHNlcnZpY2UuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdW5EZXBsb3lDbGllbnRTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChyZWNlaXZlci5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVjZWl2ZXIuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVTZXJ2aWNlKCJBbm9ueW1vdXNTZXJ2aWNlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN0YXJ0KG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLlRFU1RJTkdfUkVQT1NJVE9SWSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IHN0YXJ0KFN0cmluZyByZXBvc2l0b3J5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHRlc3RpbmdQb3J0ID0gMDsKLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGVyID0gZ2V0TmV3Q29uZmlndXJhdGlvbkNvbnRleHQocmVwb3NpdG9yeSk7Ci0KLSAgICAgICAgICAgIHRlc3RpbmdQb3J0ID0gZmluZEF2YWlsYWJsZVBvcnQoKTsKLSAgICAgICAgICAgIHJlY2VpdmVyID0gbmV3IFNpbXBsZUhUVFBTZXJ2ZXIoZXIsIHRlc3RpbmdQb3J0KTsKLQotICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdGFydGVkIG9uIHBvcnQgIiArIHRlc3RpbmdQb3J0ICsgIi4uLi4uIik7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJUaHJlYWQgaW50ZXJ1cHRlZCIsIGUxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIHJldHVybiB0ZXN0aW5nUG9ydDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IGdldE5ld0NvbmZpZ3VyYXRpb25Db250ZXh0KFN0cmluZyByZXBvc2l0b3J5KQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcG9zaXRvcnkpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInJlcG9zaXRvcnkgZGlyZWN0b3J5ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsKLSAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJlY2VpdmVyLnN0b3AoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWNlaXZlci5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBzdG9wcGVkIC4uLi4uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkudGVybWluYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyLmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFkZHJlc3NpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlciB7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoImFkZHJlc3NpbmciKSAmJiBuYW1lLmVuZHNXaXRoKCIubWFyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEFkZHJlc3NpbmdNQVJGaWxlKCkgewotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLlRFU1RJTkdfUkVQT1NJVE9SWSk7Ci0gICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMobmV3IEFkZHJlc3NpbmdGaWx0ZXIoKSk7Ci0gICAgICAgIFRlc3RDYXNlLmFzc2VydFRydWUoZmlsZXMubGVuZ3RoID09IDEpOwotICAgICAgICBGaWxlIGZpbGUgPSBmaWxlc1swXTsKLSAgICAgICAgVGVzdENhc2UuYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlQ29udGV4dCBjcmVhdGVBZHJlc3NlZEVuYWJsZWRDbGllbnRTaWRlKAotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSwgU3RyaW5nIGNsaWVudEhvbWUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBGaWxlIGZpbGUgPSBnZXRBZGRyZXNzaW5nTUFSRmlsZSgpOwotICAgICAgICBUZXN0Q2FzZS5hc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwotCi0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShjbGllbnRIb21lLCBudWxsKTsKLSAgICAgICAgQXhpc01vZHVsZSBheGlzTW9kdWxlID0gRGVwbG95bWVudEVuZ2luZS5idWlsZE1vZHVsZShmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZE1vZHVsZShheGlzTW9kdWxlKTsKLSAgICAgICAgLy8gc3lzQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmVuZ2FnZU1vZHVsZShtb2R1bGVEZXNjLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmFkZFNlcnZpY2Uoc2VydmljZSk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlR3JvdXBDb250ZXh0KGNvbmZpZ0NvbnRleHQsIHNlcnZpY2UuZ2V0QXhpc1NlcnZpY2VHcm91cCgpKQotICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlQ29udGV4dChzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZlclNvY2tldCBzcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3MuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgICAgICBzcy5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiA1NTU1OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvUkVBRE1FLnR4dCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTUwNmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVG8gcnVuIHRoaXMgc2FtcGxlIGZvbGxvdyB0aGVzZXMgc3RlcHMKLTEuIHJ1biBnZW5lcmF0ZV9zZXJ2aWNlIGFudCB0YXNrLiAoYW50IGdlbmVyYXRlX3NlcnZpY2UpCi0gICB0aGlzIGdlbmVyYXRlcyB0aGUgc2VydmljZSBhbmQgcHV0IGl0IHRvIHRoZSBybWlzZXJ2aWNlIGZvbGRlciB1bmRlciByZXBvc2l0b3J5Ci0yLiBzdGFydCB0aGUgYXhpczIgc2VydmVyIAotMy4gcnVuIHRoZSBjbGllbnQgKGFudCBydW5fY2xpZW50KQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMwMjJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InNhbXBsZV9zZXJ2aWNlIiBkZWZhdWx0PSJnZW5lcmF0ZV9zZXJ2aWNlIiBiYXNlZGlyPSIuIj4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzYW1wbGVfaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXNfZGlyIiB2YWx1ZT0iJHtzYW1wbGVfaG9tZX0vY2xhc3NlcyIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjX2RpciIgdmFsdWU9IiR7c2FtcGxlX2hvbWV9L3NyYyIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpYl9kaXIiIHZhbHVlPSIke2F4aXMyLmhvbWV9L2xpYiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGlzdF9kaXIiIHZhbHVlPSIke2F4aXMyLmhvbWV9L2Rpc3QiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlcGxveV9kaXIiIHZhbHVlPSIke3NhbXBsZV9ob21lfS9kZXBsb3kiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2VfZmlsZSIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeS9ybWlzZXJ2aWNlcy9ybWlzZXJ2aWNlLmpzYSIvPgotCi0gICAgICAgIDxwYXRoIGlkPSJjbGllbnQuY2xhc3MucGF0aCI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3RfZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLQotICAgICAgICA8L3BhdGg+Ci0KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZV9zZXJ2aWNlIiBkZXBlbmRzPSJjbGVhbiIgZGVzY3JpcHRpb249IkdlbmVyYXRpbmcgdGhlIHNlcnZpY2UgYWFyIj4KLQotICAgICAgICA8ZWNobyBtZXNzYWdlPSJjcmVhdGluZyB0aGUgc2VydmljZSBhYXIgZnJvbSAke3NhbXBsZV9ob21lfSIvPgotCi0gICAgICAgIDwhLS0gY3JlYXRlcyBkZXBsb3kgYW5kIGNsYXNzIGRpcmVjdG9yaXMgLS0+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVwbG95X2Rpcn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXBsb3lfZGlyfS9NRVRBLUlORiIvPgotCi0gICAgICAgIDwhLS0gY29tcGlsaW5nIHRoZSBjbGFzc2VzIC0tPgotICAgICAgICA8amF2YWMgIGRlc3RkaXI9IiR7ZGVwbG95X2Rpcn0iIHNyY2Rpcj0iJHtzcmNfZGlyfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL2NsaWVudC8qIi8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJfZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhYz4KLQotICAgICAgICA8IS0tIGNvcHkgc2VydmljZXMgZmlsZSAtLT4KLSAgICAgICAgPGNvcHkgZmlsZT0iY29uZi9jb25maWcueG1sIiB0b2Rpcj0iJHtkZXBsb3lfZGlyfS9NRVRBLUlORiIvPgotCi0gICAgICAgIDwhLS0gY3JlYXRlIEJhc2ljU2VydmljZVRlc3QuYWFyIGZpbGUgLS0+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7c2VydmljZV9maWxlfSI+Ci0gICAgICAgICAgICA8emlwZmlsZXNldCBkaXI9IiR7ZGVwbG95X2Rpcn0iIHByZWZpeD0iIi8+Ci0gICAgICAgIDwvamFyPgotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bl9jbGllbnQiIGRlcGVuZHM9ImNsZWFuIiBkZXNjcmlwdGlvbj0iUnVubmluZyB0aGUgY2xpZW50cyI+Ci0KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iUnVubmluZyB0aGUgUk1JIGNsaWVudHMiLz4KLQotICAgICAgICA8IS0tIGNyZWF0ZXMgZGVwbG95IGFuZCBjbGFzcyBkaXJlY3RvcmlzIC0tPgotICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXNfZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Rpc3RfZGlyfSIvPgotCi0gICAgICAgIDwhLS0gY29tcGlsaW5nIHRoZSBjbGFzc2VzIC0tPgotICAgICAgICA8amF2YWMgIGRlc3RkaXI9IiR7Y2xhc3Nlc19kaXJ9IiBzcmNkaXI9IiR7c3JjX2Rpcn0iIGRlYnVnPSJvbiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWJfZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhYz4KLQotICAgICAgICA8amFyIGRlc3RmaWxlPSIke2Rpc3RfZGlyfS9ybWlfY2xpZW50LmphciI+Ci0gICAgICAgICAgICA8emlwZmlsZXNldCBkaXI9IiR7Y2xhc3Nlc19kaXJ9IiBwcmVmaXg9IiIvPgotICAgICAgICA8L2phcj4KLQotICAgICAgICA8IS0tIHJ1bm5pbmcgdGhlIGNsaWVudHMgLS0+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnJtaS5jbGllbnQuVGVzdFNlcnZpY2UxIj4KLSAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnJtaS5jbGllbnQuVGVzdFNlcnZpY2UyIj4KLSAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnJtaS5jbGllbnQuVGVzdFNlcnZpY2UzIj4KLSAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnJtaS5jbGllbnQuVGVzdFNlcnZpY2U0Ij4KLSAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIvPgotICAgICAgICA8L2phdmE+Ci0KLSAgICA8L3RhcmdldD4KLQotCi0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iZGVsZXRlcyB0aGUgb2xkIGNvbnRlbnRzdCI+Ci0gICAgICAgIDwhLS08ZGVsZXRlIGRpcj0iJHtjbGFzc2VzX2Rpcn0iLz4tLT4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7ZGVwbG95X2Rpcn0iLz4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlc19kaXJ9Ii8+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2Rpc3RfZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvY29uZi9jb25maWcueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvY29uZi9jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNmZDE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL2NvbmYvY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNvbmZpZyB4bWxucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvcm1pIj4KLSAgICA8Y3VzdG9tQ2xhc3NJbmZvPgotICAgICAgICA8Y2xhc3NJbmZvIGNsYXNzTmFtZT0ic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczEiPgotICAgICAgICAgICAgPGZpZWxkSW5mbyBpc0VsZW1lbnQ9ImZhbHNlIiBqYXZhTmFtZT0icGFyYW0xIiB4bWxOYW1lPSJ4bWxQYXJhbTEiLz4KLSAgICAgICAgICAgIDxmaWVsZEluZm8gaXNFbGVtZW50PSJmYWxzZSIgamF2YU5hbWU9InBhcmFtMyIgeG1sTmFtZT0ieG1sUGFyYW0zIi8+Ci0gICAgICAgIDwvY2xhc3NJbmZvPgotICAgICAgICA8Y2xhc3NJbmZvIGNsYXNzTmFtZT0ic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczIiPgotICAgICAgICAgICAgPGZpZWxkSW5mbyBpc0VsZW1lbnQ9ImZhbHNlIiBqYXZhTmFtZT0icGFyYW0xIiB4bWxOYW1lPSJ4bWxQYXJhbTEiLz4KLSAgICAgICAgICAgIDxmaWVsZEluZm8gaXNFbGVtZW50PSJmYWxzZSIgamF2YU5hbWU9InBhcmFtMiIgeG1sTmFtZT0ieG1sUGFyYW0yIi8+Ci0gICAgICAgICAgICA8ZmllbGRJbmZvIGlzRWxlbWVudD0idHJ1ZSIgamF2YU5hbWU9InBhcmFtMyIgeG1sTmFtZT0ieG1sUGFyYW0zIi8+Ci0gICAgICAgIDwvY2xhc3NJbmZvPgotICAgIDwvY3VzdG9tQ2xhc3NJbmZvPgotICAgIDxwYWNrYWdlVG9OYW1lc3BhY2VNYXBpbmdzPgotICAgICAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICAgICAgPG5hbWVzcGFjZT5odHRwOi8vc2FtcGxlL3NlcnZpY2U8L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlcjwvcGFja2FnZU5hbWU+Ci0gICAgICAgIDwvcGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwPgotICAgICAgICAgICAgPG5hbWVzcGFjZT5odHRwOi8vc2FtcGxlL3NlcnZpY2UvdHlwZXM8L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlci5kdG88L3BhY2thZ2VOYW1lPgotICAgICAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M+Ci0gICAgPHNlcnZpY2VzPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTE8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTI8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgIDwvc2VydmljZXM+Ci08L2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MTJjZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jb25maWcuQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNvbmZpZy5GaWVsZEluZm87Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTFJbnRlcmZhY2U7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczI7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlMSB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLSAgICBwdWJsaWMgVGVzdFNlcnZpY2UxKCkgewotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gbmV3IENvbmZpZ3VyYXRvcigpOwotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIiLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS90eXBlcyIpOwotCi0gICAgICAgIENsYXNzSW5mbyBjbGFzc0luZm8gPSBuZXcgQ2xhc3NJbmZvKFRlc3RDbGFzczEuY2xhc3MpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMSIsICJ4bWxQYXJhbTEiLCBmYWxzZSkpOwotICAgICAgICBjbGFzc0luZm8uYWRkRmllbGRJbmZvKG5ldyBGaWVsZEluZm8oInBhcmFtMyIsICJ4bWxQYXJhbTMiLCBmYWxzZSkpOwotCi0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZENsYXNzSW5mbyhjbGFzc0luZm8pOwotCi0gICAgICAgIGNsYXNzSW5mbyA9IG5ldyBDbGFzc0luZm8oVGVzdENsYXNzMi5jbGFzcyk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0xIiwgInhtbFBhcmFtMSIsIGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0yIiwgInhtbFBhcmFtMiIsIGZhbHNlKSk7Ci0gICAgICAgIGNsYXNzSW5mby5hZGRGaWVsZEluZm8obmV3IEZpZWxkSW5mbygicGFyYW0zIiwgInhtbFBhcmFtMyIsIHRydWUpKTsKLQotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRDbGFzc0luZm8oY2xhc3NJbmZvKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxKCkgewotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczEgdGVzdENsYXNzMSA9ICBuZXcgVGVzdENsYXNzMSgpOwotICAgICAgICAgICAgdGVzdENsYXNzMS5zZXRQYXJhbTEoNSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MxLnNldFBhcmFtMigiaGVsbG93IHdvcmxkIik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MxLnNldFBhcmFtMyhuZXcgSW50ZWdlcig2KSk7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczEgcmVzdWx0ID0gcHJveHkubWV0aG9kMSh0ZXN0Q2xhc3MxKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0xID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0yID09PiAiICsgcmVzdWx0LmdldFBhcmFtMigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0zID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczIgdGVzdENsYXNzMiA9IG5ldyBUZXN0Q2xhc3MyKCk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMSg1KTsKLSAgICAgICAgICAgIHRlc3RDbGFzczIuc2V0UGFyYW0yKCJ0ZXN0IFN0cmluZyIpOwotCi0gICAgICAgICAgICBUZXN0Q2xhc3MxW10gdGVzdENsYXNzMXMgPSBuZXcgVGVzdENsYXNzMVsyXTsKLSAgICAgICAgICAgIHRlc3RDbGFzczFzWzBdID0gIG5ldyBUZXN0Q2xhc3MxKCk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3Mxc1swXS5zZXRQYXJhbTEoNSk7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3Mxc1swXS5zZXRQYXJhbTIoImhlbGxvdyB3b3JsZCIpOwotICAgICAgICAgICAgdGVzdENsYXNzMXNbMF0uc2V0UGFyYW0zKG5ldyBJbnRlZ2VyKDYpKTsKLQotICAgICAgICAgICAgdGVzdENsYXNzMXNbMV0gPSAgbmV3IFRlc3RDbGFzczEoKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczFzWzFdLnNldFBhcmFtMSg1KTsKLSAgICAgICAgICAgIHRlc3RDbGFzczFzWzFdLnNldFBhcmFtMigiaGVsbG93IHdvcmxkIik7Ci0gICAgICAgICAgICB0ZXN0Q2xhc3Mxc1sxXS5zZXRQYXJhbTMobmV3IEludGVnZXIoNikpOwotCi0gICAgICAgICAgICB0ZXN0Q2xhc3MyLnNldFBhcmFtMyh0ZXN0Q2xhc3Mxcyk7Ci0KLSAgICAgICAgICAgIFRlc3RDbGFzczIgcmVzdWx0ID0gcHJveHkubWV0aG9kMih0ZXN0Q2xhc3MyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0xID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0yID09PiAiICsgcmVzdWx0LmdldFBhcmFtMigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0zWzBdIHBhcmFtMSA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTMoKVswXS5nZXRQYXJhbTEoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmFtM1swXSBwYXJhbTIgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0zKClbMF0uZ2V0UGFyYW0yKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbTNbMF0gcGFyYW0zID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpWzBdLmdldFBhcmFtMygpKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbTNbMV0gcGFyYW0xID09PiAiICsgcmVzdWx0LmdldFBhcmFtMygpWzFdLmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0zWzFdIHBhcmFtMiA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTMoKVsxXS5nZXRQYXJhbTIoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcmFtM1sxXSBwYXJhbTMgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0zKClbMV0uZ2V0UGFyYW0zKCkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTEgdGVzdFNlcnZpY2UxID0gbmV3IFRlc3RTZXJ2aWNlMSgpOwotICAgICAgICB0ZXN0U2VydmljZTEudGVzdE1ldGhvZDEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UxLnRlc3RNZXRob2QyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mzk1MTFhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuY2xpZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlMkludGVyZmFjZTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdFJlc3RyaWN0aW9uQmVhbjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENvbXBsZXhCZWFuOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5UZXN0QmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2UyIHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotICAgIHB1YmxpYyBUZXN0U2VydmljZTIoKSB7Ci0KLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIiLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS90eXBlcyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxKCl7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTJJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTJJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UySW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UyIik7Ci0gICAgICAgICAgICBUZXN0UmVzdHJpY3Rpb25CZWFuIHRlc3RSZXN0cmljdGlvbkJlYW4gPSBuZXcgVGVzdFJlc3RyaWN0aW9uQmVhbigidGVzdHZhbHVlIik7Ci0gICAgICAgICAgICBUZXN0UmVzdHJpY3Rpb25CZWFuIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDEodGVzdFJlc3RyaWN0aW9uQmVhbik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTEoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCl7Ci0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTJJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTJJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UySW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UyIik7Ci0gICAgICAgICAgICBUZXN0Q29tcGxleEJlYW4gdGVzdENvbXBsZXhCZWFuID0gbmV3IFRlc3RDb21wbGV4QmVhbigpOwotICAgICAgICAgICAgdGVzdENvbXBsZXhCZWFuLmFkZFRlc3RCZWFuKG5ldyBUZXN0QmVhbig1LCJ0ZXN0c3RyaW5nMSIpKTsKLSAgICAgICAgICAgIHRlc3RDb21wbGV4QmVhbi5hZGRUZXN0QmVhbihuZXcgVGVzdEJlYW4oNiwidGVzdHN0cmluZzIiKSk7Ci0gICAgICAgICAgICB0ZXN0Q29tcGxleEJlYW4uYWRkVGVzdEJlYW4obmV3IFRlc3RCZWFuKDcsInRlc3RzdHJpbmczIikpOwotICAgICAgICAgICAgVGVzdENvbXBsZXhCZWFuIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIodGVzdENvbXBsZXhCZWFuKTsKLSAgICAgICAgICAgIFRlc3RCZWFuIHRlc3RCZWFuOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LmdldFRlc3RCZWFucygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KXsKLSAgICAgICAgICAgICAgICB0ZXN0QmVhbiA9IChUZXN0QmVhbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJtMSA9PT4gIiArIHRlc3RCZWFuLmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcm0yID09PiAiICsgdGVzdEJlYW4uZ2V0UGFyYW0yKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTIgdGVzdFNlcnZpY2UyID0gbmV3IFRlc3RTZXJ2aWNlMigpOwotICAgICAgICB0ZXN0U2VydmljZTIudGVzdE1ldGhvZDEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UyLnRlc3RNZXRob2QyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UxLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2Mzk5NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDbGFzczI7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2UxIGltcGxlbWVudHMgU2VydmljZTFJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFRlc3RDbGFzczEgbWV0aG9kMShUZXN0Q2xhc3MxIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MyIG1ldGhvZDIoVGVzdENsYXNzMiBwYXJhbTEpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTFJbnRlcmZhY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMUludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWYzZWIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMUludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENsYXNzMTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENsYXNzMjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UxSW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MxIG1ldGhvZDEoVGVzdENsYXNzMSBwYXJhbTEpOwotCi0gICAgcHVibGljIFRlc3RDbGFzczIgbWV0aG9kMihUZXN0Q2xhc3MyIHBhcmFtMSk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjMwNWQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXI7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdFJlc3RyaWN0aW9uQmVhbjsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uVGVzdENvbXBsZXhCZWFuOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMiBpbXBsZW1lbnRzIFNlcnZpY2UySW50ZXJmYWNlewotCi0gICAgcHVibGljIFRlc3RSZXN0cmljdGlvbkJlYW4gbWV0aG9kMShUZXN0UmVzdHJpY3Rpb25CZWFuIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q29tcGxleEJlYW4gbWV0aG9kMihUZXN0Q29tcGxleEJlYW4gcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UySW50ZXJmYWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2YmI3ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RSZXN0cmljdGlvbkJlYW47Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDb21wbGV4QmVhbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UySW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBUZXN0UmVzdHJpY3Rpb25CZWFuIG1ldGhvZDEoVGVzdFJlc3RyaWN0aW9uQmVhbiBwYXJhbTEpOwotCi0gICAgcHVibGljIFRlc3RDb21wbGV4QmVhbiBtZXRob2QyKFRlc3RDb21wbGV4QmVhbiBwYXJhbTEpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0QmVhbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjIzMWE1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJlYW4gewotCi0gICAgcHJpdmF0ZSBpbnQgcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMjsKLQotICAgIHB1YmxpYyBUZXN0QmVhbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEJlYW4oaW50IHBhcmFtMSwgU3RyaW5nIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKGludCBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKFN0cmluZyBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MxLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4NzRkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0KLSAgICBwcml2YXRlIGludCBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW0yOwotICAgIHByaXZhdGUgSW50ZWdlciBwYXJhbTM7Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoaW50IHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoU3RyaW5nIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50ZWdlciBnZXRQYXJhbTMoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0zKEludGVnZXIgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdENsYXNzMi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTVlNzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci5kdG87Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDbGFzczIgewotCi0gICAgcHJpdmF0ZSBpbnQgcGFyYW0xOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFtMjsKLSAgICBwcml2YXRlIFRlc3RDbGFzczFbXSBwYXJhbTM7Ci0KLSAgICBwdWJsaWMgaW50IGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoaW50IHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMigpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTIoU3RyaW5nIHBhcmFtMikgewotICAgICAgICB0aGlzLnBhcmFtMiA9IHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdENsYXNzMVtdIGdldFBhcmFtMygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTMoVGVzdENsYXNzMVtdIHBhcmFtMykgewotICAgICAgICB0aGlzLnBhcmFtMyA9IHBhcmFtMzsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q29tcGxleEJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdENvbXBsZXhCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjNjNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q29tcGxleEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci5kdG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5kYXRhYmluZC5BYnN0cmFjdFJNSUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuSmF2YU9iamVjdFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuWG1sU3RyZWFtUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuTmFtZXNwYWNlUHJlZml4OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5YbWxTZXJpYWxpemluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci50eXBlLlRlc3RDb21wbGV4VHlwZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBsZXhCZWFuIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuIHsKLQotICAgIHByaXZhdGUgTGlzdCB0ZXN0QmVhbnM7Ci0KLSAgICBwdWJsaWMgVGVzdENvbXBsZXhCZWFuKCkgewotICAgICAgICB0aGlzLnRlc3RCZWFucyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsYXNzIGdldEJlYW5DbGFzcygpewotICAgICAgICByZXR1cm4gVGVzdENvbXBsZXhUeXBlLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBzZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgWG1sU2VyaWFsaXppbmdFeGNlcHRpb24gewotICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnQgZWxlbWVudAotICAgICAgICB3cml0ZVN0YXJ0RWxlbWVudCh3cml0ZXIsCi0gICAgICAgICAgICAgICAgcGFyZW50UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkvc2FtcGxlcy90eXBlcyI7Ci0gICAgICAgIFRlc3RCZWFuIHRlc3RCZWFuOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZXN0QmVhbnMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspewotICAgICAgICAgICAgdGVzdEJlYW4gPSAoVGVzdEJlYW4pIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLG5hbWVzcGFjZSwicGFyYW0xIixuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyhTdHJpbmcudmFsdWVPZih0ZXN0QmVhbi5nZXRQYXJhbTEoKSkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLG5hbWVzcGFjZSwicGFyYW0yIixuYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlQ2hhcmFjdGVycyh0ZXN0QmVhbi5nZXRQYXJhbTIoKSk7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYXR0cmlidXRlcwotICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkvc2FtcGxlcy90eXBlcyI7Ci0gICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSA9IHJlYWRlci5nZXROYW1lKCk7Ci0gICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgd2hpbGUoIXJlYWRlci5pc1N0YXJ0RWxlbWVudCgpKXsKLSAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgfQotICAgICAgICAgVGVzdENvbXBsZXhCZWFuIHRlc3RDb21wbGV4QmVhbiA9IG5ldyBUZXN0Q29tcGxleEJlYW4oKTsKLSAgICAgICAgIFRlc3RCZWFuIHRlc3RCZWFuOwotICAgICAgICAgLy8gbm93IHJlYWRlciBpcyBhdCB0aGUgYmVnaW5pbmcuCi0gICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgIHRlc3RCZWFuID0gbmV3IFRlc3RCZWFuKCk7Ci0gICAgICAgICAgICAgaWYgKHJlYWRlci5nZXROYW1lKCkuZXF1YWxzKG5ldyBRTmFtZShuYW1lc3BhY2UsICJwYXJhbTEiKSkpIHsKLSAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgdGVzdEJlYW4uc2V0UGFyYW0xKEludGVnZXIucGFyc2VJbnQocmVhZGVyLmdldFRleHQoKSkpOwotICAgICAgICAgICAgICAgICB3aGlsZSAoIXJlYWRlci5pc0VuZEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICByZWFkZXIubmV4dCgpOwotICAgICAgICAgICAgIGlmIChyZWFkZXIuZ2V0TmFtZSgpLmVxdWFscyhuZXcgUU5hbWUobmFtZXNwYWNlLCAicGFyYW0yIikpKSB7Ci0gICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgIHRlc3RCZWFuLnNldFBhcmFtMihyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgd2hpbGUgKCFyZWFkZXIuaXNFbmRFbGVtZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICB0ZXN0Q29tcGxleEJlYW4uYWRkVGVzdEJlYW4odGVzdEJlYW4pOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIHRlc3RDb21wbGV4QmVhbjsKLSAgICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVGVzdEJlYW4oVGVzdEJlYW4gdGVzdEJlYW4pewotICAgICAgICB0aGlzLnRlc3RCZWFucy5hZGQodGVzdEJlYW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFRlc3RCZWFucygpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RCZWFuczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0QmVhbnMoTGlzdCB0ZXN0QmVhbnMpIHsKLSAgICAgICAgdGhpcy50ZXN0QmVhbnMgPSB0ZXN0QmVhbnM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RSZXN0cmljdGlvbkJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYwODJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vVGVzdFJlc3RyaWN0aW9uQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuQWJzdHJhY3RSTUlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLkphdmFPYmplY3RTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmRhdGFiaW5kLlhtbFN0cmVhbVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sUGFyc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5leGNlcHRpb24uWG1sU2VyaWFsaXppbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5OYW1lc3BhY2VQcmVmaXg7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZS5UZXN0UmVzdHJpY3Rpb25UeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25CZWFuIGV4dGVuZHMgQWJzdHJhY3RSTUlCZWFuIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTE7Ci0KLSAgICBwdWJsaWMgVGVzdFJlc3RyaWN0aW9uQmVhbihTdHJpbmcgcGFyYW0xKSB7Ci0gICAgICAgIHRoaXMucGFyYW0xID0gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhT2JqZWN0U2VyaWFsaXplciBzZXJpYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJlbnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlUHJlZml4IG5hbWVzcGFjZVByZWZpeCkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFNlcmlhbGl6aW5nRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVTdGFydEVsZW1lbnQod3JpdGVyLCBwYXJlbnRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgcGFyZW50UU5hbWUuZ2V0TG9jYWxQYXJ0KCksIG5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMocGFyYW0xKTsKLSAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0QmVhbkNsYXNzKCl7Ci0gICAgICAgIHJldHVybiBUZXN0UmVzdHJpY3Rpb25UeXBlLmNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHBhcnNlKFhNTFN0cmVhbVJlYWRlciByZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWG1sU3RyZWFtUGFyc2VyIHBhcnNlcikKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24sIFhtbFBhcnNpbmdFeGNlcHRpb24gewotCi0gICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICBUZXN0UmVzdHJpY3Rpb25CZWFuIHRlc3RSZXN0cmljdGlvbkJlYW4gPSBuZXcgVGVzdFJlc3RyaWN0aW9uQmVhbihyZWFkZXIuZ2V0VGV4dCgpKTsKLSAgICAgICB3aGlsZSAocmVhZGVyLmlzRW5kRWxlbWVudCgpKXsKLSAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHRlc3RSZXN0cmljdGlvbkJlYW47Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtMSgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTEoU3RyaW5nIHBhcmFtMSkgewotICAgICAgICB0aGlzLnBhcmFtMSA9IHBhcmFtMTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0Q29tcGxleFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci90eXBlL1Rlc3RDb21wbGV4VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmE3ZGNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci90eXBlL1Rlc3RDb21wbGV4VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RDb21wbGV4QmVhbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RDb21wbGV4VHlwZSBleHRlbmRzIEFic3RyYWN0VHlwZSB7Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZU1ldGFEYXRhKENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgcHJvY2Vzc2VkVHlwZU1hcCkKLSAgICAgICAgICAgIHRocm93cyBNZXRhRGF0YVBvcHVsYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5qYXZhQ2xhc3MgPSBUZXN0Q29tcGxleEJlYW4uY2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZSA9ICJzZXF1ZW5jZU1heE9jY3Jlc1R5cGUiOwotICAgICAgICB0aGlzLm5hbWVzcGFjZSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkvc2FtcGxlcy90eXBlcyI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFRlc3RDb21wbGV4WG1sVHlwZSgpOwotICAgICAgICB0aGlzLnhtbFR5cGUuc2V0UW5hbWUobmV3IFFOYW1lKHRoaXMubmFtZXNwYWNlLHRoaXMubmFtZSkpOwotICAgICAgICByZWdpc3RlclhtbFR5cGUoc2NoZW1hTWFwKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYWR2YW5jZWQtcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci90eXBlL1Rlc3RDb21wbGV4WG1sVHlwZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdENvbXBsZXhYbWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWIwYWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdENvbXBsZXhYbWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci50eXBlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkubWV0YWRhdGEueG1sLkFic3RyYWN0WG1sVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5tZXRhZGF0YS54bWwuWG1sQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmV4Y2VwdGlvbi5TY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLnV0aWwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENvbXBsZXhYbWxUeXBlIGV4dGVuZHMgQWJzdHJhY3RYbWxUeXBlIHsKLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgeHNkUHJlZml4ID0gKFN0cmluZykgbmFtZXNwYWNlc1RvUHJlZml4TWFwLmdldChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCk7Ci0gICAgICAgIHRoaXMudHlwZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsICJjb21wbGV4VHlwZSIpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICAgICAgdGhpcy50eXBlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGlzLnFuYW1lLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICBFbGVtZW50IHNlcXVlbmNlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgInNlcXVlbmNlIik7Ci0gICAgICAgIHNlcXVlbmNlRWxlbWVudC5zZXRQcmVmaXgoeHNkUHJlZml4KTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgibWluT2NjdXJzIiwiMCIpOwotICAgICAgICBzZXF1ZW5jZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJtYXhPY2N1cnMiLCJ1bmJvdW5kZWQiKTsKLQotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LmFwcGVuZENoaWxkKHNlcXVlbmNlRWxlbWVudCk7Ci0gICAgICAgIC8vIGFkZGluZyB0d28gZWxlbWVudHMKLSAgICAgICAgRWxlbWVudCBwYXJhbTEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsImVsZW1lbnQiKTsKLSAgICAgICAgcGFyYW0xLnNldEF0dHJpYnV0ZSgibmFtZSIsInBhcmFtMSIpOwotICAgICAgICBwYXJhbTEuc2V0QXR0cmlidXRlKCJ0eXBlIiwgeHNkUHJlZml4ICsgIjppbnQiKTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtMSk7Ci0KLSAgICAgICAgRWxlbWVudCBwYXJhbTIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsImVsZW1lbnQiKTsKLSAgICAgICAgcGFyYW0yLnNldEF0dHJpYnV0ZSgibmFtZSIsInBhcmFtMiIpOwotICAgICAgICBwYXJhbTIuc2V0QXR0cmlidXRlKCJ0eXBlIiwgeHNkUHJlZml4ICsgIjpzdHJpbmciKTsKLSAgICAgICAgc2VxdWVuY2VFbGVtZW50LmFwcGVuZENoaWxkKHBhcmFtMik7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25UeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MTJiNmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdFJlc3RyaWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLk1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlRlc3RSZXN0cmljdGlvbkJlYW47Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UmVzdHJpY3Rpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RUeXBlIHsKLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlTWV0YURhdGEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBwcm9jZXNzZWRUeXBlTWFwKQotICAgICAgICAgICAgdGhyb3dzIE1ldGFEYXRhUG9wdWxhdGVFeGNlcHRpb24gewotICAgICAgICB0aGlzLmphdmFDbGFzcyA9IFRlc3RSZXN0cmljdGlvbkJlYW4uY2xhc3M7Ci0gICAgICAgIHRoaXMubmFtZSA9ICJzaW1wbGVSZXN0cmljdGlvbiI7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gImh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3JtaS9zYW1wbGUvdHlwZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGVTY2hlbWEoQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hTWFwKQotICAgICAgICAgICAgdGhyb3dzIFNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb24gewotICAgICAgICB0aGlzLmlzU2NoZW1hR2VuZXJhdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy54bWxUeXBlID0gbmV3IFRlc3RSZXN0cmljdGlvblhtbFR5cGUoKTsKLSAgICAgICAgdGhpcy54bWxUeXBlLnNldFFuYW1lKG5ldyBRTmFtZSh0aGlzLm5hbWVzcGFjZSx0aGlzLm5hbWUpKTsKLSAgICAgICAgcmVnaXN0ZXJYbWxUeXBlKHNjaGVtYU1hcCk7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2FkdmFuY2VkLXJtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvdHlwZS9UZXN0UmVzdHJpY3Rpb25YbWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YWNmM2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9hZHZhbmNlZC1ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL3R5cGUvVGVzdFJlc3RyaWN0aW9uWG1sVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIudHlwZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLm1ldGFkYXRhLnhtbC5BYnN0cmFjdFhtbFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZXhjZXB0aW9uLlNjaGVtYUdlbmVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkudXRpbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RSZXN0cmljdGlvblhtbFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGUgewotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlV1NETFNjaGVtYShEb2N1bWVudCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwIG5hbWVzcGFjZXNUb1ByZWZpeE1hcCkKLSAgICAgICAgICAgIHRocm93cyBTY2hlbWFHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBzaW1wbGUgdHlwZSBFbGVtZW50IGhlcmUKLSAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9IChTdHJpbmcpIG5hbWVzcGFjZXNUb1ByZWZpeE1hcC5nZXQoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAic2ltcGxlVHlwZSIpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICB0aGlzLnR5cGVFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHRoaXMucW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIEVsZW1lbnQgcmVzdHJpY3Rpb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNELCAicmVzdHJpY3Rpb24iKTsKLSAgICAgICAgcmVzdHJpY3Rpb25FbGVtZW50LnNldFByZWZpeCh4c2RQcmVmaXgpOwotICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJiYXNlIiwgeHNkUHJlZml4ICsgIjpzdHJpbmciKTsKLSAgICAgICAgdGhpcy50eXBlRWxlbWVudC5hcHBlbmRDaGlsZChyZXN0cmljdGlvbkVsZW1lbnQpOwotCi0gICAgICAgIEVsZW1lbnQgZW51bWVyYXRpb25FbGVtZW50ID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIGVudW1lcmF0aW9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgImVudW1lcmF0aW9uIik7Ci0gICAgICAgICAgICBlbnVtZXJhdGlvbkVsZW1lbnQuc2V0UHJlZml4KHhzZFByZWZpeCk7Ci0gICAgICAgICAgICBlbnVtZXJhdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsICJ0ZXN0VmFsdWUiICsgaSk7Ci0gICAgICAgICAgICByZXN0cmljdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoZW51bWVyYXRpb25FbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9SRUFETUUgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2Jvb2svUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTMyMjQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIEF4aXMyIGluIGEgc2VydmxldCBjb250YWluZXIuIFlvdSBtdXN0IA0KLWhhdmUgTWF2ZW4gMi54IGluc3RhbGxlZCB0byBidWlsZCB0aGlzIGV4YW1wbGUuICBUbyBidWlsZCB0eXBlOg0KLQ0KLSQgbXZuIGluc3RhbGwgd2FyOndhcg0KLQ0KLVJlbmFtZSB0aGUgcmVzdWx0YW50IHdhciBhcyB5b3VyX3dlYl9hcHAud2FyIGFuZCBkcm9wIGl0IGludG8gYW55IHNlcnZsZXQgZW5naW5lLiANCi1UaGUgV1NETCBmaWxlIGZvciB0aGUgc2VydmljZSBzaG91bGQgYmUgdmlld2FibGUgYXQ6DQotDQotaHR0cDovL3lvdXJob3N0OnBvcnQveW91cl93ZWJfYXBwL3NlcnZpY2VzL0Jvb2tTZXJ2aWNlP3dzZGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2Jvb2svcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzU1NWEzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1ib29rPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkJvb2sgRXhhbXBsZTwvbmFtZT4KLSAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgPGluY2VwdGlvblllYXI+MjAwNDwvaW5jZXB0aW9uWWVhcj4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb208L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuODwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuODwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWE8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5YbWxTY2hlbWE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuNDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjc8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d29vZHN0b3g8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c3R4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+YXNsLTMuMi40PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjYuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi10cmFuc3BvcnQtbG9jYWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx3YXJTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvd2ViYXBwPC93YXJTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy90ZXN0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLndzZGw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLQotICAgIDwhLS0gIG5lZWRlZCBmb3IgWG1sU2NoZW1hIC0tPgotICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmliaWJsaW88L2lkPgotICAgICAgICAgICAgPG5hbWU+aWJpYmxpbyBtYXZlbiByZXBvc2l0b3J5PC9uYW1lPgotICAgICAgICAgICAgPHVybD5odHRwOi8vaWJpYmxpby5vcmcvbWF2ZW4vPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmFwYWNoZTwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT5BcGFjaGUgbWF2ZW4gcmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvamF2YS1yZXBvc2l0b3J5LzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2Jvb2svc3JjL21haW4vbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvbWFpbi9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc1N2U0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvbWFpbi9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLg0KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4NCi0NCi0jIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuRmlsZT1heGlzMi5sb2cNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkFwcGVuZD10cnVlDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgWyV0XSAlLTVwICVjICV4IC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvbWFpbi9zYW1wbGVzL2RlbW8vQm9vay5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy9tYWluL3NhbXBsZXMvZGVtby9Cb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDk0NTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy9tYWluL3NhbXBsZXMvZGVtby9Cb29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBzYW1wbGVzLmRlbW87DQotDQotcHVibGljIGNsYXNzIEJvb2sgew0KLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgaXNibjsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElzYm4oKSB7DQotICAgICAgICByZXR1cm4gaXNibjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJc2JuKFN0cmluZyBpc2JuKSB7DQotICAgICAgICB0aGlzLmlzYm4gPSBpc2JuOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7DQotICAgICAgICByZXR1cm4gdGl0bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7DQotICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7DQotICAgICAgICByZXR1cm4gYXV0aG9yOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgYXV0aG9yKSB7DQotICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsNCi0gICAgfQ0KLX0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2Jvb2svc3JjL21haW4vc2FtcGxlcy9kZW1vL0Jvb2tTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2Jvb2svc3JjL21haW4vc2FtcGxlcy9kZW1vL0Jvb2tTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTY1NTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy9tYWluL3NhbXBsZXMvZGVtby9Cb29rU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugc2FtcGxlcy5kZW1vOw0KLQ0KLXB1YmxpYyBjbGFzcyBCb29rU2VydmljZSB7DQotICAgIHByaXZhdGUgQm9vayBvbmx5Qm9vazsNCi0NCi0gICAgcHVibGljIEJvb2tTZXJ2aWNlKCkgew0KLSAgICAgICAgb25seUJvb2sgPSBuZXcgQm9vaygpOw0KLSAgICAgICAgb25seUJvb2suc2V0QXV0aG9yKCJHbGVuIERhbmllbHMiKTsNCi0gICAgICAgIG9ubHlCb29rLnNldFRpdGxlKCJVc2luZyBBeGlzMiIpOw0KLSAgICAgICAgb25seUJvb2suc2V0SXNibigiMDEyMzQ1Njc4OSIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBCb29rW10gZ2V0Qm9va3MoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEJvb2tbXXtvbmx5Qm9va307DQotICAgIH0NCi0NCi0gICAgcHVibGljIEJvb2sgZmluZEJvb2soU3RyaW5nIGlzYm4pIHsNCi0gICAgICAgIGlmIChpc2JuLmVxdWFscyhvbmx5Qm9vay5nZXRJc2JuKCkpKQ0KLSAgICAgICAgICAgIHJldHVybiBvbmx5Qm9vazsNCi0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvd2ViYXBwL1dFQi1JTkYvc2VydmljZXMvQm9va1NlcnZpY2UvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi9zZXJ2aWNlcy9Cb29rU2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNmFlOGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi9zZXJ2aWNlcy9Cb29rU2VydmljZS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08c2VydmljZUdyb3VwPg0KLQk8c2VydmljZSBuYW1lPSJCb29rU2VydmljZSINCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9zYW1wbGVzL2Jvb2svIj4NCi0JCTxkZXNjcmlwdGlvbj4NCi0JCQlCb29rIHNhbXBsZSBzZXJ2aWNlDQotCQk8L2Rlc2NyaXB0aW9uPg0KLSAgICAgICAgPHNjaGVtYSBzY2hlbWFOYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3NhbXBsZXMvYm9vay94c2QvIi8+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgbG9ja2VkPSJmYWxzZSI+c2FtcGxlcy5kZW1vLkJvb2tTZXJ2aWNlPC9wYXJhbWV0ZXI+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tzIj4NCi0JCQk8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+DQotCQk8L29wZXJhdGlvbj4NCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZmluZEJvb2siPg0KLSAgICAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDwvb3BlcmF0aW9uPg0KLQk8L3NlcnZpY2U+DQotPC9zZXJ2aWNlR3JvdXA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ib29rL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmVhMzIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvYm9vay9zcmMvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4NCi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08IURPQ1RZUEUgd2ViLWFwcA0KLSAgICBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiINCi0gICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+DQotICAgIA0KLTx3ZWItYXBwPg0KLQ0KLSAgICA8c2VydmxldD4NCi0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgICAgIDxkaXNwbGF5LW5hbWU+QXBhY2hlLUF4aXMgU2VydmxldDwvZGlzcGxheS1uYW1lPg0KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldDwvc2VydmxldC1jbGFzcz4NCi0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPg0KLSAgICA8L3NlcnZsZXQ+DQotDQotICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICA8c2VydmxldC1uYW1lPkF4aXNTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgIDx1cmwtcGF0dGVybj4vc2VydmljZXMvKjwvdXJsLXBhdHRlcm4+DQotICA8L3NlcnZsZXQtbWFwcGluZz4NCi08L3dlYi1hcHA+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQzMjk3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIEZlYiAxMSwgMjAwNSAxOjA0OjIxIFBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgVGhpcyBidWlsZCBmaWxlIGlzIGludGVuZGVkIHRvIGNvbXBpbGUgYW5kIHJ1biB0aGUgQXhpczIgc2FtcGxlcwotICAgICAgcHJvdmlkZWQgaGVyZSB3aXRoIHRoZSBzZXJ2aWNlIGJlaW5nIGRlcGxveWVkIGF0IFRvbWNhdCBvciBieQotICAgICAgcnVubmluZyBhIHNpbXBsZSBBeGlzMiBzZXJ2ZXIuICAgCi0gICAgIAotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJzYW1wbGVzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJjb21waWxlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9InNyYyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgdmFsdWU9Ii4vY2xhc3NlcyIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImphcmRyb3AuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NlcnZpY2VzIi8+Ci0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iQVhJUzJfSE9NRSIgdmFsdWU9Ii4uLy4uIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImF4aXMuc2VydmVySmFyRHJvcC5kaXIiIHZhbHVlPSIke0FYSVMyX0hPTUV9L1dFQi1JTkYvc2VydmljZXMiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb25mLmRpciIgdmFsdWU9ImNvbmYiLz4KLQotICAgIDxwYXRoIGlkPSJjbGFzc3BhdGgubGlicmFyeSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9XRUItSU5GL2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCi0gICAgPHBhdGggaWQ9ImNsYXNzcGF0aC5jbGllbnQiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7bGliLmRpcn0iPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLQotICAgIDxwYXRoIGlkPSJjbGFzc3BhdGgucnVudGltZWxpYnJhcmllcyI+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJjbGFzc3BhdGgubGlicmFyeSIvPgotICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoLmNsaWVudCIvPgotICAgIDwvcGF0aD4KLQotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KLQotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiBmYWlsb25lcnJvcj0iZmFsc2UiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGVBeGlzSG9tZSI+Ci0gICAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtBWElTMl9IT01FfX0iIHR5cGU9ImRpciIgcHJvcGVydHk9ImF4aXMyLmRlcGxveWVkIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InZhbGlkYXRlU2V2aWNlcy5kaXIiPgotICAgICAgICA8YXZhaWxhYmxlIGZpbGU9IiR7QVhJUzJfSE9NRX0vV0VCLUlORi9zZXJ2aWNlcyIgdHlwZT0iZGlyIiBwcm9wZXJ0eT0iYXhpczIuc2VydmljZXMiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGVEZXBsb3ltZW50U2V0dGluZ3MiIGRlcGVuZHM9InZhbGlkYXRlQXhpc0hvbWUiIHVubGVzcz0idmFsaWRhdGVTZXZpY2VzLmRpciI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7QVhJUzJfSE9NRX0vV0VCLUlORi9zZXJ2aWNlcyIvPgotICAgIDwvdGFyZ2V0PgotCi0KLSAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZURpciI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2xpYi5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7amFyZHJvcC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImNsZWFuLGNyZWF0ZURpciI+Ci0gICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC5saWJyYXJ5Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7bGliLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS1hbGwuamFyIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KLSAgICAgICAgPC9qYXI+Ci0KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtjb25mLmRpcn0vc2VydmljZXMueG1sIiB0b2Rpcj0iJHtidWlsZC5kaXJ9L01FVEEtSU5GIiBvdmVyd3JpdGU9InRydWUiLz4KLQotICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phcmRyb3AuZGlyfS9zYW1wbGUxLmphciI+Ci0KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL0VjaG9YTUwuY2xhc3MiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0KLQotICAgICAgICA8Y29weSBmaWxlPSIke2NvbmYuZGlyfS9zZXJ2aWNlNHdpdGhoYW5kbGVyLnhtbCIgdG9maWxlPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYvc2VydmljZXMueG1sIiBvdmVyd3JpdGU9InRydWUiLz4KLQotICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phcmRyb3AuZGlyfS9zYW1wbGUxV2l0aEhhbmRsZXIuamFyIj4KLQotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovRWNob1hNTC5jbGFzcyIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL0xvZ2dpbmdIYW5kbGVyLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvc2VydmljZXMueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtjbGFzc2VzLmRpcn0iIGZhaWxvbmVycm9yPSJmYWxzZSIvPgotICAgIDwvdGFyZ2V0PgotCi0KLSAgICA8dGFyZ2V0IG5hbWU9ImRlcGxveSIgZGVwZW5kcz0iY29tcGlsZSx2YWxpZGF0ZURlcGxveW1lbnRTZXR0aW5ncyI+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amFyZHJvcC5kaXJ9L3NhbXBsZTEuamFyIiB0b2Rpcj0iJHtheGlzLnNlcnZlckphckRyb3AuZGlyfSIgb3ZlcndyaXRlPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amFyZHJvcC5kaXJ9L3NhbXBsZTFXaXRoSGFuZGxlci5qYXIiIHRvZGlyPSIke2F4aXMuc2VydmVySmFyRHJvcC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZWNobyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLnNhbXBsZTEuU3luY2hyb25vdXNDbGllbnQiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1bnRpbWVsaWJyYXJpZXMiLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IjgwODAiLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii9heGlzMi9zZXJ2aWNlcy9zYW1wbGUxIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZWNob1dpdGhIYW5kbGVyIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUuc2FtcGxlMS5TeW5jaHJvbm91c0NsaWVudCI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgucnVudGltZWxpYnJhcmllcyIvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iODA4MCIvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iL2F4aXMyL3NlcnZpY2VzL3NhbXBsZTFXaXRoSGFuZGxlciIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImVjaG9Bc3luYyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLnNhbXBsZTEuQXN5bmNocm9ub3VzQ2xpZW50Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC5ydW50aW1lbGlicmFyaWVzIi8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSI4MDgwIi8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIvYXhpczIvc2VydmljZXMvc2FtcGxlMSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlNHdpdGhoYW5kbGVyLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlNHdpdGhoYW5kbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5NTdmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2NvbmYvc2VydmljZTR3aXRoaGFuZGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG1lc3NhZ2VSZWNlaXZlcj0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiIHN0eWxlPSJycGMiIGNvbnRleHRQYXRoPSJzZXJ2aWNlcyI+Ci0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLnNhbXBsZTEuRWNob1hNTDwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNobyIgcW5hbWU9ImVjaG8iLz4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2NvbmYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODk0ZmExLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvY29uZi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IiI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnVzZXJndWlkZS5zYW1wbGUxLkVjaG9YTUw8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iIHFuYW1lPSJlY2hvIi8+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzczMTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotM1NhbXBsZTogRGF0YSBCaW5kaW5nDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBXU0RMMkphdmEgZ2VuZXJhdGVkIGNvZGUgd2l0aCBDYXN0b3IuIA0KLQ0KLVJ1bm5pbmcgb2YgdGhpcyBzYW1wbGUgYXNzdW1lcyB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGlzIHdpdGhpbiB0aGUgZXh0cmFjdGVkIHJlbGVhc2UgZm9sZGVyIChBeGlzMl9IT01FL3NhbXBsZXMvZGF0YWJpbmRpbmcpLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0gKiBJbnN0YWxsIEFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXIuDQotICogUGxlYXNlIGNyZWF0ZSBhIGRpcmVjdG9yeSBuYW1lZCBsaWIgdW5kZXIgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmlsZS4NCi0gKiBEb3dubG9hZCBsYXRlc3Qgc3RheC11dGlscyBqYXIgZnJvbQ0KLSAgIGh0dHBzOi8vc3RheC11dGlscy5kZXYuamF2YS5uZXQvc2VydmxldHMvUHJvamVjdERvY3VtZW50TGlzdD9mb2xkZXJJRD0xMTA2IGFuZCBkcm9wIHRoYXQgaW50byB0aGUNCi0gICBuZXcgbGliIGRpcmVjdG9yeS4NCi0gKiBEb3dubG9hZCB2ZXJzaW9uIDEuMC40IG9mIENhc3RvciBqYXIgZnJvbSBodHRwOi8vZGlzdC5jb2RlaGF1cy5vcmcvY2FzdG9yLzEuMC40L2Nhc3Rvci0xLjAuNC5qYXIgYW5kIGRyb3AgdGhhdCBpbnRvIHRoZSBuZXcNCi0gICBsaWIgZGlyZWN0b3J5LihUaGUgbGF0ZXN0IHJlbGVhc2VzIG9mIGNhc3RvciBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuY2FzdG9yLm9yZy9kb3dubG9hZC5odG1sLCBidXQgdGhpcyBleGFtcGxlIG1heSBub3QgcnVuIAkNCi0gICB3aXRoIHZlcnNpb25zIGxhdGVyIHRoYW4gMS4wLjQpDQotDQotWW91IGNhbiBhY2hpZXZlIGFsbCB0aHJlZSBvZiB0aGUgYWJvdmUgc3RlcHMgYnkgcnVubmluZyAiYW50IGRvd25sb2FkLmphcnMiLCBidXQgaXQgd2lsbCB0YWtlIHNvbWUgDQotdGltZSB0byBkb3dubG9hZCB0aG9zZSB0d28gamFycywgdXNpbmcgYW50Lg0KLQ0KLQ0KLURlcGxveWluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVlvdSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3RvY2sgc2VydmljZSBXZWIgc2VydmljZSBhbmQgZGVwbG95IGl0LiBUeXBpbmcgYW50IGdlbmVyYXRlLnNlcnZpY2Ugb3IgDQotc2ltcGx5IGFudCBpbiB0aGUgY29tbWFuZCBwcm9tcHQsIHdpbGwgYnVpbGQgdGhlIHNlcnZpY2UgYWdhaW5zdCBTdG9ja1F1b3RlU2VydmljZS53c2RsIGxpc3RlZCANCi1pbnNpZGUgQXhpczJfSE9NRS9zYW1wbGVzL2RhdGFiaW5kaW5nIGFuZCBwdXQgaXQgdW5kZXIgQXhpczJfSE9NRS9yZXBvc2l0b3J5L3NlcnZpY2VzLg0KLQ0KLVlvdSBuZWVkIHRvIHRoZW4gc3RhcnR1cCB0aGUgc2VydmVyIHRvIGRlcGxveSB0aGUgc2VydmljZS4gR28gdG8gQXhpczJfSE9NRS9iaW4gZm9sZGVyIGFuZCBleGVjdXRlIGVpdGhlcg0KLWF4aXMyc2VydmVyLmJhdCAoaW4gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2goaW4gTGludXgpLCBkZXBlbmRpbmcgb24geW91ciBwbGF0Zm9ybS4NCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBpbmcgdGhlIGNvbW1hbmQgImFudCBydW4uY2xpZW50IiBpbnNpZGUgQXhpczJfSE9NRS9zYW1wbGVzL2RhdGFiaW5kaW5nIHJ1bnMgdGhlIEF4aXMyX0hPTUUvc2FtcGxlcy9kYXRhYmluZGluZy9jbGllbnQvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tDbGllbnQuamF2YSBjbGFzcy4gWW91IG1heSB1c2UNCi10aGUgY29tbWFuZCBzY3JpcHRzIChhcyBzcGVjaWZpZWQgYWJvdmUpIHRvIGRvIHNvLiBZb3UgbmVlZCB0byBzdXBwbHkgMiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kLSB1cmwgYW5kIHN5bWJvbC4NCi0NCi0gKiBhbnQgcnVuLmNsaWVudCAtRHVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UgLURzeW1ib2w9SUJNDQotICAgU3VjY2VlZHMgd2l0aCBhIFByaWNlIG9mIDk5LjAuIFlvdSB3aWxsIHNlZSAiUHJpY2UgPSA5OS4wIg0KLQ0KLVdoZW4geW91IGNhbGwgYW50IHJ1bi5jbGllbnQgd2l0aCBwYXJhbWV0ZXJzLCBiZWZvcmUgcnVubmluZw0KLWNsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudC5qYXZhIGNsYXNzLCBpdCBkb2VzIHRoZSBmb2xsb3dpbmcgYXMgd2VsbDoNCi0NCi0gICogR2VuZXJhdGUgdGhlIHN0dWJzIChmb3IgdGhlIGNsaWVudCkgZnJvbSB0aGUgV1NETA0KLSAgKiBDb21waWxlIHRoZSBjbGllbnQgY2xhc3Nlcw0KLSAgKiBDcmVhdGUgYSBKYXIgb2YgdGhlIGNsaWVudCBjbGFzc2VzIGFuZCBjb3B5IGl0IHRvIGJ1aWxkL2NsaWVudC9TdG9ja1NlcnZpY2UtdGVzdC1jbGllbnQuamFyDQotDQotSG93IEl0IFdvcmtzDQotPT09PT09PT09PT09PT0NCi0NCi0tIEdlbmVyYXRlIGNvZGUgZ2l2aW5nIC1kIG5vbmUgdG8gZ2V0IGFsbCB0aGUgQXhpczIgQVBJcyB3aXRoIE9NRWxlbWVudHMuDQotLSBDcmVhdGUgQ2FzdG9yIG9iamVjdHMgZm9yIHRoZSBzY2hlbWEgZ2l2ZW4gaW4gdGhlIFN0b2NrUXVvdGVTZXJ2aWNlLndzZGwuDQotLSBDbGllbnQgQVBJIGFuZCB0aGUgc2VydmljZSB1c2VzIHRob3NlIGNhc3RvciBvYmplY3RzIHRvIGdldC9zZXQgZGF0YS4NCi0tIEdldCBTdEFYIGV2ZW50cyBmcm9tIHRoZSBjYXN0b3Igb2JqZWN0cyBhbmQgY29uc3RydWN0IE9NRWxlbWVudHMgZnJvbSB0aGVtLiBUaG9zZSBTdEFYIGV2ZW50cw0KLSAgYXJlIGZlZCBpbnRvIFN0QVhPTUJ1aWxkZXIgd2hpY2ggY2FuIGNyZWF0ZSBPTSB0cmVlIGZyb20gaXQuDQotLSBGZWVkIHRob3NlIE9NRWxlbWVudCBpbiB0byBnZW5lcmF0ZWQgY29kZS4NCi0NCi1Ob3RlDQotPT09PT09PT09PT09PT0NCi1Tb21ldGltZXMsIGlmIHlvdSdyZSBoYXZpbmcgdHJvdWJsZSBydW5uaW5nIHRoZSBjbGllbnQgc3VjY2Vzc2Z1bGx5LCANCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNsZWFuIHRoZSBzZXJ2aWNlcyByZXBvc2l0b3J5IGJlZm9yZSB5b3UgZ2VuZXJhdGUgdGhlIHNlcnZpY2UsIGRlcGxveSBpdA0KLWFuZCBydW4gdGhlIGNsaWVudC4gKGkuZS4gZGVsZXRlIHNlcnZpY2VzIGNyZWF0ZWQgZnJvbSBwcmV2aW91cyBzYW1wbGVzLikNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZS54c2QgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1N0b2NrUXVvdGUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk2M2NkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4c2Q6c2NoZW1hCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdzMuaWJtLmNvbS9zY2hlbWFzL3NlcnZpY2VzLzIwMDIvMTEvMTUvc3RvY2txdW90ZSIKLQl4bWxucz0iaHR0cDovL3czLmlibS5jb20vc2NoZW1hcy9zZXJ2aWNlcy8yMDAyLzExLzE1L3N0b2NrcXVvdGUiCi0+Ci0JCi0JPHhzZDplbGVtZW50IG5hbWU9InF1b3RlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9InN5bWJvbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJ2b2x1bWUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JCQkJPHhzZDplbGVtZW50IG5hbWU9Imxhc3RUcmFkZSIgdHlwZT0ibGFzdFRyYWRlVHlwZSIvPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UiIHR5cGU9ImNoYW5nZVR5cGUiLz4KLQkJCTwveHNkOnNlcXVlbmNlPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2VUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2xsYXIiIHR5cGU9InhzZDpmbG9hdCIvPgkKLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJjZW50IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwb3NpdGl2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4JCi0JCTwveHNkOnNlcXVlbmNlPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsYXN0VHJhZGVUeXBlIj4KLQkJPHhzZDpzZXF1ZW5jZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwcmljZSIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGF0ZSIgdHlwZT0ieHNkOmxvbmciLz4KLQkJPC94c2Q6c2VxdWVuY2U+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQk8IS0tIE1ldGhvZHMgc2lnbmF0dXJlcyAtLT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0U3RvY2tRdW90ZSI+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOnNlcXVlbmNlPgkKLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0U3RvY2tRdW90ZVJlc3BvbnNlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDplbGVtZW50IHJlZj0icXVvdGUiIC8+Ci0JCQk8L3hzZDpzZXF1ZW5jZT4JCi0JCTwveHNkOmNvbXBsZXhUeXBlPgotCTwveHNkOmVsZW1lbnQ+Ci0KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0MDcyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlL3dzZGwiCi0JeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQl4bWxuczp0bnM9Imh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlL3dzZGwiIAotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQl4bWxuczp0eXBlcz0iaHR0cDovL3czLmlibS5jb20vc2NoZW1hcy9zZXJ2aWNlcy8yMDAyLzExLzE1L3N0b2NrcXVvdGUiCi0JPgotCi0JPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlIiBsb2NhdGlvbj0iU3RvY2tRdW90ZS54c2QiIC8+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRTdG9ja1F1b3RlUmVxIj4KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idHlwZXM6Z2V0U3RvY2tRdW90ZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJnZXRTdG9ja1F1b3RlUmVzcCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InR5cGVzOmdldFN0b2NrUXVvdGVSZXNwb25zZSIgLz4KLQk8L21lc3NhZ2U+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iU3RvY2tRdW90ZVBvcnRUeXBlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRTdG9ja1F1b3RlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0U3RvY2tRdW90ZVJlcSIgLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmdldFN0b2NrUXVvdGVSZXNwIiAvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCi0JPGJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNPQVBCaW5kaW5nIiB0eXBlPSJ0bnM6U3RvY2tRdW90ZVBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiAvPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFN0b2NrUXVvdGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHN0eWxlPSJkb2N1bWVudCIgc29hcEFjdGlvbj0iZ2V0U3RvY2tRdW90ZSIgLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC9vdXRwdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQotCTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iU3RvY2tRdW90ZVNPQVBQb3J0IiBiaW5kaW5nPSJ0bnM6U3RvY2tRdW90ZVNPQVBCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIgLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjFlYzZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iZGF0YWJpbmRpbmciIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9IlN0b2NrUXVvdGVTZXJ2aWNlLndzZGwiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZS50YXJnZXQiIHZhbHVlPSJidWlsZC9zZXJ2aWNlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNsaWVudC50YXJnZXQiIHZhbHVlPSJidWlsZC9jbGllbnQiLz4KLQotICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0ibGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8bWFjcm9kZWYgbmFtZT0iQ2FzdG9yU291cmNlR2VuZXJhdG9yIj4KLSAgICAgICA8YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgZGVmYXVsdD0iTk9UIFNFVCIvPgotICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgZGVmYXVsdD0iTk9UIFNFVCIvPgotICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiBkZWZhdWx0PSJOT1QgU0VUIi8+Ci0gICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgPGVjaG8vPgotICAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmV4b2xhYi5jYXN0b3IuYnVpbGRlci5Tb3VyY2VHZW5lcmF0b3JNYWluIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iYXhpczIuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgIDxhcmcgbGluZT0iLWkgQHtzY2hlbWF9ICAtcGFja2FnZSBAe3BhY2thZ2V9IC1kZXN0IEB7b3V0cHV0fSIgLz4KLSAgICAgICAgICA8L2phdmE+Ci0gICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvbWFjcm9kZWY+Ci0KLSAgICA8IS0tIEJ1aWxkIHRoZSBzZXJ2aWNlLCB0aGVuIHRoZSBjbGllbnQuIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iamFyIj4KLSAgICAgICAgPGFudCBkaXI9InNlcnZpY2UiIHRhcmdldD0iamFyLnNlcnZlciIvPgotICAgICAgICA8YW50IGRpcj0iY2xpZW50Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImdlbmVyYXRlLnN0dWIiPgotCi0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InBhcmFtcy5vayI+Ci0gICAgICAgICAgICA8YW5kPgotICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0idXJsIi8+Ci0gICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJzeW1ib2wiLz4KLSAgICAgICAgICAgIDwvYW5kPgotICAgICAgICA8L2NvbmRpdGlvbj4KLQotICAgICAgICA8ZmFpbCBtZXNzYWdlPSJPbmUgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCBzZXQuIFVzYWdlOiBTdG9ja0NsaWVudCAtRHVybD0mbHQ7dXJsJmd0OyAtRHN5bWJvbD0mbHQ7c3ltYm9sJmd0OyIKLSAgICAgICAgdW5sZXNzPSJwYXJhbXMub2siLz4KLSAgICAgICAgCi0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlcy5kYXRhYmluZGluZy5TdG9ja0NsaWVudCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9IiR7dXJsfSAke3N5bWJvbH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsaWVudC50YXJnZXR9L1N0b2NrU2VydmljZS10ZXN0LWNsaWVudC5qYXIiLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYXhpczIuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5hbGwiIGRlcGVuZHM9ImdlbmVyYXRlLnNlcnZpY2UsZ2VuZXJhdGUuc3R1YiIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0vY2xhc3NlcyIvPgotCi0gICAgICAgIDxDYXN0b3JTb3VyY2VHZW5lcmF0b3Igb3V0cHV0PSIke3NlcnZpY2UudGFyZ2V0fS9zcmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZT0ic2FtcGxlcy5kYXRhYmluZGluZy5kYXRhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYT0iU3RvY2tRdW90ZS54c2QiLz4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXNzIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1zZCIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItYXAiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXAgc2FtcGxlcy5kYXRhYmluZGluZyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItZCBub25lIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7c2VydmljZS50YXJnZXR9Ii8+Ci0gICAgICAgIDwvamF2YT4KLQotICAgICAgICA8IS0tY29weSB0aGUgYWxyZWFkeSB3cml0dGVuIHNrZWxldG9uIGNsYXNzLS0+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3NlcnZpY2UudGFyZ2V0fS9zcmMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9InNlcnZpY2Uvc3JjIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotCi0gICAgICAgIDwhLS1GaXJzdCBsZXQncyBjb21waWxlIHRoZSBjbGFzc2VzLS0+Ci0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7c2VydmljZS50YXJnZXR9L2NsYXNzZXMiIHNyY2Rpcj0iJHtzZXJ2aWNlLnRhcmdldH0vc3JjIgotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8L2phdmFjPgotCi0gICAgICAgIDwhLS1hYXIgdGhlbSB1cCAtLT4KLSAgICAgICAgPGNvcHkgdG9EaXI9IiR7c2VydmljZS50YXJnZXR9L2NsYXNzZXMvTUVUQS1JTkYiIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmljZS50YXJnZXR9L3Jlc291cmNlcyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnhzZCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7c2VydmljZS50YXJnZXR9L1N0b2NrU2VydmljZS5hYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZXhjbHVkZXM9IioqL1Rlc3QuY2xhc3MiIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0vY2xhc3NlcyIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWIvKi5qYXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtzZXJ2aWNlLnRhcmdldH0vU3RvY2tTZXJ2aWNlLmFhciIgdG9maWxlPSIuLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzL1N0b2NrU2VydmljZS5hYXIiCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0idHJ1ZSIvPgotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnN0dWIiIHVubGVzcz0ic2tpcC5nZW5lcmF0ZSI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2NsaWVudC50YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Y2xpZW50LnRhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGllbnQudGFyZ2V0fS9jbGFzc2VzIi8+Ci0KLQotICAgICAgICA8Q2FzdG9yU291cmNlR2VuZXJhdG9yIG91dHB1dD0iJHtjbGllbnQudGFyZ2V0fS9zcmMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZT0ic2FtcGxlcy5kYXRhYmluZGluZy5kYXRhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYT0iU3RvY2tRdW90ZS54c2QiLz4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXUiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWFwIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1wIHNhbXBsZXMuZGF0YWJpbmRpbmciLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgbm9uZSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdCIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItbyAke2NsaWVudC50YXJnZXR9Ii8+Ci0gICAgICAgIDwvamF2YT4KLQotICAgICAgICA8Y29weSB0b2Rpcj0iJHtjbGllbnQudGFyZ2V0fS9zcmMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImNsaWVudC9zcmMiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0KLSAgICAgICAgPCEtLW5vdyBjb21waWxlIHRoZSBzdHViIGNsYXNzZXMtLT4KLSAgICAgICAgPGphdmFjIGRlYnVnPSJvbiIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBmb3JrPSJ0cnVlIgotICAgICAgICAgICAgICAgc3JjZGlyPSIke2NsaWVudC50YXJnZXR9L3NyYyIKLSAgICAgICAgICAgICAgIGV4Y2x1ZGVzPSIqKi9TdG9ja0NsaWVudDIqLioiCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsaWVudC50YXJnZXR9L2NsYXNzZXMiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPCEtLWphciB0aGUgY29tcGlsZWQgc3R1ZmYtLT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtjbGllbnQudGFyZ2V0fS9TdG9ja1NlcnZpY2UtdGVzdC1jbGllbnQuamFyIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGllbnQudGFyZ2V0fS9jbGFzc2VzIj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9NRVRBLUlORi8qLioiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qTWVzc2FnZVJlY2VpdmVyLmNsYXNzIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKlNrZWxldG9uLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLVdlIGFyZSBub3Qgc2hpcHBpbmcgY2FzdG9yIGFuZCBzdGF4LXV0aWxzIGphcnMgd2l0aCB0aGUgcmVsZWFzZS4gVGhpcyB0YXJnZXQgY2FuIGJlIHVzZWQgdG8KLSAgICBkb3dubG9hZCB0aG9zZSBqYXJzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHJ1biB0aGlzIHNhbXBsZS4tLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkLmphcnMiPgotICAgICAgIDxta2RpciBkaXI9ImxpYiIvPgotCi0gICAgICAgIDxnZXQgc3JjPSJodHRwOi8vd3Muem9uZXMuYXBhY2hlLm9yZy9yZXBvc2l0b3J5L3N0YXgtdXRpbHMvamFycy9zdGF4LXV0aWxzLTIwMDYwOTE1LmphciIKLSAgICAgICAgICAgICBkZXN0PSJsaWIvc3RheC11dGlscy0yMDA2MDkxNS5qYXIiIHZlcmJvc2U9InRydWUiLz4KLSAgICAgICAgPGdldCBzcmM9Imh0dHA6Ly9kaXN0LmNvZGVoYXVzLm9yZy9jYXN0b3IvMS4wLjQvY2FzdG9yLTEuMC40LmphciIgZGVzdD0ibGliL2Nhc3Rvci0xLjAuNC5qYXIiCi0gICAgICAgICAgICAgdmVyYm9zZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSJidWlsZCIvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2Nhc3RvcmJ1aWxkZXIucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2FzdG9yYnVpbGRlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjA4ZjIxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2FzdG9yYnVpbGRlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0KLSMgSmF2YSBjbGFzcyBtYXBwaW5nIG9mIDx4c2Q6ZWxlbWVudD4ncyBhbmQgPHhzZDpjb21wbGV4VHlwZT4ncyAKLSMKLW9yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIuamF2YWNsYXNzbWFwcGluZz1lbGVtZW50Ci0KLSMgVGhpcyBwcm9wZXJ0eSBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgdGhlIHN1cGVyIGNsYXNzIG9mICphbGwqIAotIyBnZW5lcmF0ZWQgY2xhc3NlcwotIwotI29yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIuc3VwZXJjbGFzcz1jb20ueHl6LkJhc2VPYmplY3QKLQotIyBYTUwgbmFtZXNwYWNlIG1hcHBpbmcgdG8gSmF2YSBwYWNrYWdlcwotIwotI29yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIubnNwYWNrYWdlcz1cCi0gIGh0dHA6Ly93d3cueHl6LmNvbS9zY2hlbWFzL3Byb2plY3Q9Y29tLnh5ei5zY2hlbWFzLnByb2plY3QsXAotICBodHRwOi8vd3d3Lnh5ei5jb20vc2NoZW1hcy9wZXJzb249Y29tLnh5ei5zY2hlbWFzLnBlcnNvbgotCi0jIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGdlbmVyYXRlIHRoZSBlcXVhbHMgbWV0aG9kCi0jIGZvciBlYWNoIGdlbmVyYXRlZCBjbGFzcwotIyBmYWxzZSBieSBkZWZhdWx0Ci0jCi0jb3JnLmV4b2xhYi5jYXN0b3IuYnVpbGRlci5lcXVhbHNtZXRob2Q9dHJ1ZQotCi0jIFNldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHVzZSBPYmplY3QgV3JhcHBlcnMgaW5zdGVhZAotIyBvZiBwcmltaXRpdmVzIChlLmcgRmxvYXQgaW5zdGVhZCBvZiBmbG9hdCkuCi0jIGZhbHNlIGJ5IGRlZmF1bHQuCi0jCi0jb3JnLmV4b2xhYi5jYXN0b3IuYnVpbGRlci5wcmltaXRpdmV0b3dyYXBwZXI9ZmFsc2UKLQotIyBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGRlc2NyaXB0b3JzIHRvCi0jIGV4cG9zZSB0aGUgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzIHRoZXkgY29udGFpbi4KLSMgZmFsc2UgYnkgZGVmYXVsdC4KLSMKLSNvcmcuZXhvbGFiLmNhc3Rvci5idWlsZGVyLmNsYXNzZGVzY2ZpZWxkbmFtZXM9ZmFsc2UKLQotIyBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIHRvIGNvbnRhaW4KLSMgRXh0cmEgbWV0aG9kcyBmb3IgdGhlIGNvbGxlY3Rpb24gZmllbGRzLCBzdWNoIGFzIGdldC9zZXQgdXNpbmcKLSMgdGhlIGNvbGxlY3Rpb24gdHlwZSBpbiBhZGRpdGlvbiB0byB0aGUgdHlwZS1zYWZlIGFycmF5LgotIyBTZXQgdGhpcyB0byB0cnVlIGlmIHlvdSB3YW50IHlvdXIgY29kZSB0byBiZSBtb3JlIGNvbXBhdGlibGUgCi0jIHdpdGggQ2FzdG9yIEpETy4gVGhpcyBpcyBmYWxzZSBieSBkZWZhdWx0LgotIwotI29yZy5leG9sYWIuY2FzdG9yLmJ1aWxkZXIuZXh0cmFDb2xsZWN0aW9uTWV0aG9kcz10cnVlCi0KLSMgVXNlIG9sZC1zdHlsZSAoQ2FzdG9yIDAuOS4zLjkpIG9mIG5hbWluZyB0aGF0IHVwcGVyY2FzZXMKLSMgbmFtZXMgYWZ0ZXIgYW4gdW5kZXJzY29yZQotIwotI29yZy5leG9sYWIuY2FzdG9yLnhtbC5KYXZhTmFtaW5nLnVwcGVyQ2FzZUFmdGVyVW5kZXJzY29yZT10cnVlCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2xpZW50L2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvY2xpZW50L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlODI3Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Imphci5jbGllbnQiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LmJhc2UuZGlyIiB2YWx1ZT0iLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXJlbnQuZGlyIiB2YWx1ZT0iLi4iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9IiR7cGFyZW50LmRpcn0vYmFuay53c2RsIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS9zcmMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS90YXJnZXQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGFyZ2V0LmphdmEiIHZhbHVlPSIke3RhcmdldH0vc3JjIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhcmdldC5jbGFzc2VzIiB2YWx1ZT0iJHt0YXJnZXR9L2NsYXNzZXMiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2hlY2suZGVwZW5kZW5jeSIgdW5sZXNzPSJlbnYuQVhJUzJfSE9NRSI+Ci0gICAgICAgIDxlY2hvIG1lc3NhZ2U9IkFYSVMyX0hPTUUgbXVzdCBiZSBzZXQiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuLnN0dWIiIGlmPSJlbnYuQVhJUzJfSE9NRSIgZGVwZW5kcz0iY2hlY2suZGVwZW5kZW5jeSI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3RhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0YXJnZXR9Ii8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXUiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHt0YXJnZXR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtlbnYuQVhJUzJfSE9NRX1cbGliIj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBDcmVhdGUgdGhlIHNlcnZpY2UgYXJjaGl2ZSBieSBleGVjdXRpbmcgdGFyZ2V0XGJ1aWxkLnhtbCAoamFyLnNlcnZlcikgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuY2xpZW50IiBpZj0iZW52LkFYSVMyX0hPTUUiIGRlcGVuZHM9Imdlbi5zdHViIj4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7dGFyZ2V0LmphdmF9Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmN9Ii8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7dGFyZ2V0fSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3RhcmdldH1cYnVpbGRcbGliXEJhbmtTZXJ2aWNlLXRlc3QtY2xpZW50LmphciIgdG9kaXI9Ii4uIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9jbGllbnQvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4OGQwOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlcy5kYXRhYmluZGluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLk1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLkdldFN0b2NrUXVvdGU7Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLkdldFN0b2NrUXVvdGVSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYUmVzdWx0OwotCi1pbXBvcnQgamF2YW5ldC5zdGF4dXRpbHMuU3RBWFNvdXJjZTsKLXB1YmxpYyBmaW5hbCBjbGFzcyBTdG9ja0NsaWVudCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBTdG9ja0NsaWVudCA8dXJsPiA8c3ltYm9sPiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSBhcmdzWzBdOwotICAgICAgICBmaW5hbCBTdHJpbmcgc3ltYm9sID0gYXJnc1sxXTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXR0aW5nIFN0b2NrIFF1b3RlIGZvciAiICsgc3ltYm9sKTsKLQotICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1YiA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yih1cmwpOwotICAgICAgICBzdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigiZ2V0U3RvY2tRdW90ZSIpOwotICAgICAgICBHZXRTdG9ja1F1b3RlIHN0b2NrUXVvdGUgPSBuZXcgR2V0U3RvY2tRdW90ZSgpOwotICAgICAgICBzdG9ja1F1b3RlLnNldFN5bWJvbChzeW1ib2wpOwotICAgICAgICBTQVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhPTUJ1aWxkZXIoKTsKLSAgICAgICAgTWFyc2hhbGxlci5tYXJzaGFsKHN0b2NrUXVvdGUsIGJ1aWxkZXIpOwotICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBzdHViLmdldFN0b2NrUXVvdGUoCi0gICAgICAgICAgICAgICAgYnVpbGRlci5nZXRSb290RWxlbWVudCgpKTsKLQotCi0gICAgICAgIFN0QVhTb3VyY2Ugc3RheFNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0QVhTb3VyY2UocmVzcG9uc2UuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOwotICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gbmV3IFVubWFyc2hhbGxlcihHZXRTdG9ja1F1b3RlUmVzcG9uc2UuY2xhc3MpOwotICAgICAgICBVbm1hcnNoYWxIYW5kbGVyIHVubWFyc2hhbEhhbmRsZXIgPSB1bm1hcnNoYWxsZXIuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICBHZXRTdG9ja1F1b3RlUmVzcG9uc2Ugc3RvY2tRdW90ZVJlc3BvbnNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBVbm1hcnNoYWxsZXIuZ2V0Q29udGVudEhhbmRsZXIodW5tYXJzaGFsSGFuZGxlcik7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzdGF4U291cmNlLCBuZXcgU0FYUmVzdWx0KGNvbnRlbnRIYW5kbGVyKSk7Ci0gICAgICAgICAgICBzdG9ja1F1b3RlUmVzcG9uc2UgPSAoR2V0U3RvY2tRdW90ZVJlc3BvbnNlKSB1bm1hcnNoYWxIYW5kbGVyLmdldE9iamVjdCgpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJpY2UgPSAiICsgc3RvY2tRdW90ZVJlc3BvbnNlLmdldFF1b3RlKCkuZ2V0TGFzdFRyYWRlKCkuZ2V0UHJpY2UoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9jbGllbnQvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tDbGllbnQyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0MGZmNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL2NsaWVudC9zcmMvc2FtcGxlcy9kYXRhYmluZGluZy9TdG9ja0NsaWVudDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLmRhdGFiaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmpkb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uRWxlbWVudDsKLWltcG9ydCBvcmcuamRvbS5KRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qZG9tLmlucHV0LlN0QVhCdWlsZGVyOwotaW1wb3J0IG9yZy5qZG9tLm91dHB1dC5TQVhPdXRwdXR0ZXI7Ci1pbXBvcnQgb3JnLmpkb20ub3V0cHV0LlN0QVhPdXRwdXR0ZXI7Ci1pbXBvcnQgb3JnLmpkb20ub3V0cHV0LlhNTE91dHB1dHRlcjsKLWltcG9ydCBvcmcuamRvbS54cGF0aC5YUGF0aDsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1wdWJsaWMgZmluYWwgY2xhc3MgU3RvY2tDbGllbnQyIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IFN0b2NrQ2xpZW50IDx1cmw+IDxzeW1ib2w+Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHVybCA9IGFyZ3NbMF07Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzeW1ib2wgPSBhcmdzWzFdOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgU3RvY2sgUXVvdGUgZm9yICIgKyBzeW1ib2wpOwotCi0gICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViID0KLSAgICAgICAgICAgICAgICBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViKHVybCk7Ci0gICAgICAgIHN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJnZXRTdG9ja1F1b3RlIik7Ci0KLSAgICAgICAgRWxlbWVudCBlbGVtZW50MSA9IG5ldyBFbGVtZW50KAotICAgICAgICAgICAgImdldFN0b2NrUXVvdGUiLCAibnNsIiwgImh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlIik7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudDIgPSBuZXcgRWxlbWVudCgic3ltYm9sIik7Ci0gICAgICAgIGVsZW1lbnQyLmFkZENvbnRlbnQoc3ltYm9sKTsKLSAgICAgICAgZWxlbWVudDEuYWRkQ29udGVudChlbGVtZW50Mik7Ci0KLSAgICAgICAgT01GYWN0b3J5IGZhY3RvcnkgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ugc3JjID0gbmV3IEpET01EYXRhU291cmNlKGVsZW1lbnQxKTsKLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZSBhcHBucyA9IGZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly93My5pYm0uY29tL3NjaGVtYXMvc2VydmljZXMvMjAwMi8xMS8xNS9zdG9ja3F1b3RlIiwgIm5zMSIpOwotICAgICAgICBPTUVsZW1lbnQgY2hpbGQgPSBmYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChzcmMsICJnZXRTdG9ja1F1b3RlIiwgYXBwbnMpOwotCi0gICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IHN0dWIuZ2V0U3RvY2tRdW90ZShjaGlsZCk7Ci0KLSAgICAgICAgU3RBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYQnVpbGRlcigpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHJlc3BvbnNlLmdldFhNTFN0cmVhbVJlYWRlcigpKTsKLSAgICAgICAgWFBhdGggcGF0aCA9IFhQYXRoLm5ld0luc3RhbmNlKCIvL3ByaWNlIik7Ci0gICAgICAgIEVsZW1lbnQgcHJpY2UgPSAoRWxlbWVudCkgcGF0aC5zZWxlY3RTaW5nbGVOb2RlKGRvYy5nZXRSb290RWxlbWVudCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmljZSA9ICIgKyBwcmljZS5nZXRUZXh0KCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpET01EYXRhU291cmNlIGltcGxlbWVudHMgT01EYXRhU291cmNlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50IGRhdGE7Ci0KLSAgICAgICAgcHJpdmF0ZSBKRE9NRGF0YVNvdXJjZShFbGVtZW50IGRhdGEpIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRhdGEsIG91dHB1dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShXcml0ZXIgd3JpdGVyLCBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBYTUxPdXRwdXR0ZXIgb3V0cHV0dGVyID0gbmV3IFhNTE91dHB1dHRlcigpOwotICAgICAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZGF0YSwgd3JpdGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFhNTFN0cmVhbVdyaXRlciB4bWxXcml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAgICAgU3RBWE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgU3RBWE91dHB1dHRlcih4bWxXcml0ZXIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0RnJhZ21lbnQoZGF0YSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhNTFN0cmVhbVJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFNBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWE9NQnVpbGRlcigpOwotICAgICAgICAgICAgU0FYT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBTQVhPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5zZXRDb250ZW50SGFuZGxlcihidWlsZGVyKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5zZXRFbnRpdHlSZXNvbHZlcihidWlsZGVyKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5zZXREVERIYW5kbGVyKGJ1aWxkZXIpOwotICAgICAgICAgICAgb3V0cHV0dGVyLnNldEVudGl0eVJlc29sdmVyKGJ1aWxkZXIpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0Um9vdEVsZW1lbnQoKS5nZXRYTUxTdHJlYW1SZWFkZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvc2VydmljZS9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL3NlcnZpY2UvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmFjOTQ0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZGF0YWJpbmRpbmcvc2VydmljZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Imdlbi5za2VsZXRvbiI+Ci0JCi0JPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciIgdmFsdWU9Ii4iLz4KLQk8cHJvcGVydHkgbmFtZT0icGFyZW50LmRpciIgdmFsdWU9Ii4uIi8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9IndzZGwudXJpIiB2YWx1ZT0iJHtwYXJlbnQuZGlyfS9iYW5rLndzZGwiLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS9zcmMiLz4KLQk8cHJvcGVydHkgbmFtZT0idGFyZ2V0IiB2YWx1ZT0iJHtwcm9qZWN0LmJhc2UuZGlyfS90YXJnZXQiLz4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNoZWNrLmRlcGVuZGVuY3kiIHVubGVzcz0iZW52LkFYSVMyX0hPTUUiPgotCQk8ZWNobyBtZXNzYWdlPSJBWElTMl9IT01FIG11c3QgYmUgc2V0Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJnZW4uc2tlbGV0b24iIGlmPSJlbnYuQVhJUzJfSE9NRSIgZGVwZW5kcz0iY2hlY2suZGVwZW5kZW5jeSI+Ci0KLQotICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9Ii8+Ci0JCTxta2RpciBkaXI9IiR7dGFyZ2V0fSIvPgotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotCQkJPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zcyIvPgotCQkJPGFyZyBsaW5lPSItc2QiLz4KLQkJCTxhcmcgbGluZT0iLW8gJHt0YXJnZXR9Ii8+IDwhLS0gT3V0cHV0IGRpcmVjdG9yeSBpbiB3aGljaCB0byBnZW5lcmF0ZSBmaWxlcyAtLT4gPCEtLSBOQiBpdCBnZW5lcmF0ZXMgdG8gdGhlIHNyYyBmb2xkZXIgdW5kZXIgdGhpcyBkaXJlY3RvcnkhISAtLT4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPGZpbGVzZXQgZGlyPSIuLlwuLlxsaWIiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSBDcmVhdGUgdGhlIHNlcnZpY2UgYXJjaGl2ZSBieSBleGVjdXRpbmcgdGFyZ2V0XGJ1aWxkLnhtbCAoamFyLnNlcnZlcikgLS0+Ci0JPHRhcmdldCBuYW1lPSJqYXIuc2VydmVyIiBpZj0iZW52LkFYSVMyX0hPTUUiPgotCQk8YW50IGRpcj0iJHt0YXJnZXR9Ii8+Ci0JCTxjb3B5IGZpbGU9IiR7dGFyZ2V0fVxidWlsZFxsaWJcQmFua1NlcnZpY2UuYWFyIiB0b2Rpcj0iLi4iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL3NlcnZpY2Uvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9kYXRhYmluZGluZy9zZXJ2aWNlL3NyYy9zYW1wbGVzL2RhdGFiaW5kaW5nL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2MTA0MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2RhdGFiaW5kaW5nL3NlcnZpY2Uvc3JjL3NhbXBsZXMvZGF0YWJpbmRpbmcvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogMS4xLVNOQVBTSE9UIE5vdiAwMywgMjAwNiAoMDY6NTQ6MDcgRVNUKQotICovCi1wYWNrYWdlIHNhbXBsZXMuZGF0YWJpbmRpbmc7Ci1pbXBvcnQgamF2YW5ldC5zdGF4dXRpbHMuU3RBWFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TQVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLk1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLk1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmV4b2xhYi5jYXN0b3IueG1sLlVubWFyc2hhbGxlcjsKLWltcG9ydCBvcmcuZXhvbGFiLmNhc3Rvci54bWwuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLkNoYW5nZTsKLWltcG9ydCBzYW1wbGVzLmRhdGFiaW5kaW5nLmRhdGEuR2V0U3RvY2tRdW90ZTsKLWltcG9ydCBzYW1wbGVzLmRhdGFiaW5kaW5nLmRhdGEuR2V0U3RvY2tRdW90ZVJlc3BvbnNlOwotaW1wb3J0IHNhbXBsZXMuZGF0YWJpbmRpbmcuZGF0YS5MYXN0VHJhZGU7Ci1pbXBvcnQgc2FtcGxlcy5kYXRhYmluZGluZy5kYXRhLlF1b3RlOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhSZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0vKioKLSAqIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uIHsKLSAgICAvKioKLSAgICAgKiBBdXRvIGdlbmVyYXRlZCBtZXRob2Qgc2lnbmF0dXJlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0wCi0gICAgICovCi0gICAgcHVibGljIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IGdldFN0b2NrUXVvdGUob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0wKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU3RBWFNvdXJjZSBzdGF4U291cmNlID0KLSAgICAgICAgICAgICAgICBuZXcgU3RBWFNvdXJjZShwYXJhbTAuZ2V0WE1MU3RyZWFtUmVhZGVyKCkpOwotICAgICAgICBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gbmV3IFVubWFyc2hhbGxlcihHZXRTdG9ja1F1b3RlLmNsYXNzKTsKLSAgICAgICAgVW5tYXJzaGFsSGFuZGxlciB1bm1hcnNoYWxIYW5kbGVyID0gdW5tYXJzaGFsbGVyLmNyZWF0ZUhhbmRsZXIoKTsKLSAgICAgICAgR2V0U3RvY2tRdW90ZSBzdG9ja1F1b3RlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBVbm1hcnNoYWxsZXIuZ2V0Q29udGVudEhhbmRsZXIodW5tYXJzaGFsSGFuZGxlcik7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzdGF4U291cmNlLCBuZXcgU0FYUmVzdWx0KGNvbnRlbnRIYW5kbGVyKSk7Ci0gICAgICAgICAgICBzdG9ja1F1b3RlID0gKEdldFN0b2NrUXVvdGUpIHVubWFyc2hhbEhhbmRsZXIuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghc3RvY2tRdW90ZS5nZXRTeW1ib2woKS5lcXVhbHMoIklCTSIpKSB7Ci0JCQl0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTdG9ja1F1b3RlIGRldGFpbHMgZm9yIHRoZSBzeW1ib2wgJyIrIHN0b2NrUXVvdGUuZ2V0U3ltYm9sKCkgKyAiJyBhcmUgbm90IGF2YWlsYWJsZS4iKTsKLSAgICAgICAgfQotICAgICAgICBHZXRTdG9ja1F1b3RlUmVzcG9uc2Ugc3RvY2tRdW90ZVJlc3BvbnNlID0gbmV3IEdldFN0b2NrUXVvdGVSZXNwb25zZSgpOwotICAgICAgICBRdW90ZSBxdW90ZSA9IG5ldyBRdW90ZSgpOwotICAgICAgICBxdW90ZS5zZXRTeW1ib2woc3RvY2tRdW90ZS5nZXRTeW1ib2woKSk7Ci0gICAgICAgIHF1b3RlLnNldFZvbHVtZSg1MDAwKTsKLQotICAgICAgICBMYXN0VHJhZGUgbGFzdFRyYWRlID0gbmV3IExhc3RUcmFkZSgpOwotICAgICAgICBsYXN0VHJhZGUuc2V0UHJpY2UoOTkpOwotICAgICAgICBsYXN0VHJhZGUuc2V0RGF0ZShDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKTsKLSAgICAgICAgcXVvdGUuc2V0TGFzdFRyYWRlKGxhc3RUcmFkZSk7Ci0KLSAgICAgICAgQ2hhbmdlIGNoYW5nZSA9IG5ldyBDaGFuZ2UoKTsKLSAgICAgICAgY2hhbmdlLnNldERvbGxhcigxKTsKLSAgICAgICAgY2hhbmdlLnNldFBlcmNlbnQoMTApOwotICAgICAgICBjaGFuZ2Uuc2V0UG9zaXRpdmUodHJ1ZSk7Ci0gICAgICAgIHF1b3RlLnNldENoYW5nZShjaGFuZ2UpOwotCi0gICAgICAgIHN0b2NrUXVvdGVSZXNwb25zZS5zZXRRdW90ZShxdW90ZSk7Ci0gICAgICAgIFNBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWE9NQnVpbGRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWFyc2hhbGxlci5tYXJzaGFsKHN0b2NrUXVvdGVSZXNwb25zZSwgYnVpbGRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hcnNoYWxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgfQotfQotICAgIApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1YWZlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9ImJ1aWxkLnNhbXBsZSI+Ci0KLSAgICAKLQk8IS0tPGNsYXNzcGF0aCBpZD0iY2xhc3NwYXRoMSI+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGliLyouamFyIi8+Ci0JPC9jbGFzc3BhdGg+LS0+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZC5zYW1wbGUiPgotCQk8cHJvcGVydHkgbmFtZT0iZXZlbnRpbmcudGVtcC5kaXIiIHZhbHVlPSJidWlsZC90ZW1wIiAvPgotCSAgICA8cHJvcGVydHkgbmFtZT0ibGlzdG5lcjEudGVtcC5kaXIiIHZhbHVlPSIke2V2ZW50aW5nLnRlbXAuZGlyfS9saXN0bmVyMSIgLz4KLQkgICAgPHByb3BlcnR5IG5hbWU9Imxpc3RuZXIyLnRlbXAuZGlyIiB2YWx1ZT0iJHtldmVudGluZy50ZW1wLmRpcn0vbGlzdG5lcjIiIC8+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJwdWJsaXNoZXIudGVtcC5kaXIiIHZhbHVlPSIke2V2ZW50aW5nLnRlbXAuZGlyfS9wdWJsaXNoZXIiIC8+Ci0JICAgICAgICAKLQkgICAgPG1rZGlyIGRpcj0iJHtsaXN0bmVyMS50ZW1wLmRpcn0iIC8+Ci0JICAgIDxta2RpciBkaXI9IiR7bGlzdG5lcjEudGVtcC5kaXJ9L01FVEEtSU5GIiAvPgotCSAgICA8bWtkaXIgZGlyPSIke2xpc3RuZXIyLnRlbXAuZGlyfSIgLz4KLQkgICAgPG1rZGlyIGRpcj0iJHtsaXN0bmVyMi50ZW1wLmRpcn0vTUVUQS1JTkYiIC8+Ci0JICAgIDxta2RpciBkaXI9IiR7cHVibGlzaGVyLnRlbXAuZGlyfSIgLz4KLQkgICAgPG1rZGlyIGRpcj0iJHtwdWJsaXNoZXIudGVtcC5kaXJ9L01FVEEtSU5GIiAvPgotCi0JICAgIDxta2RpciBkaXI9ImJ1aWxkL2NsYXNzZXMiIC8+Ci0JICAgIDxta2RpciBkaXI9ImJ1aWxkL2xpYiIgLz4KLQkgICAgCQotCQk8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImJ1aWxkL2NsYXNzZXMiPgotCQkJPGNsYXNzcGF0aD4KLQkJCSAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2xpYiI+Ci0JCQkgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0JCQkgICAgPC9maWxlc2V0PgotCQkJPC9jbGFzc3BhdGg+Ci0JCTwvamF2YWM+Ci0JCQotCSAgICA8Y29weSB0b0ZpbGU9IiR7bGlzdG5lcjEudGVtcC5kaXJ9L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgZmlsZT0ibGlzdG5lcjEuc2VydmljZXMueG1sIi8+Ci0JICAgIDxjb3B5IHRvRmlsZT0iJHtsaXN0bmVyMi50ZW1wLmRpcn0vTUVUQS1JTkYvc2VydmljZXMueG1sIiBmaWxlPSJsaXN0bmVyMi5zZXJ2aWNlcy54bWwiLz4KLQkgICAgICAgIDxjb3B5IHRvRmlsZT0iJHtwdWJsaXNoZXIudGVtcC5kaXJ9L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgZmlsZT0icHVibGlzaGVyLnNlcnZpY2VzLnhtbCIvPgotCSAgICAgICAgCi0JICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9MaXN0bmVyU2VydmljZTEuYWFyIj4KLQkgICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMiPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJzYW1wbGUvZXZlbnRpbmcvKiovKiovKkxpc3RuZXJTZXJ2aWNlMSoiIC8+Ci0JICAgICAgICAgICAgPC9maWxlc2V0PgotCSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaXN0bmVyMS50ZW1wLmRpcn0iPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotCSAgICAgICAgICAgIDwvZmlsZXNldD4KLQkgICAgICAgIDwvamFyPgotCSAgICAgICAgCi0JICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9MaXN0bmVyU2VydmljZTIuYWFyIj4KLQkgICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMiPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJzYW1wbGUvZXZlbnRpbmcvKiovKiovKkxpc3RuZXJTZXJ2aWNlMioiIC8+Ci0JICAgICAgICAgICAgPC9maWxlc2V0PgotCSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaXN0bmVyMi50ZW1wLmRpcn0iPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotCSAgICAgICAgICAgIDwvZmlsZXNldD4KLQkgICAgICAgIDwvamFyPgotCSAgICAgICAgCi0JICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9QdWJsaXNoZXJTZXJ2aWNlLmFhciI+Ci0JICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJidWlsZC9jbGFzc2VzIj4KLQkgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ic2FtcGxlL2V2ZW50aW5nLyoqLyoqLypQdWJsaXNoZXJTZXJ2aWNlKiIgLz4KLQkgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0JICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3B1Ymxpc2hlci50ZW1wLmRpcn0iPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotCSAgICAgICAgICAgIDwvZmlsZXNldD4KLQkgICAgICAgIDwvamFyPgotCSAgICAgICAgCi0JICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9MaXN0bmVyU2VydmljZTEuYWFyIj4KLQkgICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMiPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJzYW1wbGUvZXZlbnRpbmcvKiovKiovKkxpc3RuZXJTZXJ2aWNlMSoiIC8+Ci0JICAgICAgICAgICAgPC9maWxlc2V0PgotCSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaXN0bmVyMS50ZW1wLmRpcn0iPgotCSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotCSAgICAgICAgICAgIDwvZmlsZXNldD4KLQkgICAgICAgIDwvamFyPgotCSAgICAgICAgCi0JICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9FdmVudGluZ1NhbXBsZS5qYXIiPgotCSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3NlcyI+Ci0JICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InNhbXBsZS9ldmVudGluZy8qKiIvPgotCSAgICAgICAgICAgIDwvZmlsZXNldD4KLQkgICAgICAgIDwvamFyPgotCSAgICAgICAgCi0JICAgICAgICA8Y29weSB0b2Rpcj0iYnVpbGQiPgotCSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiI+Ci0JICAgICAgICAgICAgCSA8aW5jbHVkZSBuYW1lPSIqLnNoIi8+Ci0JICAgICAgICAgICAgCSA8aW5jbHVkZSBuYW1lPSIqLmJhdCIvPgotCSAgICAgICAgCTwvZmlsZXNldD4KLQkgICAgICAgIDwvY29weT4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvbGlzdG5lcjEuc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMS5zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjI2M2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMS5zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9Ikxpc3RuZXJTZXJ2aWNlMSI+Ci0KLSAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+c2FtcGxlLmV2ZW50aW5nLkxpc3RuZXJTZXJ2aWNlMTwvcGFyYW1ldGVyPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgTGlzdG5lciBTZXJ2aWNlIDEgb2YgdGhlIEF4aXMyIEV2ZW50aW5nIHNhbXBsZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJwdWJsaXNoIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ij4gIAotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgIAotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvbGlzdG5lcjIuc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMi5zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2NkZjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9saXN0bmVyMi5zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9Ikxpc3RuZXJTZXJ2aWNlMiI+Ci0KLSAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIiBsb2NrZWQ9InhzZDpmYWxzZSI+c2FtcGxlLmV2ZW50aW5nLkxpc3RuZXJTZXJ2aWNlMjwvcGFyYW1ldGVyPgotCi0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGUgTGlzdG5lciBTZXJ2aWNlIDIgb2YgdGhlIEF4aXMyIEV2ZW50aW5nIHNhbXBsZS4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJwdWJsaXNoIiBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ij4gIAotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgICAgICAgIAotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvcHVibGlzaGVyLnNlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvcHVibGlzaGVyLnNlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5YTYxZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3B1Ymxpc2hlci5zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlB1Ymxpc2hlclNlcnZpY2UiPgotCi0gICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgbG9ja2VkPSJ4c2Q6ZmFsc2UiPnNhbXBsZS5ldmVudGluZy5QdWJsaXNoZXJTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoZSBQdWJsaXNoZXIgU2VydmljZSBvZiB0aGUgQXhpczIgRXZlbnRpbmcgc2FtcGxlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8bW9kdWxlIHJlZj0ic2F2YW4iIC8+Ci0gICAgPG1vZHVsZSByZWY9ImFkZHJlc3NpbmciIC8+Ci0JICAgICAgCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJkdW1teU1ldGhvZCIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSI+ICAKLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIiAvPgotCQk8YWN0aW9uTWFwcGluZz51dWlkOkR1bW15TWV0aG9kQWN0aW9uPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgICAgICAgICAKLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3JlYWRtZS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NmQwYTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotU3RlcHMgdG8gYnVpbGQgYW5kIHJ1biB0aGUgU2F2YW4tRXZlbnRpbmcgc2FtcGxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gYnVpbGQKLS0tLS0tLS0tCi0KLTEuIE1vdmUgdG8gdGhlIHNhbXBsZSBmb2xkZXIuCi0yLiBDcmVhdGUgYSBzdWJmb2xkZXJzICdidWlsZC9saWInLgotMy4gQ29weSBhbGwgdGhlIGphcnMgZnJvbSBhIGNvbXBhdGlibGUgQXhpczIgZGlzdHJpYnV0aW9uIHRvICdidWlsZC9saWInLgotNC4gQ29weSB0aGUgc2F2YW4gamFyIGZpbGUgdG8gJ2J1aWxkL2xpYicuCi01LiBSdW4gJ2FudCcgdG8gYnVpbGQgdGhlIHNhbXBsZS4KLQotCi1UbyBydW4KLS0tLS0tLQotMS4gU3RhcnQgYSBBeGlzMiBzZXJ2ZXIuCi0yLiBEZXBsb3kgc2F2YW4gYW5kIGFkZHJlc3NpbmcgbW9kdWxlcy4KLTMuIERlcGxveSB0aGUgdGhyZWUgc2VydmljZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgaW4gdGhlICdidWlsZCcgZm9sZGVyLgotNC4gUnVuIHRoZSAnc2FtcGxlcy5ldmVudGluZy5DbGllbnQnIGNsYXNzLCB5b3UgY2FuIHBhc3MgdGhlIHJlcG9zaXRvcnkgd2l0aCBhICctcicgcGFyYW1ldGVyIGFuZCB0aGUgc2VydmVyIHBvcnQgd2l0aCBhICctcCcgcGFyYW1ldGVyLgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9ydW4uYmF0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9ydW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTczYWYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvcnVuLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1yZW0gU3RhcnQgc2NyaXB0IGZvciBydW5uaW5nIHRoZSBFdmVudGluZyBTYW1wbGUgQ2xpZW50DQotcmVtDQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLXJlbSBzdG9yZSB0aGUgY3VycmVudCBkaXJlY3RvcnkNCi1zZXQgQ1VSUkVOVF9ESVI9JWNkJQ0KLQ0KLXJlbSBjaGVjayB0aGUgQVhJUzJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLWlmIG5vdCAiJUFYSVMyX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUNCi0NCi1yZW0gZ3Vlc3MgdGhlIGhvbWUuIEp1bXAgdHdvIGRpcmVjdG9yaWVzIHVwIGFuZCB0YWtlIHRoYXQgYXMgdGhlIGhvbWUNCi1jZCAuLg0KLWNkIC4uDQotc2V0IEFYSVMyX0hPTUU9JWNkJQ0KLQ0KLWVjaG8gdXNpbmcgQXhpcyBIb21lICVBWElTMl9IT01FJQ0KLQ0KLQ0KLTpnb3RIb21lDQotaWYgRVhJU1QgIiVBWElTMl9IT01FJVxsaWJcYXhpczIqLmphciIgZ290byBva0hvbWUNCi1lY2hvIFRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHNlZW1zIG5vdCB0byBwb2ludCB0byB0aGUgY29ycmVjdCBsb2FjdGlvbiENCi1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0NCi1wYXVzZQ0KLWdvdG8gZW5kDQotDQotOm9rSG9tZQ0KLWNkICVDVVJSRU5UX0RJUiUNCi0NCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQotcmVtIGxvb3AgdGhyb3VnaCB0aGUgbGlicyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNsYXNzIHBhdGgNCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfSE9NRSUNCi1GT1IgJSVjIGluICglQVhJUzJfSE9NRSVcbGliXCouamFyKSBETyBzZXQgQVhJUzJfQ0xBU1NfUEFUSD0hQVhJUzJfQ0xBU1NfUEFUSCE7JSVjDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0NMQVNTX1BBVEglOyIlQ1VSUkVOVF9ESVIlXEV2ZW50aW5nU2FtcGxlLmphciINCi0NCi1qYXZhIC1jcCAlQVhJUzJfQ0xBU1NfUEFUSCUgLURheGlzMi5yZXBvPSVBWElTMl9IT01FJSBzYW1wbGUuZXZlbnRpbmcuQ2xpZW50DQotZW5kbG9jYWwNCi06ZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9ydW4uc2ggYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3J1bi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3MWU0OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3J1bi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaA0KLQ0KLSMgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jICANCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jICANCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1leHBvcnQgQVhJUzJfSE9NRT0uLi8uLg0KLUFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOlNHQ0NhbGN1bGF0b3IuamFyDQotZm9yIGYgaW4gJEFYSVMyX0hPTUUvbGliLyouamFyDQotZG8NCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmDQotZG9uZQ0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgNCi1lY2hvIGNsYXNzcGF0aDogJEFYSVMyX0NMQVNTUEFUSA0KLQ0KLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIIC1EYXhpczIucmVwbz0kQVhJUzJfSE9NRSAgc2FtcGxlLnNnY2NhbGN1bGF0b3IuQ2FsY0NsaWVudA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9DbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3MzFlMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3NyYy9zYW1wbGUvZXZlbnRpbmcvQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuZXZlbnRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zYXZhbi5ldmVudGluZy5jbGllbnQuRXZlbnRpbmdDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zYXZhbi5ldmVudGluZy5jbGllbnQuRXZlbnRpbmdDbGllbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuc2F2YW4uZXZlbnRpbmcuY2xpZW50LlN1YnNjcmlwdGlvblN0YXR1czsKLQotcHVibGljIGNsYXNzIENsaWVudCB7Ci0KLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwotICAgIAotICAgIHByaXZhdGUgZmluYWwgaW50IE1JTl9PUFRJT04gPSAxOwotICAgIHByaXZhdGUgZmluYWwgaW50IE1BWF9PUFRJT04gPSA5OwotICAgIAotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFNVQlNDUklCRVJfMV9JRCA9ICJzdWJzY3JpYmVyMSI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1VCU0NSSUJFUl8yX0lEID0gInN1YnNjcmliZXIyIjsKLSAgICAKLSAgICBwcml2YXRlIFNlcnZpY2VDbGllbnQgc2VydmljZUNsaWVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnMgPSBudWxsOwotICAgIHByaXZhdGUgRXZlbnRpbmdDbGllbnQgZXZlbnRpbmdDbGllbnQgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHRvQWRkcmVzc1BhcnQgPSAiL2F4aXMyL3NlcnZpY2VzL1B1Ymxpc2hlclNlcnZpY2UiOwotICAgIHByaXZhdGUgU3RyaW5nIGxpc3RuZXIxQWRkcmVzc1BhcnQgPSAiL2F4aXMyL3NlcnZpY2VzL0xpc3RuZXJTZXJ2aWNlMSI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGlzdG5lcjJBZGRyZXNzUGFydCA9ICIvYXhpczIvc2VydmljZXMvTGlzdG5lclNlcnZpY2UyIjsKLSAgICAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbk5hbWVzcGFjZU5hbWUgPSAiaHR0cDovL3RlbXB1cmkub3JnLyI7IAotCXByaXZhdGUgZmluYWwgU3RyaW5nIGR1bW15TWV0aG9kID0gImR1bW15TWV0aG9kIjsKLSAgICAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVwbyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IHBvcnQgPSA4MDgwOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJ2ZXJJUCA9ICIxMjcuMC4wLjEiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwb3J0UGFyYW0gPSAiLXAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyByZXBvUGFyYW0gPSAiLXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBoZWxwUGFyYW0gPSAiLWgiOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWZvciAoaW50IGk9MDtpPGFyZ3MubGVuZ3RoO2krKykgewotCQkJaWYgKGhlbHBQYXJhbS5lcXVhbHNJZ25vcmVDYXNlKGFyZ3NbaV0pKSB7Ci0JCQkJZGlzcGxheUhlbHAgKCk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyBwb3J0U3RyID0gZ2V0UGFyYW0ocG9ydFBhcmFtLGFyZ3MpOwotCQlpZiAocG9ydFN0ciE9bnVsbCkgewotCQkJcG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFN0cik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlciBQb3J0IHdhcyBzZXQgdG86IiArIHBvcnQpOwotCQl9Ci0JCQotCQlTdHJpbmcgcmVwb1N0ciA9IGdldFBhcmFtKHJlcG9QYXJhbSxhcmdzKTsKLQkJaWYgKHJlcG9TdHIhPW51bGwpIHsKLQkJCXJlcG8gPSByZXBvU3RyOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQgUmVwb3NpdG9yeSB3YXMgc2V0IHRvOiIgKyByZXBvKTsKLQkJfQotCQkKLQkJQ2xpZW50IGMgPSBuZXcgQ2xpZW50ICgpOwotCQljLnJ1biAoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNwbGF5SGVscCAoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSGVscCBwYWdlIGZvciB0aGUgRXZlbnRpbmcgQ2xpZW50Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiU2V0IHRoZSBjbGllbnQgcmVwb3Npb3J5IHVzaW5nIHRoZSBwYXJhbWV0ZXIgLXIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTZXQgdGhlIHNlcnZlciBwb3J0IHVzaW5nIHRoZSBwYXJhbWV0ZXIgLXAiKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNoZWNrIHRoZSBnaXZlbiBwYXJhbWV0ZXIgaW4gdGhlIGFycmF5IGFuZCB3aWxsIHJldHVybiwgaWYgYXZhaWxhYmxlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW0KLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFyYW0oU3RyaW5nIHBhcmFtLCBTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChwYXJhbSA9PSBudWxsIHx8ICIiLmVxdWFscyhwYXJhbSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnID0gYXJnc1tpXTsKLSAgICAgICAgICAgIGlmIChwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKGFyZykgJiYgKGFyZ3MubGVuZ3RoID49IChpICsgMSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQkKLQlwdWJsaWMgdm9pZCBydW4gKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiV2VsY29tZSB0byBBeGlzMiBFdmVudGluZyBTYW1wbGUiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0JCQotCQlib29sZWFuIHZhbGlkT3B0aW9uU2VsZWN0ZWQgPSBmYWxzZTsKLQkJaW50IHNlbGVjdGVkT3B0aW9uID0gLTE7Ci0JCXdoaWxlICghdmFsaWRPcHRpb25TZWxlY3RlZCkgewotCQkJZGlzcGxheU1lbnUoKTsKLQkJCXNlbGVjdGVkT3B0aW9uID0gZ2V0SW50SW5wdXQoKTsKLQkJCWlmIChzZWxlY3RlZE9wdGlvbj49TUlOX09QVElPTiAmJiBzZWxlY3RlZE9wdGlvbjw9TUFYX09QVElPTikKLQkJCQl2YWxpZE9wdGlvblNlbGVjdGVkID0gdHJ1ZTsKLQkJCWVsc2UgCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbkludmFsaWQgT3B0aW9uIFxuXG4iKTsKLQkJfQotCQkJCi0JCWluaXRDbGllbnQgKCk7Ci0JCXBlcmZvcm1BY3Rpb24gKHNlbGVjdGVkT3B0aW9uKTsKLQkJCi0JCS8vVE9ETyBwdWJsaXNoCi0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIGVudGVyIHRvIGluaXRpYWxpemUgdGhlIHB1Ymxpc2hlciBzZXJ2aWNlLiIpOwotCQlyZWFkZXIucmVhZExpbmUoKTsKLQkJCi0JCW9wdGlvbnMuc2V0QWN0aW9uKCJ1dWlkOkR1bW15TWV0aG9kQWN0aW9uIik7Ci0JCXNlcnZpY2VDbGllbnQuZmlyZUFuZEZvcmdldChnZXREdW1teU1ldGhvZFJlcXVlc3RFbGVtZW50ICgpKTsKLQkJCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQkKLQkJCXZhbGlkT3B0aW9uU2VsZWN0ZWQgPSBmYWxzZTsKLQkJCXNlbGVjdGVkT3B0aW9uID0gLTE7Ci0JCQl3aGlsZSAoIXZhbGlkT3B0aW9uU2VsZWN0ZWQpIHsKLQkJCQlkaXNwbGF5TWVudSgpOwotCQkJCXNlbGVjdGVkT3B0aW9uID0gZ2V0SW50SW5wdXQoKTsKLQkJCQlpZiAoc2VsZWN0ZWRPcHRpb24+PU1JTl9PUFRJT04gJiYgc2VsZWN0ZWRPcHRpb248PU1BWF9PUFRJT04pCi0JCQkJCXZhbGlkT3B0aW9uU2VsZWN0ZWQgPSB0cnVlOwotCQkJCWVsc2UgCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5JbnZhbGlkIE9wdGlvbiBcblxuIik7Ci0JCQl9Ci0JCQkJCi0JCQlwZXJmb3JtQWN0aW9uIChzZWxlY3RlZE9wdGlvbik7Ci0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcGxheU1lbnUgKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIDEgdG8gc3Vic2NyaWJlIExpc3RuZXIgU2VydmljZSAxIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJlc3MgMiB0byBzdWJzY3JpYmUgTGlzdG5lciBTZXJ2aWNlIDIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVzcyAzIHRvIHN1YnNjcmliZSBib3RoIGxpc3RuZXIgc2VydmljZXMiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVzcyA0IHRvIHVuc3Vic2NyaWJlIExpc3RuZXIgU2VydmljZSAxIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJlc3MgNSB0byB1bnN1YnNjcmliZSBMaXN0bmVyIFNlcnZpY2UgMiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIDYgdG8gdW5zdWJzY3JpYmUgYm90aCBsaXN0bmVyIHNlcnZpY2VzIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUHJlc3MgNyB0byB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgc3Vic2NyaXB0aW9uIHRvIFNlcnZpY2UgMSIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByZXNzIDggdG8gdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIHN1YnNjcmlwdGlvbiB0byBTZXJ2aWNlIDIiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmVzcyA5IHRvIEV4aXQiKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0SW50SW5wdXQgKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvbiA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQob3B0aW9uKTsKLSAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCS8vaW52YWxpZCBvcHRpb24KLSAgICAgICAgCXJldHVybiAtMTsKLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdENsaWVudCAoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotCQlTdHJpbmcgQ0xJRU5UX1JFUE8gPSBudWxsOwotCQlTdHJpbmcgQVhJUzJfWE1MID0gbnVsbDsKLQkJCi0JCWlmIChyZXBvIT1udWxsKSB7Ci0JCQlDTElFTlRfUkVQTyA9IHJlcG87Ci0JCQlBWElTMl9YTUwgPSByZXBvICsgRmlsZS5zZXBhcmF0b3IgKyAiYXhpczIueG1sIjsKLQkJfSBlbHNlIHsKLS8vCQkJdGhyb3cgbmV3IEF4aXNGYXVsdCAoIlBsZWFzZSBzcGVjaWZ5IHRoZSBjbGllbnQgcmVwb3NpdG9yeSBhcyBhIHByb2dyYW0gYXJndW1lbnQuVXNlICctaCcgZm9yIGhlbHAuIik7Ci0JCX0KLQkJCi0JCUNvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShDTElFTlRfUkVQTyxudWxsKTsKLQkJc2VydmljZUNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50IChjb25maWdDb250ZXh0LG51bGwpOyAvL1RPRE8gZ2l2ZSBhIHJlcG8KLQkJCi0JCW9wdGlvbnMgPSBuZXcgT3B0aW9ucyAoKTsKLQkJc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQlzZXJ2aWNlQ2xpZW50LmVuZ2FnZU1vZHVsZShuZXcgUU5hbWUgKCJhZGRyZXNzaW5nIikpOwotCQkKLQkJZXZlbnRpbmdDbGllbnQgPSBuZXcgRXZlbnRpbmdDbGllbnQgKHNlcnZpY2VDbGllbnQpOwotCQkKLQkJU3RyaW5nIHRvQWRkcmVzcyA9ICJodHRwOi8vIiArIHNlcnZlcklQICsgIjoiICsgcG9ydCArIHRvQWRkcmVzc1BhcnQ7Ci0JCW9wdGlvbnMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlICh0b0FkZHJlc3MpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1BY3Rpb24gKGludCBhY3Rpb24pIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSAxOgotCQkJZG9TdWJzY3JpYmUoU1VCU0NSSUJFUl8xX0lEKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlkb1N1YnNjcmliZShTVUJTQ1JJQkVSXzJfSUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCWRvU3Vic2NyaWJlKFNVQlNDUklCRVJfMV9JRCk7Ci0JCQlkb1N1YnNjcmliZShTVUJTQ1JJQkVSXzJfSUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWRvVW5zdWJzY3JpYmUoU1VCU0NSSUJFUl8xX0lEKTsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlkb1Vuc3Vic2NyaWJlKFNVQlNDUklCRVJfMl9JRCk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQkJZG9VbnN1YnNjcmliZShTVUJTQ1JJQkVSXzFfSUQpOwotCQkJZG9VbnN1YnNjcmliZShTVUJTQ1JJQkVSXzJfSUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNzoKLQkJCWRvR2V0U3RhdHVzKFNVQlNDUklCRVJfMV9JRCk7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJZG9HZXRTdGF0dXMoU1VCU0NSSUJFUl8yX0lEKTsKLQkJCWJyZWFrOwotCQljYXNlIDk6Ci0JCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvU3Vic2NyaWJlIChTdHJpbmcgSUQpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudGluZ0NsaWVudEJlYW4gYmVhbiA9IG5ldyBFdmVudGluZ0NsaWVudEJlYW4gKCk7Ci0JCQotCQlTdHJpbmcgc3Vic2NyaWJpbmdBZGRyZXNzID0gbnVsbDsKLQkJaWYgKFNVQlNDUklCRVJfMV9JRC5lcXVhbHMoSUQpKSB7Ci0gICAgICAgICAgICBzdWJzY3JpYmluZ0FkZHJlc3MgPSAiaHR0cDovLyIgKyBzZXJ2ZXJJUCArICI6IiArIHBvcnQgKyBsaXN0bmVyMUFkZHJlc3NQYXJ0OwotCQl9IGVsc2UgaWYgKFNVQlNDUklCRVJfMl9JRC5lcXVhbHMoSUQpKSB7Ci0gICAgICAgICAgICBzdWJzY3JpYmluZ0FkZHJlc3MgPSAiaHR0cDovLyIgKyBzZXJ2ZXJJUCArICI6IiArIHBvcnQgKyBsaXN0bmVyMkFkZHJlc3NQYXJ0OwotCQl9Ci0JCi0JCWJlYW4uc2V0RGVsaXZlcnlFUFIobmV3IEVuZHBvaW50UmVmZXJlbmNlIChzdWJzY3JpYmluZ0FkZHJlc3MpKTsKLQkKLQkJLy91bmNvbW1lbnQgZm9sbG93aW5nIHRvIHNldCBhbiBleHBpcmF0aW9uIHRpbWUgb2YgMTAgbWludXRlcy4KLS8vCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZSAoKTsKLS8vCQlkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkrMTApOwotLy8JCWJlYW4uc2V0RXhwaXJhdGlvblRpbWUoZGF0ZSk7Ci0JCQotCQlldmVudGluZ0NsaWVudC5zdWJzY3JpYmUoYmVhbixJRCk7Ci0JCVRocmVhZC5zbGVlcCgxMDAwKTsgICAvL1RPRE8gcmVtb3ZlIGlmIG5vdCBzZXF1aXJlZAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9VbnN1YnNjcmliZSAoU3RyaW5nIElEKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZXZlbnRpbmdDbGllbnQudW5zdWJzY3JpYmUoSUQpOwotCQlUaHJlYWQuc2xlZXAoMTAwMCk7ICAgLy9UT0RPIHJlbW92ZSBpZiBub3Qgc2VxdWlyZWQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvR2V0U3RhdHVzIChTdHJpbmcgSUQpIHRocm93cyBFeGNlcHRpb24gewotCQlTdWJzY3JpcHRpb25TdGF0dXMgc3RhdHVzICA9IGV2ZW50aW5nQ2xpZW50LmdldFN1YnNjcmlwdGlvblN0YXR1cyhJRCk7Ci0JCVRocmVhZC5zbGVlcCgxMDAwKTsgICAvL1RPRE8gcmVtb3ZlIGlmIG5vdCBzZXF1aXJlZAotCQkKLQkJU3RyaW5nIHN0YXR1c1ZhbHVlID0gc3RhdHVzLmdldEV4cGlyYXRpb25WYWx1ZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlciAnIiArIElEICsiJyBpcyIgKyBzdGF0dXNWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgT01FbGVtZW50IGdldER1bW15TWV0aG9kUmVxdWVzdEVsZW1lbnQoKSB7Ci0JCU9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLQkJT01OYW1lc3BhY2UgbmFtZXNwYWNlID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKGFwcGxpY2F0aW9uTmFtZXNwYWNlTmFtZSwibnMxIik7Ci0JCXJldHVybiBmYWMuY3JlYXRlT01FbGVtZW50KGR1bW15TWV0aG9kLCBuYW1lc3BhY2UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTEuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmYmIxOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3NyYy9zYW1wbGUvZXZlbnRpbmcvTGlzdG5lclNlcnZpY2UxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5ldmVudGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTGlzdG5lclNlcnZpY2UxIHsKLQkKLQlTdHJpbmcgbmFtZSA9ICJMaXN0bmVyU2VydmljZTEiOwotCi0JcHVibGljIHZvaWQgcHVibGlzaChPTUVsZW1lbnQgcGFyYW0pIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiJyIgKyBuYW1lICsgIicgZ290IGEgbmV3IHB1YmxpY2F0aW9uLi4uIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihwYXJhbSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4iKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9MaXN0bmVyU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViNTc0Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2V2ZW50aW5nL3NyYy9zYW1wbGUvZXZlbnRpbmcvTGlzdG5lclNlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5ldmVudGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTGlzdG5lclNlcnZpY2UyIHsKLSAgCi0JU3RyaW5nIG5hbWUgPSAiTGlzdG5lclNlcnZpY2UyIjsKLSAgCi0JcHVibGljIHZvaWQgcHVibGlzaChPTUVsZW1lbnQgcGFyYW0pIHRocm93cyBFeGNlcHRpb24gIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiciICsgbmFtZSArICAiJyBnb3QgYSBuZXcgcHVibGljYXRpb24uLi4iKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhcmFtKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9zcmMvc2FtcGxlL2V2ZW50aW5nL1B1Ymxpc2hlclNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZXZlbnRpbmcvc3JjL3NhbXBsZS9ldmVudGluZy9QdWJsaXNoZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDYyNWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ldmVudGluZy9zcmMvc2FtcGxlL2V2ZW50aW5nL1B1Ymxpc2hlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLmV2ZW50aW5nOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuc2F2YW4ucHVibGljYXRpb24uY2xpZW50LlB1YmxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuc2F2YW4uc3RvcmFnZS5TdWJzY3JpYmVyU3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zYXZhbi51dGlsLkNvbW1vblV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJTZXJ2aWNlIHsKLSAgCi0JU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSBudWxsOwotCQotCXB1YmxpYyB2b2lkIGluaXQoU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV2ZW50aW5nIFNlcnZpY2UgSU5JVCBjYWxsZWQiKTsKLQkJdGhpcy5zZXJ2aWNlQ29udGV4dCA9IHNlcnZpY2VDb250ZXh0OwotCQkKLQkJUHVibGlzaGVyVGhyZWFkIHRocmVhZCA9IG5ldyBQdWJsaXNoZXJUaHJlYWQgKCk7Ci0JCXRocmVhZC5zdGFydCgpOwotCX0KLSAgCi0JcHVibGljIHZvaWQgZHVtbXlNZXRob2QoT01FbGVtZW50IHBhcmFtKSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRXZlbnRpbmcgU2VydmljZSBkdW1teSBtZXRob2QgY2FsbGVkIik7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUHVibGlzaGVyVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJCi0JCVN0cmluZyBQdWJsaWNhdGlvbiA9ICJQdWJsaWNhdGlvbiI7Ci0JCVN0cmluZyBwdWJsaWNhdGlvbk5hbWVzcGFjZVZhbHVlID0gImh0dHA6Ly90ZW1wdXJpL3B1YmxpY2F0aW9uLyI7Ci0JCVJhbmRvbSByID0gbmV3IFJhbmRvbSAoKTsKLQkJCi0JCXB1YmxpYyB2b2lkIHJ1biAoKSB7Ci0JCQl0cnkgewotCQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJCQotCQkJCQlUaHJlYWQuc2xlZXAoNTAwMCk7Ci0JCQkJCQotCQkJCQkvL3B1Ymxpc2hpbmcKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoaW5nIG5leHQgcHVibGljYXRpb24uLi4iKTsKLQkJCQkJCi0JCQkJCVN1YnNjcmliZXJTdG9yZSBzdG9yZSA9IENvbW1vblV0aWwuZ2V0U3Vic2NyaWJlclN0b3JlKHNlcnZpY2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCkpOwotCQkJCQlpZiAoc3RvcmU9PW51bGwpCi0JCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uICgiQ2FudCBmaW5kIHRoZSBTYXZhbiBzdWJzY3JpYmVyIHN0b3JlIik7Ci0JCQkJCQotCQkJCQlPTUVsZW1lbnQgZGF0YSA9IGdldE5leHRQdWJsaWNhdGlvbkRhdGEgKCk7Ci0JCQkJCQotCQkJCQlQdWJsaWNhdGlvbkNsaWVudCBwdWJsaWNhdGlvbkNsaWVudCA9IG5ldyBQdWJsaWNhdGlvbkNsaWVudCAoc2VydmljZUNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSk7Ci0JCQkJCXB1YmxpY2F0aW9uQ2xpZW50LnNlbmRQdWJsaWNhdGlvbihkYXRhLHNlcnZpY2VDb250ZXh0LmdldEF4aXNTZXJ2aWNlKCksbnVsbCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIE9NRWxlbWVudCBnZXROZXh0UHVibGljYXRpb25EYXRhICgpIHsKLQkJCU9NRmFjdG9yeSBmYWN0b3J5ID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0JCQlPTU5hbWVzcGFjZSBuYW1lc3BhY2UgPSBmYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHB1YmxpY2F0aW9uTmFtZXNwYWNlVmFsdWUsIm5zMSIpOwotCQkJT01FbGVtZW50IHB1YmxpY2F0aW9uRWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KFB1YmxpY2F0aW9uLG5hbWVzcGFjZSk7Ci0JCQkKLQkJCWludCB2YWx1ZSA9IHIubmV4dEludCgpOwotCQkJcHVibGljYXRpb25FbGVtZW50LnNldFRleHQoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCQkJCi0JCQlPTUVsZW1lbnQgZGF0YSA9IGZhY3RvcnkuY3JlYXRlT01FbGVtZW50KCJwdWJsaXNoIixuYW1lc3BhY2UpOwotCQkJZGF0YS5hZGRDaGlsZChwdWJsaWNhdGlvbkVsZW1lbnQpOwotCQkJCi0JCQkKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwM2I1ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLVNhbXBsZTogRXhjZXB0aW9uIEhhbmRsaW5nIHVzaW5nIFdTREwgRmF1bHRzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgZXhjZXB0aW9ucyBjYW4gYmUgaGFuZGxlZCB1c2luZyBXU0RMIGZhdWx0cywgaW4gb3RoZXIgd29yZHMsIGhvdyB0byBzcGVjaWZ5IGEgV1NETCBmYXVsdCBpbiBvcmRlciB0byBhbGxvdyB5b3VyIHNlcnZpY2UgdG8gY29tbXVuaWNhdGUgZXhjZXB0aW9uIHBhdGh3YXlzIHRvIHlvdXIgY2xpZW50cy4gDQotDQotUnVubmluZyBvZiB0aGlzIHNhbXBsZSBhc3N1bWVzIHRoYXQgeW91IGFyZSBydW5uaW5nIHRoaXMgd2l0aGluIHRoZSBleHRyYWN0ZWQgcmVsZWFzZSBmb2xkZXIuDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi0NCi1CdWlsZGluZyBUaGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSogVHlwZSBhbnQgZ2VuZXJhdGUuc2VydmljZSBvciBqdXN0IGFudCBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9mYXVsdGhhbmRsaW5nLg0KLSogVGhlbiBnbyB0byBBeGlzMl9IT01FL2JpbiBkaXJlY3RvcnkgYW5kIHJ1biBlaXRoZXIgYXhpczJzZXJ2ZXIuYmF0IG9yIGF4aXMyc2VydmVyLnNoIGRlcGVuZGluZyBvbiB5b3VyIHBsYXRmb3JtLg0KLQ0KLUlmIHlvdSBnbyB0byAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyLyB5b3Ugc2hvdWxkIHNlZSBCYW5rU2VydmljZSBpcyBkZXBsb3llZC4gDQotDQotUnVubmluZyBUaGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotSW52b2tlIHRoZSBjbGllbnQvc3JjL2V4YW1wbGUvQmFua0NsaWVudC5qYXZhIGNsYXNzLiBZb3UgbWF5IHVzZSB0aGUgY29tbWFuZCBzY3JpcHRzIHRvIGRvIHNvLiBZb3UgbmVlZCB0byBzdXBwbHkgMyBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kLSB1cmwsIGFjY291bnQgYW5kIGFtb3VudC4NCi0NCi0gKiBhbnQgcnVuLmNsaWVudCAtRHVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQmFua1NlcnZpY2UgLURhY2NvdW50PTEzIC1EYW10PTQwMA0KLSAgIFRocm93cyBBY2NvdW50Tm90RXhpc3RGYXVsdE1lc3NhZ2VFeGNlcHRpb24uIFlvdSB3aWxsIHNlZSAiQWNjb3VudCMxMyBkb2VzIG5vdCBleGlzdCKgIA0KLSAqIGFudCBydW4uY2xpZW50IC1EdXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9CYW5rU2VydmljZSAtRGFjY291bnQ9ODggLURhbXQ9MTIwMA0KLSAgIFRocm93cyBJbnN1ZmZpY2llbnRGdW5kc0ZhdWx0TWVzc2FnZUV4Y2VwdGlvbi4gWW91IHdpbGwgc2VlICJBY2NvdW50Izg4IGhhcyBiYWxhbmNlIG9mIDEwMDAuIEl0IGNhbm5vdCBzdXBwb3J0IHdpdGhkcmF3YWwgICBvZiAxMjAwIqAgDQotICogYW50IHJ1bi5jbGllbnQgLUR1cmw9aHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0JhbmtTZXJ2aWNlIC1EYWNjb3VudD04OCAtRGFtdD00MDANCi0gICBTdWNjZWVkcyB3aXRoIGEgYmFsYW5jZSBvZiA2MDAuIFlvdSB3aWxsIHNlZSAiQmFsYW5jZSA9IDYwMCKgIA0KLQ0KLVdoZW4geW91IGNhbGwgYW50IHJ1bi5jbGllbnQgd2l0aCBwYXJhbWV0ZXJzLCBiZWZvcmUgcnVubmluZyBjbGllbnQvc3JjL2V4YW1wbGUvQmFua0NsaWVudC5qYXZhIGNsYXNzLCBpdCBkb2VzIHRoZSBmb2xsb3dpbmcgYXMgd2VsbDoNCi0gKiBHZW5lcmF0ZSB0aGUgc3R1YnMgKGZvciB0aGUgY2xpZW50KSBmcm9tIHRoZSBXU0RMDQotICogQ29tcGlsZSB0aGUgY2xpZW50IGNsYXNzZXMNCi0gKiBDcmVhdGUgYSBKYXIgb2YgdGhlIGNsaWVudCBjbGFzc2VzIGFuZCBjb3B5IGl0IHRvIGJ1aWxkL2NsaWVudC9CYW5rU2VydmljZS10ZXN0LWNsaWVudC5qYXINCi0NCi1BZHZhbmNlZCBHdWlkZQ0KLT09PT09PT09PT09PT09DQotRm9yIG1vcmUgZGV0YWlscyBraW5kbHkgc2VlIGRvYy9GYXVsdEhhbmRsaW5nU2FtcGxlR3VpZGUuaHRtbA0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2Jhbmsud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9iYW5rLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2NmMzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2Jhbmsud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUiCi0JeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczp0bnM9Imh0dHA6Ly9leGFtcGxlIgotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCTx3c2RsOnR5cGVzPgotCQk8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9leGFtcGxlIgotCQkJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vZXhhbXBsZSIgeG1sbnM6aW50Zj0iaHR0cDovL2V4YW1wbGUiCi0JCQl4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0JCQkKLQkJCTxlbGVtZW50IG5hbWU9IndpdGhkcmF3Ij4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFjY291bnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFtb3VudCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQkKLQkJCTxlbGVtZW50IG5hbWU9IndpdGhkcmF3UmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYmFsYW5jZSIgdHlwZT0ieHNkOmludCIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQkKLQkJCTxlbGVtZW50IG5hbWU9IkFjY291bnROb3RFeGlzdEZhdWx0Ij4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9ImFjY291bnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCQkJCi0JCQk8ZWxlbWVudCBuYW1lPSJJbnN1ZmZpY2llbnRGdW5kRmF1bHQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYWNjb3VudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0iYmFsYW5jZSIgdHlwZT0ieHNkOmludCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icmVxdWVzdGVkRnVuZCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQkKLQkJPC9zY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCQotCTx3c2RsOm1lc3NhZ2UgbmFtZT0id2l0aGRyYXdSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6d2l0aGRyYXciIG5hbWU9InBhcmFtZXRlcnMiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9IndpdGhkcmF3UmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczp3aXRoZHJhd1Jlc3BvbnNlIiBuYW1lPSJyZXR1cm4iLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9Ikluc3VmZmljaWVudEZ1bmRGYXVsdE1lc3NhZ2UiPgotCQk8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpJbnN1ZmZpY2llbnRGdW5kRmF1bHQiIG5hbWU9ImZhdWx0Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJBY2NvdW50Tm90RXhpc3RGYXVsdE1lc3NhZ2UiPgotCQk8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpBY2NvdW50Tm90RXhpc3RGYXVsdCIgbmFtZT0iZmF1bHQiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQkKLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJCYW5rIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IndpdGhkcmF3Ij4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczp3aXRoZHJhd1JlcXVlc3QiIG5hbWU9IndpdGhkcmF3UmVxdWVzdCIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczp3aXRoZHJhd1Jlc3BvbnNlIiBuYW1lPSJ3aXRoZHJhd1Jlc3BvbnNlIi8+Ci0JCQk8d3NkbDpmYXVsdCBtZXNzYWdlPSJ0bnM6QWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlIiBuYW1lPSJBY2NvdW50Tm90RXhpc3RFeGNlcHRpb24iLz4KLQkJCTx3c2RsOmZhdWx0IG1lc3NhZ2U9InRuczpJbnN1ZmZpY2llbnRGdW5kRmF1bHRNZXNzYWdlIiBuYW1lPSJJbnN1ZmZpY2llbnRGdW5kRXhjZXB0aW9uIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCQotCTwvd3NkbDpwb3J0VHlwZT4KLQkKLQk8d3NkbDpiaW5kaW5nIG5hbWU9IkJhbmtTb2FwQmluZGluZyIgdHlwZT0idG5zOkJhbmsiPgotCQk8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ3aXRoZHJhdyI+Ci0JCQk8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0id2l0aGRyYXdSZXF1ZXN0Ij4KLQkJCQk8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJ3aXRoZHJhd1Jlc3BvbnNlIj4KLQkJCQk8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJJbnN1ZmZpY2llbnRGdW5kRXhjZXB0aW9uIj4KLQkJCQk8d3NkbHNvYXA6ZmF1bHQgbmFtZT0iSW5zdWZmaWNpZW50RnVuZEV4Y2VwdGlvbiIgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6ZmF1bHQ+Ci0JCQk8d3NkbDpmYXVsdCBuYW1lPSJBY2NvdW50Tm90RXhpc3RFeGNlcHRpb24iPgotCQkJCTx3c2Rsc29hcDpmYXVsdCBuYW1lPSJBY2NvdW50Tm90RXhpc3RFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmZhdWx0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCQotCTx3c2RsOnNlcnZpY2UgbmFtZT0iQmFua1NlcnZpY2UiPgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpCYW5rU29hcEJpbmRpbmciIG5hbWU9IkJhbmsiPgotCQkJPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYW5rL3NlcnZpY2VzL0JhbmsiLz4KLQkJPC93c2RsOnBvcnQ+Ci0JPC93c2RsOnNlcnZpY2U+Ci0JCi08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YTg5ZjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9ImZhdWx0aGFuZGxpbmciIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0gICAgPHByb3BlcnR5IG5hbWU9IndzZGwudXJpIiB2YWx1ZT0iYmFuay53c2RsIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UudGFyZ2V0IiB2YWx1ZT0iYnVpbGQvc2VydmljZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGllbnQudGFyZ2V0IiB2YWx1ZT0iYnVpbGQvY2xpZW50Ii8+Ci0KLSAgICA8IS0tIEJ1aWxkIHRoZSBzZXJ2aWNlLCB0aGVuIHRoZSBjbGllbnQuIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iamFyIj4KLSAgICAgICAgPGFudCBkaXI9InNlcnZpY2UiIHRhcmdldD0iamFyLnNlcnZlciIvPgotICAgICAgICA8YW50IGRpcj0iY2xpZW50Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9Imdlbi5zdHViIj4KLQotICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJwYXJhbXMub2siPgotICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InVybCIvPgotICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYWNjb3VudCIvPgotICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iYW10Ii8+Ci0gICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgPC9jb25kaXRpb24+Ci0KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iT25lIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LiBVc2FnZTogQmFua0NsaWVudCAtRHVybD0mbHQ7dXJsJmd0OyAtRGFjY291bnQ9Jmx0O2FjY291bnQmZ3Q7IC1EYW10PSZsdDthbW91bnQmZ3Q7IgotICAgICAgICB1bmxlc3M9InBhcmFtcy5vayIvPgotICAgICAgICAKLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJleGFtcGxlLkJhbmtDbGllbnQiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSIke3VybH0gJHthY2NvdW50fSAke2FtdH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NsaWVudC50YXJnZXR9L0JhbmtTZXJ2aWNlLXRlc3QtY2xpZW50LmphciIvPgotICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliIj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5hbGwiIGRlcGVuZHM9ImdlbmVyYXRlLnNlcnZpY2UsZ2VuLnN0dWIiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSI+Ci0KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7c2VydmljZS50YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7c2VydmljZS50YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7c2VydmljZS50YXJnZXR9L2NsYXNzZXMiLz4KLQotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1zcyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItc2QiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtzZXJ2aWNlLnRhcmdldH0iLz4KLSAgICAgICAgICAgIDwhLS0gT3V0cHV0IGRpcmVjdG9yeSBpbiB3aGljaCB0byBnZW5lcmF0ZSBmaWxlcyAtLT4gPCEtLSBOQiBpdCBnZW5lcmF0ZXMgdG8gdGhlIHNyYyBmb2xkZXIgdW5kZXIgdGhpcyBkaXJlY3RvcnkhISAtLT4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgPCEtLWNvcHkgdGhlIGFscmVhZHkgd3JpdHRlbiBza2VsZXRvbiBjbGFzcy0tPgotICAgICAgICA8Y29weSBmaWxlPSJzZXJ2aWNlL3NyYy9leGFtcGxlL0JhbmtTZXJ2aWNlU2tlbGV0b24uamF2YSIKLSAgICAgICAgICAgICAgdG9kaXI9IiR7c2VydmljZS50YXJnZXR9L3NyYy9leGFtcGxlIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyIvPgotCi0gICAgICAgIDwhLS1GaXJzdCBsZXQncyBjb21waWxlIHRoZSBjbGFzc2VzLS0+Ci0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIG1lbW9yeU1heGltdW1TaXplPSIyNTZtIiBtZW1vcnlJbml0aWFsU2l6ZT0iMjU2bSIgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7c2VydmljZS50YXJnZXR9L2NsYXNzZXMiIHNyY2Rpcj0iJHtzZXJ2aWNlLnRhcmdldH0vc3JjIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmFjPgotCi0gICAgICAgIDwhLS1hYXIgdGhlbSB1cCAtLT4KLSAgICAgICAgPGNvcHkgdG9EaXI9IiR7c2VydmljZS50YXJnZXR9L2NsYXNzZXMvTUVUQS1JTkYiIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c2VydmljZS50YXJnZXR9L3Jlc291cmNlcyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLndzZGwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnhzZCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7c2VydmljZS50YXJnZXR9L0JhbmtTZXJ2aWNlLmFhciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBleGNsdWRlcz0iKiovVGVzdC5jbGFzcyIgZGlyPSIke3NlcnZpY2UudGFyZ2V0fS9jbGFzc2VzIi8+Ci0gICAgICAgIDwvamFyPgotCi0gICAgICAgIDxjb3B5IGZpbGU9IiR7c2VydmljZS50YXJnZXR9L0JhbmtTZXJ2aWNlLmFhciIgdG9maWxlPSIuLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzL3NhbXBsZS1mYXVsdGhhbmRsaW5nLmFhciIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ0cnVlIi8+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuLnN0dWIiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtjbGllbnQudGFyZ2V0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2NsaWVudC50YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Y2xpZW50LnRhcmdldH0vY2xhc3NlcyIvPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7Y2xpZW50LnRhcmdldH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0KLSAgICAgICAgPGNvcHkgZmlsZT0iY2xpZW50L3NyYy9leGFtcGxlL0JhbmtDbGllbnQuamF2YSIgdG9kaXI9IiR7Y2xpZW50LnRhcmdldH0vc3JjL2V4YW1wbGUiLz4KLQotICAgICAgICA8IS0tbm93IGNvbXBpbGUgdGhlIHN0dWIgY2xhc3Nlcy0tPgotICAgICAgICA8amF2YWMgZGVidWc9Im9uIiBtZW1vcnlNYXhpbXVtU2l6ZT0iMjU2bSIgbWVtb3J5SW5pdGlhbFNpemU9IjI1Nm0iIGZvcms9InRydWUiCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2NsaWVudC50YXJnZXR9L2NsYXNzZXMiPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke2NsaWVudC50YXJnZXR9L3NyYyIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPCEtLWphciB0aGUgY29tcGlsZWQgc3R1ZmYtLT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtjbGllbnQudGFyZ2V0fS9CYW5rU2VydmljZS10ZXN0LWNsaWVudC5qYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsaWVudC50YXJnZXR9L2NsYXNzZXMiPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL01FVEEtSU5GLyouKiIvPgotICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL2xpYi8qLioiLz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8qTWVzc2FnZVJlY2VpdmVyLmNsYXNzIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovKlNrZWxldG9uLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSJidWlsZCIvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvY2xpZW50L2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9jbGllbnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1NDNiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9jbGllbnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJqYXIuY2xpZW50Ij4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC5iYXNlLmRpciIgdmFsdWU9Ii4iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icGFyZW50LmRpciIgdmFsdWU9Ii4uIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0id3NkbC51cmkiIHZhbHVlPSIke3BhcmVudC5kaXJ9L2Jhbmsud3NkbCIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vc3JjIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhcmdldCIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vdGFyZ2V0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhcmdldC5qYXZhIiB2YWx1ZT0iJHt0YXJnZXR9L3NyYyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YXJnZXQuY2xhc3NlcyIgdmFsdWU9IiR7dGFyZ2V0fS9jbGFzc2VzIi8+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNoZWNrLmRlcGVuZGVuY3kiIHVubGVzcz0iZW52LkFYSVMyX0hPTUUiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSJBWElTMl9IT01FIG11c3QgYmUgc2V0Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Imdlbi5zdHViIiBpZj0iZW52LkFYSVMyX0hPTUUiIGRlcGVuZHM9ImNoZWNrLmRlcGVuZGVuY3kiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0YXJnZXR9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7dGFyZ2V0fSIvPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11Ii8+Ci08YXJnIGxpbmU9Ii1hcCIvPgotCi0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7dGFyZ2V0fSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZW52LkFYSVMyX0hPTUV9XGxpYiI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gQ3JlYXRlIHRoZSBzZXJ2aWNlIGFyY2hpdmUgYnkgZXhlY3V0aW5nIHRhcmdldFxidWlsZC54bWwgKGphci5zZXJ2ZXIpIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmNsaWVudCIgaWY9ImVudi5BWElTMl9IT01FIiBkZXBlbmRzPSJnZW4uc3R1YiI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3RhcmdldC5qYXZhfSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxhbnQgZGlyPSIke3RhcmdldH0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt0YXJnZXR9XGJ1aWxkXGxpYlxCYW5rU2VydmljZS10ZXN0LWNsaWVudC5qYXIiIHRvZGlyPSIuLiIvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2NsaWVudC9zcmMvZXhhbXBsZS9CYW5rQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvY2xpZW50L3NyYy9leGFtcGxlL0JhbmtDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNjE2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvY2xpZW50L3NyYy9leGFtcGxlL0JhbmtDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgZXhhbXBsZTsKLQotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEJhbmtDbGllbnQgewotCi0JLyoqCi0JICogSWYgYWNjb3VudCMgPT0gIjEzIiwgdGhlbiB5b3Ugd2lsbCBnZXQgYSBBY2NvdW50Tm90RXhpc3RGYXVsdC4KLQkgKiBvdGhlcndpc2UgaWYgeW91IHByb3ZpZGUgYW4gYW1vdW50ID4gMTAwMCwgeW91IHdpbGwgZ2V0IGEgSW5zdWZmaWNpZW50RnVuZEZhdWx0TWVzc2FnZUV4Y2VwdGlvbiwKLQkgKiBvdGhlcndpc2UgeW91IHdpbGwgZ2V0IGEgcmVzcG9uc2Ugd2l0aCBhIGJhbGFuY2UgZXF1YWwgdG8gMTAwMCAtIGFtb3VudFdpdGhkcmF3bi4gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0JCWlmIChhcmdzLmxlbmd0aCAhPSAzKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBCYW5rQ2xpZW50IC1EdXJsPTx1cmw+IC1EYWNjb3VudD08YWNjb3VudD4gLURhbXQ9PGFtb3VudD4iKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZmluYWwgU3RyaW5nIHVybCA9IGFyZ3NbMF07Ci0JCWZpbmFsIFN0cmluZyBhY2NvdW50ID0gYXJnc1sxXTsKLQkJZmluYWwgSW50ZWdlciB3aXRoZHJhd2FsQW1vdW50ID0gbmV3IEludGVnZXIoYXJnc1syXSk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJXaXRoZHJhd2luZyAiICsgd2l0aGRyYXdhbEFtb3VudCArICIgZG9sbGFycyBmcm9tIGFjY291bnQjIiArIGFjY291bnQpOwotCQkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIEJhbmtTZXJ2aWNlIGJhbmtTZXJ2aWNlID0gbmV3IEJhbmtTZXJ2aWNlU3R1Yih1cmwpOwotICAgICAgICAgICAgZmluYWwgV2l0aGRyYXcgd2l0aGRyYXdSZXF1ZXN0ID0gbmV3IFdpdGhkcmF3KCk7Ci0gICAgICAgICAgICB3aXRoZHJhd1JlcXVlc3Quc2V0QWNjb3VudChhY2NvdW50KTsKLSAgICAgICAgICAgIHdpdGhkcmF3UmVxdWVzdC5zZXRBbW91bnQod2l0aGRyYXdhbEFtb3VudC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgV2l0aGRyYXdSZXNwb25zZSB3aXRoZHJhd1Jlc3BvbnNlID0gYmFua1NlcnZpY2Uud2l0aGRyYXcod2l0aGRyYXdSZXF1ZXN0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmFsYW5jZSA9ICIgKyB3aXRoZHJhd1Jlc3BvbnNlLmdldEJhbGFuY2UoKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlIGUpIHsKLSAgICAgICAgICAgIGZpbmFsIEFjY291bnROb3RFeGlzdEZhdWx0IGZhdWx0ID0gZS5nZXRGYXVsdE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWNjb3VudCMiICsgZmF1bHQuZ2V0QWNjb3VudCgpICsgIiBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9IGNhdGNoIChJbnN1ZmZpY2llbnRGdW5kRmF1bHRNZXNzYWdlIGUpIHsKLSAgICAgICAgICAgIGZpbmFsIEluc3VmZmljaWVudEZ1bmRGYXVsdCBmYXVsdCA9IGUuZ2V0RmF1bHRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjY291bnQjIiArIGZhdWx0LmdldEFjY291bnQoKSArICIgaGFzIGJhbGFuY2Ugb2YgIiArIGZhdWx0LmdldEJhbGFuY2UoKSArICIuIEl0IGNhbm5vdCBzdXBwb3J0IHdpdGhkcmF3YWwgb2YgIiArIGZhdWx0LmdldFJlcXVlc3RlZEZ1bmQoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAgCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAKLSAgICAgICAgfQotCi0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL2RvY3MvRmF1bHRIYW5kbGluZ1NhbXBsZUd1aWRlLmh0bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvZG9jcy9GYXVsdEhhbmRsaW5nU2FtcGxlR3VpZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2NGIxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvZG9jcy9GYXVsdEhhbmRsaW5nU2FtcGxlR3VpZGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiPgotICAgIDx0aXRsZT46OiBFeGNlcHRpb24gSGFuZGxpbmcgdXNpbmcgV1NETCBGYXVsdHMgOjo8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5FeGNlcHRpb24gSGFuZGxpbmcgdXNpbmcgV1NETCBGYXVsdHM8L2gxPgotCi08cD5UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHNwZWNpZnkgYSBXU0RMIGZhdWx0IGluIG9yZGVyIHRvIGFsbG93Ci0gICAgeW91ciBzZXJ2aWNlIHRvIGNvbW11bmljYXRlIGV4Y2VwdGlvbiBwYXRod2F5cyB0byB5b3VyIGNsaWVudHMuPC9wPgotCi08cD5SdW5uaW5nIG9mIHRoaXMgc2FtcGxlIGFzc3VtZXMgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgdGhpcyB3aXRoaW4gdGhlCi0gICAgZXh0cmFjdGVkIHJlbGVhc2UgZm9sZGVyLjwvcD4KLQotPGgyPkNvbnN0cnVjdGluZyB0aGUgU2VydmljZSBhbmQgQ2xpZW50PC9oMj4KLQotPHA+VGhlIGZpcnN0IHN0ZXAgaXMgdG8gZ2VuZXJhdGUgdGhlIHNlcnZpY2Ugc2tlbGV0b24gYW5kIG90aGVyIGludGVyZmFjZQotICAgIGNsYXNzZXMgZnJvbSB0aGUgV1NETC48L3A+Ci0KLTxwPkxvb2sgYXQgPGVtPjxhIGhyZWY9Ii4uL2Jhbmsud3NkbCI+YmFuay53c2RsPC9hPjwvZW0+LiBJdCBkZWZpbmVzIHRoZQotICAgIGludGVyZmFjZSBmb3Igb3VyIHNlcnZpY2UuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgYXJlIHRoZQotICAgIDxzdHJvbmc+QWNjb3VudE5vdEV4aXN0RmF1bHQ8L3N0cm9uZz4gYW5kCi0gICAgPHN0cm9uZz5JbnN1ZmZpY2llbnRGdW5kRmF1bHQ8L3N0cm9uZz4gdHlwZXMgZGVmaW5lZCBpbiB0aGUgd3NkbDp0eXBlcwotICAgIGVsZW1lbnQuPC9wPgotCi08cD5Vc2luZyBhIGNvbW1hbmQgcHJvbXB0LCBnb3QgdG8gdGhlIGZvbGRlciBvZiB0aGlzIGV4YW1wbGUgYW5kIHR5cGUKLSAgICA8c3Ryb25nPmFudCBnZW5lcmF0ZS5zZXJ2aWNlPC9zdHJvbmc+IG9yIGp1c3QgPHN0cm9uZz4gYW50PC9zdHJvbmc+LiBUaGlzCi0gICAgd2lsbDo8L3A+Ci08dWw+Ci0gICAgPGxpPkdlbmVyYXRlIHRoZSBzb3VyY2UgZm9yIGFsbCB0aGUgc2VydmljZSBjbGFzc2VzIGluCi0gICAgICAgIDxlbT5idWlsZC9zZXJ2aWNlL3NyYy9leGFtcGxlPC9lbT48L2xpPgotICAgIDxsaT5HZW5lcmF0ZSA8ZW0+c2VydmljZXMueG1sPC9lbT4gYW5kIGEgbW9yZSBjb21wbGV0ZQotICAgICAgICA8ZW0+QmFua1NlcnZpY2Uud3NkbDwvZW0+IGludG8gdGhlIDxlbT5idWlsZC9zZXJ2aWNlL3Jlc291cmNlczwvZW0+Ci0gICAgICAgIGZvbGRlci48L2xpPgotICAgIDxsaT5HZW5lcmF0ZSBhIDxlbT5idWlsZC9zZXJ2aWNlL2J1aWxkLnhtbDwvZW0+PC9saT4KLSAgICA8bGk+Q29waWVzIHRoZSBwcmUtcG9wdWxhdGVkIHNlcnZpY2Ugc2tlbGV0b24gY2xhc3MgdG8gdGhlIGdlbmVyYXRlZAotICAgICAgICBjb2RlPC9saT4KLSAgICA8bGk+Q29tcGlsZSB0aGUgSmF2YSBjbGFzc2VzIGZvciB0aGUgc2VydmljZTwvbGk+Ci0gICAgPGxpPkNyZWF0ZSB0aGUgc2VydmljZSBhcmNoaXZlIGFuZCBjb3B5IGl0IHRvIEF4aXMyIHJlcG9zaXRvcnkKLSAgICAgICAgKDxlbT5yZXBvc2l0b3J5L3NlcnZpY2VzLzwvZW0+KSBhcyBzYW1wbGUtZmF1bHRoYW5kbGluZy5hYXIuPC9saT4KLTwvdWw+Ci0KLTxwPk9wZW4gdXAgPGVtPnNlcnZpY2Uvc3JjL2V4YW1wbGUvQmFua1NlcnZpY2VTa2VsZXRvbi5qYXZhPC9lbT4gYW5kIHlvdSB3aWxsCi0gICAgc2VlIHRoZSBmb2xsb3dpbmcgY29kZSBmcmFnbWVudCBpbnNpZGUgPHN0cm9uZz4jd2l0aGRyYXc8L3N0cm9uZz4gbWV0aG9kLgotICAgIFdoZW4gPHN0cm9uZz5nZW5lcmF0ZS5zZXJ2aWNlPC9zdHJvbmc+IGhhcyBiZWVuIGV4ZWN1dGVkLCBBeGlzMiBnZW5lcmF0ZXMgYSBza2VsZXRvbiBjbGFzcwotICAgICg8ZW0+YnVpbGQvc2VydmljZS9zcmMvZXhhbXBsZS9CYW5rU2VydmljZVNrZWxldG9uLmphdmE8L2VtPikgd2hpY2ggaGFzIGFuIGVtcHR5IG1ldGhvZC4KLSAgICBXZSByZXBsYWNlIGl0LCB0aGUgZ2VuZWRyYXRlZCBza2VsZXRvbiB3aXRoIGEgcHJlLXBvcHVsYXRlZCBza2VsZXRvbiBjbGFzcwotICAgICg8ZW0+c2VydmljZS9zcmMvZXhhbXBsZS9CYW5rU2VydmljZVNrZWxldG9uLmphdmE8L2VtPikgd2hpY2ggaGFzIHRoZQotICAgIGZvbGxvd2luZyBjb2RlIGluc2lkZSBpdC48L3A+Ci08cHJlPiBmaW5hbCBTdHJpbmcgYWNjb3VudCA9IHBhcmFtMC5nZXRBY2NvdW50KCk7Ci0gICAgaWYgKGFjY291bnQuZXF1YWxzKCIxMyIpKSB7Ci0gICAgZmluYWwgQWNjb3VudE5vdEV4aXN0RmF1bHQgZmF1bHQgPSBuZXcgQWNjb3VudE5vdEV4aXN0RmF1bHQoKTsKLSAgICBmYXVsdC5zZXRBY2NvdW50KGFjY291bnQpOwotICAgIEFjY291bnROb3RFeGlzdEZhdWx0TWVzc2FnZUV4Y2VwdGlvbiBtZXNzYWdlRXhjZXB0aW9uID0gbmV3Ci0gICAgQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlRXhjZXB0aW9uKCJBY2NvdW50IGRvZXMKLSAgICBub3QgZXhpc3QhIik7Ci0gICAgbWVzc2FnZUV4Y2VwdGlvbi5zZXRGYXVsdE1lc3NhZ2UoZmF1bHQpOwotICAgIHRocm93IG1lc3NhZ2VFeGNlcHRpb247Ci0gICAgfQotCi0gICAgZmluYWwgaW50IGFtb3VudCA9IHBhcmFtMC5nZXRBbW91bnQoKTsKLSAgICBpZiAoYW1vdW50ICZndDsgMTAwMCkgewotICAgIGZpbmFsIEluc3VmZmljaWVudEZ1bmRGYXVsdCBmYXVsdCA9IG5ldyBJbnN1ZmZpY2llbnRGdW5kRmF1bHQoKTsKLSAgICBmYXVsdC5zZXRBY2NvdW50KGFjY291bnQpOwotICAgIGZhdWx0LnNldEJhbGFuY2UoMTAwMCk7Ci0gICAgZmF1bHQuc2V0UmVxdWVzdGVkRnVuZChhbW91bnQpOwotICAgIEluc3VmZmljaWVudEZ1bmRGYXVsdE1lc3NhZ2VFeGNlcHRpb24gbWVzc2FnZUV4Y2VwdGlvbiA9IG5ldwotICAgIEluc3VmZmljaWVudEZ1bmRGYXVsdE1lc3NhZ2VFeGNlcHRpb24oIkluc3VmZmljaWVudAotICAgIGZ1bmRzIik7Ci0gICAgbWVzc2FnZUV4Y2VwdGlvbi5zZXRGYXVsdE1lc3NhZ2UoZmF1bHQpOwotICAgIHRocm93IG1lc3NhZ2VFeGNlcHRpb247Ci0gICAgfQotCi0gICAgZmluYWwgV2l0aGRyYXdSZXNwb25zZSByZXNwb25zZSA9IG5ldyBXaXRoZHJhd1Jlc3BvbnNlKCk7Ci0gICAgcmVzcG9uc2Uuc2V0QmFsYW5jZSgxMDAwIC0gYW1vdW50KTsKLSAgICByZXR1cm4gcmVzcG9uc2U7Ci08L3ByZT4KLQotPHA+Tm90ZSB0aGF0IHRoZSBzb3VyY2UgZ2VuZXJhdGVkIGZvciB0aGUgY2xpZW50IHdpbGwgaW5jbHVkZSB0aGUgMiBmYXVsdHMKLSAgICBhbmQgdGhlIGxvY2FsIEV4Y2VwdGlvbnMgdGhyb3VnaCB3aGljaCB0aGV5IHdpbGwgYmUgdHJhbnNtaXR0ZWQuIEFsc28gbm90ZQotICAgIHRoYXQgdGhlIEV4Y2VwdGlvbnMgYXJlIGdlbmVyYXRlZCB3aXRoaW4gdGhlIDxlbT5CYW5rU3R1YjwvZW0+IGNsYXNzLjwvcD4KLQotPGgyPkRlcGxveWluZyB0aGUgU2VydmljZTwvaDI+Ci0KLTxwPlRoZSBhYm92ZSBzdGVwIG11c3QgaGF2ZSBhbHJlYWR5IGNvcGllZCB5b3VyIEJhbmtTZXJ2aWNlLmFhciBmaWxlIGluIHRvCi0gICAgPGVtPnJlcG9zaXRvcnkvc2VydmljZXMvPC9lbT4gZm9sZGVyLiBUaGVuIGdvIHRvIDxlbT5iaW48L2VtPiBmb2xkZXIgYW5kIHJ1bgotICAgIGVpdGhlciBvZiBheGlzMnNlcnZlci5iYXQgb3IgYXhpczJzZXJ2ZXIuc2gsIGRlcGVuZGluZyBvbiB5b3VyIHBsYXRmb3JtIGluCi0gICAgb3JkZXIgdG8gc3RhcnR1cCBBeGlzMiBzZXJ2ZXIuPC9wPgotCi08cD5XaXRoIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGlmIHlvdSBnbyB0byA8YQotICAgICAgICBocmVmPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvIj4gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyLzwvYT4geW91Ci0gICAgc2hvdWxkIHNlZSA8ZW0+QmFua1NlcnZpY2U8L2VtPiB3YXMgZGVwbG95ZWQuPC9wPgotCi08aDI+UnVubmluZyB0aGUgQ2xpZW50PC9oMj4KLQotPHA+SW52b2tlIHRoZSA8ZW0+Y2xpZW50L3NyYy9leGFtcGxlL0JhbmtDbGllbnQ8L2VtPi5qYXZhIGNsYXNzLiBZb3UgbWF5IHVzZQotICAgIHRoZSBjb21tYW5kIHNjcmlwdHMgdG8gZG8gc28uIFlvdSBuZWVkIHRvIHN1cHBseSAzIHBhcmFtZXRlcnMgdG8gdGhlIGNvbW1hbmQtCi0gICAgdXJsLCBhY2NvdW50IGFuZCBhbW91bnQuPC9wPgotPHVsPgotICAgIDxsaT48c3Ryb25nPmFudCBydW4uY2xpZW50Ci0gICAgICAgIC1EdXJsPWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9CYW5rU2VydmljZSAtRGFjY291bnQ9MTMKLSAgICAgICAgLURhbXQ9NDAwPC9zdHJvbmc+PGJyPgotICAgICAgICBUaHJvd3MgQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlRXhjZXB0aW9uLiBZb3Ugd2lsbCBzZWUgIkFjY291bnQjMTMKLSAgICAgICAgZG9lcyBub3QgZXhpc3QiPC9saT4KLSAgICA8bGk+PHN0cm9uZz5hbnQgcnVuLmNsaWVudAotICAgICAgICAtRHVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQmFua1NlcnZpY2UgLURhY2NvdW50PTg4Ci0gICAgICAgIC1EYW10PTEyMDA8L3N0cm9uZz48YnI+Ci0gICAgICAgIFRocm93cyBJbnN1ZmZpY2llbnRGdW5kc0ZhdWx0TWVzc2FnZUV4Y2VwdGlvbi4gWW91IHdpbGwgc2VlICJBY2NvdW50Izg4Ci0gICAgICAgIGhhcyBiYWxhbmNlIG9mIDEwMDAuIEl0IGNhbm5vdCBzdXBwb3J0IHdpdGhkcmF3YWwgb2YgMTIwMCI8YnI+Ci0gPC9saT4KLSAgICA8bGk+PHN0cm9uZz5hbnQgcnVuLmNsaWVudAotICAgICAgICAtRHVybD1odHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQmFua1NlcnZpY2UgLURhY2NvdW50PTg4Ci0gICAgICAgIC1EYW10PTQwMDwvc3Ryb25nPjxicj4KLSAgICAgICAgU3VjY2VlZHMgd2l0aCBhIGJhbGFuY2Ugb2YgNjAwLiBZb3Ugd2lsbCBzZWUgIkJhbGFuY2UgPSA2MDAiPC9saT4KLTwvdWw+Ci1XaGVuIHlvdSBjYWxsIGFudCBydW4uY2xpZW50IHdpdGggcGFyYW1ldGVycywgYmVmb3JlIHJ1bm5pbmcKLTxlbT5jbGllbnQvc3JjL2V4YW1wbGUvQmFua0NsaWVudC5qYXZhPC9lbT4gY2xhc3MsIGl0IGRvZXMgdGhlIGZvbGxvd2luZyBhcwotd2VsbDoKLTx1bD4KLSAgICA8bGk+R2VuZXJhdGUgdGhlIHN0dWJzIChmb3IgdGhlIGNsaWVudCkgZnJvbSB0aGUgV1NETDwvbGk+Ci0gICAgPGxpPkNvbXBpbGUgdGhlIGNsaWVudCBjbGFzc2VzPC9saT4KLSAgICA8bGk+Q3JlYXRlIGEgSmFyIG9mIHRoZSBjbGllbnQgY2xhc3NlcyBhbmQgY29weSBpdCB0bwotICAgICAgICA8ZW0+YnVpbGQvY2xpZW50L0JhbmtTZXJ2aWNlLXRlc3QtY2xpZW50LmphcjwvZW0+PC9saT4KLTwvdWw+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvc2VydmljZS9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2ZhdWx0aGFuZGxpbmcvc2VydmljZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDk4MmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL3NlcnZpY2UvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW4uc2tlbGV0b24iPgotCQotCTxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9InByb2plY3QuYmFzZS5kaXIiIHZhbHVlPSIuIi8+Ci0JPHByb3BlcnR5IG5hbWU9InBhcmVudC5kaXIiIHZhbHVlPSIuLiIvPgotCQotCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9IiR7cGFyZW50LmRpcn0vYmFuay53c2RsIi8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9InNyYyIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vc3JjIi8+Ci0JPHByb3BlcnR5IG5hbWU9InRhcmdldCIgdmFsdWU9IiR7cHJvamVjdC5iYXNlLmRpcn0vdGFyZ2V0Ii8+Ci0JCi0JPHRhcmdldCBuYW1lPSJjaGVjay5kZXBlbmRlbmN5IiB1bmxlc3M9ImVudi5BWElTMl9IT01FIj4KLQkJPGVjaG8gbWVzc2FnZT0iQVhJUzJfSE9NRSBtdXN0IGJlIHNldCIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZ2VuLnNrZWxldG9uIiBpZj0iZW52LkFYSVMyX0hPTUUiIGRlcGVuZHM9ImNoZWNrLmRlcGVuZGVuY3kiPgotCi0KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGFyZ2V0fSIvPgotCQk8bWtkaXIgZGlyPSIke3RhcmdldH0iLz4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIj4KLQkJCTxhcmcgbGluZT0iLXVyaSAke3dzZGwudXJpfSIvPgotCQkJPGFyZyBsaW5lPSItc3MiLz4KLQkJCTxhcmcgbGluZT0iLXNkIi8+Ci0JCQk8YXJnIGxpbmU9Ii1vICR7dGFyZ2V0fSIvPiA8IS0tIE91dHB1dCBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgZmlsZXMgLS0+IDwhLS0gTkIgaXQgZ2VuZXJhdGVzIHRvIHRoZSBzcmMgZm9sZGVyIHVuZGVyIHRoaXMgZGlyZWN0b3J5ISEgLS0+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxmaWxlc2V0IGRpcj0iJHtlbnYuQVhJUzJfSE9NRX1cbGliIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBzZXJ2aWNlIGFyY2hpdmUgYnkgZXhlY3V0aW5nIHRhcmdldFxidWlsZC54bWwgKGphci5zZXJ2ZXIpIC0tPgotCTx0YXJnZXQgbmFtZT0iamFyLnNlcnZlciIgaWY9ImVudi5BWElTMl9IT01FIj4KLQkJPGFudCBkaXI9IiR7dGFyZ2V0fSIvPgotCQk8Y29weSBmaWxlPSIke3RhcmdldH1cYnVpbGRcbGliXEJhbmtTZXJ2aWNlLmFhciIgdG9kaXI9Ii4uIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL3NlcnZpY2Uvc3JjL2V4YW1wbGUvQmFua1NlcnZpY2VTa2VsZXRvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9mYXVsdGhhbmRsaW5nL3NlcnZpY2Uvc3JjL2V4YW1wbGUvQmFua1NlcnZpY2VTa2VsZXRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTE1YTQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZmF1bHRoYW5kbGluZy9zZXJ2aWNlL3NyYy9leGFtcGxlL0JhbmtTZXJ2aWNlU2tlbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLQotICAgIC8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSAgICAvKioKLSAgICAgKiBCYW5rU2VydmljZVNrZWxldG9uLmphdmEKLSAgICAgKgotICAgICAqLwotICAgIHBhY2thZ2UgZXhhbXBsZTsKLSAgICAvKioKLSAgICAgKiAgQmFua1NlcnZpY2VTa2VsZXRvbiBqYXZhIHNrZWxldG9uIGZvciB0aGUgYXhpc1NlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgQmFua1NlcnZpY2VTa2VsZXRvbnsKLQotCi0gICAgICAgIC8qKgotCi0gICAgICAgICAgKiBAcGFyYW0gcGFyYW0wCi0KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyAgZXhhbXBsZS5XaXRoZHJhd1Jlc3BvbnNlIHdpdGhkcmF3KGV4YW1wbGUuV2l0aGRyYXcgcGFyYW0wKQotICAgICAgICAgICB0aHJvd3MgSW5zdWZmaWNpZW50RnVuZEZhdWx0TWVzc2FnZSxBY2NvdW50Tm90RXhpc3RGYXVsdE1lc3NhZ2V7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjY291bnQgPSBwYXJhbTAuZ2V0QWNjb3VudCgpOwotICAgICAgICBpZiAoYWNjb3VudC5lcXVhbHMoIjEzIikpIHsKLSAgICAgICAgICAgIGZpbmFsIEFjY291bnROb3RFeGlzdEZhdWx0IGZhdWx0ID0gbmV3IEFjY291bnROb3RFeGlzdEZhdWx0KCk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRBY2NvdW50KGFjY291bnQpOwotICAgICAgICAgICAgQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlIG1lc3NhZ2VFeGNlcHRpb24gPSBuZXcgQWNjb3VudE5vdEV4aXN0RmF1bHRNZXNzYWdlKCJBY2NvdW50IGRvZXMgbm90IGV4aXN0ISIpOwotICAgICAgICAgICAgbWVzc2FnZUV4Y2VwdGlvbi5zZXRGYXVsdE1lc3NhZ2UoZmF1bHQpOwotICAgICAgICAgICAgdGhyb3cgbWVzc2FnZUV4Y2VwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBhbW91bnQgPSBwYXJhbTAuZ2V0QW1vdW50KCk7Ci0gICAgICAgIGlmIChhbW91bnQgPiAxMDAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnN1ZmZpY2llbnRGdW5kRmF1bHQgZmF1bHQgPSBuZXcgSW5zdWZmaWNpZW50RnVuZEZhdWx0KCk7Ci0gICAgICAgICAgICBmYXVsdC5zZXRBY2NvdW50KGFjY291bnQpOwotICAgICAgICAgICAgZmF1bHQuc2V0QmFsYW5jZSgxMDAwKTsKLSAgICAgICAgICAgIGZhdWx0LnNldFJlcXVlc3RlZEZ1bmQoYW1vdW50KTsKLSAgICAgICAgICAgIEluc3VmZmljaWVudEZ1bmRGYXVsdE1lc3NhZ2UgbWVzc2FnZUV4Y2VwdGlvbiA9IG5ldyBJbnN1ZmZpY2llbnRGdW5kRmF1bHRNZXNzYWdlKCJJbnN1ZmZpY2llbnQgZnVuZHMiKTsKLSAgICAgICAgICAgIG1lc3NhZ2VFeGNlcHRpb24uc2V0RmF1bHRNZXNzYWdlKGZhdWx0KTsKLSAgICAgICAgICAgIHRocm93IG1lc3NhZ2VFeGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBXaXRoZHJhd1Jlc3BvbnNlIHJlc3BvbnNlID0gbmV3IFdpdGhkcmF3UmVzcG9uc2UoKTsKLSAgICAgICAgcmVzcG9uc2Uuc2V0QmFsYW5jZSgxMDAwIC0gYW1vdW50KTsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDc2M2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1TYW1wbGU6IEdvb2dsZSBTcGVsbCBDaGVja2VyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYXN5bmNocm9ub3VzIFdlYiBtZXRob2QgaW52b2NhdGlvbnMuIFRoZSB1c2VyIGNhbiBjb250aW51ZSB0byB0eXBlIA0KLXRleHQgb24gdGhlIHRleHQgZWRpdG9yIHdoZXJlIHRoZSB0ZXh0IGVkaXRvciBkb2VzIHRoZSBzcGVsbCBjaGVjayBmcm9tIGEgaG9zdGVkIFdlYiBzZXJ2aWNlLiBUaGUgV2ViIA0KLW1ldGhvZCBpbnZvY2F0aW9uIGlzIGNhcnJpZWQgb3V0IGluIGFuIGFzeW5jaHJvbm91cyBtYW5uZXIgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY29udGludW91c2x5IHR5cGUgdGV4dCANCi13aXRob3V0IGhhdmluZyB0byBzdGFsbCBmb3IgdGhlIHJlc3BvbnNlLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotDQotUnVubmluZyBUaGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09DQotDQotVG8gZ2VuZXJhdGUgc3R1YnMgYW5kIHJ1biB0aGUgdGV4dCBlZGl0b3IsIHR5cGUgYW50Lg0KLQ0KLU5vdGUgdGhhdCB3aGVuIHJ1bm5pbmcgdGhlIGJ1aWxkIHNjcmlwdCwgYSBzdHViIGlzIGdlbmVyYXRlZCBmb3IgdGhlIGhvc3RlZCBzcGVsbCBjaGVjayBzZXJ2aWNlIGF0Og0KLWh0dHA6Ly90b29scy53c28yLm5ldDoxMjAwMS9heGlzMi9zZXJ2aWNlcy9TaW1wbGlmaWVkU3BlbGxDaGVjaz93c2RsDQotDQotTi5CLjogVGhpcyBwdWJsaWMgV2ViIHNlcnZpY2UgdXNlcyBHb29nbGUgV2ViIEFQSXMgdG8gcHJvdmlkZSBzcGVsbCBjaGVjayBzZXJ2aWNlLiBJbiBjYXNlIG9mIGENCi1mYWlsdXJlIFNpbXBsaWZpZWRTcGVsbENoZWNrIGVjaG8gc2VuZHMgYmFjayB0aGUgcGhyYXNlIChzZW50IGZvciBzcGVsbCBjaGVjaykgaW5zdGVhZCBvZiB0aHJvd2luZw0KLWFuIGVycm9yLiBUaGVyZWZvcmUsIGlmIHRoZSBzcGVsbCBjaGVjayBlZGl0b3IganVzdCBvdXRwdXRzIHRoZSBpbnB1dCB3b3Jkcy9waHJhc2UsIHRoYXQgaXMgYmVjYXVzZQ0KLW9mIHRoaXMgYmVoYXZpb3Igb2YgdGhlIFNpbXBsaWZpZWRTcGVsbENoZWNrIHNlcnZpY2UuDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlYWM5NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iZ29vZ2xlc3BlbGxjaGVjayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0icnVuLmNsaWVudCI+Ci0JCi0JPHByb3BlcnR5IG5hbWU9IndzZGwiIHZhbHVlPSJodHRwOi8vdG9vbHMud3NvMi5uZXQ6MTIwMDEvYXhpczIvc2VydmljZXMvU2ltcGxpZmllZFNwZWxsQ2hlY2s/d3NkbCIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJidWlsZCIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIuY2xhc3NlcyIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2NsYXNzZXMiIC8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmxpYiIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2xpYiIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQkKLQk8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JCTxmaWxlc2V0IGRpcj0iJHtkZXN0LmRpci5saWJ9IiBpbmNsdWRlcz0iKi5qYXIiIC8+Ci0JPC9wYXRoPgotCQotCTxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCTwvcGF0aD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJCi0JCTxkZWxldGUgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQkJCi0JCTxkZWxldGUgZGlyPSJzcmMiIGluY2x1ZGVzPSJzYW1wbGUvc3BlbGxjaGVjay9zdHViLyoqIi8+Ci0JCi0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KLQkJCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9IiAvPgotCQkKLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgLz4KLQkJCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXIubGlifSIgLz4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNsZWFuLHByZXBhcmUiPgotCQotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsaWVudC5jb2RlZ2VuLXN0dWIiPgotCQkJPHBhcmFtIG5hbWU9IndzZGwiIHZhbHVlPSIke3dzZGx9Ii8+Ci0JCTwvYW50Y2FsbD4KLQkJCi0JCTxhbnRjYWxsIHRhcmdldD0iY2xpZW50LmNvbXBpbGUiIC8+Ci0JCQotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsaWVudC5qYXIiIC8+Ci0JCQotCQk8YW50Y2FsbCB0YXJnZXQ9ImNsaWVudC5ydW4iIC8+CQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xpZW50LmNvZGVnZW4tc3R1YiI+Ci0JCi0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSI+Ci0JCQk8YXJnIHZhbHVlPSItdXJpIiAvPgotCQkJPGFyZyB2YWx1ZT0iJHt3c2RsfSIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1wIiAvPgotCQkJPGFyZyB2YWx1ZT0ic2FtcGxlLnNwZWxsY2hlY2suc3R1YiIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1vIiAvPgotCQkJPGFyZyB2YWx1ZT0ic3JjIiAvPgotCQkJPGFyZyB2YWx1ZT0iLWYiLz4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiIC8+Ci0JCTwvamF2YT4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsaWVudC5jb21waWxlIj4KLQkJCi0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmFjPgotCQotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xpZW50LmphciI+Ci0JCQotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyLmxpYn0vZWRpdG9yLmphciIgLz4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImNsaWVudC5ydW4iPgotCQotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5zcGVsbGNoZWNrLmVkaXRvci5TdWdnZXN0aW9uRm9ybSIgZm9yaz0idHJ1ZSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhPgotCQkKLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL0FzeW5jUGFuZWwuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL0FzeW5jUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjMDUxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9Bc3luY1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc3BlbGxjaGVjay5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5HcmlkQmFnQ29uc3RyYWludHM7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0QXJlYTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotCi0vKioKLSAqIGNsYXNzIHNhbXBsZS5nb29nbGUuc3BlbGxjaGVjay5Bc3luY1BhbmVsCi0gKiBUaGlzIEltcGVtZW50cyBpdHMgb3duIEdVSSBvZiB0aGUgQXN5bmNocm9ub3VzIENsaWVudCBhbmQgaXQgdXBkYXRlcyB0aGUgc3RyaW5nIGFmdGVyIGdldHRpbmcgdGhlIHJlc3BvbnNlIHRvIHRleHRhcmVhCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY1BhbmVsIGV4dGVuZHMgamF2YXguc3dpbmcuSlBhbmVsIGltcGxlbWVudHMgT2JzZXJ2ZXIsCi0gICAgICAgIEtleUxpc3RlbmVyIHsKLSAgICBGb3JtTW9kZWwgZm9ybU1vZGVsOwotICAgIEpUZXh0QXJlYSB3cml0aW5nVGV4dEFyZWE7Ci0gICAgSlRleHRBcmVhIGRpc3BsYXlUZXh0QXJlYTsKLSAgICBKVGV4dEZpZWxkIGVycm9yTWVzc2FnZUZpZWxkOwotCi0gICAgcHVibGljIEFzeW5jUGFuZWwoKSB7Ci0gICAgICAgIEdyaWRCYWdMYXlvdXQgZ2JMYXlvdXQgPSBuZXcgR3JpZEJhZ0xheW91dCgpOwotICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgY29uc3RyYWludCA9IG5ldyBHcmlkQmFnQ29uc3RyYWludHMoKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQoZ2JMYXlvdXQpOwotCi0gICAgICAgIGZvcm1Nb2RlbCA9IG5ldyBGb3JtTW9kZWwodGhpcyk7Ci0KLSAgICAgICAgd3JpdGluZ1RleHRBcmVhID0gbmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0KLSAgICAgICAgZGlzcGxheVRleHRBcmVhID0gbmV3IEpUZXh0QXJlYSgpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0KLSAgICAgICAgZXJyb3JNZXNzYWdlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBlcnJvck1lc3NhZ2VGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEJhY2tncm91bmQoQ29sb3IuTElHSFRfR1JBWSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEZvcmVncm91bmQoQ29sb3IuUkVEKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lR2V0ID0gbmV3IEpTY3JvbGxQYW5lKHdyaXRpbmdUZXh0QXJlYSk7Ci0gICAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmVTZXQgPSBuZXcgSlNjcm9sbFBhbmUoZGlzcGxheVRleHRBcmVhKTsKLQotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0VGV4dCgiRW50ZXIgYSBTdHJpbmciKTsKLSAgICAgICAgd3JpdGluZ1RleHRBcmVhLmFkZEtleUxpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIGNvbnN0cmFpbnQuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIOwotICAgICAgICBjb25zdHJhaW50LmdyaWR4ID0gMDsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR4ID0gMTsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR5ID0gODsKLSAgICAgICAgZ2JMYXlvdXQuc2V0Q29uc3RyYWludHMoc2Nyb2xsUGFuZUdldCwgY29uc3RyYWludCk7Ci0gICAgICAgIHRoaXMuYWRkKHNjcm9sbFBhbmVHZXQpOwotICAgICAgICBnYkxheW91dC5zZXRDb25zdHJhaW50cyhzY3JvbGxQYW5lU2V0LCBjb25zdHJhaW50KTsKLSAgICAgICAgdGhpcy5hZGQoc2Nyb2xsUGFuZVNldCk7Ci0gICAgICAgIGNvbnN0cmFpbnQud2VpZ2h0eSA9IDE7Ci0gICAgICAgIGdiTGF5b3V0LnNldENvbnN0cmFpbnRzKGVycm9yTWVzc2FnZUZpZWxkLCBjb25zdHJhaW50KTsKLSAgICAgICAgdGhpcy5hZGQoZXJyb3JNZXNzYWdlRmllbGQpOwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZGlzcGxheVRleHRBcmVhLnNldFRleHQoZGlzcGxheVRleHRBcmVhLmdldFRleHQoKSArICIgIiArIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8vdXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgZXJyb3IgbWVzc2FnZSBkaXNwbGF5IGFyZWEKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBlcnJvck1lc3NhZ2VGaWVsZC5zZXRUZXh0KG1lc3NhZ2UpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgIGludCBrZXkgPSBlLmdldEtleUNoYXIoKTsKLSAgICAgICAgaWYgKChrZXkgPT0gS2V5RXZlbnQuVktfU1BBQ0UpIHx8IChrZXkgPT0gS2V5RXZlbnQuVktfRU5URVIpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSB3b3JkcyA9IHdyaXRpbmdUZXh0QXJlYS5nZXRUZXh0KCkuc3BsaXQoIlxccyIpOwotICAgICAgICAgICAgaWYgKHdvcmRzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgZm9ybU1vZGVsLmRvQXN5bmNTcGVsbGluZ1N1Z2dlc3Rpb24od29yZHNbd29yZHMubGVuZ3RoIC0gMV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGtleVR5cGVkKEtleUV2ZW50IGUpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgZGlzcGxheVRleHRBcmVhLnNldFRleHQoIiIpOwotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldFRleHQoIiIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL0Zvcm1Nb2RlbC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvRm9ybU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmExN2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvRm9ybU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5zcGVsbGNoZWNrLmVkaXRvcjsKLQotaW1wb3J0IHNhbXBsZS5zcGVsbGNoZWNrLnN0dWIuU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViOwotaW1wb3J0IHNhbXBsZS5zcGVsbGNoZWNrLnN0dWIuU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViLkRvU3BlbGxpbmdTdWdnZXN0aW9uczsKLWltcG9ydCBzYW1wbGUuc3BlbGxjaGVjay5zdHViLlNpbXBsaWZpZWRTcGVsbENoZWNrU3R1Yi5Eb1NwZWxsaW5nU3VnZ2VzdGlvbnNSZXNwb25zZTsKLQotLyoqCi0gKiBjbGFzcyBzYW1wbGUuZ29vZ2xlLnNwZWxsY2hlY2suRm9ybU1vZGVsCi0gKiBUaGlzIGlzIHRoZSBJbXBlbWVudGF0aW9uIG9mIHRoZSBBc3luY2hyb25vdXMgQ2xpZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBGb3JtTW9kZWwgewotICAgIE9ic2VydmVyIG9ic2VydmVyOwotICAgCi0gICAgcHVibGljIEZvcm1Nb2RlbChPYnNlcnZlciBvYnNlcnZlcikgewotICAgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9Bc3luY1NwZWxsaW5nU3VnZ2VzdGlvbihTdHJpbmcgd29yZCkgewotICAgICAgICAgICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNpbXBsaWZpZWRTcGVsbENoZWNrU3R1YiBzdHViID0gbmV3IFNpbXBsaWZpZWRTcGVsbENoZWNrU3R1YigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBEb1NwZWxsaW5nU3VnZ2VzdGlvbnMgZG9TcGVsbGluZ1N1Z2dlc3Rpb25zID0gbmV3IERvU3BlbGxpbmdTdWdnZXN0aW9ucygpOwotICAgICAgICAgICAgZG9TcGVsbGluZ1N1Z2dlc3Rpb25zLnNldFBocmFzZSh3b3JkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2ltcGxpZmllZFNwZWxsQ2hlY2tDYWxsYmFja0hhbmRsZXJJbXBsIGNhbGxiYWNrSGFuZGxlckltcGwgPSBuZXcgU2ltcGxpZmllZFNwZWxsQ2hlY2tDYWxsYmFja0hhbmRsZXJJbXBsKG9ic2VydmVyLCB3b3JkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3R1Yi5zdGFydGRvU3BlbGxpbmdTdWdnZXN0aW9ucyhkb1NwZWxsaW5nU3VnZ2VzdGlvbnMsIGNhbGxiYWNrSGFuZGxlckltcGwpOwotICAgICAgICAKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBvYnNlcnZlci51cGRhdGVFcnJvcihleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZG9TeW5jU3BlbGxpbmdTdWdnZXN0aW9uKFN0cmluZyB3b3JkKSB7Ci0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViIHN0dWIgPSBuZXcgU2ltcGxpZmllZFNwZWxsQ2hlY2tTdHViKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIERvU3BlbGxpbmdTdWdnZXN0aW9ucyBzdWdnZXN0aW9ucyA9IG5ldyBEb1NwZWxsaW5nU3VnZ2VzdGlvbnMoKTsKLSAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnNldFBocmFzZSh3b3JkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRG9TcGVsbGluZ1N1Z2dlc3Rpb25zUmVzcG9uc2UgcmVzcG9uc2UgPSBzdHViLmRvU3BlbGxpbmdTdWdnZXN0aW9ucyhzdWdnZXN0aW9ucyk7Ci0gICAgICAgICAgICBTdHJpbmcgc3VnZ2VzdGlvbiA9IHJlc3BvbnNlLmdldF9yZXR1cm4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZSgiTm8gc3VnZ2VzdGlvbnMgZm91bmQgZm9yICIgKyB3b3JkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZShzdWdnZXN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZUVycm9yKGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9PYnNlcnZlci5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiODNjNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9PYnNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc3BlbGxjaGVjay5lZGl0b3I7Ci0KLQotLyoqCi0gKiBpbnRlcmZhY2Ugc2FtcGxlLmdvb2dsZS5zcGVsbGNoZWNrLk9ic2VydmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JzZXJ2ZXIgewotICAgIC8vIHVwZGF0ZXMgdGhlIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGVzdCBkaXNwbGF5IGFyZWEKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIG1lc3NhZ2UpOwotCi0gICAgLy91cGRhdGVzIHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSBlcnJvciBtZXNzYWdlIGRpc3BsYXkgYXJlYQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yKFN0cmluZyBtZXNzYWdlKTsKLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TaW1wbGlmaWVkU3BlbGxDaGVja0NhbGxiYWNrSGFuZGxlckltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1NpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjcyNTdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1NpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNwZWxsY2hlY2suZWRpdG9yOwotCi1pbXBvcnQgc2FtcGxlLnNwZWxsY2hlY2suc3R1Yi5TaW1wbGlmaWVkU3BlbGxDaGVja0NhbGxiYWNrSGFuZGxlcjsKLWltcG9ydCBzYW1wbGUuc3BlbGxjaGVjay5zdHViLlNpbXBsaWZpZWRTcGVsbENoZWNrU3R1Yi5Eb1NwZWxsaW5nU3VnZ2VzdGlvbnNSZXNwb25zZTsKLQotcHVibGljIGNsYXNzIFNpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbCBleHRlbmRzIFNpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHBocmFzZSA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIFNpbXBsaWZpZWRTcGVsbENoZWNrQ2FsbGJhY2tIYW5kbGVySW1wbChPYnNlcnZlciBvYnNlcnZlciwgU3RyaW5nIHBocmFzZSkgewotICAgICAgICB0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXI7Ci0gICAgICAgIHRoaXMucGhyYXNlID0gcGhyYXNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWNlaXZlUmVzdWx0ZG9TcGVsbGluZ1N1Z2dlc3Rpb25zKERvU3BlbGxpbmdTdWdnZXN0aW9uc1Jlc3BvbnNlIHBhcmFtMSkgewotICAgICAgICBTdHJpbmcgc3VnZ2VzdGlvbiA9IHBhcmFtMS5nZXRfcmV0dXJuKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoc3VnZ2VzdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvYnNlcnZlci51cGRhdGUocGhyYXNlKTsKLSAgICAgICAgICAgIG9ic2VydmVyLnVwZGF0ZUVycm9yKAotICAgICAgICAgICAgICAgICAgICAiTm8gc3VnZ2VzdGlvbnMgZm91bmQgZm9yICIgKyBwaHJhc2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JzZXJ2ZXIudXBkYXRlKHN1Z2dlc3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZUVycm9yZG9TcGVsbGluZ1N1Z2dlc3Rpb25zKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIG9ic2VydmVyLnVwZGF0ZUVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9ICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1N1Z2dlc3Rpb25Gb3JtLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TdWdnZXN0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTlkZTE2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvZ29vZ2xlc3BlbGxjaGVjay9zcmMvc2FtcGxlL3NwZWxsY2hlY2svZWRpdG9yL1N1Z2dlc3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuc3BlbGxjaGVjay5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29udGFpbmVyOwotaW1wb3J0IGphdmEuYXd0LkRpbWVuc2lvbjsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkhlYWRsZXNzRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0LlRvb2xraXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KRWRpdG9yUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnVCYXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk1lbnVJdGVtOwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rTGlzdGVuZXI7Ci0KLS8qKgotICogY2xhc3Mgc2FtcGxlLmdvb2dsZS5zcGVsbGNoZWNrLlN1Z2dlc3Rpb25Gb3JtCi0gKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgR1VJCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWdnZXN0aW9uRm9ybSBleHRlbmRzIGphdmF4LnN3aW5nLkpGcmFtZSBpbXBsZW1lbnRzIEh5cGVybGlua0xpc3RlbmVyIHsKLSAgICBwcml2YXRlIEFzeW5jUGFuZWwgYXN5bmNQYW5lbDsKLSAgICBwcml2YXRlIFN5bmNQYW5lbCBzeW5jUGFuZWw7Ci0gICAgcHJpdmF0ZSBKRWRpdG9yUGFuZSBoZWxwRGlzcGxheVBhbmU7Ci0KLSAgICBwcml2YXRlIEpNZW51SXRlbSBzeW5jTWVudUl0ZW07Ci0gICAgcHJpdmF0ZSBKTWVudUl0ZW0gYXN5bmNNZW51SXRlbTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9GSUxFX05BTUUgPSAiL2RvY3MvR29vZ2xlU3BlbGxDaGVjay5odG1sIjsKLQotCi0gICAgcHVibGljIFN1Z2dlc3Rpb25Gb3JtKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgYXN5bmNQYW5lbCA9IG5ldyBBc3luY1BhbmVsKCk7Ci0gICAgICAgIHN5bmNQYW5lbCA9IG5ldyBTeW5jUGFuZWwoKTsKLQotICAgICAgICBKTWVudUJhciBtZW51QmFyOwotICAgICAgICAvL0NyZWF0ZSB0aGUgbWVudSBiYXIuCi0gICAgICAgIG1lbnVCYXIgPSBuZXcgSk1lbnVCYXIoKTsKLQotICAgICAgICBKTWVudSBtb2RlTWVudSA9IG5ldyBKTWVudSgiTW9kZSIpOwotICAgICAgICBtb2RlTWVudS5zZXRNbmVtb25pYyhLZXlFdmVudC5WS19NKTsKLSAgICAgICAgc3luY01lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiU3luYyBNb2RlIiwgS2V5RXZlbnQuVktfUyk7Ci0gICAgICAgIHN5bmNNZW51SXRlbS5zZXRBY2NlbGVyYXRvcigKLSAgICAgICAgICAgICAgICBLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKEtleUV2ZW50LlZLX1MsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOwotICAgICAgICBzeW5jTWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRTeW5jUGFuZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGFzeW5jTWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJBU3luYyBNb2RlIiwgS2V5RXZlbnQuVktfQSk7Ci0gICAgICAgIGFzeW5jTWVudUl0ZW0uc2V0QWNjZWxlcmF0b3IoCi0gICAgICAgICAgICAgICAgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19BLCBBY3Rpb25FdmVudC5DVFJMX01BU0spKTsKLSAgICAgICAgYXN5bmNNZW51SXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldEFzeW5jUGFuZWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1vZGVNZW51LmFkZChzeW5jTWVudUl0ZW0pOwotICAgICAgICBtb2RlTWVudS5hZGQoYXN5bmNNZW51SXRlbSk7Ci0KLSAgICAgICAgSk1lbnUgY2xlYXJNZW51ID0gbmV3IEpNZW51KCJDbGVhciIpOwotICAgICAgICBjbGVhck1lbnUuc2V0TW5lbW9uaWMoS2V5RXZlbnQuVktfQyk7Ci0gICAgICAgIEpNZW51SXRlbSBjbGVhck1lbnVJdGVtID0gbmV3IEpNZW51SXRlbSgiQ2xlYXIgdGV4dCBib3hlcyIpOwotICAgICAgICBjbGVhck1lbnVJdGVtLnNldEFjY2VsZXJhdG9yKAotICAgICAgICAgICAgICAgIEtleVN0cm9rZS5nZXRLZXlTdHJva2UoS2V5RXZlbnQuVktfQywgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7Ci0gICAgICAgIGNsZWFyTWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBhc3luY1BhbmVsLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgc3luY1BhbmVsLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjbGVhck1lbnUuYWRkKGNsZWFyTWVudUl0ZW0pOwotCi0gICAgICAgIEpNZW51IGhlbHBNZW51ID0gbmV3IEpNZW51KCJIZWxwIik7Ci0gICAgICAgIEpNZW51SXRlbSBtbnVJdGVtSGVscCA9IG5ldyBKTWVudUl0ZW0oIlNob3cgSGVscCIpOwotICAgICAgICBoZWxwTWVudS5hZGQobW51SXRlbUhlbHApOwotCi0gICAgICAgIG1udUl0ZW1IZWxwLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2hvd0hlbHAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgbWVudUJhci5hZGQobW9kZU1lbnUpOwotICAgICAgICBtZW51QmFyLmFkZChjbGVhck1lbnUpOwotICAgICAgICBtZW51QmFyLmFkZChoZWxwTWVudSk7Ci0KLSAgICAgICAgdGhpcy5zZXRKTWVudUJhcihtZW51QmFyKTsKLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIDEpKTsKLSAgICAgICAgc2V0QXN5bmNQYW5lbCgpOwotCi0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN1Z2dlc3Rpb25Gb3JtIGZvcm0gPSBuZXcgU3VnZ2VzdGlvbkZvcm0oKTsKLSAgICAgICAgRGltZW5zaW9uIHNjcmVlblNpemUgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpOwotICAgICAgICBmb3JtLnNldExvY2F0aW9uKHNjcmVlblNpemUud2lkdGggLyA0LAotICAgICAgICAgICAgICAgIHNjcmVlblNpemUuaGVpZ2h0IC8gNCk7Ci0gICAgICAgIGZvcm0uc2V0U2l6ZShzY3JlZW5TaXplLndpZHRoIC8gMiwgc2NyZWVuU2l6ZS5oZWlnaHQgLyAyKTsKLSAgICAgICAgZm9ybS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpOwotICAgICAgICAvL2Zvcm0uc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgLy9mb3JtLnBhY2soKTsKLSAgICAgICAgZm9ybS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRBc3luY1BhbmVsKCkgewotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQoYXN5bmNQYW5lbCk7Ci0gICAgICAgIHRoaXMuc3luY01lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuYXN5bmNNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLnJlcGFpbnQoKTsKLSAgICAgICAgdGhpcy5zZXRUaXRsZSgiR29vZ2xlIFNwZWxsIGNoZWNrZXIgLSBBc3luYyBNb2RlIik7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRTeW5jUGFuZWwoKSB7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5yZW1vdmVBbGwoKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChzeW5jUGFuZWwpOwotICAgICAgICB0aGlzLnN5bmNNZW51SXRlbS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5hc3luY01lbnVJdGVtLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5yZXBhaW50KCk7Ci0gICAgICAgIHRoaXMuc2V0VGl0bGUoIkdvb2dsZSBTcGVsbCBjaGVja2VyIC0gU3luYyBNb2RlIik7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2Qgc2hvd0hlbHAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2hvd0hlbHAoKSB7Ci0KLSAgICAgICAgSkZyYW1lIGZyYW1lID0gbmV3IEpGcmFtZSgpOwotICAgICAgICBEaW1lbnNpb24gc2NyZWVuU2l6ZSA9IFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCk7Ci0gICAgICAgIGZyYW1lLnNldExvY2F0aW9uKHNjcmVlblNpemUud2lkdGggLyA1LAotICAgICAgICAgICAgICAgIHNjcmVlblNpemUuaGVpZ2h0IC8gNSk7Ci0gICAgICAgIGZyYW1lLnNldFNpemUoc2NyZWVuU2l6ZS53aWR0aCAvIDIsIHNjcmVlblNpemUuaGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgQm9yZGVyTGF5b3V0IGxheW91dCA9IG5ldyBCb3JkZXJMYXlvdXQoKTsKLQotICAgICAgICBKU2Nyb2xsUGFuZSBqc3A7Ci0KLQotICAgICAgICBoZWxwRGlzcGxheVBhbmUgPSBuZXcgSkVkaXRvclBhbmUoKTsKLSAgICAgICAgaGVscERpc3BsYXlQYW5lLmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOwotICAgICAgICBoZWxwRGlzcGxheVBhbmUuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBoZWxwRGlzcGxheVBhbmUuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotCi0gICAgICAgIGpzcCA9IG5ldyBKU2Nyb2xsUGFuZShoZWxwRGlzcGxheVBhbmUpOwotCi0gICAgICAgIENvbnRhaW5lciBjb250ZW50UGFuZSA9IGZyYW1lLmdldENvbnRlbnRQYW5lKCk7Ci0gICAgICAgIGNvbnRlbnRQYW5lLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBjb250ZW50UGFuZS5hZGQoanNwLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgU3RyaW5nIGhlbHBEb2MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBIRUxQX0ZJTEVfTkFNRTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaGVscERpc3BsYXlQYW5lLnNldFBhZ2UobmV3IEZpbGUoaGVscERvYykudG9VUkwoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsICJIZWxwIGZpbGUgbm90IGRldGVjdGVkIiwgIkhlbHAgZmlsZSBlcnJvciIsCi0gICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBoeXBlcmxpbmtVcGRhdGUoSHlwZXJsaW5rRXZlbnQgZSkgewotICAgICAgICBpZiAoZS5nZXRFdmVudFR5cGUoKSA9PSBIeXBlcmxpbmtFdmVudC5FdmVudFR5cGUuQUNUSVZBVEVEKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBlLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgaGVscERpc3BsYXlQYW5lLnNldFBhZ2UodXJsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCAiSGVscCBmaWxlIG5vdCBkZXRlY3RlZCIsIGVyci5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9nb29nbGVzcGVsbGNoZWNrL3NyYy9zYW1wbGUvc3BlbGxjaGVjay9lZGl0b3IvU3luY1BhbmVsLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TeW5jUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhYzY2My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2dvb2dsZXNwZWxsY2hlY2svc3JjL3NhbXBsZS9zcGVsbGNoZWNrL2VkaXRvci9TeW5jUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS5zcGVsbGNoZWNrLmVkaXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci0KLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIGNsYXNzIHNhbXBsZS5nb29nbGUuc3BlbGxjaGVjay5TeW5jUGFuZWwKLSAqIFRoaXMgSW1wZW1lbnRzIGl0cyBvd24gR1VJIG9mIHRoZSBTeW5jaHJvbm91cyBDbGllbnQgYW5kIGl0IHNlbmQgdGhlIFNPQVAgcmVxdWVzdCBhZnRlciB0aGUgbW91c2UgZXZlbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jUGFuZWwgZXh0ZW5kcyBqYXZheC5zd2luZy5KUGFuZWwgaW1wbGVtZW50cyBPYnNlcnZlciwKLSAgICAgICAgQWN0aW9uTGlzdGVuZXIgewotICAgIEZvcm1Nb2RlbCBmb3JtTW9kZWw7Ci0gICAgSlRleHRBcmVhIHdyaXRpbmdUZXh0QXJlYTsKLSAgICBKVGV4dEFyZWEgZGlzcGxheVRleHRBcmVhOwotICAgIEpUZXh0RmllbGQgZXJyb3JNZXNzYWdlRmllbGQ7Ci0gICAgSkJ1dHRvbiBzZW5kQnV0dG9uOwotCi0gICAgcHVibGljIFN5bmNQYW5lbCgpIHsKLSAgICAgICAgR3JpZEJhZ0xheW91dCBnYkxheW91dCA9IG5ldyBHcmlkQmFnTGF5b3V0KCk7Ci0gICAgICAgIEdyaWRCYWdDb25zdHJhaW50cyBjb25zdHJhaW50ID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotICAgICAgICB0aGlzLnNldExheW91dChnYkxheW91dCk7Ci0KLSAgICAgICAgZm9ybU1vZGVsID0gbmV3IEZvcm1Nb2RlbCh0aGlzKTsKLSAgICAgICAgd3JpdGluZ1RleHRBcmVhID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0QXJlYSgpOwotICAgICAgICB3cml0aW5nVGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0KLSAgICAgICAgZGlzcGxheVRleHRBcmVhID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0QXJlYSgpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0TGluZVdyYXAodHJ1ZSk7Ci0gICAgICAgIGRpc3BsYXlUZXh0QXJlYS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICAgICAgZXJyb3JNZXNzYWdlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBlcnJvck1lc3NhZ2VGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEJhY2tncm91bmQoQ29sb3IuTElHSFRfR1JBWSk7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldEZvcmVncm91bmQoQ29sb3IuUkVEKTsKLQotICAgICAgICBzZW5kQnV0dG9uID0gbmV3IGphdmF4LnN3aW5nLkpCdXR0b24oIlNlbmQiKTsKLSAgICAgICAgSlNjcm9sbFBhbmUgc2Nyb2xsUGFuZWdldCA9IG5ldyBKU2Nyb2xsUGFuZSh3cml0aW5nVGV4dEFyZWEpOwotICAgICAgICBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lc2V0ID0gbmV3IEpTY3JvbGxQYW5lKGRpc3BsYXlUZXh0QXJlYSk7Ci0gICAgICAgIHdyaXRpbmdUZXh0QXJlYS5zZXRUZXh0KCJFbnRlciBhIFN0cmluZyIpOwotCi0gICAgICAgIGNvbnN0cmFpbnQuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIOwotICAgICAgICBjb25zdHJhaW50LmdyaWR4ID0gMDsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR4ID0gMTsKLSAgICAgICAgY29uc3RyYWludC53ZWlnaHR5ID0gODsKLSAgICAgICAgZ2JMYXlvdXQuc2V0Q29uc3RyYWludHMoc2Nyb2xsUGFuZWdldCwgY29uc3RyYWludCk7Ci0gICAgICAgIHRoaXMuYWRkKHNjcm9sbFBhbmVnZXQpOwotICAgICAgICBnYkxheW91dC5zZXRDb25zdHJhaW50cyhzY3JvbGxQYW5lc2V0LCBjb25zdHJhaW50KTsKLSAgICAgICAgdGhpcy5hZGQoc2Nyb2xsUGFuZXNldCk7Ci0gICAgICAgIGNvbnN0cmFpbnQud2VpZ2h0eSA9IDE7Ci0gICAgICAgIGdiTGF5b3V0LnNldENvbnN0cmFpbnRzKHNlbmRCdXR0b24sIGNvbnN0cmFpbnQpOwotICAgICAgICB0aGlzLmFkZChzZW5kQnV0dG9uKTsKLSAgICAgICAgZ2JMYXlvdXQuc2V0Q29uc3RyYWludHMoZXJyb3JNZXNzYWdlRmllbGQsIGNvbnN0cmFpbnQpOwotICAgICAgICB0aGlzLmFkZChlcnJvck1lc3NhZ2VGaWVsZCk7Ci0KLSAgICAgICAgc2VuZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShTdHJpbmcgc3VnZ2VzdGlvbikgewotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0VGV4dChzdWdnZXN0aW9uKTsKLSAgICB9Ci0KLSAgICAvL3VwZGF0ZXMgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGVycm9yIG1lc3NhZ2UgZGlzcGxheSBhcmVhCi0gICAgcHVibGljIHZvaWQgdXBkYXRlRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZXJyb3JNZXNzYWdlRmllbGQuc2V0VGV4dChtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBTdHJpbmcgc3RyID0gd3JpdGluZ1RleHRBcmVhLmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIGZvcm1Nb2RlbC5kb1N5bmNTcGVsbGluZ1N1Z2dlc3Rpb24oc3RyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgd3JpdGluZ1RleHRBcmVhLnNldFRleHQoIiIpOwotICAgICAgICBkaXNwbGF5VGV4dEFyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgIGVycm9yTWVzc2FnZUZpZWxkLnNldFRleHQoIiIpOwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9SRUFETUUgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3MvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJhMWJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1UaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBBeGlzMiBpbiBhIHNlcnZsZXQgY29udGFpbmVyLiBZb3UgbXVzdCANCi1oYXZlIE1hdmVuIDIueCBpbnN0YWxsZWQgdG8gYnVpbGQgdGhpcyBleGFtcGxlLiAgVG8gYnVpbGQgdHlwZToNCi0NCi0kIG12biBpbnN0YWxsIHdhcjp3YXINCi0NCi1UbyBydW4gdGhlIHNhbXBsZSB1c2luZyBhIFNlcnZsZXQgRW5naW5lOiANCi0NCi1QbGVhc2UgaW5zdGFsbCBhIHNlcnZsZXQgZW5naW5lIHNheSB0b21jYXQuIFJlbmFtZSB0aGUgcmVzdWx0YW50IHdhciBhcyB5b3VyX3dlYl9hcHAud2FyIGFuZCBkcm9wIGl0IGludG8gd2ViYXBwcyBkaXJlY3RvcnkgdW5kZXIgdG9tY2F0Lg0KLVRoZSBXU0RMIGZpbGUgZm9yIHRoZSBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoNCi0NCi1odHRwOi8veW91cmhvc3Q6cG9ydC95b3VyX3dlYl9hcHAvc2VydmljZXMvSGVsbG9Xb3JsZC5IZWxsb1dvcmxkSW1wbFBvcnQ/d3NkbA0KLQ0KLVRvIHJ1biB0aGUgc2FtcGxlIHVuZGVyIGF4aXMyc2VydmVyOg0KLQ0KLVBsZWFzZSBjb3B5IHRoZSBqYXZhX2ZpcnN0X2pheHdzIGphciBpbnRvIDxBWElTMl9IT01FPi9yZXBvc2l0b3J5L3NlcnZpY2VqYXJzIChQbGVhc2UgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaWYgaXQgZG9lcyBub3QgZXhpc3QpLiBUaGVuIHN0YXJ0IHRoZSBheGlzMiBzZXJ2ZXIuDQotVGhlIFdTREwgZmlsZSBmb3IgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIHZpZXdhYmxlIGF0Og0KLQ0KLWh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9IZWxsb1dvcmxkLkhlbGxvV29ybGRJbXBsUG9ydD93c2RsDQotDQotTk9URTogSWYgeW91IGFyZSB1c2luZyBKREsxLjUsIHBsZWFzZSBjb3B5IGpheHdzLXJ0LmphciBhbmQgamF4d3MtdG9vbHMuamFyIGZyb20gdGhlIEpBWFdTIFJJIGludG8gPEFYSVMyX0hPTUU+L2xpYiBiZWZvcmUgeW91IHJ1biBheGlzMiBzZXJ2ZXIuIEluIEpESyAxLjYsIHlvdSBkb24ndCBuZWVkIHRoZXNlIDIgamFycy4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3MvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDA0MzI2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5leGFtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5qYXZhX2ZpcnN0X2pheHdzPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkpBWFdTIC0gU3RhcnRpbmcgZnJvbSBKYXZhIEV4YW1wbGU8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb208L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuODwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuODwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWE8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5YbWxTY2hlbWE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjQuNDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubmVldGhpPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmVldGhpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQ8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+d29vZHN0b3g8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c3R4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+YXNsLTMuMi40PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjYuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjY8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS42PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjE3MzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwud3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy1ydDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLndzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLm1lc3NhZ2luZy5zYWFqPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zYWFqLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuc3RyZWFtLmJ1ZmZlcjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RyZWFtYnVmZmVyPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLnN0cmVhbTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2pzeHA8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp2bmV0LnN0YXhleDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1leDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLm9yZy5hcGFjaGUueG1sLmludGVybmFsPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yZXNvbHZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1pbWVwdWxsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwud3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy10b29sczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4zPC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwud3M8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheHdzLXJ0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGIteGpjPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjb21waWxlclZlcnNpb24+MS41PC9jb21waWxlclZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8d2FyU291cmNlRGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL3dlYmFwcDwvd2FyU291cmNlRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8dGVzdFJlc291cmNlcz4KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdDwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoucHJvcGVydGllczwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi53c2RsPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgIDwvYnVpbGQ+Ci0KLSAgICA8IS0tICBuZWVkZWQgZm9yIFhtbFNjaGVtYSAtLT4KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5pYmlibGlvPC9pZD4KLSAgICAgICAgICAgIDxuYW1lPmliaWJsaW8gbWF2ZW4gcmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2liaWJsaW8ub3JnL21hdmVuLzwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGU8L2lkPgotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIG1hdmVuIHJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2phdmEtcmVwb3NpdG9yeS88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMi88L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0PgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL21haW4vZGVtby9ody9zZXJ2ZXIvSGVsbG9Xb3JsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc4MGFiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotcGFja2FnZSBkZW1vLmh3LnNlcnZlcjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOw0KLQ0KLUBXZWJTZXJ2aWNlDQotcHVibGljIGludGVyZmFjZSBIZWxsb1dvcmxkIHsNCi0NCi0gICAgU3RyaW5nIHNheUhpKFN0cmluZyB0ZXh0KTsNCi19DQotLy8gRU5EIFNOSVBQRVQ6IHNlcnZpY2UNCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL21haW4vZGVtby9ody9zZXJ2ZXIvSGVsbG9Xb3JsZEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdkMmVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvbWFpbi9kZW1vL2h3L3NlcnZlci9IZWxsb1dvcmxkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgZGVtby5ody5zZXJ2ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1AV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZSA9ICJkZW1vLmh3LnNlcnZlci5IZWxsb1dvcmxkIiwgDQotICAgICAgICAgICAgc2VydmljZU5hbWUgPSAiSGVsbG9Xb3JsZCIpDQotcHVibGljIGNsYXNzIEhlbGxvV29ybGRJbXBsIGltcGxlbWVudHMgSGVsbG9Xb3JsZCB7DQotICAgIHB1YmxpYyBTdHJpbmcgc2F5SGkoU3RyaW5nIHRleHQpIHsNCi0gICAgICAgIHJldHVybiAiSGVsbG8gIiArIHRleHQ7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczMTExMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iaG90ZGVwbG95bWVudCI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZVN3QSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmlsZSBjYWNoaW5nIGZvciBhdHRhY2htZW50cyAtLT4NCi0gICAgPCEtLXBhcmFtZXRlciBuYW1lPSJjYWNoZUF0dGFjaG1lbnRzIj50cnVlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2l6ZVRocmVzaG9sZCI+NDAwMDwvcGFyYW1ldGVyLS0+DQotICAgIA0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIHBsdWdpbiB5b3VyIG93biBhdHRhY2htZW50cyBsaWZlY3ljbGUgaW1wbGVtZW50YXRpb24gLS0+DQotICAgIDwhLS08YXR0YWNobWVudHNMaWZlY3ljbGVNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLmxpZmVjeWNsZS5pbXBsLkxpZmVjeWNsZU1hbmFnZXJJbXBsIi8+LS0+DQotDQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSByZWR1Y3Rpb24gb2YgdGhlIGluLW1lbW9yeSBjYWNoZSBvZiBXU0RMIGRlZmluaXRpb25zIC0tPg0KLSAgICA8IS0tSW4gc29tZSBzZXJ2ZXIgZW52aXJvbm1lbnRzLCB0aGUgYXZhaWxhYmxlIG1lbW9yeSBoZWFwIGlzIGxpbWl0ZWQgYW5kIGNhbiBmaWxsIHVwIHVuZGVyIGxvYWQgLS0+DQotICAgIDwhLS1TaW5jZSBpbi1tZW1vcnkgY29waWVzIG9mIFdTREwgZGVmaW5pdGlvbnMgY2FuIGJlIGxhcmdlLCBzb21lIHN0ZXBzIGNhbiBiZSB0YWtlbi0tPg0KLSAgICA8IS0tdG8gcmVkdWNlIHRoZSBtZW1vcnkgbmVlZGVkIGZvciB0aGUgY2FjaGVkIFdTREwgZGVmaW5pdGlvbnMuIC0tPg0KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlDYWNoZSI+dHJ1ZTwvcGFyYW1ldGVyLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIG1pbGxpc2Vjb25kcy0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwMDAwPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2sgdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4NCi0gICAgPCEtLXRoYXQgYmVoYXZpb3IuLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2VuZFN0YWNrdHJhY2VEZXRhaWxzV2l0aEZhdWx0cyI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhjZXB0aW9uLS0+DQotICAgIDwhLS1hcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLiBCdXQgd2hlbiBhIGZhdWx0IGlzIHRocm93biBmcm9tIGEgc2VydmljZSBvciBzb21lIHdoZXJlLCBpdCB3aWxsIGJlIC0tPg0KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+DQotICAgIDwhLS1pcyBzZXQsIHRoZW4gQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkRyaWxsRG93blRvUm9vdENhdXNlRm9yRmF1bHRSZWFzb24iPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFzc3dvcmQiPmF4aXMyPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPg0KLSAgICA8IS0tU2VydmljZXNEaXJlY3Rvcnkgb25seSB3b3JrcyBvbiB0aGUgZm9sbG93aW5nIGNhc2VzLS0+DQotICAgIDwhLS0tRmlsZSBiYXNlZCBjb25maWd1cmF0b3IgYW5kIGluIHRoYXQgY2FzZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgZmlsZSBVUkwgKGh0dHA6Ly8gbm90IGFsbG93ZWQpLS0+DQotICAgIDwhLS0tV2hlbiBjcmVhdGluZyBVUkwgQmFzZWQgY29uZmlndXJhdG9yIHdpdGggVVJMIOKAnGZpbGU6Ly/igJ0gIC0tPg0KLSAgICA8IS0tLSBXYXIgYmFzZWQgY29uZmlndXJhdG9yIHdpdGggZXhwYW5kZWQgY2FzZSAsIC0tPg0KLQ0KLSAgICA8IS0tQWxsIHRoZSBvdGhlciBzY2VuYXJpb3MgaXQgd2lsbCBiZSBpZ25vcmVkLi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlc0RpcmVjdG9yeSI+c2VydmljZTwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4NCi0NCi0NCi0NCi0gICAgPCEtLUZvbGxvd2luZyBwYXJhbXMgd2lsbCBzZXQgdGhlIHByb3BlciBjb250ZXh0IHBhdGhzIGZvciBpbnZvY2F0aW9ucy4gQWxsIHRoZSBlbmRwb2ludHMgd2lsbCBoYXZlIGEgY29tbW9ucyBjb250ZXh0LS0+DQotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWl1c2ggdGhvc2UgZW5kcG9pbnRzLS0+DQotICAgIDwhLS1JbiBjYXNlIG9mIGEgc2VydmxldCwgaWYgeW91IGNoYW5nZSB0aGlzIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91ciBzZXJ2bGV0IGNvbnRhaW5lciB0byBtYXAgdGhpcyAtLT4NCi0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9InJlc3RQYXRoIj5yZXN0PC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVJFU1QiIGxvY2tlZD0idHJ1ZSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgDQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIHN1cHByZXNzIGdlbmVyYXRpb24gb2YgU09BUCAxLjIgYmluZGluZ3MgaW4gYXV0by1nZW5lcmF0ZWQgV1NETCBmaWxlcyAtLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlU09BUDEyIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1QT0pPIGRlcGxveWVyICwgdGhpcyB3aWxsIGFsb3cgdXNlcnMgdG8gZHJvcCAuY2xhc3MgZmlsZSBhbmQgbWFrZSB0aGF0IGludG8gYSBzZXJ2aWNlLS0+DQotICAgIDxkZXBsb3llciBleHRlbnNpb249Ii5jbGFzcyIgZGlyZWN0b3J5PSJwb2pvIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LlBPSk9EZXBsb3llciIvPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuamFyIiBkaXJlY3Rvcnk9InBvam8iIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmZyYW1ld29yay5KQVhXU0RlcGxveWVyIi8+DQotICAgIDwhLS08ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuanNhIiBkaXJlY3Rvcnk9InJtaXNlcnZpY2VzIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ybWkuZGVwbG95LlJNSVNlcnZpY2VEZXBsb3llciIvPi0tPg0KLSAgICANCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiIGxvY2tlZD0idHJ1ZSI+bXlob3N0LmNvbTwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnQgZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+DQotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+DQotDQotDQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPg0KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPg0KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4NCi0gICAgDQotICAgIDwhLS0gVW5jb21tZW50IGlmIEpBWC1XUyAyLjEgc3VwcG9ydCBpcyBuZWVkZWQuIC0tPg0KLSAgICA8IS0tDQotICAgIDx0aHJlYWRDb250ZXh0TWlncmF0b3JzPg0KLSAgICAgICAgPHRocmVhZENvbnRleHRNaWdyYXRvciBsaXN0SWQ9IkpBWFdTLVRocmVhZENvbnRleHRNaWdyYXRvci1MaXN0IiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzaW5nLm1pZ3JhdG9yLkVuZHBvaW50Q29udGV4dE1hcE1pZ3JhdG9yIi8+DQotICAgIDwvdGhyZWFkQ29udGV4dE1pZ3JhdG9ycz4NCi0gICAgLS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tVGhpcyBpcyB0aGUgZGVhZnVsdCBNZXNzYWdlUmVjZWl2ZXIgZm9yIHRoZSBzeXN0ZW0gLCBpZiB5b3Ugd2FudCB0byBoYXZlIE1lc3NhZ2VSZWNlaXZlcnMgZm9yIC0tPg0KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+DQotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPg0KLSAgICA8IS0tTm90ZSA6IFlvdSBjYW4gb3ZycmlkZSB0aGlzIGZvciBhIHBhcnRpY3VsYXIgc2VydmljZSBieSBhZGRpbmcgdGhlIHNhbWUgZWxlbWVudCB3aXRoIHlvdXIgcmVxdWlyZW1lbnQtLT4NCi0gICAgIDxtZXNzYWdlUmVjZWl2ZXJzPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW9ubHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzAxL3dzZGwvaW4tb3V0Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBGb3JtYXR0ZXIgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+DQotICAgIDwhLS1mb3JtYXQgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+DQotICAgIDxtZXNzYWdlRm9ybWF0dGVycz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLk11bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9InRleHQveG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TT0FQTWVzc2FnZUZvcm1hdHRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3NvYXAreG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TT0FQTWVzc2FnZUZvcm1hdHRlciIvPg0KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBCdWlsZGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0cyBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VCdWlsZGVycz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuTXVsdGlwYXJ0Rm9ybURhdGFCdWlsZGVyIi8+DQotICAgIDwvbWVzc2FnZUJ1aWxkZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8dHJhbnNwb3J0UmVjZWl2ZXIgbmFtZT0iaHR0cCINCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwb3J0Ij44MDgwPC9wYXJhbWV0ZXI+DQotICAgICAgICA8IS0tIEhlcmUgaXMgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMgKHNlZSBleGFtcGxlIHNldHRpbmdzIGZ1cnRoZXIgYmVsb3cpOg0KLSAgICAgICAgICAgIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdCA2MDYwKQ0KLSAgICAgICAgICAgIGhvc3RuYW1lOiAgaWYgbm9uLW51bGwsIHVybCBwcmVmaXggdXNlZCBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgbnVsbCkNCi0gICAgICAgICAgICBvcmlnaW5TZXJ2ZXI6ICB2YWx1ZSBvZiBodHRwIFNlcnZlciBoZWFkZXIgaW4gb3V0Z29pbmcgbWVzc2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ICJTaW1wbGUtU2VydmVyLzEuMSIpDQotICAgICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6ICB2YWx1ZSBpbiBtaWxsaXMgb2YgdGltZSB0aGF0IHJlcXVlc3RzIGNhbiB3YWl0IGZvciBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAyMDAwMCkNCi0gICAgICAgICAgICByZXF1ZXN0VGNwTm9EZWxheTogIHRydWUgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UgYW5kIG1pbmltaXplIGxhdGVuY3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IHRydWUpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSB0byBtaW5pbWl6ZSBiYW5kd2lkdGggY29uc3VtcHRpb24gYnkgY29tYmluaW5nIHNlZ21lbnRzDQotICAgICAgICAgICAgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nICh1bmxlc3MgcXVldWUgZmlsbHMgdXApICAoZGVmYXVsdCAyNSkNCi0gICAgICAgICAgICByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU6ICBudW1iZXIgb2YgdGhyZWFkcyBhdmFpbGFibGUgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBpZiBxdWV1ZSBmaWxscyB1cCAgICAgICAgIChkZWZhdWx0IDE1MCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgZGVmYXVsdCBxdWV1ZSBuZXZlciBmaWxscyB1cDogIHNlZSBIdHRwRmFjdG9yeQ0KLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWU6ICB0aW1lIHRvIGtlZXAgdGhyZWFkcyBpbiBleGNlc3Mgb2YgY29yZSBzaXplIGFsaXZlIHdoaWxlIGluYWN0aXZlICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMTgwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgbm8gc3VjaCB0aHJlYWRzIGNhbiBleGlzdCB3aXRoIGRlZmF1bHQgdW5ib3VuZGVkIHJlcXVlc3QgcXVldWUNCi0gICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdDogIFRpbWVVbml0IG9mIHZhbHVlIGluIHRocmVhZEtlZXBBbGl2ZVRpbWUgKGRlZmF1bHQgU0VDT05EUykgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IFNFQ09ORFMpDQotICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+aHR0cDovL3d3dy5teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4gLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luU2VydmVyIj5NeS1TZXJ2ZXIvMS4xPC9wYXJhbWV0ZXI+ICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGltZW91dCI+MTAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdFRjcE5vRGVsYXkiPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUiPjUwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSI+MTAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZSI+MjQwMDAwPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiPk1JTExJU0VDT05EUzwvcGFyYW1ldGVyPiAgICAgICAgICAgIC0tPg0KLSAgICA8L3RyYW5zcG9ydFJlY2VpdmVyPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+DQotICAgIDwhLS10cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJ0Y3AiDQotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlci0tPj4NCi0gICAgICAgIDwhLS1JZiB5b3Ugd2FudCB0byBnaXZlIHlvdXIgb3duIGhvc3QgYWRkcmVzcyBmb3IgRVBSIGdlbmVyYXRpb24tLT4NCi0gICAgICAgIDwhLS11bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBwYXJhbXRlciAsIGFuZCBzZXQgaXQgYXMgeW91IHJlcXVpcmVkLi0tPg0KLSAgICAgICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiPnRjcDovL215QXBwLmNvbS93czwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tIC90cmFuc3BvcnRSZWNlaXZlciAtLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4NCi0gICAgPCEtLQ0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9InRjcCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFRyYW5zcG9ydFNlbmRlciIvPg0KLSAgICAtLT4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJsb2NhbCINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4NCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+DQotDQotICAgICAgICA8IS0tIElmIGZvbGxvd2luZyBpcyBzZXQgdG8gJ3RydWUnLCBvcHRpb25hbCBhY3Rpb24gcGFydCBvZiB0aGUgQ29udGVudC1UeXBlIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBTT0FQIDEuMiBtZXNzYWdlcyAtLT4NCi0gICAgICAgIDwhLS0gIDxwYXJhbWV0ZXIgbmFtZT0iT21pdFNPQVAxMkFjdGlvbiI+dHJ1ZTwvcGFyYW1ldGVyPiAgLS0+DQotICAgIDwvdHJhbnNwb3J0U2VuZGVyPg0KLQ0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkNvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+DQotICAgIDwvdHJhbnNwb3J0U2VuZGVyPg0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImphdmEiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LmphdmEuSmF2YVRyYW5zcG9ydFNlbmRlciIvPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gR2xvYmFsIE1vZHVsZXMgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4NCi0gICAgPCEtLTxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+LS0+DQotDQotICAgIDwhLS1Db25maWd1cmluZyBtb2R1bGUgLCBwcm92aWRpbmcgcGFyYW1ldGVycyBmb3IgbW9kdWxlcyB3aGV0aGVyIHRoZXkgcmVmZXIgb3Igbm90LS0+DQotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJhZGRyZXNzaW5nUGFyYSI+Ti9BPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS08L21vZHVsZUNvbmZpZz4tLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIENsdXN0ZXJpbmcgIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gQ29uZmlndXJlIGFuZCB1bmNvbW1lbnQgZm9sbG93aW5nIGZvciBwcmVwYXJpbmcgQXhpczIgdG8gYSBjbHVzdGVyZWQgZW52aXJvbm1lbnQgLS0+DQotICAgIDwhLS0NCi0gICAgPGNsdXN0ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci50cmliZXMuVHJpYmVzQ2x1c3Rlck1hbmFnZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJwYXJhbTEiPnZhbHVlMTwvcGFyYW1ldGVyPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJkb21haW4iPmFwYWNoZS5heGlzMi5kb21haW48L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic3luY2hyb25pemVBbGwiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWF4UmV0cmllcyI+MTA8L3BhcmFtZXRlcj4NCi0gICAgCTxjb25maWd1cmF0aW9uTWFuYWdlciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uVHJpYmVzQ29uZmlndXJhdGlvbk1hbmFnZXIiPg0KLSAgICAJICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5jbHVzdGVyLmNvbmZpZ3VyYXRpb24uRGVmYXVsdENvbmZpZ3VyYXRpb25NYW5hZ2VyTGlzdGVuZXIiLz4NCi0gICAgCTwvY29uZmlndXJhdGlvbk1hbmFnZXI+DQotICAgIAk8Y29udGV4dE1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb250ZXh0LlRyaWJlc0NvbnRleHRNYW5hZ2VyIj4NCi0gICAgCSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb250ZXh0LkRlZmF1bHRDb250ZXh0TWFuYWdlckxpc3RlbmVyIi8+DQotICAgIAk8L2NvbnRleHRNYW5hZ2VyPg0KLSAgICA8L2NsdXN0ZXI+DQotICAgIC0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGhhc2VzICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0UGhhc2UiLz4NCi0gICAgICAgIDwhLS1zeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZS0tPg0KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IkFkZHJlc3NpbmciPg0KLSAgICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi08L2F4aXNjb25maWc+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2NvbW1vbnMtbG9nZ2luZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWZkZDBhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLQ0KLSMgVGhpcyBpcyB0aGUgbG9nZ2luZyBwcm9wZXJ0aWVzIHRoYXQgZ29lcyB0byB0aGUgd2FyLCB0aGVyZSBhcmUgdHdvIGxvZ2dpbmcgY29uZiBrZXB0IGF0IHRoZSANCi0jIHN2biwgb25lIGZvciBkZXZlbG9wZW1lbnQgKG9uZSBhdCBzcmMvdGVzdC1yZXNvdXJjZXMpIGFuZCBvdGhlciBmb3IgcHJvZHVjYXRpb24NCi0gDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBkaXNhYmxlIGFsbCBsb2dnaW5nLg0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Ob09wTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgdGhlIHNpbXBsZSBsb2cgYmFzZWQgbG9nZ2luZw0KLSNvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c9b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5TaW1wbGVMb2cNCi0NCi0jIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIGVuYWJsZSBsb2c0aiBiYXNlZCBsb2dnaW5nDQotb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTG9nNEpMb2dnZXINCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQ4ZGRjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF2YV9maXJzdF9qYXh3cy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIw0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSMNCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotIyB1bmRlciB0aGUgTGljZW5zZS4NCi0jDQotDQotDQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLg0KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFDQotI2xvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFLCBMT0dGSUxFDQotDQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuYXhpczIuZW50ZXJwcmlzZT1GQVRBTA0KLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMDQotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwNCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ9RkFUQUwNCi0NCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5DT05TT0xFPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0DQotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyVwXSAlbSVuDQotDQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0Lg0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEU9b3JnLmFwYWNoZS5sb2c0ai5GaWxlQXBwZW5kZXINCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQ0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2phdmFfZmlyc3RfamF4d3Mvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZWEzMjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXZhX2ZpcnN0X2pheHdzL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTwhRE9DVFlQRSB3ZWItYXBwDQotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIg0KLSAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4NCi0gICAgDQotPHdlYi1hcHA+DQotDQotICAgIDxzZXJ2bGV0Pg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5BeGlzU2VydmxldDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPGRpc3BsYXktbmFtZT5BcGFjaGUtQXhpcyBTZXJ2bGV0PC9kaXNwbGF5LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkF4aXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+DQotICAgIDwvc2VydmxldD4NCi0NCi0gIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4NCi0gICAgPHVybC1wYXR0ZXJuPi9zZXJ2aWNlcy8qPC91cmwtcGF0dGVybj4NCi0gIDwvc2VydmxldC1tYXBwaW5nPg0KLTwvd2ViLWFwcD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YmI1ZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLUF4aXMyIEpBWC1XUyBzYW1wbGUgdGhhdCB1c2VzIEpBWEIgYXJ0aWZhY3RzIGNyZWF0ZWQgZnJvbSBhIHNpbXBsZSBzY2hlbWEuDQotDQotICAgMS4gR2l2ZW4gYSBzaW1wbGUgc2NoZW1hLCBnZW5lcmF0ZSB0aGUgSkFYQiBhcnRpZmFjdHMgdXNpbmcgeGpjLg0KLSAgIDIuIFdpdGggdGhlIGdlbmVyYXRlZCBKQVhCIGJlYW5zIGluIGhhbmQsIHdyaXRlIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIA0KLSAgICAgIGFuZCBhZGQgYW5ub3RhdGlvbnMgdG8gbWFrZSBhIFdlYiBTZXJ2aWNlLg0KLSAgIDMuIFdyaXRlIGEgRGlzcGF0Y2ggY2xpZW50IHRvIGludGVyYWN0IHdpdGggdGhlIHNlcnZpY2UNCi0gICA0LiBSdW4gdGhlIERpc3BhdGNoIGNsaWVudCBhZ2FpbnN0IHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGRlcGxveWVkIGluIHRoZSBBeGlzMiBzZXJ2ZXINCi0NCi1UaGlzIGFkZHJlc3MgYm9vayBzYW1wbGUgaXMgYmFzZWQgb24gb25lIG9mIHRoZSBqYXh3cy1pbnRlZ3JhdGlvbiB0ZXN0czoNCi1tb2R1bGVzL2pheHdzLWludGVncmF0aW9uL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGUvYWRkcmVzc2Jvb2sNCi0NCi1Ob3RlIHRoYXQgdGhpcyBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGUsIGFuZCBkb2VzIG5vdCBwZXJzaXN0IGFueSBkYXRhLiAgVGhlIGludGVudCBpcw0KLXRvIGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBKQVhCIG9iamVjdHMgd2l0aCBKQVgtV1MsIG5vdCB0byBhY3R1YWxseSBpbXBsZW1lbnQgYW5kIGFkZHJlc3MgYm9vay4NCi0NCi1UaGUgZm9sbG93aW5nIHNvdXJjZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgZXhhbXBsZToNCi1zcmNcQWRkcmVzc0Jvb2tFbnRyeS54c2Q6ICBTY2hlbWEgdXNlZCB0byBnZW5lcmF0ZSBKQVhCIGFydGlmYWN0cw0KLXNyY1xvcmdcYXBhY2hlXGF4aXMyXGpheHdzXGFkZHJlc3Nib29rXEFkZHJlc3NCb29rLmphdmE6ICBKQVhXUyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSAoU0VJKQ0KLSAgICBOb3RlIHRoYXQgdGhpcyBTRUkgaXMgTk9UIENVUlJFTlRMWSBVU0VEIGluIHRoaXMgZXhhbXBsZS4NCi1zcmNcb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0NsaWVudC5qYXZhOiBKQVhXUyBEaXNwYXRjaCBDbGllbnQNCi1zcmNcb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0ltcGwuamF2YTogSkFYV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbg0KLQ0KLQ0KLVN0ZXAgMDogSG93IHRvIGJ1aWxkIHRoaXMgc2FtcGxlDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1UbyBidWlsZCB0aGlzIHNhbXBsZSwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQ6IA0KLQltdm4gY2xlYW4gaW5zdGFsbA0KLQ0KLVRoaXMgd2lsbCBkbyB0aGUgZm9sbG93aW5nOg0KLS0gR2VuZXJhdGUgdGhlIEpBWEIgYXJ0aWZhY3RzIChpbiB0YXJnZXQvc2NoZW1hKQ0KLS0gQ29tcGlsZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIChpbiB0YXJnZXQvY2xhc3NlcyksIGluY2x1ZGluZyB0aGUgSkFYQiBhcnRpZmFjdHMsIA0KLSAgYW5kIGNyZWF0ZSBhIEpBUiBjb250YWluaW5nIHRob3NlIGNsYXNzZXMgKHRhcmdldC9qYXh3cy1hZGRyZXNzYm9vay1TTkFQU0hPVC5qYXIpDQotLSBDb21waWxlIHRoZSBEaXNwYXRjaCBjbGllbnQgY2xhc3NlcyAoaW4gdGFyZ2V0L2NsYXNzZXMpIGFuZCBjcmVhdGUgYSBKQVIgY29udGFpbmluZyB0aG9zZSBjbGFzc2VzDQotICAodGFyZ2V0L2pheHdzLWFkZHJlc3Nib29rLVNOQVBTSE9ULUNsaWVudC5qYXIpLiAgDQotDQotDQotU3RlcCAxOiBHZW5lcmF0ZSBKQVhCIGFydGlmYWN0cyBmcm9tIHNpbXBsZSBzY2hlbWENCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoZSBmaWxlIHNyYy9BZGRyZXNzQm9va0VudHJ5LnhzZCBkZXNjcmliZXMgYSBzaW1wbGUgQWRkcmVzc0Jvb2tFbnRyeSBvYmplY3Qgd2l0aCB0aGUNCi1mb2xsb3dpbmcgZmllbGRzOg0KLSAgICBTdHJpbmcgZmlyc3ROYW1lOw0KLSAgICBTdHJpbmcgbGFzdE5hbWU7DQotICAgIFN0cmluZyBwaG9uZTsNCi0gICAgU3RyaW5nIHN0cmVldDsNCi0gICAgU3RyaW5nIGNpdHk7DQotICAgIFN0cmluZyBzdGF0ZTsNCi0NCi1UaGUgZm9sbG93aW5nIEpBWEIgYXJ0aWZhY3RzIGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHRhcmdldC9zY2hlbWEvc3JjIGRpcmVjdG9yeSB3aGVuIHRoZSANCi1zYW1wbGUgaXMgYnVpbHQgDQotb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0VudHJ5LmphdmENCi1vcmdcYXBhY2hlXGF4aXMyXGpheHdzXGFkZHJlc3Nib29rXE9iamVjdEZhY3RvcnkuamF2YQ0KLW9yZ1xhcGFjaGVcYXhpczJcamF4d3NcYWRkcmVzc2Jvb2tccGFja2FnZS1pbmZvLmphdmENCi0NCi1UaGVzZSBmaWxlcyB3aWxsIGJlIGNvbXBpbGVkIGludG8gdGFyZ2V0L2NsYXNzZXMgYXMgcGFydCBvZiB0aGUgYnVpbGQuDQotDQotDQotU3RlcCAyOiBXcml0ZSBhIEpBWC1XUyBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBKQVhCIGFydGlmYWN0cw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1UaGUgc2ltcGxlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gd2lsbCBoYXZlIHR3byBtZXRob2RzIG9uIGl0Og0KLSAgICBwdWJsaWMgU3RyaW5nIGFkZEVudHJ5KFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIHBob25lLCBTdHJpbmcgc3RyZWV0LCBTdHJpbmcgY2l0eSwgU3RyaW5nIHN0YXRlKQ0KLSAgICBwdWJsaWMgQWRkcmVzc0Jvb2tFbnRyeSBmaW5kQnlMYXN0TmFtZShTdHJpbmcgbGFzdE5hbWUpDQotICAgIA0KLVRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmeSBhIEpBWC1XUyBTRUkuICBUaGUgcHVibGljIG1ldGhvZHMgb24gdGhlDQotaW1wbGVtZW50YXRpb24gd2lsbCBiZSBhbiBpbXBsaWNpdCBTRUkuICBTaW1wbHkgYnkgYWRkaW5nIGFuIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gdG8gdGhlIA0KLWltcGxlbWVudGF0aW9uIGNsYXNzIGl0IGJlY29tZXMgYSBKQVgtV1Mgd2ViIHNlcnZpY2UuICAgDQotDQotVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzOiBzcmNcb3JnXGFwYWNoZVxheGlzMlxqYXh3c1xhZGRyZXNzYm9va1xBZGRyZXNzQm9va0ltcGwuamF2YSAgDQotDQotVGhpcyBmaWxlIHdpbGwgYmUgY29tcGlsZWQgaW50byB0YXJnZXQvY2xhc3NlcyBhcyBwYXJ0IG9mIHRoZSBidWlsZC4NCi0NCi0NCi1TdGVwIDM6IFdyaXRlIGEgSkFYLVdTIERpc3BhdGNoIGNsaWVudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBzZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoZSBleHRyZW1lbHkgc2ltcGxlIERpc3BhdGNoIGNsaWVudCB3aWxsIGJlIGEgUGF5bG9hZCBtb2RlIFN0cmluZyBEaXNwYXRjaCBjbGllbnQsIG1lYW5pbmcgdGhhdA0KLWl0IHdpbGwgcHJvdmlkZSB0aGUgZXhhY3QgU09BUCBib2R5IHRvIHNlbmQgaW4gdGhlIHJlcXVlc3QgKFBheWxvYWQgbW9kZSkgYXMgYSBTdHJpbmcsIGFuZCBleHBlY3QgDQotdGhlIHJlc3BvbnNlIHRvIGJlIGEgU09BUCBib2R5IHJldHVybmVkIGFzIGEgU3RyaW5nLiAgSXQgd2lsbCBpbnZva2UgYm90aCBtZXRob2RzIG9uIHRoZSAgDQotc2VydmljZSBpbXBsZW5ldGF0aW9uJ3MgaW1wbGljaXQgU0VJLg0KLQ0KLVRoZSBkaXNwYXRjaCBjbGllbnQgY2xhc3MgaXM6IHNyY1xvcmdcYXBhY2hlXGF4aXMyXGpheHdzXGFkZHJlc3Nib29rXEFkZHJlc3NCb29rQ2xpZW50LmphdmENCi0NCi1UaGlzIGZpbGUgd2lsbCBiZSBjb21waWxlZCBpbnRvIHRhcmdldC9jbGFzc2VzIGFzIHBhcnQgb2YgdGhlIGJ1aWxkLg0KLQ0KLQ0KLVN0ZXAgNDogUnVuIHRoZSBEaXNwYXRjaCBjbGllbnQgYWdhaW5zdCB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBkZXBsb3llZCBpbiB0aGUgQXhpczIgc2VydmVyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0oYSkgU2V0dXAgeW91ciBlbnZpcm9ubWVudCB0byBydW4gdGhlIHNhbXBsZS4gIFlvdSB3aWxsIG5lZWQgdHdvIHdpbmRvd3MsIG9uZSBmb3IgdGhlIHNlcnZlcg0KLWFuZCBvbmUgZm9yIHRoZSBjbGllbnQuICBFYWNoIG5lZWRzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldDoNCi0tIEF4aXMyIGJpbmFyeSBkaXN0cmlidXRpb24uICBGb3IgZXhhbXBsZTogQVhJUzJfSE9NRT1DOlx0ZW1wXEF4aXMyXGF4aXMyLVNOQVBTSE9UDQotLSBKYXZhNSBKREsuICBGb3IgZXhhbXBsZTogSkFWQV9IT01FPWM6XGphdmFcamF2YTUgDQotDQotKGIpIENvcHkgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gSkFSIGZpbGUgZnJvbSB0aGUgc2FtcGxlIHRhcmdldCBkaXJlY3RvcnkgdG8gdGhlIGFwcHJvcHJpYXRlIA0KLUF4aXMyIHJlcG9zaXRvcnkgZGlyZWN0b3J5LCAlQVhJUzJfSE9NRSVccmVwb3NpdG9yeVxzZXJ2aWNlamFycy4gIE5vdGUgdGhhdCBKQVIgZmlsZXMgaW4gdGhpcyANCi1kaXJlY3Rvcnkgd2lsbCBiZSBkZXBsb3llZCBpbnRvIHRoZSBBeGlzMiBzaW1wbGUgc2VydmVyIHVzaW5nIG9ubHkgYW5ub3RhdGlvbnMgb24gY2xhc3NlcyANCi13aXRoaW4gdGhlIEpBUnM7IG5vIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyByZXF1aXJlZC4NCi0NCi1JZiB0aGUgcmVwb3NpdG9yeSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZSBpdCBmaXJzdCwgdGhlbiBjb3B5IHRoZSBzZXJ2aWNlIA0KLWltcGxlbWVudGF0aW9uIEpBUjoNCi0JbWtkaXIgJUFYSVMyX0hPTUUlXHJlcG9zaXRvcnlcc2VydmljZWphcnMNCi0JY29weSB0YXJnZXRcamF4d3MtYWRkcmVzc2Jvb2stU05BUFNIT1QuamFyICVBWElTMl9IT01FJVxyZXBvc2l0b3J5XHNlcnZpY2VqYXJzDQotDQotKGMpIFN0YXJ0IHRoZSBheGlzMiBzZXJ2ZXIuICBUaGlzIHdpbGwgZGVwbG95IHRoZSBKQVgtV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4NCi0JY2QgJUFYSVMyX0hPTUUlDQotCWJpblxheGlzMnNlcnZlci5iYXQNCi0NCi1Zb3Ugc2hvdWxkIHNlZSBhIG1lc3NhZ2Ugc3VjaCBhczoNCi1bSU5GT10gRGVwbG95aW5nIGFydGlmYWN0IDogamF4d3MtYWRkcmVzc2Jvb2stU05BUFNIT1QuamFyDQotW0lORk9dIERlcGxveWluZyBKQVhXUyBhbm5vdGF0ZWQgY2xhc3Mgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzYm9vay5BZGRyZXNzQm9va0ltcGwgYXMgYSBzZXJ2aWNlIC0gQWRkcmVzc0Jvb2tJbXBsU2VydmljZS5BZGRyZXNzQm9va0ltcGxQb3J0DQotDQotKGQpIEZyb20gYW5vdGhlciB3aW5kb3cgd2l0aCB0aGUgZW52aXJvbm1lbnQgc2V0dXAsIGluIHRoZSBqYXh3cy1hZGRyZXNzYm9vayBzYW1wbGVzIGRpcmVjdG9yeSBydW4gDQotdGhlIERpc3BhdGNoIGNsaWVudDoNCi0JamF2YSAtRGphdmEuZXh0LmRpcnM9JUFYSVMyX0hPTUUlXGxpYjslSkFWQV9IT01FJVxqcmVcbGliXGV4dCAtY3AgdGFyZ2V0L2NsYXNzZXMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5hZGRyZXNzYm9vay5BZGRyZXNzQm9va0NsaWVudC5jbGFzcyANCi0NCi0NCi1Zb3Ugc2hvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGluIHRoZSBjbGllbnQgd2luZG93Og0KLT4+IEludm9raW5nIHN5bmMgRGlzcGF0Y2ggZm9yIEFkZEVudHJ5DQotQWRkIEVudHJ5IHJlc3BvbnNlOiA8ZGx3bWluOmFkZEVudHJ5UmVzcG9uc2UgeG1sbnM6ZGx3bWluPSJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZy8iPjxyZXR1cm4geG1sbnM6bnMyDQotPSJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZyI+QWRkRW50cnkgQ29tcGxldGVkITwvcmV0dXJuPjwvZGx3bWluOmFkZEVudHJ5UmVzcG9uc2U+DQotPj4gSW52b2tpbmcgRGlzcGF0Y2ggZm9yIGZpbmRCeUxhc3ROYW1lDQotRmluZCByZXNwb25zZTogPGRsd21pbjpmaW5kQnlMYXN0TmFtZVJlc3BvbnNlIHhtbG5zOmRsd21pbj0iaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvIj48cmV0dXJuIHhtbG5zOm5zDQotMj0iaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciPjxmaXJzdE5hbWU+Zmlyc3ROYW1lPC9maXJzdE5hbWU+PGxhc3ROYW1lPmxhc3ROYW1lPC9sYXN0TmFtZT48cGhvbmU+cGhvbmU8DQotL3Bob25lPjxzdHJlZXQ+c3RyZWV0PC9zdHJlZXQ+PGNpdHk+Y2l0eTwvY2l0eT48c3RhdGU+c3RhdGU8L3N0YXRlPjwvcmV0dXJuPjwvZGx3bWluOmZpbmRCeUxhc3ROYW1lUmVzcG9uc2U+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9wb20ueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI4MGRiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtYWRkcmVzc2Jvb2svcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+amF4d3MtYWRkcmVzc2Jvb2s8L2FydGlmYWN0SWQ+DQotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+DQotICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8bmFtZT5KQVhXUyBBZGRyZXNzYm9vayBTZXJ2aWNlPC9uYW1lPg0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5Pg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+cmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1jbGllbnQtamFyPC9pZD4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+Y2xpZW50PC9jbGFzc2lmaWVyPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5jbGFzczwvZXhjbHVkZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW4tc291cmNlczwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NoZW1hLm91dHB1dC5iYXNlLmRpciIgdmFsdWU9InRhcmdldC9zY2hlbWEiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXIiIHZhbHVlPSIke3NjaGVtYS5vdXRwdXQuYmFzZS5kaXJ9L3NyYyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjaGVtYS5nZW5lcmF0ZWQuY2xhc3Nlcy5kaXIiDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7c2NoZW1hLm91dHB1dC5iYXNlLmRpcn0vY2xhc3NlcyIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBtYWtlIHRoZSBkaXJzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEub3V0cHV0LmJhc2UuZGlyfSIvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzY2hlbWEuZ2VuZXJhdGVkLnNyYy5kaXJ9Ii8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3NjaGVtYS5nZW5lcmF0ZWQuY2xhc3Nlcy5kaXJ9Ii8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJ1biBKQVhCIHNjaGVtYSBjb21waWxlciB3aXRoIGRlc2lnbmF0ZWQgc2NoZW1hcyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlY2hvPkdlbmVyYXRpbmcgamF2YSBmcm9tIGVjaG8ueHNkPC9lY2hvPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uc3VuLnRvb2xzLnhqYy5Ecml2ZXIiIGZvcms9InRydWUiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Im1hdmVuLnJ1bnRpbWUuY2xhc3NwYXRoIi8+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21waWxlZC5jbGFzc2VzLmRpcn0iLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJnIGxpbmU9Ii1kICR7c2NoZW1hLmdlbmVyYXRlZC5zcmMuZGlyfSBzcmMvQWRkcmVzc0Jvb2tFbnRyeS54c2QiLz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamF2YT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YWRkLXNvdXJjZXM8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXJlc291cmNlczwvcGhhc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGQtc291cmNlPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2Jhc2VkaXJ9L3RhcmdldC9zY2hlbWEvc3JjPC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1tMjwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnkvPC91cmw+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0gICAgPHBsdWdpblJlcG9zaXRvcmllcz4NCi0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbTI8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICA8L3BsdWdpblJlcG9zaXRvcmllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9zcmMvQWRkcmVzc0Jvb2tFbnRyeS54c2QgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9BZGRyZXNzQm9va0VudHJ5LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3ZTQ0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9BZGRyZXNzQm9va0VudHJ5LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZyINCi0gICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnIj4NCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRyZXNzQm9va0VudHJ5IiB0eXBlPSJ0bnM6QWRkcmVzc0Jvb2tFbnRyeSIvPg0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NCb29rRW50cnkiPg0KLSAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDphbnlUeXBlIj4NCi0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlyc3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imxhc3ROYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBob25lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVldCIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+DQotICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+DQotICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLTwveHNkOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWFhZmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzYm9vay9BZGRyZXNzQm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Nib29rOw0KLQ0KLS8qKg0KLSAqIFRoZSBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkuICANCi0gKiANCi0gKiBOT1RFOiBUaGUgU0VJIGlzIE5PVCBVU0VEIGluIHRoaXMgZXhhbXBsZS4gIFRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHB1Ymxpc2hpbmcgYWxsIHB1YmxpYw0KLSAqICAgICAgIG1ldGhvZHMgYXMgYW4gaW1wbGljaXQgU0VJLiANCi0gKi8NCi0NCi1wdWJsaWMgaW50ZXJmYWNlIEFkZHJlc3NCb29rIHsNCi0gICAgDQotICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIHBob25lLCBTdHJpbmcgc3RyZWV0LCBTdHJpbmcgY2l0eSwgU3RyaW5nIHN0YXRlKTsNCi0gICAgDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGZpbmRCeUxhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSk7DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtYWRkcmVzc2Jvb2svc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtYWRkcmVzc2Jvb2svc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvYWRkcmVzc2Jvb2svQWRkcmVzc0Jvb2tDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0MjliMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuYWRkcmVzc2Jvb2s7DQotDQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogU2ltcGxlIEpBWC1XUyBEaXNwYXRjaCBjbGllbnQgZm9yIHRoZSBhZGRyZXNzIGJvb2sgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWRkcmVzc0Jvb2tDbGllbnQgew0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnIjsNCi0gICAgcHJpdmF0ZSBzdGF0aWMgUU5hbWUgUU5BTUVfU0VSVklDRSA9IG5ldyBRTmFtZShOQU1FU1BBQ0UsICJzZXJ2aWNlIik7DQotICAgIHByaXZhdGUgc3RhdGljIFFOYW1lIFFOQU1FX1BPUlQgPSBuZXcgUU5hbWUoTkFNRVNQQUNFLCAicG9ydCIpOw0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRU5EUE9JTlRfVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzQm9va0ltcGxTZXJ2aWNlLkFkZHJlc3NCb29rSW1wbFBvcnQiOw0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQUREX0VOVFJZX0JPRFlfQ09OVEVOVFMgPSANCi0gICAgICAgICI8bnMxOmFkZEVudHJ5IHhtbG5zOm5zMT1cImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+IiArIA0KLSAgICAgICAgICAiPG5zMTpmaXJzdE5hbWUgeG1sbnM9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPm15Rmlyc3ROYW1lPC9uczE6Zmlyc3ROYW1lPiIgKyANCi0gICAgICAgICAgIjxuczE6bGFzdE5hbWUgeG1sbnM9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPm15TGFzdE5hbWU8L25zMTpsYXN0TmFtZT4iICsgDQotICAgICAgICAgICI8bnMxOnBob25lIHhtbG5zPVwiaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmdcIj5teVBob25lPC9uczE6cGhvbmU+IiArIA0KLSAgICAgICAgICAiPG5zMTpzdHJlZXQgeG1sbnM9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPm15U3RyZWV0PC9uczE6c3RyZWV0PiIgKyANCi0gICAgICAgICAgIjxuczE6Y2l0eSB4bWxucz1cImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+bXlDaXR5PC9uczE6Y2l0eT4iICsgDQotICAgICAgICAgICI8bnMxOnN0YXRlIHhtbG5zPVwiaHR0cDovL2FkZHJlc3Nib29rLmpheHdzLmF4aXMyLmFwYWNoZS5vcmdcIj5teVN0YXRlPC9uczE6c3RhdGU+IiArIA0KLSAgICAgICAgIjwvbnMxOmFkZEVudHJ5PiI7DQotICAgIA0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgRklORF9CT0RZX0NPTlRFTlRTID0gDQotICAgICAgICAiPG5zMTpmaW5kQnlMYXN0TmFtZSB4bWxuczpuczE9XCJodHRwOi8vYWRkcmVzc2Jvb2suamF4d3MuYXhpczIuYXBhY2hlLm9yZ1wiPiIgKw0KLSAgICAgICAgICAiPG5zMTpsYXN0TmFtZSB4bWxucz1cImh0dHA6Ly9hZGRyZXNzYm9vay5qYXh3cy5heGlzMi5hcGFjaGUub3JnXCI+bXlMYXN0TmFtZTwvbnMxOmxhc3ROYW1lPiIgKyAgICAgICAgDQotICAgICAgICAiPC9uczE6ZmluZEJ5TGFzdE5hbWU+IjsNCi0gICAgDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0NsaWVudCAuLi4iKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBTZXJ2aWNlIHN2YyA9IFNlcnZpY2UuY3JlYXRlKFFOQU1FX1NFUlZJQ0UpOw0KLSAgICAgICAgICAgIHN2Yy5hZGRQb3J0KFFOQU1FX1BPUlQsIG51bGwsIEVORFBPSU5UX1VSTCk7DQotDQotICAgICAgICAgICAgLy8gQSBEaXNwYXRjaDxTdHJpbmc+IGNsaWVudCBzZW5kcyB0aGUgcmVxdWVzdCBhbmQgcmVjZWl2ZXMgdGhlIHJlc3BvbnNlIGFzIA0KLSAgICAgICAgICAgIC8vIFN0cmluZ3MuICBTaW5jZSBpdCBpcyBQQVlMT0FEIG1vZGUsIHRoZSBjbGllbnQgd2lsbCBwcm92aWRlIHRoZSBTT0FQIGJvZHkgdG8gYmUgDQotICAgICAgICAgICAgLy8gc2VudDsgdGhlIFNPQVAgZW52ZWxvcGUgYW5kIGFueSByZXF1aXJlZCBTT0FQIGhlYWRlcnMgd2lsbCBiZSBhZGRlZCBieSBKQVgtV1MuDQotICAgICAgICAgICAgRGlzcGF0Y2g8U3RyaW5nPiBkaXNwYXRjaCA9IHN2Yy5jcmVhdGVEaXNwYXRjaChRTkFNRV9QT1JULCANCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOw0KLSAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAvLyBJbnZva2UgdGhlIERpc3BhdGNoDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBzeW5jIERpc3BhdGNoIGZvciBBZGRFbnRyeSIpOw0KLSAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGRpc3BhdGNoLmludm9rZShBRERfRU5UUllfQk9EWV9DT05URU5UUyk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGQgRW50cnkgcmVzcG9uc2U6ICIgKyByZXNwb25zZSk7DQotICAgICAgICAgICAgDQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBJbnZva2luZyBEaXNwYXRjaCBmb3IgZmluZEJ5TGFzdE5hbWUiKTsNCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UyID0gZGlzcGF0Y2guaW52b2tlKEZJTkRfQk9EWV9DT05URU5UUyk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5kIHJlc3BvbnNlOiAiICsgcmVzcG9uc2UyKTsNCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSk7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1hZGRyZXNzYm9vay9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9hZGRyZXNzYm9vay9BZGRyZXNzQm9va0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNjAxZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWFkZHJlc3Nib29rL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2FkZHJlc3Nib29rL0FkZHJlc3NCb29rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3Nib29rOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiBKQVgtV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgYW5kIGltcGxpY2l0IFNFSSByYXRoZXIgdGhhbiBhbiBleHBsaWNpdCBTRUkuICBBbg0KLSAqIGltcGxpY2l0IFNFSSBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIEBXZWJTZXJ2aWNlLmVuZHBvaW50SW50ZXJmYWNlIGVsZW1lbnQgc3BlY2lmaWVkLiAgVGhpcyBtZWFucw0KLSAqIHRoYXQgYWxsIHB1YmxpYyBtZXRob2RzIG9uIHRoZSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNvbXByaXNlIGFuIGltcGxpY2l0IFNFSS4NCi0gKi8NCi0NCi0vLyBTaW1wbHkgYWRkaW5nIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uIG1ha2VzIHRoaXMgYSBKQVgtV1Mgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4NCi1AV2ViU2VydmljZQ0KLXB1YmxpYyBjbGFzcyBBZGRyZXNzQm9va0ltcGwgIHsNCi0NCi0gICAgcHVibGljIFN0cmluZyBhZGRFbnRyeShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUsIFN0cmluZyBwaG9uZSwgU3RyaW5nIHN0cmVldCwgU3RyaW5nIGNpdHksIFN0cmluZyBzdGF0ZSkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0ltcGwuYWRkRW50cnkiKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkgPSBuZXcgQWRkcmVzc0Jvb2tFbnRyeSgpOw0KLSAgICAgICAgZW50cnkuc2V0Rmlyc3ROYW1lKGZpcnN0TmFtZSk7DQotICAgICAgICBlbnRyeS5zZXRMYXN0TmFtZShsYXN0TmFtZSk7DQotICAgICAgICBlbnRyeS5zZXRQaG9uZShwaG9uZSk7DQotICAgICAgICBlbnRyeS5zZXRTdHJlZXQoc3RyZWV0KTsNCi0gICAgICAgIGVudHJ5LnNldENpdHkoY2l0eSk7DQotICAgICAgICBlbnRyeS5zZXRTdGF0ZShzdGF0ZSk7DQotICAgICAgICByZXR1cm4gIkFkZEVudHJ5IENvbXBsZXRlZCEiOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBBZGRyZXNzQm9va0VudHJ5IGZpbmRCeUxhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0ltcGwuZmluZEJ5TGFzdE5hbWUiKTsNCi0gICAgICAgIEFkZHJlc3NCb29rRW50cnkgZW50cnkgPSBuZXcgQWRkcmVzc0Jvb2tFbnRyeSgpOyANCi0gICAgICAgIGVudHJ5LnNldEZpcnN0TmFtZSgiZmlyc3ROYW1lIik7DQotICAgICAgICBlbnRyeS5zZXRMYXN0TmFtZSgibGFzdE5hbWUiKTsNCi0gICAgICAgIGVudHJ5LnNldFBob25lKCJwaG9uZSIpOw0KLSAgICAgICAgZW50cnkuc2V0U3RyZWV0KCJzdHJlZXQiKTsNCi0gICAgICAgIGVudHJ5LnNldENpdHkoImNpdHkiKTsNCi0gICAgICAgIGVudHJ5LnNldFN0YXRlKCJzdGF0ZSIpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGRyZXNzQm9va0ltcGwuZmluZEJ5TGFzdE5hbWUgcmV0dXJuaW5nICIgKyBlbnRyeSk7DQotICAgICAgICByZXR1cm4gZW50cnk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwNDc3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLVNhbXBsZTogSkFYV1MtQ2FsY3VsYXRvcgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLVRoaXMgaXMgYW4gZXhhbXBsZSBKQVhXUyBXZWIgc2VydmljZS4gSXQgc2hvd3MgaG93IHRvIGV4cG9zZSB0aGUgbWV0aG9kcyBvZiBhIGNsYXNzIGFzIGEgSkFYV1MgV2ViCi1zZXJ2aWNlIHVzaW5nIEF4aXMyLgotCi0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlCi09PT09PT09PT09PT09PT09PT09PQotCi1UbyBidWlsZCB0aGUgc2FtcGxlIHNlcnZpY2UsIHR5cGU6IG12biBjbGVhbiBpbnN0YWxsCi0KLVRoaXMgd2lsbCBidWlsZCB0aGUgamF4d3MtY2FsY3VsYXRvci5qYXIgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgYW5kIGNvcHkgaXQgdG8gdGhlCi08QVhJUzJfSE9NRT4vcmVwb3NpdG9yeS9zZXJ2aWNlamFycyBkaXJlY3RvcnkgKGNyZWF0ZSB0aGF0IGRpcmVjdG9yeSBpZiBpdCdzIG5vdCB5ZXQgY3JlYXRlZCkKLQotWW91IGNhbiBzdGFydCB0aGUgQXhpczIgc2VydmVyIGJ5IHJ1bm5pbmcgZWl0aGVyIGF4aXMyc2VydmVyLmJhdCAob24gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2gKLShvbiBMaW51eCl0aGF0IGFyZSBsb2NhdGVkIGluIDxBWElTMl9IT01FPi9iaW4gZGlyZWN0b3J5LgotCi1UaGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoKLQotaHR0cDovLzx5b3VyaG9zdD46PHlvdXJwb3J0Pi9heGlzMi9zZXJ2aWNlcy9DYWxjdWxhdG9yU2VydmljZS5DYWxjdWxhdG9yU2VydmljZVBvcnQ/d3NkbAotKGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9DYWxjdWxhdG9yU2VydmljZS5DYWxjdWxhdG9yU2VydmljZVBvcnQ/d3NkbCkKLQotCi1SdW5uaW5nIHRoZSBDbGllbnQKLT09PT09PT09PT09PT09PT09PQotCi0xLiBTZXQgdXAgYSBDTEFTU1BBVEggd2l0aCB0aGUgZm9sbG93aW5nIAotLSBhbGwgdGhlIGphcnMgaW4gPEFYSVMyX0hPTUUvbGliPgotLSB0aGUgamF4d3MtY2FsY3VsYXRvci1TTkFQU0hPVC1jbGllbnQuamFyIHVuZGVyIHRoZSB0YXJnZXQgZGlyZWN0b3J5Ci0tIGFkZHJlc3NpbmcgbWFyIGluIDxBWElTMl9IT01FL3JlcG9zaXRvcnkvbW9kdWxlcz4KLQotMi4gUnVuIHRoZSBjbGllbnQgdXNpbmcgc2F5ICJqYXZhIC1jbGFzc3BhdGggJUNMQVNTUEFUSCUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGRTRUlDbGllbnQgMyAzMyIKLQotSGVscAotPT09PQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuCi0KLUltcHJvdmVtZW50cwotPT09PT09PT09PT09Ci1NYWtlIHRoaXMgc2FtcGxlIHJ1biBwb3NzaWJsZSB3aXRoIGFudCAKLQotCi0qKioqIFdBUk5JTkcgKioqKgotUGxlYXNlIFJlbW92ZSB4YWxhbiBqYXIgZnJvbSA8QVhJUzJfSE9NRT4vIGJlZm9yZSB5b3Ugc3RhcnQgYXhpczIgc2VydmVyLiBJZiB5b3UgYXJlIHVzaW5nIHRoaXMKLXNhbXBsZSBpbnNpZGUgYSBXQVIsIHBsZWFzZSByZW1vdmUgeGFsYW4gamFyIGZyb20gV0VCLUlORi9saWIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9wb20ueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDZiNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5qYXh3cy1jYWxjdWxhdG9yPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPG5hbWU+SkFYV1MgQ2FsY3VsYXRvciBTZXJ2aWNlPC9uYW1lPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnJlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPmNsaWVudDwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL2NsaWVudC8qPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLW0yPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnkvPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLSAgICA8cGx1Z2luUmVwb3NpdG9yaWVzPgotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbTI8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPm1hdmVuMjwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvcmVzb3VyY2VzL01FVEEtSU5GL0NhbGN1bGF0b3JTZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvcmVzb3VyY2VzL01FVEEtSU5GL0NhbGN1bGF0b3JTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NmVkMjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3Jlc291cmNlcy9NRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgotPGRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2UiCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYT4KLSAgICAgICAgICAgIDx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJDYWxjdWxhdG9yU2VydmljZV9zY2hlbWExLnhzZCIvPgotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJnZXRUaWNrZXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6Z2V0VGlja2V0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImdldFRpY2tldFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFRpY2tldFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImFkZCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczphZGQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iYWRkUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6YWRkUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iQWRkTnVtYmVyc0V4Y2VwdGlvbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6QWRkTnVtYmVyc0V4Y2VwdGlvbiIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iQ2FsY3VsYXRvciI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0VGlja2V0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6Z2V0VGlja2V0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRUaWNrZXRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJhZGQiPgotICAgICAgICAgICAgPGlucHV0IHdzYXc6QWN0aW9uPSJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnL2FkZCIgbWVzc2FnZT0idG5zOmFkZCIvPgotICAgICAgICAgICAgPG91dHB1dCB3c2F3OkFjdGlvbj0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZy9hZGRSZXNwb25zZSIgbWVzc2FnZT0idG5zOmFkZFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbWVzc2FnZT0idG5zOkFkZE51bWJlcnNFeGNlcHRpb24iIG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmcvYWRkRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJDYWxjdWxhdG9yU2VydmljZVBvcnRCaW5kaW5nIiB0eXBlPSJ0bnM6Q2FsY3VsYXRvciI+Ci0gICAgICAgIDx3c2F3OlVzaW5nQWRkcmVzc2luZy8+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFRpY2tldCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iYWRkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IkNhbGN1bGF0b3JTZXJ2aWNlIj4KLSAgICAgICAgPHBvcnQgbmFtZT0iQ2FsY3VsYXRvclNlcnZpY2VQb3J0IiBiaW5kaW5nPSJ0bnM6Q2FsY3VsYXRvclNlcnZpY2VQb3J0QmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJSRVBMQUNFX1dJVEhfQUNUVUFMX1VSTCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3Jlc291cmNlcy9NRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZV9zY2hlbWExLnhzZCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9yZXNvdXJjZXMvTUVUQS1JTkYvQ2FsY3VsYXRvclNlcnZpY2Vfc2NoZW1hMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YWZmMTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3Jlc291cmNlcy9NRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZV9zY2hlbWExLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KLTx4czpzY2hlbWEgdmVyc2lvbj0iMS4wIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciCi0gICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICB4bWxuczpuczE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyI+Ci0KLSAgICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC9hZGRyZXNzaW5nIgotICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDMvYWRkcmVzc2luZy93cy1hZGRyLnhzZCIvPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iQWRkTnVtYmVyc0V4Y2VwdGlvbiIgdHlwZT0idG5zOkFkZE51bWJlcnNFeGNlcHRpb24iLz4KLQotICAgIDx4czplbGVtZW50IG5hbWU9ImFkZCIgdHlwZT0idG5zOmFkZCIvPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYWRkUmVzcG9uc2UiIHR5cGU9InRuczphZGRSZXNwb25zZSIvPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VGlja2V0IiB0eXBlPSJ0bnM6Z2V0VGlja2V0Ii8+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJnZXRUaWNrZXRSZXNwb25zZSIgdHlwZT0idG5zOmdldFRpY2tldFJlc3BvbnNlIi8+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0Ij4KLSAgICAgICAgPHhzOnNlcXVlbmNlLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFRpY2tldFJlc3BvbnNlIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJuczE6RW5kcG9pbnRSZWZlcmVuY2VUeXBlIiBmb3JtPSJxdWFsaWZpZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUxIiB0eXBlPSJ4czppbnQiIGZvcm09InF1YWxpZmllZCIvPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUyIiB0eXBlPSJ4czppbnQiIGZvcm09InF1YWxpZmllZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iYWRkUmVzcG9uc2UiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzOmludCIgZm9ybT0icXVhbGlmaWVkIi8+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBZGROdW1iZXJzRXhjZXB0aW9uIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWRiMDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotCi0vKioKLSAqIDxwPkphdmEgY2xhc3MgZm9yIGFkZCBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJhZGQiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idmFsdWUxIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9aW50Ii8+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InZhbHVlMiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWludCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gImFkZCIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInZhbHVlMSIsCi0gICAgICAgICJ2YWx1ZTIiCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgQWRkIHsKLQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWUxOwotICAgIHByb3RlY3RlZCBpbnQgdmFsdWUyOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlMSBwcm9wZXJ0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlMSgpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUxIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlMShpbnQgdmFsdWUpIHsKLSAgICAgICAgdGhpcy52YWx1ZTEgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFsdWUyIHByb3BlcnR5LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUyKCkgewotICAgICAgICByZXR1cm4gdmFsdWUyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZTIgcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUyKGludCB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlMiA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjRiMzI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZE51bWJlcnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIEFkZE51bWJlcnNFeGNlcHRpb24gY29tcGxleCB0eXBlLg0KLSAqIDxwLz4NCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIDxwLz4NCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGROdW1iZXJzRXhjZXB0aW9uIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4NCi0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPg0KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPg0KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4NCi0gKiAmbHQ7L2NvbXBsZXhUeXBlPg0KLSAqIDwvcHJlPg0KLSAqLw0KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkNCi1AWG1sVHlwZShuYW1lID0gIkFkZE51bWJlcnNFeGNlcHRpb24iLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAibWVzc2FnZSINCi0gICAgICAgIH0pDQotcHVibGljIGNsYXNzIEFkZE51bWJlcnNFeGNlcHRpb24gew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiIikNCi0gICAgcHJvdGVjdGVkIFN0cmluZyBtZXNzYWdlOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7DQotICAgICAgICByZXR1cm4gbWVzc2FnZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lc3NhZ2UgcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcw0KLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIFN0cmluZyB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZE51bWJlcnNFeGNlcHRpb25fRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjNkNGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0NCi1AV2ViRmF1bHQobmFtZSA9ICJBZGROdW1iZXJzRXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgICAgZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBZGROdW1iZXJzRXhjZXB0aW9uIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0V4Y2VwdGlvbiBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFkZE51bWJlcnNFeGNlcHRpb24gZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGROdW1iZXJzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZFJlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9BZGRSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTMwMDk2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0FkZFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBhZGRSZXNwb25zZSBjb21wbGV4IHR5cGUuCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJhZGRSZXNwb25zZSI+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1pbnQiLz4KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KLSAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICZsdDsvY29tcGxleFR5cGU+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICJhZGRSZXNwb25zZSIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgIl9yZXR1cm4iCi0gICAgICAgIH0pCi1wdWJsaWMgY2xhc3MgQWRkUmVzcG9uc2UgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQotICAgIHByb3RlY3RlZCBpbnQgX3JldHVybjsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSZXR1cm4oKSB7Ci0gICAgICAgIHJldHVybiBfcmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKGludCB2YWx1ZSkgewotICAgICAgICB0aGlzLl9yZXR1cm4gPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3ZTdjMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIkNhbGN1bGF0b3IiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi1AWG1sU2VlQWxzbyh7Ci0gICAgICAgIE9iamVjdEZhY3RvcnkuY2xhc3MKLSAgICAgICAgfSkKLXB1YmxpYyBpbnRlcmZhY2UgQ2FsY3VsYXRvciB7Ci0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZAotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0VGlja2V0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLkdldFRpY2tldCIpCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuR2V0VGlja2V0UmVzcG9uc2UiKQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBnZXRUaWNrZXQoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWx1ZTEKLSAgICAgKiBAcGFyYW0gdmFsdWUyCi0gICAgICogQHJldHVybiByZXR1cm5zIGludAotICAgICAqIEB0aHJvd3MgQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kCi0gICAgQFdlYlJlc3VsdCh0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuQWRkIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGRSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5BZGRSZXNwb25zZSIpCi0gICAgcHVibGljIGludCBhZGQoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJ2YWx1ZTEiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIpCi0gICAgICAgICAgICBpbnQgdmFsdWUxLAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAidmFsdWUyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQotICAgICAgICAgICAgaW50IHZhbHVlMikKLSAgICAgICAgICAgIHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbgotICAgICAgICAgICAgOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yU2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzk1M2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvQ2FsY3VsYXRvclNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOw0KLQ0KLWltcG9ydCBqYXZheC54bWwud3MuRW5kcG9pbnQ7DQotDQotcHVibGljIGNsYXNzIENhbGN1bGF0b3JTZXJ2ZXJ7DQotDQotICAgIHByb3RlY3RlZCBDYWxjdWxhdG9yU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIFNlcnZlciIpOw0KLSAgICAgICAgT2JqZWN0IGltcGxlbWVudG9yID0gbmV3IENhbGN1bGF0b3JTZXJ2aWNlKCk7DQotICAgICAgICBTdHJpbmcgYWRkcmVzcyA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQ2FsY3VsYXRvclNlcnZpY2UuQ2FsY3VsYXRvclNlcnZpY2VQb3J0IjsNCi0gICAgICAgIEVuZHBvaW50LnB1Ymxpc2goYWRkcmVzcywgaW1wbGVtZW50b3IpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsgDQotICAgICAgICBuZXcgQ2FsY3VsYXRvclNlcnZlcigpOw0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgcmVhZHkuLi4iKTsgICAgICAgICANCi0gICAgICAgIFRocmVhZC5zbGVlcChJbnRlZ2VyLk1BWF9WQUxVRSk7IA0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgZXhpdHRpbmciKTsNCi0gICAgICAgIFN5c3RlbS5leGl0KDApOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9DYWxjdWxhdG9yU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlhOTNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3Npbmc7Ci1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotQEFkZHJlc3NpbmcKLUBXZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5DYWxjdWxhdG9yIiwKLSAgICAgICAgc2VydmljZU5hbWUgPSAiQ2FsY3VsYXRvclNlcnZpY2UiLAotICAgICAgICBwb3J0TmFtZSA9ICJDYWxjdWxhdG9yU2VydmljZVBvcnQiLAotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJNRVRBLUlORi9DYWxjdWxhdG9yU2VydmljZS53c2RsIikKLXB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yU2VydmljZSBpbXBsZW1lbnRzIENhbGN1bGF0b3IgewotCi0gICAgQFJlc291cmNlCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ29udGV4dCBjb250ZXh0OwotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLkNhbGN1bGF0b3IjZ2V0VGlja2V0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZ2V0VGlja2V0KCkgewotICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotCi0gICAgICAgICAgICBlbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIlRpY2tldElkIik7Ci0gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIxMjM0NTY3ODkiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gcGNlKSB7Ci0gICAgICAgICAgICAvLyBQYXJzZXIgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucyBjYW4ndCBiZSBidWlsdAotICAgICAgICAgICAgcGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgdGlja2V0LiIsIHBjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gKFczQ0VuZHBvaW50UmVmZXJlbmNlKSBnZXRDb250ZXh0KCkuZ2V0RW5kcG9pbnRSZWZlcmVuY2UoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLkNhbGN1bGF0b3IjYWRkKGludCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgYWRkKGludCB2YWx1ZTEsIGludCB2YWx1ZTIpIHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBnZXRDb250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuUkVGRVJFTkNFX1BBUkFNRVRFUlMpOwotCi0gICAgICAgIGlmIChsaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQWRkTnVtYmVyc0V4Y2VwdGlvbiBmYXVsdEluZm8gPSBuZXcgQWRkTnVtYmVyc0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgZmF1bHRJbmZvLnNldE1lc3NhZ2UoIk5vIHRpY2tldCBmb3VuZC4iKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbihmYXVsdEluZm8uZ2V0TWVzc2FnZSgpLCBmYXVsdEluZm8pOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBsaXN0LmdldCgwKTsKLQotICAgICAgICBpZiAoISIxMjM0NTY3ODkiLmVxdWFscyhlbGVtZW50LmdldFRleHRDb250ZW50KCkpKSB7Ci0gICAgICAgICAgICBBZGROdW1iZXJzRXhjZXB0aW9uIGZhdWx0SW5mbyA9IG5ldyBBZGROdW1iZXJzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBmYXVsdEluZm8uc2V0TWVzc2FnZSgiSW52YWxpZCB0aWNrZXQ6ICIgKyBlbGVtZW50LmdldFRleHRDb250ZW50KCkpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEFkZE51bWJlcnNFeGNlcHRpb25fRXhjZXB0aW9uKGZhdWx0SW5mby5nZXRNZXNzYWdlKCksIGZhdWx0SW5mbyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInZhbHVlMTogIiArIHZhbHVlMSArICIgdmFsdWUyOiAiICsgdmFsdWUyKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlMSArIHZhbHVlMjsKLSAgICB9Ci0KLSAgICAvL1JldHVybiB0aGUgV2ViU2VydmljZUNvbnRleHQKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9HZXRUaWNrZXQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0dldFRpY2tldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmE5NWZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0dldFRpY2tldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoNCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvcjsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldFRpY2tldCBjb21wbGV4IHR5cGUuDQotICogPHAvPg0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogPHAvPg0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9ImdldFRpY2tldCI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZ2V0VGlja2V0IikNCi1wdWJsaWMgY2xhc3MgR2V0VGlja2V0IHsNCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvR2V0VGlja2V0UmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL0dldFRpY2tldFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNTEyODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvR2V0VGlja2V0UmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldFRpY2tldFJlc3BvbnNlIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0UmVzcG9uc2UiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ31FbmRwb2ludFJlZmVyZW5jZVR5cGUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAiX3JldHVybiINCi0gICAgICAgIH0pDQotcHVibGljIGNsYXNzIEdldFRpY2tldFJlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQ0KLSAgICBwcm90ZWN0ZWQgVzNDRW5kcG9pbnRSZWZlcmVuY2UgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIFczQ0VuZHBvaW50UmVmZXJlbmNlIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBnZXRSZXR1cm4oKSB7DQotICAgICAgICByZXR1cm4gX3JldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJldHVybiBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2UgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKFczQ0VuZHBvaW50UmVmZXJlbmNlIHZhbHVlKSB7DQotICAgICAgICB0aGlzLl9yZXR1cm4gPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9PYmplY3RGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZDBjMzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaAotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50IHBhY2thZ2UuCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5Ci0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbgotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwKLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcwotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1AWG1sUmVnaXN0cnkKLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9HZXRUaWNrZXRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiZ2V0VGlja2V0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0FkZF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJhZGQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiYWRkUmVzcG9uc2UiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfR2V0VGlja2V0UmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiZ2V0VGlja2V0UmVzcG9uc2UiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkTnVtYmVyc0V4Y2VwdGlvbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsICJBZGROdW1iZXJzRXhjZXB0aW9uIik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFkZCB9Ci0gICAgICovCi0gICAgcHVibGljIEFkZCBjcmVhdGVBZGQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWRkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGRSZXNwb25zZSB9Ci0gICAgICovCi0gICAgcHVibGljIEFkZFJlc3BvbnNlIGNyZWF0ZUFkZFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEFkZFJlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGROdW1iZXJzRXhjZXB0aW9uIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBjcmVhdGVBZGROdW1iZXJzRXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEFkZE51bWJlcnNFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEdldFRpY2tldCB9Ci0gICAgICovCi0gICAgcHVibGljIEdldFRpY2tldCBjcmVhdGVHZXRUaWNrZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgR2V0VGlja2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBHZXRUaWNrZXRSZXNwb25zZSB9Ci0gICAgICovCi0gICAgcHVibGljIEdldFRpY2tldFJlc3BvbnNlIGNyZWF0ZUdldFRpY2tldFJlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gbmV3IEdldFRpY2tldFJlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEdldFRpY2tldCB9e0Bjb2RlID59fQotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8R2V0VGlja2V0PiBjcmVhdGVHZXRUaWNrZXQoR2V0VGlja2V0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8R2V0VGlja2V0PihfR2V0VGlja2V0X1FOQU1FLCBHZXRUaWNrZXQuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQWRkIH17QGNvZGUgPn19Ci0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgbmFtZSA9ICJhZGQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxBZGQ+IGNyZWF0ZUFkZChBZGQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxBZGQ+KF9BZGRfUU5BTUUsIEFkZC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBBZGRSZXNwb25zZSB9e0Bjb2RlID59fQotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiYWRkUmVzcG9uc2UiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxBZGRSZXNwb25zZT4gY3JlYXRlQWRkUmVzcG9uc2UoQWRkUmVzcG9uc2UgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxBZGRSZXNwb25zZT4oX0FkZFJlc3BvbnNlX1FOQU1FLCBBZGRSZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBHZXRUaWNrZXRSZXNwb25zZSB9e0Bjb2RlID59fQotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxHZXRUaWNrZXRSZXNwb25zZT4gY3JlYXRlR2V0VGlja2V0UmVzcG9uc2UoR2V0VGlja2V0UmVzcG9uc2UgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxHZXRUaWNrZXRSZXNwb25zZT4oX0dldFRpY2tldFJlc3BvbnNlX1FOQU1FLCBHZXRUaWNrZXRSZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBBZGROdW1iZXJzRXhjZXB0aW9uIH17QGNvZGUgPn19Ci0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgbmFtZSA9ICJBZGROdW1iZXJzRXhjZXB0aW9uIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QWRkTnVtYmVyc0V4Y2VwdGlvbj4gY3JlYXRlQWRkTnVtYmVyc0V4Y2VwdGlvbihBZGROdW1iZXJzRXhjZXB0aW9uIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QWRkTnVtYmVyc0V4Y2VwdGlvbj4oX0FkZE51bWJlcnNFeGNlcHRpb25fUU5BTUUsIEFkZE51bWJlcnNFeGNlcHRpb24uY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWExMzcyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgYWRkIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iYWRkIj4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJ2YWx1ZTEiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1pbnQiLz4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InZhbHVlMiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWludCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiYWRkIiwgcHJvcE9yZGVyID0gew0KLSAgICAgICAgInZhbHVlMSIsDQotICAgICAgICAidmFsdWUyIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgQWRkIHsNCi0NCi0gICAgcHJvdGVjdGVkIGludCB2YWx1ZTE7DQotICAgIHByb3RlY3RlZCBpbnQgdmFsdWUyOw0KLQ0KLSAgICAvKioNCi0gICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlMSBwcm9wZXJ0eS4NCi0gICAgICovDQotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUxKCkgew0KLSAgICAgICAgcmV0dXJuIHZhbHVlMTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhbHVlMSBwcm9wZXJ0eS4NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlMShpbnQgdmFsdWUpIHsNCi0gICAgICAgIHRoaXMudmFsdWUxID0gdmFsdWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZTIgcHJvcGVydHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGdldFZhbHVlMigpIHsNCi0gICAgICAgIHJldHVybiB2YWx1ZTI7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZTIgcHJvcGVydHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZTIoaW50IHZhbHVlKSB7DQotICAgICAgICB0aGlzLnZhbHVlMiA9IHZhbHVlOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQWRkTnVtYmVyc0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMzOTdhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSoNCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotKiB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgQWRkTnVtYmVyc0V4Y2VwdGlvbiBjb21wbGV4IHR5cGUuDQotICogPHAvPg0KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuDQotICogPHAvPg0KLSAqIDxwcmU+DQotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZE51bWJlcnNFeGNlcHRpb24iPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im1lc3NhZ2UiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiQWRkTnVtYmVyc0V4Y2VwdGlvbiIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJtZXNzYWdlIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgQWRkTnVtYmVyc0V4Y2VwdGlvbiB7DQotDQotICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICIiKQ0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7DQotDQotICAgIC8qKg0KLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMNCi0gICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsNCi0gICAgICAgIHJldHVybiBtZXNzYWdlOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZSBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgU3RyaW5nIH0NCi0gICAgICovDQotICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIHZhbHVlKSB7DQotICAgICAgICB0aGlzLm1lc3NhZ2UgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFjZDMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoNCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJGYXVsdDsNCi0NCi0NCi1AV2ViRmF1bHQobmFtZSA9ICJBZGROdW1iZXJzRXhjZXB0aW9uIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLXB1YmxpYyBjbGFzcyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgICAgZXh0ZW5kcyBFeGNlcHRpb24gew0KLQ0KLSAgICAvKioNCi0gICAgICogSmF2YSB0eXBlIHRoYXQgZ29lcyBhcyBzb2FwZW52OkZhdWx0IGRldGFpbCBlbGVtZW50Lg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBBZGROdW1iZXJzRXhjZXB0aW9uIGZhdWx0SW5mbzsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICovDQotICAgIHB1YmxpYyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgQWRkTnVtYmVyc0V4Y2VwdGlvbiBmYXVsdEluZm8pIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOw0KLSAgICAgICAgdGhpcy5mYXVsdEluZm8gPSBmYXVsdEluZm87DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBmYXVsdEluZm8NCi0gICAgICogQHBhcmFtIG1lc3NhZ2UNCi0gICAgICogQHBhcmFtIGNhdXNlDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbl9FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIEFkZE51bWJlcnNFeGNlcHRpb24gZmF1bHRJbmZvLCBUaHJvd2FibGUgY2F1c2UpIHsNCi0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsNCi0gICAgICAgIHRoaXMuZmF1bHRJbmZvID0gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcmV0dXJuIHJldHVybnMgZmF1bHQgYmVhbjogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGROdW1iZXJzRXhjZXB0aW9uDQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBnZXRGYXVsdEluZm8oKSB7DQotICAgICAgICByZXR1cm4gZmF1bHRJbmZvOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGRSZXNwb25zZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWQ3NjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSoNCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotKiB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ow0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgYWRkUmVzcG9uc2UgY29tcGxleCB0eXBlLg0KLSAqIDxwLz4NCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLg0KLSAqIDxwLz4NCi0gKiA8cHJlPg0KLSAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJhZGRSZXNwb25zZSI+DQotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+DQotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+DQotICogICAgICAgJmx0O3NlcXVlbmNlPg0KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9aW50Ii8+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJhZGRSZXNwb25zZSIsIHByb3BPcmRlciA9IHsNCi0gICAgICAgICJfcmV0dXJuIg0KLSAgICAgICAgfSkNCi1wdWJsaWMgY2xhc3MgQWRkUmVzcG9uc2Ugew0KLQ0KLSAgICBAWG1sRWxlbWVudChuYW1lID0gInJldHVybiIpDQotICAgIHByb3RlY3RlZCBpbnQgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuDQotICAgICAqLw0KLSAgICBwdWJsaWMgaW50IGdldFJldHVybigpIHsNCi0gICAgICAgIHJldHVybiBfcmV0dXJuOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmV0dXJuIHByb3BlcnR5Lg0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKGludCB2YWx1ZSkgew0KLSAgICAgICAgdGhpcy5fcmV0dXJuID0gdmFsdWU7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFNFSUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0FkZFNFSUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTVkYTFjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9BZGRTRUlDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLndzYWRkcmVzc2luZy5XM0NFbmRwb2ludFJlZmVyZW5jZTsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkU0VJQ2xpZW50IHsNCi0NCi0gICAgLyoqDQotICAgICAqIEBwYXJhbSBhcmdzDQotICAgICAqLw0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7DQotDQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIC8vVmFsaWRhdGUgaW5wdXQNCi0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMikNCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNhZ2U6IGphdmEgQWRkQ2xpZW50IDxpbnRlZ2VyIDE+IDxpbnRlZ2VyIDI+Iik7DQotDQotICAgICAgICAgICAgaW50IHZhbHVlMCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSk7DQotICAgICAgICAgICAgaW50IHZhbHVlMSA9IEludGVnZXIucGFyc2VJbnQoYXJnc1sxXSk7DQotDQotICAgICAgICAgICAgLy9SZXRyaWV2ZSB0aWNrZXQNCi0gICAgICAgICAgICBDYWxjdWxhdG9yU2VydmljZSBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3JTZXJ2aWNlKCk7DQotICAgICAgICAgICAgQ2FsY3VsYXRvciBwb3J0MSA9IHNlcnZpY2UuZ2V0Q2FsY3VsYXRvclNlcnZpY2VQb3J0KCk7DQotICAgICAgICAgICAgVzNDRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gcG9ydDEuZ2V0VGlja2V0KCk7DQotDQotICAgICAgICAgICAgLy9BZGQgbnVtYmVycw0KLSAgICAgICAgICAgIENhbGN1bGF0b3IgcG9ydDIgPSBlcHIuZ2V0UG9ydChDYWxjdWxhdG9yLmNsYXNzLCBuZXcgQWRkcmVzc2luZ0ZlYXR1cmUoKSk7DQotICAgICAgICAgICAgaW50IGFuc3dlciA9IHBvcnQyLmFkZCh2YWx1ZTAsIHZhbHVlMSk7DQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgYW5zd2VyIGlzOiAiICsgYW5zd2VyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQotICAgICAgICB9DQotICAgICAgICBmaW5hbGx5IHsNCi0gICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOw0KLSAgICAgICAgICAgIGxvbmcgdGltZSA9IGVuZCAtIHN0YXJ0Ow0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGltZTogIiArIHRpbWUgKyAiIG1zLiIpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9DYWxjdWxhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQ2FsY3VsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDA1N2VlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9DYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKg0KLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSoNCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSoNCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotKiB1bmRlciB0aGUgTGljZW5zZS4NCi0qLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudDsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0Ow0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvOw0KLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy53c2FkZHJlc3NpbmcuVzNDRW5kcG9pbnRSZWZlcmVuY2U7DQotDQotDQotQFdlYlNlcnZpY2UobmFtZSA9ICJDYWxjdWxhdG9yIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLUBYbWxTZWVBbHNvKHsNCi0gICAgICAgIE9iamVjdEZhY3RvcnkuY2xhc3MNCi0gICAgICAgIH0pDQotcHVibGljIGludGVyZmFjZSBDYWxjdWxhdG9yIHsNCi0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlDQotICAgICAqLw0KLSAgICBAV2ViTWV0aG9kDQotICAgIEBXZWJSZXN1bHQodGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciKQ0KLSAgICBAUmVxdWVzdFdyYXBwZXIobG9jYWxOYW1lID0gImdldFRpY2tldCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQuR2V0VGlja2V0IikNCi0gICAgQFJlc3BvbnNlV3JhcHBlcihsb2NhbE5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50LkdldFRpY2tldFJlc3BvbnNlIikNCi0gICAgcHVibGljIFczQ0VuZHBvaW50UmVmZXJlbmNlIGdldFRpY2tldCgpOw0KLQ0KLSAgICAvKioNCi0gICAgICogQHBhcmFtIHZhbHVlMQ0KLSAgICAgKiBAcGFyYW0gdmFsdWUyDQotICAgICAqIEByZXR1cm4gcmV0dXJucyBpbnQNCi0gICAgICogQHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgQFdlYk1ldGhvZA0KLSAgICBAV2ViUmVzdWx0KHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgQFJlcXVlc3RXcmFwcGVyKGxvY2FsTmFtZSA9ICJhZGQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIGNsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50LkFkZCIpDQotICAgIEBSZXNwb25zZVdyYXBwZXIobG9jYWxOYW1lID0gImFkZFJlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudC5BZGRSZXNwb25zZSIpDQotICAgIHB1YmxpYyBpbnQgYWRkKA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInZhbHVlMSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgICAgICAgICBpbnQgdmFsdWUxLA0KLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInZhbHVlMiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIikNCi0gICAgICAgICAgICBpbnQgdmFsdWUyKQ0KLSAgICAgICAgICAgIHRocm93cyBBZGROdW1iZXJzRXhjZXB0aW9uX0V4Y2VwdGlvbg0KLSAgICAgICAgICAgIDsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0NhbGN1bGF0b3JTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQ2FsY3VsYXRvclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0Y2IxOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvQ2FsY3VsYXRvclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50Ow0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VGZWF0dXJlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLQ0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQ2FsY3VsYXRvclNlcnZpY2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIHdzZGxMb2NhdGlvbiA9ICJmaWxlOi9DOi9BcGFjaGUvYXhpczIvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3IvcmVzb3VyY2VzL01FVEEtSU5GL0NhbGN1bGF0b3JTZXJ2aWNlLndzZGwiKQ0KLXB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yU2VydmljZQ0KLSAgICAgICAgZXh0ZW5kcyBTZXJ2aWNlIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIENBTENVTEFUT1JTRVJWSUNFX1dTRExfTE9DQVRJT047DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQuQ2FsY3VsYXRvclNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgc3RhdGljIHsNCi0gICAgICAgIFVSTCB1cmwgPSBudWxsOw0KLSAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvQ2FsY3VsYXRvclNlcnZpY2UuQ2FsY3VsYXRvclNlcnZpY2VQb3J0P3dzZGwiKTsNCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIENBTENVTEFUT1JTRVJWSUNFX1dTRExfTE9DQVRJT04gPSB1cmw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIENhbGN1bGF0b3JTZXJ2aWNlKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgQ2FsY3VsYXRvclNlcnZpY2UoKSB7DQotICAgICAgICBzdXBlcihDQUxDVUxBVE9SU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiQ2FsY3VsYXRvclNlcnZpY2UiKSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEByZXR1cm4gcmV0dXJucyBDYWxjdWxhdG9yDQotICAgICAqLw0KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJDYWxjdWxhdG9yU2VydmljZVBvcnQiKQ0KLSAgICBwdWJsaWMgQ2FsY3VsYXRvciBnZXRDYWxjdWxhdG9yU2VydmljZVBvcnQoKSB7DQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiQ2FsY3VsYXRvclNlcnZpY2VQb3J0IiksIENhbGN1bGF0b3IuY2xhc3MpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBAcGFyYW0gZmVhdHVyZXMgQSBsaXN0IG9mIHtAbGluayBqYXZheC54bWwud3MuV2ViU2VydmljZUZlYXR1cmV9IHRvIGNvbmZpZ3VyZSBvbiB0aGUgcHJveHkuICBTdXBwb3J0ZWQgZmVhdHVyZXMgbm90IGluIHRoZSA8Y29kZT5mZWF0dXJlczwvY29kZT4gcGFyYW1ldGVyIHdpbGwgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcy4NCi0gICAgICogQHJldHVybiByZXR1cm5zIENhbGN1bGF0b3INCi0gICAgICovDQotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkNhbGN1bGF0b3JTZXJ2aWNlUG9ydCIpDQotICAgIHB1YmxpYyBDYWxjdWxhdG9yIGdldENhbGN1bGF0b3JTZXJ2aWNlUG9ydChXZWJTZXJ2aWNlRmVhdHVyZS4uLiBmZWF0dXJlcykgew0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIkNhbGN1bGF0b3JTZXJ2aWNlUG9ydCIpLCBDYWxjdWxhdG9yLmNsYXNzLCBmZWF0dXJlcyk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0dldFRpY2tldC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L0dldFRpY2tldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzc1MTU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9HZXRUaWNrZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOw0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7DQotDQotDQotLyoqDQotICogPHA+SmF2YSBjbGFzcyBmb3IgZ2V0VGlja2V0IGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0Ij4NCi0gKiAgICZsdDtjb21wbGV4Q29udGVudD4NCi0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4NCi0gKiAgICAgICAmbHQ7c2VxdWVuY2U+DQotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4NCi0gKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4NCi0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+DQotICogJmx0Oy9jb21wbGV4VHlwZT4NCi0gKiA8L3ByZT4NCi0gKi8NCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpDQotQFhtbFR5cGUobmFtZSA9ICJnZXRUaWNrZXQiKQ0KLXB1YmxpYyBjbGFzcyBHZXRUaWNrZXQgew0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvR2V0VGlja2V0UmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9HZXRUaWNrZXRSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQwNjMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9HZXRUaWNrZXRSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoNCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0qDQotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0qDQotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSogdW5kZXIgdGhlIExpY2Vuc2UuDQotKi8NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQ7DQotDQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7DQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3Mud3NhZGRyZXNzaW5nLlczQ0VuZHBvaW50UmVmZXJlbmNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDxwPkphdmEgY2xhc3MgZm9yIGdldFRpY2tldFJlc3BvbnNlIGNvbXBsZXggdHlwZS4NCi0gKiA8cC8+DQotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4NCi0gKiA8cC8+DQotICogPHByZT4NCi0gKiAmbHQ7Y29tcGxleFR5cGUgbmFtZT0iZ2V0VGlja2V0UmVzcG9uc2UiPg0KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50Pg0KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPg0KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4NCi0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InJldHVybiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZ31FbmRwb2ludFJlZmVyZW5jZVR5cGUiIG1pbk9jY3Vycz0iMCIvPg0KLSAqICAgICAgICZsdDsvc2VxdWVuY2U+DQotICogICAgICZsdDsvcmVzdHJpY3Rpb24+DQotICogICAmbHQ7L2NvbXBsZXhDb250ZW50Pg0KLSAqICZsdDsvY29tcGxleFR5cGU+DQotICogPC9wcmU+DQotICovDQotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQ0KLUBYbWxUeXBlKG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiLCBwcm9wT3JkZXIgPSB7DQotICAgICAgICAiX3JldHVybiINCi0gICAgICAgIH0pDQotcHVibGljIGNsYXNzIEdldFRpY2tldFJlc3BvbnNlIHsNCi0NCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJyZXR1cm4iKQ0KLSAgICBwcm90ZWN0ZWQgVzNDRW5kcG9pbnRSZWZlcmVuY2UgX3JldHVybjsNCi0NCi0gICAgLyoqDQotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXR1cm4gcHJvcGVydHkuDQotICAgICAqDQotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAge0BsaW5rIFczQ0VuZHBvaW50UmVmZXJlbmNlIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBXM0NFbmRwb2ludFJlZmVyZW5jZSBnZXRSZXR1cm4oKSB7DQotICAgICAgICByZXR1cm4gX3JldHVybjsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJldHVybiBwcm9wZXJ0eS4NCi0gICAgICoNCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzDQotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgVzNDRW5kcG9pbnRSZWZlcmVuY2UgfQ0KLSAgICAgKi8NCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuKFczQ0VuZHBvaW50UmVmZXJlbmNlIHZhbHVlKSB7DQotICAgICAgICB0aGlzLl9yZXR1cm4gPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvT2JqZWN0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5YmJlMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9jbGllbnQvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50Ow0KLQ0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsNCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2gNCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlDQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNhbGN1bGF0b3IuY2xpZW50IHBhY2thZ2UuDQotICogPHA+QW4gT2JqZWN0RmFjdG9yeSBhbGxvd3MgeW91IHRvIHByb2dyYW1hdGljYWxseQ0KLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uDQotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwNCi0gKiBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMNCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hDQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsDQotICogZ3JvdXBzLiAgRmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIG9mIHRoZXNlIGFyZQ0KLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuDQotICovDQotQFhtbFJlZ2lzdHJ5DQotcHVibGljIGNsYXNzIE9iamVjdEZhY3Rvcnkgew0KLQ0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfR2V0VGlja2V0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgImdldFRpY2tldCIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgImFkZCIpOw0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQWRkUmVzcG9uc2VfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCAiYWRkUmVzcG9uc2UiKTsNCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0dldFRpY2tldFJlc3BvbnNlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgImdldFRpY2tldFJlc3BvbnNlIik7DQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9BZGROdW1iZXJzRXhjZXB0aW9uX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgIkFkZE51bWJlcnNFeGNlcHRpb24iKTsNCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3NlcyBmb3IgcGFja2FnZTogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yLmNsaWVudA0KLSAgICAgKi8NCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkIH0NCi0gICAgICovDQotICAgIHB1YmxpYyBBZGQgY3JlYXRlQWRkKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBZGQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBBZGRSZXNwb25zZSB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkUmVzcG9uc2UgY3JlYXRlQWRkUmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEFkZFJlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQWRkTnVtYmVyc0V4Y2VwdGlvbiB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgQWRkTnVtYmVyc0V4Y2VwdGlvbiBjcmVhdGVBZGROdW1iZXJzRXhjZXB0aW9uKCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBBZGROdW1iZXJzRXhjZXB0aW9uKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgR2V0VGlja2V0IH0NCi0gICAgICovDQotICAgIHB1YmxpYyBHZXRUaWNrZXQgY3JlYXRlR2V0VGlja2V0KCkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBHZXRUaWNrZXQoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBHZXRUaWNrZXRSZXNwb25zZSB9DQotICAgICAqLw0KLSAgICBwdWJsaWMgR2V0VGlja2V0UmVzcG9uc2UgY3JlYXRlR2V0VGlja2V0UmVzcG9uc2UoKSB7DQotICAgICAgICByZXR1cm4gbmV3IEdldFRpY2tldFJlc3BvbnNlKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBHZXRUaWNrZXQgfXtAY29kZSA+fX0NCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0IikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEdldFRpY2tldD4gY3JlYXRlR2V0VGlja2V0KEdldFRpY2tldCB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxHZXRUaWNrZXQ+KF9HZXRUaWNrZXRfUU5BTUUsIEdldFRpY2tldC5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQWRkIH17QGNvZGUgPn19DQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBuYW1lID0gImFkZCIpDQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxBZGQ+IGNyZWF0ZUFkZChBZGQgdmFsdWUpIHsNCi0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QWRkPihfQWRkX1FOQU1FLCBBZGQuY2xhc3MsIG51bGwsIHZhbHVlKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEFkZFJlc3BvbnNlIH17QGNvZGUgPn19DQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBuYW1lID0gImFkZFJlc3BvbnNlIikNCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEFkZFJlc3BvbnNlPiBjcmVhdGVBZGRSZXNwb25zZShBZGRSZXNwb25zZSB2YWx1ZSkgew0KLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxBZGRSZXNwb25zZT4oX0FkZFJlc3BvbnNlX1FOQU1FLCBBZGRSZXNwb25zZS5jbGFzcywgbnVsbCwgdmFsdWUpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgR2V0VGlja2V0UmVzcG9uc2UgfXtAY29kZSA+fX0NCi0gICAgICovDQotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL2NhbGN1bGF0b3IuamF4d3MuYXhpczIuYXBhY2hlLm9yZyIsIG5hbWUgPSAiZ2V0VGlja2V0UmVzcG9uc2UiKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8R2V0VGlja2V0UmVzcG9uc2U+IGNyZWF0ZUdldFRpY2tldFJlc3BvbnNlKEdldFRpY2tldFJlc3BvbnNlIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEdldFRpY2tldFJlc3BvbnNlPihfR2V0VGlja2V0UmVzcG9uc2VfUU5BTUUsIEdldFRpY2tldFJlc3BvbnNlLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBBZGROdW1iZXJzRXhjZXB0aW9uIH17QGNvZGUgPn19DQotICAgICAqLw0KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBuYW1lID0gIkFkZE51bWJlcnNFeGNlcHRpb24iKQ0KLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QWRkTnVtYmVyc0V4Y2VwdGlvbj4gY3JlYXRlQWRkTnVtYmVyc0V4Y2VwdGlvbihBZGROdW1iZXJzRXhjZXB0aW9uIHZhbHVlKSB7DQotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEFkZE51bWJlcnNFeGNlcHRpb24+KF9BZGROdW1iZXJzRXhjZXB0aW9uX1FOQU1FLCBBZGROdW1iZXJzRXhjZXB0aW9uLmNsYXNzLCBudWxsLCB2YWx1ZSk7DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTBiNzJmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtY2FsY3VsYXRvci9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9jYWxjdWxhdG9yL2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qDQotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotKg0KLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotKg0KLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0qIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSovDQotDQotQGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hKG5hbWVzcGFjZSA9ICJodHRwOi8vY2FsY3VsYXRvci5qYXh3cy5heGlzMi5hcGFjaGUub3JnIiwgZWxlbWVudEZvcm1EZWZhdWx0ID0gamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxOc0Zvcm0uUVVBTElGSUVEKSBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuY2FsY3VsYXRvci5jbGllbnQ7DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1jYWxjdWxhdG9yL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL2NhbGN1bGF0b3IvcGFja2FnZS1pbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNzMxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWNhbGN1bGF0b3Ivc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvY2FsY3VsYXRvci9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly9jYWxjdWxhdG9yLmpheHdzLmF4aXMyLmFwYWNoZS5vcmciLCBlbGVtZW50Rm9ybURlZmF1bHQgPSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zRm9ybS5RVUFMSUZJRUQpIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5jYWxjdWxhdG9yOwpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2Y2U4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRoaXMgc2FtcGxlIHdpbGwgc2hvdyBob3cgdG8gY3JlYXRlIGEgZHluYW1pYyBjbGllbnQvc2VydmljZSB1c2luZyBKQVgtV1MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL3Jlc291cmNlcy93c2RsL0R5bmFtaWNTYW1wbGUud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtZHluYW1pYy9yZXNvdXJjZXMvd3NkbC9EeW5hbWljU2FtcGxlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOGQwNmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL3Jlc291cmNlcy93c2RsL0R5bmFtaWNTYW1wbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxkZWZpbml0aW9ucyB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIA0KLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiANCi0JeG1sbnM6dG5zPSJodHRwOi8vYXhpczIuYXBhY2hlLmNvbS9qYXh3cy9zYW1wbGUvZHluYW1pYyIgDQotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIA0KLSAgICBuYW1lPSJFY2hvU2VydmljZSIgDQotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXMyLmFwYWNoZS5jb20vamF4d3Mvc2FtcGxlL2R5bmFtaWMiPg0KLSAgPHR5cGVzPg0KLSAgICA8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgDQotICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9heGlzMi5hcGFjaGUuY29tL2pheHdzL3NhbXBsZS9keW5hbWljIiANCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2F4aXMyLmFwYWNoZS5jb20vamF4d3Mvc2FtcGxlL2R5bmFtaWMiIHZlcnNpb249IjEuMCI+DQotICAgICAgDQotICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uMSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbjFSZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPg0KLSAgICAgIA0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbjIiIHR5cGU9InhzZDppbnQiLz4NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24yUmVzcG9uc2UiIHR5cGU9InhzZDppbnQiLz4NCi0NCi0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24zIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPg0KLSAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbjNSZXNwb25zZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4NCi0NCi0gICAgPC94czpzY2hlbWE+DQotICA8L3R5cGVzPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJvcGVyYXRpb24xIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjEiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0ib3BlcmF0aW9uMVJlc3BvbnNlIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjFSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJvcGVyYXRpb24yIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjIiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0ib3BlcmF0aW9uMlJlc3BvbnNlIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjJSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8bWVzc2FnZSBuYW1lPSJvcGVyYXRpb24zIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjMiIG5hbWU9InBhcmFtZXRlcnMiLz4NCi0gIDwvbWVzc2FnZT4NCi0gIA0KLSAgPG1lc3NhZ2UgbmFtZT0ib3BlcmF0aW9uM1Jlc3BvbnNlIj4NCi0gICAgPHBhcnQgZWxlbWVudD0idG5zOm9wZXJhdGlvbjNSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPg0KLSAgPC9tZXNzYWdlPg0KLSAgDQotICA8cG9ydFR5cGUgbmFtZT0iR2VuZXJpYyI+DQotICAgIDxvcGVyYXRpb24gbmFtZT0ib3BlcmF0aW9uMSI+DQotICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpvcGVyYXRpb24xIi8+DQotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6b3BlcmF0aW9uMVJlc3BvbnNlIi8+DQotICAgIDwvb3BlcmF0aW9uPg0KLSAgICA8b3BlcmF0aW9uIG5hbWU9Im9wZXJhdGlvbjIiPg0KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6b3BlcmF0aW9uMiIvPg0KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOm9wZXJhdGlvbjJSZXNwb25zZSIvPg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24zIj4NCi0gICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOm9wZXJhdGlvbjMiLz4NCi0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczpvcGVyYXRpb24zUmVzcG9uc2UiLz4NCi0gICAgPC9vcGVyYXRpb24+DQotICA8L3BvcnRUeXBlPg0KLSAgDQotICA8YmluZGluZyBuYW1lPSJHZW5lcmljQmluZGluZyIgdHlwZT0idG5zOkdlbmVyaWMiPg0KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24xIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24yIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJvcGVyYXRpb24zIj4NCi0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+DQotICAgICAgPGlucHV0Pg0KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICA8L2lucHV0Pg0KLSAgICAgIDxvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvb3V0cHV0Pg0KLSAgICA8L29wZXJhdGlvbj4NCi0gIDwvYmluZGluZz4NCi0gIA0KLSAgPHNlcnZpY2UgbmFtZT0iR2VuZXJpY1NlcnZpY2UiPg0KLSAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6R2VuZXJpY0JpbmRpbmciIG5hbWU9IkVjaG9Qb3J0Ij4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvc2VydmljZXMvR2VuZXJpY1NlcnZpY2UiLz4NCi0gICAgPC9wb3J0Pg0KLSAgPC9zZXJ2aWNlPg0KLSAgDQotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2R5bmFtaWMvRHluYW1pY1NlcnZpY2VQcm92aWRlci5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1keW5hbWljL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZS9keW5hbWljL0R5bmFtaWNTZXJ2aWNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2NGVjMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWR5bmFtaWMvc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlL2R5bmFtaWMvRHluYW1pY1NlcnZpY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGUuZHluYW1pYzsNCi0NCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOw0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7DQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOw0KLWltcG9ydCBqYXZheC54bWwud3MuUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOw0KLWltcG9ydCBqYXZheC54bWwud3MuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsNCi1pbXBvcnQgamF2YXgueG1sLndzLmh0dHAuSFRUUEJpbmRpbmc7DQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLQ0KLUBXZWJTZXJ2aWNlUHJvdmlkZXIoc2VydmljZU5hbWU9IkdlbmVyaWNTZXJ2aWNlIiwgd3NkbExvY2F0aW9uPSJXRUItSU5GL3dzZGwvRHluYW1pY1NhbXBsZS53c2RsIikNCi1AQmluZGluZ1R5cGUoU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HKQ0KLXB1YmxpYyBjbGFzcyBEeW5hbWljU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7DQotICAgIA0KLQlAUmVzb3VyY2UodHlwZT1XZWJTZXJ2aWNlQ29udGV4dC5jbGFzcykNCi0gICAgcHVibGljIFdlYlNlcnZpY2VDb250ZXh0IGNvbnRleHQ7DQotCQ0KLQlwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2Ugc291cmNlKSB7DQotCQkgICAgICAgIA0KLQkJLy9UZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlUHJvdmlkZXI6IFJlcXVlc3QgcmVjZWl2ZWQuXG4iKTsNCi0gICAgCWlmIChzb3VyY2UgPT0gbnVsbCkgew0KLSAgICAJICAgIHJldHVybiBzb3VyY2U7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0gICAgCQkvL1Rlc3RMb2dnZXIubG9nZ2VyLmRlYnVnKCJbRHluYW1pY1NlcnZpY2VQcm92aWRlcl0gdGhlIFdlYlNlcnZpY2VDb250ZXh0IHdhcyBudWxsLiIpOw0KLSAgICAJCXRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJBIFdlYlNlcnZpY2VFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiBpbmplY3RlZC4iKTsNCi0gICAgCX0NCi0gICAgCQ0KLSAgICAJUU5hbWUgd3NkbFNlcnZpY2UgPSAoUU5hbWUpIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuV1NETF9TRVJWSUNFKTsNCi0gICAgCVFOYW1lIHdzZGxPcGVyYXRpb24gPSAoUU5hbWUpIGNvbnRleHQuZ2V0TWVzc2FnZUNvbnRleHQoKS5nZXQoTWVzc2FnZUNvbnRleHQuV1NETF9PUEVSQVRJT04pOw0KLSAgICAJDQotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIltEeW5hbWljU2VydmljZVByb3ZpZGVyXSAgIHNlcnZpY2UgbmFtZTogIiArIHdzZGxTZXJ2aWNlKTsNCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiW0R5bmFtaWNTZXJ2aWNlUHJvdmlkZXJdIG9wZXJhdGlvbiBuYW1lOiAiICsgd3NkbE9wZXJhdGlvbik7DQotICAgIAkNCi0gICAgCS8vVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltEeW5hbWljU2VydmljZVByb3ZpZGVyXSAgIHNlcnZpY2UgbmFtZTogIiArIHdzZGxTZXJ2aWNlKTsNCi0gICAgCS8vVGVzdExvZ2dlci5sb2dnZXIuZGVidWcoIltEeW5hbWljU2VydmljZVByb3ZpZGVyXSBvcGVyYXRpb24gbmFtZTogIiArIHdzZGxPcGVyYXRpb24pOw0KLSAgICAJDQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOw0KLSAgICAJdHJ5IHsNCi0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsNCi0gICAgICAgICAgICBSZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpOw0KLSAgICAgICAgICAgIHQudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsNCi0gICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IFdlYlNlcnZpY2VFeGNlcHRpb24oZSk7DQotICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLSAgICAJDQotICAgICAgICBTdHJpbmcgdGV4dCA9IHdyaXRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOw0KLSAgICAgICAgLy9UZXN0TG9nZ2VyLmxvZ2dlci5kZWJ1ZygiPj4gU291cmNlIFJlcXVlc3Qgb24gU2VydmVyOiBcbiIgKyB0ZXh0KTsNCi0gICAgCQ0KLSAgICAJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LmNvbnRhaW5zKCJ0aHJvd1dlYlNlcnZpY2VFeGNlcHRpb24iKSkgew0KLSAgICAJICAgIHRocm93IG5ldyBXZWJTZXJ2aWNlRXhjZXB0aW9uKCJwcm92aWRlciIpOw0KLSAgICAJfQ0KLSAgICAJDQotICAgIAlCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKTsNCi0gICAgCVNvdXJjZSBzcmNTdHJlYW0gPSBuZXcgU3RyZWFtU291cmNlKChJbnB1dFN0cmVhbSkgc3RyZWFtKTsNCi0gICAgCXJldHVybiBzcmNTdHJlYW07ICAgICAgICANCi0gICAgfSAgICAJDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjUwNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1TYW1wbGU6IEpBWC1XUyB0b3AtZG93biBkZXZlbG9wbWVudAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSW50cm9kdWN0aW9uCi09PT09PT09PT09PT0KLVRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0b3AtZG93biBkZXZlbG9wbWVudCAoaS5lLiBkZXZlbG9wbWVudCBzdGFydGluZyB3aXRoIGEgV1NETCBkb2N1bWVudCkgb2YgYSBzZXJ2aWNlIGFuZCBjbGllbnQgdXNpbmcgdGhlIEpBWC1XUyBBUEkuICBUaGUgc2FtcGxlIGlzIGJhc2VkIG9uIGFuIGludGVyb3Agc2NlbmFyaW8gZm9yIGJhc2UgZGF0YSB0eXBlcyB3aGljaCBtYXkgYmUgZm91bmQgYXQgaHR0cDovL21zc29hcGludGVyb3Aub3JnL2lsYWIvIC4KLQotQnVpbGRpbmcgdGhlIHNlcnZpY2UgZnJvbSBzY3JhdGNoCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVRoZSBzZXJ2aWNlIG1heSBiZSBjb25zdHJ1Y3RlZCBmcm9tIHNjcmF0Y2ggYnkgZXhlY3V0aW5nIHRoZSB3c2ltcG9ydCB0b29sIChmb3VuZCBpbiB0aGUgU3VuIEpBWC1XUyBSSSkgb24gdGhlIEJhc2VEYXRhVHlwZXNEb2NMaWJCLndzZGwgZmlsZTogJ3dzaW1wb3J0IC1rZWVwIC12ZXJib3NlIEJhc2VEYXRhVHlwZXNEb2NMaWJCLndzZGwnICAoVGhlIC1rZWVwIG9wdGlvbiB0ZWxscyB0aGUgdG9vbCB0byBrZWVwIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYW5kIHRoZSAtdmVyYm9zZSBvcHRpb24gY2F1c2VzIHRoZSB0b29sIHRvIGxpc3Qgd2hhdCBpcyBnZW5lcmF0ZWQuKSAgQWZ0ZXIgdGhlIGZpbGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgeW91IHdpbGwgbmVlZCB0byBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlIChpLmUuIGEgY2xhc3MgZXF1aXZhbGVudCB0byBUb3BEb3duU2FtcGxlU2VydmljZS5qYXZhKS4KLQotTm90ZTogRHVlIHRvIGFuIGlzc3VlIHdpdGggdGhlIEpBWFdTRGVwbG95ZXIsIHRoZSBhbm5vdGF0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UgbmVlZCB0byBiZSByZXBsaWNhdGVkIGluIHRoZSBpbXBsZW1lbnRpbmcgY2xhc3MgaWYgdGhlIHNlcnZpY2UgaXMgYmVpbmcgZGVwbG95ZWQgdGhyb3VnaCBhIGphciB2aWEgdGhlIHNlcnZpY2VqYXJzIGRpcmVjdG9yeS4KLQotRGVwbG95aW5nIHRoZSBzZXJ2aWNlCi09PT09PT09PT09PT09PT09PT09PT0KLVRoZSBjbGFzc2VzIGNhbiBiZSBwYWNrYWdlZCBpbnRvIGEgamFyIGFuZCB0aGUgamFyIGNhbiBiZSBkcm9wcGVkIGludG8gdGhlIHNlcnZpY2VqYXJzIGRpcmVjdG9yeSBvZiBhIGRlcGxveWVkIGF4aXMyIHNlcnZlci4KLQotQnVpbGRpbmcgdGhlIGNsaWVudCBmcm9tIHNjcmF0Y2gKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGUgZHluYW1pYyBwcm94eSBjbGllbnQgbWF5IGJlIGNvbnN0cnVjdGVkIGZyb20gc2NyYXRjaCBieSBleGVjdXRpbmcgdGhlIHdzaW1wb3J0IHRvb2wgKGZvdW5kIGluIHRoZSBTdW4gSkFYLVdTIFJJKSBvbiB0aGUgQmFzZURhdGFUeXBlc0RvY0xpYkIud3NkbCBmaWxlOiAnd3NpbXBvcnQgLWtlZXAgLXZlcmJvc2UgQmFzZURhdGFUeXBlc0RvY0xpYkIud3NkbCcgIChUaGUgLWtlZXAgb3B0aW9uIHRlbGxzIHRoZSB0b29sIHRvIGtlZXAgdGhlIGdlbmVyYXRlZCBmaWxlcyBhbmQgdGhlIC12ZXJib3NlIG9wdGlvbiBjYXVzZXMgdGhlIHRvb2wgdG8gbGlzdCB3aGF0IGlzIGdlbmVyYXRlZC4pICBBZnRlciB0aGUgZmlsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCB5b3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsaWVudCAoaS5lLiBhIGNsYXNzIGVxdWl2YWxlbnQgdG8gVG9wRG93blNhbXBsZUNsaWVudC5qYXZhKS4KLQotCi1SdW5uaW5nIHRoZSBDbGllbnQKLT09PT09PT09PT09PT09PT09PQotVGhlIGNsaWVudCBjYW4gYmUgcnVuIHZpYSB0aGUgYXhpczIuc2ggb3IgYXhpczIuYmF0IHNjcmlwdHMgKGUuZy4gJ2F4aXMyLnNoIG9yZy5hcGFjaGUuYXhpczIuamF4d3MuaW50ZXJvcC5JbnRlcm9wU2FtcGxlQ2xpZW50Jy4pICBUaGUgZW5kcG9pbnQgVVJMIGlzIGV4dHJhY3RlZCBhdCBydW50aW1lIGZyb20gdGhlIFdTREwsIHNvIHlvdSBjYW4gZWl0aGVyIG1vZGlmeSB0aGUgc29hcDphZGRyZXNzIHRvIHJlZmVyIHRvIE1pY3Jvc29mdCdzIGVuZHBvaW50IGF0IGh0dHA6Ly8xMzEuMTA3LjcyLjE1L1NvYXBXc2RsX0Jhc2VEYXRhVHlwZXNfWG1sRm9ybWF0dGVyX1NlcnZpY2VfSW5kaWdvL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLnN2YyBvciB0byBhIGxvY2FsIGVuZHBvaW50IHN1Y2ggYXMgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1RvcERvd25TYW1wbGVTZXJ2aWNlU2VydmljZS5JQmFzZURhdGFUeXBlc0RvY0xpdEJQb3J0ICAKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9wb20ueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzA5MzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuc2FtcGxlczwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+amF4d3MtaW50ZXJvcDwvYXJ0aWZhY3RJZD4NCi0gICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4NCi0gICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgIDxuYW1lPkpBWFdTIEludGVyb3AgU2FtcGxlPC9uYW1lPg0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5Pg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+cmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF4d3M8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1tMjwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtc25hcHNob3RzPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnkvPC91cmw+DQotICAgICAgICA8L3JlcG9zaXRvcnk+DQotICAgICAgICA8cmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICA8L3JlcG9zaXRvcmllcz4NCi0gICAgPHBsdWdpblJlcG9zaXRvcmllcz4NCi0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbTI8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+YXBhY2hlLXNuYXBzaG90czwvaWQ+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+DQotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+DQotICAgICAgICA8cGx1Z2luUmVwb3NpdG9yeT4NCi0gICAgICAgICAgICA8aWQ+bWF2ZW4yPC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yLzwvdXJsPg0KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5Pg0KLSAgICA8L3BsdWdpblJlcG9zaXRvcmllcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi9CYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi9CYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcwMGQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYvQmFzZURhdGFUeXBlc0RvY0xpdEIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzdT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCINCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyINCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2FtPSJodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA1L2FkZHJlc3NpbmcvbWV0YWRhdGEiIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyINCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZyINCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c3A9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDkvcG9saWN5Ig0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDQvMDgvYWRkcmVzc2luZy9wb2xpY3kiDQotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSINCi0gICAgICAgICAgICAgICAgICB4bWxuczptc2M9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwNS8xMi93c2RsL2NvbnRyYWN0Ig0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIg0KLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzYTEwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciDQotICAgICAgICAgICAgICAgICAgeG1sbnM6d3N4PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L21leCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIg0KLSAgICAgICAgICAgICAgICAgIG5hbWU9IkJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSI+DQotICAgIDx3c2RsOnR5cGVzPg0KLSAgICAgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0cyI+DQotICAgICAgICAgICAgPHhzZDppbXBvcnQgc2NoZW1hTG9jYXRpb249InhzZDEueHNkIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4NCi0gICAgICAgICAgICA8eHNkOmltcG9ydCBzY2hlbWFMb2NhdGlvbj0ieHNkMC54c2QiIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIi8+DQotICAgICAgICAgICAgPHhzZDppbXBvcnQgc2NoZW1hTG9jYXRpb249InhzZDIueHNkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLmRhdGFjb250cmFjdC5vcmcvMjAwNC8wNy9TeXN0ZW0iLz4NCi0gICAgICAgIDwveHNkOnNjaGVtYT4NCi0gICAgPC93c2RsOnR5cGVzPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldEJvb2xfUmVxdWVzdE1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluQm9vbCIgZWxlbWVudD0idG5zOmluQm9vbCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRCb29sX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iUmV0Qm9vbFJlc3VsdCIgZWxlbWVudD0idG5zOlJldEJvb2xSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0Qnl0ZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5CeXRlIiBlbGVtZW50PSJ0bnM6aW5CeXRlIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldEJ5dGVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRCeXRlUmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0Qnl0ZVJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRTQnl0ZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5TQnl0ZSIgZWxlbWVudD0idG5zOmluU0J5dGUiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0U0J5dGVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRTQnl0ZVJlc3VsdCIgZWxlbWVudD0idG5zOlJldFNCeXRlUmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldEJ5dGVBcnJheV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5CeXRlQXJyYXkiIGVsZW1lbnQ9InRuczppbkJ5dGVBcnJheSIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRCeXRlQXJyYXlfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRCeXRlQXJyYXlSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRCeXRlQXJyYXlSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0Q2hhcl9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5DaGFyIiBlbGVtZW50PSJ0bnM6aW5DaGFyIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldENoYXJfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRDaGFyUmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0Q2hhclJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXREZWNpbWFsX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkRlY2ltYWwiIGVsZW1lbnQ9InRuczppbkRlY2ltYWwiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0RGVjaW1hbF9SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldERlY2ltYWxSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXREZWNpbWFsUmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldEZsb2F0X1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkZsb2F0IiBlbGVtZW50PSJ0bnM6aW5GbG9hdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRGbG9hdF9SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldEZsb2F0UmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0RmxvYXRSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0RG91YmxlX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkRvdWJsZSIgZWxlbWVudD0idG5zOmluRG91YmxlIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldERvdWJsZV9SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldERvdWJsZVJlc3VsdCIgZWxlbWVudD0idG5zOlJldERvdWJsZVJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRTaW5nbGVfUmVxdWVzdE1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluU2luZ2xlIiBlbGVtZW50PSJ0bnM6aW5TaW5nbGUiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0U2luZ2xlX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iUmV0U2luZ2xlUmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0U2luZ2xlUmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldEludF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5JbnQiIGVsZW1lbnQ9InRuczppbkludCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRJbnRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRJbnRSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRJbnRSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0U2hvcnRfUmVxdWVzdE1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluU2hvcnQiIGVsZW1lbnQ9InRuczppblNob3J0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFNob3J0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iUmV0U2hvcnRSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRTaG9ydFJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRMb25nX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkxvbmciIGVsZW1lbnQ9InRuczppbkxvbmciLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0TG9uZ19SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldExvbmdSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRMb25nUmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldE9iamVjdF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5PYmplY3QiIGVsZW1lbnQ9InRuczppbk9iamVjdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRPYmplY3RfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRPYmplY3RSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRPYmplY3RSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0VUludF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5VSW50IiBlbGVtZW50PSJ0bnM6aW5VSW50Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFVJbnRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRVSW50UmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0VUludFJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRVU2hvcnRfUmVxdWVzdE1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluVVNob3J0IiBlbGVtZW50PSJ0bnM6aW5VU2hvcnQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0VVNob3J0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iUmV0VVNob3J0UmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0VVNob3J0UmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFVMb25nX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpblVMb25nIiBlbGVtZW50PSJ0bnM6aW5VTG9uZyIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRVTG9uZ19SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldFVMb25nUmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0VUxvbmdSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0U3RyaW5nX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpblN0cmluZyIgZWxlbWVudD0idG5zOmluU3RyaW5nIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFN0cmluZ19SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldFN0cmluZ1Jlc3VsdCIgZWxlbWVudD0idG5zOlJldFN0cmluZ1Jlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRHdWlkX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpbkd1aWQiIGVsZW1lbnQ9InRuczppbkd1aWQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0R3VpZF9SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldEd1aWRSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRHdWlkUmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFVyaV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5VcmkiIGVsZW1lbnQ9InRuczppblVyaSIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRVcmlfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXRVcmlSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRVcmlSZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0RGF0ZVRpbWVfUmVxdWVzdE1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluRGF0ZVRpbWUiIGVsZW1lbnQ9InRuczppbkRhdGVUaW1lIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldERhdGVUaW1lX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iUmV0RGF0ZVRpbWVSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXREYXRlVGltZVJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXREYXRlVGltZU9mZnNldF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iaW5EYXRlVGltZU9mZnNldCIgZWxlbWVudD0idG5zOmluRGF0ZVRpbWVPZmZzZXQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0RGF0ZVRpbWVPZmZzZXRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIgZWxlbWVudD0idG5zOlJldERhdGVUaW1lT2Zmc2V0UmVzdWx0Ii8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFRpbWVTcGFuX1JlcXVlc3RNZXNzYWdlX0JvZHkiPg0KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJpblRpbWVTcGFuIiBlbGVtZW50PSJ0bnM6aW5UaW1lU3BhbiIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJSZXRUaW1lU3Bhbl9SZXNwb25zZU1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IlJldFRpbWVTcGFuUmVzdWx0IiBlbGVtZW50PSJ0bnM6UmV0VGltZVNwYW5SZXN1bHQiLz4NCi0gICAgPC93c2RsOm1lc3NhZ2U+DQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iUmV0UU5hbWVfUmVxdWVzdE1lc3NhZ2VfQm9keSI+DQotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9ImluUU5hbWUiIGVsZW1lbnQ9InRuczppblFOYW1lIi8+DQotICAgIDwvd3NkbDptZXNzYWdlPg0KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IlJldFFOYW1lX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ij4NCi0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iUmV0UU5hbWVSZXN1bHQiIGVsZW1lbnQ9InRuczpSZXRRTmFtZVJlc3VsdCIvPg0KLSAgICA8L3dzZGw6bWVzc2FnZT4NCi0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iSUJhc2VEYXRhVHlwZXNEb2NMaXRCIj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRCb29sIj4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJSZXRCb29sX1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRCb29sX1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Qm9vbCIvPg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJSZXRCb29sX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0Qm9vbF9SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Qm9vbFJlc3BvbnNlIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldEJ5dGUiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldEJ5dGVfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldEJ5dGVfUmVxdWVzdE1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRCeXRlIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldEJ5dGVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRCeXRlX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRCeXRlUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0U0J5dGUiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldFNCeXRlX1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRTQnl0ZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNCeXRlIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldFNCeXRlX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0U0J5dGVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNCeXRlUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0Qnl0ZUFycmF5Ij4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJSZXRCeXRlQXJyYXlfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldEJ5dGVBcnJheV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheSIvPg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJSZXRCeXRlQXJyYXlfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRCeXRlQXJyYXlfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheVJlc3BvbnNlIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldENoYXIiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldENoYXJfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldENoYXJfUmVxdWVzdE1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRDaGFyIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldENoYXJfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRDaGFyX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRDaGFyUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0RGVjaW1hbCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0RGVjaW1hbF9SZXF1ZXN0TWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0RGVjaW1hbF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERlY2ltYWwiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0RGVjaW1hbF9SZXNwb25zZU1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldERlY2ltYWxfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERlY2ltYWxSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRGbG9hdCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0RmxvYXRfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldEZsb2F0X1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RmxvYXQiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0RmxvYXRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRGbG9hdF9SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RmxvYXRSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXREb3VibGUiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldERvdWJsZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0RG91YmxlX1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RG91YmxlIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldERvdWJsZV9SZXNwb25zZU1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldERvdWJsZV9SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RG91YmxlUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0U2luZ2xlIj4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJSZXRTaW5nbGVfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldFNpbmdsZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNpbmdsZSIvPg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJSZXRTaW5nbGVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRTaW5nbGVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNpbmdsZVJlc3BvbnNlIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldEludCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0SW50X1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRJbnRfUmVxdWVzdE1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRJbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0SW50X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0SW50X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRJbnRSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRTaG9ydCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0U2hvcnRfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldFNob3J0X1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U2hvcnQiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0U2hvcnRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRTaG9ydF9SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U2hvcnRSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRMb25nIj4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJSZXRMb25nX1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRMb25nX1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0TG9uZyIvPg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJSZXRMb25nX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0TG9uZ19SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0TG9uZ1Jlc3BvbnNlIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldE9iamVjdCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0T2JqZWN0X1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRPYmplY3RfUmVxdWVzdE1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRPYmplY3QiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0T2JqZWN0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0T2JqZWN0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRPYmplY3RSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRVSW50Ij4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJSZXRVSW50X1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRVSW50X1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VUludCIvPg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJSZXRVSW50X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0VUludF9SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VUludFJlc3BvbnNlIi8+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldFVTaG9ydCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0VVNob3J0X1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRVU2hvcnRfUmVxdWVzdE1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVU2hvcnQiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0VVNob3J0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0VVNob3J0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVU2hvcnRSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRVTG9uZyI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0VUxvbmdfUmVxdWVzdE1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldFVMb25nX1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VUxvbmciLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0VUxvbmdfUmVzcG9uc2VNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRVTG9uZ19SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VUxvbmdSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRTdHJpbmciPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldFN0cmluZ19SZXF1ZXN0TWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0U3RyaW5nX1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U3RyaW5nIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldFN0cmluZ19SZXNwb25zZU1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldFN0cmluZ19SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U3RyaW5nUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0R3VpZCI+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iUmV0R3VpZF9SZXF1ZXN0TWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0R3VpZF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEd1aWQiLz4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iUmV0R3VpZF9SZXNwb25zZU1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldEd1aWRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEd1aWRSZXNwb25zZSIvPg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRVcmkiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldFVyaV9SZXF1ZXN0TWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0VXJpX1JlcXVlc3RNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VXJpIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldFVyaV9SZXNwb25zZU1lc3NhZ2VfQm9keSIgbWVzc2FnZT0idG5zOlJldFVyaV9SZXNwb25zZU1lc3NhZ2VfQm9keSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NhdzpBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VXJpUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0RGF0ZVRpbWUiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldERhdGVUaW1lX1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXREYXRlVGltZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldERhdGVUaW1lX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0RGF0ZVRpbWVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0RGF0ZVRpbWVPZmZzZXQiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldERhdGVUaW1lT2Zmc2V0X1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXREYXRlVGltZU9mZnNldF9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lT2Zmc2V0Ii8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldERhdGVUaW1lT2Zmc2V0X1Jlc3BvbnNlTWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJ0bnM6UmV0RGF0ZVRpbWVPZmZzZXRfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lT2Zmc2V0UmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0VGltZVNwYW4iPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldFRpbWVTcGFuX1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRUaW1lU3Bhbl9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFRpbWVTcGFuIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldFRpbWVTcGFuX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0VGltZVNwYW5fUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFRpbWVTcGFuUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0UU5hbWUiPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IlJldFFOYW1lX1JlcXVlc3RNZXNzYWdlX0JvZHkiIG1lc3NhZ2U9InRuczpSZXRRTmFtZV9SZXF1ZXN0TWVzc2FnZV9Cb2R5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lIi8+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IlJldFFOYW1lX1Jlc3BvbnNlTWVzc2FnZV9Cb2R5IiBtZXNzYWdlPSJ0bnM6UmV0UU5hbWVfUmVzcG9uc2VNZXNzYWdlX0JvZHkiDQotICAgICAgICAgICAgICAgICAgICAgICAgIHdzYXc6QWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lUmVzcG9uc2UiLz4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgIDwvd3NkbDpwb3J0VHlwZT4NCi0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJCYXNpY0h0dHBCaW5kaW5nX0lCYXNlRGF0YVR5cGVzRG9jTGl0QiIgdHlwZT0idG5zOklCYXNlRGF0YVR5cGVzRG9jTGl0QiI+DQotICAgICAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0Qm9vbCI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Qm9vbCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRCeXRlIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRCeXRlIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldFNCeXRlIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRTQnl0ZSIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRCeXRlQXJyYXkiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheSIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRDaGFyIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRDaGFyIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldERlY2ltYWwiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERlY2ltYWwiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0RmxvYXQiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEZsb2F0IiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldERvdWJsZSI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RG91YmxlIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldFNpbmdsZSI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U2luZ2xlIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldEludCI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0SW50IiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldFNob3J0Ij4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRTaG9ydCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRMb25nIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRMb25nIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldE9iamVjdCI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0T2JqZWN0IiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldFVJbnQiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVJbnQiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0VVNob3J0Ij4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVU2hvcnQiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0VUxvbmciPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVMb25nIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldFN0cmluZyI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldEd1aWQiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEd1aWQiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0VXJpIj4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVcmkiIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0RGF0ZVRpbWUiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJldERhdGVUaW1lT2Zmc2V0Ij4NCi0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXREYXRlVGltZU9mZnNldCIgc3R5bGU9ImRvY3VtZW50Ii8+DQotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOmlucHV0Pg0KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0Pg0KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXRUaW1lU3BhbiI+DQotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VGltZVNwYW4iIHN0eWxlPSJkb2N1bWVudCIvPg0KLSAgICAgICAgICAgIDx3c2RsOmlucHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+DQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmV0UU5hbWUiPg0KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lIiBzdHlsZT0iZG9jdW1lbnQiLz4NCi0gICAgICAgICAgICA8d3NkbDppbnB1dD4NCi0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+DQotICAgICAgICAgICAgPHdzZGw6b3V0cHV0Pg0KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+DQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPg0KLSAgICA8L3dzZGw6YmluZGluZz4NCi0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UiPg0KLSAgICAgICAgPHdzZGw6cG9ydCBuYW1lPSJCYXNpY0h0dHBCaW5kaW5nX0lCYXNlRGF0YVR5cGVzRG9jTGl0QiIgYmluZGluZz0idG5zOkJhc2ljSHR0cEJpbmRpbmdfSUJhc2VEYXRhVHlwZXNEb2NMaXRCIj4NCi0gICAgICAgICAgICA8c29hcDphZGRyZXNzDQotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1RvcERvd25TYW1wbGVTZXJ2aWNlU2VydmljZS5JQmFzZURhdGFUeXBlc0RvY0xpdEJQb3J0Ii8+DQotICAgICAgICA8L3dzZGw6cG9ydD4NCi0gICAgPC93c2RsOnNlcnZpY2U+DQotPC93c2RsOmRlZmluaXRpb25zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMC54c2QgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3AvcmVzb3VyY2VzL01FVEEtSU5GL3hzZDAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM1MTZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTx4czpzY2hlbWEgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiDQotICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyINCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlUeXBlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJhbnlVUkkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iYmFzZTY0QmluYXJ5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImJvb2xlYW4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpib29sZWFuIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImJ5dGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpieXRlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImRhdGVUaW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGVjaW1hbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRlY2ltYWwiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZG91YmxlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZG91YmxlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImZsb2F0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6ZmxvYXQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6aW50Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImxvbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpsb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlFOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6UU5hbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2hvcnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzaG9ydCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRCeXRlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkSW50IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRJbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idW5zaWduZWRMb25nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6dW5zaWduZWRMb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9InVuc2lnbmVkU2hvcnQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImNoYXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6Y2hhciIvPg0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJjaGFyIj4NCi0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czppbnQiLz4NCi0gICAgPC94czpzaW1wbGVUeXBlPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkdXJhdGlvbiIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpkdXJhdGlvbiIvPg0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJkdXJhdGlvbiI+DQotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6ZHVyYXRpb24iPg0KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJcLT9QKFxkKkQpPyhUKFxkKkgpPyhcZCpNKT8oXGQqKFwuXGQqKT9TKT8pPyIvPg0KLSAgICAgICAgICAgIDx4czptaW5JbmNsdXNpdmUgdmFsdWU9Ii1QMTA2NzUxOTlEVDJINDhNNS40Nzc1ODA4UyIvPg0KLSAgICAgICAgICAgIDx4czptYXhJbmNsdXNpdmUgdmFsdWU9IlAxMDY3NTE5OURUMkg0OE01LjQ3NzU4MDdTIi8+DQotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgIDx4czplbGVtZW50IG5hbWU9Imd1aWQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6Z3VpZCIvPg0KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJndWlkIj4NCi0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KLSAgICAgICAgICAgIDx4czpwYXR0ZXJuIHZhbHVlPSJbXGRhLWZBLUZdezh9LVtcZGEtZkEtRl17NH0tW1xkYS1mQS1GXXs0fS1bXGRhLWZBLUZdezR9LVtcZGEtZkEtRl17MTJ9Ii8+DQotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPg0KLSAgICA8L3hzOnNpbXBsZVR5cGU+DQotICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iRmFjdG9yeVR5cGUiIHR5cGU9InhzOlFOYW1lIi8+DQotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi94c2QxLnhzZCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODgzZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3Jlc291cmNlcy9NRVRBLUlORi94c2QxLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIg0KLSAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPg0KLSAgICA8eHM6aW1wb3J0DQotICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly8xMzEuMTA3LjcyLjE1L1NvYXBXc2RsX0Jhc2VEYXRhVHlwZXNfWG1sRm9ybWF0dGVyX1NlcnZpY2VfSW5kaWdvL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLnN2Yz94c2Q9eHNkMCINCi0gICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6aW1wb3J0DQotICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly8xMzEuMTA3LjcyLjE1L1NvYXBXc2RsX0Jhc2VEYXRhVHlwZXNfWG1sRm9ybWF0dGVyX1NlcnZpY2VfSW5kaWdvL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLnN2Yz94c2Q9eHNkMiINCi0gICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLmRhdGFjb250cmFjdC5vcmcvMjAwNC8wNy9TeXN0ZW0iLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5Cb29sIiB0eXBlPSJ4czpib29sZWFuIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldEJvb2xSZXN1bHQiIHR5cGU9InhzOmJvb2xlYW4iLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5CeXRlIiB0eXBlPSJ4czp1bnNpZ25lZEJ5dGUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0Qnl0ZVJlc3VsdCIgdHlwZT0ieHM6dW5zaWduZWRCeXRlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluU0J5dGUiIHR5cGU9InhzOmJ5dGUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0U0J5dGVSZXN1bHQiIHR5cGU9InhzOmJ5dGUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5CeXRlQXJyYXkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0Qnl0ZUFycmF5UmVzdWx0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluQ2hhciIgdHlwZT0icTE6Y2hhciIgeG1sbnM6cTE9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRDaGFyUmVzdWx0IiB0eXBlPSJxMjpjaGFyIiB4bWxuczpxMj0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluRGVjaW1hbCIgdHlwZT0ieHM6ZGVjaW1hbCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXREZWNpbWFsUmVzdWx0IiB0eXBlPSJ4czpkZWNpbWFsIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluRmxvYXQiIHR5cGU9InhzOmZsb2F0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldEZsb2F0UmVzdWx0IiB0eXBlPSJ4czpmbG9hdCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkRvdWJsZSIgdHlwZT0ieHM6ZG91YmxlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldERvdWJsZVJlc3VsdCIgdHlwZT0ieHM6ZG91YmxlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluU2luZ2xlIiB0eXBlPSJ4czpmbG9hdCIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRTaW5nbGVSZXN1bHQiIHR5cGU9InhzOmZsb2F0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluSW50IiB0eXBlPSJ4czppbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0SW50UmVzdWx0IiB0eXBlPSJ4czppbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5TaG9ydCIgdHlwZT0ieHM6c2hvcnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0U2hvcnRSZXN1bHQiIHR5cGU9InhzOnNob3J0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluTG9uZyIgdHlwZT0ieHM6bG9uZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRMb25nUmVzdWx0IiB0eXBlPSJ4czpsb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluT2JqZWN0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6YW55VHlwZSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRPYmplY3RSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlUeXBlIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluVUludCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0VUludFJlc3VsdCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5VU2hvcnQiIHR5cGU9InhzOnVuc2lnbmVkU2hvcnQiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0VVNob3J0UmVzdWx0IiB0eXBlPSJ4czp1bnNpZ25lZFNob3J0Ii8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluVUxvbmciIHR5cGU9InhzOnVuc2lnbmVkTG9uZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRVTG9uZ1Jlc3VsdCIgdHlwZT0ieHM6dW5zaWduZWRMb25nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluU3RyaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldFN0cmluZ1Jlc3VsdCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpbkd1aWQiIHR5cGU9InEzOmd1aWQiIHhtbG5zOnEzPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0R3VpZFJlc3VsdCIgdHlwZT0icTQ6Z3VpZCIgeG1sbnM6cTQ9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblVyaSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXRVcmlSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iaW5EYXRlVGltZSIgdHlwZT0ieHM6ZGF0ZVRpbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0RGF0ZVRpbWVSZXN1bHQiIHR5cGU9InhzOmRhdGVUaW1lIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluRGF0ZVRpbWVPZmZzZXQiIHR5cGU9InE1OkRhdGVUaW1lT2Zmc2V0Ig0KLSAgICAgICAgICAgICAgICB4bWxuczpxNT0iaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1N5c3RlbSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIgdHlwZT0icTY6RGF0ZVRpbWVPZmZzZXQiDQotICAgICAgICAgICAgICAgIHhtbG5zOnE2PSJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImluVGltZVNwYW4iIHR5cGU9InE3OmR1cmF0aW9uIiB4bWxuczpxNz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9IlJldFRpbWVTcGFuUmVzdWx0IiB0eXBlPSJxODpkdXJhdGlvbiINCi0gICAgICAgICAgICAgICAgeG1sbnM6cTg9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJpblFOYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6UU5hbWUiLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iUmV0UU5hbWVSZXN1bHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpRTmFtZSIvPg0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMi54c2QgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3AvcmVzb3VyY2VzL01FVEEtSU5GL3hzZDIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTdmOWY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9yZXNvdXJjZXMvTUVUQS1JTkYveHNkMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTx4czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1N5c3RlbSINCi0gICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dG5zPSJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIj4NCi0gICAgPHhzOmltcG9ydA0KLSAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vMTMxLjEwNy43Mi4xNS9Tb2FwV3NkbF9CYXNlRGF0YVR5cGVzX1htbEZvcm1hdHRlcl9TZXJ2aWNlX0luZGlnby9CYXNlRGF0YVR5cGVzRG9jTGl0Qi5zdmM/eHNkPXhzZDAiDQotICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLz4NCi0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkRhdGVUaW1lT2Zmc2V0Ij4NCi0gICAgICAgIDx4czphbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDx4czphcHBpbmZvPg0KLSAgICAgICAgICAgICAgICA8SXNWYWx1ZVR5cGUgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyI+dHJ1ZTwvSXNWYWx1ZVR5cGU+DQotICAgICAgICAgICAgPC94czphcHBpbmZvPg0KLSAgICAgICAgPC94czphbm5vdGF0aW9uPg0KLSAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkRhdGVUaW1lIiB0eXBlPSJ4czpkYXRlVGltZSIvPg0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Ik9mZnNldE1pbnV0ZXMiIHR5cGU9InhzOnNob3J0Ii8+DQotICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJEYXRlVGltZU9mZnNldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpEYXRlVGltZU9mZnNldCIvPg0KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvY29tL21pY3Jvc29mdC9zY2hlbWFzL18yMDAzL18xMC9zZXJpYWxpemF0aW9uL09iamVjdEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvY29tL21pY3Jvc29mdC9zY2hlbWFzL18yMDAzL18xMC9zZXJpYWxpemF0aW9uL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzNzZlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL2NvbS9taWNyb3NvZnQvc2NoZW1hcy9fMjAwMy9fMTAvc2VyaWFsaXphdGlvbi9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotcGFja2FnZSBjb20ubWljcm9zb2Z0LnNjaGVtYXMuXzIwMDMuXzEwLnNlcmlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0KLS8qKgotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIAotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZSAKLSAqIGdlbmVyYXRlZCBpbiB0aGUgY29tLm1pY3Jvc29mdC5zY2hlbWFzLl8yMDAzLl8xMC5zZXJpYWxpemF0aW9uIHBhY2thZ2UuIAotICogPHA+QW4gT2JqZWN0RmFjdG9yeSBhbGxvd3MgeW91IHRvIHByb2dyYW1hdGljYWxseSAKLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIAotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgCi0gKiBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMgCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hIAotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIAotICogZ3JvdXBzLiAgRmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIG9mIHRoZXNlIGFyZSAKLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCi0gKiAKLSAqLwotQFhtbFJlZ2lzdHJ5Ci1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfVW5zaWduZWRMb25nX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAidW5zaWduZWRMb25nIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1N0cmluZ19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgInN0cmluZyIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9EdXJhdGlvbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImR1cmF0aW9uIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0d1aWRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJndWlkIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0RlY2ltYWxfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJkZWNpbWFsIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1Vuc2lnbmVkSW50X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAidW5zaWduZWRJbnQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfU2hvcnRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJzaG9ydCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9VbnNpZ25lZFNob3J0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAidW5zaWduZWRTaG9ydCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9RTmFtZV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgIlFOYW1lIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0RhdGVUaW1lX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiZGF0ZVRpbWUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfRG91YmxlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiZG91YmxlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0ludF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImludCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9BbnlUeXBlX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiYW55VHlwZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9VbnNpZ25lZEJ5dGVfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJ1bnNpZ25lZEJ5dGUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQm9vbGVhbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImJvb2xlYW4iKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQnl0ZV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImJ5dGUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQmFzZTY0QmluYXJ5X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiYmFzZTY0QmluYXJ5Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0xvbmdfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsICJsb25nIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0Zsb2F0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiZmxvYXQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQ2hhcl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgImNoYXIiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfQW55VVJJX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCAiYW55VVJJIik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IGNvbS5taWNyb3NvZnQuc2NoZW1hcy5fMjAwMy5fMTAuc2VyaWFsaXphdGlvbgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBCaWdJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gInVuc2lnbmVkTG9uZyIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJpZ0ludGVnZXI+IGNyZWF0ZVVuc2lnbmVkTG9uZyhCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnSW50ZWdlcj4oX1Vuc2lnbmVkTG9uZ19RTkFNRSwgQmlnSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAic3RyaW5nIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfU3RyaW5nX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRHVyYXRpb24gfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiZHVyYXRpb24iKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxEdXJhdGlvbj4gY3JlYXRlRHVyYXRpb24oRHVyYXRpb24gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxEdXJhdGlvbj4oX0R1cmF0aW9uX1FOQU1FLCBEdXJhdGlvbi5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiZ3VpZCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PFN0cmluZz4gY3JlYXRlR3VpZChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTdHJpbmc+KF9HdWlkX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQmlnRGVjaW1hbCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJkZWNpbWFsIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QmlnRGVjaW1hbD4gY3JlYXRlRGVjaW1hbChCaWdEZWNpbWFsIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnRGVjaW1hbD4oX0RlY2ltYWxfUU5BTUUsIEJpZ0RlY2ltYWwuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgTG9uZyB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJ1bnNpZ25lZEludCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PExvbmc+IGNyZWF0ZVVuc2lnbmVkSW50KExvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxMb25nPihfVW5zaWduZWRJbnRfUU5BTUUsIExvbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgU2hvcnQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAic2hvcnQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTaG9ydD4gY3JlYXRlU2hvcnQoU2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTaG9ydD4oX1Nob3J0X1FOQU1FLCBTaG9ydC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gInVuc2lnbmVkU2hvcnQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxJbnRlZ2VyPiBjcmVhdGVVbnNpZ25lZFNob3J0KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfVW5zaWduZWRTaG9ydF9RTkFNRSwgSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBRTmFtZSB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJRTmFtZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PFFOYW1lPiBjcmVhdGVRTmFtZShRTmFtZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFFOYW1lPihfUU5hbWVfUU5BTUUsIFFOYW1lLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFhNTEdyZWdvcmlhbkNhbGVuZGFyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImRhdGVUaW1lIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8WE1MR3JlZ29yaWFuQ2FsZW5kYXI+IGNyZWF0ZURhdGVUaW1lKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8WE1MR3JlZ29yaWFuQ2FsZW5kYXI+KF9EYXRlVGltZV9RTkFNRSwgWE1MR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRG91YmxlIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImRvdWJsZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PERvdWJsZT4gY3JlYXRlRG91YmxlKERvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PERvdWJsZT4oX0RvdWJsZV9RTkFNRSwgRG91YmxlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEludGVnZXIgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiaW50IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8SW50ZWdlcj4gY3JlYXRlSW50KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfSW50X1FOQU1FLCBJbnRlZ2VyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIE9iamVjdCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJhbnlUeXBlIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8T2JqZWN0PiBjcmVhdGVBbnlUeXBlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PE9iamVjdD4oX0FueVR5cGVfUU5BTUUsIE9iamVjdC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTaG9ydCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJ1bnNpZ25lZEJ5dGUiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTaG9ydD4gY3JlYXRlVW5zaWduZWRCeXRlKFNob3J0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U2hvcnQ+KF9VbnNpZ25lZEJ5dGVfUU5BTUUsIFNob3J0LmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEJvb2xlYW4gfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiYm9vbGVhbiIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJvb2xlYW4+IGNyZWF0ZUJvb2xlYW4oQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJvb2xlYW4+KF9Cb29sZWFuX1FOQU1FLCBCb29sZWFuLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEJ5dGUgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiYnl0ZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJ5dGU+IGNyZWF0ZUJ5dGUoQnl0ZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJ5dGU+KF9CeXRlX1FOQU1FLCBCeXRlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIGJ5dGVbXX17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImJhc2U2NEJpbmFyeSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PGJ5dGVbXT4gY3JlYXRlQmFzZTY0QmluYXJ5KGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PGJ5dGVbXT4oX0Jhc2U2NEJpbmFyeV9RTkFNRSwgYnl0ZVtdLmNsYXNzLCBudWxsLCAoKGJ5dGVbXSkgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgTG9uZyB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS8yMDAzLzEwL1NlcmlhbGl6YXRpb24vIiwgbmFtZSA9ICJsb25nIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8TG9uZz4gY3JlYXRlTG9uZyhMb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8TG9uZz4oX0xvbmdfUU5BTUUsIExvbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRmxvYXQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiZmxvYXQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxGbG9hdD4gY3JlYXRlRmxvYXQoRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxGbG9hdD4oX0Zsb2F0X1FOQU1FLCBGbG9hdC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tLzIwMDMvMTAvU2VyaWFsaXphdGlvbi8iLCBuYW1lID0gImNoYXIiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxJbnRlZ2VyPiBjcmVhdGVDaGFyKEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfQ2hhcl9RTkFNRSwgSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vMjAwMy8xMC9TZXJpYWxpemF0aW9uLyIsIG5hbWUgPSAiYW55VVJJIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVBbnlVUkkoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfQW55VVJJX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdmZGEyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW50ZXJvcC9JbnRlcm9wU2FtcGxlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmludGVyb3A7Ci0KLWltcG9ydCBvcmcudGVtcHVyaS4qOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm9wU2FtcGxlQ2xpZW50Ci17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICAvKkNyZWF0ZSB0aGUgZHluYW1pYyBwcm94eSovCi0gICAgSUJhc2VEYXRhVHlwZXNEb2NMaXRCIHByb3h5ID0gbmV3IEJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSgpLmdldEJhc2ljSHR0cEJpbmRpbmdJQmFzZURhdGFUeXBlc0RvY0xpdEIoKTsKLQotICAgIC8qSW52b2tlIHRoZSBzZXJ2aWNlKi8KLSAgICBpZiAoIXByb3h5LnJldEJvb2wodHJ1ZSkpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaGUgc2VydmljZSBzaG91bGQgaGF2ZSByZXR1cm5lZCAndHJ1ZSciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocHJveHkucmV0SW50KDQyKSAhPSA0MikKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBzZXJ2aWNlIHNob3VsZCBoYXZlIHJldHVybmVkICc0MiciKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0gICAgaWYgKCF0ZXN0U3RyaW5nLmVxdWFscyhwcm94eS5yZXRTdHJpbmcodGVzdFN0cmluZykpKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGhlIHNlcnZpY2Ugc2hvdWxkIGhhdmUgcmV0dXJuZWQgJyIrdGVzdFN0cmluZysiJyIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIHRlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9hcGFjaGUvYXhpczIvamF4d3MvaW50ZXJvcC9JbnRlcm9wU2FtcGxlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmZiM2RlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9pbnRlcm9wL0ludGVyb3BTYW1wbGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5pbnRlcm9wOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmRhdGFjb250cmFjdC5zY2hlbWFzLl8yMDA0Ll8wNy5zeXN0ZW0uRGF0ZVRpbWVPZmZzZXQ7Ci1pbXBvcnQgb3JnLnRlbXB1cmkuKjsKLQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9IkJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSIsIHBvcnROYW1lPSJCYXNpY0h0dHBCaW5kaW5nX0lCYXNlRGF0YVR5cGVzRG9jTGl0QiIsIG5hbWUgPSAiSUJhc2VEYXRhVHlwZXNEb2NMaXRCIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCB3c2RsTG9jYXRpb249Ik1FVEEtSU5GL0Jhc2VEYXRhVHlwZXNEb2NMaXRCLndzZGwiKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBjbGFzcyBJbnRlcm9wU2FtcGxlU2VydmljZSBpbXBsZW1lbnRzIElCYXNlRGF0YVR5cGVzRG9jTGl0QgotewotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkJvb2wKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYm9vbGVhbgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRCb29sIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Qm9vbCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEJvb2xSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEJvb2xSZXN1bHQiKQotICAgIHB1YmxpYyBib29sZWFuIHJldEJvb2woCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluQm9vbCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5Cb29sIikKLSAgICAgICAgYm9vbGVhbiBpbkJvb2wpCi0gIHsKLSAgICByZXR1cm4gaW5Cb29sOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5CeXRlCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIHNob3J0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldEJ5dGUiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRCeXRlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0Qnl0ZVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Qnl0ZVJlc3VsdCIpCi0gICAgcHVibGljIHNob3J0IHJldEJ5dGUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluQnl0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5CeXRlIikKLSAgICAgICAgc2hvcnQgaW5CeXRlKQotICB7Ci0gICAgcmV0dXJuIGluQnl0ZTsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluU0J5dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTQnl0ZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNCeXRlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U0J5dGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TQnl0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TQnl0ZSIpCi0gICAgICAgIGJ5dGUgaW5TQnl0ZSkKLSAgewotICAgIHJldHVybiBpblNCeXRlOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5CeXRlQXJyYXkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZVtdCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldEJ5dGVBcnJheSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEJ5dGVBcnJheVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Qnl0ZUFycmF5UmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5CeXRlQXJyYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQnl0ZUFycmF5IikKLSAgICAgICAgYnl0ZVtdIGluQnl0ZUFycmF5KQotICB7Ci0gICAgcmV0dXJuIGluQnl0ZUFycmF5OwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5DaGFyCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGludAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRDaGFyIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0Q2hhciIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldENoYXJSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldENoYXJSZXN1bHQiKQotICAgIHB1YmxpYyBpbnQgcmV0Q2hhcigKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5DaGFyIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkNoYXIiKQotICAgICAgICBpbnQgaW5DaGFyKQotICB7Ci0gICAgcmV0dXJuIGluQ2hhcjsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluRGVjaW1hbAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLm1hdGguQmlnRGVjaW1hbAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREZWNpbWFsIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGVjaW1hbCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldERlY2ltYWxSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERlY2ltYWxSZXN1bHQiKQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGVjaW1hbCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EZWNpbWFsIikKLSAgICAgICAgQmlnRGVjaW1hbCBpbkRlY2ltYWwpCi0gIHsKLSAgICByZXR1cm4gaW5EZWNpbWFsOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5GbG9hdAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmbG9hdAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRGbG9hdCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEZsb2F0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RmxvYXRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEZsb2F0UmVzdWx0IikKLSAgICBwdWJsaWMgZmxvYXQgcmV0RmxvYXQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRmxvYXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRmxvYXQiKQotICAgICAgICBmbG9hdCBpbkZsb2F0KQotICB7Ci0gICAgcmV0dXJuIGluRmxvYXQ7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRvdWJsZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBkb3VibGUKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0RG91YmxlIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RG91YmxlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RG91YmxlUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXREb3VibGVSZXN1bHQiKQotICAgIHB1YmxpYyBkb3VibGUgcmV0RG91YmxlKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkRvdWJsZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5Eb3VibGUiKQotICAgICAgICBkb3VibGUgaW5Eb3VibGUpCi0gIHsKLSAgICByZXR1cm4gaW5Eb3VibGU7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblNpbmdsZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmbG9hdAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTaW5nbGUiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRTaW5nbGUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRTaW5nbGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNpbmdsZVJlc3VsdCIpCi0gICAgcHVibGljIGZsb2F0IHJldFNpbmdsZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TaW5nbGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU2luZ2xlIikKLSAgICAgICAgZmxvYXQgaW5TaW5nbGUpCi0gIHsKLSAgICByZXR1cm4gaW5TaW5nbGU7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkludAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBpbnQKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0SW50IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0SW50IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0SW50UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRJbnRSZXN1bHQiKQotICAgIHB1YmxpYyBpbnQgcmV0SW50KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkludCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5JbnQiKQotICAgICAgICBpbnQgaW5JbnQpCi0gIHsKLSAgICByZXR1cm4gaW5JbnQ7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblNob3J0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIHNob3J0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFNob3J0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U2hvcnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRTaG9ydFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0U2hvcnRSZXN1bHQiKQotICAgIHB1YmxpYyBzaG9ydCByZXRTaG9ydCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TaG9ydCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TaG9ydCIpCi0gICAgICAgIHNob3J0IGluU2hvcnQpCi0gIHsKLSAgICByZXR1cm4gaW5TaG9ydDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluTG9uZwotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBsb25nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldExvbmciLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRMb25nIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0TG9uZ1Jlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0TG9uZ1Jlc3VsdCIpCi0gICAgcHVibGljIGxvbmcgcmV0TG9uZygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5Mb25nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkxvbmciKQotICAgICAgICBsb25nIGluTG9uZykKLSAgewotICAgIHJldHVybiBpbkxvbmc7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbk9iamVjdAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuT2JqZWN0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldE9iamVjdCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldE9iamVjdCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldE9iamVjdFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0T2JqZWN0UmVzdWx0IikKLSAgICBwdWJsaWMgT2JqZWN0IHJldE9iamVjdCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5PYmplY3QiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluT2JqZWN0IikKLSAgICAgICAgT2JqZWN0IGluT2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIGluT2JqZWN0OwotICB9Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5VSW50Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGxvbmcKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0VUludCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVJbnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRVSW50UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRVSW50UmVzdWx0IikKLSAgICBwdWJsaWMgbG9uZyByZXRVSW50KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblVJbnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVUludCIpCi0gICAgICAgIGxvbmcgaW5VSW50KQotICB7Ci0gICAgcmV0dXJuIGluVUludDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVVNob3J0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGludAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRVU2hvcnQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVU2hvcnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRVU2hvcnRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFVTaG9ydFJlc3VsdCIpCi0gICAgcHVibGljIGludCByZXRVU2hvcnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluVVNob3J0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpblVTaG9ydCIpCi0gICAgICAgIGludCBpblVTaG9ydCkKLSAgewotICAgIHJldHVybiBpblVTaG9ydDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVUxvbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5tYXRoLkJpZ0ludGVnZXIKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0VUxvbmciLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVTG9uZyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFVMb25nUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRVTG9uZ1Jlc3VsdCIpCi0gICAgcHVibGljIEJpZ0ludGVnZXIgcmV0VUxvbmcoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluVUxvbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVUxvbmciKQotICAgICAgICBCaWdJbnRlZ2VyIGluVUxvbmcpCi0gIHsKLSAgICByZXR1cm4gaW5VTG9uZzsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluU3RyaW5nCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0U3RyaW5nIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0U3RyaW5nIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U3RyaW5nUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRTdHJpbmdSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0U3RyaW5nKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblN0cmluZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TdHJpbmciKQotICAgICAgICBTdHJpbmcgaW5TdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gaW5TdHJpbmc7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkd1aWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRHdWlkIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0R3VpZCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEd1aWRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEd1aWRSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0R3VpZCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5HdWlkIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkd1aWQiKQotICAgICAgICBTdHJpbmcgaW5HdWlkKQotICB7Ci0gICAgcmV0dXJuIGluR3VpZDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVXJpCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0VXJpIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VXJpIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0VXJpUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRVcmlSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0VXJpKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblVyaSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5VcmkiKQotICAgICAgICBTdHJpbmcgaW5VcmkpCi0gIHsKLSAgICByZXR1cm4gaW5Vcmk7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREYXRlVGltZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RGF0ZVRpbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERhdGVUaW1lUmVzdWx0IikKLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGF0ZVRpbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRGF0ZVRpbWUiKQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhciBpbkRhdGVUaW1lKQotICB7Ci0gICAgcmV0dXJuIGluRGF0ZVRpbWU7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lT2Zmc2V0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtLkRhdGVUaW1lT2Zmc2V0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldERhdGVUaW1lT2Zmc2V0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGF0ZVRpbWVPZmZzZXQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0RGF0ZVRpbWVPZmZzZXRSZXN1bHQiKQotICAgIHB1YmxpYyBEYXRlVGltZU9mZnNldCByZXREYXRlVGltZU9mZnNldCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIpCi0gICAgICAgIERhdGVUaW1lT2Zmc2V0IGluRGF0ZVRpbWVPZmZzZXQpCi0gIHsKLSAgICByZXR1cm4gaW5EYXRlVGltZU9mZnNldDsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVGltZVNwYW4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFRpbWVTcGFuIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VGltZVNwYW4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRUaW1lU3BhblJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VGltZVNwYW5SZXN1bHQiKQotICAgIHB1YmxpYyBEdXJhdGlvbiByZXRUaW1lU3BhbigKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5UaW1lU3BhbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5UaW1lU3BhbiIpCi0gICAgICAgIER1cmF0aW9uIGluVGltZVNwYW4pCi0gIHsKLSAgICByZXR1cm4gaW5UaW1lU3BhbjsKLSAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRRTmFtZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0UU5hbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFFOYW1lUmVzdWx0IikKLSAgICBwdWJsaWMgUU5hbWUgcmV0UU5hbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluUU5hbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluUU5hbWUiKQotICAgICAgICBRTmFtZSBpblFOYW1lKQotICB7Ci0gICAgcmV0dXJuIGluUU5hbWU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9EYXRlVGltZU9mZnNldC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9EYXRlVGltZU9mZnNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWMyZjkwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2RhdGFjb250cmFjdC9zY2hlbWFzL18yMDA0L18wNy9zeXN0ZW0vRGF0ZVRpbWVPZmZzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1wYWNrYWdlIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotCi0KLS8qKgotICogPHA+SmF2YSBjbGFzcyBmb3IgRGF0ZVRpbWVPZmZzZXQgY29tcGxleCB0eXBlLgotICogCi0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogCi0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkRhdGVUaW1lT2Zmc2V0Ij4KLSAqICAgJmx0O2NvbXBsZXhDb250ZW50PgotICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9IkRhdGVUaW1lIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9ZGF0ZVRpbWUiLz4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iT2Zmc2V0TWludXRlcyIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXNob3J0Ii8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKiAKLSAqIAotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIkRhdGVUaW1lT2Zmc2V0IiwgbmFtZXNwYWNlID0gImh0dHA6Ly9zY2hlbWFzLmRhdGFjb250cmFjdC5vcmcvMjAwNC8wNy9TeXN0ZW0iLCBwcm9wT3JkZXIgPSB7Ci0gICAgImRhdGVUaW1lIiwKLSAgICAib2Zmc2V0TWludXRlcyIKLX0pCi1wdWJsaWMgY2xhc3MgRGF0ZVRpbWVPZmZzZXQgewotCi0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJEYXRlVGltZSIsIHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZGF0ZVRpbWU7Ci0gICAgQFhtbEVsZW1lbnQobmFtZSA9ICJPZmZzZXRNaW51dGVzIikKLSAgICBwcm90ZWN0ZWQgc2hvcnQgb2Zmc2V0TWludXRlczsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkYXRlVGltZSBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICB7QGxpbmsgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgfQotICAgICAqICAgICAKLSAgICAgKi8KLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RGF0ZVRpbWUoKSB7Ci0gICAgICAgIHJldHVybiBkYXRlVGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGF0ZVRpbWUgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgIHtAbGluayBYTUxHcmVnb3JpYW5DYWxlbmRhciB9Ci0gICAgICogICAgIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGVUaW1lKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZGF0ZVRpbWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb2Zmc2V0TWludXRlcyBwcm9wZXJ0eS4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgc2hvcnQgZ2V0T2Zmc2V0TWludXRlcygpIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldE1pbnV0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG9mZnNldE1pbnV0ZXMgcHJvcGVydHkuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T2Zmc2V0TWludXRlcyhzaG9ydCB2YWx1ZSkgewotICAgICAgICB0aGlzLm9mZnNldE1pbnV0ZXMgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtaW50ZXJvcC9zcmMvb3JnL2RhdGFjb250cmFjdC9zY2hlbWFzL18yMDA0L18wNy9zeXN0ZW0vT2JqZWN0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWY5MzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9PYmplY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1wYWNrYWdlIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlIAotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuZGF0YWNvbnRyYWN0LnNjaGVtYXMuXzIwMDQuXzA3LnN5c3RlbSBwYWNrYWdlLiAKLSAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkgCi0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbiAKLSAqIGZvciBYTUwgY29udGVudC4gVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgWE1MIAotICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzIAotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYSAKLSAqIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbCAKLSAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUgCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICogCi0gKi8KLUBYbWxSZWdpc3RyeQotcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0RhdGVUaW1lT2Zmc2V0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIiwgIkRhdGVUaW1lT2Zmc2V0Iik7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBEYXRlVGltZU9mZnNldCB9Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIERhdGVUaW1lT2Zmc2V0IGNyZWF0ZURhdGVUaW1lT2Zmc2V0KCkgewotICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lT2Zmc2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIERhdGVUaW1lT2Zmc2V0IH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vc2NoZW1hcy5kYXRhY29udHJhY3Qub3JnLzIwMDQvMDcvU3lzdGVtIiwgbmFtZSA9ICJEYXRlVGltZU9mZnNldCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PERhdGVUaW1lT2Zmc2V0PiBjcmVhdGVEYXRlVGltZU9mZnNldChEYXRlVGltZU9mZnNldCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PERhdGVUaW1lT2Zmc2V0PihfRGF0ZVRpbWVPZmZzZXRfUU5BTUUsIERhdGVUaW1lT2Zmc2V0LmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9kYXRhY29udHJhY3Qvc2NoZW1hcy9fMjAwNC9fMDcvc3lzdGVtL3BhY2thZ2UtaW5mby5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvZGF0YWNvbnRyYWN0L3NjaGVtYXMvXzIwMDQvXzA3L3N5c3RlbS9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1ZTQwZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy9kYXRhY29udHJhY3Qvc2NoZW1hcy9fMjAwNC9fMDcvc3lzdGVtL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL3NjaGVtYXMuZGF0YWNvbnRyYWN0Lm9yZy8yMDA0LzA3L1N5c3RlbSIsIGVsZW1lbnRGb3JtRGVmYXVsdCA9IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnNGb3JtLlFVQUxJRklFRCkKLXBhY2thZ2Ugb3JnLmRhdGFjb250cmFjdC5zY2hlbWFzLl8yMDA0Ll8wNy5zeXN0ZW07CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvdGVtcHVyaS9CYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhYzNhZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0Jhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKgotKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotcGFja2FnZSBvcmcudGVtcHVyaTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViRW5kcG9pbnQ7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VDbGllbnQ7Ci0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiQmFzZURhdGFUeXBlc0RvY0xpdEJTZXJ2aWNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCB3c2RsTG9jYXRpb24gPSAiL3RtcC9CYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsIikKLXB1YmxpYyBjbGFzcyBCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UKLSAgICBleHRlbmRzIFNlcnZpY2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFVSTCBCQVNFREFUQVRZUEVTRE9DTElUQlNFUlZJQ0VfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTpCYXNlRGF0YVR5cGVzRG9jTGl0Qi53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIEJBU0VEQVRBVFlQRVNET0NMSVRCU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJhc2VEYXRhVHlwZXNEb2NMaXRCU2VydmljZSgpIHsKLSAgICAgICAgc3VwZXIoQkFTRURBVEFUWVBFU0RPQ0xJVEJTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJCYXNlRGF0YVR5cGVzRG9jTGl0QlNlcnZpY2UiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIElCYXNlRGF0YVR5cGVzRG9jTGl0QgotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkJhc2ljSHR0cEJpbmRpbmdfSUJhc2VEYXRhVHlwZXNEb2NMaXRCIikKLSAgICBwdWJsaWMgSUJhc2VEYXRhVHlwZXNEb2NMaXRCIGdldEJhc2ljSHR0cEJpbmRpbmdJQmFzZURhdGFUeXBlc0RvY0xpdEIoKSB7Ci0gICAgICAgIHJldHVybiAoSUJhc2VEYXRhVHlwZXNEb2NMaXRCKXN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIkJhc2ljSHR0cEJpbmRpbmdfSUJhc2VEYXRhVHlwZXNEb2NMaXRCIiksIElCYXNlRGF0YVR5cGVzRG9jTGl0Qi5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvdGVtcHVyaS9JQmFzZURhdGFUeXBlc0RvY0xpdEIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxMDY2Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0qIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSogdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0KLXBhY2thZ2Ugb3JnLnRlbXB1cmk7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZGF0YWNvbnRyYWN0LnNjaGVtYXMuXzIwMDQuXzA3LnN5c3RlbS5EYXRlVGltZU9mZnNldDsKLQotQFdlYlNlcnZpY2UobmFtZSA9ICJJQmFzZURhdGFUeXBlc0RvY0xpdEIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIpCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBTT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5CQVJFKQotcHVibGljIGludGVyZmFjZSBJQmFzZURhdGFUeXBlc0RvY0xpdEIgewotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5Cb29sCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGJvb2xlYW4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0Qm9vbCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJvb2wiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRCb29sUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRCb29sUmVzdWx0IikKLSAgICBwdWJsaWMgYm9vbGVhbiByZXRCb29sKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkJvb2wiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQm9vbCIpCi0gICAgICAgIGJvb2xlYW4gaW5Cb29sKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkJ5dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgc2hvcnQKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0Qnl0ZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRCeXRlUmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgc2hvcnQgcmV0Qnl0ZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5CeXRlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkJ5dGUiKQotICAgICAgICBzaG9ydCBpbkJ5dGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluU0J5dGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTQnl0ZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNCeXRlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U0J5dGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZSByZXRTQnl0ZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TQnl0ZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5TQnl0ZSIpCi0gICAgICAgIGJ5dGUgaW5TQnl0ZSk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5CeXRlQXJyYXkKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgYnl0ZVtdCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldEJ5dGVBcnJheSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldEJ5dGVBcnJheSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEJ5dGVBcnJheVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Qnl0ZUFycmF5UmVzdWx0IikKLSAgICBwdWJsaWMgYnl0ZVtdIHJldEJ5dGVBcnJheSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5CeXRlQXJyYXkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQnl0ZUFycmF5IikKLSAgICAgICAgYnl0ZVtdIGluQnl0ZUFycmF5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkNoYXIKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgaW50Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldENoYXIiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRDaGFyIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0Q2hhclJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0Q2hhclJlc3VsdCIpCi0gICAgcHVibGljIGludCByZXRDaGFyKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkNoYXIiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluQ2hhciIpCi0gICAgICAgIGludCBpbkNoYXIpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluRGVjaW1hbAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLm1hdGguQmlnRGVjaW1hbAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREZWNpbWFsIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGVjaW1hbCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldERlY2ltYWxSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERlY2ltYWxSZXN1bHQiKQotICAgIHB1YmxpYyBCaWdEZWNpbWFsIHJldERlY2ltYWwoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGVjaW1hbCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EZWNpbWFsIikKLSAgICAgICAgQmlnRGVjaW1hbCBpbkRlY2ltYWwpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluRmxvYXQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgZmxvYXQKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0RmxvYXQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRGbG9hdCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEZsb2F0UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRGbG9hdFJlc3VsdCIpCi0gICAgcHVibGljIGZsb2F0IHJldEZsb2F0KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbkZsb2F0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkZsb2F0IikKLSAgICAgICAgZmxvYXQgaW5GbG9hdCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5Eb3VibGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgZG91YmxlCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldERvdWJsZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERvdWJsZSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldERvdWJsZVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0RG91YmxlUmVzdWx0IikKLSAgICBwdWJsaWMgZG91YmxlIHJldERvdWJsZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5Eb3VibGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRG91YmxlIikKLSAgICAgICAgZG91YmxlIGluRG91YmxlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblNpbmdsZQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBmbG9hdAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTaW5nbGUiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRTaW5nbGUiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRTaW5nbGVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNpbmdsZVJlc3VsdCIpCi0gICAgcHVibGljIGZsb2F0IHJldFNpbmdsZSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TaW5nbGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU2luZ2xlIikKLSAgICAgICAgZmxvYXQgaW5TaW5nbGUpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluSW50Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGludAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRJbnQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRJbnQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRJbnRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEludFJlc3VsdCIpCi0gICAgcHVibGljIGludCByZXRJbnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluSW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkludCIpCi0gICAgICAgIGludCBpbkludCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5TaG9ydAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBzaG9ydAotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRTaG9ydCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFNob3J0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0U2hvcnRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFNob3J0UmVzdWx0IikKLSAgICBwdWJsaWMgc2hvcnQgcmV0U2hvcnQoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluU2hvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU2hvcnQiKQotICAgICAgICBzaG9ydCBpblNob3J0KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkxvbmcKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgbG9uZwotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRMb25nIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0TG9uZyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldExvbmdSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldExvbmdSZXN1bHQiKQotICAgIHB1YmxpYyBsb25nIHJldExvbmcoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluTG9uZyIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5Mb25nIikKLSAgICAgICAgbG9uZyBpbkxvbmcpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluT2JqZWN0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubGFuZy5PYmplY3QKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiUmV0T2JqZWN0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0T2JqZWN0IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0T2JqZWN0UmVzdWx0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJSZXRPYmplY3RSZXN1bHQiKQotICAgIHB1YmxpYyBPYmplY3QgcmV0T2JqZWN0KAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbk9iamVjdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5PYmplY3QiKQotICAgICAgICBPYmplY3QgaW5PYmplY3QpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVUludAotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBsb25nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVJbnQiLCBhY3Rpb24gPSAiaHR0cDovL3RlbXB1cmkub3JnL0lCYXNlRGF0YVR5cGVzRG9jTGl0Qi9SZXRVSW50IikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0VUludFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VUludFJlc3VsdCIpCi0gICAgcHVibGljIGxvbmcgcmV0VUludCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5VSW50IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpblVJbnQiKQotICAgICAgICBsb25nIGluVUludCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5VU2hvcnQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgaW50Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVTaG9ydCIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVTaG9ydCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFVTaG9ydFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VVNob3J0UmVzdWx0IikKLSAgICBwdWJsaWMgaW50IHJldFVTaG9ydCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5VU2hvcnQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVVNob3J0IikKLSAgICAgICAgaW50IGluVVNob3J0KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblVMb25nCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVMb25nIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VUxvbmciKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRVTG9uZ1Jlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VUxvbmdSZXN1bHQiKQotICAgIHB1YmxpYyBCaWdJbnRlZ2VyIHJldFVMb25nKAotICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpblVMb25nIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpblVMb25nIikKLSAgICAgICAgQmlnSW50ZWdlciBpblVMb25nKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblN0cmluZwotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFN0cmluZyIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFN0cmluZyIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFN0cmluZ1Jlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0U3RyaW5nUmVzdWx0IikKLSAgICBwdWJsaWMgU3RyaW5nIHJldFN0cmluZygKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5TdHJpbmciLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluU3RyaW5nIikKLSAgICAgICAgU3RyaW5nIGluU3RyaW5nKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkd1aWQKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YS5sYW5nLlN0cmluZwotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRHdWlkIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0R3VpZCIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldEd1aWRSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldEd1aWRSZXN1bHQiKQotICAgIHB1YmxpYyBTdHJpbmcgcmV0R3VpZCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5HdWlkIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBwYXJ0TmFtZSA9ICJpbkd1aWQiKQotICAgICAgICBTdHJpbmcgaW5HdWlkKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpblVyaQotICAgICAqIEByZXR1cm4KLSAgICAgKiAgICAgcmV0dXJucyBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFVyaSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFVyaSIpCi0gICAgQFdlYlJlc3VsdChuYW1lID0gIlJldFVyaVJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VXJpUmVzdWx0IikKLSAgICBwdWJsaWMgU3RyaW5nIHJldFVyaSgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5VcmkiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluVXJpIikKLSAgICAgICAgU3RyaW5nIGluVXJpKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lCi0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXREYXRlVGltZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldERhdGVUaW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0RGF0ZVRpbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldERhdGVUaW1lUmVzdWx0IikKLSAgICBwdWJsaWMgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgcmV0RGF0ZVRpbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluRGF0ZVRpbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluRGF0ZVRpbWUiKQotICAgICAgICBYTUxHcmVnb3JpYW5DYWxlbmRhciBpbkRhdGVUaW1lKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEBwYXJhbSBpbkRhdGVUaW1lT2Zmc2V0Ci0gICAgICogQHJldHVybgotICAgICAqICAgICByZXR1cm5zIG9yZy5kYXRhY29udHJhY3Quc2NoZW1hcy5fMjAwNC5fMDcuc3lzdGVtLkRhdGVUaW1lT2Zmc2V0Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldERhdGVUaW1lT2Zmc2V0IiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0RGF0ZVRpbWVPZmZzZXQiKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXREYXRlVGltZU9mZnNldFJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0RGF0ZVRpbWVPZmZzZXRSZXN1bHQiKQotICAgIHB1YmxpYyBEYXRlVGltZU9mZnNldCByZXREYXRlVGltZU9mZnNldCgKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIpCi0gICAgICAgIERhdGVUaW1lT2Zmc2V0IGluRGF0ZVRpbWVPZmZzZXQpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluVGltZVNwYW4KLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChvcGVyYXRpb25OYW1lID0gIlJldFRpbWVTcGFuIiwgYWN0aW9uID0gImh0dHA6Ly90ZW1wdXJpLm9yZy9JQmFzZURhdGFUeXBlc0RvY0xpdEIvUmV0VGltZVNwYW4iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJSZXRUaW1lU3BhblJlc3VsdCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiUmV0VGltZVNwYW5SZXN1bHQiKQotICAgIHB1YmxpYyBEdXJhdGlvbiByZXRUaW1lU3BhbigKLSAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiaW5UaW1lU3BhbiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgcGFydE5hbWUgPSAiaW5UaW1lU3BhbiIpCi0gICAgICAgIER1cmF0aW9uIGluVGltZVNwYW4pOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGluUU5hbWUKLSAgICAgKiBAcmV0dXJuCi0gICAgICogICAgIHJldHVybnMgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJSZXRRTmFtZSIsIGFjdGlvbiA9ICJodHRwOi8vdGVtcHVyaS5vcmcvSUJhc2VEYXRhVHlwZXNEb2NMaXRCL1JldFFOYW1lIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiUmV0UU5hbWVSZXN1bHQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gIlJldFFOYW1lUmVzdWx0IikKLSAgICBwdWJsaWMgUU5hbWUgcmV0UU5hbWUoCi0gICAgICAgIEBXZWJQYXJhbShuYW1lID0gImluUU5hbWUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIHBhcnROYW1lID0gImluUU5hbWUiKQotICAgICAgICBRTmFtZSBpblFOYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1pbnRlcm9wL3NyYy9vcmcvdGVtcHVyaS9PYmplY3RGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkMWY5MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLWludGVyb3Avc3JjL29yZy90ZW1wdXJpL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0qICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotCi1wYWNrYWdlIG9yZy50ZW1wdXJpOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EdXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZGF0YWNvbnRyYWN0LnNjaGVtYXMuXzIwMDQuXzA3LnN5c3RlbS5EYXRlVGltZU9mZnNldDsKLQotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCAKLSAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UgCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy50ZW1wdXJpIHBhY2thZ2UuIAotICogPHA+QW4gT2JqZWN0RmFjdG9yeSBhbGxvd3MgeW91IHRvIHByb2dyYW1hdGljYWxseSAKLSAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIAotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwgCi0gKiBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMgCi0gKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hIAotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsIAotICogZ3JvdXBzLiAgRmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIG9mIHRoZXNlIGFyZSAKLSAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCi0gKiAKLSAqLwotQFhtbFJlZ2lzdHJ5Ci1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5DaGFyX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgImluQ2hhciIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRRTmFtZVJlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXRRTmFtZVJlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JbkRvdWJsZV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpbkRvdWJsZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRTaW5nbGVSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0U2luZ2xlUmVzdWx0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1JldERvdWJsZVJlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXREb3VibGVSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5VTG9uZ19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpblVMb25nIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1JldEJ5dGVBcnJheVJlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXRCeXRlQXJyYXlSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0RGF0ZVRpbWVPZmZzZXRSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0RGF0ZVRpbWVPZmZzZXRSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0VXJpUmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldFVyaVJlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRCb29sUmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldEJvb2xSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5VU2hvcnRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5VU2hvcnQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5EYXRlVGltZV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpbkRhdGVUaW1lIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0luT2JqZWN0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgImluT2JqZWN0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0luU0J5dGVfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5TQnl0ZSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JblFOYW1lX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgImluUU5hbWUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5VSW50X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgImluVUludCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JbkJvb2xfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5Cb29sIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0luU2hvcnRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5TaG9ydCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRJbnRSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0SW50UmVzdWx0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1JldEJ5dGVSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0Qnl0ZVJlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRVSW50UmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldFVJbnRSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5TdHJpbmdfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5TdHJpbmciKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0RGF0ZVRpbWVSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0RGF0ZVRpbWVSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5HdWlkX1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgImluR3VpZCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRVTG9uZ1Jlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXRVTG9uZ1Jlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JbkludF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpbkludCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JbkJ5dGVBcnJheV9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpbkJ5dGVBcnJheSIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JbkZsb2F0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgImluRmxvYXQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0VGltZVNwYW5SZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0VGltZVNwYW5SZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0R3VpZFJlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXRHdWlkUmVzdWx0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0luTG9uZ19RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpbkxvbmciKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5VcmlfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5VcmkiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0U3RyaW5nUmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldFN0cmluZ1Jlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXREZWNpbWFsUmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldERlY2ltYWxSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5UaW1lU3Bhbl9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpblRpbWVTcGFuIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX1JldExvbmdSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0TG9uZ1Jlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRTaG9ydFJlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXRTaG9ydFJlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9JbkJ5dGVfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5CeXRlIik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0luRGF0ZVRpbWVPZmZzZXRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5EYXRlVGltZU9mZnNldCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRGbG9hdFJlc3VsdF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJSZXRGbG9hdFJlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRDaGFyUmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldENoYXJSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfSW5TaW5nbGVfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiaW5TaW5nbGUiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0U0J5dGVSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0U0J5dGVSZXN1bHQiKTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBRTmFtZSBfUmV0VVNob3J0UmVzdWx0X1FOQU1FID0gbmV3IFFOYW1lKCJodHRwOi8vdGVtcHVyaS5vcmcvIiwgIlJldFVTaG9ydFJlc3VsdCIpOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFFOYW1lIF9SZXRPYmplY3RSZXN1bHRfUU5BTUUgPSBuZXcgUU5hbWUoImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCAiUmV0T2JqZWN0UmVzdWx0Iik7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUU5hbWUgX0luRGVjaW1hbF9RTkFNRSA9IG5ldyBRTmFtZSgiaHR0cDovL3RlbXB1cmkub3JnLyIsICJpbkRlY2ltYWwiKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3NlcyBmb3IgcGFja2FnZTogb3JnLnRlbXB1cmkKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgSW50ZWdlciB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5DaGFyIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8SW50ZWdlcj4gY3JlYXRlSW5DaGFyKEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfSW5DaGFyX1FOQU1FLCBJbnRlZ2VyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFFOYW1lIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXRRTmFtZVJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PFFOYW1lPiBjcmVhdGVSZXRRTmFtZVJlc3VsdChRTmFtZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFFOYW1lPihfUmV0UU5hbWVSZXN1bHRfUU5BTUUsIFFOYW1lLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIERvdWJsZSB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5Eb3VibGUiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxEb3VibGU+IGNyZWF0ZUluRG91YmxlKERvdWJsZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PERvdWJsZT4oX0luRG91YmxlX1FOQU1FLCBEb3VibGUuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRmxvYXQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldFNpbmdsZVJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEZsb2F0PiBjcmVhdGVSZXRTaW5nbGVSZXN1bHQoRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxGbG9hdD4oX1JldFNpbmdsZVJlc3VsdF9RTkFNRSwgRmxvYXQuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRG91YmxlIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXREb3VibGVSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxEb3VibGU+IGNyZWF0ZVJldERvdWJsZVJlc3VsdChEb3VibGUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxEb3VibGU+KF9SZXREb3VibGVSZXN1bHRfUU5BTUUsIERvdWJsZS5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBCaWdJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJpblVMb25nIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8QmlnSW50ZWdlcj4gY3JlYXRlSW5VTG9uZyhCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnSW50ZWdlcj4oX0luVUxvbmdfUU5BTUUsIEJpZ0ludGVnZXIuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgYnl0ZVtdfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldEJ5dGVBcnJheVJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PGJ5dGVbXT4gY3JlYXRlUmV0Qnl0ZUFycmF5UmVzdWx0KGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PGJ5dGVbXT4oX1JldEJ5dGVBcnJheVJlc3VsdF9RTkFNRSwgYnl0ZVtdLmNsYXNzLCBudWxsLCAoKGJ5dGVbXSkgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRGF0ZVRpbWVPZmZzZXQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldERhdGVUaW1lT2Zmc2V0UmVzdWx0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8RGF0ZVRpbWVPZmZzZXQ+IGNyZWF0ZVJldERhdGVUaW1lT2Zmc2V0UmVzdWx0KERhdGVUaW1lT2Zmc2V0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RGF0ZVRpbWVPZmZzZXQ+KF9SZXREYXRlVGltZU9mZnNldFJlc3VsdF9RTkFNRSwgRGF0ZVRpbWVPZmZzZXQuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgU3RyaW5nIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXRVcmlSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTdHJpbmc+IGNyZWF0ZVJldFVyaVJlc3VsdChTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTdHJpbmc+KF9SZXRVcmlSZXN1bHRfUU5BTUUsIFN0cmluZy5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBCb29sZWFuIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXRCb29sUmVzdWx0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8Qm9vbGVhbj4gY3JlYXRlUmV0Qm9vbFJlc3VsdChCb29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8Qm9vbGVhbj4oX1JldEJvb2xSZXN1bHRfUU5BTUUsIEJvb2xlYW4uY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgSW50ZWdlciB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5VU2hvcnQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxJbnRlZ2VyPiBjcmVhdGVJblVTaG9ydChJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8SW50ZWdlcj4oX0luVVNob3J0X1FOQU1FLCBJbnRlZ2VyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFhNTEdyZWdvcmlhbkNhbGVuZGFyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJpbkRhdGVUaW1lIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8WE1MR3JlZ29yaWFuQ2FsZW5kYXI+IGNyZWF0ZUluRGF0ZVRpbWUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxYTUxHcmVnb3JpYW5DYWxlbmRhcj4oX0luRGF0ZVRpbWVfUU5BTUUsIFhNTEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIE9iamVjdCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5PYmplY3QiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxPYmplY3Q+IGNyZWF0ZUluT2JqZWN0KE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PE9iamVjdD4oX0luT2JqZWN0X1FOQU1FLCBPYmplY3QuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQnl0ZSB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5TQnl0ZSIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJ5dGU+IGNyZWF0ZUluU0J5dGUoQnl0ZSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJ5dGU+KF9JblNCeXRlX1FOQU1FLCBCeXRlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFFOYW1lIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJpblFOYW1lIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8UU5hbWU+IGNyZWF0ZUluUU5hbWUoUU5hbWUgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxRTmFtZT4oX0luUU5hbWVfUU5BTUUsIFFOYW1lLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIExvbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluVUludCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PExvbmc+IGNyZWF0ZUluVUludChMb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8TG9uZz4oX0luVUludF9RTkFNRSwgTG9uZy5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBCb29sZWFuIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJpbkJvb2wiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxCb29sZWFuPiBjcmVhdGVJbkJvb2woQm9vbGVhbiB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJvb2xlYW4+KF9JbkJvb2xfUU5BTUUsIEJvb2xlYW4uY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgU2hvcnQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluU2hvcnQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTaG9ydD4gY3JlYXRlSW5TaG9ydChTaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFNob3J0PihfSW5TaG9ydF9RTkFNRSwgU2hvcnQuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgSW50ZWdlciB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0SW50UmVzdWx0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8SW50ZWdlcj4gY3JlYXRlUmV0SW50UmVzdWx0KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxJbnRlZ2VyPihfUmV0SW50UmVzdWx0X1FOQU1FLCBJbnRlZ2VyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFNob3J0IH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXRCeXRlUmVzdWx0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U2hvcnQ+IGNyZWF0ZVJldEJ5dGVSZXN1bHQoU2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTaG9ydD4oX1JldEJ5dGVSZXN1bHRfUU5BTUUsIFNob3J0LmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIExvbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldFVJbnRSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxMb25nPiBjcmVhdGVSZXRVSW50UmVzdWx0KExvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxMb25nPihfUmV0VUludFJlc3VsdF9RTkFNRSwgTG9uZy5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluU3RyaW5nIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVJblN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTdHJpbmc+KF9JblN0cmluZ19RTkFNRSwgU3RyaW5nLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFhNTEdyZWdvcmlhbkNhbGVuZGFyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXREYXRlVGltZVJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PFhNTEdyZWdvcmlhbkNhbGVuZGFyPiBjcmVhdGVSZXREYXRlVGltZVJlc3VsdChYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFhNTEdyZWdvcmlhbkNhbGVuZGFyPihfUmV0RGF0ZVRpbWVSZXN1bHRfUU5BTUUsIFhNTEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFN0cmluZyB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5HdWlkIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVJbkd1aWQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfSW5HdWlkX1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQmlnSW50ZWdlciB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0VUxvbmdSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxCaWdJbnRlZ2VyPiBjcmVhdGVSZXRVTG9uZ1Jlc3VsdChCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnSW50ZWdlcj4oX1JldFVMb25nUmVzdWx0X1FOQU1FLCBCaWdJbnRlZ2VyLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEludGVnZXIgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluSW50IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8SW50ZWdlcj4gY3JlYXRlSW5JbnQoSW50ZWdlciB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEludGVnZXI+KF9JbkludF9RTkFNRSwgSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBieXRlW119e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5CeXRlQXJyYXkiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxieXRlW10+IGNyZWF0ZUluQnl0ZUFycmF5KGJ5dGVbXSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PGJ5dGVbXT4oX0luQnl0ZUFycmF5X1FOQU1FLCBieXRlW10uY2xhc3MsIG51bGwsICgoYnl0ZVtdKSB2YWx1ZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBGbG9hdCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5GbG9hdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEZsb2F0PiBjcmVhdGVJbkZsb2F0KEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RmxvYXQ+KF9JbkZsb2F0X1FOQU1FLCBGbG9hdC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBEdXJhdGlvbiB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0VGltZVNwYW5SZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxEdXJhdGlvbj4gY3JlYXRlUmV0VGltZVNwYW5SZXN1bHQoRHVyYXRpb24gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxEdXJhdGlvbj4oX1JldFRpbWVTcGFuUmVzdWx0X1FOQU1FLCBEdXJhdGlvbi5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldEd1aWRSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTdHJpbmc+IGNyZWF0ZVJldEd1aWRSZXN1bHQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfUmV0R3VpZFJlc3VsdF9RTkFNRSwgU3RyaW5nLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIExvbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluTG9uZyIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PExvbmc+IGNyZWF0ZUluTG9uZyhMb25nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8TG9uZz4oX0luTG9uZ19RTkFNRSwgTG9uZy5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTdHJpbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluVXJpIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVJblVyaShTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTdHJpbmc+KF9JblVyaV9RTkFNRSwgU3RyaW5nLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIFN0cmluZyB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0U3RyaW5nUmVzdWx0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U3RyaW5nPiBjcmVhdGVSZXRTdHJpbmdSZXN1bHQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihfUmV0U3RyaW5nUmVzdWx0X1FOQU1FLCBTdHJpbmcuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQmlnRGVjaW1hbCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0RGVjaW1hbFJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJpZ0RlY2ltYWw+IGNyZWF0ZVJldERlY2ltYWxSZXN1bHQoQmlnRGVjaW1hbCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PEJpZ0RlY2ltYWw+KF9SZXREZWNpbWFsUmVzdWx0X1FOQU1FLCBCaWdEZWNpbWFsLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIER1cmF0aW9uIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJpblRpbWVTcGFuIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8RHVyYXRpb24+IGNyZWF0ZUluVGltZVNwYW4oRHVyYXRpb24gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxEdXJhdGlvbj4oX0luVGltZVNwYW5fUU5BTUUsIER1cmF0aW9uLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIExvbmcgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldExvbmdSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxMb25nPiBjcmVhdGVSZXRMb25nUmVzdWx0KExvbmcgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxMb25nPihfUmV0TG9uZ1Jlc3VsdF9RTkFNRSwgTG9uZy5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTaG9ydCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0U2hvcnRSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxTaG9ydD4gY3JlYXRlUmV0U2hvcnRSZXN1bHQoU2hvcnQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxTaG9ydD4oX1JldFNob3J0UmVzdWx0X1FOQU1FLCBTaG9ydC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBTaG9ydCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5CeXRlIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8U2hvcnQ+IGNyZWF0ZUluQnl0ZShTaG9ydCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PFNob3J0PihfSW5CeXRlX1FOQU1FLCBTaG9ydC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBEYXRlVGltZU9mZnNldCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiaW5EYXRlVGltZU9mZnNldCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PERhdGVUaW1lT2Zmc2V0PiBjcmVhdGVJbkRhdGVUaW1lT2Zmc2V0KERhdGVUaW1lT2Zmc2V0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RGF0ZVRpbWVPZmZzZXQ+KF9JbkRhdGVUaW1lT2Zmc2V0X1FOQU1FLCBEYXRlVGltZU9mZnNldC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBGbG9hdCB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0RmxvYXRSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxGbG9hdD4gY3JlYXRlUmV0RmxvYXRSZXN1bHQoRmxvYXQgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudDxGbG9hdD4oX1JldEZsb2F0UmVzdWx0X1FOQU1FLCBGbG9hdC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBJbnRlZ2VyIH17QGNvZGUgPn19Ci0gICAgICogCi0gICAgICovCi0gICAgQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9ICJodHRwOi8vdGVtcHVyaS5vcmcvIiwgbmFtZSA9ICJSZXRDaGFyUmVzdWx0IikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8SW50ZWdlcj4gY3JlYXRlUmV0Q2hhclJlc3VsdChJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8SW50ZWdlcj4oX1JldENoYXJSZXN1bHRfUU5BTUUsIEludGVnZXIuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgRmxvYXQgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluU2luZ2xlIikKLSAgICBwdWJsaWMgSkFYQkVsZW1lbnQ8RmxvYXQ+IGNyZWF0ZUluU2luZ2xlKEZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8RmxvYXQ+KF9JblNpbmdsZV9RTkFNRSwgRmxvYXQuY2xhc3MsIG51bGwsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEpBWEJFbGVtZW50IH17QGNvZGUgPH17QGxpbmsgQnl0ZSB9e0Bjb2RlID59fQotICAgICAqIAotICAgICAqLwotICAgIEBYbWxFbGVtZW50RGVjbChuYW1lc3BhY2UgPSAiaHR0cDovL3RlbXB1cmkub3JnLyIsIG5hbWUgPSAiUmV0U0J5dGVSZXN1bHQiKQotICAgIHB1YmxpYyBKQVhCRWxlbWVudDxCeXRlPiBjcmVhdGVSZXRTQnl0ZVJlc3VsdChCeXRlIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8Qnl0ZT4oX1JldFNCeXRlUmVzdWx0X1FOQU1FLCBCeXRlLmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEludGVnZXIgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldFVTaG9ydFJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEludGVnZXI+IGNyZWF0ZVJldFVTaG9ydFJlc3VsdChJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8SW50ZWdlcj4oX1JldFVTaG9ydFJlc3VsdF9RTkFNRSwgSW50ZWdlci5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSkFYQkVsZW1lbnQgfXtAY29kZSA8fXtAbGluayBPYmplY3QgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gIlJldE9iamVjdFJlc3VsdCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PE9iamVjdD4gY3JlYXRlUmV0T2JqZWN0UmVzdWx0KE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50PE9iamVjdD4oX1JldE9iamVjdFJlc3VsdF9RTkFNRSwgT2JqZWN0LmNsYXNzLCBudWxsLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBKQVhCRWxlbWVudCB9e0Bjb2RlIDx9e0BsaW5rIEJpZ0RlY2ltYWwgfXtAY29kZSA+fX0KLSAgICAgKiAKLSAgICAgKi8KLSAgICBAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iLCBuYW1lID0gImluRGVjaW1hbCIpCi0gICAgcHVibGljIEpBWEJFbGVtZW50PEJpZ0RlY2ltYWw+IGNyZWF0ZUluRGVjaW1hbChCaWdEZWNpbWFsIHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8QmlnRGVjaW1hbD4oX0luRGVjaW1hbF9RTkFNRSwgQmlnRGVjaW1hbC5jbGFzcywgbnVsbCwgdmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL1JFQURNRSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjNjMWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIEF4aXMyL0pBWFdTIGluIGEgc2VydmxldCBjb250YWluZXIuIFlvdSBtdXN0IA0KLWhhdmUgTWF2ZW4gMi54IGluc3RhbGxlZCB0byBidWlsZCB0aGlzIGV4YW1wbGUuICBUbyBidWlsZCB0eXBlOg0KLQ0KLSQgbXZuIGluc3RhbGwgd2FyOndhcg0KLQ0KLVJlbmFtZSB0aGUgcmVzdWx0YW50IHdhciBhcyBqYXh3cy1zYW1wbGVzLndhciBhbmQgZHJvcCBpdCBpbnRvIGFueSBzZXJ2bGV0IGVuZ2luZS4gDQotVGhlIFdTREwgZmlsZSBmb3IgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIHZpZXdhYmxlIGF0Og0KLQ0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvRWNob1NlcnZpY2UxMi5FY2hvU2VydmljZTEyUG9ydA0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvRWNob1NlcnZpY2UuRWNob1NlcnZpY2VQb3J0DQotaHR0cDovL3lvdXJob3N0OnBvcnQvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9NdG9tU2FtcGxlU2VydmljZTEyLk10b21TYW1wbGVQb3J0DQotaHR0cDovL3lvdXJob3N0OnBvcnQvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9NdG9tU2FtcGxlU2VydmljZS5NdG9tU2FtcGxlUG9ydA0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvUGluZ1NlcnZpY2UxMi5QaW5nU2VydmljZTEyUG9ydA0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvc2VydmljZXMvUGluZ1NlcnZpY2UuUGluZ1NlcnZpY2VQb3J0DQotDQotSGVyZSdzIHRoZSBtYWluIHBhZ2Ugd2l0aCBzb21lIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0czoNCi0NCi1odHRwOi8veW91cmhvc3Q6cG9ydC9qYXh3cy1zYW1wbGVzLw0KLQ0KLVlvdSBjYW4gdXNlIHRoZSBzYW1wbGUganNwIHBhZ2VzIHRvIGRyaXZlL3Rlc3QgdGhlIHdlYiBzZXJ2aWNlIg0KLQ0KLWh0dHA6Ly95b3VyaG9zdDpwb3J0L2pheHdzLXNhbXBsZXMvZGVtb01UT00NCi1odHRwOi8veW91cmhvc3Q6cG9ydC9qYXh3cy1zYW1wbGVzL2RlbW9FY2hvUGluZw0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9wb20ueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjg1ZDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCINCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczIuZXhhbXBsZXM8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmpheHdzLXNhbXBsZXM8L2FydGlmYWN0SWQ+DQotICAgIDxuYW1lPkpBWFdTIFNhbXBsZXMgLSBFY2hvLCBQaW5nLCBNVE9NPC9uYW1lPg0KLSAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1rZXJuZWw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWpheHdzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFkZHJlc3Npbmc8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aW9tLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjIuODwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlvbS1pbXBsPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi44PC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5YbWxTY2hlbWE8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS40LjQ8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm5lZXRoaTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZWV0aGk8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjQ8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1odHRwY2xpZW50PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+d29vZHN0b3g8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d3N0eDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj5hc2wtMy4yLjQ8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+d3NkbDRqPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndzZGw0ajwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4xLjYuMjwvdmVyc2lvbj4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5nZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjY8L3ZlcnNpb24+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+Mi4xLjY8L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWwuYmluZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+DQotICAgICAgICAgICAgPGV4Y2x1c2lvbnM+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3IxNzM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC54bWw8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLndzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheHdzLXJ0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLndzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4d3MtYXBpPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwubWVzc2FnaW5nLnNhYWo8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zYWFqLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuc3RyZWFtLmJ1ZmZlcjwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0cmVhbWJ1ZmZlcjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5zdHJlYW08L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zanN4cDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanZuZXQuc3RheGV4PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RheC1leDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLm9yZy5hcGFjaGUueG1sLmludGVybmFsPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cmVzb2x2ZXI8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp2bmV0PC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWltZXB1bGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLndzPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheHdzLXRvb2xzPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4zPC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxleGNsdXNpb25zPg0KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwud3M8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXh3cy1ydDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+DQotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLnhtbC5iaW5kPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi14amM8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPg0KLSAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgPC9kZXBlbmRlbmNpZXM+DQotDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyVmVyc2lvbj4xLjU8L2NvbXBpbGVyVmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDx3YXJOYW1lPmpheHdzLXNhbXBsZXM8L3dhck5hbWU+DQotICAgICAgICAgICAgICAgICAgICA8d2FyU291cmNlRGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL3dlYmFwcDwvd2FyU291cmNlRGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFkZE1hdmVuRGVzY3JpcHRvcj5mYWxzZTwvYWRkTWF2ZW5EZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPg0KLSAgICAgICAgICAgICAgICAgICAgPHdlYlJlc291cmNlcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGVzaWduZWQgdG8gd29yayB1bmRlciB0aGUgYXhpczIgYmluIGRpc3QgZGlyZWN0b3J5IHN0cnVjdHVyZSwgZWRpdCBpZiBuZWVkZWQgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS8uLi8uLi9yZXBvc2l0b3J5L21vZHVsZXMvPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPldFQi1JTkYvbGliPC90YXJnZXRQYXRoPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5hZGRyZXNzaW5nKi5tYXI8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgICAgIDwvd2ViUmVzb3VyY2VzPg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+DQotICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4NCi0gICAgICAgIDxyZXNvdXJjZXM+DQotICAgICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoueG1sPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPg0KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPg0KLSAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+DQotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3Q8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLnByb3BlcnRpZXM8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLndzZGw8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+DQotICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+DQotICAgIDwvYnVpbGQ+DQotDQotICAgIDwhLS0gIG5lZWRlZCBmb3IgWG1sU2NoZW1hIC0tPg0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmliaWJsaW88L2lkPg0KLSAgICAgICAgICAgIDxuYW1lPmliaWJsaW8gbWF2ZW4gcmVwb3NpdG9yeTwvbmFtZT4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9pYmlibGlvLm9yZy9tYXZlbi88L3VybD4NCi0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0Pg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmFwYWNoZTwvaWQ+DQotICAgICAgICAgICAgPG5hbWU+QXBhY2hlIG1hdmVuIHJlcG9zaXRvcnk8L25hbWU+DQotICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9qYXZhLXJlcG9zaXRvcnkvPC91cmw+DQotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzIvPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmRlZmF1bHQ8L2xheW91dD4KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9TYW1wbGVDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L1NhbXBsZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDNkNmM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L1NhbXBsZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1NlcnZpY2UxMlBvcnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1NlcnZpY2VDYWxsYmFja0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TZXJ2aWNlUG9ydFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZy5QaW5nU2VydmljZTEyUG9ydFByb3h5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZy5QaW5nU2VydmljZVBvcnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nLk9iamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuUGluZ1N0cmluZ0lucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3MuQ2xpZW50Q29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5tZXRhZGF0YS5yZWdpc3RyeS5NZXRhZGF0YUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRmlsZVN5c3RlbUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFNhbXBsZUNsaWVudAotICogbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhpbmNsaWVudCBqYXIgc2FtcGxlCi0gKiBhbmQgd29ya2VyIGNsYXNzIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZpY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1wbGVDbGllbnQgewotCi0gICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IDI0MDsgICAgICAgICAgICAgICAgIC8vIEVycm9yIHRpbWVvdXQgaW4gc2Vjb25kcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTEVFUEVSID0gMjsgICAgIC8vIFBvbGwgZGVsYXkgZm9yIGFzeW5jCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsSG9zdCA9ICJsb2NhbGhvc3QiOwotICAgIHByaXZhdGUgU3RyaW5nIHVybFBvcnQgPSAiODA4MCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfQkFTRSA9ICIvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5HX0NPTlRFWFQgPSBDT05URVhUX0JBU0UgKyAiUGluZ1NlcnZpY2UuUGluZ1NlcnZpY2VQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNIT19DT05URVhUID0gQ09OVEVYVF9CQVNFICsgIkVjaG9TZXJ2aWNlLkVjaG9TZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfQ09OVEVYVDEyID0gQ09OVEVYVF9CQVNFICsgIlBpbmdTZXJ2aWNlMTIuUGluZ1NlcnZpY2UxMlBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0hPX0NPTlRFWFQxMiA9IENPTlRFWFRfQkFTRSArICJFY2hvU2VydmljZTEyLkVjaG9TZXJ2aWNlMTJQb3J0IjsKLSAgICBwcml2YXRlIFN0cmluZyB1cmxTdWZmaXggPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gIkhFTExPIjsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2dHlwZSA9ICJhc3luYyI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpU3RyaW5nID0gImh0dHA6Ly8iICsgdXJsSG9zdCArICI6IiArIHVybFBvcnQ7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHdpcmVhc3luYyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHNvYXAxMiA9IGZhbHNlOwotICAgIHByaXZhdGUgaW50IGNvdW50ID0gMTsKLSAgICBwcml2YXRlIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIG1haW4oKQotICAgICAqIDxwLz4KLSAgICAgKiBzZWUgcHJpbnR1c2FnZSgpIGZvciBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU2FtcGxlQ2xpZW50IHNhbXBsZSA9IG5ldyBTYW1wbGVDbGllbnQoKTsKLSAgICAgICAgc2FtcGxlLnBhcnNlQXJncyhhcmdzKTsKLSAgICAgICAgc2FtcGxlLkNhbGxTZXJ2aWNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcGFyc2VBcmdzIFJlYWQgYW5kIGludGVycHJldCB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3MoU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPj0gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCctJyA9PSBhcmdzW2ldLmNoYXJBdCgwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmdzW2ldLmNoYXJBdCgxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFVzYWdlKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybEhvc3QgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxQb3J0ID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdGJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZ0eXBlID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCFzZXJ2dHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJhc3luYyIpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2VydnR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiZWNobyIpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2VydnR5cGUuZXF1YWxzSWdub3JlQ2FzZSgicGluZyIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiRVJST1I6IEF0dGVtcHQgdG8gaW52b2tlIGEgc2VydmljZSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG5ldyBJbnRlZ2VyKGFyZ3NbKytpXSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gbmV3IEludGVnZXIoYXJnc1srK2ldKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcm0gPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJtLmVxdWFsc0lnbm9yZUNhc2UoInkiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZWFzeW5jID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVhc3luYyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwMTIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAxMiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIG9wdGlvbiBmb3JtYXQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cmlTdHJpbmcgPSAiaHR0cDovLyIgKyB1cmxIb3N0ICsgIjoiICsgdXJsUG9ydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHByaW50VXNhZ2UgUHJpbnQgdXNhZ2UgaGVscCB0byBvdXRwdXQKLSAgICAgKgotICAgICAqIEBwYXJhbSBpbnZhbGlkT3B0IC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICBpZiBub24tbnVsbCwgaXMgdGhlIGludmFsaWQgcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VXNhZ2UoU3RyaW5nIGludmFsaWRPcHQpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gaW52YWxpZE9wdCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIE9wdGlvbjogIiArIGludmFsaWRPcHQpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAucHJpbnRsbigiICBydW5TYW1wbGVTZWkgLWggW2hvc3RuYW1lXSAtcCBbcG9ydF0gLWYgW3VybFN1ZmZpeF0gLW0gW3Rlc3RNZXNzYWdlXSAtcyBbZWNob3xwaW5nfGFzeW5jXSAtdCBbdGltZW91dF0gLXcgW3l8bl0gLWMgW2NvdW50XSAtMSAtMiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgdmFsdWVzOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgaG9zdG5hbWUgPSBsb2NhbGhvc3QiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHBvcnQgPSA4MDgwIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB0ZXN0TWVzc2FnZSA9IEhFTExPIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICB1cmxTdWZmaXggPSAvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9FY2hvU2VydmljZS5FY2hvU2VydmljZVBvcnQiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHNlcnZpY2UgPSBhc3luYyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgdGltZW91dCA9IDI0MCAoc2Vjb25kcykiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIHdpcmVhc3luYyA9IHkgKHllcykiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIGNvdW50ID0gMSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLTEgPSBzb2FwIDEuMSAoZGVmYXVsdCkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0yID0gc29hcCAxLjIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsU2VydmljZSBQYXJtcyB3ZXJlIGFscmVhZHkgcmVhZC4gTm93IGNhbGwgdGhlIHNlcnZpY2UgcHJveHkgY2xhc3NlcwotICAgICAqLwotICAgIHZvaWQgQ2FsbFNlcnZpY2UoKSB7Ci0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKHNvYXAxMikgewotICAgICAgICAgICAgICAgIGlmIChzZXJ2dHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJlY2hvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gdXJsU3VmZml4Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXggPSBFQ0hPX0NPTlRFWFQxMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZEVjaG8xMih1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VydnR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiYXN5bmMiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB1cmxTdWZmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IEVDSE9fQ09OVEVYVDEyOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBpbml0Q29uZmlndXJhdGlvbkZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQXN5bmMxMih1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UsIHRpbWVvdXQsIHdpcmVhc3luYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95Q29uZmlndXJhdGlvbkZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZEFzeW5jMTIodXJpU3RyaW5nICsgdXJsU3VmZml4LCBudWxsLCBtZXNzYWdlLCB0aW1lb3V0LCB3aXJlYXN5bmMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gdXJsU3VmZml4Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXggPSBQSU5HX0NPTlRFWFQxMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZFBpbmcxMih1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZ0eXBlLmVxdWFsc0lnbm9yZUNhc2UoImVjaG8iKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB1cmxTdWZmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IEVDSE9fQ09OVEVYVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZEVjaG8odXJpU3RyaW5nICsgdXJsU3VmZml4LCBudWxsLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZ0eXBlLmVxdWFsc0lnbm9yZUNhc2UoImFzeW5jIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gdXJsU3VmZml4Lmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXggPSBFQ0hPX0NPTlRFWFQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBpbml0Q29uZmlndXJhdGlvbkZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkQXN5bmModXJpU3RyaW5nICsgdXJsU3VmZml4LCBudWxsLCBtZXNzYWdlLCB0aW1lb3V0LCB3aXJlYXN5bmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveUNvbmZpZ3VyYXRpb25GYWN0b3J5KGZhY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRBc3luYyh1cmlTdHJpbmcgKyB1cmxTdWZmaXgsIG51bGwsIG1lc3NhZ2UsIHRpbWVvdXQsIHdpcmVhc3luYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB1cmxTdWZmaXgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IFBJTkdfQ09OVEVYVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWlsZFBpbmcodXJpU3RyaW5nICsgdXJsU3VmZml4LCBudWxsLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGluaXRDb25maWd1cmF0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgU3RyaW5nIGF4aXMyeG1sID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbmZpZy5wYXRoIik7Ci0gICAgICAgIGlmIChheGlzMnhtbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGxlYXNlIHNldCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmNvbmZpZy5wYXRoIHN5c3RlbSBwcm9wZXJ0eSB0byBhIHZhbGlkIGF4aXMyLnhtbCBmaWxlICh3aXRoIGFkZHJlc3NpbmcgbW9kdWxlIGVuYWJsZWQpIik7Ci0gICAgICAgIH0KLSAgICAgICAgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlU3lzdGVtQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKG51bGwsIGF4aXMyeG1sKTsKLSAgICAgICAgICAgIGZhY3RvcnkgPSBuZXcgQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkoY29uZmlndXJhdG9yKTsKLSAgICAgICAgICAgIE1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5LnNldEZhY3RvcnkoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkuY2xhc3MsIGZhY3RvcnkpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXN0cm95Q29uZmlndXJhdGlvbkZhY3RvcnkoQ2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmFjdG9yeS5nZXRDbGllbnRDb25maWd1cmF0aW9uQ29udGV4dCgpLnRlcm1pbmF0ZSgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihheGlzRmF1bHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVpbGRQaW5nCi0gICAgICogQ2FsbCB0aGUgcGluZyBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRVUkwgVGhlIFNlcnZpY2UgZW5kcG9pbnQgVVJMCi0gICAgICogQHBhcmFtIGlucHV0ICAgICAgIFRoZSBtZXNzYWdlIHN0cmluZwotICAgICAqIEByZXR1cm4gQm9vbGVhbiB0cnVlIGlmIHRoZSBwaW5nIHdvcmtzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYnVpbGRQaW5nKFN0cmluZyBlbmRwb2ludFVSTCwgVVJMIHdzZGxVUkwsIFN0cmluZyBpbnB1dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGluZ1NlcnZpY2VQb3J0UHJveHkgcGluZyA9IG5ldyBQaW5nU2VydmljZVBvcnRQcm94eSh3c2RsVVJMKTsKLSAgICAgICAgICAgIHBpbmcuX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludChlbmRwb2ludFVSTCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIFBpbmcgdG8gIiArIGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ29uZmlndXJlIFNPQVBBY3Rpb24gcHJvcGVydGllcwotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgKHBpbmcuX2dldERlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJveHkoKSk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVUkwpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAicGluZ09wZXJhdGlvbiIpOwotCi0gICAgICAgICAgICAvLyBCdWlsZCB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICAgICAgICBQaW5nU3RyaW5nSW5wdXQgcGluZ1Bhcm0gPQotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZVBpbmdTdHJpbmdJbnB1dCgpOwotICAgICAgICAgICAgcGluZ1Bhcm0uc2V0UGluZ0lucHV0KGlucHV0KTsKLQotICAgICAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmljZQotICAgICAgICAgICAgcGluZy5waW5nT3BlcmF0aW9uKHBpbmdQYXJtKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgUGluZyBTVUNDRVNTLiIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogRVJST1I6IFNFSSBQaW5nIEVYQ0VQVElPTi4iKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBidWlsZEVjaG8KLSAgICAgKiBDYWxsIHRoZSBFY2hvIHNlcnZpY2UgKFN5bmMpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRVUkwgVGhlIFNlcnZpY2UgZW5kcG9pbnQgVVJMCi0gICAgICogQHBhcmFtIGlucHV0ICAgICAgIFRoZSBtZXNzYWdlIHN0cmluZwotICAgICAqIEByZXR1cm4gU3RyaW5nIGZyb20gdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkRWNobyhTdHJpbmcgZW5kcG9pbnRVUkwsIFVSTCB3c2RsVVJMLCBTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gIkVSUk9SIToiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRWNob1NlcnZpY2VQb3J0UHJveHkgZWNobyA9IG5ldyBFY2hvU2VydmljZVBvcnRQcm94eSh3c2RsVVJMKTsKLSAgICAgICAgICAgIGVjaG8uX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludChlbmRwb2ludFVSTCk7Ci0KLSAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBTT0FQQWN0aW9uIHByb3BlcnRpZXMKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIChlY2hvLl9nZXREZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3h5KCkpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50VVJMKTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VSSV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgImVjaG9PcGVyYXRpb24iKTsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGlucHV0IG9iamVjdAotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IGVjaG9QYXJtID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVFY2hvU3RyaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGVjaG9QYXJtLnNldEVjaG9JbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEVjaG8gdG8gIiArIGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmljZQotICAgICAgICAgICAgcmVzcG9uc2UgPSBlY2hvLmVjaG9PcGVyYXRpb24oZWNob1Bhcm0pLmdldEVjaG9SZXNwb25zZSgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBFY2hvIGludm9jYXRpb24gY29tcGxldGUuIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEVjaG8gcmVzcG9uc2UgaXM6ICIgKyByZXNwb25zZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogRVJST1I6IFNFSSBFY2hvIEVYQ0VQVElPTi4iKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UgKyAiPj4+RUNITyBTRVJWSUNFIEVYQ0VQVElPTjw8PCAiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXNwb25zZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBidWlsZEFzeW5jCi0gICAgICogQ2FsbCB0aGUgRWNobyBzZXJ2aWNlIChBc3luYykKLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmRwb2ludFVSTCBUaGUgU2VydmljZSBlbmRwb2ludCBVUkwKLSAgICAgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICAgICogQHBhcmFtIHdhaXRpbmcgICAgIFRoZSBBc3luYyB0aW1lb3V0Ci0gICAgICogQHBhcmFtIHdpcmVhc3luYyAgIHRydWUgdG8gdXNlIEFzeW5jIG9uIHRoZSB3aXJlCi0gICAgICogQHJldHVybiBTdHJpbmcgZnJvbSB0aGUgc2VydmljZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYnVpbGRBc3luYyhTdHJpbmcgZW5kcG9pbnRVUkwsIFVSTCB3c2RsVVJMLCBTdHJpbmcgaW5wdXQsIGludCB3YWl0aW5nLCBCb29sZWFuIHdpcmVhc3luYykgewotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSAiRVJST1IhOiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvU2VydmljZVBvcnRQcm94eSBlY2hvID0gbmV3IEVjaG9TZXJ2aWNlUG9ydFByb3h5KHdzZGxVUkwpOwotICAgICAgICAgICAgZWNoby5fZ2V0RGVzY3JpcHRvcigpLnNldEVuZHBvaW50KGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ29uZmlndXJlIFNPQVBBY3Rpb24gcHJvcGVydGllcwotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgKGVjaG8uX2dldERlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJveHkoKSk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRVUkwpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVNFX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLlNPQVBBQ1RJT05fVVJJX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAiZWNob09wZXJhdGlvbiIpOwotICAgICAgICAgICAgaWYgKHdpcmVhc3luYykgewotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KG9yZy5hcGFjaGUuYXhpczIuamF4d3MudXRpbC5Db25zdGFudHMuVVNFX0FTWU5DX01FUCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgY2FsbGJhY2sgaGFuZGxlciBhbmQgY3JlYXRlIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgICAgICAgIEVjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyIGNhbGxiYWNrSGFuZGxlciA9IG5ldyBFY2hvU2VydmljZUNhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IGVjaG9QYXJtID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVFY2hvU3RyaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGVjaG9QYXJtLnNldEVjaG9JbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEFzeW5jIHRvICIgKyBlbmRwb2ludFVSTCk7Ci0KLSAgICAgICAgICAgIC8vIENhbGwgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIEZ1dHVyZTw/PiByZXNwID0gZWNoby5lY2hvT3BlcmF0aW9uQXN5bmMoZWNob1Bhcm0sIGNhbGxiYWNrSGFuZGxlcik7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICB3aGlsZSAoIXJlc3AuaXNEb25lKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGltZW91dAotICAgICAgICAgICAgICAgIGlmICh3YWl0aW5nIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+PiBDTElFTlQ6IEVSUk9SIC0gU0VJIEFzeW5jIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZSArICJBc3luYyB0aW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5LiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBBc3luYyBpbnZvY2F0aW9uIHN0aWxsIG5vdCBjb21wbGV0ZSIpOwotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwICogU0xFRVBFUik7Ci0gICAgICAgICAgICAgICAgd2FpdGluZyAtPSBTTEVFUEVSOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHJlc3BvbnNlIGFuZCBwcmludCBpdCwgdGhlbiByZXR1cm4KLSAgICAgICAgICAgIEVjaG9TdHJpbmdSZXNwb25zZSBlc3IgPSBjYWxsYmFja0hhbmRsZXIuZ2V0UmVzcG9uc2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgQXN5bmMgaW52b2NhdGlvbiBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IGVzcikgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZXNyLmdldEVjaG9SZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgQXN5bmMgcmVzcG9uc2UgaXM6ICIgKyByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IEVSUk9SOiBTRUkgQXN5bmMgRVhDRVBUSU9OLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZSArICI+Pj5BU1lOQyBTRVJWSUNFIEVYQ0VQVElPTjw8PCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJ1aWxkUGluZzEyCi0gICAgICogQ2FsbCB0aGUgcGluZyBzZXJ2aWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRVUkwgVGhlIFNlcnZpY2UgZW5kcG9pbnQgVVJMCi0gICAgICogQHBhcmFtIGlucHV0ICAgICAgIFRoZSBtZXNzYWdlIHN0cmluZwotICAgICAqIEByZXR1cm4gQm9vbGVhbiB0cnVlIGlmIHRoZSBwaW5nIHdvcmtzCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYnVpbGRQaW5nMTIoU3RyaW5nIGVuZHBvaW50VVJMLCBVUkwgd3NkbFVSTCwgU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQaW5nU2VydmljZTEyUG9ydFByb3h5IHBpbmcgPSBuZXcgUGluZ1NlcnZpY2UxMlBvcnRQcm94eSh3c2RsVVJMKTsKLSAgICAgICAgICAgIHBpbmcuX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludChlbmRwb2ludFVSTCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIFBpbmcgdG8gIiArIGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGlucHV0IG9iamVjdAotICAgICAgICAgICAgUGluZ1N0cmluZ0lucHV0IHBpbmdQYXJtID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nLk9iamVjdEZhY3RvcnkoKS5jcmVhdGVQaW5nU3RyaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIHBpbmdQYXJtLnNldFBpbmdJbnB1dChpbnB1dCk7Ci0KLSAgICAgICAgICAgIC8vIENhbGwgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIHBpbmcucGluZ09wZXJhdGlvbihwaW5nUGFybSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIFBpbmcgU1VDQ0VTUy4iKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IEVSUk9SOiBTRUkgUGluZyBFWENFUFRJT04uIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYnVpbGRFY2hvMTIKLSAgICAgKiBDYWxsIHRoZSBFY2hvIHNlcnZpY2UgKFN5bmMpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRVUkwgVGhlIFNlcnZpY2UgZW5kcG9pbnQgVVJMCi0gICAgICogQHBhcmFtIGlucHV0ICAgICAgIFRoZSBtZXNzYWdlIHN0cmluZwotICAgICAqIEByZXR1cm4gU3RyaW5nIGZyb20gdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkRWNobzEyKFN0cmluZyBlbmRwb2ludFVSTCwgVVJMIHdzZGxVUkwsIFN0cmluZyBpbnB1dCkgewotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSAiRVJST1IhOiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvU2VydmljZTEyUG9ydFByb3h5IGVjaG8gPSBuZXcgRWNob1NlcnZpY2UxMlBvcnRQcm94eSh3c2RsVVJMKTsKLSAgICAgICAgICAgIGVjaG8uX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludChlbmRwb2ludFVSTCk7Ci0KLSAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBpbnB1dCBvYmplY3QKLSAgICAgICAgICAgIEVjaG9TdHJpbmdJbnB1dCBlY2hvUGFybSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5PYmplY3RGYWN0b3J5KCkuY3JlYXRlRWNob1N0cmluZ0lucHV0KCk7Ci0gICAgICAgICAgICBlY2hvUGFybS5zZXRFY2hvSW5wdXQoaW5wdXQpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEVjaG8gdG8gIiArIGVuZHBvaW50VVJMKTsKLQotICAgICAgICAgICAgLy8gQ2FsbCB0aGUgc2VydmljZQotICAgICAgICAgICAgcmVzcG9uc2UgPSBlY2hvLmVjaG9PcGVyYXRpb24oZWNob1Bhcm0pLmdldEVjaG9SZXNwb25zZSgpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEVjaG8gaW52b2NhdGlvbiBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgRWNobyByZXNwb25zZSBpczogIiArIHJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBFUlJPUjogU0VJIEVjaG8gRVhDRVBUSU9OLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZSArICI+Pj5FQ0hPIFNFUlZJQ0UgRVhDRVBUSU9OPDw8ICI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJ1aWxkQXN5bmMxMgotICAgICAqIENhbGwgdGhlIEVjaG8gc2VydmljZSAoQXN5bmMpCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW5kcG9pbnRVUkwgVGhlIFNlcnZpY2UgZW5kcG9pbnQgVVJMCi0gICAgICogQHBhcmFtIGlucHV0ICAgICAgIFRoZSBtZXNzYWdlIHN0cmluZwotICAgICAqIEBwYXJhbSB3YWl0aW5nICAgICBUaGUgQXN5bmMgdGltZW91dAotICAgICAqIEBwYXJhbSB3aXJlYXN5bmMgICB0cnVlIHRvIHVzZSBBc3luYyBvbiB0aGUgd2lyZQotICAgICAqIEByZXR1cm4gU3RyaW5nIGZyb20gdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGJ1aWxkQXN5bmMxMihTdHJpbmcgZW5kcG9pbnRVUkwsIFVSTCB3c2RsVVJMLCBTdHJpbmcgaW5wdXQsIGludCB3YWl0aW5nLCBCb29sZWFuIHdpcmVhc3luYykgewotICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSAiRVJST1IhOiI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFY2hvU2VydmljZTEyUG9ydFByb3h5IGVjaG8gPSBuZXcgRWNob1NlcnZpY2UxMlBvcnRQcm94eSh3c2RsVVJMKTsKLSAgICAgICAgICAgIGVjaG8uX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludChlbmRwb2ludFVSTCk7Ci0KLSAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBvdmVyLXRoZS13aXJlIGFzeW5jIGlmIHNwZWNpZmllZAotICAgICAgICAgICAgaWYgKHdpcmVhc3luYykgewotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIChlY2hvLl9nZXREZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm94eSgpKTsKLSAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnV0aWwuQ29uc3RhbnRzLlVTRV9BU1lOQ19NRVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgdXAgdGhlIGNhbGxiYWNrIGhhbmRsZXIgYW5kIGNyZWF0ZSB0aGUgaW5wdXQgb2JqZWN0Ci0gICAgICAgICAgICBFY2hvU2VydmljZUNhbGxiYWNrSGFuZGxlciBjYWxsYmFja0hhbmRsZXIgPSBuZXcgRWNob1NlcnZpY2VDYWxsYmFja0hhbmRsZXIoKTsKLSAgICAgICAgICAgIEVjaG9TdHJpbmdJbnB1dCBlY2hvUGFybSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5PYmplY3RGYWN0b3J5KCkuY3JlYXRlRWNob1N0cmluZ0lucHV0KCk7Ci0gICAgICAgICAgICBlY2hvUGFybS5zZXRFY2hvSW5wdXQoaW5wdXQpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IFNFSSBBc3luYyB0byAiICsgZW5kcG9pbnRVUkwpOwotCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICBGdXR1cmU8Pz4gcmVzcCA9IGVjaG8uZWNob09wZXJhdGlvbkFzeW5jKGVjaG9QYXJtLCBjYWxsYmFja0hhbmRsZXIpOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgd2hpbGUgKCFyZXNwLmlzRG9uZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRpbWVvdXQKLSAgICAgICAgICAgICAgICBpZiAod2FpdGluZyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj4gQ0xJRU5UOiBFUlJPUiAtIFNFSSBBc3luYyBUaW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5LiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UgKyAiQXN5bmMgdGltZW91dCB3YWl0aW5nIGZvciByZXBseS4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj4gQ0xJRU5UOiBTRUkgQXN5bmMgaW52b2NhdGlvbiBzdGlsbCBub3QgY29tcGxldGUiKTsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCAqIFNMRUVQRVIpOwotICAgICAgICAgICAgICAgIHdhaXRpbmcgLT0gU0xFRVBFUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSByZXNwb25zZSBhbmQgcHJpbnQgaXQsIHRoZW4gcmV0dXJuCi0gICAgICAgICAgICBFY2hvU3RyaW5nUmVzcG9uc2UgZXNyID0gY2FsbGJhY2tIYW5kbGVyLmdldFJlc3BvbnNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEFzeW5jIGludm9jYXRpb24gY29tcGxldGUuIik7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBlc3IpIHsKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IGVzci5nZXRFY2hvUmVzcG9uc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSByZXNwb25zZSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IENMSUVOVDogU0VJIEFzeW5jIHJlc3BvbnNlIGlzOiAiICsgcmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IEVSUk9SOiBTRUkgQXN5bmMgRVhDRVBUSU9OLiIpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiByZXNwb25zZSArICI+Pj5BU1lOQyBTRVJWSUNFIEVYQ0VQVElPTjw8PCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGNsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuY2xpZW50Q29uZmlndXJhdGlvbkZhY3RvcnkgPSBjbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLSAgICB9Ci19Ci0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWMxNWUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNobzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJFY2hvU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9FY2hvLndzZGwiKQotcHVibGljIGNsYXNzIEVjaG9TZXJ2aWNlCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgRUNIT1NFUlZJQ0VfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovV0VCLUlORi93c2RsL0VjaG8ud3NkbCIpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBFQ0hPU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UoKSB7Ci0gICAgICAgIHN1cGVyKEVDSE9TRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsICJFY2hvU2VydmljZSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgRWNob1NlcnZpY2VQb3J0VHlwZQotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIkVjaG9TZXJ2aWNlUG9ydCIpCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQgZ2V0RWNob1NlcnZpY2VQb3J0KCkgewotICAgICAgICByZXR1cm4gKEVjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQpIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgIkVjaG9TZXJ2aWNlUG9ydCIpLCBFY2hvU2VydmljZVBvcnRUeXBlQ2xpZW50LmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2UxMi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTlmNGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG87Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiRWNob1NlcnZpY2UxMiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9FY2hvMTIud3NkbCIpCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UxMgotICAgICAgICBleHRlbmRzIFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIEVDSE9TRVJWSUNFMTJfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovV0VCLUlORi93c2RsL0VjaG8xMi53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIEVDSE9TRVJWSUNFMTJfV1NETF9MT0NBVElPTiA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UxMihVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2UxMigpIHsKLSAgICAgICAgc3VwZXIoRUNIT1NFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCAiRWNob1NlcnZpY2UxMiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgRWNob1NlcnZpY2UxMlBvcnRUeXBlCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiRWNob1NlcnZpY2UxMlBvcnQiKQotICAgIHB1YmxpYyBFY2hvU2VydmljZTEyUG9ydFR5cGVDbGllbnQgZ2V0RWNob1NlcnZpY2UxMlBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRWNob1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50KSBzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsICJFY2hvU2VydmljZTEyUG9ydCIpLCBFY2hvU2VydmljZTEyUG9ydFR5cGVDbGllbnQuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZTEyUG9ydFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiYmY3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UxMlBvcnRQcm94eSB7Ci0KLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBfZGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBFY2hvU2VydmljZTEyIF9zZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50IF9wcm94eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRGlzcGF0Y2g8U291cmNlPiBfZGlzcGF0Y2ggPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgRWNob1NlcnZpY2UxMigpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlc2NyaXB0b3IoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IEVjaG9TZXJ2aWNlMTIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpbml0Q29tbW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgaW5pdENvbW1vbigpIHsKLSAgICAgICAgICAgIF9wcm94eSA9IF9zZXJ2aWNlLmdldEVjaG9TZXJ2aWNlMTJQb3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TZXJ2aWNlMTJQb3J0VHlwZUNsaWVudCBnZXRQcm94eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJveHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGF0Y2g8U291cmNlPiBnZXREaXNwYXRjaCgpIHsKLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsICJFY2hvU2VydmljZTEyUG9ydCIpOwotICAgICAgICAgICAgICAgIF9kaXNwYXRjaCA9IF9zZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnRRTmFtZSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuUEFZTE9BRCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlFbmRwb2ludFVybCA9IGdldEVuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwYXRjaEVuZHBvaW50VXJsID0gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIGlmICghZGlzcGF0Y2hFbmRwb2ludFVybC5lcXVhbHMocHJveHlFbmRwb2ludFVybCkpCi0gICAgICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBwcm94eUVuZHBvaW50VXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfZGlzcGF0Y2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50KCkgewotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX3Byb3h5OwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludFVybCkgewotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX3Byb3h5OwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50VXJsKTsKLQotICAgICAgICAgICAgaWYgKF9kaXNwYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50VXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU2VydmljZTEyUG9ydFByb3h5KCkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlMTJQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbikgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgIkVjaG9TZXJ2aWNlMTIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlMTJQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBfZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZTxFY2hvU3RyaW5nUmVzcG9uc2U+IGVjaG9PcGVyYXRpb25Bc3luYyhFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuZWNob09wZXJhdGlvbkFzeW5jKHBhcmFtZXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1dHVyZTw/PiBlY2hvT3BlcmF0aW9uQXN5bmMoRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlciwgQXN5bmNIYW5kbGVyPEVjaG9TdHJpbmdSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuZWNob09wZXJhdGlvbkFzeW5jKHBhcmFtZXRlciwgYXN5bmNIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1N0cmluZ1Jlc3BvbnNlIGVjaG9PcGVyYXRpb24oRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcikgewotICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IoKS5nZXRQcm94eSgpLmVjaG9PcGVyYXRpb24ocGFyYW1ldGVyKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZTEyUG9ydFR5cGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyZTc1Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ0lucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNob1NlcnZpY2UxMlBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iKQotQFNPQVBCaW5kaW5nKHBhcmFtZXRlclN0eWxlID0gUGFyYW1ldGVyU3R5bGUuQkFSRSkKLXB1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50IHsKLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gcmV0dXJucyBqYXZheC54bWwud3MuUmVzcG9uc2U8b3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZT4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNob09wZXJhdGlvbiIsIGFjdGlvbiA9ICJlY2hvT3BlcmF0aW9uIikKLSAgICBwdWJsaWMgUmVzcG9uc2U8RWNob1N0cmluZ1Jlc3BvbnNlPiBlY2hvT3BlcmF0aW9uQXN5bmMoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlY2hvU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhc3luY0hhbmRsZXIKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdD4KLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWUgPSAiZWNob09wZXJhdGlvbiIsIGFjdGlvbiA9ICJlY2hvT3BlcmF0aW9uIikKLSAgICBwdWJsaWMgRnV0dXJlPD8+IGVjaG9PcGVyYXRpb25Bc3luYygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImVjaG9TdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIsCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJlY2hvT3BlcmF0aW9uUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiIiwgcGFydE5hbWUgPSAiYXN5bmNIYW5kbGVyIikKLSAgICAgICAgICAgIEFzeW5jSGFuZGxlcjxFY2hvU3RyaW5nUmVzcG9uc2U+IGFzeW5jSGFuZGxlcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNoby5FY2hvU3RyaW5nUmVzcG9uc2UKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJlY2hvT3BlcmF0aW9uIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAiZWNob1N0cmluZ1Jlc3BvbnNlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgIHB1YmxpYyBFY2hvU3RyaW5nUmVzcG9uc2UgZWNob09wZXJhdGlvbigKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImVjaG9TdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlQ2FsbGJhY2tIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYTM2NzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZUNhbGxiYWNrSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZUNhbGxiYWNrSGFuZGxlciBpbXBsZW1lbnRzIEFzeW5jSGFuZGxlcjxFY2hvU3RyaW5nUmVzcG9uc2U+IHsKLQotICAgIHByaXZhdGUgRWNob1N0cmluZ1Jlc3BvbnNlIG91dHB1dDsKLQotICAgIC8qCi0gICAgKgotICAgICogQHNlZSBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyI2hhbmRsZVJlc3BvbnNlKGphdmF4LnhtbC53cy5SZXNwb25zZSkKLSAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhhbmRsZVJlc3BvbnNlKFJlc3BvbnNlPEVjaG9TdHJpbmdSZXNwb25zZT4gcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dHB1dCA9IHJlc3BvbnNlLmdldCgpOwotICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBDTElFTlQ6IENvbm5lY3Rpb24gRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gQ0xJRU5UOiBJbnRlcnJ1cHRlZCBFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBFY2hvU3RyaW5nUmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZVBvcnRQcm94eS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvZWNoby9FY2hvU2VydmljZVBvcnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjI0NDU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2VQb3J0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG87Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNoby5FY2hvU3RyaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwud3MuQXN5bmNIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2VQb3J0UHJveHkgewotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3IgX2Rlc2NyaXB0b3I7Ci0KLSAgICBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0gICAgICAgIHByaXZhdGUgRWNob1NlcnZpY2UgX3NlcnZpY2UgPSBudWxsOwotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQuZWNoby5FY2hvU2VydmljZVBvcnRUeXBlQ2xpZW50IF9wcm94eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRGlzcGF0Y2g8U291cmNlPiBfZGlzcGF0Y2ggPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgRWNob1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBFY2hvU2VydmljZSh3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0Q29tbW9uKCkgewotICAgICAgICAgICAgX3Byb3h5ID0gX3NlcnZpY2UuZ2V0RWNob1NlcnZpY2VQb3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQgZ2V0UHJveHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Byb3h5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCAiRWNob1NlcnZpY2VQb3J0Iik7Ci0gICAgICAgICAgICAgICAgX2Rpc3BhdGNoID0gX3NlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eUVuZHBvaW50VXJsID0gZ2V0RW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BhdGNoRW5kcG9pbnRVcmwgPSAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNwYXRjaEVuZHBvaW50VXJsLmVxdWFscyhwcm94eUVuZHBvaW50VXJsKSkKLSAgICAgICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHByb3h5RW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50VXJsKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotCi0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlUG9ydFByb3h5KCkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVjaG9TZXJ2aWNlUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsICJFY2hvU2VydmljZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1NlcnZpY2VQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBfZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNwb25zZTxFY2hvU3RyaW5nUmVzcG9uc2U+IGVjaG9PcGVyYXRpb25Bc3luYyhFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuZWNob09wZXJhdGlvbkFzeW5jKHBhcmFtZXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1dHVyZTw/PiBlY2hvT3BlcmF0aW9uQXN5bmMoRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlciwgQXN5bmNIYW5kbGVyPEVjaG9TdHJpbmdSZXNwb25zZT4gYXN5bmNIYW5kbGVyKSB7Ci0gICAgICAgIHJldHVybiBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkuZWNob09wZXJhdGlvbkFzeW5jKHBhcmFtZXRlciwgYXN5bmNIYW5kbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWNob1N0cmluZ1Jlc3BvbnNlIGVjaG9PcGVyYXRpb24oRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcikgewotICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IoKS5nZXRQcm94eSgpLmVjaG9PcGVyYXRpb24ocGFyYW1ldGVyKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9lY2hvL0VjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjEyNmQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L2VjaG8vRWNob1NlcnZpY2VQb3J0VHlwZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1N0cmluZ0lucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZTsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXgueG1sLndzLkFzeW5jSGFuZGxlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNob1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG9TZXJ2aWNlUG9ydFR5cGVDbGllbnQgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIGphdmF4LnhtbC53cy5SZXNwb25zZTxvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LmVjaG8uRWNob1N0cmluZ1Jlc3BvbnNlPgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJlY2hvT3BlcmF0aW9uIiwgYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIHB1YmxpYyBSZXNwb25zZTxFY2hvU3RyaW5nUmVzcG9uc2U+IGVjaG9PcGVyYXRpb25Bc3luYygKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImVjaG9TdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIEVjaG9TdHJpbmdJbnB1dCBwYXJhbWV0ZXIpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFzeW5jSGFuZGxlcgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gZXh0ZW5kcyBqYXZhLmxhbmcuT2JqZWN0PgotICAgICAqLwotICAgIEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZSA9ICJlY2hvT3BlcmF0aW9uIiwgYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIHB1YmxpYyBGdXR1cmU8Pz4gZWNob09wZXJhdGlvbkFzeW5jKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlciwKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gImVjaG9PcGVyYXRpb25SZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICIiLCBwYXJ0TmFtZSA9ICJhc3luY0hhbmRsZXIiKQotICAgICAgICAgICAgQXN5bmNIYW5kbGVyPEVjaG9TdHJpbmdSZXNwb25zZT4gYXN5bmNIYW5kbGVyKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZQotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvT3BlcmF0aW9uKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZTEyUG9ydFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL010b21TYW1wbGUxMlBvcnRQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmM4MzNmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZTEyUG9ydFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50Lm10b207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5JbWFnZURlcG90OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLk10b21TYW1wbGUxMjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZTEyUG9ydFByb3h5IHsKLQotICAgIHByb3RlY3RlZCBEZXNjcmlwdG9yIF9kZXNjcmlwdG9yOwotCi0gICAgcHVibGljIGNsYXNzIERlc2NyaXB0b3IgewotICAgICAgICBwcml2YXRlIE10b21TYW1wbGVTZXJ2aWNlMTIgX3NlcnZpY2UgPSBudWxsOwotICAgICAgICBwcml2YXRlIE10b21TYW1wbGUxMiBfcHJveHkgPSBudWxsOwotICAgICAgICBwcml2YXRlIERpc3BhdGNoPFNvdXJjZT4gX2Rpc3BhdGNoID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcigpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IE10b21TYW1wbGVTZXJ2aWNlMTIoKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBNdG9tU2FtcGxlU2VydmljZTEyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21tb24oKSB7Ci0gICAgICAgICAgICBfcHJveHkgPSBfc2VydmljZS5nZXRNdG9tU2FtcGxlUG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE10b21TYW1wbGUxMiBnZXRQcm94eSgpIHsKLSAgICAgICAgICAgIHJldHVybiBfcHJveHk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGF0Y2g8U291cmNlPiBnZXREaXNwYXRjaCgpIHsKLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFFOYW1lIHBvcnRRTmFtZSA9IG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlUG9ydCIpOwotICAgICAgICAgICAgICAgIF9kaXNwYXRjaCA9IF9zZXJ2aWNlLmNyZWF0ZURpc3BhdGNoKHBvcnRRTmFtZSwgU291cmNlLmNsYXNzLCBTZXJ2aWNlLk1vZGUuTUVTU0FHRSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJveHlFbmRwb2ludFVybCA9IGdldEVuZHBvaW50KCk7Ci0gICAgICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwYXRjaEVuZHBvaW50VXJsID0gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICAgICAgICAgIGlmICghZGlzcGF0Y2hFbmRwb2ludFVybC5lcXVhbHMocHJveHlFbmRwb2ludFVybCkpCi0gICAgICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBwcm94eUVuZHBvaW50VXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfZGlzcGF0Y2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50KCkgewotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX3Byb3h5OwotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludFVybCkgewotICAgICAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX3Byb3h5OwotICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50VXJsKTsKLQotICAgICAgICAgICAgaWYgKF9kaXNwYXRjaCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIGVuZHBvaW50VXJsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNdG9tU2FtcGxlMTJQb3J0UHJveHkoKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZTEyUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlU2VydmljZTEyIikpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTXRvbVNhbXBsZTEyUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3Iod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3IgX2dldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBfZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoSW1hZ2VEZXBvdCBpbnB1dCkgewotICAgICAgICByZXR1cm4gX2dldERlc2NyaXB0b3IoKS5nZXRQcm94eSgpLnNlbmRJbWFnZShpbnB1dCk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9NdG9tU2FtcGxlUG9ydFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL010b21TYW1wbGVQb3J0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3MThjMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL010b21TYW1wbGVQb3J0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLkltYWdlRGVwb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uTXRvbVNhbXBsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVBvcnRQcm94eSB7Ci0KLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBfZGVzY3JpcHRvcjsKLQotICAgIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yIHsKLSAgICAgICAgcHJpdmF0ZSBNdG9tU2FtcGxlU2VydmljZSBfc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgTXRvbVNhbXBsZSBfcHJveHkgPSBudWxsOwotICAgICAgICBwcml2YXRlIERpc3BhdGNoPFNvdXJjZT4gX2Rpc3BhdGNoID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcigpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IE10b21TYW1wbGVTZXJ2aWNlKCk7Ci0gICAgICAgICAgICBpbml0Q29tbW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcihVUkwgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBNdG9tU2FtcGxlU2VydmljZSh3c2RsTG9jYXRpb24sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlU2VydmljZSIpKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBNdG9tU2FtcGxlU2VydmljZSh3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0Q29tbW9uKCkgewotICAgICAgICAgICAgX3Byb3h5ID0gX3NlcnZpY2UuZ2V0TXRvbVNhbXBsZVBvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNdG9tU2FtcGxlIGdldFByb3h5KCkgewotICAgICAgICAgICAgcmV0dXJuIF9wcm94eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwYXRjaDxTb3VyY2U+IGdldERpc3BhdGNoKCkgewotICAgICAgICAgICAgaWYgKF9kaXNwYXRjaCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcG9ydFFOYW1lID0gbmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgIk10b21TYW1wbGVQb3J0Iik7Ci0gICAgICAgICAgICAgICAgX2Rpc3BhdGNoID0gX3NlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5NRVNTQUdFKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eUVuZHBvaW50VXJsID0gZ2V0RW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BhdGNoRW5kcG9pbnRVcmwgPSAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNwYXRjaEVuZHBvaW50VXJsLmVxdWFscyhwcm94eUVuZHBvaW50VXJsKSkKLSAgICAgICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHByb3h5RW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50VXJsKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotCi0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE10b21TYW1wbGVQb3J0UHJveHkoKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVBvcnRQcm94eShVUkwgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3Iod3NkbExvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVBvcnRQcm94eShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9yIF9nZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gX2Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsKLSAgICAgICAgcmV0dXJuIF9nZXREZXNjcmlwdG9yKCkuZ2V0UHJveHkoKS5zZW5kSW1hZ2UoaW5wdXQpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwZjgyMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL010b21TYW1wbGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLk10b21TYW1wbGU7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiTXRvbVNhbXBsZVNlcnZpY2UiLAotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvSW1hZ2VEZXBvdC53c2RsIikKLXB1YmxpYyBjbGFzcyBNdG9tU2FtcGxlU2VydmljZQotICAgICAgICBleHRlbmRzIFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIE1UT01TQU1QTEVTRVJWSUNFX1dTRExfTE9DQVRJT047Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6L1dFQi1JTkYvd3NkbC9JbWFnZURlcG90LndzZGwiKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTVRPTVNBTVBMRVNFUlZJQ0VfV1NETF9MT0NBVElPTiA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVNlcnZpY2UoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgc3VwZXIod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE10b21TYW1wbGVTZXJ2aWNlKCkgewotICAgICAgICBzdXBlcihNVE9NU0FNUExFU0VSVklDRV9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCAiTXRvbVNhbXBsZVNlcnZpY2UiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiByZXR1cm5zIE10b21TYW1wbGUKLSAgICAgKi8KLSAgICBAV2ViRW5kcG9pbnQobmFtZSA9ICJNdG9tU2FtcGxlUG9ydCIpCi0gICAgcHVibGljIE10b21TYW1wbGUgZ2V0TXRvbVNhbXBsZVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoTXRvbVNhbXBsZSkgc3VwZXIuZ2V0UG9ydChuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCAiTXRvbVNhbXBsZVBvcnQiKSwgTXRvbVNhbXBsZS5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9tdG9tL010b21TYW1wbGVTZXJ2aWNlMTIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVNlcnZpY2UxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ0YTQ4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vTXRvbVNhbXBsZVNlcnZpY2UxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50Lm10b207Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5NdG9tU2FtcGxlMTI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiTXRvbVNhbXBsZVNlcnZpY2UxMiIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwKLSAgICAgICAgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9JbWFnZURlcG90MTIud3NkbCIpCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVNlcnZpY2UxMgotICAgICAgICBleHRlbmRzIFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIE1UT01TQU1QTEVTRVJWSUNFMTJfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIE1UT01TQU1QTEVTRVJWSUNFMTJfV1NETF9MT0NBVElPTiA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVNlcnZpY2UxMihVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTXRvbVNhbXBsZVNlcnZpY2UxMigpIHsKLSAgICAgICAgc3VwZXIoTVRPTVNBTVBMRVNFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCAiTXRvbVNhbXBsZVNlcnZpY2UxMiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgTXRvbVNhbXBsZTEyCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiTXRvbVNhbXBsZVBvcnQiKQotICAgIHB1YmxpYyBNdG9tU2FtcGxlMTIgZ2V0TXRvbVNhbXBsZVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoTXRvbVNhbXBsZTEyKSBzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsICJNdG9tU2FtcGxlUG9ydCIpLCBNdG9tU2FtcGxlMTIuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9TYW1wbGVNVE9NVGVzdHMuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L210b20vU2FtcGxlTVRPTVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzhlOGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvbXRvbS9TYW1wbGVNVE9NVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQubXRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLkltYWdlRGVwb3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uT2JqZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5TZW5kSW1hZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uU2VuZEltYWdlUmVzcG9uc2U7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwud3MuQmluZGluZ1Byb3ZpZGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5EaXNwYXRjaDsKLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBBIHNhbXBsZSBjbGllbnQgdGhhdCB1c2VzIE1UT00gdG8gc2VuZCBhbiBpbWFnZSB1c2luZyBib3RoIHRoZSBKQVgtV1MKLSAqIERpc3BhdGNoIGFuZCB0aGUgUHJveHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1wbGVNVE9NVGVzdHMgewotICAgIHByaXZhdGUgU3RyaW5nIHVybEhvc3QgPSAibG9jYWxob3N0IjsKLSAgICBwcml2YXRlIFN0cmluZyB1cmxQb3J0ID0gIjgwODAiOwotICAgIHByaXZhdGUgU3RyaW5nIHVybFN1ZmZpeCA9ICIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0JBU0UgPSAiL2pheHdzLXNhbXBsZXMvc2VydmljZXMvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVRPTV9DT05URVhUMTEgPSBDT05URVhUX0JBU0UgKyAiTXRvbVNhbXBsZVNlcnZpY2UuTXRvbVNhbXBsZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNVE9NX0NPTlRFWFQxMiA9IENPTlRFWFRfQkFTRSArICJNdG9tU2FtcGxlU2VydmljZTEyLk10b21TYW1wbGVQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iOwotICAgIHByaXZhdGUgU3RyaW5nIHVyaVN0cmluZyA9ICJodHRwOi8vIiArIHVybEhvc3QgKyAiOiIgKyB1cmxQb3J0OwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUxMSA9IG5ldyBRTmFtZShOQU1FU1BBQ0UsICJNdG9tU2FtcGxlU2VydmljZSIpOwotICAgIHByaXZhdGUgUU5hbWUgc2VydmljZU5hbWUxMiA9IG5ldyBRTmFtZShOQU1FU1BBQ0UsICJNdG9tU2FtcGxlU2VydmljZTEyIik7Ci0gICAgcHJpdmF0ZSBRTmFtZSBwb3J0TmFtZURpc3BhdGNoID0gbmV3IFFOYW1lKE5BTUVTUEFDRSwgIk10b21TYW1wbGVQb3J0RGlzcGF0Y2giKTsKLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIGNvbnRlbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW1hZ2VGaWxlbmFtZSA9ICIiOwotICAgIHByaXZhdGUgQm9vbGVhbiB0cnlEaXNwYXRjaCA9IHRydWU7Ci0gICAgcHJpdmF0ZSBCb29sZWFuIHRyeVByb3h5ID0gdHJ1ZTsKLSAgICBwcml2YXRlIEJvb2xlYW4gc29hcDEyID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDb21tYW5kIExpbmUgUHJvZ3JhbSBFbnRyeSBQb2ludAotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MgLSBzZWUgcHJpbnRVc2FnZSBvdXRwdXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2FtcGxlTVRPTVRlc3RzIHRlc3RzID0gbmV3IFNhbXBsZU1UT01UZXN0cygpOwotICAgICAgICB0ZXN0cy5wYXJzZUFyZ3MoYXJncyk7Ci0gICAgICAgIGlmICh0ZXN0cy50cnlEaXNwYXRjaCkgewotICAgICAgICAgICAgdGVzdHMudGVzdE10b21XaXRoRGlzcGF0Y2gobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRlc3RzLnRyeVByb3h5KSB7Ci0gICAgICAgICAgICB0ZXN0cy50ZXN0TXRvbVdpdGhQcm94eShudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWQgYW5kIGludGVycHJldCB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KLSAgICAgKiBTZWUgcHJpbnRVc2FnZSBvdXRwdXQgZm9yIHN1cHBvcnRlZCBwYXJhbWV0ZXJzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncyBTdHJpbmdbXSBGcm9tIHRoZSBDb21tYW5kIExpbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3MoU3RyaW5nW10gYXJncykgewotICAgICAgICAvLyBQYXJzZSB0aGUgYXJndW1lbnRzCi0KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID49IDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgnLScgPT0gYXJnc1tpXS5jaGFyQXQoMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYXJnc1tpXS5jaGFyQXQoMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZShudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlEaXNwYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeVByb3h5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlEaXNwYXRjaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlQcm94eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxIb3N0ID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsUG9ydCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlRmlsZW5hbWUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwMTIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAxMiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoYXJnc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIG9wdGlvbiBmb3JtYXQuIik7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cmlTdHJpbmcgPSAiaHR0cDovLyIgKyB1cmxIb3N0ICsgIjoiICsgdXJsUG9ydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERpc3BsYXkgYSB3YXJuaW5nIGlmIHRoZXJlIGlzIG5vIGlucHV0IGZpbGVuYW1lCi0gICAgICAgIGlmICgwID09IGltYWdlRmlsZW5hbWUubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIj4+IFtXQVJOSU5HfSAtIE5vIGF0dGFjaG1lbnQgZmlsZSBzcGVjaWZpZWQuICBObyBkYXRhIHdpbGwgYmUgaW5jbHVkZWQuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc3VmZml4IGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkCi0gICAgICAgIGlmICgwID09IHVybFN1ZmZpeC5sZW5ndGgoKSkgewotICAgICAgICAgICAgaWYgKHNvYXAxMikgewotICAgICAgICAgICAgICAgIHVybFN1ZmZpeCA9IE1UT01fQ09OVEVYVDEyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cmxTdWZmaXggPSBNVE9NX0NPTlRFWFQxMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBtdWx0aXBsZSBjbGFzcyB2YXJpYWJsZXMgYW5kIGluaXQgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmkgICAgICAtIFN0cmluZyAtIGJhc2Ugc2VydmljZSBVUkkKLSAgICAgKiBAcGFyYW0gc29hcGRlZiAgLSBCb29sZWFuIC0gdHJ1ZSBmb3IgU09BUCAxLjIKLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgLSBzb3VyY2UgZmlsZSB0byBzZW5kCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3B0aW9ucyhTdHJpbmcgdXJpLCBCb29sZWFuIHNvYXBkZWYsIFN0cmluZyBmaWxlTmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB1cmlTdHJpbmcgPSB1cmk7Ci0gICAgICAgIHVybFN1ZmZpeCA9IChzb2FwZGVmKSA/IE1UT01fQ09OVEVYVDEyIDogTVRPTV9DT05URVhUMTE7Ci0gICAgICAgIHNvYXAxMiA9IHNvYXBkZWY7Ci0gICAgICAgIGltYWdlRmlsZW5hbWUgPSBmaWxlTmFtZTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHVzYWdlIGhlbHAgdG8gb3V0cHV0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaW52YWxpZE9wdCAtCi0gICAgICogICAgICAgICAgICAgICAgICAgaWYgbm9uLW51bGwsIGlzIHRoZSBpbnZhbGlkIHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcmludFVzYWdlKFN0cmluZyBpbnZhbGlkT3B0KSB7Ci0gICAgICAgIGlmIChudWxsICE9IGludmFsaWRPcHQpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBPcHRpb246ICIgKyBpbnZhbGlkT3B0KTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiIpOwotICAgICAgICBTeXN0ZW0ub3V0Ci0gICAgICAgICAgICAgICAgLnByaW50bG4oIiAgcnVuU2FtcGxlTXRvbSAtaCBbaG9zdG5hbWVdIC1wIFtwb3J0XSAtZiBbdXJsU3VmZml4XSAtaSBbaW1hZ2VGaWxlbmFtZV0gLWQgLXggLTEgLTIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IHZhbHVlczoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIGhvc3RuYW1lID0gbG9jYWxob3N0Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBwb3J0ID0gODA4MCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgdXJsU3VmZml4ID0gL2pheHdzLXNhbXBsZXMvc2VydmljZXMvTXRvbVNhbXBsZVNlcnZpY2UuTXRvbVNhbXBsZVBvcnQiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1kID0gVXNlIERpc3BhdGNoIE9ubHkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC14ID0gVXNlIFByb3h5IE9ubHkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0xID0gc29hcCAxLjEgKGRlZmF1bHQpIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtMiA9IHNvYXAgMS4yIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgY29udGVudCBvYmplY3QgaWYgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoY29udGVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb250ZW50ID0gZ2V0QmluYXJ5Q29udGVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgc2VuZGluZyBhbiBpbWFnZSB3aXRoIE1UT00sIHVzaW5nIHRoZSBKQVgtV1MgRGlzcGF0Y2ggQVBJLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlc3VsdCAtIFN0cmluZyAtIHVzZWQgdG8gcGFzcyBiYWNrIHJlc3VsdHMgdG8gc2VydmxldC4KLSAgICAgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBpbnB1dCBzdHJpbmcgb3IgbnVsbAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0ZXN0TXRvbVdpdGhEaXNwYXRjaChTdHJpbmcgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VydmljZSBzdmM7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gRGlzcGF0Y2ggVGVzdCIpOwotCi0gICAgICAgIGluaXQoKTsKLQotICAgICAgICAvLyBTZXQgdGhlIGRhdGEgaW5zaWRlIG9mIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QKLSAgICAgICAgSW1hZ2VEZXBvdCBpbWFnZURlcG90ID0gbmV3IE9iamVjdEZhY3RvcnkoKS5jcmVhdGVJbWFnZURlcG90KCk7Ci0gICAgICAgIGltYWdlRGVwb3Quc2V0SW1hZ2VEYXRhKGNvbnRlbnQpOwotCi0gICAgICAgIGlmIChzb2FwMTIpIHsKLSAgICAgICAgICAgIHN2YyA9IFNlcnZpY2UuY3JlYXRlKHNlcnZpY2VOYW1lMTIpOwotICAgICAgICAgICAgc3ZjLmFkZFBvcnQocG9ydE5hbWVEaXNwYXRjaCwgU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCB1cmlTdHJpbmcgKyB1cmxTdWZmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ZjID0gU2VydmljZS5jcmVhdGUoc2VydmljZU5hbWUxMSk7Ci0gICAgICAgICAgICBzdmMuYWRkUG9ydChwb3J0TmFtZURpc3BhdGNoLCBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIHVyaVN0cmluZyArIHVybFN1ZmZpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXR1cCB0aGUgbmVjZXNzYXJ5IEpBWC1XUyBhcnRpZmFjdHMKLSAgICAgICAgSkFYQkNvbnRleHQgamJjID0gSkFYQkNvbnRleHQKLSAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tIik7Ci0gICAgICAgIERpc3BhdGNoPE9iamVjdD4gZGlzcGF0Y2ggPSBzdmMuY3JlYXRlRGlzcGF0Y2gocG9ydE5hbWVEaXNwYXRjaCwgamJjLAotICAgICAgICAgICAgICAgIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLSAgICAgICAgQmluZGluZ1Byb3ZpZGVyIGJwID0gKEJpbmRpbmdQcm92aWRlcikgZGlzcGF0Y2g7Ci0gICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5TT0FQQUNUSU9OX1VTRV9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOwotICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuU09BUEFDVElPTl9VUklfUFJPUEVSVFksCi0gICAgICAgICAgICAgICAgInNlbmRJbWFnZSIpOwotCi0gICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIGZsYWcgdG8gZW5hYmxlIE1UT00KLSAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgZGlzcGF0Y2guZ2V0QmluZGluZygpOwotICAgICAgICBiaW5kaW5nLnNldE1UT01FbmFibGVkKHRydWUpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgcmVxdWVzdCB3cmFwcGVyIGJlYW4KLSAgICAgICAgT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IE9iamVjdEZhY3RvcnkoKTsKLSAgICAgICAgU2VuZEltYWdlIHJlcXVlc3QgPSBmYWN0b3J5LmNyZWF0ZVNlbmRJbWFnZSgpOwotICAgICAgICByZXF1ZXN0LnNldElucHV0KGltYWdlRGVwb3QpOwotCi0gICAgICAgIGlmIChudWxsICE9IHJlc3VsdCkgewotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiSW52b2tpbmcgRGlzcGF0Y2g8T2JqZWN0PiB3aXRoIGEgYmluYXJ5IHBheWxvYWRcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj5NVE9NIEludm9raW5nIERpc3BhdGNoPE9iamVjdD4gd2l0aCBhIGJpbmFyeSBwYXlsb2FkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIHRoZSBpbWFnZSBhbmQgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW1hZ2UKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlbmRJbWFnZVJlc3BvbnNlIHJlc3BvbnNlID0gKFNlbmRJbWFnZVJlc3BvbnNlKSBkaXNwYXRjaC5pbnZva2UocmVxdWVzdCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJNVE9NIERpc3BhdGNoIFJlc3BvbnNlIHJlY2VpdmVkIC0gIiArIHJlc3BvbnNlLmdldE91dHB1dCgpLmdldEltYWdlRGF0YSgpLmdldENvbnRlbnRUeXBlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIkVSUk9SOiBNVE9NIERpc3BhdGNoIE5VTEwgUmVzcG9uc2UgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIFJlc3BvbnNlIHJlY2VpdmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj5NVE9NIFdyaXRpbmcgcmV0dXJuZWQgaW1hZ2UgdG8gZGlzcGF0Y2hfcmVzcG9uc2UuZ2lmIik7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlRGVwb3QgcmVzcG9uc2VDb250ZW50ID0gcmVzcG9uc2UuZ2V0T3V0cHV0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJbWFnZURlcG90KHJlc3BvbnNlQ29udGVudCwgImRpc3BhdGNoX3Jlc3BvbnNlLmdpZiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gW0VSUk9SXSAtIFJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciB3YXMgTlVMTCIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiPj4gW0VSUk9SXSAtIEV4Y2VwdGlvbiBtYWtpbmcgY29ubmVjdGlvbi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gW0VSUk9SXSAtIEV4Y2VwdGlvbiBtYWtpbmcgY29ubmVjdGlvbi4iKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gRGlzcGF0Y2ggRG9uZSIpOwotICAgICAgICByZXR1cm4gKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgc2VuZGluZyBhbiBpbWFnZSB3aXRoIE1UT00sIHVzaW5nIGEgSkFYLVdTIER5bmFtaWMgUHJveHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzdWx0IC0gU3RyaW5nIC0gdXNlZCB0byBwYXNzIGJhY2sgcmVzdWx0cyB0byBzZXJ2bGV0LgotICAgICAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGlucHV0IHN0cmluZyBvciBudWxsCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRlc3RNdG9tV2l0aFByb3h5KFN0cmluZyByZXN1bHQsIFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbWFnZURlcG90IHJlc3BvbnNlOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIFByb3h5IFRlc3QiKTsKLQotICAgICAgICBpbml0KCk7Ci0KLSAgICAgICAgLy8gU2V0IHRoZSBkYXRhIGluc2lkZSBvZiB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0Ci0gICAgICAgIEltYWdlRGVwb3QgaW1hZ2VEZXBvdCA9IG5ldyBPYmplY3RGYWN0b3J5KCkuY3JlYXRlSW1hZ2VEZXBvdCgpOwotICAgICAgICBpbWFnZURlcG90LnNldEltYWdlRGF0YShjb250ZW50KTsKLQotICAgICAgICBpZiAobnVsbCAhPSByZXN1bHQpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoIkludm9raW5nIE1UT00gcHJveHkgd2l0aCBhIGJpbmFyeSBwYXlsb2FkXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIEludm9raW5nIHByb3h5IHdpdGggYSBiaW5hcnkgcGF5bG9hZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2V0dXAgdGhlIG5lY2Vzc2FyeSBKQVgtV1MgYXJ0aWZhY3RzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc29hcDEyKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBnZW5lcmF0ZWQgcHJveHkKLSAgICAgICAgICAgICAgICBNdG9tU2FtcGxlMTJQb3J0UHJveHkgcHJveHkgPSBuZXcgTXRvbVNhbXBsZTEyUG9ydFByb3h5KHVybCk7Ci0gICAgICAgICAgICAgICAgcHJveHkuX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludCh1cmlTdHJpbmcgKyB1cmxTdWZmaXgpOwotCi0gICAgICAgICAgICAgICAgLy8gRW5hYmxlIE1UT00KLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eS5fZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCk7Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgYnAuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBpbWFnZSBhbmQgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW1hZ2UKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnNlbmRJbWFnZShpbWFnZURlcG90KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU09BUCAxLjEgQ3JlYXRlIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgLy8JCQkJIFVzZSB0aGUgZ2VuZXJhdGVkIHByb3h5Ci0gICAgICAgICAgICAgICAgTXRvbVNhbXBsZVBvcnRQcm94eSBwcm94eSA9IG5ldyBNdG9tU2FtcGxlUG9ydFByb3h5KHVybCk7Ci0gICAgICAgICAgICAgICAgcHJveHkuX2dldERlc2NyaXB0b3IoKS5zZXRFbmRwb2ludCh1cmlTdHJpbmcgKyB1cmxTdWZmaXgpOwotCi0gICAgICAgICAgICAgICAgLy8gRW5hYmxlIE1UT00KLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBwcm94eS5fZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCk7Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgYmluZGluZyA9IChTT0FQQmluZGluZykgYnAuZ2V0QmluZGluZygpOwotICAgICAgICAgICAgICAgIGJpbmRpbmcuc2V0TVRPTUVuYWJsZWQodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBpbWFnZSBhbmQgcHJvY2VzcyB0aGUgcmVzcG9uc2UgaW1hZ2UKLSAgICAgICAgICAgICAgICByZXNwb25zZSA9IHByb3h5LnNlbmRJbWFnZShpbWFnZURlcG90KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiTVRPTSBQcm94eSBSZXNwb25zZSByZWNlaXZlZCAtICIgKyByZXNwb25zZS5nZXRJbWFnZURhdGEoKS5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJFUlJPUjogTVRPTSBQcm94eSBOVUxMIFJlc3BvbnNlIHJlY2VpdmVkXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIFJlc3BvbnNlIHJlY2VpdmVkIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJpbnRsbigiPj5NVE9NIFdyaXRpbmcgcmV0dXJuZWQgaW1hZ2UgdG8gcHJveHlfcmVzcG9uc2UuZ2lmIik7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NJbWFnZURlcG90KHJlc3BvbnNlLCAicHJveHlfcmVzcG9uc2UuZ2lmIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcmludGxuKCI+PiBbRVJST1JdIC0gUmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIHdhcyBOVUxMIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKG51bGwgIT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCgiPj4gW0VSUk9SXSAtIEV4Y2VwdGlvbiBtYWtpbmcgY29ubmVjdGlvbi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gW0VSUk9SXSAtIEV4Y2VwdGlvbiBtYWtpbmcgY29ubmVjdGlvbi4iKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+TVRPTSBQcm94eSBEb25lIik7Ci0gICAgICAgIHJldHVybiAocmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBHZXQgYSBEYXRhSGFuZGxlciB0aGF0IGNvbnRhaW5zIHRoZSBiaW5hcnkgZGF0YSB3ZSdkIGxpa2UgdG8gc2VuZC4KLSAgICAgICogQHJldHVybiBEYXRhSGFuZGxlcgotICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgKi8KLSAgICBwcml2YXRlIERhdGFIYW5kbGVyIGdldEJpbmFyeUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGF0YUhhbmRsZXIgZGggPSBudWxsOwotICAgICAgICBpZiAoaW1hZ2VGaWxlbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZUZpbGVuYW1lKTsKLSAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIExvYWRpbmcgZGF0YSBmcm9tOiAnIgotICAgICAgICAgICAgICAgICAgICArIGZpbGUudG9VUkkoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgKyAiJyIpOwotICAgICAgICAgICAgRmlsZURhdGFTb3VyY2UgZmRzID0gbmV3IEZpbGVEYXRhU291cmNlKGZpbGUpOwotICAgICAgICAgICAgZGggPSBuZXcgRGF0YUhhbmRsZXIoZmRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkaDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAgKiBUYWtlcyB0aGUgZGF0YSBmcm9tIHRoZSBJbWFnZURlcG90IGFuZCB3cml0ZXMgaXQgb3V0IHRvIGEgZmlsZSBuYW1lZCBieQotICAgICAgKiB0aGUgcHJvdmlkZWQgU3RyaW5nLgotICAgICAgKiBAcGFyYW0gSW1hZ2VEZXBvdCBkYXRhCi0gICAgICAqIEBwYXJhbSBTdHJpbmcgZm5hbWUKLSAgICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbWFnZURlcG90KEltYWdlRGVwb3QgZGF0YSwgU3RyaW5nIGZuYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIERhdGFIYW5kbGVyIGRoID0gZGF0YS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgaWYgKGRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZuYW1lKTsKLSAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZi5kZWxldGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLSAgICAgICAgICAgIGRoLndyaXRlVG8oZm9zKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgICAgICAgICAgICAgLnByaW50bG4oIj4+IFtFUlJPUl0gLSBJbWFnZURlcG90IHdhcyBub3QgbnVsbCwgYnV0IGRpZCBub3QgY29udGFpbiBiaW5hcnkgZGF0YSIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjY2ODE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkVuZHBvaW50OwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLQotQFdlYlNlcnZpY2VDbGllbnQobmFtZSA9ICJQaW5nU2VydmljZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9QaW5nLndzZGwiKQotcHVibGljIGNsYXNzIFBpbmdTZXJ2aWNlCi0gICAgICAgIGV4dGVuZHMgU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgUElOR1NFUlZJQ0VfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovV0VCLUlORi93c2RsL1Bpbmcud3NkbCIpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBQSU5HU0VSVklDRV9XU0RMX0xPQ0FUSU9OID0gdXJsOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZShVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2UoKSB7Ci0gICAgICAgIHN1cGVyKFBJTkdTRVJWSUNFX1dTRExfTE9DQVRJT04sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZSIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgUGluZ1NlcnZpY2VQb3J0VHlwZQotICAgICAqLwotICAgIEBXZWJFbmRwb2ludChuYW1lID0gIlBpbmdTZXJ2aWNlUG9ydCIpCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQgZ2V0UGluZ1NlcnZpY2VQb3J0KCkgewotICAgICAgICByZXR1cm4gKFBpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQpIHN1cGVyLmdldFBvcnQobmV3IFFOYW1lKCJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgIlBpbmdTZXJ2aWNlUG9ydCIpLCBQaW5nU2VydmljZVBvcnRUeXBlQ2xpZW50LmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2UxMi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZTEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NTAwODkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LnBpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJFbmRwb2ludDsKLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLUBXZWJTZXJ2aWNlQ2xpZW50KG5hbWUgPSAiUGluZ1NlcnZpY2UxMiIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9QaW5nMTIud3NkbCIpCi1wdWJsaWMgY2xhc3MgUGluZ1NlcnZpY2UxMgotICAgICAgICBleHRlbmRzIFNlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVVJMIFBJTkdTRVJWSUNFMTJfV1NETF9MT0NBVElPTjsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCgiZmlsZTovV0VCLUlORi93c2RsL1BpbmcxMi53c2RsIik7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIFBJTkdTRVJWSUNFMTJfV1NETF9MT0NBVElPTiA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2UxMihVUkwgd3NkbExvY2F0aW9uLCBRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBzdXBlcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2UxMigpIHsKLSAgICAgICAgc3VwZXIoUElOR1NFUlZJQ0UxMl9XU0RMX0xPQ0FUSU9OLCBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCAiUGluZ1NlcnZpY2UxMiIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHJldHVybnMgUGluZ1NlcnZpY2UxMlBvcnRUeXBlCi0gICAgICovCi0gICAgQFdlYkVuZHBvaW50KG5hbWUgPSAiUGluZ1NlcnZpY2UxMlBvcnQiKQotICAgIHB1YmxpYyBQaW5nU2VydmljZTEyUG9ydFR5cGVDbGllbnQgZ2V0UGluZ1NlcnZpY2UxMlBvcnQoKSB7Ci0gICAgICAgIHJldHVybiAoUGluZ1NlcnZpY2UxMlBvcnRUeXBlQ2xpZW50KSBzdXBlci5nZXRQb3J0KG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZTEyUG9ydCIpLCBQaW5nU2VydmljZTEyUG9ydFR5cGVDbGllbnQuY2xhc3MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZTEyUG9ydFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmZDE4Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LnBpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZy5QaW5nU3RyaW5nSW5wdXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nUHJvdmlkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLkRpc3BhdGNoOwotaW1wb3J0IGphdmF4LnhtbC53cy5TZXJ2aWNlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIFBpbmdTZXJ2aWNlMTJQb3J0UHJveHkgewotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3IgX2Rlc2NyaXB0b3I7Ci0KLSAgICBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0gICAgICAgIHByaXZhdGUgUGluZ1NlcnZpY2UxMiBfc2VydmljZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nLlBpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudCBfcHJveHkgPSBudWxsOwotICAgICAgICBwcml2YXRlIERpc3BhdGNoPFNvdXJjZT4gX2Rpc3BhdGNoID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgRGVzY3JpcHRvcigpIHsKLSAgICAgICAgICAgIF9zZXJ2aWNlID0gbmV3IFBpbmdTZXJ2aWNlMTIoKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBQaW5nU2VydmljZTEyKHdzZGxMb2NhdGlvbiwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaW5pdENvbW1vbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21tb24oKSB7Ci0gICAgICAgICAgICBfcHJveHkgPSBfc2VydmljZS5nZXRQaW5nU2VydmljZTEyUG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZy5QaW5nU2VydmljZTEyUG9ydFR5cGVDbGllbnQgZ2V0UHJveHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Byb3h5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCAiUGluZ1NlcnZpY2UxMlBvcnQiKTsKLSAgICAgICAgICAgICAgICBfZGlzcGF0Y2ggPSBfc2VydmljZS5jcmVhdGVEaXNwYXRjaChwb3J0UU5hbWUsIFNvdXJjZS5jbGFzcywgU2VydmljZS5Nb2RlLlBBWUxPQUQpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5RW5kcG9pbnRVcmwgPSBnZXRFbmRwb2ludCgpOwotICAgICAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGF0Y2hFbmRwb2ludFVybCA9IChTdHJpbmcpIGJwLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRpc3BhdGNoRW5kcG9pbnRVcmwuZXF1YWxzKHByb3h5RW5kcG9pbnRVcmwpKQotICAgICAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgcHJveHlFbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludCgpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnRVcmwpIHsKLSAgICAgICAgICAgIEJpbmRpbmdQcm92aWRlciBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9wcm94eTsKLSAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0KLSAgICAgICAgICAgIGlmIChfZGlzcGF0Y2ggIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJwID0gKEJpbmRpbmdQcm92aWRlcikgX2Rpc3BhdGNoOwotICAgICAgICAgICAgICAgIGJwLmdldFJlcXVlc3RDb250ZXh0KCkucHV0KEJpbmRpbmdQcm92aWRlci5FTkRQT0lOVF9BRERSRVNTX1BST1BFUlRZLCBlbmRwb2ludFVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2UxMlBvcnRQcm94eSgpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZTEyUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZTEyIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaW5nU2VydmljZTEyUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIF9kZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3Iod3NkbExvY2F0aW9uLCBzZXJ2aWNlTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3IgX2dldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBfZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwaW5nT3BlcmF0aW9uKFBpbmdTdHJpbmdJbnB1dCBwYXJhbWV0ZXIpIHsKLSAgICAgICAgX2dldERlc2NyaXB0b3IoKS5nZXRQcm94eSgpLnBpbmdPcGVyYXRpb24ocGFyYW1ldGVyKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZTEyUG9ydFR5cGVDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjYmExOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuUGluZ1N0cmluZ0lucHV0OwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIlBpbmdTZXJ2aWNlMTJQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdTZXJ2aWNlMTJQb3J0VHlwZUNsaWVudCB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBAV2ViTWV0aG9kKGFjdGlvbiA9ICJwaW5nT3BlcmF0aW9uIikKLSAgICBAT25ld2F5Ci0gICAgcHVibGljIHZvaWQgcGluZ09wZXJhdGlvbigKLSAgICAgICAgICAgIEBXZWJQYXJhbShuYW1lID0gInBpbmdTdHJpbmdJbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgcGFydE5hbWUgPSAicGFyYW1ldGVyIikKLSAgICAgICAgICAgIFBpbmdTdHJpbmdJbnB1dCBwYXJhbWV0ZXIpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlUG9ydFByb3h5LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2NsaWVudC9waW5nL1BpbmdTZXJ2aWNlUG9ydFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjZkMzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZVBvcnRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nLlBpbmdTdHJpbmdJbnB1dDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdQcm92aWRlcjsKLWltcG9ydCBqYXZheC54bWwud3MuRGlzcGF0Y2g7Ci1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2U7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgUGluZ1NlcnZpY2VQb3J0UHJveHkgewotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3IgX2Rlc2NyaXB0b3I7Ci0KLSAgICBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvciB7Ci0gICAgICAgIHByaXZhdGUgUGluZ1NlcnZpY2UgX3NlcnZpY2UgPSBudWxsOwotICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5jbGllbnQucGluZy5QaW5nU2VydmljZVBvcnRUeXBlQ2xpZW50IF9wcm94eSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRGlzcGF0Y2g8U291cmNlPiBfZGlzcGF0Y2ggPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgX3NlcnZpY2UgPSBuZXcgUGluZ1NlcnZpY2UoKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yKFVSTCB3c2RsTG9jYXRpb24sIFFOYW1lIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgICAgICBfc2VydmljZSA9IG5ldyBQaW5nU2VydmljZSh3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGluaXRDb21tb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0Q29tbW9uKCkgewotICAgICAgICAgICAgX3Byb3h5ID0gX3NlcnZpY2UuZ2V0UGluZ1NlcnZpY2VQb3J0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5waW5nLlBpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQgZ2V0UHJveHkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gX3Byb3h5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERpc3BhdGNoPFNvdXJjZT4gZ2V0RGlzcGF0Y2goKSB7Ci0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBwb3J0UU5hbWUgPSBuZXcgUU5hbWUoImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCAiUGluZ1NlcnZpY2VQb3J0Iik7Ci0gICAgICAgICAgICAgICAgX2Rpc3BhdGNoID0gX3NlcnZpY2UuY3JlYXRlRGlzcGF0Y2gocG9ydFFOYW1lLCBTb3VyY2UuY2xhc3MsIFNlcnZpY2UuTW9kZS5QQVlMT0FEKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm94eUVuZHBvaW50VXJsID0gZ2V0RW5kcG9pbnQoKTsKLSAgICAgICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfZGlzcGF0Y2g7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BhdGNoRW5kcG9pbnRVcmwgPSAoU3RyaW5nKSBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkaXNwYXRjaEVuZHBvaW50VXJsLmVxdWFscyhwcm94eUVuZHBvaW50VXJsKSkKLSAgICAgICAgICAgICAgICAgICAgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5wdXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFksIHByb3h5RW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICByZXR1cm4gKFN0cmluZykgYnAuZ2V0UmVxdWVzdENvbnRleHQoKS5nZXQoQmluZGluZ1Byb3ZpZGVyLkVORFBPSU5UX0FERFJFU1NfUFJPUEVSVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50VXJsKSB7Ci0gICAgICAgICAgICBCaW5kaW5nUHJvdmlkZXIgYnAgPSAoQmluZGluZ1Byb3ZpZGVyKSBfcHJveHk7Ci0gICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotCi0gICAgICAgICAgICBpZiAoX2Rpc3BhdGNoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBicCA9IChCaW5kaW5nUHJvdmlkZXIpIF9kaXNwYXRjaDsKLSAgICAgICAgICAgICAgICBicC5nZXRSZXF1ZXN0Q29udGV4dCgpLnB1dChCaW5kaW5nUHJvdmlkZXIuRU5EUE9JTlRfQUREUkVTU19QUk9QRVJUWSwgZW5kcG9pbnRVcmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlUG9ydFByb3h5KCkgewotICAgICAgICBfZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBpbmdTZXJ2aWNlUG9ydFByb3h5KFVSTCB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIG5ldyBRTmFtZSgiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsICJQaW5nU2VydmljZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGluZ1NlcnZpY2VQb3J0UHJveHkoVVJMIHdzZGxMb2NhdGlvbiwgUU5hbWUgc2VydmljZU5hbWUpIHsKLSAgICAgICAgX2Rlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcih3c2RsTG9jYXRpb24sIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBfZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIF9kZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oUGluZ1N0cmluZ0lucHV0IHBhcmFtZXRlcikgewotICAgICAgICBfZ2V0RGVzY3JpcHRvcigpLmdldFByb3h5KCkucGluZ09wZXJhdGlvbihwYXJhbWV0ZXIpOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvY2xpZW50L3BpbmcvUGluZ1NlcnZpY2VQb3J0VHlwZUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZVBvcnRUeXBlQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGZhMzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9jbGllbnQvcGluZy9QaW5nU2VydmljZVBvcnRUeXBlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50LnBpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZy5QaW5nU3RyaW5nSW5wdXQ7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiUGluZ1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIFBpbmdTZXJ2aWNlUG9ydFR5cGVDbGllbnQgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAicGluZ09wZXJhdGlvbiIpCi0gICAgQE9uZXdheQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwaW5nU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBQaW5nU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlMTJQb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QwYTVkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZTEyUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvOwotCi1pbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlOwotaW1wb3J0IGphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1AamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1NlcnZpY2UxMlBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBzZXJ2aWNlTmFtZSA9ICJFY2hvU2VydmljZTEyIiwgcG9ydE5hbWUgPSAiRWNob1NlcnZpY2UxMlBvcnQiLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0VjaG8xMi53c2RsIikKLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpCi1wdWJsaWMgY2xhc3MgRWNob1NlcnZpY2UxMlBvcnRJbXBsIHsKLQotICAgIHB1YmxpYyBFY2hvU3RyaW5nUmVzcG9uc2UgZWNob09wZXJhdGlvbihFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU0VSVklDRTogU0VJIEVjaG8gU09BUDEyIFNlcnZpY2U6IFJlcXVlc3QgcmVjZWl2ZWQuIik7Ci0gICAgICAgIFN0cmluZyBpbnB1dFN0cmluZyA9ICJGYWlsZWQiOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTT0FQMTIgRWNobyBJbnB1dCBTdHJpbmcgJyIgKyBwYXJhbWV0ZXIuZWNob0lucHV0ICsgIiciKTsKLSAgICAgICAgICAgICAgICBpbnB1dFN0cmluZyA9IHBhcmFtZXRlci5lY2hvSW5wdXQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIHJlc3BvbnNlID0KLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpOwotICAgICAgICByZXNwb25zZS5lY2hvUmVzcG9uc2UgPSAiU09BUDEyPT0+PiIgKyBpbnB1dFN0cmluZzsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZTEyUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZTEyUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5NDBhOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2UxMlBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobzsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJFY2hvU2VydmljZTEyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIpCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQotcHVibGljIGludGVyZmFjZSBFY2hvU2VydmljZTEyUG9ydFR5cGUgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZQotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvT3BlcmF0aW9uKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZVBvcnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2VQb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTdlMjlmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU2VydmljZVBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobzsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5IYW5kbGVyQ2hhaW47Ci0KLQotQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8uRWNob1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIiwgc2VydmljZU5hbWUgPSAiRWNob1NlcnZpY2UiLCBwb3J0TmFtZSA9ICJFY2hvU2VydmljZVBvcnQiLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0VjaG8ud3NkbCIpCi1ASGFuZGxlckNoYWluKGZpbGU9ImxvZ2hhbmRsZXIueG1sIikKLXB1YmxpYyBjbGFzcyBFY2hvU2VydmljZVBvcnRJbXBsIHsKLQotICAgIHB1YmxpYyBFY2hvU3RyaW5nUmVzcG9uc2UgZWNob09wZXJhdGlvbihFY2hvU3RyaW5nSW5wdXQgcGFyYW1ldGVyKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU0VSVklDRTogU0VJIEVjaG8gSkFYLVdTIFNlcnZpY2U6IFJlcXVlc3QgcmVjZWl2ZWQuIik7Ci0gICAgICAgIFN0cmluZyBpbnB1dFN0cmluZyA9ICJGYWlsZWQiOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTRUkgRWNobyBJbnB1dCBTdHJpbmcgJyIgKyBwYXJhbWV0ZXIuZWNob0lucHV0ICsgIiciKTsKLSAgICAgICAgICAgICAgICBpbnB1dFN0cmluZyA9IHBhcmFtZXRlci5lY2hvSW5wdXQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRWNob1N0cmluZ1Jlc3BvbnNlIHJlc3BvbnNlID0KLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0RmFjdG9yeSgpLmNyZWF0ZUVjaG9TdHJpbmdSZXNwb25zZSgpOwotICAgICAgICByZXNwb25zZS5lY2hvUmVzcG9uc2UgPSAiSkFYLVdTPT0+PiIgKyBpbnB1dFN0cmluZzsKLSAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2VQb3J0VHlwZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TZXJ2aWNlUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyZTk2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1NlcnZpY2VQb3J0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG87Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiRWNob1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIikKLUBTT0FQQmluZGluZyhwYXJhbWV0ZXJTdHlsZSA9IFBhcmFtZXRlclN0eWxlLkJBUkUpCi1wdWJsaWMgaW50ZXJmYWNlIEVjaG9TZXJ2aWNlUG9ydFR5cGUgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICogQHJldHVybiByZXR1cm5zIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvLkVjaG9TdHJpbmdSZXNwb25zZQotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gImVjaG9PcGVyYXRpb24iKQotICAgIEBXZWJSZXN1bHQobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBlY2hvT3BlcmF0aW9uKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAiZWNob1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgRWNob1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU3RyaW5nSW5wdXQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9FY2hvU3RyaW5nSW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyMzQyYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1N0cmluZ0lucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobzsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBlY2hvU3RyaW5nSW5wdXQgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2VsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0lucHV0Ij4KLSAqICAgJmx0O2NvbXBsZXhUeXBlPgotICogICAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJlY2hvSW5wdXQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KLSAqICAgICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICAgJmx0Oy9jb21wbGV4VHlwZT4KLSAqICZsdDsvZWxlbWVudD4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgImVjaG9JbnB1dCIKLSAgICAgICAgfSkKLUBYbWxSb290RWxlbWVudChuYW1lID0gImVjaG9TdHJpbmdJbnB1dCIpCi1wdWJsaWMgY2xhc3MgRWNob1N0cmluZ0lucHV0IHsKLQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGVjaG9JbnB1dDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlY2hvSW5wdXQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFY2hvSW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBlY2hvSW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGVjaG9JbnB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFY2hvSW5wdXQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuZWNob0lucHV0ID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vRWNob1N0cmluZ1Jlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjJkZmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL0VjaG9TdHJpbmdSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG87Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOwotCi0KLS8qKgotICogPHA+SmF2YSBjbGFzcyBmb3IgZWNob1N0cmluZ1Jlc3BvbnNlIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gKiA8cC8+Ci0gKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgotICogPHAvPgotICogPHByZT4KLSAqICZsdDtlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gKiAgICZsdDtjb21wbGV4VHlwZT4KLSAqICAgICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgICAmbHQ7c2VxdWVuY2U+Ci0gKiAgICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+Ci0gKiAgICAgICAgICZsdDsvc2VxdWVuY2U+Ci0gKiAgICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAgICZsdDsvY29tcGxleFR5cGU+Ci0gKiAmbHQ7L2VsZW1lbnQ+Ci0gKiA8L3ByZT4KLSAqLwotQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQotQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7Ci0gICAgICAgICJlY2hvUmVzcG9uc2UiCi0gICAgICAgIH0pCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJlY2hvU3RyaW5nUmVzcG9uc2UiKQotcHVibGljIGNsYXNzIEVjaG9TdHJpbmdSZXNwb25zZSB7Ci0KLSAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlY2hvUmVzcG9uc2U7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWNob1Jlc3BvbnNlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBTdHJpbmcgfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWNob1Jlc3BvbnNlKCkgewotICAgICAgICByZXR1cm4gZWNob1Jlc3BvbnNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBlY2hvUmVzcG9uc2UgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RWNob1Jlc3BvbnNlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLmVjaG9SZXNwb25zZSA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL09iamVjdEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzc0ZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvOwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsKLQotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaAotICogSmF2YSBjb250ZW50IGludGVyZmFjZSBhbmQgSmF2YSBlbGVtZW50IGludGVyZmFjZQotICogZ2VuZXJhdGVkIGluIHRoZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuZWNobyBwYWNrYWdlLgotICogPHA+QW4gT2JqZWN0RmFjdG9yeSBhbGxvd3MgeW91IHRvIHByb2dyYW1hdGljYWxseQotICogY29uc3RydWN0IG5ldyBpbnN0YW5jZXMgb2YgdGhlIEphdmEgcmVwcmVzZW50YXRpb24KLSAqIGZvciBYTUwgY29udGVudC4gVGhlIEphdmEgcmVwcmVzZW50YXRpb24gb2YgWE1MCi0gKiBjb250ZW50IGNhbiBjb25zaXN0IG9mIHNjaGVtYSBkZXJpdmVkIGludGVyZmFjZXMKLSAqIGFuZCBjbGFzc2VzIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBvZiBzY2hlbWEKLSAqIHR5cGUgZGVmaW5pdGlvbnMsIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBtb2RlbAotICogZ3JvdXBzLiAgRmFjdG9yeSBtZXRob2RzIGZvciBlYWNoIG9mIHRoZXNlIGFyZQotICogcHJvdmlkZWQgaW4gdGhpcyBjbGFzcy4KLSAqLwotQFhtbFJlZ2lzdHJ5Ci1wdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7Ci0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBPYmplY3RGYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2Ygc2NoZW1hIGRlcml2ZWQgY2xhc3NlcyBmb3IgcGFja2FnZTogb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmVjaG8KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEVjaG9TdHJpbmdSZXNwb25zZSB9Ci0gICAgICovCi0gICAgcHVibGljIEVjaG9TdHJpbmdSZXNwb25zZSBjcmVhdGVFY2hvU3RyaW5nUmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWNob1N0cmluZ1Jlc3BvbnNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBFY2hvU3RyaW5nSW5wdXQgfQotICAgICAqLwotICAgIHB1YmxpYyBFY2hvU3RyaW5nSW5wdXQgY3JlYXRlRWNob1N0cmluZ0lucHV0KCkgewotICAgICAgICByZXR1cm4gbmV3IEVjaG9TdHJpbmdJbnB1dCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL3BhY2thZ2UtaW5mby5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL3BhY2thZ2UtaW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFhM2JhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9wYWNrYWdlLWluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iKSBwYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5lY2hvOwpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9oYW5kbGVyL0xvZ2dpbmdTT0FQSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9oYW5kbGVyL0xvZ2dpbmdTT0FQSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmZlYjM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvaGFuZGxlci9Mb2dnaW5nU09BUEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5oYW5kbGVyOw0KLQ0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLmhhbmRsZXIuTWVzc2FnZUNvbnRleHQ7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXI7DQotaW1wb3J0IGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0Ow0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBMb2dnaW5nU09BUEhhbmRsZXIgaW1wbGVtZW50cyBTT0FQSGFuZGxlcjxTT0FQTWVzc2FnZUNvbnRleHQ+IHsNCi0NCi0gICAgcHJpdmF0ZSBQcmludFN0cmVhbSBvdXQ7DQotDQotICAgIHB1YmxpYyBMb2dnaW5nU09BUEhhbmRsZXIoKSB7DQotICAgICAgICBzZXRMb2dTdHJlYW0oU3lzdGVtLm91dCk7DQotICAgIH0NCi0NCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TG9nU3RyZWFtKFByaW50U3RyZWFtIHBzKSB7DQotICAgICAgICBvdXQgPSBwczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0KE1hcCBjKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dpbmdIYW5kbGVyIDogaW5pdCgpIENhbGxlZC4uLi4iKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU2V0PFFOYW1lPiBnZXRIZWFkZXJzKCkgew0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlTWVzc2FnZShTT0FQTWVzc2FnZUNvbnRleHQgc21jKSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dpbmdIYW5kbGVyIDogaGFuZGxlTWVzc2FnZSBDYWxsZWQuLi4uIik7DQotICAgICAgICBsb2dUb1N5c3RlbU91dChzbWMpOw0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gaGFuZGxlRmF1bHQoU09BUE1lc3NhZ2VDb250ZXh0IHNtYykgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dnaW5nSGFuZGxlciA6IGhhbmRsZUZhdWx0IENhbGxlZC4uLi4iKTsNCi0gICAgICAgIGxvZ1RvU3lzdGVtT3V0KHNtYyk7DQotICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgfQ0KLQ0KLSAgICAvLyBub3RoaW5nIHRvIGNsZWFuIHVwDQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7DQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvZ2dpbmdIYW5kbGVyIDogY2xvc2UoKSBDYWxsZWQuLi4uIik7DQotICAgIH0NCi0NCi0gICAgLy8gbm90aGluZyB0byBjbGVhbiB1cA0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgew0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2dnaW5nSGFuZGxlciA6IGRlc3Ryb3koKSBDYWxsZWQuLi4uIik7DQotICAgIH0NCi0NCi0gICAgLyoNCi0gICAgICogQ2hlY2sgdGhlIE1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkgaW4gdGhlIGNvbnRleHQNCi0gICAgICogdG8gc2VlIGlmIHRoaXMgaXMgYW4gb3V0Z29pbmcgb3IgaW5jb21pbmcgbWVzc2FnZS4NCi0gICAgICogV3JpdGUgYSBicmllZiBtZXNzYWdlIHRvIHRoZSBwcmludCBzdHJlYW0gYW5kDQotICAgICAqIG91dHB1dCB0aGUgbWVzc2FnZS4gVGhlIHdyaXRlVG8oKSBtZXRob2QgY2FuIHRocm93DQotICAgICAqIFNPQVBFeGNlcHRpb24gb3IgSU9FeGNlcHRpb24NCi0gICAgICovDQotICAgIHByb3RlY3RlZCB2b2lkIGxvZ1RvU3lzdGVtT3V0KFNPQVBNZXNzYWdlQ29udGV4dCBzbWMpIHsNCi0gICAgICAgIEJvb2xlYW4gb3V0Ym91bmRQcm9wZXJ0eSA9IChCb29sZWFuKQ0KLSAgICAgICAgICAgICAgICBzbWMuZ2V0KE1lc3NhZ2VDb250ZXh0Lk1FU1NBR0VfT1VUQk9VTkRfUFJPUEVSVFkpOw0KLSAgICAgICAgb3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQotICAgICAgICBpZiAob3V0Ym91bmRQcm9wZXJ0eS5ib29sZWFuVmFsdWUoKSkgew0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJPdXRib3VuZCBtZXNzYWdlOiIpOw0KLSAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBvdXQucHJpbnRsbigiSW5ib3VuZCBtZXNzYWdlOiIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgU09BUE1lc3NhZ2UgbWVzc2FnZSA9IHNtYy5nZXRNZXNzYWdlKCk7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG1lc3NhZ2Uud3JpdGVUbyhvdXQpOw0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7DQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJFeGNlcHRpb24gaW4gaGFuZGxlcjogIiArIGUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgb3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL0ltYWdlRGVwb3QuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9JbWFnZURlcG90LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGQwMWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL0ltYWdlRGVwb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaW1lVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBJbWFnZURlcG90IGNvbXBsZXggdHlwZS4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkltYWdlRGVwb3QiPgotICogICAmbHQ7Y29tcGxleENvbnRlbnQ+Ci0gKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KLSAqICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaW1hZ2VEYXRhIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YmFzZTY0QmluYXJ5Ii8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiSW1hZ2VEZXBvdCIsIG5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiaW1hZ2VEYXRhIgotICAgICAgICB9KQotcHVibGljIGNsYXNzIEltYWdlRGVwb3QgewotCi0gICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQotICAgIEBYbWxNaW1lVHlwZSgibXVsdGlwYXJ0LyoiKQotICAgIHByb3RlY3RlZCBEYXRhSGFuZGxlciBpbWFnZURhdGE7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW1hZ2VEYXRhIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBEYXRhSGFuZGxlciB9Ci0gICAgICovCi0gICAgcHVibGljIERhdGFIYW5kbGVyIGdldEltYWdlRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIGltYWdlRGF0YTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW1hZ2VEYXRhIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCi0gICAgICogICAgICAgICAgICAgIHtAbGluayBEYXRhSGFuZGxlciB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VEYXRhKERhdGFIYW5kbGVyIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuaW1hZ2VEYXRhID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL010b21TYW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0ZDI0Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC54bWwud3MuUmVzcG9uc2VXcmFwcGVyOwotCi0KLUBXZWJTZXJ2aWNlKG5hbWUgPSAiTXRvbVNhbXBsZVNlcnZpY2UiLAotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsCi0gICAgICAgIHdzZGxMb2NhdGlvbiA9ICJXRUItSU5GL3dzZGwvSW1hZ2VEZXBvdC53c2RsIikKLXB1YmxpYyBpbnRlcmZhY2UgTXRvbVNhbXBsZSB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqIEByZXR1cm4gcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5JbWFnZURlcG90Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAic2VuZEltYWdlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAib3V0cHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAic2VuZEltYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uU2VuZEltYWdlIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kSW1hZ2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLlNlbmRJbWFnZVJlc3BvbnNlIikKLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIikKLSAgICAgICAgICAgIEltYWdlRGVwb3QgaW5wdXQpOwotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlMTIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmY2RmNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZTEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlcjsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIk10b21TYW1wbGVTZXJ2aWNlMTIiLAotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIpCi1wdWJsaWMgaW50ZXJmYWNlIE10b21TYW1wbGUxMiB7Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqIEByZXR1cm4gcmV0dXJucyBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbS5JbWFnZURlcG90Ci0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAic2VuZEltYWdlIikKLSAgICBAV2ViUmVzdWx0KG5hbWUgPSAib3V0cHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iKQotICAgIEBSZXF1ZXN0V3JhcHBlcihsb2NhbE5hbWUgPSAic2VuZEltYWdlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCBjbGFzc05hbWUgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b20uU2VuZEltYWdlIikKLSAgICBAUmVzcG9uc2VXcmFwcGVyKGxvY2FsTmFtZSA9ICJzZW5kSW1hZ2VSZXNwb25zZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwgY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLlNlbmRJbWFnZVJlc3BvbnNlIikKLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBzZW5kSW1hZ2UoCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJpbnB1dCIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIikKLSAgICAgICAgICAgIEltYWdlRGVwb3QgaW5wdXQpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZTEyUG9ydEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlMTJQb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNjNWQ3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9NdG9tU2FtcGxlMTJQb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLk10b21TYW1wbGUxMiIsCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIiwKLSAgICAgICAgc2VydmljZU5hbWUgPSAiTXRvbVNhbXBsZVNlcnZpY2UxMiIsCi0gICAgICAgIHBvcnROYW1lID0gIk10b21TYW1wbGVQb3J0IiwKLSAgICAgICAgd3NkbExvY2F0aW9uID0gIldFQi1JTkYvd3NkbC9JbWFnZURlcG90MTIud3NkbCIpCi1AamF2YXgueG1sLndzLkJpbmRpbmdUeXBlKHZhbHVlID0gamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZTEyUG9ydEltcGwgewotCi0gICAgcHVibGljIEltYWdlRGVwb3Qgc2VuZEltYWdlKEltYWdlRGVwb3QgaW5wdXQpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pk1UT00gU09BUCAxLjIgcmVxdWVzdCByZWNlaXZlZCwgdHlwZSA9ICIgKyBpbnB1dC5nZXRJbWFnZURhdGEoKS5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZVBvcnRJbXBsLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vTXRvbVNhbXBsZVBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Njc3MWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL010b21TYW1wbGVQb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbTsKLQotQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKGVuZHBvaW50SW50ZXJmYWNlID0gIm9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tLk10b21TYW1wbGUiLAotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIsCi0gICAgICAgIHNlcnZpY2VOYW1lID0gIk10b21TYW1wbGVTZXJ2aWNlIiwKLSAgICAgICAgcG9ydE5hbWUgPSAiTXRvbVNhbXBsZVBvcnQiLAotICAgICAgICB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL0ltYWdlRGVwb3Qud3NkbCIpCi1AamF2YXgueG1sLndzLkJpbmRpbmdUeXBlKHZhbHVlID0gamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpCi1wdWJsaWMgY2xhc3MgTXRvbVNhbXBsZVBvcnRJbXBsIHsKLQotICAgIHB1YmxpYyBJbWFnZURlcG90IHNlbmRJbWFnZShJbWFnZURlcG90IGlucHV0KSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5NVE9NIFNPQVAgMS4xIHJlcXVlc3QgcmVjZWl2ZWQsIHR5cGUgPSAiICsgaW5wdXQuZ2V0SW1hZ2VEYXRhKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL09iamVjdEZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9PYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzk0YmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL09iamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotCi0KLS8qKgotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5tdG9tIHBhY2thZ2UuCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5Ci0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbgotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwKLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcwotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1AWG1sUmVnaXN0cnkKLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMubXRvbQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2VuZEltYWdlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VuZEltYWdlIGNyZWF0ZVNlbmRJbWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZW5kSW1hZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlbmRJbWFnZVJlc3BvbnNlIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgU2VuZEltYWdlUmVzcG9uc2UgY3JlYXRlU2VuZEltYWdlUmVzcG9uc2UoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VuZEltYWdlUmVzcG9uc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEltYWdlRGVwb3QgfQotICAgICAqLwotICAgIHB1YmxpYyBJbWFnZURlcG90IGNyZWF0ZUltYWdlRGVwb3QoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW1hZ2VEZXBvdCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL1NlbmRJbWFnZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL1NlbmRJbWFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODg5M2I0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9TZW5kSW1hZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGU+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpbnB1dCIgdHlwZT0ie2h0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS99SW1hZ2VEZXBvdCIgbWluT2NjdXJzPSIwIi8+Ci0gKiAgICAgICAmbHQ7L3NlcXVlbmNlPgotICogICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICZsdDsvY29tcGxleENvbnRlbnQ+Ci0gKiAmbHQ7L2NvbXBsZXhUeXBlPgotICogPC9wcmU+Ci0gKi8KLUBYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKLUBYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0gewotICAgICAgICAiaW5wdXQiCi0gICAgICAgIH0pCi1AWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJzZW5kSW1hZ2UiKQotcHVibGljIGNsYXNzIFNlbmRJbWFnZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXBvdCBpbnB1dDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCi0gICAgICogICAgICAgICB7QGxpbmsgSW1hZ2VEZXBvdCB9Ci0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVwb3QgZ2V0SW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYWxsb3dlZCBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rIEltYWdlRGVwb3QgfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElucHV0KEltYWdlRGVwb3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5pbnB1dCA9IHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tL1NlbmRJbWFnZVJlc3BvbnNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vU2VuZEltYWdlUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjODNiZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vU2VuZEltYWdlUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgotICogPHAvPgotICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KLSAqIDxwLz4KLSAqIDxwcmU+Ci0gKiAmbHQ7Y29tcGxleFR5cGU+Ci0gKiAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgotICogICAgICAgJmx0O3NlcXVlbmNlPgotICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJvdXRwdXQiIHR5cGU9IntodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vfUltYWdlRGVwb3QiIG1pbk9jY3Vycz0iMCIvPgotICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgotICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgotICogJmx0Oy9jb21wbGV4VHlwZT4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgIm91dHB1dCIKLSAgICAgICAgfSkKLUBYbWxSb290RWxlbWVudChuYW1lID0gInNlbmRJbWFnZVJlc3BvbnNlIikKLXB1YmxpYyBjbGFzcyBTZW5kSW1hZ2VSZXNwb25zZSB7Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2VEZXBvdCBvdXRwdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKLSAgICAgKiAgICAgICAgIHtAbGluayBJbWFnZURlcG90IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2VEZXBvdCBnZXRPdXRwdXQoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG91dHB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgSW1hZ2VEZXBvdCB9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KEltYWdlRGVwb3QgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5vdXRwdXQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9wYWNrYWdlLWluZm8uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1MTUzMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1AamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWEobmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iLCBlbGVtZW50Rm9ybURlZmF1bHQgPSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zRm9ybS5RVUFMSUZJRUQpIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLm10b207CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvT2JqZWN0RmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL09iamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyMjRkOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmc7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OwotCi0KLS8qKgotICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoCi0gKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlCi0gKiBnZW5lcmF0ZWQgaW4gdGhlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nIHBhY2thZ2UuCi0gKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5Ci0gKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbgotICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwKLSAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcwotICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYQotICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsCi0gKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlCi0gKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgotICovCi1AWG1sUmVnaXN0cnkKLXB1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZwotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGluZ1N0cmluZ0lucHV0IH0KLSAgICAgKi8KLSAgICBwdWJsaWMgUGluZ1N0cmluZ0lucHV0IGNyZWF0ZVBpbmdTdHJpbmdJbnB1dCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQaW5nU3RyaW5nSW5wdXQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZTEyUG9ydEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZTEyUG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4YzA3Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1NlcnZpY2UxMlBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLWltcG9ydCBqYXZheC54bWwud3Muc29hcC5TT0FQQmluZGluZzsKLQotCi1AamF2YXguandzLldlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuUGluZ1NlcnZpY2UxMlBvcnRUeXBlIiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCBzZXJ2aWNlTmFtZSA9ICJQaW5nU2VydmljZTEyIiwgcG9ydE5hbWUgPSAiUGluZ1NlcnZpY2UxMlBvcnQiLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL1BpbmcxMi53c2RsIikKLUBCaW5kaW5nVHlwZShTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpCi1wdWJsaWMgY2xhc3MgUGluZ1NlcnZpY2UxMlBvcnRJbXBsIHsKLQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oUGluZ1N0cmluZ0lucHV0IHBhcmFtZXRlcikgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFNFUlZJQ0U6IFNFSSBQaW5nIFNPQVAxMiBTZXJ2aWNlOiBSZXF1ZXN0IHJlY2VpdmVkLiIpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTT0FQMTIgUGluZyBJbnB1dCBTdHJpbmcgJyIgKyBwYXJhbWV0ZXIucGluZ0lucHV0ICsgIiciKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZTEyUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZTEyUG9ydFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5NmVlMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1NlcnZpY2UxMlBvcnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZzsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci0KLQotQFdlYlNlcnZpY2UobmFtZSA9ICJQaW5nU2VydmljZTEyUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIpCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQotcHVibGljIGludGVyZmFjZSBQaW5nU2VydmljZTEyUG9ydFR5cGUgewotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCi0gICAgICovCi0gICAgQFdlYk1ldGhvZChhY3Rpb24gPSAicGluZ09wZXJhdGlvbiIpCi0gICAgQE9uZXdheQotICAgIHB1YmxpYyB2b2lkIHBpbmdPcGVyYXRpb24oCi0gICAgICAgICAgICBAV2ViUGFyYW0obmFtZSA9ICJwaW5nU3RyaW5nSW5wdXQiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIsIHBhcnROYW1lID0gInBhcmFtZXRlciIpCi0gICAgICAgICAgICBQaW5nU3RyaW5nSW5wdXQgcGFyYW1ldGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlUG9ydEltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZVBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTE2ZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlUG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLQotQFdlYlNlcnZpY2UoZW5kcG9pbnRJbnRlcmZhY2UgPSAib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmcuUGluZ1NlcnZpY2VQb3J0VHlwZSIsIHRhcmdldE5hbWVzcGFjZSA9ICJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIiwgc2VydmljZU5hbWUgPSAiUGluZ1NlcnZpY2UiLCBwb3J0TmFtZSA9ICJQaW5nU2VydmljZVBvcnQiLCB3c2RsTG9jYXRpb24gPSAiV0VCLUlORi93c2RsL1Bpbmcud3NkbCIpCi1wdWJsaWMgY2xhc3MgUGluZ1NlcnZpY2VQb3J0SW1wbCB7Ci0KLSAgICBwdWJsaWMgdm9pZCBwaW5nT3BlcmF0aW9uKFBpbmdTdHJpbmdJbnB1dCBwYXJhbWV0ZXIpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWSUNFOiBTRUkgUGluZyBKQVgtV1MgU2VydmljZTogUmVxdWVzdCByZWNlaXZlZC4iKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU0VSVklDRTogU0VJIFBpbmcgSW5wdXQgU3RyaW5nICciICsgcGFyYW1ldGVyLnBpbmdJbnB1dCArICInIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlUG9ydFR5cGUuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU2VydmljZVBvcnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNGU5MTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL1BpbmdTZXJ2aWNlUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5waW5nOwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLQotCi1AV2ViU2VydmljZShuYW1lID0gIlBpbmdTZXJ2aWNlUG9ydFR5cGUiLCB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIpCi1AU09BUEJpbmRpbmcocGFyYW1ldGVyU3R5bGUgPSBQYXJhbWV0ZXJTdHlsZS5CQVJFKQotcHVibGljIGludGVyZmFjZSBQaW5nU2VydmljZVBvcnRUeXBlIHsKLQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHBhcmFtZXRlcgotICAgICAqLwotICAgIEBXZWJNZXRob2QoYWN0aW9uID0gInBpbmdPcGVyYXRpb24iKQotICAgIEBPbmV3YXkKLSAgICBwdWJsaWMgdm9pZCBwaW5nT3BlcmF0aW9uKAotICAgICAgICAgICAgQFdlYlBhcmFtKG5hbWUgPSAicGluZ1N0cmluZ0lucHV0IiwgdGFyZ2V0TmFtZXNwYWNlID0gImh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iLCBwYXJ0TmFtZSA9ICJwYXJhbWV0ZXIiKQotICAgICAgICAgICAgUGluZ1N0cmluZ0lucHV0IHBhcmFtZXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU3RyaW5nSW5wdXQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy9QaW5nU3RyaW5nSW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmMDM4ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvUGluZ1N0cmluZ0lucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMucGluZzsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7Ci0KLQotLyoqCi0gKiA8cD5KYXZhIGNsYXNzIGZvciBwaW5nU3RyaW5nSW5wdXQgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAqIDxwLz4KLSAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCi0gKiA8cC8+Ci0gKiA8cHJlPgotICogJmx0O2VsZW1lbnQgbmFtZT0icGluZ1N0cmluZ0lucHV0Ij4KLSAqICAgJmx0O2NvbXBsZXhUeXBlPgotICogICAgICZsdDtjb21wbGV4Q29udGVudD4KLSAqICAgICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+Ci0gKiAgICAgICAgICZsdDtzZXF1ZW5jZT4KLSAqICAgICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJwaW5nSW5wdXQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KLSAqICAgICAgICAgJmx0Oy9zZXF1ZW5jZT4KLSAqICAgICAgICZsdDsvcmVzdHJpY3Rpb24+Ci0gKiAgICAgJmx0Oy9jb21wbGV4Q29udGVudD4KLSAqICAgJmx0Oy9jb21wbGV4VHlwZT4KLSAqICZsdDsvZWxlbWVudD4KLSAqIDwvcHJlPgotICovCi1AWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCi1AWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKLSAgICAgICAgInBpbmdJbnB1dCIKLSAgICAgICAgfSkKLUBYbWxSb290RWxlbWVudChuYW1lID0gInBpbmdTdHJpbmdJbnB1dCIpCi1wdWJsaWMgY2xhc3MgUGluZ1N0cmluZ0lucHV0IHsKLQotICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBpbmdJbnB1dDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwaW5nSW5wdXQgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcwotICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQaW5nSW5wdXQoKSB7Ci0gICAgICAgIHJldHVybiBwaW5nSW5wdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBpbmdJbnB1dCBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcwotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgU3RyaW5nIH0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQaW5nSW5wdXQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHRoaXMucGluZ0lucHV0ID0gdmFsdWU7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvcGFja2FnZS1pbmZvLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvcGFja2FnZS1pbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTk4YjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nL3BhY2thZ2UtaW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLUBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIpIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnBpbmc7CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3NlcnZsZXQvRWNob1BpbmdTYW1wbGVTZXJ2bGV0LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3NlcnZsZXQvRWNob1BpbmdTYW1wbGVTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWZhNjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy9tYWluL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9zZXJ2bGV0L0VjaG9QaW5nU2FtcGxlU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuamF4d3Muc2FtcGxlcy5zZXJ2bGV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLmNsaWVudC5TYW1wbGVDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5DbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLm1ldGFkYXRhLnJlZ2lzdHJ5Lk1ldGFkYXRhRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5GaWxlU3lzdGVtQ29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFY2hvUGluZ1NhbXBsZVNlcnZsZXQgbWFpbiBlbnRyeSBwb2ludCBmb3IgSlNQIHNlcnZsZXQKLSAqLwotcHVibGljIGNsYXNzIEVjaG9QaW5nU2FtcGxlU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IGltcGxlbWVudHMgU2VydmxldCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRU9VVCA9IDI0MDsgLy8gQXN5bmMgdGltZW91dAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDEwMzkzNjIxMDYxMjM0OTM3OTlMOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0JBU0UgPSAiL2pheHdzLXNhbXBsZXMvc2VydmljZXMvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElOR19DT05URVhUID0gQ09OVEVYVF9CQVNFICsgIlBpbmdTZXJ2aWNlLlBpbmdTZXJ2aWNlUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDSE9fQ09OVEVYVCA9IENPTlRFWFRfQkFTRSArICJFY2hvU2VydmljZS5FY2hvU2VydmljZVBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5HX0NPTlRFWFQxMiA9IENPTlRFWFRfQkFTRSArICJQaW5nU2VydmljZTEyLlBpbmdTZXJ2aWNlMTJQb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNIT19DT05URVhUMTIgPSBDT05URVhUX0JBU0UgKyAiRWNob1NlcnZpY2UxMi5FY2hvU2VydmljZTEyUG9ydCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX0pTUF9MT0NBVElPTiA9ICIvV0VCLUlORi9qc3AvZGVtb0VjaG9QaW5nLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfUkVTUE9OU0VfR09PRCA9ICJNZXNzYWdlIGRlbGl2ZXJlZCBzdWNjZXNzZnVsbHkuIFBsZWFzZSBjaGVjayBzZXJ2ZXIgbG9ncyB0byBjb25maXJtIG1lc3NhZ2UgZGVsaXZlcnkuIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElOR19SRVNQT05TRV9CQUQgPSAiRVJST1I6IEZhaWx1cmUgaW4gY2xpZW50IGJlZm9yZSBtZXNzYWdlIGRlbGl2ZXJ5LiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpU3RyaW5nID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc29hcFN0cmluZyA9ICIiOwotICAgIHByaXZhdGUgaW50IGNvdW50ID0gMTsKLSAgICBwcml2YXRlIENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0gICAgcHVibGljIEVjaG9QaW5nU2FtcGxlU2VydmxldCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCi0gICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBwcm9jZXNzUmVxdWVzdChyZXEsIHJlc3ApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApCi0gICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBwcm9jZXNzUmVxdWVzdChyZXEsIHJlc3ApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHByb2Nlc3NSZXF1ZXN0IFJlYWRzIHRoZSBwb3N0ZWQgcGFyYW1ldGVycyBhbmQgY2FsbHMgdGhlIHNlcnZpY2UKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIGlmKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCgiL1dFQi1JTkYvYXhpczIueG1sIik7Ci0gICAgICAgICAgICBGaWxlU3lzdGVtQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBGaWxlU3lzdGVtQ29uZmlndXJhdG9yKG51bGwsIHBhdGgpOwotICAgICAgICAgICAgZmFjdG9yeSA9IG5ldyBDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeShjb25maWd1cmF0b3IpOwotICAgICAgICAgICAgTWV0YWRhdGFGYWN0b3J5UmVnaXN0cnkuc2V0RmFjdG9yeShDbGllbnRDb25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcywgZmFjdG9yeSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXJ2bGV0Q29udGV4dCBjb250ZXh0ID0gZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIG1zZ1N0cmluZyA9IHJlcS5nZXRQYXJhbWV0ZXIoIm1zZ3N0cmluZyIpOwotICAgICAgICBTdHJpbmcgc3ZjID0gcmVxLmdldFBhcmFtZXRlcigibXNnc2VydmljZSIpOwotICAgICAgICBTdHJpbmcgY250ID0gcmVxLmdldFBhcmFtZXRlcigibXNnY291bnQiKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJQaW5nU2VsZWN0ZWQiLCAiICIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJFY2hvU2VsZWN0ZWQiLCAiICIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJBc3luY1NlbGVjdGVkIiwgIiAiKTsKLSAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiQXN5bmNXaXJlU2VsZWN0ZWQiLCAiICIpOwotCi0gICAgICAgIGlmIChudWxsID09IG1zZ1N0cmluZyB8fCAiIiA9PSBtc2dTdHJpbmcpIHsKLSAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgdG8gdXNlCi0gICAgICAgICAgICB1cmlTdHJpbmcgPSAiaHR0cDovL2xvY2FsaG9zdDoiICsgcmVxLmdldFNlcnZlclBvcnQoKTsKLSAgICAgICAgICAgIHNvYXBTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgIGZvcm1hdE91dHB1dChyZXEsIHVyaVN0cmluZywgIiIsICIiKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInVyaWRlZiIsIHVyaVN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJzb2FwZGVmIiwgc29hcFN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUyIsICIgIik7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUiIsICIgIik7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtc2djb3VudCIsIG5ldyBJbnRlZ2VyKGNvdW50KS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIlBpbmdTZWxlY3RlZCIsICJzZWxlY3RlZCIpOwotICAgICAgICAgICAgY29udGV4dC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihJTkRFWF9KU1BfTE9DQVRJT04pLmZvcndhcmQocmVxLCByZXNwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgcGFybXMgZnJvbSB0aGUgcmVxdWVzdAotICAgICAgICAgICAgdXJpU3RyaW5nID0gcmVxLmdldFBhcmFtZXRlcigidXJpIik7Ci0gICAgICAgICAgICBzb2FwU3RyaW5nID0gcmVxLmdldFBhcmFtZXRlcigic29hcDEyIik7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBzb2FwU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgc29hcFN0cmluZyA9ICJjaGVja2VkIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc29hcFN0cmluZyA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gR2V0IGNvdW50Ci0gICAgICAgICAgICBpZiAoKG51bGwgIT0gY250KSAmJiAoIiIgIT0gY250KSkgewotICAgICAgICAgICAgICAgIGNvdW50ID0gbmV3IEludGVnZXIoY250KS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyB0byBiZSBvbiB0aGUgcmVmcmVzaGVkIHBhZ2UJCQkKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1zZ3N0cmluZyIsIHJlcS5nZXRBdHRyaWJ1dGUoIm1zZ3N0cmluZyIpKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInVyaWRlZiIsIHVyaVN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJzb2FwZGVmIiwgc29hcFN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtc2djb3VudCIsIG5ldyBJbnRlZ2VyKGNvdW50KS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoc3ZjICsgIlNlbGVjdGVkIiwgInNlbGVjdGVkIik7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBjYWxsIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICBTYW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNhbXBsZUNsaWVudCgpOwotICAgICAgICAgICAgY2xpZW50LnNldENsaWVudENvbmZpZ3VyYXRpb25GYWN0b3J5KGZhY3RvcnkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PiBTRVJWTEVUOiBSZXF1ZXN0IGNvdW50ID0gIiArIGNvdW50KTsKLQotICAgICAgICAgICAgLy8gTG9vcCBvbiB0aGUgY291bnQKLSAgICAgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4gU0VSVkxFVDogUmVxdWVzdCBpbmRleDogIiArIChpbmRleCArIDEpKTsKLSAgICAgICAgICAgICAgICBpZiAoMCA9PSBzb2FwU3RyaW5nLmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdmMuZXF1YWxzSWdub3JlQ2FzZSgoIkFzeW5jIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2xpZW50LmJ1aWxkQXN5bmModXJpU3RyaW5nICsgRUNIT19DT05URVhULCBnZXRXU0RMVVJMKCIvV0VCLUlORi93c2RsL0VjaG8ud3NkbCIpLCBtc2dTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVPVVQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdmMuZXF1YWxzSWdub3JlQ2FzZSgoIkFzeW5jV2lyZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNsaWVudC5idWlsZEFzeW5jKHVyaVN0cmluZyArIEVDSE9fQ09OVEVYVCwgZ2V0V1NETFVSTCgiL1dFQi1JTkYvd3NkbC9FY2hvLndzZGwiKSwgbXNnU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FT1VULCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdmMuZXF1YWxzSWdub3JlQ2FzZSgiRWNobyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2xpZW50LmJ1aWxkRWNobyh1cmlTdHJpbmcgKyBFQ0hPX0NPTlRFWFQsIGdldFdTRExVUkwoIi9XRUItSU5GL3dzZGwvRWNoby53c2RsIiksIG1zZ1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50LmJ1aWxkUGluZyh1cmlTdHJpbmcgKyBQSU5HX0NPTlRFWFQsIGdldFdTRExVUkwoIi9XRUItSU5GL3dzZGwvUGluZy53c2RsIiksIG1zZ1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gUElOR19SRVNQT05TRV9HT09EOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gUElOR19SRVNQT05TRV9CQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgIC8vIFNPQVAxLjIKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdmMuZXF1YWxzSWdub3JlQ2FzZSgoIkFzeW5jIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2xpZW50LmJ1aWxkQXN5bmMxMih1cmlTdHJpbmcgKyBFQ0hPX0NPTlRFWFQxMiwgZ2V0V1NETFVSTCgiL1dFQi1JTkYvd3NkbC9FY2hvMTIud3NkbCIpLCBtc2dTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVPVVQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdmMuZXF1YWxzSWdub3JlQ2FzZSgoIkFzeW5jV2lyZSIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGNsaWVudC5idWlsZEFzeW5jMTIodXJpU3RyaW5nICsgRUNIT19DT05URVhUMTIsIGdldFdTRExVUkwoIi9XRUItSU5GL3dzZGwvRWNobzEyLndzZGwiKSwgbXNnU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FT1VULCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdmMuZXF1YWxzSWdub3JlQ2FzZSgiRWNobyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gY2xpZW50LmJ1aWxkRWNobzEyKHVyaVN0cmluZyArIEVDSE9fQ09OVEVYVDEyLCBnZXRXU0RMVVJMKCIvV0VCLUlORi93c2RsL0VjaG8xMi53c2RsIiksIG1zZ1N0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50LmJ1aWxkUGluZzEyKHVyaVN0cmluZyArIFBJTkdfQ09OVEVYVDEyLCBnZXRXU0RMVVJMKCIvV0VCLUlORi93c2RsL1BpbmcxMi53c2RsIiksIG1zZ1N0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gUElOR19SRVNQT05TRV9HT09EOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gUElOR19SRVNQT05TRV9CQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJcbiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZvcm1hdCB0aGUgb3V0cHV0IGFuZCByZWZyZXNoIHRoZSBwYW5lbAotICAgICAgICAgICAgZm9ybWF0T3V0cHV0KHJlcSwgdXJpU3RyaW5nLCBtc2dTdHJpbmcsIHJlc3VsdCk7Ci0gICAgICAgICAgICBjb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKElOREVYX0pTUF9MT0NBVElPTikuZm9yd2FyZChyZXEsIHJlc3ApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZm9ybWF0T3V0cHV0IEZvcm1hdCB0aGUgdHJhbnNhY3Rpb24gZGF0YSBpbnRvIHRoZSBIVE1MIHRleHQgYXJlYQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBmb3JtYXRPdXRwdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgU3RyaW5nIGVuZHBvaW50VVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZWNlaXZlZCkgewotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJtZXNzYWdlUyIsICJcbiIgKyAiQ29ubmVjdGluZyB0by4uLiAiICsgZW5kcG9pbnRVUkwKLSAgICAgICAgICAgICAgICArICJcblxuIiArICJNZXNzYWdlIFJlcXVlc3Q6IFxuIiArIHJlcXVlc3QgKyAiXG4iKTsKLSAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgibWVzc2FnZVIiLCAiXG4iICsgIk1lc3NhZ2UgUmVzcG9uc2U6IFxuIiArIHJlY2VpdmVkCi0gICAgICAgICAgICAgICAgKyAiXG4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFVSTCBnZXRXU0RMVVJMKFN0cmluZyBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKGZpbGUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL21haW4vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3NlcnZsZXQvTVRPTVNhbXBsZVNlcnZsZXQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvc2VydmxldC9NVE9NU2FtcGxlU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE2Nzc5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvbWFpbi9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvc2VydmxldC9NVE9NU2FtcGxlU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnNlcnZsZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuY2xpZW50Lm10b20uU2FtcGxlTVRPTVRlc3RzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBTZXJ2bGV0IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBTZXJ2bGV0OiBNVE9NU2FtcGxlU2VydmxldAotICogPHAvPgotICogd2ViLnNlcnZsZXQKLSAqIG5hbWU9Ik1UT01TYW1wbGVTZXJ2bGV0IgotICogZGlzcGxheS1uYW1lPSJNVE9NU2FtcGxlU2VydmxldCIKLSAqIGRlc2NyaXB0aW9uPSJQcm92aWRlcyBhIHNlcnZsZXQgaW50ZXJmYWNlIHRvIHRoZSBNVE9NIFNlcnZpY2UgU2FtcGxlIgotICogPHAvPgotICogd2ViLnNlcnZsZXQtbWFwcGluZwotICogdXJsLXBhdHRlcm49Ii9NVE9NU2FtcGxlU2VydmxldCIKLSAqLwotcHVibGljIGNsYXNzIE1UT01TYW1wbGVTZXJ2bGV0IGV4dGVuZHMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0IGltcGxlbWVudHMgamF2YXguc2VydmxldC5TZXJ2bGV0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxMDM5MzYyMTA2MTIzNDkzNzk5TDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfSlNQX0xPQ0FUSU9OID0gIi9XRUItSU5GL2pzcC9kZW1vTVRPTS5qc3AiOwotICAgIHByaXZhdGUgU3RyaW5nIHVyaVN0cmluZyA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIHNvYXBTdHJpbmcgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZSA9ICIiOwotCi0gICAgcHVibGljIE1UT01TYW1wbGVTZXJ2bGV0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2Nlc3NSZXF1ZXN0KHJlcSwgcmVzcCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2Nlc3NSZXF1ZXN0KHJlcSwgcmVzcCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJvY2Vzc1JlcXVlc3QgUmVhZHMgdGhlIHBvc3RlZCBwYXJhbWV0ZXJzIGFuZCBjYWxscyB0aGUgc2VydmljZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcSAgLSBIdHRwU2VydmxldFJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcCAtIEh0dHBTZXJ2bGV0UmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOwotCi0gICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgU3RyaW5nIHN2YyA9IG51bGw7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIkRpc3BhdGNoU2VsZWN0ZWQiLCAiICIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJQcm94eVNlbGVjdGVkIiwgIiAiKTsKLQotICAgICAgICAvLyBTZWUgaWYgdGhlIGZvcm0gd2FzIHBvc3RlZCAKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVxLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5TRVJWTEVUOiBDb250ZW50IHR5cGUgaXM6ICIgKyBjb250ZW50VHlwZSk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHdlIGhhdmUgbXVsdGlwYXJ0L2Zvcm0tZGF0YQotICAgICAgICBpZiAoKGNvbnRlbnRUeXBlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgKGNvbnRlbnRUeXBlLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKSA+PSAwKSkgewotCi0gICAgICAgICAgICAvLyBSZWFkIHRoZSBwb3N0IGRhdGEKLSAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0ocmVxCi0gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIGludCBmb3JtRGF0YUxlbmd0aCA9IHJlcS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIGJ5dGUgZGF0YUJ5dGVzW10gPSBuZXcgYnl0ZVtmb3JtRGF0YUxlbmd0aF07Ci0gICAgICAgICAgICBpbnQgYnl0ZVJlYWQgPSAwOwotICAgICAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0gMDsKLSAgICAgICAgICAgIHdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IGZvcm1EYXRhTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZVJlYWQgPSBpbi5yZWFkKGRhdGFCeXRlcywgdG90YWxCeXRlc1JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgdG90YWxCeXRlc1JlYWQgKz0gYnl0ZVJlYWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoYW5nZSBpdCB0byBhIHN0cmluZwotICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBuZXcgU3RyaW5nKGRhdGFCeXRlcyk7Ci0KLSAgICAgICAgICAgIC8vIFBhcnNlIG91dCB0aGUgcGFybXMKLSAgICAgICAgICAgIHN2YyA9IGdldHBhcm0oIm1zZ3NlcnZpY2UiLCBkYXRhKTsKLSAgICAgICAgICAgIHVyaVN0cmluZyA9IGdldHBhcm0oInVyaWRlZiIsIGRhdGEpOwotICAgICAgICAgICAgc29hcFN0cmluZyA9IGdldHBhcm0oInNvYXBkZWYiLCBkYXRhKTsKLQotICAgICAgICAgICAgLy8gRmlsZW5hbWUgaXMgcGFydCBvZiB0aGUgZmlsZSBkYXRhIGJsb2NrLgotICAgICAgICAgICAgZmlsZU5hbWUgPSBkYXRhLnN1YnN0cmluZyhkYXRhLmluZGV4T2YoImZpbGVuYW1lPVwiIikgKyAxMCk7Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5pbmRleE9mKCJcbiIpKTsKLQotICAgICAgICAgICAgLy8gU3RyaXAgcGF0aCBpbmZvIG91dCwgd2luZG93cyBvciB1bml4Ci0gICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiKSArIDEsIGZpbGVOYW1lLmluZGV4T2YoIlwiIikpOwotICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpOwotCi0gICAgICAgICAgICAvLyBOb3cgbG9vayBmb3IgdGhlIGZpbGUgZGF0YQotICAgICAgICAgICAgaW50IGxhc3RJbmRleCA9IGNvbnRlbnRUeXBlLmxhc3RJbmRleE9mKCI9Iik7Ci0gICAgICAgICAgICBTdHJpbmcgYm91bmRhcnkgPSBjb250ZW50VHlwZS5zdWJzdHJpbmcobGFzdEluZGV4ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUubGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBpbnQgcG9zOwotICAgICAgICAgICAgcG9zID0gZGF0YS5pbmRleE9mKCJmaWxlbmFtZT1cIiIpOwotICAgICAgICAgICAgcG9zID0gZGF0YS5pbmRleE9mKCJcbiIsIHBvcykgKyAxOwotICAgICAgICAgICAgcG9zID0gZGF0YS5pbmRleE9mKCJcbiIsIHBvcykgKyAxOwotICAgICAgICAgICAgcG9zID0gZGF0YS5pbmRleE9mKCJcbiIsIHBvcykgKyAxOwotCi0gICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGJvdW5kYXJpZXMKLSAgICAgICAgICAgIGludCBib3VuZGFyeUxvY2F0aW9uID0gZGF0YS5pbmRleE9mKGJvdW5kYXJ5LCBwb3MpIC0gNDsKLSAgICAgICAgICAgIGludCBzdGFydFBvcyA9ICgoZGF0YS5zdWJzdHJpbmcoMCwgcG9zKSkuZ2V0Qnl0ZXMoKSkubGVuZ3RoOwotICAgICAgICAgICAgaW50IGVuZFBvcyA9ICgoZGF0YS5zdWJzdHJpbmcoMCwgYm91bmRhcnlMb2NhdGlvbikpLmdldEJ5dGVzKCkpLmxlbmd0aDsKLQotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGZpbGUgbG9jYWxseQotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotICAgICAgICAgICAgZmlsZU91dC53cml0ZShkYXRhQnl0ZXMsIHN0YXJ0UG9zLCAoZW5kUG9zIC0gc3RhcnRQb3MpKTsKLSAgICAgICAgICAgIGZpbGVPdXQuZmx1c2goKTsKLSAgICAgICAgICAgIGZpbGVPdXQuY2xvc2UoKTsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+PlNFUlZMRVQ6IEZpbGUgc2F2ZWQgYXMgIiArIGZpbGVOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE51bGwgbWVhbnMgdGhpcyBpcyBub3QgYSBwb3N0LCBzbyB3ZSBzZXQgdGhlIGRlZmF1bHRzCi0gICAgICAgIGlmIChudWxsID09IHN2YyB8fCAiIiA9PSBzdmMpIHsKLSAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgdG8gdXNlCi0gICAgICAgICAgICB1cmlTdHJpbmcgPSAiaHR0cDovL2xvY2FsaG9zdDoiICsgcmVxLmdldFNlcnZlclBvcnQoKTsKLSAgICAgICAgICAgIHNvYXBTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInVyaWRlZiIsIHVyaVN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJzb2FwZGVmIiwgc29hcFN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJmaWxlZGVmIiwgIiIpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgibWVzc2FnZVMiLCAiICIpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgibWVzc2FnZVIiLCAiICIpOwotICAgICAgICAgICAgY29udGV4dC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihJTkRFWF9KU1BfTE9DQVRJT04pLmZvcndhcmQocmVxLCByZXNwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwb3N0LCB3b3JrIHdpdGggdGhlIGRhdGEKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLQotICAgICAgICAgICAgLy8gU2V0dXAgc29hcCByZXR1cm4KLSAgICAgICAgICAgIHNvYXBTdHJpbmcgPSAobnVsbCAhPSBzb2FwU3RyaW5nKSA/ICJjaGVja2VkIiA6ICIiOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIHZhbHVlcyB0byBiZSBvbiB0aGUgcmVmcmVzaGVkIHBhZ2UJCQkKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInVyaWRlZiIsIHVyaVN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJzb2FwZGVmIiwgc29hcFN0cmluZyk7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJmaWxlZGVmIiwgZmlsZU5hbWUpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZShzdmMgKyAiU2VsZWN0ZWQiLCAic2VsZWN0ZWQiKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSB0ZXN0cyBjbGllbnQKLSAgICAgICAgICAgIFNhbXBsZU1UT01UZXN0cyBjbGllbnQgPSBuZXcgU2FtcGxlTVRPTVRlc3RzKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj4+U0VSVkxFVDogRmlsZW5hbWUgPSAiICsgZmlsZU5hbWUpOwotCi0gICAgICAgICAgICAvLyBDYWxsIHRoZSB0ZXN0IGNsYXNzCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNsaWVudC5zZXRPcHRpb25zKHVyaVN0cmluZywgKDAgIT0gc29hcFN0cmluZy5sZW5ndGgoKSksIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc3ZjLmVxdWFscygiRGlzcGF0Y2giKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjbGllbnQudGVzdE10b21XaXRoRGlzcGF0Y2gocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjbGllbnQudGVzdE10b21XaXRoUHJveHkocmVzdWx0LCBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXNvdXJjZSgiL1dFQi1JTkYvd3NkbC9JbWFnZURlcG90MTIud3NkbCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KCJFUlJPUjogU0VSVkxFVCBFWENFUFRJT04gIiArIGUpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj5TRVJWTEVUOiBFWENFUFRJT04gIiArIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGb3JtYXQgdGhlIG91dHB1dCBhbmQgcmVmcmVzaCB0aGUgcGFuZWwKLSAgICAgICAgICAgIGZvcm1hdE91dHB1dChyZXEsIHVyaVN0cmluZywgIlNlbmRpbmcgJyIgKyBmaWxlTmFtZSArICInIHZpYSBNVE9NICIgKyAoKDAgIT0gc29hcFN0cmluZy5sZW5ndGgoKSkgPyAiU09BUCAxLjIiIDogIlNPQVAgMS4xIiksIHJlc3VsdCk7Ci0gICAgICAgICAgICBjb250ZXh0LmdldFJlcXVlc3REaXNwYXRjaGVyKElOREVYX0pTUF9MT0NBVElPTikuZm9yd2FyZChyZXEsIHJlc3ApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0cGFybQotICAgICAqIDxwLz4KLSAgICAgKiBwYXJzZXMgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUgbXVsdGlwYXJ0LWZvcm0gZGF0YQotICAgICAqCi0gICAgICogQHBhcmFtIHBhcm0gLSBTdHJpbmcgdG8gc2VhcmNoIGZvcgotICAgICAqIEBwYXJhbSBkYXRhIC0gU3RyaW5nIHdpdGggZm9ybSBkYXRhCi0gICAgICogQHJldHVybiAtIFN0cmluZyAtIHRoZSBwYXJtIHZhbHVlIG9yIG51bGwgaWYgbm90IGZvdW5kCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0cGFybShTdHJpbmcgcGFybSwgU3RyaW5nIGRhdGEpIHsKLSAgICAgICAgU3RyaW5nIHJldHZhbCA9IG51bGw7Ci0gICAgICAgIHBhcm0gPSAiXCIiICsgcGFybSArICJcIiI7Ci0gICAgICAgIGludCBwb3MgPSBkYXRhLmluZGV4T2YocGFybSk7Ci0gICAgICAgIGlmICgwIDw9IHBvcykgewotICAgICAgICAgICAgcG9zID0gZGF0YS5pbmRleE9mKCJcbiIsIHBvcykgKyAxOwotICAgICAgICAgICAgcG9zID0gZGF0YS5pbmRleE9mKCJcbiIsIHBvcykgKyAxOwotICAgICAgICAgICAgcmV0dmFsID0gZGF0YS5zdWJzdHJpbmcocG9zKTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHJldHZhbCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbC5zdWJzdHJpbmcoMCwgcmV0dmFsLmluZGV4T2YoIlxuIikpOwotICAgICAgICAgICAgICAgIHJldHZhbCA9IHJldHZhbC5zdWJzdHJpbmcoMCwgcmV0dmFsLmluZGV4T2YoIlxyIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZm9ybWF0T3V0cHV0Ci0gICAgICogPHAvPgotICAgICAqIEZvcm1hdCB0aGUgdHJhbnNhY3Rpb24gZGF0YSBpbnRvIHRoZSBIVE1MIHRleHQgYXJlYQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcSAgICAgICAgIC0gSHR0cFNlcnZsZXRSZXF1ZXN0Ci0gICAgICogQHBhcmFtIGVuZHBvaW50VVJMIC0gU3RyaW5nCi0gICAgICogQHBhcmFtIHJlcXVlc3QgICAgIC0gU3RyaW5nIHdpdGggd2hhdCB3ZSBzZW5kCi0gICAgICogQHBhcmFtIHJlY2VpdmVkICAgIC0gU3RyaW5nIHJldHVybmVkIHZhbHVlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZvcm1hdE91dHB1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgZW5kcG9pbnRVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdCwgU3RyaW5nIHJlY2VpdmVkKSB7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2VTIiwgIlxuIiArICJDb25uZWN0aW5nIHRvLi4uICIgKyBlbmRwb2ludFVSTAotICAgICAgICAgICAgICAgICsgIlxuXG4iICsgIlJlcXVlc3Q6IFxuIiArIHJlcXVlc3QgKyAiXG4iKTsKLSAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgibWVzc2FnZVIiLCAiXG4iICsgIlJlc3BvbnNlOiBcbiIgKyByZWNlaXZlZAotICAgICAgICAgICAgICAgICsgIlxuIik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvYXhpczIueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9heGlzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMWIzYWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9heGlzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGF4aXNjb25maWcgbmFtZT0iQXhpc0phdmEyLjAiPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlTVRPTSI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+DQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZpbGUgY2FjaGluZyBmb3IgYXR0YWNobWVudHMgLS0+DQotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPjwvcGFyYW1ldGVyPg0KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNpemVUaHJlc2hvbGQiPjQwMDA8L3BhcmFtZXRlci0tPg0KLQ0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIHBsdWdpbiB5b3VyIG93biBhdHRhY2htZW50cyBsaWZlY3ljbGUgaW1wbGVtZW50YXRpb24gLS0+DQotICAgIDwhLS08YXR0YWNobWVudHNMaWZlY3ljbGVNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aW9tLmF0dGFjaG1lbnRzLmxpZmVjeWNsZS5pbXBsLkxpZmVjeWNsZU1hbmFnZXJJbXBsIi8+LS0+DQotDQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSByZWR1Y3Rpb24gb2YgdGhlIGluLW1lbW9yeSBjYWNoZSBvZiBXU0RMIGRlZmluaXRpb25zIC0tPg0KLSAgICA8IS0tSW4gc29tZSBzZXJ2ZXIgZW52aXJvbm1lbnRzLCB0aGUgYXZhaWxhYmxlIG1lbW9yeSBoZWFwIGlzIGxpbWl0ZWQgYW5kIGNhbiBmaWxsIHVwIHVuZGVyIGxvYWQgLS0+DQotICAgIDwhLS1TaW5jZSBpbi1tZW1vcnkgY29waWVzIG9mIFdTREwgZGVmaW5pdGlvbnMgY2FuIGJlIGxhcmdlLCBzb21lIHN0ZXBzIGNhbiBiZSB0YWtlbi0tPg0KLSAgICA8IS0tdG8gcmVkdWNlIHRoZSBtZW1vcnkgbmVlZGVkIGZvciB0aGUgY2FjaGVkIFdTREwgZGVmaW5pdGlvbnMuIC0tPg0KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9InJlZHVjZVdTRExNZW1vcnlDYWNoZSI+dHJ1ZTwvcGFyYW1ldGVyLS0+DQotDQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gbWlsbGlzZWNvbmRzLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzAwMDA8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLUR1cmluZyBhIGZhdWx0LCBzdGFjayB0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPg0KLSAgICA8IS0tdGhhdCBiZWhhdmlvci4tLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleGNlcHRpb24tLT4NCi0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+DQotICAgIDwhLS13cmFwcGVkIGJ5IGRpZmZlcmVudCBsZXZlbHMuIER1ZSB0byB0aGlzIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiBtZXNzYWdlIGNhbiBiZSBsb3N0LiBJZiB0aGlzIGZsYWctLT4NCi0gICAgPCEtLWlzIHNldCwgdGhlbiBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4NCi0NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4NCi0NCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+DQotICAgIDwhLS1TZXJ2aWNlc0RpcmVjdG9yeSBvbmx5IHdvcmtzIG9uIHRoZSBmb2xsb3dpbmcgY2FzZXMtLT4NCi0gICAgPCEtLS1GaWxlIGJhc2VkIGNvbmZpZ3VyYXRvciBhbmQgaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSBzaG91bGQgYmUgYSBmaWxlIFVSTCAoaHR0cDovLyBub3QgYWxsb3dlZCktLT4NCi0gICAgPCEtLS1XaGVuIGNyZWF0aW5nIFVSTCBCYXNlZCBjb25maWd1cmF0b3Igd2l0aCBVUkwg4oCcZmlsZTovL+KAnSAgLS0+DQotICAgIDwhLS0tIFdhciBiYXNlZCBjb25maWd1cmF0b3Igd2l0aCBleHBhbmRlZCBjYXNlICwgLS0+DQotDQotICAgIDwhLS1BbGwgdGhlIG90aGVyIHNjZW5hcmlvcyBpdCB3aWxsIGJlIGlnbm9yZWQuLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L21vZHVsZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGgtLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPg0KLQ0KLQ0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4NCi0gICAgPCEtLXJvb3Qgd2hpY2ggY2FuIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb250ZXh0Um9vdCBwYXJhbWV0ZXItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+DQotDQotICAgIDwhLS1PdXIgSFRUUCBlbmRwb2ludHMgY2FuIGhhbmRsZSBib3RoIFJFU1QgYW5kIFNPQVAuIEZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXVzaCB0aG9zZSBlbmRwb2ludHMtLT4NCi0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPg0KLSAgICA8IS0tY29udGV4dCBwYXRoIHRvIHByb3BlciBBeGlzMiBzZXJ2bGV0cy0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4NCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gQXhpczItLT4NCi0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tIEZvbGxvd2luZyBwYXJhbWV0ZXIgd2lsbCBzdXBwcmVzcyBnZW5lcmF0aW9uIG9mIFNPQVAgMS4yIGJpbmRpbmdzIGluIGF1dG8tZ2VuZXJhdGVkIFdTREwgZmlsZXMgLS0+DQotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNPQVAxMiIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPg0KLQ0KLSAgICA8IS0tUE9KTyBkZXBsb3llciAsIHRoaXMgd2lsbCBhbG93IHVzZXJzIHRvIGRyb3AgLmNsYXNzIGZpbGUgYW5kIG1ha2UgdGhhdCBpbnRvIGEgc2VydmljZS0tPg0KLSAgICA8ZGVwbG95ZXIgZXh0ZW5zaW9uPSIuY2xhc3MiIGRpcmVjdG9yeT0icG9qbyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5QT0pPRGVwbG95ZXIiLz4NCi0gICAgPGRlcGxveWVyIGV4dGVuc2lvbj0iLmphciIgZGlyZWN0b3J5PSJwb2pvIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5qYXh3cy5mcmFtZXdvcmsuSkFYV1NEZXBsb3llciIvPg0KLSAgICA8IS0tPGRlcGxveWVyIGV4dGVuc2lvbj0iLmpzYSIgZGlyZWN0b3J5PSJybWlzZXJ2aWNlcyIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucm1pLmRlcGxveS5STUlTZXJ2aWNlRGVwbG95ZXIiLz4tLT4NCi0NCi0NCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSBob3N0IG5hbWUgZm9yIHRoZSBlcHItLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iaG9zdG5hbWUiIGxvY2tlZD0idHJ1ZSI+bXlob3N0LmNvbTwvcGFyYW1ldGVyPi0tPg0KLQ0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnQgZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+DQotICAgIDwhLS0gdXNlIHRoaXMgcGFyYW1ldGVyIHRvIG92ZXJyaWRlIGF1dG9kZXRlY3RlZCB1cmwgLS0+DQotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+DQotDQotDQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPg0KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPg0KLSAgICA8IS0tICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlJTU19VUkwiPmh0dHA6Ly8xMjcuMC4wLjEvcnNzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4NCi0NCi0gICAgPCEtLSBVbmNvbW1lbnQgaWYgSkFYLVdTIDIuMSBzdXBwb3J0IGlzIG5lZWRlZC4gLS0+DQotICAgIDwhLS0NCi0gICAgPHRocmVhZENvbnRleHRNaWdyYXRvcnM+DQotICAgICAgICA8dGhyZWFkQ29udGV4dE1pZ3JhdG9yIGxpc3RJZD0iSkFYV1MtVGhyZWFkQ29udGV4dE1pZ3JhdG9yLUxpc3QiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpheHdzLmFkZHJlc3NpbmcubWlncmF0b3IuRW5kcG9pbnRDb250ZXh0TWFwTWlncmF0b3IiLz4NCi0gICAgPC90aHJlYWRDb250ZXh0TWlncmF0b3JzPg0KLSAgICAtLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1UaGlzIGlzIHRoZSBkZWFmdWx0IE1lc3NhZ2VSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+DQotICAgIDwhLS1hbGwgdGhlIG90aGVyIE1FUCBpbXBsZW1lbnQgaXQgYW5kIGFkZCB0aGUgY29ycmVjdCBlbnRyeSB0byBoZXJlICwgc28gdGhhdCB5b3UgY2FuIHJlZmVyIGZyb20tLT4NCi0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+DQotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJyaWRlIHRoaXMgZm9yIGEgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPg0KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4NCi0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiDQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDEvd3NkbC9pbi1vbmx5Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wMS93c2RsL2luLW91dCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+DQotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIE1lc3NhZ2UgRm9ybWF0dGVyIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS1Gb2xsb3dpbmcgY29udGVudCB0eXBlIHRvIG1lc3NhZ2UgZm9ybWF0dGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0ICBzZXJpYWxpemF0aW9uIGluIEF4aXMyLiBUaGVzZSBtZXNzYWdlIGZvcm1hdHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJhc2VkIG9uIHRoZSBjb250ZW50IHR5cGUuIC0tPg0KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuWEZvcm1VUkxFbmNvZGVkRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLk11bHRpcGFydEZvcm1EYXRhRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4NCi0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNPQVBNZXNzYWdlRm9ybWF0dGVyIi8+DQotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiDQotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5TT0FQTWVzc2FnZUZvcm1hdHRlciIvPg0KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gTWVzc2FnZSBCdWlsZGVycyAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tRm9sbG93aW5nIGNvbnRlbnQgdHlwZSB0byBidWlsZGVyIG1hcHBpbmcgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIGRpZmZlcmVudCBtZXNzYWdlIC0tPg0KLSAgICA8IS0tZm9ybWF0cyBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4NCi0gICAgPG1lc3NhZ2VCdWlsZGVycz4NCi0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQXBwbGljYXRpb25YTUxCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3htbCINCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5idWlsZGVyLkFwcGxpY2F0aW9uWE1MQnVpbGRlciIvPg0KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5YRm9ybVVSTEVuY29kZWRCdWlsZGVyIi8+DQotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiDQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5NdWx0aXBhcnRGb3JtRGF0YUJ1aWxkZXIiLz4NCi0gICAgPC9tZXNzYWdlQnVpbGRlcnM+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBUcmFuc3BvcnQgSW5zIC0tPg0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDx0cmFuc3BvcnRSZWNlaXZlciBuYW1lPSJodHRwIg0KLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU2ltcGxlSFRUUFNlcnZlciI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4NCi0gICAgICAgIDwhLS0gSGVyZSBpcyB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyAoc2VlIGV4YW1wbGUgc2V0dGluZ3MgZnVydGhlciBiZWxvdyk6DQotICAgICAgICAgICAgcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIG9uIChkZWZhdWx0IDYwNjApDQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQ0KLSAgICAgICAgICAgIG9yaWdpblNlcnZlcjogIHZhbHVlIG9mIGh0dHAgU2VydmVyIGhlYWRlciBpbiBvdXRnb2luZyBtZXNzYWdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgIlNpbXBsZS1TZXJ2ZXIvMS4xIikNCi0gICAgICAgICAgICByZXF1ZXN0VGltZW91dDogIHZhbHVlIGluIG1pbGxpcyBvZiB0aW1lIHRoYXQgcmVxdWVzdHMgY2FuIHdhaXQgZm9yIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0IDIwMDAwKQ0KLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIHRvIG1pbmltaXplIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBieSBjb21iaW5pbmcgc2VnbWVudHMNCi0gICAgICAgICAgICByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOiAgbnVtYmVyIG9mIHRocmVhZHMgYXZhaWxhYmxlIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgKHVubGVzcyBxdWV1ZSBmaWxscyB1cCkgIChkZWZhdWx0IDI1KQ0KLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVwICAgICAgICAgKGRlZmF1bHQgMTUwKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBkZWZhdWx0IHF1ZXVlIG5ldmVyIGZpbGxzIHVwOiAgc2VlIEh0dHBGYWN0b3J5DQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZTogIHRpbWUgdG8ga2VlcCB0aHJlYWRzIGluIGV4Y2VzcyBvZiBjb3JlIHNpemUgYWxpdmUgd2hpbGUgaW5hY3RpdmUgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAxODApDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQ0KLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OiAgVGltZVVuaXQgb2YgdmFsdWUgaW4gdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgU0VDT05EUykNCi0gICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj5odHRwOi8vd3d3Lm15QXBwLmNvbS93czwvcGFyYW1ldGVyPiAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJvcmlnaW5TZXJ2ZXIiPk15LVNlcnZlci8xLjE8L3BhcmFtZXRlcj4gICAgICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUaW1lb3V0Ij4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGNwTm9EZWxheSI+ZmFsc2U8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdE1heFRocmVhZFBvb2xTaXplIj4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lIj4yNDAwMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAtLT4NCi0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJ0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCI+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+DQotICAgIDwvdHJhbnNwb3J0UmVjZWl2ZXI+DQotDQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4NCi0gICAgPCEtLXRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCINCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQU2VydmVyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icG9ydCI+NjA2MDwvcGFyYW1ldGVyLS0+Pg0KLSAgICA8IS0tSWYgeW91IHdhbnQgdG8gZ2l2ZSB5b3VyIG93biBob3N0IGFkZHJlc3MgZm9yIEVQUiBnZW5lcmF0aW9uLS0+DQotICAgIDwhLS11bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBwYXJhbXRlciAsIGFuZCBzZXQgaXQgYXMgeW91IHJlcXVpcmVkLi0tPg0KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJob3N0bmFtZSI+dGNwOi8vbXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+LS0+DQotICAgIDwhLS0gL3RyYW5zcG9ydFJlY2VpdmVyIC0tPg0KLQ0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gVHJhbnNwb3J0IE91dHMgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0NCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBoYXZlIFRDUCB0cmFuc3BvcnQgc3VwcG9ydC0tPg0KLSAgICA8IS0tDQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0idGNwIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC50Y3AuVENQVHJhbnNwb3J0U2VuZGVyIi8+DQotICAgIC0tPg0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9ImxvY2FsIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC5Mb2NhbFRyYW5zcG9ydFNlbmRlciIvPg0KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4NCi0NCi0gICAgICAgIDwhLS0gSWYgZm9sbG93aW5nIGlzIHNldCB0byAndHJ1ZScsIG9wdGlvbmFsIGFjdGlvbiBwYXJ0IG9mIHRoZSBDb250ZW50LVR5cGUgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIFNPQVAgMS4yIG1lc3NhZ2VzIC0tPg0KLSAgICAgICAgPCEtLSAgPHBhcmFtZXRlciBuYW1lPSJPbWl0U09BUDEyQWN0aW9uIj50cnVlPC9wYXJhbWV0ZXI+ICAtLT4NCi0gICAgPC90cmFuc3BvcnRTZW5kZXI+DQotDQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPg0KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4NCi0gICAgPC90cmFuc3BvcnRTZW5kZXI+DQotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iamF2YSINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuamF2YS5KYXZhVHJhbnNwb3J0U2VuZGVyIi8+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPg0KLSAgICA8bW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvPg0KLQ0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPg0KLSAgICA8IS0tPG1vZHVsZUNvbmZpZyBuYW1lPSJhZGRyZXNzaW5nIj4tLT4NCi0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iYWRkcmVzc2luZ1BhcmEiPk4vQTwvcGFyYW1ldGVyPi0tPg0KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPCEtLSBDbHVzdGVyaW5nICAtLT4NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIENvbmZpZ3VyZSBhbmQgdW5jb21tZW50IGZvbGxvd2luZyBmb3IgcHJlcGFyaW5nIEF4aXMyIHRvIGEgY2x1c3RlcmVkIGVudmlyb25tZW50IC0tPg0KLSAgICA8IS0tDQotICAgIDxjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0icGFyYW0xIj52YWx1ZTE8L3BhcmFtZXRlcj4NCi0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iZG9tYWluIj5hcGFjaGUuYXhpczIuZG9tYWluPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InN5bmNocm9uaXplQWxsIj50cnVlPC9wYXJhbWV0ZXI+DQotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1heFJldHJpZXMiPjEwPC9wYXJhbWV0ZXI+DQotICAgIAk8Y29uZmlndXJhdGlvbk1hbmFnZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLlRyaWJlc0NvbmZpZ3VyYXRpb25NYW5hZ2VyIj4NCi0gICAgCSAgICA8bGlzdGVuZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuY2x1c3Rlci5jb25maWd1cmF0aW9uLkRlZmF1bHRDb25maWd1cmF0aW9uTWFuYWdlckxpc3RlbmVyIi8+DQotICAgIAk8L2NvbmZpZ3VyYXRpb25NYW5hZ2VyPg0KLSAgICAJPGNvbnRleHRNYW5hZ2VyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29udGV4dC5UcmliZXNDb250ZXh0TWFuYWdlciI+DQotICAgIAkgICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIuY29udGV4dC5EZWZhdWx0Q29udGV4dE1hbmFnZXJMaXN0ZW5lciIvPg0KLSAgICAJPC9jb250ZXh0TWFuYWdlcj4NCi0gICAgPC9jbHVzdGVyPg0KLSAgICAtLT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8IS0tIFBoYXNlcyAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GbG93Ij4NCi0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJUcmFuc3BvcnQiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciI+DQotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJBZGRyZXNzaW5nIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPg0KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4NCi0gICAgICAgICAgICA8L2hhbmRsZXI+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJEaXNwYXRjaCIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRpc3BhdGNoUGhhc2UiPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIi8+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciIvPg0KLQ0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5IVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgIDwvcGhhc2U+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZWRlZmluZWQgcGhhc2VzICAgICAgIC0tPg0KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPg0KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPg0KLSAgICAgICAgPCEtLXN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlLS0+DQotICAgICAgICA8IS0tdGhlc2UgcGhhc2Ugd2lsbCBydW4gaXJyZXNwZWN0aXZlIG9mIHRoZSBzZXJ2aWNlLS0+DQotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlBvbGljeURldGVybWluYXRpb24iLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4NCi0gICAgPC9waGFzZU9yZGVyPg0KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZhdWx0RmxvdyI+DQotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+DQotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5BZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIj4NCi0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJBZGRyZXNzaW5nIi8+DQotICAgICAgICAgICAgPC9oYW5kbGVyPg0KLSAgICAgICAgPC9waGFzZT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlByZURpc3BhdGNoIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIg0KLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiLz4NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPg0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBNZXNzYWdlQm9keUJhc2VkRGlzcGF0Y2hlciINCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4NCi0NCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIiDQotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIi8+DQotICAgICAgICA8L3BoYXNlPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgIDwvcGhhc2VPcmRlcj4NCi0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4NCi0gICAgICAgIDwhLS0gICAgICB1c2VyIGNhbiBhZGQgaGlzIG93biBwaGFzZXMgdG8gdGhpcyBhcmVhICAtLT4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPg0KLSAgICAgICAgPHBoYXNlIG5hbWU9IlJNUGhhc2UiLz4NCi0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+DQotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPg0KLSAgICA8L3BoYXNlT3JkZXI+DQotPC9heGlzY29uZmlnPg0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9jb21tb25zLWxvZ2dpbmcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZGQwYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvY29tbW9ucy1sb2dnaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jDQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIw0KLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSMNCi0NCi0NCi0jIFRoaXMgaXMgdGhlIGxvZ2dpbmcgcHJvcGVydGllcyB0aGF0IGdvZXMgdG8gdGhlIHdhciwgdGhlcmUgYXJlIHR3byBsb2dnaW5nIGNvbmYga2VwdCBhdCB0aGUgDQotIyBzdm4sIG9uZSBmb3IgZGV2ZWxvcGVtZW50IChvbmUgYXQgc3JjL3Rlc3QtcmVzb3VyY2VzKSBhbmQgb3RoZXIgZm9yIHByb2R1Y2F0aW9uDQotIA0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZGlzYWJsZSBhbGwgbG9nZ2luZy4NCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuTm9PcExvZw0KLQ0KLSMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gZW5hYmxlIHRoZSBzaW1wbGUgbG9nIGJhc2VkIGxvZ2dpbmcNCi0jb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuU2ltcGxlTG9nDQotDQotIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byBlbmFibGUgbG9nNGogYmFzZWQgbG9nZ2luZw0KLW9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZz1vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL2xvZzRqLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0OGRkYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2NsYXNzZXMvbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMNCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotIw0KLQ0KLQ0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4NCi1sb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRQ0KLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQ0KLQ0KLSMgU2V0IHRoZSBlbnRlcnByaXNlIGxvZ2dlciBwcmlvcml0eSB0byBGQVRBTA0KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwNCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTA0KLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmUuaGVhZGVyPUZBVEFMDQotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMDQotDQotIyBDT05TT0xFIGlzIHNldCB0byBiZSBhIENvbnNvbGVBcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuDQotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcg0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dA0KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPVslcF0gJW0lbg0KLQ0KLSMgTE9HRklMRSBpcyBzZXQgdG8gYmUgYSBGaWxlIGFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4NCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyDQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZw0KLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUuQXBwZW5kPXRydWUNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQNCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL2xvZ2hhbmRsZXIueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9jbGFzc2VzL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvL2xvZ2hhbmRsZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzNjY2NkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvY2xhc3Nlcy9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby9sb2doYW5kbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08aGFuZGxlci1jaGFpbnMgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSI+DQotCTxoYW5kbGVyLWNoYWluPg0KLSAgICAgICAgIDxzZXJ2aWNlLW5hbWUtcGF0dGVybiB4bWxuczpuczE9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iPm5zMToqPC9zZXJ2aWNlLW5hbWUtcGF0dGVybj4NCi0gICAgICAgICA8aGFuZGxlcj4NCi0JCQk8aGFuZGxlci1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuaGFuZGxlci5Mb2dnaW5nU09BUEhhbmRsZXI8L2hhbmRsZXItY2xhc3M+DQotCQk8L2hhbmRsZXI+DQotCTwvaGFuZGxlci1jaGFpbj4NCi08L2hhbmRsZXItY2hhaW5zPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvanNwL2RlbW9FY2hvUGluZy5qc3AgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2pzcC9kZW1vRWNob1BpbmcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2MzZjA0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvanNwL2RlbW9FY2hvUGluZy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTxIVE1MPgotPEhFQUQ+Ci0gICAgPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIKLSAgICAgICAgICAgICBwYWdlRW5jb2Rpbmc9IklTTy04ODU5LTEiICU+Ci0gICAgPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0gICAgPFRJVExFPkpBWC1XUyBXZWIgU2VydmljZXMgUGluZyBhbmQgRWNobyBTYW1wbGU8L1RJVExFPgotPC9IRUFEPgotPEJPRFk+Ci08UCBhbGlnbj0iY2VudGVyIj48Qj48Rk9OVCBzaXplPSIrMiI+SkFYLVdTIFdlYiBTZXJ2aWNlcyBQaW5nIGFuZCBFY2hvIFNhbXBsZQotPC9GT05UPjwvQj48L1A+Ci0KLTxIMz48Qj4gPFU+TWVzc2FnZSBPcHRpb25zPC9VPjwvQj48L0gzPgotCi08Rk9STSBuYW1lPSJkZW1vTWUiIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIvamF4d3Mtc2FtcGxlcy9kZW1vRWNob1BpbmciPgotPFRBQkxFIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KLTxUQk9EWT4KLTxUUj4KLSAgICA8VEQ+Ci0gICAgICAgIDxUQUJMRSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iIzk5RkZCQiI+Ci0gICAgICAgICAgICA8VEJPRFk+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+TWVzc2FnZSBUeXBlOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+PFNFTEVDVCBuYW1lPSJtc2dzZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxPUFRJT04gdmFsdWU9IlBpbmciIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJQaW5nU2VsZWN0ZWQiKSU+Pk9uZS1XYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICA8L09QVElPTj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxPUFRJT04gdmFsdWU9IkVjaG8iIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJFY2hvU2VsZWN0ZWQiKSU+PlN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNobwotICAgICAgICAgICAgICAgICAgICAgICAgPC9PUFRJT04+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8T1BUSU9OIHZhbHVlPSJBc3luYyIgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkFzeW5jU2VsZWN0ZWQiKSU+PkFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8gd2l0aCBTeW5jIENvbW11bmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvT1BUSU9OPgotICAgICAgICAgICAgICAgICAgICAgICAgPE9QVElPTiB2YWx1ZT0iQXN5bmNXaXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgiQXN5bmNXaXJlU2VsZWN0ZWQiKSU+PkFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjaG8gd2l0aCBBc3luYyBDb21tdW5pY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8L09QVElPTj4KLSAgICAgICAgICAgICAgICAgICAgPC9TRUxFQ1Q+PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEJSPgotICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Qj5NZXNzYWdlIFN0cmluZzo8L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxJTlBVVCB0eXBlPSJ0ZXh0IiBuYW1lPSJtc2dzdHJpbmciIHNpemU9IjQwIj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCUj4KLSAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+TWVzc2FnZSBDb3VudDo8L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCPjxJTlBVVCB0eXBlPSJ0ZXh0IiBuYW1lPSJtc2djb3VudCIgc2l6ZT0iNCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoIm1zZ2NvdW50IiklPiI+PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48QlI+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxCPlNlcnZpY2UgVVJJOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+PElOUFVUIHR5cGU9InRleHQiIG5hbWU9InVyaSIgc2l6ZT0iNDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJ1cmlkZWYiKSU+Ij48L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48QlI+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Rk9OVCBzaXplPSItMSI+ImV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vU2VydmljZUhvc3RuYW1lOnBvcnQiPC9GT05UPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PEJSPgotICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48Qj5TT0FQOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PElOUFVUIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJzb2FwMTIiCi0gICAgICAgICAgICAgICAgICAgIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJzb2FwZGVmIiklPj5Vc2UgU09BUCAxLjIKLSAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgIDwvVEJPRFk+Ci0gICAgICAgIDwvVEFCTEU+Ci0gICAgPC9URD4KLTwvVFI+Ci08VFI+Ci0gICAgPFREPgotICAgICAgICA8VEFCTEUgd2lkdGg9IjUwIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMSI+Ci0gICAgICAgICAgICA8VEJPRFk+Ci0gICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICA8VEQ+PElOUFVUIHR5cGU9InN1Ym1pdCIgbmFtZT0iU1VCTUlUIiB2YWx1ZT0iU2VuZCBNZXNzYWdlIj4KLSAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgPFREPjxURVhUQVJFQSByb3dzPSIyMCIgY29scz0iNjAiIG5hbWU9Ik9VVFBVVCIgcmVhZG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iYmFja2dyb3VuZDojRTZFNkZBIiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImJvcmRlci1zdHlsZTpzb2xpZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgibWVzc2FnZVMiKSU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgibWVzc2FnZVIiKSU+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEVYVEFSRUE+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICA8L1RCT0RZPgotICAgICAgICA8L1RBQkxFPgotICAgIDwvVEQ+Ci08L1RSPgotPC9UQk9EWT4KLTwvVEFCTEU+Ci08L0ZPUk0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2pzcC9kZW1vTVRPTS5qc3AgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL2pzcC9kZW1vTVRPTS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWIyZjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi9qc3AvZGVtb01UT00uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTwlQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiCi0gICAgICAgICBwYWdlRW5jb2Rpbmc9IklTTy04ODU5LTEiICU+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLQotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgICA8dGl0bGU+SkFYLVdTIFdlYiBTZXJ2aWNlcyBNVE9NIFNhbXBsZTwvdGl0bGU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICAgICAgPCEtLQotICAgICAgICBmdW5jdGlvbiBjaGVja2Zvcm0oZm9ybSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZvcm0uZmlsZWRlZi52YWx1ZSA9PSAiIikgewotICAgICAgICAgICAgICAgIGFsZXJ0KCJQbGVhc2UgZW50ZXIgYSBTb3VyY2UgRmlsZW5hbWUiKTsKLSAgICAgICAgICAgICAgICBmb3JtLmZpbGVkZWYuZm9jdXMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLy0tPgotICAgIDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08UCBhbGlnbj0iY2VudGVyIj48Qj48Rk9OVCBzaXplPSIrMiI+SkFYLVdTIFdlYiBTZXJ2aWNlcyBNVE9NIFNhbXBsZQotPC9GT05UPjwvQj48L1A+Ci0KLTxIMz48Qj4gPFU+TWVzc2FnZSBPcHRpb25zPC9VPjwvQj48L0gzPgotCi08Rk9STSBuYW1lPSJtdG9tZGVtbyIgbWV0aG9kPSJQT1NUIiBhY3Rpb249Ii9qYXh3cy1zYW1wbGVzL2RlbW9NVE9NIiBvbnN1Ym1pdD0icmV0dXJuIGNoZWNrZm9ybSh0aGlzKTsiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotICAgIDxUQUJMRSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMSI+Ci0gICAgICAgIDxUQk9EWT4KLSAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxUQUJMRSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMSIgYmdjb2xvcj0iI0NDQ0MyMiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VEJPRFk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+U2VydmljZSBUeXBlOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+PFNFTEVDVCBuYW1lPSJtc2dzZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxPUFRJT04gdmFsdWU9IkRpc3BhdGNoIiA8JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgiRGlzcGF0Y2hTZWxlY3RlZCIpJT4+RGlzcGF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvT1BUSU9OPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE9QVElPTiB2YWx1ZT0iUHJveHkiIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJQcm94eVNlbGVjdGVkIiklPj5Qcm94eTwvT1BUSU9OPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1NFTEVDVD48L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Qj5Tb3VyY2UgRmlsZW5hbWU6PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Qj48SU5QVVQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZWRlZiIgc2l6ZT0iMzIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmaWxlZGVmIiklPiI+PC9CPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48QlI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxCPlNlcnZpY2UgVVJJOjwvQj48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+PElOUFVUIHR5cGU9InRleHQiIG5hbWU9InVyaWRlZiIgc2l6ZT0iNDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IjwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJ1cmlkZWYiKSU+Ij48L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48QlI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48Rk9OVCBzaXplPSItMSI+ZXhhbXBsZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9TZXJ2aWNlSG9zdG5hbWU6cG9ydDwvRk9OVD48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxCUj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PEI+U09BUDo8L0I+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjxJTlBVVCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic29hcGRlZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCU9cmVxdWVzdC5nZXRBdHRyaWJ1dGUoInNvYXBkZWYiKSU+PlVzZSBTT0FQIDEuMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RSPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9UQk9EWT4KLSAgICAgICAgICAgICAgICAgICAgPC9UQUJMRT4KLSAgICAgICAgICAgICAgICA8L1REPgotICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQ+Ci0gICAgICAgICAgICAgICAgICAgIDxUQUJMRSB3aWR0aD0iNTAiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxUQk9EWT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxURD48SU5QVVQgdHlwZT0ic3VibWl0IiBuYW1lPSJTVUJNSVQiIHZhbHVlPSJTZW5kIE1lc3NhZ2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VEQ+PFRFWFRBUkVBIHJvd3M9IjIwIiBjb2xzPSI2MCIgbmFtZT0iT1VUUFVUIiByZWFkb25seQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kOiNGQUU2MjIiIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iYm9yZGVyLXN0eWxlOnNvbGlkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJtZXNzYWdlUyIpJT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJtZXNzYWdlUiIpJT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9URVhUQVJFQT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFREPjwvVEQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9UUj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvVEJPRFk+Ci0gICAgICAgICAgICAgICAgICAgIDwvVEFCTEU+Ci0gICAgICAgICAgICAgICAgPC9URD4KLSAgICAgICAgICAgIDwvVFI+Ci0gICAgICAgIDwvVEJPRFk+Ci0gICAgPC9UQUJMRT4KLTwvRk9STT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYWRjODEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTx3ZWItYXBwIGlkPSJqYXh3cy1zYW1wbGVzIiB2ZXJzaW9uPSIyLjQiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIj4NCi0NCi0gICAgPHNlcnZsZXQ+DQotICAgICAgICA8c2VydmxldC1uYW1lPkF4aXNTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz4NCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkF4aXNTZXJ2bGV0DQotICAgICAgICA8L3NlcnZsZXQtY2xhc3M+DQotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4NCi0gICAgPC9zZXJ2bGV0Pg0KLQ0KLSAgICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5BeGlzU2VydmxldDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2aWNlcy8qPC91cmwtcGF0dGVybj4NCi0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+DQotDQotICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzExODIzNjczMDc0MTYiPg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5NVE9NU2FtcGxlU2VydmxldDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+DQotICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5qYXh3cy5zYW1wbGVzLnNlcnZsZXQuTVRPTVNhbXBsZVNlcnZsZXQNCi0gICAgICAgIDwvc2VydmxldC1jbGFzcz4NCi0gICAgPC9zZXJ2bGV0Pg0KLQ0KLSAgICA8c2VydmxldC1tYXBwaW5nPg0KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5NVE9NU2FtcGxlU2VydmxldDwvc2VydmxldC1uYW1lPg0KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9kZW1vTVRPTTwvdXJsLXBhdHRlcm4+DQotICAgIDwvc2VydmxldC1tYXBwaW5nPg0KLQ0KLSAgICA8c2VydmxldD4NCi0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RWNob1BpbmdTYW1wbGVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuYXBhY2hlLmF4aXMyLmpheHdzLnNhbXBsZXMuc2VydmxldC5FY2hvUGluZ1NhbXBsZVNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICAgIDwvc2VydmxldD4NCi0gICAgPHNlcnZsZXQtbWFwcGluZz4NCi0gICAgICAgIDxzZXJ2bGV0LW5hbWU+RWNob1BpbmdTYW1wbGVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+DQotICAgICAgICA8dXJsLXBhdHRlcm4+L2RlbW9FY2hvUGluZzwvdXJsLXBhdHRlcm4+DQotICAgIDwvc2VydmxldC1tYXBwaW5nPg0KLTwvd2ViLWFwcD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvRWNoby53c2RsIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0VjaG8ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlZDM0Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvRWNoby53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9lY2hvLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkVjaG9TZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzZDpzY2hlbWEKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvUmVzcG9uc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nSW5wdXQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNob0lucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob09wZXJhdGlvblJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczplY2hvU3RyaW5nSW5wdXQiIG5hbWU9InBhcmFtZXRlciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob09wZXJhdGlvblJlc3BvbnNlIj4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXIiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJFY2hvU2VydmljZVBvcnRUeXBlIj4KLQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob09wZXJhdGlvbiI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iRWNob1NPQVAiIHR5cGU9InRuczpFY2hvU2VydmljZVBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImVjaG9PcGVyYXRpb24iPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG9PcGVyYXRpb24iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RWNob1NPQVAiIG5hbWU9IkVjaG9TZXJ2aWNlUG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9FY2hvU2VydmljZSIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLSAgICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9FY2hvMTIud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9FY2hvMTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkYTE0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvRWNobzEyLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJFY2hvU2VydmljZTEyIgotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL2VjaG8vIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzZDpzY2hlbWEKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvZWNoby8iCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1Jlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0lucHV0Ij4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVjaG9JbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0KLSAgICAgICAgPC94c2Q6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9PcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6ZWNob1N0cmluZ0lucHV0IiBuYW1lPSJwYXJhbWV0ZXIiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9PcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVyIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iRWNob1NlcnZpY2UxMlBvcnRUeXBlIj4KLQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob09wZXJhdGlvbiI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotICAgIDx3c2RsOmJpbmRpbmcgbmFtZT0iRWNob1NPQVAxMiIgdHlwZT0idG5zOkVjaG9TZXJ2aWNlMTJQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJlY2hvT3BlcmF0aW9uIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJFY2hvU2VydmljZTEyIj4KLSAgICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6RWNob1NPQVAxMiIgbmFtZT0iRWNob1NlcnZpY2UxMlBvcnQiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheHdzLXNhbXBsZXMvc2VydmljZXMvRWNob1NlcnZpY2UxMiIvPgotICAgICAgICA8L3dzZGw6cG9ydD4KLSAgICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9JbWFnZURlcG90LndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvSW1hZ2VEZXBvdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjkwNDI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9JbWFnZURlcG90LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIgotICAgICAgICAgICAgICAgICAgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczptdG9tPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIgotICAgICAgICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgICB4bWxuczp4bWltZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotICAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIKLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkltYWdlRGVwb3QiPgotICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaW1hZ2VEYXRhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4czpiYXNlNjRCaW5hcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtaW1lOmV4cGVjdGVkQ29udGVudFR5cGVzPSJtdWx0aXBhcnQvKiIvPgotICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImlucHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJvdXRwdXQiIHR5cGU9InRuczpJbWFnZURlcG90Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPC94czpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzZW5kSW1hZ2VSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJtdG9tOnNlbmRJbWFnZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibXRvbTpzZW5kSW1hZ2VSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotCi0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iTXRvbVNhbXBsZVNlcnZpY2UiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2VuZEltYWdlIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6c2VuZEltYWdlUmVxdWVzdCIgbmFtZT0ic2VuZEltYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6c2VuZEltYWdlUmVzcG9uc2UiIG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotCi0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJNdG9tU2FtcGxlU29hcCIgdHlwZT0iaW1wbDpNdG9tU2FtcGxlU2VydmljZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2VuZEltYWdlIj4KLSAgICAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0ic2VuZEltYWdlIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJzZW5kSW1hZ2VSZXF1ZXN0Ij4KLSAgICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotCi0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJNdG9tU2FtcGxlU2VydmljZSI+Ci0gICAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpNdG9tU2FtcGxlU29hcCIgbmFtZT0iTXRvbVNhbXBsZVBvcnQiPgotICAgICAgICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXh3cy1zYW1wbGVzL3NlcnZpY2VzL010b21TYW1wbGVTZXJ2aWNlIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotCi08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL0ltYWdlRGVwb3QxMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBjYmQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3Mtc2FtcGxlcy9zcmMvd2ViYXBwL1dFQi1JTkYvd3NkbC9JbWFnZURlcG90MTIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6aW1wbD0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOmludGY9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczptdG9tPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIgotICAgICAgICAgICAgICAgICAgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9tdG9tLyI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp0bnM9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvbXRvbS8iCi0gICAgICAgICAgICAgICAgICAgeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL210b20vIj4KLSAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJbWFnZURlcG90Ij4KLSAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImltYWdlRGF0YSIgdHlwZT0ieHM6YmFzZTY0QmluYXJ5IiB4bWltZTpleHBlY3RlZENvbnRlbnRUeXBlcz0ibXVsdGlwYXJ0LyoiLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VuZEltYWdlIj4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dCIgdHlwZT0idG5zOkltYWdlRGVwb3QiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotCi0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJzZW5kSW1hZ2VSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0IiB0eXBlPSJ0bnM6SW1hZ2VEZXBvdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDwveHM6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2VuZEltYWdlUmVxdWVzdCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0ibXRvbTpzZW5kSW1hZ2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLQotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2VuZEltYWdlUmVzcG9uc2UiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9Im10b206c2VuZEltYWdlUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLQotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlMTIiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2VuZEltYWdlIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImltcGw6c2VuZEltYWdlUmVxdWVzdCIgbmFtZT0ic2VuZEltYWdlUmVxdWVzdCIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6c2VuZEltYWdlUmVzcG9uc2UiIG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOnBvcnRUeXBlPgotCi0gICAgPHdzZGw6YmluZGluZyBuYW1lPSJNdG9tU2FtcGxlU29hcCIgdHlwZT0iaW1wbDpNdG9tU2FtcGxlU2VydmljZTEyIj4KLSAgICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCi0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzZW5kSW1hZ2UiPgotICAgICAgICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJzZW5kSW1hZ2UiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNlbmRJbWFnZVJlcXVlc3QiPgotICAgICAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNlbmRJbWFnZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9Ik10b21TYW1wbGVTZXJ2aWNlMTIiPgotICAgICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImltcGw6TXRvbVNhbXBsZVNvYXAiIG5hbWU9Ik10b21TYW1wbGVQb3J0Ij4KLSAgICAgICAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvamF4d3Mtc2FtcGxlcy9zZXJ2aWNlcy9NdG9tU2FtcGxlU2VydmljZTEyIi8+Ci0gICAgICAgIDwvd3NkbDpwb3J0PgotICAgIDwvd3NkbDpzZXJ2aWNlPgotCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvUGluZy53c2RsIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL1Bpbmcud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZjU2Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvUGluZy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlBpbmdTZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHhzZDpzY2hlbWEKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcvYXBhY2hlL2F4aXMyL2pheHdzL3NhbXBsZXMvcGluZy8iCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0KLQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBpbmdTdHJpbmdJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzY2hlbWE+Ci0gICAgPC93c2RsOnR5cGVzPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0icGluZ09wZXJhdGlvblJlcXVlc3QiPgotICAgICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpwaW5nU3RyaW5nSW5wdXQiIG5hbWU9InBhcmFtZXRlciIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlBpbmdTZXJ2aWNlUG9ydFR5cGUiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZ09wZXJhdGlvbiI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6cGluZ09wZXJhdGlvblJlcXVlc3QiLz4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IlBpbmdTT0FQIiB0eXBlPSJ0bnM6UGluZ1NlcnZpY2VQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJwaW5nT3BlcmF0aW9uIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPC93c2RsOmJpbmRpbmc+Ci0gICAgPHdzZGw6c2VydmljZSBuYW1lPSJQaW5nU2VydmljZSI+Ci0gICAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlBpbmdTT0FQIiBuYW1lPSJQaW5nU2VydmljZVBvcnQiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheHdzLXNhbXBsZXMvc2VydmljZXMvUGluZ1NlcnZpY2UiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvUGluZzEyLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9XRUItSU5GL3dzZGwvUGluZzEyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Mzk1NGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvV0VCLUlORi93c2RsL1BpbmcxMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iUGluZ1NlcnZpY2UxMiIKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29yZy9hcGFjaGUvYXhpczIvamF4d3Mvc2FtcGxlcy9waW5nLyI+Ci0gICAgPHdzZGw6dHlwZXM+Ci0gICAgICAgIDx4c2Q6c2NoZW1hCi0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3JnL2FwYWNoZS9heGlzMi9qYXh3cy9zYW1wbGVzL3BpbmcvIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCi0KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nU3RyaW5nSW5wdXQiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGluZ0lucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9InBpbmdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6cGluZ1N0cmluZ0lucHV0IiBuYW1lPSJwYXJhbWV0ZXIiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJQaW5nU2VydmljZTEyUG9ydFR5cGUiPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZ09wZXJhdGlvbiI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6cGluZ09wZXJhdGlvblJlcXVlc3QiLz4KLQotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IlBpbmdTT0FQMTIiIHR5cGU9InRuczpQaW5nU2VydmljZTEyUG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIKLSAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0icGluZ09wZXJhdGlvbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0icGluZ09wZXJhdGlvbiIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpiaW5kaW5nPgotICAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iUGluZ1NlcnZpY2UxMiI+Ci0gICAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlBpbmdTT0FQMTIiIG5hbWU9IlBpbmdTZXJ2aWNlMTJQb3J0Ij4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXh3cy1zYW1wbGVzL3NlcnZpY2VzL1BpbmdTZXJ2aWNlMTIiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9pbmRleC5odG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy1zYW1wbGVzL3NyYy93ZWJhcHAvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyMjFlOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXNhbXBsZXMvc3JjL3dlYmFwcC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPEhUTUw+DQotPEhFQUQ+DQotPFRJVExFPkpBWC1XUyBXZWIgU2VydmljZXMgU2FtcGxlczwvVElUTEU+DQotPC9IRUFEPg0KLQ0KLTxCT0RZPg0KLTxUQUJMRT4NCi0gIDx0cj4gDQotICAgIDx0ZD4NCi0gICAgICA8c3Ryb25nPg0KLSAgICAgICBQaW5nIGFuZCBFY2hvIFNhbXBsZQ0KLSAgICAgIDwvc3Ryb25nPg0KLSAgICA8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gICA8dGQ+DQotICAgIDxzdHJvbmc+DQotICAgICA8YSBocmVmPSIvamF4d3Mtc2FtcGxlcy9kZW1vRWNob1BpbmciPlJ1bjwvYT4NCi0gICAgPC9zdHJvbmc+DQotICAgPC90ZD4NCi0gIDx0cj4gDQotICA8dHI+IA0KLSAgICA8dGQ+DQotICAgICAgVGhlIFBpbmcgYW5kIEVjaG8gU2FtcGxlIGlsbHVzdHJhdGVzIHNpbXBsZSBKQVgtV1Mgc2VydmljZXMuIFRoZSBQaW5nIFNhbXBsZQ0KLSAgICAgIGRlbW9uc3RyYXRlcyBhIG9uZS13YXkgc2VydmljZSB0cmFuc2FjdGlvbi4gQSBzaW1wbGUgdGV4dCBzdHJpbmcgaXMgc2VudA0KLSAgICAgIGZyb20gdGhlIHNlcnZpY2UgY2xpZW50IHRvIHRoZSBzZXJ2aWNlIGVuZHBvaW50LiBUaGUgRWNobyBTYW1wbGUgZGVtb25zdHJhdGVzDQotICAgICAgYSB0d28td2F5IHNlcnZpY2UgdHJhbnNhY3Rpb24uIEEgc2ltcGxlIHRleHQgc3RyaW5nIGlzIHNlbnQgZnJvbSB0aGUgc2VydmljZSANCi0gICAgICBjbGllbnQgdG8gdGhlIHNlcnZpY2UgZW5kcG9pbnQuIFRoZSBzZXJ2aWNlIHByZXBlbmRzIGFuIGlkZW50aWZpZXIgYW5kIHJldHVybnMgDQotICAgICAgdGhlIHN0cmluZyB0byB0aGUgY2xpZW50LiBUaGUgRWNobyBTYW1wbGUgYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgDQotICAgICAgc3luY2hyb25vdXMgcHJvZ3JhbW1pbmcgbW9kZWwgYW5kIGFsc28gdGhlIHVzZSBvZiB0d28gbW9kZXMgb2YgdGhlIGFzeW5jaHJvbm91cyBwcm9ncmFtbWluZyBtb2RlbC4NCi0gICAgICBZb3UgY2FuIGNob29zZSBlaXRoZXIgU09BUCAxLjEgb3IgU09BUCAxLjIgYXMgdGhlIHRyYW5zcG9ydCBvcHRpb24gZm9yIHRoZSBQaW5nIGFuZCBFY2hvIFNhbXBsZXMuDQotICAgIDwvdGQ+DQotICA8L3RyPg0KLQ0KLSAgPHRyPiANCi0gICAgPHRkPg0KLSAgICAgIDxzdHJvbmc+DQotICAgICAgIE1UT00gU2FtcGxlDQotICAgICAgPC9zdHJvbmc+DQotICAgIDwvdGQ+DQotDQotICA8L3RyPg0KLSAgPHRyPg0KLSAgIDx0ZD4NCi0gICAgPHN0cm9uZz4NCi0gICAgIDxhIGhyZWY9Ii9qYXh3cy1zYW1wbGVzL2RlbW9NVE9NIj5SdW48L2E+DQotICAgIDwvc3Ryb25nPg0KLSAgIDwvdGQ+DQotDQotICA8L3RyPiANCi0gIDx0cj4gDQotICAgIDx0ZD4NCi0gICAgICBUaGUgTVRPTSBTYW1wbGUgaWxsdXN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgU09BUCBNZXNzYWdlIFRyYW5zbWlzc2lvbiANCi0gICAgICBPcHRpbWl6YXRpb24gTWVjaGFuaXNtIChNVE9NKSBvbiB0aGUgdHJhbnNwb3J0IHRvIHNlbmQgYW5kIHJlY2VpdmUgYmluYXJ5IGZpbGVzLiANCi0gICAgICBUaGUgTVRPTSBmZWF0dXJlIGVuYWJsZXMgU09BUCBiaW5kaW5ncyB0byBvcHRpbWl6ZSB0aGUgdHJhbnNtaXNzaW9uIG9yDQotICAgICAgd2lyZSBmb3JtYXQgb2YgYSBTT0FQIG1lc3NhZ2UgYnkgc2VsZWN0aXZlbHkgZW5jb2RpbmcgcG9ydGlvbnMgb2YgdGhlIG1lc3NhZ2UsDQotICAgICAgd2hpbGUgc3RpbGwgcHJlc2VudGluZyBhbiBYTUwgSW5mb3NldCB0byB0aGUgU09BUCBhcHBsaWNhdGlvbi4NCi0gICAgICBBIGZpbGUgaXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIGNsaWVudCB0byB0aGUgc2VydmljZSBlbmRwb2ludCB3aXRoDQotICAgICAgdGhlIGJpbmFyeSBkYXRhIGVuY29kZWQgdXNpbmcgTVRPTS4NCi0gICAgPC90ZD4NCi0gIDwvdHI+DQotPC9CT0RZPg0KLTwvSFRNTD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vUkVBRE1FLnR4dCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzkwZTJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU2FtcGxlOiBKQVhXUyBWZXJzaW9uDQotPT09PT09PT09PT09PT09DQotDQotSW50cm9kdWN0aW9uDQotPT09PT09PT09PT09DQotDQotQSBzaW1wbGUgSkFYV1Mgc2VydmljZSB0aGF0IHJldHVybnMgYSB0ZXh0IHdoaWNoIGNvbnRhaW5zIHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgdGhlIGJ1aWx0IA0KLWRhdGUgb2YgdGhlIEF4aXMyIERpc3RyaWJ1dGlvbiB1c2VkLg0KLQ0KLUluIG90aGVyIHdvcmRzLCB0aGlzIGlzIGEgc2ltcGxlIEpBWFdTL0pTUiAxODEgc2VydmljZSB1c2VkIGJ5IG1hbnkgdG8gdGVzdCB3aGV0aGVyIHRoZSBkaXN0cmlidXRpb24gdGhleSBnb3QgaXMgc2V0dXAgDQotYW5kIHdvcmtpbmcgcHJvcGVybHkuIEl0IGNvbnRhaW5zIGEgc2luZ2xlIG1ldGhvZCB0aGF0IHNpbXBseSByZXR1cm5zIHZlcnNpb24gYW5kIGJ1aWxkIA0KLWRhdGUgb2YgdGhlIEF4aXMyIGRpc3RyaWJ1dGlvbiB1c2VkLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotUnVubmluZyB0aGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAkYW50IGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3ZlcnNpb24NCi0NCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ5ODgxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08cHJvamVjdCBuYW1lPSJ2ZXJzaW9uIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4NCi0JDQotCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9ImJ1aWxkIiAvPg0KLQkNCi0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmNsYXNzZXMiIHZhbHVlPSIke2Rlc3QuZGlyfS9jbGFzc2VzIiAvPg0KLQkNCi0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+DQotCQ0KLQk8cHJvcGVydHkgbmFtZT0icmVwb3NpdG9yeS5wYXRoIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5L3NlcnZpY2VqYXJzIiAvPg0KLQkNCi0JPHBhdGggaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiPg0KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+DQotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+DQotCQk8L2ZpbGVzZXQ+DQotCTwvcGF0aD4NCi0JDQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPg0KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdC5kaXJ9IiAvPg0KLQk8L3RhcmdldD4NCi0JDQotCTx0YXJnZXQgbmFtZT0icHJlcGFyZSI+DQotCQkNCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9IiAvPg0KLQkJDQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiAvPg0KLQ0KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iPg0KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0icmVzb3VyY2VzIi8+DQotICAgICAgICA8L2NvcHk+DQotCTwvdGFyZ2V0Pg0KLQkNCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJjbGVhbixwcmVwYXJlIj4NCi0JCQ0KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlL2pheHdzLyoqIj4NCi0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIiAvPg0KLQkJPC9qYXZhYz4NCi0JCQ0KLQkJPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBkZXN0ZmlsZT0iJHtkZXN0LmRpcn0vdmVyc2lvbi5qYXIiIC8+DQotCQkNCi0JCTxjb3B5IGZpbGU9IiR7ZGVzdC5kaXJ9L3ZlcnNpb24uamFyIiB0b2ZpbGU9IiR7cmVwb3NpdG9yeS5wYXRofS92ZXJzaW9uLmphciIgb3ZlcndyaXRlPSJ0cnVlIiAvPg0KLQkNCi0JPC90YXJnZXQ+DQotCQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjdjMTlkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPg0KLSAgICA8L3BhcmVudD4NCi0gICAgPGFydGlmYWN0SWQ+dmVyc2lvbjwvYXJ0aWZhY3RJZD4NCi0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gSkFYV1MgVmVyc2lvbiBTZXJ2aWNlPC9uYW1lPg0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYzwvc291cmNlRGlyZWN0b3J5Pg0KLSAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgPHJlc291cmNlPg0KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+cmVzb3VyY2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgIDwvcmVzb3VyY2U+DQotICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+DQotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0Pg0KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcmVzb3VyY2VzL01FVEEtSU5GL3ZlcnNpb24ud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmVyc2lvbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE2NGU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmVyc2lvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZGVmaW5pdGlvbnMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp0bnM9Imh0dHA6Ly9qYXh3cy5zYW1wbGUvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5zYW1wbGUvIiBuYW1lPSJKQVhXU1ZlcnNpb24iPg0KLQk8dHlwZXM+DQotCQk8eHNkOnNjaGVtYT4NCi0JCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9qYXh3cy5zYW1wbGUvIiBzY2hlbWFMb2NhdGlvbj0idmVyc2lvbi54c2QiLz4NCi0JCTwveHNkOnNjaGVtYT4NCi0JPC90eXBlcz4NCi0JPG1lc3NhZ2UgbmFtZT0iZ2V0VmVyc2lvblJlc3BvbnNlIj4NCi0JCTxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpnZXRWZXJzaW9uUmVzcG9uc2UiPg0KLSAgICA8L3BhcnQ+DQotCTwvbWVzc2FnZT4NCi0JPG1lc3NhZ2UgbmFtZT0iRXhjZXB0aW9uIj4NCi0JCTxwYXJ0IG5hbWU9ImZhdWx0IiBlbGVtZW50PSJ0bnM6RXhjZXB0aW9uIj4NCi0gICAgPC9wYXJ0Pg0KLQk8L21lc3NhZ2U+DQotCTxtZXNzYWdlIG5hbWU9ImdldFZlcnNpb24iPg0KLQkJPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOmdldFZlcnNpb24iPg0KLSAgICA8L3BhcnQ+DQotCTwvbWVzc2FnZT4NCi0JPHBvcnRUeXBlIG5hbWU9IlZlcnNpb24iPg0KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4NCi0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmdldFZlcnNpb24iPg0KLSAgICA8L2lucHV0Pg0KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmdldFZlcnNpb25SZXNwb25zZSI+DQotICAgIDwvb3V0cHV0Pg0KLQkJCTxmYXVsdCBuYW1lPSJFeGNlcHRpb24iIG1lc3NhZ2U9InRuczpFeGNlcHRpb24iPg0KLSAgICA8L2ZhdWx0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvcG9ydFR5cGU+DQotCTxiaW5kaW5nIG5hbWU9IlZlcnNpb25Qb3J0QmluZGluZyIgdHlwZT0idG5zOlZlcnNpb24iPg0KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotCQk8b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPg0KLQkJCTxzb2FwOm9wZXJhdGlvbi8+DQotCQkJPGlucHV0Pg0KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPg0KLQkJCTwvaW5wdXQ+DQotCQkJPG91dHB1dD4NCi0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4NCi0JCQk8L291dHB1dD4NCi0JCQk8ZmF1bHQgbmFtZT0iRXhjZXB0aW9uIj4NCi0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iRXhjZXB0aW9uIiB1c2U9ImxpdGVyYWwiLz4NCi0JCQk8L2ZhdWx0Pg0KLQkJPC9vcGVyYXRpb24+DQotCTwvYmluZGluZz4NCi0JPHNlcnZpY2UgbmFtZT0iSkFYV1NWZXJzaW9uIj4NCi0JCTxwb3J0IG5hbWU9IlZlcnNpb25Qb3J0IiBiaW5kaW5nPSJ0bnM6VmVyc2lvblBvcnRCaW5kaW5nIj4NCi0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTkyLjE2OC4yLjEwMjo4MDgwL2F4aXMyL3NlcnZpY2VzL0pBWFdTVmVyc2lvbi5WZXJzaW9uUG9ydCIvPg0KLQkJPC9wb3J0Pg0KLQk8L3NlcnZpY2U+DQotPC9kZWZpbml0aW9ucz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcmVzb3VyY2VzL01FVEEtSU5GL3ZlcnNpb24ueHNkIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3Jlc291cmNlcy9NRVRBLUlORi92ZXJzaW9uLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhMDVjMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL2pheHdzLXZlcnNpb24vcmVzb3VyY2VzL01FVEEtSU5GL3ZlcnNpb24ueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL2pheHdzLnNhbXBsZS8iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2pheHdzLnNhbXBsZS8iIGVsZW1lbnRGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+DQotCTx4czplbGVtZW50IG5hbWU9IkV4Y2VwdGlvbiIgdHlwZT0idG5zOkV4Y2VwdGlvbiIvPg0KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uIiB0eXBlPSJ0bnM6Z2V0VmVyc2lvbiIvPg0KLQk8eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uUmVzcG9uc2UiIHR5cGU9InRuczpnZXRWZXJzaW9uUmVzcG9uc2UiLz4NCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFZlcnNpb24iPg0KLQkJPHhzOnNlcXVlbmNlLz4NCi0JPC94czpjb21wbGV4VHlwZT4NCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+DQotCQk8eHM6c2VxdWVuY2U+DQotCQkJPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4czpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPg0KLQkJPC94czpzZXF1ZW5jZT4NCi0JPC94czpjb21wbGV4VHlwZT4NCi0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkV4Y2VwdGlvbiI+DQotCQk8eHM6c2VxdWVuY2U+DQotCQkJPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHM6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4NCi0JCTwveHM6c2VxdWVuY2U+DQotCTwveHM6Y29tcGxleFR5cGU+DQotPC94czpzY2hlbWE+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3NyYy9zYW1wbGUvamF4d3MvVmVyc2lvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9qYXh3cy12ZXJzaW9uL3NyYy9zYW1wbGUvamF4d3MvVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQxMDQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvamF4d3MtdmVyc2lvbi9zcmMvc2FtcGxlL2pheHdzL1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIHNhbXBsZS5qYXh3czsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotDQotQFdlYlNlcnZpY2Uoc2VydmljZU5hbWUgPSAiSkFYV1NWZXJzaW9uIiwNCi0gICAgICAgICAgICBwb3J0TmFtZT0iVmVyc2lvblBvcnQiLA0KLSAgICAgICAgICAgIHdzZGxMb2NhdGlvbj0iTUVUQS1JTkYvdmVyc2lvbi53c2RsIikNCi1wdWJsaWMgY2xhc3MgVmVyc2lvbiB7DQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAgICAgcmV0dXJuICJIZWxsbyBJIGFtIEF4aXMyIHZlcnNpb24gc2VydmljZSAsIiArDQotICAgICAgICAgICAgICAgICIgTXkgdmVyc2lvbiBpcyAiICsgb3JnLmFwYWNoZS5heGlzMi5WZXJzaW9uLmdldFZlcnNpb25UZXh0KCk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvUkVBRE1FLnR4dCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWM1MmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLVNhbXBsZTogbWV4IChNZXRhZGF0YSBFeGNoYW5nZSkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGUgZXhhbXBsZXMgcHJvdmlkZWQgZGVtb3N0cmF0ZXMgZGF0YSByZXRyaWV2YWwgZm9yIFdTLU1ldGFkYXRhRXhjaGFuZ2UgR2V0TWV0YWRhdGEgcmVxdWVzdA0KLWhhbmRsZWQgYnkgZGlmZmVyZW50IGxldmVsIG9mIGRhdGEgbG9jYXRvcnMgYmVsb3c6IA0KLSAgMS4gRGVmYXVsdCBBeGlzMiBkYXRhIGxvY2F0b3INCi0gIDIuIFBsdWctaW4gc2VydmljZSBsZXZlbCBkYXRhIGxvY2F0b3INCi0gIDMuIFBsdWctaW4gc2VydmljZSBzZXZlbCBXU0RMLXNwZWNpZmljIGRhdGEgbG9jYXRvcg0KLQ0KLU5vdGU6IEV4YW1wbGUgMiBhbmQgMyBhcmUgb25seSBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBkZW1vc3RyYXRpbmcgcGx1Zy1pbiBkYXRhIGxvY2F0b3Igc3VwcG9ydC4gVGhlDQotICAgICAgZGF0YSByZXRyaWV2YWwgbG9naWMgZm9yIHRoZSBwbHVnLWluIGRhdGEgbG9jYXRvcnMgYXJlIG5vdCBpbXBsZW1lbnRlZC4NCi0NCi1EZXRhaWxzIGZvciB0aGUgZXhhbXBsZXMgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIEFwYWNoZSBNZXRhZGF0YSBFeGNoYW5nZSBVc2VyJ3MgR3VpZGUuDQotDQotUHJlcmVxdWlzaXRlcyAgDQotPT09PT09PT09PT09PQ0KLQ0KLVRvIGJ1aWxkIHRoZSBzYW1wbGUgc2VydmljZSB5b3UgbXVzdCBoYXZlIGFudC0xLjYueCBpbnN0YWxsZWQgaW4geW91ciBzeXN0ZW0uIA0KLQ0KLVRvIHNldCBBWElTMl9IT01FIGluIFVuaXgvTGludXggdHlwZToNCi0kZXhwb3J0IEFYSVMyX0hPTUU9PHBhdGggdG8gYXhpczIgZGlzdHJpYnV0aW9uPg0KLQ0KLW1ldGFkYXRhRXhjaGFuZ2UgbW9kdWxlIG11c3QgYmUgZGVwbG95ZWQgYW5kIGVuZ2FnZWQuIA0KLVBsZWFzZSByZWZlciB0byBBcGFjaGUgTWV0YWRhdGEgRXhjaGFuZ2UgVXNlcidzIEd1aWRlIGZvciBob3cgdG8gZGVwbG95IGFuZCBlbmdhZ2UgDQotdGhlIG1ldGFkYXRhRXhjaGFuZ2UgbW9kdWxlLg0KLQ0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UbyBidWlsZCB0aGUgc2FtcGxlIHNlcnZpY2UsIHR5cGU6ICRhbnQgZ2VuZXJhdGUuc2VydmljZSBvciBqdXN0IGFudA0KLQ0KLVRoaXMgd2lsbCBidWlsZCB0aGUgRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIsIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yRGVtb1NlcnZpY2UuYWFyLA0KLWFuZCBXU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgc2VydmljZSBhcmNoaXZlIGZpbGVzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIGNvcHkgdGhlbSB0byB0aGUNCi08QVhJUzJfSE9NRT4vcmVwb3NpdG9yeS9zZXJ2aWNlcyBkaXJlY3RvcnkuDQotDQotWW91IGNhbiBzdGFydCB0aGUgQXhpczIgc2VydmVyIGJ5IHJ1bm5pbmcgZWl0aGVyIGF4aXMyc2VydmVyLmJhdCAob24gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2gNCi0ob24gTGludXgpdGhhdCBhcmUgbG9jYXRlZCBpbiA8QVhJUzJfSE9NRT4vYmluIGRpcmVjdG9yeS4NCi0NCi1UaGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoNCi0NCi1odHRwOi8vPHlvdXJob3N0Pjo8eW91cnBvcnQ+L2F4aXMyL3NlcnZpY2VzL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2U/d3NkbCANCi0oZS5nLiBodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZT93c2RsKQ0KLQ0KLVRoZSBjbGllbnRzIHRvIHNlbmQgR2V0TWV0YWRhdGEgcmVxdWVzdHMgYXJlIGF2YWlsYWJsZSBpbiBzYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9jbGllbnRzIGRpcmVjdG9yeS4NCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi1UbyBjb21waWxlIGFuZCBydW4gRGVmYXVsdCBBeGlzMiBkYXRhIGxvY2F0b3Igc2NlbmFyaW8sIHR5cGUNCi0kYW50IHJ1bi5jbGllbnQuZGVmYXVsdA0KLQ0KLVRvIGNvbXBpbGUgYW5kIHJ1biBQbHVnLWluIHNlcnZpY2UgbGV2ZWwgQXhpczIgZGF0YSBsb2NhdG9yIHNjZW5hcmlvLCB0eXBlDQotJGFudCBydW4uY2xpZW50LnNlcnZpY2UNCi0NCi1UbyBjb21waWxlIGFuZCBydW4gUEx1Zy1pbiBXU0RMLXNwZWNpZmljIGxldmVsIEF4aXMyIGRhdGEgbG9jYXRvciBzY2VuYXJpbywgdHlwZQ0KLSRhbnQgcnVuLmNsaWVudC53c2RsDQotDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCi0NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2I0MDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0ibWV4IiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFpbkRpciIgdmFsdWU9Ii4uLy4uIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iYnVpbGQvY2xhc3NlcyIvPgotICAgIDxwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC91c2VyZ3VpZGVNZXguamFyIi8+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50LmFsbCIKLSAgICAgICAgICAgIGRlcGVuZHM9InJ1bi5jbGllbnQuZGVmYXVsdCxydW4uY2xpZW50LnNlcnZpY2UscnVuLmNsaWVudC53c2RsIj4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgotICAgIAkJPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iIC8+Ci0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiIC8+Ci0JCTwvamF2YWM+Ci0JCTxqYXIgZGVzdGZpbGU9ImJ1aWxkL3VzZXJndWlkZU1leC5qYXIiPgotICAgICAgICAgICAgCQk8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICAJCTxpbmNsdWRlIG5hbWU9InVzZXJndWlkZS8qKiIvPgotICAgICAgICAgICAgCQk8L2ZpbGVzZXQ+Ci0gICAgICAgCQk8L2phcj4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICAgICAgPGphciBkZXN0ZmlsZT0iYnVpbGQvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxLyoqLyouY2xhc3MiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxjb3B5IGZpbGU9ImJ1aWxkL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2UuYWFyIiB0b2ZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLmFhciIgPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUyLyoqLyouY2xhc3MiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxjb3B5IGZpbGU9ImJ1aWxkL1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yRGVtb1NlcnZpY2UuYWFyIiB0b2ZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMvU2VydmljZUxldmVsRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9XU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMy8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzLyoqLyouY2xhc3MiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxjb3B5IGZpbGU9ImJ1aWxkL1dTRExEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLmFhciIgdG9maWxlPSIuLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzL1dTRExEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLmFhciIgb3ZlcndyaXRlPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudC5kZWZhdWx0IiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUubWV4LmNsaWVudHMuRGVtb0RlZmF1bHREYXRhTG9jYXRvciIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfS9yZXBvc2l0b3J5Ii8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQuc2VydmljZSIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLm1leC5jbGllbnRzLkRlbW9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfS9yZXBvc2l0b3J5Ii8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQud3NkbCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLm1leC5jbGllbnRzLkRlbW9XU0RMU2VydmljZURhdGFMb2NhdG9yIgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9L3JlcG9zaXRvcnkiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAKLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5kYXRhbG9jYXRvcnMuc2VydmljZSIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLm1leC5kYXRhbG9jYXRvcnMuU2VydmljZUxldmVsRGF0YUxvY2F0b3IiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0vcmVwb3NpdG9yeSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5kYXRhbG9jYXRvcnMud3NkbCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLm1leC5kYXRhbG9jYXRvcnMuV1NETERhdGFMb2NhdG9yIgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9L3JlcG9zaXRvcnkiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCI+Ci0JPGVjaG8gbWVzc2FnZT0iUGxlYXNlIHVzZSB0aGUgZm9sbG93aW5nIGFudCB0YXJnZXRzIHRvIHJ1biB0aGUgY2xpZW50cyIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50LmRlZmF1bHQiIC8+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5zZXJ2aWNlIiAvPgotCTxlY2hvIG1lc3NhZ2U9InJ1bi5jbGllbnQud3NkbCIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50LmFsbCAgLSAgcnVuIGFsbCBjbGllbnRzIiAvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCTxkZWxldGUgZGlyPSJidWlsZCIgLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb0RlZmF1bHREYXRhTG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vRGVmYXVsdERhdGFMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNDhkMmMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vRGVmYXVsdERhdGFMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguY2xpZW50czsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuY2xpZW50Lk1leENsaWVudDsKLQotLyoqCi0gKiBTYW1wbGUgdG8gZGVtb3N0cmF0ZSAgdXNpbmcgRGVmYXV0bCBBeGlzIDIgRGF0YSBMb2NhdG9yIHRvIHBlcmZvcm0gZGF0YSByZXRyaWV2YWwgCi0gKiBmb3IgdGhlIFdTLU1FWCBHZXRNZXRhZGF0YSByZXF1ZXN0LgotICogCi0gKiBJbiB0aGUgZXhhbXBsZSwgbm8gRGF0YSBMb2NhdG9yIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIEF4aXMyLnhtbCBub3IgdGhlIHNlcnZpY2VzLnhtbC4KLSAqIAotICogQmVmb3JlIHJ1bm5pbmcgdGhlIHNhbXBsZSwgeW91IG11c3QgZmlyc3QgZGVwbG95IHRoZSBBeGlzIDIgc2FtcGxlIERlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZSBzZXJ2aWNlIGkuZS4KLSAqIERlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgZmlsZS4gIAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIERlbW9EZWZhdWx0RGF0YUxvY2F0b3IgewotCi0gICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9EZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBnZXRNZXRhZGF0YSBmb3IgIiArIHRhcmdldEVQUi5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgCi0gICAgICAgICAgICBNZXhDbGllbnQgc2VydmljZUNsaWVudCA9ICBuZXcgTWV4Q2xpZW50KCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldEFjdGlvbihEUkNvbnN0YW50cy5TUEVDLkFjdGlvbnMuR0VUX01FVEFEQVRBX1JFUVVFU1QpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJObyBEYXRhTG9jYXRvciBjb25maWd1cmVkISBVc2VkIEF4aXNEYXRhTG9jYXRvciIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gc2VydmljZUNsaWVudC5zZXR1cEdldE1ldGFkYXRhUmVxdWVzdChudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShtZXRob2QpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLQkJCQlyZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotCQkJCSAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKSk7Ci0JCQl9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIAotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9jbGllbnRzL0RlbW9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM5YTg5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguY2xpZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5EUkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuY2xpZW50Lk1leENsaWVudDsKLQotLyoqCi0gKiBTYW1wbGUgdG8gZGVtb3N0cmF0ZSAgdXNpbmcgVXNlci1kZWZpbmVkIFNlcnZpY2UgbGV2ZWwgRGF0YSBMb2NhdG9yIHRvIHBlcmZvcm0gZGF0YSByZXRyaWV2YWwgCi0gKiBmb3IgdGhlIFdTLU1FWCBHZXRNZXRhZGF0YSByZXF1ZXN0LgotICogCi0gKiBJbiB0aGUgZXhhbXBsZSwgZGF0YUxvY2F0b3IgZWxlbWVudCB3YXMgYWRkZWQgaW4gdGhlIHNlcnZpY2VzLnhtbCBvZiB0aGUgdGFyZ2V0IFNlcnZpY2UuCi0gKiAKLSAqIEJlZm9yZSBydW5uaW5nIHRoZSBzYW1wbGUsIHlvdSBtdXN0IGZpcnN0IGRlcGxveSB0aGUgQXhpcyAyIHNhbXBsZSBTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIHNlcnZpY2UgaS5lLgotICogU2VydmljZUxldmVsRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgZmlsZS4gIAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIERlbW9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotCQkJImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIik7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpICsgIiBUZXN0IGdldE1ldGFkYXRhIGZvciAiICsgdGFyZ2V0RVBSLmdldEFkZHJlc3MoKSk7Ci0JCQlNZXhDbGllbnQgc2VydmljZUNsaWVudCA9IG5ldyBNZXhDbGllbnQoKTsKLQkJCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0JCQlzZXJ2aWNlQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0JICAgICAgICBvcHRpb25zLnNldEFjdGlvbihEUkNvbnN0YW50cy5TUEVDLkFjdGlvbnMuR0VUX01FVEFEQVRBX1JFUVVFU1QpOwotCSAgICAgICAgCi0JICAgICAgICBTdHJpbmcgaWRlbnRpZmllciA9IG51bGw7ICAgIAotCQkgICAgT01FbGVtZW50IG1ldGhvZCA9IHNlcnZpY2VDbGllbnQuc2V0dXBHZXRNZXRhZGF0YVJlcXVlc3QoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfV1NETCwgaWRlbnRpZmllcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZXJ2aWNlQ2xpZW50LnNlbmRSZWNlaXZlKG1ldGhvZCk7Ci0gICAgIAotCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0KLQkJfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotCQkJYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vV1NETFNlcnZpY2VEYXRhTG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvY2xpZW50cy9EZW1vV1NETFNlcnZpY2VEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2QyNzM1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2NsaWVudHMvRGVtb1dTRExTZXJ2aWNlRGF0YUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRSQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5jbGllbnQuTWV4Q2xpZW50OwotCi0vKioKLSAqIFNhbXBsZSB0byBkZW1vc3RyYXRlICB1c2luZyBVc2VyLWRlZmluZWQgU2VydmljZSBsZXZlbCBXU0RMIGRpYWxlY3Qgc3BlY2lmaWMgCi0gKiBEYXRhIExvY2F0b3IgdG8gcGVyZm9ybSBkYXRhIHJldHJpZXZhbGZvciB0aGUgV1MtTUVYIEdldE1ldGFkYXRhIHJlcXVlc3QuCi0gKiAKLSAqIEluIHRoZSBleGFtcGxlLCBkaWFsZWN0TG9jYXRvciBmb3IgZGlhbGVjdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gKiBlbGVtZW50IHdhcyBhZGRlZCBpbiB0aGUgc2VydmljZXMueG1sIG9mIHRoZSB0YXJnZXQgU2VydmljZS4KLSAqIAotICogQmVmb3JlIHJ1bm5pbmcgdGhlIHNhbXBsZSwgeW91IG11c3QgZmlyc3QgZGVwbG95IHRoZSBBeGlzIDIgc2FtcGxlICJXU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZSIgc2VydmljZSBpLmUuCi0gKiBXU0RMRGF0YUxvY2F0b3JEZW1vU2VydmljZS5hYXIgZmlsZS4gIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZW1vV1NETFNlcnZpY2VEYXRhTG9jYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKAotCSJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvV1NETERhdGFMb2NhdG9yRGVtb1NlcnZpY2UiKTsKLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLXRyeSB7Ci0JU3lzdGVtLm91dAotCQkJLnByaW50bG4oIlRlc3QgZ2V0TWV0YWRhdGEgZm9yICIgKyB0YXJnZXRFUFIuZ2V0QWRkcmVzcygpKTsKLQlTeXN0ZW0ub3V0Ci0JLnByaW50bG4oIlNlcnZpY2UgV1NETCBzcGVjaWZpYyBEYXRhTG9jYXRvciB3YXMgY29uZmlndXJlZCIpOwotCi0JTWV4Q2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgTWV4Q2xpZW50KCk7Ci0JT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLQlvcHRpb25zLnNldEFjdGlvbihEUkNvbnN0YW50cy5TUEVDLkFjdGlvbnMuR0VUX01FVEFEQVRBX1JFUVVFU1QpOwotICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAKLQlzZXJ2aWNlQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgU3RyaW5nIGlkZW50aWZpZXIgPSAgbnVsbDsgICAKLSAgICBPTUVsZW1lbnQgbWV0aG9kID0gc2VydmljZUNsaWVudC5zZXR1cEdldE1ldGFkYXRhUmVxdWVzdChEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9XU0RMLCBpZGVudGlmaWVyKTsKLSAgICAKLSAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VydmljZUNsaWVudC5zZW5kUmVjZWl2ZShtZXRob2QpOwotCi0JU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdCk7Ci0KLX0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLQlheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci19Ci19Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9kYXRhbG9jYXRvcnMvR2xvYmFsRGF0YUxvY2F0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9HbG9iYWxEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjdlYzQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9HbG9iYWxEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5kYXRhbG9jYXRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkF4aXNEYXRhTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuRFJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGFSZXRyaWV2YWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLkRhdGFSZXRyaWV2YWxSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YXJldHJpZXZhbC5PdXRwdXRGb3JtOwotCi0vKgotICogU2FtcGxlIHVzZXItZGVmaW5lZCBHbG9iYWwgTGV2ZWwgTG9jYXRvciwgR2xvYmFsRGF0YUxvY2F0b3IKLSAqIAotICogVGhlIHNhbXBsZSBEYXRhIExvY2F0b3IgaW1wbGVtZW50ZWQgc3VwcG9ydHMgZGF0YSByZXRyaWV2YWwgZm9yIHRoZSBQb2xpY3kgYW5kIFNjaGVtYQotICogZGlhbGVjdHMuIEZvciBkaWFsZWN0cyB0aGF0IGl0IGRvZXMgbm90IHVuZGVyc3RhbmQsIGl0IGRlbGVnYXRlcyB0aGUgcmVxdWVzdAotICogdG8gdGhlIGF2YWlsYWJsZSBEYXRhIExvY2F0b3JzIGluIHRoZSBoaWVyYWNoeSBieSByZXR1cm5pbmcgUmVzdWx0IHdpdGgKLSAqIHVzZURhdGFMb2NhdG9ySGllcmFjaHkgaW5kaWNhdG9yIHNldC4KLSAqIAotICogU2VlICB7QGxpbmsgRGVtb1NlcnZpY2VMZXZlbERhdGFMb2NhdG9yfSBmb3Igc3RlcHMgdG8gaW52b2tlIGdldERhdGEgQVBJCi0gKiBvZiB0aGlzIERhdGEgTG9jYXRvci4gICAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgR2xvYmFsRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBBeGlzRGF0YUxvY2F0b3IgewotCi0JcHVibGljIERhdGFbXSBnZXREYXRhKERhdGFSZXRyaWV2YWxSZXF1ZXN0IHJlcXVlc3QsCi0JCQlNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgRGF0YVJldHJpZXZhbEV4Y2VwdGlvbiB7Ci0JCURhdGFbXSBvdXRwdXQgPSBudWxsOwotICAgICAgICBTdHJpbmcgZGlhbGVjdCA9IHJlcXVlc3QuZ2V0RGlhbGVjdCgpOwotICAgICAgICBPdXRwdXRGb3JtIGZvcm0gPSByZXF1ZXN0LmdldE91dHB1dEZvcm0oKTsKLSAgICAgICAgaWYgKGZvcm0gPT0gT3V0cHV0Rm9ybS5SRUZFUkVOQ0VfRk9STSl7Ci0gICAgICAgIAkKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlhbGVjdC5lcXVhbHMoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfUE9MSUNZKSB8fCBkaWFsZWN0LmVxdWFscyhEUkNvbnN0YW50cy5TUEVDLkRJQUxFQ1RfVFlQRV9TQ0hFTUEpKXsKLSAgICAgICAJIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIGhhcyBub3QgaW1wbGVtZW50ZWQgZGF0YSByZXRyaWV2YWwgZm9yIGRpYWxlY3QgIiArIGRpYWxlY3QpOwotICAgICAgICAJIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgCSBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEgZ2V0IEF4aXMyIGRlZmF1bHQgRGF0YSBMb2NhdG9yIHRvIHJldHJpZXZlIGRhdGEgZm9yICIgKyBkaWFsZWN0KTsKLQotICAgICAgIAkvLyByZXN1bHQgPSBuZXcgUmVzdWx0KCk7Ci0gICAgICAgIAkvLyByZXN1bHQuc2V0VXNlRGF0YUxvY2F0b3JIaWVyYWNoeSh0cnVlKTsKLSAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgCSBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEgU2VydmljZUxldmVsRGF0YUxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCBkaWFsZWN0ICIgKyBkaWFsZWN0KTsKLSAgICAgICAJIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgCSBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEgZ2V0IEF4aXMyIGRlZmF1bHQgRGF0YSBMb2NhdG9yIHRvIHJldHJpZXZlIGRhdGEgZm9yICIgKyBkaWFsZWN0KTsKLSAgICAgICAgCS8vIHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICAgICAgCS8vIHJlc3VsdC5zZXRVc2VEYXRhTG9jYXRvckhpZXJhY2h5KHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dHB1dDsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9kYXRhbG9jYXRvcnMvU2VydmljZUxldmVsRGF0YUxvY2F0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODYxZDIwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1c2VyZ3VpZGUubWV4LmRhdGFsb2NhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRhdGFyZXRyaWV2YWwuKjsKLQotLyoKLSAqIFNhbXBsZSBTZXJ2aWNlIExldmVsIExvY2F0b3IKLSAqIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIGlzIGNvbmZpZ3VyZWQgYXMgYSBTZXJ2aWNlIGxldmVsIERhdGEgTG9jYXRvciAKLSAqIGZvciB0aGUgU2FtcGxlIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yRGVtb1NlcnZpY2Ugc2VydmljZS4KLSAqIAotICogVGhlIHNhbXBsZSBEYXRhIExvY2F0b3IgaXMgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVtb3N0cmF0aW5nIGFuIGltcGxlbWVudGF0aW9uIG9mCi0gKiB1c2VyLWRlZmluZWQgU2VydmljZSBMZXZlbCBEYXRhIExvY2F0b3IsIHRoZSBhY3R1YWwgZGF0YSByZXRyaWV2YWwgY29kZSBpcyBub3QgaW1wbGVtZW50ZWQuCi0gKiBJbiB0aGUgZXhhbXBsZSwgYSBlbXB0eSBEYXRhIGFycmF5IGlzIHJldHVybmVkIGZvciBQb2xpY3kgYW5kIFNjaGVtYSBkYXRhIHJldHJpZXZhbAotICogcmVxdWVzdCwgYW5kIGEgbnVsbCBEYXRhIGFycmF5IGlzIHJldHVybmVkIGZvciBXU0RMIGRhdGEgcmV0cmlldmFsLiAKLSAqIAotICogTm90ZTogRW1wdHkgRGF0YSBhcnJheSBtZWFucyBEYXRhIExvY2F0b3IgdW5kZXJzdG9vZCB0aGUgcmVxdWVzdCwgaG93ZXZlciBkYXRhCi0gKiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgRGlhbGVjdDsgYSBudWxsIGRhdGEgYXJyYXkgbWVhbnMgRGF0YSBMb2NhdG9yIGRvZXMgbm90IHVuZGVyc3RhbmQKLSAqIHRoZSByZXF1ZXN0LgotICogCi0gKiBSdW4gIHtAbGluayBEZW1vU2VydmljZUxldmVsRGF0YUxvY2F0b3J9IGNsaWVudCBjb2RlIHRvIGludm9rZSB0aGlzIHNhbXBsZSBkYXRhIGxvY2F0b3IuIAotICogICAgCi0gKi8KLQotcHVibGljIGNsYXNzIFNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIGltcGxlbWVudHMgQXhpc0RhdGFMb2NhdG9yIHsKLQotCXB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkKLQkJCQkJCSsgIiAhISEhIHVzZXJndWlkZS5tZXguZGF0YWxvY2F0b3JzLlNlcnZpY2VMZXZlbERhdGFMb2NhdG9yIHBlcmZvcm1pbmcgZ2V0RGF0YSAhISEhIik7Ci0KLQkJU3lzdGVtLm91dAotCQkJCS5wcmludCgiICEhISBTRVJWSUNFIExFVkVMIERhdGEgTG9jYXRvciBzdXBwb3J0cyBQb2xpY3kgYW5kIFNjaGVtYSBkaWFsZWN0cyBvbmx5ICEhISIpOwotCQlEYXRhW10gcmVzdWx0ID0gbnVsbDsKLQotCQlTdHJpbmcgZGlhbGVjdCA9IHJlcXVlc3QuZ2V0RGlhbGVjdCgpOwotCQlpZiAoZGlhbGVjdC5lcXVhbHMoRFJDb25zdGFudHMuU1BFQy5ESUFMRUNUX1RZUEVfUE9MSUNZKQotCQkJCXx8IGRpYWxlY3QuZXF1YWxzKERSQ29uc3RhbnRzLlNQRUMuRElBTEVDVF9UWVBFX1NDSEVNQSkpIHsKLQkJCS8vIFlvdSBtYXkgaW1wbGVtZW50IGxvZ2ljIHRvIHJldHJpZXZlIFBvbGljeSBhbmQgU2NoZW1hIG1ldGFkYXRhIGhlcmUhIQotCQkJLy8KLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50KCJTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciBoYXMgbm90IGltcGxlbWVudGVkIGRhdGEgcmV0cmlldmFsIGZvciBkaWFsZWN0ICIKLQkJCQkJCQkrIGRpYWxlY3QpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIiEhISEgUmV0dXJuIGVtcHR5IERhdGEgbWVhbnMgdGhlIERhdGEgTG9jYXRvciB1bmRlcnN0b29kIHRoZSByZXF1ZXN0IGZvciBEaWFsZWN0LCBidXQgbm8gZGF0YSBpcyBhdmFpbGFibGUgZm9yIHRoZSBkaWFsZWN0Iik7Ci0JCQlyZXN1bHQgPSBuZXcgRGF0YVswXTsKLQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiISEhISBTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IGRpYWxlY3QgIgotCQkJCQkJCSsgZGlhbGVjdCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiISEhISBSZXR1cm4gTnVsbCBEYXRhIG1lYW5zIGVzY2FsYXRlIHRvIHRoZSBBeGlzMiBkZWZhdWx0IERhdGEgTG9jYXRvciB0byByZXRyaWV2ZSBkYXRhIGZvciAiCi0JCQkJCQkJKyBkaWFsZWN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkJCi0JCQotCQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvZGF0YWxvY2F0b3JzL1dTRExEYXRhTG9jYXRvci5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvZGF0YWxvY2F0b3JzL1dTRExEYXRhTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdjNzAxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L2RhdGFsb2NhdG9ycy9XU0RMRGF0YUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5kYXRhbG9jYXRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhcmV0cmlldmFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLQotLyoKLSAqIFNhbXBsZSB1c2VyLWRlZmluZWQgV1NETCBEYXRhIExvY2F0b3IsIFdTRExEYXRhTG9jYXRvciBpcyBjb25maWd1cmVkIGFzIGEgU2VydmljZSBsZXZlbCAKLSAqIFdTREwgc3BlY2lmaWMgRGF0YSBMb2NhdG9yIGZvciB0aGUgU2FtcGxlIFdTRExEYXRhU2VydmljZU15U2VydmljZSBzZXJ2aWNlLgotICogCi0gKiBUaGUgc2FtcGxlIERhdGEgTG9jYXRvciBpcyBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiBkZW1vc3RyYXRpbmcgYW4gaW1wbGVtZW50YXRpb24gb2YKLSAqIHVzZXItZGVmaW5lZCBTZXJ2aWNlIExldmVsIERpYWxlY3QgRGF0YSBMb2NhdG9yLCB0aGUgYWN0dWFsIGRhdGEgcmV0cmlldmFsIGNvZGUgaXMgbm90IGltcGxlbWVudGVkLgotICogSW4gdGhlIGV4YW1wbGUsIGEgZW1wdHkgRGF0YSBhcnJheSBpcyByZXR1cm5lZCBmb3IgV1NETCBkYXRhIHJldHJpZXZhbAotICogcmVxdWVzdC4KLSAqIAotICogTm90ZTogRW1wdHkgRGF0YSBhcnJheSBtZWFucyBEYXRhIExvY2F0b3IgdW5kZXJzdG9vZCB0aGUgcmVxdWVzdC4KLSAqIAotICogUnVuICB7QGxpbmsgRGVtb1NlcnZpY2VXU0RMU2VydmljZUxvY2F0b3J9IGNsaWVudCBjb2RlIHRvIGludm9rZSB0aGlzIHNhbXBsZSBkYXRhIGxvY2F0b3IuIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRGF0YUxvY2F0b3IgaW1wbGVtZW50cyBBeGlzRGF0YUxvY2F0b3IgewotCUF4aXNTZXJ2aWNlIHRoZVNlcnZpY2UgPSBudWxsOwotCi0JU3RyaW5nIHNlcnZpY2VOYW1lID0gIldTRExEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIjsKLQotCXB1YmxpYyBEYXRhW10gZ2V0RGF0YShEYXRhUmV0cmlldmFsUmVxdWVzdCByZXF1ZXN0LAotCQkJTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIERhdGFSZXRyaWV2YWxFeGNlcHRpb24gewotCQlEYXRhW10gcmVzdWx0ID0gbmV3IERhdGFbMF07Ci0JCVN5c3RlbS5vdXQucHJpbnQoc2VydmljZU5hbWUKLQkJCQkrICIgVXNlci1kZWZpbmVkIFdTREwgRGF0YSBMb2NhdG9yIGhhcyBiZWVuIGludm9rZWQhISEiKTsKLQkJLy8gWW91IG1heSBpbXBsZW1lbnQgbG9naWMgdG8gcmV0cmlldmUgV1NETCBtZXRhZGF0YSBoZXJlISEKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnQoIldTRExEYXRhTG9jYXRvciBoYXMgbm90IGltcGxlbWVudGVkIGRhdGEgcmV0cmlldmFsLiIpOwotIAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9EZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9EZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTNhNzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpuczE9Imh0dHA6Ly9vcmcuYXBhY2hlLmF4aXMyL3hzZCIgeG1sbnM6c29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iIHhtbG5zOm5zMD0iaHR0cDovL2V4YW1wbGUxLnNlcnZpY2VzLm1leC51c2VyZ3VpZGUveHNkIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczpheGlzMj0iaHR0cDovL2V4YW1wbGUxLnNlcnZpY2VzLm1leC51c2VyZ3VpZGUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUxLnNlcnZpY2VzLm1leC51c2VyZ3VpZGUiPjx3c2RsOmRvY3VtZW50YXRpb24+Ci0gICAgIFNhbXBsZSB3ZWIgc2VydmljZSB0byBkZW1vc3RyYXRlIHVzZSBvZiBEZWZhdWx0IEF4aXMyIERhdGEgTG9jYXRvciB0byBoYW5kbGUgd3MtbWV4IEdldE1ldGFkYXRhIHJlcXVlc3QuICAgICAgIAotICAgICA8L3dzZGw6ZG9jdW1lbnRhdGlvbj48d3NkbDp0eXBlcz48eHM6c2NoZW1hIHhtbG5zOm5zPSJodHRwOi8vZXhhbXBsZTEuc2VydmljZXMubWV4LnVzZXJndWlkZS94c2QiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9leGFtcGxlMS5zZXJ2aWNlcy5tZXgudXNlcmd1aWRlL3hzZCI+Ci08eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uRmF1bHQiPgotPHhzOmNvbXBsZXhUeXBlPgotPHhzOnNlcXVlbmNlPgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0IiB0eXBlPSJ4czphbnlUeXBlIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08eHM6ZWxlbWVudCBuYW1lPSJnZXRWZXJzaW9uUmVzcG9uc2UiPgotPHhzOmNvbXBsZXhUeXBlPgotPHhzOnNlcXVlbmNlPgotPHhzOmVsZW1lbnQgbmFtZT0icmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotPC94czpzZXF1ZW5jZT4KLTwveHM6Y29tcGxleFR5cGU+Ci08L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT48L3dzZGw6dHlwZXM+PHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRWZXJzaW9uTWVzc2FnZSIgLz48d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+PHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnMwOmdldFZlcnNpb25SZXNwb25zZSIgLz48L3dzZGw6bWVzc2FnZT48d3NkbDptZXNzYWdlIG5hbWU9ImdldFZlcnNpb25GYXVsdCI+PHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnMwOmdldFZlcnNpb25GYXVsdCIgLz48L3dzZGw6bWVzc2FnZT48d3NkbDpwb3J0VHlwZSBuYW1lPSJEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VQb3J0VHlwZSI+PHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPjx3c2RsOmlucHV0IHhtbG5zOndzYXc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDYvMDUvYWRkcmVzc2luZy93c2RsIiBtZXNzYWdlPSJheGlzMjpnZXRWZXJzaW9uTWVzc2FnZSIgd3NhdzpBY3Rpb249InVybjpnZXRWZXJzaW9uIiAvPjx3c2RsOm91dHB1dCBtZXNzYWdlPSJheGlzMjpnZXRWZXJzaW9uUmVzcG9uc2UiIC8+PHdzZGw6ZmF1bHQgbWVzc2FnZT0iYXhpczI6Z2V0VmVyc2lvbkZhdWx0IiBuYW1lPSJnZXRWZXJzaW9uRmF1bHQiIC8+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6cG9ydFR5cGU+PHdzZGw6YmluZGluZyBuYW1lPSJEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VTT0FQMTFCaW5kaW5nIiB0eXBlPSJheGlzMjpEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VQb3J0VHlwZSI+PHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj48c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFZlcnNpb24iIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPjwvd3NkbDpvdXRwdXQ+PHdzZGw6ZmF1bHQgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ij48c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz48L3dzZGw6ZmF1bHQ+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6YmluZGluZz48d3NkbDpiaW5kaW5nIG5hbWU9IkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZVNPQVAxMkJpbmRpbmciIHR5cGU9ImF4aXMyOkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZVBvcnRUeXBlIj48c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0VmVyc2lvbiI+PHNvYXAxMjpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFZlcnNpb24iIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiAvPjwvd3NkbDppbnB1dD48d3NkbDpvdXRwdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgLz48L3dzZGw6b3V0cHV0Pjx3c2RsOmZhdWx0IG5hbWU9ImdldFZlcnNpb25GYXVsdCI+PHNvYXAxMjpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9ImdldFZlcnNpb25GYXVsdCIgLz48L3dzZGw6ZmF1bHQ+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6YmluZGluZz48d3NkbDpiaW5kaW5nIG5hbWU9IkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZUh0dHBCaW5kaW5nIiB0eXBlPSJheGlzMjpEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VQb3J0VHlwZSI+PGh0dHA6YmluZGluZyB2ZXJiPSJQT1NUIiAvPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj48aHR0cDpvcGVyYXRpb24gbG9jYXRpb249ImdldFZlcnNpb24iIC8+PHdzZGw6aW5wdXQ+PG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0PjxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiIC8+PC93c2RsOm91dHB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOnNlcnZpY2UgbmFtZT0iRGVmYXVsdEF4aXNEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj48d3NkbDpwb3J0IG5hbWU9IkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZVNPQVAxMXBvcnRfaHR0cCIgYmluZGluZz0iYXhpczI6RGVmYXVsdEF4aXNEYXRhTG9jYXRvckRlbW9TZXJ2aWNlU09BUDExQmluZGluZyI+PHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzE5Mi4xNjguMC4xMDc6ODA4MC9heGlzMi9zZXJ2aWNlcy9EZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PHdzZGw6cG9ydCBuYW1lPSJEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VTT0FQMTJwb3J0X2h0dHAiIGJpbmRpbmc9ImF4aXMyOkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZVNPQVAxMkJpbmRpbmciPjxzb2FwMTI6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzE5Mi4xNjguMC4xMDc6ODA4MC9heGlzMi9zZXJ2aWNlcy9EZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PHdzZGw6cG9ydCBuYW1lPSJEZWZhdWx0QXhpc0RhdGFMb2NhdG9yRGVtb1NlcnZpY2VIdHRwcG9ydDEiIGJpbmRpbmc9ImF4aXMyOkRlZmF1bHRBeGlzRGF0YUxvY2F0b3JEZW1vU2VydmljZUh0dHBCaW5kaW5nIj48aHR0cDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vMTkyLjE2OC4wLjEwNzo4MDgwL2F4aXMyL3Jlc3QvRGVmYXVsdEF4aXNEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIiAvPjwvd3NkbDpwb3J0Pjwvd3NkbDpzZXJ2aWNlPjwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxL01FVEEtSU5GL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2UueHNkIGIvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjM2MjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLXhtbG5zOm5zMD0iaHR0cDovL3NlcnZpY2VzLmV4YW1wbGUub3JnL21leC9pbnRlcm9wL1NlcnZpY2VBLyIgCi14bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvU2VydmljZUEvIiAKLXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUxLnNlcnZpY2VzLm1leC51c2VyZ3VpZGUveHNkIj4KLSA8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0VmVyc2lvbkZhdWx0Ij4gPHhzZDpjb21wbGV4VHlwZT4KLSA8eHNkOnNlcXVlbmNlPgotPHhzZDplbGVtZW50IG5hbWU9ImdldFZlcnNpb25GYXVsdCIgdHlwZT0ieHNkOmFueVR5cGUiLz4KLTwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDplbGVtZW50PgotPHhzZDplbGVtZW50IG5hbWU9ImdldFZlcnNpb25SZXNwb25zZSI+Ci0gPHhzZDpjb21wbGV4VHlwZT48eHNkOnNlcXVlbmNlPgotPHhzZDplbGVtZW50IG5hbWU9InJldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOnNlcXVlbmNlPgotPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDplbGVtZW50PiAgCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9TZXJ2aWNlRGF0YS54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9TZXJ2aWNlRGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MWEyMDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvU2VydmljZURhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08U2VydmljZURhdGE+Ci08RGF0YSBkaWFsZWN0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgZmlsZT0iTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS53c2RsIj4KLSA8VVJMPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9EZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlP3dzZGwgPC9VUkw+Ci08L0RhdGE+Ci08RGF0YSBkaWFsZWN0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZmlsZT0iTUVUQS1JTkYvRGVmYXVsdEF4aXMyRGF0YUxvY2F0b3JEZW1vU2VydmljZS54c2QiPgotIDxVUkw+aHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL0RlZmF1bHRBeGlzMkRhdGFMb2NhdG9yRGVtb1NlcnZpY2U/eHNkIDwvVVJMPgotIDwvRGF0YT4KLTwvU2VydmljZURhdGE+Ci0gCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzgzODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTEvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJEZWZhdWx0QXhpczJEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgIFNhbXBsZSB3ZWIgc2VydmljZSB0byBkZW1vc3RyYXRlIHVzZSBvZiBEZWZhdWx0IEF4aXMyIERhdGEgTG9jYXRvciB0byBoYW5kbGUgd3MtbWV4IEdldE1ldGFkYXRhIHJlcXVlc3QuICAgICAgIAotICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj51c2VyZ3VpZGUubWV4LnNlcnZpY2VzLmV4YW1wbGUxLlZlcnNpb248L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWV0YWRhdGFFeGNoYW5nZSI+Ci0gICAgICA8b3V0cHV0Zm9ybSBkaWFsZWN0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgZm9ybXM9ImlubGluZSxsb2NhdGlvbiIvPgotICAgICAgPG91dHB1dGZvcm0gZm9ybXM9ImxvY2F0aW9uIi8+Ci0gICAgIDwvcGFyYW1ldGVyPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIiAvPgotICAgIDwvb3BlcmF0aW9uPgotPC9zZXJ2aWNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxL1ZlcnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUxL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwODBhYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMS9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguc2VydmljZXMuZXhhbXBsZTE7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICJIZWxsbyBJIGFtIEF4aXMyIHZlcnNpb24gc2VydmljZSAsIiArCi0gICAgICAgICAgICAgICAgIiBNeSB2ZXJzaW9uIGlzICIgKyBvcmcuYXBhY2hlLmF4aXMyLlZlcnNpb24uZ2V0VmVyc2lvblRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTUwNGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTIvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBTYW1wbGUgd2ViIHNlcnZpY2UgdG8gZGVtb3N0cmF0ZSB1c2Ugb2YgIGRlZmluZWQgU2VydmljZSBMZXZlbCBEYXRhIExvY2F0b3IgdG8gaGFuZGxlIHdzLW1leCBHZXRNZXRhZGF0YSByZXF1ZXN0LiAgICAgICAKLSAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj51c2VyZ3VpZGUubWV4LnNlcnZpY2VzLmV4YW1wbGUyLlZlcnNpb248L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFZlcnNpb24iPgotICAgIDxtZXNzYWdlUmVjZWl2ZXIgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIiAvPgotICAgIDwvb3BlcmF0aW9uPgotICAgPGRhdGFMb2NhdG9yIGNsYXNzPSJ1c2VyZ3VpZGUubWV4LmRhdGFsb2NhdG9ycy5TZXJ2aWNlTGV2ZWxEYXRhTG9jYXRvciI+Ci0gICA8L2RhdGFMb2NhdG9yPgotPC9zZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTIvVmVyc2lvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9tZXgvc3JjL3VzZXJndWlkZS9tZXgvc2VydmljZXMvZXhhbXBsZTIvVmVyc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDZiMjYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUyL1ZlcnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLm1leC5zZXJ2aWNlcy5leGFtcGxlMjsKLQotcHVibGljIGNsYXNzIFZlcnNpb24gewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gIkhlbGxvIEkgYW0gQXhpczIgdmVyc2lvbiBzZXJ2aWNlICwiICsKLSAgICAgICAgICAgICAgICAiIE15IHZlcnNpb24gaXMgIiArIG9yZy5hcGFjaGUuYXhpczIuVmVyc2lvbi5nZXRWZXJzaW9uVGV4dCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4Y2EzNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IldTRExEYXRhTG9jYXRvckRlbW9TZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBTYW1wbGUgd2ViIHNlcnZpY2UgdG8gZGVtb3N0cmF0ZSB1c2Ugb2YgIGRlZmluZWQgV1NETCBkaWFsZWN0IHNwZWNmaWMgRGF0YSBMb2NhdG9yIHRvIGhhbmRsZSB3cy1tZXggR2V0TWV0YWRhdGEgcmVxdWVzdC4gICAgICAgCi0gICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+dXNlcmd1aWRlLm1leC5zZXJ2aWNlcy5leGFtcGxlMy5WZXJzaW9uPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4KLSAgICA8bWVzc2FnZVJlY2VpdmVyICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIgLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPGRhdGFMb2NhdG9yPgotICA8ZGlhbGVjdExvY2F0b3IgZGlhbGVjdD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIGNsYXNzPSJ1c2VyZ3VpZGUubWV4LmRhdGFsb2NhdG9ycy5XU0RMRGF0YUxvY2F0b3IiIC8+IAotICAgPC9kYXRhTG9jYXRvcj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL1ZlcnNpb24uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbWV4L3NyYy91c2VyZ3VpZGUvbWV4L3NlcnZpY2VzL2V4YW1wbGUzL1ZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwOTNiZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL21leC9zcmMvdXNlcmd1aWRlL21leC9zZXJ2aWNlcy9leGFtcGxlMy9WZXJzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5tZXguc2VydmljZXMuZXhhbXBsZTM7Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICJIZWxsbyBJIGFtIEF4aXMyIHZlcnNpb24gc2VydmljZSAsIiArCi0gICAgICAgICAgICAgICAgIiBNeSB2ZXJzaW9uIGlzICIgKyBvcmcuYXBhY2hlLmF4aXMyLlZlcnNpb24uZ2V0VmVyc2lvblRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL210b20vUkVBRE1FLnR4dCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA2ODI2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotU2FtcGxlOiBNVE9NIChNZXNzYWdlIFRyYW5zbWlzc2lvbiBPcHRpbWl6YXRpb24gTWVjaGFuaXNtKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLUludHJvZHVjdGlvbjoNCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGNhcGFiaWxpdGllcyBhbmQgcG93ZXIgb2YgTVRPTSBzdXBwb3J0IG9mIEFYSVMyLiBJbiB0aGlzIHNhbXBsZSB0aGUNCi11c2VyIGNhbiBzZW5kIGEgZmlsZSB0byB0aGUgc2VydmljZS4NCi0NCi1QcmVyZXF1aXNpdGVzDQotPT09PT09PT09PT09PQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi0NCi1SdW5uaW5nIHRoZSBTYW1wbGU6DQotPT09PT09PT09PT09PT09PT09PQ0KLTEuIFVzZSBhbnQgZ2VuZXJhdGUuc2VydmljZSBvciBqdXN0IHRoZSBhbnQgY29tbWFuZCBhbG9uZSBpbiB0aGUgQXhpczJfSE9NRS9zYW1wbGUvbXRvbS8gdG8gYnVpbGQgdGhlIHNlcnZpY2UuDQotMi4gR2VuZXJhdGVkIHNlcnZpY2UgZ2V0cyBjb3BpZWQgdG8gdGhlIEFYSVMyX0hPTUUvcmVwb3NpdG9yeS9zZXJ2aWNlcyBhdXRvbWF0aWNhbGx5Lg0KLTMuIFJ1biB0aGUgQVhJUzJfSE9NRS9iaW4vYXhpczJzZXJ2ZXIue3NoL2JhdH0gdG8gc3RhcnQgdGhlIHN0YW5kYWxvbmUgYXhpczIgc2VydmVyLiAoQWx0ZXJuYXRpdmVseQ0KLSAgeW91IGNhbiBkcm9wIHRoZSBzYW1wbGUgaW50byB0aGUgc2VydmljZXMgZGlyZWN0b3J5IG9mIGEgQXhpczIgc2VydmVyIHJ1bm5pbmcgaW4gYSBzZXJ2bGV0IGNvbnRhaW5lcikNCi00LiBVc2UgYW50IGdlbmVyYXRlLmNsaWVudCB0byBidWlsZCB0aGUgY2xpZW50Lg0KLTUuIFVzZSBhbnQgcnVuLmNsaWVudCAtRGZpbGUgImZpbGUgdG8gYmUgc2VudCIgLURkZXN0ICJkZXN0aW5hdGlvbiBmaWxlIG5hbWUiIHRvIHJ1biB0aGUgY2xpZW50Lg0KLQ0KLQ0KLU5vdGUNCi09PT09PT09PT09PT09PQ0KLVNvbWV0aW1lcywgaWYgeW91J3JlIGhhdmluZyB0cm91YmxlIHJ1bm5pbmcgdGhlIGNsaWVudCBzdWNjZXNzZnVsbHksIA0KLUl0IG1heSBiZSBuZWNlc3NhcnkgdG8gY2xlYW4gdGhlIHNlcnZpY2VzIHJlcG9zaXRvcnkgYmVmb3JlIHlvdSBnZW5lcmF0ZSB0aGUgc2VydmljZSwgZGVwbG95IGl0DQotYW5kIHJ1biB0aGUgY2xpZW50LiAoaS5lLiBkZWxldGUgc2VydmljZXMgY3JlYXRlZCBmcm9tIHByZXZpb3VzIHNhbXBsZXMuKQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tdG9tL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxZjgzNWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9tdG9tL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9Im10b20iIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0JPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJjbGllbnQuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsaWVudCIgLz4KLQk8cHJvcGVydHkgbmFtZT0ic2VydmljZS5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vc2VydmljZSIgLz4KLQk8cHJvcGVydHkgbmFtZT0iY2xpZW50LmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtjbGllbnQuZGlyfS9jbGFzc2VzIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJza2VsZXRvbi5wYXRoIiB2YWx1ZT0ic3JjL3NhbXBsZS9tdG9tL3NlcnZpY2UvTVRPTVNhbXBsZVNrZWxldG9uLmphdmEiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImNsaWVudC5wYXRoIiB2YWx1ZT0ic3JjL3NhbXBsZS9tdG9tL2NsaWVudC9DbGllbnQuamF2YSIgLz4KLQk8IS0tIFVTRSBBWElTMl9IT01FIEZPUiBUSElTIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiB2YWx1ZT0iLi4vbGliIiAvPgotCi0JPHBhdGggaWQ9ImNsYXNzLnBhdGgiPgotCQk8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIgLz4KLQkJPC9maWxlc2V0PgotCTwvcGF0aD4KLQotCTwhLS0gQ3JlYXRlIFNlcnZpY2UgLS0+Ci0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotCQk8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiPgotCQkJPGFyZyB2YWx1ZT0iLXVyaSIgLz4KLQkJCTxhcmcgdmFsdWU9IiR7YmFzZWRpcn0vcmVzb3VyY2VzL01UT01TYW1wbGUud3NkbCIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1zcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1hcCIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1zZCIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1wIiAvPgotCQkJPGFyZyB2YWx1ZT0ic2FtcGxlLm10b20uc2VydmljZSIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1vIiAvPgotCQkJPGFyZyB2YWx1ZT0iJHtzZXJ2aWNlLmRpcn0iIC8+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzcy5wYXRoIiAvPgotCQk8L2phdmE+Ci0JCTxjb3B5IGZpbGU9IiR7c2tlbGV0b24ucGF0aH0iIHRvZmlsZT0iJHtzZXJ2aWNlLmRpcn0vJHtza2VsZXRvbi5wYXRofSIgb3ZlcndyaXRlPSJ0cnVlIiAvPgotCQk8YW50Y2FsbCB0YXJnZXQ9Imphci5zZXJ2ZXIiLz4KLQkJPGNvcHkgZmlsZT0iJHtzZXJ2aWNlLmRpcn0vc2FtcGxlLW10b20uYWFyIiB0b2ZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMvc2FtcGxlLW10b20uYWFyIiBvdmVyd3JpdGU9InRydWUiLz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImNoZWNrLXBhcmFtZXRlcnMiPgotCQk8Y29uZGl0aW9uIHByb3BlcnR5PSJwYXJhbWV0ZXJzLnNldCI+Ci0JCQk8YW5kPgotCQkJCTxpc3NldCBwcm9wZXJ0eT0iZGVzdCIgLz4KLQkJCQk8aXNzZXQgcHJvcGVydHk9ImZpbGUiIC8+Ci0JCQk8L2FuZD4KLQkJPC9jb25kaXRpb24+Ci0JCTwhLS0gVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGFuIGlmLWVsc2Ugd29ya2luZyBpbiBhbnQuIFNvbWUgbXVjaCBtb3JlICJBTlR5IiBwZXJzb24gaXMgd2VsY29tZSB0byBpbXByb3ZlIHRoaXMgLS0+Ci0JCTxhbnRjYWxsIHRhcmdldD0icHJpbnQtdXNhZ2UiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByaW50LXVzYWdlIiB1bmxlc3M9InBhcmFtZXRlcnMuc2V0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iYW50IHJ1bi5jbGllbnQgLURmaWxlICZsdDtmaWxlIHRvIGJlIHRyYW5zZmVycmVkJmd0OyAgLURkZXN0ICZsdDtuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBmaWxlJmd0OyIgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gR2VuZXJhdGUgQ2xpZW50IC0tPgotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuY2xpZW50Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIj4KLQkJCTxhcmcgdmFsdWU9Ii11cmkiIC8+Ci0JCQk8YXJnIHZhbHVlPSJyZXNvdXJjZXMvTVRPTVNhbXBsZS53c2RsIiAvPgotCQkJPGFyZyB2YWx1ZT0iLXAiIC8+Ci0JCQk8YXJnIHZhbHVlPSItYXAiIC8+Ci0JCQk8YXJnIHZhbHVlPSJzYW1wbGUubXRvbS5zZXJ2aWNlIiAvPgotCQkJPGFyZyB2YWx1ZT0iLW8iIC8+Ci0JCQk8YXJnIHZhbHVlPSIke2NsaWVudC5kaXJ9IiAvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhPgotCi0JCTxjb3B5IGZpbGU9IiR7Y2xpZW50LnBhdGh9IiB0b2ZpbGU9IiR7Y2xpZW50LmRpcn0vJHtjbGllbnQucGF0aH0iIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQotCQk8bWtkaXIgZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iIC8+Ci0JCTwhLS0gQ29tcGlsZSBjbGllbnQgLS0+Ci0JCTxqYXZhYyBzcmNkaXI9IiR7Y2xpZW50LmRpcn0vc3JjIiBkZXN0ZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLSAgICA8L3RhcmdldD4JCi0KLQk8IS0tIFJ1biBDbGllbnQgLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4uY2xpZW50IiBkZXBlbmRzPSJjaGVjay1wYXJhbWV0ZXJzLGdlbmVyYXRlLmNsaWVudCIgaWY9InBhcmFtZXRlcnMuc2V0Ij4KLQkJPCEtLSBBY2NlcHQgdHdvIGFyZ3VtZW50cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIEFsc28gdXNlIHRoZSBjbGFzcy5wYXRoIHNldCBlYXJsaWVyIC0tPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5tdG9tLmNsaWVudC5DbGllbnQiIGZvcms9InRydWUiPgotCQkJPGFyZyB2YWx1ZT0iLWZpbGUiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke2ZpbGV9IiAvPgotCQkJPGFyZyB2YWx1ZT0iLWRlc3QiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke2Rlc3R9IiAvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYiI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCQk8ZGlyc2V0IGRpcj0iJHtjbGllbnQuY2xhc3Nlcy5kaXJ9IiAvPgotCQkJPC9jbGFzc3BhdGg+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0ICBuYW1lPSJqYXIuc2VydmVyIj4KLQkJPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLmRpcn0vY2xhc3NlcyIgLz4KLQkJPGphdmFjIGRlYnVnPSJvbiIgbWVtb3J5TWF4aW11bVNpemU9IjI1Nm0iIG1lbW9yeUluaXRpYWxTaXplPSIyNTZtIiBmb3JrPSJ0cnVlIiAJCWRlc3RkaXI9IiR7c2VydmljZS5kaXJ9L2NsYXNzZXMiIHNyY2Rpcj0iJHtzZXJ2aWNlLmRpcn0vc3JjIj4KLQkJPGNsYXNzcGF0aCByZWZpZD0iY2xhc3MucGF0aCIvPgotCQk8L2phdmFjPgotCi0JCTxjb3B5IHRvRGlyPSIke3NlcnZpY2UuZGlyfS9jbGFzc2VzL01FVEEtSU5GIiBmYWlsb25lcnJvcj0iZmFsc2UiPgotCQk8ZmlsZXNldCBkaXI9IiR7c2VydmljZS5kaXJ9L3Jlc291cmNlcyI+Ci0JCTxpbmNsdWRlIG5hbWU9IioueG1sIi8+Ci0JCTxpbmNsdWRlIG5hbWU9Iioud3NkbCIvPgotCQk8aW5jbHVkZSBuYW1lPSIqLnhzZCIvPgotCQk8L2ZpbGVzZXQ+Ci0JCTwvY29weT4KLQkJPGphciBkZXN0ZmlsZT0iJHtzZXJ2aWNlLmRpcn0vc2FtcGxlLW10b20uYWFyIj4KLQkJPGZpbGVzZXQgZXhjbHVkZXM9IioqL1Rlc3QuY2xhc3MiIGRpcj0iJHtzZXJ2aWNlLmRpcn0vY2xhc3NlcyIvPgotCQk8L2phcj4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9ImJ1aWxkIiAvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tdG9tL3Jlc291cmNlcy9NVE9NU2FtcGxlLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL210b20vcmVzb3VyY2VzL01UT01TYW1wbGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2IxMTk5ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL210b20vcmVzb3VyY2VzL01UT01TYW1wbGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbXRvbXNhbXBsZS8iCi0JeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLQl4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotCXhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotCXhtbG5zOnhtaW1lPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA1L3htbG1pbWUiCi0JeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL210b21zYW1wbGUvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCQkJYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL210b21zYW1wbGUvIj4KLQkJCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS8wNS94bWxtaW1lIgotCQkJCXNjaGVtYUxvY2F0aW9uPSJ4bWltZS54c2QiIC8+Ci0JCQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnRUeXBlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWxlTmFtZSIKLQkJCQkJCXR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmFyeURhdGEiCi0JCQkJCQl0eXBlPSJ4bWltZTpiYXNlNjRCaW5hcnkiIC8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50UmVxdWVzdCIgdHlwZT0idG5zOkF0dGFjaG1lbnRUeXBlIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnRSZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkF0dGFjaG1lbnRSZXF1ZXN0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0idG5zOkF0dGFjaG1lbnRSZXF1ZXN0IiAvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iQXR0YWNobWVudFJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0idG5zOkF0dGFjaG1lbnRSZXNwb25zZSIgLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJNVE9NU2VydmljZVBvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImF0dGFjaG1lbnQiPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOkF0dGFjaG1lbnRSZXF1ZXN0IgotCQkJCXdzYXc6QWN0aW9uPSJhdHRhY2htZW50IiAvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpBdHRhY2htZW50UmVzcG9uc2UiCi0JCQkJd3NhdzpBY3Rpb249Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvTVRPTVNlcnZpY2VQb3J0VHlwZS9BdHRhY2htZW50UmVzcG9uc2UiIC8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0iTVRPTVNlcnZpY2VTT0FQMTFCaW5kaW5nIgotCQl0eXBlPSJ0bnM6TVRPTVNlcnZpY2VQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiCi0JCQlzdHlsZT0iZG9jdW1lbnQiIC8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJhdHRhY2htZW50Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhdHRhY2htZW50IiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOmJpbmRpbmc+Ci0JPHdzZGw6YmluZGluZyBuYW1lPSJNVE9NU2VydmljZVNPQVAxMkJpbmRpbmciCi0JCXR5cGU9InRuczpNVE9NU2VydmljZVBvcnRUeXBlIj4KLQkJPHNvYXAxMjpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIgotCQkJc3R5bGU9ImRvY3VtZW50IiAvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iYXR0YWNobWVudCI+Ci0JCQk8c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJhdHRhY2htZW50IiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOnNlcnZpY2UgbmFtZT0iTVRPTVNhbXBsZSI+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iTVRPTVNhbXBsZVNPQVAxMXBvcnRfaHR0cCIKLQkJCWJpbmRpbmc9InRuczpNVE9NU2VydmljZVNPQVAxMUJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvTVRPTVNhbXBsZSIgLz4KLQkJPC93c2RsOnBvcnQ+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iTVRPTVNhbXBsZVNPQVAxMnBvcnRfaHR0cCIKLQkJCWJpbmRpbmc9InRuczpNVE9NU2VydmljZVNPQVAxMkJpbmRpbmciPgotCQkJPHNvYXAxMjphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NVE9NU2FtcGxlIiAvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL210b20vcmVzb3VyY2VzL3htaW1lLnhzZCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9yZXNvdXJjZXMveG1pbWUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MjYwODEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9yZXNvdXJjZXMveG1pbWUueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JeG1sbnM6eG1pbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDUveG1sbWltZSI+Ci0JPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSI+Ci0JCTx4czpzaW1wbGVUeXBlPgotCQkJPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0JCQkJPHhzOm1pbkxlbmd0aCB2YWx1ZT0iMyIgLz4KLQkJCTwveHM6cmVzdHJpY3Rpb24+Ci0JCTwveHM6c2ltcGxlVHlwZT4KLQk8L3hzOmF0dHJpYnV0ZT4KLQk8eHM6YXR0cmlidXRlIG5hbWU9ImV4cGVjdGVkQ29udGVudFR5cGVzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0JPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEJpbmFyeSI+Ci0JCTx4czpzaW1wbGVDb250ZW50PgotCQkJPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpiYXNlNjRCaW5hcnkiPgotCQkJCTx4czphdHRyaWJ1dGUgcmVmPSJ4bWltZTpjb250ZW50VHlwZSIgLz4KLQkJCTwveHM6ZXh0ZW5zaW9uPgotCQk8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JPC94czpjb21wbGV4VHlwZT4KLQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iaGV4QmluYXJ5Ij4KLQkJPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmhleEJpbmFyeSI+Ci0JCQkJPHhzOmF0dHJpYnV0ZSByZWY9InhtaW1lOmNvbnRlbnRUeXBlIiAvPgotCQkJPC94czpleHRlbnNpb24+Ci0JCTwveHM6c2ltcGxlQ29udGVudD4KLQk8L3hzOmNvbXBsZXhUeXBlPgotPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL210b20vc3JjL3NhbXBsZS9tdG9tL2NsaWVudC9DbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9zcmMvc2FtcGxlL210b20vY2xpZW50L0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZTZlZTZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9zcmMvc2FtcGxlL210b20vY2xpZW50L0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLm10b20uY2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkZpbGVEYXRhU291cmNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmF4aXMyLm10b21zYW1wbGUuTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnQgewotCi0JLyoqCi0JICogQHBhcmFtIGFyZ3MKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kTGluZU9wdGlvblBhcnNlciBvcHRpb25zUGFyc2VyID0gbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKAotCQkJCWFyZ3MpOwotCQlMaXN0IGludmFsaWRPcHRpb25zTGlzdCA9IG9wdGlvbnNQYXJzZXIKLQkJCQkuZ2V0SW52YWxpZE9wdGlvbnMobmV3IE9wdGlvbnNWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIHsKLQkJCQkJCVN0cmluZyBvcHRpb25UeXBlID0gb3B0aW9uLmdldE9wdGlvblR5cGUoKTsKLQkJCQkJCXJldHVybiAhKCJkZXN0Ii5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8ICJmaWxlIgotCQkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlpZiAoKGludmFsaWRPcHRpb25zTGlzdC5zaXplKCkgPiAwKSB8fCAoYXJncy5sZW5ndGggIT0gNCkpIHsKLQkJCS8vIHByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCBQYXJhbWV0ZXJzLiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTWFwIG9wdGlvbnNNYXAgPSBvcHRpb25zUGFyc2VyLmdldEFsbE9wdGlvbnMoKTsKLQotCQlDb21tYW5kTGluZU9wdGlvbiBmaWxlT3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKSBvcHRpb25zTWFwCi0JCQkJLmdldCgiZmlsZSIpOwotCQlDb21tYW5kTGluZU9wdGlvbiBkZXN0aW5hdGlvbk9wdGlvbiA9IChDb21tYW5kTGluZU9wdGlvbikgb3B0aW9uc01hcAotCQkJCS5nZXQoImRlc3QiKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQl0cmFuc2ZlckZpbGUoZmlsZSwgZGVzdGluYXRpb25PcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJGaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGRlc3RpbmF0aW9uKQotCQkJdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0JCS8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSBuZWVkIHRvIGNhcHR1cmUgdGhlIG1lc3NhZ2VzIGZyb20KLQkJLy8gVENQTU9OLiBQbGVhc2UgbG9vayBhdCBodHRwOi8vd3MuYXBhY2hlLm9yZy9jb21tb25zL3RjcG1vbi90Y3Btb250dXRvcmlhbC5odG1sCi0JCS8vIHRvIGxlYXJuIGhvdyB0byBzZXR1cCB0Y3Btb24KLQkJTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViIHNlcnZpY2VTdHViID0gbmV3IE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1YigKLQkJCQkvLyJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpczIvcmVzdC9NVE9NU2FtcGxlIgotCQkpOwotCi0JCS8vIEVuYWJsZSBNVE9NIGluIHRoZSBjbGllbnQgc2lkZQotCQlzZXJ2aWNlU3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eSgKLQkJCQlDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfTVRPTSwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotCQkvL0luY3JlYXNlIHRoZSB0aW1lIG91dCB3aGVuIHNlbmRpbmcgbGFyZ2UgYXR0YWNobWVudHMKLQkJc2VydmljZVN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0VGltZU91dEluTWlsbGlTZWNvbmRzKDEwMDAwKTsKLQotCQkvLyBVbmNvbW1lbnQgYW5kIGZpbGwgdGhlIGZvbGxvd2luZyBpZiB5b3Ugd2FudCB0byBoYXZlIGNsaWVudCBzaWRlIGZpbGUKLQkJLy8gY2FjaGluZyBzd2l0Y2hlZCBPTi4KLQkJLyoKLQkJICogc2VydmljZVN0dWIuX2dldFNlcnZpY2VDbGllbnQoKS5nZXRPcHRpb25zKCkuc2V0UHJvcGVydHkoCi0JCSAqIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNBQ0hFX0FUVEFDSE1FTlRTLCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0JCSAqIHNlcnZpY2VTdHViLl9nZXRTZXJ2aWNlQ2xpZW50KCkuZ2V0T3B0aW9ucygpLnNldFByb3BlcnR5KAotCQkgKiBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5BVFRBQ0hNRU5UX1RFTVBfRElSLCAieW91ciB0ZW1wIGRpciIpOwotCQkgKiBzZXJ2aWNlU3R1Yi5fZ2V0U2VydmljZUNsaWVudCgpLmdldE9wdGlvbnMoKS5zZXRQcm9wZXJ0eSgKLQkJICogQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRklMRV9TSVpFX1RIUkVTSE9MRCwgIjQwMDAiKTsKLQkJICovCi0KLQkJLy8gUG9wdWxhdGluZyB0aGUgY29kZSBnZW5lcmF0ZWQgYmVhbnMKLQkJTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViLkF0dGFjaG1lbnRSZXF1ZXN0IGF0dGFjaG1lbnRSZXF1ZXN0ID0gbmV3IE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5BdHRhY2htZW50UmVxdWVzdCgpOwotCQlNVE9NU2FtcGxlTVRPTVNhbXBsZVNPQVAxMVBvcnRfaHR0cFN0dWIuQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFR5cGUgPSBuZXcgTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViLkF0dGFjaG1lbnRUeXBlKCk7Ci0JCU1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5CYXNlNjRCaW5hcnkgYmFzZTY0QmluYXJ5ID0gbmV3IE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5CYXNlNjRCaW5hcnkoKTsKLQotCQkvLyBDcmVhdGluZyBhIGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2UgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLQkJRmlsZURhdGFTb3VyY2UgZmlsZURhdGFTb3VyY2UgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7Ci0KLQkJLy8gQ3JlYXRlIGEgZGF0YUhhbmRsZXIgdXNpbmcgdGhlIGZpbGVEYXRhU291cmNlLiBBbnkgaW1wbGVtZW50YXRpb24gb2YKLQkJLy8gamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlIGludGVyZmFjZSBjYW4gZml0IGhlcmUuCi0JCURhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhU291cmNlKTsKLQkJYmFzZTY0QmluYXJ5LnNldEJhc2U2NEJpbmFyeShkYXRhSGFuZGxlcik7Ci0gICAgICAgIE1UT01TYW1wbGVNVE9NU2FtcGxlU09BUDExUG9ydF9odHRwU3R1Yi5Db250ZW50VHlwZV90eXBlMCBwYXJhbSA9IG5ldyBNVE9NU2FtcGxlTVRPTVNhbXBsZVNPQVAxMVBvcnRfaHR0cFN0dWIuQ29udGVudFR5cGVfdHlwZTAoKTsKLSAgICAgICAgcGFyYW0uc2V0Q29udGVudFR5cGVfdHlwZTAoZGF0YUhhbmRsZXIuZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgICAgIGJhc2U2NEJpbmFyeS5zZXRDb250ZW50VHlwZShwYXJhbSk7Ci0JCWF0dGFjaG1lbnRUeXBlLnNldEJpbmFyeURhdGEoYmFzZTY0QmluYXJ5KTsKLQkJYXR0YWNobWVudFR5cGUuc2V0RmlsZU5hbWUoZGVzdGluYXRpb24pOwotCQlhdHRhY2htZW50UmVxdWVzdC5zZXRBdHRhY2htZW50UmVxdWVzdChhdHRhY2htZW50VHlwZSk7Ci0KLQkJTVRPTVNhbXBsZU1UT01TYW1wbGVTT0FQMTFQb3J0X2h0dHBTdHViLkF0dGFjaG1lbnRSZXNwb25zZSByZXNwb25zZSA9IHNlcnZpY2VTdHViLmF0dGFjaG1lbnQoYXR0YWNobWVudFJlcXVlc3QpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0QXR0YWNobWVudFJlc3BvbnNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9tdG9tL3NyYy9zYW1wbGUvbXRvbS9zZXJ2aWNlL01UT01TYW1wbGVTa2VsZXRvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9tdG9tL3NyYy9zYW1wbGUvbXRvbS9zZXJ2aWNlL01UT01TYW1wbGVTa2VsZXRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYWZiMzM3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvbXRvbS9zcmMvc2FtcGxlL210b20vc2VydmljZS9NVE9NU2FtcGxlU2tlbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5tdG9tLnNlcnZpY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUud3MuYXhpczIubXRvbXNhbXBsZS5BdHRhY2htZW50UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5heGlzMi5tdG9tc2FtcGxlLkF0dGFjaG1lbnRUeXBlOwotaW1wb3J0IG9yZy53My53d3cuXzIwMDUuXzA1LnhtbG1pbWUuQmFzZTY0QmluYXJ5OwotCi0vKioKLSAqIE1UT01TZXJ2aWNlU2tlbGV0b24gamF2YSBza2VsZXRvbiBmb3IgdGhlIGF4aXNTZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBNVE9NU2FtcGxlU2tlbGV0b24gewotCi0JLyoqCi0JICogQXV0byBnZW5lcmF0ZWQgbWV0aG9kIHNpZ25hdHVyZQotCSAqIAotCSAqIEBwYXJhbSBwYXJhbTAKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgb3JnLmFwYWNoZS53cy5heGlzMi5tdG9tc2FtcGxlLkF0dGFjaG1lbnRSZXNwb25zZSBhdHRhY2htZW50KAotCQkJb3JnLmFwYWNoZS53cy5heGlzMi5tdG9tc2FtcGxlLkF0dGFjaG1lbnRSZXF1ZXN0IHBhcmFtMCkKLQkJCXRocm93cyBFeGNlcHRpb24KLQotCXsKLQkJQXR0YWNobWVudFR5cGUgYXR0YWNobWVudFJlcXVlc3QgPSBwYXJhbTAuZ2V0QXR0YWNobWVudFJlcXVlc3QoKTsKLQkJQmFzZTY0QmluYXJ5IGJpbmFyeURhdGEgPSBhdHRhY2htZW50UmVxdWVzdC5nZXRCaW5hcnlEYXRhKCk7Ci0JCURhdGFIYW5kbGVyIGRhdGFIYW5kbGVyID0gYmluYXJ5RGF0YS5nZXRCYXNlNjRCaW5hcnkoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoCi0JCQkJYXR0YWNobWVudFJlcXVlc3QuZ2V0RmlsZU5hbWUoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlkYXRhSGFuZGxlci53cml0ZVRvKGZpbGVPdXRwdXRTdHJlYW0pOwotCQlmaWxlT3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0JCWZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCi0JCUF0dGFjaG1lbnRSZXNwb25zZSByZXNwb25zZSA9IG5ldyBBdHRhY2htZW50UmVzcG9uc2UoKTsKLQkJcmVzcG9uc2Uuc2V0QXR0YWNobWVudFJlc3BvbnNlKCJGaWxlIHNhdmVkIHN1Y2Nlc2Z1bGx5LiIpOwotCQlyZXR1cm4gcmVzcG9uc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3BpbmcvUkVBRE1FLnR4dCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGM1MWJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotU2FtcGxlIC0gUGluZ2luZyB0aGUgc2VydmljZSBkZXBsb3llZCBpbiBBeGlzMgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLUluIHRoaXMgc2FtcGxlLCB3ZSBhcmUgZGVwbG95aW5nIGFuIEFYSU9NIGJhc2VkIHNlcnZpY2UgYWZ0ZXIgd3JpdGluZwotYSBzZXJ2aWNlcy54bWwgYW5kIGNyZWF0aW5nIGFuIGFhci4gV2UgYWxzbyB0ZXN0IHN1Y2Nlc3NmdWwKLWRlcGxveW1lbnQgdXNpbmcgYW4gQVhJT00gYmFzZWQgY2xpZW50IHdoaWNoIHNlbmQgc2V2ZXJhbCBwaW5nIHJlcXVlc3RzLgotVGhlIGNsaWVudCBzZW5kcyBzZXZlcmFsIHBpbmcgcmVxdWVzdHMsIGluY2x1ZGluZyBzZXJ2aWNlIGxldmVsIHJlcXVlc3RzLgotCi0KLVByZS1SZXF1aXNpdGVzCi09PT09PT09PT09PT09PQotCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyCi0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlCi09PT09PT09PT09PT09PT09PT09PQotCi1UeXBlICJhbnQgZ2VuZXJhdGUuc2VydmljZSIgZnJvbSBBWElTMl9IT01FL3NhbXBsZXMvcGluZyBkaXJlY3RvcnksCi10byBnZW5lcmF0ZSB0aGUgc2VydmljZSBhbmQgZGVwbG95IGl0IGludG8gCi1BWElTMl9IT01FL3JlcG9zaXRvcnkvc2VydmljZXMKLQotCi1SdW5uaW5nIHRoZSBDbGllbnQKLT09PT09PT09PT09PT09PT09PQotCi1UeXBlIGFudCBydW4uY2xpZW50IGluIHRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcGluZyBkaXJlY3RvcnkKLQotTm90ZQotPT09PQotU29tZXRpbWVzLCBpZiB5b3UncmUgaGF2aW5nIHRyb3VibGUgcnVubmluZyB0aGUgY2xpZW50IHN1Y2Nlc3NmdWxseSwgCi1JdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNsZWFuIHRoZSBzZXJ2aWNlcyByZXBvc2l0b3J5IGJlZm9yZSB5b3UgZ2VuZXJhdGUgdGhlIHNlcnZpY2UsIGRlcGxveSBpdAotYW5kIHJ1biB0aGUgY2xpZW50LiAoaS5lLiBkZWxldGUgc2VydmljZXMgY3JlYXRlZCBmcm9tIHByZXZpb3VzIHNhbXBsZXMuKQotCi0KLUhlbHAKLT09PT0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUKLWFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3BpbmcvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9waW5nL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4OGY3ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3BpbmcvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJwaW5nIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkFYSVMyX0hPTUUiIHZhbHVlPSIuLi8uLi8iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLQk8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIC8+Ci0JPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0KLSAgICAgICAgPCEtLUZpcnN0IGxldCdzIGNvbXBpbGUgdGhlIGNsYXNzZXMtLT4KLSAgICAgICAgPGphdmFjIGRlYnVnPSJvbiIKLSAgICAgICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIKLSAgICAgICAgICAgICAgIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8IS0tYWFyIHRoZW0gdXAgLS0+Ci0gICAgICAgIDxjb3B5IHRvRGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9yZXNvdXJjZXMiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi53c2RsIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L1NhbXBsZVBpbmdTZXJ2aWNlLmFhciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBleGNsdWRlcz0iKiovVGVzdC5jbGFzcyIgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICA8L2phcj4KLQkJPGNvcHkgZmlsZT0iJHtidWlsZC5kaXJ9L1NhbXBsZVBpbmdTZXJ2aWNlLmFhciIgZGVzdGZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMiIC8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZXMucGluZy5jbGllbnQuUGluZ0NsaWVudCI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGllbnQuY2xhc3MucGF0aCIgLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9waW5nL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDAwNjMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9waW5nL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlNhbXBsZVBpbmdTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxkZXNjcmlwdGlvbj5QaW5nIFNlcnZpY2U8L2Rlc2NyaXB0aW9uPgotICAgIDxtb2R1bGUgcmVmPSJwaW5nIi8+Ci0KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImdldFByaWNlIj4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IiBjbGFzcz0ic2FtcGxlcy5waW5nLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvb3BlcmF0aW9uPgotCi0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIgY2xhc3M9InNhbXBsZXMucGluZy5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgCi0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZXMucGluZy5zZXJ2aWNlLlBpbmdTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9waW5nL3NyYy9zYW1wbGVzL3BpbmcvY2xpZW50L1BpbmdDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL2NsaWVudC9QaW5nQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmJiZTEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9waW5nL3NyYy9zYW1wbGVzL3BpbmcvY2xpZW50L1BpbmdDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZXMucGluZy5jbGllbnQ7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUGluZ0NsaWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0KLSAgICAgICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TYW1wbGVQaW5nU2VydmljZSIpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfUkVRVUVTVCA9ICJwaW5nUmVxdWVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJTkdfU09BUEFDVElPTiA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL3BpbmciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSU5HX05BTUVTUEFDRSA9ICJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzL3BpbmcveHNkIjsKLQotICAgIHB1YmxpYyBQaW5nQ2xpZW50KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGluZ1JlcXVlc3QxKFN0cmluZyBbXSBvcGVyYXRpb25MaXN0KSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZShQSU5HX05BTUVTUEFDRSwgInRucyIpOwotCi0gICAgICAgIE9NRWxlbWVudCBwaW5nUmVxdWVzdCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoUElOR19SRVFVRVNULCBvbU5zKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvcGVyYXRpb24gPSBmYWMuY3JlYXRlT01FbGVtZW50KFBJTkdfT1BFUkFUSU9OLCBvbU5zKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbi5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KG9wZXJhdGlvbkxpc3RbaV0pKTsKLSAgICAgICAgICAgIHBpbmdSZXF1ZXN0LmFkZENoaWxkKG9wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBpbmdSZXF1ZXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdldFBpbmdSZXF1ZXN0NCgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKFBJTkdfTkFNRVNQQUNFLCAidG5zIik7Ci0KLSAgICAgICAgcmV0dXJuIGZhYy5jcmVhdGVPTUVsZW1lbnQoUElOR19SRVFVRVNULCBvbU5zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFJlcXVlc3QoU2VydmljZUNsaWVudCBzZW5kZXIsIE9NRWxlbWVudCByZXF1ZXN0LCBTdHJpbmcgZGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpbmcgcmVxdWVzdCAtICIgKyBkZXNjcmlwdGlvbik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXF1ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHJlcXVlc3QpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpbmcgcmVzcG9uc2UgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXN1bHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKFBJTkdfU09BUEFDVElPTik7Ci0gICAgICAgICAKLQkgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCBwaW5nUmVxdWVzdFBheWxvYWQ7Ci0KLSAgICAgICAgICAgIHBpbmdSZXF1ZXN0UGF5bG9hZCA9IGdldFBpbmdSZXF1ZXN0MShuZXcgU3RyaW5nW117ImdldFByaWNlIiwgInVwZGF0ZSJ9KTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHNlbmRlciwgcGluZ1JlcXVlc3RQYXlsb2FkLCAidHdvIG9wZXJhdGlvbnMgYXJlIHNwZWNpZmllZCIpOwotCi0gICAgICAgICAgICBwaW5nUmVxdWVzdFBheWxvYWQgPSBnZXRQaW5nUmVxdWVzdDEobmV3IFN0cmluZ1tdeyJnZXRQcmljZSJ9KTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KHNlbmRlciwgcGluZ1JlcXVlc3RQYXlsb2FkLCAib25lIG9wZXJhdGlvbiBpcyBzcGVjaWZpZWQiKTsKLQotICAgICAgICAgICAgcGluZ1JlcXVlc3RQYXlsb2FkID0gZ2V0UGluZ1JlcXVlc3QxKG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3Qoc2VuZGVyLCBwaW5nUmVxdWVzdFBheWxvYWQsICJTZXJ2aWNlIGxldmVsIik7Ci0KLSAgICAgICAgICAgIHBpbmdSZXF1ZXN0UGF5bG9hZCA9IGdldFBpbmdSZXF1ZXN0NCgpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3Qoc2VuZGVyLCBwaW5nUmVxdWVzdFBheWxvYWQsIlNlcnZpY2UgbGV2ZWwiKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhOWM2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bpbmcvc3JjL3NhbXBsZXMvcGluZy9yZWNlaXZlcnMvUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnBpbmcucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaW5nYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLXB1YmxpYyBjbGFzcyBSYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIsIFBpbmdhYmxlIHsKLQotICAgIHB1YmxpYyBpbnQgcGluZygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAvLyBnZXQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2UKLSAgICAgICAgT2JqZWN0IG9iaiA9IGdldFRoZUltcGxlbWVudGF0aW9uT2JqZWN0KE1lc3NhZ2VDb250ZXh0LmdldEN1cnJlbnRNZXNzYWdlQ29udGV4dCgpKTsKLQotICAgICAgICBpZihvYmogaW5zdGFuY2VvZiBQaW5nYWJsZSl7Ci0gICAgICAgICAgICByZXR1cm4gKChQaW5nYWJsZSlvYmopLnBpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUElOR19NUl9MRVZFTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bpbmcvc3JjL3NhbXBsZXMvcGluZy9yZWNlaXZlcnMvUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGFjMjJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3JlY2VpdmVycy9SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGVzLnBpbmcucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLk1lc3NhZ2VSZWNlaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaW5nYWJsZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotcHVibGljIGNsYXNzIFJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIGV4dGVuZHMgb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlUmVjZWl2ZXIsIFBpbmdhYmxlIHsKLQotICAgIHB1YmxpYyBpbnQgcGluZygpIHRocm93cyBBeGlzRmF1bHR7Ci0gICAgICAgIC8vIGdldCB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZQotICAgICAgICBPYmplY3Qgb2JqID0gZ2V0VGhlSW1wbGVtZW50YXRpb25PYmplY3QoTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCkpOwotCi0gICAgICAgIGlmKG9iaiBpbnN0YW5jZW9mIFBpbmdhYmxlKXsKLSAgICAgICAgICAgIHJldHVybiAoKFBpbmdhYmxlKW9iaikucGluZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQSU5HX01SX0xFVkVMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3NlcnZpY2UvUGluZ1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcGluZy9zcmMvc2FtcGxlcy9waW5nL3NlcnZpY2UvUGluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ2NjJlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bpbmcvc3JjL3NhbXBsZXMvcGluZy9zZXJ2aWNlL1BpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZXMucGluZy5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBpbmdhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIFBpbmdTZXJ2aWNlIGltcGxlbWVudHMgUGluZ2FibGUgewotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IGdldFByaWNlKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICBlbGVtZW50LmRldGFjaCgpOwotCi0gICAgICAgIE9NRWxlbWVudCBzeW1ib2xFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIHN5bWJvbCA9IHN5bWJvbEVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgIFN0cmluZyByZXR1cm5UZXh0ID0gIjQyIjsKLSAgICAgICAgRG91YmxlIHByaWNlID0gKERvdWJsZSkgbWFwLmdldChzeW1ib2wpOwotICAgICAgICBpZiAocHJpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuVGV4dCA9ICIiICsgcHJpY2UuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPQotICAgICAgICAgICAgICAgIGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgiaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiLCAibnMiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImdldFByaWNlUmVzcG9uc2UiLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgicmV0dXJuIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsIHJldHVyblRleHQpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBlbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgIGVsZW1lbnQuZGV0YWNoKCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHN5bWJvbEVsZW1lbnQgPSBlbGVtZW50LmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgc3ltYm9sID0gc3ltYm9sRWxlbWVudC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgT01FbGVtZW50IHByaWNlRWxlbWVudCA9IChPTUVsZW1lbnQpIHN5bWJvbEVsZW1lbnQuZ2V0TmV4dE9NU2libGluZygpOwotICAgICAgICBTdHJpbmcgcHJpY2UgPSBwcmljZUVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBuZXcgRG91YmxlKHByaWNlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBwaW5nKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQgPSBNZXNzYWdlQ29udGV4dC5nZXRDdXJyZW50TWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgLy9vcGVyYXRpb24gbmFtZSB0byBjYW4gYmUgYWNjZXNzZWQgaW4gdGhpcyBtYW5uZXIKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSAoU3RyaW5nKW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoT1BFUkFUSU9OX1RPX1BJTkcpOwotCi0gICAgICAgIC8vSW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZGVwZW5kcyBvbiB0aGUgcGFydGljdWxhciBzZXJ2aWNlCi0gICAgICAgIGlmKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCAmJiBvcGVyYXRpb25OYW1lLmVxdWFscygiZ2V0UHJpY2UiKSl7Ci0gICAgICAgICAgICAvL0ZvciB0aGlzIHNhbXBsZQotICAgICAgICAgICAgcmV0dXJuIFBJTkdfU1VDQ0VTU0ZVTDsKLSAgICAgICAgfWVsc2UgaWYob3BlcmF0aW9uTmFtZSAhPSBudWxsICYmIG9wZXJhdGlvbk5hbWUuZXF1YWxzKCJ1cGRhdGUiKSl7Ci0gICAgICAgICAgICByZXR1cm4gUElOR19GQUlMRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUElOR19GQUlMRDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qby9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNDEwYmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1TYW1wbGU6IFBPSk8gKFBsYWluIE9sZCBKYXZhIE9iamVjdCkNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIGlzIGFuIGV4YW1wbGUgUE9KTyBXZWIgc2VydmljZS4gSXQgc2hvd3MgaG93IHRvIGV4cG9zZSB0aGUgbWV0aG9kcyBvZiBhIEphdmEgY2xhc3MgYXMgYSBXZWINCi1zZXJ2aWNlIHVzaW5nIEFpeHMyLg0KLQ0KLQ0KLVByZXJlcXVpc2l0ZXMgIA0KLT09PT09PT09PT09PT0NCi0NCi1UbyBidWlsZCB0aGUgc2FtcGxlIHNlcnZpY2UgeW91IG11c3QgaGF2ZSBhbnQtMS42LnggaW5zdGFsbGVkIGluIHlvdXIgc3lzdGVtLiANCi0NCi1UbyBzZXQgQVhJUzJfSE9NRSBpbiBVbml4L0xpbnV4IHR5cGU6DQotJGV4cG9ydCBBWElTMl9IT01FPTxwYXRoIHRvIGF4aXMyIGRpc3RyaWJ1dGlvbj4NCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVG8gYnVpbGQgdGhlIHNhbXBsZSBzZXJ2aWNlLCB0eXBlOiAkYW50IGdlbmVyYXRlLnNlcnZpY2Ugb3IganVzdCBhbnQNCi0NCi1UaGlzIHdpbGwgYnVpbGQgdGhlIEFkZHJlc3NCb29rU2VydmljZS5hYXIgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgY29weSBpdCB0byB0aGUNCi08QVhJUzJfSE9NRT4vcmVwb3NpdG9yeS9zZXJ2aWNlcyBkaXJlY3RvcnkuDQotDQotWW91IGNhbiBzdGFydCB0aGUgQXhpczIgc2VydmVyIGJ5IHJ1bm5pbmcgZWl0aGVyIGF4aXMyc2VydmVyLmJhdCAob24gV2luZG93cykgb3IgYXhpczJzZXJ2ZXIuc2gNCi0ob24gTGludXgpdGhhdCBhcmUgbG9jYXRlZCBpbiA8QVhJUzJfSE9NRT4vYmluIGRpcmVjdG9yeS4NCi0NCi1UaGUgV1NETCBmb3IgdGhpcyBzZXJ2aWNlIHNob3VsZCBiZSB2aWV3YWJsZSBhdDoNCi0NCi1odHRwOi8vPHlvdXJob3N0Pjo8eW91cnBvcnQ+L2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZT93c2RsIA0KLShlLmcuIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2U/d3NkbCkNCi0NCi1zcmMvc2FtcGxlL2FkZHJlc3Nib29rL3JwY2NsaWVudC9BZGRyZXNzQm9va1JQQ0NsaWVudC5qYXZhIGlzIGEgQ2xpZW50IHRoYXQgdXNlcyBSUENTZXJ2aWNlQ2xpZW50DQotdG8gaW52b2tlIHRoZSBtZXRob2RzIG9mIHRoaXMgd2ViIHNlcnZpY2VzIGp1c3QgbGlrZSB0aGUgbWV0aG9kIGludm9jYXRpb25zIG9mIGEgSmF2YSBvYmplY3QuDQotDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotVG8gY29tcGlsZSBhbmQgcnVuLCB0eXBlDQotJGFudCBycGMuY2xpZW50DQotDQotc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9hZGJjbGllbnQvQWRkcmVzc0Jvb2tBREJDbGllbnQgaXMgQ2xpZW50IHRoYXQgdXNlcyBhIGdlbmVyYXRlZCBzdHViIHdpdGggQURCDQotdG8gaW52b2tlIHRoZSBtZXRob2RzIG9mIHRoaXMgd2ViIHNlcnZpY2UuDQotDQotVG8gZ2VuZXJhdGUgdGhlIHN0dWIsIGNvbXBpbGUgYW5kIHJ1biwgdHlwZQ0KLSRhbnQgYWRiLmNsaWVudCAtRHdzZGw9aHR0cDovLzx5b3VyaG9zdD46PHlvdXJwb3J0Pi9heGlzMi9zZXJ2aWNlcy9BZGRyZXNzQm9va1NlcnZpY2U/d3NkbA0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qby9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDZlZGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InBvam8iIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIuY2xhc3NlcyIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2NsYXNzZXMiIC8+Ci0KLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIubGliIiB2YWx1ZT0iJHtkZXN0LmRpcn0vbGliIiAvPgotCi0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0KLQk8cHJvcGVydHkgbmFtZT0icmVwb3NpdG9yeS5wYXRoIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5L3NlcnZpY2VzIiAvPgotCi0JPHBhdGggaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCi0JPHBhdGggaWQ9ImNsaWVudC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8ZmlsZXNldCBkaXI9IiR7ZGVzdC5kaXIubGlifSI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCi0JPC9wYXRoPgotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0LmRpcn0iIC8+Ci0JCTxkZWxldGUgZGlyPSJzcmMiIGluY2x1ZGVzPSJzYW1wbGUvYWRkcmVzc2Jvb2svc3R1Yi8qKiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiAvPgotCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXIubGlifSIgLz4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9L01FVEEtSU5GIiAvPgotCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNsZWFuLHByZXBhcmUiPgotCi0JCTxjb3B5IGZpbGU9InNyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIHRvZmlsZT0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQotCQk8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGluY2x1ZGVzPSJzYW1wbGUvYWRkcmVzc2Jvb2svc2VydmljZS8qKixzYW1wbGUvYWRkcmVzc2Jvb2svZW50cnkvKioiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLQotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyfS9BZGRyZXNzQm9va1NlcnZpY2UuYWFyIiAvPgotCi0JCTxjb3B5IGZpbGU9IiR7ZGVzdC5kaXJ9L0FkZHJlc3NCb29rU2VydmljZS5hYXIiIHRvZmlsZT0iJHtyZXBvc2l0b3J5LnBhdGh9L0FkZHJlc3NCb29rU2VydmljZS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJycGMuY2xpZW50IiBkZXBlbmRzPSJjbGVhbixwcmVwYXJlIj4KLQotCQk8YW50Y2FsbCB0YXJnZXQ9InJwYy5jbGllbnQuY29tcGlsZSIgLz4KLQotCQk8YW50Y2FsbCB0YXJnZXQ9InJwYy5jbGllbnQuamFyIiAvPgotCi0JCTxhbnRjYWxsIHRhcmdldD0icnBjLmNsaWVudC5ydW4iPgotCQkJPHBhcmFtIG5hbWU9InVyaSIgdmFsdWU9IiR7dXJpfSIvPgotCQk8L2FudGNhbGw+Ci0KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5jb21waWxlIj4KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlL2FkZHJlc3Nib29rL3JwY2NsaWVudC8qKixzYW1wbGUvYWRkcmVzc2Jvb2svZW50cnkvKioiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5qYXIiPgotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyLmxpYn0vcnBjLWNsaWVudC5qYXIiIGluY2x1ZGVzPSJzYW1wbGUvYWRkcmVzc2Jvb2svcnBjY2xpZW50LyoqLHNhbXBsZS9hZGRyZXNzYm9vay9lbnRyeS8qKiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5ydW4iPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5hZGRyZXNzYm9vay5ycGNjbGllbnQuQWRkcmVzc0Jvb2tSUENDbGllbnQiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke3VyaX0iIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2hlY2stcGFyYW1ldGVycyI+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9InBhcmFtZXRlcnMuc2V0Ij4KLQkJCTxhbmQ+Ci0JCQkJPGlzc2V0IHByb3BlcnR5PSJ3c2RsIiAvPgotCQkJPC9hbmQ+Ci0JCTwvY29uZGl0aW9uPgotCQk8IS0tIFRoaXMgaXMgYSBoYWNrIHRvIGdldCBhIGlmLWVsc2Ugd29ya2luZyBpbiBhbnQuIFNvbWUgbXVjaCBtb3JlICJBTlR5IiBwZXJzb24gaXMgd2VsY29tZSB0byBpbXByb3ZlIHRoaXMgLS0+Ci0JCTxhbnRjYWxsIHRhcmdldD0icHJpbnQtdXNhZ2UiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByaW50LXVzYWdlIiB1bmxlc3M9InBhcmFtZXRlcnMuc2V0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iYW50IGFkYi5jbGllbnQgLUR3c2RsPSdodHRwOi8vJmx0O3lvdXJob3N0PjombHQ7eW91cnBvcnQ+L2F4aXMyL3NlcnZpY2VzL0FkcmVzc0Jvb2tTZXJ2aWNlP3dzZGwnIiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhZGIuY2xpZW50IiBkZXBlbmRzPSJjaGVjay1wYXJhbWV0ZXJzIiBpZj0icGFyYW1ldGVycy5zZXQiPgotCi0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iIC8+Ci0JCTxhbnRjYWxsIHRhcmdldD0icHJlcGFyZSIgLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhZGIuY2xpZW50LmNvZGVnZW4tc3R1YiI+Ci0JCQk8cGFyYW0gbmFtZT0id3NkbCIgdmFsdWU9IiR7d3NkbH0iLz4KLQkJPC9hbnRjYWxsPgotCi0JCTxhbnRjYWxsIHRhcmdldD0iYWRiLmNsaWVudC5jb21waWxlIiAvPgotCi0JCTxhbnRjYWxsIHRhcmdldD0iYWRiLmNsaWVudC5qYXIiIC8+Ci0KLQkJPGFudGNhbGwgdGFyZ2V0PSJhZGIuY2xpZW50LnJ1biIgLz4KLQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhZGIuY2xpZW50LmNvZGVnZW4tc3R1YiI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSI+Ci0JCQk8YXJnIHZhbHVlPSItdXJpIiAvPgotCQkJPGFyZyB2YWx1ZT0iJHt3c2RsfSIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1wIiAvPgotCQkJPGFyZyB2YWx1ZT0ic2FtcGxlLmFkZHJlc3Nib29rLnN0dWIiIC8+Ci0JCQk8YXJnIHZhbHVlPSItbyIgLz4KLQkJCTxhcmcgdmFsdWU9InNyYyIgLz4KLQkJCTxhcmcgdmFsdWU9Ii1mIiAvPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhZGIuY2xpZW50LmNvbXBpbGUiPgotCQk8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGluY2x1ZGVzPSJzYW1wbGUvYWRkcmVzc2Jvb2svYWRiY2xpZW50LyoqLHNhbXBsZS9hZGRyZXNzYm9vay9zdHViLyoqIj4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzLnBhdGgiIC8+Ci0JCTwvamF2YWM+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImFkYi5jbGllbnQuamFyIj4KLQkJPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBkZXN0ZmlsZT0iJHtkZXN0LmRpci5saWJ9L2FkYi1jbGllbnQuamFyIiBpbmNsdWRlcz0ic2FtcGxlL2FkZHJlc3Nib29rL2FkYmNsaWVudC8qKixzYW1wbGUvYWRkcmVzc2Jvb2svc3R1Yi8qKiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYWRiLmNsaWVudC5ydW4iPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5hZGRyZXNzYm9vay5hZGJjbGllbnQuQWRkcmVzc0Jvb2tBREJDbGllbnQiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iY2xpZW50LmNsYXNzLnBhdGgiIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMjA0ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgUE9KTzogQWRkcmVzc0Jvb2sgU2VydmljZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlLmFkZHJlc3Nib29rLnNlcnZpY2UuQWRkcmVzc0Jvb2tTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9hZGJjbGllbnQvQWRkcmVzc0Jvb2tBREJDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qby9zcmMvc2FtcGxlL2FkZHJlc3Nib29rL2FkYmNsaWVudC9BZGRyZXNzQm9va0FEQkNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM0NzU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qby9zcmMvc2FtcGxlL2FkZHJlc3Nib29rL2FkYmNsaWVudC9BZGRyZXNzQm9va0FEQkNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLmFkZHJlc3Nib29rLmFkYmNsaWVudDsKLQotaW1wb3J0IHNhbXBsZS5hZGRyZXNzYm9vay5zdHViLkFkZHJlc3NCb29rU2VydmljZVN0dWI7Ci0KLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rQURCQ2xpZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBVUkwgPSAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEFkZHJlc3NCb29rU2VydmljZVN0dWIgc3R1YjsKLQotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R1YiA9IG5ldyBBZGRyZXNzQm9va1NlcnZpY2VTdHViKGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHViID0gbmV3IEFkZHJlc3NCb29rU2VydmljZVN0dWIoVVJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQWRkcmVzc0Jvb2tTZXJ2aWNlU3R1Yi5BZGRFbnRyeSBhZGRFbnRyeSA9IG5ldyBBZGRyZXNzQm9va1NlcnZpY2VTdHViLkFkZEVudHJ5KCk7Ci0gICAgICAgICAgICBBZGRyZXNzQm9va1NlcnZpY2VTdHViLkVudHJ5IGVudHJ5ID0gbmV3IEFkZHJlc3NCb29rU2VydmljZVN0dWIuRW50cnkoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZW50cnkuc2V0TmFtZSgiQWJieSBDYWRhYmJ5Iik7Ci0gICAgICAgICAgICBlbnRyeS5zZXRTdHJlZXQoIlNlc2FtZSBTdHJlZXQiKTsKLSAgICAgICAgICAgIGVudHJ5LnNldENpdHkoIlNlc2FtZSBDaXR5Iik7Ci0gICAgICAgICAgICBlbnRyeS5zZXRTdGF0ZSgiU2VzYW1lIFN0YXRlIik7Ci0gICAgICAgICAgICBlbnRyeS5zZXRQb3N0YWxDb2RlKCIxMTExMSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGRFbnRyeS5zZXRBcmdzMChlbnRyeSk7Ci0gICAgICAgICAgICBzdHViLmFkZEVudHJ5KGFkZEVudHJ5KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQWRkcmVzc0Jvb2tTZXJ2aWNlU3R1Yi5GaW5kRW50cnkgZmluZEVudHJ5ID0gbmV3IEFkZHJlc3NCb29rU2VydmljZVN0dWIuRmluZEVudHJ5KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmRFbnRyeS5zZXRBcmdzMCgiQWJieSBDYWRhYmJ5Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFkZHJlc3NCb29rU2VydmljZVN0dWIuRmluZEVudHJ5UmVzcG9uc2UgcmVzcG9uc2UgPSBzdHViLmZpbmRFbnRyeShmaW5kRW50cnkpOwotICAgICAgICAgICAgQWRkcmVzc0Jvb2tTZXJ2aWNlU3R1Yi5FbnRyeSByZXNwb25zZUVudHJ5ID0gcmVzcG9uc2UuZ2V0X3JldHVybigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWUgICA6IiArIHJlc3BvbnNlRW50cnkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyZWV0IDoiICsgcmVzcG9uc2VFbnRyeS5nZXRTdHJlZXQoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNpdHkgICA6IiArIHJlc3BvbnNlRW50cnkuZ2V0Q2l0eSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGUgIDoiICsgcmVzcG9uc2VFbnRyeS5nZXRTdGF0ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGFsIENvZGUgOiIgKyByZXNwb25zZUVudHJ5LmdldFBvc3RhbENvZGUoKSk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9lbnRyeS9FbnRyeS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9zYW1wbGUvYWRkcmVzc2Jvb2svZW50cnkvRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYmRiZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9lbnRyeS9FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLmFkZHJlc3Nib29rLmVudHJ5OwotCi1wdWJsaWMgY2xhc3MgRW50cnkgewotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldCA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2l0eSA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGUgPSBudWxsOwotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGUgPSBudWxsOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgewotICAgICAgICByZXR1cm4gY2l0eTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyBjaXR5KSB7Ci0gICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3N0YWxDb2RlKCkgewotICAgICAgICByZXR1cm4gcG9zdGFsQ29kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3N0YWxDb2RlKFN0cmluZyBwb3N0YWxDb2RlKSB7Ci0gICAgICAgIHRoaXMucG9zdGFsQ29kZSA9IHBvc3RhbENvZGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKFN0cmluZyBzdGF0ZSkgewotICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJlZXQoKSB7Ci0gICAgICAgIHJldHVybiBzdHJlZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3RyZWV0KFN0cmluZyBzdHJlZXQpIHsKLSAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9zYW1wbGUvYWRkcmVzc2Jvb2svcnBjY2xpZW50L0FkZHJlc3NCb29rUlBDQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9ycGNjbGllbnQvQWRkcmVzc0Jvb2tSUENDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1YjAzNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9ycGNjbGllbnQvQWRkcmVzc0Jvb2tSUENDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuYWRkcmVzc2Jvb2sucnBjY2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgc2FtcGxlLmFkZHJlc3Nib29rLmVudHJ5LkVudHJ5OwotCi0KLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rUlBDQ2xpZW50IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MxKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudCgpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0FkZHJlc3NCb29rU2VydmljZSIpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0KLSAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlcyBhbiBFbnRyeSBhbmQgc3RvcmVzIGl0IGluIHRoZSBBZGRyZXNzQm9vay4KLSAgICAgICAgICovCi0KLSAgICAgICAgLy8gUU5hbWUgb2YgdGhlIHRhcmdldCBtZXRob2QgCi0gICAgICAgIFFOYW1lIG9wQWRkRW50cnkgPSBuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlLmFkZHJlc3Nib29rLnNhbXBsZSIsICJhZGRFbnRyeSIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnN0cnVjdGluZyBhIG5ldyBFbnRyeQotICAgICAgICAgKi8KLSAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnkoKTsKLQotICAgICAgICBlbnRyeS5zZXROYW1lKCJBYmJ5IENhZGFiYnkiKTsKLSAgICAgICAgZW50cnkuc2V0U3RyZWV0KCJTZXNhbWUgU3RyZWV0Iik7Ci0gICAgICAgIGVudHJ5LnNldENpdHkoIlNlc2FtZSBDaXR5Iik7Ci0gICAgICAgIGVudHJ5LnNldFN0YXRlKCJTZXNhbWUgU3RhdGUiKTsKLSAgICAgICAgZW50cnkuc2V0UG9zdGFsQ29kZSgiMTExMTEiKTsKLQotICAgICAgICAvLyBDb25zdHJ1Y3RpbmcgdGhlIGFyZ3VtZW50cyBhcnJheSBmb3IgdGhlIG1ldGhvZCBpbnZvY2F0aW9uCi0gICAgICAgIE9iamVjdFtdIG9wQWRkRW50cnlBcmdzID0gbmV3IE9iamVjdFtdIHsgZW50cnkgfTsKLQotICAgICAgICAvLyBJbnZva2luZyB0aGUgbWV0aG9kCi0gICAgICAgIHNlcnZpY2VDbGllbnQuaW52b2tlUm9idXN0KG9wQWRkRW50cnksIG9wQWRkRW50cnlBcmdzKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogRmV0Y2hpbmcgYW4gRW50cnkgZnJvbSB0aGUgQWRkcmVzcyBib29rCi0gICAgICAgICAqLwotICAgICAgICAKLSAgICAgICAgLy8gUU5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnZva2UgCi0gICAgICAgIFFOYW1lIG9wRmluZEVudHJ5ID0gbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5hZGRyZXNzYm9vay5zYW1wbGUiLCAiZmluZEVudHJ5Iik7Ci0KLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIG5hbWUgPSAiQWJieSBDYWRhYmJ5IjsKLQotICAgICAgICBPYmplY3RbXSBvcEZpbmRFbnRyeUFyZ3MgPSBuZXcgT2JqZWN0W10geyBuYW1lIH07Ci0gICAgICAgIENsYXNzW10gcmV0dXJuVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IEVudHJ5LmNsYXNzIH07Ci0KLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEZpbmRFbnRyeSwKLSAgICAgICAgICAgICAgICBvcEZpbmRFbnRyeUFyZ3MsIHJldHVyblR5cGVzKTsKLSAgICAgICAgCi0gICAgICAgIEVudHJ5IHJlc3VsdCA9IChFbnRyeSkgcmVzcG9uc2VbMF07Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTm8gZW50cnkgZm91bmQgZm9yICIgKyBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmFtZSAgIDoiICsgcmVzdWx0LmdldE5hbWUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyZWV0IDoiICsgcmVzdWx0LmdldFN0cmVldCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaXR5ICAgOiIgKyByZXN1bHQuZ2V0Q2l0eSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZSAgOiIgKyByZXN1bHQuZ2V0U3RhdGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUG9zdGFsIENvZGUgOiIgKyByZXN1bHQuZ2V0UG9zdGFsQ29kZSgpKTsKLSAgICAgICAgCi0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9zZXJ2aWNlL0FkZHJlc3NCb29rU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvL3NyYy9zYW1wbGUvYWRkcmVzc2Jvb2svc2VydmljZS9BZGRyZXNzQm9va1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MjIyMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam8vc3JjL3NhbXBsZS9hZGRyZXNzYm9vay9zZXJ2aWNlL0FkZHJlc3NCb29rU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLmFkZHJlc3Nib29rLnNlcnZpY2U7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgc2FtcGxlLmFkZHJlc3Nib29rLmVudHJ5LkVudHJ5OwotCi0KLQotcHVibGljIGNsYXNzIEFkZHJlc3NCb29rU2VydmljZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGVudHJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqCi0gICAgICogQWRkIGFuIEVudHJ5IHRvIHRoZSBBZGRyZXNzIEJvb2sKLSAgICAgKiBAcGFyYW0gZW50cnkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShFbnRyeSBlbnRyeSkgewotICAgICAgICB0aGlzLmVudHJpZXMucHV0KGVudHJ5LmdldE5hbWUoKSwgZW50cnkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZWFyY2ggYW4gYWRkcmVzcyBvZiBhIHBlcnNvbgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwZXJzb24gd2hvc2UgYWRkcmVzcyBuZWVkcyB0byBiZSBmb3VuZAotICAgICAqIEByZXR1cm4gcmV0dXJuIHRoZSBhZGRyZXNzIGVudHJ5IG9mIHRoZSBwZXJzb24uIAotICAgICAqLwotICAgIHB1YmxpYyBFbnRyeSBmaW5kRW50cnkoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIChFbnRyeSkgdGhpcy5lbnRyaWVzLmdldChuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhOTAzMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotUE9KTyBXZWIgU2VydmljZXMgdXNpbmcgQXBhY2hlIEF4aXMyLSBTYW1wbGUgMQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciB0aGUgeGRvY3MvMV8xL3Bvam9ndWlkZS5odG1sIGRvY3VtZW50IGZvdW5kIGluIA0KLXRoZSBleHRyYWN0ZWQgQXhpczIgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB0aGUgDQotc291cmNlIGNvZGUga2luZGx5IHNlZSB0aGlzICdQT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczInIGRvY3VtZW50Lg0KLQ0KLVRoZSBhYm92ZSBtZW50aW9uZWQgZG9jdW1lbnQgc2hvd3MgeW91IGhvdyB0byB0YWtlIGEgc2ltcGxlIFBPSk8gKFBsYWluIE9sZCBKYXZhIA0KLU9iamVjdCksIGFuZCBkZXBsb3kgaXQgb24gQXBhY2hlIFRvbWNhdCBhcyBhIFdlYiBzZXJ2aWNlIGluIHRoZSBleHBsb2RlZCBkaXJlY3RvcnkgDQotZm9ybWF0LiBUaGlzIGlzIGEgcXVpY2sgd2F5IHRvIGdldCBhIFdlYiBzZXJ2aWNlIHVwIGFuZCBydW5uaW5nIGluIG5vIHRpbWUuIA0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIHNob3dzIGhvdyB0byBleHBvc2UgYSBKYXZhIGNsYXNzIGFzIGEgd2ViIHNlcnZpY2UuICANCi1UaGUgV2VhdGhlclNlcnZpY2UgSmF2YSBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIGdldCBhbmQgc2V0IGEgV2VhdGhlciANCi10eXBlIEphdmEgb2JqZWN0cy4gVGhlIGNsaWVudCB1c2VzIFJQQ1NlcnZpY2VDbGllbnQgdG8gaW52b2tlIHRob3NlIHR3byANCi1tZXRob2RzIGp1c3QgYXMgSmF2YSBvYmplY3QgbWV0aG9kIGludm9jYXRpb24uDQotDQotUHJlcmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUJ1aWxkaW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT0NCi0NCi1UeXBlICRhbnQgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvcG9qb2d1aWRlDQotDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAkYW50IHJwYy5jbGllbnQNCi0NCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUgYW55IHRyb3VibGUgcnVubmluZyB0aGUgc2FtcGxlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3NjQyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InBvam9ndWlkZSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZ2VuZXJhdGUuc2VydmljZSI+Ci0KLQk8cHJvcGVydHkgbmFtZT0ic2VydmljZS5uYW1lIiB2YWx1ZT0iV2VhdGhlclNlcnZpY2UiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmNsYXNzZXMiIHZhbHVlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UubmFtZX0iIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmxpYiIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2xpYiIgLz4JCi0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0JPHByb3BlcnR5IG5hbWU9InJlcG9zaXRvcnkucGF0aCIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeSIgLz4KLQotCTxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCTwvcGF0aD4KLQotCTxwYXRoIGlkPSJjbGllbnQuY2xhc3MucGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQkJPGZpbGVzZXQgZGlyPSIke2Rlc3QuZGlyLmxpYn0iPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQotCTwvcGF0aD4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdC5kaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0ic3JjIiBpbmNsdWRlcz0ic2FtcGxlL3Bvam8vc3R1Yi8qKiIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iIC8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9L2xpYiIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0iY2xlYW4scHJlcGFyZSI+Ci0KLQkJPGNvcHkgZmlsZT0ic3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgdG9maWxlPSIke2Rlc3QuZGlyLmNsYXNzZXN9L01FVEEtSU5GL3NlcnZpY2VzLnhtbCIgb3ZlcndyaXRlPSJ0cnVlIiAvPgotCi0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgaW5jbHVkZXM9InNhbXBsZS9wb2pvL3NlcnZpY2UvKiosc2FtcGxlL3Bvam8vZGF0YS8qKiI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmFjPgotCQkKLQkJPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBkZXN0ZmlsZT0iJHtkZXN0LmRpcn0vJHtzZXJ2aWNlLm5hbWV9LmFhciIgLz4KLQotCQk8Y29weSBmaWxlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UubmFtZX0uYWFyIiB0b2ZpbGU9IiR7cmVwb3NpdG9yeS5wYXRofS9zZXJ2aWNlcy8ke3NlcnZpY2UubmFtZX0uYWFyIiBvdmVyd3JpdGU9InRydWUiIC8+Ci0JCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJycGMuY2xpZW50IiBkZXBlbmRzPSJjbGVhbixwcmVwYXJlIj4KLQotCQk8YW50Y2FsbCB0YXJnZXQ9InJwYy5jbGllbnQuY29tcGlsZSIgLz4KLQotCQk8YW50Y2FsbCB0YXJnZXQ9InJwYy5jbGllbnQuamFyIiAvPgotCi0JCTxhbnRjYWxsIHRhcmdldD0icnBjLmNsaWVudC5ydW4iIC8+Ci0KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5jb21waWxlIj4KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0ic2FtcGxlL3Bvam8vcnBjY2xpZW50LyoqLHNhbXBsZS9wb2pvL2RhdGEvKioiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5qYXIiPgotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyLmxpYn0vcnBjLWNsaWVudC5qYXIiIGluY2x1ZGVzPSJzYW1wbGUvcG9qby9ycGNjbGllbnQvKiosc2FtcGxlL3Bvam8vZGF0YS8qKiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5ydW4iPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5wb2pvLnJwY2NsaWVudC5XZWF0aGVyUlBDQ2xpZW50Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGUvc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxYmQwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJXZWF0aGVyU2VydmljZSIgc2NvcGU9ImFwcGxpY2F0aW9uIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFdlYXRoZXIgUE9KTyBTZXJ2aWNlCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zYW1wbGUucG9qby5zZXJ2aWNlLldlYXRoZXJTZXJ2aWNlPC9wYXJhbWV0ZXI+Ci0KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9kYXRhL1dlYXRoZXIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9kYXRhL1dlYXRoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3OWM1OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvc2FtcGxlL3Bvam8vZGF0YS9XZWF0aGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucG9qby5kYXRhOwotCi1wdWJsaWMgY2xhc3MgV2VhdGhlcnsKLSAgICBmbG9hdCB0ZW1wZXJhdHVyZTsKLSAgICBTdHJpbmcgZm9yZWNhc3Q7Ci0gICAgYm9vbGVhbiByYWluOwotICAgIGZsb2F0IGhvd011Y2hSYWluOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRlbXBlcmF0dXJlKGZsb2F0IHRlbXApewotICAgICAgICB0ZW1wZXJhdHVyZSA9IHRlbXA7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldFRlbXBlcmF0dXJlKCl7Ci0gICAgICAgIHJldHVybiB0ZW1wZXJhdHVyZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yZWNhc3QoU3RyaW5nIGZvcmUpewotICAgICAgICBmb3JlY2FzdCA9IGZvcmU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JlY2FzdCgpewotICAgICAgICByZXR1cm4gZm9yZWNhc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJhaW4oYm9vbGVhbiByKXsKLSAgICAgICAgcmFpbiA9IHI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0UmFpbigpewotICAgICAgICByZXR1cm4gcmFpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0SG93TXVjaFJhaW4oZmxvYXQgaG93TXVjaCl7Ci0gICAgICAgIGhvd011Y2hSYWluID0gaG93TXVjaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmxvYXQgZ2V0SG93TXVjaFJhaW4oKXsKLSAgICAgICAgcmV0dXJuIGhvd011Y2hSYWluOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvc2FtcGxlL3Bvam8vcnBjY2xpZW50L1dlYXRoZXJSUENDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9ycGNjbGllbnQvV2VhdGhlclJQQ0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM0OTJjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9ycGNjbGllbnQvV2VhdGhlclJQQ0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnBvam8ucnBjY2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgc2FtcGxlLnBvam8uZGF0YS5XZWF0aGVyOwotCi0KLXB1YmxpYyBjbGFzcyBXZWF0aGVyUlBDQ2xpZW50IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MxKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBSUENTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgUlBDU2VydmljZUNsaWVudCgpOwotCi0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IHNlcnZpY2VDbGllbnQuZ2V0T3B0aW9ucygpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1dlYXRoZXJTZXJ2aWNlIik7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotCi0gICAgICAgIC8vIFNldHRpbmcgdGhlIHdlYXRoZXIKLSAgICAgICAgUU5hbWUgb3BTZXRXZWF0aGVyID0gbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5wb2pvLnNhbXBsZSIsICJzZXRXZWF0aGVyIik7Ci0KLSAgICAgICAgV2VhdGhlciB3ID0gbmV3IFdlYXRoZXIoKTsKLQotICAgICAgICB3LnNldFRlbXBlcmF0dXJlKChmbG9hdCkzOS4zKTsKLSAgICAgICAgdy5zZXRGb3JlY2FzdCgiQ2xvdWR5IHdpdGggc2hvd2VycyIpOwotICAgICAgICB3LnNldFJhaW4odHJ1ZSk7Ci0gICAgICAgIHcuc2V0SG93TXVjaFJhaW4oKGZsb2F0KTQuNSk7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BTZXRXZWF0aGVyQXJncyA9IG5ldyBPYmplY3RbXSB7IHcgfTsKLQotICAgICAgICBzZXJ2aWNlQ2xpZW50Lmludm9rZVJvYnVzdChvcFNldFdlYXRoZXIsIG9wU2V0V2VhdGhlckFyZ3MpOwotCi0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgd2VhdGhlcgotICAgICAgICBRTmFtZSBvcEdldFdlYXRoZXIgPSBuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlLnBvam8uc2FtcGxlIiwgImdldFdlYXRoZXIiKTsKLQotICAgICAgICBPYmplY3RbXSBvcEdldFdlYXRoZXJBcmdzID0gbmV3IE9iamVjdFtdIHsgfTsKLSAgICAgICAgQ2xhc3NbXSByZXR1cm5UeXBlcyA9IG5ldyBDbGFzc1tdIHsgV2VhdGhlci5jbGFzcyB9OwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIE9iamVjdFtdIHJlc3BvbnNlID0gc2VydmljZUNsaWVudC5pbnZva2VCbG9ja2luZyhvcEdldFdlYXRoZXIsCi0gICAgICAgICAgICAgICAgb3BHZXRXZWF0aGVyQXJncywgcmV0dXJuVHlwZXMpOwotICAgICAgICAKLSAgICAgICAgV2VhdGhlciByZXN1bHQgPSAoV2VhdGhlcikgcmVzcG9uc2VbMF07Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2VhdGhlciBkaWRuJ3QgaW5pdGlhbGl6ZSEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRGlzcGxheWluZyB0aGUgcmVzdWx0Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVtcGVyYXR1cmUgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldFRlbXBlcmF0dXJlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcmVjYXN0ICAgICAgICAgICAgICAgICAgOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRGb3JlY2FzdCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSYWluICAgICAgICAgICAgICAgICAgICAgIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0UmFpbigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIb3cgbXVjaCByYWluIChpbiBpbmNoZXMpIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0SG93TXVjaFJhaW4oKSk7Ci0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9zZXJ2aWNlL1dlYXRoZXJTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZS9zcmMvc2FtcGxlL3Bvam8vc2VydmljZS9XZWF0aGVyU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQyYzVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlL3NyYy9zYW1wbGUvcG9qby9zZXJ2aWNlL1dlYXRoZXJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucG9qby5zZXJ2aWNlOwotCi1pbXBvcnQgc2FtcGxlLnBvam8uZGF0YS5XZWF0aGVyOwotCi1wdWJsaWMgY2xhc3MgV2VhdGhlclNlcnZpY2V7Ci0gICAgV2VhdGhlciB3ZWF0aGVyOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdlYXRoZXIoV2VhdGhlciB3ZWF0aGVyKXsKLSAgICAgICAgdGhpcy53ZWF0aGVyID0gd2VhdGhlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2VhdGhlciBnZXRXZWF0aGVyKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLndlYXRoZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyYjk1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1QT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczItIFNhbXBsZSAyDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciB0aGUgeGRvY3MvMV8xL3Bvam9ndWlkZS5odG1sIGRvY3VtZW50IGZvdW5kIGluIA0KLXRoZSBleHRyYWN0ZWQgQXhpczIgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB0aGUgDQotc291cmNlIGNvZGUga2luZGx5IHNlZSB0aGlzICdQT0pPIFdlYiBTZXJ2aWNlcyB1c2luZyBBcGFjaGUgQXhpczInIGRvY3VtZW50Lg0KLQ0KLUluIHRoaXMgc3BlY2lmaWMgc2FtcGxlIHlvdSdsbCBiZSBzaG93biBob3cgdG8gdGFrZSBhIFBPSk8gIChQbGFpbiBPbGQgSmF2YSBPYmplY3QpIA0KLWJhc2VkIG9uIHRoZSBTcHJpbmcgRnJhbWV3b3JrLCBhbmQgZGVwbG95IHRoYXQgYXMgYW4gQUFSIHBhY2thZ2VkIFdlYiBzZXJ2aWNlIG9uIFRvbWNhdC4gDQotVGhpcyBpcyBhIHF1aWNrIHdheSB0byBnZXQgYSBXZWIgc2VydmljZSB1cCBhbmQgcnVubmluZyBpbiBubyB0aW1lLiANCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBzaG93cyBob3cgdG8gZXhwb3NlIHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIG9mIFdlYXRoZXJTcHJpbmdTZXJ2aWNlIHRoYXQgDQotdGFrZXMgV2VhdGhlciB0eXBlIEphdmEgT2JqZWN0IGFzIHRoZSBhcmd1bWVudCBhbmQgdGhlIHJldHVybiB0eXBlLiBJdCB1c2VzIHRoZSBTcHJpbmcgDQotZnJhbWV3b3JrIHRvIGluaXRpYWxpemUgdGhlIHdlYXRoZXIgcHJvcGVydHkgb2YgdGhlIFdlYXRoZXJTcHJpbmdTZXJ2aWNlLg0KLQ0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotU3ByaW5nLTEuMi42LmphciBvciBsYXRlciANCi1Zb3UgbmVlZCB0byBoYXZlIHRoaXMgamFyIGluIHlvdXIgYnVpbGQgYW5kIHJ1bnRpbWUgY2xhc3MgcGF0aC4gVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgDQotaXMgdG8gY29weSBpdCB0byBBeGlzMl9IT01FL2xpYiBkaXJlY3RvcnkuDQotDQotQnVpbGRpbmcgdGhlIFNlcnZpY2UNCi09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVR5cGUgJGFudCBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcNCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi1UeXBlICRhbnQgcnBjLmNsaWVudCBmcm9tIGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZw0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE5NmQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InBvam9ndWlkZXNwcmluZyIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZ2VuZXJhdGUuc2VydmljZSI+Ci0KLQk8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KLQk8cHJvcGVydHkgbmFtZT0ic2VydmljZS1uYW1lIiB2YWx1ZT0iV2VhdGhlclNwcmluZ1NlcnZpY2UiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0idGFyZ2V0IiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vIiAvPgotCi0JPHByb3BlcnR5IG5hbWU9InJlcG9zaXRvcnkucGF0aCIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeSIgLz4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpci5jbGFzc2VzIiB2YWx1ZT0iJHtkZXN0LmRpcn0vY2xhc3NlcyIgLz4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpci5saWIiIHZhbHVlPSIke2Rlc3QuZGlyfS9saWIiIC8+Ci0KLQk8cHJvcGVydHkgbmFtZT0iY2F0YWxpbmEtbW9kdWxlcyIgdmFsdWU9IiR7ZW52LkNBVEFMSU5BX0hPTUV9L3dlYmFwcHMvYXhpczIvV0VCLUlORi9zZXJ2aWNlcyIgLz4KLQotCTxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2F4aXMyLmhvbWV9L2xpYiI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJPC9maWxlc2V0PgotCQk8IS0tYWRkIGRvd25sb2FkZWQgc3ByaW5nIGphcnMgdG8gY2xhc3NwYXRoLS0+Ci0JCTxmaWxlc2V0IGRpcj0ibGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCi0JPHBhdGggaWQ9ImNsaWVudC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiAvPgotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JPC9wYXRoPgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4ubGlicyI+Ci0JCTxkZWxldGUgZGlyPSJsaWIiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByZXBhcmUiIGRlcGVuZHM9ImNsZWFuIj4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiAvPgotCi0JCTxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30vTUVUQS1JTkYiIC8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZG93bmxvYWQuamFycyIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJwcmVwYXJlIj4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiAvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9L01FVEEtSU5GIiAvPgotCi0JCTxjb3B5IGZpbGU9InNyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIHRvZmlsZT0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQkJPGNvcHkgZmlsZT0ic3JjL2FwcGxpY2F0aW9uQ29udGV4dC54bWwiIHRvZmlsZT0iJHtkZXN0LmRpci5jbGFzc2VzfS9hcHBsaWNhdGlvbkNvbnRleHQueG1sIiBvdmVyd3JpdGU9InRydWUiIC8+Ci0KLQkJPGphdmFjIGRlYnVnPSJvbiIgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGluY2x1ZGVzPSJzYW1wbGUvKioiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLQotCQk8amFyIGJhc2VkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGRlc3RmaWxlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UtbmFtZX0uYWFyIiAvPgotCi0JCTxjb3B5IGZpbGU9IiR7ZGVzdC5kaXJ9LyR7c2VydmljZS1uYW1lfS5hYXIiIHRvZmlsZT0iJHtyZXBvc2l0b3J5LnBhdGh9L3NlcnZpY2VzLyR7c2VydmljZS1uYW1lfS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJycGMuY2xpZW50Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJycGMuY2xpZW50LnJ1biIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5jb21waWxlIiBkZXBlbmRzPSJwcmVwYXJlIj4KLQkJPGphdmFjIGRlYnVnPSJvbiIgc3JjZGlyPSJzcmMiIGRlc3RkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30iIGluY2x1ZGVzPSJjbGllbnQvKioiPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYnVpbGQuY2xhc3MucGF0aCIgLz4KLQkJPC9qYXZhYz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnBjLmNsaWVudC5ydW4iIGRlcGVuZHM9InJwYy5jbGllbnQuY29tcGlsZSI+Ci0JCTxlY2hvIG1lc3NhZ2U9IiR7YW50LmZpbGV9IiAvPgotCQk8amF2YSBjbGFzc25hbWU9ImNsaWVudC5XZWF0aGVyU3ByaW5nUlBDQ2xpZW50Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvcHkudG8udG9tY2F0IiBkZXBlbmRzPSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQkJPGNvcHkgZmlsZT0iJHtkZXN0LmRpcn0vJHtzZXJ2aWNlLW5hbWV9LmFhciIgdG9kaXI9IiR7Y2F0YWxpbmEtbW9kdWxlc30iIC8+Ci0JPC90YXJnZXQ+Ci0KLSAgICAgICAgPCEtLVdlIGFyZSBub3Qgc2hpcHBpbmcgc3ByaW5nIGphciB3aXRoIHRoZSByZWxlYXNlLiBUaGlzIHRhcmdldCBjYW4gYmUgdXNlZCB0bwotICAgICAgICBkb3dubG9hZCBzcHJpbmcgamFyIHRvIHJ1biB0aGlzIHNhbXBsZS4tLT4KLQk8dGFyZ2V0IG5hbWU9ImNoZWNrU3ByaW5nSmFyQXZhaWxhYmlsaXR5Ij4KLQkgICAgPCEtLWlmIGVpdGhlciBvbmUgb2YgamFyIGlzIG5vdCBhdmFpbGFibGUsIHNwcmluZ19hdmFpbGFibGUgd2lsbCBzZXQgdG8gZmFsc2UtLT4KLQkgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic3ByaW5nX2F2YWlsYWJsZSI+Ci0JCTxhbmQ+Ci0JCSAgICAgICAgPGF2YWlsYWJsZSBmaWxlPSJsaWIvc3ByaW5nLWNvcmUtMS4yLjguamFyIiAvPgotCQkJPGF2YWlsYWJsZSBmaWxlPSJsaWIvc3ByaW5nLWNvbnRleHQtMS4yLjguamFyIiAvPgkJCQotCSAgICAgICAgIAk8YXZhaWxhYmxlIGZpbGU9ImxpYi9zcHJpbmctYmVhbnMtMS4yLjguamFyIiAvPgotCQk8L2FuZD4KLQkgICAgPC9jb25kaXRpb24+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImRvd25sb2FkLmphcnMiIGRlcGVuZHM9ImNoZWNrU3ByaW5nSmFyQXZhaWxhYmlsaXR5IiB1bmxlc3M9InNwcmluZ19hdmFpbGFibGUiPgotCSAgICA8ZWNobyBtZXNzYWdlPSJTcHJpbmcgamFycyBub3QgYXZhaWxhYmxlLkRvd25sb2FkaW5nLi4uLiIvPgotCSAgICA8bWtkaXIgZGlyPSJsaWIiLz4KLSAgICAgICAgICAgIDxnZXQgc3JjPSJodHRwOi8vd3Muem9uZXMuYXBhY2hlLm9yZy9yZXBvc2l0b3J5L29yZy5zcHJpbmdmcmFtZXdvcmsvamFycy9zcHJpbmctY29yZS0xLjIuOC5qYXIiCi0JICAgICAgICAgICAgIGRlc3Q9ImxpYi9zcHJpbmctY29yZS0xLjIuOC5qYXIiIHZlcmJvc2U9InRydWUiLz4KLQkgICAgPGdldCBzcmM9Imh0dHA6Ly93cy56b25lcy5hcGFjaGUub3JnL3JlcG9zaXRvcnkvb3JnLnNwcmluZ2ZyYW1ld29yay9qYXJzL3NwcmluZy1jb250ZXh0LTEuMi44LmphciIKLQkgICAgICAgICAgICAgZGVzdD0ibGliL3NwcmluZy1jb250ZXh0LTEuMi44LmphciIgdmVyYm9zZT0idHJ1ZSIvPgotCSAgICA8Z2V0IHNyYz0iaHR0cDovL3dzLnpvbmVzLmFwYWNoZS5vcmcvcmVwb3NpdG9yeS9vcmcuc3ByaW5nZnJhbWV3b3JrL2phcnMvc3ByaW5nLWJlYW5zLTEuMi44LmphciIKLQkgICAgICAgICAgICAgZGVzdD0ibGliL3NwcmluZy1iZWFucy0xLjIuOC5qYXIiIHZlcmJvc2U9InRydWUiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFiNTgwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlR3JvdXA+Ci0gIDxzZXJ2aWNlIG5hbWU9IlNwcmluZ0luaXQiIGNsYXNzPSJzYW1wbGUuc3ByaW5nLnNlcnZpY2UuU3ByaW5nSW5pdCI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyB3ZWIgc2VydmljZSBpbml0aWFsaXplcyBTcHJpbmcuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgPnNhbXBsZS5zcHJpbmcuc2VydmljZS5TcHJpbmdJbml0PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlVENDTCIgPmNvbXBvc2l0ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibG9hZC1vbi1zdGFydHVwIiA+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0ic3ByaW5nSW5pdCI+Ci0gICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvb3BlcmF0aW9uPgotICA8L3NlcnZpY2U+Ci0gIDxzZXJ2aWNlIG5hbWU9IldlYXRoZXJTcHJpbmdTZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBXZWF0aGVyIFNwcmluZyBQT0pPIEF4aXMyIEFBUiBkZXBsb3ltZW50Ci0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyIgPnNhbXBsZS5zcHJpbmcuc2VydmljZS5XZWF0aGVyU3ByaW5nU2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZU9iamVjdFN1cHBsaWVyIiA+b3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnMuU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXI8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNwcmluZ0JlYW5OYW1lIiA+d2VhdGhlclNwcmluZ1NlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgPC9zZXJ2aWNlPgotPC9zZXJ2aWNlR3JvdXA+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvYXBwbGljYXRpb25Db250ZXh0LnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRmY2I2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLSAgPGJlYW4gaWQ9ImFwcGxpY2F0aW9uQ29udGV4dCIgCi0gICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzLkFwcGxpY2F0aW9uQ29udGV4dEhvbGRlciIgLz4KLQotICA8YmVhbiBpZD0id2VhdGhlclNwcmluZ1NlcnZpY2UiIGNsYXNzPSJzYW1wbGUuc3ByaW5nLnNlcnZpY2UuV2VhdGhlclNwcmluZ1NlcnZpY2UiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ3ZWF0aGVyIiByZWY9IndlYXRoZXJCZWFuIi8+Ci0gIDwvYmVhbj4KLQotICA8YmVhbiBpZD0id2VhdGhlckJlYW4iIGNsYXNzPSJzYW1wbGUuc3ByaW5nLmJlYW4uV2VhdGhlciI+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlbXBlcmF0dXJlIiB2YWx1ZT0iODkuOSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JlY2FzdCIgdmFsdWU9IlN1bm55Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJhaW4iIHZhbHVlPSJmYWxzZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJob3dNdWNoUmFpbiIgdmFsdWU9IjAuMiIvPgotICA8L2JlYW4+Ci08L2JlYW5zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvc3JjL2NsaWVudC9XZWF0aGVyU3ByaW5nUlBDQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvY2xpZW50L1dlYXRoZXJTcHJpbmdSUENDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjOTA0My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvY2xpZW50L1dlYXRoZXJTcHJpbmdSUENDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJwYy5jbGllbnQuUlBDU2VydmljZUNsaWVudDsKLQotaW1wb3J0IHNhbXBsZS5zcHJpbmcuYmVhbi5XZWF0aGVyOwotCi1wdWJsaWMgY2xhc3MgV2VhdGhlclNwcmluZ1JQQ0NsaWVudCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzMSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgUlBDU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFJQQ1NlcnZpY2VDbGllbnQoKTsKLQotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBzZXJ2aWNlQ2xpZW50LmdldE9wdGlvbnMoKTsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgCi0gICAgICAgICAgICAgICAgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9XZWF0aGVyU3ByaW5nU2VydmljZSIpOyAKLSAgICAgICAgCi0gICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQotICAgICAgICAvLyBHZXQgdGhlIHdlYXRoZXIgKG5vIHNldHRpbmcsIHRoZSBTcHJpbmcgRnJhbWV3b3JrIGhhcyBhbHJlYWR5IGluaXRpYWxpemVkIGl0IGZvciB1cykKLSAgICAgICAgUU5hbWUgb3BHZXRXZWF0aGVyID0gbmV3IFFOYW1lKCJodHRwOi8vc2VydmljZS5zcHJpbmcuc2FtcGxlL3hzZCIsICJnZXRXZWF0aGVyIik7Ci0KLSAgICAgICAgT2JqZWN0W10gb3BHZXRXZWF0aGVyQXJncyA9IG5ldyBPYmplY3RbXSB7IH07Ci0gICAgICAgIENsYXNzW10gcmV0dXJuVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IFdlYXRoZXIuY2xhc3MgfTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBPYmplY3RbXSByZXNwb25zZSA9IHNlcnZpY2VDbGllbnQuaW52b2tlQmxvY2tpbmcob3BHZXRXZWF0aGVyLAotICAgICAgICAgICAgICAgIG9wR2V0V2VhdGhlckFyZ3MsIHJldHVyblR5cGVzKTsKLSAgICAgICAgCi0gICAgICAgIFdlYXRoZXIgcmVzdWx0ID0gKFdlYXRoZXIpIHJlc3BvbnNlWzBdOwotICAgICAgICAKLSAgICAgICAgLy8gZGlzcGxheSByZXN1bHRzCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXZWF0aGVyIGRpZG4ndCBpbml0aWFsaXplISIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVtcGVyYXR1cmUgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRUZW1wZXJhdHVyZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9yZWNhc3QgICAgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRGb3JlY2FzdCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmFpbiAgICAgICAgICAgICAgICAgICAgICA6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRSYWluKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIb3cgbXVjaCByYWluIChpbiBpbmNoZXMpIDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldEhvd011Y2hSYWluKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9wb2pvZ3VpZGVzcHJpbmcvc3JjL3NhbXBsZS9zcHJpbmcvYmVhbi9XZWF0aGVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9iZWFuL1dlYXRoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMjUxNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9iZWFuL1dlYXRoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zcHJpbmcuYmVhbjsKLQotcHVibGljIGNsYXNzIFdlYXRoZXJ7Ci0gICAgZmxvYXQgdGVtcGVyYXR1cmU7Ci0gICAgU3RyaW5nIGZvcmVjYXN0OwotICAgIGJvb2xlYW4gcmFpbjsKLSAgICBmbG9hdCBob3dNdWNoUmFpbjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUZW1wZXJhdHVyZShmbG9hdCB0ZW1wKXsKLSAgICAgICAgdGVtcGVyYXR1cmUgPSB0ZW1wOwotICAgIH0KLQotICAgIHB1YmxpYyBmbG9hdCBnZXRUZW1wZXJhdHVyZSgpewotICAgICAgICByZXR1cm4gdGVtcGVyYXR1cmU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEZvcmVjYXN0KFN0cmluZyBmb3JlKXsKLSAgICAgICAgZm9yZWNhc3QgPSBmb3JlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9yZWNhc3QoKXsKLSAgICAgICAgcmV0dXJuIGZvcmVjYXN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRSYWluKGJvb2xlYW4gcil7Ci0gICAgICAgIHJhaW4gPSByOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFJhaW4oKXsKLSAgICAgICAgcmV0dXJuIHJhaW47Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEhvd011Y2hSYWluKGZsb2F0IGhvd011Y2gpewotICAgICAgICBob3dNdWNoUmFpbiA9IGhvd011Y2g7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldEhvd011Y2hSYWluKCl7Ci0gICAgICAgIHJldHVybiBob3dNdWNoUmFpbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9zZXJ2aWNlL1NwcmluZ0luaXQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvU3ByaW5nSW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM5Mzk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvU3ByaW5nSW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNwcmluZy5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuU2VydmljZUxpZmVDeWNsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LnN1cHBvcnQuQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdJbml0IGltcGxlbWVudHMgU2VydmljZUxpZmVDeWNsZSB7Ci0gICAgICAgIAotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2dnZXIgPSBMb2dGYWN0b3J5Ci0gICAgICAgIC5nZXRMb2coU3ByaW5nSW5pdCAuY2xhc3MpOwotCi0gICAgLy8gVGhlIHdlYiBzZXJ2aWNlCi0gICAgcHVibGljIE9NRWxlbWVudCBzcHJpbmdJbml0KE9NRWxlbWVudCBpZ25vcmUpIHsKLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbkNvbnRleHQoT3BlcmF0aW9uQ29udGV4dCBhcmcwKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KFNlcnZpY2VDb250ZXh0IGFyZzApIHsKLQotICAgIH0KLQotICAgICAvKioKLSAgICAgKiB0aGlzIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGVwbG95ZW1lbnQgdGltZSBvZiB0aGUgc2VydmljZS4gaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFVwKENvbmZpZ3VyYXRpb25Db250ZXh0IGlnbm9yZSwgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGFwcEN0eCA9IG5ldwotICAgICAgICAgICAgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0KG5ldyBTdHJpbmdbXSB7ImFwcGxpY2F0aW9uQ29udGV4dC54bWwifSwgZmFsc2UpOwotICAgICAgICBhcHBDdHguc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwotICAgICAgICBhcHBDdHgucmVmcmVzaCgpOwotICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiXG5cbnN0YXJ0VXAoKSBzZXQgc3ByaW5nIGNsYXNzbG9hZGVyIHZpYSBheGlzU2VydmljZS5nZXRDbGFzc0xvYWRlcigpIC4uLiAiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiB0aGlzIHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgZGVwbG95ZW1lbnQgdGltZSBvZiB0aGUgc2VydmljZS4gaXJyZXNwZWN0aXZlCi0gICAgICogb2YgdGhlIHNlcnZpY2Ugc2NvcGUgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaHV0RG93bihDb25maWd1cmF0aW9uQ29udGV4dCBpZ25vcmUsIEF4aXNTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvV2VhdGhlclNwcmluZ1NlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcG9qb2d1aWRlc3ByaW5nL3NyYy9zYW1wbGUvc3ByaW5nL3NlcnZpY2UvV2VhdGhlclNwcmluZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NWExZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Bvam9ndWlkZXNwcmluZy9zcmMvc2FtcGxlL3NwcmluZy9zZXJ2aWNlL1dlYXRoZXJTcHJpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc3ByaW5nLnNlcnZpY2U7Ci0KLWltcG9ydCBzYW1wbGUuc3ByaW5nLmJlYW4uV2VhdGhlcjsKLQotcHVibGljIGNsYXNzIFdlYXRoZXJTcHJpbmdTZXJ2aWNlewotICAgIFdlYXRoZXIgd2VhdGhlcjsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRXZWF0aGVyKFdlYXRoZXIgdyl7Ci0gICAgICAgIHdlYXRoZXIgPSB3OwotICAgIH0KLQotICAgIHB1YmxpYyBXZWF0aGVyIGdldFdlYXRoZXIoKXsKLSAgICAgICAgcmV0dXJuIHdlYXRoZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNGRjMzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1BeGlzMiBRdWljayBTdGFydCBHdWlkZS0gU2FtcGxlIDENCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBjb250YWlucyBzb3VyY2UgY29kZSBmb3IgdGhlIHhkb2NzLzFfMS9xdWlja3N0YXJ0Z3VpZGUuaHRtbCBkb2N1bWVudCBmb3VuZCBpbiANCi10aGUgZXh0cmFjdGVkIEF4aXMyIERvY3VtZW50cyBEaXN0cmlidXRpb24uIEZvciBhIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb24gdGhlIA0KLXNvdXJjZSBjb2RlIGtpbmRseSBzZWUgdGhpcyAnQXhpczIgUXVpY2sgU3RhcnQgR3VpZGUnIGRvY3VtZW50Lg0KLQ0KLUludHJvZHVjdGlvbg0KLT09PT09PT09PT09PQ0KLUluIHRoaXMgc2FtcGxlLCB3ZSBhcmUgZGVwbG95aW5nIGEgUE9KTyBhZnRlciB3cml0aW5nIGEgc2VydmljZXMueG1sIGFuZA0KLWNyZWF0aW5nIGFuIGFhci4gV2UgYWxzbyB0ZXN0IHRoZSBnZVByaWNlIGFuZCB1cGRhdGUgbWV0aG9kcyB1c2luZyBhIGJyb3dzZXIuDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIG9yIGp1c3QgImFudCIgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydCBkaXJlY3RvcnkgDQotYW5kIHRoZW4gZGVwbG95IHRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydC9idWlsZC9TdG9ja1F1b3RlU2VydmljZS5hYXINCi0NCi1HZW5lcmF0ZSBXU0RMDQotPT09PT09PT09PT09PT0NCi0NCi1UeXBlICJhbnQgZ2VuZXJhdGUud3NkbCIgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydCBkaXJlY3Rvcnkgd2hpY2ggZ2VuZXJhdGVzIGEgDQotV1NETCBmaWxlIGZvciB0aGUgYWJvdmUgV2ViIHNlcnZpY2UgYW5kIGl0IHdpbGwgYmUgcGxhY2VkIGluIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0L2J1aWxkIA0KLWRpcmVjdG9yeS4NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0tIEZyb20geW91ciBicm93c2VyLCBJZiB5b3UgcG9pbnQgdG8gdGhlIGZvbGxvd2luZyBVUkw6DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlL2dldFByaWNlP3N5bWJvbD1JQk0NCi0NCi1Zb3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyByZXNwb25zZToNCi08bnM6Z2V0UHJpY2VSZXNwb25zZT48bnM6cmV0dXJuPjQyLjA8L25zOnJldHVybj48L25zOmdldFByaWNlUmVzcG9uc2U+DQotDQotLSBJZiB5b3UgaW52b2tlIHRoZSB1cGRhdGUgbWV0aG9kIGxpa2Ugc286DQotaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlL3VwZGF0ZT9zeW1ib2w9SUJNJnByaWNlPTEwMA0KLQ0KLUFuZCB0aGVuIGV4ZWN1dGUgdGhlIGZpcnN0IGdldFByaWNlIHVybC4gWW91IGNhbiBzZWUgdGhhdCB0aGUgcHJpY2UgZ290IHVwZGF0ZWQuDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM3NWVhMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJxdWlja3N0YXJ0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkFYSVMyX0hPTUUiIHZhbHVlPSIuLi8uLiIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnNlcnZpY2UiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KLQotICAgICAgICA8IS0tRmlyc3QgbGV0J3MgY29tcGlsZSB0aGUgY2xhc3Nlcy0tPgotICAgICAgICA8amF2YWMgZGVidWc9Im9uIiAKLSAgICAgICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgCi0gICAgICAgICAgICAgICBzcmNkaXI9IiR7YmFzZWRpcn0vc3JjIgotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS53c2RsIiBkZXBlbmRzPSJjb21waWxlLnNlcnZpY2UiPgotICAgICAgICA8dGFza2RlZiBuYW1lPSJqYXZhMndzZGwiCi0gICAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMVGFzayIKLSAgICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiLz4KLSAgICAgICAgPGphdmEyd3NkbCBjbGFzc05hbWU9InNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnBvam8uU3RvY2tRdW90ZVNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgb3V0cHV0TG9jYXRpb249IiR7YnVpbGQuZGlyfSIKLSAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIgotICAgICAgICAgICAgICAgICAgIHNjaGVtYVRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtheGlzMi5jbGFzc3BhdGh9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YTJ3c2RsPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJjb21waWxlLnNlcnZpY2UiPgotICAgICAgICA8IS0tYWFyIHRoZW0gdXAgLS0+Ci0gICAgICAgIDxjb3B5IHRvRGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgZmFpbG9uZXJyb3I9ImZhbHNlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9yZXNvdXJjZXMiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L1N0b2NrUXVvdGVTZXJ2aWNlLmFhciI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBleGNsdWRlcz0iKiovVGVzdC5jbGFzcyIgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgotICAgICAgICA8L2phcj4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnQvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjI3ODlhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08c2VydmljZSBuYW1lPSJTdG9ja1F1b3RlU2VydmljZSIgc2NvcGU9ImFwcGxpY2F0aW9uIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFN0b2NrIFF1b3RlIFNlcnZpY2UKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENJbk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPHNjaGVtYSBzY2hlbWFOYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIi8+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnBvam8uU3RvY2tRdW90ZVNlcnZpY2U8L3BhcmFtZXRlcj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvcG9qby9TdG9ja1F1b3RlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9wb2pvL1N0b2NrUXVvdGVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjZiNzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9wb2pvL1N0b2NrUXVvdGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5wb2pvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldFByaWNlKFN0cmluZyBzeW1ib2wpIHsKLSAgICAgICAgRG91YmxlIHByaWNlID0gKERvdWJsZSkgbWFwLmdldChzeW1ib2wpOwotICAgICAgICBpZihwcmljZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiBwcmljZS5kb3VibGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiA0Mi4wMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIHN5bWJvbCwgZG91YmxlIHByaWNlKSB7Ci0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBuZXcgRG91YmxlKHByaWNlKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg5ZThkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUF4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlLSBTYW1wbGUgMiAoQURCKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBzYW1wbGUgY29udGFpbnMgc291cmNlIGNvZGUgZm9yIHRoZSB4ZG9jcy8xXzEvcXVpY2tzdGFydGd1aWRlLmh0bWwgZG9jdW1lbnQgZm91bmQgaW4gDQotdGhlIGV4dHJhY3RlZCBBeGlzMiBEb2N1bWVudHMgRGlzdHJpYnV0aW9uLiBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9uIHRoZSANCi1zb3VyY2UgY29kZSBraW5kbHkgc2VlIHRoaXMgJ0F4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlJyBkb2N1bWVudC4NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1JbiB0aGlzIHNhbXBsZSwgd2UgYXJlIGRlcGxveWluZyBhbiBBREIgZ2VuZXJhdGVkIHNlcnZpY2UuIFRoZSBzZXJ2aWNlDQotaXMgdGVzdGVkIHVzaW5nIGdlbmVyYXRlZCBjbGllbnQgc3R1YnMuDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRhZGINCi1kaXJlY3RvcnkgYW5kIHRoZW4gZGVwbG95IHRoZSANCi1BeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYi9TdG9ja1F1b3RlU2VydmljZS5hYXINCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi10eXBlIGFudCBydW4uY2xpZW50IGluIHRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYiBkaXJlY3RvcnkNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91DQotaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWRlOTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InF1aWNrc3RhcnRhZGIiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImdlbmVyYXRlLnNlcnZpY2UiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iQVhJUzJfSE9NRSIgdmFsdWU9Ii4uLy4uIi8+Ci0KLQk8cHJvcGVydHkgbmFtZT0id3NkbC51cmkiIHZhbHVlPSIuL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsIi8+Ci0JPHByb3BlcnR5IG5hbWU9InNlcnZpY2UudGFyZ2V0IiB2YWx1ZT0iYnVpbGQvc2VydmljZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGllbnQudGFyZ2V0IiB2YWx1ZT0iYnVpbGQvY2xpZW50Ii8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KLQotICAgIDxwYXRoIGlkPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdGggaWQ9ImNsaWVudC5jbGFzcy5wYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQvYnVpbGQvbGliIiA+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vc2VydmljZSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vY2xpZW50Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtzZXJ2aWNlLnRhcmdldH0vY2xhc3NlcyIvPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXVyaSAke3dzZGwudXJpfSIvPgotCQkJPGFyZyBsaW5lPSItcyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItc3MiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXNkIi8+Ci0JCQk8YXJnIGxpbmU9Ii1zc2kiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWFwIi8+Ci0JCQk8YXJnIGxpbmU9Ii1uczJwIGh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkPXNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi54c2QiLz4KLQkJCTxhcmcgbGluZT0iLWwgamF2YSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItcCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgYWRiIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7YnVpbGQuZGlyfS9zZXJ2aWNlIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgICAgCi0JCTxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2FkYi9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2J1aWxkLmRpcn0vc2VydmljZS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvYWRiLyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPiAgICAKLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2J1aWxkLmRpcn0vc2VydmljZS9yZXNvdXJjZXMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vJHtBWElTMl9IT01FfSIvPgotICAgICAgICA8L2FudD4gCi0JCTxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQvc2VydmljZS9idWlsZC9saWIvU3RvY2tRdW90ZVNlcnZpY2UuYWFyIgotICAgICAgICAgICAgICB0b0Rpcj0iJHtiYXNlZGlyfS8uLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLQkJCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLmNsaWVudCI+Ci0JCTxkZWxldGUgZGlyPSIke2NsaWVudC50YXJnZXR9Ii8+Ci0JCTxta2RpciBkaXI9IiR7Y2xpZW50LnRhcmdldH0iLz4KLSAgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1uczJwIGh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkPXNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi54c2QiLz4KLQkJCTxhcmcgbGluZT0iLWwgamF2YSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItcCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgYWRiIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7YnVpbGQuZGlyfS9jbGllbnQiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9BREJDbGllbnQuamF2YSIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzLyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxhbnQgZGlyPSIke2J1aWxkLmRpcn0vY2xpZW50Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vJHtBWElTMl9IT01FfSIvPgotICAgICAgICA8L2FudD4KLQkJCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLmFsbCIgZGVwZW5kcz0iZ2VuZXJhdGUuc2VydmljZSwgZ2VuZXJhdGUuY2xpZW50Ii8+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImdlbmVyYXRlLmNsaWVudCI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHMuQURCQ2xpZW50Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORi9TdG9ja1F1b3RlU2VydmljZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNkMzgzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6YXhpczI9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgeG1sbnM6bnM9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyI+PHdzZGw6dHlwZXM+PHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIj4KLTx4czplbGVtZW50IG5hbWU9ImdldFByaWNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiIC8+Ci08L3hzOnNlcXVlbmNlPgotPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLTx4czplbGVtZW50IG5hbWU9InVwZGF0ZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci08eHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPC94czpzY2hlbWE+PC93c2RsOnR5cGVzPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZSIgLz48L3dzZGw6bWVzc2FnZT48d3NkbDptZXNzYWdlIG5hbWU9ImdldFByaWNlUmVzcG9uc2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZVJlc3BvbnNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0idXBkYXRlTWVzc2FnZSI+PHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnM6dXBkYXRlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOnBvcnRUeXBlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6Z2V0UHJpY2VNZXNzYWdlIiAvPjx3c2RsOm91dHB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZVJlc3BvbnNlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjx3c2RsOmlucHV0IG1lc3NhZ2U9ImF4aXMyOnVwZGF0ZU1lc3NhZ2UiIC8+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6cG9ydFR5cGU+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0UHJpY2UiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnVwZGF0ZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOmJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTJCaW5kaW5nIiB0eXBlPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlIj48c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjx3c2RsOm91dHB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6YmluZGluZz48d3NkbDpzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj48d3NkbDpwb3J0IG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExcG9ydCIgYmluZGluZz0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFCaW5kaW5nIj48c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PC93c2RsOnNlcnZpY2U+PC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGFkYi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDZlZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiLlN0b2NrUXVvdGVTZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5PdXQiLz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIuU3RvY2tRdW90ZVNlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk9ubHkiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi5TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uCi0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46dXBkYXRlPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjpnZXRQcmljZTwvYWN0aW9uTWFwcGluZz4KLSAgICAgICAgPG91dHB1dEFjdGlvbk1hcHBpbmc+aHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy9TdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlL2dldFByaWNlUmVzcG9uc2U8L291dHB1dEFjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FEQkNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9BREJDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0MDQzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FEQkNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHM7Ci0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIuU3RvY2tRdW90ZVNlcnZpY2VTdHViOwotcHVibGljIGNsYXNzIEFEQkNsaWVudHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nIGFyZ3NbXSl7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViID0KLSAgICAgICAgICAgICAgICBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViCi0gICAgICAgICAgICAgICAgKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiKTsKLQotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7Ci0gICAgICAgICAgICB1cGRhdGUoc3R1Yik7Ci0gICAgICAgICAgICBnZXRQcmljZShzdHViKTsKLQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZmlyZSBhbmQgZm9yZ2V0ICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZShTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1Yil7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yi5VcGRhdGUgcmVxID0gbmV3IFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yi5VcGRhdGUoKTsKLSAgICAgICAgICAgIHJlcS5zZXRTeW1ib2wgKCJBQkMiKTsKLSAgICAgICAgICAgIHJlcS5zZXRQcmljZSAoNDIuMzUpOwotCi0gICAgICAgICAgICBzdHViLnVwZGF0ZShyZXEpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJwcmljZSB1cGRhdGVkIik7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB0d28gd2F5IGNhbGwvcmVjZWl2ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQcmljZShTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1Yil7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFN0b2NrUXVvdGVTZXJ2aWNlU3R1Yi5HZXRQcmljZSByZXEgPSBuZXcgU3RvY2tRdW90ZVNlcnZpY2VTdHViLkdldFByaWNlKCk7Ci0KLSAgICAgICAgICAgIHJlcS5zZXRTeW1ib2woIkFCQyIpOwotCi0gICAgICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIuR2V0UHJpY2VSZXNwb25zZSByZXMgPQotICAgICAgICAgICAgICAgIHN0dWIuZ2V0UHJpY2UocmVxKTsKLQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHJlcy5nZXRfcmV0dXJuKCkpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2FkYi9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRhZGIvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2FkYi9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGJmNDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YWRiL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9hZGIvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYWRiOwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLmFkYi54c2QuR2V0UHJpY2VSZXNwb25zZTsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIueHNkLlVwZGF0ZTsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5hZGIueHNkLkdldFByaWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1wdWJsaWMgY2xhc3MgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbiBpbXBsZW1lbnRzIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b25JbnRlcmZhY2UgewotICAgIHByaXZhdGUgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKFVwZGF0ZSBwYXJhbTApIHsKLSAgICAgICAgbWFwLnB1dChwYXJhbTAuZ2V0U3ltYm9sKCksIG5ldyBEb3VibGUocGFyYW0wLmdldFByaWNlKCkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR2V0UHJpY2VSZXNwb25zZSBnZXRQcmljZShHZXRQcmljZSBwYXJhbTEpIHsKLSAgICAgICAgRG91YmxlIHByaWNlID0gKERvdWJsZSkgbWFwLmdldChwYXJhbTEuZ2V0U3ltYm9sKCkpOwotICAgICAgICBkb3VibGUgcmV0ID0gNDI7Ci0gICAgICAgIGlmKHByaWNlICE9IG51bGwpewotICAgICAgICAgICAgcmV0ID0gcHJpY2UuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBHZXRQcmljZVJlc3BvbnNlIHJlcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEdldFByaWNlUmVzcG9uc2UoKTsKLSAgICAgICAgcmVzLnNldF9yZXR1cm4ocmV0KTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyYjg4ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotQXhpczIgUXVpY2sgU3RhcnQgR3VpZGUgLSBTYW1wbGUgMyAoQVhJT00pDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBzYW1wbGUgY29udGFpbnMgc291cmNlIGNvZGUgZm9yIHRoZSB4ZG9jcy8xXzEvcXVpY2tzdGFydGd1aWRlLmh0bWwgZG9jdW1lbnQgZm91bmQgaW4gDQotdGhlIGV4dHJhY3RlZCBBeGlzMiBEb2N1bWVudHMgRGlzdHJpYnV0aW9uLiBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9uIHRoZSANCi1zb3VyY2UgY29kZSBraW5kbHkgc2VlIHRoaXMgJ0F4aXMyIFF1aWNrIFN0YXJ0IEd1aWRlJyBkb2N1bWVudC4NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1JbiB0aGlzIHNhbXBsZSwgd2UgYXJlIGRlcGxveWluZyBhbiBBWElPTSBiYXNlZCBQT0pPIHNlcnZpY2UgYWZ0ZXIgd3JpdGluZw0KLWEgc2VydmljZXMueG1sIGFuZCBjcmVhdGluZyBhbiBhYXIuIFdlIGFsc28gdGVzdCBzdWNjZXNzZnVsDQotZGVwbG95bWVudCB1c2luZyBhbiBBWElPTSBiYXNlZCBjbGllbnQuDQotDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIGZyb20gQVhJUzJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbSBkaXJlY3RvcnkuDQotVGhlbiBkZXBsb3kgdGhlIA0KLUFYSVMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vYnVpbGQvU3RvY2tRdW90ZVNlcnZpY2UuYWFyDQotDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSBhbnQgcnVuLmNsaWVudCBpbiB0aGUgQVhJUzJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbSBkaXJlY3RvcnkNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUNCi1hbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk2YjE5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0icXVpY2tzdGFydGF4aW9tIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkFYSVMyX0hPTUUiIHZhbHVlPSIuLi8uLiIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCTxwYXRoIGlkPSJjbGllbnQuY2xhc3MucGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgLz4KLQk8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KLQotICAgICAgICA8IS0tRmlyc3QgbGV0J3MgY29tcGlsZSB0aGUgY2xhc3Nlcy0tPgotICAgICAgICA8amF2YWMgZGVidWc9Im9uIiAKLSAgICAgICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgCi0gICAgICAgICAgICAgICBzcmNkaXI9IiR7YmFzZWRpcn0vc3JjIgotICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPCEtLWFhciB0aGVtIHVwIC0tPgotICAgICAgICA8Y29weSB0b0Rpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIGZhaWxvbmVycm9yPSJmYWxzZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vcmVzb3VyY2VzIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoud3NkbCIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGQuZGlyfS9TdG9ja1F1b3RlU2VydmljZS5hYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZXhjbHVkZXM9IioqL1Rlc3QuY2xhc3MiIGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KLSAgICAgICAgPC9qYXI+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZXMucXVpY2tzdGFydC5jbGllbnRzLkFYSU9NQ2xpZW50Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1ZTQ2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6YXhpczI9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgeG1sbnM6bnM9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyI+PHdzZGw6dHlwZXM+PHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIj4KLTx4czplbGVtZW50IG5hbWU9ImdldFByaWNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiIC8+Ci08L3hzOnNlcXVlbmNlPgotPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLTx4czplbGVtZW50IG5hbWU9InVwZGF0ZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci08eHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPC94czpzY2hlbWE+PC93c2RsOnR5cGVzPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZSIgLz48L3dzZGw6bWVzc2FnZT48d3NkbDptZXNzYWdlIG5hbWU9ImdldFByaWNlUmVzcG9uc2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZVJlc3BvbnNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0idXBkYXRlTWVzc2FnZSI+PHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnM6dXBkYXRlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOnBvcnRUeXBlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6Z2V0UHJpY2VNZXNzYWdlIiAvPjx3c2RsOm91dHB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZVJlc3BvbnNlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjx3c2RsOmlucHV0IG1lc3NhZ2U9ImF4aXMyOnVwZGF0ZU1lc3NhZ2UiIC8+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6cG9ydFR5cGU+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0UHJpY2UiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnVwZGF0ZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOmJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTJCaW5kaW5nIiB0eXBlPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlIj48c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjx3c2RsOm91dHB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6YmluZGluZz48d3NkbDpzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj48d3NkbDpwb3J0IG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExcG9ydCIgYmluZGluZz0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFCaW5kaW5nIj48c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PHdzZGw6cG9ydCBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMnBvcnQiIGJpbmRpbmc9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlU09BUDEyQmluZGluZyI+PHNvYXAxMjphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PC93c2RsOnNlcnZpY2U+PC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRheGlvbS9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQxOTc3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgU3RvY2sgUXVvdGUgU2VydmljZQotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuYXhpb20uU3RvY2tRdW90ZVNlcnZpY2U8L3BhcmFtZXRlcj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9BWElPTUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FYSU9NQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMmI2ZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0FYSU9NQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1wdWJsaWMgY2xhc3MgQVhJT01DbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gCi0gICAgICAgIG5ldyBFbmRwb2ludFJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGdldFByaWNlUGF5bG9hZChTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiLCAidG5zIik7Ci0KLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImdldFByaWNlIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInN5bWJvbCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCBzeW1ib2wpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCB1cGRhdGVQYXlsb2FkKFN0cmluZyBzeW1ib2wsIGRvdWJsZSBwcmljZSkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIiwgInRucyIpOwotCi0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJ1cGRhdGUiLCBvbU5zKTsKLQotICAgICAgICBPTUVsZW1lbnQgdmFsdWUxID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgic3ltYm9sIiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlMS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlMSwgc3ltYm9sKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZTEpOwotCi0gICAgICAgIE9NRWxlbWVudCB2YWx1ZTIgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJwcmljZSIsIG9tTnMpOwotICAgICAgICB2YWx1ZTIuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS50b1N0cmluZyhwcmljZSkpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlMik7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT01FbGVtZW50IGdldFByaWNlUGF5bG9hZCA9IGdldFByaWNlUGF5bG9hZCgiV1NPIik7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgdXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQoIldTTyIsIDEyMy40Mik7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotCi0gICAgICAgICAgICBzZW5kZXIuZmlyZUFuZEZvcmdldCh1cGRhdGVQYXlsb2FkKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicHJpY2UgdXBkYXRlZCIpOwotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShnZXRQcmljZVBheWxvYWQpOwotCi0gICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSByZXN1bHQuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDdXJyZW50IHByaWNlIG9mIFdTTzogIiArIHJlc3BvbnNlKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGF4aW9tL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9heGlvbS9TdG9ja1F1b3RlU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2F4aW9tL1N0b2NrUXVvdGVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjk2OWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0YXhpb20vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2F4aW9tL1N0b2NrUXVvdGVTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5heGlvbTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZSB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2QiOwotCi0gICAgcHVibGljIE9NRWxlbWVudCBnZXRQcmljZShPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIGVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgZWxlbWVudC5kZXRhY2goKTsKLQotICAgICAgICBPTUVsZW1lbnQgc3ltYm9sRWxlbWVudCA9IGVsZW1lbnQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBzeW1ib2wgPSBzeW1ib2xFbGVtZW50LmdldFRleHQoKTsKLQotICAgICAgICBTdHJpbmcgcmV0dXJuVGV4dCA9ICI0MiI7Ci0gICAgICAgIERvdWJsZSBwcmljZSA9IChEb3VibGUpIG1hcC5nZXQoc3ltYm9sKTsKLSAgICAgICAgaWYocHJpY2UgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm5UZXh0ICA9ICIiICsgcHJpY2UuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPQotICAgICAgICAgICAgZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKG5hbWVzcGFjZSwgIm5zIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJnZXRQcmljZVJlc3BvbnNlIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInJldHVybiIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCByZXR1cm5UZXh0KSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgZWxlbWVudC5idWlsZCgpOwotICAgICAgICBlbGVtZW50LmRldGFjaCgpOwotCi0gICAgICAgIE9NRWxlbWVudCBzeW1ib2xFbGVtZW50ID0gZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKG5hbWVzcGFjZSwgInN5bWJvbCIpKTsKLSAgICAgICAgU3RyaW5nIHN5bWJvbCA9IHN5bWJvbEVsZW1lbnQuZ2V0VGV4dCgpOwotCi0gICAgICAgIE9NRWxlbWVudCBwcmljZUVsZW1lbnQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUobmFtZXNwYWNlLCAicHJpY2UiKSk7Ci0gICAgICAgIFN0cmluZyBwcmljZSA9IHByaWNlRWxlbWVudC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgbWFwLnB1dChzeW1ib2wsIG5ldyBEb3VibGUocHJpY2UpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDZjNGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotQXhpczIgUXVpY2sgU3RhcnQgR3VpZGUtIChKaUJYKQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotSW50cm9kdWN0aW9uDQotPT09PT09PT09PT09DQotSW4gdGhpcyBzYW1wbGUsIHdlIGFyZSBkZXBsb3lpbmcgYSBKaUJYIGdlbmVyYXRlZCBzZXJ2aWNlLiBUaGUgc2VydmljZQ0KLWlzIHRlc3RlZCB1c2luZyBnZW5lcmF0ZWQgY2xpZW50IHN0dWJzLg0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotQnVpbGRpbmcgdGhlIFNlcnZpY2UNCi09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVR5cGUgImFudCBnZW5lcmF0ZS5zZXJ2aWNlIiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0amlieA0KLWRpcmVjdG9yeSBhbmQgdGhlbiBkZXBsb3kgdGhlIA0KLUF4aXMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYi9TdG9ja1F1b3RlU2VydmljZS5hYXINCi0NCi1SdW5uaW5nIHRoZSBDbGllbnQNCi09PT09PT09PT09PT09PT09PT0NCi0NCi10eXBlIGFudCBydW4uY2xpZW50IGluIHRoZSBBeGlzMl9IT01FL3NhbXBsZXMvcXVpY2tzdGFydGFkYiBkaXJlY3RvcnkNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91DQotaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA2ZjM2OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InF1aWNrc3RhcnRqaWJ4IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5hbGwiPgotCi0gICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iQVhJUzJfSE9NRSIgdmFsdWU9Ii4uLy4uIi8+Ci0JPHByb3BlcnR5IG5hbWU9IndzZGwudXJpIiB2YWx1ZT0iLi9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCIvPgotCTxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnRhcmdldCIgdmFsdWU9ImJ1aWxkL3NlcnZpY2UiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2xpZW50LnRhcmdldCIgdmFsdWU9ImJ1aWxkL2NsaWVudCIvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIi8+Ci0KLSAgICA8cGF0aCBpZD0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke0FYSVMyX0hPTUV9L2xpYiI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotICAgIDxwYXRoIGlkPSJjbGllbnQuY2xhc3MucGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0vY2xpZW50L2J1aWxkL2xpYiIgPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vc2VydmljZSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vY2xpZW50Ii8+Ci0gICAgPC90YXJnZXQ+Ci0JCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5zZXJ2aWNlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhIiBmb3JrPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii11cmkgJHt3c2RsLnVyaX0iLz4KLQkJCTxhcmcgbGluZT0iLXMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXNzIi8+Ci0JCQk8YXJnIGxpbmU9Ii11dyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItc2QiLz4KLQkJCTxhcmcgbGluZT0iLXNzaSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItYXAiLz4KLQkJCTxhcmcgbGluZT0iLW5zMnAgaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2Q9c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieC54c2QiLz4KLQkJCTxhcmcgbGluZT0iLWwgamF2YSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItcCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1kIGppYngiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtidWlsZC5kaXJ9L3NlcnZpY2UiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9qaWJ4L1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YSIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS9qaWJ4LyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPiAgICAKLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2J1aWxkLmRpcn0vc2VydmljZS9yZXNvdXJjZXMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vJHtBWElTMl9IT01FfSIvPgotICAgICAgICA8L2FudD4KLQkJPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYi9TdG9ja1F1b3RlU2VydmljZS5hYXIiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2Jhc2VkaXJ9Ly4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMiCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5jbGllbnQiIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMMkphdmEiIGZvcms9InRydWUiIGNsYXNzcGF0aHJlZj0iYXhpczIuY2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXVyaSAke3dzZGwudXJpfSIvPgotCQkJPGFyZyBsaW5lPSItcyIvPgotCQkJPGFyZyBsaW5lPSItdXciLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW5zMnAgaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2Q9c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieC54c2QiLz4KLQkJCTxhcmcgbGluZT0iLWwgamF2YSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItcCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4Ii8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1kIGppYngiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtidWlsZC5kaXJ9L2NsaWVudCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmFzZWRpcn0vc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzL0ppQlhDbGllbnQuamF2YSIKLSAgICAgICAgICAgICAgdG9EaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9jbGllbnRzLyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxhbnQgZGlyPSIke2J1aWxkLmRpcn0vY2xpZW50Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vJHtBWElTMl9IT01FfSIvPgotICAgICAgICA8L2FudD4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuYWxsIiBkZXBlbmRzPSJnZW5lcmF0ZS5zZXJ2aWNlLCBnZW5lcmF0ZS5jbGllbnQiLz4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0iZ2VuZXJhdGUuY2xpZW50Ij4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJzYW1wbGVzLnF1aWNrc3RhcnQuY2xpZW50cy5KaUJYQ2xpZW50Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlM2QzODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6YXhpczI9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgeG1sbnM6bnM9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyI+PHdzZGw6dHlwZXM+PHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIj4KLTx4czplbGVtZW50IG5hbWU9ImdldFByaWNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiIC8+Ci08L3hzOnNlcXVlbmNlPgotPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLTx4czplbGVtZW50IG5hbWU9InVwZGF0ZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci08eHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPC94czpzY2hlbWE+PC93c2RsOnR5cGVzPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZSIgLz48L3dzZGw6bWVzc2FnZT48d3NkbDptZXNzYWdlIG5hbWU9ImdldFByaWNlUmVzcG9uc2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZVJlc3BvbnNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0idXBkYXRlTWVzc2FnZSI+PHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnM6dXBkYXRlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOnBvcnRUeXBlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6Z2V0UHJpY2VNZXNzYWdlIiAvPjx3c2RsOm91dHB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZVJlc3BvbnNlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjx3c2RsOmlucHV0IG1lc3NhZ2U9ImF4aXMyOnVwZGF0ZU1lc3NhZ2UiIC8+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6cG9ydFR5cGU+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0UHJpY2UiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnVwZGF0ZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOmJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTJCaW5kaW5nIiB0eXBlPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlIj48c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjx3c2RsOm91dHB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6YmluZGluZz48d3NkbDpzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj48d3NkbDpwb3J0IG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExcG9ydCIgYmluZGluZz0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFCaW5kaW5nIj48c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PC93c2RsOnNlcnZpY2U+PC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0ZmNlMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieC5TdG9ja1F1b3RlU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT3V0Ii8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieC5TdG9ja1F1b3RlU2VydmljZU1lc3NhZ2VSZWNlaXZlckluT25seSIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UuamlieC5TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uCi0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46dXBkYXRlPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjpnZXRQcmljZTwvYWN0aW9uTWFwcGluZz4KLSAgICAgICAgPG91dHB1dEFjdGlvbk1hcHBpbmc+aHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy9TdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlL2dldFByaWNlUmVzcG9uc2U8L291dHB1dEFjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9KaUJYQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnRqaWJ4L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9KaUJYQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGE0NzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvSmlCWENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHM7Ci0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4LlN0b2NrUXVvdGVTZXJ2aWNlU3R1YjsKLQotcHVibGljIGNsYXNzIEppQlhDbGllbnR7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZyBhcmdzW10pewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1YiA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0b2NrUXVvdGVTZXJ2aWNlU3R1YgotICAgICAgICAgICAgICAgICgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1N0b2NrUXVvdGVTZXJ2aWNlIik7Ci0KLSAgICAgICAgICAgIGdldFByaWNlKHN0dWIpOwotICAgICAgICAgICAgdXBkYXRlKHN0dWIpOwotICAgICAgICAgICAgZ2V0UHJpY2Uoc3R1Yik7Ci0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcblxuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGZpcmUgYW5kIGZvcmdldCAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGUoU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIpewotICAgICAgICB0cnl7Ci0gICAgICAgICAgICBzdHViLnVwZGF0ZSgiQ0RFIiwgbmV3IERvdWJsZSg0Mi4zNSkpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJwcmljZSB1cGRhdGVkIik7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB0d28gd2F5IGNhbGwvcmVjZWl2ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQcmljZShTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1Yil7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzdHViLmdldFByaWNlKCJDREUiKSk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydGppYngvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL2ppYngvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvamlieC9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Y2MxYmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0amlieC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UvamlieC9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS5qaWJ4OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uIGltcGxlbWVudHMgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbkludGVyZmFjZSB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoU3RyaW5nIHN5bWJvbCwgRG91YmxlIHByaWNlKSB7Ci0gICAgICAgIG1hcC5wdXQoc3ltYm9sLCBwcmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZSBnZXRQcmljZShTdHJpbmcgc3ltYm9sKSB7Ci0gICAgICAgIERvdWJsZSByZXQgPSAoRG91YmxlKSBtYXAuZ2V0KHN5bWJvbCk7Ci0gICAgICAgIGlmIChyZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0ID0gbmV3IERvdWJsZSg0Mi4wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTUxNzI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1BeGlzMiBRdWljayBTdGFydCBHdWlkZS0gU2FtcGxlIDQgKFhNTCBCZWFucykNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLVRoaXMgc2FtcGxlIGNvbnRhaW5zIHNvdXJjZSBjb2RlIGZvciB0aGUgeGRvY3MvMV8xL3F1aWNrc3RhcnRndWlkZS5odG1sIGRvY3VtZW50IGZvdW5kIGluIA0KLXRoZSBleHRyYWN0ZWQgQXhpczIgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvbiB0aGUgDQotc291cmNlIGNvZGUga2luZGx5IHNlZSB0aGlzICdBeGlzMiBRdWljayBTdGFydCBHdWlkZScgZG9jdW1lbnQuDQotDQotSW50cm9kdWN0aW9uDQotPT09PT09PT09PT09DQotSW4gdGhpcyBzYW1wbGUsIHdlIGFyZSBkZXBsb3lpbmcgYW4gWE1MQkVBTlMgZ2VuZXJhdGVkIHNlcnZpY2UuIFRoZSBzZXJ2aWNlDQotaXMgdGVzdGVkIHVzaW5nIGdlbmVyYXRlZCBjbGllbnQgc3R1YnMuDQotDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIGZyb20gQXhpczJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucw0KLWRpcmVjdG9yeS4gVGhlbiBkZXBsb3kgdGhlIA0KLUFYSVMyX0hPTUUvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvYnVpbGQvc2VydmljZS9idWlsZC9saWIvU3RvY2tRdW90ZVNlcnZpY2UuYWFyDQotDQotDQotUnVubmluZyB0aGUgQ2xpZW50DQotPT09PT09PT09PT09PT09PT09DQotDQotdHlwZSBhbnQgcnVuLmNsaWVudCBpbiB0aGUgQVhJUzJfSE9NRS9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucyBkaXJlY3RvcnkNCi0NCi1IZWxwDQotPT09PQ0KLVBsZWFzZSBjb250YWN0IGF4aXMtdXNlciBsaXN0IChheGlzLXVzZXJAd3MuYXBhY2hlLm9yZykgaWYgeW91IGhhdmUNCi1hbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjY0NmNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InF1aWNrc3RhcnR4bWxiZWFucyIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZ2VuZXJhdGUuc2VydmljZSI+Ci0KLSAgICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJBWElTMl9IT01FIiB2YWx1ZT0iLi4vLi4iLz4KLQotCTxwcm9wZXJ0eSBuYW1lPSJ3c2RsLnVyaSIgdmFsdWU9Ii4vcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwiLz4KLQk8cHJvcGVydHkgbmFtZT0ic2VydmljZS50YXJnZXQiIHZhbHVlPSJidWlsZC9zZXJ2aWNlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNsaWVudC50YXJnZXQiIHZhbHVlPSJidWlsZC9jbGllbnQiLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJidWlsZCIvPgotCi0gICAgPHBhdGggaWQ9ImF4aXMyLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtBWElTMl9IT01FfS9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0iY2xpZW50LmNsYXNzLnBhdGgiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7QVhJUzJfSE9NRX0vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9L2NsaWVudC9idWlsZC9saWIiID4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9wYXRoPgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlIi8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQiLz4KLSAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3NlcnZpY2UudGFyZ2V0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3NlcnZpY2UudGFyZ2V0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3NlcnZpY2UudGFyZ2V0fS9jbGFzc2VzIi8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1zcyIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItc2QiLz4KLQkJCTxhcmcgbGluZT0iLXNzaSIvPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItYXAiLz4KLQkJCTxhcmcgbGluZT0iLW5zMnAgaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy94c2Q9c2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkIi8+Ci0JCQk8YXJnIGxpbmU9Ii1sIGphdmEiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLXAgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLWQgeG1sYmVhbnMiLz4KLSAgICAgICAgICAgIDxhcmcgbGluZT0iLW8gJHtidWlsZC5kaXJ9L3NlcnZpY2UiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICAKLQkJPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L3NlcnZpY2UveG1sYmVhbnMvU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhIgotICAgICAgICAgICAgICB0b0Rpcj0iJHtidWlsZC5kaXJ9L3NlcnZpY2Uvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL3htbGJlYW5zLyIKLSAgICAgICAgICAgICAgb3ZlcndyaXRlPSJ5ZXMiPiAgICAKLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2J1aWxkLmRpcn0vc2VydmljZS9yZXNvdXJjZXMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7YnVpbGQuZGlyfS9zZXJ2aWNlIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vJHtBWElTMl9IT01FfSIvPgotICAgICAgICA8L2FudD4KLQkJPGNvcHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC9zZXJ2aWNlL2J1aWxkL2xpYi9TdG9ja1F1b3RlU2VydmljZS5hYXIiCi0gICAgICAgICAgICAgIHRvRGlyPSIke2Jhc2VkaXJ9Ly4uLy4uL3JlcG9zaXRvcnkvc2VydmljZXMiCi0gICAgICAgICAgICAgIG92ZXJ3cml0ZT0ieWVzIj4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5jbGllbnQiIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGRpcj0iJHtjbGllbnQudGFyZ2V0fSIvPgotCQk8bWtkaXIgZGlyPSIke2NsaWVudC50YXJnZXR9Ii8+Ci0JIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSIgZm9yaz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJheGlzMi5jbGFzc3BhdGgiPgotICAgICAgICAgICAgPGFyZyBsaW5lPSItdXJpICR7d3NkbC51cml9Ii8+Ci0JCQk8YXJnIGxpbmU9Ii1zIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1uczJwIGh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkPXNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLnhzZCIvPgotCQkJPGFyZyBsaW5lPSItbCBqYXZhIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1wIHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1kIHhtbGJlYW5zIi8+Ci0gICAgICAgICAgICA8YXJnIGxpbmU9Ii1vICR7YnVpbGQuZGlyfS9jbGllbnQiLz4KLSAgICAgICAgPC9qYXZhPgotICAgICAgICA8Y29weSBmaWxlPSIke2Jhc2VkaXJ9L3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9YTUxCRUFOU0NsaWVudC5qYXZhIgotICAgICAgICAgICAgICB0b0Rpcj0iJHtidWlsZC5kaXJ9L2NsaWVudC9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyI+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGFudCBkaXI9IiR7YnVpbGQuZGlyfS9jbGllbnQiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8ke0FYSVMyX0hPTUV9Ii8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS5hbGwiIGRlcGVuZHM9ImdlbmVyYXRlLnNlcnZpY2UsIGdlbmVyYXRlLmNsaWVudCIvPgotCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50IiBkZXBlbmRzPSJnZW5lcmF0ZS5jbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InNhbXBsZXMucXVpY2tzdGFydC5jbGllbnRzLlhNTEJFQU5TQ2xpZW50Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIiAvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvcmVzb3VyY2VzL01FVEEtSU5GL1N0b2NrUXVvdGVTZXJ2aWNlLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzZDM4My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9yZXNvdXJjZXMvTUVUQS1JTkYvU3RvY2tRdW90ZVNlcnZpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6YXhpczI9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiB4bWxuczpzb2FwMTI9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcDEyLyIgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgeG1sbnM6bnM9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyI+PHdzZGw6dHlwZXM+PHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMveHNkIj4KLTx4czplbGVtZW50IG5hbWU9ImdldFByaWNlIj4KLTx4czpjb21wbGV4VHlwZT4KLTx4czpzZXF1ZW5jZT4KLTx4czplbGVtZW50IG5hbWU9InN5bWJvbCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UHJpY2VSZXNwb25zZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpkb3VibGUiIC8+Ci08L3hzOnNlcXVlbmNlPgotPC94czpjb21wbGV4VHlwZT4KLTwveHM6ZWxlbWVudD4KLTx4czplbGVtZW50IG5hbWU9InVwZGF0ZSI+Ci08eHM6Y29tcGxleFR5cGU+Ci08eHM6c2VxdWVuY2U+Ci08eHM6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci08eHM6ZWxlbWVudCBuYW1lPSJwcmljZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzOmRvdWJsZSIgLz4KLTwveHM6c2VxdWVuY2U+Ci08L3hzOmNvbXBsZXhUeXBlPgotPC94czplbGVtZW50PgotPC94czpzY2hlbWE+PC93c2RsOnR5cGVzPjx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0UHJpY2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZSIgLz48L3dzZGw6bWVzc2FnZT48d3NkbDptZXNzYWdlIG5hbWU9ImdldFByaWNlUmVzcG9uc2VNZXNzYWdlIj48d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczpnZXRQcmljZVJlc3BvbnNlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOm1lc3NhZ2UgbmFtZT0idXBkYXRlTWVzc2FnZSI+PHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnM6dXBkYXRlIiAvPjwvd3NkbDptZXNzYWdlPjx3c2RsOnBvcnRUeXBlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRQcmljZSI+PHdzZGw6aW5wdXQgbWVzc2FnZT0iYXhpczI6Z2V0UHJpY2VNZXNzYWdlIiAvPjx3c2RsOm91dHB1dCBtZXNzYWdlPSJheGlzMjpnZXRQcmljZVJlc3BvbnNlTWVzc2FnZSIgLz48L3dzZGw6b3BlcmF0aW9uPjx3c2RsOm9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiPjx3c2RsOmlucHV0IG1lc3NhZ2U9ImF4aXMyOnVwZGF0ZU1lc3NhZ2UiIC8+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6cG9ydFR5cGU+PHdzZGw6YmluZGluZyBuYW1lPSJTdG9ja1F1b3RlU2VydmljZVNPQVAxMUJpbmRpbmciIHR5cGU9ImF4aXMyOlN0b2NrUXVvdGVTZXJ2aWNlUG9ydFR5cGUiPjxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Z2V0UHJpY2UiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDppbnB1dD48c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PHdzZGw6b3V0cHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOnVwZGF0ZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDppbnB1dD48L3dzZGw6b3BlcmF0aW9uPjwvd3NkbDpiaW5kaW5nPjx3c2RsOmJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTJCaW5kaW5nIiB0eXBlPSJheGlzMjpTdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlIj48c29hcDEyOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIgLz48d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiPjxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpnZXRQcmljZSIgc3R5bGU9ImRvY3VtZW50IiAvPjx3c2RsOmlucHV0Pjxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy8iIC8+PC93c2RsOmlucHV0Pjx3c2RsOm91dHB1dD48c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9xdWlja3N0YXJ0LnNhbXBsZXMvIiAvPjwvd3NkbDpvdXRwdXQ+PC93c2RsOm9wZXJhdGlvbj48d3NkbDpvcGVyYXRpb24gbmFtZT0idXBkYXRlIj48c29hcDEyOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46dXBkYXRlIiBzdHlsZT0iZG9jdW1lbnQiIC8+PHdzZGw6aW5wdXQ+PHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vcXVpY2tzdGFydC5zYW1wbGVzLyIgLz48L3dzZGw6aW5wdXQ+PC93c2RsOm9wZXJhdGlvbj48L3dzZGw6YmluZGluZz48d3NkbDpzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIj48d3NkbDpwb3J0IG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlU09BUDExcG9ydCIgYmluZGluZz0iYXhpczI6U3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFCaW5kaW5nIj48c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU3RvY2tRdW90ZVNlcnZpY2UiIC8+PC93c2RsOnBvcnQ+PC93c2RsOnNlcnZpY2U+PC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODZjODBlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzZXJ2aWNlIG5hbWU9IlN0b2NrUXVvdGVTZXJ2aWNlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMuU3RvY2tRdW90ZVNlcnZpY2VNZXNzYWdlUmVjZWl2ZXJJbk91dCIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9InNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLlN0b2NrUXVvdGVTZXJ2aWNlTWVzc2FnZVJlY2VpdmVySW5Pbmx5Ii8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj5zYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy5TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uCi0gICAgPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJ1cGRhdGUiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46dXBkYXRlPC9hY3Rpb25NYXBwaW5nPgotICAgIDwvb3BlcmF0aW9uPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZ2V0UHJpY2UiIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjpnZXRQcmljZTwvYWN0aW9uTWFwcGluZz4KLSAgICAgICAgPG91dHB1dEFjdGlvbk1hcHBpbmc+aHR0cDovL3F1aWNrc3RhcnQuc2FtcGxlcy9TdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlL2dldFByaWNlUmVzcG9uc2U8L291dHB1dEFjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3F1aWNrc3RhcnR4bWxiZWFucy9zcmMvc2FtcGxlcy9xdWlja3N0YXJ0L2NsaWVudHMvWE1MQkVBTlNDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9YTUxCRUFOU0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIyZWI4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvY2xpZW50cy9YTUxCRUFOU0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlcy5xdWlja3N0YXJ0LmNsaWVudHM7Ci0KLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy5TdG9ja1F1b3RlU2VydmljZVN0dWI7Ci1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkLkdldFByaWNlRG9jdW1lbnQ7Ci1pbXBvcnQgc2FtcGxlcy5xdWlja3N0YXJ0LnNlcnZpY2UueG1sYmVhbnMueHNkLkdldFByaWNlUmVzcG9uc2VEb2N1bWVudDsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuVXBkYXRlRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYTUxCRUFOU0NsaWVudHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmcgYXJnc1tdKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgU3RvY2tRdW90ZVNlcnZpY2VTdHViIHN0dWIgPQotICAgICAgICAgICAgICAgIG5ldyBTdG9ja1F1b3RlU2VydmljZVN0dWIKLSAgICAgICAgICAgICAgICAoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TdG9ja1F1b3RlU2VydmljZSIpOwotCi0gICAgICAgICAgICBnZXRQcmljZShzdHViKTsKLSAgICAgICAgICAgIHVwZGF0ZShzdHViKTsKLSAgICAgICAgICAgIGdldFByaWNlKHN0dWIpOwotCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmaXJlIGFuZCBmb3JnZXQgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlKFN0b2NrUXVvdGVTZXJ2aWNlU3R1YiBzdHViKXsKLSAgICAgICAgdHJ5ewotICAgICAgICAgICAgVXBkYXRlRG9jdW1lbnQgcmVxRG9jID0gVXBkYXRlRG9jdW1lbnQuRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgVXBkYXRlRG9jdW1lbnQuVXBkYXRlIHJlcSA9IHJlcURvYy5hZGROZXdVcGRhdGUoKTsKLSAgICAgICAgICAgIHJlcS5zZXRTeW1ib2wgKCJCQ0QiKTsKLSAgICAgICAgICAgIHJlcS5zZXRQcmljZSAoNDIuMzIpOwotCi0gICAgICAgICAgICBzdHViLnVwZGF0ZShyZXFEb2MpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJwcmljZSB1cGRhdGVkIik7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG5cblxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB0d28gd2F5IGNhbGwvcmVjZWl2ZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRQcmljZShTdG9ja1F1b3RlU2VydmljZVN0dWIgc3R1Yil7Ci0gICAgICAgIHRyeXsKLSAgICAgICAgICAgIEdldFByaWNlRG9jdW1lbnQgcmVxRG9jID0gR2V0UHJpY2VEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBHZXRQcmljZURvY3VtZW50LkdldFByaWNlIHJlcSA9IHJlcURvYy5hZGROZXdHZXRQcmljZSgpOwotICAgICAgICAgICAgcmVxLnNldFN5bWJvbCgiQkNEIik7Ci0KLSAgICAgICAgICAgIEdldFByaWNlUmVzcG9uc2VEb2N1bWVudCByZXMgPQotICAgICAgICAgICAgICAgIHN0dWIuZ2V0UHJpY2UocmVxRG9jKTsKLQotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHJlcy5nZXRHZXRQcmljZVJlc3BvbnNlKCkuZ2V0UmV0dXJuKCkpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuXG5cbiIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL3htbGJlYW5zL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcXVpY2tzdGFydHhtbGJlYW5zL3NyYy9zYW1wbGVzL3F1aWNrc3RhcnQvc2VydmljZS94bWxiZWFucy9TdG9ja1F1b3RlU2VydmljZVNrZWxldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZTAyZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9xdWlja3N0YXJ0eG1sYmVhbnMvc3JjL3NhbXBsZXMvcXVpY2tzdGFydC9zZXJ2aWNlL3htbGJlYW5zL1N0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbi5qYXZhCi0gKgotICogVGhpcyBmaWxlIHdhcyBhdXRvLWdlbmVyYXRlZCBmcm9tIFdTREwKLSAqIGJ5IHRoZSBBcGFjaGUgQXhpczIgdmVyc2lvbjogMS4xLVJDMiBOb3YgMDIsIDIwMDYgKDAyOjM3OjUwIExLVCkKLSAqLwotcGFja2FnZSBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFuczsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuR2V0UHJpY2VEb2N1bWVudDsKLWltcG9ydCBzYW1wbGVzLnF1aWNrc3RhcnQuc2VydmljZS54bWxiZWFucy54c2QuR2V0UHJpY2VSZXNwb25zZURvY3VtZW50OwotaW1wb3J0IHNhbXBsZXMucXVpY2tzdGFydC5zZXJ2aWNlLnhtbGJlYW5zLnhzZC5VcGRhdGVEb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotLyoqCi0gKiBTdG9ja1F1b3RlU2VydmljZVNrZWxldG9uIGphdmEgc2tlbGV0b24gZm9yIHRoZSBheGlzU2VydmljZQotICovCi1wdWJsaWMgY2xhc3MgU3RvY2tRdW90ZVNlcnZpY2VTa2VsZXRvbiBpbXBsZW1lbnRzIFN0b2NrUXVvdGVTZXJ2aWNlU2tlbGV0b25JbnRlcmZhY2UgewotCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoVXBkYXRlRG9jdW1lbnQgcGFyYW0wKSB7Ci0gICAgICAgIG1hcC5wdXQocGFyYW0wLmdldFVwZGF0ZSgpLmdldFN5bWJvbCgpLCBuZXcgRG91YmxlKHBhcmFtMC5nZXRVcGRhdGUoKS5nZXRQcmljZSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEdldFByaWNlUmVzcG9uc2VEb2N1bWVudCBnZXRQcmljZShHZXRQcmljZURvY3VtZW50IHBhcmFtMSkgewotICAgICAgICBEb3VibGUgcHJpY2UgPSAoRG91YmxlKSBtYXAuZ2V0KHBhcmFtMS5nZXRHZXRQcmljZSgpLmdldFN5bWJvbCgpKTsKLSAgICAgICAgZG91YmxlIHJldCA9IDQyOwotICAgICAgICBpZihwcmljZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldCA9IHByaWNlLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCk7Ci0gICAgICAgIEdldFByaWNlUmVzcG9uc2VEb2N1bWVudCByZXNEb2MgPQotICAgICAgICAgICAgICAgIEdldFByaWNlUmVzcG9uc2VEb2N1bWVudC5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIEdldFByaWNlUmVzcG9uc2VEb2N1bWVudC5HZXRQcmljZVJlc3BvbnNlIHJlcyA9Ci0gICAgICAgICAgICAgICAgcmVzRG9jLmFkZE5ld0dldFByaWNlUmVzcG9uc2UoKTsKLSAgICAgICAgcmVzLnNldFJldHVybihyZXQpOwotICAgICAgICByZXR1cm4gcmVzRG9jOwotICAgIH0KLX0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3Jlc291cmNlcy9vbS9iaW5hcnkvYmluYXJ5LnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcmVzb3VyY2VzL29tL2JpbmFyeS9iaW5hcnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjc0ZmIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcmVzb3VyY2VzL29tL2JpbmFyeS9iaW5hcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08UHJvamVjdCB4bWxuczphcGFjaGU9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyIj48TmFtZT5BeGlzMjwvTmFtZT48Q3VycmVudFZlcnNpb24+MC45PC9DdXJyZW50VmVyc2lvbj48TW9kdWxlcz48IS0tIExpc3Qgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSBmb3VuZCB1bmRlciBBeGlzMiBwcm9qZWN0IC0tPjxNb2R1bGUgbmFtZT0ieG1sIj48RGVzY3JpcHRpb24+WE1MIE9iamVjdCBNb2RlbDwvRGVzY3JpcHRpb24+PC9Nb2R1bGU+PE1vZHVsZSBuYW1lPSJ3c2RsIj48RGVzY3JpcHRpb24+RnVsbCBXU0RMIHNvbHV0aW9uIGZvciBBeGlzMjwvRGVzY3JpcHRpb24+PC9Nb2R1bGU+PE1vZHVsZSBuYW1lPSJjb3JlIj48RGVzY3JpcHRpb24+Q29yZSBwYXJ0cyBvZiBBeGlzMjwvRGVzY3JpcHRpb24+PC9Nb2R1bGU+PC9Nb2R1bGVzPjwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxNTA2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1UbyBydW4gdGhpcyBzYW1wbGUgZm9sbG93IHRoZXNlcyBzdGVwcwotMS4gcnVuIGdlbmVyYXRlX3NlcnZpY2UgYW50IHRhc2suIChhbnQgZ2VuZXJhdGVfc2VydmljZSkKLSAgIHRoaXMgZ2VuZXJhdGVzIHRoZSBzZXJ2aWNlIGFuZCBwdXQgaXQgdG8gdGhlIHJtaXNlcnZpY2UgZm9sZGVyIHVuZGVyIHJlcG9zaXRvcnkKLTIuIHN0YXJ0IHRoZSBheGlzMiBzZXJ2ZXIgCi0zLiBydW4gdGhlIGNsaWVudCAoYW50IHJ1bl9jbGllbnQpCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMzAyMmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0ic2FtcGxlX3NlcnZpY2UiIGRlZmF1bHQ9ImdlbmVyYXRlX3NlcnZpY2UiIGJhc2VkaXI9Ii4iPgotCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InNhbXBsZV9ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlc19kaXIiIHZhbHVlPSIke3NhbXBsZV9ob21lfS9jbGFzc2VzIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmNfZGlyIiB2YWx1ZT0iJHtzYW1wbGVfaG9tZX0vc3JjIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJheGlzMi5ob21lIiB2YWx1ZT0iLi4vLi4vIiAvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGliX2RpciIgdmFsdWU9IiR7YXhpczIuaG9tZX0vbGliIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXN0X2RpciIgdmFsdWU9IiR7YXhpczIuaG9tZX0vZGlzdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGVwbG95X2RpciIgdmFsdWU9IiR7c2FtcGxlX2hvbWV9L2RlcGxveSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2VydmljZV9maWxlIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5L3JtaXNlcnZpY2VzL3JtaXNlcnZpY2UuanNhIi8+Ci0KLSAgICAgICAgPHBhdGggaWQ9ImNsaWVudC5jbGFzcy5wYXRoIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGlzdF9kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotCi0gICAgICAgIDwvcGF0aD4KLQotCi0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlX3NlcnZpY2UiIGRlcGVuZHM9ImNsZWFuIiBkZXNjcmlwdGlvbj0iR2VuZXJhdGluZyB0aGUgc2VydmljZSBhYXIiPgotCi0gICAgICAgIDxlY2hvIG1lc3NhZ2U9ImNyZWF0aW5nIHRoZSBzZXJ2aWNlIGFhciBmcm9tICR7c2FtcGxlX2hvbWV9Ii8+Ci0KLSAgICAgICAgPCEtLSBjcmVhdGVzIGRlcGxveSBhbmQgY2xhc3MgZGlyZWN0b3JpcyAtLT4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXBsb3lfZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2RlcGxveV9kaXJ9L01FVEEtSU5GIi8+Ci0KLSAgICAgICAgPCEtLSBjb21waWxpbmcgdGhlIGNsYXNzZXMgLS0+Ci0gICAgICAgIDxqYXZhYyAgZGVzdGRpcj0iJHtkZXBsb3lfZGlyfSIgc3JjZGlyPSIke3NyY19kaXJ9IiBkZWJ1Zz0ib24iPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovY2xpZW50LyoiLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYl9kaXJ9IiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmFjPgotCi0gICAgICAgIDwhLS0gY29weSBzZXJ2aWNlcyBmaWxlIC0tPgotICAgICAgICA8Y29weSBmaWxlPSJjb25mL2NvbmZpZy54bWwiIHRvZGlyPSIke2RlcGxveV9kaXJ9L01FVEEtSU5GIi8+Ci0KLSAgICAgICAgPCEtLSBjcmVhdGUgQmFzaWNTZXJ2aWNlVGVzdC5hYXIgZmlsZSAtLT4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtzZXJ2aWNlX2ZpbGV9Ij4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtkZXBsb3lfZGlyfSIgcHJlZml4PSIiLz4KLSAgICAgICAgPC9qYXI+Ci0KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuX2NsaWVudCIgZGVwZW5kcz0iY2xlYW4iIGRlc2NyaXB0aW9uPSJSdW5uaW5nIHRoZSBjbGllbnRzIj4KLQotICAgICAgICA8ZWNobyBtZXNzYWdlPSJSdW5uaW5nIHRoZSBSTUkgY2xpZW50cyIvPgotCi0gICAgICAgIDwhLS0gY3JlYXRlcyBkZXBsb3kgYW5kIGNsYXNzIGRpcmVjdG9yaXMgLS0+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc19kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGlzdF9kaXJ9Ii8+Ci0KLSAgICAgICAgPCEtLSBjb21waWxpbmcgdGhlIGNsYXNzZXMgLS0+Ci0gICAgICAgIDxqYXZhYyAgZGVzdGRpcj0iJHtjbGFzc2VzX2Rpcn0iIHNyY2Rpcj0iJHtzcmNfZGlyfSIgZGVidWc9Im9uIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYl9kaXJ9IiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmFjPgotCi0gICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7ZGlzdF9kaXJ9L3JtaV9jbGllbnQuamFyIj4KLSAgICAgICAgICAgIDx6aXBmaWxlc2V0IGRpcj0iJHtjbGFzc2VzX2Rpcn0iIHByZWZpeD0iIi8+Ci0gICAgICAgIDwvamFyPgotCi0gICAgICAgIDwhLS0gcnVubmluZyB0aGUgY2xpZW50cyAtLT4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJzYW1wbGUucm1pLmNsaWVudC5UZXN0U2VydmljZTEiPgotICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJzYW1wbGUucm1pLmNsaWVudC5UZXN0U2VydmljZTIiPgotICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJzYW1wbGUucm1pLmNsaWVudC5UZXN0U2VydmljZTMiPgotICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJzYW1wbGUucm1pLmNsaWVudC5UZXN0U2VydmljZTQiPgotICAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsaWVudC5jbGFzcy5wYXRoIi8+Ci0gICAgICAgIDwvamF2YT4KLQotICAgIDwvdGFyZ2V0PgotCi0KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJkZWxldGVzIHRoZSBvbGQgY29udGVudHN0Ij4KLSAgICAgICAgPCEtLTxkZWxldGUgZGlyPSIke2NsYXNzZXNfZGlyfSIvPi0tPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtkZXBsb3lfZGlyfSIvPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtjbGFzc2VzX2Rpcn0iLz4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7ZGlzdF9kaXJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9jb25mL2NvbmZpZy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9jb25mL2NvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjZmNGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvY29uZi9jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y29uZmlnIHhtbG5zPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9ybWkiPgotICAgIDxleHRlbnNpb25DbGFzc2VzPgotICAgICAgICA8ZXh0ZW5zaW9uQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLkNoaWxkQ2xhc3M8L2V4dGVuc2lvbkNsYXNzPgotICAgIDwvZXh0ZW5zaW9uQ2xhc3Nlcz4KLSAgICA8cGFja2FnZVRvTmFtZXNwYWNlTWFwaW5ncz4KLSAgICAgICAgPHBhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICAgICAgICAgIDxuYW1lc3BhY2U+aHR0cDovL3NhbXBsZS9zZXJ2aWNlPC9uYW1lc3BhY2U+Ci0gICAgICAgICAgICA8cGFja2FnZU5hbWU+c2FtcGxlLnJtaS5zZXJ2ZXI8L3BhY2thZ2VOYW1lPgotICAgICAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICAgICAgPHBhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICAgICAgICAgIDxuYW1lc3BhY2U+aHR0cDovL3NhbXBsZS9zZXJ2aWNlL3R5cGVzPC9uYW1lc3BhY2U+Ci0gICAgICAgICAgICA8cGFja2FnZU5hbWU+c2FtcGxlLnJtaS5zZXJ2ZXIuZHRvPC9wYWNrYWdlTmFtZT4KLSAgICAgICAgPC9wYWNrYWdlVG9OYW1lc3BhY2VNYXA+Ci0gICAgICAgIDxwYWNrYWdlVG9OYW1lc3BhY2VNYXA+Ci0gICAgICAgICAgICA8bmFtZXNwYWNlPmh0dHA6Ly9zYW1wbGUvc2VydmljZS9leGNlcHRpb248L25hbWVzcGFjZT4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5zYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb248L3BhY2thZ2VOYW1lPgotICAgICAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcD4KLSAgICA8L3BhY2thZ2VUb05hbWVzcGFjZU1hcGluZ3M+Ci0gICAgPHNlcnZpY2VzPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTE8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTI8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTM8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgICAgICA8c2VydmljZT4KLSAgICAgICAgICAgIDxzZXJ2aWNlQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTQ8L3NlcnZpY2VDbGFzcz4KLSAgICAgICAgPC9zZXJ2aWNlPgotICAgIDwvc2VydmljZXM+Ci0gICAgPHNpbXBsZURhdGFIYW5kbGVyQ2xhc3M+c2FtcGxlLnJtaS5zZXJ2ZXIuZGF0YWJpbmQuQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXI8L3NpbXBsZURhdGFIYW5kbGVyQ2xhc3M+Ci08L2NvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODUzNzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50LlJNSUNsaWVudFByb3h5OwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLlNlcnZpY2UxSW50ZXJmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlMSB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLSAgICBwdWJsaWMgVGVzdFNlcnZpY2UxKCkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlciIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5kdG8iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL3R5cGVzIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS9leGNlcHRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcHJveHkubWV0aG9kMSgiSGVsbG93IiwiIFdvcmxkIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCA9PT4gIiArIHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDIoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0gICAgICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIobmV3IEludGVnZXIoNSksbmV3IEludGVnZXIoMTUpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0ID09PiAiICsgcmVzdWx0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMygpewotICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2UxSW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2UxSW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlMUludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2UxIik7Ci0gICAgICAgICAgICBEYXRlIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDMobmV3IERhdGUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCA9PT4gIiArIHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTEgdGVzdFNlcnZpY2UxID0gbmV3IFRlc3RTZXJ2aWNlMSgpOwotICAgICAgICB0ZXN0U2VydmljZTEudGVzdE1ldGhvZDEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UxLnRlc3RNZXRob2QyKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlMS50ZXN0TWV0aG9kMygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllYTI5ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5jbGllbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuY2xpZW50LlJNSUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jbGllbnQuUk1JQ2xpZW50UHJveHk7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTI7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTFJbnRlcmZhY2U7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuU2VydmljZTJJbnRlcmZhY2U7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLkNoaWxkQ2xhc3M7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlBhcmVudENsYXNzOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5UZXN0Q2xhc3MxOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlMiB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLSAgICBwdWJsaWMgVGVzdFNlcnZpY2UyKCkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlciIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5kdG8iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL3R5cGVzIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS9leGNlcHRpb24iKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkRXh0ZW5zaW9uKFBhcmVudENsYXNzLmNsYXNzKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkRXh0ZW5zaW9uKENoaWxkQ2xhc3MuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTJJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTJJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UySW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTIiKTsKLSAgICAgICAgICAgIFBhcmVudENsYXNzIHBhcmVudENsYXNzID0gbmV3IFBhcmVudENsYXNzKCk7Ci0gICAgICAgICAgICBwYXJlbnRDbGFzcy5zZXRQYXJhbTEoInRlc3QgcGFyYW0xIik7Ci0gICAgICAgICAgICBwYXJlbnRDbGFzcy5zZXRQYXJhbTIoMTApOwotICAgICAgICAgICAgUGFyZW50Q2xhc3MgcmVzdWx0ID0gcHJveHkubWV0aG9kMShwYXJlbnRDbGFzcyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBwYXJhbSAxID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDIgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0yKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QxMigpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTJJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTJJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UySW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTIiKTsKLSAgICAgICAgICAgIENoaWxkQ2xhc3MgY2hpbGRDbGFzcyA9IG5ldyBDaGlsZENsYXNzKCk7Ci0gICAgICAgICAgICBjaGlsZENsYXNzLnNldFBhcmFtMSgidGVzdCBwYXJhbTEiKTsKLSAgICAgICAgICAgIGNoaWxkQ2xhc3Muc2V0UGFyYW0yKDEwKTsKLSAgICAgICAgICAgIGNoaWxkQ2xhc3Muc2V0UGFyYW0zKCJ0ZXN0IHBhcmFtMyIpOwotICAgICAgICAgICAgY2hpbGRDbGFzcy5zZXRQYXJhbTQobmV3IEludGVnZXIoMTIpKTsKLSAgICAgICAgICAgIENoaWxkQ2xhc3MgcmVzdWx0ID0gKENoaWxkQ2xhc3MpIHByb3h5Lm1ldGhvZDEoY2hpbGRDbGFzcyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBwYXJhbSAxID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDIgPT0+ICIgKyByZXN1bHQuZ2V0UGFyYW0yKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXN1bHQgcGFyYW0gMyA9PT4gIiArIHJlc3VsdC5nZXRQYXJhbTMoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBwYXJhbSA0ID09PiAiICsgcmVzdWx0LmdldFBhcmFtNCgpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlMkludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlMkludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTJJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMiIpOwotICAgICAgICAgICAgVGVzdENsYXNzMSB0ZXN0Q2xhc3MxID0gbmV3IFRlc3RDbGFzczEoKTsKLSAgICAgICAgICAgIHRlc3RDbGFzczEuc2V0UGFyYW0xKCJ0ZXN0IHBhcmFtMSIpOwotICAgICAgICAgICAgdGVzdENsYXNzMS5zZXRQYXJtYTIoInRlc3QgcGFyYW0yIik7Ci0gICAgICAgICAgICBUZXN0Q2xhc3MxIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDIodGVzdENsYXNzMSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBwYXJhbSAxID09PiAiICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzdWx0IHBhcmFtIDIgPT0+ICIgKyByZXN1bHQuZ2V0UGFybWEyKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgIC8vVG8gY2hhbmdlIGJvZHkgb2YgY2F0Y2ggc3RhdGVtZW50IHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgVGVzdFNlcnZpY2UyIHRlc3RTZXJ2aWNlMiA9IG5ldyBUZXN0U2VydmljZTIoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UyLnRlc3RNZXRob2QxMSgpOwotICAgICAgICB0ZXN0U2VydmljZTIudGVzdE1ldGhvZDEyKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlMi50ZXN0TWV0aG9kMigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMy5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvY2xpZW50L1Rlc3RTZXJ2aWNlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVhYjQzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLmNsaWVudDsKLQotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLlNlcnZpY2UzOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLlNlcnZpY2UySW50ZXJmYWNlOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLlNlcnZpY2UzSW50ZXJmYWNlOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmV4Y2VwdGlvbi5FeGNlcHRpb24xOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmV4Y2VwdGlvbi5FeGNlcHRpb24yOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmV4Y2VwdGlvbi5FeGNlcHRpb24zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLkNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnJtaS5jbGllbnQuUk1JQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlMyB7Ci0KLSAgICBwcml2YXRlIENvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLSAgICBwdWJsaWMgVGVzdFNlcnZpY2UzKCkgewotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciA9IG5ldyBDb25maWd1cmF0b3IoKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlciIsICJodHRwOi8vc2FtcGxlL3NlcnZpY2UiKTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IuYWRkUGFja2FnZVRvTmFtZXNwYWNlTWFwaW5nKCJzYW1wbGUucm1pLnNlcnZlci5kdG8iLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlL3R5cGVzIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS9leGNlcHRpb24iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMSgpIHsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VydmljZTNJbnRlcmZhY2UgcHJveHkgPQotICAgICAgICAgICAgICAgICAgICAoU2VydmljZTNJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2UzSW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvc2VydmljZXMvU2VydmljZTMiKTsKLSAgICAgICAgICAgIHByb3h5Lm1ldGhvZDEoKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24xIGV4Y2VwdGlvbjEpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IHRoZSBleGNlcHRpb24gMSIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMigpIHsKLQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlM0ludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlM0ludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTNJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMyIpOwotICAgICAgICAgICAgcHJveHkubWV0aG9kMigidGVzdCBzdHJpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24yIGV4Y2VwdGlvbjIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IHRoZSBleGNlcHRpb24gMiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24xIGV4Y2VwdGlvbjEpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbjEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QzKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlM0ludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlM0ludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTNJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlMyIpOwotICAgICAgICAgICAgcHJveHkubWV0aG9kMyg1KTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgYXhpc0ZhdWx0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24zIGV4Y2VwdGlvbjMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IHRoZSBleGNlcHRpb24gMyIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24yIGV4Y2VwdGlvbjIpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbjIucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbjEgZXhjZXB0aW9uMSkgewotICAgICAgICAgICAgZXhjZXB0aW9uMS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBUZXN0U2VydmljZTMgdGVzdFNlcnZpY2UzID0gbmV3IFRlc3RTZXJ2aWNlMygpOwotICAgICAgICB0ZXN0U2VydmljZTMudGVzdE1ldGhvZDEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2UzLnRlc3RNZXRob2QyKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlMy50ZXN0TWV0aG9kMygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL2NsaWVudC9UZXN0U2VydmljZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmNTU2Mi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9jbGllbnQvVGVzdFNlcnZpY2U0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5jbGllbnQ7Ci0KLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5TZXJ2aWNlNEludGVyZmFjZTsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uQ2hpbGRDbGFzczsKLWltcG9ydCBzYW1wbGUucm1pLnNlcnZlci5kdG8uUGFyZW50Q2xhc3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucm1pLmNsaWVudC5STUlDbGllbnRQcm94eTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2U0IHsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotICAgIHB1YmxpYyBUZXN0U2VydmljZTQoKSB7Ci0KLSAgICAgICAgdGhpcy5jb25maWd1cmF0b3IgPSBuZXcgQ29uZmlndXJhdG9yKCk7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIiLCAiaHR0cDovL3NhbXBsZS9zZXJ2aWNlIik7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdG9yLmFkZFBhY2thZ2VUb05hbWVzcGFjZU1hcGluZygic2FtcGxlLnJtaS5zZXJ2ZXIuZHRvIiwgImh0dHA6Ly9zYW1wbGUvc2VydmljZS90eXBlcyIpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRFeHRlbnNpb24oUGFyZW50Q2xhc3MuY2xhc3MpOwotICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvci5hZGRFeHRlbnNpb24oQ2hpbGRDbGFzcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDExKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlNEludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlNEludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTRJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlNCIpOwotICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IHByb3h5Lm1ldGhvZDEobnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMTIoKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2U0SW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2U0SW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlNEludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2U0Iik7Ci0gICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gcHJveHkubWV0aG9kMSgidGVzdCBzdHJpbmciKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IHRoZSBzdHJpbmcgIiArIHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZDEzKCkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXJ2aWNlNEludGVyZmFjZSBwcm94eSA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlNEludGVyZmFjZSkgUk1JQ2xpZW50UHJveHkuY3JlYXRlUHJveHkoU2VydmljZTRJbnRlcmZhY2UuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TZXJ2aWNlNCIpOwotCi0gICAgICAgICAgICBQYXJlbnRDbGFzcyBwYXJlbnRDbGFzcyA9IG5ldyBQYXJlbnRDbGFzcygpOwotICAgICAgICAgICAgcGFyZW50Q2xhc3Muc2V0UGFyYW0xKCJ0ZXN0IHN0cmluZyIpOwotICAgICAgICAgICAgcGFyZW50Q2xhc3Muc2V0UGFyYW0yKDMpOwotICAgICAgICAgICAgUGFyZW50Q2xhc3MgcmVzdWx0ID0gKFBhcmVudENsYXNzKSBwcm94eS5tZXRob2QxKHBhcmVudENsYXNzKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0gMSA9PT4iICsgcmVzdWx0LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW0gMiA9PT4iICsgcmVzdWx0LmdldFBhcmFtMigpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kMygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2U0SW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2U0SW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlNEludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2U0Iik7Ci0gICAgICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBwcm94eS5tZXRob2QzKCJQYXJhbTEiLCJQYXJhbTIiLCJQYXJhbTMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0IDEgPT0+IiArIHJlc3VsdFswXSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdCAyID09PiIgKyByZXN1bHRbMV0pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3QgMyA9PT4iICsgcmVzdWx0WzJdKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgIFNlcnZpY2U0SW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgKFNlcnZpY2U0SW50ZXJmYWNlKSBSTUlDbGllbnRQcm94eS5jcmVhdGVQcm94eShTZXJ2aWNlNEludGVyZmFjZS5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2U0Iik7Ci0KLSAgICAgICAgICAgIExpc3QgcGFyYW0xID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgcGFyYW0xLmFkZChuZXcgQ2hpbGRDbGFzcygpKTsKLSAgICAgICAgICAgIHBhcmFtMS5hZGQobmV3IEludGVnZXIoMikpOwotCi0gICAgICAgICAgICBMaXN0IHBhcmFtMiA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHBhcmFtMi5hZGQobmV3IFBhcmVudENsYXNzKCkpOwotICAgICAgICAgICAgcGFyYW0yLmFkZChuZXcgRmxvYXQoMi4zNGYpKTsKLQotICAgICAgICAgICAgTGlzdCByZXN1bHQgPSBwcm94eS5tZXRob2QyKHBhcmFtMSxwYXJhbTIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3QgMSA9PT4iICsgcmVzdWx0LmdldCgxKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdCAzID09PiIgKyByZXN1bHQuZ2V0KDMpKTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2Q0KCl7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZpY2U0SW50ZXJmYWNlIHByb3h5ID0KLSAgICAgICAgICAgICAgICAgICAgICAoU2VydmljZTRJbnRlcmZhY2UpIFJNSUNsaWVudFByb3h5LmNyZWF0ZVByb3h5KFNlcnZpY2U0SW50ZXJmYWNlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NlcnZpY2U0Iik7Ci0gICAgICAgICAgICBNYXAgcGFyYW0xID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIFBhcmVudENsYXNzIHBhcmVudCA9IG5ldyBQYXJlbnRDbGFzcygpOwotICAgICAgICAgICAgcGFyZW50LnNldFBhcmFtMSgicGFyYW0xIik7Ci0gICAgICAgICAgICBwYXJlbnQuc2V0UGFyYW0yKDUpOwotICAgICAgICAgICAgcGFyYW0xLnB1dCgia2V5MSIscGFyZW50KTsKLSAgICAgICAgICAgIHBhcmFtMS5wdXQoImtleTIiLCJ2YWx1ZTIiKTsKLSAgICAgICAgICAgIHBhcmFtMS5wdXQoImtleTMiLG5ldyBJbnRlZ2VyKDYpKTsKLQotICAgICAgICAgICAgTWFwIHJlc3VsdCA9IHByb3h5Lm1ldGhvZDQocGFyYW0xKTsKLSAgICAgICAgICAgIFBhcmVudENsYXNzIHJlc3VsdFBhcmVudCA9IChQYXJlbnRDbGFzcykgcmVzdWx0LmdldCgia2V5MSIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJlbnQgcGFyYW0xID09PiAiICsgcmVzdWx0UGFyZW50LmdldFBhcmFtMSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyZW50IHBhcmFtMiA9PT4gIiArIHJlc3VsdFBhcmVudC5nZXRQYXJhbTIoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIktleSAyID09PiAiICsgcmVzdWx0LmdldCgia2V5MiIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5IDMgPT0+ICIgKyByZXN1bHQuZ2V0KCJrZXkzIikpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCi0gICAgICAgIFRlc3RTZXJ2aWNlNCB0ZXN0U2VydmljZTQgPSBuZXcgVGVzdFNlcnZpY2U0KCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlNC50ZXN0TWV0aG9kMTEoKTsKLSAgICAgICAgdGVzdFNlcnZpY2U0LnRlc3RNZXRob2QxMigpOwotICAgICAgICB0ZXN0U2VydmljZTQudGVzdE1ldGhvZDEzKCk7Ci0gICAgICAgIHRlc3RTZXJ2aWNlNC50ZXN0TWV0aG9kMigpOwotICAgICAgICB0ZXN0U2VydmljZTQudGVzdE1ldGhvZDMoKTsKLSAgICAgICAgdGVzdFNlcnZpY2U0LnRlc3RNZXRob2Q0KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UxLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2OTc4My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMSBpbXBsZW1lbnRzIFNlcnZpY2UxSW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShTdHJpbmcgcGFyYW0xLCBTdHJpbmcgcGFyYW0yKXsKLSAgICAgICAgcmV0dXJuIHBhcmFtMSArIHBhcmFtMjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG1ldGhvZDIoaW50IHBhcmFtMSwgaW50IHBhcmFtMil7Ci0gICAgICAgIHJldHVybiBwYXJhbTEgKyBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGUgbWV0aG9kMyhEYXRlIHBhcmFtMSkgewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlMUludGVyZmFjZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjZiMjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UxSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UxSW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kMShTdHJpbmcgcGFyYW0xLCBTdHJpbmcgcGFyYW0yKTsKLQotICAgIHB1YmxpYyBpbnQgbWV0aG9kMihpbnQgcGFyYW0xLCBpbnQgcGFyYW0yKTsKLQotICAgIHB1YmxpYyBEYXRlIG1ldGhvZDMoRGF0ZSBwYXJhbTEpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4NTNjYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlBhcmVudENsYXNzOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5UZXN0Q2xhc3MxOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMiBpbXBsZW1lbnRzIFNlcnZpY2UySW50ZXJmYWNlIHsKLSAgICAKLSAgICBwdWJsaWMgUGFyZW50Q2xhc3MgbWV0aG9kMShQYXJlbnRDbGFzcyBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MxIG1ldGhvZDIoVGVzdENsYXNzMSBwYXJhbTEpewotICAgICAgICByZXR1cm4gcGFyYW0xOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UySW50ZXJmYWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlZTNkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZHRvLlBhcmVudENsYXNzOwotaW1wb3J0IHNhbXBsZS5ybWkuc2VydmVyLmR0by5UZXN0Q2xhc3MxOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZTJJbnRlcmZhY2UgewotCi0gICAgcHVibGljIFBhcmVudENsYXNzIG1ldGhvZDEoUGFyZW50Q2xhc3MgcGFyYW0xKTsKLQotICAgIHB1YmxpYyBUZXN0Q2xhc3MxIG1ldGhvZDIoVGVzdENsYXNzMSBwYXJhbTEpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UzLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyOWE5Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjI7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjM7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlMyBpbXBsZW1lbnRzIFNlcnZpY2UzSW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyB2b2lkIG1ldGhvZDEoKSB0aHJvd3MgRXhjZXB0aW9uMSB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24xKCJUZXN0IEV4Y2VwdGlvbjEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZDIoU3RyaW5nIHBhcmFtMSkgdGhyb3dzIEV4Y2VwdGlvbjIsIEV4Y2VwdGlvbjEgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uMigiVGVzdCBFeGNlcHRpb24yIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBtZXRob2QzKGludCBwYXJhbTEpIHRocm93cyBFeGNlcHRpb24zLCBFeGNlcHRpb24yLCBFeGNlcHRpb24xIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbjMoIlRlc3QgRXhjZXB0aW9uMyIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2UzSW50ZXJmYWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTNJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmNzEyNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTNJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjE7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjI7Ci1pbXBvcnQgc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uLkV4Y2VwdGlvbjM7Ci0KLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlM0ludGVyZmFjZSB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWV0aG9kMSgpIHRocm93cyBFeGNlcHRpb24xOwotCi0gICAgcHVibGljIFN0cmluZyBtZXRob2QyKFN0cmluZyBwYXJhbTEpIHRocm93cyBFeGNlcHRpb24yLCBFeGNlcHRpb24xOwotCi0gICAgcHVibGljIGludCBtZXRob2QzKGludCBwYXJhbTEpIHRocm93cyBFeGNlcHRpb24zLCBFeGNlcHRpb24yLCBFeGNlcHRpb24xOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2U0LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4YjllOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvU2VydmljZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZTQgaW1wbGVtZW50cyBTZXJ2aWNlNEludGVyZmFjZSB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG1ldGhvZDEoT2JqZWN0IHBhcmFtMSl7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgbWV0aG9kMihMaXN0IHBhcmFtMSwgTGlzdCBwYXJhbTIpewotICAgICAgICBpZiAocGFyYW0xICE9IG51bGwpewotICAgICAgICAgICAgaWYgKHBhcmFtMiAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBwYXJhbTEuYWRkQWxsKHBhcmFtMik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gbWV0aG9kMyhTdHJpbmcgcGFyYW0xLFN0cmluZyBwYXJhbTIsU3RyaW5nIHBhcmFtMyl7Ci0gICAgICAgIFN0cmluZ1tdIHJldHVybkFycmF5ID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgcmV0dXJuQXJyYXlbMF0gPSBwYXJhbTE7Ci0gICAgICAgIHJldHVybkFycmF5WzFdID0gcGFyYW0yOwotICAgICAgICByZXR1cm5BcnJheVsyXSA9IHBhcmFtMzsKLSAgICAgICAgcmV0dXJuIHJldHVybkFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgbWV0aG9kNChNYXAgcGFyYW0xKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9TZXJ2aWNlNEludGVyZmFjZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2U0SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmJmZWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL1NlcnZpY2U0SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGludGVyZmFjZSBTZXJ2aWNlNEludGVyZmFjZSB7Ci0gICAgcHVibGljIE9iamVjdCBtZXRob2QxKE9iamVjdCBwYXJhbTEpOwotCi0gICAgcHVibGljIExpc3QgbWV0aG9kMihMaXN0IHBhcmFtMSwgTGlzdCBwYXJhbTIpOwotCi0gICAgcHVibGljIFN0cmluZ1tdIG1ldGhvZDMoU3RyaW5nIHBhcmFtMSxTdHJpbmcgcGFyYW0yLFN0cmluZyBwYXJhbTMpOwotCi0gICAgcHVibGljIE1hcCBtZXRob2Q0KE1hcCBwYXJhbTEpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2RhdGFiaW5kL0N1c3RvbVNpbXBsZVR5cGVIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZGF0YWJpbmQvQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyNWU3NC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZGF0YWJpbmQvQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmRhdGFiaW5kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5ybWkuZGF0YWJpbmQuU2ltcGxlVHlwZUhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotCi1wdWJsaWMgY2xhc3MgQ3VzdG9tU2ltcGxlVHlwZUhhbmRsZXIgZXh0ZW5kcyBTaW1wbGVUeXBlSGFuZGxlciB7Ci0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRGF0ZSB2YWx1ZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnZlcnRpbmcgZGF0ZSA9PT4gIiArIHZhbHVlKTsKLSAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzaW1wbGVEYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGRaIik7Ci0gICAgICAgIHJldHVybiBzaW1wbGVEYXRlRm9ybWF0LmZvcm1hdCh2YWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9DaGlsZENsYXNzLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL0NoaWxkQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlNTdhYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL0NoaWxkQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgQ2hpbGRDbGFzcyBleHRlbmRzIFBhcmVudENsYXNzIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTM7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmFtNDsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0zKCkgewotICAgICAgICByZXR1cm4gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtMyhTdHJpbmcgcGFyYW0zKSB7Ci0gICAgICAgIHRoaXMucGFyYW0zID0gcGFyYW0zOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlZ2VyIGdldFBhcmFtNCgpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbTQoSW50ZWdlciBwYXJhbTQpIHsKLSAgICAgICAgdGhpcy5wYXJhbTQgPSBwYXJhbTQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9QYXJlbnRDbGFzcy5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9QYXJlbnRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ4NjM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9kdG8vUGFyZW50Q2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotcHVibGljIGNsYXNzIFBhcmVudENsYXNzIHsKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBpbnQgcGFyYW0yOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRQYXJhbTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0yKGludCBwYXJhbTIpIHsKLSAgICAgICAgdGhpcy5wYXJhbTIgPSBwYXJhbTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2R0by9UZXN0Q2xhc3MxLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3ZWI2Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZHRvL1Rlc3RDbGFzczEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmR0bzsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdENsYXNzMSB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwYXJhbTE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFybWEyOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJhbTEoKSB7Ci0gICAgICAgIHJldHVybiBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0xKFN0cmluZyBwYXJhbTEpIHsKLSAgICAgICAgdGhpcy5wYXJhbTEgPSBwYXJhbTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJtYTIoKSB7Ci0gICAgICAgIHJldHVybiBwYXJtYTI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFybWEyKFN0cmluZyBwYXJtYTIpIHsKLSAgICAgICAgdGhpcy5wYXJtYTIgPSBwYXJtYTI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2V4Y2VwdGlvbi9FeGNlcHRpb24xLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzNTI5Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZXhjZXB0aW9uL0V4Y2VwdGlvbjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5ybWkuc2VydmVyLmV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uMSBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgCi0gICAgcHVibGljIEV4Y2VwdGlvbjEoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjEoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjEoVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKGNhdXNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMShTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3JtaS9zcmMvc2FtcGxlL3JtaS9zZXJ2ZXIvZXhjZXB0aW9uL0V4Y2VwdGlvbjIuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9leGNlcHRpb24vRXhjZXB0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDljOWYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9leGNlcHRpb24vRXhjZXB0aW9uMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnJtaS5zZXJ2ZXIuZXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb24yIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgRXhjZXB0aW9uMigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uMihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvcm1pL3NyYy9zYW1wbGUvcm1pL3NlcnZlci9leGNlcHRpb24vRXhjZXB0aW9uMy5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDhhYTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9ybWkvc3JjL3NhbXBsZS9ybWkvc2VydmVyL2V4Y2VwdGlvbi9FeGNlcHRpb24zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUucm1pLnNlcnZlci5leGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEV4Y2VwdGlvbjMgZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIAotICAgIHB1YmxpYyBFeGNlcHRpb24zKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24zKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBFeGNlcHRpb24zKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihjYXVzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEV4Y2VwdGlvbjMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUyOTY3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0ic2NyaXB0IiBkZWZhdWx0PSJhbGx0ZXN0cyI+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1haW5EaXIiIHZhbHVlPSIuLi8uLiIvPgotICAgIDxwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuL3NhbXBsZS5qYXIiLz4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdGggaWQ9InNhbXBsZS5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiLz4KLSAgICA8L3BhdGg+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImFsbHRlc3RzIgotICAgICAgICAgICAgZGVwZW5kcz0idGVzdEVjaG9CbG9ja2luZ0NsaWVudCx0ZXN0RWNob0Jsb2NraW5nRHVhbENsaWVudCx0ZXN0RWNob05vbkJsb2NraW5nRHVhbENsaWVudCx0ZXN0UGluZ0NsaWVudCx0ZXN0V2ViU2VydmljZVdpdGhNb2R1bGVDbGllbnQiPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob0Jsb2NraW5nQ2xpZW50Ij4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUuY2xpZW50cy5FY2hvQmxvY2tpbmdDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0iLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdEVjaG9CbG9ja2luZ0R1YWxDbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0R1YWxDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0iLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdEVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0iLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdFBpbmdDbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLlBpbmdDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0iLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdFdlYlNlcnZpY2VXaXRoTW9kdWxlQ2xpZW50Ij4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUuY2xpZW50cy5DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZSIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3RFY2hvTm9uQmxvY2tpbmdDbGllbnQiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9Ob25CbG9ja2luZ0NsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfSIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9CbG9ja2luZ0NsaWVudC5iYXQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9CbG9ja2luZ0NsaWVudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTMyZjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvQmxvY2tpbmdDbGllbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotUkVNICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotUkVNICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLVJFTSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1SRU0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLVJFTSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLVJFTSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLVJFTSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotUkVNICANCi1SRU0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLVJFTSAgDQotUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotUkVNICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLVJFTSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotUkVNICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLVJFTSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLVJFTSAgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KLQ0KLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoDQotc2V0IEFYSVMyX0hPTUU9Li5cLi5cLi5cDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlDQotRk9SICUlYyBpbiAoJUFYSVMyX0hPTUUlXGxpYlwqLmphcikgRE8gc2V0IEFYSVMyX0NMQVNTX1BBVEg9IUFYSVMyX0NMQVNTX1BBVEghOyUlYw0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9DTEFTU19QQVRIJTsuLlxzYW1wbGUuamFyDQotDQotamF2YSAtY3AgJUFYSVMyX0NMQVNTX1BBVEglIHVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0NsaWVudA0KLWVuZGxvY2FsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmJhdCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0RWNob0Jsb2NraW5nRHVhbENsaWVudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNTVkNzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvQmxvY2tpbmdEdWFsQ2xpZW50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZg0KLXNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24NCi0NCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1SRU0gIA0KLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotUkVNICANCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotUkVNICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1yZW0gbG9vcCB0aHJvdWdoIHRoZSBsaWJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY2xhc3MgcGF0aA0KLXNldCBBWElTMl9IT01FPS4uXC4uXC4uXA0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9IT01FJQ0KLUZPUiAlJWMgaW4gKCVBWElTMl9IT01FJVxsaWJcKi5qYXIpIERPIHNldCBBWElTMl9DTEFTU19QQVRIPSFBWElTMl9DTEFTU19QQVRIITslJWMNCi0NCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfQ0xBU1NfUEFUSCU7Li5cc2FtcGxlLmphcg0KLQ0KLWphdmEgLWNwICVBWElTMl9DTEFTU19QQVRIJSB1c2VyZ3VpZGUuY2xpZW50cy5FY2hvQmxvY2tpbmdEdWFsQ2xpZW50DQotZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9Ob25CbG9ja2luZ0NsaWVudC5iYXQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdEVjaG9Ob25CbG9ja2luZ0NsaWVudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWYwMGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvTm9uQmxvY2tpbmdDbGllbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoDQotc2V0IEFYSVMyX0hPTUU9Li5cLi5cLi5cDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlDQotRk9SICUlYyBpbiAoJUFYSVMyX0hPTUUlXGxpYlwqLmphcikgRE8gc2V0IEFYSVMyX0NMQVNTX1BBVEg9IUFYSVMyX0NMQVNTX1BBVEghOyUlYw0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9DTEFTU19QQVRIJTsuLlxzYW1wbGUuamFyDQotDQotamF2YSAtY3AgJUFYSVMyX0NMQVNTX1BBVEglIHVzZXJndWlkZS5jbGllbnRzLkVjaG9Ob25CbG9ja2luZ0NsaWVudA0KLWVuZGxvY2FsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LmJhdCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0RWNob05vbkJsb2NraW5nRHVhbENsaWVudC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDVmMmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RFY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLUBlY2hvIG9mZg0KLXNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24NCi0NCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1SRU0gIA0KLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotUkVNICANCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotUkVNICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1yZW0gbG9vcCB0aHJvdWdoIHRoZSBsaWJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY2xhc3MgcGF0aA0KLXNldCBBWElTMl9IT01FPS4uXC4uXC4uXA0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9IT01FJQ0KLUZPUiAlJWMgaW4gKCVBWElTMl9IT01FJVxsaWJcKi5qYXIpIERPIHNldCBBWElTMl9DTEFTU19QQVRIPSFBWElTMl9DTEFTU19QQVRIITslJWMNCi0NCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfQ0xBU1NfUEFUSCU7Li5cc2FtcGxlLmphcg0KLQ0KLWphdmEgLWNwICVBWElTMl9DTEFTU19QQVRIJSB1c2VyZ3VpZGUuY2xpZW50cy5FY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50DQotZW5kbG9jYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFBpbmdDbGllbnQuYmF0IGIvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RQaW5nQ2xpZW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlZWM0MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFBpbmdDbGllbnQuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQGVjaG8gb2ZmDQotc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoDQotc2V0IEFYSVMyX0hPTUU9Li5cLi5cLi5cDQotDQotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlDQotRk9SICUlYyBpbiAoJUFYSVMyX0hPTUUlXGxpYlwqLmphcikgRE8gc2V0IEFYSVMyX0NMQVNTX1BBVEg9IUFYSVMyX0NMQVNTX1BBVEghOyUlYw0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9DTEFTU19QQVRIJTsuLlxzYW1wbGUuamFyDQotDQotamF2YSAtY3AgJUFYSVMyX0NMQVNTX1BBVEglIHVzZXJndWlkZS5jbGllbnRzLlBpbmdDbGllbnQNCi1lbmRsb2NhbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0UGluZ0NsaWVudC5zaCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0UGluZ0NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0MTg4NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFBpbmdDbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAgCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgIAotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1leHBvcnQgQVhJUzJfSE9NRT0uLi8uLi8uLi8KLQotQVhJUzJfQ0xBU1NQQVRIPSRBWElTMl9DTEFTU1BBVEg6Li4vc2FtcGxlLmphcgotZm9yIGYgaW4gJEFYSVMyX0hPTUUvbGliLyouamFyCi1kbwotICBBWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDokZgotZG9uZQotCi1leHBvcnQgQVhJUzJfQ0xBU1NQQVRICi1qYXZhIC1jbGFzc3BhdGggJEFYSVMyX0NMQVNTUEFUSCAgdXNlcmd1aWRlLmNsaWVudHMuUGluZ0NsaWVudApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RXZWJTZXJ2aWNlV2l0aE1vZHVsZUNsaWVudC5iYXQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFdlYlNlcnZpY2VXaXRoTW9kdWxlQ2xpZW50LmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyZTJkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvVGVzdFdlYlNlcnZpY2VXaXRoTW9kdWxlQ2xpZW50LmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLUBlY2hvIG9mZg0KLXNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24NCi0NCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1SRU0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotUkVNICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1SRU0gIA0KLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotUkVNICANCi1SRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1SRU0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotUkVNICB1bmRlciB0aGUgTGljZW5zZS4NCi0NCi1yZW0gbG9vcCB0aHJvdWdoIHRoZSBsaWJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY2xhc3MgcGF0aA0KLXNldCBBWElTMl9IT01FPS4uXC4uXC4uXA0KLQ0KLXNldCBBWElTMl9DTEFTU19QQVRIPSVBWElTMl9IT01FJQ0KLUZPUiAlJWMgaW4gKCVBWElTMl9IT01FJVxsaWJcKi5qYXIpIERPIHNldCBBWElTMl9DTEFTU19QQVRIPSFBWElTMl9DTEFTU19QQVRIITslJWMNCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfQ0xBU1NfUEFUSCU7Li5cc2FtcGxlLmphcg0KLQ0KLWphdmEgLWNwICVBWElTMl9DTEFTU19QQVRIJSB1c2VyZ3VpZGUuY2xpZW50cy5DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZQ0KLWVuZGxvY2FsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RXZWJTZXJ2aWNlV2l0aE1vZHVsZUNsaWVudC5zaCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy9UZXN0V2ViU2VydmljZVdpdGhNb2R1bGVDbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZjE5NWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL1Rlc3RXZWJTZXJ2aWNlV2l0aE1vZHVsZUNsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICAKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWV4cG9ydCBBWElTMl9IT01FPS4uLy4uLy4uLwotCi1BWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDouLi9zYW1wbGUuamFyCi1mb3IgZiBpbiAkQVhJUzJfSE9NRS9saWIvKi5qYXIKLWRvCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmCi1kb25lCi0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgKLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIICB1c2VyZ3VpZGUuY2xpZW50cy5DbGllbnRGb3JXZWJTZXJ2aWNlV2l0aE1vZHVsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ibG9ja2luZ19jbGllbnQuc2ggYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX2Jsb2NraW5nX2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1NzEwZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX2Jsb2NraW5nX2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICAKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWV4cG9ydCBBWElTMl9IT01FPS4uLy4uLy4uLwotCi1BWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDouLi9zYW1wbGUuamFyCi1mb3IgZiBpbiAkQVhJUzJfSE9NRS9saWIvKi5qYXIKLWRvCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmCi1kb25lCi0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgKLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIIHVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0NsaWVudApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ibG9ja2luZ19kdWFsX2NsaWVudC5zaCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fYmxvY2tpbmdfZHVhbF9jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNWQ3YTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ibG9ja2luZ19kdWFsX2NsaWVudC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jICAKLSMgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAgCi0jICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWV4cG9ydCBBWElTMl9IT01FPS4uLy4uLy4uLwotCi1BWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDouLi9zYW1wbGUuamFyCi1mb3IgZiBpbiAkQVhJUzJfSE9NRS9saWIvKi5qYXIKLWRvCi0gIEFYSVMyX0NMQVNTUEFUSD0kQVhJUzJfQ0xBU1NQQVRIOiRmCi1kb25lCi0KLWV4cG9ydCBBWElTMl9DTEFTU1BBVEgKLWphdmEgLWNsYXNzcGF0aCAkQVhJUzJfQ0xBU1NQQVRIIHVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0R1YWxDbGllbnQKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fbm9uX2Jsb2NraW5nX2NsaWVudC5zaCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fbm9uX2Jsb2NraW5nX2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NzZhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NjcmlwdC91c2VyZ3VpZGUvY2xpZW50X3NjcmlwdHMvdGVzdF9lY2hvX25vbl9ibG9ja2luZ19jbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAgCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgIAotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1leHBvcnQgQVhJUzJfSE9NRT0uLi8uLi8uLi8KLQotQVhJUzJfQ0xBU1NQQVRIPSRBWElTMl9DTEFTU1BBVEg6Li4vc2FtcGxlLmphcgotZm9yIGYgaW4gJEFYSVMyX0hPTUUvbGliLyouamFyCi1kbwotICBBWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDokZgotZG9uZQotCi1leHBvcnQgQVhJUzJfQ0xBU1NQQVRICi1qYXZhIC1jbGFzc3BhdGggJEFYSVMyX0NMQVNTUEFUSCB1c2VyZ3VpZGUuY2xpZW50cy5FY2hvTm9uQmxvY2tpbmdDbGllbnQKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2NyaXB0L3VzZXJndWlkZS9jbGllbnRfc2NyaXB0cy90ZXN0X2VjaG9fbm9uX2Jsb2NraW5nX2R1YWxfY2xpZW50LnNoIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ub25fYmxvY2tpbmdfZHVhbF9jbGllbnQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMzg4YjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zY3JpcHQvdXNlcmd1aWRlL2NsaWVudF9zY3JpcHRzL3Rlc3RfZWNob19ub25fYmxvY2tpbmdfZHVhbF9jbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAgCi0jICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgIAotIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1leHBvcnQgQVhJUzJfSE9NRT0uLi8uLi8uLi8KLQotQVhJUzJfQ0xBU1NQQVRIPSRBWElTMl9DTEFTU1BBVEg6Li4vc2FtcGxlLmphcgotZm9yIGYgaW4gJEFYSVMyX0hPTUUvbGliLyouamFyCi1kbwotICBBWElTMl9DTEFTU1BBVEg9JEFYSVMyX0NMQVNTUEFUSDokZgotZG9uZQotCi1leHBvcnQgQVhJUzJfQ0xBU1NQQVRICi1qYXZhIC1jbGFzc3BhdGggJEFYSVMyX0NMQVNTUEFUSCAgdXNlcmd1aWRlLmNsaWVudHMuRWNob05vbkJsb2NraW5nRHVhbENsaWVudApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MmQyNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLVNhbXBsZTogU2VydmljZUxpZmVDeWNsZQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb246DQotPT09PT09PT09PT09DQotDQotVGhpcyBzYW1wbGUgZGVtb25zdHJhdGUgdXNhZ2Ugb2YgdGhlIHNlcnZpY2UgbGlmZWN5Y2xlIGFuZCBhIGJpdCBvZiBzZXNzaW9uIG1hbmFnbWVudC4gDQotVGhlIG1haW4gaWRlYSBpcyB0byBzaG93IHdoZXJlIGFuZCBob3cgdG8gdXNlIHNlcnZpY2UgbGlmZWN5Y2xlIGludGVyZmFjZSBhbmQgDQotc2Vzc2lvbiByZWxhdGVkIG1ldGhvZHMuIA0KLQ0KLQ0KLVByZXJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09DQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLUlmIHlvdSB3YW50IHRvIGFjY2VzcyB0aGUgc2VydmljZSBpbiBhIFJFU1QgbWFubmVyIHlvdSBoYXZlIHRvIGRlcGxveSB0aGUgc2VydmljZSBpbiBhbg0KLWFwcGxpY2F0aW9uIHNlcnZlciBzdWNoIGFzIEFwYWNoZSBUb21jYXQuIE5vdGUgdGhhdCBpdCB3aWxsIG5vdCB3b3JrIHdpdGggYXhpczJzZXJ2ZXIuDQotDQotDQotDQotRGVwbG95aW5nIHRoZSBTZXJ2aWNlDQotPT09PT09PT09PT09PT09PT09PT09IA0KLQ0KLURlcGxveSBpbnRvIFNhbXBsZSByZXBvc2l0b3J5Og0KLSAgICANCi0gKiBUeXBlIGFudCBnZW5lcmF0ZS5zZXJ2aWNlIG9yIHNpbXBseSBhbnQgZnJvbSBBWElTMl9IT01FL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZQ0KLQ0KLURlcGxveSBpbnRvIFRvbWNhdCA6DQotICAgICANCi0gKiBUbyBidWlsZCBhbmQgY29weSB0aGUgc2VydmljZSBhcmNoaXZlIGZpbGUgaW50byBUb21jYXQsIHR5cGUgYW50IGNvcHkudG8udG9tY2F0IGZyb20gDQotQVhJUzJfSE9NRS9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUgd2hpY2ggd2lsbCBjb3B5IHRoZSBhYXIgZmlsZSBpbnRvDQotPHRvbWNhdF9ob21lPi93ZWItYXBwL2F4aXMyL1dFQi1JTkYvc2VydmljZXMgZGlyZWN0b3J5Lg0KLQ0KLVJ1bm5pbmcgdGhlIENsaWVudA0KLT09PT09PT09PT09PT09PT09PQ0KLVR5cGUgYW50IHJ1bi5jbGllbnQgZnJvbSBBWElTMl9IT01FL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS4NCi0NCi1BbmQgdGhlbiBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBhcyBtZW50aW9uZWQgaW4gdGhlIGNvbnNvbGUuDQotDQotV2hlbiBhc2tlZCBmb3Igc2VydmljZSBlcHIgYWRkcmVzcywgZW50ZXINCi1odHRwOi8vPGhvc3Q+Ojxwb3J0Pi9heGlzMi9zZXJ2aWNlcy9MaWJyYXJ5DQotV2hlcmUgPGhvc3Q+ICYgPHBvcnQ+IHdvdWxkIGJlIHRoZSBob3N0IGFuZCBwb3J0IHRoYXQgdG9tY2F0IGlzIHJ1bm5pbmcgb24sIHJlc3BlY3RpdmVseS4NCi0NCi1BZHZhbmNlZCBHdWlkZQ0KLT09PT09PT09PT09PT09DQotRm9yIG1vcmUgZGV0YWlscyBraW5kbHkgc2VlIGRvYy9zZXJ2aWNlbGlmZWN5Y2xlZ3VpZGUuaHRtbA0KLQ0KLU5vdGUNCi09PT09PT09PT09PT09PQ0KLVNvbWV0aW1lcywgaWYgeW91J3JlIGhhdmluZyB0cm91YmxlIHJ1bm5pbmcgdGhlIGNsaWVudCBzdWNjZXNzZnVsbHksIA0KLUl0IG1heSBiZSBuZWNlc3NhcnkgdG8gY2xlYW4gdGhlIHNlcnZpY2VzIHJlcG9zaXRvcnkgYmVmb3JlIHlvdSBnZW5lcmF0ZSB0aGUgc2VydmljZSwgZGVwbG95IGl0DQotYW5kIHJ1biB0aGUgY2xpZW50LiAoaS5lLiBkZWxldGUgc2VydmljZXMgY3JlYXRlZCBmcm9tIHByZXZpb3VzIHNhbXBsZXMuKQ0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTIyNjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9InNlcnZpY2VsaWZlY3ljbGUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImJ1aWxkIj4KLQotICAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZpY2UtbmFtZSIgdmFsdWU9IkxpYnJhcnkuYWFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0idGFyZ2V0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0KLQk8cHJvcGVydHkgbmFtZT0icmVwb3NpdG9yeS5wYXRoIiB2YWx1ZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5L3NlcnZpY2VzIiAvPgotCi0gICAgPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyLmNsYXNzZXMiIHZhbHVlPSIke2Rlc3QuZGlyfS9jbGFzc2VzIi8+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIubGliIiB2YWx1ZT0iJHtkZXN0LmRpcn0vbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNhdGFsaW5hLW1vZHVsZXMiCi0gICAgICAgICAgICAgIHZhbHVlPSIke2Vudi5DQVRBTElOQV9IT01FfS93ZWJhcHBzL2F4aXMyL1dFQi1JTkYvc2VydmljZXMiLz4KLQotICAgIDxwYXRoIGlkPSJidWlsZC5jbGFzcy5wYXRoIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLQotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtkZXN0LmRpcn0iLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDx0YXJnZXQgbmFtZT0icHJlcGFyZSIgZGVwZW5kcz0iY2xlYW4iPgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXJ9Ii8+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIvPgotCi0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30vTUVUQS1JTkYiLz4KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0icHJlcGFyZSI+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iLz4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30vTUVUQS1JTkYiLz4KLQotICAgICAgICA8Y29weSBmaWxlPSJzcmMvTUVUQS1JTkYvc2VydmljZXMueG1sIgotICAgICAgICAgICAgICB0b2ZpbGU9IiR7ZGVzdC5kaXIuY2xhc3Nlc30vTUVUQS1JTkYvc2VydmljZXMueG1sIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiLz4KLQotICAgICAgICA8amF2YWMgZGVidWc9Im9uIiBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgaW5jbHVkZXM9InNhbXBsZS8qKiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIi8+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IgotICAgICAgICAgICAgIGRlc3RmaWxlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UtbmFtZX0iLz4KLQotICAgIDwvdGFyZ2V0PgotCi0gICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0icHJlcGFyZSI+Ci0KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iLz4KLQotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGVzdC5kaXIuY2xhc3Nlc30vTUVUQS1JTkYiLz4KLQotICAgICAgICA8Y29weSBmaWxlPSJzcmMvTUVUQS1JTkYvc2VydmljZXMueG1sIgotICAgICAgICAgICAgICB0b2ZpbGU9IiR7ZGVzdC5kaXIuY2xhc3Nlc30vTUVUQS1JTkYvc2VydmljZXMueG1sIgotICAgICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiLz4KLQotICAgICAgICA8amF2YWMgZGVidWc9Im9uIiBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgaW5jbHVkZXM9InNhbXBsZS8qKiI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIi8+Ci0gICAgICAgIDwvamF2YWM+Ci0KLSAgICAgICAgPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IgotICAgICAgICAgICAgIGRlc3RmaWxlPSIke3JlcG9zaXRvcnkucGF0aH0vJHtzZXJ2aWNlLW5hbWV9Ii8+Ci0KLSAgICA8L3RhcmdldD4KLQotCi0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9InByZXBhcmUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9Ii8+Ci0gICAgICAgIDxqYXZhYyBkZWJ1Zz0ib24iIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBpbmNsdWRlcz0iY2xpZW50LyoqIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmFjPgotCi0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY2xpZW50LkxpYnJhcnlTZXJ2aWNlQ2xpZW50Ij4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Rlc3QuZGlyLmNsYXNzZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIiPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIvPgotICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0JPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJjb3B5LnRvLnRvbWNhdCIgZGVwZW5kcz0iYnVpbGQiPgotICAgICAgICA8Y29weSBmaWxlPSIke2Rlc3QuZGlyfS8ke3NlcnZpY2UtbmFtZX0iIHRvZGlyPSIke2NhdGFsaW5hLW1vZHVsZXN9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9kb2Mvc2VydmljZWxpZmVjeWNsZWd1aWRlLmh0bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvZG9jL3NlcnZpY2VsaWZlY3ljbGVndWlkZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzhiMjg4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9kb2Mvc2VydmljZWxpZmVjeWNsZWd1aWRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci0gIDx0aXRsZT5TZXJ2aWNlIExpZmUgQ3ljbGUgU2FtcGxlIEd1aWRlPC90aXRsZT4KLSAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJhbWF5YSA5LjIuMSwgc2VlIGh0dHA6Ly93d3cudzMub3JnL0FtYXlhLyIKLSAgLz4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+U2VydmljZSBMaWZlIEN5Y2xlIFNhbXBsZSBHdWlkZTwvaDE+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5UaGlzIHNhbXBsZSBpcyB0byBkZW1vbnN0cmF0ZSB1c2FnZSBvZiBhIHNlcnZpY2UgbGlmZSBjeWNsZSBpbnRlcmZhY2UgYW5kCi1zZXNzaW9uIHNjb3Bpbmcgd2l0aCBhIHNhbXBsZSBvbiBhcHBsaWNhdGlvbiBzY29wZSBzZXNzaW9uLiBUaGUgc2FtcGxlCi1jb25zaXN0cyBvZiB0d28gcGFydHMsIFNlcnZpY2UgYW5kIENsaWVudC48L3A+Ci0KLTxwPkxldCdzIHRha2UgYSBsaWJyYXJ5IHN5c3RlbSwgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucywgYXMgdGhlCi1zY2VuYXJpbyBmb3IgdGhpcyBzYW1wbGUuPC9wPgotPHVsPgotICA8bGk+UmVnaXN0ZXIgdXNlcjwvbGk+Ci0gIDxsaT5Mb2dpbiB0byBzeXN0ZW08L2xpPgotICA8bGk+VmlldyBhbGwgYm9va3M8L2xpPgotICA8bGk+VmlldyBhdmFpbGFibGUgYm9va3M8L2xpPgotICA8bGk+VmlldyBsZW5kIGJvb2tzPC9saT4KLSAgPGxpPkxlbmQgYW5kIHJldHVybiBib29rczwvbGk+Ci08L3VsPgotCi08aDI+V2h5IERvIFdlIE5lZWQgU2VydmljZSBMaWZlIEN5Y2xlIEhlcmU/PC9oMj4KLQotPHA+SW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgYXQgdGhlIHJ1bnRpbWUgc2VydmljZSBpbXBsIGNsYXNzIGNhbiBhY2Nlc3MKLWRhdGEgcmVhZCBmcm9tIGFueXdoZXJlLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIHNlcnZpY2UgYXQgZGVwbG95bWVudC4KLUxldCdzIGZvcmdldCBhYm91dCB0aGUgc2Vzc2lvbiBmb3IgYSBtaW51dGUgYW5kIHRoaW5rIGFib3V0IHRoZSBzY2VuYXJpbwotd2hlcmUgeW91IHdhbnQgdG8gcG9wdWxhdGUgYSBiZWFuIG9yIG5lZWQgdG8gc3RhcnQgYSBEYXRhIEJhc2UgY29ubmVjdGlvbiBmb3IKLXRoZSBzZXJ2aWNlLiBJbiBzdWNoIGEgc2l0dWF0aW9uIGhhdmluZyBzZXJ2aWNlIGxpZmUgY3ljbGUgY2xhc3MgaXMgdmVyeQotdXNlZnVsLjwvcD4KLQotPHA+SW4gdGhpcyBzYW1wbGUgeW91IHdpbGwgbGVhcm4gaG93IHRvIHVzZSB0aGUgc2VydmljZSBsaWZlIGN5Y2xlIGNsYXNzIGZvcgoteW91ciBhcHBsaWNhdGlvbi4gVGhlIGludGVyZmFjZSBoYXMgb25seSB0d28gbWV0aG9kczwvcD4KLTxvbD4KLSAgPGxpPnN0YXJ0VXA8L2xpPgotICA8bGk+c2h1dERvd248L2xpPgotPC9vbD4KLQotPHA+V2hlcmUgc3RhcnRVcCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgc2VydmljZSBpcyBkZXBsb3llZCBhbmQgaXQKLXdpbGwgY2FsbCBvbmx5IG9uY2UgZm9yIHRoYXQgcGFydGljdWxhciBzZXJ2aWNlLCB3aGlsZSBzaHV0RG93biBtZXRob2QgY2FsbHMKLXdoZW4gc3lzdGVtIHNodXRkb3duLjwvcD4KLQotPHA+U28gaW4gdGhpcyBzYW1wbGUsIHRoZSBsaWZlIGN5Y2xlIGNsYXNzIHdpbGwgbG9hZCB0aGUgbGlicmFyeSBpbnNpZGUgdGhlCi1zdGFydFVwIG1ldGhvZC4gQXQgdGhlIHZlcnkgZmlyc3QgdGltZSB0aGUgc3lzdGVtIHdpbGwgbG9hZCBmcm9tCi1zZXJ2aWNlcy54bWwuIEl0IGhhcyBhbGwgdGhlIGF2YWlsYWJsZSBib29rcyBpbiB0aGUgc3lzdGVtLiBBbmQgYXQgdGhlIHRpbWUKLW9mIHN5c3RlbSBzaHV0ZG93biBpdCB3aWxsIHNhdmUgdGhlIHN0YXR1cyBvZiB0aGUgbGlicmFyeSBpbnRvIGEgZmlsZQotKGxpYnJhcnkueG1sKSBpbiB0aGUgamF2YS5pby50ZW1wIGRpcmVjdG9yeS4gU28gdGhlIG5leHQgdGltZSBvbndhcmRzIGl0IHdpbGwKLXBvcHVsYXRlIGxpYnJhcnkgdXNpbmcgdGhlIGFib3ZlIGZpbGUuIFNvIGFsbCB0aGUgY2hhbmdlcyB3aWxsIGJlIHRoZXJlIGluCi10aGUgbmV3IGluc3RhbmNlIGFzIHdlbGwuPC9wPgotCi08aDI+UHJlcmVxdWlzaXRlczwvaDI+Ci0KLTxwPllvdSB3aWxsIGhhdmUgdG8gaW5zdGFsbCA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BcGFjaGUgQW50PC9hPgotMS42LjIgb3IgbGF0ZXIuPC9wPgotCi08aDI+UnVubmluZyB0aGUgU2FtcGxlPC9oMj4KLQotPGgzPkhvdyB0byBCdWlsZCB0aGUgU2VydmljZT88L2gzPgotCi08cD5CdWlsZGluZyB0aGUgc2VydmljZSBpcyBqdXN0IGEgbWF0dGVyIG9mIHJ1bm5pbmcgYW50IGJ1aWxkIGZpbGUuIEl0IHdpbGwKLWNyZWF0ZSB0aGUgc2VydmljZSBhYXIgZmlsZSwgb3IgeW91IGNvdWxkIGp1c3QgcnVuIHRoZSBjb3B5LnRvLnRvbWNhdCBnb2FsCi13aGljaCB3aWxsIGNvcHkgdGhlIGFhciBmaWxlIGludG8gdG9tY2F0L3dlYi1hcHAvYXhpczIvV0VCLUlORi9zZXJ2aWNlcwotZGlyZWN0b3J5LjwvcD4KLQotPHA+TmV4dCwgZ28gdG8gaHR0cDovL1t1cmwgYW5kIHBvcnQgdG8geW91ciBhcHAgc2VydmVyXS9heGlzMiBhbmQgc2VlIHdoZXRoZXIKLXlvdXIgc2VydmljZSBpcyBsaXN0ZWQgdGhlcmUuPC9wPgotCi08aDM+SG93IHRvIEludm9rZSB0aGUgU2VydmljZTwvaDM+Ci0KLTxwPllvdSBjYW4gaW52b2tlIGNvbXBsZXRlIHNlcnZpY2UgdXNpbmcgUkVTVCBBUEksIGJ1dCBpdCBvbmx5IHdvcmtzIGluCi1hcHBsaWNhdGlvbiBzZXJ2ZXJzIGxpa2UgQXBhY2hlIFRvbWNhdCBhbmQgaXQgd2lsbCBub3Qgd29yayBpbgotU2ltcGxlSHR0cFNlcnZlci4gRmlyc3QgdHJ5IHRvIHVzZSBsaWJyYXJ5IHN5c3RlbSB1c2luZyBSRVNUIEFQSS48L3A+Ci0KLTxwPlRoaXMgc2FtcGxlIGlzIGEgc2ltcGxlIG9uZSBhbmQgd2lsbCBub3QgZG8gY29tcGxleCB0YXNrcy4gU28gbGV0J3MgZm9sbG93Ci1zdGVwcyBnaXZlbiBiZWxvdyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2FtcGxlIHdvcmtzIGFzIGl0IHNob3VsZDo8L3A+Ci0KLTxwPjxzdHJvbmc+U3RlcCAxPC9zdHJvbmc+Oi0gVmlldyBhbGwgdGhlIGF2YWlsYWJsZSBib29rcyBpbiB0aGUgbGlicmFyeSwKLWp1c3QgdHlwZSB0aGUgVVJMCi1odHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTGlicmFyeS9saXN0QXZhaWxhYmxlQm9vayBvbiB5b3VyCi1mYXZvcml0ZSBicm93c2VyLjwvcD4KLQotPHA+WW91IHdpbGwgc2VlIGFsbCB0aGUgYXZhaWxhYmxlIGJvb2tzIGluIHRoZSBzeXN0ZW0uPC9wPgotCi08cD48c3Ryb25nPlN0ZXAgMjwvc3Ryb25nPiA6IFZpZXcgYWxsIHRoZSBib29rcyBpbiB0aGUgc3lzdGVtIGF0Ci1odHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTGlicmFyeS9saXN0QWxsQm9vazwvcD4KLQotPHA+SW4gdGhpcyBjYXNlIHlvdSB3aWxsIGdldCBleGFjdGx5IHRoZSBzYW1lIHJlc3VsdCBmb3IgYm90aCB0aGUgcmVxdWVzdCwKLXNpbmNlIG5vIG9uZSBoYXMgYm9ycm93ZWQgdGhlIGJvb2suPC9wPgotCi08cD48c3Ryb25nPlN0ZXAgMzwvc3Ryb25nPjogTm93IGxvb2sgYXQgYWxsIHRoZSBsZW50IGJvb2tzIGluIHRoZSBzeXN0ZW0uIEFuZAoteW91IHdpbGwgc2VlIGFuIGVtcHR5IGxpc3QgYXQKLWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9MaWJyYXJ5L2xpc3RMZW5kQm9vazwvcD4KLQotPHA+PHN0cm9uZz5TdGVwIDQ8L3N0cm9uZz4gOiBSZWdpc3RlciBhIHVzZXIuIFRvIGxlbmQgYSBib29rIG9yIHJldHVybiBhCi1ib29rLCB5b3UgbmVlZCB0byByZWdpc3RlciBmaXJzdC4gRG8gbm90IHJlZ2lzdGVyIHR3aWNlLCBpZiB5b3UgdHJ5IHRvIGRvIHNvCi15b3Ugd2lsbCBnZXQgYW4gZXhjZXB0aW9uLjwvcD4KLQotPHA+VG8gcmVnaXN0ZXIgeW91IG5lZWQgdG8gZ2l2ZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIChoYXZlIGEgbG9vayBhdCB0aGUKLXdzZGwgYXQgaHR0cDovLzEyNy4wLjAuMTpwb3J0L2F4aXMyL3NlcnZpY2VzL3NlcnZpY2VOYW1lP3dzZGwuIFlvdSB3aWxsIHNlZQotd2hhdCB5b3UgbmVlZCB0byBwYXNzIGluKTwvcD4KLQotPHA+U28gbGV0J3MgY3JlYXRlIGEgdXNlciBjYWxsZWQgJ2Zvbycgd2l0aCB0aGUgcGFzc3dvcmQgJzEyMycKLShodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTGlicmFyeS9yZWdpc3Rlcj91c2VyTmFtZT1mb28mYW1wO3Bhc3NXb3JkPTEyMyk8L3A+Ci0KLTxwPlRoZW4geW91IHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgcmVzcG9uc2UsIGlmIGV2ZXJ5dGhpbmcgaGFzIGdvbmUgd2VsbC48L3A+Ci08cHJlPiZsdDtuczpyZWdpc3RlclJlc3BvbnNlJmd0OwotJmx0O25zOnJldHVybiZndDt0cnVlJmx0Oy9uczpyZXR1cm4mZ3Q7Ci0mbHQ7L25zOnJlZ2lzdGVyUmVzcG9uc2UmZ3Q7PC9wcmU+Ci0KLTxwPjxzdHJvbmc+U3RlcCA1PC9zdHJvbmc+IDogTG9nIGludG8gc3lzdGVtLiBUbyBsb2cgaW4geW91IG5lZWQgdG8gcGFzcyB1c2VyCi1uYW1lIGFuZCBwYXNzd29yZC4gU28gbGV0J3MgdHJ5IHRvIGxvZ2luIHRvIHN5c3RlbS4gVGhlIHJlcXVlc3Qgd2lsbCBiZQotaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0xpYnJhcnkvbG9naW4/dXNlck5hbWU9Zm9vJmFtcDtwYXNzV29yZD0xMjM8L3A+Ci0KLTxwPjxzdHJvbmc+U3RlcCA2PC9zdHJvbmc+IDogTm93IHdlIGFyZSByZWFkeSB0byBsZW5kIGEgYm9vay4gVG8gbGVuZCBhIGJvb2sKLXlvdSBuZWVkIHRvIHBhc3MgaXNibiBhbmQgdXNlck5hbWUuIExldCdzIHRyeSB0byBsZW5kIHRoZSBib29rIHdpdGggaXNibgotMC05MzcxNzUtNzctMywgeW91ciByZXF1ZXN0IHdvdWxkIGxvb2sgbGlrZSBiZWxvdzo8L3A+Ci0KLTxwPmh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9heGlzMi9zZXJ2aWNlcy9MaWJyYXJ5L2xlbmRCb29rP2lzYm49MC05MzcxNzUtNzctMyZhbXA7dXNlck5hbWU9Zm9vPC9wPgotCi08cD5JZiBldmVyeXRoaW5nIHdlbnQgd2VsbCwgeW91IHdpbGwgc2VlIHRoZSBmb2xsb3dpbmcgcmVzcG9uc2UgaW4gdGhlCi1icm93c2VyLjwvcD4KLTxwcmU+Jmx0O25zOmxlbmRCb29rUmVzcG9uc2UmZ3Q7Ci0mbHQ7bnM6cmV0dXJuJmd0OwotJmx0O2F1dGhvciZndDtKb2huIEJsb29tZXImbHQ7L2F1dGhvciZndDsKLSZsdDtpc2JuJmd0OzAtOTM3MTc1LTc3LTMmbHQ7L2lzYm4mZ3Q7Ci0mbHQ7dGl0bGUmZ3Q7UG93ZXIgUHJvZ3JhbW1pbmcgd2l0aCBSUEMmbHQ7L3RpdGxlJmd0OwotJmx0Oy9uczpyZXR1cm4mZ3Q7Ci0mbHQ7L25zOmxlbmRCb29rUmVzcG9uc2UmZ3Q7PC9wcmU+Ci0KLTxwPjxzdHJvbmc+U3RlcCA3PC9zdHJvbmc+IDogTm93IGdvIGFuZCBsb29rIGF0IGxlbnQgbGlzdCBhZ2FpbiBhdAotaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0xpYnJhcnkvbGlzdExlbmRCb29rLCB5b3Ugd2lsbCBzZWUgdGhlCi1mb2xsb3dpbmcgb3V0cHV0IGluIHRoZSBicm93c2VyLjwvcD4KLTxwcmU+Jmx0O25zOmxpc3RMZW5kQm9va1Jlc3BvbnNlJmd0OwotJmx0O25zOnJldHVybiZndDsKLSZsdDthdXRob3ImZ3Q7Sm9obiBCbG9vbWVyJmx0Oy9hdXRob3ImZ3Q7Ci0mbHQ7aXNibiZndDswLTkzNzE3NS03Ny0zJmx0Oy9pc2JuJmd0OwotJmx0O3RpdGxlJmd0O1Bvd2VyIFByb2dyYW1taW5nIHdpdGggUlBDJmx0Oy90aXRsZSZndDsKLSZsdDsvbnM6cmV0dXJuJmd0OwotJmx0Oy9uczpsaXN0TGVuZEJvb2tSZXNwb25zZSZndDs8L3ByZT4KLQotPHA+VGhhdCdzIHRoZSBib29rIHlvdSBqdXN0IGxlbnQhPC9wPgotCi08cD5Ob3RlIDogTm93IGlmIHdlIHZpZXcgdGhlIGF2YWlsYWJsZSBib29rcywgeW91IHdpbGwgbm90IHNlZSB0aGUgYWJvdmUgYm9vawotaW4gdGhhdCBsaXN0LjwvcD4KLQotPHA+PHN0cm9uZz5TdGVwIDg8L3N0cm9uZz4gOiBOb3cgbGV0J3MgcmV0dXJuIHRoZSBib29rLjwvcD4KLQotPHA+aHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL0xpYnJhcnkvcmV0dXJuQm9vaz9pc2JuPQotMC05MzcxNzUtNzctMzwvcD4KLQotPHA+PHN0cm9uZz5TdGVwIDk8L3N0cm9uZz4gOiBOb3cgbGV0J3MgbG9vayBhdCB0aGUgbGVudCBib29rIGxpc3QgYWdhaW4sIGFuZAoteW91IHdpbGwgcmVhbGl6ZSB0aGF0IGxpc3QgaXMgZW1wdHkuPC9wPgotCi08cD48c3Ryb25nPlN0ZXAgMTA8L3N0cm9uZz4gOiBMZW5kIGZldyBtb3JlIGJvb2sgYW5kIHJlLXN0YXJ0IHRoZSBhcHAgc2VydmVyCi0oc2F5IFRvbWNhdCksIGFuZCBzZWUgd2hldGhlciBhbGwgdGhlIHByZXZpb3VzIGRhdGEgaXMgdGhlcmUgaW4gdGhlIG5ldwotaW5zdGFuY2UuPC9wPgotCi08aDM+UnVubmluZyB0aGUgSmF2YSBDbGllbnQ8L2gzPgotCi08cD5PcGVuIHVwIHRoZSBMaWJyYXJ5U2VydmljZUNsaWVudCBqYXZhIGNsYXNzIGluIHlvdXIgZmF2b3JpdGUgSURFIGFuZCBydW4KLXRoZSBtYWluIGNsYXNzLiBBbmQgeW91IGNhbiBjb21tZW50IG91dCB0aGUgbWV0aG9kcyB5b3UgZG8gbm90IHdpc2ggdG8gaW52b2tlCi13aGlsZSB1bi1jb21tZW50aW5nIHRoZSBtZXRob2QocykgeW91IHdhbnQgdG8gaW52b2tlLjwvcD4KLQotPHA+SmF2YSBjbGllbnQgYWxzbyBjYW4gYmUgcnVuIHVzaW5nIDxhCi1ocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+LiBZb3UgY2FuIGV4ZWN1dGUgdGhlIGNsaWVudCBhbmQgaW52b2tlCi1zZXJ2aWNlIHR5cGluZyA8Y29kZT5hbnQgcnVuLmNsaWVudDwvY29kZT4gY29tbWFuZCBpbiB0aGUKLUF4aXMyX0hPTUUvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlPC9wPgotCi08cD5BbmQgdGhlbiBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBhcyBtZW50aW9uZWQgaW4gdGhlIGNvbnNvbGUuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkMmNmNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iTGlicmFyeSIKLSAgICAgICAgIGNsYXNzPSJzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5MaWJyYXJ5TGlmZUN5Y2xlIiBzY29wZT0iYXBwbGljYXRpb24iPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBzYW1wbGUgc2VydmljZSAyCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8bWVzc2FnZVJlY2VpdmVycz4KLSAgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9pbi1vbmx5IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDSW5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9tZXNzYWdlUmVjZWl2ZXJzPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZUNsYXNzIj4KLSAgICAgICAgc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGUuTGlicmFyeVNlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImFsbEJvb2tzIj4KLSAgICAgICAgPGFsbEJvb2tzPgotICAgICAgICAgICAgPGJvb2s+Ci0gICAgICAgICAgICAgICAgPGF1dGhvcj5Kb2huIEJsb29tZXI8L2F1dGhvcj4KLSAgICAgICAgICAgICAgICA8aXNibj4wLTkzNzE3NS03Ny0zPC9pc2JuPgotICAgICAgICAgICAgICAgIDx0aXRsZT5Qb3dlciBQcm9ncmFtbWluZyB3aXRoIFJQQzwvdGl0bGU+Ci0gICAgICAgICAgICA8L2Jvb2s+Ci0gICAgICAgICAgICA8Ym9vaz4KLSAgICAgICAgICAgICAgICA8YXV0aG9yPlN0ZXBoZW4gU3BhaW5ob3VyIGFuZCBWYWxlcmllIFF1ZXJjaWE8L2F1dGhvcj4KLSAgICAgICAgICAgICAgICA8aXNibj4xLTU2NTkyLTIyOS04PC9pc2JuPgotICAgICAgICAgICAgICAgIDx0aXRsZT5XRUJNQVNURVIgSU4gQSBOVVRTSEVMTDwvdGl0bGU+Ci0gICAgICAgICAgICA8L2Jvb2s+Ci0gICAgICAgICAgICA8Ym9vaz4KLSAgICAgICAgICAgICAgICA8YXV0aG9yPkRhdmlkIEZsYW5hZ2FuPC9hdXRob3I+Ci0gICAgICAgICAgICAgICAgPGlzYm4+MS01NjU5Mi0zNzEtNTwvaXNibj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+SmF2YSBFeGFtcGxlczwvdGl0bGU+Ci0gICAgICAgICAgICA8L2Jvb2s+Ci0gICAgICAgICAgICA8Ym9vaz4KLSAgICAgICAgICAgICAgICA8YXV0aG9yPk1hcmsgTHV0eiBhbmQgRGF2aWQgQXNjaGVyPC9hdXRob3I+Ci0gICAgICAgICAgICAgICAgPGlzYm4+MS01NjU5Mi00NjQtODwvaXNibj4KLSAgICAgICAgICAgICAgICA8dGl0bGU+TGVhcm5pbmcgUHl0aG9uPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgICAgIDxib29rPgotICAgICAgICAgICAgICAgIDxhdXRob3I+QS4gS2V5dG9uIFdlaXNzaW5nZXI8L2F1dGhvcj4KLSAgICAgICAgICAgICAgICA8aXNibj4xLTU2NTkyLTQ5MC04PC9pc2JuPgotICAgICAgICAgICAgICAgIDx0aXRsZT5BU1AgSW4gYSBudXRzaGVsbDwvdGl0bGU+Ci0gICAgICAgICAgICA8L2Jvb2s+Ci0gICAgICAgICAgICA8Ym9vaz4KLSAgICAgICAgICAgICAgICA8YXV0aG9yPkNsaW50b24gV29uZzwvYXV0aG9yPgotICAgICAgICAgICAgICAgIDxpc2JuPjEtNTY1OTItMjE0LVg8L2lzYm4+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPldlYiBDbGllbnQgUHJvZ3JhbW1pbmcgd2l0aCBQZXJsPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgICAgIDxib29rPgotICAgICAgICAgICAgICAgIDxhdXRob3I+RG9uIEJveCAsIEFhcm9uIFNrb25uYXJkIGFuZCBKb2huIExhbTwvYXV0aG9yPgotICAgICAgICAgICAgICAgIDxpc2JuPjAtMjAxLTcwOTE0LTc8L2lzYm4+Ci0gICAgICAgICAgICAgICAgPHRpdGxlPkVzc2VudGlhbCBYTUwgLCBCZXlvbmQgTWFya3VwPC90aXRsZT4KLSAgICAgICAgICAgIDwvYm9vaz4KLSAgICAgICAgPC9hbGxCb29rcz4KLSAgICA8L3BhcmFtZXRlcj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL2NsaWVudC9MaWJyYXJ5U2VydmljZUNsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9jbGllbnQvTGlicmFyeVNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhYjY2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL2NsaWVudC9MaWJyYXJ5U2VydmljZUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNsaWVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGF0YWJpbmRpbmcudXRpbHMuQmVhblV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGVmYXVsdE9iamVjdFN1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucnBjLmNsaWVudC5SUENTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uQm9vazsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlQ2xpZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9OQU1FID0gIi11c2VyTmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NfV09SRCA9ICItcGFzc1dvcmQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU0JOID0gIi1pc2JuIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaWJyYXJ5U2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgTGlicmFyeVNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgY2xpZW50LnJ1bkNsaWVudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3dPcHRpb25zKCkgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09V2VsY29tZSB0byBMaWJyYXJheSBjbGllbnQ9PT09PT0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIGxpc3QgQWxsIGJvb2tzIHR5cGUgMSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBUbyBsaXN0IEF2YWlsYWJsZSBib29rcyB0eXBlIDIiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgVG8gbGlzdCBMZW5kIGJvb2tzIHR5cGUgMyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBUbyByZWdpc3RlciAgNCAgLSAtdXNlck5hbWUgLXBhc3NXb3JkIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIGxvZ2luICAgICA1IC0gLXVzZXJOYW1lIC1wYXNzV29yZCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiBUbyBsZW5kIGEgYm9vayA2IC0gLWlzYm4gLXVzZXJOYW1lICAgIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIHJldHVybiBhIGJvb2sgNyAtIC1pc2JuIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIFRvIGV4aXQgdHlwZSAtMSAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Ci0gICAgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHJ1bkNsaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyIHNlcnZpY2UgZXByIGFkZHJlc3MgOiAgICAgICAgICAiKTsKLSAgICAgICAgU3RyaW5nIGVwciA9IGdldElucHV0KCk7Ci0gICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgcnBjQ2xpZW50ID0gbmV3IFJQQ1NlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgT3B0aW9ucyBvcHRzID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0cy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoZXByKSk7Ci0gICAgICAgIHJwY0NsaWVudC5zZXRPcHRpb25zKG9wdHMpOwotICAgICAgICBMaWJyYXJ5U2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgTGlicmFyeVNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgCXNob3dPcHRpb25zKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGUgeW91ciBjb21tYW5kIGhlcmUgOiAiKTsKLSAgICAgICAgICAgIFN0cmluZyBjb21tYW5kc1Bhcm1zID0gZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChjb21tYW5kc1Bhcm1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0gY29tbWFuZHNQYXJtcy5zcGxpdCgiICIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaXJzdGFyZyA9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgICAgaW50IGNvbW1hbmQ7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAJY29tbWFuZCA9IEludGVnZXIucGFyc2VJbnQoZmlyc3RhcmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAJU3lzdGVtLm91dC5wcmludGxuKCJJbGxlZ2FsIGFyZ3VtZW50IGVudGVyZWQuXG4iKTsKLSAgICAgICAgICAgICAgICAJY29udGludWU7Ci0JCQkJfQotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubGlzdEFsbEJvb2socnBjQ2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5saXN0QXZhaWxhYmxlQm9vayhycGNDbGllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAzIDogewotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Lmxpc3RMZW5kQm9vayhycGNDbGllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSA0IDogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzcmVOYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzV29yZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gZW5vdWdoIG51bWJlciBvZiBhcmd1bWVudHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVU0VSX05BTUUuZXF1YWxzKGFyZ3NbMV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyZU5hbWUgPSBhcmdzWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVU0VSX05BTUUuZXF1YWxzKGFyZ3NbM10pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNyZU5hbWUgPSBhcmdzWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUEFTU19XT1JELmVxdWFscyhhcmdzWzFdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NXb3JkID0gYXJnc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUEFTU19XT1JELmVxdWFscyhhcmdzWzNdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NXb3JkID0gYXJnc1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5yZWdpc3Rlcih1c3JlTmFtZSwgcGFzc1dvcmQsIHJwY0NsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIDUgOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNyZU5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3NXb3JkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBlbm91Z2ggbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFVTRVJfTkFNRS5lcXVhbHMoYXJnc1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JlTmFtZSA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFVTRVJfTkFNRS5lcXVhbHMoYXJnc1szXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3JlTmFtZSA9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQQVNTX1dPUkQuZXF1YWxzKGFyZ3NbMV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1dvcmQgPSBhcmdzWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQQVNTX1dPUkQuZXF1YWxzKGFyZ3NbM10pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc1dvcmQgPSBhcmdzWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmxvZ2luKHVzcmVOYW1lLCBwYXNzV29yZCwgcnBjQ2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNiA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpc2JuID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1c2VyTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCA1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gZW5vdWdoIG51bWJlciBvZiBhcmd1bWVudHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVU0VSX05BTUUuZXF1YWxzKGFyZ3NbMV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUgPSBhcmdzWzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVU0VSX05BTUUuZXF1YWxzKGFyZ3NbM10pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUgPSBhcmdzWzRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNCTi5lcXVhbHMoYXJnc1sxXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2JuID0gYXJnc1syXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNCTi5lcXVhbHMoYXJnc1szXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2JuID0gYXJnc1s0XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5sZW5kQm9vayhpc2JuLCB1c2VyTmFtZSwgcnBjQ2xpZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgNyA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpc2JuID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBlbm91Z2ggbnVtYmVyIG9mIGFyZ3VtZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTQk4uZXF1YWxzKGFyZ3NbMV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNibiA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQucmV0dXJuQm9vayhpc2JuLCBycGNDbGllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAtMSA6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgICAgICAgICAgCVN5c3RlbS5vdXQucHJpbnRsbigiV3JvbmcgYXJndW1lbnQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIFN5c3RlbS5pbi5yZWFkKCkKLSAgICB9Ci0KLSAgICAvLwotCi0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbnB1dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGUgYiBbXSA9IG5ldyBieXRlIFsyNTZdOwotICAgICAgICAgICAgaW50IGkgPSBTeXN0ZW0uaW4ucmVhZChiKTsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiIjsKLSAgICAgICAgICAgIGlmIChpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gbmV3IFN0cmluZyhiKS5zdWJzdHJpbmcoMCwgaSAtIDEpLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtc2c7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgaW4gY29tbWFuZCA6ICIgKyBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCByZXR1cm5Cb29rKFN0cmluZyBpc2JuLCBSUENTZXJ2aWNlQ2xpZW50IHJwY0NsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJwY0NsaWVudC5nZXRPcHRpb25zKCkuc2V0QWN0aW9uKCJ1cm46cmV0dXJuQm9vayIpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoaXNibik7Ci0gICAgICAgIHJwY0NsaWVudC5pbnZva2VSb2J1c3QobmV3IFFOYW1lKCJodHRwOi8vc2VydmljZWxpZmVjeWNsZS5zYW1wbGUiLAotICAgICAgICAgICAgICAgICJyZXR1cm5Cb29rIiksIGFyZ3MudG9BcnJheSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsZW5kQm9vayhTdHJpbmcgaXNibiwgU3RyaW5nIHVzZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgcnBjQ2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnBjQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oInVybjpsZW5kQm9vayIpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQoaXNibik7Ci0gICAgICAgIGFyZ3MuYWRkKHVzZXJOYW1lKTsKLSAgICAgICAgT2JqZWN0IG9iaiBbXSA9IHJwY0NsaWVudC5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgImxlbmRCb29rIiksIGFyZ3MudG9BcnJheSgpLCBuZXcgQ2xhc3NbXXtCb29rLmNsYXNzfSk7Ci0gICAgICAgIEJvb2sgYm9vayA9IChCb29rKSBvYmpbMF07Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGl0bGUgOiAiICsgYm9vay5nZXRUaXRsZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJc2JuIDogIiArIGJvb2suZ2V0SXNibigpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdXRob3IgOiAiICsgYm9vay5nZXRBdXRob3IoKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihTdHJpbmcgdXNlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3NXb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ1NlcnZpY2VDbGllbnQgcnBjQ2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnBjQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oInVybjpyZWdpc3RlciIpOwotICAgICAgICBBcnJheUxpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgYXJncy5hZGQodXNlck5hbWUpOwotICAgICAgICBhcmdzLmFkZChwYXNzV29yZCk7Ci0gICAgICAgIE9iamVjdCBvYmogW10gPSBycGNDbGllbnQuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vc2VydmljZWxpZmVjeWNsZS5zYW1wbGUiLAotICAgICAgICAgICAgICAgICJyZWdpc3RlciIpLCBhcmdzLnRvQXJyYXkoKSwgbmV3IENsYXNzW117Qm9vbGVhbi5jbGFzc30pOwotICAgICAgICByZXR1cm4gKChCb29sZWFuKSBvYmpbMF0pLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxvZ2luKFN0cmluZyB1c2VyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc1dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBycGNDbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigidXJuOmxvZ2luIik7Ci0gICAgICAgIEFycmF5TGlzdCBhcmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBhcmdzLmFkZCh1c2VyTmFtZSk7Ci0gICAgICAgIGFyZ3MuYWRkKHBhc3NXb3JkKTsKLSAgICAgICAgT2JqZWN0IG9iaiBbXSA9IHJwY0NsaWVudC5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgImxvZ2luIiksIGFyZ3MudG9BcnJheSgpLCBuZXcgQ2xhc3NbXXtCb29sZWFuLmNsYXNzfSk7Ci0gICAgICAgIHJldHVybiAoKEJvb2xlYW4pIG9ialswXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlzdEF2YWlsYWJsZUJvb2soUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBycGNDbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigidXJuOmxpc3RBdmFpbGFibGVCb29rIik7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtbnQgPSBycGNDbGllbnQuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vc2VydmljZWxpZmVjeWNsZS5zYW1wbGUiLAotICAgICAgICAgICAgICAgICJsaXN0QXZhaWxhYmxlQm9vayIpLCBuZXcgT2JqZWN0W117bnVsbH0pOwotICAgICAgICBwcmludEJvb2tEYXRhKGVsZW1udCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50Qm9va0RhdGEoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB2YWx1ZXMgPSBlbGVtZW50LmdldENoaWxkcmVuV2l0aE5hbWUobmV3IFFOYW1lKCJodHRwOi8vc2VydmljZWxpZmVjeWNsZS5zYW1wbGUiLCAicmV0dXJuIikpOwotICAgICAgICAgICAgd2hpbGUgKHZhbHVlcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgdmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBCb29rIGJvb2sgPSAoQm9vaykgQmVhblV0aWwuZGVzZXJpYWxpemUoQm9vay5jbGFzcywgb21FbGVtZW50LCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksICJib29rIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJc2JuIDogIiArIGJvb2suZ2V0SXNibigpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhvciA6ICIgKyBib29rLmdldEF1dGhvcigpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpdGxlIDogIiArIGJvb2suZ2V0VGl0bGUoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlzdEFsbEJvb2soUlBDU2VydmljZUNsaWVudCBycGNDbGllbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBycGNDbGllbnQuZ2V0T3B0aW9ucygpLnNldEFjdGlvbigidXJuOmxpc3RBbGxCb29rIik7Ci0gICAgICAgIE9NRWxlbWVudCBlbGVtbnQgPSBycGNDbGllbnQuaW52b2tlQmxvY2tpbmcobmV3IFFOYW1lKCJodHRwOi8vc2VydmljZWxpZmVjeWNsZS5zYW1wbGUiLAotICAgICAgICAgICAgICAgICJsaXN0QWxsQm9vayIpLCBuZXcgT2JqZWN0W117bnVsbH0pOwotICAgICAgICBwcmludEJvb2tEYXRhKGVsZW1udCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlzdExlbmRCb29rKFJQQ1NlcnZpY2VDbGllbnQgcnBjQ2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnBjQ2xpZW50LmdldE9wdGlvbnMoKS5zZXRBY3Rpb24oInVybjpsaXN0TGVuZEJvb2siKTsKLSAgICAgICAgT01FbGVtZW50IGVsZW1udCA9IHJwY0NsaWVudC5pbnZva2VCbG9ja2luZyhuZXcgUU5hbWUoImh0dHA6Ly9zZXJ2aWNlbGlmZWN5Y2xlLnNhbXBsZSIsCi0gICAgICAgICAgICAgICAgImxpc3RMZW5kQm9vayIpLCBuZXcgT2JqZWN0W117bnVsbH0pOwotICAgICAgICBwcmludEJvb2tEYXRhKGVsZW1udCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL0xpYnJhcnlDb25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvTGlicmFyeUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2ExMDc4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvTGlicmFyeUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeUNvbnN0YW50cyB7Ci0gICAgU3RyaW5nIEFWQUlMQUJMRV9CT09LID0gImF2YWlsYWJsZUJvb2tzIjsKLSAgICBTdHJpbmcgQUxMX0JPT0sgPSAiYWxsQm9va3MiOwotICAgIFN0cmluZyBMRU5EX0JPT0sgPSAibGVuZEJvb2tzIjsKLSAgICBTdHJpbmcgVVNFUl9MSVNUID0gInVzZXJzIjsKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvTGlicmFyeUxpZmVDeWNsZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9MaWJyYXJ5TGlmZUN5Y2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjc5NGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9MaWJyYXJ5TGlmZUN5Y2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugc2FtcGxlLnNlcnZpY2VsaWZlY3ljbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5idWlsZGVyLlN0QVhPTUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS51dGlsLlN0QVhVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kYXRhYmluZGluZy51dGlscy5CZWFuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlZmF1bHRPYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5TZXJ2aWNlTGlmZUN5Y2xlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uQm9vazsKLWltcG9ydCBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuLkJvb2tMaXN0OwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uVXNlcjsKLWltcG9ydCBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuLlVzZXJMaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeUxpZmVDeWNsZSBpbXBsZW1lbnRzIFNlcnZpY2VMaWZlQ3ljbGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMaWJyYXJ5TGlmZUN5Y2xlLmNsYXNzKTsKLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0VXAoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0gICAgICAgICAgICBGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUodGVtcERpcik7Ci0gICAgICAgICAgICBGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZSh0ZW1wRmlsZSwgImxpYnJhcnkueG1sIik7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgbGlicmFyeUVsZW1lbnQ7Ci0gICAgICAgICAgICBib29sZWFuIG5vRmlsZSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoIWxpYkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAvL1NlcnZpY2Ugc3RhcnRpbmcgYXQgdGhlIGZpcnN0IHRpbWUgb3IgdXNlciBoYXMgY2xlYW4gdGhlIHRlbXAuZGlyCi0gICAgICAgICAgICAgICAgUGFyYW1ldGVyIGFsbEJvb2tzID0gc2VydmljZS5nZXRQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5BTExfQk9PSyk7Ci0gICAgICAgICAgICAgICAgbGlicmFyeUVsZW1lbnQgPSBhbGxCb29rcy5nZXRQYXJhbWV0ZXJFbGVtZW50KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsaWJGaWxlKTsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gU3RBWFV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGluKTsKLSAgICAgICAgICAgICAgICBTdEFYT01CdWlsZGVyIHN0YXhPTUJ1aWxkZXIgPSBuZXcgU3RBWE9NQnVpbGRlcih4bWxSZWFkZXIpOwotICAgICAgICAgICAgICAgIGxpYnJhcnlFbGVtZW50ID0gc3RheE9NQnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBub0ZpbGUgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2Nlc3NPbWVsZW1udChsaWJyYXJ5RWxlbWVudCwgc2VydmljZSwgbm9GaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgbG9nLmluZm8oZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNodXREb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCb29rTGlzdCBhdmFpbGFibGVCb29rTGlzdCA9IChCb29rTGlzdCkgc2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShMaWJyYXJ5Q29uc3RhbnRzLkFWQUlMQUJMRV9CT09LKTsKLSAgICAgICAgICAgIEJvb2tMaXN0IGFsbEJvb2tMaXN0ID0gKEJvb2tMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuQUxMX0JPT0spOwotICAgICAgICAgICAgQm9va0xpc3QgbGVuZEJvb2tMaXN0ID0gKEJvb2tMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuTEVORF9CT09LKTsKLSAgICAgICAgICAgIFVzZXJMaXN0IHVzZXJMaXN0ID0gKFVzZXJMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuVVNFUl9MSVNUKTsKLSAgICAgICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBsaWJFbGVtZW50ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgibGlicmFyeSIsIG51bGwpOwotICAgICAgICAgICAgQm9va1tdIGJvb2tMaXN0ID0gYWxsQm9va0xpc3QuZ2V0Qm9va0xpc3QoKTsKLSAgICAgICAgICAgIGxpYkVsZW1lbnQuYWRkQ2hpbGQoQmVhblV0aWwuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoTGlicmFyeUNvbnN0YW50cy5BTExfQk9PSyksCi0gICAgICAgICAgICAgICAgICAgIGJvb2tMaXN0LCBuZXcgUU5hbWUoImJvb2siKSwgZmFsc2UsIG51bGwpKTsKLSAgICAgICAgICAgIGxpYkVsZW1lbnQuYWRkQ2hpbGQoQmVhblV0aWwuZ2V0T01FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBuZXcgUU5hbWUoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSyksCi0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUJvb2tMaXN0LmdldEJvb2tMaXN0KCksIG5ldyBRTmFtZSgiYm9vayIpLCBmYWxzZSwgbnVsbCkpOwotICAgICAgICAgICAgbGliRWxlbWVudC5hZGRDaGlsZChCZWFuVXRpbC5nZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLkxFTkRfQk9PSyksCi0gICAgICAgICAgICAgICAgICAgIGxlbmRCb29rTGlzdC5nZXRCb29rTGlzdCgpLCBuZXcgUU5hbWUoImJvb2siKSwgZmFsc2UsIG51bGwpKTsKLQotICAgICAgICAgICAgbGliRWxlbWVudC5hZGRDaGlsZChCZWFuVXRpbC5nZXRPTUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLlVTRVJfTElTVCksCi0gICAgICAgICAgICAgICAgICAgIHVzZXJMaXN0LmdldFVzZXJzKCksIG5ldyBRTmFtZSgidXNlciIpLCBmYWxzZSwgbnVsbCkpOwotCi0gICAgICAgICAgICBTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLSAgICAgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyKTsKLSAgICAgICAgICAgIEZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLCAibGlicmFyeS54bWwiKTsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsaWJGaWxlKTsKLSAgICAgICAgICAgIGxpYkVsZW1lbnQuc2VyaWFsaXplKG91dCk7Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc09tZWxlbW50KE9NRWxlbWVudCBlbGVtZW50LCBBeGlzU2VydmljZSBzZXJ2aWNlLCBib29sZWFuIGZpbGVGb3VuZCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEJvb2tMaXN0IGFsbEJvb2tMaXN0ID0gbmV3IEJvb2tMaXN0KExpYnJhcnlDb25zdGFudHMuQUxMX0JPT0spOwotICAgICAgICBPTUVsZW1lbnQgYm9va0VsZSA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLkFMTF9CT09LKSk7Ci0gICAgICAgIEl0ZXJhdG9yIGJvb2tfaXRyID0gYm9va0VsZS5nZXRDaGlsZHJlbigpOwotICAgICAgICB3aGlsZSAoYm9va19pdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gYm9va19pdHIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZW1lbnQgPSAoT01FbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgICAgYWxsQm9va0xpc3QuYWRkQm9vaygoQm9vaykgQmVhblV0aWwuZGVzZXJpYWxpemUoQm9vay5jbGFzcywgb21FbGVtZW50LCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksICJib29rIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQm9va0xpc3QgYXZhaWxhYmxlQm9va0xpc3QgPSBuZXcgQm9va0xpc3QoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSyk7Ci0gICAgICAgIE9NRWxlbWVudCBhdmFsaWFibGVCb29rc0VsZSA9Ci0gICAgICAgICAgICAgICAgZWxlbWVudC5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKExpYnJhcnlDb25zdGFudHMuQVZBSUxBQkxFX0JPT0spKTsKLSAgICAgICAgaWYgKGF2YWxpYWJsZUJvb2tzRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGF2YWlsYWJsZV9ib29rX2l0ciA9IGF2YWxpYWJsZUJvb2tzRWxlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAoYXZhaWxhYmxlX2Jvb2tfaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBhdmFpbGFibGVfYm9va19pdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBPTUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IChPTUVsZW1lbnQpIG9iajsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlQm9va0xpc3QuYWRkQm9vaygoQm9vaykgQmVhblV0aWwuZGVzZXJpYWxpemUoQm9vay5jbGFzcywgb21FbGVtZW50LCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksICJib29rIikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBCb29rTGlzdCBsZW5kQm9va0xpc3QgPSBuZXcgQm9va0xpc3QoTGlicmFyeUNvbnN0YW50cy5MRU5EX0JPT0spOwotICAgICAgICBPTUVsZW1lbnQgbGVuZEJvb2tzRWxlID0KLSAgICAgICAgICAgICAgICBlbGVtZW50LmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoTGlicmFyeUNvbnN0YW50cy5MRU5EX0JPT0spKTsKLSAgICAgICAgaWYgKGxlbmRCb29rc0VsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBsZW5kX2Jvb2tfaXRyID0gbGVuZEJvb2tzRWxlLmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICB3aGlsZSAobGVuZF9ib29rX2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gbGVuZF9ib29rX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgICAgICAgICBsZW5kQm9va0xpc3QuYWRkQm9vaygoQm9vaykgQmVhblV0aWwuZGVzZXJpYWxpemUoQm9vay5jbGFzcywgb21FbGVtZW50LCBuZXcgRGVmYXVsdE9iamVjdFN1cHBsaWVyKCksICJib29rIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBVc2VyTGlzdCB1c2VycyA9IG5ldyBVc2VyTGlzdCgpOwotICAgICAgICBPTUVsZW1lbnQgdXNlcnNFbGUgPQotICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShMaWJyYXJ5Q29uc3RhbnRzLlVTRVJfTElTVCkpOwotICAgICAgICBpZiAodXNlcnNFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgdXNyZV9pdHIgPSB1c2Vyc0VsZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgd2hpbGUgKHVzcmVfaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSB1c3JlX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE9NRWxlbWVudCkgewotICAgICAgICAgICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gKE9NRWxlbWVudCkgb2JqOwotICAgICAgICAgICAgICAgICAgICB1c2Vycy5hZGRVc2VyKChVc2VyKSBCZWFuVXRpbC5kZXNlcmlhbGl6ZShVc2VyLmNsYXNzLCBvbUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRPYmplY3RTdXBwbGllcigpLCAidXNlciIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZUZvdW5kKSB7Ci0gICAgICAgICAgICBhdmFpbGFibGVCb29rTGlzdCA9IGFsbEJvb2tMaXN0LmNvcHkoKTsKLSAgICAgICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSywgYXZhaWxhYmxlQm9va0xpc3QpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5BVkFJTEFCTEVfQk9PSywgYXZhaWxhYmxlQm9va0xpc3QpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLkFMTF9CT09LLCBhbGxCb29rTGlzdCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKExpYnJhcnlDb25zdGFudHMuTEVORF9CT09LLCBsZW5kQm9va0xpc3QpKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLlVTRVJfTElTVCwgdXNlcnMpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL0xpYnJhcnlTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL0xpYnJhcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGM2Y2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9MaWJyYXJ5U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLWltcG9ydCBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5MaWJyYXJ5Q29uc3RhbnRzOwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uQm9vazsKLWltcG9ydCBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuLkJvb2tMaXN0OwotaW1wb3J0IHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW4uVXNlcjsKLWltcG9ydCBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuLlVzZXJMaXN0OwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2UgewotCi0gICAgLy9UbyBzdG9yZSBhbGwgdGhlIGF2YWlsYWJsZSBib29rcwotICAgIHByaXZhdGUgQm9va0xpc3QgYXZhaWxhYmxlQm9va0xpc3Q7Ci0gICAgLy90byBrZWVwIGFsbCB0aGUgYm9vayBpbiB0aGUgc3lzdGVtCi0gICAgcHJpdmF0ZSBCb29rTGlzdCBhbGxCb29rTGlzdDsKLSAgICAvL3RvIGtlZXAgYWxsIHRoZSBsZW5kZWQgYm9va3MKLSAgICBwcml2YXRlIEJvb2tMaXN0IGxlbmRCb29rTGlzdDsKLSAgICAvL3RvIGtlZXAgdGhlIHN5c3RlbSB1c2VycwotICAgIHByaXZhdGUgVXNlckxpc3QgdXNlckxpc3Q7Ci0KLQotICAgIHB1YmxpYyBCb29rW10gbGlzdEF2YWlsYWJsZUJvb2soKSB7Ci0gICAgICAgIHJldHVybiBhdmFpbGFibGVCb29rTGlzdC5nZXRCb29rTGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rW10gbGlzdEFsbEJvb2soKSB7Ci0gICAgICAgIHJldHVybiBhbGxCb29rTGlzdC5nZXRCb29rTGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rW10gbGlzdExlbmRCb29rKCkgewotICAgICAgICByZXR1cm4gbGVuZEJvb2tMaXN0LmdldEJvb2tMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2sgbGVuZEJvb2soU3RyaW5nIGlzYm4sIFN0cmluZyB1c2VyTmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmIChpc0xvZ2dlZCh1c2VyTmFtZSkpIHsKLSAgICAgICAgICAgIEJvb2sgYm9vayA9IGF2YWlsYWJsZUJvb2tMaXN0LmdldEJvb2soaXNibik7Ci0gICAgICAgICAgICBpZiAoYm9vayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vayA9IGxlbmRCb29rTGlzdC5nZXRCb29rKGlzYm4pOwotICAgICAgICAgICAgICAgIGlmIChib29rICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiU29tZW9uZSBoYXMgYm9ycm93ZWQgdGhlIGJvb2siKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiQm9vayBpcyBub3QgYXZhaWxhYmxlIGZvciBsZW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdmFpbGFibGVCb29rTGlzdC5yZW1vdmVCb29rKGJvb2spOwotICAgICAgICAgICAgbGVuZEJvb2tMaXN0LmFkZEJvb2soYm9vayk7Ci0gICAgICAgICAgICByZXR1cm4gYm9vazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkZpcnN0IGxvZyBpbnRvIHN5c3RlbSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV0dXJuQm9vayhTdHJpbmcgaXNibikgewotICAgICAgICBCb29rIHRlbXBCb29rID0gYWxsQm9va0xpc3QuZ2V0Qm9vayhpc2JuKTsKLSAgICAgICAgYXZhaWxhYmxlQm9va0xpc3QuYWRkQm9vayh0ZW1wQm9vayk7Ci0gICAgICAgIGxlbmRCb29rTGlzdC5yZW1vdmVCb29rKHRlbXBCb29rKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2dnZWQoU3RyaW5nIHVzZXJOYW1lKSB7Ci0gICAgICAgIHJldHVybiB1c2VyTGlzdC5pc0xvZ2dlZCh1c2VyTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoU3RyaW5nIHVzZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzV29yZCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHVzZXJMaXN0LmFkZFVzZXIobmV3IFVzZXIodXNlck5hbWUsIHBhc3NXb3JkKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxvZ2luKFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIHBhc3NXb3JkKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgcmV0dXJuIHVzZXJMaXN0LmxvZ2luKHVzZXJOYW1lLCBwYXNzV29yZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiByZWxhdGVkIG1ldGhvZHMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0KSB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICB0aGlzLmF2YWlsYWJsZUJvb2tMaXN0ID0gKEJvb2tMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuQVZBSUxBQkxFX0JPT0spOwotICAgICAgICB0aGlzLmF2YWlsYWJsZUJvb2tMaXN0LnNldExpc3ROYW1lKExpYnJhcnlDb25zdGFudHMuQVZBSUxBQkxFX0JPT0spOwotICAgICAgICB0aGlzLmFsbEJvb2tMaXN0ID0gKEJvb2tMaXN0KSBzZXJ2aWNlLmdldFBhcmFtZXRlclZhbHVlKExpYnJhcnlDb25zdGFudHMuQUxMX0JPT0spOwotICAgICAgICB0aGlzLmxlbmRCb29rTGlzdCA9IChCb29rTGlzdCkgc2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShMaWJyYXJ5Q29uc3RhbnRzLkxFTkRfQk9PSyk7Ci0gICAgICAgIHRoaXMudXNlckxpc3QgPSAoVXNlckxpc3QpIHNlcnZpY2UuZ2V0UGFyYW1ldGVyVmFsdWUoTGlicmFyeUNvbnN0YW50cy5VU0VSX0xJU1QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUNvbnRleHQuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihMaWJyYXJ5Q29uc3RhbnRzLkFWQUlMQUJMRV9CT09LLCBhdmFpbGFibGVCb29rTGlzdCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKExpYnJhcnlDb25zdGFudHMuQUxMX0JPT0ssIGFsbEJvb2tMaXN0KSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoTGlicmFyeUNvbnN0YW50cy5MRU5EX0JPT0ssIGxlbmRCb29rTGlzdCkpOwotICAgICAgICBzZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKExpYnJhcnlDb25zdGFudHMuVVNFUl9MSVNULCB1c2VyTGlzdCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvVXNlcnNTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL1VzZXJzU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQ5NWUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvVXNlcnNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc2VydmljZWxpZmVjeWNsZTsKLQotcHVibGljIGNsYXNzIFVzZXJzU2VydmljZSB7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL0Jvb2suamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvYmVhbi9Cb29rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOGZhNTguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL0Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zZXJ2aWNlbGlmZWN5Y2xlLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEJvb2sgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOwotICAgIHByaXZhdGUgU3RyaW5nIGlzYm47Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotICAgICAgICByZXR1cm4gdGl0bGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcigpIHsKLSAgICAgICAgcmV0dXJuIGF1dGhvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRob3IoU3RyaW5nIGF1dGhvcikgewotICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElzYm4oKSB7Ci0gICAgICAgIHJldHVybiBpc2JuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzYm4oU3RyaW5nIGlzYm4pIHsKLSAgICAgICAgdGhpcy5pc2JuID0gaXNibjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT01FbGVtZW50IHNlcmlhbGl6ZShPTUZhY3RvcnkgZmFjKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvYmVhbi9Cb29rTGlzdC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL0Jvb2tMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTNhODQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL0Jvb2tMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCb29rTGlzdCB7Ci0KLSAgICBwcml2YXRlIEhhc2hNYXAgYm9va1RhYmxlOwotICAgIHByaXZhdGUgU3RyaW5nIGxpc3ROYW1lOwotCi0gICAgcHVibGljIEJvb2tMaXN0KFN0cmluZyBsaXN0TmFtZSkgewotICAgICAgICB0aGlzLmJvb2tUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRCb29rKEJvb2sgYm9vaykgewotICAgICAgICBib29rVGFibGUucHV0KGJvb2suZ2V0SXNibigpLnRyaW0oKSwgYm9vayk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2sgZ2V0Qm9vayhTdHJpbmcgaXNibikgewotICAgICAgICByZXR1cm4gKEJvb2spIGJvb2tUYWJsZS5nZXQoaXNibi50cmltKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJvb2soQm9vayBib29rKSB7Ci0gICAgICAgIGJvb2tUYWJsZS5yZW1vdmUoYm9vay5nZXRJc2JuKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJvb2soU3RyaW5nIGlzYm4pIHsKLSAgICAgICAgYm9va1RhYmxlLnJlbW92ZShpc2JuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGFzaE1hcCBnZXRCb29rVGFibGUoKSB7Ci0gICAgICAgIHJldHVybiBib29rVGFibGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Qm9va1RhYmxlKEhhc2hNYXAgYm9va1RhYmxlKSB7Ci0gICAgICAgIHRoaXMuYm9va1RhYmxlID0gYm9va1RhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlzdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMaXN0TmFtZShTdHJpbmcgbGlzdE5hbWUpIHsKLSAgICAgICAgdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgc2VyaWFsaXplKE9NRmFjdG9yeSBmYWMpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2tbXSBnZXRCb29rTGlzdCgpIHsKLSAgICAgICAgQm9vayBbXSBib29rcyA9IG5ldyBCb29rW2Jvb2tUYWJsZS5zaXplKCldOwotICAgICAgICBJdGVyYXRvciBib29rc19pdHIgPSBib29rVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGJvb2tzX2l0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGJvb2tzW2NvdW50XSA9IChCb29rKSBib29rc19pdHIubmV4dCgpOwotICAgICAgICAgICAgY291bnQgKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvb2tzOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29rTGlzdCBjb3B5KCkgewotICAgICAgICBCb29rTGlzdCBib29rcyA9IG5ldyBCb29rTGlzdChnZXRMaXN0TmFtZSgpKTsKLSAgICAgICAgQm9vayBbXSBhbGxCb29rcyA9IGdldEJvb2tMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsQm9va3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEJvb2sgYWxsQm9vayA9IGFsbEJvb2tzW2ldOwotICAgICAgICAgICAgQm9vayBib29rID0gbmV3IEJvb2soKTsKLSAgICAgICAgICAgIGJvb2suc2V0QXV0aG9yKGFsbEJvb2suZ2V0QXV0aG9yKCkpOwotICAgICAgICAgICAgYm9vay5zZXRJc2JuKGFsbEJvb2suZ2V0SXNibigpKTsKLSAgICAgICAgICAgIGJvb2suc2V0VGl0bGUoYWxsQm9vay5nZXRUaXRsZSgpKTsKLSAgICAgICAgICAgIGJvb2tzLmFkZEJvb2soYm9vayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJvb2tzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvYmVhbi9Vc2VyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NlcnZpY2VsaWZlY3ljbGUvc3JjL3NhbXBsZS9zZXJ2aWNlbGlmZWN5Y2xlL2JlYW4vVXNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJlZWZhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvYmVhbi9Vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuOwotCi1wdWJsaWMgY2xhc3MgVXNlciB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlck5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFzc1dvcmQ7Ci0KLSAgICBwdWJsaWMgVXNlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVXNlcihTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBwYXNzV29yZCkgewotICAgICAgICB0aGlzLnVzZXJOYW1lID0gdXNlck5hbWU7Ci0gICAgICAgIHRoaXMucGFzc1dvcmQgPSBwYXNzV29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3NXb3JkKCkgewotICAgICAgICByZXR1cm4gcGFzc1dvcmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFzc1dvcmQoU3RyaW5nIHBhc3NXb3JkKSB7Ci0gICAgICAgIHRoaXMucGFzc1dvcmQgPSBwYXNzV29yZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gdXNlck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlck5hbWUoU3RyaW5nIHVzZXJOYW1lKSB7Ci0gICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc2VydmljZWxpZmVjeWNsZS9zcmMvc2FtcGxlL3NlcnZpY2VsaWZlY3ljbGUvYmVhbi9Vc2VyTGlzdC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL1VzZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWIyYzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy9zZXJ2aWNlbGlmZWN5Y2xlL3NyYy9zYW1wbGUvc2VydmljZWxpZmVjeWNsZS9iZWFuL1VzZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBzYW1wbGUuc2VydmljZWxpZmVjeWNsZS5iZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBVc2VyTGlzdCB7Ci0gICAgcHJpdmF0ZSBIYXNoTWFwIHVzZXJMaXN0OwotICAgIHByaXZhdGUgSGFzaE1hcCBsb2dnZWRVc2VyczsKLQotICAgIHB1YmxpYyBVc2VyTGlzdCgpIHsKLSAgICAgICAgdGhpcy51c2VyTGlzdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGxvZ2dlZFVzZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRVc2VyKFVzZXIgdXNlcikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIGlmICh1c2VyTGlzdC5nZXQodXNlci5nZXRVc2VyTmFtZSgpLnRyaW0oKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVXNlciBoYXMgYWxyZWFkeSByZWdpc3RlcmVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIHVzZXJMaXN0LnB1dCh1c2VyLmdldFVzZXJOYW1lKCksIHVzZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxvZ2luKFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIHBhc3NXb3JkKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIHVzZXJMaXN0LmdldCh1c2VyTmFtZS50cmltKCkpOwotICAgICAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJ1c2VyIGhhcyBub3QgcmVnaXN0ZXJkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVzZXIuZ2V0UGFzc1dvcmQoKS5lcXVhbHMocGFzc1dvcmQpKSB7Ci0gICAgICAgICAgICBsb2dnZWRVc2Vycy5wdXQodXNlck5hbWUsIHVzZXIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJbnZhbGlkIHVzZXIgLCBwYXNzIG93cmQgaW5jb3JyZWN0Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvZ2dlZChTdHJpbmcgdXNlck5hbWUpIHsKLSAgICAgICAgVXNlciB1c2VyID0gKFVzZXIpIGxvZ2dlZFVzZXJzLmdldCh1c2VyTmFtZS50cmltKCkpOwotICAgICAgICByZXR1cm4gdXNlciAhPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBVc2VyW10gZ2V0VXNlcnMoKSB7Ci0gICAgICAgIFVzZXIgW10gdXNlcnMgPSBuZXcgVXNlclt1c2VyTGlzdC5zaXplKCldOwotICAgICAgICBJdGVyYXRvciB1c2Vyc19pdHIgPSB1c2VyTGlzdC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAodXNlcnNfaXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgdXNlcnNbY291bnRdID0gKFVzZXIpIHVzZXJzX2l0ci5uZXh0KCk7Ci0gICAgICAgICAgICBjb3VudCArKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0YjhhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLVNhbXBsZTogU09BUCB3aXRoIEF0dGFjaG1lbnRzDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi1UaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGNhcGFiaWxpdGllcyBhbmQgcG93ZXIgb2YgU09BUCB3aXRoIEF0dGFjaG1lbnQgc3VwcG9ydCBhbmQgdGhlDQotQXR0YWNobWVudCBBUEkgb2YgQVhJUzIuIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQXhpczIgYXR0YWNobWVudCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgYXQgDQotaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8xL210b20tZ3VpZGUuaHRtbC4gDQotDQotVGhpcyBzYW1wbGUgaW5jbHVkZXMgYSBzZXJ2aWNlIGFuZCBhIGNsaWVudCB3aGljaCBjYW4gYmUgdXNlZCB0byB1cGxvYWQgYSBmaWxlIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgDQotU09BUCBtZXNzYWdlIGNvbnRhaW5pbmcgYSBTT0FQIHdpdGggQXR0YWNobWVudCB0eXBlIGJpbmFyeSBhdHRhY2htZW50LiBUaGUgc2VydmljZSBpcyB3cml0dGVuIGFuZCANCi1kZXBsb3llZCB1c2luZyB0aGUgUkNQTWVzc2FnZVJlY2VpdmVyIGFuZCBhIFBPSk8oUGxhaW4gT2xkIEphdmEgT2JqZWN0KS4gVGhlIFBPSk8gc2VydmljZSBjbGFzcyB1c2VzIA0KLXRoZSBBdHRhY2htZW50IEFQSSBvZiB0aGUgTWVzc2FnZUNvbnRleHQgdG8gcmV0cmlldmUgdGhlIHJlY2VpdmVkIGF0dGFjaG1lbnQuVGhlIGNsaWVudCBwcm9ncmFtIGlzIA0KLXdyaXR0ZW4gdXNpbmcgdGhlIE9wZXJhdGlvbkNsaWVudCBBUEkgb2YgQXhpczIgdG9nZXRoZXIgd2l0aCB0aGUgQXR0YWNobWVudCBBUEkgb2YgTWVzc2FnZUNvbnRleHQuDQotDQotDQotT2JqZWN0aXZlcw0KLT09PT09PT09PT0NCi0NCi0gKiBXcml0aW5nIGEgUE9KTyAoUGxhaW4gT2xkIEphdmEgT2JqZWN0KSBiYXNlZCBzZXJ2aWNlIHRvIGFjY2VzcyBhdHRhY2htZW50cy4NCi0gKiBJbXBsZW1lbnQgYSBBeGlzMiBPcGVyYXRpb25DbGllbnQgYmFzZWQgV2ViIFNlcnZpY2UgY2xpZW50IHRvIGludm9rZSB0aGUgc2VydmljZSB3aXRoIFNPQVAgDQotICAgd2l0aCBBdHRhY2htZW50IHR5cGUgYXR0YWNobWVudHMuDQotICogSW52b2tlIHRoZSBkZXBsb3llZCBzZXJ2aWNlLg0KLQ0KLVByZXJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09DQotSW5zdGFsbCBBcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotDQotUnVubmluZyB0aGUgU2FtcGxlOg0KLT09PT09PT09PT09PT09PT09PT0NCi1UaGUgZmlsZXMgYmVsb25naW5nIHRvIHRoaXMgc2FtcGxlIGFyZSBjb250YWluZWQgaW4gdGhlIHNhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cyBmb2xkZXIgb2YgdGhlIA0KLWV4dHJhY3RlZCBBeGlzMiBiaW5hcnkgZGlzdHJpYnV0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBoZXJlIGFmdGVyIGFzIFNXQV9TQU1QTEVfRElSLiBUaGUgDQotbG9jYXRpb24gb2YgdGhlIGV4dHJhY3RlZCBiaW5hcnkgZGlzdHJpYnV0aW9uIHdpbGwgYmUgcmVmZXJlZCBhcyBBWElTMl9ESVNULiBUaGVyZSBpcyBhIA0KLSJidWlsZC54bWwiIEFudCBzY3JpcHQgaW4gdGhlIFNXQV9TQU1QTEVfRElSIHRoYXQgY29udGFpbnMgYnVpbGQgdGFyZ2V0cyBmb3IgYnVpbGRpbmcgdGhlIHNlcnZpY2UgDQotYXJjaGl2ZSBhbmQgcnVubmluZyB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIC0gYWxsIGRlc2NyaWJlZCBpbiBzdGVwcyBiZWxvdy4gDQotDQotMS4gR2VuZXJhdGUgdGhlIHNlcnZpY2UNCi1Vc2UgImFudCBnZW5lcmF0ZS5zZXJ2aWNlIiBjb21tYW5kIGluIHRoZSBTV0FfU0FNUExFX0RJUiB0byBidWlsZCB0aGUgc2VydmljZS4gR2VuZXJhdGVkIHNlcnZpY2UgDQotd2lsbCBhdXRvbWF0aWNhbGx5IGdldHMgY29waWVkIGluIHRvIHRoZSBBWElTMl9ESVNUL3JlcG9zaXRvcnkvc2VydmljZXMgZGlyZWN0b3J5LiBTb3VyY2UgZmlsZSANCi1yYWxhdGluZyB0byB0aGlzIHNlcnZpY2UgY2FuIGJlIGZvdW5kIGF0IA0KLVNXQV9TQU1QTEVfRElSL3NyYy9zYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9zZXJ2aWNlL0F0dGFjaG1lbnRTZXJ2aWNlLmphdmEuIFRoZSBzZXJ2aWNlcy54bWwgdXNlZA0KLXdoZW4gYnVpbGRpbmcgdGhpcyBzZXJ2aWNlIGNhbiBiZSBmb3VuZCBhdCBTV0FfU0FNUExFX0RJUi9yZXNvdXJjZXMgZGlyZWN0b3J5LiANCi0NCi0yLiBEZXBsb3kgdGhlIHNlcnZpY2UNCi1SdW4gdGhlIEFYSVMyX0RJU1QvYmluL2F4aXMyc2VydmVyLntzaC5iYXR9IHNjcmlwdCB0byBzdGFydCB0aGUgc3RhbmRhbG9uZSBheGlzMiBzZXJ2ZXIuIFRoaXMgc2VydmVyIA0KLXdpbGwgZGVwbG95IGFsbCB0aGUgc3J2aWNlcyBhdmFpbGFibGUgYXQgQVhJUzJfRElTVC9yZXBvc2l0b3J5L3NlcnZpY2VzIGRpcmVjdG9yeS4gQWx0ZXJuYXRpdmVseSB5b3UNCi1jYW4gZHJvcCB0aGUgc2FtcGxlLXN3YS5hYXIgc2VydmljZSBhcmNoaXZlIHRvIHRoZSBzZXJ2aWNlcyBkaXJlY3Rvcnkgb2YgYSBydW5uaW5nIEF4aXMyIHNlcnZsZXQpDQotDQotMy4gUnVubmluZyB0aGUgY2xpZW50DQotVXNlICJhbnQgcnVuLmNsaWVudCAtRGZpbGUgPGZpbGUgdG8gYmUgc2VuZD4gLURkZXN0IDxkZXN0aW5hdGlvbiBmaWxlIG5hbWU+IiBjb21tYW5kIGluIHRoZSANCi1TV0FfU0FNUExFX0RJUiB0byBidWlsZCBhbmQgcnVuIHRoZSBjbGllbnQuIFNvdXJjZSBmaWxlIHJhbGF0aW5nIHRvIHRoZSBjbGllbnQgY2FuIGJlIGZvdW5kIGF0IA0KLVNXQV9TQU1QTEVfRElSL3NyYy9zYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9jbGllbnQvU1dBQ2xpZW50LmphdmEuDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmZWM0MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJTT0FQV2l0aEF0dGFjaG1lbnRzU2FtcGxlIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQk8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIucmVwbyIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeSIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImNsaWVudC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgotCTxwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC9zd2FTYW1wbGVDbGllbnQuamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0iY29tcGlsZSI+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7YnVpbGQuZGlyfS9zYW1wbGUtc3dhLmFhciI+CQotCQkJPGZpbGVzZXQgZGlyPSJyZXNvdXJjZXMvIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi9zZXJ2aWNlcy54bWwiIC8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSJzYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9zZXJ2aWNlLyoqLyouY2xhc3MiIC8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvamFyPgotCQk8Y29weSBmaWxlPSIke2J1aWxkLmRpcn0vc2FtcGxlLXN3YS5hYXIiIHRvZmlsZT0iJHtheGlzMi5ob21lfS9yZXBvc2l0b3J5L3NlcnZpY2VzL3NhbXBsZS1zd2EuYWFyIiBvdmVyd3JpdGU9InRydWUiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgotCQk8bWtkaXIgZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iIC8+Ci0JCTwhLS0gQ29tcGlsZSBjbGllbnQgLS0+Ci0JCTxqYXZhYyBkZWJ1Zz0ib24iICBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtjbGllbnQuY2xhc3Nlcy5kaXJ9Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImF4aXMuY2xhc3NwYXRoIiAvPgotCQk8L2phdmFjPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iY2hlY2stcGFyYW1ldGVycyI+Ci0JCTxjb25kaXRpb24gcHJvcGVydHk9InBhcmFtZXRlcnMuc2V0Ij4KLQkJCTxhbmQ+Ci0JCQkJPGlzc2V0IHByb3BlcnR5PSJkZXN0IiAvPgotCQkJCTxpc3NldCBwcm9wZXJ0eT0iZmlsZSIgLz4KLQkJCTwvYW5kPgotCQk8L2NvbmRpdGlvbj4KLQkJPCEtLSBUaGlzIGlzIGEgaGFjayB0byBnZXQgYSBpZi1lbHNlIHdvcmtpbmcgaW4gYW50LiBTb21lIG11Y2ggbW9yZSAiQU5UeSIgcGVyc29uIGlzIHdlbGNvbWUgdG8gaW1wcm92ZSB0aGlzIC0tPgotCQk8YW50Y2FsbCB0YXJnZXQ9InByaW50LXVzYWdlIiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcmludC11c2FnZSIgdW5sZXNzPSJwYXJhbWV0ZXJzLnNldCI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImFudCAtRGZpbGUgJmx0O2ZpbGUgdG8gYmUgdHJhbnNmZXJlZCZndDsgIC1EZGVzdCAmbHQ7bmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZmlsZSZndDsiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUsY2hlY2stcGFyYW1ldGVycyIgaWY9InBhcmFtZXRlcnMuc2V0Ij4KLQkJPGphciBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L3N3YVNhbXBsZUNsaWVudC5qYXIiPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0vY2xhc3NlcyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0ic2FtcGxlL3NvYXB3aXRoYXR0YWNobWVudHMvY2xpZW50LyoqLyouY2xhc3MiIC8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvamFyPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS5zb2Fwd2l0aGF0dGFjaG1lbnRzLmNsaWVudC5TV0FDbGllbnQiIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotCQkJPGFyZyB2YWx1ZT0iLWZpbGUiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke2ZpbGV9IiAvPgotCQkJPGFyZyB2YWx1ZT0iLWRlc3QiIC8+Ci0JCQk8YXJnIHZhbHVlPSIke2Rlc3R9IiAvPgotCQkJPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7YXhpczIucmVwb30iIC8+Ci0JCTwvamF2YT4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLQkJPGRlbGV0ZSBkaXI9ImJ1aWxkIiAvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ1ZDRiYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iU1dBU2FtcGxlU2VydmljZSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgc2FtcGxlIFdlYiBTZXJ2aWNlIGZvciBpbGx1c3RyYXRpbmcgQXR0YWNobWVudHMgQVBJIG9mIEF4aXMyCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VDbGFzcyI+c2FtcGxlLnNvYXB3aXRoYXR0YWNobWVudHMuc2VydmljZS5BdHRhY2htZW50U2VydmljZTwvcGFyYW1ldGVyPgotICAgIDxvcGVyYXRpb24gbmFtZT0idXBsb2FkRmlsZSI+Ci0gICAgICAgIDxhY3Rpb25NYXBwaW5nPnVybjp1cGxvYWRGaWxlPC9hY3Rpb25NYXBwaW5nPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJwYy5yZWNlaXZlcnMuUlBDTWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvc3JjL3NhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL2NsaWVudC9TV0FDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9zcmMvc2FtcGxlL3NvYXB3aXRoYXR0YWNobWVudHMvY2xpZW50L1NXQUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YjFlNzYxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvc29hcHdpdGhhdHRhY2htZW50cy9zcmMvc2FtcGxlL3NvYXB3aXRoYXR0YWNobWVudHMvY2xpZW50L1NXQUNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLnNvYXB3aXRoYXR0YWNobWVudHMuY2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyOwotaW1wb3J0IGphdmF4LmFjdGl2YXRpb24uRmlsZURhdGFTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3BlcmF0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFNXQUNsaWVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoCi0JCQkiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1NXQVNhbXBsZVNlcnZpY2UiKTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kTGluZU9wdGlvblBhcnNlciBvcHRpb25zUGFyc2VyID0gbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKAotCQkJCWFyZ3MpOwotCQlMaXN0IGludmFsaWRPcHRpb25zTGlzdCA9IG9wdGlvbnNQYXJzZXIKLQkJCQkuZ2V0SW52YWxpZE9wdGlvbnMobmV3IE9wdGlvbnNWYWxpZGF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzSW52YWxpZChDb21tYW5kTGluZU9wdGlvbiBvcHRpb24pIHsKLQkJCQkJCVN0cmluZyBvcHRpb25UeXBlID0gb3B0aW9uLmdldE9wdGlvblR5cGUoKTsKLQkJCQkJCXJldHVybiAhKCJkZXN0Ii5lcXVhbHNJZ25vcmVDYXNlKG9wdGlvblR5cGUpIHx8ICJmaWxlIgotCQkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25UeXBlKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlpZiAoKGludmFsaWRPcHRpb25zTGlzdC5zaXplKCkgPiAwKSB8fCAoYXJncy5sZW5ndGggIT0gNCkpIHsKLQkJCS8vIHByaW50VXNhZ2UoKTsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkludmFsaWQgUGFyYW1ldGVycy4gIFVzYWdlIC1maWxlIDxmaWxlIHRvIGJlIHNlbmQ+IC1kZXN0IDxkZXN0aW5hdGlvbiBmaWxlPiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTWFwIG9wdGlvbnNNYXAgPSBvcHRpb25zUGFyc2VyLmdldEFsbE9wdGlvbnMoKTsKLQotCQlDb21tYW5kTGluZU9wdGlvbiBmaWxlT3B0aW9uID0gKENvbW1hbmRMaW5lT3B0aW9uKSBvcHRpb25zTWFwCi0JCQkJLmdldCgiZmlsZSIpOwotCQlDb21tYW5kTGluZU9wdGlvbiBkZXN0aW5hdGlvbk9wdGlvbiA9IChDb21tYW5kTGluZU9wdGlvbikgb3B0aW9uc01hcAotCQkJCS5nZXQoImRlc3QiKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU9wdGlvbi5nZXRPcHRpb25WYWx1ZSgpKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQl0cmFuc2ZlckZpbGUoZmlsZSwgZGVzdGluYXRpb25PcHRpb24uZ2V0T3B0aW9uVmFsdWUoKSk7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJGaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGRlc3RpbmF0aW9uRmlsZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCi0JCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQkJb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfU1dBLAotCQkJCUNvbnN0YW50cy5WQUxVRV9UUlVFKTsKLQkJb3B0aW9ucy5zZXRTb2FwVmVyc2lvblVSSShTT0FQMTFDb25zdGFudHMuU09BUF9FTlZFTE9QRV9OQU1FU1BBQ0VfVVJJKTsKLQkJLy8gSW5jcmVhc2UgdGhlIHRpbWUgb3V0IHdoZW4gc2VuZGluZyBsYXJnZSBhdHRhY2htZW50cwotCQlvcHRpb25zLnNldFRpbWVPdXRJbk1pbGxpU2Vjb25kcygxMDAwMCk7Ci0JCW9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLQkJb3B0aW9ucy5zZXRBY3Rpb24oInVybjp1cGxvYWRGaWxlIik7Ci0KLQkJLy8gYXNzdW1lIHRoZSB1c2UgcnVucyB0aGlzIHNhbXBsZSBhdAotCQkvLyA8YXhpczJob21lPi9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvIGRpcgotCQlDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0oIi4uLy4uL3JlcG9zaXRvcnkiLAotCQkJCQkJbnVsbCk7Ci0KLQkJU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudChjb25maWdDb250ZXh0LCBudWxsKTsKLQkJc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0JCU9wZXJhdGlvbkNsaWVudCBtZXBDbGllbnQgPSBzZW5kZXIKLQkJCQkuY3JlYXRlQ2xpZW50KFNlcnZpY2VDbGllbnQuQU5PTl9PVVRfSU5fT1ApOwotCi0JCU1lc3NhZ2VDb250ZXh0IG1jID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0JCUZpbGVEYXRhU291cmNlIGZpbGVEYXRhU291cmNlID0gbmV3IEZpbGVEYXRhU291cmNlKGZpbGUpOwotCi0JCS8vIENyZWF0ZSBhIGRhdGFIYW5kbGVyIHVzaW5nIHRoZSBmaWxlRGF0YVNvdXJjZS4gQW55IGltcGxlbWVudGF0aW9uIG9mCi0JCS8vIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBpbnRlcmZhY2UgY2FuIGZpdCBoZXJlLgotCQlEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IG5ldyBEYXRhSGFuZGxlcihmaWxlRGF0YVNvdXJjZSk7Ci0JCVN0cmluZyBhdHRhY2htZW50SUQgPSBtYy5hZGRBdHRhY2htZW50KGRhdGFIYW5kbGVyKTsKLQotCQlTT0FQRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRTT0FQMTFGYWN0b3J5KCk7Ci0JCVNPQVBFbnZlbG9wZSBlbnYgPSBmYWMuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0JCU9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0JCQkJImh0dHA6Ly9zZXJ2aWNlLnNvYXB3aXRoYXR0YWNobWVudHMuc2FtcGxlIiwgInN3YSIpOwotCQlPTUVsZW1lbnQgdXBsb2FkRmlsZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInVwbG9hZEZpbGUiLCBvbU5zKTsKLQkJT01FbGVtZW50IG5hbWVFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJuYW1lIiwgb21Ocyk7Ci0JCW5hbWVFbGUuc2V0VGV4dChkZXN0aW5hdGlvbkZpbGUpOwotCQlPTUVsZW1lbnQgaWRFbGUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhdHRjaG1lbnRJRCIsIG9tTnMpOwotCQlpZEVsZS5zZXRUZXh0KGF0dGFjaG1lbnRJRCk7Ci0JCXVwbG9hZEZpbGUuYWRkQ2hpbGQobmFtZUVsZSk7Ci0JCXVwbG9hZEZpbGUuYWRkQ2hpbGQoaWRFbGUpOwotCQllbnYuZ2V0Qm9keSgpLmFkZENoaWxkKHVwbG9hZEZpbGUpOwotCQltYy5zZXRFbnZlbG9wZShlbnYpOwotCi0JCW1lcENsaWVudC5hZGRNZXNzYWdlQ29udGV4dChtYyk7Ci0JCW1lcENsaWVudC5leGVjdXRlKHRydWUpOwotCQlNZXNzYWdlQ29udGV4dCByZXNwb25zZSA9IG1lcENsaWVudAotCQkJCS5nZXRNZXNzYWdlQ29udGV4dChXU0RMQ29uc3RhbnRzLk1FU1NBR0VfTEFCRUxfSU5fVkFMVUUpOwotCSAgCVNPQVBCb2R5IGJvZHkgPSByZXNwb25zZS5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKTsKLQkgIAlPTUVsZW1lbnQgZWxlbWVudCA9IGJvZHkuZ2V0Rmlyc3RFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKAotCSAgCW5ldyBRTmFtZSgiaHR0cDovL3NlcnZpY2Uuc29hcHdpdGhhdHRhY2htZW50cy5zYW1wbGUiLCJyZXR1cm4iKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihlbGVtZW50LmdldFRleHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NyYy9zYW1wbGUvc29hcHdpdGhhdHRhY2htZW50cy9zZXJ2aWNlL0F0dGFjaG1lbnRTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvc3JjL3NhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NlcnZpY2UvQXR0YWNobWVudFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGYzODAzZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3NvYXB3aXRoYXR0YWNobWVudHMvc3JjL3NhbXBsZS9zb2Fwd2l0aGF0dGFjaG1lbnRzL3NlcnZpY2UvQXR0YWNobWVudFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHNhbXBsZS5zb2Fwd2l0aGF0dGFjaG1lbnRzLnNlcnZpY2U7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uYXR0YWNobWVudHMuQXR0YWNobWVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQXR0YWNobWVudFNlcnZpY2UgewotCi0JcHVibGljIFN0cmluZyB1cGxvYWRGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgYXR0Y2htZW50SUQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4ID0gTWVzc2FnZUNvbnRleHQuZ2V0Q3VycmVudE1lc3NhZ2VDb250ZXh0KCk7Ci0gICAgICAgIEF0dGFjaG1lbnRzIGF0dGFjaG1lbnQgPSBtc2dDdHguZ2V0QXR0YWNobWVudE1hcCgpOwotICAgICAgICBEYXRhSGFuZGxlciBkYXRhSGFuZGxlciA9IGF0dGFjaG1lbnQuZ2V0RGF0YUhhbmRsZXIoYXR0Y2htZW50SUQpOwotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSgKLQkJCQluYW1lKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBmaWxlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCWRhdGFIYW5kbGVyLndyaXRlVG8oZmlsZU91dHB1dFN0cmVhbSk7Ci0JCWZpbGVPdXRwdXRTdHJlYW0uZmx1c2goKTsKLQkJZmlsZU91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkKLQkJcmV0dXJuICJGaWxlIHNhdmVkIHN1Y2Nlc2Z1bGx5LiI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzODczNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotQXhpczIgVXNlcidzIEd1aWRlIFNhbXBsZQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHNhbXBsZSBjb250YWlucyB0aGUgc291cmNlIGNvZGUgcmVsZXZhbnQgdG8geGRvY3MvMV8xL2Fkdi11c2VyZ3VpZGUuaHRtbCwgDQotbW9yZSBzcGVjaWZpY2FsbHkgdG8geGRvY3MvMV8xL2RpaS5odG1sIGFuZCB4bWxiYXNlZC1zZXJ2ZXIuaHRtbCB3aGljaCBhcmUgc2VjdGlvbnMgDQotb2YgdGhlIEF4aXMyIEFkdmFuY2VkIFVzZXIncyBHdWlkZSBmb3VuZCBpbiB0aGUgRG9jdW1lbnRzIERpc3RyaWJ1dGlvbi4NCi0NCi1UaGUgc2FtcGxlIGV4cGxhaW5zIGhvdyB0byB3cml0ZSBhIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgd2l0aCANCi1BcGFjaGUgQXhpczIgdXNpbmcgWE1MIGJhc2VkIGNsaWVudCBBUElzIChBeGlzMidzIFByaW1hcnkgQVBJcykuDQotDQotSW50cm9kdWN0aW9uDQotPT09PT09PT09PT09DQotDQotVGhlIGZvbGxvd2luZyBzYW1wbGUgY2xpZW50cyBhcmUgbG9jYXRlZCBhdCANCi1BWElTMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cyBkaXJlY3RvcnkuIA0KLQ0KLUVjaG9CbG9ja2luZ0NsaWVudC5qYXZhIC0tIERlbW9uc3RyYXRlcyB0aGUgcmVxdWVzdC1yZXNwb25zZSwgYmxvY2tpbmcgY2xpZW50IHdoaWNoIA0KLWlzIHdyaXR0ZW4gdXNpbmcgQXhpczIncyBwcmltYXJ5IEFQSXMuDQotDQotRWNob0Jsb2NraW5nRHVhbENsaWVudC5qYXZhIC0tIERlbW9uc3RyYXRlcyB0aGUgcmVxdWVzdC1yZXNwb25zZSwgYmxvY2tpbmcgY2xpZW50IHdoaWNoIA0KLXVzZXMgdHdvIHRyYW5zcG9ydCBjb25uZWN0aW9ucyBhbmQgd3JpdHRlbiB1c2luZyBBeGlzMidzIHByaW1hcnkgQVBJcy4NCi0NCi1FY2hvTm9uQmxvY2tpbmdDbGllbnQuamF2YSAtLSBEZW1vbnN0cmF0ZXMgdGhlIHJlcXVlc3QtcmVzcG9uc2UsIG5vbi1ibG9ja2luZyBpbnZvY2F0aW9uIA0KLXdoaWNoIGlzIHdyaXR0ZW4gdXNpbmcgQXhpczIncyBwcmltYXJ5IEFQSXMuDQotDQotRWNob05vbkJsb2NraW5nRHVhbENsaWVudC5qYXZhIC0tIERlbW9uc3RyYXRlcyB0aGUgcmVxdWVzdC1yZXNwb25zZSwgbm9uLWJsb2NraW5nIGludm9jYXRpb24gDQotdXNpbmcgdHdvIHRyYW5zcG9ydCBjb25uZWN0aW9ucyBhbmQgaXMgd3JpdHRlbiB1c2luZyBBeGlzMidzIHByaW1hcnkgQVBJcy4NCi0NCi1NYWlsQ2xpZW50LmphdmEgLS0gUmVwcmVzZW50cyBhIGNsaWVudCBmb3IgaW52b2tpbmcgDQotDQotUGluZ0NsaWVudC5qYXZhIC0tIFJlcHJlc2VudHMgYSBzaW1wbGUgb25lLXdheSBjbGllbnQgd2hpY2ggaXMgd3JpdHRlbiB1c2luZyBBeGlzMidzIHByaW1hcnkgQVBJcy4NCi0NCi1SRVNUQ2xpZW50LmphdmEgLS0gUmVwcmVzZW50cyBhIGNsaWVudCBmb3IgaW52b2tpbmcgYSBSRVNUIFdlYiBzZXJ2aWNlDQotDQotVENQQ2xpZW50LmphdmEgLS0gRGVtb25zdHJhdGVzIGEgY2xpZW50IGZvciBpbnZva2luZyBhIFdlYiBzZXJ2aWNlIHVzaW5nIFRDUA0KLQ0KLWV4YW1wbGUxLCBleGFtcGxlMiBhbmQgZXhhbXBsZTMgZGlyZWN0b3JpZXMgaW5zaWRlIEF4aXMyX2hvbWUvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZSANCi1jb250YWluIHRoZSBXZWIgc2VydmljZXMgd2hpY2ggYXJlIGludm9rZWQgYnkgdGhlIGFib3ZlIGNsaWVudHMuDQotDQotDQotUHJlLVJlcXVpc2l0ZXMNCi09PT09PT09PT09PT09PQ0KLQ0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXINCi0NCi1CdWlsZGluZyB0aGUgU2VydmljZQ0KLT09PT09PT09PT09PT09PT09PT09DQotKiBUeXBlICJhbnQgZ2VuZXJhdGUubW9kdWxlIiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy91c2VyZ3VpZGUgdG8gZ2VuZXJhdGUgdGhlIGxvZ2dpbmcgbW9kdWxlLg0KLSogQWRkIHRoZSBsb2dnaW5nIHBoYXNlIHRvIHRoZSAuLi8uLi9jb25mL2F4aXMyLnhtbC4gRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UgcmVmZXIgdG8gdGhlIA0KLSAgaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvMV8yL21vZHVsZXMuaHRtbA0KLSogVHlwZSAiYW50IGdlbmVyYXRlLnNlcnZpY2UiIG9yIGp1c3QgImFudCIgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlDQotKiBUaGVuIGdvIHRvIEFYSVMyX0hPTUUvYmluIGRpcmVjdG9yeSBhbmQgcnVuIGVpdGhlciBheGlzMnNlcnZlci5iYXQgb3IgYXhpczJzZXJ2ZXIuc2ggZGVwZW5kaW5nIG9uIHlvdXIgcGxhdGZvcm0uDQotDQotQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNvcHkgdGhlIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBhcmNoaXZlcyBpbiB0byBhIHNlcnZsZXQgY29udGFpbmVyLg0KLQ0KLUlmIHlvdSBnbyB0byBodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpczIvLCB5b3Ugc2hvdWxkIHNlZSBNeVNlcnZpY2UsIE15U2VydmljZVdpdGhNb2R1bGUgYXJlIGRlcGxveWVkLiANCi0NCi0NCi1SdW5uaW5nIHRoZSBDbGllbnRzDQotPT09PT09PT09PT09PT09PT09PQ0KLQ0KLVR5cGUgdGhlIGZvbGxvd2luZyBhbnQgY29tbWFuZHMgZnJvbSBBeGlzMl9IT01FL3NhbXBsZXMvdXNlcmd1aWRlIHRvIHJ1biB0aGUgY2xpZW50cyBvbmUgYnkgb25lLg0KLQ0KLSAqICJhbnQgcnVuLmNsaWVudC5ibG9ja2luZyINCi0gICBUaGlzIGludm9rZXMgTXlTZXJ2aWNlIHRocm91Z2ggYSByZXF1ZXN0LXJlc3BvbnNlLCBibG9ja2luZyBjbGllbnQuICAgDQotICogImFudCBydW4uY2xpZW50LmJsb2NraW5nZHVhbCINCi0gICBUaGlzIGludm9rZXMgTXlTZXJ2aWNlIHRocm91Z2ggYSByZXF1ZXN0LXJlc3BvbnNlLCBibG9ja2luZyBjbGllbnQgdmlhIGR1YWwgdHJhbnNwb3J0IGNoYW5uZWxzLiAgIA0KLSAqICJhbnQgcnVuLmNsaWVudC5ub25ibG9ja2luZyINCi0gICBUaGlzIGludm9rZXMgTXlTZXJ2aWNlIHRocm91Z2ggYSByZXF1ZXN0LXJlc3BvbnNlLCBub24tYmxvY2tpbmcgY2xpZW50LiAgDQotICogImFudCBydW4uY2xpZW50Lm5vbmJsb2NraW5nZHVhbCINCi0gICBUaGlzIGludm9rZXMgTXlTZXJ2aWNlIHRocm91Z2ggYSByZXF1ZXN0LXJlc3BvbnNlLCBub24tYmxvY2tpbmcgY2xpZW50IHZpYSBkdWFsIHRyYW5zcG9ydCBjaGFubmVscy4gICANCi0gKiAiYW50IHJ1bi5jbGllbnQucGluZyINCi0gICBUaGlzIGludm9rZXMgTXlTZXJ2aWNlIHRocm91Z2ggYSBvbmUtd2F5IGNsaWVudA0KLQ0KLSANCi1Zb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgYWJvdmUgY2xpZW50cyBpbiBBeGlzMiB1c2VycyBndWlkZSwgUkVTVEZ1bCBXZWIgc2VydmljZXMgc3VwcG9ydCwgDQotVENQIFRyYW5zcG9ydCBkb2N1bWVudHMgZm91bmQgaW4gdGhlIERvY3VtZW50cyBEaXN0cmlidXRpb24ncyB4ZG9jcyBkaXJlY3RvcnkuIEFsc28sIHlvdSBtYXkgZmluZCBpdCANCi11c2VmdWwgdG8gdHJ5IG91dCB0aGUgYWJvdmUgc2VydmljZXMgYW5kIGNsaWVudHMgd2hpbGUgZ29pbmcgdGhyb3VnaCB0aGVzZSBkb2N1bWVudHMuDQotDQotTm90ZQ0KLT09PT09PT09PT09PT09DQotU29tZXRpbWVzLCBpZiB5b3UncmUgaGF2aW5nIHRyb3VibGUgcnVubmluZyB0aGUgY2xpZW50IHN1Y2Nlc3NmdWxseSwgDQotSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBjbGVhbiB0aGUgc2VydmljZXMgcmVwb3NpdG9yeSBiZWZvcmUgeW91IGdlbmVyYXRlIHRoZSBzZXJ2aWNlLCBkZXBsb3kgaXQNCi1hbmQgcnVuIHRoZSBjbGllbnQuIChpLmUuIGRlbGV0ZSBzZXJ2aWNlcyBjcmVhdGVkIGZyb20gcHJldmlvdXMgc2FtcGxlcy4pDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9idWlsZC54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZWQ1NGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0idXNlcmd1aWRlIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFpbkRpciIgdmFsdWU9Ii4uLy4uIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iYnVpbGQvY2xhc3NlcyIvPgotICAgIDxwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC91c2VyZ3VpZGUuamFyIi8+Ci0gICAgPC9wYXRoPgotPG1rZGlyIGRpcj0iJHtiYXNlZGlyfS9idWlsZC9jbGFzc2VzIi8+Ci0KLQotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudC5hbGwiCi0gICAgICAgICAgICBkZXBlbmRzPSJydW4uY2xpZW50LnBpbmcscnVuLmNsaWVudC5ibG9ja2luZyxydW4uY2xpZW50LmJsb2NraW5nZHVhbCxydW4uY2xpZW50Lm5vbmJsb2NraW5nLHJ1bi5jbGllbnQubm9uYmxvY2tpbmdkdWFsLHJ1bi5jbGllbnQuc2VydmljZXdpdGhtb2R1bGUiPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSI+Ci0gICAgCQk8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIgLz4KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJheGlzLmNsYXNzcGF0aCIgLz4KLQkJPC9qYXZhYz4KLQkJPGphciBkZXN0ZmlsZT0iYnVpbGQvdXNlcmd1aWRlLmphciI+Ci0gICAgICAgICAgICAJCTxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotICAgICAgICAgICAgICAgIAkJPGluY2x1ZGUgbmFtZT0idXNlcmd1aWRlLyoqIi8+Ci0gICAgICAgICAgICAJCTwvZmlsZXNldD4KLSAgICAgICAJCTwvamFyPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUuc2VydmljZSIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9NeVNlcnZpY2UuYWFyIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3VzZXJndWlkZS9leGFtcGxlMS8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvZXhhbXBsZTEvKiovKi5jbGFzcyIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGNvcHkgZmlsZT0iYnVpbGQvTXlTZXJ2aWNlLmFhciIgdG9maWxlPSIuLi8uLi9yZXBvc2l0b3J5L3NlcnZpY2VzL3NhbXBsZS1NeVNlcnZpY2UuYWFyIiBvdmVyd3JpdGU9InRydWUiLz4KLSAgICAgICAgPGphciBkZXN0ZmlsZT0iYnVpbGQvTXlTZXJ2aWNlV2l0aE1vZHVsZS5hYXIiID4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0ic3JjL3VzZXJndWlkZS9leGFtcGxlMi8iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik1FVEEtSU5GLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJ1c2VyZ3VpZGUvZXhhbXBsZTIvKiovKi5jbGFzcyIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGNvcHkgZmlsZT0iYnVpbGQvTXlTZXJ2aWNlV2l0aE1vZHVsZS5hYXIiIHRvZmlsZT0iLi4vLi4vcmVwb3NpdG9yeS9zZXJ2aWNlcy9zYW1wbGUtTXlTZXJ2aWNlV2l0aE1vZHVsZS5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgICAgICA8amFyIGRlc3RmaWxlPSJidWlsZC9Xc2FNYXBwaW5nU2VydmljZS5hYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL2V4YW1wbGUzLyI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKioiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InVzZXJndWlkZS9leGFtcGxlMy8qKi8qLmNsYXNzIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8Y29weSBmaWxlPSJidWlsZC9Xc2FNYXBwaW5nU2VydmljZS5hYXIiIHRvZmlsZT0iLi4vLi4vcmVwb3NpdG9yeS9zZXJ2aWNlcy9zYW1wbGUtV3NhTWFwcGluZ1NlcnZpY2UuYWFyIiBvdmVyd3JpdGU9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLm1vZHVsZSIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgPGphciBkZXN0ZmlsZT0iYnVpbGQvbG9nZ2luZy5tYXIiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvdXNlcmd1aWRlL2xvZ2dpbmdtb2R1bGUvIj4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qKiIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2NsYXNzZXMuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idXNlcmd1aWRlL2xvZ2dpbmdtb2R1bGUvKiovKi5jbGFzcyIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgIDwvamFyPgotICAgICAgIDxjb3B5IGZpbGU9ImJ1aWxkL2xvZ2dpbmcubWFyIiB0b2ZpbGU9Ii4uLy4uL3JlcG9zaXRvcnkvbW9kdWxlcy9zYW1wbGUtbG9nZ2luZy5tYXIiIG92ZXJ3cml0ZT0idHJ1ZSIvPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqKiBQbGVhc2UgYWRkIHRoZSBsb2dnaW5nIHBoYXNlIHRvIHRoZSAuLi8uLi9jb25mL2F4aXMyLnhtbC4gRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UgcmVmZXIgdG8gdGhlIGh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfMi9tb2R1bGVzLmh0bWwgKioqIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQuYmxvY2tpbmciIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9CbG9ja2luZ0NsaWVudCIKLSAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfS9yZXBvc2l0b3J5Ii8+Ci0JICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIueG1sPWNvbmYvYXhpczIueG1sIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQuYmxvY2tpbmdkdWFsIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJ1c2VyZ3VpZGUuY2xpZW50cy5FY2hvQmxvY2tpbmdEdWFsQ2xpZW50IgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9L3JlcG9zaXRvcnkiLz4KLQkgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi54bWw9Y29uZi9heGlzMi54bWwiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudC5ub25ibG9ja2luZyIgZGVwZW5kcz0iY29tcGlsZSI+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuRWNob05vbkJsb2NraW5nQ2xpZW50IgotICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLSAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke21haW5EaXJ9L3JlcG9zaXRvcnkiLz4KLQkgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi54bWw9Y29uZi9heGlzMi54bWwiLz4KLSAgICAgICAgPC9qYXZhPgotICAgIDwvdGFyZ2V0PgotICAgIAotICAgIDx0YXJnZXQgbmFtZT0icnVuLmNsaWVudC5ub25ibG9ja2luZ2R1YWwiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLkVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0vcmVwb3NpdG9yeSIvPgotCSAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnhtbD1jb25mL2F4aXMyLnhtbCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50LnBpbmciIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgICAgICA8amF2YSBjbGFzc25hbWU9InVzZXJndWlkZS5jbGllbnRzLlBpbmdDbGllbnQiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURheGlzMi5yZXBvPSR7bWFpbkRpcn0vcmVwb3NpdG9yeSIvPgotCSAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnhtbD1jb25mL2F4aXMyLnhtbCIvPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgCi0gICAgPHRhcmdldCBuYW1lPSJydW4uY2xpZW50LnNlcnZpY2V3aXRobW9kdWxlIiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICAJPGVjaG8gbWVzc2FnZT0iJHttYWluRGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSIke21haW5EaXJ9L3JlcG9zaXRvcnkvY29uZi9heGlzMi54bWwiIC8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0idXNlcmd1aWRlLmNsaWVudHMuQ2xpZW50Rm9yV2ViU2VydmljZVdpdGhNb2R1bGUiCi0gICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iYXhpcy5jbGFzc3BhdGgiIGZvcms9InRydWUiPgotICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHttYWluRGlyfS9yZXBvc2l0b3J5Ii8+CSAgIAotCSAgIDxqdm1hcmcgdmFsdWU9Ii1EYXhpczIueG1sPWNvbmYvYXhpczIueG1sIi8+Ci0gICAgICAgIDwvamF2YT4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiPgotCTxlY2hvIG1lc3NhZ2U9IlBsZWFzZSB1c2UgdGhlIGZvbGxvd2luZyBhbnQgdGFyZ2V0cyB0byBydW4gdGhlIGNsaWVudHMiIC8+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5waW5nIiAvPgotCTxlY2hvIG1lc3NhZ2U9InJ1bi5jbGllbnQuYmxvY2tpbmciIC8+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5ibG9ja2luZ2R1YWwiIC8+Ci0JPGVjaG8gbWVzc2FnZT0icnVuLmNsaWVudC5ub25ibG9ja2luZyIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50Lm5vbmJsb2NraW5nZHVhbCIgLz4KLQk8ZWNobyBtZXNzYWdlPSJydW4uY2xpZW50LnNlcnZpY2V3aXRobW9kdWxlIiAvPgotCTxlY2hvIG1lc3NhZ2U9InJ1bi5jbGllbnQuYWxsICAtICBydW4gYWxsIGNsaWVudHMiIC8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JPGRlbGV0ZSBkaXI9ImJ1aWxkIiAvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvY29uZi9heGlzMi54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9jb25mL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlZThjZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9jb25mL2F4aXMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0gCi08YXhpc2NvbmZpZyBuYW1lPSJBeGlzSmF2YTIuMCI+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUGFyYW1ldGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3RkZXBsb3ltZW50Ij50cnVlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJob3R1cGRhdGUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVNVE9NIj5mYWxzZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlU3dBIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVVuY29tbWVudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmlsZSBjYWNoaW5nIGZvciBhdHRhY2htZW50cyAtLT4KLSAgICA8IS0tcGFyYW1ldGVyIG5hbWU9ImNhY2hlQXR0YWNobWVudHMiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImF0dGFjaG1lbnRESVIiPjwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2l6ZVRocmVzaG9sZCI+NDAwMDwvcGFyYW1ldGVyLS0+Ci0KLSAgICA8IS0tVGhpcyB3aWxsIGdpdmUgb3V0IHRoZSB0aW1vdXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGV4dHMsIGluIHNlY29uZHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9IkNvbmZpZ0NvbnRleHRUaW1lb3V0SW50ZXJ2YWwiPjMwPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tRHVyaW5nIGEgZmF1bHQsIHN0YWNrdHJhY2UgY2FuIGJlIHNlbnQgd2l0aCB0aGUgZmF1bHQgbWVzc2FnZS4gVGhlIGZvbGxvd2luZyBmbGFnIHdpbGwgY29udHJvbCAtLT4KLSAgICA8IS0tdGhhdCBiZWhhdmlvdXIuLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzZW5kU3RhY2t0cmFjZURldGFpbHNXaXRoRmF1bHRzIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUlmIHRoZXJlIGFyZW4ndCBhbnkgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGZpbmQgb3V0IHRoZSBmYXVsdCByZWFzb24sIHdlIHNldCB0aGUgbWVzc2FnZSBvZiB0aGUgZXhwY2V0aW9uLS0+Ci0gICAgPCEtLWFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uIEJ1dCB3aGVuIGEgZmF1bHQgaXMgdGhyb3duIGZyb20gYSBzZXJ2aWNlIG9yIHNvbWUgd2hlcmUsIGl0IHdpbGwgYmUgLS0+Ci0gICAgPCEtLXdyYXBwZWQgYnkgZGlmZmVyZW50IGxldmVscy4gRHVlIHRvIHRoaXMgdGhlIGluaXRpYWwgZXhjZXB0aW9uIG1lc3NhZ2UgY2FuIGJlIGxvc3QuIElmIHRoaXMgZmxhZy0tPgotICAgIDwhLS1pcyBzZXQgdGhlbiwgQXhpczIgdHJpZXMgdG8gZ2V0IHRoZSBmaXJzdCBleGNlcHRpb24gYW5kIHNldCBpdHMgbWVzc2FnZSBhcyB0aGUgZmF1bHRyZWFzb24vUmVhc29uLi0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iRHJpbGxEb3duVG9Sb290Q2F1c2VGb3JGYXVsdFJlYXNvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDxwYXJhbWV0ZXIgbmFtZT0idXNlck5hbWUiPmFkbWluPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJwYXNzd29yZCI+YXhpczI8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1UbyBvdmVycmlkZSByZXBvc2l0b3J5L3NlcnZpY2VzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9IlNlcnZpY2VzRGlyZWN0b3J5Ij5zZXJ2aWNlPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvbW9kdWxlcyB5b3UgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIHBhcmFtZXRlciBhbmQgdmFsdWUgU0hPVUxEIGJlIGFic29sdXRlIGZpbGUgcGF0aC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Ik1vZHVsZXNEaXJlY3RvcnkiPm1vZHVsZXM8L3BhcmFtZXRlcj4tLT4KLQotCi0KLSAgICA8IS0tRm9sbG93aW5nIHBhcmFtcyB3aWxsIHNldCB0aGUgcHJvcGVyIGNvbnRleHQgcGF0aHMgZm9yIGludm9jYXRpb25zLiBBbGwgdGhlIGVuZHBvaW50cyB3aWxsIGhhdmUgYSBjb21tb25zIGNvbnRleHQtLT4KLSAgICA8IS0tcm9vdCB3aGljaCBjYW4gY29uZmlndXJlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbnRleHRSb290IHBhcmFtZXRlci0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImNvbnRleHRSb290Ij5heGlzMjwvcGFyYW1ldGVyPi0tPgotCi0gICAgPCEtLU91ciBIVFRQIGVuZHBvaW50cyBjYW4gaGFuZGxlIGJvdGggUkVTVCBhbmQgU09BUC4gRm9sbG93aW5nIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgdG8gZGlzdGluZ2l1c2ggdGhvc2UgZW5kcG9pbnRzLS0+Ci0gICAgPCEtLUluIGNhc2Ugb2YgYSBzZXJ2bGV0LCBpZiB5b3UgY2hhbmdlIHRoaXMgeW91IGhhdmUgdG8gbWFudWFsbHkgY2hhbmdlIHRoZSBzZXR0aW5ncyBvZiB5b3VyIHNlcnZsZXQgY29udGFpbmVyIHRvIG1hcCB0aGlzIC0tPgotICAgIDwhLS1jb250ZXh0IHBhdGggdG8gcHJvcGVyIEF4aXMyIHNlcnZsZXRzLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0ic2VydmljZVBhdGgiPnNlcnZpY2VzPC9wYXJhbWV0ZXI+LS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0icmVzdFBhdGgiPnJlc3Q8L3BhcmFtZXRlcj4tLT4KLQotCi0gICAgPCEtLVNldCB0aGUgZmxhZyB0byB0cnVlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0cmFuc3BvcnQgbGV2ZWwgc2Vzc2lvbiBtYW5nbWVudC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWFuYWdlVHJhbnNwb3J0U2Vzc2lvbiI+ZmFsc2U8L3BhcmFtZXRlcj4KLQotICAgIDwhLS0gRm9sbG93aW5nIHBhcmFtZXRlciB3aWxsIGNvbXBsZXRlbHkgZGlzYWJsZSBSRVNUIGhhbmRsaW5nIGluIEF4aXMyLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJkaXNhYmxlUkVTVCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBJZiB5b3UgaGF2ZSBhIGZyb250ZW5kIGhvc3Qgd2hpY2ggZXhwb3NlcyB0aGlzIHdlYnNlcnZpY2UgdXNpbmcgYSBkaWZmZXJlbnQgcHVibGljIFVSTCAgLS0+Ci0gICAgPCEtLSB1c2UgdGhpcyBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYXV0b2RldGVjdGVkIHVybCAtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJodHRwRnJvbnRlbmRIb3N0VXJsIj5odHRwczovL3NvbWVvdGhlcmhvc3QvY29udGV4dDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tICAgIFRoZSB3YXkgb2YgYWRkaW5nIGxpc3RlbmVyIHRvIHRoZSBzeXN0ZW0tLT4KLSAgICA8IS0tICAgIDxsaXN0ZW5lciBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5PYnNlcnZlcklNUEwiPi0tPgotICAgIDwhLS0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUlNTX1VSTCI+aHR0cDovLzEyNy4wLjAuMS9yc3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tICAgIDwvbGlzdGVuZXI+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIFJlY2VpdmVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLVRoaXMgaXMgdGhlIERlYWZ1bHQgTWVzc2FnZSBSZWNlaXZlciBmb3IgdGhlIHN5c3RlbSAsIGlmIHlvdSB3YW50IHRvIGhhdmUgTWVzc2FnZVJlY2VpdmVycyBmb3IgLS0+Ci0gICAgPCEtLWFsbCB0aGUgb3RoZXIgTUVQIGltcGxlbWVudCBpdCBhbmQgYWRkIHRoZSBjb3JyZWN0IGVudHJ5IHRvIGhlcmUgLCBzbyB0aGF0IHlvdSBjYW4gcmVmZXIgZnJvbS0tPgotICAgIDwhLS1hbnkgb3BlcmF0aW9uIC0tPgotICAgIDwhLS1Ob3RlIDogWW91IGNhbiBvdnJpZGUgdGhpcyBmb3IgcGFydGljdWxhciBzZXJ2aWNlIGJ5IGFkZGluZyB0aGUgc2FtZSBlbGVtZW50IHdpdGggeW91ciByZXF1aXJlbWVudC0tPgotICAgIDxtZXNzYWdlUmVjZWl2ZXJzPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW9ubHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT25seU1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIG1lcD0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5PdXRNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICA8L21lc3NhZ2VSZWNlaXZlcnM+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdCAgc2VyaWFsaXphdGlvbiBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4KLSAgICA8bWVzc2FnZUZvcm1hdHRlcnM+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veG1sIgotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BcHBsaWNhdGlvblhNTEZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0idGV4dC94bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkFwcGxpY2F0aW9uWE1MRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi9lY2hvK3htbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXBwbGljYXRpb25YTUxGb3JtYXR0ZXIiLz4KLSAgICA8L21lc3NhZ2VGb3JtYXR0ZXJzPgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlcj4KLSAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZSBzZXR0aW5ncyBmdXJ0aGVyIGJlbG93KToKLSAgICAgICAgICAgIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdCA2MDYwKQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQotICAgICAgICAgICAgb3JpZ2luU2VydmVyOiAgdmFsdWUgb2YgaHR0cCBTZXJ2ZXIgaGVhZGVyIGluIG91dGdvaW5nIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiU2ltcGxlLVNlcnZlci8xLjEiKQotICAgICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6ICB2YWx1ZSBpbiBtaWxsaXMgb2YgdGltZSB0aGF0IHJlcXVlc3RzIGNhbiB3YWl0IGZvciBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAyMDAwMCkKLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdG8gbWluaW1pemUgYmFuZHdpZHRoIGNvbnN1bXB0aW9uIGJ5IGNvbWJpbmluZyBzZWdtZW50cwotICAgICAgICAgICAgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nICh1bmxlc3MgcXVldWUgZmlsbHMgdXApICAoZGVmYXVsdCAyNSkKLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVzICAgICAgICAgKGRlZmF1bHQgMTUwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IGRlZmF1bHQgcXVldWUgbmV2ZXIgZmlsbHMgdXA6ICBzZWUgSHR0cEZhY3RvcnkKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWU6ICB0aW1lIHRvIGtlZXAgdGhyZWFkcyBpbiBleGNlc3Mgb2YgY29yZSBzaXplIGFsaXZlIHdoaWxlIGluYWN0aXZlICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMTgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ6ICBUaW1lVW5pdCBvZiB2YWx1ZSBpbiB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBTRUNPTkRTKQotICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiAgICAgICAgICAgICAgICAgPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luU2VydmVyIiAgICAgICAgICAgICA+TXktU2VydmVyLzEuMTwvcGFyYW1ldGVyPiAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGltZW91dCIgICAgICAgICAgID4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5IiAgICAgICAgPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiID4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiICAgICAgPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiICA+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLSAgICAKLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+Ci0gICAgPCEtLXRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlci0tPj4KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPgotICAgICAgICA8IS0tdW5jb21tZXQgZm9sbG93aW5nIHBhcmFtdGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+Ci0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj50Y3A6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tIC90cmFuc3BvcnRSZWNlaXZlciAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJ0Y3AiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFRyYW5zcG9ydFNlbmRlciIvPgotICAgIC0tPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gSWYgZm9sbG93aW5nIGlzIHNldCB0byAndHJ1ZScsIG9wdGlvbmFsIGFjdGlvbiBwYXJ0IG9mIHRoZSBDb250ZW50LVR5cGUgd2lsbCBub3QgYmUgYWRkZWQgdG8gdGhlIFNPQVAgMS4yIG1lc3NhZ2VzIC0tPgotICAgICAgICA8IS0tICA8cGFyYW1ldGVyIG5hbWU9Ik9taXRTT0FQMTJBY3Rpb24iPnRydWU8L3BhcmFtZXRlcj4gIC0tPgotICAgIDwvdHJhbnNwb3J0U2VuZGVyPgotICAgIAotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0iaHR0cHMiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEdsb2JhbCBNb2R1bGVzICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb21tZW50IHRoaXMgdG8gZGlzYWJsZSBBZGRyZXNzaW5nIC0tPgotICAgIDxtb2R1bGUgcmVmPSJhZGRyZXNzaW5nIi8+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDbHVzdGVyaW5nICAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDb25maWd1cmUgYW5kIHVuY29tbWVudCBmb2xsb3dpbmcgZm9yIHByZXBhcmluZyBBeGlzMiB0byBhIGNsdXN0ZXJlZCBlbnZpcm9ubWVudCAtLT4KLSAgICA8IS0tIAotICAgIDxjbHVzdGVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmNsdXN0ZXIudHJpYmVzLlRyaWJlc0NsdXN0ZXJNYW5hZ2VyIj4KLSAgICAJPHBhcmFtZXRlciBuYW1lPSJwYXJhbTEiPnZhbHVlMTwvcGFyYW1ldGVyPgotICAgIDwvY2x1c3Rlcj4KLSAgICAgLS0+Ci0gICAgIAotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFBoYXNlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9IkluRmxvdyI+Ci0gICAgICAgIDwhLS0gIFN5c3RlbSBwcmVkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlRyYW5zcG9ydCI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciI+Ci0gICAgICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJUcmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlZGVmaW5lZCBwaGFzZXMgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gICBBZnRlciBQb3N0ZGlzcGF0Y2ggcGhhc2UgbW9kdWxlIGF1dGhvciBvciBzZXJ2aWNlIGF1dGhvciBjYW4gYWRkIGFueSBwaGFzZSBoZSB3YW50ICAgICAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JblBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgPC9waGFzZU9yZGVyPgotICAgIDxwaGFzZU9yZGVyIHR5cGU9Ik91dEZsb3ciPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iQWRkcmVzc2luZyI+Ci0gICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkFkZHJlc3NpbmdCYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IkFkZHJlc3NpbmciLz4KLSAgICAgICAgICAgIDwvaGFuZGxlcj4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPHBoYXNlIG5hbWU9IlNlY3VyaXR5Ii8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQcmVEaXNwYXRjaCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iRGlzcGF0Y2giIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5EaXNwYXRjaFBoYXNlIj4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIi8+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUE1lc3NhZ2VCb2R5QmFzZWREaXNwYXRjaGVyIi8+Ci0KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLkhUVFBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICA8L3BoYXNlPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8IS0tICAgICAgdXNlciBjYW4gYWRkIGhpcyBvd24gcGhhc2VzIHRvIHRoaXMgYXJlYSAgLS0+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25JbkZhdWx0UGhhc2UiLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uT3V0RmF1bHRQaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUk1QaGFzZSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgIDwvcGhhc2VPcmRlcj4KLTwvYXhpc2NvbmZpZz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0NsaWVudEZvcldlYlNlcnZpY2VXaXRoTW9kdWxlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvQ2xpZW50Rm9yV2ViU2VydmljZVdpdGhNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhNWFkNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvQ2xpZW50Rm9yV2ViU2VydmljZVdpdGhNb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50Rm9yV2ViU2VydmljZVdpdGhNb2R1bGUgewotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZVdpdGhNb2R1bGUiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRFY2hvT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShwYXlsb2FkKTsKLQotCi0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZShYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcih3cml0ZXIpKTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdyaXRlci50b1N0cmluZygpKTsKLQotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvQ2xpZW50U2lkZU1vZHVsZUVuZ2FnZW1lbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRTaWRlTW9kdWxlRW5nYWdlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2I0NzM0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRTaWRlTW9kdWxlRW5nYWdlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci0KLS8qKgotICogU2FtcGxlIGZvciBlbmdhZ2VkIG1vZHVsZXMgaW4gQ2xpZW50IHNpZGUuCi0gKiBMb2dnaW5nIG1vZHVsZSBoYXMgYmVlbiB1c2VkLgotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50U2lkZU1vZHVsZUVuZ2FnZW1lbnQgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7Ci0gICAgICAgIC8vIGNyZWF0ZSB0aGlzIGZvbGRlciBhdCB5b3VyIGhvbWUuIFRoaXMgZm9sZGVyIGNvdWxkIGJlIGFueXRoaW5nCi0gICAgICAgIC8vdGhlbiBjcmVhdGUgdGhlICJtb2R1bGVzIiBmb2xkZXIKLQotICAgICAgICBGaWxlIHJlcG9zaXRvcnkgPSBuZXcgRmlsZShob21lICsgRmlsZS5zZXBhcmF0b3IgKyAiY2xpZW50LXJlcG9zaXRvcnkiKTsKLSAgICAgICAgaWYgKCFyZXBvc2l0b3J5LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJSZXBvc2l0b3J5IERvZXNub3QgRXhpc3QiKTsKLSAgICAgICAgfQotICAgICAgICAvL2NvcHkgdGhlIExvZ2dpbmdNb2R1bGUubWFyIHRvICJtb2R1bGVzIiBmb2xkZXIuCi0gICAgICAgIC8vdGhlbiBtb2RpZnkgdGhlIGF4aXMyLnhtbCB0aGF0IGlzIGdlbmVyYXRpbmcgdGhlcmUgYWNjb3JkaW5nIHRvCi0gICAgICAgIC8vcGhhc2VzIHRoYXQgYmVpbmcgaW5jbHVkZWQgaW4gdGhlICJtb2R1bGUueG1sIgotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LgotICAgICAgICAgICAgICAgIGNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0ocmVwb3NpdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuZ2V0TmFtZSgpICsgIi9heGlzMi54bWwiKTsKLSAgICAgICAgU2VydmljZUNsaWVudCBzZXJ2aWNlQ2xpZW50ID0gbmV3IFNlcnZpY2VDbGllbnQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIHNlcnZpY2VDbGllbnQuZW5nYWdlTW9kdWxlKCJMb2dnaW5nTW9kdWxlIik7Ci0gICAgfQotfQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRVdGlsLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvQ2xpZW50VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDAyZjFlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9DbGllbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VXRpbCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudCBnZXRFY2hvT01FbGVtZW50KCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlMS5vcmcvZXhhbXBsZTEiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG8iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiQXhpczIgRWNobyBTdHJpbmcgIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGluZ09NRWxlbWVudCgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZTEub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJwaW5nIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIlRleHQiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgIkF4aXMyIFBpbmcgU3RyaW5nICIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMTdlMzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9CbG9ja2luZ0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotLyoqCi0gKiBTYW1wbGUgZm9yIHN5bmNocm9ub3VzIHNpbmdsZSBjaGFubmVsIGJsb2NraW5nIHNlcnZpY2UgaW52b2NhdGlvbi4KLSAqIE1lc3NhZ2UgRXhjaGFnZSBQYXR0ZXJuIElOLU9VVAotICovCi1wdWJsaWMgY2xhc3MgRWNob0Jsb2NraW5nQ2xpZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRFY2hvT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0KLSAgICAgICAgICAgIC8vQmxvY2tpbmcgaW52b2NhdGlvbgotICAgICAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKHBheWxvYWQpOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nRHVhbENsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9CbG9ja2luZ0R1YWxDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1ZWYzOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob0Jsb2NraW5nRHVhbENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotLyoqCi0gKiBTYW1wbGUgZm9yIHN5bmNocm9ub3VzIGR1YWwgY2hhbm5lbCBibG9ja2luZyBzZXJ2aWNlIGludm9jYXRpb24uCi0gKiBNZXNzYWdlIEV4Y2hhZ2UgUGF0dGVybiBJTi1PVVQKLSAqLwotcHVibGljIGNsYXNzIEVjaG9CbG9ja2luZ0R1YWxDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IENsaWVudFV0aWwuZ2V0RWNob09NRWxlbWVudCgpOwotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8odGFyZ2V0RVBSKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNobyIpOwotICAgICAgICAgICAgLy9UaGUgYm9vbGVhbiBmbGFnIGluZm9ybXMgdGhlIGF4aXMyIGVuZ2luZSB0byB1c2UgdHdvIHNlcGFyYXRlIHRyYW5zcG9ydCBjb25uZWN0aW9uCi0gICAgICAgICAgICAvL3RvIHJldHJpZXZlIHRoZSByZXNwb25zZS4KLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRVc2VTZXBhcmF0ZUxpc3RlbmVyKHRydWUpOwotCi0gICAgICAgICAgICAvL0Jsb2NraW5nIEludm9jYXRpb24KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORyk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBzZW5kZXIuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0KLSAgICAgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICByZXN1bHQuc2VyaWFsaXplKFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlcikpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od3JpdGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvL05lZWQgdG8gY2xvc2UgdGhlIENsaWVudCBTaWRlIExpc3RlbmVyLgotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5ewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzZW5kZXIuY2xlYW51cCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvQmxvY2tpbmdXc2FCYXNlZENsaWVudC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9CbG9ja2luZ1dzYUJhc2VkQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDJjM2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9CbG9ja2luZ1dzYUJhc2VkQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLS8qKgotICogVG8gcnVuIHRoaXMgc2FtcGxlIHlvdSBoYXZlIHRvIGRlcGxveSBXc2FNYXBwaW5nU2VydmljZS5hYXIgdG8gdGhlCi0gKiBzZXJ2aWNlIGZvbGRlci4KLSAqLwotcHVibGljIGNsYXNzIEVjaG9CbG9ja2luZ1dzYUJhc2VkQ2xpZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1dzYU1hcHBpbmdUZXN0Iik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgZ2V0Qm9keSgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjCi0gICAgICAgICAgICAgICAgLmNyZWF0ZU9NTmFtZXNwYWNlKCJodHRwOi8vZXhhbXBsZTEub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0gICAgICAgIE9NRWxlbWVudCBpZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImlkIiwgb21Ocyk7Ci0gICAgICAgIGlkLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQoaWQsICJBeGlzMiIpKTsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICBvcHRpb25zLnNldFRvKHRhcmdldEVQUik7Ci0gICAgICAgIG9wdGlvbnMuc2V0VHJhbnNwb3J0SW5Qcm90b2NvbChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgIC8vQmxvY2tpbmcgaW52b2NhdGlvbiB2aWEgd3NhIG1hcHBpbmcKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShnZXRCb2R5KCkpOwotCi0gICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHJlc3VsdC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdyaXRlci50b1N0cmluZygpKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvTm9uQmxvY2tpbmdDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvTm9uQmxvY2tpbmdDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlNzhlNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvRWNob05vbkJsb2NraW5nQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkFzeW5jUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LmFzeW5jLkNhbGxiYWNrOwotCi0vKioKLSAqIFNhbXBsZSBmb3IgYXN5bmNocm9ub3VzIHNpbmdsZSBjaGFubmVsIG5vbi1ibG9ja2luZyBzZXJ2aWNlIGludm9jYXRpb24uCi0gKiBNZXNzYWdlIEV4Y2hhZ2UgUGF0dGVybiBJTi1PVVQKLSAqLwotcHVibGljIGNsYXNzIEVjaG9Ob25CbG9ja2luZ0NsaWVudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRW5kcG9pbnRSZWZlcmVuY2UgdGFyZ2V0RVBSID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKCJodHRwOi8vMTI3LjAuMC4xOjgwODAvYXhpczIvc2VydmljZXMvTXlTZXJ2aWNlIik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRFY2hvT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0KLSAgICAgICAgICAgIC8vQ2FsbGJhY2sgdG8gaGFuZGxlIHRoZSByZXNwb25zZQotICAgICAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShBc3luY1Jlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC5nZXRSZXNwb25zZUVudmVsb3BlKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAvL05vbi1CbG9ja2luZyBJbnZvY2F0aW9uCi0gICAgICAgICAgICBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgc2VuZGVyLnNldE9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBzZW5kZXIuc2VuZFJlY2VpdmVOb25CbG9ja2luZyhwYXlsb2FkLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIC8vV2FpdCB0aWxsIHRoZSBjYWxsYmFjayByZWNlaXZlcyB0aGUgcmVzcG9uc2UuCi0gICAgICAgICAgICB3aGlsZSAoIWNhbGxiYWNrLmlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9FY2hvTm9uQmxvY2tpbmdEdWFsQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNWE1YWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL0VjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuYXN5bmMuQ2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFNhbXBsZSBmb3IgYXN5bmNocm9ub3VzIGR1YWwgY2hhbm5lbCBub24tYmxvY2tpbmcgc2VydmljZSBpbnZvY2F0aW9uLgotICogTWVzc2FnZSBFeGNoYWdlIFBhdHRlcm4gSU4tT1VUCi0gKiBVbGl0bWF0ZSBhc3luY2hyb25vdXMgc2VydmljZSBpbnZvY2F0aW9uIHNhbXBsZS4KLSAqLwotcHVibGljIGNsYXNzIEVjaG9Ob25CbG9ja2luZ0R1YWxDbGllbnQgewotICAgIHByaXZhdGUgc3RhdGljIEVuZHBvaW50UmVmZXJlbmNlIHRhcmdldEVQUiA9IG5ldyBFbmRwb2ludFJlZmVyZW5jZSgiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2F4aXMyL3NlcnZpY2VzL015U2VydmljZSIpOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlbmRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcGF5bG9hZCA9IENsaWVudFV0aWwuZ2V0RWNob09NRWxlbWVudCgpOwotCi0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFRyYW5zcG9ydEluUHJvdG9jb2woQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VXNlU2VwYXJhdGVMaXN0ZW5lcih0cnVlKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNobyIpOyAgLy8gdGhpcyBpcyB0aGUgYWN0aW9uIG1hcHBpbmcgd2UgcHV0IHdpdGhpbiB0aGUgc2VydmljZS54bWwKLQotICAgICAgICAgICAgLy9DYWxsYmFjayB0byBoYW5kbGUgdGhlIHJlc3BvbnNlCi0gICAgICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEFzeW5jUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0LmdldFJlc3BvbnNlRW52ZWxvcGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vTm9uLUJsb2NraW5nIEludm9jYXRpb24KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0gICAgICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORyk7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIHNlbmRlci5zZW5kUmVjZWl2ZU5vbkJsb2NraW5nKHBheWxvYWQsIGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgLy9XYWl0IHRpbGwgdGhlIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSByZXNwb25zZS4KLSAgICAgICAgICAgIHdoaWxlICghY2FsbGJhY2suaXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9OZWVkIHRvIGNsb3NlIHRoZSBDbGllbnQgU2lkZSBMaXN0ZW5lci4KLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICBheGlzRmF1bHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNlbmRlci5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgLy9oYXZlIHRvIGlnbm9yZSB0aGlzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9NYWlsQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvTWFpbENsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMxZGQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9NYWlsQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5jbGllbnRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLS8qKgotICogVGhpcyBpcyBhIENsaWVudCBwcm9nYW0gdGhhdCBhY2Nlc3NlcyAnTXlTZXJ2aWNlJyB3ZWIgc2VydmljZSBpbiBBeGlzMiBzYW1wbGVzCi0gKiBAZGVwcmVjYXRlZCAKLSAqLwotcHVibGljIGNsYXNzIE1haWxDbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRXByID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9teXNlcnZpY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgIG9wdGlvbnMuc2V0VG8oCi0gICAgICAgICAgICAgICAgbmV3IEVuZHBvaW50UmVmZXJlbmNlKHRvRXByKSk7Ci0gICAgICAgIG9wdGlvbnMuc2V0QWN0aW9uKCJ1cm46ZWNobyIpOwotICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY0NsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KCk7Ci0KLSAgICAgICAgc2VydmljQ2xpZW50LnNldE9wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICAgICAgc2VydmljQ2xpZW50LnNlbmRSb2J1c3QoZ2V0UGF5bG9hZCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZTEub3JnL2V4YW1wbGUxIiwgImV4YW1wbGUxIik7Ci0gICAgICAgIE9NRWxlbWVudCBtZXRob2QgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJlY2hvIiwgb21Ocyk7Ci0gICAgICAgIE9NRWxlbWVudCB2YWx1ZSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIlRleHQiLCBvbU5zKTsKLSAgICAgICAgdmFsdWUuYWRkQ2hpbGQoZmFjLmNyZWF0ZU9NVGV4dCh2YWx1ZSwgIkF4aXMyIEVjaG8gU3RyaW5nICIpKTsKLSAgICAgICAgbWV0aG9kLmFkZENoaWxkKHZhbHVlKTsKLQotICAgICAgICByZXR1cm4gbWV0aG9kOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9QaW5nQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvUGluZ0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWRlYTg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9QaW5nQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50LlNlcnZpY2VDbGllbnQ7Ci0KLS8qKgotICogU2FtcGxlIGZvciBmaXJlLWFuZC1mb3JnZXQgc2VydmljZSBpbnZvY2F0aW9uCi0gKiBNZXNzYWdlIEV4Y2hhZ2UgUGF0dGVybiBJTi1Pbmx5Ci0gKi8KLXB1YmxpYyBjbGFzcyBQaW5nQ2xpZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwYXlsb2FkID0gQ2xpZW50VXRpbC5nZXRQaW5nT01FbGVtZW50KCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IHNlcnZpY2VDbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCgpOwotCi0gICAgICAgICAgICBPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotICAgICAgICAgICAgc2VydmljZUNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjpwaW5nIik7Ci0KLSAgICAgICAgICAgIHNlcnZpY2VDbGllbnQuZmlyZUFuZEZvcmdldChwYXlsb2FkKTsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogV2UgaGF2ZSB0byBib2NrIHRoaXMgdGhyZWFkIHVudGlsbCB3ZSBzZW5kIHRoZSByZXF1ZXN0ICwgdGhlIHByb2JsZW0KLSAgICAgICAgICAgICAqIGlzIGlmIHdlIGdvIG91dCBvZiB0aGUgbWFpbiB0aHJlYWQgLCB0aGVuIHJlcXVlc3Qgd29udCBzZW5kICxzbwotICAgICAgICAgICAgICogeW91IGhhdmUgdG8gd2FpdCBzb21lIHRpbWUgOikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotCi0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGF4aXNGYXVsdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1JFU1RDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvY2xpZW50cy9SRVNUQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWMxYzIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1JFU1RDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmNsaWVudHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgQ2xpZW50IHByb2dhbSB0aGF0IGFjY2Vzc2VzICdNeVNlcnZpY2UnIHdlYiBzZXJ2aWNlIGluIEF4aXMyIHNhbXBsZXMKLSAqLwotcHVibGljIGNsYXNzIFJFU1RDbGllbnQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRXByID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UodG9FcHIpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfUkVTVCwgQ29uc3RhbnRzLlZBTFVFX1RSVUUpOwotCi0gICAgICAgIFNlcnZpY2VDbGllbnQgc2VuZGVyID0gbmV3IFNlcnZpY2VDbGllbnQoKTsKLSAgICAgICAgc2VuZGVyLmVuZ2FnZU1vZHVsZShDb25zdGFudHMuTU9EVUxFX0FERFJFU1NJTkcpOwotICAgICAgICBzZW5kZXIuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IHNlbmRlci5zZW5kUmVjZWl2ZShnZXRQYXlsb2FkKCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICByZXN1bHQuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT01FbGVtZW50IGdldFBheWxvYWQoKSB7Ci0gICAgICAgIE9NRmFjdG9yeSBmYWMgPSBPTUFic3RyYWN0RmFjdG9yeS5nZXRPTUZhY3RvcnkoKTsKLSAgICAgICAgT01OYW1lc3BhY2Ugb21OcyA9IGZhYy5jcmVhdGVPTU5hbWVzcGFjZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUxLm9yZy9leGFtcGxlMSIsICJleGFtcGxlMSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZWNobyIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJUZXh0Iiwgb21Ocyk7Ci0gICAgICAgIHZhbHVlLmFkZENoaWxkKGZhYy5jcmVhdGVPTVRleHQodmFsdWUsICJBeGlzMiBFY2hvIFN0cmluZyAiKSk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0KLSAgICAgICAgcmV0dXJuIG1ldGhvZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvVENQQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2NsaWVudHMvVENQQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGUyYjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9jbGllbnRzL1RDUENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB1c2VyZ3VpZGUuY2xpZW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi0vKioKLSAqIFRoaXMgaXMgYSBDbGllbnQgcHJvZ2FtIHRoYXQgYWNjZXNzZXMgJ015U2VydmljZScgd2ViIHNlcnZpY2UgaW4gQXhpczIgc2FtcGxlcwotICovCi1wdWJsaWMgY2xhc3MgVENQQ2xpZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0VwciA9ICJ0Y3A6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UodG9FcHIpKTsKLSAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfVENQKTsKLSAgICAgICAgb3B0aW9ucy5zZXRBY3Rpb24oInVybjplY2hvIik7Ci0KLSAgICAgICAgU2VydmljZUNsaWVudCBzZW5kZXIgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICBzZW5kZXIuZW5nYWdlTW9kdWxlKENvbnN0YW50cy5NT0RVTEVfQUREUkVTU0lORyk7Ci0gICAgICAgIHNlbmRlci5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBPTUVsZW1lbnQgcmVzdWx0ID0gc2VuZGVyLnNlbmRSZWNlaXZlKGdldFBheWxvYWQoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIHJlc3VsdC5zZXJpYWxpemUod3JpdGVyKTsKLSAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGF5bG9hZCgpIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gZmFjLmNyZWF0ZU9NTmFtZXNwYWNlKAotICAgICAgICAgICAgICAgICJ0Y3A6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9NeVNlcnZpY2UiLCAiZXhhbXBsZTEiKTsKLSAgICAgICAgT01FbGVtZW50IG1ldGhvZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImVjaG8iLCBvbU5zKTsKLSAgICAgICAgT01FbGVtZW50IHZhbHVlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiVGV4dCIsIG9tTnMpOwotICAgICAgICB2YWx1ZS5hZGRDaGlsZChmYWMuY3JlYXRlT01UZXh0KHZhbHVlLCAiQXhpczIgRWNobyBTdHJpbmcgIikpOwotICAgICAgICBtZXRob2QuYWRkQ2hpbGQodmFsdWUpOwotCi0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMS9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUxL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0MmI1Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUxL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iTXlTZXJ2aWNlIj4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIFRoaXMgaXMgYSBzYW1wbGUgV2ViIFNlcnZpY2Ugd2l0aCB0d28gb3BlcmF0aW9ucyxlY2hvIGFuZCBwaW5nLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnVzZXJndWlkZS5leGFtcGxlMS5NeVNlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46ZWNobzwvYWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InBpbmciPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk9ubHlNZXNzYWdlUmVjZWl2ZXIiLz4KLSAgICAgICAgPGFjdGlvbk1hcHBpbmc+dXJuOnBpbmc8L2FjdGlvbk1hcHBpbmc+Ci0gICAgPC9vcGVyYXRpb24+Ci08L3NlcnZpY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMS9NeVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTEvTXlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YmYzMWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMS9NeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHVzZXJndWlkZS5leGFtcGxlMTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogVXNlcjogSmFsaXlhCi0gKiBEYXRlOiBKdW4gMiwgMjAwNQotICogVGltZTogMjoxNzo1OCBQTQotICovCi1wdWJsaWMgY2xhc3MgTXlTZXJ2aWNlIHsKLSAgICBwdWJsaWMgT01FbGVtZW50IGVjaG8oT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL1ByYXBhcmluZyB0aGUgT01FbGVtZW50IHNvIHRoYXQgaXQgY2FuIGJlIGF0dGFjaGVkIHRvIGFub3RoZXIgT00gVHJlZS4KLSAgICAgICAgLy9GaXJzdCB0aGUgT01FbGVtZW50IHNob3VsZCBiZSBjb21wbGV0ZWx5IGJ1aWxkIGluIGNhc2UgaXQgaXMgbm90IGZ1bGx5IGJ1aWx0IGFuZCBzdGlsbAotICAgICAgICAvL3NvbWUgb2YgdGhlIHhtbCBpcyBpbiB0aGUgc3RyZWFtLgotICAgICAgICBlbGVtZW50LmJ1aWxkKCk7Ci0gICAgICAgIC8vU2Vjb25kbHkgdGhlIE9NRWxlbWVudCBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgY3VycmVudCBPTVRyZWUgc28gdGhhdCBpdCBjYW4gYmUgYXR0YWNoZWQKLSAgICAgICAgLy9zb21lIG90aGVyIE9NIFRyZWUuIE9uY2UgZGV0YWNoZWQgdGhlIE9tVHJlZSB3aWxsIHJlbW92ZSBpdHMgY29ubmVjdGlvbnMgdG8gdGhpcyBPTUVsZW1lbnQuCi0gICAgICAgIGVsZW1lbnQuZGV0YWNoKCk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBpbmcoT01FbGVtZW50IGVsZW1lbnQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICAvL0RvIHNvbWUgcHJvY2Vzc2luZwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwaW5nRihPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEF4aXNGYXVsdHsKLSAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiRmF1bHQgYmVpbmcgdGhyb3duIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMi9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUyL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2U3Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUyL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iTXlTZXJ2aWNlV2l0aE1vZHVsZSI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIGlzIGEgc2FtcGxlIFdlYiBTZXJ2aWNlIHdpdGggYSBsb2dnaW5nIG1vZHVsZSBlbmdhZ2VkLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPG1vZHVsZSByZWY9InNhbXBsZS1sb2dnaW5nIi8+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnVzZXJndWlkZS5leGFtcGxlMi5NeVNlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8iPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46ZWNobzwvYWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9InBpbmciPgotICAgICAgICA8bWVzc2FnZVJlY2VpdmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46cGluZzwvYWN0aW9uTWFwcGluZz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTIvTXlTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUyL015U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJhM2YyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTIvTXlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmV4YW1wbGUyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBKYWxpeWEKLSAqIERhdGU6IEp1biAyLCAyMDA1Ci0gKiBUaW1lOiAyOjE3OjU4IFBNCi0gKi8KLXB1YmxpYyBjbGFzcyBNeVNlcnZpY2UgewotICAgIHB1YmxpYyBPTUVsZW1lbnQgZWNobyhPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vUHJhcGFyaW5nIHRoZSBPTUVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW5vdGhlciBPTSBUcmVlLgotICAgICAgICAvL0ZpcnN0IHRoZSBPTUVsZW1lbnQgc2hvdWxkIGJlIGNvbXBsZXRlbHkgYnVpbGQgaW4gY2FzZSBpdCBpcyBub3QgZnVsbHkgYnVpbHQgYW5kIHN0aWxsCi0gICAgICAgIC8vc29tZSBvZiB0aGUgeG1sIGlzIGluIHRoZSBzdHJlYW0uCi0gICAgICAgIGVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgLy9TZWNvbmRseSB0aGUgT01FbGVtZW50IHNob3VsZCBiZSBkZXRhY2hlZCBmcm9tIHRoZSBjdXJyZW50IE9NVHJlZSBzbyB0aGF0IGl0IGNhbiBiZSBhdHRhY2hlZAotICAgICAgICAvL3NvbWUgb3RoZXIgT00gVHJlZS4gT25jZSBkZXRhY2hlZCB0aGUgT21UcmVlIHdpbGwgcmVtb3ZlIGl0cyBjb25uZWN0aW9ucyB0byB0aGlzIE9NRWxlbWVudC4KLSAgICAgICAgZWxlbWVudC5kZXRhY2goKTsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGluZyhPTUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vRG8gc29tZSBwcm9jZXNzaW5nCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMy9NRVRBLUlORi9zZXJ2aWNlcy54bWwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiN2E3My4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2V4YW1wbGUzL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2VHcm91cD4KLSAgICA8c2VydmljZSBuYW1lPSJXc2FNYXBwaW5nVGVzdCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNhbXBsZSB0byB2aWEgV1NBIE1hcHBpbmcKLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnVzZXJndWlkZS5leGFtcGxlMy5NeVNlcnZpY2U8L3BhcmFtZXRlcj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvIj4KLSAgICAgICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIKLSAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLlJhd1hNTElOT3V0TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8YWN0aW9uTWFwcGluZz51cm46ZWNobzwvYWN0aW9uTWFwcGluZz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9zZXJ2aWNlPgotPC9zZXJ2aWNlR3JvdXA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMy9NeVNlcnZpY2UuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvZXhhbXBsZTMvTXlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjU0YWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy91c2VyZ3VpZGUvc3JjL3VzZXJndWlkZS9leGFtcGxlMy9NeVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIHVzZXJndWlkZS5leGFtcGxlMzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE15U2VydmljZSB7Ci0gICAgcHVibGljIE9NRWxlbWVudCBlY2hvKE9NRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIC8vUHJhcGFyaW5nIHRoZSBPTUVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgYXR0YWNoZWQgdG8gYW5vdGhlciBPTSBUcmVlLgotICAgICAgICAgICAgLy9GaXJzdCB0aGUgT01FbGVtZW50IHNob3VsZCBiZSBjb21wbGV0ZWx5IGJ1aWxkIGluIGNhc2UgaXQgaXMgbm90IGZ1bGx5IGJ1aWx0IGFuZCBzdGlsbAotICAgICAgICAgICAgLy9zb21lIG9mIHRoZSB4bWwgaXMgaW4gdGhlIHN0cmVhbS4KLSAgICAgICAgICAgIGVsZW1lbnQuYnVpbGQoKTsKLSAgICAgICAgICAgIC8vU2Vjb25kbHkgdGhlIE9NRWxlbWVudCBzaG91bGQgYmUgZGV0YWNoZWQgZnJvbSB0aGUgY3VycmVudCBPTVRyZWUgc28gdGhhdCBpdCBjYW4gYmUgYXR0YWNoZWQKLSAgICAgICAgICAgIC8vc29tZSBvdGhlciBPTSBUcmVlLiBPbmNlIGRldGFjaGVkIHRoZSBPbVRyZWUgd2lsbCByZW1vdmUgaXRzIGNvbm5lY3Rpb25zIHRvIHRoaXMgT01FbGVtZW50LgotICAgICAgICAgICAgZWxlbWVudC5kZXRhY2goKTsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwotICAgICAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9Mb2dIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2xvZ2dpbmdtb2R1bGUvTG9nSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjY3YzU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9Mb2dIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHVzZXJndWlkZS5sb2dnaW5nbW9kdWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1wdWJsaWMgY2xhc3MgTG9nSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIEhhbmRsZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMb2dIYW5kbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52b2NhdGlvblJlc3BvbnNlIGludm9rZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbG9nLmluZm8obXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmV2b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHsKLSAgICAgICAgbG9nLmluZm8obXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9Mb2dnaW5nTW9kdWxlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2xvZ2dpbmdtb2R1bGUvTG9nZ2luZ01vZHVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdiMGMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9Mb2dnaW5nTW9kdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgdXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotcHVibGljIGNsYXNzIExvZ2dpbmdNb2R1bGUgaW1wbGVtZW50cyBNb2R1bGUgewotCi0KLSAgICAvLyBpbml0aWFsaXplIHRoZSBtb2R1bGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQsIEF4aXNNb2R1bGUgbW9kdWxlKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgLy8gc2h1dGRvd24gdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBvbGljeU5hbWVzcGFjZXMoKSB7Ci0gICAgCXJldHVybiBudWxsOwkKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseVBvbGljeShQb2xpY3kgcG9saWN5LCBBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0JCSAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3VzZXJndWlkZS9zcmMvdXNlcmd1aWRlL2xvZ2dpbmdtb2R1bGUvTUVUQS1JTkYvbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjJlNDcxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdXNlcmd1aWRlL3NyYy91c2VyZ3VpZGUvbG9nZ2luZ21vZHVsZS9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9InNhbXBsZS1sb2dnaW5nIiBjbGFzcz0idXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGUuTG9nZ2luZ01vZHVsZSI+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iSW5GbG93TG9nSGFuZGxlciIgY2xhc3M9InVzZXJndWlkZS5sb2dnaW5nbW9kdWxlLkxvZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJsb2dnaW5nUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvSW5GbG93PgotCi0gICAgPE91dEZsb3c+Ci0gICAgICAgIDxoYW5kbGVyIG5hbWU9Ik91dEZsb3dMb2dIYW5kbGVyIiBjbGFzcz0idXNlcmd1aWRlLmxvZ2dpbmdtb2R1bGUuTG9nSGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9ImxvZ2dpbmdQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9PdXRGbG93PgotCi0gICAgPE91dEZhdWx0Rmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iRmF1bHRPdXRGbG93TG9nSGFuZGxlciIgY2xhc3M9InVzZXJndWlkZS5sb2dnaW5nbW9kdWxlLkxvZ0hhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJsb2dnaW5nUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0RmF1bHRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJGYXVsdEluRmxvd0xvZ0hhbmRsZXIiIGNsYXNzPSJ1c2VyZ3VpZGUubG9nZ2luZ21vZHVsZS5Mb2dIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0ibG9nZ2luZ1BoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmF1bHRGbG93PgotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vUkVBRE1FLnR4dCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y4MDk0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotU2FtcGxlOiBWZXJzaW9uDQotPT09PT09PT09PT09PT09DQotDQotSW50cm9kdWN0aW9uDQotPT09PT09PT09PT09DQotDQotQSBzaW1wbGUgc2VydmljZSB0aGF0IHJldHVybnMgYSB0ZXh0IHdoaWNoIGNvbnRhaW5zIHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgdGhlIGJ1aWx0IA0KLWRhdGUgb2YgdGhlIEF4aXMyIERpc3RyaWJ1dGlvbiB1c2VkLg0KLQ0KLUluIG90aGVyIHdvcmRzLCB0aGlzIGlzIGEgc2ltcGxlIHNlcnZpY2UgdXNlZCBieSBtYW55IHRvIHRlc3Qgd2hldGhlciB0aGUgZGlzdHJpYnV0aW9uIHRoZXkgZ290IGlzIHNldHVwIA0KLWFuZCB3b3JraW5nIHByb3Blcmx5LiBJdCBjb250YWlucyBhIHNpbmdsZSBtZXRob2QgdGhhdCBzaW1wbHkgcmV0dXJucyB2ZXJzaW9uIGFuZCBidWlsdCANCi1kYXRlIG9mIHRoZSBBeGlzMiBkaXN0cmlidXRpb24gdXNlZC4NCi0NCi0NCi1QcmUtUmVxdWlzaXRlcw0KLT09PT09PT09PT09PT09DQotDQotQXBhY2hlIEFudCAxLjYuMiBvciBsYXRlcg0KLQ0KLVJ1bm5pbmcgdGhlIFNhbXBsZQ0KLT09PT09PT09PT09PT09PT09PQ0KLQ0KLVR5cGUgJGFudCBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy92ZXJzaW9uDQotDQotDQotSGVscA0KLT09PT0NCi1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2OWEyZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJ2ZXJzaW9uIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJnZW5lcmF0ZS5zZXJ2aWNlIj4KLQkKLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIiIHZhbHVlPSJidWlsZCIgLz4KLQkKLQk8cHJvcGVydHkgbmFtZT0iZGVzdC5kaXIuY2xhc3NlcyIgdmFsdWU9IiR7ZGVzdC5kaXJ9L2NsYXNzZXMiIC8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0JCi0JPHByb3BlcnR5IG5hbWU9InJlcG9zaXRvcnkucGF0aCIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeS9zZXJ2aWNlcyIgLz4KLQkKLQk8cGF0aCBpZD0iYnVpbGQuY2xhc3MucGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQk8L3BhdGg+Ci0JCi0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3QuZGlyfSIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZXBhcmUiPgotCQkKLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpcn0iIC8+Ci0JCQotCQk8bWtkaXIgZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiAvPgotCQkKLQkJPG1rZGlyIGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORiIgLz4KLQkKLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLnNlcnZpY2UiIGRlcGVuZHM9ImNsZWFuLHByZXBhcmUiPgotCQkKLQkJPGNvcHkgZmlsZT0ic3JjL3NhbXBsZS9heGlzdmVyc2lvbi9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIHRvZmlsZT0iJHtkZXN0LmRpci5jbGFzc2VzfS9NRVRBLUlORi9zZXJ2aWNlcy54bWwiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQkJCi0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtkZXN0LmRpci5jbGFzc2VzfSIgaW5jbHVkZXM9InNhbXBsZS9heGlzdmVyc2lvbi8qKiI+Ci0JCQk8Y2xhc3NwYXRoIHJlZmlkPSJidWlsZC5jbGFzcy5wYXRoIiAvPgotCQk8L2phdmFjPgotCQkKLQkJPGphciBiYXNlZGlyPSIke2Rlc3QuZGlyLmNsYXNzZXN9IiBkZXN0ZmlsZT0iJHtkZXN0LmRpcn0vdmVyc2lvbi5hYXIiIC8+Ci0JCQotCQk8Y29weSBmaWxlPSIke2Rlc3QuZGlyfS92ZXJzaW9uLmFhciIgdG9maWxlPSIke3JlcG9zaXRvcnkucGF0aH0vdmVyc2lvbi5hYXIiIG92ZXJ3cml0ZT0idHJ1ZSIgLz4KLQkKLQk8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9wb20ueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliM2UxYTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+dmVyc2lvbjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmFhcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFZlcnNpb24gU2VydmljZTwvbmFtZT4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb248L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb248L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbjwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS40PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWFyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2VydmljZXNYbWxGaWxlPiR7YmFzZWRpcn0vc3JjL3NhbXBsZS9heGlzdmVyc2lvbi9NRVRBLUlORi9zZXJ2aWNlcy54bWw8L3NlcnZpY2VzWG1sRmlsZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3NyYy9zYW1wbGUvYXhpc3ZlcnNpb24vTUVUQS1JTkYvc2VydmljZXMueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3NyYy9zYW1wbGUvYXhpc3ZlcnNpb24vTUVUQS1JTkYvc2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODM0OTc2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvdmVyc2lvbi9zcmMvc2FtcGxlL2F4aXN2ZXJzaW9uL01FVEEtSU5GL3NlcnZpY2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHNlcnZpY2UgbmFtZT0iVmVyc2lvbiI+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBUaGlzIHNlcnZpY2UgaXMgdG8gZ2V0IHRoZSBydW5uaW5nIEF4aXMgdmVyc2lvbgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJTZXJ2aWNlQ2xhc3MiPnNhbXBsZS5heGlzdmVyc2lvbi5WZXJzaW9uPC9wYXJhbWV0ZXI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJnZXRWZXJzaW9uIj4KLSAgICA8bWVzc2FnZVJlY2VpdmVyICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlciIgLz4KLSAgICA8L29wZXJhdGlvbj4KLTwvc2VydmljZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vc3JjL3NhbXBsZS9heGlzdmVyc2lvbi9WZXJzaW9uLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3ZlcnNpb24vc3JjL3NhbXBsZS9heGlzdmVyc2lvbi9WZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzdlZDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy92ZXJzaW9uL3NyYy9zYW1wbGUvYXhpc3ZlcnNpb24vVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUuYXhpc3ZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uIHsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuICJIaSAtIHRoZSBBeGlzMiB2ZXJzaW9uIGlzICIgKyBvcmcuYXBhY2hlLmF4aXMyLlZlcnNpb24uZ2V0VmVyc2lvblRleHQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMvd3NkbC9BeGlzMlNhbXBsZURvY0xpdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTZiZWY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvd3NkbC9BeGlzMlNhbXBsZURvY0xpdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly91c2VyZ3VpZGUuYXhpczIuYXBhY2hlLm9yZy9BeGlzMlNhbXBsZURvY0xpdCIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNkMT0iaHR0cDovL3VzZXJndWlkZS5heGlzMi5hcGFjaGUub3JnL3hzZCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdXNlcmd1aWRlLmF4aXMyLmFwYWNoZS5vcmcvQXhpczJTYW1wbGVEb2NMaXQiIG5hbWU9IkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSI+Ci0JPHR5cGVzPgotCQk8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3VzZXJndWlkZS5heGlzMi5hcGFjaGUub3JnL3hzZCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZzdHJpbmdfbGl0ZXJhbCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIiBuYW1lPSJzdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQkJCTxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLQkJCQk8YWxsPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L2FsbD4KLQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9JbnRQYXJhbSIgdHlwZT0ieHNkOmludCIvPgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5UGFyYW0iIHR5cGU9InhzZDE6QXJyYXlPZnN0cmluZ19saXRlcmFsIi8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXR1cm4iIHR5cGU9InhzZDE6QXJyYXlPZnN0cmluZ19saXRlcmFsIi8+Ci0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0UGFyYW0iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFJldHVybiIgdHlwZT0ieHNkMTpTT0FQU3RydWN0Ii8+Ci0JCTwvc2NoZW1hPgotCTwvdHlwZXM+Ci0JPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZyI+Ci0JCTxwYXJ0IG5hbWU9ImEiIGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ1BhcmFtIi8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nUmV0dXJuIi8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0JCTxwYXJ0IG5hbWU9ImEiIGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ0FycmF5UGFyYW0iLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ0FycmF5UmV0dXJuIi8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3QiPgotCQk8cGFydCBuYW1lPSJhIiBlbGVtZW50PSJ4c2QxOmVjaG9TdHJ1Y3RQYXJhbSIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJyZXN1bHQiIGVsZW1lbnQ9InhzZDE6ZWNob1N0cnVjdFJldHVybiIvPgotCTwvbWVzc2FnZT4KLQk8cG9ydFR5cGUgbmFtZT0iQXhpczJTYW1wbGVEb2NMaXRQb3J0VHlwZSI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0JCQk8aW5wdXQgbmFtZT0iZWNob1N0cmluZyIgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciLz4KLQkJCTxvdXRwdXQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0JCQk8aW5wdXQgbmFtZT0iZWNob1N0cmluZ0FycmF5IiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5Ii8+Ci0JCQk8b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdCI+Ci0JCQk8aW5wdXQgbmFtZT0iZWNob1N0cnVjdCIgbWVzc2FnZT0idG5zOmVjaG9TdHJ1Y3QiLz4KLQkJCTxvdXRwdXQgbmFtZT0iZWNob1N0cnVjdFJlc3BvbnNlIiBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdFJlc3BvbnNlIi8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvcG9ydFR5cGU+Ci0JPGJpbmRpbmcgbmFtZT0iQXhpczJTYW1wbGVEb2NMaXRQb3J0QmluZGluZyIgdHlwZT0idG5zOkF4aXMyU2FtcGxlRG9jTGl0UG9ydFR5cGUiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJlY2hvU3RyaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdXNlcmd1aWRlLmF4aXMyLmFwYWNoZS5vcmcvQXhpczJTYW1wbGVEb2NMaXQiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly91c2VyZ3VpZGUuYXhpczIuYXBhY2hlLm9yZy9BeGlzMlNhbXBsZURvY0xpdCIvPgotCQkJPC9vdXRwdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iZWNob1N0cmluZ0FycmF5IiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdXNlcmd1aWRlLmF4aXMyLmFwYWNoZS5vcmcvQXhpczJTYW1wbGVEb2NMaXQiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly91c2VyZ3VpZGUuYXhpczIuYXBhY2hlLm9yZy9BeGlzMlNhbXBsZURvY0xpdCIvPgotCQkJPC9vdXRwdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3QiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249ImVjaG9TdHJ1Y3QiIHN0eWxlPSJkb2N1bWVudCIvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly91c2VyZ3VpZGUuYXhpczIuYXBhY2hlLm9yZy9BeGlzMlNhbXBsZURvY0xpdCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3VzZXJndWlkZS5heGlzMi5hcGFjaGUub3JnL0F4aXMyU2FtcGxlRG9jTGl0Ii8+Ci0JCQk8L291dHB1dD4KLQkJPC9vcGVyYXRpb24+Ci0JPC9iaW5kaW5nPgotCTxzZXJ2aWNlIG5hbWU9IkF4aXMyU2FtcGxlRG9jTGl0U2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IkF4aXMyU2FtcGxlRG9jTGl0UG9ydCIgYmluZGluZz0idG5zOkF4aXMyU2FtcGxlRG9jTGl0UG9ydEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3VzZXJndWlkZS5heGlzMi5hcGFjaGUub3JnL3N0a3YzL3dzZGwvQXhpczJTYW1wbGVEb2NMaXQud3NkbCIvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvd3NkbC9wZXJmLndzZGwgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3dzZGwvcGVyZi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNmNGM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMvd3NkbC9wZXJmLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW1wbD0iaHR0cDovL3BlcmYuc2FtcGxlcyIgeG1sbnM6aW50Zj0iaHR0cDovL3BlcmYuc2FtcGxlcyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9wZXJmLnNhbXBsZXMiPgotCTx3c2RsOnR5cGVzPgotCQk8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9wZXJmLnNhbXBsZXMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0JCQk8ZWxlbWVudCBuYW1lPSJpbnB1dEVsZW1lbnQiPgotCQkJCTxjb21wbGV4VHlwZT4KLQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iaXRlbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3NlcXVlbmNlPgotCQkJCTwvY29tcGxleFR5cGU+Ci0JCQk8L2VsZW1lbnQ+Ci0JCQk8ZWxlbWVudCBuYW1lPSJvdXRwdXRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCTwvc2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImhhbmRsZVN0cmluZ0FycmF5UmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Im91dHB1dCIgZWxlbWVudD0iaW1wbDpvdXRwdXRFbGVtZW50Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJoYW5kbGVTdHJpbmdBcnJheVJlcXVlc3QiPgotCQk8d3NkbDpwYXJ0IG5hbWU9ImlucHV0IiBlbGVtZW50PSJpbXBsOmlucHV0RWxlbWVudCIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlBlcmZQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJoYW5kbGVTdHJpbmdBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0Ij4KLQkJCTx3c2RsOmlucHV0IG5hbWU9ImhhbmRsZVN0cmluZ0FycmF5UmVxdWVzdCIgbWVzc2FnZT0iaW1wbDpoYW5kbGVTdHJpbmdBcnJheVJlcXVlc3QiLz4KLQkJCTx3c2RsOm91dHB1dCBuYW1lPSJoYW5kbGVTdHJpbmdBcnJheVJlc3BvbnNlIiBtZXNzYWdlPSJpbXBsOmhhbmRsZVN0cmluZ0FycmF5UmVzcG9uc2UiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6YmluZGluZyBuYW1lPSJQZXJmb3JtYW5jZVNvYXBCaW5kaW5nIiB0eXBlPSJpbXBsOlBlcmZQb3J0VHlwZSI+Ci0JCTx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImhhbmRsZVN0cmluZ0FycmF5Ij4KLQkJCTx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaGFuZGxlU3RyaW5nQXJyYXkiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlBlcmZTb2FwU2VydmljZSI+Ci0JCTx3c2RsOnBvcnQgbmFtZT0iUGVyZm9ybWFuY2UiIGJpbmRpbmc9ImltcGw6UGVyZm9ybWFuY2VTb2FwQmluZGluZyI+Ci0JCQk8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F4aXMyL3NlcnZpY2VzL1BlcmZQb3J0VHlwZSIvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL1JFQURNRS50eHQgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRhNzNmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1TYW1wbGUgZm9yIFlhaG9vIC0gU2VhcmNoIC0gSlNPTgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUludHJvZHVjdGlvbgotPT09PT09PT09PT09Ci0KLUF4aXMyIGNsaWVudCBBUEkgaGFzIGZhY2lsaXRpZXMgdG8gYWNjZXB0IHJlc3BvbnNlcyBpbiBKU09OLgotCi1ZYWhvbyBwcm92aWRlcyBhbiBBUEkgdG8gY2FsbCBpdHMgc2VhcmNoIHNlcnZpY2UgYW5kIHJldHJpZXZlIEpTT04gcmVzcG9uc2VzLiBUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNhbGwgWWFob28KLXNlYXJjaCBzZXJ2aWNlIHVzaW5nIGFuIEF4aXMyIGNsaWVudCB3aGljaCBhY2NlcHRzIGEgSlNPTiByZXNwb25zZS4KLQotUHJlLVJlcXVpc2l0ZXMKLT09PT09PT09PT09PT09Ci0KLUFwYWNoZSBBbnQgMS42LjIgb3IgbGF0ZXIKLQotUnVubmluZyBUaGUgU2FtcGxlCi09PT09PT09PT09PT09PT09PT0KLQotVHlwZSAiYW50IiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy95YWhvb2pzb25zZWFyY2ggZGlyZWN0b3J5LgotCi1IZWxwCi09PT09Ci1QbGVhc2UgY29udGFjdCBheGlzLXVzZXIgbGlzdCAoYXhpcy11c2VyQHdzLmFwYWNoZS5vcmcpIGlmIHlvdSBoYXZlIGFueSB0cm91YmxlIHJ1bm5pbmcgdGhlIHNhbXBsZS4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL2J1aWxkLnhtbCBiLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4Zjc4MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IllhaG9vSlNPTlNlYXJjaFNhbXBsZSIgZGVmYXVsdD0icnVuLmNsaWVudCI+Ci0JPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLmhvbWUiIHZhbHVlPSIuLi8uLi8iIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImF4aXMyLnJlcG8iIHZhbHVlPSIke2F4aXMyLmhvbWV9L3JlcG9zaXRvcnkiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImJ1aWxkIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJjbGllbnQuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgLz4KLQk8cGF0aCBpZD0iYXhpcy5jbGFzc3BhdGgiPgotCQk8ZmlsZXNldCBkaXI9IiR7YXhpczIuaG9tZX0vbGliIj4KLQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotCQk8L2ZpbGVzZXQ+Ci0JCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQveWFob29KU09OU2VhcmNoLmphciIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgotCQk8bWtkaXIgZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iIC8+Ci0JCTwhLS0gQ29tcGlsZSBjbGllbnQgLS0+Ci0JCTxqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iJHtjbGllbnQuY2xhc3Nlcy5kaXJ9Ij4KLQkJCTxjbGFzc3BhdGggcmVmaWQ9ImF4aXMuY2xhc3NwYXRoIiAvPgotCQk8L2phdmFjPgotCQk8amFyIGRlc3RmaWxlPSIke2J1aWxkLmRpcn0veWFob29KU09OU2VhcmNoLmphciI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgotCQk8L2phcj4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InJ1bi5jbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUiPgotCQk8amF2YSBjbGFzc25hbWU9InNhbXBsZS55YWhvb3NlcnZpY2VzLkpTT05TZWFyY2guSlNPTlNlYXJjaENsaWVudCIgY2xhc3NwYXRocmVmPSJheGlzLmNsYXNzcGF0aCIgZm9yaz0idHJ1ZSI+Ci0JCQk8anZtYXJnIHZhbHVlPSItRGF4aXMyLnJlcG89JHtheGlzMi5yZXBvfSIgLz4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iY2xlYW4iPgotCQk8ZGVsZXRlIGRpcj0iYnVpbGQiIC8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9yZXNvdXJjZXMvYXhpczIueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvcmVzb3VyY2VzL2F4aXMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5ZDczNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9yZXNvdXJjZXMvYXhpczIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLSAKLTxheGlzY29uZmlnIG5hbWU9IkF4aXNKYXZhMi4wIj4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdGRlcGxveW1lbnQiPnRydWU8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImhvdHVwZGF0ZSI+ZmFsc2U8L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImVuYWJsZU1UT00iPmZhbHNlPC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJlbmFibGVTd0EiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmaWxlIGNhY2hpbmcgZm9yIGF0dGFjaG1lbnRzIC0tPgotICAgIDwhLS1wYXJhbWV0ZXIgbmFtZT0iY2FjaGVBdHRhY2htZW50cyI+dHJ1ZTwvcGFyYW1ldGVyPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iYXR0YWNobWVudERJUiI+PC9wYXJhbWV0ZXI+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJzaXplVGhyZXNob2xkIj40MDAwPC9wYXJhbWV0ZXItLT4KLQotICAgIDwhLS1UaGlzIHdpbGwgZ2l2ZSBvdXQgdGhlIHRpbW91dCBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0cywgaW4gc2Vjb25kcy0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iQ29uZmlnQ29udGV4dFRpbWVvdXRJbnRlcnZhbCI+MzA8L3BhcmFtZXRlcj4KLQotICAgIDwhLS1EdXJpbmcgYSBmYXVsdCwgc3RhY2t0cmFjZSBjYW4gYmUgc2VudCB3aXRoIHRoZSBmYXVsdCBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGZsYWcgd2lsbCBjb250cm9sIC0tPgotICAgIDwhLS10aGF0IGJlaGF2aW91ci4tLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InNlbmRTdGFja3RyYWNlRGV0YWlsc1dpdGhGYXVsdHMiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tSWYgdGhlcmUgYXJlbid0IGFueSBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gZmluZCBvdXQgdGhlIGZhdWx0IHJlYXNvbiwgd2Ugc2V0IHRoZSBtZXNzYWdlIG9mIHRoZSBleHBjZXRpb24tLT4KLSAgICA8IS0tYXMgdGhlIGZhdWx0cmVhc29uL1JlYXNvbi4gQnV0IHdoZW4gYSBmYXVsdCBpcyB0aHJvd24gZnJvbSBhIHNlcnZpY2Ugb3Igc29tZSB3aGVyZSwgaXQgd2lsbCBiZSAtLT4KLSAgICA8IS0td3JhcHBlZCBieSBkaWZmZXJlbnQgbGV2ZWxzLiBEdWUgdG8gdGhpcyB0aGUgaW5pdGlhbCBleGNlcHRpb24gbWVzc2FnZSBjYW4gYmUgbG9zdC4gSWYgdGhpcyBmbGFnLS0+Ci0gICAgPCEtLWlzIHNldCB0aGVuLCBBeGlzMiB0cmllcyB0byBnZXQgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgc2V0IGl0cyBtZXNzYWdlIGFzIHRoZSBmYXVsdHJlYXNvbi9SZWFzb24uLS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJEcmlsbERvd25Ub1Jvb3RDYXVzZUZvckZhdWx0UmVhc29uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPHBhcmFtZXRlciBuYW1lPSJ1c2VyTmFtZSI+YWRtaW48L3BhcmFtZXRlcj4KLSAgICA8cGFyYW1ldGVyIG5hbWU9InBhc3N3b3JkIj5heGlzMjwvcGFyYW1ldGVyPgotCi0gICAgPCEtLVRvIG92ZXJyaWRlIHJlcG9zaXRvcnkvc2VydmljZXMgeW91IG5lZWQgdG8gdW5jb21tZW50IGZvbGxvd2luZyBwYXJhbWV0ZXIgYW5kIHZhbHVlIFNIT1VMRCBiZSBhYnNvbHV0ZSBmaWxlIHBhdGguLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iU2VydmljZXNEaXJlY3RvcnkiPnNlcnZpY2U8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tVG8gb3ZlcnJpZGUgcmVwb3NpdG9yeS9tb2R1bGVzIHlvdSBuZWVkIHRvIHVuY29tbWVudCBmb2xsb3dpbmcgcGFyYW1ldGVyIGFuZCB2YWx1ZSBTSE9VTEQgYmUgYWJzb2x1dGUgZmlsZSBwYXRoLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iTW9kdWxlc0RpcmVjdG9yeSI+bW9kdWxlczwvcGFyYW1ldGVyPi0tPgotCi0KLQotICAgIDwhLS1Gb2xsb3dpbmcgcGFyYW1zIHdpbGwgc2V0IHRoZSBwcm9wZXIgY29udGV4dCBwYXRocyBmb3IgaW52b2NhdGlvbnMuIEFsbCB0aGUgZW5kcG9pbnRzIHdpbGwgaGF2ZSBhIGNvbW1vbnMgY29udGV4dC0tPgotICAgIDwhLS1yb290IHdoaWNoIGNhbiBjb25maWd1cmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29udGV4dFJvb3QgcGFyYW1ldGVyLS0+Ci0gICAgPCEtLTxwYXJhbWV0ZXIgbmFtZT0iY29udGV4dFJvb3QiPmF4aXMyPC9wYXJhbWV0ZXI+LS0+Ci0KLSAgICA8IS0tT3VyIEhUVFAgZW5kcG9pbnRzIGNhbiBoYW5kbGUgYm90aCBSRVNUIGFuZCBTT0FQLiBGb2xsb3dpbmcgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBkaXN0aW5naXVzaCB0aG9zZSBlbmRwb2ludHMtLT4KLSAgICA8IS0tSW4gY2FzZSBvZiBhIHNlcnZsZXQsIGlmIHlvdSBjaGFuZ2UgdGhpcyB5b3UgaGF2ZSB0byBtYW51YWxseSBjaGFuZ2UgdGhlIHNldHRpbmdzIG9mIHlvdXIgc2VydmxldCBjb250YWluZXIgdG8gbWFwIHRoaXMgLS0+Ci0gICAgPCEtLWNvbnRleHQgcGF0aCB0byBwcm9wZXIgQXhpczIgc2VydmxldHMtLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJzZXJ2aWNlUGF0aCI+c2VydmljZXM8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPHBhcmFtZXRlciBuYW1lPSJyZXN0UGF0aCI+cmVzdDwvcGFyYW1ldGVyPi0tPgotCi0KLSAgICA8IS0tU2V0IHRoZSBmbGFnIHRvIHRydWUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRyYW5zcG9ydCBsZXZlbCBzZXNzaW9uIG1hbmdtZW50LS0+Ci0gICAgPHBhcmFtZXRlciBuYW1lPSJtYW5hZ2VUcmFuc3BvcnRTZXNzaW9uIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLUZvbGxvd2luZyB0d28gcGFyYW1ldGVycyB3aWxsIGJlIHVzZWQgdG8gaGFuZGxlIFJFU1QgaW4gQXhpczIuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgbWFrZSBBeGlzMiB0byBoYXZlIHR3by0tPgotICAgIDwhLS1kaWZmZXJlbnQgZW5kcG9pbnRzLCBvbmUgZm9yIFJFU1QgKEF4aXNSRVNUU2VydmxldCkgb25lIGZvciBTT0FQIG1lc3NhZ2UgaGFuZGxpbmcgKEF4aXNTZXJ2bGV0KS4gQnV0IGZvbGxvd2luZy0tPgotICAgIDwhLS1wYXJhbWV0ZXJzIGhlbHAgdG8gdHdlYWsgdGhlIG1lc3NhZ2UgaGFuZGxpbmcgb2YgdHdvIG1haW4gc2VydmxldHMuIC0tPgotCi0gICAgPCEtLSBJZiB0aGUgZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCBpcyB0cnVlLCB0aGVuIEF4aXMyTWFpblNlcnZsZXQgd2lsbCBoYW5kbGUgYm90aCBTT0FQIGFuZCBSRVNUIG1lc3NhZ2VzIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZW5hYmxlUkVTVEluQXhpczJNYWluU2VydmxldCIgbG9ja2VkPSJ0cnVlIj5mYWxzZTwvcGFyYW1ldGVyPgotCi0gICAgPCEtLSBGb2xsb3dpbmcgcGFyYW1ldGVyIHdpbGwgY29tcGxldGVseSBkaXNhYmxlIFJFU1QgaGFuZGxpbmcgaW4gYm90aCB0aGUgc2VydmxldHMtLT4KLSAgICA8cGFyYW1ldGVyIG5hbWU9ImRpc2FibGVSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIFRoaXMgd2lsbCBkaXNhYmxlIHRoZSBzZXBhcmF0ZSBzZXJ2bGV0IHdlIGhhdmUgZm9yIFJFU1QgaGFuZGxpbmcuIC0tPgotICAgIDxwYXJhbWV0ZXIgbmFtZT0iZGlzYWJsZVNlcGFyYXRlRW5kcG9pbnRGb3JSRVNUIiBsb2NrZWQ9InRydWUiPmZhbHNlPC9wYXJhbWV0ZXI+Ci0KLSAgICA8IS0tIElmIHlvdSBoYXZlIGEgZnJvbnRlbmQgaG9zdCB3aGljaCBleHBvc2VzIHRoaXMgd2Vic2VydmljZSB1c2luZyBhIGRpZmZlcmVudCBwdWJsaWMgVVJMICAtLT4KLSAgICA8IS0tIHVzZSB0aGlzIHBhcmFtZXRlciB0byBvdmVycmlkZSBhdXRvZGV0ZWN0ZWQgdXJsIC0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imh0dHBGcm9udGVuZEhvc3RVcmwiPmh0dHBzOi8vc29tZW90aGVyaG9zdC9jb250ZXh0PC9wYXJhbWV0ZXI+LS0+Ci0KLQotICAgIDwhLS0gICAgVGhlIHdheSBvZiBhZGRpbmcgbGlzdGVuZXIgdG8gdGhlIHN5c3RlbS0tPgotICAgIDwhLS0gICAgPGxpc3RlbmVyIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLk9ic2VydmVySU1QTCI+LS0+Ci0gICAgPCEtLSAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJSU1NfVVJMIj5odHRwOi8vMTI3LjAuMC4xL3JzczwvcGFyYW1ldGVyPi0tPgotICAgIDwhLS0gICAgPC9saXN0ZW5lcj4tLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIE1lc3NhZ2UgUmVjZWl2ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tVGhpcyBpcyB0aGUgRGVhZnVsdCBNZXNzYWdlIFJlY2VpdmVyIGZvciB0aGUgc3lzdGVtICwgaWYgeW91IHdhbnQgdG8gaGF2ZSBNZXNzYWdlUmVjZWl2ZXJzIGZvciAtLT4KLSAgICA8IS0tYWxsIHRoZSBvdGhlciBNRVAgaW1wbGVtZW50IGl0IGFuZCBhZGQgdGhlIGNvcnJlY3QgZW50cnkgdG8gaGVyZSAsIHNvIHRoYXQgeW91IGNhbiByZWZlciBmcm9tLS0+Ci0gICAgPCEtLWFueSBvcGVyYXRpb24gLS0+Ci0gICAgPCEtLU5vdGUgOiBZb3UgY2FuIG92cmlkZSB0aGlzIGZvciBwYXJ0aWN1bGFyIHNlcnZpY2UgYnkgYWRkaW5nIHRoZSBzYW1lIGVsZW1lbnQgd2l0aCB5b3VyIHJlcXVpcmVtZW50LS0+Ci0gICAgPG1lc3NhZ2VSZWNlaXZlcnM+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuUmF3WE1MSU5Pbmx5TWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnJlY2VpdmVycy5SYXdYTUxJTk91dE1lc3NhZ2VSZWNlaXZlciIvPgotICAgIDwvbWVzc2FnZVJlY2VpdmVycz4KLSAgICAKLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBNZXNzYWdlIEZvcm1hdHRlciAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gbWVzc2FnZSBmb3JtYXR0ZXIgbWFwcGluZyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IG1lc3NhZ2UgLS0+Ci0gICAgPCEtLWZvcm1hdHMgIHNlcmlhbGl6YXRpb24gaW4gQXhpczIuIFRoZXNlIG1lc3NhZ2UgZm9ybWF0cyBhcmUgZXhwZWN0ZWQgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhlIGNvbnRlbnQgdHlwZS4gLS0+Ci0gICAgPG1lc3NhZ2VGb3JtYXR0ZXJzPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vc29hcCt4bWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuU09BUE1lc3NhZ2VGb3JtYXR0ZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VGb3JtYXR0ZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OTWVzc2FnZUZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vanNvbi9iYWRnZXJmaXNoIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpzb24uSlNPTkJhZGdlcmZpc2hNZXNzYWdlRm9ybWF0dGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlRm9ybWF0dGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L2phdmFzY3JpcHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OTWVzc2FnZUZvcm1hdHRlciIvPgotICAgICAgICA8bWVzc2FnZUZvcm1hdHRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlhGb3JtVVJMRW5jb2RlZEZvcm1hdHRlciIvPgotICAgIDwvbWVzc2FnZUZvcm1hdHRlcnM+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gTWVzc2FnZSBCdWlsZGVycyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLUZvbGxvd2luZyBjb250ZW50IHR5cGUgdG8gYnVpbGRlciBtYXBwaW5nIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbWVzc2FnZSAtLT4KLSAgICA8IS0tZm9ybWF0cyBpbiBBeGlzMi4gVGhlc2UgbWVzc2FnZSBmb3JtYXRzIGFyZSBleHBlY3RlZCB0byBiZSByZXNvbHZlZCBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlLiAtLT4KLSAgICA8bWVzc2FnZUJ1aWxkZXJzPgotICAgICAgICA8bWVzc2FnZUJ1aWxkZXIgY29udGVudFR5cGU9ImFwcGxpY2F0aW9uL2pzb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OT01CdWlsZGVyIi8+Ci0gICAgICAgIDxtZXNzYWdlQnVpbGRlciBjb250ZW50VHlwZT0iYXBwbGljYXRpb24vanNvbi9iYWRnZXJmaXNoIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmpzb24uSlNPTkJhZGdlcmZpc2hPTUJ1aWxkZXIiLz4KLSAgICAgICAgPG1lc3NhZ2VCdWlsZGVyIGNvbnRlbnRUeXBlPSJ0ZXh0L2phdmFzY3JpcHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuanNvbi5KU09OT01CdWlsZGVyIi8+Ci0gICAgPC9tZXNzYWdlQnVpbGRlcnM+Ci0gICAgCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gVHJhbnNwb3J0IElucyAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLlNpbXBsZUhUVFBTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjgwODA8L3BhcmFtZXRlcj4KLSAgICAgICAgPCEtLSBIZXJlIGlzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIChzZWUgZXhhbXBsZSBzZXR0aW5ncyBmdXJ0aGVyIGJlbG93KToKLSAgICAgICAgICAgIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiBvbiAoZGVmYXVsdCA2MDYwKQotICAgICAgICAgICAgaG9zdG5hbWU6ICBpZiBub24tbnVsbCwgdXJsIHByZWZpeCB1c2VkIGluIHJlcGx5LXRvIGVuZHBvaW50IHJlZmVyZW5jZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBudWxsKQotICAgICAgICAgICAgb3JpZ2luU2VydmVyOiAgdmFsdWUgb2YgaHR0cCBTZXJ2ZXIgaGVhZGVyIGluIG91dGdvaW5nIG1lc3NhZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAiU2ltcGxlLVNlcnZlci8xLjEiKQotICAgICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6ICB2YWx1ZSBpbiBtaWxsaXMgb2YgdGltZSB0aGF0IHJlcXVlc3RzIGNhbiB3YWl0IGZvciBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCAyMDAwMCkKLSAgICAgICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5OiAgdHJ1ZSB0byBtYXhpbWl6ZSBwZXJmb3JtYW5jZSBhbmQgbWluaW1pemUgbGF0ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgdG8gbWluaW1pemUgYmFuZHdpZHRoIGNvbnN1bXB0aW9uIGJ5IGNvbWJpbmluZyBzZWdtZW50cwotICAgICAgICAgICAgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nICh1bmxlc3MgcXVldWUgZmlsbHMgdXApICAoZGVmYXVsdCAyNSkKLSAgICAgICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTogIG51bWJlciBvZiB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGlmIHF1ZXVlIGZpbGxzIHVzICAgICAgICAgKGRlZmF1bHQgMTUwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IGRlZmF1bHQgcXVldWUgbmV2ZXIgZmlsbHMgdXA6ICBzZWUgSHR0cEZhY3RvcnkKLSAgICAgICAgICAgIHRocmVhZEtlZXBBbGl2ZVRpbWU6ICB0aW1lIHRvIGtlZXAgdGhyZWFkcyBpbiBleGNlc3Mgb2YgY29yZSBzaXplIGFsaXZlIHdoaWxlIGluYWN0aXZlICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgMTgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgdGhhdCBubyBzdWNoIHRocmVhZHMgY2FuIGV4aXN0IHdpdGggZGVmYXVsdCB1bmJvdW5kZWQgcmVxdWVzdCBxdWV1ZQotICAgICAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ6ICBUaW1lVW5pdCBvZiB2YWx1ZSBpbiB0aHJlYWRLZWVwQWxpdmVUaW1lIChkZWZhdWx0IFNFQ09ORFMpICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBTRUNPTkRTKQotICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIiAgICAgICAgICAgICAgICAgPmh0dHA6Ly93d3cubXlBcHAuY29tL3dzPC9wYXJhbWV0ZXI+IC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0ib3JpZ2luU2VydmVyIiAgICAgICAgICAgICA+TXktU2VydmVyLzEuMTwvcGFyYW1ldGVyPiAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0VGltZW91dCIgICAgICAgICAgID4xMDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InJlcXVlc3RUY3BOb0RlbGF5IiAgICAgICAgPmZhbHNlPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0icmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI+NTA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gPHBhcmFtZXRlciBuYW1lPSJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiID4xMDA8L3BhcmFtZXRlcj4gICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSA8cGFyYW1ldGVyIG5hbWU9InRocmVhZEtlZXBBbGl2ZVRpbWUiICAgICAgPjI0MDAwMDwvcGFyYW1ldGVyPiAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIDxwYXJhbWV0ZXIgbmFtZT0idGhyZWFkS2VlcEFsaXZlVGltZVVuaXQiICA+TUlMTElTRUNPTkRTPC9wYXJhbWV0ZXI+ICAgICAgICAgICAgLS0+Ci0gICAgPC90cmFuc3BvcnRSZWNlaXZlcj4KLSAgICAKLSAgICA8IS0tVW5jb21tZW50IGlmIHlvdSB3YW50IHRvIGhhdmUgVENQIHRyYW5zcG9ydCBzdXBwb3J0LS0+Ci0gICAgPCEtLXRyYW5zcG9ydFJlY2VpdmVyIG5hbWU9InRjcCIKLSAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LnRjcC5UQ1BTZXJ2ZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9InBvcnQiPjYwNjA8L3BhcmFtZXRlci0tPj4KLSAgICAgICAgPCEtLUlmIHlvdSB3YW50IHRvIGdpdmUgeW91ciBvd24gaG9zdCBhZGRyZXNzIGZvciBFUFIgZ2VuZXJhdGlvbi0tPgotICAgICAgICA8IS0tdW5jb21tZXQgZm9sbG93aW5nIHBhcmFtdGVyICwgYW5kIHNldCBhcyB5b3UgcmVxdWlyZWQuLS0+Ci0gICAgICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9Imhvc3RuYW1lIj50Y3A6Ly9teUFwcC5jb20vd3M8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tIC90cmFuc3BvcnRSZWNlaXZlciAtLT4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFRyYW5zcG9ydCBPdXRzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotICAgIDwhLS1VbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gaGF2ZSBUQ1AgdHJhbnNwb3J0IHN1cHBvcnQtLT4KLSAgICA8IS0tCi0gICAgPHRyYW5zcG9ydFNlbmRlciBuYW1lPSJ0Y3AiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQudGNwLlRDUFRyYW5zcG9ydFNlbmRlciIvPgotICAgIC0tPgotICAgIDx0cmFuc3BvcnRTZW5kZXIgbmFtZT0ibG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWwuTG9jYWxUcmFuc3BvcnRTZW5kZXIiLz4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHAiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlciI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUFJPVE9DT0wiPkhUVFAvMS4xPC9wYXJhbWV0ZXI+Ci0gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iVHJhbnNmZXItRW5jb2RpbmciPmNodW5rZWQ8L3BhcmFtZXRlcj4KLSAgICA8L3RyYW5zcG9ydFNlbmRlcj4KLSAgICA8dHJhbnNwb3J0U2VuZGVyIG5hbWU9Imh0dHBzIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIiPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlBST1RPQ09MIj5IVFRQLzEuMTwvcGFyYW1ldGVyPgotICAgICAgICA8cGFyYW1ldGVyIG5hbWU9IlRyYW5zZmVyLUVuY29kaW5nIj5jaHVua2VkPC9wYXJhbWV0ZXI+Ci0gICAgPC90cmFuc3BvcnRTZW5kZXI+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBHbG9iYWwgTW9kdWxlcyAgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gQ29tbWVudCB0aGlzIHRvIGRpc2FibGUgQWRkcmVzc2luZyAtLT4KLSAgICA8IS0tbW9kdWxlIHJlZj0iYWRkcmVzc2luZyIvLS0+Ci0KLSAgICA8IS0tQ29uZmlndXJpbmcgbW9kdWxlICwgcHJvdmlkaW5nIHBhcmFtZXRlcnMgZm9yIG1vZHVsZXMgd2hldGhlciB0aGV5IHJlZmVyIG9yIG5vdC0tPgotICAgIDwhLS08bW9kdWxlQ29uZmlnIG5hbWU9ImFkZHJlc3NpbmciPi0tPgotICAgIDwhLS08cGFyYW1ldGVyIG5hbWU9ImFkZHJlc3NpbmdQYXJhIj5OL0E8L3BhcmFtZXRlcj4tLT4KLSAgICA8IS0tPC9tb2R1bGVDb25maWc+LS0+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBQaGFzZXMgIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJJbkZsb3ciPgotICAgICAgICA8IS0tICBTeXN0ZW0gcHJlIGRlZmluZWQgcGhhc2VzICAgICAgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iVHJhbnNwb3J0Ij4KLSAgICAgICAgICAgIDxoYW5kbGVyIG5hbWU9IlJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIj4KLSAgICAgICAgICAgICAgICA8b3JkZXIgcGhhc2U9IlRyYW5zcG9ydCIvPgotICAgICAgICAgICAgPC9oYW5kbGVyPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlNPQVBBY3Rpb25CYXNlZERpc3BhdGNoZXIiPgotICAgICAgICAgICAgICAgIDxvcmRlciBwaGFzZT0iVHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8L2hhbmRsZXI+Ci0gICAgICAgIDwvcGhhc2U+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJTZWN1cml0eSIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgU3lzdGVtIHByZSBkZWZpbmVkIHBoYXNlcyAgICAgICAtLT4KLSAgICAgICAgPCEtLSAgIEFmdGVyIFBvc3RkaXNwYXRjaCBwaGFzZSBtb2R1bGUgYXV0aG9yIG9yIG9yIHNlcnZpY2UgYXV0aG9yIGNhbiBhZGQgYW55IHBoYXNlIGhlIHdhbnQgICAgICAtLT4KLSAgICAgICAgPHBoYXNlIG5hbWU9Ik9wZXJhdGlvbkluUGhhc2UiLz4KLQk8cGhhc2UgbmFtZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgIDwvcGhhc2VPcmRlcj4KLSAgICA8cGhhc2VPcmRlciB0eXBlPSJPdXRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRQaGFzZSIvPgotICAgICAgICA8IS0tc3lzdGVtIHByZWRlZmluZWQgcGhhc2UtLT4KLSAgICAgICAgPCEtLXRoZXNlIHBoYXNlIHdpbGwgcnVuIGlycmVzcGVjdGl2ZSBvZiB0aGUgc2VydmljZS0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iUG9saWN5RGV0ZXJtaW5hdGlvbiIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iTWVzc2FnZU91dCIvPgotICAgICAgICA8cGhhc2UgbmFtZT0iU2VjdXJpdHkiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iSW5GYXVsdEZsb3ciPgotICAgICAgICA8cGhhc2UgbmFtZT0iUHJlRGlzcGF0Y2giLz4KLSAgICAgICAgPHBoYXNlIG5hbWU9IkRpc3BhdGNoIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuRGlzcGF0Y2hQaGFzZSI+Ci0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJSZXF1ZXN0VVJJQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQQWN0aW9uQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuU09BUEFjdGlvbkJhc2VkRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJBZGRyZXNzaW5nQmFzZWREaXNwYXRjaGVyIgotICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuQWRkcmVzc2luZ0Jhc2VkRGlzcGF0Y2hlciIvPgotICAgICAgICAgICAgPGhhbmRsZXIgbmFtZT0iUmVxdWVzdFVSSU9wZXJhdGlvbkRpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5SZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlciIvPgotCi0gICAgICAgICAgICA8aGFuZGxlciBuYW1lPSJTT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5kaXNwYXRjaGVycy5TT0FQTWVzc2FnZUJvZHlCYXNlZERpc3BhdGNoZXIiLz4KLSAgICAgICAgPC9waGFzZT4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotICAgICAgICA8cGhhc2UgbmFtZT0iT3BlcmF0aW9uSW5GYXVsdFBoYXNlIi8+Ci0JPHBoYXNlIG5hbWU9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICA8L3BoYXNlT3JkZXI+Ci0gICAgPHBoYXNlT3JkZXIgdHlwZT0iT3V0RmF1bHRGbG93Ij4KLSAgICAgICAgPCEtLSAgICAgIHVzZXIgY2FuIGFkZCBoaXMgb3duIHBoYXNlcyB0byB0aGlzIGFyZWEgIC0tPgotCTxwaGFzZSBuYW1lPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJPcGVyYXRpb25PdXRGYXVsdFBoYXNlIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJQb2xpY3lEZXRlcm1pbmF0aW9uIi8+Ci0gICAgICAgIDxwaGFzZSBuYW1lPSJNZXNzYWdlT3V0Ii8+Ci0gICAgPC9waGFzZU9yZGVyPgotPC9heGlzY29uZmlnPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvSlNPTlNlYXJjaC9KU09OU2VhcmNoQ2xpZW50LmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vanNvbnNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvSlNPTlNlYXJjaC9KU09OU2VhcmNoQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzNiYWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvSlNPTlNlYXJjaENsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUueWFob29zZXJ2aWNlcy5KU09OU2VhcmNoOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotCi1wdWJsaWMgY2xhc3MgSlNPTlNlYXJjaENsaWVudCBleHRlbmRzIEpGcmFtZSB7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgd2lkdGg7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgaGVpZ2h0OwotCi0gICAgcHVibGljIEpTT05TZWFyY2hDbGllbnQoU3RyaW5nIHRpdGxlKSB0aHJvd3MgSGVhZGxlc3NFeGNlcHRpb24gewotICAgICAgICBzdXBlcih0aXRsZSk7Ci0KLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZChuZXcgVXNlckludGVyZmFjZSh0aGlzKSk7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIERpbWVuc2lvbiBzY3JlZW5TaXplID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKTsKLSAgICAgICAgd2lkdGggPSBzY3JlZW5TaXplLndpZHRoOwotICAgICAgICBoZWlnaHQgPSBzY3JlZW5TaXplLmhlaWdodDsKLSAgICAgICAgSlNPTlNlYXJjaENsaWVudCBmb3JtID0gbmV3IEpTT05TZWFyY2hDbGllbnQoIkF4aXMyIFlhaG9vLUpTT04gU2VhcmNoIENsaWVudCIpOwotCi0KLSAgICAgICAgaW50IGxlZnQgPSAod2lkdGgpIC8gMjsKLSAgICAgICAgaW50IHRvcCA9IChoZWlnaHQpIC8gMjsKLSAgICAgICAgZm9ybS5zZXRMb2NhdGlvbihsZWZ0LCB0b3ApOwotICAgICAgICBmb3JtLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGZvcm0uc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgZm9ybS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9KU09OU2VhcmNoL0pTT05TZWFyY2hNb2RlbC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvSlNPTlNlYXJjaE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzZmYzcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvSlNPTlNlYXJjaE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUueWFob29zZXJ2aWNlcy5KU09OU2VhcmNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY2xpZW50Lk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKU09OU2VhcmNoTW9kZWwgewotICAgIC8qKgotICAgICAqIEhUTUwgSGVhZGVyIHRvIGRlc3BsYXkgc25pcHBldCB0ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmVnaW5IVE1MID0gIjxIVE1MPjxIRUFEPjxUSVRMRT5TZWFyY2ggUmVzdWx0czwvVElUTEU+PC9IRUFEPjxCT0RZPiI7Ci0KLSAgICAvKioKLSAgICAgKiBIVE1MIGZvb3RlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVuZEhUTUwgPSAiPC9CT0RZPjwvSFRNTD4iOwotCi0gICAgLyoqCi0gICAgICogU3RvcmUgdGhlIHRleHRzIHJlYWQgYnkgTmF2aWdhdGlvblVSTCBvZiBzb2FwCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc25pcHBldDsKLQotICAgIHB1YmxpYyBTdHJpbmcgc2VhcmNoWWFob28oU3RyaW5nIHF1ZXJ5LCBTdHJpbmcgZm9ybWF0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzbmlwcGV0ID0gYmVnaW5IVE1MOwotICAgICAgICAgICAgU3RyaW5nIGVwciA9ICJodHRwOi8vYXBpLnNlYXJjaC55YWhvby5jb20vV2ViU2VhcmNoU2VydmljZS9WMS93ZWJTZWFyY2giOwotICAgICAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoInJlc291cmNlcy9heGlzMi54bWwiKTsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb25maWd1cmF0aW9uQ29udGV4dEZyb21GaWxlU3lzdGVtKG51bGwsIGNvbmZpZ0ZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ3VyYXRpb25Db250ZXh0LCBudWxsKTsKLSAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0gICAgICAgICAgICBjbGllbnQuc2V0T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKGVwcikpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUsIEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNKTsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0QsIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVCk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcmVzcG9uc2UgPSBjbGllbnQuc2VuZFJlY2VpdmUoZ2V0UGF5bG9hZEZvcllhaG9vU2VhcmNoQ2FsbChxdWVyeSwgZm9ybWF0KSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVNuaXBwZXQocmVzcG9uc2UpOwotICAgICAgICAgICAgcmV0dXJuIHNuaXBwZXQ7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBzbmlwcGV0ID0gIjxIMj5FcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGludm9jYXRpb24gdG8gWWFob28gc2VhcmNoIHNlcnZpY2U8L0gyPiIgKwotICAgICAgICAgICAgICAgICAgICAiPHA+IiArIGUuZ2V0TWVzc2FnZSgpICsgIjwvcD4iICsgZW5kSFRNTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPTUVsZW1lbnQgZ2V0UGF5bG9hZEZvcllhaG9vU2VhcmNoQ2FsbChTdHJpbmcgcXVlcnlTdHIsIFN0cmluZyBmb3JtYXRTdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgT01GYWN0b3J5IGZhYyA9IE9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpOwotICAgICAgICBPTUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJ3ZWJTZWFyY2giLCBudWxsKTsKLQotICAgICAgICBPTUVsZW1lbnQgYXBwSWQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJhcHBpZCIsIG51bGwsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgYXBwSWQuc2V0VGV4dCgiQXBhY2hlUmVzdERlbW8iKTsKLQotICAgICAgICBPTUVsZW1lbnQgcXVlcnkgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJxdWVyeSIsIG51bGwsIHJvb3RFbGVtZW50KTsKLSAgICAgICAgcXVlcnkuc2V0VGV4dChVUkxFbmNvZGVyLmVuY29kZShxdWVyeVN0ciwgIlVURi04IikpOwotCi0gICAgICAgIE9NRWxlbWVudCBvdXRwdXRUeXBlID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgib3V0cHV0IiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBvdXRwdXRUeXBlLnNldFRleHQoImpzb24iKTsKLQotICAgICAgICBpZiAoZm9ybWF0U3RyICE9IG51bGwgJiYgZm9ybWF0U3RyLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBmb3JtYXQgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJmb3JtYXQiLCBudWxsLCByb290RWxlbWVudCk7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0VGV4dChVUkxFbmNvZGVyLmVuY29kZShmb3JtYXRTdHIsICJVVEYtOCIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm9vdEVsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU25pcHBldChPTUVsZW1lbnQgcmVzcG9uc2UpIHsKLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHN1bW1hcnkgPSBudWxsOwotICAgICAgICBTdHJpbmcgY2xpY2tVcmwgPSBudWxsOwotICAgICAgICBTdHJpbmcgdXJsID0gbnVsbDsKLSAgICAgICAgT01FbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIC8vZ2V0IGFuIGl0ZXJhdG9yIGZvciBSZXN1bHQgZWxlbWVudHMKLSAgICAgICAgSXRlcmF0b3IgaXRyID0gcmVzcG9uc2UuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBJdGVyYXRvciBpbm5lckl0cjsKLSAgICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChPTUVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICBpbm5lckl0ciA9IHJlc3VsdC5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoaW5uZXJJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGUgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3VtbWFyeSA9ICgoT01FbGVtZW50KSBpbm5lckl0ci5uZXh0KCkpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICB1cmwgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgY2xpY2tVcmwgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc25pcHBldCArPSAiPGEgaHJlZj0iICsgY2xpY2tVcmwgKyAiPiIgKyB0aXRsZSArICI8L2E+IiArICI8YnI+IiArIHN1bW1hcnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiArIHVybCArICI8YnI+IiArICI8YnI+IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc25pcHBldCArPSBlbmRIVE1MOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvVXNlckludGVyZmFjZS5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb2pzb25zZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL0pTT05TZWFyY2gvVXNlckludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYzMTdlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29qc29uc2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9KU09OU2VhcmNoL1VzZXJJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS55YWhvb3NlcnZpY2VzLkpTT05TZWFyY2g7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkh5cGVybGlua0xpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkh5cGVybGlua0V2ZW50OwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJmYWNlIGV4dGVuZHMgSlBhbmVsIGltcGxlbWVudHMgSHlwZXJsaW5rTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBKRWRpdG9yUGFuZSBqZXA7Ci0gICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lOwotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHNjaEZpZWxkOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCBmb3JtYXRGaWVsZDsKLQotICAgIHByaXZhdGUgSkJ1dHRvbiBzY2hCdXR0b247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJhY2tCdXR0b247Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBzY2hMYWJlbDsKLSAgICBwcml2YXRlIEpMYWJlbCBmb3JtYXRMYWJlbDsKLQotCi0gICAgcHJpdmF0ZSBKU09OU2VhcmNoTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBKU09OU2VhcmNoQ2xpZW50IHBhcmVudDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJlc3BvbnNlOwotICAgIHB1YmxpYyBVc2VySW50ZXJmYWNlKEpTT05TZWFyY2hDbGllbnQgcGFyZW50KSB7Ci0gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgICBtb2RlbCA9ICBuZXcgSlNPTlNlYXJjaE1vZGVsKCk7Ci0gICAgICAgIGluaXRDb21wb25lbnRzKCk7Ci0KLSAgICAgICAgc2NoQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VhcmNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGJhY2tCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVCYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIENvbnRhaW5lciBwYW5lID0gcGFyZW50LmdldENvbnRlbnRQYW5lKCk7Ci0gICAgICAgIHBhbmUuc2V0TGF5b3V0KG51bGwpOwotCi0gICAgICAgIHBhbmUuYWRkKHNjaExhYmVsKTsKLSAgICAgICAgcGFuZS5hZGQoc2NoRmllbGQpOwotICAgICAgICBwYW5lLmFkZChmb3JtYXRMYWJlbCk7Ci0gICAgICAgIHBhbmUuYWRkKGZvcm1hdEZpZWxkKTsKLSAgICAgICAgcGFuZS5hZGQoYmFja0J1dHRvbik7Ci0gICAgICAgIHBhbmUuYWRkKHNjaEJ1dHRvbik7Ci0gICAgICAgIHBhbmUuYWRkKHNjcm9sbFBhbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgewotICAgICAgICBzY2hMYWJlbCA9IG5ldyBKTGFiZWwoIlNlYXJjaCBmb3IiKTsKLSAgICAgICAgc2NoTGFiZWwuc2V0Qm91bmRzKDIwLCAxMCwgODAsIDI1KTsKLSAgICAgICAgc2NoRmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBzY2hGaWVsZC5zZXRCb3VuZHMoOTAsIDEwLCAyNTAsIDI1KTsKLQotICAgICAgICBmb3JtYXRMYWJlbCA9IG5ldyBKTGFiZWwoImZvcm1hdCIpOwotICAgICAgICBmb3JtYXRMYWJlbC5zZXRCb3VuZHMoMzUwLCAxMCwgNTAsIDI1KTsKLSAgICAgICAgZm9ybWF0RmllbGQgPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBmb3JtYXRGaWVsZC5zZXRCb3VuZHMoNDAwLCAxMCwgMTAwLCAyNSk7Ci0KLSAgICAgICAgYmFja0J1dHRvbiA9IG5ldyBKQnV0dG9uKCJCYWNrIHRvIFJlc3VsdHMiKTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRCb3VuZHMoNjcwLCAxMCwgMTUwLCAyNSk7Ci0gICAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgc2NoQnV0dG9uID0gIG5ldyBKQnV0dG9uKCJTZWFyY2giKTsKLSAgICAgICAgc2NoQnV0dG9uLnNldEJvdW5kcyg1MTAsIDEwLCAxNTAsIDI1KTsKLQotCi0gICAgICAgIGplcCA9IG5ldyBKRWRpdG9yUGFuZSgpOwotICAgICAgICBqZXAuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgICAgICBqZXAuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgICAgICBqZXAuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7Ci0KLSAgICAgICAgc2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZShqZXApOwotICAgICAgICBzY3JvbGxQYW5lLnNldEJvdW5kcygxMCwgODAsIChKU09OU2VhcmNoQ2xpZW50LndpZHRoIC0gMzApLCAoSlNPTlNlYXJjaENsaWVudC5oZWlnaHQgLSAxNjApKTsKLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlYXJjaCgpewotICAgICAgICBTdHJpbmcgcXVlcnkgPSBzY2hGaWVsZC5nZXRUZXh0KCk7Ci0KLSAgICAgICAgaWYoIXF1ZXJ5LmVxdWFscygiIikpewotICAgICAgICAgICAgcmVzcG9uc2UgPSBtb2RlbC5zZWFyY2hZYWhvbyhxdWVyeSwgZm9ybWF0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIGplcC5zZXRUZXh0KHJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCYWNrKCl7Ci0gICAgICAgIGplcC5zZXRUZXh0KHJlc3BvbnNlKTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoeXBlcmxpbmtVcGRhdGUoSHlwZXJsaW5rRXZlbnQgaGUpIHsKLSAgICAgICAgaWYgKGhlLmdldEV2ZW50VHlwZSgpID09IEh5cGVybGlua0V2ZW50LkV2ZW50VHlwZS5BQ1RJVkFURUQpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamVwLnNldFBhZ2UoaGUuZ2V0VVJMKCkpOwotICAgICAgICAgICAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cocGFyZW50LCAiUGFnZSBjb3VsZCBub3QgYmUgbG9hZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhZ2UgRXJyb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9SRUFETUUudHh0IGIvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWIwOGUyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotU2FtcGxlIGZvciBZYWhvbyAtIFNlYXJjaCAtIFJFU1QNCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1JbnRyb2R1Y3Rpb24NCi09PT09PT09PT09PT0NCi0NCi1BeGlzMiBjbGllbnQgQVBJIGhhcyBmYWNpbGl0aWVzIHRvIGludm9rZSBSRVNUIGludGVyZmFjZXMuIFRoZSBBUEkgdG8gYmUgdXNlZCBpcyBhbG1vc3QgdGhlIHNhbWUNCi1hcyB0aGUgb25lIHdlIHVzZSB3aGlsZSBpbnZva2luZyB3aXRoIFJFU1QuDQotDQotWWFob28gcHJvdmlkZXMgYSBSRVNUIEFQSSB0byBjYWxsIGl0cyBzZWFyY2ggc2VydmljZS4gVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBjYWxsIFlhaG9vDQotc2VhcmNoIHNlcnZpY2UgdXNpbmcgYW4gQXhpczIgY2xpZW50Lg0KLQ0KLVByZS1SZXF1aXNpdGVzDQotPT09PT09PT09PT09PT0NCi0NCi1BcGFjaGUgQW50IDEuNi4yIG9yIGxhdGVyDQotDQotUnVubmluZyBUaGUgU2FtcGxlDQotPT09PT09PT09PT09PT09PT09DQotDQotVHlwZSAiYW50IiBmcm9tIEF4aXMyX0hPTUUvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2ggZGlyZWN0b3J5Lg0KLQ0KLUhlbHANCi09PT09DQotUGxlYXNlIGNvbnRhY3QgYXhpcy11c2VyIGxpc3QgKGF4aXMtdXNlckB3cy5hcGFjaGUub3JnKSBpZiB5b3UgaGF2ZSBhbnkgdHJvdWJsZSBydW5uaW5nIHRoZSBzYW1wbGUuDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjlhNGM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iWWFob29SZXN0U2VhcmNoU2FtcGxlIiBkZWZhdWx0PSJydW4uY2xpZW50Ij4KLQk8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIuaG9tZSIgdmFsdWU9Ii4uLy4uLyIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYXhpczIucmVwbyIgdmFsdWU9IiR7YXhpczIuaG9tZX0vcmVwb3NpdG9yeSIgLz4KLQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImNsaWVudC5jbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIiAvPgotCTxwYXRoIGlkPSJheGlzLmNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHtheGlzMi5ob21lfS9saWIiPgotCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCTwvZmlsZXNldD4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC95YWhvb1JFU1RTZWFyY2guamFyIiAvPgotCTwvcGF0aD4KLQotCTx0YXJnZXQgbmFtZT0iY29tcGlsZSI+Ci0JCTxta2RpciBkaXI9IiR7Y2xpZW50LmNsYXNzZXMuZGlyfSIgLz4KLQkJPCEtLSBDb21waWxlIGNsaWVudCAtLT4KLQkJPGphdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSIke2NsaWVudC5jbGFzc2VzLmRpcn0iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iYXhpcy5jbGFzc3BhdGgiIC8+Ci0JCTwvamF2YWM+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7YnVpbGQuZGlyfS95YWhvb1JFU1RTZWFyY2guamFyIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiIC8+Ci0JCTwvamFyPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0icnVuLmNsaWVudCIgZGVwZW5kcz0iY29tcGlsZSI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ic2FtcGxlLnlhaG9vc2VydmljZXMuUkVTVFNlYXJjaC5SRVNUU2VhcmNoQ2xpZW50IiBjbGFzc3BhdGhyZWY9ImF4aXMuY2xhc3NwYXRoIiBmb3JrPSJ0cnVlIj4KLQkJCTxqdm1hcmcgdmFsdWU9Ii1EYXhpczIucmVwbz0ke2F4aXMyLnJlcG99IiAvPgotCQk8L2phdmE+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbiI+Ci0JCTxkZWxldGUgZGlyPSJidWlsZCIgLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9SRVNUU2VhcmNoL1JFU1RTZWFyY2hDbGllbnQuamF2YSBiLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9SRVNUU2VhcmNoL1JFU1RTZWFyY2hDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzYTI4OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvUkVTVFNlYXJjaC9SRVNUU2VhcmNoQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHNhbXBsZS55YWhvb3NlcnZpY2VzLlJFU1RTZWFyY2g7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLXB1YmxpYyBjbGFzcyBSRVNUU2VhcmNoQ2xpZW50IGV4dGVuZHMgSkZyYW1lIHsKLSAgICBwdWJsaWMgc3RhdGljIGludCB3aWR0aDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBoZWlnaHQ7Ci0KLSAgICBwdWJsaWMgUkVTVFNlYXJjaENsaWVudChTdHJpbmcgdGl0bGUpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHRpdGxlKTsKLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKG5ldyBVc2VySW50ZXJmYWNlKHRoaXMpKTsKLSAgICAgICAgdGhpcy5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgRGltZW5zaW9uIHNjcmVlblNpemUgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCkuZ2V0U2NyZWVuU2l6ZSgpOwotICAgICAgICB3aWR0aCA9IHNjcmVlblNpemUud2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IHNjcmVlblNpemUuaGVpZ2h0OwotICAgICAgICBSRVNUU2VhcmNoQ2xpZW50IGZvcm0gPSBuZXcgUkVTVFNlYXJjaENsaWVudCgiQXhpczIgUkVTVCBTZWFyY2ggQ2xpZW50Iik7Ci0KLSAgICAgICAgaW50IGxlZnQgPSAod2lkdGgpIC8gMjsKLSAgICAgICAgaW50IHRvcCA9IChoZWlnaHQpIC8gMjsKLSAgICAgICAgZm9ybS5zZXRMb2NhdGlvbihsZWZ0LCB0b3ApOwotICAgICAgICBmb3JtLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGZvcm0uc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgZm9ybS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NhbXBsZXMveWFob29yZXN0c2VhcmNoL3NyYy9zYW1wbGUveWFob29zZXJ2aWNlcy9SRVNUU2VhcmNoL1JFU1RTZWFyY2hNb2RlbC5qYXZhIGIvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL1JFU1RTZWFyY2gvUkVTVFNlYXJjaE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2RkM2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL1JFU1RTZWFyY2gvUkVTVFNlYXJjaE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBzYW1wbGUueWFob29zZXJ2aWNlcy5SRVNUU2VhcmNoOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUFic3RyYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5TZXJ2aWNlQ2xpZW50OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUkVTVFNlYXJjaE1vZGVsIHsKLSAgICAvKioKLSAgICAgKiBIVE1MIEhlYWRlciB0byBkZXNwbGF5IHNuaXBwZXQgdGV4dAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGJlZ2luSFRNTCA9ICI8SFRNTD48SEVBRD48VElUTEU+U2VhcmNoIFJlc3VsdHM8L1RJVExFPjwvSEVBRD48Qk9EWT4iOwotCi0gICAgLyoqCi0gICAgICogSFRNTCBmb290ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbmRIVE1MID0gIjwvQk9EWT48L0hUTUw+IjsKLQotICAgIC8qKgotICAgICAqIFN0b3JlIHRoZSB0ZXh0cyByZWFkIGJ5IE5hdmlnYXRpb25VUkwgb2Ygc29hcAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNuaXBwZXQ7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHNlYXJjaFlhaG9vKFN0cmluZyBxdWVyeSwgU3RyaW5nIGZvcm1hdCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc25pcHBldCA9IGJlZ2luSFRNTDsKLSAgICAgICAgICAgIFN0cmluZyBlcHIgPSAiaHR0cDovL3NlYXJjaC55YWhvb2FwaXMuY29tL1dlYlNlYXJjaFNlcnZpY2UvVjEvd2ViU2VhcmNoIjsKLQotICAgICAgICAgICAgU2VydmljZUNsaWVudCBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCgpOwotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UoZXByKSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkVOQUJMRV9SRVNULCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgICAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9ELCBDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9HRVQpOwotCSAgICBvcHRpb25zLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1FU1NBR0VfVFlQRSxvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNKTsKLQotICAgICAgICAgICAgLy9pZiBwb3N0IGlzIHRocm91Z2ggR0VUIG9mIEhUVFAKLSAgICAgICAgICAgIE9NRWxlbWVudCByZXNwb25zZSA9IGNsaWVudC5zZW5kUmVjZWl2ZShnZXRQYXlsb2FkRm9yWWFob29TZWFyY2hDYWxsKHF1ZXJ5LCBmb3JtYXQpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlU25pcHBldChyZXNwb25zZSk7Ci0gICAgICAgICAgICByZXR1cm4gc25pcHBldDsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHNuaXBwZXQgPSAiPEgyPkVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgaW52b2NhdGlvbiB0byBZYWhvbyBzZWFyY2ggc2VydmljZTwvSDI+IiArCi0gICAgICAgICAgICAgICAgICAgICI8cD4iICsgZS5nZXRNZXNzYWdlKCkgKyAiPC9wPiIgKyBlbmRIVE1MOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9NRWxlbWVudCBnZXRQYXlsb2FkRm9yWWFob29TZWFyY2hDYWxsKFN0cmluZyBxdWVyeVN0ciwgU3RyaW5nIGZvcm1hdFN0cikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NRWxlbWVudCByb290RWxlbWVudCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoIndlYlNlYXJjaCIsIG51bGwpOwotCi0gICAgICAgIE9NRWxlbWVudCBhcHBJZCA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoImFwcGlkIiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBhcHBJZC5zZXRUZXh0KCJBcGFjaGVSZXN0RGVtbyIpOwotCi0gICAgICAgIE9NRWxlbWVudCBxdWVyeSA9IGZhYy5jcmVhdGVPTUVsZW1lbnQoInF1ZXJ5IiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICBxdWVyeS5zZXRUZXh0KFVSTEVuY29kZXIuZW5jb2RlKHF1ZXJ5U3RyLCAiVVRGLTgiKSk7Ci0KLSAgICAgICAgaWYgKGZvcm1hdFN0ciAhPSBudWxsICYmIGZvcm1hdFN0ci5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgZm9ybWF0ID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZm9ybWF0IiwgbnVsbCwgcm9vdEVsZW1lbnQpOwotICAgICAgICAgICAgZm9ybWF0LnNldFRleHQoVVJMRW5jb2Rlci5lbmNvZGUoZm9ybWF0U3RyLCAiVVRGLTgiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJvb3RFbGVtZW50OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVNuaXBwZXQoT01FbGVtZW50IHJlc3BvbnNlKSB7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzdW1tYXJ5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNsaWNrVXJsID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgICAgICAvL2dldCBhbiBpdGVyYXRvciBmb3IgUmVzdWx0IGVsZW1lbnRzCi0gICAgICAgIEl0ZXJhdG9yIGl0ciA9IHJlc3BvbnNlLmdldENoaWxkRWxlbWVudHMoKTsKLSAgICAgICAgSXRlcmF0b3IgaW5uZXJJdHI7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoT01FbGVtZW50KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgaW5uZXJJdHIgPSByZXN1bHQuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICAgICAgdGl0bGUgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gKChPTUVsZW1lbnQpIGlubmVySXRyLm5leHQoKSkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgdXJsID0gKChPTUVsZW1lbnQpIGlubmVySXRyLm5leHQoKSkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgY2xpY2tVcmwgPSAoKE9NRWxlbWVudCkgaW5uZXJJdHIubmV4dCgpKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBzbmlwcGV0ICs9ICI8YSBocmVmPSIgKyBjbGlja1VybCArICI+IiArIHRpdGxlICsgIjwvYT4iICsgIjxicj4iICsgc3VtbWFyeSArCi0gICAgICAgICAgICAgICAgICAgICI8YnI+IiArIHVybCArICI8YnI+IiArICI8YnI+IjsKLSAgICAgICAgfQotICAgICAgICBzbmlwcGV0ICs9IGVuZEhUTUw7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvUkVTVFNlYXJjaC9Vc2VySW50ZXJmYWNlLmphdmEgYi8xXzUvbW9kdWxlcy9zYW1wbGVzL3lhaG9vcmVzdHNlYXJjaC9zcmMvc2FtcGxlL3lhaG9vc2VydmljZXMvUkVTVFNlYXJjaC9Vc2VySW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YmZjNTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2FtcGxlcy95YWhvb3Jlc3RzZWFyY2gvc3JjL3NhbXBsZS95YWhvb3NlcnZpY2VzL1JFU1RTZWFyY2gvVXNlckludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugc2FtcGxlLnlhaG9vc2VydmljZXMuUkVTVFNlYXJjaDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLQotcHVibGljIGNsYXNzIFVzZXJJbnRlcmZhY2UgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBIeXBlcmxpbmtMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIEpFZGl0b3JQYW5lIGplcDsKLSAgICBwcml2YXRlIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmU7Ci0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgc2NoRmllbGQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIGZvcm1hdEZpZWxkOwotCi0gICAgcHJpdmF0ZSBKQnV0dG9uIHNjaEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gYmFja0J1dHRvbjsKLQotICAgIHByaXZhdGUgSkxhYmVsIHNjaExhYmVsOwotICAgIHByaXZhdGUgSkxhYmVsIGZvcm1hdExhYmVsOwotCi0KLSAgICBwcml2YXRlIFJFU1RTZWFyY2hNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFJFU1RTZWFyY2hDbGllbnQgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVzcG9uc2U7Ci0gICAgcHVibGljIFVzZXJJbnRlcmZhY2UoUkVTVFNlYXJjaENsaWVudCBwYXJlbnQpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIG1vZGVsID0gIG5ldyBSRVNUU2VhcmNoTW9kZWwoKTsKLSAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKLQotICAgICAgICBzY2hCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVTZWFyY2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYmFja0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUJhY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29udGFpbmVyIHBhbmUgPSBwYXJlbnQuZ2V0Q29udGVudFBhbmUoKTsKLSAgICAgICAgcGFuZS5zZXRMYXlvdXQobnVsbCk7Ci0KLSAgICAgICAgcGFuZS5hZGQoc2NoTGFiZWwpOwotICAgICAgICBwYW5lLmFkZChzY2hGaWVsZCk7Ci0gICAgICAgIHBhbmUuYWRkKGZvcm1hdExhYmVsKTsKLSAgICAgICAgcGFuZS5hZGQoZm9ybWF0RmllbGQpOwotICAgICAgICBwYW5lLmFkZChiYWNrQnV0dG9uKTsKLSAgICAgICAgcGFuZS5hZGQoc2NoQnV0dG9uKTsKLSAgICAgICAgcGFuZS5hZGQoc2Nyb2xsUGFuZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7Ci0gICAgICAgIHNjaExhYmVsID0gbmV3IEpMYWJlbCgiU2VhcmNoIGZvciIpOwotICAgICAgICBzY2hMYWJlbC5zZXRCb3VuZHMoMjAsIDEwLCA4MCwgMjUpOwotICAgICAgICBzY2hGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHNjaEZpZWxkLnNldEJvdW5kcyg5MCwgMTAsIDI1MCwgMjUpOwotCi0gICAgICAgIGZvcm1hdExhYmVsID0gbmV3IEpMYWJlbCgiZm9ybWF0Iik7Ci0gICAgICAgIGZvcm1hdExhYmVsLnNldEJvdW5kcygzNTAsIDEwLCA1MCwgMjUpOwotICAgICAgICBmb3JtYXRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIGZvcm1hdEZpZWxkLnNldEJvdW5kcyg0MDAsIDEwLCAxMDAsIDI1KTsKLQotICAgICAgICBiYWNrQnV0dG9uID0gbmV3IEpCdXR0b24oIkJhY2sgdG8gUmVzdWx0cyIpOwotICAgICAgICBiYWNrQnV0dG9uLnNldEJvdW5kcyg2NzAsIDEwLCAxNTAsIDI1KTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBzY2hCdXR0b24gPSAgbmV3IEpCdXR0b24oIlNlYXJjaCIpOwotICAgICAgICBzY2hCdXR0b24uc2V0Qm91bmRzKDUxMCwgMTAsIDE1MCwgMjUpOwotCi0KLSAgICAgICAgamVwID0gbmV3IEpFZGl0b3JQYW5lKCk7Ci0gICAgICAgIGplcC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIGplcC5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgIGplcC5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKLQotICAgICAgICBzY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKGplcCk7Ci0gICAgICAgIHNjcm9sbFBhbmUuc2V0Qm91bmRzKDEwLCA4MCwgKFJFU1RTZWFyY2hDbGllbnQud2lkdGggLSAzMCksIChSRVNUU2VhcmNoQ2xpZW50LmhlaWdodCAtIDE2MCkpOwotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlU2VhcmNoKCl7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9IHNjaEZpZWxkLmdldFRleHQoKTsKLQotICAgICAgICBpZighcXVlcnkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICByZXNwb25zZSA9IG1vZGVsLnNlYXJjaFlhaG9vKHF1ZXJ5LCBmb3JtYXRGaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgamVwLnNldFRleHQocmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJhY2soKXsKLSAgICAgICAgamVwLnNldFRleHQocmVzcG9uc2UpOwotICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGh5cGVybGlua1VwZGF0ZShIeXBlcmxpbmtFdmVudCBoZSkgewotICAgICAgICBpZiAoaGUuZ2V0RXZlbnRUeXBlKCkgPT0gSHlwZXJsaW5rRXZlbnQuRXZlbnRUeXBlLkFDVElWQVRFRCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBqZXAuc2V0UGFnZShoZS5nZXRVUkwoKSk7Ci0gICAgICAgICAgICAgICAgYmFja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhwYXJlbnQsICJQYWdlIGNvdWxkIG5vdCBiZSBsb2FkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFnZSBFcnJvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQ4ZDhlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5zY3JpcHRpbmc8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBTY3JpcHRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkF4aXMyIHNjcmlwdGluZyBzdXBwb3J0IGZvciBzZXJ2aWNlcyBpbXBsZW1lbnRlZCB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXM8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPnJoaW5vPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnhtbGJlYW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5ic2Y8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5ic2Y8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zY3JpcHRpbmc8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zY3JpcHRpbmc8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3NjcmlwdGluZzwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDx0ZXN0UmVzb3VyY2VzPgotICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0UGF0aD4uLi90ZXN0LXJlc291cmNlczwvdGFyZ2V0UGF0aD4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnRlc3QtcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+Ci0gICAgICAgIDwvdGVzdFJlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovU2NyaXB0TW9kdWxlVGVzdC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovU2NyaXB0RGVwbG95bWVudEVuZ2luZVRlc3QuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jaWVzPmZhbHNlPC9pbmNsdWRlRGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbCBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvTUVUQS1JTkYvbW9kdWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4NzM2MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL01FVEEtSU5GL21vZHVsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0ic2NyaXB0IgotICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuU2NyaXB0TW9kdWxlIj4KLTwvbW9kdWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0RGVwbG95bWVudEVuZ2luZS5qYXZhIGIvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHREZXBsb3ltZW50RW5naW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWQ5YTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHREZXBsb3ltZW50RW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXJyb3JNc2dzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuRGVwbG95bWVudEZpbGVEYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5yZXBvc2l0b3J5LnV0aWwuV1NJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETFRvQXhpc1NlcnZpY2VCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBbiBBeGlzMiBEZXBsb3ltZW50RW5naW5lIHN1YmNsYXNzIGZvciBkZXBsb3lpbmcgc2NyaXB0IHNlcnZpY2VzIAotICogc3VwcG9ydGluZyBob3QgZGVwbG95IGFuZCBob3QgdXBkYXRlLgotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0RGVwbG95bWVudEVuZ2luZSBleHRlbmRzIERlcGxveW1lbnRFbmdpbmUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNjcmlwdE1vZHVsZS5jbGFzcyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfSE9UX1VQREFURV8gPSAic2NyaXB0cy5ob3R1cGRhdGUiOwotCi0gICAgcHJpdmF0ZSBBeGlzQ29uZmlndXJhdGlvbiByZWFsQXhpc0NvbmZpZzsKLQotICAgIHB1YmxpYyBTY3JpcHREZXBsb3ltZW50RW5naW5lKEF4aXNDb25maWd1cmF0aW9uIHJlYWxBeGlzQ29uZmlnKSB7Ci0gICAgICAgIHRoaXMuYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICB0aGlzLnJlYWxBeGlzQ29uZmlnID0gcmVhbEF4aXNDb25maWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZFJlcG9zaXRvcnkoRmlsZSBzY3JpcHRzUmVwb0ZpbGUpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5yZXBvTGlzdGVuZXIgPSBuZXcgU2NyaXB0UmVwb3NpdG9yeUxpc3RlbmVyKHRoaXMpOwotICAgICAgICB0aGlzLnNlcnZpY2VzRGlyID0gc2NyaXB0c1JlcG9GaWxlOwotCi0gICAgICAgIFBhcmFtZXRlciBzY3JpcHRzSG90VXBkYXRlUGFyYW1ldGVyID0gYXhpc0NvbmZpZy5nZXRQYXJhbWV0ZXIoU0NSSVBUX0hPVF9VUERBVEVfKTsKLSAgICAgICAgdGhpcy5ob3RVcGRhdGUgPSBzY3JpcHRzSG90VXBkYXRlUGFyYW1ldGVyID09IG51bGwgfHwgInRydWUiLmVxdWFscyhzY3JpcHRzSG90VXBkYXRlUGFyYW1ldGVyLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRvRGVwbG95KCkgewotICAgICAgICBMaXN0IGFscmVhZHlEZXBsb3llZCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c1RvRGVwbG95LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAJRGVwbG95bWVudEZpbGVEYXRhIGFyY2hpdmVGaWxlRGF0YSA9IChEZXBsb3ltZW50RmlsZURhdGEpd3NUb0RlcGxveS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZGVwbG95U2VydmljZShhbHJlYWR5RGVwbG95ZWQsIGFyY2hpdmVGaWxlRGF0YSk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiRXhjZXB0aW9uIGRlcGxveWluZyBzY3JpcHQgc2VydmljZTogIiArICgoRGVwbG95bWVudEZpbGVEYXRhKXdzVG9EZXBsb3kuZ2V0KGkpKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdzVG9EZXBsb3kuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVwbG95U2VydmljZShMaXN0IGFscmVhZHlEZXBsb3llZCwgRGVwbG95bWVudEZpbGVEYXRhIGFyY2hpdmVGaWxlRGF0YSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGFyY2hpdmVGaWxlRGF0YS5nZXRGaWxlKCk7Ci0KLSAgICAgICAgRmlsZSB3c2RsRmlsZTsKLSAgICAgICAgRmlsZSBzY3JpcHRGaWxlOwotICAgICAgICBpZiAoZmlsZS50b1N0cmluZygpLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0gICAgICAgICAgICB3c2RsRmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICBzY3JpcHRGaWxlID0gZ2V0U2NyaXB0Rm9yV1NETCh3c2RsRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzY3JpcHRGaWxlID0gZmlsZTsKLSAgICAgICAgICAgIHdzZGxGaWxlID0gZ2V0V1NETEZvclNjcmlwdChzY3JpcHRGaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY3JpcHRGaWxlICE9IG51bGwgJiYgd3NkbEZpbGUgIT0gbnVsbCAmJiAhYWxyZWFkeURlcGxveWVkLmNvbnRhaW5zKHNjcmlwdEZpbGUudG9VUkkoKSkgJiYgc2NyaXB0RmlsZS5leGlzdHMoKSAmJiB3c2RsRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBjcmVhdGVTZXJ2aWNlKHdzZGxGaWxlLCBzY3JpcHRGaWxlKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IG5ldyBBeGlzU2VydmljZUdyb3VwKGF4aXNDb25maWcpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5zZXRTZXJ2aWNlR3JvdXBDbGFzc0xvYWRlcihheGlzU2VydmljZS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlR3JvdXAuc2V0U2VydmljZUdyb3VwTmFtZShheGlzU2VydmljZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2VHcm91cC5hZGRTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgICAgIHJlYWxBeGlzQ29uZmlnLmFkZFNlcnZpY2VHcm91cChheGlzU2VydmljZUdyb3VwKTsKLSAgICAgICAgICAgIGFscmVhZHlEZXBsb3llZC5hZGQoc2NyaXB0RmlsZS50b1VSSSgpKTsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJEZXBsb3llZCBzY3JpcHQgc2VydmljZSAnIiArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArICInIGZvciBzY3JpcHQ6ICIgKyBzY3JpcHRGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1bkRlcGxveSgpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICAgICAgTGlzdCB1bmRlcGxveWVkID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzVG9VbkRlcGxveS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBXU0luZm8gd3NJbmZvID0gKFdTSW5mbyl3c1RvVW5EZXBsb3kuZ2V0KGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IFV0aWxzLmdldFNob3J0RmlsZU5hbWUod3NJbmZvLmdldEZpbGVOYW1lKCkpOwotLy8gICAgICAgICAgICAgICAgaWYgKHdzSW5mby5nZXRUeXBlKCkgPT0gVFlQRV9TRVJWSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0hvdFVwZGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gZ2V0QXhpc1NlcnZpY2VOYW1lKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVuZGVwbG95ZWQuY29udGFpbnMoc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxBeGlzQ29uZmlnLnJlbW92ZVNlcnZpY2VHcm91cChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVwbG95ZWQuYWRkKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZCBhIHdheSB0byBhbHNvIHJlbW92ZSB0aGUgU2VydmljZUdyb3VwIGZyb20gdGhlIENvbmZpZ0NvbnRleHQuYXBwbGljYXRpb25TZXNzaW9uU2VydmljZUdyb3VwQ29udGV4dFRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKE1lc3NhZ2VzLmdldE1lc3NhZ2UoRGVwbG95bWVudEVycm9yTXNncy5TRVJWSUNFX1JFTU9WRUQsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBiZSBhIGZhdWx0eSBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEF4aXNDb25maWcucmVtb3ZlRmF1bHR5U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJyZW1vdmVGYXVsdHlTZXJ2aWNlOiAiICsgZmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVhbEF4aXNDb25maWcucmVtb3ZlRmF1bHR5U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5vdCBob3RVcGRhdGUsIHJlbW92ZUZhdWx0eVNlcnZpY2U6ICIgKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3NUb1VuRGVwbG95LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBPdmVycmlkZSB0aGUgRGVwbG95bWVudEVuZ2luZSBtZXRob2QgcmV0dXJuIGFuIGVtcHR5IG1vZHVsZXMgZGlyZWN0b3J5IGFzCi0gICAgICogaXRzIG5vdCByZXF1aXJlZCBmb3Igc2NyaXB0IHNlcnZpY2VzCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0TW9kdWxlc0RpcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzY3JpcHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3c2RsLiBUaGUgYXNzb2NpYXRlZCBzY3JpcHQgaXMgdGhlCi0gICAgICogZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHdzZGwgZmlsZSBleGNsdWRpbmcgdGhlIGZpbGUgc3VmZml4LCBmb3IKLSAgICAgKiBleGFtcGxlLCBzdG9ja3F1b3RlLmpzIGFuZCBzdG9ja3F1b3RlLndzZGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0U2NyaXB0Rm9yV1NETChGaWxlIHdzZGxGaWxlKSB7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSB3c2RsRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBmaWxlU3VmZml4ID0gd3NkbEZpbGVOYW1lLnN1YnN0cmluZygwLCB3c2RsRmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSApOwotICAgICAgICBGaWxlIHdzZGxGaWxlRGlyID0gd3NkbEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHdzZGxGaWxlRGlyLmxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKCFmaWxlc1tpXS5lcXVhbHMod3NkbEZpbGVOYW1lKSAmJiBmaWxlc1tpXS5zdGFydHNXaXRoKGZpbGVTdWZmaXgpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzY3JpcHRGaWxlID0gbmV3IEZpbGUod3NkbEZpbGVEaXIsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0RmlsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBXU0RMIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NyaXB0LiBUaGUgYXNzb2NpYXRlZCBXU0RMIGlzIHRoZSBmaWxlCi0gICAgICogd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzY3JpcHQgZmlsZSBleGNsdWRpbmcgdGhlIGZpbGUgc3VmZml4LCBmb3IKLSAgICAgKiBleGFtcGxlLCBzdG9ja3F1b3RlLmpzIGFuZCBzdG9ja3F1b3RlLndzZGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0V1NETEZvclNjcmlwdChGaWxlIHNjcmlwdEZpbGUpIHsKLSAgICAgICAgU3RyaW5nIHNjcmlwdEZpbGVOYW1lID0gc2NyaXB0RmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBmaWxlU3VmZml4ID0gc2NyaXB0RmlsZU5hbWUuc3Vic3RyaW5nKDAsIHNjcmlwdEZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotICAgICAgICBGaWxlIHNjcmlwdEZpbGVEaXIgPSBzY3JpcHRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgRmlsZSB3c2RsRmlsZSA9IG5ldyBGaWxlKHNjcmlwdEZpbGVEaXIsIGZpbGVTdWZmaXggKyAiLndzZGwiKTsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gQXhpczIgc2VydmljZSBmb3IgdGhlIHNjcmlwdAotICAgICAqLwotICAgIHByb3RlY3RlZCBBeGlzU2VydmljZSBjcmVhdGVTZXJ2aWNlKEZpbGUgd3NkbEZpbGUsIEZpbGUgc2NyaXB0RmlsZSkgewotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIGRlZmluaXRpb247Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRlZmluaXRpb24gPSB3c2RsRmlsZS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiZXhjZXB0aW9uIG9wZW5pbmcgd3NkbCIsIGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBXU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcihkZWZpbml0aW9uKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLQotICAgICAgICAgICAgLy9heGlzU2VydmljZS5zZXRTY29wZShDb25zdGFudHMuU0NPUEVfQVBQTElDQVRJT04pOwotICAgICAgICAgICAgUGFyYW1ldGVyIHVzZXJXU0RMID0gbmV3IFBhcmFtZXRlcigidXNlT3JpZ2luYWx3c2RsIiwgInRydWUiKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcih1c2VyV1NETCk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBzY3JpcHRTcmMgPSBuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9TUkNfUFJPUCwgcmVhZFNjcmlwdFNvdXJjZShzY3JpcHRGaWxlKSk7Ci0gICAgICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoc2NyaXB0U3JjKTsKLQotICAgICAgICAgICAgU2NyaXB0UmVjZWl2ZXIgc2NyaXB0UmVjZWl2ZXIgPSBuZXcgU2NyaXB0UmVjZWl2ZXIoKTsKLSAgICAgICAgICAgIGF4aXNTZXJ2aWNlLmFkZE1lc3NhZ2VSZWNlaXZlcigiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dCIsIHNjcmlwdFJlY2VpdmVyKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogU2hvdWxkbid0IHRoaXMgYmUgZG9uZSBieSBXU0RMVG9BeGlzU2VydmljZUJ1aWxkZXIucG9wdWxhdGVTZXJ2aWNlPwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24paXQubmV4dCgpOwotICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRNZXNzYWdlUmVjZWl2ZXIoc2NyaXB0UmVjZWl2ZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBQYXJhbWV0ZXIgc2NyaXB0UGFyYW0gPSBuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9BVFRSLCBzY3JpcHRGaWxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKHNjcmlwdFBhcmFtKTsKLQotICAgICAgICAgICAgYXhpc1NlcnZpY2Uuc2V0TmFtZShzY3JpcHRGaWxlLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgc2NyaXB0RmlsZS5nZXROYW1lKCkubGFzdEluZGV4T2YoJy4nKSkpOwotCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBsb2cud2FybigiQXhpc0ZhdWx0IGNyZWF0aW5nIHNjcmlwdCBzZXJ2aWNlIiwgZSk7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGF4aXNTZXJ2aWNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBjb21wbGV0ZSBzY3JpcHQgc291cmNlIGNvZGUgaW50byBhIFN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZFNjcmlwdFNvdXJjZShGaWxlIHNjcmlwdEZpbGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBJbnB1dFN0cmVhbSBpczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzID0gc2NyaXB0RmlsZS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSU9FeGNlcHRpb24gb3BlbmluZyBzY3JpcHQ6ICIgKyBzY3JpcHRGaWxlLCBlKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgIlVURi04Iik7Ci0gICAgICAgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgaW50IGNvdW50OwotICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IHJlYWRlci5yZWFkKGJ1ZmZlcikpID4gMCkgewotICAgICAgICAgICAgICAgIHNvdXJjZS5hcHBlbmQoYnVmZmVyLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc291cmNlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIklPRXhjZXB0aW9uIHJlYWRpbmcgc2NyaXB0OiAiICsgc2NyaXB0RmlsZSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiSU9FeGNlcHRpb24gY2xvc2luZyBzY3JpcHQ6ICIgKyBzY3JpcHRGaWxlLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRJbnZva2VyLmphdmEgYi8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdEludm9rZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiYjE0ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdEludm9rZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgU2NyaXB0SW52b2tlciB7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBzY3JpcHRGaWxlOwotCi0JcHJvdGVjdGVkIGxvbmcgbGFzdE1vZGlmaWVkOwotCi0JcHJvdGVjdGVkIGxvbmcgbGFzdENoZWNrVGltZTsKLQotCXByb3RlY3RlZCBpbnQgaG90VXBkYXRlSW50ZXJ2YWw7Ci0KLQlwcm90ZWN0ZWQgQlNGRW5naW5lIGVuZ2luZTsKLQotCXByaXZhdGUgU3RyaW5nIHNjcmlwdE5hbWU7Ci0KLQlwdWJsaWMgU2NyaXB0SW52b2tlcihGaWxlIHNjcmlwdEZpbGUsIGludCBob3RVcGRhdGVJbnRlcnZhbCkgewotCQl0aGlzLnNjcmlwdEZpbGUgPSBzY3JpcHRGaWxlOwotCQl0aGlzLmhvdFVwZGF0ZUludGVydmFsID0gaG90VXBkYXRlSW50ZXJ2YWw7Ci0JCXRoaXMuc2NyaXB0TmFtZSA9IHNjcmlwdEZpbGUuZ2V0TmFtZSgpOwotCQlpbml0RW5naW5lKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBpbnZva2UoU3RyaW5nIGZ1bmN0aW9uTmFtZSwgT2JqZWN0W10gYXJncykgewotCi0JCWlmIChob3RVcGRhdGVJbnRlcnZhbCA+IDApIHsKLQkJCWNoZWNrVXBkYXRlKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJZW5naW5lLmNhbGwobnVsbCwgZnVuY3Rpb25OYW1lLCBhcmdzKTsKLQkJfSBjYXRjaCAoQlNGRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrVXBkYXRlKCkgewotCQlsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAobm93IC0gbGFzdENoZWNrVGltZSA+IGhvdFVwZGF0ZUludGVydmFsKSB7Ci0JCQlsYXN0Q2hlY2tUaW1lID0gbm93OwotCQkJbG9uZyBsbSA9IHNjcmlwdEZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQlpZiAobG0gIT0gbGFzdE1vZGlmaWVkKSB7Ci0JCQkJbGFzdE1vZGlmaWVkID0gbG07Ci0JCQkJaW5pdEVuZ2luZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVuZ2luZSgpIHsKLQkJdHJ5IHsKLQotCQkJU3RyaW5nIHNjcmlwdExhbmd1YWdlID0gQlNGTWFuYWdlci5nZXRMYW5nRnJvbUZpbGVuYW1lKHNjcmlwdE5hbWUpOwotCQkJQlNGTWFuYWdlciBic2ZNYW5hZ2VyID0gbmV3IEJTRk1hbmFnZXIoKTsKLQkJCWJzZk1hbmFnZXIuc2V0Q2xhc3NMb2FkZXIoQlNGTWFuYWdlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQkJCS8vIGJzZk1hbmFnZXIuZGVjbGFyZUJlYW4oIl9BeGlzU2VydmljZSIsIGF4aXNTZXJ2aWNlLAotCQkJLy8gQXhpc1NlcnZpY2UuY2xhc3MpOwotCi0JCQlCU0ZFbmdpbmUgYnNmRW5naW5lID0gYnNmTWFuYWdlcgotCQkJCQkubG9hZFNjcmlwdGluZ0VuZ2luZShzY3JpcHRMYW5ndWFnZSk7Ci0JCQlPYmplY3Qgc2NyaXB0U3JjID0gcmVhZFNjcmlwdCgpOwotCQkJYnNmRW5naW5lLmV4ZWMoc2NyaXB0TmFtZSwgMCwgMCwgc2NyaXB0U3JjKTsKLQotCQl9IGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgY29tcGxldGUgc2NyaXB0IHNvdXJjZSBjb2RlIGludG8gYSBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYWRTY3JpcHQoKSB7Ci0JCVJlYWRlciByZWFkZXIgPSBudWxsOwotCQl0cnkgewotCi0JCQlyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzY3JpcHRGaWxlKTsKLQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsxMDI0XTsKLQkJCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgY291bnQ7Ci0JCQl3aGlsZSAoKGNvdW50ID0gcmVhZGVyLnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChidWZmZXIsIDAsIGNvdW50KTsKLQkJCX0KLQotCQkJcmV0dXJuIHNvdXJjZS50b1N0cmluZygpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJT0V4Y2VwdGlvbiByZWFkaW5nIHNjcmlwdDogIgotCQkJCQkrIHNjcmlwdE5hbWUsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJT0V4Y2VwdGlvbiBjbG9zaW5nIHNjcmlwdDogIgotCQkJCQkJKyBzY3JpcHROYW1lLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0TWVzc2FnZUNvbnRleHQuamF2YSBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0TWVzc2FnZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjOWQ4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1lc3NhZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzLk9NRWxlbWVudENvbnZlcnRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotCi0vKioKLSAqIFNjcmlwdE1lc3NhZ2VDb250ZXh0IGRlY29yYXRlcyB0aGUgQXhpczIgTWVzc2FnZUNvbnRleHQgYWRkaW5nIG1ldGhvZHMgdG8gdXNlCi0gKiB0aGUgbWVzc2FnZSBwYXlsb2FkIFhNTCBpbiBhIHdheSBuYXR1cmFsIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY3JpcHRNZXNzYWdlQ29udGV4dCBleHRlbmRzIE1lc3NhZ2VDb250ZXh0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtYzsKLQotICAgIHByaXZhdGUgT01FbGVtZW50Q29udmVydG9yIGNvbnZlcnRvcjsKLQotICAgIHB1YmxpYyBTY3JpcHRNZXNzYWdlQ29udGV4dChNZXNzYWdlQ29udGV4dCBtYywgT01FbGVtZW50Q29udmVydG9yIGNvbnZlcnRvcikgewotICAgICAgICB0aGlzLm1jID0gbWM7Ci0gICAgICAgIHRoaXMuY29udmVydG9yID0gY29udmVydG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIG9mIFNPQVAgQm9keSBwYXlsb2FkLiBUaGUgcGF5bG9hZCBpcyB0aGUgZmlyc3QKLSAgICAgKiBlbGVtZW50IGluc2lkZSB0aGUgU09BUCA8Qm9keT4gdGFncwotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIFhNTCBTT0FQIEJvZHkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFBheWxvYWRYTUwoKSB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0b3IudG9TY3JpcHQobWMuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgU09BUCBib2R5IHBheWxvYWQgZnJvbSBYTUwKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF5bG9hZAotICAgICAqIEB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF5bG9hZFhNTChPYmplY3QgcGF5bG9hZCkgewotICAgICAgICBtYy5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5zZXRGaXJzdENoaWxkKGNvbnZlcnRvci5mcm9tU2NyaXB0KHBheWxvYWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29tcGxldGUgU09BUCBlbnZlbG9wZQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RW52ZWxvcGVYTUwoKSB7Ci0gICAgICAgIHJldHVybiBjb252ZXJ0b3IudG9TY3JpcHQobWMuZ2V0RW52ZWxvcGUoKSk7Ci0gICAgfQotCi0gICAgLy8gaGVscGVycyB0byBzZXQgRVBScyBmcm9tIGEgc2NyaXB0IHN0cmluZwotCi0gICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIHJlZmVyZW5jZSkgewotICAgICAgICBtYy5zZXRUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UocmVmZXJlbmNlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRUbyhTdHJpbmcgcmVmZXJlbmNlKSB7Ci0gICAgICAgIG1jLnNldEZhdWx0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlZmVyZW5jZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIHJlZmVyZW5jZSkgewotICAgICAgICBtYy5zZXRGcm9tKG5ldyBFbmRwb2ludFJlZmVyZW5jZShyZWZlcmVuY2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBseVRvKFN0cmluZyByZWZlcmVuY2UpIHsKLSAgICAgICAgbWMuc2V0UmVwbHlUbyhuZXcgRW5kcG9pbnRSZWZlcmVuY2UocmVmZXJlbmNlKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1vZHVsZS5qYXZhIGIvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNb2R1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ZTZhMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci0KLS8qKgotICogQXhpczIgbW9kdWxlIHRvIGluaXRpYWxpemUgc2NyaXB0IHNlcnZpY2VzLiBVc2VzIGEgU2NyaXB0RGVwbG95bWVudEVuZ2luZSB0bwotICogZmluZCBhbGwgdGhlIHNjcmlwdHMgaW4gdGhlIHNjcmlwdFNlcnZpY2VzIGRpcmVjdG9yeSBhbmQgZGVwbG95IHRoZW0gYXMgQXhpczIKLSAqIHNlcnZpY2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0TW9kdWxlIGltcGxlbWVudHMgTW9kdWxlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTY3JpcHRNb2R1bGUuY2xhc3MpOwotCi0gICAgc3RhdGljIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpLmdldEVuY29kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbml0IGJ5IGNyZWF0aW5nIGFuZCBkZXBsb3lpbmcgQXhpc1NlcnZpY2VzIGZvciBlYWNoIHNjcmlwdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGxvZy5kZWJ1Zygic2NyaXB0IHNlcnZpY2VzIGluaXQiKTsKLQotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBpZihheGlzQ29uZmlnLmdldFJlcG9zaXRvcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoIkF4aXNDb25maWd1cmF0aW9uIGdldFJlcG9zaXRvcnkgcmV0dXJucyBudWxsLCBjYW5ub3QgZGVwbG95IHNjcmlwdHMiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGUgc2NyaXB0U2VydmljZXNEaXJlY3RvcnkgPSBnZXRTY3JpcHRTZXJ2aWNlc0RpcmVjdG9yeShheGlzQ29uZmlnKTsKLSAgICAgICAgICAgIFNjcmlwdERlcGxveW1lbnRFbmdpbmUgZGVwbG95bWVudEVuZ2luZSA9IG5ldyBTY3JpcHREZXBsb3ltZW50RW5naW5lKGF4aXNDb25maWcpOwotICAgICAgICAgICAgZGVwbG95bWVudEVuZ2luZS5sb2FkUmVwb3NpdG9yeShzY3JpcHRTZXJ2aWNlc0RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBkZXBsb3ltZW50RW5naW5lLmxvYWRTZXJ2aWNlcygpOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1Zygic2NyaXB0IG1vZHVsZSBhY3RpdmF0ZWQiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByZXBvIGRpcmVjdG9yeSBmb3IgdGhlIHNjcmlwdHMuIFRoZSBzY3JpcHRzIGRpcmVjdG9yeSBpcyBhCi0gICAgICogc3ViLWRpcmVjdG9yeSBvZiB0aGUgQXhpczIgcmVwb3NpdG9yeSBkaXJlY3RvcnkuIEl0cyBuYW1lIG1heSBiZSBkZWZpbmVkCi0gICAgICogYnkgYSAnc2NyaXB0U2VydmljZXNEaXInIHByb3BlcnR5IGluIHRoZSBheGlzMi54bWwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzCi0gICAgICogYSB0byBhIGRpcmVjdG9yeSBuYW1lZCAnc2NyaXB0U2VydmljZXMnLgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGdldFNjcmlwdFNlcnZpY2VzRGlyZWN0b3J5KEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcpIHRocm93cyBEZXBsb3ltZW50RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgVVJMIGF4aXMyUmVwb3NpdG9yeSA9IGF4aXNDb25maWcuZ2V0UmVwb3NpdG9yeSgpOwotICAgICAgICAgICAgUGFyYW1ldGVyIHNjcmlwdHNEaXJQYXJhbSA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKCJzY3JpcHRTZXJ2aWNlc0RpciIpOwotICAgICAgICAgICAgU3RyaW5nIHNjcmlwdHNEaXIgPSBzY3JpcHRzRGlyUGFyYW0gPT0gbnVsbCA/ICJzY3JpcHRTZXJ2aWNlcyIgOiAoU3RyaW5nKXNjcmlwdHNEaXJQYXJhbS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKGF4aXMyUmVwb3NpdG9yeS5nZXRQYXRoKCksIGRlZmF1bHRFbmNvZGluZyk7Ci0gICAgICAgICAgICBqYXZhLmlvLkZpbGUgcmVwb0RpciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBqYXZhLmlvLkZpbGUocGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCd8JywgJzonKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShyZXBvRGlyLCBzY3JpcHRzRGlyKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwbG95bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBnZXR0aW5nIHNjcmlwdCBzZXJ2aWNlIGRpcmVjdG9yeSIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tIHRoZSBmb2xsb3dpbmcgYXJlIHVudXNlZCBtZXRob2RzIG9uIHRoZSBNb2R1bGUgaW50ZXJmYWNlIC0tLQotCi0gICAgcHVibGljIHZvaWQgYXBwbHlQb2xpY3koUG9saWN5IHBvbGljeSwgQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuU3VwcG9ydEFzc2VydGlvbihBc3NlcnRpb24gYXNzZXJ0aW9uKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmdhZ2VOb3RpZnkoQXhpc0Rlc2NyaXB0aW9uIGF4aXNEZXNjcmlwdGlvbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZWNlaXZlci5qYXZhIGIvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmZiYzA4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLkFic3RyYWN0SW5PdXRTeW5jTWVzc2FnZVJlY2VpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLmNvbnZlcnRvcnMuQ29udmVydG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzLk9NRWxlbWVudENvbnZlcnRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBBbiBBeGlzMiBNZXNzYWdlUmVjZWl2ZXIgZm9yIGludm9raW5nIHNjcmlwdCBsYW5ndWFnZSBmdW5jdGlvbnMuCi0gKiAKLSAqIFRoZSBzY3JpcHRpbmcgc3VwcG9ydCB1c2VzIHRoZSBBcGFjaGUgQmVhbiBTY3JpcHRpbmcgRnJhbWV3b3JrIChCU0YpIAotICogc28gdGhlIHNjcmlwdCBtYXkgYmUgd3JpdHRlbiBpbiBhbnkgbGFuZ3VhZ2Ugc3VwcG9ydGVkIGJ5IEJTRi4gCi0gKiAKLSAqIFRoZXJlIGFyZSB0d28gd2F5cyBvZiBkZWZpbmluZyB0aGUgc2NyaXB0LCBlaXRoZXIgaW4gYSBzZXBlcmF0ZSBmaWxlCi0gKiBvciBlbWJlZGRlZCBpbi1saW5lIHdpdGhpbiB0aGUgc2VydmljZXMueG1sIGZpbGUuCi0gKiAKLSAqIFRoaXMgZXhhbXBsZSBzaG93cyBhIHNlcnZpY2VzLnhtbCB1c2luZyBhIHNlcGVyYXRlIHNjcmlwdCBmaWxlOgotICogPGNvZGU+Ci0gKiAgIDxzZXJ2aWNlR3JvdXA+Ci0gKiAgICAgPHNlcnZpY2UgLi4uPgotICogICAgICAgLi4uCi0gKiAgICAgICA8cGFyYW1ldGVyIG5hbWU9InNjcmlwdCI+c2NyaXB0cy9teVNjcmlwdC5qczwvcGFyYW1ldGVyPgotICogICAgIDwvc2VydmljZT4KLSAqICAgPC9zZXJ2aWNlR3JvdXA+Ci0gKiA8L2NvZGU+Ci0gKiAKLSAqIFRoaXMgZXhhbXBsZSBzaG93cyBhIEphdmFTY3JpcHQgZnVuY3Rpb24gZW1iZWRkZWQgd2l0aGluIGEgc2VydmljZXMueG1sIGZpbGU6Ci0gKiA8Y29kZT4KLSAqICAgPHNlcnZpY2VHcm91cD4KLSAqICAgICA8c2VydmljZSAuLi4+Ci0gKiAgICAgICAuLi4KLSAqICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ic2NyaXB0LmpzIj48IVtDREFUQVsKLSAqICAgICAgICAgIGZ1bmN0aW9uIGludm9rZShpbk1DLCBvdXRNQykgewotICogICAgICAgICAgICAgLi4uCi0gKiAgICAgICAgICB9Ci0gKiAgICAgICAgXV0+PC9wYXJhbWV0ZXI+Ci0gKiAgICAgPC9zZXJ2aWNlPgotICogICA8L3NlcnZpY2VHcm91cD4KLSAqIDwvY29kZT4KLSAqIAotICogVGhlIHNjcmlwdCBsYW5ndWFnZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaWxlIG5hbWUgc3VmZml4IHdoZW4gdXNpbmcgc2NyaXB0cwotICogaW4gc2VwZXJhdGUgZmlsZXMgb3IgdGhlIHNjcmlwdCBwYXJhbWV0ZXIgbmFtZSBzdWZmaXggd2hlbiB1c2luZyBpbmxpbmUgc2NyaXB0cy4KLSAqLwotcHVibGljIGNsYXNzIFNjcmlwdFJlY2VpdmVyIGV4dGVuZHMgQWJzdHJhY3RJbk91dFN5bmNNZXNzYWdlUmVjZWl2ZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0FUVFIgPSAic2NyaXB0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9BVFRSID0gImZ1bmN0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZVTkNUSU9OID0gImludm9rZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVE9SX0FUVFIgPSAiY29udmVydG9yIjsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJTRkVOR0lORV9QUk9QID0gU2NyaXB0UmVjZWl2ZXIuY2xhc3MuZ2V0TmFtZSgpICsgIkJTRkVuZ2luZSI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVE9SX1BST1AgPSBTY3JpcHRSZWNlaXZlci5jbGFzcy5nZXROYW1lKCkgKyAiT01FbGVtZW50Q29udmVydG9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfU1JDX1BST1AgPSBTY3JpcHRSZWNlaXZlci5jbGFzcy5nZXROYW1lKCkgKyAiU2NyaXB0U3JjIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTY3JpcHRNb2R1bGUuY2xhc3MpOwotCi0gICAgcHVibGljIFNjcmlwdFJlY2VpdmVyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZXMgdGhlIHNlcnZpY2UgYnkgY2FsbGluZyB0aGUgc2NyaXB0IGZ1bmN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW52b2tlQnVzaW5lc3NMb2dpYyhNZXNzYWdlQ29udGV4dCBpbk1DLCBNZXNzYWdlQ29udGV4dCBvdXRNQykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGxvZy5kZWJ1ZygiaW52b2tpbmcgc2NyaXB0IHNlcnZpY2UiKTsKLQotICAgICAgICAgICAgb3V0TUMuc2V0RW52ZWxvcGUoZ2V0U09BUEZhY3RvcnkoaW5NQykuZ2V0RGVmYXVsdEVudmVsb3BlKCkpOwotCi0gICAgICAgICAgICBCU0ZFbmdpbmUgZW5naW5lID0gZ2V0QlNGRW5naW5lKGluTUMpOwotICAgICAgICAgICAgT01FbGVtZW50Q29udmVydG9yIGNvbnZlcnRvciA9IChPTUVsZW1lbnRDb252ZXJ0b3IpIGluTUMuZ2V0U2VydmljZUNvbnRleHQoKS5nZXRQcm9wZXJ0eShDT05WRVJUT1JfUFJPUCk7Ci0KLSAgICAgICAgICAgIFBhcmFtZXRlciBzY3JpcHRGdW5jdGlvblBhcmFtID0gaW5NQy5nZXRBeGlzU2VydmljZSgpLmdldFBhcmFtZXRlcihGVU5DVElPTl9BVFRSKTsKLSAgICAgICAgICAgIFN0cmluZyBzY3JpcHRGdW5jdGlvbiA9IHNjcmlwdEZ1bmN0aW9uUGFyYW0gPT0gbnVsbCA/IERFRkFVTFRfRlVOQ1RJT04gOiAoU3RyaW5nKSBzY3JpcHRGdW5jdGlvblBhcmFtLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIFNjcmlwdE1lc3NhZ2VDb250ZXh0IGluU2NyaXB0TUMgPSBuZXcgU2NyaXB0TWVzc2FnZUNvbnRleHQoaW5NQywgY29udmVydG9yKTsKLSAgICAgICAgICAgIFNjcmlwdE1lc3NhZ2VDb250ZXh0IG91dFNjcmlwdE1DID0gbmV3IFNjcmlwdE1lc3NhZ2VDb250ZXh0KG91dE1DLCBjb252ZXJ0b3IpOwotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IG5ldyBPYmplY3RbXSB7IGluU2NyaXB0TUMsIG91dFNjcmlwdE1DIH07Ci0KLSAgICAgICAgICAgIGVuZ2luZS5jYWxsKG51bGwsIHNjcmlwdEZ1bmN0aW9uLCBhcmdzKTsKLQotICAgICAgICB9IGNhdGNoIChCU0ZFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIEJTRkVuZ2luZSBmb3IgdGhlIHNjcmlwdCBzZXJ2aWNlLgotICAgICAqIAotICAgICAqIFRoZSBmaXJzdCBzZXJ2aWNlIGludm9jYXRpb24gY3JlYXRlcyB0aGUgQlNGRW5naW5lIGFuZCBjYWNoZXMKLSAgICAgKiBpdCBpbiB0aGUgQXhpczIgU2VydmljZUNvbnRleHQgZm9yIHJldXNlIGJ5IHN1YnNlcXVlbnQgcmVxdWVzdHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEJTRkVuZ2luZSBnZXRCU0ZFbmdpbmUoTWVzc2FnZUNvbnRleHQgbWMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBCU0ZFbmdpbmUgYnNmRW5naW5lOwotICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IG1jLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoc2VydmljZUNvbnRleHQpIHsKLSAgICAgICAgICAgIGJzZkVuZ2luZSA9IChCU0ZFbmdpbmUpIHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KEJTRkVOR0lORV9QUk9QKTsKLSAgICAgICAgICAgIGlmIChic2ZFbmdpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJzZkVuZ2luZSA9IGluaXRTY3JpcHQobWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBic2ZFbmdpbmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZXMgdGhlIHNjcmlwdCBzZXJ2aWNlIGJ5IGZpbmRpbmcgdGhlIHNjcmlwdCBzb3VyY2UgY29kZSwKLSAgICAgKiBjb21waWxpbmcgaXQgaW4gYSBCU0ZFbmdpbmUsIGFuZCBjcmVhdGluZyBhbiBPTUVsZW1lbnRDb252ZXJ0b3IKLSAgICAgKiBmb3IgdGhlIHNjcmlwdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQlNGRW5naW5lIGluaXRTY3JpcHQoTWVzc2FnZUNvbnRleHQgbWMpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBsb2cuZGVidWcoImluaXRpYWxpemluZyBzY3JpcHQgc2VydmljZSIpOwotCi0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbWMuZ2V0QXhpc1NlcnZpY2UoKTsKLQotICAgICAgICBTdHJpbmcgc2NyaXB0TmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzY3JpcHRTcmMgPSBudWxsOwotICAgICAgICBQYXJhbWV0ZXIgc2NyaXB0RmlsZVBhcmFtID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVyKFNDUklQVF9BVFRSKTsKLSAgICAgICAgaWYgKHNjcmlwdEZpbGVQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyB0aGUgc2NyaXB0IGlzIGRlZmluZWQgaW4gYSBzZXBlcmF0ZSBmaWxlCi0gICAgICAgICAgICBzY3JpcHROYW1lID0gKChTdHJpbmcpIHNjcmlwdEZpbGVQYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgc2NyaXB0U3JjUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoU0NSSVBUX1NSQ19QUk9QKTsKLSAgICAgICAgICAgIGlmIChzY3JpcHRTcmNQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2NyaXB0U3JjID0gKFN0cmluZykgc2NyaXB0U3JjUGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NyaXB0U3JjID0gcmVhZFNjcmlwdChheGlzU2VydmljZS5nZXRDbGFzc0xvYWRlcigpLCBzY3JpcHROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoZSBzY3JpcHQgaXMgZGVmaW5lZCBpbmxpbmUgd2l0aGluIHRoZSBzZXJ2aWNlcy54bWwKLSAgICAgICAgICAgIEFycmF5TGlzdCBwYXJhbWV0ZXJzID0gYXhpc1NlcnZpY2UuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBzY3JpcHRGaWxlUGFyYW0gPT0gbnVsbCAmJiBpPHBhcmFtZXRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcCA9IChQYXJhbWV0ZXIpIHBhcmFtZXRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChwLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzY3JpcHQuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsZVBhcmFtID0gcDsKLSAgICAgICAgICAgICAgICAgICAgc2NyaXB0TmFtZSA9IHAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBzY3JpcHRTcmMgPSAoU3RyaW5nKSBwLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzY3JpcHROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIk1pc3Npbmcgc2NyaXB0IHBhcmFtZXRlciIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBTdHJpbmcgc2NyaXB0TGFuZ3VhZ2UgPSBCU0ZNYW5hZ2VyLmdldExhbmdGcm9tRmlsZW5hbWUoc2NyaXB0TmFtZSk7Ci0gICAgICAgICAgICBCU0ZNYW5hZ2VyIGJzZk1hbmFnZXIgPSBuZXcgQlNGTWFuYWdlcigpOwotICAgICAgICAgICAgYnNmTWFuYWdlci5zZXRDbGFzc0xvYWRlcihCU0ZNYW5hZ2VyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgYnNmTWFuYWdlci5kZWNsYXJlQmVhbigiX0F4aXNTZXJ2aWNlIiwgYXhpc1NlcnZpY2UsIEF4aXNTZXJ2aWNlLmNsYXNzKTsKLQotICAgICAgICAgICAgQlNGRW5naW5lIGJzZkVuZ2luZSA9IGJzZk1hbmFnZXIubG9hZFNjcmlwdGluZ0VuZ2luZShzY3JpcHRMYW5ndWFnZSk7Ci0gICAgICAgICAgICBic2ZFbmdpbmUuZXhlYyhzY3JpcHROYW1lLCAwLCAwLCBzY3JpcHRTcmMpOwotCi0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IG1jLmdldFNlcnZpY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICBzZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0eShCU0ZFTkdJTkVfUFJPUCwgYnNmRW5naW5lKTsKLQotICAgICAgICAgICAgT01FbGVtZW50Q29udmVydG9yIGNvbnZlcnRvciA9IENvbnZlcnRvckZhY3RvcnkuY3JlYXRlT01FbGVtZW50Q29udmVydG9yKGF4aXNTZXJ2aWNlLCBzY3JpcHROYW1lKTsKLSAgICAgICAgICAgIHNlcnZpY2VDb250ZXh0LnNldFByb3BlcnR5KENPTlZFUlRPUl9QUk9QLCBjb252ZXJ0b3IpOwotCi0gICAgICAgICAgICByZXR1cm4gYnNmRW5naW5lOwotCi0gICAgICAgIH0gY2F0Y2ggKEJTRkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGNvbXBsZXRlIHNjcmlwdCBzb3VyY2UgY29kZSBpbnRvIGEgU3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZWFkU2NyaXB0KENsYXNzTG9hZGVyIGNsLCBTdHJpbmcgc2NyaXB0TmFtZSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFVSTCB1cmwgPSBjbC5nZXRSZXNvdXJjZShzY3JpcHROYW1lKTsKLSAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJTY3JpcHQgbm90IGZvdW5kOiAiICsgc2NyaXB0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgSW5wdXRTdHJlYW0gaXM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIklPRXhjZXB0aW9uIG9wZW5pbmcgc2NyaXB0OiAiICsgc2NyaXB0TmFtZSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsICJVVEYtOCIpOwotICAgICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNvdXJjZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGludCBjb3VudDsKLSAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSByZWFkZXIucmVhZChidWZmZXIpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzb3VyY2UuYXBwZW5kKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS50b1N0cmluZygpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJJT0V4Y2VwdGlvbiByZWFkaW5nIHNjcmlwdDogIiArIHNjcmlwdE5hbWUsIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIklPRXhjZXB0aW9uIGNsb3Npbmcgc2NyaXB0OiAiICsgc2NyaXB0TmFtZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdFJlcG9zaXRvcnlMaXN0ZW5lci5qYXZhIGIvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZXBvc2l0b3J5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNzc3ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdFJlcG9zaXRvcnlMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5EZXBsb3ltZW50RW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5SZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnJlcG9zaXRvcnkudXRpbC5XU0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5qYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotCi0vKioKLSAqIEFuIEF4aXMyIFJlcG9zaXRvcnlMaXN0ZW5lciBzdWJjbGFzcyBmb3IgZGVhbGluZyB3aXRoIHNjcmlwdCBzZXJ2aWNlcwotICovCi1wdWJsaWMgY2xhc3MgU2NyaXB0UmVwb3NpdG9yeUxpc3RlbmVyIGV4dGVuZHMgUmVwb3NpdG9yeUxpc3RlbmVyIHsKLQotICAgIHB1YmxpYyBTY3JpcHRSZXBvc2l0b3J5TGlzdGVuZXIoRGVwbG95bWVudEVuZ2luZSBkZXBsb3ltZW50RW5naW5lKSB7Ci0gICAgICAgIHN1cGVyKGRlcGxveW1lbnRFbmdpbmUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBhIGdpdmVuIGZvbGRlciBmb3Igc2NyaXB0IHNlcnZpY2VzIGFuZCBhZGRzIHRoZW0gdG8gYSBsaXN0IGluCi0gICAgICogdGhlIFdTSW5mb2xpc3QgY2xhc3MuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluZFNlcnZpY2VzSW5EaXJlY3RvcnkoKSB7Ci0gICAgICAgIC8vIG5lZWQgZG9Qcml2IHRvIGxpc3QgZmlsZXMgd2l0aCBKMlMgZW5hYmxlZAotICAgICAgICBGaWxlW10gZmlsZXMgPSAoRmlsZVtdKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZXBsb3ltZW50RW5naW5lLmdldFNlcnZpY2VzRGlyKCkubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB3c0luZm9MaXN0LmFkZFdTSW5mb0l0ZW0oZmlsZXNbaV0sIGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlRGVwbG95ZXIoKSwgV1NJbmZvLlRZUEVfQ1VTVE9NKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0vLyAgICAgICAgd3NJbmZvTGlzdC5hZGRXU0luZm9JdGVtKG51bGwsIGRlcGxveW1lbnRFbmdpbmUuZ2V0TW9kdWxlRGVwbG95ZXIoKSwgV1NJbmZvLlRZUEVfQ1VTVE9NKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE92ZXJyaWRlIHRoZSBSZXBvc2l0b3J5TGlzdGVuZXIgbWV0aG9kIHRvIGRvIG5vdGhpbmcgYXMgbm90IHJlcXVpcmVkIGZvcgotICAgICAqIHNjcmlwdCBzZXJ2aWNlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoZWNrTW9kdWxlcygpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE92ZXJyaWRlIHRoZSBSZXBvc2l0b3J5TGlzdGVuZXIgbWV0aG9kIHRvIGRvIG5vdGhpbmcgYXMgbm90IHJlcXVpcmVkIGZvcgotICAgICAqIHNjcmlwdCBzZXJ2aWNlcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxvYWRDbGFzc1BhdGhNb2R1bGVzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9Db252ZXJ0b3JGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvQ29udmVydG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI2MzY5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9Db252ZXJ0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5TY3JpcHRSZWNlaXZlcjsKLQotcHVibGljIGNsYXNzIENvbnZlcnRvckZhY3RvcnkgewotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBPTUVsZW1lbnRDb252ZXJ0b3IgZm9yIHRoZSBzY3JpcHQuCi0gICAgICogCi0gICAgICogVGhlIE9NRWxlbWVudENvbnZlcnRvciBpbXBsIGNsYXNzIG5hbWUgaXMgZWl0aGVyOgotICAgICAqIC0gdGhlIGNvbnZlcnRvciBjbGFzcyBuYW1lIGF0dHJpYnV0ZSBmcm9tIHRoZSBzY3JpcHQgZWxlbWVudCBpbiB0aGUgc2V2aWNlcy54bWwKLSAgICAgKiAtIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIG5hbWUgWFhPTUVsZW1lbnRDb252ZXJ0b3IgaW4gdGhlIGF4aXMyLnhtbAotICAgICAqICAgd2hlcmUgWFggaXMgdGhlIHNjcmlwdCBsYW5ndWFnZSBzdWZmaXggdXBwZXIgY2FzZWQsIGVnLiBKUyBvciBSQgotICAgICAqIC0gb3JnLmFwYWNoZS5heGlzMi5yZWNlaXZlcnMuc2NyaXB0aW5nLmNvbnZlcnRvcnMuWFhPTUVsZW1lbnRDb252ZXJ0b3Igd2hlcmUKLSAgICAgKiAgIHdoZXJlIFhYIGlzIHRoZSBzY3JpcHQgbGFuZ3VhZ2Ugc3VmZml4IHVwcGVyIGNhc2VkLCBlZy4gSlMgb3IgUkIKLSAgICAgKiAtIG9yZy5hcGFjaGUuYXhpczIucmVjZWl2ZXJzLnNjcmlwdGluZy5jb252ZXJ0b3JzLkRlZmF1bHRPTUVsZW1lbnRDb252ZXJ0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9NRWxlbWVudENvbnZlcnRvciBjcmVhdGVPTUVsZW1lbnRDb252ZXJ0b3IoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UsIFN0cmluZyBzY3JpcHROYW1lKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgT01FbGVtZW50Q29udmVydG9yIG9jID0gZ2V0U2NyaXB0Q29udmVydG9yKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgaWYgKG9jID09IG51bGwpIHsKLSAgICAgICAgICAgIG9jID0gZ2V0QXhpczJDb252ZXJ0b3IoYXhpc1NlcnZpY2UsIHNjcmlwdE5hbWUpOwotICAgICAgICB9IAotICAgICAgICBpZiAob2MgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvYyA9IGdldERlZmF1bHRTY3JpcHRDb252ZXJ0b3IoYXhpc1NlcnZpY2UsIHNjcmlwdE5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IAotICAgICAgICBpZiAob2MgPT0gbnVsbCkgewotICAgICAgICAgICAgb2MgPSBuZXcgRGVmYXVsdE9NRWxlbWVudENvbnZlcnRvcigpOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gb2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPTUVsZW1lbnRDb252ZXJ0b3IgZ2V0U2NyaXB0Q29udmVydG9yKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlKSB7Ci0gICAgICAgIE9NRWxlbWVudENvbnZlcnRvciBvYyA9IG51bGw7Ci0gICAgICAgIFBhcmFtZXRlciBjb252ZXJ0b3JQYXJhbSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcihTY3JpcHRSZWNlaXZlci5DT05WRVJUT1JfQVRUUik7Ci0gICAgICAgIGlmIChjb252ZXJ0b3JQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29udmVydG9yQ2xhc3NOYW1lID0gKFN0cmluZykgY29udmVydG9yUGFyYW0uZ2V0VmFsdWUoKTsgCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9jID0gKE9NRWxlbWVudENvbnZlcnRvcikgQ2xhc3MuZm9yTmFtZShjb252ZXJ0b3JDbGFzc05hbWUsIHRydWUsIGF4aXNTZXJ2aWNlLmdldENsYXNzTG9hZGVyKCkpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9NRWxlbWVudENvbnZlcnRvciBnZXRBeGlzMkNvbnZlcnRvcihBeGlzU2VydmljZSBheGlzU2VydmljZSwgU3RyaW5nIHNjcmlwdE5hbWUpIHsKLSAgICAgICAgT01FbGVtZW50Q29udmVydG9yIG9jID0gbnVsbDsKLSAgICAgICAgaW50IGxhc3REb3QgPSBzY3JpcHROYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBzdWZmaXggPSBzY3JpcHROYW1lLnN1YnN0cmluZyhsYXN0RG90ICsgMSkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE9NRWxlbWVudENvbnZlcnRvci5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICAgIFN0cmluZyBjb252ZXJ0b3JDbGFzc05hbWVQcm9wID0gc3VmZml4LnRvVXBwZXJDYXNlKCkgKyBjbGFzc05hbWUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFBhcmFtZXRlciBjb252ZXJ0b3JQYXJhbSA9IGF4aXNDb25maWcuZ2V0UGFyYW1ldGVyKGNvbnZlcnRvckNsYXNzTmFtZVByb3ApOwotICAgICAgICBpZiAoY29udmVydG9yUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbnZlcnRvckNsYXNzTmFtZSA9IChTdHJpbmcpIGNvbnZlcnRvclBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9jID0gKE9NRWxlbWVudENvbnZlcnRvcikgQ2xhc3MuZm9yTmFtZShjb252ZXJ0b3JDbGFzc05hbWUsIHRydWUsIGF4aXNTZXJ2aWNlLmdldENsYXNzTG9hZGVyKCkpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9NRWxlbWVudENvbnZlcnRvciBnZXREZWZhdWx0U2NyaXB0Q29udmVydG9yKEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlLCBTdHJpbmcgc2NyaXB0TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICBPTUVsZW1lbnRDb252ZXJ0b3Igb2MgPSBudWxsOwotICAgICAgICBpbnQgbGFzdERvdCA9IHNjcmlwdE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgU3RyaW5nIHN1ZmZpeCA9IHNjcmlwdE5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT01FbGVtZW50Q29udmVydG9yLmNsYXNzLmdldE5hbWUoKTsKLSAgICAgICAgaW50IGkgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgU3RyaW5nIGNvbnZlcnRvckNsYXNzTmFtZSA9IHN1ZmZpeC50b1VwcGVyQ2FzZSgpICsgY2xhc3NOYW1lLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWcgPSBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBQYXJhbWV0ZXIgY29udmVydG9yUGFyYW0gPSBheGlzQ29uZmlnLmdldFBhcmFtZXRlcihjb252ZXJ0b3JDbGFzc05hbWUpOwotICAgICAgICBpZiAoY29udmVydG9yUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvYyA9IChPTUVsZW1lbnRDb252ZXJ0b3IpIENsYXNzLmZvck5hbWUoKFN0cmluZykgY29udmVydG9yUGFyYW0uZ2V0VmFsdWUoKSwgdHJ1ZSwgYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGZxQ29udmVydG9yQ2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpICsgMSkgKyBjb252ZXJ0b3JDbGFzc05hbWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG9jID0gKE9NRWxlbWVudENvbnZlcnRvcikgQ2xhc3MuZm9yTmFtZShmcUNvbnZlcnRvckNsYXNzTmFtZSwgdHJ1ZSwgYXhpc1NlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9jID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvYyA9IChPTUVsZW1lbnRDb252ZXJ0b3IpIENsYXNzLmZvck5hbWUoZnFDb252ZXJ0b3JDbGFzc05hbWUsIHRydWUsIENvbnZlcnRvckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvYzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9EZWZhdWx0T01FbGVtZW50Q29udmVydG9yLmphdmEgYi8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvRGVmYXVsdE9NRWxlbWVudENvbnZlcnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU0YTQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9EZWZhdWx0T01FbGVtZW50Q29udmVydG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLmNvbnZlcnRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkVuZ2luZTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLS8qKgotICogVGhlIERlZmF1bHRPTUVsZW1lbnRDb252ZXJ0b3IgY29udmVydHMgYmV0d2VlbiBTeW5hcHNlIE9NRWxlbWVudHMgYW5kIFN0cmluZ3MKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRPTUVsZW1lbnRDb252ZXJ0b3IgaW1wbGVtZW50cyBPTUVsZW1lbnRDb252ZXJ0b3IgewotCi0gICAgcHVibGljIE9NRWxlbWVudCBmcm9tU2NyaXB0KE9iamVjdCBvKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSB4bWxCeXRlcyA9IG8udG9TdHJpbmcoKS5nZXRCeXRlcygpOwotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbEJ5dGVzKSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgb21FbGVtZW50ID0gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB0b1NjcmlwdChPTUVsZW1lbnQgb21FbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiBvbUVsZW1lbnQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmdpbmUoQlNGRW5naW5lIGUpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9KU09NRWxlbWVudENvbnZlcnRvci5qYXZhIGIvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL0pTT01FbGVtZW50Q29udmVydG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NjdhYjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL0pTT01FbGVtZW50Q29udmVydG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nLmNvbnZlcnRvcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuQ29udGV4dDsKLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlNjcmlwdGFibGU7Ci1pbXBvcnQgb3JnLm1vemlsbGEuamF2YXNjcmlwdC5TY3JpcHRhYmxlT2JqZWN0OwotaW1wb3J0IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuV3JhcHBlcjsKLWltcG9ydCBvcmcubW96aWxsYS5qYXZhc2NyaXB0LnhtbC5YTUxPYmplY3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBKU09iamVjdENvbnZlcnRvciBjb252ZXJ0cyBiZXR3ZWVuIE9NRWxlbWVudHMgYW5kIEphdmFTY3JpcHQgRTRYIFhNTCBvYmplY3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU09NRWxlbWVudENvbnZlcnRvciBleHRlbmRzIERlZmF1bHRPTUVsZW1lbnRDb252ZXJ0b3IgewotCi0gICAgcHJvdGVjdGVkIFNjcmlwdGFibGUgc2NvcGU7Ci0KLSAgICBwdWJsaWMgSlNPTUVsZW1lbnRDb252ZXJ0b3IoKSB7Ci0gICAgICAgIENvbnRleHQgY3ggPSBDb250ZXh0LmVudGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnNjb3BlID0gY3guaW5pdFN0YW5kYXJkT2JqZWN0cygpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQ29udGV4dC5leGl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRvU2NyaXB0KE9NRWxlbWVudCBvKSB7Ci0gICAgICAgIFhtbE9iamVjdCB4bWw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4bWwgPSBYbWxPYmplY3QuRmFjdG9yeS5wYXJzZShvLmdldFhNTFN0cmVhbVJlYWRlcigpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJleGNlcHRpb24gZ2V0dGluZyBtZXNzYWdlIFhNTDogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udGV4dCBjeCA9IENvbnRleHQuZW50ZXIoKTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgT2JqZWN0IHdyYXBwZWRYTUwgPSBjeC5nZXRXcmFwRmFjdG9yeSgpLndyYXAoY3gsIHNjb3BlLCB4bWwsIFhtbE9iamVjdC5jbGFzcyk7Ci0gICAgICAgICAgICBTY3JpcHRhYmxlIGpzWE1MID0gY3gubmV3T2JqZWN0KHNjb3BlLCAiWE1MIiwgbmV3IE9iamVjdFtdIHsgd3JhcHBlZFhNTCB9KTsKLQotICAgICAgICAgICAgcmV0dXJuIGpzWE1MOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBDb250ZXh0LmV4aXQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZnJvbVNjcmlwdChPYmplY3QgbykgewotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgWE1MT2JqZWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmZyb21TY3JpcHQobyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBFNFggQnVnPyBTaG91bGRuJ3QgbmVlZCB0aGlzIGNvcHksIGJ1dCB3aXRob3V0IGl0IHRoZSBvdXRlciBlbGVtZW50IGdldHMgbG9zdC4gU2VlIE1vemlsbGEgYnVnemlsbGEgMzYxNzIyCi0gICAgICAgIFNjcmlwdGFibGUganNYTUwgPSAoU2NyaXB0YWJsZSkgU2NyaXB0YWJsZU9iamVjdC5jYWxsTWV0aG9kKChTY3JpcHRhYmxlKSBvLCAiY29weSIsIG5ldyBPYmplY3RbMF0pOwotICAgICAgICBXcmFwcGVyIHdyYXBwZXIgPSAoV3JhcHBlcikgU2NyaXB0YWJsZU9iamVjdC5jYWxsTWV0aG9kKChYTUxPYmplY3QpanNYTUwsICJnZXRYbWxPYmplY3QiLCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgWG1sT2JqZWN0IHhtbE9iamVjdCA9IChYbWxPYmplY3Qpd3JhcHBlci51bndyYXAoKTsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgU3RBWE9NQnVpbGRlciBidWlsZGVyID0gbmV3IFN0QVhPTUJ1aWxkZXIoeG1sT2JqZWN0Lm5ld0lucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvT01FbGVtZW50Q29udmVydG9yLmphdmEgYi8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvT01FbGVtZW50Q29udmVydG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2Njc3YjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9jb252ZXJ0b3JzL09NRWxlbWVudENvbnZlcnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOwotCi0vKioKLSAqIFRoZSBPTUVsZW1lbnRDb252ZXJ0b3IgaW50ZXJmYWNlIGVuYWJsZXMgY3VzdG9taXppbmcgdGhlIGNvbnZlcnNpb24gb2YgCi0gKiBYTUwgYmV0d2VlbiBTeW5hcHNlIGFuZCBhIHNjcmlwdCBsYW5ndWFnZS4gU29tZSBzY3JpcHQgbGFuZ3VhZ2VzIGhhdmUgdGhlaXIKLSAqIG93biB3YXlzIG9mIHVzaW5nIFhNTCwgc3VjaCBhcyBFNFggaW4gSmF2YVNjcmlwdCBvciBSRVhNTCBpbiBSdWJ5LiBCdXQgQlNGCi0gKiBoYXMgbm8gc3VwcG9ydCBmb3IgdGhvc2Ugc28gU3luYXBzZSBuZWVkcyB0byBoYW5kbGUgdGhpcyBpdHNlbGYsIHdoaWNoIGlzIHdoYXQKLSAqIHRoZSBPTUVsZW1lbnRDb252ZXJ0b3IgZG9lcy4KLSAqIAotICogV2hpY2ggT01FbGVtZW50Q29udmVydG9yIHR5cGUgdG8gdXNlIGlzIGRpc2NvdmVyZWQgYmFzZWQgb24gdGhlIGZpbGUgbmFtZSBzdWZmaXggb2YgCi0gKiB0aGUgbWVkaWF0b3Igc2NyaXB0LiBUaGUgc3VmZml4IGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kIHVzZWQgYXMgdGhlIHByZWZpeCB0byAKLSAqIHRoZSBPTUVsZW1lbnRDb252ZXJ0b3IgY2xhc3NuYW1lLiBGb3IgZXhhbXBsZSwgd2l0aCBhIEphdmFTY3JpcHQgc2NyaXB0IG5hbWVkIG15c2NyaXB0LmpzCi0gKiB0aGUgLmpzIHN1ZmZpeCBpcyB0YWtlbiB0byBtYWtlIHRoZSBjb252ZXJ0b3IgY2xhc3MgbmFtZSAKLSAqICJvcmcuYXBhY2hlLnN5bmFwc2UubWVkaWF0b3JzLmJzZi5jb252ZXJ0b3JzLkpTT01FbGVtZW50Q29udmVydG9yIgotICogSWYgdGhlIGNvbnZlcnRvciBjbGFzcyBpcyBub3QgZm91bmQgdGhlbiBhIGRlZmF1bHQgY29udmVydG9yIGlzIHVzZWQgd2hpY2ggY29udmVydHMKLSAqIFhNTCB0byBhIFN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBPTUVsZW1lbnRDb252ZXJ0b3IgewotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEVuZ2luZShCU0ZFbmdpbmUgZSk7Ci0gICAgcHVibGljIE9iamVjdCB0b1NjcmlwdChPTUVsZW1lbnQgb21FbGVtZW50KTsKLSAgICAKLSAgICBwdWJsaWMgT01FbGVtZW50IGZyb21TY3JpcHQoT2JqZWN0IG8pOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvUkJPTUVsZW1lbnRDb252ZXJ0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9SQk9NRWxlbWVudENvbnZlcnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzMzNWRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9SQk9NRWxlbWVudENvbnZlcnRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNjcmlwdGluZy5jb252ZXJ0b3JzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmJzZi5CU0ZFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBPTUVsZW1lbnRDb252ZXJ0b3IgZm9yIFJ1Ynkgc2NyaXB0cwotICogCi0gKiBUT0RPOiBSaWdodCBub3cgdGhpcyBnb2VzIHZpYSBTdHJpbmdzIGFuZCBsaWtlbHkgaXNuJ3QgdmVyeSBmYXN0Ci0gKiBUaGVyZSBjb3VsZCB3ZWxsIGJlIG11Y2ggYmV0dGVyIHdheXMgdG8gZG8gdGhpcyA6KQotICovCi1wdWJsaWMgY2xhc3MgUkJPTUVsZW1lbnRDb252ZXJ0b3IgaW1wbGVtZW50cyBPTUVsZW1lbnRDb252ZXJ0b3IgewotCi0gICAgcHJvdGVjdGVkIEJTRkVuZ2luZSBic2ZFbmdpbmU7Ci0KLSAgICBwdWJsaWMgUkJPTUVsZW1lbnRDb252ZXJ0b3IoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB0b1NjcmlwdChPTUVsZW1lbnQgb21FbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzcmNGcmFnbWVudCA9IG5ldyBTdHJpbmdCdWZmZXIoIkRvY3VtZW50Lm5ldyg8PEVPRlxuIik7Ci0gICAgICAgICAgICBzcmNGcmFnbWVudC5hcHBlbmQob21FbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc3JjRnJhZ21lbnQuYXBwZW5kKCJcbkVPRlxuIik7Ci0gICAgICAgICAgICBzcmNGcmFnbWVudC5hcHBlbmQoIikiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgT2JqZWN0IG8gPSBic2ZFbmdpbmUuZXZhbCgiUkJPTUVsZW1lbnRDb252ZXJ0b3IiLCAwLCAwLCBzcmNGcmFnbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBvOwotCi0gICAgICAgIH0gY2F0Y2ggKEJTRkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBPTUVsZW1lbnQgZnJvbVNjcmlwdChPYmplY3QgbykgewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBieXRlW10geG1sQnl0ZXMgPSBvLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxCeXRlcykpOwotICAgICAgICAgICAgT01FbGVtZW50IG9tRWxlbWVudCA9IGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBvbUVsZW1lbnQ7Ci0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW5naW5lKEJTRkVuZ2luZSBlKSB7Ci0gICAgICAgIHRoaXMuYnNmRW5naW5lID0gZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC1yZXNvdXJjZXMvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcyBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0LXJlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2MwNDQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0LXJlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLQ0KLXBldHJhClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3QtcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3Qud3NkbCBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0LXJlc291cmNlcy9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlN2EwNDEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3QtcmVzb3VyY2VzL29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOmF4aXMyPSJodHRwOi8vc2VydmljZXMuc2FtcGxlcyIgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgeG1sbnM6bnMxPSJodHRwOi8vc2VydmljZXMuc2FtcGxlcy94c2QiIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2aWNlcy5zYW1wbGVzIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmF4MjE9Imh0dHA6Ly9zZXJ2aWNlcy5zYW1wbGVzL3hzZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NlcnZpY2VzLnNhbXBsZXMveHNkIj4KLQkJCTx4czplbGVtZW50IG5hbWU9ImdldFF1b3RlIj4KLQkJCQk8eHM6Y29tcGxleFR5cGU+Ci0JCQkJCTx4czpzZXF1ZW5jZT4KLQkJCQkJCTx4czplbGVtZW50IG5hbWU9InJlcXVlc3QiIHR5cGU9ImF4MjE6R2V0UXVvdGUiLz4KLQkJCQkJPC94czpzZXF1ZW5jZT4KLQkJCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJPC94czplbGVtZW50PgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iR2V0UXVvdGUiIHR5cGU9ImF4MjE6R2V0UXVvdGUiLz4KLQkJCTx4czpjb21wbGV4VHlwZSBuYW1lPSJHZXRRdW90ZSI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmNvbXBsZXhUeXBlPgotCQkJPHhzOmVsZW1lbnQgbmFtZT0iZ2V0UXVvdGVSZXNwb25zZSI+Ci0JCQkJPHhzOmNvbXBsZXhUeXBlPgotCQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9ImF4MjE6R2V0UXVvdGVSZXNwb25zZSIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJHZXRRdW90ZVJlc3BvbnNlIiB0eXBlPSJheDIxOkdldFF1b3RlUmVzcG9uc2UiLz4KLQkJCTx4czpjb21wbGV4VHlwZSBuYW1lPSJHZXRRdW90ZVJlc3BvbnNlIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImNoYW5nZSIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9ImVhcm5pbmdzIiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0iaGlnaCIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9Imxhc3QiIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJsYXN0VHJhZGVUaW1lc3RhbXAiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJsb3ciIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJtYXJrZXRDYXAiIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3BlbiIgdHlwZT0ieHM6ZG91YmxlIi8+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InBlUmF0aW8iIHR5cGU9InhzOmRvdWJsZSIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJwZXJjZW50YWdlQ2hhbmdlIiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0icHJldkNsb3NlIiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ic3ltYm9sIiB0eXBlPSJ4czpzdHJpbmciLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0idm9sdW1lIiB0eXBlPSJ4czppbnQiLz4KLQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJPC94czpjb21wbGV4VHlwZT4KLQkJCTx4czplbGVtZW50IG5hbWU9InBsYWNlT3JkZXIiPgotCQkJCTx4czpjb21wbGV4VHlwZT4KLQkJCQkJPHhzOnNlcXVlbmNlPgotCQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0ib3JkZXIiIHR5cGU9ImF4MjE6UGxhY2VPcmRlciIvPgotCQkJCQk8L3hzOnNlcXVlbmNlPgotCQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8L3hzOmVsZW1lbnQ+Ci0JCQk8eHM6ZWxlbWVudCBuYW1lPSJQbGFjZU9yZGVyIiB0eXBlPSJheDIxOlBsYWNlT3JkZXIiLz4KLQkJCTx4czpjb21wbGV4VHlwZSBuYW1lPSJQbGFjZU9yZGVyIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG5hbWU9InByaWNlIiB0eXBlPSJ4czpkb3VibGUiLz4KLQkJCQkJPHhzOmVsZW1lbnQgbmFtZT0icXVhbnRpdHkiIHR5cGU9InhzOmludCIvPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJzeW1ib2wiIHR5cGU9InhzOnN0cmluZyIvPgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmNvbXBsZXhUeXBlPgotCQk8L3hzOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRRdW90ZU1lc3NhZ2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczE6Z2V0UXVvdGUiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9ImdldFF1b3RlUmVzcG9uc2VNZXNzYWdlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnMxOmdldFF1b3RlUmVzcG9uc2UiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9InBsYWNlT3JkZXJNZXNzYWdlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnMxOnBsYWNlT3JkZXIiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJTaW1wbGVTdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFF1b3RlIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9ImF4aXMyOmdldFF1b3RlTWVzc2FnZSIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImF4aXMyOmdldFF1b3RlUmVzcG9uc2VNZXNzYWdlIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwbGFjZU9yZGVyIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9ImF4aXMyOnBsYWNlT3JkZXJNZXNzYWdlIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTx3c2RsOmJpbmRpbmcgbmFtZT0iU2ltcGxlU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFCaW5kaW5nIiB0eXBlPSJheGlzMjpTaW1wbGVTdG9ja1F1b3RlU2VydmljZVBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0idXJuOmdldFF1b3RlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly9zZXJ2aWNlcy5zYW1wbGVzIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3NlcnZpY2VzLnNhbXBsZXMiLz4KLQkJCTwvd3NkbDpvdXRwdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJwbGFjZU9yZGVyIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46cGxhY2VPcmRlciIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vc2VydmljZXMuc2FtcGxlcyIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpiaW5kaW5nPgotCTx3c2RsOnNlcnZpY2UgbmFtZT0iU2ltcGxlU3RvY2tRdW90ZVNlcnZpY2UiPgotCQk8d3NkbDpwb3J0IG5hbWU9IlNpbXBsZVN0b2NrUXVvdGVTZXJ2aWNlU09BUDExcG9ydCIgYmluZGluZz0iYXhpczI6U2ltcGxlU3RvY2tRdW90ZVNlcnZpY2VTT0FQMTFCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy9TaW1wbGVTdG9ja1F1b3RlU2VydmljZSIvPgotCQk8L3dzZGw6cG9ydD4KLQk8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0RGVwbG95bWVudEVuZ2luZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdERlcGxveW1lbnRFbmdpbmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYzY5NjEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0RGVwbG95bWVudEVuZ2luZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1wdWJsaWMgY2xhc3MgU2NyaXB0RGVwbG95bWVudEVuZ2luZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBBeGlzRmF1bHQsIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIFNjcmlwdERlcGxveW1lbnRFbmdpbmUgc2RlID0gbmV3IFNjcmlwdERlcGxveW1lbnRFbmdpbmUoYXhpc0NvbmZpZyk7Ci0gICAgICAgIFVSTCB0ZXN0U2NyaXB0ID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJvcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LmpzIik7Ci0gICAgICAgIEZpbGUgc2NyaXB0c0RpciA9IFV0aWxzLnRvRmlsZSh0ZXN0U2NyaXB0KS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIHNkZS5sb2FkUmVwb3NpdG9yeShzY3JpcHRzRGlyKTsKLSAgICAgICAgc2RlLmxvYWRTZXJ2aWNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGF4aXNDb25maWcuZ2V0U2VydmljZSgidGVzdCIpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1vZHVsZVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL1NjcmlwdE1vZHVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkYTg4ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRNb2R1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuc2NyaXB0aW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLXB1YmxpYyBjbGFzcyBTY3JpcHRNb2R1bGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2NyaXB0Rm9yV1NETCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgU2NyaXB0TW9kdWxlIG1vZHVsZSA9IG5ldyBTY3JpcHRNb2R1bGUoKTsKLS8vICAgICAgICBVUkwgd3NkbFVSTCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC53c2RsIik7Ci0vLyAgICAgICAgVVJMIHNjcmlwdFVSTCA9IG1vZHVsZS5nZXRTY3JpcHRGb3JXU0RMKHdzZGxVUkwpOwotLy8gICAgICAgIGFzc2VydFRydWUoc2NyaXB0VVJMLnRvU3RyaW5nKCkuZW5kc1dpdGgoInRlc3QuanMiKSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIHZvaWQgdGVzdEdldFdTRExzSW5EaXIoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24gewotLy8gICAgICAgIFNjcmlwdE1vZHVsZSBtb2R1bGUgPSBuZXcgU2NyaXB0TW9kdWxlKCk7Ci0vLyAgICAgICAgVVJMIHdzZGxVUkwgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIm9yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL3Rlc3RyZXBvL3Rlc3Qud3NkbCIpOwotLy8gICAgICAgIFVSTCBzY3JpcHRzRGlyID0gbmV3IEZpbGUod3NkbFVSTC50b1VSSSgpKS5nZXRQYXJlbnRGaWxlKCkudG9VUkwoKTsKLS8vICAgICAgICBMaXN0IHdzZGxzID0gbW9kdWxlLmdldFdTRExzSW5EaXIoc2NyaXB0c0Rpcik7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHdzZGxzLnNpemUoKSk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZSh3c2Rscy5nZXQoMCkudG9TdHJpbmcoKS5lbmRzV2l0aCgidGVzdC53c2RsIikpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU2NyaXB0U291cmNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0vLyAgICAgICAgU2NyaXB0TW9kdWxlIG1vZHVsZSA9IG5ldyBTY3JpcHRNb2R1bGUoKTsKLS8vICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJvcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LmpzIik7Ci0vLyAgICAgICAgU3RyaW5nIHMgPSBtb2R1bGUucmVhZFNjcmlwdFNvdXJjZSh1cmwpOwotLy8gICAgICAgIGFzc2VydEVxdWFscygicGV0cmEiLCBzKTsKLS8vICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTY3JpcHRTZXJ2aWNlc0RpcmVjdG9yeSgpIHRocm93cyBBeGlzRmF1bHQsIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgU2NyaXB0TW9kdWxlIG1vZHVsZSA9IG5ldyBTY3JpcHRNb2R1bGUoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJvcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LmpzIik7Ci0gICAgICAgIEZpbGUgZGlyID0gVXRpbHMudG9GaWxlKHVybCkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBheGlzQ29uZmlnLnNldFJlcG9zaXRvcnkoZGlyLmdldFBhcmVudEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigic2NyaXB0U2VydmljZXNEaXIiLCBkaXIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkaXIudG9VUkwoKSwgbW9kdWxlLmdldFNjcmlwdFNlcnZpY2VzRGlyZWN0b3J5KGF4aXNDb25maWcpLnRvVVJMKCkpOwotICAgIH0KLQotLy8gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNlcnZpY2UoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLS8vICAgICAgICBVUkwgd3NkbFVSTCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC53c2RsIik7Ci0vLyAgICAgICAgVVJMIHNjcmlwdFVSTCA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZSgib3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvdGVzdHJlcG8vdGVzdC5qcyIpOwotLy8gICAgICAgIFNjcmlwdE1vZHVsZSBtb2R1bGUgPSBuZXcgU2NyaXB0TW9kdWxlKCk7Ci0vLyAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBtb2R1bGUuY3JlYXRlU2VydmljZSh3c2RsVVJMLCBzY3JpcHRVUkwpOwotLy8gICAgICAgIGFzc2VydEVxdWFscygicGV0cmEiLCBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXJWYWx1ZShTY3JpcHRSZWNlaXZlci5TQ1JJUFRfU1JDX1BST1ApKTsKLS8vICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0KCkgdGhyb3dzIEF4aXNGYXVsdCwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgU2NyaXB0TW9kdWxlIG1vZHVsZSA9IG5ldyBTY3JpcHRNb2R1bGUoKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IG5ldyBBeGlzQ29uZmlndXJhdGlvbigpOwotICAgICAgICBVUkwgdXJsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKCJvcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy90ZXN0cmVwby90ZXN0LmpzIik7Ci0gICAgICAgIEZpbGUgZGlyID0gVXRpbHMudG9GaWxlKHVybCkuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBheGlzQ29uZmlnLnNldFJlcG9zaXRvcnkoZGlyLmdldFBhcmVudEZpbGUoKS50b1VSTCgpKTsKLSAgICAgICAgYXhpc0NvbmZpZy5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigic2NyaXB0U2VydmljZXNEaXIiLCBkaXIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRleHQoYXhpc0NvbmZpZyk7Ci0KLSAgICAgICAgbW9kdWxlLmluaXQoY29uZmlnQ29udGV4dCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwoYXhpc0NvbmZpZy5nZXRTZXJ2aWNlKCJ0ZXN0IikpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvU2NyaXB0UmVjZWl2ZXJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZWNlaXZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMzk2Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9TY3JpcHRSZWNlaXZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTY3JpcHRSZWNlaXZlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEludm9rZUJ1c2luZXNzTG9naWMoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgU2NyaXB0UmVjZWl2ZXIgc2NyaXB0UmVjZWl2ZXIgPSBuZXcgU2NyaXB0UmVjZWl2ZXIoKTsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgaW5NQyA9IFRlc3RVdGlscy5jcmVhdGVNb2NrTWVzc2FnZUNvbnRleHQoIjxhPnBldHJhPC9hPiIpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGluTUMuZ2V0QXhpc1NlcnZpY2UoKTsKLSAgICAgICAgYXhpc1NlcnZpY2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoU2NyaXB0UmVjZWl2ZXIuU0NSSVBUX0FUVFIsICJmb28uanMiKSk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9TUkNfUFJPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIGludm9rZShpbk1DLG91dE1DKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie291dE1DLnNldFBheWxvYWRYTUwoPGE+cGV0cmE8L2E+KSB9IikpOwotICAgICAgICBpbk1DLnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2aWNlKTsKLSAgICAgICAgc2NyaXB0UmVjZWl2ZXIuaW52b2tlQnVzaW5lc3NMb2dpYyhpbk1DLCBpbk1DKTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBpbk1DLmdldEVudmVsb3BlKCkuZ2V0Q2hpbGRFbGVtZW50cygpOwotICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPGE+cGV0cmE8L2E+IiwgKChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0Rmlyc3RFbGVtZW50KCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF4aXNTZXJ2aWNlKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFNjcmlwdFJlY2VpdmVyIHNjcmlwdFJlY2VpdmVyID0gbmV3IFNjcmlwdFJlY2VpdmVyKCk7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTUMgPSBUZXN0VXRpbHMuY3JlYXRlTW9ja01lc3NhZ2VDb250ZXh0KCI8YT5wZXRyYTwvYT4iKTsKLSAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSBpbk1DLmdldEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGF4aXNTZXJ2aWNlLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKFNjcmlwdFJlY2VpdmVyLlNDUklQVF9BVFRSLCAiZm9vLmpzIikpOwotICAgICAgICBheGlzU2VydmljZS5hZGRQYXJhbWV0ZXIoU2NyaXB0UmVjZWl2ZXIuU0NSSVBUX1NSQ19QUk9QLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyIHNjb3BlID0gX0F4aXNTZXJ2aWNlLmdldFNjb3BlKCk7ZnVuY3Rpb24gaW52b2tlKGluTUMsb3V0TUMpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7b3V0TUMuc2V0UGF5bG9hZFhNTCg8YT57c2NvcGV9PC9hPikgfSIpOwotICAgICAgICBzY3JpcHRSZWNlaXZlci5pbnZva2VCdXNpbmVzc0xvZ2ljKGluTUMsIGluTUMpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGluTUMuZ2V0RW52ZWxvcGUoKS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8YT5yZXF1ZXN0PC9hPiIsICgoT01FbGVtZW50KSBpdGVyYXRvci5uZXh0KCkpLmdldEZpcnN0RWxlbWVudCgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvVGVzdFV0aWxzLmphdmEgYi8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyZGU3Ny4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zY3JpcHRpbmcvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3NjcmlwdGluZy9UZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01Eb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2VHcm91cDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdFV0aWxzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgT01FbGVtZW50IGNyZWF0ZU9NRWxlbWVudChTdHJpbmcgeG1sKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IFN0cmluZ1JlYWRlcih4bWwpKTsKLSAgICAgICAgICAgIFN0QVhPTUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTdEFYT01CdWlsZGVyKHJlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZU1vY2tNZXNzYWdlQ29udGV4dChTdHJpbmcgcGF5bG9hZCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTUMgPSBuZXcgTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmdldERlZmF1bHRFbnZlbG9wZSgpOwotICAgICAgICBPTURvY3VtZW50IG9tRG9jID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0U09BUDExRmFjdG9yeSgpLmNyZWF0ZU9NRG9jdW1lbnQoKTsKLSAgICAgICAgb21Eb2MuYWRkQ2hpbGQoZW52ZWxvcGUpOwotICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQoVGVzdFV0aWxzLmNyZWF0ZU9NRWxlbWVudChwYXlsb2FkKSk7Ci0gICAgICAgIGluTUMuc2V0RW52ZWxvcGUoZW52ZWxvcGUpOwotICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gbmV3IEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGFzID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGFzLnNldE5hbWUoIlNjcmlwdFNlcnZpY2UiKTsKLSAgICAgICAgQXhpc1NlcnZpY2VHcm91cCBhc2cgPSBuZXcgQXhpc1NlcnZpY2VHcm91cChheGlzQ29uZmlnKTsKLSAgICAgICAgYXNnLmFkZFNlcnZpY2UoYXMpOwotICAgICAgICBhcy5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcigic2NyaXB0LmpzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIGludm9rZShpbk1DLCBvdXRNQykgeyBvdXRNQy5zZXRQYXlsb2FkWE1MKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgKyAiKX0iKSk7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNmZ0N0eCA9IG5ldyBDb25maWd1cmF0aW9uQ29udGV4dChheGlzQ29uZmlnKTsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ2MgPSBjZmdDdHguY3JlYXRlU2VydmljZUdyb3VwQ29udGV4dChhc2cpOwotICAgICAgICBpbk1DLnNldEF4aXNTZXJ2aWNlKGFzKTsKLSAgICAgICAgaW5NQy5zZXRTZXJ2aWNlQ29udGV4dChzZ2MuZ2V0U2VydmljZUNvbnRleHQoYXMpKTsKLSAgICAgICAgcmV0dXJuIGluTUM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9KU09NRWxlbWVudENvbnZlcnRvclRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3NjcmlwdGluZy90ZXN0L29yZy9hcGFjaGUvYXhpczIvc2NyaXB0aW5nL2NvbnZlcnRvcnMvSlNPTUVsZW1lbnRDb252ZXJ0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzQ0MzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc2NyaXB0aW5nL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi9zY3JpcHRpbmcvY29udmVydG9ycy9KU09NRWxlbWVudENvbnZlcnRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuY29udmVydG9yczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuU2NyaXB0UmVjZWl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5zY3JpcHRpbmcuVGVzdFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSlNPTUVsZW1lbnRDb252ZXJ0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MID0gIjxhPjxiPnBldHJhPC9iPjwvYT4iOwotCi0gICAgcHVibGljIHZvaWQgdGVzdFRvQW5kRnJvbVNjcmlwdCgpIHsKLSAgICAgICAgSlNPTUVsZW1lbnRDb252ZXJ0b3IgY29udmVydG9yID0gbmV3IEpTT01FbGVtZW50Q29udmVydG9yKCk7Ci0gICAgICAgIE9iamVjdCBvID0gY29udmVydG9yLnRvU2NyaXB0KFRlc3RVdGlscy5jcmVhdGVPTUVsZW1lbnQoWE1MKSk7Ci0gICAgICAgIE9NRWxlbWVudCBvbSA9IGNvbnZlcnRvci5mcm9tU2NyaXB0KG8pOwotICAgICAgICBhc3NlcnRFcXVhbHMoWE1MLCBvbS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbVNjcmlwdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTY3JpcHRSZWNlaXZlciBtZWRpYXRvciA9IG5ldyBTY3JpcHRSZWNlaXZlcigpOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBpbk1DID0gVGVzdFV0aWxzLmNyZWF0ZU1vY2tNZXNzYWdlQ29udGV4dChYTUwpOwotICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmNlID0gbmV3IEF4aXNTZXJ2aWNlKCk7Ci0gICAgICAgIGF4aXNTZXJ2Y2Uuc2V0UGFyZW50KG5ldyBBeGlzU2VydmljZUdyb3VwKG5ldyBBeGlzQ29uZmlndXJhdGlvbigpKSk7Ci0gICAgICAgIGF4aXNTZXJ2Y2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoU2NyaXB0UmVjZWl2ZXIuU0NSSVBUX0FUVFIsICJmb28uanMiKSk7Ci0gICAgICAgIGF4aXNTZXJ2Y2UuYWRkUGFyYW1ldGVyKG5ldyBQYXJhbWV0ZXIoU2NyaXB0UmVjZWl2ZXIuU0NSSVBUX1NSQ19QUk9QLCAiZnVuY3Rpb24gaW52b2tlKGluTUMsb3V0TUMpIHsgb3V0TUMuc2V0UGF5bG9hZFhNTCg8YT48Yj5wZXRyYTwvYj48L2E+KSB9IikpOwotICAgICAgICBpbk1DLnNldEF4aXNTZXJ2aWNlKGF4aXNTZXJ2Y2UpOwotICAgICAgICBtZWRpYXRvci5pbnZva2VCdXNpbmVzc0xvZ2ljKGluTUMsIGluTUMpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGluTUMuZ2V0RW52ZWxvcGUoKS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFhNTCwgKChPTUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0Rmlyc3RFbGVtZW50KCkudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9tb2R1bGUvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3NvYXBtb25pdG9yL21vZHVsZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ3Y2Y3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NvYXBtb25pdG9yL21vZHVsZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5zb2FwbW9uaXRvcjwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFNPQVAgTW9uaXRvciBNb2R1bGU8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPnNvYXBtb25pdG9yIG1vZHVsZSBmb3IgQXhpcyAyLjA8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1zb2FwbW9uaXRvci1zZXJ2bGV0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc29hcG1vbml0b3IvbW9kdWxlPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc29hcG1vbml0b3IvbW9kdWxlPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9tb2R1bGU8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLW1hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc29hcG1vbml0b3IvbW9kdWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9zb2FwbW9uaXRvci9TT0FQTW9uaXRvckhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL3NvYXBtb25pdG9yL21vZHVsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvaGFuZGxlcnMvc29hcG1vbml0b3IvU09BUE1vbml0b3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmVkYTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc29hcG1vbml0b3IvbW9kdWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9zb2FwbW9uaXRvci9TT0FQTW9uaXRvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc29hcG1vbml0b3Iuc2VydmxldC5TT0FQTW9uaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLnNlcnZsZXQuU09BUE1vbml0b3JTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgU09BUE1vbml0b3JIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIG5leHRfbWVzc2FnZV9pZCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBTT0FQTW9uaXRvckhhbmRsZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYW5kIFNPQVAgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSByZWYgPSBudWxsOwotCi0gICAgICAgIC8vIEdldCBpZCwgdHlwZSBhbmQgY29udGVudAotICAgICAgICBMb25nIGlkOwotICAgICAgICBJbnRlZ2VyIHR5cGU7Ci0gICAgICAgIC8vICdzb2FwIHJlcXVlc3QnIG11c3QgYmUgY2FsbGVkIGZpcnN0Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuSU5fRkxPVykgewotICAgICAgICAgICAgLy8gc2hvdyBzb2FwIG1lc3NhZ2UgaW5zaWRlIHRoZSAnc29hcCByZXF1ZXN0JyBwYW5lIGluIHRoZSBhcHBsZXQKLSAgICAgICAgICAgIGlkID0gYXNzaWduTWVzc2FnZUlkKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIHR5cGUgPSBuZXcgSW50ZWdlcihTT0FQTW9uaXRvckNvbnN0YW50cy5TT0FQX01PTklUT1JfUkVRVUVTVCk7Ci0gICAgICAgICAgICByZWYgPSBtZXNzYWdlQ29udGV4dC5nZXRUbygpOwotICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VDb250ZXh0LmdldEZMT1coKSA9PSBNZXNzYWdlQ29udGV4dC5PVVRfRkxPVykgewotICAgICAgICAgICAgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgLy8gc2hvdyBzb2FwIG1lc3NhZ2UgaW5zaWRlIHRoZSAnc29hcCByZXNwb25zZScgcGFuZSBpbiB0aGUgYXBwbGV0Ci0gICAgICAgICAgICB0eXBlID0gbmV3IEludGVnZXIoU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFU1BPTlNFKTsKLSAgICAgICAgICAgIHJlZiA9IG1lc3NhZ2VDb250ZXh0LmdldEZyb20oKTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlQ29udGV4dC5nZXRGTE9XKCkgPT0gTWVzc2FnZUNvbnRleHQuSU5fRkFVTFRfRkxPVykgewotICAgICAgICAgICAgaWQgPSBnZXRNZXNzYWdlSWQobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgLy8gc2hvdyBzb2FwIG1lc3NhZ2UgaW5zaWRlIHRoZSAnc29hcCByZXF1ZXN0JyBwYW5lIGluIHRoZSBhcHBsZXQKLSAgICAgICAgICAgIHR5cGUgPSBuZXcgSW50ZWdlcihTT0FQTW9uaXRvckNvbnN0YW50cy5TT0FQX01PTklUT1JfUkVRVUVTVCk7Ci0gICAgICAgICAgICByZWYgPSBtZXNzYWdlQ29udGV4dC5nZXRGYXVsdFRvKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZUNvbnRleHQuZ2V0RkxPVygpID09IE1lc3NhZ2VDb250ZXh0Lk9VVF9GQVVMVF9GTE9XKSB7Ci0gICAgICAgICAgICBpZCA9IGdldE1lc3NhZ2VJZChtZXNzYWdlQ29udGV4dCk7Ci0gICAgICAgICAgICAvLyBzaG93IHNvYXAgbWVzc2FnZSBpbnNpZGUgdGhlICdzb2FwIHJlc3BvbnNlJyBwYW5lIGluIHRoZSBhcHBsZXQKLSAgICAgICAgICAgIHR5cGUgPSBuZXcgSW50ZWdlcihTT0FQTW9uaXRvckNvbnN0YW50cy5TT0FQX01PTklUT1JfUkVTUE9OU0UpOwotICAgICAgICAgICAgLy8gVE9ETyAtIEhvdyBkbyBJIGdldCBhbiBFUFIgb24gTWVzc2FnZUNvbnRleHQuT1VUX0ZBVUxUX0ZMT1cgPwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBGTE9XIGRldGVjdGVkIGluIG1lc3NhZ2VDb250ZXh0OiAiICsgbWVzc2FnZUNvbnRleHQuZ2V0RkxPVygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0YXJnZXQgPSBudWxsOwotICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRhcmdldCA9IHJlZi5nZXRBZGRyZXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIG51bGwgdGFyZ2V0Ci0gICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0ID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIFNPQVAgcG9ydGlvbiBvZiB0aGUgbWVzc2FnZQotICAgICAgICBTdHJpbmcgc29hcCA9IG51bGw7Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNvYXAgPSBtZXNzYWdlQ29udGV4dC5nZXRFbnZlbG9wZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpZCBhbmQgYSBTT0FQIHBvcnRpb24sIHRoZW4gc2VuZCB0aGUKLSAgICAgICAgLy8gbWVzc2FnZSB0byB0aGUgU09BUCBtb25pdG9yIHNlcnZpY2UKLSAgICAgICAgaWYgKChpZCAhPSBudWxsKSAmJiAoc29hcCAhPSBudWxsKSkgewotICAgICAgICAgICAgU09BUE1vbml0b3JTZXJ2aWNlLnB1Ymxpc2hNZXNzYWdlKGlkLCB0eXBlLCB0YXJnZXQsIHNvYXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnZvY2F0aW9uUmVzcG9uc2UuQ09OVElOVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXNzaWduIGEgbmV3IG1lc3NhZ2UgaWQKLSAgICAgKi8KLSAgICBwcml2YXRlIExvbmcgYXNzaWduTWVzc2FnZUlkKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIExvbmcgaWQ7Ci0gICAgICAgIHN5bmNocm9uaXplZCAoU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX0lEKSB7Ci0gICAgICAgICAgICBpZCA9IG5ldyBMb25nKG5leHRfbWVzc2FnZV9pZCk7Ci0gICAgICAgICAgICBuZXh0X21lc3NhZ2VfaWQrKzsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuc2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX0lELCBpZCk7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGFscmVhZHkgYXNzaWduZWQgbWVzc2FnZSBpZAotICAgICAqLwotICAgIHByaXZhdGUgTG9uZyBnZXRNZXNzYWdlSWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgTG9uZyBpZDsKLSAgICAgICAgaWQgPSAoTG9uZykgbWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIFNPQVBNb25pdG9yQ29uc3RhbnRzLlNPQVBfTU9OSVRPUl9JRCk7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9tb2R1bGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL3NvYXBtb25pdG9yL1NPQVBNb25pdG9yTW9kdWxlLmphdmEgYi8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9tb2R1bGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL2hhbmRsZXJzL3NvYXBtb25pdG9yL1NPQVBNb25pdG9yTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNjQxMDIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc29hcG1vbml0b3IvbW9kdWxlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9oYW5kbGVycy9zb2FwbW9uaXRvci9TT0FQTW9uaXRvck1vZHVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIubW9kdWxlcy5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuQXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubmVldGhpLlBvbGljeTsKLQotcHVibGljIGNsYXNzIFNPQVBNb25pdG9yTW9kdWxlIGltcGxlbWVudHMgTW9kdWxlIHsKLQotCi0gICAgIC8vIGluaXRpYWxpemUgdGhlIG1vZHVsZQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCwgQXhpc01vZHVsZSBtb2R1bGUpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuZ2FnZU5vdGlmeShBeGlzRGVzY3JpcHRpb24gYXhpc0Rlc2NyaXB0aW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvLyBzaHV0ZG93biB0aGUgbW9kdWxlCi0gICAgcHVibGljIHZvaWQgc2h1dGRvd24oQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBvbGljeU5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5UG9saWN5KFBvbGljeSBwb2xpY3ksIEF4aXNEZXNjcmlwdGlvbiBheGlzRGVzY3JpcHRpb24pIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhblN1cHBvcnRBc3NlcnRpb24oQXNzZXJ0aW9uIGFzc2VydGlvbikgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9tb2R1bGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21vZHVsZS54bWwgYi8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9tb2R1bGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21vZHVsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTMxZWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc29hcG1vbml0b3IvbW9kdWxlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tb2R1bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08bW9kdWxlIG5hbWU9InNvYXBtb25pdG9yIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5zb2FwbW9uaXRvci5TT0FQTW9uaXRvck1vZHVsZSI+Ci0gICAgPEluRmxvdz4KLSAgICAgICAgPGhhbmRsZXIgbmFtZT0iSW5GbG93U09BUE1vbml0b3JIYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5zb2FwbW9uaXRvci5TT0FQTW9uaXRvckhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L0luRmxvdz4KLQotICAgIDxPdXRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJPdXRGbG93U09BUE1vbml0b3JIYW5kbGVyIiBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi5oYW5kbGVycy5zb2FwbW9uaXRvci5TT0FQTW9uaXRvckhhbmRsZXIiPgotICAgICAgICAgICAgPG9yZGVyIHBoYXNlPSJzb2FwbW9uaXRvclBoYXNlIi8+Ci0gICAgICAgIDwvaGFuZGxlcj4KLSAgICA8L091dEZsb3c+Ci0KLSAgICA8T3V0RmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJGYXVsdE91dEZsb3dTT0FQTW9uaXRvckhhbmRsZXIiIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLnNvYXBtb25pdG9yLlNPQVBNb25pdG9ySGFuZGxlciI+Ci0gICAgICAgICAgICA8b3JkZXIgcGhhc2U9InNvYXBtb25pdG9yUGhhc2UiLz4KLSAgICAgICAgPC9oYW5kbGVyPgotICAgIDwvT3V0RmF1bHRGbG93PgotCi0gICAgPEluRmF1bHRGbG93PgotICAgICAgICA8aGFuZGxlciBuYW1lPSJGYXVsdEluRmxvd1NPQVBNb25pdG9ySGFuZGxlciIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuc29hcG1vbml0b3IuU09BUE1vbml0b3JIYW5kbGVyIj4KLSAgICAgICAgICAgIDxvcmRlciBwaGFzZT0ic29hcG1vbml0b3JQaGFzZSIvPgotICAgICAgICA8L2hhbmRsZXI+Ci0gICAgPC9JbkZhdWx0Rmxvdz4KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldC9wb20ueG1sIGIvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTcyM2NkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NvYXBtb25pdG9yL3NlcnZsZXQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItc29hcG1vbml0b3Itc2VydmxldDwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFNPQVAgTW9uaXRvciBTZXJ2bGV0PC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5zb2FwbW9uaXRvciBzZXJ2bGV0IGZvciBBeGlzIDIuMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0PC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldDwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvc29hcG1vbml0b3IvYXBwbGV0L1NPQVBNb25pdG9yQXBwbGV0LmphdmEgYi8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9hcHBsZXQvU09BUE1vbml0b3JBcHBsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUzNmI2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9hcHBsZXQvU09BUE1vbml0b3JBcHBsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLmFwcGxldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuc29hcG1vbml0b3Iuc2VydmxldC5TT0FQTW9uaXRvckNvbnN0YW50czsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRXRjaGVkQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLkFic3RyYWN0VGFibGVNb2RlbDsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIFNPQVAgTW9pbnRvciBBcHBsZXQgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzCi0gKiB0aGUgdXNlciBpbnRlcmZhY2UgZm9yIGRpc3BsYXlpbmcgZGF0YSBmcm9tIHRoZSBTT0FQCi0gKiBtb25pdG9yIHNlcnZpY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQTW9uaXRvckFwcGxldCBleHRlbmRzIEpBcHBsZXQgewotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBkYXRhCi0gICAgICovCi0gICAgcHJpdmF0ZSBKUGFuZWwgICAgICBtYWluX3BhbmVsID0gbnVsbDsKLSAgICBwcml2YXRlIEpUYWJiZWRQYW5lIHRhYmJlZF9wYW5lID0gbnVsbDsKLSAgICBwcml2YXRlIGludCAgICAgICAgIHBvcnQgPSAwOwotICAgIHByaXZhdGUgVmVjdG9yICAgICAgcGFnZXMgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUE1vbml0b3JBcHBsZXQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGV0IGluaXRpYWxpemF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgLy8gR2V0IHRoZSBwb3J0IHRvIGJlIHVzZWQKLSAgICAgICAgU3RyaW5nIHBvcnRfc3RyID0gZ2V0UGFyYW1ldGVyKCJwb3J0Iik7Ci0gICAgICAgIGlmIChwb3J0X3N0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwb3J0ID0gSW50ZWdlci5wYXJzZUludChwb3J0X3N0cik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVHJ5IHRvIHVzZSB0aGUgc3lzdGVtIGxvb2sgYW5kIGZlZWwKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotICAgICAgICB9Ci0gICAgICAgIC8vIENyZWF0ZSBtYWluIHBhbmVsIHRvIGhvbGQgbm90ZWJvb2sKLSAgICAgICAgbWFpbl9wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgbWFpbl9wYW5lbC5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlKTsKLSAgICAgICAgbWFpbl9wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgc2V0Q29udGVudFBhbmUobWFpbl9wYW5lbCk7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgbm90ZWJvb2sKLSAgICAgICAgdGFiYmVkX3BhbmUgPSBuZXcgSlRhYmJlZFBhbmUoSlRhYmJlZFBhbmUuVE9QKTsKLSAgICAgICAgbWFpbl9wYW5lbC5hZGQodGFiYmVkX3BhbmUsQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgIC8vIEFkZCBub3RlYm9vayBwYWdlIGZvciBkZWZhdWx0IGhvc3QgY29ubmVjdGlvbgotICAgICAgICBwYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgYWRkUGFnZShuZXcgU09BUE1vbml0b3JQYWdlKGdldENvZGVCYXNlKCkuZ2V0SG9zdCgpKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcGFnZSB0byB0aGUgbm90ZWJvb2sKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYWRkUGFnZShTT0FQTW9uaXRvclBhZ2UgcGcpIHsKLSAgICAgICAgdGFiYmVkX3BhbmUuYWRkVGFiKCIgICIrcGcuZ2V0SG9zdCgpKyIgICIsIHBnKTsKLSAgICAgICAgcGFnZXMuYWRkRWxlbWVudChwZyk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEFwcGxldCBpcyBiZWluZyBkaXNwbGF5ZWQgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIC8vIFRlbGwgYWxsIHBhZ2VzIHRvIHN0YXJ0IHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGFnZXMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yUGFnZSBwZyA9IChTT0FQTW9uaXRvclBhZ2UpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGcuc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQXBwbGV0IGlzIG5vIGxvbmdlciBkaXNwbGF5ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICAvLyBUZWxsIGFsbCBwYWdlcyB0byBzdG9wIHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcGFnZXMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yUGFnZSBwZyA9IChTT0FQTW9uaXRvclBhZ2UpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGcuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwbGV0IGNsZWFudXAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICB0YWJiZWRfcGFuZSA9IG51bGw7Ci0gICAgICAgIG1haW5fcGFuZWwgPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGNvbnRlbnRzIG9mIGEgbm90ZWJvb2sgcGFnZQotICAgICAqIHJlcHJlc2VudGluZyBhIHNlcnZlciBjb25uZWN0aW9uLgotICAgICAqLwotICAgIGNsYXNzIFNPQVBNb25pdG9yUGFnZSBleHRlbmRzIEpQYW5lbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0U2VsZWN0aW9uTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uTGlzdGVuZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGF0dXMgU3RyaW5ncwotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1RBVFVTX0FDVElWRSAgICA9ICJUaGUgU09BUCBNb25pdG9yIGlzIHN0YXJ0ZWQuIjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1RBVFVTX1NUT1BQRUQgICA9ICJUaGUgU09BUCBNb25pdG9yIGlzIHN0b3BwZWQuIjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1RBVFVTX0NMT1NFRCAgICA9ICJUaGUgc2VydmVyIGNvbW11bmljYXRpb24gaGFzIGJlZW4gdGVybWluYXRlZC4iOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTVEFUVVNfTk9DT05ORUNUID0gIlRoZSBTT0FQIE1vbml0b3IgaXMgdW5hYmxlIHRvIGNvbW11bmNhdGUgd2l0aCB0aGUgc2VydmVyLiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByaXZhdGUgZGF0YQotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgaG9zdCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU29ja2V0ICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgT2JqZWN0SW5wdXRTdHJlYW0gICAgIGluID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBPYmplY3RPdXRwdXRTdHJlYW0gICAgb3V0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQTW9uaXRvclRhYmxlTW9kZWwgbW9kZWwgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpUYWJsZSAgICAgICAgICAgICAgICB0YWJsZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgICAgICAgICAgIHNjcm9sbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgICAgIGxpc3RfcGFuZWwgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpQYW5lbCAgICAgICAgICAgICAgICBsaXN0X2J1dHRvbnMgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpCdXR0b24gICAgICAgICAgICAgICByZW1vdmVfYnV0dG9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uICAgICAgICAgICAgICAgcmVtb3ZlX2FsbF9idXR0b24gPSBudWxsOwotICAgICAgICBwcml2YXRlIEpCdXR0b24gICAgICAgICAgICAgICBmaWx0ZXJfYnV0dG9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgZGV0YWlsc19wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKU3BsaXRQYW5lICAgICAgICAgICAgZGV0YWlsc19zb2FwID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgZGV0YWlsc19idXR0b25zID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgZGV0YWlsc190aW1lID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgZGV0YWlsc190YXJnZXQgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpMYWJlbCAgICAgICAgICAgICAgICBkZXRhaWxzX3N0YXR1cyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsICAgICAgICAgICAgICAgIGRldGFpbHNfdGltZV92YWx1ZSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsICAgICAgICAgICAgICAgIGRldGFpbHNfdGFyZ2V0X3ZhbHVlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUgPSBudWxsOwotICAgICAgICBwcml2YXRlIEVtcHR5Qm9yZGVyICAgICAgICAgICBlbXB0eV9ib3JkZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIEV0Y2hlZEJvcmRlciAgICAgICAgICBldGNoZWRfYm9yZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgcmVxdWVzdF9wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgICAgIHJlc3BvbnNlX3BhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgcmVxdWVzdF9sYWJlbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkxhYmVsICAgICAgICAgICAgICAgIHJlc3BvbnNlX2xhYmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQTW9uaXRvclRleHRBcmVhICAgcmVxdWVzdF90ZXh0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTT0FQTW9uaXRvclRleHRBcmVhICAgcmVzcG9uc2VfdGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlNjcm9sbFBhbmUgICAgICAgICAgIHJlcXVlc3Rfc2Nyb2xsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSAgICAgICAgICAgcmVzcG9uc2Vfc2Nyb2xsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uICAgICAgICAgICAgICAgbGF5b3V0X2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlNwbGl0UGFuZSAgICAgICAgICAgIHNwbGl0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgICAgc3RhdHVzX2FyZWEgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpQYW5lbCAgICAgICAgICAgICAgICBzdGF0dXNfYnV0dG9ucyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgICAgIHN0YXJ0X2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgICAgIHN0b3BfYnV0dG9uID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgICAgICAgICAgICAgICAgc3RhdHVzX3RleHQgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpQYW5lbCAgICAgICAgICAgICAgICBzdGF0dXNfdGV4dF9wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgU09BUE1vbml0b3JGaWx0ZXIgICAgIGZpbHRlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgR3JpZEJhZ0xheW91dCAgICAgICAgIGRldGFpbHNfaGVhZGVyX2xheW91dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgR3JpZEJhZ0NvbnN0cmFpbnRzICAgIGRldGFpbHNfaGVhZGVyX2NvbnN0cmFpbnRzID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKQ2hlY2tCb3ggICAgICAgICAgICAgcmVmbG93X3htbCA9IG51bGw7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIChjcmVhdGUgYW5kIGxheW91dCBwYWdlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNPQVBNb25pdG9yUGFnZShTdHJpbmcgaG9zdF9uYW1lKSB7Ci0gICAgICAgICAgICBob3N0ID0gaG9zdF9uYW1lOwotICAgICAgICAgICAgLy8gU2V0IHVwIGRlZmF1bHQgZmlsdGVyIChzaG93IGFsbCBtZXNzYWdlcykKLSAgICAgICAgICAgIGZpbHRlciA9IG5ldyBTT0FQTW9uaXRvckZpbHRlcigpOwotICAgICAgICAgICAgLy8gVXNlIGJvcmRlcnMgdG8gaGVscCBpbXByb3ZlIGFwcGVhcmFuY2UKLSAgICAgICAgICAgIGV0Y2hlZF9ib3JkZXIgPSBuZXcgRXRjaGVkQm9yZGVyKCk7Ci0gICAgICAgICAgICAvLyBCdWlsZCB0b3AgcG9ydGlvbiBvZiBzcGxpdCAobGlzdCBwYW5lbCkgCi0gICAgICAgICAgICBtb2RlbCA9IG5ldyBTT0FQTW9uaXRvclRhYmxlTW9kZWwoKTsKLSAgICAgICAgICAgIHRhYmxlID0gbmV3IEpUYWJsZShtb2RlbCk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLSAgICAgICAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbkludGVydmFsKDAsMCk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRQcmVmZXJyZWRTY3JvbGxhYmxlVmlld3BvcnRTaXplKG5ldyBEaW1lbnNpb24oNjAwLCA5NikpOwotICAgICAgICAgICAgdGFibGUuZ2V0U2VsZWN0aW9uTW9kZWwoKS5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBzY3JvbGwgPSBuZXcgSlNjcm9sbFBhbmUodGFibGUpOwotICAgICAgICAgICAgcmVtb3ZlX2J1dHRvbiA9IG5ldyBKQnV0dG9uKCJSZW1vdmUiKTsKLSAgICAgICAgICAgIHJlbW92ZV9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICByZW1vdmVfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlX2FsbF9idXR0b24gPSBuZXcgSkJ1dHRvbigiUmVtb3ZlIEFsbCIpOwotICAgICAgICAgICAgcmVtb3ZlX2FsbF9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBmaWx0ZXJfYnV0dG9uID0gbmV3IEpCdXR0b24oIkZpbHRlciAuLi4iKTsKLSAgICAgICAgICAgIGZpbHRlcl9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBsaXN0X2J1dHRvbnMgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBsaXN0X2J1dHRvbnMuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOwotICAgICAgICAgICAgbGlzdF9idXR0b25zLmFkZChyZW1vdmVfYnV0dG9uKTsKLSAgICAgICAgICAgIGxpc3RfYnV0dG9ucy5hZGQocmVtb3ZlX2FsbF9idXR0b24pOwotICAgICAgICAgICAgbGlzdF9idXR0b25zLmFkZChmaWx0ZXJfYnV0dG9uKTsKLSAgICAgICAgICAgIGxpc3RfcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBsaXN0X3BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgbGlzdF9wYW5lbC5hZGQoc2Nyb2xsLEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgbGlzdF9wYW5lbC5hZGQobGlzdF9idXR0b25zLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotICAgICAgICAgICAgbGlzdF9wYW5lbC5zZXRCb3JkZXIoZW1wdHlfYm9yZGVyKTsKLSAgICAgICAgICAgIC8vIEJ1aWxkIGJvdHRvbSBwb3J0aW9uIG9mIHNwbGl0IChtZXNzYWdlIGRldGFpbHMpIAotICAgICAgICAgICAgZGV0YWlsc190aW1lID0gbmV3IEpMYWJlbCgiVGltZTogIiwgU3dpbmdDb25zdGFudHMuUklHSFQpOwotICAgICAgICAgICAgZGV0YWlsc190YXJnZXQgPSBuZXcgSkxhYmVsKCJUYXJnZXQgU2VydmljZTogIiwgU3dpbmdDb25zdGFudHMuUklHSFQpOwotICAgICAgICAgICAgZGV0YWlsc19zdGF0dXMgPSBuZXcgSkxhYmVsKCJTdGF0dXM6ICIsIFN3aW5nQ29uc3RhbnRzLlJJR0hUKTsKLSAgICAgICAgICAgIGRldGFpbHNfdGltZV92YWx1ZSA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgICAgIGRldGFpbHNfdGFyZ2V0X3ZhbHVlID0gbmV3IEpMYWJlbCgpOwotICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUgPSBuZXcgSkxhYmVsKCk7Ci0gICAgICAgICAgICBEaW1lbnNpb24gcHJlZmVycmVkX3NpemUgPSBkZXRhaWxzX3RpbWUuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAgICAgICAgICAgcHJlZmVycmVkX3NpemUud2lkdGggPSAxOwotICAgICAgICAgICAgZGV0YWlsc190aW1lLnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkX3NpemUpOyAKLSAgICAgICAgICAgIGRldGFpbHNfdGFyZ2V0LnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkX3NpemUpOyAKLSAgICAgICAgICAgIGRldGFpbHNfc3RhdHVzLnNldFByZWZlcnJlZFNpemUocHJlZmVycmVkX3NpemUpOyAKLSAgICAgICAgICAgIGRldGFpbHNfdGltZV92YWx1ZS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZF9zaXplKTsgCi0gICAgICAgICAgICBkZXRhaWxzX3RhcmdldF92YWx1ZS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZF9zaXplKTsgCi0gICAgICAgICAgICBkZXRhaWxzX3N0YXR1c192YWx1ZS5zZXRQcmVmZXJyZWRTaXplKHByZWZlcnJlZF9zaXplKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfbGF5b3V0ID0gbmV3IEdyaWRCYWdMYXlvdXQoKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyLnNldExheW91dChkZXRhaWxzX2hlYWRlcl9sYXlvdXQpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMgPSBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKCk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cy5maWxsPUdyaWRCYWdDb25zdHJhaW50cy5CT1RIOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMud2VpZ2h0eD0wLjU7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9sYXlvdXQuc2V0Q29uc3RyYWludHMoZGV0YWlsc190aW1lLGRldGFpbHNfaGVhZGVyX2NvbnN0cmFpbnRzKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyLmFkZChkZXRhaWxzX3RpbWUpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfbGF5b3V0LnNldENvbnN0cmFpbnRzKGRldGFpbHNfdGltZV92YWx1ZSxkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlci5hZGQoZGV0YWlsc190aW1lX3ZhbHVlKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyX2xheW91dC5zZXRDb25zdHJhaW50cyhkZXRhaWxzX3RhcmdldCxkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlci5hZGQoZGV0YWlsc190YXJnZXQpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMud2VpZ2h0eD0xLjA7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9sYXlvdXQuc2V0Q29uc3RyYWludHMoZGV0YWlsc190YXJnZXRfdmFsdWUsZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXIuYWRkKGRldGFpbHNfdGFyZ2V0X3ZhbHVlKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyX2NvbnN0cmFpbnRzLndlaWdodHg9LjU7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlcl9sYXlvdXQuc2V0Q29uc3RyYWludHMoZGV0YWlsc19zdGF0dXMsZGV0YWlsc19oZWFkZXJfY29uc3RyYWludHMpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXIuYWRkKGRldGFpbHNfc3RhdHVzKTsKLSAgICAgICAgICAgIGRldGFpbHNfaGVhZGVyX2xheW91dC5zZXRDb25zdHJhaW50cyhkZXRhaWxzX3N0YXR1c192YWx1ZSxkZXRhaWxzX2hlYWRlcl9jb25zdHJhaW50cyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2hlYWRlci5hZGQoZGV0YWlsc19zdGF0dXNfdmFsdWUpOwotICAgICAgICAgICAgZGV0YWlsc19oZWFkZXIuc2V0Qm9yZGVyKGV0Y2hlZF9ib3JkZXIpOwotICAgICAgICAgICAgcmVxdWVzdF9sYWJlbCA9IG5ldyBKTGFiZWwoIlNPQVAgUmVxdWVzdCIsIFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0gICAgICAgICAgICByZXF1ZXN0X3RleHQgPSBuZXcgU09BUE1vbml0b3JUZXh0QXJlYSgpOwotICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHJlcXVlc3Rfc2Nyb2xsID0gbmV3IEpTY3JvbGxQYW5lKHJlcXVlc3RfdGV4dCk7Ci0gICAgICAgICAgICByZXF1ZXN0X3BhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcmVxdWVzdF9wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHJlcXVlc3RfcGFuZWwuYWRkKHJlcXVlc3RfbGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0gICAgICAgICAgICByZXF1ZXN0X3BhbmVsLmFkZChyZXF1ZXN0X3Njcm9sbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgICAgICByZXNwb25zZV9sYWJlbCA9IG5ldyBKTGFiZWwoIlNPQVAgUmVzcG9uc2UiLCBTd2luZ0NvbnN0YW50cy5DRU5URVIpOwotICAgICAgICAgICAgcmVzcG9uc2VfdGV4dCA9IG5ldyBTT0FQTW9uaXRvclRleHRBcmVhKCk7Ci0gICAgICAgICAgICByZXNwb25zZV90ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIHJlc3BvbnNlX3Njcm9sbCA9IG5ldyBKU2Nyb2xsUGFuZShyZXNwb25zZV90ZXh0KTsKLSAgICAgICAgICAgIHJlc3BvbnNlX3BhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcmVzcG9uc2VfcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0gICAgICAgICAgICByZXNwb25zZV9wYW5lbC5hZGQocmVzcG9uc2VfbGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0gICAgICAgICAgICByZXNwb25zZV9wYW5lbC5hZGQocmVzcG9uc2Vfc2Nyb2xsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGRldGFpbHNfc29hcCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCk7Ci0gICAgICAgICAgICBkZXRhaWxzX3NvYXAuc2V0VG9wQ29tcG9uZW50KHJlcXVlc3RfcGFuZWwpOwotICAgICAgICAgICAgZGV0YWlsc19zb2FwLnNldFJpZ2h0Q29tcG9uZW50KHJlc3BvbnNlX3BhbmVsKTsKLSAgICAgICAgICAgIGRldGFpbHNfc29hcC5zZXRSZXNpemVXZWlnaHQoLjUpOwotICAgICAgICAgICAgZGV0YWlsc19wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIGxheW91dF9idXR0b24gPSBuZXcgSkJ1dHRvbigiU3dpdGNoIExheW91dCIpOwotICAgICAgICAgICAgbGF5b3V0X2J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIHJlZmxvd194bWwgPSBuZXcgSkNoZWNrQm94KCJSZWZsb3cgWE1MIHRleHQiKTsKLSAgICAgICAgICAgIHJlZmxvd194bWwuYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBkZXRhaWxzX2J1dHRvbnMgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBkZXRhaWxzX2J1dHRvbnMuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOwotICAgICAgICAgICAgZGV0YWlsc19idXR0b25zLmFkZChyZWZsb3dfeG1sKTsKLSAgICAgICAgICAgIGRldGFpbHNfYnV0dG9ucy5hZGQobGF5b3V0X2J1dHRvbik7Ci0gICAgICAgICAgICBkZXRhaWxzX3BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgZGV0YWlsc19wYW5lbC5hZGQoZGV0YWlsc19oZWFkZXIsQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLSAgICAgICAgICAgIGRldGFpbHNfcGFuZWwuYWRkKGRldGFpbHNfc29hcCxCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGRldGFpbHNfcGFuZWwuYWRkKGRldGFpbHNfYnV0dG9ucyxCb3JkZXJMYXlvdXQuU09VVEgpOwotICAgICAgICAgICAgZGV0YWlsc19wYW5lbC5zZXRCb3JkZXIoZW1wdHlfYm9yZGVyKTsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgdHdvIHBhcnRzIHRvIHRoZSBhZ2Ugc3BsaXQgcGFuZQotICAgICAgICAgICAgc3BsaXQgPSBuZXcgSlNwbGl0UGFuZShKU3BsaXRQYW5lLlZFUlRJQ0FMX1NQTElUKTsKLSAgICAgICAgICAgIHNwbGl0LnNldFRvcENvbXBvbmVudChsaXN0X3BhbmVsKTsKLSAgICAgICAgICAgIHNwbGl0LnNldFJpZ2h0Q29tcG9uZW50KGRldGFpbHNfcGFuZWwpOwotICAgICAgICAgICAgLy8gQnVpbGQgc3RhdHVzIGFyZWEKLSAgICAgICAgICAgIHN0YXJ0X2J1dHRvbiA9IG5ldyBKQnV0dG9uKCJTdGFydCIpOwotICAgICAgICAgICAgc3RhcnRfYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgc3RvcF9idXR0b24gPSBuZXcgSkJ1dHRvbigiU3RvcCIpOwotICAgICAgICAgICAgc3RvcF9idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBzdGF0dXNfYnV0dG9ucyA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c19idXR0b25zLnNldExheW91dChuZXcgRmxvd0xheW91dCgpKTsKLSAgICAgICAgICAgIHN0YXR1c19idXR0b25zLmFkZChzdGFydF9idXR0b24pOwotICAgICAgICAgICAgc3RhdHVzX2J1dHRvbnMuYWRkKHN0b3BfYnV0dG9uKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0ID0gbmV3IEpMYWJlbCgpOwotICAgICAgICAgICAgc3RhdHVzX3RleHQuc2V0Qm9yZGVyKG5ldyBCZXZlbEJvcmRlcihCZXZlbEJvcmRlci5MT1dFUkVEKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdGV4dF9wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0X3BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgc3RhdHVzX3RleHRfcGFuZWwuYWRkKHN0YXR1c190ZXh0LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0X3BhbmVsLnNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICAgICAgc3RhdHVzX2FyZWEgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBzdGF0dXNfYXJlYS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHN0YXR1c19hcmVhLmFkZChzdGF0dXNfYnV0dG9ucywgQm9yZGVyTGF5b3V0LldFU1QpOwotICAgICAgICAgICAgc3RhdHVzX2FyZWEuYWRkKHN0YXR1c190ZXh0X3BhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIHN0YXR1c19hcmVhLnNldEJvcmRlcihldGNoZWRfYm9yZGVyKTsKLSAgICAgICAgICAgIC8vIEFkZCB0aGUgc3BsaXQgYW5kIHN0YXR1cyBhcmVhIHRvIHBhZ2UKLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgYWRkKHNwbGl0LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGFkZChzdGF0dXNfYXJlYSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGhvc3Qgd2UgYXJlIGRpc3BsYXlpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBob3N0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgc3RhdHVzIHRleHQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgdHh0KSB7Ci0gICAgICAgICAgICBzdGF0dXNfdGV4dC5zZXRGb3JlZ3JvdW5kKENvbG9yLmJsYWNrKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0LnNldFRleHQoIiAgIit0eHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgc3RhdHVzIHRleHQgdG8gYW4gZXJyb3IKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVycm9yU3RhdHVzKFN0cmluZyB0eHQpIHsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0LnNldEZvcmVncm91bmQoQ29sb3IucmVkKTsKLSAgICAgICAgICAgIHN0YXR1c190ZXh0LnNldFRleHQoIiAgIit0eHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0IHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29kZWhvc3QgPSBnZXRDb2RlQmFzZSgpLmdldEhvc3QoKTsKLSAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9wZW4gdGhlIHNvY2tldCB0byB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoY29kZWhvc3QsIHBvcnQpOwotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaW5wdXQgc3RyZWFtIGFuZCBzdGFydCBiYWNrZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZCh0aGlzKS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbnMgaGVyZSBhcmUgdW5leHBlY3RlZCwgYnV0IHdlIGNhbid0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlYWxseSBkbyBhbnl0aGluZyAoc28ganVzdCB3cml0ZSBpdCB0byBzdGRvdXQKLSAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBzb21lb25lIGNhcmVzIGFuZCB0aGVuIGlnbm9yZSBpdCkKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24hICIrZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0dXMoU1RBVFVTX05PQ09OTkVDVCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvY2tldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHN0YXJ0ZWQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmlnaHQgYnV0dG9ucyBhcmUgZW5hYmxlZAotICAgICAgICAgICAgICAgIHN0YXJ0X2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzdG9wX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHNldFN0YXR1cyhTVEFUVVNfQUNUSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wIHRhbGtpbmcgdG8gdGhlIHNlcnZlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENsb3NlIGFsbCB0aGUgc3RyZWFtcyBhbmQgc29ja2V0Ci0gICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgc3RvcHBlZAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByaWdodCBidXR0b25zIGFyZSBlbmFibGVkCi0gICAgICAgICAgICBzdGFydF9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0b3BfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2V0U3RhdHVzKFNUQVRVU19TVE9QUEVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCYWNrZ3JvdW5kIHRocmVhZCB1c2VkIHRvIHJlY2VpdmUgZGF0YSBmcm9tCi0gICAgICAgICAqIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBMb25nICAgICAgICAgICAgaWQ7Ci0gICAgICAgICAgICBJbnRlZ2VyICAgICAgICAgbWVzc2FnZV90eXBlOwotICAgICAgICAgICAgU3RyaW5nICAgICAgICAgIHRhcmdldDsKLSAgICAgICAgICAgIFN0cmluZyAgICAgICAgICBzb2FwOwotICAgICAgICAgICAgU09BUE1vbml0b3JEYXRhIGRhdGE7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2VsZWN0ZWQ7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgcm93OwotICAgICAgICAgICAgYm9vbGVhbiAgICAgICAgIHVwZGF0ZV9uZWVkZWQ7Ci0gICAgICAgICAgICB3aGlsZSAoc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgc2VydmVyCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSA9IChJbnRlZ2VyKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgdGhlIGRhdGEgZGVwZW5kaW5nIG9uIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZV90eXBlLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBpZCwgdGFyZ2V0IGFuZCBzb2FwIGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IChMb25nKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvYXAgPSAoU3RyaW5nKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyByZXF1ZXN0IGRhdGEgdG8gdGhlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBTT0FQTW9uaXRvckRhdGEoaWQsdGFyZ2V0LHNvYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmFkZERhdGEoZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgIm1vc3QgcmVjZW50IiBzZWxlY3RlZCB0aGVuIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXRhaWxzIGFyZWEgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSB0YWJsZS5nZXRTZWxlY3RlZFJvdygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VsZWN0ZWQgPT0gMCkgJiYgbW9kZWwuZmlsdGVyTWF0Y2goZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFU1BPTlNFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgaWQgYW5kIHNvYXAgaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gKExvbmcpIGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2FwID0gKFN0cmluZykgaW4ucmVhZE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtb2RlbC5maW5kRGF0YShpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfbmVlZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc2VsZWN0ZWQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgIm1vc3QgcmVjZW50IiwgdGhlbiBhbHdheXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGRldGFpbHMgYXJlYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX25lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRhdGEgYmVpbmcgdXBkYXRlZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RlZCB0aGVuIHVwZGF0ZSBkZXRhaWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IG1vZGVsLmZpbmRSb3coZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocm93ICE9IC0xKSAmJiAocm93ID09IHNlbGVjdGVkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX25lZWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZXNwb25zZSBhbmQgdXBkYXRlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0U09BUFJlc3BvbnNlKHNvYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC51cGRhdGVEYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWZyZXNoIGRldGFpbHMgYXJlYSAoaWYgbmVlZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlX25lZWRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDaGFuZ2VkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBFeGNlcHRpb25zIGFyZSBleHBlY3RlZCBoZXJlIHdoZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBjb21tdW5pY2F0aW9uIGhhcyBiZWVuIHRlcm1pbmF0ZWQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdG9wX2J1dHRvbi5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0dXMoU1RBVFVTX0NMT1NFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTGlzdGVuZXIgdG8gaGFuZGxlIHRhYmxlIHNlbGVjdGlvbiBjaGFuZ2VzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIGludCByb3cgPSB0YWJsZS5nZXRTZWxlY3RlZFJvdygpOwotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhleSBzZWxlY3RlZCBhIHNwZWNpZmljIHJvdwotICAgICAgICAgICAgaWYgKHJvdyA+IDApIHsKLSAgICAgICAgICAgICAgICByZW1vdmVfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlbW92ZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDaGVjayBmb3IgIm1vc3QgcmVjZW50IiBzZWxlY3Rpb24KLSAgICAgICAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICAgICAgICAgIHJvdyA9IG1vZGVsLmdldFJvd0NvdW50KCkgLSAxOwotICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByb3cgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocm93ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGRldGFpbHMgcGFuZWwKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3RpbWVfdmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc190YXJnZXRfdmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNob3cgdGhlIGRldGFpbHMgZm9yIHRoZSByb3cKLSAgICAgICAgICAgICAgICBTT0FQTW9uaXRvckRhdGEgc29hcCA9IG1vZGVsLmdldERhdGEocm93KTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3RpbWVfdmFsdWUuc2V0VGV4dChzb2FwLmdldFRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc190YXJnZXRfdmFsdWUuc2V0VGV4dChzb2FwLmdldFRhcmdldFNlcnZpY2UoKSk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc19zdGF0dXNfdmFsdWUuc2V0VGV4dChzb2FwLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVxdWVzdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGV4dC5zZXRUZXh0KHNvYXAuZ2V0U09BUFJlcXVlc3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGV4dC5zZXRDYXJldFBvc2l0aW9uKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVzcG9uc2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX3RleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VfdGV4dC5zZXRUZXh0KHNvYXAuZ2V0U09BUFJlc3BvbnNlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZV90ZXh0LnNldENhcmV0UG9zaXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExpc3RlbmVyIHRvIGhhbmRsZSBidXR0b24gYWN0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIHJlbW92ZSBidXR0b24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IHJlbW92ZV9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBpbnQgcm93ID0gdGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5yZW1vdmVSb3cocm93KTsKLSAgICAgICAgICAgICAgICB0YWJsZS5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHRhYmxlLnJlcGFpbnQoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZUNoYW5nZWQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSByZW1vdmUgYWxsIGJ1dHRvbgotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gcmVtb3ZlX2FsbF9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5jbGVhckFsbCgpOwotICAgICAgICAgICAgICAgIHRhYmxlLnNldFJvd1NlbGVjdGlvbkludGVydmFsKDAsMCk7Ci0gICAgICAgICAgICAgICAgdGFibGUucmVwYWludCgpOwotICAgICAgICAgICAgICAgIHZhbHVlQ2hhbmdlZChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGZpbHRlciBidXR0b24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGZpbHRlcl9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXIuc2hvd0RpYWxvZygpOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIub2tQcmVzc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkaXNwbGF5IHdpdGggbmV3IGZpbHRlcgotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgdGFibGUucmVwYWludCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIHN0YXJ0IGJ1dHRvbgotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gc3RhcnRfYnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIHN0b3AgYnV0dG9uCi0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSBzdG9wX2J1dHRvbikgewotICAgICAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHN3aXRjaCBsYXlvdXQKLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGxheW91dF9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3BhbmVsLnJlbW92ZShkZXRhaWxzX3NvYXApOwotICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcC5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc19zb2FwLmdldE9yaWVudGF0aW9uKCkgPT0gSlNwbGl0UGFuZS5IT1JJWk9OVEFMX1NQTElUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuVkVSVElDQUxfU1BMSVQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcCA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRldGFpbHNfc29hcC5zZXRUb3BDb21wb25lbnQocmVxdWVzdF9wYW5lbCk7Ci0gICAgICAgICAgICAgICAgZGV0YWlsc19zb2FwLnNldFJpZ2h0Q29tcG9uZW50KHJlc3BvbnNlX3BhbmVsKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3NvYXAuc2V0UmVzaXplV2VpZ2h0KC41KTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3BhbmVsLmFkZChkZXRhaWxzX3NvYXAsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgICAgIGRldGFpbHNfcGFuZWwudmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICBkZXRhaWxzX3BhbmVsLnJlcGFpbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGlzIGNoYW5naW5nIHRoZSByZWZsb3cgb3B0aW9uCi0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZWZsb3dfeG1sKSB7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdF90ZXh0LnNldFJlZmxvd1hNTChyZWZsb3dfeG1sLmlzU2VsZWN0ZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2VfdGV4dC5zZXRSZWZsb3dYTUwocmVmbG93X3htbC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyByZXByZXNlbmQgdGhlIGRhdGEgZm9yIGEgU09BUCByZXF1ZXN0L3Jlc3BvbnNlIHBhaXIKLSAgICAgKi8KLSAgICBjbGFzcyBTT0FQTW9uaXRvckRhdGEgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcml2YXRlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTG9uZyAgICBpZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIHRpbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICB0YXJnZXQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBzb2FwX3JlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBzb2FwX3Jlc3BvbnNlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNPQVBNb25pdG9yRGF0YShMb25nIGlkLCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgc29hcF9yZXF1ZXN0KSB7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgICAgICAvLyBBIG51bGwgaWQgaXMgdXNlZCB0byBzaWduYWwgdGhhdCB0aGUgIm1vc3QgcmVjZW50IiBlbnRyeQotICAgICAgICAgICAgLy8gaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy50aW1lID0gIk1vc3QgUmVjZW50IjsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9ICItLS0iOwotICAgICAgICAgICAgICAgIHRoaXMuc29hcF9yZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvYXBfcmVzcG9uc2UgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRpbWUgPSBEYXRlRm9ybWF0LmdldFRpbWVJbnN0YW5jZSgpLmZvcm1hdChuZXcgRGF0ZSgpKTsKLSAgICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvYXBfcmVxdWVzdCA9IHNvYXBfcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB0aGlzLnNvYXBfcmVzcG9uc2UgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgaWQgZm9yIHRoZSBTT0FQIG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb25nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgdGltZSB0aGUgU09BUCByZXF1ZXN0IHdhcyByZWNlaXZlZCBieSB0aGUgYXBwbGV0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGltZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgdGhlIFNPQVAgcmVxdWVzdCB0YXJnZXQgc2VydmljZSBuYW1lCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFNlcnZpY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdGF0dXMgPSAiLS0tIjsKLSAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gIkNvbXBsZXRlIjsKLSAgICAgICAgICAgICAgICBpZiAoc29hcF9yZXNwb25zZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICJBY3RpdmUiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSByZXF1ZXN0IFNPQVAgY29udGVudHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U09BUFJlcXVlc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcF9yZXF1ZXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgcmVzcG9zbmUgU09BUCBjb250ZW50cwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U09BUFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgewotICAgICAgICAgICAgc29hcF9yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgcmVzcG9uc2UgU09BUCBjb250ZW50cwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTT0FQUmVzcG9uc2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc29hcF9yZXNwb25zZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgdGFibGUgbW9kZWwgaXMgdXNlZCB0byBtYW5hZ2UgdGhlIHRhYmxlIGRpc3BsYXllZAotICAgICAqIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UgdG8gc2hvdyBhbGwgdGhlIFNPQVAgbWVzc2FnZXMKLSAgICAgKiB3ZSBoYXZlIHJlY2VpdmVkIGFuZCB0byBjb250cm9sIHdoaWNoIG1lc3NhZ2UgZGV0YWlscyBhcmUKLSAgICAgKiB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBjbGFzcyBTT0FQTW9uaXRvclRhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb2x1bW4gdGl0bGVzCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNvbHVtbl9uYW1lcyA9IHsgIlRpbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBTZXJ2aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0dXMiIH07Ci0gICAgICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICogUHJpdmF0ZSBkYXRhCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFZlY3RvciAgZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgIGZpbHRlcl9pbmNsdWRlOwotICAgICAgICBwcml2YXRlIFZlY3RvciAgZmlsdGVyX2V4Y2x1ZGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJfYWN0aXZlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmlsdGVyX2NvbXBsZXRlOwotICAgICAgICBwcml2YXRlIFZlY3RvciAgZmlsdGVyX2RhdGE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JUYWJsZU1vZGVsKCkgewotICAgICAgICAgICAgZGF0YSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIC8vIEFkZCAibW9zdCByZWNlbnQiIGVudHJ5IHRvIHRvcCBvZiB0YWJsZQotICAgICAgICAgICAgU09BUE1vbml0b3JEYXRhIHNvYXAgPSBuZXcgU09BUE1vbml0b3JEYXRhKG51bGwsbnVsbCxudWxsKTsKLSAgICAgICAgICAgIGRhdGEuYWRkRWxlbWVudChzb2FwKTsKLSAgICAgICAgICAgIGZpbHRlcl9pbmNsdWRlID0gbnVsbDsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlID0gbnVsbDsKLSAgICAgICAgICAgIGZpbHRlcl9hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgZmlsdGVyX2RhdGEgPSBudWxsOwotICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZXhjbHVkZSBOb3RpZmljYXRpb25TZXJ2aWNlIGFuZAotICAgICAgICAgICAgLy8gRXZlbnRWaWV3ZXJTZXJ2aWNlIG1lc3NhZ2VzCi0gICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlLmFkZEVsZW1lbnQoIk5vdGlmaWNhdGlvblNlcnZpY2UiKTsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlLmFkZEVsZW1lbnQoIkV2ZW50Vmlld2VyU2VydmljZSIpOwotICAgICAgICAgICAgZmlsdGVyX2RhdGEgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBmaWx0ZXJfZGF0YS5hZGRFbGVtZW50KHNvYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCBjb2x1bW4gY291bnQgKHBhcnQgb2YgdGFibGUgbW9kZWwgaW50ZXJmYWNlKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjb2x1bW5fbmFtZXMubGVuZ3RoOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHJvdyBjb3VudCAocGFydCBvZiB0YWJsZSBtb2RlbCBpbnRlcmZhY2UpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCBjb2x1bW4gbmFtZSAocGFydCBvZiB0YWJsZSBtb2RlbCBpbnRlcmZhY2UpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbHVtbl9uYW1lc1tjb2xdOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB2YWx1ZSBhdCAocGFydCBvZiB0YWJsZSBtb2RlbCBpbnRlcmZhY2UpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICAgICAgU09BUE1vbml0b3JEYXRhIHNvYXA7Ci0gICAgICAgICAgICBTdHJpbmcgICAgICAgICAgdmFsdWUgPSBudWxsOwotICAgICAgICAgICAgc29hcCA9IChTT0FQTW9uaXRvckRhdGEpIGRhdGEuZWxlbWVudEF0KHJvdyk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBmaWx0ZXJfZGF0YS5lbGVtZW50QXQocm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoY29sKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNvYXAuZ2V0VGltZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc29hcC5nZXRUYXJnZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzb2FwLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVjayBpZiBzb2FwIGRhdGEgbWF0Y2hlcyBmaWx0ZXIgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJNYXRjaChTT0FQTW9uaXRvckRhdGEgc29hcCkgewotICAgICAgICAgICAgYm9vbGVhbiBtYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2luY2x1ZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzZXJ2aWNlIG1hdGNoCi0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGZpbHRlcl9pbmNsdWRlLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSAmJiAhbWF0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2UgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLmVxdWFscyhzb2FwLmdldFRhcmdldFNlcnZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJfZXhjbHVkZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHNlcnZpY2UgbWF0Y2gKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZmlsdGVyX2V4Y2x1ZGUuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSAmJiBtYXRjaCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UuZXF1YWxzKHNvYXAuZ2V0VGFyZ2V0U2VydmljZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJfYWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFjdGl2ZSBzdGF0dXMgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVzcG9uc2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbHRlcl9jb21wbGV0ZSkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjb21wbGV0ZSBzdGF0dXMgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc29hcC5nZXRTT0FQUmVzcG9uc2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhlICJtb3N0IHJlY2VudCIgaXMgYWx3YXlzIGEgbWF0Y2gKLSAgICAgICAgICAgIGlmIChzb2FwLmdldElkKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgZGF0YSB0byB0aGUgdGFibGUgYXMgYSBuZXcgcm93Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBhZGREYXRhKFNPQVBNb25pdG9yRGF0YSBzb2FwKSB7Ci0gICAgICAgICAgICBpbnQgcm93ID0gZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICBkYXRhLmFkZEVsZW1lbnQoc29hcCk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXRjaChzb2FwKSkgewotICAgICAgICAgICAgICAgICAgICByb3cgPSBmaWx0ZXJfZGF0YS5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLmFkZEVsZW1lbnQoc29hcCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpcmVUYWJsZVJvd3NJbnNlcnRlZChyb3cscm93KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpcmVUYWJsZVJvd3NJbnNlcnRlZChyb3cscm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5kIHRoZSBkYXRhIGZvciBhIGdpdmVuIGlkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JEYXRhIGZpbmREYXRhKExvbmcgaWQpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IHJvdz1kYXRhLnNpemUoKTsgKHJvdyA+IDApICYmIChzb2FwID09IG51bGwpOyByb3ctLSkgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBkYXRhLmVsZW1lbnRBdChyb3ctMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvYXAuZ2V0SWQoKS5sb25nVmFsdWUoKSAhPSBpZC5sb25nVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc29hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGaW5kIHRoZSByb3cgaW4gdGhlIHRhYmxlIGZvciBhIGdpdmVuIG1lc3NhZ2UgaWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZmluZFJvdyhTT0FQTW9uaXRvckRhdGEgc29hcCkgewotICAgICAgICAgICAgaW50IHJvdyA9IC0xOwotICAgICAgICAgICAgaWYgKGZpbHRlcl9kYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBmaWx0ZXJfZGF0YS5pbmRleE9mKHNvYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3cgPSBkYXRhLmluZGV4T2Yoc29hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgZnJvbSB0aGUgdGFibGUgKGJ1dCBsZWF2ZSAibW9zdCByZWNlbnQiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXJBbGwoKSB7Ci0gICAgICAgICAgICBpbnQgbGFzdF9yb3cgPSBkYXRhLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICBpZiAobGFzdF9yb3cgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbmV3IFNPQVBNb25pdG9yRGF0YShudWxsLG51bGwsbnVsbCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5hZGRFbGVtZW50KHNvYXApOwotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLmFkZEVsZW1lbnQoc29hcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVtb3ZlIGEgbWVzc2FnZSBmcm9tIHRoZSB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUm93KGludCByb3cpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcCA9IChTT0FQTW9uaXRvckRhdGEpIGRhdGEuZWxlbWVudEF0KHJvdyk7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZW1vdmUoc29hcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBmaWx0ZXJfZGF0YS5lbGVtZW50QXQocm93KTsKLSAgICAgICAgICAgICAgICBmaWx0ZXJfZGF0YS5yZW1vdmUoc29hcCk7Ci0gICAgICAgICAgICAgICAgZGF0YS5yZW1vdmUoc29hcCk7Ci0gICAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgICAgICBmaXJlVGFibGVSb3dzRGVsZXRlZChyb3cscm93KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXQgYSBuZXcgZmlsdGVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU09BUE1vbml0b3JGaWx0ZXIgZmlsdGVyKSB7Ci0gICAgICAgICAgICAvLyBTYXZlIG5ldyBmaWx0ZXIgY3JpdGVyaWEKLSAgICAgICAgICAgIGZpbHRlcl9pbmNsdWRlID0gZmlsdGVyLmdldEZpbHRlckluY2x1ZGVMaXN0KCk7Ci0gICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZSA9IGZpbHRlci5nZXRGaWx0ZXJFeGNsdWRlTGlzdCgpOwotICAgICAgICAgICAgZmlsdGVyX2FjdGl2ZSA9IGZpbHRlci5nZXRGaWx0ZXJBY3RpdmUoKTsKLSAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IGZpbHRlci5nZXRGaWx0ZXJDb21wbGV0ZSgpOwotICAgICAgICAgICAgYXBwbHlGaWx0ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWZpbHRlciB0aGUgbGlzdCBvZiBtZXNzYWdlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYXBwbHlGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBSZS1maWx0ZXIgdXNpbmcgbmV3IGNyaXRlcmlhCi0gICAgICAgICAgICBmaWx0ZXJfZGF0YSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoKGZpbHRlcl9pbmNsdWRlICE9IG51bGwpIHx8IAotICAgICAgICAgICAgICAgIChmaWx0ZXJfZXhjbHVkZSAhPSBudWxsKSB8fAotICAgICAgICAgICAgICAgICBmaWx0ZXJfYWN0aXZlIHx8IGZpbHRlcl9jb21wbGV0ZSApIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJfZGF0YSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZGF0YS5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJNYXRjaChzb2FwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2RhdGEuYWRkRWxlbWVudChzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpcmVUYWJsZURhdGFDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSBkYXRhIGZvciBhIHJvdwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFNPQVBNb25pdG9yRGF0YSBnZXREYXRhKGludCByb3cpIHsKLSAgICAgICAgICAgIFNPQVBNb25pdG9yRGF0YSBzb2FwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc29hcCA9IChTT0FQTW9uaXRvckRhdGEpIGRhdGEuZWxlbWVudEF0KHJvdyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNvYXAgPSAoU09BUE1vbml0b3JEYXRhKSBmaWx0ZXJfZGF0YS5lbGVtZW50QXQocm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzb2FwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFVwZGF0ZSBhIG1lc3NhZ2UKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURhdGEgKFNPQVBNb25pdG9yRGF0YSBzb2FwKSB7Ci0gICAgICAgICAgIGludCByb3c7Ci0gICAgICAgICAgIGlmIChmaWx0ZXJfZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAvLyBObyBmaWx0ZXIsIHNvIGp1c3QgZmlyZSB0YWJsZSB1cGRhdGVkCi0gICAgICAgICAgICAgICByb3cgPSBkYXRhLmluZGV4T2Yoc29hcCk7Ci0gICAgICAgICAgICAgICBpZiAocm93ICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgZmlyZVRhYmxlUm93c1VwZGF0ZWQocm93LHJvdyk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcm93IHdhcyBiZWluZyBkaXNwbGF5ZWQKLSAgICAgICAgICAgICAgIHJvdyA9IGZpbHRlcl9kYXRhLmluZGV4T2Yoc29hcCk7Ci0gICAgICAgICAgICAgICBpZiAocm93ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgLy8gUm93IHdhcyBub3QgZGlzcGxheWVkLCBzbyBjaGVjayBmb3IgaWYgaXQKLSAgICAgICAgICAgICAgICAgICAvLyBub3cgbmVlZHMgdG8gYmUgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlck1hdGNoKHNvYXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBkYXRhLmluZGV4T2Yoc29hcCkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJvdyA8IGRhdGEuc2l6ZSgpKSAmJiAoaW5kZXggPT0gLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGZpbHRlcl9kYXRhLmluZGV4T2YoZGF0YS5lbGVtZW50QXQocm93KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGF0IHRoaXMgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZGF0YS5hZGQoaW5kZXgsc29hcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCBhdCBlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZmlsdGVyX2RhdGEuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2RhdGEuYWRkRWxlbWVudChzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBmaXJlVGFibGVSb3dzSW5zZXJ0ZWQoaW5kZXgsaW5kZXgpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgLy8gUm93IHdhcyBkaXNwbGF5ZWQsIHNvIGNoZWNrIGlmIGl0IG5lZWRzIHRvCi0gICAgICAgICAgICAgICAgICAgLy8gYmUgdXBkYXRlZCBvciByZW1vdmVkCi0gICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlck1hdGNoKHNvYXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpcmVUYWJsZVJvd3NVcGRhdGVkKHJvdyxyb3cpOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhLnJlbW92ZShzb2FwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgZmlyZVRhYmxlUm93c0RlbGV0ZWQocm93LHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhbmVsIHdpdGggY2hlY2tib3ggYW5kIGxpc3QKLSAgICAgKi8KLSAgICBjbGFzcyBTZXJ2aWNlRmlsdGVyUGFuZWwgZXh0ZW5kcyBKUGFuZWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFNlbGVjdGlvbkxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50TGlzdGVuZXIgewotCi0gICAgICAgIHByaXZhdGUgSkNoZWNrQm94ICAgIHNlcnZpY2VfYm94ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgICAgICAgZmlsdGVyX2xpc3QgPSBudWxsOwotICAgICAgICBwcml2YXRlIFZlY3RvciAgICAgICBzZXJ2aWNlX2RhdGEgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpMaXN0ICAgICAgICBzZXJ2aWNlX2xpc3QgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpTY3JvbGxQYW5lICBzZXJ2aWNlX3Njcm9sbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgIHJlbW92ZV9zZXJ2aWNlX2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIHJlbW92ZV9zZXJ2aWNlX3BhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBFbXB0eUJvcmRlciAgaW5kZW50X2JvcmRlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgRW1wdHlCb3JkZXIgIGVtcHR5X2JvcmRlciA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIHNlcnZpY2VfYXJlYSA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIGFkZF9zZXJ2aWNlX2FyZWEgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpUZXh0RmllbGQgICBhZGRfc2VydmljZV9maWVsZCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgIGFkZF9zZXJ2aWNlX2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgIGFkZF9zZXJ2aWNlX3BhbmVsID0gbnVsbDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTZXJ2aWNlRmlsdGVyUGFuZWwoU3RyaW5nIHRleHQsIFZlY3RvciBsaXN0KSB7Ci0gICAgICAgICAgICBlbXB0eV9ib3JkZXIgPSBuZXcgRW1wdHlCb3JkZXIoNSw1LDAsNSk7Ci0gICAgICAgICAgICBpbmRlbnRfYm9yZGVyID0gbmV3IEVtcHR5Qm9yZGVyKDUsMjUsNSw1KTsKLSAgICAgICAgICAgIHNlcnZpY2VfYm94ID0gbmV3IEpDaGVja0JveCh0ZXh0KTsKLSAgICAgICAgICAgIHNlcnZpY2VfYm94LmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgc2VydmljZV9kYXRhID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNlcnZpY2VfYm94LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VfZGF0YSA9IChWZWN0b3IpIGxpc3QuY2xvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VfbGlzdCA9IG5ldyBKTGlzdChzZXJ2aWNlX2RhdGEpOwotICAgICAgICAgICAgc2VydmljZV9saXN0LnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOwotICAgICAgICAgICAgc2VydmljZV9saXN0LnNldFZpc2libGVSb3dDb3VudCg1KTsKLSAgICAgICAgICAgIHNlcnZpY2VfbGlzdC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBzZXJ2aWNlX2xpc3Quc2V0RW5hYmxlZChzZXJ2aWNlX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgc2VydmljZV9zY3JvbGwgPSBuZXcgSlNjcm9sbFBhbmUoc2VydmljZV9saXN0KTsKLSAgICAgICAgICAgIHNlcnZpY2Vfc2Nyb2xsLnNldEJvcmRlcihuZXcgRXRjaGVkQm9yZGVyKCkpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uID0gbmV3IEpCdXR0b24oIlJlbW92ZSIpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICByZW1vdmVfc2VydmljZV9wYW5lbC5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoKSk7Ci0gICAgICAgICAgICByZW1vdmVfc2VydmljZV9wYW5lbC5hZGQocmVtb3ZlX3NlcnZpY2VfYnV0dG9uKTsKLSAgICAgICAgICAgIHNlcnZpY2VfYXJlYSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHNlcnZpY2VfYXJlYS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHNlcnZpY2VfYXJlYS5hZGQoc2VydmljZV9zY3JvbGwsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgc2VydmljZV9hcmVhLmFkZChyZW1vdmVfc2VydmljZV9wYW5lbCwgQm9yZGVyTGF5b3V0LkVBU1QpOwotICAgICAgICAgICAgc2VydmljZV9hcmVhLnNldEJvcmRlcihpbmRlbnRfYm9yZGVyKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfZmllbGQuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfZmllbGQuc2V0RW5hYmxlZChzZXJ2aWNlX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYnV0dG9uID0gbmV3IEpCdXR0b24oIkFkZCIpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIEpQYW5lbCBkdW1teSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIGR1bW15LnNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfcGFuZWwuYWRkKGR1bW15LCBCb3JkZXJMYXlvdXQuV0VTVCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9wYW5lbC5hZGQoYWRkX3NlcnZpY2VfYnV0dG9uLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9hcmVhID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgYWRkX3NlcnZpY2VfYXJlYS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2FyZWEuYWRkKGFkZF9zZXJ2aWNlX2ZpZWxkLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLSAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2FyZWEuYWRkKGFkZF9zZXJ2aWNlX3BhbmVsLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0gICAgICAgICAgICBhZGRfc2VydmljZV9hcmVhLnNldEJvcmRlcihpbmRlbnRfYm9yZGVyKTsKLSAgICAgICAgICAgIHNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOwotICAgICAgICAgICAgYWRkKHNlcnZpY2VfYm94LCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotICAgICAgICAgICAgYWRkKHNlcnZpY2VfYXJlYSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0gICAgICAgICAgICBhZGQoYWRkX3NlcnZpY2VfYXJlYSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLSAgICAgICAgICAgIHNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIHNlcnZpY2VzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgVmVjdG9yIGdldFNlcnZpY2VMaXN0KCkgewotICAgICAgICAgICAgVmVjdG9yIGxpc3QgPSBudWxsOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VfYm94LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGxpc3QgPSBzZXJ2aWNlX2RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMaXN0ZW5lciB0byBoYW5kbGUgYnV0dG9uIGFjdGlvbnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdXNlciBjaGFuZ2VkIHRoZSBzZXJ2aWNlIGZpbHRlciBvcHRpb24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IHNlcnZpY2VfYm94KSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZV9saXN0LnNldEVuYWJsZWQoc2VydmljZV9ib3guaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlX2xpc3QuY2xlYXJTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICByZW1vdmVfc2VydmljZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYWRkX3NlcnZpY2VfZmllbGQuc2V0RW5hYmxlZChzZXJ2aWNlX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGFkZCBzZXJ2aWNlIGJ1dHRvbgotICAgICAgICAgICAgaWYgKChlLmdldFNvdXJjZSgpID09IGFkZF9zZXJ2aWNlX2J1dHRvbikgfHwKLSAgICAgICAgICAgICAgICAoZS5nZXRTb3VyY2UoKSA9PSBhZGRfc2VydmljZV9maWVsZCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGFkZF9zZXJ2aWNlX2ZpZWxkLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoKHRleHQgIT0gbnVsbCkgJiYgKHRleHQubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX2RhdGEuYWRkRWxlbWVudCh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZV9saXN0LnNldExpc3REYXRhKHNlcnZpY2VfZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2ZpZWxkLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgcHJlc3NlZCB0aGUgcmVtb3ZlIHNlcnZpY2UgYnV0dG9uCi0gICAgICAgICAgICBpZiAoZS5nZXRTb3VyY2UoKSA9PSByZW1vdmVfc2VydmljZV9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBzZWxzID0gc2VydmljZV9saXN0LmdldFNlbGVjdGVkVmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNlbHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZV9kYXRhLnJlbW92ZUVsZW1lbnQoc2Vsc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlcnZpY2VfbGlzdC5zZXRMaXN0RGF0YShzZXJ2aWNlX2RhdGEpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VfbGlzdC5jbGVhclNlbGVjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEhhbmRsZSBjaGFuZ2VzIHRvIHRoZSB0ZXh0IGZpZWxkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBhZGRfc2VydmljZV9maWVsZC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoKHRleHQgIT0gbnVsbCkgJiYgKHRleHQubGVuZ3RoKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIGFkZF9zZXJ2aWNlX2J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGRfc2VydmljZV9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlIGNoYW5nZXMgdG8gdGhlIHRleHQgZmllbGQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgIGNoYW5nZWRVcGRhdGUoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSGFuZGxlIGNoYW5nZXMgdG8gdGhlIHRleHQgZmllbGQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLSAgICAgICAgICAgIGNoYW5nZWRVcGRhdGUoZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTGlzdGVuZXIgdG8gaGFuZGxlIHNlcnZpY2UgbGlzdCBzZWxlY3Rpb24gY2hhbmdlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICBpZiAoc2VydmljZV9saXN0LmdldFNlbGVjdGVkSW5kZXgoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJlbW92ZV9zZXJ2aWNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlX3NlcnZpY2VfYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbGFzcyBmb3Igc2hvd2luZyB0aGUgZmlsdGVyIGRpYWxvZwotICAgICAqLwotICAgIGNsYXNzIFNPQVBNb25pdG9yRmlsdGVyIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcml2YXRlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSkRpYWxvZyAgICAgICAgICAgIGRpYWxvZyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgIHBhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgYnV0dG9ucyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgIG9rX2J1dHRvbiA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiAgICAgICAgICAgIGNhbmNlbF9idXR0b24gPSBudWxsOwotICAgICAgICBwcml2YXRlIFNlcnZpY2VGaWx0ZXJQYW5lbCBpbmNsdWRlX3BhbmVsID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBTZXJ2aWNlRmlsdGVyUGFuZWwgZXhjbHVkZV9wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSlBhbmVsICAgICAgICAgICAgIHN0YXR1c19wYW5lbCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgSkNoZWNrQm94ICAgICAgICAgIHN0YXR1c19ib3ggPSBudWxsOwotICAgICAgICBwcml2YXRlIEVtcHR5Qm9yZGVyICBlbXB0eV9ib3JkZXIgPSBudWxsOwotICAgICAgICBwcml2YXRlIEVtcHR5Qm9yZGVyICBpbmRlbnRfYm9yZGVyID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgICAgICAgICAgICAgc3RhdHVzX29wdGlvbnMgPSBudWxsOwotICAgICAgICBwcml2YXRlIEJ1dHRvbkdyb3VwICAgICAgICBzdGF0dXNfZ3JvdXAgPSBudWxsOwotICAgICAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiAgICAgICBzdGF0dXNfYWN0aXZlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gICAgICAgc3RhdHVzX2NvbXBsZXRlID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBWZWN0b3IgICAgICAgICAgICAgZmlsdGVyX2luY2x1ZGVfbGlzdCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yICAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlX2xpc3QgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBmaWx0ZXJfYWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBva19wcmVzc2VkID0gZmFsc2U7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBleGNsdWRlIE5vdGlmaWNhdGlvblNlcnZpY2UgYW5kCi0gICAgICAgICAgICAvLyBFdmVudFZpZXdlclNlcnZpY2UgbWVzc2FnZXMKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlX2xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZV9saXN0LmFkZEVsZW1lbnQoIk5vdGlmaWNhdGlvblNlcnZpY2UiKTsKLSAgICAgICAgICAgIGZpbHRlcl9leGNsdWRlX2xpc3QuYWRkRWxlbWVudCgiRXZlbnRWaWV3ZXJTZXJ2aWNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IGxpc3Qgb2Ygc2VydmljZXMgdG8gYmUgaW5jbHVkZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBWZWN0b3IgZ2V0RmlsdGVySW5jbHVkZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsdGVyX2luY2x1ZGVfbGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXQgbGlzdCBvZiBzZXJ2aWNlcyB0byBiZSBleGNsdWRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFZlY3RvciBnZXRGaWx0ZXJFeGNsdWRlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXJfZXhjbHVkZV9saXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGlmIGZpbHRlciBhY3RpdmUgbWVzc2FnZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldEZpbHRlckFjdGl2ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXJfYWN0aXZlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENoZWNrIGlmIGZpbHRlciBjb21wbGV0ZSBtZXNzYWdlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RmlsdGVyQ29tcGxldGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsdGVyX2NvbXBsZXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNob3cgdGhlIGZpbHRlciBkaWFsb2cKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNob3dEaWFsb2coKSB7Ci0gICAgICAgICAgICBlbXB0eV9ib3JkZXIgPSBuZXcgRW1wdHlCb3JkZXIoNSw1LDAsNSk7Ci0gICAgICAgICAgICBpbmRlbnRfYm9yZGVyID0gbmV3IEVtcHR5Qm9yZGVyKDUsMjUsNSw1KTsKLSAgICAgICAgICAgIGluY2x1ZGVfcGFuZWwgPSBuZXcgU2VydmljZUZpbHRlclBhbmVsKCJJbmNsdWRlIG1lc3NhZ2VzIGJhc2VkIG9uIHRhcmdldCBzZXJ2aWNlOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfaW5jbHVkZV9saXN0KTsKLSAgICAgICAgICAgIGV4Y2x1ZGVfcGFuZWwgPSBuZXcgU2VydmljZUZpbHRlclBhbmVsKCJFeGNsdWRlIG1lc3NhZ2VzIGJhc2VkIG9uIHRhcmdldCBzZXJ2aWNlOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZV9saXN0KTsKLSAgICAgICAgICAgIHN0YXR1c19ib3ggPSBuZXcgSkNoZWNrQm94KCJGaWx0ZXIgbWVzc2FnZXMgYmFzZWQgb24gc3RhdHVzOiIpOwotICAgICAgICAgICAgc3RhdHVzX2JveC5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIHN0YXR1c19hY3RpdmUgPSBuZXcgSlJhZGlvQnV0dG9uKCJBY3RpdmUgbWVzc2FnZXMgb25seSIpOwotICAgICAgICAgICAgc3RhdHVzX2FjdGl2ZS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIHN0YXR1c19hY3RpdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzdGF0dXNfY29tcGxldGUgPSBuZXcgSlJhZGlvQnV0dG9uKCJDb21wbGV0ZSBtZXNzYWdlcyBvbmx5Iik7Ci0gICAgICAgICAgICBzdGF0dXNfY29tcGxldGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzdGF0dXNfZ3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKLSAgICAgICAgICAgIHN0YXR1c19ncm91cC5hZGQoc3RhdHVzX2FjdGl2ZSk7Ci0gICAgICAgICAgICBzdGF0dXNfZ3JvdXAuYWRkKHN0YXR1c19jb21wbGV0ZSk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyX2FjdGl2ZSB8fCBmaWx0ZXJfY29tcGxldGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfYm94LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHN0YXR1c19hY3RpdmUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNfY29tcGxldGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyX2NvbXBsZXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb21wbGV0ZS5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfb3B0aW9ucyA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c19vcHRpb25zLnNldExheW91dChuZXcgQm94TGF5b3V0KHN0YXR1c19vcHRpb25zLCBCb3hMYXlvdXQuWV9BWElTKSk7Ci0gICAgICAgICAgICBzdGF0dXNfb3B0aW9ucy5hZGQoc3RhdHVzX2FjdGl2ZSk7Ci0gICAgICAgICAgICBzdGF0dXNfb3B0aW9ucy5hZGQoc3RhdHVzX2NvbXBsZXRlKTsKLSAgICAgICAgICAgIHN0YXR1c19vcHRpb25zLnNldEJvcmRlcihpbmRlbnRfYm9yZGVyKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbC5hZGQoc3RhdHVzX2JveCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLSAgICAgICAgICAgIHN0YXR1c19wYW5lbC5hZGQoc3RhdHVzX29wdGlvbnMsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICAgICAgc3RhdHVzX3BhbmVsLnNldEJvcmRlcihlbXB0eV9ib3JkZXIpOwotICAgICAgICAgICAgb2tfYnV0dG9uID0gbmV3IEpCdXR0b24oIk9rIik7Ci0gICAgICAgICAgICBva19idXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICBjYW5jZWxfYnV0dG9uID0gbmV3IEpCdXR0b24oIkNhbmNlbCIpOwotICAgICAgICAgICAgY2FuY2VsX2J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIGJ1dHRvbnMgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICBidXR0b25zLnNldExheW91dChuZXcgRmxvd0xheW91dCgpKTsKLSAgICAgICAgICAgIGJ1dHRvbnMuYWRkKG9rX2J1dHRvbik7Ci0gICAgICAgICAgICBidXR0b25zLmFkZChjYW5jZWxfYnV0dG9uKTsKLSAgICAgICAgICAgIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQocGFuZWwsIEJveExheW91dC5ZX0FYSVMpKTsKLSAgICAgICAgICAgIHBhbmVsLmFkZChpbmNsdWRlX3BhbmVsKTsKLSAgICAgICAgICAgIHBhbmVsLmFkZChleGNsdWRlX3BhbmVsKTsKLSAgICAgICAgICAgIHBhbmVsLmFkZChzdGF0dXNfcGFuZWwpOwotICAgICAgICAgICAgcGFuZWwuYWRkKGJ1dHRvbnMpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IEpEaWFsb2coKTsKLSAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSgiU09BUCBNb25pdG9yIEZpbHRlciIpOwotICAgICAgICAgICAgZGlhbG9nLnNldENvbnRlbnRQYW5lKHBhbmVsKTsKLSAgICAgICAgICAgIGRpYWxvZy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRJU1BPU0VfT05fQ0xPU0UpOwotICAgICAgICAgICAgZGlhbG9nLnNldE1vZGFsKHRydWUpOwotICAgICAgICAgICAgZGlhbG9nLnBhY2soKTsKLSAgICAgICAgICAgIERpbWVuc2lvbiBkID0gZGlhbG9nLmdldFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCk7Ci0gICAgICAgICAgICBkaWFsb2cuc2V0TG9jYXRpb24oKGQud2lkdGgtZGlhbG9nLmdldFdpZHRoKCkpLzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQuaGVpZ2h0LWRpYWxvZy5nZXRIZWlnaHQoKSkvMik7Ci0gICAgICAgICAgICBva19wcmVzc2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBkaWFsb2cuc2hvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExpc3RlbmVyIHRvIGhhbmRsZSBidXR0b24gYWN0aW9ucwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIG9rIGJ1dHRvbgotICAgICAgICAgICAgaWYgKGUuZ2V0U291cmNlKCkgPT0gb2tfYnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgZmlsdGVyX2luY2x1ZGVfbGlzdCA9IGluY2x1ZGVfcGFuZWwuZ2V0U2VydmljZUxpc3QoKTsKLSAgICAgICAgICAgICAgICBmaWx0ZXJfZXhjbHVkZV9saXN0ID0gZXhjbHVkZV9wYW5lbC5nZXRTZXJ2aWNlTGlzdCgpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXNfYm94LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfYWN0aXZlID0gc3RhdHVzX2FjdGl2ZS5pc1NlbGVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9jb21wbGV0ZSA9IHN0YXR1c19jb21wbGV0ZS5pc1NlbGVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2FjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfY29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2tfcHJlc3NlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIHByZXNzZWQgdGhlIGNhbmNlbCBidXR0b24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IGNhbmNlbF9idXR0b24pIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuZGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHVzZXIgY2hhbmdlZCB0aGUgc3RhdHVzIGZpbHRlciBvcHRpb24KLSAgICAgICAgICAgIGlmIChlLmdldFNvdXJjZSgpID09IHN0YXR1c19ib3gpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfYWN0aXZlLnNldEVuYWJsZWQoc3RhdHVzX2JveC5pc1NlbGVjdGVkKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1c19jb21wbGV0ZS5zZXRFbmFibGVkKHN0YXR1c19ib3guaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDaGVjayBpZiB0aGUgdXNlciBwcmVzc2VkIHRoZSBvayBidXR0b24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9rUHJlc3NlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBva19wcmVzc2VkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGV4dCBwYW5lbCBjbGFzcyB0aGF0IHN1cHBvcnRzIFhNTCByZWZsb3cKLSAgICAgKi8KLSAgICBjbGFzcyBTT0FQTW9uaXRvclRleHRBcmVhIGV4dGVuZHMgSlRleHRBcmVhIHsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUHJpdmF0ZSBkYXRhCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nICBvcmlnaW5hbCA9ICIiOwotICAgICAgICBwcml2YXRlIFN0cmluZyAgZm9ybWF0dGVkID0gbnVsbDsgCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU09BUE1vbml0b3JUZXh0QXJlYSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogT3ZlcnJpZGUgc2V0VGV4dCB0byBkbyBmb3JtYXR0aW5nCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBvcmlnaW5hbCA9IHRleHQ7Ci0gICAgICAgICAgICBmb3JtYXR0ZWQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGRvRm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgc3VwZXIuc2V0VGV4dChmb3JtYXR0ZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdXBlci5zZXRUZXh0KG9yaWdpbmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUdXJuIHJlZmxvdyBvbiBvciBvZmYKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJlZmxvd1hNTChib29sZWFuIHJlZmxvdykgewotICAgICAgICAgICAgZm9ybWF0ID0gcmVmbG93OwotICAgICAgICAgICAgaWYgKGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkb0Zvcm1hdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBlci5zZXRUZXh0KGZvcm1hdHRlZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN1cGVyLnNldFRleHQob3JpZ2luYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlZmxvdyBYTUwKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRvRm9ybWF0KCkgewotICAgICAgICAgICAgVmVjdG9yICAgICAgIHBhcnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgY2hhcltdICAgICAgIGNoYXJzID0gb3JpZ2luYWwudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICAgICAgU3RyaW5nICAgICAgIHBhcnQgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hhcnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHN0YXJ0IG9mIHRhZwotICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleF0gPT0gJzwnKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpZCB3ZSBoYXZlIGRhdGEgYmVmb3JlIHRoaXMgdGFnPwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPCBpbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IG5ldyBTdHJpbmcoY2hhcnMsZmlyc3QsaW5kZXgtZmlyc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IHBhcnQudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSBub24td2hpdGVzcGFjZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGRFbGVtZW50KHBhcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0IG9mIHRhZwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIHRhZwotICAgICAgICAgICAgICAgIGlmIChjaGFyc1tpbmRleF0gPT0gJz4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHRhZwotICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IFN0cmluZyhjaGFycyxmaXJzdCxpbmRleC1maXJzdCsxKTsKLSAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkRWxlbWVudChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBpbmRleCsxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW5kIG9mIGxpbmUKLSAgICAgICAgICAgICAgICBpZiAoKGNoYXJzW2luZGV4XSA9PSAnXG4nKSB8fCAoY2hhcnNbaW5kZXhdID09ICdccicpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdhcyB0aGVyZSBkYXRhIG9uIHRoaXMgbGluZT8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0IDwgaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBuZXcgU3RyaW5nKGNoYXJzLGZpcnN0LGluZGV4LWZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0LnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgbm9uLXdoaXRlc3BhY2UgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuYWRkRWxlbWVudChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGluZGV4KzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBSZWZsb3cgYXMgWE1MCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgT2JqZWN0W10gbGlzdCA9IHBhcnRzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIGludCBpbmRlbnQgPSAwOwotICAgICAgICAgICAgaW50IHBhZCA9IDA7Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBsaXN0Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgIHBhcnQgPSAoU3RyaW5nKSBsaXN0W2luZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBhZGQgZmlyc3QgdGFnIChzaG91bGQgYmUgWE1MIGhlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJ0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBbGwgb3RoZXIgcGFydHMgbmVlZCB0byBzdGFydCBvbiBhIG5ldyBsaW5lCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGF0IGFuIGVuZCB0YWcgdGhlbiBkZWNyZWFzZSBpbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnQuc3RhcnRzV2l0aCgiPC8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LS07Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGFueSBpbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgZm9yIChwYWQgPSAwOyBwYWQgPCBpbmRlbnQ7IHBhZCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgdGFnIG9yIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXJ0IHRhZyB0aGVuIGluY3JlYXNlIGluZGVudAotICAgICAgICAgICAgICAgICAgICBpZiAocGFydC5zdGFydHNXaXRoKCI8IikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFwYXJ0LnN0YXJ0c1dpdGgoIjwvIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFwYXJ0LmVuZHNXaXRoKCIvPiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzcGVjaWFsIDx0YWc+ZGF0YTwvdGFnPiBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluZGV4ICsgMikgPCBsaXN0Lmxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAoU3RyaW5nKSBsaXN0W2luZGV4KzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoIjwvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IChTdHJpbmcpIGxpc3RbaW5kZXgrMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFydC5zdGFydHNXaXRoKCI8IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gKFN0cmluZykgbGlzdFtpbmRleCsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JtYXR0ZWQgPSBuZXcgU3RyaW5nKGJ1Zik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MGIwNDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvc29hcG1vbml0b3Ivc2VydmxldC9TT0FQTW9uaXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLnNlcnZsZXQ7Ci0KLS8qKgotICogU09BUCBNb25pdG9yIFNlcnZpY2UgY29uc3RhbnRzCi0gKi8KLQotcHVibGljIGNsYXNzIFNPQVBNb25pdG9yQ29uc3RhbnRzIHsKLQotICAvKioKLSAgICogU09BUCBtZXNzYWdlIHR5cGVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX01PTklUT1JfUkVRVUVTVCAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX01PTklUT1JfUkVTUE9OU0UgPSAxOwotCi0gIC8qKiAKLSAgICogU2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgbmFtZXMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfTU9OSVRPUl9QT1JUID0gIlNPQVBNb25pdG9yUG9ydCI7Ci0KLSAgLyoqCi0gICAqIFVuaXF1ZSBTT0FQIG1vbml0b3IgaWQgdGFnCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX01PTklUT1JfSUQgPSAiU09BUE1vbml0b3JJZCI7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yU2VydmljZS5qYXZhIGIvMV81L21vZHVsZXMvc29hcG1vbml0b3Ivc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvc29hcG1vbml0b3Ivc2VydmxldC9TT0FQTW9uaXRvclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkZGIzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy9zb2FwbW9uaXRvci9zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9zZXJ2bGV0L1NPQVBNb25pdG9yU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5zb2FwbW9uaXRvci5zZXJ2bGV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgYSBTT0FQIE1vbml0b3IgU2VydmljZSBjbGFzcy4gCi0gKgotICogRHVyaW5nIHRoZSBIVFRQIHNlcnZlciBzdGFydHVwLCB0aGUgc2VydmxldCBpbml0IG1ldGhvZCAKLSAqIGlzIGludm9rZWQuICBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBvcGVuIGEgc2VydmVyIAotICogc29ja2V0IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggcnVubmluZyAKLSAqIGFwcGxldHMuCi0gKgotICogV2hlbiBhbiBIVFRQIEdFVCByZXF1ZXN0IGlzIHJlY2VpdmVkLCB0aGUgc2VydmxldCAKLSAqIGR5bmFtaWNhbGx5IHByb2R1Y2VzIGFuIEhUTUwgZG9jdW1lbnQgdG8gbG9hZCB0aGUgU09BUCAKLSAqIG1vbml0b3IgYXBwbGV0IGFuZCBzdXBwbHkgdGhlIHBvcnQgbnVtYmVyIGJlaW5nIHVzZWQgYnkKLSAqIHRoZSBzZXJ2ZXIgc29ja2V0IChzbyB0aGUgYXBwbGV0IHdpbGwga25vdyBob3cgdG8gCi0gKiBjb25uZWN0IGJhY2sgdG8gdGhlIHNlcnZlcikuCi0gKgotICogRWFjaCB0aW1lIGEgc29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIGEgbmV3IAotICogdGhyZWFkIGlzIGNyZWF0ZWQgdG8gaGFuZGxlIGNvbW11bmljYXRpb25zIGZyb20gdGhlIAotICogYXBwbGV0LgotICoKLSAqIFRoZSBwdWJsaXNoTWV0aG9kIHJvdXRpbmUgaXMgaW52b2tlZCBieSB0aGUgU09BUCBtb25pdG9yCi0gKiBoYW5kbGVyIHdoZW4gYSBTT0FQIG1lc3NhZ2UgcmVxdWVzdCBvciByZXNwb25zZSBpcyAKLSAqIGRldGVjdGVkLiAgVGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBTT0FQIG1lc3NhZ2UgaXMgCi0gKiB0aGVuIGZvcndhcmVkIHRvIGFsbCBjdXJyZW50IHNvY2tldCBjb25uZWN0aW9ucyBmb3IgCi0gKiBkaXNwbGF5IGJ5IHRoZSBhcHBsZXQuCi0gKi8KLQotcHVibGljIGNsYXNzIFNPQVBNb25pdG9yU2VydmljZSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLQotICAvKioKLSAgICogUHJpdmF0ZSBkYXRhIAotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU2VydmVyU29ja2V0IHNlcnZlcl9zb2NrZXQgPSBudWxsOwotICBwcml2YXRlIHN0YXRpYyBWZWN0b3IgICAgICAgY29ubmVjdGlvbnMgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTT0FQTW9uaXRvclNlcnZpY2UuY2xhc3MpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHVibGljIFNPQVBNb25pdG9yU2VydmljZSgpIHsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFB1Ymxpc2ggYSBTT0FQIG1lc3NhZ2UgdG8gbGlzdGVuZXJzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHVibGlzaE1lc3NhZ2UoTG9uZyBpZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHR5cGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwKSB7Ci0gICAgaWYgKGNvbm5lY3Rpb25zICE9IG51bGwpIHsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBjb25uZWN0aW9ucy5lbGVtZW50cygpOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgQ29ubmVjdGlvblRocmVhZCBjdCA9IChDb25uZWN0aW9uVGhyZWFkKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGN0LnB1Ymxpc2hNZXNzYWdlKGlkLHR5cGUsdGFyZ2V0LHNvYXApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2bGV0IGluaXRpYWxpYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGNvbm5lY3Rpb25zID09IG51bGwpIHsKLSAgICAgIC8vIENyZWF0ZSB2ZWN0b3IgdG8gaG9sZCBjb25uZWN0aW9uIGluZm9ybWF0aW9uCi0gICAgICBjb25uZWN0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICB9Ci0gICAgaWYgKHNlcnZlcl9zb2NrZXQgPT0gbnVsbCkgewotICAgICAgLy8gR2V0IHRoZSBzZXJ2ZXIgc29ja2V0IHBvcnQgZnJvbSB0aGUgaW5pdCBwYXJhbXMKLSAgICAgIFNlcnZsZXRDb25maWcgY29uZmlnID0gc3VwZXIuZ2V0U2VydmxldENvbmZpZygpOwotICAgICAgU3RyaW5nIHBvcnQgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihTT0FQTW9uaXRvckNvbnN0YW50cy5TT0FQX01PTklUT1JfUE9SVCk7Ci0gICAgICBpZiAocG9ydCA9PSBudWxsKSB7Ci0gICAgICAgIGxvZy5lcnJvcigiU09BUE1vbml0b3JTZXJ2aWNlIGNhbid0IGZpbmQgU2VydmxldENvbmZpZyBpbml0IHBhcmFtZXRlciAncG9ydCciKTsKLSAgICAgICAgcG9ydCA9ICIwIjsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgIHNlcnZlcl9zb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KEludGVnZXIucGFyc2VJbnQocG9ydCkpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIC8vIExldCBzb21lb25lIGtub3cgd2UgY291bGQgbm90IG9wZW4gdGhlIHNvY2tldAotICAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBvcGVuIHNlcnZlciBzb2NrZXQgdXNpbmcgcG9ydDogIiArIHBvcnQpOwotICAgICAgICBsb2cuZXJyb3IoZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgIC8vIEZhaWwgYXMgbG91ZGx5IGFzIHBvc3NpYmxlIGZvciB0aG9zZSB3aXRob3V0IGxvZ2dpbmcgY29uZmlndXJlZAotICAgICAgICBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5sb2coIlVuYWJsZSB0byBvcGVuIHNlcnZlciBzb2NrZXQgdXNpbmcgcG9ydCAiK3BvcnQrIjoiLCBleCk7Ci0gICAgICAgIHNlcnZlcl9zb2NrZXQgPSBudWxsOwotICAgICAgfQotICAgICAgaWYgKHNlcnZlcl9zb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAvLyBTdGFydCB0aGUgc2VydmVyIHNvY2tldCB0aHJlYWQKLSAgICAgICAgbmV3IFRocmVhZChuZXcgU2VydmVyU29ja2V0VGhyZWFkKCkpLnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlcnZsZXQgdGVybWluYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgLy8gRW5kIGFsbCBjb25uZWN0aW9uIHRocmVhZHMKLSAgICBFbnVtZXJhdGlvbiBlID0gY29ubmVjdGlvbnMuZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgQ29ubmVjdGlvblRocmVhZCBjdCA9IChDb25uZWN0aW9uVGhyZWFkKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBjdC5jbG9zZSgpOwotICAgIH0KLSAgICAvLyBFbmQgbWFpbiBzZXJ2ZXIgc29ja2V0IHRocmVhZAotICAgIGlmIChzZXJ2ZXJfc29ja2V0ICE9IG51bGwpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNlcnZlcl9zb2NrZXQuY2xvc2UoKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7fQotICAgICAgc2VydmVyX3NvY2tldCA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhUVFAgR0VUIHJlcXVlc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KLSAgewotICAgLy8gQ3JlYXRlIEhUTUwgdG8gbG9hZCB0aGUgU09BUCBtb25pdG9yIGFwcGxldAotICAgaW50IHBvcnQgPSAwOwotICAgaWYgKHNlcnZlcl9zb2NrZXQgIT0gbnVsbCkgewotICAgICBwb3J0ID0gc2VydmVyX3NvY2tldC5nZXRMb2NhbFBvcnQoKTsKLSAgICAgbG9nLmRlYnVnKCJTZW5kaW5nIHBhcmFtIHRvIFNPQVAgbW9uaXRvciBhcHBsZXQgYXMgcG9ydDogIiArIHBvcnQpOwotICAgfQotICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPGh0bWw+Iik7Ci0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8aGVhZD4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjx0aXRsZT5TT0FQIE1vbml0b3I8L3RpdGxlPiIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPC9oZWFkPiIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPGJvZHk+Iik7Ci0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8b2JqZWN0IGNsYXNzaWQ9XCJjbHNpZDo4QUQ5Qzg0MC0wNDRFLTExRDEtQjNFOS0wMDgwNUY0OTlEOTNcIiB3aWR0aD0xMDAlIGhlaWdodD0xMDAlIGNvZGViYXNlPVwiaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9wbHVnaW4vMS4zL2ppbnN0YWxsLTEzLXdpbjMyLmNhYiNWZXJzaW9uPTEsMywwLDBcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxwYXJhbSBuYW1lPWNvZGUgdmFsdWU9b3JnLmFwYWNoZS5heGlzMi5zb2FwbW9uaXRvci5hcHBsZXQuU09BUE1vbml0b3JBcHBsZXQuY2xhc3M+Iik7Ci0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8cGFyYW0gbmFtZT1cInR5cGVcIiB2YWx1ZT1cImFwcGxpY2F0aW9uL3gtamF2YS1hcHBsZXQ7dmVyc2lvbj0xLjNcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxwYXJhbSBuYW1lPVwic2NyaXB0YWJsZVwiIHZhbHVlPVwiZmFsc2VcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxwYXJhbSBuYW1lPVwicG9ydFwiIHZhbHVlPVwiIitwb3J0KyJcIj4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxjb21tZW50PiIpOwotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPGVtYmVkIHR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmEtYXBwbGV0O3ZlcnNpb249MS4zXCIgY29kZT1vcmcuYXBhY2hlLmF4aXMyLnNvYXBtb25pdG9yLmFwcGxldC5TT0FQTW9uaXRvckFwcGxldC5jbGFzcyB3aWR0aD0xMDAlIGhlaWdodD0xMDAlIHBvcnQ9XCIiK3BvcnQrIlwiIHNjcmlwdGFibGU9ZmFsc2UgcGx1Z2luc3BhZ2U9XCJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL3BsdWdpbi8xLjMvcGx1Z2luLWluc3RhbGwuaHRtbFwiPiIpOyAKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjxub2VtYmVkPiIpOyAKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjwvY29tbWVudD4iKTsgCi0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8L25vZW1iZWQ+Iik7IAotICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkucHJpbnRsbigiPC9lbWJlZD4iKTsgCi0gICByZXNwb25zZS5nZXRXcml0ZXIoKS5wcmludGxuKCI8L29iamVjdD4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjwvYm9keT4iKTsKLSAgIHJlc3BvbnNlLmdldFdyaXRlcigpLnByaW50bG4oIjwvaHRtbD4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaHJlYWQgY2xhc3MgZm9yIGhhbmRsaW5nIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAqLwotICBjbGFzcyBTZXJ2ZXJTb2NrZXRUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJlYWQgZm9yIGhhbmRsaW5nIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgLy8gV2FpdCBmb3Igc29ja2V0IGNvbm5lY3Rpb25zCi0gICAgICB3aGlsZSAoc2VydmVyX3NvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlcl9zb2NrZXQuYWNjZXB0KCk7Ci0gICAgICAgICAgbmV3IFRocmVhZChuZXcgQ29ubmVjdGlvblRocmVhZChzb2NrZXQpKS5zdGFydCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRocmVhZCBjbGFzcyBmb3IgaGFuZGxpbmcgc29ja2V0IGNvbm5lY3Rpb25zCi0gICAqLwotICBjbGFzcyBDb25uZWN0aW9uVGhyZWFkIGltcGxlbWVudHMgUnVubmFibGUgewotCi0gICAgcHJpdmF0ZSBTb2NrZXQgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKLSAgICBwcml2YXRlIE9iamVjdElucHV0U3RyZWFtICBpbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICBjbG9zZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENvbm5lY3Rpb25UaHJlYWQoU29ja2V0IHMpIHsKLSAgICAgIHNvY2tldCA9IHM7Ci0gICAgICB0cnkgewotICAgICAgICAvLyBVc2Ugb2JqZWN0IHN0cmVhbXMgZm9yIGlucHV0IGFuZCBvdXRwdXQKLSAgICAgICAgLy8KLSAgICAgICAgLy8gTk9URTogV2UgbmVlZCB0byBiZSBzdXJlIHRvIGNyZWF0ZSBhbmQgZmx1c2ggdGhlIAotICAgICAgICAvLyBvdXRwdXQgc3RyZWFtIGZpcnN0IGJlY2F1c2UgdGhlIE9iamVjdE91dHB1dFN0cmVhbQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3cml0ZXMgYSBoZWFkZXIgdG8gdGhlIHN0cmVhbSB0aGF0IGlzCi0gICAgICAgIC8vIG5lZWRlZCBieSB0aGUgT2JqZWN0SW5wdXRTdHJlYW0gb24gdGhlIG90aGVyIGVuZAotICAgICAgICBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICBpbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgIC8vIEFkZCB0aGUgY29ubmVjdGlvbiB0byBvdXIgbGlzdAotICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9ucykgewotICAgICAgICBjb25uZWN0aW9ucy5hZGRFbGVtZW50KHRoaXMpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIHRoZSBzb2NrZXQgY29ubmVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgY2xvc2VkID0gdHJ1ZTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNvY2tldC5jbG9zZSgpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7fQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRocmVhZCB0byBoYW5kbGUgdGhlIHNvY2tldCBjb25uZWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgd2hpbGUgKCFjbG9zZWQpIHsKLSAgICAgICAgICBPYmplY3QgbyA9IGluLnJlYWRPYmplY3QoKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAvLyBDbGVhbnVwIGNvbm5lY3Rpb24gbGlzdAotICAgICAgc3luY2hyb25pemVkIChjb25uZWN0aW9ucykgewotICAgICAgICBjb25uZWN0aW9ucy5yZW1vdmVFbGVtZW50KHRoaXMpOwotICAgICAgfQotICAgICAgLy8gQ2xlYW51cCBJL08gc3RyZWFtcyAKLSAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9Ci0gICAgICAgIG91dCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAoaW4gIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KLSAgICAgICAgaW4gPSBudWxsOwotICAgICAgfQotICAgICAgLy8gQmUgc3VyZSB0aGUgc29ja2V0IGlzIGNsb3NlZAotICAgICAgY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQdWJsaXNoIFNPQVAgbWVzc2FnZSBpbmZvcm1hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwdWJsaXNoTWVzc2FnZShMb25nIGlkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIG1lc3NhZ2VfdHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXApIHsKLSAgICAgIC8vIElmIHdlIGhhdmUgYSB2YWxpZCBvdXRwdXQgc3RyZWFtLCB0aGVuCi0gICAgICAvLyBzZW5kIHRoZSBkYXRhIHRvIHRoZSBhcHBsZXQKLSAgICAgIGlmIChvdXQgIT0gbnVsbCkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHN3aXRjaCAobWVzc2FnZV90eXBlLmludFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgU09BUE1vbml0b3JDb25zdGFudHMuU09BUF9NT05JVE9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChtZXNzYWdlX3R5cGUpOwotICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QoaWQpOwotICAgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QodGFyZ2V0KTsKLSAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHNvYXApOwotICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNPQVBNb25pdG9yQ29uc3RhbnRzLlNPQVBfTU9OSVRPUl9SRVNQT05TRToKLSAgICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KG1lc3NhZ2VfdHlwZSk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChpZCk7Ci0gICAgICAgICAgICAgIG91dC53cml0ZU9iamVjdChzb2FwKTsKLSAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NwcmluZy9wb20ueG1sIGIvMV81L21vZHVsZXMvc3ByaW5nL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTk4MTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc3ByaW5nL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItc3ByaW5nPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIHNwcmluZzwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+c3ByaW5nIGZvciBBeGlzIDIuMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1iZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctY29udGV4dDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc3ByaW5nPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvc3ByaW5nPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy9zcHJpbmc8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NwcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL3NwcmluZy9yZWNlaXZlcnMvQXBwbGljYXRpb25Db250ZXh0SG9sZGVyLmphdmEgYi8xXzUvbW9kdWxlcy9zcHJpbmcvc3JjL29yZy9hcGFjaGUvYXhpczIvZXh0ZW5zaW9ucy9zcHJpbmcvcmVjZWl2ZXJzL0FwcGxpY2F0aW9uQ29udGV4dEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY1N2JmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NwcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL3NwcmluZy9yZWNlaXZlcnMvQXBwbGljYXRpb25Db250ZXh0SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5CZWFuc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHRBd2FyZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIFNwcmluZyBpbnRlcmZhY2Ugd2hvIGlzIGNvbmZpZ3VyZWQgaW4gU3ByaW5nJ3MgYXBwbGljYXRpb25Db250ZXh0LnhtbCBvciBzb21lCi0gKiBvdGhlciBTcHJpbmcgdHlwZSBvZiB3YXkuIFRoaXMgY2xhc3MgYW5kIHRoZSBzcHJpbmcgYmVhbiBuZWVkZWQgdG8gd2lyZSBpdCBjb3VsZCBiZSB1c2VkIGFzIGFuCi0gKiBhbHRlcm5hdGl2ZSB0byBnZXR0aW5nIHRoZSBBcHBsaWNhdGlvbkNvbnRleHQgZnJvbSB0aGUgU2VydmxldENvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNvbnRleHRIb2xkZXIgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkNvbnRleHRBd2FyZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ3R4OwotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uQ29udGV4dEhvbGRlcigpIHsKLSAgICB9Ci0KLSAgICAvKiogU3ByaW5nIHN1cHBsaWVkIGludGVyZmFjZSBtZXRob2QgZm9yIGluamVjdGluZyBhcHAgY29udGV4dC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkNvbnRleHQoQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBCZWFuc0V4Y2VwdGlvbiB7Ci0gICAgICAgIGFwcEN0eCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKiogQWNjZXNzIHRvIHNwcmluZyB3aXJlZCBiZWFucy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gYXBwQ3R4OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllci5qYXZhIGIvMV81L21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9TcHJpbmdBcHBDb250ZXh0QXdhcmVPYmplY3RTdXBwbGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2FmYzU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NwcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL3NwcmluZy9yZWNlaXZlcnMvU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5leHRlbnNpb25zLnNwcmluZy5yZWNlaXZlcnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLlNlcnZpY2VPYmplY3RTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgU3ByaW5nQXBwQ29udGV4dEF3YXJlT2JqZWN0U3VwcGxpZXIgaW1wbGVtZW50cyBTZXJ2aWNlT2JqZWN0U3VwcGxpZXIgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUgPSAiU3ByaW5nQmVhbk5hbWUiOwotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldFNlcnZpY2VPYmplY3QgdGhhdCBpcyBTcHJpbmcgYXdhcmUgdmlhIFNwcmluZyBpbnRlcmZhY2UgQXBwbGljYXRpb25Db250ZXh0QXdhcmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc1NlcnZpY2UKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgT2JqZWN0LgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VPYmplY3QoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTmFtZSBvZiBzcHJpbmcgYXdhcmUgYmVhbiB0byBiZSBpbmplY3RlZCwgdGFrZW4gZnJvbSBzZXJ2aWNlcy54bWwKLSAgICAgICAgICAgIC8vIHZpYSAnU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUgJyAuIFRoZSBCZWFuIGFuZCBpdHMgcHJvcGVydGllcyBhcmUgcHJlLWNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIGFzIG5vcm1hbGx5IGRvbmUgaW4gYSBzcHJpbmcgdHlwZSBvZiB3YXkgYW5kIHN1YnNlcXVlbnRseSBsb2FkZWQgYnkgU3ByaW5nLgotICAgICAgICAgICAgLy8gQXhpczIganVzdCBhc3N1bWVzIHRoYXQgdGhlIGJlYW4gaXMgY29uZmlndXJlZCBhbmQgaXMgaW4gdGhlIGNsYXNzbG9hZGVyLgotICAgICAgICAgICAgUGFyYW1ldGVyIGltcGxCZWFuUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUpOwotICAgICAgICAgICAgU3RyaW5nIGJlYW5OYW1lID0gKChTdHJpbmcpaW1wbEJlYW5QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoYmVhbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uQ29udGV4dEhvbGRlciBpbXBsZW1lbnRzIFNwcmluZyBpbnRlcmZhY2UgQXBwbGljYXRpb25Db250ZXh0QXdhcmUKLSAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHQgYUN0eCA9IEFwcGxpY2F0aW9uQ29udGV4dEhvbGRlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBeGlzMiBDYW4ndCBmaW5kIFNwcmluZydzIEFwcGxpY2F0aW9uQ29udGV4dCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYUN0eC5nZXRCZWFuKGJlYW5OYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkF4aXMyIENhbid0IGZpbmQgU3ByaW5nIEJlYW46ICIgKyBiZWFuTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBhQ3R4LmdldEJlYW4oYmVhbk5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuZ2V0TWVzc2FnZSgicGFyYW1Jc05vdFNwZWNpZmllZCIsICJTRVJWSUNFX1NQUklOR19CRUFOTkFNRSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3NwcmluZy9zcmMvb3JnL2FwYWNoZS9heGlzMi9leHRlbnNpb25zL3NwcmluZy9yZWNlaXZlcnMvU3ByaW5nU2VydmxldENvbnRleHRPYmplY3RTdXBwbGllci5qYXZhIGIvMV81L21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9TcHJpbmdTZXJ2bGV0Q29udGV4dE9iamVjdFN1cHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTJkZDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvc3ByaW5nL3NyYy9vcmcvYXBhY2hlL2F4aXMyL2V4dGVuc2lvbnMvc3ByaW5nL3JlY2VpdmVycy9TcHJpbmdTZXJ2bGV0Q29udGV4dE9iamVjdFN1cHBsaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIuZXh0ZW5zaW9ucy5zcHJpbmcucmVjZWl2ZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5TZXJ2aWNlT2JqZWN0U3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmkxOG4uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5zdXBwb3J0LldlYkFwcGxpY2F0aW9uQ29udGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBTcHJpbmdTZXJ2bGV0Q29udGV4dE9iamVjdFN1cHBsaWVyIGltcGxlbWVudHMgU2VydmljZU9iamVjdFN1cHBsaWVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhTcHJpbmdTZXJ2bGV0Q29udGV4dE9iamVjdFN1cHBsaWVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfU1BSSU5HX0JFQU5OQU1FID0gIlNwcmluZ0JlYW5OYW1lIjsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBnZXRTZXJ2aWNlT2JqZWN0IHRoYXQgaXMgU3ByaW5nIGF3YXJlIHZpYSBTZXJ2bGV0Q29udGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBheGlzU2VydmljZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBPYmplY3QuCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VPYmplY3QoQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gTmFtZSBvZiBzcHJpbmcgYXdhcmUgYmVhbiB0byBiZSBpbmplY3RlZCwgdGFrZW4gZnJvbSBzZXJ2aWNlcy54bWwKLSAgICAgICAgICAgIC8vIHZpYSAnU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUgJyAuIFRoZSBCZWFuIGFuZCBpdHMgcHJvcGVydGllcyBhcmUgcHJlLWNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIGFzIG5vcm1hbGx5IGRvbmUgaW4gYSBzcHJpbmcgdHlwZSBvZiB3YXkgYW5kIHN1YnNlcXVlbnRseSBsb2FkZWQgYnkgU3ByaW5nLgotICAgICAgICAgICAgLy8gQXhpczIganVzdCBhc3N1bWVzIHRoYXQgdGhlIGJlYW4gaXMgY29uZmlndXJlZCBhbmQgaXMgaW4gdGhlIGNsYXNzbG9hZGVyLgotICAgICAgICAgICAgUGFyYW1ldGVyIGltcGxCZWFuUGFyYW0gPSBheGlzU2VydmljZS5nZXRQYXJhbWV0ZXIoU0VSVklDRV9TUFJJTkdfQkVBTk5BTUUpOwotICAgICAgICAgICAgU3RyaW5nIGJlYW5OYW1lID0gKChTdHJpbmcpaW1wbEJlYW5QYXJhbS5nZXRWYWx1ZSgpKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoYmVhbk5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBzZXJ2bGV0Q29uZmlnUGFyYW0gPSBheGlzU2VydmljZS5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuSFRUUF9TRVJWTEVUQ09ORklHKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0Q29uZmlnUGFyYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBeGlzMiBDYW4ndCBmaW5kIFNlcnZsZXRDb25maWdQYXJhbWV0ZXIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHNlcnZsZXRDb25maWdQYXJhbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0OwotICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2bGV0Q29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IChTZXJ2bGV0Q29uZmlnKW9iajsKLSAgICAgICAgICAgICAgICAgICAgc2VydmxldENvbnRleHQgPSBzZXJ2bGV0Q29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQXhpczIgQ2FuJ3QgZmluZCBTZXJ2bGV0Q29uZmlnIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dCBhQ3R4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uQ29udGV4dFV0aWxzLmdldFdlYkFwcGxpY2F0aW9uQ29udGV4dChzZXJ2bGV0Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFDdHggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiQXhpczIgQ2FuJ3QgZmluZCBTcHJpbmcncyBBcHBsaWNhdGlvbkNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhQ3R4LmdldEJlYW4oYmVhbk5hbWUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQXhpczIgQ2FuJ3QgZmluZCBTcHJpbmcgQmVhbjogIiArIGJlYW5OYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFDdHguZ2V0QmVhbihiZWFuTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5nZXRNZXNzYWdlKCJwYXJhbUlzTm90U3BlY2lmaWVkIiwgIlNFUlZJQ0VfU1BSSU5HX0JFQU5OQU1FIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy9zcHJpbmcvdGVzdC1yZXNvdXJjZXMvYXBwbGljYXRpb25Db250ZXh0LnhtbCBiLzFfNS9tb2R1bGVzL3NwcmluZy90ZXN0LXJlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhjMGUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3NwcmluZy90ZXN0LXJlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgYmVhbnMgUFVCTElDICItLy9TUFJJTkcvL0RURCBCRUFOLy9FTiIgImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9kdGQvc3ByaW5nLWJlYW5zLmR0ZCI+Ci0KLTxiZWFucz4KLSAgPCEtLSBVc2VkIHRvIHRlc3QgYSBub24tc2VydmxldCBjb250YWluZXIgZW52aXJvbm1lbnQgLSBnaXZlcyBzcHJpbmcgdG8gZ2l2ZSBhIGhvb2sgdG8gYXhpczIgLS0+Ci0gIDxiZWFuIGlkPSJhcHBsaWNhdGlvbkNvbnRleHQiIAotICAgIGNsYXNzPSJvcmcuYXBhY2hlLmF4aXMyLmV4dGVuc2lvbnMuc3ByaW5nLnJlY2VpdmVycy5BcHBsaWNhdGlvbkNvbnRleHRIb2xkZXIiIC8+Ci0KLSAgPCEtLSBBeGlzMiBXZWIgU2VydmljZSwgYnV0IHRvIFNwcmluZywgaXRzIGp1c3QgYW5vdGhlciBiZWFuIHRoYXQgaGFzIGRlcGVuZGVuY2llcyAtLT4KLSAgPGJlYW4gaWQ9InNwcmluZ0F3YXJlU2VydmljZSIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc3ByaW5nLlNwcmluZ0F3YXJlU2VydmljZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im15QmVhbiIgcmVmPSJteUJlYW4iLz4KLSAgPC9iZWFuPgotCi0gIDwhLS0ganVzdCBhbm90aGVyIGJlYW4gd2l0aCBhIHdpcmVkIGltcGxlbWVudGF0aW9uLCB0aGF0J3MgaW5qZWN0ZWQgYnkgU3ByaW5nIAotICAgICAgICAgIGludG8gdGhlIFdlYiBTZXJ2aWNlIC0tPgotICAgPGJlYW4gaWQ9Im15QmVhbiIgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIuc3ByaW5nLk15QmVhbkltcGwiPgotICAgICA8cHJvcGVydHkgbmFtZT0idmFsIiB2YWx1ZT0iU3ByaW5nLCBlbWVyZ2UgdGh5c2VsZiIgLz4KLSAgPC9iZWFuPgotPC9iZWFucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGQ0ZjYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWFhci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSB0b29sIC0gQUFSIE1hdmVuIFBsdWdpbjwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgTWF2ZW4gMiBwbHVnaW4gZm9yIGNyZWF0aW5nIEF4aXMgMiBzZXJ2aWNlIGFyY2hpdmVzIChhYXIgZmlsZXMpCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW48L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbjwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cHJvamVjdC52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5qb2NoZW48L2lkPgotICAgICAgICAgICAgPG5hbWU+Sm9jaGVuIFdpZWRtYW5uPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvY2hlbi53aWVkbWFubkBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICA8L2RldmVsb3BlcnM+Ci0gICAgPGNvbnRyaWJ1dG9ycz4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+Sm9obiBQZmVpZmVyPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvaG4ucGZlaWZlckBobnBzb2x1dGlvbnMuY29tPC9lbWFpbD4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICA8L2NvbnRyaWJ1dG9ycz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJFeHBsb2RlZE1vam8uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJFeHBsb2RlZE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1NzhkNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvQWFyRXhwbG9kZWRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmFhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGV4cGxvZGVkIGFhcgotICoKLSAqIEBnb2FsIGV4cGxvZGVkCi0gKiBAcGhhc2UgcGFja2FnZQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICovCi1wdWJsaWMgY2xhc3MgQWFyRXhwbG9kZWRNb2pvCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RBYXJNb2pvIHsKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRFeHBsb2RlZEFhcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJJblBsYWNlTW9qby5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0FhckluUGxhY2VNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYWQ5N2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0FhckluUGxhY2VNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmFhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci0KLS8qKgotICogR2VuZXJhdGVzIGFhciBpbiB0aGUgc291cmNlIGRpcmVjdG9yeQotICoKLSAqIEBnb2FsIGlucGxhY2UKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIHJ1bnRpbWUKLSAqLwotcHVibGljIGNsYXNzIEFhckluUGxhY2VNb2pvCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RBYXJNb2pvIHsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nIGFhciBpbiBzb3VyY2UgZGlyZWN0b3J5Li4uICIgKyBhYXJEaXJlY3RvcnkpOwotICAgICAgICBidWlsZEV4cGxvZGVkQWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0Fhck1vam8uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYXJNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYWU1YzkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0Fhck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmFhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuSmFyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuTWFuaWZlc3RFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBCdWlsZCBhIGFhci4KLSAqCi0gKiBAZ29hbCBhYXIKLSAqIEBwaGFzZSBwYWNrYWdlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBBYXJNb2pvIGV4dGVuZHMgQWJzdHJhY3RBYXJNb2pvIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGZvciB0aGUgZ2VuZXJhdGVkIGFhci4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBhYXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFhck5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSmFyIGFyY2hpdmVyLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2NvbXBvbmVudC5vcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyI2phcn0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBKYXJBcmNoaXZlciBqYXJBcmNoaXZlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBtYXZlbiBhcmNoaXZlIGNvbmZpZ3VyYXRpb24gdG8gdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlID0gbmV3IE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIENsYXNzaWZpZXIgdG8gYWRkIHRvIHRoZSBhcnRpZmFjdCBnZW5lcmF0ZWQuIElmIGdpdmVuLCB0aGUgYXJ0aWZhY3Qgd2lsbCBiZSBhbiBhdHRhY2htZW50Ci0gICAgICogaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc2lmaWVyOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGlzIGlzIHRoZSBtYWluIGFydGlmYWN0IGJlaW5nIGJ1aWx0LiBTZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHlvdSBkb24ndCB3YW50IHRvCi0gICAgICogaW5zdGFsbCBvciBkZXBsb3kgaXQgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUgaW4gYW4gZXhlY3V0aW9uLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3ByaW1hcnlBcnRpZmFjdH0iIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHByaW1hcnlBcnRpZmFjdDsKLQotICAgIC8qKiBAY29tcG9uZW50ICovCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3RIZWxwZXIgcHJvamVjdEhlbHBlcjsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBBYXJNb2pvIG9uIHRoZSBjdXJyZW50IHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aGlsZSBidWlsZGluZyB0aGUgd2ViYXBwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBGaWxlIGFhckZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnksIGFhck5hbWUgKyAiLmFhciIpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwZXJmb3JtUGFja2FnaW5nKGFhckZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGFzc2VtYmxpbmcgYWFyIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgdGhlIGFhci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhYXJGaWxlIHRoZSB0YXJnZXQgYWFyIGZpbGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIERlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWRFeGNlcHRpb24KLSAgICAgKgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtUGFja2FnaW5nKEZpbGUgYWFyRmlsZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24sIE1hbmlmZXN0RXhjZXB0aW9uLAotICAgICAgICAgICAgRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIGJ1aWxkRXhwbG9kZWRBYXIoKTsKLQotICAgICAgICAvLyBnZW5lcmF0ZSBhYXIgZmlsZQotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIGFhciAiICsgYWFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIE1hdmVuQXJjaGl2ZXIgYXJjaGl2ZXIgPSBuZXcgTWF2ZW5BcmNoaXZlcigpOwotICAgICAgICBhcmNoaXZlci5zZXRBcmNoaXZlcihqYXJBcmNoaXZlcik7Ci0gICAgICAgIGFyY2hpdmVyLnNldE91dHB1dEZpbGUoYWFyRmlsZSk7Ci0gICAgICAgIGphckFyY2hpdmVyLmFkZERpcmVjdG9yeShhYXJEaXJlY3RvcnkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhcmNoaXZlCi0gICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUocHJvamVjdCwgYXJjaGl2ZSk7Ci0KLSAgICAgICAgaWYgKGNsYXNzaWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdChwcm9qZWN0LCAiYWFyIiwgY2xhc3NpZmllciwgYWFyRmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IHByb2plY3QuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5QXJ0aWZhY3QpIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdC5zZXRGaWxlKGFhckZpbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcnRpZmFjdC5nZXRGaWxlKCkgPT0gbnVsbCB8fCBhcnRpZmFjdC5nZXRGaWxlKCkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGFydGlmYWN0LnNldEZpbGUoYWFyRmlsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QocHJvamVjdCwgImFhciIsIGFhckZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0Fic3RyYWN0QWFyTW9qby5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0Fic3RyYWN0QWFyTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTdiN2M1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9BYnN0cmFjdEFhck1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmFhcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuU2NvcGVBcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0KLS8qKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGFsbCB0aGUgbW9qb3MgaW4gdGhlIGF4aXMyLWFhci1tYXZlbi1wbHVnaW4uICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBYXJNb2pvCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9qZWN0cyBiYXNlIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJhc2VkaXJ9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGJhc2VEaXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF2ZW4gcHJvamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZ2VuZXJhdGVkIGNsYXNzZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBjbGFzc2VzRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgYWFyIGlzIGJ1aWx0LgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hYXIiCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgYWFyRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGxvY2F0aW9uIG9mIHRoZSBzZXJ2aWNlcy54bWwgZmlsZS4gIElmIGl0IGlzIHByZXNlbnQgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSBpbgotICAgICAqIHNyYy9tYWluL3Jlc291cmNlcyB3aXRoIHRoYXQgbmFtZSB0aGVuIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNsdWRlZC4gT3RoZXJ3aXNlIHRoaXMKLSAgICAgKiBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHNlcnZpY2VzWG1sRmlsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBmaWxlLCBpZiBhbnkuIEJ5IGRlZmF1bHQsIG5vIFdTREwgZmlsZSBpcyBhZGRlZCBhbmQgaXQgaXMgYXNzdW1lZCwKLSAgICAgKiB0aGF0IEF4aXMgMiB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBXU0RMIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIHdzZGxGaWxlOwotCi0gICAgLyoqCi0gICAgICogTmFtZSwgdG8gd2hpY2ggdGhlIHdzZGwgZmlsZSBzaGFsbCBiZSBtYXBwZWQuIEJ5IGRlZmF1bHQsIHRoZSBuYW1lIHdpbGwgYmUgY29tcHV0ZWQgZnJvbSB0aGUKLSAgICAgKiBmaWxlcyBwYXRoIGJ5IHJlbW92aW5nIHRoZSBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InNlcnZpY2Uud3NkbCIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRpdGlvbmFsIGZpbGUgc2V0cywgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZVNldFtdIGZpbGVTZXRzOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgZGVwZW5kZW5jeSBqYXJzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgYWFyCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7aW5jbHVkZURlcGVuZGVuY2llc30iIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVEZXBlbmRlbmNpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIGV4cGxvZGVkIEFBUiBmaWxlLgotICAgICAqCi0gICAgICogQHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYnVpbGRFeHBsb2RlZEFhcigpCi0gICAgICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJFeHBsb2RpbmcgYWFyLi4uIik7Ci0KLSAgICAgICAgYWFyRGlyZWN0b3J5Lm1rZGlycygpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiQXNzZW1ibGluZyBhYXIgIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIiBpbiAiICsgYWFyRGlyZWN0b3J5KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgRmlsZSBtZXRhSW5mRGlyID0gbmV3IEZpbGUoYWFyRGlyZWN0b3J5LCAiTUVUQS1JTkYiKTsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgbGliRGlyID0gbmV3IEZpbGUoYWFyRGlyZWN0b3J5LCAibGliIik7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIHNlcnZpY2VzRmlsZVRhcmdldCA9IG5ldyBGaWxlKG1ldGFJbmZEaXIsICJzZXJ2aWNlcy54bWwiKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZXhpc3RzQmVmb3JlQ29weWluZ0NsYXNzZXMgPSBzZXJ2aWNlc0ZpbGVUYXJnZXQuZXhpc3RzKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB3c2RsTmFtZSA9IHdzZGxGaWxlTmFtZTsKLSAgICAgICAgICAgIGlmICh3c2RsTmFtZSA9PSBudWxsICYmIHdzZGxGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsTmFtZSA9IHdzZGxGaWxlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgd3NkbEZpbGVUYXJnZXQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHdzZGxGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsRmlsZVRhcmdldCA9IG5ldyBGaWxlKG1ldGFJbmZEaXIsIHdzZGxGaWxlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIHdzZGxFeGlzdHNCZWZvcmVDb3B5aW5nQ2xhc3NlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxGaWxlVGFyZ2V0ID09IG51bGwgPyBmYWxzZSA6IHdzZGxGaWxlVGFyZ2V0LmV4aXN0cygpOwotCi0gICAgICAgICAgICBpZiAoY2xhc3Nlc0RpcmVjdG9yeS5leGlzdHMoKSAmJiAoIWNsYXNzZXNEaXJlY3RvcnkuZXF1YWxzKGFhckRpcmVjdG9yeSkpKSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlEaXJlY3RvcnlTdHJ1Y3R1cmUoY2xhc3Nlc0RpcmVjdG9yeSwgYWFyRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZpbGVTZXRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVTZXRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVTZXQgZmlsZVNldCA9IGZpbGVTZXRzW2ldOwotICAgICAgICAgICAgICAgICAgICBjb3B5RmlsZVNldChmaWxlU2V0LCBhYXJEaXJlY3RvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29weU1ldGFJbmZGaWxlKHNlcnZpY2VzWG1sRmlsZSwgc2VydmljZXNGaWxlVGFyZ2V0LCBleGlzdHNCZWZvcmVDb3B5aW5nQ2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmljZXMueG1sIGZpbGUiKTsKLSAgICAgICAgICAgIGNvcHlNZXRhSW5mRmlsZSh3c2RsRmlsZSwgd3NkbEZpbGVUYXJnZXQsIHdzZGxFeGlzdHNCZWZvcmVDb3B5aW5nQ2xhc3NlcywgIldTREwgZmlsZSIpOwotCi0gICAgICAgICAgICBpZiAoaW5jbHVkZURlcGVuZGVuY2llcykgewotICAgICAgICAgICAgICAgIFNldCBhcnRpZmFjdHMgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotCi0gICAgICAgICAgICAgICAgTGlzdCBkdXBsaWNhdGVzID0gZmluZER1cGxpY2F0ZXMoYXJ0aWZhY3RzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IGdldERlZmF1bHRGaW5hbE5hbWUoYXJ0aWZhY3QpOwotCi0gICAgICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCJQcm9jZXNzaW5nOiAiICsgdGFyZ2V0RmlsZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVzLmNvbnRhaW5zKHRhcmdldEZpbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkR1cGxpY2F0ZSBmb3VuZDogIiArIHRhcmdldEZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEZpbGVOYW1lID0gYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpICsgIi0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFyZ2V0RmlsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiUmVuYW1lZCB0bzogIiArIHRhcmdldEZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHV0aWxpc2UgYXBwcm9wcmlhdGUgbWV0aG9kcyBmcm9tIHByb2plY3QgYnVpbGRlcgotICAgICAgICAgICAgICAgICAgICBTY29wZUFydGlmYWN0RmlsdGVyIGZpbHRlciA9IG5ldyBTY29wZUFydGlmYWN0RmlsdGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGlmYWN0LlNDT1BFX1JVTlRJTUUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWFydGlmYWN0LmlzT3B0aW9uYWwoKSAmJiBmaWx0ZXIuaW5jbHVkZShhcnRpZmFjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gYXJ0aWZhY3QuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCJqYXIiLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlGaWxlSWZNb2RpZmllZChhcnRpZmFjdC5nZXRGaWxlKCksIG5ldyBGaWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliRGlyLCB0YXJnZXRGaWxlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGV4cGxvZGUgYWFyLi4uIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2hlcyBhIHNldCBvZiBhcnRpZmFjdHMgZm9yIGR1cGxpY2F0ZSBmaWxlbmFtZXMgYW5kIHJldHVybnMgYSBsaXN0IG9mIGR1cGxpY2F0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3RzIHNldCBvZiBhcnRpZmFjdHMKLSAgICAgKiBAcmV0dXJuIExpc3Qgb2YgZHVwbGljYXRlZCBhcnRpZmFjdHMKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgZmluZER1cGxpY2F0ZXMoU2V0IGFydGlmYWN0cykgewotICAgICAgICBMaXN0IGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3QgaWRlbnRpZmllcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IGdldERlZmF1bHRGaW5hbE5hbWUoYXJ0aWZhY3QpOwotICAgICAgICAgICAgaWYgKGlkZW50aWZpZXJzLmNvbnRhaW5zKGNhbmRpZGF0ZSkpIHsKLSAgICAgICAgICAgICAgICBkdXBsaWNhdGVzLmFkZChjYW5kaWRhdGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZGVudGlmaWVycy5hZGQoY2FuZGlkYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHVwbGljYXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGUgZmlsZW5hbWUgb2YgYW4gYXJ0aWZhY3QgdG8gYXJ0aWZhY3RJZC12ZXJzaW9uLnR5cGUgZm9ybWF0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFydGlmYWN0Ci0gICAgICogQHJldHVybiBjb252ZXJ0ZWQgZmlsZW5hbWUgb2YgdGhlIGFydGlmYWN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdEZpbmFsTmFtZShBcnRpZmFjdCBhcnRpZmFjdCkgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgYXJ0aWZhY3QuZ2V0VmVyc2lvbigpICsgIi4iICsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdC5nZXRBcnRpZmFjdEhhbmRsZXIoKS5nZXRFeHRlbnNpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb3B5IGZpbGUgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gb25seSBpZiBzb3VyY2UgdGltZXN0YW1wIGlzIGxhdGVyIHRoYW4gdGhlIGRlc3RpbmF0aW9uCi0gICAgICogdGltZXN0YW1wLiBUaGUgZGlyZWN0b3JpZXMgdXAgdG8gPGNvZGU+ZGVzdGluYXRpb248L2NvZGU+IHdpbGwgYmUgY3JlYXRlZCBpZiB0aGV5IGRvbid0Ci0gICAgICogYWxyZWFkeSBleGlzdC4gPGNvZGU+ZGVzdGluYXRpb248L2NvZGU+IHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlICAgICAgQW4gZXhpc3Rpbmcgbm9uLWRpcmVjdG9yeSA8Y29kZT5GaWxlPC9jb2RlPiB0byBjb3B5IGJ5dGVzIGZyb20uCi0gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIEEgbm9uLWRpcmVjdG9yeSA8Y29kZT5GaWxlPC9jb2RlPiB0byB3cml0ZSBieXRlcyB0byAocG9zc2libHkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRpbmcpLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgICAgICAgaWYgPGNvZGU+c291cmNlPC9jb2RlPiBkb2VzIG5vdCBleGlzdCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiBjYW5ub3QgYmUgd3JpdHRlbiB0bywgb3IgYW4gSU8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIG9jY3VycyBkdXJpbmcgY29weWluZy4KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiBpcyBhIGRpcmVjdG9yeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAvPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE8gRE86IFJlbW92ZSB0aGlzIG1ldGhvZCB3aGVuIE1hdmVuIG1vdmVzIHRvCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGV4dXMtdXRpbHMgdmVyc2lvbiAxLjQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29weUZpbGVJZk1vZGlmaWVkKEZpbGUgc291cmNlLCBGaWxlIGRlc3RpbmF0aW9uKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gVE8gRE86IFJlbW92ZSB0aGlzIG1ldGhvZCBhbmQgdXNlIHRoZSBtZXRob2QgaW4gV2FyRmlsZVV0aWxzIHdoZW4gTWF2ZW4gMiBjaGFuZ2VzCi0gICAgICAgIC8vIHRvIHBsZXh1cy11dGlscyAxLjIuCi0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5sYXN0TW9kaWZpZWQoKSA8IHNvdXJjZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKHNvdXJjZS5nZXRDYW5vbmljYWxGaWxlKCksIGRlc3RpbmF0aW9uKTsKLSAgICAgICAgICAgIC8vIHByZXNlcnZlIHRpbWVzdGFtcAotICAgICAgICAgICAgZGVzdGluYXRpb24uc2V0TGFzdE1vZGlmaWVkKHNvdXJjZS5sYXN0TW9kaWZpZWQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29weUZpbGVTZXQoRmlsZVNldCBmaWxlU2V0LCBGaWxlIHRhcmdldERpcmVjdG9yeSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZGlyID0gZmlsZVNldC5nZXREaXJlY3RvcnkoKTsKLSAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkaXIgPSBiYXNlRGlyOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgdGFyZ2V0RGlyID0gdGFyZ2V0RGlyZWN0b3J5OwotICAgICAgICBpZiAoZmlsZVNldC5nZXRPdXRwdXREaXJlY3RvcnkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXREaXIgPSBuZXcgRmlsZSh0YXJnZXREaXIsIGZpbGVTZXQuZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXREaXIuZXF1YWxzKGRpcikpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICBkcy5zZXRCYXNlZGlyKGRpcik7Ci0gICAgICAgIGlmICghZmlsZVNldC5pc1NraXBEZWZhdWx0RXhjbHVkZXMoKSkgewotICAgICAgICAgICAgZHMuYWRkRGVmYXVsdEV4Y2x1ZGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjbHVkZXMgPSBmaWxlU2V0LmdldEV4Y2x1ZGVzKCk7Ci0gICAgICAgIGlmIChleGNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkcy5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMgPSBmaWxlU2V0LmdldEluY2x1ZGVzKCk7Ci0gICAgICAgIGlmIChpbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZHMuc2NhbigpOwotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShzb3VyY2VGaWxlLCB0YXJnZXRGaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlNZXRhSW5mRmlsZShmaW5hbCBGaWxlIHBTb3VyY2UsIGZpbmFsIEZpbGUgcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcEV4aXN0c0JlZm9yZUNvcHlpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcERlc2NyaXB0aW9uKQotICAgICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBTb3VyY2UgIT0gbnVsbCAmJiBwVGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghcFNvdXJjZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjb25maWd1cmVkICIgKyBwRGVzY3JpcHRpb24gKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcEV4aXN0c0JlZm9yZUNvcHlpbmcgJiYgcFRhcmdldC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oIlRoZSBjb25maWd1cmVkICIgKyBwRGVzY3JpcHRpb24gKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBvdmVyd3JpdGVzIGFub3RoZXIgZmlsZSBmcm9tIHRoZSBjbGFzc3BhdGguIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShwU291cmNlLCBwVGFyZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9EZXBsb3lBYXJNb2pvLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvRGVwbG95QWFyTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODYyMjIyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2Fhci9EZXBsb3lBYXJNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5hYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuTmFtZVZhbHVlUGFpcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5jb29raWUuQ29va2llUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuR2V0TWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUG9zdE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLm11bHRpcGFydC5GaWxlUGFydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLm11bHRpcGFydC5NdWx0aXBhcnRSZXF1ZXN0RW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMubXVsdGlwYXJ0LlBhcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLkh0dHBDbGllbnRQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBEZXBsb3lzIGFuIEFBUiB0byB0aGUgQXhpczIgc2VydmVyLgotICogCi0gKiBAZ29hbCBkZXBsb3lhYXIKLSAqIEBwaGFzZSBpbnN0YWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXBsb3lBYXJNb2pvIGV4dGVuZHMgQWJzdHJhY3RBYXJNb2pvIHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMT0dJTl9GQUlMRURfRVJST1JfTUVTU0FHRSA9ICJJbnZhbGlkIGF1dGggY3JlZGVudGlhbHMhIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBVUkwgb2YgdGhlIEF4aXMyIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9heGlzMi1hZG1pbiIgZXhwcmVzc2lvbj0iJHtheGlzMi5hYXIuYXhpczJBZG1pbkNvbnNvbGVVUkx9IgotICAgICAqLwotICAgIHByaXZhdGUgVVJMIGF4aXMyQWRtaW5Db25zb2xlVVJMOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFkbWluaXN0cmF0b3IgdXNlciBuYW1lIGZvciB0aGUgQXhpczIgYWRtaW5pc3RyYXRpb24gY29uc29sZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5hYXIuYXhpczJBZG1pblVzZXJ9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF4aXMyQWRtaW5Vc2VyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGFkbWluaXN0cmF0b3IgcGFzc3dvcmQgZm9yIHRoZSBBeGlzMiBhZG1pbmlzdHJhdGlvbiBjb25zb2xlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmFhci5heGlzMkFkbWluUGFzc3dvcmR9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGF4aXMyQWRtaW5QYXNzd29yZDsKLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGVzIHRoZSBEZXBsb3lBYXJNb2pvIG9uIHRoZSBjdXJyZW50IHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIHdlYmFwcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIkRlcGxveWluZyBBQVIgYXJ0aWZhY3QgIitwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpKyIgdG8gQXhpczIgV2ViIENvbnNvbGUgIitheGlzMkFkbWluQ29uc29sZVVSTCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkZXBsb3kocHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSk7Ci0gICAgICAgIH0gY2F0Y2goTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGRlcGxveWluZyBhYXIiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlcGxveXMgdGhlIEFBUi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhYXJGaWxlIHRoZSB0YXJnZXQgQUFSIGZpbGUKLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEh0dHBFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRlcGxveShGaWxlIGFhckZpbGUpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSHR0cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmKGF4aXMyQWRtaW5Db25zb2xlVVJMID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJObyBBeGlzMiBhZG1pbmlzdHJhdGl2ZSBjb25zb2xlIFVSTCBwcm92aWRlZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gZ2V0IG5hbWUgb2Ygd2ViIHNlcnZpY2UgbW91bnQgcG9pbnQKLSAgICAgICAgSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwotICAgICAgICBjbGllbnQuZ2V0UGFyYW1zKCkuc2V0UGFyYW1ldGVyKEh0dHBDbGllbnRQYXJhbXMuQ09PS0lFX1BPTElDWSwgQ29va2llUG9saWN5LkJST1dTRVJfQ09NUEFUSUJJTElUWSk7Ci0KLSAgICAgICAgLy8gbG9nIGludG8gQXhpczIgYWRtaW5pc3RyYXRpb24gY29uc29sZQotICAgICAgICBVUkwgYXhpczJBZG1pbkNvbnNvbGVMb2dpblVSTCA9IG5ldyBVUkwoYXhpczJBZG1pbkNvbnNvbGVVUkwudG9TdHJpbmcoKSsiL2xvZ2luIik7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCJMb2dnaW5nIGludG8gQXhpczIgQWRtaW4gV2ViIENvbnNvbGUgIitheGlzMkFkbWluQ29uc29sZUxvZ2luVVJMKyIgdXNpbmcgdXNlciBJRCAiK2F4aXMyQWRtaW5Vc2VyKTsKLQotICAgICAgICBQb3N0TWV0aG9kICBwb3N0ID0gbmV3IFBvc3RNZXRob2QoYXhpczJBZG1pbkNvbnNvbGVMb2dpblVSTC50b1N0cmluZygpKTsKLSAgICAgICAgTmFtZVZhbHVlUGFpcltdIG52cHMgPSBuZXcgTmFtZVZhbHVlUGFpcltdIHsKLSAgICAgICAgICAgICAgICBuZXcgTmFtZVZhbHVlUGFpcigidXNlck5hbWUiLCBheGlzMkFkbWluVXNlciksCi0gICAgICAgICAgICAgICAgbmV3IE5hbWVWYWx1ZVBhaXIoInBhc3N3b3JkIiwgYXhpczJBZG1pblBhc3N3b3JkKQotICAgICAgICB9OwotICAgICAgICBwb3N0LnNldFJlcXVlc3RCb2R5KG52cHMpOwotCi0gICAgICAgIGludCBzdGF0dXMgPSBjbGllbnQuZXhlY3V0ZU1ldGhvZChwb3N0KTsKLSAgICAgICAgaWYoc3RhdHVzICE9IDIwMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBsb2cgaW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZihwb3N0LmdldFJlc3BvbnNlQm9keUFzU3RyaW5nKCkuaW5kZXhPZihMT0dJTl9GQUlMRURfRVJST1JfTUVTU0FHRSkhPS0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvZyBpbnRvIEF4aXMyIGFkbWluaXN0cmF0aW9uIHdlYiBjb25zb2xlIHVzaW5nIGNyZWRlbnRpYWxzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZXBsb3kgQUFSIHdlYiBzZXJ2aWNlCi0gICAgICAgIFVSTCBheGlzMkFkbWluQ29uc29sZVVwbG9hZFVSTCA9IG5ldyBVUkwoYXhpczJBZG1pbkNvbnNvbGVVUkwudG9TdHJpbmcoKSsiL3VwbG9hZCIpOwotICAgICAgICBnZXRMb2coKS5kZWJ1ZygiVXBsb2FkaW5nIEFBUiB0byBBeGlzMiBBZG1pbiBXZWIgQ29uc29sZSAiK2F4aXMyQWRtaW5Db25zb2xlVXBsb2FkVVJMKTsKLQotICAgICAgICBwb3N0ID0gbmV3IFBvc3RNZXRob2QoYXhpczJBZG1pbkNvbnNvbGVVcGxvYWRVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgIFBhcnRbXSBwYXJ0cyA9IHsKLSAgICAgICAgICAgICAgICBuZXcgRmlsZVBhcnQocHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKS5nZXROYW1lKCksIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkpCi0gICAgICAgIH07Ci0gICAgICAgIHBvc3Quc2V0UmVxdWVzdEVudGl0eShuZXcgTXVsdGlwYXJ0UmVxdWVzdEVudGl0eShwYXJ0cywgcG9zdC5nZXRQYXJhbXMoKSkpOwotCi0gICAgICAgIHN0YXR1cyA9IGNsaWVudC5leGVjdXRlTWV0aG9kKHBvc3QpOwotICAgICAgICBpZihzdGF0dXMgIT0gMjAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvZyBpbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9nIG91dCBvZiB3ZWIgY29uc29sZQotICAgICAgICBVUkwgYXhpczJBZG1pbkNvbnNvbGVMb2dvdXRVUkwgPSBuZXcgVVJMKGF4aXMyQWRtaW5Db25zb2xlVVJMLnRvU3RyaW5nKCkrIi9sb2dvdXQiKTsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkxvZ2dpbmcgb3V0IG9mIEF4aXMyIEFkbWluIFdlYiBDb25zb2xlICIrYXhpczJBZG1pbkNvbnNvbGVMb2dvdXRVUkwpOwotCi0gICAgICAgIEdldE1ldGhvZCBnZXQgPSBuZXcgR2V0TWV0aG9kKGF4aXMyQWRtaW5Db25zb2xlTG9nb3V0VVJMLnRvU3RyaW5nKCkpOwotICAgICAgICBzdGF0dXMgPSBjbGllbnQuZXhlY3V0ZU1ldGhvZChnZXQpOwotICAgICAgICBpZihzdGF0dXMgIT0gMjAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGxvZyBvdXQiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvRmlsZVNldC5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvYWFyL0ZpbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjYjdhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9hYXIvRmlsZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5hYXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotLyoqCi0gKiBBIEZpbGVTZXQgZGVmaW5lcyBhZGRpdGlvbmFsIGZpbGVzLCB3aGljaCBhcmUgYmVpbmcgYWRkZWQgdG8gdGhlIEF4aXMgYXBwbGljYXRpb24gYXJjaGl2ZS4gVGhlCi0gKiBvYmplY3RzIHN0cnVjdHVyZSBmb2xsb3dzIHRoZSBGaWxlU2V0IG9iamVjdCBmcm9tIHRoZSBtYXZlbi1hc3NlbWJseS1wbHVnaW4sIHNlZSB0aGUgPGEKLSAqIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5Lmh0bWwiPnBsdWdpbgotICogZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGRldGFpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlU2V0IHsKLSAgICBwcml2YXRlIEZpbGUgZGlyZWN0b3J5OwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dERpcmVjdG9yeTsKLSAgICBwcml2YXRlIFN0cmluZ1tdIGluY2x1ZGVzLCBleGNsdWRlczsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcERlZmF1bHRFeGNsdWRlczsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgc2V0cyBiYXNlIGRpcmVjdG9yeS4gTWF5IGJlIG9taXR0ZWQsIGluIHdoaWNoIGNhc2UgdGhlIHByb2plY3RzIGJhc2UKLSAgICAgKiBkaXJlY3RvcnkgaXMgYXNzdW1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXREaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBkaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZmlsZSBzZXRzIGJhc2UgZGlyZWN0b3J5LiBNYXkgYmUgb21pdHRlZCwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvamVjdHMgYmFzZSBkaXJlY3RvcnkKLSAgICAgKiBpcyBhc3N1bWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGUgZmlsZSBzZXRzIGV4Y2x1c2lvbiBsaXN0LiAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlcygpIHsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKiBTZXRzIHRoZSBmaWxlIHNldHMgZXhjbHVzaW9uIGxpc3QuICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpIHsKLSAgICAgICAgdGhpcy5leGNsdWRlcyA9IGV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBmaWxlIHNldHMgaW5jbHVzaW9uIGxpc3QuICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVzKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgLyoqIFNldHMgdGhlIGZpbGUgc2V0cyBpbmNsdXNpb24gbGlzdC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhTdHJpbmdbXSBpbmNsdWRlcykgewotICAgICAgICB0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIHByZWZpeCwgd2hpY2ggdGhlIGluY2x1ZGVkIGZpbGVzIHNob3VsZCBoYXZlIHdoZW4gYmVpbmcgYWRkZWQgdG8gdGhlIEF4aXMgYXBwbGljYXRpb24KLSAgICAgKiBhcmNoaXZlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmVmaXgsIHdoaWNoIHRoZSBpbmNsdWRlZCBmaWxlcyBzaG91bGQgaGF2ZSB3aGVuIGJlaW5nIGFkZGVkIHRvIHRoZSBBeGlzCi0gICAgICogYXBwbGljYXRpb24gYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoU3RyaW5nIG91dHB1dERpcmVjdG9yeSkgewotICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucywgd2hldGhlciB0aGUgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBEZWZhdWx0RXhjbHVkZXMoKSB7Ci0gICAgICAgIHJldHVybiBza2lwRGVmYXVsdEV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKiBTZXRzLCB3aGV0aGVyIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkLiBEZWZhdWx0cyB0byB0cnVlLiAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXBEZWZhdWx0RXhjbHVkZXMoYm9vbGVhbiBza2lwRGVmYXVsdEV4Y2x1ZGVzKSB7Ci0gICAgICAgIHRoaXMuc2tpcERlZmF1bHRFeGNsdWRlcyA9IHNraXBEZWZhdWx0RXhjbHVkZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyN2I1OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNvbXBvbmVudC1zZXQ+Ci0gIDxjb21wb25lbnRzPgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuQXJ0aWZhY3RIYW5kbGVyPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5hYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4dGVuc2lvbj5hYXI8L2V4dGVuc2lvbj4KLSAgICAgICAgPHR5cGU+YWFyPC90eXBlPgotICAgICAgICA8bGFuZ3VhZ2U+amF2YTwvbGFuZ3VhZ2U+Ci0gICAgICAgIDxhZGRlZFRvQ2xhc3NwYXRoPmZhbHNlPC9hZGRlZFRvQ2xhc3NwYXRoPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkxpZmVjeWNsZU1hcHBpbmc8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmFhcjwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4ubGlmZWN5Y2xlLm1hcHBpbmcuRGVmYXVsdExpZmVjeWNsZU1hcHBpbmc8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxsaWZlY3ljbGVzPgotICAgICAgICAgIDxsaWZlY3ljbGU+Ci0gICAgICAgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2VzPgotICAgICAgICAgICAgICA8cHJvY2Vzcy1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46cmVzb3VyY2VzPC9wcm9jZXNzLXJlc291cmNlcz4KLSAgICAgICAgICAgICAgPGNvbXBpbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWNvbXBpbGVyLXBsdWdpbjpjb21waWxlPC9jb21waWxlPgotICAgICAgICAgICAgICA8cHJvY2Vzcy10ZXN0LXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjp0ZXN0UmVzb3VyY2VzPC9wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPgotICAgICAgICAgICAgICA8dGVzdC1jb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46dGVzdENvbXBpbGU8L3Rlc3QtY29tcGlsZT4KLSAgICAgICAgICAgICAgPHRlc3Q+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXN1cmVmaXJlLXBsdWdpbjp0ZXN0PC90ZXN0PgotICAgICAgICAgICAgICA8cGFja2FnZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWFhci1tYXZlbi1wbHVnaW46YWFyPC9wYWNrYWdlPgotICAgICAgICAgICAgICA8aW5zdGFsbD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4taW5zdGFsbC1wbHVnaW46aW5zdGFsbDwvaW5zdGFsbD4KLSAgICAgICAgICAgICAgPGRlcGxveT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZGVwbG95LXBsdWdpbjpkZXBsb3k8L2RlcGxveT4KLSAgICAgICAgICAgIDwvcGhhc2VzPgotICAgICAgICAgIDwvbGlmZWN5Y2xlPgotICAgICAgICA8L2xpZmVjeWNsZXM+Ci0gICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgPC9jb21wb25lbnQ+Ci0gIDwvY29tcG9uZW50cz4KLTwvY29tcG9uZW50LXNldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWVhYWU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotQ29uZmlndXJhdGlvbgotCi0gIEFsbCBBYXIgcGx1Z2luIGdvYWxzIHRha2VzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFzIGlucHV0OgotCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBQYXJhbWV0ZXIgbmFtZSAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGFhckRpcmVjdG9yeSAgICAgfCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hYXIgICB8IERpcmVjdG9yeSB3aGVyZSB0aGUgYWFyIGZpbGUgaXMgYnVpbHQuICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgY2xhc3Nlc0RpcmVjdG9yeSB8ICR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9IHwgRGlyZWN0b3J5IHdpdGggY29tcGlsZWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLiB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBmaWxlU2V0cyAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRpdGlvbmFsIGZpbGUgc2V0cywgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHRvIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGFyY2hpdmUuIFNlZSAiRmlsZSBTZXRzIiBiZWxvdyBmb3IgYW4gICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4YW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgc2VydmljZXNYbWxGaWxlICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG9jYXRpb24gb2YgdGhlIHNlcnZpY2VzLnhtbCBmaWxlLiBCeSBkZWZhdWx0LCB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbiBjbGFzc2VzRGlyZWN0b3J5L01FVEEtSU5GIGFuZCBubyBzcGVjaWFsICAgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCB3c2RsRmlsZSAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMb2NhdGlvbiBvZiB0aGUgV1NETCBmaWxlLiBCeSBkZWZhdWx0LCBpdCBpcyAgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGlzIGFscmVhZHkgcHJlc2VudCBpbiAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZXNEaXJlY3RvcnkvTUVUQS1JTkYgYW5kIG5vIHNwZWNpYWwgICAgICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHdzZGxGaWxlTmFtZSAgICAgfCBzZXJ2aWNlLndzZGwgICAgICAgICAgICAgICAgICAgICB8IE5hbWUsIHRvIHdoaWNoIHRoZSBXU0RMIGZpbGUgc2hvdWxkIGJlIG1hcHBlZC4gfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLQotCi1UaGUgYWFyIGdvYWwKLQotICBUaGUgYWFyIGdvYWwgYWxsb3dzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzOgotCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBQYXJhbWV0ZXIgbmFtZSAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG91dHB1dERpcmVjdG9yeSAgfCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSB8IERpcmVjdG9yeSB3aGVyZSB0byBnZW5lcmF0ZSB0aGUgQUFSIGZpbGUuICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgYWFyTmFtZSAgICAgICAgICB8ICR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IHwgVGhlIGdlbmVyYXRlZCBBQVIgZmlsZXMgbmFtZS4gICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBhcmNoaXZlICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBIE1hdmVuIGFyY2hpdmUgY29uZmlndXJhdGlvbi4gVGhpcyBhbGxvd3MsICAgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIGV4YW1wbGUsIHRvIGNvbmZpZ3VyZSB0aGUgTUFOSUZFU1QuTUYgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgY2xhc3NpZmllciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSBjbGFzc2lmaWVyLCB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlZCBBQVIgZmlsZXMgbmFtZS4gU2V0dGluZyB0aGlzICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXIgaGFzIHRoZSBzaWRlIGVmZmVjdCwgdGhhdCB0aGUgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJ0aWZhY3QgaXMgdHJlYXRlZCBhcyBhbiBhdHRhY2htZW50IGFuZCBub3QgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzIHRoZSBwcm9qZWN0cyBwcmltYXJ5IGFydGlmYWN0LiAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgcHJpbWFyeUFydGlmYWN0ICB8IHRydWUgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIGRpc2FibGVzICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluc3RhbGxhdGlvbiBvciBkZXBsb3ltZW50IG9mIHRoZSBhcnRpZmFjdCBhcyAgfAotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgcHJvamVjdHMgcHJpbWFyeSBhcnRpZmFjdC4gICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0KLQotRmlsZSBTZXRzCi0KLSAgQWRkaXRpb25hbCBmaWxlIHNldHMgbWF5IGJlIGNvbmZpZ3VyZWQgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBBQVIgZmlsZS4gQSBmaWxlIHNldCBsb29rcwotICBhcyBmb2xsb3dzOgotCi0tLS0tLS0tLS0tLS0tLS0tLQotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9hYXIvZmlsZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+TUVUQS1JTkYvZG9jczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qKi8qLmh0bWw8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL2Fhci9maWxlczwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5NRVRBLUlORi9ldGM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+KiovKi5odG1sPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFRoZSBleGFtcGxlIHNwZWNpZmllcywgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBzcmMvYWFyL2ZpbGVzIHNoYWxsCi0gIGJlIGFkZGVkIHRvIHRoZSBBQVIgZmlsZS4gSFRNTCBmaWxlcyB3aWxsIGdvIGludG8gTUVUQS1JTkYvZG9jcywgYWxsIG90aGVyCi0gIGZpbGVzIHRvIE1FVEEtSU5GL2V0Yy4KLQotICBBIGZpbGUgc2V0IGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKLQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBQYXJhbWV0ZXIgbmFtZSAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBkaXJlY3RvcnkgICAgICAgICAgIHwgVGhlIGRpcmVjdG9yeSwgZnJvbSB3aGljaCB0byByZWFkIHRoZSBmaWxlIHNldC4gVGhpcyBwYXJhbWV0ZXIgaXMgfAotfCAgICAgICAgICAgICAgICAgICAgIHwgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBvdXRwdXREaXJlY3RvcnkgICAgIHwgVGhlIHRhcmdldCBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBQVIgZmlsZS4gRGVmYXVsdHMgdG8gdGhlIEFBUiAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHwgZmlsZXMgcm9vdCBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBpbmNsdWRlcyAgICAgICAgICAgIHwgQ29uZmlndXJlcyB0aGUgc2V0IG9mIGZpbGVzLCB3aGljaCBzaGFsbCBiZSBpbmNsdWRlZCBpbnRvIHRoZSBBQVIgfAotfCAgICAgICAgICAgICAgICAgICAgIHwgZmlsZS4gRGVmYXVsdHMgdG8gKiovKi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBleGNsdWRlcyAgICAgICAgICAgIHwgQ29uZmlndXJlcyBhIHNldCBvZiBmaWxlcywgd2hpY2ggc2hhbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZmlsZSAgfAotfCAgICAgICAgICAgICAgICAgICAgIHwgc2V0LiBEZWZhdWx0cyB0byB0aGUgTWF2ZW4gZGVmYXVsdCBleGNsdWRlcyAoKiovKn4sICoqL2N2cy8qKi8qLCAgfAotfCAgICAgICAgICAgICAgICAgICAgIHwgKiovLnN2bi8qKi8qLCBldGMuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBza2lwRGVmYXVsdEV4Y2x1ZGVzIHwgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIHRoZW4gbm8gZGVmYXVsdCBleGNsdWRlcyBhcmUgICAgfAotfCAgICAgICAgICAgICAgICAgICAgIHwgYmVpbmcgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjZjMwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSAtLS0tLS0KLSBNYXZlbiAyIEFhciBQbHVnaW46IGNvbmZpZ3VyYXRpb24gZXhhbXBsZXMKLSAtLS0tLS0KLSBKb2NoZW4gV2llZG1hbm4gCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+Ci0gLS0tLS0tCi0KLUdvYWxzCi0KLSAgVGhlIEFhciBwbHVnaW4gYWxsb3dzIHRoZSBwYWNrYWdpbmcgb2YgYW4gQXhpcyAyIHNlcnZpY2UgYWFyIGluIDMgZGlmZmVyZW50IG1vZGVzOgotCi0gICAqIGFhciAoZGVmYXVsdCk6IGdlbmVyYXRlcyB0aGUgYWFyIGFydGlmYWN0Ci0KLSAgICogaW5wbGFjZTogcGFja2FnZSB0aGUgYWFyIGluIHRoZSBzb3VyY2UgdHJlZQotCi0gICAqIGV4cGxvZGVkIDogcGFja2FnZSBhbiBleHBsb2RlZCBhYXIgYXBwbGljYXRpb24KLQotICBFYWNoIG1vZGUgaXMgbWF0ZXJpYWxpemVkIGJ5IGEgZ29hbC4gRm9yIGluc3RhbmNlLCB0byBnZW5lcmF0ZSBhbiBleHBsb2RlZAotICBhYXIgZnJvbSB0aGUgY3VycmVudCBwcm9qZWN0LCBvbmUgd291bGQgdHlwZQotCi0rLS0tLS0tLS0KLSAgbXZuIGFhcjpleHBsb2RlZAotKy0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU3ZGI1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAtLS0tLS0KLSBNYXZlbiAyIEFhciBQbHVnaW4KLSAtLS0tLS0KLSBKb2NoZW4gV2llZG1hbm4KLSA8am9jaGVuLndpZWRtYW5uQGdtYWlsLmNvbT4KLSAtLS0tLS0KLQotSW50cm9kdWN0aW9uCi0KLSAgVGhpcyBwbHVnaW4gZ2VuZXJhdGVzIGFuIEF4aXMgMiBzZXJ2aWNlIGZpbGUgKEFBUiBmaWxlKS4KLQotICBUaGUgZnVsbCBkZXNjcmlwdGlvbiBvZiBnb2FscyBpcyBhdmFpbGFibGUge3t7aG93dG8uaHRtbH1oZXJlfX0uCi0KLQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTU5ZTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9Ik1hdmVuIEF4aXMgMiBBQVIgUGx1Z2luIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+TWF2ZW4gQXhpcyAyIEFBUiBQbHVnaW48L25hbWU+Ci0gICAgPHNyYz5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvYXBhY2hlLW1hdmVuLXByb2plY3QucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0gIDxiYW5uZXJSaWdodD4KLSAgICA8c3JjPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2ltYWdlcy9tYXZlbi1zbWFsbC5naWY8L3NyYz4KLSAgPC9iYW5uZXJSaWdodD4KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJXZWJzZXJ2aWNlcyIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBeGlzIDIiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTWF2ZW4gMiIgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4yLyIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJIb3cgdG8gVXNlIiBocmVmPSJob3d0by5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJDb25maWd1cmF0aW9uIiBocmVmPSJjb25maWd1cmF0aW9uLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gICAgJHtyZXBvcnRzfQotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTMyN2RlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1hbnQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIHRvb2wgLSBBbnQgUGx1Z2luPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5UaGUgQXhpcyAyIFBsdWdpbiBmb3IgQW50IFRhc2tzLjwvZGVzY3JpcHRpb24+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW48L3VybD4KLSAgICA8L3NjbT4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD53c2RsNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53c2RsNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWh0dHBjbGllbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm5lZXRoaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm5lZXRoaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud3MuY29tbW9ucy5zY2hlbWE8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5YbWxTY2hlbWE8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmdlcm9uaW1vLnNwZWNzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvYW50L0FudENvZGVnZW5UYXNrLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvYW50L0FudENvZGVnZW5UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMzQxN2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2FudC9BbnRDb2RlZ2VuVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmFudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLnV0aWwuQ29uZmlnUHJvcGVydHlGaWxlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRDb2RlZ2VuVGFzayBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVOYW1lID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXQgPSAiLiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGFuZ3VhZ2UgPSBDb25maWdQcm9wZXJ0eUZpbGVMb2FkZXIuZ2V0RGVmYXVsdExhbmd1YWdlKCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWUgPSBVUkxQcm9jZXNzb3IuREVGQVVMVF9QQUNLQUdFOwotICAgIHByaXZhdGUgU3RyaW5nIGRhdGFiaW5kaW5nTmFtZSA9IENvbmZpZ1Byb3BlcnR5RmlsZUxvYWRlci5nZXREZWZhdWx0REJGcmFtZXdvcmtOYW1lKCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydE5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhc3luY09ubHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3luY09ubHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VydmVyU2lkZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0Y2FzZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVNlcnZpY2VYbWwgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGxDbGFzc2VzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVucGFja0NsYXNzZXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VydmVyU2lkZUludGVyZmFjZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFsbFBvcnRzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGJhY2t3YXJkQ29tcGF0aWJsZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGF0dGVuRmlsZXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcE1lc3NhZ2VSZWNlaXZlciA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwQnVpbGRYTUwgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcFdTREwgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcldyaXRlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzUHJlZml4ZXMgPSBmYWxzZTsKLSAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVwb3NpdG9yeVBhdGggPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGV4dGVybmFsTWFwcGluZyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbFZlcnNpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHVud3JhcCA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlVG9QYWNrYWdlcyA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOwotCi0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgQW50Q29kZWdlblRhc2soKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjbGFzc3BhdGguCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgUGF0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7Ci0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHJlZmVyZW5jZSB0byBhbiBvcHRpb25hbCBjbGFzc3BhdGgKLSAgICAgKgotICAgICAqIEBwYXJhbSByIHRoZSBpZCBvZiB0aGUgQW50IHBhdGggaW5zdGFuY2UgdG8gYWN0IGFzIHRoZSBjbGFzc3BhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsKLSAgICAgICAgY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UmVmaWQocik7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gc2VydmVyU2lkZUludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHNlcnZlclNpZGVJbnRlcmZhY2UgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZUludGVyZmFjZShib29sZWFuIHNlcnZlclNpZGVJbnRlcmZhY2UpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlSW50ZXJmYWNlID0gc2VydmVyU2lkZUludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKiogRmlsbHMgdGhlIG9wdGlvbiBtYXAuIFRoaXMgbWFwIGlzIHBhc3NlZCBvbnRvIHRoZSBjb2RlIGdlbmVyYXRpb24gQVBJIHRvIGdlbmVyYXRlIHRoZSBjb2RlLiAqLwotICAgIHByaXZhdGUgTWFwIGZpbGxPcHRpb25NYXAoKSB7Ci0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy9XU0RMIGZpbGUgbmFtZQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KHdzZGxGaWxlTmFtZSkpKTsKLQotICAgICAgICAvL1dTREwgdmVyc2lvbgotICAgICAgICBpZiAod3NkbFZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheSh3c2RsVmVyc2lvbikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJlcG9zaXRvcnkgcGF0aAotICAgICAgICBpZiAocmVwb3NpdG9yeVBhdGggIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUkVQT1NJVE9SWV9QQVRIX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheShyZXBvc2l0b3J5UGF0aCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGV4dGVybmFsIG1hcHBpbmcKLSAgICAgICAgaWYgKGV4dGVybmFsTWFwcGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhURVJOQUxfTUFQUElOR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhURVJOQUxfTUFQUElOR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkoZXh0ZXJuYWxNYXBwaW5nKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGFyZ2V0IHNvdXJjZSBmb2xkZXIgbG9jYXRpb24KLSAgICAgICAgaWYgKHRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNPVVJDRV9GT0xERVJfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkodGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb24pKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0YXJnZXQgc291cmNlIGZvbGRlciBsb2NhdGlvbgotICAgICAgICBpZiAodGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheSh0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRhcmdldCBzb3VyY2UgZm9sZGVyIGxvY2F0aW9uCi0gICAgICAgIGlmICh1bndyYXApIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSUywKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL291dHB1dCBsb2NhdGlvbgotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkob3V0cHV0KSkpOwotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy8gRGF0YWJpbmRpbmcgdHlwZQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KGRhdGFiaW5kaW5nTmFtZSkpKTsKLQotICAgICAgICAvLyBBc3luYyBvbmx5IG9wdGlvbiAtIGZvcmNpbmcgdG8gZ2VuZXJhdGUgYXN5bmMgbWV0aG9kcyBvbmx5Ci0gICAgICAgIGlmIChhc3luY09ubHkpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN5bmMgb25seSBvcHRpb24gLSBmb3JjaW5nIHRvIGdlbmVyYXRlIFN5bmMgbWV0aG9kcyBvbmx5Ci0gICAgICAgIGlmIChzeW5jT25seSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9QYWNrYWdlCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KHBhY2thZ2VOYW1lKSkpOwotCi0gICAgICAgIC8vc3R1YiBsYW5ndWFnZQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheShsYW5ndWFnZSkpKTsKLQotICAgICAgICAvL3NlcnZlciBzaWRlIGFuZCBnZW5lcmF0ZSBzZXJ2aWNlcy54bWwgb3B0aW9ucwotICAgICAgICBpZiAoc2VydmVyU2lkZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLQotICAgICAgICAgICAgLy9zZXJ2aWNlcyBYTUwgZ2VuZXJhdGlvbiAtIGVmZmVjdGl2ZSBvbmx5IHdoZW4gc3BlY2lmaWVkIGFzIHRoZSBzZXJ2ZXIgc2lkZQotICAgICAgICAgICAgaWYgKGdlbmVyYXRlU2VydmljZVhtbCkgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vZ2VuZXJhdGUgYWxsIG9wdGlvbiAtIE9ubHkgdmFsaWQgd2hlbiBnZW5lcmF0aW5nIHNlcnZlcnNpZGUgY29kZQotICAgICAgICAgICAgaWYgKGdlbmVyYXRlQWxsQ2xhc3NlcykgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy9nZW5lcmF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICAgIGlmICh0ZXN0Y2FzZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1Vud3JhcCBjbGFzc2VzIG9wdGlvbiAtIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyBhcmUgaW5zaWRlIHRoZSBzdHViL01SCi0gICAgICAgIC8vb3IgZ2V0cyBnZW5lcmF0ZXMgYXMgc2VwZXJhdGUgY2xhc3NlcwotICAgICAgICBpZiAodW5wYWNrQ2xhc3NlcykgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlVOUEFDS19DTEFTU0VTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZXJ2ZXIgc2lkZSBpbnRlcmZhY2Ugb3B0aW9uCi0gICAgICAgIGlmIChzZXJ2ZXJTaWRlSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhbGxQb3J0cykgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQWxsX1BPUlRTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYmFja3dhcmRDb21wYXRpYmxlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQkFDS1dPUkRfQ09NUEFUSUJJTElUWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZsYXR0ZW5GaWxlcykgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChza2lwTWVzc2FnZVJlY2VpdmVyKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19NRVNTQUdFX1JFQ0VJVkVSX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChza2lwQnVpbGRYTUwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19CVUlMRF9YTUxfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fQlVJTERfWE1MX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChza2lwV1NETCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX1dTRExTX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX1dTRExTX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvdmVyV3JpdGUpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVkVSUklERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdXBwcmVzc1ByZWZpeGVzKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1VQUFJFU1NfUFJFRklYRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHByb3BzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGtleSA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5FWFRSQV9PUFRJT05UWVBFX1BSRUZJWCArIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAga2V5LAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpfSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlcnZpY2VOYW1lIH0pKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgcG9ydE5hbWUgfSkpOwotICAgICAgICAvLyBzZXQgdGhlIG5hbWVzcGFjZXMKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTkFNRV9TUEFDRV9UT19QQUNLQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IG5hbWVzcGFjZVRvUGFja2FnZXMgfSkpOwotCi0gICAgICAgIHJldHVybiBvcHRpb25NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgc2luZ2xlIGl0ZW0gc3RyaW5nW10KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICB2YWx1ZXNbMF0gPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGlzIG5lZWRzIHRoZSBDbGFzc0xvYWRlciB3ZSB1c2UgdG8gbG9hZCB0aGUgdGFzawotICAgICAgICAgICAgICogaGF2ZSBhbGwgdGhlIGRlcGVuZGFuY2llcyBzZXQsIGhvcGUgdGhhdAotICAgICAgICAgICAgICogaXMgb2sgZm9yIG5vdwotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGNsID0gbmV3IEFudENsYXNzTG9hZGVyKAotICAgICAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoID09IG51bGwgPyBjcmVhdGVDbGFzc3BhdGgoKSA6IGNsYXNzcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7Ci0KLSAgICAgICAgICAgIE1hcCBjb21tYW5kTGluZU9wdGlvbnMgPSB0aGlzLmZpbGxPcHRpb25NYXAoKTsKLSAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvblBhcnNlcihjb21tYW5kTGluZU9wdGlvbnMpOwotICAgICAgICAgICAgbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKHBhcnNlcikuZ2VuZXJhdGUoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQWxsQ2xhc3Nlcyhib29sZWFuIGdlbmVyYXRlQWxsQ2xhc3NlcykgewotICAgICAgICB0aGlzLmdlbmVyYXRlQWxsQ2xhc3NlcyA9IGdlbmVyYXRlQWxsQ2xhc3NlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVbnBhY2tDbGFzc2VzKGJvb2xlYW4gdW5wYWNrQ2xhc3NlcykgewotICAgICAgICB0aGlzLnVucGFja0NsYXNzZXMgPSB1bnBhY2tDbGFzc2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxGaWxlTmFtZShTdHJpbmcgd3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gd3NkbEZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBc3luY09ubHkoYm9vbGVhbiBhc3luY09ubHkpIHsKLSAgICAgICAgdGhpcy5hc3luY09ubHkgPSBhc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3luY09ubHkoYm9vbGVhbiBzeW5jT25seSkgewotICAgICAgICB0aGlzLnN5bmNPbmx5ID0gc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZShib29sZWFuIHNlcnZlclNpZGUpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0Y2FzZShib29sZWFuIHRlc3RjYXNlKSB7Ci0gICAgICAgIHRoaXMudGVzdGNhc2UgPSB0ZXN0Y2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZpY2VYbWwoYm9vbGVhbiBnZW5lcmF0ZVNlcnZpY2VYbWwpIHsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZVNlcnZpY2VYbWwgPSBnZW5lcmF0ZVNlcnZpY2VYbWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeVBhdGgoU3RyaW5nIHJlcG9zaXRvcnlQYXRoKSB7Ci0gICAgICAgIHRoaXMucmVwb3NpdG9yeVBhdGggPSByZXBvc2l0b3J5UGF0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbE1hcHBpbmcoU3RyaW5nIGV4dGVybmFsTWFwcGluZykgewotICAgICAgICB0aGlzLmV4dGVybmFsTWFwcGluZyA9IGV4dGVybmFsTWFwcGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsVmVyc2lvbihTdHJpbmcgd3NkbFZlcnNpb24pIHsKLSAgICAgICAgdGhpcy53c2RsVmVyc2lvbiA9IHdzZGxWZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uKFN0cmluZyB0YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbikgewotICAgICAgICB0aGlzLnRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uID0gdGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb24oU3RyaW5nIHRhcmdldFJlc291cmNlc0ZvbGRlckxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMudGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb24gPSB0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVbndyYXAoYm9vbGVhbiB1bndyYXApIHsKLSAgICAgICAgdGhpcy51bndyYXAgPSB1bndyYXA7Ci0gICAgfQotCi0gICAgLyoqIEByZXR1cm4gUmV0dXJucyBQYXRoLiAqLwotICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKLSAgICB9Ci0KLSAgICAvKiogQHBhcmFtIHBhdGggICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKFBhdGggcGF0aCkgewotICAgICAgICBjbGFzc3BhdGggPSBwYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJpbmRpbmdOYW1lKCkgewotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERhdGFiaW5kaW5nTmFtZShTdHJpbmcgZGF0YWJpbmRpbmdOYW1lKSB7Ci0gICAgICAgIHRoaXMuZGF0YWJpbmRpbmdOYW1lID0gZGF0YWJpbmRpbmdOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVG9QYWNrYWdlcygpIHsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVRvUGFja2FnZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVG9QYWNrYWdlcyhTdHJpbmcgbmFtZXNwYWNlVG9QYWNrYWdlcykgewotICAgICAgICB0aGlzLm5hbWVzcGFjZVRvUGFja2FnZXMgPSBuYW1lc3BhY2VUb1BhY2thZ2VzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRQYXJhbWV0ZXIoUGFyYW1ldGVyIHByb3ApIHsKLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkocHJvcC5nZXROYW1lKCksIHByb3AuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3VwcHJlc3NQcmVmaXhlcyhib29sZWFuIHN1cHByZXNzUHJlZml4ZXMpIHsKLSAgICAgICAgdGhpcy5zdXBwcmVzc1ByZWZpeGVzID0gc3VwcHJlc3NQcmVmaXhlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyV3JpdGUoYm9vbGVhbiBvdmVyV3JpdGUpIHsKLSAgICAgICAgdGhpcy5vdmVyV3JpdGUgPSBvdmVyV3JpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcFdTREwoYm9vbGVhbiBza2lwV1NETCkgewotICAgICAgICB0aGlzLnNraXBXU0RMID0gc2tpcFdTREw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcEJ1aWxkWE1MKGJvb2xlYW4gc2tpcEJ1aWxkWE1MKSB7Ci0gICAgICAgIHRoaXMuc2tpcEJ1aWxkWE1MID0gc2tpcEJ1aWxkWE1MOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNraXBNZXNzYWdlUmVjZWl2ZXIoYm9vbGVhbiBza2lwTWVzc2FnZVJlY2VpdmVyKSB7Ci0gICAgICAgIHRoaXMuc2tpcE1lc3NhZ2VSZWNlaXZlciA9IHNraXBNZXNzYWdlUmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmxhdHRlbkZpbGVzKGJvb2xlYW4gZmxhdHRlbkZpbGVzKSB7Ci0gICAgICAgIHRoaXMuZmxhdHRlbkZpbGVzID0gZmxhdHRlbkZpbGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhY2t3YXJkQ29tcGF0aWJsZShib29sZWFuIGJhY2t3YXJkQ29tcGF0aWJsZSkgewotICAgICAgICB0aGlzLmJhY2t3YXJkQ29tcGF0aWJsZSA9IGJhY2t3YXJkQ29tcGF0aWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxQb3J0cyhib29sZWFuIGFsbFBvcnRzKSB7Ci0gICAgICAgIHRoaXMuYWxsUG9ydHMgPSBhbGxQb3J0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvYW50L0phdmEyV1NETFRhc2suamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9hbnQvSmF2YTJXU0RMVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQwMTdiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9hbnQvSmF2YTJXU0RMVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5hbnQ7DQotDQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7DQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOw0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOw0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLkphdmEyV1NETENvZGVnZW5FbmdpbmU7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLk1hcHBpbmdTZXQ7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLk5hbWVzcGFjZU1hcHBpbmc7DQotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLXB1YmxpYyBjbGFzcyBKYXZhMldTRExUYXNrIGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIEphdmEyV1NETENvbnN0YW50cyB7DQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQlJBQ0tFVCA9ICJbIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQlJBQ0tFVCA9ICJdIjsNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUEgPSAiLCI7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZSA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dExvY2F0aW9uID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gbnVsbDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlTmFtZSA9IG51bGw7DQotICAgIHByaXZhdGUgUGF0aCBjbGFzc3BhdGggPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBzdHlsZSA9IEphdmEyV1NETENvbnN0YW50cy5ET0NVTUVOVDsNCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXNlID0gSmF2YTJXU0RMQ29uc3RhbnRzLkxJVEVSQUw7DQotICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVXJpOw0KLSAgICBwcml2YXRlIFN0cmluZyBhdHRyRm9ybURlZmF1bHQgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQgPSBudWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsVmVyc2lvbiA9IG51bGw7DQotICAgIHByaXZhdGUgU3RyaW5nIGRvY0xpdEJhcmUgPSBudWxsOw0KLQ0KLSAgICAvL25hbWVzIG9mIGphdmEgdHlwZXMgbm90IHVzZWQgaW4gdGhlIHNlcnZpY2UgZGVmbi4gZGlyZWN0bHksIGJ1dCBmb3Igd2hpY2ggc2NoZW1hIG11c3QgYmUgZ2VuZXJhdGVkDQotICAgIHByaXZhdGUgU3RyaW5nW10gZXh0cmFDbGFzc2VzOw0KLQ0KLSAgICAvL25hbWVzcGFjZSBnZW5lcmF0b3IgY2xhc3NuYW1lDQotICAgIHByaXZhdGUgU3RyaW5nIG5zR2VuQ2xhc3NOYW1lID0gbnVsbDsNCi0NCi0gICAgLy9wYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXANCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG5hbWVzcGFjZU1hcCA9IG5ldyBIYXNoTWFwKCk7DQotDQotICAgIC8vbmFtZXMgb2YgamF2YSB0eXBlcyBub3QgdXNlZCBpbiB0aGUgc2VydmljZSBkZWZuLiBkaXJlY3RseSwgYnV0IGZvciB3aGljaCBzY2hlbWEgbXVzdCBiZSBnZW5lcmF0ZWQNCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgcGtnMm5zTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotICAgIHByaXZhdGUgTWFwcGluZ1NldCBtYXBwaW5ncyA9IG5ldyBNYXBwaW5nU2V0KCk7DQotICAgIA0KLSAgICBwcml2YXRlIFN0cmluZyBzY2hlbWFHZW5DbGFzc05hbWUgPSBudWxsOw0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVXJpKCkgew0KLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uVXJpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uVXJpKFN0cmluZyBsb2NhdGlvblVyaSkgew0KLSAgICAgICAgdGhpcy5sb2NhdGlvblVyaSA9IGxvY2F0aW9uVXJpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKSB7DQotICAgICAgICByZXR1cm4gc3R5bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7DQotICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRVc2UoKSB7DQotICAgICAgICByZXR1cm4gdXNlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgdXNlKSB7DQotICAgICAgICB0aGlzLnVzZSA9IHVzZTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICoNCi0gICAgICovDQotICAgIHB1YmxpYyBKYXZhMldTRExUYXNrKCkgew0KLSAgICAgICAgc3VwZXIoKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogRmlsbHMgdGhlIG9wdGlvbiBtYXAuIFRoaXMgbWFwIGlzIHBhc3NlZCBvbnRvDQotICAgICAqIHRoZSBjb2RlIGdlbmVyYXRpb24gQVBJIHRvIGdlbmVyYXRlIHRoZSBjb2RlLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBNYXAgZmlsbE9wdGlvbk1hcCgpIHsNCi0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOw0KLQ0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBjcml0aWNhbCBvcHRpb25zIGV4aXN0DQotICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsNCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3BlY2lmeSBhIGNsYXNzbmFtZSIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLSAgICAgICAgLy8gQ2xhc3NuYW1lDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DTEFTU05BTUVfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBjbGFzc05hbWUpOw0KLQ0KLSAgICAgICAgLy8gT3V0cHV0IGxvY2F0aW9uDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBvdXRwdXRMb2NhdGlvbik7DQotDQotICAgICAgICAvLyBUYXJnZXQgbmFtZXNwYWNlDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX09QVElPTiwNCi0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlKTsNCi0NCi0gICAgICAgIC8vIFRhcmdldCBuYW1lc3BhY2UgcHJlZml4DQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sDQotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZVByZWZpeCk7DQotDQotICAgICAgICAvLyBTY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBzY2hlbWFUYXJnZXROYW1lc3BhY2UpOw0KLQ0KLSAgICAgICAgLy8gU2NoZW1hIHRhcmdldCBuYW1lc3BhY2UgcHJlZml4DQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgpOw0KLQ0KLSAgICAgICAgLy8gU2VydmljZSBuYW1lDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSk7DQotDQotICAgICAgICAvLyBPdXRwdXQgZmlsZSBuYW1lDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5PVVRQVVRfRklMRU5BTUVfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBvdXRwdXRGaWxlTmFtZSk7DQotDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TVFlMRV9PUFRJT04sDQotICAgICAgICAgICAgICAgIGdldFN0eWxlKCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVVNFX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0VXNlKCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTE9DQVRJT05fT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBnZXRMb2NhdGlvblVyaSgpKTsNCi0NCi0gICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwNCi0gICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFUVFJfRk9STV9ERUZBVUxUX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0QXR0ckZvcm1EZWZhdWx0KCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRUxFTUVOVF9GT1JNX0RFRkFVTFRfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7DQotDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OLA0KLSAgICAgICAgICAgICAgICBnZXRFeHRyYUNsYXNzZXMoKSk7DQotDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5OQU1FU1BBQ0VfR0VORVJBVE9SX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0TnNHZW5DbGFzc05hbWUoKSk7DQotDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfR0VORVJBVE9SX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0U2NoZW1hR2VuQ2xhc3NOYW1lKCkpOw0KLQ0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLA0KLSAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0V1NETFZlcnNpb24oKSk7DQotDQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5ET0NfTElUX0JBUkUsDQotICAgICAgICAgICAgICAgIGdldERvY0xpdEJhcmUoKSk7DQotDQotICAgICAgICBsb2FkUGtnMk5zTWFwKCk7DQotICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsDQotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5KQVZBX1BLR18yX05TTUFQX09QVElPTiwNCi0gICAgICAgICAgICAgICAgZ2V0UGtnMm5zTWFwcGluZ3MoKSk7DQotDQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gYSBzaW5nbGUgaXRlbSBzdHJpbmdbXQ0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gdmFsdWUNCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZ1tdLg0KLSAgICAgKi8NCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdHJpbmdBcnJheShTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbMV07DQotICAgICAgICB2YWx1ZXNbMF0gPSB2YWx1ZTsNCi0gICAgICAgIHJldHVybiB2YWx1ZXM7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIEZ1bmN0aW9uIHRvIHB1dCBhcmd1bWVudHMgaW4gdGhlIG9wdGlvbiBtYXAuDQotICAgICAqIFRoaXMgZnVuY3Rpb25zIHNraXBzIGFkZGluZyBvZiBvcHRpb25zIHRoYXQgaGF2ZSBhIG51bGwgdmFsdWUuDQotICAgICAqDQotICAgICAqIEBwYXJhbSBtYXAgICAgVGhlIG9wdGlvbiBtYXAgaW50byB3aGljaCB0aGUgb3B0aW9uIGlzIHRvIGJlIGFkZGVkDQotICAgICAqIEBwYXJhbSBvcHRpb24gVGhlIG9wdGlvbiBuYW1lDQotICAgICAqIEBwYXJhbSB2YWx1ZSAgVGhlIHZhbHVlIG9mIHRoZSBvcHRpb24NCi0gICAgICovDQotICAgIHByaXZhdGUgdm9pZCBhZGRUb09wdGlvbk1hcChNYXAgbWFwLCBTdHJpbmcgb3B0aW9uLCBTdHJpbmcgdmFsdWUpIHsNCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgbWFwLnB1dChvcHRpb24sDQotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24ob3B0aW9uLCBnZXRTdHJpbmdBcnJheSh2YWx1ZSkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIHZvaWQgYWRkVG9PcHRpb25NYXAoTWFwIG1hcCwgU3RyaW5nIG9wdGlvbiwgU3RyaW5nW10gdmFsdWVzKSB7DQotICAgICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHsNCi0gICAgICAgICAgICBtYXAucHV0KG9wdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihvcHRpb24sIHZhbHVlcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgdm9pZCBhZGRUb09wdGlvbk1hcChNYXAgbWFwLCBTdHJpbmcgb3B0aW9uLCBBcnJheUxpc3QgdmFsdWVzKSB7DQotICAgICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICBtYXAucHV0KG9wdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihvcHRpb24sIHZhbHVlcykpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gew0KLSAgICAgICAgdHJ5IHsNCi0NCi0gICAgICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gdGhpcy5maWxsT3B0aW9uTWFwKCk7DQotICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY29uZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOw0KLSAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGNsID0gbmV3IEFudENsYXNzTG9hZGVyKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwNCi0gICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwNCi0gICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCA9PSBudWxsID8gY3JlYXRlQ2xhc3NwYXRoKCkgOiBjbGFzc3BhdGgsDQotICAgICAgICAgICAgICAgICAgICBmYWxzZSk7DQotDQotICAgICAgICAgICAgY29tbWFuZExpbmVPcHRpb25zLnB1dChKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTiwgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cy5DTEFTU1BBVEhfT1BUSU9OLCBjbGFzc3BhdGgubGlzdCgpKSk7DQotDQotICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2wpOw0KLQ0KLSAgICAgICAgICAgIGlmIChvdXRwdXRMb2NhdGlvbiAhPSBudWxsKSBjbC5hZGRQYXRoRWxlbWVudChvdXRwdXRMb2NhdGlvbik7DQotDQotICAgICAgICAgICAgbmV3IEphdmEyV1NETENvZGVnZW5FbmdpbmUoY29tbWFuZExpbmVPcHRpb25zKS5nZW5lcmF0ZSgpOw0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNvbmV4dENsYXNzTG9hZGVyKTsNCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7DQotICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRMb2NhdGlvbihTdHJpbmcgb3V0cHV0TG9jYXRpb24pIHsNCi0gICAgICAgIHRoaXMub3V0cHV0TG9jYXRpb24gPSBvdXRwdXRMb2NhdGlvbjsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgew0KLSAgICAgICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlUHJlZml4KFN0cmluZyB0YXJnZXROYW1lc3BhY2VQcmVmaXgpIHsNCi0gICAgICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gdGFyZ2V0TmFtZXNwYWNlUHJlZml4Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYVRhcmdldE5hbWVzcGFjZShTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlKSB7DQotICAgICAgICB0aGlzLnNjaGVtYVRhcmdldE5hbWVzcGFjZSA9IHNjaGVtYVRhcmdldE5hbWVzcGFjZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgoU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCkgew0KLSAgICAgICAgdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXggPSBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXg7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7DQotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RmlsZU5hbWUoU3RyaW5nIG91dHB1dEZpbGVOYW1lKSB7DQotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lID0gb3V0cHV0RmlsZU5hbWU7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCB0aGUgb3B0aW9uYWwgY2xhc3NwYXRoDQotICAgICAqDQotICAgICAqIEBwYXJhbSBjbGFzc3BhdGggdGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nIGNsYXNzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoUGF0aCBjbGFzc3BhdGgpIHsNCi0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLmFwcGVuZChjbGFzc3BhdGgpOw0KLSAgICB9DQotDQotICAgIC8qKg0KLSAgICAgKiBTZXQgdGhlIG9wdGlvbmFsIGNsYXNzcGF0aA0KLSAgICAgKg0KLSAgICAgKiBAcmV0dXJuIGEgcGF0aCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkIGJ5IHRoZSBBbnQgY29yZS4NCi0gICAgICovDQotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUNsYXNzcGF0aCgpIHsNCi0gICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7DQotICAgICAgICAgICAgY2xhc3NwYXRoID0gY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNsYXNzcGF0aC5jcmVhdGVQYXRoKCk7DQotICAgIH0NCi0NCi0gICAgLyoqDQotICAgICAqIFNldCB0aGUgcmVmZXJlbmNlIHRvIGFuIG9wdGlvbmFsIGNsYXNzcGF0aA0KLSAgICAgKg0KLSAgICAgKiBAcGFyYW0gciB0aGUgaWQgb2YgdGhlIEFudCBwYXRoIGluc3RhbmNlIHRvIGFjdCBhcyB0aGUgY2xhc3NwYXRoDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoUmVmZXJlbmNlIHIpIHsNCi0gICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ckZvcm1EZWZhdWx0KCkgew0KLSAgICAgICAgcmV0dXJuIGF0dHJGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyRm9ybURlZmF1bHQoU3RyaW5nIGF0dHJGb3JtRGVmYXVsdCkgew0KLSAgICAgICAgdGhpcy5hdHRyRm9ybURlZmF1bHQgPSBhdHRyRm9ybURlZmF1bHQ7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7DQotICAgICAgICByZXR1cm4gZWxlbWVudEZvcm1EZWZhdWx0Ow0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRGb3JtRGVmYXVsdChTdHJpbmcgZWxlbWVudEZvcm1EZWZhdWx0KSB7DQotICAgICAgICB0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0cmFDbGFzc2VzKCkgew0KLSAgICAgICAgcmV0dXJuIGV4dHJhQ2xhc3NlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYUNsYXNzZXMoU3RyaW5nW10gZXh0cmFDbGFzc2VzKSB7DQotICAgICAgICB0aGlzLmV4dHJhQ2xhc3NlcyA9IGV4dHJhQ2xhc3NlczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5zR2VuQ2xhc3NOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIG5zR2VuQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHNldE5zR2VuQ2xhc3NOYW1lKFN0cmluZyBuc0dlbkNsYXNzTmFtZSkgew0KLSAgICAgICAgdGhpcy5uc0dlbkNsYXNzTmFtZSA9IG5zR2VuQ2xhc3NOYW1lOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hR2VuQ2xhc3NOYW1lKCkgew0KLSAgICAgICAgcmV0dXJuIHNjaGVtYUdlbkNsYXNzTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFHZW5DbGFzc05hbWUoU3RyaW5nIHNjaGVtYUdlbkNsYXNzTmFtZSkgew0KLSAgICAgICAgdGhpcy5zY2hlbWFHZW5DbGFzc05hbWUgPSBzY2hlbWFHZW5DbGFzc05hbWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgbG9hZFBrZzJOc01hcCgpIHsNCi0gICAgICAgIG1hcHBpbmdzLmV4ZWN1dGUobmFtZXNwYWNlTWFwLCB0cnVlKTsNCi0gICAgICAgIEl0ZXJhdG9yIHBhY2thZ2VOYW1lcyA9IG5hbWVzcGFjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsNCi0gICAgICAgIHdoaWxlIChwYWNrYWdlTmFtZXMuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgcGFja2FnZU5hbWUgPSAoU3RyaW5nKSBwYWNrYWdlTmFtZXMubmV4dCgpOw0KLSAgICAgICAgICAgIHBrZzJuc01hcHBpbmdzLmFkZChPUEVOX0JSQUNLRVQgKw0KLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKw0KLSAgICAgICAgICAgICAgICAgICAgQ09NTUEgKw0KLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFwLmdldChwYWNrYWdlTmFtZSkgKw0KLSAgICAgICAgICAgICAgICAgICAgQ0xPU0VfQlJBQ0tFVCk7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQa2cybnNNYXBwaW5ncygpIHsNCi0gICAgICAgIHJldHVybiBwa2cybnNNYXBwaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRQa2cybnNNYXBwaW5ncyhBcnJheUxpc3QgcGtnMm5zTWFwcGluZ3MpIHsNCi0gICAgICAgIHRoaXMucGtnMm5zTWFwcGluZ3MgPSBwa2cybnNNYXBwaW5nczsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogYWRkIGEgbWFwcGluZyBvZiBuYW1lc3BhY2VzIHRvIHBhY2thZ2VzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKE5hbWVzcGFjZU1hcHBpbmcgbWFwcGluZykgew0KLSAgICAgICAgbWFwcGluZ3MuYWRkTWFwcGluZyhtYXBwaW5nKTsNCi0gICAgfQ0KLQ0KLSAgICAvKioNCi0gICAgICogYWRkIGEgbWFwcGluZyBvZiBuYW1lc3BhY2VzIHRvIHBhY2thZ2VzDQotICAgICAqLw0KLSAgICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nU2V0KE1hcHBpbmdTZXQgbWFwcGluZ3NldCkgew0KLSAgICAgICAgbWFwcGluZ3MuYWRkTWFwcGluZ1NldChtYXBwaW5nc2V0KTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERvY0xpdEJhcmUoKSB7DQotICAgICAgICByZXR1cm4gZG9jTGl0QmFyZTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2NMaXRCYXJlKFN0cmluZyBkb2NMaXRCYXJlKSB7DQotICAgICAgICB0aGlzLmRvY0xpdEJhcmUgPSBkb2NMaXRCYXJlOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFZlcnNpb24oKSB7DQotICAgICAgICByZXR1cm4gd3NkbFZlcnNpb247DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0V1NETFZlcnNpb24oU3RyaW5nIHdzZGxWZXJzaW9uKSB7DQotICAgICAgICB0aGlzLndzZGxWZXJzaW9uID0gd3NkbFZlcnNpb247DQotICAgIH0NCi19DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMVGFzay5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS93cy9qYXZhMndzZGwvSmF2YTJXU0RMVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZkZmQxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvd3MvamF2YTJ3c2RsL0phdmEyV1NETFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS53cy5qYXZhMndzZGw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50LkphdmEyV1NETFRhc2sKLSAqLwotcHVibGljIGNsYXNzIEphdmEyV1NETFRhc2sgZXh0ZW5kcyBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuYW50LkphdmEyV1NETFRhc2sgewotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWFudC1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDgwNGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1hbnQtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0KLSMgU2V0IHJvb3QgY2F0ZWdvcnkgcHJpb3JpdHkgdG8gSU5GTyBhbmQgaXRzIG9ubHkgYXBwZW5kZXIgdG8gQ09OU09MRS4KLWxvZzRqLnJvb3RDYXRlZ29yeT1JTkZPLCBDT05TT0xFCi0jbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUsIExPR0ZJTEUKLQotIyBTZXQgdGhlIGVudGVycHJpc2UgbG9nZ2VyIHByaW9yaXR5IHRvIEZBVEFMCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5heGlzMi5lbnRlcnByaXNlPUZBVEFMCi1sb2c0ai5sb2dnZXIuZGUuaHVuc2lja2VyLmphbG9weS5pbz1GQVRBTAotbG9nNGoubG9nZ2VyLmh0dHBjbGllbnQud2lyZS5oZWFkZXI9RkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudD1GQVRBTAotCi0jIENPTlNPTEUgaXMgc2V0IHRvIGJlIGEgQ29uc29sZUFwcGVuZGVyIHVzaW5nIGEgUGF0dGVybkxheW91dC4KLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEU9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkNPTlNPTEUubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JWQgJS01cCAlYyAtICVtJW4KLQotIyBMT0dGSUxFIGlzIHNldCB0byBiZSBhIEZpbGUgYXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuTE9HRklMRT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5GaWxlPWF4aXMyLmxvZwotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5BcHBlbmQ9dHJ1ZQotbG9nNGouYXBwZW5kZXIuTE9HRklMRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCBbJXRdICUtNXAgJWMgJXggLSAlbSVuCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vYnVpbGQucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzdhYTU2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1zb3VyY2UuLiA9IHNyYy9tYWluL2phdmEvLFwKLSAgICAgICAgICAgdGFyZ2V0L21hdmVuLXNoYXJlZC1hcmNoaXZlLXJlc291cmNlcy8KLW91dHB1dC4uID0gdGFyZ2V0L2NsYXNzZXMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgaGVscF90b2MueG1sCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi1hc3NlbWJseS54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi1hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzQxNTUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2VjbGlwc2UtY29kZWdlbi1wbHVnaW4tYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPmF4aXMyLWVjbGlwc2UtY29kZWdlLXBsdWdpbjwvaWQ+Ci0gICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgICA8Zm9ybWF0cz4KLSAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8L2Zvcm1hdHM+Ci0gICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDwhLS0gV2Ugb25seSB3YW50IHRvIGluY2x1ZGUgdGhlIG1haW4gYXJ0aWZhY3Qgb2YgdGhlIHByb2plY3QgLS0+Ci0gICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4ke3Byb2plY3QuZ3JvdXBJZH06JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cGx1Z2luczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPCEtLSBNYWtlIHN1cmUgdGhhdCB0aGUgbmFtZSBvZiB0aGUgSkFSIGluIHRoZSBkaXN0cmlidXRpb24gcmVzcGVjdHMgdGhlIG5hbWluZwotICAgICAgICAgICAgICAgICBjb252ZW50aW9uIGV4cGVjdGVkIGJ5IEVjbGlwc2UuIFRoZSBidW5kbGUtc3ltYm9saWMtbmFtZSBhbmQKLSAgICAgICAgICAgICAgICAgYnVuZGxlLXZlcnNpb24gdmFyaWFibGVzIGFyZSBjYWxjdWxhdGVkIGJ5IGEgR3Jvb3Z5IHNjcmlwdCBleGVjdXRlZCBmcm9tIHRoZSBQT00uIC0tPgotICAgICAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2J1bmRsZS1zeW1ib2xpYy1uYW1lfV8ke2J1bmRsZS12ZXJzaW9ufS5qYXI8L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2hlbHBfdG9jLnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9oZWxwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZmY4YTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2hlbHBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHRvYyBsYWJlbD0iQXhpczIgQ29kZSBHZW5lcmF0b3IiID4KLSAgPHRvcGljIGxhYmVsPSJDb2RlIEdlbmVyYXRvciIgaHJlZj0iaGVscC93c2RsMmphdmEtcGx1Z2luLmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5naWYgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQxYzMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vaWNvbnMvaWNvbi5naWYgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vaWNvbnMvaWNvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMTVkOGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL2ljb25zL2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3BsdWdpbi54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4ODk2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQXhpczIgV2l6YXJkcyIKLSAgICAgICAgICAgIGlkPSJBeGlzMl9XaXphcmRzIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJBeGlzMiBDb2RlIEdlbmVyYXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2ljb24uZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9IkF4aXMyX1dpemFyZHMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5Db2RlR2VuV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UuQ29kZUdlbldpemFyZCI+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9ImhlbHBfdG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIgLz4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9wb20ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmQ1MWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLmVjbGlwc2UuY29kZWdlbi5wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEVjbGlwc2UgQ29kZWdlbiBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5idW5kbGU8L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBFY2xpcHNlIENvZGVnZW4gUGx1Z2luIGZvciB3c2RsMmphdmEgYW5kIGphdmEyd3NkbDwvZGVzY3JpcHRpb24+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW48L3VybD4KLSAgICA8L3NjbT4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmpvYnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW08L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudXBkYXRlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51cGRhdGUudWk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudXBkYXRlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVwZGF0ZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuaGVscDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuaGVscDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmFudC5jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxleGNsdXNpb25zPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGg8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5lcXVpbm94PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5lcXVpbm94PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmVxdWlub3g8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZmFjZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpmYWNlPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NnaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zZ2k8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zd3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5zd3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zd3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudWk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51aS5pZGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51aTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudWkuZm9ybXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudWk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi14bWxiZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWppYng8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5wbHVnaW4ueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5pY29ucy8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+aGVscF90b2MueG1sPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVjbGlwc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuODwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBkb24ndCB1c2UgdGhlIFBERSBtb2RlIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IG1hdmVuLWVjbGlwc2UtcGx1Z2luIHRvIHRhbXBlciB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hbmlmZXN0IGdlbmVyYXRlZCBieSBtYXZlbi1idW5kbGUtcGx1Z2luIC0tPgotICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbEJ1aWxkY29tbWFuZHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YnVpbGRjb21tYW5kPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L2J1aWxkY29tbWFuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxidWlsZGNvbW1hbmQ+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L2J1aWxkY29tbWFuZD4KLSAgICAgICAgICAgICAgICAgICAgPC9hZGRpdGlvbmFsQnVpbGRjb21tYW5kcz4KLSAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxQcm9qZWN0bmF0dXJlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9qZWN0bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L3Byb2plY3RuYXR1cmU+Ci0gICAgICAgICAgICAgICAgICAgIDwvYWRkaXRpb25hbFByb2plY3RuYXR1cmVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoaXMgY29waWVzIHRoZSBkZXBlbmRlbmNpZXMgc28gdGhhdCB0aGV5IGNhbiBiZSBsb2NhdGVkIGJ5IEVjbGlwc2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1kZXBlbmRlbmNpZXM8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3Mtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlUmVsZWFzZXM+ZmFsc2U8L292ZXJXcml0ZVJlbGVhc2VzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdmVyV3JpdGVTbmFwc2hvdHM+ZmFsc2U8L292ZXJXcml0ZVNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlSWZOZXdlcj50cnVlPC9vdmVyV3JpdGVJZk5ld2VyPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2xlYW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5saWI8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+TUVUQS1JTkY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0cz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+ICAgCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gUHJvZHVjZSB0aGUgbWFuaWZlc3QgaW4gdGhlIGxvY2F0aW9uIGV4cGVjdGVkIGJ5IEVjbGlwc2UgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdExvY2F0aW9uPk1FVEEtSU5GPC9tYW5pZmVzdExvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbWJlZCBhbGwgZGVwZW5kZW5jaWVzLCBleGNlcHQgdGhvc2Ugd2hpY2ggYXJlIHByb3ZpZGVkIGJ5IHRoZSBFY2xpcHNlIHJ1bnRpbWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RW1iZWQtRGVwZW5kZW5jeT4qO3Njb3BlPWNvbXBpbGV8cnVudGltZTthcnRpZmFjdElkPSFvcmcuZWNsaXBzZS4qfGNvbW1vbnMtbG9nZ2luZ3x3c3R4LWFzbHxnZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjfGdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjfGdlcm9uaW1vLXN0YXgtYXBpXzEuMF9zcGVjfGFudCo8L0VtYmVkLURlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RW1iZWQtRGlyZWN0b3J5PmxpYjwvRW1iZWQtRGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICAgICAgPEVtYmVkLVRyYW5zaXRpdmU+dHJ1ZTwvRW1iZWQtVHJhbnNpdGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRXhjbHVkZSBpbXBvcnRzIHRoYXQgYXJlIGFjdHVhbGx5IG5vdCB1c2VkIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPiFvcmcuZG9tNGoqLCFudS54b20sIW9yZy5qZG9tKiwhamF2YXgucG9ydGxldCwhY29tLnN1bi4qLCFvcmcuYXBhY2hlLnhtbGJlYW5zLiosIW9yZy54bWxwdWxsLiosIW9yZy5hcGFjaGUuY29tbW9ucy5pbyosKjwvSW1wb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2UgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT5BeGlzMiBDb2RlZ2VuIFdpemFyZCBQbHVnLWluPC9CdW5kbGUtTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQWN0aXZhdG9yPm9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW48L0J1bmRsZS1BY3RpdmF0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT5vcmcuYXBhY2hlLmF4aXMyLmVjbGlwc2UuY29kZWdlbi5wbHVnaW47c2luZ2xldG9uOj10cnVlPC9CdW5kbGUtU3ltYm9saWNOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5Pmxhenk8L0J1bmRsZS1BY3RpdmF0aW9uUG9saWN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50PkoyU0UtMS41PC9CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5nbWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z21hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5leHRyYWN0LWJ1bmRsZS1zeW1ib2xpY25hbWUtYW5kLXZlcnNpb248L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmV4ZWN1dGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUocHJvamVjdC5iYXNlZGlyLCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QucHJvcGVydGllc1siYnVuZGxlLXN5bWJvbGljLW5hbWUiXSA9IG1hbmlmZXN0Lm1haW5BdHRyaWJ1dGVzLmdldFZhbHVlKCJCdW5kbGUtU3ltYm9saWNOYW1lIikuZmluZCgiXlteO10qIikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QucHJvcGVydGllc1siYnVuZGxlLXZlcnNpb24iXSA9IG1hbmlmZXN0Lm1haW5BdHRyaWJ1dGVzLmdldFZhbHVlKCJCdW5kbGUtVmVyc2lvbiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRpc3RyaWJ1dGlvbi1wYWNrYWdlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke3BvbS5iYXNlZGlyfS9lY2xpcHNlLWNvZGVnZW4tcGx1Z2luLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+ZGlzdDwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9XU0RMMkphdmFHZW5lcmF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL1dTREwySmF2YUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY5NzBmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL1dTREwySmF2YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW47Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5XU0RMMTFUb0F4aXNTZXJ2aWNlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotcHVibGljIGNsYXNzIFdTREwySmF2YUdlbmVyYXRvciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFwcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgbGFuZ3VhZ2UgdG8gYSBjb25zdGFudCBkZWZpbmVkIGluIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLkxhbmd1YWdlTmFtZXMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gVUlMYW5nVmFsdWUgYSBzdHJpbmcgY29udGFpbmcgYSBsYW5ndWFnZSwgZS5nLiAiamF2YSIsICJjcyIsICJjcHAiIG9yICJ2YiIKLSAgICAgKiBAcmV0dXJuIGEgbm9ybWFsaXplZCBzdHJpbmcgY29uc3RhbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBtYXBMYW5ndWFnZXNXaXRoQ29tYm8oU3RyaW5nIFVJTGFuZ1ZhbHVlKQotICAgIHsKLSAgICAgICByZXR1cm4gVUlMYW5nVmFsdWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsaXN0IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgZGVjaXNpb25zIG1hZGUgYnkgdGhlIHVzZXIgb24gdGhlIE9wdGlvbnNQYWdlCi0gICAgICogKHBhZ2UyKS4gRm9yIGVhY2ggc2V0dGluZywgdGhlcmUgaXMgYSBDb21tYW5kLUxpbmUgb3B0aW9uIGZvciB0aGUgQXhpczIgY29kZSBnZW5lcmF0b3IuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIE1hcCB3aXRoIGtleXMgZnJvbSBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cyB3aXRoIHRoZSB2YWx1ZXMgZW50ZXJlZCBieSB0aGUgdXNlciBvbiB0aGUgT3B0aW9ucyBQYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBNYXAgZmlsbE9wdGlvbk1hcChib29sZWFuIGlzQXluY09ubHksCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc1N5bmNPbmx5LAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlLAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTZXJ2ZXJYTUwsCi0gICAgICAgICAgICAJCSAgYm9vbGVhbiBpc1Rlc3RDYXNlLAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNHZW5lcmF0ZUFsbCwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIHBvcnROYW1lLAotICAgICAgICAgICAgCQkgIFN0cmluZyBkYXRhYmluZGluZ05hbWUsCi0gICAgICAgICAgICAJCSAgU3RyaW5nIFdTRExVUkksCi0gICAgICAgICAgICAJCSAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgCQkgIFN0cmluZyBzZWxlY3RlZExhbmd1YWdlLAotICAgICAgICAgICAgCQkgIFN0cmluZyBvdXRwdXRMb2NhdGlvbiwKLSAgICAgICAgICAgIAkJICBTdHJpbmcgbmFtZXNwYWNlMnBhY2thZ2VMaXN0LAotICAgICAgICAgICAgCQkgIGJvb2xlYW4gaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlLAotICAgICAgICAgICAgCQkgIEhhc2hNYXAgYWR2YW5jZU9wdGlvbnMKLSAgICAgICAgICAgIAkJICApCi0gICAgewotICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgIC8vV1NETCBmaWxlIG5hbWUKLSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sIGdldFN0cmluZ0FycmF5KFdTRExVUkkpKSk7Ci0gICAgICAgCi0gICAgICAgLy9Bc3luYyBvbmx5Ci0gICAgICAgaWYgKGlzQXluY09ubHkpCi0gICAgICAgewotICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgCQkgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX0FTWU5DX09OTFlfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgfQotICAgICAgIC8vc3luYyBvbmx5Ci0gICAgICAgaWYgKGlzU3luY09ubHkpCi0gICAgICAgewotICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgIH0KLSAgICAgICAvL3NlcnZlcnNpZGUKLSAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlKQotICAgICAgIHsKLSAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAJCSAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgLy9zZXJ2ZXIgeG1sCi0gICAgICAgICAgaWYgKGlzU2VydmVyWE1MKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgCQkgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpc0dlbmVyYXRlQWxsKXsKLSAgICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgCQkgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICAvL3Rlc3QgY2FzZQotICAgICAgIGlmIChpc1Rlc3RDYXNlKQotICAgICAgIHsKLSAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgIAkJICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfVEVTVF9DQVNFX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgIH0KLSAgICAgICAvL3BhY2thZ2UgbmFtZQotICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KHBhY2thZ2VOYW1lKSkpOwotICAgICAgIC8vc2VsZWN0ZWQgbGFuZ3VhZ2UKLSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OLCBnZXRTdHJpbmdBcnJheShtYXBMYW5ndWFnZXNXaXRoQ29tYm8oc2VsZWN0ZWRMYW5ndWFnZSkpKSk7Ci0gICAgICAgLy9vdXRwdXQgbG9jYXRpb24KLSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkob3V0cHV0TG9jYXRpb24pKSk7Ci0gICAgICAgCi0gICAgICAvL2RhdGFiaW5kaW5nCi0gICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgCQkgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLCBnZXRTdHJpbmdBcnJheShkYXRhYmluZGluZ05hbWUpKSk7Ci0gICAgICAgCi0gICAgICAgLy9wb3J0IG5hbWUKLSAgICAgICBpZiAocG9ydE5hbWUhPW51bGwpewotCSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KHBvcnROYW1lKSkpOwotICAgICAgIH0KLSAgICAgICAvL3NlcnZpY2UgbmFtZQotICAgICAgIGlmIChzZXJ2aWNlTmFtZSE9IG51bGwpewotCSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KHNlcnZpY2VOYW1lKSkpOwotICAgICAgIH0KLSAgICAgICAvL25zMnBrZyBtYXBwaW5nCi0gICAgICAgaWYgKG5hbWVzcGFjZTJwYWNrYWdlTGlzdCE9IG51bGwpewotCSAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0JICAgIAkJICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KG5hbWVzcGFjZTJwYWNrYWdlTGlzdCkpKTsKLSAgICAgICB9Ci0gICAgICAgCi0gICAgICAgLy9zZXJ2ZXIgc2lkZSBpbnRlcmZhY2UgIG1hcHBpbmcKLSAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlKXsKLQkgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotCSAgICAJCSAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIGlmIChhZHZhbmNlT3B0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWR2YW5jZU9wdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlTdHJpbmdbXSBwYXJhbWV0ZXJzOwotCQkJCWlmIChhZHZhbmNlT3B0aW9ucy5nZXQodHlwZSkgPT0gbnVsbCkKLQkJCQkJcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMF07Ci0JCQkJZWxzZQotCQkJCQlwYXJhbWV0ZXJzID0gKFN0cmluZ1tdKSBhZHZhbmNlT3B0aW9ucy5nZXQodHlwZSk7Ci0JCQkJb3B0aW9uTWFwLnB1dCh0eXBlLCBuZXcgQ29tbWFuZExpbmVPcHRpb24odHlwZSwgcGFyYW1ldGVycykpOwotCQkJfQotCQl9Ci0gICAgICAgcmV0dXJuIG9wdGlvbk1hcDsKLSAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKFN0cmluZyB3c2RsVVJJKXsKLSAgICAJCi0gICAgCXRyeSB7Ci0JCQlVUkwgdXJsOwotCQkJaWYgKHdzZGxVUkkuaW5kZXhPZigiOi8vIik9PS0xKXsKLQkJCQl1cmwgPSBuZXcgVVJMKCJmaWxlIiwiIix3c2RsVVJJKTsKLQkJCX1lbHNlewotCQkJCXVybCA9IG5ldyBVUkwod3NkbFVSSSk7CQotCQkJfQotCi0JCQkKLQkJCVN0cmluZyBiYXNlVXJpOwotCQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKXsKLQkJCQliYXNlVXJpID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX1lbHNlewotCQkJCWJhc2VVcmkgPSB1cmwudG9FeHRlcm5hbEZvcm0oKS5zdWJzdHJpbmcoMCwKLQkJCQkJCXVybC50b0V4dGVybmFsRm9ybSgpLmxhc3RJbmRleE9mKCIvIikKLQkJCQkpOwotCQkJfQotCQkKLQkJCQotCQkJcmV0dXJuIGJhc2VVcmk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgV1NETCBPYmplY3QgTW9kZWwgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHdzZGxVUkkgdGhlIGZpbGVzeXN0ZW0gbG9jYXRpb24gKGZ1bGwgcGF0aCkgb2YgdGhlIFdTREwgZmlsZSB0byByZWFkIGluLgotICAgICAqIEByZXR1cm4gdGhlIFdTRExEZXNjcmlwdGlvbiBvYmplY3QgY29udGFpbmluZyB0aGUgV1NETCBPYmplY3QgTW9kZWwgb2YgdGhlIGdpdmVuIFdTREwgZmlsZQotICAgICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbiB3aGVuIFdTREwgRmlsZSBpcyBpbnZhbGlkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcnMgcmVhZGluZyB0aGUgV1NETCBmaWxlCi0gICAgICovCi0gICAgcHVibGljIEF4aXNTZXJ2aWNlIGdldEF4aXNTZXJ2aWNlKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAkKLSAgICAJCVVSTCB1cmw7Ci0JCQlpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKT09LTEpewotCQkJCXVybCA9IG5ldyBVUkwoImZpbGUiLCIiLHdzZGxVUkkpOwotCQkJfWVsc2V7Ci0JCQkJdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsJCi0JCQl9Ci0KLQkgICAgLy8gVGhpcyBxdWljayBmaXggYXNzdW1lIHRoYXQgdGhlIHdzZGxVUkkgcG9pbnRzIHRvIGEgd3NkbCAxLjEgdmVyc2lvbi4KLQkJCS8vIEEgYmV0dGVyIGZpeCBzaG91bGQgYmUgdG8gZGV0ZXJtaW5lIHdoaWNoIGJ1aWxkZXIgdG8gdXNlIGJhc2VkIG9uIHRoZSB3c2RsIHZlcnNpb24uIAotCQkJLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHdzZGwgYnVpbGRlciBjbGFzc2VzIGRpZCBub3QgYWxsb3cgZm9yIHRoaXMuIEkgd2lsbCBzdWdnZXN0Ci0JCQkvLyB0aGF0IHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoaWNoIGJ1aWxkZXIgdG8gdXNlIHNob3VsZCBiZSBkb25lIGluIHRoZSBidWlsZGVyIGNsYXNzZXMsIHByZWZlcmFibHkKLQkJCS8vIGluIHRoZSBwYXJlbnQgYnVpbGRlciBjbGFzcy4gCi0JCQkvLyBBY2Nlc3NhYmxlIHRocm91Z2ggYSBzdGF0aWMgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIGxpa2UgZ2V0QnVpbGRlckluc3RhbmNlKFN0cmluZyB3c2RsVVJJKSBpbgotCQkJLy8gdGhlIHBhcmVudCBidWlsZGVyIGNsYXNzIG9yIHRocm91Z2ggYSBidWlsZGVyIEFic3RyYWN0IEZhY3RvciBvciBBYnN0cmFjdCBmYWN0b3J5IG1ldGhvZHMuCi0JCQkKLQkJCVdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIodXJsLm9wZW5Db25uZWN0aW9uKCkuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBVUkkgb2YgdGhlIGJhc2UgZG9jdW1lbnQgZm9yIHRoZSBEZWZpbml0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIFVSSSBvZiB0aGUgYmFzZSBkb2N1bWVudCwgbm90IHRoZSBpbXBvcnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXREb2N1bWVudEJhc2VVcmkodXJsLnRvU3RyaW5nKCkpOwotCi0JCQlidWlsZGVyLnNldEJhc2VVcmkoZ2V0QmFzZVVyaSh3c2RsVVJJKSk7Ci0JCQlidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0JCQlyZXR1cm4gYnVpbGRlci5wb3B1bGF0ZVNlcnZpY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHNpbmdsZSBTdHJpbmcgaW50byBhIFN0cmluZyBBcnJheQotICAgICAqIAotICAgICAqIEBwYXJhbSB2YWx1ZSBhIHNpbmdsZSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgb25seSBvbmUgZWxlbWVudAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RyaW5nQXJyYXkoU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgIHZhbHVlc1swXSA9IHZhbHVlOwotICAgICAgIHJldHVybiB2YWx1ZXM7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL0NvZGVHZW5XaXphcmQuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvQ29kZUdlbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmZmNmZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvQ29kZUdlbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5qYXZhMndzZGwuSmF2YTJXU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLldTREwySmF2YUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnBsdWdpbi5Db2RlZ2VuV2l6YXJkUGx1Z2luOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuQWJzdHJhY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5KYXZhV1NETE9wdGlvbnNQYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuSmF2YVdTRExPdXRwdXRMb2NhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5PcHRpb25zUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLk91dHB1dFBhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Ub29sU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLldTRExGaWxlU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWwuU2V0dGluZ3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLlVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudXRpbC5XU0RMUHJvcGVydHlSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmUuSmFyRmlsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZS5TcmNDb21waWxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTRExDb2RlZ2VuRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUud3MuamF2YTJ3c2RsLnV0aWxzLkphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgbWFpbiB3aXphcmQgZm9yIHRoZSBjb2RlZ2VuIHdpemFyZAotICovCi0KLXB1YmxpYyBjbGFzcyBDb2RlR2VuV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSmF2YTJXU0RMQ29uc3RhbnRzIHsKLSAgICBwcml2YXRlIFRvb2xTZWxlY3Rpb25QYWdlIHRvb2xTZWxlY3Rpb25QYWdlOwotICAgIAotICAgIHByaXZhdGUgV1NETEZpbGVTZWxlY3Rpb25QYWdlIHdzZGxTZWxlY3Rpb25QYWdlOwotCi0gICAgcHJpdmF0ZSBPcHRpb25zUGFnZSBvcHRpb25zUGFnZTsKLQotICAgIHByaXZhdGUgT3V0cHV0UGFnZSBvdXRwdXRQYWdlOwotCi0gICAgcHJpdmF0ZSBKYXZhV1NETE9wdGlvbnNQYWdlIGphdmEyd3NkbE9wdGlvbnNQYWdlOwotCi0gICAgcHJpdmF0ZSBKYXZhU291cmNlU2VsZWN0aW9uUGFnZSBqYXZhU291cmNlU2VsZWN0aW9uUGFnZTsKLQotICAgIHByaXZhdGUgSmF2YVdTRExPdXRwdXRMb2NhdGlvblBhZ2UgamF2YTJ3c2RsT3V0cHV0TG9jYXRpb25QYWdlOwotCi0gICAgcHJpdmF0ZSBpbnQgc2VsZWN0ZWRXaXphcmRUeXBlID0gU2V0dGluZ3NDb25zdGFudHMuV1NETF8yX0pBVkFfVFlQRTsvL1RPRE8gY2hhbmdlIHRoaXMKLQotICAgIHByaXZhdGUgaW50IHNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUgPSBTZXR0aW5nc0NvbnN0YW50cy5DT0RFR0VOX0RFRkFVTFRfVFlQRTsvL1RPRE8gY2hhbmdlIHRoaXMKLSAgICAKLQotICAgCi0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29kZUdlbldpemFyZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29kZUdlbldpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIHRoaXMKLSAgICAgICAgICAgICAgICAuc2V0V2luZG93VGl0bGUob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLm5hbWUiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkaW5nIHRoZSBwYWdlIHRvIHRoZSB3aXphcmQuCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLSAgICAgICAgdG9vbFNlbGVjdGlvblBhZ2UgPSBuZXcgVG9vbFNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgYWRkUGFnZSh0b29sU2VsZWN0aW9uUGFnZSk7Ci0KLSAgICAgICAgLy9hZGQgdGhlIHdzZGwyamF2YSB3aXphcmQgcGFnZXMKLSAgICAgICAgd3NkbFNlbGVjdGlvblBhZ2UgPSBuZXcgV1NETEZpbGVTZWxlY3Rpb25QYWdlKCk7Ci0gICAgICAgIGFkZFBhZ2Uod3NkbFNlbGVjdGlvblBhZ2UpOwotICAgICAgICAKLSAgICAgICAgb3B0aW9uc1BhZ2UgPSBuZXcgT3B0aW9uc1BhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShvcHRpb25zUGFnZSk7Ci0gICAgICAgIG91dHB1dFBhZ2UgPSBuZXcgT3V0cHV0UGFnZSgpOwotICAgICAgICBhZGRQYWdlKG91dHB1dFBhZ2UpOwotCi0gICAgICAgIC8vYWRkIGphdmEyd3NkbCB3aXphcmQgcGFnZXMKLSAgICAgICAgamF2YVNvdXJjZVNlbGVjdGlvblBhZ2UgPSBuZXcgSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShqYXZhU291cmNlU2VsZWN0aW9uUGFnZSk7Ci0gICAgICAgIGphdmEyd3NkbE9wdGlvbnNQYWdlID0gbmV3IEphdmFXU0RMT3B0aW9uc1BhZ2UoKTsKLSAgICAgICAgYWRkUGFnZShqYXZhMndzZGxPcHRpb25zUGFnZSk7Ci0gICAgICAgIGphdmEyd3NkbE91dHB1dExvY2F0aW9uUGFnZSA9IG5ldyBKYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZSgpOwotICAgICAgICBhZGRQYWdlKGphdmEyd3NkbE91dHB1dExvY2F0aW9uUGFnZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgICAgICBJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLSAgICAgICAgQWJzdHJhY3RXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB3aXphcmRQYWdlID0gKEFic3RyYWN0V2l6YXJkUGFnZSkgcGFnZXNbaV07Ci0gICAgICAgICAgICBpZiAod2l6YXJkUGFnZS5nZXRQYWdlVHlwZSgpID09IHRoaXMuc2VsZWN0ZWRXaXphcmRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEod2l6YXJkUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIEFic3RyYWN0V2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IChBYnN0cmFjdFdpemFyZFBhZ2UpIHBhZ2U7Ci0gICAgICAgIEFic3RyYWN0V2l6YXJkUGFnZSBwYWdlb3V0ID0gKEFic3RyYWN0V2l6YXJkUGFnZSkgc3VwZXIKLSAgICAgICAgICAgICAgICAuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0KLSAgICAgICAgd2hpbGUgKHBhZ2VvdXQgIT0gbnVsbCAmJiBzZWxlY3RlZFdpemFyZFR5cGUgIT0gcGFnZW91dC5nZXRQYWdlVHlwZSgpKSB7Ci0gICAgICAgICAgICBBYnN0cmFjdFdpemFyZFBhZ2UgdGVtcCA9IHBhZ2VvdXQ7Ci0gICAgICAgICAgICBwYWdlb3V0ID0gKEFic3RyYWN0V2l6YXJkUGFnZSkgc3VwZXIuZ2V0TmV4dFBhZ2UoY3VycmVudFBhZ2UpOwotICAgICAgICAgICAgY3VycmVudFBhZ2UgPSB0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlb3V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuICdGaW5pc2gnIGJ1dHRvbiBpcyBwcmVzc2VkIGluIHRoZSB3aXphcmQuIFdlCi0gICAgICogd2lsbCBjcmVhdGUgYW4gb3BlcmF0aW9uIGFuZCBydW4gaXQgdXNpbmcgd2l6YXJkIGFzIGV4ZWN1dGlvbiBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHNlbGVjdGVkV2l6YXJkVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTZXR0aW5nc0NvbnN0YW50cy5XU0RMXzJfSkFWQV9UWVBFOgotICAgICAgICAgICAgICAgIGRvRmluaXNoV1NETDJKYXZhKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNldHRpbmdzQ29uc3RhbnRzLkpBVkFfMl9XU0RMX1RZUEU6Ci0gICAgICAgICAgICAgICAgZG9GaW5pc2hKYXZhMldTREwoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2V0dGluZ3NDb25zdGFudHMuVU5TUEVDSUZJRURfVFlQRToKLSAgICAgICAgICAgICAgICBicmVhazsgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKENvZGVnZW5XaXphcmRQbHVnaW4uCi0gICAgICAgICAgICAgICAgCQlnZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5pbnZhbGlkLnN0YXRlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuRXJyb3IiKSwgCi0gICAgICAgICAgICAgICAgICAgIENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuRXJyb3IucHJlZml4IikgKwotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24odGhpcy5nZXRTaGVsbCgpLCAKLSAgICAgICAgICAgICAgICAgQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5uYW1lIiksIENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoIndpemFyZC5zdWNjZXNzIikpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgd29ya2VyIG1ldGhvZCwgZ2VuZXJhdGVzIHRoZSBjb2RlIGl0c2VsZi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9GaW5pc2hXU0RMMkphdmEoKSB7Ci0gICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAqICIzIiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHN0ZXBzLCBzZWUgYmVsb3cgbW9uaXRvci53b3JrZWQoYW1vdW50KQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhdG9yLmdlbmVyYXRpbmciKSwgMyk7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICogVE9ETzogSW50cm9kdWNlIGEgcHJvZ3Jlc3MgbW9uaXRvciBpbnRlcmZhY2UgZm9yIENvZGVHZW5lcmF0aW9uRW5naW5lLgotICAgICAgICAgICAgICAgICAgKiBTaW5jZSB0aGlzIG1vbml0b3IgaGVyZSBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSwgd2UKLSAgICAgICAgICAgICAgICAgICogc2hvdWxkIGVpdGhlciByZW1vdmUgdGhlIHByb2dyZXNzIG1vbml0b3IgZnJvbSB0aGUgQ29kZUdlbldpemFyZCwKLSAgICAgICAgICAgICAgICAgICogb3IgZ2l2ZSBhIChjdXN0b20pIHByb2dyZXNzIG1vbml0b3IgdG8gdGhlIGdlbmVyYXRlKCkgbWV0aG9kLCBzbwotICAgICAgICAgICAgICAgICAgKiB3ZSB3aWxsIGJlIGluZm9ybWVkIGJ5IEF4aXMyIGFib3V0IHRoZSBwcm9ncmVzcyBvZiBjb2RlIGdlbmVyYXRpb24uICAKLSAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIFdTREwySmF2YUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgV1NETDJKYXZhR2VuZXJhdG9yKCk7IAotICAgICAgICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhdG9yLnJlYWRpbmdXT00iKSk7Ci0gICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBnZW5lcmF0b3IuZ2V0QXhpc1NlcnZpY2Uod3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgLy9UaGUgZ2VuZXJhdGUgYWxsIGZpeCAoQXhpczItMTg2MikKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NlcnZlcnNpZGUsaXNTZXJ2aWNlWE1MLGlzR2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlICA9IGZhbHNlOwotICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1BhZ2UuZ2V0R2VuZXJhdGVBbGwoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJzaWRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZpY2VYTUwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJzaWRlID0gb3B0aW9uc1BhZ2UuaXNTZXJ2ZXJzaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2aWNlWE1MID1vcHRpb25zUGFnZS5pc1NlcnZlclhNTCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlID0gb3B0aW9uc1BhZ2UuZ2V0R2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgTWFwIG9wdGlvbnNNYXAgPSBnZW5lcmF0b3IuZmlsbE9wdGlvbk1hcChvcHRpb25zUGFnZS5pc0FzeW5jT25seU9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5pc1N5bmNPbmx5T24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmljZVhNTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNQYWdlLmlzR2VuZXJhdGVUZXN0Q2FzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0R2VuZXJhdGVBbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNQYWdlLmdldFNlcnZpY2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5nZXRQb3J0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0RGF0YWJpbmRlck5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzZGxTZWxlY3Rpb25QYWdlLmdldEZpbGVOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0U2VsZWN0ZWRMYW5ndWFnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFnZS5nZXRPdXRwdXRMb2NhdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1BhZ2UuZ2V0TnMyUGtnTWFwcGluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zUGFnZS5nZXRBZHZhbmNlT3B0aW9ucygpKTsKLQotICAgICAgICAgICAgICAgICAvL0ZpeCBmb3IgdGhlIENvZGVHZW5Db25maWd1cmF0aW9uIENvbnRydWN0b3IgQ2hhbmdlCi0gICAgICAgICAgICAgICAgIC8vQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihzZXJ2aWNlLCBvcHRpb25zTWFwKTsKLSAgICAgICAgICAgICAgICAgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihvcHRpb25zTWFwKTsKLSAgICAgICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5hZGRBeGlzU2VydmljZShzZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8vc2V0IHRoZSB3c2RsIGRlZmluaXNpb24gZm9yIGNvZGVnZW4gY29uZmlnIGZvciBza2VsZXRvbiBnZW5lcmFyaW9uLgotICAgICAgICAgICAgICAgICBXU0RMUHJvcGVydHlSZWFkZXIgcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcigpOwotICAgICAgICAgICAgICAgICByZWFkZXIucmVhZFdTREwod3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSByZWFkZXIuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5zZXRXc2RsRGVmaW5pdGlvbih3c2RsRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvL3NldCB0aGUgYmFzZVVSSQotICAgICAgICAgICAgICAgICBjb2RlZ2VuQ29uZmlnLnNldEJhc2VVUkkoZ2VuZXJhdG9yLmdldEJhc2VVcmkod3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKSkpOwotICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIG1vbml0b3Iuc3ViVGFzayhDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmF0b3IuZ2VuZXJhdGluZyIpKTsKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShjb2RlZ2VuQ29uZmlnKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgLy9UT0RPIHJlZnJlc2ggdGhlIGVjbGlwc2UgcHJvamVjdCBzcGFjZSB0byBzaG93IHRoZSBnZW5lcmF0ZWQgZmlsZXMKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8vQWRkIHRoZSBjb2RlZ2VuIGxpYnMgdGhhdCBhcmUgY29taW5nIHdpdGggdGhlIHBsdWdpbiB0byB0aGUgcHJvamVjdCBsaWIgdGhhdCBoYXMgYmVlbiBjcmVhdGVkCi0gICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQYWdlLmdldEF4aXMyUGx1Z2luTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCkpeyAKLSAgICAgICAgICAgICAgICAJIFN0cmluZyBlY2xpcHNlSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLSAgICAgICAgICAgICAgICAJIFN0cmluZyBwbHVnaW5MaWJMb2NhdGlvbiA9IGVjbGlwc2VIb21lK0ZpbGUuc2VwYXJhdG9yK1VJQ29uc3RhbnRzLlBMVUdJTlMrCi0JCQkJCQkJCQkJCUZpbGUuc2VwYXJhdG9yK1VJQ29uc3RhbnRzLkFYSVNfQ09ERUdFTl9QTFVHSU5fRk9MREVSKwotCQkJCQkJCQkJCQlGaWxlLnNlcGFyYXRvcitVSUNvbnN0YW50cy5MSUI7Ci0gICAgICAgICAgICAgICAgCSBhZGRMaWJzVG9Qcm9qZWN0TGliKHBsdWdpbkxpYkxvY2F0aW9uLCBvdXRwdXRQYWdlLmdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvL0Fsc28gYW5vdGhlciByZXF1aXJlbWVudCBhcmlzZXMgCi0gICAgICAgICAgICAgICAgIC8vSWYgdGhlIGNvZGVnZW4gcHJvamVjdCB3YXMgbmV3bHkgYnVpZGVkIHByb2plY3Qgb3IgZWxzZSB0aGUgZWNsaXBzZQotICAgICAgICAgICAgICAgICAvL3Byb2plY3QgaW50ZW5kZWQgdG8gc2F2ZSB0aGlzIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIGxpYnMKLSAgICAgICAgICAgICAgICAgLy90byBjb21waWxlIHRoZSBnZW5lcmF0ZWQgY29kZS4gV2UgbmVlZCB0byBhZGQgdGhlIHJlbGV2ZW50IGxpYnMgdG8gYSBsaWIgZGlyZWN0b3J5IAotICAgICAgICAgICAgICAgICAvL29mIHRoZSA8Y29kZT5vdXRwdXRQYWdlLmdldE91dHB1dExvY2F0aW9uKCk8L2NvZGU+Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvL0FkZCB0aGUgbGlicmFyaWVzIG9uIHRoZSBwbHVnaW4gbGliIGRpcmVjdG9yeSB0byB0aGUgY3JlYXRlZCBwcm9qZWN0IGxpYgotICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UGFnZS5nZXRBeGlzTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCkgJiYgb3V0cHV0UGFnZS5va3RvTG9hZExpYnMoKSl7Ci0vLyAgICAgICAgICAgICAgICAJIFN0cmluZyBsaWJEaXJlY3RvcnkgPSBvdXRwdXRQYWdlLmdldEF4aXNIb21lTG9jYXRpb24oKStGaWxlLnNlcGFyYXRvcisKLS8vICAgICAgICAgICAgICAgIAkgCQkJCQkgICBVSUNvbnN0YW50cy5UQVJHRVQrRmlsZS5zZXBhcmF0b3IrVUlDb25zdGFudHMuTElCOwotICAgICAgICAgICAgICAgIAkgU3RyaW5nIGxpYkRpcmVjdG9yeSA9IG91dHB1dFBhZ2UuZ2V0QXhpc0phcnNMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIAkgYWRkTGlic1RvUHJvamVjdExpYihsaWJEaXJlY3RvcnksIG91dHB1dFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIC8vVGhpcyB3aWxsIENyZWF0ZSBhIGphciBmaWxlIGZyb20gdGhlIGNvZGVnZW4gcmVzdWx0cyBhbmQgYWRkIHRvIHRoZSBvdXRwdXQgCi0gICAgICAgICAgICAgICAgIC8vbG9jYXRpb25zIGxpYiBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBhZ2UuZ2V0Q3JlYXRlSmFyQ2hlY2tCb3hTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICAgICAgCSBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgICAgICAJIFN0cmluZyB0ZW1wQ29kZWdlbkxvY2F0aW9uID0gIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyJjb2RlZ2VuIjsKLSAgICAgICAgICAgICAgICAJIFN0cmluZyB0ZW1wUHJvamVjdFNyY0xvY2F0aW9uID0gdGVtcENvZGVnZW5Mb2NhdGlvbitGaWxlLnNlcGFyYXRvcisiY29kZWdlbl90ZW1wX3NyY18iKwotICAgICAgICAgICAgICAgIAkgCQkJCQkJCQkgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgCSBTdHJpbmcgdGVtcFByb2plY3RDbGFzc0xvY2F0aW9uID0gdGVtcENvZGVnZW5Mb2NhdGlvbitGaWxlLnNlcGFyYXRvcisiY29kZWdlbl90ZW1wX2NsYXNzXyIrCi0gICAgICAgICAgICAgICAgCSAJCQkJCQkJICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIAkgRmlsZSB0ZW1wQ29kZWdlbkZpbGUgPSBuZXcgRmlsZSh0ZW1wQ29kZWdlbkxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAJIEZpbGUgdGVtcFNyY0ZpbGUgPSBuZXcgRmlsZSh0ZW1wUHJvamVjdFNyY0xvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAJIEZpbGUgdGVtcENsYXNzRmlsZSA9IG5ldyBGaWxlKHRlbXBQcm9qZWN0Q2xhc3NMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgCSB0ZW1wQ29kZWdlbkZpbGUubWtkaXIoKTsKLSAgICAgICAgICAgICAgICAJIHRlbXBTcmNGaWxlLm1rZGlyKCk7Ci0gICAgICAgICAgICAgICAgCSB0ZW1wQ2xhc3NGaWxlLm1rZGlyKCk7Ci0gICAgICAgICAgICAgICAgCSBjb3B5RGlyZWN0b3J5KG5ldyBGaWxlKG91dHB1dFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKSksIHRlbXBTcmNGaWxlKTsKLSAgICAgICAgICAgICAgICAJIC8vQ29tcGlsZSB0aGUgc291cmNlIHRvIGFub3RoZXIgZGlyZWN0b3J5IAotICAgICAgICAgICAgICAgIAkgU3JjQ29tcGlsZXIgc3JjQ29tcGlsZVRvb2wgPSBuZXcgU3JjQ29tcGlsZXIoKTsKLSAgICAgICAgICAgICAgICAJIHNyY0NvbXBpbGVUb29sLmNvbXBpbGVTb3VyY2UodGVtcENsYXNzRmlsZSwgdGVtcFByb2plY3RTcmNMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgCSAvL2NyZWF0ZSB0aGUgamFyIGZpbGUgYW5kIGFkZCB0aGF0IHRvIHRoZSBsaWIgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgCSBTdHJpbmcgcHJvamVjdExpYiA9IG91dHB1dFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKStGaWxlLnNlcGFyYXRvcisibGliIjsKLSAgICAgICAgICAgICAgICAJIEphckZpbGVXcml0ZXIgamFyRmlsZVdyaXRlciA9IG5ldyBKYXJGaWxlV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgCSBTdHJpbmcgamFyRmlsZU5hbWUgPSAiQ29kZWdlblJlc3VsdHMuamFyIjsKLSAgICAgICAgICAgICAgICAJIGlmICghb3V0cHV0UGFnZS5nZXRKYXJGaWxlbmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgIAkJIGphckZpbGVOYW1lPW91dHB1dFBhZ2UuZ2V0SmFyRmlsZW5hbWUoKTsKLSAgICAgICAgICAgICAgICAJIH0KLSAgICAgICAgICAgICAgICAJIG91dHB1dFBhZ2Uuc2V0SmFyRmlsZU5hbWUoamFyRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIAkgamFyRmlsZVdyaXRlci53cml0ZUphckZpbGUobmV3IEZpbGUocHJvamVjdExpYiksIGphckZpbGVOYW1lLCB0ZW1wQ2xhc3NGaWxlKTsKLSAgICAgICAgICAgICAgICAJIAotICAgICAgICAgICAgICAgIAkgLy9EZWxldGUgdGhlIHRlbXAgZm9sZGVycwotICAgICAgICAgICAgICAgIAkgZGVsZXRlRGlyKHRlbXBDb2RlZ2VuRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgICAgICAJICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgCSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAKLSAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTdGFydCB0aGUgZ2VuZXJhdGlvbiBhcyBuZXcgV29ya2JlbmNoIE9wZXJhdGlvbiwgc28gdGhlIHVzZXIKLSAgICAgICAgICogY2FuIHNlZSB0aGUgcHJvZ3Jlc3MgYW5kLCBpZiBuZWVkZWQsIGNhbiBzdG9wIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMSkKLSAgICAgICAgewotICAgICAgICAJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgICAgICAJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIAkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUxKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9GaW5pc2hKYXZhMldTREwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogIjIiIGlzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3RlcHMsIHNlZSBiZWxvdwotICAgICAgICAgICAgICAgICAqIG1vbml0b3Iud29ya2VkKGFtb3VudCkKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYXRvci5nZW5lcmF0aW5nIiksIDMpOwotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vZmlsbCB0aGUgb3B0aW9uIG1hcAotICAgICAgICAgICAgICAgICAgICBNYXAgb3B0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uIG9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlDTEFTU05BTUVfT1BUSU9OLG5ldyBTdHJpbmdbXXtqYXZhU291cmNlU2VsZWN0aW9uUGFnZS5nZXRDbGFzc05hbWUoKX0pOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChDTEFTU05BTUVfT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJQ0xBU1NQQVRIX09QVElPTixqYXZhU291cmNlU2VsZWN0aW9uUGFnZS5nZXRDbGFzc1BhdGhMaXN0KCkpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChDTEFTU1BBVEhfT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIAkJbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFRhcmdldE5hbWVzcGFjZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAucHV0KFRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAJCW5ldyBTdHJpbmdbXXtqYXZhMndzZGxPcHRpb25zUGFnZS5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKX0pOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChUQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sb3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlTQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIAkJbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAucHV0KFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX09QVElPTixvcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCVNFUlZJQ0VfTkFNRV9PUFRJT04sbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFNlcnZpY2VOYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXQoU0VSVklDRV9OQU1FX09QVElPTixvcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAJCVNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIAkJbmV3IFN0cmluZ1tde2phdmEyd3NkbE9wdGlvbnNQYWdlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpfSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNNYXAucHV0KFNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sb3B0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgCQlPVVRQVVRfTE9DQVRJT05fT1BUSU9OLG5ldyBTdHJpbmdbXXtqYXZhMndzZGxPdXRwdXRMb2NhdGlvblBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKX0pOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnB1dChPVVRQVVRfTE9DQVRJT05fT1BUSU9OLG9wdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIAkJT1VUUFVUX0ZJTEVOQU1FX09QVElPTixuZXcgU3RyaW5nW117amF2YTJ3c2RsT3V0cHV0TG9jYXRpb25QYWdlLmdldE91dHB1dFdTRExOYW1lKCl9KTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uc01hcC5wdXQoT1VUUFVUX0ZJTEVOQU1FX09QVElPTixvcHRpb24pOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29kZWdlbkVuZ2luZShvcHRpb25zTWFwKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAJICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oQ29kZWdlbldpemFyZFBsdWdpbi4KLSAgICAgICAgICAgIAkJZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwudXNlcmFib3J0ZWQuc3RhdGUiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2Ugd2lsbCBhY2NlcHQgdGhlIHNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIHRvIHNlZSBpZiB3ZSBjYW4gaW5pdGlhbGl6ZQotICAgICAqIGZyb20gaXQuCi0gICAgICogCi0gICAgICogQHNlZSBJV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIC8vZG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VsZWN0ZWRXaXphcmRUeXBlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRXaXphcmRUeXBlKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWRXaXphcmRUeXBlOwotICAgIH0gICAgCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRXaXphcmRUeXBlCi0gICAgICogICAgICAgICAgICBUaGUgc2VsZWN0ZWRXaXphcmRUeXBlIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFdpemFyZFR5cGUoaW50IHNlbGVjdGVkV2l6YXJkVHlwZSkgewotICAgICAgICB0aGlzLnNlbGVjdGVkV2l6YXJkVHlwZSA9IHNlbGVjdGVkV2l6YXJkVHlwZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjb2RlZ2VuT3B0aW9uVHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3RlZENvZGVnZW5PcHRpb25UeXBlOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VsZWN0ZWRDb2RlZ2VuT3B0aW9uVHlwZQotICAgICAqICAgICAgICAgICAgVGhlIHNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUoaW50IHNlbGVjdGVkQ29kZWdlbk9wdGlvblR5cGUpIHsKLSAgICAgICAgdGhpcy5zZWxlY3RlZENvZGVnZW5PcHRpb25UeXBlID0gc2VsZWN0ZWRDb2RlZ2VuT3B0aW9uVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHNlbGVjdGVkIFdTREwgZnJvbSB0aGUgV1NETHNlbGVjdGlvbnBhZ2UKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMbmFtZSgpewotICAgICAgICByZXR1cm4gd3NkbFNlbGVjdGlvblBhZ2UuZ2V0RmlsZU5hbWUoKTsJCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIHBvcHVsYXRlIHRoZSBvcHRpb25zIHBhZ2UuIFVzdWFsbHkgZG9uZSBhZnRlciByZWxvYWRpbmcgdGhlIFdTREwKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlT3B0aW9ucygpewotICAgIAlvcHRpb25zUGFnZS5wb3B1bGF0ZVBhcmFtc0Zyb21XU0RMKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lc3BhY2VzKFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSl7Ci0gICAgCWphdmEyd3NkbE9wdGlvbnNQYWdlLnNldE5hbWVzcGFjZURlZmF1bHRzKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExpYnNUb1Byb2plY3RMaWIoU3RyaW5nIGxpYkRpcmVjdG9yeSwgU3RyaW5nIG91dHB1dExvY2F0aW9uKXsKLSAgICAJU3RyaW5nIG5ld091dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb24rRmlsZS5zZXBhcmF0b3IrVUlDb25zdGFudHMuTElCOwotICAgIAkvL0NyZWF0ZSBhIGxpYiBkaXJlY3Rvcnk7IGFsbCBhbmNlc3RvciBkaXJlY3RvcmllcyBtdXN0IGV4aXN0Ci0gICAgCWJvb2xlYW4gc3VjY2VzcyA9IChuZXcgRmlsZShuZXdPdXRwdXRMb2NhdGlvbikpLm1rZGlyKCk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0JCQljb3B5RGlyZWN0b3J5KG5ldyBGaWxlKGxpYkRpcmVjdG9yeSksbmV3IEZpbGUobmV3T3V0cHV0TG9jYXRpb24pKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgIH0KLSAgICAKLSAgICAvLyBDb3BpZXMgYWxsIGZpbGVzIHVuZGVyIHNyY0RpciB0byBkc3REaXIuCi0gICAgLy8gSWYgZHN0RGlyIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgcHVibGljIHZvaWQgY29weURpcmVjdG9yeShGaWxlIHNyY0RpciwgRmlsZSBkc3REaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmNEaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgaWYgKCFkc3REaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBkc3REaXIubWtkaXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gc3JjRGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkobmV3IEZpbGUoc3JjRGlyLCBjaGlsZHJlbltpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZHN0RGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29weUZpbGUoc3JjRGlyLCBkc3REaXIpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICAvLyBDb3BpZXMgc3JjIGZpbGUgdG8gZHN0IGZpbGUuCi0gICAgLy8gSWYgdGhlIGRzdCBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKEZpbGUgc3JjLCBGaWxlIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpOwotICAgIAotICAgICAgICAvLyBUcmFuc2ZlciBieXRlcyBmcm9tIGluIHRvIG91dAotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIGludCBsZW47Ci0gICAgICAgIHdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICAgIAotICAgIC8vIERlbGV0ZXMgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyB1bmRlciBkaXIuCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCBkZWxldGlvbnMgd2VyZSBzdWNjZXNzZnVsLgotICAgIC8vIElmIGEgZGVsZXRpb24gZmFpbHMsIHRoZSBtZXRob2Qgc3RvcHMgYXR0ZW1wdGluZyB0byBkZWxldGUgYW5kIHJldHVybnMgZmFsc2UuCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGRlbGV0ZURpcihuZXcgRmlsZShkaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS9wbHVnaW4vQ29kZWdlbldpemFyZFBsdWdpbi5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS9wbHVnaW4vQ29kZWdlbldpemFyZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDc4N2U0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvcGx1Z2luL0NvZGVnZW5XaXphcmRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlZ2VuV2l6YXJkUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvZGVnZW5XaXphcmRQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIHdpemFyZEltYWdlRGVzY3JpcHRvcjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvZGVnZW5XaXphcmRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4ucmVzb3VyY2UuQ29kZWdlbiIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2RlZ2VuV2l6YXJkUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRXaXphcmRJbWFnZURlc2NyaXB0b3IoKXsKLQkgICAgaWYgKHdpemFyZEltYWdlRGVzY3JpcHRvcj09bnVsbCl7Ci0JICAgICAgICB3aXphcmRJbWFnZURlc2NyaXB0b3IgPUNvZGVnZW5XaXphcmRQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigiQXhpczJfQ29kZWdlbl9XaXphcmQiLCJpY29ucy9hc2YtZmVhdGhlci5naWYiKTsKLQkgICAgfQotCSAgICByZXR1cm4gd2l6YXJkSW1hZ2VEZXNjcmlwdG9yOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvQWJzdHJhY3RXaXphcmRQYWdlLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL0Fic3RyYWN0V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU5OThlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvQWJzdHJhY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLkNvZGVHZW5XaXphcmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWwuU2V0dGluZ3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2V0dGluZ3NDb25zdGFudHMgewotICAgIAotICAgIHByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyA9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBBYnN0cmFjdFdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKXsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUrIi5uYW1lIik7Ci0gICAgICAgIGluaXQocGFnZU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFN0cmluZyBwYWdlTmFtZSl7Ci0gICAgICAgIHNldFRpdGxlKENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcocGFnZU5hbWUrIi50aXRsZSIpKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhwYWdlTmFtZSsiLmRlc2MiKSk7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFdpemFyZEltYWdlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGFnZS4gSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBpbiB0aGUKLSAgICAgICAgICogUGx1Z2luJ3Mgc2V0dGluZ3MgZm9yIHRoaXMgT3B0aW9uc1BhZ2UsIGNyZWF0ZSBhIG5ldyBzZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgcm9vdFNldHRpbmdzID0gQ29kZWdlbldpemFyZFBsdWdpbi5nZXREZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSByb290U2V0dGluZ3MuZ2V0U2VjdGlvbih0aGlzLmdldENsYXNzKCkKLSAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0dGluZ3MgPSByb290U2V0dGluZ3MuYWRkTmV3U2VjdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3M9dHJ1ZTsKLSAgICAgICAgICAgIHNldHRpbmdzID0gc2VjdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotICAgIAlzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShtZXNzYWdlID09IG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKTsgCi0gICAKLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBhZ2VUeXBlKCkgOwotICAgIAotICAgIC8qKgotICAgICAqIGEgY29udmVuaWVudCBtZXRob2QgdG8gZ2V0IHRoZSB3aXphcmQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIENvZGVHZW5XaXphcmQgZ2V0Q29kZWdlbldpemFyZCgpewotICAgIAlyZXR1cm4gKENvZGVHZW5XaXphcmQpZ2V0V2l6YXJkKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhU291cmNlU2VsZWN0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhU291cmNlU2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTRkMjUwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWk7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLkNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhZ2V7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBjb250YWluZXI7Ci0gICAgcHJpdmF0ZSBUZXh0IGphdmFDbGFzc05hbWVCb3g7Ci0gICAgcHJpdmF0ZSBMaXN0IGphdmFDbGFzc3BhdGhMaXN0OwotICAgIHByaXZhdGUgTGFiZWwgc3RhdHVzTGFiZWw7Ci0KLSAgICBwdWJsaWMgSmF2YVNvdXJjZVNlbGVjdGlvblBhZ2UoKSB7ICAKLSAgICAJc3VwZXIoInBhZ2U0Iik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICAgc2V0dGluZ3MucHV0KEpBVkFfQ0xBU1NfTkFNRSwgIiIpOwotICAgICAgICBzZXR0aW5ncy5wdXQoSkFWQV9DTEFTU19QQVRIX0VOVFJJRVMsIG5ldyBTdHJpbmdbXXsiIn0pOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Db2RlZ2VuUGFnZSNnZXRQYWdlVHlwZSgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBVkFfMl9XU0RMX1RZUEU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gOTsKLQotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAKLSAgICAgICAgLy9jbGFzcyBuYW1lICBlbnRyeQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5jbGFzc25hbWUubGFiZWwiKSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3ggPSBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUik7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoSkFWQV9DTEFTU19OQU1FKSk7Ci0gICAgICAgIGphdmFDbGFzc05hbWVCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzTmFtZVRleHRDaGFuZ2UoKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIC8vY2xhc3MgcGF0aCBlbnRyeQotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3Bhbj0zOwotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQuY2xhc3NwYXRoLmxhYmVsIikpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBCdXR0b24gYWRkRGlyQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotICAgICAgICBhZGREaXJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGFkZERpckJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmFkZERpci5sYWJlbCIpKTsKLSAgICAgICAgYWRkRGlyQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgCQloYW5kbGVEaXJlY3RvcnlCcm93c2UoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBCdXR0b24gYWRkSmFyQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotICAgICAgICBhZGRKYXJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGFkZEphckJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmFkZEphci5sYWJlbCIpKTsKLSAgICAgICAgYWRkSmFyQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgCQloYW5kbGVGaWxlQnJvd3NlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgQnV0dG9uIHJlbW92ZUVudHJ5QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotICAgICAgICByZW1vdmVFbnRyeUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgcmVtb3ZlRW50cnlCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5yZW1vdmVFbnRyeS5sYWJlbCIpKTsKLSAgICAgICAgcmVtb3ZlRW50cnlCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0gICAgICAgIAlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAJCWhhbmRsZVJlbW92ZSgpOwotICAgICAgICAJfQotICAgICAgICB9KTsKLSAgICAgICAgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ2QudmVydGljYWxTcGFuID0gMjsKLSAgICAgICAgU2Nyb2xsZWRDb21wb3NpdGUgYzIgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICBjMi5zZXRFeHBhbmRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICAgICAgYzIuc2V0RXhwYW5kVmVydGljYWwoZmFsc2UpOwotCQljMi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJamF2YUNsYXNzcGF0aExpc3QgPSBuZXcgTGlzdChjMixTV1QuUkVBRF9PTkxZIHxTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJamF2YUNsYXNzcGF0aExpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChKQVZBX0NMQVNTX1BBVEhfRU5UUklFUywgbmV3IFN0cmluZ1tde30pOwotCQlqYXZhQ2xhc3NwYXRoTGlzdC5zZXRJdGVtcyhzZXR0aW5ncy5nZXRBcnJheShKQVZBX0NMQVNTX1BBVEhfRU5UUklFUykpOwotCQlqYXZhQ2xhc3NwYXRoTGlzdC5zZXRTaXplKDYwMCwgMjUwKTsKLQkJYzIuc2V0Q29udGVudChqYXZhQ2xhc3NwYXRoTGlzdCk7Ci0KLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgQnV0dG9uIHRyeUxvYWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuUFVTSCk7Ci0gICAgICAgIHRyeUxvYWRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHRyeUxvYWRCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC50cnlMb2FkLmxhYmVsIikpOwotICAgICAgICB0cnlMb2FkQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotICAgICAgICAJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgCQlqYXZhLnV0aWwuTGlzdCBlcnJvckxpc3RlbmVyID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAJCWlmICghQ2xhc3NGaWxlUmVhZGVyLnRyeUxvYWRpbmdDbGFzcyhnZXRDbGFzc05hbWUoKSwKLSAgICAgICAgCQkJCWdldENsYXNzUGF0aExpc3QoKSwKLSAgICAgICAgCQkJCWVycm9yTGlzdGVuZXIpKXsKLSAgICAgICAgCQkJSXRlcmF0b3IgaXQgPSBlcnJvckxpc3RlbmVyLml0ZXJhdG9yKCk7Ci0gICAgICAgIAkJCXdoaWxlKGl0Lmhhc05leHQoKSl7Ci0gICAgICAgIAkJCQlPYmplY3QgbmV4dE9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBuZXh0T2JqZWN0PT1udWxsP0NvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC51bmtub3duRXJyb3IubGFiZWwiKTpuZXh0T2JqZWN0LnRvU3RyaW5nKCk7Ci0JCQkJCQl1cGRhdGVTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCQkJCXVwZGF0ZVN0YXR1c1RleHRGaWVsZChmYWxzZSxlcnJvck1lc3NhZ2UpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJCQotICAgICAgICAJCX1lbHNlewotICAgICAgICAJCQl1cGRhdGVTdGF0dXNUZXh0RmllbGQodHJ1ZSxDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5zdWNjZXNzTG9hZGluZy5sYWJlbCIpKTsKLSAgICAgICAgCQkJdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIHN0YXR1c0xhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gICAgICAgIHN0YXR1c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAKLQkJLy9maWxsaW5nIGxhYmVsIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCUxhYmVsIGZpbGxMYWJlbDMgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlmaWxsTGFiZWwzLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOyAKLQkJTGFiZWwgaGludExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQloaW50TGFiZWwKLQkJCQkuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmhpbnQuY2FwdGlvbiIpKTsKLQkJaGludExhYmVsLnNldExheW91dERhdGEoZ2QpOwotLy8JCWhpbnRMYWJlbC5zZXRGb250KG5ldyBGb250KG5ldyBEZXZpY2UoKSB7Ci0vLwkJCXB1YmxpYyBpbnQgaW50ZXJuYWxfbmV3X0dDKEdDRGF0YSBkYXRhKSB7cmV0dXJuIDA7fQotLy8JCQlwdWJsaWMgdm9pZCBpbnRlcm5hbF9kaXNwb3NlX0dDKGludCBoYW5kbGUsIEdDRGF0YSBkYXRhKSB7fQotLy8JCQkJCQkJCQkJCX0sImhpbnRGb250Iiw4LFNXVC5OT1JNQUwpKTsKLSAgICAgICAgCi0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzKXsKLSAgICAgICAgICAgIGhhbmRsZUNsYXNzTmFtZVRleHRDaGFuZ2UoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogUG9wcyB1cCB0aGUgZmlsZSBicm93c2UgZGlhbG9nIGJveAotICAgICAqICAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGlyZWN0b3J5QnJvd3NlKCkgewotICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2codGhpcy5nZXRTaGVsbCgpKTsKLSAgICAgICAgU3RyaW5nIGRpck5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKGRpck5hbWUgIT0gbnVsbCkgewotICAgICAgICAJaWYgKCFjaGVja0ZpbGVuYW1lRXhpc3RzSW5MaXN0KGRpck5hbWUpKXsgIAotICAgICAgICAJCWphdmFDbGFzc3BhdGhMaXN0LmFkZChkaXJOYW1lKTsKLSAgICAgICAgCQl1cGRhdGVMaXN0RW50cmllcygpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZChmYWxzZSwiIik7Ci0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFBvcHMgdXAgdGhlIGZpbGUgYnJvd3NlIGRpYWxvZyBib3gKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKLSAgICAgICAgaW50W10gc2VsZWN0aW9uSW5kaWNlcyA9IGphdmFDbGFzc3BhdGhMaXN0LmdldFNlbGVjdGlvbkluZGljZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8c2VsZWN0aW9uSW5kaWNlcy5sZW5ndGg7aSsrKXsKLSAgICAgICAgCWphdmFDbGFzc3BhdGhMaXN0LnJlbW92ZShzZWxlY3Rpb25JbmRpY2VzW2ldKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVMaXN0RW50cmllcygpOwotICAgICAgICB1cGRhdGVTdGF0dXNUZXh0RmllbGQoZmFsc2UsIiIpOwotICAgIH0KLSAgICAKLSAgIAotICAgIC8qKgotICAgICAqIFBvcHMgdXAgdGhlIGZpbGUgYnJvd3NlIGRpYWxvZyBib3gKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbGVCcm93c2UoKSB7Ci0gICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117IiouamFyIn0pOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgCWlmICghY2hlY2tGaWxlbmFtZUV4aXN0c0luTGlzdChmaWxlTmFtZSkpewotICAgICAgICAgICAgCWphdmFDbGFzc3BhdGhMaXN0LmFkZChmaWxlTmFtZSk7Ci0gICAgICAgICAgICAJdXBkYXRlTGlzdEVudHJpZXMoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICB1cGRhdGVTdGF0dXNUZXh0RmllbGQoZmFsc2UsIiIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXRob2QgY2hlY2tzIHRoZSBsaXN0IGFudHJpZXMgYW5kIGNvbXBhcmUgdGhhdCB0byB0aGUgZmlsZSBuYW1lIAotICAgICAqIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgY29tcGFyaXNvbgotICAgICAqIEBwYXJhbSBmaWxlbmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlbmFtZUV4aXN0c0luTGlzdChTdHJpbmcgZmlsZW5hbWUpewotICAgIAlTdHJpbmdbXSBhcnJheSA9IGphdmFDbGFzc3BhdGhMaXN0LmdldEl0ZW1zKCk7Ci0KLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFycmF5W2ldLmVxdWFscyhmaWxlbmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXNUZXh0RmllbGQoYm9vbGVhbiBzdWNjZXNzLFN0cmluZyB0ZXh0KXsKLSAgICAJaWYgKHN1Y2Nlc3MpewotICAgIAkJZ2V0Q29kZWdlbldpemFyZCgpLnNldERlZmF1bHROYW1lc3BhY2VzKGphdmFDbGFzc05hbWVCb3guZ2V0VGV4dCgpKTsKLSAgICAJfQotICAgICAJc3RhdHVzTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpc3RFbnRyaWVzKCl7Ci0gICAgCXNldHRpbmdzLnB1dChKQVZBX0NMQVNTX1BBVEhfRU5UUklFUyxqYXZhQ2xhc3NwYXRoTGlzdC5nZXRJdGVtcygpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NOYW1lVGV4dENoYW5nZSgpewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gamF2YUNsYXNzTmFtZUJveC5nZXRUZXh0KCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChKQVZBX0NMQVNTX05BTUUsY2xhc3NOYW1lKTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZT09bnVsbCB8fCAiIi5lcXVhbHMoY2xhc3NOYW1lLnRyaW0oKSkpewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5lcnJvci5pbnZhbGlkQ2xhc3NOYW1lIikpOwotICAgICAgICB9ZWxzZSBpZihjbGFzc05hbWUuZW5kc1dpdGgoIi4iKSl7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmVycm9yLkNsYXNzTmFtZU5vdFRlcm1pbmF0ZWQiKSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAJLy9qdXN0IGxlYXZlIGl0Ci0gICAgICAgICAgICAvL3VwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKXsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc05hbWVCb3guZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aExpc3QoKXsKLSAgICAgICAgcmV0dXJuIGphdmFDbGFzc3BhdGhMaXN0LmdldEl0ZW1zKCk7Ci0gICAgfQotICAgIAotICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL0phdmFXU0RMT3B0aW9uc1BhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVdTRExPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJlZTJiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVdTRExPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLk5hbWVzcGFjZUZpbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoKLSAqIFVzYWdlIGphdmEyd3NkbCAtY24gPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lPiA6IGNsYXNzIGZpbGUgbmFtZSAtbyA8b3V0cHV0Ci0gKiBMb2NhdGlvbj4gOiBvdXRwdXQgZmlsZSBsb2NhdGlvbiAtY3AgPGNsYXNzIHBhdGggdXJpPiA6IGxpc3Qgb2YgY2xhc3NwYXRoCi0gKiBlbnRyaWVzIC0gKHVybHMpIC10biA8dGFyZ2V0IG5hbWVzcGFjZT4gOiB0YXJnZXQgbmFtZXNwYWNlIC10cCA8dGFyZ2V0Ci0gKiBuYW1lc3BhY2UgcHJlZml4PiA6IHRhcmdldCBuYW1lc3BhY2UgcHJlZml4IC1zdG4gPHNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlPiA6Ci0gKiB0YXJnZXQgbmFtZXNwYWNlIGZvciBzY2hlbWEgLXN0cCA8c2NoZW1hIHRhcmdldCBuYW1lc3BhY2UgcHJlZml4PiA6IHRhcmdldAotICogbmFtZXNwYWNlIHByZWZpeCBmb3Igc2NoZW1hIC1zbiA8c2VydmljZSBuYW1lPiA6IHNlcnZpY2UgbmFtZSAtb2YgPG91dHB1dAotICogZmlsZSBuYW1lPiA6IG91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBXU0RMCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE9wdGlvbnNQYWdlIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCB0YXJnZXROYW1lc3BhY2VUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgc2NoZW1hVGFyZ2V0TmFtZXBhY2VUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgc2VydmljZU5hbWVUZXh0OwotCi0JLy8gVE9ETyBuZWVkIG1vcmUgaGVyZQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkFic3RyYWN0V2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1RBUkdFVF9OUywiIiApOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1RBUkdFVF9OU19QUkVGLCAiIik7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OUywgIiIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlNfUFJFRiwgIiIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NFUlZJQ0VfTkFNRSwgIiIpOwotCi0JfQotCi0JCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlRGVmYXVsdHMoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLQkJCi0JCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0VGV4dChOYW1lc3BhY2VGaW5kZXIuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbUNsYXNzKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSk7Ci0JCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5zZXRUZXh0KE5hbWVzcGFjZUZpbmRlci5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3MoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpKTsKLQkJCi0JCXRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuc2V0VGV4dChOYW1lc3BhY2VGaW5kZXIuZ2V0RGVmYXVsdE5hbWVzcGFjZVByZWZpeCgpKTsKLQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4VGV4dC5zZXRUZXh0KE5hbWVzcGFjZUZpbmRlci5nZXREZWZhdWx0U2NoZW1hTmFtZXNwYWNlUHJlZml4KCkpOwotCQkKLS8vCQlzZXJ2aWNlTmFtZVRleHQuc2V0VGV4dChmdWxseVF1YWxpZmllZENsYXNzTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCJfIikpOwotCQlzZXJ2aWNlTmFtZVRleHQuc2V0VGV4dChOYW1lc3BhY2VGaW5kZXIuZ2V0U2VydmljZU5hbWVUZXh0KGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKYXZhV1NETE9wdGlvbnNQYWdlKCkgewotCQlzdXBlcigicGFnZTUiKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Db2RlZ2VuUGFnZSNnZXRQYWdlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLQkJcmV0dXJuIEpBVkFfMl9XU0RMX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUudGFyZ2V0TmFtZXNwYWNlLmxhYmVsIikpOwotCi0JCXRhcmdldE5hbWVzcGFjZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0pBVkFfVEFSR0VUX05TKSk7Ci0JCXRhcmdldE5hbWVzcGFjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MKLQkJCQkJCS5wdXQoUFJFRl9KQVZBX1RBUkdFVF9OUywgdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkpOwotCQkJCS8vIGRpYWxvZ0NoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUudGFyZ2V0TmFtZXNwYWNlUHJlZml4LmxhYmVsIikpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LnNldFRleHQoc2V0dGluZ3MKLQkJCQkuZ2V0KFBSRUZfSkFWQV9UQVJHRVRfTlNfUFJFRikpOwotCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldHRpbmdzLnB1dChQUkVGX0pBVkFfVEFSR0VUX05TX1BSRUYsCi0JCQkJCQl0YXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmdldFRleHQoKSk7Ci0JCQkJLy8gZGlhbG9nQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5zY2hlbWFUYXJnZXROcy5sYWJlbCIpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzY2hlbWFUYXJnZXROYW1lcGFjZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlzY2hlbWFUYXJnZXROYW1lcGFjZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5zZXRUZXh0KHNldHRpbmdzCi0JCQkJLmdldChQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OU19QUkVGKSk7Ci0JCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlNfUFJFRiwKLQkJCQkJCXNjaGVtYVRhcmdldE5hbWVwYWNlVGV4dC5nZXRUZXh0KCkpOwotCQkJCS8vIGRpYWxvZ0NoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUuc2NoZW1hVGFyZ2V0TnNQcmVmaXgubGFiZWwiKSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4VGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCXNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuc2V0VGV4dChzZXR0aW5ncwotCQkJCS5nZXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlMpKTsKLQkJc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlMsCi0JCQkJCQlzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmdldFRleHQoKSk7Ci0JCQkJLy8gZGlhbG9nQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5zZXJ2aWNlTmFtZS5sYWJlbCIpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzZXJ2aWNlTmFtZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlzZXJ2aWNlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlcnZpY2VOYW1lVGV4dC5zZXRUZXh0KHNldHRpbmdzCi0JCQkJLmdldChQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OUykpOwotCQlzZXJ2aWNlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9TRVJWSUNFX05BTUUsCi0JCQkJCQlzZXJ2aWNlTmFtZVRleHQuZ2V0VGV4dCgpKTsKLQkJCQlkaWFsb2dDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJCi0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldE5hbWVzcGFjZVByZWZpeFRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFUYXJnZXROYW1lcGFjZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXhUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZXJ2aWNlTmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZSB0aGUgZGlhbG9nIGNoYW5nZSBldmVudC4gQmFzaWNhbGx5IGV2YWx1YXRlcyB0aGUgZmlsZSBuYW1lIGFuZAotICAgICAqIHNldHMgdGhlIGVycm9yIG1lc3NhZ2UgYWNjb3JkaW5nbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlhbG9nQ2hhbmdlZCgpIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0U2VydmljZU5hbWUoKTsKLQotICAgICAgICBpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKENvZGVnZW5XaXphcmRQbHVnaW4KLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5lcnJvci5maWxlbWlzc2luZ2Vycm9yIikpOwotICAgICAgICAgICAgcmV0dXJuOwotCX0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0dXMKLSAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9KYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg2ODRmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvSmF2YVdTRExPdXRwdXRMb2NhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnBsdWdpbi5Db2RlZ2VuV2l6YXJkUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJTZWxlY3Rpb25EaWFsb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRleHQgb3V0cHV0Rm9sZGVyVGV4dEJveDsKLQotCXByaXZhdGUgVGV4dCBvdXRwdXRGaWxlTmFtZVRleHRCb3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiB3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uOwotCi0JcHJpdmF0ZSBib29sZWFuIHdvcmtzcGFjZVNhdmVPcHRpb24gPSBmYWxzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBKYXZhV1NETE91dHB1dExvY2F0aW9uUGFnZSgpIHsKLQkJc3VwZXIoInBhZ2U2Iik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5BYnN0cmFjdFdpemFyZFBhZ2UjaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfV1NETF9MT0NBVElPTiwgIiIpOwotCQlzZXR0aW5ncy5wdXQoSkFWQV9PVVRQVVRfV1NETF9OQU1FLCAic2VydmljZXMud3NkbCIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNLCB0cnVlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFLCBmYWxzZSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkFic3RyYWN0V2l6YXJkUGFnZSNnZXRQYWdlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLQkJcmV0dXJuIEpBVkFfMl9XU0RMX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkvL2xheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCUxhYmVsIHNlbGVjdExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlzZWxlY3RMYWJlbAotCQkJCS5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0IHRoZSBsb2NhdGlvbiB3aGVyZSB0byBwdXQgdGhlIG91dHB1dCIpKTsKLQkJc2VsZWN0TGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUkFESU8pOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi53b3Jrc3BhY2UuY2FwdGlvbiIpKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYud29ya3NwYWNlLmRlc2MiKSk7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncwotCQkJCS5nZXRCb29sZWFuKFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFKSk7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQloYW5kbGVDaGVja2JveFNlbGVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUkFESU8pOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5maWxlc3lzdGVtLmNhcHRpb24iKSk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLnNldFRvb2xUaXBUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LmZpbGVzeXN0ZW0uZGVzYyIpKTsKLQkJZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNKSk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwxLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYub3V0cHV0LmxhYmVsIikpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW91dHB1dEZvbGRlclRleHRCb3ggPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlvdXRwdXRGb2xkZXJUZXh0Qm94LnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRGb2xkZXJUZXh0Qm94LnNldFRleHQoIiIpOwotCQlvdXRwdXRGb2xkZXJUZXh0Qm94LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWhhbmRsZUZvbGRlclRleHRDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoImdlbmVyYWwuYnJvd3NlIikpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5vdXRwdXRuYW1lLmxhYmVsIikpOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJb3V0cHV0RmlsZU5hbWVUZXh0Qm94ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSKTsKLQkJb3V0cHV0RmlsZU5hbWVUZXh0Qm94LnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRGaWxlTmFtZVRleHRCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoSkFWQV9PVVRQVVRfV1NETF9OQU1FKSk7Ci0JCW91dHB1dEZpbGVOYW1lVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQloYW5kbGVGaWxlTmFtZVRleHRDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpIHsKLQkJCWhhbmRsZUZvbGRlclRleHRDaGFuZ2UoKTsKLQkJCWhhbmRsZUZvbGRlclRleHRDaGFuZ2UoKTsKLQkJfQotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDaGVja2JveFNlbGVjdGlvbigpIHsKLQkJaWYgKHdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX09VVFBVVF9XT1JLU1BBQ0UsIHRydWUpOwotCQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfRklMRVNZQVRFTSwgZmFsc2UpOwotCQkJd29ya3NwYWNlU2F2ZU9wdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0pBVkFfT1VUUFVUX0ZJTEVTWUFURU0sIHRydWUpOwotCQkJc2V0dGluZ3MucHV0KFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCQl3b3Jrc3BhY2VTYXZlT3B0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRm9sZGVyVGV4dENoYW5nZSgpIHsKLQkJU3RyaW5nIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlclRleHRCb3guZ2V0VGV4dCgpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9KQVZBX09VVFBVVF9XU0RMX0xPQ0FUSU9OLCBvdXRwdXRGb2xkZXIpOwotCQlpZiAoIiIuZXF1YWxzKG91dHB1dEZvbGRlci50cmltKCkpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoIklucHV0IGEgcHJvcGVyIGxvY2F0aW9uIGZvciB0aGUgb3V0cHV0Iik7Ci0JCX0gZWxzZSB7Ci0JCQl1cGRhdGVTdGF0dXMobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRmlsZU5hbWVUZXh0Q2hhbmdlKCkgewotCQlTdHJpbmcgb3V0RmlsZU5hbWUgPSBvdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotCQlzZXR0aW5ncy5wdXQoSkFWQV9PVVRQVVRfV1NETF9OQU1FLCBvdXRGaWxlTmFtZSk7Ci0JCWlmICgiIi5lcXVhbHMob3V0RmlsZU5hbWUudHJpbSgpKSkgewotCQkJdXBkYXRlU3RhdHVzKCJJbnB1dCBhIGZpbGUgbmFtZSIpOwotCQl9IGVsc2UgaWYgKG91dEZpbGVOYW1lLm1hdGNoZXMoIlxcVyIpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoIklucHV0IGEgdmFsaWQgZmlsZSBuYW1lIik7Ci0JCX0gZWxzZSBpZiAoIShvdXRGaWxlTmFtZS5lbmRzV2l0aCgiLndzZGwiKSB8fCBvdXRGaWxlTmFtZS5lbmRzV2l0aCgiLnhtbCIpKSApIHsKLQkJCXVwZGF0ZVN0YXR1cygiSW5wdXQgYSB2YWxpZCBmaWxlIG5hbWUgLCBFeGFtcGxlIDogc2VydmljZXMud3NkbCBvciBzZXJ2aWNlcy54bWwiKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKSB7Ci0KLQkJLy8gICAgCWJvb2xlYW4gbG9jYXRpb24gPSBsb2NhdGlvblNlbGVjdENoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGxvY2F0aW9uID0gZmFsc2U7Ci0JCWlmKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNKSl7Ci0JCQlsb2NhdGlvbiA9IGZhbHNlOwotCQl9ZWxzZSBpZihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfSkFWQV9PVVRQVVRfV09SS1NQQUNFKSl7Ci0JCQlsb2NhdGlvbiA9IHRydWU7Ci0JCX0KLQkJaWYgKHdvcmtzcGFjZVNhdmVPcHRpb24pIHsKLQkJCWxvY2F0aW9uID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWxvY2F0aW9uKSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotCQkJU3RyaW5nIHJldHVyblN0cmluZyA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAocmV0dXJuU3RyaW5nICE9IG51bGwpIHsKLQkJCQlvdXRwdXRGb2xkZXJUZXh0Qm94LnNldFRleHQocmV0dXJuU3RyaW5nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCQlDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZygKLQkJCQkJZ2V0U2hlbGwoKSwgcm9vdCwgZmFsc2UsIENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNvbnRhaW5lcmJveC50aXRsZSIpKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5PSykgewotCQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAxKSB7Ci0JCQkJCVBhdGggcGF0aCA9ICgoUGF0aCkgcmVzdWx0WzBdKTsKLQkJCQkJLy8gYXBwZW5kIHRvIHRoZSB3b3Jrc3BhY2UgcGF0aAotCQkJCQlpZiAocm9vdC5leGlzdHMocGF0aCkpIHsKLQkJCQkJCW91dHB1dEZvbGRlclRleHRCb3guc2V0VGV4dChyb290LmdldExvY2F0aW9uKCkuYXBwZW5kKAotCQkJCQkJCQlwYXRoKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbEZpbGVOYW1lKCkgewotCQlTdHJpbmcgZm9sZGVyID0gdGhpcy5vdXRwdXRGb2xkZXJUZXh0Qm94LmdldFRleHQoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotCQlpZiAoIWZpbGVOYW1lLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lICsgIi53c2RsIjsKLQkJfQotCQlyZXR1cm4gZm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFdTRExOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm91dHB1dEZvbGRlclRleHRCb3guZ2V0VGV4dCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9PcHRpb25zUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9PcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ0MGY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWwuVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLldTRExQcm9wZXJ0eVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogT3B0aW9ucyBQYWdlIGxldHMgdGhlIHVzZXIgY2hhbmdlIGdlbmVyYWwgc2V0dGluZ3Mgb24gdGhlIGNvZGUgZ2VuZXJhdGlvbi4gSXQKLSAqIGlzIHVzZWQgaW4gdGhlIENvZGVnZW5XaXphcmRQbHVnaW4sIENvZGVHZW5XaXphcmQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbnNQYWdlIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYWdlIGltcGxlbWVudHMgVUlDb25zdGFudHMgewotCi0JLyoqCi0JICogU2VsZWN0aW9uIGxpc3QgZm9yIHRhcmdldCBsYW5ndWFnZXMKLQkgKi8KLQlwcml2YXRlIENvbWJvIGxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3g7Ci0KLQkvKioKLQkgKiBBIHJhZGlvIGJ1dHRvbiB0byBlbmFibGUvZGlzYWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yIHN5bmNocm9ub3VzIGFuZAotCSAqIGFzeW5jaHJvbm91cyBjYWxscy4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIEEgcmFkaW8gYnV0dG9uIHRvIGNob29zZSAic3luY2hyb25vdXMgb25seSIgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gc3luY09ubHlSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIEEgcmFkaW8gYnV0dG9uIHRvIGNob29zZSAiYXN5bmNocm9ub3VzIG9ubHkiIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGFzeW5jT25seVJhZGlvQnV0dG9uOwotCi0JLyoqCi0JICogTGFiZWwgaG9sZGluZyB0aGUgZnVsbCBxdWFsaWZpZWQgcGFja2FnZSBuYW1lIGZvciBnZW5lcmF0ZWQgY29kZQotCSAqLwotCXByaXZhdGUgVGV4dCBwYWNrYWdlVGV4dDsKLQotCS8qKgotCSAqIENoZWNrYm94IHRvIGVuYWJsZSBzZXJ2ZXItc2lkZSBza2VsZXRvbiBjb2RlIGdlbmVyYXRpb24uIElmIGVuYWJsZWQsCi0JICogZ2VuZXJhdGVzIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uOwotCQotCS8qKgotCSAqIENoZWNrYm94IHRvIGVuYWJsZSBjbGllbnQgc2lkZSBjb2RlIGdlbmVyYXRpb24uIElmIGVuYWJsZWQsCi0JICogZ2VuZXJhdGVzIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uOwotCi0JLyoqCi0JICogQ2hlY2tib3ggdG8gZW5hYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRlc3QgY2FzZSBjbGFzc2VzIGZvciB0aGUgZ2VuZXJhdGVkCi0JICogaW1wbGVtZW50YXRpb24gb2YgdGhlIHdlYnNlcnZpY2UuCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gdGVzdENhc2VDaGVja0JveEJ1dHRvbjsKLQotCS8qKgotCSAqIENoZWNrYm94IHRvIGVuYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIGRlZmF1bHQgc2VydmVyLnhtbCBjb25maWd1cmF0aW9uCi0JICogZmlsZQotCSAqLwotCXByaXZhdGUgQnV0dG9uIHNlcnZlclhNTENoZWNrQm94QnV0dG9uOwotCi0JLyoqCi0JICogQ2hlY2tib3ggdG8gZW5hYmxlIHRoZSBnZW5lcmF0ZSBhbGwgY2xhc3NlcwotCSAqLwotCXByaXZhdGUgQnV0dG9uIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b247Ci0JCi0JLyoqCi0JICogIGNoZWNrIGJveCBmb3Igc2VydmVyIHNpZGUgaW50ZXJmYWNlCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b247Ci0KLQlwcml2YXRlIENvbWJvIGRhdGFiaW5kaW5nVHlwZUNvbWJvOwotCi0JLyoqCi0JICogVGV4dCBib3ggdG8gaGF2ZSB0aGUgcG9ydG5hbWUKLQkgKi8KLQlwcml2YXRlIENvbWJvIHBvcnROYW1lQ29tYm87Ci0KLQkvKioKLQkgKiBUZXh0IGJveCB0byBoYXZlIHRoZSBzZXJ2aWNlIG5hbWUKLQkgKi8KLQlwcml2YXRlIENvbWJvIHNlcnZpY2VOYW1lQ29tYm87Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYWR2YW5jZU9wdGlvbnNCdXR0b247Ci0KLQlwcml2YXRlIFdTRExQcm9wZXJ0eVJlYWRlciByZWFkZXI7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHNlcnZpY2VRTmFtZUxpc3QgPSBudWxsOwotCQotCXByaXZhdGUgZmluYWwgaW50IEVESVRBQkxFQ09MVU1OID0gMTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0UGFja2FnZU5hbWUgPSBudWxsOwotCQotCXByaXZhdGUgQ29tYm8gY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94OwotCQotCS8qKgotCSAqIEEgdGFibGUgdG8ga2VlcCB0aGUgbmFtZXNwYWNlIHRvIAotCSAqIHBhY2thZ2UgbWFwcGluZ3MKLQkgKi8KLQlwcml2YXRlIFRhYmxlIG5hbWVzcGFjZTJwYWNrYWdlVGFibGUgPSBudWxsOwotCQotCXByaXZhdGUgSGFzaE1hcCBhZHZhbmNlT3B0aW9uczsKLQkKLQlDb21wb3NpdGUgY29udGFpbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFnZSBhbmQgaW5pdGlhbGl6ZSBzb21lIHNldHRpbmdzCi0JICovCi0JcHVibGljIE9wdGlvbnNQYWdlKCkgewotCQlzdXBlcigicGFnZTIiKTsKLQkJYWR2YW5jZU9wdGlvbnM9Z2V0SW5pdGlhbGlzZWRBZHZhbmNlT3B0aW9ucygpOwotCX0KLQotCXByaXZhdGUgSGFzaE1hcCBnZXRJbml0aWFsaXNlZEFkdmFuY2VPcHRpb25zKCl7Ci0JCUhhc2hNYXAgYWR2YW5jZU9wdGlvbnM9bmV3IEhhc2hNYXAoKTsKLQkJYWR2YW5jZU9wdGlvbnMucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04sIG5ldyBTdHJpbmdbMF0pOwotCQlyZXR1cm4gYWR2YW5jZU9wdGlvbnM7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgT3B0aW9ucyBwYWdlCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfU0VSVkVSQ09ORklHLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsIGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UsIGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfTEFOR1VBR0VfSU5ERVgsIDApOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9QQUNLQUdFX05BTUUsIERFRkFVTFRfUEFDS0FHRU5BTUUpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9SQURJT19BU1lOQ19PTkxZLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX1JBRElPX1NZTkNfQU5EX0FTWU5DLCB0cnVlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfUkFESU9fU1lOQ19PTkxZLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NPTUJPX1BPUlROQU1FX0lOREVYLCAwKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ09NQk9fU0VSVklDRU5BTUVfSU5ERVgsIDApOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9EQVRBQklOREVSX0lOREVYLCAwKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfR0VOX0FMTCwgZmFsc2UpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9HRU5fU1NfSU5URVJGQUNFLCBmYWxzZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkgICAgbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5vcHRpb25zLmRlc2MiKSk7Ci0JICAgIGxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCSAgICAKLQkgICAgICAgIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94ID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTnwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQkvLyBmaWxsIHRoZSBjb21ibwotCQl0aGlzLmZpbGxDb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3goKTsKLQkJY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94LnNldExheW91dERhdGEoZ2QpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DT0RFR0VOX09QVElPTl9JTkRFWCwgY29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94Ci0JCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQljb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guc2VsZWN0KHNldHRpbmdzLmdldEludChQUkVGX0NPREVHRU5fT1BUSU9OX0lOREVYKSk7Ci0JCWNvZGVnZW5PcHRpb25TZWxlY3Rpb25Db21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ09ERUdFTl9PUFRJT05fSU5ERVgsIGNvZGVnZW5PcHRpb25TZWxlY3Rpb25Db21ib0JveAotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWlmIChjb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3gKLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgKXsKLQkJCQkJZGlzYWJsZUNvbnRyb2xzKCk7Ci0JCQkJCQotCQkJCX1lbHNlIGlmIChjb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3gKLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpID09IDEpewotCQkJCQllbmFibGVDb250cm9scygpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQkKLQkJCQotCQkJCi0JCQkKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbDEuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5sYW5ndWFnZS5jYXB0aW9uIikpOwotCi0JCWxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3ggPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuRFJPUF9ET1dOfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCS8vIGZpbGwgdGhlIGNvbWJvCi0JCXRoaXMuZmlsbExhbmd1YWdlQ29tYm8oKTsKLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZWxlY3Qoc2V0dGluZ3MuZ2V0SW50KFBSRUZfTEFOR1VBR0VfSU5ERVgpKTsKLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfTEFOR1VBR0VfSU5ERVgsIGxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3gKLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvLyBzZXJ2aWNlIG5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuc2VydmljZU5hbWUuY2FwdGlvbiIpKTsKLQotCQlzZXJ2aWNlTmFtZUNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTiB8IFNXVC5CT1JERVIKLQkJCQl8IFNXVC5SRUFEX09OTFkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNlcnZpY2VOYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCS8vIHNlcnZpY2VOYW1lQ29tYm8uc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9URVhUX1NFUlZJQ0VOQU1FKSk7Ci0JCXNlcnZpY2VOYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCwgc2VydmljZU5hbWVDb21ibwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCS8vIHJlbG9hZCB0aGUgcG9ydE5hbWUgbGlzdAotCQkJCWxvYWRQb3J0TmFtZXMoKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkvLyBwb3J0IG5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIucG9ydE5hbWUuY2FwdGlvbiIpKTsKLQkJcG9ydE5hbWVDb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlwb3J0TmFtZUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCXBvcnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DT01CT19QT1JUTkFNRV9JTkRFWCwgcG9ydE5hbWVDb21ibwotCQkJCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCS8vIERhdGFiaW5kaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLmRhdGFiaW5kaW5nQ2hlY2suY2FwdGlvbiIpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkRST1BfRE9XTiB8IFNXVC5CT1JERVIKLQkJCQl8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbERhdGFiaW5kZXJDb21ibygpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5zZWxlY3Qoc2V0dGluZ3MuZ2V0SW50KFBSRUZfREFUQUJJTkRFUl9JTkRFWCkpOwotCQlkYXRhYmluZGluZ1R5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfREFUQUJJTkRFUl9JTkRFWCwgZGF0YWJpbmRpbmdUeXBlQ29tYm8KLQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCQkJfTsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX07Ci0JCX0pOwotCQkKLQkJLy8gcGFja2FnZSBuYW1lCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLnBhY2thZ2UuY2FwdGlvbiIpKTsKLQkJcGFja2FnZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJcGFja2FnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZTsKLQkJU3RyaW5nIHN0b3JlZFBhY2thZ2VOYW1lID0gc2V0dGluZ3MuZ2V0KFBSRUZfUEFDS0FHRV9OQU1FKTsKLQkJdGhpcy5kZWZhdWx0UGFja2FnZU5hbWUgPSBzdG9yZWRQYWNrYWdlTmFtZTsKLQkJaWYgKHN0b3JlZFBhY2thZ2VOYW1lLmVxdWFscygiIikpIHsKLQkJCXBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZSgiIik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWNrYWdlTmFtZSA9IHN0b3JlZFBhY2thZ2VOYW1lOwotCQl9Ci0JCQotCQkvL2lmIHRoZSBwYWNrYWdlIG5hbWUgc29tZWhvdyB0dXJuZWQgb3V0IHRvIGJlIG51bGwgc2V0IGl0IHRvIAotCQkvL2RlZmF1bHQgcGFja2FnZQotCQlpZiAocGFja2FnZU5hbWU9PW51bGwpcGFja2FnZU5hbWU9VVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLQkJCi0JCXBhY2thZ2VUZXh0LnNldFRleHQocGFja2FnZU5hbWUpOyAvLyBnZXQgdGhpcyB0ZXh0IGZyb20gdGhlCi0JCS8vIFVSTFByb2Nlc3NvcgotCQlwYWNrYWdlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQloYW5kbGVDdXN0b21QYWNrYWdlTmFtZU1vZGlmeUV2ZW50KCk7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfUEFDS0FHRV9OQU1FLCBwYWNrYWdlVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQkvLyBnZW5lcmF0ZSB0ZXN0IGNhc2Ugb3B0aW9uCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJdGVzdENhc2VDaGVja0JveEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uCi0JCQkJLnNldFRleHQob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi50ZXN0Y2FzZS5jYXB0aW9uIikpOwotCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncwotCQkJCS5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UpKTsKLQkJdGVzdENhc2VDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UsCi0JCQkJCQl0ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCS8vY2xlaW50IHNpZGUgbGFiZWwgCi0vLwkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0vLwkJTGFiZWwgbGJsQ2xpZW50c2lkZSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLS8vCQlsYmxDbGllbnRzaWRlLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotLy8JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5jbGllbnRzaWRlLmNhcHRpb24iKSk7Ci0vLwkJbGJsQ2xpZW50c2lkZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCS8vY2xlaW50IHNpZGUgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCWNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuY2xpZW50c2lkZS5jYXB0aW9uIikpOwotCQljbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFKSk7Ci0JCWNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2xpZW50c2lkZVNlbGVjdGlvbigpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX0NMSUVOVFNJREUsCi0JCQkJCQljbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCi0JCS8vY2xpZW50IHNpZGUgYnV0dG9ucwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLnN5bmNBc3luYy5jYXB0aW9uIikpOwotCQlzeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLQkJCQkuZ2V0Qm9vbGVhbihQUkVGX1JBRElPX1NZTkNfQU5EX0FTWU5DKSk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCXN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9SQURJT19TWU5DX0FORF9BU1lOQywgc3luY0FuZEFzeW5jUmFkaW9CdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzeW5jT25seVJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5zeW5jLmNhcHRpb24iKSk7Ci0JCXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9SQURJT19TWU5DX09OTFkpKTsKLQkJc3luY09ubHlSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfUkFESU9fU1lOQ19PTkxZLCBzeW5jT25seVJhZGlvQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlhc3luY09ubHlSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuYXN5bmMuY2FwdGlvbiIpKTsKLQkJYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9SQURJT19BU1lOQ19PTkxZKSk7Ci0JCWFzeW5jT25seVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9SQURJT19BU1lOQ19PTkxZLCBhc3luY09ubHlSYWRpb0J1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsMSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWZpbGxMYWJlbDEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkKLQkJLy8gU2VydmVyIHNpZGUgY2hlY2sgYm94Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCXNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuc2VydmVyc2lkZS5jYXB0aW9uIikpOwotCQlzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFKSk7Ci0JCXNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VydmVyc2lkZVNlbGVjdGlvbigpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsCi0JCQkJCQlzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQkvLyBTZXJ2ZXIgc2lkZSBzZXJ2aWNlcyB4bWwKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQlzZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUcpKTsKLQkJc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5zZXJ2aWNlWE1MLmNhcHRpb24iKSk7Ci0JCXNlcnZlclhNTENoZWNrQm94QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUcsCi0JCQkJCQlzZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5nZXRFbmFibGVkKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCi0JCS8vdGhlIHNlcnZlciBzaWRlIGludGVyZmFjZSBvcHRpb24KLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlnZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9HRU5fU1NfSU5URVJGQUNFKSk7Ci0JCWdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuc3NJbnRlcmZhY2UuY2FwdGlvbiIpKTsKLQkJZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldHRpbmdzLnB1dChQUkVGX0dFTl9TU19JTlRFUkZBQ0UsIGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsMiA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWZpbGxMYWJlbDIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvLyBnZW5lcmF0ZSBhbGwKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9HRU5fQUxMKSk7Ci0JCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5nZW5BbGwuY2FwdGlvbiIpKTsKLQkJZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfR0VOX0FMTCwgZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQloYW5kbGVHZW5lcmF0ZUFsbFNlbGVjdGlvbigpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQkJCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBmaWxsTGFiZWwzID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsMy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLwkJIERhdGFiaW5kaW5nCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLm5hbWVzcGFjZTJQa2cuY2FwdGlvbiIpKTsKLQkJCi0JCS8vYWRkIGEgdGFibGUgdG8gc2V0IG5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmcKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBnZC52ZXJ0aWNhbFNwYW4gPSA1OwotICAgICAgICAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZSA9IG5ldyBUYWJsZShjb250YWluZXIsU1dULkJPUkRFUnxTV1QuTVVMVEkpOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgICAgIAotICAgICAgICBkZWNsYXJlQ29sdW1uKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUsCi0gICAgICAgIAkJMzUwLCAvL2EgZGVmYXVsdCB3aWR0aCB1bnRpbCB3ZSBhZGp1c3QKLSAgICAgICAgCQlDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5uYW1lc3BhY2UuY2FwdGlvbiIpKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbihuYW1lc3BhY2UycGFja2FnZVRhYmxlLAotICAgICAgICAJCTIwMCwvL2EgZGVmYXVsdCB3aWR0aCB1bnRpbCB3ZSBhZGp1c3QKLSAgICAgICAgCQlDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5wYWNrYWdlLmNhcHRpb24iKSk7Ci0gICAgICAgIAotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBhZGQgdGhlIHRhYmxlIGVkaXRvcgotICAgICAgICBmaW5hbCBUYWJsZUVkaXRvciBlZGl0b3IgPSBuZXcgVGFibGVFZGl0b3IobmFtZXNwYWNlMnBhY2thZ2VUYWJsZSk7Ci0gICAgICAgIGVkaXRvci5zZXRDb2x1bW4oMSk7Ci0gICAgICAgIGVkaXRvci5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0gICAgICAgIGVkaXRvci5ncmFiSG9yaXpvbnRhbCA9IHRydWU7Ci0gICAgICAgIC8vVGhpcyBpcyB0aGUgY3V0ZSB3YXkgb2YgbWFraW5nIHRoZSBuYW1lc3BhY2VzIGNvbHVtbnMgZWRpdGFibGUKLSAgICAgICAgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3duLCBuZXcgTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotICAgICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSA9IG5hbWVzcGFjZTJwYWNrYWdlVGFibGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICBQb2ludCBwdCA9IG5ldyBQb2ludChldmVudC54LCBldmVudC55KTsKLSAgICAgICAgICAgICAgaW50IGluZGV4ID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRUb3BJbmRleCgpOwotICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW1Db3VudCgpKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZmluYWwgVGFibGVJdGVtIGl0ZW0gPSBuYW1lc3BhY2UycGFja2FnZVRhYmxlLmdldEl0ZW0oaW5kZXgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRDb2x1bW5Db3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gaXRlbS5nZXRCb3VuZHMoaSk7Ci0gICAgICAgICAgICAgICAgICBpZiAocmVjdC5jb250YWlucyhwdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbHVtbiA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KG5hbWVzcGFjZTJwYWNrYWdlVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdGVuZXIgdGV4dExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KGZpbmFsIEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5Gb2N1c091dDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRUZXh0KGNvbHVtbiwgdGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5UcmF2ZXJzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmRldGFpbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNXVC5UUkFWRVJTRV9SRVRVUk46Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChjb2x1bW4sIHRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTV1QuVFJBVkVSU0VfRVNDQVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuZGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZG9pdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5hZGRMaXN0ZW5lcihTV1QuRm9jdXNPdXQsIHRleHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCB0ZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0RWRpdG9yKHRleHQsIGl0ZW0sIGkpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQoaXRlbS5nZXRUZXh0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZWxlY3RBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRGb2N1cygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoIXZpc2libGUgJiYgcmVjdC5pbnRlcnNlY3RzKGNsaWVudEFyZWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXZpc2libGUpCi0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgIAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUxhYmVsIGZpbGxMYWJlbDQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWZpbGxMYWJlbDQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlhZHZhbmNlT3B0aW9uc0J1dHRvbj0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJYWR2YW5jZU9wdGlvbnNCdXR0b24uc2V0VGV4dCgiQWR2YW5jZSBPcHRpb25zIik7Ci0JCWFkdmFuY2VPcHRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWR2YW5jZUJ1dHRvbkNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlhZHZhbmNlT3B0aW9uc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0gICAgICAgIC8vYWRqdXN0IHRoZSB3aWR0aAotICAgICAgICAvL2FkanVzdENvbHVtbldpZHRoKG5hbWVzcGFjZTJwYWNrYWdlVGFibGUpOwotICAgICAgIAotCQkvKgotCQkgKiBDaGVjayB0aGUgc3RhdGUgb2Ygc2VydmVyLXNpZGUgc2VsZWN0aW9uLCBzbyB3ZSBjYW4gZW5hYmxlL2Rpc2FibGUKLQkJICogdGhlIHNlcnZlclhNTCBjaGVja2JveCBidXR0b24uCi0JCSAqLwotCQloYW5kbGVTZXJ2ZXJzaWRlU2VsZWN0aW9uKCk7Ci0JCS8qCi0JCSAqIHRyeSBwb3B1bGF0aW5nIHRoZSBjb21ib3MgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIFdTREwgaWYgdGhpcwotCQkgKiBpcyByZXN0b3JlZAotCQkgKi8KLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpIHsKLQkJCXBvcHVsYXRlUGFyYW1zRnJvbVdTREwoKTsKLQkJCXNlbGVjdERlZmF1bHRzKCk7Ci0JCX0KLQkJCi0JCS8vZmlyc3QgYXBwZWFyZW5jZSBEaXNhYmxlIGFsbCB0aGUgY29udHJvbHMgCi0JCWRpc2FibGVDb250cm9scygpOwotCQkKLQkJCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWR2YW5jZUJ1dHRvbkNsaWNrKCl7Ci0JCVdTRExKYXZhQWR2YW5jZURpYWxvZyBqYXZhQWR2YW5jZURpYWxvZyA9IG5ldyBXU0RMSmF2YUFkdmFuY2VEaWFsb2coZ2V0U2hlbGwoKSxhZHZhbmNlT3B0aW9ucyk7Ci0JCWphdmFBZHZhbmNlRGlhbG9nLmNyZWF0ZSgpOwotCQlqYXZhQWR2YW5jZURpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoNzAwLCA5NTApOwotCQlqYXZhQWR2YW5jZURpYWxvZy5vcGVuKCk7Ci0JCWlmIChqYXZhQWR2YW5jZURpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdy5PSyl7Ci0JCQlhZHZhbmNlT3B0aW9ucz1qYXZhQWR2YW5jZURpYWxvZy5nZXRBZHZhbmNlT3B0aW9ucygpOwotCQl9Ci0JfQotLy8JLyoqCi0vLwkgKiBBZGp1c3QgdGhlIGNvbHVtbiB3aWR0aHMKLS8vCSAqIEBwYXJhbSB0YWJsZQotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgYWRqdXN0Q29sdW1uV2lkdGgoVGFibGUgdGFibGUpewotLy8JCSBQb2ludCBwID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotLy8JICAgICBpbnQgY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0vLwkgICAgIGZvciAoaW50IGk9MDtpPGNvbHVtbnM7aSsrKXsKLS8vCSAgICAJIHRhYmxlLmdldENvbHVtbihpKS5zZXRXaWR0aChwLngvY29sdW1ucyk7Ci0vLwkgICAgIH0KLS8vCX0KLQkvKioKLQkgKiBBIHV0aWwgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBjb2x1bW4KLQkgKiBAcGFyYW0gdGFibGUKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiBAcGFyYW0gY29sTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBkZWNsYXJlQ29sdW1uKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsU3RyaW5nIGNvbE5hbWUpewotICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4uc2V0V2lkdGgod2lkdGgpOwotICAgICAgICBjb2x1bW4uc2V0VGV4dChjb2xOYW1lKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdERlZmF1bHRzKCkgewotCQlzZXJ2aWNlTmFtZUNvbWJvLnNlbGVjdChzZXR0aW5ncy5nZXRJbnQoUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCkpOwotCQkvLyBwb3J0cyBuZWVkIHRvIGJlIHJlbmFtZWQgaW4gb3JkZXIgZm9yIGNvcnJlY3QgZGVmYXVsdCBzZWxlY3Rpb24KLQkJbG9hZFBvcnROYW1lcygpOwotCQlwb3J0TmFtZUNvbWJvLnNlbGVjdChzZXR0aW5ncy5nZXRJbnQoUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBhY2thZ2VOYW1lKCkgewotCQl0aGlzLnBhY2thZ2VUZXh0LnNldFRleHQocmVhZGVyLnBhY2thZ2VGcm9tVGFyZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCS8qKgotCSAqIHBvcHVsYXRlIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcG9ydCBmcm9tIHRoZSBXU0RMIHRoaXMgbmVlZHMgdG8gYmUgcHVibGljCi0JICogc2luY2UgdGhlIFdTRExzZWxlY3Rpb24gcGFnZSBtYXkgY2FsbCB0aGlzCi0JICovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKQotCQkJcmVhZGVyID0gbmV3IFdTRExQcm9wZXJ0eVJlYWRlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIGxuYW1lID0gZ2V0Q29kZWdlbldpemFyZCgpLmdldFdTRExuYW1lKCk7Ci0JCQlpZiAoISIiLmVxdWFscyhsbmFtZS50cmltKCkpKSB7Ci0JCQkJCi0JCQkJcmVhZGVyLnJlYWRXU0RMKGxuYW1lKTsKLQotCQkJCS8vIGVuYWJsZSB0aGUgY29tYm8ncwotCQkJCXNldENvbWJvQm94RW5hYmxlKHRydWUpOwotCi0JCQkJdGhpcy5zZXJ2aWNlUU5hbWVMaXN0ID0gcmVhZGVyLmdldFNlcnZpY2VMaXN0KCk7Ci0JCQkJaWYgKCFzZXJ2aWNlUU5hbWVMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXJ2aWNlTmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VRTmFtZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCS8vIGFkZCB0aGUgbG9jYWwgcGFydCBvZiB0aGUKLQkJCQkJCXNlcnZpY2VOYW1lQ29tYm8uYWRkKCgoUU5hbWUpIHNlcnZpY2VRTmFtZUxpc3QuZ2V0KGkpKQotCQkJCQkJCQkuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJCQl9Ci0JCQkJCTsKLQkJCQkJLy8gc2VsZWN0IHRoZSBmaXJzdCBvbmUgYXMgdGhlIGRlZmF1bHQKLQkJCQkJc2VydmljZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0KLQkJCQkJLy8gbG9hZCB0aGUgcG9ydHMKLQkJCQkJbG9hZFBvcnROYW1lcygpOwotCi0JCQkJCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzZXJ2aWNlIG5hbWUgbGlzdCBiZWluZyBlbXB0eSBtZWFucyB3ZSBhcmUgc3dpdGNoaW5nIHRvCi0JCQkJCS8vIHRoZSBpbnRlcmZhY2UgbW9kZQotCQkJCQlpZiAoc2VydmljZU5hbWVDb21ibyE9bnVsbCkgc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQkJCQkJaWYgKHBvcnROYW1lQ29tYm8hPW51bGwpIHBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJCS8vIGRpc2FibGUgdGhlIGNvbWJvJ3MKLQkJCQkJc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotCQkJCQkvL3RoaXMgaXMgbm90IGFuIGVycm9yCi0JCQkJCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQkJCQotCQkJCX0KLQotCQkJCXBvcHVsYXRlUGFja2FnZU5hbWUoKTsKLQkJCQkKLQkJCQkvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotCQkJICAgIGxvYWROYW1lc3BhY2VzKHJlYWRlci5nZXREZWZpbml0aW9uTmFtZXNwYWNlTWFwKCkpOwotCQkJfQotCQl9IGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRpc2FibGUgdGhlIGNvbWJvJ3MKLQkJCXNldENvbWJvQm94RW5hYmxlKGZhbHNlKTsKLQkJCXVwZGF0ZVN0YXR1cyhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIud3NkbEludmFsaWQubWVzc2FnZSIpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRpc2FibGUgdGhlIGNvbWJvJ3MKLQkJCXNldENvbWJvQm94RW5hYmxlKGZhbHNlKTsKLQkJCXVwZGF0ZVN0YXR1cyhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIud3NkbE5vdEZvdW5kLm1lc3NhZ2UiKSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkUG9ydE5hbWVzKCkgewotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzZXJ2aWNlTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJamF2YS51dGlsLkxpc3QgcG9ydHMgPSByZWFkZXIuZ2V0UG9ydE5hbWVMaXN0KChRTmFtZSkgc2VydmljZVFOYW1lTGlzdAotCQkJCQkuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQlpZiAoIXBvcnRzLmlzRW1wdHkoKSkgewotCQkJCXBvcnROYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotCQkJCQkvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0JCQkJCXBvcnROYW1lQ29tYm8uYWRkKHBvcnRzLmdldChpKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJdXBkYXRlU3RhdHVzKG51bGwpOwotCQkJCXBvcnROYW1lQ29tYm8uc2VsZWN0KDApOwotCQkJfSBlbHNlIHsKLQkJCQl1cGRhdGVTdGF0dXMoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5ub3BvcnRzLm1lc3NhZ2UiKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29tYm9Cb3hFbmFibGUoYm9vbGVhbiBiKSB7Ci0JCWlmIChzZXJ2aWNlTmFtZUNvbWJvICE9IG51bGwpIHsKLQkJCXNlcnZpY2VOYW1lQ29tYm8uc2V0RW5hYmxlZChiKTsKLQkJCXBvcnROYW1lQ29tYm8uc2V0RW5hYmxlZChiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBuYW1lc3BhY2VzCi0JICogQHBhcmFtIG5hbWVzcGFjZU1hcAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmFtZXNwYWNlcyhNYXAgbmFtZXNwYWNlTWFwKXsKLQkJSXRlcmF0b3IgbmFtZXNwYWNlcyA9IG5hbWVzcGFjZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQluYW1lc3BhY2UycGFja2FnZVRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbmFtZXNwYWNlTWFwLnNpemUoKV07IC8vIEFuIGl0ZW0gZm9yIGVhY2ggZmllbGQKLSAgICAgICAgCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgd2hpbGUobmFtZXNwYWNlcy5oYXNOZXh0KCkpewotICAgICAgICAJCi0gICAgICAgICAgIGl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbShuYW1lc3BhY2UycGFja2FnZVRhYmxlLCBTV1QuTlVMTCk7Ci0gICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKW5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDAsbmFtZXNwYWNlKTsKLSAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgxLGdldFBhY2thZ2VGcm9tTmFtZXNwYWNlKG5hbWVzcGFjZSkpOwotICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLQotICAgICAgICBuYW1lc3BhY2UycGFja2FnZVRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBGaWxsIHRoZSBjb21ibyB3aXRoIHByb3BlciBkYXRhYmluZGluZyBuYW1lcwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsRGF0YWJpbmRlckNvbWJvKCkgewotCi0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChEQVRBX0JJTkRJTkdfQURCKTsKLQkJZGF0YWJpbmRpbmdUeXBlQ29tYm8uYWRkKERBVEFfQklORElOR19YTUxCRUFOUyk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChEQVRBX0JJTkRJTkdfSklCWCk7Ci0JCWRhdGFiaW5kaW5nVHlwZUNvbWJvLmFkZChEQVRBX0JJTkRJTkdfTk9ORSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaWxsIHRoZSBjb21ibyB3aXRoIHByb3BlciBsYW5ndWFnZSBuYW1lcwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsTGFuZ3VhZ2VDb21ibygpIHsKLQotCQlsYW5ndWFnZVNlbGVjdGlvbkNvbWJvQm94LmFkZChKQVZBKTsKLQkJLy9zaW5jZSB3ZSBoYXZlIG5vdCBsb29rZWQgYXQgQyMgc3VwcG9ydCBzZXJpb3VzbHkKLQkJLy9mb3IgYSBsb25nIHRpbWUsIHdlJ2xsIGp1c3QgbGVhdmUgaXQgb3V0Ci0JCS8vbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5hZGQoQ19TSEFSUCk7Ci0KLQkJbGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZWxlY3QoMCk7Ci0JfQotCQotCS8qKgotCSAqIEZpbGwgdGhlIGNvbWJvIHdpdGggcHJvcGVyb3B0aW9uIHNlbGVjdGlvbgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmaWxsQ29kZWdlbk9wdGlvblNlbGVjdGlvbkNvbWJvQm94KCkgewotCQljb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guYWRkKERFRkFVTFQpOwotCQljb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guYWRkKENVU1RPTSk7Ci0JCWNvZGVnZW5PcHRpb25TZWxlY3Rpb25Db21ib0JveC5zZWxlY3QoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgc2VydmVyLXNpZGUgY2hlY2tib3gsIGFuZCBlbmFibGVzL2Rpc2FibGVzCi0JICogdGhlIGdlbmVyYXRpb24gY2hlY2tib3ggZm9yIFhNTCBjb25maWd1cmF0aW9uIGZpbGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VydmVyc2lkZVNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMuc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFLCBzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24KLQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCXRoaXMuc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCS8vdGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZihjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PXRydWUgCi0JCQkJCXx8IGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSl7Ci0JCQkJdW5jaGVja0NsaWVudFNpZGUoKTsKLQkJCQl1bmNoZWNrR2VuZXJhdGVBbGwoKTsKLQkJCQlzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsIHNlcnZlclNpZGVDaGVja0JveEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXRoaXMuc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMuc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJLy9lYXJsaWVyIGV4aXN0aW5nIGNvZGUgKFRoaXMgb25seSBzZXQgZm9jdXMgZmFsc2UpCi0JCQl0aGlzLnN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMuc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0JCX0gCi0JCQllbHNlIHsKLS8vCQkJLy9hZGRlZCB0aGlzIHRvIGluY3JlYXNlIHRoZSBVSSBmZWF0dXJlcyAodGhpcyB3aWxsIGRlc2VsY3QgYWxsIHRoZSBzZWxlY3RlZCBmZWF0dXJlcykKLS8vCQkJdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8JCQkvL3RoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotLy8JCQl0aGlzLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJCS8vZWFybGllciBleGlzdGluZyBjb2RlIChUaGlzIG9ubHkgc2V0IGZvY3VzIGZhbHNlKQotLy8JCQl0aGlzLnNlcnZlclhNTENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkvL3RoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWlmKGNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKT09ZmFsc2UgCi0JCQkJCSYmIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gZmFsc2UpewotCQkJCXNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfU0VSVkVSU0lERSwgc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgc3RhdHVzIG9mIHRoZSBjbGllbnQtc2lkZSBjaGVja2JveCwgYW5kIGVuYWJsZXMvZGlzYWJsZXMKLQkgKiB0aGUgZ2VuZXJhdGlvbiBjaGVja2JveCBmb3IgWE1MIGNvbmZpZ3VyYXRpb24gZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDbGllbnRzaWRlU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5jbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXRoaXMuc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZihzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PXRydWUgCi0JCQkJCXx8IGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSl7Ci0JCQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFLCBjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdW5jaGVja1NlcnZlclNpZGUoKTsKLQkJCQl1bmNoZWNrR2VuZXJhdGVBbGwoKTsKLQkJCX0KLQkJCXRoaXMuc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnNlcnZlclhNTENoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQl0aGlzLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy50ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvL2FkZGVkIHRoaXMgdG8gaW5jcmVhc2UgdGhlIFVJIGZlYXR1cmVzICh0aGlzIHdpbGwgZGVzZWxjdCBhbGwgdGhlIHNlbGVjdGVkIGZlYXR1cmVzKQotLy8JCQl0aGlzLnN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0vLwkJCXRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLS8vCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkvL2VhcmxpZXIgZXhpc3RpbmcgY29kZSAoVGhpcyBvbmx5IHNldCBmb2N1cyBmYWxzZSkKLS8vCQkJdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaWYoc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpPT1mYWxzZSAKLQkJCQkJJiYgZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA9PSBmYWxzZSl7Ci0JCQkJY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFLCBjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUdlbmVyYXRlQWxsU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9HRU5fQUxMLCBnZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uCi0JCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlpZihzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PXRydWUgCi0JCQkJCXx8IGNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA9PSB0cnVlKXsKLQkJCQl0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0dFTkVSQVRFX1NFUlZFUlNJREUsIHNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJdW5jaGVja1NlcnZlclNpZGUoKTsKLQkJCQl1bmNoZWNrQ2xpZW50U2lkZSgpOwotCQkJfQotCQkJdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkvL2VhcmxpZXIgZXhpc3RpbmcgY29kZSAoVGhpcyBvbmx5IHNldCBmb2N1cyBmYWxzZSkKLQkJCXRoaXMuc3luY0FuZEFzeW5jUmFkaW9CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLmFzeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCi0JCQl0aGlzLnNlcnZlclhNTENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXRoaXMuZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCWVsc2V7Ci0JCQlpZihzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk9PWZhbHNlIAotCQkJCQl8fCBjbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkgPT0gZmFsc2UpewotCQkJCWdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0dFTl9BTEwsIGdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHNlbGVjdGVkIGxhbmd1YWdlCi0JICogCi0JICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkTGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBsYW5ndWFnZVNlbGVjdGlvbkNvbWJvQm94LmdldEl0ZW0obGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveAotCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgYXN5bmMgb25seSBzdGF0dXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIGFzeW5jaHJvbm91cyBjb2RlIG9ubHkiIGlzIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FzeW5jT25seU9uKCkgewotCQlyZXR1cm4gYXN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHN5bmMgb25seSBzdGF0dXMKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIHN5bmNocm9ub3VzIGNvZGUgb25seSIgaXMgY2hlY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY09ubHlPbigpIHsKLQkJcmV0dXJuIHN5bmNPbmx5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCWlmICgiIi5lcXVhbHMocGFja2FnZVRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpewotCQkJLy93ZSBkbyBub3QgYWxsb3cgdGhlIHBhY2thZ2luZyB0byBiZSBlbXB0eQotCQkJLy9pZiB0aGUgdXNlciBzZXRzIGl0IHRvIGVtcHR5IHdlIHNldCBpdCB0bwotCQkJLy90aGUgZGVmYXVsdAotCQkJcmV0dXJuIFVSTFByb2Nlc3Nvci5ERUZBVUxUX1BBQ0tBR0U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucGFja2FnZVRleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXJ2ZXJzaWRlIHN0YXR1cwotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgU2VydmVyLVNpZGUiIGlzIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlcnNpZGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIFhNTCBjb25maWd1cmF0aW9uIGZpbGUiIGlzIGNoZWNrZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTCgpIHsKLQkJaWYgKHRoaXMuc2VydmVyWE1MQ2hlY2tCb3hCdXR0b24uaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgdGVzdCBjYXNlIiBpcyBjaGVja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVRlc3RDYXNlKCkgewotCQlyZXR1cm4gdGhpcy50ZXN0Q2FzZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aS5Db2RlZ2VuUGFnZSNnZXRQYWdlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRQYWdlVHlwZSgpIHsKLQkJcmV0dXJuIFdTRExfMl9KQVZBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHBvcnRuYW1lIGlzIGVtcHR5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gcG9ydE5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5wb3J0TmFtZUNvbWJvLmdldEl0ZW0oc2VsZWN0aW9uSW5kZXgpOwotCi0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQudHJpbSgpLmVxdWFscygiIikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiB0ZXh0OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHRleHQgaXMgZW1wdHkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzZXJ2aWNlTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCS8vIGNhdGVyIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbWJvJ3MgY2FuIGJlIGVtcHR5Ci0JCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotCQkJU3RyaW5nIHRleHQgPSB0aGlzLnNlcnZpY2VOYW1lQ29tYm8uZ2V0SXRlbShzZWxlY3Rpb25JbmRleCk7Ci0KLQkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiaW5kZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmluZGluZ1R5cGVDb21iby5nZXRJdGVtKGRhdGFiaW5kaW5nVHlwZUNvbWJvCi0JCQkJLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZUFsbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5ncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5zMlBrZ01hcHBpbmcoKXsKLQkJU3RyaW5nIHJldHVybkxpc3Q9IiI7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gbmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5nZXRJdGVtcygpOwotCQlTdHJpbmcgcGFja2FnZVZhbHVlOyAKLQkJZm9yIChpbnQgaT0wO2k8aXRlbXMubGVuZ3RoO2krKyl7Ci0JCQlwYWNrYWdlVmFsdWUgPSBpdGVtc1tpXS5nZXRUZXh0KDEpOwotCQkJaWYgKHBhY2thZ2VWYWx1ZSE9bnVsbCAmJiAhIiIuZXF1YWxzKHBhY2thZ2VWYWx1ZSkpewotCQkJCXJldHVybkxpc3QgPSByZXR1cm5MaXN0ICsKLQkJCQkgICAgICAgICAgICAgKCIiLmVxdWFscyhyZXR1cm5MaXN0KT8iIjoiLCIpICsKLQkJCQkgICAgICAgICAgICAgaXRlbXNbaV0uZ2V0VGV4dCgwKSsgIj0iICsgcGFja2FnZVZhbHVlOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuICIiLmVxdWFscyhyZXR1cm5MaXN0KT9udWxsOnJldHVybkxpc3Q7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBkaXNhYmxlQ29udHJvbHMoKXsKLQkJdGhpcy5jb2RlZ2VuT3B0aW9uU2VsZWN0aW9uQ29tYm9Cb3guc2VsZWN0KDApOwotCQl0aGlzLnRlc3RDYXNlQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLmdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2VDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0aGlzLmxhbmd1YWdlU2VsZWN0aW9uQ29tYm9Cb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlMnBhY2thZ2VUYWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIHRoaXMucG9ydE5hbWVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZUNvbWJvLnNlbGVjdCgwKTsgICAgICAgIAotICAgICAgICB0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJYTUxDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWVDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHRoaXMuc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zeW5jT25seVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5UmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zeW5jQW5kQXN5bmNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHRoaXMucGFja2FnZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLmNsaWVudFNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIHRoaXMuZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5hZHZhbmNlT3B0aW9uc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCl7Ci0gICAgICAgIHRoaXMudGVzdENhc2VDaGVja0JveEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nVHlwZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMubGFuZ3VhZ2VTZWxlY3Rpb25Db21ib0JveC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLm5hbWVzcGFjZTJwYWNrYWdlVGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5wYWNrYWdlVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLSAgICAgICAgdGhpcy5wb3J0TmFtZUNvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2VydmVyU2lkZUNoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWVDb21iby5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLnN5bmNPbmx5UmFkaW9CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5hc3luY09ubHlSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLnN5bmNBbmRBc3luY1JhZGlvQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMucGFja2FnZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5jbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgdGhpcy5nZW5lcmF0ZUFsbENoZWNrQm94QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHRoaXMuYWR2YW5jZU9wdGlvbnNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwYWNrYWdlIGRlcml2ZWQgYnkgIE5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0JCXJldHVybiAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlQ3VzdG9tUGFja2FnZU5hbWVNb2RpZnlFdmVudCgpIHsKLQkvLyBUaGlzIG1ldGhvZCBpcyBhZGQgYXMgYSB0ZW1wb3J5IGZpeCBmb3IgdGhlIEF4aXMyLTEzNjggCi0JLy8gVE9ETyBmaXggdGhpcyBwZXJtYW5hbnRseS4JCi0JU3RyaW5nIHRleHQgPSB0aGlzLnBhY2thZ2VUZXh0LmdldFRleHQoKTsKLQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpfHwgKHRleHQuZW5kc1dpdGgoIi4iKSkgfHwgKHRleHQuc3RhcnRzV2l0aCgiLiIpKSkgewotCQl1cGRhdGVTdGF0dXMob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIucGFjaGFnZS5lcnJvci5ub2xvY2F0aW9uIikpOwotCQlyZXR1cm47Ci0JfQotCQl1cGRhdGVTdGF0dXMobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1bmNoZWNrU2VydmVyU2lkZSgpewotCQl0aGlzLnNlcnZlclNpZGVDaGVja0JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFLCBzZXJ2ZXJTaWRlQ2hlY2tCb3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdW5jaGVja0NsaWVudFNpZGUoKXsKLQkJdGhpcy5jbGllbnRTaWRlQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfR0VORVJBVEVfQ0xJRU5UU0lERSwgY2xpZW50U2lkZUNoZWNrQm94QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVuY2hlY2tHZW5lcmF0ZUFsbCgpewotCQl0aGlzLmdlbmVyYXRlQWxsQ2hlY2tCb3hCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfR0VOX0FMTCwgZ2VuZXJhdGVBbGxDaGVja0JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0QWR2YW5jZU9wdGlvbnMoKXsKLQkJaWYgKGFkdmFuY2VPcHRpb25zQnV0dG9uLmdldEVuYWJsZWQoKSkKLQkJCXJldHVybiBhZHZhbmNlT3B0aW9uczsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEluaXRpYWxpc2VkQWR2YW5jZU9wdGlvbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL091dHB1dFBhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvT3V0cHV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDEwNGQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvT3V0cHV0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsLlVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIE91dHB1dFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBUZXh0IG91dHB1dExvY2F0aW9uOwotCQotCXByaXZhdGUgVGV4dCBheGlzSG9tZUxvY2F0aW9uOwotCQotCXByaXZhdGUgVGV4dCBqYXJGaWxlTmFtZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYXhpc0hvbWVCcm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYXhpc0xvYWRMaWJzQnV0dG9uOwotCQotCXByaXZhdGUgQnV0dG9uIGNvcHlMaWJCdXR0b247Ci0JCi0JcHJpdmF0ZSBCdXR0b24gamFyQ3JlYXRpb25CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29weVBsdWdpbkxpYkJ1dHRvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gd29ya3NwYWNlU2F2ZU9wdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgYm9vbGVhbiBqYXJGaWxlQ29weU9wdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgTGFiZWwgYXhpc0hvbWVMYWJlbDsKLQkKLQlwcml2YXRlIExhYmVsIGF4aXNMb2FkTGliUmVzdWx0c0xhYmVsOwotCQotCXByaXZhdGUgTGFiZWwgamFyRmlsZU5hbWVMYWJlbDsKLQkKLQlwcml2YXRlIFN0cmluZyBheGlzMkxpYnNMb2NhdGlvbiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBMYWJlbCBoaW50TGFiZWw7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gaGludEJ1dHRvbjsKLQkKLQlwcml2YXRlIGJvb2xlYW4gaGludFZpc2libGUgPSBmYWxzZTsKLQkKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBPdXRwdXRQYWdlKCkgewotCQkgc3VwZXIoInBhZ2UzIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBzb21lIGluaXRpYWwgdmFsdWVzIGZvciB0aGUgc2V0dGluZ3MuIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCXNldHRpbmdzLnB1dChQUkVGX09VVFBVVF9MT0NBVElPTiwgIiIpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9BWElTX0hPTUVfT1VUUFVUX0xPQ0FUSU9OLCAiIik7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0pBUl9GSUxFX05BTUUsICIiKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNLCB0cnVlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVhJU19MSUJfQ09QWSwgZmFsc2UpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19KQVJfQ1JFQVRJT04sIGZhbHNlKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVhJU19QTFVHSU5fTElCX0NPUFksIGZhbHNlKTsKLQkJd29ya3NwYWNlU2F2ZU9wdGlvbiA9IGZhbHNlOwotCQlqYXJGaWxlQ29weU9wdGlvbiA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBzZWxlY3RMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJc2VsZWN0TGFiZWwKLQkJCQkuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLnJlc3VsdC5kZWNzIikpOwotCQlzZWxlY3RMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCXdvcmtzcGFjZVByb2plY3RPcHRpb25zQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLndvcmtzcGFjZS5jYXB0aW9uIikpOwotCQl3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy53b3Jrc3BhY2UuZGVzYyIpKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNLCB0cnVlKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24uc2V0U2VsZWN0aW9uKHNldHRpbmdzCi0JCQkJLmdldEJvb2xlYW4oUFJFRl9DSEVDS19XT1JLU1BBQ0UpKTsKLQkJd29ya3NwYWNlUHJvamVjdE9wdGlvbnNCdXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmZpbGVzeXN0ZW0uY2FwdGlvbiIpKTsKLQkJZmlsZXN5U3RlbU9wdGlvbnNCdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZmlsZXN5c3RlbS5kZXNjIikpOwotCQlmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MKLQkJCQkuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNKSk7Ci0JCWZpbGVzeVN0ZW1PcHRpb25zQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlsYWJlbAotCQkJCS5zZXRUZXh0KG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMub3V0cHV0LmNhcHRpb24iKSk7Ci0JCQotCQlzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTE9DQVRJT04sICIiKTsKLQkJc2V0dGluZ3MucHV0KFBSRUZfQVhJU19IT01FX09VVFBVVF9MT0NBVElPTiwgIiIpOwotCQlvdXRwdXRMb2NhdGlvbiA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCW91dHB1dExvY2F0aW9uLnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfT1VUUFVUX0xPQ0FUSU9OKSk7Ci0JCW91dHB1dExvY2F0aW9uLnNldExheW91dERhdGEoZ2QpOwotCQlvdXRwdXRMb2NhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTE9DQVRJT04sIG91dHB1dExvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQkJaGFuZGxlTW9kaWZ5RXZlbnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMub3V0c2VsZWN0aW9uLmJyb3dzZSIpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUJyb3dzZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWNvcHlQbHVnaW5MaWJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJY29weVBsdWdpbkxpYkJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNvcHlwbHVnaW5saWIuY2FwdGlvbiIpKTsKLQkJY29weVBsdWdpbkxpYkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5jb3B5cGx1Z2lubGliLmNhcHRpb24iKSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZLGZhbHNlKTsKLQkJY29weVBsdWdpbkxpYkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZKSk7Ci0JCWNvcHlQbHVnaW5MaWJCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNvcHlQbHVnaW5MaWJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ29weVBsdWdpbkxpYnNDaGVja0JveCgpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZLCBjb3B5UGx1Z2luTGliQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3Bhbj0zOwotCQlMYWJlbCBmaWxsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWZpbGxMYWJlbC5zZXRUZXh0KCIiKTsKLQkJCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBmaWxsTGFiZWwxID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsMS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQljb3B5TGliQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCWNvcHlMaWJCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5hZGRheGlzbGliLmNhcHRpb24iKSk7Ci0JCWNvcHlMaWJCdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuYWRkYXhpc2xpYi5kZXNjIikpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BWElTX0xJQl9DT1BZLGZhbHNlKTsKLQkJY29weUxpYkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFkpKTsKLQkJY29weUxpYkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY29weUxpYkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVqYXJDaGVja0JveCgpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFksIGNvcHlMaWJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWF4aXNIb21lTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWF4aXNIb21lTGFiZWwKLQkJCQkuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmF4aXNob21lLmNhcHRpb24iKSk7Ci0JCQotCQkKLQkJYXhpc0hvbWVMb2NhdGlvbiA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCWF4aXNIb21lTG9jYXRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04sICIiKTsKLQkJYXhpc0hvbWVMb2NhdGlvbi5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04pKTsKLQkJYXhpc0hvbWVMb2NhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXR0aW5ncy5wdXQoUFJFRl9BWElTX0hPTUVfT1VUUFVUX0xPQ0FUSU9OLCBheGlzSG9tZUxvY2F0aW9uLmdldFRleHQoKSk7Ci0JCQkJaGFuZGxlQXhpc0hvbWVNb2RpZnlFdmVudCgpOwotCQkJfQotCQl9KTsKLQotCQlheGlzSG9tZUJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWF4aXNIb21lQnJvd3NlQnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMub3V0c2VsZWN0aW9uLmJyb3dzZSIpKTsKLQkJYXhpc0hvbWVCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQXhpc0hvbWVCcm93c2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlheGlzTG9hZExpYnNCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlheGlzTG9hZExpYnNCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5sb2FkbGlicy5icm93c2UiKSk7Ci0JCWF4aXNMb2FkTGlic0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVMb2FkTGlic0Jyb3dzZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWF4aXNMb2FkTGliUmVzdWx0c0xhYmVsCS5zZXRUZXh0KCIiKTsKLQkJYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQkvL2ZpbGxpbmcgbGFiZWwgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsMiA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCWZpbGxMYWJlbDIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWphckNyZWF0aW9uQnV0dG9uPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJamFyQ3JlYXRpb25CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5qYXJjcmVhdGlvbi5jYXB0aW9uIikpOwotCQlqYXJDcmVhdGlvbkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5qYXJjcmVhdGlvbi5kZXNjIikpOwotCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19KQVJfQ1JFQVRJT04sZmFsc2UpOwotCQlqYXJDcmVhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0pBUl9DUkVBVElPTikpOwotCQlqYXJDcmVhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJamFyQ3JlYXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlamFyQ3JlYXRpb25DaGVja0JveCgpOwotLy8JCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OLCBqYXJDcmVhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJamFyRmlsZU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJamFyRmlsZU5hbWVMYWJlbAotCQkJCS5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuamFybmFtZS5jYXB0aW9uIikpOwotCQkJCQotCQlqYXJGaWxlTmFtZVRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIpOwotCQlqYXJGaWxlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWphckZpbGVOYW1lVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX0pBUl9GSUxFX05BTUUpKTsKLQkJamFyRmlsZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldHRpbmdzLnB1dChQUkVGX0pBUl9GSUxFX05BTUUsIGphckZpbGVOYW1lVGV4dC5nZXRUZXh0KCkpOwotLy8JCQkJaGFuZGxlQXhpc0hvbWVNb2RpZnlFdmVudCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCS8vZmlsbGluZyBsYWJlbCAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlMYWJlbCBmaWxsTGFiZWwzID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsMy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsgCi0JCQotCQloaW50QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5QVVNIKTsKLQkJaGludEJ1dHRvbi5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmhpbnQub2ZmIikpOwotCQloaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhpbnRCcm93c2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWhpbnRMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJaGludExhYmVsCi0JCQkJLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5oaW50LmNhcHRpb24iKSk7Ci0JCWhpbnRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaGludExhYmVsLnNldFZpc2libGUoaGludFZpc2libGUpOwotCQkKLQkJZGlzYWJsZUNvbnRyb2xzKCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJLyoKLQkJICogVXBkYXRlIHRoZSBidXR0b25zLCBpbiBjYXNlIHRoaXMgd2FzIHJlc3RvcmVkIGZyb20gYW4gZWFybGllciBzZXR0aW5nCi0JCSAqLwotCQlpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncykgewotCQkJaGFuZGxlTW9kaWZ5RXZlbnQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlSGludEJyb3dzZSgpIHsKLQkJaWYgKGhpbnRWaXNpYmxlKSB7Ci0JCQloaW50QnV0dG9uLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmhpbnQub2ZmIikpOwotCQkJaGludFZpc2libGUgPSBmYWxzZTsKLQkJCWhpbnRMYWJlbC5zZXRWaXNpYmxlKGhpbnRWaXNpYmxlKTsKLQkJfSBlbHNlIHsKLQkJCWhpbnRCdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuaGludC5vbiIpKTsKLQkJCWhpbnRWaXNpYmxlID0gdHJ1ZTsKLQkJCWhpbnRMYWJlbC5zZXRWaXNpYmxlKGhpbnRWaXNpYmxlKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG91dHB1dCBsb2NhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgb3V0cHV0IGxvY2F0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRwdXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG91dHB1dExvY2F0aW9uLmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF4aXNIb21lTG9jYXRpb24oKSB7Ci0JCXJldHVybiBheGlzSG9tZUxvY2F0aW9uLmdldFRleHQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXJGaWxlbmFtZSgpIHsKLQkJcmV0dXJuIGphckZpbGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEF4aXMyUGx1Z2luTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCl7Ci0vLwkJcmV0dXJuIHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19BWElTX1BMVUdJTl9MSUJfQ09QWSk7Ci0JCXJldHVybiB0aGlzLmNvcHlQbHVnaW5MaWJCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEF4aXNMaWJDb3B5Q2hlY2tCb3hTZWxlY3Rpb24oKXsKLS8vCQlyZXR1cm4gc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFkpOwotCQlyZXR1cm4gdGhpcy5jb3B5TGliQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVKYXJDaGVja0JveFNlbGVjdGlvbigpewotLy8JCXJldHVybiBzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OKTsKLQkJcmV0dXJuIGphckNyZWF0aW9uQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBeGlzSmFyc0xvY2F0aW9uKCl7Ci0JCXJldHVybiB0aGlzLmF4aXMyTGlic0xvY2F0aW9uOwotCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gb2t0b0xvYWRMaWJzKCl7Ci0JCXJldHVybiB0aGlzLmphckZpbGVDb3B5T3B0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKYXJGaWxlTmFtZShTdHJpbmcgamFyRmlsZU5hbWUpewotCQl0aGlzLmphckZpbGVOYW1lVGV4dC5zZXRUZXh0KGphckZpbGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogV29ya2VyIG1ldGhvZCBmb3IgaGFuZGxpbmcgbW9kaWZpY2F0aW9ucyB0byB0aGUgdGV4dGJveAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnlFdmVudCgpIHsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLm91dHB1dExvY2F0aW9uLmdldFRleHQoKTsKLQkJaWYgKCh0ZXh0ID09IG51bGwpIHx8ICh0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSkgewotCQkJdXBkYXRlU3RhdHVzKG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5lcnJvci5ub2xvY2F0aW9uIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVwZGF0ZVN0YXR1cyhudWxsKTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlQXhpc0hvbWVNb2RpZnlFdmVudCgpIHsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmF4aXNIb21lTG9jYXRpb24uZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQl1cGRhdGVTdGF0dXMob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmVycm9yLm5vbG9jYXRpb24iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdXBkYXRlU3RhdHVzKG51bGwpOwotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVKYXJOYW1lTW9kaWZ5RXZlbnQoKSB7Ci0vLwkJU3RyaW5nIHRleHQgPSB0aGlzLmphckZpbGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0vLwkJaWYgKCh0ZXh0ID09IG51bGwpIHx8ICh0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSkgewotLy8JCQl1cGRhdGVTdGF0dXMob3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbgotLy8JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZXJyb3Iubm9sb2NhdGlvbiIpKTsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQl1cGRhdGVTdGF0dXMobnVsbCk7Ci0vLwl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hlY2tib3hTZWxlY3Rpb24oKSB7Ci0JCWlmICh3b3Jrc3BhY2VQcm9qZWN0T3B0aW9uc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCB0cnVlKTsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0ZJTEVfU1lTVEVNLCBmYWxzZSk7Ci0JCQl3b3Jrc3BhY2VTYXZlT3B0aW9uID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWxlc3lTdGVtT3B0aW9uc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfRklMRV9TWVNURU0sIHRydWUpOwotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfV09SS1NQQUNFLCBmYWxzZSk7Ci0JCQl3b3Jrc3BhY2VTYXZlT3B0aW9uID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZWphckNoZWNrQm94KCkgewotCQlpZihjb3B5TGliQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkJCWVuYWJsZUNvbnRyb2xzKCk7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BWElTX0xJQl9DT1BZLCB0cnVlKTsKLQkJfWVsc2V7Ci0JCQlkaXNhYmxlQ29udHJvbHMoKTsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FYSVNfTElCX0NPUFksIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlQ29weVBsdWdpbkxpYnNDaGVja0JveCgpIHsKLQkJaWYoY29weVBsdWdpbkxpYkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JCQlzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BWElTX1BMVUdJTl9MSUJfQ09QWSwgdHJ1ZSk7Ci0JCX1lbHNlewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfQVhJU19QTFVHSU5fTElCX0NPUFksIGZhbHNlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlamFyQ3JlYXRpb25DaGVja0JveCgpIHsKLQkJaWYoamFyQ3JlYXRpb25CdXR0b24uZ2V0U2VsZWN0aW9uKCk9PSB0cnVlKXsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0pBUl9DUkVBVElPTiwgdHJ1ZSk7Ci0JCX1lbHNlewotCQkJc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OLCBmYWxzZSk7Ci0JCQl0aGlzLmphckZpbGVOYW1lVGV4dC5zZXRUZXh0KCIiKTsKLQkJfQotCQlpZihqYXJGaWxlTmFtZUxhYmVsLmVxdWFscygiIikpewotCQkJdXBkYXRlU3RhdHVzKCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBuYW1lIHRvIHRoZSBqYXIgZmlsZSIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNhYmxlQ29udHJvbHMoKXsKLQkJdGhpcy5heGlzSG9tZUxvY2F0aW9uLnNldFRleHQoIlVucGFja2VkIEF4aXMyIGJpbmFyeSBob21lIE9yIEF4aXMyIHNvdXJjZSBsb2NhdGlvbiIpOwotCQl0aGlzLmF4aXNIb21lQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmF4aXNIb21lTG9jYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXRoaXMuamFyQ3JlYXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJdGhpcy5qYXJDcmVhdGlvbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdGhpcy5heGlzSG9tZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmF4aXNMb2FkTGliUmVzdWx0c0xhYmVsLnNldFRleHQoIiIpOwotCQl0aGlzLmF4aXNMb2FkTGliUmVzdWx0c0xhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmF4aXNMb2FkTGlic0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdGhpcy5qYXJGaWxlTmFtZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmphckZpbGVOYW1lVGV4dC5zZXRUZXh0KCIiKTsKLQkJdGhpcy5qYXJGaWxlTmFtZVRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0pBUl9DUkVBVElPTiwgZmFsc2UpOwotCQlqYXJGaWxlQ29weU9wdGlvbiA9IGZhbHNlOwotCQlDb2xvciBjb2xvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOwotCQlheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKCl7Ci0JCXRoaXMuYXhpc0hvbWVCcm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5heGlzSG9tZUxvY2F0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXRoaXMuamFyQ3JlYXRpb25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5heGlzSG9tZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXRoaXMuYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5heGlzTG9hZExpYnNCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy5qYXJGaWxlTmFtZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXRoaXMuamFyRmlsZU5hbWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0JCQl1cGRhdGVTdGF0dXMoIlBsZWFzZSBlbnRlciBhIHZhbGlkIHBhdGggdG8gdGhlIEF4aXMyIGxpYnMgYW5kIHRoZW4gdHJ5IHRvIGxvYWQgdGhlIGxpYnJhcmllcyB1c2luZyB0aGUgY2hlY2sgbGlicyBidXR0b24iKTsKLQkJfQotCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMubG9hZGxpYi5mYWlsLmNhcHRpb24iKSk7Ci0JICAgICBDb2xvciBjb2xvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpOwotCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVBeGlzSG9tZUJyb3dzZSgpIHsKLQkJICAgIHRoaXMuYXhpc0hvbWVMb2NhdGlvbi5zZXRUZXh0KCJ1bnBhY2tlZCBBeGlzMiBiaW5hcnkgaG9tZSBPciBBeGlzMiBzb3VyY2UgTG9jYXRpb24iKTsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5TdHJpbmcgIT0gbnVsbCkgewotCQkJCWF4aXNIb21lTG9jYXRpb24uc2V0VGV4dChyZXR1cm5TdHJpbmcpOwotCQkJCXNldHRpbmdzLnB1dChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04sIGF4aXNIb21lTG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUxvYWRMaWJzQnJvd3NlKCkgewotCQlpZihheGlzSG9tZUxvY2F0aW9uLmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLQkJCSBheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCS5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMubG9hZGxpYi5mYWlsLmNhcHRpb24iKSk7Ci0JCQkgamFyRmlsZUNvcHlPcHRpb249ZmFsc2U7Ci0JCSAgICAgaWYgKGF4aXNMb2FkTGliUmVzdWx0c0xhYmVsLmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLQkJCQkJdXBkYXRlU3RhdHVzKCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBwYXRoIHRvIHRoZSBBeGlzMiBsaWJzIGFuZCB0aGVuIHRyeSB0byBsb2FkIHRoZSBsaWJyYXJpZXMgdXNpbmcgdGhlIGNoZWNrIGxpYnMgYnV0dG9uIik7Ci0JCSAgICAgfQotCQl9ZWxzZXsKLQkJCXNldHRpbmdzLnB1dChQUkVGX0FYSVNfSE9NRV9PVVRQVVRfTE9DQVRJT04sIGF4aXNIb21lTG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJCVN0cmluZyBheGlzX2hvbWUgPSBzZXR0aW5ncy5nZXQoUFJFRl9BWElTX0hPTUVfT1VUUFVUX0xPQ0FUSU9OKTsKLQkJCVN0cmluZyBheGlzX3RhcmdldF9saWI9YXhpc19ob21lK0ZpbGUuc2VwYXJhdG9yK1VJQ29uc3RhbnRzLlRBUkdFVCtGaWxlLnNlcGFyYXRvcitVSUNvbnN0YW50cy5MSUI7Ci0JCQlTdHJpbmcgYXhpc19zdGRfbGliX2RpcmVjdG9yeT1heGlzX2hvbWUrRmlsZS5zZXBhcmF0b3IrVUlDb25zdGFudHMuTElCOwotCi0JCQlGaWxlIGF4aXNfdGFyZ2V0X2xpYnNfZGlyZWN0b3J5ID0gbmV3IEZpbGUoYXhpc190YXJnZXRfbGliKTsKLQkJCUZpbGUgYXhpc19saWJzX2RpcmVjdG9yeSA9IG5ldyBGaWxlKGF4aXNfc3RkX2xpYl9kaXJlY3RvcnkpOwotCQkJIGlmIChheGlzX2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkgfHwgYXhpc190YXJnZXRfbGlic19kaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCSBheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmxvYWRsaWIuc3VjY2Vzcy5jYXB0aW9uIikpOwotCQkJCWlmKGF4aXNfbGlic19kaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSl7Ci0JCQkJCWF4aXMyTGlic0xvY2F0aW9uPWF4aXNfc3RkX2xpYl9kaXJlY3Rvcnk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYXhpc190YXJnZXRfbGlic19kaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSl7Ci0JCQkJCWF4aXMyTGlic0xvY2F0aW9uPWF4aXNfdGFyZ2V0X2xpYjsKLQkJCQl9Ci0JCQkJIGphckZpbGVDb3B5T3B0aW9uID10cnVlOwotCQkJCSBDb2xvciBjb2xvciA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOwotCQkJCSBheGlzTG9hZExpYlJlc3VsdHNMYWJlbC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCSB9ZWxzZXsKLQkJCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5sb2FkbGliLmZhaWwuY2FwdGlvbiIpKTsKLQkJCSAgICAgQ29sb3IgY29sb3IgPSBnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJCSAgICAgYXhpc0xvYWRMaWJSZXN1bHRzTGFiZWwuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0JCQkgICAgIHVwZGF0ZVN0YXR1cyhvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnBsdWdpbi5Db2RlZ2VuV2l6YXJkUGx1Z2luCi0JCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmxvYWRsaWIuZmFpbC5tZXNzYWdlIikpOwotCQkJICAgICBqYXJGaWxlQ29weU9wdGlvbj1mYWxzZTsKLQkJCSB9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBIYW5kbGUgdGhlIGJyb3dzZSBidXR0b24gZXZlbnRzOiBvcGVucyBhIGRpYWxvZyB3aGVyZSB0aGUgdXNlciBjYW4gY2hvb3NlCi0JICogYW4gZXh0ZXJuYWwgZGlyZWN0b3J5IGxvY2F0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZSgpIHsKLQkJLy8gQ2hhbmdlIHRoaXMgdG8gYWRkIHRoZSBjbGFyaXR5IG9mIDIgb3B0aW9uIGJ1dHRpb25zCi0JCS8vIGJvb2xlYW4gbG9jYXRpb24gPSBsb2NhdGlvblNlbGVjdENoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQlib29sZWFuIGxvY2F0aW9uID0gZmFsc2U7Ci0JCWlmKHNldHRpbmdzLmdldEJvb2xlYW4oUFJFRl9DSEVDS19GSUxFX1NZU1RFTSkpewotCQkJbG9jYXRpb24gPSBmYWxzZTsKLQkJfWVsc2UgaWYoc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX0NIRUNLX1dPUktTUEFDRSkpewotCQkJbG9jYXRpb24gPSB0cnVlOwotCQl9Ci0KLQkJaWYgKHdvcmtzcGFjZVNhdmVPcHRpb24pIHsKLQkJCWxvY2F0aW9uID0gdHJ1ZTsKLQkJfQotCi0JCWlmICghbG9jYXRpb24pIHsKLQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5TdHJpbmcgIT0gbnVsbCkgewotCQkJCW91dHB1dExvY2F0aW9uLnNldFRleHQocmV0dXJuU3RyaW5nKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0JCQlDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZygKLQkJCQkJZ2V0U2hlbGwoKSwgcm9vdCwgZmFsc2UsIENvZGVnZW5XaXphcmRQbHVnaW4KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNvbnRhaW5lcmJveC50aXRsZSIpKTsKLQkJCWlmIChkaWFsb2cub3BlbigpID09IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZy5PSykgewotCQkJCU9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAxKSB7Ci0JCQkJCVBhdGggcGF0aCA9ICgoUGF0aCkgcmVzdWx0WzBdKTsKLQkJCQkJLy8gYXBwZW5kIHRvIHRoZSB3b3Jrc3BhY2UgcGF0aAotCQkJCQlpZiAocm9vdC5leGlzdHMocGF0aCkpIHsKLQkJCQkJCW91dHB1dExvY2F0aW9uLnNldFRleHQocm9vdC5nZXRMb2NhdGlvbigpLmFwcGVuZChwYXRoKQotCQkJCQkJCQkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudWkuQ29kZWdlblBhZ2UjZ2V0UGFnZVR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0JCXJldHVybiBXU0RMXzJfSkFWQV9UWVBFOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvVG9vbFNlbGVjdGlvblBhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvVG9vbFNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmOWZjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1Rvb2xTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5Db2RlR2VuV2l6YXJkOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UucGx1Z2luLkNvZGVnZW5XaXphcmRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotcHVibGljIGNsYXNzIFRvb2xTZWxlY3Rpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYWdlIHsKLSAgIAotICAgIHByaXZhdGUgQnV0dG9uIGphdmEyV1NETFJhZGlvQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHdzZGwySmF2YVJhZGlvQnV0dG9uOwotICAgIHB1YmxpYyBUb29sU2VsZWN0aW9uUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoInBhZ2UwIik7Ci0gICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2V0dGluZ3Mgb24gdGhpcyBwYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfVE9PTF9TRUxFQ1RJT05fSkFWQTJXU0RMLCBmYWxzZSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1RPT0xfU0VMRUNUSU9OX1dTREwySkFWQSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA5OwotCi0gICAgICAgICAgICAgIAotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMC5vcHRpb25zLmRlc2MiKSk7Ci0gICAgICAgICAgICAgCi0gICAgICAgIHdzZGwySmF2YVJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlJBRElPKTsKLSAgICAgICAgd3NkbDJKYXZhUmFkaW9CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMC53c2RsMmphdmEuY2FwdGlvbiIpKTsKLSAgICAgICAgd3NkbDJKYXZhUmFkaW9CdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicGFnZTAud3NkbDJqYXZhLmRlc2MiKSk7Ci0gICAgICAgIHdzZGwySmF2YVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfVE9PTF9TRUxFQ1RJT05fV1NETDJKQVZBKSk7Ci0gICAgICAgIHdzZGwySmF2YVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGphdmEyV1NETFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlJBRElPKTsKLSAgICAgICAgamF2YTJXU0RMUmFkaW9CdXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMC5qYXZhMndzZGwuY2FwdGlvbiIpKTsKLSAgICAgICAgamF2YTJXU0RMUmFkaW9CdXR0b24uc2V0VG9vbFRpcFRleHQoQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicGFnZTAuamF2YTJ3c2RsLmRlc2MiKSk7Ci0gICAgICAgIGphdmEyV1NETFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfVE9PTF9TRUxFQ1RJT05fSkFWQTJXU0RMKSk7Ci0gICAgICAgIGphdmEyV1NETFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0gICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaGFuZGxlQ2hlY2tib3hTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGZpbGxMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgZmlsbExhYmVsLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5lbXB0eSIpKTsKLQotICAgICAgICBMYWJlbCBoaW50TGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0gICAgICAgIGhpbnRMYWJlbC5zZXRUZXh0KENvZGVnZW5XaXphcmRQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UwLmhpbnQuZGVzYyIpKTsKLQotICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy9qYXZhMldTRExSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgCi0gICAgICAgIGhhbmRsZUNoZWNrYm94U2VsZWN0aW9uKCk7Ci0gICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKLQotICAgIH0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDaGVja2JveFNlbGVjdGlvbigpewotCSAgICBDb2RlR2VuV2l6YXJkIHdpemFyZCA9IChDb2RlR2VuV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCk7Ci0JICAgIGlmICh3c2RsMkphdmFSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9UT09MX1NFTEVDVElPTl9XU0RMMkpBVkEsdHJ1ZSk7Ci0JICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9UT09MX1NFTEVDVElPTl9KQVZBMldTREwsZmFsc2UpOwotCSAgICAgICB3aXphcmQuc2V0U2VsZWN0ZWRXaXphcmRUeXBlKFdTRExfMl9KQVZBX1RZUEUpOyAKLQkgICAgfWVsc2UgaWYgKGphdmEyV1NETFJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLQkgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1RPT0xfU0VMRUNUSU9OX1dTREwySkFWQSxmYWxzZSk7Ci0JICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9UT09MX1NFTEVDVElPTl9KQVZBMldTREwsdHJ1ZSk7Ci0JICAgICAgICB3aXphcmQuc2V0U2VsZWN0ZWRXaXphcmRUeXBlKEpBVkFfMl9XU0RMX1RZUEUpOyAKLQkgICAgfQotCX0KLQkKLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkNvZGVnZW5QYWdlI2dldFBhZ2VUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICAgcmV0dXJuIFVOU1BFQ0lGSUVEX1RZUEU7Ci0gICAgfQotICAgIAotICAgICAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1dTRExGaWxlU2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA3NDA5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdWkvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS5wbHVnaW4uQ29kZWdlbldpemFyZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBmaXJzdCBwYWdlIG9mIHRoZSBjb2RlIGdlbmVyYXRvciB3aXpyYWQuIEFza3MgZm9yIHRoZSBXU0RMIGZpbGUgTmFtZQotICovCi0KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBUZXh0IGZpbGVUZXh0OyAKLQotICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHBhZ2VOYW1lCi0gICAgICovCi0gICAgcHVibGljIFdTRExGaWxlU2VsZWN0aW9uUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoInBhZ2UxIik7Ci0gICAgICAgCi0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNldHRpbmdzIG9uIHRoaXMgcGFnZS4gRm9yCi0gICAgICogV1NETEZpbGVTZWxlY3Rpb24sIHRoaXMgaXMgbm90IHZlcnkgbXVjaC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX0xPQ0FUSU9OLCAiIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBJRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgLy9sYXlvdXQudmVydGljYWxTcGFjaW5nID0gOTsKLSAgICAgCi0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIExhYmVsIGxhYmVsRmlsZSA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWxGaWxlLnNldFRleHQoQ29kZWdlbldpemFyZFBsdWdpbgotICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZmlsZXNlbGVjdGlvbi5sYWJlbCIpKTsKLSAgICAgICAgCi0gICAgICAgIGZpbGVUZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0gICAgICAgIGZpbGVUZXh0LnNldExheW91dERhdGEoZ2QpOwotCSAgICBmaWxlVGV4dC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX1dTRExfTE9DQVRJT04pKTsKLSAgICAgICAgZmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfV1NETF9MT0NBVElPTiwgZmlsZVRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2dDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOwotICAgICAgICBidXR0b24uc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5maWxlc2VsZWN0aW9uLmJyb3dzZSIpKTsKLSAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUJyb3dzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuPTM7Ci0gICAgICAgIExhYmVsIGZpbGxMYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgZmlsbExhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW49MzsKLSAgICAgICAgTGFiZWwgaGludExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotICAgICAgICBoaW50TGFiZWwuc2V0VGV4dChDb2RlZ2VuV2l6YXJkUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5oaW50LmRlc2MiKSk7Ci0gICAgICAgIGhpbnRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLS8vICAgICAgICBoaW50TGFiZWwuc2V0Rm9udChuZXcgRm9udChuZXcgRGV2aWNlKCkgewotLy8JCQlwdWJsaWMgaW50IGludGVybmFsX25ld19HQyhHQ0RhdGEgZGF0YSkge3JldHVybiAwO30KLS8vCQkJcHVibGljIHZvaWQgaW50ZXJuYWxfZGlzcG9zZV9HQyhpbnQgaGFuZGxlLCBHQ0RhdGEgZGF0YSkge30KLS8vCQkJCQkJCQkJCQl9LCJoaW50Rm9udCIsNixTV1QuTk9STUFMKSk7Ci0gICAgICAgIAotICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICBzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVmFsaWRhdGUgdGhpcyBkaWFsb2csIGJlY2F1c2Ugd2UgY291bGQgaGF2ZSBnb3QgdmFsaWQgdmFsdWVzIGZyb20gdGhlCi0gICAgICAgICAqIHNldHRpbmdzIGFscmVhZHkuCi0gICAgICAgICAqLwotICAgICAgICBpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyl7Ci0gICAgICAgICAgICBkaWFsb2dDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgdGhlIGRpYWxvZyBjaGFuZ2UgZXZlbnQuIEJhc2ljYWxseSBldmFsdWF0ZXMgdGhlIGZpbGUgbmFtZSBhbmQKLSAgICAgKiBzZXRzIHRoZSBlcnJvciBtZXNzYWdlIGFjY29yZGluZ2x5Ci0gICAgICogCi0gICAgICogVE9ETyAtIHdlIG1pZ2h0IG5lZWQgdG8gY2FsbCB0aGlzIGluIGEgZGlmZmVyZW50IGV2ZW50ISEhCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpYWxvZ0NoYW5nZWQoKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhDb2RlZ2VuV2l6YXJkUGx1Z2luCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZXJyb3IuZmlsZW1pc3NpbmdlcnJvciIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy90cnkgcG9wdWxhdGUgdGhlIG9wdGlvbnMKLSAgICAgICAgZ2V0Q29kZWdlbldpemFyZCgpLnBvcHVsYXRlT3B0aW9ucygpOwotICAgICAgICAvLyB1cGRhdGUgdGhlIHN0YXR1cwotICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3BzIHVwIHRoZSBmaWxlIGJyb3dzZSBkaWFsb2cgYm94Ci0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKSB7Ci0JICAgIGZpbGVUZXh0LnNldFRleHQoImVudGVyIGEgdmFsaWQgKi53c2RsLyoueG1sIHNlcnZpY2UgZGVzY3JpcHRpb24gZmlsZSIpOwotICAgICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotICAgICAgICBmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgIioud3NkbCIgLCIqLnhtbCJ9KTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlVGV4dC5zZXRUZXh0KGZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmlsZSBuYW1lCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlVGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnVpLkNvZGVnZW5QYWdlI2dldFBhZ2VUeXBlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gV1NETF8yX0pBVkFfVFlQRTsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1dTRExKYXZhQWR2YW5jZURpYWxvZy5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91aS9XU0RMSmF2YUFkdmFuY2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmNWFiYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3VpL1dTRExKYXZhQWR2YW5jZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIFdTRExKYXZhQWR2YW5jZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIEJ1dHRvbiB0bXBDaGVja0JveDsgCi0JcHJpdmF0ZSBUZXh0IHRtcFRleHRCb3g7Ci0JcHJpdmF0ZSBIYXNoTWFwIGFkdmFuY2VPcHRpb25zOwotCXByaXZhdGUgYm9vbGVhbiBpc0VkaXRBZHZhbmNlT3B0aW9ucz1mYWxzZTsKLQlwcml2YXRlIENvbWJvIHdzZGxWZXJzaW9uQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gcGFja2FnZVJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIFRhYmxlIHBhY2thZ2VOYW1lTGlzdDsKLQlwcml2YXRlIEJ1dHRvbiBwYWNrYWdlQWRkQnV0dG9uOwotCXByaXZhdGUgVGV4dCBhZGROZXdFeGNsdWRlUGFja2FnZU5hbWU7Ci0KLQlwcm90ZWN0ZWQgV1NETEphdmFBZHZhbmNlRGlhbG9nKFNoZWxsIHNoZWxsLCBIYXNoTWFwIGFkdmFuY2VPcHRpb25zKSB7Ci0JCXN1cGVyKHNoZWxsKTsKLQkJaXNFZGl0QWR2YW5jZU9wdGlvbnM9KGFkdmFuY2VPcHRpb25zIT1udWxsKTsKLQkJaWYgKGlzRWRpdEFkdmFuY2VPcHRpb25zKQotCQkJdGhpcy5hZHZhbmNlT3B0aW9ucz0oSGFzaE1hcCkgYWR2YW5jZU9wdGlvbnMuY2xvbmUoKTsKLQkJZWxzZQotCQkJdGhpcy5hZHZhbmNlT3B0aW9ucz1uZXcgSGFzaE1hcCgpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGFkZENoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIsCi0JCQlmaW5hbCBCdXR0b24gdG1wQ2hlY2tCb3gsU3RyaW5nIGNhcHRpb24sZmluYWwgU3RyaW5nIHBhcmFtZXRlclR5cGUpewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCS8vdG1wQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJdG1wQ2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRtcENoZWNrQm94LnNldFRleHQoY2FwdGlvbik7Ci0JCWlmIChpc0VkaXRBZHZhbmNlT3B0aW9ucykKLQkJCXRtcENoZWNrQm94LnNldFNlbGVjdGlvbihhZHZhbmNlT3B0aW9ucy5jb250YWluc0tleShwYXJhbWV0ZXJUeXBlKSk7Ci0JCXRtcENoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0Q2hlY2tCb3hTdGF0ZShwYXJhbWV0ZXJUeXBlLCB0bXBDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdG1wQ2hlY2tCb3g7Ci0JfQotCQotCXByaXZhdGUgVGV4dCBhZGRUZXh0Qm94KENvbXBvc2l0ZSBjb250YWluZXIsTGFiZWwgbGJsQ2FwdGlvbiwgCi0JCQlmaW5hbCBUZXh0IHRtcFRleHRCb3gsIFN0cmluZyBjYXB0aW9uLGZpbmFsIFN0cmluZyBwYXJhbWV0ZXJUeXBlLGJvb2xlYW4gaXNCcm93c2VGb2xkZXIpewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdkLndpZHRoSGludD0yMDA7Ci0JCWxibENhcHRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxibENhcHRpb24uc2V0VGV4dChjYXB0aW9uKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaWYgKGlzQnJvd3NlRm9sZGVyKQotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQllbHNlCi0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRtcFRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWlmIChpc0VkaXRBZHZhbmNlT3B0aW9ucykKLQkJCWlmIChhZHZhbmNlT3B0aW9ucy5jb250YWluc0tleShwYXJhbWV0ZXJUeXBlKSkKLQkJCQl0bXBUZXh0Qm94LnNldFRleHQoKChTdHJpbmdbXSlhZHZhbmNlT3B0aW9ucy5nZXQocGFyYW1ldGVyVHlwZSkpWzBdKTsKLQkJdG1wVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRUZXh0Qm94VmFsdWUocGFyYW1ldGVyVHlwZSwgdG1wVGV4dEJveC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJaWYgKGlzQnJvd3NlRm9sZGVyKXsKLQkJCUJ1dHRvbiBicm93c2U9bmV3IEJ1dHRvbihjb250YWluZXIsU1dULk5VTEwpOwotCQkJYnJvd3NlLnNldFRleHQoIkJyb3dzZSIpOwotCQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJCVN0cmluZyByZXR1cm5TdHJpbmcgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAocmV0dXJuU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCXRtcFRleHRCb3guc2V0VGV4dChyZXR1cm5TdHJpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHRtcFRleHRCb3g7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkvL0ZvbnRVdGlsIGZvbnRVdGlsID0gRm9udFV0aWwuZ2V0SW5zdGFuY2UoY29udGFpbmVyLmdldERpc3BsYXkoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDEwOwotCi0JCUdyaWREYXRhIGdkOwotCQkKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlNwZWNpZnkgYSByZXBvc2l0b3J5IGFnYWluc3Qgd2hpY2ggY29kZSBpcyBnZW5lcmF0ZWQuIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04sdHJ1ZSk7Ci0JCWFkZFRleHRCb3goY29udGFpbmVyLG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpLCBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUiksIAotCQkJCSJTcGVjaWZ5IGEgZGlyZWN0b3J5IHBhdGggZm9yIGdlbmVyYXRlZCBzb3VyY2UiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTix0cnVlKTsKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlNwZWNpZnkgYSBkaXJlY3RvcnkgcGF0aCBmb3IgZ2VuZXJhdGVkIHJlc291cmNlcyIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVNPVVJDRV9GT0xERVJfT1BUSU9OLHRydWUpOwotCQlhZGRUZXh0Qm94KGNvbnRhaW5lcixuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKSwgbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpLCAKLQkJCQkiUHJveHkgaG9zdCBhZGRyZXNzIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuSFRUUF9QUk9YWV9IT1NUX09QVElPTl9MT05HLGZhbHNlKTsKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlByb3h5IHBvcnQgYWRkcmVzcyBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkhUVFBfUFJPWFlfUE9SVF9PUFRJT05fTE9ORyxmYWxzZSk7Ci0JCWFkZFRleHRCb3goY29udGFpbmVyLG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpLCBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUiksIAotCQkJCSJTa2VsdG9uIGludGVyZmFjZSBuYW1lIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNLRUxUT05fSU5URVJGQUNFX05BTUVfT1BUSU9OLGZhbHNlKTsKLQkJYWRkVGV4dEJveChjb250YWluZXIsbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCksIG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKSwgCi0JCQkJIlNrZWx0b24gY2xhc3MgbmFtZSIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TS0VMVE9OX0NMQVNTX05BTUVfT1BUSU9OLGZhbHNlKTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJTGFiZWwgZmlsbExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJZmlsbExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiVW5wYWNrcyB0aGUgZGF0YWJpbmRpbmcgY2xhc3NlcyIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04pOwotCQl0bXBDaGVja0JveD1uZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTthZGRDaGVja0JveChjb250YWluZXIsdG1wQ2hlY2tCb3gsIAotCQkJCSJGbGF0dGVucyB0aGUgZ2VuZXJhdGVkIGZpbGVzIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkZMQVRURU5fRklMRVNfT1BUSU9OKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiU3dpdGNoIG9uIHVuLXdyYXBwaW5nIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlVOV1JBUF9QQVJBTUVURVJTKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiR2VuZXJhdGUgY29kZSBmb3IgYWxsIHBvcnRzIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT04pOwotCQl0bXBDaGVja0JveD1uZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTthZGRDaGVja0JveChjb250YWluZXIsdG1wQ2hlY2tCb3gsIAotCQkJCSJPdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGNsYXNzZXMiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiR2VuZXJhdGUgQXhpcyAxLnggYmFja3dvcmQgY29tcGF0aWJsZSBjb2RlIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiU3VwcHJlc3MgbmFtZXNwYWNlIHByZWZpeGVzIChPcHRpbXphdGlvbiB0aGF0IHJlZHVjZXMgc2l6ZSBvZiBzb2FwIHJlcXVlc3QvcmVzcG9uc2UpIiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTik7Ci0JCXRtcENoZWNrQm94PW5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spO2FkZENoZWNrQm94KGNvbnRhaW5lcix0bXBDaGVja0JveCwgCi0JCQkJIkRvbnQgZ2VuZXJhdGUgdGhlIGJ1aWxkLnhtbCBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSIsIAotCQkJCUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19CVUlMRF9YTUxfT1BUSU9OX0xPTkcpOwotCQl0bXBDaGVja0JveD1uZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTthZGRDaGVja0JveChjb250YWluZXIsdG1wQ2hlY2tCb3gsIAotCQkJCSJEb250IGdlbmVyYXRlIFdTRExzIGluIHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IiwgCi0JCQkJQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX1dTRExTX09QVElPTl9MT05HKTsKLQkJdG1wQ2hlY2tCb3g9bmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7YWRkQ2hlY2tCb3goY29udGFpbmVyLHRtcENoZWNrQm94LCAKLQkJCQkiRG9udCBnZW5lcmF0ZSBhIE1lc3NhZ2VSZWNlaXZlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMiLCAKLQkJCQlDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORyk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlmaWxsTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2Qud2lkdGhIaW50PTQwMDsKLQkJTGFiZWwgZmlsbExhYmVsMT1uZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLQkJZmlsbExhYmVsMS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbExhYmVsMS5zZXRUZXh0KCJXU0RMIHZlcnNpb24iKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJd3NkbFZlcnNpb25Db21ibz1uZXcgQ29tYm8oY29udGFpbmVyLFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSfCBTV1QuUkVBRF9PTkxZKTsKLQkJd3NkbFZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmlsbFdTRExWZXJzaW9uQ29tYm8oKTsKLQkJU3RyaW5nIGtleT1Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTjsKLQkJaWYgKChpc0VkaXRBZHZhbmNlT3B0aW9ucykgJiYgKGFkdmFuY2VPcHRpb25zLmNvbnRhaW5zS2V5KGtleSkpKQotCQkJd3NkbFZlcnNpb25Db21iby5zZWxlY3Qod3NkbFZlcnNpb25Db21iby5pbmRleE9mKCgoU3RyaW5nW10pYWR2YW5jZU9wdGlvbnMuZ2V0KGtleSkpWzBdKSk7Ci0JCQotCQl3c2RsVmVyc2lvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVXc2RsVmVyc2lvbkNvbWJvU2VsZWN0ZWQoKTsKLQotCQkJfTsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX07Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlmaWxsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlmaWxsTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCUxhYmVsIGxhYmVsUGFja2FnZUFkZENhcHRpb24gPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsUGFja2FnZUFkZENhcHRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxhYmVsUGFja2FnZUFkZENhcHRpb24uc2V0VGV4dCgiRXhjbHVkZXMgUGFja2FnZXMiKTsKLQotCQlhZGROZXdFeGNsdWRlUGFja2FnZU5hbWU9bmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFkZE5ld0V4Y2x1ZGVQYWNrYWdlTmFtZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYWRkTmV3RXhjbHVkZVBhY2thZ2VOYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWhhbmRsZU5ld1BhY2thZ2VOYW1lQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwYWNrYWdlQWRkQnV0dG9uPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWNrYWdlQWRkQnV0dG9uLnNldFRleHQoIkFkZCIpOwotCQlwYWNrYWdlQWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkUGFja2FnZU5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JCXBhY2thZ2VBZGRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcGFja2FnZU5hbWVMaXN0ID0gbmV3IFRhYmxlKGNvbnRhaW5lciwKLQkJCQlTV1QuU0lOR0xFfFNXVC5GVUxMX1NFTEVDVElPTnxTV1QuVl9TQ1JPTEx8U1dULkhfU0NST0xMKTsKLQkJcGFja2FnZU5hbWVMaXN0LnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJcGFja2FnZU5hbWVMaXN0LnNldEhlYWRlclZpc2libGUodHJ1ZSk7IAotCQlwYWNrYWdlTmFtZUxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwYWNrYWdlTmFtZUxpc3QsU1dULk5PTkUpOwotCQljb2x1bW4uc2V0V2lkdGgoNTAwKTsKLQkJY29sdW1uLnNldFRleHQoIkV4Y2x1ZGVkIHBhY2thZ2VzIik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ2QuaGVpZ2h0SGludCA9IDgwOwotCQlwYWNrYWdlTmFtZUxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhY2thZ2VOYW1lTGlzdC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaWYgKGlzRWRpdEFkdmFuY2VPcHRpb25zKSB1cGRhdGVFeGNsdWRlUGFja2FnZUxpc3QoKTsKLQkJcGFja2FnZU5hbWVMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUGFja2FnZU5hbWVMaXN0Q2xpY2soKTsKLQkJCX0KLQkJfSk7Ci0vLwkJdGFibGVPdXRwdXRNYXBzLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotLy8JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSl7Ci0vLwkJCQkvL2hhbmRsZU91dHB1dE1hcEVkaXRRdWVyeSgpOwotLy8JCQl9Ci0vLwkJfSk7Ci0JCXBhY2thZ2VOYW1lTGlzdC5yZWRyYXcoKTsKLQkJcGFja2FnZU5hbWVMaXN0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCUxhYmVsIGZpbGxMYWJlbDQgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWZpbGxMYWJlbDQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlwYWNrYWdlUmVtb3ZlQnV0dG9uPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWNrYWdlUmVtb3ZlQnV0dG9uLnNldFRleHQoIlJlbW92ZSIpOwotCQlwYWNrYWdlUmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVtb3ZlUGFja2FnZU5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JCXBhY2thZ2VSZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQloYW5kbGVQYWNrYWdlTmFtZUxpc3RDbGljaygpOwotCQloYW5kbGVOZXdQYWNrYWdlTmFtZUNoYW5nZSgpOwotCQkKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVBhY2thZ2VOYW1lTGlzdENsaWNrKCl7Ci0JCXBhY2thZ2VSZW1vdmVCdXR0b24uc2V0RW5hYmxlZChwYWNrYWdlTmFtZUxpc3QuZ2V0U2VsZWN0aW9uQ291bnQoKT4wKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhY2thZ2VOYW1lKCl7Ci0JCWlmIChwYWNrYWdlTmFtZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKSE9LTEpewotCQkJU3RyaW5nIHR5cGU9Q29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkVYQ0xVREVfUEFLQUdFU19PUFRJT047Ci0JCQlTdHJpbmdbXSBjb21tYVNlcGVyYXRlZFBhY2thZ2VMaXN0PShTdHJpbmdbXSkgYWR2YW5jZU9wdGlvbnMuZ2V0KHR5cGUpOwotCQkJU3RyaW5nW10gcGFja2FnZUxpc3Q9Y29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdFswXS5zcGxpdCgiLCIpOwotCQkJU3RyaW5nIG5ld0xpc3Q9IiI7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleD1wYWNrYWdlTmFtZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCVN0cmluZyB0b1JlbW92ZT1wYWNrYWdlTmFtZUxpc3QuZ2V0SXRlbShzZWxlY3RlZEluZGV4KS5nZXRUZXh0KCk7Ci0JCQlmb3IgKFN0cmluZyBzIDogcGFja2FnZUxpc3QpIHsKLQkJCQlpZiAoIXMuZXF1YWxzSWdub3JlQ2FzZSh0b1JlbW92ZSkpewotCQkJCQlpZiAobmV3TGlzdC5lcXVhbHNJZ25vcmVDYXNlKCIiKSkKLQkJCQkJCW5ld0xpc3Q9czsKLQkJCQkJZWxzZQotCQkJCQkJbmV3TGlzdD1uZXdMaXN0KyIsIitzOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LmVxdWFsc0lnbm9yZUNhc2UoIiIpKQotCQkJCWFkdmFuY2VPcHRpb25zLnJlbW92ZSh0eXBlKTsKLQkJCWVsc2UKLQkJCQlhZHZhbmNlT3B0aW9ucy5wdXQodHlwZSwgbmV3IFN0cmluZ1tde25ld0xpc3R9KTsKLQkJCXBhY2thZ2VOYW1lTGlzdC5yZW1vdmUoc2VsZWN0ZWRJbmRleCk7Ci0JCQlpZiAoc2VsZWN0ZWRJbmRleD49cGFja2FnZU5hbWVMaXN0LmdldEl0ZW1Db3VudCgpKQotCQkJCXNlbGVjdGVkSW5kZXgtLTsKLQkJCXBhY2thZ2VOYW1lTGlzdC5zZWxlY3Qoc2VsZWN0ZWRJbmRleCk7Ci0JCX0KLQkJcGFja2FnZU5hbWVMaXN0LnJlZHJhdygpOwotCQloYW5kbGVQYWNrYWdlTmFtZUxpc3RDbGljaygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUGFja2FnZU5hbWUoKXsKLQkJU3RyaW5nIG5ld0xpc3Q7Ci0JCVN0cmluZyB0eXBlPUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OOwotCQlpZiAocGFja2FnZU5hbWVMaXN0LmdldEl0ZW1Db3VudCgpPjApewotCQkJU3RyaW5nW10gY29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdD0oU3RyaW5nW10pIGFkdmFuY2VPcHRpb25zLmdldCh0eXBlKTsKLQkJCW5ld0xpc3Q9Y29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdFswXSsiLCIrYWRkTmV3RXhjbHVkZVBhY2thZ2VOYW1lLmdldFRleHQoKTsKLQkJfWVsc2UKLQkJCW5ld0xpc3Q9YWRkTmV3RXhjbHVkZVBhY2thZ2VOYW1lLmdldFRleHQoKTsKLQkJYWR2YW5jZU9wdGlvbnMucHV0KHR5cGUsbmV3IFN0cmluZ1tde25ld0xpc3R9KTsKLQkJYWRkVGFibGVJdGVtKGFkZE5ld0V4Y2x1ZGVQYWNrYWdlTmFtZS5nZXRUZXh0KCkpOwotCQlhZGROZXdFeGNsdWRlUGFja2FnZU5hbWUuc2V0VGV4dCgiIik7Ci0JCWhhbmRsZU5ld1BhY2thZ2VOYW1lQ2hhbmdlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVFeGNsdWRlUGFja2FnZUxpc3QoKXsKLQkJcGFja2FnZU5hbWVMaXN0LmNsZWFyQWxsKCk7Ci0JCVN0cmluZyB0eXBlPUNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5FWENMVURFX1BBS0FHRVNfT1BUSU9OOwotCQlpZiAoYWR2YW5jZU9wdGlvbnMuY29udGFpbnNLZXkodHlwZSkpewotCQkJU3RyaW5nW10gY29tbWFTZXBlcmF0ZWRQYWNrYWdlTGlzdD0oU3RyaW5nW10pIGFkdmFuY2VPcHRpb25zLmdldCh0eXBlKTsKLQkJCVN0cmluZ1tdIHBhY2thZ2VMaXN0PWNvbW1hU2VwZXJhdGVkUGFja2FnZUxpc3RbMF0uc3BsaXQoIiwiKTsKLQkJCWZvciAoU3RyaW5nIHN0cmluZyA6IHBhY2thZ2VMaXN0KSB7Ci0JCQkJYWRkVGFibGVJdGVtKHN0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRhYmxlSXRlbShTdHJpbmcgaXRlbVRleHQpewotCQlUYWJsZUl0ZW0gaXRlbT1uZXcgVGFibGVJdGVtKHBhY2thZ2VOYW1lTGlzdCxTV1QuTm9uZSk7Ci0JCWl0ZW0uc2V0VGV4dChpdGVtVGV4dCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVOZXdQYWNrYWdlTmFtZUNoYW5nZSgpewotCQlQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIl5bYS16QS1aX1xcJF1bXFx3XFwkXSooPzpcXC5bYS16QS1aX1xcJF1bXFx3XFwkXSopKiQiKTsKLSAgICAgICAgcGFja2FnZUFkZEJ1dHRvbi5zZXRFbmFibGVkKHAubWF0Y2hlcihhZGROZXdFeGNsdWRlUGFja2FnZU5hbWUuZ2V0VGV4dCgpKS5tYXRjaGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlV3NkbFZlcnNpb25Db21ib1NlbGVjdGVkKCl7Ci0JCWFkdmFuY2VPcHRpb25zLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwgCi0JCQkJbmV3IFN0cmluZ1tde3dzZGxWZXJzaW9uQ29tYm8uZ2V0SXRlbSh3c2RsVmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBmaWxsV1NETFZlcnNpb25Db21ibygpewotCQl3c2RsVmVyc2lvbkNvbWJvLnJlbW92ZUFsbCgpOwotCQl3c2RsVmVyc2lvbkNvbWJvLmFkZCgiMS4xIik7Ci0JCXdzZGxWZXJzaW9uQ29tYm8uYWRkKCIyLjAiKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldENoZWNrQm94U3RhdGUoU3RyaW5nIHR5cGUsYm9vbGVhbiBzdGF0ZSl7Ci0JCWlmIChzdGF0ZSkKLQkJCWFkdmFuY2VPcHRpb25zLnB1dCh0eXBlLCBudWxsKTsKLQkJZWxzZQotCQkJYWR2YW5jZU9wdGlvbnMucmVtb3ZlKHR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VGV4dEJveFZhbHVlKFN0cmluZyB0eXBlLFN0cmluZyB2YWx1ZSl7Ci0JCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCIiKSkKLQkJCWFkdmFuY2VPcHRpb25zLnJlbW92ZSh0eXBlKTsKLQkJZWxzZQotCQkJYWR2YW5jZU9wdGlvbnMucHV0KHR5cGUsIG5ldyBTdHJpbmdbXXt2YWx1ZX0pOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEFkdmFuY2VPcHRpb25zKCl7Ci0JCXJldHVybiBhZHZhbmNlT3B0aW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9lY2xpcHNlL3V0aWwvQ2xhc3NGaWxlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjAxYjQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL0NsYXNzRmlsZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIHJlYWRpbmcvbG9hZGluZyBjbGFzc2VzIGFuZAotICogZXh0cmFjdGluZyB0aGUgaW5mb3JtYXRpb24uCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlUmVhZGVyIHsKLQotCS8qKgotCSAqIHRyeSB3aGV0aGVyIGEgZ2l2ZW4gY2xhc3MgY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcGFyYW0gY2xhc3NQYXRoRW50cmllcwotCSAqIEBwYXJhbSBlcnJvckxpc3RlbmVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cnlMb2FkaW5nQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwKLQkJCVN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMsIExpc3QgZXJyb3JMaXN0ZW5lcikgewotCQkvL21ha2UgYSBVUkwgY2xhc3MgbG9hZGVyIGZyb20gdGhlIGVudHJpZXMKLQkJQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0KLQkJaWYgKGNsYXNzUGF0aEVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJVVJMW10gdXJscyA9IG5ldyBVUkxbY2xhc3NQYXRoRW50cmllcy5sZW5ndGhdOwotCi0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NQYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgY2xhc3NQYXRoRW50cnkgPSBjbGFzc1BhdGhFbnRyaWVzW2ldOwotCQkJCQkvL3RoaXMgc2hvdWxkIGJlIGEgZmlsZShvciBhIFVSTCkKLQkJCQkJaWYgKGNsYXNzUGF0aEVudHJ5LnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgewotCQkJCQkJdXJsc1tpXSA9IG5ldyBVUkwoY2xhc3NQYXRoRW50cnkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdXJsc1tpXSA9IG5ldyBGaWxlKGNsYXNzUGF0aEVudHJ5KS50b1VSTCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZXJyb3JMaXN0ZW5lciE9bnVsbCl7Ci0JCQkJCWVycm9yTGlzdGVuZXIuYWRkKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWNsYXNzTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMpOwotCi0JCX0gZWxzZSB7Ci0JCQljbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCX0KLQkJCi0JCS8vdHJ5IHRvIGxvYWQgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkJCi0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6ej1jbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCWNsYXp6LmdldE1ldGhvZHMoKTsKLQkJICAgIAotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAoZXJyb3JMaXN0ZW5lciE9bnVsbCl7Ci0JCQkJZXJyb3JMaXN0ZW5lci5hZGQodCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL05hbWVzcGFjZUZpbmRlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL05hbWVzcGFjZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMyNWNkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9OYW1lc3BhY2VGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvZGVnZW4uZWNsaXBzZS51dGlsOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlRmluZGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfUFJFRklYID0gImh0dHA6Ly8iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTQ0hFTUFfTlNfREVGQVVMVF9QUkVGSVggPSAieHNkIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfREVGQVVMVF9QUkVGSVggPSAibnMiOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyhTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpewotCQkvL3Rva2VuaXplIHRoZSBjbGFzc05hbWUKLQkJU3RyaW5nW10gY2xhc3NOYW1lUGFydHMgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5zcGxpdCgiXFwuIik7Ci0JCS8vYWRkIHRoZSBzdHJpbmdzIGluIHJldmVyc2Ugb3JkZXIgdG8gbWFrZSB0aGUgbmFtZXNwYWNlCi0JCVN0cmluZyBuc1VyaSA9ICIiOwotCQlmb3IoaW50IGk9Y2xhc3NOYW1lUGFydHMubGVuZ3RoLTI7aT49MDtpLS0pewotCQkJbnNVcmkgPSBuc1VyaSArIGNsYXNzTmFtZVBhcnRzW2ldICsgKGk9PTA/IiI6Ii4iKTsKLQkJfQotCQkKLQkJcmV0dXJuIE5TX1BSRUZJWCArIG5zVXJpOwkKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyhTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpewotCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbUNsYXNzKGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hTmFtZXNwYWNlUHJlZml4KCl7Ci0JCXJldHVybiBTQ0hFTUFfTlNfREVGQVVMVF9QUkVGSVg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VQcmVmaXgoKXsKLQkJcmV0dXJuIE5TX0RFRkFVTFRfUFJFRklYOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZVRleHQoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLQkJLy90b2tlbml6ZSB0aGUgY2xhc3NOYW1lCi0JCVN0cmluZ1tdIGNsYXNzTmFtZVBhcnRzID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3BsaXQoIlxcLiIpOwotCQlyZXR1cm4gY2xhc3NOYW1lUGFydHNbY2xhc3NOYW1lUGFydHMubGVuZ3RoLTFdOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9TZXR0aW5nc0NvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1NldHRpbmdzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkN2QxMzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1NldHRpbmdzQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29kZWdlbi5lY2xpcHNlLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2V0dGluZ3NDb25zdGFudHMgewotCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vV1NETCBTZWxlY3Rpb24gcGFnZSBjb25zdGFudHMKLSAgICAvKioKLSAgICAgKiBUaGUga2V5IGZvciBzdG9yaW5nIHRoZSBXU0RMIGxvY2F0aW9uIGluIHRoZSBkaWFsb2cgc2V0dGluZ3Mgb2YgdGhlCi0gICAgICogV1NETEZpbGVTZWxlY3Rpb25QYWdlCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dTRExfTE9DQVRJT04gPSAiUFJFRl9XU0RMX0xPQ0FUSU9OIjsKLQotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvLyBUb29scyBzZWxlY3Rpb24gcGFnZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UT09MX1NFTEVDVElPTl9XU0RMMkpBVkEgPSAiUFJFRl9UT09MX1NFTEVDVElPTl9XU0RMMkpBVkEiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1RPT0xfU0VMRUNUSU9OX0pBVkEyV1NETCA9ICJQUkVGX1RPT0xfU0VMRUNUSU9OX0pBVkEyV1NETCI7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotLy8gICAgIENvZGVnZW4gT3B0aW9ucyBzZWxlY3Rpb24gcGFnZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PUFRJT05fU0VMRUNUSU9OX0RFRlVMVCA9ICJQUkVGX09QVElPTl9TRUxFQ1RJT05fREVGVUxUIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PUFRJT05fU0VMRUNUSU9OX0NVU1RPTSA9ICJQUkVGX09QVElPTl9TRUxFQ1RJT05fQ1VTVE9NIjsKLQotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvLyBPdXRwdXQgc2VsZWN0aW9uIHBhZ2UKLSAgICAvKioKLSAgICAgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBvdXRwdXQgbG9jYXRpb24gaW4gdGhlIHNldHRpbmdzCi0gICAgICogIAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PVVRQVVRfTE9DQVRJT04gPSAiUFJFRl9PVVRQVVRfTE9DQVRJT04iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19CUk9XU0VfUFJPSkVDVFMgPSAiUFJFRl9DSEVDS19CUk9XU0VfUFJPSkVDVFMiOwotCi0gICAgLy9PcHRpb25zIHBhZ2UgY29uc3RhbnRzCi0gICAgLyoqCi0gICAgICogUG9zaXRpb24gaW4gdGhlIGNvbWJveCBmb3IgY2hvb3NpbmcgdGhlIHRhcmdldCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gRGVmYXVsdCBpcyAwCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0xBTkdVQUdFX0lOREVYID0gIlBSRUZfTEFOR1VBR0VfSU5ERVgiOwotCi0gICAgLyoqCi0gICAgICogVGhyZWUgcmFkaW8gYnV0dG9uczogR2VuZXJhdGUgQ29kZSBmb3IgU3luYyBjYWxscywgQXN5bmMgYW5kIEJvdGguIEJvdGggaXMgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU1lOQ19BTkRfQVNZTkMgPSAiUFJFRl9SQURJT19TWU5DX0FORF9BU1lOQyI7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJlZSByYWRpbyBidXR0b25zOiBHZW5lcmF0ZSBDb2RlIGZvciBTeW5jIGNhbGxzLCBBc3luYyBhbmQgQm90aC4gQm90aCBpcyBkZWZhdWx0LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9SQURJT19TWU5DX09OTFkgPSAiUFJFRl9SQURJT19TWU5DX09OTFkiOwotCi0gICAgLyoqCi0gICAgICogVGhyZWUgcmFkaW8gYnV0dG9uczogR2VuZXJhdGUgQ29kZSBmb3IgU3luYyBjYWxscywgQXN5bmMgYW5kIEJvdGguIEJvdGggaXMgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fQVNZTkNfT05MWSA9ICJQUkVGX1JBRElPX0FTWU5DX09OTFkiOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHRoZSBmdWxsIHF1YWxpZmllZCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BBQ0tBR0VfTkFNRSA9ICJQUkVGX1BBQ0tBR0VfTkFNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGJvb2xlYW4gdmFsdWUgd2hldGhlciBKVW5pdCB0ZXN0IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBvciBub3QuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX0dFTkVSQVRFX1RFU1RDQVNFID0gIlBSRUZfQ0hFQ0tfR0VORVJBVEVfVEVTVENBU0UiOwotCi0gICAgLyoqCi0gICAgICogQSBib29sZWFuIHZhbHVlIHdoZXRoZXIgdGhlIHNlcnZlci1zaWRlIHNrZWxldG9ucyBhcmUgZ2VuZXJhdGVkIG9yIG5vdAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJTSURFID0gIlBSRUZfQ0hFQ0tfR0VORVJBVEVfU0VSVkVSU0lERSI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBib29sZWFuIHZhbHVlIHdoZXRoZXIgdGhlIHNlcnZlci1zaWRlIHNrZWxldG9ucyBhcmUgZ2VuZXJhdGVkIG9yIG5vdAotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19HRU5FUkFURV9DTElFTlRTSURFID0gIlBSRUZfQ0hFQ0tfR0VORVJBVEVfQ0xJRU5UU0lERSI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGJvb2xlYW4gdmFsdWUgd2hldGhlciB0aGUgc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciBBeGlzMiAoc2VydmVyLnhtbCkgd2lsbCBiZSBnZW5lcmF0ZWQgb3Igbm90LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUcgPSAiUFJFRl9DSEVDS19HRU5FUkFURV9TRVJWRVJDT05GSUciOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DT01CT19QT1JUTkFNRV9JTkRFWCA9ICJQUkVGX1RFWFRfUE9SVE5BTUUiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DT01CT19TRVJWSUNFTkFNRV9JTkRFWCA9ICJQUkVGX1RFWFRfU0VSVklDRU5BTUUiOwotICAgIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9EQVRBQklOREVSX0lOREVYID0gIlBSRUZfREFUQUJJTkRFUl9JTkRFWCI7Ci0gICAgCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0dFTl9BTEwgPSAiUFJFRl9HRU5fQUxMIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VOX1NTX0lOVEVSRkFDRSA9ICJQUkVGX0dFTl9TRVJWRVJTSURFX0lOVEVSRkFDRSI7Ci0KLSAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgLy8gSmF2YSBzb3VyY2UgZmlsZSBzZWxlY3Rpb24gcGFnZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9DTEFTU19OQU1FID0gIkpBVkFfQ0xBU1NfTkFNRSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0NMQVNTX1BBVEhfRU5UUklFUyA9ICJKQVZBX0NMQVNTX1BBVEhfTkFNRSI7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vIEphdmEyd3NkbCBvcHRpb25zIHNlbGVjdGlvbiBwYWdlCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfVEFSR0VUX05TID0gIlRBUkdFVF9OUyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfVEFSR0VUX05TX1BSRUYgPSAiVEFSR0VUX05TX1BSRUYiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9KQVZBX1NDSEVNQV9UQVJHRVRfTlMgPSAiU0NIRU1BX1RBUkdFVF9OUyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfU0VSVklDRV9OQU1FID0gIlNDSEVNQV9TRVJWSUNFIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSkFWQV9TVFlMRV9JTkRFWCA9ICJTVFlMRV9JTkRFWCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfU0NIRU1BX1RBUkdFVF9OU19QUkVGID0gIlNDSEVNQV9UQVJHRVRfTlNfUFJFRiI7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vb3V0cHV0IHBhZ2UKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfT1VUUFVUX1dTRExfTkFNRSA9ICJPVVRQVVRfV1NETCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfT1VUUFVUX1dTRExfTE9DQVRJT04gPSAiT1VUUFVUX1dTRExfTE9DQVRJT04iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9KQVZBX09VVFBVVF9GSUxFU1lBVEVNPSAiT1VUUFVUX1dTRExfTE9DQVRJT05fRklMRVNZQVRFTSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBVkFfT1VUUFVUX1dPUktTUEFDRSA9ICJPVVRQVVRfV1NETF9MT0NBVElPTl9XT1JLU1BBQ0UiOwotICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAvLyBQYWdlIGNvbnN0YW50cwotICAgICBzdGF0aWMgZmluYWwgaW50IFdTRExfMl9KQVZBX1RZUEUgPSAxOwotICAgICBzdGF0aWMgZmluYWwgaW50IEpBVkFfMl9XU0RMX1RZUEUgPSAyOwotICAgICBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEX1RZUEUgPSAzOwotICAgICAKLSAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAvLyBDb2RlZ2VuIE9wdGlvbnMgY29uc3RhbnRzCi0gICAgICBzdGF0aWMgZmluYWwgaW50IENPREVHRU5fREVGQVVMVF9UWVBFID0gMTE7Ci0gICAgICBzdGF0aWMgZmluYWwgaW50IENPREVHRU5fQ1VTVE9NX1RZUEUgPSAxMjsKLSAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09ERUdFTl9VTkRFQ0xFQVJFRF9UWVBFID0gMTM7Ci0gICAgCi0gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgIC8vIFdTREwgTW9kZSBjb25zdGFudHMKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0FMTCA9ICJBbGwiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfSU5URVJGQUNFX09OTFkgPSAiSW50ZXJmYWNlIG9ubHkiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfSU1QTEVNRU5UQVRJT05fT05MWSA9ICJJbXBsZW1lbnRhdGlvbiBvbmx5IjsKLSAgICAgCi0gICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9TVFlMRV9ET0NVTUVOVD0iRG9jdW1lbnQiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfU1RZTEVfUlBDPSJycGMiOwotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfU1RZTEVfV1JBUFBFRD0id3JhcHBlZCI7Ci0KLSAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX1dPUktTUEFDRSA9IlBSRUZfQ0hFQ0tfV09SS1NQQUNFIjsKLSAgICAgCi0gICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19GSUxFX1NZU1RFTSA9IlBSRUZfQ0hFQ0tfRklMRV9TWVNURU0iOwotCi0gICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19BWElTX0xJQl9DT1BZID0iUFJFRl9DSEVDS19GSUxFX1NZU1RFTSI7Ci0gICAgIAotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ0hFQ0tfSkFSX0NSRUFUSU9OID0iUFJFRl9DSEVDS19GSUxFX1NZU1RFTSI7Ci0gICAgIAotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVhJU19IT01FX09VVFBVVF9MT0NBVElPTiA9ICJQUkVGX09VVFBVVF9MT0NBVElPTiI7Ci0gICAgIAotICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVhJU19MSUJfTE9DQVRJT04gPSAiUFJFRl9PVVRQVVRfTE9DQVRJT04iOwotICAgICAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0pBUl9GSUxFX05BTUUgPSAiUFJFRl9PVVRQVVRfTE9DQVRJT04iOwotICAgICAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NPREVHRU5fT1BUSU9OX0lOREVYID0gIlBSRUZfQ09ERUdFTl9PUFRJT05fSU5ERVgiOwotICAgICAKLSAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX0FYSVNfUExVR0lOX0xJQl9DT1BZID0iUFJFRl9DSEVDS19BWElTX1BMVUdJTl9MSUJfQ09QWSI7Ci0gICAgIAotICAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9VSUNvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1VJQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWE2N2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1VJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBVSUNvbnN0YW50cyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19TSEFSUCA9ICJjLXNoYXJwIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19QTFVTX1BMVVMgPSAiQysrIiA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX05PTkUgPSAibm9uZSIgOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQklORElOR19BREIgPSAiYWRiIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX1hNTEJFQU5TID0gInhtbGJlYW5zIiA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9CSU5ESU5HX0pJQlggPSAiamlieCIgOwotICAgIAotCS8vIFNlbGVjdGVkIE9wdGlvbiBieSB0aGUgdXNlciBhdCB0aGUgcHJldmlvdXMgcGFnZSAoZGVmYXVsdC9mYWxzZSBDdXN0b20vdHJ1ZSkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2VsZWN0ZWRPcHRpb24gPSBmYWxzZTsKLQkKLQkvL2NvZGVnZW4gb3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFQgPSAiZGVmYXVsdCIgOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTSA9ICJjdXN0b20iIDsKLQkKLQkvL0RlZmF1bHQgcGFja2FnZSBuYW1lIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS0FHRU5BTUUgPSAib3JnLmV4YW1wbGUud2Vic2VydmljZSIgOwotCQotCS8vRm9sZGVyIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCID0gImxpYiIgOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVCA9ICJ0YXJnZXQiIDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiIDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX0NPREVHRU5fUExVR0lOX0ZPTERFUiA9ICJBeGlzMl9Db2RlZ2VuX1dpemFyZF8xLjMuMCIgOwotCQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvZGVnZW4vZWNsaXBzZS91dGlsL1dTRExQcm9wZXJ0eVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWU4N2Y0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL2VjbGlwc2UvdXRpbC9XU0RMUHJvcGVydHlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb2RlZ2VuLmVjbGlwc2UudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByZXNlbnRzIGEgY29udmVuaWVudCB3YXkgb2YgcmVhZGluZyB0aGUgCi0gKiBXU0RMIGZpbGUodXJsKSBhbmQgcHJvZHVjaW5nIGEgdXNlZnVsIHNldCBvZiBpbmZvcm1hdGlvbgotICogSXQgZG9lcyBOT1QgdXNlIGFueSBvZiB0aGUgc3RhbmRhcmQgV1NETCBjbGFzc2VzIGZyb20gCi0gKiBBeGlzMiwgcmF0aGVyIGl0IHVzZXMgd3NkbDRqIHRvIHJlYWQgdGhlIHdzZGwgYW5kIGV4dHJhY3QgCi0gKiB0aGUgcHJvcGVydGllcyAoVGhpcyBpcyBtZWFudCBhcyBhIGNvbnZlbmllbmNlIGZvciB0aGUgVUkKLSAqIG9ubHkuIFdlIG1heSBub3QgbmVlZCB0aGUgd2hvbGUgY29udmVyc2lvbiB0aGUgV1NETHB1bXAgCi0gKiBnb2VzIHRocm91Z2gpCi0gKiBPbmUgd291bGQgbmVlZCB0byBjaGFuZ2UgdGhpcyB0byBzdWl0IGEgcHJvcGVyIFdTREwgCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUHJvcGVydHlSZWFkZXIgewotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgCi0JcHVibGljIHZvaWQgcmVhZFdTREwoU3RyaW5nIGZpbGVwYXRoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0JCVdTRExSZWFkZXIgcmVhZGVyID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdXU0RMUmVhZGVyKCk7Ci0JCXdzZGxEZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKGZpbGVwYXRoKTsgCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBtYXAgZnJvbSBkZWZpbml0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0RGVmaW5pdGlvbk5hbWVzcGFjZU1hcCgpewotCQlyZXR1cm4gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGRlZmF1bHQgcGFja2FnZSBkZXJpdmVkIGJ5IHRoZSB0YXJnZXROYW1lc3BhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHBhY2thZ2VGcm9tVGFyZ2V0TmFtZXNwYWNlKCl7Ci0JCXJldHVybiAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZSh3c2RsRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBzZXJ2aWNlIG5hbWVzCi0JICogdGhlIG5hbWVzIGFyZSBRTmFtZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZUxpc3QoKXsKLQkJTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotCQlNYXAgc2VydmljZU1hcCA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCk7Ci0JCWlmKHNlcnZpY2VNYXAhPW51bGwgJiYgIXNlcnZpY2VNYXAuaXNFbXB0eSgpKXsKLQkJICAgSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkgICB3aGlsZShzZXJ2aWNlSXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCSAgIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOwotCQkJICAgcmV0dXJuTGlzdC5hZGQoc2VydmljZS5nZXRRTmFtZSgpKTsKLQkJICAgfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBwb3J0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UKLQkgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3J0TmFtZUxpc3QoUU5hbWUgc2VydmljZU5hbWUpewotCQlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNlcnZpY2Ugc2VydmljZSA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotCQlQb3J0IHBvcnQgPSBudWxsOyAKLQkJaWYoc2VydmljZSE9bnVsbCl7Ci0JCSAgIE1hcCBwb3J0TWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotCQkgICBpZiAocG9ydE1hcCE9bnVsbCAmJiAhcG9ydE1hcC5pc0VtcHR5KCkpewotCQkJICAgSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJICAgd2hpbGUocG9ydEl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQkJIHBvcnQgPSAoUG9ydClwb3J0SXRlcmF0b3IubmV4dCgpOwotCQkJCSByZXR1cm5MaXN0LmFkZChwb3J0LmdldE5hbWUoKSk7Ci0JCQkgICB9Ci0JCSAgIH0KLQkJICAKLQkJfQotCQkKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogcHVibGljIG1ldGhvZCB0byBnZXQgbG9hZGVkIHdzZGwgRGVmaW5pdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGVmaW5pdGlvbiBnZXRXc2RsRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHdzZGxEZWZpbml0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL3Jlc291cmNlL0NvZGVnZW4ucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb2RlZ2VuL3Jlc291cmNlL0NvZGVnZW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZDc1Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29kZWdlbi9yZXNvdXJjZS9Db2RlZ2VuLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyBQcm9wZXJ0eSBmaWxlIGZvciB0aGUgQXhpczIgQ29kZSBnZW5lcmF0b3IgIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotI0dlbmVyYWwKLWdlbmVyYWwuRXJyb3I9RXJyb3IKLWdlbmVyYWwuRXJyb3IucHJlZml4PUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvbXBsZXRpbmcgcHJvY2VzcyAtCi1nZW5lcmFsLm5hbWU9QXhpczIgQ29kZWdlbiBXaXphcmQKLWdlbmVyYWwuYnJvd3NlPUJyb3dzZS4uLgotZ2VuZXJhbC5zZWFyY2g9U2VhcmNoLi4KLWdlbmVyYWwuaW52YWxpZC5zdGF0ZT1JbnZhbGlkIHN0YXRlIQotZ2VuZXJhbC51c2VyYWJvcnRlZC5zdGF0ZT1Vc2VyIGFib3J0ZWQhCi1nZW5lcmFsLmVtcHR5PQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBJbml0aWFsIHRvb2wgc2VsZWN0aW9uIHBhZ2UgLSBQYWdlMAotIyBUb29sIHNlbGVjdGlvbgotcGFnZTAubmFtZT1BeGlzMiBDb2RlIGdlbmVyYXRpb24gd2l6YXJkCi1wYWdlMC50aXRsZT1TZWxlY3QgdGhlIHdpemFyZAotcGFnZTAuZGVzYz1XZWxjb21lIHRvIHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvciB3aXphcmQuIAotIwotcGFnZTAub3B0aW9ucy5kZXNjPVBsZWFzZSBzcGVjaWZ5IHdoYXQgeW91IHdhbnQgdG8gZG8uIAotcGFnZTAuaGludC5kZXNjPUhpbnQgOiBZb3UgY2FuIGdlbmVyYXRlIGphdmEgY29kZSBmcm9tIGEgV1NETCBvciBXU0RMIGZyb20gYSBKYXZhIHNvdXJjZSBmaWxlLgotcGFnZTAuamF2YTJ3c2RsLmRlc2M9U2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBhbHJlYWR5IGhhdmUgYSBqYXZhIHNvdXJjZSBmaWxlIGFuZCBuZWVkIHRvIGdlbmVyYXRlIGEgV1NETCAKLXBhZ2UwLmphdmEyd3NkbC5jYXB0aW9uPUdlbmVyYXRlIGEgV1NETCBmcm9tIGEgSmF2YSBzb3VyY2UgZmlsZQotIwotcGFnZTAud3NkbDJqYXZhLmRlc2M9U2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBuZWVkIHRvIGdlbmVyYXRlIHN0dWJzL3NrZWxldG9ucyBmcm9tIGEgV1NETCAKLXBhZ2UwLndzZGwyamF2YS5jYXB0aW9uPUdlbmVyYXRlIEphdmEgc291cmNlIGNvZGUgZnJvbSBhIFdTREwgZmlsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1dTREwgc2VsZWN0aW9uIHBhZ2UgLSBQYWdlMQotI1dTREwgc2VsZWN0aW9uIHBhZ2UgbmFtZQotcGFnZTEubmFtZT1wYWdlMQotcGFnZTEudGl0bGU9V1NETCBzZWxlY3Rpb24gcGFnZQotcGFnZTEuZGVzYz1QbGVhc2UgU2VsZWN0IHRoZSBXU0RMIGZpbGUgbG9jYXRpb24KLSNsYWJlbHMKLXBhZ2UxLmZpbGVzZWxlY3Rpb24ubGFiZWw9V1NETCBmaWxlIGxvY2F0aW9uIDoKLXBhZ2UxLmZpbGVzZWxlY3Rpb24uYnJvd3NlPUJyb3dzZS4uLgotcGFnZTEuaGludC5kZXNjPUhpbnQgOiBZb3UgY2FuIHNlbGVjdCBvbmx5ICoud3NkbC8qLnhtbCBmaWxlIGxvY2F0aW9uIAotCi0jRXJyb3JzCi1wYWdlMS5lcnJvci5maWxlbWlzc2luZ2Vycm9yPUZpbGUgbmFtZSBzaG91bGQgYmUgc3BlY2lmaWVkCi1wYWdlMS5lcnJvci53cm9uZ2V4dGVuc2lvbj1GaWxlIGV4dGVuc2lvbiBtdXN0IGJlIHdzZGwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAotI09wdGlvbnMgLSBwYWdlMwotcGFnZTIubmFtZT1wYWdlMwotcGFnZTIudGl0bGU9T3B0aW9ucwotcGFnZTIuZGVzYz1TZXQgdGhlIG9wdGlvbnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvci4gSWYgeW91IHdpc2ggdG8gZWRpdCB0aGUgY29kZWdlbiBvcHRpb25zLCBTZWxlY3QgY3VzdG9tIG9wdGlvbiBmcm9tIENvZGVnZW4gT3B0aW9uIGRyb3AgZG93biBsaXN0LgotI2xhYmVscwotcGFnZTIubGFuZ3VhZ2UuY2FwdGlvbj1PdXRwdXQgbGFuZ3VhZ2UKLXBhZ2UyLnN5bmNBc3luYy5jYXB0aW9uPUdlbmVyYXRlIGJvdGggc3luYyBhbmQgYXN5bmMKLXBhZ2UyLnN5bmMuY2FwdGlvbj1HZW5lcmF0ZSBzeW5jIHN0eWxlIG9ubHkKLXBhZ2UyLmFzeW5jLmNhcHRpb249R2VuZXJhdGUgYXN5bmMgc3R5bGUgb25seQotcGFnZTIucGFja2FnZS5jYXB0aW9uPUN1c3RvbSBwYWNrYWdlIG5hbWUKLXBhZ2UyLm5hbWVzcGFjZS5jYXB0aW9uPU5hbWVzcGFjZQotcGFnZTIubmFtZXNwYWNlMlBrZy5jYXB0aW9uPU5hbWVzcGFjZSB0byBwYWNrYWdlIG1hcHBpbmdzCi1wYWdlMi5zZXJ2ZXJzaWRlLmNhcHRpb249R2VuZXJhdGUgc2VydmVyIHNpZGUgY29kZQotcGFnZTIuY2xpZW50c2lkZS5jYXB0aW9uPUdlbmVyYXRlIGNsaWVudCBzaWRlIGNvZGUKLXBhZ2UyLnNlcnZpY2VYTUwuY2FwdGlvbj1HZW5lcmF0ZSBhIGRlZmF1bHQgc2VydmljZXMueG1sCi1wYWdlMi50ZXN0Y2FzZS5jYXB0aW9uPUdlbmVyYXRlIHRlc3QgY2FzZQotcGFnZTIuZGF0YWJpbmRpbmdDaGVjay5jYXB0aW9uPURhdGFiaW5kaW5nIE5hbWUKLXBhZ2UyLnNlcnZpY2VOYW1lLmNhcHRpb249U2VydmljZSBOYW1lCi1wYWdlMi5wb3J0TmFtZS5jYXB0aW9uPVBvcnQgTmFtZQotcGFnZTIuZ2VuQWxsLmNhcHRpb249R2VuZXJhdGUgQm90aCB3aXRoIGFsbCBjbGFzc2VzIGZvciBldmVyeSBlbGVtZW50cyBvbiBTaGVtYXMgCi1wYWdlMi5zc0ludGVyZmFjZS5jYXB0aW9uPUdlbmVyYXRlIGFuIEludGVyZmFjZSBmb3IgU2tlbGV0b24KLXBhZ2UyLndzZGxOb3RGb3VuZC5tZXNzYWdlPVNwZWNpZmllZCBXU0RMIGlzIG5vdCBmb3VuZCEsIFBsZWFzZSBDaGVjayB3aGV0aGVyIHlvdSBoYXZlIGVudGVyZWQgdGhlIGNvcnJlY3QgcGF0aCB0byBhICoud3NkbCBvbiBwcmV2aW91cyBwYWdlLgotcGFnZTIud3NkbEludmFsaWQubWVzc2FnZT1TcGVjaWZpZWQgV1NETCBpcyBpbnZhbGlkISwgUGxlYXNlIHNlbGVjdCBhIHZhbGlkYXRlZCAqLndzZGwvKi54bWwgZmlsZSBvbiBwcmV2aW91cyBwYWdlLgotcGFnZTIubm9wb3J0cy5tZXNzYWdlPU5vIHBvcnRzIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgc2VydmljZQotIwotcGFnZTIub3B0aW9ucy5kZXNjPUNvZGVnZW4gb3B0aW9uCi1wYWdlMi5kZWZhdWx0LmRlc2M9U2VsZWN0IHRoaXMgdG8gY29kZWdlbiBieSBhY2NlcHRpbmcgdGhlIGRlZmF1bHQgb3B0aW9ucwotcGFnZTIuZGVmYXVsdC5jYXB0aW9uPURlZmF1bHQgQ29kZWdlbiBPcHRpb25zCi0jCi1wYWdlMi5jdXN0b20uZGVzYz1TZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBjb2RlZ2VuIG9wdGlvbnMKLXBhZ2UyLmN1c3RvbS5jYXB0aW9uPUN1c3RvbSBDb2RlZ2VuIE9wdGlvbnMKLSNlcnJvcnMKLXBhZ2UyLnBhY2hhZ2UuZXJyb3Iubm9sb2NhdGlvbj1JbnZhbGlkIHBhY2thZ2UgbmFtZS4gUGxlYXNlIGVudGVyIGEgdmFsaWQgcGFja2FnZSBuYW1lLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCi0jT3V0cHV0IGxvY2F0aW9uIHNlbGVjdGlvbiAtIHBhZ2U0ICAKLXBhZ2UzLm5hbWU9cGFnZTQKLXBhZ2UzLnRpdGxlPU91dHB1dAotcGFnZTMuZGVzYz1TZXQgdGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlCi0jbGFibGVzCi1wYWdlMy5yZXN1bHQuZGVjcz1TZWxlY3Qgb25lIG9mIGJlbG93IHRvIHNhdmUgdGhlIGNvZGVnZW4gb3V0cHV0IGVpdGhlciBvbiBlY2xpcHNlIHdvcmtzcGFjZSBwcm9qZWN0IG9yIFxuIG9uIGZpbGUgc3lzdGVtIGFuZCB0aGVuIGJyb3dzZSB0byBlbnRlciB0aGUgb3V0cHV0IHBhdGgKLXBhZ2UzLm91dHB1dC5jYXB0aW9uPU91dHB1dCBwYXRoCi1wYWdlMy5heGlzaG9tZS5jYXB0aW9uPUF4aXMgSG9tZQotcGFnZTMuamFybmFtZS5jYXB0aW9uPUphciBGaWxlIE5hbWUKLXBhZ2UzLm91dHNlbGVjdGlvbi5icm93c2U9QnJvd3NlLi4uCi1wYWdlMy5sb2FkbGlicy5icm93c2U9Q2hlY2sgTGlicy4uLgotcGFnZTMuY29udGFpbmVyYm94LnRpdGxlPVNlbGVjdCBuZXcgZmlsZSBjb250YWluZXIKLXBhZ2UzLndvcmtzcGFjZS5jYXB0aW9uPUJyb3dzZSBhbmQgc2VsZWN0IGEgcHJvamVjdCBvbiBjdXJyZW50IGVjbGlwc2Ugd29ya3NwYWNlCi1wYWdlMy53b3Jrc3BhY2UuZGVzYz1TZWxlY3QgdGhpcyB0byBhZGQgdGhlIGNvZGVnZW4gcmVzdWx0cyB1bmRlciBhIHByb2plY3Qgb24gY3VycmVudCBlY2xpcHNlIHdvcmtzcGFjZQotcGFnZTMuZmlsZXN5c3RlbS5jYXB0aW9uPUJyb3dzZSBhbmQgc2VsZWN0IGxvY2F0aW9uIG9uIGxvY2FsIGZpbGUgc3lzdGVtCi1wYWdlMy5maWxlc3lzdGVtLmRlc2M9U2VsZWN0IHRoaXMgdG8gc2F2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgY29kZWdlbiBvbiBsb2NhbCBmaWxlIHN5c3RlbQotcGFnZTMuYWRkYXhpc2xpYi5jYXB0aW9uPUFkZCBBeGlzMiBsaWJyYXJpZXMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0IHByb2plY3QKLXBhZ2UzLmFkZGF4aXNsaWIuZGVzYz1DbGljayB0aGlzIHRvIENvcHkgdGhlIEF4aXMyIExpYnJhcmllcyB0byB0aGUgY3JlYXRlZCBwcm9qZWN0IGxpYnJhcnkKLXBhZ2UzLmphcmNyZWF0aW9uLmNhcHRpb249Q3JlYXRlIGEgamFyIGZpbGUgb2YgY29kZWdlbiByZXN1bHQgcHJvamVjdCBhbmQgYWRkIHRvIHJlc3VsdGVkIHByb2plY3QgbGliIGZvbGRlciAoRGVmYXVsdCA6IENvZGVnZW5SZXN1bHRzLmphcikKLXBhZ2UzLmphcmNyZWF0aW9uLmRlc2M9Q2xpY2sgdGhpcyB0byBjcmVhdGUgYSBqYXIgZmlsZSBvZiB0aGUgY29kZWdlbiByZXN1bHRzIGFuZCBwdXQgdGhhdCBpbiBvdXRwdXQgbG9jYXRpb24KLXBhZ2UzLmNvcHlwbHVnaW5saWIuY2FwdGlvbj1BZGQgdGhlIEF4aXMyIGNvZGVnZW4gamFycyB0byB0aGUgY29kZWdlbiByZXN1bHRlZCBwcm9qZWN0Ci1wYWdlMy5jb3B5cGx1Z2lubGliLmRlc2M9Q2xpY2sgdGhpcyB0byBhZGQgYWxsIHRoZSBBeGlzMiBsaWJzIGluIHRvIHRoZSBnZW5lcmF0ZWQgcHJvamVjdCBhcyB0aGUgcmVzdWx0IG9mIGNvZGVnZW4KLXBhZ2UzLmhpbnQuY2FwdGlvbj1IaW50IDogSWYgeW91IGhhdmUgQXhpczIgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvciBBeGlzIHNvdXJjZSwgdGhlbiB5b3UgY2FuIGFkZCB0aG9zZSBsaWJzIGFsc28gdG8gdGhlXG4gcmVzdWx0ZWQgY29kZWdlbiBwcm9qZWN0IGJ5IGNoZWNraW5nIHRoZSBcIkFkZCBBeGlzMiBMaWJyYXJpZXMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0ZWQgcHJvamVjdFwiXG4gY2hlY2sgYm94IGFuZCBzcGVjaWZ5aW5nIHRoZSBBeGlzMiBob21lLiBBbm90aGVyIG9wdGlvbiB5b3UgaGF2ZSBpcyB0byBjb21waWxlIHRoZSBjb2RlZ2VuIFxuIHJlc3VsdCBwcm9qZWN0IGFuZCBhZGQgaXQgYXMgYSBqYXIgZmlsZSBpbiB0aGUgbGliIGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0ZWQgcHJvamVjdCwgZm9yIHRoYXQgeW91IGNhbiBcbiBjaGVjayB0aGUgXCJDcmVhdGUgYSBqYXIgZmlsZSBvZiBjb2RlZ2VuIHJlc3VsdCBwcm9qZWN0IGFuZCBhZGQgdG8gcmVzdWx0ZWQgcHJvamVjdCBsaWIgZm9sZGVyXCIgXG4gY2hlY2tib3ggYW5kIHRoZW4gZ2l2ZSB0aGUgamFyIGZpbGUgbmFtZSB0aGF0IHlvdSBwcmVmZXIuIFxuIElmIHlvdSBhcmUgYWRkaW5nIHRoZSBjb2RlZ2VuIHJlc3VsdCB0byBhIGVjbGlwc2UgcHJvamVjdCBvbiBjdXJyZW50IGVjbGlwc2Ugd29ya3NwYWNlLCBcbiBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlZnJlc2ggdGhhdCBwYXJ0aWN1bGFyIGVjbGlwc2UgcHJvamVjdC4gXG4gQWxzbyBpZiB5b3Ugc2VsZWN0IHRoZSBvcHRpb25zIHRvIGFkZCBsaWJzIHRvIHRoZSBwcm9qZWN0LCBtYWtlIHN1cmUgdG8gYWRkIHRob3NlIGxpYnMgdG8gdGhlIFxuIHByb2plY3QgbGlicmFyeSBwYXRoLgotcGFnZTMubG9hZGxpYi5zdWNjZXNzLmNhcHRpb249QXhpcyBsaWJzIGxvYWRlZCBzdWNjZXNzZnVsbHkgISEKLXBhZ2UzLmxvYWRsaWIuZmFpbC5jYXB0aW9uPUF4aXMgbGlicyBhcmUgbm90IGF2YWlsYWJsZSEhIFBsZWFzZSB2ZXJpZnkgdGhlIGVudGVyZWQgcGF0aCEhCi1wYWdlMy5sb2FkbGliLmZhaWwubWVzc2FnZT1BeGlzIGxpYnMgYXJlIG5vdCBhdmFpbGFibGUhISBQbGVhc2UgdmVyaWZ5IHRoZSBlbnRlcmVkIHBhdGgsIElmIHlvdSBwb2ludCB0byBzb3VyY2UgdHJ5IG1hdmVuIGdvYWwgY3JlYXRlLWxpYiAhIQotcGFnZTMuaGludC5vbj1QYWdlIEhpbnQgPj4KLXBhZ2UzLmhpbnQub2ZmPVBhZ2UgSGludCA8PAotI2Vycm9ycwotcGFnZTMuZXJyb3Iubm9sb2NhdGlvbj1vdXRwdXQgbG9jYXRpb24gbmVlZHMgdG8gYmUgc3BlY2lmaWVkCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI2phdmEgc291cmNlIGZpbGUgc2VsZWN0aW9uID0gcGFnZTUKLXBhZ2U0Lm5hbWU9cGFnZTUKLXBhZ2U0LnRpdGxlPUphdmEgc291cmNlL2NsYXNzcGF0aCBzZWxlY3Rpb24KLXBhZ2U0LmRlc2M9U2VsZWN0IHRoZSBjbGFzc2VzIGFuZCB0aGUgbGlicmFyaWVzCi0jbGFiZWxzCi1wYWdlNC5jbGFzc3BhdGgubGFiZWw9SmF2YSBDbGFzcyBwYXRoIEVudHJpZXMuIFNlbGVjdCBlaXRoZXIgZm9sZGVycyBvciBqYXIgZmlsZXMKLXBhZ2U0LmNsYXNzbmFtZS5sYWJlbD1GdWxseSBRdWFsaWZpZWQgQ2xhc3MgbmFtZQotcGFnZTQuYWRkRGlyLmxhYmVsPUFkZCBGb2xkZXIKLXBhZ2U0LmFkZEphci5sYWJlbD1BZGQgSmFyCi1wYWdlNC5yZW1vdmVFbnRyeS5sYWJlbD1SZW1vdmUKLXBhZ2U0LmVycm9yLmludmFsaWRDbGFzc05hbWU9RnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIQotcGFnZTQuZXJyb3IuQ2xhc3NOYW1lTm90VGVybWluYXRlZD1DbGFzcyBuYW1lIGlzIG5vdCBwcm9wZXJseSB0ZXJtaW5hdGVkIQotcGFnZTQudHJ5TG9hZC5sYWJlbD1UZXN0IENsYXNzIExvYWRpbmcuLgotcGFnZTQudW5rbm93bkVycm9yLmxhYmVsPVVua25vd24gZXJyb3IhCi1wYWdlNC5zdWNjZXNzTG9hZGluZy5sYWJlbD1DbGFzcyBmaWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkKLXBhZ2U0LmhpbnQuY2FwdGlvbj1IaW50IDogUGxlYXNlIGdpdmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLCBleGFtcGxlIDpjb20uZm9vLkJhclNlcnZpY2VcbiAgICAgICAgIFRoZW4gYWRkIHRoZSBmb2xkZXIgb3IgdGhlIGphciBmaWxlIHdoaWNoIGNvbnRhaW5zIHRoYXQgY2xhc3MgZmlsZS4gXG4gICAgICAgICBGaW5hbGx5IGNoZWNrIHdoZXRoZXIgdGhlIGNsYXNzIGZpbGUgY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBwbHVnaW4uIFxuXG4gICAgICAgICBJZiB0aGUgY2xhc3MgdGhhdCB5b3UgYXJlIGdvaW5nIHRvIGxvYWQgY29udGFpbnMgYW55IGRlcGVuZGVuY2llcyBcbiAgICAgICAgIG9uIG90aGVyIGF4aXMyIGxpYnJhcmllcyAoIGZvciBleGFtcGxlIGxpa2UgYXhpb20qLmphciksIHBsZWFzZSBhZGQgdGhvc2UgXG4gICAgICAgICBsaWJyYXJpZXMgYXMgd2VsbCBhbmQgdHJ5IHRvIGxvYWQgdGhlIGNsYXNzLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNqYXZhMndzZGwgb3B0aW9ucyA9IHBhZ2U2Ci1wYWdlNS5uYW1lPXBhZ2U2Ci1wYWdlNS50aXRsZT1KYXZhIHRvIFdTREwgT3B0aW9ucwotcGFnZTUuZGVzYz1TZXQgdGhlIE9wdGlvbnMgZm9yIHRoZSBnZW5lcmF0b3IKLXBhZ2U1LnRhcmdldE5hbWVzcGFjZS5sYWJlbD1UYXJnZXQgTmFtZXNwYWNlCi1wYWdlNS50YXJnZXROYW1lc3BhY2VQcmVmaXgubGFiZWw9VGFyZ2V0IE5hbWVzcGFjZSBQcmVmaXgKLXBhZ2U1LnNjaGVtYVRhcmdldE5zLmxhYmVsPVNjaGVtYSB0YXJnZXQgbmFtZXNwYWNlCi1wYWdlNS5zY2hlbWFUYXJnZXROc1ByZWZpeC5sYWJlbD1TY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZSBQcmVmaXgKLXBhZ2U1LnNlcnZpY2VOYW1lLmxhYmVsPVNlcnZpY2UgTmFtZQotcGFnZTUuZXJyb3IuZmlsZW1pc3NpbmdlcnJvcj1TZXJ2aWNlIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNqYXZhMndzZGwgb3V0cHV0IGxvY2F0aW9uIC0gcGFnZTcKLXBhZ2U2Lm5hbWU9cGFnZTcKLXBhZ2U2LnRpdGxlPVdTREwgZmlsZSBvdXRwdXQgbG9jYXRpb24KLXBhZ2U2LmRlc2M9U2VsZWN0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBXU0RMLgotIyMjIwotcGFnZTYub3V0cHV0LmxhYmVsPU91dHB1dCBsb2NhdGlvbgotcGFnZTYub3V0cHV0bmFtZS5sYWJlbD1PdXRwdXQgRmlsZSBOYW1lCi1wYWdlNi53b3Jrc3BhY2UuY2FwdGlvbj1Ccm93c2UgYW5kIGFkZCB0aGUgV1NETCB0byBhIHByb2plY3Qgb24gY3VycmVudCBlY2xpcHNlIHdvcmtzcGFjZQotcGFnZTYud29ya3NwYWNlLmRlc2M9U2VsZWN0IHRoaXMgdG8gYWRkIHRoZSBXU0RMIGZpbGUgdW5kZXIgYSBwcm9qZWN0IG9uIGN1cnJlbnQgZWNsaXBzZSB3b3Jrc3BhY2UKLXBhZ2U2LmZpbGVzeXN0ZW0uY2FwdGlvbj1Ccm93c2UgYW5kIHNhdmUgdGhlIFdTREwgZmlsZSBvbiBsb2NhbCBmaWxlIHN5c3RlbQotcGFnZTYuZmlsZXN5c3RlbS5kZXNjPVNlbGVjdCB0aGlzIHRvIHNhdmUgdGhlIHJlc3VsdGVkIFdTREwgb24gbG9jYWwgZmlsZSBzeXN0ZW0KLSNXaXphcmQKLWdlbmVyYXRvci5nZW5lcmF0aW5nPUdlbmVyYXRpbmcgY29kZS4uLgotZ2VuZXJhdG9yLnJlYWRpbmdXT009UmVhZGluZyBXU0RMIGZpbGUuLi4KLSNTdWNjZXNzIG1lc3NhZ2UKLXdpemFyZC5zdWNjZXNzPUFsbCBvcGVyYXRpb25zIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgIQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDdiOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvQ2xhc3NGaWxlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIENsYXNzRmlsZUhhbmRsZXIgewotCi0KLSAgIAotLyoqCi0gKiAKLSAqIEBwYXJhbSBjbGFzc0ZpbGVOYW1lCi0gKiBAcGFyYW0gbG9jYXRpb24KLSAqIEByZXR1cm4KLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRNZXRob2ROYW1lc0Zyb21DbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSxTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnsKLSAgICAgICAgQXJyYXlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZpbGUgZmlsZUVuZHBvaW50ID0gbmV3IEZpbGUobG9jYXRpb24pOwotICAgICAgICBpZiAoIWZpbGVFbmRwb2ludC5leGlzdHMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidGhlIGxvY2F0aW9uIGlzIGludmFsaWQiKTsKLSAgICAgICAgVVJMW10gdXJsTGlzdCA9IHtmaWxlRW5kcG9pbnQudG9VUkwoKX07Ci0gICAgICAgIFVSTENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybExpc3QpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IGNsYXp6TG9hZGVyLmxvYWRDbGFzcyhjbGFzc0ZpbGVOYW1lKTsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQobWV0aG9kc1tpXS5nZXROYW1lKCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDM5OGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvRmlsZUNvcGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgRmlsZUNvcGllciBleHRlbmRzIENvcHl7Ci0gICAgcHVibGljIEZpbGVDb3BpZXIoKSB7Ci0gICAgICAgIHRoaXMuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLSAgICAgICAgdGhpcy5nZXRQcm9qZWN0KCkuaW5pdCgpOwotICAgICAgICB0aGlzLnNldFRhc2tUeXBlKCJjb3B5Iik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImNvcHktZmlsZXMiKTsKLSAgICAgICAgdGhpcy5zZXRPd25pbmdUYXJnZXQobmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZXMoRmlsZSBzb3VyY2VGaWxlLEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnksU3RyaW5nIGZpbHRlcil7Ci0gICAgICAgIGlmIChzb3VyY2VGaWxlLmlzRmlsZSgpKQotICAgICAgICAgICAgdGhpcy5zZXRGaWxlKHNvdXJjZUZpbGUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZmlsZXNldCA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgICAgICBmaWxlc2V0LnNldERpcihzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIhPW51bGwpewotICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcygiXFwuXFx3KiIpKXsKLSAgICAgICAgICAgICAgICAgICAgZmlsZXNldC5zZXRJbmNsdWRlcygiKi8qKi8qIitmaWx0ZXIpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuYWRkRmlsZXNldChmaWxlc2V0KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldFRvZGlyKGRlc3RpbmF0aW9uRGlyZWN0b3J5KTsKLSAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0phckZpbGVXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0phckZpbGVXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkYTJmMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9KYXJGaWxlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEphckZpbGVXcml0ZXIgZXh0ZW5kcyBKYXJ7Ci0KLQotICAgIHB1YmxpYyBKYXJGaWxlV3JpdGVyKCkgewotICAgICAgICB0aGlzLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0gICAgICAgIHRoaXMuZ2V0UHJvamVjdCgpLmluaXQoKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrVHlwZSgiamFyIik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImphciIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSmFyRmlsZShGaWxlIG91dHB1dEZvbGRlcixTdHJpbmcgb3V0cHV0RmlsZU5hbWUsRmlsZSBpbnB1dEZpbGVGb2xkZXIpIHRocm93cyBJT0V4Y2VwdGlvbixFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmV4aXN0cygpKXsKLSAgICAgICAgICAgIG91dHB1dEZvbGRlci5ta2RpcigpOyAvL2NyZWF0ZSB0aGUgb3V0cHV0IHBhdGgKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZvbGRlcixvdXRwdXRGaWxlTmFtZSk7Ci0gICAgICAgIHRoaXMuc2V0QmFzZWRpcihpbnB1dEZpbGVGb2xkZXIpOwotICAgICAgICB0aGlzLnNldERlc3RGaWxlKHRhcmdldEZpbGUpOwotCi0gICAgICAgIC8vcnVuIHRoZSB0YXNrCi0gICAgICAgIHRoaXMucGVyZm9ybSgpOwotCi0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU2VydmljZUZpbGVDcmVhdG9yLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TZXJ2aWNlRmlsZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwNGMzMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TZXJ2aWNlRmlsZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLkZpbGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4ud3JpdGVyLlNlcnZpY2VYTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRmlsZUNyZWF0b3IgewotICAgIAotICAgIHB1YmxpYyBGaWxlIGNyZWF0ZVNlcnZpY2VGaWxlKFN0cmluZyBzZXJ2aWNlTmFtZSxTdHJpbmcgaW1wbGVtZW50YXRpb25DbGFzc05hbWUsQXJyYXlMaXN0IG1ldGhvZExpc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRVc2VyRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAic2VydmljZXMueG1sIjsKLSAgICAgICAgCi0gICAgICAgIEZpbGVXcml0ZXIgc2VydmljZVhtbFdyaXRlciA9IG5ldyBTZXJ2aWNlWE1MV3JpdGVyKGN1cnJlbnRVc2VyRGlyKTsKLSAgICAgICAgd3JpdGVGaWxlKGdldFNlcnZpY2VNb2RlbChzZXJ2aWNlTmFtZSxpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSxtZXRob2RMaXN0KSxzZXJ2aWNlWG1sV3JpdGVyLGZpbGVOYW1lKTsKLQotICAgICAgICByZXR1cm4gbmV3IEZpbGUoY3VycmVudFVzZXJEaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLQotCi0KLQotICAgIH0KLQotICAgIHByaXZhdGUgRG9jdW1lbnQgZ2V0U2VydmljZU1vZGVsKFN0cmluZyBzZXJ2aWNlTmFtZSxTdHJpbmcgY2xhc3NOYW1lLEFycmF5TGlzdCBtZXRob2RzKXsKLQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgiY2xhc3NwYWNrYWdlIiwiIik7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsY2xhc3NOYW1lKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJzZXJ2aWNlbmFtZSIsc2VydmljZU5hbWUpOwotICAgICAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBudWxsOwotICAgICAgICBpbnQgc2l6ZSA9IG1ldGhvZHMuc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGk9MDtpPHNpemU7aSsrKXsKLSAgICAgICAgICAgIG1ldGhvZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgibWV0aG9kIik7Ci0gICAgICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLG1ldGhvZHMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobWV0aG9kRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSByZXN1c2FibGUgbWV0aG9kIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiB3cml0aW5nCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICogQHBhcmFtIHdyaXRlcgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRG9jdW1lbnQgbW9kZWwsIEZpbGVXcml0ZXIgd3JpdGVyLFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBTb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShtb2RlbCk7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBtZW1vcnlTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG1lbW9yeVN0cmVhbSk7Ci0gICAgICAgIFRyYW5zZm9ybWVyIHhmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICB4Zm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7Ci0gICAgICAgIAotICAgICAgICAvL1RPRE86IERvZXNuJ3QgcmVhbGx5IG91dHB1dCBzdHVmZiBmcm9tIHRoZSBtZW1vcnlzdHJlYW0gdG8gZmlsZS4uLmhtbS4KLSAgICAgICAgCi0gICAgICAgIHdyaXRlci5sb2FkVGVtcGxhdGUoKTsKLSAgICAgICAgd3JpdGVyLmNyZWF0ZU91dEZpbGUobnVsbCwKLSAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotICAgIH0KLSAgICAKLSAgIAotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TcmNDb21waWxlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvU3JjQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkZjYxYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TcmNDb21waWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjdXN0b20gY2xhc3MgZm9yIGNvbXBpbGluZyB0aGUgc291cmNlIAotICovCi1wdWJsaWMgY2xhc3MgU3JjQ29tcGlsZXIgZXh0ZW5kcyBKYXZhYyB7Ci0KLSAgICBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHVibGljIFNyY0NvbXBpbGVyKCkgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgdGhpcy5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21waWxlU291cmNlKEZpbGUgZGVzdERpciwgU3RyaW5nIGNvbXBpbGFibGVTcmNMb2NhdGlvbil7Ci0KLSAgICAgICAgUGF0aCBwYXRoOwotICAgICAgICBQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChwcm9qZWN0LGNvbXBpbGFibGVTcmNMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIpOwotICAgICAgICB0aGlzLnNldFNyY2RpcihzcmNQYXRoKTsKLSAgICAgICAgdGhpcy5zZXREZXN0ZGlyKGRlc3REaXIpOwotICAgICAgICB0aGlzLnNldEluY2x1ZGVzKCIqKi8qLmphdmEsICouamF2YSIpOwotICAgICAgICBGaWxlIGxpYiA9IG5ldyBGaWxlKGNvbXBpbGFibGVTcmNMb2NhdGlvbisgIEZpbGUuc2VwYXJhdG9yICsgImxpYiIpOwotICAgICAgICBGaWxlIGZpbGVzIFtdID0gbmV3IEZpbGVbbGliLmxpc3RGaWxlcygpLmxlbmd0aF07Ci0gICAgICAgIGZpbGVzID0gbGliLmxpc3RGaWxlcygpOwotCi0gICAgICAgIFBhdGggY2xhc3NwYXRoID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIGZvciAoaW50IGNvdW50ID0wO2NvdW50PGZpbGVzLmxlbmd0aDtjb3VudCsrKXsKLSAgICAgICAgICAgIHBhdGggPSBuZXcgUGF0aChwcm9qZWN0LGZpbGVzW2NvdW50XS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBjbGFzc3BhdGguYWRkKHBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOwotICAgICAgICB0aGlzLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgIHRoaXMucGVyZm9ybSgpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3V0aWwvQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvdXRpbC9Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4Y2VhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2UtY29kZWdlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvdXRpbC9Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25zdGFudHMgewotICAgIHB1YmxpYyBjbGFzcyBVSUNvbnN0YW50c3sKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxfV0lEVEg9MTAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSQURJT19CVVRUT05fV0lEVEg9MjAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0JPWF9XSURUSD0yNTA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJST1dTRV9CVVRUT05fV0lEVEg9MjA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfQlVUVE9OX1dJRFRIPTgwOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdFTkVSQUxfQ09NUF9IRUlHSFQ9MjA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3YWE1Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotc291cmNlLi4gPSBzcmMvbWFpbi9qYXZhLyxcCi0gICAgICAgICAgIHRhcmdldC9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXMvCi1vdXRwdXQuLiA9IHRhcmdldC9jbGFzc2VzLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIGhlbHBfdG9jLnhtbApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL2VjbGlwc2Utc2VydmljZS1wbHVnaW4tYXNzZW1ibHkueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL2VjbGlwc2Utc2VydmljZS1wbHVnaW4tYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDkzYjM4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9lY2xpcHNlLXNlcnZpY2UtcGx1Z2luLWFzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5PgotICAgIDxpZD5heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luPC9pZD4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgICAgICAgPCEtLSBXZSBvbmx5IHdhbnQgdG8gaW5jbHVkZSB0aGUgbWFpbiBhcnRpZmFjdCBvZiB0aGUgcHJvamVjdCAtLT4KLSAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPiR7cHJvamVjdC5ncm91cElkfToke3Byb2plY3QuYXJ0aWZhY3RJZH08L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5wbHVnaW5zPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8IS0tIE1ha2Ugc3VyZSB0aGF0IHRoZSBuYW1lIG9mIHRoZSBKQVIgaW4gdGhlIGRpc3RyaWJ1dGlvbiByZXNwZWN0cyB0aGUgbmFtaW5nCi0gICAgICAgICAgICAgICAgIGNvbnZlbnRpb24gZXhwZWN0ZWQgYnkgRWNsaXBzZS4gVGhlIGJ1bmRsZS1zeW1ib2xpYy1uYW1lIGFuZAotICAgICAgICAgICAgICAgICBidW5kbGUtdmVyc2lvbiB2YXJpYWJsZXMgYXJlIGNhbGN1bGF0ZWQgYnkgYSBHcm9vdnkgc2NyaXB0IGV4ZWN1dGVkIGZyb20gdGhlIFBPTS4gLS0+Ci0gICAgICAgICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YnVuZGxlLXN5bWJvbGljLW5hbWV9XyR7YnVuZGxlLXZlcnNpb259Lmphcjwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vaGVscF90b2MueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL2hlbHBfdG9jLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmMjVhZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vaGVscF90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08dG9jIGxhYmVsPSJBeGlzMiBTZXJ2aWNlIEFyY2hpdmVyIiA+Ci0gIDx0b3BpYyBsYWJlbD0iU2VydmljZSBBcmNoaXZlciIgaHJlZj0iaGVscC9zZXJ2aWNlYXJjaGl2ZXItcGx1Z2luLmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5naWYgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQxYzMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vaWNvbnMvc2FtcGxlLmdpZiBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTE1ZDhjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3BsdWdpbi54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExOGY3YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHBsdWdpbj4KLTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iQXhpczIgV2l6YXJkcyIKLSAgICAgICAgICAgIGlkPSJBeGlzMl9XaXphcmRzIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSJBeGlzMiBTZXJ2aWNlIEFyY2hpdmVyIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvc2FtcGxlLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJBeGlzMl9XaXphcmRzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuU2VydmljZUFyY2hpdmVXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2Uuc2VydmljZVdpemFyZCI+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iaGVscF90b2MueG1sIiBwcmltYXJ5PSJ0cnVlIiAvPgotPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9wb20ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTY5MzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLmVjbGlwc2Uuc2VydmljZS5wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEVjbGlwc2Ugc2VydmljZSBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5idW5kbGU8L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBFY2xpcHNlIFNlcnZpY2UgUGx1Z2luIGZvciBTZXJ2aWNlIGFyY2hpdmUgY3JlYXRpb248L2Rlc2NyaXB0aW9uPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW08L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudXBkYXRlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51cGRhdGUudWk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudXBkYXRlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnVwZGF0ZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuaGVscDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuaGVscDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5lcXVpbm94PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmVxdWlub3g8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmFudC5jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uuc3d0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uuc3d0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NnaTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zZ2k8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zd3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudWk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS51aS5pZGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS51aTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UudWkuZm9ybXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UudWk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgICAgICAgPC9leGNsdXNpb25zPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamZhY2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZmFjZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+LjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+cGx1Z2luLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+aWNvbnMvKio8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmhlbHBfdG9jLnhtbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lY2xpcHNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjg8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gV2UgZG9uJ3QgdXNlIHRoZSBQREUgbW9kZSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBtYXZlbi1lY2xpcHNlLXBsdWdpbiB0byB0YW1wZXIgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYW5pZmVzdCBnZW5lcmF0ZWQgYnkgbWF2ZW4tYnVuZGxlLXBsdWdpbiAtLT4KLSAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxCdWlsZGNvbW1hbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGJ1aWxkY29tbWFuZD5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9idWlsZGNvbW1hbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YnVpbGRjb21tYW5kPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9idWlsZGNvbW1hbmQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvYWRkaXRpb25hbEJ1aWxkY29tbWFuZHM+Ci0gICAgICAgICAgICAgICAgICAgIDxhZGRpdGlvbmFsUHJvamVjdG5hdHVyZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cHJvamVjdG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9wcm9qZWN0bmF0dXJlPgotICAgICAgICAgICAgICAgICAgICA8L2FkZGl0aW9uYWxQcm9qZWN0bmF0dXJlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIGNvcGllcyB0aGUgZGVwZW5kZW5jaWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgbG9jYXRlZCBieSBFY2xpcHNlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmNvcHktZGVwZW5kZW5jaWVzPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHktZGVwZW5kZW5jaWVzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZVJlbGVhc2VzPmZhbHNlPC9vdmVyV3JpdGVSZWxlYXNlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3ZlcldyaXRlU25hcHNob3RzPmZhbHNlPC9vdmVyV3JpdGVTbmFwc2hvdHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG92ZXJXcml0ZUlmTmV3ZXI+dHJ1ZTwvb3ZlcldyaXRlSWZOZXdlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNsZWFuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+bGliPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pk1FVEEtSU5GPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8IS0tIFByb2R1Y2UgdGhlIG1hbmlmZXN0IGluIHRoZSBsb2NhdGlvbiBleHBlY3RlZCBieSBFY2xpcHNlIC0tPgotICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RMb2NhdGlvbj5NRVRBLUlORjwvbWFuaWZlc3RMb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW1iZWQgYWxsIGRlcGVuZGVuY2llcywgZXhjZXB0IHRob3NlIHdoaWNoIGFyZSBwcm92aWRlZCBieSB0aGUgRWNsaXBzZSBydW50aW1lIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPEVtYmVkLURlcGVuZGVuY3k+KjtzY29wZT1jb21waWxlfHJ1bnRpbWU7YXJ0aWZhY3RJZD0hb3JnLmVjbGlwc2UuKnxjb21tb25zLWxvZ2dpbmd8d3N0eC1hc2x8Z2Vyb25pbW8tYWN0aXZhdGlvbl8xLjFfc3BlY3xnZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlY3xnZXJvbmltby1zdGF4LWFwaV8xLjBfc3BlY3xhbnQqPC9FbWJlZC1EZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPEVtYmVkLURpcmVjdG9yeT5saWI8L0VtYmVkLURpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxFbWJlZC1UcmFuc2l0aXZlPnRydWU8L0VtYmVkLVRyYW5zaXRpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEV4Y2x1ZGUgaW1wb3J0cyB0aGF0IGFyZSBhY3R1YWxseSBub3QgdXNlZCAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4hb3JnLmRvbTRqKiwhbnUueG9tLCFvcmcuamRvbSosIWphdmF4LnBvcnRsZXQsIW9yZy5hcGFjaGUuY29tbW9ucy5pbyosKjwvSW1wb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2UgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT5BeGlzMiBTZXJ2aWNlIE1ha2VyPC9CdW5kbGUtTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQWN0aXZhdG9yPm9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjwvQnVuZGxlLUFjdGl2YXRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtU3ltYm9saWNOYW1lPm9yZy5hcGFjaGUuYXhpczIuZWNsaXBzZS5zZXJ2aWNlLnBsdWdpbjtzaW5nbGV0b246PXRydWU8L0J1bmRsZS1TeW1ib2xpY05hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k+bGF6eTwvQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ+SjJTRS0xLjU8L0J1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50PgotICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdtYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmV4dHJhY3QtYnVuZGxlLXN5bWJvbGljbmFtZS1hbmQtdmVyc2lvbjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZXhlY3V0ZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShwcm9qZWN0LmJhc2VkaXIsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5wcm9wZXJ0aWVzWyJidW5kbGUtc3ltYm9saWMtbmFtZSJdID0gbWFuaWZlc3QubWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkJ1bmRsZS1TeW1ib2xpY05hbWUiKS5maW5kKCJeW147XSoiKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5wcm9wZXJ0aWVzWyJidW5kbGUtdmVyc2lvbiJdID0gbWFuaWZlc3QubWFpbkF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkJ1bmRsZS1WZXJzaW9uIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGlzdHJpYnV0aW9uLXBhY2thZ2U8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtwb20uYmFzZWRpcn0vZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPmRpc3Q8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3Jlc291cmNlcy9zZXJ2aWNlcy54c2QgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcmVzb3VyY2VzL3NlcnZpY2VzLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNmE3OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vcmVzb3VyY2VzL3NlcnZpY2VzLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+DQotICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2VHcm91cCI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJzZXJ2aWNlIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJwYXJhbWV0ZXIiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Im1vZHVsZSIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InNlcnZpY2UiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4NCi0gICAgICAgICAgICAgICAgPHhzOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1vZHVsZSIvPg0KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvcGVyYXRpb24iLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImRlc2NyaXB0aW9uIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9IkRlc2NyaXB0aW9uIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImV4Y2x1ZGVPcGVyYXRpb25zIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VSZWNlaXZlcnMiLz4NCi0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ic2NoZW1hIi8+DQotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydHMiLz4NCi0gICAgICAgICAgICAgICAgPC94czpjaG9pY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkYXRhTG9jYXRvciIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImFjdGl2YXRlIiB0eXBlPSJ4czpib29sZWFuIiB1c2U9Im9wdGlvbmFsIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciLz4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzOnN0cmluZyIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJleGNsdWRlT3BlcmF0aW9ucyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPiAgDQotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZVJlY2VpdmVycyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgcmVmPSJtZXNzYWdlUmVjZWl2ZXIiLz4NCi0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWEiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hTmFtZXNwYWNlIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0cyI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydCIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImRhdGFMb2NhdG9yIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgcmVmPSJkaWFsZWN0TG9jYXRvciIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIvPg0KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4NCi0gICAgPC94czplbGVtZW50Pg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkaWFsZWN0TG9jYXRvciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdXNlPSJyZXF1aXJlZCIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlhbGVjdCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtZXRlciI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibG9ja2VkIiB0eXBlPSJ4czpOTVRPS0VOIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibW9kdWxlIj4NCi0gICAgICAgIDx4czpjb21wbGV4VHlwZT4NCi0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZiIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im9wZXJhdGlvbiI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPg0KLSAgICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibW9kdWxlIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+DQotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iYWN0aW9uTWFwcGluZyIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZhdWx0QWN0aW9uTWFwcGluZyIvPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2UiLz4NCi0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvdXRwdXRBY3Rpb25NYXBwaW5nIi8+DQotICAgICAgICAgICAgPC94czpjaG9pY2U+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXAiIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJxbmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9ImFjdGlvbk1hcHBpbmciIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJmYXVsdEFjdGlvbk1hcHBpbmciPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50Pg0KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOmFueVVSSSI+DQotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhdWx0TmFtZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KLSAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibWVzc2FnZSI+DQotICAgICAgICA8eHM6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InBhcmFtZXRlciIvPg0KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+DQotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPg0KLSAgICA8L3hzOmVsZW1lbnQ+DQotICAgIDx4czplbGVtZW50IG5hbWU9Im91dHB1dEFjdGlvbk1hcHBpbmciIHR5cGU9InhzOmFueVVSSSIvPg0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlUmVjZWl2ZXIiPg0KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPg0KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVwIiB0eXBlPSJ4czphbnlVUkkiLz4NCi0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+DQotICAgIDwveHM6ZWxlbWVudD4NCi08L3hzOnNjaGVtYT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9DbGFzc0ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDdiOWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvQ2xhc3NGaWxlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIENsYXNzRmlsZUhhbmRsZXIgewotCi0KLSAgIAotLyoqCi0gKiAKLSAqIEBwYXJhbSBjbGFzc0ZpbGVOYW1lCi0gKiBAcGFyYW0gbG9jYXRpb24KLSAqIEByZXR1cm4KLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICovCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRNZXRob2ROYW1lc0Zyb21DbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSxTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbnsKLSAgICAgICAgQXJyYXlMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEZpbGUgZmlsZUVuZHBvaW50ID0gbmV3IEZpbGUobG9jYXRpb24pOwotICAgICAgICBpZiAoIWZpbGVFbmRwb2ludC5leGlzdHMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidGhlIGxvY2F0aW9uIGlzIGludmFsaWQiKTsKLSAgICAgICAgVVJMW10gdXJsTGlzdCA9IHtmaWxlRW5kcG9pbnQudG9VUkwoKX07Ci0gICAgICAgIFVSTENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybExpc3QpOwotICAgICAgICBDbGFzcyBjbGF6eiA9IGNsYXp6TG9hZGVyLmxvYWRDbGFzcyhjbGFzc0ZpbGVOYW1lKTsKLSAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQobWV0aG9kc1tpXS5nZXROYW1lKCkpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9GaWxlQ29waWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjBjMmYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvRmlsZUNvcGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgRmlsZUNvcGllciBleHRlbmRzIENvcHl7Ci0gICAgcHVibGljIEZpbGVDb3BpZXIoKSB7Ci0gICAgICAgIHRoaXMuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLSAgICAgICAgdGhpcy5nZXRQcm9qZWN0KCkuaW5pdCgpOwotICAgICAgICB0aGlzLnNldFRhc2tUeXBlKCJjb3B5Iik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImNvcHktZmlsZXMiKTsKLSAgICAgICAgdGhpcy5zZXRPd25pbmdUYXJnZXQobmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZXMoRmlsZSBzb3VyY2VGaWxlLEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnksU3RyaW5nIGZpbHRlcil7Ci0KLSAgICAgICAgaWYgKHNvdXJjZUZpbGUuaXNGaWxlKCkpCi0gICAgICAgICAgICB0aGlzLnNldEZpbGUoc291cmNlRmlsZSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAJIEZpbGVTZXQgZmlsZXNldCA9IG5ldyBGaWxlU2V0KCk7Ci0JICAgICAgICAgICAgZmlsZXNldC5zZXREaXIoc291cmNlRmlsZSk7Ci0JICAgICAgICAgICAgaWYgKGZpbHRlciE9bnVsbCl7Ci0JICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcygiXFwuXFx3KiIpKXsKLQkgICAgICAgICAgICAgICAgCWZpbGVzZXQuc2V0SW5jbHVkZXMoIioqLyoiK2ZpbHRlcik7IAotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy5hZGRGaWxlc2V0KGZpbGVzZXQpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2V0VG9kaXIoZGVzdGluYXRpb25EaXJlY3RvcnkpOwotICAgICAgICB0aGlzLnBlcmZvcm0oKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvSmFyRmlsZVdyaXRlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL2NvcmUvSmFyRmlsZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGRhMmYzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL0phckZpbGVXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmFyRmlsZVdyaXRlciBleHRlbmRzIEphcnsKLQotCi0gICAgcHVibGljIEphckZpbGVXcml0ZXIoKSB7Ci0gICAgICAgIHRoaXMuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLSAgICAgICAgdGhpcy5nZXRQcm9qZWN0KCkuaW5pdCgpOwotICAgICAgICB0aGlzLnNldFRhc2tUeXBlKCJqYXIiKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrTmFtZSgiamFyIik7Ci0gICAgICAgIHRoaXMuc2V0T3duaW5nVGFyZ2V0KG5ldyBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVKYXJGaWxlKEZpbGUgb3V0cHV0Rm9sZGVyLFN0cmluZyBvdXRwdXRGaWxlTmFtZSxGaWxlIGlucHV0RmlsZUZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uLEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKCFvdXRwdXRGb2xkZXIuZXhpc3RzKCkpewotICAgICAgICAgICAgb3V0cHV0Rm9sZGVyLm1rZGlyKCk7IC8vY3JlYXRlIHRoZSBvdXRwdXQgcGF0aAotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUob3V0cHV0Rm9sZGVyLG91dHB1dEZpbGVOYW1lKTsKLSAgICAgICAgdGhpcy5zZXRCYXNlZGlyKGlucHV0RmlsZUZvbGRlcik7Ci0gICAgICAgIHRoaXMuc2V0RGVzdEZpbGUodGFyZ2V0RmlsZSk7Ci0KLSAgICAgICAgLy9ydW4gdGhlIHRhc2sKLSAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0KLQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TZXJ2aWNlRmlsZUNyZWF0b3IuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL1NlcnZpY2VGaWxlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTA0YzMxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL1NlcnZpY2VGaWxlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuRmlsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi53cml0ZXIuU2VydmljZVhNTFdyaXRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VGaWxlQ3JlYXRvciB7Ci0gICAgCi0gICAgcHVibGljIEZpbGUgY3JlYXRlU2VydmljZUZpbGUoU3RyaW5nIHNlcnZpY2VOYW1lLFN0cmluZyBpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSxBcnJheUxpc3QgbWV0aG9kTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgY3VycmVudFVzZXJEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJzZXJ2aWNlcy54bWwiOwotICAgICAgICAKLSAgICAgICAgRmlsZVdyaXRlciBzZXJ2aWNlWG1sV3JpdGVyID0gbmV3IFNlcnZpY2VYTUxXcml0ZXIoY3VycmVudFVzZXJEaXIpOwotICAgICAgICB3cml0ZUZpbGUoZ2V0U2VydmljZU1vZGVsKHNlcnZpY2VOYW1lLGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lLG1ldGhvZExpc3QpLHNlcnZpY2VYbWxXcml0ZXIsZmlsZU5hbWUpOwotCi0gICAgICAgIHJldHVybiBuZXcgRmlsZShjdXJyZW50VXNlckRpciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpOwotCi0KLQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBEb2N1bWVudCBnZXRTZXJ2aWNlTW9kZWwoU3RyaW5nIHNlcnZpY2VOYW1lLFN0cmluZyBjbGFzc05hbWUsQXJyYXlMaXN0IG1ldGhvZHMpewotCi0gICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICAKLSAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJpbnRlcmZhY2UiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzc3BhY2thZ2UiLCIiKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIixjbGFzc05hbWUpOwotICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoInNlcnZpY2VuYW1lIixzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGludCBzaXplID0gbWV0aG9kcy5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wO2k8c2l6ZTtpKyspewotICAgICAgICAgICAgbWV0aG9kRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KCJtZXRob2QiKTsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsbWV0aG9kcy5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChtZXRob2RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotICAgICAgICByZXR1cm4gZG9jOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHJlc3VzYWJsZSBtZXRob2QgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIHdyaXRpbmcKLSAgICAgKiBAcGFyYW0gbW9kZWwKLSAgICAgKiBAcGFyYW0gd3JpdGVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZShEb2N1bWVudCBtb2RlbCwgRmlsZVdyaXRlciB3cml0ZXIsU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKG1vZGVsKTsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG1lbW9yeVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQobWVtb3J5U3RyZWFtKTsKLSAgICAgICAgVHJhbnNmb3JtZXIgeGZvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICAgIHhmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAgICAgCi0gICAgICAgIC8vVE9ETzogRG9lc24ndCByZWFsbHkgb3V0cHV0IHN0dWZmIGZyb20gdGhlIG1lbW9yeXN0cmVhbSB0byBmaWxlLi4uaG1tLgotICAgICAgICAKLSAgICAgICAgd3JpdGVyLmxvYWRUZW1wbGF0ZSgpOwotICAgICAgICB3cml0ZXIuY3JlYXRlT3V0RmlsZShudWxsLAotICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0gICAgfQotICAgIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL1NlcnZpY2VYTUxDcmVhdGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvY29yZS9TZXJ2aWNlWE1MQ3JlYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDNkNjVhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9jb3JlL1NlcnZpY2VYTUxDcmVhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VYTUxDcmVhdGVyIHsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlQ2xhc3M7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgb3BlcmF0aW9uczsKLQotICAgIHB1YmxpYyBTZXJ2aWNlWE1MQ3JlYXRlcihTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlQ2xhc3MsIEFycmF5TGlzdCBvcGVyYXRpb25zKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0T3BlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VYTUwgPSAiPHNlcnZpY2UgbmFtZT1cIiIgKyBzZXJ2aWNlTmFtZSArICJcIiA+XG4iICsKLSAgICAgICAgIlx0PGRlc2NyaXB0aW9uPlxuIiArCi0gICAgICAgICJcdFx0UGxlYXNlIFR5cGUgeW91ciBzZXJ2aWNlIGRlc2NyaXB0aW9uIGhlcmVcbiIgKwotICAgICAgICAiXHQ8L2Rlc2NyaXB0aW9uPlxuIiArCi0gICAgICAgICJcdDxtZXNzYWdlUmVjZWl2ZXJzPlxuIiArCi0gICAgICAgICJcdFx0PG1lc3NhZ2VSZWNlaXZlciBtZXA9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seVwiIGNsYXNzPVwib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlclwiIC8+XG4iICsKLSAgICAgICAgIlx0XHQ8bWVzc2FnZVJlY2VpdmVyICBtZXA9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb3V0XCIgIGNsYXNzPVwib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ01lc3NhZ2VSZWNlaXZlclwiLz5cbiIgKwotICAgICAgICAiXHQ8L21lc3NhZ2VSZWNlaXZlcnM+XG4iICsgCi0gICAgICAgICJcdDxwYXJhbWV0ZXIgbmFtZT1cIlNlcnZpY2VDbGFzc1wiPiIgKyBzZXJ2aWNlQ2xhc3MgKyAiPC9wYXJhbWV0ZXI+XG4iIDsgCi0gICAgICAgIHNlcnZpY2VYTUwgPSBzZXJ2aWNlWE1MICsgIjwvc2VydmljZT5cbiI7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlWE1MOwotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL0NsYXNzRmlsZVNlbGVjdGlvbkJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzg5MWI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZUxvY2F0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlcjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZmlsZUxvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVMb2NhdGlvbihTdHJpbmcgZmlsZUxvY2F0aW9uKSB7Ci0gICAgICAgIHRoaXMuZmlsZUxvY2F0aW9uID0gZmlsZUxvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlcjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL0xpYnJhcnlTZWxlY3Rpb25CZWFuLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL0xpYnJhcnlTZWxlY3Rpb25CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYzA4MjkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9MaWJyYXJ5U2VsZWN0aW9uQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VsZWN0aW9uQmVhbiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBmaWxlTGlzdCA9IG51bGw7Ci0gICAgCi0gICAgCi0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbGVMaXN0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRGaWxlTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGVMaXN0OwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmlsZUxpc3QgVGhlIGZpbGVMaXN0IHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTGlzdChTdHJpbmdbXSBmaWxlTGlzdCkgewotICAgICAgICB0aGlzLmZpbGVMaXN0ID0gZmlsZUxpc3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9QYWdlMkJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vUGFnZTJCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmY1OWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9QYWdlMkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgUGFnZTJCZWFuIHsKLSAgICBwcml2YXRlIGJvb2xlYW4gbWFudWFsID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGF1dG9tYXRpYyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFudWFsRmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXV0b21hdGljQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHByb3ZpZGVyQ2xhc3NOYW1lOwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRNZXRob2ROYW1lczsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZTsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VOYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlTmFtZSB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlckNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHByb3ZpZGVyQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3ZpZGVyQ2xhc3NOYW1lKFN0cmluZyBwcm92aWRlckNsYXNzTmFtZSkgewotICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lID0gcHJvdmlkZXJDbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFBhZ2UyQmVhbigpIHsKLSAgICAgICAgc2VsZWN0ZWRNZXRob2ROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hbnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIG1hbnVhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYW51YWwoYm9vbGVhbiBtYW51YWwpIHsKLSAgICAgICAgdGhpcy5tYW51YWwgPSBtYW51YWw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdXRvbWF0aWMoKSB7Ci0gICAgICAgIHJldHVybiBhdXRvbWF0aWM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b21hdGljKGJvb2xlYW4gYXV0b21hdGljKSB7Ci0gICAgICAgIHRoaXMuYXV0b21hdGljID0gYXV0b21hdGljOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFudWFsRmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtYW51YWxGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNYW51YWxGaWxlTmFtZShTdHJpbmcgbWFudWFsRmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5tYW51YWxGaWxlTmFtZSA9IG1hbnVhbEZpbGVOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0b21hdGljQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gYXV0b21hdGljQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9tYXRpY0NsYXNzTmFtZShTdHJpbmcgYXV0b21hdGljQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuYXV0b21hdGljQ2xhc3NOYW1lID0gYXV0b21hdGljQ2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0TWV0aG9kTmFtZUNvdW50KCkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWRNZXRob2ROYW1lcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRNZXRob2ROYW1lcyhBcnJheUxpc3QgbGlzdCkgewotICAgICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kTmFtZXMgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkTWV0aG9kTmFtZXMuZ2V0KGluZGV4KS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE1ldGhvZE5hbWUoU3RyaW5nIHNlbGVjdGVkTWV0aG9kTmFtZSkgewotICAgICAgICB0aGlzLnNlbGVjdGVkTWV0aG9kTmFtZXMuYWRkKHNlbGVjdGVkTWV0aG9kTmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0U2VsZWN0ZWRNZXRob2ROYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkTWV0aG9kTmFtZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9QYWdlM0JlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vUGFnZTNCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjI3YzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9QYWdlM0JlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbjsKLQotcHVibGljIGNsYXNzIFBhZ2UzQmVhbiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0Rm9sZGVyTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRGaWxlTmFtZTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0Rm9sZGVyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEZvbGRlck5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0Rm9sZGVyTmFtZShTdHJpbmcgb3V0cHV0Rm9sZGVyTmFtZSkgewotICAgICAgICB0aGlzLm91dHB1dEZvbGRlck5hbWUgPSBvdXRwdXRGb2xkZXJOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlTmFtZShTdHJpbmcgb3V0cHV0RmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczYTlmOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1dTRExBdXRvR2VuZXJhdGVPcHRpb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMQXV0b0dlbmVyYXRlT3B0aW9uQmVhbiB7Ci0gICAgLy9yZXN0IG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSB0YWtlbiBmcm9tIG90aGVyCi0gICAgLy9iZWFucwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzRmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3R5bGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgbGlzdE9mTWV0aG9kczsKLSAgICAKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3V0cHV0RmlsZU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEZpbGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gb3V0cHV0RmlsZU5hbWUgVGhlIG91dHB1dEZpbGVOYW1lIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRGaWxlTmFtZShTdHJpbmcgb3V0cHV0RmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzRmlsZU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0ZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NGaWxlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsYXNzRmlsZU5hbWUgVGhlIGNsYXNzRmlsZU5hbWUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzRmlsZU5hbWUoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVOYW1lID0gY2xhc3NGaWxlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgewotICAgICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0eWxlKFN0cmluZyBzdHlsZSkgewotICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGlzdE9mTWV0aG9kcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldExpc3RPZk1ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0T2ZNZXRob2RzOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbGlzdE9mTWV0aG9kcyBUaGUgbGlzdE9mTWV0aG9kcyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGlzdE9mTWV0aG9kcyhWZWN0b3IgbGlzdE9mTWV0aG9kcykgewotICAgICAgICB0aGlzLmxpc3RPZk1ldGhvZHMgPSBsaXN0T2ZNZXRob2RzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV1NETEZpbGVMb2NhdGlvbkJlYW4uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV1NETEZpbGVMb2NhdGlvbkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyNzBmNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9iZWFuL1dTRExGaWxlTG9jYXRpb25CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZUxvY2F0aW9uQmVhbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBXU0RMRmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1hbnVhbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcDsKLSAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNraXAuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTa2lwKCkgewotICAgICAgICByZXR1cm4gc2tpcDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHNraXAgVGhlIHNraXAgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNraXAoYm9vbGVhbiBza2lwKSB7Ci0gICAgICAgIHRoaXMuc2tpcCA9IHNraXA7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbWFudWFsLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTWFudWFsKCkgewotICAgICAgICByZXR1cm4gbWFudWFsOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFudWFsIFRoZSBtYW51YWwgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1hbnVhbChib29sZWFuIG1hbnVhbCkgewotICAgICAgICB0aGlzLm1hbnVhbCA9IG1hbnVhbDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3U0RMRmlsZU5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMRmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU0RMRmlsZU5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgd1NETEZpbGVOYW1lIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIFdTRExGaWxlTmFtZSA9IGZpbGVOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2JlYW4vV2l6YXJkQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XaXphcmRCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjdiMTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvYmVhbi9XaXphcmRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBXaXphcmRCZWFuIHsKLSAgICBwcml2YXRlIENsYXNzRmlsZVNlbGVjdGlvbkJlYW4gY2xhc3NGaWxlQmVhbjsKLSAgICBwcml2YXRlIFdTRExGaWxlTG9jYXRpb25CZWFuIHdzZGxCZWFuOwotICAgIHByaXZhdGUgTGlicmFyeVNlbGVjdGlvbkJlYW4gbGlicmFyeUJlYW47Ci0gICAgCi0gICAgcHJpdmF0ZSBQYWdlMkJlYW4gcGFnZTJiZWFuOwotICAgIHByaXZhdGUgUGFnZTNCZWFuIHBhZ2UzYmVhbjsKLSAgICAKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbGlicmFyeUJlYW4uCi0gICAgICovCi0gICAgcHVibGljIExpYnJhcnlTZWxlY3Rpb25CZWFuIGdldExpYnJhcnlCZWFuKCkgewotICAgICAgICByZXR1cm4gbGlicmFyeUJlYW47Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSBsaWJyYXJ5QmVhbiBUaGUgbGlicmFyeUJlYW4gdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExpYnJhcnlCZWFuKExpYnJhcnlTZWxlY3Rpb25CZWFuIGxpYnJhcnlCZWFuKSB7Ci0gICAgICAgIHRoaXMubGlicmFyeUJlYW4gPSBsaWJyYXJ5QmVhbjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsQmVhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETEZpbGVMb2NhdGlvbkJlYW4gZ2V0V3NkbEJlYW4oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsQmVhbjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIHdzZGxCZWFuIFRoZSB3c2RsQmVhbiB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbEJlYW4oV1NETEZpbGVMb2NhdGlvbkJlYW4gd3NkbEJlYW4pIHsKLSAgICAgICAgdGhpcy53c2RsQmVhbiA9IHdzZGxCZWFuOwotICAgIH0KLSAgICBwdWJsaWMgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiBnZXRQYWdlMWJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0ZpbGVCZWFuOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhZ2UxYmVhbihDbGFzc0ZpbGVTZWxlY3Rpb25CZWFuIHBhZ2UxYmVhbikgewotICAgICAgICB0aGlzLmNsYXNzRmlsZUJlYW4gPSBwYWdlMWJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIFBhZ2UyQmVhbiBnZXRQYWdlMmJlYW4oKSB7Ci0gICAgICAgIHJldHVybiBwYWdlMmJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZTJiZWFuKFBhZ2UyQmVhbiBwYWdlMmJlYW4pIHsKLSAgICAgICAgdGhpcy5wYWdlMmJlYW4gPSBwYWdlMmJlYW47Ci0gICAgfQotCi0gICAgcHVibGljIFBhZ2UzQmVhbiBnZXRQYWdlM2JlYW4oKSB7Ci0gICAgICAgIHJldHVybiBwYWdlM2JlYW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZTNiZWFuKFBhZ2UzQmVhbiBwYWdlM2JlYW4pIHsKLSAgICAgICAgdGhpcy5wYWdlM2JlYW4gPSBwYWdlM2JlYW47Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9jb250cm9sL0NvbnRyb2xsZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2NvbnRyb2wvQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTRkZjEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2NvbnRyb2wvQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuY29udHJvbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlLkNsYXNzRmlsZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLmNvcmUuRmlsZUNvcGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuY29yZS5KYXJGaWxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5jb3JlLlNlcnZpY2VYTUxDcmVhdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLkxpYnJhcnlTZWxlY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uUGFnZTJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uUGFnZTNCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV1NETEZpbGVMb2NhdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5XaXphcmRCZWFuOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENvbnRyb2xsZXIgewotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRNZXRob2RMaXN0KFdpemFyZEJlYW4gYmVhbikgdGhyb3dzIFByb2Nlc3NFeGNlcHRpb24gewotICAgICAgICBBcnJheUxpc3QgcmV0dXJuTGlzdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm5MaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzRmlsZUhhbmRsZXIoKS5nZXRNZXRob2ROYW1lc0Zyb21DbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldFBhZ2UyYmVhbigpLmdldEF1dG9tYXRpY0NsYXNzTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0UGFnZTFiZWFuKCkuZ2V0RmlsZUxvY2F0aW9uKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIklPIEVycm9yLCBUaGUgY2xhc3MgZmlsZSBsb2NhdGlvbiBtYXkgYmUgZmF1bHR5ISIsIGUpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiIFRoZSBzcGVjaWZpZWQgY2xhc3MgZG9lcyBub3QgZXhpc3QhISEiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBFcnJvciEgU2VlIHdoZXRoZXIgYWxsIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXR1cm5MaXN0OwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcyhXaXphcmRCZWFuIGJlYW4pIHRocm93cyBQcm9jZXNzRXhjZXB0aW9uLCBFeGNlcHRpb24gewotCi0gICAgICAgIENsYXNzRmlsZVNlbGVjdGlvbkJlYW4gcGFnZTFCZWFuID0gYmVhbi5nZXRQYWdlMWJlYW4oKTsKLSAgICAgICAgV1NETEZpbGVMb2NhdGlvbkJlYW4gd3NkbEJlYW4gPSBiZWFuLmdldFdzZGxCZWFuKCk7Ci0gICAgICAgIExpYnJhcnlTZWxlY3Rpb25CZWFuIGxpYkJlYW4gPSBiZWFuLmdldExpYnJhcnlCZWFuKCk7Ci0gICAgICAgIFBhZ2UyQmVhbiBwYWdlMkJlYW4gPSBiZWFuLmdldFBhZ2UyYmVhbigpOwotICAgICAgICBQYWdlM0JlYW4gcGFnZTNCZWFuID0gYmVhbi5nZXRQYWdlM2JlYW4oKTsKLQotICAgICAgICBGaWxlIHNlcnZpY2VGaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZSB3c2RsRmlsZSA9IG51bGw7Ci0gICAgICAgIEZpbGUgY2xhc3NGaWxlRm9sZGVyID0gbnVsbDsKLSAgICAgICAgRmlsZSBvdXRwdXRGb2xkZXIgPSBudWxsOwotICAgICAgICBTdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBudWxsOwotICAgICAgICBib29sZWFuIGlzU2VydmljZUNyZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBpc1dTRExBdmFpbGFibGUgPSBmYWxzZTsKLQotICAgICAgICAvL3NlZSBpZiB0aGUgY2xhc3MgZmlsZSBsb2NhdGlvbiBpcyB2YWxpZAotICAgICAgICBjbGFzc0ZpbGVGb2xkZXIgPSBuZXcgRmlsZShwYWdlMUJlYW4uZ2V0RmlsZUxvY2F0aW9uKCkpOwotICAgICAgICBpZiAoIWNsYXNzRmlsZUZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJTcGVjaWZpZWQgQ2xhc3MgZmlsZSBsb2NhdGlvbiBpcyBlbXB0eSEhIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFjbGFzc0ZpbGVGb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgY2xhc3MgZmlsZSBsb2NhdGlvbiBtdXN0IGJlIGEgZm9sZGVyISIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZWUgaWYgdGhlICBzZXJ2aWNlLnhtbCBmaWxlIGlzIHZhbGlkCi0gICAgICAgIGlmIChwYWdlMkJlYW4uaXNNYW51YWwoKSkgewotICAgICAgICAgICAgc2VydmljZUZpbGUgPSBuZXcgRmlsZShwYWdlMkJlYW4uZ2V0TWFudWFsRmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoIXNlcnZpY2VGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIFNlcnZpY2UgWE1MIGZpbGUgaXMgbWlzc2luZyEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBtZXRob2RMaXN0ID0gcGFnZTJCZWFuLmdldFNlbGVjdGVkTWV0aG9kTmFtZXMoKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlIGFyZSBubyBtZXRob2RzIHNlbGVjdGVkIHRvIGdlbmVyYXRlIHRoZSBzZXJ2aWNlISEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBjdXJyZW50VXNlckRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJzZXJ2aWNlcy54bWwiOwotICAgICAgICAgICAgU2VydmljZVhNTENyZWF0ZXIgc2VydmljZVhNTENyZWF0ZXIgPSBuZXcgU2VydmljZVhNTENyZWF0ZXIocGFnZTJCZWFuLmdldFNlcnZpY2VOYW1lKCksCi0gICAgICAgICAgICAJCQkJCQkJCQkJCQkgcGFnZTJCZWFuLmdldEF1dG9tYXRpY0NsYXNzTmFtZSgpLAotICAgICAgICAgICAgCQkJCQkJCQkJCQkJIHBhZ2UyQmVhbi5nZXRTZWxlY3RlZE1ldGhvZE5hbWVzKCkpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VGaWxlU3RyaW5nID0gc2VydmljZVhNTENyZWF0ZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIAlzZXJ2aWNlRmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRVc2VyRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUZpbGUuZXhpc3RzKCkpe3NlcnZpY2VGaWxlLmRlbGV0ZSgpO30KLSAgICAgICAgICAgIEZpbGVXcml0ZXIgc2VydmljZVhNTEZpbGVXcml0ZXIgPSBuZXcgRmlsZVdyaXRlcihzZXJ2aWNlRmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIoc2VydmljZVhNTEZpbGVXcml0ZXIpIDsKLSAgICAgICAgICAgIHdyaXRlci53cml0ZShzZXJ2aWNlRmlsZVN0cmluZykgOwotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCkgOwotICAgICAgICAgICAgCi0vLyAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VGaWxlQ3JlYXRvcigpLmNyZWF0ZVNlcnZpY2VGaWxlKAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTJCZWFuLmdldFNlcnZpY2VOYW1lKCksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlMkJlYW4uZ2V0QXV0b21hdGljQ2xhc3NOYW1lKCksCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlMkJlYW4uZ2V0U2VsZWN0ZWRNZXRob2ROYW1lcygpKTsvL2NyZWF0ZSB0aGUgZmlsZSBoZXJlCi0gICAgICAgICAgICAJCi0gICAgICAgICAgICBpc1NlcnZpY2VDcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2VlIGlmIHRoZSBXU0RMIGZpbGUgaXMgYXZhaWxhYmxlCi0gICAgICAgIGlmICghd3NkbEJlYW4uaXNTa2lwKCkpewotICAgICAgICAgICAgd3NkbEZpbGUgPSBuZXcgRmlsZSh3c2RsQmVhbi5nZXRXU0RMRmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAoIXdzZGxGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIFdTREwgZmlsZSBpcyBtaXNzaW5nISIpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgaXNXU0RMQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTGlzdCBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgLy9jaGVjayB0aGUgbGlicwotICAgICAgICBpZiAobGliQmVhbiE9bnVsbCl7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGxpYkJlYW4uZ2V0RmlsZUxpc3QoKTsKLSAgICAgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBudWxsOwotICAgICAgICAgICAgaWYgKGZpbGVzIT1udWxsKXsKLSAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGZpbGVzLmxlbmd0aDtpKyspewotICAgICAgICAgICAgICAgICB0ZW1wRmlsZSA9IG5ldyBGaWxlKGZpbGVzW2ldKTsgCi0gICAgICAgICAgICAgICAgIGlmICghdGVtcEZpbGUuZXhpc3RzKCl8fHRlbXBGaWxlLmlzRGlyZWN0b3J5KCkpewotICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oIkludmFsaWQgbGlicmFyaWVzIik7Ci0gICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKHRlbXBGaWxlKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBvdXRwdXRGb2xkZXIgPSBuZXcgRmlsZShwYWdlM0JlYW4uZ2V0T3V0cHV0Rm9sZGVyTmFtZSgpKTsKLSAgICAgICAgb3V0cHV0RmlsZU5hbWUgPSBwYWdlM0JlYW4uZ2V0T3V0cHV0RmlsZU5hbWUoKTsKLSAgICAgICAgaWYgKCFvdXRwdXRGaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikgJiYgIW91dHB1dEZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5hYXIiKSkgewotICAgICAgICAgICAgb3V0cHV0RmlsZU5hbWUgPSBvdXRwdXRGaWxlTmFtZSArICIuYWFyIjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgdGVtcEZpbGVGb2xkZXIgPSBudWxsOwotICAgICAgICBTdHJpbmcgeG1sRmlsdGVyID0gIi54bWwiOwotICAgICAgICBTdHJpbmcgd3NkbEZpbHRlciA9ICIud3NkbCI7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCVN0cmluZyBtZXRhSW5mRm9sZGVyTmFtZT0iTUVUQS1JTkYiOwotICAgICAgICAJU3RyaW5nIGxpYkZvbGRlck5hbWU9ImxpYiI7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIC8vY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgY29weSB0aGUgZmlsZXMKLSAgICAgICAgICAgIHRlbXBGaWxlRm9sZGVyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVtcCIsIi50bXAiKTsKLSAgICAgICAgICAgIHRlbXBGaWxlRm9sZGVyLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICAgICAgaWYgKHRlbXBGaWxlRm9sZGVyLmV4aXN0cygpKXtkZWxldGVEaXIodGVtcEZpbGVGb2xkZXIpO30KLSAgICAgICAgICAgIHRlbXBGaWxlRm9sZGVyLm1rZGlyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgbWV0YUluZkZvbGRlciA9IG5ldyBGaWxlKHRlbXBGaWxlRm9sZGVyLCBtZXRhSW5mRm9sZGVyTmFtZSk7Ci0gICAgICAgICAgICBtZXRhSW5mRm9sZGVyLm1rZGlyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUodGVtcEZpbGVGb2xkZXIsbGliRm9sZGVyTmFtZSk7Ci0gICAgICAgICAgICBsaWJGb2xkZXIubWtkaXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRmlsZUNvcGllciBjbGFzc0ZpbGVjb3BpZXIgPSBuZXcgRmlsZUNvcGllcigpOwotICAgICAgICAgICAgLy9jb3B5IHRoZSBjbGFzc2VzCi0gICAgICAgICAgICBjbGFzc0ZpbGVjb3BpZXIuY29weUZpbGVzKGNsYXNzRmlsZUZvbGRlciwgdGVtcEZpbGVGb2xkZXIscGFnZTFCZWFuLmdldEZpbHRlcigpKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL2NvcHkgdGhlIHNlcnZpY2UueG1sCi0gICAgICAgICAgICBGaWxlQ29waWVyIHNlcnZpY2VYTUxjb3BpZXIgPSBuZXcgRmlsZUNvcGllcigpOwotICAgICAgICAgICAgc2VydmljZVhNTGNvcGllci5jb3B5RmlsZXMoc2VydmljZUZpbGUsIG1ldGFJbmZGb2xkZXIseG1sRmlsdGVyKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL2NvcHkgdGhlIGxpYnMKLSAgICAgICAgICAgIEZpbGVDb3BpZXIgbGliQ29waWVyID0gbmV3IEZpbGVDb3BpZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDtpIDwgZmlsZUxpc3Quc2l6ZSgpO2krKyl7Ci0gICAgICAgICAgICAJbGliQ29waWVyLmNvcHlGaWxlcygoRmlsZSlmaWxlTGlzdC5nZXQoaSksbGliRm9sZGVyLG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaXNXU0RMQXZhaWxhYmxlKXsKLSAgICAgICAgICAgICAgICBuZXcgRmlsZUNvcGllcigpLmNvcHlGaWxlcyh3c2RsRmlsZSwgbWV0YUluZkZvbGRlcix3c2RsRmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vamFyIHRoZSB0ZW1wIGRpcmVjdG9yeS4gdGhlIG91dHB1dCBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkIGlmIG1pc3NpbmcKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbmV3IEphckZpbGVXcml0ZXIoKS53cml0ZUphckZpbGUob3V0cHV0Rm9sZGVyLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgdGVtcEZpbGVGb2xkZXIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZWxldGVEaXIodGVtcEZpbGVGb2xkZXIpOwotICAgICAgICAgICAgIGlmIChpc1NlcnZpY2VDcmVhdGVkKQotICAgICAgICAgICAgICAgIHNlcnZpY2VGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSAgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8vIFRoZSBkaXJlY3RvcnkgaXMgbm93IGVtcHR5IHNvIGRlbGV0ZSBpdAotICAgICAgICByZXR1cm4gZGlyLmRlbGV0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2NvbnRyb2wvUHJvY2Vzc0V4Y2VwdGlvbi5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvY29udHJvbC9Qcm9jZXNzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTQ0MTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvY29udHJvbC9Qcm9jZXNzRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmNvbnRyb2w7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgUHJvY2Vzc0V4Y2VwdGlvbigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvY2Vzc0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIoY2F1c2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm9jZXNzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvcGx1Z2luL1NlcnZpY2VBcmNoaXZlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS9wbHVnaW4vU2VydmljZUFyY2hpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1N2NmOGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS9wbHVnaW4vU2VydmljZUFyY2hpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUFyY2hpdmVyIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0gICAgLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VBcmNoaXZlciBwbHVnaW47Ci0gICAgLy9SZXNvdXJjZSBidW5kbGUuCi0gICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3Igd2l6YXJkSW1hZ2VEZXNjcmlwdG9yOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQXJjaGl2ZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9Ci0gICAgICAgICAgICAgICAgICAgIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UucmVzb3VyY2UuU2VydmljZVJlc291cmNlcyIpOwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotICAgICAgICAgICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlQXJjaGl2ZXIgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotICAgICAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFNlcnZpY2VBcmNoaXZlci5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGtleTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLSAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiByZXNvdXJjZUJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRXaXphcmRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIGlmICh3aXphcmRJbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgd2l6YXJkSW1hZ2VEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgU2VydmljZUFyY2hpdmVyLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF4aXNfU2VydmljZV9BcmNoaXZlciIsICJpY29ucy9hc2YtZmVhdGhlci5naWYiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2l6YXJkSW1hZ2VEZXNjcmlwdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTlkMjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWk7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnV0aWwuU2V0dGluZ3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2V0dGluZ3NDb25zdGFudHN7Ci0gICAgcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5nczsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzID0gZmFsc2U7Ci0gICAgCi0gICAgcHVibGljIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lKXsKLSAgICAgICAgc3VwZXIocGFnZU5hbWUrIi5uYW1lIik7Ci0gICAgICAgIGluaXQocGFnZU5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KFN0cmluZyBwYWdlTmFtZSl7Ci0gICAgICAgIHNldFRpdGxlKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZyhwYWdlTmFtZSsiLnRpdGxlIikpOwotICAgICAgICBzZXREZXNjcmlwdGlvbihTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcocGFnZU5hbWUrIi5kZXNjIikpOwotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoU2VydmljZUFyY2hpdmVyLmdldFdpemFyZEltYWdlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGFnZS4gSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBpbiB0aGUKLSAgICAgICAgICogUGx1Z2luJ3Mgc2V0dGluZ3MgZm9yIHRoaXMgT3B0aW9uc1BhZ2UsIGNyZWF0ZSBhIG5ldyBzZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgcm9vdFNldHRpbmdzID0gU2VydmljZUFyY2hpdmVyLmdldERlZmF1bHQoKQotICAgICAgICAgICAgICAgIC5nZXREaWFsb2dTZXR0aW5ncygpOwotICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHJvb3RTZXR0aW5ncy5nZXRTZWN0aW9uKHRoaXMuZ2V0Q2xhc3MoKQotICAgICAgICAgICAgICAgIC5nZXROYW1lKCkpOwotICAgICAgICBpZiAoc2VjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXR0aW5ncyA9IHJvb3RTZXR0aW5ncy5hZGROZXdTZWN0aW9uKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgcmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyA9IGZhbHNlOwotICAgICAgICAgICAgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncz10cnVlOwotICAgICAgICAgICAgc2V0dGluZ3MgPSBzZWN0aW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKG1lc3NhZ2UgPT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpOyAKLSAgICAKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBnZXRXaXphcmRDb21wbGV0ZSgpOyAKLSAgICAKLSAgICAvL0RlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBOZXh0KCl7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLy9wdWJsaWMgYWJzdHJhY3QgV2l6YXJkQmVhbiBnZXRCZWFuKCk7Ci0gICAgCi0gICAgCi0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL0NsYXNzRmlsZUxvY2F0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9DbGFzc0ZpbGVMb2NhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjNGU3OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL0NsYXNzRmlsZUxvY2F0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5DbGFzc0ZpbGVTZWxlY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENsYXNzRmlsZUxvY2F0aW9uUGFnZSBleHRlbmRzIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2V7Ci0KLSAgICBwcml2YXRlIFRleHQgY2xhc3NGaWxlTG9jYXRpb25UZXh0OwotICAgIHByaXZhdGUgQnV0dG9uIGZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94OwotICAgIAotICAgCi0gICAgcHVibGljIENsYXNzRmlsZUxvY2F0aW9uUGFnZSgpewotICAgICAgICBzdXBlcigicGFnZTEiKTsKLSAgICB9Ci0gICAKLSAgICAKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0xBU1NfRklMRV9MT0NBVElPTixTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotICAgICAgc2V0dGluZ3MucHV0KFBSRUZfRklMVEVSX0JZX0NMQVNTRVMsdHJ1ZSk7Ci0KLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnM9MzsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDk7Ci0gICAgICAgIAotICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCUxhYmVsIGxhYmxlID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0JCWxhYmxlLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMS5maWxlTG9jYXRpb25MYWJlbCIpKTsKLQkJCi0JCWNsYXNzRmlsZUxvY2F0aW9uVGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLQkJY2xhc3NGaWxlTG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZ2QpOwotCQljbGFzc0ZpbGVMb2NhdGlvblRleHQuc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9DTEFTU19GSUxFX0xPQ0FUSU9OKSk7Ci0JCWNsYXNzRmlsZUxvY2F0aW9uVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0JCSAgICAgICAgaGFuZGxlTW9kaWZ5KCk7Ci0JCSAgICB9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLmJyb3dzZSIpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotCQkgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJICAgICAgICBoYW5kbGVCcm93c2UoKTsKLQkJICAgIH0gCi0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmaWx0ZXJCeUNsYXNzRmlsZXNDaGVja0JveCA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5DSEVDSyk7Ci0JCWZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQlmaWx0ZXJCeUNsYXNzRmlsZXNDaGVja0JveC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZmlsdGVyLmNhcHRpb24iKSk7Ci0JCWZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94LnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfRklMVEVSX0JZX0NMQVNTRVMpKTsKLQkJZmlsdGVyQnlDbGFzc0ZpbGVzQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLQkJICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9GSUxURVJfQllfQ0xBU1NFUyxmaWx0ZXJCeUNsYXNzRmlsZXNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCSAgICB9Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fQotCQl9KTsKLQkJCi0JCQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCS8vY2FsbCB0aGUgaGFuZGxlIG1vZGlmeSBtZXRob2QgaWYgdGhlIHNldHR0aW5ncyBhcmUgcmVzdG9yZWQKLQkJCi0JCWlmIChyZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzKXsKLQkJICAgIGhhbmRsZU1vZGlmeSgpOwotCQl9Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2UoKXsKLSAgICAgICBEaXJlY3RvcnlEaWFsb2cgZGlyRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotICAgICAgIGRpckRpYWxvZy5zZXRNZXNzYWdlKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZmlsZWRpYWxvZ1RpdGxlIikpOwotICAgICAgIFN0cmluZyByZXR1cm5UZXh0ID0gZGlyRGlhbG9nLm9wZW4oKTsKLSAgICAgICBpZiAocmV0dXJuVGV4dCE9bnVsbCl7Ci0gICAgICAgICAgIHRoaXMuY2xhc3NGaWxlTG9jYXRpb25UZXh0LnNldFRleHQocmV0dXJuVGV4dCk7Ci0gICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZ5KCl7Ci0gICAgICAgIFN0cmluZyBjbGFzc0xvY2F0aW9uVGV4dCA9IHRoaXMuY2xhc3NGaWxlTG9jYXRpb25UZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NMQVNTX0ZJTEVfTE9DQVRJT04sY2xhc3NMb2NhdGlvblRleHQpOwotICAgICAgICAvL3VwZGF0ZSB0aGUgd2l6YXJkCi0gICAgICAgICgoU2VydmljZUFyY2hpdmVXaXphcmQpdGhpcy5nZXRXaXphcmQoKSkuc2V0Q2xhc3NGaWxlTG9jYXRpb24oY2xhc3NMb2NhdGlvblRleHQpOwotICAgICAgICAKLSAgICAgICAgaWYgKCIiLmVxdWFscyhjbGFzc0xvY2F0aW9uVGV4dCkpewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTEuZXJyb3IuZmlsZW1pc3NpbmciKSk7Ci0gICAgICAgIH1lbHNleyAgICAKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzRmlsZUxvY2F0aW9uKCl7Ci0gICAgICAgIHJldHVybiBjbGFzc0ZpbGVMb2NhdGlvblRleHQuZ2V0VGV4dCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiBnZXRCZWFuKCl7Ci0gICAgICAgIENsYXNzRmlsZVNlbGVjdGlvbkJlYW4gcGFnZUJlYW4gPSBuZXcgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbigpOwotICAgICAgICBwYWdlQmVhbi5zZXRGaWxlTG9jYXRpb24odGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHQuZ2V0VGV4dCgpKTsKLSAgICAgICAgaWYgKGZpbHRlckJ5Q2xhc3NGaWxlc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLSAgICAgICAgICAgIHBhZ2VCZWFuLnNldEZpbHRlcigiLmNsYXNzIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhZ2VCZWFuOwotICAgIH0KLQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRXaXphcmRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvTGlicmFyeUFkZGluZ1BhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvTGlicmFyeUFkZGluZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkM2Q4Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL0xpYnJhcnlBZGRpbmdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLkxpYnJhcnlTZWxlY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIExpYnJhcnlBZGRpbmdQYWdlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBMYWJlbCBsaWJyYXJ5TmFtZUxhYmVsOwotICAgIHByaXZhdGUgVGV4dCBsaWJyYXJ5TmFtZVRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0gICAgcHJpdmF0ZSBMaXN0IGphckZpbGVMaXN0OwotICAgIHByaXZhdGUgTGFiZWwgamFyRmlsZWNvdW50TGFiZWw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIExpYnJhcnlBZGRpbmdQYWdlKCkgewotICAgICAgICBzdXBlcigicGFnZTYiKTsKLSAgICAgICAKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpLkFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UjaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9MSUJfTElCTkFNRVMsbmV3IFN0cmluZ1tde30pOy8vcHV0IGFuIGVtcHR5IGFycmF5Ci0KLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubnVtQ29sdW1ucz0zOwotICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgIAotCQkKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPTM7Ci0gICAgICAgIGxpYnJhcnlOYW1lVGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLSAgICAgICAgbGlicmFyeU5hbWVUZXh0LnNldExheW91dERhdGEoZ2QpOwotICAgICAgIAotICAgICAgICBsaWJyYXJ5TmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkgICAgLy9oYW5kbGVNb2RpZnkoKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotICAgICAgICAKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5icm93c2UiKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCSAgICAgICAgaGFuZGxlQnJvd3NlKCk7Ci0JCSAgICB9Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULlBVU0gpOwotCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYuYWRkIikpOwotCQlhZGRCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkgICAgICAgIGhhbmRsZUFkZCgpOwotCQkgICAgfQotCi0gICAgICAgICAgIAotCQl9KTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LnJlbW92ZSIpKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotCQkgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJICAgICAgICBoYW5kbGVSZW1vdmUoKTsKLQkJICAgIH0KLQotICAgICAgICAgICAKLQkJfSk7Ci0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCUxhYmVsIGR1bW15TGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OT05FKTsKLQkJZHVtbXlMYWJlbC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYubGlibGlzdC5jYXB0aW9uIikpOwotCQlkdW1teUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlnZC52ZXJ0aWNhbFNwYW4gPSA1OwotCQkKLQkJamFyRmlsZUxpc3QgPSBuZXcgTGlzdChjb250YWluZXIsU1dULkJPUkRFUnxTV1QuVl9TQ1JPTEwpOwotCQlqYXJGaWxlTGlzdC5zZXRJdGVtcyhzZXR0aW5ncy5nZXRBcnJheShQUkVGX0xJQl9MSUJOQU1FUykpOwotCQlqYXJGaWxlTGlzdC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCQotCQkvLyBMYWJlbCBmb3IgdGhlIGNvdW50Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJamFyRmlsZWNvdW50TGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OT05FKTsKLQkJamFyRmlsZWNvdW50TGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlKCl7Ci0gICAgICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0gICAgICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW117IiouamFyIn0pOwotICAgICAgICBTdHJpbmcgcmV0dXJuRmlsZU5hbWUgPSBmaWxlRGlhbG9nLm9wZW4oKSA7Ci0gICAgICAgIGlmIChyZXR1cm5GaWxlTmFtZSE9bnVsbCl7Ci0gICAgICAgICAgICB0aGlzLmxpYnJhcnlOYW1lVGV4dC5zZXRUZXh0KHJldHVybkZpbGVOYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkKCkgewotICAgICAgICBTdHJpbmcgbGliTmFtZSA9IGxpYnJhcnlOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBpZiAoIWxpYk5hbWUuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAvL2FkZCB0aGUgbGlicyB0byB0aGUgbGlzdAotICAgICAgICAgICAgamFyRmlsZUxpc3QuYWRkKGxpYk5hbWUpOwotICAgICAgICAgICAgdXBkYXRlTGlzdCgpOwotICAgICAgICAgICAgbGlicmFyeU5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmUoKSB7Ci0gICAgICAgIGludCBzZWxlY3RlZEluZGV4ID0gamFyRmlsZUxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgLy8tMSBpcyByZXR1cm5lZCB3aGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXghPS0xKXsKLSAgICAgICAgICAgamFyRmlsZUxpc3QucmVtb3ZlKHNlbGVjdGVkSW5kZXgpOwotICAgICAgICAgICB1cGRhdGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpc3QoKXsKLSAgICAgICAgamFyRmlsZWNvdW50TGFiZWwuc2V0VGV4dChqYXJGaWxlTGlzdC5nZXRJdGVtQ291bnQoKSArICIgIiArIFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYubGlibGlzdC5jb3VudC5jYXB0aW9uIikpOwotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9MSUJfTElCTkFNRVMsamFyRmlsZUxpc3QuZ2V0SXRlbXMoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaWJyYXJ5U2VsZWN0aW9uQmVhbiBnZXRCZWFuKCl7Ci0gICAgICAgIExpYnJhcnlTZWxlY3Rpb25CZWFuIGJlYW4gPSBuZXcgTGlicmFyeVNlbGVjdGlvbkJlYW4oKTsKLSAgICAgICAgYmVhbi5zZXRGaWxlTGlzdChqYXJGaWxlTGlzdC5nZXRJdGVtcygpKTsKLSAgICAgICAgcmV0dXJuIGJlYW47Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFiYzliLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0gLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gIHBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotIGltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLlBhZ2UzQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnBsdWdpbi5TZXJ2aWNlQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLSBwdWJsaWMgY2xhc3MgU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlIHsKLQotICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KQVJfTkFNRSA9ICJteV9zZXJ2aWNlIjsKLSAgICAgcHJpdmF0ZSBUZXh0IG91dHB1dEZpbGVMb2NhdGlvblRleHRCb3g7Ci0gICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLSAgICAgcHJpdmF0ZSBUZXh0IG91dHB1dEZpbGVOYW1lVGV4dGJveDsKLSAgICAgcHJpdmF0ZSBib29sZWFuIGlzV2l6YXJkQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgCi0gICAgIHB1YmxpYyBTZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZSgpewotICAgICAgICAgc3VwZXIoInBhZ2U0Iik7Ci0gICAgIH0KLSAgICAgCi0gICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTE9DQVRJT04sU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKLSAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfT1VUUFVUX05BTUUsREVGQVVMVF9KQVJfTkFNRSk7Ci0KLSAgICB9Ci0gICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgIGxheW91dC5udW1Db2x1bW5zPTM7Ci0gICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgICAKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgICAKLSAJCUxhYmVsIGxhYmxlID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gCQlsYWJsZS5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQub3V0cHV0bG9jYXRpb24ubGFiZWwiKSk7Ci0gCQkKLSAJCW91dHB1dEZpbGVMb2NhdGlvblRleHRCb3ggPSBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUik7Ci0gCQlvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LnNldExheW91dERhdGEoZ2QpOwotIAkJb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KCIiKTsKLSAJCW91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0gCQkgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLSAJCSAgICAgICAgaGFuZGxlTG9jYXRpb25Nb2RpZmljYXRpb24oKTsKLSAJCSAgICB9Ci0gCQl9KTsKLSAJCQotIAkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotIAkJCQkKLSAJCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5QVVNIKTsKLSAJCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5icm93c2UiKSk7Ci0gCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gCQlicm93c2VCdXR0b24uYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCl7Ci0gCQkgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLSAJCSAgICAgICAgaGFuZGxlQnJvd3NlKCk7Ci0gCQkgICAgfSAKLSAJCX0pOwotIAkJCi0gCQlsYWJsZSA9IG5ldyBMYWJlbChjb250YWluZXIsU1dULk5VTEwpOwotIAkJbGFibGUuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0Lm91dHB1dG5hbWUubGFiZWwiKSk7Ci0gCQkKLSAJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gCQkKLSAJCW91dHB1dEZpbGVOYW1lVGV4dGJveCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLSAJCW91dHB1dEZpbGVOYW1lVGV4dGJveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAJCW91dHB1dEZpbGVOYW1lVGV4dGJveC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX09VVFBVVF9OQU1FKSk7Ci0gCQlvdXRwdXRGaWxlTmFtZVRleHRib3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0gCQkgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLSAJCSAgICAgICAgaGFuZGxlRmlsZU5hbWVNb2RpZmljYXRpb24oKTsKLSAJCSAgICB9Ci0gICAgICAgIH0pOwotIAkJCi0gCQkvL0FkZCBzb21lIGZpbGwgbGFibGVzIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gCQlMYWJlbCBmaWxsTGFibGUgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAJCWZpbGxMYWJsZS5zZXRUZXh0KCIiKTsKLSAJCWZpbGxMYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAJCUxhYmVsIGZpbGxMYWJsZTEgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAJCWZpbGxMYWJsZTEuc2V0VGV4dCgiIik7Ci0gCQlmaWxsTGFibGUxLnNldExheW91dERhdGEoZ2QpOwotIAkJCi0gICAgICAgIC8vSGludCBMYWJsZQotIAkJTGFiZWwgaGludExhYmxlID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gCQloaW50TGFibGUuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmhpbnQuY2FwdGlvbiIpKTsKLSAJCWhpbnRMYWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAJCQotICAgICAgICBpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncykgewotICAgICAgICAgICAgaGFuZGxlRmlsZU5hbWVNb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uTW9kaWZpY2F0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvL25vdGhpbmcgeWV0Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLSAgICB9Ci0gICAgIAotICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlKCl7Ci0gICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZGlyRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotICAgICAgICAgZGlyRGlhbG9nLnNldE1lc3NhZ2UoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5kaXJkaWFsb2cuY2FwdGlvbiIpKTsKLSAgICAgICAgIFN0cmluZyByZXR1cm5UZXh0ID0gZGlyRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgIGlmIChyZXR1cm5UZXh0IT1udWxsKXsKLSAgICAgICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guc2V0VGV4dChyZXR1cm5UZXh0KTsKLSAgICAgICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guc2V0VG9vbFRpcFRleHQocmV0dXJuVGV4dCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgIAotICAgICBwcml2YXRlIHZvaWQgaGFuZGxlTG9jYXRpb25Nb2RpZmljYXRpb24oKXsKLSAgICAgICAgIFN0cmluZyBvdXRwdXRMb2NhdGlvblRleHQgPSBvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LmdldFRleHQoKTsKLSAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX09VVFBVVF9MT0NBVElPTixvdXRwdXRMb2NhdGlvblRleHQpOwotICAgICAgICAgaWYgKG91dHB1dExvY2F0aW9uVGV4dD09bnVsbCB8fCIiLmVxdWFscyhvdXRwdXRMb2NhdGlvblRleHQudHJpbSgpKSl7Ci0gICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNC5lcnJvci5sb2NhdGlvbiIpKTsKLSAgICAgICAgICAgICBpc1dpemFyZENvbXBsZXRlPWZhbHNlOwotICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgIFN0cmluZyBvdXRwdXRGaWxlbmFtZVRleHQgPSBvdXRwdXRGaWxlTmFtZVRleHRib3guZ2V0VGV4dCgpOwotICAgICAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX09VVFBVVF9OQU1FLG91dHB1dEZpbGVuYW1lVGV4dCk7Ci0gICAgICAgIAkgaWYgKG91dHB1dEZpbGVuYW1lVGV4dD09bnVsbCB8fCAiIi5lcXVhbHMob3V0cHV0RmlsZW5hbWVUZXh0LnRyaW0oKSkpewotICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U0LmVycm9yLmZpbGVuYW1lIikpOwotICAgICAgICAgICAgICAgICBpc1dpemFyZENvbXBsZXRlPWZhbHNlOwotICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgIAkgfWVsc2V7Ci0gICAgICAgIAkJIGlzV2l6YXJkQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAJCSB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgIAkgfQotICAgICAgICAgfQotICAgICB9Ci0gICAgIHByaXZhdGUgdm9pZCBoYW5kbGVGaWxlTmFtZU1vZGlmaWNhdGlvbigpewotICAgICAgICAgU3RyaW5nIG91dHB1dEZpbGVuYW1lVGV4dCA9IG91dHB1dEZpbGVOYW1lVGV4dGJveC5nZXRUZXh0KCk7Ci0gICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9PVVRQVVRfTkFNRSxvdXRwdXRGaWxlbmFtZVRleHQpOwotICAgICAgICAgaWYgKG91dHB1dEZpbGVuYW1lVGV4dD09bnVsbCB8fCAiIi5lcXVhbHMob3V0cHV0RmlsZW5hbWVUZXh0LnRyaW0oKSkpewotICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQuZXJyb3IuZmlsZW5hbWUiKSk7Ci0gICAgICAgICAgICAgaXNXaXphcmRDb21wbGV0ZT1mYWxzZTsKLSAgICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0TG9jYXRpb25UZXh0ID0gb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfT1VUUFVUX0xPQ0FUSU9OLG91dHB1dExvY2F0aW9uVGV4dCk7Ci0gICAgICAgICAgICAgaWYgKG91dHB1dExvY2F0aW9uVGV4dD09bnVsbCB8fCIiLmVxdWFscyhvdXRwdXRMb2NhdGlvblRleHQudHJpbSgpKSl7Ci0gICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTQuZXJyb3IubG9jYXRpb24iKSk7Ci0gICAgICAgICAgICAgICAgIGlzV2l6YXJkQ29tcGxldGU9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIAkgaXNXaXphcmRDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAJIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSAgICAgCi0gICAgIAotICAgICAKLSAgICAgcHVibGljIFBhZ2UzQmVhbiBnZXRCZWFuKCl7Ci0gICAgICAgICBQYWdlM0JlYW4gcGFnZUJlYW4gPSBuZXcgUGFnZTNCZWFuKCk7Ci0gICAgICAgICBwYWdlQmVhbi5zZXRPdXRwdXRGb2xkZXJOYW1lKHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgIHBhZ2VCZWFuLnNldE91dHB1dEZpbGVOYW1lKHRoaXMub3V0cHV0RmlsZU5hbWVUZXh0Ym94LmdldFRleHQoKS50cmltKCkpOwotICAgICAgICAgcmV0dXJuIHBhZ2VCZWFuOwotICAgICB9Ci0gICAgIAotIAlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRXaXphcmRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGlzV2l6YXJkQ29tcGxldGU7Ci0JfQotIH0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZUFyY2hpdmVXaXphcmQuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvU2VydmljZUFyY2hpdmVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2MTIzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VBcmNoaXZlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLldpemFyZEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuY29udHJvbC5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlQXJjaGl2ZVdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0KLQlwcml2YXRlIENsYXNzRmlsZUxvY2F0aW9uUGFnZSBjbGFzc0ZpbGVMb2NhdGlvblBhZ2U7Ci0gICAgcHJpdmF0ZSBXU0RMRmlsZVNlbGVjdGlvblBhZ2Ugd3NkbEZpbGVTZWxlY3Rpb25QYWdlOwotICAgIHByaXZhdGUgU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlIHNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZTsKLSAgICBwcml2YXRlIFNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZSBzZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2U7Ci0gICAgcHJpdmF0ZSBTZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZSBzZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZTsKLSAgICBwcml2YXRlIExpYnJhcnlBZGRpbmdQYWdlIGxpYlBhZ2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlU2VydmljZUdlbmVyYXRpb25TdGF0dXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NGaWxlTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzOwotICAgIAotICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzZGxGaWxlR2VuZXJhdGlvblN0YXR1cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxGaWxlR2VuZXJhdGlvblN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxGaWxlR2VuZXJhdGlvblN0YXR1czsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHdzZGxGaWxlR2VuZXJhdGlvblN0YXR1cyB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdXBkYXRlV3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzID0gbWVzc2FnZTsKLSAgICB9Ci0gICAgcHVibGljICBTdHJpbmcgZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKXsKLSAgICAgICAgcmV0dXJuIGNsYXNzRmlsZUxvY2F0aW9uOwotICAgIH0KLSAgICAKLSAgICAvL2dldCB0aGUgbGliIGZpbGUgbGlzdAotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMaWJGaWxlTGlzdCgpewotICAgICAgICByZXR1cm4gbGliUGFnZS5nZXRCZWFuKCkuZ2V0RmlsZUxpc3QoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljICB2b2lkIHNldENsYXNzRmlsZUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbil7Ci0gICAgICAgIHRoaXMuY2xhc3NGaWxlTG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU2VydmljZVhNTEdlbmVyYXRpb24oYm9vbGVhbiBzdGF0dXMpewotICAgICAgICBzZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2Uuc2V0UGFnZUNvbXBsZXRlKHN0YXR1cyk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlQXJjaGl2ZVdpemFyZCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygibWFpbi50aXRsZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0gICAgICAgIElXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotICAgICAgICBBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB3aXphcmRQYWdlID0gKEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UpIHBhZ2VzW2ldOwotICAgICAgICAgICAgaWYgKHdpemFyZFBhZ2UuZ2V0TmFtZSgpLmVxdWFscygicGFnZTQubmFtZSIpKXsKLQkgICAgICAgICAgICBpZiAoIXdpemFyZFBhZ2UuZ2V0V2l6YXJkQ29tcGxldGUoKSApIHsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0TmV4dFBhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQotICAgICAqLwotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UgdGhpc1BhZ2UgPSAoQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSlwYWdlOwotICAgICAgICBBYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlIG5leHRQYWdlID0gKEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2Upc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0gICAgICAgIHdoaWxlICh0aGlzUGFnZSE9bnVsbCAmJiB0aGlzUGFnZS5pc1NraXBOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChuZXh0UGFnZSE9bnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXNQYWdlID0gbmV4dFBhZ2U7Ci0gICAgICAgICAgICAgICAgbmV4dFBhZ2UgPSAoQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSlzdXBlci5nZXROZXh0UGFnZShuZXh0UGFnZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV4dFBhZ2U7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBjbGFzc0ZpbGVMb2NhdGlvblBhZ2UgPSBuZXcgQ2xhc3NGaWxlTG9jYXRpb25QYWdlKCk7Ci0gICAgICAgIHRoaXMuYWRkUGFnZShjbGFzc0ZpbGVMb2NhdGlvblBhZ2UpOwotICAgICAgICB3c2RsRmlsZVNlbGVjdGlvblBhZ2UgPSBuZXcgV1NETEZpbGVTZWxlY3Rpb25QYWdlKCk7Ci0gICAgICAgIHRoaXMuYWRkUGFnZSh3c2RsRmlsZVNlbGVjdGlvblBhZ2UpOwotICAgICAgICBsaWJQYWdlID0gbmV3IExpYnJhcnlBZGRpbmdQYWdlKCk7Ci0gICAgICAgIHRoaXMuYWRkUGFnZShsaWJQYWdlKTsKLSAgICAgICAgc2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlID0gbmV3IFNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZSgpOwotICAgICAgICB0aGlzLmFkZFBhZ2Uoc2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlKTsKLSAgICAgICAgc2VydmljZVhNTEdlbmVyYXRpb25QYWdlID0gbmV3IFNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZSgpOwotICAgICAgICB0aGlzLmFkZFBhZ2Uoc2VydmljZVhNTEdlbmVyYXRpb25QYWdlKTsKLSAgICAgICAgc2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UgPSBuZXcgU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UoKTsKLSAgICAgICAgdGhpcy5hZGRQYWdlKHNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2JjKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uICwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb257Ci0gICAgICAgICAgICAgIGlmIChtb25pdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0gICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAqICI3IiBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHN0ZXBzLCBzZWUgYmVsb3cgbW9uaXRvci53b3JrZWQoYW1vdW50KQotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJ3aXphcmQuY29kZWdlbi5zdGFydG1zZyIpLCA4KTsKLQotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMSk7Ci0gICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSB3aXphcmQgYmVhbgotICAgICAgICAgICAgICAgICAgV2l6YXJkQmVhbiB3aXpCZWFuID0gbmV3IFdpemFyZEJlYW4oKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgd2l6QmVhbi5zZXRQYWdlMWJlYW4oY2xhc3NGaWxlTG9jYXRpb25QYWdlLmdldEJlYW4oKSk7Ci0gICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgIHdpekJlYW4uc2V0V3NkbEJlYW4od3NkbEZpbGVTZWxlY3Rpb25QYWdlLmdldEJlYW4oKSk7Ci0gICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgIHdpekJlYW4uc2V0UGFnZTJiZWFuKHNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5nZXRCZWFuKHNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZS5nZXRCZWFuKCkpKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICAgICAgd2l6QmVhbi5zZXRMaWJyYXJ5QmVhbihsaWJQYWdlLmdldEJlYW4oKSk7Ci0gICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgIHdpekJlYW4uc2V0UGFnZTNiZWFuKHNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlLmdldEJlYW4oKSk7Ci0gICAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKLSAgICAgICAgICAgICAgICAgIG5ldyBDb250cm9sbGVyKCkucHJvY2Vzcyh3aXpCZWFuKTsKLSAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKDEpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkgKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICAvKgotICAgICAgICAgKiBTdGFydCB0aGUgZ2VuZXJhdGlvbiBhcyBuZXcgV29ya2JlbmNoIE9wZXJhdGlvbiwgc28gdGhlIHVzZXIKLSAgICAgICAgICogY2FuIHNlZSB0aGUgcHJvZ3Jlc3MgYW5kLCBpZiBuZWVkZWQsIGNhbiBzdG9wIHRoZSBvcGVyYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLSAgICAgICAgICAgc2hvd1N1Y2Nlc3NNZXNzYWdlKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygid2l6YXJkLmNvZGVnZW4uc3VjY2VzcyIpKTsKLSAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoZTEuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoZTEuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJ3aXphcmQuY29kZWdlbi51bmtub3duLmVycm9yIikgKyAiICAiKyAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0Vycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih0aGlzLmdldFNoZWxsKCksIFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygid2l6YXJkLmNvZGVnZW4uZXJyb3IubXNnLmhlYWRpbmciKSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dTdWNjZXNzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbih0aGlzLmdldFNoZWxsKCksIFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygid2l6YXJkLmNvZGVnZW4uc3VjY2Vzcy5tc2cuaGVhZGluZyIpLCBtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxN2FhNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uUGFnZTJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbC5TZXJ2aWNlUGx1Z2luVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZSBleHRlbmRzIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UgewotICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTX1hNTF9OQU1FID0gIioueG1sIjsKLSAgICBwcml2YXRlIFRleHQgc2VydmljZVhNTFRleHQ7Ci0gICAgcHJpdmF0ZSBMYWJlbCBtYW51YWxTZWxlY3Rpb25MYWJlbDsKLSAgICBwcml2YXRlIExhYmVsIHJlY29tbWVuZGF0aW9uVGV4dExhYmxlOwotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveDsKLSAgICAKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcE5leHRQYWdlPXRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBhZ2VDb21wbGV0ZTsKLSAgICAKLSAgICBwdWJsaWMgU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlKCl7Ci0gICAgICAgIHN1cGVyKCJwYWdlMiIpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5lY2xpcHNlLnVpLkFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UjaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRTZXR0aW5ncygpIHsKLSAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9TRVJWSUNFX1hNTF9GSUxFLCIiKTsKLSAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19BVVRPX0dFTl9TRVJWSUNFX1hNTCxmYWxzZSk7Ci0KLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnM9MzsKLSAgICAgICAgY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotICAgICAgICAgICAgICAgCi0gICAgICAgIG1hbnVhbFNlbGVjdGlvbkxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gICAgICAgIG1hbnVhbFNlbGVjdGlvbkxhYmVsLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5zZWxlY3RzZXJ2aWNleG1sLmNhcHRpb24iKSk7Ci0JCQotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlzZXJ2aWNlWE1MVGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLQkJc2VydmljZVhNTFRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlcnZpY2VYTUxUZXh0LnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfU0VSVklDRV9YTUxfRklMRSkpOwotCQlzZXJ2aWNlWE1MVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0JCSAgICBoYW5kbGVNb2RpZnkoKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygiZ2VuZXJhbC5icm93c2UiKSk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKXsKLQkJICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCSAgICAgICAgaGFuZGxlQnJvd3NlKCk7Ci0JCSAgICB9Ci0JCX0pOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveCA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5DSEVDSyk7Ci0JCXNlbGVjdEF1dG9GaWxlR2VuZXJhdGlvbkNoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotCQlzZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTIuZ2VuZXJhdGVhdXRvLmNhcHRpb24iKSk7Ci0JCXNlbGVjdEF1dG9GaWxlR2VuZXJhdGlvbkNoZWNrQm94LnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfQVVUT19HRU5fU0VSVklDRV9YTUwpKTsKLQkJc2VsZWN0QXV0b0ZpbGVHZW5lcmF0aW9uQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLQkJICAgICAgICBoYW5kbGVTZWxlY3Rpb24oKTsKLQkJICAgIH0KLQkJICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXt9Ci0JCX0pOwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvL2VuYWJsZSB0aGUgc2VsZWN0aW9uIGNvbWJvIGZvciBub3cKLQkJLy9zZWxlY3RBdXRvRmlsZUdlbmVyYXRpb25DaGVja0JveC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0QXV0b0ZpbGVHZW5lcmF0aW9uQ2hlY2tCb3guc2V0VG9vbFRpcFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5hdXRvZ2VuLnRvb2x0aXAiKSk7Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLnZlcnRpY2FsU3BhbiAgPTI7Ci0JCXJlY29tbWVuZGF0aW9uVGV4dExhYmxlID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0JCXJlY29tbWVuZGF0aW9uVGV4dExhYmxlLnNldExheW91dERhdGEoZ2QpOwotCQkvL3JlY29tbWVuZGF0aW9uVGV4dExhYmxlLnNldEZvcmVncm91bmQoKSkpOwotCQkKLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQkKLQkJaWYgKHJlc3RvcmVkRnJvbVByZXZpb3VzU2V0dGluZ3MpewotCQkgICAgaGFuZGxlTW9kaWZ5KCk7Ci0JCSAgICBoYW5kbGVTZWxlY3Rpb24oKTsKLQkJfWVsc2V7Ci0JCSAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkgICAgdXBkYXRlR2VuZXJhdGlvblBhZ2UoZmFsc2UpOwotCQl9Ci0JCQotCQkKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZSgpewotICAgICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotICAgICAgICBmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tde1NFUlZJQ0VTX1hNTF9OQU1FfSk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5GaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpIDsKLSAgICAgICAgaWYgKHJldHVybkZpbGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgIHRoaXMuc2VydmljZVhNTFRleHQuc2V0VGV4dChyZXR1cm5GaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGlvbigpewotICAgICAgICBib29sZWFuIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0QXV0b0ZpbGVHZW5lcmF0aW9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX0FVVE9fR0VOX1NFUlZJQ0VfWE1MLHNlbGVjdGlvbik7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24pewotICAgICAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGZhbHNlKTsgCi0gICAgICAgICAgICB0aGlzLnNraXBOZXh0UGFnZSA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICAgdXBkYXRlR2VuZXJhdGlvblBhZ2UoZmFsc2UpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGNoYW5nZU1hbnVhbFNlbGVjdGlvblN0YXR1cyh0cnVlKTsKLSAgICAgICAgICAgIHRoaXMuc2tpcE5leHRQYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIGhhbmRsZU1vZGlmeSgpOwotICAgICAgICAgICAgdXBkYXRlR2VuZXJhdGlvblBhZ2UodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUdlbmVyYXRpb25QYWdlKGJvb2xlYW4gc3RhdHVzKXsKLSAgICAgICAgU2VydmljZUFyY2hpdmVXaXphcmQgd2l6YXJkID0gKFNlcnZpY2VBcmNoaXZlV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCk7Ci0gICAgICAgIHdpemFyZC51cGRhdGVTZXJ2aWNlWE1MR2VuZXJhdGlvbihzdGF0dXMpOwotICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGJvb2xlYW4gc3RhdGUpewotICAgICAgICB0aGlzLnNlcnZpY2VYTUxUZXh0LnNldEVuYWJsZWQoc3RhdGUpOwotICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICAgICAgdGhpcy5tYW51YWxTZWxlY3Rpb25MYWJlbC5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1vZGlmeSgpewotICAgICAgICBTdHJpbmcgc2VydmljZVhNTFN0cmluZyA9c2VydmljZVhNTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsgCi0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfWE1MX0ZJTEUsc2VydmljZVhNTFN0cmluZyk7Ci0gICAgICAgIGlmIChzZXJ2aWNlWE1MU3RyaW5nLmVxdWFscygiIikpewotICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLmVycm9yLnNlcnZpY2VuYW1lZW1wdHkiKSk7Ci0gICAgICAgIH1lbHNlIGlmICghKG5ldyBGaWxlKHNlcnZpY2VYTUxTdHJpbmcpKS5leGlzdHMoKSl7Ci0gICAgICAgIAl0aGlzLnVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UyLmVycm9yLnNlcnZpY2Vub3RleGlzdCIpKTsKLSAgICAgICAgfWVsc2UgaWYoIVNlcnZpY2VQbHVnaW5VdGlscy5pc1NlcnZpY2VzWE1MVmFsaWQoc2VydmljZVhNTFN0cmluZykpewotICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMi5lcnJvci5zZXJ2aWNlc2VsZWN0ZWRpbnZhbGlkIikpOyAgCi0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUmVjb21tZW5kYXRpb24oU3RyaW5nIG1lc3NhZ2UpewotICAgICAgICBpZiAocmVjb21tZW5kYXRpb25UZXh0TGFibGUhPW51bGwpCi0gICAgICAgIHJlY29tbWVuZGF0aW9uVGV4dExhYmxlLnNldFRleHQobWVzc2FnZSk7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aS5BYnN0cmFjdFNlcnZpY2VXaXphcmRQYWdlI2lzU2tpcE5leHQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcE5leHQoKSB7Ci0gICAgICAgcmV0dXJuIHRoaXMuc2tpcE5leHRQYWdlOwotICAgIH0KLSAgICBwdWJsaWMgUGFnZTJCZWFuIGdldEJlYW4oKXsKLSAgICAgICAgUGFnZTJCZWFuIHBhZ2VCZWFuID0gbmV3IFBhZ2UyQmVhbigpOwotICAgICAgICBwYWdlQmVhbi5zZXRNYW51YWwoIXRoaXMuc2VsZWN0QXV0b0ZpbGVHZW5lcmF0aW9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBwYWdlQmVhbi5zZXRNYW51YWxGaWxlTmFtZSh0aGlzLnNlcnZpY2VYTUxUZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIHJldHVybiBwYWdlQmVhbjsKLSAgICB9Ci0gICAgCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0V2l6YXJkQ29tcGxldGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9TZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0ZWZiOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3VpL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uUGFnZTJCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZSBleHRlbmRzIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2V7Ci0gICAgCi0gICAgcHJpdmF0ZSBUZXh0IGNsYXNzTmFtZVRleHRCb3g7Ci0gICAgcHJpdmF0ZSBUZXh0IHNlcnZpY2VOYW1lVGV4dEJveDsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveDsKLSAgICBCdXR0b24gbG9hZEJ1dHRvbjsKLSAgICBwcml2YXRlIFRhYmxlIHRhYmxlOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBTZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2UoKXsKLSAgICAgICAgc3VwZXIoInBhZ2UzIik7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgc2V0dGluZ3MucHV0KFBSRUZfU0VSVklDRV9HRU5fU0VSVklDRV9OQU1FLCJNeVNlcnZpY2UiKTsKLSAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfR0VOX0NMQVNTTkFNRSwiIik7Ci0gICAgICBzZXR0aW5ncy5wdXQoUFJFRl9TRVJWSUNFX0dFTl9MT0FEX0FMTCxmYWxzZSk7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zPTM7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5zZXJ2aWNlbmFtZS5sYWJsZSIpKTsKLSAgICAgICAgCi0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc2VydmljZU5hbWVUZXh0Qm94ID0gbmV3IFRleHQoY29udGFpbmVyLFNXVC5CT1JERVIpOwotICAgICAgICBzZXJ2aWNlTmFtZVRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHNlcnZpY2VOYW1lVGV4dEJveC5zZXRUb29sVGlwVGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLnNlcnZpY2VuYW1lLnRvb2x0aXAiKSk7Ci0gICAgICAgIHNlcnZpY2VOYW1lVGV4dEJveC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX1NFUlZJQ0VfR0VOX1NFUlZJQ0VfTkFNRSkpOwotICAgICAgICBzZXJ2aWNlTmFtZVRleHRCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotICAgICAgICAgICAgICAgIHVwZGF0ZURpcnR5U3RhdHVzKHRydWUpOwotICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfR0VOX1NFUlZJQ0VfTkFNRSxzZXJ2aWNlTmFtZVRleHRCb3guZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAvL3ZhbGlkYXRlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgIAotICAgICAgICAKLSAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmNsYXNzbmFtZS5sYWJsZSIpKTsKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGNsYXNzTmFtZVRleHRCb3ggPSBuZXcgVGV4dChjb250YWluZXIsU1dULkJPUkRFUik7Ci0gICAgICAgIGNsYXNzTmFtZVRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGNsYXNzTmFtZVRleHRCb3guc2V0VG9vbFRpcFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5jbGFzc25hbWUudG9vbHRpcCIpKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveC5zZXRUZXh0KHNldHRpbmdzLmdldChQUkVGX1NFUlZJQ0VfR0VOX0NMQVNTTkFNRSkpOwotICAgICAgICBjbGFzc05hbWVUZXh0Qm94LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKXsKLSAgICAgICAgICAgICAgICB1cGRhdGVEaXJ0eVN0YXR1cyh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9TRVJWSUNFX0dFTl9DTEFTU05BTUUsY2xhc3NOYW1lVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxvYWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuUFVTSCk7Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLmxvYWRidXR0b24ubGFibGUiKSk7Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGxvYWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLSAgICAgICAgICAgICAgICB1cGRhdGVUYWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpe30KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIAotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveCA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5DSEVDSyk7Ci0gICAgICAgIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZGVjbGFyZWQubGFibGUiKSk7Ci0gICAgICAgIHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlydHlTdGF0dXModHJ1ZSk7Ly9kaXJ0eQotICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1NFUlZJQ0VfR0VOX0xPQURfQUxMLHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBpZih0YWJsZS5pc1Zpc2libGUoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpe30gCi0gICAgICAgIH0pOwotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveC5zZXRTZWxlY3Rpb24oc2V0dGluZ3MuZ2V0Qm9vbGVhbihQUkVGX1NFUlZJQ0VfR0VOX0xPQURfQUxMKSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdkLnZlcnRpY2FsU3BhbiA9IDU7Ci0gICAgICAgIAotICAgICAgICB0YWJsZSA9IG5ldyBUYWJsZShjb250YWluZXIsU1dULlNJTkdMRXxTV1QuRlVMTF9TRUxFQ1RJT058U1dULkNIRUNLKTsKLSAgICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4odGFibGUsMjAsIiIpOwotICAgICAgICBkZWNsYXJlQ29sdW1uKHRhYmxlLDEwMCxTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2UzLnRhYmxlLmNvbDEiKSk7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4odGFibGUsMTAwLFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMudGFibGUuY29sMiIpKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbih0YWJsZSwxMDAsU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy50YWJsZS5jb2wzIikpOwotICAgICAgICAKLSAgICAgICAgdGFibGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotICAgICAgICBpZiAocmVzdG9yZWRGcm9tUHJldmlvdXNTZXR0aW5ncyl7Ci0gICAgICAgICAgICAvL3RyeSBydW5uaW5nIHRoZSB1cGRhdGUKLSAgICAgICAgICAgIHVwZGF0ZVRhYmxlKCk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCi0gICAgfQotICAgICAKLSAgICAvKioKLSAgICAgKiBpZiB0aGUgdXNlciBoYXMgYWxyZWFkeSBmaWxsZWQgdGhlIGRhdGEsIHRoaXMgcGFnZSBuZWVkcyB0byBiZSAKLSAgICAgKiB1bmNoYW5nZWFibGUKLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZpbGxEYXRhZnJvbVByZXZpb3VzKFdTRExBdXRvR2VuZXJhdGVPcHRpb25CZWFuIGJlYW4pIHsKLSAgICAgICAgLy9zZXQgY2xhc3MgbmFtZQotICAgICAgICBTdHJpbmcgYXV0b21hdGljQ2xhc3NOYW1lID0gYmVhbi5nZXRDbGFzc0ZpbGVOYW1lKCk7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lVGV4dEJveC5zZXRUZXh0KGF1dG9tYXRpY0NsYXNzTmFtZSk7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lVGV4dEJveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgLy9zZXQgc2VydmljZSBuYW1lCi0gICAgICAgIFN0cmluZ1tdIGNsYXNzbmFtZVBhcnRzID0gYXV0b21hdGljQ2xhc3NOYW1lLnNwbGl0KCJcXC4iKTsKLSAgICAgICAgaWYgKGNsYXNzbmFtZVBhcnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lVGV4dEJveC5zZXRUZXh0KGF1dG9tYXRpY0NsYXNzTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lVGV4dEJveAotICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChjbGFzc25hbWVQYXJ0c1tjbGFzc25hbWVQYXJ0cy5sZW5ndGggLSAxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9sb2FkIHRoZSBjbGFzc2VzCi0gICAgICAgIHVwZGF0ZVRhYmxlKCk7Ci0gICAgICAgIC8vY2hlY2sgdGhlIGNvcnJlY3Qgb25lcwotCi0gICAgICAgIC8vZGlzYmFsZSB0aGUgdGFibGUKLSAgICAgICAgdGFibGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNsZWFyUHJldmlvdXNEYXRhKCl7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lVGV4dEJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgdGhpcy5jbGFzc05hbWVUZXh0Qm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIC8vc2V0IHNlcnZpY2UgbmFtZQotICAgICAgICB0aGlzLnNlcnZpY2VOYW1lVGV4dEJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgaWYgKHRhYmxlLmlzVmlzaWJsZSgpKXsKLSAgICAgICAgICAgIHRhYmxlLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGxvYWRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZURpcnR5U3RhdHVzKGJvb2xlYW4gc3RhdHVzKXsKLSAgICAgICAgZGlydHkgPSBzdGF0dXM7Ci0gICAgICAgIGlmICh0YWJsZS5pc1Zpc2libGUoKSl7Ci0gICAgICAgICAgICB0YWJsZS5zZXRFbmFibGVkKCFzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSghc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmVDb2x1bW4oVGFibGUgdGFibGUsIGludCB3aWR0aCxTdHJpbmcgY29sTmFtZSl7Ci0gICAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSxTV1QuTk9ORSk7Ci0gICAgICAgIGNvbHVtbi5zZXRXaWR0aCh3aWR0aCk7Ci0gICAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbE5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGFibGUoKSB7Ci0gICAgICAgIC8vZ2V0IGEgVVJMIGZyb20gdGhlIGNsYXNzIGZpbGUgbG9jYXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVMb2NhdGlvbiA9IGdldENsYXNzRmlsZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBVUkwgY2xhc3NGaWxlVVJMID0gbmV3IEZpbGUoY2xhc3NGaWxlTG9jYXRpb24pLnRvVVJMKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgQXJyYXlMaXN0IGxpc3RvZlVSTHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgIGxpc3RvZlVSTHMuYWRkKGNsYXNzRmlsZVVSTCk7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy9nZXQgdGhlIGxpYnJhcmllcyBmcm9tIHRoZSBsaWIgcGFnZSBhbmQgbG9hZCBpdCAKLSAgICAgICAgICAgIFN0cmluZ1tdIGxpYkZpbGVMaXN0ID0gKChTZXJ2aWNlQXJjaGl2ZVdpemFyZCl0aGlzLmdldFdpemFyZCgpKS5nZXRMaWJGaWxlTGlzdCgpOwotICAgICAgICAgICAgaWYgKGxpYkZpbGVMaXN0IT1udWxsKXsKLSAgICAgICAgICAgIAlpbnQgY291bnQgPSBsaWJGaWxlTGlzdC5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaT0wO2k8Y291bnQ7aSsrKXsKLQkJCQkJbGlzdG9mVVJMcy5hZGQobmV3IEZpbGUobGliRmlsZUxpc3RbaV0pLnRvVVJMKCkpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcigoVVJMW10pbGlzdG9mVVJMcy50b0FycmF5KG5ldyBVUkxbbGlzdG9mVVJMcy5zaXplKCldKSk7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lVGV4dEJveC5nZXRUZXh0KCksdHJ1ZSxsb2FkZXIpOwotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlYXJjaERlY2xhcmVkTWV0aG9kc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLSAgICAgICAgICAgICAgICBtZXRob2RzID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBtZXRob2RzID0gY2xhenouZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgbWV0aG9kQ291bnQgPSBtZXRob2RzLmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChtZXRob2RDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IG5ldyBUYWJsZUl0ZW1bbWV0aG9kQ291bnRdOyAvLyBBbiBpdGVtIGZvciBlYWNoIGZpZWxkCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbWV0aG9kQ291bnQ7IGkrKyl7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgxLG1ldGhvZHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDIsbWV0aG9kc1tpXS5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICBpdGVtc1tpXS5zZXRUZXh0KDMsbWV0aG9kc1tpXS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCsiIik7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uc2V0Q2hlY2tlZCh0cnVlKTsvL2NoZWNrIHRoZW0gYWxsIGJ5IGRlZmF1bHQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGFibGUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgZGlydHkgdmFyaWFibGUKLSAgICAgICAgICAgICAgIHVwZGF0ZURpcnR5U3RhdHVzKGZhbHNlKTsKLSAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlMy5lcnJvci51cmwiKSArZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgdXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZXJyb3IuY2xhc3MiKSsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTMuZXJyb3IudW5rbm93biIpICsgZS5nZXRNZXNzYWdlKCkpOyAKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCl7Ci0gICAgICAgIHJldHVybiBkaXJ0eTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKXsKLSAgICAgICAgU2VydmljZUFyY2hpdmVXaXphcmQgd2l6YXJkID0gKFNlcnZpY2VBcmNoaXZlV2l6YXJkKWdldFdpemFyZCgpOwotICAgICAgICByZXR1cm4gd2l6YXJkLmdldENsYXNzRmlsZUxvY2F0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQYWdlMkJlYW4gZ2V0QmVhbihQYWdlMkJlYW4gcHJldmlvdXNCZWFuKXsKLSAgICAgICAgaWYgKCFwcmV2aW91c0JlYW4uaXNNYW51YWwoKSl7Ci0JICAgICAgICBwcmV2aW91c0JlYW4uc2V0QXV0b21hdGljKHRydWUpOwotCSAgICAgICAgcHJldmlvdXNCZWFuLnNldEF1dG9tYXRpY0NsYXNzTmFtZShjbGFzc05hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0JICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkgICAgICAgIGludCBpdGVtTGVuZ3RoID0gaXRlbXMubGVuZ3RoOwotCSAgICAgICAgZm9yKGludCBpPTA7aTxpdGVtTGVuZ3RoO2krKyl7Ci0JICAgICAgICAgICBpZihpdGVtc1tpXS5nZXRDaGVja2VkKCkpewotCSAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW1zW2ldLmdldFRleHQoMSkpOy8vZ2V0IHRoZSBzZWxlY3RlZCBtZXRob2QgbmFtZSBvbmx5Ci0JICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICBwcmV2aW91c0JlYW4uc2V0U2VsZWN0ZWRNZXRob2ROYW1lcyhsaXN0KTsKLQkgICAgICAgIHByZXZpb3VzQmVhbi5zZXRTZXJ2aWNlTmFtZSh0aGlzLnNlcnZpY2VOYW1lVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmV2aW91c0JlYW47Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMTVhYmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLldTRExGaWxlTG9jYXRpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgV1NETEZpbGVTZWxlY3Rpb25QYWdlIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSB7Ci0gICAgCi0gICAgLy8gIHNldCB0aGUgZGVmYXVsdCB0byBmYWxzZS4gVGhpcyBzdGVwIGNhbm5vdCBiZSBza2lwcGVkCi0gICAgcHJpdmF0ZSBib29sZWFuIHNraXBOZXh0UGFnZSA9IGZhbHNlOwotICAgIAotICAgIHByaXZhdGUgVGV4dCB3c2RsVGV4dEJveDsKLSAgICBwcml2YXRlIExhYmVsIHNlbGVjdGlvbkxhYmVsOwotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLSAgICAvL3ByaXZhdGUgQnV0dG9uIGF1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBza2lwV1NETENoZWNrQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHNlbGVjdFdTRExDaGVja0J1dHRvbjsKLSAgICAKLSAgICBwdWJsaWMgV1NETEZpbGVTZWxlY3Rpb25QYWdlKCl7Ci0gICAgICAgIHN1cGVyKCJwYWdlNSIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX0ZJTEVfTkFNRSwiIik7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX1dTRExfR0VORVJBVEUsdHJ1ZSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX1NLSVBfV1NETCxmYWxzZSk7Ci0gICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX1NFTEVDVF9XU0RMLGZhbHNlKTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5udW1Db2x1bW5zPTM7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgCi0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCS8vZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkvL2F1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5DSEVDSyk7Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQkvL2F1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUuZ2VuZXJhdGVhdXRvLmNhcHRpb24iKSk7Ci0JCS8vYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfV1NETF9HRU5FUkFURSkpOwotCQkvL2F1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJLy8gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7Ci0JCS8vICAgICAgICBoYW5kbGVTZWxlY3Rpb24oKTsKLQkJLy8gICAgfQotCQkvLyAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fQotCQkvL30pOwotCQkvL2F1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5zZXRUb29sVGlwVGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U1LmF1dG9nZW4udG9vbHRpcCIpKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBlbmFibGUgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIGJveAotCQkvL2F1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJCi0JCQotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNraXBXU0RMQ2hlY2tCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuQ0hFQ0spOwotCQlza2lwV1NETENoZWNrQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5za2lwV1NETC5jYXB0aW9uIikpOwotCQlza2lwV1NETENoZWNrQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlza2lwV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfU0tJUF9XU0RMKSk7Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gZW5hYmxlIHRoZSBza2lwIGNoZWNrIGJveAotCQlza2lwV1NETENoZWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQlza2lwV1NETENoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7Ci0JCSAgICAgICAgaGFuZGxlU2tpcCgpOwotCQkgICAgfQotCQkgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpe30gCi0JCSAgICAKLQkJfSk7Ci0JCQotCQkvL2FkZCBhbiBlbXB0eSBsYWJsZQotCQluZXcgTGFiZWwoY29udGFpbmVyLFNXVC5OT05FKTsKLQkJCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VsZWN0V1NETENoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsU1dULkNIRUNLKTsKLQkJc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5zZWxlY3RXU0RMLmNhcHRpb24iKSk7Ci0JCXNlbGVjdFdTRExDaGVja0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihzZXR0aW5ncy5nZXRCb29sZWFuKFBSRUZfQ0hFQ0tfU0VMRUNUX1dTREwpKTsKLQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyBlbmFibGUgdGhlIHNraXAgY2hlY2sgYm94Ci0JCXNlbGVjdFdTRExDaGVja0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJc2VsZWN0V1NETENoZWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7Ci0JCSAgICAgICAgaGFuZGxlU2VsZWN0KCk7Ci0JCSAgICB9Ci0JCSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fSAKLQkJICAgIAotCQl9KTsKLSAgICAgICAgICAgCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7IAotICAgICAgICBzZWxlY3Rpb25MYWJlbD0gbmV3IExhYmVsKGNvbnRhaW5lcixTV1QuTlVMTCk7Ci0gICAgICAgIHNlbGVjdGlvbkxhYmVsLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5zZWxlY3R3c2RsLmNhcHRpb24iKSk7Ci0JCQotICAgICAgICB3c2RsVGV4dEJveCA9IG5ldyBUZXh0KGNvbnRhaW5lcixTV1QuQk9SREVSKTsKLSAgICAgICAgd3NkbFRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIHdzZGxUZXh0Qm94LnNldFRleHQoc2V0dGluZ3MuZ2V0KFBSRUZfV1NETF9GSUxFX05BTUUpKTsKLSAgICAgICAgd3NkbFRleHRCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpewotCQkgICAgICAgIGhhbmRsZU1vZGlmeSgpOwotCQkgICAgfQotCQl9KTsKLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJnZW5lcmFsLmJyb3dzZSIpKTsKLQkJYnJvd3NlQnV0dG9uLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpewotCQkgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJICAgICAgICBoYW5kbGVCcm93c2UoKTsKLQkJICAgIH0KLQkJfSk7Ci0JCQotCi0JCQkJCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJCi0JCWlmIChyZXN0b3JlZEZyb21QcmV2aW91c1NldHRpbmdzKXsKLQkJICAgIGhhbmRsZVNraXAoKTsKLQkJICAgIGlmICghc2tpcFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSl7Ci0JCSAgICAJaGFuZGxlU2VsZWN0KCk7Ci0JCSAgICB9Ci0JCX0KLSAgICB9Ci0gICAgCi0gICAgLy9wcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uKCl7Ci0gICAgLy8gICAgYm9vbGVhbiBzZWxlY3Rpb24gPSB0aGlzLmF1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAvLyAgICBzZXR0aW5ncy5wdXQoUFJFRl9DSEVDS19XU0RMX0dFTkVSQVRFLHNlbGVjdGlvbik7Ci0gICAgLy8gICAgaWYgKHNlbGVjdGlvbil7Ci0gICAgLy8gICAgICAgIHRoaXMuc2tpcE5leHRQYWdlID0gZmFsc2U7Ci0gICAgLy8gICAgICAgIHVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAvLyAgICAgICAgdXBkYXRlUmVjb21tZW5kYXRpb24oU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5yZWNvbW1lbmRhdGlvbiIpKTsKLSAgICAvLyAgICAgICAgdGhpcy5za2lwV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgLy8gICAgICAgIHRoaXMuc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgLy8gICAgICAgIGNoYW5nZU1hbnVhbFNlbGVjdGlvblN0YXR1cyhmYWxzZSk7IAotICAgIC8vICAgIH1lbHNleyAKLSAgICAvLyAgICAgICAgICBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXModHJ1ZSk7Ci0gICAgLy8gICAgICAgICAgdGhpcy5za2lwTmV4dFBhZ2UgPSB0cnVlOwotICAgIC8vICAgICAgICAgIGhhbmRsZU1vZGlmeSgpOwotICAgIC8vICAgICAgICAgIHVwZGF0ZVJlY29tbWVuZGF0aW9uKCIiKTsKLSAgICAvLyAgICAgICAgICB0aGlzLnNraXBXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIC8vICAgIAlpZiAoc2tpcFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSB8fCBzZWxlY3RXU0RMQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpewotICAgIC8vICAgIAkJLy95b3Ugc2hvdWxkIG5vdCBjb21lIGhlcmUKLSAgICAvLyAgIAkJCi0gICAgLy8gICAgCX1lbHNlIHsKLSAgICAvLyAgICAJCWF1dG9HZW5lcmF0ZVdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgLy8gICAgICAgICAgICB0aGlzLnNraXBOZXh0UGFnZSA9IGZhbHNlOwotICAgIC8vICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgIC8vICAgICAgICAgICAgdXBkYXRlUmVjb21tZW5kYXRpb24oU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5yZWNvbW1lbmRhdGlvbiIpKTsKLSAgICAvLyAgICAgICAgICAgIHRoaXMuc2tpcFdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIC8vICAgICAgICAgICAgdGhpcy5zZWxlY3RXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAvLyAgICAgICAgICAgIGNoYW5nZU1hbnVhbFNlbGVjdGlvblN0YXR1cyhmYWxzZSk7IAotICAgIC8vICAgIAl9Ci0gICAgLy8gICAgfQotICAgIC8vfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNraXAoKXsKLSAgICAgICAgaWYgKHNraXBXU0RMQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpewotICAgICAgICAgICAvL2Rpc2FibGUgb3RoZXIgd2lkZ3RldHMKLSAgICAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGZhbHNlKTsKLSAgICAgICAgICAgLy9lbmFibGUgbmV4dAotICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfU0tJUF9XU0RMLHRydWUpOwotICAgICAgICAgICB0aGlzLnNlbGVjdFdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB9ZWxzZXsKLS8vICAgICAgICAgICAgLy9jYWxsIHRoaXMgdG8gdXBkYXRlIHRoZSBzdGF0dXMKLS8vICAgICAgICAgICAgaGFuZGxlTW9kaWZ5KCk7Ci0vLyAgICAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX0NIRUNLX1NLSVBfV1NETCxmYWxzZSk7Ci0vLyAgICAgICAgICAgIHRoaXMuYXV0b0dlbmVyYXRlV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgCWlmIChzZWxlY3RXU0RMQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpewotICAgICAgICAJCS8veW91IHNob3VsZCBub3QgY29tZSBoZXJlCi0gICAgICAgIAkJCi0gICAgICAgIAl9ZWxzZSB7Ci0gICAgICAgIAkJc2tpcFdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy9kaXNhYmxlIG90aGVyIHdpZGd0ZXRzCi0gICAgICAgICAgICAgICAgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAvL2VuYWJsZSBuZXh0Ci0gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfU0tJUF9XU0RMLHRydWUpOwotICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdCgpewotICAgICAgICBpZiAoc2VsZWN0V1NETENoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKXsKLSAgICAgICAgICAgIGNoYW5nZU1hbnVhbFNlbGVjdGlvblN0YXR1cyh0cnVlKTsKLSAgICAgICAgICAgIC8vZW5hYmxlIG5leHQKLSAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICAgdGhpcy5za2lwV1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgIAotICAgICAgICB9ZWxzZXsKLS8vICAgICAgICAgICAgc2V0U3RhdHVzKHRydWUpOwotLy8gICAgICAgICAgICAvL2NhbGwgdGhpcyB0byB1cGRhdGUgdGhlIHN0YXR1cwotLy8gICAgICAgICAgICBoYW5kbGVNb2RpZnkoKTsKLS8vICAgICAgICAgICAgc2V0dGluZ3MucHV0KFBSRUZfQ0hFQ0tfU0tJUF9XU0RMLGZhbHNlKTsKLS8vICAgICAgICAgICAgdGhpcy5hdXRvR2VuZXJhdGVXU0RMQ2hlY2tCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAJaWYgKHNraXBXU0RMQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpewotICAgICAgICAJCS8veW91IHNob3VsZCBub3QgY29tZSBoZXJlCi0gICAgICAgIAkJCi0gICAgICAgIAl9ZWxzZSB7Ci0gICAgICAgIAkJc2VsZWN0V1NETENoZWNrQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICAgICAgICAvL2Rpc2FibGUgb3RoZXIgd2lkZ3RldHMKLSAgICAgICAgICAgICAgICBjaGFuZ2VNYW51YWxTZWxlY3Rpb25TdGF0dXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgLy9lbmFibGUgbmV4dAotICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICAgICAgICAgIHRoaXMuc2tpcFdTRExDaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZSgpewotICAgICAgICBGaWxlRGlhbG9nIGZpbGVEaWFsb2cgPSBuZXcgRmlsZURpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotICAgICAgICBmaWxlRGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdeyIqLndzZGwifSk7Ci0gICAgICAgIFN0cmluZyByZXR1cm5GaWxlTmFtZSA9IGZpbGVEaWFsb2cub3BlbigpIDsKLSAgICAgICAgaWYgKHJldHVybkZpbGVOYW1lIT1udWxsKXsKLSAgICAgICAgICAgIHRoaXMud3NkbFRleHRCb3guc2V0VGV4dChyZXR1cm5GaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTW9kaWZ5KCl7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gd3NkbFRleHRCb3guZ2V0VGV4dCgpOwotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX0ZJTEVfTkFNRSx0ZXh0KTsKLSAgICAgICAgLy92YWxpZGF0ZQotICAgICAgICBpZiAoIiIuZXF1YWxzKHRleHQpKXsKLSAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTUuZXJyb3Iud3NkbG5hbWVlbXB0eSIpKTsgCi0gICAgICAgICB9ZWxzZSBpZighdGV4dC5lbmRzV2l0aCgiLndzZGwiKSl7Ci0gICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNS5lcnJvci53c2RsbmFtZXdyb25nIikpOyAgCi0gICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cyhudWxsKTsKLSAgICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSZWNvbW1lbmRhdGlvbihTdHJpbmcgbWVzc2FnZSl7Ci0gICAgICAgIFNlcnZpY2VBcmNoaXZlV2l6YXJkIHdpemFyZCA9IChTZXJ2aWNlQXJjaGl2ZVdpemFyZCl0aGlzLmdldFdpemFyZCgpOwotICAgICAgICB3aXphcmQudXBkYXRlV3NkbEZpbGVHZW5lcmF0aW9uU3RhdHVzKG1lc3NhZ2UpOwotICAgICAgIAotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlTWFudWFsU2VsZWN0aW9uU3RhdHVzKGJvb2xlYW4gc3RhdGUpewotICAgICAgICB0aGlzLndzZGxUZXh0Qm94LnNldEVuYWJsZWQoc3RhdGUpOwotICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25MYWJlbC5zZXRFbmFibGVkKHN0YXRlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdXRvR2VuZXJhdGUoKXsKLSAgICAgICAgcmV0dXJuIGZhbHNlIDsvLyBhdXRvR2VuZXJhdGVXU0RMQ2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpc1NraXBOZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NraXBOZXh0KCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vcmV0dXJuIHRoaXMuc2tpcE5leHRQYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgV1NETEZpbGVMb2NhdGlvbkJlYW4gZ2V0QmVhbigpewotICAgICAgICBXU0RMRmlsZUxvY2F0aW9uQmVhbiBsb2NhdGlvbkJlYW4gPSBuZXcgV1NETEZpbGVMb2NhdGlvbkJlYW4oKTsKLSAgICAgICAgbG9jYXRpb25CZWFuLnNldE1hbnVhbCghaXNBdXRvR2VuZXJhdGUoKSk7Ci0gICAgICAgIGxvY2F0aW9uQmVhbi5zZXRXU0RMRmlsZU5hbWUod3NkbFRleHRCb3guZ2V0VGV4dCgpKTsKLSAgICAgICAgbG9jYXRpb25CZWFuLnNldFNraXAoc2tpcFdTRExDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIHJldHVybiBsb2NhdGlvbkJlYW47Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9XU0RMT3B0aW9uc1BhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL2VjbGlwc2UvdWkvV1NETE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYTdkOWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91aS9XU0RMT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLldTRExBdXRvR2VuZXJhdGVPcHRpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UucGx1Z2luLlNlcnZpY2VBcmNoaXZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLQotcHVibGljIGNsYXNzIFdTRExPcHRpb25zUGFnZSBleHRlbmRzIEFic3RyYWN0U2VydmljZVdpemFyZFBhZ2UgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfV1NETF9ERUZBVUxUX05BTUUgPSAic2VydmljZS53c2RsIjsKLSAgICBwcml2YXRlIFRleHQgY2xhc3NOYW1lVGV4dEJveDsKLSAgICBwcml2YXRlIFRleHQgb3V0cHV0RmlsZU5hbWVUZXh0Qm94OwotICAgIHByaXZhdGUgQ29tYm8gc3R5bGVTZWxlY3Rpb25Db21ibzsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveDsKLSAgICBwcml2YXRlIFRhYmxlIHRhYmxlOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOwotICAgIAotICAgIHB1YmxpYyBXU0RMT3B0aW9uc1BhZ2UoKXsKLSAgICAgICAgc3VwZXIoInBhZ2U2Iik7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmVjbGlwc2UudWkuQWJzdHJhY3RTZXJ2aWNlV2l6YXJkUGFnZSNpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFNldHRpbmdzKCkgewotICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfRklMRV9OQU1FLFNFUlZJQ0VfV1NETF9ERUZBVUxUX05BTUUpOwotICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfQ0xBU1NfTkFNRSwiIik7Ci0gICAgICAgc2V0dGluZ3MucHV0KFBSRUZfV1NETF9TVFlMRV9JTkRFWCwwKTsKLQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gOTsKLQotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwKLSAgICAgICAgICAgICAgICAuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYuZmlsZU5hbWUubGFiZWwiKSk7Ci0gICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgb3V0cHV0RmlsZU5hbWVUZXh0Qm94ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSKTsKLSAgICAgICAgb3V0cHV0RmlsZU5hbWVUZXh0Qm94LnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBvdXRwdXRGaWxlTmFtZVRleHRCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9XU0RMX0ZJTEVfTkFNRSkpOwotICAgICAgICAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIG91dHB1dEZpbGVOYW1lVGV4dEJveC5zZXRFbmFibGVkKGZhbHNlKTsvL3RoaXMgdGV4dCBib3ggaXMgZGlzYmFsZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cKLSAgICAgICAgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICBvdXRwdXRGaWxlTmFtZVRleHRCb3guYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxGaWxlTmFtZU1vZGlmaWNhdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5VTEwpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYuY2xhc3MubGFiZWwiKSk7Ci0KLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0gICAgICAgIGNsYXNzTmFtZVRleHRCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGNsYXNzTmFtZVRleHRCb3guc2V0VGV4dChzZXR0aW5ncy5nZXQoUFJFRl9XU0RMX0NMQVNTX05BTUUpKTsKLSAgICAgICAgY2xhc3NOYW1lVGV4dEJveC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDbGFzc05hbWVNb2RpZmljYXRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgQnV0dG9uIGxvYWRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlBVU0gpOwotICAgICAgICBsb2FkQnV0dG9uLnNldFRleHQoIkxvYWQiKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbG9hZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVGFibGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAKLSAgICAgICAgc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbnRhaW5lcixTV1QuQ0hFQ0spOwotICAgICAgICBzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3guc2V0VGV4dCgiTGlzdCBEZWNsYXJlZCBNZXRob2RzIE9ubHkiKTsKLSAgICAgICAgc2VhcmNoRGVjbGFyZWRNZXRob2RzQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKXsKLSAgICAgICAgICAgICAgICB1cGRhdGVEaXJ0eVN0YXR1cyh0cnVlKTsvL2RpcnR5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSl7fSAKLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OVUxMKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dChTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LnN0eWxlLmxhYmVsIikpOwotCi0gICAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc3R5bGVTZWxlY3Rpb25Db21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5EUk9QX0RPV04gfCBTV1QuQk9SREVSCi0gICAgICAgICAgICAgICAgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgc3R5bGVTZWxlY3Rpb25Db21iby5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgcG9wdWxhdGVTdHlsZUNvbWJvKCk7Ci0gICAgICAgIHN0eWxlU2VsZWN0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHNldHRpbmdzLnB1dChQUkVGX1dTRExfU1RZTEVfSU5ERVgsIHN0eWxlU2VsZWN0aW9uQ29tYm8KLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdkLnZlcnRpY2FsU3BhbiA9IDU7Ci0gICAgICAgIAotICAgICAgICB0YWJsZSA9IG5ldyBUYWJsZShjb250YWluZXIsU1dULlNJTkdMRXxTV1QuRlVMTF9TRUxFQ1RJT058U1dULkNIRUNLKTsKLSAgICAgICAgdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOyAKLSAgICAgICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4odGFibGUsMjAsIiIpOwotICAgICAgICBkZWNsYXJlQ29sdW1uKHRhYmxlLDEwMCwiTWV0aG9kIE5hbWUiKTsKLSAgICAgICAgZGVjbGFyZUNvbHVtbih0YWJsZSwxMDAsIlJldHVybiBUeXBlIik7Ci0gICAgICAgIGRlY2xhcmVDb2x1bW4odGFibGUsMTAwLCJQYXJhbWV0ZXIgQ291bnQiKTsKLSAgICAgICAgCi0gICAgICAgIHRhYmxlLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgc2V0Q29udHJvbChjb250YWluZXIpOwotCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBkZWNsYXJlQ29sdW1uKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsU3RyaW5nIGNvbE5hbWUpewotICAgICAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsU1dULk5PTkUpOwotICAgICAgICBjb2x1bW4uc2V0V2lkdGgod2lkdGgpOwotICAgICAgICBjb2x1bW4uc2V0VGV4dChjb2xOYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3R5bGVDb21ibygpIHsKLSAgICAgICAgc3R5bGVTZWxlY3Rpb25Db21iby5hZGQoIkRvY3VtZW50Iik7Ci0gICAgICAgIHN0eWxlU2VsZWN0aW9uQ29tYm8uYWRkKCJycGMiKTsKLSAgICAgICAgc3R5bGVTZWxlY3Rpb25Db21iby5hZGQoIldyYXBwZWQiKTsKLQotICAgICAgICBzdHlsZVNlbGVjdGlvbkNvbWJvLnNlbGVjdChzZXR0aW5ncy5nZXRJbnQoUFJFRl9XU0RMX1NUWUxFX0lOREVYKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGFibGUoKSB7Ci0gICAgICAgIC8vZ2V0IGEgVVJMIGZyb20gdGhlIGNsYXNzIGZpbGUgbG9jYXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVMb2NhdGlvbiA9IGdldENsYXNzRmlsZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICBVUkwgY2xhc3NGaWxlVVJMID0gbmV3IEZpbGUoY2xhc3NGaWxlTG9jYXRpb24pLnRvVVJMKCk7Ci0gICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgY2xhc3NGaWxlVVJMIH0pOwotCi0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzZWFyY2hEZWNsYXJlZE1ldGhvZHNDaGVja0JveC5nZXRTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICAgICAgbWV0aG9kcyA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgbWV0aG9kcyA9IGNsYXp6LmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IG1ldGhvZENvdW50ID0gbWV0aG9kcy5sZW5ndGg7Ci0gICAgICAgICAgICBpZiAobWV0aG9kQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgVGFibGVJdGVtW10gaXRlbXMgPSBuZXcgVGFibGVJdGVtW21ldGhvZENvdW50XTsgLy8gQW4gaXRlbSBmb3IgZWFjaCBmaWVsZAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1ldGhvZENvdW50OyBpKyspewotICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLnNldFRleHQoMSxtZXRob2RzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgyLG1ldGhvZHNbaV0uZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgaXRlbXNbaV0uc2V0VGV4dCgzLG1ldGhvZHNbaV0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGgrIiIpOwotICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldLnNldENoZWNrZWQodHJ1ZSk7Ly9jaGVjayB0aGVtIGFsbCBieSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhYmxlLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy91cGRhdGUgdGhlIGRpcnR5IHZhcmlhYmxlCi0gICAgICAgICAgICAgICB1cGRhdGVEaXJ0eVN0YXR1cyhmYWxzZSk7Ci0gICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgdXBkYXRlU3RhdHVzKCJFcnJvciA6IGludmFsaWQgbG9jYXRpb24gIiArZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgdXBkYXRlU3RhdHVzKCJFcnJvciA6IENsYXNzIG5vdCBmb3VuZCAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc05hbWVNb2RpZmljYXRpb24oKXsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX0NMQVNTX05BTUUsIGNsYXNzTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2xhc3NOYW1lPT1udWxsIHx8ICIiLmVxdWFscyhjbGFzc05hbWUudHJpbSgpKSl7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5lcnJvci5jbGFzc25hbWUxIikpOwotICAgICAgICB9ZWxzZSBpZiAoY2xhc3NOYW1lLmVuZHNXaXRoKCIuIikpewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKFNlcnZpY2VBcmNoaXZlci5nZXRSZXNvdXJjZVN0cmluZygicGFnZTYuZXJyb3IuY2xhc3NuYW1lMiIpKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbEZpbGVOYW1lTW9kaWZpY2F0aW9uKCl7Ci0gICAgICAgIFN0cmluZyB3c2RsRmlsZU5hbWUgPSBvdXRwdXRGaWxlTmFtZVRleHRCb3guZ2V0VGV4dCgpOwotICAgICAgICBzZXR0aW5ncy5wdXQoUFJFRl9XU0RMX0ZJTEVfTkFNRSwgd3NkbEZpbGVOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIGlmICh3c2RsRmlsZU5hbWU9PW51bGwgfHwgIiIuZXF1YWxzKHdzZGxGaWxlTmFtZS50cmltKCkpKXsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhTZXJ2aWNlQXJjaGl2ZXIuZ2V0UmVzb3VyY2VTdHJpbmcoInBhZ2U2LmVycm9yLmZpbGVOYW1lMSIpKTsKLSAgICAgICAgfWVsc2UgaWYgKHdzZGxGaWxlTmFtZS5lbmRzV2l0aCgiLndzZGwiKSl7Ci0gICAgICAgICAgICB1cGRhdGVTdGF0dXMoU2VydmljZUFyY2hpdmVyLmdldFJlc291cmNlU3RyaW5nKCJwYWdlNi5lcnJvci5maWxlTmFtZTIiKSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDbGFzc0ZpbGVMb2NhdGlvbigpewotICAgICAgICBTZXJ2aWNlQXJjaGl2ZVdpemFyZCB3aXphcmQgPSAoU2VydmljZUFyY2hpdmVXaXphcmQpZ2V0V2l6YXJkKCk7Ci0gICAgICAgIHJldHVybiB3aXphcmQuZ2V0Q2xhc3NGaWxlTG9jYXRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFdTRExBdXRvR2VuZXJhdGVPcHRpb25CZWFuIGdldEJlYW4oKXsKLSAgICAgICAgV1NETEF1dG9HZW5lcmF0ZU9wdGlvbkJlYW4gb3B0aW9uQmVhbiA9IG5ldyBXU0RMQXV0b0dlbmVyYXRlT3B0aW9uQmVhbigpOwotICAgICAgICBvcHRpb25CZWFuLnNldENsYXNzRmlsZU5hbWUoY2xhc3NOYW1lVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICBvcHRpb25CZWFuLnNldE91dHB1dEZpbGVOYW1lKG91dHB1dEZpbGVOYW1lVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICBvcHRpb25CZWFuLnNldFN0eWxlKHN0eWxlU2VsZWN0aW9uQ29tYm8uZ2V0SXRlbShzdHlsZVNlbGVjdGlvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpKTsKLSAgICAgICAgcmV0dXJuIG9wdGlvbkJlYW47Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXJ0eVN0YXR1cyhib29sZWFuIHN0YXR1cyl7Ci0gICAgICAgIGRpcnR5ID0gc3RhdHVzOwotICAgICAgICBpZiAodGFibGUuaXNWaXNpYmxlKCkpewotICAgICAgICAgICAgdGFibGUuc2V0RW5hYmxlZCghc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICBzZXRQYWdlQ29tcGxldGUoIXN0YXR1cyk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBib29sZWFuIGdldFdpemFyZENvbXBsZXRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvZWNsaXBzZS91dGlsL1NldHRpbmdzQ29uc3RhbnRzLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3V0aWwvU2V0dGluZ3NDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzOGMwYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9lY2xpcHNlL3V0aWwvU2V0dGluZ3NDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIFNldHRpbmdzQ29uc3RhbnRzIHsKLSAgIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DTEFTU19GSUxFX0xPQ0FUSU9OID0gIkNMQVNTX0ZJTEVfTE9DQVRJT04iIDsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9GSUxURVJfQllfQ0xBU1NFUyA9ICJGSUxURVJfQllfQ0xBU1NFUyIgOwotICAgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NFUlZJQ0VfWE1MX0ZJTEUgPSAiU0VSVklDRV9YTUwiIDsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19BVVRPX0dFTl9TRVJWSUNFX1hNTCA9ICJBVVRPX0dFTiIgOwotICAgLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dTRExfRklMRV9OQU1FPSJXU0RMX0ZJTEVfTkFNRSI7Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ0hFQ0tfV1NETF9HRU5FUkFURT0iV1NETF9HRU4iOwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NIRUNLX1NLSVBfV1NETD0iU0tJUF9XU0RMIjsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DSEVDS19TRUxFQ1RfV1NETD0iU0VMRUNUX1dTREwiOwotICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dTRExfQ0xBU1NfTkFNRT0iV1NETF9DTEFTU19OQU1FIjsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XU0RMX1NUWUxFX0lOREVYPSJXU0RMX1NUWUxFIjsKLSAgIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX09VVFBVVF9MT0NBVElPTj0iT1VUX0xPQ0FUSU9OIjsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PVVRQVVRfTkFNRT0iT1VUX05BTUUiOwotICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NFUlZJQ0VfR0VOX1NFUlZJQ0VfTkFNRT0iU0VSVklDRV9OQU1FIjsKLSAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TRVJWSUNFX0dFTl9DTEFTU05BTUU9IkNMQVNTTkFNRSI7Ci0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VSVklDRV9HRU5fTE9BRF9BTEw9IkxPQURfQUxMIjsKLSAgIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTElCX0xJQk5BTUVTPSJMSUJfTkFNRVMiOwotICAgCi0gICAKLSAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvcmVzb3VyY2UvU2VydmljZVJlc291cmNlcy5wcm9wZXJ0aWVzIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2UvcmVzb3VyY2UvU2VydmljZVJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MThhNDQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3Jlc291cmNlL1NlcnZpY2VSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyAgIFJlc291cmNlcyBmb3IgdGhlIGludGVyZmFjZSAjIyMjIyMjIyMjIyMjIyMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgRGVmYXVsdCBlbl91cyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgTWFpbiBwYWdlIHRpdGxlCi1tYWluLnRpdGxlPUFwYWNoZSBBeGlzIFNlcnZpY2UgQXJjaGl2ZXIKLQotI2dlbmVyYWwgdGV4dHMKLSNPayBidXR0b24gY2FwdGlvbgotZ2VuZXJhbC5vaz1PawotI0NhbmNsZSBidXR0b24gY2FwdGlvbgotZ2VuZXJhbC5jYW5jZWw9Q2FuY2VsCi0jTmV4dCBidXR0b24gY2FwdGlvbgotZ2VuZXJhbC5uZXh0PU5leHQKLSNQcmV2aW91cyBidXR0b24gY2FwdGlvbgotZ2VuZXJhbC5wcmV2PVByZXYKLSNGaW5pc2ggYnV0dG9uIGNhcHRpb24KLWdlbmVyYWwuZmluaXNoPUZpbmlzaAotI2Jyb3dzZQotZ2VuZXJhbC5icm93c2U9QnJvd3NlLi4uCi1nZW5lcmFsLmFkZD1BZGQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNGaXJzdHBhZ2UgdGl0bGUKLXBhZ2UxLm5hbWU9cGFnZTEKLXBhZ2UxLnRpdGxlPVNlcnZpY2UgQXJjaGl2ZXIKLXBhZ2UxLmRlc2M9V2VsY29tZSB0byB0aGUgbmV3IEFYSVMgU2VydmljZSBwYWNrYWdlciBXaXphcmQgSW50ZXJmYWNlLkluc2VydCB0aGUgbG9jYXRpb24gZm9yIHRoZSBjbGFzcyBmaWxlcyBoZXJlLgotIyBGaXJzdCBwYWdlCi1wYWdlMS5maWxlTG9jYXRpb25MYWJlbD1DbGFzcyBGaWxlIExvY2F0aW9uCi1wYWdlMS5maWxlZGlhbG9nVGl0bGU9QnJvd3NlIGZvciB0aGUgY2xhc3MgZmlsZSBsb2NhdGlvbgotcGFnZTEuZmlsdGVyLmNhcHRpb249SW5jbHVkZSAuY2xhc3MgZmlsZXMgb25seQotcGFnZTEuZmlsZWRpYWxvZ1RpdGxlPUJyb3dzZSBmb3IgYSBsb2NhdGlvbgotcGFnZTEuZXJyb3IuZmlsZW1pc3Npbmc9VGhlIHNwZWNpZmllZCBmaWxlIGlzIG1pc3NpbmcKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHNlY29uZCBwYWdlCi1wYWdlMi5uYW1lPXBhZ2UyCi1wYWdlMi50aXRsZT1TZXJ2aWNlIEFyY2hpdmVyCi1wYWdlMi5kZXNjPVNlbGVjdCB0aGUgU2VydmljZSBYTUwgZmlsZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgU2VydmljZSBhcmNoaXZlCi1wYWdlMi5zZWxlY3RzZXJ2aWNleG1sLmNhcHRpb249U2V0IHRoZSBzZXJ2aWNlIFhNTCBmaWxlCi1wYWdlMi5nZW5lcmF0ZWF1dG8uY2FwdGlvbj1HZW5lcmF0ZSB0aGUgc2VydmljZSB4bWwgYXV0b21hdGljYWxseQotcGFnZTIuZXJyb3Iuc2VydmljZW5hbWVlbXB0eT1TZXJ2aWNlIFhNTCBzaG91bGQgbm90IGJlIGVtcHR5Ci1wYWdlMi5lcnJvci5zZXJ2aWNlbmFtZXdyb25nPVBsZWFzZSBzZWxlY3QgYSBmaWxlIG5hbWVkIHNlcnZpY2UueG1sCi1wYWdlMi5lcnJvci5zZXJ2aWNlbm90ZXhpc3Q9U2VydmljZSBmaWxlIGRvZXMgbm90IGV4aXN0Ci1wYWdlMi5lcnJvci5zZXJ2aWNlc2VsZWN0ZWRpbnZhbGlkPVRoZSBzZWxlY3RlZCBzZXJ2aWNlIGZpbGUgaXMgaW52YWxpZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI3RoaXJkIHBhZ2UKLXBhZ2UzLm5hbWU9cGFnZTMKLXBhZ2UzLnRpdGxlPVNlcnZpY2UgQXJjaGl2ZXIKLXBhZ2UzLmRlc2M9R2VuZXJhdGUgdGhlIFNlcnZpY2UgWE1MIGZpbGUKLXBhZ2UzLnNlcnZpY2VuYW1lLmxhYmxlPVNlcnZpY2UgbmFtZQotcGFnZTMuc2VydmljZW5hbWUudG9vbHRpcD1QdXQgdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgaGVyZS4KLXBhZ2UzLmNsYXNzbmFtZS5sYWJsZT1DbGFzcyBuYW1lCi1wYWdlMy5jbGFzc25hbWUudG9vbHRpcD1UaGUgY2xhc3MgdGhhdCB5b3UgbmVlZCB0byBleHBvc2UgYXMgdGhlIHNlcnZpY2UuIE5vdGUgdGhhdCB0aGlzIG5lZWRzIHRvIGJlIGluIHRoZSBwcmV2aW9zbHkgc2VsZWN0ZWQgZm9sZGVyCi1wYWdlMy5sb2FkYnV0dG9uLmxhYmxlPUxvYWQKLXBhZ2UzLmRlY2xhcmVkLmxhYmxlPVNlYXJjaCBkZWNsYXJlZCBtZXRob2RzIG9ubHkKLXBhZ2UzLnRhYmxlLmNvbDE9TWV0aG9kIG5hbWUKLXBhZ2UzLnRhYmxlLmNvbDI9UmV0dXJuIHR5cGUKLXBhZ2UzLnRhYmxlLmNvbDM9UGFyYW1ldGVycwotcGFnZTMuZXJyb3IudXJsPUVycm9yIDogaW52YWxpZCBsb2NhdGlvbgotcGFnZTMuZXJyb3IuY2xhc3M9RXJyb3IgOiBDbGFzcyBub3QgZm91bmQKLXBhZ2UzLmVycm9yLnVua25vd249RXJyb3IgOiBVbmtub3duIGVycm9yCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI0ZvdXJ0aCBwYWdlCi1wYWdlNC5uYW1lPXBhZ2U0Ci1wYWdlNC50aXRsZT1TZXJ2aWNlIEFyY2hpdmVyCi1wYWdlNC5kZXNjPVNldCB0aGUgb3V0cHV0IGxvYWNhdGlvbiBhbmQgdGhlIG91dHB1dCBmaWxlIG5hbWUKLXBhZ2U0Lm91dHB1dGxvY2F0aW9uLmxhYmVsPU91dHB1dCBmaWxlIGxvY2F0aW9uCi1wYWdlNC5vdXRwdXRuYW1lLmxhYmVsPU91dHB1dCBGaWxlIE5hbWUKLXBhZ2U0LmRpcmRpYWxvZy5jYXB0aW9uPUJyb3dzZSBmb3IgdGhlIG91dHB1dCBsb2NhdGlvbgotcGFnZTQuaGludC5jYXB0aW9uPUhpbnQgOiBUbyBGaW5pc2ggdGhlIHdpemFyZCwgcGxlYXNlIGVudGVyIHZhbGlkIGVudHJpZXMgdG8gdGhlIG91dHB1dCBsb2NhdGlvbiBhbmQgb3V0cHV0IGZpbGUuIAotIyBlcnJvcnMKLXBhZ2U0LmVycm9yLmxvY2F0aW9uPUJyb3dzZSBhbmQgZW50ZXIgdGhlIGxvY2F0aW9uIHRvIHNhdmUgdGhlIG91dHB1dCBmaWxlCi1wYWdlNC5lcnJvci5maWxlbmFtZT1FbnRlciBhIG5hbWUgZm9yIFNlcnZpY2UgRmlsZSAoSWRlYWxseSBpdCBzb3VsZCBiZSB0aGUgc2VydmljZSBuYW1lIGVuZGluZyB3aXRoIHRoZSB2YWxpZCBleHRlbnRpb24gKi5qYXIpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNGaWZ0aCBwYWdlCi1wYWdlNS5uYW1lPXBhZ2U1Ci1wYWdlNS50aXRsZT1TZXJ2aWNlIEFyY2hpdmVyCi1wYWdlNS5kZXNjPUFkZCB0aGUgV1NETCBGaWxlCi1wYWdlNS5zZWxlY3R3c2RsLmNhcHRpb249U2VsZWN0IGEgV1NETCBmaWxlCi1wYWdlNS5nZW5lcmF0ZWF1dG8uY2FwdGlvbj1HZW5lcmF0ZSBhIFdTREwgZmlsZQotcGFnZTUuYXV0b2dlbi50b29sdGlwPVRpY2sgdGhpcyB0byBnZW5lcmF0ZSBhIFdTREwgZmlsZSBhdXRvbWF0aWNhbGx5Ci1wYWdlNS5yZWNvbW1lbmRhdGlvbj1TaW5jZSB5b3UgZ2VuZXJhdGVkIHRoZSBzZXJ2aWNlLlhNTCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoZSBXU0RMIGlzIGF1dG8gZ2VuZXJhdGVkCi1wYWdlNS5lcnJvci53c2RsbmFtZWVtcHR5PVdTREwgZmlsZSBuYW1lIGlzIGVtcHR5Ci1wYWdlNS5lcnJvci53c2RsbmFtZXdyb25nPVdTREwgZmlsZSBuYW1lIGlzIGludmFsaWQKLXBhZ2U1LnNraXBXU0RMLmNhcHRpb249U2tpcCBXU0RMCi1wYWdlNS5zZWxlY3RXU0RMLmNhcHRpb249U2VsZWN0IFdTREwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNTaXh0aCBwYWdlCi1wYWdlNi5uYW1lPXBhZ2U2Ci1wYWdlNi50aXRsZT1TZXJ2aWNlIEFyY2hpdmVyCi1wYWdlNi5kZXNjPUFkZCBhbnkgZXh0ZXJuYWwgbGlicmFyaWVzCi1wYWdlNi5hZGQ9QWRkIC0+Ci1wYWdlNi5yZW1vdmU9UmVtb3ZlIDwtCi1wYWdlNi5saWJuYW1lcy5jYXB0aW9uPUxpYnJhcmllcwotcGFnZTYubGlibGlzdC5jYXB0aW9uPUFkZGVkIGxpYnJhcmllcwotcGFnZTYubGlibGlzdC5jb3VudC5jYXB0aW9uPSBqYXJzIGluIGxpc3QKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBXaXphcmRzIGVycm9yIG1lc3NhZ2VzCi13aXphcmQuY29kZWdlbi5zdWNjZXNzPVNlcnZpY2UgQXJjaGl2ZSBHZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IQotd2l6YXJkLmNvZGVnZW4udW5rbm93bi5lcnJvcj1Vbmtub3duIEVycm9yIQotd2l6YXJkLmNvZGVnZW4uc3VjY2Vzcy5tc2cuaGVhZGluZz1TdWNjZXNzCi13aXphcmQuY29kZWdlbi5lcnJvci5tc2cuaGVhZGluZz1FcnJvcgotd2l6YXJkLmNvZGVnZW4uc3RhcnRtc2c9UnVubmluZyB0aGUgYXJjaGl2aW5nIHByb2Nlc3MKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL01haW5XaW5kb3cuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL01haW5XaW5kb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NzJlYS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9NYWluV2luZG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5zd2luZy51aTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV2l6YXJkQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5jb250cm9sLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuY29udHJvbC5Qcm9jZXNzRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgTWFpbldpbmRvdyBleHRlbmRzIEpGcmFtZSB7Ci0KLSAgICBwcml2YXRlIEpQYW5lbCB3aXphcmRQYW5lQ29udGFpbmVyOwotICAgIHByaXZhdGUgSkJ1dHRvbiBuZXh0QnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBwcmV2aW91c0J1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gY2FuY2VsQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBmaW5pc2hCdXR0b247Ci0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFBhZ2U7Ci0gICAgcHJpdmF0ZSBXaXphcmRQYW5lIGN1cnJlbnRXaXphcmRQYW5lOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfMSA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfMiA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBR0VfMyA9IDM7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFHRV80PTQ7Ci0KLQotICAgIHByaXZhdGUgV2l6YXJkQmVhbiB3aXphcmRCZWFuID0gbmV3IFdpemFyZEJlYW4oKTsKLQotICAgIHB1YmxpYyBNYWluV2luZG93KCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoIkF4aXMgMiAtIFNlcnZpY2UgSmFyIEJ1aWxkZXIiKTsKLSAgICAgICAgaW5pdCgpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobnVsbCk7Ci0KLSAgICAgICAgdGhpcy5zZXRCb3VuZHMoCi0gICAgICAgICAgICAgICAgKGludCkgVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblNpemUoKS5nZXRXaWR0aCgpIC8KLSAgICAgICAgICAgICAgICAyIC0KLSAgICAgICAgICAgICAgICA0MDAgLyAyLAotICAgICAgICAgICAgICAgIChpbnQpIFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKS5nZXRTY3JlZW5TaXplKCkuZ2V0SGVpZ2h0KCkgLwotICAgICAgICAgICAgICAgIDIgLQotICAgICAgICAgICAgICAgIDM2MCAvIDIsCi0gICAgICAgICAgICAgICAgNDAwLCAzNjApOwotICAgICAgICB0aGlzLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEVYSVRfT05fQ0xPU0UpOwotCi0gICAgICAgIGludCBoZ2FwID0gNTsKLSAgICAgICAgaW50IHZnYXAgPSA1OwotICAgICAgICBpbnQgYldpZHRoID0gODA7Ci0gICAgICAgIGludCBiSGVpZ2h0ID0gMjA7Ci0KLSAgICAgICAgdGhpcy53aXphcmRQYW5lQ29udGFpbmVyID0gbmV3IEpQYW5lbChudWxsKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLndpemFyZFBhbmVDb250YWluZXIpOwotICAgICAgICB0aGlzLndpemFyZFBhbmVDb250YWluZXIuc2V0Qm91bmRzKDAsIDAsIDQwMCwgMzAwKTsKLQotICAgICAgICB0aGlzLnByZXZpb3VzQnV0dG9uID0gbmV3IEpCdXR0b24oIlByZXZpb3VzIik7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5wcmV2aW91c0J1dHRvbik7Ci0gICAgICAgIHRoaXMucHJldmlvdXNCdXR0b24uc2V0Qm91bmRzKGhnYXAsIDMwMCArIHZnYXAsIGJXaWR0aCwgYkhlaWdodCk7Ci0gICAgICAgIHRoaXMucHJldmlvdXNCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb3ZlQmFja1dhcmQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLm5leHRCdXR0b24gPSBuZXcgSkJ1dHRvbigiTmV4dCIpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMubmV4dEJ1dHRvbik7Ci0gICAgICAgIHRoaXMubmV4dEJ1dHRvbi5zZXRCb3VuZHMoaGdhcCArIGJXaWR0aCArIGhnYXAsCi0gICAgICAgICAgICAgICAgMzAwICsgdmdhcCwKLSAgICAgICAgICAgICAgICBiV2lkdGgsCi0gICAgICAgICAgICAgICAgYkhlaWdodCk7Ci0gICAgICAgIHRoaXMubmV4dEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vdmVGb3J3YXJkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oIkNsb3NlIik7Ci0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5jYW5jZWxCdXR0b24pOwotICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbi5zZXRCb3VuZHMoaGdhcCArIChiV2lkdGggKyBoZ2FwKSAqIDIsCi0gICAgICAgICAgICAgICAgMzAwICsgdmdhcCwKLSAgICAgICAgICAgICAgICBiV2lkdGgsCi0gICAgICAgICAgICAgICAgYkhlaWdodCk7Ci0gICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1FeGl0KCkpCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmZpbmlzaEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJGaW5pc2giKTsKLSAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmZpbmlzaEJ1dHRvbik7Ci0gICAgICAgIHRoaXMuZmluaXNoQnV0dG9uLnNldEJvdW5kcyhoZ2FwICsgKGJXaWR0aCArIGhnYXApICogMywKLSAgICAgICAgICAgICAgICAzMDAgKyB2Z2FwLAotICAgICAgICAgICAgICAgIGJXaWR0aCwKLSAgICAgICAgICAgICAgICBiSGVpZ2h0KTsKLSAgICAgICAgdGhpcy5maW5pc2hCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0KLSAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IFBBR0VfMTsKLSAgICAgICAgbW92ZVRvUGFnZShjdXJyZW50UGFnZSk7IC8vYWRkIHRoZSBmaXJzdCBwYWdlIGFzIGRlZmF1bHQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0Vycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKLSAgICAgICAgICAgICAgICAiUmVxdWlyZWQgVmFsdWUgTm90IHNldCEhISIsCi0gICAgICAgICAgICAgICAgIkVycm9yIiwKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0Vycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIkVycm9yIiwKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd1N1Y2Nlc3NNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiRXJyb3IiLAotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLklORk9STUFUSU9OX01FU1NBR0UpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjb25maXJtRXhpdCgpIHsKLSAgICAgICAgaW50IHJldHVyblR5cGUgPSBKT3B0aW9uUGFuZS5zaG93T3B0aW9uRGlhbG9nKHRoaXMsCi0gICAgICAgICAgICAgICAgIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBleGl0PyIsCi0gICAgICAgICAgICAgICAgIkV4aXQgc2VydmljZSBidWlsZGVyIiwKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OLAotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIChyZXR1cm5UeXBlID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtb3ZlRm9yd2FyZCgpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRXaXphcmRQYW5lLnZhbGlkYXRlVmFsdWVzKCkpIHsKLSAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UrKzsKLSAgICAgICAgICAgIG1vdmVUb1BhZ2UodGhpcy5jdXJyZW50UGFnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbW92ZUJhY2tXYXJkKCkgewotICAgICAgICB0aGlzLmN1cnJlbnRQYWdlLS07Ci0gICAgICAgIG1vdmVUb1BhZ2UodGhpcy5jdXJyZW50UGFnZSk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbW92ZVRvUGFnZShpbnQgcGFnZSkgewotICAgICAgICBzd2l0Y2ggKHBhZ2UpIHsKLSAgICAgICAgICAgIGNhc2UgUEFHRV8xOgotICAgICAgICAgICAgICAgIHByb2Nlc3NQYWdlKG5ldyBXaXphcmRQYW5lMSh0aGlzLndpemFyZEJlYW4sIHRoaXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQUdFXzI6Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1BhZ2UobmV3IFdpemFyZFBhbmUyKHRoaXMud2l6YXJkQmVhbiwgdGhpcyksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFHRV8zOgotICAgICAgICAgICAgICAgIHByb2Nlc3NQYWdlKG5ldyBXaXphcmRQYW5lMyh0aGlzLndpemFyZEJlYW4sIHRoaXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmluaXNoKCkgewotICAgICAgICBpZiAoY3VycmVudFdpemFyZFBhbmUudmFsaWRhdGVWYWx1ZXMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBuZXcgQ29udHJvbGxlcigpLnByb2Nlc3Mod2l6YXJkQmVhbik7Ci0gICAgICAgICAgICAgICAgc2hvd1N1Y2Nlc3NNZXNzYWdlKCIgamFyIGZpbGUgY3JlYXRpb24gc3VjY2Vzc2Z1bCEgIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChQcm9jZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzaG93RXJyb3JNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZSgiVW5rbm93biBFcnJvciEgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNob3dFcnJvck1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFnZShXaXphcmRQYW5lIHBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJldkJ1dHRvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5leHRCdXR0b25TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmaW5pc2hCdXR0b25TdGF0ZSkgewotICAgICAgICB0aGlzLndpemFyZFBhbmVDb250YWluZXIucmVtb3ZlQWxsKCk7Ci0gICAgICAgIGN1cnJlbnRXaXphcmRQYW5lID0gcGFuZTsKLSAgICAgICAgdGhpcy53aXphcmRQYW5lQ29udGFpbmVyLmFkZChwYW5lKTsKLSAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvbi5zZXRFbmFibGVkKHByZXZCdXR0b25TdGF0ZSk7Ci0gICAgICAgIHRoaXMubmV4dEJ1dHRvbi5zZXRFbmFibGVkKG5leHRCdXR0b25TdGF0ZSk7Ci0gICAgICAgIHRoaXMuZmluaXNoQnV0dG9uLnNldEVuYWJsZWQoZmluaXNoQnV0dG9uU3RhdGUpOwotICAgICAgICB0aGlzLnJlcGFpbnQoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IE1haW5XaW5kb3coKS5zaG93KCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhNWE4Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5zd2luZy51aTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpemFyZFBhbmUgZXh0ZW5kcyBKUGFuZWwgewotICAgIHByb3RlY3RlZCBKVGV4dEFyZWEgZGVzY3JpcHRpb25MYWJlbDsKLSAgICBwcm90ZWN0ZWQgSkZyYW1lIG93bmVyRnJhbWU7Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGRlc2NXaWR0aCA9IDQwMDsKLSAgICBwcm90ZWN0ZWQgaW50IGRlc2NIZWlnaHQgPSAxMDA7Ci0gICAgcHJvdGVjdGVkIGludCB3aWR0aCA9IDQwMDsKLSAgICBwcm90ZWN0ZWQgaW50IGhlaWdodCA9IDMwMDsKLSAgICBwcm90ZWN0ZWQgaW50IGhnYXAgPSA1OwotICAgIHByb3RlY3RlZCBpbnQgdmdhcCA9IDU7Ci0KLSAgICBwcm90ZWN0ZWQgV2l6YXJkUGFuZSgpIHsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgV2l6YXJkUGFuZShKRnJhbWUgb3duZXJGcmFtZSkgewotICAgICAgICB0aGlzLm93bmVyRnJhbWUgPSBvd25lckZyYW1lOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXaXphcmRQYW5lKGJvb2xlYW4gaXNEb3VibGVCdWZmZXJlZCkgewotICAgICAgICBzdXBlcihpc0RvdWJsZUJ1ZmZlcmVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgV2l6YXJkUGFuZShMYXlvdXRNYW5hZ2VyIGxheW91dCkgewotICAgICAgICBzdXBlcihsYXlvdXQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBXaXphcmRQYW5lKExheW91dE1hbmFnZXIgbGF5b3V0LCBib29sZWFuIGlzRG91YmxlQnVmZmVyZWQpIHsKLSAgICAgICAgc3VwZXIobGF5b3V0LCBpc0RvdWJsZUJ1ZmZlcmVkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbkxhYmVsID0gbmV3IEpUZXh0QXJlYShkZXNjKTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbkxhYmVsLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb25MYWJlbC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRpb25MYWJlbC5zZXRBdXRvc2Nyb2xscyh0cnVlKTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdGlvbkxhYmVsLnNldEJvdW5kcygwLCAwLCBkZXNjV2lkdGgsIGRlc2NIZWlnaHQpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLmRlc2NyaXB0aW9uTGFiZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHZhbGlkYXRlVmFsdWVzKCk7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAiRXJyb3IiLAotICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBicm93c2VGb3JBRmlsZShmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSAiIjsKLSAgICAgICAgSkZpbGVDaG9vc2VyIGZjID0gbmV3IEpGaWxlQ2hvb3NlcigpOwotICAgICAgICBmYy5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRklMRVNfQU5EX0RJUkVDVE9SSUVTKTsKLSAgICAgICAgZmMuYWRkQ2hvb3NhYmxlRmlsZUZpbHRlcihuZXcgRmlsZUZpbHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKLSAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSB8fCBmLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24gKyAiIGZpbGUgZmlsdGVyICI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGludCByZXR1cm5WYWwgPSBmYy5zaG93T3BlbkRpYWxvZyh0aGlzKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgIHN0ciA9IGZjLmdldFNlbGVjdGVkRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLnRyaW0oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgYnJvd3NlRm9yQUZvbGRlcigpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9ICIiOwotICAgICAgICBKRmlsZUNob29zZXIgZmMgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIGZjLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKLSAgICAgICAgaW50IHJldHVyblZhbCA9IGZjLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgc3RyID0gZmMuZ2V0U2VsZWN0ZWRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTEuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzRhZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLnN3aW5nLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5DbGFzc0ZpbGVTZWxlY3Rpb25CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmJlYW4uV2l6YXJkQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbC5Db25zdGFudHM7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgV2l6YXJkUGFuZTEgZXh0ZW5kcyBXaXphcmRQYW5lIHsKLQotICAgIHByaXZhdGUgQ2xhc3NGaWxlU2VsZWN0aW9uQmVhbiBteUJlYW4gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBKTGFiZWwgY2xhc3NGaWxlTG9jYXRpb25MYWJlbDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgY2xhc3NGaWxlTG9jYXRpb25UZXh0Qm94OwotICAgIHByaXZhdGUgSkJ1dHRvbiBicm93c2VCdXR0b247Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZTEoV2l6YXJkQmVhbiB3aXphcmRCZWFuLCBKRnJhbWUgb3duZXJGcmFtZSkgewotCi0gICAgICAgIHN1cGVyKG93bmVyRnJhbWUpOwotCi0gICAgICAgIGluaXQoKTsKLQotICAgICAgICBpZiAod2l6YXJkQmVhbi5nZXRQYWdlMWJlYW4oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBteUJlYW4gPSB3aXphcmRCZWFuLmdldFBhZ2UxYmVhbigpOwotICAgICAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHRCb3guc2V0VGV4dChteUJlYW4uZ2V0RmlsZUxvY2F0aW9uKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXlCZWFuID0gbmV3IENsYXNzRmlsZVNlbGVjdGlvbkJlYW4oKTsKLSAgICAgICAgICAgIHdpemFyZEJlYW4uc2V0UGFnZTFiZWFuKG15QmVhbik7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gbXlCZWFuLmdldEZpbGVMb2NhdGlvbigpOwotICAgICAgICByZXR1cm4gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGgoKSA+IDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB0aGlzLnNldExheW91dChudWxsKTsKLSAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgIGluaXREZXNjcmlwdGlvbigiV2VsY29tZSB0byB0aGUgbmV3IEFYSVMgU2VydmljZSBwYWNrYWdlciBXaXphcmQgSW50ZXJmYWNlLlxuXG4gIiArCi0gICAgICAgICAgICAgICAgIkluc2VydCB0aGUgbG9jYXRpb24gZm9yIHRoZSBjbGFzcyBmaWxlcyBoZXJlLlRoaXMgc2hvdWxkIGJlIGEgZm9sZGVyIHdpdGggXG4iICsKLSAgICAgICAgICAgICAgICAiIHRoZSBjb21waWxlZCBjbGFzc2VzIik7Ci0KLQotICAgICAgICB0aGlzLmNsYXNzRmlsZUxvY2F0aW9uTGFiZWwgPSBuZXcgSkxhYmVsKCJjbGFzcyBmaWxlIGxvY2F0aW9uIik7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMuY2xhc3NGaWxlTG9jYXRpb25MYWJlbCk7Ci0gICAgICAgIHRoaXMuY2xhc3NGaWxlTG9jYXRpb25MYWJlbC5zZXRCb3VuZHMoaGdhcCwKLSAgICAgICAgICAgICAgICBkZXNjSGVpZ2h0LAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0KLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHRCb3ggPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLmNsYXNzRmlsZUxvY2F0aW9uVGV4dEJveCk7Ci0gICAgICAgIHRoaXMuY2xhc3NGaWxlTG9jYXRpb25UZXh0Qm94LnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEggKyAyICogaGdhcCwKLSAgICAgICAgICAgICAgICBkZXNjSGVpZ2h0LAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5URVhUX0JPWF9XSURUSCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgIHRoaXMuY2xhc3NGaWxlTG9jYXRpb25UZXh0Qm94LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dEJveENoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5jbGFzc0ZpbGVMb2NhdGlvblRleHRCb3guYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVRleHRCb3hDaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24gPSBuZXcgSkJ1dHRvbigiLiIpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLmJyb3dzZUJ1dHRvbik7Ci0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEggKyAyICogaGdhcCArCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkJST1dTRV9CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNsYXNzRmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KGJyb3dzZUZvckFGb2xkZXIoKSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVGV4dEJveENoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVUZXh0Qm94Q2hhbmdlKCkgewotICAgICAgICBTdHJpbmcgdGV4dCA9IGNsYXNzRmlsZUxvY2F0aW9uVGV4dEJveC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMubXlCZWFuLnNldEZpbGVMb2NhdGlvbih0ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC9zZXJ2aWNlL3N3aW5nL3VpL1dpemFyZFBhbmUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjlmZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLnN3aW5nLnVpOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5QYWdlMkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuYmVhbi5XaXphcmRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbC5zZXJ2aWNlLmNvbnRyb2wuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5jb250cm9sLlByb2Nlc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnV0aWwuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXaXphcmRQYW5lMiBleHRlbmRzIFdpemFyZFBhbmUgewotCi0gICAgcHJpdmF0ZSBXaXphcmRCZWFuIHBhcmVudEJlYW47Ci0gICAgcHJpdmF0ZSBQYWdlMkJlYW4gbXlCZWFuOwotCi0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gc2VsZWN0TWFudWFsRmlsZVJhZGlvQnV0dG9uOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGNyZWF0ZUF1dG9tYXRpY0ZpbGVSYWRpb0J1dHRvbjsKLSAgICBwcml2YXRlIEpQYW5lbCBzZWxlY3Rpb25QYW5lbDsKLQotCi0gICAgcHVibGljIFdpemFyZFBhbmUyKFdpemFyZEJlYW4gd2l6YXJkQmVhbiwgSkZyYW1lIG93bmVyRnJhbWUpIHsKLSAgICAgICAgc3VwZXIob3duZXJGcmFtZSk7Ci0KLSAgICAgICAgaW5pdCgpOwotCi0gICAgICAgIHBhcmVudEJlYW4gPSB3aXphcmRCZWFuOwotCi0gICAgICAgIGlmICh3aXphcmRCZWFuLmdldFBhZ2UyYmVhbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG15QmVhbiA9IHdpemFyZEJlYW4uZ2V0UGFnZTJiZWFuKCk7Ci0gICAgICAgICAgICAvL3NldCB0aGUgaW5pdGlhbCBzZXR0aW5ncyBmcm9tIHRoZSBiZWFuCi0gICAgICAgICAgICBzZXRCZWFuVmFsdWVzKCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG15QmVhbiA9IG5ldyBQYWdlMkJlYW4oKTsKLSAgICAgICAgICAgIHdpemFyZEJlYW4uc2V0UGFnZTJiZWFuKG15QmVhbik7Ci0gICAgICAgICAgICBzZXREZWZhdWx0VmFsdWVzKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJlYW5WYWx1ZXMoKSB7Ci0gICAgICAgIGlmIChteUJlYW4uaXNNYW51YWwoKSkgewotICAgICAgICAgICAgdGhpcy5zZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24uc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICBsb2FkU2NyZWVuKG5ldyBNYW51YWxTZWxlY3Rpb25QYW5lbCh0cnVlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmNyZWF0ZUF1dG9tYXRpY0ZpbGVSYWRpb0J1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgICAgIGxvYWRTY3JlZW4obmV3IEF1dG9tYXRpY1NlbGVjdGlvblBhbmVsKHRydWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7Ci0gICAgICAgIFN0cmluZyB0ZXh0MiA9ICIiOwotICAgICAgICBib29sZWFuIHJldHVyblZhbHVlID0gZmFsc2U7Ci0gICAgICAgIGlmIChteUJlYW4uaXNNYW51YWwoKSkgewotICAgICAgICAgICAgdGV4dCA9IG15QmVhbi5nZXRNYW51YWxGaWxlTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSAodGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZXh0ID0gbXlCZWFuLmdldEF1dG9tYXRpY0NsYXNzTmFtZSgpOwotICAgICAgICAgICAgdGV4dDIgPSBteUJlYW4uZ2V0UHJvdmlkZXJDbGFzc05hbWUoKTsKLSAgICAgICAgICAgIHJldHVyblZhbHVlID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGgoKSA+IDApICYmCi0gICAgICAgICAgICAgICAgICAgICh0ZXh0MiAhPSBudWxsICYmIHRleHQyLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB0aGlzLnNldExheW91dChudWxsKTsKLSAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgIGluaXREZXNjcmlwdGlvbigiXG4gU2VsZWN0IGVpdGhlciB0aGUgc2VydmljZSB4bWwgZmlsZSBvciB0aGUgY2xhc3MgdGhhdCB5b3Ugd2FudCB0byBcbiAiICsKLSAgICAgICAgICAgICAgICAiIGV4cG9zZSBhcyB0aGUgc2VydmljZSB0byBhdXRvIGdlbmVyYXRlIGEgc2VydmljZS54bWwuIFxuICIgKwotICAgICAgICAgICAgICAgICIgT25seSB0aGUgY2xhc3MgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgbG9jYXRpb24gY2FuXG4iICsKLSAgICAgICAgICAgICAgICAiIGJlIGxhZGVkIGZyb20gaGVyZSIpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIGdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLSAgICAgICAgdGhpcy5zZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24gPQotICAgICAgICAgICAgICAgIG5ldyBKUmFkaW9CdXR0b24oIlNlbGVjdCBhIGZpbGUgbWFudWFsbHkiKTsKLSAgICAgICAgdGhpcy5zZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24uc2V0Qm91bmRzKGhnYXAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuUkFESU9fQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5zZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24pOwotICAgICAgICBncm91cC5hZGQoc2VsZWN0TWFudWFsRmlsZVJhZGlvQnV0dG9uKTsKLSAgICAgICAgdGhpcy5zZWxlY3RNYW51YWxGaWxlUmFkaW9CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VTZWxlY3Rpb25TY3JlZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuY3JlYXRlQXV0b21hdGljRmlsZVJhZGlvQnV0dG9uID0KLSAgICAgICAgICAgICAgICBuZXcgSlJhZGlvQnV0dG9uKCJDcmVhdGUgYSBmaWxlIGF1dG9tYXRpY2FsbHkiKTsKLSAgICAgICAgdGhpcy5jcmVhdGVBdXRvbWF0aWNGaWxlUmFkaW9CdXR0b24uc2V0Qm91bmRzKGhnYXAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCArIHZnYXAgKyBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuUkFESU9fQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5jcmVhdGVBdXRvbWF0aWNGaWxlUmFkaW9CdXR0b24pOwotICAgICAgICBncm91cC5hZGQoY3JlYXRlQXV0b21hdGljRmlsZVJhZGlvQnV0dG9uKTsKLSAgICAgICAgdGhpcy5jcmVhdGVBdXRvbWF0aWNGaWxlUmFkaW9CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VTZWxlY3Rpb25TY3JlZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5zZWxlY3Rpb25QYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgdGhpcy5zZWxlY3Rpb25QYW5lbC5zZXRMYXlvdXQobnVsbCk7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uUGFuZWwuc2V0Qm91bmRzKDAsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCArIDIgKiBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArCi0gICAgICAgICAgICAgICAgMiAqIHZnYXAsCi0gICAgICAgICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgMTAwKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5zZWxlY3Rpb25QYW5lbCk7Ci0KLSAgICAgICAgLy9zZWxlY3QgbWFudWFsIG9wdGlvbiBieSBkZWZhdWx0Ci0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0VmFsdWVzKCkgewotICAgICAgICB0aGlzLnNlbGVjdE1hbnVhbEZpbGVSYWRpb0J1dHRvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgbG9hZFNjcmVlbihuZXcgTWFudWFsU2VsZWN0aW9uUGFuZWwoKSk7Ci0gICAgICAgIHVwZGF0ZUJlYW5GbGFncyh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hhbmdlU2VsZWN0aW9uU2NyZWVuKCkgewotICAgICAgICBpZiAoc2VsZWN0TWFudWFsRmlsZVJhZGlvQnV0dG9uLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgbG9hZFNjcmVlbihuZXcgTWFudWFsU2VsZWN0aW9uUGFuZWwodHJ1ZSkpOwotICAgICAgICAgICAgdXBkYXRlQmVhbkZsYWdzKHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9hZFNjcmVlbihuZXcgQXV0b21hdGljU2VsZWN0aW9uUGFuZWwodHJ1ZSkpOwotICAgICAgICAgICAgdXBkYXRlQmVhbkZsYWdzKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCZWFuRmxhZ3MoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIG15QmVhbi5zZXRNYW51YWwoZmxhZyk7Ci0gICAgICAgIG15QmVhbi5zZXRBdXRvbWF0aWMoIWZsYWcpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBsb2FkU2NyZWVuKEpQYW5lbCBwYW5lbCkgewotICAgICAgICB0aGlzLnNlbGVjdGlvblBhbmVsLnJlbW92ZUFsbCgpOwotICAgICAgICB0aGlzLnNlbGVjdGlvblBhbmVsLmFkZChwYW5lbCk7Ci0gICAgICAgIHRoaXMucmVwYWludCgpOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNYW51YWxTZWxlY3Rpb25QYW5lbCBleHRlbmRzIEpQYW5lbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgc2VydmVyWE1MRmlsZUxvY2F0aW9uTGFiZWw7Ci0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCBzZXJ2ZXJYTUxGaWxlTG9jYXRpb25UZXh0Qm94OwotICAgICAgICBwcml2YXRlIEpCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0gICAgICAgIHB1YmxpYyBNYW51YWxTZWxlY3Rpb25QYW5lbCgpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNYW51YWxTZWxlY3Rpb25QYW5lbChib29sZWFuIGxvYWRWYWxzKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgICAgICBpZiAobG9hZFZhbHMpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3guc2V0VGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG15QmVhbi5nZXRNYW51YWxGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXQobnVsbCk7Ci0gICAgICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIDEwMCk7Ci0KLSAgICAgICAgICAgIHRoaXMuc2VydmVyWE1MRmlsZUxvY2F0aW9uTGFiZWwgPSBuZXcgSkxhYmVsKCJTZXJ2aWNlIEZpbGUiKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuc2VydmVyWE1MRmlsZUxvY2F0aW9uTGFiZWwpOwotICAgICAgICAgICAgdGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25MYWJlbC5zZXRCb3VuZHMoaGdhcCwKLSAgICAgICAgICAgICAgICAgICAgdmdhcCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0KLSAgICAgICAgICAgIHRoaXMuc2VydmVyWE1MRmlsZUxvY2F0aW9uVGV4dEJveCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3gpOwotICAgICAgICAgICAgdGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25UZXh0Qm94LnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAsCi0gICAgICAgICAgICAgICAgICAgIHZnYXAsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5URVhUX0JPWF9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25UZXh0Qm94LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRPdXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgdGhpcy5zZXJ2ZXJYTUxGaWxlTG9jYXRpb25UZXh0Qm94LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUeXBlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRPdXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCIuIik7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmJyb3dzZUJ1dHRvbik7Ci0gICAgICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5zZXRCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwICsKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgICAgICB2Z2FwLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuQlJPV1NFX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5icm93c2VCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlclhNTEZpbGVMb2NhdGlvblRleHRCb3guc2V0VGV4dChicm93c2VGb3JBRmlsZSgieG1sIikpOwotICAgICAgICAgICAgICAgICAgICBzZXRPdXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0T3V0RmlsZU5hbWUoKSB7Ci0gICAgICAgICAgICBteUJlYW4uc2V0TWFudWFsRmlsZU5hbWUoc2VydmVyWE1MRmlsZUxvY2F0aW9uVGV4dEJveC5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBBdXRvbWF0aWNTZWxlY3Rpb25QYW5lbCBleHRlbmRzIEpQYW5lbCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBKTGFiZWwgY2xhc3NGaWxlTGlzdExhYmxlOwotICAgICAgICBwcml2YXRlIEpMYWJlbCBwcm92aWRlckNsYXNzTGFibGU7Ci0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCBjbGFzc0ZpbGVOYW1lVGV4dEJveDsKLSAgICAgICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveDsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGxvYWRCdXR0b247Ci0gICAgICAgIHByaXZhdGUgSkJ1dHRvbiBhZHZhbmNlZEJ1dHRvbjsKLQotICAgICAgICBwdWJsaWMgQXV0b21hdGljU2VsZWN0aW9uUGFuZWwoKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQXV0b21hdGljU2VsZWN0aW9uUGFuZWwoYm9vbGVhbiBsb2FkVmFscykgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICAgICAgaWYgKGxvYWRWYWxzKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5jbGFzc0ZpbGVOYW1lVGV4dEJveC5zZXRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgbXlCZWFuLmdldEF1dG9tYXRpY0NsYXNzTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveC5zZXRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgbXlCZWFuLmdldFByb3ZpZGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgICAgICB0aGlzLnNldExheW91dChudWxsKTsKLSAgICAgICAgICAgIHRoaXMuc2V0U2l6ZSh3aWR0aCwgMTAwKTsKLQotICAgICAgICAgICAgdGhpcy5jbGFzc0ZpbGVMaXN0TGFibGUgPSBuZXcgSkxhYmVsKCJDbGFzcyBOYW1lIik7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmNsYXNzRmlsZUxpc3RMYWJsZSk7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzRmlsZUxpc3RMYWJsZS5zZXRCb3VuZHMoaGdhcCwKLSAgICAgICAgICAgICAgICAgICAgdmdhcCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0KLSAgICAgICAgICAgIHRoaXMuY2xhc3NGaWxlTmFtZVRleHRCb3ggPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5jbGFzc0ZpbGVOYW1lVGV4dEJveCk7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzRmlsZU5hbWVUZXh0Qm94LnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRIICsgMiAqIGhnYXAsCi0gICAgICAgICAgICAgICAgICAgIHZnYXAsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5URVhUX0JPWF9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5jbGFzc0ZpbGVOYW1lVGV4dEJveC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0aGlzLmNsYXNzRmlsZU5hbWVUZXh0Qm94LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUeXBlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBzZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgdGhpcy5wcm92aWRlckNsYXNzTGFibGUgPSBuZXcgSkxhYmVsKCJQcm92aWRlciBDbGFzcyBOYW1lIik7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnByb3ZpZGVyQ2xhc3NMYWJsZSk7Ci0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NMYWJsZS5zZXRCb3VuZHMoaGdhcCwKLSAgICAgICAgICAgICAgICAgICAgKENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsgdmdhcCksCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotCi0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveCk7Ci0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveC5zZXRCb3VuZHMoCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwLAotICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQgKyB2Z2FwICogMiksCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5URVhUX0JPWF9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5wcm92aWRlckNsYXNzTmFtZVRleHRCb3guYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFByb3ZpZGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0aGlzLnByb3ZpZGVyQ2xhc3NOYW1lVGV4dEJveC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvdmlkZXJDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgdGhpcy5sb2FkQnV0dG9uID0gbmV3IEpCdXR0b24oIkxvYWQiKTsKLSAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMubG9hZEJ1dHRvbik7Ci0gICAgICAgICAgICB0aGlzLmxvYWRCdXR0b24uc2V0Qm91bmRzKGhnYXAsIChDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArCi0gICAgICAgICAgICAgICAgICAgIHZnYXApICoKLSAgICAgICAgICAgICAgICAgICAgMiArCi0gICAgICAgICAgICAgICAgICAgIHZnYXAsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgdGhpcy5sb2FkQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBsb2FkQWxsTWV0aG9kcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgdGhpcy5hZHZhbmNlZEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJBZHZhbmNlZCIpOwotICAgICAgICAgICAgdGhpcy5hZGQodGhpcy5hZHZhbmNlZEJ1dHRvbik7Ci0gICAgICAgICAgICB0aGlzLmFkdmFuY2VkQnV0dG9uLnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgMiAqIGhnYXAgKyBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9CVVRUT05fV0lEVEgKLSAgICAgICAgICAgICAgICAgICAgLCAoQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQgKyB2Z2FwKSAqIDIgKwotICAgICAgICAgICAgICAgICAgICB2Z2FwLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZW5EaWFsb2coKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHRoaXMuYWR2YW5jZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbG9hZEFsbE1ldGhvZHMoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBtZXRob2RMaXN0ID0gbmV3IENvbnRyb2xsZXIoKS5nZXRNZXRob2RMaXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QmVhbik7Ci0gICAgICAgICAgICAgICAgbXlCZWFuLnNldFNlbGVjdGVkTWV0aG9kTmFtZXMobWV0aG9kTGlzdCk7Ci0gICAgICAgICAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBhZHZhbmNlZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgb3BlbkRpYWxvZygpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbmV3IEFkdmFuY2VkU2VsZWN0aW9uRGlhbG9nKCkuc2hvdygpOwotICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2hvd0Vycm9yTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0Q2xhc3NOYW1lKCkgewotICAgICAgICAgICAgbG9hZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBteUJlYW4uc2V0QXV0b21hdGljQ2xhc3NOYW1lKGNsYXNzRmlsZU5hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0UHJvdmlkZXJDbGFzc05hbWUoKSB7Ci0gICAgICAgICAgICAvL2xvYWRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIC8vYWR2YW5jZWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBteUJlYW4uc2V0UHJvdmlkZXJDbGFzc05hbWUocHJvdmlkZXJDbGFzc05hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgICAgIH0KLQotCi0gICAgfQotCi0KLSAgICBwcml2YXRlIGNsYXNzIEFkdmFuY2VkU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0KLSAgICAgICAgcHJpdmF0ZSBKUGFuZWwgbGFibGVQYW5lbDsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIG9rQnV0dG9uOwotICAgICAgICBwcml2YXRlIEpCdXR0b24gY2FuY2VsQnV0dG9uOwotICAgICAgICBwcml2YXRlIGJvb2xlYW5bXSBzZWxlY3RlZFZhbHVlczsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3QgY29tcGxldGVNZXRob2RMaXN0OwotCi0KLSAgICAgICAgcHVibGljIEFkdmFuY2VkU2VsZWN0aW9uRGlhbG9nKCkgdGhyb3dzIEhlYWRsZXNzRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIFByb2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHN1cGVyLnNldE1vZGFsKHRydWUpOwotICAgICAgICAgICAgc3VwZXIuc2V0VGl0bGUoIlNlbGVjdCBNZXRob2RzIik7Ci0gICAgICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG51bGwpOwotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgUHJvY2Vzc0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvL2xvYWQgdGhlIGNsYXNzIGZpbGUgbGlzdAotICAgICAgICAgICAgdGhpcy5jb21wbGV0ZU1ldGhvZExpc3QgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29udHJvbGxlcigpLmdldE1ldGhvZExpc3QocGFyZW50QmVhbik7Ci0gICAgICAgICAgICBpbnQgbWV0aG9kQ291bnQgPSB0aGlzLmNvbXBsZXRlTWV0aG9kTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICBpbnQgcGFuZWxIZWlnaHQgPSBtZXRob2RDb3VudCAqCi0gICAgICAgICAgICAgICAgICAgIChDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArIHZnYXApOwotCi0gICAgICAgICAgICB0aGlzLmxhYmxlUGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0gICAgICAgICAgICB0aGlzLmxhYmxlUGFuZWwuc2V0TGF5b3V0KG51bGwpOwotICAgICAgICAgICAgdGhpcy5sYWJsZVBhbmVsLnNldEJvdW5kcygwLCAwLCB3aWR0aCwgcGFuZWxIZWlnaHQpOwotICAgICAgICAgICAgdGhpcy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmxhYmxlUGFuZWwpOwotCi0gICAgICAgICAgICBBcnJheUxpc3QgY3VycmVudFNlbGVjdGVkTGlzdCA9IG15QmVhbi5nZXRTZWxlY3RlZE1ldGhvZE5hbWVzKCk7Ci0gICAgICAgICAgICAvL2NyZWF0ZSBjaGVjayBib3hlcyBmb3IgYWxsIHRoZSBtZXRob2RzIGFuZCBhZGQgdGhlbSB0byB0aGUgcGFuZWwKLSAgICAgICAgICAgIEpDaGVja0JveCB0ZW1wQ2hlY2tCb3g7Ci0gICAgICAgICAgICBib29sZWFuIGN1cnJlbnRTZWxlY3Rpb247Ci0gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gbmV3IGJvb2xlYW5bbWV0aG9kQ291bnRdOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICB0ZW1wQ2hlY2tCb3ggPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEpDaGVja0JveCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZU1ldGhvZExpc3QuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkTGlzdC5jb250YWlucygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wbGV0ZU1ldGhvZExpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICB0ZW1wQ2hlY2tCb3guc2V0U2VsZWN0ZWQoY3VycmVudFNlbGVjdGlvbik7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXNbaV0gPSBjdXJyZW50U2VsZWN0aW9uOwotICAgICAgICAgICAgICAgIHRlbXBDaGVja0JveC5zZXRCb3VuZHMoaGdhcCwgdmdhcCArCi0gICAgICAgICAgICAgICAgICAgICAgICAoQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQgKyB2Z2FwKSAqIGksCi0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuTEFCRUxfV0lEVEggKiAzLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQ09NUF9IRUlHSFQpOwotICAgICAgICAgICAgICAgIHRlbXBDaGVja0JveC5hZGRBY3Rpb25MaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaGVja0JveEFjdGlvbkxpc3RuZXIodGVtcENoZWNrQm94LCBpKSk7Ci0gICAgICAgICAgICAgICAgdGhpcy5sYWJsZVBhbmVsLmFkZCh0ZW1wQ2hlY2tCb3gpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9rQnV0dG9uID0gbmV3IEpCdXR0b24oIk9LIik7Ci0gICAgICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMub2tCdXR0b24pOwotICAgICAgICAgICAgdGhpcy5va0J1dHRvbi5zZXRCb3VuZHMoaGdhcCwgcGFuZWxIZWlnaHQgKyB2Z2FwLAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgICAgIHRoaXMub2tCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRWYWx1ZXNUb0JlYW4oKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VNZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBjYW5jZWxCdXR0b24gPSBuZXcgSkJ1dHRvbigiQ2FuY2VsIik7Ci0gICAgICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuY2FuY2VsQnV0dG9uKTsKLSAgICAgICAgICAgIHRoaXMuY2FuY2VsQnV0dG9uLnNldEJvdW5kcygKLSAgICAgICAgICAgICAgICAgICAgaGdhcCAqIDIgKyBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9CVVRUT05fV0lEVEgsIHBhbmVsSGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgdmdhcCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkdFTkVSQUxfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgICAgICB0aGlzLmNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VNZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHBhbmVsSGVpZ2h0ICsKLSAgICAgICAgICAgICAgICAgICAgMiAqIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUICsKLSAgICAgICAgICAgICAgICAgICAgMzApOwotICAgICAgICAgICAgdGhpcy5zZXRSZXNpemFibGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNlbGVjdGlvbihKQ2hlY2tCb3ggY2hlY2tCb3gsIGludCBpbmRleCkgewotICAgICAgICAgICAgaWYgKGNoZWNrQm94LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzW2luZGV4XSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzW2luZGV4XSA9IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbG9hZFZhbHVlc1RvQmVhbigpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBtb2RpZmllZE1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVmFsdWVzW2ldKQotICAgICAgICAgICAgICAgICAgICBtb2RpZmllZE1ldGhvZExpc3QuYWRkKGNvbXBsZXRlTWV0aG9kTGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBteUJlYW4uc2V0U2VsZWN0ZWRNZXRob2ROYW1lcyhtb2RpZmllZE1ldGhvZExpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlTWUoKSB7Ci0gICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQ2hlY2tCb3hBY3Rpb25MaXN0bmVyIGltcGxlbWVudHMgQWN0aW9uTGlzdGVuZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hlY2tCb3g7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBpbmRleDsKLQotICAgICAgICAgICAgcHVibGljIENoZWNrQm94QWN0aW9uTGlzdG5lcihKQ2hlY2tCb3ggY2hlY2tCb3gsIGludCBpbmRleCkgewotICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQm94ID0gY2hlY2tCb3g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0aW9uKGNoZWNrQm94LCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMy5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29sL3NlcnZpY2Uvc3dpbmcvdWkvV2l6YXJkUGFuZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRiMDVhOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvc2VydmljZS9zd2luZy91aS9XaXphcmRQYW5lMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2Uuc3dpbmcudWk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLlBhZ2UzQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wuc2VydmljZS5iZWFuLldpemFyZEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnV0aWwuQ29uc3RhbnRzOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5LZXlMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFdpemFyZFBhbmUzIGV4dGVuZHMgV2l6YXJkUGFuZSB7Ci0KLSAgICBwcml2YXRlIFBhZ2UzQmVhbiBteUJlYW47Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBvdXRwdXRGaWxlTG9jYXRpb25MYWJlbDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBKTGFiZWwgb3V0cHV0RmlsZU5hbWVMYWJlbDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgb3V0cHV0RmlsZU5hbWVUZXh0Qm94OwotCi0gICAgcHVibGljIFdpemFyZFBhbmUzKFdpemFyZEJlYW4gYmVhbiwgSkZyYW1lIG93bmVyRnJhbWUpIHsKLSAgICAgICAgc3VwZXIob3duZXJGcmFtZSk7Ci0gICAgICAgIGluaXQoKTsKLSAgICAgICAgaWYgKGJlYW4uZ2V0UGFnZTNiZWFuKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5teUJlYW4gPSBiZWFuLmdldFBhZ2UzYmVhbigpOwotICAgICAgICAgICAgc2V0QmVhblZhbHVlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5teUJlYW4gPSBuZXcgUGFnZTNCZWFuKCk7Ci0gICAgICAgICAgICBiZWFuLnNldFBhZ2UzYmVhbihteUJlYW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0MSA9IG15QmVhbi5nZXRPdXRwdXRGaWxlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdGV4dDIgPSBteUJlYW4uZ2V0T3V0cHV0Rm9sZGVyTmFtZSgpOwotICAgICAgICBib29sZWFuIHRleHQxVmFsaWRpdHkgPSAodGV4dDEgIT0gbnVsbCAmJiB0ZXh0MS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLSAgICAgICAgYm9vbGVhbiB0ZXh0MlZhbGlkaXR5ID0gKHRleHQyICE9IG51bGwgJiYgdGV4dDIudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0KLSAgICAgICAgcmV0dXJuIHRleHQxVmFsaWRpdHkgJiYgdGV4dDJWYWxpZGl0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0QmVhblZhbHVlcygpIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LnNldFRleHQobXlCZWFuLmdldE91dHB1dEZvbGRlck5hbWUoKSk7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZU5hbWVUZXh0Qm94LnNldFRleHQobXlCZWFuLmdldE91dHB1dEZpbGVOYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB0aGlzLnNldExheW91dChudWxsKTsKLSAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCi0gICAgICAgIGluaXREZXNjcmlwdGlvbigiXG5JbnB1dCB0aGUgbG9jYXRpb24gZm9yIHRoZSBvdXRwdXQgZmlsZSBhbmQgdGhlIG5hbWUgZm9yIFxuIiArCi0gICAgICAgICAgICAgICAgInRoZSBjb21waWxlZCBqYXIgZmlsZSAiKTsKLQotCi0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uTGFiZWwgPSBuZXcgSkxhYmVsKCJPdXRwdXQgRm9sZGVyIik7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uTGFiZWwpOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvbkxhYmVsLnNldEJvdW5kcyhoZ2FwLAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLQotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3ggPSBuZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0aGlzLmFkZCh0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3gpOwotICAgICAgICB0aGlzLm91dHB1dEZpbGVMb2NhdGlvblRleHRCb3guc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwLAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlTG9jYXRpb25DaGFuZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMub3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUeXBlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxvY2F0aW9uQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLQotICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKCIuIik7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMuYnJvd3NlQnV0dG9uKTsKLSAgICAgICAgdGhpcy5icm93c2VCdXR0b24uc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwICsKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuVEVYVF9CT1hfV0lEVEgsCi0gICAgICAgICAgICAgICAgZGVzY0hlaWdodCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuQlJPV1NFX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCk7Ci0gICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RmlsZUxvY2F0aW9uVGV4dEJveC5zZXRUZXh0KGJyb3dzZUZvckFGb2xkZXIoKSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlTG9jYXRpb25DaGFuZ2UoKTsKLQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotCi0gICAgICAgIHRoaXMub3V0cHV0RmlsZU5hbWVMYWJlbCA9IG5ldyBKTGFiZWwoIk91dCBGaWxlIE5hbWUiKTsKLSAgICAgICAgdGhpcy5hZGQodGhpcy5vdXRwdXRGaWxlTmFtZUxhYmVsKTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZUxhYmVsLnNldEJvdW5kcyhoZ2FwLAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQgKyBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArIHZnYXAsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLkxBQkVMX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLQotICAgICAgICB0aGlzLm91dHB1dEZpbGVOYW1lVGV4dEJveCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHRoaXMuYWRkKHRoaXMub3V0cHV0RmlsZU5hbWVUZXh0Qm94KTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guc2V0Qm91bmRzKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5MQUJFTF9XSURUSCArIDIgKiBoZ2FwLAotICAgICAgICAgICAgICAgIGRlc2NIZWlnaHQgKyBDb25zdGFudHMuVUlDb25zdGFudHMuR0VORVJBTF9DT01QX0hFSUdIVCArIHZnYXAsCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlVJQ29uc3RhbnRzLlRFWFRfQk9YX1dJRFRILAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VSUNvbnN0YW50cy5HRU5FUkFMX0NPTVBfSEVJR0hUKTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVGaWxlTmFtZUNoYW5nZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZVRleHRCb3guYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5VHlwZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUZpbGVOYW1lQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUxvY2F0aW9uQ2hhbmdlKCkgewotICAgICAgICBteUJlYW4uc2V0T3V0cHV0Rm9sZGVyTmFtZShvdXRwdXRGaWxlTG9jYXRpb25UZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZpbGVOYW1lQ2hhbmdlKCkgewotICAgICAgICBteUJlYW4uc2V0T3V0cHV0RmlsZU5hbWUob3V0cHV0RmlsZU5hbWVUZXh0Qm94LmdldFRleHQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvdXRpbC9Db25zdGFudHMuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC91dGlsL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjM5Njk5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC91dGlsL0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbDsKLQotcHVibGljIGNsYXNzIENvbnN0YW50cyB7Ci0gICAgcHVibGljIGNsYXNzIFVJQ29uc3RhbnRzewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQUJFTF9XSURUSD0xMDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBRElPX0JVVFRPTl9XSURUSD0yMDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfQk9YX1dJRFRIPTI1MDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPV1NFX0JVVFRPTl9XSURUSD0yMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTF9CVVRUT05fV0lEVEg9ODA7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTF9DT01QX0hFSUdIVD0yMDsKLSAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGNsYXNzIFNlcnZpY2VDb25zdGFudHN7Ci0gICAgCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX0ZPTERFUj0icmVzb3VyY2VzIjsJCQkJCQkKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRVNfWFNEX1NDSEVNQV9OQU1FPSJzZXJ2aWNlcy54c2QiOwkJCQkKLSAgICAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NDSEVNQT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2wvdXRpbC9TZXJ2aWNlUGx1Z2luVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC91dGlsL1NlcnZpY2VQbHVnaW5VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWM4MmZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItZWNsaXBzZS1zZXJ2aWNlLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbC91dGlsL1NlcnZpY2VQbHVnaW5VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLQ0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWE7DQotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYUZhY3Rvcnk7DQotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlZhbGlkYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29sLnNlcnZpY2UuZWNsaXBzZS5wbHVnaW4uU2VydmljZUFyY2hpdmVyOw0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2wudXRpbC5Db25zdGFudHMuU2VydmljZUNvbnN0YW50czsNCi0NCi1wdWJsaWMgY2xhc3MgU2VydmljZVBsdWdpblV0aWxzIHsNCi0JLyoqDQotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4geG1sIGZpbGUgYWdhaW5zdCB0aGUgYXhpczIgc2VydmljZXMgc2NoZW1hLiANCi0JICogQHJldHVybiByZXR1cm4gdHJ1ZSBpZiB0aGUgeG1sIGlzIHZhbGlkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXJ2aWNlc1hNTFZhbGlkKFN0cmluZyBzZXJ2aWNlc1htbFBhdGgpew0KLSAgICAgICAgU2NoZW1hRmFjdG9yeSBmYWN0b3J5ID0gDQotICAgICAgICAgICAgU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShTZXJ2aWNlQ29uc3RhbnRzLlhNTF9TQ0hFTUEpOw0KLSAgICAgICAgDQotICAgICAgICB0cnkgew0KLSAgICAgICAgCVN0cmluZyByZXNvdXJjZVBhdGg9YWRkQW5vdGhlck5vZGVUb1BhdGgoDQotICAgICAgICAJCQlTZXJ2aWNlQ29uc3RhbnRzLlJFU09VUkNFX0ZPTERFUiwgU2VydmljZUNvbnN0YW50cy5TRVJWSUNFU19YU0RfU0NIRU1BX05BTUUpOw0KLSAgICAgICAgICAgIFNjaGVtYSBzY2hlbWEgPSBmYWN0b3J5Lm5ld1NjaGVtYSgNCi0gICAgICAgICAgICAJCSBTZXJ2aWNlQXJjaGl2ZXIuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHJlc291cmNlUGF0aCkpOw0KLSAgICAgICAgICAgIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBzY2hlbWEubmV3VmFsaWRhdG9yKCk7DQotICAgICAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IEZpbGUoc2VydmljZXNYbWxQYXRoKSk7DQotICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHNvdXJjZSk7DQotICAgICAgICAgICAgcmV0dXJuIHRydWU7DQotICAgICAgICB9DQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgfSAgDQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEFub3RoZXJOb2RlVG9QYXRoKFN0cmluZyBjdXJyZW50UGF0aCwgU3RyaW5nIG5ld05vZGUpIHsNCi0JCXJldHVybiBjdXJyZW50UGF0aCArIEZpbGUuc2VwYXJhdG9yICsgbmV3Tm9kZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL2lkZWEtcGx1Z2luLWFzZWVtYmx5LnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vaWRlYS1wbHVnaW4tYXNlZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2QzNTc1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vaWRlYS1wbHVnaW4tYXNlZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCEtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0+DQotDQotPGFzc2VtYmx5Pg0KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5Pg0KLSAgICA8Zm9ybWF0cz4NCi0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotICAgIDwvZm9ybWF0cz4NCi0gICAgPGZpbGVTZXRzPg0KLSAgICAgICAgPGZpbGVTZXQ+DQotICAgICAgICAgICAgPGRpcmVjdG9yeT4uL3RhcmdldC9jbGFzc2VzPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAJPC9maWxlU2V0Pg0KLSAgICAgICAgPGZpbGVTZXQ+DQotICAgICAgICAgICAgPGRpcmVjdG9yeT4uL3RhcmdldC9jbGFzc2VzL01FVEEtSU5GPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5NRVRBLUlORjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgCTwvZmlsZVNldD4NCi0gICAgPC9maWxlU2V0cz4NCi0JPGRlcGVuZGVuY3lTZXRzPg0KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+DQotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUud3MuY29tbW9ucy5heGlvbTpheGlvbS1hcGk6amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLndzLmNvbW1vbnMuYXhpb206YXhpb20tZG9tOmphcjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS53cy5jb21tb25zLmF4aW9tOmF4aW9tLWltcGw6amFyPC9pbmNsdWRlPiAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmNvZGVoYXVzLndvb2RzdG94OndzdHgtYXNsOmphcjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5uZWV0aGk6bmVldGhpOmphcjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+c3RheDpzdGF4LWFwaTpqYXI8L2luY2x1ZGU+ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLnhtbGJlYW5zOnhtbGJlYW5zOmphcjwvaW5jbHVkZT4NCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTpYbWxTY2hlbWE6amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5sb2c0ajpsb2c0ajpqYXI8L2luY2x1ZGU+DQotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUud29kZW46d29kZW46amFyPC9pbmNsdWRlPiAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5jb21tb25zLWxvZ2dpbmc6Y29tbW9ucy1sb2dnaW5nOmphcjwvaW5jbHVkZT4gICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5hbnQ6YW50OmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItY29kZWdlbjpqYXI8L2luY2x1ZGU+DQotCQk8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWtlcm5lbDpqYXI8L2luY2x1ZGU+DQotCQk8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWFkYjpqYXI8L2luY2x1ZGU+DQotCQk8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWFkYi1jb2RlZ2VuOmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItamF2YTJ3c2RsOmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPm9yZy5hcGFjaGUuZ2Vyb25pbW8uc3BlY3M6Z2Vyb25pbW8tamF2YW1haWxfMS40X3NwZWM6amFyPC9pbmNsdWRlPg0KLQkJPGluY2x1ZGU+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczpnZXJvbmltby1hY3RpdmF0aW9uXzEuMV9zcGVjOmphcjwvaW5jbHVkZT4NCi0JCTxpbmNsdWRlPndzZGw0ajp3c2RsNGo6amFyPC9pbmNsdWRlPg0KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+DQotCTwvZGVwZW5kZW5jeVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL01FVEEtSU5GL3BsdWdpbi54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9NRVRBLUlORi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWYwMGViLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL01FVEEtSU5GL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSBpZGVhLXBsdWdpbiBQVUJMSUMgIlBsdWdpbi9EVEQiICJodHRwOi8vcGx1Z2lucy5pbnRlbGxpai5uZXQvcGx1Z2luLmR0ZCI+Ci08IS0tPGlkZWEtcGx1Z2luPi0tPgotPGlkZWEtcGx1Z2luIHVybD0iaHR0cDovL3d3dy5hcGFjaGUub3JnL35kZWVwYWwiPgotCi0gICAgPCEtLSBQbHVnaW4gbmFtZSAtLT4KLSAgICA8bmFtZT5BeGlzMiBJREVBIHRvb2xzPC9uYW1lPgotCi0gICAgPCEtLSBEZXNjcmlwdGlvbiAtLT4KLSAgICA8ZGVzY3JpcHRpb24+U2VydmljZSBBcmNoaXZlIGNyZWF0aW9uIGFuZCBDb2RlZ2VuYXJhdGlvbjwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tIFBsdWdpbiB2ZXJzaW9uIC0tPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLQotICAgIDwhLS0gUGx1Z2luJ3MgdmVuZG9yIC0tPgotICAgIDwhLS0gIDx2ZW5kb3IgbG9nbz0iL2dlbmVyYWwvaWpMb2dvLnBuZyI+SW50ZWxsaUo8L3ZlbmRvcj4tLT4KLSAgICA8dmVuZG9yIGVtYWlsPSJkZWVwYWxAYXBhY2hlLm9yZyI+RGVlcGFsIEpheWFzaW5naGU8L3ZlbmRvcj4KLQotICAgIDwhLS0gdGhlIElERUEgYnVpbGQgbnVtYmVyIHdoaWNoIHdvcmtzIHdpdGggcGx1Z2luIC0tPgotICAgIDxpZGVhLXZlcnNpb24gc2luY2UtYnVpbGQ9IjIwMDAiLz4KLQotICAgIDwhLS0gUGx1Z2luJ3MgYXBwbGljYXRpb24gY29tcG9uZW50cyAtLT4KLSAgICA8YXBwbGljYXRpb24tY29tcG9uZW50cz4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDwhLS0gQ29tcG9uZW50J3MgaW1wbGVtZW50YXRpb24gY2xhc3MgLS0+Ci0gICAgICAgICAgICA8aW1wbGVtZW50YXRpb24tY2xhc3M+b3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMklkZWFQbHVnaW4KLSAgICAgICAgICAgIDwvaW1wbGVtZW50YXRpb24tY2xhc3M+Ci0KLSAgICAgICAgICAgIDwhLS0gQ29tcG9uZW50J3MgaW50ZXJmYWNlIGNsYXNzIC0tPgotICAgICAgICAgICAgPGludGVyZmFjZS1jbGFzcz5vcmcuYXBhY2hlLmlkZWFwbHVnaW4ucGx1Z2luLkF4aXMySWRlYVBsdWdpbjwvaW50ZXJmYWNlLWNsYXNzPgotICAgICAgICA8L2NvbXBvbmVudD4KLSAgICA8L2FwcGxpY2F0aW9uLWNvbXBvbmVudHM+Ci0gICAgPCEtLSBDb21wb25lbnQncyBhY3Rpb25zIC0tPgotICAgIDxhY3Rpb25zPgotICAgICAgICA8IS0tIFdlIHVzZSAiUGx1Z2luTmFtZS5Db21wb25lbnROYW1lLkFjdGlvbk5hbWUiIG5vdGF0aW9uIGZvciAiaWQiIHRvIGF2b2lkIGNvbmZsaWN0cyAtLT4KLSAgICAgICAgPGFjdGlvbiBpZD0iQWN0aW9uc1NhbXBsZS5BY3Rpb25zUGx1Z2luLlNlcnZpY2VBcmNoaXZlQ3JlYXRvciIKLSAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMlBsdWdpbkFjdGlvbiIKLSAgICAgICAgICAgICAgICB0ZXh0PSJBeGlzMiBwbHVnaW5zIiBkZXNjcmlwdGlvbj0iU2VydmljZSBjcmVhdGlvbiBhbmQgY29kZWdlbmVyYXRpb24iPgotICAgICAgICAgICAgPGtleWJvYXJkLXNob3J0Y3V0IGZpcnN0LWtleXN0cm9rZT0iYWx0IFciIHNlY29uZC1rZXlzdHJva2U9IkMiIGtleW1hcD0iJGRlZmF1bHQiLz4KLSAgICAgICAgICAgIDxtb3VzZS1zaG9ydGN1dCBrZXlzdHJva2U9ImN0cmwgYWx0IGJ1dHRvbjIiIGtleW1hcD0iJGRlZmF1bHQiLz4KLSAgICAgICAgPC9hY3Rpb24+Ci0KLSAgICAgICAgPCEtLSAgICA8Z3JvdXAgaWQ9IkFjdGlvbnMuQWN0aW9uc1BsdWdpbi5TYW1wbGVHcm91cCIgdGV4dD0iU19hbXBsZSIgZGVzY3JpcHRpb249IlNhbXBsZSBncm91cCI+LS0+Ci0gICAgICAgIDxncm91cCBpZD0iQWN0aW9ucy5BY3Rpb25zUGx1Z2luLlNhbXBsZUdyb3VwIiB0ZXh0PSJBeGlzMiIgZGVzY3JpcHRpb249IkF4aXMyIEdyb3VwIj4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IvPgotICAgICAgICAgICAgPGFkZC10by1ncm91cCBncm91cC1pZD0iTWFpbk1lbnUiIGFuY2hvcj0ibGFzdCIvPgotICAgICAgICAgICAgPGFkZC10by1ncm91cCBncm91cC1pZD0iTWFpblRvb2xCYXIiIGFuY2hvcj0iYmVmb3JlIiByZWxhdGl2ZS10by1hY3Rpb249IkhlbHBUb3BpY3MiLz4KLSAgICAgICAgPC9ncm91cD4KLQotICAgICAgICA8IS0tdGhlIGdyb3VwIGJlbG93IGNvbnRhaW5zIG9ubHkgdGhlICJIZWxsbyBXb3JsZCIgYWN0aW9uIGRlZmluZWQgYWJvdmUgLS0+Ci0gICAgICAgIDxncm91cD4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiLz4KLSAgICAgICAgICAgIDwhLS10aGUgZ3JvdXAgaXMgYWRkZWQgdG8gdGhlIGVkaXRvciBwb3B1cCBtZW51LS0+Ci0gICAgICAgICAgICA8YWRkLXRvLWdyb3VwIGdyb3VwLWlkPSJFZGl0b3JQb3B1cE1lbnUiIGFuY2hvcj0iYWZ0ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLXRvLWFjdGlvbj0iQ3V0Q29weVBhc3RlR3JvdXAiLz4KLSAgICAgICAgPC9ncm91cD4KLQotICAgIDwvYWN0aW9ucz4KLQotPC9pZGVhLXBsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIuZ2lmIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vaWNvbnMvYXNmLWZlYXRoZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E0MTMwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2FzZi1mZWF0aGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2FzZi1mZWF0aGVyLnBuZyBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2FzZi1mZWF0aGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1YjIyZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9pY29ucy9hc2YtZmVhdGhlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3BsdWdpbi9pY29ucy9pY29uLnBuZyBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2ljb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGY1ZjMzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL2ljb25zL2ljb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vcmVzb3VyY2VzL3NlcnZpY2UueHNkIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wbHVnaW4vcmVzb3VyY2VzL3NlcnZpY2UueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjU5ZjYyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcGx1Z2luL3Jlc291cmNlcy9zZXJ2aWNlLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZUdyb3VwIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiByZWY9InNlcnZpY2UiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0icGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9Im1vZHVsZSIvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ic2VydmljZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJtb2R1bGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvcGVyYXRpb24iLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImV4Y2x1ZGVPcGVyYXRpb25zIi8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZVJlY2VpdmVycyIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InNjaGVtYSIvPgotICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRyYW5zcG9ydHMiLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIHJlZj0iZGF0YUxvY2F0b3IiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NvcGUiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZXhjbHVkZU9wZXJhdGlvbnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJvcGVyYXRpb24iLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlcnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0ibWVzc2FnZVJlY2VpdmVyIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJzY2hlbWEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjaGVtYU5hbWVzcGFjZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydHMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0cmFuc3BvcnQiLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iZGF0YUxvY2F0b3IiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiByZWY9ImRpYWxlY3RMb2NhdG9yIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJkaWFsZWN0TG9jYXRvciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGlhbGVjdCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InBhcmFtZXRlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZSBtaXhlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2tlZCIgdHlwZT0ieHM6Tk1UT0tFTiIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB1c2U9InJlcXVpcmVkIiB0eXBlPSJ4czpOQ05hbWUiLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ibW9kdWxlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWYiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJvcGVyYXRpb24iPgotICAgICAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgotICAgICAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9Im1lc3NhZ2VSZWNlaXZlciIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibW9kdWxlIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJwYXJhbWV0ZXIiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImFjdGlvbk1hcHBpbmciLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImZhdWx0QWN0aW9uTWFwcGluZyIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ibWVzc2FnZSIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ib3V0cHV0QWN0aW9uTWFwcGluZyIvPgotICAgICAgICAgICAgPC94czpjaG9pY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lcCIgdHlwZT0ieHM6YW55VVJJIi8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJxbmFtZSIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImFjdGlvbk1hcHBpbmciIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9ImZhdWx0QWN0aW9uTWFwcGluZyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6YW55VVJJIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYXVsdE5hbWUiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJtZXNzYWdlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0icGFyYW1ldGVyIi8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ieHM6TkNOYW1lIi8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9Im91dHB1dEFjdGlvbk1hcHBpbmciIHR5cGU9InhzOmFueVVSSSIvPgotICAgIDx4czplbGVtZW50IG5hbWU9Im1lc3NhZ2VSZWNlaXZlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHVzZT0icmVxdWlyZWQiIHR5cGU9InhzOk5DTmFtZSIvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXAiIHR5cGU9InhzOmFueVVSSSIvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wb20ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE5OTZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItaWRlYS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEludGVsbGlqIElERUEgUGx1Z2luPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQSBJbnRlbGxpaiBJREVBIHBsdWdpbiBmb3IgU2VydmljZSBBcmNoaXZlIGNyZWF0aW9uIGFuZCBDb2RlIEdlbmVyYXRpb24KLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFyY2hpdmVyPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1jb2RlZ2VuPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItYWRiLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWphdmFtYWlsXzEuNF9zcGVjPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5nZXJvbmltby5zcGVjczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uaW50ZWxsaWo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVuYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmludGVsbGlqPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXh0ZW5zaW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPndzZGw0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPndzZGw0ajwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS54bWxiZWFuczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbGJlYW5zPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPlhtbFNjaGVtYTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUud29kZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD53b2Rlbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLndvZGVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29kZW4taW1wbC1kb208L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvc291cmNlRGlyZWN0b3J5PgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+cGx1Z2luPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLQotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RmlsZT5wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUY8L21hbmlmZXN0RmlsZT4KLSAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRpc3RyaWJ1dGlvbi1wYWNrYWdlPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7cG9tLmJhc2VkaXJ9L2lkZWEtcGx1Z2luLWFzZWVtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9iZWFuL0NsYXNzTG9hZGluZ1Rlc3RCZWFuLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9iZWFuL0NsYXNzTG9hZGluZ1Rlc3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZmQxMjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9DbGFzc0xvYWRpbmdUZXN0QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIENsYXNzTG9hZGluZ1Rlc3RCZWFuIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0cnlMb2FkaW5nQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMsIExpc3QgZXJyb3JMaXN0ZW5lcikgewotCi0gICAgICAgIC8vbWFrZSBhIFVSTCBjbGFzcyBsb2FkZXIgZnJvbSB0aGUgZW50cmllcwotICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgICAgICBpZiAoY2xhc3NQYXRoRW50cmllcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aF07Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc1BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc1BhdGhFbnRyeSA9IGNsYXNzUGF0aEVudHJpZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgYSBmaWxlKG9yIGEgVVJMKQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NQYXRoRW50cnkuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IFVSTChjbGFzc1BhdGhFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmxzW2ldID0gbmV3IEZpbGUoY2xhc3NQYXRoRW50cnkpLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChlcnJvckxpc3RlbmVyIT1udWxsKXsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ZW5lci5hZGQoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2xhc3NMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vdHJ5IHRvIGxvYWQgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xheno9Y2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBjbGF6ei5nZXRNZXRob2RzKCk7Ci0KLQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgaWYgKGVycm9yTGlzdGVuZXIhPW51bGwpewotICAgICAgICAgICAgICAgIGVycm9yTGlzdGVuZXIuYWRkKHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Db2RlZ2VuQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Db2RlZ2VuQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmYwYTI5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vQ29kZWdlbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbjsKLQotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm1vZHVsZS5Nb2R1bGU7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkucHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnJvb3RzLk1vZHVsZVJvb3RNYW5hZ2VyOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnZmcy5WaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVVJMUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMUmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIENvZGVnZW5CZWFuIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIFdTRExGaWxlTmFtZSA9bnVsbCA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0ID0gIi4iOwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lID0gVVJMUHJvY2Vzc29yLkRFRkFVTFRfUEFDS0FHRTsKLSAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZSA9ICJqYXZhIjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBhc3luY09ubHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc3luY09ubHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VydmVyU2lkZSA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiB0ZXN0Y2FzZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmVyWE1MOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyYXRlQWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RDYXNlOwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGRhdGFiaW5kaW5nTmFtZTsKLQotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTJwYWNrYWdlTGlzdDsKLQotICAgIHByaXZhdGUgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdENsaWVudCA9IHRydWU7Ci0KLSAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZlclNpZGVJbnRlcmZhY2UgPSB0cnVlOwotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlMnBhY2thZ2VMaXN0KFN0cmluZyBuYW1lc3BhY2UycGFja2FnZUxpc3QpIHsKLSAgICAgICAgdGhpcy5uYW1lc3BhY2UycGFja2FnZUxpc3QgPSBuYW1lc3BhY2UycGFja2FnZUxpc3Q7Ci0gICAgfQotCi0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZUludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmVyU2lkZUludGVyZmFjZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJTaWRlSW50ZXJmYWNlKGJvb2xlYW4gc2VydmVyU2lkZUludGVyZmFjZSkgewotICAgICAgICBpc1NlcnZlclNpZGVJbnRlcmZhY2UgPSBzZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIH0KLQotCi0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGllbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdENsaWVudChib29sZWFuIGRlZmF1bHRDbGllbnQpIHsKLSAgICAgICAgdGhpcy5kZWZhdWx0Q2xpZW50ID0gZGVmYXVsdENsaWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTCgpIHsKLSAgICAgICAgcmV0dXJuIGlzU2VydmVyWE1MOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclhNTChib29sZWFuIHNlcnZlclhNTCkgewotICAgICAgICBpc1NlcnZlclhNTCA9IHNlcnZlclhNTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQWxsKCkgewotICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZUFsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFsbChib29sZWFuIGdlbmVyYXRlQWxsKSB7Ci0gICAgICAgIGlzR2VuZXJhdGVBbGwgPSBnZW5lcmF0ZUFsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3RDYXNlKCkgewotICAgICAgICByZXR1cm4gaXNUZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0Q2FzZShib29sZWFuIHRlc3RDYXNlKSB7Ci0gICAgICAgIGlzVGVzdENhc2UgPSB0ZXN0Q2FzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHBvcnROYW1lKSB7Ci0gICAgICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERhdGFiaW5kaW5nTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZ05hbWUoU3RyaW5nIGRhdGFiaW5kaW5nTmFtZSkgewotICAgICAgICB0aGlzLmRhdGFiaW5kaW5nTmFtZSA9IGRhdGFiaW5kaW5nTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXBzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYSBsYW5ndWFnZSB0byBhIGNvbnN0YW50IGRlZmluZWQgaW4gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuTGFuZ3VhZ2VOYW1lcwotICAgICAqCi0gICAgICogQHBhcmFtIFVJTGFuZ1ZhbHVlIGEgc3RyaW5nIGNvbnRhaW5nIGEgbGFuZ3VhZ2UsIGUuZy4gImphdmEiLCAiY3MiLCAiY3BwIiBvciAidmIiCi0gICAgICogQHJldHVybiBhIG5vcm1hbGl6ZWQgc3RyaW5nIGNvbnN0YW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFwTGFuZ3VhZ2VzV2l0aENvbWJvKFN0cmluZyBVSUxhbmdWYWx1ZSkgewotICAgICAgICByZXR1cm4gVUlMYW5nVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGxpc3Qgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yIGJhc2VkIG9uIHRoZSBkZWNpc2lvbnMgbWFkZSBieSB0aGUgdXNlciBvbiB0aGUgT3B0aW9uc1BhZ2UKLSAgICAgKiAocGFnZTIpLiBGb3IgZWFjaCBzZXR0aW5nLCB0aGVyZSBpcyBhIENvbW1hbmQtTGluZSBvcHRpb24gZm9yIHRoZSBBeGlzMiBjb2RlIGdlbmVyYXRvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBNYXAgd2l0aCBrZXlzIGZyb20gQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMgd2l0aCB0aGUgdmFsdWVzIGVudGVyZWQgYnkgdGhlIHVzZXIgb24gdGhlIE9wdGlvbnMgUGFnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwIGZpbGxPcHRpb25NYXAoKSB7Ci0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAvL1dTREwgZmlsZSBuYW1lCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sIGdldFN0cmluZ0FycmF5KFdTRExGaWxlTmFtZSkpKTsKLQotICAgICAgICAvL0FzeW5jIG9ubHkKLSAgICAgICAgaWYgKGFzeW5jT25seSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vc3luYyBvbmx5Ci0gICAgICAgIGlmIChzeW5jT25seSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5DT0RFR0VOX1NZTkNfT05MWV9PUFRJT04sIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotICAgICAgICAvL3NlcnZlcnNpZGUKLSAgICAgICAgaWYgKHNlcnZlclNpZGUpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0NPREVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICAgICAgLy9zZXJ2ZXIgeG1sCi0gICAgICAgICAgICBpZiAoaXNTZXJ2ZXJYTUwpIHsKLSAgICAgICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNHZW5lcmF0ZUFsbCkgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNTZXJ2ZXJTaWRlSW50ZXJmYWNlICkgewotICAgICAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNFUlZFUl9TSURFX0lOVEVSRkFDRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy90ZXN0IGNhc2UKLSAgICAgICAgaWYgKGlzVGVzdENhc2UpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotICAgICAgICAvL3BhY2thZ2UgbmFtZQotICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QQUNLQUdFX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkocGFja2FnZU5hbWUpKSk7Ci0gICAgICAgIC8vc2VsZWN0ZWQgbGFuZ3VhZ2UKLSAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU1RVQl9MQU5HVUFHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KG1hcExhbmd1YWdlc1dpdGhDb21ibyhsYW5ndWFnZSkpKSk7Ci0gICAgICAgIC8vb3V0cHV0IGxvY2F0aW9uCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkob3V0cHV0KSkpOwotCi0gICAgICAgIC8vZGF0YWJpbmRpbmcKLSAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkoZGF0YWJpbmRpbmdOYW1lKSkpOwotCi0gICAgICAgIC8vcG9ydCBuYW1lCi0gICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5QT1JUX05BTUVfT1BUSU9OLCBnZXRTdHJpbmdBcnJheShwb3J0TmFtZSkpKTsKLSAgICAgICAgfQotICAgICAgICAvL3NlcnZpY2UgbmFtZQotICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dChDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVklDRV9OQU1FX09QVElPTiwgZ2V0U3RyaW5nQXJyYXkoc2VydmljZU5hbWUpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9zZXJ2ZXIgc2lkZSBpbnRlcmZhY2UgIG1hcHBpbmcKLSAgICAgICAgaWYgKGlzU2VydmVyU2lkZUludGVyZmFjZSl7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLCBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL25zMnBrZyBtYXBwaW5nCi0gICAgICAgIGlmIChuYW1lc3BhY2UycGFja2FnZUxpc3QhPSBudWxsKXsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sIGdldFN0cmluZ0FycmF5KG5hbWVzcGFjZTJwYWNrYWdlTGlzdCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVXJpKFN0cmluZyB3c2RsVVJJKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmw7Ci0gICAgICAgICAgICBpZiAod3NkbFVSSS5pbmRleE9mKCI6Ly8iKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgd3NkbFVSSSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwod3NkbFVSSSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgU3RyaW5nIGJhc2VVcmk7Ci0gICAgICAgICAgICBpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsKLSAgICAgICAgICAgICAgICBiYXNlVXJpID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYmFzZVVyaSA9IHVybC50b0V4dGVybmFsRm9ybSgpLnN1YnN0cmluZygwLAotICAgICAgICAgICAgICAgICAgICAgICAgdXJsLnRvRXh0ZXJuYWxGb3JtKCkubGFzdEluZGV4T2YoIi8iKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgcmV0dXJuIGJhc2VVcmk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBXU0RMIE9iamVjdCBNb2RlbCBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3c2RsVVJJIHRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIChmdWxsIHBhdGgpIG9mIHRoZSBXU0RMIGZpbGUgdG8gcmVhZCBpbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBXU0RMRGVzY3JpcHRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFdTREwgT2JqZWN0IE1vZGVsIG9mIHRoZSBnaXZlbiBXU0RMIGZpbGUKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9ycyByZWFkaW5nIHRoZSBXU0RMIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQXhpc1NlcnZpY2UgZ2V0QXhpc1NlcnZpY2UoU3RyaW5nIHdzZGxVUkkpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFVSTCB1cmw7Ci0gICAgICAgIGlmICh3c2RsVVJJLmluZGV4T2YoIjovLyIpID09IC0xKSB7Ci0gICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsIHdzZGxVUkkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh3c2RsVVJJKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgV1NETDExVG9BeGlzU2VydmljZUJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IFdTREwxMVRvQXhpc1NlcnZpY2VCdWlsZGVyKHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgICAgIGJ1aWxkZXIuc2V0RG9jdW1lbnRCYXNlVXJpKHVybC50b1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5zZXRCYXNlVXJpKGdldEJhc2VVcmkod3NkbFVSSSkpOwotICAgICAgICBidWlsZGVyLnNldENvZGVnZW4odHJ1ZSk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLnBvcHVsYXRlU2VydmljZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgc2luZ2xlIFN0cmluZyBpbnRvIGEgU3RyaW5nIEFycmF5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gdmFsdWUgYSBzaW5nbGUgc3RyaW5nCi0gICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIG9ubHkgb25lIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICB2YWx1ZXNbMF0gPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTRExGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMRmlsZU5hbWUoU3RyaW5nIFdTRExGaWxlTmFtZSkgewotICAgICAgICB0aGlzLldTRExGaWxlTmFtZSA9IFdTRExGaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNPbmx5KCkgewotICAgICAgICByZXR1cm4gc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U3luY09ubHkoYm9vbGVhbiBzeW5jT25seSkgewotICAgICAgICB0aGlzLnN5bmNPbmx5ID0gc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3luY09ubHkoKSB7Ci0gICAgICAgIHJldHVybiBhc3luY09ubHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXN5bmNPbmx5KGJvb2xlYW4gYXN5bmNPbmx5KSB7Ci0gICAgICAgIHRoaXMuYXN5bmNPbmx5ID0gYXN5bmNPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLSAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChTdHJpbmcgb3V0cHV0KSB7Ci0gICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU2lkZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclNpZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyU2lkZShib29sZWFuIHNlcnZlclNpZGUpIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Rlc3RjYXNlKCkgewotICAgICAgICByZXR1cm4gdGVzdGNhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdGNhc2UoYm9vbGVhbiB0ZXN0Y2FzZSkgewotICAgICAgICB0aGlzLnRlc3RjYXNlID0gdGVzdGNhc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2VuZXJhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCi0gICAgICAgIENsYXNzTG9hZGVyIHRjbCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoISJ4bWxiZWFucyIuZXF1YWxzKGdldERhdGFiaW5kaW5nTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKENsYXNzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29kZWdlbkNvbmZpZyA9IG5ldyBDb2RlR2VuQ29uZmlndXJhdGlvbihmaWxsT3B0aW9uTWFwKCkpOwotICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5hZGRBeGlzU2VydmljZShnZXRBeGlzU2VydmljZShXU0RMRmlsZU5hbWUpKTsKLSAgICAgICAgICAgIGNvZGVnZW5Db25maWcuc2V0V3NkbERlZmluaXRpb24od3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgLy9zZXQgdGhlIGJhc2VVUkkKLSAgICAgICAgICAgIGNvZGVnZW5Db25maWcuc2V0QmFzZVVSSShnZXRCYXNlVXJpKFdTRExGaWxlTmFtZSkpOwotICAgICAgICAgICAgbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKGNvZGVnZW5Db25maWcpLmdlbmVyYXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENvZGVHZW5Db25maWd1cmF0aW9uIGNvZGVnZW5Db25maWcgPSBuZXcgQ29kZUdlbkNvbmZpZ3VyYXRpb24oZmlsbE9wdGlvbk1hcCgpKTsKLSAgICAgICAgICAgICAgICBjb2RlZ2VuQ29uZmlnLmFkZEF4aXNTZXJ2aWNlKGdldEF4aXNTZXJ2aWNlKFdTRExGaWxlTmFtZSkpOwotICAgICAgICAgICAgICAgIGNvZGVnZW5Db25maWcuc2V0V3NkbERlZmluaXRpb24od3NkbERlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIC8vc2V0IHRoZSBiYXNlVVJJCi0gICAgICAgICAgICAgICAgY29kZWdlbkNvbmZpZy5zZXRCYXNlVVJJKGdldEJhc2VVcmkoV1NETEZpbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgbmV3IENvZGVHZW5lcmF0aW9uRW5naW5lKGNvZGVnZW5Db25maWcpLmdlbmVyYXRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2RlIGdlbmVyYXRpb24gZmFpbGVkIGR1ZSB0byAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKCEieG1sYmVhbnMiLmVxdWFscyhnZXREYXRhYmluZGluZ05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcih0Y2wpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcHVibGljIHZvaWQgcmVhZFdTREwoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgd3NkbERlZmluaXRpb24gPSByZWFkZXIucmVhZFdTREwoV1NETEZpbGVOYW1lKSA7Ci0gICAgICAgIGlmICh3c2RsRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3c2RsRGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkoV1NETEZpbGVOYW1lKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLy9nZXQgdGhlIGRlZmF1bHQgcGFja2FnZSBkZXJpdmVkIGJ5IHRoZSB0YXJnZXROYW1lc3BhY2UKLQotICAgIHB1YmxpYyBTdHJpbmcgcGFja2FnZUZyb21UYXJnZXROYW1lc3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiBVUkxQcm9jZXNzb3IubWFrZVBhY2thZ2VOYW1lKHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHNlcnZpY2UgbmFtZXMKLSAgICAgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VMaXN0KCkgewotICAgICAgICBMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgICAgIE1hcCBzZXJ2aWNlTWFwID0gd3NkbERlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VNYXAgIT0gbnVsbCAmJiAhc2VydmljZU1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VJdGVyYXRvciA9IHNlcnZpY2VNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChzZXJ2aWNlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIHJldHVybkxpc3QuYWRkKHNlcnZpY2UuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBwb3J0cyBmb3IgYSBwYXJ0aWN1bGFyIHNlcnZpY2UKLSAgICAgKiB0aGUgbmFtZXMgYXJlIFFOYW1lcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldFBvcnROYW1lTGlzdChRTmFtZSBzZXJ2aWNlTmFtZSkgewotICAgICAgICBMaXN0IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNYXAgcG9ydE1hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgIGlmIChwb3J0TWFwICE9IG51bGwgJiYgIXBvcnRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChwb3J0SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcnQgPSAoUG9ydCkgcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuTGlzdC5hZGQocG9ydC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldHVybkxpc3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgUHJvamVjdCBnZXRBY3RpdmVQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wKCkgewotCi0gICAgICAgIFN0cmluZyB0aW1lID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkudG9TdHJpbmcoKS5yZXBsYWNlKCc6JywgJy0nKTsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCBnZXRPdXRwdXQoKSArIEZpbGUuc2VwYXJhdG9yICsgInRlbXAtIiArIHRpbWUpOwotCi0gICAgfQotCi0gICAgcHVibGljIE1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0KLSAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0QWN0aXZlUHJvamVjdCgpOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gTW9kdWxlTWFuYWdlci5nZXRJbnN0YW5jZShwcm9qZWN0KS5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVNyYyhTdHJpbmcgbmFtZSkgewotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBnZXRBY3RpdmVQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1vZHVsZSBtb2R1bGUgPSBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKHByb2plY3QpLmZpbmRNb2R1bGVCeU5hbWUobmFtZSk7Ci0gICAgICAgICAgICBNb2R1bGVSb290TWFuYWdlciBtb2R1bGVSb290TWFuYWdlciA9IE1vZHVsZVJvb3RNYW5hZ2VyLmdldEluc3RhbmNlKG1vZHVsZSk7Ci0gICAgICAgICAgICBWaXJ0dWFsRmlsZSB2aXJ0dWFsRmlsZXNbXSA9IG1vZHVsZVJvb3RNYW5hZ2VyLmdldFNvdXJjZVJvb3RzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjW10gPSBuZXcgU3RyaW5nW3ZpcnR1YWxGaWxlcy5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IHNyYy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICBzcmNbY291bnRdID0gdmlydHVhbEZpbGVzW2NvdW50XS5nZXRQcmVzZW50YWJsZVVybCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNyYzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBtYXAgZnJvbSBkZWZpbml0aW9uCi0JICogQHJldHVybgotCSAqLwotICAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKXsKLQotICAgICAgICBNYXAgbmFtZXNwYWNlcyA9IHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXMudmFsdWVzKCkgOwotCi0gICAgfQotCi0KLX0KLQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vTmFtZXNwYWNlRmluZGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9iZWFuL05hbWVzcGFjZUZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBiMjM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vTmFtZXNwYWNlRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbjsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlRmluZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfUFJFRklYID0gImh0dHA6Ly8iOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTQ0hFTUFfTlNfREVGQVVMVF9QUkVGSVggPSAieHNkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTlNfREVGQVVMVF9QUkVGSVggPSAibnMiOwotCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3MoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLSAgICAgICAgLy90b2tlbml6ZSB0aGUgY2xhc3NOYW1lCi0gICAgICAgIFN0cmluZ1tdIGNsYXNzTmFtZVBhcnRzID0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUuc3BsaXQoIlxcLiIpOwotICAgICAgICAvL2FkZCB0aGUgc3RyaW5ncyBpbiByZXZlcnNlIG9yZGVyIHRvIG1ha2UgdGhlIG5hbWVzcGFjZQotICAgICAgICBTdHJpbmcgbnNVcmkgPSAiIjsKLSAgICAgICAgZm9yKGludCBpPWNsYXNzTmFtZVBhcnRzLmxlbmd0aC0xO2k+PTA7aS0tKXsKLSAgICAgICAgICAgIG5zVXJpID0gbnNVcmkgKyBjbGFzc05hbWVQYXJ0c1tpXSArIChpPT0wPyIiOiIuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTlNfUFJFRklYICsgbnNVcmk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3MoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKXsKLSAgICAgICAgcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyhmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYU5hbWVzcGFjZVByZWZpeCgpewotICAgICAgICByZXR1cm4gU0NIRU1BX05TX0RFRkFVTFRfUFJFRklYOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2VQcmVmaXgoKXsKLSAgICAgICAgcmV0dXJuIE5TX0RFRkFVTFRfUFJFRklYOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lVGV4dChTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpewotICAgICAgICAvL3Rva2VuaXplIHRoZSBjbGFzc05hbWUKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lUGFydHMgPSBmdWxseVF1YWxpZmllZENsYXNzTmFtZS5zcGxpdCgiXFwuIik7Ci0gICAgICAgIHJldHVybiBjbGFzc05hbWVQYXJ0c1tjbGFzc05hbWVQYXJ0cy5sZW5ndGgtMV07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9TcmNDb21waWxlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9TcmNDb21waWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGRiOTg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vU3JjQ29tcGlsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBrZWl0aCBjaGFwbWFuCi0gKiBEYXRlOiAyOC8wOS8yMDA2Ci0gKiBUaW1lOiAxNjozNTowNgotICovCi1wdWJsaWMgY2xhc3MgU3JjQ29tcGlsZXIgZXh0ZW5kcyBKYXZhYyB7Ci0KLSAgICBQcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwdWJsaWMgU3JjQ29tcGlsZXIoKSB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICB0aGlzLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuaW5pdCgpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tcGlsZVNvdXJjZShTdHJpbmcgdGVtcFBhdGgpIHsKLQotICAgICAgICAgIFBhdGggcGF0aDsKLSAgICAgICAgICBGaWxlIGRlc3REaXIgPSBuZXcgRmlsZSh0ZW1wUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMiKTsKLSAgICAgICAgICBkZXN0RGlyLm1rZGlyKCk7Ci0KLSAgICAgICAgICBQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChwcm9qZWN0LCB0ZW1wUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgInNyYyIpOwotICAgICAgICAgIHRoaXMuc2V0U3JjZGlyKHNyY1BhdGgpOwotICAgICAgICAgIHRoaXMuc2V0RGVzdGRpcihkZXN0RGlyKTsKLSAgICAgICAgICB0aGlzLnNldEluY2x1ZGVzKCIqKiIgKyBGaWxlLnNlcGFyYXRvciArICIqLmphdmEsICouamF2YSIpOwotICAgICAgICAgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKCIvaWNvbnMiKTsKLSAgICAgICAgICBGaWxlIGxpYiA9IG5ldyBGaWxlKHVybC5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICIuLiIgKyBGaWxlLnNlcGFyYXRvciArICIuLiIgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiKTsKLSAgICAgICAgICBGaWxlW10gZmlsZXM7Ci0gICAgICAgICAgZmlsZXMgPSBsaWIubGlzdEZpbGVzKCk7Ci0KLSAgICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBmaWxlcy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgcGF0aCA9IG5ldyBQYXRoKHByb2plY3QsIGZpbGVzW2NvdW50XS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgIGNsYXNzcGF0aC5hZGQocGF0aCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRoaXMuc2V0Q2xhc3NwYXRoKGNsYXNzcGF0aCk7Ci0gICAgICAgICB0aGlzLnNldEZvcmsodHJ1ZSk7Ci0gICAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0KLSAgICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Xc2RsZ2VuQmVhbi5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvYmVhbi9Xc2RsZ2VuQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDBkZTJhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2JlYW4vV3NkbGdlbkJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbjsKLQotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm1vZHVsZS5Nb2R1bGU7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkucHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnJvb3RzLk1vZHVsZVJvb3RNYW5hZ2VyOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLnZmcy5WaXJ0dWFsRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLmphdmEyd3NkbC5KYXZhMldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMQ29kZWdlbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBXc2RsZ2VuQmVhbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBDbGFzc1BhdGhMaXN0OwotICAgIHByaXZhdGUgU3RyaW5nIFRhcmdldE5hbWVzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBUYXJnZXROYW1lc3BhY2VQcmVmaXg7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgU2NoZW1hVGFyZ2V0TmFtZXNwYWNlOwotICAgIHByaXZhdGUgU3RyaW5nIFNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeDsKLSAgICBwcml2YXRlIFN0cmluZyBPdXRwdXRMb2NhdGlvbiA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgT3V0cHV0V1NETE5hbWUgOwotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwotCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIENsYXNzTmFtZSA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpewotICAgICAgICB0aGlzLkNsYXNzTmFtZT1jbGFzc05hbWUgOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc1BhdGhMaXN0KCl7Ci0gICAgICAgIHJldHVybiBDbGFzc1BhdGhMaXN0IDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc1BhdGhMaXN0KFN0cmluZ1tdIGNsYXNzUGF0aExpc3QpIHsKLSAgICAgICAgdGhpcy5DbGFzc1BhdGhMaXN0ID0gY2xhc3NQYXRoTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIFRhcmdldE5hbWVzcGFjZSA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLSAgICAgICAgdGhpcy5UYXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiBUYXJnZXROYW1lc3BhY2VQcmVmaXggOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZVByZWZpeChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KSB7Ci0gICAgICAgIHRoaXMuVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gdGFyZ2V0TmFtZXNwYWNlUHJlZml4OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gU2NoZW1hVGFyZ2V0TmFtZXNwYWNlIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UgKFN0cmluZyBzY2hlbWFUYXJnZXROYW1lU3BhY2UpIHsKLSAgICAgICAgdGhpcy5TY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWFUYXJnZXROYW1lU3BhY2UgOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ICgpIHsKLSAgICAgICAgcmV0dXJuIFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4IChTdHJpbmcgc2NoZW1hVGFyZ2V0TmFtZVNwYWNlUHJlZml4KSB7Ci0gICAgICAgIHRoaXMuU2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4ID0gc2NoZW1hVGFyZ2V0TmFtZVNwYWNlUHJlZml4IDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dExvY2F0aW9uKCl7Ci0gICAgICAgIHJldHVybiBPdXRwdXRMb2NhdGlvbiA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TG9jYXRpb24oU3RyaW5nIG91dHB1dExvYWN0aW9uKXsKLSAgICAgICAgdGhpcy5PdXRwdXRMb2NhdGlvbiA9b3V0cHV0TG9hY3Rpb24gOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V1NETE5hbWUoKXsKLSAgICAgICAgcmV0dXJuIE91dHB1dFdTRExOYW1lIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRXU0RMTmFtZShTdHJpbmcgb3V0cHV0V1NETE5hbWUpewotICAgICAgICB0aGlzLk91dHB1dFdTRExOYW1lID1vdXRwdXRXU0RMTmFtZSA7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpewotICAgICAgICByZXR1cm4gU2VydmljZU5hbWUgOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSl7Ci0gICAgICAgIHRoaXMuU2VydmljZU5hbWUgPXNlcnZpY2VOYW1lIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGZpbGxPcHRpb25NYXAoKSAgewotCi0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoSmF2YTJXU0RMQ29uc3RhbnRzIC5DTEFTU05BTUVfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldENsYXNzTmFtZSgpIH0pCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMuQ0xBU1NQQVRIX09QVElPTiAsCi0gICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cyAuQ0xBU1NQQVRIX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDbGFzc1BhdGhMaXN0KCkpCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMgLlRBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzIC5UQVJHRVRfTkFNRVNQQUNFX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Z2V0VGFyZ2V0TmFtZXNwYWNlKCkgfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzIC5UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfT1BUSU9OICwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YTJXU0RMQ29tbWFuZExpbmVPcHRpb24oSmF2YTJXU0RMQ29uc3RhbnRzIC5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIH0pCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMgLlNFUlZJQ0VfTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihKYXZhMldTRExDb25zdGFudHMgLlNFUlZJQ0VfTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldFNlcnZpY2VOYW1lKCkgfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiAsCi0gICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cyAuU0NIRU1BX1RBUkdFVF9OQU1FU1BBQ0VfUFJFRklYX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Z2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4KCkgfSkKLSAgICAgICAgKTsKLQotICAgICAgICBvcHRpb25NYXAucHV0KEphdmEyV1NETENvbnN0YW50cyAuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiAsCi0gICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKEphdmEyV1NETENvbnN0YW50cyAuT1VUUFVUX0xPQ0FUSU9OX09QVElPTiAsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Z2V0T3V0cHV0TG9jYXRpb24oKX0pCi0gICAgICAgICk7Ci0KLSAgICAgICAgb3B0aW9uTWFwLnB1dChKYXZhMldTRExDb25zdGFudHMgLk9VVFBVVF9GSUxFTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihKYXZhMldTRExDb25zdGFudHMgLk9VVFBVVF9GSUxFTkFNRV9PUFRJT04gLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2dldE91dHB1dFdTRExOYW1lKCl9KQotICAgICAgICApOwotCi0gICAgICAgIHJldHVybiBvcHRpb25NYXA7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEphdmEyV1NETENvZGVnZW5FbmdpbmUgamF2YTJXU0RMPW5ldyBKYXZhMldTRExDb2RlZ2VuRW5naW5lKGZpbGxPcHRpb25NYXAoKSk7Ci0gICAgICAgICAgICBqYXZhMldTREwuZ2VuZXJhdGUoKTsKLQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2RlIGdlbmVyYXRpb24gZmFpbGVkIGR1ZSB0byAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHVibGljIFByb2plY3QgZ2V0QWN0aXZlUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLSAgICBwdWJsaWMgTW9kdWxlW10gZ2V0TW9kdWxlcygpIHsKLQotICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBnZXRBY3RpdmVQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBNb2R1bGVNYW5hZ2VyLmdldEluc3RhbmNlKHByb2plY3QpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlU3JjKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldEFjdGl2ZVByb2plY3QoKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgTW9kdWxlIG1vZHVsZSA9IE1vZHVsZU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvamVjdCkuZmluZE1vZHVsZUJ5TmFtZShuYW1lKTsKLSAgICAgICAgICAgIE1vZHVsZVJvb3RNYW5hZ2VyIG1vZHVsZVJvb3RNYW5hZ2VyID0gTW9kdWxlUm9vdE1hbmFnZXIuZ2V0SW5zdGFuY2UobW9kdWxlKTsKLSAgICAgICAgICAgIFZpcnR1YWxGaWxlIHZpcnR1YWxGaWxlc1tdID0gbW9kdWxlUm9vdE1hbmFnZXIuZ2V0U291cmNlUm9vdHMoKTsKLSAgICAgICAgICAgIFN0cmluZyBzcmNbXSA9IG5ldyBTdHJpbmdbdmlydHVhbEZpbGVzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgc3JjLmxlbmd0aDsgY291bnQrKykgewotICAgICAgICAgICAgICAgIHNyY1tjb3VudF0gPSB2aXJ0dWFsRmlsZXNbY291bnRdLmdldFByZXNlbnRhYmxlVXJsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3JjOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9BY3Rpb24uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwNzY5NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50OwotCi0vKioKLSAqIGludGVyZmFjZSBmb3IgQWN0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aW9uIHsKLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvQ2FuY2VsQWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvQ2FuY2VsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWE1MTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L0NhbmNlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudDsKLQotLyoqCi0gKiBhYnN0cmFjdCBjbGFzcyBmb3IgQ2Fuc2VsQWN0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYW5jZWxBY3Rpb24gIGltcGxlbWVudHMgQWN0aW9uewotICBXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHM7Ci0KLSAgcHVibGljIENhbmNlbEFjdGlvbihXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMpIHsKLSAgICB0aGlzLndpemFyZENvbXBvbmVudHMgPSB3aXphcmRDb21wb25lbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L0RlZmF1bHRXaXphcmRDb21wb25lbnRzLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRGVmYXVsdFdpemFyZENvbXBvbmVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5N2QxNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRGVmYXVsdFdpemFyZENvbXBvbmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiB0aGlzIGlzIHVzZWQgZm9yIGRlZmF1bHQgd2l6YXJkIGNvbXBvbmVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRXaXphcmRDb21wb25lbnRzIGltcGxlbWVudHMgV2l6YXJkQ29tcG9uZW50cyB7Ci0KLSAgICBwcml2YXRlIEpCdXR0b24gYmFja0J1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gbmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEpCdXR0b24gZmluaXNoQnV0dG9uOwotICAgIHByaXZhdGUgSkJ1dHRvbiBjYW5jZWxCdXR0b247Ci0KLSAgICBGaW5pc2hBY3Rpb24gZmluaXNoQWN0aW9uOwotICAgIENhbmNlbEFjdGlvbiBjYW5jZWxBY3Rpb247Ci0KLSAgICBMaXN0IHBhbmVsTGlzdDsKLSAgICBpbnQgY3VycmVudEluZGV4OwotICAgIEpQYW5lbCB3aXphcmRQYW5lbHNDb250YWluZXI7Ci0gICAgUHJvcGVydHlDaGFuZ2VTdXBwb3J0IHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyB0aGUgImJyZWFkIGFuZCBidXR0ZXIiIG9mIHRoaXMgZnJhbWV3b3JrLiAgQWxsIG9mIHRoZXNlCi0gICAgICogY29tcG9uZW50cyBjYW4gYmUgdXNlZCB2aXN1YWxseSBob3dldmVyIHlvdSB3YW50LCBhcyBzaG93biBpbiB0aGUKLSAgICAgKiBmcmFtZSBhbmQgZXhhbXBsZSBwYWNrYWdlcywgYnV0IGFsbCBhIGRldmVsb3BlciByZWFsbHkgbmVlZHMgaXMgdGhpcywKLSAgICAgKiBhbmQgdGhleSBjYW4gZXZlbiBpbnN0ZWFkIGltcGxlbWVudCBKV2l6YXJkIGFuZCBjaG9vc2UgdG8gZG8gdGhpcwotICAgICAqIHBvcnRpb24gYW55IHdheSB0aGV5IHdpc2guCi0gICAgICovCi0gICAgcHVibGljIERlZmF1bHRXaXphcmRDb21wb25lbnRzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGdldFdpemFyZFBhbmVsTGlzdCgpLmFkZChwYW5lbCk7Ci0gICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQocGFuZWwsCi0gICAgICAgICAgICAgICAgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuc2l6ZSgpIC0gMSArICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbChpbnQgaW5kZXgsIFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGdldFdpemFyZFBhbmVsTGlzdCgpLmFkZChpbmRleCwgcGFuZWwpOwotICAgICAgICB3aXphcmRQYW5lbHNDb250YWluZXIuYWRkKHBhbmVsLCBpbmRleCArICIiLCBpbmRleCk7Ci0gICAgICAgIGlmIChpbmRleCA8IGdldFdpemFyZFBhbmVsTGlzdCgpLnNpemUoKSAtIDEpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbmRleCArIDE7IGkgPCBnZXRXaXphcmRQYW5lbExpc3QoKS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoV2l6YXJkUGFuZWwpZ2V0V2l6YXJkUGFuZWxMaXN0KCkuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgaSArICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsQWZ0ZXIoCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbFRvQmVQbGFjZWRBZnRlciwKLSAgICAgICAgICAgIFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGFkZFdpemFyZFBhbmVsKAotICAgICAgICAgICAgICAgIGdldFdpemFyZFBhbmVsTGlzdCgpLmluZGV4T2YocGFuZWxUb0JlUGxhY2VkQWZ0ZXIpICsgMSwKLSAgICAgICAgICAgICAgICBwYW5lbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkV2l6YXJkUGFuZWxCZWZvcmUoCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbFRvQmVQbGFjZWRCZWZvcmUsCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCkgewotICAgICAgICBhZGRXaXphcmRQYW5lbCgKLSAgICAgICAgICAgICAgICBnZXRXaXphcmRQYW5lbExpc3QoKS5pbmRleE9mKHBhbmVsVG9CZVBsYWNlZEJlZm9yZSkgLSAxLAotICAgICAgICAgICAgICAgIHBhbmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbEFmdGVyQ3VycmVudChXaXphcmRQYW5lbCBwYW5lbCkgewotICAgICAgICBhZGRXaXphcmRQYW5lbChnZXRDdXJyZW50SW5kZXgoKSsxLCBwYW5lbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIHJlbW92ZVdpemFyZFBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGdldFdpemFyZFBhbmVsTGlzdCgpLmluZGV4T2YocGFuZWwpOwotICAgICAgICBnZXRXaXphcmRQYW5lbExpc3QoKS5yZW1vdmUocGFuZWwpOwotICAgICAgICB3aXphcmRQYW5lbHNDb250YWluZXIucmVtb3ZlKHBhbmVsKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIChXaXphcmRQYW5lbCkgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICBpICsgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYW5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWwoaW50IGluZGV4KSB7Ci0gICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5yZW1vdmUoaW5kZXgpOwotICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCA9IChXaXphcmRQYW5lbCkgZ2V0V2l6YXJkUGFuZWxMaXN0KCkucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHdpemFyZFBhbmVsc0NvbnRhaW5lci5hZGQoCi0gICAgICAgICAgICAgICAgICAgIChXaXphcmRQYW5lbCkgZ2V0V2l6YXJkUGFuZWxMaXN0KCkuZ2V0KGkpLAotICAgICAgICAgICAgICAgICAgICBpICsgIiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYW5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxBZnRlcihXaXphcmRQYW5lbCBwYW5lbCkgewotICAgICAgICByZXR1cm4gcmVtb3ZlV2l6YXJkUGFuZWwoZ2V0V2l6YXJkUGFuZWxMaXN0KCkuaW5kZXhPZihwYW5lbCkgKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxCZWZvcmUoV2l6YXJkUGFuZWwgcGFuZWwpIHsKLSAgICAgICAgcmV0dXJuIHJlbW92ZVdpemFyZFBhbmVsKGdldFdpemFyZFBhbmVsTGlzdCgpLmluZGV4T2YocGFuZWwpIC0gMSk7Ci0gICAgfQotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIGdldFdpemFyZFBhbmVsKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gKFdpemFyZFBhbmVsKSBnZXRXaXphcmRQYW5lbExpc3QoKS5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhPZlBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKSB7Ci0gICAgICAgIHJldHVybiBnZXRXaXphcmRQYW5lbExpc3QoKS5pbmRleE9mKHBhbmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvbkxhc3RQYW5lbCgpIHsKLSAgICAgICAgcmV0dXJuIChnZXRDdXJyZW50SW5kZXgoKSA9PSBnZXRXaXphcmRQYW5lbExpc3QoKS5zaXplKCkgLSAxKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzID0gbmV3IFByb3BlcnR5Q2hhbmdlU3VwcG9ydCh0aGlzKTsKLQotICAgICAgICBiYWNrQnV0dG9uID0gbmV3IEpCdXR0b24oKTsKLSAgICAgICAgbmV4dEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGZpbmlzaEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0gICAgICAgIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCk7Ci0KLSAgICAgICAgcGFuZWxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBjdXJyZW50SW5kZXggPSAwOwotICAgICAgICB3aXphcmRQYW5lbHNDb250YWluZXIgPSBuZXcgSlBhbmVsKCk7Ci0KLSAgICAgICAgYmFja0J1dHRvbi5zZXRUZXh0KCI8IEJhY2siKTsKLSAgICAgICAgYmFja0J1dHRvbi5zZXRNbmVtb25pYygiQiIuY2hhckF0KDApKTsKLSAgICAgICAgYmFja0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJhY2tCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuZXh0QnV0dG9uLnNldFRleHQoIk5leHQgPiIpOwotICAgICAgICBuZXh0QnV0dG9uLnNldE1uZW1vbmljKCJOIi5jaGFyQXQoMCkpOwotICAgICAgICBuZXh0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbmV4dEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGNhbmNlbEJ1dHRvbi5zZXRUZXh0KCJDYW5jZWwiKTsKLSAgICAgICAgY2FuY2VsQnV0dG9uLnNldE1uZW1vbmljKCJDIi5jaGFyQXQoMCkpOwotICAgICAgICBjYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25fYWN0aW9uUGVyZm9ybWVkKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBmaW5pc2hCdXR0b24uc2V0VGV4dCgiRmluaXNoIik7Ci0gICAgICAgIGZpbmlzaEJ1dHRvbi5zZXRNbmVtb25pYygiRiIuY2hhckF0KDApKTsKLSAgICAgICAgZmluaXNoQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoQnV0dG9uX2FjdGlvblBlcmZvcm1lZChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd2l6YXJkUGFuZWxzQ29udGFpbmVyLnNldExheW91dChuZXcgQ2FyZExheW91dCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNhbmNlbEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICBnZXRDYW5jZWxBY3Rpb24oKS5wZXJmb3JtQWN0aW9uKCk7Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hCdXR0b25fYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgZ2V0RmluaXNoQWN0aW9uKCkucGVyZm9ybUFjdGlvbigpOwotICAgIH0KLQotICAgIHZvaWQgbmV4dEJ1dHRvbl9hY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYoZ2V0Q3VycmVudFBhbmVsKCkuaXNQYWdlQ29tcGxldGUoKSl7Ci0gICAgICAgICAgICAgICAgZ2V0Q3VycmVudFBhbmVsKCkubmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGJhY2tCdXR0b25fYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldEN1cnJlbnRQYW5lbCgpLmJhY2soKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbCBnZXRDdXJyZW50UGFuZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldFdpemFyZFBhbmVsTGlzdCgpLmdldChjdXJyZW50SW5kZXgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoV2l6YXJkUGFuZWwpIGdldFdpemFyZFBhbmVsTGlzdCgpLmdldChjdXJyZW50SW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gcGFuZWxzIGluIHBhbmVsTGlzdCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENhcmRMYXlvdXQgY2wgPSAoQ2FyZExheW91dCkgKHdpemFyZFBhbmVsc0NvbnRhaW5lci5nZXRMYXlvdXQoKSk7Ci0gICAgICAgICAgICBjbC5zaG93KHdpemFyZFBhbmVsc0NvbnRhaW5lciwgY3VycmVudEluZGV4ICsgIiIpOwotCi0gICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChvbkxhc3RQYW5lbCgpKSB7Ci0gICAgICAgICAgICAgICAgbmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIG5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGxldCBwYW5lbCB0byB1cGRhdGUgaXRzZWxmCi0gICAgICAgICAgICBnZXRDdXJyZW50UGFuZWwoKS51cGRhdGUoKTsKLQotICAgICAgICAgICAgLy8gaW5mb3JtIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzCi0gICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgV2l6YXJkQ29tcG9uZW50cy5DVVJSRU5UX1BBTkVMX1BST1BFUlRZCi0gICAgICAgICAgICAgICAgICAgICwgbnVsbCwgIGdldEN1cnJlbnRQYW5lbCgpKTsKLSAgICAgICAgICAgIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmZpcmVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0dGVycyBhbmQgU2V0dGVycyBmcm9tIGhlcmUgb24gLi4uCi0KLSAgICBwdWJsaWMgTGlzdCBnZXRXaXphcmRQYW5lbExpc3QoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhbmVsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbExpc3QoQXJyYXlMaXN0IHBhbmVsTGlzdCkgewotICAgICAgICB0aGlzLnBhbmVsTGlzdCA9IHBhbmVsTGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmluaXNoQWN0aW9uIGdldEZpbmlzaEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGZpbmlzaEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5pc2hBY3Rpb24oRmluaXNoQWN0aW9uIGFGaW5pc2hBY3Rpb24pIHsKLSAgICAgICAgZmluaXNoQWN0aW9uID0gYUZpbmlzaEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2FuY2VsQWN0aW9uIGdldENhbmNlbEFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNhbmNlbEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDYW5jZWxBY3Rpb24oQ2FuY2VsQWN0aW9uIGFDYW5jZWxBY3Rpb24pIHsKLSAgICAgICAgY2FuY2VsQWN0aW9uID0gYUNhbmNlbEFjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50SW5kZXgoaW50IGFDdXJyZW50SW5kZXgpIHsKLSAgICAgICAgY3VycmVudEluZGV4ID0gYUN1cnJlbnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlBhbmVsIGdldFdpemFyZFBhbmVsc0NvbnRhaW5lcigpIHsKLSAgICAgICAgcmV0dXJuIHdpemFyZFBhbmVsc0NvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbHNDb250YWluZXIoSlBhbmVsIGFXaXphcmRQYW5lbHNDb250YWluZXIpIHsKLSAgICAgICAgd2l6YXJkUGFuZWxzQ29udGFpbmVyID0gYVdpemFyZFBhbmVsc0NvbnRhaW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkJ1dHRvbiBnZXRCYWNrQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gYmFja0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYWNrQnV0dG9uKEpCdXR0b24gYUJhY2tCdXR0b24pIHsKLSAgICAgICAgYmFja0J1dHRvbiA9IGFCYWNrQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBKQnV0dG9uIGdldE5leHRCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXh0QnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5leHRCdXR0b24oSkJ1dHRvbiBhTmV4dEJ1dHRvbikgewotICAgICAgICBuZXh0QnV0dG9uID0gYU5leHRCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIEpCdXR0b24gZ2V0Q2FuY2VsQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gY2FuY2VsQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEJ1dHRvbihKQnV0dG9uIGFDYW5jZWxCdXR0b24pIHsKLSAgICAgICAgY2FuY2VsQnV0dG9uID0gYUNhbmNlbEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkJ1dHRvbiBnZXRGaW5pc2hCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBmaW5pc2hCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmluaXNoQnV0dG9uKEpCdXR0b24gYnV0dG9uKSB7Ci0gICAgICAgIGZpbmlzaEJ1dHRvbiA9IGJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbExpc3QoTGlzdCBwYW5lbExpc3QpIHsKLSAgICAgICAgdGhpcy5wYW5lbExpc3QgPSBwYW5lbExpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVycy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRmluaXNoQWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvRmluaXNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjdlZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L0ZpbmlzaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudDsKLQotLyoqCi0gKiBhYnN0cmFjdCBjbGFzcyBmb3IgRmluaXNoQWN0aW9uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaW5pc2hBY3Rpb24gaW1wbGVtZW50cyBBY3Rpb257Ci0gICAgV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzOwotCi0gICAgcHVibGljIEZpbmlzaEFjdGlvbihXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMpIHsKLSAgICAgICAgdGhpcy53aXphcmRDb21wb25lbnRzID0gd2l6YXJkQ29tcG9uZW50czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvVXRpbGl0aWVzLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMmE2ZTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudDsKLQotaW1wb3J0IGphdmEuYXd0Lio7Ci0KLS8qKgotICogdGhpcyBjbGFzcyB1c2VkIGZvciBzZXQgZnJhbWUgaW4gY2VudGVyIG9mIHRoZSBjdXJyZW50IGRlc2t0b3AKLSAqLwotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2VudGVyQ29tcG9uZW50T25TY3JlZW4oQ29tcG9uZW50IGNvbXBvbmVudCkgewotICAgICAgICBUb29sa2l0IHRvb2xraXQgPSBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gdG9vbGtpdC5nZXRTY3JlZW5TaXplKCk7Ci0KLSAgICAgICAgUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotICAgICAgICBwLnggKz0gKChkLndpZHRoIC0gY29tcG9uZW50LmdldFdpZHRoKCkpIC8gMik7Ci0gICAgICAgIHAueSArPSAoKGQuaGVpZ2h0IC0gY29tcG9uZW50LmdldEhlaWdodCgpKSAvIDIpOwotCi0gICAgICAgIGlmIChwLnggPCAwKSB7Ci0gICAgICAgICAgICBwLnggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAueSA8IDApIHsKLSAgICAgICAgICAgIHAueSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBjb21wb25lbnQuc2V0TG9jYXRpb24ocCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZC5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY5MDhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBpbnRlcmZhY2UgZm9yIHdpemFyZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpemFyZCB7Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRXaXphcmRQYW5lbExpc3QoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFdpemFyZFBhbmVsTGlzdChMaXN0IHBhbmVsTGlzdCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbChpbnQgaW5kZXgsIFdpemFyZFBhbmVsIHBhbmVsKTsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbCByZW1vdmVXaXphcmRQYW5lbChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWwoaW50IGluZGV4KTsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbCBnZXRXaXphcmRQYW5lbChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZENvbXBvbmVudHMuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmRDb21wb25lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyM2VhNGMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvY29tcG9uZW50L1dpemFyZENvbXBvbmVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogdGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyBmcm9tIHdpemFyZCBpbnRlcmZhY2UKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIFdpemFyZENvbXBvbmVudHMgIGV4dGVuZHMgV2l6YXJkIHsKLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsKFdpemFyZFBhbmVsIHBhbmVsKTsKLQotICAgIHB1YmxpYyB2b2lkIGFkZFdpemFyZFBhbmVsKGludCBpbmRleCwgV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIHZvaWQgYWRkV2l6YXJkUGFuZWxBZnRlcigKLSAgICAgICAgICAgIFdpemFyZFBhbmVsIHBhbmVsVG9CZVBsYWNlZEFmdGVyLAotICAgICAgICAgICAgV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIHZvaWQgYWRkV2l6YXJkUGFuZWxCZWZvcmUoCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbFRvQmVQbGFjZWRCZWZvcmUsCi0gICAgICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRXaXphcmRQYW5lbEFmdGVyQ3VycmVudChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWwoV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIHJlbW92ZVdpemFyZFBhbmVsKGludCBpbmRleCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxBZnRlcihXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgcmVtb3ZlV2l6YXJkUGFuZWxCZWZvcmUoV2l6YXJkUGFuZWwgcGFuZWwpOwotCi0gICAgcHVibGljIFdpemFyZFBhbmVsIGdldFdpemFyZFBhbmVsKGludCBpbmRleCk7Ci0KLSAgICBwdWJsaWMgaW50IGdldEluZGV4T2ZQYW5lbChXaXphcmRQYW5lbCBwYW5lbCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVDb21wb25lbnRzKCk7Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwgZ2V0Q3VycmVudFBhbmVsKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBGaW5pc2hBY3Rpb24gZ2V0RmluaXNoQWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5pc2hBY3Rpb24oRmluaXNoQWN0aW9uIGFGaW5pc2hBY3Rpb24pOwotCi0gICAgcHVibGljIENhbmNlbEFjdGlvbiBnZXRDYW5jZWxBY3Rpb24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEFjdGlvbihDYW5jZWxBY3Rpb24gYUNhbmNlbEFjdGlvbik7Ci0KLSAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRJbmRleCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEluZGV4KGludCBhQ3VycmVudEluZGV4KTsKLQotICAgIHB1YmxpYyBKUGFuZWwgZ2V0V2l6YXJkUGFuZWxzQ29udGFpbmVyKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbHNDb250YWluZXIoSlBhbmVsIGFXaXphcmRQYW5lbHNDb250YWluZXIpOwotCi0gICAgcHVibGljIEpCdXR0b24gZ2V0QmFja0J1dHRvbigpOwotCi0gICAgcHVibGljIHZvaWQgc2V0QmFja0J1dHRvbihKQnV0dG9uIGFCYWNrQnV0dG9uKTsKLQotICAgIHB1YmxpYyBKQnV0dG9uIGdldE5leHRCdXR0b24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldE5leHRCdXR0b24oSkJ1dHRvbiBhTmV4dEJ1dHRvbik7Ci0KLSAgICBwdWJsaWMgSkJ1dHRvbiBnZXRDYW5jZWxCdXR0b24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldENhbmNlbEJ1dHRvbihKQnV0dG9uIGFDYW5jZWxCdXR0b24pOwotCi0gICAgcHVibGljIEpCdXR0b24gZ2V0RmluaXNoQnV0dG9uKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaW5pc2hCdXR0b24oSkJ1dHRvbiBidXR0b24pOwotCi0gICAgcHVibGljIExpc3QgZ2V0V2l6YXJkUGFuZWxMaXN0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXaXphcmRQYW5lbExpc3QoTGlzdCBwYW5lbExpc3QpOwotCi0gICAgcHVibGljIGJvb2xlYW4gb25MYXN0UGFuZWwoKTsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENVUlJFTlRfUEFORUxfUFJPUEVSVFkgPSAiY3VycmVudFBhbmVsIjsKLQotICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9jb21wb25lbnQvV2l6YXJkUGFuZWwuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2IzOTQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2NvbXBvbmVudC9XaXphcmRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi0vKioKLSAqIHRoaXMgaXMgd2l6YXJkUGFuZWwgaXQgaXMgZXh0ZW5kcyBmcm9tIEpwYW5lbAotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkUGFuZWwgZXh0ZW5kcyBKUGFuZWwgewotCi0gICAgLy92YXJpYWJsZXMKLQotICAgIHByaXZhdGUgV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzOwotICAgIHByaXZhdGUgU3RyaW5nIHBhbmVsVG9wVGl0bGU7Ci0gICAgcHJpdmF0ZSBJbWFnZUljb24gcGFuZWxJbWFnZTsKLSAgICBwcml2YXRlIFN0cmluZyAgcGFuZWxCb3R0b21UaXRsZTsKLSAgICBwcml2YXRlIFN0cmluZyBlcnJvcjsKLSAgICBwcml2YXRlIFN0cmluZyBmcmFtZXRpdGxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnOwotICAgIHByaXZhdGUgYm9vbGVhbiBwcm9ncmVzc0ZsYWc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1NETF8yX0pBVkFfVFlQRSA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV8yX1dTRExfVFlQRSA9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9BUkNISVZFX1RZUEU9MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNQRUNJRklFRF9UWVBFID0gNDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBXaXphcmRQYW5lbChXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMpIHsKLSAgICAgICAgdGhpcyh3aXphcmRDb21wb25lbnRzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkUGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLCBTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgdGhpcy53aXphcmRDb21wb25lbnRzID0gd2l6YXJkQ29tcG9uZW50czsKLSAgICAgICAgdGhpcy5mcmFtZXRpdGxlID0gdGl0bGU7Ci0gICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IFdpemFyZFBhbmVsLmNsYXNzLmdldFJlc291cmNlKCIvaWNvbnMvYXNmLWZlYXRoZXIucG5nIik7Ci0gICAgICAgIHNldFBhbmVsSW1hZ2UobmV3IEltYWdlSWNvbihyZXNvdXJjZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBnb05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBnb0JhY2soKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2l6YXJkQ29tcG9uZW50cyBnZXRXaXphcmRDb21wb25lbnRzKCl7Ci0gICAgICAgIHJldHVybiB3aXphcmRDb21wb25lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdpemFyZENvbXBvbmVudHMoV2l6YXJkQ29tcG9uZW50cyBhd2l6YXJkQ29tcG9uZW50cyl7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMgPSBhd2l6YXJkQ29tcG9uZW50czsKLSAgICB9Ci0gICAgLy8gVGl0bGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhbmVsVG9wVGl0bGUoKSB7Ci0gICAgICAgIHJldHVybiBwYW5lbFRvcFRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhbmVsVG9wVGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHBhbmVsVG9wVGl0bGUgPSB0aXRsZTsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQYW5lbEJvdHRvbVRpdGxlKCkgewotICAgICAgICByZXR1cm4gcGFuZWxCb3R0b21UaXRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYW5lbEJvdHRvbVRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBwYW5lbEJvdHRvbVRpdGxlID0gdGl0bGU7Ci0gICAgfQotICAgIC8vIEltYWdlCi0gICAgcHVibGljIEltYWdlSWNvbiBnZXRQYW5lbEltYWdlKCl7Ci0gICAgICAgIHJldHVybiBwYW5lbEltYWdlIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYW5lbEltYWdlKEltYWdlSWNvbiBpbWFnZSl7Ci0gICAgICAgIHBhbmVsSW1hZ2UgPSBpbWFnZTsKLSAgICB9Ci0gICAgLy9lcnJvcgotICAgICBwdWJsaWMgU3RyaW5nICBnZXRFcnJvcigpewotICAgICAgICByZXR1cm4gZXJyb3IgOwotICAgIH0KLQotICAgICBwdWJsaWMgYm9vbGVhbiAgZ2V0RXJyb3JGbGFnKCl7Ci0gICAgICAgIHJldHVybiBmbGFnIDsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0RXJyb3IoU3RyaW5nICBlcnJvcixib29sZWFuIGZsYWcpewotICAgICAgICB0aGlzLmVycm9yPWVycm9yOwotICAgICAgICB0aGlzLmZsYWc9ZmxhZzsKLSAgICB9Ci0gICAgLy8gcHJvZ3Jlc3MgcGFuZWwgdmlzaWJsZSBmbGFnCi0gICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NQYW5lbFZpc2libGUoYm9vbGVhbiBmbGFnKSB7Ci0gICAgICAgIHRoaXMucHJvZ3Jlc3NGbGFnID0gZmxhZzsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0UHJvZ3Jlc3NQYW5lbFZpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9ncmVzc0ZsYWc7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGcmFtZVRpdGxlKCl7Ci0gICAgICAgICByZXR1cm4gdGhpcy5mcmFtZXRpdGxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZyYW1lVGl0bGUoU3RyaW5nIHRpdGxlKXsKLSAgICAgICAgdGhpcy5mcmFtZXRpdGxlPXRpdGxlOwotICAgIH0KLSAgICAvLyBuZXh0Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ29OZXh0KCkgewotICAgICAgICBpZiAod2l6YXJkQ29tcG9uZW50cy5nZXRXaXphcmRQYW5lbExpc3QoKS5zaXplKCkgPiB3aXphcmRDb21wb25lbnRzLmdldEN1cnJlbnRJbmRleCgpKzEgKSB7Ci0gICAgICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEN1cnJlbnRJbmRleCh3aXphcmRDb21wb25lbnRzLmdldEN1cnJlbnRJbmRleCgpKzEpOwotICAgICAgICAgICAgd2l6YXJkQ29tcG9uZW50cy51cGRhdGVDb21wb25lbnRzKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvL2JhY2sKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnb0JhY2soKSB7Ci0gICAgICAgIGlmICh3aXphcmRDb21wb25lbnRzLmdldEN1cnJlbnRJbmRleCgpLTEgPj0gMCkgewotICAgICAgICAgICAgd2l6YXJkQ29tcG9uZW50cy5zZXRDdXJyZW50SW5kZXgod2l6YXJkQ29tcG9uZW50cy5nZXRDdXJyZW50SW5kZXgoKS0xKTsKLSAgICAgICAgICAgIHdpemFyZENvbXBvbmVudHMudXBkYXRlQ29tcG9uZW50cygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3dpdGNoUGFuZWwoaW50IHBhbmVsSW5kZXgpIHsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLnNldEN1cnJlbnRJbmRleChwYW5lbEluZGV4KTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLnVwZGF0ZUNvbXBvbmVudHMoKTsKLSAgICB9Ci0gICAgLyoqIHRoaXMgbWV0aG9kIHVzZWQgZm9yIHNldCBCdXR0b24gRW5hYmxlZCAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEJhY2tCdXR0b25FbmFibGVkKGJvb2xlYW4gc2V0KSB7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0QmFja0J1dHRvbigpLnNldEVuYWJsZWQoc2V0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXROZXh0QnV0dG9uRW5hYmxlZChib29sZWFuIHNldCkgewotICAgICAgICB3aXphcmRDb21wb25lbnRzLmdldE5leHRCdXR0b24oKS5zZXRFbmFibGVkKHNldCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChib29sZWFuIHNldCkgewotICAgICAgICB3aXphcmRDb21wb25lbnRzLmdldEZpbmlzaEJ1dHRvbigpLnNldEVuYWJsZWQoc2V0KTsKLSAgICB9Ci0KLSAgICAvKiogdGhpcyBtZXRob2QgdXNlZCBmb3IgdG8gZ2V0IHR5cGUgIG9mIHdpemFyZCBwYW5lbCovCi0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuVU5TUEVDSUZJRURfVFlQRTsKLSAgICB9Ci0gICAgLyoqIHRoaXMgbWV0aG9kIHVzZWQgZm9yIGNoZWNrIGlzIHBhZ2UgY29tcGxldGUgKi8KLSAgICBwdWJsaWMgIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAgaXNQYWdlQ29tcGxldGU7Ci0gICAgfQotICAgIC8qKiB0aGlzIG1ldGhvZCB1c2VkIGZvciBzZXQgcGFnZSBjb21wbGV0ZSovCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZUNvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpIHsKLSAgICAgICAgaXNQYWdlQ29tcGxldGUgPSBjb21wbGV0ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvQWN0aW9uc1BsdWdpbi5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9BY3Rpb25zUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGExZWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9BY3Rpb25zUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmNvbXBvbmVudHMuQXBwbGljYXRpb25Db21wb25lbnQ7Ci0KLS8qKgotICogPGgzPlNhbXBsZUFwcGxpY2F0aW9uUGx1Z2luPC9oMz4KLSAqIDxwLz4KLSAqIEFwcGxpY2F0aW9uIGxldmVsIHBsdWdpbiBzYW1wbGUgc2hvd2luZyBJREVBIDxiPk9wZW5BUEk8L2I+IGJhc2ljcy48YnI+Ci0gKiBJbXBsZW1lbnRzIDxjb2RlPkFwcGxpY2F0aW9uQ29tcG9uZW50PC9jb2RlPiBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25zUGx1Z2luIGltcGxlbWVudHMgQXBwbGljYXRpb25Db21wb25lbnQgewotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzIGNhbGxlZCBhZnRlciBwbHVnaW4gaXMgYWxyZWFkeSBjcmVhdGVkIGFuZCBjb25maWd1cmVkLiBQbHVnaW4gY2FuIHN0YXJ0IHRvIGNvbW11bmljYXRlIHdpdGgKLSAgICAgKiBvdGhlciBwbHVnaW5zIG9ubHkgaW4gdGhpcyBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdENvbXBvbmVudCgpIHsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBwbHVnaW4gZGlzcG9zYWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZUNvbXBvbmVudCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGNvbXBvbmVudAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIGNvbXBvbmVudCBuYW1lLiBVc2UgUGx1Z2luTmFtZS5Db21wb25lbnROYW1lIG5vdGF0aW9uCi0gICAgICogICAgICAgICB0byBhdm9pZCBjb25mbGljdHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gIkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbiI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9DaG9vc2VyUGFuZWwuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvQ2hvb3NlclBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZWQ1ZDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9DaG9vc2VyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci0KLS8qKgotICogdGhpcyBwYW5lbCB1c2VkIGZvciBhcyBjaG9vc2VyCi0gKiAgICAgIGphdmEyd3NkbCBjb2RlZ2VuIG9wdGlvbgotICogICAgICB3c2RsMmphdmEgIGNvZGVnZW4gb3B0aW9uCi0gKgotICogZXh0ZW5kIGZyb20gd2l6YXJkUGFuZWwgY2Fsc3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgQ2hvb3NlclBhbmVsICBleHRlbmRzIFdpemFyZFBhbmVsIHsKLSAgICAvKioKLSAgICAgKiB2YXJpYWxiYWxlcwotICAgICAqLwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5IaW50OwotICAgIHByaXZhdGUgSkxhYmVsIGxibEhpbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc9ZmFsc2U7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gb3B0aW9uSjJXUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gb3B0aW9uVzJKUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gb3B0aW9uU2VydmljZUFyY2hpdmVyUmFkaW9CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b25Hcm91cCBiZzsKLSAgICBwcml2YXRlIGNoYXIgc2VsZWN0ZWRPcHRpb24gPSAnQSc7IC8vICdOJyBpcyBubyBvcHRpb24gc2VsZWN0ZWQgICdBJywgJ0InLCdDJyAmICdGJyBzdGFuZHMgZm9yIG9wdGlvbnMKLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBoaW50PSJZb3UgY2FuIGdlbmVyYXRlIGphdmEgY29kZSBmcm9tIGEgV1NETCBvciBXU0RMIGZyb20gYSBqYXZhIHNvdXJjZSBmaWxlLiI7Ci0gICAgLyoqCi0gICAgICogY29uc3RydWN0IG1ldGhvZCBmb3IgY2hvb3NlclBhbmVsCi0gICAgICogIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0KLSAgICBwdWJsaWMgQ2hvb3NlclBhbmVsKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cyl7Ci0KLSAgICAgICAgc3VwZXIod2l6YXJkQ29tcG9uZW50cywgIkF4aXMyIElkZWEgUGx1Z2luIFdpemFyZHMiKTsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VsZWN0IHRoZSB3aXphcmQiKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiV2VsY29tZSB0byB0aGUgQXhpczIgY29kZSBnZW5lcmF0b3Igd2l6YXJkIik7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYW5lbCBpbml0aWFsIG1ldGhvZAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgbGJsSGludCA9bmV3IEpMYWJlbCgiIik7Ci0gICAgICAgIGJ0bkhpbnQgPW5ldyBKQnV0dG9uKCJIaW50ID4+Iik7Ci0gICAgICAgIGJ0bkhpbnQuc2V0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcihuZXcgSW5zZXRzKDAsMCwwLDApKSk7Ci0KLSAgICAgICAgb3B0aW9uVzJKUmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCJHZW5lcmF0ZSBqYXZhIHNvcmNlIGNvZGUgZnJvbSBhIFdTRGwgZmlsZS4iLHRydWUpOwotICAgICAgICBvcHRpb25KMldSYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIkdlbmVyYXRlIGEgV1NEbCBmcm9tIGEgamF2YSBzb3VyY2UgZmlsZSIsZmFsc2UpOwotICAgICAgICBvcHRpb25TZXJ2aWNlQXJjaGl2ZXJSYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oIkNyZWF0ZSBTZXJ2aWNlIEFyY2hpdmVyIixmYWxzZSk7Ci0gICAgICAgIEJ1dHRvbkdyb3VwIGJnID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0gICAgICAgIGJnLmFkZChvcHRpb25KMldSYWRpb0J1dHRvbik7Ci0gICAgICAgIGJnLmFkZChvcHRpb25XMkpSYWRpb0J1dHRvbik7Ci0gICAgICAgIGJnLmFkZChvcHRpb25TZXJ2aWNlQXJjaGl2ZXJSYWRpb0J1dHRvbik7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSApOwotCi0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiUGxlYXNlIHNwZWNpZnkgd2hhdCB5b3Ugd2FudCB0byBkby4iKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgIC8vIG9wdGlvbiBidXR0b24gZm9yIGphdmEyd3NkbAotICAgICAgICBvcHRpb25XMkpSYWRpb0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB0aGlzLmFkZChvcHRpb25XMkpSYWRpb0J1dHRvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBvcHRpb25XMkpSYWRpb0J1dHRvbi5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9ICdBJzsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvLyBvcHRpb24gYnV0dG9uIGZvciB3c2RsMmphdmEKLQotICAgICAgICB0aGlzLmFkZChvcHRpb25KMldSYWRpb0J1dHRvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBvcHRpb25KMldSYWRpb0J1dHRvbi5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbiA9ICdCJzsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgLy8gb3B0aW9uIGJ1dHRvbiBmb3Igc2VydmljZSBBcmNoaXZlCi0KLSAgICAgICAgICAgIHRoaXMuYWRkKG9wdGlvblNlcnZpY2VBcmNoaXZlclJhZGlvQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsIDIwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgICAgICBvcHRpb25TZXJ2aWNlQXJjaGl2ZXJSYWRpb0J1dHRvbiAuYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24gPSAnQyc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0KLSAgICAgICAgLy8gaGludCBidXR0b24KLQotICAgICAgICB0aGlzLmFkZChidG5IaW50LAotICAgICAgICAgICAgICAgIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCw0LCAxLCAxLCAxLjAsMC4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBidG5IaW50LmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmKGZsYWcpewotICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPj4iKTsKLSAgICAgICAgICAgICAgICAgICAgbGJsSGludC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgZmxhZz1mYWxzZTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50IDw8Iik7Ci0gICAgICAgICAgICAgICAgICAgIGxibEhpbnQuc2V0VGV4dChoaW50KTsKLSAgICAgICAgICAgICAgICAgICAgZmxhZz10cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgLy8gaGludCBsYWJsZQotCi0gICAgICAgIHRoaXMuYWRkKGxibEhpbnQsCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAxLjAsIDEuMAotICAgICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxMCwgMjAsIDAsMCksIDAsIDApKTsKLQotCi0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKChzZWxlY3RlZE9wdGlvbiA9PSAnQScpIHx8IChzZWxlY3RlZE9wdGlvbiA9PSAnQicpICk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgZm9yIHVwZGF0ZSB3aGVuIHBhbmVsIGhhcyBzb21lIGNoYW5nZQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCgoc2VsZWN0ZWRPcHRpb24gPT0gJ0EnKSB8fCAoc2VsZWN0ZWRPcHRpb24gPT0gJ0InKSB8fChzZWxlY3RlZE9wdGlvbiA9PSAnQycpKTsKLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQoZmFsc2UpOyAvLyB0aGVyZSBpcyBubyB3YXkgYmFjawotICAgICAgICBzZXRQcm9ncmVzc1BhbmVsVmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsgICAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogbWV0aG9kIGZvciBuZXh0IGJ1dHRvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZE9wdGlvbiA9PSAnQScpIHsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9BKSA7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZE9wdGlvbiA9PSAnQicpIHsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9CICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPcHRpb24gPT0gJ0MnKSB7Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRklSU1RfQyApOwotICAgICAgICB9Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2RkIGZvciBiYWNrIGJ1dHRvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9GaXJzdFBhbmVsLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL0ZpcnN0UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjNjdlZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL0ZpcnN0UGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Db2RlZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgRmlyc3RQYW5lbCBleHRlbmRzIFdpemFyZFBhbmVsIHsKLQotICAgIHByaXZhdGUgSkxhYmVsIGxibFdTREw7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFdTREw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkJyb3dzZTsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuSGludDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxIaW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnPWZhbHNlOwotICAgIGZpbmFsIHByaXZhdGUgU3RyaW5nIGhpbnQ9IllvdSBjYW4gc2VsZWN0IG9ubHkgKi53c2RsLyoueG1sIGZpbGUgbG9jYXRpb24uIjsKLQotCi0gICAgZmluYWwgSkZpbGVDaG9vc2VyIEZpbGVDaG9vc2VyID1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0KLSAgICBwcml2YXRlIENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuOwotCi0gICAgcHVibGljIEZpcnN0UGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBXU0RMMkphdmEgV2l6YXJkcyIpOwotICAgICAgICB0aGlzLmNvZGVnZW5CZWFuPWNvZGVnZW5CZWFuOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJXU0RMIHNlbGVjdGlvbiBwYWdlIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoInBsZWFzZSBTZWxlY3QgdGhlIFdTRGwgZmlsZSBsb2NhdGlvbiIpOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLQotICAgICAgICBsYmxIaW50ID1uZXcgSkxhYmVsKCIiKTsKLSAgICAgICAgYnRuSGludCA9bmV3IEpCdXR0b24oIkhpbnQgPj4iKTsKLSAgICAgICAgYnRuSGludC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKG5ldyBJbnNldHMoMCwwLDAsMCkpKTsKLQotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgbGJsV1NETCA9bmV3IEpMYWJlbCgiV1NETCBGaWxlIExvY2F0aW9uIik7Ci0gICAgICAgIHR4dFdTREwgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIGJ0bkJyb3dzZSA9IG5ldyBKQnV0dG9uKCJCcm93c2UiKTsKLQotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLSAgICAgICAgdGhpcy5hZGQobGJsV1NETAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dFdTREwKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFLCAxLCAyLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuQnJvd3NlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkJyb3dzZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBGaWxlQ2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBXU0RMRmlsZUZpbHRlcigpKTsKLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsID0gRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuQnJvd3NlKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0V1NETC5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRXU0RMRmlsZU5hbWUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMSwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkhpbnQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYoZmxhZyl7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA+PiIpOwotICAgICAgICAgICAgICAgICAgICBsYmxIaW50LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPWZhbHNlOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPDwiKTsKLSAgICAgICAgICAgICAgICAgICAgbGJsSGludC5zZXRUZXh0KGhpbnQpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPXRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChsYmxIaW50ICwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwgMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0gICAgICAgIGlmKHR4dFdTREwuZ2V0VGV4dCgpIT1udWxsICYmIGlzUGFnZUNvbXBsZXRlKCkpewotICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0V1NETEZpbGVOYW1lKHR4dFdTREwuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9PUFRJT05fQSApOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9BICk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9DSE9PU0VSICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0gICAgICAgIGlmKCF0eHRXU0RMLmdldFRleHQoKS50cmltKCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnJlYWRXU0RMKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgcGFyc2luZyB0aGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVkIFdTREwuIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB0aGUgc2VsZWN0ZWQgZmlsZSBpcyBhIHZhbGlkIFdTREwuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciEiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuV1NETF8yX0pBVkFfVFlQRTsKLSAgICB9Ci0gICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGVOYW1lKCl7Ci0gICAgICAgcmV0dXJuIHR4dFdTREwuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9QYWNrYWdlTmFtZVRhYmxlTW9kZWwuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvUGFja2FnZU5hbWVUYWJsZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGIzYjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9QYWNrYWdlTmFtZVRhYmxlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi0vKioKLSAqIENyZWF0ZWQgYnkgSW50ZWxsaUogSURFQS4KLSAqIFVzZXI6IGtlaXRoCi0gKiBEYXRlOiAyMS8xMC8yMDA2Ci0gKiBUaW1lOiAxNDoyNzo0MAotICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICovCi0KLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lVGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCB7Ci0gICAgT2JqZWN0IFtdIFtdIHRhYmxlRGF0YTsKLQotCi0gICAgcHVibGljIFBhY2thZ2VOYW1lVGFibGVNb2RlbChPYmplY3RbXVtdIHRhYmxlRGF0YSkgewotICAgICAgICB0aGlzLnRhYmxlRGF0YSA9IHRhYmxlRGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYWJsZURhdGEoT2JqZWN0IFtdW10gdGFibGVEYXRhKSB7Ci0gICAgICAgIHRoaXMudGFibGVEYXRhID0gdGFibGVEYXRhOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgYykKLSAgIHsKLSAgICAgIHJldHVybiBjb2x1bW5OYW1lc1tjXTsKLSAgIH0KLQotICAgcHVibGljIENsYXNzIGdldENvbHVtbkNsYXNzKGludCBjKQotICAgewotICAgICAgcmV0dXJuIHRhYmxlRGF0YVswXVtjXS5nZXRDbGFzcygpOwotICAgfQotCi0gICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkKLSAgIHsKLSAgICAgIHJldHVybiB0YWJsZURhdGFbMF0ubGVuZ3RoOwotICAgfQotCi0gICBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkKLSAgIHsKLSAgICAgIHJldHVybiB0YWJsZURhdGEubGVuZ3RoOwotICAgfQotCi0gICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHIsIGludCBjKQotICAgewotICAgICAgcmV0dXJuIHRhYmxlRGF0YVtyXVtjXTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3Qgb2JqLCBpbnQgciwgaW50IGMpCi0gICB7Ci0gICAgICB0YWJsZURhdGFbcl1bY10gPSBvYmo7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRhYmxlKGludCByLCBpbnQgYykKLSAgIHsKLSAgICAgIHJldHVybiAgYyA9PSBQQUNLQUdFTkFNRV9DT0xVTU47Ci0KLSAgIH0KLQotICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRVNQQUNFX0NPTFVNTiA9IDA7Ci0gICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUNLQUdFTkFNRV9DT0xVTU4gPSAxOwotCi0KLQotICAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5OYW1lcyA9Ci0gICB7Ci0gICAgICAiTmFtZXNwYWNlIiwgIkN1c3RvbSBQYWNrYWdlIE5hbWUiCi0gICB9OwotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1BsdWdpbkNsYXNzTG9hZGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1BsdWdpbkNsYXNzTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OGYxOGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9QbHVnaW5DbGFzc0xvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBQbHVnaW5DbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQotICAgIC8vdXJscyB3aGljaCBnaXZlcyB0byBjcmVhdGUgdGhlIGNsYXNzTG9hZGVyCi0gICAgcHJpdmF0ZSBVUkxbXSB1cmxzOwotCi0gICAgLy9UbyBrZWVwIGphciBmaWxlcyBpbnNpZGUgL2xpYiBkaXJlY3RvcnkgaW4gdGhlIG1haW4gamFyCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbGliX2phcnNfbGlzdDsKLQotCi0gICAgLyoqCi0gICAgICogUGx1Z2luQ2xhc3NMb2FkZXIgaXMgZXhldGVuZCBmb3JtIFVSTENsYXNzTG9hZGVyICwgYW5kIHRoZSBjb25zdHJ1Y3RvcgotICAgICAqIGhhcyBub3Qgb3ZlcmlkZSB0aGUgc3VwZXIgY29uc3Ryb2N0b3IgLCBidXQgaGFzIGRvbmUgc29tZSBzdHVmZiB0byBmaW5kIG91dAotICAgICAqIGphciBmaWxzIGluc2lkZSAvbGliIGRpcmVjdG9yCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdXJscyAgIDxjb2RlPlVSTDwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjbGFzc2xvYWRlciA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGx1Z2luQ2xhc3NMb2FkZXIoVVJMW10gdXJscywgQ2xhc3NMb2FkZXIgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHVybHMsIHBhcmVudCk7Ci0gICAgICAgIHRoaXMudXJscyA9IHVybHM7Ci0gICAgICAgIGxpYl9qYXJzX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmRMaWJKYXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBqdXN0IHNlYXJjaCBmb3IgamFyIGZpbGVzIGluc2lkZSAvbGliIGRpcmN0b3J5IGFuZCBpZiB0aGVyZSBhcmUgYW55IHRoZW4gdGhvc2UKLSAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcnJheWxpdCAob25seSB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmRMaWJKYXJzKCkgewotICAgICAgICAvKioKLSAgICAgICAgICogdGhvdWdoIHRoZSBVUkwgYXJyYXkgY2FuIGNvbnRhaW5zIG9uZSBvciBtb3JlIHVybHMgLCBJIGhhdmUgb25seSBjb25zaWRlciB0aGUKLSAgICAgICAgICogZmlyc3Qgb25lICwgdGhhdCBpcyB0aGlzIGNsYXNzTG9hZGVyIGlzIG9ubHkgZm9yIEF4aXMyIHN0dWZmIGFuZCB0aGUgY2xhc3Nsb2FkZXIKLSAgICAgICAgICogaXMgY3JlYXRlZCBieSBEZXBsb3ltZW50ICwgc28gdGhlcmUgd29udCBiZSBhbnkgY2hhbmNlIHRvIGhhdmUgbW9yZSB0aGUgb25lIHVybHMgZm9yCi0gICAgICAgICAqIHRoZSBVUkwgYXJyYXkgbGlzdAotICAgICAgICAgKi8KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsc1swXS5nZXRGaWxlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotICAgICAgICAgICAgWmlwRW50cnkgZW50cnk7Ci0gICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGlkIHRoZSBlbnRyeSBuYW1lIHN0YXJ0IHdpdGggL2xpYiBhbmQgZW5kIHdpdGggLmphcgotICAgICAgICAgICAgICAgICAqIHRoZW4gdGhvc2UgZW50cnkgbmFtZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcnJheWxpc3QKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoZW50cnlOYW1lICE9IG51bGwgJiYgKGVudHJ5TmFtZS5zdGFydHNXaXRoKCJsaWIvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5zdGFydHNXaXRoKCJMaWIvIikpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgewotICAgICAgICAgICAgICAgICAgICBsaWJfamFyc19saXN0LmFkZChlbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHppbi5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZSA8Y29kZT5TdHJpbmc8L2NvZGU+ICBOYW1lIG9mIHRoZSBmaWxlIHRvIGJlIGxvYWRlZAotICAgICAqIEByZXR1cm4gPGNvZGU+Q2xhc3M8L2NvZGU+IHJldHVybiBhIGNsYXNzIG9iamVjdCBpZiBpdCBmb3VuZCBlbHNlCi0gICAgICogICAgICAgICB3aWxsIHJldHVybiBudWxsIG9yIGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgPHAvPgotICAgICAqICAgICAgICAgVGhpcyBtZXRob2QgaGFzIGJlZW4gb3ZlcnJpZGRlbiBpbiB0aGUgZm9sbG93aW5nIHdheQotICAgICAqICAgICAgICAgMS4gSXQgY2FsbHMgdGhlIHN1cGVyIGNsYXNzIGFuZCBjaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlIGNsYXNzIGlzIHRoZXJlCi0gICAgICogICAgICAgICBJZiB0aGUgY2xhc3MgaXMgZm91bmQgdGhlbiByZXR1cm4gaXQsIGVsc2UgaWYgc3VwZXIgcmV0dXJuIENsYXNzTm90Zm91bmRFeGNlcHRpb24KLSAgICAgKiAgICAgICAgIDIuIENoZWNrIHdoZXRoZXIgdGhlIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNsYXNzIG5hbWUgZXhpc3RzIGluIG9uZSBvZiBqYXIgZmlsZXMKLSAgICAgKiAgICAgICAgIGluIC9saWIgZGlyZWN0b3IKLSAgICAgKiAgICAgICAgIDMuIElmIGl0IGlzIHRoZXJlIGdldCB0aGUgYnl0ZSBhcnJheSBvdXQgb2YgdGhhdCBhbmQgY3JlYXRlIGEgQ2xhc3Mgb2JqZWN0IG91dCBvZiB0aGF0Ci0gICAgICogICAgICAgICBieSBjYWxsaW5nICJkZWZpbmVDbGFzcygpIiAsIGlmIGl0IHN1Y2NlZWRzIHRoZW4gcmV0dXJuIHRoYXQgZWxzZQotICAgICAqICAgICAgICAgNC4gVGhyb3cgYSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgQ2xhc3MgY2xhID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmRDbGFzcyA9IGZhbHNlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGEgPSBzdXBlci5maW5kQ2xhc3MobmFtZSk7Ci0gICAgICAgICAgICAgICAgZm91bmRDbGFzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGZvdW5kQ2xhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmRDbGFzcykgewotICAgICAgICAgICAgICAgIGJ5dGUgcmF3W10gPSBnZXRCeXRlcyhuYW1lKTsKLSAgICAgICAgICAgICAgICBjbGEgPSBkZWZpbmVDbGFzcyhuYW1lLCByYXcsIDAsIHJhdy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvdW5kQ2xhc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kQ2xhc3MpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiQ2xhc3MgTm90IGZvdW5kIDogIiArIG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIGphciBmaWxlICgvbGliKSBvbmUgYnkgb25lICwgdGhlbiBmb3IgZWFjaCBmaWxlIGNyYWV0ZSA8Y29kZT5aaXBJbnB1dFN0cmVhbTwvY29kZT4KLSAgICAgKiB0aGF0IGFuZCBjaGVjayB0byBzZWUgd2V0aGVyIHRoZXJlIGlzIGFueSBlbnRyeSBlaXRoIGdpdmVuIG5hbWUgaWYgaXQgZm91bmQgdGhlbgotICAgICAqIENyZWF0IEJ5dGVBcnJheU91dFB1dFN0cmVhbSBhbmQgZ2V0IHRoZSBjbGFzcyBieXRlcyB0byB0aGF0IC4KLSAgICAgKiBhZnRlciBnb25pbmcgdGhyb2doIGVhY2ggYW5kIGV2cnkgamFyIGZpbGUgaWYgdGhlcmUgaXMgbm8gZW50cnkgd2l0aCBnaXZlbiBuYW1lCi0gICAgICogd2lsbCB0aHJvdWcgYSBDbGFzc05vdEZvdW5kIGV4ZWNwdGlvbgotICAgICAqCi0gICAgICogQHBhcmFtIGZpbGVuYW1lIDxjb2RlPlN0cmluZzwvY29kZT4gIE5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkIChDbGFzcyBOYW1lKQotICAgICAqIEByZXR1cm4gYnl0dFtdCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJ5dGVbXSBnZXRCeXRlcyhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgY29tcGxldGVGaWxlTmFtZSA9IGZpbGVuYW1lOwotICAgICAgICAvKioKLSAgICAgICAgICogUmVwbGFjaW5nIG9yZy5hcGFjaGUuIC0+IG9yZy9hcGFjaGUvLi4uCi0gICAgICAgICAqLwotICAgICAgICBjb21wbGV0ZUZpbGVOYW1lID0gY29tcGxldGVGaWxlTmFtZS5yZXBsYWNlKCcuJywgJy8nKS5jb25jYXQoIi5jbGFzcyIpOwotICAgICAgICBieXRlIHJhd1tdID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJfamFyc19saXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbGliamFyX25hbWUgPSAoU3RyaW5nKSBsaWJfamFyc19saXN0LmdldChpKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gdGhpcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGxpYmphcl9uYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgWmlwSW5wdXRTdHJlYW0gemluID0gbmV3IFppcElucHV0U3RyZWFtKGluKTsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppbi5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5lbmRzV2l0aChjb21wbGV0ZUZpbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBkYXRhW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNvdW50ID0gemluLnJlYWQoZGF0YSwgMCwgMjA0OCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGRhdGEsIDAsIGNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJhdyA9IG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB6aW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCJDbGFzcyBOb3QgZm91bmQgOiAiICsgZmlsZW5hbWUpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9Qcm9ncmVzc0JhclBhbmVsLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1Byb2dyZXNzQmFyUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1MjM3NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1Byb2dyZXNzQmFyUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NCYXJQYW5lbCAgZXh0ZW5kcyBKUGFuZWwgewotICAgIHByaXZhdGUgIHZvbGF0aWxlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGludCBERUxBWSA9IDUwMDsKLSAgICBwdWJsaWMgdm9sYXRpbGUgU3RyaW5nIHZhbD1udWxsOwotICAgIHByaXZhdGUgSkxhYmVsIHByb2dyZXNzRGVzY3JpcHRpb247Ci0gICAgcHJpdmF0ZSBKUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NTZW50OwotCi0gICAgcHVibGljIFByb2dyZXNzQmFyUGFuZWwgKCl7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHVibGljICB2b2lkIHJlcXVlc3RTdG9wKCkgewotICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIHByb2dyZXNzRGVzY3JpcHRpb24gPW5ldyBKTGFiZWwoKTsKLSAgICAgICAgcHJvZ3Jlc3NEZXNjcmlwdGlvbi5zZXRUZXh0KCIiKTsKLSAgICAgICAgcHJvZ3Jlc3NTZW50ID1uZXcgSlByb2dyZXNzQmFyKCk7Ci0gICAgICAgIHByb2dyZXNzU2VudC5zZXRTdHJpbmdQYWludGVkKHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChwcm9ncmVzc0Rlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsICAxLjAsIDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsIDEwLCAwLCAxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChwcm9ncmVzc1NlbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzVGV4dChTdHJpbmcgcykgewotICAgICAgICBwcm9ncmVzc0Rlc2NyaXB0aW9uLnNldFRleHQocyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NWYWx1ZShpbnQgaSkgewotICAgICAgICBwcm9ncmVzc1NlbnQuc2V0VmFsdWUoaSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGFib3V0VG9EaXNwbGF5UGFuZWwoKSB7Ci0KLSAgICAgICAgc2V0UHJvZ3Jlc3NWYWx1ZSgwKTsKLSAgICAgICAvLyBzZXRQcm9ncmVzc1RleHQoIkNvbm5lY3RpbmcgdG8gU2VydmVyLi4uIik7Ci0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgZGlzcGxheWluZ1BhbmVsKCkgewotCi0gICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotCi0gICAgICAgICAgICAgICAgaW50IG1pbmltdW0gPSBwcm9ncmVzc1NlbnQuZ2V0TWluaW11bSgpOwotICAgICAgICAgICAgICAgIGludCBtYXhpbXVtID1wcm9ncmVzc1NlbnQuZ2V0TWF4aW11bSgpOwotICAgICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5lciA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RvcCAmJiBwcm9ncmVzc1NlbnQgLmdldFZhbHVlKCk8NzUpewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NTZW50IC5zZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBwcm9ncmVzc1NlbnQgLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NTZW50IC5zZXRWYWx1ZSh2YWx1ZSs0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQcm9ncmVzc1ZhbHVlKHZhbHVlKzQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgcHJvZ3Jlc3NEZXNjcmlwdGlvbiAuc2V0VGV4dCgiR2VuYXJhdGUgQ29kZS4gUGxlYXNlIHdhaXQuLi4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCFzdG9wKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1NlbnQgLnNldEluZGV0ZXJtaW5hdGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT1taW5pbXVtOyBpPG1heGltdW07IGkrKykgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdChydW5uZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3VyIHRhc2sgZm9yIGVhY2ggc3RlcCBpcyB0byBqdXN0IHNsZWVwCi0gICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoREVMQVkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWdub3JlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICB0LnN0YXJ0KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9TZWNvbmRQYW5lbC5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9TZWNvbmRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQzNTg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvU2Vjb25kUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Db2RlZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VUkxQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZWNvbmRQYW5lbCAgZXh0ZW5kcyAgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iQ29kZUdlbk9wdGlvbjsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjbWJMYW47Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iU2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iUG9ydE5hbWU7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFBhY2FrZ2VOYW1lOwotICAgIHByaXZhdGUgSkNvbWJvQm94IGNtYmRidHlwZTsKLSAgICBwcml2YXRlIEpDaGVja0JveCBjaGtUZXN0Q2FzZTsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiBjbGllbnRTaWRlOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHJkQm90aDsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByZHN5bjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByZGFzeW5jOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHNlcnZlclNpZGU7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggc2VydmljZVhNTDsKLSAgICBwcml2YXRlIEpDaGVja0JveCBzZXJ2ZXJTaWRlSW50ZXJmYWNlOwotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIGFsbDsKLSAgICBwcml2YXRlIEpUYWJsZSB0YWJsZTsKLSAgICBwcml2YXRlIEpTY3JvbGxQYW5lIHNwVGFibGU7Ci0gICAgcHJpdmF0ZSBMaXN0IHNlcnZpY2VOYW1lTGlzdDsKLSAgICBwcml2YXRlIFBhY2thZ2VOYW1lVGFibGVNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuOwotCi0gICAgcHVibGljIFNlY29uZFBhbmVsKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cyxDb2RlZ2VuQmVhbiBjb2RlZ2VuQmVhbikgewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAiQXhpczIgSWRlYSBQbHVnaW4gV1NETDJKYXZhIFdpemFyZHMiKTsKLSAgICAgICAgdGhpcy5jb2RlZ2VuQmVhbj1jb2RlZ2VuQmVhbjsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiT3B0aW9ucyIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJTZXQgdGhlIG9wdGlvbnMgZm9yIHRoZSBjb2RlIGdlbmVyYXRvci4gSWYgeW91IHdpc2ggdG8gZWRpdCB0aGUgY29kZWdlbiBvcHRpb25zLCBTZWxlY3QgY3VzdG9tIik7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpewotCi0gICAgICAgIGNtYkxhbiA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iTGFuLmFkZEl0ZW0oImphdmEiKTsKLSAgICAgICAgY21iTGFuLnNldFRvb2xUaXBUZXh0KCJTZWxlY3QgdGhlIGxhbmd1YWdlIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSIpOwotCi0gICAgICAgIGNtYlNlcnZpY2VOYW1lID0gbmV3IEpDb21ib0JveCgpOwotICAgICAgICBhZGQoY21iU2VydmljZU5hbWUpOwotICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRUb29sVGlwVGV4dCgiU2VsZWN0IHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IiKTsKLQotICAgICAgICBjbWJQb3J0TmFtZSA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iUG9ydE5hbWUuc2V0VG9vbFRpcFRleHQoIlNlbGVjdCB0aGUgcG9ydCBuYW1lIHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZCBmb3IiKTsKLQotICAgICAgICB0eHRQYWNha2dlTmFtZSA9IG5ldyBKVGV4dEZpZWxkKCJvcmcuYXhpczIiKTsKLSAgICAgICAgdHh0UGFjYWtnZU5hbWUuc2V0VG9vbFRpcFRleHQoIlNldCB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSIpOwotCi0gICAgICAgIGNtYmRidHlwZSA9IG5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iZGJ0eXBlLmFkZEl0ZW0oImFkYiIpOwotICAgICAgICBjbWJkYnR5cGUuYWRkSXRlbSgieG1sYmVhbnMiKTsKLSAgICAgICAgY21iZGJ0eXBlLmFkZEl0ZW0oIm5vbmUiKTsKLSAgICAgICAgY21iZGJ0eXBlLnNldFRvb2xUaXBUZXh0KCJTZWxlY3QgdGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yayB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIHByb2Nlc3MiKTsKLQotICAgICAgICBjaGtUZXN0Q2FzZSA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIFRlc3QgQ2FzZSIsIGZhbHNlKTsKLSAgICAgICAgY2hrVGVzdENhc2Uuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgY2hrVGVzdENhc2Uuc2V0VG9vbFRpcFRleHQoIkEgdGVzdCBjYXNlIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIHRoaXMgaXMgY2hlY2tlZCIpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIGdlbmVyYXRpb25UeXBlID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLSAgICAgICAgY2xpZW50U2lkZSA9IG5ldyBKUmFkaW9CdXR0b24oIkdlbmVyYXRlIENsaWVudCBTaWRlIix0cnVlKTsKLSAgICAgICAgZ2VuZXJhdGlvblR5cGUuYWRkKGNsaWVudFNpZGUpOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwIGJ1dHRvbkdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7Ci0KLSAgICAgICAgcmRCb3RoID0gbmV3IEpSYWRpb0J1dHRvbigiR2VuZXJhdGUgYm90aCBzeW5jIGFuZCBhc3luYyIsIHRydWUpOwotICAgICAgICBidXR0b25Hcm91cC5hZGQocmRCb3RoKTsKLQotICAgICAgICByZHN5biA9IG5ldyBKUmFkaW9CdXR0b24oIkdlbmVyYXRlIHN5bmMgb25seSIsIGZhbHNlKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJkc3luKTsKLQotICAgICAgICByZGFzeW5jID0gbmV3IEpSYWRpb0J1dHRvbigiR2VuZXJhdGUgYXN5bmMgb25seSIsIGZhbHNlKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJkYXN5bmMpOwotCi0gICAgICAgIHNlcnZlclNpZGUgPSBuZXcgSlJhZGlvQnV0dG9uKCJHZW5lcmF0ZSBTZXJ2ZXIgU2lkZSIpOwotICAgICAgICBnZW5lcmF0aW9uVHlwZS5hZGQoc2VydmVyU2lkZSk7Ci0KLSAgICAgICAgc2VydmljZVhNTCA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIGRlZmF1bHQgc2VydmljZS54bWwiLCBmYWxzZSk7Ci0KLSAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZSA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3Igc2tlbGV0b24iLCBmYWxzZSk7Ci0KLSAgICAgICAgYWxsID0gbmV3IEpSYWRpb0J1dHRvbigiR2VuZXJhdGUgQWxsIik7Ci0gICAgICAgIGdlbmVyYXRpb25UeXBlLmFkZChhbGwpOwotCi0gICAgICAgIG1vZGVsID0gbmV3IFBhY2thZ2VOYW1lVGFibGVNb2RlbChuZXcgT2JqZWN0IFsxXVsyXSk7Ci0gICAgICAgIHRhYmxlID0gbmV3IEpUYWJsZShtb2RlbCk7ICAgICAgICAKLSAgICAgICAgc3BUYWJsZT1uZXcgSlNjcm9sbFBhbmUodGFibGUpOwotCi0gICAgICAgIGNtYkNvZGVHZW5PcHRpb24gPW5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iQ29kZUdlbk9wdGlvbiAuYWRkSXRlbSgiZGVmYXVsdCIpOwotICAgICAgICBjbWJDb2RlR2VuT3B0aW9uIC5hZGRJdGVtKCJjdXN0b20iKTsKLSAgICAgICAgY21iQ29kZUdlbk9wdGlvbiAuc2V0VG9vbFRpcFRleHQoIlNlbGVjdCB0aGUgQ29kZWdlbiBvcHRpb24iKTsKLQotCi0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkNvZ2VuIE9wdGlvbiIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYkNvZGVHZW5PcHRpb24KLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNULCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotICAgICAgICBjbWJDb2RlR2VuT3B0aW9uLmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFN0YXRlQ2hhbmdlKCkgPT0gSXRlbUV2ZW50LlNFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWRGb3JDb2RlZ2VuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIk91dCBwdXQgbGFuZyIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsMTAsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoY21iTGFuCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDUsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiU2VydmljZSBuYW1lIikKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoY21iU2VydmljZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgNSwgMCwxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJwb3J0IE5hbWUiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQoY21iUG9ydE5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJEYXRhQmluZGluZyIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChjbWJkYnR5cGUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgNSwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiQ3VzdG9tIFBhY2tlZ2UiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQodHh0UGFjYWtnZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgNSwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQoY2hrVGVzdENhc2UKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNiwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotCi0gICAgICAgIHRoaXMuYWRkKGNsaWVudFNpZGUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgOCwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGNsaWVudFNpZGUuYWRkSXRlbUxpc3RlbmVyKG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0U3RhdGVDaGFuZ2UoKSA9PSBJdGVtRXZlbnQuU0VMRUNURUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbSgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChyZEJvdGgKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgOSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKHJkc3luCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDksIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDUsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKHJkYXN5bmMKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgOSwgMSwgMSwgMS4wLDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotCi0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChzZXJ2ZXJTaWRlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDExLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgc2VydmVyU2lkZS5hZGRJdGVtTGlzdGVuZXIobmV3IEl0ZW1MaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS5nZXRTdGF0ZUNoYW5nZSgpID09IEl0ZW1FdmVudC5TRUxFQ1RFRCkgewotICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkRm9yQ3VzdG9tKCk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKHNlcnZpY2VYTUwKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTIsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChzZXJ2ZXJTaWRlSW50ZXJmYWNlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLCA1LCAwLDEwKSwgMCwgMCkpOwotCi0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotCi0gICAgICAgIHRoaXMuYWRkKGFsbAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxNCwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgYWxsLmFkZEl0ZW1MaXN0ZW5lcihuZXcgSXRlbUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaXRlbVN0YXRlQ2hhbmdlZChJdGVtRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChlLmdldFN0YXRlQ2hhbmdlKCkgPT0gSXRlbUV2ZW50LlNFTEVDVEVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWRGb3JDdXN0b20oKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxNSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMTAsIDEsMSksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJOYW1lc3BhY2UgdG8gUGFja2FnZSBNYXBwaW5nIikKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTYsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEsMTAsIDAsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoc3BUYWJsZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxNywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxLDEwLCAyMCwxMCksIDAsIDApKTsKLQotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldEVuYWJsZWRGb3JDb2RlZ2VuVHlwZSgpOwotCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9MQVNUX0EgKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0ZJUlNUX0EgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKXsKLSAgICAgICAgY2hlY2tQYWdlQ29tbGV0ZSgpOwotICAgICAgICBwb3B1bGF0ZVBhcmFtc0Zyb21XU0RMKCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbG9hZE5hbWVzcGFjZXMoQ29sbGVjdGlvbiBuYW1lc3BhY2VNYXApewotCi0gICAgICAgIEl0ZXJhdG9yIG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VNYXAuaXRlcmF0b3IoKTsKLSAgICAgICAgT2JqZWN0IHRhYmxlRGF0YSBbXVtdID0gbmV3IE9iamVjdFtuYW1lc3BhY2VNYXAuc2l6ZSgpXVsyXTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZShuYW1lc3BhY2VzLmhhc05leHQoKSl7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKW5hbWVzcGFjZXMubmV4dCgpOwotICAgICAgICAgICAgdGFibGVEYXRhW2ldWzBdID0gbmFtZXNwYWNlOwotICAgICAgICAgICAgdGFibGVEYXRhW2ldWzFdID0gZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgICAgIG1vZGVsLnNldFRhYmxlRGF0YSh0YWJsZURhdGEpOwotCi0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRGb3JDb2RlZ2VuVHlwZSgpewotICAgICAgICBpZihjbWJDb2RlR2VuT3B0aW9uLmdldFNlbGVjdGVkSXRlbSgpLmVxdWFscygiZGVmYXVsdCIpICl7Ci0gICAgICAgICAgICBjbWJkYnR5cGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbWJMYW4uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbWJQb3J0TmFtZSAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHR4dFBhY2FrZ2VOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgY21iZGJ0eXBlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgaWYoY2hrVGVzdENhc2UuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBjbGllbnRTaWRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmRCb3RoIC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJkc3luLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmRhc3luYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNlcnZlclNpZGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHNwVGFibGUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBzZXJ2aWNlWE1MLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGFsbC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBjbWJkYnR5cGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGNtYkxhbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgY21iUG9ydE5hbWUgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdHh0UGFjYWtnZU5hbWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGNtYmRidHlwZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgIGlmKCFjbGllbnRTaWRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIGNsaWVudFNpZGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjbGllbnRTaWRlLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY2xpZW50U2lkZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2VydmVyU2lkZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHNwVGFibGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFsbC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkRm9yQ3VzdG9tKCl7Ci0gICAgICAgIGlmKGNsaWVudFNpZGUuaXNTZWxlY3RlZCgpKXsKLSAgICAgICAgICAgIGlmKHNlcnZpY2VYTUwuaXNTZWxlY3RlZCgpfHxzZXJ2ZXJTaWRlSW50ZXJmYWNlLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocmRhc3luYy5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIHJkYXN5bmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIHJkYXN5bmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCFyZEJvdGguaXNTZWxlY3RlZCgpKXsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBpZihyZHN5bi5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIHJkc3luLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmRzeW4uc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgcmRzeW4uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoa1Rlc3RDYXNlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH1lbHNlIGlmKHNlcnZlclNpZGUuaXNTZWxlY3RlZCgpKXsKLSAgICAgICAgICAgICBpZihzZXJ2aWNlWE1MLmlzU2VsZWN0ZWQoKXx8c2VydmVyU2lkZUludGVyZmFjZS5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIHNlcnZlclNpZGUuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNlcnZlclNpZGVJbnRlcmZhY2Uuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNlcnZpY2VYTUwuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlWE1MLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIHJkYXN5bmMuaXNTZWxlY3RlZCgpfHxyZEJvdGguaXNTZWxlY3RlZCgpfHxyZHN5bi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkc3luLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkQm90aC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZHN5biAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgcmRhc3luYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmRzeW4gLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY2hrVGVzdENhc2UuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH1lbHNlIGlmKGFsbC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgY2hrVGVzdENhc2Uuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGlmKHNlcnZpY2VYTUwuaXNTZWxlY3RlZCgpfHxzZXJ2ZXJTaWRlSW50ZXJmYWNlLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmVyU2lkZUludGVyZmFjZS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTaWRlSW50ZXJmYWNlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIHJkYXN5bmMuaXNTZWxlY3RlZCgpfHxyZEJvdGguaXNTZWxlY3RlZCgpfHxyZHN5bi5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkc3luLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZGFzeW5jLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJkQm90aC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZHN5biAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgcmRhc3luYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZEJvdGguc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmRzeW4gLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSl7Ci0gICAgICAgIHJldHVybiAgVVJMUHJvY2Vzc29yLm1ha2VQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgIH0KLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5XU0RMXzJfSkFWQV9UWVBFOwotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQYWdlQ29tbGV0ZSgpewotICAgICAgICBpZihjbWJDb2RlR2VuT3B0aW9uLmdldFNlbGVjdGVkSXRlbSgpLmVxdWFscygiZGVmYXVsdCIpKXsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICBpZih0eHRQYWNha2dlTmFtZS5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIHBvcHVsYXRlIHRoZSBzZXJ2aWNlIGFuZCB0aGUgcG9ydCBmcm9tIHRoZSBXU0RMIHRoaXMgbmVlZHMgdG8gYmUgcHVibGljCi0gICAgICogc2luY2UgdGhlIFdTRExzZWxlY3Rpb24gcGFnZSBtYXkgY2FsbCB0aGlzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVQYXJhbXNGcm9tV1NETCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBsbmFtZSA9IGNvZGVnZW5CZWFuLmdldFdTRExGaWxlTmFtZSgpOwotICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMobG5hbWUudHJpbSgpKSkgewotCi0gICAgICAgICAgICAgICAgY29kZWdlbkJlYW4ucmVhZFdTREwoKTsKLQotICAgICAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgY29tYm8ncwotICAgICAgICAgICAgICAgLy8gc2V0Q29tYm9Cb3hFbmFibGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lTGlzdCA9IGNvZGVnZW5CZWFuLmdldFNlcnZpY2VMaXN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlTmFtZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNtYlNlcnZpY2VOYW1lLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VOYW1lTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBsb2NhbCBwYXJ0IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgY21iU2VydmljZU5hbWUuYWRkSXRlbSgoKFFOYW1lKSBzZXJ2aWNlTmFtZUxpc3QuZ2V0KGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIGZpcnN0IG9uZSBhcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICBjbWJTZXJ2aWNlTmFtZS5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICAgICAgICAgICAgICAvL3NldENvbWJvQm94RW5hYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgbG9hZFBvcnROYW1lcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNlcnZpY2UgbmFtZSBsaXN0IGJlaW5nIGVtcHR5IG1lYW5zIHdlIGFyZSBzd2l0Y2hpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGludGVyZmFjZSBtb2RlCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbWJTZXJ2aWNlTmFtZSE9bnVsbCkgY21iU2VydmljZU5hbWUgLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY21iUG9ydE5hbWUhPW51bGwpIGNtYlBvcnROYW1lLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBjb21ibydzCi0gICAgICAgICAgICAgICAgICAgLy8gc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAvL3RoaXMgaXMgbm90IGFuIGVycm9yCi0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwb3B1bGF0ZVBhY2thZ2VOYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAvL3BvcHVsYXRlIHRoZSBuYW1lc3BhY2VzcwotICAgICAgICAgICAgICAgIGxvYWROYW1lc3BhY2VzKGNvZGVnZW5CZWFuLmdldERlZmluaXRpb25OYW1lc3BhY2VNYXAoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY29tYm8ncwotICAgICAgICAgICAgc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY29tYm8ncwotICAgICAgICAgICAgc2V0Q29tYm9Cb3hFbmFibGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlUGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHRoaXMudHh0UGFjYWtnZU5hbWUuc2V0VGV4dChjb2RlZ2VuQmVhbi5wYWNrYWdlRnJvbVRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldENvbWJvQm94RW5hYmxlKGJvb2xlYW4gYikgewotICAgICAgICBpZiAoY21iU2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgY21iU2VydmljZU5hbWUgLnNldEVuYWJsZWQoYik7Ci0gICAgICAgICAgICBjbWJQb3J0TmFtZSAuc2V0RW5hYmxlZChiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgbG9hZFBvcnROYW1lcygpIHsKLSAgICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gY21iU2VydmljZU5hbWUuZ2V0U2VsZWN0ZWRJbmRleCgpOwotICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IHBvcnRzID0gY29kZWdlbkJlYW4uZ2V0UG9ydE5hbWVMaXN0KChRTmFtZSkgc2VydmljZU5hbWVMaXN0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLSAgICAgICAgICAgIGlmICghcG9ydHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY21iUG9ydE5hbWUucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgIGNtYlBvcnROYW1lLmFkZEl0ZW0ocG9ydHMuZ2V0KGkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbWJQb3J0TmFtZS5zZXRTZWxlY3RlZEluZGV4KDApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvL1RvZG8gZXJyb3IgbWVzc2FnZSBudWxsCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVPcHRpb25zKCl7Ci0gICAgICAgIHBvcHVsYXRlUGFyYW1zRnJvbVdTREwoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGRpYWxvZ0NoYW5nZWQoKSB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0KLSAgICAgICAgaWYgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIC8vVG9kbyBlcnJvciBtZXNzYWdlICJGaWxlIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCIKLSAgICAgICAgICAgIHNldEVycm9yKCJGaWxlIG5hbWUgc2hvdWxkIGJlIHNwZWNpZmllZCIsdHJ1ZSk7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy90cnkgcG9wdWxhdGUgdGhlIG9wdGlvbnMKLSAgICAgICAgLy8gICBnZXRXaXphcmRDb21wb25lbnRzKCkuZ2V0V2l6YXJkUGFuZWwoMykucG9wdWxhdGVPcHRpb25zKCk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0dXMKLSAgICAgICAgLy9Ub2RvIGVycm9yIG1lc3NhZ2UgbnVsbAotCi0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRMYW5ndWFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGNtYkxhbi5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiB0aGUgYXN5bmMgb25seSBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNvZGUgb25seSIgaXMgY2hlY2tlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNPbmx5T24oKSB7Ci0gICAgICAgIHJldHVybiByZGFzeW5jLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogdGhlIHN5bmMgb25seSBzdGF0dXMKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAiR2VuZXJhdGUgc3luY2hyb25vdXMgY29kZSBvbmx5IiBpcyBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW5jT25seU9uKCkgewotICAgICAgICByZXR1cm4gcmRzeW4uaXNTZWxlY3RlZCgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZQotICAgICAqCi0gICAgICogQHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYWNrYWdlIG5hbWUgdG8gdXNlIGZvciBjb2RlIGdlbmVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICBpZiAoIiIuZXF1YWxzKHR4dFBhY2FrZ2VOYW1lLmdldFRleHQoKS50cmltKCkpKXsKLSAgICAgICAgICAgIC8vd2UgZG8gbm90IGFsbG93IHRoZSBwYWNrYWdpbmcgdG8gYmUgZW1wdHkKLSAgICAgICAgICAgIC8vaWYgdGhlIHVzZXIgc2V0cyBpdCB0byBlbXB0eSB3ZSBzZXQgaXQgdG8KLSAgICAgICAgICAgIC8vdGhlIGRlZmF1bHQKLSAgICAgICAgICAgIHJldHVybiBVUkxQcm9jZXNzb3IuREVGQVVMVF9QQUNLQUdFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLnR4dFBhY2FrZ2VOYW1lLmdldFRleHQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhlIHNlcnZlcnNpZGUgc3RhdHVzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIFNlcnZlci1TaWRlIiBpcyBjaGVja2VkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJzaWRlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTaWRlLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgIkdlbmVyYXRlIFhNTCBjb25maWd1cmF0aW9uIGZpbGUiIGlzIGNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclhNTCgpIHsKLSAgICAgICAgaWYgKHRoaXMuc2VydmljZVhNTC5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZpY2VYTUwuaXNTZWxlY3RlZCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8qKgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmICJHZW5lcmF0ZSB0ZXN0IGNhc2UiIGlzIGNoZWNrZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlVGVzdENhc2UoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoa1Rlc3RDYXNlLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG51bGwgaWYgcG9ydG5hbWUgaXMgZW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBjbWJQb3J0TmFtZS5nZXRTZWxlY3RlZEluZGV4KCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0aGlzLmNtYlBvcnROYW1lLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsIHx8IHRleHQudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHJldHVybiBudWxsIGlmIHRoZSB0ZXh0IGlzIGVtcHR5Ci0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgewotICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSBjbWJTZXJ2aWNlTmFtZS5nZXRTZWxlY3RlZEluZGV4KCk7Ci0gICAgICAgIC8vIGNhdGVyIGZvciB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbWJvJ3MgY2FuIGJlIGVtcHR5Ci0gICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgewotICAgICAgICAgICAgU3RyaW5nIHRleHQgPSB0aGlzLmNtYlNlcnZpY2VOYW1lLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC50cmltKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJpbmRlck5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNtYmRidHlwZS5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOwotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJTaWRlSW50ZXJmYWNlLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZUFsbCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuYWxsLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5zMlBrZ01hcHBpbmcoKXsKLSAgICAgICAgU3RyaW5nIHJldHVybkxpc3Q9IiI7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlVmFsdWU7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPHRhYmxlLmdldFJvd0NvdW50KCkgO2krKyl7Ci0gICAgICAgICAgICBwYWNrYWdlVmFsdWUgPSB0YWJsZS5nZXRWYWx1ZUF0KGksMSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlVmFsdWUhPW51bGwgJiYgISIiLmVxdWFscyhwYWNrYWdlVmFsdWUpKXsKLSAgICAgICAgICAgICAgICByZXR1cm5MaXN0ID0gcmV0dXJuTGlzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAoIiIuZXF1YWxzKHJldHVybkxpc3QpPyIiOiIsIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuZ2V0VmFsdWVBdChpLDApLnRvU3RyaW5nKCkrICI9IiArIHBhY2thZ2VWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiIuZXF1YWxzKHJldHVybkxpc3QpP251bGw6cmV0dXJuTGlzdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ3VzdG9tUGFja2FnZU5hbWVNb2RpZnlFdmVudCgpIHsKLSAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgYWRkIGFzIGEgdGVtcG9yeSBmaXggZm9yIHRoZSBBeGlzMi0xMzY4Ci0gICAgICAgIC8vIFRPRE8gZml4IHRoaXMgcGVybWFuYW50bHkuCi0gICAgICAgIFN0cmluZyB0ZXh0ID0gdGhpcy50eHRQYWNha2dlTmFtZS5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICgodGV4dCA9PSBudWxsKSB8fCAodGV4dC50cmltKCkuZXF1YWxzKCIiKSl8fCAodGV4dC5lbmRzV2l0aCgiLiIpKSB8fCAodGV4dC5zdGFydHNXaXRoKCIuIikpKSB7Ci0gICAgICAgICAgICAvL1RvZG8gZXJyb3IgbWVzc2FnZSAiSW52YWxpZCBwYWNrYWdlIG5hbWUuIFBsZWFzZSBlbnRlciBhIHZhbGlkIHBhY2thZ2UgbmFtZS4iCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgLy9Ub2RvIGVycm9yIG1lc3NhZ2UgbnVsbAotICAgIH0KLQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1NlcnZpY2VBcmNoaXZlQ3JlYXRvci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZDYyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1NlcnZpY2VBcmNoaXZlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmlkZWE7Ci0KLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQWN0aW9uUGxhY2VzOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFjdGlvblN5c3RlbS5BbkFjdGlvbjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQW5BY3Rpb25FdmVudDsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uUHJlc2VudGF0aW9uOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VBcmNoaXZlQ3JlYXRvciBleHRlbmRzIEFuQWN0aW9uIHsKLSAgICBwcml2YXRlIEltYWdlSWNvbiBteUljb247Ci0KLSAgICBwdWJsaWMgU2VydmljZUFyY2hpdmVDcmVhdG9yKCkgewotICAgICAgICBzdXBlcigiR0MiLCAiQ3JlYXRlIFNlcnZpY2UgQXJjaGl2ZSBGaWxlIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFuQWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vICAgICAgICBKYXZhMkNvZGVGcmFtZSB3aW4gPSBuZXcgSmF2YTJDb2RlRnJhbWUoKTsKLS8vICAgICAgICB3aW4uc2V0UHJvamVjdCgoUHJvamVjdCkgZXZlbnQuZ2V0RGF0YUNvbnRleHQoKS5nZXREYXRhKERhdGFDb25zdGFudHMuUFJPSkVDVCkpOwotLy8gICAgICAgIHdpbi5wYWNrKCk7Ci0vLyAgICAgICAgd2luLnNob3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoQW5BY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBzdXBlci51cGRhdGUoZXZlbnQpOwotICAgICAgICBQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uID0gZXZlbnQuZ2V0UHJlc2VudGF0aW9uKCk7Ci0gICAgICAgIGlmIChBY3Rpb25QbGFjZXMuTUFJTl9UT09MQkFSLmVxdWFscyhldmVudC5nZXRQbGFjZSgpKSkgewotICAgICAgICAgICAgaWYgKG15SWNvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgamF2YS5uZXQuVVJMIHJlc291cmNlID0gU2VydmljZUFyY2hpdmVDcmVhdG9yLmNsYXNzLmdldFJlc291cmNlKCIvaWNvbnMvZ2FyYmFnZS5wbmciKTsKLSAgICAgICAgICAgICAgICBteUljb24gPSBuZXcgSW1hZ2VJY29uKHJlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXNlbnRhdGlvbi5zZXRJY29uKG15SWNvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1dTREwySmF2YU91dHB1dFBhbmVsLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9pZGVhL1dTREwySmF2YU91dHB1dFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzBjOTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9XU0RMMkphdmFPdXRwdXRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZTsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLkNvZGVnZW5CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YU91dHB1dFBhbmVsIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dG91dHB1dDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0YXhpc0hvbWU7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dGphckZpbGVOYW1lOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Ccm93c2VPdXRwdXQ7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkJyb3dzZUF4aXNIb21lOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5DaGVja0xpYjsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRDdXJyZW50UHJvamVjdDsKLSAgICBwcml2YXRlIEpSYWRpb0J1dHRvbiByYWRDdXN0b21Mb2NhdGlvbjsKLSAgICBwcml2YXRlIEpDaGVja0JveCBjaGJBZGRBeGlzQ29kZWdlbkphcjsKLSAgICBwcml2YXRlIEpDaGVja0JveCBjaGJBZGRBeGlzTGliOwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNoYkNyZWF0ZUphcjsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxNZXNzYWdlOwotICAgIHByaXZhdGUgSlRleHRBcmVhIHR4dGFUaWx0ZTsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjbWJDdXJyZW50UHJvamVjdDsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjbWJNb2R1bGVTcmM7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgIGxibEFzaXhIb21lOwotICAgIHByaXZhdGUgSkxhYmVsIGxibEphckZpbGVOYW1lOwotICAgIHByaXZhdGUgSkxhYmVsIGxibG91dHB1dDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxNb2R1bGU7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbGJsRGlyZWN0b3J5OwotICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBEaXJDaG9vc2VyPW5ldyBKRmlsZUNob29zZXIoKTsKLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyB0aXRsZT0iU2VsZWN0IG9uZSBvZiBiZWxvdyB0byBzYXZlIHRoZSBjb2RlZ2VuIG91dHB1dCBlaXRoZXIgb24gaWRlYSB3b3Jrc3BhY2UgcHJvamVjdCBvciBvbiBmaWxlICIgKwotICAgICAgICAgICAgInN5c3RlbSBhbmQgdGhlbiBicm93c2UgdG8gZW50ZXIgdGhlIG91dHB1dCBwYXRoIjsKLSAgICBmaW5hbCBwcml2YXRlIFN0cmluZyBoaW50PSJJZiB5b3UgaGF2ZSBBeGlzMiBiaW5hcnkgZGlzdHJpYnV0aW9uIG9yIEF4aXMgc291cmNlLCB0aGVuIHlvdSBjYW4gYWRkIHRob3NlIGxpYnMgYWxzbyB0byB0aGUiICsKLSAgICAgICAgICAgICIgcmVzdWx0ZWQgY29kZWdlbiBwcm9qZWN0IGJ5IGNoZWNraW5nIHRoZSBcIkFkZCBBeGlzMiBMaWJyYXJpZXMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0ZWQgcHJvamVjdFwiIiArCi0gICAgICAgICAgICAiIGNoZWNrIGJveCBhbmQgc3BlY2lmeWluZyB0aGUgQXhpczIgaG9tZS4gQW5vdGhlciBvcHRpb24geW91IGhhdmUgaXMgdG8gY29tcGlsZSB0aGUgY29kZWdlbiAiICsKLSAgICAgICAgICAgICIgcmVzdWx0IHByb2plY3QgYW5kIGFkZCBpdCBhcyBhIGphciBmaWxlIGluIHRoZSBsaWIgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHRlZCBwcm9qZWN0LCBmb3IgdGhhdCB5b3UgY2FuIiArCi0gICAgICAgICAgICAiIGNoZWNrIHRoZSBcIkNyZWF0ZSBhIGphciBmaWxlIG9mIGNvZGVnZW4gcmVzdWx0IHByb2plY3QgYW5kIGFkZCB0byByZXN1bHRlZCBwcm9qZWN0IGxpYiBmb2xkZXJcIiIgKwotICAgICAgICAgICAgIiBjaGVja2JveCBhbmQgdGhlbiBnaXZlIHRoZSBqYXIgZmlsZSBuYW1lIHRoYXQgeW91IHByZWZlci4gXG4iICsKLSAgICAgICAgICAgICIgSWYgeW91IGFyZSBhZGRpbmcgdGhlIGNvZGVnZW4gcmVzdWx0IHRvIGEgZWNsaXBzZSBwcm9qZWN0IG9uIGN1cnJlbnQgZWNsaXBzZSB3b3Jrc3BhY2UsIiArCi0gICAgICAgICAgICAiIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVmcmVzaCB0aGF0IHBhcnRpY3VsYXIgZWNsaXBzZSBwcm9qZWN0LlxuIiArCi0gICAgICAgICAgICAiIEFsc28gaWYgeW91IHNlbGVjdCB0aGUgb3B0aW9ucyB0byBhZGQgbGlicyB0byB0aGUgcHJvamVjdCwgbWFrZSBzdXJlIHRvIGFkZCB0aG9zZSBsaWJzIHRvIHRoZSIgKwotICAgICAgICAgICAgIiBwcm9qZWN0IGxpYnJhcnkgcGF0aC4iOwotCi0gICAgcHJpdmF0ZSBDb2RlZ2VuQmVhbiBjb2RlZ2VuQmVhbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgdHhhSGludDsKLSAgICBwcml2YXRlIGJvb2xlYW4gamFyRmlsZUNvcHlPcHRpb24gPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBheGlzMkxpYnNMb2NhdGlvbiA9IG51bGw7Ci0KLQotICAgIHB1YmxpYyBXU0RMMkphdmFPdXRwdXRQYW5lbChXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsQ29kZWdlbkJlYW4gY29kZWdlbkJlYW4sIFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAiQXhpczIgSWRlYSBQbHVnaW4gV1NETDJKYXZhIFdpemFyZHMiKTsKLSAgICAgICAgdGhpcy5jb2RlZ2VuQmVhbj1jb2RlZ2VuQmVhbjsKLSAgICAgICAgdGhpcy5wcm9qZWN0PXByb2plY3Q7Ci0gICAgICAgIHNldFBhbmVsVG9wVGl0bGUoIk91dHB1dCIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJzZXQgdGhlIG91dCBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlIik7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgYnRuSGludCA9bmV3IEpCdXR0b24oIkhpbnQgPj4iKTsKLSAgICAgICAgYnRuSGludC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKG5ldyBJbnNldHMoMCwwLDAsMCkpKTsKLSAgICAgICAgbGJsTWVzc2FnZSA9IG5ldyBKTGFiZWwoKTsKLSAgICAgICAgbGJsTWVzc2FnZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIGxibE1lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci53aGl0ZSk7Ci0gICAgICAgIGJ0bkJyb3dzZUF4aXNIb21lID1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLSAgICAgICAgYnRuQnJvd3NlT3V0cHV0ID1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLSAgICAgICAgYnRuQ2hlY2tMaWIgPW5ldyBKQnV0dG9uKCJDaGVjayBMaWJzLi4iKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3QgPW5ldyBKQ29tYm9Cb3goKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYz1uZXcgSkNvbWJvQm94KCk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdHh0b3V0cHV0PW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHR4dGF4aXNIb21lID1uZXcgSlRleHRGaWVsZCgiVW5wYWNrZWQgQXhpczIgYmluYXJ5IGhvbWUgT3IgQXhpczIgc291cmNlIGxvY2F0aW9uIik7Ci0gICAgICAgIHR4dGphckZpbGVOYW1lID1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0eHRhVGlsdGUgPW5ldyBKVGV4dEFyZWEodGl0bGUpOwotICAgICAgICB0eHRhVGlsdGUuc2V0Qm9yZGVyKG51bGwpOwotICAgICAgICB0eHRhVGlsdGUuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLSAgICAgICAgdHh0YVRpbHRlLnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eHRhVGlsdGUuc2V0V3JhcFN0eWxlV29yZCh0cnVlKTsKLSAgICAgICAgdHh0YVRpbHRlLnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIGxibEFzaXhIb21lPW5ldyBKTGFiZWwoIkF4aXMyIEhvbWUiKTsKLSAgICAgICAgbGJsQXNpeEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxibEphckZpbGVOYW1lID0gbmV3IEpMYWJlbCgiSmFyIEZpbGUgTmFtZSIpOwotICAgICAgICBsYmxKYXJGaWxlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsRGlyZWN0b3J5PSBuZXcgSkxhYmVsKCJTZWxlY3QgdGhlIERpcmVjdG9yeSIpOwotICAgICAgICBsYmxNb2R1bGUgPSBuZXcgSkxhYmVsKCJTZWxlY3QgdGhlIE1vZHVsZSIpOwotICAgICAgICBsYmxvdXRwdXQgPW5ldyBKTGFiZWwoIk91dCBwdXQgcGF0aCIpOwotICAgICAgICBjaGJBZGRBeGlzQ29kZWdlbkphciA9bmV3IEpDaGVja0JveCgiQWRkIHRoZSBBeGlzMiBDb2RlZ2VuIGphcnMgdG8gdGhlIGNvZGVnZW4gcmVzdWx0ZWQgcHJvamVjdCIpOwotICAgICAgICBjaGJBZGRBeGlzTGliID1uZXcgSkNoZWNrQm94KCIgQWRkIEF4aXMyIGxpYnJhcmllcyB0byB0aGUgY29kZWdlbiByZXN1bHQgcHJvamVjdCAiKTsKLSAgICAgICAgY2hiQ3JlYXRlSmFyPW5ldyBKQ2hlY2tCb3goIiBDcmVhdGUgYSBqYXIgZmlsZSBvZiBjb2RlZ2VuIHJlc3VsdCBwcm9qZWN0IGFuZCBhZGQgdG8gcmVzdWx0ZWQgcHJvamVjdCBsaWIgZm9sZGVyKERlZmF1bHQgOkNvZGVnZW5SZXN1bHRzLmphcikiKTsKLSAgICAgICAgcmFkQ3VycmVudFByb2plY3QgPW5ldyBKUmFkaW9CdXR0b24oIkJyb3dzZSBhbmQgc2VsZWN0IGEgcHJvamVjdCBvbiBjdXJyZW50IGlkZWEgd29ya3NwYWNlIixmYWxzZSk7Ci0gICAgICAgIHJhZEN1c3RvbUxvY2F0aW9uID1uZXcgSlJhZGlvQnV0dG9uKCJCcm93c2UgYW5kIHNlbGVjdCBsb2NhdGlvbiBvbiBsb2NhbCBmaWxlIHN5c3RlbSIsdHJ1ZSk7Ci0gICAgICAgIEJ1dHRvbkdyb3VwICBidXR0b25Hcm91cD0gbmV3ICBCdXR0b25Hcm91cCgpOwotICAgICAgICBidXR0b25Hcm91cC5hZGQocmFkQ3VycmVudFByb2plY3QgKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJhZEN1c3RvbUxvY2F0aW9uKTsKLQotICAgICAgICBjb2RlZ2VuQmVhbi5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkgKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHRhVGlsdGUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiAsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChyYWRDdXJyZW50UHJvamVjdAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgcmFkQ3VycmVudFByb2plY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB0eHRvdXRwdXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd3NlT3V0cHV0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGxvYWRDbWJDdXJyZW50UHJvamVjdCgpOwotICAgICAgICAgICAgICAgIGxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibE1vZHVsZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYkN1cnJlbnRQcm9qZWN0Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDIsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9hZGNtYk1vZHVsZVNyY1Byb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibERpcmVjdG9yeQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYk1vZHVsZVNyYwotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAzLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKHJhZEN1c3RvbUxvY2F0aW9uCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICByYWRDdXN0b21Mb2NhdGlvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdHh0b3V0cHV0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd3NlT3V0cHV0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibG91dHB1dAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZCh0eHRvdXRwdXQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChidG5Ccm93c2VPdXRwdXQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgNSwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5FQVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgYnRuQnJvd3NlT3V0cHV0IC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJDaG9vc2VyIC5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNfT05MWSk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IERpckNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuQnJvd3NlT3V0cHV0ICk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgRGlyQ2hvb3Nlci5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIgLkZJTEVTX09OTFkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdmaWxlID0gRGlyQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0b3V0cHV0LnNldFRleHQobmV3ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQoY2hiQWRkQXhpc0NvZGVnZW5KYXIKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGNoYkFkZEF4aXNDb2RlZ2VuSmFyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwxKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNoYkFkZEF4aXNMaWIKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgOCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIGNoYkFkZEF4aXNMaWIgLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkRm9yQWRkQXhpc0xpYigpOwotICAgICAgICAgICAgICAgIGhhbmRsZUxvYWRMaWJzQnJvd3NlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxBc2l4SG9tZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA5LCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQodHh0YXhpc0hvbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgOSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICB0aGlzLmFkZChidG5Ccm93c2VBeGlzSG9tZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCA5LCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkVBU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICBidG5Ccm93c2VBeGlzSG9tZSAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGlyQ2hvb3NlciAuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOwotICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWwgPSBEaXJDaG9vc2VyLnNob3dPcGVuRGlhbG9nKGJ0bkJyb3dzZUF4aXNIb21lICk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgRGlyQ2hvb3Nlci5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIgLkZJTEVTX09OTFkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdmaWxlID0gRGlyQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0YXhpc0hvbWUgLnNldFRleHQobmV3ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGJ0bkNoZWNrTGliCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgYnRuQ2hlY2tMaWIgLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUxvYWRMaWJzQnJvd3NlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxNZXNzYWdlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTEsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDAsMSksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQoY2hiQ3JlYXRlSmFyCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEyLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgY2hiQ3JlYXRlSmFyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibEphckZpbGVOYW1lCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEzLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLSAgICAgICAgdGhpcy5hZGQodHh0amFyRmlsZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMTMsMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNULCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAwLDApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMTQsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDAsMSksIDAsIDApKTsKLQotICAgICAgICAvLyBoaW50IGJ1dHRvbgotICAgICAgICB0aGlzLmFkZChidG5IaW50LAotICAgICAgICAgICAgICAgIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwxNSwgMSwgMSwgMC4xLDAuMAotICAgICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vIGhpbnQgbGFibGUKLSAgICAgICAgdGhpcy5hZGQodHhhSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDE2LCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjEsIDEuMAotICAgICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygxMCwgMjAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9PUFRJT05fQSApOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGNoZWNrUGFnZUNvbWxldGUoKTsKLSAgICAgICAgc2V0RW5hYmxlZEZvckFkZEF4aXNMaWIoKTsgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIGxvYWRDbWJDdXJyZW50UHJvamVjdCgpIHsKLSAgICAgICAgTW9kdWxlIG1vZHVsZXNbXSA9IGNvZGVnZW5CZWFuIC5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yKGludCBjb3VudCA9IDA7IGNvdW50IDwgbW9kdWxlcy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5hZGRJdGVtKG1vZHVsZXNbY291bnRdLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBsb2FkY21iTW9kdWxlU3JjUHJvamVjdCgpIHsKLSAgICAgICAgU3RyaW5nIG1vZHVsZSA9IG51bGw7Ci0gICAgICAgIG1vZHVsZSA9IChTdHJpbmcpIGNtYkN1cnJlbnRQcm9qZWN0LmdldFNlbGVjdGVkSXRlbSgpOwotICAgICAgICBjbWJNb2R1bGVTcmMucmVtb3ZlQWxsSXRlbXMoKTsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3JjW10gPSBjb2RlZ2VuQmVhbi5nZXRNb2R1bGVTcmMobW9kdWxlKTsKLSAgICAgICAgICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCBzcmMubGVuZ3RoOyBjb3VudCsrKSB7Ci0gICAgICAgICAgICAgICAgY21iTW9kdWxlU3JjLmFkZEl0ZW0oc3JjW2NvdW50XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb3VudCA9IHNyYy5sZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCl7Ci0gICAgICAgIHJhZEN1cnJlbnRQcm9qZWN0LnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICByYWRDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgbGJsRGlyZWN0b3J5LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibE1vZHVsZSAuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgcmFkQ3VycmVudFByb2plY3Quc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIHR4dG91dHB1dC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsb3V0cHV0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBidG5Ccm93c2VPdXRwdXQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkRm9yQ3VzdG9tUHJvamVjdCgpewotICAgICAgICBpZighZmxhZyl7Ci0gICAgICAgICAgICByYWRDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByYWRDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgcmFkQ3VycmVudFByb2plY3Quc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsRGlyZWN0b3J5LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBsYmxNb2R1bGUgLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICByYWRDdXN0b21Mb2NhdGlvbi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAgICAgdHh0b3V0cHV0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibG91dHB1dC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBidG5Ccm93c2VPdXRwdXQgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkRm9yQWRkQXhpc0xpYigpewotICAgICAgICBpZihjaGJBZGRBeGlzTGliLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBsYmxBc2l4SG9tZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbGJsTWVzc2FnZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbGJsSmFyRmlsZU5hbWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHR4dGF4aXNIb21lLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB0eHRqYXJGaWxlTmFtZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgY2hiQ3JlYXRlSmFyLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBidG5Ccm93c2VBeGlzSG9tZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYnRuQ2hlY2tMaWIgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgbGJsQXNpeEhvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBsYmxNZXNzYWdlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbGJsSmFyRmlsZU5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0eHRheGlzSG9tZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHR4dGphckZpbGVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgY2hiQ3JlYXRlSmFyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgYnRuQnJvd3NlQXhpc0hvbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBidG5DaGVja0xpYiAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0eHRheGlzSG9tZS5zZXRUZXh0KCJVbnBhY2tlZCBBeGlzMiBiaW5hcnkgaG9tZSBPciBBeGlzMiBzb3VyY2UgbG9jYXRpb24iKTsKLSAgICAgICAgICAgIGxibE1lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlTG9hZExpYnNCcm93c2UoKXsKLSAgICAgICAgaWYodHh0YXhpc0hvbWUuZ2V0VGV4dCgpLmVxdWFscygiIikpewotICAgICAgICAgICAgbGJsTWVzc2FnZS5zZXRUZXh0KCJBeGlzIGxpYnMgYXJlIG5vdCBhdmFpbGFibGUgISEgIik7Ci0gICAgICAgICAgICBqYXJGaWxlQ29weU9wdGlvbj1mYWxzZTsKLSAgICAgICAgICAgIC8vZXJyb3IgbWVzc2FnZQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIFN0cmluZyBheGlzX2hvbWUgPSB0eHRheGlzSG9tZS5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICAgICAgU3RyaW5nIGF4aXNfdGFyZ2V0X2xpYj1heGlzX2hvbWUrRmlsZS5zZXBhcmF0b3IrInRhcmdldCIrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0gICAgICAgICAgICBTdHJpbmcgYXhpc19zdGRfbGliX2RpcmVjdG9yeT1heGlzX2hvbWUrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0KLSAgICAgICAgICAgIEZpbGUgYXhpc190YXJnZXRfbGlic19kaXJlY3RvcnkgPSBuZXcgRmlsZShheGlzX3RhcmdldF9saWIpOwotICAgICAgICAgICAgRmlsZSBheGlzX2xpYnNfZGlyZWN0b3J5ID0gbmV3IEZpbGUoYXhpc19zdGRfbGliX2RpcmVjdG9yeSk7Ci0gICAgICAgICAgICBpZiAoYXhpc19saWJzX2RpcmVjdG9yeS5pc0RpcmVjdG9yeSgpIHx8IGF4aXNfdGFyZ2V0X2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICBsYmxNZXNzYWdlLnNldFRleHQoIkF4aXMgbGlicyBsb2FkZWQgc3VjY2Vzc2Z1bGx5ISEiKTsKLSAgICAgICAgICAgICAgICBpZihheGlzX2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpewotICAgICAgICAgICAgICAgICAgICBheGlzMkxpYnNMb2NhdGlvbj1heGlzX3N0ZF9saWJfZGlyZWN0b3J5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKGF4aXNfdGFyZ2V0X2xpYnNfZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpewotICAgICAgICAgICAgICAgICAgICBheGlzMkxpYnNMb2NhdGlvbj1heGlzX3RhcmdldF9saWI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphckZpbGVDb3B5T3B0aW9uID10cnVlOwotICAgICAgICAgICAgICAgIGxibE1lc3NhZ2Uuc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBsYmxNZXNzYWdlLnNldFRleHQoIkF4aXMgbGlicyBhcmUgbm90IGF2YWlsYWJsZSAhISAiKTsKLSAgICAgICAgICAgICAgICBsYmxNZXNzYWdlLnNldEJhY2tncm91bmQoQ29sb3IuUkVEKTsKLSAgICAgICAgICAgICAgICBqYXJGaWxlQ29weU9wdGlvbj1mYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgb3V0cHV0IGxvY2F0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dExvY2F0aW9uKCkgewotICAgICAgICBpZihyYWRDdXJyZW50UHJvamVjdC5pc1NlbGVjdGVkKCkpCi0gICAgICAgICAgICAgcmV0dXJuIGNtYk1vZHVsZVNyYy5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdHh0b3V0cHV0LmdldFRleHQoKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXhpc0hvbWVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHR4dGF4aXNIb21lLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphckZpbGVuYW1lKCkgewotICAgICAgICByZXR1cm4gdHh0amFyRmlsZU5hbWUuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEF4aXMyUGx1Z2luTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYkFkZEF4aXNDb2RlZ2VuSmFyLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRBeGlzTGliQ29weUNoZWNrQm94U2VsZWN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYkFkZEF4aXNMaWIuaXNTZWxlY3RlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldENyZWF0ZUphckNoZWNrQm94U2VsZWN0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmNoYkNyZWF0ZUphci5pc1NlbGVjdGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBeGlzSmFyc0xvY2F0aW9uKCl7Ci0gICAgICAgIHJldHVybiB0aGlzLmF4aXMyTGlic0xvY2F0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG9rdG9Mb2FkTGlicygpewotICAgICAgICByZXR1cm4gdGhpcy5qYXJGaWxlQ29weU9wdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXJGaWxlTmFtZShTdHJpbmcgamFyRmlsZU5hbWUpewotICAgICAgICB0aGlzLnR4dGphckZpbGVOYW1lLnNldFRleHQoamFyRmlsZU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRoaXMgYWxnb3JpdGhtIHVzZWQgZm9yIHNldCBwYWdlIGNvbXBsZXRlIGFuZCBFbmFibGVkIGZpbnNoIGJ1dHRvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1BhZ2VDb21sZXRlKCl7Ci0gICAgICAgIGlmKGdldEF4aXNMaWJDb3B5Q2hlY2tCb3hTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICBpZihyYWRDdXJyZW50UHJvamVjdC5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICBpZihqYXJGaWxlQ29weU9wdGlvbil7Ci0gICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0T3V0cHV0KGdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBpZighZ2V0T3V0cHV0TG9jYXRpb24oKS5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgICAgICAgICAgaWYoamFyRmlsZUNvcHlPcHRpb24pewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldE91dHB1dChnZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGlmKHJhZEN1cnJlbnRQcm9qZWN0LmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldE91dHB1dChnZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGlmKCFnZXRPdXRwdXRMb2NhdGlvbigpLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldE91dHB1dChnZXRPdXRwdXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qKgotICAgICAqIGdldCBwYWdlIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5XU0RMXzJfSkFWQV9UWVBFOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZnlFdmVudCgpIHsKLSAgICAgICAgU3RyaW5nIHRleHQgPSB0aGlzLnR4dG91dHB1dC5nZXRUZXh0KCk7Ci0gICAgICAgIGlmICgodGV4dCA9PSBudWxsKSB8fCAodGV4dC50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgIC8vIGVycm9yIG1lc3NhZ2UgIm91dHB1dCBsb2NhdGlvbiBuZWVkcyB0byBiZSBzcGVjaWZpZWQiCi0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZXJyb3IgbWVzc2FnZSBudWxsCi0JfQotCXByaXZhdGUgdm9pZCBoYW5kbGVBeGlzSG9tZU1vZGlmeUV2ZW50KCkgewotCQlTdHJpbmcgdGV4dCA9IHRoaXMudHh0YXhpc0hvbWUuZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQkvLyBlcnJvciBtZXNzYWdlICJvdXRwdXQgbG9jYXRpb24gbmVlZHMgdG8gYmUgc3BlY2lmaWVkIgotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGVycm9yIG1lc3NhZ2UgbnVsbAotCX0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlSmFyTmFtZU1vZGlmeUV2ZW50KCkgewotCQlTdHJpbmcgdGV4dCA9IHRoaXMudHh0amFyRmlsZU5hbWUuZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKHRleHQudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQkvLyBlcnJvciBtZXNzYWdlICJvdXRwdXQgbG9jYXRpb24gbmVlZHMgdG8gYmUgc3BlY2lmaWVkIgotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGVycm9yIG1lc3NhZ2UgbnVsbAotCX0KLX0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9XU0RMRmlsZUZpbHRlci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvaWRlYS9XU0RMRmlsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGM3ZGJkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2lkZWEvV1NETEZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhOwotCi0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIHVzZSBmb3IgZmlsdGVyIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIFdTRExGaWxlRmlsdGVyIGV4dGVuZHMgRmlsZUZpbHRlciB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0gICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZik7Ci0gICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5lcXVhbHMoIndzZGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLndzZGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbihGaWxlIGYpIHsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZi5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0ZpbGVGaWx0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9GaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDJmNDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0ZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVGaWx0ZXIgewotCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBmaWxlTmFtZSApIHsKLQotICAgICAgICBTdHJpbmcgICBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZU5hbWUpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmVxdWFscygid3NkbCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIHRydWU7Ci0gICAgICAgIH1lbHNlIGlmKGV4dGVuc2lvbiAhPSBudWxsICYmIGV4dGVuc2lvbi5lcXVhbHMoInhtbCIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIud3NkbCI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5zaW9uKFN0cmluZyAgZXh0ZW5zaW9uKSB7Ci0gICAgICAgIFN0cmluZyBleHQgPSBudWxsOwotICAgICAgICBpbnQgaSA9IGV4dGVuc2lvbi5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgZXh0ZW5zaW9uLmxlbmd0aCgpIC0gMSkgewotICAgICAgICAgICAgZXh0ID0gZXh0ZW5zaW9uLnN1YnN0cmluZyhpICsgMSkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXh0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0phckZpbGVGaWx0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9KYXJGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzQ5NjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL0phckZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEphckZpbGVGaWx0ZXIgZXh0ZW5kcyBGaWxlRmlsdGVyIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYoZmlsZS5pc0RpcmVjdG9yeSgpICl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGUpOwotICAgICAgICBpZihleHRlbnNpb24gIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gIGV4dGVuc2lvbiAuZXF1YWxzKCJqYXIiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gIi5qYXIiIDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRFeHRlbnNpb24oRmlsZSBmaWxlKXsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvTWlkZGxlUGFuZWwuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9NaWRkbGVQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTc5ODgzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9NaWRkbGVQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW4uQ2xhc3NMb2FkaW5nVGVzdEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLk5hbWVzcGFjZUZpbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW4uV3NkbGdlbkJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIHRoaXMgaXMgdGhlIGZpcnN0IHBhbmVsIG9mIGphdmEyd3NkbCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIE1pZGRsZVBhbmVsICBleHRlbmRzIFdpemFyZFBhbmVsIHsKLSAgICAvKioKLSAgICAgKiB2YXJpYmFsZQotICAgICAqLwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRDbGFzczsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuRm9sZGVyOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5KYXI7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0blJlbW92ZTsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuVGVzdDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuSGludDsKLSAgICBwcml2YXRlIEpUZXh0QXJlYSB0eGFIaW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnPWZhbHNlOwotICAgIHByaXZhdGUgSkxpc3QgbGlzdFBhdGhEaXNwbHk7Ci0gICAgcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGxpc3RNb2RlbDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxUZXN0OwotICAgIHByaXZhdGUgU3RyaW5nIGhpbnQgPSJQbGVhc2UgZ2l2ZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUsIGV4YW1wbGUgOmNvbS5mb28uQmFyU2VydmljZSIgKwotICAgICAgICAgICAgIiBUaGVuIGFkZCB0aGUgZm9sZGVyIG9yIHRoZSBqYXIgZmlsZSB3aGljaCBjb250YWlucyB0aGF0IGNsYXNzIGZpbGUuIiArCi0gICAgICAgICAgICAiIEZpbmFsbHkgY2hlY2sgd2hldGhlciB0aGUgY2xhc3MgZmlsZSBjYW4gYmUgbG9hZGVkIGZyb20gdGhlIHBsdWdpbi4iICsKLSAgICAgICAgICAgICIgIElmIHRoZSBjbGFzcyB0aGF0IHlvdSBhcmUgZ29pbmcgdG8gbG9hZCBjb250YWlucyBhbnkgZGVwZW5kZW5jaWVzIiArCi0gICAgICAgICAgICAiICBvbiBvdGhlciBheGlzMiBsaWJyYXJpZXMgKCBmb3IgZXhhbXBsZSBsaWtlIGF4aW9tKi5qYXIpLCBwbGVhc2UgYWRkIHRob3NlIiArCi0gICAgICAgICAgICAiIGxpYnJhcmllcyBhcyB3ZWxsIGFuZCB0cnkgdG8gbG9hZCB0aGUgY2xhc3MuIjsKLQotICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBGaWxlQ2hvb3NlciA9bmV3IEpGaWxlQ2hvb3NlcigpOwotICAgIGZpbmFsIEpGaWxlQ2hvb3NlciBEaXJDaG9vc2VyPW5ldyBKRmlsZUNob29zZXIoKTsKLSAgICBwcml2YXRlIFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gd2l6YXJkQ29tcG9uZW50cwotICAgICAqIEBwYXJhbSB3c2RsZ2VuQmVhbgotICAgICAqLwotICAgIHB1YmxpYyBNaWRkbGVQYW5lbChXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMgLFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBKYXZhMldTREwgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJKYXZhIHNvdXJjZSAvIGNsYXNzcGF0aCBzZWxlY3Rpb24iKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiU2VsZWN0IHRoZSBjbGFzc2VzIGFuZCB0aGUgbGlicmFyaWVzIik7Ci0gICAgICAgIHRoaXMud3NkbGdlbkJlYW49d3NkbGdlbkJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0aWF0ZSBwYW5lbAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotCi0gICAgICAgIGJ0bkZvbGRlcj1uZXcgSkJ1dHRvbigiQWRkIEZvbGRlciIpOwotICAgICAgICBidG5KYXI9bmV3IEpCdXR0b24oIkFkZCBKYXIiKTsKLSAgICAgICAgYnRuUmVtb3ZlPW5ldyBKQnV0dG9uKCJSZW1vdmUiKTsKLSAgICAgICAgYnRuVGVzdD1uZXcgSkJ1dHRvbigiVGVzdCBDbGFzcyBMb2FkaW5nIik7Ci0KLSAgICAgICAgdHh0Q2xhc3MgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIGxibFRlc3Q9IG5ldyBKTGFiZWwoKTsKLQotICAgICAgICBsaXN0TW9kZWwgPW5ldyBEZWZhdWx0TGlzdE1vZGVsKCk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5ID1uZXcgSkxpc3QobGlzdE1vZGVsKTsKLSAgICAgICAgbGlzdFBhdGhEaXNwbHkuc2V0QXV0b3Njcm9sbHModHJ1ZSk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldE9wYXF1ZShmYWxzZSk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKDEpICk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldEZvY3VzYWJsZShmYWxzZSk7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiRnVsbHkgUXVhbGlmaWVkIENsYXNzIE5hbWUgOiIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dENsYXNzCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDAsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiamF2YSBjbGFzcyBwYXRoIEVudHJpZXMuc2VsZWN0IGVpdGhlciBmb2xkZXJzIG9yIGphciBmaWxlcyAiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChidG5Gb2xkZXIKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LDEwLCAxLDEpLCAwLCAwKSk7Ci0KLSAgICAgICAgYnRuRm9sZGVyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERpckNob29zZXIgLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuVmFsID0gRGlyQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidG5Gb2xkZXIgKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgICAgICAgICBEaXJDaG9vc2VyLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3NlciAuRklMRVNfT05MWSApOwotICAgICAgICAgICAgICAgICAgICBGaWxlIG5ld2ZpbGUgPSBEaXJDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBsaXN0TW9kZWwuYWRkRWxlbWVudChuZXdmaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHRQYXRoQW5kTmFtZShuZXdmaWxlICk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZCggZmFsc2UsIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuSmFyCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDIsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsMSksIDAsIDApKTsKLSAgICAgICAgYnRuSmFyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotCi0gICAgICAgICAgICAgICAgRmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgSmFyRmlsZUZpbHRlcigpICk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbD0gRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuSmFyKTsKLSAgICAgICAgICAgICAgICBpZihyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyIC5BUFBST1ZFX09QVElPTiApewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdE1vZGVsLmFkZEVsZW1lbnQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgICAgICBzZXREZWZhdWx0UGF0aEFuZE5hbWUoZmlsZSApOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXNUZXh0RmllbGQoIGZhbHNlLCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0blJlbW92ZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMSwxMCksIDAsIDApKTsKLSAgICAgICAgYnRuUmVtb3ZlLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSlNjcm9sbFBhbmUobGlzdFBhdGhEaXNwbHkpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDMsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0blRlc3QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEsMSksIDAsIDApKTsKLSAgICAgICAgYnRuVGVzdC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZighdGVzdExvYWRpbmcoKSl7Ci0gICAgICAgICAgICAgICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIH1lbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldENsYXNzUGF0aExpc3QoZ2V0Q2xhc3NQYXRobGlzdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0Q2xhc3NOYW1lKHR4dENsYXNzLmdldFRleHQoKS50cmltKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobGJsVGVzdAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCA0LCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2VwYXJhdG9yKCkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMSwxKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0bkhpbnQsCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA2LCAxLCAxLCAwLjEsMC4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkhpbnQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYoZmxhZyl7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA+PiIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPWZhbHNlOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPDwiKTsKLSAgICAgICAgICAgICAgICAgICAgdHhhSGludC5zZXRUZXh0KGhpbnQpOwotICAgICAgICAgICAgICAgICAgICBmbGFnPXRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZCh0eGFIaW50Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDcsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMTAsIDEwKSwgMCwgMCkpOwotCi0gICAgfQotCi0gICAgLy9uZXh0Ci0gICAgcHVibGljIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgaWYodHh0Q2xhc3MuZ2V0VGV4dCgpIT1udWxsICYmIGlzUGFnZUNvbXBsZXRlKCkpewotICAgICAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX09QVElPTl9CICk7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9CICk7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy9iYWNrCi0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0NIT09TRVIgKTsKLSAgICB9Ci0gICAgLy91cGRhdGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgfQotICAgIC8vc2V0IGRlZmF1bHQgcGF0aCBhbmQgbmFtZQotICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0UGF0aEFuZE5hbWUoRmlsZSBmaWxlKSAgewotICAgICAgICBpZihmaWxlLmdldFBhcmVudCgpIT1udWxsKXsKLSAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dExvY2F0aW9uKGZpbGUuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0T3V0cHV0V1NETE5hbWUoIlNlcnZpY2VzLndzZGwiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyB1cGRhdGUgbmV4dCBwYWdlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlU3RhdHVzVGV4dEZpZWxkKGJvb2xlYW4gc3VjY2VzcyxTdHJpbmcgdGV4dCl7Ci0gICAgICAgIGlmIChzdWNjZXNzKXsKLSAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldFNlcnZpY2VOYW1lKE5hbWVzcGFjZUZpbmRlci5nZXRTZXJ2aWNlTmFtZVRleHQodHh0Q2xhc3MuZ2V0VGV4dCgpKSApOwotICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0VGFyZ2V0TmFtZXNwYWNlKE5hbWVzcGFjZUZpbmRlci5nZXRUYXJnZXROYW1lc3BhY2VGcm9tQ2xhc3ModHh0Q2xhc3MuZ2V0VGV4dCgpKSk7Ci0gICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoTmFtZXNwYWNlRmluZGVyLmdldERlZmF1bHROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoTmFtZXNwYWNlRmluZGVyLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZUZyb21DbGFzcyh0eHRDbGFzcy5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeChOYW1lc3BhY2VGaW5kZXIuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgfQotICAgICAgICBsYmxUZXN0LnNldFRleHQodGV4dCk7Ci0gICAgfQotCi0gICAgLy8gIFBvcHMgdXAgdGhlIGZpbGUgYnJvd3NlIGRpYWxvZyBib3gKLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmUoKSB7Ci0gICAgICAgIGludFtdIHNlbGVjdGlvbkluZGljZXMgPSBsaXN0UGF0aERpc3BseSAuZ2V0U2VsZWN0ZWRJbmRpY2VzKCkgOwotICAgICAgICBmb3IgKGludCBpPTA7aTxzZWxlY3Rpb25JbmRpY2VzLmxlbmd0aDtpKyspewotICAgICAgICAgICAgbGlzdE1vZGVsIC5yZW1vdmUoc2VsZWN0aW9uSW5kaWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlU3RhdHVzVGV4dEZpZWxkKGZhbHNlLCIiKTsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgfQotCi0gICAgLy9nZXQgY2xhc3MgcGF0aCBsaXN0Ci0gICAgcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aGxpc3QoKXsKLSAgICAgICAgT2JqZWN0IFtdIGxpc3RPYmplY3QgPSBsaXN0TW9kZWwudG9BcnJheSgpIDsKLSAgICAgICAgU3RyaW5nIFtdIGxpc3RTdHJpbmcgPW5ldyBTdHJpbmdbbGlzdE9iamVjdC5sZW5ndGhdOwotICAgICAgICBmb3IoaW50IGk9MCA7aTxsaXN0T2JqZWN0Lmxlbmd0aCA7aSsrKXsKLSAgICAgICAgICAgIGxpc3RTdHJpbmdbaV09bGlzdE9iamVjdFtpXS50b1N0cmluZygpIDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdFN0cmluZyA7Ci0gICAgfQotICAgIC8vIHRlc3QgbG9hZGluZwotICAgIHB1YmxpYyBib29sZWFuIHRlc3RMb2FkaW5nKCl7Ci0gICAgICAgIGphdmEudXRpbC5MaXN0IGVycm9yTGlzdGVuZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIFN0cmluZyBbXSBsaXN0U3RyaW5nID1nZXRDbGFzc1BhdGhsaXN0KCkgOwotICAgICAgICBpZiAoIUNsYXNzTG9hZGluZ1Rlc3RCZWFuLnRyeUxvYWRpbmdDbGFzcyh0eHRDbGFzcy5nZXRUZXh0KCksbGlzdFN0cmluZyxlcnJvckxpc3RlbmVyKSl7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdCA9IGVycm9yTGlzdGVuZXIuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSl7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG5leHRPYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG5leHRPYmplY3Q9PW51bGw/ICJVbmtub3duIGVycm9yISIgOm5leHRPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBsYmxUZXN0IC5zZXRUZXh0KGVycm9yTWVzc2FnZSApOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZChmYWxzZSxlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXR1c1RleHRGaWVsZCh0cnVlLCJDbGFzcyBmaWxlIGxvYWRlZCBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLy9nZXQgcGFnZSB0eXBlCi0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuSkFWQV8yX1dTRExfVFlQRTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvT3B0aW9uUGFuZWwuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9PcHRpb25QYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzllODg3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL2phdmEyd3NkbC9PcHRpb25QYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50b29scy5qYXZhMndzZGw7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Xc2RsZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotCi0vKioKLSAqIHRoaXMgaXMgdGhlIGZpcnN0IHBhbmVsIG9mIGphdmEyd3NkbCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvblBhbmVsIGV4dGVuZHMgV2l6YXJkUGFuZWx7Ci0gICAgLyoqCi0gICAgICogdmFyaWFibGUKLSAgICAgKi8KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0TnNwOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHROc3BQcmVmaXg7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFNjaGVtYVRhcmdldE5zcDsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0U2NoZW1hVGFyZ2V0TnNwUHJlZml4OwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRTZXJ2aWNlOwotICAgIHByaXZhdGUgV3NkbGdlbkJlYW4gd3NkbGdlbkJlYW47Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgbWV0aG9kCi0gICAgICogQHBhcmFtIHdpemFyZENvbXBvbmVudHMKLSAgICAgKiBAcGFyYW0gd3NkbGdlbkJlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3B0aW9uUGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuKXsKLSAgICAgICAgc3VwZXIod2l6YXJkQ29tcG9uZW50cywgICJBeGlzMiBJZGVhIFBsdWdpbiBKYXZhMldTREwgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJKYXZhIHRvIFdTREwgT3B0aW9ucyIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJTZXQgdGhlIE9wdGlvbiBmb3IgdGhlIGdlbmVyYXRpb24iKTsKLSAgICAgICAgdGhpcy53c2RsZ2VuQmVhbj13c2RsZ2VuQmVhbjsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLSAgICAvKiogaW5pdGFpdGUgbWV0aG9kKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgdHh0TnNwID1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIHR4dE5zcFByZWZpeCA9bmV3IEpUZXh0RmllbGQoKTsKLQotICAgICAgICB0eHRTY2hlbWFUYXJnZXROc3AgPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgdHh0U2NoZW1hVGFyZ2V0TnNwUHJlZml4ID1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIHR4dFNlcnZpY2UgPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiVGFyZ2V0IE5hbWVzcGFjZSIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsICAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHROc3AKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgMiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDUsIDAsMjApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiVGFyZ2V0IE5hbWVzcGFjZSBQcmVmaXgiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQodHh0TnNwUHJlZml4Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDUsIDAsMjApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiU2NoZW1hIFRhcmdldCBOYW1lc3BhY2UiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHRTY2hlbWFUYXJnZXROc3AKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMiwgMiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgNSwgMCwyMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJTY2hlbWEgVGFyZ2V0IE5hbWVzcGFjZSBQcmVmaXgiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMjAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQodHh0U2NoZW1hVGFyZ2V0TnNwUHJlZml4Ci0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDMsIDIsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCA1LCAwLDIwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIlNlcnZpY2UgTmFtZSIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIDEsIDEsIDAuMSwgMS4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDIwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dFNlcnZpY2UKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgNCwgMiwgMSwgMS4wLCAxLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgNSwgMCwyMCksIDAsIDApKTsKLQotICAgIH0KLSAgICAvL25leHQKLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfTEFTVF9CICk7Ci0gICAgfQotICAgIC8vYmFjawotICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GSVJTVF9CICk7Ci0gICAgfQotICAgIC8vdXBkYXRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBpZih3c2RsZ2VuQmVhbi5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCApCi0gICAgICAgICAgICB0eHROc3Auc2V0VGV4dCh3c2RsZ2VuQmVhbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGlmKHdzZGxnZW5CZWFuLmdldFRhcmdldE5hbWVzcGFjZVByZWZpeCgpIT1udWxsICkKLSAgICAgICAgICAgIHR4dE5zcFByZWZpeCAuc2V0VGV4dCh3c2RsZ2VuQmVhbi5nZXRUYXJnZXROYW1lc3BhY2VQcmVmaXgoKSk7Ci0gICAgICAgIGlmKHdzZGxnZW5CZWFuLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZSgpIT1udWxsICkKLSAgICAgICAgICAgIHR4dFNjaGVtYVRhcmdldE5zcCAuc2V0VGV4dCh3c2RsZ2VuQmVhbi5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGlmKHdzZGxnZW5CZWFuLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpIT1udWxsICkKLSAgICAgICAgICAgIHR4dFNjaGVtYVRhcmdldE5zcFByZWZpeC5zZXRUZXh0KHdzZGxnZW5CZWFuLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgaWYod3NkbGdlbkJlYW4uZ2V0U2VydmljZU5hbWUoKSE9bnVsbCApCi0gICAgICAgICAgICB0eHRTZXJ2aWNlLnNldFRleHQod3NkbGdlbkJlYW4uZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgICAgICgoT3V0cHV0UGFuZWwpZ2V0V2l6YXJkQ29tcG9uZW50cygpLmdldFdpemFyZFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9MQVNUX0IpKS5sb2FkQ21iQ3VycmVudFByb2plY3QoKTsKLSAgICAgICAgKChPdXRwdXRQYW5lbClnZXRXaXphcmRDb21wb25lbnRzKCkuZ2V0V2l6YXJkUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0xBU1RfQikpLmxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCk7ICAgICAgICAKLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzQ29tcGxldGUoKSk7Ci0gICAgfQotICAgIC8vIGdldCBwYWdlIHR5cGUKLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5KQVZBXzJfV1NETF9UWVBFOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRlKCl7Ci0gICAgICAgIGlmKHR4dE5zcC5nZXRUZXh0KCkhPW51bGwKLSAgICAgICAgICAgICAgICAmJiB0eHROc3BQcmVmaXguZ2V0VGV4dCgpIT1udWxsCi0gICAgICAgICAgICAgICAgJiYgdHh0U2NoZW1hVGFyZ2V0TnNwLmdldFRleHQoKSE9bnVsbAotICAgICAgICAgICAgICAgICYmIHR4dFNjaGVtYVRhcmdldE5zcFByZWZpeC5nZXRUZXh0KCkhPW51bGwKLSAgICAgICAgICAgICAgICAmJiB0eHRTZXJ2aWNlLmdldFRleHQoKSE9bnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByZXR1cm4gIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvamF2YTJ3c2RsL091dHB1dFBhbmVsLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvT3V0cHV0UGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxNjUyMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy9qYXZhMndzZGwvT3V0cHV0UGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsOwotCi1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkubW9kdWxlLk1vZHVsZTsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLldzZGxnZW5CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmEuYXd0Lio7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKiogdGhpcyBjbGFzcyBqYXZhIDIgd3NkbCBvdXRwdXQgd2l6YXJkIHBhbmVsICAgKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRQYW5lbCBleHRlbmRzIFdpemFyZFBhbmVsIHsKLQotICAgIHByaXZhdGUgSlJhZGlvQnV0dG9uIHJidG5BZGQ7Ci0gICAgcHJpdmF0ZSBKUmFkaW9CdXR0b24gcmJ0blNhdmU7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iQ3VycmVudFByb2plY3Q7Ci0gICAgcHJpdmF0ZSBKQ29tYm9Cb3ggY21iTW9kdWxlU3JjOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRMb2NhdGlvbjsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0RmlsZU5hbWU7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbGJsTW9kdWxlOwotICAgIHByaXZhdGUgSkxhYmVsIGxibERpcmVjdDsKLSAgICBwcml2YXRlIEpMYWJlbCBsYmxPdXRwdXQ7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkJyb3dlczsKLSAgICBmaW5hbCBKRmlsZUNob29zZXIgRGlyQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBXc2RsZ2VuQmVhbiB3c2RsZ2VuQmVhbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICogQHBhcmFtIHdzZGxnZW5CZWFuCi0gICAgICogQHBhcmFtIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0UGFuZWwoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLFdzZGxnZW5CZWFuIHdzZGxnZW5CZWFuLCBQcm9qZWN0IHByb2plY3QpewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAgIkF4aXMyIElkZWEgUGx1Z2luIEphdmEyV1NETCBXaXphcmRzIik7Ci0gICAgICAgIHNldFBhbmVsVG9wVGl0bGUoIldTRGwgZmlsZSBvdXRwdXQgbG9jYXRpb24iKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiU2VsZWN0IHRoZSBsb2NhdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBXU0RMIik7Ci0gICAgICAgIHRoaXMud3NkbGdlbkJlYW49d3NkbGdlbkJlYW47Ci0gICAgICAgIHRoaXMucHJvamVjdD1wcm9qZWN0OwotICAgICAgICBpbml0KCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgcmJ0bkFkZCA9bmV3IEpSYWRpb0J1dHRvbigiQnJvd2VzIGFuZCBBZGQgdGhlIFdTREwgdG8gYSBwcm9qZWN0IG9uIGN1cnJlbnQgSWRlYSB3b3Jrc3BhY2UiLHRydWUpOwotCi0gICAgICAgIHJidG5TYXZlID1uZXcgSlJhZGlvQnV0dG9uKCJCcm93ZXMgYW5kIFNhdmUgdGhlIFdTREwgZmlsZSBvbiBsb2NhbCBmaWxlIHN5c3RlbSIsZmFsc2UpOwotCi0gICAgICAgIGNtYkN1cnJlbnRQcm9qZWN0ID1uZXcgSkNvbWJvQm94KCk7Ci0gICAgICAgIGNtYkN1cnJlbnRQcm9qZWN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYz1uZXcgSkNvbWJvQm94KCk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBCdXR0b25Hcm91cCAgYnV0dG9uR3JvdXA9IG5ldyAgQnV0dG9uR3JvdXAoKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJidG5BZGQgKTsKLSAgICAgICAgYnV0dG9uR3JvdXAuYWRkKHJidG5TYXZlICk7Ci0KLSAgICAgICAgdHh0RmlsZU5hbWUgPW5ldyBKVGV4dEZpZWxkKCJzZXJ2aWNlLndzZGwiKTsKLQotICAgICAgICB0eHRMb2NhdGlvbj1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIGJ0bkJyb3dlcz1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLSAgICAgICAgbGJsT3V0cHV0PW5ldyBKTGFiZWwoIk91dFB1dCBMb2NhdGlvbiIpOwotICAgICAgICBsYmxNb2R1bGU9bmV3IEpMYWJlbCgiU2VsZWN0IHRoZSBNb2R1bGUiKTsKLSAgICAgICAgbGJsTW9kdWxlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBsYmxEaXJlY3Q9bmV3IEpMYWJlbCgiU2VsZWN0IHRoZSBEaXJlY3RvcnkiKTsKLSAgICAgICAgbGJsRGlyZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJPdXRQdXQgRmlsZSBOYW1lIikKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dEZpbGVOYW1lCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIlNlbGVjdCB0aGUgbG9jYXRpb24gd2hlcmUgdG8gcHV0IHRoZSBvdXRwdXQiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAgMC4wLCAwLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHJidG5BZGQKLSAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMCwgMC4wCi0gICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMTApLCAwLCAwKSk7Ci0gICAgICAgIHJidG5BZGQuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBsYmxNb2R1bGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB0eHRMb2NhdGlvbiAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd2VzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIGxvYWRDbWJDdXJyZW50UHJvamVjdCgpOwotICAgICAgICAgICAgICAgIGxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgIHRoaXMuYWRkKGxibE1vZHVsZQotICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgMSwgMSwgIDAuMSwgMC4wCi0gICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKGNtYkN1cnJlbnRQcm9qZWN0Ci0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAzLCBHcmlkQmFnQ29uc3RyYWludHMuUkVMQVRJVkUsIDEsIDEuMCwgMC4wCi0gICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsMCksIDAsIDApKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbG9hZGNtYk1vZHVsZVNyY1Byb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgICB0aGlzLmFkZChsYmxEaXJlY3QKLSAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDQsIDEsIDEsICAwLjEsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChjbWJNb2R1bGVTcmMKLSAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDQsIEdyaWRCYWdDb25zdHJhaW50cy5SRUxBVElWRSwgMSwgMS4wLCAwLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBjbWJNb2R1bGVTcmMuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHJidG5TYXZlCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAxLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICByYnRuU2F2ZS5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjbWJDdXJyZW50UHJvamVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdHh0TG9jYXRpb24gLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYnRuQnJvd2VzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHRoaXMuYWRkKGxibE91dHB1dAotICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNiwgMSwgMSwgMC4xLCAxLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDApLCAwLCAwKSk7Ci0KLSAgICAgICAgIHRoaXMuYWRkKHR4dExvY2F0aW9uCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCA2LCAxLCAxLCAxLjAsIDEuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgIHRoaXMuYWRkKGJ0bkJyb3dlcwotICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgNiwgMSwgMSwgMC4xLCAxLjAKLSAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLQotICAgICAgICBidG5Ccm93ZXMuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRGlyQ2hvb3NlciAuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyLkRJUkVDVE9SSUVTX09OTFkpOwotICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWwgPSBEaXJDaG9vc2VyLnNob3dPcGVuRGlhbG9nKGJ0bkJyb3dlcyApOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpckNob29zZXIuc2V0RmlsZVNlbGVjdGlvbk1vZGUoSkZpbGVDaG9vc2VyIC5GSUxFU19PTkxZICk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgbmV3ZmlsZSA9IERpckNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHR4dExvY2F0aW9uLnNldFRleHQobmV3ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd3NkbGdlbkJlYW4uc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkQ21iQ3VycmVudFByb2plY3QoKSB7Ci0gICAgICAgIE1vZHVsZSBtb2R1bGVzW10gPSB3c2RsZ2VuQmVhbi5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgaWYgKG1vZHVsZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZXMubGVuZ3RoOyBjb3VudCsrKSB7Ci0gICAgICAgICAgICAgICAgY21iQ3VycmVudFByb2plY3QuYWRkSXRlbShtb2R1bGVzW2NvdW50XS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHJidG5TYXZlLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICAgICAgcmJ0bkFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgIHB1YmxpYyB2b2lkIGxvYWRjbWJNb2R1bGVTcmNQcm9qZWN0KCkgewotICAgICAgICBTdHJpbmcgbW9kdWxlID0gbnVsbDsKLSAgICAgICAgbW9kdWxlID0gKFN0cmluZykgY21iQ3VycmVudFByb2plY3QuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0gICAgICAgIGNtYk1vZHVsZVNyYy5yZW1vdmVBbGxJdGVtcygpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBpZiAobW9kdWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzcmNbXSA9IHdzZGxnZW5CZWFuLmdldE1vZHVsZVNyYyhtb2R1bGUpOwotICAgICAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHNyYy5sZW5ndGg7IGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICBjbWJNb2R1bGVTcmMuYWRkSXRlbShzcmNbY291bnRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50ID0gc3JjLmxlbmd0aDsKLSAgICAgICAgfQotICAgICAgICAgaWYgKGZsYWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1c3RvbVByb2plY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0IgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0gICAgICAgIGlmKHJidG5TYXZlLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZih0eHRGaWxlTmFtZS5nZXRUZXh0KCkgIT1udWxsICYmIHR4dExvY2F0aW9uLmdldFRleHQoKSAhPW51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRPdXRwdXRXU0RMTmFtZSh0eHRGaWxlTmFtZS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dExvY2F0aW9uKHR4dExvY2F0aW9uLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIH1lbHNlIGlmKHR4dExvY2F0aW9uLmdldFRleHQoKSAhPW51bGwpewotICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dExvY2F0aW9uKHR4dExvY2F0aW9uLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZih0eHRGaWxlTmFtZS5nZXRUZXh0KCkgIT1udWxsKXsKLSAgICAgICAgICAgICAgICB3c2RsZ2VuQmVhbi5zZXRPdXRwdXRXU0RMTmFtZSh0eHRGaWxlTmFtZSAuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBzZXRGaW5pc2hCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9ZWxzZSBpZihyYnRuQWRkLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZih0eHRGaWxlTmFtZS5nZXRUZXh0KCkgIT1udWxsICYmIGNtYk1vZHVsZVNyYy5nZXRTZWxlY3RlZEl0ZW0oKSAhPW51bGwpewotICAgICAgICAgICAgICAgIHdzZGxnZW5CZWFuLnNldE91dHB1dFdTRExOYW1lKHR4dEZpbGVOYW1lLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0T3V0cHV0TG9jYXRpb24oY21iTW9kdWxlU3JjLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9ZWxzZSBpZih0eHRGaWxlTmFtZSAuZ2V0VGV4dCgpICE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uc2V0T3V0cHV0V1NETE5hbWUodHh0RmlsZU5hbWUgLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0KLSAgICB9Ci0gICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLkpBVkFfMl9XU0RMX1RZUEU7Ci0gICAgfQotICAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZEZvckN1cnJlbnRQcm9qZWN0KCl7Ci0gICAgICAgIHJidG5BZGQuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0gICAgICAgIHJidG5BZGQuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgY21iQ3VycmVudFByb2plY3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgY21iTW9kdWxlU3JjLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibERpcmVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBsYmxNb2R1bGUgLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHJidG5TYXZlLnNldFNlbGVjdGVkKGZhbHNlKTsKLSAgICAgICAgdHh0TG9jYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxibE91dHB1dCAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGJ0bkJyb3dlcy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRGb3JDdXN0b21Qcm9qZWN0KCl7Ci0gICAgICAgIGlmKGZsYWcpewotICAgICAgICAgICAgcmJ0bkFkZC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIHJidG5BZGQuc2V0U2VsZWN0ZWQoZmFsc2UpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHJidG5TYXZlIC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgcmJ0blNhdmUgLnNldFNlbGVjdGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGNtYkN1cnJlbnRQcm9qZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBjbWJNb2R1bGVTcmMuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxibERpcmVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgbGJsTW9kdWxlIC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgdHh0TG9jYXRpb24gLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGxibE91dHB1dCAuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgYnRuQnJvd2VzIC5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLX0KLSAKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL3dpemFyZGZyYW1lL0NvZGVnZW5GcmFtZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvd2l6YXJkZnJhbWUvQ29kZWdlbkZyYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2RiMzUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvdG9vbHMvd2l6YXJkZnJhbWUvQ29kZWdlbkZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLkNob29zZXJQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmlkZWEuRmlyc3RQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmlkZWEuU2Vjb25kUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLldTREwySmF2YU91dHB1dFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLk1pZGRsZVBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLk9wdGlvblBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLk91dHB1dFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXMuQ2xhc3NGaWxlTG9jYXRpb25QYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXMuTGlicmFyeUFkZGluZ1BhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmZyYW1lcy5TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLlNlcnZpY2VYTUxFZGl0UGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLlNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLlNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLldTRExGaWxlU2VsZWN0aW9uUGFnZTsKLQotLyoqCi0gKiBjb2RlYUZyYW1lIGNsYXNzCi0gKi8KLQotcHVibGljIGNsYXNzIENvZGVnZW5GcmFtZSBleHRlbmRzIFdpemFyZEZyYW1lewotICAgIC8qKgotICAgICAqIHZhcmlhYmxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfQ0hPT1NFUiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfRklSU1RfQSA9IDE7ICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0ZJUlNUX0IgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX09QVElPTl9BID0zOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX09QVElPTl9CID0gNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9MQVNUX0EgPSA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0xBU1RfQiA9IDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfRklSU1RfQz03OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX1NFQ09ORF9DPTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFORUxfVEhJUkRfQz05OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0ZPVVJUSF9DPTEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBTkVMX0xPQURfQz0xMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9PUFRJT05fQz0xMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQU5FTF9MQVNUX0M9MTM7Ci0KLSAgICBwdWJsaWMgQ29kZWdlbkZyYW1lKCkgewotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIHRoaXMuc2V0VGl0bGUoIkF4aXMyIENvZGVnZW4gV2l6YXJkIik7IAotICAgICAgICBXaXphcmRQYW5lbCBwYW5lbCA9IG51bGw7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgQ2hvb3NlclBhbmVsKGdldFdpemFyZENvbXBvbmVudHMoKSk7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9DSE9PU0VSICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IEZpcnN0UGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGNvZGVnZW5CZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX0ZJUlNUX0EgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgTWlkZGxlUGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLHdzZGxnZW5CZWFuICk7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9GSVJTVF9CLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2Vjb25kUGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGNvZGVnZW5CZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX09QVElPTl9BICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IE9wdGlvblBhbmVsKGdldFdpemFyZENvbXBvbmVudHMoKSx3c2RsZ2VuQmVhbik7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9PUFRJT05fQiAsIHBhbmVsKTsKLQotICAgICAgICBwYW5lbCA9IG5ldyBXU0RMMkphdmFPdXRwdXRQYW5lbChnZXRXaXphcmRDb21wb25lbnRzKCksY29kZWdlbkJlYW4scHJvamVjdCk7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9MQVNUX0EgLCBwYW5lbCk7ICAgICAgCi0KLSAgICAgICAgcGFuZWwgPSBuZXcgT3V0cHV0UGFuZWwoZ2V0V2l6YXJkQ29tcG9uZW50cygpLHdzZGxnZW5CZWFuLHByb2plY3QpOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfTEFTVF9CICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IENsYXNzRmlsZUxvY2F0aW9uUGFnZShnZXRXaXphcmRDb21wb25lbnRzKCksYXJjaGl2ZUJlYW4pOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfRklSU1RfQyAsIHBhbmVsKTsKLQotICAgICAgICBwYW5lbCA9IG5ldyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGFyY2hpdmVCZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX1NFQ09ORF9DICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IExpYnJhcnlBZGRpbmdQYWdlKGdldFdpemFyZENvbXBvbmVudHMoKSxhcmNoaXZlQmVhbik7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9USElSRF9DICwgcGFuZWwpOwotCi0gICAgICAgIHBhbmVsID0gbmV3IFNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZShnZXRXaXphcmRDb21wb25lbnRzKCksYXJjaGl2ZUJlYW4pOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfRk9VUlRIX0MgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlKGdldFdpemFyZENvbXBvbmVudHMoKSxhcmNoaXZlQmVhbik7Ci0gICAgICAgIGdldFdpemFyZENvbXBvbmVudHMoKS5hZGRXaXphcmRQYW5lbChQQU5FTF9MT0FEX0MgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2VydmljZVhNTEVkaXRQYWdlKGdldFdpemFyZENvbXBvbmVudHMoKSxhcmNoaXZlQmVhbikgOwotICAgICAgICBnZXRXaXphcmRDb21wb25lbnRzKCkuYWRkV2l6YXJkUGFuZWwoUEFORUxfT1BUSU9OX0MgLCBwYW5lbCk7Ci0KLSAgICAgICAgcGFuZWwgPSBuZXcgU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UoZ2V0V2l6YXJkQ29tcG9uZW50cygpLGFyY2hpdmVCZWFuKTsKLSAgICAgICAgZ2V0V2l6YXJkQ29tcG9uZW50cygpLmFkZFdpemFyZFBhbmVsKFBBTkVMX0xBU1RfQyAsIHBhbmVsKTsKLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL3dpemFyZGZyYW1lL1dpemFyZEZyYW1lLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi90b29scy93aXphcmRmcmFtZS9XaXphcmRGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjgyOWQ2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3Rvb2xzL3dpemFyZGZyYW1lL1dpemFyZEZyYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lOwotCi1pbXBvcnQgY29tLmludGVsbGlqLm9wZW5hcGkucHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuYmVhbi5Db2RlZ2VuQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmJlYW4uU3JjQ29tcGlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5iZWFuLldzZGxnZW5CZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LkNhbmNlbEFjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5EZWZhdWx0V2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5GaW5pc2hBY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLkZpcnN0UGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLlByb2dyZXNzQmFyUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5pZGVhLlNlY29uZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYS5XU0RMMkphdmFPdXRwdXRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5KYXJGaWxlV3JpdGVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwotCi0vKioKLSAqIHdpemFyZEZyYW1lIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXphcmRGcmFtZSBleHRlbmRzIEpGcmFtZSB7Ci0gICAgIC8qKgotICAgICAqIHZhcmlhYmxlCi0gICAgICovCi0KLSAgICBwcml2YXRlIEpMYWJlbCBwYW5lbEltYWdlTGFiZWw7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgcGFuZWxUb3BUaXRsZUxhYmVsOwotICAgIHByaXZhdGUgSkxhYmVsIHBhbmVsQm90dG9tVGl0bGVMYWJlbDsKLSAgICBwcml2YXRlIFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50czsKLSAgICBwcm90ZWN0ZWQgV3NkbGdlbkJlYW4gd3NkbGdlbkJlYW47Ci0gICAgcHJvdGVjdGVkIENvZGVnZW5CZWFuIGNvZGVnZW5CZWFuOwotICAgIHByb3RlY3RlZCBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICBwcm90ZWN0ZWQgUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXJQYW5lbCBwcm9ncmVzczsKLQotICAgIHB1YmxpYyBXaXphcmRGcmFtZSgpIHsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotCi0gICAgICAgIHdpemFyZENvbXBvbmVudHMgPSBuZXcgRGVmYXVsdFdpemFyZENvbXBvbmVudHMoKTsKLSAgICAgICAgd3NkbGdlbkJlYW49IG5ldyBXc2RsZ2VuQmVhbigpOwotICAgICAgICBjb2RlZ2VuQmVhbiA9IG5ldyBDb2RlZ2VuQmVhbigpOwotICAgICAgICBhcmNoaXZlQmVhbiA9bmV3IEFyY2hpdmVCZWFuKCk7Ci0KLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKGNyZWF0ZVRpdGxlUGFuZWwoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRILCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwsCi0gICAgICAgICAgICAgICAgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXRXaXphcmRQYW5lbHNDb250YWluZXIoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAxLjAsIDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHByb2dyZXNzID1uZXcgUHJvZ3Jlc3NCYXJQYW5lbCgpOwotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKHByb2dyZXNzCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDMsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuZ2V0Q29udGVudFBhbmUoKS5hZGQobmV3IEpTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA0LCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMSwgMSwgMSwgMSksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmdldENvbnRlbnRQYW5lKCkuYWRkKGNyZWF0ZUJ1dHRvblBhbmVsKCksCi0gICAgICAgICAgICAgICAgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCA1LCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAgICAgLEdyaWRCYWdDb25zdHJhaW50cy5FQVNULCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgamF2YS5uZXQuVVJMIHJlc291cmNlID0gV2l6YXJkUGFuZWwuY2xhc3MuZ2V0UmVzb3VyY2UoIi9pY29ucy9pY29uLnBuZyIpOyAgICAgICAgICAgCi0gICAgICAgIHRoaXMuc2V0SWNvbkltYWdlKG5ldyBJbWFnZUljb24ocmVzb3VyY2UpLmdldEltYWdlKCkpOwotICAgICAgICB0aGlzLnNldEZvbnQobmV3IEZvbnQoIkhlbHZldGljYSIsIEZvbnQuUExBSU4sIDgpKTsKLQotICAgICAgICB3aXphcmRDb21wb25lbnRzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgoKFdpemFyZFBhbmVsKWV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldFBhbmVsVG9wVGl0bGUoKSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFuZWxUaXRsZUltYWdlKCgoV2l6YXJkUGFuZWwpZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0UGFuZWxJbWFnZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCgoV2l6YXJkUGFuZWwpZXZlbnQuZ2V0TmV3VmFsdWUoKSkuZ2V0UGFuZWxCb3R0b21UaXRsZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRUaXRsZSgoKFdpemFyZFBhbmVsKWV2ZW50LmdldE5ld1ZhbHVlKCkpLmdldEZyYW1lVGl0bGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEZpbmlzaEFjdGlvbihjcmVhdGVGaW5pc2hBY3Rpb24oKSk7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuc2V0Q2FuY2VsQWN0aW9uKGNyZWF0ZUNhbmNlbEFjdGlvbigpKTsKLSAgICAgICAgaGFuZGxlV2luZG93Q2xvc2luZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBXaXphcmRDb21wb25lbnRzIGdldFdpemFyZENvbXBvbmVudHMoKXsKLSAgICAgICAgcmV0dXJuIHdpemFyZENvbXBvbmVudHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0V2l6YXJkQ29tcG9uZW50cyhXaXphcmRDb21wb25lbnRzIGFXaXphcmRDb21wb25lbnRzKXsKLSAgICAgICAgd2l6YXJkQ29tcG9uZW50cyA9IGFXaXphcmRDb21wb25lbnRzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMudXBkYXRlQ29tcG9uZW50cygpOwotICAgICAgICB0aGlzLnNldFNpemUoNjAwLDYwMCk7Ci0gICAgICAgIFV0aWxpdGllcy5jZW50ZXJDb21wb25lbnRPblNjcmVlbih0aGlzKTsKLSAgICAgICAgc3VwZXIuc2hvdygpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRCb3R0b21WaXNpYmxlKGJvb2xlYW4gZmxhZyl7Ci0gICAgICAgIHBhbmVsQm90dG9tVGl0bGVMYWJlbC5zZXRWaXNpYmxlKGZsYWcpOwotICAgIH0KLSAgICAvL1NldCBUaXRsZSBQYW5lbAotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhbmVsVG9wVGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIHBhbmVsVG9wVGl0bGVMYWJlbC5zZXRUZXh0KHRpdGxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRQYW5lbEJvdHRvbVRpdGxlKFN0cmluZyB0aXRsZSkgewotICAgICAgICBwYW5lbEJvdHRvbVRpdGxlTGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotICAgIC8vIHNldCB0aXRsZSBpbWFnZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhbmVsVGl0bGVJbWFnZShJbWFnZUljb24gaW1hZ2UpewotICAgICAgICBwYW5lbEltYWdlTGFiZWwuc2V0SWNvbihpbWFnZSApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKUGFuZWwgY3JlYXRlVGl0bGVQYW5lbCgpIHsKLQotICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkQmFnTGF5b3V0KCkgKTsKLQotICAgICAgICBwYW5lbC5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlICk7Ci0KLSAgICAgICAgcGFuZWxUb3BUaXRsZUxhYmVsID0gbmV3IEpMYWJlbCgpOwotICAgICAgICBwYW5lbFRvcFRpdGxlTGFiZWwuc2V0Rm9udChuZXcgRm9udCgiSGVsdmV0aWNhIiwgRm9udC5CT0xELCAxMikpOwotCi0gICAgICAgIHBhbmVsQm90dG9tVGl0bGVMYWJlbD1uZXcgSkxhYmVsKCk7Ci0gICAgICAgIHBhbmVsQm90dG9tVGl0bGVMYWJlbC5zZXRGb250KG5ldyBGb250KCJIZWx2ZXRpY2EiLCBGb250LklUQUxJQywgMTApKTsKLQotICAgICAgICBwYW5lbEltYWdlTGFiZWw9IG5ldyBKTGFiZWwoKTsKLQotICAgICAgICBwYW5lbC5hZGQocGFuZWxUb3BUaXRsZUxhYmVsCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDAuNSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDEwLCAyMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICBwYW5lbC5hZGQocGFuZWxCb3R0b21UaXRsZUxhYmVsCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuNSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTElORV9TVEFSVCwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoMTAsMjAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgcGFuZWwuYWRkKHBhbmVsSW1hZ2VMYWJlbAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCAxLDIsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSLCBHcmlkQmFnQ29uc3RyYWludHMuQk9USAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cygwLCAwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHJldHVybiBwYW5lbDsKLQotICAgIH0KLSAgICBwcm90ZWN0ZWQgSlBhbmVsIGNyZWF0ZUJ1dHRvblBhbmVsKCkgewotICAgICAgICBKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBwYW5lbC5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXRCYWNrQnV0dG9uKCkpOwotICAgICAgICBwYW5lbC5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXROZXh0QnV0dG9uKCkpOwotICAgICAgICBwYW5lbC5hZGQod2l6YXJkQ29tcG9uZW50cy5nZXRGaW5pc2hCdXR0b24oKSk7Ci0gICAgICAgIHBhbmVsLmFkZCh3aXphcmRDb21wb25lbnRzLmdldENhbmNlbEJ1dHRvbigpKTsKLSAgICAgICAgcmV0dXJuIHBhbmVsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaW5pc2hBY3Rpb24gY3JlYXRlRmluaXNoQWN0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEZpbmlzaEFjdGlvbih3aXphcmRDb21wb25lbnRzKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoQWN0aW9uIHBlcmZvcm1lZCIpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0Q3VycmVudFBhbmVsKCkudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2l6YXJkQ29tcG9uZW50cy5nZXRDdXJyZW50UGFuZWwoKS5nZXRQYWdlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdpemFyZFBhbmVsIC5XU0RMXzJfSkFWQV9UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRmluaXNoV1NETDJKYXZhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hBY3Rpb24gIFdTREwySmF2YSBwZXJmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgV2l6YXJkUGFuZWwuSkFWQV8yX1dTRExfVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0ZpbmlzaEphdmEyV1NETCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoQWN0aW9uIEphdmEyV1NETCBwZXJmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvRmluaXNoU2VydmljZUFyY2hpdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmlzaEFjdGlvbiBTZXJ2Y2llIEFyY2hpdmUgcGVyZm9ybWVkIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFdpemFyZFBhbmVsLlVOU1BFQ0lGSUVEX1RZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vRG8gbm90aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBzdGF0ZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEN1cnJlbnRJbmRleChDb2RlZ2VuRnJhbWUuUEFORUxfQ0hPT1NFUik7Ci0gICAgICAgICAgICAgICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIENhbmNlbEFjdGlvbiBjcmVhdGVDYW5jZWxBY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FuY2VsQWN0aW9uKHdpemFyZENvbXBvbmVudHMpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgd2l6YXJkQ29tcG9uZW50cy5zZXRDdXJyZW50SW5kZXgoQ29kZWdlbkZyYW1lLlBBTkVMX0NIT09TRVIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuY2VsQWN0aW9uIHBlcmZvcm1lZCIpOwotICAgICAgICAgICAgICAgIGRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVXaW5kb3dDbG9zaW5nKCkgewotICAgICAgICB3aXphcmRDb21wb25lbnRzLnNldEN1cnJlbnRJbmRleChDb2RlZ2VuRnJhbWUuUEFORUxfQ0hPT1NFUik7Ci0gICAgICAgIHRoaXMuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLSAgICAgICAgdGhpcy5hZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0Q2FuY2VsQWN0aW9uKCkucGVyZm9ybUFjdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcmFncmVzcygpewotICAgICAgICB3aXphcmRDb21wb25lbnRzLmdldEZpbmlzaEJ1dHRvbigpLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBwcm9ncmVzcy5hYm91dFRvRGlzcGxheVBhbmVsKCk7Ci0gICAgICAgIHByb2dyZXNzLmRpc3BsYXlpbmdQYW5lbCgpOwotICAgICAgICBuZXcgamF2YS51dGlsLlRpbWVyKHRydWUpLnNjaGVkdWxlKG5ldyBUaW1lclRhc2soKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3Jlc3MucmVxdWVzdFN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTAwMCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3VjY2VzcygpewotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzICwKLSAgICAgICAgICAgICAgICAiQ29kZSBnZW5hcmF0aW9uIFN1Y2Nlc3NmdWwgISIgKyB3cml0ZXIudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAiQXhpczIgY29kZSBnZW5lcmF0aW9uIiwKLSAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5JTkZPUk1BVElPTl9NRVNTQUdFICk7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuc2V0Q3VycmVudEluZGV4KENvZGVnZW5GcmFtZS5QQU5FTF9DSE9PU0VSKTsKLSAgICAgICAgZGlzcG9zZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yKCl7Ci0gICAgICAgIHdpemFyZENvbXBvbmVudHMuZ2V0RmluaXNoQnV0dG9uKCkuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcyAsCi0gICAgICAgICAgICAgICAgIkNvZGUgZ2VuYXJhdGlvbiBmYWlsZWQhICEiICsgd3JpdGVyLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgIkF4aXMyIGNvZGUgZ2VuZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRMaWJzVG9Qcm9qZWN0TGliKFN0cmluZyBsaWJEaXJlY3RvcnksIFN0cmluZyBvdXRwdXRMb2NhdGlvbil7Ci0gICAgICAgIFN0cmluZyBuZXdPdXRwdXRMb2NhdGlvbiA9IG91dHB1dExvY2F0aW9uK0ZpbGUuc2VwYXJhdG9yKyJsaWIiOwotICAgICAgICAvL0NyZWF0ZSBhIGxpYiBkaXJlY3Rvcnk7IGFsbCBhbmNlc3RvciBkaXJlY3RvcmllcyBtdXN0IGV4aXN0Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IChuZXcgRmlsZShuZXdPdXRwdXRMb2NhdGlvbikpLm1rZGlyKCk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgLy8gRGlyZWN0b3J5IGNyZWF0aW9uIGZhaWxlZAotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb3B5RGlyZWN0b3J5KG5ldyBGaWxlKGxpYkRpcmVjdG9yeSksbmV3IEZpbGUobmV3T3V0cHV0TG9jYXRpb24pKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENvcGllcyBhbGwgZmlsZXMgdW5kZXIgc3JjRGlyIHRvIGRzdERpci4KLSAgICAvLyBJZiBkc3REaXIgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlEaXJlY3RvcnkoRmlsZSBzcmNEaXIsIEZpbGUgZHN0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoc3JjRGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGlmICghZHN0RGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgZHN0RGlyLm1rZGlyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gc3JjRGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkobmV3IEZpbGUoc3JjRGlyLCBjaGlsZHJlbltpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShkc3REaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb3B5RmlsZShzcmNEaXIsIGRzdERpcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDb3BpZXMgc3JjIGZpbGUgdG8gZHN0IGZpbGUuCi0gICAgLy8gSWYgdGhlIGRzdCBmaWxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkCi0gICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKEZpbGUgc3JjLCBGaWxlIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpOwotCi0gICAgICAgIC8vIFRyYW5zZmVyIGJ5dGVzIGZyb20gaW4gdG8gb3V0Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgaW50IGxlbjsKLSAgICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKLSAgICAgICAgfQotICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvLyBEZWxldGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgdW5kZXIgZGlyLgotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGVsZXRpb25zIHdlcmUgc3VjY2Vzc2Z1bC4KLSAgICAvLyBJZiBhIGRlbGV0aW9uIGZhaWxzLCB0aGUgbWV0aG9kIHN0b3BzIGF0dGVtcHRpbmcgdG8gZGVsZXRlIGFuZCByZXR1cm5zIGZhbHNlLgotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLSAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IGRpci5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCB2b2lkIGRvRmluaXNoV1NETDJKYXZhKCl7Ci0gICAgICAgIGhhbmRsZVByYWdyZXNzKCk7Ci0gICAgICAgbmV3IGphdmEudXRpbC5UaW1lcih0cnVlKS5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlyc3RQYW5lbCAgZmlyc3Q9KEZpcnN0UGFuZWwpd2l6YXJkQ29tcG9uZW50cy5nZXRXaXphcmRQYW5lbCgxKTsKLSAgICAgICAgICAgICAgICAgICAgU2Vjb25kUGFuZWwgb3B0aW9uPShTZWNvbmRQYW5lbCl3aXphcmRDb21wb25lbnRzLmdldFdpemFyZFBhbmVsKDMpOwotICAgICAgICAgICAgICAgICAgICBXU0RMMkphdmFPdXRwdXRQYW5lbCBvdXRwdXQ9KFdTREwySmF2YU91dHB1dFBhbmVsKXdpemFyZENvbXBvbmVudHMuZ2V0V2l6YXJkUGFuZWwoNSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZXJ2ZXJzaWRlLGlzU2VydmljZVhNTCxpc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5nZXRHZW5lcmF0ZUFsbCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyc2lkZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZpY2VYTUwgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmVyc2lkZSA9IG9wdGlvbi5pc1NlcnZlcnNpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VydmljZVhNTCA9b3B0aW9uLmlzU2VydmVyWE1MKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSA9IG9wdGlvbi5nZXRHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRQYWNrYWdlTmFtZShvcHRpb24uZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldExhbmd1YWdlKG9wdGlvbi5nZXRTZWxlY3RlZExhbmd1YWdlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRQb3J0TmFtZShvcHRpb24uZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFNlcnZpY2VOYW1lKG9wdGlvbi5nZXRTZXJ2aWNlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0RGF0YWJpbmRpbmdOYW1lKG9wdGlvbi5nZXREYXRhYmluZGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29kZWdlbkJlYW4uc2V0QXN5bmNPbmx5KG9wdGlvbi5pc0FzeW5jT25seU9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRTeW5jT25seShvcHRpb24uaXNTeW5jT25seU9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRUZXN0Q2FzZShvcHRpb24uaXNHZW5lcmF0ZVRlc3RDYXNlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRHZW5lcmF0ZUFsbChvcHRpb24uZ2V0R2VuZXJhdGVBbGwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFNlcnZlclhNTChpc1NlcnZpY2VYTUwpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRTZXJ2ZXJTaWRlKGlzU2VydmVyc2lkZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFNlcnZlclNpZGVJbnRlcmZhY2UoaXNHZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXRPdXRwdXQob3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZ2VuQmVhbi5zZXROYW1lc3BhY2UycGFja2FnZUxpc3Qob3B0aW9uLmdldE5zMlBrZ01hcHBpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLnNldFdTRExGaWxlTmFtZShmaXJzdC5nZXRXU0RMRmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVnZW5CZWFuLmdlbmVyYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgLy9BZGQgdGhlIGNvZGVnZW4gbGlicyB0aGF0IGFyZSBjb21pbmcgd2l0aCB0aGUgcGx1Z2luIHRvIHRoZSBwcm9qZWN0IGxpYiB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC5nZXRBeGlzMlBsdWdpbkxpYkNvcHlDaGVja0JveFNlbGVjdGlvbigpKXsKLSAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IFdpemFyZFBhbmVsLmNsYXNzLmdldFJlc291cmNlKCIvaWNvbnMvaWNvbi5wbmciKTsKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID1uZXcgRmlsZShyZXNvdXJjZS5nZXRQYXRoKCkpLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwbHVnaW5MaWJMb2NhdGlvbiA9IHBhdGgrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0gICAgICAgICAgICAgICAgCSBhZGRMaWJzVG9Qcm9qZWN0TGliKHBsdWdpbkxpYkxvY2F0aW9uLCBvdXRwdXQuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAvL0FkZCB0aGUgbGlicmFyaWVzIG9uIHRoZSBwbHVnaW4gbGliIGRpcmVjdG9yeSB0byB0aGUgY3JlYXRlZCBwcm9qZWN0IGxpYgotICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LmdldEF4aXNMaWJDb3B5Q2hlY2tCb3hTZWxlY3Rpb24oKSAmJiBvdXRwdXQub2t0b0xvYWRMaWJzKCkpewotICAgICAgICAgICAgICAgIAkgU3RyaW5nIGxpYkRpcmVjdG9yeSA9IG91dHB1dC5nZXRBeGlzSmFyc0xvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgCSBhZGRMaWJzVG9Qcm9qZWN0TGliKGxpYkRpcmVjdG9yeSwgb3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgLy9UaGlzIHdpbGwgQ3JlYXRlIGEgamFyIGZpbGUgZnJvbSB0aGUgY29kZWdlbiByZXN1bHRzIGFuZCBhZGQgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAvL2xvY2F0aW9ucyBsaWIgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgIGlmIChvdXRwdXQuZ2V0Q3JlYXRlSmFyQ2hlY2tCb3hTZWxlY3Rpb24oKSl7Ci0gICAgICAgICAgICAgICAgICAgICBGaWxlIHRlbXBDbGFzc0ZpbGU9Y29kZWdlbkJlYW4uZ2V0VGVtcCgpOwotICAgICAgICAgICAgICAgICAgICAgdGVtcENsYXNzRmlsZS5ta2RpcigpOwotICAgICAgICAgICAgICAgICAgICAgRmlsZSBzcmNUZW1wPW5ldyBGaWxlKHRlbXBDbGFzc0ZpbGUuZ2V0UGF0aCgpK0ZpbGUuc2VwYXJhdG9yKyJzcmMiKTsKLSAgICAgICAgICAgICAgICAgICAgIHNyY1RlbXAubWtkaXIoKTsKLSAgICAgICAgICAgICAgICAgICAgIGNvcHlEaXJlY3RvcnkobmV3IEZpbGUob3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkrRmlsZS5zZXBhcmF0b3IrInNyYyIpLHNyY1RlbXApOwotICAgICAgICAgICAgICAgICAgICAgLy9Db21waWxlIHRoZSBzb3VyY2UgdG8gYW5vdGhlciBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAJIFNyY0NvbXBpbGVyIHNyY0NvbXBpbGVUb29sID0gbmV3IFNyY0NvbXBpbGVyKCk7Ci0gICAgICAgICAgICAgICAgCSBzcmNDb21waWxlVG9vbC5jb21waWxlU291cmNlKHRlbXBDbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgIC8vY3JlYXRlIHRoZSBqYXIgZmlsZSBhbmQgYWRkIHRoYXQgdG8gdGhlIGxpYiBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAJIFN0cmluZyBwcm9qZWN0TGliID0gb3V0cHV0LmdldE91dHB1dExvY2F0aW9uKCkrRmlsZS5zZXBhcmF0b3IrImxpYiI7Ci0gICAgICAgICAgICAgICAgCSBKYXJGaWxlV3JpdGVyIGphckZpbGVXcml0ZXIgPSBuZXcgSmFyRmlsZVdyaXRlcigpOwotICAgICAgICAgICAgICAgIAkgU3RyaW5nIGphckZpbGVOYW1lID0gIkNvZGVnZW5SZXN1bHRzLmphciI7Ci0gICAgICAgICAgICAgICAgCSBpZiAoIW91dHB1dC5nZXRKYXJGaWxlbmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICAgICAgIAkJIGphckZpbGVOYW1lPW91dHB1dC5nZXRKYXJGaWxlbmFtZSgpOwotICAgICAgICAgICAgICAgIAkgfQotICAgICAgICAgICAgICAgIAkgb3V0cHV0LnNldEphckZpbGVOYW1lKGphckZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICBGaWxlIHRlbXBDbGFzcyA9IG5ldyBGaWxlKHRlbXBDbGFzc0ZpbGUuZ2V0UGF0aCgpK0ZpbGUuc2VwYXJhdG9yKyJjbGFzc2VzIik7Ci0gICAgICAgICAgICAgICAgICAgICBqYXJGaWxlV3JpdGVyLndyaXRlSmFyRmlsZShuZXcgRmlsZShwcm9qZWN0TGliKSwgamFyRmlsZU5hbWUsIHRlbXBDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAJIC8vRGVsZXRlIHRoZSB0ZW1wIGZvbGRlcnMKLSAgICAgICAgICAgICAgICAJIGRlbGV0ZURpcih0ZW1wQ2xhc3NGaWxlICk7Ci0KLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3VjY2VzcygpOwotICAgICAgICAgICAgICAgIH1jYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0sIDUwMDApOwotCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9GaW5pc2hKYXZhMldTREwoKXsKLSAgICAgICAgaGFuZGxlUHJhZ3Jlc3MoKTsKLSAgICAgICAgbmV3IGphdmEudXRpbC5UaW1lcih0cnVlKS5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgewotICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd3NkbGdlbkJlYW4uZ2VuZXJhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVN1Y2Nlc3MoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgIH0sIDMxMDApOwotICAgIH0KLSAgICAgcHJvdGVjdGVkIHZvaWQgZG9GaW5pc2hTZXJ2aWNlQXJjaGl2ZSgpewotICAgICAgIGhhbmRsZVByYWdyZXNzKCk7Ci0gICAgICAgIG5ldyBqYXZhLnV0aWwuVGltZXIodHJ1ZSkuc2NoZWR1bGUobmV3IFRpbWVyVGFzaygpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uZmluc2goKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVN1Y2Nlc3MoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3Muc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCAzMTAwKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpewotICAgICAgICB0aGlzLnByb2plY3Q9cHJvamVjdDsKLSAgICB9Ci0gICAgcHVibGljIEpDb21wb25lbnQgZ2V0Um9vdENvbXBvbmVudCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um9vdFBhbmUoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgc2hvd1VJKCkgewotICAgICAgICBwYWNrKCk7Ci0gICAgICAgIHRoaXMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgc2hvdygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0FyY2hpdmVCZWFuLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQXJjaGl2ZUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5N2MyNy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQXJjaGl2ZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVCZWFuIHsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaW5nbGVTZXJ2aWNlID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGdlbmVyZXRTZXJ2aWNlRGVzYyA9IGZhbHNlOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IGNsYXNzTG9jYXRpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBGaWxlIGNsYXNzTG9jOwotICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgU2VydmljZVhNTDsKLSAgICBwdWJsaWMgU3RyaW5nIGZpbGVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgbGlicyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCB0ZW1wTGlicyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCB0ZW1wV3NkbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Qgd3NkbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0UGF0aDsKLSAgICBwcml2YXRlIFN0cmluZyBhcmNoaXZlTmFtZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBzZXJ2aWNlbHNpdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUNsYXNzPWZhbHNlOwotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRUZW1wV3NkbHMoKSB7Ci0gICAgICAgIHJldHVybiB0ZW1wV3NkbHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVtcFdzZGxzKEFycmF5TGlzdCB0ZW1wV3NkbHMpIHsKLSAgICAgICAgdGhpcy50ZW1wV3NkbHMgPSB0ZW1wV3NkbHM7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRUZW1wTGlicygpIHsKLSAgICAgICAgcmV0dXJuIHRlbXBMaWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlbXBMaWJzKEFycmF5TGlzdCB0ZW1wTGlicykgewotICAgICAgICB0aGlzLnRlbXBMaWJzID0gdGVtcExpYnM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0Q2xhc3NMb2MoKSB7Ci0gICAgICAgIHJldHVybiBjbGFzc0xvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYyhGaWxlIGNsYXNzTG9jKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NMb2MgPSBjbGFzc0xvYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFNlcnZpY2Vsc2l0KCkgewotICAgICAgICByZXR1cm4gc2VydmljZWxzaXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG9TZXJ2aWNlbHNpdChTZXJ2aWNlT2JqIHNlcnZpY2UpIHsKLSAgICAgICAgZm9yIChpbnQgY291bnQgPTA7Y291bnQ8c2VydmljZWxzaXQuc2l6ZSgpO2NvdW50KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKFNlcnZpY2VPYmopc2VydmljZWxzaXQuZ2V0KGNvdW50KSkuZ2V0U2VydmljZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2UuZ2V0U2VydmljZU5hbWUoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VydmljZWxzaXQucmVtb3ZlKGNvdW50KTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlbHNpdC5hZGQoc2VydmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgc2VydmljZWxzaXQuYWRkKHNlcnZpY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2luZ2xlU2VydmljZSgpIHsKLSAgICAgICAgcmV0dXJuIHNpbmdsZVNlcnZpY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2luZ2xlU2VydmljZShib29sZWFuIHNpbmdsZVNlcnZpY2UpIHsKLSAgICAgICAgdGhpcy5zaW5nbGVTZXJ2aWNlID0gc2luZ2xlU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyZXRTZXJ2aWNlRGVzYygpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyZXRTZXJ2aWNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmV0U2VydmljZURlc2MoYm9vbGVhbiBnZW5lcmV0U2VydmljZURlc2MpIHsKLSAgICAgICAgdGhpcy5nZW5lcmV0U2VydmljZURlc2MgPSBnZW5lcmV0U2VydmljZURlc2M7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRDbGFzc0xvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gY2xhc3NMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDbGFzc0xvY2F0aW9uKEZpbGUgY2xhc3NMb2NhdGlvbikgewotICAgICAgICB0aGlzLmNsYXNzTG9jYXRpb24uYWRkKGNsYXNzTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVhNTCgpIHsKLSAgICAgICAgcmV0dXJuIFNlcnZpY2VYTUw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZVhNTChTdHJpbmcgc2VydmljZVhNTCkgewotICAgICAgICBTZXJ2aWNlWE1MID0gc2VydmljZVhNTDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldExpYnMoKSB7Ci0gICAgICAgIHJldHVybiBsaWJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZExpYnMoQXJyYXlMaXN0IGxpYnMpIHsKLSAgICAgICAgdGhpcy5saWJzLmFkZEFsbChsaWJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldFdzZGxzKCkgewotICAgICAgICByZXR1cm4gd3NkbHM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkV3NkbHMoRmlsZSB3c2RsKSB7Ci0gICAgICAgIHRoaXMud3NkbHMuYWRkKHdzZGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIG91dFBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0UGF0aChTdHJpbmcgb3V0UGF0aCkgewotICAgICAgICB0aGlzLm91dFBhdGggPSBvdXRQYXRoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJjaGl2ZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBhcmNoaXZlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmNoaXZlTmFtZShTdHJpbmcgYXJjaGl2ZU5hbWUpIHsKLSAgICAgICAgdGhpcy5hcmNoaXZlTmFtZSA9IGFyY2hpdmVOYW1lOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQ2xhc3MoYm9vbGVhbiBpbmNsdWRlQ2xhc3MpewotICAgICAgICB0aGlzLmluY2x1ZGVDbGFzcz1pbmNsdWRlQ2xhc3M7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVDbGFzcygpewotICAgICAgICByZXR1cm4gdGhpcy5pbmNsdWRlQ2xhc3M7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBmaW5zaCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvL0NyZWF0aW5nIG91dCBGaWxlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIG91dEZpbGUgPSBuZXcgRmlsZShnZXRPdXRQYXRoKCkpOwotICAgICAgICAgICAgU3RyaW5nIHRpbWUgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKS50b1N0cmluZygpLnJlcGxhY2UoJzonLCAnLScpOwotICAgICAgICAgICAgRmlsZSB0ZW1wZmlsZSA9IG5ldyBGaWxlKG91dEZpbGUsICJ0ZW1wLSIgKyB0aW1lKTsKLSAgICAgICAgICAgIHRlbXBmaWxlLm1rZGlyKCk7Ci0gICAgICAgICAgICAvL2NyZWF0aW5nIE1FVEEtSU5GCi0gICAgICAgICAgICBGaWxlIG1ldGFpbmYgPSBuZXcgRmlsZSh0ZW1wZmlsZSwgIk1FVEEtSU5GIik7Ci0gICAgICAgICAgICBpZiAoIW1ldGFpbmYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBtZXRhaW5mLm1rZGlyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdyaXRpbmcgc2VydmljZXMueG1sCi0gICAgICAgICAgICBGaWxlIHNlcnZpY2V4bWwgPSBuZXcgRmlsZShtZXRhaW5mLCAic2VydmljZXMueG1sIik7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHNlcnZpY2V4bWwpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGdldFNlcnZpY2VYTUwoKSk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgICAgICAvL0NvcGluZyBjbGFzcyBmaWxlcwotICAgICAgICAgICAgRmlsZUNvcGllciBmYyA9IG5ldyBGaWxlQ29waWVyKCk7Ci0gICAgICAgICAgICBpZihpbmNsdWRlQ2xhc3MpewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvdW50PTA7Y291bnQ8Y2xhc3NMb2NhdGlvbi5zaXplKCk7Y291bnQrKykKLSAgICAgICAgICAgICAgICAgICAgZmMuY29weUZpbGVzKChGaWxlKWNsYXNzTG9jYXRpb24uZ2V0KGNvdW50KSwgdGVtcGZpbGUsICIuY2xhc3MiKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvdW50PTA7Y291bnQ8Y2xhc3NMb2NhdGlvbi5zaXplKCk7Y291bnQrKykKLSAgICAgICAgICAgICAgICAgICAgZmMuY29weUZpbGVzKChGaWxlKWNsYXNzTG9jYXRpb24uZ2V0KGNvdW50KSwgdGVtcGZpbGUsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ29waW5nIHdzZGwgZmlsZXMKLSAgICAgICAgICAgIEZpbGUgbGliID0gbmV3IEZpbGUodGVtcGZpbGUsICJsaWIiKTsKLSAgICAgICAgICAgIGlmICghbGliLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgbGliLm1rZGlyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGlicyE9bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaWJuYW1lID0gKFN0cmluZykgbGlicy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgZmMuY29weUZpbGVzKG5ldyBGaWxlKGxpYm5hbWUpLCBsaWIsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NvcGluZyB3c2RsIGZpbGVzCi0gICAgICAgICAgICBpZiAod3NkbHMhPW51bGwpCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBsaWJuYW1lID0gKEZpbGUpd3NkbHMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZjLmNvcHlGaWxlcyhsaWJuYW1lLCBtZXRhaW5mLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGFyY2l2ZW5hbWUgPSBnZXRBcmNoaXZlTmFtZSgpOwotICAgICAgICAgICAgaWYgKGFyY2l2ZW5hbWUuaW5kZXhPZigiLmFhciIpIDwgMCkgewotICAgICAgICAgICAgICAgIGFyY2l2ZW5hbWUgPSBhcmNpdmVuYW1lICsgIi5hYXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSmFyRmlsZVdyaXRlciBqd3JpdGVyID0gbmV3IEphckZpbGVXcml0ZXIoKTsKLSAgICAgICAgICAgIGp3cml0ZXIud3JpdGVKYXJGaWxlKG91dEZpbGUsIGFyY2l2ZW5hbWUsIHRlbXBmaWxlKTsKLSAgICAgICAgICAgIC8vY3JhZXRpbmcgdGhlIGphciBmaWxlCi0gICAgICAgICAgICBkZWxldGVEaXIodGVtcGZpbGUpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGRlbGV0ZURpcihGaWxlIGRpcikgewotICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNoaWxkcmVuID0gZGlyLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBkZWxldGVEaXIobmV3IEZpbGUoZGlyLCBjaGlsZHJlbltpXSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSBpcyBub3cgZW1wdHkgc28gZGVsZXRlIGl0Ci0gICAgICAgIHJldHVybiBkaXIuZGVsZXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLSAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQ2xhc3NGaWxlRmlsdGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vQ2xhc3NGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjBkODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0NsYXNzRmlsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGFzc0ZpbGVGaWx0ZXIgZXh0ZW5kcyBGaWxlRmlsdGVyIHsKLQotICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZSApOwotICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBleHRlbnNpb24uZXF1YWxzKCJjbGFzcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICIuY2xhc3MiOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuc2lvbihGaWxlIGZpbGUpIHsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0ZpbGVDb3BpZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9GaWxlQ29waWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYjc4M2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0ZpbGVDb3BpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIEZpbGVDb3BpZXIgZXh0ZW5kcyBDb3B5IHsKLSAgICBwdWJsaWMgRmlsZUNvcGllcigpIHsKLSAgICAgICAgdGhpcy5zZXRQcm9qZWN0KG5ldyBQcm9qZWN0KCkpOwotICAgICAgICB0aGlzLmdldFByb2plY3QoKS5pbml0KCk7Ci0gICAgICAgIHRoaXMuc2V0VGFza1R5cGUoImNvcHkiKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrTmFtZSgiY29weS1maWxlcyIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlcyhGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnksIFN0cmluZyBmaWx0ZXIpIHsKLQotICAgICAgICBpZiAoc291cmNlRmlsZS5pc0ZpbGUoKSkKLSAgICAgICAgICAgIHRoaXMuc2V0RmlsZShzb3VyY2VGaWxlKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZpbGVzZXQgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICAgICAgZmlsZXNldC5zZXREaXIoc291cmNlRmlsZSk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMoIlxcLlxcdyoiKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlc2V0LnNldEluY2x1ZGVzKCIqLyoqLyoiICsgZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMuYWRkRmlsZXNldChmaWxlc2V0KTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNldFRvZGlyKGRlc3RpbmF0aW9uRGlyZWN0b3J5KTsKLSAgICAgICAgdGhpcy5wZXJmb3JtKCk7Ci0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0phckZpbGVXcml0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9KYXJGaWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTY4NDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL0phckZpbGVXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmFyRmlsZVdyaXRlciBleHRlbmRzIEphciB7Ci0KLQotICAgIHB1YmxpYyBKYXJGaWxlV3JpdGVyKCkgewotICAgICAgICB0aGlzLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0gICAgICAgIHRoaXMuZ2V0UHJvamVjdCgpLmluaXQoKTsKLSAgICAgICAgdGhpcy5zZXRUYXNrVHlwZSgiamFyIik7Ci0gICAgICAgIHRoaXMuc2V0VGFza05hbWUoImphciIpOwotICAgICAgICB0aGlzLnNldE93bmluZ1RhcmdldChuZXcgb3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSmFyRmlsZShGaWxlIG91dHB1dEZvbGRlciwgU3RyaW5nIG91dHB1dEZpbGVOYW1lLCBGaWxlIGlucHV0RmlsZUZvbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24gewotCi0gICAgICAgIGlmICghb3V0cHV0Rm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBvdXRwdXRGb2xkZXIubWtkaXIoKTsgLy9jcmVhdGUgdGhlIG91dHB1dCBwYXRoCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIW91dHB1dEZvbGRlci5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZvbGRlciwgb3V0cHV0RmlsZU5hbWUpOwotICAgICAgICB0aGlzLnNldEJhc2VkaXIoaW5wdXRGaWxlRm9sZGVyKTsKLSAgICAgICAgdGhpcy5zZXREZXN0RmlsZSh0YXJnZXRGaWxlKTsKLQotICAgICAgICAvL3J1biB0aGUgdGFzawotICAgICAgICB0aGlzLnBlcmZvcm0oKTsKLQotCi0gICAgfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL09wZXJhdGlvbk9iai5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL09wZXJhdGlvbk9iai5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGViMjQyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9PcGVyYXRpb25PYmouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25PYmogewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgT3BOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIFJldHVyblZhbHVlOwotICAgIHByaXZhdGUgSW50ZWdlciBwYXJhbWV0ZXJzOwotICAgIHByaXZhdGUgQm9vbGVhbiBzZWxlY3Q7Ci0KLSAgICBwdWJsaWMgT3BlcmF0aW9uT2JqKFN0cmluZyBvcE5hbWUsIFN0cmluZyByZXR1cm5WYWxlLCBJbnRlZ2VyIHBhcmFtZXRlcnMsIEJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIE9wTmFtZSA9IG9wTmFtZTsKLSAgICAgICAgUmV0dXJuVmFsdWUgPSByZXR1cm5WYWxlOwotICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICB0aGlzLnNlbGVjdCA9IHNlbGVjdDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BOYW1lKCkgewotICAgICAgICByZXR1cm4gT3BOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9wTmFtZShTdHJpbmcgb3BOYW1lKSB7Ci0gICAgICAgIE9wTmFtZSA9IG9wTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJldHVyblZhbHVlKCkgewotICAgICAgICByZXR1cm4gUmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmV0dXJuVmFsdWUoU3RyaW5nIHJldHVyblZhbHVlKSB7Ci0gICAgICAgIFJldHVyblZhbHVlID0gcmV0dXJuVmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0UGFyYW1ldGVycygpIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhJbnRlZ2VyIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRTZWxlY3QoKSB7Ci0gICAgICAgIHJldHVybiBzZWxlY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0KEJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIHRoaXMuc2VsZWN0ID0gc2VsZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50TWUoKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT0gUm93ID09PT09PT09PT09PT0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcE5hbWUgPSAiICsgT3BOYW1lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYXJhbWV0ZXJzID0gIiArIHBhcmFtZXRlcnMpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJldHVyblZhbHVlID0gIiArIFJldHVyblZhbHVlKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZWxlY3QgPSAiICsgc2VsZWN0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1BhcmFtZXRlck9iai5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1BhcmFtZXRlck9iai5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTRjM2M2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9QYXJhbWV0ZXJPYmouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJPYmogewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgIHBhcmFOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIHBhcmFWYWx1ZTsKLQotICAgIHB1YmxpYyBQYXJhbWV0ZXJPYmooU3RyaW5nIG5hbWUsU3RyaW5nIHZhbHVlKXsKLSAgICAgICAgdGhpcy5wYXJhTmFtZT1uYW1lOwotICAgICAgICB0aGlzLnBhcmFWYWx1ZT12YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKXsKLSAgICAgICAgdGhpcy5wYXJhTmFtZT1uYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSl7Ci0gICAgICAgIHRoaXMucGFyYVZhbHVlPXZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgIGdldE5hbWUoKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyAgZ2V0VmFsdWUoKXsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYVZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1NlcnZpY2VPYmouamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9TZXJ2aWNlT2JqLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzAxYzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1NlcnZpY2VPYmouamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZU9iaiB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNsYXNzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0IG9wZXJhdGlvbnM7Ci0KLSAgICBwdWJsaWMgU2VydmljZU9iaihTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBzZXJ2aWNlQ2xhc3MsIEFycmF5TGlzdCBvcGVyYXRpb25zKSB7Ci0gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlQ2xhc3M7Ci0gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNsYXNzKCkgewotICAgICAgICByZXR1cm4gc2VydmljZUNsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnJheUxpc3QgZ2V0T3BlcmF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wZXJhdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VYTUwgPSAiPHNlcnZpY2UgbmFtZT1cIiIgKyBzZXJ2aWNlTmFtZSArICJcIiA+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgPGRlc2NyaXB0aW9uPlxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICBQbGVhc2UgVHlwZSB5b3VyIHNlcnZpY2UgZGVzY3JpcHRpb24gaGVyZVxuIiArCi0gICAgICAgICAgICAgICAgIiAgIDwvZGVzY3JpcHRpb24+XG4iICsKLSAgICAgICAgICAgICAgICAiICAgPG1lc3NhZ2VSZWNlaXZlcnM+XG4iKwotICAgICAgICAgICAgICAgICIgICAgICAgPG1lc3NhZ2VSZWNlaXZlciBtZXA9XCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwvaW4tb25seVwiIFxuIisKLSAgICAgICAgICAgICAgICAiICAgICAgIGNsYXNzPVwib3JnLmFwYWNoZS5heGlzMi5ycGMucmVjZWl2ZXJzLlJQQ0luT25seU1lc3NhZ2VSZWNlaXZlclwiIC8+XG4gIisKLSAgICAgICAgICAgICAgICAiICAgICAgIDxtZXNzYWdlUmVjZWl2ZXIgbWVwPVwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsL2luLW91dFwiXG4gIiArCi0gICAgICAgICAgICAgICAgIiAgICAgICBjbGFzcz1cIm9yZy5hcGFjaGUuYXhpczIucnBjLnJlY2VpdmVycy5SUENNZXNzYWdlUmVjZWl2ZXJcIiAvPiBcbiIgKwotICAgICAgICAgICAgICAgICIgICA8L21lc3NhZ2VSZWNlaXZlcnM+XG4gIisKLSAgICAgICAgICAgICAgICAiICAgPHBhcmFtZXRlciBuYW1lPVwiU2VydmljZUNsYXNzXCIgbG9ja2VkPVwiZmFsc2VcIj4iICsgc2VydmljZUNsYXNzICsgIjwvcGFyYW1ldGVyPlxuIjsKLSAgICAgICAgaWYgKG9wZXJhdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VydmljZVhNTCA9IHNlcnZpY2VYTUwgKyAiIDxleGNsdWRlT3BlcmF0aW9ucz5cbiI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIG9wZXJhdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBvcCA9ICIgICAgICAgPG9wZXJhdGlvbj4iICsgcyArICI8L29wZXJhdGlvbj5cbiI7Ci0gICAgICAgICAgICAgICAgc2VydmljZVhNTCA9IHNlcnZpY2VYTUwgKyBvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcnZpY2VYTUwgPSBzZXJ2aWNlWE1MICsgIiA8L2V4Y2x1ZGVPcGVyYXRpb25zPlxuIjsKLSAgICAgICAgfQotICAgICAgICBzZXJ2aWNlWE1MID0gc2VydmljZVhNTCArICI8L3NlcnZpY2U+XG4iOwotICAgICAgICByZXR1cm4gc2VydmljZVhNTDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9WYWxpZGF0ZVhNTEZpbGUuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9WYWxpZGF0ZVhNTEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2Y2RmNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2JlYW4vVmFsaWRhdGVYTUxGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC52YWxpZGF0aW9uLlNjaGVtYTsKLWltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIHRoaXMgY2Fsc3MgdXNlZCBmb3IgY2hlY2sgc2VydmljZSB4bWwgdmFsaWRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVYTUxGaWxlIHsKLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgVzNDX1hNTF9TQ0hFTUFfTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICAgIHB1YmxpYyAgYm9vbGVhbiBWYWxpZGF0ZShTdHJpbmcgYXJncykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSB0eXBlIG9mIHNjaGVtYSAgZ2V0IHZhbGlkYXRpb24gZHJpdmVyOgotICAgICAgICAgICAgU2NoZW1hRmFjdG9yeSBzY2hlbWFmYWN0b3J5ID0gU2NoZW1hRmFjdG9yeS5uZXdJbnN0YW5jZShXM0NfWE1MX1NDSEVNQV9OU19VUkkpOwotCi0gICAgICAgICAgICAvLyBjcmVhdGUgc2NoZW1hIGJ5IHJlYWRpbmcgaXQgZnJvbSBhbiBYU0QgZmlsZToKLSAgICAgICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IFdpemFyZFBhbmVsLmNsYXNzLmdldFJlc291cmNlKCIvcmVzb3VyY2VzL3NlcnZpY2UueHNkIik7Ci0gICAgICAgICAgICBTY2hlbWEgc2NoZW1hID0gc2NoZW1hZmFjdG9yeS5uZXdTY2hlbWEobmV3IFN0cmVhbVNvdXJjZShyZXNvdXJjZS5nZXRQYXRoKCkpKTsKLQotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoYXJncykpKTsKLQotICAgICAgICAgICAgc2NoZW1hLm5ld1ZhbGlkYXRvcigpLnZhbGlkYXRlKG5ldyBET01Tb3VyY2UoZG9jKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Y2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgLy8gICBleC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgLy8gIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1htbEZpbGVGaWx0ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vYmVhbi9YbWxGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2JjZDYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9iZWFuL1htbEZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW47Ci0KLWltcG9ydCBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgWG1sRmlsZUZpbHRlciBleHRlbmRzIEZpbGVGaWx0ZXIgewotICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmKGZpbGUuaXNEaXJlY3RvcnkoKSApewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlKTsKLSAgICAgICAgaWYoZXh0ZW5zaW9uICE9IG51bGwpewotICAgICAgICAgICAgcmV0dXJuICBleHRlbnNpb24gLmVxdWFscygieG1sIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLnhtbCI7Ci0gICAgfQotCi0gICBwcml2YXRlIFN0cmluZyBnZXRFeHRlbnNpb24oRmlsZSBmaWxlKXsKLSAgICAgICAgU3RyaW5nIGV4dCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIGludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgICAgIGlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIGV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBleHQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvQ2xhc3NGaWxlTG9jYXRpb25QYWdlLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9DbGFzc0ZpbGVMb2NhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiODg0MC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9DbGFzc0ZpbGVMb2NhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMud2l6YXJkZnJhbWUuQ29kZWdlbkZyYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuLkFyY2hpdmVCZWFuOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQ3JlYXRlZCBieSBJbnRlbGxpSiBJREVBLgotICogVXNlcjogc2hpdmFudGhhCi0gKiBEYXRlOiAxNi8wNy8yMDA3Ci0gKiBUaW1lOiAxMDo1NTozMQotICogVG8gY2hhbmdlIHRoaXMgdGVtcGxhdGUgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NGaWxlTG9jYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotICAgICAgICAvKioKLSAgICAgICAgICogdmFyaWFsYmFsZXMKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRDbGFzc0RpcjsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGJ1dFNlbGVjdDsKLSAgICAgICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hrQm94SW5jbHVkZUNsYXNzOwotICAgICAgICBwcml2YXRlIEpDaGVja0JveCBjaGtCb3hBcmNoaXZlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgICAgIHByaXZhdGUgSlRleHRBcmVhIHR4YUhpbnQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBmbGFnPWZhbHNlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBoaW50ID0iOiI7Ci0gICAgICAgIHByaXZhdGUgQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW47Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBKRmlsZUNob29zZXIgZmlsZUNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOwotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IKLSAgICAgICAgICogQHBhcmFtIHdpemFyZENvbXBvbmVudHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDbGFzc0ZpbGVMb2NhdGlvblBhZ2UoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLCBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbiApIHsKLSAgICAgICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VydmljZSBBcmNoaXZlciIpOwotICAgICAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiV2VsY29tZSB0byBBeGlzMiBTZXJ2aWNlIEFyY2hpdmUgV2l6YXJkLkluc2VydCB0aGUgY2xhc3MgZmlsZXMgYW5kIHNlbGVjdCB0aGUgc2VydmljZSB0eXBlLiAiKTsKLSAgICAgICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogaW5pdGlhdGUgcGFuZWwKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0KLSAgICAgICAgICAgIHR4YUhpbnQgPW5ldyBKVGV4dEFyZWEoKTsKLSAgICAgICAgICAgIHR4YUhpbnQuc2V0Qm9yZGVyKG51bGwpOwotICAgICAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICAgICAgdHhhSGludC5zZXRMaW5lV3JhcCh0cnVlKTsKLSAgICAgICAgICAgIHR4YUhpbnQuc2V0V3JhcFN0eWxlV29yZCh0cnVlKTsKLSAgICAgICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLSAgICAgICAgICAgIGJ0bkhpbnQgPW5ldyBKQnV0dG9uKCJIaW50ID4+Iik7Ci0gICAgICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotICAgICAgICAgICAgdHh0Q2xhc3NEaXIgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgICAgICBidXRTZWxlY3Q9bmV3IEpCdXR0b24oIkJyb3dzZS4uIik7Ci0gICAgICAgICAgICBjaGtCb3hJbmNsdWRlQ2xhc3MgPSBuZXcgSkNoZWNrQm94KCJpbmNsdWRlIC5jbGFzcyBmaWxlIG9ubHkiKSA7Ci0gICAgICAgICAgICBjaGtCb3hBcmNoaXZlVHlwZT1uZXcgSkNoZWNrQm94KCJTZWxlY3QgZm9yIFNlcnZpY2UgR3JvdXAgQXJjaGl2ZSIpOwotCi0gICAgICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQotICAgICAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkNsYXNzIGZpbGUgbG9jYXRpb24iKQotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgICAgICB0aGlzLmFkZCh0eHRDbGFzc0RpcgotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsIDEpLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgIHR4dENsYXNzRGlyLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHRoaXMuYWRkKGJ1dFNlbGVjdAotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgIGJ1dFNlbGVjdC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVDaG9vc2VyLnNldEZpbGVTZWxlY3Rpb25Nb2RlKEpGaWxlQ2hvb3Nlci5ESVJFQ1RPUklFU19PTkxZKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IGZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKGJ1dFNlbGVjdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ2hvb3Nlci5zZXRDdXJyZW50RGlyZWN0b3J5KGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHh0Q2xhc3NEaXIuc2V0VGV4dChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHh0Q2xhc3NEaXIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgdGhpcy5hZGQoY2hrQm94SW5jbHVkZUNsYXNzCi0gICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEpLCAwLCAwKSk7Ci0gICAgICAgICAgICBjaGtCb3hJbmNsdWRlQ2xhc3MuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotLy8gICAgICAgICAgICAgdGhpcy5hZGQoY2hrQm94QXJjaGl2ZVR5cGUKLS8vICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLCAwLjAKLS8vICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0vLyAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEpLCAwLCAwKSk7Ci0vLyAgICAgICAgICAgIGNoa0JveEFyY2hpdmVUeXBlIC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotLy8gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLS8vICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB0aGlzLmFkZChidG5IaW50LAotICAgICAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIDEsIDEsIDAuMCwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDEwKSwgMCwgMCkpOwotICAgICAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZsYWcpewotICAgICAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZz1mYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidG5IaW50LnNldFRleHQoIkhpbnQgPDwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dChoaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgdGhpcy5hZGQodHhhSGludAotICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4wLDEuMAotICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIC8vbmV4dAotICAgICAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX1NFQ09ORF9DICk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9iYWNrCi0gICAgICAgIHB1YmxpYyB2b2lkIGJhY2soKSB7Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfQ0hPT1NFUiApOwotICAgICAgICB9Ci0gICAgICAgIC8vdXBkYXRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgICAgIGZpbGxCZWFuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZpbGxCZWFuKCl7Ci0vLyAgICAgICAgICBpZighY2hrQm94QXJjaGl2ZVR5cGUuaXNTZWxlY3RlZCgpKXsKLS8vICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2luZ2xlU2VydmljZSh0cnVlKTsKLS8vICAgICAgICAgIH0gZWxzZQotLy8gICAgICAgICAgICAgIGFyY2hpdmVCZWFuLnNldFNpbmdsZVNlcnZpY2UoZmFsc2UpOwotICAgICAgICAgIGlmKCF0eHRDbGFzc0Rpci5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpewotICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRDbGFzc0xvYyhmaWxlKTsKLSAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uYWRkQ2xhc3NMb2NhdGlvbihmaWxlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgIGlmKGNoa0JveEluY2x1ZGVDbGFzcy5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0SW5jbHVkZUNsYXNzKHRydWUpOwotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRJbmNsdWRlQ2xhc3MoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9nZXQgcGFnZSB0eXBlCi0gICAgICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5TRVJWSUNFX0FSQ0hJVkVfVFlQRTsKLSAgICAgICAgfQotIH0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvTGlicmFyeUFkZGluZ1BhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL0xpYnJhcnlBZGRpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiM2FmN2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvTGlicmFyeUFkZGluZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuamF2YTJ3c2RsLkphckZpbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQXJjaGl2ZUJlYW47Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgTGlicmFyeUFkZGluZ1BhZ2UgZXh0ZW5kcyBXaXphcmRQYW5lbCB7Ci0KLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0SmFyTG9jYXRpb247Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ1dFNlbGVjdDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnV0QWRkOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidXRSZW1vdmU7Ci0gICAgcHJpdmF0ZSBKTGlzdCBsaXN0UGF0aERpc3BseTsKLSAgICBwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgbGlzdE1vZGVsOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5IaW50OwotICAgIHByaXZhdGUgSlRleHRBcmVhIHR4YUhpbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc9ZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaGludCA9IiI7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0KLQotICAgIHB1YmxpYyBMaWJyYXJ5QWRkaW5nUGFnZShXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsIEFyY2hpdmVCZWFuIGFyY2hpdmVCZWFuKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICAiQXhpczIgSWRlYSBQbHVnaW4gU2VydmljZSBBcmNoaXZlciBDcmVhdG9yIFdpemFyZHMiKTsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VydmljZSBBcmNoaXZlciIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJBZGQgYW55IGV4dGVybmFsIEphciIpOwotICAgICAgICB0aGlzLmFyY2hpdmVCZWFuPWFyY2hpdmVCZWFuOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotICAgICAgICB0eHRKYXJMb2NhdGlvbj1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICBidXRTZWxlY3QgPW5ldyBKQnV0dG9uKCJCcm93c2UuLiIpOwotICAgICAgICBidXRBZGQgPW5ldyBKQnV0dG9uKCJBZGQgLT4iKTsKLSAgICAgICAgYnV0UmVtb3ZlPW5ldyBKQnV0dG9uKCJSZW1vdmUgPC0iKTsKLSAgICAgICAgbGlzdE1vZGVsID1uZXcgRGVmYXVsdExpc3RNb2RlbCgpOwotICAgICAgICBsaXN0UGF0aERpc3BseSA9bmV3IEpMaXN0KGxpc3RNb2RlbCk7Ci0gICAgICAgIGxpc3RQYXRoRGlzcGx5LnNldEF1dG9zY3JvbGxzKHRydWUpOwotICAgICAgICBsaXN0UGF0aERpc3BseS5zZXRPcGFxdWUoZmFsc2UpOwotICAgICAgICBsaXN0UGF0aERpc3BseS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcigxKSApOwotICAgICAgICBsaXN0UGF0aERpc3BseS5zZXRGb2N1c2FibGUoZmFsc2UpOwotCi0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQobmV3IEpMYWJlbCgiSmFyIGZpbGUgbG9jYXRpb24iKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwxMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZCh0eHRKYXJMb2NhdGlvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCBHcmlkQmFnQ29uc3RyYWludHMuUkVMQVRJVkUgLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDAsIDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHR4dEphckxvY2F0aW9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChidXRTZWxlY3QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMCwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMSwxMCksIDAsIDApKTsKLQotICAgICAgICBidXRTZWxlY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnJvc3dzZUphckZpbGUoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnV0QWRkCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEpLCAwLCAwKSk7Ci0gICAgICAgIGJ1dEFkZC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBsaXN0TW9kZWwuYWRkRWxlbWVudCh0eHRKYXJMb2NhdGlvbi5nZXRUZXh0KCkgKTsKLSAgICAgICAgICAgICAgICB0eHRKYXJMb2NhdGlvbi5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnV0UmVtb3ZlCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxLCAxLDEpLCAyLCAwKSk7Ci0gICAgICAgIGJ1dFJlbW92ZSAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKU2Nyb2xsUGFuZShsaXN0UGF0aERpc3BseSkKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoYnRuSGludAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAwLjEsMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHR4YUhpbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICB9Ci0gICAgLy9uZXh0Ci0gICAgcHVibGljIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0ZPVVJUSF9DICk7Ci0KLSAgICB9Ci0gICAgLy9iYWNrCi0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX1NFQ09ORF9DICk7Ci0gICAgfQotICAgIC8vdXBkYXRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCkgewotICAgICAgICBmaWxsQmVhbigpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgIH0KLQotICAgIC8vZ2V0IHBhZ2UgdHlwZQotICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFICA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJyb3N3c2VKYXJGaWxlKCl7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IEphckZpbGVGaWx0ZXIoKSApOwotICAgICAgICBpbnQgcmV0dXJuVmFsPSBmaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidXRBZGQpOwotICAgICAgICBpZihyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyIC5BUFBST1ZFX09QVElPTiApewotICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICB0eHRKYXJMb2NhdGlvbi5zZXRUZXh0KGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmUoKSB7Ci0gICAgICAgIGludFtdIHNlbGVjdGlvbkluZGljZXMgPSBsaXN0UGF0aERpc3BseSAuZ2V0U2VsZWN0ZWRJbmRpY2VzKCkgOwotICAgICAgICBmb3IgKGludCBpPTA7aTxzZWxlY3Rpb25JbmRpY2VzLmxlbmd0aDtpKyspewotICAgICAgICAgICAgbGlzdE1vZGVsIC5yZW1vdmUoc2VsZWN0aW9uSW5kaWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGZpbGxCZWFuKCl7Ci0gICAgICAgIEFycmF5TGlzdCB0ZW1wTGlzdD1hcmNoaXZlQmVhbi5nZXRMaWJzKCk7Ci0gICAgICAgIHRlbXBMaXN0LmFkZEFsbChnZXRKYXJQYXRobGlzdCgpKTsKLSAgICAgICAgYXJjaGl2ZUJlYW4uYWRkTGlicyh0ZW1wTGlzdCk7Ci0gICAgICAgIFVSTCB1cmxsaXN0W10gPSBuZXcgVVJMW2xpc3RNb2RlbC5zaXplKCkgKyAxXTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgY2xzID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybGxpc3QgLCBMaWJyYXJ5QWRkaW5nUGFnZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgICAgYXJjaGl2ZUJlYW4uc2V0Q2xhc3NMb2FkZXIoY2xzKTsKLSAgICB9Ci0gICAgICAvL2dldCBjbGFzcyBwYXRoIGxpc3QKLSAgICBwdWJsaWMgQXJyYXlMaXN0IGdldEphclBhdGhsaXN0KCl7Ci0gICAgICAgIE9iamVjdCBbXSBsaXN0T2JqZWN0ID0gbGlzdE1vZGVsLnRvQXJyYXkoKSA7Ci0gICAgICAgIEFycmF5TGlzdCBsaXN0U3RyaW5nID1uZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvcihpbnQgaT0wIDtpPGxpc3RPYmplY3QubGVuZ3RoIDtpKyspewotICAgICAgICAgICAgbGlzdFN0cmluZy5hZGQobGlzdE9iamVjdFtpXS50b1N0cmluZygpKSA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpc3RTdHJpbmcgOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1BhcmFtZXRlckRpYWxvZy5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvUGFyYW1ldGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODRmZWYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvUGFyYW1ldGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uUGFyYW1ldGVyT2JqOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGFyYW1ldGVyRGlhbG9nIGRpYWxvZzsKLSAgICBwcml2YXRlIHN0YXRpYyBQYXJhbWV0ZXJPYmogcGFyYSA9bmV3IFBhcmFtZXRlck9iaigiIiwiIik7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dE5hbWU7Ci0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFZhbHVlOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQ29tcG9uZW50IGNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlKSB7Ci0gICAgICAgIEZyYW1lIGZyYW1lID0gSk9wdGlvblBhbmUuZ2V0RnJhbWVGb3JDb21wb25lbnQoY29tcCk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBQYXJhbWV0ZXJEaWFsb2coZnJhbWUsdGl0bGUpOwotICAgICAgICBkaWFsb2cuc2V0UmVzaXphYmxlKGZhbHNlKTsKLSAgICAgICAgZGlhbG9nLnNldFNpemUoMjUwLDE1MCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXJPYmogc2hvd0RpYWxvZyhTdHJpbmcgdGl0bGUpIHsKLSAgICAgICAgaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUodGl0bGUpOwotICAgICAgICAgICAgZGlhbG9nLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcmE7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFBhcmFtZXRlckRpYWxvZyhGcmFtZSBmcmFtZSwgIFN0cmluZyB0aXRsZSkgewotICAgICAgICBzdXBlcihmcmFtZSwgdGl0bGUsIHRydWUpOwotCi0gICAgICAgIC8vYnV0dG9ucwotICAgICAgICBmaW5hbCBKQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKCJDYW5jZWwiKTsKLSAgICAgICAgZmluYWwgSkJ1dHRvbiBzZXRCdXR0b24gPSBuZXcgSkJ1dHRvbigiIE9LICIpOwotICAgICAgICBjYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEaWFsb2cgLmRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHNldEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRpYWxvZy5wYXJhLnNldE5hbWUodHh0TmFtZS5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIFBhcmFtZXRlckRpYWxvZy5wYXJhLnNldFZhbHVlKHR4dFZhbHVlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgUGFyYW1ldGVyRGlhbG9nLmRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihzZXRCdXR0b24pOwotICAgICAgICBnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY2FuY2VsQnV0dG9uKTsKLSAgICAgICAgLy9tYWluIHBhcnQgb2YgdGhlIGRpYWxvZwotCi0gICAgICAgIHR4dE5hbWUgPW5ldyBKVGV4dEZpZWxkKCk7Ci0gICAgICAgIHR4dFZhbHVlID1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIEpQYW5lbCBsaXN0UGFuZSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgbGlzdFBhbmUuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQobGlzdFBhbmUsIEJveExheW91dC5QQUdFX0FYSVMpKTsKLSAgICAgICAgbGlzdFBhbmUuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwwKSkpOwotICAgICAgICBsaXN0UGFuZS5hZGQobmV3IEpMYWJlbCgiTmFtZToiKSk7Ci0gICAgICAgIGxpc3RQYW5lLmFkZCh0eHROYW1lKTsKLSAgICAgICAgbGlzdFBhbmUuYWRkKG5ldyBKTGFiZWwoIlZhbHVlOiIpKTsKLSAgICAgICAgbGlzdFBhbmUuYWRkKHR4dFZhbHVlICk7Ci0gICAgICAgIGxpc3RQYW5lLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsMTAsMTAsMTApKTsKLQotICAgICAgICAvL0xheSBvdXQgdGhlIGJ1dHRvbnMgZnJvbSBsZWZ0IHRvIHJpZ2h0LgotICAgICAgICBKUGFuZWwgYnV0dG9uUGFuZSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgYnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEJveExheW91dChidXR0b25QYW5lLCBCb3hMYXlvdXQuWF9BWElTKSk7Ci0gICAgICAgIGJ1dHRvblBhbmUuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMCwgMTAsIDEwLCAxMCkpOwotICAgICAgICBidXR0b25QYW5lLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7Ci0gICAgICAgIGJ1dHRvblBhbmUuYWRkKGNhbmNlbEJ1dHRvbik7Ci0gICAgICAgIGJ1dHRvblBhbmUuYWRkKEJveC5jcmVhdGVSaWdpZEFyZWEobmV3IERpbWVuc2lvbigxMCwgMCkpKTsKLSAgICAgICAgYnV0dG9uUGFuZS5hZGQoc2V0QnV0dG9uKTsKLQotICAgICAgICAvL1B1dCBldmVyeXRoaW5nIHRvZ2V0aGVyLCB1c2luZyB0aGUgY29udGVudCBwYW5lJ3MgQm9yZGVyTGF5b3V0LgotICAgICAgICBDb250YWluZXIgY29udGVudFBhbmUgPSBnZXRDb250ZW50UGFuZSgpOwotICAgICAgICBjb250ZW50UGFuZS5hZGQobGlzdFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOwotICAgICAgICBjb250ZW50UGFuZS5hZGQoYnV0dG9uUGFuZSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQotICAgICAgICBwYWNrKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkOGVmZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9TZXJ2aWNlQXJjaGl2ZU91dHB1dExvY2F0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmZyYW1lczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQXJjaGl2ZUJlYW47Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZUFyY2hpdmVPdXRwdXRMb2NhdGlvblBhZ2UgIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dExvY2F0aW9uOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRGaWxlTmFtZTsKLSAgICBwcml2YXRlIEpCdXR0b24gYnRuQnJvd2VzOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5IaW50OwotICAgIHByaXZhdGUgSlRleHRBcmVhIHR4YUhpbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZsYWc9ZmFsc2U7Ci0gICAgZmluYWwgSkZpbGVDaG9vc2VyIERpckNob29zZXI9bmV3IEpGaWxlQ2hvb3NlcigpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGhpbnQ9IiI7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VBcmNoaXZlT3V0cHV0TG9jYXRpb25QYWdlKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cywgQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW4pewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCAiQXhpczIgSWRlYSBQbHVnaW4gU2VydmljZSBBcmNoaXZlciBDcmVhdG9yIFdpemFyZHMiKTsKLSAgICAgICAgc2V0UGFuZWxUb3BUaXRsZSgiU2VydmljZSBBcmNoaXZlciIpOwotICAgICAgICBzZXRQYW5lbEJvdHRvbVRpdGxlKCJTZWxlY3QgdGhlIGxvY2F0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIEFyY2hpdmVyIik7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotCi0gICAgICAgIHR4dEZpbGVOYW1lID1uZXcgSlRleHRGaWVsZCgiU2VydmljZV9BcmNoaXZlciIpOwotCi0gICAgICAgIHR4dExvY2F0aW9uPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgYnRuQnJvd2VzPW5ldyBKQnV0dG9uKCJCcm93c2UuLiIpOwotCi0gICAgICAgIHNldEJhY2tCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJPdXRQdXQgRmlsZSBOYW1lIikKLSAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgICAgICAgIHRoaXMuYWRkKHR4dEZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIk91dFB1dCBMb2NhdGlvbiIpCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDEsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dExvY2F0aW9uCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDEsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChidG5Ccm93ZXMKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMSwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDEwKSwgMCwgMCkpOwotCi0gICAgICAgIGJ0bkJyb3dlcy5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBEaXJDaG9vc2VyIC5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIuRElSRUNUT1JJRVNfT05MWSk7Ci0gICAgICAgICAgICAgICAgaW50IHJldHVyblZhbCA9IERpckNob29zZXIuc2hvd09wZW5EaWFsb2coYnRuQnJvd2VzICk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKLSAgICAgICAgICAgICAgICAgICAgRGlyQ2hvb3Nlci5zZXRGaWxlU2VsZWN0aW9uTW9kZShKRmlsZUNob29zZXIgLkZJTEVTX09OTFkgKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdmaWxlID0gRGlyQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0TG9jYXRpb24uc2V0VGV4dChuZXdmaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQoYnRuSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIDEsIDEsIDAuMSwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHR4YUhpbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBpZighKChTZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UpZ2V0V2l6YXJkQ29tcG9uZW50cygpLmdldFdpemFyZFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9GT1VSVEhfQykpLmlzSW5jbHVkZVhtbCgpKXsKLSAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRk9VUlRIX0MgKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5leHQoKSB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKXsKLSAgICAgICAgaWYoIXR4dEZpbGVOYW1lLmdldFRleHQoKSAuZXF1YWxzKCIiKSl7Ci0gICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRBcmNoaXZlTmFtZSh0eHRGaWxlTmFtZS5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCF0eHRMb2NhdGlvbiAuZ2V0VGV4dCgpIC5lcXVhbHMoIiIpKXsKLSAgICAgICAgICAgaWYobmV3IEZpbGUodHh0TG9jYXRpb24uZ2V0VGV4dCgpKS5pc0RpcmVjdG9yeSgpKQotICAgICAgICAgICAgICAgIGFyY2hpdmVCZWFuLnNldE91dFBhdGgodHh0TG9jYXRpb24uZ2V0VGV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotCi0gICAgfQotICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFOwotICAgIH0KLX0KLSAKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxFZGl0UGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEVkaXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzkwZGIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEVkaXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5QYXJhbWV0ZXJPYmo7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uVmFsaWRhdGVYTUxGaWxlOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lk1vdXNlRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VYTUxFZGl0UGFnZSBleHRlbmRzIFdpemFyZFBhbmVsIHsKLSAgICBwcm90ZWN0ZWQgSlRleHRBcmVhIGRlc0FyZWE7Ci0gICAgcHJvdGVjdGVkIEpCdXR0b24gYWRkcGFyYTsKLSAgICBwcm90ZWN0ZWQgSkJ1dHRvbiBhZGRNb2R1bGVSZWY7Ci0gICAgcHJvdGVjdGVkIEpCdXR0b24gdmFsaWRhdGVYTUw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIHJlR2VuZXJhdGU7Ci0gICAgcHJvdGVjdGVkIEpTY3JvbGxQYW5lIHNwOwotICAgIHByaXZhdGUgSkxhYmVsIGxibGVycm9yOwotICAgICBwcml2YXRlIEFyY2hpdmVCZWFuIGFyY2hpdmVCZWFuOwotCi0gICAgIHB1YmxpYyBTZXJ2aWNlWE1MRWRpdFBhZ2UoV2l6YXJkQ29tcG9uZW50cyB3aXphcmRDb21wb25lbnRzLCBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbil7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJTZXJ2aWNlIEFyY2hpdmVyIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoIkVkaXQgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlLnhtbCIpOwotICAgICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgaW5pdCgpewotICAgICAgICBQYXJhbWV0ZXJEaWFsb2cuaW5pdGlhbGl6ZShhZGRwYXJhLCAiUGFyYW1ldGVyIERpYWxvZyIpOwotICAgICAgICBhZGRwYXJhID0gbmV3IEpCdXR0b24oIitQYXJhbWV0ZXIgIik7Ci0gICAgICAgIGFkZHBhcmEuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGFkZE1vZHVsZVJlZiA9IG5ldyBKQnV0dG9uKCIrTW9kdWxlUmVmICIpOwotICAgICAgICBhZGRNb2R1bGVSZWYuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHZhbGlkYXRlWE1MID1uZXcgSkJ1dHRvbigiVmFsaWRhdGUgWE1MIik7Ci0gICAgICAgIHJlR2VuZXJhdGU9bmV3IEpCdXR0b24oIlJlR2VuZXJhdGUgWE1MIik7Ci0gICAgICAgIGxibGVycm9yPW5ldyBKTGFiZWwoKTsKLSAgICAgICAgZGVzQXJlYSA9IG5ldyBKVGV4dEFyZWEoIiIpOwotICAgICAgICBzcCA9IG5ldyBKU2Nyb2xsUGFuZShkZXNBcmVhKTsKLSAgICAgICAgc3Auc2V0QXV0b3Njcm9sbHModHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotICAgICAgICBzZXREZWZhdWx0RW5hYmxlZCgpOwotCi0gICAgICAgICB0aGlzLmFkZChhZGRwYXJhCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICBhZGRwYXJhLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlck9iaiBzZWxlY3RlZE5hbWU9UGFyYW1ldGVyRGlhbG9nLnNob3dEaWFsb2coIlBhcmFtZXRlciBEaWFsb2ciKTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXIoc2VsZWN0ZWROYW1lKTsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChhZGRNb2R1bGVSZWYKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMCwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEsMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgYWRkTW9kdWxlUmVmLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gKFN0cmluZylKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRNb2R1bGVSZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIE5hbWUiLCJNb2R1bGUgRGlhbG9nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpPcHRpb25QYW5lLlBMQUlOX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIHNldE1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgIHRoaXMuYWRkKHZhbGlkYXRlWE1MCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDIsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIHZhbGlkYXRlWE1MLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmKG5ldyBWYWxpZGF0ZVhNTEZpbGUoKS5WYWxpZGF0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiIrZGVzQXJlYS5nZXRUZXh0KCkpKSAgewotICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9WYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYmxlcnJvci5zZXRUZXh0KCJTZXJ2aWNlIFhNTCBmaWxlIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlewotICAgICAgICAgICAgICAgICAgICBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYmxlcnJvci5zZXRUZXh0KCJFcnJvciEgU2VydmljZSBYTUwgZmlsZSB2YWxpZGF0aW9uIEVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAgdGhpcy5hZGQocmVHZW5lcmF0ZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygzLCAwLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMSwxMCksIDAsIDApKTsKLQotICAgICAgICByZUdlbmVyYXRlLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGRlc0FyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgZGVzQXJlYS5zZXRUZXh0KGFyY2hpdmVCZWFuLmdldFNlcnZpY2VYTUwoKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChzcAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDEuMCwgMS4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwxMCksIDAsIDApKTsKLSAgICAgICAgZGVzQXJlYS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBlKXsKLSAgICAgICAgICAgICAgICBhZGRwYXJhLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBlKXt9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVJlbGVhc2VkKE1vdXNlRXZlbnQgZSl7fQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZSl7fQotICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VFeGl0ZWQoTW91c2VFdmVudCBlKXt9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxlcnJvcgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLDIsR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMS4wLDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAyMCwgMTAsMTApLCAwLCAwKSk7Ci0KLSAgICB9Ci0KLSAgICAvL25leHQKLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBpZighYXJjaGl2ZUJlYW4uZ2V0U2VydmljZVhNTCgpLmVxdWFscygiIikgKXsKLSAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2VydmljZVhNTChkZXNBcmVhLmdldFRleHQoKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfTEFTVF9DICk7Ci0KLSAgICB9Ci0gICAgLy9iYWNrCi0gICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0xPQURfQyApOwotICAgIH0KLSAgICAvL3VwZGF0ZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQotICAgIH0KLQotICAgIC8vZ2V0IHBhZ2UgdHlwZQotICAgIHB1YmxpYyAgaW50IGdldFBhZ2VUeXBlKCkgewotICAgICAgICByZXR1cm4gIFdpemFyZFBhbmVsLlNFUlZJQ0VfQVJDSElWRV9UWVBFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwKXsKLSAgICAgICAgdGhpcy5kZXNBcmVhLnNldFRleHQoZGVzY3JpcCk7Ci0gICAgICAgIHVwZGF0ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkVG9WYWxpZGF0ZSgpewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgcmVHZW5lcmF0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkcGFyYS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRFbmFibGVkVG9Ob3RWYWxpZGF0ZSgpewotICAgICAgICByZUdlbmVyYXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLSAgICAgICAgYWRkcGFyYS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RW5hYmxlZCgpewotICAgICAgICBsYmxlcnJvci5zZXRUZXh0KCIiKTsKLSAgICAgICAgYWRkcGFyYS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgYWRkTW9kdWxlUmVmLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB2YWxpZGF0ZVhNTC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICByZUdlbmVyYXRlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRQYXJhbWV0ZXIoUGFyYW1ldGVyT2JqIG9iail7Ci0gICAgICAgaW50IHBvc2l0aW9uID0gZGVzQXJlYS5nZXRDYXJldFBvc2l0aW9uKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkZXNBcmVhLmdldExpbmVDb3VudCgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGRlc0FyZWEuZ2V0Q2FyZXRQb3NpdGlvbigpKTsKLSAgICAgICAgU3RyaW5nIHN0ciA9ICIgICAgICA8cGFyYW1ldGVyIG5hbWU9XCIiICsgb2JqLmdldE5hbWUoKSArICJcIiBsb2NrZWQ9XCJmYWxzZVwiPiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iai5nZXRWYWx1ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9wYXJhbWV0ZXI+XG4iOwotICAgICAgICBkZXNBcmVhLmluc2VydChzdHIsIHBvc2l0aW9uICsgMSk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSl7Ci0gICAgICAgIGludCBwb3NpdGlvbiA9IGRlc0FyZWEuZ2V0Q2FyZXRQb3NpdGlvbigpOwotICAgICAgICBTdHJpbmcgc3RyID0gIiAgICAgIDxtb2R1bGUgcmVmPVwiIiArIG1vZHVsZSArICJcIiAvPlxuIjsKLSAgICAgICAgZGVzQXJlYSAuaW5zZXJ0KHN0ciwgcG9zaXRpb24gKyAxKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZS5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNmE1MTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvU2VydmljZVhNTEZpbGVTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkQ29tcG9uZW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRQYW5lbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5YbWxGaWxlRmlsdGVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuRW1wdHlCb3JkZXI7Ci1pbXBvcnQgamF2YS5hd3QuKjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBzaGl2YW50aGEKLSAqIERhdGU6IDE3LzA3LzIwMDcKLSAqIFRpbWU6IDA5OjQ1OjAzCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlWE1MRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYW5lbCB7Ci0gICAgLyoqCi0gICAgICogdmFyaWFsYmFsZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIEpMYWJlbCBsYmxYbWxMb2NhdGlvbjsKLSAgICBwcml2YXRlIEpUZXh0RmllbGQgdHh0U2VydmljZVhtbDsKLSAgICBwcml2YXRlIEpCdXR0b24gYnV0U2VsZWN0OwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNoa0JveEluY2x1ZGVYbWw7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgdHhhSGludDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZz1mYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBoaW50ID0iIjsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VYTUxGaWxlU2VsZWN0aW9uUGFnZShXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW4gKSB7Ci0gICAgICAgIHN1cGVyKHdpemFyZENvbXBvbmVudHMsICJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJTZXJ2aWNlIEFyY2hpdmVyIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoIlNlbGVjdCB0aGUgc2VydmljZS54bWwgZmlsZSIpOwotICAgICAgICB0aGlzLmFyY2hpdmVCZWFuPWFyY2hpdmVCZWFuOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdGlhdGUgcGFuZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpewotCi0gICAgICAgIHR4YUhpbnQgPW5ldyBKVGV4dEFyZWEoKTsKLSAgICAgICAgdHhhSGludC5zZXRCb3JkZXIobnVsbCk7Ci0gICAgICAgIHR4YUhpbnQuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLSAgICAgICAgdHhhSGludC5zZXRMaW5lV3JhcCh0cnVlKTsKLSAgICAgICAgdHhhSGludC5zZXRXcmFwU3R5bGVXb3JkKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldE9wYXF1ZShmYWxzZSk7Ci0KLSAgICAgICAgYnRuSGludCA9bmV3IEpCdXR0b24oIkhpbnQgPj4iKTsKLSAgICAgICAgYnRuSGludC5zZXRCb3JkZXIobmV3IEVtcHR5Qm9yZGVyKG5ldyBJbnNldHMoMCwwLDAsMCkpKTsKLSAgICAgICAgbGJsWG1sTG9jYXRpb249bmV3IEpMYWJlbCgic2V0IHRoZSBTZXJ2aWNlIFhNTCBmaWxlIik7Ci0gICAgICAgIGxibFhtbExvY2F0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0eHRTZXJ2aWNlWG1sID1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0eHRTZXJ2aWNlWG1sLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBidXRTZWxlY3Q9bmV3IEpCdXR0b24oIkJyb3dzZS4uIik7Ci0gICAgICAgIGJ1dFNlbGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgY2hrQm94SW5jbHVkZVhtbCA9IG5ldyBKQ2hlY2tCb3goIkdlbmVyYXRlIHNlcnZpY2UgeG1sIGF1dG9tYXRpY2FsbHkiLCB0cnVlKSA7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgdGhpcy5zZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7Ci0KLQotICAgICAgICAgdGhpcy5hZGQoY2hrQm94SW5jbHVkZVhtbAotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsMSksIDAsIDApKTsKLSAgICAgICAgY2hrQm94SW5jbHVkZVhtbC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBzZXRDaGFuZ2VFbmFibGVkKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxYbWxMb2NhdGlvbgotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgIHRoaXMuYWRkKHR4dFNlcnZpY2VYbWwKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMSwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFICwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0eHRTZXJ2aWNlWG1sLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0aGlzLmFkZChidXRTZWxlY3QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMiwgMSwgMSwgMSwgMC4xLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAwLCAxLDEwKSwgMCwgMCkpOwotCi0gICAgICAgIGJ1dFNlbGVjdC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBicm93c2VYbWxGaWxlKCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdGhpcy5hZGQoYnRuSGludCwKLSAgICAgICAgICAgICAgICBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDAsIDIsIEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVIsIDEsIDAuMSwwLjAKLSAgICAgICAgICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLldFU1QgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLSAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpZihmbGFnKXsKLSAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgIHR4YUhpbnQuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9ZmFsc2U7Ci0gICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgIGJ0bkhpbnQuc2V0VGV4dCgiSGludCA8PCIpOwotICAgICAgICAgICAgICAgICAgICB0eGFIaW50LnNldFRleHQoaGludCk7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKHR4YUhpbnQKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMywgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkNFTlRFUiAsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAxMCwgMTApLCAwLCAwKSk7Ci0KLSAgICB9Ci0KLSAgICAvL25leHQKLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBpZighY2hrQm94SW5jbHVkZVhtbC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgc3dpdGNoUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX0xBU1RfQyk7Ci0gICAgICAgIH0gZWxzZXsKLSAgICAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9MT0FEX0MpOwotICAgICAgICB9Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLQotICAgIH0KLSAgICAvL2JhY2sKLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfVEhJUkRfQyApOwotICAgIH0KLSAgICAvL3VwZGF0ZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLSAgICAgICAgZmlsbEJlYW4oKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICAvL2dldCBwYWdlIHR5cGUKLSAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5TRVJWSUNFX0FSQ0hJVkVfVFlQRSAgOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm93c2VYbWxGaWxlKCl7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IFhtbEZpbGVGaWx0ZXIoKSApOwotICAgICAgICBmaWxlQ2hvb3Nlci5zZXRDdXJyZW50RGlyZWN0b3J5KGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkpOwotICAgICAgICBpbnQgcmV0dXJuVmFsPSBmaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidXRTZWxlY3QpOwotICAgICAgICBpZihyZXR1cm5WYWwgPT0gSkZpbGVDaG9vc2VyIC5BUFBST1ZFX09QVElPTiApewotICAgICAgICAgICAgRmlsZSB4bWxmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICB0eHRTZXJ2aWNlWG1sLnNldFRleHQoeG1sZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgICBpbnQgcmVhZDsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oeG1sZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR4dFNlcnZpY2VYbWwuc2V0VGV4dCgiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIHNldENoYW5nZUVuYWJsZWQoKXsKLSAgICAgICAgaWYoY2hrQm94SW5jbHVkZVhtbC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgbGJsWG1sTG9jYXRpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB0eHRTZXJ2aWNlWG1sIC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIGJ1dFNlbGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBsYmxYbWxMb2NhdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdHh0U2VydmljZVhtbC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYnV0U2VsZWN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGZpbGxCZWFuKCl7Ci0gICAgICAgIGlmKCFjaGtCb3hJbmNsdWRlWG1sLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZih2YWx1ZSE9bnVsbCkKLSAgICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRTZXJ2aWNlWE1MKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVhtbCgpewotICAgICAgICByZXR1cm4gdGhpcy5jaGtCb3hJbmNsdWRlWG1sLmlzU2VsZWN0ZWQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9TZXJ2aWNlWE1MR2VuZXJhdGlvblBhZ2UuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJlNmQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vZnJhbWVzL1NlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmZyYW1lczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZENvbXBvbmVudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy5jb21wb25lbnQuV2l6YXJkUGFuZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQXJjaGl2ZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uQ2xhc3NGaWxlRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5iZWFuLk9wZXJhdGlvbk9iajsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5TZXJ2aWNlT2JqOwotaW1wb3J0IG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXMudGFibGUuQXJjaGl2ZVRhYmxlTW9kZWw7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5FbXB0eUJvcmRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgU2VydmljZVhNTEdlbmVyYXRpb25QYWdlIGV4dGVuZHMgV2l6YXJkUGFuZWwgewotCi0gICAgcHJpdmF0ZSBKVGV4dEZpZWxkIHR4dFNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hrQm94U2VhcmNoTWV0aG9kOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Mb2FkOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Ccm93c2U7Ci0gICAgcHJpdmF0ZSBKVGFibGUgdGFibGU7Ci0gICAgcHJpdmF0ZSBKTGFiZWwgbGJsVGFibGU7Ci0gICAgcHJpdmF0ZSBKU2Nyb2xsUGFuZSBzY3JvbGxQYW5lOwotICAgIHByaXZhdGUgSGFzaE1hcCBvcGVyYXRpb25zOwotICAgIHByaXZhdGUgU3RyaW5nIGZpbGVOYW1lOwotICAgIHByaXZhdGUgaW50IGNvdW50ID0gMTsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBzZXJ2aWNlbHNpdDsKLSAgICBwcml2YXRlIFN0cmluZyBzZ1hNbDsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB3aXphcmRDb21wb25lbnRzCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VYTUxHZW5lcmF0aW9uUGFnZShXaXphcmRDb21wb25lbnRzIHdpemFyZENvbXBvbmVudHMsIEFyY2hpdmVCZWFuIGFyY2hpdmVCZWFuKXsKLSAgICAgICAgc3VwZXIod2l6YXJkQ29tcG9uZW50cywgIkF4aXMyIElkZWEgUGx1Z2luIFNlcnZpY2UgQXJjaGl2ZXIgQ3JlYXRvciBXaXphcmRzIik7Ci0gICAgICAgIHNldFBhbmVsVG9wVGl0bGUoIlNlcnZpY2UgQXJjaGl2ZXIiKTsKLSAgICAgICAgc2V0UGFuZWxCb3R0b21UaXRsZSgiU2VydmljZSBYTUwgR2VuZXJhdGlvbiIpOwotICAgICAgICB0aGlzLmFyY2hpdmVCZWFuPWFyY2hpdmVCZWFuOwotICAgICAgICBpbml0KCk7Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBpbml0KCl7Ci0gICAgICAgCi0gICAgICAgIHR4dFNlcnZpY2VOYW1lID1uZXcgSlRleHRGaWVsZCgpOwotICAgICAgICB0eHRDbGFzc05hbWUgPW5ldyBKVGV4dEZpZWxkKCk7Ci0KLSAgICAgICAgYnRuQnJvd3NlPW5ldyBKQnV0dG9uKCJCcm93c2UiKTsKLSAgICAgICAgYnRuTG9hZCA9bmV3IEpCdXR0b24oIkxvYWQiKTsKLQotICAgICAgICBjaGtCb3hTZWFyY2hNZXRob2Q9bmV3IEpDaGVja0JveCgiU2VhcmNoIGRlY2xhcmVkIG1ldGhvZCBvbmx5Iix0cnVlKTsKLQotICAgICAgICBsYmxUYWJsZT1uZXcgSkxhYmVsKCJNYXJrIG9wZXJhdGlvbiB5b3UgZG8gbm90IHdhbnQgdG8gcHVibGlzaCAiKTsKLSAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIEFyY2hpdmVUYWJsZU1vZGVsIG15TW9kZWw9bmV3IEFyY2hpdmVUYWJsZU1vZGVsKG9wZXJhdGlvbnMpOwotICAgICAgICB0YWJsZT1uZXcgSlRhYmxlKG15TW9kZWwpOwotICAgICAgICB0YWJsZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIHRhYmxlLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgdGFibGUuc2V0U2hvd0dyaWQodHJ1ZSk7Ci0gICAgICAgIHRhYmxlLnNldFNpemUoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQotICAgICAgICBzY3JvbGxQYW5lID1uZXcgSlNjcm9sbFBhbmUodGFibGUpOwotICAgICAgICBzY3JvbGxQYW5lLnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIoMCwwLDAsMCkpOwotICAgICAgICBzY3JvbGxQYW5lLnNldFNpemUodGFibGUuZ2V0U2l6ZSgpKTsKLSAgICAgICAgc2Nyb2xsUGFuZS5zZXRPcGFxdWUodHJ1ZSk7Ci0gICAgICAgIHNjcm9sbFBhbmUuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBzY3JvbGxQYW5lLmdldFZpZXdwb3J0KCkuc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICBzY3JvbGxQYW5lLnNldFZpZXdwb3J0Qm9yZGVyKG5ldyBFbXB0eUJvcmRlcigwLDAsMCwwKSk7Ci0KLSAgICAgICAgc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKGZhbHNlKTsKLSAgICAgICAgc2V0RmluaXNoQnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkQmFnTGF5b3V0KCkpOwotCi0gICAgICAgIHRoaXMuYWRkKG5ldyBKTGFiZWwoIkNsYXNzIE5hbWUiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDAsIDApLCAwLCAwKSk7Ci0KLSAgICAgICAgdGhpcy5hZGQodHh0Q2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDEsIDAsIDEsIDEsIDEuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEhXRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDAsIDAsIDApLCAwLCAwKSk7Ci0gICAgICAgIHRoaXMuYWRkKGJ0bkJyb3dzZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAwLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEsIDEsIDEpLCAwLCAwKSk7Ci0gICAgICAgIGJ0bkJyb3dzZSAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnJvd3NlQ2xhc3NGaWxlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChidG5Mb2FkCi0gICAgICAgICAgICAgICAgLCBuZXcgR3JpZEJhZ0NvbnN0cmFpbnRzKDMsIDAsIDEsIDEsIDAuMSwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9SVEggICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMSwgMSwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICAgYnRuTG9hZCAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVGFibGUoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgICB0aGlzLmFkZChuZXcgSkxhYmVsKCJTZXJ2aWNlIE5hbWUiKQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuTk9ORQotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICAgdGhpcy5hZGQodHh0U2VydmljZU5hbWUKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMSwgMSwgMSwgMSwgMS4wLCAwLjAKLSAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkhPUklaT05UQUwKLSAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICB0aGlzLmFkZChjaGtCb3hTZWFyY2hNZXRob2QKLSAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgMiwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTEFUSVZFLCAxLCAwLjAsIDAuMAotICAgICAgICAgICAgICAgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PUlRIV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgICBjaGtCb3hTZWFyY2hNZXRob2QgLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxUYWJsZQotICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCBHcmlkQmFnQ29uc3RyYWludHMuUkVMQVRJVkUsIDEsIDAuMCwgMC4wCi0gICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuV0VTVCAgLCBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTAotICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0KLSAgICAgICB0aGlzLmFkZChzY3JvbGxQYW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiAsIDEsIDEuMCwgMS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT1JUSFdFU1QsIEdyaWRCYWdDb25zdHJhaW50cy5CT1RICi0gICAgICAgICAgICAgICAgICAgICAgICAsIG5ldyBJbnNldHMoNSwgMTAsIDEwLCAxMCksIDAsIDApKTsKLQotICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBiYWNrKCkgewotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRk9VUlRIX0MgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBuZXh0KCkgewotICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7ICAgICAgICAKLSAgICAgICAgY2hlY2thdXRvR2VuZXJhdGlvbigpOwotICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgKChTZXJ2aWNlWE1MRWRpdFBhZ2UpZ2V0V2l6YXJkQ29tcG9uZW50cygpLmdldFdpemFyZFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9PUFRJT05fQyApKS5zZXREZXNjcmlwdGlvbihhcmNoaXZlQmVhbi5nZXRTZXJ2aWNlWE1MKCkpOwotICAgICAgICAoKFNlcnZpY2VYTUxFZGl0UGFnZSlnZXRXaXphcmRDb21wb25lbnRzKCkuZ2V0V2l6YXJkUGFuZWwoQ29kZWdlbkZyYW1lLlBBTkVMX09QVElPTl9DICkpLnNldERlZmF1bHRFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0KLSAgICB9Ci0gICAgcHVibGljICBpbnQgZ2V0UGFnZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAgV2l6YXJkUGFuZWwuU0VSVklDRV9BUkNISVZFX1RZUEU7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGFibGUoKSB7Ci0gICAgICAgIC8vZ2V0IGEgVVJMIGZyb20gdGhlIGNsYXNzIGZpbGUgbG9jYXRpb24KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc0ZpbGVMb2NhdGlvbiA9IGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgVVJMIGNsYXNzRmlsZVVSTCA9IG5ldyBGaWxlKGNsYXNzRmlsZUxvY2F0aW9uKS50b1VSTCgpOwotCi0gICAgICAgICAgIEFycmF5TGlzdCBsaXN0b2ZVUkxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICBsaXN0b2ZVUkxzLmFkZChjbGFzc0ZpbGVVUkwpOwotCi0gICAgICAgICAgICAvL2dldCB0aGUgbGlicmFyaWVzIGZyb20gdGhlIGxpYiBwYWdlIGFuZCBsb2FkIGl0Ci0gICAgICAgICAgICBBcnJheUxpc3QgbGliTGlzdD1hcmNoaXZlQmVhbi5nZXRMaWJzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBsaWJGaWxlTGlzdD1uZXcgU3RyaW5nW2xpYkxpc3Quc2l6ZSgpXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGliTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGxpYkZpbGVMaXN0W2ldID0gIChTdHJpbmcgKWxpYkxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGliRmlsZUxpc3QhPW51bGwpewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGxpYkZpbGVMaXN0Lmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7aTxjb3VudDtpKyspewotICAgICAgICAgICAgICAgICAgICBsaXN0b2ZVUkxzLmFkZChuZXcgRmlsZShsaWJGaWxlTGlzdFtpXSkudG9VUkwoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHh0U2VydmljZU5hbWUuc2V0VGV4dCgiTXlTZXJ2aWNlIiArIGNvdW50KTsKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcigoVVJMW10pbGlzdG9mVVJMcy50b0FycmF5KG5ldyBVUkxbbGlzdG9mVVJMcy5zaXplKCldKSk7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoZmlsZU5hbWUgLHRydWUsbG9hZGVyKTsKLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNoa0JveFNlYXJjaE1ldGhvZC5pc1NlbGVjdGVkKCkpewotICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBjbGF6ei5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBtZXRob2RDb3VudCA9IG1ldGhvZHMubGVuZ3RoOwotICAgICAgICAgICAgaWYgKG1ldGhvZENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhYmxlLnJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1ldGhvZENvdW50OyBpKyspewotICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gbWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uT2JqIG9wZXJhdGlvbm9iaiA9IG5ldyBPcGVyYXRpb25PYmoobWV0aG9kLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludGVnZXIobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoKSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLnB1dChtZXRob2QuZ2V0TmFtZSgpLCBvcGVyYXRpb25vYmopOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFyY2hpdmVUYWJsZU1vZGVsIG15TW9kZWw9bmV3IEFyY2hpdmVUYWJsZU1vZGVsKG9wZXJhdGlvbnMpOwotICAgICAgICAgICAgICAgIHRhYmxlLnNldE1vZGVsKG15TW9kZWwpOwotICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUucmVwYWludCgpOwotICAgICAgICAgICAgICAgIHRoaXMucmVwYWludCgpOwotICAgICAgICAgICAgICAgIHNldE5leHRCdXR0b25FbmFibGVkKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGJ0bkxvYWQsICJUaGUgc3BlY2lmaWVkIGZpbGUgaXMgbm90IGEgdmFsaWQgamF2YSBjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciEiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBzZXROZXh0QnV0dG9uRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgIEpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKGJ0bkxvYWQsICJUaGUgc3BlY2lmaWVkIGZpbGUgaXMgbm90IGEgdmFsaWQgamF2YSBjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciEiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBicm93c2VDbGFzc0ZpbGUoKXsKLSAgICAgICAgZmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgQ2xhc3NGaWxlRmlsdGVyKCkgKTsKLSAgICAgICAgZmlsZUNob29zZXIuc2V0Q3VycmVudERpcmVjdG9yeShhcmNoaXZlQmVhbi5nZXRDbGFzc0xvYygpKTsKLSAgICAgICAgaW50IHJldHVyblZhbCA9IGZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOwotICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgRmlsZSB0ZW1wZmlsZSA9IGZpbGVDaG9vc2VyIC5nZXRTZWxlY3RlZEZpbGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBuZXdGaWxlID0gdGVtcGZpbGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gbmV3RmlsZS5pbmRleE9mKGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGxhc3RpbmRleCA9IGFyY2hpdmVCZWFuLmdldENsYXNzTG9jKCkuZ2V0QWJzb2x1dGVQYXRoKCkudHJpbSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXdGaWxlLnN1YnN0cmluZyhsYXN0aW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICBjaGFyIGNoID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICAgICAgICAgIGNoYXIgbmV3Y2ggPSAnLic7Ci0gICAgICAgICAgICAgICAgaW50IGNpbmRleCA9IG5ld0ZpbGUuaW5kZXhPZihjaCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0ZpbGUgPSBuZXdGaWxlLnJlcGxhY2UoY2gsIG5ld2NoKTsKLSAgICAgICAgICAgICAgICAgICAgY2luZGV4ID0gbmV3RmlsZS5pbmRleE9mKGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBuZXdGaWxlOwotICAgICAgICAgICAgICAgIGludCBjbGFzc0luZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBjbGFzc0luZGV4KTsKLSAgICAgICAgICAgICAgICB0eHRDbGFzc05hbWUgLnNldFRleHQoZmlsZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgdm9pZCBzZXJ2aWNlR3JvdXBQcm9jZXNzKCl7Ci0KLSAgICAgICAgQXJyYXlMaXN0IG9wcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIG9waXRyID0gb3BlcmF0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG9waXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE9wZXJhdGlvbk9iaiBvcGVyYXRpb25PYmogPSAoT3BlcmF0aW9uT2JqKSBvcGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbk9iai5nZXRTZWxlY3QoKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICBvcHMuYWRkKG9wZXJhdGlvbk9iai5nZXRPcE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTZXJ2aWNlT2JqIHNlcnZpY2UgPSBuZXcgU2VydmljZU9iaih0eHRTZXJ2aWNlTmFtZS5nZXRUZXh0KCksIGZpbGVOYW1lLCBvcHMpOwotICAgICAgICAgICAgYXJjaGl2ZUJlYW4uYWRkVG9TZXJ2aWNlbHNpdChzZXJ2aWNlKTsKLSAgICAgICAgICAgIGlmICghYXJjaGl2ZUJlYW4uaXNTaW5nbGVTZXJ2aWNlKCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgdmFsdSA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKHRoaXMsICJEbyB5b3Ugd2FudCB0byBhZGQgYW4gYW5vdGhlciBzZXJ2aWNlIHRvIGdyb3VwIiwgIlNlcnZpY2UgQXJjaGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5ZRVNfTk9fT1BUSU9OKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIHR4dENsYXNzTmFtZS5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgdHh0U2VydmljZU5hbWUuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRklSU1RfQyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmVwYWludCgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2Vsc2l0ID1hcmNoaXZlQmVhbi5nZXRTZXJ2aWNlbHNpdCgpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZWxzaXQuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2dYTWwgPSAiPHNlcnZpY2VHcm91cD5cbiI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZWxzaXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VPYmogc2VydmljZU9iaiA9IChTZXJ2aWNlT2JqKSBzZXJ2aWNlbHNpdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZ1hNbCA9IHNnWE1sICsgc2VydmljZU9iai50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNnWE1sID0gc2dYTWwgKyAiPC9zZXJ2aWNlR3JvdXA+IjsKLSAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2VydmljZVhNTChzZ1hNbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNnWE1sPSIiOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlcnZpY2Vsc2l0ID0gYXJjaGl2ZUJlYW4uZ2V0U2VydmljZWxzaXQoKTsKLSAgICAgICAgICAgICAgICBzZ1hNbCA9ICI8c2VydmljZUdyb3VwPlxuIjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2Vsc2l0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VPYmogc2VydmljZU9iaiA9IChTZXJ2aWNlT2JqKSBzZXJ2aWNlbHNpdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNnWE1sID0gc2dYTWwgKyBzZXJ2aWNlT2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNnWE1sID0gc2dYTWwgKyAiPC9zZXJ2aWNlR3JvdXA+IjsKLSAgICAgICAgICAgICAgICBhcmNoaXZlQmVhbi5zZXRTZXJ2aWNlWE1MKHNnWE1sKTsKLSAgICAgICAgICAgICAgICBzZ1hNbD0iIjsKLSAgICAgICAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfT1BUSU9OX0MgKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2thdXRvR2VuZXJhdGlvbigpewotICAgICAgICBBcnJheUxpc3Qgb3BzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBJdGVyYXRvciBvcGl0ciA9IG9wZXJhdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG9waXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgT3BlcmF0aW9uT2JqIG9wZXJhdGlvbk9iaiA9IChPcGVyYXRpb25PYmopIG9waXRyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyYXRpb25PYmouZ2V0U2VsZWN0KCkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBvcHMuYWRkKG9wZXJhdGlvbk9iai5nZXRPcE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHh0U2VydmljZU5hbWUuc2V0VGV4dCh0eHRTZXJ2aWNlTmFtZS5nZXRUZXh0KCkpOwotICAgICAgICBTZXJ2aWNlT2JqIHNlcnZpY2UgPSBuZXcgU2VydmljZU9iaih0eHRTZXJ2aWNlTmFtZS5nZXRUZXh0KCksIGZpbGVOYW1lLCBvcHMpOwotICAgICAgICBhcmNoaXZlQmVhbi5hZGRUb1NlcnZpY2Vsc2l0KHNlcnZpY2UpOwotICAgICAgICBzZXJ2aWNlbHNpdCA9IGFyY2hpdmVCZWFuLmdldFNlcnZpY2Vsc2l0KCk7Ci0gICAgICAgIHNnWE1sPSI8c2VydmljZUdyb3VwPiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZWxzaXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZpY2VPYmogc2VydmljZU9iaiA9IChTZXJ2aWNlT2JqKSBzZXJ2aWNlbHNpdC5nZXQoaSk7Ci0gICAgICAgICAgICBzZ1hNbCA9IHNnWE1sICsgc2VydmljZU9iai50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIHNnWE1sID0gc2dYTWwgKyAiPC9zZXJ2aWNlR3JvdXA+IjsKLSAgICAgICAgYXJjaGl2ZUJlYW4uc2V0U2VydmljZVhNTChzZ1hNbCk7Ci0gICAgICAgIHNnWE1sPSIiOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvV1NETEZpbGVTZWxlY3Rpb25QYWdlLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzMDQ4ZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy9XU0RMRmlsZVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5mcmFtZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLmNvbXBvbmVudC5XaXphcmRDb21wb25lbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuY29tcG9uZW50LldpemFyZFBhbmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudG9vbHMuaWRlYS5XU0RMRmlsZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRvb2xzLndpemFyZGZyYW1lLkNvZGVnZW5GcmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uYmVhbi5BcmNoaXZlQmVhbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkVtcHR5Qm9yZGVyOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDcmVhdGVkIGJ5IEludGVsbGlKIElERUEuCi0gKiBVc2VyOiBzaGl2YW50aGEKLSAqIERhdGU6IDE2LzA3LzIwMDcKLSAqIFRpbWU6IDExOjIwOjAwCi0gKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSB1c2UgRmlsZSB8IFNldHRpbmdzIHwgRmlsZSBUZW1wbGF0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRmlsZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYW5lbCB7Ci0KLSAgICBwcml2YXRlIEpMYWJlbCBsYmxXU0RMOwotICAgIHByaXZhdGUgSkNoZWNrQm94IGNoa0JveFNraXA7Ci0gICAgcHJpdmF0ZSBKQ2hlY2tCb3ggY2hrQm94U2VsZWN0OwotICAgIHByaXZhdGUgSlRleHRGaWVsZCB0eHRXU0RMOwotICAgIHByaXZhdGUgSkJ1dHRvbiBidG5Ccm93c2U7Ci0gICAgcHJpdmF0ZSBKQnV0dG9uIGJ0bkhpbnQ7Ci0gICAgcHJpdmF0ZSBKVGV4dEFyZWEgdHhhSGludDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZmxhZz1mYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBoaW50ID0iIjsKLSAgICBwcml2YXRlIGZpbmFsIEpGaWxlQ2hvb3NlciBmaWxlQ2hvb3Nlcj1uZXcgSkZpbGVDaG9vc2VyKCk7Ci0gICAgcHJpdmF0ZSBBcmNoaXZlQmVhbiBhcmNoaXZlQmVhbjsgICAgIAotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIHdpemFyZENvbXBvbmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETEZpbGVTZWxlY3Rpb25QYWdlKFdpemFyZENvbXBvbmVudHMgd2l6YXJkQ29tcG9uZW50cywgQXJjaGl2ZUJlYW4gYXJjaGl2ZUJlYW4pewotICAgICAgICBzdXBlcih3aXphcmRDb21wb25lbnRzLCJBeGlzMiBJZGVhIFBsdWdpbiBTZXJ2aWNlIEFyY2hpdmVyIENyZWF0b3IgV2l6YXJkcyIpOwotICAgICAgICBzZXRQYW5lbFRvcFRpdGxlKCJTZXJ2aWNlIEFyY2hpdmVyIik7Ci0gICAgICAgIHNldFBhbmVsQm90dG9tVGl0bGUoIkFkZCB0aGUgV1NETCBmaWxlIik7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZUJlYW49YXJjaGl2ZUJlYW47Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKXsKLSAgICAgICAgdHhhSGludCA9bmV3IEpUZXh0QXJlYSgpOwotICAgICAgICB0eGFIaW50LnNldEJvcmRlcihudWxsKTsKLSAgICAgICAgdHhhSGludC5zZXRGb2N1c2FibGUoZmFsc2UpOwotICAgICAgICB0eGFIaW50LnNldExpbmVXcmFwKHRydWUpOwotICAgICAgICB0eGFIaW50LnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7Ci0gICAgICAgIHR4YUhpbnQuc2V0T3BhcXVlKGZhbHNlKTsKLQotICAgICAgICBidG5IaW50ID1uZXcgSkJ1dHRvbigiSGludCA+PiIpOwotICAgICAgICBidG5IaW50LnNldEJvcmRlcihuZXcgRW1wdHlCb3JkZXIobmV3IEluc2V0cygwLDAsMCwwKSkpOwotCi0gICAgICAgIGxibFdTREw9bmV3IEpMYWJlbCgiU2VsZWN0IGEgV1NETCBmaWxlIik7Ci0KLSAgICAgICAgY2hrQm94U2tpcCA9bmV3IEpDaGVja0JveCgiU2tpcCBXU0RMIix0cnVlKTsKLQotICAgICAgICBjaGtCb3hTZWxlY3QgPW5ldyBKQ2hlY2tCb3goIlNlbGVjdCBXU0RMIixmYWxzZSkgOwotCi0gICAgICAgIEJ1dHRvbkdyb3VwICBidXR0b25Hcm91cD0gbmV3ICBCdXR0b25Hcm91cCgpOwotICAgICAgICBidXR0b25Hcm91cC5hZGQoY2hrQm94U2tpcCApOwotICAgICAgICBidXR0b25Hcm91cC5hZGQoY2hrQm94U2VsZWN0ICk7Ci0KLSAgICAgICAgdHh0V1NETD1uZXcgSlRleHRGaWVsZCgpOwotCi0gICAgICAgIGJ0bkJyb3dzZT1uZXcgSkJ1dHRvbigiQnJvd3NlLi4iKTsKLQotICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIHNldEZpbmlzaEJ1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dChuZXcgR3JpZEJhZ0xheW91dCgpKTsKLQotICAgICAgICB0aGlzLmFkZChjaGtCb3hTa2lwCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAwLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLDEwKSwgMCwgMCkpOwotICAgICAgICBjaGtCb3hTa2lwIC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGhpcy5hZGQoY2hrQm94U2VsZWN0Ci0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAxLCBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSLCAxLCAwLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotICAgICAgICBjaGtCb3hTZWxlY3QuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB0aGlzLmFkZChsYmxXU0RMCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAyLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5OT05FCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwwKSwgMCwgMCkpOwotCi0gICAgICAgICB0aGlzLmFkZCh0eHRXU0RMCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygxLCAyLCAxLCAxLCAxLjAsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICAsIEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMCi0gICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMCksIDAsIDApKTsKLQotICAgICAgICAgdGhpcy5hZGQoYnRuQnJvd3NlCi0gICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygyLCAyLCAxLCAxLCAwLjEsIDAuMAotICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5DRU5URVIgICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgLCBuZXcgSW5zZXRzKDUsIDEwLCAwLCAxMCksIDAsIDApKTsKLQotICAgICAgICBidG5Ccm93c2UuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYnJvd3NlV1NETEZpbGUoKTsKLSAgICAgICAgICAgICAgICBjaGVja1dTRExGaWxlKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHRoaXMuYWRkKGJ0bkhpbnQKLSAgICAgICAgICAgICAgICAgICAgICwgbmV3IEdyaWRCYWdDb25zdHJhaW50cygwLCAzLCAxLCAxLCAwLjEsMC4wCi0gICAgICAgICAgICAgICAgICAgICAsIEdyaWRCYWdDb25zdHJhaW50cy5XRVNUICwgR3JpZEJhZ0NvbnN0cmFpbnRzLk5PTkUKLSAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMCwgMTApLCAwLCAwKSk7Ci0gICAgICAgICAgICAgYnRuSGludC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSAgewotICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgICAgICAgaWYoZmxhZyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50ID4+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHhhSGludC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnPWZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYnRuSGludC5zZXRUZXh0KCJIaW50IDw8Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdHhhSGludC5zZXRUZXh0KGhpbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWc9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgICB0aGlzLmFkZCh0eGFIaW50Ci0gICAgICAgICAgICAgICAgICAgICAsIG5ldyBHcmlkQmFnQ29uc3RyYWludHMoMCwgNCwgR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUiwgMSwgMC4xLDEuMAotICAgICAgICAgICAgICAgICAgICAgLCBHcmlkQmFnQ29uc3RyYWludHMuQ0VOVEVSICwgR3JpZEJhZ0NvbnN0cmFpbnRzLkJPVEgKLSAgICAgICAgICAgICAgICAgICAgICwgbmV3IEluc2V0cyg1LCAxMCwgMTAsIDEwKSwgMCwgMCkpOwotCi0KLSAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgYmFjaygpIHsKLSAgICAgICAgICBzd2l0Y2hQYW5lbChDb2RlZ2VuRnJhbWUuUEFORUxfRklSU1RfQyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbmV4dCgpIHsKLSAgICAgICAgIHN3aXRjaFBhbmVsKENvZGVnZW5GcmFtZS5QQU5FTF9USElSRF9DICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlKCl7Ci0gICAgICAgIHNldENoYW5nZUVuYWJsZWQoKTsKLSAgICAgICAgZmlsbEJlYW4oKTsKLSAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotICAgICAgICBzZXRCYWNrQnV0dG9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgc2V0TmV4dEJ1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgICBwdWJsaWMgIGludCBnZXRQYWdlVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuICBXaXphcmRQYW5lbC5TRVJWSUNFX0FSQ0hJVkVfVFlQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2hhbmdlRW5hYmxlZCgpewotICAgICAgICBpZihjaGtCb3hTa2lwLmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBsYmxXU0RMLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgdHh0V1NETCAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBidG5Ccm93c2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgbGJsV1NETC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgdHh0V1NETC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgYnRuQnJvd3NlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbEJlYW4oKXsKLSAgICAgICAgaWYoY2hrQm94U2VsZWN0LmlzU2VsZWN0ZWQoKSl7Ci0gICAgICAgICAgICBpZighdHh0V1NETC5nZXRUZXh0KCkuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIGFyY2hpdmVCZWFuLmFkZFdzZGxzKG5ldyBGaWxlKHR4dFdTREwuZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrV1NETEZpbGUoKXsKLSAgICAgICAgaWYgKHR4dFdTREwuZ2V0VGV4dCgpLmVxdWFscygiIikgKSB7Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgICAgICByZWFkZXIucmVhZFdTREwodHh0V1NETC5nZXRUZXh0KCkudHJpbSgpKSA7Ci0gICAgICAgICAgICB9Y2F0Y2goV1NETEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgIHR4dFdTREwuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coYnRuQnJvd3NlICwgIlRoZSBmaWxlIHNlbGVjdGVkIGlzIG5vdCBhIHZhbGlkIFdTRExmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJBeGlzMiBTZXJ2aWNlQXJjaGlldmUgY3JlYXRpb24iLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgYnJvd3NlV1NETEZpbGUoKXsKLSAgICAgICAgZmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgV1NETEZpbGVGaWx0ZXIoKSk7Ci0gICAgICAgIGZpbGVDaG9vc2VyLnNldEN1cnJlbnREaXJlY3RvcnkoYXJjaGl2ZUJlYW4uZ2V0Q2xhc3NMb2MoKSk7Ci0gICAgICAgIGludCByZXR1cm5WYWwgPSBmaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyhidG5Ccm93c2UpOwotICAgICAgICBpZiAocmV0dXJuVmFsID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7Ci0gICAgICAgICAgICB0eHRXU0RMLnNldFRleHQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy90YWJsZS9BcmNoaXZlVGFibGVNb2RlbC5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9mcmFtZXMvdGFibGUvQXJjaGl2ZVRhYmxlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlYTFmOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL2ZyYW1lcy90YWJsZS9BcmNoaXZlVGFibGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmlkZWFwbHVnaW4uZnJhbWVzLnRhYmxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5pZGVhcGx1Z2luLmJlYW4uT3BlcmF0aW9uT2JqOwotCi1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIEFyY2hpdmVUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKLQotICAgIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzID0geyJPcGVyYXRpb24gTmFtZSIsICJSZXR1cm4gVmFsdWUiLCAiUGFyYW1ldGVycyAiLCAiU2VsZWN0In07Ci0gICAgT2JqZWN0W11bXSBkYXR2YWx1ZTsKLSAgICBwcml2YXRlIEhhc2hNYXAgZGF0b2JqczsKLQotICAgIHB1YmxpYyBBcmNoaXZlVGFibGVNb2RlbChIYXNoTWFwIGRhdGFvYmplY3QpIHsKLSAgICAgICAgaW50IHNpemUgPSBkYXRhb2JqZWN0LnNpemUoKTsKLSAgICAgICAgZGF0dmFsdWUgPSBuZXcgT2JqZWN0W3NpemVdWzRdOwotICAgICAgICBJdGVyYXRvciBpdHIgPSBkYXRhb2JqZWN0LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBPcGVyYXRpb25PYmogb3BlcmF0aW9uT2JqID0gKE9wZXJhdGlvbk9iaikgaXRyLm5leHQoKTsKLSAgICAgICAgICAgIGRhdHZhbHVlW2NvdW50XVswXSA9IG9wZXJhdGlvbk9iai5nZXRPcE5hbWUoKTsKLSAgICAgICAgICAgIGRhdHZhbHVlW2NvdW50XVsxXSA9IG9wZXJhdGlvbk9iai5nZXRSZXR1cm5WYWx1ZSgpOwotICAgICAgICAgICAgZGF0dmFsdWVbY291bnRdWzJdID0gb3BlcmF0aW9uT2JqLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGRhdHZhbHVlW2NvdW50XVszXSA9IG9wZXJhdGlvbk9iai5nZXRTZWxlY3QoKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5kYXRvYmpzID0gZGF0YW9iamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotICAgICAgICByZXR1cm4gY29sdW1uTmFtZXMubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7Ci0gICAgICAgIHJldHVybiBkYXR2YWx1ZS5sZW5ndGg7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2wpIHsKLSAgICAgICAgcmV0dXJuIGNvbHVtbk5hbWVzW2NvbF07Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgcmV0dXJuIGRhdHZhbHVlW3Jvd11bY29sXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0Q29sdW1uQ2xhc3MoaW50IGMpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXQoMCwgYykuZ2V0Q2xhc3MoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgIHJldHVybiBjb2wgPj0gMzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUF0KE9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgewotICAgICAgICBPcGVyYXRpb25PYmogb2JqID0gKE9wZXJhdGlvbk9iaikgZGF0b2Jqcy5nZXQoZ2V0VmFsdWVBdChyb3csIDApKTsKLSAgICAgICAgaWYgKGNvbCA9PSAzKSB7Ci0gICAgICAgICAgICBvYmouc2V0U2VsZWN0KChCb29sZWFuKSB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0dmFsdWVbMF1bY29sXSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGF0dmFsdWVbcm93XVtjb2xdID0gbmV3IEludGVnZXIoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXR2YWx1ZVtyb3ddW2NvbF0gPSB2YWx1ZTsKLSAgICAgICAgfQotLy8gICAgICAgIG9iai5wcmludE1lKCk7Ci0gICAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvaWRlYXBsdWdpbi9wbHVnaW4vQXhpczJJZGVhUGx1Z2luLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL3BsdWdpbi9BeGlzMklkZWFQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwZDEyYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL3BsdWdpbi9BeGlzMklkZWFQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5wbHVnaW47Ci0KLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5jb21wb25lbnRzLkFwcGxpY2F0aW9uQ29tcG9uZW50OwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm9wdGlvbnMuQ29uZmlndXJhYmxlOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLm9wdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50b29scy53aXphcmRmcmFtZS5Db2RlZ2VuRnJhbWU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXhpczJJZGVhUGx1Z2luIGltcGxlbWVudHMgQXBwbGljYXRpb25Db21wb25lbnQsIENvbmZpZ3VyYWJsZSB7Ci0gICAgcHJpdmF0ZSBDb2RlZ2VuRnJhbWUgZm9ybTsKLSAgICBwcml2YXRlIEltYWdlSWNvbiBteUljb247Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXMgY2FsbGVkIGFmdGVyIHBsdWdpbiBpcyBhbHJlYWR5IGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQuIFBsdWdpbiBjYW4gc3RhcnQgdG8gY29tbXVuaWNhdGUgd2l0aAotICAgICAqIG90aGVyIHBsdWdpbnMgb25seSBpbiB0aGlzIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0Q29tcG9uZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MSW5wdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0ZpeGluZyBjbGFzcyBsb2FkaW5nIGlzc3VlCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAvLy8vRml4aW5nIGNsYXNzIGxvYWRpbmcgaXNzdWUKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3JtID09IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm0gPSBuZXcgQ29kZWdlbkZyYW1lKCk7Ci0gICAgICAgICAgICBmb3JtLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGZvcm0uc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobXlJY29uID09IG51bGwpIHsKLSAgICAgICAgICAgIGphdmEubmV0LlVSTCByZXNvdXJjZSA9IEF4aXMySWRlYVBsdWdpbi5jbGFzcy5nZXRSZXNvdXJjZSgiL2ljb25zL2ljb24ucG5nIik7Ci0gICAgICAgICAgICBteUljb24gPSBuZXcgSW1hZ2VJY29uKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBwbHVnaW4gZGlzcG9zYWwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZUNvbXBvbmVudCgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGNvbXBvbmVudAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIGNvbXBvbmVudCBuYW1lLiBVc2UgUGx1Z2luTmFtZS5Db21wb25lbnROYW1lIG5vdGF0aW9uCi0gICAgICogICAgICAgICB0byBhdm9pZCBjb25mbGljdHMuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICByZXR1cm4gIkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbiI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJBeGlzMiBQbHVnLWlucyI7Ci0gICAgfQotCi0gICAgcHVibGljIEljb24gZ2V0SWNvbigpIHsKLSAgICAgICAgcmV0dXJuIG15SWNvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEhlbHBUb3BpYygpIHsKLSAgICAgICAgcmV0dXJuICJObyBoZWxwIGF2YWlsYWJsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIEpDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KCkgewotICAgICAgICBpZiAoZm9ybSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmb3JtID0gbmV3IENvZGVnZW5GcmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3JtLmdldFJvb3RDb21wb25lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwbHkoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgLy9UbyBjaGFuZ2UgYm9keSBvZiBpbXBsZW1lbnRlZCBtZXRob2RzIHVzZSBGaWxlIHwgU2V0dGluZ3MgfCBGaWxlIFRlbXBsYXRlcy4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlVUlSZXNvdXJjZXMoKSB7Ci0gICAgICAgIGZvcm0gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNob3dUb29sKFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBmb3JtLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgIGZvcm0uc2hvd1VJKCk7Ci0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vcGx1Z2luL0F4aXMyUGx1Z2luQWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9pZGVhcGx1Z2luL3BsdWdpbi9BeGlzMlBsdWdpbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjY5Y2ZiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lkZWFwbHVnaW4vcGx1Z2luL0F4aXMyUGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuaWRlYXBsdWdpbi5wbHVnaW47Ci0KLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQWN0aW9uUGxhY2VzOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFjdGlvblN5c3RlbS5BbkFjdGlvbjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uQW5BY3Rpb25FdmVudDsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uRGF0YUNvbnN0YW50czsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5hY3Rpb25TeXN0ZW0uUHJlc2VudGF0aW9uOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IGNvbS5pbnRlbGxpai5vcGVuYXBpLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBjb20uaW50ZWxsaWoub3BlbmFwaS5wcm9qZWN0LlByb2plY3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi1wdWJsaWMgY2xhc3MgQXhpczJQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBbkFjdGlvbiB7Ci0KLSAgICBwcml2YXRlIEltYWdlSWNvbiBteUljb247Ci0KLSAgICBwdWJsaWMgQXhpczJQbHVnaW5BY3Rpb24oKSB7Ci0gICAgICAgIHN1cGVyKCJHQyIsICJBeGlzMiBwbHVnaW5zIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFuQWN0aW9uRXZlbnQgYW5BY3Rpb25FdmVudCkgewotICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBwbGljYXRpb25NYW5hZ2VyLmdldEFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFByb2plY3QgcHJvamVjdCA9IChQcm9qZWN0KSBhbkFjdGlvbkV2ZW50LmdldERhdGFDb250ZXh0KCkuZ2V0RGF0YShEYXRhQ29uc3RhbnRzLlBST0pFQ1QpOwotCi0gICAgICAgIEF4aXMySWRlYVBsdWdpbiBheGlzMmNvbXBvbmVudCA9Ci0gICAgICAgICAgICAgICAgKEF4aXMySWRlYVBsdWdpbikgYXBwbGljYXRpb24uZ2V0Q29tcG9uZW50KEF4aXMySWRlYVBsdWdpbi5jbGFzcyk7Ci0gICAgICAgIGF4aXMyY29tcG9uZW50LnNob3dUb29sKHByb2plY3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShBbkFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN1cGVyLnVwZGF0ZShldmVudCk7Ci0gICAgICAgIFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24gPSBldmVudC5nZXRQcmVzZW50YXRpb24oKTsKLSAgICAgICAgaWYgKEFjdGlvblBsYWNlcy5NQUlOX1RPT0xCQVIuZXF1YWxzKGV2ZW50LmdldFBsYWNlKCkpKSB7Ci0gICAgICAgICAgICBpZiAobXlJY29uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkwgcmVzb3VyY2UgPSBBeGlzMlBsdWdpbkFjdGlvbi5jbGFzcy5nZXRSZXNvdXJjZSgiL2ljb25zL2ljb24ucG5nIik7Ci0gICAgICAgICAgICAgICAgbXlJY29uID0gbmV3IEltYWdlSWNvbihyZXNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmVzZW50YXRpb24uc2V0SWNvbihteUljb24pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGM5MmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y29tcG9uZW50LXNldD4KLSAgPGNvbXBvbmVudHM+Ci0gICAgPGNvbXBvbmVudD4KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5BcnRpZmFjdEhhbmRsZXI8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PmFhcjwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5EZWZhdWx0QXJ0aWZhY3RIYW5kbGVyPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgIDxleHRlbnNpb24+YWFyPC9leHRlbnNpb24+Ci0gICAgICAgIDx0eXBlPmFhcjwvdHlwZT4KLSAgICAgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgotICAgICAgICA8YWRkZWRUb0NsYXNzcGF0aD5mYWxzZTwvYWRkZWRUb0NsYXNzcGF0aD4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5saWZlY3ljbGUubWFwcGluZy5MaWZlY3ljbGVNYXBwaW5nPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5hYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkRlZmF1bHRMaWZlY3ljbGVNYXBwaW5nPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8cGhhc2VzPgotICAgICAgICAgIDxwcm9jZXNzLXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjpyZXNvdXJjZXM8L3Byb2Nlc3MtcmVzb3VyY2VzPgotICAgICAgICAgIDxjb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46Y29tcGlsZTwvY29tcGlsZT4KLSAgICAgICAgICA8cHJvY2Vzcy10ZXN0LXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjp0ZXN0UmVzb3VyY2VzPC9wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPgotICAgICAgICAgIDx0ZXN0LWNvbXBpbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWNvbXBpbGVyLXBsdWdpbjp0ZXN0Q29tcGlsZTwvdGVzdC1jb21waWxlPgotICAgICAgICAgIDx0ZXN0Pm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1zdXJlZmlyZS1wbHVnaW46dGVzdDwvdGVzdD4KLSAgICAgICAgICA8cGFja2FnZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWFhci1tYXZlbi1wbHVnaW46YWFyPC9wYWNrYWdlPgotICAgICAgICAgIDxpbnN0YWxsPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1pbnN0YWxsLXBsdWdpbjppbnN0YWxsPC9pbnN0YWxsPgotICAgICAgICAgIDxkZXBsb3k+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWRlcGxveS1wbHVnaW46ZGVwbG95PC9kZXBsb3k+Ci0gICAgICAgIDwvcGhhc2VzPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICA8L2NvbXBvbmVudHM+Ci08L2NvbXBvbmVudC1zZXQ+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbHVnaW4ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMWVjOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IURPQ1RZUEUgaWRlYS1wbHVnaW4gUFVCTElDICJQbHVnaW4vRFREIiAiaHR0cDovL3BsdWdpbnMuaW50ZWxsaWoubmV0L3BsdWdpbi5kdGQiPgotPCEtLTxpZGVhLXBsdWdpbj4tLT4KLTxpZGVhLXBsdWdpbiB1cmw9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+ZGVlcGFsIj4KLQotICAgIDwhLS0gUGx1Z2luIG5hbWUgLS0+Ci0gICAgPG5hbWU+QXhpczIgSURFQSB0b29sczwvbmFtZT4KLQotICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+Ci0gICAgPGRlc2NyaXB0aW9uPiBTZXJ2aWNlIEFyY2hpdmUgY3JlYXRpb24gYW5kIENvZGUgR2VuZXJhdGlvbiA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPCEtLSBQbHVnaW4gdmVyc2lvbiAtLT4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0KLSAgICA8IS0tIFBsdWdpbidzIHZlbmRvciAtLT4KLSAgICA8IS0tICA8dmVuZG9yIGxvZ289Ii9nZW5lcmFsL2lqTG9nby5wbmciPkludGVsbGlKPC92ZW5kb3I+LS0+Ci0gICAgPHZlbmRvciBlbWFpbD0iZGVlcGFsQGFwYWNoZS5vcmciPkRlZXBhbCBKYXlhc2luZ2hlIDwvdmVuZG9yPgotCi0gICAgPCEtLSB0aGUgSURFQSBidWlsZCBudW1iZXIgd2hpY2ggd29ya3Mgd2l0aCBwbHVnaW4gLS0+Ci0gICAgPGlkZWEtdmVyc2lvbiBzaW5jZS1idWlsZD0iMjAwMCIgLz4KLQotICAgIDwhLS0gUGx1Z2luJ3MgYXBwbGljYXRpb24gY29tcG9uZW50cyAtLT4KLSAgICA8YXBwbGljYXRpb24tY29tcG9uZW50cz4KLSAgICAgICAgPGNvbXBvbmVudD4KLSAgICAgICAgICAgIDwhLS0gQ29tcG9uZW50J3MgaW1wbGVtZW50YXRpb24gY2xhc3MgLS0+Ci0gICAgICAgICAgICA8aW1wbGVtZW50YXRpb24tY2xhc3M+b3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMklkZWFQbHVnaW48L2ltcGxlbWVudGF0aW9uLWNsYXNzPgotCi0gICAgICAgICAgICA8IS0tIENvbXBvbmVudCdzIGludGVyZmFjZSBjbGFzcyAtLT4KLSAgICAgICAgICAgIDxpbnRlcmZhY2UtY2xhc3M+b3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMklkZWFQbHVnaW48L2ludGVyZmFjZS1jbGFzcz4KLSAgICAgICAgPC9jb21wb25lbnQ+Ci0gICAgPC9hcHBsaWNhdGlvbi1jb21wb25lbnRzPgotICAgIDwhLS0gQ29tcG9uZW50J3MgYWN0aW9ucyAtLT4KLSAgICA8YWN0aW9ucz4KLSAgICAgICAgPCEtLSBXZSB1c2UgIlBsdWdpbk5hbWUuQ29tcG9uZW50TmFtZS5BY3Rpb25OYW1lIiBub3RhdGlvbiBmb3IgImlkIiB0byBhdm9pZCBjb25mbGljdHMgLS0+Ci0gICAgICAgIDxhY3Rpb24gaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5pZGVhcGx1Z2luLnBsdWdpbi5BeGlzMlBsdWdpbkFjdGlvbiIKLSAgICAgICAgICAgIHRleHQ9IkF4aXMyIHBsdWdpbnMiIGRlc2NyaXB0aW9uPSJTZXJ2aWNlIGNyZWF0aW9uIGFuZCBjb2RlIGdlbmVyYXRpb24iPgotICAgICAgICAgICAgPGtleWJvYXJkLXNob3J0Y3V0IGZpcnN0LWtleXN0cm9rZT0iYWx0IFciIHNlY29uZC1rZXlzdHJva2U9IkMiIGtleW1hcD0iJGRlZmF1bHQiLz4KLSAgICAgICAgICAgIDxtb3VzZS1zaG9ydGN1dCBrZXlzdHJva2U9ImN0cmwgYWx0IGJ1dHRvbjIiIGtleW1hcD0iJGRlZmF1bHQiLz4KLSAgICAgICAgPC9hY3Rpb24+Ci0KLSAgICAgICAgPCEtLSAgICA8Z3JvdXAgaWQ9IkFjdGlvbnMuQWN0aW9uc1BsdWdpbi5TYW1wbGVHcm91cCIgdGV4dD0iU19hbXBsZSIgZGVzY3JpcHRpb249IlNhbXBsZSBncm91cCI+LS0+Ci0gICAgICAgIDxncm91cCBpZD0iQWN0aW9ucy5BY3Rpb25zUGx1Z2luLlNhbXBsZUdyb3VwIiB0ZXh0PSJBeGlzMiIgZGVzY3JpcHRpb249IkF4aXMyIEdyb3VwIj4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiLz4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IvPgotICAgICAgICAgICAgPGFkZC10by1ncm91cCBncm91cC1pZD0iTWFpbk1lbnUiIGFuY2hvcj0ibGFzdCIvPgotICAgICAgICAgICAgPGFkZC10by1ncm91cCBncm91cC1pZD0iTWFpblRvb2xCYXIiIGFuY2hvcj0iYmVmb3JlIiByZWxhdGl2ZS10by1hY3Rpb249IkhlbHBUb3BpY3MiLz4KLSAgICAgICAgPC9ncm91cD4KLQotICAgICAgICA8IS0tdGhlIGdyb3VwIGJlbG93IGNvbnRhaW5zIG9ubHkgdGhlICJIZWxsbyBXb3JsZCIgYWN0aW9uIGRlZmluZWQgYWJvdmUgLS0+Ci0gICAgICAgIDxncm91cD4KLSAgICAgICAgICAgIDxyZWZlcmVuY2UgaWQ9IkFjdGlvbnNTYW1wbGUuQWN0aW9uc1BsdWdpbi5TZXJ2aWNlQXJjaGl2ZUNyZWF0b3IiLz4KLSAgICAgICAgICAgIDwhLS10aGUgZ3JvdXAgaXMgYWRkZWQgdG8gdGhlIGVkaXRvciBwb3B1cCBtZW51LS0+Ci0gICAgICAgICAgICA8YWRkLXRvLWdyb3VwIGdyb3VwLWlkPSJFZGl0b3JQb3B1cE1lbnUiIGFuY2hvcj0iYWZ0ZXIiIHJlbGF0aXZlLXRvLWFjdGlvbj0iQ3V0Q29weVBhc3RlR3JvdXAiLz4KLSAgICAgICAgPC9ncm91cD4KLQotICAgIDwvYWN0aW9ucz4KLQotPC9pZGVhLXBsdWdpbj4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhN2E0Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBBYXIgUGx1Z2luOiBjb25maWd1cmF0aW9uIGV4YW1wbGVzCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uIAotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1JbnRyb2R1Y3Rpb24KLQotICBUaGUgQWFyIHBsdWdpbiBhbGxvd3MgdGhlIHBhY2thZ2luZyBvZiBhbiBBeGlzIDIgc2VydmljZSBhYXIgaW4gMyBkaWZmZXJlbnQgbW9kZXM6Ci0KLSAgICogYWFyIChkZWZhdWx0KTogZ2VuZXJhdGVzIHRoZSBhYXIgYXJ0aWZhY3QKLQotICAgKiBpbnBsYWNlOiBwYWNrYWdlIHRoZSBhYXIgaW4gdGhlIHNvdXJjZSB0cmVlCi0KLSAgICogZXhwbG9kZWQgOiBwYWNrYWdlIGFuIGV4cGxvZGVkIGFhciBhcHBsaWNhdGlvbgotCi0gIEVhY2ggbW9kZSBpcyBtYXRlcmlhbGl6ZWQgYnkgYSBnb2FsLiBGb3IgaW5zdGFuY2UsIHRvIGdlbmVyYXRlIGFuIGV4cGxvZGVkCi0gIHNhciBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QsIG9uZSB3b3VsZCB0eXBlCi0KLSstLS0tLS0tLQotICBtdm4gYWFyOmV4cGxvZGVkCi0rLS0tLS0tLS0tCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1pZGVhLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1N2RiNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIC0tLS0tLQotIE1hdmVuIDIgQWFyIFBsdWdpbgotIC0tLS0tLQotIEpvY2hlbiBXaWVkbWFubgotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1JbnRyb2R1Y3Rpb24KLQotICBUaGlzIHBsdWdpbiBnZW5lcmF0ZXMgYW4gQXhpcyAyIHNlcnZpY2UgZmlsZSAoQUFSIGZpbGUpLgotCi0gIFRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGdvYWxzIGlzIGF2YWlsYWJsZSB7e3tob3d0by5odG1sfWhlcmV9fS4KLQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWlkZWEtcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQ3ZjFmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iTWF2ZW4gQXhpcyAyIEFBUiBQbHVnaW4iPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5NYXZlbiBBeGlzIDIgQUFSIFBsdWdpbjwvbmFtZT4KLSAgICA8c3JjPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2ltYWdlcy9hcGFjaGUtbWF2ZW4tcHJvamVjdC5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL21hdmVuLXNtYWxsLmdpZjwvc3JjPgotICA8L2Jhbm5lclJpZ2h0PgotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJNYXZlbiAyIiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkhvdyB0byBVc2UiIGhyZWY9Imhvd3RvLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gICAgJHtyZXBvcnRzfQotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRhZDhhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIEphdmEyV1NETCBNYXZlbiBQbHVnaW48L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIE1hdmVuIDIgcGx1Z2luIGZvciBjcmVhdGluZyBXU0RMIGZpbGVzIGZyb20gSmF2YSBzb3VyY2UuCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8c291cmNlRGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNsZWFuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdC90ZXN0MS90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlc2V0cz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamF2YTJ3c2RsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXRlc3RpbmctaGFybmVzczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL0phdmEyV1NETE1vam8uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2phdmEyd3NkbC9KYXZhMldTRExNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjYzMmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL0phdmEyV1NETE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uamF2YTJ3c2RsLkphdmEyV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5qYXZhMndzZGwuSmF2YTJXU0RMQ29kZWdlbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC51dGlscy5KYXZhMldTRExDb21tYW5kTGluZU9wdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLQotLyoqCi0gKiBUYWtlcyBhIEphdmEgY2xhc3MgYXMgaW5wdXQgYW5kIGNvbnZlcnRzIGl0IGludG8gYW4gZXF1aXZhbGVudAotICogV1NETCBmaWxlLgotICogCi0gKiBAZ29hbCBqYXZhMndzZGwKLSAqIEBwaGFzZSBwcm9jZXNzLWNsYXNzZXMKLSAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKLSAqLwotcHVibGljIGNsYXNzIEphdmEyV1NETE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQlJBQ0tFVCA9ICJbIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTE9TRV9CUkFDS0VUID0gIl0iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIHByb2plY3QuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgICAqIEByZWFkLW9ubHkKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzLCB3aGljaCBpcyBiZWluZyBpbnNwZWN0ZWQuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5jbGFzc05hbWV9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQotICAgIC8qKgotICAgICAqIFRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGdlbmVyYXRlZCBXU0RMLgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwudGFyZ2V0TmFtZXNwYWNlfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZXNwYWNlIHByZWZpeCwgd2hpY2ggaXMgYmVpbmcgdXNlZCBmb3IgdGhlIFdTREwncwotICAgICAqIHRhcmdldCBuYW1lc3BhY2UuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC50YXJnZXROYW1lc3BhY2VQcmVmaXh9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVByZWZpeDsKLQotICAgIC8qKgotICAgICAqIFRoZSBnZW5lcmF0ZWQgc2NoZW1hcyB0YXJnZXQgbmFtZXNwYWNlLgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzY2hlbWFUYXJnZXROYW1lc3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZ2VuZXJhdGVkIHNjaGVtYXMgdGFyZ2V0IG5hbWVzcGFjZSBwcmVmaXguCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5zY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXh9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeDsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzZXJ2aWNlLgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwuc2VydmljZU5hbWV9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiB0aGUgc2VydmljZSBmaWxlLCB3aGljaCBpcyBiZWluZyBnZW5lcmF0ZWQuCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5vdXRwdXRGaWxlTmFtZX0iIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1yZXNvdXJjZXMvc2VydmljZS53c2RsIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEZpbGVOYW1lOwotCi0gICAgLyoqCi0gICAgICogU3R5bGUgZm9yIHRoZSB3c2RsCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5zdHlsZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3R5bGU7Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgZm9yIHRoZSB3c2RsCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC51c2V9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHVzZTsKLQotICAgIC8qKgotICAgICAqIFZlcnNpb24gZm9yIHRoZSB3c2RsCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC53c2RsVmVyc2lvbn0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbFZlcnNpb247Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lc3BhY2UgR2VuZXJhdG9yCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5uc0dlbkNsYXNzTmFtZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbnNHZW5DbGFzc05hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBTY2hlbWEgR2VuZXJhdG9yCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5uc0dlbkNsYXNzTmFtZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hR2VuQ2xhc3NOYW1lOwotCi0gICAgLyoqCi0gICAgICogTG9jYXRpb24gVVJJIGluIHRoZSB3c2RsCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5sb2NhdGlvblVyaX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb25Vcmk7Ci0KLSAgICAvKioKLSAgICAgKiBhdHRyRm9ybURlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHNjaGVtYQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwuYXR0ckZvcm1EZWZhdWx0fSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhdHRyRm9ybURlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBlbGVtZW50Rm9ybURlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHNjaGVtYQotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi5qYXZhMndzZGwuZWxlbWVudEZvcm1EZWZhdWx0fSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0KLSAgICAvKioKLSAgICAgKiBTd2l0Y2ggb24gdGhlIERvYy9MaXQvQmFyZSBzdHlsZSBzY2hlbWEKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIuamF2YTJ3c2RsLmRvY0xpdEJhcmV9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRvY0xpdEJhcmU7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRpdGlvbmFsIGNsYXNzZXMgZm9yIHdoaWNoIHdlIG5lZWQgdG8gZ2VuZXJhdGUgc2NoZW1hCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5leHRyYUNsYXNzZXN9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZXh0cmFDbGFzc2VzOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSBuYW1lc3BhY2VzIGV4cGxpY2l0bHkgZm9yIHBhY2thZ2VzCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5wYWNrYWdlMk5hbWVzcGFjZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHBhY2thZ2UyTmFtZXNwYWNlOwotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvT3B0aW9uTWFwKE1hcCBtYXAsIFN0cmluZyBvcHRpb24sIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBhZGRUb09wdGlvbk1hcChtYXAsIG9wdGlvbiwgbmV3IFN0cmluZ1tde3ZhbHVlfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRvT3B0aW9uTWFwKE1hcCBtYXAsIFN0cmluZyBvcHRpb24sIFN0cmluZ1tdIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYXAucHV0KG9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEphdmEyV1NETENvbW1hbmRMaW5lT3B0aW9uKG9wdGlvbiwgdmFsdWUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUb09wdGlvbk1hcChNYXAgbWFwLCBTdHJpbmcgb3B0aW9uLCBBcnJheUxpc3QgdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiAhdmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbWFwLnB1dChvcHRpb24sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBKYXZhMldTRExDb21tYW5kTGluZU9wdGlvbihvcHRpb24sIHZhbHVlcykpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmlsbHMgdGhlIG9wdGlvbiBtYXAuIFRoaXMgbWFwIGlzIHBhc3NlZCBvbnRvCi0gICAgICogdGhlIGNvZGUgZ2VuZXJhdGlvbiBBUEkgdG8gZ2VuZXJhdGUgdGhlIGNvZGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXAgZmlsbE9wdGlvbk1hcCgpIHRocm93cyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIGlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAoIG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5DTEFTU05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lKTsKLSAgICAgICAgYWRkVG9PcHRpb25NYXAoIG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5UQVJHRVRfTkFNRVNQQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIGFkZFRvT3B0aW9uTWFwKCBvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuVEFSR0VUX05BTUVTUEFDRV9QUkVGSVhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlUHJlZml4KTsKLSAgICAgICAgYWRkVG9PcHRpb25NYXAoIG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5TQ0hFTUFfVEFSR0VUX05BTUVTUEFDRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUYXJnZXROYW1lc3BhY2UpOwotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNDSEVNQV9UQVJHRVRfTkFNRVNQQUNFX1BSRUZJWF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUYXJnZXROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZpbGVOYW1lKTsKLSAgICAgICAgaWYoIW91dHB1dEZpbGUuaXNBYnNvbHV0ZSgpKXsKLSAgICAgICAgICAgIG91dHB1dEZpbGUgPSBuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgb3V0cHV0RmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgZGlyID0gb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIGlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGRpci5ta2RpcnMoKTsKLSAgICAgICAgfQotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLk9VVFBVVF9MT0NBVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXIuZ2V0UGF0aCgpICk7Ci0gICAgICAgIGFkZFRvT3B0aW9uTWFwKCBvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuT1VUUFVUX0ZJTEVOQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUuZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSBwcm9qZWN0LmdldEFydGlmYWN0KCk7Ci0gICAgICAgIFNldCBhcnRpZmFjdHMgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotICAgICAgICBTdHJpbmdbXSBhcnRpZmFjdEZpbGVOYW1lcyA9IG5ldyBTdHJpbmdbYXJ0aWZhY3RzLnNpemUoKSArIChhcnRpZmFjdCA9PSBudWxsID8gMCA6IDEpXTsKLSAgICAgICAgaW50IGogPSAwOwotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgaisrKSB7Ci0gICAgICAgICAgICBhcnRpZmFjdEZpbGVOYW1lc1tqXSA9ICgoQXJ0aWZhY3QpIGkubmV4dCgpKS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYXJ0aWZhY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gYXJ0aWZhY3QuZ2V0RmlsZSgpOwotICAgICAgICAgICAgaWYoZmlsZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdEZpbGVOYW1lc1tqXSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRUb09wdGlvbk1hcCggb3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkNMQVNTUEFUSF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdEZpbGVOYW1lcyk7Ci0KLSAgICAgICAgaWYgKHN0eWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLlNUWUxFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgc3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVzZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5VU0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICB1c2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdzZGxWZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLldTRExfVkVSU0lPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIHdzZGxWZXJzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkb2NMaXRCYXJlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkRPQ19MSVRfQkFSRSwKLSAgICAgICAgICAgICAgICAgICAgZG9jTGl0QmFyZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jYXRpb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvblVyaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnNHZW5DbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuTkFNRVNQQUNFX0dFTkVSQVRPUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5zR2VuQ2xhc3NOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzY2hlbWFHZW5DbGFzc05hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuU0NIRU1BX0dFTkVSQVRPUl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIHNjaGVtYUdlbkNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXR0ckZvcm1EZWZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFkZFRvT3B0aW9uTWFwKG9wdGlvbk1hcCwKLSAgICAgICAgICAgICAgICAgICAgSmF2YTJXU0RMQ29uc3RhbnRzLkFUVFJfRk9STV9ERUZBVUxUX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgYXR0ckZvcm1EZWZhdWx0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbGVtZW50Rm9ybURlZmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgICAgICBKYXZhMldTRExDb25zdGFudHMuRUxFTUVOVF9GT1JNX0RFRkFVTFRfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dHJhQ2xhc3NlcyAhPSBudWxsICYmIGV4dHJhQ2xhc3Nlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBhZGRUb09wdGlvbk1hcChvcHRpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5FWFRSQV9DTEFTU0VTX0RFRkFVTFRfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBleHRyYUNsYXNzZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmKHBhY2thZ2UyTmFtZXNwYWNlICE9IG51bGwpewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWNrYWdlMk5hbWVzcGFjZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgCi0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGxpc3QuYWRkKE9QRU5fQlJBQ0tFVCArCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICBDT01NQSArCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xPU0VfQlJBQ0tFVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYWRkVG9PcHRpb25NYXAob3B0aW9uTWFwLAotICAgICAgICAgICAgICAgIEphdmEyV1NETENvbnN0YW50cy5KQVZBX1BLR18yX05TTUFQX09QVElPTiwKLSAgICAgICAgICAgICAgICBsaXN0KTsKLQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBNYXAgY29tbWFuZExpbmVPcHRpb25zID0gZmlsbE9wdGlvbk1hcCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IEphdmEyV1NETENvZGVnZW5FbmdpbmUoY29tbWFuZExpbmVPcHRpb25zKS5nZW5lcmF0ZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjFmODYwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1Db25maWd1cmF0aW9uCi0KLSAgVGhlIEphdmEyV1NETCBnb2FsIHRha2VzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcyBpbnB1dC4gQWxsIHBhcmFtZXRlcnMgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYnkgdXNpbmcKLSAgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsIHRoZSBwYXJhbWV0ZXIgImNsYXNzTmFtZSIgbWF5IGJlIHNldCB1c2luZyB0aGUgcHJvcGVydHkKLSAgImF4aXMyLmphdmEyd3NkbC5jbGFzc05hbWUiLiBJZiB0aGUgcGFyYW1ldGVyIGlzbid0IHNldCB2aWEgcHJvcGVydHkgb3IgaW4gdGhlIFBPTSwgdGhlbiBhIGRlZmF1bHQKLSAgdmFsdWUgYXBwbGllcy4KLQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IFBhcmFtZXRlciBuYW1lICAgICAgICAgICAgICB8IENvbW1hbmQgbGluZSBwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGNsYXNzTmFtZSAgICAgICAgICAgICAgICAgICB8ICR7YXhpczIuamF2YTJ3c2RsLmNsYXNzTmFtZX0gICAgICAgICAgICAgICAgICAgfCBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MsIHdoaWNoIGlzICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJlaW5nIHJlYWQgYW5kIHRyYW5zZm9ybWVkIGludG8gYSBXU0RMLiAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG91dHB1dEZpbGVOYW1lICAgICAgICAgICAgICB8ICR7YXhpczIuamF2YTJ3c2RsLm91dHB1dEZpbGVOYW1lfSAgICAgICAgICAgICAgfCBQYXRoIG9mIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBmaWxlLiAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotfCBzY2hlbWFUYXJnZXROYW1lc3BhY2UgICAgICAgfCAke2F4aXMyLmphdmEyd3NkbC5zY2hlbWFUYXJnZXROYW1lc3BhY2V9ICAgICAgIHwgVGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgZ2VuZXJhdGVkIHNjaGVtYS4gICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4IHwgJHtheGlzMi5qYXZhMndzZGwuc2NoZW1hVGFyZ2V0TmFtZXNwYWNlUHJlZml4fSB8IFByZWZpeCwgd2hpY2ggaXMgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2NoZW1hcyB0YXJnZXQgbmFtZXNwYWNlLiAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgc2VydmljZU5hbWUgICAgICAgICAgICAgICAgIHwgJHtheGlzMi5qYXZhMndzZGwuc2VydmljZU5hbWV9ICAgICAgICAgICAgICAgICB8IE5hbWUgb2YgdGhlIGdlbmVyYXRlZCB3ZWIgc2VydmljZS4gICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVbnF1YWxpZmllZCBuYW1lIG9mIHRoZSBpbnB1dCBjbGFzcy4gICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgdGFyZ2V0TmFtZXNwYWNlICAgICAgICAgICAgIHwgJHtheGlzMi5qYXZhMndzZGwudGFyZ2V0TmFtZXNwYWNlfSAgICAgICAgICAgICB8IFRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIGdlbmVyYXRlZCBXU0RMLiAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IG5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgdGFyZ2V0TmFtZXNwYWNlUHJlZml4ICAgICAgIHwgJHtheGlzMi5qYXZhMndzZGwudGFyZ2V0TmFtZXNwYWNlUHJlZml4fSAgICAgICB8IFByZWZpeCwgd2hpY2ggaXMgYmVpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGFyZ2V0IG5hbWVzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZ29hbHMuYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9nb2Fscy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzJkN2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9nb2Fscy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0gLS0tLS0tCi0gTWF2ZW4gMiBKYXZhMldTREwgUGx1Z2luOiBjb25maWd1cmF0aW9uIGV4YW1wbGVzCi0gLS0tLS0tCi0gSm9jaGVuIFdpZWRtYW5uIAotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1Hb2FscwotCi0gIFRoZSBKYXZhMldTREwgcGx1Z2luIG9mZmVycyBhIHNpbmdsZSBnb2FsOgotCi0gICAqIGphdmEyd3NkbCAoZGVmYXVsdCk6IFJlYWRzIGEgamF2YSBjbGFzcyBhbmQgZ2VuZXJhdGVzIGEgV1NETCBmb3IgaW52b2tpbmcgdGhlIGNsYXNzZXMgbWV0aG9kcyBhcyBhIHdlYiBzZXJ2aWNlLgotCi0gIFRvIHJ1biB0aGUgcGx1Z2luLCBhZGQgdGhlIGZvbGxvd2luZyBzZWN0aW9uIHRvIHlvdXIgUE9NOgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMi5tYXZlbjI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPmphdmEyd3NkbDwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Y2xhc3NOYW1lPmNvbS5mb28ubXlzZXJ2aWNlLk15SGFuZGxlcjwvY2xhc3NOYW1lPgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgVGhlIHBsdWdpbiB3aWxsIGJlIGludm9rZWQgYXV0b21hdGljYWxseSBpbiB0aGUgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gIHBoYXNlLiBZb3UgY2FuIGFsc28gaW52b2tlIGl0IGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZSBieQotICBydW5uaW5nIHRoZSBjb21tYW5kCi0KLSstLS0tLS0tLQotICBtdm4gamF2YTJ3c2RsOmphdmEyd3NkbAotKy0tLS0tLS0tLQotCi0KLVRoZSBKYXZhMldTREwgR29hbAotCi0gIEJ5IGRlZmF1bHQsIHRoZSBwbHVnaW4gcmVhZHMgdGhlIGdpdmVuIEphdmEgY2xhc3MgYW5kIGNyZWF0ZXMgYQotICBmaWxlIDw8PHRhcmdldC9nZW5lcmF0ZWQtcmVzb3VyY2VzL2phdmEyd3NkbC9zZXJ2aWNlLnhtbD4+Pi4gVGhlCi0gIEphdmEgY2xhc3MgaXMgZ2l2ZW4gYnkgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCA8PDxjbGFzc05hbWU+Pj4KLSAgYWJvdmUuCi0KLSAgU2VlIHRoZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9uIHt7e2NvbmZpZ3VyYXRpb24uaHRtbH1wcm9wZXJ0aWVzfX0gZm9yCi0gIGhvdyB0byBjb25maWd1cmUgdGhlIGdvYWwuCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2ludHJvZHVjdGlvbi5hcHQgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2ludHJvZHVjdGlvbi5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NTI5MmUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIC0tLS0tLQotIE1hdmVuIDIgSmF2YTJXU0RMIFBsdWdpbgotIC0tLS0tLQotIEpvY2hlbiBXaWVkbWFubgotIDxqb2NoZW4ud2llZG1hbm5AZ21haWwuY29tPgotIC0tLS0tLQotCi1JbnRyb2R1Y3Rpb24KLQotICBUaGlzIHBsdWdpbiB0YWtlcyBhcyBpbnB1dCBhIEphdmEgY2xhc3MgYW5kIGdlbmVyYXRlcyBhIFdTREwsCi0gIHdoaWNoIGRlc2NyaWJlcyBhIHdlYiBzZXJ2aWNlIGZvciBpbnZva2luZyB0aGUgY2xhc3NlcwotICBtZXRob2RzLgotCi0gIFRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGdvYWxzIGlzIGF2YWlsYWJsZSB7e3tnb2Fscy5odG1sfWhlcmV9fS4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyMWVlNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgbmFtZT0iTWF2ZW4gQXhpcyAyIEphdmEyV1NETCBQbHVnaW4iPgotICA8YmFubmVyTGVmdD4KLSAgICA8bmFtZT5NYXZlbiBBeGlzIDIgSmF2YTJXU0RMIFBsdWdpbjwvbmFtZT4KLSAgICA8c3JjPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2ltYWdlcy9hcGFjaGUtbWF2ZW4tcHJvamVjdC5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy88L2hyZWY+Ci0gIDwvYmFubmVyTGVmdD4KLSAgPGJhbm5lclJpZ2h0PgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL21hdmVuLXNtYWxsLmdpZjwvc3JjPgotICA8L2Jhbm5lclJpZ2h0PgotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUiIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iLz4KLSAgICAgIDxpdGVtIG5hbWU9IldlYnNlcnZpY2VzIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy8iLz4KLSAgICAgIDxpdGVtIG5hbWU9IkF4aXMgMiIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNYXZlbiAyIiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iaW50cm9kdWN0aW9uLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkhvdyB0byBVc2UiIGhyZWY9Imhvd3RvLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkNvbmZpZ3VyYXRpb24iIGhyZWY9ImNvbmZpZ3VyYXRpb24uaHRtbCIvPgotICAgIDwvbWVudT4KLSAgICAke3JlcG9ydHN9Ci0gIDwvYm9keT4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2phdmEyd3NkbC9KYXZhMldTRExNb2pvVGVzdC5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL0phdmEyV1NETE1vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjU3NGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1qYXZhMndzZGwtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvamF2YTJ3c2RsL0phdmEyV1NETE1vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmphdmEyd3NkbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3RpbmcuQWJzdHJhY3RNb2pvVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5zdHVicy5NYXZlblByb2plY3RTdHViOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLS8qKgotICogVGVzdCBjYXNlIGZvciBydW5uaW5nIHRoZSBqYXZhMndzZGwgZ29hbC4KLSAqLwotcHVibGljIGNsYXNzIEphdmEyV1NETE1vam9UZXN0IGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEUgPSAidGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2phdmEyd3NkbC9zZXJ2aWNlLnhtbCI7Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBydW5uaW5nIHRoZSBXU0RMIGdlbmVyYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgZGlyID0gInNyYy90ZXN0L3Rlc3QxIjsKLSAgICAgICAgcnVuVGVzdChkaXIgLCAiamF2YTJ3c2RsIiApOwotICAgICAgICBhc3NlcnRUcnVlKCBuZXcgRmlsZShkaXIsIFdTRExfRklMRSkuZXhpc3RzKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBKYXZhMldTRExNb2pvIG5ld01vam8oIFN0cmluZyBwRGlyLCBTdHJpbmcgcEdvYWwgKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGJhc2VEaXIgPSBuZXcgRmlsZShuZXcgRmlsZShnZXRCYXNlZGlyKCkpLCBwRGlyKTsKLSAgICAgICAgRmlsZSB0ZXN0UG9tID0gbmV3IEZpbGUoIGJhc2VEaXIsICJwb20ueG1sIiApOwotICAgICAgICBKYXZhMldTRExNb2pvIG1vam8gPSAoSmF2YTJXU0RMTW9qbykgbG9va3VwTW9qbyggcEdvYWwsIHRlc3RQb20gKTsKLSAgICAgICAgTWF2ZW5Qcm9qZWN0U3R1YiBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdFN0dWIoKXsKLSAgICAgICAgICAgIHB1YmxpYyBGaWxlIGdldEJhc2VkaXIoKSB7IHJldHVybiBiYXNlRGlyOyB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNldFZhcmlhYmxlVmFsdWVUb09iamVjdChtb2pvLCAicHJvamVjdCIsIHByb2plY3QpOwotICAgICAgICBzZXRWYXJpYWJsZVZhbHVlVG9PYmplY3QobW9qbywgIm91dHB1dEZpbGVOYW1lIiwgV1NETF9GSUxFKTsKLSAgICAgICAgcmV0dXJuIG1vam87Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCggU3RyaW5nIHBEaXIsIFN0cmluZyBwR29hbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ld01vam8oIHBEaXIsIHBHb2FsICkuZXhlY3V0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2phdmEyd3NkbC90ZXN0L0FkZGVyLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9qYXZhMndzZGwvdGVzdC9BZGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUyYmI3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL2phdmEyd3NkbC90ZXN0L0FkZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLmphdmEyd3NkbC50ZXN0OwotCi0vKioKLSAqIEEgZHVtbXkgc2VydmljZSBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgQWRkZXIgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN1bSBvZiBpdHMgcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGFkZChpbnQgcDEsIGludCBwMikgewotICAgICAgICByZXR1cm4gcDEgKyBwMjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvdGVzdDEvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q5ZTUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLXRlc3QxPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxuYW1lPlRlc3QgMSBvZiB0aGUgYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbjwvbmFtZT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWphdmEyd3NkbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbGFzc05hbWU+b3JnLmFwYWNoZS5heGlzMi5tYXZlbjIuamF2YTJ3c2RsLnRlc3QuQWRkZXI8L2NsYXNzTmFtZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTA3ZmI0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIE1BUiBNYXZlbiBQbHVnaW48L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIE1hdmVuIDIgcGx1Z2luIGZvciBjcmVhdGluZyBBeGlzIDIgbW9kdWxlIGFyY2hpdmVzIChtYXIgZmlsZXMpCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uYXJ0aWZhY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmFyY2hpdmVyLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cGxleHVzLnV0aWxzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLWhhcm5lc3M8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW48L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbjwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cHJvamVjdC52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLSAgICA8ZGV2ZWxvcGVycz4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxpZD5qb2NoZW48L2lkPgotICAgICAgICAgICAgPG5hbWU+Sm9jaGVuIFdpZWRtYW5uPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvY2hlbi53aWVkbWFubkBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICA8L2RldmVsb3BlcnM+Ci0gICAgPGNvbnRyaWJ1dG9ycz4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+Sm9obiBQZmVpZmVyPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmpvaG4ucGZlaWZlckBobnBzb2x1dGlvbnMuY29tPC9lbWFpbD4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICA8L2NvbnRyaWJ1dG9ycz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9BYnN0cmFjdE1hck1vam8uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9BYnN0cmFjdE1hck1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2MzA0OS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvQWJzdHJhY3RNYXJNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5tYXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLlNjb3BlQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotCi0KLS8qKgotICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBhbGwgdGhlIG1vam9zIGluIHRoZSBheGlzMi1tYXItbWF2ZW4tcGx1Z2luLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYXJNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLQotICAgIC8qKgotICAgICAqIFRoZSBwcm9qZWN0cyBiYXNlIGRpcmVjdG9yeS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJhc2VkaXJ9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqIEByZWFkb25seQotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIGJhc2VEaXI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlcXVpcmVkCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGdlbmVyYXRlZCBjbGFzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQub3V0cHV0RGlyZWN0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgY2xhc3Nlc0RpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1hciBpcyBidWlsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWFyIgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlIG1hckRpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbW9kdWxlLnhtbCBmaWxlLiAgSWYgaXQgaXMgcHJlc2VudCBpbiB0aGUgTUVUQS1JTkYKLSAgICAgKiBkaXJlY3RvcnkgaW4gc3JjL21haW4vcmVzb3VyY2VzIHdpdGggdGhhdCBuYW1lIHRoZW4gaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIAotICAgICAqIGluY2x1ZGVkLiBPdGhlcndpc2UgdGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIAotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBtb2R1bGVYbWxGaWxlOwotCi0gICAgLyoqCi0gICAgICogQWRkaXRpb25hbCBmaWxlIHNldHMsIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGVTZXRbXSBmaWxlU2V0czsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgamFycyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIG1hcgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtpbmNsdWRlRGVwZW5kZW5jaWVzfSIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZURlcGVuZGVuY2llczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBCdWlsZHMgdGhlIGV4cGxvZGVkIG1hciBmaWxlLgotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGJ1aWxkRXhwbG9kZWRNYXIoICkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCAiRXhwbG9kaW5nIG1hci4uLiIgKTsKLQotICAgICAgICBtYXJEaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgICAgIGdldExvZygpLmRlYnVnKCAiQXNzZW1ibGluZyBtYXIgIiArIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIiBpbiAiICsgbWFyRGlyZWN0b3J5ICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgbWV0YUluZkRpciA9IG5ldyBGaWxlKCBtYXJEaXJlY3RvcnksICJNRVRBLUlORiIgKTsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgbGliRGlyID0gbmV3IEZpbGUobWFyRGlyZWN0b3J5LCAibGliIik7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIG1vZHVsZUZpbGVUYXJnZXQgPSBuZXcgRmlsZSggbWV0YUluZkRpciwgIm1vZHVsZS54bWwiICk7Ci0gICAgICAgICAgICBib29sZWFuIGV4aXN0c0JlZm9yZUNvcHlpbmdDbGFzc2VzID0gbW9kdWxlRmlsZVRhcmdldC5leGlzdHMoKTsKLQotICAgICAgICAgICAgaWYgKCBjbGFzc2VzRGlyZWN0b3J5LmV4aXN0cygpICYmICggIWNsYXNzZXNEaXJlY3RvcnkuZXF1YWxzKCBtYXJEaXJlY3RvcnkgKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weURpcmVjdG9yeVN0cnVjdHVyZSggY2xhc3Nlc0RpcmVjdG9yeSwgbWFyRGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggZmlsZVNldHMgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyAgaSA8IGZpbGVTZXRzLmxlbmd0aDsgICBpKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZVNldCBmaWxlU2V0ID0gZmlsZVNldHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGNvcHlGaWxlU2V0KCBmaWxlU2V0LCBtYXJEaXJlY3RvcnkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNvcHlNZXRhSW5mRmlsZSggbW9kdWxlWG1sRmlsZSwgbW9kdWxlRmlsZVRhcmdldCwgZXhpc3RzQmVmb3JlQ29weWluZ0NsYXNzZXMsICJtb2R1bGUueG1sIGZpbGUiICk7Ci0KLSAgICAgICAgICAgIGlmKGluY2x1ZGVEZXBlbmRlbmNpZXMpewotICAgICAgICAgICAgICAgIFNldCBhcnRpZmFjdHMgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotICAgIAotICAgICAgICAgICAgICAgIExpc3QgZHVwbGljYXRlcyA9IGZpbmREdXBsaWNhdGVzKCBhcnRpZmFjdHMgKTsKLSAgICAKLSAgICAgICAgICAgICAgICBmb3IgKCBJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgCVN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IGdldERlZmF1bHRGaW5hbE5hbWUoIGFydGlmYWN0ICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgCWdldExvZygpLmRlYnVnKCAiUHJvY2Vzc2luZzogIiArIHRhcmdldEZpbGVOYW1lICk7Ci0gICAgCi0gICAgICAgICAgICAgICAgCWlmICggZHVwbGljYXRlcy5jb250YWlucyggdGFyZ2V0RmlsZU5hbWUgKSApCi0gICAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgICAJCWdldExvZygpLmRlYnVnKCAiRHVwbGljYXRlIGZvdW5kOiAiICsgdGFyZ2V0RmlsZU5hbWUgKTsKLSAgICAgICAgICAgICAgICAJCXRhcmdldEZpbGVOYW1lID0gYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpICsgIi0iICsgdGFyZ2V0RmlsZU5hbWU7Ci0gICAgICAgICAgICAgICAgCQlnZXRMb2coKS5kZWJ1ZyggIlJlbmFtZWQgdG86ICIgKyB0YXJnZXRGaWxlTmFtZSApOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgCi0gICAgICAgICAgICAgICAgCS8vIFRPRE86IHV0aWxpc2UgYXBwcm9wcmlhdGUgbWV0aG9kcyBmcm9tIHByb2plY3QgYnVpbGRlcgotICAgICAgICAgICAgICAgIAlTY29wZUFydGlmYWN0RmlsdGVyIGZpbHRlciA9IG5ldyBTY29wZUFydGlmYWN0RmlsdGVyKCBBcnRpZmFjdC5TQ09QRV9SVU5USU1FICk7Ci0gICAgICAgICAgICAgICAgCWlmICggIWFydGlmYWN0LmlzT3B0aW9uYWwoKSAmJiBmaWx0ZXIuaW5jbHVkZSggYXJ0aWZhY3QgKSApCi0gICAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgICAJCVN0cmluZyB0eXBlID0gYXJ0aWZhY3QuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIAkJaWYgKCAiamFyIi5lcXVhbHMoIHR5cGUgKSApCi0gICAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgICAgCQkJY29weUZpbGVJZk1vZGlmaWVkKCBhcnRpZmFjdC5nZXRGaWxlKCksIG5ldyBGaWxlKCBsaWJEaXIsIHRhcmdldEZpbGVOYW1lICkgKTsKLSAgICAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkNvdWxkIG5vdCBleHBsb2RlIG1hci4uLiIsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIGEgc2V0IG9mIGFydGlmYWN0cyBmb3IgZHVwbGljYXRlIGZpbGVuYW1lcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgZHVwbGljYXRlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnRpZmFjdHMgc2V0IG9mIGFydGlmYWN0cwotICAgICAqIEByZXR1cm4gTGlzdCBvZiBkdXBsaWNhdGVkIGFydGlmYWN0cwotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCBmaW5kRHVwbGljYXRlcyggU2V0IGFydGlmYWN0cyApCi0gICAgewotICAgICAgICBMaXN0IGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3QgaWRlbnRpZmllcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIGNhbmRpZGF0ZSA9IGdldERlZmF1bHRGaW5hbE5hbWUoIGFydGlmYWN0ICk7Ci0gICAgICAgICAgICBpZiAoIGlkZW50aWZpZXJzLmNvbnRhaW5zKCBjYW5kaWRhdGUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZHVwbGljYXRlcy5hZGQoIGNhbmRpZGF0ZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzLmFkZCggY2FuZGlkYXRlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhlIGZpbGVuYW1lIG9mIGFuIGFydGlmYWN0IHRvIGFydGlmYWN0SWQtdmVyc2lvbi50eXBlIGZvcm1hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcnRpZmFjdAotICAgICAqIEByZXR1cm4gY29udmVydGVkIGZpbGVuYW1lIG9mIHRoZSBhcnRpZmFjdAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRGaW5hbE5hbWUoIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkgKyAiLSIgKyBhcnRpZmFjdC5nZXRWZXJzaW9uKCkgKyAiLiIgKwotICAgICAgICAgICAgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RIYW5kbGVyKCkuZ2V0RXh0ZW5zaW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29weSBmaWxlIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIG9ubHkgaWYgc291cmNlIHRpbWVzdGFtcCBpcyBsYXRlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiB0aW1lc3RhbXAuCi0gICAgICogVGhlIGRpcmVjdG9yaWVzIHVwIHRvIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LgotICAgICAqIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSAgICAgIEFuIGV4aXN0aW5nIG5vbi1kaXJlY3RvcnkgPGNvZGU+RmlsZTwvY29kZT4gdG8gY29weSBieXRlcyBmcm9tLgotICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBBIG5vbi1kaXJlY3RvcnkgPGNvZGU+RmlsZTwvY29kZT4gdG8gd3JpdGUgYnl0ZXMgdG8gKHBvc3NpYmx5Ci0gICAgICogICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0aW5nKS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICAgICAgIGlmIDxjb2RlPnNvdXJjZTwvY29kZT4gZG9lcyBub3QgZXhpc3QsIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiBjYW5ub3QgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8sIG9yIGFuIElPIGVycm9yIG9jY3VycyBkdXJpbmcgY29weWluZy4KLSAgICAgKiBAdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGlmIDxjb2RlPmRlc3RpbmF0aW9uPC9jb2RlPiBpcyBhIGRpcmVjdG9yeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAvPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE8gRE86IFJlbW92ZSB0aGlzIG1ldGhvZCB3aGVuIE1hdmVuIG1vdmVzIHRvIHBsZXh1cy11dGlscyB2ZXJzaW9uIDEuNAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb3B5RmlsZUlmTW9kaWZpZWQoIEZpbGUgc291cmNlLCBGaWxlIGRlc3RpbmF0aW9uICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBUTyBETzogUmVtb3ZlIHRoaXMgbWV0aG9kIGFuZCB1c2UgdGhlIG1ldGhvZCBpbiBXYXJGaWxlVXRpbHMgd2hlbiBNYXZlbiAyIGNoYW5nZXMKLSAgICAgICAgLy8gdG8gcGxleHVzLXV0aWxzIDEuMi4KLSAgICAgICAgaWYgKCBkZXN0aW5hdGlvbi5sYXN0TW9kaWZpZWQoKSA8IHNvdXJjZS5sYXN0TW9kaWZpZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZSggc291cmNlLmdldENhbm9uaWNhbEZpbGUoKSwgZGVzdGluYXRpb24gKTsKLSAgICAgICAgICAgIC8vIHByZXNlcnZlIHRpbWVzdGFtcAotICAgICAgICAgICAgZGVzdGluYXRpb24uc2V0TGFzdE1vZGlmaWVkKCBzb3VyY2UubGFzdE1vZGlmaWVkKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb3B5RmlsZVNldCggRmlsZVNldCBmaWxlU2V0LCBGaWxlIHRhcmdldERpcmVjdG9yeSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSBkaXIgPSBmaWxlU2V0LmdldERpcmVjdG9yeSgpOwotICAgICAgICBpZiAoIGRpciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlyID0gYmFzZURpcjsKLSAgICAgICAgfQotICAgICAgICBGaWxlIHRhcmdldERpciA9IHRhcmdldERpcmVjdG9yeTsKLSAgICAgICAgaWYgKCBmaWxlU2V0LmdldE91dHB1dERpcmVjdG9yeSgpICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXREaXIgPSBuZXcgRmlsZSggdGFyZ2V0RGlyLCBmaWxlU2V0LmdldE91dHB1dERpcmVjdG9yeSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCB0YXJnZXREaXIuZXF1YWxzKCBkaXIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICBkcy5zZXRCYXNlZGlyKCBkaXIgKTsKLSAgICAgICAgaWYgKCAhZmlsZVNldC5pc1NraXBEZWZhdWx0RXhjbHVkZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRzLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVzID0gZmlsZVNldC5nZXRFeGNsdWRlcygpOwotICAgICAgICBpZiAoIGV4Y2x1ZGVzICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkcy5zZXRFeGNsdWRlcyggZXhjbHVkZXMgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBpbmNsdWRlcyA9IGZpbGVTZXQuZ2V0SW5jbHVkZXMoKTsKLSAgICAgICAgaWYgKCBpbmNsdWRlcyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZHMuc2V0SW5jbHVkZXMoIGluY2x1ZGVzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZHMuc2NhbigpOwotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgZm9yICggaW50IGkgPSAwOyAgaSA8IGZpbGVzLmxlbmd0aDsgIGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKCBkaXIsIGZpbGVzW2ldICk7Ci0gICAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSggdGFyZ2V0RGlyLCBmaWxlc1tpXSApOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKCBzb3VyY2VGaWxlLCB0YXJnZXRGaWxlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBjb3B5TWV0YUluZkZpbGUoIGZpbmFsIEZpbGUgcFNvdXJjZSwgZmluYWwgRmlsZSBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcEV4aXN0c0JlZm9yZUNvcHlpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBEZXNjcmlwdGlvbiApCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBwU291cmNlICE9IG51bGwgICYmICBwVGFyZ2V0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICFwU291cmNlLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlRoZSBjb25maWd1cmVkICIgKyBwRGVzY3JpcHRpb24gKyAiIGNvdWxkIG5vdCBiZSBmb3VuZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcFNvdXJjZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoICFwRXhpc3RzQmVmb3JlQ29weWluZyAgJiYgIHBUYXJnZXQuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZygpLndhcm4oICJUaGUgY29uZmlndXJlZCAiICsgcERlc2NyaXB0aW9uICsgIiBvdmVyd3JpdGVzIGFub3RoZXIgZmlsZSBmcm9tIHRoZSBjbGFzc3BhdGguIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoIHBTb3VyY2UsIHBUYXJnZXQgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9GaWxlU2V0LmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvRmlsZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjMyY2U2Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9GaWxlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5tYXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotLyoqCi0gKiBBIEZpbGVTZXQgZGVmaW5lcyBhZGRpdGlvbmFsIGZpbGVzLCB3aGljaCBhcmUgYmVpbmcgYWRkZWQgdG8gdGhlCi0gKiBBeGlzIGFwcGxpY2F0aW9uIGFyY2hpdmUuIFRoZSBvYmplY3RzIHN0cnVjdHVyZSBmb2xsb3dzIHRoZQotICogRmlsZVNldCBvYmplY3QgZnJvbSB0aGUgbWF2ZW4tYXNzZW1ibHktcGx1Z2luLCBzZWUgdGhlCi0gKiA8YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS5odG1sIj5wbHVnaW4gZG9jdW1lbnRhdGlvbjwvYT4KLSAqIGZvciBkZXRhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVNldAotewotICAgIHByaXZhdGUgRmlsZSBkaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5OwotICAgIHByaXZhdGUgU3RyaW5nW10gaW5jbHVkZXMsIGV4Y2x1ZGVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwRGVmYXVsdEV4Y2x1ZGVzOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlsZSBzZXRzIGJhc2UgZGlyZWN0b3J5LiBNYXkgYmUgb21pdHRlZCwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIHRoZSBwcm9qZWN0cyBiYXNlIGRpcmVjdG9yeSBpcyBhc3N1bWVkLgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldERpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgc2V0cyBiYXNlIGRpcmVjdG9yeS4gTWF5IGJlIG9taXR0ZWQsIGluIHdoaWNoCi0gICAgICogY2FzZSB0aGUgcHJvamVjdHMgYmFzZSBkaXJlY3RvcnkgaXMgYXNzdW1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoIEZpbGUgZGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgc2V0cyBleGNsdXNpb24gbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgc2V0cyBleGNsdXNpb24gbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyggU3RyaW5nW10gZXhjbHVkZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5leGNsdWRlcyA9IGV4Y2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpbGUgc2V0cyBpbmNsdXNpb24gbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGZpbGUgc2V0cyBpbmNsdXNpb24gbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyggU3RyaW5nW10gaW5jbHVkZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBwcmVmaXgsIHdoaWNoIHRoZSBpbmNsdWRlZCBmaWxlcyBzaG91bGQgaGF2ZQotICAgICAqIHdoZW4gYmVpbmcgYWRkZWQgdG8gdGhlIEF4aXMgYXBwbGljYXRpb24gYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBwcmVmaXgsIHdoaWNoIHRoZSBpbmNsdWRlZCBmaWxlcyBzaG91bGQgaGF2ZQotICAgICAqIHdoZW4gYmVpbmcgYWRkZWQgdG8gdGhlIEF4aXMgYXBwbGljYXRpb24gYXJjaGl2ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoIFN0cmluZyBvdXRwdXREaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucywgd2hldGhlciB0aGUgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZC4gRGVmYXVsdHMKLSAgICAgKiB0byB0cnVlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2tpcERlZmF1bHRFeGNsdWRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gc2tpcERlZmF1bHRFeGNsdWRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzLCB3aGV0aGVyIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkLiBEZWZhdWx0cyB0bwotICAgICAqIHRydWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2tpcERlZmF1bHRFeGNsdWRlcyggYm9vbGVhbiBza2lwRGVmYXVsdEV4Y2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2tpcERlZmF1bHRFeGNsdWRlcyA9IHNraXBEZWZhdWx0RXhjbHVkZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hckV4cGxvZGVkTW9qby5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hckV4cGxvZGVkTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAxZTgyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL21hci9NYXJFeHBsb2RlZE1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIubWFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgZXhwbG9kZWQgbWFyCi0gKgotICogQGdvYWwgZXhwbG9kZWQKLSAqIEBwaGFzZSBwYWNrYWdlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJFeHBsb2RlZE1vam8KLSAgICBleHRlbmRzIEFic3RyYWN0TWFyTW9qbwotewotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSAKLSAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBidWlsZEV4cGxvZGVkTWFyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hckluUGxhY2VNb2pvLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvTWFySW5QbGFjZU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3N2RiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvTWFySW5QbGFjZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIubWFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgbWFyIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5Ci0gKgotICogQGdvYWwgaW5wbGFjZQotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gcnVudGltZQotICovCi1wdWJsaWMgY2xhc3MgTWFySW5QbGFjZU1vam8gCi0gIGV4dGVuZHMgQWJzdHJhY3RNYXJNb2pvCi17Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotCi0gICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgbWFyIGluIHNvdXJjZSBkaXJlY3RvcnkuLi4gIiArIG1hckRpcmVjdG9yeSk7Ci0gICAgYnVpbGRFeHBsb2RlZE1hcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvTWFyTW9qby5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvbWFyL01hck1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1YzlmOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9tYXIvTWFyTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIubWFyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5KYXJBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5NYW5pZmVzdEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEJ1aWxkIGEgbWFyLgotICogCi0gKiBAZ29hbCBtYXIKLSAqIEBwaGFzZSBwYWNrYWdlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJNb2pvIGV4dGVuZHMgQWJzdHJhY3RNYXJNb2pvCi17Ci0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSBmb3IgdGhlIGdlbmVyYXRlZCBtYXIuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG1hci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1hck5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgSmFyIGFyY2hpdmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtjb21wb25lbnQub3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlciNqYXJ9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgSmFyQXJjaGl2ZXIgamFyQXJjaGl2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWF2ZW4gYXJjaGl2ZSBjb25maWd1cmF0aW9uIHRvIHVzZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uIGFyY2hpdmUgPSBuZXcgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQ2xhc3NpZmllciB0byBhZGQgdG8gdGhlIGFydGlmYWN0IGdlbmVyYXRlZC4gSWYgZ2l2ZW4sIHRoZSBhcnRpZmFjdCB3aWxsIGJlIGFuIGF0dGFjaG1lbnQgaW5zdGVhZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NpZmllcjsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhpcyBpcyB0aGUgbWFpbiBhcnRpZmFjdCBiZWluZyBidWlsdC4gU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB5b3UgZG9uJ3Qgd2FudCB0byBpbnN0YWxsIG9yIGRlcGxveQotICAgICAqIGl0IHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lIGluIGFuIGV4ZWN1dGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJpbWFyeUFydGlmYWN0fSIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcHJpbWFyeUFydGlmYWN0OwotCi0gICAgLyoqCi0gICAgICogQGNvbXBvbmVudAotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyB0aGUgTWFyTW9qbyBvbiB0aGUgY3VycmVudCBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYnVpbGRpbmcgdGhlIHdlYmFwcAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBGaWxlIG1hckZpbGUgPSBuZXcgRmlsZSggb3V0cHV0RGlyZWN0b3J5LCBtYXJOYW1lICsgIi5tYXIiICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBlcmZvcm1QYWNrYWdpbmcoIG1hckZpbGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciBhc3NlbWJsaW5nIG1hciIsIGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyB0aGUgbWFyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBtYXJGaWxlCi0gICAgICogICAgICAgICAgICB0aGUgdGFyZ2V0IG1hciBmaWxlCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE1hbmlmZXN0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBEZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1QYWNrYWdpbmcoIEZpbGUgbWFyRmlsZSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24sIE1hbmlmZXN0RXhjZXB0aW9uLCBEZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uLAotICAgICAgICBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIGJ1aWxkRXhwbG9kZWRNYXIoICk7Ci0KLSAgICAgICAgLy8gZ2VuZXJhdGUgbWFyIGZpbGUKLSAgICAgICAgZ2V0TG9nKCkuaW5mbyggIkdlbmVyYXRpbmcgbWFyICIgKyBtYXJGaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgIE1hdmVuQXJjaGl2ZXIgYXJjaGl2ZXIgPSBuZXcgTWF2ZW5BcmNoaXZlcigpOwotICAgICAgICBhcmNoaXZlci5zZXRBcmNoaXZlciggamFyQXJjaGl2ZXIgKTsKLSAgICAgICAgYXJjaGl2ZXIuc2V0T3V0cHV0RmlsZSggbWFyRmlsZSApOwotICAgICAgICBqYXJBcmNoaXZlci5hZGREaXJlY3RvcnkoIG1hckRpcmVjdG9yeSApOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhcmNoaXZlCi0gICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoIHByb2plY3QsIGFyY2hpdmUgKTsKLQotICAgICAgICBpZiAoIGNsYXNzaWZpZXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QoIHByb2plY3QsICJtYXIiLCBjbGFzc2lmaWVyLCBtYXJGaWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IHByb2plY3QuZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgICAgIGlmICggcHJpbWFyeUFydGlmYWN0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdC5zZXRGaWxlKCBtYXJGaWxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggYXJ0aWZhY3QuZ2V0RmlsZSgpID09IG51bGwgfHwgYXJ0aWZhY3QuZ2V0RmlsZSgpLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFydGlmYWN0LnNldEZpbGUoIG1hckZpbGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0SGVscGVyLmF0dGFjaEFydGlmYWN0KCBwcm9qZWN0LCAibWFyIiwgbWFyRmlsZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyY2QzYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNvbXBvbmVudC1zZXQ+Ci0gIDxjb21wb25lbnRzPgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuQXJ0aWZhY3RIYW5kbGVyPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5tYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4dGVuc2lvbj5tYXI8L2V4dGVuc2lvbj4KLSAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICA8bGFuZ3VhZ2U+amF2YTwvbGFuZ3VhZ2U+Ci0gICAgICAgIDxhZGRlZFRvQ2xhc3NwYXRoPmZhbHNlPC9hZGRlZFRvQ2xhc3NwYXRoPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29tcG9uZW50PgotICAgIDxjb21wb25lbnQ+Ci0gICAgICA8cm9sZT5vcmcuYXBhY2hlLm1hdmVuLmxpZmVjeWNsZS5tYXBwaW5nLkxpZmVjeWNsZU1hcHBpbmc8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50Pm1hcjwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4ubGlmZWN5Y2xlLm1hcHBpbmcuRGVmYXVsdExpZmVjeWNsZU1hcHBpbmc8L2ltcGxlbWVudGF0aW9uPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxsaWZlY3ljbGVzPgotICAgICAgICAgIDxsaWZlY3ljbGU+Ci0gICAgICAgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2VzPgotICAgICAgICAgICAgICA8cHJvY2Vzcy1yZXNvdXJjZXM+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXJlc291cmNlcy1wbHVnaW46cmVzb3VyY2VzPC9wcm9jZXNzLXJlc291cmNlcz4KLSAgICAgICAgICAgICAgPGNvbXBpbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWNvbXBpbGVyLXBsdWdpbjpjb21waWxlPC9jb21waWxlPgotICAgICAgICAgICAgICA8cHJvY2Vzcy10ZXN0LXJlc291cmNlcz5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjp0ZXN0UmVzb3VyY2VzPC9wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPgotICAgICAgICAgICAgICA8dGVzdC1jb21waWxlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1jb21waWxlci1wbHVnaW46dGVzdENvbXBpbGU8L3Rlc3QtY29tcGlsZT4KLSAgICAgICAgICAgICAgPHRlc3Q+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLXN1cmVmaXJlLXBsdWdpbjp0ZXN0PC90ZXN0PgotICAgICAgICAgICAgICA8cGFja2FnZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLW1hci1tYXZlbi1wbHVnaW46bWFyPC9wYWNrYWdlPgotICAgICAgICAgICAgICA8aW5zdGFsbD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4taW5zdGFsbC1wbHVnaW46aW5zdGFsbDwvaW5zdGFsbD4KLSAgICAgICAgICAgICAgPGRlcGxveT5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZGVwbG95LXBsdWdpbjpkZXBsb3k8L2RlcGxveT4KLSAgICAgICAgICAgIDwvcGhhc2VzPgotICAgICAgICAgIDwvbGlmZWN5Y2xlPgotICAgICAgICA8L2xpZmVjeWNsZXM+Ci0gICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgPC9jb21wb25lbnQ+Ci0gIDwvY29tcG9uZW50cz4KLTwvY29tcG9uZW50LXNldD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQyMDA1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29uZmlndXJhdGlvbi5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotQ29uZmlndXJhdGlvbg0KLQ0KLSAgQWxsIE1hciBwbHVnaW4gZ29hbHMgdGFrZXMgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXMgaW5wdXQ6DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IFBhcmFtZXRlciBuYW1lICAgICAgfCBEZWZhdWx0IHZhbHVlICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBtYXJEaXJlY3RvcnkgICAgICAgIHwgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWFyICAgfCBEaXJlY3Rvcnkgd2hlcmUgdGhlIG1hciBmaWxlIGlzIGJ1aWx0LiAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgY2xhc3Nlc0RpcmVjdG9yeSAgICB8ICR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9IHwgRGlyZWN0b3J5IHdpdGggY29tcGlsZWQgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLiB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IGZpbGVTZXRzICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZGl0aW9uYWwgZmlsZSBzZXRzLCB3aGljaCBhcmUgYmVpbmcgYWRkZWQgdG8gfA0KLXwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGFyY2hpdmUuIFNlZSAiRmlsZSBTZXRzIiBiZWxvdyBmb3IgYW4gICAgICB8DQotfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgbW9kdWxlWG1sRmlsZSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTG9jYXRpb24gb2YgdGhlIG1vZHVsZS54bWwgZmlsZS4gQnkgZGVmYXVsdCwgICB8DQotfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50IHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluIGNsYXNzZXNEaXJlY3RvcnkvTUVUQS1JTkYgYW5kIG5vIHNwZWNpYWwgICAgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHJvY2Vzc2luZyBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IGluY2x1ZGVEZXBlbmRlbmNpZXMgfCB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcHJvamVjdCBkZXBlbmRlbmNpZXMgaW4gfA0KLXwgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGdlbmVyYXRlZCBtYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi0NCi0NCi1UaGUgbWFyIGdvYWwNCi0NCi0gIFRoZSBtYXIgZ29hbCBhbGxvd3MgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHBhcmFtZXRlcnM6DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IFBhcmFtZXRlciBuYW1lICAgfCBEZWZhdWx0IHZhbHVlICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBvdXRwdXREaXJlY3RvcnkgIHwgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0gfCBEaXJlY3Rvcnkgd2hlcmUgdG8gZ2VuZXJhdGUgdGhlIE1BUiBmaWxlLiAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgbWFyTmFtZSAgICAgICAgICB8ICR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IHwgVGhlIGdlbmVyYXRlZCBNQVIgZmlsZXMgbmFtZS4gICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCi18IGFyY2hpdmUgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgTWF2ZW4gYXJjaGl2ZSBjb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cywgICAgfA0KLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIGV4YW1wbGUsIHRvIGNvbmZpZ3VyZSB0aGUgTUFOSUZFU1QuTUYgICAgICB8DQotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgY2xhc3NpZmllciAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQSBjbGFzc2lmaWVyLCB3aGljaCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlICAgICB8DQotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZWQgTUFSIGZpbGVzIG5hbWUuIFNldHRpbmcgdGhpcyAgICAgICAgIHwNCi18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlciBoYXMgdGhlIHNpZGUgZWZmZWN0LCB0aGF0IHRoZSAgICAgICAgfA0KLXwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJ0aWZhY3QgaXMgdHJlYXRlZCBhcyBhbiBhdHRhY2htZW50IGFuZCBub3QgICB8DQotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyB0aGUgcHJvamVjdHMgcHJpbWFyeSBhcnRpZmFjdC4gICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgcHJpbWFyeUFydGlmYWN0ICB8IHRydWUgICAgICAgICAgICAgICAgICAgICAgIHwgU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIGRpc2FibGVzICAgICAgICB8DQotfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbnN0YWxsYXRpb24gb3IgZGVwbG95bWVudCBvZiB0aGUgYXJ0aWZhY3QgYXMgIHwNCi18ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBwcm9qZWN0cyBwcmltYXJ5IGFydGlmYWN0LiAgICAgICAgICAgICAgICAgfA0KLSotLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotDQotDQotRmlsZSBTZXRzDQotDQotICBBZGRpdGlvbmFsIGZpbGUgc2V0cyBtYXkgYmUgY29uZmlndXJlZCBmb3IgaW5jbHVzaW9uIGludG8gdGhlIE1BUiBmaWxlLiBBIGZpbGUgc2V0IGxvb2tzDQotICBhcyBmb2xsb3dzOg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tDQotICA8ZmlsZVNldHM+DQotICAgIDxmaWxlU2V0Pg0KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21hci9maWxlczwvZGlyZWN0b3J5Pg0KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+TUVUQS1JTkYvZG9jczwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgIDxpbmNsdWRlPioqLyouaHRtbDwvaW5jbHVkZT4NCi0gICAgICA8L2luY2x1ZGVzPg0KLSAgICA8L2ZpbGVTZXQ+DQotICAgIDxmaWxlU2V0Pg0KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21hci9maWxlczwvZGlyZWN0b3J5Pg0KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+TUVUQS1JTkYvZXRjPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgPGV4Y2x1ZGVzPg0KLSAgICAgICAgPGV4Y2x1ZGU+KiovKi5odG1sPC9leGNsdWRlPg0KLSAgICAgIDwvZXhjbHVkZXM+DQotICAgIDwvZmlsZVNldD4NCi0gIDwvZmlsZVNldHM+DQotLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi0gIFRoZSBleGFtcGxlIHNwZWNpZmllcywgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBzcmMvbWFyL2ZpbGVzIHNoYWxsDQotICBiZSBhZGRlZCB0byB0aGUgTUFSIGZpbGUuIEhUTUwgZmlsZXMgd2lsbCBnbyBpbnRvIE1FVEEtSU5GL2RvY3MsIGFsbCBvdGhlcg0KLSAgZmlsZXMgdG8gTUVUQS1JTkYvZXRjLg0KLQ0KLSAgQSBmaWxlIHNldCBpcyBjb25maWd1cmVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6DQotDQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgUGFyYW1ldGVyIG5hbWUgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBkaXJlY3RvcnkgICAgICAgICAgIHwgVGhlIGRpcmVjdG9yeSwgZnJvbSB3aGljaCB0byByZWFkIHRoZSBmaWxlIHNldC4gVGhpcyBwYXJhbWV0ZXIgaXMgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8IHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBvdXRwdXREaXJlY3RvcnkgICAgIHwgVGhlIHRhcmdldCBkaXJlY3Rvcnkgd2l0aGluIHRoZSBNQVIgZmlsZS4gRGVmYXVsdHMgdG8gdGhlIE1BUiAgICAgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8IGZpbGVzIHJvb3QgZGlyZWN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBpbmNsdWRlcyAgICAgICAgICAgIHwgQ29uZmlndXJlcyB0aGUgc2V0IG9mIGZpbGVzLCB3aGljaCBzaGFsbCBiZSBpbmNsdWRlZCBpbnRvIHRoZSBNQVIgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8IGZpbGUuIERlZmF1bHRzIHRvICoqLyouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQotfCBleGNsdWRlcyAgICAgICAgICAgIHwgQ29uZmlndXJlcyBhIHNldCBvZiBmaWxlcywgd2hpY2ggc2hhbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZmlsZSAgfA0KLXwgICAgICAgICAgICAgICAgICAgICB8IHNldC4gRGVmYXVsdHMgdG8gdGhlIE1hdmVuIGRlZmF1bHQgZXhjbHVkZXMgKCoqLyp+LCAqKi9jdnMvKiovKiwgIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCAqKi8uc3ZuLyoqLyosIGV0Yy4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KLXwgc2tpcERlZmF1bHRFeGNsdWRlcyB8IElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byB0cnVlLCB0aGVuIG5vIGRlZmF1bHQgZXhjbHVkZXMgYXJlICAgIHwNCi18ICAgICAgICAgICAgICAgICAgICAgfCBiZWluZyB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTgzM2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0gLS0tLS0tDQotIE1hdmVuIDIgTWFyIFBsdWdpbjogY29uZmlndXJhdGlvbiBleGFtcGxlcw0KLSAtLS0tLS0NCi0gSm9jaGVuIFdpZWRtYW5uIA0KLSA8am9jaGVuLndpZWRtYW5uQGdtYWlsLmNvbT4NCi0gLS0tLS0tDQotDQotR29hbHMNCi0NCi0gIFRoZSBNYXIgcGx1Z2luIGFsbG93cyB0aGUgcGFja2FnaW5nIG9mIGFuIEF4aXMgMiBzZXJ2aWNlIG1hciBpbiAzIGRpZmZlcmVudCBtb2RlczoNCi0NCi0gICAqIG1hciAoZGVmYXVsdCk6IGdlbmVyYXRlcyB0aGUgbWFyIGFydGlmYWN0DQotDQotICAgKiBpbnBsYWNlOiBwYWNrYWdlIHRoZSBtYXIgaW4gdGhlIHNvdXJjZSB0cmVlDQotDQotICAgKiBleHBsb2RlZCA6IHBhY2thZ2UgYW4gZXhwbG9kZWQgbWFyIGFwcGxpY2F0aW9uDQotDQotICBFYWNoIG1vZGUgaXMgbWF0ZXJpYWxpemVkIGJ5IGEgZ29hbC4gRm9yIGluc3RhbmNlLCB0byBnZW5lcmF0ZSBhbiBleHBsb2RlZA0KLSAgbWFyIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdCwgb25lIHdvdWxkIHR5cGUNCi0NCi0rLS0tLS0tLS0NCi0gIG12biBtYXI6ZXhwbG9kZWQNCi0rLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQyMGFlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItbWFyLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAtLS0tLS0NCi0gTWF2ZW4gMiBBYXIgUGx1Z2luDQotIC0tLS0tLQ0KLSBKb2NoZW4gV2llZG1hbm4NCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+DQotIC0tLS0tLQ0KLQ0KLUludHJvZHVjdGlvbg0KLQ0KLSAgVGhpcyBwbHVnaW4gZ2VuZXJhdGVzIGFuIEF4aXMgMiBzZXJ2aWNlIGZpbGUgKEFBUiBmaWxlKS4NCi0NCi0gIFRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGdvYWxzIGlzIGF2YWlsYWJsZSB7e3tob3d0by5odG1sfWhlcmV9fS4NCi0NCi0NCi0NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLW1hci1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTY3NzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IG5hbWU9Ik1hdmVuIEF4aXMgMiBNQVIgUGx1Z2luIj4KLSAgPGJhbm5lckxlZnQ+Ci0gICAgPG5hbWU+TWF2ZW4gQXhpcyAyIE1BUiBQbHVnaW48L25hbWU+Ci0gICAgPHNyYz5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvYXBhY2hlLW1hdmVuLXByb2plY3QucG5nPC9zcmM+Ci0gICAgPGhyZWY+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0gIDxiYW5uZXJSaWdodD4KLSAgICA8c3JjPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2ltYWdlcy9tYXZlbi1zbWFsbC5naWY8L3NyYz4KLSAgPC9iYW5uZXJSaWdodD4KLSAgPGJvZHk+Ci0gICAgPGxpbmtzPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIiBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJXZWJzZXJ2aWNlcyIgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBeGlzIDIiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iTWF2ZW4gMiIgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4yLyIvPgotICAgIDwvbGlua3M+Ci0KLSAgICA8bWVudSBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iIGhyZWY9ImludHJvZHVjdGlvbi5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJIb3cgdG8gVXNlIiBocmVmPSJob3d0by5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJDb25maWd1cmF0aW9uIiBocmVmPSJjb25maWd1cmF0aW9uLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0gICAgJHtyZXBvcnRzfQotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZWFhMzAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItcmVwby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSB0b29sIC0gUmVwb3NpdG9yeSBNYXZlbiBQbHVnaW48L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIE1hdmVuIDIgcGx1Z2luIGZvciBjcmVhdGluZyBBeGlzIDIgcmVwb3NpdG9yaWVzIGZyb20gcHJvamVjdCBkZXBlbmRlbmNpZXMKLSAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tbW9uLWFydGlmYWN0LWZpbHRlcnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvdHJ1bmsvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL3RydW5rL21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL3RydW5rL21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbjwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvcmVwb3J0aW5nPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3JlcG8vQWJzdHJhY3RDcmVhdGVSZXBvc2l0b3J5TW9qby5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3JlcG8vQWJzdHJhY3RDcmVhdGVSZXBvc2l0b3J5TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU3YzJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItcmVwby1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9yZXBvL0Fic3RyYWN0Q3JlYXRlUmVwb3NpdG9yeU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLnJlcG87Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuZmFjdG9yeS5BcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFic3RyYWN0QXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuQXJ0aWZhY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmFydGlmYWN0LmZpbHRlci5jb2xsZWN0aW9uLkFydGlmYWN0RmlsdGVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmFydGlmYWN0LmZpbHRlci5jb2xsZWN0aW9uLkZpbHRlckFydGlmYWN0czsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5hcnRpZmFjdC5maWx0ZXIuY29sbGVjdGlvbi5TY29wZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5hcnRpZmFjdC5maWx0ZXIuY29sbGVjdGlvbi5UeXBlRmlsdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENyZWF0ZVJlcG9zaXRvcnlNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKLSAgICAvKioKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdEZhY3RvcnkgZmFjdG9yeTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAY29tcG9uZW50Ci0gICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlc29sdmVyIHJlc29sdmVyOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmFydGlmYWN0c30iCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXQ8QXJ0aWZhY3Q+IHByb2plY3RBcnRpZmFjdHM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QucmVtb3RlQXJ0aWZhY3RSZXBvc2l0b3JpZXN9IgotICAgICAqIEByZWFkb25seQotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgTGlzdCByZW1vdGVSZXBvc2l0b3JpZXM7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2xvY2FsUmVwb3NpdG9yeX0iCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmNvbGxlY3RlZFByb2plY3RzfSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8TWF2ZW5Qcm9qZWN0PiBjb2xsZWN0ZWRQcm9qZWN0czsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byB0aGUgcmVwb3NpdG9yeSByb290KSB3aGVyZSBBQVIgZmlsZXMgYXJlIGNvcGllZC4gVGhpcyBzaG91bGQgYmUKLSAgICAgKiBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIDx0dD5TZXJ2aWNlc0RpcmVjdG9yeTwvdHQ+IHByb3BlcnR5IGluIDx0dD5heGlzMi54bWw8L3R0Pi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InNlcnZpY2VzIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VzRGlyZWN0b3J5OwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIHRoZSByZXBvc2l0b3J5IHJvb3QpIHdoZXJlIE1BUiBmaWxlcyBhcmUgY29waWVkLiBUaGlzIHNob3VsZCBiZQotICAgICAqIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgPHR0Pk1vZHVsZXNEaXJlY3Rvcnk8L3R0PiBwcm9wZXJ0eSBpbiA8dHQ+YXhpczIueG1sPC90dD4uCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJtb2R1bGVzIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIG1vZHVsZXNEaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIDx0dD5heGlzMi54bWw8L3R0PiBmaWxlIHRvIGJlIGNvcGllZCBpbnRvIHRoZSByZXBvc2l0b3J5LgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgYXhpczJ4bWw7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gdGhlIHJlcG9zaXRvcnkgcm9vdCkgd2hlcmUgdGhlIDx0dD5heGlzMi54bWw8L3R0PiBmaWxlIHdpbGwgYmUKLSAgICAgKiBjb3BpZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzZXQsIHRoZW4gdGhlIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgcmVwb3NpdG9yeQotICAgICAqIHJvb3QuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZ3VyYXRpb25EaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBsdWdpbiBzaG91bGQgc2NhbiB0aGUgcHJvamVjdCBkZXBlbmRlbmNpZXMgZm9yIEFBUiBhbmQgTUFSIGFydGlmYWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9InRydWUiCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZURlcGVuZGVuY2llczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcGx1Z2luIHNob3VsZCBzY2FuIE1hdmVuIG1vZHVsZXMgZm9yIEFBUiBhbmQgTUFSIGFydGlmYWN0cy4gVGhpcwotICAgICAqIHBhcmFtZXRlciBvbmx5IGhhcyBhbiBlZmZlY3QgZm9yIG11bHRpbW9kdWxlIHByb2plY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlTW9kdWxlczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcGx1Z2luIHNob3VsZCBnZW5lcmF0ZSA8dHQ+c2VydmljZXMubGlzdDwvdHQ+IGFuZCA8dHQ+bW9kdWxlcy5saXN0PC90dD4KLSAgICAgKiBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZUZpbGVMaXN0czsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcGx1Z2luIHN0cmlwcyB2ZXJzaW9uIG51bWJlcnMgZnJvbSBBQVIgZmlsZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0cnVlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpcFNlcnZpY2VWZXJzaW9uOwotICAgIAotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBwbHVnaW4gc3RyaXBzIHZlcnNpb24gbnVtYmVycyBmcm9tIE1BUiBmaWxlcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpcE1vZHVsZVZlcnNpb247Ci0gICAgCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTY29wZSgpOwotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpOwotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldDxBcnRpZmFjdD4gYXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3Q+KCk7Ci0gICAgICAgIGlmICh1c2VEZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgICAgIGFydGlmYWN0cy5hZGRBbGwocHJvamVjdEFydGlmYWN0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVzZU1vZHVsZXMpIHsKLSAgICAgICAgICAgIGZvciAoTWF2ZW5Qcm9qZWN0IHByb2plY3QgOiBjb2xsZWN0ZWRQcm9qZWN0cykgewotICAgICAgICAgICAgICAgIGFydGlmYWN0cy5hZGQocHJvamVjdC5nZXRBcnRpZmFjdCgpKTsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdHMuYWRkQWxsKHByb2plY3QuZ2V0QXR0YWNoZWRBcnRpZmFjdHMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRmlsdGVyQXJ0aWZhY3RzIGZpbHRlciA9IG5ldyBGaWx0ZXJBcnRpZmFjdHMoKTsKLSAgICAgICAgZmlsdGVyLmFkZEZpbHRlcihuZXcgU2NvcGVGaWx0ZXIoZ2V0U2NvcGUoKSwgbnVsbCkpOwotICAgICAgICBmaWx0ZXIuYWRkRmlsdGVyKG5ldyBUeXBlRmlsdGVyKCJhYXIsbWFyIiwgbnVsbCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXJ0aWZhY3RzID0gZmlsdGVyLmZpbHRlcihhcnRpZmFjdHMpOwotICAgICAgICB9IGNhdGNoIChBcnRpZmFjdEZpbHRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXJ0aWZhY3RzID0gcmVwbGFjZUluY29tcGxldGVBcnRpZmFjdHMoYXJ0aWZhY3RzKTsKLSAgICAgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKLSAgICAgICAgTWFwPFN0cmluZyxBcmNoaXZlRGVwbG95ZXI+IGRlcGxveWVycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxBcmNoaXZlRGVwbG95ZXI+KCk7Ci0gICAgICAgIGRlcGxveWVycy5wdXQoImFhciIsIG5ldyBBcmNoaXZlRGVwbG95ZXIob3V0cHV0RGlyZWN0b3J5LCBzZXJ2aWNlc0RpcmVjdG9yeSwgInNlcnZpY2VzLmxpc3QiLCBnZW5lcmF0ZUZpbGVMaXN0cywgc3RyaXBTZXJ2aWNlVmVyc2lvbikpOwotICAgICAgICBkZXBsb3llcnMucHV0KCJtYXIiLCBuZXcgQXJjaGl2ZURlcGxveWVyKG91dHB1dERpcmVjdG9yeSwgbW9kdWxlc0RpcmVjdG9yeSwgIm1vZHVsZXMubGlzdCIsIGdlbmVyYXRlRmlsZUxpc3RzLCBzdHJpcE1vZHVsZVZlcnNpb24pKTsKLSAgICAgICAgZm9yIChBcnRpZmFjdCBhcnRpZmFjdCA6IGFydGlmYWN0cykgewotICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBhcnRpZmFjdC5nZXRUeXBlKCk7Ci0gICAgICAgICAgICBBcmNoaXZlRGVwbG95ZXIgZGVwbG95ZXIgPSBkZXBsb3llcnMuZ2V0KHR5cGUpOwotICAgICAgICAgICAgaWYgKGRlcGxveWVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiTm8gZGVwbG95ZXIgZm91bmQgZm9yIGFydGlmYWN0IHR5cGUgIiArIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVwbG95ZXIuZGVwbG95KGdldExvZygpLCBhcnRpZmFjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF4aXMyeG1sICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oIkNvcHlpbmcgYXhpczIueG1sIik7Ci0gICAgICAgICAgICBGaWxlIHRhcmdldERpcmVjdG9yeSA9IGNvbmZpZ3VyYXRpb25EaXJlY3RvcnkgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IG91dHB1dERpcmVjdG9yeSA6IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSwgY29uZmlndXJhdGlvbkRpcmVjdG9yeSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZShheGlzMnhtbCwgbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCAiYXhpczIueG1sIikpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY29weWluZyBheGlzMi54bWwgZmlsZTogIiArIGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoQXJjaGl2ZURlcGxveWVyIGRlcGxveWVyIDogZGVwbG95ZXJzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBkZXBsb3llci5maW5pc2goZ2V0TG9nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSBhcnRpZmFjdHMgdGhhdCBoYXZlIG5vdCBiZWVuIHBhY2thZ2VkIHlldC4gVGhpcyBvY2N1cnMgaWYgdGhlIGFydGlmYWN0IGlzCi0gICAgICogcGFydCBvZiB0aGUgcmVhY3RvciBidWlsZCBhbmQgdGhlIGNvbXBpbGUgcGhhc2UgaGFzIGJlZW4gZXhlY3V0ZWQsIGJ1dCBub3QgdGhlCi0gICAgICogdGhlIHBhY2thZ2UgcGhhc2UuIFRoZXNlIGFydGlmYWN0cyB3aWxsIGJlIHJlcGxhY2VkIGJ5IG5ldyBhcnRpZmFjdCBvYmplY3RzCi0gICAgICogcmVzb2x2ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYXJ0aWZhY3RzIHRoZSBvcmlnaW5hbCBzZXRzIG9mIHtAbGluayBBcnRpZmFjdH0gb2JqZWN0cwotICAgICAqIEByZXR1cm4gYSBzZXQgb2Yge0BsaW5rIEFydGlmYWN0fSBvYmplY3RzIGJ1aWx0IGFzIGRlc2NyaWJlZCBhYm92ZQotICAgICAqIEB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgU2V0PEFydGlmYWN0PiByZXBsYWNlSW5jb21wbGV0ZUFydGlmYWN0cyhTZXQ8QXJ0aWZhY3Q+IGFydGlmYWN0cykgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBTZXQ8QXJ0aWZhY3Q+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PEFydGlmYWN0PigpOwotICAgICAgICBmb3IgKEFydGlmYWN0IGFydGlmYWN0IDogYXJ0aWZhY3RzKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBhcnRpZmFjdC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGFydGlmYWN0ID0gZmFjdG9yeS5jcmVhdGVEZXBlbmRlbmN5QXJ0aWZhY3QoYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpLCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5nZXRWZXJzaW9uUmFuZ2UoKSwgYXJ0aWZhY3QuZ2V0VHlwZSgpLCBhcnRpZmFjdC5nZXRDbGFzc2lmaWVyKCksIGFydGlmYWN0LmdldFNjb3BlKCkpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoYXJ0aWZhY3QsIHJlbW90ZVJlcG9zaXRvcmllcywgbG9jYWxSZXBvc2l0b3J5KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBYnN0cmFjdEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkKGFydGlmYWN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItcmVwby1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi9yZXBvL0FyY2hpdmVEZXBsb3llci5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3JlcG8vQXJjaGl2ZURlcGxveWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzlhMmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3JlcG8vQXJjaGl2ZURlcGxveWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLnJlcG87Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0vKioKLSAqIERlcGxveXMgYXJ0aWZhY3RzIG9mIGEgZ2l2ZW4gdHlwZSBpbnRvIGFuIEF4aXMyIHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRGVwbG95ZXIgewotICAgIHByaXZhdGUgZmluYWwgRmlsZSBkaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZUxpc3ROYW1lOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBnZW5lcmF0ZUZpbGVMaXN0OwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzdHJpcFZlcnNpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAKLSAgICBwdWJsaWMgQXJjaGl2ZURlcGxveWVyKEZpbGUgcmVwb3NpdG9yeURpcmVjdG9yeSwgU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIGZpbGVMaXN0TmFtZSwgYm9vbGVhbiBnZW5lcmF0ZUZpbGVMaXN0LCBib29sZWFuIHN0cmlwVmVyc2lvbikgewotICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IG5ldyBGaWxlKHJlcG9zaXRvcnlEaXJlY3RvcnksIGRpcmVjdG9yeSk7Ci0gICAgICAgIHRoaXMuZmlsZUxpc3ROYW1lID0gZmlsZUxpc3ROYW1lOwotICAgICAgICB0aGlzLmdlbmVyYXRlRmlsZUxpc3QgPSBnZW5lcmF0ZUZpbGVMaXN0OwotICAgICAgICB0aGlzLnN0cmlwVmVyc2lvbiA9IHN0cmlwVmVyc2lvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGVwbG95KExvZyBsb2csIEFydGlmYWN0IGFydGlmYWN0KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpKTsKLSAgICAgICAgaWYgKCFzdHJpcFZlcnNpb24pIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIi0iKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYXJ0aWZhY3QuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgfQotICAgICAgICBidWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoYXJ0aWZhY3QuZ2V0VHlwZSgpKTsKLSAgICAgICAgU3RyaW5nIGRlc3RGaWxlTmFtZSA9IGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICBsb2cuaW5mbygiQWRkaW5nICIgKyBkZXN0RmlsZU5hbWUpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGaWxlKGFydGlmYWN0LmdldEZpbGUoKSwgbmV3IEZpbGUoZGlyZWN0b3J5LCBkZXN0RmlsZU5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjb3B5aW5nICIgKyBkZXN0RmlsZU5hbWUgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmlsZXMuYWRkKGRlc3RGaWxlTmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGZpbmlzaChMb2cgbG9nKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZW5lcmF0ZUZpbGVMaXN0ICYmICFmaWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJXcml0aW5nICIgKyBmaWxlTGlzdE5hbWUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGlyZWN0b3J5LCBmaWxlTGlzdE5hbWUpKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnXG4nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nICIgKyBmaWxlTGlzdE5hbWUgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvcmVwby9DcmVhdGVSZXBvc2l0b3J5TW9qby5qYXZhIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3JlcG8vQ3JlYXRlUmVwb3NpdG9yeU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiMGJiNS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvcmVwby9DcmVhdGVSZXBvc2l0b3J5TW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLm1hdmVuMi5yZXBvOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIEF4aXMyIHJlcG9zaXRvcnkgZnJvbSB0aGUgcHJvamVjdCdzIHJ1bnRpbWUgZGVwZW5kZW5jaWVzLiBUaGlzIGdvYWwgaXMgdHlwaWNhbGx5Ci0gKiB1c2VkIHRvIGJ1aWxkIGFuIEF4aXMyIHJlcG9zaXRvcnkgdGhhdCB3aWxsIGJlIHBhY2thZ2VkIGludG8gc29tZSBraW5kIG9mIGRpc3RyaWJ1dGlvbi4KLSAqIAotICogQGdvYWwgY3JlYXRlLXJlcG9zaXRvcnkKLSAqIEBwaGFzZSBwYWNrYWdlCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBydW50aW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVSZXBvc2l0b3J5TW9qbyBleHRlbmRzIEFic3RyYWN0Q3JlYXRlUmVwb3NpdG9yeU1vam8gewotICAgIC8qKgotICAgICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3JlcG9zaXRvcnkiCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNjb3BlKCkgewotICAgICAgICByZXR1cm4gQXJ0aWZhY3QuU0NPUEVfUlVOVElNRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi1yZXBvLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3JlcG8vQ3JlYXRlVGVzdFJlcG9zaXRvcnlNb2pvLmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvcmVwby9DcmVhdGVUZXN0UmVwb3NpdG9yeU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkNTYxMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvcmVwby9DcmVhdGVUZXN0UmVwb3NpdG9yeU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIucmVwbzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIEF4aXMyIHJlcG9zaXRvcnkgZnJvbSB0aGUgcHJvamVjdCdzIGRlcGVuZGVuY2llcyBpbiBzY29wZSB0ZXN0LiBUaGlzIGdvYWwgaXMKLSAqIHR5cGljYWxseSB1c2VkIHRvIGJ1aWxkIGFuIEF4aXMyIHJlcG9zaXRvcnkgZm9yIHVzZSBkdXJpbmcgdW5pdCB0ZXN0cy4gTm90ZSB0aGF0IHRoaXMgZ29hbAotICogaXMgc2tpcHBlZCBpZiB0aGUgPGNvZGU+bWF2ZW4udGVzdC5za2lwPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0gKiAKLSAqIEBnb2FsIGNyZWF0ZS10ZXN0LXJlcG9zaXRvcnkKLSAqIEBwaGFzZSBnZW5lcmF0ZS10ZXN0LXJlc291cmNlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gdGVzdAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlVGVzdFJlcG9zaXRvcnlNb2pvIGV4dGVuZHMgQWJzdHJhY3RDcmVhdGVSZXBvc2l0b3J5TW9qbyB7Ci0gICAgLyoqCi0gICAgICogVGhlIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSBjcmVhdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1yZXBvc2l0b3J5IgotICAgICAqLwotICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke21hdmVuLnRlc3Quc2tpcH0iCi0gICAgICogQHJlYWRvbmx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNraXA7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTY29wZSgpIHsKLSAgICAgICAgcmV0dXJuIEFydGlmYWN0LlNDT1BFX1RFU1Q7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBpZiAoc2tpcCkgewotICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiVGVzdHMgYXJlIHNraXBwZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzAwYTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcGFyZW50PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjUuMi1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxhcnRpZmFjdElkPmF4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gdG9vbCAtIFdTREwyQ29kZSBNYXZlbiBQbHVnaW48L25hbWU+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8ZGVzY3JpcHRpb24+VGhlIEF4aXMgMiBQbHVnaW4gZm9yIE1hdmVuIGFsbG93cyBjbGllbnQgc2lkZSBhbmQgc2VydmVyIHNpZGUgc291cmNlcyBmcm9tIGEgV1NETC48L2Rlc2NyaXB0aW9uPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbjwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWNvZGVnZW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIta2VybmVsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWFkYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1hZGItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXZhMndzZGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIteG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLQotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXRlc3RpbmctaGFybmVzczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3BvbS52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlc2V0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvdGVzdDEvdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL05hbWVzcGFjZVVSSU1hcHBpbmcuamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9OYW1lc3BhY2VVUklNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDRiMDcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL05hbWVzcGFjZVVSSU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIud3NkbDJjb2RlOwotCi0vKiogRGF0YSBjbGFzcyBmb3Igc3BlY2lmeWluZyBVUkktPlBhY2thZ2UgbWFwcGluZ3MuICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVVJJTWFwcGluZyB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJpLCBwYWNrYWdlTmFtZTsKLQotICAgIC8qKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUsIHRvIHdoaWNoIHRoZSBVUkkgc2hhbGwgYmUgbWFwcGVkLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgcGFja2FnZSBuYW1lLCB0byB3aGljaCB0aGUgVVJJIHNoYWxsIGJlIG1hcHBlZC4gKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShTdHJpbmcgcFBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHBhY2thZ2VOYW1lID0gcFBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBVUkksIHdoaWNoIHNoYWxsIGJlIG1hcHBlZC4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKLSAgICAgICAgcmV0dXJuIHVyaTsKLSAgICB9Ci0KLSAgICAvKiogU2V0cyB0aGUgVVJJLCB3aGljaCBzaGFsbCBiZSBtYXBwZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBwVXJpKSB7Ci0gICAgICAgIHVyaSA9IHBVcmk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL1dTREwyQ29kZU1vam8uamF2YSBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvbWF2ZW4yL3dzZGwyY29kZS9XU0RMMkNvZGVNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyY2IwMmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL1dTREwyQ29kZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIubWF2ZW4yLndzZGwyY29kZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5lcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotCi0vKioKLSAqIEBkZXNjcmlwdGlvbiBBIE1vam8gZm9yIGdlbmVyYXRpbmcgSmF2YSBzb3VyY2VzIGZyb20gYSBXU0RMLgotICogQGdvYWwgd3NkbDJjb2RlCi0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gdGVzdAotICovCi1wdWJsaWMgY2xhc3MgV1NETDJDb2RlTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbyB7Ci0gICAgLyoqCi0gICAgICogVGhlIG1hdmVuIHByb2plY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAgICogQHJlYWQtb25seQotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgV1NETCBmaWxlLCB3aGljaCBpcyBiZWluZyByZWFkLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS53c2RsRmlsZX0iIGRlZmF1bHQtdmFsdWU9InNyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbCIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB3c2RsRmlsZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5LCB3aGVyZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMgYXJlIGJlaW5nIGNyZWF0ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnRhcmdldH0iIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL2F4aXMyL3dzZGwyY29kZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogUGFja2FnZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgc291cmNlczsgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHBhY2thZ2Ugc3RydWN0dXJlIGJlbG93IHRoZQotICAgICAqIG91dHB1dCBkaXJlY3RvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnBhY2thZ2V9IgotICAgICAqIEByZXF1aXJlZAotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwotCi0gICAgLyoqCi0gICAgICogVGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIG9mIHRoZSBnZW5lcmF0ZWQgc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUubGFuZ3VhZ2V9IiBkZWZhdWx0LXZhbHVlPSJqYXZhIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRhdGFiaW5kaW5nIGZyYW1ld29yaywgd2hpY2ggaXMgYmVpbmcgdXNlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuZGF0YWJpbmRpbmdOYW1lfSIgZGVmYXVsdC12YWx1ZT0iYWRiIgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGRhdGFiaW5kaW5nTmFtZTsKLQotICAgIC8qKgotICAgICAqIFBvcnQgbmFtZSwgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIHNvdXJjZXMuIEJ5IGRlZmF1bHQsIHNvdXJjZXMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGFsbAotICAgICAqIHBvcnRzLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5wb3J0TmFtZX0iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXJ2aWNlIG5hbWUsIGZvciB3aGljaCB0byBnZW5lcmF0ZSBzb3VyY2VzLiBCeSBkZWZhdWx0LCBzb3VyY2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhbGwKLSAgICAgKiBzZXJ2aWNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuc2VydmljZU5hbWV9IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VOYW1lOwotCi0gICAgLyoqCi0gICAgICogTW9kZSwgZm9yIHdoaWNoIHNvdXJjZXMgYXJlIGJlaW5nIGdlbmVyYXRlZDsgZWl0aGVyIG9mICJzeW5jIiwgImFzeW5jIiBvciAiYm90aCIuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnN5bmNNb2RlfSIgZGVmYXVsdC12YWx1ZT0iYm90aCIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzeW5jTW9kZTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgc2VydmVyIHNpZGUgc291cmNlcyBhcmUgYmVpbmcgZ2VuZXJhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGV9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXJTaWRlOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBzb3VyY2VzIGZvciBhIHRlc3QgY2FzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVUZXN0Q2FzZX0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVRlc3RjYXNlOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0byBnZW5lcmF0ZSBhICJzZXJ2aWNlcy54bWwiIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmljZXNYbWx9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2aWNlc1htbDsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgc2ltcGx5IGFsbCBjbGFzc2VzLiBUaGlzIGlzIG9ubHkgdmFsaWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAqICJnZW5lcmF0ZVNlcnZlclNpZGUiLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZUFsbENsYXNzZXN9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVBbGxDbGFzc2VzOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0byB1bnBhY2sgY2xhc3Nlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUudW5wYWNrQ2xhc3Nlc30iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiB1bnBhY2tDbGFzc2VzOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0byBnZW5lcmF0ZSB0aGUgc2VydmVyIHNpZGUgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZVNlcnZlclNpZGVJbnRlcmZhY2V9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLnJlcG9zaXRvcnlQYXRofSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5UGF0aCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmV4dGVybmFsTWFwcGluZ30iCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZXJuYWxNYXBwaW5nID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUud3NkbFZlcnNpb259IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHdzZGxWZXJzaW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUudGFyZ2V0U291cmNlRm9sZGVyTG9jYXRpb259IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldFNvdXJjZUZvbGRlckxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUudGFyZ2V0UmVzb3VyY2VzRm9sZGVyTG9jYXRpb259IgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldFJlc291cmNlc0ZvbGRlckxvY2F0aW9uID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUudW53cmFwfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdW53cmFwID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmFsbFBvcnRzfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYWxsUG9ydHMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuYmFja3dhcmRDb21wYXRpYmxlfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYmFja3dhcmRDb21wYXRpYmxlID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLmZsYXR0ZW5GaWxlc30iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIiAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGZsYXR0ZW5GaWxlcyA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5za2lwTWVzc2FnZVJlY2VpdmVyfSIgZGVmYXVsdC12YWx1ZT0iZmFsc2UiICoKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2tpcE1lc3NhZ2VSZWNlaXZlciA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5za2lwQnVpbGRYTUx9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIgKgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwQnVpbGRYTUwgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuc2tpcFdTREx9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIgKgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwV1NETCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLndzZGwyY29kZS5vdmVyV3JpdGV9IiBkZWZhdWx0LXZhbHVlPSJmYWxzZSIgKgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyV3JpdGUgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtheGlzMi53c2RsMmNvZGUuc3VwcHJlc3NQcmVmaXhlc30iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIiAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzUHJlZml4ZXMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFNwZWNpZnkgZGF0YWJpbmRpbmcgc3BlY2lmaWMgZXh0cmEgb3B0aW9ucwotICAgICAqCi0gICAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2F4aXMyLmphdmEyd3NkbC5vcHRpb25zfSIKLSAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgb3B0aW9uczsKLQotICAgIC8qKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7YXhpczIud3NkbDJjb2RlLm5hbWVzcGFjZVRvUGFja2FnZXN9IiAqLwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVRvUGFja2FnZXMgPSBudWxsOwotCi0gICAgLyoqIEBwYXJhbWV0ZXIgKi8KLSAgICBwcml2YXRlIE5hbWVzcGFjZVVSSU1hcHBpbmdbXSBuYW1lc3BhY2VVUklzID0gbnVsbDsKLQotICAgIC8qKiBGaWxscyB0aGUgb3B0aW9uIG1hcC4gVGhpcyBtYXAgaXMgcGFzc2VkIG9udG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBBUEkgdG8gZ2VuZXJhdGUgdGhlIGNvZGUuICovCi0gICAgcHJpdmF0ZSBNYXAgZmlsbE9wdGlvbk1hcCgpIHRocm93cyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAgICAgLy9XU0RMIGZpbGUgbmFtZQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLldTRExfTE9DQVRJT05fVVJJX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KHdzZGxGaWxlKSkpOwotICAgICAgICAvL291dHB1dCBsb2NhdGlvbgotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkob3V0cHV0RGlyZWN0b3J5LmdldFBhdGgoKSkpKTsKLSAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgICAgIC8vIERhdGFiaW5kaW5nIHR5cGUKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5EQVRBX0JJTkRJTkdfVFlQRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmdBcnJheShkYXRhYmluZGluZ05hbWUpKSk7Ci0KLSAgICAgICAgaWYgKCJhc3luYyIuZXF1YWxzKHN5bmNNb2RlKSkgewotICAgICAgICAgICAgLy8gQXN5bmMgb25seSBvcHRpb24gLSBmb3JjaW5nIHRvIGdlbmVyYXRlIGFzeW5jIG1ldGhvZHMgb25seQotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fQVNZTkNfT05MWV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9BU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoInN5bmMiLmVxdWFscyhzeW5jTW9kZSkpIHsKLSAgICAgICAgICAgIC8vIFN5bmMgb25seSBvcHRpb24gLSBmb3JjaW5nIHRvIGdlbmVyYXRlIFN5bmMgbWV0aG9kcyBvbmx5Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuQ09ERUdFTl9TWU5DX09OTFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkNPREVHRU5fU1lOQ19PTkxZX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoImJvdGgiLmVxdWFscyhzeW5jTW9kZSkpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigiSW52YWxpZCBzeW5jTW9kZTogIiArIHN5bmNNb2RlICsKLSAgICAgICAgICAgICAgICAgICAgIiwgZXhwZWN0ZWQgZWl0aGVyIG9mICdzeW5jJywgJ2FzeW5jJyBvciAnYm90aCcuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvL1BhY2thZ2UKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nQXJyYXkocGFja2FnZU5hbWUpKSk7Ci0KLSAgICAgICAgLy9zdHViIGxhbmd1YWdlCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNUVUJfTEFOR1VBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVFVCX0xBTkdVQUdFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0cmluZ0FycmF5KGxhbmd1YWdlKSkpOwotCi0gICAgICAgIC8vc2VydmVyIHNpZGUgYW5kIGdlbmVyYXRlIHNlcnZpY2VzLnhtbCBvcHRpb25zCi0gICAgICAgIGlmIChnZW5lcmF0ZVNlcnZlclNpZGUpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0KLSAgICAgICAgICAgIC8vc2VydmljZXMgWE1MIGdlbmVyYXRpb24gLSBlZmZlY3RpdmUgb25seSB3aGVuIHNwZWNpZmllZCBhcyB0aGUgc2VydmVyIHNpZGUKLSAgICAgICAgICAgIGlmIChnZW5lcmF0ZVNlcnZpY2VzWG1sKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuR0VORVJBVEVfU0VSVklDRV9ERVNDUklQVElPTl9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9nZW5lcmF0ZSBhbGwgb3B0aW9uIC0gT25seSB2YWxpZCB3aGVuIGdlbmVyYXRpbmcgc2VydmVyc2lkZSBjb2RlCi0gICAgICAgICAgICBpZiAoZ2VuZXJhdGVBbGxDbGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9BTExfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuR0VORVJBVEVfQUxMX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvL2dlbmVyYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgICAgaWYgKGdlbmVyYXRlVGVzdGNhc2UpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1RFU1RfQ0FTRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9VbndyYXAgY2xhc3NlcyBvcHRpb24gLSB0aGlzIGRldGVybWluZXMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgYXJlIGluc2lkZSB0aGUgc3R1Yi9NUgotICAgICAgICAvL29yIGdldHMgZ2VuZXJhdGVzIGFzIHNlcGVyYXRlIGNsYXNzZXMKLSAgICAgICAgaWYgKHVucGFja0NsYXNzZXMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTlBBQ0tfQ0xBU1NFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuVU5QQUNLX0NMQVNTRVNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vc2VydmVyIHNpZGUgaW50ZXJmYWNlIG9wdGlvbgotICAgICAgICBpZiAoZ2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfSU5URVJGQUNFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9JTlRFUkZBQ0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1bndyYXApIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSUywKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5VTldSQVBfUEFSQU1FVEVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWxsUG9ydHMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5BbGxfUE9SVFNfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkFsbF9QT1JUU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJhY2t3YXJkQ29tcGF0aWJsZSkgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkJBQ0tXT1JEX0NPTVBBVElCSUxJVFlfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmbGF0dGVuRmlsZXMpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5GTEFUVEVOX0ZJTEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5GTEFUVEVOX0ZJTEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcE1lc3NhZ2VSZWNlaXZlcikgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX01FU1NBR0VfUkVDRUlWRVJfT1BUSU9OX0xPTkcsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fTUVTU0FHRV9SRUNFSVZFUl9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcEJ1aWxkWE1MKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuTk9fQlVJTERfWE1MX09QVElPTl9MT05HLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5PX0JVSUxEX1hNTF9PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2tpcFdTREwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19XU0RMU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OT19XU0RMU19PUFRJT05fTE9ORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3ZlcldyaXRlKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuT1ZFUlJJREVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk9WRVJSSURFX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3VwcHJlc3NQcmVmaXhlcykgewotICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlNVUFBSRVNTX1BSRUZJWEVTX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TVVBQUkVTU19QUkVGSVhFU19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlcG9zaXRvcnlQYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVBPU0lUT1JZX1BBVEhfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlJFUE9TSVRPUllfUEFUSF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde3JlcG9zaXRvcnlQYXRofSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV4dGVybmFsTWFwcGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhURVJOQUxfTUFQUElOR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuRVhURVJOQUxfTUFQUElOR19PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde2V4dGVybmFsTWFwcGluZ30pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3c2RsVmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9WRVJTSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX1ZFUlNJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXt3c2RsVmVyc2lvbn0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU09VUkNFX0ZPTERFUl9OQU1FX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TT1VSQ0VfRk9MREVSX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXt0YXJnZXRTb3VyY2VGb2xkZXJMb2NhdGlvbn0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuUkVTT1VSQ0VfRk9MREVSX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5SRVNPVVJDRV9GT0xERVJfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXt0YXJnZXRSZXNvdXJjZXNGb2xkZXJMb2NhdGlvbn0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG9wdGlvbnMgIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvcHRpb25zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5FWFRSQV9PUFRJT05UWVBFX1BSRUZJWCArIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117dmFsdWV9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWSUNFX05BTUVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgc2VydmljZU5hbWUgfSkpOwotCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLlBPUlRfTkFNRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBwb3J0TmFtZSB9KSk7Ci0gICAgICAgIC8vIHNldCB0aGUgbmFtZXNwYWNlcwotICAgICAgICBpZiAoISgobmFtZXNwYWNlVG9QYWNrYWdlcyA9PSBudWxsKSAmJiAobmFtZXNwYWNlVVJJcyA9PSBudWxsKSkpIHsKLSAgICAgICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5OQU1FX1NQQUNFX1RPX1BBQ0tBR0VfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLk5BTUVfU1BBQ0VfVE9fUEFDS0FHRV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgZ2V0TmFtZXNwYWNlVG9QYWNrYWdlc01hcCgpIH0pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3B0aW9uTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWVzcGFjZVRvUGFja2FnZXNNYXAoKSB0aHJvd3MgTW9qb0ZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VUb1BhY2thZ2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuYW1lc3BhY2VUb1BhY2thZ2VzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZXNwYWNlVVJJcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZVVSSXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOYW1lc3BhY2VVUklNYXBwaW5nIG1hcHBpbmcgPSBuYW1lc3BhY2VVUklzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBtYXBwaW5nLmdldFVyaSgpOwotICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZyByZXF1aXJlcyBhbiB1cmkgY2hpbGQgZWxlbWVudC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaVBhY2thZ2VOYW1lID0gbWFwcGluZy5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICh1cmlQYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBuYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5nIHJlcXVpcmVzIGEgcGFja2FnZU5hbWUgY2hpbGQgZWxlbWVudC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHVyaSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHVyaVBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKHNiLmxlbmd0aCgpICE9IDApID8gc2IudG9TdHJpbmcoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgdG8gY29udmVydCBhIHN0cmluZyBpbnRvIGEgc2luZ2xlIGl0ZW0gc3RyaW5nW10KLSAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmdbXS4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgICAgICB2YWx1ZXNbMF0gPSB2YWx1ZTsKLSAgICAgICAgcmV0dXJuIHZhbHVlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9GYWlsdXJlRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQotICAgICAgICBmaXhDb21waWxlU291cmNlUm9vdHMoKTsKLSAgICAgICAgc2hvd0RlcGVuZGVuY2llcygpOwotCi0gICAgICAgIE1hcCBjb21tYW5kTGluZU9wdGlvbnMgPSB0aGlzLmZpbGxPcHRpb25NYXAoKTsKLSAgICAgICAgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIgcGFyc2VyID0KLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb25QYXJzZXIoY29tbWFuZExpbmVPcHRpb25zKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShwYXJzZXIpLmdlbmVyYXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZTsKLSAgICAgICAgICAgIHdoaWxlICh0LmdldENhdXNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHQgPSB0LmdldENhdXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNob3dEZXBlbmRlbmNpZXMoKSB7Ci0gICAgICAgIExvZyBsb2cgPSBnZXRMb2coKTsKLSAgICAgICAgaWYgKCFsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxvZy5kZWJ1ZygiVGhlIHByb2plY3RzIGRlcGVuZGVuY3kgYXJ0aWZhY3RzIGFyZTogIik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHByb2plY3QuZ2V0RGVwZW5kZW5jeUFydGlmYWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIiAgICAiICsgYXJ0aWZhY3QuZ2V0R3JvdXBJZCgpICsgIjoiICsgYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpICsKLSAgICAgICAgICAgICAgICAgICAgIjoiICsgYXJ0aWZhY3QuZ2V0VmVyc2lvbigpICsgIjoiICsgYXJ0aWZhY3QuZ2V0Q2xhc3NpZmllcigpICsKLSAgICAgICAgICAgICAgICAgICAgIjoiICsgYXJ0aWZhY3QuZ2V0U2NvcGUoKSArICI6IiArIGFydGlmYWN0LmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nLmRlYnVnKCJUaGUgcHJvamVjdHMgdHJhbnNpdGl2ZSBhcnRpZmFjdHMgYXJlOiAiKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCIgICAgIiArIGFydGlmYWN0LmdldEdyb3VwSWQoKSArICI6IiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSArCi0gICAgICAgICAgICAgICAgICAgICI6IiArIGFydGlmYWN0LmdldFZlcnNpb24oKSArICI6IiArIGFydGlmYWN0LmdldENsYXNzaWZpZXIoKSArCi0gICAgICAgICAgICAgICAgICAgICI6IiArIGFydGlmYWN0LmdldFNjb3BlKCkgKyAiOiIgKyBhcnRpZmFjdC5nZXRUeXBlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpeENvbXBpbGVTb3VyY2VSb290cygpIHsKLSAgICAgICAgRmlsZSBzcmNEaXIgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnksICJzcmMiKTsKLSAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChzcmNEaXIuZ2V0UGF0aCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWd1cmF0aW9uLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkYTgzNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZ3VyYXRpb24uYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotQ29uZmlndXJhdGlvbgotCi0gIFRoZSBXU0RMMkNvZGUgZ29hbCB0YWtlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXMgaW5wdXQuIEFsbCBwYXJhbWV0ZXJzIGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGJ5IHVzaW5nCi0gIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCB0aGUgcGFyYW1ldGVyICJnZW5lcmF0ZVNlcnZlclNpZGUiIG1heSBiZSBzZXQgdXNpbmcgdGhlIHByb3BlcnR5Ci0gICJheGlzMi53c2RsMmNvZGUuZ2VuZXJhdGVTZXJ2ZXJTaWRlIi4gSWYgdGhlIHBhcmFtZXRlciBpc24ndCBzZXQgdmlhIHByb3BlcnR5IG9yIGluIHRoZSBQT00sIHRoZW4gYSBkZWZhdWx0Ci0gIHZhbHVlIGFwcGxpZXMuCi0KLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBQYXJhbWV0ZXIgbmFtZSAgICAgICAgICAgICAgfCBDb21tYW5kIGxpbmUgcHJvcGVydHkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBkYXRhYmluZGluZ05hbWUgICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5kYXRhYmluZGluZ05hbWV9ICAgICAgICAgICAgIHwgRGF0YSBiaW5kaW5nIGZyYW1ld29yaywgd2hpY2ggaXMgYmVpbmcgdXNlZCBieSB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFkYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMuICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBnZW5lcmF0ZUFsbENsYXNzZXMgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5nZW5lcmF0ZUFsbENsYXNzZXN9ICAgICAgICAgIHwgV2hldGhlciB0byBnZW5lcmF0ZSBzaW1wbHkgYWxsIGNsYXNzZXMuIFRoaXMgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpcyBvbmx5IHZhbGlkIGluIGNvbmp1bmN0aW9uIHdpdGggICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJnZW5lcmF0ZVNlcnZlclNpZGUiLiAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGdlbmVyYXRlU2VydmVyU2lkZSAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmVyU2lkZX0gICAgICAgICAgfCBXaGV0aGVyIHNlcnZlciBzaWRlIHNvdXJjZXMgYXJlIGJlaW5nICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZSB8ICR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZX0gfCBXaGV0aGVyIHRvIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgc2lkZSAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGdlbmVyYXRlU2VydmljZXNYbWwgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlU2VydmljZXNYbWx9ICAgICAgICAgfCBXaGV0aGVyIGEgInNlcnZpY2VzLnhtbCIgZmlsZSBpcyBiZWluZyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGdlbmVyYXRlVGVzdGNhc2UgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLmdlbmVyYXRlVGVzdENhc2V9ICAgICAgICAgICAgfCBXaGV0aGVyIGEgdGVzdCBjYXNlIGlzIGJlaW5nIGdlbmVyYXRlZC4gICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IGxhbmd1YWdlICAgICAgICAgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLmxhbmd1YWdlfSAgICAgICAgICAgICAgICAgICAgfCBQcm9ncmFtbWluZyBsYW5ndWFnZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMuIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgamF2YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IG5hbWVzcGFjZVRvUGFja2FnZXMgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLm5hbWVzcGFjZVRvUGFja2FnZXN9ICAgICAgICAgfCBNYXAgb2YgbmFtZXNwYWNlIFVSSSB0byBwYWNrYWdlcyBpbiB0aGUgZm9ybWF0IHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVyaTE9cGFja2FnZTEsdXJpMj1wYWNrYWdlMiwuLi4gICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVXNpbmcgdGhpcyBwYXJhbWV0ZXIgaXMgZGlzY291cmFnZWQuIEluICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmFsLCB5b3Ugc2hvdWxkIHVzZSB0aGUgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZVVyaXMgcGFyYW1ldGVyLiBIb3dldmVyLCB0aGUgbGF0dGVyICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2Fubm90IGJlIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgbmFtZXNwYWNlVVJJcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1hcCBvZiBuYW1lc3BhY2UgVVJJIHRvIHBhY2thZ2VzLiBFeGFtcGxlOiAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXDxuYW1lc3BhY2VVUklzXD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFw8bmFtZXNwYWNlVVJJXD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBcPHVyaVw+dXJpMVw8L3VyaTFcPiAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIFw8cGFja2FnZVw+cGFja2FnZTFcPC9wYWNrYWdlXD4gICAgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFw8L25hbWVzcGFjZVVSSVw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXDwvbmFtZXNwYWNlVVJJc1w+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgb3V0cHV0RGlyZWN0b3J5ICAgICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUudGFyZ2V0fSAgICAgICAgICAgICAgICAgICAgICB8IFRhcmdldCBkaXJlY3RvcnksIHdoZXJlIHNvdXJjZXMgYXJlIGJlaW5nICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvYXhpczIvd3NkbDJjb2RlICAgICAgIHwgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgcGFja2FnZU5hbWUgICAgICAgICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUucGFja2FnZX0gICAgICAgICAgICAgICAgICAgICB8IFBhY2thZ2UgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMuICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHBvcnROYW1lICAgICAgICAgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLnBvcnROYW1lfSAgICAgICAgICAgICAgICAgICAgfCBQb3J0IG5hbWUsIGZvciB3aGljaCBzb3VyY2VzIGFyZSBiZWluZyAgICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdlbmVyYXRlZC4gQnkgZGVmYXVsdCwgc291cmNlcyBhcmUgZ2VuZXJhdGVkICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9yIGFsbCBwb3J0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLXwgc2VydmljZU5hbWUgICAgICAgICAgICAgICAgIHwgJHtheGlzMi53c2RsMmNvZGUuc2VydmljZU5hbWV9ICAgICAgICAgICAgICAgICB8IFNlcnZpY2UgbmFtZSwgZm9yIHdoaWNoIHNvdXJjZXMgYXJlIGJlaW5nICAgICAgfAotfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2VuZXJhdGVkLiBCeSBkZWZhdWx0LCBzb3VyY2VzIGFyZSBnZW5lcmF0ZWQgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmb3IgYWxsIHNlcnZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotfCBzeW5jTW9kZSAgICAgICAgICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS5zeW5jTW9kZX0gICAgICAgICAgICAgICAgICAgIHwgU3luYyBtb2RlLCBmb3Igd2hpY2ggc291cmNlcyBhcmUgYmVpbmcgICAgICAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJvdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnZW5lcmF0ZWQ7IGVpdGhlciBvZiAic3luYyIsICJhc3luYyIsIG9yICAgICAgIHwKLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJib3RoIiAoZGVmYXVsdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi18IHVucGFja0NsYXNzZXMgICAgICAgICAgICAgICB8ICR7YXhpczIud3NkbDJjb2RlLnVucGFja0NsYXNzZXN9ICAgICAgICAgICAgICAgfCBXaGV0aGVyIHRvIHVucGFjayBjbGFzc2VzLiAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotfCB3c2RsRmlsZSAgICAgICAgICAgICAgICAgICAgfCAke2F4aXMyLndzZGwyY29kZS53c2RsfSAgICAgICAgICAgICAgICAgICAgICAgIHwgTG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZSwgd2hpY2ggaXMgcmVhZCBhcyAgICB8Ci18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbCAgICAgICAgICAgICAgICAgICAgfCBpbnB1dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9nb2Fscy5hcHQgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2dvYWxzLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlMGY2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvYXB0L2dvYWxzLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSAtLS0tLS0KLSBNYXZlbiAyIFdTREwyQ29kZSBQbHVnaW46IGNvbmZpZ3VyYXRpb24gZXhhbXBsZXMKLSAtLS0tLS0KLSBKb2NoZW4gV2llZG1hbm4gCi0gPGpvY2hlbi53aWVkbWFubkBnbWFpbC5jb20+Ci0gLS0tLS0tCi0KLUdvYWxzCi0KLSAgVGhlIFdTRGwyQ29kZSBvZmZlcnMgYSBzaW5nbGUgZ29hbDoKLQotICAgKiB3c2RsMmNvZGUgKGRlZmF1bHQpOiBSZWFkcyB0aGUgV1NETCBhbmQgZ2VuZXJhdGVzIGNvZGUuCi0KLSAgVG8gcnVuIHRoZSBwbHVnaW4sIGFkZCB0aGUgZm9sbG93aW5nIHNlY3Rpb24gdG8geW91ciBQT006Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyLm1hdmVuMjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+d3NkbDJjb2RlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5jb20uZm9vLm15c2VydmljZTwvcGFja2FnZU5hbWU+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBUaGUgcGx1Z2luIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5IGluIHRoZSBnZW5lcmF0ZS1zb3VyY2VzCi0gIHBoYXNlLiBZb3UgY2FuIGFsc28gaW52b2tlIGl0IGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZSBieQotICBydW5uaW5nIHRoZSBjb21tYW5kCi0KLSstLS0tLS0tLQotICBtdm4gd3NkbDJjb2RlOndzZGwyY29kZQotKy0tLS0tLS0tLQotCi0KLVRoZSBXU0RMMkNvZGUgR29hbAotCi0gIEJ5IGRlZmF1bHQsIHRoZSBwbHVnaW4gcmVhZHMgdGhlIGZpbGUgPDw8c3JjL21haW4vYXhpczIvc2VydmljZS53c2RsPj4+LgotICBTb3VyY2VzIGZvciB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZSBhbmQgdGhlIEFEQiBkYXRhIGJpbmRpbmcgYXJlCi0gIGdlbmVyYXRlZCBpbnRvIDw8PHRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9heGlzMi93c2RsMmNvZGU+Pj4uCi0gIE5vdGUgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCA8PDxwYWNrYWdlTmFtZT4+PiBhYm92ZSwgd2hpY2ggc2V0cwotICB0aGUgcGFja2FnZSBuYW1lLCB0aHVzIGEgc3ViZGlyZWN0b3J5LgotCi0gIFNlZSB0aGUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvbiB7e3tjb25maWd1cmF0aW9uLmh0bWx9cHJvcGVydGllc319IGZvcgotICBob3cgdG8gY29uZmlndXJlIHRoZSBnb2FsLgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0IGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL2FwdC9pbnRyb2R1Y3Rpb24uYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFkZGQ5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW50cm9kdWN0aW9uLmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSAtLS0tLS0KLSBNYXZlbiAyIFdTREwyQ29kZSBQbHVnaW4KLSAtLS0tLS0KLSBKb2NoZW4gV2llZG1hbm4KLSA8am9jaGVuLndpZWRtYW5uQGdtYWlsLmNvbT4KLSAtLS0tLS0KLQotSW50cm9kdWN0aW9uCi0KLSAgVGhpcyBwbHVnaW4gdGFrZXMgYXMgaW5wdXQgYSBXU0RMIGFuZCBnZW5lcmF0ZXMgY2xpZW50Ci0gIGFuZCBzZXJ2ZXIgc3R1YnMgZm9yIGNhbGxpbmcgb3IgaW1wbGVtZW50aW5nIGEgd2ViIHNlcnZpY2UKLSAgbWF0Y2hpbmcgdGhlIFdTREwuCi0KLSAgVGhlIGZ1bGwgZGVzY3JpcHRpb24gb2YgZ29hbHMgaXMgYXZhaWxhYmxlIHt7e2dvYWxzLmh0bWx9aGVyZX19LgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODIwZTRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBuYW1lPSJNYXZlbiBBeGlzIDIgV1NETDJDb2RlIFBsdWdpbiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPk1hdmVuIEF4aXMgMiBXU0RMMkNvZGUgUGx1Z2luPC9uYW1lPgotICAgIDxzcmM+aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW1hZ2VzL2FwYWNoZS1tYXZlbi1wcm9qZWN0LnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLzwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotICA8YmFubmVyUmlnaHQ+Ci0gICAgPHNyYz5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9pbWFnZXMvbWF2ZW4tc21hbGwuZ2lmPC9zcmM+Ci0gIDwvYmFubmVyUmlnaHQ+Ci0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iV2Vic2VydmljZXMiIGhyZWY9Imh0dHA6Ly93cy5hcGFjaGUub3JnLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXhpcyAyIiBocmVmPSJodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8iLz4KLSAgICAgIDxpdGVtIG5hbWU9Ik1hdmVuIDIiIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuMi8iLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iT3ZlcnZpZXciPgotICAgICAgPGl0ZW0gbmFtZT0iSW50cm9kdWN0aW9uIiBocmVmPSJpbnRyb2R1Y3Rpb24uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iSG93IHRvIFVzZSIgaHJlZj0iaG93dG8uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQ29uZmlndXJhdGlvbiIgaHJlZj0iY29uZmlndXJhdGlvbi5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgICR7cmVwb3J0c30KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9heGlzMi9tYXZlbjIvd3NkbDJjb2RlL1dTREwyQ29kZU1vam9UZXN0LmphdmEgYi8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi93c2RsMmNvZGUvV1NETDJDb2RlTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5ZDg3Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2F4aXMyL21hdmVuMi93c2RsMmNvZGUvV1NETDJDb2RlTW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi5tYXZlbjIud3NkbDJjb2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi50ZXN0aW5nLnN0dWJzLk1hdmVuUHJvamVjdFN0dWI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLS8qKiBUZXN0IGNsYXNzIGZvciBydW5uaW5nIHRoZSB3c2RsMmNvZGUgbW9qby4gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkNvZGVNb2pvVGVzdCBleHRlbmRzIEFic3RyYWN0TW9qb1Rlc3RDYXNlIHsKLSAgICAvKiogVGVzdHMgcnVubmluZyB0aGUgamF2YSBnZW5lcmF0b3IuICovCi0gICAgcHVibGljIHZvaWQgdGVzdEphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcnVuVGVzdCgic3JjL3Rlc3QvdGVzdDEiLCAid3NkbDJjb2RlIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFdTREwyQ29kZU1vam8gbmV3TW9qbyhTdHJpbmcgcERpciwgU3RyaW5nIHBHb2FsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBiYXNlRGlyID0gbmV3IEZpbGUobmV3IEZpbGUoZ2V0QmFzZWRpcigpKSwgcERpcik7Ci0gICAgICAgIEZpbGUgdGVzdFBvbSA9IG5ldyBGaWxlKGJhc2VEaXIsICJwb20ueG1sIik7Ci0gICAgICAgIFdTREwyQ29kZU1vam8gbW9qbyA9IChXU0RMMkNvZGVNb2pvKWxvb2t1cE1vam8ocEdvYWwsIHRlc3RQb20pOwotICAgICAgICBNYXZlblByb2plY3RTdHViIHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0U3R1YigpOwotICAgICAgICBwcm9qZWN0LnNldERlcGVuZGVuY3lBcnRpZmFjdHMobmV3IEhhc2hTZXQoKSk7Ci0gICAgICAgIHNldFZhcmlhYmxlVmFsdWVUb09iamVjdChtb2pvLCAicHJvamVjdCIsIHByb2plY3QpOwotICAgICAgICBzZXRWYXJpYWJsZVZhbHVlVG9PYmplY3QobW9qbywgIndzZGxGaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJhc2VEaXIsICJzcmMvbWFpbi9heGlzMi9zZXJ2aWNlLndzZGwiKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIHNldFZhcmlhYmxlVmFsdWVUb09iamVjdChtb2pvLCAib3V0cHV0RGlyZWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJhc2VEaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvYXhpczIvd3NkbDJjb2RlIikpOwotICAgICAgICBzZXRWYXJpYWJsZVZhbHVlVG9PYmplY3QobW9qbywgInN5bmNNb2RlIiwgImJvdGgiKTsKLSAgICAgICAgc2V0VmFyaWFibGVWYWx1ZVRvT2JqZWN0KG1vam8sICJkYXRhYmluZGluZ05hbWUiLCAiYWRiIik7Ci0gICAgICAgIHNldFZhcmlhYmxlVmFsdWVUb09iamVjdChtb2pvLCAibGFuZ3VhZ2UiLCAiamF2YSIpOwotICAgICAgICByZXR1cm4gbW9qbzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KFN0cmluZyBwRGlyLCBTdHJpbmcgcEdvYWwpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3TW9qbyhwRGlyLCBwR29hbCkuZXhlY3V0ZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0ODA0Zi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLQotIyBTZXQgcm9vdCBjYXRlZ29yeSBwcmlvcml0eSB0byBJTkZPIGFuZCBpdHMgb25seSBhcHBlbmRlciB0byBDT05TT0xFLgotbG9nNGoucm9vdENhdGVnb3J5PUlORk8sIENPTlNPTEUKLSNsb2c0ai5yb290Q2F0ZWdvcnk9SU5GTywgQ09OU09MRSwgTE9HRklMRQotCi0jIFNldCB0aGUgZW50ZXJwcmlzZSBsb2dnZXIgcHJpb3JpdHkgdG8gRkFUQUwKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmF4aXMyLmVudGVycHJpc2U9RkFUQUwKLWxvZzRqLmxvZ2dlci5kZS5odW5zaWNrZXIuamFsb3B5LmlvPUZBVEFMCi1sb2c0ai5sb2dnZXIuaHR0cGNsaWVudC53aXJlLmhlYWRlcj1GQVRBTAotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PUZBVEFMCi0KLSMgQ09OU09MRSBpcyBzZXQgdG8gYmUgYSBDb25zb2xlQXBwZW5kZXIgdXNpbmcgYSBQYXR0ZXJuTGF5b3V0LgotbG9nNGouYXBwZW5kZXIuQ09OU09MRT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQ09OU09MRS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5DT05TT0xFLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZCAlLTVwICVjIC0gJW0lbgotCi0jIExPR0ZJTEUgaXMgc2V0IHRvIGJlIGEgRmlsZSBhcHBlbmRlciB1c2luZyBhIFBhdHRlcm5MYXlvdXQuCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFPW9yZy5hcGFjaGUubG9nNGouRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkZpbGU9YXhpczIubG9nCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLkFwcGVuZD10cnVlCi1sb2c0ai5hcHBlbmRlci5MT0dGSUxFLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkxPR0ZJTEUubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVkIFsldF0gJS01cCAlYyAleCAtICVtJW4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC90ZXN0MS9wb20ueG1sIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NTI5NmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyLm1hdmVuMjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luLXRlc3QxPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDxuYW1lPlRlc3QgMSBvZiB0aGUgYXhpczItd3NkbDJjb2RlLW1hdmVuLXBsdWdpbjwvbmFtZT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxnZW5lcmF0ZVNlcnZlclNpZGU+dHJ1ZTwvZ2VuZXJhdGVTZXJ2ZXJTaWRlPgotICAgICAgICAgICAgICAgICAgICA8Z2VuZXJhdGVTZXJ2ZXJTaWRlSW50ZXJmYWNlPnRydWU8L2dlbmVyYXRlU2VydmVyU2lkZUludGVyZmFjZT4KLSAgICAgICAgICAgICAgICAgICAgPGdlbmVyYXRlQWxsQ2xhc3Nlcz50cnVlPC9nZW5lcmF0ZUFsbENsYXNzZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxnZW5lcmF0ZVNlcnZpY2VzWG1sPnRydWU8L2dlbmVyYXRlU2VydmljZXNYbWw+Ci0gICAgICAgICAgICAgICAgICAgIDxwYWNrYWdlTmFtZT5kZW1vPC9wYWNrYWdlTmFtZT4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvdGVzdDEvc3JjL21haW4vYXhpczIvc2VydmljZS53c2RsIGIvMV81L21vZHVsZXMvdG9vbC9heGlzMi13c2RsMmNvZGUtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Rlc3QxL3NyYy9tYWluL2F4aXMyL3NlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4MjZkMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvdGVzdDEvc3JjL21haW4vYXhpczIvc2VydmljZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMKLSAgICB4bWxuczpheGlzMj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiCi0gICAgeG1sbnM6bnMxPSJodHRwOi8vb3JnLmFwYWNoZS5heGlzMi94c2QiCi0gICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICB4bWxuczpucz0iaHR0cDovL2F4aXN2ZXJzaW9uLnNhbXBsZS94c2QiCi0gICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOnNvYXAxMj0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwMTIvIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIiPgotICA8d3NkbDpkb2N1bWVudGF0aW9uPgotICAgIHhEV1Mgc2VydmljZSBleGFtcGxlCi0gIDwvd3NkbDpkb2N1bWVudGF0aW9uPgotICA8d3NkbDp0eXBlcz4KLSAgICA8eHM6c2NoZW1hCi0gICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vYXhpc3ZlcnNpb24uc2FtcGxlL3hzZCI+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21tYW5kcyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZS8+Ci0gICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICA8eHM6ZWxlbWVudCBuYW1lPSJjb21tYW5kc1Jlc3BvbnNlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlLz4KLSAgICAgIDwveHM6ZWxlbWVudD4KLSAgICA8L3hzOnNjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNvbW1hbmRzTWVzc2FnZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnM6Y29tbWFuZHMiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY29tbWFuZHNSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJ0MSIgZWxlbWVudD0ibnM6Y29tbWFuZHNSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iYXhpczItdGVzdC0wLjAuMVBvcnRUeXBlIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY29tbWFuZHMiPgotICAgICAgPHdzZGw6aW5wdXQKLSAgICAgICAgICB4bWxuczp3c2F3PSJodHRwOi8vd3d3LnczLm9yZy8yMDA2LzA1L2FkZHJlc3Npbmcvd3NkbCIKLSAgICAgICAgICBtZXNzYWdlPSJheGlzMjpjb21tYW5kc01lc3NhZ2UiCi0gICAgICAgICAgd3NhdzpBY3Rpb249InVybjpjb21tYW5kcyIvPgotICAgICAgPHdzZGw6b3V0cHV0Ci0gICAgICAgICAgeG1sbnM6d3Nhdz0iaHR0cDovL3d3dy53My5vcmcvMjAwNi8wNS9hZGRyZXNzaW5nL3dzZGwiCi0gICAgICAgICAgbWVzc2FnZT0iYXhpczI6Y29tbWFuZHNSZXNwb25zZSIKLSAgICAgICAgICB3c2F3OkFjdGlvbj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIveERXU1BvcnRUeXBlL2NvbW1hbmRzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iYXhpczItdGVzdC0wLjAuMVNPQVAxMUJpbmRpbmciIHR5cGU9ImF4aXMyOmF4aXMyLXRlc3QtMC4wLjFQb3J0VHlwZSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNvbW1hbmRzIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJ1cm46Y29tbWFuZHMiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFTT0FQMTJCaW5kaW5nIiB0eXBlPSJheGlzMjpheGlzMi10ZXN0LTAuMC4xUG9ydFR5cGUiPgotICAgIDxzb2FwMTI6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImNvbW1hbmRzIj4KLSAgICAgIDxzb2FwMTI6b3BlcmF0aW9uIHNvYXBBY3Rpb249InVybjpjb21tYW5kcyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFIdHRwQmluZGluZyIgdHlwZT0iYXhpczI6YXhpczItdGVzdC0wLjAuMVBvcnRUeXBlIj4KLSAgICA8aHR0cDpiaW5kaW5nIHZlcmI9IlBPU1QiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iY29tbWFuZHMiPgotICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSJjb21tYW5kcyIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0idGV4dC94bWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJ0ZXh0L3htbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJheGlzMi10ZXN0LTAuMC4xIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFTT0FQMTFwb3J0X2h0dHAiIGJpbmRpbmc9ImF4aXMyOmF4aXMyLXRlc3QtMC4wLjFTT0FQMTFCaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly8xOTIuMTY4LjEzNi4zOjgwODAvYXhpczItd2ViYXBwL3NlcnZpY2VzL2F4aXMyLXRlc3QtMC4wLjEiLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgICA8d3NkbDpwb3J0IG5hbWU9ImF4aXMyLXRlc3QtMC4wLjFTT0FQMTJwb3J0X2h0dHAiIGJpbmRpbmc9ImF4aXMyOmF4aXMyLXRlc3QtMC4wLjFTT0FQMTJCaW5kaW5nIj4KLSAgICAgIDxzb2FwMTI6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovLzE5Mi4xNjguMTM2LjM6ODA4MC9heGlzMi13ZWJhcHAvc2VydmljZXMvYXhpczItdGVzdC0wLjAuMSIvPgotICAgIDwvd3NkbDpwb3J0PgotICAgIDx3c2RsOnBvcnQgbmFtZT0iYXhpczItdGVzdC0wLjAuMUh0dHBwb3J0MCIgYmluZGluZz0iYXhpczI6YXhpczItdGVzdC0wLjAuMUh0dHBCaW5kaW5nIj4KLSAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly8xOTIuMTY4LjEzNi4zOjgwODAvYXhpczItd2ViYXBwL3Jlc3QvYXhpczItdGVzdC0wLjAuMSIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvdG9vbC9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhiZGZlZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCBiYXNlZGlyPSIuIiBkZWZhdWx0PSJoZWxwIj4KLQotICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQuZm9sZGVyIiB2YWx1ZT0iLi90YXJnZXQvZWNsaXBzZV9wbHVnaW5zIj48L3Byb3BlcnR5PgotICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2aWNlLnBsdWdpbi5mb2xkZXIiIHZhbHVlPSIuL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW4iPjwvcHJvcGVydHk+Ci0gICAgICAgPHByb3BlcnR5IG5hbWU9ImNvZGVnZW4ucGx1Z2luLmZvbGRlciIgdmFsdWU9Ii4vYXhpczItZWNsaXBzZS1jb2RlZ2VuLXBsdWdpbiI+PC9wcm9wZXJ0eT4KLQotICAgICAgIDwhLS0gQ2xlYW4gdGhlIGRpcmVjdG9yeSAtLT4KLSAgICAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHtvdXRwdXQuZm9sZGVyfSI+PC9kZWxldGU+Ci0gICAgICAgPC90YXJnZXQ+Ci0KLSAgICAgICA8IS0tIERlZmF1bHQgdGFyZ2V0IHRvIGdlbmVyYXRlIGFsbCB0aGUgcGx1Z2lucyAtLT4KLSAgICAgICA8dGFyZ2V0IG5hbWU9ImFsbCI+Ci0gICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNsZWFuIiAvPgotICAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZS1wbHVnaW5zIi8+Ci0gICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InJlbGVhc2UtcGx1Z2lucyIvPgotICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgPCEtLSBpbml0LS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dC5mb2xkZXJ9Ij48L21rZGlyPgotICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtcHJvamVjdHMiIGRlcGVuZHM9ImluaXQiPgotICAgICAgICAgICAgICAgPGFudCBkaXI9IiR7c2VydmljZS5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1zZXJ2aWNlLXByb2plY3QiIC8+Ci0gICAgICAgICAgICAgICA8YW50IGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9ImdlbmVyYXRlLWNvZGVnZW4tcHJvamVjdCIgIC8+Ci0gICAgICAgIDwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1zZXJ2aWNlLXByb2plY3QiIGRlcGVuZHM9ImluaXQiPgotCSAgICAgICA8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9ImdlbmVyYXRlLXNlcnZpY2UtcHJvamVjdCIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLWNvZGVnZW4tcHJvamVjdCIgZGVwZW5kcz0iaW5pdCI+Ci0JCSA8YW50IGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9ImdlbmVyYXRlLWNvZGVnZW4tcHJvamVjdCIgLz4KLQk8L3RhcmdldD4KLQotICAgICAgICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLXBsdWdpbnMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9ImdlbmVyYXRlLXNlcnZpY2UtcGx1Z2luIiAvPgotCQk8YW50IGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9ImdlbmVyYXRlLWNvZGVnZW4tcGx1Z2luIiAvPgotICAgICAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUtc2VydmljZS1wbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotCQk8YW50IGRpcj0iJHtzZXJ2aWNlLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9ImdlbmVyYXRlLXNlcnZpY2UtcGx1Z2luIiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiIgZGVwZW5kcz0iaW5pdCIgPgotCQkgPGFudCBkaXI9IiR7Y29kZWdlbi5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJnZW5lcmF0ZS1jb2RlZ2VuLXBsdWdpbiIgLz4KLQk8L3RhcmdldD4KLQotICAgICAgICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwtcGx1Z2lucyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgZGlyPSIke3NlcnZpY2UucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0iaW5zdGFsbC1zZXJ2aWNlLXBsdWdpbiIgLz4KLQkJPGFudCBkaXI9IiR7Y29kZWdlbi5wbHVnaW4uZm9sZGVyfSIgdGFyZ2V0PSJpbnN0YWxsLWNvZGVnZW4tcGx1Z2luIiAvPgotICAgICAgICA8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iaW5zdGFsbC1zZXJ2aWNlLXBsdWdpbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgZGlyPSIke3NlcnZpY2UucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0iaW5zdGFsbC1zZXJ2aWNlLXBsdWdpbiIgLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iaW5zdGFsbC1jb2RlZ2VuLXBsdWdpbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCSA8YW50IGRpcj0iJHtjb2RlZ2VuLnBsdWdpbi5mb2xkZXJ9IiB0YXJnZXQ9Imluc3RhbGwtY29kZWdlbi1wbHVnaW4iIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InJlbGVhc2UtcGx1Z2lucyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgZGlyPSIke3NlcnZpY2UucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0icmVsZWFzZS1wbHVnaW4iIC8+Ci0JCTxhbnQgZGlyPSIke2NvZGVnZW4ucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0icmVsZWFzZS1wbHVnaW4iIC8+Ci0JPC90YXJnZXQ+Ci0KLSAgICAgICAgPHRhcmdldCBuYW1lPSJyZWxlYXNlLWNvZGVnZW4tcGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLQkJIDxhbnQgZGlyPSIke2NvZGVnZW4ucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0icmVsZWFzZS1wbHVnaW4iIC8+Ci0gICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgIDx0YXJnZXQgbmFtZT0icmVsZWFzZS1zZXJ2aWNlLXBsdWdpbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgZGlyPSIke3NlcnZpY2UucGx1Z2luLmZvbGRlcn0iIHRhcmdldD0icmVsZWFzZS1wbHVnaW4iIC8+Ci0gICAgICAgIDwvdGFyZ2V0PgotCi0KLSAgICA8dGFyZ2V0IG5hbWU9ImhlbHAiPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgIEVjbGlwc2UgUGx1Z2luIEJ1aWxkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgcHJlLXJlcXVpc2l0ICAgICAgICAgICAgOiBlbnYuRUNMSVBTRV9IT01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICBidWlsZCBwcm9qZWN0cyAgICAgICAgICA6IGdlbmVyYXRlLXByb2plY3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgYnVpbGQgc2VydmljZSBwcm9qZWN0ICAgOiBnZW5lcmF0ZS1zZXJ2aWNlLXByb2plY3QgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIGJ1aWxkIGNvZGVnZW4gcHJvamVjdCAgIDogZ2VuZXJhdGUtY29kZWdlbi1wcm9qZWN0ICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgYnVpbGQgcGx1Z2lucyAgICAgICAgICAgOiBnZW5lcmF0ZS1wbHVnaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIGJ1aWxkIHNlcnZpY2UgcGx1Z2luICAgIDogZ2VuZXJhdGUtc2VydmljZS1wbHVnaW4gICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICBidWlsZCBjb2RlZ2VuIHBsdWdpbiAgICA6IGdlbmVyYXRlLWNvZGVnZW4tcGx1Z2luICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIGluc3RhbGwgcGx1Z2lucyAgICAgICAgIDogaW5zdGFsbC1wbHVnaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICBpbnN0YWxsIHNlcnZpY2UgcGx1Z2luICA6IGluc3RhbGwtc2VydmljZS1wbHVnaW4gICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgaW5zdGFsbCBjb2RlZ2VuIHBsdWdpbiAgOiBpbnN0YWxsLWNvZGVnZW4tcGx1Z2luICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICByZWxlYXNlIHBsdWdpbnMgICAgICAgICA6IHJlbGVhc2UtcGx1Z2lucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgcmVsZWFzZSBzZXJ2aWNlIHBsdWdpbiAgOiByZWxlYXNlLXNlcnZpY2UtcGx1Z2luICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKiogIHJlbGVhc2UgY29kZWdlbiBwbHVnaW4gIDogcmVsZWFzZS1jb2RlZ2VuLXBsdWdpbiAgICAgICAgICAgICAgICAgICAgICAqKiIgLz4KLSAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioiIC8+Ci0gICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSIqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqIiAvPgotICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgLz4KLQotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9yZWFkbWUudHh0IGIvMV81L21vZHVsZXMvdG9vbC9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjk3N2E3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLT09PT09PT09PT09PT09PT0KLVVzaW5nIHRoZSB0b29scyAgCi09PT09PT09PT09PT09PT09Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSgxKSBBeGlzMiBlbGNpcHNlIHBsdWdpbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTm90ZSAtIFRoZSBwbHVnaW5zIGFyZSBzcGVjaWZpY2FsbHlxcCBmb3IgRWNsaXBzZSB2ZXJzaW9uIDMuMSBhbmQgdXAKLQotTWF2ZW4yIEJ1aWxkCi0tLS0tLS0tLS0tLS0KLQkqIFRvIGJ1aWxkIHRoZSBlY2xpcHNlIHBsdWdpbiB0eXBlICJtdm4gY2xlYW4gaW5zdGFsbCAtRG1hdmVuLnRlc3Quc2tpcD10cnVlIiBjb21tYW5kIGluIHRoZQotCSAgdG9vbHMvYXhpczItZWNsaXBzZS08bmFtZT4tcGx1Z2luIGRpcmVjdG9yeQotCSogSWYgeW91IGhhdmUgYWxyZWFkeSBkb3dubG9hZGVkIHRoZSBtYXZlbiBhcnRpZmFjdHMgeW91IGNhbiBpbnZva2UgYSBsb2NhbCBidWlsZCBieQotICAgICAgICAgIHNhbWUgZGlyZWN0b3J5Im12biBjbGVhbiBpbnN0YWxsIC1EbWF2ZW4udGVzdC5za2lwPXRydWUgLW8iCi0gICAgICAgICogQWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgYnVpbGQgdGhlIHppcCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4gd2lsbCBiZSBhdmFpbGFibGUgYXQKLSAgICAgICAgICB0b29scy9heGlzMi1lY2xpcHNlLTxuYW1lPi1wbHVnaW4vdGFyZ2V0L2Rpc3QgZGlyZWN0b3J5Ci0JKiBUbyBydW4gdGhlIHBsdWdpbiB5b3UgbmVlZCBwbGVhc2UgcmVmZXIgdG8sCi0JICAgLSBUb29scyBQYWdlIE9uIEFwYWNoZSBBeGlzIDIgRG9jdW1lbnRhdGlvbiAgaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvCi0KLUFudCBCdWlsZAotLS0tLS0tLS0tCi0JQ3JlYXRlIEVjbGlwc2UgUGx1Z2luIFByb2plY3RzCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkqIFNpbmNlIHRoZSBzb3VyY2UgZm9yIHRoZSB0b29scyBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoZSBlY2xpcHNlIGNsYXNzZXMuIG9uZSBoYXMgdG8gcnVuIHRoZQotCSAgYW50IGJ1aWxkIGZpbGUgKGJ1aWxkLnhtbCkgdG8gZ2VuZXJhdGUgYSByZWxldmFudCBlY2xpcHNlIHByb2plY3QgZnJvbSB0aGUgc291cmNlLgotCSAgCi0JKiBJbiBvcmRlciB0byBjb21waWxlIHRoZSBwbHVnaW4gZmlyc3QgeW91IG11c3QgZG8gYSBtYXZlbiBjcmVhdGUtbGliIG9uIEF4aXMyIFNvdXJjZSBhbmQKLQkgIHNldCBFQ0xJUFNFX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8geW91ciBlY2xpcHNlIGhvbWUgZGlyZWN0b3J5LiAgCi0JCi0JKiB1c2UgdGhlIGFudCBnZW5lcmF0ZS1wcm9qZWN0cyBjb21tYW5kIHRvIGdlbmVyYXRlIHRoZSBwbHVnaW4gcHJvamVjdHMuCi0JCi0JKiBPbmNlIHRoZSBwcm9qZWN0cyBhcmUgZ2VuZXJhdGVkIGluIGVhY2ggZWNsaXBzZSBwbHVnaW4gZGlyZWN0b3J5IHVuZGVyIHRvb2xzIGRpcmVjdG9yeQotICAgICAgICAgIChheGlzMi1lY2xpcHNlLXNlcnZpY2UtcGx1Z2luIGFuZCBheGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luKSB0aGV5IGNhbiBiZSBvcGVuZWQgYXMgYSBFY2xpcHNlIFBERQotCSAgZm9yIGJ1aWxkaW5nIGFuZCBlZGl0aW5nLgotCSAgCi0JKiBUaGlzIGNhbiBiZSBkb25lIGJ5IEZpbGUgLT4gSW1wb3J0IC0+IEV4aXN0aW5nIHByb2plY3QgaW50byB3b3Jrc3BhY2Ugb24gRWxjaXBzZSBtZW51IGFuZCAKLQkgIHBvaW50IHRoYXQgdG8gdGhlIGFueSBvZiBlY2xpcHNlIHBsdWdpbiBkaXJlY3RvcnkgdW5kZXIgdG9vbHMgZGlyZWN0b3J5LgotCi0JQnVpbGQgRWNsaXBzZSBQbHVnaW4gUHJvamVjdHMKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCSogQnVpbGQgYW5kIGluc3RhbGwgdGhlIGVjbGlwc2UgcGx1Z2luIHRvIHlvdXIgbG9jYWwgZWNsaXBzZSBwbHVnaW4gZGlyZWN0b3J5LgotICAgICAgICAgICAgICAgICogSW4gb3JkZXIgdG8gY29tcGlsZSB0aGUgcGx1Z2luIGZpcnN0IHlvdSBtdXN0IGRvIGEgbWF2ZW4gY3JlYXRlLWxpYiBvbiBBeGlzMiBTb3VyY2UgYW5kCi0gICAgICAgICAgICAgICAgICBzZXQgRUNMSVBTRV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IHRvIHlvdXIgZWNsaXBzZSBob21lIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAqIHN0b3AgZWNscHNlIGlmIHN0aWxsIG9uIG9wZXJhdGlvbi4KLSAgICAgICAgICAgICAgICAqIHVzZSBhbnQgaW5zdGFsbC1wbHVnaW5zIAotICAgICAgICAgICAgICAgICogc3RhcnQgZWNsaXBzZQotICAgICAgICAgICAgICAgICogcGx1Z2lucyB3aWxsIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBbRmlsZSAtPiBOZXcgLT4gT3RoZXJdIGN0bCtuIHVuZGVyIEF4aXMyIFdpemFyZHMuCi0KLQkqIFJlbGVhc2UgdGhlIHBsdWdpbnMgaW4gY29tcHJlc3NlZCBmb3JtYXQKLSAgICAgICAgICAgICAgICAqIEluIG9yZGVyIHRvIGNvbXBpbGUgdGhlIHBsdWdpbiBmaXJzdCB5b3UgbXVzdCBkbyBhIG1hdmVuIGNyZWF0ZS1saWIgb24gQXhpczIgU291cmNlIGFuZAotICAgICAgICAgICAgICAgICAgc2V0IEVDTElQU0VfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byB5b3VyIGVjbGlwc2UgaG9tZSBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgKiBzdG9wIGVjbHBzZSBpZiBzdGlsbCBvbiBvcGVyYXRpb24uCi0gICAgICAgICAgICAgICAgKiBhbnQgcmVsZWFzZS1wbHVnaW5zCi0gICAgICAgICAgICAgICAgKiBwbHVnaW5zIHdpbGwgYmUgYXZhaWxhYmxlIGF0IHRhcmdldC9lY2xpcHNlX3Byb2plY3RzL3JlbGVhc2UKLQkKLQkqIFRoZSB0b29sIHNvdXJjZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYnVpbGQKLQkKLQkqIFRvIHJ1biB0aGUgcGx1Z2luIHlvdSBuZWVkIHBsZWFzZSByZWZlciB0bywKLQkJLSBUb29scyBQYWdlIE9uIEFwYWNoZSBBeGlzIDIgRG9jdW1lbnRhdGlvbiAgaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvdG9vbHMvCi0KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSgyKSBBeGlzMiBJbnRlbGxpaiBJZGVhIHBsdWdpbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLU1hdmVuIGJ1aWxkCi0tLS0tLS0tLS0tLQotCi0gICAgICAgICogVG8gYnVpbGQgdGhlIHBsdWdpbiB0eXBlIG1hdmVuIGNvbW1hbmQgaW4gdGhlIHRvb2xzL2F4aXMyLWlkZWEtcGx1Z2luIGRpcmVjdG9yeQotICAgICAgICAqIElmIHlvdSBoYXZlIGFscmVhZHkgZG93bmxvYWRlZCB0aGUgbWF2ZW4gYXJ0aWZhY3RzIHlvdSBjYW4gaW52b2tlIGEgbG9jYWwgYnVpbGQgYnkgbWF2ZW4gLW8KLSAgICAgICAgICBzYW1lIGRpcmVjdG9yeQotICAgICAgICAqIEFmdGVyIHRoZSBzdWNjZXNzZnVsIGJ1aWxkIHRoZSB6aXAgdmVyc2lvbiBvZiB0aGUgcGx1Z2luIHdpbGwgYmUgYXZhaWxhYmxlIGF0Ci0gICAgICAgICAgdG9vbHMvYXhpczItaWRlYS1wbHVnaW4vdGFyZ2V0IGRpcmVjdG9yeQotCSAgICAqIFRvIHJ1biB0aGUgcGx1Z2luIHlvdSBuZWVkIHBsZWFzZSByZWZlciB0bywKLQkJICAgIC0gVG9vbHMgUGFnZSBPbiBBcGFjaGUgQXhpcyAyIERvY3VtZW50YXRpb24gIGh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyL3Rvb2xzLwpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczIuYmF0IGIvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWUxMGZkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1yZW0gQXhpczIgU2NyaXB0DQotcmVtDQotcmVtIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzDQotcmVtDQotcmVtICAgQVhJUzJfSE9NRSAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBBWElTMiBkaXJlY3RvcnkNCi1yZW0NCi1yZW0gICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4NCi1yZW0NCi1yZW0gICBKQVZBX09QVFMgICAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucw0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1zZXQgQ1VSUkVOVF9ESVI9JWNkJQ0KLQ0KLXJlbSBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0DQotaWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQ0KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZA0KLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQ0KLWdvdG8gZW5kDQotOmdvdEphdmFIb21lDQotaWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIGdvdG8gbm9KYXZhSG9tZQ0KLWdvdG8gb2tKYXZhSG9tZQ0KLTpub0phdmFIb21lDQotZWNobyBUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQ0KLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQ0KLWVjaG8gTkI6IEpBVkFfSE9NRSBzaG91bGQgcG9pbnQgdG8gYSBKREsvSlJFDQotZ290byBlbmQNCi06b2tKYXZhSG9tZQ0KLQ0KLXJlbSBjaGVjayB0aGUgQVhJUzJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZQ0KLWlmIG5vdCAiJUFYSVMyX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUNCi1zZXQgQVhJUzJfSE9NRT0lQ1VSUkVOVF9ESVIlDQotaWYgZXhpc3QgIiVBWElTMl9IT01FJVxiaW5camF2YTJ3c2RsLmJhdCIgZ290byBva0hvbWUNCi0NCi1yZW0gZ3Vlc3MgdGhlIGhvbWUuIEp1bXAgb25lIGRpcmVjdG9yeSB1cCB0byBjaGVjayBpZiB0aGF0IGlzIHRoZSBob21lDQotY2QgLi4NCi1zZXQgQVhJUzJfSE9NRT0lY2QlDQotY2QgIiVDVVJSRU5UX0RJUiUiDQotDQotOmdvdEhvbWUNCi1pZiBFWElTVCAiJUFYSVMyX0hPTUUlXGxpYlxheGlzMiouamFyIiBnb3RvIG9rSG9tZQ0KLWVjaG8gVGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5DQotZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtDQotZ290byBlbmQNCi0NCi06b2tIb21lDQotcmVtIHNldCB0aGUgY2xhc3Nlcw0KLXNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24NCi0NCi1yZW0gLS0tLS0gRXhlY3V0ZSBUaGUgUmVxdWVzdGVkIENvbW1hbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotZWNobyBVc2luZyBBWElTMl9IT01FOiAgICVBWElTMl9IT01FJQ0KLWVjaG8gVXNpbmcgSkFWQV9IT01FOiAgICAlSkFWQV9IT01FJQ0KLXNldCBfUlVOSkFWQT0iJUpBVkFfSE9NRSVcYmluXGphdmEiDQotDQotJV9SVU5KQVZBJSAlSkFWQV9PUFRTJSAtRGphdmEuZXh0LmRpcnM9IiVBWElTMl9IT01FJVxsaWJcIiAtRGF4aXMyLnJlcG89IiVBWElTMl9IT01FJVxyZXBvc2l0b3J5IiAtRGF4aXMyLnhtbD0iJUFYSVMyX0hPTUUlXGNvbmZcYXhpczIueG1sIiAlKg0KLWVuZGxvY2FsDQotOmVuZA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyLnNoIGIvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzg2MGQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyAgICBBeGlzMiBTY3JpcHQKLSMKLSMgUHJlLXJlcXVpc2l0ZXMKLSMgICAtIHNldGVudi5zaCBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCi0jCi0jICAgQVhJUzJfSE9NRSAgIEhvbWUgb2YgQXhpczIgaW5zdGFsbGF0aW9uLiBJZiBub3Qgc2V0IEkgd2lsbCAgdHJ5Ci0jICAgICAgICAgICAgICAgICAgIHRvIGZpZ3VyZSBpdCBvdXQuCi0jCi0jICAgSkFWQV9IT01FICAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBKYXZhIERldmVsb3BtZW50IEtpdCBpbnN0YWxsYXRpb24uCi0jCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgR2V0IHRoZSBjb250ZXh0IGFuZCBmcm9tIHRoYXQgZmluZCB0aGUgbG9jYXRpb24gb2Ygc2V0ZW52LnNoCi1kaXI9YGRpcm5hbWUgIiQwImAKLS4gIiR7ZGlyfSIvc2V0ZW52LnNoCi0KLSNhZGQgYW55IHVzZXIgZ2l2ZW4gY2xhc3NwYXRoJ3MKLVVTRVJfQ09NTUFORFM9IiIKLXByZWFyZz0iIgotZm9yIGFyZyBpbiAiJEAiCi1kbwotICAgaWYgWyAiJGFyZyIgIT0gLWNsYXNzcGF0aCBdICYmIFsgIiRhcmciICE9IC1jcCBdICYmIFsgIiRwcmVhcmciICE9IC1jbGFzc3BhdGggXSAmJiBbICIkcHJlYXJnIiAhPSAtY3AgIF0KLSAgIHRoZW4KLSAgICAgIFVTRVJfQ09NTUFORFM9IiRVU0VSX0NPTU1BTkRTICIiJGFyZyIKLSAgIGZpCi0KLSAgIGlmIFsgIiRwcmVhcmciPS1jbGFzc3BhdGggXSB8fCBbICIkcHJlYXJnIj0tY3AgIF0KLSAgIHRoZW4KLSAgICAgIEFYSVMyX0NMQVNTUEFUSD0iJGFyZyI6IiRBWElTMl9DTEFTU1BBVEgiCi0gICBmaQotICAgcHJlYXJnPSIkYXJnIgotZG9uZSAKLQotCi0iJEpBVkFfSE9NRSIvYmluL2phdmEgLWNsYXNzcGF0aCAiJEFYSVMyX0NMQVNTUEFUSCIgXAotLURheGlzMi54bWw9IiRBWElTMl9IT01FL2NvbmYvYXhpczIueG1sIiAtRGF4aXMyLnJlcG89IiRBWElTMl9IT01FL3JlcG9zaXRvcnkiICAkVVNFUl9DT01NQU5EUwpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczJzZXJ2ZXIuYmF0IGIvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczJzZXJ2ZXIuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdkNGE1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyc2VydmVyLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLUBlY2hvIG9mZg0KLQ0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1SRU0gIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1SRU0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLVJFTSAgDQotUkVNICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1SRU0gIA0KLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLVJFTSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1SRU0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi1yZW0gU3RhcnR1cCBzY3JpcHQgZm9yIHRoZSBTaW1wbGUgQXhpcyBTZXJ2ZXIgKHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzKQ0KLXJlbQ0KLXJlbSBFbnZpcm9ubWVudCBWYXJpYWJsZSBQcmVxdWlzaXRlcw0KLXJlbQ0KLXJlbSAgIEFYSVMyX0hPTUUgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgQVhJUzIgZGlyZWN0b3J5IA0KLXJlbQ0KLXJlbSAgIEpBVkFfSE9NRSAgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uLg0KLXJlbQ0KLXJlbSAgIEpBVkFfT1BUUyAgICAgICAoT3B0aW9uYWwpIEphdmEgcnVudGltZSBvcHRpb25zIA0KLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1pZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBAc2V0bG9jYWwNCi1pZiAiJU9TJSI9PSJXSU5OVCIgQHNldGxvY2FsDQotDQotcmVtICV+ZHAwIGlzIGV4cGFuZGVkIHBhdGhuYW1lIG9mIHRoZSBjdXJyZW50IHNjcmlwdCB1bmRlciBOVA0KLXNldCBERUZBVUxUX0FYSVMyX0hPTUU9JX5kcDAuLg0KLQ0KLWlmICIlQVhJUzJfSE9NRSUiPT0iIiBzZXQgQVhJUzJfSE9NRT0lREVGQVVMVF9BWElTMl9IT01FJQ0KLXNldCBERUZBVUxUX0FYSVMyX0hPTUU9DQotDQotcmVtIGZpbmQgQVhJUzJfSE9NRSBpZiBpdCBkb2VzIG5vdCBleGlzdCBkdWUgdG8gZWl0aGVyIGFuIGludmFsaWQgdmFsdWUgcGFzc2VkDQotcmVtIGJ5IHRoZSB1c2VyIG9yIHRoZSAlMCBwcm9ibGVtIG9uIFdpbmRvd3MgOXgNCi0NCi1pZiBleGlzdCAiJUFYSVMyX0hPTUUlXGNvbmZcYXhpczIueG1sIiBnb3RvIGNoZWNrSmF2YQ0KLQ0KLTpub0F4aXMySG9tZQ0KLWVjaG8gQVhJUzJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQgaW5jb3JyZWN0bHkgb3IgQVhJUzIgY291bGQgbm90IGJlIGxvY2F0ZWQuIA0KLWVjaG8gUGxlYXNlIHNldCB0aGUgQVhJUzJfSE9NRSB2YXJpYWJsZSBhcHByb3ByaWF0ZWx5DQotZ290byBlbmQNCi0NCi06Y2hlY2tKYXZhDQotc2V0IF9KQVZBQ01EPSVKQVZBQ01EJQ0KLQ0KLWlmICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBub0phdmFIb21lDQotaWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIGdvdG8gbm9KYXZhSG9tZQ0KLWlmICIlX0pBVkFDTUQlIiA9PSAiIiBzZXQgX0pBVkFDTUQ9JUpBVkFfSE9NRSVcYmluXGphdmEuZXhlDQotaWYgICIlQVhJUzJfQ01EX0xJTkVfQVJHUyUiID09ICIiIGdvdG8gZGVmYXVsdFBhcmFtcw0KLQ0KLWdvdG8gcnVuQXhpczINCi0NCi06ZGVmYXVsdFBhcmFtcw0KLXNldCBBWElTMl9DTURfTElORV9BUkdTPS1yZXBvICIlQVhJUzJfSE9NRSVccmVwb3NpdG9yeSIgLWNvbmYgIiVBWElTMl9IT01FJVxjb25mXGF4aXMyLnhtbCINCi1nb3RvIHJ1bkF4aXMyDQotDQotOm5vSmF2YUhvbWUNCi1pZiAiJV9KQVZBQ01EJSIgPT0gIiIgc2V0IF9KQVZBQ01EPWphdmEuZXhlDQotZWNobyBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IGluY29ycmVjdGx5IG9yIEphdmEgcnVudGltZSBjb3VsZCBub3QgYmUgbG9jYXRlZC4NCi1lY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBhcHByb3ByaWF0ZWx5DQotZ290byBlbmQNCi0NCi06cnVuQXhpczINCi1yZW0gc2V0IHRoZSBjbGFzc2VzIGJ5IGxvb3BpbmcgdGhyb3VnaCB0aGUgbGlicw0KLXNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24NCi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQVhJUzJfSE9NRSU7JUpBVkFfSE9NRSVcbGliXHRvb2xzLmphcjsNCi1GT1IgJSVjIGluICgiJUFYSVMyX0hPTUUlXGxpYlwqLmphciIpIERPIHNldCBBWElTMl9DTEFTU19QQVRIPSFBWElTMl9DTEFTU19QQVRIITslJWMNCi0NCi1lY2hvIFVzaW5nIEpBVkFfSE9NRSAgICAlSkFWQV9IT01FJQ0KLWVjaG8gVXNpbmcgQVhJUzJfSE9NRSAgICVBWElTMl9IT01FJQ0KLQ0KLWNkICVBWElTMl9IT01FJQ0KLSIlX0pBVkFDTUQlIiAlSkFWQV9PUFRTJSAtY3AgIiFBWElTMl9DTEFTU19QQVRIISIgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuU2ltcGxlQXhpczJTZXJ2ZXIgJUFYSVMyX0NNRF9MSU5FX0FSR1MlDQotZ290byBlbmQNCi0NCi06ZW5kDQotc2V0IF9KQVZBQ01EPQ0KLXNldCBBWElTMl9DTURfTElORV9BUkdTPQ0KLQ0KLWlmICIlT1MlIj09IldpbmRvd3NfTlQiIEBlbmRsb2NhbA0KLWlmICIlT1MlIj09IldJTk5UIiBAZW5kbG9jYWwNCi0NCi06bWFpbkVuZA0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L2F4aXMyc2VydmVyLnNoIGIvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczJzZXJ2ZXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwNTU3MjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvYXhpczJzZXJ2ZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBTaW1wbGVBeGlzMlNlcnZlciBTY3JpcHQKLSMKLSMgRW52aXJvbm1lbnQgVmFyaWFibGUgUHJlcXVpc2l0ZXMKLSMKLSMgICBBWElTMl9IT01FICAgSG9tZSBvZiBBeGlzMiBpbnN0YWxsYXRpb24uIElmIG5vdCBzZXQgSSB3aWxsICB0cnkKLSMgICAgICAgICAgICAgICAgICAgdG8gZmlndXJlIGl0IG91dC4KLSMKLSMgICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KLSMKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBHZXQgdGhlIGNvbnRleHQgYW5kIGZyb20gdGhhdCBmaW5kIHRoZSBsb2NhdGlvbiBvZiBzZXRlbnYuc2gKLS4gYGRpcm5hbWUgJDBgL3NldGVudi5zaAotCi1qYXZhIC1jbGFzc3BhdGggIiRBWElTMl9DTEFTU1BBVEgiIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlNpbXBsZUF4aXMyU2VydmVyIFwKLS1yZXBvICIkQVhJUzJfSE9NRSIvcmVwb3NpdG9yeSAtY29uZiAiJEFYSVMyX0hPTUUiL2NvbmYvYXhpczIueG1sICQqCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL3NjcmlwdC9qYXZhMndzZGwuYmF0IGIvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvamF2YTJ3c2RsLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiMjQ3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL3NjcmlwdC9qYXZhMndzZGwuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotQGVjaG8gb2ZmCi0KLVJFTSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotUkVNICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotUkVNICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotUkVNICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLVJFTSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotUkVNICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1SRU0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotUkVNICAKLVJFTSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1SRU0gIAotUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1SRU0gIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1SRU0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotUkVNICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotUkVNICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi1SRU0gIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1yZW0gU3RhcnR1cCBzY3JpcHQgZm9yIHRoZSBXU0RMSmF2YQotcmVtCi1yZW0gRW52aXJvbm1lbnQgVmFyaWFibGUgUHJlcXVpc2l0ZXMKLXJlbQotcmVtICAgQVhJUzJfSE9NRSAgICAgIE11c3QgcG9pbnQgYXQgeW91ciBBWElTMiBkaXJlY3RvcnkgCi1yZW0KLXJlbSAgIEpBVkFfSE9NRSAgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgSmF2YSBEZXZlbG9wbWVudCBLaXQgaW5zdGFsbGF0aW9uLgotcmVtCi1yZW0gICBKQVZBX09QVFMgICAgICAgKE9wdGlvbmFsKSBKYXZhIHJ1bnRpbWUgb3B0aW9ucyAKLXJlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXNldCBDVVJSRU5UX0RJUj0lY2QlCi0KLXJlbSBNYWtlIHN1cmUgcHJlcmVxdWlzaXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0Ci1pZiBub3QgIiVKQVZBX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEphdmFIb21lCi1lY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQKLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQotZ290byBlbmQKLTpnb3RKYXZhSG9tZQotaWYgbm90IGV4aXN0ICIlSkFWQV9IT01FJVxiaW5camF2YS5leGUiIGdvdG8gbm9KYXZhSG9tZQotZ290byBva0phdmFIb21lCi06bm9KYXZhSG9tZQotZWNobyBUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQotZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCi1lY2hvIE5COiBKQVZBX0hPTUUgc2hvdWxkIHBvaW50IHRvIGEgSkRLL0pSRQotZ290byBlbmQKLTpva0phdmFIb21lCi0KLXJlbSBjaGVjayB0aGUgQVhJUzJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZQotaWYgbm90ICIlQVhJUzJfSE9NRSUiID09ICIiIGdvdG8gZ290SG9tZQotc2V0IEFYSVMyX0hPTUU9JUNVUlJFTlRfRElSJQotaWYgZXhpc3QgIiVBWElTMl9IT01FJVxiaW5cYXhpczIuYmF0IiBnb3RvIG9rSG9tZQotCi1yZW0gZ3Vlc3MgdGhlIGhvbWUuIEp1bXAgb25lIGRpcmVjdG9yeSB1cCB0byBjaGVjayBpZiB0aGF0IGlzIHRoZSBob21lCi1jZCAuLgotc2V0IEFYSVMyX0hPTUU9JWNkJQotY2QgJUNVUlJFTlRfRElSJQotCi06Z290SG9tZQotaWYgRVhJU1QgIiVBWElTMl9IT01FJVxsaWJcYXhpczIqLmphciIgZ290byBva0hvbWUKLWVjaG8gVGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5Ci1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KLWdvdG8gZW5kCi0KLTpva0hvbWUKLXJlbSBzZXQgdGhlIGNsYXNzZXMKLXNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KLXJlbSBhcHBlbmQgdGhlIGV4aXN0aW5nIGNsYXNzcGF0aCB0byBBWElTMl9DTEFTU19QQVRICi1zZXQgQVhJUzJfQ0xBU1NfUEFUSD0lQ0xBU1NQQVRIJTslQVhJUzJfSE9NRSUKLXJlbSBsb29wIHRocm91Z2ggdGhlIGxpYnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBjbGFzcyBwYXRoCi1GT1IgJSVjIGluICgiJUFYSVMyX0hPTUUlXGxpYlwqLmphciIpIERPIHNldCBBWElTMl9DTEFTU19QQVRIPSFBWElTMl9DTEFTU19QQVRIITslJWMKLQotcmVtIC0tLS0tIEV4ZWN1dGUgVGhlIFJlcXVlc3RlZCBDb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZWNobyBVc2luZyBBWElTMl9IT01FOiAgICVBWElTMl9IT01FJQotZWNobyBVc2luZyBKQVZBX0hPTUU6ICAgICVKQVZBX0hPTUUlCi1zZXQgX1JVTkpBVkE9IiVKQVZBX0hPTUUlXGJpblxqYXZhIgotCi0lX1JVTkpBVkElICVKQVZBX09QVFMlIC1jcCAiIUFYSVMyX0NMQVNTX1BBVEghIiBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTREwgJSoKLWVuZGxvY2FsCi06ZW5kCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90b29sL3NjcmlwdC9qYXZhMndzZGwuc2ggYi8xXzUvbW9kdWxlcy90b29sL3NjcmlwdC9qYXZhMndzZGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjc4MTAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvamF2YTJ3c2RsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1kaXI9YGRpcm5hbWUgIiQwImAKLXNoICIkZGlyIi9heGlzMi5zaCBvcmcuYXBhY2hlLndzLmphdmEyd3NkbC5KYXZhMldTREwgJCoKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L3NldGVudi5zaCBiLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L3NldGVudi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzNWFkMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90b29sL3NjcmlwdC9zZXRlbnYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgIFNldCBFbnZpcm9ubWVudCBTaGVsbCBTY3JpcHQKLSMKLSMgIFRoaXMgd2lsbCBzZXQgQVhJUzJfSE9NRSBhbmQgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlcyBwcm9wZXJseS4KLSMKLSMgICBBWElTMl9IT01FICAgSG9tZSBvZiBBeGlzMiBpbnN0YWxsYXRpb24uIElmIG5vdCBzZXQgSSB3aWxsICB0cnkKLSMgICAgICAgICAgICAgICAgICAgdG8gZmlndXJlIGl0IG91dC4KLSMKLSMgICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KLSMKLSMgTk9URTogQm9ycm93ZWQgZ2VuZXJvdXNseSBmcm9tIEFwYWNoZSBUb21jYXQgc3RhcnR1cCBzY3JpcHRzLgotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGlmIEpBVkFfSE9NRSBpcyBub3Qgc2V0IHdlJ3JlIG5vdCBoYXBweQotaWYgWyAteiAiJEpBVkFfSE9NRSIgXTsgdGhlbgotICBlY2hvICJZb3UgbXVzdCBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBBeGlzMiBTY3JpcHQuIgotICBleGl0IDEKLWZpCi0KLSMgT1Mgc3BlY2lmaWMgc3VwcG9ydC4gICR2YXIgX211c3RfIGJlIHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KLWN5Z3dpbj1mYWxzZQotb3M0MDA9ZmFsc2UKLWNhc2UgImB1bmFtZWAiIGluCi1DWUdXSU4qKSBjeWd3aW49dHJ1ZTs7Ci1PUzQwMCopIG9zNDAwPXRydWU7OwotZXNhYwotCi0jIHJlc29sdmUgbGlua3MgLSAkMCBtYXkgYmUgYSBzb2Z0bGluawotUFJHPSIkMCIKLQotd2hpbGUgWyAtaCAiJFBSRyIgXTsgZG8KLSAgbHM9YGxzIC1sZCAiJFBSRyJgCi0gIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKLSAgaWYgZXhwciAiJGxpbmsiIDogJy4qLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIFBSRz0iJGxpbmsiCi0gIGVsc2UKLSAgICBQUkc9YGRpcm5hbWUgIiRQUkciYC8iJGxpbmsiCi0gIGZpCi1kb25lCi0KLSMgR2V0IHN0YW5kYXJkIGVudmlyb25tZW50IHZhcmlhYmxlcwotUFJHRElSPWBkaXJuYW1lICIkUFJHImAKLQotIyBPbmx5IHNldCBBWElTMl9IT01FIGlmIG5vdCBhbHJlYWR5IHNldAotWyAteiAiJEFYSVMyX0hPTUUiIF0gJiYgQVhJUzJfSE9NRT1gY2QgIiRQUkdESVIvLi4iIDsgcHdkYAotCi0jIEZvciBDeWd3aW4sIGVuc3VyZSBwYXRocyBhcmUgaW4gVU5JWCBmb3JtYXQgYmVmb3JlIGFueXRoaW5nIGlzIHRvdWNoZWQKLWlmICRjeWd3aW47IHRoZW4KLSAgWyAtbiAiJEpBVkFfSE9NRSIgXSAmJiBKQVZBX0hPTUU9YGN5Z3BhdGggLS11bml4ICIkSkFWQV9IT01FImAKLSAgWyAtbiAiJEFYSVMyX0hPTUUiIF0gJiYgQVhJUzJfSE9NRT1gY3lncGF0aCAtLXVuaXggIiRBWElTMl9IT01FImAKLSAgWyAtbiAiJENMQVNTUEFUSCIgXSAmJiBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tdW5peCAiJENMQVNTUEFUSCJgCi1maQotCi0jIEZvciBPUzQwMAotaWYgJG9zNDAwOyB0aGVuCi0gICMgU2V0IGpvYiBwcmlvcml0eSB0byBzdGFuZGFyZCBmb3IgaW50ZXJhY3RpdmUgKGludGVyYWN0aXZlIC0gNikgYnkgdXNpbmcKLSAgIyB0aGUgaW50ZXJhY3RpdmUgcHJpb3JpdHkgLSA2LCB0aGUgaGVscGVyIHRocmVhZHMgdGhhdCByZXNwb25kIHRvIHJlcXVlc3RzCi0gICMgd2lsbCBiZSBydW5uaW5nIGF0IHRoZSBzYW1lIHByaW9yaXR5IGFzIGludGVyYWN0aXZlIGpvYnMuCi0gIENPTU1BTkQ9J2NoZ2pvYiBqb2IoJyRKT0JOQU1FJykgcnVucHR5KDYpJwotICBzeXN0ZW0gJENPTU1BTkQKLQotICAjIEVuYWJsZSBtdWx0aSB0aHJlYWRpbmcKLSAgZXhwb3J0IFFJQk1fTVVMVElfVEhSRUFERUQ9WQotZmkKLQotIyB1cGRhdGUgY2xhc3NwYXRoCi1BWElTMl9DTEFTU1BBVEg9IiIKLWZvciBmIGluICIkQVhJUzJfSE9NRSIvbGliLyouamFyCi1kbwotICBBWElTMl9DTEFTU1BBVEg9IiRBWElTMl9DTEFTU1BBVEgiOiRmCi1kb25lCi1BWElTMl9DTEFTU1BBVEg9IiRBWElTMl9IT01FIjoiJEpBVkFfSE9NRS9saWIvdG9vbHMuamFyIjoiJEFYSVMyX0NMQVNTUEFUSCI6IiRDTEFTU1BBVEgiCi0KLSMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKLWlmICRjeWd3aW47IHRoZW4KLSAgSkFWQV9IT01FPWBjeWdwYXRoIC0tYWJzb2x1dGUgLS13aW5kb3dzICIkSkFWQV9IT01FImAKLSAgQVhJUzJfSE9NRT1gY3lncGF0aCAtLWFic29sdXRlIC0td2luZG93cyAiJEFYSVMyX0hPTUUiYAotICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0td2luZG93cyAiJENMQVNTUEFUSCJgCi0gIEFYSVMyX0NMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS13aW5kb3dzICIkQVhJUzJfQ0xBU1NQQVRIImAKLSAgSkFWQV9FTkRPUlNFRF9ESVJTPWBjeWdwYXRoIC0tcGF0aCAtLXdpbmRvd3MgIiRKQVZBX0VORE9SU0VEX0RJUlMiYAotZmkKLQotZXhwb3J0IEFYSVMyX0hPTUU9IiRBWElTMl9IT01FIgotZXhwb3J0IEpBVkFfSE9NRT0iJEpBVkFfSE9NRSIKLWV4cG9ydCBBWElTMl9DTEFTU1BBVEg9IiRBWElTMl9DTEFTU1BBVEgiCi0KLQotZWNobyAiIFVzaW5nIEFYSVMyX0hPTUU6ICAgJEFYSVMyX0hPTUUiCi1lY2hvICIgVXNpbmcgSkFWQV9IT01FOiAgICAgICAkSkFWQV9IT01FIgotCi0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvd3NkbDJqYXZhLmJhdCBiLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L3dzZGwyamF2YS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTEzNDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvd3NkbDJqYXZhLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLUBlY2hvIG9mZgotCi1SRU0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLVJFTSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLVJFTSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLVJFTSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1SRU0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLVJFTSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotUkVNICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLVJFTSAgCi1SRU0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotUkVNICAKLVJFTSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotUkVNICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotUkVNICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLVJFTSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLVJFTSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotUkVNICB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcmVtIFN0YXJ0dXAgc2NyaXB0IGZvciB0aGUgV1NETEphdmEKLXJlbQotcmVtIEVudmlyb25tZW50IFZhcmlhYmxlIFByZXF1aXNpdGVzCi1yZW0KLXJlbSAgIEFYSVMyX0hPTUUgICAgICBNdXN0IHBvaW50IGF0IHlvdXIgQVhJUzIgZGlyZWN0b3J5IAotcmVtCi1yZW0gICBKQVZBX0hPTUUgICAgICAgTXVzdCBwb2ludCBhdCB5b3VyIEphdmEgRGV2ZWxvcG1lbnQgS2l0IGluc3RhbGxhdGlvbi4KLXJlbQotcmVtICAgSkFWQV9PUFRTICAgICAgIChPcHRpb25hbCkgSmF2YSBydW50aW1lIG9wdGlvbnMgCi1yZW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zZXQgQ1VSUkVOVF9ESVI9JWNkJQotCi1yZW0gTWFrZSBzdXJlIHByZXJlcXVpc2l0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldAotaWYgbm90ICIlSkFWQV9IT01FJSIgPT0gIiIgZ290byBnb3RKYXZhSG9tZQotZWNobyBUaGUgSkFWQV9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkCi1lY2hvIFRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIHJ1biB0aGlzIHByb2dyYW0KLWdvdG8gZW5kCi06Z290SmF2YUhvbWUKLWlmIG5vdCBleGlzdCAiJUpBVkFfSE9NRSVcYmluXGphdmEuZXhlIiBnb3RvIG5vSmF2YUhvbWUKLWdvdG8gb2tKYXZhSG9tZQotOm5vSmF2YUhvbWUKLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkKLWVjaG8gVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBuZWVkZWQgdG8gcnVuIHRoaXMgcHJvZ3JhbQotZWNobyBOQjogSkFWQV9IT01FIHNob3VsZCBwb2ludCB0byBhIEpESy9KUkUKLWdvdG8gZW5kCi06b2tKYXZhSG9tZQotCi1yZW0gY2hlY2sgdGhlIEFYSVMyX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUKLWlmIG5vdCAiJUFYSVMyX0hPTUUlIiA9PSAiIiBnb3RvIGdvdEhvbWUKLXNldCBBWElTMl9IT01FPSVDVVJSRU5UX0RJUiUKLWlmIGV4aXN0ICIlQVhJUzJfSE9NRSVcYmluXGF4aXMyLmJhdCIgZ290byBva0hvbWUKLQotcmVtIGd1ZXNzIHRoZSBob21lLiBKdW1wIG9uZSBkaXJlY3RvcnkgdXAgdG8gY2hlY2sgaWYgdGhhdCBpcyB0aGUgaG9tZQotY2QgLi4KLXNldCBBWElTMl9IT01FPSVjZCUKLWNkICVDVVJSRU5UX0RJUiUKLQotOmdvdEhvbWUKLWlmIEVYSVNUICIlQVhJUzJfSE9NRSVcbGliXGF4aXMyKi5qYXIiIGdvdG8gb2tIb21lCi1lY2hvIFRoZSBBWElTMl9IT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIGNvcnJlY3RseQotZWNobyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5lZWRlZCB0byBydW4gdGhpcyBwcm9ncmFtCi1nb3RvIGVuZAotCi06b2tIb21lCi1yZW0gc2V0IHRoZSBjbGFzc2VzCi1zZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCi1yZW0gbG9vcCB0aHJvdWdoIHRoZSBsaWJzIGFuZCBhZGQgdGhlbSB0byB0aGUgY2xhc3MgcGF0aAotc2V0IEFYSVMyX0NMQVNTX1BBVEg9JUFYSVMyX0hPTUUlCi1GT1IgJSVjIGluICgiJUFYSVMyX0hPTUUlXGxpYlwqLmphciIpIERPIHNldCBBWElTMl9DTEFTU19QQVRIPSFBWElTMl9DTEFTU19QQVRIITslJWMKLQotcmVtIC0tLS0tIEV4ZWN1dGUgVGhlIFJlcXVlc3RlZCBDb21tYW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZWNobyBVc2luZyBBWElTMl9IT01FOiAgICVBWElTMl9IT01FJQotZWNobyBVc2luZyBKQVZBX0hPTUU6ICAgICVKQVZBX0hPTUUlCi1zZXQgX1JVTkpBVkE9IiVKQVZBX0hPTUUlXGJpblxqYXZhIgotCi0lX1JVTkpBVkElICVKQVZBX09QVFMlIC1jcCAiIUFYSVMyX0NMQVNTX1BBVEghIiBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETDJKYXZhICUqCi1lbmRsb2NhbAotOmVuZApkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvd3NkbDJqYXZhLnNoIGIvMV81L21vZHVsZXMvdG9vbC9zY3JpcHQvd3NkbDJqYXZhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxY2U2NmRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3Rvb2wvc2NyaXB0L3dzZGwyamF2YS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotZGlyPWBkaXJuYW1lICIkMCJgCi1zaCAiJGRpciIvYXhpczIuc2ggb3JnLmFwYWNoZS5heGlzMi53c2RsLldTREwySmF2YSAkKgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTQwOGUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWh0dHA8L2FydGlmYWN0SWQ+Ci0gICAgPG5hbWU+QXBhY2hlIEF4aXMyIC0gVHJhbnNwb3J0IC0gSFRUUDwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+VGhpcyBpbmNsdWVzIGFsbCB0aGUgYXZhaWxhYmxlIHRyYW5zcG9ydHMgaW4gQXhpczI8L2Rlc2NyaXB0aW9uPgotICAgIDxwYWNrYWdpbmc+YnVuZGxlPC9wYWNrYWdpbmc+Ci0gICAgPHNjbT4KLSAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHA8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHA8L3VybD4KLSAgICA8L3NjbT4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnRlc3Q8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcm9jZXNzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXJlc291cmNlLWJ1bmRsZToke3Byb2plY3QudmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLU5hbWU+JHtwb20uYXJ0aWZhY3RJZH08L0J1bmRsZS1OYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1WZW5kb3I+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L0J1bmRsZS1WZW5kb3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLURlc2NyaXB0aW9uPiR7cG9tLmRlc2NyaXB0aW9ufTwvQnVuZGxlLURlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+JHtwb20uYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC4qOy1zcGxpdC1wYWNrYWdlOj1tZXJnZS1sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQWJzdHJhY3RBZ2VudC5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQWJzdHJhY3RBZ2VudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIzYmIzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0Fic3RyYWN0QWdlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoZSBBYnN0cmFjdEFnZW50IGFjdHMgYXMgYSBzaW1wbGUgZGlzcGF0Y2hlciBmb3IgaHR0cCByZXF1ZXN0cy4KLSAqIEl0IGRlbGVnYXRlcyBpbmNvbWluZyByZXF1ZXN0cyB0byBwcm9jZXNzWHl6IG1ldGhvZHMgd2hpbGUgWHl6Ci0gKiBpcyB0aGUgcGFydCBvZiB0aGUgcmVxdWVzdCB1cmkgcGFzdCBsYXN0IC8uCi0gKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEFnZW50IHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lOREVYX0pTUCA9ICJpbmRleC5qc3AiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9QUkVGSVggPSAicHJvY2VzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFic3RyYWN0QWdlbnQuY2xhc3MpOwotCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBNYXAgb3BlcmF0aW9uQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnQ29udGV4dDsKLQotICAgIHB1YmxpYyBBYnN0cmFjdEFnZW50KENvbmZpZ3VyYXRpb25Db250ZXh0IGFDb25maWdDb250ZXh0KSB7Ci0gICAgICAgIGNvbmZpZ0NvbnRleHQgPSBhQ29uZmlnQ29udGV4dDsKLSAgICAgICAgcHJlbG9hZE1ldGhvZHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLQotCi0gICAgICAgIFN0cmluZyByZXF1ZXN0VVJJID0gaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKLQotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uOwotICAgICAgICBpbnQgaSA9IHJlcXVlc3RVUkkubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgaWYgKGkgPCAwKSB7Ci0gICAgICAgICAgICBwcm9jZXNzVW5rbm93bihodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGkgPT0gcmVxdWVzdFVSSS5sZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICAgIHByb2Nlc3NJbmRleChodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3BlcmF0aW9uID0gcmVxdWVzdFVSSS5zdWJzdHJpbmcoaSArIDEpOwotICAgICAgICB9Ci0KLQotICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgb3BlcmF0aW9uQ2FjaGUuZ2V0KG9wZXJhdGlvbi50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UodGhpcywgbmV3IE9iamVjdFtde2h0dHBTZXJ2bGV0UmVxdWVzdCwgaHR0cFNlcnZsZXRSZXNwb25zZX0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cud2FybigiRXJyb3IgZGlzcGF0Y2hpbmcgcmVxdWVzdCAiICsgcmVxdWVzdFVSSSwgZSk7Ci0gICAgICAgICAgICAgICAgaHR0cFNlcnZsZXRSZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvY2Vzc1Vua25vd24oaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIG1ldGhvZCBmb3IgaW5kZXggcGFnZS4gRm9yd2FyZHMgdG8ge0BsaW5rIERFRkFVTFRfSU5ERVhfSlNQfSBieSBkZWZhdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIGh0dHBTZXJ2bGV0UmVxdWVzdCAgVGhlIGluY29taW5nIHJlcXVlc3QuCi0gICAgICogQHBhcmFtIGh0dHBTZXJ2bGV0UmVzcG9uc2UgVGhlIG91dGdvaW5nIHJlc3BvbnNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleChIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICByZW5kZXJWaWV3KERFRkFVTFRfSU5ERVhfSlNQLCBodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIG1ldGhvZCBmb3IgdW5rbm93bi91bnN1cHBvcnRlZCByZXF1ZXN0cy4gUmV0dXJucyBIVFRQIFN0YXR1cyA0MDQgYnkgZGVmYXVsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBodHRwU2VydmxldFJlcXVlc3QgIFRoZSBpbmNvbWluZyByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBodHRwU2VydmxldFJlc3BvbnNlIFRoZSBvdXRnb2luZyByZXNwb25zZS4KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NVbmtub3duKEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgaHR0cFNlcnZsZXRSZXNwb25zZQotICAgICAgICAgICAgICAgIC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyVmlldyhTdHJpbmcganNwTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBodHRwU2VydmxldFJlc3BvbnNlLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihDb25zdGFudHMuQVhJU19XRUJfQ09OVEVOVF9ST09UICsganNwTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgLmluY2x1ZGUoaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmVsb2FkTWV0aG9kcygpIHsKLSAgICAgICAgQ2xhc3MgY2xhenogPSBnZXRDbGFzcygpOwotICAgICAgICB3aGlsZSAoY2xhenogIT0gbnVsbCAmJiAhY2xhenouZXF1YWxzKE9iamVjdC5jbGFzcykpIHsKLSAgICAgICAgICAgIGV4YW1pbmVNZXRob2RzKGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKTsKLSAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4YW1pbmVNZXRob2RzKE1ldGhvZFtdIGFEZWNsYXJlZE1ldGhvZHMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhRGVjbGFyZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gYURlY2xhcmVkTWV0aG9kc1tpXTsKLQotICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICAoTW9kaWZpZXIuaXNQcm90ZWN0ZWQobWV0aG9kLmdldE1vZGlmaWVycygpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKE1FVEhPRF9QUkVGSVgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXMubGVuZ3RoID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlc1swXS5lcXVhbHMoSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGVzWzFdLmVxdWFscyhIdHRwU2VydmxldFJlc3BvbnNlLmNsYXNzKSkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IG1ldGhvZC5nZXROYW1lKCkuc3Vic3RyaW5nKE1FVEhPRF9QUkVGSVgubGVuZ3RoKCkpLnRvTG93ZXJDYXNlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBlbnN1cmUgd2UgZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIG1ldGhvZCB3aXRoIHN1cGVyY2xhc3MgbWV0aG9kCi0gICAgICAgICAgICAgICAgaWYgKCFvcGVyYXRpb25DYWNoZS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkNhY2hlLnB1dChrZXksIG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsIHNlcnZpY2VzKTsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgsIGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZVBhdGgoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsgICAgCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9BYnN0cmFjdEhUVFBTZW5kZXIuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0Fic3RyYWN0SFRUUFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzZlY2Q5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0Fic3RyYWN0SFRUUFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5pMThuLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk1lc3NhZ2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5DcmVkZW50aWFsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSGVhZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5Ib3N0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDb25uZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2RCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBWZXJzaW9uO2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5NdWx0aVRocmVhZGVkSHR0cENvbm5lY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lk5UQ3JlZGVudGlhbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuTmFtZVZhbHVlUGFpcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5Vc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuYXV0aC5BdXRoUG9saWN5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmF1dGguQXV0aFNjb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcy5IdHRwTWV0aG9kUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcy5IdHRwQ29ubmVjdGlvbk1hbmFnZXJQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLkh0dHBDbGllbnRQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucHJvdG9jb2wuUHJvdG9jb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SFRUUFNlbmRlciB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PTllNT1VTID0gImFub255bW91cyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfSE9TVF9OQU1FID0gInByb3h5X2hvc3QiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1BPUlQgPSAicHJveHlfcG9ydCI7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2h1bmtlZCA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgaHR0cFZlcnNpb24gPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RIVFRQU2VuZGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX0hUVFAgPSAiaHR0cCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfSFRUUFMgPSAiaHR0cHMiOwotCi0gICAgLyoqCi0gICAgICogcHJveHlkaXNjcmlwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiBwcm94eU91dFNldHRpbmcgPSBudWxsOwotICAgIHByb3RlY3RlZCBPTU91dHB1dEZvcm1hdCBmb3JtYXQgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLQotICAgIC8qKgotICAgICAqIGlzQWxsb3dlZFJldHJ5IHdpbGwgYmUgdXNpbmcgdG8gY2hlY2sgd2hlcmUgdGhlCi0gICAgICogcmV0cnkgc2hvdWxkIGJlIGFsbG93ZWQgb3Igbm90LgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWxsb3dlZFJldHJ5ID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDaHVua2VkKGJvb2xlYW4gY2h1bmtlZCkgewotICAgICAgICB0aGlzLmNodW5rZWQgPSBjaHVua2VkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEh0dHBWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExLmVxdWFscyh2ZXJzaW9uKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaHR0cFZlcnNpb24gPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTAuZXF1YWxzKHZlcnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5odHRwVmVyc2lvbiA9IEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzEwOwotICAgICAgICAgICAgICAgIC8vIGNodW5rZWQgaXMgbm90IHBvc3NpYmxlIHdpdGggSFRUUC8xLjAKLSAgICAgICAgICAgICAgICB0aGlzLmNodW5rZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJQYXJhbWV0ZXIgIiArIEhUVFBDb25zdGFudHMuUFJPVE9DT0xfVkVSU0lPTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgQ2FuIGhhdmUgdmFsdWVzIG9ubHkgSFRUUC8xLjAgb3IgSFRUUC8xLjEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbGxlY3QgdGhlIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCBzZXQgdGhlbSBpbiB0aGUgbWVzc2FnZSBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWV0aG9kIEh0dHBNZXRob2RCYXNlIGZyb20gd2hpY2ggdG8gZ2V0IGluZm9ybWF0aW9uCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIE1lc3NhZ2VDb250ZXh0IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBpbmZvcm1hdGlvbi4uLiBPUiBOT1QhCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgaWYgcHJvYmxlbXMgb2NjdXIKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvYnRhaW5IVFRQSGVhZGVySW5mb3JtYXRpb24oSHR0cE1ldGhvZEJhc2UgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgLy8gU2V0IFJFU1BPTlNFIHByb3BlcnRpZXMgb250byB0aGUgUkVRVUVTVCBtZXNzYWdlIGNvbnRleHQuICBUaGV5IHdpbGwgbmVlZCB0byBiZSBjb3BpZWQgb2ZmIHRoZSByZXF1ZXN0IGNvbnRleHQgb250bwotICAgICAgICAvLyB0aGUgcmVzcG9uc2UgY29udGV4dCBlbHNld2hlcmUsIGZvciBleGFtcGxlIGluIHRoZSBPdXRJbk9wZXJhdGlvbkNsaWVudC4KLSAgICAgICAgTWFwIHRyYW5zcG9ydEhlYWRlcnMgPSBuZXcgQ29tbW9uc1RyYW5zcG9ydEhlYWRlcnMobWV0aG9kLmdldFJlc3BvbnNlSGVhZGVycygpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSEVBREVSUywgdHJhbnNwb3J0SGVhZGVycyk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19IVFRQX1NUQVRVU19DT0RFLCBuZXcgSW50ZWdlcihtZXRob2QuZ2V0U3RhdHVzQ29kZSgpKSk7Ci0gICAgICAgIEhlYWRlciBoZWFkZXIgPSBtZXRob2QuZ2V0UmVzcG9uc2VIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFKTsKLQotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEhlYWRlckVsZW1lbnRbXSBoZWFkZXJzID0gaGVhZGVyLmdldEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBNZXNzYWdlQ29udGV4dCBpbk1lc3NhZ2VDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCkuZ2V0TWVzc2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBjb250ZW50VHlwZSA9IGhlYWRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgT2JqZWN0IGNoYXJTZXRFbmMgPSBudWxsOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOYW1lVmFsdWVQYWlyIGNoYXJzZXRFbmMgPSBoZWFkZXJzW2ldLmdldFBhcmFtZXRlckJ5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBDb25zdGFudHMuQ0hBUl9TRVRfRU5DT0RJTkcpOwotICAgICAgICAgICAgICAgIGlmIChjaGFyc2V0RW5jICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhclNldEVuYyA9IGNoYXJzZXRFbmMuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbk1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbk1lc3NhZ2VDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFLCBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgaW5NZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNIQVJBQ1RFUl9TRVRfRU5DT0RJTkcsIGNoYXJTZXRFbmMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIFRyYW5zcG9ydCBkZXRhaWxzIHdpbGwgYmUgc3RvcmVkIGluIGEgSGFzaE1hcCBzbyB0aGF0IGFueWJvZHkgaW50ZXJlc3RlZCBjYW4KLSAgICAgICAgICAgICAgICAvLyByZXRyaWV2ZSB0aGVtCi0gICAgICAgICAgICAgICAgSGFzaE1hcCB0cmFuc3BvcnRJbmZvTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbmZvTWFwLnB1dChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnRJbmZvTWFwLnB1dChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBjaGFyU2V0RW5jKTsKLQotICAgICAgICAgICAgICAgIC8vdGhlIEhhc2hNYXAgaXMgc3RvcmVkIGluIHRoZSBvdXRnb2luZyBtZXNzYWdlLgotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uVFJBTlNQT1JUX0lORk9fTUFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0SW5mb01hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2Vzc2lvbkNvb2tpZSA9IG51bGw7Ci0gICAgICAgIC8vIFByb2Nlc3Mgb2xkIHN0eWxlIGhlYWRlcnMgZmlyc3QKLSAgICAgICAgSGVhZGVyW10gY29va2llSGVhZGVycyA9IG1ldGhvZC5nZXRSZXNwb25zZUhlYWRlcnMoSFRUUENvbnN0YW50cy5IRUFERVJfU0VUX0NPT0tJRSk7Ci0gICAgICAgIFN0cmluZyBjdXN0b21Db29va2lJZCA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNVU1RPTV9DT09LSUVfSUQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZUhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEhlYWRlckVsZW1lbnRbXSBlbGVtZW50cyA9IGNvb2tpZUhlYWRlcnNbaV0uZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIHsKLSAgICAgICAgICAgICAgICBIZWFkZXJFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tlXTsKLSAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNFU1NJT05fQ09PS0lFLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0VTU0lPTl9DT09LSUVfSlNFU1NJT05JRC5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gcHJvY2Vzc0Nvb2tpZUhlYWRlcihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvb29raUlkICE9IG51bGwgJiYgY3VzdG9tQ29vb2tpSWQuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IHByb2Nlc3NDb29raWVIZWFkZXIoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE92ZXJ3cml0ZSBvbGQgc3R5bGUgY29va2llcyB3aXRoIG5ldyBzdHlsZSBvbmVzIGlmIHByZXNlbnQKLSAgICAgICAgY29va2llSGVhZGVycyA9IG1ldGhvZC5nZXRSZXNwb25zZUhlYWRlcnMoSFRUUENvbnN0YW50cy5IRUFERVJfU0VUX0NPT0tJRTIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb2tpZUhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEhlYWRlckVsZW1lbnRbXSBlbGVtZW50cyA9IGNvb2tpZUhlYWRlcnNbaV0uZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIHsKLSAgICAgICAgICAgICAgICBIZWFkZXJFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tlXTsKLSAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNFU1NJT05fQ09PS0lFLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU0VTU0lPTl9DT09LSUVfSlNFU1NJT05JRC5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gcHJvY2Vzc0Nvb2tpZUhlYWRlcihlbGVtZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoY3VzdG9tQ29vb2tpSWQhPW51bGwmJmN1c3RvbUNvb29raUlkLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXROYW1lKCkpKXsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IHByb2Nlc3NDb29raWVIZWFkZXIoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNlc3Npb25Db29raWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbXNnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dCgpLnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09PS0lFX1NUUklORywgc2Vzc2lvbkNvb2tpZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm9jZXNzQ29va2llSGVhZGVyKEhlYWRlckVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBTdHJpbmcgY29va2llID0gZWxlbWVudC5nZXROYW1lKCkgKyAiPSIgKyBlbGVtZW50LmdldFZhbHVlKCk7Ci0gICAgICAgIE5hbWVWYWx1ZVBhaXJbXSBwYXJhbWV0ZXJzID0gIGVsZW1lbnQuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgcGFyYW1ldGVycyAhPSBudWxsICYmIGogPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBOYW1lVmFsdWVQYWlyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbal07Ci0gICAgICAgICAgICBjb29raWUgPSBjb29raWUgKyAiOyAiICsgcGFyYW1ldGVyLmdldE5hbWUoKSArICI9IiArIHBhcmFtZXRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb29raWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1Jlc3BvbnNlKEh0dHBNZXRob2RCYXNlIGh0dHBNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvYnRhaW5IVFRQSGVhZGVySW5mb3JtYXRpb24oaHR0cE1ldGhvZCwgbXNnQ29udGV4dCk7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBodHRwTWV0aG9kLmdldFJlc3BvbnNlQm9keUFzU3RyZWFtKCk7Ci0gICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoImNhbk5vdEJlTnVsbCIsICJJbnB1dFN0cmVhbSIpKTsKLSAgICAgICAgfQotICAgICAgICBIZWFkZXIgY29udGVudEVuY29kaW5nID0KLSAgICAgICAgICAgICAgICBodHRwTWV0aG9kLmdldFJlc3BvbnNlSGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcpOwotICAgICAgICBpZiAoY29udGVudEVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50RW5jb2RpbmcuZ2V0VmFsdWUoKS4KLSAgICAgICAgICAgICAgICAgICAgZXF1YWxzSWdub3JlQ2FzZShIVFRQQ29uc3RhbnRzLkNPTVBSRVNTSU9OX0daSVApKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udGVudC1lbmNvZGluZyBpcyBpZGVudGl0eSB3ZSBjYW4gYmFzaWNhbGx5IGlnbm9yZSBpdC4KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoISJpZGVudGl0eSIuZXF1YWxzSWdub3JlQ2FzZShjb250ZW50RW5jb2RpbmcuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJIVFRQIDoiICsgInVuc3VwcG9ydGVkIGNvbnRlbnQtZW5jb2Rpbmcgb2YgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29udGVudEVuY29kaW5nLmdldFZhbHVlKCkgKyAiJyBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgT3BlcmF0aW9uQ29udGV4dCBvcENvbnRleHQgPSBtc2dDb250ZXh0LmdldE9wZXJhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgaWYgKG9wQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcENvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0lOLCBpbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZW5kKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogZ2V0dGluZyBob3N0IGNvbmZpZ3VyYXRpb24gdG8gc3VwcG9ydCBzdGFuZGFyZCBodHRwL3MsIHByb3h5IGFuZCBOVExNIHN1cHBvcnQKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGllbnQgYWN0aXZlIEh0dHBDbGllbnQKLSAgICAgKiBAcGFyYW0gbXNnQ3R4IGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSB0YXJnZXRVUkwgdGhlIHRhcmdldCBVUkwKLSAgICAgKiBAcmV0dXJuIGEgSG9zdENvbmZpZ3VyYXRpb24gc2V0IHVwIHdpdGggcHJveHkgaW5mb3JtYXRpb24KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBwcm9ibGVtcyBvY2N1cgotICAgICAqLwotICAgIHByb3RlY3RlZCBIb3N0Q29uZmlndXJhdGlvbiBnZXRIb3N0Q29uZmlndXJhdGlvbihIdHRwQ2xpZW50IGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgdGFyZ2V0VVJMKXRocm93cyBBeGlzRmF1bHQgewotCi0gICAgICAgIGJvb2xlYW4gaXNBdXRoZW50aWNhdGlvbkVuYWJsZWQgPSBpc0F1dGhlbnRpY2F0aW9uRW5hYmxlZChtc2dDdHgpOwotICAgICAgICBpbnQgcG9ydCA9IHRhcmdldFVSTC5nZXRQb3J0KCk7Ci0KLSAgICAgICAgU3RyaW5nIHByb3RvY29sID0gdGFyZ2V0VVJMLmdldFByb3RvY29sKCk7Ci0gICAgICAgIGlmIChwb3J0ID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoUFJPVE9DT0xfSFRUUC5lcXVhbHMocHJvdG9jb2wpKSB7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IDgwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChQUk9UT0NPTF9IVFRQUy5lcXVhbHMocHJvdG9jb2wpKSB7Ci0gICAgICAgICAgICAgICAgcG9ydCA9IDQ0MzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdG8gc2VlIHRoZSBob3N0IGlzIGEgcHJveHkgYW5kIGluIHRoZSBwcm94eSBsaXN0IC0gYXZhaWxhYmxlIGluIGF4aXMyLnhtbAotICAgICAgICBIb3N0Q29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgSG9zdENvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICAvLyBvbmUgbWlnaHQgbmVlZCB0byBzZXQgaGlzIG93biBzb2NrZXQgZmFjdG9yeS4gTGV0J3MgYWxsb3cgdGhhdCBjYXNlIGFzIHdlbGwuCi0gICAgICAgIFByb3RvY29sIHByb3RvY29sSGFuZGxlciA9Ci0gICAgICAgICAgICAgICAgKFByb3RvY29sKW1zZ0N0eC5nZXRPcHRpb25zKCkuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DVVNUT01fUFJPVE9DT0xfSEFORExFUik7Ci0KLSAgICAgICAgLy8gc2V0dGluZyB0aGUgcmVhbCBob3N0IGNvbmZpZ3VyYXRpb24KLSAgICAgICAgLy8gSSBhc3N1bWUgdGhlIDkwJSBjYXNlLCBvciBldmVuIDk5JSBjYXNlIHdpbGwgYmUgbm8gcHJvdG9jb2wgaGFuZGxlciBjYXNlLgotICAgICAgICBpZiAocHJvdG9jb2xIYW5kbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRIb3N0KHRhcmdldFVSTC5nZXRIb3N0KCksIHBvcnQsIHRhcmdldFVSTC5nZXRQcm90b2NvbCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbmZpZy5zZXRIb3N0KHRhcmdldFVSTC5nZXRIb3N0KCksIHBvcnQsIHByb3RvY29sSGFuZGxlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNBdXRoZW50aWNhdGlvbkVuYWJsZWQpIHsKLSAgICAgICAgICAgIC8vIEJhc2ljLCBEaWdlc3QsIE5UTE0gYW5kIGN1c3RvbSBhdXRoZW50aWNhdGlvbnMuCi0gICAgICAgICAgICB0aGlzLnNldEF1dGhlbnRpY2F0aW9uSW5mbyhjbGllbnQsIG1zZ0N0eCwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwcm94eSBjb25maWd1cmF0aW9uCi0KLSAgICAgICAgaWYgKFByb3h5Q29uZmlndXJhdGlvbi5pc1Byb3h5RW5hYmxlZChtc2dDdHgsdGFyZ2V0VVJMKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJQcm94eUNvbmZpZ3VyYXRpb24iKTsKLSAgICAgICAgICAgIFByb3h5Q29uZmlndXJhdGlvbiBwcm94eUNvbmZpZ3VyYXRpb24gPSBuZXcgUHJveHlDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBwcm94eUNvbmZpZ3VyYXRpb24uY29uZmlndXJlKG1zZ0N0eCxjbGllbnQsY29uZmlnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBdXRoZW50aWNhdGlvbkVuYWJsZWQoTWVzc2FnZUNvbnRleHQgbXNnQ3R4KSB7Ci0gICAgICAgIHJldHVybiAobXNnQ3R4LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQVVUSEVOVElDQVRFKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKgotICAgIFRoaXMgd2lsbCBoYW5kbGUgc2VydmVyIEF1dGhlbnRpY2F0aW9uLCBJdCBjb3VsZCBiZSBlaXRoZXIgTlRMTSwgRGlnZXN0IG9yIEJhc2ljIEF1dGhlbnRpY2F0aW9uLgotICAgIEFwYXJ0IGZyb20gdGhhdCB1c2VyIGNhbiBjaGFuZ2UgdGhlIHByaW9yeSBvciBhZGQgYSBjdXN0b20gYXV0aGVudGljYXRpb24gc2NoZW1lLgotICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0QXV0aGVudGljYXRpb25JbmZvKEh0dHBDbGllbnQgYWdlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IG1zZ0N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yOwotICAgICAgICBPYmplY3Qgb2JqID0gbXNnQ3R4LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQVVUSEVOVElDQVRFKTsKLSAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvcikgewotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0b3IgPSAoSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvcikgb2JqOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gYXV0aGVudGljYXRvci5nZXRVc2VybmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGF1dGhlbnRpY2F0b3IuZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGF1dGhlbnRpY2F0b3IuZ2V0SG9zdCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBhdXRoZW50aWNhdG9yLmdldERvbWFpbigpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvcnQgPSBhdXRoZW50aWNhdG9yLmdldFBvcnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVhbG0gPSBhdXRoZW50aWNhdG9yLmdldFJlYWxtKCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiByZXRyeWluZyBpcyBhdmFpbGFibGUgc2V0IGl0IGZpcnN0ICovCi0gICAgICAgICAgICAgICAgaXNBbGxvd2VkUmV0cnkgPSBhdXRoZW50aWNhdG9yLmlzQWxsb3dlZFJldHJ5KCk7Ci0KLSAgICAgICAgICAgICAgICBDcmVkZW50aWFscyBjcmVkczsKLQotICAgICAgICAgICAgICAgIGFnZW50LmdldFBhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXV0aGVudGljYXRpb25QcmVlbXB0aXZlKGF1dGhlbnRpY2F0b3IuZ2V0UHJlZW1wdGl2ZUF1dGhlbnRpY2F0aW9uKCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ3JlZGVudGlhbHMgZm9yIE5UTE0gQXV0aGVudGljYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSBuZXcgTlRDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQsIGhvc3QsIGRvbWFpbik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkNyZWRlbnRpYWxzIGZvciBEaWdlc3QgYW5kIEJhc2ljIEF1dGhlbnRpY2F0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFnZW50LmdldFN0YXRlKCkuc2V0Q3JlZGVudGlhbHMobmV3IEF1dGhTY29wZShob3N0LCBwb3J0LCByZWFsbSksIGNyZWRzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYWluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qQ3JlZGVudGlhbHMgZm9yIE5UTE0gQXV0aGVudGljYXRpb24gd2hlbiBob3N0IGlzIEFOWV9IT1NUKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWRzID0gbmV3IE5UQ3JlZGVudGlhbHModXNlcm5hbWUsIHBhc3N3b3JkLCBBdXRoU2NvcGUuQU5ZX0hPU1QsIGRvbWFpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZ2VudC5nZXRTdGF0ZSgpLnNldENyZWRlbnRpYWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXV0aFNjb3BlKEF1dGhTY29wZS5BTllfSE9TVCwgcG9ydCwgcmVhbG0pLCBjcmVkcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKkNyZWRlbnRpYWxzIG9ubHkgZm9yIERpZ2VzdCBhbmQgQmFzaWMgQXV0aGVudGljYXRpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZ2VudC5nZXRTdGF0ZSgpLnNldENyZWRlbnRpYWxzKG5ldyBBdXRoU2NvcGUoQXV0aFNjb3BlLkFOWSksIGNyZWRzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBDdXN0b21pemluZyB0aGUgcHJpb3JpdHkgT3JkZXIgKi8KLSAgICAgICAgICAgICAgICBMaXN0IHNjaGVtZXMgPSBhdXRoZW50aWNhdG9yLmdldEF1dGhTY2hlbWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNjaGVtZXMgIT0gbnVsbCAmJiBzY2hlbWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBhdXRoUHJlZnMgPSBuZXcgQXJyYXlMaXN0KDMpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY2hlbWVzLmdldChpKSBpbnN0YW5jZW9mIEF1dGhQb2xpY3kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoUHJlZnMuYWRkKHNjaGVtZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSAoU3RyaW5nKSBzY2hlbWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yLkJBU0lDLmVxdWFscyhzY2hlbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFByZWZzLmFkZChBdXRoUG9saWN5LkJBU0lDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuQXV0aGVudGljYXRvci5OVExNLmVxdWFscyhzY2hlbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFByZWZzLmFkZChBdXRoUG9saWN5Lk5UTE0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChIdHRwVHJhbnNwb3J0UHJvcGVydGllcy5BdXRoZW50aWNhdG9yLkRJR0VTVC5lcXVhbHMoc2NoZW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcmVmcy5hZGQoQXV0aFBvbGljeS5ESUdFU1QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFnZW50LmdldFBhcmFtcygpLnNldFBhcmFtZXRlcihBdXRoUG9saWN5LkFVVEhfU0NIRU1FX1BSSU9SSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcmVmcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLkF1dGhlbnRpY2F0b3IgY2xhc3MgY2FzdCBleGNlcHRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHVzZWQgdG8gY29weSBhbGwgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCAgICAgICAtIFRoZSBtZXNzYWdlQ29udGV4dCBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgICAgLSBUaGUgdGFyZ2V0IFVSTAotICAgICAqIEBwYXJhbSBodHRwTWV0aG9kICAgICAgIC0gVGhlIGh0dHAgbWV0aG9kIHVzZWQgdG8gc2VuZCB0aGUgcmVxdWVzdAotICAgICAqIEBwYXJhbSBodHRwQ2xpZW50ICAgICAgIC0gVGhlIGh0dHBjbGllbnQgdXNlZCB0byBzZW5kIHRoZSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHNvYXBBY3Rpb25TdHJpbmcgLSBUaGUgc29hcCBhY3Rpb24gYXRyaW5nIG9mIHRoZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VGb3JtYXR0ZXIgLSBUaGUgbWVzc2FnZUZvcm1hdHRlciBmb3IgdGhlIHJlbGF2ZW50IHJlcXVlc3QgbWVzc2FnZQotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0IC0gVGhyb3duIGluIGNhc2UgYW4gZXhjZXB0aW9uIG9jY3VycwotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzYWdlRm9ybWF0dGVyIHBvcHVsYXRlQ29tbW9uUHJvcGVydGllcyhNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBVUkwgdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cE1ldGhvZEJhc2UgaHR0cE1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgaWYgKGlzQXV0aGVudGljYXRpb25FbmFibGVkKG1zZ0NvbnRleHQpKSB7Ci0gICAgICAgICAgICBodHRwTWV0aG9kLnNldERvQXV0aGVudGljYXRpb24odHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPSBUcmFuc3BvcnRVdGlscy5nZXRNZXNzYWdlRm9ybWF0dGVyKAotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQpOwotCi0gICAgICAgIHVybCA9IG1lc3NhZ2VGb3JtYXR0ZXIuZ2V0VGFyZ2V0QWRkcmVzcyhtc2dDb250ZXh0LCBmb3JtYXQsIHVybCk7Ci0KLSAgICAgICAgaHR0cE1ldGhvZC5zZXRQYXRoKHVybC5nZXRQYXRoKCkpOwotCi0gICAgICAgIGh0dHBNZXRob2Quc2V0UXVlcnlTdHJpbmcodXJsLmdldFF1ZXJ5KCkpOwotCi0gICAgICAgIGh0dHBNZXRob2Quc2V0UmVxdWVzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRm9ybWF0dGVyLmdldENvbnRlbnRUeXBlKG1zZ0NvbnRleHQsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29hcEFjdGlvblN0cmluZykpOwotCi0gICAgICAgIGh0dHBNZXRob2Quc2V0UmVxdWVzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9IT1NULCB1cmwuZ2V0SG9zdCgpKTsKLQotICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRPcHRpb25zKCkgIT0gbnVsbCAmJiBtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5pc01hbmFnZVNlc3Npb24oKSkgewotICAgICAgICAgICAgLy8gc2V0dGluZyB0aGUgY29va2llIGluIHRoZSBvdXQgcGF0aAotICAgICAgICAgICAgT2JqZWN0IGNvb2tpZVN0cmluZyA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HKTsKLQotICAgICAgICAgICAgaWYgKGNvb2tpZVN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGNvb2tpZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgaHR0cE1ldGhvZC5zZXRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0NPT0tJRSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh0dHBWZXJzaW9uLmVxdWFscyhIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMCkpIHsKLSAgICAgICAgICAgIGh0dHBDbGllbnQuZ2V0UGFyYW1zKCkuc2V0VmVyc2lvbihIdHRwVmVyc2lvbi5IVFRQXzFfMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXR0ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgZHluYW1pY2FsbHkgc2V0IHRpbWUgb3V0IHZhbHVlcyBmcm9tIHRoZQotICAgICAqIG1lc3NhZ2UgY29udGV4dC4gSWYgdGhlIHZhbHVlcyBhcmUgbm90IGF2YWlsYWJsZSBvciBpbnZhbGlkIHRoZW4KLSAgICAgKiB0aGUgZGVmYXVsdCB2YWx1ZXMgb3IgdGhlIHZhbHVlcyBzZXQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSB1c2VkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgYWN0aXZlIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHBhcmFtIGh0dHBDbGllbnQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGltZW91dHMoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgSHR0cENsaWVudCBodHRwQ2xpZW50KSB7Ci0gICAgICAgIC8vIElmIHRoZSBTT19USU1FT1VUIG9mIENPTk5FQ1RJT05fVElNRU9VVCBpcyBzZXQgYnkgZHluYW1pY2FsbHkgdGhlCi0gICAgICAgIC8vIG92ZXJyaWRlIHRoZSBzdGF0aWMgY29uZmlnCi0gICAgICAgIEludGVnZXIgdGVtcFNvVGltZW91dFByb3BlcnR5ID0KLSAgICAgICAgICAgICAgICAoSW50ZWdlcikgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLlNPX1RJTUVPVVQpOwotICAgICAgICBJbnRlZ2VyIHRlbXBDb25uVGltZW91dFByb3BlcnR5ID0KLSAgICAgICAgICAgICAgICAoSW50ZWdlcikgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VUKTsKLSAgICAgICAgbG9uZyB0aW1lb3V0ID0gbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0VGltZU91dEluTWlsbGlTZWNvbmRzKCk7Ci0KLSAgICAgICAgaWYgKHRlbXBDb25uVGltZW91dFByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBjb25uZWN0aW9uVGltZW91dCA9IHRlbXBDb25uVGltZW91dFByb3BlcnR5LmludFZhbHVlKCk7Ci0gICAgICAgICAgICAvLyB0aW1lb3V0IGZvciBpbml0aWFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGh0dHBDbGllbnQuZ2V0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0UGFyYW1zKCkuc2V0Q29ubmVjdGlvblRpbWVvdXQoY29ubmVjdGlvblRpbWVvdXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2V0IHRpbWVvdXQgaW4gY2xpZW50Ci0gICAgICAgICAgICBpZiAodGltZW91dCA+IDApIHsKLSAgICAgICAgICAgICAgICBodHRwQ2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldENvbm5lY3Rpb25UaW1lb3V0KChpbnQpIHRpbWVvdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRlbXBTb1RpbWVvdXRQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc29UaW1lb3V0ID0gdGVtcFNvVGltZW91dFByb3BlcnR5LmludFZhbHVlKCk7Ci0gICAgICAgICAgICAvLyBTT19USU1FT1VUIC0tIHRpbWVvdXQgZm9yIGJsb2NraW5nIHJlYWRzCi0gICAgICAgICAgICBodHRwQ2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldFNvVGltZW91dChzb1RpbWVvdXQpOwotICAgICAgICAgICAgaHR0cENsaWVudC5nZXRQYXJhbXMoKS5zZXRTb1RpbWVvdXQoc29UaW1lb3V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNldCB0aW1lb3V0IGluIGNsaWVudAotICAgICAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaHR0cENsaWVudC5nZXRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoKS5nZXRQYXJhbXMoKS5zZXRTb1RpbWVvdXQoKGludCkgdGltZW91dCk7Ci0gICAgICAgICAgICAgICAgaHR0cENsaWVudC5nZXRQYXJhbXMoKS5zZXRTb1RpbWVvdXQoKGludCkgdGltZW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JtYXQoT01PdXRwdXRGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldEh0dHBDbGllbnQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgewotICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IChIdHRwQ2xpZW50KSBtc2dDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ0FDSEVEX0hUVFBfQ0xJRU5UKTsKLSAgICAgICAgaWYgKGh0dHBDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgaHR0cENsaWVudCA9IChIdHRwQ2xpZW50KSBjb25maWdDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ0FDSEVEX0hUVFBfQ0xJRU5UKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHR0cENsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gaHR0cENsaWVudDsKLSAgICAgICAgfQotCi0gICAgICAgIEh0dHBDb25uZWN0aW9uTWFuYWdlciBjb25uTWFuYWdlciA9Ci0gICAgICAgICAgICAoSHR0cENvbm5lY3Rpb25NYW5hZ2VyKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLk1VTFRJVEhSRUFEX0hUVFBfQ09OTkVDVElPTl9NQU5BR0VSKTsKLSAgICAgICAgaWYgKGNvbm5NYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIGNvbm5NYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoSHR0cENvbm5lY3Rpb25NYW5hZ2VyKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NVVRUSVRIUkVBRF9IVFRQX0NPTk5FQ1RJT05fTUFOQUdFUik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm5NYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIHJldXNlIEh0dHBDb25uZWN0aW9uTWFuYWdlcgotICAgICAgICAgICAgc3luY2hyb25pemVkIChjb25maWdDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgY29ubk1hbmFnZXIgPSAoSHR0cENvbm5lY3Rpb25NYW5hZ2VyKSBjb25maWdDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLk1VTFRJVEhSRUFEX0hUVFBfQ09OTkVDVElPTl9NQU5BR0VSKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubk1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsb2cudHJhY2UoIk1ha2luZyBuZXcgQ29ubmVjdGlvbk1hbmFnZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgY29ubk1hbmFnZXIgPSBuZXcgTXVsdGlUaHJlYWRlZEh0dHBDb25uZWN0aW9uTWFuYWdlcigpOwotICAgICAgICAgICAgICAgICAgICAvKiAKLSAgICAgICAgICAgICAgICAgICAgICogQ29tbWVudGVkIG91dCBmb3Igbm93IGFzIGJ1Z3MgaW4gb3RoZXIgcGFydHMgb2YgQXhpczIgY2F1c2UgdGVzdCBmYWlsdXJlcyB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAqIHByb3BlciBjb25uZWN0aW9uIHJldXNlIGlzIGVuYWJsZWQuIAotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1VTFRJVEhSRUFEX0hUVFBfQ09OTkVDVElPTl9NQU5BR0VSLCAKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEh0dHBDbGllbnQgc2luY2UgdGhlIHdheQotICAgICAgICAgKiBpdCBpcyB1c2VkIGhlcmUgaXQncyBub3QgZnVsbHkgdGhyZWFkLXNhZmUuCi0gICAgICAgICAqLwotICAgICAgICBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoY29ubk1hbmFnZXIpOwotCi0gICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IGluIGNhc2Ugd2UgaGF2ZSBhIGNvbm5lY3Rpb24gcG9vbCBzdGFydmF0aW9uIHRvIDMwc2VjCi0gICAgICAgIGh0dHBDbGllbnQuZ2V0UGFyYW1zKCkuc2V0Q29ubmVjdGlvbk1hbmFnZXJUaW1lb3V0KDMwMDAwKTsKLQotICAgICAgICAvLyBHZXQgdGhlIHRpbWVvdXQgdmFsdWVzIHNldCBpbiB0aGUgcnVudGltZQotICAgICAgICBpbml0aWFsaXplVGltZW91dHMobXNnQ29udGV4dCwgaHR0cENsaWVudCk7Ci0KLSAgICAgICAgcmV0dXJuIGh0dHBDbGllbnQ7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU1ldGhvZChIdHRwQ2xpZW50IGh0dHBDbGllbnQsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwTWV0aG9kIG1ldGhvZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSG9zdENvbmZpZ3VyYXRpb24gY29uZmlnID0gdGhpcy5nZXRIb3N0Q29uZmlndXJhdGlvbihodHRwQ2xpZW50LCBtc2dDb250ZXh0LCB1cmwpOwotCi0gICAgICAgIGlmICghbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSFRUUF9NRVRIT0QsIG1ldGhvZCk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBjdXN0b20gaGVhZGVycywgaWYgYXZhaWxhYmxlCi0gICAgICAgIGFkZEN1c3RvbUhlYWRlcnMobWV0aG9kLCBtc2dDb250ZXh0KTsKLQotICAgICAgICAvLyBhZGQgY29tcHJlc3Npb24gaGVhZGVycyBpZiBuZWVkZWQKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNQcm9wZXJ0eVRydWUoSFRUUENvbnN0YW50cy5NQ19BQ0NFUFRfR1pJUCkpIHsKLSAgICAgICAgICAgIG1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX0FDQ0VQVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5DT01QUkVTU0lPTl9HWklQKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKEhUVFBDb25zdGFudHMuTUNfR1pJUF9SRVFVRVNUKSkgewotICAgICAgICAgICAgbWV0aG9kLmFkZFJlcXVlc3RIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5DT01QUkVTU0lPTl9HWklQKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRF9QQVJBTVMpICE9IG51bGwpIHsKLSAgICAgICAgICAgIEh0dHBNZXRob2RQYXJhbXMgcGFyYW1zID0gKEh0dHBNZXRob2RQYXJhbXMpbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRF9QQVJBTVMpOwotICAgICAgICAgICAgbWV0aG9kLnNldFBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvb2tpZVBvbGljeSA9IChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT09LSUVfUE9MSUNZKTsKLSAgICAgICAgaWYgKGNvb2tpZVBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1zKCkuc2V0Q29va2llUG9saWN5KGNvb2tpZVBvbGljeSk7ICAgCi0gICAgICAgIH0KLSAgICAgICAgaHR0cENsaWVudC5leGVjdXRlTWV0aG9kKGNvbmZpZywgbWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b21IZWFkZXJzKEh0dHBNZXRob2QgbWV0aG9kLCBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB7Ci0KLSAgICAgICAgYm9vbGVhbiBpc0N1c3RvbVVzZXJBZ2VudFNldCA9IGZhbHNlOwotICAgICAgICAvLyBzZXQgdGhlIGN1c3RvbSBoZWFkZXJzLCBpZiBhdmFpbGFibGUKLSAgICAgICAgT2JqZWN0IGh0dHBIZWFkZXJzT2JqID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfSEVBREVSUyk7Ci0gICAgICAgIGlmIChodHRwSGVhZGVyc09iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoaHR0cEhlYWRlcnNPYmogaW5zdGFuY2VvZiBBcnJheUxpc3QpIHsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3QgaHR0cEhlYWRlcnMgPSAoQXJyYXlMaXN0KSBodHRwSGVhZGVyc09iajsKLSAgICAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaHR0cEhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gKEhlYWRlcikgaHR0cEhlYWRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoSFRUUENvbnN0YW50cy5IRUFERVJfVVNFUl9BR0VOVC5lcXVhbHMoaGVhZGVyLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VzdG9tVXNlckFnZW50U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZXRob2QuYWRkUmVxdWVzdEhlYWRlcihoZWFkZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChodHRwSGVhZGVyc09iaiBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgIE1hcCBodHRwSGVhZGVycyA9IChNYXApIGh0dHBIZWFkZXJzT2JqOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBodHRwSGVhZGVycy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ICA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoSFRUUENvbnN0YW50cy5IRUFERVJfVVNFUl9BR0VOVC5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21Vc2VyQWdlbnRTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5hZGRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNDdXN0b21Vc2VyQWdlbnRTZXQpIHsKLSAgICAgICAgICAgIFN0cmluZyB1c2VyQWdlbnRTdHJpbmcgPSBnZXRVc2VyQWdlbnQobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBtZXRob2Quc2V0UmVxdWVzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9VU0VSX0FHRU5ULCB1c2VyQWdlbnRTdHJpbmcpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRVc2VyQWdlbnQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIHVzZXJBZ2VudFN0cmluZyA9ICJBeGlzMiI7Ci0gICAgICAgIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7Ci0gICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5VU0VSX0FHRU5UKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgdXNlckFnZW50RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmdldFBhcmFtZXRlcihIVFRQQ29uc3RhbnRzLlVTRVJfQUdFTlQpLmdldFBhcmFtZXRlckVsZW1lbnQoKTsKLSAgICAgICAgICAgIHVzZXJBZ2VudFN0cmluZyA9IHVzZXJBZ2VudEVsZW1lbnQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgICAgIE9NQXR0cmlidXRlIGxvY2tlZEF0dHJpYnV0ZSA9IHVzZXJBZ2VudEVsZW1lbnQuZ2V0QXR0cmlidXRlKG5ldyBRTmFtZSgibG9ja2VkIikpOwotICAgICAgICAgICAgaWYgKGxvY2tlZEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2tlZEF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotICAgICAgICAgICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBSdW50aW1lIG92ZXJpbmcgcGFydAotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuVVNFUl9BR0VOVCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVzZXJBZ2VudFN0cmluZyA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuVVNFUl9BR0VOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdXNlckFnZW50U3RyaW5nOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0F4aXNSZXF1ZXN0RW50aXR5LmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9BeGlzUmVxdWVzdEVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGUzMDg0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0F4aXNSZXF1ZXN0RW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuTWVzc2FnZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUmVxdWVzdEVudGl0eTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBUaGlzIFJlcXVlc3QgRW50aXR5IGlzIHVzZWQgYnkgdGhlIEhUVFBDb21tb25zVHJhbnNwb3J0U2VuZGVyLiBUaGlzIHdyYXBzIHRoZQotICogQXhpczIgbWVzc2FnZSBmb3JtYXR0ZXIgb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgQXhpc1JlcXVlc3RFbnRpdHkgaW1wbGVtZW50cyBSZXF1ZXN0RW50aXR5IHsKLQotICAgIHByaXZhdGUgTWVzc2FnZUZvcm1hdHRlciBtZXNzYWdlRm9ybWF0dGVyOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNodW5rZWQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBieXRlczsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FsbG93ZWRSZXRyeTsKLQotICAgIHByaXZhdGUgT01PdXRwdXRGb3JtYXQgZm9ybWF0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc29hcEFjdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBjYWxscyB0byB0aGlzIHJlcXVlc3QgZW50aXR5IGFyZSBkZWxlZ2F0ZWQgdG8gdGhlIGZvbGxvd2luZyBBeGlzMgotICAgICAqIG1lc3NhZ2UgZm9ybWF0dGVyIG9iamVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlRm9ybWF0dGVyCi0gICAgICovCi0gICAgcHVibGljIEF4aXNSZXF1ZXN0RW50aXR5KE1lc3NhZ2VGb3JtYXR0ZXIgbWVzc2FnZUZvcm1hdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT01PdXRwdXRGb3JtYXQgZm9ybWF0LCBTdHJpbmcgc29hcEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaHVua2VkLCBib29sZWFuIGlzQWxsb3dlZFJldHJ5KSB7Ci0gICAgICAgIHRoaXMubWVzc2FnZUZvcm1hdHRlciA9IG1lc3NhZ2VGb3JtYXR0ZXI7Ci0gICAgICAgIHRoaXMubWVzc2FnZUNvbnRleHQgPSBtc2dDb250ZXh0OwotICAgICAgICB0aGlzLmNodW5rZWQgPSBjaHVua2VkOwotICAgICAgICB0aGlzLmlzQWxsb3dlZFJldHJ5ID0gaXNBbGxvd2VkUmV0cnk7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwotICAgICAgICB0aGlzLnNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0YWJsZSgpIHsKLSAgICAgICAgLy8gQWxsIEF4aXMyIHJlcXVlc3QgZW50aXR5IGltcGxlbWVudGF0aW9ucyB3ZXJlIHJldHVybmluZyB0aGlzIHRydWUKLSAgICAgICAgLy8gU28gd2UgcmV0dXJuIHRydWUgYXMgZGVmdWFsdAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJlcXVlc3QoT3V0cHV0U3RyZWFtIG91dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgT2JqZWN0IGd6aXAgPSBtZXNzYWdlQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5NQ19HWklQX1JFUVVFU1QpOwotICAgICAgICBpZiAoZ3ppcCAhPSBudWxsICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGd6aXApICYmIGNodW5rZWQpIHsKLSAgICAgICAgICAgIG91dFN0cmVhbSA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChjaHVua2VkKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlci53cml0ZVRvKG1lc3NhZ2VDb250ZXh0LCBmb3JtYXQsIG91dFN0cmVhbSwgaXNBbGxvd2VkUmV0cnkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBieXRlcyA9IG1lc3NhZ2VGb3JtYXR0ZXIuZ2V0Qnl0ZXMobWVzc2FnZUNvbnRleHQsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dFN0cmVhbS53cml0ZShieXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3V0U3RyZWFtIGluc3RhbmNlb2YgR1pJUE91dHB1dFN0cmVhbSkgewotICAgICAgICAgICAgICAgICgoR1pJUE91dHB1dFN0cmVhbSkgb3V0U3RyZWFtKS5maW5pc2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0gICAgICAgIGlmIChjaHVua2VkKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnl0ZXMgPSBtZXNzYWdlRm9ybWF0dGVyLmdldEJ5dGVzKG1lc3NhZ2VDb250ZXh0LCBmb3JtYXQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ5dGVzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotICAgICAgICByZXR1cm4gbWVzc2FnZUZvcm1hdHRlci5nZXRDb250ZW50VHlwZShtZXNzYWdlQ29udGV4dCwgZm9ybWF0LCBzb2FwQWN0aW9uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9BeGlzU2VydmxldC5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQXhpc1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5ZDk2Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9BeGlzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmF1bHRDb2RlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5BZGRyZXNzaW5nSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlc3Npb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC5XYXJCYXNlZEF4aXNDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlci5JbnZvY2F0aW9uUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuTGlzdGVuZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5IdHRwVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC51dGlsLlF1ZXJ5U3RyaW5nUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAudXRpbC5SRVNUVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLQotLyoqCi0gKiBDbGFzcyBBeGlzU2VydmxldAotICovCi1wdWJsaWMgY2xhc3MgQXhpc1NlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCBpbXBsZW1lbnRzIFRyYW5zcG9ydExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzU2VydmxldC5jbGFzcyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTl9DT05URVhUID0gIkNPTkZJR1VSQVRJT05fQ09OVEVYVCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9JRCA9ICJTZXNzaW9uSWQiOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IG1ldGFkYXRhUXVlcnlQYXJhbU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigKLSAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoIndzZGwyIiwgIndzZGwiLCAieHNkIiwgInBvbGljeSIpKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbjsKLQotICAgIHByb3RlY3RlZCB0cmFuc2llbnQgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnOwotCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBMaXN0aW5nQWdlbnQgYWdlbnQ7Ci0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzYWJsZVJFU1QgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9TRVJWSUNFU19TVUZGSVggPSAiL3NlcnZpY2VzL2xpc3RTZXJ2aWNlcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfRkFVTFRZX1NFUlZJQ0VTX1NVRkZJWCA9ICIvc2VydmljZXMvTGlzdEZhdWx0eVNlcnZpY2VzIjsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2xvc2VSZWFkZXIgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNCAqIDg7Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGluaXRDYWxsZWQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEltcGxlbWVudGFpb24gb2YgUE9TVCBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0Ci0gICAgICogQHBhcmFtIHJlc3BvbnNlCi0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vc2V0IHRoZSBpbml0aWFsIGJ1ZmZlciBmb3IgYSBsYXJnZXIgdmFsdWUKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgcmVzcG9uc2Uuc2V0QnVmZmVyU2l6ZShCVUZGRVJfU0laRSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGluaXRDb250ZXh0Um9vdChyZXF1ZXN0KTsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0OwotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHJlcXVlc3QuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgaWYgKCFIVFRQVHJhbnNwb3J0VXRpbHMuaXNSRVNUUmVxdWVzdChjb250ZW50VHlwZSkpIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQgPSBjcmVhdGVNZXNzYWdlQ29udGV4dChyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBhZGRpbmcgU2VydmxldENvbnRleHQgaW50byBtc2dDb250ZXh0OwotICAgICAgICAgICAgICAgIFN0cmluZyB1cmw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCl7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgKGZhbGxiYWNrIHRvIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKSA6IiArIHQpOyAgICAKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEludm9jYXRpb25SZXNwb25zZSBwaSA9IEhUVFBUcmFuc3BvcnRVdGlscy4KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NIVFRQUG9zdFJlcXVlc3QobXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9TT0FQX0FDVElPTiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCk7Ci0KLSAgICAgICAgICAgICAgICBCb29sZWFuIGhvbGRSZXNwb25zZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoQm9vbGVhbikgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuSE9MRF9SRVNQT05TRSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGkuZXF1YWxzKEludm9jYXRpb25SZXNwb25zZS5TVVNQRU5EKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGhvbGRSZXNwb25zZSAhPSBudWxsICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoaG9sZFJlc3BvbnNlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgKChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXdhaXRSZXNwb25zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWw7IGNoYXJzZXQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORykpOwotICAgICAgICAgICAgICAgIC8vIGlmIGRhdGEgaGFzIG5vdCBiZWVuIHNlbnQgYmFjayBhbmQgdGhpcyBpcyBub3QgYSBzaWduYWwgcmVzcG9uc2UKLSAgICAgICAgICAgICAgICBpZiAoIVRyYW5zcG9ydFV0aWxzLmlzUmVzcG9uc2VXcml0dGVuKG1zZ0NvbnRleHQpICAKLSAgICAgICAgICAgICAgICAJCSYmICgoKFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCkgCi0gICAgICAgICAgICAgICAgCQkJCW1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgCQkJCQkJUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MKSkuCi0gICAgICAgICAgICAgICAgCQkJCQkJZ2V0U3RhdHVzKCkgIT0gUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LgotICAgICAgICAgICAgICAgIAkJCQkJCVJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cy5TSUdOQUxMRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlKSB7Ci0gICAgICAgICAgICAgICAgc2V0UmVzcG9uc2VTdGF0ZShtc2dDb250ZXh0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgICAgIGlmIChtc2dDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0F4aXNGYXVsdChtc2dDb250ZXh0LCByZXNwb25zZSwgb3V0LCBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0LmdldE1lc3NhZ2UoKSwgdCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZhdWx0IGlzIG5vdCBnb2luZyBhbG9uZyB0aGUgYmFjayBjaGFubmVsIHdlIHNob3VsZCBiZSAyMDJpbmcKLSAgICAgICAgICAgICAgICAgICAgaWYgKEFkZHJlc3NpbmdIZWxwZXIuaXNGYXVsdFJlZGlyZWN0ZWQobXNnQ29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0FDQ0VQVEVEKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5BWElTX0JJTkRJTkdfT1BFUkFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheGlzQmluZGluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc0JpbmRpbmdNZXNzYWdlIGF4aXNCaW5kaW5nTWVzc2FnZSA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uLmdldEZhdWx0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuRkFVTFRfTkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGF4aXNCaW5kaW5nTWVzc2FnZSAhPSBudWxsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBjb2RlID0gKEludGVnZXIpIGF4aXNCaW5kaW5nTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPREUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoY29kZS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVGYXVsdChtc2dDb250ZXh0LCBvdXQsIG5ldyBBeGlzRmF1bHQodC50b1N0cmluZygpLCB0KSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZTIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VTdGF4QnVpbGRlcihtc2dDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy5kZWxldGVBdHRhY2htZW50cyhtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghZGlzYWJsZVJFU1QpIHsKLSAgICAgICAgICAgICAgICBuZXcgUmVzdFJlcXVlc3RQcm9jZXNzb3IoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uSFRUUF9NRVRIT0RfUE9TVCwgcmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1hNTFJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2hvd1Jlc3REaXNhYmxlZEVycm9yTWVzc2FnZShyZXNwb25zZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgR0VUIGludGVyZmFjZQotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGluaXRDb250ZXh0Um9vdChyZXF1ZXN0KTsKLQotICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gc2VydmUgZm9yIHRoZSBsaXN0U2VydmljZXMgcmVxdWVzdC4KLQotICAgICAgICBTdHJpbmcgcmVxdWVzdFVSSSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICBTdHJpbmcgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gVGhlcmUgY2FuIGJlIHRocmVlIGRpZmZlcmVudCByZXF1ZXN0IGNvbWluZyB0byB0aGlzLgotICAgICAgICAvLyAxLiB3c2RsLCB3c2RsMiBhbmQgeHNkIHJlcXVlc3RzCi0gICAgICAgIC8vIDIuIGxpc3Qgc2VydmljZXMgcmVxdWVzdHMKLSAgICAgICAgLy8gMy4gUkVTVCByZXF1ZXN0cy4KLSAgICAgICAgaWYgKChxdWVyeSAhPSBudWxsKSAmJiBuZXcgUXVlcnlTdHJpbmdQYXJzZXIocXVlcnkpLnNlYXJjaChtZXRhZGF0YVF1ZXJ5UGFyYW1OYW1lcykpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsaW5nIG1ldGEgZGF0YSBleGNoYW5nZSBzdHVmZgotICAgICAgICAgICAgYWdlbnQuaW5pdFRyYW5zcG9ydExpc3RlbmVyKHJlcXVlc3QpOwotICAgICAgICAgICAgYWdlbnQucHJvY2Vzc0xpc3RTZXJ2aWNlKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0VVJJLmVuZHNXaXRoKCIueHNkIikgfHwKLSAgICAgICAgICAgICAgICByZXF1ZXN0VVJJLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0gICAgICAgICAgICBhZ2VudC5wcm9jZXNzRXhwbGljaXRTY2hlbWFBbmRXU0RMKHJlcXVlc3QsIHJlc3BvbnNlKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0VVJJLmVuZHNXaXRoKExJU1RfU0VSVklDRVNfU1VGRklYKSB8fAotICAgICAgICAgICAgICAgIHJlcXVlc3RVUkkuZW5kc1dpdGgoTElTVF9GQVVMVFlfU0VSVklDRVNfU1VGRklYKSkgewotICAgICAgICAgICAgLy8gaGFuZGxpbmcgbGlzdCBzZXJ2aWNlcyByZXF1ZXN0Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFnZW50LmhhbmRsZShyZXF1ZXN0LCByZXNwb25zZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgbmV3IFJlc3RSZXF1ZXN0UHJvY2Vzc29yKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0dFVCwgcmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzVVJMUmVxdWVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd1Jlc3REaXNhYmxlZEVycm9yTWVzc2FnZShyZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBERUxFVEUgaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaW5pdENvbnRleHRSb290KHJlcXVlc3QpOwotICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gc2VydmUgZm9yIHRoZSBsaXN0U2VydmljZXMgcmVxdWVzdC4KLSAgICAgICAgaWYgKCFkaXNhYmxlUkVTVCkgewotICAgICAgICAgICAgbmV3IFJlc3RSZXF1ZXN0UHJvY2Vzc29yKENvbnN0YW50cy5Db25maWd1cmF0aW9uLkhUVFBfTUVUSE9EX0RFTEVURSwgcmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgICAgICAgICAgICAgICAgIC5wcm9jZXNzVVJMUmVxdWVzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd1Jlc3REaXNhYmxlZEVycm9yTWVzc2FnZShyZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBQVVQgaW50ZXJmYWNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXNwb25zZQotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1B1dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGluaXRDb250ZXh0Um9vdChyZXF1ZXN0KTsKLSAgICAgICAgLy8gdGhpcyBtZXRob2QgaXMgYWxzbyB1c2VkIHRvIHNlcnZlIGZvciB0aGUgbGlzdFNlcnZpY2VzIHJlcXVlc3QuCi0gICAgICAgIGlmICghZGlzYWJsZVJFU1QpIHsKLSAgICAgICAgICAgIG5ldyBSZXN0UmVxdWVzdFByb2Nlc3NvcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QVVQsIHJlcXVlc3QsIHJlc3BvbnNlKQotICAgICAgICAgICAgICAgICAgICAucHJvY2Vzc1hNTFJlcXVlc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNob3dSZXN0RGlzYWJsZWRFcnJvck1lc3NhZ2UocmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpdmF0ZSBtZXRob2QgdGhhdCBkZWFscyB3aXRoIGRpc2FibGluZyBvZiBSRVNUIHN1cHBvcnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2hvd1Jlc3REaXNhYmxlZEVycm9yTWVzc2FnZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICB3cml0ZXIucHJpbnRsbigiPGh0bWw+PGJvZHk+PGgyPlBsZWFzZSBlbmFibGUgUkVTVCBzdXBwb3J0IGluIFdFQi1JTkYvY29uZi9heGlzMi54bWwgIiArCi0gICAgICAgICAgICAgICAgImFuZCBXRUItSU5GL3dlYi54bWw8L2gyPjwvYm9keT48L2h0bWw+Iik7Ci0gICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19BQ0NFUFRFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIGJ1aWxkZXJzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlU3RheEJ1aWxkZXIoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNsb3NlUmVhZGVyICYmIG1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gbWVzc2FnZUNvbnRleHQuZ2V0RW52ZWxvcGUoKTsKLSAgICAgICAgICAgICAgICBpZihlbnZlbG9wZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0QVhCdWlsZGVyIGJ1aWxkZXIgPSAoU3RBWEJ1aWxkZXIpIGVudmVsb3BlLmdldEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoZS50b1N0cmluZygpLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3NpbmcgZm9yIGZhdWx0cwotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQKLSAgICAgKiBAcGFyYW0gcmVzCi0gICAgICogQHBhcmFtIG91dAotICAgICAqIEBwYXJhbSBlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBeGlzRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwgQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBmYXVsdCBpcyBub3QgZ29pbmcgYWxvbmcgdGhlIGJhY2sgY2hhbm5lbCB3ZSBzaG91bGQgYmUgMjAyaW5nCi0gICAgICAgICAgICBpZiAoQWRkcmVzc2luZ0hlbHBlci5pc0ZhdWx0UmVkaXJlY3RlZChtc2dDb250ZXh0KSkgewotICAgICAgICAgICAgICAgIHJlcy5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19BQ0NFUFRFRCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5IVFRQX1JFU1BPTlNFX1NUQVRFKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLnNldFN0YXR1cyhJbnRlZ2VyLnBhcnNlSW50KHN0YXR1cykpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChBeGlzQmluZGluZ09wZXJhdGlvbikgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkFYSVNfQklORElOR19PUEVSQVRJT04pOwotICAgICAgICAgICAgICAgIGlmIChheGlzQmluZGluZ09wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nTWVzc2FnZSBmYXVsdCA9IGF4aXNCaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZhdWx0KChTdHJpbmcpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZBVUxUX05BTUUpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZhdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgY29kZSA9IChJbnRlZ2VyKSBmYXVsdC5nZXRQcm9wZXJ0eShXU0RMMkNvbnN0YW50cy5BVFRSX1dIVFRQX0NPREUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRTdGF0dXMoY29kZS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUZhdWx0KG1zZ0NvbnRleHQsIG91dCwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBlMikgewotICAgICAgICAgICAgbG9nLmluZm8oZTIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmF1bHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgT3V0cHV0U3RyZWFtIG91dCwgQXhpc0ZhdWx0IGUpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBvdXQpOwotCi0gICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q29udGV4dCA9Ci0gICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHRCdWlsZGVyLmNyZWF0ZUZhdWx0TWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCwgZSk7Ci0gICAgICAgIC8vIFNPQVAgMS4yIHNwZWNpZmljYXRpb24gbWVudGlvbnMgdGhhdCB3ZSBzaG91bGQgc2VuZCBIVFRQIGNvZGUgNDAwIGluIGEgZmF1bHQgaWYgdGhlCi0gICAgICAgIC8vIGZhdWx0IGNvZGUgU2VuZGVyCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UgPQotICAgICAgICAgICAgICAgIChIdHRwU2VydmxldFJlc3BvbnNlKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVTUE9OU0UpOwotICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAvL1RPRE8gOiBDaGVjayBmb3IgU09BUCAxLjIhCi0gICAgICAgICAgICBTT0FQRmF1bHRDb2RlIGNvZGUgPSBmYXVsdENvbnRleHQuZ2V0RW52ZWxvcGUoKS5nZXRCb2R5KCkuZ2V0RmF1bHQoKS5nZXRDb2RlKCk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCB2YWx1ZUVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZhbHVlRWxlbWVudCA9IGNvZGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNPQVAxMkNvbnN0YW50cy5TT0FQX0VOVkVMT1BFX05BTUVTUEFDRV9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICBTT0FQMTJDb25zdGFudHMuU09BUF9GQVVMVF9WQUxVRV9MT0NBTF9OQU1FKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh2YWx1ZUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChTT0FQMTJDb25zdGFudHMuRkFVTFRfQ09ERV9TRU5ERVIuZXF1YWxzKHZhbHVlRWxlbWVudC5nZXRUZXh0QXNRTmFtZSgpLmdldExvY2FsUGFydCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1zZ0NvbnRleHQuaXNEb2luZ1JFU1QoKSkgewotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICBBeGlzRW5naW5lLnNlbmRGYXVsdChmYXVsdENvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1haW4gaW5pdCBtZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25maWcKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBwcmV2ZW50IHRoaXMgbWV0aG9kIGZyb20gYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHBlciBpbnN0YW5jZQotICAgICAgICBpbml0Q2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgc3VwZXIuaW5pdChjb25maWcpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBzZXJ2bGV0Q29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICB0aGlzLmNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbkNvbnRleHQpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0NPTlRFWFQpOwotICAgICAgICAgICAgaWYoY29uZmlnQ29udGV4dCA9PSBudWxsKXsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0ID0gaW5pdENvbmZpZ0NvbnRleHQoY29uZmlnKTsKLSAgICAgICAgICAgICAgICBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoQ09ORklHVVJBVElPTl9DT05URVhULCBjb25maWdDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF4aXNDb25maWd1cmF0aW9uID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgICAgICBMaXN0ZW5lck1hbmFnZXIgbGlzdGVuZXJNYW5hZ2VyID0gbmV3IExpc3RlbmVyTWFuYWdlcigpOwotICAgICAgICAgICAgbGlzdGVuZXJNYW5hZ2VyLmluaXQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgICAgICBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIHRyYW5zcG9ydEluRGVzY3JpcHRpb24gPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIHRyYW5zcG9ydEluRGVzY3JpcHRpb24uc2V0UmVjZWl2ZXIodGhpcyk7Ci0gICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIuYWRkTGlzdGVuZXIodHJhbnNwb3J0SW5EZXNjcmlwdGlvbiwgdHJ1ZSk7Ci0gICAgICAgICAgICBsaXN0ZW5lck1hbmFnZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIExpc3RlbmVyTWFuYWdlci5kZWZhdWx0Q29uZmlndXJhdGlvbkNvbnRleHQgPSBjb25maWdDb250ZXh0OwotICAgICAgICAgICAgYWdlbnQgPSBuZXcgTGlzdGluZ0FnZW50KGNvbmZpZ0NvbnRleHQpOwotCi0gICAgICAgICAgICBpbml0UGFyYW1zKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZGlzdHJveSB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICAvL3N0b3BpbmcgbGlzdG5lciBtYW5hZ2VyCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC50ZXJtaW5hdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgbG9nLmluZm8oYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemVzIHRoZSBBeGlzMiBwYXJhbWV0ZXJzLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGluaXRQYXJhbXMoKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXI7Ci0gICAgICAgIC8vIGRvIHdlIG5lZWQgdG8gY29tcGxldGVseSBkaXNhYmxlIFJFU1Qgc3VwcG9ydAotICAgICAgICBwYXJhbWV0ZXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkaXNhYmxlUkVTVCA9ICFKYXZhVXRpbHMuaXNGYWxzZUV4cGxpY2l0bHkocGFyYW1ldGVyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2hvdWxkIHdlIGNsb3NlIHRoZSByZWFkZXIocykKLSAgICAgICAgcGFyYW1ldGVyID0gYXhpc0NvbmZpZ3VyYXRpb24uZ2V0UGFyYW1ldGVyKCJheGlzMi5jbG9zZS5yZWFkZXIiKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbG9zZVJlYWRlciA9IEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gcmUtaW5pdGlhbGl6ZSB0aGUgQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKgotICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnNlcnZsZXRDb25maWcgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIWluaXRDYWxsZWQpIHsKLSAgICAgICAgICAgIGluaXQodGhpcy5zZXJ2bGV0Q29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYWxpemUgdGhlIEF4aXMgY29uZmlndXJhdGlvbiBjb250ZXh0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZmlnIFNlcnZsZXQgY29uZmlndXJhdGlvbgotICAgICAqIEByZXR1cm4gQ29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRleHQgaW5pdENvbmZpZ0NvbnRleHQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0NvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHQobmV3IFdhckJhc2VkQXhpc0NvbmZpZ3VyYXRvcihjb25maWcpKTsKLSAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNPTlRBSU5FUl9NQU5BR0VELCBDb25zdGFudHMuVkFMVUVfVFJVRSk7Ci0gICAgICAgICAgICByZXR1cm4gY29uZmlnQ29udGV4dDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKGUpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbnRleHQgcm9vdCBpZiBpdCBpcyBub3Qgc2V0IGFscmVhZHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdENvbnRleHRSb290KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICAgICAgaWYgKGNvbnRleHRSb290ICE9IG51bGwgJiYgY29udGV4dFJvb3QudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBudWxsOwotICAgICAgICAvLyBTdXBwb3J0IG9sZGVyIHNlcnZsZXQgQVBJJ3MKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRleHRQYXRoID0gcmVxLmdldENvbnRleHRQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiT2xkIFNlcnZsZXQgQVBJIChGYWxsYmFjayB0byBIdHRwU2VydmxldFJlcXVlc3QuZ2V0U2VydmxldFBhdGgpIDoiICsgdCk7ICAgIAotICAgICAgICAgICAgY29udGV4dFBhdGggPSByZXEuZ2V0U2VydmxldFBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICAvL2hhbmRsaW5nIFJPT1Qgc2NlbmFyaW8sIGZvciBzZXJ2bGV0cyBpbiB0aGUgZGVmYXVsdCAocm9vdCkgY29udGV4dCwgdGhpcyBtZXRob2QgcmV0dXJucyAiIgotICAgICAgICBpZiAoY29udGV4dFBhdGggIT0gbnVsbCAmJiBjb250ZXh0UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0UGF0aCA9ICIvIjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmNvbnRleHRSb290ID0gY29udGV4dFBhdGg7Ci0KLSAgICAgICAgY29uZmlnQ29udGV4dC5zZXRDb250ZXh0Um9vdChjb250ZXh0Um9vdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCB0cmFuc3BvcnQgaGVhZGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXEKLSAgICAgKiBAcmV0dXJuIE1hcAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXAgZ2V0VHJhbnNwb3J0SGVhZGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNwb3J0SGVhZGVycyhyZXEpOwotICAgIH0KLQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUkZvclNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaXApIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gZ2V0RVBSc0ZvclNlcnZpY2Uoc2VydmljZU5hbWUsIGlwKVswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2VbXSBnZXRFUFJzRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vUlVOTklOR19QT1JUCi0gICAgICAgIFN0cmluZyBwb3J0ID0gKFN0cmluZykgY29uZmlnQ29udGV4dC5nZXRQcm9wZXJ0eShMaXN0aW5nQWdlbnQuUlVOTklOR19QT1JUKTsKLSAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcG9ydCA9ICI4MDgwIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXAgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpcCA9IFV0aWxzLmdldElwQWRkcmVzcyhheGlzQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGlwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaXAgPSAibG9jYWxob3N0IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZW5kcG9pbnRSZWZlcm5jZSA9ICJodHRwOi8vIiArIGlwICsgIjoiICsgcG9ydDsKLSAgICAgICAgaWYgKGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkuc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICBlbmRwb2ludFJlZmVybmNlID0gZW5kcG9pbnRSZWZlcm5jZSArCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkgKyAiLyIgKyBzZXJ2aWNlTmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuZHBvaW50UmVmZXJuY2UgPSBlbmRwb2ludFJlZmVybmNlICsgJy8nICsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSArICIvIiArIHNlcnZpY2VOYW1lOwotICAgICAgICB9Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVuZHBvaW50ID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKGVuZHBvaW50UmVmZXJuY2UgKyAiLyIpOwotCi0gICAgICAgIHJldHVybiBuZXcgRW5kcG9pbnRSZWZlcmVuY2VbXXtlbmRwb2ludH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW5pdCgpOyBzdGFydCgpIGFuZCBzdG9wKCkgd291bGRuJ3QgZG8gYW55dGhpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXhpc0NvbmYKLSAgICAgKiBAcGFyYW0gdHJhbnNwcnRJbgotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBheGlzQ29uZiwKLSAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwcnRJbikgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiBAcGFyYW0gaW52b2NhdGlvblR5cGUgOiBJZiBpbnZvY2F0aW9uVHlwZT10cnVlOyB0aGVuIHRoaXMgd2lsbCBiZSB1c2VkIGluIFNPQVAgbWVzc2FnZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uLiBJZiBpbnZvY2F0aW9uVHlwZT1mYWxzZTsgdGhlbiB0aGlzIHdpbGwgYmUgdXNlZCBpbiBSRVNUIG1lc3NhZ2UgaW52b2NhdGlvbi4KLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCBNZXNzYWdlQ29udGV4dCBjcmVhdGVNZXNzYWdlQ29udGV4dChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnZvY2F0aW9uVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKLQotICAgICAgICBTdHJpbmcgdHJzUHJlZml4ID0gbnVsbDsKLSAgICAgICAgaW50IHNlcGluZGV4ID0gLTE7Ci0gICAgICAgIC8vIFN1cHBvcnQgb2xkZXIgc2VydmxldCBBUEkncwotICAgICAgICB0cnkgeyAKLSAgICAgICAgICAgIHRyc1ByZWZpeCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgKEZhbGxiYWNrIHRvIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKSA6IiArIHQpOyAgICAKLSAgICAgICAgICAgIHRyc1ByZWZpeCA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICB9Ci0gICAgICAgIHNlcGluZGV4ID0gdHJzUHJlZml4LmluZGV4T2YoJzonKTsKLSAgICAgICAgaWYgKHNlcGluZGV4ID4gLTEpIHsKLSAgICAgICAgICAgIHRyc1ByZWZpeCA9IHRyc1ByZWZpeC5zdWJzdHJpbmcoMCwgc2VwaW5kZXgpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUodHJzUHJlZml4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0SW5jb21pbmdUcmFuc3BvcnROYW1lKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgICAgICB0cnNQcmVmaXggPSBDb25zdGFudHMuVFJBTlNQT1JUX0hUVFA7Ci0gICAgICAgIH0KLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BvcnRJbiA9Ci0gICAgICAgICAgICAgICAgYXhpc0NvbmZpZ3VyYXRpb24uZ2V0VHJhbnNwb3J0SW4obXNnQ29udGV4dC5nZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUoKSk7Ci0gICAgICAgIC8vc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBkZXNjcmlwdGlvbi4gVGhpcyB3aWxsIGJlIGh0dHAKLQotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRUcmFuc3BvcnRPdXQodHJzUHJlZml4KTsKLSAgICAgICAgaWYgKHRyYW5zcG9ydE91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgcmVxIGNvbWluZyB2aWEgaHR0cHMgYnV0IHdlIGRvIG5vdCBoYXZlIGEgaHR0cHMgc2VuZGVyCi0gICAgICAgICAgICB0cmFuc3BvcnRPdXQgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRUcmFuc3BvcnRPdXQoQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgbXNnQ29udGV4dC5zZXRUcmFuc3BvcnRJbih0cmFuc3BvcnRJbik7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0VHJhbnNwb3J0T3V0KHRyYW5zcG9ydE91dCk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmVyU2lkZSh0cnVlKTsKLQotICAgICAgICBpZiAoIWludm9jYXRpb25UeXBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSByZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlcXVlc3RVUkkgPSByZXF1ZXN0VVJJICsgIj8iICsgcXVlcnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtc2dDb250ZXh0LnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShyZXF1ZXN0VVJJKSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0RnJvbShuZXcgRW5kcG9pbnRSZWZlcmVuY2UocmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5SRU1PVEVfQUREUiwgcmVxdWVzdC5nZXRSZW1vdGVBZGRyKCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5PVVRfVFJBTlNQT1JUX0lORk8sCi0gICAgICAgICAgICAgICAgbmV3IFNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8ocmVzcG9uc2UpKTsKLSAgICAgICAgLy8gc2V0IHRoZSB0cmFuc3BvcnQgSGVhZGVycwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9IRUFERVJTLCBnZXRUcmFuc3BvcnRIZWFkZXJzKHJlcXVlc3QpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVFJFUVVFU1QsIHJlcXVlc3QpOwotICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVTUE9OU0UsIHJlc3BvbnNlKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBnZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgICAgICAgICAgaWYoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLk1DX0hUVFBfU0VSVkxFVENPTlRFWFQsIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBsb2cuZGVidWcoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9zZXR0aW5nIHRoZSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQgb2JqZWN0Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0LlRSQU5TUE9SVF9DT05UUk9MLAotICAgICAgICAgICAgICAgIG5ldyBTZXJ2bGV0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KHJlc3BvbnNlKSk7Ci0KLSAgICAgICAgcmV0dXJuIG1zZ0NvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYXNzdW1lcywgdGhhdCB0aGUgY3JlYXRlZCBNZXNzYWdlQ29udGV4dCB3aWxsIGJlIHVzZWQgaW4gb25seSBTT0FQIGludm9jYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxCi0gICAgICogQHBhcmFtIHJlc3AKLSAgICAgKiBAcmV0dXJuIE1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2VDb250ZXh0IGNyZWF0ZU1lc3NhZ2VDb250ZXh0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VDb250ZXh0KHJlcSwgcmVzcCwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVHJhbnNwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgICAqIEByZXR1cm4gU2Vzc2lvbkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IChIdHRwU2VydmxldFJlcXVlc3QpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCk7Ci0gICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAoU2Vzc2lvbkNvbnRleHQpIHJlcS5nZXRTZXNzaW9uKHRydWUpLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TRVNTSU9OX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxLmdldFNlc3Npb24oKS5nZXRJZCgpOwotICAgICAgICBpZiAoc2Vzc2lvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQgPSBuZXcgU2Vzc2lvbkNvbnRleHQobnVsbCk7Ci0gICAgICAgICAgICBzZXNzaW9uQ29udGV4dC5zZXRDb29raWVJRChzZXNzaW9uSWQpOwotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFU1NJT05fQ09OVEVYVF9QUk9QRVJUWSwKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlc3Npb25Db250ZXh0KHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgcmV0dXJuIHNlc3Npb25Db250ZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBjbGFzcyBTZXJ2bGV0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IGltcGxlbWVudHMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IHsKLSAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuID0gZmFsc2U7Ci0gICAgICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggcmVzcG9uc2VSZWFkeVNpZ25hbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLQkJLy8gVGhlIGluaXRpYWwgc3RhdHVzIG11c3QgYmUgV0FJVElORywgYXMgdGhlIG1haW4gc2VydmxldCB3aWxsIGRvIHNvbWUgb3RoZXIKLQkJLy8gd29yayBhZnRlciBzZXR0aW5nIHRoaXMgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IHVwLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtaXNzCi0JCS8vIHNpZ25hbHMgdGhhdCBjb21lIGluIGJlZm9yZSB0aGlzIHRocmVhZCBnZXRzIHRvIHRoZSBhd2FpdFJlc3BvbnNlIGNhbGwuCi0gICAgICAgIHByaXZhdGUgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzIHN0YXR1cyA9IFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cy5XQUlUSU5HOwotICAgICAgICBBeGlzRmF1bHQgZmF1bHRUb0JlVGhyb3duT3V0ID0gbnVsbDsKLQotICAgICAgICBTZXJ2bGV0UmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0KEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFja25vd2xlZGdlTWVzc2FnZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydFN0YXR1cy5BQ0tFRDsKLSAgICAgICAgICAgIHJlc3BvbnNlUmVhZHlTaWduYWwuY291bnREb3duKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhd2FpdFJlc3BvbnNlKCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkJsb2NraW5nIHNlcnZsZXQgdGhyZWFkIC0tIGF3YWl0aW5nIHJlc3BvbnNlIik7Ci0gICAgICAgICAgICByZXNwb25zZVJlYWR5U2lnbmFsLmF3YWl0KCk7Ci0KLSAgICAgICAgICAgIGlmIChmYXVsdFRvQmVUaHJvd25PdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IGZhdWx0VG9CZVRocm93bk91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNpZ25hbFJlc3BvbnNlUmVhZHkoKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNpZ25hbGxpbmcgcmVzcG9uc2UgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMuU0lHTkFMTEVEOwotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeVNpZ25hbC5jb3VudERvd24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNpZ25hbEZhdWx0UmVhZHkoQXhpc0ZhdWx0IGZhdWx0KSB7Ci0gICAgICAgICAgICBmYXVsdFRvQmVUaHJvd25PdXQgPSBmYXVsdDsKLSAgICAgICAgICAgIHNpZ25hbFJlc3BvbnNlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZVdyaXR0ZW4oKSB7Ci0gICAgICAgIAlyZXR1cm4gcmVzcG9uc2VXcml0dGVuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXNwb25zZVdyaXR0ZW4oYm9vbGVhbiByZXNwb25zZVdyaXR0ZW4pIHsKLSAgICAgICAgCXRoaXMucmVzcG9uc2VXcml0dGVuID0gcmVzcG9uc2VXcml0dGVuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRSZXNwb25zZVN0YXRlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0ZSA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5IVFRQX1JFU1BPTlNFX1NUQVRFKTsKLSAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdGF0ZUludCA9IEludGVnZXIucGFyc2VJbnQoc3RhdGUpOwotICAgICAgICAgICAgaWYgKHN0YXRlSW50ID09IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKSB7IC8vIFVuYXV0aG9yaXplZAotICAgICAgICAgICAgICAgIFN0cmluZyByZWFsbSA9IChTdHJpbmcpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5IVFRQX0JBU0lDX0FVVEhfUkVBTE0pOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmFzaWMgcmVhbG09XCIiICsgcmVhbG0gKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVlcyBpbiBwcm9jZXNzaW5nIFJFU1QgcmVsYXRlZCBSZXF1ZXN0cy4KLSAgICAgKiBUaGlzIGlzIHRoZSBoZWxwZXIgQ2xhc3MgdXNlIGluIHByb2Nlc3Npbmcgb2YgZG9HZXQsIGRvUHV0ICwgZG9EZWxldGUgYW5kIGRvUG9zdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgY2xhc3MgUmVzdFJlcXVlc3RQcm9jZXNzb3IgewotICAgICAgICBwcm90ZWN0ZWQgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLQotICAgICAgICBwdWJsaWMgUmVzdFJlcXVlc3RQcm9jZXNzb3IoU3RyaW5nIGh0dHBNZXRob2RTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQgPSBjcmVhdGVNZXNzYWdlQ29udGV4dCh0aGlzLnJlcXVlc3QsIHRoaXMucmVzcG9uc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCwKLSAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZFN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzWE1MUmVxdWVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFJFU1RVdGlsLnByb2Nlc3NYTUxSZXF1ZXN0KG1lc3NhZ2VDb250ZXh0LCByZXF1ZXN0LmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVzcG9uc2VXcml0dGVuKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc0ZhdWx0KGF4aXNGYXVsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbG9zZVN0YXhCdWlsZGVyKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NVUkxSZXF1ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUkVTVFV0aWwucHJvY2Vzc1VSTFJlcXVlc3QobWVzc2FnZUNvbnRleHQsIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpKTsKLSAgICAgICAgICAgICAgICB0aGlzLmNoZWNrUmVzcG9uc2VXcml0dGVuKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgICAgIHNldFJlc3BvbnNlU3RhdGUobWVzc2FnZUNvbnRleHQsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRmF1bHQoZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbG9zZVN0YXhCdWlsZGVyKG1lc3NhZ2VDb250ZXh0KTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzcG9uc2VXcml0dGVuKCkgewotICAgICAgICAJaWYgKCFUcmFuc3BvcnRVdGlscy5pc1Jlc3BvbnNlV3JpdHRlbihtZXNzYWdlQ29udGV4dCkpIHsKLSAgICAgICAgCQlyZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19BQ0NFUFRFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZhdWx0KEF4aXNGYXVsdCBlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzQXhpc0ZhdWx0KG1lc3NhZ2VDb250ZXh0LCByZXNwb25zZSwgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlci5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4OWRjNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Db21tb25zSFRUUFRyYW5zcG9ydFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk9wZXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkluT3V0QXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmhhbmRsZXJzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lk91dFRyYW5zcG9ydEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0U2VuZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLkF4aXNIdHRwUmVzcG9uc2VJbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uc0hUVFBUcmFuc3BvcnRTZW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cwotICAgICAgICBUcmFuc3BvcnRTZW5kZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfSE9TVF9OQU1FID0gInByb3h5X2hvc3QiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfUE9SVCA9ICJwcm94eV9wb3J0IjsKLQotICAgIGludCBzb1RpbWVvdXQgPSBIVFRQQ29uc3RhbnRzLkRFRkFVTFRfU09fVElNRU9VVDsKLQotICAgIC8qKgotICAgICAqIHByb3h5ZGlzY3JpcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gcHJveHlPdXRTZXR0aW5nID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5Ci0gICAgICAgICAgICAuZ2V0TG9nKENvbW1vbnNIVFRQVHJhbnNwb3J0U2VuZGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgaHR0cFZlcnNpb24gPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaHVua2VkID0gZmFsc2U7Ci0KLSAgICBpbnQgY29ubmVjdGlvblRpbWVvdXQgPSBIVFRQQ29uc3RhbnRzLkRFRkFVTFRfQ09OTkVDVElPTl9USU1FT1VUOwotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgSHR0cE1ldGhvZCBodHRwTWV0aG9kID0gKEh0dHBNZXRob2QpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCk7Ci0KLSAgICAgICAgaWYgKGh0dHBNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyA6IERvbid0IGRvIHRoaXMgaWYgd2UncmUgbm90IG9uIHRoZSByaWdodCB0aHJlYWQhIENhbiB3ZSBjb25maXJtPwotICAgICAgICAgICAgaHR0cE1ldGhvZC5yZWxlYXNlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5yZW1vdmVQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkhUVFBfTUVUSE9EKTsgLy8gZ3VhcmQgYWdhaW5zdCBtdWx0aXBsZSBjYWxscwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChDb25maWd1cmF0aW9uQ29udGV4dCBjb25mQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjA8L3BhcmFtZXRlcj4gb3IKLSAgICAgICAgLy8gPHBhcmFtZXRlciBuYW1lPSJQUk9UT0NPTCI+SFRUUC8xLjE8L3BhcmFtZXRlcj4gaXMKLSAgICAgICAgLy8gY2hlY2tlZAotICAgICAgICBQYXJhbWV0ZXIgdmVyc2lvbiA9IHRyYW5zcG9ydE91dAotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5QUk9UT0NPTF9WRVJTSU9OKTsKLSAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKEhUVFBDb25zdGFudHMuSEVBREVSX1BST1RPQ09MXzExLmVxdWFscyh2ZXJzaW9uLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgaHR0cFZlcnNpb24gPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMTsKLQotICAgICAgICAgICAgICAgIFBhcmFtZXRlciB0cmFuc2ZlckVuY29kaW5nID0gdHJhbnNwb3J0T3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HKTsKLQotICAgICAgICAgICAgICAgIGlmICgodHJhbnNmZXJFbmNvZGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgSFRUUENvbnN0YW50cy5IRUFERVJfVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRAotICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyh0cmFuc2ZlckVuY29kaW5nLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNodW5rZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTAuZXF1YWxzKHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgaHR0cFZlcnNpb24gPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiUGFyYW1ldGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgSFRUUENvbnN0YW50cy5QUk9UT0NPTF9WRVJTSU9OCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgQ2FuIGhhdmUgdmFsdWVzIG9ubHkgSFRUUC8xLjAgb3IgSFRUUC8xLjEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgdGltZW91dCB2YWx1ZXMgZnJvbSB0aGUgY29uZmlndXJhdGlvbgotICAgICAgICB0cnkgewotICAgICAgICAgICAgUGFyYW1ldGVyIHRlbXBTb1RpbWVvdXRQYXJhbSA9IHRyYW5zcG9ydE91dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuU09fVElNRU9VVCk7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgdGVtcENvbm5UaW1lb3V0UGFyYW0gPSB0cmFuc3BvcnRPdXQKLSAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihIVFRQQ29uc3RhbnRzLkNPTk5FQ1RJT05fVElNRU9VVCk7Ci0KLSAgICAgICAgICAgIGlmICh0ZW1wU29UaW1lb3V0UGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvVGltZW91dCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgdGVtcFNvVGltZW91dFBhcmFtCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZW1wQ29ublRpbWVvdXRQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQgPSBJbnRlZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAucGFyc2VJbnQoKFN0cmluZykgdGVtcENvbm5UaW1lb3V0UGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHByb2JsZW0gbG9nIGl0IGFuZCB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzCi0gICAgICAgICAgICBsb2cuZXJyb3IoIkludmFsaWQgdGltZW91dCB2YWx1ZSBmb3JtYXQ6IG5vdCBhIG51bWJlciIsIG5mZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICAvLyBBbnkgY29kZSB0aGF0ICwgbmVlZCB0byBpbnZva2Ugd2hlbiBzZW5kZXIgc3RvcAotICAgIH0KLQotICAgIHB1YmxpYyBJbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPTU91dHB1dEZvcm1hdCgpOwotICAgICAgICAgICAgLy8gaWYgKCFtc2dDb250ZXh0LmlzRG9pbmdNVE9NKCkpCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nTVRPTShUcmFuc3BvcnRVdGlscy5kb1dyaXRlTVRPTShtc2dDb250ZXh0KSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nU3dBKFRyYW5zcG9ydFV0aWxzLmRvV3JpdGVTd0EobXNnQ29udGV4dCkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ1JFU1QoVHJhbnNwb3J0VXRpbHMuaXNEb2luZ1JFU1QobXNnQ29udGV4dCkpOwotICAgICAgICAgICAgZm9ybWF0LnNldFNPQVAxMShtc2dDb250ZXh0LmlzU09BUDExKCkpOwotICAgICAgICAgICAgZm9ybWF0LnNldERvT3B0aW1pemUobXNnQ29udGV4dC5pc0RvaW5nTVRPTSgpKTsKLSAgICAgICAgICAgIGZvcm1hdC5zZXREb2luZ1NXQShtc2dDb250ZXh0LmlzRG9pbmdTd0EoKSk7Ci0gICAgICAgICAgICBmb3JtYXQuc2V0Q2hhclNldEVuY29kaW5nKFRyYW5zcG9ydFV0aWxzLmdldENoYXJTZXRFbmNvZGluZyhtc2dDb250ZXh0KSk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBtaW1lQm91bmRhcnlQcm9wZXJ0eSA9IG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLk1JTUVfQk9VTkRBUlkpOwotICAgICAgICAgICAgaWYgKG1pbWVCb3VuZGFyeVByb3BlcnR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQuc2V0TWltZUJvdW5kYXJ5KChTdHJpbmcpIG1pbWVCb3VuZGFyeVByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLgotICAgICAgICAgICAgICAgICAgICBnZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydE91dChDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotCi0gICAgICAgICAgICAgLy8gc2V0IHRoZSB0aW1lb3V0IHByb3BlcnRlaWVzCi0KLSAgICAgICAgICAgIFBhcmFtZXRlciBzb1RpbWVvdXRQYXJhbSA9IHRyYW5zcG9ydE91dC5nZXRQYXJhbWV0ZXIoSFRUUENvbnN0YW50cy5TT19USU1FT1VUKTsKLSAgICAgICAgICAgIFBhcmFtZXRlciBjb25uVGltZW91dFBhcmFtID0gdHJhbnNwb3J0T3V0LmdldFBhcmFtZXRlcihIVFRQQ29uc3RhbnRzLkNPTk5FQ1RJT05fVElNRU9VVCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0aGUgcHJvcGVydHkgdmFsdXNlIG9ubHkgaWYgdGhleSBhcmUgbm90IHNldCBieSB0aGUgdXNlciBleHBsaWNpdGx5Ci0gICAgICAgICAgICBpZiAoKHNvVGltZW91dFBhcmFtICE9IG51bGwpICYmIChtc2dDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuU09fVElNRU9VVCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuU09fVElNRU9VVCwgbmV3IEludGVnZXIoKFN0cmluZylzb1RpbWVvdXRQYXJhbS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoY29ublRpbWVvdXRQYXJhbSAhPSBudWxsKSAmJiAobXNnQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNPTk5FQ1RJT05fVElNRU9VVCkgPT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09OTkVDVElPTl9USU1FT1VULCBuZXcgSW50ZWdlcigoU3RyaW5nKWNvbm5UaW1lb3V0UGFyYW0uZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2lmIGEgcGFyYW1ldGVyIGhhcyBzZXQgYmVlbiBzZXQsIHdlIHdpbGwgb21pdCB0aGUgU09BUCBhY3Rpb24gZm9yIFNPQVAgMS4yCi0gICAgICAgICAgICBpZiAodHJhbnNwb3J0T3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1zZ0NvbnRleHQuaXNTT0FQMTEoKSkgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSB0cmFuc3BvcnRPdXQuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuT01JVF9TT0FQXzEyX0FDVElPTik7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJhbWV0ZXJWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZSA9IHBhcmFtLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyVmFsdWUgIT0gbnVsbCAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShwYXJhbWV0ZXJWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgd2hldGhlciB1c2VyIGhhcyBhbHJlYWR5IG92ZXJyaWRkZW4gdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0eVZhbHVlID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5ESVNBQkxFX1NPQVBfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwgfHwgIUphdmFVdGlscy5pc0ZhbHNlRXhwbGljaXRseShwcm9wZXJ0eVZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9TT0FQX0FDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRyYW5zcG9ydCBVUkwgY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBXU0EtVG8uIFNvIHByb2Nlc3NpbmcKLSAgICAgICAgICAgIC8vIHRoYXQgbm93LgotICAgICAgICAgICAgRW5kcG9pbnRSZWZlcmVuY2UgZXByID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyB0cmFuc3BvcnRVUkwgPSAoU3RyaW5nKSBtc2dDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5UUkFOU1BPUlRfVVJMKTsKLQotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydFVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXByID0gbmV3IEVuZHBvaW50UmVmZXJlbmNlKHRyYW5zcG9ydFVSTCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZ0NvbnRleHQuZ2V0VG8oKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFtc2dDb250ZXh0LmdldFRvKCkuaGFzQW5vbnltb3VzQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgZXByID0gbXNnQ29udGV4dC5nZXRUbygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFJFU1QgYmVoYXZpb3IsIGlmIHlvdSBkZXNpcmUgcmVzdCBiZWhhdmlvcgotICAgICAgICAgICAgLy8gcHV0IGEgPHBhcmFtZXRlciBuYW1lPSJkb1JFU1QiIHZhbHVlPSJ0cnVlIi8+IGF0IHRoZQotICAgICAgICAgICAgLy8gc2VydmVyLnhtbC9jbGllbnQueG1sIGZpbGUKLSAgICAgICAgICAgIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAgICAgLy8gQ2hhbmdlIHRoaXMgcGxhY2UgdG8gY2hhbmdlIHRoZSB3c2E6dG9lcHIKLSAgICAgICAgICAgIC8vIGVwciA9IHNvbWV0aGluZwotICAgICAgICAgICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSAgICAgICAgICAgIGlmIChlcHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICghZXByLmhhc05vbmVBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVNZXNzYWdlV2l0aENvbW1vbnMobXNnQ29udGV4dCwgZXByLCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIAlpZihtc2dDb250ZXh0LmlzRmF1bHQoKSl7Ci0gICAgICAgICAgICAgICAgCQlpZihsb2cuaXNEZWJ1Z0VuYWJsZWQoKSl7Ci0gICAgICAgICAgICAgICAgCQkJbG9nLmRlYnVnKCJGYXVsdCBzZW50IHRvIFdTLUEgTm9uZSBVUkk6ICIrbXNnQ29udGV4dC5nZXRFbnZlbG9wZSgpLmdldEJvZHkoKS5nZXRGYXVsdCgpKTsKLSAgICAgICAgICAgICAgICAJCX0KLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZW5kVXNpbmdPdXRwdXRTdHJlYW0obXNnQ29udGV4dCwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMuc2V0UmVzcG9uc2VXcml0dGVuKG1zZ0NvbnRleHQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkJvdGggdGhlIFRPIGFuZCBNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUIHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmUgbnVsbCwgc28gbm93aGVyZSB0byBzZW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludm9jYXRpb25SZXNwb25zZS5DT05USU5VRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kIGEgbWVzc2FnZSAod2hpY2ggbXVzdCBiZSBhIHJlc3BvbnNlKSB2aWEgdGhlIE91dHB1dFN0cmVhbSBzaXR0aW5nIGluIHRoZQotICAgICAqIE1lc3NhZ2VDb250ZXh0IFRSQU5TUE9SVF9PVVQgcHJvcGVydHkuICBTaW5jZSB0aGlzIGNsYXNzIGlzIHVzZWQgZm9yIGJvdGggcmVxdWVzdHMgYW5kCi0gICAgICogcmVzcG9uc2VzLCB3ZSBzcGxpdCB0aGUgbG9naWMgLSB0aGlzIG1ldGhvZCBhbHdheXMgZ2V0cyBjYWxsZWQgd2hlbiB3ZSdyZQotICAgICAqIHdyaXRpbmcgdG8gdGhlIEhUVFAgcmVzcG9uc2Ugc3RyZWFtLCBhbmQgc2VuZFVzaW5nQ29tbW9ucygpIGlzIHVzZWQgZm9yIHJlcXVlc3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEBwYXJhbSBmb3JtYXQgb3V0cHV0IGZvcm1hdHRlciBmb3Igb3VyIG1lc3NhZ2UKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCBpZiBhIGdlbmVyYWwgcHJvYmxlbSBhcmlzZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VuZFVzaW5nT3V0cHV0U3RyZWFtKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTU91dHB1dEZvcm1hdCBmb3JtYXQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gKE91dHB1dFN0cmVhbSkgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VUKTsKLQotICAgICAgICAvLyBJIERvbid0IHRoaW5rIHdlIG5lZWQgdGhpcyBjaGVjay4uIENvbnRlbnQgdHlwZSBuZWVkcyB0byBiZSBzZXQgaW4KLSAgICAgICAgLy8gYW55IGNhc2UuICh0aGlsaW5hKQotICAgICAgICAvLyBpZiAobXNnQ29udGV4dC5pc1NlcnZlclNpZGUoKSkgewotICAgICAgICBPdXRUcmFuc3BvcnRJbmZvIHRyYW5zcG9ydEluZm8gPSAoT3V0VHJhbnNwb3J0SW5mbykgbXNnQ29udGV4dAotICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPKTsKLQotICAgICAgICBpZiAodHJhbnNwb3J0SW5mbyA9PSBudWxsKSB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJObyB0cmFuc3BvcnQgaW5mbyBpbiBNZXNzYWdlQ29udGV4dCIpOwotCi0gICAgICAgIFNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8gc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbyA9IG51bGw7Ci0gICAgICAgIGlmICh0cmFuc3BvcnRJbmZvIGluc3RhbmNlb2YgU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbykgewotICAgICAgICAgICAgc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbyA9Ci0gICAgICAgICAgICAgICAgICAgIChTZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvKSB0cmFuc3BvcnRJbmZvOwotCi0gICAgICAgICAgICAvLyBpZiBzZW5kaW5nIGEgZmF1bHQsIHNldCBIVFRQIHN0YXR1cyBjb2RlIHRvIDUwMAotICAgICAgICAgICAgaWYgKG1zZ0NvbnRleHQuaXNGYXVsdCgpKSB7Ci0gICAgICAgICAgICAgICAgc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mby5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPYmplY3QgY3VzdG9tSGVhZGVycyA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMpOwotICAgICAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjdXN0b21IZWFkZXJzIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gKChMaXN0KSBjdXN0b21IZWFkZXJzKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRIZWFkZXIoaGVhZGVyLmdldE5hbWUoKSwgaGVhZGVyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXN0b21IZWFkZXJzIGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSAoKE1hcCkgY3VzdG9tSGVhZGVycykuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeSBoZWFkZXIgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRIZWFkZXIoKFN0cmluZykgaGVhZGVyLmdldEtleSgpLCAoU3RyaW5nKSBoZWFkZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0SW5mbyBpbnN0YW5jZW9mIEF4aXNIdHRwUmVzcG9uc2VJbXBsKSB7Ci0gICAgICAgICAgICBPYmplY3QgY3VzdG9tSGVhZGVycyA9IG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX0hFQURFUlMpOwotICAgICAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChjdXN0b21IZWFkZXJzIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gKChMaXN0KSBjdXN0b21IZWFkZXJzKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciBoZWFkZXIgPSAoSGVhZGVyKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQXhpc0h0dHBSZXNwb25zZUltcGwpIHRyYW5zcG9ydEluZm8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkSGVhZGVyKGhlYWRlci5nZXROYW1lKCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tSGVhZGVycyBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gKChNYXApIGN1c3RvbUhlYWRlcnMpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnkgaGVhZGVyID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEF4aXNIdHRwUmVzcG9uc2VJbXBsKSB0cmFuc3BvcnRJbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEhlYWRlcigoU3RyaW5nKSBoZWFkZXIuZ2V0S2V5KCksIChTdHJpbmcpIGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvcm1hdC5zZXRBdXRvQ2xvc2VXcml0ZXIodHJ1ZSk7Ci0KLSAgICAgICAgTWVzc2FnZUZvcm1hdHRlciBtZXNzYWdlRm9ybWF0dGVyID0gVHJhbnNwb3J0VXRpbHMuZ2V0TWVzc2FnZUZvcm1hdHRlcihtc2dDb250ZXh0KTsKLSAgICAgICAgaWYgKG1lc3NhZ2VGb3JtYXR0ZXIgPT0gbnVsbCkgdGhyb3cgbmV3IEF4aXNGYXVsdCgiTm8gTWVzc2FnZUZvcm1hdHRlciBpbiBNZXNzYWdlQ29udGV4dCIpOwotCi0gICAgICAgIC8vIE9uY2Ugd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIGV4Y2VwdGlvbnMgc2hvdWxkIE5PVCBiZSB0dXJuZWQgaW50byBmYXVsdHMgYW5kIHNlbnQsCi0gICAgICAgIC8vIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBzZW5kaW5nISAgU28gY2F0Y2ggZXZlcnl0aGluZyBhbmQgbG9nIGl0LCBidXQgZG9uJ3QgcGFzcwotICAgICAgICAvLyB1cHdhcmRzLgotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmFuc3BvcnRJbmZvLnNldENvbnRlbnRUeXBlKAotICAgICAgICAgICAgICAgIG1lc3NhZ2VGb3JtYXR0ZXIuZ2V0Q29udGVudFR5cGUobXNnQ29udGV4dCwgZm9ybWF0LCBmaW5kU09BUEFjdGlvbihtc2dDb250ZXh0KSkpOwotCi0gICAgICAgICAgICBPYmplY3QgZ3ppcCA9IG1zZ0NvbnRleHQuZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuTUNfR1pJUF9SRVNQT05TRSk7Ci0gICAgICAgICAgICBpZiAoZ3ppcCAhPSBudWxsICYmIEphdmFVdGlscy5pc1RydWVFeHBsaWNpdGx5KGd6aXApKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgc2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mby5hZGRIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5DT01QUkVTU0lPTl9HWklQKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXQpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUobWVzc2FnZUZvcm1hdHRlci5nZXRCeXRlcyhtc2dDb250ZXh0LCBmb3JtYXQpKTsKLSAgICAgICAgICAgICAgICAgICAgKChHWklQT3V0cHV0U3RyZWFtKSBvdXQpLmZpbmlzaCgpOwotICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkNvdWxkIG5vdCBjb21wcmVzcyByZXNwb25zZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlci53cml0ZVRvKG1zZ0NvbnRleHQsIGZvcm1hdCwgb3V0LCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcihheGlzRmF1bHQuZ2V0TWVzc2FnZSgpLCBheGlzRmF1bHQpOwotICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWVzc2FnZVdpdGhDb21tb25zKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0b0VQUiwgT01PdXRwdXRGb3JtYXQgZm9ybWF0KQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh0b0VQUi5nZXRBZGRyZXNzKCkpOwotCi0gICAgICAgICAgICAvLyBzZWxlY3QgdGhlIE1lc3NhZ2UgU2VuZGVyIGRlcGVuZGluZyBvbiB0aGUgUkVTVCBzdGF0dXMKLSAgICAgICAgICAgIEFic3RyYWN0SFRUUFNlbmRlciBzZW5kZXI7Ci0KLSAgICAgICAgICAgIHNlbmRlciA9IG5ldyBIVFRQU2VuZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNIVU5LRUQpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaHVua2VkID0gSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkobWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkNIVU5LRUQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSFRUUF9QUk9UT0NPTF9WRVJTSU9OKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaHR0cFZlcnNpb24gPSAoU3RyaW5nKSBtZXNzYWdlQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuSFRUUF9QUk9UT0NPTF9WRVJTSU9OKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvbGxvd2luZyBvcmRlciBuZWVkZWQgdG8gYmUgcHJlc2VydmVkIGJlY2F1c2UsCi0gICAgICAgICAgICAvLyBIVFRQLzEuMCBkb2VzIG5vdCBzdXBwb3J0IGNodW5rIGVuY29kaW5nCi0gICAgICAgICAgICBzZW5kZXIuc2V0Q2h1bmtlZChjaHVua2VkKTsKLSAgICAgICAgICAgIHNlbmRlci5zZXRIdHRwVmVyc2lvbihodHRwVmVyc2lvbik7Ci0gICAgICAgICAgICBzZW5kZXIuc2V0Rm9ybWF0KGZvcm1hdCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0ID0gbWVzc2FnZUNvbnRleHQuZ2V0T3BlcmF0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG9wQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkgaW5zdGFuY2VvZiBJbk91dEF4aXNPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBLbHVkZ2UgdG8gbWFrZSBzdXJlIGFzeW5jIHJlcGx5IGNvbm5lY3Rpb25zIGdldCBjbGVhbmVkIHVwLiBGaXggZm9yIHJlYWw/Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSB1c2luZyB0aGlzIHNlbmRlciB0byBzZW5kIGEgZHVhbC1jaGFubmVsIHJlcGx5LCB3ZSBkb24ndCBjYXJlIGFib3V0Ci0gICAgICAgICAgICAgICAgLy8gcmVhZGluZyB0aGUgcmVzcG9uc2UgZm9yIG5vdywgc28gbWFrZSBzdXJlIHdlIGNsZWFuIHVwIHRoZSBIVFRQTWV0aG9kLgotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQVVUT19SRUxFQVNFX0NPTk5FQ1RJT04sIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZGVyLnNlbmQobWVzc2FnZUNvbnRleHQsIHVybCwgZmluZFNPQVBBY3Rpb24obWVzc2FnZUNvbnRleHQpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyhlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kU09BUEFjdGlvbihNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkgewotICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZyA9IG51bGw7Ci0KLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZ2V0VHJhbnNwb3J0T3V0KCkuZ2V0UGFyYW1ldGVyKEhUVFBDb25zdGFudHMuT01JVF9TT0FQXzEyX0FDVElPTik7Ci0gICAgICAgIGlmIChwYXJhbWV0ZXIgIT0gbnVsbCAmJiBKYXZhVXRpbHMuaXNUcnVlRXhwbGljaXRseShwYXJhbWV0ZXIuZ2V0VmFsdWUoKSkgJiYKLSAgICAgICAgICAgICFtZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlwiXCIiOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IGRpc2FibGVTb2FwQWN0aW9uID0gbWVzc2FnZUNvbnRleHQuZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5Db25maWd1cmF0aW9uLkRJU0FCTEVfU09BUF9BQ1RJT04pOwotCi0gICAgICAgIGlmICghSmF2YVV0aWxzLmlzVHJ1ZUV4cGxpY2l0bHkoZGlzYWJsZVNvYXBBY3Rpb24pKSB7Ci0gICAgICAgICAgICAvLyBmaXJzdCB0cnkgdG8gZ2V0IHRoZSBTT0FQIGFjdGlvbiBmcm9tIG1lc3NhZ2UgY29udGV4dAotICAgICAgICAgICAgc29hcEFjdGlvblN0cmluZyA9IG1lc3NhZ2VDb250ZXh0LmdldFNvYXBBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmICgoc29hcEFjdGlvblN0cmluZyA9PSBudWxsKSB8fCAoc29hcEFjdGlvblN0cmluZy5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIC8vIG5vdyBsZXQncyB0cnkgdG8gZ2V0IFdTQSBhY3Rpb24KLSAgICAgICAgICAgICAgICBzb2FwQWN0aW9uU3RyaW5nID0gbWVzc2FnZUNvbnRleHQuZ2V0V1NBQWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHNvYXBBY3Rpb25TdHJpbmcgPT0gbnVsbCkgfHwgKHNvYXBBY3Rpb25TdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIC5sZW5ndGgoKSA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvcHRpb24gaXMgdG8gZ2V0IGl0IGZyb20gdGhlIGF4aXMgb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgIHNvYXBBY3Rpb25TdHJpbmcgPSBtZXNzYWdlQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U29hcEFjdGlvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vU2luY2UgYWN0aW9uIGlzIG9wdGlvbmFsIGZvciBTT0FQIDEuMiB3ZSBjYW4gcmV0dXJuIG51bGwgaGVyZS4KLSAgICAgICAgaWYgKHNvYXBBY3Rpb25TdHJpbmcgPT0gbnVsbCAmJiBtZXNzYWdlQ29udGV4dC5pc1NPQVAxMSgpKSB7Ci0gICAgICAgICAgICBzb2FwQWN0aW9uU3RyaW5nID0gIlwiXCIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNvYXBBY3Rpb25TdHJpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQ29tbW9uc1RyYW5zcG9ydEhlYWRlcnMuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0NvbW1vbnNUcmFuc3BvcnRIZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOWViYWQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvQ29tbW9uc1RyYW5zcG9ydEhlYWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IZWFkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25zVHJhbnNwb3J0SGVhZGVycyBpbXBsZW1lbnRzIE1hcCB7Ci0gICAgcHJpdmF0ZSBIZWFkZXJbXSBoZWFkZXJzOwotCi0gICAgSGFzaE1hcCBoZWFkZXJNYXAgPSBudWxsOwotCi0gICAgcHVibGljIENvbW1vbnNUcmFuc3BvcnRIZWFkZXJzKEhlYWRlcltdIGhlYWRlcnMpIHsKLSAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaGVhZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGhlYWRlck1hcC5wdXQoaGVhZGVyc1tpXS5nZXROYW1lKCksIGhlYWRlcnNbaV0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWRlck1hcC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5jb250YWluc1ZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbiB2YWx1ZXMoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAudmFsdWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcCB0KSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIGhlYWRlck1hcC5wdXRBbGwodCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBlbnRyeVNldCgpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5lbnRyeVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQga2V5U2V0KCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmtleVNldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5nZXQoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAucmVtb3ZlKGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0N1c3RvbUxpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9DdXN0b21MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM2MzNlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0N1c3RvbUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlc3Npb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGp1c3QgdG8gYWRkIGFkZGl0aW9uYWwgdHJhbnNwb3J0cyBhdCBydW50aW1lIGlmIHVzZXIgc2VuZHMgYSByZXF1ZXN0IHVzaW5nCi0gKiBhbHRlcm5hdGUgc2NoZW1lcywgZXhhbXBsZSB0byBoYW5kbGUgaHR0cC9odHRwcyBzZXBhcmF0ZWx5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21MaXN0ZW5lciBpbXBsZW1lbnRzIFRyYW5zcG9ydExpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDdXN0b21MaXN0ZW5lci5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgcG9ydDsKLSAgICBwcml2YXRlIFN0cmluZyBzY2hlbWE7Ci0gICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uQ29udGV4dCBheGlzQ29uZjsKLQotICAgIHB1YmxpYyBDdXN0b21MaXN0ZW5lcihpbnQgcG9ydCwgU3RyaW5nIHNjaGVtYSkgewotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGF4aXNDb25mLAotICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cmFuc3BydEluKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5heGlzQ29uZiA9IGF4aXNDb25mOwotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSB0cmFuc3BydEluLmdldFBhcmFtZXRlcihQQVJBTV9QT1JUKTsKLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMucG9ydCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2VbXSBnZXRFUFJzRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgcGF0aCA9IGF4aXNDb25mLmdldFNlcnZpY2VDb250ZXh0UGF0aCgpICsgIi8iICsgc2VydmljZU5hbWU7Ci0gICAgICAgIGlmKHBhdGguY2hhckF0KDApIT0nLycpewotICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJlZmVyZW5jZVtde25ldyBFbmRwb2ludFJlZmVyZW5jZShzY2hlbWEgKyAiOi8vIiArIGlwICsgIjoiICsgcG9ydCArIHBhdGggKyAiLyIgKX07Ci0gICAgfQotCi0gICAgcHVibGljIEVuZHBvaW50UmVmZXJlbmNlIGdldEVQUkZvclNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaXApIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gZ2V0RVBSc0ZvclNlcnZpY2Uoc2VydmljZU5hbWUsIGlwKVswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHsKLSAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSA9IChIdHRwU2VydmxldFJlcXVlc3QpIG1lc3NhZ2VDb250ZXh0LmdldFByb3BlcnR5KAotICAgICAgICAgICAgICAgIEhUVFBDb25zdGFudHMuTUNfSFRUUF9TRVJWTEVUUkVRVUVTVCk7Ci0gICAgICAgIFNlc3Npb25Db250ZXh0IHNlc3Npb25Db250ZXh0ID0KLSAgICAgICAgICAgICAgICAoU2Vzc2lvbkNvbnRleHQpIHJlcS5nZXRTZXNzaW9uKHRydWUpLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TRVNTSU9OX0NPTlRFWFRfUFJPUEVSVFkpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb25JZCA9IHJlcS5nZXRTZXNzaW9uKCkuZ2V0SWQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXNzaW9uQ29udGV4dCA9IG5ldyBTZXNzaW9uQ29udGV4dChudWxsKTsKLSAgICAgICAgICAgIHNlc3Npb25Db250ZXh0LnNldENvb2tpZUlEKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VTU0lPTl9DT05URVhUX1BST1BFUlRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldFNlc3Npb25Db250ZXh0KHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0UHJvcGVydHkoQXhpc1NlcnZsZXQuU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgcmV0dXJuIHNlc3Npb25Db250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQU2VuZGVyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQU2VuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZWU3NDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5PdXRJbkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaTE4bi5NZXNzYWdlczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5NZXNzYWdlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZEJhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkRlbGV0ZU1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkdldE1ldGhvZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLlBvc3RNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5QdXRNZXRob2Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIEhUVFBTZW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEhUVFBTZW5kZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEhUVFBTZW5kZXIuY2xhc3MpOwotCi0gICAgcHVibGljIHZvaWQgc2VuZChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBVUkwgdXJsLCBTdHJpbmcgc29hcEFjdGlvblN0cmluZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gZXhlY3V0ZSB0aGUgSHR0dHBNZXRob2RCYXNlIC0gYSBjb25uZWN0aW9uIG1hbmFnZXIgY2FuIGJlIGdpdmVuIGZvcgotICAgICAgICAvLyBoYW5kbGUgbXVsdGlwbGUKLQotICAgICAgICBTdHJpbmcgaHR0cE1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRCk7Ci0KLSAgICAgICAgaWYgKChodHRwTWV0aG9kICE9IG51bGwpKSB7Ci0KLSAgICAgICAgICAgIGlmIChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9HRVQuZXF1YWxzSWdub3JlQ2FzZShodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHRoaXMuc2VuZFZpYUdldChtc2dDb250ZXh0LCB1cmwsIHNvYXBBY3Rpb25TdHJpbmcpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9ERUxFVEUuZXF1YWxzSWdub3JlQ2FzZShodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHRoaXMuc2VuZFZpYURlbGV0ZShtc2dDb250ZXh0LCB1cmwsIHNvYXBBY3Rpb25TdHJpbmcpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuQ29uZmlndXJhdGlvbi5IVFRQX01FVEhPRF9QVVQuZXF1YWxzSWdub3JlQ2FzZShodHRwTWV0aG9kKSkgewotICAgICAgICAgICAgICAgIHRoaXMuc2VuZFZpYVB1dChtc2dDb250ZXh0LCB1cmwsIHNvYXBBY3Rpb25TdHJpbmcpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5zZW5kVmlhUG9zdChtc2dDb250ZXh0LCB1cmwsIHNvYXBBY3Rpb25TdHJpbmcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc2VuZCBhIHJlcXVlc3QgdmlhIEhUVFAgR2V0IG1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgICAgICAgIC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgICAgIC0gVGhlIHRhcmdldCBVUkwKLSAgICAgKiBAcGFyYW0gc29hcEFjdGlpb25TdHJpbmcgLSBUaGUgc29hcEFjdGlvbiBzdHJpbmcgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VuZFZpYUdldChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBVUkwgdXJsLCBTdHJpbmcgc29hcEFjdGlpb25TdHJpbmcpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBHZXRNZXRob2QgZ2V0TWV0aG9kID0gbmV3IEdldE1ldGhvZCgpOwotICAgICAgICBIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBnZXRIdHRwQ2xpZW50KG1zZ0NvbnRleHQpOwotICAgICAgICBNZXNzYWdlRm9ybWF0dGVyIG1lc3NhZ2VGb3JtYXR0ZXIgPQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQ29tbW9uUHJvcGVydGllcyhtc2dDb250ZXh0LCB1cmwsIGdldE1ldGhvZCwgaHR0cENsaWVudCwgc29hcEFjdGlpb25TdHJpbmcpOwotCi0gICAgICAgIC8vIE5lZWQgdG8gaGF2ZSB0aGlzIGhlcmUgYmVjYXVzZSB3ZSBjYW4gaGF2ZSBzb2FwIGFjdGlvbiB3aGVuIHVzaW5nIHRoZSBzb2FwIHJlc3BvbnNlIE1FUAotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZUZvcm1hdHRlci5mb3JtYXRTT0FQQWN0aW9uKG1zZ0NvbnRleHQsIGZvcm1hdCwgc29hcEFjdGlpb25TdHJpbmcpOwotCi0gICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1ldGhvZC5zZXRSZXF1ZXN0SGVhZGVyKEhUVFBDb25zdGFudHMuSEVBREVSX1NPQVBfQUNUSU9OLCBzb2FwQWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZChodHRwQ2xpZW50LCBtc2dDb250ZXh0LCB1cmwsIGdldE1ldGhvZCk7Ci0gICAgICAgICAgICBoYW5kbGVSZXNwb25zZShtc2dDb250ZXh0LCBnZXRNZXRob2QpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVW5hYmxlIHRvIHNlbmRWaWFHZXQgdG8gdXJsWyIgKyB1cmwgKyAiXSIsIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsZWFudXAobXNnQ29udGV4dCwgZ2V0TWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIEh0dHBNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChtc2dDb250ZXh0LmlzUHJvcGVydHlUcnVlKEhUVFBDb25zdGFudHMuQVVUT19SRUxFQVNFX0NPTk5FQ1RJT04pKSB7Ci0gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3Qgc3luY2hyb25vdXNseSB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLCBpbiB3aGljaCBjYXNlCi0gICAgICAgICAgICAvLyB0aGlzIHdvdWxkIHJlc3VsdCBpbiB0cnlpbmcgdG8gcmVhZCBhIGNsb3NlZCBzdHJlYW0uLi4hCi0gICAgICAgICAgICBpZiAoIShtc2dDb250ZXh0LmdldEF4aXNPcGVyYXRpb24oKSBpbnN0YW5jZW9mIE91dEluQXhpc09wZXJhdGlvbikgfHwKLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LmdldE9wdGlvbnMoKS5pc1VzZVNlcGFyYXRlTGlzdGVuZXIoKSkgewotICAgICAgICAgICAgICAgIGxvZy50cmFjZSgiQXV0b1JlbGVhc2luZyAiICsgbWV0aG9kKTsKLSAgICAgICAgICAgICAgICBtZXRob2QucmVsZWFzZUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc2VuZCBhIHJlcXVlc3QgdmlhIEhUVFAgRGVsZXRlIE1ldGhvZAotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgICAgICAgIC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgICAgIC0gVGhlIHRhcmdldCBVUkwKLSAgICAgKiBAcGFyYW0gc29hcEFjdGlpb25TdHJpbmcgLSBUaGUgc29hcEFjdGlvbiBzdHJpbmcgb2YgdGhlIHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdCAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2VuZFZpYURlbGV0ZShNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBVUkwgdXJsLCBTdHJpbmcgc29hcEFjdGlpb25TdHJpbmcpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBEZWxldGVNZXRob2QgZGVsZXRlTWV0aG9kID0gbmV3IERlbGV0ZU1ldGhvZCgpOwotICAgICAgICBIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBnZXRIdHRwQ2xpZW50KG1zZ0NvbnRleHQpOwotICAgICAgICBwb3B1bGF0ZUNvbW1vblByb3BlcnRpZXMobXNnQ29udGV4dCwgdXJsLCBkZWxldGVNZXRob2QsIGh0dHBDbGllbnQsIHNvYXBBY3RpaW9uU3RyaW5nKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZChodHRwQ2xpZW50LCBtc2dDb250ZXh0LCB1cmwsIGRlbGV0ZU1ldGhvZCk7Ci0gICAgICAgICAgICBoYW5kbGVSZXNwb25zZShtc2dDb250ZXh0LCBkZWxldGVNZXRob2QpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVW5hYmxlIHRvIHNlbmRWaWFEZWxldGUgdG8gdXJsWyIgKyB1cmwgKyAiXSIsIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsZWFudXAobXNnQ29udGV4dCwgZGVsZXRlTWV0aG9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gc2VuZCBhIHJlcXVlc3QgdmlhIEhUVFAgUG9zdCBNZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgICAgIC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgICAgLSBUaGUgdGFyZ2V0IFVSTAotICAgICAqIEBwYXJhbSBzb2FwQWN0aW9uU3RyaW5nIC0gVGhlIHNvYXBBY3Rpb24gc3RyaW5nIG9mIHRoZSByZXF1ZXN0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRWaWFQb3N0KE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQsIFVSTCB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uU3RyaW5nKSB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotCi0gICAgICAgIEh0dHBDbGllbnQgaHR0cENsaWVudCA9IGdldEh0dHBDbGllbnQobXNnQ29udGV4dCk7Ci0KLS8qICBXaGF0J3MgdXAgd2l0aCB0aGlzLCBpdCBuZXZlciBnZXRzIHVzZWQgYW55d2hlcmU/PyAtLUdsZW4KLSAgICAgICAgU3RyaW5nIGNoYXJFbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLQotICAgICAgICBpZiAoY2hhckVuY29kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoYXJFbmNvZGluZyA9IE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLSovCi0KLSAgICAgICAgUG9zdE1ldGhvZCBwb3N0TWV0aG9kID0gbmV3IFBvc3RNZXRob2QoKTsKLSAgICAgICAgaWYgKGxvZy5pc1RyYWNlRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cudHJhY2UoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIgUG9zdE1ldGhvZCAiICsgcG9zdE1ldGhvZCArICIgLyAiICsgaHR0cENsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVzc2FnZUZvcm1hdHRlciBtZXNzYWdlRm9ybWF0dGVyID0KLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUNvbW1vblByb3BlcnRpZXMobXNnQ29udGV4dCwgdXJsLCBwb3N0TWV0aG9kLCBodHRwQ2xpZW50LCBzb2FwQWN0aW9uU3RyaW5nKTsKLQotICAgICAgICBwb3N0TWV0aG9kLnNldFJlcXVlc3RFbnRpdHkobmV3IEF4aXNSZXF1ZXN0RW50aXR5KG1lc3NhZ2VGb3JtYXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgZm9ybWF0LCBzb2FwQWN0aW9uU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQsIGlzQWxsb3dlZFJldHJ5KSk7Ci0KLSAgICAgICAgaWYgKCFodHRwVmVyc2lvbi5lcXVhbHMoSFRUUENvbnN0YW50cy5IRUFERVJfUFJPVE9DT0xfMTApICYmIGNodW5rZWQpIHsKLSAgICAgICAgICAgIHBvc3RNZXRob2Quc2V0Q29udGVudENodW5rZWQodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc29hcEFjdGlvbiA9IG1lc3NhZ2VGb3JtYXR0ZXIuZm9ybWF0U09BUEFjdGlvbihtc2dDb250ZXh0LCBmb3JtYXQsIHNvYXBBY3Rpb25TdHJpbmcpOwotCi0gICAgICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvc3RNZXRob2Quc2V0UmVxdWVzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9TT0FQX0FDVElPTiwgc29hcEFjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgIG1haW4gZXhjZWN1dGlvbiB0YWtlcyBwbGFjZS4uCi0gICAgICAgICAqLwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhlY3V0ZU1ldGhvZChodHRwQ2xpZW50LCBtc2dDb250ZXh0LCB1cmwsIHBvc3RNZXRob2QpOwotICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobXNnQ29udGV4dCwgcG9zdE1ldGhvZCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJVbmFibGUgdG8gc2VuZFZpYVBvc3QgdG8gdXJsWyIgKyB1cmwgKyAiXSIsIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIGEgZHVhbC1jaGFubmVsIHJlcXVlc3QsIGp1c3QgYXV0by1yZWxlYXNlIHRoZSBjb25uZWN0aW9uIHNvIGl0IGdldHMKLSAgICAgICAgICAgIC8vIGNsZWFuZWQgdXAgYW5kIGF2b2lkcyBzdGFydmF0aW9uIHByb2JsZW1zLgotICAgICAgICAgICAgLy8gVE9ETzogQ29uZmlybSB0aGlzIGlzIE9LIHdpdGggV1MtUk0sIGZpeCBpZiBub3QhCi0gICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRPcHRpb25zKCkuaXNVc2VTZXBhcmF0ZUxpc3RlbmVyKCkpCi0gICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLkFVVE9fUkVMRUFTRV9DT05ORUNUSU9OLCB0cnVlKTsKLSAgICAgICAgICAgIGNsZWFudXAobXNnQ29udGV4dCwgcG9zdE1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHNlbmQgYSByZXF1ZXN0IHZpYSBIVFRQIFB1dCBNZXRob2QKLSAgICAgKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgICAgIC0gVGhlIE1lc3NhZ2VDb250ZXh0IG9mIHRoZSBtZXNzYWdlCi0gICAgICogQHBhcmFtIHVybCAgICAgICAgICAgICAgLSBUaGUgdGFyZ2V0IFVSTAotICAgICAqIEBwYXJhbSBzb2FwQWN0aW9uU3RyaW5nIC0gVGhlIHNvYXBBY3Rpb24gc3RyaW5nIG9mIHRoZSByZXF1ZXN0Ci0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRWaWFQdXQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgVVJMIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc29hcEFjdGlvblN0cmluZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLQotICAgICAgICBIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBnZXRIdHRwQ2xpZW50KG1zZ0NvbnRleHQpOwotCi0vKiAgU2FtZSBkZWFsIC0gdGhpcyB2YWx1ZSBuZXZlciBnZXRzIHVzZWQsIHdoeSBpcyBpdCBoZXJlPyAtLUdsZW4KLSAgICAgICAgU3RyaW5nIGNoYXJFbmNvZGluZyA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HKTsKLQotICAgICAgICBpZiAoY2hhckVuY29kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoYXJFbmNvZGluZyA9IE1lc3NhZ2VDb250ZXh0LkRFRkFVTFRfQ0hBUl9TRVRfRU5DT0RJTkc7Ci0gICAgICAgIH0KLSovCi0KLSAgICAgICAgUHV0TWV0aG9kIHB1dE1ldGhvZCA9IG5ldyBQdXRNZXRob2QoKTsKLSAgICAgICAgTWVzc2FnZUZvcm1hdHRlciBtZXNzYWdlRm9ybWF0dGVyID0KLSAgICAgICAgICAgICAgICBwb3B1bGF0ZUNvbW1vblByb3BlcnRpZXMobXNnQ29udGV4dCwgdXJsLCBwdXRNZXRob2QsIGh0dHBDbGllbnQsIHNvYXBBY3Rpb25TdHJpbmcpOwotCi0gICAgICAgIHB1dE1ldGhvZC5zZXRSZXF1ZXN0RW50aXR5KG5ldyBBeGlzUmVxdWVzdEVudGl0eShtZXNzYWdlRm9ybWF0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgZm9ybWF0LCBzb2FwQWN0aW9uU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZCwgaXNBbGxvd2VkUmV0cnkpKTsKLQotICAgICAgICBpZiAoIWh0dHBWZXJzaW9uLmVxdWFscyhIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9UT0NPTF8xMCkgJiYgY2h1bmtlZCkgewotICAgICAgICAgICAgcHV0TWV0aG9kLnNldENvbnRlbnRDaHVua2VkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSBtZXNzYWdlRm9ybWF0dGVyLmZvcm1hdFNPQVBBY3Rpb24obXNnQ29udGV4dCwgZm9ybWF0LCBzb2FwQWN0aW9uU3RyaW5nKTsKLSAgICAgICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcHV0TWV0aG9kLnNldFJlcXVlc3RIZWFkZXIoSFRUUENvbnN0YW50cy5IRUFERVJfU09BUF9BQ1RJT04sIHNvYXBBY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogICBtYWluIGV4Y2VjdXRpb24gdGFrZXMgcGxhY2UuLgotICAgICAgICAgKi8KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGVNZXRob2QoaHR0cENsaWVudCwgbXNnQ29udGV4dCwgdXJsLCBwdXRNZXRob2QpOwotICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobXNnQ29udGV4dCwgcHV0TWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oIlVuYWJsZSB0byBzZW5kVmlhUHV0IHRvIHVybFsiICsgdXJsICsgIl0iLCBlKTsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbGVhbnVwKG1zZ0NvbnRleHQsIHB1dE1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIGhhbmRsZSB0aGUgSFRUUCBSZXNwb25zZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgLSBUaGUgTWVzc2FnZUNvbnRleHQgb2YgdGhlIG1lc3NhZ2UKLSAgICAgKiBAcGFyYW0gbWV0aG9kICAgICAtIFRoZSBIVFRQIG1ldGhvZCB1c2VkCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIFRocm93biBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBvY2N1cnMKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVzcG9uc2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cE1ldGhvZEJhc2UgbWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IG1ldGhvZC5nZXRTdGF0dXNDb2RlKCk7Ci0gICAgICAgIGxvZy50cmFjZSgiSGFuZGxpbmcgcmVzcG9uc2UgLSAiICsgc3RhdHVzQ29kZSk7Ci0gICAgICAgIGlmIChzdGF0dXNDb2RlID09IEh0dHBTdGF0dXMuU0NfT0spIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXNwb25zZShtZXRob2QsIG1zZ0NvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5TQ19BQ0NFUFRFRCkgewotICAgICAgICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT0gSHR0cFN0YXR1cy5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1IgfHwKLSAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID09IEh0dHBTdGF0dXMuU0NfQkFEX1JFUVVFU1QpIHsKLSAgICAgICAgICAgIEhlYWRlciBjb250ZW50dHlwZUhlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRSZXNwb25zZUhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb250ZW50dHlwZUhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBjb250ZW50dHlwZUhlYWRlci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgIE9wZXJhdGlvbkNvbnRleHQgb3BDb250ZXh0ID0gbXNnQ29udGV4dC5nZXRPcGVyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgICAgICBpZihvcENvbnRleHQhPW51bGwpewotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGluTWVzc2FnZUNvbnRleHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgb3BDb250ZXh0LmdldE1lc3NhZ2VDb250ZXh0KFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgaWYoaW5NZXNzYWdlQ29udGV4dCE9bnVsbCl7Ci0gICAgICAgICAgICAgICAgICAgIGluTWVzc2FnZUNvbnRleHQuc2V0UHJvY2Vzc2luZ0ZhdWx0KHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UobWV0aG9kLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBpc1RyYW5zcG9ydE5vbkJsb2NraW5nID0gbXNnQ29udGV4dC5nZXRQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX05PTl9CTE9DS0lORyk7Ci0gICAgICAgICAgICBpZiAoaXNUcmFuc3BvcnROb25CbG9ja2luZyAhPSBudWxsICYmIChCb29sZWFuKWlzVHJhbnNwb3J0Tm9uQmxvY2tpbmcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KE1lc3NhZ2VzLmdldE1lc3NhZ2UoInRyYW5zcG9ydEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0YXR1c0NvZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFN0YXR1c1RleHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChNZXNzYWdlcy5nZXRNZXNzYWdlKCJ0cmFuc3BvcnRFcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc3RhdHVzQ29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFN0YXR1c1RleHQoKSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFRyYW5zcG9ydFJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQVHJhbnNwb3J0UmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNzhhMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQVHJhbnNwb3J0UmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIENsYXNzIEhUVFBUcmFuc3BvcnRSZWNlaXZlcgotICovCi1wdWJsaWMgY2xhc3MgSFRUUFRyYW5zcG9ydFJlY2VpdmVyIHsKLSAgICBwdWJsaWMgc3RhdGljIE1hcCBnZXRHZXRSZXF1ZXN0UGFyYW1ldGVycyhTdHJpbmcgcmVxdWVzdFVSSSkgewotCi0gICAgICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBpZiAocmVxdWVzdFVSSSA9PSBudWxsIHx8ICIiLmVxdWFscyhyZXF1ZXN0VVJJKSkgewotICAgICAgICAgICAgcmV0dXJuIG1hcDsKLSAgICAgICAgfQotICAgICAgICBjaGFyW10gICAgICAgY2hhcnMgPSByZXF1ZXN0VVJJLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGZpbmFsIGludCBOT1RfQkVHVU4gPSAxNTAwOwotICAgICAgICBmaW5hbCBpbnQgSU5TSURFX05BTUUgPSAxNTAxOwotICAgICAgICBmaW5hbCBpbnQgSU5TSURFX1ZBTFVFID0gMTUwMjsKLSAgICAgICAgaW50IHN0YXRlID0gTk9UX0JFR1VOOwotICAgICAgICBTdHJpbmdCdWZmZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGFycy5sZW5ndGg7IGluZGV4KyspIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBOT1RfQkVHVU4pIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaW5kZXhdID09ICc/JykgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOU0lERV9OQU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5TSURFX05BTUUpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaW5kZXhdID09ICc9JykgewotICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOU0lERV9WQUxVRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuYW1lLmFwcGVuZChjaGFyc1tpbmRleF0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5TSURFX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYXJzW2luZGV4XSA9PSAnLCcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTlNJREVfTkFNRTsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChuYW1lLnRvU3RyaW5nKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBuYW1lLmRlbGV0ZSgwLCBuYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUuZGVsZXRlKDAsIHZhbHVlLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoY2hhcnNbaW5kZXhdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSArIHZhbHVlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbWFwLnB1dChuYW1lLnRvU3RyaW5nKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIHRleHQgZm9yIHRoZSBsaXN0IG9mIHNlcnZpY2VzIGRlcGxveWVkLgotICAgICAqIFRoaXMgY2FuIGJlIGRlbGVnYXRlZCB0byBhbm90aGVyIENsYXNzIGFzIHdlbGwKLSAgICAgKiB3aGVyZSBpdCB3aWxsIGhhbmRsZSBtb3JlIG9wdGlvbnMgb2YgR0VUIG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlc0hUTUwoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgU3RyaW5nIHRlbXAgPSAiIjsKLSAgICAgICAgTWFwIHNlcnZpY2VzID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotICAgICAgICBIYXNodGFibGUgZXJyb25lb3VzU2VydmljZXMgPQotICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0RmF1bHR5U2VydmljZXMoKTsKLSAgICAgICAgYm9vbGVhbiBzdGF0dXMgPSBmYWxzZTsKLQotICAgICAgICBpZiAoKHNlcnZpY2VzICE9IG51bGwpICYmICFzZXJ2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7Ci0KLSAgICAgICAgICAgIENvbGxlY3Rpb24gc2VydmljZUNvbGxlY3Rpb24gPSBzZXJ2aWNlcy52YWx1ZXMoKTsKLQotICAgICAgICAgICAgdGVtcCArPSAiPGgyPiIgKyAiRGVwbG95ZWQgc2VydmljZXMiICsgIjwvaDI+IjsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VDb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLQotICAgICAgICAgICAgICAgIHRlbXAgKz0gIjxoMz48YSBocmVmPVwiIiArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSArICI/d3NkbFwiPiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgIjwvYT48L2gzPiI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIkF2YWlsYWJsZSBvcGVyYXRpb25zIDx1bD4iOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICs9ICI8bGk+IiArIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgIjwvbGk+IjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHRlbXAgKz0gIjwvdWw+IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0ZW1wICs9ICJObyBvcGVyYXRpb25zIHNwZWNpZmllZCBmb3IgdGhpcyBzZXJ2aWNlIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGVycm9uZW91c1NlcnZpY2VzICE9IG51bGwpICYmICFlcnJvbmVvdXNTZXJ2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHRlbXAgKz0gIjxocj48aDI+PGZvbnQgY29sb3I9XCJibHVlXCI+RmF1bHR5IFNlcnZpY2VzPC9mb250PjwvaDI+IjsKLSAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGZhdWx0eXNlcnZpY2VzID0gZXJyb25lb3VzU2VydmljZXMua2V5cygpOwotCi0gICAgICAgICAgICB3aGlsZSAoZmF1bHR5c2VydmljZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHR5c2VydmljZU5hbWUgPSAoU3RyaW5nKSBmYXVsdHlzZXJ2aWNlcy5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgdGVtcCArPSAiPGgzPjxmb250IGNvbG9yPVwiYmx1ZVwiPiIgKyBmYXVsdHlzZXJ2aWNlTmFtZSArICI8L2ZvbnQ+PC9oMz4iOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdGF0dXMpIHsKLSAgICAgICAgICAgIHRlbXAgPSAiPGgyPlRoZXJlIGFyZSBubyBzZXJ2aWNlcyBkZXBsb3llZDwvaDI+IjsKLSAgICAgICAgfQotCi0gICAgICAgIHRlbXAgPSAiPGh0bWw+PGhlYWQ+PHRpdGxlPkF4aXMyOiBTZXJ2aWNlczwvdGl0bGU+PC9oZWFkPiIgKyAiPGJvZHk+IiArIHRlbXAKLSAgICAgICAgICAgICAgICArICI8L2JvZHk+PC9odG1sPiI7Ci0KLSAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotCi0gICAgLy8gTk9URTogVGhpcyBtZXRob2QgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIHN0YW5kYXJkIEF4aXMyIEhUVFAgdHJhbnNwb3J0IChzZWUgV1NDT01NT05TLTQwNSkuCi0gICAgLy8gICAgICAgSG93ZXZlciBpdCBpcyBzdGlsbCB1c2VkIGJ5IFN5bmFwc2UncyBOSU8gSFRUUCB0cmFuc3BvcnQuCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRTZXJ2aWNlSFRNTChTdHJpbmcgc2VydmljZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCkgewotICAgICAgICBTdHJpbmcgdGVtcCA9ICIiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IGF4aXNDb25maWcuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgIHRlbXAgKz0gIjxoMz4iICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgIjwvaDM+IjsKLSAgICAgICAgICAgIHRlbXAgKz0gIjxhIGhyZWY9XCIiICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpICsgIj93c2RsXCI+d3NkbDwvYT4gPGJyLz4gIjsKLSAgICAgICAgICAgIHRlbXAgKz0gIjxpPlNlcnZpY2UgRGVzY3JpcHRpb24gOiAgIiArIGF4aXNTZXJ2aWNlLmdldFNlcnZpY2VEZXNjcmlwdGlvbigpICsKLSAgICAgICAgICAgICAgICAgICAgIjwvaT48YnIvPjxici8+IjsKLSAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICB0ZW1wICs9ICJBdmFpbGFibGUgb3BlcmF0aW9ucyA8dWw+IjsKLSAgICAgICAgICAgICAgICBmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wICs9ICI8bGk+IiArIGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpICsgIjwvbGk+IjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVtcCArPSAiPC91bD4iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZW1wICs9ICJObyBvcGVyYXRpb25zIHNwZWNpZmllZCBmb3IgdGhpcyBzZXJ2aWNlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlbXAgPSAiPGh0bWw+PGhlYWQ+PHRpdGxlPkF4aXMyOiBTZXJ2aWNlczwvdGl0bGU+PC9oZWFkPiIgKyAiPGJvZHk+IiArIHRlbXAKLSAgICAgICAgICAgICAgICAgICAgKyAiPC9ib2R5PjwvaHRtbD4iOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0ZW1wID0gIjxodG1sPjxoZWFkPjx0aXRsZT5TZXJ2aWNlIGhhcyBhIGZ1YWx0PC90aXRsZT48L2hlYWQ+IiArICI8Ym9keT4iCi0gICAgICAgICAgICAgICAgICAgICsgIjxocj48aDI+PGZvbnQgY29sb3I9XCJibHVlXCI+IiArIGF4aXNGYXVsdC5nZXRNZXNzYWdlKCkgKwotICAgICAgICAgICAgICAgICAgICAiPC9mb250PjwvaDI+PC9ib2R5PjwvaHRtbD4iOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBUcmFuc3BvcnRVdGlscy5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFRyYW5zcG9ydFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWQ3NzMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFRyYW5zcG9ydFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVAxMUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDEyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuaW1wbC5sbG9tLnNvYXAxMS5TT0FQMTFGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5pbXBsLmxsb20uc29hcDEyLlNPQVAxMkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5CdWlsZGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5PcGVyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyLkludm9jYXRpb25SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlsczsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgSFRUUFRyYW5zcG9ydFV0aWxzIHsKLQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyB3YXMgdXNlZCBvbmx5IGJ5IHRoZSBub3cgZGVwcmVjYXRlZCBwcm9jZXNzSFRUUEdldFJlcXVlc3QoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTT0FQRW52ZWxvcGUgY3JlYXRlRW52ZWxvcGVGcm9tR2V0UmVxdWVzdChTdHJpbmcgcmVxdWVzdFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCBtYXAsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPQotICAgICAgICAgICAgICAgIFV0aWxzLnBhcnNlUmVxdWVzdFVSTEZvclNlcnZpY2VBbmRPcGVyYXRpb24ocmVxdWVzdFVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSk7Ci0gICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTT0FQMTFGYWN0b3J5KCkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHZhbHVlc1sxXSAhPSBudWxsKSAmJiAodmFsdWVzWzBdICE9IG51bGwpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3J2aWNlID0gdmFsdWVzWzBdOwotICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IGNvbmZpZ0N0eC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2Uoc3J2aWNlKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KCJzZXJ2aWNlIG5vdCBmb3VuZDogIiArIHNydmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gdmFsdWVzWzFdOwotICAgICAgICAgICAgU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBuZXcgU09BUDExRmFjdG9yeSgpOwotICAgICAgICAgICAgU09BUEVudmVsb3BlIGVudmVsb3BlID0gc29hcEZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7Ci0gICAgICAgICAgICBPTU5hbWVzcGFjZSBvbU5zID0gc29hcEZhY3RvcnkuY3JlYXRlT01OYW1lc3BhY2Uoc2VydmljZS5nZXRTY2hlbWFUYXJnZXROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIHNvYXBGYWN0b3J5LmNyZWF0ZU9NTmFtZXNwYWNlKHNlcnZpY2UuZ2V0U2NoZW1hVGFyZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLmdldFNjaGVtYVRhcmdldE5hbWVzcGFjZVByZWZpeCgpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBvcEVsZW1lbnQgPSBzb2FwRmFjdG9yeS5jcmVhdGVPTUVsZW1lbnQob3BlcmF0aW9uLCBvbU5zKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBtYXAuZ2V0KG5hbWUpOwotICAgICAgICAgICAgICAgIE9NRWxlbWVudCBvbUVsZSA9IHNvYXBGYWN0b3J5LmNyZWF0ZU9NRWxlbWVudChuYW1lLCBvbU5zKTsKLQotICAgICAgICAgICAgICAgIG9tRWxlLnNldFRleHQodmFsdWUpOwotICAgICAgICAgICAgICAgIG9wRWxlbWVudC5hZGRDaGlsZChvbUVsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZChvcEVsZW1lbnQpOwotCi0gICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtc2dDb250ZXh0ICAgICAgICAgICAtIFRoZSBNZXNzYWdlQ29udGV4dCBvZiB0aGUgUmVxdWVzdCBNZXNzYWdlCi0gICAgICogQHBhcmFtIG91dCAgICAgICAgICAgICAgICAgIC0gVGhlIG91dHB1dCBzdHJlYW0gb2YgdGhlIHJlc3BvbnNlCi0gICAgICogQHBhcmFtIHNvYXBBY3Rpb24gICAgICAgICAgIC0gU29hcEFjdGlvbiBvZiB0aGUgcmVxdWVzdAotICAgICAqIEBwYXJhbSByZXF1ZXN0VVJJICAgICAgICAgICAtIFRoZSBVUkwgdGhhdCB0aGUgcmVxdWVzdCBjYW1lIHRvCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25Db250ZXh0IC0gVGhlIEF4aXMgQ29uZmlndXJhdGlvbiBDb250ZXh0Ci0gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzICAgIC0gVGhlIHBhcmFtZXRlcnMgb2YgdGhlIHJlcXVlc3QgbWVzc2FnZQotICAgICAqIEByZXR1cm4gLSBib29sZWFuIGluZGljYXRpb24gd2hldGhlciB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNmdWxsCi0gICAgICogQHRocm93cyBBeGlzRmF1bHQgLSBUaHJvd24gaW4gY2FzZSBhIGZhdWx0IG9jY3VycwotICAgICAqIEBkZXByZWNhdGVkIHVzZSBSRVNUVXRpbC5wcm9jZXNzVVJMUmVxdWVzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LCBPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgY29udGVudFR5cGUpIGluc3RlYWQKLSAgICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9jZXNzSFRUUEdldFJlcXVlc3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBzb2FwQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCByZXF1ZXN0UGFyYW1ldGVycykKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBpZiAoKHNvYXBBY3Rpb24gIT0gbnVsbCkgJiYgc29hcEFjdGlvbi5zdGFydHNXaXRoKCJcIiIpICYmIHNvYXBBY3Rpb24uZW5kc1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAgIHNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uLnN1YnN0cmluZygxLCBzb2FwQWN0aW9uLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtc2dDb250ZXh0LnNldFNvYXBBY3Rpb24oc29hcEFjdGlvbik7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlcXVlc3RVUkkpKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBvdXQpOwotICAgICAgICBtc2dDb250ZXh0LnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0gICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IEhUVFBUcmFuc3BvcnRVdGlscy5jcmVhdGVFbnZlbG9wZUZyb21HZXRSZXF1ZXN0KHJlcXVlc3RVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0KLSAgICAgICAgaWYgKGVudmVsb3BlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0gICAgICAgICAgICBBeGlzRW5naW5lLnJlY2VpdmUobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX1VOS05PV04gPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX1NPQVAxMSA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU09BUDEyID0gMjsKLQotICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhdGlvblJlc3BvbnNlIHByb2Nlc3NIVFRQUG9zdFJlcXVlc3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgaW50IHNvYXBWZXJzaW9uID0gVkVSU0lPTl9VTktOT1dOOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc29hcFZlcnNpb24gPSBpbml0aWFsaXplTWVzc2FnZUNvbnRleHQobXNnQ29udGV4dCwgc29hcEFjdGlvbkhlYWRlciwgcmVxdWVzdFVSSSwgY29udGVudFR5cGUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCBvdXQpOwotCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldEVudmVsb3BlKAotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy5jcmVhdGVTT0FQTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUdaaXAobXNnQ29udGV4dCwgaW4pLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSkpOwotICAgICAgICAgICAgcmV0dXJuIEF4aXNFbmdpbmUucmVjZWl2ZShtc2dDb250ZXh0KTsKLSAgICAgICAgfSBjYXRjaCAoU09BUFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9NRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoKG1zZ0NvbnRleHQuZ2V0RW52ZWxvcGUoKSA9PSBudWxsKSAmJiBzb2FwVmVyc2lvbiAhPSBWRVJTSU9OX1NPQVAxMSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RW52ZWxvcGUobmV3IFNPQVAxMkZhY3RvcnkoKS5nZXREZWZhdWx0RW52ZWxvcGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBpbml0aWFsaXplTWVzc2FnZUNvbnRleHQoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzb2FwQWN0aW9uSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUpIHsKLSAgICAgICAgaW50IHNvYXBWZXJzaW9uID0gVkVSU0lPTl9VTktOT1dOOwotICAgICAgICAvLyByZW1vdmUgdGhlIHN0YXJ0aW5nIGFuZCB0cmFpbGluZyAiIGZyb20gdGhlIFNPQVAgQWN0aW9uCi0gICAgICAgIGlmICgoc29hcEFjdGlvbkhlYWRlciAhPSBudWxsKSAKLSAgICAgICAgICAgICAgICAmJiBzb2FwQWN0aW9uSGVhZGVyLmxlbmd0aCgpID4gMCAKLSAgICAgICAgICAgICAgICAmJiBzb2FwQWN0aW9uSGVhZGVyLmNoYXJBdCgwKSA9PSAnXCInCi0gICAgICAgICAgICAgICAgJiYgc29hcEFjdGlvbkhlYWRlci5lbmRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgc29hcEFjdGlvbkhlYWRlciA9IHNvYXBBY3Rpb25IZWFkZXIuc3Vic3RyaW5nKDEsIHNvYXBBY3Rpb25IZWFkZXIubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZpbGwgdXAgdGhlIE1lc3NhZ2UgQ29udGV4dHMKLSAgICAgICAgbXNnQ29udGV4dC5zZXRTb2FwQWN0aW9uKHNvYXBBY3Rpb25IZWFkZXIpOwotICAgICAgICBtc2dDb250ZXh0LnNldFRvKG5ldyBFbmRwb2ludFJlZmVyZW5jZShyZXF1ZXN0VVJJKSk7Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmVyU2lkZSh0cnVlKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHR5cGUgb2YgY2hhciBlbmNvZGluZwotICAgICAgICBTdHJpbmcgY2hhclNldEVuYyA9IEJ1aWxkZXJVdGlsLmdldENoYXJTZXRFbmNvZGluZyhjb250ZW50VHlwZSk7Ci0gICAgICAgIGlmIChjaGFyU2V0RW5jID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoYXJTZXRFbmMgPSBNZXNzYWdlQ29udGV4dC5ERUZBVUxUX0NIQVJfU0VUX0VOQ09ESU5HOwotICAgICAgICB9Ci0gICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ0hBUkFDVEVSX1NFVF9FTkNPRElORywgY2hhclNldEVuYyk7Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKFNPQVAxMkNvbnN0YW50cy5TT0FQXzEyX0NPTlRFTlRfVFlQRSkgPiAtMSkgewotICAgICAgICAgICAgICAgIHNvYXBWZXJzaW9uID0gVkVSU0lPTl9TT0FQMTI7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMucHJvY2Vzc0NvbnRlbnRUeXBlRm9yQWN0aW9uKGNvbnRlbnRUeXBlLCBtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgLmluZGV4T2YoU09BUDExQ29uc3RhbnRzLlNPQVBfMTFfQ09OVEVOVF9UWVBFKSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgc29hcFZlcnNpb24gPSBWRVJTSU9OX1NPQVAxMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSRVNUUmVxdWVzdChjb250ZW50VHlwZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBSRVNULCBjb25zdHJ1Y3QgYSBTT0FQMTEgZW52ZWxvcGUgdG8gaG9sZCB0aGUgcmVzdCBtZXNzYWdlIGFuZAotICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIFJFU1QgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICBzb2FwVmVyc2lvbiA9IFZFUlNJT05fU09BUDExOwotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNvYXBWZXJzaW9uID09IFZFUlNJT05fU09BUDExKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBLZWl0aCA6IERvIHdlIG5lZWQgdGhpcyBhbnltb3JlCi0gICAgICAgICAgICAgICAgLy8gRGVwbG95bWVudCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBlbmFibGVSRVNUID0gbXNnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhcmFtZXRlcihDb25zdGFudHMuQ29uZmlndXJhdGlvbi5FTkFCTEVfUkVTVCk7Ci0gICAgICAgICAgICAgICAgaWYgKChzb2FwQWN0aW9uSGVhZGVyID09IG51bGwpICYmIChlbmFibGVSRVNUICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDb25zdGFudHMuVkFMVUVfVFJVRS5lcXVhbHMoZW5hYmxlUkVTVC5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRlbnQgVHlwZSBpcyB0ZXh0L3htbCAoQlRXIHdoaWNoIGlzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU09BUCAxLjEgQ29udGVudCB0eXBlICkgYW5kIHRoZSBTT0FQIEFjdGlvbiBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJzZW50IGl0IGlzIHJlc3QgISEKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RG9pbmdSRVNUKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzb2FwVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGhhbmRsZUdaaXAoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgSW5wdXRTdHJlYW0gaW4pCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBNYXAgaGVhZGVycyA9IChNYXApIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMpOwotCi0gICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChIVFRQQ29uc3RhbnRzLkNPTVBSRVNTSU9OX0daSVAKLSAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhoZWFkZXJzLmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0VOQ09ESU5HKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5DT01QUkVTU0lPTl9HWklQLmVxdWFscyhoZWFkZXJzLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0VOQ09ESU5HX0xPV0VSQ0FTRSkpKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIG1hdGNoIGZvciBjb250ZW50IHR5cGVzIHRoYXQgd2lsbCBiZSByZWdhcmRlZCBhcyBSRVNUIGluIFdTREwyLjAuCi0gICAgICogVGhpcyBjb250YWlucywKLSAgICAgKiAxLiBhcHBsaWNhdGlvbi94bWwKLSAgICAgKiAyLiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKLSAgICAgKiAzLiBtdWx0aXBhcnQvZm9ybS1kYXRhCi0gICAgICogPHAvPgotICAgICAqIElmIHRoZSByZXF1ZXN0IGRvZXNub3QgY29udGFpbiBhIGNvbnRlbnQgdHlwZTsgdGhpcyB3aWxsIHJldHVybiB0cnVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIGNvbnRlbnQgdHlwZSB0byBjaGVjawotICAgICAqIEByZXR1cm4gQm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JFU1RSZXF1ZXN0KFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICByZXR1cm4gY29udGVudFR5cGUgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgKGNvbnRlbnRUeXBlLmluZGV4T2YoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTCkgPiAtMSB8fAotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLmluZGV4T2YoSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX1hfV1dXX0ZPUk0pID4gLTEgfHwKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZS5pbmRleE9mKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9NVUxUSVBBUlRfRk9STV9EQVRBKSA+IC0xKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQV29ya2VyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IVFRQV29ya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTM2YzQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFdvcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LkRlcGxveW1lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5IYW5kbGVyLkludm9jYXRpb25SZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5SZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuQXhpc0h0dHBSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLkF4aXNIdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuSHR0cFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLldvcmtlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWwuUkVTVFV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IVFRQOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLkVuY29kaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS53cy5jb21tb25zLnNjaGVtYS5YbWxTY2hlbWE7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEhUVFBXb3JrZXIgaW1wbGVtZW50cyBXb3JrZXIgewotCi0gICAgcHVibGljIEhUVFBXb3JrZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VydmljZSgKLSAgICAgICAgICAgIGZpbmFsIEF4aXNIdHRwUmVxdWVzdCByZXF1ZXN0LAotICAgICAgICAgICAgZmluYWwgQXhpc0h0dHBSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0ID0gbXNnQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZVBhdGggPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRleHRQYXRoID0KLSAgICAgICAgICAgICAgICAoc2VydmljZVBhdGguc3RhcnRzV2l0aCgiLyIpID8gc2VydmljZVBhdGggOiAiLyIgKyBzZXJ2aWNlUGF0aCkgKyAiLyI7Ci0KLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICBTdHJpbmcgbWV0aG9kID0gcmVxdWVzdC5nZXRNZXRob2QoKTsKLSAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb24gPSBIdHRwVXRpbHMuZ2V0U29hcEFjdGlvbihyZXF1ZXN0KTsKLSAgICAgICAgSW52b2NhdGlvblJlc3BvbnNlIHBpOwotCi0gICAgICAgIGlmIChtZXRob2QuZXF1YWxzKEhUVFBDb25zdGFudHMuSEVBREVSX0dFVCkpIHsKLSAgICAgICAgICAgIGlmICh1cmkuZXF1YWxzKCIvZmF2aWNvbi5pY28iKSkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU3RhdHVzLlNDX01PVkVEX1BFUk1BTkVOVExZKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIobmV3IEJhc2ljSGVhZGVyKCJMb2NhdGlvbiIsICJodHRwOi8vd3MuYXBhY2hlLm9yZy9mYXZpY29uLmljbyIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXVyaS5zdGFydHNXaXRoKGNvbnRleHRQYXRoKSkgewotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU3RhdHVzLlNDX01PVkVEX1BFUk1BTkVOVExZKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIobmV3IEJhc2ljSGVhZGVyKCJMb2NhdGlvbiIsIGNvbnRleHRQYXRoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5lbmRzV2l0aCgiYXhpczIvc2VydmljZXMvIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IEhUVFBUcmFuc3BvcnRSZWNlaXZlci5nZXRTZXJ2aWNlc0hUTUwoY29uZmlndXJhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU3RhdHVzLlNDX09LKTsKLSAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShFbmNvZGluZ1V0aWxzLmdldEJ5dGVzKHMsIEhUVFAuSVNPXzg4NTlfMSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cmkuaW5kZXhPZigiPyIpIDwgMCkgewotICAgICAgICAgICAgICAgIGlmICghdXJpLmVuZHNXaXRoKGNvbnRleHRQYXRoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodXJpLmVuZHNXaXRoKCIueHNkIikgfHwgdXJpLmVuZHNXaXRoKCIud3NkbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2VydmljZXMgIT0gbnVsbCkgJiYgIXNlcnZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gc2VydmljZS5nZXRDbGFzc0xvYWRlcigpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUFzU3RyZWFtKCJNRVRBLUlORi8iICsgZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0aW5nQWdlbnQuY29weShzdHJlYW0sIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5lbmRzV2l0aCgiP3dzZGwyIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIpICsgMSwgdXJpLmxlbmd0aCgpIC0gNik7Ci0gICAgICAgICAgICAgICAgSGFzaE1hcCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5wcmludFdTREwyKHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCBnZXRIb3N0KHJlcXVlc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cmkuZW5kc1dpdGgoIj93c2RsIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIpICsgMSwgdXJpLmxlbmd0aCgpIC0gNSk7Ci0gICAgICAgICAgICAgICAgSGFzaE1hcCBzZXJ2aWNlcyA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlcy5nZXQoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5wcmludFdTREwocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIGdldEhvc3QocmVxdWVzdCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVyaS5lbmRzV2l0aCgiP3hzZCIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gdXJpLnN1YnN0cmluZyh1cmkubGFzdEluZGV4T2YoIi8iKSArIDEsIHVyaS5sZW5ndGgoKSAtIDQpOwotICAgICAgICAgICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2Ugc2VydmljZSA9IChBeGlzU2VydmljZSkgc2VydmljZXMuZ2V0KHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU3RhdHVzLlNDX09LKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UucHJpbnRTY2hlbWEocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9jYXRlciBmb3IgbmFtZWQgeHNkcyAtIGNoZWNrIGZvciB0aGUgeHNkIG5hbWUKLSAgICAgICAgICAgIGlmICh1cmkuaW5kZXhPZigiP3hzZD0iKSA+IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgdXJpLnN1YnN0cmluZyh1cmkubGFzdEluZGV4T2YoIi8iKSArIDEsIHVyaS5sYXN0SW5kZXhPZigiP3hzZD0iKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtYU5hbWUgPSB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiPSIpICsgMSk7Ci0KLSAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvL3J1biB0aGUgcG9wdWxhdGlvbiBsb2dpYyBqdXN0IHRvIGJlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5wb3B1bGF0ZVNjaGVtYU1hcHBpbmdzKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vd3JpdGUgb3V0IHRoZSBjb3JyZWN0IHNjaGVtYQotICAgICAgICAgICAgICAgICAgICBNYXAgc2NoZW1hVGFibGUgPSBzZXJ2aWNlLmdldFNjaGVtYU1hcHBpbmdUYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gKFhtbFNjaGVtYSkgc2NoZW1hVGFibGUuZ2V0KHNjaGVtYU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb3RJbmRleCA9IHNjaGVtYU5hbWUuaW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvdEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWFLZXkgPSBzY2hlbWFOYW1lLnN1YnN0cmluZygwLGRvdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPSAoWG1sU2NoZW1hKSBzY2hlbWFUYWJsZS5nZXQoc2NoZW1hS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL3NjaGVtYSBmb3VuZCAtIHdyaXRlIGl0IHRvIHRoZSBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS53cml0ZShyZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IHNlcnZpY2UuZ2V0Q2xhc3NMb2FkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZUFzU3RyZWFtKERlcGxveW1lbnRDb25zdGFudHMuTUVUQV9JTkYgKyAiLyIgKyBzY2hlbWFOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5TQ19PSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tMZW5ndGggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFZhbHVlID0gaW5zdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0xlbmd0aCkgbGVuZ3RoLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKC0xICE9IG5leHRWYWx1ZSAmJiBsZW5ndGggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0ud3JpdGUobmV4dFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFZhbHVlID0gaW5zdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tMZW5ndGgpIGxlbmd0aC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSBzZXJ2aWNlLnByaW50WFNEKGJhb3MsIHNjaGVtYU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJldD4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhb3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrTGVuZ3RoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFZhbHVlID0gaW5zdHJlYW0ucmVhZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tMZW5ndGgpIGxlbmd0aC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLTEgIT0gbmV4dFZhbHVlICYmIGxlbmd0aCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW0ud3JpdGUobmV4dFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRWYWx1ZSA9IGluc3RyZWFtLnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0xlbmd0aCkgbGVuZ3RoLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0c3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2NoZW1hIGF2YWlsYWJsZSBieSB0aGF0IG5hbWUgIC0gc2VuZCA0MDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQsICJTY2hlbWEgTm90IEZvdW5kISIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cmkuaW5kZXhPZigiP3dzZGwyPSIpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cmkuc3Vic3RyaW5nKHVyaS5sYXN0SW5kZXhPZigiLyIpICsgMSwgdXJpLmxhc3RJbmRleE9mKCI/d3NkbDI9IikpOwotICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzSW50ZXJuYWxXU0RMKHVyaSwgY29uZmlndXJhdGlvbkNvbnRleHQsIHNlcnZpY2VOYW1lLCByZXNwb25zZSkpIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cmkuaW5kZXhPZigiP3dzZGw9IikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaS5zdWJzdHJpbmcodXJpLmxhc3RJbmRleE9mKCIvIikgKyAxLCB1cmkubGFzdEluZGV4T2YoIj93c2RsPSIpKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc0ludGVybmFsV1NETCh1cmksIGNvbmZpZ3VyYXRpb25Db250ZXh0LCBzZXJ2aWNlTmFtZSwgcmVzcG9uc2UpKSByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0gICAgICAgICAgICBIZWFkZXJbXSBoZWFkZXJzID0gcmVxdWVzdC5nZXRIZWFkZXJzKEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gaGVhZGVyc1swXS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnRUeXBlLmluZGV4T2YoJzsnKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBHRVQgcmVxdWVzdAotICAgICAgICAgICAgcGkgPSBSRVNUVXRpbC5wcm9jZXNzVVJMUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCAKLSAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUpOwotCi0gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmVxdWFscyhIVFRQQ29uc3RhbnRzLkhFQURFUl9QT1NUKSkgewotICAgICAgICAgICAgLy8gZGVhbCB3aXRoIFBPU1QgcmVxdWVzdAotCi0gICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChIVFRQVHJhbnNwb3J0VXRpbHMuaXNSRVNUUmVxdWVzdChjb250ZW50VHlwZSkpIHsKLSAgICAgICAgICAgICAgICBwaSA9IFJFU1RVdGlsLnByb2Nlc3NYTUxSZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldElucHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBpcCA9IChTdHJpbmcpbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfQUREUik7Ci0gICAgICAgICAgICAgICAgaWYgKGlwICE9IG51bGwpewotICAgICAgICAgICAgICAgICAgICB1cmkgPSBpcCArIHVyaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGkgPSBIVFRQVHJhbnNwb3J0VXRpbHMucHJvY2Vzc0hUVFBQb3N0UmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2FwQWN0aW9uLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVyaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKEhUVFBDb25zdGFudHMuSEVBREVSX1BVVCkpIHsKLQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGkgPSBSRVNUVXRpbC5wcm9jZXNzWE1MUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIAotICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRob2QuZXF1YWxzKEhUVFBDb25zdGFudHMuSEVBREVSX0RFTEVURSkpIHsKLQotICAgICAgICAgICAgcGkgPSBSRVNUVXRpbC5wcm9jZXNzVVJMUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dCwgCi0gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLCAKLSAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24obWV0aG9kICsgIiBtZXRob2Qgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBCb29sZWFuIGhvbGRSZXNwb25zZSA9Ci0gICAgICAgICAgICAoQm9vbGVhbikgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuSE9MRF9SRVNQT05TRSk7Ci0gICAgICAgIGlmIChwaS5lcXVhbHMoSW52b2NhdGlvblJlc3BvbnNlLlNVU1BFTkQpIHx8Ci0gICAgICAgICAgICAgICAgKGhvbGRSZXNwb25zZSAhPSBudWxsICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoaG9sZFJlc3BvbnNlKSkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgKChSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQpIG1zZ0NvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuVFJBTlNQT1JUX0NPTlRST0wpKS5hd2FpdFJlc3BvbnNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiV2Ugd2VyZSBpbnRlcnJ1cHRlZCwgc28gdGhpcyBtYXkgbm90IGZ1bmN0aW9uIGNvcnJlY3RseToiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gRmluYWxpemUgcmVzcG9uc2UKLSAgICAgICAgUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0IHJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydENvbnRyb2wgPQotICAgICAgICAgICAgKFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCkgbXNnQ29udGV4dC4KLSAgICAgICAgICAgIGdldFByb3BlcnR5KFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCk7Ci0KLSAgICAgICAgaWYgKFRyYW5zcG9ydFV0aWxzLmlzUmVzcG9uc2VXcml0dGVuKG1zZ0NvbnRleHQpIHx8Ci0gICAgICAgICAgICAoKHJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydENvbnRyb2wgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICByZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRDb250cm9sLmdldFN0YXR1cygpLmVxdWFscygKLSAgICAgICAgICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQuUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzLlNJR05BTExFRCkpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcmVzcG9uc2UgaXMgd3JpdHRlbiBvciBzaWduYWxsZWQuICBUaGUgY3VycmVudCBzdGF0dXMgaXMgdXNlZCAocHJvYmFibHkgU0NfT0spLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIG1heSBiZSBhY2snZCwgbWFyayB0aGUgc3RhdHVzIGFzIGFjY2VwdGVkLgotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfQUNDRVBURUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NJbnRlcm5hbFdTREwoU3RyaW5nIHVyaSwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwgQXhpc0h0dHBSZXNwb25zZSByZXNwb25zZSkgCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHdzZGxOYW1lID0gdXJpLnN1YnN0cmluZyh1cmkubGFzdEluZGV4T2YoIj0iKSArIDEpOwotCi0gICAgICAgIEhhc2hNYXAgc2VydmljZXMgPSBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfT0spOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICBzZXJ2aWNlLnByaW50VXNlcldTREwocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCksIHdzZGxOYW1lKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2NoZW1hIGF2YWlsYWJsZSBieSB0aGF0IG5hbWUgIC0gc2VuZCA0MDQKLSAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwgIlNjaGVtYSBOb3QgRm91bmQhIik7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRIb3N0KEF4aXNIdHRwUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBudWxsOwotICAgICAgICBIZWFkZXIgaG9zdEhlYWRlciA9IHJlcXVlc3QuZ2V0Rmlyc3RIZWFkZXIoImhvc3QiKTsKLSAgICAgICAgaWYgKGhvc3RIZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHBhcnRzW10gPSBob3N0SGVhZGVyLmdldFZhbHVlKCkuc3BsaXQoIls6XSIpOwotICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBob3N0ID0gcGFydHNbMF0udHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBob3N0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFdvcmtlckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL0hUVFBXb3JrZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmM1MTYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSFRUUFdvcmtlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLldvcmtlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5Xb3JrZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSFRUUFdvcmtlckZhY3RvcnkgaW1wbGVtZW50cyBXb3JrZXJGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBIVFRQV29ya2VyRmFjdG9yeSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV29ya2VyIG5ld1dvcmtlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIVFRQV29ya2VyKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IdHRwVHJhbnNwb3J0UHJvcGVydGllcy5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjNThiZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9IdHRwVHJhbnNwb3J0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmF1dGguQXV0aFBvbGljeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoLkF1dGhTY29wZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIFV0aWxpdHkgYmVhbiBmb3Igc2V0dGluZyB0cmFuc3BvcnQgcHJvcGVydGllcyBpbiBydW50aW1lLgotICovCi1wdWJsaWMgY2xhc3MgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMgewotICAgIHByb3RlY3RlZCBib29sZWFuIGNodW5rZWQ7Ci0gICAgcHJvdGVjdGVkIEh0dHBWZXJzaW9uIGh0dHBWZXJzaW9uOwotICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdG9jb2w7Ci0KLSAgICBwdWJsaWMgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Q2h1bmtlZCgpIHsKLSAgICAgICAgcmV0dXJuIGNodW5rZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEh0dHBWZXJzaW9uIGdldEh0dHBWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gaHR0cFZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLSAgICAgICAgcmV0dXJuIHByb3RvY29sOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENodW5rZWQoYm9vbGVhbiBjaHVua2VkKSB7Ci0gICAgICAgIHRoaXMuY2h1bmtlZCA9IGNodW5rZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SHR0cFZlcnNpb24oSHR0cFZlcnNpb24gaHR0cFZlcmlvbikgewotICAgICAgICB0aGlzLmh0dHBWZXJzaW9uID0gaHR0cFZlcmlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm90b2NvbChTdHJpbmcgcHJvdG9jb2wpIHsKLSAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJveHlQcm9wZXJ0aWVzIHsKLSAgICAgICAgcHJvdGVjdGVkIGludCBwcm94eVBvcnQgPSAtMTsKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBkb21haW4gPSBudWxsOwotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhc3NXb3JkID0gbnVsbDsKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm94eUhvc3ROYW1lID0gbnVsbDsKLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB1c2VyTmFtZSA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIFByb3h5UHJvcGVydGllcygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgewotICAgICAgICAgICAgcmV0dXJuIGRvbWFpbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc1dvcmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFzc1dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3h5SG9zdE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHlIb3N0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJveHlQb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5UG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXNlck5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nIGRvbWFpbikgewotICAgICAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzV29yZChTdHJpbmcgcGFzc1dvcmQpIHsKLSAgICAgICAgICAgIHRoaXMucGFzc1dvcmQgPSBwYXNzV29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3h5TmFtZShTdHJpbmcgcHJveHlIb3N0TmFtZSkgewotICAgICAgICAgICAgdGhpcy5wcm94eUhvc3ROYW1lID0gcHJveHlIb3N0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3h5UG9ydChpbnQgcHJveHlQb3J0KSB7Ci0gICAgICAgICAgICB0aGlzLnByb3h5UG9ydCA9IHByb3h5UG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFVzZXJOYW1lKFN0cmluZyB1c2VyTmFtZSkgewotICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBob2xkaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgTlRNTCwgRGlnZXN0Ci0gICAgYW5kIEJhc2ljIEF1dGhlbnRpY2F0aW9uLiBBdXRoZW50aWNhdGlvbiBpdHNlbGYgaXMgaGFuZGxlZCBieSBodHRwY2xpZW50LiBVc2VyIGRvZXNuJ3QgbmVlZCB0bwotICAgIHdhcnJ5IGFib3V0IHdoYXQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGl0IHVzZXMuIEF4aXMyIHVzZXMgaHR0cGNsaW5ldCdzIGRlZmF1bHQgYXV0aGVudGljYXRpb24KLSAgICBwYXR0ZXJucy4KLSAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aGVudGljYXRvciB7Ci0gICAgICAgIC8qaG9zdCB0aGF0IG5lZWRlZCB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGgqLwotICAgICAgICBwcml2YXRlIFN0cmluZyBob3N0OwotICAgICAgICAvKnBvcnQgb2YgdGhlIGhvc3QgdGhhdCBuZWVkZWQgdG8gYmUgYXV0aGVudGljYXRlZCB3aXRoKi8KLSAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydCA9IEF1dGhTY29wZS5BTllfUE9SVDsKLSAgICAgICAgLypSZWFsbSBmb3IgYXV0aGVudGljYXRpb24gc2NvcGUqLwotICAgICAgICBwcml2YXRlIFN0cmluZyByZWFsbSA9IEF1dGhTY29wZS5BTllfUkVBTE07Ci0gICAgICAgIC8qRG9tYWluIG5lZWRlZCBieSBOVENyZWRlbnRpYWxzIGZvciBOVCBEb21haW4qLwotICAgICAgICBwcml2YXRlIFN0cmluZyBkb21haW47Ci0gICAgICAgIC8qVXNlciBmb3IgYXV0aGVudGljYXRlKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7Ci0gICAgICAgIC8qUGFzc3dvcmQgb2YgdGhlIHVzZXIgZm9yIGF1dGhlbnRpY2F0ZSovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotICAgICAgICAvKiBTd2l0Y2ggdG8gdXNlIHByZWVtcHRpdmUgYXV0aGVudGljYXRpb24gb3Igbm90Ki8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByZWVtcHRpdmUgPSBmYWxzZTsKLSAgICAgICAgLyogaWYgQXV0aGVudGljYXRpb24gc2NoZW1lIG5lZWRzIHJldHJ5IGp1c3QgdHVybiBvbiB0aGUgZm9sbG93aW5nIGZsYWcgKi8KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93ZWRSZXRyeSA9IGZhbHNlOwotICAgICAgICAvKiBDaGFuZ2luZyB0aGUgcHJpb3J0eSBvciBhZGRpbmcgYSBjdXN0b20gQXV0aFBvbGljeSovCi0gICAgICAgIHByaXZhdGUgTGlzdCBhdXRoU2NoZW1lczsKLQotICAgICAgICAvKiBEZWZhdWx0IEF1dGggU2NoZW1zKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlRMTSA9IEF1dGhQb2xpY3kuTlRMTTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUID0gQXV0aFBvbGljeS5ESUdFU1Q7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDID0gQXV0aFBvbGljeS5CQVNJQzsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaG9zdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKLSAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcG9ydDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKLSAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxtKCkgewotICAgICAgICAgICAgcmV0dXJuIHJlYWxtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVhbG0oU3RyaW5nIHJlYWxtKSB7Ci0gICAgICAgICAgICB0aGlzLnJlYWxtID0gcmVhbG07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJuYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIHVzZXJuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7Ci0gICAgICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhc3N3b3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgICAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmVlbXB0aXZlQXV0aGVudGljYXRpb24oYm9vbGVhbiBwcmVlbXB0aXZlKSB7Ci0gICAgICAgICAgICB0aGlzLnByZWVtcHRpdmUgPSBwcmVlbXB0aXZlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0UHJlZW1wdGl2ZUF1dGhlbnRpY2F0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZW1wdGl2ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgewotICAgICAgICAgICAgcmV0dXJuIGRvbWFpbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0gICAgICAgICAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEF1dGhTY2hlbWVzKExpc3QgYXV0aFNjaGVtZXMpIHsKLSAgICAgICAgICAgIHRoaXMuYXV0aFNjaGVtZXMgPSBhdXRoU2NoZW1lczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldEF1dGhTY2hlbWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNjaGVtZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkUmV0cnkoYm9vbGVhbiBhbGxvd2VkUmV0cnkpIHsKLSAgICAgICAgICAgIHRoaXMuYWxsb3dlZFJldHJ5ID0gYWxsb3dlZFJldHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbGxvd2VkUmV0cnkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxvd2VkUmV0cnk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLk1haWxQcm9wZXJ0aWVzIGhhcyBiZWVuCi0gICAgICogZGVwcmVjYXRlZCBhbmQgdXNlciBhcmUgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgamF2YS51dGlsLlByb3BlcnRpZXMgaW5zdGVhZC4gIAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFpbFByb3BlcnRpZXMgewotICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIG1haWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIG1haWxQcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVByb3BlcnR5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgICAgIG1haWxQcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtYWlsUHJvcGVydGllczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFzc3dvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKLSAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICAgICAgfQotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvTGlzdGluZ0FnZW50LmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9MaXN0aW5nQWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiZmZkZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9MaXN0aW5nQWdlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQuRGVwbG95bWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUG9saWN5SW5jbHVkZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkV4dGVybmFsUG9saWN5U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm5lZXRoaS5Qb2xpY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5uZWV0aGkuUG9saWN5UmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0aW5nQWdlbnQgZXh0ZW5kcyBBYnN0cmFjdEFnZW50IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhMaXN0aW5nQWdlbnQuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfTVVMVElQTEVfU0VSVklDRV9KU1BfTkFNRSA9Ci0gICAgICAgICAgICAibGlzdFNlcnZpY2VzLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfU0lOR0xFX1NFUlZJQ0VfSlNQX05BTUUgPQotICAgICAgICAgICAgImxpc3RTaW5nbGVTZXJ2aWNlLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfRkFVTFRZX1NFUlZJQ0VTX0pTUF9OQU1FID0gImxpc3RGYXVsdHlTZXJ2aWNlLmpzcCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5OSU5HX1BPUlQgPSAiUlVOTklOR19QT1JUIjsKLQotICAgIHB1YmxpYyBMaXN0aW5nQWdlbnQoQ29uZmlndXJhdGlvbkNvbnRleHQgYUNvbmZpZ0NvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoYUNvbmZpZ0NvbnRleHQpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUcmFuc3BvcnRMaXN0ZW5lcihTdHJpbmcgc2NoZW1hLCBpbnQgcG9ydCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0cnNJbiA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRJbihzY2hlbWEpOwotICAgICAgICAgICAgaWYgKHRyc0luID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnNJbiA9IG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgQ3VzdG9tTGlzdGVuZXIgaHR0c3BSZWNlaXZlciA9IG5ldyBDdXN0b21MaXN0ZW5lcihwb3J0LCBzY2hlbWEpOwotICAgICAgICAgICAgICAgIGh0dHNwUmVjZWl2ZXIuaW5pdChjb25maWdDb250ZXh0LCB0cnNJbik7Ci0gICAgICAgICAgICAgICAgdHJzSW4uc2V0UmVjZWl2ZXIoaHR0c3BSZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRMaXN0ZW5lck1hbmFnZXIoKS5hZGRMaXN0ZW5lcih0cnNJbiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIC8vCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLQotICAgICAgICBpbml0VHJhbnNwb3J0TGlzdGVuZXIoaHR0cFNlcnZsZXRSZXF1ZXN0KTsKLQotICAgICAgICBTdHJpbmcgcXVlcnkgPSBodHRwU2VydmxldFJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKTsKLSAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChxdWVyeS5pbmRleE9mKCJ3c2RsMiIpID4gMCB8fCBxdWVyeS5pbmRleE9mKCJ3c2RsIikgPiAwIHx8Ci0gICAgICAgICAgICAgICAgcXVlcnkuaW5kZXhPZigieHNkIikgPiAwIHx8IHF1ZXJ5LmluZGV4T2YoInBvbGljeSIpID4gMCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NMaXN0U2VydmljZShodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdXBlci5oYW5kbGUoaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZShodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRyYW5zcG9ydExpc3RlbmVyKEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3QpIHsKLSAgICAgICAgLy8gaHR0cFNlcnZsZXRSZXF1ZXN0LmdldExvY2FsUG9ydCgpICwgZ2l2aW5nIG1lIGEgYnVpbGQgZXJyb3Igc28gSSBoYWQgdG8gdXNlIHRoZSBmb2xsb3dpbgotICAgICAgICBTdHJpbmcgZmlsZVBhcnQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaWxlUGFydCA9IGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSAoZmFsbGJhY2sgdG8gSHR0cFNlcnZsZXRSZXF1ZXN0LmdldFJlcXVlc3RVUkkpIDoiICsgdCk7ICAgIAotICAgICAgICAgICAgZmlsZVBhcnQgPSBodHRwU2VydmxldFJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICB9Ci0gICAgICAgIGludCBpcGluZGV4ID0gZmlsZVBhcnQuaW5kZXhPZigiLy8iKTsKLSAgICAgICAgU3RyaW5nIGlwOwotICAgICAgICBpZiAoaXBpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBpcCA9IGZpbGVQYXJ0LnN1YnN0cmluZyhpcGluZGV4ICsgMiwgZmlsZVBhcnQubGVuZ3RoKCkpOwotICAgICAgICAgICAgaW50IHNlcGVyYXRvckluZGV4ID0gaXAuaW5kZXhPZigiOiIpOwotICAgICAgICAgICAgaW50IHNsYXNoSW5kZXggPSBpcC5pbmRleE9mKCIvIik7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydHN0cjsKLSAgICAgICAgICAgIGlmIChzZXBlcmF0b3JJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcG9ydHN0ciA9IGlwLnN1YnN0cmluZyhzZXBlcmF0b3JJbmRleCArIDEsIHNsYXNoSW5kZXgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwb3J0c3RyID0gIjgwIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYWRkVHJhbnNwb3J0TGlzdGVuZXIoaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNjaGVtZSgpLCBJbnRlZ2VyLnBhcnNlSW50KHBvcnRzdHIpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGlzdEZhdWx0eVNlcnZpY2VzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigic2VydmljZU5hbWUiKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TSU5HTEVfU0VSVklDRSwgc2VydmljZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJPbGQgU2VydmxldCBBUEkgOiIgKyB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZW5kZXJWaWV3KExJU1RfRkFVTFRZX1NFUlZJQ0VTX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5kZXgoSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSBodHRwU2VydmxldFJlc3BvbnNlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcHJvY2Vzc0xpc3RTZXJ2aWNlcyhodHRwU2VydmxldFJlcXVlc3QsIGh0dHBTZXJ2bGV0UmVzcG9uc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RIb3N0QW5kUG9ydChTdHJpbmcgZmlsZVBhcnQsIGJvb2xlYW4gaXNIdHRwKSB7Ci0gICAgICAgIGludCBpcGluZGV4ID0gZmlsZVBhcnQuaW5kZXhPZigiLy8iKTsKLSAgICAgICAgU3RyaW5nIGlwID0gbnVsbDsKLSAgICAgICAgaWYgKGlwaW5kZXggPj0gMCkgewotICAgICAgICAgICAgaXAgPSBmaWxlUGFydC5zdWJzdHJpbmcoaXBpbmRleCArIDIsIGZpbGVQYXJ0Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGludCBzZXBlcmF0b3JJbmRleCA9IGlwLmluZGV4T2YoIjoiKTsKLSAgICAgICAgICAgIGludCBzbGFzaEluZGV4ID0gaXAuaW5kZXhPZigiLyIpOwotICAgICAgICAgICAgU3RyaW5nIHBvcnQ7Ci0gICAgICAgICAgICBpZiAoc2VwZXJhdG9ySW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHBvcnQgPSBpcC5zdWJzdHJpbmcoc2VwZXJhdG9ySW5kZXggKyAxLCBzbGFzaEluZGV4KTsKLSAgICAgICAgICAgICAgICBpcCA9IGlwLnN1YnN0cmluZygwLCBzZXBlcmF0b3JJbmRleCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlwID0gaXAuc3Vic3RyaW5nKDAsIHNsYXNoSW5kZXgpOwotICAgICAgICAgICAgICAgIHBvcnQgPSAiODAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzSHR0cCkgewotICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuc2V0UHJvcGVydHkoUlVOTklOR19QT1JULCBwb3J0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0V4cGxpY2l0U2NoZW1hQW5kV1NETChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIFN0cmluZyBmaWxlUGFydCA9IHJlcS5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgU3RyaW5nIHNjaGVtYSA9IGZpbGVQYXJ0LnN1YnN0cmluZyhmaWxlUGFydC5sYXN0SW5kZXhPZigiLyIpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGFydC5sZW5ndGgoKSk7Ci0gICAgICAgIGlmICgoc2VydmljZXMgIT0gbnVsbCkgJiYgIXNlcnZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBzZXJ2aWNlLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiTUVUQS1JTkYvIiArIHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHN0cmVhbSwgb3V0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvcGllcyB0aGUgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyZWFtICB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+Ci0gICAgICogQHBhcmFtIG9zdHJlYW0gdGhlIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBzdHJlYW0sIE91dHB1dFN0cmVhbSBvc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBJT1V0aWxzLmNvcHkoc3RyZWFtLCBvc3RyZWFtLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBleHRyYWN0U2VydmljZU5hbWUoU3RyaW5nIHVybFN0cmluZykgewotICAgICAgICBpbnQgbiA9IHVybFN0cmluZy5pbmRleE9mKGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkpOwotICAgICAgICBpZiAobiAhPSAtMSkgewotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gdXJsU3RyaW5nLnN1YnN0cmluZyhuICsgY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgdXJsU3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZihzZXJ2aWNlTmFtZS5jaGFyQXQoMCk9PScvJyl7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZU5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVybFN0cmluZy5zdWJzdHJpbmcodXJsU3RyaW5nLmxhc3RJbmRleE9mKCIvIikgKyAxLAotICAgICAgICAgICAgICAgIHVybFN0cmluZy5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgdXJsOwotICAgICAgICB0cnkgewotICAgICAgICB1cmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiT2xkIFNlcnZsZXQgQVBJIChGYWxsYmFjayB0byBIdHRwU2VydmxldFJlcXVlc3QuZ2V0UmVxdWVzdFVSSSkgOiIgKyB0KTsgICAgCi0gICAgICAgICAgICB1cmwgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGV4dHJhY3RTZXJ2aWNlTmFtZSh1cmwpOwotICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9IHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgICAgICBpbnQgd3NkbDIgPSBxdWVyeS5pbmRleE9mKCJ3c2RsMiIpOwotICAgICAgICBpbnQgd3NkbCA9IHF1ZXJ5LmluZGV4T2YoIndzZGwiKTsKLSAgICAgICAgaW50IHhzZCA9IHF1ZXJ5LmluZGV4T2YoInhzZCIpOwotICAgICAgICBpbnQgcG9saWN5ID0gcXVlcnkuaW5kZXhPZigicG9saWN5Iik7Ci0KLSAgICAgICAgaWYgKChzZXJ2aWNlcyAhPSBudWxsKSAmJiAhc2VydmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgc2VydmljZU9iaiA9IHNlcnZpY2VzLmdldChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZU9iaiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIHNlcnZpY2VPYmo7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBpc0h0dHAgPSAiaHR0cCIuZXF1YWxzKHJlcS5nZXRTY2hlbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGwyID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3htbCIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXAgPSBleHRyYWN0SG9zdEFuZFBvcnQodXJsLCBpc0h0dHApOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbE5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJ3c2RsMiIpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IGF4aXNTZXJ2aWNlLnByaW50V1NETDIocmVzLmdldE91dHB1dFN0cmVhbSgpLCBpcCwgd3NkbE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZW5kUmVkaXJlY3QoIiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod3NkbCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC94bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlwID0gZXh0cmFjdEhvc3RBbmRQb3J0KHVybCwgaXNIdHRwKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxOYW1lID0gcmVxLmdldFBhcmFtZXRlcigid3NkbCIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh3c2RsTmFtZSAhPSBudWxsICYmIHdzZGxOYW1lLmxlbmd0aCgpPjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlLnByaW50VXNlcldTREwob3V0LCB3c2RsTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc1NlcnZpY2UucHJpbnRXU0RMKG91dCwgaXApOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh4c2QgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQveG1sIik7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXQgPSBheGlzU2VydmljZS5wcmludFhTRChyZXMuZ2V0T3V0cHV0U3RyZWFtKCksIHJlcS5nZXRQYXJhbWV0ZXIoInhzZCIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL211bHRpcGxlIHNjaGVtYXMgYXJlIHByZXNlbnQgYW5kIHRoZSB1c2VyIHNwZWNpZmllZAotICAgICAgICAgICAgICAgICAgICAgICAgLy9ubyBuYW1lIC0gaW4gdGhpcyBjYXNlIHdlIGNhbm5vdCBwb3NzaWJseSBwdW1wIGEgc2NoZW1hCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3NvIHJlZGlyZWN0IHRvIHRoZSBzZXJ2aWNlIHJvb3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZW5kUmVkaXJlY3QoIiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5ID49IDApIHsKLQotICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBFeHRlcm5hbFBvbGljeVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplci5zZXRBc3NlcnRpb25zVG9GaWx0ZXIoY29uZmlnQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldExvY2FsUG9saWN5QXNzZXJ0aW9ucygpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIElkIGlzIHNldAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaWRQYXJhbSA9IHJlcS5nZXRQYXJhbWV0ZXIoImlkIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWQgaXMgc2V0Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeSB0YXJnZXRQb2xpY3kgPSBmaW5kUG9saWN5KGlkUGFyYW0sIGF4aXNTZXJ2aWNlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL3dzcG9saWN5K3htbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQb2xpY3kuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9jY3VyZWQgd2hlbiBzZXJpYWxpemluZyB0aGUgUG9saWN5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJlZCB3aGVuIHNlcmlhbGl6aW5nIHRoZSBQb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0U3RyID0gIjxiPk5vIHBvbGljeSBmb3VuZCBmb3IgaWQ9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkUGFyYW0gKyAiPC9iPiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKG91dFN0ci5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3lJbmNsdWRlIHBvbGljeUluY2x1ZGUgPSBheGlzU2VydmljZS5nZXRQb2xpY3lJbmNsdWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb2xpY3kgZWZmZWNQb2xpY3kgPSBwb2xpY3lJbmNsdWRlLmdldEVmZmVjdGl2ZVBvbGljeSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWNQb2xpY3kgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFN0cmVhbVdyaXRlciB3cml0ZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJhcHBsaWNhdGlvbi93c3BvbGljeSt4bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWNQb2xpY3kuc2VyaWFsaXplKHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIG9jY3VyZWQgd2hlbiBzZXJpYWxpemluZyB0aGUgUG9saWN5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJlZCB3aGVuIHNlcmlhbGl6aW5nIHRoZSBQb2xpY3kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gcmVzLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dFN0ciA9ICI8Yj5ObyBlZmZlY3RpdmUgcG9saWN5IGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZU5hbWUgKyAiIHNlcnZpY2U8L2I+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUob3V0U3RyLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0lOR0xFX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VPYmopOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSA6IiArIHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0lOR0xFX1NFUlZJQ0UsIG51bGwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KXsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSA6IiArIHQpOyAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlcy5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQsIHVybCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZW5kZXJWaWV3KExJU1RfU0lOR0xFX1NFUlZJQ0VfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGlzdFNlcnZpY2VzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FUlJPUl9TRVJWSUNFX01BUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRGYXVsdHlTZXJ2aWNlcygpKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpewotICAgICAgICAgICAgbG9nLmluZm8oIk9sZCBTZXJ2bGV0IEFQSSA6IiArIHQpOyAgICAKLSAgICAgICAgfQotICAgICAgICByZW5kZXJWaWV3KExJU1RfTVVMVElQTEVfU0VSVklDRV9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgUG9saWN5IGZpbmRQb2xpY3koU3RyaW5nIGlkLCBBeGlzRGVzY3JpcHRpb24gZGVzKSB7Ci0KLSAgICAgICAgTGlzdCBwb2xpY3lFbGVtZW50cyA9IGRlcy5nZXRQb2xpY3lJbmNsdWRlKCkuZ2V0UG9saWN5RWxlbWVudHMoKTsKLSAgICAgICAgUG9saWN5UmVnaXN0cnkgcmVnaXN0cnkgPSBkZXMuZ2V0UG9saWN5SW5jbHVkZSgpLmdldFBvbGljeVJlZ2lzdHJ5KCk7Ci0KLSAgICAgICAgT2JqZWN0IHBvbGljeUNvbXBvbmVudDsKLQotICAgICAgICBQb2xpY3kgcG9saWN5ID0gcmVnaXN0cnkubG9va3VwKGlkKTsKLQotICAgICAgICBpZiAocG9saWN5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwb2xpY3k7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9saWN5RWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcG9saWN5Q29tcG9uZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAocG9saWN5Q29tcG9uZW50IGluc3RhbmNlb2YgUG9saWN5KSB7Ci0gICAgICAgICAgICAgICAgLy8gcG9saWN5IGZvdW5kIGZvciB0aGUgaWQKLQotICAgICAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoKChQb2xpY3kpIHBvbGljeUNvbXBvbmVudCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChQb2xpY3kpIHBvbGljeUNvbXBvbmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBeGlzRGVzY3JpcHRpb24gY2hpbGQ7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlcy5nZXRDaGlsZHJlbigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBjaGlsZCA9IChBeGlzRGVzY3JpcHRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIHBvbGljeSA9IGZpbmRQb2xpY3koaWQsIGNoaWxkKTsKLQotICAgICAgICAgICAgaWYgKHBvbGljeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBvbGljeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvUHJveHlDb25maWd1cmF0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Qcm94eUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZGM3MS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9Qcm94eUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuQ3JlZGVudGlhbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSG9zdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5OVENyZWRlbnRpYWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoLkF1dGhTY29wZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGNvbmZpZ3VyZSB0aGUgcHJveHkgYXV0aCByZWdhcmRsZXMgb2YgdGhlIHByb3RvY29sLgotICogUHJveHkgd2lsbCBiZSBzZXQgb25seSBmb3IgSFRUUCBjb25uZWN0aW9uCi0gKi8KLQotcHVibGljIGNsYXNzIFByb3h5Q29uZmlndXJhdGlvbiB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5SG9zdDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5vblByb3h5SG9zdHM7Ci0gICAgcHJvdGVjdGVkIGludCBwcm94eVBvcnQgPSAtMTsgLy9JZiBwb3J0IGlzIG5vdCBzZXQsIGRlZmF1bHQgaXMgc2V0IHRvIC0xCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm94eVVzZXI7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm94eVBhc3N3b3JkOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QUk9YWV9IT1NUID0gImh0dHAucHJveHlIb3N0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1hZX1BPUlQgPSAiaHR0cC5wcm94eVBvcnQiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfTk9OX1BST1hZX0hPU1RTID0gImh0dHAubm9uUHJveHlIb3N0cyI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BST1hZID0gIlByb3h5IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9IT1NUX0VMRU1FTlQgPSAiUHJveHlIb3N0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9QT1JUX0VMRU1FTlQgPSAiUHJveHlQb3J0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9VU0VSX0VMRU1FTlQgPSAiUHJveHlVc2VyIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9QQVNTV09SRF9FTEVNRU5UID0gIlByb3h5UGFzc3dvcmQiOwotCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQ2xpZW50IGh0dHBDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3RDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iUHJveHkiPgotICAgICAgICAvLyAgICAgICAgICAgICAgPENvbmZpZ3VyYXRpb24+Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgPFByb3h5SG9zdD5leGFtcGxlLm9yZzwvUHJveHlIb3N0PgotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIDxQcm94eVBvcnQ+NTY3ODwvUHJveHlQb3J0PgotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIDxQcm94eVVzZXI+RVhBTVBMRVxzYW1pbmRhPC9Qcm94eVVzZXI+Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgPFByb3h5UGFzc3dvcmQ+cHBwPC9Qcm94eVBhc3N3b3JkPgotICAgICAgICAvLyAgICAgICAgICAgICAgPC9Db25maWd1cmF0aW9uPgotICAgICAgICAvLyAgICAgICAgPC9wYXJhbWV0ZXI+Ci0gICAgICAgIENyZWRlbnRpYWxzIHByb3h5Q3JlZCA9IG51bGw7Ci0KLSAgICAgICAgLy9HZXR0aW5nIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZyb20gQXhpczIueG1sCi0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG1lc3NhZ2VDb250ZXh0LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCkuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQVRUUl9QUk9YWSk7Ci0KLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9NRWxlbWVudCBjb25maWd1cmF0aW9uRWxlID0gcGFyYW0uZ2V0UGFyYW1ldGVyRWxlbWVudCgpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm94eUNvbmZpZ3VyYXRpb24uY2xhc3MuZ2V0TmFtZSgpICsgIiBDb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgbWlzc2luZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBPTUVsZW1lbnQgcHJveHlIb3N0RWxlID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZS5nZXRGaXJzdENoaWxkV2l0aE5hbWUobmV3IFFOYW1lKFBST1hZX0hPU1RfRUxFTUVOVCkpOwotICAgICAgICAgICAgT01FbGVtZW50IHByb3h5UG9ydEVsZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShQUk9YWV9QT1JUX0VMRU1FTlQpKTsKLSAgICAgICAgICAgIE9NRWxlbWVudCBwcm94eVVzZXJFbGUgPQotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uRWxlLmdldEZpcnN0Q2hpbGRXaXRoTmFtZShuZXcgUU5hbWUoUFJPWFlfVVNFUl9FTEVNRU5UKSk7Ci0gICAgICAgICAgICBPTUVsZW1lbnQgcHJveHlQYXNzd29yZEVsZSA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGUuZ2V0Rmlyc3RDaGlsZFdpdGhOYW1lKG5ldyBRTmFtZShQUk9YWV9QQVNTV09SRF9FTEVNRU5UKSk7Ci0KLSAgICAgICAgICAgIGlmIChwcm94eUhvc3RFbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm94eUNvbmZpZ3VyYXRpb24uY2xhc3MuZ2V0TmFtZSgpICsgIiBQcm94eUhvc3QgZWxlbWVudCBpcyBtaXNzaW5nIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdGV4dCA9IHByb3h5SG9zdEVsZS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5Q29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCkgKyAiIFByb3h5SG9zdCdzIHZhbHVlIGlzIG1pc3NpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5zZXRQcm94eUhvc3QodGV4dCk7Ci0KLSAgICAgICAgICAgIGlmIChwcm94eVBvcnRFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJveHlQb3J0KEludGVnZXIucGFyc2VJbnQocHJveHlQb3J0RWxlLmdldFRleHQoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJveHlVc2VyRWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNldFByb3h5VXNlcihwcm94eVVzZXJFbGUuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHByb3h5UGFzc3dvcmRFbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJveHlQYXNzd29yZChwcm94eVBhc3N3b3JkRWxlLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0aGlzLmdldFByb3h5VXNlcigpID09IG51bGwgJiYgdGhpcy5nZXRQcm94eVVzZXIoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJveHlDcmVkID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscygiIiwgIiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcm94eUNyZWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyh0aGlzLmdldFByb3h5VXNlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByb3h5UGFzc3dvcmQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZSB1c2VybmFtZSBpcyBpbiB0aGUgZm9ybSAiRE9NQUlOXFx1c2VyIgotICAgICAgICAgICAgLy8gdGhlbiB1c2UgTlRDcmVkZW50aWFscyBpbnN0ZWFkLgotICAgICAgICAgICAgaWYgKHRoaXMuZ2V0UHJveHlVc2VyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBkb21haW5JbmRleCA9IHRoaXMuZ2V0UHJveHlVc2VyKCkuaW5kZXhPZigiXFwiKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9tYWluSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSB0aGlzLmdldFByb3h5VXNlcigpLnN1YnN0cmluZygwLCBkb21haW5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldFByb3h5VXNlcigpLmxlbmd0aCgpID4gZG9tYWluSW5kZXggKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlciA9IHRoaXMuZ2V0UHJveHlVc2VyKCkuc3Vic3RyaW5nKGRvbWFpbkluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm94eUNyZWQgPSBuZXcgTlRDcmVkZW50aWFscyh1c2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQcm94eVBhc3N3b3JkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFByb3h5SG9zdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE92ZXJpZGUgdGhlIHByb3BlcnR5IHNldHRpbmcgaW4gcnVudGltZS4KLSAgICAgICAgSHR0cFRyYW5zcG9ydFByb3BlcnRpZXMuUHJveHlQcm9wZXJ0aWVzIHByb3h5UHJvcGVydGllcyA9Ci0gICAgICAgICAgICAgICAgKEh0dHBUcmFuc3BvcnRQcm9wZXJ0aWVzLlByb3h5UHJvcGVydGllcykgbWVzc2FnZUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eShIVFRQQ29uc3RhbnRzLlBST1hZKTsKLQotICAgICAgICBpZiAocHJveHlQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBob3N0ID0gcHJveHlQcm9wZXJ0aWVzLmdldFByb3h5SG9zdE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgaG9zdC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdChQcm94eUNvbmZpZ3VyYXRpb24uY2xhc3MuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUHJveHkgaG9zdCBpcyBub3QgYXZhaWxhYmxlLiBIb3N0IGlzIGEgTVVTVCBwYXJhbWV0ZXIiKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLnNldFByb3h5SG9zdChob3N0KTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICB0aGlzLnNldFByb3h5UG9ydChwcm94eVByb3BlcnRpZXMuZ2V0UHJveHlQb3J0KCkpOwotCi0gICAgICAgICAgICAvL1NldHRpbmcgY3JlZGVudGlhbHMKLQotICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gcHJveHlQcm9wZXJ0aWVzLmdldFVzZXJOYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBwcm94eVByb3BlcnRpZXMuZ2V0UGFzc1dvcmQoKTsKLSAgICAgICAgICAgIFN0cmluZyBkb21haW4gPSBwcm94eVByb3BlcnRpZXMuZ2V0RG9tYWluKCk7Ci0KLSAgICAgICAgICAgIGlmICh1c2VyTmFtZSA9PSBudWxsICYmIHBhc3N3b3JkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm94eUNyZWQgPSBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCIiLCAiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3h5Q3JlZCA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHModXNlck5hbWUsIHBhc3N3b3JkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVzZXJOYW1lICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCAmJiBkb21haW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3h5Q3JlZCA9IG5ldyBOVENyZWRlbnRpYWxzKHVzZXJOYW1lLCBwYXNzd29yZCwgaG9zdCwgZG9tYWluKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy9Vc2luZyBKYXZhIE5ldHdvcmtpbmcgUHJvcGVydGllcwotCi0gICAgICAgIFN0cmluZyBob3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfUFJPWFlfSE9TVCk7Ci0gICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0UHJveHlIb3N0KGhvc3QpOwotICAgICAgICAgICAgcHJveHlDcmVkID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscygiIiwiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQX1BST1hZX1BPUlQpOwotCi0gICAgICAgIGlmIChwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMuc2V0UHJveHlQb3J0KEludGVnZXIucGFyc2VJbnQocG9ydCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb3h5Q3JlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXhpc0ZhdWx0KFByb3h5Q29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNaW5pbXVtIHByb3h5IGNyZWRlbnRpYWxzIGFyZSBub3Qgc2V0Iik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGh0dHBDbGllbnQuZ2V0UGFyYW1zKCkuc2V0QXV0aGVudGljYXRpb25QcmVlbXB0aXZlKHRydWUpOwotICAgICAgICBodHRwQ2xpZW50LmdldFN0YXRlKCkuc2V0UHJveHlDcmVkZW50aWFscyhBdXRoU2NvcGUuQU5ZLCBwcm94eUNyZWQpOwotICAgICAgICBjb25maWcuc2V0UHJveHkodGhpcy5nZXRQcm94eUhvc3QoKSwgdGhpcy5nZXRQcm94eVBvcnQoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZmlyc3QgaWYgdGhlIHByb3h5IGlzIGNvbmZpZ3VyZWQgb3IgYWN0aXZlLgotICAgICAqIElmIHllcyB0aGlzIHdpbGwgcmV0dXJuIHRydWUuIFRoaXMgaXMgbm90IGEgZGVlcCBjaGVjawotICAgICAqCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDb250ZXh0Ci0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm94eUVuYWJsZWQoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQsIFVSTCB0YXJnZXRVUkwpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7Ci0KLQotICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBtZXNzYWdlQ29udGV4dC5nZXRDb25maWd1cmF0aW9uQ29udGV4dCgpLmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVyKEFUVFJfUFJPWFkpOwotCi0gICAgICAgIC8vSWYgY29uZmlndXJhdGlvbiBpcyBvdmVyIHJpZGRlbgotICAgICAgICBPYmplY3Qgb2JqID0gbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5QUk9YWSk7Ci0KLSAgICAgICAgLy9Gcm9tIEphdmEgTmV0d29ya2luZyBQcm9wZXJ0aWVzCi0gICAgICAgIFN0cmluZyBzcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShIVFRQX1BST1hZX0hPU1QpOwotCi0gICAgICAgIGlmIChwYXJhbSAhPSBudWxsIHx8IG9iaiAhPSBudWxsIHx8IHNwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHN0YXRlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNOb25Qcm94eUhvc3QgPSB2YWxpZGF0ZU5vblByb3h5SG9zdHModGFyZ2V0VVJMLmdldEhvc3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRlICYmICFpc05vblByb3h5SG9zdDsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBmb3IgbmFtZXMgdGhhdCBzaG91bGRuJ3QgYmUgbGlzdGVyZWQgYXMgcHJveGllcy4KLSAgICAgKiBUaGUgaHR0cC5ub25Qcm94eUhvc3RzIGNhbiBiZSBzZXQgdG8gc3BlY2lmeSB0aGUgaG9zdHMgd2hpY2ggc2hvdWxkIGJlCi0gICAgICogY29ubmVjdGVkIHRvIGRpcmVjdGx5IChub3QgdGhyb3VnaCB0aGUgcHJveHkgc2VydmVyKS4KLSAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGh0dHAubm9uUHJveHlIb3N0cyBwcm9wZXJ0eSBjYW4gYmUgYSBsaXN0IG9mIGhvc3RzLAotICAgICAqIGVhY2ggc2VwYXJhdGVkIGJ5IGEgfDsgaXQgY2FuIGFsc28gdGFrZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgbWF0Y2hlczsKLSAgICAgKiBmb3IgZXhhbXBsZTogKi5zZmJheS5zdW4uY29tIHdvdWxkIG1hdGNoIGFueSBmdWxseSBxdWFsaWZpZWQgaG9zdG5hbWUgaW4gdGhlIHNmYmF5IGRvbWFpbi4KLSAgICAgKgotICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIDogaHR0cDovL2phdmEuc3VuLmNvbS9mZWF0dXJlcy8yMDAyLzExL2hpbGV2ZWxfbmV0d29yay5odG1sCi0gICAgICoKLSAgICAgKiBmYWxzZSA6IHZhbGlkYXRpb24gZmFpbCA6IFVzZXIgY2FuIHVzZSB0aGUgcHJveHkKLSAgICAgKiB0cnVlIDogdmFsaWRhdGlvbiBwYXNzIDsgVXNlciBjYW4ndCB1c2UgdGhlIHByb3h5Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVOb25Qcm94eUhvc3RzKFN0cmluZyBob3N0KSB7Ci0gICAgICAgIC8vRnJvbSBzeXN0ZW0gcHJvcGVydHkgaHR0cC5ub25Qcm94eUhvc3RzCi0gICAgICAgIFN0cmluZyBub25Qcm94eUhvc3RzID0gU3lzdGVtLmdldFByb3BlcnR5KEhUVFBfTk9OX1BST1hZX0hPU1RTKTsKLSAgICAgICAgcmV0dXJuIGlzSG9zdEluTm9uUHJveHlMaXN0KGhvc3QsIG5vblByb3h5SG9zdHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3BlY2lmaWVkIGhvc3QgaXMgaW4gdGhlIGxpc3Qgb2Ygbm9uIHByb3h5IGhvc3RzLgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgaG9zdCBuYW1lCi0gICAgICogQHBhcmFtIG5vblByb3h5SG9zdHMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxpc3Qgb2Ygbm9uIHByb3h5IGhvc3RzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUvZmFsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIb3N0SW5Ob25Qcm94eUxpc3QoU3RyaW5nIGhvc3QsIFN0cmluZyBub25Qcm94eUhvc3RzKSB7Ci0gICAgICAgIGlmICgobm9uUHJveHlIb3N0cyA9PSBudWxsKSB8fCAoaG9zdCA9PSBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIGh0dHAubm9uUHJveHlIb3N0cyBzeXN0ZW0gcHJvcGVydHkgaXMgYSBsaXN0IGVuY2xvc2VkIGluCi0gICAgICAgICAqIGRvdWJsZSBxdW90ZXMgd2l0aCBpdGVtcyBzZXBhcmF0ZWQgYnkgYSB2ZXJ0aWNhbCBiYXIuCi0gICAgICAgICAqLwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihub25Qcm94eUhvc3RzLCAifFwiIik7Ci0KLSAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaWYgKG1hdGNoKHBhdHRlcm4sIGhvc3QsIGZhbHNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYXRjaGVzIGEgc3RyaW5nIGFnYWluc3QgYSBwYXR0ZXJuLiBUaGUgcGF0dGVybiBjb250YWlucyB0d28gc3BlY2lhbAotICAgICAqIGNoYXJhY3RlcnM6Ci0gICAgICogJyonIHdoaWNoIG1lYW5zIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLAotICAgICAqCi0gICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIChub24tbnVsbCkgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0Ci0gICAgICogQHBhcmFtIHN0ciAgICAgdGhlIChub24tbnVsbCkgc3RyaW5nIHRoYXQgbXVzdCBiZSBtYXRjaGVkIGFnYWluc3QgdGhlCi0gICAgICogICAgICAgICAgICAgICAgcGF0dGVybgotICAgICAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbiB0aGUgc3RyaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGF0dGVybiwKLSAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1hdGNoKFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgewotCi0gICAgICAgIGNoYXJbXSBwYXRBcnIgPSBwYXR0ZXJuLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIGNoYXJbXSBzdHJBcnIgPSBzdHIudG9DaGFyQXJyYXkoKTsKLSAgICAgICAgaW50IHBhdElkeFN0YXJ0ID0gMDsKLSAgICAgICAgaW50IHBhdElkeEVuZCA9IHBhdEFyci5sZW5ndGggLSAxOwotICAgICAgICBpbnQgc3RySWR4U3RhcnQgPSAwOwotICAgICAgICBpbnQgc3RySWR4RW5kID0gc3RyQXJyLmxlbmd0aCAtIDE7Ci0gICAgICAgIGNoYXIgY2g7Ci0gICAgICAgIGJvb2xlYW4gY29udGFpbnNTdGFyID0gZmFsc2U7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRBcnIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNTdGFyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWNvbnRhaW5zU3RhcikgewotCi0gICAgICAgICAgICAvLyBObyAnKidzLCBzbyB3ZSBtYWtlIGEgc2hvcnRjdXQKLSAgICAgICAgICAgIGlmIChwYXRJZHhFbmQgIT0gc3RySWR4RW5kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgLy8gUGF0dGVybiBhbmQgc3RyaW5nIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2ggPSBwYXRBcnJbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ2FzZVNlbnNpdGl2ZSAmJiAoY2ggIT0gc3RyQXJyW2ldKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgIC8vIENoYXJhY3RlciBtaXNtYXRjaAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCkKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJBcnJbaV0pKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgIC8vIENoYXJhY3RlciBtaXNtYXRjaAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAvLyBTdHJpbmcgbWF0Y2hlcyBhZ2FpbnN0IHBhdHRlcm4KLSAgICAgICAgfQotICAgICAgICBpZiAocGF0SWR4RW5kID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAvLyBQYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonLCB3aGljaCBtYXRjaGVzIGFueXRoaW5nCi0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9jZXNzIGNoYXJhY3RlcnMgYmVmb3JlIGZpcnN0IHN0YXIKLSAgICAgICAgd2hpbGUgKChjaCA9IHBhdEFycltwYXRJZHhTdGFydF0pICE9ICcqJwotICAgICAgICAgICAgICAgICYmIChzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpKSB7Ci0gICAgICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlICYmIChjaCAhPSBzdHJBcnJbc3RySWR4U3RhcnRdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAmJiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKQotICAgICAgICAgICAgICAgICAgICAhPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyQXJyW3N0cklkeFN0YXJ0XSkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICBzdHJJZHhTdGFydCsrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgewotCi0gICAgICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlCi0gICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgY2hhcmFjdGVycyBhZnRlciBsYXN0IHN0YXIKLSAgICAgICAgd2hpbGUgKChjaCA9IHBhdEFycltwYXRJZHhFbmRdKSAhPSAnKicgJiYgKHN0cklkeFN0YXJ0IDw9IHN0cklkeEVuZCkpIHsKLSAgICAgICAgICAgIGlmIChpc0Nhc2VTZW5zaXRpdmUgJiYgKGNoICE9IHN0ckFycltzdHJJZHhFbmRdKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAmJiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKQotICAgICAgICAgICAgICAgICAgICAhPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyQXJyW3N0cklkeEVuZF0pKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRJZHhFbmQtLTsKLSAgICAgICAgICAgIHN0cklkeEVuZC0tOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgewotCi0gICAgICAgICAgICAvLyBBbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSB1c2VkLiBDaGVjayBpZiBvbmx5ICcqJ3MgYXJlCi0gICAgICAgICAgICAvLyBsZWZ0IGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydDsgaSA8PSBwYXRJZHhFbmQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwYXRBcnJbaV0gIT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByb2Nlc3MgcGF0dGVybiBiZXR3ZWVuIHN0YXJzLiBwYWRJZHhTdGFydCBhbmQgcGF0SWR4RW5kIHBvaW50Ci0gICAgICAgIC8vIGFsd2F5cyB0byBhICcqJy4KLSAgICAgICAgd2hpbGUgKChwYXRJZHhTdGFydCAhPSBwYXRJZHhFbmQpICYmIChzdHJJZHhTdGFydCA8PSBzdHJJZHhFbmQpKSB7Ci0gICAgICAgICAgICBpbnQgcGF0SWR4VG1wID0gLTE7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYXRJZHhTdGFydCArIDE7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0QXJyW2ldID09ICcqJykgewotICAgICAgICAgICAgICAgICAgICBwYXRJZHhUbXAgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGF0SWR4VG1wID09IHBhdElkeFN0YXJ0ICsgMSkgewotCi0gICAgICAgICAgICAgICAgLy8gVHdvIHN0YXJzIG5leHQgdG8gZWFjaCBvdGhlciwgc2tpcCB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgICAgIHBhdElkeFN0YXJ0Kys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhdHRlcm4gYmV0d2VlbiBwYWRJZHhTdGFydCAmIHBhZElkeFRtcCBpbiBzdHIgYmV0d2VlbgotICAgICAgICAgICAgLy8gc3RySWR4U3RhcnQgJiBzdHJJZHhFbmQKLSAgICAgICAgICAgIGludCBwYXRMZW5ndGggPSAocGF0SWR4VG1wIC0gcGF0SWR4U3RhcnQgLSAxKTsKLSAgICAgICAgICAgIGludCBzdHJMZW5ndGggPSAoc3RySWR4RW5kIC0gc3RySWR4U3RhcnQgKyAxKTsKLSAgICAgICAgICAgIGludCBmb3VuZElkeCA9IC0xOwotCi0gICAgICAgICAgICBzdHJMb29wOgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gc3RyTGVuZ3RoIC0gcGF0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBhdExlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0ICsgaiArIDFdOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNoICE9IHN0ckFycltzdHJJZHhTdGFydCArIGkgKyBqXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Nhc2VTZW5zaXRpdmUgJiYgKENoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZShjaCkgIT0gQ2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKHN0ckFycltzdHJJZHhTdGFydCArIGkgKyBqXSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvdW5kSWR4ID0gc3RySWR4U3RhcnQgKyBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvdW5kSWR4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGF0SWR4U3RhcnQgPSBwYXRJZHhUbXA7Ci0gICAgICAgICAgICBzdHJJZHhTdGFydCA9IGZvdW5kSWR4ICsgcGF0TGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgdXNlZC4gQ2hlY2sgaWYgb25seSAnKidzIGFyZSBsZWZ0Ci0gICAgICAgIC8vIGluIHRoZSBwYXR0ZXJuLiBJZiBzbywgd2Ugc3VjY2VlZGVkLiBPdGhlcndpc2UgZmFpbHVyZS4KLSAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocGF0QXJyW2ldICE9ICcqJykgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0cnVuIHByb3h5IGhvc3QKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm94eUhvc3QoKSB7Ci0gICAgICAgIHJldHVybiBwcm94eUhvc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogc2V0IHByb3h5IGhvc3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm94eUhvc3QKLSAgICAgKi8KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb3h5SG9zdChTdHJpbmcgcHJveHlIb3N0KSB7Ci0gICAgICAgIHRoaXMucHJveHlIb3N0ID0gcHJveHlIb3N0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHJ1biBwcm94eSBwb3J0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJveHlQb3J0KCkgewotICAgICAgICByZXR1cm4gcHJveHlQb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHNldCBwcm94eSBwb3J0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJveHlQb3J0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHlQb3J0KGludCBwcm94eVBvcnQpIHsKLSAgICAgICAgdGhpcy5wcm94eVBvcnQgPSBwcm94eVBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmV0dXJuIHByb3h5IHVzZXIuIFByb3h5IHVzZXIgY2FuIGJlIHVzZXIvZG9tYWluIG9yIHVzZXIKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm94eVVzZXIoKSB7Ci0gICAgICAgIHJldHVybiBwcm94eVVzZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHByb3h5IHVzZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm94eVVzZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm94eVVzZXIoU3RyaW5nIHByb3h5VXNlcikgewotICAgICAgICB0aGlzLnByb3h5VXNlciA9IHByb3h5VXNlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzZXQgcGFzc3dvcmQKLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm94eVBhc3N3b3JkKCkgewotICAgICAgICByZXR1cm4gcHJveHlQYXNzd29yZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgcGFzc3dvcmQKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm94eVBhc3N3b3JkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJveHlQYXNzd29yZChTdHJpbmcgcHJveHlQYXNzd29yZCkgewotICAgICAgICB0aGlzLnByb3h5UGFzc3dvcmQgPSBwcm94eVBhc3N3b3JkOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9SRVNUUmVxdWVzdEVudGl0eS5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvUkVTVFJlcXVlc3RFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhMDU4OC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9SRVNUUmVxdWVzdEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMuUmVxdWVzdEVudGl0eTsKLQotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgUkVTVFJlcXVlc3RFbnRpdHkgaW1wbGVtZW50cyBSZXF1ZXN0RW50aXR5IHsKLSAgICBwcml2YXRlIGJ5dGVbXSBieXRlczsKLSAgICBwcml2YXRlIFN0cmluZyBjaGFyU2V0RW5jOwotICAgIHByaXZhdGUgYm9vbGVhbiBjaHVua2VkOwotICAgIHByaXZhdGUgT01FbGVtZW50IGVsZW1lbnQ7Ci0gICAgcHJpdmF0ZSBNZXNzYWdlQ29udGV4dCBtc2dDdHh0OwotICAgIHByaXZhdGUgU3RyaW5nIHNvYXBBY3Rpb25TdHJpbmc7Ci0gICAgcHJpdmF0ZSBPTU91dHB1dEZvcm1hdCBmb3JtYXQ7Ci0KLSAgICBwdWJsaWMgUkVTVFJlcXVlc3RFbnRpdHkoT01FbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY2h1bmtlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJTZXRFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBBY3Rpb25TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdCkgewotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICB0aGlzLmNodW5rZWQgPSBjaHVua2VkOwotICAgICAgICB0aGlzLm1zZ0N0eHQgPSBtc2dDdHh0OwotICAgICAgICB0aGlzLmNoYXJTZXRFbmMgPSBjaGFyU2V0RW5jb2Rpbmc7Ci0gICAgICAgIHRoaXMuc29hcEFjdGlvblN0cmluZyA9IHNvYXBBY3Rpb25TdHJpbmc7Ci0gICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVPTU91dHB1dChPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGRvaW5nTVRPTSkKLSAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewotICAgICAgICBmb3JtYXQuc2V0RG9PcHRpbWl6ZShkb2luZ01UT00pOwotICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUob3V0LCBmb3JtYXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBieXRlW10gd3JpdGVCeXRlcygpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVzT3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKCFmb3JtYXQuaXNPcHRpbWl6ZWQoKSkgewotICAgICAgICAgICAgICAgIE9NT3V0cHV0Rm9ybWF0IGZvcm1hdDIgPSBuZXcgT01PdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBmb3JtYXQyLnNldENoYXJTZXRFbmNvZGluZyhjaGFyU2V0RW5jKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50LnNlcmlhbGl6ZUFuZENvbnN1bWUoYnl0ZXNPdXQsIGZvcm1hdDIpOwotICAgICAgICAgICAgICAgIHJldHVybiBieXRlc091dC50b0J5dGVBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQuc2V0Q2hhclNldEVuY29kaW5nKGNoYXJTZXRFbmMpOwotICAgICAgICAgICAgICAgIGZvcm1hdC5zZXREb09wdGltaXplKHRydWUpOwotICAgICAgICAgICAgICAgIGVsZW1lbnQuc2VyaWFsaXplQW5kQ29uc3VtZShieXRlc091dCwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNPdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUmVxdWVzdChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNodW5rZWQpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU9NT3V0cHV0KG91dCwgZm9ybWF0LmlzRG9pbmdTV0EoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gd3JpdGVCeXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnl0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IEF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNodW5rZWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gd3JpdGVCeXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMubGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gZm9ybWF0LmdldENoYXJTZXRFbmNvZGluZygpOwotICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBmb3JtYXQuZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlICs9ICI7IGNoYXJzZXQ9IiArIGVuY29kaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWN0aW9uIGhlYWRlciBpcyBub3QgbWFuZGF0ZWQgaW4gU09BUCAxLjIuIFNvIHB1dHRpbmcgaXQsIGlmIGF2YWlsYWJsZQotICAgICAgICBpZiAoIW1zZ0N0eHQuaXNTT0FQMTEoKSAmJiAoc29hcEFjdGlvblN0cmluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmICEiIi5lcXVhbHMoc29hcEFjdGlvblN0cmluZy50cmltKCkpICYmICEiXCJcIiIuZXF1YWxzKHNvYXBBY3Rpb25TdHJpbmcudHJpbSgpKSkgewotICAgICAgICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZSArICI7YWN0aW9uPVwiIiArIHNvYXBBY3Rpb25TdHJpbmcgKyAiXCI7IjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRhYmxlKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9SRVNUUmVxdWVzdEVudGl0eTIuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1JFU1RSZXF1ZXN0RW50aXR5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWEzYzZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1JFU1RSZXF1ZXN0RW50aXR5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5SZXF1ZXN0RW50aXR5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIFJFU1RSZXF1ZXN0RW50aXR5MiBpbXBsZW1lbnRzIFJlcXVlc3RFbnRpdHkgewotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIHByaXZhdGUgU3RyaW5nIHBvc3RSZXF1ZXN0Qm9keTsKLQotICAgIHB1YmxpYyBSRVNUUmVxdWVzdEVudGl0eTIoU3RyaW5nIHBvc3RSZXF1ZXN0Qm9keSwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIHRoaXMucG9zdFJlcXVlc3RCb2R5ID0gcG9zdFJlcXVlc3RCb2R5OwotICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVSZXF1ZXN0KE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dHB1dC53cml0ZShwb3N0UmVxdWVzdEJvZHkuZ2V0Qnl0ZXMoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucG9zdFJlcXVlc3RCb2R5LmdldEJ5dGVzKCkubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mby5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjkxOTVmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1NlcnZsZXRCYXNlZE91dFRyYW5zcG9ydEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuT3V0VHJhbnNwb3J0SW5mbzsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1wdWJsaWMgY2xhc3MgU2VydmxldEJhc2VkT3V0VHJhbnNwb3J0SW5mbyBpbXBsZW1lbnRzIE91dFRyYW5zcG9ydEluZm8gewotICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKLQotICAgIHB1YmxpYyBTZXJ2bGV0QmFzZWRPdXRUcmFuc3BvcnRJbmZvKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKLSAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBoZWFkZXJOYW1lLCBTdHJpbmcgaGVhZGVyVmFsdWUpIHsKLSAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgewotICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoc3RhdHVzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TaW1wbGVIVFRQU2VydmVyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9TaW1wbGVIVFRQU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTg3MmQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvU2ltcGxlSFRUUFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2Vzc2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkxpc3RlbmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5IdHRwRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlci5IdHRwVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuU2Vzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXIuU2ltcGxlSHR0cFNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuT3B0aW9uc1BhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBhbiBIVFRQIHNlcnZlciBmb3IgcHJvY2Vzc2luZwotICogU09BUCByZXF1ZXN0cyB2aWEgQXBhY2hlJ3MgeG1sLWF4aXMyLgotICogSXQgY2FuIGJlIHVzZWQgd2l0aCBubyBjb25maWd1cmF0aW9uIG90aGVyIHRoYW4gdGhlIHBvcnQgdG8gbGlzdGVuIG9uLCBvciBpdCBjYW4KLSAqIGJlIGNvbmZpZ3VyZWQgaW4gZGV0YWlsIHdpdGggYW4gSHR0cEZhY3RvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVIVFRQU2VydmVyIGltcGxlbWVudHMgVHJhbnNwb3J0TGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFNpbXBsZUhUVFBTZXJ2ZXIuY2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogRW1iZWRkZWQgY29tbW9ucyBodHRwIGNvcmUgYmFzZWQgc2VydmVyCi0gICAgICovCi0gICAgU2ltcGxlSHR0cFNlcnZlciBlbWJlZGRlZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxBZGRyZXNzOwotICAgIGludCBwb3J0ID0gLTE7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX1BPUlQgPSA4MDgwOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgaG9zdEFkZHJlc3MgPSBudWxsOwotCi0gICAgcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIHByb3RlY3RlZCBIdHRwRmFjdG9yeSBodHRwRmFjdG9yeTsKLSAgICBwcml2YXRlIFNlc3Npb25NYW5hZ2VyIHNlc3Npb25NYW5hZ2VyOwotCi0gICAgcHVibGljIFNpbXBsZUhUVFBTZXJ2ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgU2ltcGxlSFRUUFNlcnZlciB1c2luZyBkZWZhdWx0IEh0dHBGYWN0b3J5IHNldHRpbmdzCi0gICAgICovCi0gICAgcHVibGljIFNpbXBsZUhUVFBTZXJ2ZXIoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsIGludCBwb3J0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcyhuZXcgSHR0cEZhY3RvcnkoY29uZmlndXJhdGlvbkNvbnRleHQsIHBvcnQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBjb25maWd1cmVkIFNpbXBsZUhUVFBTZXJ2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlSFRUUFNlcnZlcihIdHRwRmFjdG9yeSBodHRwRmFjdG9yeSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRoaXMuaHR0cEZhY3RvcnkgPSBodHRwRmFjdG9yeTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGh0dHBGYWN0b3J5LmdldENvbmZpZ3VyYXRpb25Db250ZXh0KCk7Ci0gICAgICAgIHRoaXMucG9ydCA9IGh0dHBGYWN0b3J5LmdldFBvcnQoKTsKLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiBodHRwRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIG5ldyBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0gICAgICAgIGh0dHBEZXNjcmlwdGlvbi5zZXRSZWNlaXZlcih0aGlzKTsKLSAgICAgICAgaHR0cEZhY3RvcnkuZ2V0TGlzdGVuZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIoaHR0cERlc2NyaXB0aW9uLCB0cnVlKTsKLSAgICAgICAgc2Vzc2lvbk1hbmFnZXIgPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBpbml0IG1ldGhvZCBpbiBUcmFuc3BvcnRMaXN0ZW5lcgotICAgICAqCi0gICAgICogQHBhcmFtIGF4aXNDb25mCi0gICAgICogQHBhcmFtIHRyYW5zcHJ0SW4KLSAgICAgKiBAdGhyb3dzIEF4aXNGYXVsdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgYXhpc0NvbmYsIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwcnRJbikKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGF4aXNDb25mOwotCi0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSB0cmFuc3BydEluLmdldFBhcmFtZXRlcihQQVJBTV9QT1JUKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5wb3J0ID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwYXJhbS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGh0dHBGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBodHRwRmFjdG9yeSA9IG5ldyBIdHRwRmFjdG9yeShjb25maWd1cmF0aW9uQ29udGV4dCwgcG9ydCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcmFtID0gdHJhbnNwcnRJbi5nZXRQYXJhbWV0ZXIoSE9TVF9BRERSRVNTKTsKLSAgICAgICAgICAgIGlmIChwYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaG9zdEFkZHJlc3MgPSAoKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKSkudHJpbSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBob3N0QWRkcmVzcyA9IGh0dHBGYWN0b3J5LmdldEhvc3RBZGRyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgbWFpbgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZ3MKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgcG9ydCA9IERFRkFVTFRfUE9SVDsKLSAgICAgICAgT3B0aW9uc1BhcnNlciBvcHRpb25zUGFyc2VyID0gbmV3IE9wdGlvbnNQYXJzZXIoYXJncyk7Ci0KLSAgICAgICAgYXJncyA9IG9wdGlvbnNQYXJzZXIuZ2V0UmVtYWluaW5nQXJncygpOwotICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiB3ZSBzaG91bGQgcHJpbnQgdXNhZ2UKLSAgICAgICAgaWYgKChvcHRpb25zUGFyc2VyLmlzRmxhZ1NldCgnPycpID4gMCkgfHwgKG9wdGlvbnNQYXJzZXIuaXNGbGFnU2V0KCdoJykgPiAwKSB8fAotICAgICAgICAgICAgYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDAgfHwgYXJncy5sZW5ndGggPiAzKSB7Ci0gICAgICAgICAgICBwcmludFVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHBhcmFtUG9ydCA9IG9wdGlvbnNQYXJzZXIuaXNWYWx1ZVNldCgncCcpOwotICAgICAgICBpZiAocGFyYW1Qb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHBhcmFtUG9ydCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHN0YXJ0QWxsVHJhbnNwb3J0cyA9ICJhbGwiLmVxdWFscyhvcHRpb25zUGFyc2VyLmlzVmFsdWVTZXQoJ3QnKSk7Ci0gICAgICAgIFN0cmluZyByZXBvc2l0b3J5ID0gb3B0aW9uc1BhcnNlci5pc1ZhbHVlU2V0KCdyJyk7Ci0gICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIGFyZ3MgPSBvcHRpb25zUGFyc2VyLmdldFJlbWFpbmluZ0FyZ3MoKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwgJiYgYXJnc1swXSAhPSBudWxsICYmICFhcmdzWzBdLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICByZXBvc2l0b3J5ID0gYXJnc1swXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlSFRUUFNlcnZlcl0gU3RhcnRpbmciKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlSFRUUFNlcnZlcl0gVXNpbmcgdGhlIEF4aXMyIFJlcG9zaXRvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuZXcgRmlsZShyZXBvc2l0b3J5KS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZUhUVFBTZXJ2ZXJdIExpc3RlbmluZyBvbiBwb3J0ICIgKyBwb3J0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2N0eCA9IENvbmZpZ3VyYXRpb25Db250ZXh0RmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29uZmlndXJhdGlvbkNvbnRleHRGcm9tRmlsZVN5c3RlbShyZXBvc2l0b3J5LCBudWxsKTsKLSAgICAgICAgICAgIFNpbXBsZUhUVFBTZXJ2ZXIgcmVjZWl2ZXIgPSBuZXcgU2ltcGxlSFRUUFNlcnZlcihjb25maWdjdHgsIHBvcnQpOwotICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBTaHV0ZG93blRocmVhZChyZWNlaXZlcikpOwotICAgICAgICAgICAgcmVjZWl2ZXIuc3RhcnQoKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJzSW4gPSBuZXcgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbihDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApOwotICAgICAgICAgICAgdHJzSW4uc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgTGlzdGVuZXJNYW5hZ2VyIGxpc3RlbmVyTWFuYWdlciA9IGNvbmZpZ2N0eC5nZXRMaXN0ZW5lck1hbmFnZXIoKTsKLSAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5hZGRMaXN0ZW5lcih0cnNJbiwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIHNob3VsZCBhbGwgdHJhbnNwb3J0cyBiZSBzdGFydGVkPyBzcGVjaWZpZWQgYXMgIi10IGFsbCIKLSAgICAgICAgICAgIGlmIChzdGFydEFsbFRyYW5zcG9ydHMpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBpdGVyID0gY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc3BvcnRzSW4oKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBRTmFtZSB0cnAgPSAoUU5hbWUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW5ldyBRTmFtZShDb25zdGFudHMuVFJBTlNQT1JUX0hUVFApLmVxdWFscyh0cnApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnNJbiA9IChUcmFuc3BvcnRJbkRlc2NyaXB0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdjdHguZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRzSW4oKS5nZXQodHJwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyTWFuYWdlci5hZGRMaXN0ZW5lcih0cnNJbiwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTaW1wbGVIVFRQU2VydmVyXSBTdGFydGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBsb2cuZmF0YWwoIkVycm9yIHN0YXJ0aW5nIFNpbXBsZUhUVFBTZXJ2ZXIiLCB0KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW1NpbXBsZUhUVFBTZXJ2ZXJdIFNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBTaW1wbGVIVFRQU2VydmVyIFtvcHRpb25zXSAtciA8cmVwb3NpdG9yeT4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgT3B0czogLT8gdGhpcyBtZXNzYWdlIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAtcCBwb3J0IDp0byBsaXN0ZW4gb24gKGRlZmF1bHQgaXMgODA4MCkiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICIgICAgICAgLXQgYWxsICA6dG8gc3RhcnQgYWxsIHRyYW5zcG9ydHMgZGVmaW5lZCBpbiB0aGUgYXhpczIgY29uZmlndXJhdGlvbiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0IHRoaXMgc2VydmVyIGFzIGEgTk9OLWRhZW1vbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZW1iZWRkZWQgPSBuZXcgU2ltcGxlSHR0cFNlcnZlcihodHRwRmFjdG9yeSwgcG9ydCk7Ci0gICAgICAgICAgICBlbWJlZGRlZC5pbml0KCk7Ci0gICAgICAgICAgICBlbWJlZGRlZC5zdGFydCgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0b3AgdGhpcyBzZXJ2ZXIuIENhbiBiZSBjYWxsZWQgc2FmZWx5IGlmIHRoZSBzeXN0ZW0gaXMgYWxyZWFkeSBzdG9wcGVkLAotICAgICAqIG9yIGlmIGl0IHdhcyBuZXZlciBzdGFydGVkLgotICAgICAqIFRoaXMgd2lsbCBpbnRlcnJ1cHQgYW55IHBlbmRpbmcgYWNjZXB0KCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlSFRUUFNlcnZlcl0gU3RvcCBjYWxsZWQiKTsKLSAgICAgICAgaWYgKGVtYmVkZGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZW1iZWRkZWQuZGVzdHJveSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcmVwbHlUb0VQUgotICAgICAqIElmIHRoZSB1c2VyIGhhcyBnaXZlbiBob3N0IGFkZHJlc3MgcGFyYW10ZXIgdGhlbiBpdCBnZXRzIHRoZSBoaWdoIHByaW9yaXR5IGFuZAotICAgICAqIEVSUCB3aWxsIGJlIGNyZWF0ZCB1c2luZyB0aGF0Ci0gICAgICogTjpCIC0gaG9zdEFkZHJlc3Mgc2hvdWxkIGJlIGEgY29tcGxldGUgdXJsIChodHRwOi8vd3d3Lm15QXBwLmNvbS93cykKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZQotICAgICAqIEBwYXJhbSBpcAotICAgICAqIEByZXR1cm4gYW4gRW5kcG9pbnRSZWZlcmVuY2UKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyI2dldEVQUkZvclNlcnZpY2UoU3RyaW5nLFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2VbXSBnZXRFUFJzRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vaWYgaG9zdCBhZGRyZXNzIGlzIHByZXNlbnQKLSAgICAgICAgaWYgKGhvc3RBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChlbWJlZGRlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50UmVmZXJuY2UgPSBob3N0QWRkcmVzcyA7Ci0gICAgICAgICAgICAgICAgaWYoY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkuc3RhcnRzV2l0aCgiLyIpKXsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRSZWZlcm5jZSA9ICBlbmRwb2ludFJlZmVybmNlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSArICIvIiArIHNlcnZpY2VOYW1lOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50UmVmZXJuY2UgPSBlbmRwb2ludFJlZmVybmNlICsgJy8nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dFBhdGgoKSArICIvIiArIHNlcnZpY2VOYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVmZXJlbmNlW117bmV3IEVuZHBvaW50UmVmZXJlbmNlKGVuZHBvaW50UmVmZXJuY2UgKyAiLyIpfTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgiVW5hYmxlIHRvIGdlbmVyYXRlIEVQUiBmb3IgdGhlIHRyYW5zcG9ydCA6IGh0dHAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvL2lmIHRoZSBob3N0IGFkZHJlc3MgaXMgbm90IHByZXNlbnQKLSAgICAgICAgU3RyaW5nIGlwQWRkcmVzczsKLSAgICAgICAgaWYgKGlwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlwQWRkcmVzcyA9IGlwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZihsb2NhbEFkZHJlc3M9PW51bGwpewotICAgICAgICAgICAgICAgICAgICBsb2NhbEFkZHJlc3MgPSBVdGlscy5nZXRJcEFkZHJlc3MoY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsb2NhbEFkZHJlc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgIGlwQWRkcmVzcyA9ICIxMjcuMC4wLjEiOwotICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpcEFkZHJlc3MgPSBsb2NhbEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZW1iZWRkZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50UmVmZXJuY2UgPSAiaHR0cDovLyIgKyBpcEFkZHJlc3MgKyAiOiIgKyBlbWJlZGRlZC5nZXRQb3J0KCkgOwotICAgICAgICAgICAgaWYoY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkuc3RhcnRzV2l0aCgiLyIpKXsKLSAgICAgICAgICAgICAgICBlbmRwb2ludFJlZmVybmNlID0gIGVuZHBvaW50UmVmZXJuY2UgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkgKyAiLyIgKyBzZXJ2aWNlTmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnRSZWZlcm5jZSA9IGVuZHBvaW50UmVmZXJuY2UgKyAnLycgKwotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0U2VydmljZUNvbnRleHRQYXRoKCkgKyAiLyIgKyBzZXJ2aWNlTmFtZTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IEVuZHBvaW50UmVmZXJlbmNlW117bmV3IEVuZHBvaW50UmVmZXJlbmNlKGVuZHBvaW50UmVmZXJuY2UgKyAiLyIpfTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIlVuYWJsZSB0byBnZW5lcmF0ZSBFUFIgZm9yIHRoZSB0cmFuc3BvcnQgOiBodHRwIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIGh0dHBGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIEh0dHBGYWN0b3J5IGdldEh0dHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gaHR0cEZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGdldENvbmZpZ3VyYXRpb25Db250ZXh0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gY29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBDb25maWd1cmF0aW9uQ29udGV4dCBnZXRDb25maWd1cmF0aW9uQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJlcGx5VG9FUFIKLSAgICAgKiBJZiB0aGUgdXNlciBoYXMgZ2l2ZW4gaG9zdCBhZGRyZXNzIHBhcmFtdGVyIHRoZW4gaXQgZ2V0cyB0aGUgaGlnaCBwcmlvcml0eSBhbmQKLSAgICAgKiBFUlAgd2lsbCBiZSBjcmVhdGQgdXNpbmcgdGhhdAotICAgICAqIE46QiAtIGhvc3RBZGRyZXNzIHNob3VsZCBiZSBhIGNvbXBsdGUgdXJsIChodHRwOi8vd3d3Lm15QXBwLmNvbS93cykKLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZQotICAgICAqIEBwYXJhbSBpcAotICAgICAqIEByZXR1cm4gYW4gRW5kcG9pbnRSZWZlcmVuY2UKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydExpc3RlbmVyI2dldEVQUkZvclNlcnZpY2UoU3RyaW5nLFN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgRW5kcG9pbnRSZWZlcmVuY2UgZ2V0RVBSRm9yU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpcCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHJldHVybiBnZXRFUFJzRm9yU2VydmljZShzZXJ2aWNlTmFtZSwgaXApWzBdOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGlzIEhUVFAgc2VydmVyIGluc3RhbmNlIGlzIHJ1bm5pbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUvZmFsc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0gICAgICAgIGlmIChlbWJlZGRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW1iZWRkZWQuaXNSdW5uaW5nKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFNodXRkb3duVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICAgICAgcHJpdmF0ZSBTaW1wbGVIVFRQU2VydmVyIHNlcnZlciA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIFNodXRkb3duVGhyZWFkKFNpbXBsZUhUVFBTZXJ2ZXIgc2VydmVyKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltTaW1wbGVIVFRQU2VydmVyXSBTaHV0dGluZyBkb3duIik7Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbU2ltcGxlSFRUUFNlcnZlcl0gU2h1dGRvd24gY29tcGxldGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIFNlc3Npb25Db250ZXh0IGdldFNlc3Npb25Db250ZXh0KE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KSB7Ci0gICAgICAgIFN0cmluZyBzZXNzaW9uS2V5ID0gKFN0cmluZykgbWVzc2FnZUNvbnRleHQuZ2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbk1hbmFnZXIuZ2V0U2Vzc2lvbkNvbnRleHQoc2Vzc2lvbktleSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVHJhbnNwb3J0SGVhZGVycy5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvVHJhbnNwb3J0SGVhZGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjIwNzZlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL1RyYW5zcG9ydEhlYWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHA7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFBhc3MtVGhydSAvIGRlbGF5ZWQgZ2V0IGFuZCBwdXQgb2YgdGhlIHZhbHVlcyBmcm9tIEh0dHBTZXJ2bGV0UmVxdWVzdAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNwb3J0SGVhZGVycyBpbXBsZW1lbnRzIE1hcCB7Ci0gICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKLSAgICAvLyBUaGlzIG1hcCBjb250YWlucyB0aGUgaGVhZGVycyBmcm9tIHRoZSByZXF1ZXN0OyBpdCB3aWxsIGJlIGZpbGxlZCBpbiBsYXppbHkgaWYgbmVlZGVkLCAKLSAgICAvLyBmb3IgcGVyZm9ybWFuY2UgCi0gICAgSGFzaE1hcCBoZWFkZXJNYXAgPSBudWxsOwotICAgIC8vIFRoaXMgbWFwIGNvbnRhaW5zIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcHV0IG9udG8gdGhlIG1hcDsgaXQgaXMgbm90IHBvcHVsYXRlZCBieSB2YWx1ZXMKLSAgICAvLyBmcm9tIHRoZSBIdHRwU2VydmxldFJlcXVlc3QuICBBIG51bGwgdmFsdWUgbWVhbnMgdGhlIGhlYWRlck1hcCBoYXMgYmVlbiBmdWxseSBwb3B1bGF0ZWQgYW5kCi0gICAgLy8gYW55IHZhbHVlcyB0aGF0IHdlcmUgaW4gbG9jYWxIZWFkZXJNYXAgaGF2ZSBiZWVuIG1pZ3JhdGVkIHRvIGhlYWRlck1hcC4KLSAgICBIYXNoTWFwIGxvY2FsSGVhZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBUcmFuc3BvcnRIZWFkZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICAgICAgdGhpcy5yZXEgPSByZXE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGZ1bGx5IHBvcHVsYXRlIHRoZSBIYXNoTWFwIHdpdGggdGhlIHZhbHVlIGZyb20gdGhlIEh0dHBTZXJsdmV0UmVxdWVzdCBhbmQgbWlncmF0ZQotICAgICAqIGFueSB2YWx1ZXMgcHJldmlvdXNseSBwdXQgb250byBsb2NhbEhlYWRlck1hcCBpbnRvIHRoZSBuZXcgSGFzaE1hcC4KLSAgICAgKiAKLSAgICAgKiBOb3RlIHRoaXMgaXMgYSBiaXQgbm9uLXBlcmZvcm1hbnQsIHNvIGl0IGlzIG9ubHkgZG9uZSBpZiBuZWVkZWQuICAKLSAgICAgKiBJZi93aGVuIGl0IGlzIGRvbmUsIHRoZXJlIG1heSBiZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBiZWVuIHNldCBvbiB0aGUgbG9jYWxIZWFkZXJNYXAuICAKLSAgICAgKiBJZiBoZWFkZXJNYXAgbXVzdCBiZSBjcmVhdGVkIGR1ZSB0byBhIGNhbGwKLSAgICAgKiB0byBzaXplLCBvciBpc0VtcHR5LCBvciBzb21lIG90aGVyIG1ldGhvZCB3aGljaCByZXF1aXJlcyBhIGZ1bGx5IHBvcHVsYXRlZCBtYXAsIHRoZW4gYW55IAotICAgICAqIHByZXZpb3VzbHkgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSBsb2NhbEhlYWRlck1hcCBhcmUgbWlncmF0ZWQgdG8gdGhlIG5ldyBoYXNobWFwLiAgCi0gICAgICogQWZ0ZXIgdGhhdCBsb2NhbEhlYWRlck1hcCBpcyByZWxlYXNlZCBhbmQgb25seSBoZWFkZXJNYXAgaXMgdXNlZCBhZnRlciB0aGF0LiAKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgaGVhZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgRW51bWVyYXRpb24gaGVhZGVyTmFtZXMgPSByZXEuZ2V0SGVhZGVyTmFtZXMoKTsKLQotICAgICAgICB3aGlsZSAoaGVhZGVyTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBoZWFkZXJOYW1lcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVxLmdldEhlYWRlcihrZXkpOwotCi0gICAgICAgICAgICBoZWFkZXJNYXAucHV0KGtleSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBNaWdyYXRlIGFueSBwcmV2aW91c2x5IHNldCBsb2NhbCBwcm9wZXJ0aWVzIHRvIHRoZSBuZXdseSBjcmVhdGVkIGhhc2htYXAgdGhlbiByZWxlYXNlCi0gICAgICAgIC8vIHRoZSBsb2NhbCBoYXNobWFwCi0gICAgICAgIFNldCBsb2NhbEhlYWRlclNldCA9IGxvY2FsSGVhZGVyTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGxvY2FsSGVhZGVySXRlcmF0b3IgPSBsb2NhbEhlYWRlclNldC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAobG9jYWxIZWFkZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIE1hcC5FbnRyeSBsb2NhbEhlYWRlckVudHJ5ID0gKE1hcC5FbnRyeSkgbG9jYWxIZWFkZXJJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBoZWFkZXJNYXAucHV0KGxvY2FsSGVhZGVyRW50cnkuZ2V0S2V5KCksIGxvY2FsSGVhZGVyRW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9jYWxIZWFkZXJNYXAgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC5zaXplKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgaGVhZGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvY2FsSGVhZGVyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2FsSGVhZGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlYWRlck1hcC52YWx1ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHQpIHsKLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaGVhZGVyTWFwLnB1dEFsbCh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLmVudHJ5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldCBrZXlTZXQoKSB7Ci0gICAgICAgIGlmIChoZWFkZXJNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGxvY2FsIG1hcCwgbG9vayB0aGVyZSBmaXJzdC4KLSAgICAgICAgaWYgKGxvY2FsSGVhZGVyTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGxvY2FsSGVhZGVyTWFwLmdldChrZXkpOwotICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlck1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVxLmdldEhlYWRlcigoU3RyaW5nKSBrZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWFkZXJNYXAuZ2V0KGtleSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAobG9jYWxIZWFkZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGxvY2FsSGVhZGVyTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVhZGVyTWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBDb25uZWN0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBDb25uZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NmQxODMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEluZXRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXNIdHRwQ29ubmVjdGlvbiBleHRlbmRzIEh0dHBDb25uZWN0aW9uLCBIdHRwSW5ldENvbm5lY3Rpb24gewotCi0gICAgSHR0cFJlcXVlc3QgcmVjZWl2ZVJlcXVlc3QoKQotICAgICAgICB0aHJvd3MgSHR0cEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0gICAgCi0gICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAKLSAgICB2b2lkIHNlbmRSZXNwb25zZShIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIAotICAgICAgICB0aHJvd3MgSHR0cEV4Y2VwdGlvbiwgSU9FeGNlcHRpb247ICAgIAotICAgIAotICAgIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAKLSAgICB2b2lkIGZsdXNoKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIAotICAgIHZvaWQgcmVzZXQoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cENvbm5lY3Rpb25JbXBsLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBDb25uZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MThkMWMyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cENvbm5lY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cENvbm5lY3Rpb25NZXRyaWNzOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRMZW5ndGhTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0SHR0cFJlcXVlc3RGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmVudGl0eS5TdHJpY3RDb250ZW50TGVuZ3RoU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQ2h1bmtlZElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkNodW5rZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uQ29udGVudExlbmd0aElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLkNvbnRlbnRMZW5ndGhPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSHR0cFJlcXVlc3RQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSHR0cFJlc3BvbnNlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmlvLklkZW50aXR5SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uSWRlbnRpdHlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uU29ja2V0SW5wdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuaW8uU29ja2V0T3V0cHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pby5IdHRwTWVzc2FnZVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW8uSHR0cE1lc3NhZ2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmlvLlNlc3Npb25JbnB1dEJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW8uU2Vzc2lvbk91dHB1dEJ1ZmZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBDb25uZWN0aW9uUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQXhpc0h0dHBDb25uZWN0aW9uSW1wbCBpbXBsZW1lbnRzIEF4aXNIdHRwQ29ubmVjdGlvbiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgSEVBREVSTE9HID0KLSAgICAgICAgTG9nRmFjdG9yeS5nZXRMb2coIm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyLndpcmUiKTsKLQotICAgIHByaXZhdGUgZmluYWwgU29ja2V0IHNvY2tldDsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25PdXRwdXRCdWZmZXIgb3V0YnVmZmVyOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbklucHV0QnVmZmVyIGluYnVmZmVyOwotICAgIHByaXZhdGUgZmluYWwgSHR0cE1lc3NhZ2VQYXJzZXIgcmVxdWVzdFBhcnNlcjsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBNZXNzYWdlV3JpdGVyIHJlc3BvbnNlV3JpdGVyOwotICAgIHByaXZhdGUgZmluYWwgQ29udGVudExlbmd0aFN0cmF0ZWd5IGNvbnRlbnRMZW5TdHJhdGVneTsKLQotICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIEF4aXNIdHRwQ29ubmVjdGlvbkltcGwoZmluYWwgU29ja2V0IHNvY2tldCwgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMpIAotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTb2NrZXQgbWF5IG5vdCBiZSBudWxsIik7IAotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBwYXJhbWV0ZXJzIG1heSBub3QgYmUgbnVsbCIpOyAKLSAgICAgICAgfQotICAgICAgICBzb2NrZXQuc2V0VGNwTm9EZWxheShIdHRwQ29ubmVjdGlvblBhcmFtcy5nZXRUY3BOb0RlbGF5KHBhcmFtcykpOwotICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KEh0dHBDb25uZWN0aW9uUGFyYW1zLmdldFNvVGltZW91dChwYXJhbXMpKTsKLSAgICAgICAgCi0gICAgICAgIGludCBsaW5nZXIgPSBIdHRwQ29ubmVjdGlvblBhcmFtcy5nZXRMaW5nZXIocGFyYW1zKTsKLSAgICAgICAgaWYgKGxpbmdlciA+PSAwKSB7Ci0gICAgICAgICAgICBzb2NrZXQuc2V0U29MaW5nZXIobGluZ2VyID4gMCwgbGluZ2VyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGJ1ZmZlcnNpemUgPSBIdHRwQ29ubmVjdGlvblBhcmFtcy5nZXRTb2NrZXRCdWZmZXJTaXplKHBhcmFtcyk7Ci0gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0OwotICAgICAgICB0aGlzLm91dGJ1ZmZlciA9IG5ldyBTb2NrZXRPdXRwdXRCdWZmZXIoc29ja2V0LCBidWZmZXJzaXplLCBwYXJhbXMpOyAKLSAgICAgICAgdGhpcy5pbmJ1ZmZlciA9IG5ldyBTb2NrZXRJbnB1dEJ1ZmZlcihzb2NrZXQsIGJ1ZmZlcnNpemUsIHBhcmFtcyk7IAotICAgICAgICB0aGlzLmNvbnRlbnRMZW5TdHJhdGVneSA9IG5ldyBTdHJpY3RDb250ZW50TGVuZ3RoU3RyYXRlZ3koKTsKLSAgICAgICAgdGhpcy5yZXF1ZXN0UGFyc2VyID0gbmV3IEh0dHBSZXF1ZXN0UGFyc2VyKAotICAgICAgICAgICAgICAgIHRoaXMuaW5idWZmZXIsIG51bGwsIG5ldyBEZWZhdWx0SHR0cFJlcXVlc3RGYWN0b3J5KCksIHBhcmFtcyk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2VXcml0ZXIgPSBuZXcgSHR0cFJlc3BvbnNlV3JpdGVyKAotICAgICAgICAgICAgICAgIHRoaXMub3V0YnVmZmVyLCBudWxsLCBwYXJhbXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5vdXRidWZmZXIuZmx1c2goKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuc29ja2V0LnNodXRkb3duT3V0cHV0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnNvY2tldC5zaHV0ZG93bklucHV0KCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlnbm9yZSkgewotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgewotICAgICAgICByZXR1cm4gIXRoaXMuc29ja2V0LmlzQ2xvc2VkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuaW5idWZmZXIuaXNEYXRhQXZhaWxhYmxlKDEpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFNvY2tldCB0bXBzb2NrZXQgPSB0aGlzLnNvY2tldDsKLSAgICAgICAgaWYgKHRtcHNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0bXBzb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBIdHRwUmVxdWVzdCByZWNlaXZlUmVxdWVzdCgpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEh0dHBSZXF1ZXN0IHJlcXVlc3QgPSAoSHR0cFJlcXVlc3QpIHRoaXMucmVxdWVzdFBhcnNlci5wYXJzZSgpOwotICAgICAgICBpZiAoSEVBREVSTE9HLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIEhFQURFUkxPRy5kZWJ1ZygiPj4gIiArIHJlcXVlc3QuZ2V0UmVxdWVzdExpbmUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGZvciAoSGVhZGVySXRlcmF0b3IgaXQgPSByZXF1ZXN0LmhlYWRlckl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgSEVBREVSTE9HLmRlYnVnKCI+PiAiICsgaXQubmV4dEhlYWRlcigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBQcmVwYXJlIGlucHV0IHN0cmVhbQotICAgICAgICB0aGlzLmluID0gbnVsbDsKLSAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBIdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkgewotICAgICAgICAgICAgbG9uZyBsZW4gPSB0aGlzLmNvbnRlbnRMZW5TdHJhdGVneS5kZXRlcm1pbmVMZW5ndGgocmVxdWVzdCk7Ci0gICAgICAgICAgICBpZiAobGVuID09IENvbnRlbnRMZW5ndGhTdHJhdGVneS5DSFVOS0VEKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pbiA9IG5ldyBDaHVua2VkSW5wdXRTdHJlYW0odGhpcy5pbmJ1ZmZlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSBDb250ZW50TGVuZ3RoU3RyYXRlZ3kuSURFTlRJVFkpIHsKLSAgICAgICAgICAgICAgICB0aGlzLmluID0gbmV3IElkZW50aXR5SW5wdXRTdHJlYW0odGhpcy5pbmJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGlzLmluID0gbmV3IENvbnRlbnRMZW5ndGhJbnB1dFN0cmVhbShpbmJ1ZmZlciwgbGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZSkgCi0gICAgICAgICAgICB0aHJvd3MgSHR0cEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCByZXNwb25zZSBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChIRUFERVJMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgSEVBREVSTE9HLmRlYnVnKCI8PCAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgZm9yIChIZWFkZXJJdGVyYXRvciBpdCA9IHJlc3BvbnNlLmhlYWRlckl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgSEVBREVSTE9HLmRlYnVnKCI8PCAiICsgaXQubmV4dEhlYWRlcigpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0aGlzLnJlc3BvbnNlV3JpdGVyLndyaXRlKHJlc3BvbnNlKTsKLQotICAgICAgICAvLyBQcmVwYXJlIG91dHB1dCBzdHJlYW0KLSAgICAgICAgdGhpcy5vdXQgPSBudWxsOwotICAgICAgICBQcm90b2NvbFZlcnNpb24gdmVyID0gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFByb3RvY29sVmVyc2lvbigpOwotICAgICAgICBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOwotICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgbGVuID0gZW50aXR5LmdldENvbnRlbnRMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChlbnRpdHkuaXNDaHVua2VkKCkgJiYgdmVyLmdyZWF0ZXJFcXVhbHMoSHR0cFZlcnNpb24uSFRUUF8xXzEpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5vdXQgPSBuZXcgQ2h1bmtlZE91dHB1dFN0cmVhbSh0aGlzLm91dGJ1ZmZlcik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5vdXQgPSBuZXcgQ29udGVudExlbmd0aE91dHB1dFN0cmVhbSh0aGlzLm91dGJ1ZmZlciwgbGVuKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5vdXQgPSBuZXcgSWRlbnRpdHlPdXRwdXRTdHJlYW0odGhpcy5vdXRidWZmZXIpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMub3V0YnVmZmVyLmZsdXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgewotICAgICAgICByZXR1cm4gdGhpcy5pbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMub3V0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLm91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm91dC5mbHVzaCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5vdXRidWZmZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRoaXMuaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5pbi5jbG9zZSgpOwotICAgICAgICAgICAgdGhpcy5pbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRoaXMub3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMub3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICB0aGlzLm91dC5jbG9zZSgpOwotICAgICAgICAgICAgdGhpcy5vdXQgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0U29ja2V0VGltZW91dCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5nZXRTb1RpbWVvdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb2NrZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLnNvY2tldC5zZXRTb1RpbWVvdXQodGltZW91dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBleCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEluZXRBZGRyZXNzIGdldExvY2FsQWRkcmVzcygpIHsKLSAgICAgICAgaWYgKHRoaXMuc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5nZXRMb2NhbEFkZHJlc3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7Ci0gICAgICAgIGlmICh0aGlzLnNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXQuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0UmVtb3RlQWRkcmVzcygpIHsKLSAgICAgICAgaWYgKHRoaXMuc29ja2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldC5nZXRJbmV0QWRkcmVzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7Ci0gICAgICAgIGlmICh0aGlzLnNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXQuZ2V0UG9ydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEh0dHBDb25uZWN0aW9uTWV0cmljcyBnZXRNZXRyaWNzKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7Ci0gICAgICAgIGlmIChpc09wZW4oKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0aGlzLnNvY2tldC5nZXRJbmV0QWRkcmVzcygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoImNsb3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoIl0iKTsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVxdWVzdC5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTU2Mzk5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgaW50ZXJmYWNlIEF4aXNIdHRwUmVxdWVzdCBleHRlbmRzIEh0dHBNZXNzYWdlIHsKLQotICAgIFN0cmluZyBnZXRNZXRob2QoKTsKLSAgICAKLSAgICBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpOwotICAgIAotICAgIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotICAgIAotICAgIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXF1ZXN0SW1wbC5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVxdWVzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJlMjYzOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXF1ZXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkV4ZWN1dGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkhUVFA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQXhpc0h0dHBSZXF1ZXN0SW1wbCBpbXBsZW1lbnRzIEF4aXNIdHRwUmVxdWVzdCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEh0dHBSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBeGlzSHR0cENvbm5lY3Rpb24gY29ubjsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBQcm9jZXNzb3IgaHR0cHByb2M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwQ29udGV4dCBjb250ZXh0OwotICAgIAotICAgIHB1YmxpYyBBeGlzSHR0cFJlcXVlc3RJbXBsKAotICAgICAgICAgICAgZmluYWwgQXhpc0h0dHBDb25uZWN0aW9uIGNvbm4sCi0gICAgICAgICAgICBmaW5hbCBIdHRwUmVxdWVzdCByZXF1ZXN0LCAKLSAgICAgICAgICAgIGZpbmFsIEh0dHBQcm9jZXNzb3IgaHR0cHByb2MsCi0gICAgICAgICAgICBmaW5hbCBIdHRwQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIGlmIChjb25uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgY29ubmVjdGlvbiBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHJlcXVlc3QgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh0dHBwcm9jID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcHJvY2Vzc29yIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgY29udGV4dCBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICB0aGlzLmNvbm4gPSBjb25uOwotICAgICAgICB0aGlzLmh0dHBwcm9jID0gaHR0cHByb2M7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEh0dHBFeGNlcHRpb24gewotICAgICAgICB0aGlzLmNvbnRleHQuc2V0QXR0cmlidXRlKEV4ZWN1dGlvbkNvbnRleHQuSFRUUF9DT05ORUNUSU9OLCB0aGlzLmNvbm4pOwotICAgICAgICB0aGlzLmNvbnRleHQuc2V0QXR0cmlidXRlKEV4ZWN1dGlvbkNvbnRleHQuSFRUUF9SRVFVRVNULCB0aGlzLnJlcXVlc3QpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5odHRwcHJvYy5wcm9jZXNzKHRoaXMucmVxdWVzdCwgdGhpcy5jb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRSZXF1ZXN0TGluZSgpLmdldE1ldGhvZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFVSSSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRSZXF1ZXN0TGluZSgpLmdldFVyaSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBQcm90b2NvbFZlcnNpb24gZ2V0UHJvdG9jb2xWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCkuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLSAgICAgICAgSGVhZGVyIGhlYWRlciA9IHRoaXMucmVxdWVzdC5nZXRGaXJzdEhlYWRlcihIVFRQLkNPTlRFTlRfVFlQRSk7Ci0gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGhlYWRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoZmluYWwgSGVhZGVyIGhlYWRlcikgewotICAgICAgICB0aGlzLnJlcXVlc3QuYWRkSGVhZGVyKGhlYWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0LmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5jb250YWluc0hlYWRlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVyW10gZ2V0QWxsSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRBbGxIZWFkZXJzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlciBnZXRGaXJzdEhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldEZpcnN0SGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXJbXSBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QuZ2V0SGVhZGVycyhuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVyIGdldExhc3RIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5nZXRMYXN0SGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXJJdGVyYXRvciBoZWFkZXJJdGVyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC5oZWFkZXJJdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXJJdGVyYXRvciBoZWFkZXJJdGVyYXRvcihmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmhlYWRlckl0ZXJhdG9yKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhlYWRlcihmaW5hbCBIZWFkZXIgaGVhZGVyKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdC5yZW1vdmVIZWFkZXIoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJzKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdC5yZW1vdmVIZWFkZXJzKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihmaW5hbCBIZWFkZXIgaGVhZGVyKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdC5zZXRIZWFkZXIoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnJlcXVlc3Quc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJzKEhlYWRlcltdIGhlYWRlcnMpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0LnNldEhlYWRlcnMoaGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIEh0dHBQYXJhbXMgZ2V0UGFyYW1zKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0LmdldFBhcmFtcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtcyhmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcykgewotICAgICAgICB0aGlzLnJlcXVlc3Quc2V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVzcG9uc2UuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2IwYjAuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cE1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGludGVyZmFjZSBBeGlzSHR0cFJlc3BvbnNlIGV4dGVuZHMgSHR0cE1lc3NhZ2UgewotCi0gICAgdm9pZCBzZXRTdGF0dXMoaW50IHNjKTsKLQotICAgIHZvaWQgc2VuZEVycm9yKGludCBzYywgU3RyaW5nIG1zZyk7Ci0gICAgCi0gICAgdm9pZCBzZW5kRXJyb3IoaW50IHNjKTsKLQotICAgIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKTsKLSAgICAKLSAgICBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBSZXNwb25zZUltcGwuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlc3BvbnNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjYzMTQ1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9BeGlzSHR0cFJlc3BvbnNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5PdXRUcmFuc3BvcnRJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlckl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJhc2ljSHR0cEVudGl0eTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkV4ZWN1dGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwUHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEF4aXNIdHRwUmVzcG9uc2VJbXBsIGltcGxlbWVudHMgQXhpc0h0dHBSZXNwb25zZSwgT3V0VHJhbnNwb3J0SW5mbyB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZTsKLSAgICBwcml2YXRlIGZpbmFsIEF4aXNIdHRwQ29ubmVjdGlvbiBjb25uOwotICAgIHByaXZhdGUgZmluYWwgSHR0cFByb2Nlc3NvciBodHRwcHJvYzsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQ7Ci0gICAgCi0gICAgcHJpdmF0ZSBBdXRvQ29tbWl0T3V0cHV0U3RyZWFtIG91dHN0cmVhbTsKLSAgICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZTsKLSAgICAKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY29tbWl0ZWQ7Ci0gICAgCi0gICAgcHVibGljIEF4aXNIdHRwUmVzcG9uc2VJbXBsKAotICAgICAgICAgICAgZmluYWwgQXhpc0h0dHBDb25uZWN0aW9uIGNvbm4sCi0gICAgICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcG9uc2UsIAotICAgICAgICAgICAgZmluYWwgSHR0cFByb2Nlc3NvciBodHRwcHJvYywKLSAgICAgICAgICAgIGZpbmFsIEh0dHBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcmVzcG9uc2UgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBjb25uZWN0aW9uIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChodHRwcHJvYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHByb2Nlc3NvciBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIGNvbnRleHQgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOwotICAgICAgICB0aGlzLmNvbm4gPSBjb25uOwotICAgICAgICB0aGlzLmh0dHBwcm9jID0gaHR0cHByb2M7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vdENvbW1pdHRlZCgpIHsKLSAgICAgICAgaWYgKHRoaXMuY29tbWl0ZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlc3BvbnNlIGFscmVhZHkgY29tbWl0dGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmNvbW1pdGVkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEh0dHBFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5jb21taXRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY29tbWl0ZWQgPSB0cnVlOwotICAgICAgICAKLSAgICAgICAgdGhpcy5jb250ZXh0LnNldEF0dHJpYnV0ZShFeGVjdXRpb25Db250ZXh0LkhUVFBfQ09OTkVDVElPTiwgdGhpcy5jb25uKTsKLSAgICAgICAgdGhpcy5jb250ZXh0LnNldEF0dHJpYnV0ZShFeGVjdXRpb25Db250ZXh0LkhUVFBfUkVTUE9OU0UsIHRoaXMucmVzcG9uc2UpOwotICAgICAgICAKLSAgICAgICAgQmFzaWNIdHRwRW50aXR5IGVudGl0eSA9IG5ldyBCYXNpY0h0dHBFbnRpdHkoKTsKLSAgICAgICAgZW50aXR5LnNldENodW5rZWQodHJ1ZSk7Ci0gICAgICAgIGVudGl0eS5zZXRDb250ZW50VHlwZSh0aGlzLmNvbnRlbnRUeXBlKTsKLSAgICAgICAgCi0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0RW50aXR5KGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmh0dHBwcm9jLnByb2Nlc3ModGhpcy5yZXNwb25zZSwgdGhpcy5jb250ZXh0KTsKLSAgICAgICAgdGhpcy5jb25uLnNlbmRSZXNwb25zZSh0aGlzLnJlc3BvbnNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7Ci0gICAgICAgIGlmICh0aGlzLm91dHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLm91dHN0cmVhbSA9IG5ldyBBdXRvQ29tbWl0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMub3V0c3RyZWFtOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgc2MsIGZpbmFsIFN0cmluZyBtc2cpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIFByb3RvY29sVmVyc2lvbiB2ZXIgPSB0aGlzLnJlc3BvbnNlLmdldFByb3RvY29sVmVyc2lvbigpOwotICAgICAgICB0aGlzLnJlc3BvbnNlLnNldFN0YXR1c0xpbmUodmVyLCBzYywgbXNnKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB7Ci0gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZCgpOwotICAgICAgICB0aGlzLnJlc3BvbnNlLnNldFN0YXR1c0NvZGUoc2MpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShzYyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZCgpOwotICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmdldFByb3RvY29sVmVyc2lvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihmaW5hbCBIZWFkZXIgaGVhZGVyKSB7Ci0gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZCgpOwotICAgICAgICB0aGlzLnJlc3BvbnNlLmFkZEhlYWRlcihoZWFkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZCgpOwotICAgICAgICB0aGlzLnJlc3BvbnNlLmFkZEhlYWRlcihuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2UuY29udGFpbnNIZWFkZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlcltdIGdldEFsbEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmdldEFsbEhlYWRlcnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSGVhZGVyIGdldEZpcnN0SGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmdldEZpcnN0SGVhZGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXJbXSBnZXRIZWFkZXJzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmdldEhlYWRlcnMobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlciBnZXRMYXN0SGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmdldExhc3RIZWFkZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEhlYWRlckl0ZXJhdG9yIGhlYWRlckl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5oZWFkZXJJdGVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBIZWFkZXJJdGVyYXRvciBoZWFkZXJJdGVyYXRvcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25zZS5oZWFkZXJJdGVyYXRvcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXIoZmluYWwgSGVhZGVyIGhlYWRlcikgewotICAgICAgICBhc3NlcnROb3RDb21taXR0ZWQoKTsKLSAgICAgICAgdGhpcy5yZXNwb25zZS5yZW1vdmVIZWFkZXIoaGVhZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVIZWFkZXJzKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZCgpOwotICAgICAgICB0aGlzLnJlc3BvbnNlLnJlbW92ZUhlYWRlcnMobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKGZpbmFsIEhlYWRlciBoZWFkZXIpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0SGVhZGVyKGhlYWRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJzKEhlYWRlcltdIGhlYWRlcnMpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkKCk7Ci0gICAgICAgIHRoaXMucmVzcG9uc2Uuc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSHR0cFBhcmFtcyBnZXRQYXJhbXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLmdldFBhcmFtcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtcyhmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcykgewotICAgICAgICB0aGlzLnJlc3BvbnNlLnNldFBhcmFtcyhwYXJhbXMpOwotICAgIH0KLSAgICAKLSAgICBjbGFzcyBBdXRvQ29tbWl0T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLQotICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgQXV0b0NvbW1pdE91dHB1dFN0cmVhbSgpIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ29tbWl0dGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29tbWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChIdHRwRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZXgpOyAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5vdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRoaXMub3V0ID0gY29ubi5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZW5zdXJlQ29tbWl0dGVkKCk7Ci0gICAgICAgICAgICB0aGlzLm91dC5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBlbnN1cmVDb21taXR0ZWQoKTsKLSAgICAgICAgICAgIHRoaXMub3V0LndyaXRlKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZW5zdXJlQ29tbWl0dGVkKCk7Ci0gICAgICAgICAgICB0aGlzLm91dC53cml0ZShiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZW5zdXJlQ29tbWl0dGVkKCk7Ci0gICAgICAgICAgICB0aGlzLm91dC53cml0ZShiKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgZW5zdXJlQ29tbWl0dGVkKCk7Ci0gICAgICAgICAgICB0aGlzLm91dC5mbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBTZXJ2aWNlLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc0h0dHBTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZWVkMDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNIdHRwU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUDExQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQMTJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkFkZHJlc3NpbmdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5hZGRyZXNzaW5nLkVuZHBvaW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRJbkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0T3V0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0VuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5SZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkNvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHlFbmNsb3NpbmdSZXF1ZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuTWV0aG9kTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Qcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5SZXF1ZXN0TGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuVW5zdXBwb3J0ZWRIdHRwVmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucGFyYW1zLkRlZmF1bHRlZEh0dHBQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cFByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGRlZmF1bHQgSFRUUCBzZXJ2aWNlIHJlc3BvbnNpYmxlIGZvcgotICogbWFpbnRhaW5pbmcgYW5kIHBvcHVsYXRpbmcgdGhlIHtAbGluayBNZXNzYWdlQ29udGV4dH0gZm9yIGluY29taW5nIEF4aXMKLSAqIHJlcXVlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQXhpc0h0dHBTZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhBeGlzSHR0cFNlcnZpY2UuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwUHJvY2Vzc29yIGh0dHBQcm9jZXNzb3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uUmV1c2VTdHJhdGVneSBjb25uU3RyYXRlZ3k7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwUmVzcG9uc2VGYWN0b3J5IHJlc3BvbnNlRmFjdG9yeTsKLSAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgV29ya2VyIHdvcmtlcjsKLQotICAgIHByaXZhdGUgSHR0cFBhcmFtcyBwYXJhbXM7Ci0KLSAgICBwdWJsaWMgQXhpc0h0dHBTZXJ2aWNlKAotICAgICAgICAgICAgZmluYWwgSHR0cFByb2Nlc3NvciBodHRwUHJvY2Vzc29yLAotICAgICAgICAgICAgZmluYWwgQ29ubmVjdGlvblJldXNlU3RyYXRlZ3kgY29ublN0cmF0ZWd5LAotICAgICAgICAgICAgZmluYWwgSHR0cFJlc3BvbnNlRmFjdG9yeSByZXNwb25zZUZhY3RvcnksCi0gICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwKLSAgICAgICAgICAgIGZpbmFsIFdvcmtlciB3b3JrZXIpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKGh0dHBQcm9jZXNzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBwcm9jZXNzb3IgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm5TdHJhdGVneSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25uZWN0aW9uIHN0cmF0ZWd5IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZUZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVzcG9uc2UgZmFjdG9yeSBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod29ya2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldvcmtlciBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29uZmlndXJhdGlvbkNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29uZmlndXJhdGlvbiBjb250ZXh0IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuaHR0cFByb2Nlc3NvciA9IGh0dHBQcm9jZXNzb3I7Ci0gICAgICAgIHRoaXMuY29ublN0cmF0ZWd5ID0gY29ublN0cmF0ZWd5OwotICAgICAgICB0aGlzLnJlc3BvbnNlRmFjdG9yeSA9IHJlc3BvbnNlRmFjdG9yeTsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjsKLQotICAgIH0KLQotICAgIHB1YmxpYyBIdHRwUGFyYW1zIGdldFBhcmFtcygpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtcyhmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcykgewotICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVSZXF1ZXN0KGZpbmFsIEF4aXNIdHRwQ29ubmVjdGlvbiBjb25uLCBmaW5hbCBIdHRwQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBIdHRwRXhjZXB0aW9uIHsKLQotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0ID0gY29uZmlndXJhdGlvbkNvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgbXNnQ29udGV4dC5zZXRJbmNvbWluZ1RyYW5zcG9ydE5hbWUoQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLQotICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlJFTU9URV9BRERSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmdldFJlbW90ZUFkZHJlc3MoKS5nZXRIb3N0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0FERFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uZ2V0TG9jYWxBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSk7Ci0KLSAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVtb3RlIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5nZXRSZW1vdGVBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBIdHRwUmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0ID0gY29ubi5yZWNlaXZlUmVxdWVzdCgpOwotICAgICAgICAgICAgUmVxdWVzdExpbmUgcmVxdWVzdExpbmUgPSByZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCk7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdExpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5IVFRQX01FVEhPRCwgcmVxdWVzdExpbmUuZ2V0TWV0aG9kKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVxdWVzdC5zZXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRlZEh0dHBQYXJhbXMocmVxdWVzdC5nZXRQYXJhbXMoKSwgdGhpcy5wYXJhbXMpKTsKLSAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbiB2ZXIgPSByZXF1ZXN0LmdldFJlcXVlc3RMaW5lKCkuZ2V0UHJvdG9jb2xWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoIXZlci5sZXNzRXF1YWxzKEh0dHBWZXJzaW9uLkhUVFBfMV8xKSkgewotICAgICAgICAgICAgICAgIC8vIERvd25ncmFkZSBwcm90b2NvbCB2ZXJzaW9uIGlmIGdyZWF0ZXIgdGhhbiBIVFRQLzEuMSAKLSAgICAgICAgICAgICAgICB2ZXIgPSBIdHRwVmVyc2lvbi5IVFRQXzFfMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlRmFjdG9yeS5uZXdIdHRwUmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgKHZlciwgSHR0cFN0YXR1cy5TQ19PSywgY29udGV4dCk7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgbmV3IERlZmF1bHRlZEh0dHBQYXJhbXMocmVzcG9uc2UuZ2V0UGFyYW1zKCksIHRoaXMucGFyYW1zKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoKChIdHRwRW50aXR5RW5jbG9zaW5nUmVxdWVzdCkgcmVxdWVzdCkuZXhwZWN0Q29udGludWUoKSkgewotICAgICAgICAgICAgICAgICAgICBIdHRwUmVzcG9uc2UgYWNrID0gdGhpcy5yZXNwb25zZUZhY3RvcnkubmV3SHR0cFJlc3BvbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlciwgSHR0cFN0YXR1cy5TQ19DT05USU5VRSwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGFjay5zZXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdGVkSHR0cFBhcmFtcyhhY2suZ2V0UGFyYW1zKCksIHRoaXMucGFyYW1zKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4uc2VuZFJlc3BvbnNlKGFjayk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm4uZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBBeGlzIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG9iamVjdHMKLSAgICAgICAgICAgIEF4aXNIdHRwUmVxdWVzdEltcGwgYXhpc3JlcSA9IG5ldyBBeGlzSHR0cFJlcXVlc3RJbXBsKAotICAgICAgICAgICAgICAgICAgICBjb25uLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICB0aGlzLmh0dHBQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICAgICAgQXhpc0h0dHBSZXNwb25zZUltcGwgYXhpc3JlcyA9IG5ldyBBeGlzSHR0cFJlc3BvbnNlSW1wbCgKLSAgICAgICAgICAgICAgICAgICAgY29ubiwKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuaHR0cFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIFByZXBhcmUgSFRUUCByZXF1ZXN0Ci0gICAgICAgICAgICBheGlzcmVxLnByZXBhcmUoKTsKLQotICAgICAgICAgICAgLy8gUnVuIHRoZSBzZXJ2aWNlCi0gICAgICAgICAgICBkb1NlcnZpY2UoYXhpc3JlcSwgYXhpc3JlcywgY29udGV4dCwgbXNnQ29udGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBjb250ZW50IGlzIGZ1bGx5IGNvbnN1bWVkCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGlmIChpbnN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29tbWl0IHJlc3BvbnNlIGlmIG5vdCBjb21taXR0ZWQKLSAgICAgICAgICAgIGlmICghYXhpc3Jlcy5pc0NvbW1pdHRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgYXhpc3Jlcy5jb21taXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXNwb25zZSBjb250ZW50IGlzIHByb3Blcmx5IHRlcm1pbmF0ZWQKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRzdHJlYW0gPSBjb25uLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKG91dHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0c3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoSHR0cEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlRmFjdG9yeS5uZXdIdHRwUmVzcG9uc2UKLSAgICAgICAgICAgICAgICAgICAgKEh0dHBWZXJzaW9uLkhUVFBfMV8wLCBIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UGFyYW1zKAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0ZWRIdHRwUGFyYW1zKHJlc3BvbnNlLmdldFBhcmFtcygpLCB0aGlzLnBhcmFtcykpOwotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4LCByZXNwb25zZSk7Ci0gICAgICAgICAgICB0aGlzLmh0dHBQcm9jZXNzb3IucHJvY2VzcyhyZXNwb25zZSwgY29udGV4dCk7Ci0gICAgICAgICAgICBjb25uLnNlbmRSZXNwb25zZShyZXNwb25zZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25uLmZsdXNoKCk7Ci0gICAgICAgIGlmICghdGhpcy5jb25uU3RyYXRlZ3kua2VlcEFsaXZlKHJlc3BvbnNlLCBjb250ZXh0KSkgewotICAgICAgICAgICAgY29ubi5jbG9zZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29ubi5yZXNldCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKGZpbmFsIEh0dHBFeGNlcHRpb24gZXgsIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZSkgewotICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBNZXRob2ROb3RTdXBwb3J0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1c0NvZGUoSHR0cFN0YXR1cy5TQ19OT1RfSU1QTEVNRU5URUQpOwotICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRIdHRwVmVyc2lvbkV4Y2VwdGlvbikgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShIdHRwU3RhdHVzLlNDX0hUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfQkFEX1JFUVVFU1QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzQ29kZShIdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NlcnZpY2UoCi0gICAgICAgICAgICBmaW5hbCBBeGlzSHR0cFJlcXVlc3QgcmVxdWVzdCwKLSAgICAgICAgICAgIGZpbmFsIEF4aXNIdHRwUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgICAgICBmaW5hbCBIdHRwQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgZmluYWwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlJlcXVlc3QgbWV0aG9kOiAiICsgcmVxdWVzdC5nZXRNZXRob2QoKSk7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIlRhcmdldCBVUkk6ICIgKyByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgVHJhbnNwb3J0T3V0RGVzY3JpcHRpb24gdHJhbnNwb3J0T3V0ID0gdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRUcmFuc3BvcnRPdXQoQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gdHJhbnNwb3J0SW4gPSB0aGlzLmNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFRyYW5zcG9ydEluKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uS2V5ID0gKFN0cmluZykgY29udGV4dC5nZXRBdHRyaWJ1dGUoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0VHJhbnNwb3J0SW4odHJhbnNwb3J0SW4pOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRUcmFuc3BvcnRPdXQodHJhbnNwb3J0T3V0KTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0U2VydmVyU2lkZSh0cnVlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HLCBzZXNzaW9uS2V5KTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uVFJBTlNQT1JUX0lOX1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOwotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHRyYW5zcG9ydCBIZWFkZXJzCi0gICAgICAgICAgICBIYXNoTWFwIGhlYWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcmVxdWVzdC5oZWFkZXJJdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgSGVhZGVyIGhlYWRlciA9IChIZWFkZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJNYXAucHV0KGhlYWRlci5nZXROYW1lKCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX0hFQURFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlck1hcCk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5Db25maWd1cmF0aW9uLkNPTlRFTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb250ZW50VHlwZSgpKTsKLQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KENvbnN0YW50cy5PVVRfVFJBTlNQT1JUX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0VG8obmV3IEVuZHBvaW50UmVmZXJlbmNlKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKSk7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldFByb3BlcnR5KFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydC5UUkFOU1BPUlRfQ09OVFJPTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUhUVFBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnQoKSk7Ci0KLQotICAgICAgICAgICAgdGhpcy53b3JrZXIuc2VydmljZShyZXF1ZXN0LCByZXNwb25zZSwgbXNnQ29udGV4dCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gU29ja2V0IGlzIHVucmVsaWFibGUuIAotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2ggKEh0dHBFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIEhUVFAgcHJvdG9jb2wgdmlvbGF0aW9uLiBUcmFuc3BvcnQgaXMgdW5yZWxpYWJsZQotICAgICAgICAgICAgdGhyb3cgZXg7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuT1VUX1RSQU5TUE9SVF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSk7Ci0KLSAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0QnVpbGRlci5jcmVhdGVGYXVsdE1lc3NhZ2VDb250ZXh0KG1zZ0NvbnRleHQsIGUpOwotICAgICAgICAgICAgLy8gSWYgdGhlIGZhdWx0IGlzIG5vdCBnb2luZyBhbG9uZyB0aGUgYmFjayBjaGFubmVsIHdlIHNob3VsZCBiZSAyMDJpbmcKLSAgICAgICAgICAgIGlmIChBZGRyZXNzaW5nSGVscGVyLmlzRmF1bHRSZWRpcmVjdGVkKG1zZ0NvbnRleHQpKSB7Ci0gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKEh0dHBTdGF0dXMuU0NfQUNDRVBURUQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RhdGUgPSAoU3RyaW5nKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KENvbnN0YW50cy5IVFRQX1JFU1BPTlNFX1NUQVRFKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGVJbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXRlSW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlSW50ID09IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKSB7IC8vIFVuYXV0aG9yaXplZAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYWxtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuSFRUUF9CQVNJQ19BVVRIX1JFQUxNKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFkZEhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2ljIHJlYWxtPVwiIiArIHJlYWxtICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGdldFN0YXR1c0Zyb21BeGlzRmF1bHQoKEF4aXNGYXVsdCllKSwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTdGF0dXMuU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUuc2VuZEZhdWx0KGZhdWx0Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFN0YXR1c0Zyb21BeGlzRmF1bHQoQXhpc0ZhdWx0IGZhdWx0KSB7Ci0gICAgICAgIFFOYW1lIGZhdWx0Q29kZSA9IGZhdWx0LmdldEZhdWx0Q29kZSgpOwotICAgICAgICBpZiAoU09BUDEyQ29uc3RhbnRzLlFOQU1FX1NFTkRFUl9GQVVMVENPREUuZXF1YWxzKGZhdWx0Q29kZSkgfHwKLSAgICAgICAgICAgICAgICBTT0FQMTFDb25zdGFudHMuUU5BTUVfU0VOREVSX0ZBVUxUQ09ERS5lcXVhbHMoZmF1bHRDb2RlKSkgewotICAgICAgICAgICAgcmV0dXJuIEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1Q7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgY2xhc3MgU2ltcGxlSFRUUFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCBpbXBsZW1lbnRzIFJlcXVlc3RSZXNwb25zZVRyYW5zcG9ydCB7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCByZXNwb25zZVJlYWR5U2lnbmFsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgc3RhdHVzID0gUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzLldBSVRJTkc7Ci0gICAgICAgIEF4aXNGYXVsdCBmYXVsdFRvQmVUaHJvd25PdXQgPSBudWxsOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuID0gZmFsc2U7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWNrbm93bGVkZ2VNZXNzYWdlKE1lc3NhZ2VDb250ZXh0IG1zZ0NvbnRleHQpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICAgICAgLy9UT0RPOiBPbmNlIHRoZSBjb3JlIEhUVFAgQVBJIGFsbG93cyB1cyB0byByZXR1cm4gYW4gYWNrIGJlZm9yZSB1bndpbmRpbmcsIHRoZW4gdGhlIHNob3VsZCBiZSBmaXhlZAotICAgICAgICAgICAgc3RhdHVzID0gUmVxdWVzdFJlc3BvbnNlVHJhbnNwb3J0U3RhdHVzLkFDS0VEOwotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeVNpZ25hbC5jb3VudERvd24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGF3YWl0UmVzcG9uc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEF4aXNGYXVsdCB7Ci0gICAgICAgICAgICByZXNwb25zZVJlYWR5U2lnbmFsLmF3YWl0KCk7Ci0KLSAgICAgICAgICAgIGlmIChmYXVsdFRvQmVUaHJvd25PdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IGZhdWx0VG9CZVRocm93bk91dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNpZ25hbFJlc3BvbnNlUmVhZHkoKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMuU0lHTkFMTEVEOwotICAgICAgICAgICAgcmVzcG9uc2VSZWFkeVNpZ25hbC5jb3VudERvd24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSZXF1ZXN0UmVzcG9uc2VUcmFuc3BvcnRTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNpZ25hbEZhdWx0UmVhZHkoQXhpc0ZhdWx0IGZhdWx0KSB7Ci0gICAgICAgICAgICBmYXVsdFRvQmVUaHJvd25PdXQgPSBmYXVsdDsKLSAgICAgICAgICAgIHNpZ25hbFJlc3BvbnNlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZVdyaXR0ZW4oKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VXcml0dGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VXcml0dGVuKGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuKSB7Ci0gICAgICAgICAgICB0aGlzLnJlc3BvbnNlV3JpdHRlbiA9IHJlc3BvbnNlV3JpdHRlbjsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc1BhcmFtcy5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0F4aXNQYXJhbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0OGU0NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvQXhpc1BhcmFtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotcHVibGljIGNsYXNzIEF4aXNQYXJhbXMgewotCi0gICAgcHJpdmF0ZSBBeGlzUGFyYW1zKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RFTkVSX1BPUlQgPSAiYXhpcy5saXN0ZW5lci5wb3J0IjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQ09OVEVYVCA9ICJheGlzLm1lc3NhZ2UuY29udGV4dCI7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9Db25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlci5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0Nvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNGU1OWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0Nvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBhc3NvY2lhdGVkIGNvbm5lY3Rpb24gbGlzdGVuZXIgSU9Qcm9jZXNzb3IgaGFzIGZhaWxlZAotICAgICAqCi0gICAgICogQHBhcmFtIGNvbm5lY3Rpb25MaXN0ZW5lciB0aGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIGxpc3RlbmVyCi0gICAgICogQHBhcmFtIGNhdXNlICAgICAgICAgICAgICBjYXVzZSBvZiBmYWlsdXJlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsaXN0ZW5lciBzaG91bGQgYXR0ZW1wdCB0byByZS1lc3RhYmxpc2ggaXRzZWxmLCBmYWxzZSBpZiBpdCBzaG91bGQgdGVybWluYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGZhaWxlZChJT1Byb2Nlc3NvciBjb25uZWN0aW9uTGlzdGVuZXIsIFRocm93YWJsZSBjYXVzZSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgYXNzb2NpYXRlZCBjb25uZWN0aW9uIGxpc3RlbmVyIElPUHJvY2Vzc29yIGlzIHRlcm1pbmF0aW5nIGFibm9ybWFsbHkKLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25uZWN0aW9uTGlzdGVuZXIgdGhlIGFzc29jaWF0ZWQgY29ubmVjdGlvbiBsaXN0ZW5lcgotICAgICAqIEBwYXJhbSBtZXNzYWdlICAgICAgICAgICAgZXhwbGFuYXRpb24gb2YgdGVybWluYXRpb24KLSAgICAgKiBAcGFyYW0gY2F1c2UgICAgICAgICAgICAgIGxhc3QgZXhjZXB0aW9uIHRoYXQgaXMgY2F1c2luZyB0ZXJtaW5hdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFibm9ybWFsVGVybWluYXRpb24oSU9Qcm9jZXNzb3IgY29ubmVjdGlvbkxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTMxYzhiLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLQotcHVibGljIGNsYXNzIERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJT1Byb2Nlc3NvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGVzdHJveWVkID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBwb3J0OwotICAgIHByaXZhdGUgZmluYWwgSHR0cENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5tYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIgZmFpbHVyZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtczsKLQotICAgIHByaXZhdGUgU2VydmVyU29ja2V0IHNlcnZlcnNvY2tldCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBwcm92aWRlIGEgY3VzdG9tIENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyLCBlLmcuIGJ5IHN1YmNsYXNzaW5nIERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlcgotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyKAotICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICBmaW5hbCBIdHRwQ29ubmVjdGlvbk1hbmFnZXIgY29ubm1hbmFnZXIsCi0gICAgICAgICAgICBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlciBmYWlsdXJlSGFuZGxlciwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzdXBlcigpOwotICAgICAgICBpZiAoY29ubm1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29ubmVjdGlvbiBtYW5hZ2VyIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmYWlsdXJlSGFuZGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGYWlsdXJlIGhhbmRsZXIgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHBhcmFtZXRlcnMgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICAgICAgdGhpcy5jb25ubWFuYWdlciA9IGNvbm5tYW5hZ2VyOwotICAgICAgICB0aGlzLmZhaWx1cmVIYW5kbGVyID0gZmFpbHVyZUhhbmRsZXI7Ci0gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICghVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyc29ja2V0ID09IG51bGwgfHwgc2VydmVyc29ja2V0LmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNJbmZvRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmluZm8oIkxpc3RlbmluZyBvbiBwb3J0ICIgKyBwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcnNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQocG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJzb2NrZXQuc2V0UmV1c2VBZGRyZXNzKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiV2FpdGluZyBmb3IgaW5jb21pbmcgSFRUUCBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIFNvY2tldCBzb2NrZXQgPSB0aGlzLnNlcnZlcnNvY2tldC5hY2NlcHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkluY29taW5nIEhUVFAgY29ubmVjdGlvbiBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0UmVtb3RlU29ja2V0QWRkcmVzcygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBBeGlzSHR0cENvbm5lY3Rpb24gY29ubiA9IG5ldyBBeGlzSHR0cENvbm5lY3Rpb25JbXBsKHNvY2tldCwgdGhpcy5wYXJhbXMpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5tYW5hZ2VyLnByb2Nlc3MoY29ubik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZmFpbHVyZUhhbmRsZXIuZmFpbGVkKHRoaXMsIGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZXN0cm95KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh0aGlzLnNlcnZlcnNvY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLnNlcnZlcnNvY2tldC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChMT0cuaXNXYXJuRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HLndhcm4oIkkvTyBlcnJvciBjbG9zaW5nIGxpc3RlbmVyIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZXN0cm95ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc3Ryb3llZDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNTIyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotCi0vKioKLSAqIERlZmF1bHQgaGFuZGVyIGZvciBmYWlsdXJlcyBpbiBjb25uZWN0aW9uIGxpc3RlbmVyIElPUHJvY2Vzc29ycy4KLSAqIFN1cHBvcnRzIGNvbmZpZ3VyYXRpb24gb2YgbnVtYmVyIHJldHJpZXMsIGRlbGF5IHBlciByZXRyeSwgYW5kIHVwdGltZSBpbnRlcnZhbCBjb25zaWRlcmVkIGEgc3VjY2VzcyAocmVzZXRzIG51bWJlciByZXRyaWVzIHRvIHplcm8pLgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyIGltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRDb25uZWN0aW9uTGlzdGVuZXJGYWlsdXJlSGFuZGxlci5jbGFzcyk7Ci0KLSAgICBwcm90ZWN0ZWQgaW50IHJldHJ5RGVsYXk7Ci0gICAgcHJvdGVjdGVkIGludCBzdWNjZXNzSW50ZXJ2YWw7Ci0gICAgcHJvdGVjdGVkIGludCBtYXhSZXRyaWVzOwotCi0gICAgcHJpdmF0ZSBsb25nIGxhc3RGYWlsdXJlOwotICAgIHByaXZhdGUgbG9uZyBsYXN0Rmlyc3RGYWlsdXJlOwotICAgIHByaXZhdGUgaW50IG51bVJldHJpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4KLSAgICAgKiByZXRyeURlbGF5IGlzIDEgc2Vjb25kLCBzdWNjZXNzSW50ZXJ2YWwgaXMgNjAgc2Vjb25kcywgbWF4UmV0cmllcyBpcyAxMAotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIoKSB7Ci0gICAgICAgIHRoaXMoMTAwMCwgNjAwMDAsIDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgRGVmYXVsdENvbm5lY3Rpb25MaXN0ZW5lckZhaWx1cmVIYW5kbGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmV0cnlEZWxheSAgICAgIG1pbGxpcyB0byB3YWl0IGJlZm9yZSByZXRyeWluZwotICAgICAqIEBwYXJhbSBzdWNjZXNzSW50ZXJ2YWwgbWlsbGlzIGFmdGVyIHdoaWNoIGFuIGluaXRpYWwgb3IgcmV0cnkgYXR0ZW1wdCB3aWxsIGJlIGRlZW1lZCBhIHN1Y2Nlc3MsIHJlc2V0dGluZyByZXRyeSBjb3VudCB0byAwCi0gICAgICogQHBhcmFtIG1heFJldHJpZXMgICAgICBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGFsbG93ZWQgd2l0aG91dCBhIHN1Y2Nlc3MsIGFmdGVyIHdoaWNoIHRoZSBsaXN0ZW5lciB3aWxsIHRlcm1pbmF0ZQotICAgICAqLwotICAgIHB1YmxpYyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIoaW50IHJldHJ5RGVsYXksIGludCBzdWNjZXNzSW50ZXJ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UmV0cmllcykgewotICAgICAgICB0aGlzLnJldHJ5RGVsYXkgPSByZXRyeURlbGF5OwotICAgICAgICB0aGlzLnN1Y2Nlc3NJbnRlcnZhbCA9IHN1Y2Nlc3NJbnRlcnZhbDsKLSAgICAgICAgdGhpcy5tYXhSZXRyaWVzID0gbWF4UmV0cmllczsKLSAgICAgICAgdGhpcy5sYXN0RmFpbHVyZSA9IHRoaXMubGFzdEZpcnN0RmFpbHVyZSA9IExvbmcuTUlOX1ZBTFVFOwotICAgICAgICB0aGlzLm51bVJldHJpZXMgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbG9nIGEgd2FybmluZyBhbmQgYXR0ZW1wdCByZXRyeSBwZXIgY29uc3RydWN0b3IgY29uZmlnLCBldmVudHVhbGx5IGZhaWxpbmcgd2l0aCBhIGxvZ2dlZCBlcnJvciBhbmQgbm90aWZpY2F0aW9uLgotICAgICAqIE1heSBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoZSBiZWhhdmlvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBmYWlsZWQoSU9Qcm9jZXNzb3IgY29ubmVjdGlvbkxpc3RlbmVyLCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKG5vdyA+IGxhc3RGYWlsdXJlICsgc3VjY2Vzc0ludGVydmFsKSB7Ci0gICAgICAgICAgICBudW1SZXRyaWVzID0gMDsKLSAgICAgICAgICAgIGxhc3RGaXJzdEZhaWx1cmUgPSBub3c7Ci0gICAgICAgIH0KLSAgICAgICAgbGFzdEZhaWx1cmUgPSBub3c7Ci0gICAgICAgIGlmIChudW1SZXRyaWVzID49IG1heFJldHJpZXMpIHsKLSAgICAgICAgICAgIG5vdGlmeUFibm9ybWFsVGVybWluYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25MaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgIlRlcm1pbmF0aW5nIGNvbm5lY3Rpb24gbGlzdGVuZXIgIiArIGNvbm5lY3Rpb25MaXN0ZW5lciArICIgYWZ0ZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUmV0cmllcyArICJyZXRyaWVzIGluICIgKyAobm93IC0gbGFzdEZpcnN0RmFpbHVyZSkgLyAxMDAwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNlY29uZHMuIiwKLSAgICAgICAgICAgICAgICAgICAgY2F1c2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtUmV0cmllcysrOwotICAgICAgICAgICAgaWYgKExPRy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiQXR0ZW1wdCBudW1iZXIgIiArIG51bVJldHJpZXMgKyAiIG9mICIgKyBtYXhSZXRyaWVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gcmVlc3RhbGlzaCBjb25uZWN0aW9uIGxpc3RlbmVyICIgKyBjb25uZWN0aW9uTGlzdGVuZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBkdWUgdG8gZmFpbHVyZSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBiZXZhcmlvciBpcyB0byBsb2cgdGhlIGVycm9yLgotICAgICAqIE1heSBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIGJlaGF2aW9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFibm9ybWFsVGVybWluYXRpb24oSU9Qcm9jZXNzb3IgY29ubmVjdGlvbkxpc3RlbmVyLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSkgewotICAgICAgICBMT0cuZXJyb3IobWVzc2FnZSwgY2F1c2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0SHR0cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTZiYjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5Db25uZWN0aW9uUmV1c2VTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5EZWZhdWx0Q29ubmVjdGlvblJldXNlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuRGVmYXVsdEh0dHBSZXNwb25zZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5CYXNpY0h0dHBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlQ29ubkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXNwb25zZVNlcnZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBIdHRwQ29ubmVjdGlvbk1hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nIExPRyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKERlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dDsKLQotICAgIC8qKiBUaGUgdGhyZWFkIHBvb2wgdXNlZCB0byBleGVjdXRlIHByb2Nlc3NvcnMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKLQotICAgIHByaXZhdGUgZmluYWwgV29ya2VyRmFjdG9yeSB3b3JrZXJmYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtczsKLQotICAgIC8qKiBUaGUgbGlzdCBvZiBwcm9jZXNzb3JzLiAqLwotICAgIC8vIFhYWDogaXMgdGhpcyBsaXN0IHJlYWxseSBuZWVkZWQ/Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0IHByb2Nlc3NvcnM7Ci0KLSAgICBwcml2YXRlIEh0dHBGYWN0b3J5IGh0dHBGYWN0b3J5ID0gbnVsbDsKLQotCi0gICAgcHVibGljIERlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoZmluYWwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciwgZmluYWwgV29ya2VyRmFjdG9yeSB3b3JrZXJmYWN0b3J5LAotICAgICAgICAgICAgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25Db250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gY29udGV4dCBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXhlY3V0b3IgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmtlcmZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV29ya2VyIGZhY3RvcnkgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIHBhcmFtZXRlcnMgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgIHRoaXMud29ya2VyZmFjdG9yeSA9IHdvcmtlcmZhY3Rvcnk7Ci0gICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwotICAgICAgICB0aGlzLnByb2Nlc3NvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIH0KLQotCXB1YmxpYyBEZWZhdWx0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKAotICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciwKLSAgICAgICAgICAgIGZpbmFsIFdvcmtlckZhY3Rvcnkgd29ya2VyZmFjdG9yeSwKLSAgICAgICAgICAgIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zLAotICAgICAgICAgICAgZmluYWwgSHR0cEZhY3RvcnkgaHR0cEZhY3RvcnkpIHsKLSAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uQ29udGV4dCwgZXhlY3V0b3IsIHdvcmtlcmZhY3RvcnksIHBhcmFtcyk7Ci0gICAgICAgIHRoaXMuaHR0cEZhY3RvcnkgPSBodHRwRmFjdG9yeTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGRlc3Ryb3llZCBwcm9jZXNzb3JzLgotICAgICAqIAotICAgICAqIEBzZWUgSU9Qcm9jZXNzb3IjZGVzdHJveSgpCi0gICAgICovCi0gICAgLy9YWFg6IGlzIHRoaXMgbWV0aG9kIHJlYWxseSBuZWVkZWQ/IFByb2Nlc3NvcnMgYXJlIHJlbW92ZWQgYXMgc29vbiBhcyB0aGV5IGNvbXBsZXRlCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhbnVwKCkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0aGlzLnByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJT1Byb2Nlc3NvciBwcm9jZXNzb3IgPSAoSU9Qcm9jZXNzb3IpIGkubmV4dCgpOwotICAgICAgICAgICAgaWYgKHByb2Nlc3Nvci5pc0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUgc3BlY2lmaWVkIHtAbGlua3BsYWluIElPUHJvY2Vzc29yfSB0byB0aGUgbGlzdCBvZiBwcm9jZXNzb3JzIGluIAotICAgICAqIHByb2dyZXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgVGhlIHByb2Nlc3NvciB0byBhZGQuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBJZiBwcm9jZXNzb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9jZXNzb3IoZmluYWwgSU9Qcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0gICAgICAgIGlmIChwcm9jZXNzb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgcHJvY2Vzc29yIGNhbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnByb2Nlc3NvcnMuYWRkKHByb2Nlc3Nvcik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQge0BsaW5rcGxhaW4gSU9Qcm9jZXNzb3J9IGZyb20gdGhlIGxpc3Qgb2YKLSAgICAgKiBwcm9jZXNzb3JzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgVGhlIHByb2Nlc3NvciB0byByZW1vdmUuCi0gICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBJZiBwcm9jZXNzb3IgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICovCi0gICAgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvY2Vzc29yKGZpbmFsIElPUHJvY2Vzc29yIHByb2Nlc3NvcikKLSAgICAgICAgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2Nlc3NvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBwcm9jZXNzb3IgY2FuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMucHJvY2Vzc29ycy5yZW1vdmUocHJvY2Vzc29yKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgQXhpc0h0dHBDb25uZWN0aW9uIGNvbm4pIHsKLSAgICAgICAgaWYgKGNvbm4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBjb25uZWN0aW9uIG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEV2aWN0IGRlc3Ryb3llZCBwcm9jZXNzb3JzCi0gICAgICAgIGNsZWFudXAoKTsKLQotICAgICAgICAvLyBBc3NlbWJsZSBuZXcgQXhpcyBIVFRQIHNlcnZpY2UKLSAgICAgICAgSHR0cFByb2Nlc3NvciBodHRwUHJvY2Vzc29yOwotICAgICAgICBDb25uZWN0aW9uUmV1c2VTdHJhdGVneSBjb25uU3RyYXRlZ3k7Ci0gICAgICAgIEh0dHBSZXNwb25zZUZhY3RvcnkgcmVzcG9uc2VGYWN0b3J5OwotCi0gICAgICAgIGlmIChodHRwRmFjdG9yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBodHRwUHJvY2Vzc29yID0gaHR0cEZhY3RvcnkubmV3SHR0cFByb2Nlc3NvcigpOwotICAgICAgICAgICAgY29ublN0cmF0ZWd5ID0gaHR0cEZhY3RvcnkubmV3Q29ublN0cmF0ZWd5KCk7Ci0gICAgICAgICAgICByZXNwb25zZUZhY3RvcnkgPSBodHRwRmFjdG9yeS5uZXdSZXNwb25zZUZhY3RvcnkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJhc2ljSHR0cFByb2Nlc3NvciBwID0gbmV3IEJhc2ljSHR0cFByb2Nlc3NvcigpOwotICAgICAgICAgICAgcC5hZGRJbnRlcmNlcHRvcihuZXcgUmVxdWVzdFNlc3Npb25Db29raWUoKSk7Ci0gICAgICAgICAgICBwLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZURhdGUoKSk7Ci0gICAgICAgICAgICBwLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZVNlcnZlcigpKTsKLSAgICAgICAgICAgIHAuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlQ29udGVudCgpKTsKLSAgICAgICAgICAgIHAuYWRkSW50ZXJjZXB0b3IobmV3IFJlc3BvbnNlQ29ubkNvbnRyb2woKSk7Ci0gICAgICAgICAgICBwLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZVNlc3Npb25Db29raWUoKSk7Ci0gICAgICAgICAgICBodHRwUHJvY2Vzc29yID0gcDsKLSAgICAgICAgICAgIGNvbm5TdHJhdGVneSA9IG5ldyBEZWZhdWx0Q29ubmVjdGlvblJldXNlU3RyYXRlZ3koKTsKLSAgICAgICAgICAgIHJlc3BvbnNlRmFjdG9yeSA9IG5ldyBEZWZhdWx0SHR0cFJlc3BvbnNlRmFjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXhpc0h0dHBTZXJ2aWNlIGh0dHBTZXJ2aWNlID0gbmV3IEF4aXNIdHRwU2VydmljZShodHRwUHJvY2Vzc29yLCBjb25uU3RyYXRlZ3ksCi0gICAgICAgICAgICByZXNwb25zZUZhY3RvcnksIHRoaXMuY29uZmlndXJhdGlvbkNvbnRleHQsIHRoaXMud29ya2VyZmFjdG9yeS5uZXdXb3JrZXIoKSk7Ci0gICAgICAgIGh0dHBTZXJ2aWNlLnNldFBhcmFtcyh0aGlzLnBhcmFtcyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIEkvTyBwcm9jZXNzb3IgdG8gZXhlY3V0ZSBIVFRQIHNlcnZpY2UKLSAgICAgICAgSU9Qcm9jZXNzb3JDYWxsYmFjayBjYWxsYmFjayA9IG5ldyBJT1Byb2Nlc3NvckNhbGxiYWNrKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgSU9Qcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUHJvY2Vzc29yKHByb2Nlc3Nvcik7Ci0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1Zyhwcm9jZXNzb3IgKyAiIHRlcm1pbmF0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfTsKLSAgICAgICAgSU9Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEh0dHBTZXJ2aWNlUHJvY2Vzc29yKGh0dHBTZXJ2aWNlLCBjb25uLCBjYWxsYmFjayk7Ci0KLSAgICAgICAgYWRkUHJvY2Vzc29yKHByb2Nlc3Nvcik7Ci0gICAgICAgIHRoaXMuZXhlY3V0b3IuZXhlY3V0ZShwcm9jZXNzb3IpOwotICAgIH0KLQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNodXRkb3duKCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucHJvY2Vzc29ycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSU9Qcm9jZXNzb3IgcHJvY2Vzc29yID0gKElPUHJvY2Vzc29yKSB0aGlzLnByb2Nlc3NvcnMuZ2V0KGkpOwotICAgICAgICAgICAgcHJvY2Vzc29yLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnByb2Nlc3NvcnMuY2xlYXIoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9EZWZhdWx0VGhyZWFkRmFjdG9yeS5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRUaHJlYWRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MzgzNzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0RlZmF1bHRUaHJlYWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRUaHJlYWRGYWN0b3J5IGltcGxlbWVudHMgVGhyZWFkRmFjdG9yeSB7Ci0KLSAgICBmaW5hbCBUaHJlYWRHcm91cCBncm91cDsKLSAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50OwotICAgIGZpbmFsIFN0cmluZyBuYW1lUHJlZml4OwotCi0gICAgcHVibGljIERlZmF1bHRUaHJlYWRGYWN0b3J5KGZpbmFsIFRocmVhZEdyb3VwIGdyb3VwLCBmaW5hbCBTdHJpbmcgbmFtZVByZWZpeCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMSk7Ci0gICAgICAgIHRoaXMuZ3JvdXAgPSBncm91cDsKLSAgICAgICAgdGhpcy5uYW1lUHJlZml4ID0gbmFtZVByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXMubmFtZVByZWZpeCk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJy0nKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCh0aGlzLmNvdW50LmdldEFuZEluY3JlbWVudCgpKTsKLSAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKGdyb3VwLCBydW5uYWJsZSwgYnVmZmVyLnRvU3RyaW5nKCksIDApOwotICAgICAgICB0LnNldERhZW1vbihmYWxzZSk7Ci0gICAgICAgIHQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkpOwotICAgICAgICByZXR1cm4gdDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyMjQyYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIEh0dHBDb25uZWN0aW9uTWFuYWdlciB7Ci0KLSAgICB2b2lkIHByb2Nlc3MoQXhpc0h0dHBDb25uZWN0aW9uIGluY29taW5nKTsKLQotICAgIHZvaWQgc2h1dGRvd24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0h0dHBGYWN0b3J5LmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1NTQyMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uVHJhbnNwb3J0SW5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5MaXN0ZW5lck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQV29ya2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvblJldXNlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuRGVmYXVsdENvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLkRlZmF1bHRIdHRwUmVzcG9uc2VGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuQmFzaWNIdHRwUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cENvbm5lY3Rpb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFByb3RvY29sUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5CYXNpY0h0dHBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLkh0dHBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlQ29ubkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnByb3RvY29sLlJlc3BvbnNlQ29udGVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuUmVzcG9uc2VEYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5SZXNwb25zZVNlcnZlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogRmFjdG9yeSB1c2VkIHRvIGNvbmZpZ3VyZSBhbmQgY3JlYXRlIHRoZSB2YXJpb3VzIGluc3RhbmNlcyByZXF1aXJlZCBpbiBodHRwIHRyYW5zcG9ydHMuCi0gKiBFaXRoZXIgY29uZmlndXJlIHRoaXMgY2xhc3MgaW4gYXhpczIueG1sLCBvciBpbiBjb2RlIHZpYSB0aGUgc2V0dGVycywgb3Igc3ViY2xhc3MgaXQgYW5kIHNwZWNpYWxpemUgc29tZSBmYWN0b3J5IG1ldGhvZHMgdG8gZ2FpbiBtb3JlIGNvbnRyb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwRmFjdG9yeSB7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCBwb3J0IHBhcmFtZXRlciBmb3IgU2ltcGxlSFRUUFNlcnZlciBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1BPUlQgPSAicG9ydCI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCBob3N0bmFtZSBwYXJhbWV0ZXIgZm9yIFNpbXBsZUhUVFBTZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9IT1NUX0FERFJFU1MgPSAiaG9zdG5hbWUiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBheGlzMi54bWwgb3JpZ2luU2VydmVyIHBhcmFtZXRlciBmb3IgU2ltcGxlSFRUUFNlcnZlciBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX09SSUdJTl9TRVJWRVIgPSAib3JpZ2luU2VydmVyIjsKLQotICAgIC8qKgotICAgICAqIE5hbWUgb2YgYXhpczIueG1sIHJlcXVlc3RUaW1lb3V0IHBhcmFtZXRlciBmb3IgU2ltcGxlSFRUUFNlcnZlciBjb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1JFUVVFU1RfU09DS0VUX1RJTUVPVVQgPSAicmVxdWVzdFRpbWVvdXQiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBheGlzMi54bWwgcmVxdWVzdFRjcE5vRGVsYXkgcGFyYW1ldGVyIGZvciBTaW1wbGVIVFRQU2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfUkVRVUVTVF9UQ1BfTk9fREVMQVkgPSAicmVxdWVzdFRjcE5vRGVsYXkiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBheGlzMi54bWwgcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSBwYXJhbWV0ZXIgZm9yIFNpbXBsZUhUVFBTZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9SRVFVRVNUX0NPUkVfVEhSRUFEX1BPT0xfU0laRSA9Ci0gICAgICAgICAgICAicmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIGF4aXMyLnhtbCByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUgcGFyYW1ldGVyIGZvciBTaW1wbGVIVFRQU2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfUkVRVUVTVF9NQVhfVEhSRUFEX1BPT0xfU0laRSA9ICJyZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBheGlzMi54bWwgdGhyZWFkS2VlcEFsaXZlVGltZSBwYXJhbWV0ZXIgZm9yIFNpbXBsZUhUVFBTZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9USFJFQURfS0VFUF9BTElWRV9USU1FID0gInRocmVhZEtlZXBBbGl2ZVRpbWUiOwotCi0gICAgLyoqCi0gICAgICogTmFtZSBvZiBheGlzMi54bWwgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQgcGFyYW1ldGVyIGZvciBTaW1wbGVIVFRQU2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfVEhSRUFEX0tFRVBfQUxJVkVfVElNRV9VTklUID0gInRocmVhZEtlZXBBbGl2ZVRpbWVVbml0IjsKLQotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBUcmFuc3BvcnRJbkRlc2NyaXB0aW9uIGh0dHBDb25maWd1cmF0aW9uOwotICAgIHByaXZhdGUgaW50IHBvcnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaG9zdEFkZHJlc3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3JpZ2luU2VydmVyOwotICAgIHByaXZhdGUgaW50IHJlcXVlc3RTb2NrZXRUaW1lb3V0OwotICAgIHByaXZhdGUgYm9vbGVhbiByZXF1ZXN0VGNwTm9EZWxheTsKLSAgICBwcml2YXRlIGludCByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplOwotICAgIHByaXZhdGUgaW50IHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZTsKLSAgICBwcml2YXRlIGxvbmcgdGhyZWFkS2VlcEFsaXZlVGltZTsKLSAgICBwcml2YXRlIFRpbWVVbml0IHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OwotCi0gICAgcHJpdmF0ZSBXb3JrZXJGYWN0b3J5IHJlcXVlc3RXb3JrZXJGYWN0b3J5ID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbmQgY29uZmlndXJlIGEgbmV3IEh0dHBGYWN0b3J5Ci0gICAgICovCi0gICAgcHVibGljIEh0dHBGYWN0b3J5KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ3VyYXRpb25Db250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ29udGV4dCA9IGNvbmZpZ3VyYXRpb25Db250ZXh0OwotICAgICAgICBodHRwQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25Db250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNwb3J0SW4oQ29uc3RhbnRzLlRSQU5TUE9SVF9IVFRQKTsKLSAgICAgICAgcG9ydCA9IGdldEludFBhcmFtKFBBUkFNRVRFUl9QT1JULCA2MDYwKTsKLSAgICAgICAgaG9zdEFkZHJlc3MgPSBnZXRTdHJpbmdQYXJhbShQQVJBTUVURVJfSE9TVF9BRERSRVNTLCBudWxsKTsKLSAgICAgICAgb3JpZ2luU2VydmVyID0gZ2V0U3RyaW5nUGFyYW0oUEFSQU1FVEVSX09SSUdJTl9TRVJWRVIsICJTaW1wbGUtU2VydmVyLzEuMSIpOwotICAgICAgICByZXF1ZXN0U29ja2V0VGltZW91dCA9IGdldEludFBhcmFtKFBBUkFNRVRFUl9SRVFVRVNUX1NPQ0tFVF9USU1FT1VULCAyMDAwMCk7Ci0gICAgICAgIHJlcXVlc3RUY3BOb0RlbGF5ID0gZ2V0Qm9vbGVhblBhcmFtKFBBUkFNRVRFUl9SRVFVRVNUX1RDUF9OT19ERUxBWSwgdHJ1ZSk7Ci0gICAgICAgIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUgPSBnZXRJbnRQYXJhbShQQVJBTUVURVJfUkVRVUVTVF9DT1JFX1RIUkVBRF9QT09MX1NJWkUsIDEwMCk7Ci0gICAgICAgIHJlcXVlc3RNYXhUaHJlYWRQb29sU2l6ZSA9IGdldEludFBhcmFtKFBBUkFNRVRFUl9SRVFVRVNUX01BWF9USFJFQURfUE9PTF9TSVpFLCAxNTApOwotICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lID0gZ2V0TG9uZ1BhcmFtKFBBUkFNRVRFUl9USFJFQURfS0VFUF9BTElWRV9USU1FLCAxODBMKTsKLSAgICAgICAgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQgPQotICAgICAgICAgICAgICAgIGdldFRpbWVVbml0UGFyYW0oUEFSQU1FVEVSX1RIUkVBRF9LRUVQX0FMSVZFX1RJTUVfVU5JVCwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgSHR0cEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cEZhY3RvcnkoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsIGludCBwb3J0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uQ29udGV4dCk7Ci0gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuZCBjb25maWd1cmUgYSBuZXcgSHR0cEZhY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cEZhY3RvcnkoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlndXJhdGlvbkNvbnRleHQsIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJGYWN0b3J5IHJlcXVlc3RXb3JrZXJGYWN0b3J5KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdGhpcyhjb25maWd1cmF0aW9uQ29udGV4dCwgcG9ydCk7Ci0gICAgICAgIHRoaXMucmVxdWVzdFdvcmtlckZhY3RvcnkgPSByZXF1ZXN0V29ya2VyRmFjdG9yeTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRJbnRQYXJhbShTdHJpbmcgbmFtZSwgaW50IGRlZikgewotICAgICAgICBTdHJpbmcgY29uZmlnID0gZ2V0U3RyaW5nUGFyYW0obmFtZSwgbnVsbCk7Ci0gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoY29uZmlnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgZ2V0TG9uZ1BhcmFtKFN0cmluZyBuYW1lLCBsb25nIGRlZikgewotICAgICAgICBTdHJpbmcgY29uZmlnID0gZ2V0U3RyaW5nUGFyYW0obmFtZSwgbnVsbCk7Ci0gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKGNvbmZpZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5QYXJhbShTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWYpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgY29uZmlnID0gZ2V0U3RyaW5nUGFyYW0obmFtZSwgbnVsbCk7Ci0gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvbmZpZy5lcXVhbHMoInllcyIpIHx8IGNvbmZpZy5lcXVhbHMoInRydWUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuZXF1YWxzKCJubyIpIHx8IGNvbmZpZy5lcXVhbHMoImZhbHNlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBeGlzRmF1bHQoIkJvb2xlYW4gdmFsdWUgbXVzdCBiZSB5ZXMsIHRydWUsIG5vIG9yIGZhbHNlIGZvciBwYXJhbWV0ZXIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgIjogICIgKyBjb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZWY7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUaW1lVW5pdCBnZXRUaW1lVW5pdFBhcmFtKFN0cmluZyBuYW1lLCBUaW1lVW5pdCBkZWYpIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICBTdHJpbmcgY29uZmlnID0gZ2V0U3RyaW5nUGFyYW0obmFtZSwgbnVsbCk7Ci0gICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRpbWVVbml0KSBUaW1lVW5pdC5jbGFzcy5nZXRGaWVsZChjb25maWcpLmdldChudWxsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVmOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZ1BhcmFtKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmKSB7Ci0gICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IGh0dHBDb25maWd1cmF0aW9uLmdldFBhcmFtZXRlcihuYW1lKTsKLSAgICAgICAgaWYgKHBhcmFtICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgYXNzZXJ0IHBhcmFtLmdldFBhcmFtZXRlclR5cGUoKSA9PSBQYXJhbWV0ZXIuVEVYVF9QQVJBTUVURVI7Ci0gICAgICAgICAgICBTdHJpbmcgY29uZmlnID0gKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlZjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyZWQgbGlzdGVuZXIgbWFuYWdlciBvciBjcmVhdGUgYW5kIGNvbmZpZ3VyZSBvbmUgd2l0aCBjb25maWd1cmF0aW9uQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0ZW5lck1hbmFnZXIgZ2V0TGlzdGVuZXJNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbkNvbnRleHQuZ2V0TGlzdGVuZXJNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBleGVjdXRvciB1c2VkIHRvIGxhdW5jaCB0aGUgc2luZ2xlIHJlcXVlc3RDb25uZWN0aW9uTGlzdGVuZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIG5ld0xpc3RlbmVyRXhlY3V0b3IoaW50IHBvcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMSwgMEwsIFRpbWVVbml0Lk1JTExJU0VDT05EUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpbmtlZEJsb2NraW5nUXVldWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRUaHJlYWRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWRHcm91cCgiTGlzdGVuZXIgdGhyZWFkIGdyb3VwIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh0dHBMaXN0ZW5lci0iICsgdGhpcy5wb3J0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBsaXN0ZW5lciBmb3IgcmVxdWVzdCBjb25uZWN0aW9ucwotICAgICAqLwotICAgIHB1YmxpYyBJT1Byb2Nlc3NvciBuZXdSZXF1ZXN0Q29ubmVjdGlvbkxpc3RlbmVyKAotICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICBmaW5hbCBIdHRwQ29ubmVjdGlvbk1hbmFnZXIgbWFuYWdlciwgCi0gICAgICAgICAgICBmaW5hbCBIdHRwUGFyYW1zIHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyKAotICAgICAgICAgICAgICAgIHBvcnQsIAotICAgICAgICAgICAgICAgIG1hbmFnZXIsIAotICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0Q29ubmVjdGlvbkxpc3RlbmVyRmFpbHVyZUhhbmRsZXIoKSwgCi0gICAgICAgICAgICAgICAgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW5kIHNldCB0aGUgcGFyYW1ldGVycyBhcHBsaWVkIHRvIGluY29taW5nIHJlcXVlc3QgY29ubmVjdGlvbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgSHR0cFBhcmFtcyBuZXdSZXF1ZXN0Q29ubmVjdGlvblBhcmFtcygpIHsKLSAgICAgICAgSHR0cFBhcmFtcyBwYXJhbXMgPSBuZXcgQmFzaWNIdHRwUGFyYW1zKCk7Ci0gICAgICAgIHBhcmFtcwotICAgICAgICAgICAgICAgIC5zZXRJbnRQYXJhbWV0ZXIoSHR0cENvbm5lY3Rpb25QYXJhbXMuU09fVElNRU9VVCwgcmVxdWVzdFNvY2tldFRpbWVvdXQpCi0gICAgICAgICAgICAgICAgLnNldEJvb2xlYW5QYXJhbWV0ZXIoSHR0cENvbm5lY3Rpb25QYXJhbXMuVENQX05PREVMQVksIHJlcXVlc3RUY3BOb0RlbGF5KQotICAgICAgICAgICAgICAgIC5zZXRJbnRQYXJhbWV0ZXIoSHR0cENvbm5lY3Rpb25QYXJhbXMuTUFYX0xJTkVfTEVOR1RILCA0MDAwKQotICAgICAgICAgICAgICAgIC5zZXRJbnRQYXJhbWV0ZXIoSHR0cENvbm5lY3Rpb25QYXJhbXMuTUFYX0hFQURFUl9DT1VOVCwgNTAwKQotICAgICAgICAgICAgICAgIC5zZXRJbnRQYXJhbWV0ZXIoSHR0cENvbm5lY3Rpb25QYXJhbXMuU09DS0VUX0JVRkZFUl9TSVpFLCA4ICogMTAyNCkKLSAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVyKEh0dHBQcm90b2NvbFBhcmFtcy5PUklHSU5fU0VSVkVSLCBvcmlnaW5TZXJ2ZXIpOwotICAgICAgICByZXR1cm4gcGFyYW1zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgY29ubmVjdGlvbiBtYW5hZ2VyIHVzZWQgdG8gbGF1bmNoIHJlcXVlc3QgdGhyZWFkcwotICAgICAqLwotICAgIHB1YmxpYyBIdHRwQ29ubmVjdGlvbk1hbmFnZXIgbmV3UmVxdWVzdENvbm5lY3Rpb25NYW5hZ2VyKEV4ZWN1dG9yU2VydmljZSByZXF1ZXN0RXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyRmFjdG9yeSB3b3JrZXJGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBQYXJhbXMgcGFyYW1zKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEh0dHBDb25uZWN0aW9uTWFuYWdlcihjb25maWd1cmF0aW9uQ29udGV4dCwgcmVxdWVzdEV4ZWN1dG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyRmFjdG9yeSwgcGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIGV4ZWN1dG9yIHVzZSB0aGUgbWFuYWdlIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWRzCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBuZXdSZXF1ZXN0RXhlY3V0b3IoaW50IHBvcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IocmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSwgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRLZWVwQWxpdmVUaW1lLCB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmVxdWVzdEJsb2NraW5nUXVldWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRUaHJlYWRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWRHcm91cCgiQ29ubmVjdGlvbiB0aHJlYWQgZ3JvdXAiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSHR0cENvbm5lY3Rpb24tIiArIHBvcnQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHF1ZXVlIHVzZWQgdG8gaG9sZCBpbmNvbWluZyByZXF1ZXN0cyB3aGVuIHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUgdGhyZWFkcyBhcmUgYnVzeS4KLSAgICAgKiBEZWZhdWx0IGlzIGFuIHVuYm91bmRlZCBxdWV1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmxvY2tpbmdRdWV1ZSBuZXdSZXF1ZXN0QmxvY2tpbmdRdWV1ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBmYWN0b3J5IGZvciByZXF1ZXN0IHdvcmtlcnMKLSAgICAgKi8KLSAgICBwdWJsaWMgV29ya2VyRmFjdG9yeSBuZXdSZXF1ZXN0V29ya2VyRmFjdG9yeSgpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RXb3JrZXJGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0V29ya2VyRmFjdG9yeTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSFRUUFdvcmtlckZhY3RvcnkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBIdHRwUHJvY2Vzc29yIG5ld0h0dHBQcm9jZXNzb3IoKSB7Ci0gICAgICAgIEJhc2ljSHR0cFByb2Nlc3NvciBodHRwUHJvY2Vzc29yID0gbmV3IEJhc2ljSHR0cFByb2Nlc3NvcigpOwotICAgICAgICBodHRwUHJvY2Vzc29yLmFkZEludGVyY2VwdG9yKG5ldyBSZXF1ZXN0U2Vzc2lvbkNvb2tpZSgpKTsKLSAgICAgICAgaHR0cFByb2Nlc3Nvci5hZGRJbnRlcmNlcHRvcihuZXcgUmVzcG9uc2VEYXRlKCkpOwotICAgICAgICBodHRwUHJvY2Vzc29yLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZVNlcnZlcigpKTsKLSAgICAgICAgaHR0cFByb2Nlc3Nvci5hZGRJbnRlcmNlcHRvcihuZXcgUmVzcG9uc2VDb250ZW50KCkpOwotICAgICAgICBodHRwUHJvY2Vzc29yLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZUNvbm5Db250cm9sKCkpOwotICAgICAgICBodHRwUHJvY2Vzc29yLmFkZEludGVyY2VwdG9yKG5ldyBSZXNwb25zZVNlc3Npb25Db29raWUoKSk7Ci0gICAgICAgIHJldHVybiBodHRwUHJvY2Vzc29yOwotICAgIH0KLQotICAgIHB1YmxpYyBDb25uZWN0aW9uUmV1c2VTdHJhdGVneSBuZXdDb25uU3RyYXRlZ3koKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdENvbm5lY3Rpb25SZXVzZVN0cmF0ZWd5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEh0dHBSZXNwb25zZUZhY3RvcnkgbmV3UmVzcG9uc2VGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRIdHRwUmVzcG9uc2VGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgLy8gKioqKioKLSAgICAvLyBHZXR0ZXJzIGFuZCBTZXR0ZXJzCi0gICAgLy8gKioqKioKLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgY29uZmlndXJhdGlvbkNvbnRleHQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRleHQgZ2V0Q29uZmlndXJhdGlvbkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIGh0dHBDb25maWd1cmF0aW9uCi0gICAgICovCi0gICAgcHVibGljIFRyYW5zcG9ydEluRGVzY3JpcHRpb24gZ2V0SHR0cENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBodHRwQ29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHBvcnQKLSAgICAgKiByZXR1cm4gdGhlIHBvcnQgb24gd2hpY2ggdG8gbGlzdGVuIGZvciBodHRwIGNvbm5lY3Rpb25zIChkZWZhdWx0ID0gNjA2MCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcG9ydAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKLSAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIGhvc3RBZGRyZXNzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBob3N0IGFkZHJlc3MgKG9yIG5hbWUpIHRvIGJlIHVzZSBpbiByZXBseS10byBlbmRwb2ludCByZWZlcmVuY2VzLCBvciBudWxsIGlmIG5vdCBzcGVjaWZpZWQgKGRlZmF1bHQgPSBudWxsKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdEFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiBob3N0QWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIGhvc3RBZGRyZXNzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SG9zdEFkZHJlc3MoU3RyaW5nIGhvc3RBZGRyZXNzKSB7Ci0gICAgICAgIHRoaXMuaG9zdEFkZHJlc3MgPSBob3N0QWRkcmVzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIG9yaWdpblNlcnZlcgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgU2VydmVyIGhlYWRlciBzdHJpbmcgZm9yIG91dGdvaW5nIG1lc3NhZ2VzIChkZWZhdWx0ICJTaW1wbGUtU2VydmVyLzEuMSIpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5TZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBvcmlnaW5TZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciBvcmlnaW5TZXJ2ZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPcmlnaW5TZXJ2ZXIoU3RyaW5nIG9yaWdpblNlcnZlcikgewotICAgICAgICB0aGlzLm9yaWdpblNlcnZlciA9IG9yaWdpblNlcnZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXR0ZXIgZm9yIHJlcXVlc3RTb2NrZXRUaW1lb3V0Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzIHRvIHdhaXQgZm9yIGRhdGEgb24gYSByZXF1ZXN0IHNvY2tldCAoZGVmYXVsdCAyMDAwMCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFJlcXVlc3RTb2NrZXRUaW1lb3V0KCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdFNvY2tldFRpbWVvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciByZXF1ZXN0U29ja2V0VGltZW91dAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RTb2NrZXRUaW1lb3V0KGludCByZXF1ZXN0U29ja2V0VGltZW91dCkgewotICAgICAgICB0aGlzLnJlcXVlc3RTb2NrZXRUaW1lb3V0ID0gcmVxdWVzdFNvY2tldFRpbWVvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciByZXF1ZXN0VGNwTm9EZWxheQotICAgICAqIHJldHVybiBmYWxzZSBpZmYgTmFnbGUncyBhbGdvcml0aG0gc2hvdWxkIGJlIHVzZWQgdG8gY29uc2VydmUgYmFuZHdpZHRoIGJ5IG1pbmltaXppbmcgc2VnbWVudHMKLSAgICAgKiBhdCB0aGUgY29zdCBvZiBsYXRlbmN5IGFuZCBwZXJmb3JtYW5jZSAoZGVmYXVsdCB0cnVlLCBpLmUuIG1heGltaXplIHBlcmZvcm1hbmNlIGF0Ci0gICAgICogdGhlIGNvc3Qgb2YgYmFuZHdpZHRoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldFJlcXVlc3RUY3BOb0RlbGF5KCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdFRjcE5vRGVsYXk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0dGVyIGZvciByZXF1ZXN0VGNwTm9EZWxheQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RUY3BOb0RlbGF5KGJvb2xlYW4gcmVxdWVzdFRjcE5vRGVsYXkpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0VGNwTm9EZWxheSA9IHJlcXVlc3RUY3BOb0RlbGF5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgUmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZQotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdGhyZWFkIHBvb2wgdXNlIHRvIHByb2Nlc3MgcmVxdWVzdHMgYXNzdW1pbmcgdGhlcmUgaXMgYWRlcXVhdGUgcXVldWUgc3BhY2UgKGRlZmF1bHQgMjUpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRSZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplKCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIFJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplKGludCByZXF1ZXN0Q29yZVRocmVhZFBvb2xTaXplKSB7Ci0gICAgICAgIHRoaXMucmVxdWVzdENvcmVUaHJlYWRQb29sU2l6ZSA9IHJlcXVlc3RDb3JlVGhyZWFkUG9vbFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgdGhyZWFkIHBvb2wgdXNlZCB0byBwcm9jZXNzIHJlcXVlc3RzIGlmIHRoZSBxdWV1ZSBmaWxscyB1cCAoZGVmYXVsdCAxNTApLgotICAgICAqICAgICAgICAgU2luY2UgdGhlIGRlZmF1bHQgcXVldWUgaXMgdW5ib3VuZGVkIHRoaXMgcGFyYW1ldGVyIGlzIG1lYW5pbmdsZXNzIHVubGVzcyB5b3Ugb3ZlcnJpZGUgbmV3UmVxdWVzdEJsb2NraW5nUXVldWUoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UmVxdWVzdE1heFRocmVhZFBvb2xTaXplKCkgewotICAgICAgICByZXR1cm4gcmVxdWVzdE1heFRocmVhZFBvb2xTaXplOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgcmVxdWVzdE1heFRocmVhZFBvb2xTaXplCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdE1heFRocmVhZFBvb2xTaXplKGludCByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUpIHsKLSAgICAgICAgdGhpcy5yZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemUgPSByZXF1ZXN0TWF4VGhyZWFkUG9vbFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0dGVyIGZvciB0aHJlYWRLZWVwQWxpdmVUaW1lCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGhvdyBsb25nIGEgcmVxdWVzdCBwcm9jZXNzaW5nIHRocmVhZCBpbiBleGNlc3Mgb2YgdGhlIGNvcmUgcG9vbCBzaXplIHdpbGwgYmUga2VwdCBhbGl2ZSBpdCBpZiBpcyBpbmFjdGl2ZQotICAgICAqICAgICAgICAgKGRlZmF1bHQgd2l0aCB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCB0byAxODAgc2Vjb25kcykKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaHJlYWRLZWVwQWxpdmVUaW1lKCkgewotICAgICAgICByZXR1cm4gdGhyZWFkS2VlcEFsaXZlVGltZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXR0ZXIgZm9yIHRocmVhZEtlZXBBbGl2ZVRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRLZWVwQWxpdmVUaW1lKGxvbmcgdGhyZWFkS2VlcEFsaXZlVGltZSkgewotICAgICAgICB0aGlzLnRocmVhZEtlZXBBbGl2ZVRpbWUgPSB0aHJlYWRLZWVwQWxpdmVUaW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHRlciBmb3IgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQKLSAgICAgKiByZXR1cm4gdGhlIHRpbWUgdW5pdCBmb3IgdGhyZWFkS2VlcEFsaXZlVGltZSAoZGVmYXVsdCBTRUNPTkRTKQotICAgICAqLwotICAgIHB1YmxpYyBUaW1lVW5pdCBnZXRUaHJlYWRLZWVwQWxpdmVUaW1lVW5pdCgpIHsKLSAgICAgICAgcmV0dXJuIHRocmVhZEtlZXBBbGl2ZVRpbWVVbml0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHRlciBmb3IgdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUaHJlYWRLZWVwQWxpdmVUaW1lVW5pdChUaW1lVW5pdCB0aHJlYWRLZWVwQWxpdmVUaW1lVW5pdCkgewotICAgICAgICB0aGlzLnRocmVhZEtlZXBBbGl2ZVRpbWVVbml0ID0gdGhyZWFkS2VlcEFsaXZlVGltZVVuaXQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cFNlcnZpY2VQcm9jZXNzb3IuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwU2VydmljZVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTQ0ZTAxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwU2VydmljZVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuQmFzaWNIdHRwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwotCi0vKioKLSAqIEkvTyBwcm9jZXNzb3IgaW50ZW5kZWQgdG8gcHJvY2VzcyByZXF1ZXN0cyBhbmQgZmlsbCBpbiByZXNwb25zZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwU2VydmljZVByb2Nlc3NvciBpbXBsZW1lbnRzIElPUHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBMT0cgPSBMb2dGYWN0b3J5LmdldExvZyhIdHRwU2VydmljZVByb2Nlc3Nvci5jbGFzcyk7Ci0KLSAgICAvKiogQ291bnRlciB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgSURzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0xvbmcgY291bnRlciA9IG5ldyBBdG9taWNMb25nKDBMKTsKLQotICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiB0ZXJtaW5hdGVkOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBeGlzSHR0cFNlcnZpY2UgaHR0cHNlcnZpY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEF4aXNIdHRwQ29ubmVjdGlvbiBjb25uOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJT1Byb2Nlc3NvckNhbGxiYWNrIGNhbGxiYWNrOwotCi0gICAgLyoqCi0gICAgICogVW5pcXVlIGlkZW50aWZpZXIgdXNlZCBieSB7QGxpbmtwbGFpbiAjZXF1YWxzKE9iamVjdCl9IGFuZAotICAgICAqIHtAbGlua3BsYWluICNoYXNoQ29kZSgpfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZpZWxkIGlzIG5lZWRlZCB0byBhbGxvdyB0aGUgZXF1YWxzIG1ldGhvZCB0byB3b3JrIHByb3Blcmx5IHdoZW4gdGhpcwotICAgICAqIEh0dHBTZXJ2aWNlUHJvY2Vzc29yIGhhcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcHJvY2Vzc29ycy4KLSAgICAgKiAKLSAgICAgKiBAc2VlIERlZmF1bHRIdHRwQ29ubmVjdGlvbk1hbmFnZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgaWQ7Ci0KLQotICAgIHB1YmxpYyBIdHRwU2VydmljZVByb2Nlc3NvcihmaW5hbCBBeGlzSHR0cFNlcnZpY2UgaHR0cHNlcnZpY2UsCi0gICAgICAgICAgICBmaW5hbCBBeGlzSHR0cENvbm5lY3Rpb24gY29ubiwgZmluYWwgSU9Qcm9jZXNzb3JDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLmh0dHBzZXJ2aWNlID0gaHR0cHNlcnZpY2U7Ci0gICAgICAgIHRoaXMuY29ubiA9IGNvbm47Ci0gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgdGhpcy50ZXJtaW5hdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotCi0gICAgICAgIGlkID0gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgTE9HLmRlYnVnKCJOZXcgY29ubmVjdGlvbiB0aHJlYWQiKTsKLSAgICAgICAgSHR0cENvbnRleHQgY29udGV4dCA9IG5ldyBCYXNpY0h0dHBDb250ZXh0KG51bGwpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUgKCEgVGhyZWFkLmludGVycnVwdGVkKCkgJiYgISBpc0Rlc3Ryb3llZCgpICYmIHRoaXMuY29ubi5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgIHRoaXMuaHR0cHNlcnZpY2UuaGFuZGxlUmVxdWVzdCh0aGlzLmNvbm4sIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMT0cuZGVidWcoIkNsaWVudCBjbG9zZWQgY29ubmVjdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgU29ja2V0VGltZW91dEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZyhleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChleCBpbnN0YW5jZW9mIFNvY2tldEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZyhleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybihleC5nZXRNZXNzYWdlKCksIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSHR0cEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgaWYgKExPRy5pc1dhcm5FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICBMT0cud2FybigiSFRUUCBwcm90b2NvbCBlcnJvcjogIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBkZXN0cm95KCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgY2FsbGJhY2sgb2JqZWN0IGNhbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuY2FsbGJhY2suY29tcGxldGVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMuY29ubi5jbG9zZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgaWYgKHRoaXMudGVybWluYXRlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgewotICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgIHRoaXMuY29ubi5zaHV0ZG93bigpOwotICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiSS9PIGVycm9yIHNodXR0aW5nIGRvd24gY29ubmVjdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Rlc3Ryb3llZCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMudGVybWluYXRlZC5nZXQoKTsKLSAgICB9Ci0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1ldGhvZHMgZnJvbSBPYmplY3QKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGlzIEh0dHBTZXJ2aWNlUHJvY2Vzc29yLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBJRCBvZiB0aGlzIEh0dHBTZXJ2aWNlUHJvY2Vzc29yLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGZpbmFsIGludCBQUklNRSA9IDMxOwotICAgICAgICBpbnQgcmVzdWx0ID0gMTsKLSAgICAgICAgcmVzdWx0ID0gUFJJTUUgKiByZXN1bHQgKyAoaW50KSAoaWQgXiAoaWQgPj4+IDMyKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc29tZSBvdGhlciBvYmplY3QgaXMgImVxdWFsIHRvIiB0aGlzIG9uZS4KLSAgICAqIAotICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIEh0dHBTZXJ2aWNlUHJvY2Vzc29yIHJlZmVyZSB0byB0aGUgc2FtZSAKLSAgICAqIG9iamVjdCBhcyBvYmogb3IgdGhleSBoYXZlIHRoZSBzYW1lIHtAbGlua3BsYWluICNpZH0sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICBpZiAodGhpcyA9PSBvYmopCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZmluYWwgSHR0cFNlcnZpY2VQcm9jZXNzb3Igb3RoZXIgPSAoSHR0cFNlcnZpY2VQcm9jZXNzb3IpIG9iajsKLSAgICAgICAgaWYgKGlkICE9IG90aGVyLmlkKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwVXRpbHMuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9IdHRwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxM2EyOC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvSHR0cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuVHJhbnNwb3J0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5OZXR3b3JrSW50ZXJmYWNlOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBIdHRwVXRpbHMgewotCi0gICAgcHJpdmF0ZSBIdHRwVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U29hcEFjdGlvbihmaW5hbCBBeGlzSHR0cFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBIZWFkZXIgaGVhZGVyID0gcmVxdWVzdC5nZXRGaXJzdEhlYWRlcihIVFRQQ29uc3RhbnRzLkhFQURFUl9TT0FQX0FDVElPTik7Ci0gICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGhlYWRlci5nZXRWYWx1ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9JT1Byb2Nlc3Nvci5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0lPUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzZhODYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0lPUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJT1Byb2Nlc3NvciBleHRlbmRzIFJ1bm5hYmxlIHsKLQotICAgIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICBib29sZWFuIGlzRGVzdHJveWVkKCk7Ci0KLSAgICB2b2lkIGRlc3Ryb3koKTsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0lPUHJvY2Vzc29yQ2FsbGJhY2suamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9JT1Byb2Nlc3NvckNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDA4N2IuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL0lPUHJvY2Vzc29yQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU9Qcm9jZXNzb3JDYWxsYmFjayB7Ci0KLSAgICB2b2lkIGNvbXBsZXRlZChJT1Byb2Nlc3NvciBwcm9jZXNzb3IpOwotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvUmVxdWVzdFNlc3Npb25Db29raWUuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9SZXF1ZXN0U2Vzc2lvbkNvb2tpZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhiMjhkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9SZXF1ZXN0U2Vzc2lvbkNvb2tpZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IZWFkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlcXVlc3RJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVxdWVzdFNlc3Npb25Db29raWUgaW1wbGVtZW50cyBIdHRwUmVxdWVzdEludGVyY2VwdG9yIHsKLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgSHR0cFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgSHR0cENvbnRleHQgY29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcmVxdWVzdCBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIVFRQIGNvbnRleHQgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgc2Vzc2lvbkNvb2tpZSA9IG51bGw7Ci0gICAgICAgIEhlYWRlcltdIGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlcnMoSFRUUENvbnN0YW50cy5IRUFERVJfQ09PS0lFKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBIZWFkZXJFbGVtZW50W10gZWxlbWVudHMgPSBoZWFkZXJzW2ldLmdldEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBlID0gMDsgZSA8IGVsZW1lbnRzLmxlbmd0aDsgZSsrKSB7Ci0gICAgICAgICAgICAgICAgSGVhZGVyRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbZV07Ci0gICAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5TRVNTSU9OX0NPT0tJRS5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNFU1NJT05fQ09PS0lFX0pTRVNTSU9OSUQuZXF1YWxzSWdub3JlQ2FzZShlbGVtZW50LmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IGVsZW1lbnQuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udGV4dC5zZXRBdHRyaWJ1dGUoSFRUUENvbnN0YW50cy5DT09LSUVfU1RSSU5HLCBzZXNzaW9uQ29va2llKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9SZXNwb25zZVNlc3Npb25Db29raWUuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9SZXNwb25zZVNlc3Npb25Db29raWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhZDJkYy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvUmVzcG9uc2VTZXNzaW9uQ29va2llLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0Lk1lc3NhZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2VJbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CdWZmZXJlZEhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSHR0cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5odHRwLnV0aWwuQ2hhckFycmF5QnVmZmVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFJlc3BvbnNlU2Vzc2lvbkNvb2tpZSBpbXBsZW1lbnRzIEh0dHBSZXNwb25zZUludGVyY2VwdG9yIHsKLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgSHR0cFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBIdHRwQ29udGV4dCBjb250ZXh0KQotICAgICAgICAgICAgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhUVFAgcmVzcG9uc2UgbWF5IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSFRUUCBjb250ZXh0IG1heSBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHNlc3Npb25Db29raWUgPSBudWxsOwotICAgICAgICBNZXNzYWdlQ29udGV4dCBtc2djdHggPSAoTWVzc2FnZUNvbnRleHQpIGNvbnRleHQuZ2V0QXR0cmlidXRlKEF4aXNQYXJhbXMuTUVTU0FHRV9DT05URVhUKTsKLSAgICAgICAgaWYgKG1zZ2N0eCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXNzaW9uQ29va2llID0gKFN0cmluZykgbXNnY3R4LmdldFByb3BlcnR5KEhUVFBDb25zdGFudHMuQ09PS0lFX1NUUklORyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlc3Npb25Db29raWUgPT0gbnVsbCkgewotICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IChTdHJpbmcpIGNvbnRleHQuZ2V0QXR0cmlidXRlKEhUVFBDb25zdGFudHMuQ09PS0lFX1NUUklORyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlc3Npb25Db29raWUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2VuZXJhdGUgTmV0c2NhcGUgc3R5bGUgY29va2llIGhlYWRlcgotICAgICAgICAgICAgQ2hhckFycmF5QnVmZmVyIGJ1ZmZlcjEgPSBuZXcgQ2hhckFycmF5QnVmZmVyKHNlc3Npb25Db29raWUubGVuZ3RoKCkgKyA0MCk7Ci0gICAgICAgICAgICBidWZmZXIxLmFwcGVuZChIVFRQQ29uc3RhbnRzLkhFQURFUl9TRVRfQ09PS0lFKTsKLSAgICAgICAgICAgIGJ1ZmZlcjEuYXBwZW5kKCI6ICIpOwotICAgICAgICAgICAgYnVmZmVyMS5hcHBlbmQoQ29uc3RhbnRzLlNFU1NJT05fQ09PS0lFX0pTRVNTSU9OSUQpOwotICAgICAgICAgICAgYnVmZmVyMS5hcHBlbmQoIj0iKTsKLSAgICAgICAgICAgIGJ1ZmZlcjEuYXBwZW5kKHNlc3Npb25Db29raWUpOwotICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKG5ldyBCdWZmZXJlZEhlYWRlcihidWZmZXIxKSk7Ci0KLSAgICAgICAgICAgIC8vIEdlbmVyYXRlIFJGQzI5NjUgY29va2llMiBoZWFkZXIKLSAgICAgICAgICAgIENoYXJBcnJheUJ1ZmZlciBidWZmZXIyID0gbmV3IENoYXJBcnJheUJ1ZmZlcihzZXNzaW9uQ29va2llLmxlbmd0aCgpICsgNTApOwotICAgICAgICAgICAgYnVmZmVyMi5hcHBlbmQoSFRUUENvbnN0YW50cy5IRUFERVJfU0VUX0NPT0tJRTIpOwotICAgICAgICAgICAgYnVmZmVyMi5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZChDb25zdGFudHMuU0VTU0lPTl9DT09LSUVfSlNFU1NJT05JRCk7Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZCgiPSIpOwotICAgICAgICAgICAgYnVmZmVyMi5hcHBlbmQoc2Vzc2lvbkNvb2tpZSk7Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZCgiOyAiKTsKLSAgICAgICAgICAgIGludCBwb3J0ID0gcmVzcG9uc2UuZ2V0UGFyYW1zKCkuZ2V0SW50UGFyYW1ldGVyKEF4aXNQYXJhbXMuTElTVEVORVJfUE9SVCwgMCk7Ci0gICAgICAgICAgICBpZiAocG9ydCA+IDApIHsKLSAgICAgICAgICAgICAgICBidWZmZXIyLmFwcGVuZCgiUG9ydD1cIiIpOwotICAgICAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKEludGVnZXIudG9TdHJpbmcocG9ydCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlcjIuYXBwZW5kKCJcIjsgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXIyLmFwcGVuZCgiVmVyc2lvbj0xIik7Ci0gICAgICAgICAgICByZXNwb25zZS5hZGRIZWFkZXIobmV3IEJ1ZmZlcmVkSGVhZGVyKGJ1ZmZlcjIpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1Nlc3Npb25NYW5hZ2VyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvU2Vzc2lvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjY2VhMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvU2Vzc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLnV0aWwuVVVJREdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlc3Npb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkRlcGVuZGVuY3lNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uTWFuYWdlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcCBzZXNzaW9ubWFwOwotCi0gICAgcHVibGljIFNlc3Npb25NYW5hZ2VyKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLnNlc3Npb25tYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2Vzc2lvbkNvbnRleHQgZ2V0U2Vzc2lvbkNvbnRleHQoU3RyaW5nIHNlc3Npb25LZXkpIHsKLSAgICAgICAgU2Vzc2lvbkNvbnRleHQgc2Vzc2lvbkNvbnRleHQgPSBudWxsOwotICAgICAgICBpZiAoc2Vzc2lvbktleSAhPSBudWxsICYmIHNlc3Npb25LZXkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQgPSAoU2Vzc2lvbkNvbnRleHQpIHRoaXMuc2Vzc2lvbm1hcC5nZXQoc2Vzc2lvbktleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNlc3Npb25Db250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHNlc3Npb25LZXkgPSBVVUlER2VuZXJhdG9yLmdldFVVSUQoKTsKLSAgICAgICAgICAgIHNlc3Npb25Db250ZXh0ID0gbmV3IFNlc3Npb25Db250ZXh0KG51bGwpOwotICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuc2V0Q29va2llSUQoc2Vzc2lvbktleSk7Ci0gICAgICAgICAgICB0aGlzLnNlc3Npb25tYXAucHV0KHNlc3Npb25LZXksIHNlc3Npb25Db250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uQ29udGV4dC50b3VjaCgpOwotICAgICAgICBjbGVhbnVwU2VydmljZUdyb3VwQ29udGV4dHMoKTsKLSAgICAgICAgcmV0dXJuIHNlc3Npb25Db250ZXh0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwU2VydmljZUdyb3VwQ29udGV4dHMoKSB7Ci0gICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHRoaXMuc2Vzc2lvbm1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgY29va2llSUQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBTZXNzaW9uQ29udGV4dCBzZXNzaW9uQ29udGV4dCA9IChTZXNzaW9uQ29udGV4dCkgdGhpcy5zZXNzaW9ubWFwLmdldChjb29raWVJRCk7Ci0gICAgICAgICAgICBpZiAoKGN1cnJlbnRUaW1lIC0gc2Vzc2lvbkNvbnRleHQuZ2V0TGFzdFRvdWNoZWRUaW1lKCkpID4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvbnRleHQuc2Vzc2lvbkNvbnRleHRUaW1lb3V0SW50ZXJ2YWwpIHsKLSAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBzZXJ2aWNlR3JvdXBDb250ZXh0ID0gc2Vzc2lvbkNvbnRleHQuZ2V0U2VydmljZUdyb3VwQ29udGV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlR3JvdXBDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlcnZpY2VHcm91cENvbnRleHQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IGdyb3VwQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZXJ2aWNlR3JvdXBDb250ZXh0KSBzZXJ2aWNlR3JvdXBDb250ZXh0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBTZXJ2aWNlQ29udGV4dHMoZ3JvdXBDb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjbGVhbnVwU2VydmljZUNvbnRleHRzKGZpbmFsIFNlcnZpY2VHcm91cENvbnRleHQgc2VydmljZUdyb3VwQ29udGV4dCkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gc2VydmljZUdyb3VwQ29udGV4dC5nZXRTZXJ2aWNlQ29udGV4dHMoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU2VydmljZUNvbnRleHQgc2VydmljZUNvbnRleHQgPSAoU2VydmljZUNvbnRleHQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIERlcGVuZGVuY3lNYW5hZ2VyLmRlc3Ryb3lTZXJ2aWNlT2JqZWN0KHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9TaW1wbGVIdHRwU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDZhOTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuc2VydmVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMuSHR0cFBhcmFtczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi0vKioKLSAqIEEgc2ltcGxlLCBidXQgY29uZmlndXJhYmxlIGFuZCBleHRlbnNpYmxlIEhUVFAgc2VydmVyLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlSHR0cFNlcnZlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMb2cgTE9HID0gTG9nRmFjdG9yeS5nZXRMb2coU2ltcGxlSHR0cFNlcnZlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hVVERPV05fR1JBQ0VfUEVSSU9EID0gMzAwMDsgLy8gbXMKLQotICAgIHByaXZhdGUgSHR0cEZhY3RvcnkgaHR0cEZhY3Rvcnk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKLSAgICBwcml2YXRlIGZpbmFsIEh0dHBQYXJhbXMgcGFyYW1zOwotICAgIHByaXZhdGUgZmluYWwgV29ya2VyRmFjdG9yeSB3b3JrZXJGYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBJT1Byb2Nlc3NvciBsaXN0ZW5lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgbGlzdGVuZXJFeGVjdXRvciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBIdHRwQ29ubmVjdGlvbk1hbmFnZXIgY29ubm1hbmFnZXIgPSBudWxsOwotICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIHJlcXVlc3RFeGVjdXRvciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgU2ltcGxlSHR0cFNlcnZlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWd1cmF0aW9uQ29udGV4dCwgV29ya2VyRmFjdG9yeSB3b3JrZXJGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aGlzKG5ldyBIdHRwRmFjdG9yeShjb25maWd1cmF0aW9uQ29udGV4dCwgcG9ydCwgd29ya2VyRmFjdG9yeSksIHBvcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTaW1wbGVIdHRwU2VydmVyKEh0dHBGYWN0b3J5IGh0dHBGYWN0b3J5LCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5odHRwRmFjdG9yeSA9IGh0dHBGYWN0b3J5OwotICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgICAgICB0aGlzLndvcmtlckZhY3RvcnkgPSBodHRwRmFjdG9yeS5uZXdSZXF1ZXN0V29ya2VyRmFjdG9yeSgpOwotICAgICAgICB0aGlzLnBhcmFtcyA9IGh0dHBGYWN0b3J5Lm5ld1JlcXVlc3RDb25uZWN0aW9uUGFyYW1zKCk7Ci0gICAgICAgIHRoaXMucGFyYW1zLnNldEludFBhcmFtZXRlcihBeGlzUGFyYW1zLkxJU1RFTkVSX1BPUlQsIHBvcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXF1ZXN0RXhlY3V0b3IgPSBodHRwRmFjdG9yeS5uZXdSZXF1ZXN0RXhlY3V0b3IocG9ydCk7Ci0gICAgICAgIGNvbm5tYW5hZ2VyID0KLSAgICAgICAgICAgICAgICBodHRwRmFjdG9yeS5uZXdSZXF1ZXN0Q29ubmVjdGlvbk1hbmFnZXIocmVxdWVzdEV4ZWN1dG9yLCB3b3JrZXJGYWN0b3J5LCBwYXJhbXMpOwotICAgICAgICBsaXN0ZW5lckV4ZWN1dG9yID0gaHR0cEZhY3RvcnkubmV3TGlzdGVuZXJFeGVjdXRvcihwb3J0KTsKLSAgICAgICAgbGlzdGVuZXIgPSBodHRwRmFjdG9yeS5uZXdSZXF1ZXN0Q29ubmVjdGlvbkxpc3RlbmVyKHBvcnQsIGNvbm5tYW5hZ2VyLCBwYXJhbXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQXR0ZW1wdCB0byB0ZXJtaW5hdGUgdGhlIGxpc3RlbmVyIG5pY2VseQotICAgICAgICBMT0cuaW5mbygiU2h1dCBkb3duIGNvbm5lY3Rpb24gbGlzdGVuZXIiKTsKLSAgICAgICAgdGhpcy5saXN0ZW5lckV4ZWN1dG9yLnNodXRkb3duTm93KCk7Ci0gICAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpOwotICAgICAgICB0aGlzLmxpc3RlbmVyRXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbihTSFVURE9XTl9HUkFDRV9QRVJJT0QsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICAgIGlmICghdGhpcy5saXN0ZW5lckV4ZWN1dG9yLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIGxpc3RlbmVyIGZvcmNpYmx5Ci0gICAgICAgICAgICBMT0cuaW5mbygiRm9yY2Ugc2h1dCBkb3duIGNvbm5lY3Rpb24gbGlzdGVuZXIiKTsKLSAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZGVzdHJveSgpOwotICAgICAgICAgICAgLy8gTGVhdmUgaXQgdXAgdG8gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGNsZWFuIHVwIHRoZSBtZXNzCi0gICAgICAgICAgICB0aGlzLmxpc3RlbmVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLyBBdHRlbXB0IHRvIHRlcm1pbmF0ZSB0aGUgYWN0aXZlIHByb2Nlc3NvcnMgbmljZWx5Ci0gICAgICAgIExPRy5pbmZvKCJTaHV0IGRvd24gSFRUUCBwcm9jZXNzb3JzIik7Ci0gICAgICAgIHRoaXMucmVxdWVzdEV4ZWN1dG9yLnNodXRkb3duTm93KCk7Ci0gICAgICAgIHRoaXMucmVxdWVzdEV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oU0hVVERPV05fR1JBQ0VfUEVSSU9ELCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwotICAgICAgICBpZiAoIXRoaXMucmVxdWVzdEV4ZWN1dG9yLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIGFjdGl2ZSBwcm9jZXNzb3JzIGZvcmNpYmx5Ci0gICAgICAgICAgICBMT0cuaW5mbygiRm9yY2Ugc2h1dCBkb3duIEhUVFAgcHJvY2Vzc29ycyIpOwotICAgICAgICAgICAgdGhpcy5jb25ubWFuYWdlci5zaHV0ZG93bigpOwotICAgICAgICAgICAgLy8gTGVhdmUgaXQgdXAgdG8gdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGNsZWFuIHVwIHRoZSBtZXNzCi0gICAgICAgICAgICB0aGlzLmNvbm5tYW5hZ2VyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBMT0cuaW5mbygiSFRUUCBwcm90b2NvbCBoYW5kbGVyIHNodXQgZG93biIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICB0aGlzLmxpc3RlbmVyRXhlY3V0b3IuZXhlY3V0ZSh0aGlzLmxpc3RlbmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyRXhlY3V0b3IgIT0gbnVsbCAmJiAhdGhpcy5saXN0ZW5lckV4ZWN1dG9yLmlzU2h1dGRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBvcnQ7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV29ya2VyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC9zZXJ2ZXIvV29ya2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OWNhYWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1dvcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnNlcnZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2VyIHsKLQotICAgIHZvaWQgc2VydmljZShBeGlzSHR0cFJlcXVlc3QgcmVxdWVzdCwgQXhpc0h0dHBSZXNwb25zZSByZXNwb25zZSwgTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1dvcmtlckZhY3RvcnkuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3NlcnZlci9Xb3JrZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMWM0YmIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2h0dHAvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2h0dHAvc2VydmVyL1dvcmtlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5zZXJ2ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2VyRmFjdG9yeSB7Ci0KLSAgICBXb3JrZXIgbmV3V29ya2VyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUkVTVFV0aWwuamF2YSBiLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9odHRwL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9odHRwL3V0aWwvUkVTVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwMTFiMC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvaHR0cC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvaHR0cC91dGlsL1JFU1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYnVpbGRlci5CdWlsZGVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuTWVzc2FnZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNFbmRwb2ludDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLldTREwyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGlzcGF0Y2hlcnMuUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRpc3BhdGNoZXJzLlJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5IVFRQVHJhbnNwb3J0VXRpbHM7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFJFU1RVdGlsIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlci5JbnZvY2F0aW9uUmVzcG9uc2UgcHJvY2Vzc1hNTFJlcXVlc3QoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGNvbnRlbnRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nUkVTVCh0cnVlKTsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSBCdWlsZGVyVXRpbC5nZXRDaGFyU2V0RW5jb2RpbmcoY29udGVudFR5cGUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBjaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICAgICAgZGlzcGF0Y2hBbmRWZXJpZnkobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBpbiA9IEhUVFBUcmFuc3BvcnRVdGlscy5oYW5kbGVHWmlwKG1zZ0NvbnRleHQsIGluKTsKLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBzb2FwRW52ZWxvcGUgPSBUcmFuc3BvcnRVdGlscwotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlU09BUE1lc3NhZ2UobXNnQ29udGV4dCwgaW4sIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0RW52ZWxvcGUoc29hcEVudmVsb3BlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uQ09OVEVOVF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSk7Ci0KLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwgb3V0KTsKLQotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgYXhpc0ZhdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBheGlzRmF1bHQ7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUpOwotICAgICAgICAgICAgaWYgKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNLmVxdWFscyhtZXNzYWdlVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX01VTFRJUEFSVF9GT1JNX0RBVEEuZXF1YWxzKG1lc3NhZ2VUeXBlKSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludm9rZUF4aXNFbmdpbmUobXNnQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBIYW5kbGVyLkludm9jYXRpb25SZXNwb25zZSBwcm9jZXNzVVJMUmVxdWVzdChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCwgU3RyaW5nIGNvbnRlbnRUeXBlKQotICAgICAgICAgICAgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIC8vIGhlcmUsIG9ubHkgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIFVSSSBhcmUgc3VwcG9ydGVkLiBPdGhlcnMgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8ICIiLmVxdWFscyhjb250ZW50VHlwZSkpIHsKLSAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBzZXQgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgc28gdGhhdCBldmVuIGlmIHRoZXJlIGlzIGFuIGVycm9yIGR1cmluZyB0aGUgZGlzcGF0Y2gKLSAgICAgICAgICAgIC8vIHBoYXNlIHRoZSByZXNwb25zZSBtZXNzYWdlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgd2VsbC4gCi0gICAgICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nUkVTVCh0cnVlKTsKLSAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwgb3V0KTsKLSAgICAgICAgICAgIFN0cmluZyBjaGFyU2V0RW5jb2RpbmcgPSBCdWlsZGVyVXRpbC5nZXRDaGFyU2V0RW5jb2RpbmcoY29udGVudFR5cGUpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5DSEFSQUNURVJfU0VUX0VOQ09ESU5HLCBjaGFyU2V0RW5jb2RpbmcpOwotICAgICAgICAgICAgLy8gMS4gRmlyc3QgZGlzcGF0Y2hBbmRWZXJpZnkgYW5kIGZpbmQgb3V0IHRoZSBzZXJ2aWNlIGFuZCB0aGUgb3BlcmF0aW9uLgotICAgICAgICAgICAgZGlzcGF0Y2hBbmRWZXJpZnkobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBTT0FQRW52ZWxvcGUgc29hcEVudmVsb3BlOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzb2FwRW52ZWxvcGUgPSBUcmFuc3BvcnRVdGlscwotICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVNPQVBNZXNzYWdlKG1zZ0NvbnRleHQsIG51bGwsIGNvbnRlbnRUeXBlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRFbnZlbG9wZShzb2FwRW52ZWxvcGUpOwotCi0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBBeGlzRmF1bHQubWFrZUZhdWx0KGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2VUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbXNnQ29udGV4dC5nZXRQcm9wZXJ0eShDb25zdGFudHMuQ29uZmlndXJhdGlvbi5NRVNTQUdFX1RZUEUpOwotICAgICAgICAgICAgaWYgKEhUVFBDb25zdGFudHMuTUVESUFfVFlQRV9YX1dXV19GT1JNLmVxdWFscyhtZXNzYWdlVHlwZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX01VTFRJUEFSVF9GT1JNX0RBVEEuZXF1YWxzKG1lc3NhZ2VUeXBlKSkgewotICAgICAgICAgICAgICAgIG1zZ0NvbnRleHQuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uTUVTU0FHRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnN0YW50cy5NRURJQV9UWVBFX0FQUExJQ0FUSU9OX1hNTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludm9rZUF4aXNFbmdpbmUobXNnQ29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSGFuZGxlci5JbnZvY2F0aW9uUmVzcG9uc2UgaW52b2tlQXhpc0VuZ2luZShNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICByZXR1cm4gQXhpc0VuZ2luZS5yZWNlaXZlKG1lc3NhZ2VDb250ZXh0KTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGlzcGF0Y2hBbmRWZXJpZnkoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIFJlcXVlc3RVUklCYXNlZERpc3BhdGNoZXIgcmVxdWVzdERpc3BhdGNoZXIgPSBuZXcgUmVxdWVzdFVSSUJhc2VkRGlzcGF0Y2hlcigpOwotICAgICAgICByZXF1ZXN0RGlzcGF0Y2hlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gbXNnQ29udGV4dC5nZXRBeGlzU2VydmljZSgpOwotICAgICAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgSFRUUExvY2F0aW9uQmFzZWREaXNwYXRjaGVyIGh0dHBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBIVFRQTG9jYXRpb25CYXNlZERpc3BhdGNoZXIoKTsKLSAgICAgICAgICAgIGh0dHBMb2NhdGlvbkJhc2VkRGlzcGF0Y2hlci5pbnZva2UobXNnQ29udGV4dCk7Ci0gICAgICAgICAgICBpZiAobXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyIHJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0VVJJT3BlcmF0aW9uRGlzcGF0Y2hlcigpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RVUklPcGVyYXRpb25EaXNwYXRjaGVyLmludm9rZShtc2dDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uOwotICAgICAgICAgICAgaWYgKChheGlzT3BlcmF0aW9uID0gbXNnQ29udGV4dC5nZXRBeGlzT3BlcmF0aW9uKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBeGlzRW5kcG9pbnQgYXhpc0VuZHBvaW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChBeGlzRW5kcG9pbnQpIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoV1NETDJDb25zdGFudHMuRU5EUE9JTlRfTE9DQUxfTkFNRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF4aXNFbmRwb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNCaW5kaW5nT3BlcmF0aW9uIGF4aXNCaW5kaW5nT3BlcmF0aW9uID0gKEF4aXNCaW5kaW5nT3BlcmF0aW9uKSBheGlzRW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmluZGluZygpLmdldENoaWxkKGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShDb25zdGFudHMuQVhJU19CSU5ESU5HX09QRVJBVElPTiwgYXhpc0JpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtc2dDb250ZXh0LnNldEF4aXNPcGVyYXRpb24oYXhpc09wZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotfQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9wb20ueG1sIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhY2RiOWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuNS4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczItdHJhbnNwb3J0LWxvY2FsPC9hcnRpZmFjdElkPgotICAgIDxuYW1lPkFwYWNoZSBBeGlzMiAtIFRyYW5zcG9ydCAtIExvY2FsPC9uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5UaGlzIGluY2x1ZXMgYWxsIHRoZSBhdmFpbGFibGUgdHJhbnNwb3J0cyBpbiBBeGlzMjwvZGVzY3JpcHRpb24+Ci0gICAgPHBhY2thZ2luZz5idW5kbGU8L3BhY2thZ2luZz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWw8L2Nvbm5lY3Rpb24+Ci0gICAgICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWw8L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbDwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cHJvamVjdC52ZXJzaW9ufTwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT4ke3BvbS5hcnRpZmFjdElkfTwvQnVuZGxlLU5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVZlbmRvcj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvQnVuZGxlLVZlbmRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtRGVzY3JpcHRpb24+JHtwb20uZGVzY3JpcHRpb259PC9CdW5kbGUtRGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT4ke3BvbS5hcnRpZmFjdElkfTwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbC4qOy1zcGxpdC1wYWNrYWdlOj1tZXJnZS1sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PmNvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyoucHJvcGVydGllczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+ZmFsc2U8L2ZpbHRlcmluZz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLWtlcm5lbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFJlc3BvbmRlci5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFJlc3BvbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjcyZjNhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxSZXNwb25kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIExvY2FsUmVzcG9uZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFJlc3BvbmRlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIFRyYW5zcG9ydFNlbmRlciB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTG9jYWxSZXNwb25kZXIuY2xhc3MpOwotICAgIAotICAgIAotICAgIC8vICBmaXhlZCBmb3IgRXhlY3V0aW5nIExvY2FsVHJhbnNwb3J0IGluIE11bHRoVGhyZWFkLiAKLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7Ci0KLSAgICBwdWJsaWMgTG9jYWxSZXNwb25kZXIoT3V0cHV0U3RyZWFtIHJlc3BvbnNlKSB7Ci0gICAgICAgIHRoaXMub3V0ID0gcmVzcG9uc2U7ICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZDb250ZXh0LCBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0cmFuc3BvcnRPdXQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGludm9rZQotICAgICAqCi0gICAgICogQHBhcmFtIG1zZ0NvbnRleHQgdGhlIGFjdGl2ZSBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBSRVNUIGJlaGF2aW91ciwgaWYgeW91IGRlc2lyZSByZXN0IGJlYWhhdmlvdXIKLSAgICAgICAgLy8gcHV0IGEgPHBhcmFtZXRlciBuYW1lPSJkb1JFU1QiIHZhbHVlPSJ0cnVlIi8+IGF0IHRoZSBheGlzMi54bWwKLSAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ01UT00oVHJhbnNwb3J0VXRpbHMuZG9Xcml0ZU1UT00obXNnQ29udGV4dCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nU3dBKFRyYW5zcG9ydFV0aWxzLmRvV3JpdGVTd0EobXNnQ29udGV4dCkpOwotCi0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG51bGw7Ci0KLSAgICAgICAgaWYgKG1zZ0NvbnRleHQuZ2V0VG8oKSAhPSBudWxsICYmICFtc2dDb250ZXh0LmdldFRvKCkuaGFzQW5vbnltb3VzQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICBlcHIgPSBtc2dDb250ZXh0LmdldFRvKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLndyaXRlTWVzc2FnZShtc2dDb250ZXh0LCBvcyk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXNwb25zZSAtICIgKyBuZXcgU3RyaW5nKG9zLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVwciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcHIuaGFzTm9uZUFkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy53cml0ZU1lc3NhZ2UobXNnQ29udGV4dCwgb3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dCA9IChPdXRwdXRTdHJlYW0pIG1zZ0NvbnRleHQuZ2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMud3JpdGVNZXNzYWdlKG1zZ0NvbnRleHQsIG91dCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm90aCB0aGUgVE8gYW5kIFByb3BlcnR5IE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQgaXMgTnVsbCwgTm8gd2hlcmUgdG8gc2VuZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBhbGwgd2UgY2FuIGRvIGlzIGxvZyB0aGlzIGVycm9yLCBzaW5jZSBpdCBoYXBwZW5lZCB3aGlsZQotICAgICAgICAgICAgLy8gd2Ugd2VyZSBzZW5kaW5nIHRoZSByZXNwb25zZSEKLSAgICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3Igc2VuZGluZyByZXNwb25zZSIsIGF4aXNGYXVsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBUcmFuc3BvcnRVdGlscy5zZXRSZXNwb25zZVdyaXR0ZW4obXNnQ29udGV4dCwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsUmVzcG9uc2VUcmFuc3BvcnRPdXREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGI3MDJlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5sb2NhbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uRmxvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVGhpcyBpcyB3cmFwcGVyIGNsYXNzIG9mIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGNsYXNzLgotICogSW4gVXNpbmcgQXhpczIgTG9jYWwgVHJhbnNwb3J0LCB5b3UgY2FuJ3Qgc2VuZCBTT0FQIE1lc3NhZ2Ugc3VjY2Vzc2l2ZWx5LgotICovCi0KLWNsYXNzIExvY2FsUmVzcG9uc2VUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiBleHRlbmRzIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHsKLQotICAgIHByaXZhdGUgVHJhbnNwb3J0U2VuZGVyIHNlbmRlciA9IG51bGw7Ci0KLSAgICBwcml2YXRlIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRPdXQgPSBudWxsOwotCi0gICAgcHVibGljIExvY2FsUmVzcG9uc2VUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigKLSAgICAgICAgICAgIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGxvY2FsVHJhbnNwb3J0U2VuZGVyRGVzY3JpcHRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLQotICAgICAgICBzdXBlcihsb2NhbFRyYW5zcG9ydFNlbmRlckRlc2NyaXB0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgdGhpcy50T3V0ID0gbG9jYWxUcmFuc3BvcnRTZW5kZXJEZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgYWRkUGFyYW1ldGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJhbQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtZXRlcihQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0T3V0LmFkZFBhcmFtZXRlcihwYXJhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKFBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0gICAgICAgIHRPdXQucmVtb3ZlUGFyYW1ldGVyKHBhcmFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXNlcmlhbGl6ZVBhcmFtZXRlcnMoT01FbGVtZW50IHBhcmFtZXRlckVsZW1lbnQpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgdE91dC5kZXNlcmlhbGl6ZVBhcmFtZXRlcnMocGFyYW1ldGVyRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZsb3cgZ2V0RmF1bHRGbG93KCkgewotICAgICAgICByZXR1cm4gdE91dC5nZXRGYXVsdEZsb3coKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhhc2UgZ2V0RmF1bHRQaGFzZSgpIHsKLSAgICAgICAgcmV0dXJuIHRPdXQuZ2V0RmF1bHRQaGFzZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gdE91dC5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEZsb3cgZ2V0T3V0RmxvdygpIHsKLSAgICAgICAgcmV0dXJuIHRPdXQuZ2V0T3V0RmxvdygpOwotICAgIH0KLQotICAgIHB1YmxpYyBQaGFzZSBnZXRPdXRQaGFzZSgpIHsKLSAgICAgICAgcmV0dXJuIHRPdXQuZ2V0T3V0UGhhc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgZ2V0UGFyYW1ldGVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybiBSZXR1cm5zIFBhcmFtZXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyYW1ldGVyIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gdE91dC5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIEFycmF5TGlzdCBnZXRQYXJhbWV0ZXJzKCkgewotICAgICAgICByZXR1cm4gdE91dC5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIFRyYW5zcG9ydFNlbmRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgVHJhbnNwb3J0U2VuZGVyIGdldFNlbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc2VuZGVyOwotICAgIH0KLQotICAgIC8vIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhcmFtZXRlciBpcyBsb2NrZWQgYXQgYW55IGxldmVsCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJMb2NrZWQoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLSAgICAgICAgcmV0dXJuIHRPdXQuaXNQYXJhbWV0ZXJMb2NrZWQocGFyYW1ldGVyTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRGbG93KEZsb3cgZmF1bHRGbG93KSB7Ci0gICAgICAgIHRPdXQuc2V0RmF1bHRGbG93KGZhdWx0Rmxvdyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmF1bHRQaGFzZShQaGFzZSBmYXVsdFBoYXNlKSB7Ci0gICAgICAgIHRPdXQuc2V0RmF1bHRQaGFzZShmYXVsdFBoYXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdE91dC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dEZsb3coRmxvdyBvdXRGbG93KSB7Ci0gICAgICAgIHRPdXQuc2V0T3V0RmxvdyhvdXRGbG93KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRQaGFzZShQaGFzZSBvdXRQaGFzZSkgewotICAgICAgICB0T3V0LnNldE91dFBoYXNlKG91dFBoYXNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc2VuZGVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VuZGVyKFRyYW5zcG9ydFNlbmRlciBzZW5kZXIpIHsKLSAgICAgICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFRyYW5zcG9ydFJlY2VpdmVyLmphdmEgYi8xXzUvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwZTRjMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy90cmFuc3BvcnQvbG9jYWwvc3JjL29yZy9hcGFjaGUvYXhpczIvdHJhbnNwb3J0L2xvY2FsL0xvY2FsVHJhbnNwb3J0UmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NWE1MUGFyc2VyV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmJ1aWxkZXIuQnVpbGRlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydEluRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5UcmFuc3BvcnRPdXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzRW5naW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5NZXNzYWdlQ29udGV4dEJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyIHsKLSAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb25Db250ZXh0IENPTkZJR19DT05URVhUOwotICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZkNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgTG9jYWxUcmFuc3BvcnRSZWNlaXZlcihDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0KSB7Ci0gICAgICAgIGNvbmZDb250ZXh0ID0gY29uZmlnQ29udGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9jYWxUcmFuc3BvcnRSZWNlaXZlcihMb2NhbFRyYW5zcG9ydFNlbmRlciBzZW5kZXIpIHsKLSAgICAgICAgdGhpcyhDT05GSUdfQ09OVEVYVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc01lc3NhZ2UoSW5wdXRTdHJlYW0gaW4sIEVuZHBvaW50UmVmZXJlbmNlIHRvLCBTdHJpbmcgYWN0aW9uLCBPdXRwdXRTdHJlYW0gcmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICAgICAgTWVzc2FnZUNvbnRleHQgbXNnQ3R4ID0gY29uZkNvbnRleHQuY3JlYXRlTWVzc2FnZUNvbnRleHQoKTsKLSAgICAgICAgVHJhbnNwb3J0SW5EZXNjcmlwdGlvbiB0SW4gPSBjb25mQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFRyYW5zcG9ydEluKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5UUkFOU1BPUlRfTE9DQUwpOwotICAgICAgICBUcmFuc3BvcnRPdXREZXNjcmlwdGlvbiB0T3V0ID0gY29uZkNvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRUcmFuc3BvcnRPdXQoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLlRSQU5TUE9SVF9MT0NBTCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIENBVVRJT04gOiBXaGVuIHVzaW5nIExvY2FsIFRyYW5zcG9ydCBvZiBBeGlzMiwgIGNsYXNzIExvY2FsVHJhbnNwb3J0UmVjZWl2ZXIgY2hhbmdlZCB0aGUgbmFtZSBvZiBMb2NhbFRyYW5zcG9ydFNlbmRlcidzIGNsYXNzIGluIGNvbmZpZ0NvbnRleHQuCi0gICAgICAgIC8vIFdlIGVzY2FwZWQgdGhpcyBwcm9ibGVtIGJ5IHRoZSBmb2xsb3dpbmcgY29kZS4KLSAgICAgICAgTG9jYWxSZXNwb25zZVRyYW5zcG9ydE91dERlc2NyaXB0aW9uIGxvY2FsVHJhbnNwb3J0UmVzT3V0ID0gbmV3IExvY2FsUmVzcG9uc2VUcmFuc3BvcnRPdXREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICB0T3V0KTsKLSAgICAgICAgbG9jYWxUcmFuc3BvcnRSZXNPdXQuc2V0U2VuZGVyKG5ldyBMb2NhbFJlc3BvbmRlcihyZXNwb25zZSkpOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1zZ0N0eC5zZXRUcmFuc3BvcnRJbih0SW4pOwotICAgICAgICAgICAgbXNnQ3R4LnNldFRyYW5zcG9ydE91dChsb2NhbFRyYW5zcG9ydFJlc091dCk7Ci0gICAgICAgICAgICBtc2dDdHguc2V0UHJvcGVydHkoTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCwgcmVzcG9uc2UpOwotCi0gICAgICAgICAgICBtc2dDdHguc2V0VG8odG8pOwotICAgICAgICAgICAgbXNnQ3R4LnNldFdTQUFjdGlvbihhY3Rpb24pOwotICAgICAgICAgICAgbXNnQ3R4LnNldFNlcnZlclNpZGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7Ci0gICAgICAgICAgICBPTVhNTFBhcnNlcldyYXBwZXIgYnVpbGRlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlciA9IEJ1aWxkZXJVdGlsLmdldEJ1aWxkZXIoc3RyZWFtUmVhZGVyKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IChTT0FQRW52ZWxvcGUpIGJ1aWxkZXIuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIG1zZ0N0eC5zZXRFbnZlbG9wZShlbnZlbG9wZSk7Ci0KLSAgICAgICAgICAgIEF4aXNFbmdpbmUucmVjZWl2ZShtc2dDdHgpOwotICAgICAgICB9IGNhdGNoIChBeGlzRmF1bHQgZSkgewotICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGZhdWx0IGJhY2suCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VDb250ZXh0IGZhdWx0Q29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQ29udGV4dEJ1aWxkZXIuY3JlYXRlRmF1bHRNZXNzYWdlQ29udGV4dChtc2dDdHgsIGUpOwotICAgICAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRUcmFuc3BvcnRPdXQobG9jYWxUcmFuc3BvcnRSZXNPdXQpOwotICAgICAgICAgICAgICAgIGZhdWx0Q29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfT1VULCByZXNwb25zZSk7Ci0KLSAgICAgICAgICAgICAgICBBeGlzRW5naW5lLnNlbmRGYXVsdChmYXVsdENvbnRleHQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQXhpc0ZhdWx0IGF4aXNGYXVsdCkgewotICAgICAgICAgICAgICAgIC8vIGNhbid0IGhhbmRsZSB0aGlzLCBzbyBqdXN0IHRocm93IGl0Ci0gICAgICAgICAgICAgICAgdGhyb3cgYXhpc0ZhdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFRyYW5zcG9ydFNlbmRlci5qYXZhIGIvMV81L21vZHVsZXMvdHJhbnNwb3J0L2xvY2FsL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3RyYW5zcG9ydC9sb2NhbC9Mb2NhbFRyYW5zcG9ydFNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODA1MTgzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3RyYW5zcG9ydC9sb2NhbC9zcmMvb3JnL2FwYWNoZS9heGlzMi90cmFuc3BvcnQvbG9jYWwvTG9jYWxUcmFuc3BvcnRTZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQubG9jYWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5NZXNzYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlRyYW5zcG9ydE91dERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuaGFuZGxlcnMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0LlRyYW5zcG9ydFNlbmRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5UcmFuc3BvcnRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgTG9jYWxUcmFuc3BvcnRTZW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgaW1wbGVtZW50cyBUcmFuc3BvcnRTZW5kZXIgewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKExvY2FsVHJhbnNwb3J0U2VuZGVyLmNsYXNzKTsKLQotICAgIHB1YmxpYyB2b2lkIGluaXQoQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZkNvbnRleHQsIFRyYW5zcG9ydE91dERlc2NyaXB0aW9uIHRyYW5zcG9ydE91dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYW51cChNZXNzYWdlQ29udGV4dCBtc2dDb250ZXh0KSB0aHJvd3MgQXhpc0ZhdWx0IHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaW52b2tlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnQ29udGV4dCB0aGUgY3VycmVudCBNZXNzYWdlQ29udGV4dAotICAgICAqIEB0aHJvd3MgQXhpc0ZhdWx0Ci0gICAgICovCi0gICAgcHVibGljIEludm9jYXRpb25SZXNwb25zZSBpbnZva2UoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCkgdGhyb3dzIEF4aXNGYXVsdCB7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBSRVNUIGJlaGF2aW91ciwgaWYgeW91IGRlc2lyZSByZXN0IGJlYWhhdmlvdXIKLSAgICAgICAgLy8gcHV0IGEgPHBhcmFtZXRlciBuYW1lPSJkb1JFU1QiIHZhbHVlPSJ0cnVlIi8+IGF0IHRoZSBheGlzMi54bWwKLSAgICAgICAgbXNnQ29udGV4dC5zZXREb2luZ01UT00oVHJhbnNwb3J0VXRpbHMuZG9Xcml0ZU1UT00obXNnQ29udGV4dCkpOwotICAgICAgICBtc2dDb250ZXh0LnNldERvaW5nU3dBKFRyYW5zcG9ydFV0aWxzLmRvV3JpdGVTd0EobXNnQ29udGV4dCkpOwotCi0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQ7Ci0gICAgICAgIEVuZHBvaW50UmVmZXJlbmNlIGVwciA9IG1zZ0NvbnRleHQuZ2V0VG8oKTsKLQotICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIFRyYW5zcG9ydFV0aWxzLndyaXRlTWVzc2FnZShtc2dDb250ZXh0LCBvcyk7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIlNlbmRpbmcgLSAiICsgbmV3IFN0cmluZyhvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXByICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghZXByLmhhc05vbmVBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0VXRpbHMud3JpdGVNZXNzYWdlKG1zZ0NvbnRleHQsIG91dCk7Ci0gICAgICAgICAgICAgICAgZmluYWxpemVTZW5kV2l0aFRvQWRkcmVzcyhtc2dDb250ZXh0LCAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKW91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPSAoT3V0cHV0U3RyZWFtKSBtc2dDb250ZXh0LmdldFByb3BlcnR5KE1lc3NhZ2VDb250ZXh0LlRSQU5TUE9SVF9PVVQpOwotCi0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBUcmFuc3BvcnRVdGlscy53cml0ZU1lc3NhZ2UobXNnQ29udGV4dCwgb3V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF4aXNGYXVsdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJCb3RoIHRoZSBUTyBhbmQgUHJvcGVydHkgTWVzc2FnZUNvbnRleHQuVFJBTlNQT1JUX09VVCBpcyBOdWxsLCBObyB3aGVyZSB0byBzZW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBUcmFuc3BvcnRVdGlscy5zZXRSZXNwb25zZVdyaXR0ZW4obXNnQ29udGV4dCwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSW52b2NhdGlvblJlc3BvbnNlLkNPTlRJTlVFOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplU2VuZFdpdGhUb0FkZHJlc3MoTWVzc2FnZUNvbnRleHQgbXNnQ29udGV4dCwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCkKLSAgICAgICAgICAgIHRocm93cyBBeGlzRmF1bHQgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3BvbnNlID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICBMb2NhbFRyYW5zcG9ydFJlY2VpdmVyIGxvY2FsVHJhbnNwb3J0UmVjZWl2ZXIgPSBuZXcgTG9jYWxUcmFuc3BvcnRSZWNlaXZlcih0aGlzKTsKLSAgICAgICAgICAgIGxvY2FsVHJhbnNwb3J0UmVjZWl2ZXIucHJvY2Vzc01lc3NhZ2UoaW4sIG1zZ0NvbnRleHQuZ2V0VG8oKSwgbXNnQ29udGV4dC5nZXRPcHRpb25zKCkuZ2V0QWN0aW9uKCksIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3BvbnNlLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgbXNnQ29udGV4dC5zZXRQcm9wZXJ0eShNZXNzYWdlQ29udGV4dC5UUkFOU1BPUlRfSU4sIGluKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgQXhpc0ZhdWx0Lm1ha2VGYXVsdChlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9jb25mL3dlYi54bWwgYi8xXzUvbW9kdWxlcy93ZWJhcHAvY29uZi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGU5ZWM5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9jb25mL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLQotPHdlYi1hcHA+Ci0gICAgPGRpc3BsYXktbmFtZT5BcGFjaGUtQXhpczI8L2Rpc3BsYXktbmFtZT4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5BeGlzU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPkFwYWNoZS1BeGlzIFNlcnZsZXQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5heGlzMi50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPCEtLTxpbml0LXBhcmFtPi0tPgotICAgICAgICA8IS0tPHBhcmFtLW5hbWU+YXhpczIueG1sLnBhdGg8L3BhcmFtLW5hbWU+LS0+Ci0gICAgICAgIDwhLS08cGFyYW0tdmFsdWU+L1dFQi1JTkYvY29uZi9heGlzMi54bWw8L3BhcmFtLXZhbHVlPi0tPgotICAgICAgICA8IS0tPHBhcmFtLW5hbWU+YXhpczIueG1sLnVybDwvcGFyYW0tbmFtZT4tLT4KLSAgICAgICAgPCEtLTxwYXJhbS12YWx1ZT5odHRwOi8vbG9jYWxob3N0L215cmVwby9heGlzMi54bWw8L3BhcmFtLXZhbHVlPi0tPgotICAgICAgICA8IS0tPHBhcmFtLW5hbWU+YXhpczIucmVwb3NpdG9yeS5wYXRoPC9wYXJhbS1uYW1lPi0tPgotICAgICAgICA8IS0tPHBhcmFtLXZhbHVlPi9XRUItSU5GPC9wYXJhbS12YWx1ZT4tLT4KLSAgICAgICAgPCEtLTxwYXJhbS1uYW1lPmF4aXMyLnJlcG9zaXRvcnkudXJsPC9wYXJhbS1uYW1lPi0tPgotICAgICAgICA8IS0tPHBhcmFtLXZhbHVlPmh0dHA6Ly9sb2NhbGhvc3QvbXlyZXBvPC9wYXJhbS12YWx1ZT4tLT4KLSAgICAgICAgPCEtLTwvaW5pdC1wYXJhbT4tLT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkF4aXNBZG1pblNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5BcGFjaGUtQXhpcyBBeGlzQWRtaW4gU2VydmxldCAoV2ViIEFkbWluKTwvZGlzcGxheS1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz4KLSAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIud2ViYXBwLkF4aXNBZG1pblNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotICAgIAotICAgIDwhLS0gc2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5TT0FQTW9uaXRvclNlcnZpY2U8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5TT0FQTW9uaXRvclNlcnZpY2U8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmFwYWNoZS5heGlzMi5zb2FwbW9uaXRvci5zZXJ2bGV0LlNPQVBNb25pdG9yU2VydmljZTwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5TT0FQTW9uaXRvclBvcnQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+NTAwMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0IC0tPgotICAgIAotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0L0F4aXNTZXJ2bGV0PC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPiouandzPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2aWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLQotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+QXhpc0FkbWluU2VydmxldDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+L2F4aXMyLWFkbWluLyo8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotCi0gICAgPCEtLSBzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+U09BUE1vbml0b3JTZXJ2aWNlPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4vU09BUE1vbml0b3I8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nIC0tPgotICAgIAotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+aW5jPC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+dGV4dC9wbGFpbjwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotCi0gICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+Ci0gICAgICA8d2VsY29tZS1maWxlPi9heGlzMi13ZWIvaW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLQotICAgIDxlcnJvci1wYWdlPgotICAgICAgPGVycm9yLWNvZGU+NDA0PC9lcnJvci1jb2RlPgotICAgICAgPGxvY2F0aW9uPi9heGlzMi13ZWIvRXJyb3IvZXJyb3I0MDQuanNwPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGVycm9yLWNvZGU+NTAwPC9lcnJvci1jb2RlPgotICAgICAgICA8bG9jYXRpb24+L2F4aXMyLXdlYi9FcnJvci9lcnJvcjUwMC5qc3A8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9jb25mL3dlYmxvZ2ljLnhtbCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9jb25mL3dlYmxvZ2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyZjk0YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvY29uZi93ZWJsb2dpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhRE9DVFlQRSB3ZWJsb2dpYy13ZWItYXBwIFBVQkxJQyAiLS8vQkVBCi1TeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDcuMC8vRU4iCi0iaHR0cDovL3d3dy5iZWEuY29tL3NlcnZlcnMvd2xzNzAwL2R0ZC93ZWJsb2dpYzcwMC13ZWItamFyLmR0ZCI+Ci08d2VibG9naWMtd2ViLWFwcD4KLQk8Y29udGFpbmVyLWRlc2NyaXB0b3I+Ci0JCTxwcmVmZXItd2ViLWluZi1jbGFzc2VzPnRydWU8L3ByZWZlci13ZWItaW5mLWNsYXNzZXM+Ci0JPC9jb250YWluZXItZGVzY3JpcHRvcj4KLTwvd2VibG9naWMtd2ViLWFwcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvcG9tLnhtbCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTZhNGI5Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi13ZWJhcHA8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBXZWIgQXBwbGljYXRpb24gbW9kdWxlPC9uYW1lPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3dlYmFwcDwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3dlYmFwcDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81L21vZHVsZXMvd2ViYXBwPC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItamlieDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXZhMndzZGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXNwcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1mYXN0aW5mb3NldDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3czwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXhicmk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczIteG1sYmVhbnM8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItanNvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zb2FwbW9uaXRvcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPm1hcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZGRyZXNzaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnBpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPgotICAgICAgICAgICAgPGNsYXNzaWZpZXI+aW1wbDwvY2xhc3NpZmllcj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zY3JpcHRpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29yYmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmVyc2lvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDx0eXBlPmFhcjwvdHlwZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItbXRvbXBvbGljeTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5heGlzMi1qYXh3cy1tYXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV4PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPHR5cGU+bWFyPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5heGlzMjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm10b21wb2xpY3k8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5tYXI8L3R5cGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDwhLS0gQXhpczIgaGFzIGFsd2F5cyBiZWVuIHNoaXBwZWQgd2l0aCBTdW4ncyBpbXBsZW1lbnRhdGlvbnMgb2YKLSAgICAgICAgICAgICBKYXZhTWFpbCBhbmQgSkFGLCBhbHRob3VnaCBBeGlvbSBkZXBlbmRzIG9uIChhbmQgaGFzIGJlZW4gdGVzdGVkCi0gICAgICAgICAgICAgd2l0aCkgR2Vyb25pbW8ncyBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgc2hvdWxkIHByb2JhYmx5IHJlZXZhbHVhdGVkLiAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5tYWlsPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWFpbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF2YXgubWFpbC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT5heGlzMi0ke3Byb2plY3QudmVyc2lvbn08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uL2tlcm5lbC9jb25mPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qLnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwcm9qZWN0LnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItcmVwby1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jcmVhdGUtcmVwb3NpdG9yeTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dlYlJlc291cmNlcy9XRUItSU5GPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmlwU2VydmljZVZlcnNpb24+ZmFsc2U8L3N0cmlwU2VydmljZVZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdlbmVyYXRlRmlsZUxpc3RzPnRydWU8L2dlbmVyYXRlRmlsZUxpc3RzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPCEtLSBDb21waWxlIHRoZSBKU1BzIHNvIHRoYXQgc3ludGF4IGVycm9ycyBhcmUgZGV0ZWN0ZWQgZHVyaW5nIHRoZSBidWlsZC4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam8uanNwYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3BjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVJblByb2plY3Q+ZmFsc2U8L2luY2x1ZGVJblByb2plY3Q+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam8uanNwYzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcGMtY29tcGlsZXItdG9tY2F0NjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC1hbHBoYS0zPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugb25seSB3YW50IHRvIHZhbGlkYXRlIHRoZSBKU1BzLCBidXQgbm90IHRvIGluY2x1ZGUgdGhlIGNvbXBpbGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25zIGluIHRoZSBwcm9qZWN0LiBIb3dldmVyLCB0aGUgaW5jbHVkZUluUHJvamVjdCBwYXJhbWV0ZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGpzcGMtbWF2ZW4tcGx1Z2luIHNlZW1zIHRvIGJlIGJyb2tlbiAodGhlIGNsYXNzZXMgYXJlIGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZCB0byB0aGUgdGFyZ2V0L2NsYXNzZXMgZm9sZGVyKSBhbmQgbWF2ZW4td2FyLXBsdWdpbiBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYW4gb3B0aW9uIHRvIGV4Y2x1ZGUgc3BlY2lmaWMgY2xhc3NlcyBvciBwYWNrYWdlcy4gVGhlcmVmb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gZGVsZXRlIHRoZSBmaWxlcyBhZnRlciBjb21waWxhdGlvbi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVsZXRlIGRpcj0iJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vanNwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBXZSBjb3B5IHRoZSBheGlzMi54bWwgZmlsZSB0byB0aGUgdGFyZ2V0L3dlYlJlc291cmNlcyBkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluc3RlYWQgb2YgbGV0dGluZyB0aGUgbWF2ZW4td2FyLXBsdWdpbiBkbyB0aGUgam9iKSBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGlzIGZvdW5kIGJ5IG1hdmVuLWpldHR5LXBsdWdpbi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y29weS1heGlzMi14bWw8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93ZWJSZXNvdXJjZXMvV0VCLUlORi9jb25mPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlcz4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4va2VybmVsL2NvbmY8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5heGlzMi54bWw8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnVucGFjay1kZXBlbmRlbmNpZXM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93ZWJSZXNvdXJjZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZUFydGlmYWN0SWRzPmF4aXMyLXNvYXBtb25pdG9yLXNlcnZsZXQ8L2luY2x1ZGVBcnRpZmFjdElkcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+b3JnL2FwYWNoZS9heGlzMi9zb2FwbW9uaXRvci9hcHBsZXQvKiovKi5jbGFzczwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8d2FyTmFtZT5heGlzMjwvd2FyTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YWRkTWF2ZW5EZXNjcmlwdG9yPmZhbHNlPC9hZGRNYXZlbkRlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgICAgICAgICAgPHdlYlhtbD5jb25mL3dlYi54bWw8L3dlYlhtbD4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBsaXN0IGFzIGluIG1vZHVsZXMvZGlzdHJpYnV0aW9uL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi1hc3NlbWJseS54bWwgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxwYWNrYWdpbmdFeGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIFdFQi1JTkYvbGliL2dlcm9uaW1vLWFjdGl2YXRpb25fMS4xX3NwZWMtKi5qYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBXRUItSU5GL2xpYi9nZXJvbmltby1qYXZhbWFpbF8xLjRfc3BlYy0qLmphciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdFQi1JTkYvbGliL3NwcmluZy1iZWFucy0qLmphciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdFQi1JTkYvbGliL3NwcmluZy1jb250ZXh0LSouamFyLAotICAgICAgICAgICAgICAgICAgICAgICAgV0VCLUlORi9saWIvc3ByaW5nLWNvcmUtKi5qYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBXRUItSU5GL2xpYi9zcHJpbmctd2ViLSouamFyLAotICAgICAgICAgICAgICAgICAgICAgICAgV0VCLUlORi9saWIvYW50LSouamFyLAotICAgICAgICAgICAgICAgICAgICAgICAgV0VCLUlORi9saWIvYW50LWxhdW5jaGVyLSouamFyLAotICAgICAgICAgICAgICAgICAgICAgICAgV0VCLUlORi9saWIvYW9wYWxsaWFuY2UtKi5qYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBXRUItSU5GL2xpYi9ic2YtKi5qYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBXRUItSU5GL2xpYi9GYXN0SW5mb3NldC0qLmphciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdFQi1JTkYvbGliL2pzLSouamFyCi0gICAgICAgICAgICAgICAgICAgIDwvcGFja2FnaW5nRXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDx3ZWJSZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93ZWJSZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9Ly4uLy4uL2xlZ2FsPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+V0VCLUlORi9saWI8L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+c2VydmxldCoudHh0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8L3dlYlJlc291cmNlcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuMS4yMjwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHdlYlhtbD5jb25mL3dlYi54bWw8L3dlYlhtbD4KLSAgICAgICAgICAgICAgICAgICAgPHdlYkFwcENvbmZpZz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vYXhpczI8L2NvbnRleHRQYXRoPgotICAgICAgICAgICAgICAgICAgICAgICAgPGJhc2VSZXNvdXJjZSBpbXBsZW1lbnRhdGlvbj0ib3JnLm1vcnRiYXkucmVzb3VyY2UuUmVzb3VyY2VDb2xsZWN0aW9uIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VzQXNDU1Y+c3JjL21haW4vd2ViYXBwLCR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dlYlJlc291cmNlczwvcmVzb3VyY2VzQXNDU1Y+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2Jhc2VSZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPC93ZWJBcHBDb25maWc+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NjcmlwdHMvYnVpbGQueG1sIGIvMV81L21vZHVsZXMvd2ViYXBwL3NjcmlwdHMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDg0ZTE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zY3JpcHRzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgYmFzZWRpcj0iLi4vIiBkZWZhdWx0PSJjcmVhdGUud2FyIj4KLQk8cHJvcGVydHkgbmFtZT0iZGlzdCIgdmFsdWU9ImRpc3QiIC8+Ci0JPHByb3BlcnR5IG5hbWU9InRlbXAiIHZhbHVlPSIke2Rpc3R9L3RlbXAiIC8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke2Rpc3R9IiAvPgotCQk8bWtkaXIgZGlyPSIke3RlbXB9IiAvPgotCQk8Y29weSB0b0Rpcj0iJHt0ZW1wfSI+Ci0JCQk8ZmlsZXNldCBkaXI9IndlYmFwcCI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKioiIC8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKiovd2ViLnhtbCIvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBkZXBlbmRzPSJpbml0IiBuYW1lPSJwcmVwYXJlLnJlcG8iPgotCQkKLQkJPCEtLSBDb3B5aW5nIHRoZSBheGlzMiByZXBvc2l0b3J5IGZyb20gLi4vcmVwb3NpdG9yeSAtLT4KLQkJPGNvcHkgdG9EaXI9IiR7dGVtcH0vV0VCLUlORiI+Ci0JCQk8ZmlsZXNldCBkaXI9InJlcG9zaXRvcnkiPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqLyoqIiAvPgotCQkJPC9maWxlc2V0PgotCQk8L2NvcHk+Ci0KLQkJPCEtLSBDcmVhdGluZyB0aGUgc2VydmljZXMubGlzdCAtLT4KLQkJPHBhdGggaWQ9InNlcnZpY2VzLmFyY2hpdmVzIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHt0ZW1wfS9XRUItSU5GL3NlcnZpY2VzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmFhciIgLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9wYXRoPgotCQk8cGF0aGNvbnZlcnQgcGF0aHNlcD0iJHtsaW5lLnNlcGFyYXRvcn0iIHByb3BlcnR5PSJlY2hvLnNlcnZpY2VzLmFyY2hpdmVzIiByZWZpZD0ic2VydmljZXMuYXJjaGl2ZXMiPgotCQkJPGZsYXR0ZW5tYXBwZXIgLz4KLQkJPC9wYXRoY29udmVydD4KLQkJPGVjaG8gZmlsZT0iJHt0ZW1wfS9XRUItSU5GL3NlcnZpY2VzL3NlcnZpY2VzLmxpc3QiIG1lc3NhZ2U9IiR7ZWNoby5zZXJ2aWNlcy5hcmNoaXZlc30iIC8+Ci0KLQkJPCEtLSBDcmVhdGluZyB0aGUgbW9kdWxlcy5saXN0IC0tPgotCQk8cGF0aCBpZD0ibW9kdWxlcy5hcmNoaXZlcyI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7dGVtcH0vV0VCLUlORi9tb2R1bGVzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLm1hciIgLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9wYXRoPgotCQk8cGF0aGNvbnZlcnQgcGF0aHNlcD0iJHtsaW5lLnNlcGFyYXRvcn0iIHByb3BlcnR5PSJlY2hvLm1vZHVsZXMuYXJjaGl2ZXMiIHJlZmlkPSJtb2R1bGVzLmFyY2hpdmVzIj4KLQkJCTxmbGF0dGVubWFwcGVyIC8+Ci0JCTwvcGF0aGNvbnZlcnQ+Ci0JCTxlY2hvIGZpbGU9IiR7dGVtcH0vV0VCLUlORi9tb2R1bGVzL21vZHVsZXMubGlzdCIgbWVzc2FnZT0iJHtlY2hvLm1vZHVsZXMuYXJjaGl2ZXN9IiAvPgotCi0JCTwhLS0gQ29weWluZyB0aGUgYXhpczIueG1sIGZyb20gLi4vY29uZiAtLT4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wfS9XRUItSU5GL2NvbmYiIC8+Ci0JCTxjb3B5IGZpbGU9ImNvbmYvYXhpczIueG1sIiB0b0Rpcj0iJHt0ZW1wfS9XRUItSU5GL2NvbmYiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBkZXBlbmRzPSJpbml0LHByZXBhcmUucmVwbyIgbmFtZT0iY3JlYXRlLndhciI+Ci0JCTx3YXIgZGVzdGZpbGU9ImRpc3QvYXhpczIud2FyIiB3ZWJ4bWw9IndlYmFwcC9XRUItSU5GL3dlYi54bWwiPgotCQkJPGxpYiBkaXI9ImxpYiI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKioiIC8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iKipzZXJ2bGV0KioiIC8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iYW50Ki5qYXIiIC8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0iYXhpczItYWRiLWNvZGVnZW4qLmphciIvPgotCQkJCTxleGNsdWRlIG5hbWU9ImF4aXMyLWNvZGVnZW4qLmphciIvPgotCQkJCTxleGNsdWRlIG5hbWU9ImppYngtYmluZCouamFyIi8+Ci0JCQk8L2xpYj4KLQkJCTx3ZWJpbmYgZGlyPSIke3RlbXB9L1dFQi1JTkYiIC8+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7dGVtcH0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IioqL2F4aXMyLXdlYi8qKiIgLz4KLQkJCTwvZmlsZXNldD4KLQkJPC93YXI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXB9IiAvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3dlYmFwcC9BZG1pbkFnZW50LmphdmEgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3dlYmFwcC9BZG1pbkFnZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YTQxNWMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9heGlzMi93ZWJhcHAvQWRtaW5BZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi53ZWJhcHA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlBoYXNlc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQWJzdHJhY3RBZ2VudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5GaWxlSXRlbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuZGlzay5EaXNrRmlsZUl0ZW1GYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLnNlcnZsZXQuU2VydmxldEZpbGVVcGxvYWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuc2VydmxldC5TZXJ2bGV0UmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFByb3ZpZGVzIG1ldGhvZHMgdG8gcHJvY2VzcyBheGlzMiBhZG1pbiByZXF1ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFkbWluQWdlbnQgZXh0ZW5kcyBBYnN0cmFjdEFnZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coQWJzdHJhY3RBZ2VudC5jbGFzcyk7Ci0gICAgLyoqCi0gICAgICogRmllbGQgTElTVF9NVUxUSVBMRV9TRVJWSUNFX0pTUF9OQU1FCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfU0VSVklDRV9HUk9VUF9KU1AgPSAiTGlzdFNlcnZpY2VHcm91cC5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1NFUlZJQ0VTX0pTUF9OQU1FID0gImxpc3RTZXJ2aWNlLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfU0lOR0xFX1NFUlZJQ0VTX0pTUF9OQU1FID0gImxpc3RTaW5nbGVTZXJ2aWNlLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9TRVJWSUNFX0pTUF9OQU1FID0gIlNlbGVjdFNlcnZpY2UuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5fQUNUSVZBVEVfU0VSVklDRV9KU1BfTkFNRSA9ICJJbkFjdGl2YXRlU2VydmljZS5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkFURV9TRVJWSUNFX0pTUF9OQU1FID0gIkFjdGl2YXRlU2VydmljZS5qc3AiOwotCi0gICAgLyoqCi0gICAgICogRmllbGQgTElTVF9TSU5HTEVfU0VSVklDRV9KU1BfTkFNRQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1BIQVNFU19KU1BfTkFNRSA9ICJ2aWV3cGhhc2VzLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfR0xPQUJMTFlfRU5HQUdFRF9NT0RVTEVTX0pTUF9OQU1FID0gImdsb2JhbE1vZHVsZXMuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9BVkFJTEFCTEVfTU9EVUxFU19KU1BfTkFNRSA9ICJsaXN0TW9kdWxlcy5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0lOR19NT0RVTEVfVE9fU0VSVklDRV9KU1BfTkFNRSA9ICJlbmdhZ2luZ3RvYXNlcnZpY2UuanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5HQUdJTkdfTU9EVUxFX1RPX1NFUlZJQ0VfR1JPVVBfSlNQX05BTUUgPQotICAgICAgICAgICAgIkVuZ2FnZVRvU2VydmljZUdyb3VwLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOR0FHSU5HX01PRFVMRV9HTE9CQUxMWV9KU1BfTkFNRSA9ICJlbmdhZ2luZ2dsb2JhbGx5LmpzcCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fSlNQX05BTUUgPSAiYWRtaW4uanNwIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19HTE9CQUxfSEFORExFUlNfSlNQX05BTUUgPSAiVmlld0dsb2JhbEhhbmRsZXJzLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfU0VSVklDRV9IQU5ETEVSU19KU1BfTkFNRSA9ICJWaWV3U2VydmljZUhhbmRsZXJzLmpzcCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUEFSQV9FRElUX0pTUF9OQU1FID0gIlNlcnZpY2VQYXJhRWRpdC5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkdBR0VfVE9fT1BFUkFUSU9OX0pTUF9OQU1FID0gImVuZ2FnaW5ndG9hbm9wZXJhdGlvbi5qc3AiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9KU1BfTkFNRSA9ICJMb2dpbi5qc3AiOwotCi0gICAgcHJpdmF0ZSBGaWxlIHNlcnZpY2VEaXI7Ci0KLSAgICBwdWJsaWMgQWRtaW5BZ2VudChDb25maWd1cmF0aW9uQ29udGV4dCBhQ29uZmlnQ29udGV4dCkgewotICAgICAgICBzdXBlcihhQ29uZmlnQ29udGV4dCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFJlcG9zaXRvcnkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSByZXBvRGlyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRSZXBvc2l0b3J5KCkuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlRGlyID0gbmV3IEZpbGUocmVwb0RpciwgInNlcnZpY2VzIik7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZXJ2aWNlRGlyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VEaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmluZm8oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZShIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIFdlIGZvcndhcmQgdG8gbG9naW4gcGFnZSBpZiBheGlzMiBzZWN1cml0eSBpcyBlbmFibGVkCi0gICAgICAgIC8vIGFuZCB0aGUgdXNlciBpcyBub3QgYXV0aG9yaXplZAotICAgICAgICAvLyBUT0RPIEZpeCB3b3JrYXJvdW5kIGZvciBsb2dpbiB0ZXN0Ci0gICAgICAgIGlmIChheGlzU2VjdXJpdHlFbmFibGVkKCkgJiYgYXV0aG9yaXphdGlvblJlcXVpcmVkKGh0dHBTZXJ2bGV0UmVxdWVzdCkpIHsKLSAgICAgICAgICAgIHJlbmRlclZpZXcoTE9HSU5fSlNQX05BTUUsIGh0dHBTZXJ2bGV0UmVxdWVzdCwgaHR0cFNlcnZsZXRSZXNwb25zZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdXBlci5oYW5kbGUoaHR0cFNlcnZsZXRSZXF1ZXN0LCBodHRwU2VydmxldFJlc3BvbnNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NJbmRleChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlbmRlclZpZXcoQURNSU5fSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICAvLyBzdXBwb3J0ZWQgd2ViIG9wZXJhdGlvbnMKLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NVcGxvYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaGFzSG90RGVwbG95bWVudCA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBhcmFtZXRlclZhbHVlKCJob3RkZXBsb3ltZW50Iik7Ci0gICAgICAgIFN0cmluZyBoYXNIb3RVcGRhdGUgPQotICAgICAgICAgICAgICAgIChTdHJpbmcpIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRQYXJhbWV0ZXJWYWx1ZSgiaG90dXBkYXRlIik7Ci0gICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImhvdERlcGxveW1lbnQiLCAoaGFzSG90RGVwbG95bWVudC5lcXVhbHMoInRydWUiKSkgPyAiZW5hYmxlZCIKLSAgICAgICAgICAgICAgICA6ICJkaXNhYmxlZCIpOwotICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJob3RVcGRhdGUiLCAoaGFzSG90VXBkYXRlLmVxdWFscygidHJ1ZSIpKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotICAgICAgICBSZXF1ZXN0Q29udGV4dCByZXFDb250ZXh0ID0gbmV3IFNlcnZsZXRSZXF1ZXN0Q29udGV4dChyZXEpOwotCi0gICAgICAgIGJvb2xlYW4gaXNNdWx0aXBhcnQgPSBTZXJ2bGV0RmlsZVVwbG9hZC5pc011bHRpcGFydENvbnRlbnQocmVxQ29udGV4dCk7Ci0gICAgICAgIGlmIChpc011bHRpcGFydCkgewotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgZmFjdG9yeSBmb3IgZGlzay1iYXNlZCBmaWxlIGl0ZW1zCi0gICAgICAgICAgICAgICAgRmlsZUl0ZW1GYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGlza0ZpbGVJdGVtRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIGEgbmV3IGZpbGUgdXBsb2FkIGhhbmRsZXIKLSAgICAgICAgICAgICAgICBTZXJ2bGV0RmlsZVVwbG9hZCB1cGxvYWQgPSBuZXcgU2VydmxldEZpbGVVcGxvYWQoZmFjdG9yeSk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpdGVtcyA9IHVwbG9hZC5wYXJzZVJlcXVlc3QocmVxKTsKLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHRoZSB1cGxvYWRlZCBpdGVtcwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpdGVtcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlSXRlbSBpdGVtID0gKEZpbGVJdGVtKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRm9ybUZpZWxkKCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gaXRlbS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZUV4dGVzaW9uID0gZmlsZU5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlRXh0ZXNpb24gPSBmaWxlRXh0ZXNpb24udG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGZpbGVFeHRlc2lvbi5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGVFeHRlc2lvbi5lbmRzV2l0aCgiLmFhciIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJmYWlsdXJlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiY2F1c2UiLCAiVW5zdXBwb3J0ZWQgZmlsZSB0eXBlICIgKyBmaWxlRXh0ZXNpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZU9ubHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmluZGV4T2YoIlxcIikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lT25seSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIikgKyAxLCBmaWxlTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZU9ubHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZigiXFwiKSArIDEsIGZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgdXBsb2FkZWRGaWxlID0gbmV3IEZpbGUoc2VydmljZURpciwgZmlsZU5hbWVPbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLndyaXRlKHVwbG9hZGVkRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgInN1Y2Nlc3MiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJmaWxlbmFtZSIsIGZpbGVOYW1lT25seSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJmYWlsdXJlIik7Ci0gICAgICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiY2F1c2UiLCBlLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZW5kZXJWaWV3KCJ1cGxvYWQuanNwIiwgcmVxLCByZXMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ2luKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gcmVxLmdldFBhcmFtZXRlcigidXNlck5hbWUiKTsKLSAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gcmVxLmdldFBhcmFtZXRlcigicGFzc3dvcmQiKTsKLQotICAgICAgICBpZiAoKHVzZXJuYW1lID09IG51bGwpIHx8IChwYXNzd29yZCA9PSBudWxsKSB8fCB1c2VybmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMAotICAgICAgICAgICAgICAgIHx8IHBhc3N3b3JkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJlcnJvck1lc3NhZ2UiLCAiSW52YWxpZCBhdXRoIGNyZWRlbnRpYWxzISIpOwotICAgICAgICAgICAgcmVuZGVyVmlldyhMT0dJTl9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFkbWluVXNlck5hbWUgPSAoU3RyaW5nKSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIENvbnN0YW50cy5VU0VSX05BTUUpLmdldFZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyBhZG1pblBhc3N3b3JkID0gKFN0cmluZykgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBDb25zdGFudHMuUEFTU1dPUkQpLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHVzZXJuYW1lLmVxdWFscyhhZG1pblVzZXJOYW1lKSAmJiBwYXNzd29yZC5lcXVhbHMoYWRtaW5QYXNzd29yZCkpIHsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5MT0dHRUQsICJZZXMiKTsKLSAgICAgICAgICAgIHJlbmRlclZpZXcoQURNSU5fSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoImVycm9yTWVzc2FnZSIsICJJbnZhbGlkIGF1dGggY3JlZGVudGlhbHMhIik7Ci0gICAgICAgICAgICByZW5kZXJWaWV3KExPR0lOX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRWRpdFNlcnZpY2VQYXJhKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc1NlcnZpY2UiKTsKLSAgICAgICAgaWYgKHJlcS5nZXRQYXJhbWV0ZXIoImNoYW5nZVBhcmEiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBeGlzU2VydmljZSBzZXJ2aWNlID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzZXJ2aWNlX3BhcmEgPSBzZXJ2aWNlLmdldFBhcmFtZXRlcnMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZV9wYXJhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBzZXJ2aWNlX3BhcmEuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYSA9IHJlcS5nZXRQYXJhbWV0ZXIoc2VydmljZU5hbWUgKyAiXyIgKyBwYXJhbWV0ZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5hZGRQYXJhbWV0ZXIobmV3IFBhcmFtZXRlcihwYXJhbWV0ZXIuZ2V0TmFtZSgpLCBwYXJhKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcF9uYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBvcGVyYXRpb25fcGFyYSA9IGF4aXNPcGVyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9uX3BhcmEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBvcGVyYXRpb25fcGFyYS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYSA9IHJlcS5nZXRQYXJhbWV0ZXIob3BfbmFtZSArICJfIiArIHBhcmFtZXRlci5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzT3BlcmF0aW9uLmFkZFBhcmFtZXRlcihuZXcgUGFyYW1ldGVyKHBhcmFtZXRlci5nZXROYW1lKCksIHBhcmEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7Ci0gICAgICAgICAgICByZXEuc2V0QXR0cmlidXRlKCJzdGF0dXMiLCAiUGFyYW1ldGVycyBDaGFuZ2VkIFN1Y2Nlc3NmdWxseS4iKTsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkucmVtb3ZlQXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2VUZW1wID0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VGb3JBY3RpdmF0aW9uKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlVGVtcC5pc0FjdGl2ZSgpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJTZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIgaXMgbm90IGFuIGFjdGl2ZSBzZXJ2aWNlIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiBcbiBPbmx5IHBhcmFtZXRlcnMgb2YgYWN0aXZlIHNlcnZpY2VzIGNhbiBiZSBlZGl0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVuZGVyVmlldyhTRVJWSUNFX1BBUkFfRURJVF9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFbmdhZ2luZ0dsb2JhbGx5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBtb2R1bGVzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZXMoKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCwgbW9kdWxlcyk7Ci0KLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJtb2R1bGVzIik7Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMsIG51bGwpOwotCi0gICAgICAgIGlmIChtb2R1bGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmVuZ2FnZU1vZHVsZShtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lICsgIiBtb2R1bGUgZW5nYWdlZCBnbG9iYWxseSBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgibW9kdWxlcyIsIG51bGwpOwotICAgICAgICByZW5kZXJWaWV3KEVOR0FHSU5HX01PRFVMRV9HTE9CQUxMWV9KU1BfTkFNRSwgcmVxLCByZXMpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RPcGVyYXRpb25zKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaE1hcCBtb2R1bGVzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZXMoKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCwgbW9kdWxlcyk7Ci0KLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJtb2R1bGVzIik7Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMsIG51bGwpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgibW9kdWxlcyIsIG51bGwpOwotCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoImF4aXNTZXJ2aWNlIik7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJzZXJ2aWNlIiwgc2VydmljZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VydmljZU5hbWUgPSAoU3RyaW5nKSByZXEuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZSgic2VydmljZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgQ29uc3RhbnRzLk9QRVJBVElPTl9NQVAsCi0gICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2Uoc2VydmljZU5hbWUpLmdldE9wZXJhdGlvbnMoKSk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLCBudWxsKTsKLQotICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoImF4aXNPcGVyYXRpb24iKTsKLQotICAgICAgICBpZiAoKHNlcnZpY2VOYW1lICE9IG51bGwpICYmIChtb2R1bGVOYW1lICE9IG51bGwpICYmIChvcGVyYXRpb25OYW1lICE9IG51bGwpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb2QgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lKS5nZXRPcGVyYXRpb24obmV3IFFOYW1lKG9wZXJhdGlvbk5hbWUpKTsKLQotICAgICAgICAgICAgICAgIG9kLmVuZ2FnZU1vZHVsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNb2R1bGUobW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbW9kdWxlIGVuZ2FnZWQgdG8gdGhlIG9wZXJhdGlvbiBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgib3BlcmF0aW9uIiwgbnVsbCk7Ci0gICAgICAgIHJlbmRlclZpZXcoRU5HQUdFX1RPX09QRVJBVElPTl9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFbmdhZ2VUb1NlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TW9kdWxlcygpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLCBtb2R1bGVzKTsKLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIm1vZHVsZXMiKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgbnVsbCk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJtb2R1bGVzIiwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc1NlcnZpY2UiKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgbnVsbCk7Ci0KLSAgICAgICAgaWYgKChzZXJ2aWNlTmFtZSAhPSBudWxsKSAmJiAobW9kdWxlTmFtZSAhPSBudWxsKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSkuZW5nYWdlTW9kdWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldE1vZHVsZShtb2R1bGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtb2R1bGUgZW5nYWdlZCB0byB0aGUgc2VydmljZSBzdWNjZXNzZnVsbHkiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgYXhpc0ZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgiYXhpc1NlcnZpY2UiLCBudWxsKTsKLSAgICAgICAgcmVuZGVyVmlldyhFTkdBR0lOR19NT0RVTEVfVE9fU0VSVklDRV9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NFbmdhZ2VUb1NlcnZpY2VHcm91cChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhc2hNYXAgbW9kdWxlcyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRNb2R1bGVzKCk7Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVAsIG1vZHVsZXMpOwotCi0gICAgICAgIEl0ZXJhdG9yIHNlcnZpY2VzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VHcm91cHMoKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9HUk9VUF9NQVAsIHNlcnZpY2VzKTsKLQotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoIm1vZHVsZXMiKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgbnVsbCk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJtb2R1bGVzIiwgbnVsbCk7Ci0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigiYXhpc1NlcnZpY2UiKTsKLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUywgbnVsbCk7Ci0KLSAgICAgICAgaWYgKChzZXJ2aWNlTmFtZSAhPSBudWxsKSAmJiAobW9kdWxlTmFtZSAhPSBudWxsKSkgewotICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2VHcm91cChzZXJ2aWNlTmFtZSkuZW5nYWdlTW9kdWxlKAotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TW9kdWxlKG1vZHVsZU5hbWUpKTsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5FTkdBR0VfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbW9kdWxlIGVuZ2FnZWQgdG8gdGhlIHNlcnZpY2UgZ3JvdXAgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgiYXhpc1NlcnZpY2UiLCBudWxsKTsKLSAgICAgICAgcmVuZGVyVmlldyhFTkdBR0lOR19NT0RVTEVfVE9fU0VSVklDRV9HUk9VUF9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ291dChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuaW52YWxpZGF0ZSgpOwotICAgICAgICByZW5kZXJWaWV3KCJpbmRleC5qc3AiLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc3ZpZXdTZXJ2aWNlR3JvdXBDb25ldHh0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSByZXEuZ2V0UGFyYW1ldGVyKCJUWVBFIik7Ci0gICAgICAgIFN0cmluZyBzZ0lEID0gcmVxLmdldFBhcmFtZXRlcigiSUQiKTsKLSAgICAgICAgU2VydmljZUdyb3VwQ29udGV4dCBzZ0NvbnRleHQgPSBjb25maWdDb250ZXh0LmdldFNlcnZpY2VHcm91cENvbnRleHQoc2dJRCk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJTZXJ2aWNlR3JvdXBDb250ZXh0IixzZ0NvbnRleHQpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgiVFlQRSIsdHlwZSk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKCJDb25maWd1cmF0aW9uQ29udGV4dCIsY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIHJlbmRlclZpZXcoInZpZXdTZXJ2aWNlR3JvdXBDb250ZXh0LmpzcCIsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzdmlld1NlcnZpY2VDb250ZXh0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSByZXEuZ2V0UGFyYW1ldGVyKCJUWVBFIik7Ci0gICAgICAgIFN0cmluZyBzZ0lEID0gcmVxLmdldFBhcmFtZXRlcigiUElEIik7Ci0gICAgICAgIFN0cmluZyBJRCA9IHJlcS5nZXRQYXJhbWV0ZXIoIklEIik7Ci0gICAgICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDb250ZXh0ID0gY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0KHNnSUQpOwotICAgICAgICBpZiAoc2dDb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBzZ0NvbnRleHQuZ2V0RGVzY3JpcHRpb24oKS5nZXRTZXJ2aWNlKElEKTsKLSAgICAgICAgICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gc2dDb250ZXh0LmdldFNlcnZpY2VDb250ZXh0KHNlcnZpY2UpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiU2VydmljZUNvbnRleHQiLHNlcnZpY2VDb250ZXh0KTsKLSAgICAgICAgICAgIHJlcS5zZXRBdHRyaWJ1dGUoIlRZUEUiLHR5cGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiU2VydmljZUNvbnRleHQiLG51bGwpOwotICAgICAgICAgICAgcmVxLnNldEF0dHJpYnV0ZSgiVFlQRSIsdHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVuZGVyVmlldygidmlld1NlcnZpY2VDb250ZXh0LmpzcCIsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzU2VsZWN0U2VydmljZVBhcmFFZGl0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFTEVDVF9TRVJWSUNFX1RZUEUsICJTRVJWSUNFX1BBUkFNRVRFUiIpOwotICAgICAgICByZW5kZXJWaWV3KFNFTEVDVF9TRVJWSUNFX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RPcGVyYXRpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VMRUNUX1NFUlZJQ0VfVFlQRSwgIk1PRFVMRSIpOwotCi0gICAgICAgIHJlbmRlclZpZXcoU0VMRUNUX1NFUlZJQ0VfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQWN0aXZhdGVTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlcS5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoImF4aXNTZXJ2aWNlIik7Ci0gICAgICAgICAgICBTdHJpbmcgdHVybm9uID0gcmVxLmdldFBhcmFtZXRlcigidHVybm9uIik7Ci0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh0dXJub24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc3RhcnRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgcmVuZGVyVmlldyhBQ1RJVkFURV9TRVJWSUNFX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0RlYWN0aXZhdGVTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlcS5nZXRQYXJhbWV0ZXIoInN1Ym1pdCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHJlcS5nZXRQYXJhbWV0ZXIoImF4aXNTZXJ2aWNlIik7Ci0gICAgICAgICAgICBTdHJpbmcgdHVybm9mZiA9IHJlcS5nZXRQYXJhbWV0ZXIoInR1cm5vZmYiKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHR1cm5vZmYgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuc3RvcFNlcnZpY2Uoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3B1bGF0ZVNlc3Npb25JbmZvcm1hdGlvbihyZXEpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlbmRlclZpZXcoSU5fQUNUSVZBVEVfU0VSVklDRV9KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc1ZpZXdHbG9iYWxIYW5kbGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5HTE9CQUxfSEFORExFUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKSk7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhWSUVXX0dMT0JBTF9IQU5ETEVSU19KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NWaWV3U2VydmljZUhhbmRsZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2UgPSByZXEuZ2V0UGFyYW1ldGVyKCJheGlzU2VydmljZSIpOwotCi0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0hBTkRMRVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFNlcnZpY2Uoc2VydmljZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVuZGVyVmlldyhWSUVXX1NFUlZJQ0VfSEFORExFUlNfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NMaXN0UGhhc2VzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgUGhhc2VzSW5mbyBpbmZvID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldFBoYXNlc0luZm8oKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlBIQVNFX0xJU1QsIGluZm8pOwotICAgICAgICByZW5kZXJWaWV3KExJU1RfUEhBU0VTX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RTZXJ2aWNlR3JvdXBzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgSXRlcmF0b3Igc2VydmljZUdyb3VwcyA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRTZXJ2aWNlR3JvdXBzKCk7Ci0gICAgICAgIHBvcHVsYXRlU2Vzc2lvbkluZm9ybWF0aW9uKHJlcSk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCwgc2VydmljZUdyb3Vwcyk7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhMSVNUX1NFUlZJQ0VfR1JPVVBfSlNQLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcG9wdWxhdGVTZXNzaW9uSW5mb3JtYXRpb24ocmVxKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVSUk9SX1NFUlZJQ0VfTUFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0RmF1bHR5U2VydmljZXMoKSk7Ci0KLSAgICAgICAgcmVuZGVyVmlldyhMSVNUX1NFUlZJQ0VTX0pTUF9OQU1FLCByZXEsIHJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xpc3RTaW5nbGVTZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklTX0ZBVUxUWSwgIiIpOyAvL0NsZWFyaW5nIG91dCBhbnkgb2xkIHZhbHVlcy4KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigic2VydmljZU5hbWUiKTsKLSAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0U2VydmljZShzZXJ2aWNlTmFtZSk7Ci0gICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0lOR0xFX1NFUlZJQ0UsIHNlcnZpY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJlbmRlclZpZXcoTElTVF9TSU5HTEVfU0VSVklDRVNfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NMaXN0Q29udGV4dHMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuQ09ORklHX0NPTlRFWFQsIGNvbmZpZ0NvbnRleHQpOwotICAgICAgICByZW5kZXJWaWV3KCJWaWV3Q29udGV4dHMuanNwIiwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NnbG9iYWxNb2R1bGVzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICAgICAgQ29sbGVjdGlvbiBtb2R1bGVzID0gY29uZmlnQ29udGV4dC5nZXRBeGlzQ29uZmlndXJhdGlvbigpLmdldEVuZ2FnZWRNb2R1bGVzKCk7Ci0KLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVAsIG1vZHVsZXMpOwotCi0gICAgICAgIHJlbmRlclZpZXcoTElTVF9HTE9BQkxMWV9FTkdBR0VEX01PRFVMRVNfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGlzdE1vZHVsZXMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0TW9kdWxlcygpOwotCi0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLCBtb2R1bGVzKTsKLSAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVSUk9SX01PRFVMRV9NQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKS5nZXRGYXVsdHlNb2R1bGVzKCkpOwotCi0gICAgICAgIHJlbmRlclZpZXcoTElTVF9BVkFJTEFCTEVfTU9EVUxFU19KU1BfTkFNRSwgcmVxLCByZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NkaXNlbmdhZ2VNb2R1bGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdHlwZSA9IHJlcS5nZXRQYXJhbWV0ZXIoInR5cGUiKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVxLmdldFBhcmFtZXRlcigic2VydmljZU5hbWUiKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSByZXEuZ2V0UGFyYW1ldGVyKCJtb2R1bGUiKTsKLSAgICAgICAgQXhpc0NvbmZpZ3VyYXRpb24gYXhpc0NvbmZpZ3VyYXRpb24gPSBjb25maWdDb250ZXh0LmdldEF4aXNDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgIEF4aXNTZXJ2aWNlIHNlcnZpY2UgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRTZXJ2aWNlKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgQXhpc01vZHVsZSBtb2R1bGUgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGUobW9kdWxlTmFtZSk7Ci0gICAgICAgIGlmICh0eXBlLmVxdWFscygib3BlcmF0aW9uIikpIHsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlLmlzRW5nYWdlZChtb2R1bGUuZ2V0TmFtZSgpKSB8fAotICAgICAgICAgICAgICAgICAgICBheGlzQ29uZmlndXJhdGlvbi5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgIkNhbiBub3QgZGlzZW5nYWdlIG1vZHVsZSAiICsgbW9kdWxlTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiLiBUaGlzIG1vZHVsZSBpcyBlbmdhZ2VkIGF0IGEgaGlnaGVyIGxldmVsLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BOYW1lID0gcmVxLmdldFBhcmFtZXRlcigib3BlcmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBvcCA9IHNlcnZpY2UuZ2V0T3BlcmF0aW9uKG5ldyBRTmFtZShvcE5hbWUpKTsKLSAgICAgICAgICAgICAgICBvcC5kaXNlbmdhZ2VNb2R1bGUobW9kdWxlKTsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXR0cmlidXRlKCJzdGF0dXMiLCAiTW9kdWxlICIgKyBtb2R1bGVOYW1lICsgIiB3YXMgZGlzZW5nYWdlZCBmcm9tICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uICIgKyBvcE5hbWUgKyAiIGluIHNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIi4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChheGlzQ29uZmlndXJhdGlvbi5pc0VuZ2FnZWQobW9kdWxlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXEuZ2V0U2Vzc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXR0cmlidXRlKCJzdGF0dXMiLCAiQ2FuIG5vdCBkaXNlbmdhZ2UgbW9kdWxlICIgKyBtb2R1bGVOYW1lICsgIi4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG1vZHVsZSBpcyBlbmdhZ2VkIGF0IGEgaGlnaGVyIGxldmVsLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLmRpc2VuZ2FnZU1vZHVsZShheGlzQ29uZmlndXJhdGlvbi5nZXRNb2R1bGUobW9kdWxlTmFtZSkpOwotICAgICAgICAgICAgICAgIHJlcS5nZXRTZXNzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBdHRyaWJ1dGUoInN0YXR1cyIsICJNb2R1bGUgIiArIG1vZHVsZU5hbWUgKyAiIHdhcyBkaXNlbmdhZ2VkIGZyb20iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmVuZGVyVmlldygiZGlzZW5nYWdlLmpzcCIsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzU2VsZWN0U2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBvcHVsYXRlU2Vzc2lvbkluZm9ybWF0aW9uKHJlcSk7Ci0gICAgICAgIHJlcS5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRUxFQ1RfU0VSVklDRV9UWVBFLCAiVklFVyIpOwotCi0gICAgICAgIHJlbmRlclZpZXcoU0VMRUNUX1NFUlZJQ0VfSlNQX05BTUUsIHJlcSwgcmVzKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhdXRob3JpemF0aW9uUmVxdWlyZWQKLSAgICAgICAgICAgIChIdHRwU2VydmxldFJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgaHR0cFNlcnZsZXRSZXF1ZXN0KSB7Ci0gICAgICAgIHJldHVybiBodHRwU2VydmxldFJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTE9HR0VEKSA9PSBudWxsICYmCi0gICAgICAgICAgICAgICAgIWh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuZW5kc1dpdGgoImxvZ2luIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGF4aXNTZWN1cml0eUVuYWJsZWQKLSAgICAgICAgICAgICgpIHsKLSAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IGNvbmZpZ0NvbnRleHQuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKQotICAgICAgICAgICAgICAgIC5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkFETUlOX1NFQ1VSSVRZX0RJU0FCTEVEKTsKLSAgICAgICAgcmV0dXJuIHBhcmFtZXRlciA9PSBudWxsIHx8ICEidHJ1ZSIuZXF1YWxzKHBhcmFtZXRlci5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvd2ViYXBwL0F4aXNBZG1pblNlcnZsZXQuamF2YSBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYXhpczIvd2ViYXBwL0F4aXNBZG1pblNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3YTZkZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2F4aXMyL3dlYmFwcC9BeGlzQWRtaW5TZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIud2ViYXBwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzQWRtaW5TZXJ2bGV0IGV4dGVuZHMgQXhpc1NlcnZsZXQgewotCi0gICAgcHJvdGVjdGVkIHRyYW5zaWVudCBBZG1pbkFnZW50IGFnZW50OwotCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZG9HZXQocmVxLCByZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVxLmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfUEFUSCwgY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlUGF0aCgpKTsKLSAgICAgICAgICAgIGFnZW50LmhhbmRsZShyZXEsIHJlc3ApOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoY29uZmlnKTsKLSAgICAgICAgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQgPSBjb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgdGhpcy5jb25maWdDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAoQ29uZmlndXJhdGlvbkNvbnRleHQpIHNlcnZsZXRDb250ZXh0LmdldEF0dHJpYnV0ZShDT05GSUdVUkFUSU9OX0NPTlRFWFQpOwotICAgICAgICBzZXJ2bGV0Q29udGV4dC5zZXRBdHRyaWJ1dGUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdGhpcyk7Ci0gICAgICAgIGFnZW50ID0gbmV3IEFkbWluQWdlbnQoY29uZmlnQ29udGV4dCk7Ci0gICAgICAgIHRoaXMuc2VydmxldENvbmZpZyA9IGNvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewotICAgICAgICBpZiAodGhpcy5zZXJ2bGV0Q29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluaXQodGhpcy5zZXJ2bGV0Q29uZmlnKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0FjdGl2YXRlU2VydmljZS5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9BY3RpdmF0ZVNlcnZpY2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEzMDgyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0FjdGl2YXRlU2VydmljZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPGgxPlR1cm4gT24gU2VydmljZTwvaDE+DQotPGZvcm0gbWV0aG9kPSJnZXQiIG5hbWU9InNlcnZpY2VBY3RpdmF0ZSIgYWN0aW9uPSJheGlzMi1hZG1pbi9hY3RpdmF0ZVNlcnZpY2UiPg0KLSAgPHRhYmxlIHdpZHRoPSIxMDAlIiAgYm9yZGVyPSIwIj4NCi08dHI+DQotICA8dGQgY29sc3Bhbj0iMiIgPg0KLSAgICAgPHA+VGhlIHNlcnZpY2VzIHRoYXQgYXJlIGluYWN0aXZlIGFyZSBsaXN0ZWQgYmVsb3cuIEFsdGhvdWdoIHlvdSBjYW4gYWN0aXZhdGUgdGhlIHNlcnZpY2VzIGZyb20gdGhpcyBwYWdlLCBvbmNlIHN5c3RlbSBpcyByZXN0YXJ0ZWQgdGhlIHNlcnZpY2VzIHdpbGwgYmUgaW5hY3RpdmUgYWdhaW48L3A+DQotICA8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gIDwlDQotSGFzaE1hcCBzZXJ2aWNlcyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVApOw0KLUNvbGxlY3Rpb24gY29sID0gc2VydmljZXMudmFsdWVzKCk7DQotU3RyaW5nIGh0bWwgPSAiIjsNCi1pbnQgY291bnQgPSAwOw0KLQ0KLWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLQlBeGlzU2VydmljZSBheGlzU2VydmljZXMgPSAoQXhpc1NlcnZpY2UpIGl0ZXJhdG9yLm5leHQoKTsNCi0JaWYoIWF4aXNTZXJ2aWNlcy5pc0FjdGl2ZSgpKXsNCi0JCWNvdW50Kys7DQotCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgYXhpc1NlcnZpY2VzLmdldE5hbWUoKSArICInPiI7DQotCQlodG1sICs9IGF4aXNTZXJ2aWNlcy5nZXROYW1lKCkgKyAiPC9vcHRpb24+IjsNCi0JfQ0KLX0NCi1yZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQLG51bGwpOw0KLWlmIChjb3VudCA+IDApIHsNCi0lPg0KLSAgDQotICAgIDx0ZCB3aWR0aD0iMjAlIj4gU2VsZWN0IFNlcnZpY2UgOiA8L3RkPg0KLSAgICA8dGQgd2lkdGg9IjgwJSI+DQotICAgICAgIDxzZWxlY3QgbmFtZT0iYXhpc1NlcnZpY2UiIGNsYXNzPSJzZWxlY3RCb3hlcyI+DQotCQk8JT1odG1sJT4NCi0JCTwvc2VsZWN0Pg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gICAgPHRkIHdpZHRoPSIyMCUiPkFjdGl2YXRlIFNlcnZpY2UgPC90ZD4NCi0gICAgPHRkIHdpZHRoPSI4MCUiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0idHVybm9uIj4NCi0gICAgPC90ZD4NCi0gIDwvdHI+DQotICA8dHI+DQotICA8dGQ+Jm5ic3A7PC90ZD4NCi0gIDx0ZD4NCi0gICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIEFjdGl2YXRlICIgPg0KLSAgIDxpbnB1dCBuYW1lPSJyZXNldCIgdHlwZT0icmVzZXQiIHZhbHVlPSIgQ2xlYXIgIiA+DQotICA8L3RkPg0KLTwlDQotfSBlbHNlIHsNCi0JJT4NCi0JPHRkIGNvbHNwYW49IjIiPk5vIGluYWN0aXZlIHNlcnZpY2VzIHByZXNlbnQuPC90ZD4NCi0JPCUNCi19DQotJT4NCi0gIDwvdHI+DQotDQotPC90YWJsZT4NCi08L2Zvcm0+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0VuZ2FnZVRvU2VydmljZUdyb3VwLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0VuZ2FnZVRvU2VydmljZUdyb3VwLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2MjAxNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9FbmdhZ2VUb1NlcnZpY2VHcm91cC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiBsYW5ndWFnZT0iamF2YSIgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLlV0aWxzIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPgotPCUKLSAgICBTdHJpbmcgc3RhdHVzID0gKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVOR0FHRV9TVEFUVVMpOwotICAgIEhhc2hNYXAgbW9kdWVscyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7Ci0gICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOwotICAgIENvbGxlY3Rpb24gbW9kdWxlQ29sID0gIG1vZHVlbHMudmFsdWVzKCk7Ci0gICAgSXRlcmF0b3Igc2VydmljZXNHcm91cHMgPSAoSXRlcmF0b3IpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCk7Ci0gICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCxudWxsKTsKLSU+Ci08aDE+RW5nYWdlIE1vZHVsZSBmb3IgYSBTZXJ2aWNlIEdyb3VwPC9oMT4KLTxwPlRvIGVuZ2FnZSBhIG1vZHVsZSBmb3IgYSBzZXQgb2Ygc2VydmljZXMgZ3JvdXBlZCBhcyBhbiBheGlzIHNlcnZpY2UgZ3JvdXAsPC9wPgotCi0gICAgPG9sPgotICAgICAgICA8bGk+c2VsZWN0IHRoZSBtb2R1bGUgeW91IHdhbnQgdG8gZW5nYWdlIDwvbGk+Ci0gICAgICAgIDxsaT5zZWxlY3QgdGhlIGF4aXMgc2VydmljZSBncm91cCB5b3UgbGlrZSB0aGUgbW9kdWxlIHRvIGJlIGVuZ2FnZWQuPC9saT4KLSAgICAgICAgPGxpPmNsaWNrICJFbmdhZ2UiLjwvbGk+Ci0gICAgPC9vbD4KLQotCi08JQotCWlmICghbW9kdWxlQ29sLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7JT4KLQkJPHA+Tm8gbW9kdWxlcyBhcmUgcHJlc2VudCB0byBiZSBlbmdhZ2VkLjwvcD4KLQk8JX0gZWxzZSB7Ci0JCWlmICAoIXNlcnZpY2VzR3JvdXBzLmhhc05leHQoKSkgeyU+Ci0JCTxwPk5vIEF4aXMgc2VydmljZSBncm91cHMgYXJlIHByZXNlbnQgdG8gYmUgZW5nYWdlZC48L3A+Ci0JCTwlfSBlbHNlIHsKLSU+Ci08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0TW9kdWxlRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9lbmdhZ2VUb1NlcnZpY2VHcm91cCI+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMSI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD5TZWxlY3QgYSBNb2R1bGUgOjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im1vZHVsZXMiPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVDb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNPcGVyYXRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgICAgICAgICAgJT4gPG9wdGlvbiAgYWxpZ249ImxlZnQiIHZhbHVlPSI8JT1tb2R1bGVuYW1lJT4iPjwlPW1vZHVsZW5hbWUlPjwvb3B0aW9uPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPlNlbGVjdCBhIFNlcnZpY2UgR3JvdXAgOjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9ImF4aXNTZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLQotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoc2VydmljZXNHcm91cHMuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzU2VydmljZUdyb3VwIGF4aXNTZXJ2aWNlR3JvdXAgPSAoQXhpc1NlcnZpY2VHcm91cCkgc2VydmljZXNHcm91cHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlR3JvdXAuZ2V0U2VydmljZUdyb3VwTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAlPiA8b3B0aW9uICBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPXNlcnZpY2VOYW1lJT4iPjwlPXNlcnZpY2VOYW1lJT48L29wdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgICAgICZuYnNwOwotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiBFbmdhZ2UgIiA+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICAgICAgJm5ic3A7Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNvbHM9IjUwIiAgPCUKLSAgICAgICAgICAgICAgICAgICAgaWYoc3RhdHVzID09IG51bGwpewotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJkaXNwbGF5Om5vbmUiCi0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gJT4KLSAgICAgICAgICAgICAgICAgICAgICAgID48JT1VdGlscy5zYW5pdGl6ZVdlYk91dHB1dChzdGF0dXMpJT48L3RleHRhcmVhPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPC9mb3JtPgotPCUKLQkJfQotCX0KLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+Ci0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0Vycm9yL0F1dGhFcnJvci5odG1sIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvQXV0aEVycm9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzllNDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvQXV0aEVycm9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08aHRtbD4NCi0gPGhlYWQ+PHRpdGxlPkVycm9yIEluIEFkbWluIEFwcGxpY2F0aW9uPC90aXRsZT48L2hlYWQ+DQotIDxib2R5Pg0KLSA8dGFibGUgd2lkdGg9IjEwMCUiPg0KLSAgPHRyPg0KLSAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgc3JjPSIuLi9pbWFnZXMvYXNmLWxvZ28uZ2lmIi8+PC90ZD4NCi0gICAgPHRkIGFsaWduPSJyaWdodCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9heGlzX2wuanBnIi8+PC90ZD4NCi0gICAgPC90cj4NCi08L3RhYmxlPg0KLTx0YWJsZSB3aWR0aD0iMTAwJSI+DQotICA8dHI+DQotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5GYWlsdXJlIGluIEF1dGhlbnRpY2F0aW9uISBQbGVhc2UgY2hlY2sgeW91ciB1c2VybmFtZSBhbmQgcGFzc3dvcmQ8L3RkPg0KLSAgDQotICAgIDwvdHI+DQotICAgIDx0cj4gIDx0ZCBhbGlnbj0iY2VudGVyIj48YSBocmVmPSIvYXhpczIvTG9naW4uanNwIj5iYWNrPC9hPjwvdGQ+PC90cj4NCi08L3RhYmxlPg0KLQ0KLTxoci8+DQotPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0gPHRyPg0KLSAgIDx0ZCBhbGlnbj0iY2VudGVyIj5BbGwgcmlnaHRzIHJlc2VydmVkIGJ5IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC90ZD4NCi0gICA8L3RyPg0KLTwvdGFibGU+DQotIDwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvR2VuRXJyb3IuaHRtbCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0Vycm9yL0dlbkVycm9yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWUxNmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvR2VuRXJyb3IuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tPg0KLQ0KLTxodG1sPg0KLSA8aGVhZD48dGl0bGU+RXJyb3IgSW4gQWRtaW4gQXBwbGljYXRpb248L3RpdGxlPjwvaGVhZD4NCi0gPGJvZHk+DQotIDx0YWJsZSB3aWR0aD0iMTAwJSI+DQotICA8dHI+DQotICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9hc2YtbG9nby5naWYiLz48L3RkPg0KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij48aW1nIHNyYz0iLi4vaW1hZ2VzL2F4aXNfbC5qcGciLz48L3RkPg0KLSAgICA8L3RyPg0KLTwvdGFibGU+DQotPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0gIDx0cj4NCi0gICAgPHRkIGFsaWduPSJjZW50ZXIiPlNlcnZlciBFbmNvdW50ZXJlZCBhbiBFcnJvciE8L3RkPg0KLSAgDQotICAgIDwvdHI+DQotICAgIDx0cj4gIDx0ZCBhbGlnbj0iY2VudGVyIj48YSBocmVmPSIvIj5ob21lPC9hPjwvdGQ+PC90cj4NCi08L3RhYmxlPg0KLQ0KLTxoci8+DQotPHRhYmxlIHdpZHRoPSIxMDAlIj4NCi0gPHRyPg0KLSAgIDx0ZCBhbGlnbj0iY2VudGVyIj5BbGwgcmlnaHRzIHJlc2VydmVkIGJ5IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC90ZD4NCi0gICA8L3RyPg0KLTwvdGFibGU+DQotIDwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvZXJyb3I0MDQuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvZXJyb3I0MDQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmVlOTQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0Vycm9yL2Vycm9yNDA0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIiBsYW5ndWFnZT0iamF2YSIgJT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iLi4vaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4KLSAgICA8dGl0bGU+QXhpczIgOjogUmVzb3VyY2Ugbm90IGZvdW5kITwvdGl0bGU+Ci0gICAgPGxpbmsgaHJlZj0iYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLSAgPC9oZWFkPgotCi0gIDxib2R5PgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBzcmM9ImF4aXMyLXdlYi9pbWFnZXMvYXNmLWxvZ28uZ2lmIiBhbHQ9IiIvPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPjxpbWcgc3JjPSJheGlzMi13ZWIvaW1hZ2VzL2F4aXNfbC5qcGciIGFsdD0iIi8+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGgxPlJlcXVlc3RlZCByZXNvdXJjZSBub3QgZm91bmQhPC9oMT4KLSAgICAgICAgICA8YnIvPgotICAgICAgICAgIDxici8+Ci0gICAgICAgICAgPGJyLz4KLSAgICAgICAgICA8YnIvPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj48dGQgYWxpZ249ImNlbnRlciI+PGEgaHJlZj0iYXhpczItd2ViL2luZGV4LmpzcCI+aG9tZTwvYT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NTBweCI+Ci0gICAgICAgICAgPHRyPjx0ZD48aHIgc2l6ZT0iMSIgbm9zaGFkZT0iIi8+PC90ZD48L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5Db3B5cmlnaHQgJiMxNjk7IDE5OTktMjAwNiwgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPGJyLz5MaWNlbnNlZCB1bmRlciB0aGUgPGEKLSAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L2E+LjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4mbmJzcDs8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvZXJyb3I1MDAuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvRXJyb3IvZXJyb3I1MDAuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDY0OTVlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0Vycm9yL2Vycm9yNTAwLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0xIiBsYW5ndWFnZT0iamF2YSIgJT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iLi4vaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4KLSAgICA8dGl0bGU+QXhpczIgOjogSW50ZXJuYWwgc2VydmVyIGVycm9yPC90aXRsZT4KLSAgICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPgotICA8L2hlYWQ+Ci0KLSAgPGJvZHk+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48aW1nIHNyYz0iYXhpczItd2ViL2ltYWdlcy9hc2YtbG9nby5naWYiIGFsdD0iIi8+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+PGltZyBzcmM9ImF4aXMyLXdlYi9pbWFnZXMvYXhpc19sLmpwZyIgYWx0PSIiLz48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aDE+SW50ZXJuYWwgc2VydmVyIGVycm9yPC9oMT4KLSAgICAgICAgICA8YnIvPgotICAgICAgICAgIDxici8+Ci0gICAgICAgICAgPGJyLz4KLSAgICAgICAgICA8YnIvPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj48dGQgYWxpZ249ImNlbnRlciI+PGEgaHJlZj0iYXhpczItd2ViL2luZGV4LmpzcCI+aG9tZTwvYT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8aHIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1MHB4Ij4KLSAgICAgICAgICA8dHI+PHRkPjxociBzaXplPSIxIiBub3NoYWRlPSIiLz48L3RkPjwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPkNvcHlyaWdodCAmIzE2OTsgMTk5OS0yMDA2LCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248YnIvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YQotICAgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC90ZD4KLSAgICAgICAgPHRkPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9IYXBweUF4aXMuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvSGFwcHlBeGlzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwZGU0Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9IYXBweUF4aXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTxodG1sPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCwKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudCwKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0LAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIsCi0gICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGphdmEuaW8uSU9FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgIGphdmEuaW8uU3RyaW5nV3JpdGVyLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUZhY3RvcnksCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01OYW1lc3BhY2UsCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24iCi0gICAgICAgICBzZXNzaW9uPSJmYWxzZSIgJT4KLTxoZWFkPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2h0dHBiYXNlLmpzcCIvPgotICAgIDx0aXRsZT5BeGlzMiBIYXBwaW5lc3MgUGFnZTwvdGl0bGU+Ci0gICAgPGxpbmsgaHJlZj0iYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaGVhZGVyLmluYyIvPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvbGluay1mb290ZXIuanNwIi8+Ci08JUlQID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKTslPgotPCUhCi0gICAgLyoKLSAgICAqIEhhcHBpbmVzcyB0ZXN0cyBmb3IgYXhpczIuIFRoZXNlIGxvb2sgYXQgdGhlIGNsYXNzcGF0aCBhbmQgd2FybiBpZiB0aGluZ3MKLSAgICAqIGFyZSBtaXNzaW5nLiBOb3JtYWxseSBhZGRuZyB0aGlzIG11Y2ggY29kZSBpbiBhIEpTUCBwYWdlIGlzIG1hZAotICAgICogYnV0IGhlcmUgd2Ugd2FudCB0byB2YWxpZGF0ZSBKU1AgY29tcGlsYXRpb24gdG9vLCBhbmQgaGF2ZSBhIGRyb3AtaW4KLSAgICAqIHBhZ2UgZm9yIGVhc3kgcmUtdXNlCi0gICAgKi8KLSAgICBTdHJpbmcgSVA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBzdHJpbmcgcHJvdmlkaW5nIGluc3RhbGwgaW5mb3JtYXRpb24uCi0gICAgICogVE9ETzogbWFrZSB0aGlzIHBsYXRmb3JtIGF3YXJlIGFuZCBnaXZlIHNwZWNpZmljIGhpbnRzCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnN0YWxsSGludHMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQotICAgICAgICByZXR1cm4gIjxCPjxJPk5vdGU6PC9JPjwvQj4gT24gVG9tY2F0IDQueCBhbmQgSmF2YTEuNCwgeW91IG1heSBuZWVkIHRvIHB1dCBsaWJyYXJpZXMgdGhhdCBjb250YWluICIKLSAgICAgICAgICAgICAgICArICJqYXZhLiogb3IgamF2YXguKiBwYWNrYWdlcyBpbnRvIENBVEFMSU5BX0hPTUUvY29tbW9uL2xpYiIKLSAgICAgICAgICAgICAgICArICI8YnI+amF4cnBjLmphciBhbmQgc2Fhai5qYXIgYXJlIHR3byBzdWNoIGxpYnJhcmllcy4iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3QgZm9yIGEgY2xhc3MgZXhpc3RpbmcKLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lCi0gICAgICogQHJldHVybiBjbGFzcyBpZmYgcHJlc2VudAotICAgICAqLwotICAgIENsYXNzIGNsYXNzRXhpc3RzKFN0cmluZyBjbGFzc25hbWUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZXN0IGZvciByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogQHJldHVybiB0cnVlIGlmZiBwcmVzZW50Ci0gICAgICovCi0gICAgYm9vbGVhbiByZXNvdXJjZUV4aXN0cyhTdHJpbmcgcmVzb3VyY2UpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZDsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSk7Ci0gICAgICAgIGZvdW5kID0gaW5zdHJlYW0gIT0gbnVsbDsKLSAgICAgICAgaWYgKGluc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZm91bmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogcHJvYmUgZm9yIGEgY2xhc3MsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgaXMgbWlzc2luZwotICAgICAqIEBwYXJhbSBvdXQgc3RyZWFtIHRvIHByaW50IHN0dWZmCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRleHQgbGlrZSAid2FybmluZyIgb3IgImVycm9yIgotICAgICAqIEBwYXJhbSBjbGFzc25hbWUgY2xhc3MgdG8gbG9vayBmb3IKLSAgICAgKiBAcGFyYW0gamFyRmlsZSB3aGVyZSB0aGlzIGNsYXNzIGNvbWVzIGZyb20KLSAgICAgKiBAcGFyYW0gZXJyb3JUZXh0IGV4dHJhIGVycm9yIHRleHQKLSAgICAgKiBAcGFyYW0gaG9tZVBhZ2Ugd2hlcmUgdG8gZC9sIHRoZSBsaWJyYXJ5Ci0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgY2xhc3NlcwotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBpbnQgcHJvYmVDbGFzcyhKc3BXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lLAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBqYXJGaWxlLAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvclRleHQsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvbWVQYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBjbGFzc0V4aXN0cyhjbGFzc25hbWUpOwotICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gIiI7Ci0gICAgICAgICAgICAgICAgaWYgKGhvbWVQYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdXJsID0gIjxicj4gIFNlZSA8YSBocmVmPSIgKyBob21lUGFnZSArICI+IiArIGhvbWVQYWdlICsgIjwvYT4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjxwPiIgKyBjYXRlZ29yeSArICI6IGNvdWxkIG5vdCBmaW5kIGNsYXNzICIgKyBjbGFzc25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIGZpbGUgPGI+IiArIGphckZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvYj48YnI+ICAiICsgZXJyb3JUZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICArIHVybAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiPHA+Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGdldExvY2F0aW9uKG91dCwgY2xhenopOwotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiRm91bmQgIiArIGF4aXNPcGVyYXRpb24gKyAiICgiICsgY2xhc3NuYW1lICsgIik8YnIvPiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiRm91bmQgIiArIGF4aXNPcGVyYXRpb24gKyAiICgiICsgY2xhc3NuYW1lICsgIikgPGJyLz4gJm5ic3A7Jm5ic3A7YXQgIiArIGxvY2F0aW9uICsgIjxici8+Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgewotICAgICAgICAgICAgU3RyaW5nIHVybCA9ICIiOwotICAgICAgICAgICAgaWYgKGhvbWVQYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cmwgPSAiPGJyPiAgU2VlIDxhIGhyZWY9IiArIGhvbWVQYWdlICsgIj4iICsgaG9tZVBhZ2UgKyAiPC9hPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjxwPiIgKyBjYXRlZ29yeSArICI6IGNvdWxkIG5vdCBmaW5kIGEgZGVwZW5kZW5jeSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9mIGNsYXNzICIgKyBjbGFzc25hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gZmlsZSA8Yj4iICsgamFyRmlsZQotICAgICAgICAgICAgICAgICAgICArICI8L2I+PGJyPiAiICsgZXJyb3JUZXh0Ci0gICAgICAgICAgICAgICAgICAgICsgdXJsCi0gICAgICAgICAgICAgICAgICAgICsgIjxicj5UaGUgcm9vdCBjYXVzZSB3YXM6ICIgKyBuY2RmZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiPGJyPlRoaXMgY2FuIGhhcHBlbiBlLmcuIGlmICIgKyBjbGFzc25hbWUgKyAiIGlzIGluIgotICAgICAgICAgICAgICAgICAgICArICIgdGhlICdjb21tb24nIGNsYXNzcGF0aCwgYnV0IGEgZGVwZW5kZW5jeSBsaWtlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGFjdGl2YXRpb24uamFyIGlzIG9ubHkgaW4gdGhlIHdlYmFwcCBjbGFzc3BhdGguIgotICAgICAgICAgICAgICAgICAgICArICI8cD4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogZ2V0IHRoZSBsb2NhdGlvbiBvZiBhIGNsYXNzCi0gICAgICogQHBhcmFtIG91dAotICAgICAqIEBwYXJhbSBjbGF6egotICAgICAqIEByZXR1cm4gdGhlIGphciBmaWxlIG9yIHBhdGggd2hlcmUgYSBjbGFzcyB3YXMgZm91bmQKLSAgICAgKi8KLQotICAgIFN0cmluZyBnZXRMb2NhdGlvbihKc3BXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YS5uZXQuVVJMIHVybCA9IGNsYXp6LmdldFByb3RlY3Rpb25Eb21haW4oKS5nZXRDb2RlU291cmNlKCkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoImphciIpKSB7Ci0gICAgICAgICAgICAgICAgdXJsID0gKChqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKSkuZ2V0SmFyRmlsZVVSTCgpOwotICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gdXJsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBqYXZhLmlvLkZpbGUgZmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUodXJsLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gImFuIHVua25vd24gbG9jYXRpb24iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGEgY2xhc3Mgd2UgbmVlZCBpZiBhIGNsYXNzIGlzIG1pc3NpbmcKLSAgICAgKiBAcGFyYW0gb3V0IHN0cmVhbSB0byBwcmludCBzdHVmZgotICAgICAqIEBwYXJhbSBjbGFzc25hbWUgY2xhc3MgdG8gbG9vayBmb3IKLSAgICAgKiBAcGFyYW0gamFyRmlsZSB3aGVyZSB0aGlzIGNsYXNzIGNvbWVzIGZyb20KLSAgICAgKiBAcGFyYW0gZXJyb3JUZXh0IGV4dHJhIGVycm9yIHRleHQKLSAgICAgKiBAcGFyYW0gaG9tZVBhZ2Ugd2hlcmUgdG8gZC9sIHRoZSBsaWJyYXJ5Ci0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB3aGVuIG5lZWRlZAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtaXNzaW5nIGxpYnJhcmllcyAoMCBvciAxKQotICAgICAqLwotICAgIGludCBuZWVkQ2xhc3MoSnNwV3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUsCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgamFyRmlsZSwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBheGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yVGV4dCwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBob21lUGFnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHByb2JlQ2xhc3Mob3V0LAotICAgICAgICAgICAgICAgICI8Yj5FcnJvcjwvYj4iLAotICAgICAgICAgICAgICAgIGNsYXNzbmFtZSwKLSAgICAgICAgICAgICAgICBqYXJGaWxlLAotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgZXJyb3JUZXh0LAotICAgICAgICAgICAgICAgIGhvbWVQYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcmludCB3YXJuaW5nIG1lc3NhZ2UgaWYgYSBjbGFzcyBpcyBtaXNzaW5nCi0gICAgICogQHBhcmFtIG91dCBzdHJlYW0gdG8gcHJpbnQgc3R1ZmYKLSAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIGNsYXNzIHRvIGxvb2sgZm9yCi0gICAgICogQHBhcmFtIGphckZpbGUgd2hlcmUgdGhpcyBjbGFzcyBjb21lcyBmcm9tCi0gICAgICogQHBhcmFtIGVycm9yVGV4dCBleHRyYSBlcnJvciB0ZXh0Ci0gICAgICogQHBhcmFtIGhvbWVQYWdlIHdoZXJlIHRvIGQvbCB0aGUgbGlicmFyeQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiBuZWVkZWQKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbWlzc2luZyBsaWJyYXJpZXMgKDAgb3IgMSkKLSAgICAgKi8KLSAgICBpbnQgd2FudENsYXNzKEpzcFdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lLAotICAgICAgICAgICAgICAgICAgU3RyaW5nIGphckZpbGUsCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgYXhpc09wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvclRleHQsCi0gICAgICAgICAgICAgICAgICBTdHJpbmcgaG9tZVBhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBwcm9iZUNsYXNzKG91dCwKLSAgICAgICAgICAgICAgICAiPGI+V2FybmluZzwvYj4iLAotICAgICAgICAgICAgICAgIGNsYXNzbmFtZSwKLSAgICAgICAgICAgICAgICBqYXJGaWxlLAotICAgICAgICAgICAgICAgIGF4aXNPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgZXJyb3JUZXh0LAotICAgICAgICAgICAgICAgIGhvbWVQYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBwcm9iZSBmb3IgYSByZXNvdXJjZSBleGlzdGluZywKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogQHBhcmFtIHJlc291cmNlCi0gICAgICogQHBhcmFtIGVycm9yVGV4dAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgaW50IHdhbnRSZXNvdXJjZShKc3BXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yVGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcmVzb3VyY2VFeGlzdHMocmVzb3VyY2UpKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjxwPjxiPldhcm5pbmc8L2I+OiBjb3VsZCBub3QgZmluZCByZXNvdXJjZSAiICsgcmVzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgKyAiPGJyPiIKLSAgICAgICAgICAgICAgICAgICAgKyBlcnJvclRleHQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoImZvdW5kICIgKyByZXNvdXJjZSArICI8YnI+Iik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogIGdldCBzZXJ2bGV0IHZlcnNpb24gc3RyaW5nCi0gICAgICoKLSAgICAgKi8KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFZlcnNpb24oKSB7Ci0gICAgICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSBnZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldENvbnRleHQoKTsKLSAgICAgICAgaW50IG1ham9yID0gY29udGV4dC5nZXRNYWpvclZlcnNpb24oKTsKLSAgICAgICAgaW50IG1pbm9yID0gY29udGV4dC5nZXRNaW5vclZlcnNpb24oKTsKLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcobWFqb3IpICsgJy4nICsgSW50ZWdlci50b1N0cmluZyhtaW5vcik7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB3aGF0IHBhcnNlciBhcmUgd2UgdXNpbmcuCi0gICAgICogQHJldHVybiB0aGUgY2xhc3NuYW1lIG9mIHRoZSBwYXJzZXIKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXJzZXJOYW1lKCkgewotICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gZ2V0U0FYUGFyc2VyKCk7Ci0gICAgICAgIGlmIChzYXhQYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICJDb3VsZCBub3QgY3JlYXRlIGFuIFhNTCBQYXJzZXIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdG8gd2hhdCBpcyBpbiB0aGUgY2xhc3NuYW1lCi0gICAgICAgIHJldHVybiBzYXhQYXJzZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgSkFYUCBTQVhQYXJzZXIKLSAgICAgKiBAcmV0dXJuIHBhcnNlciBvciBudWxsIGZvciB0cm91YmxlCi0gICAgICovCi0gICAgcHJpdmF0ZSBTQVhQYXJzZXIgZ2V0U0FYUGFyc2VyKCkgewotICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChzYXhQYXJzZXJGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2F4UGFyc2VyID0gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2F4UGFyc2VyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBhcnNlcgotICAgICAqIEByZXR1cm4gcGF0aCBvciBudWxsIGZvciB0cm91YmxlIGluIHRyYWNraW5nIGl0IGRvd24KLSAgICAgKi8KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnNlckxvY2F0aW9uKEpzcFdyaXRlciBvdXQpIHsKLSAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IGdldFNBWFBhcnNlcigpOwotICAgICAgICBpZiAoc2F4UGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXRMb2NhdGlvbihvdXQsIHNheFBhcnNlci5nZXRDbGFzcygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIHByaXZhdGUgT01FbGVtZW50IGNyZWF0ZUVudmVsb3BlKCkgewotICAgICAgICBPTUZhY3RvcnkgZmFjID0gT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCk7Ci0gICAgICAgIE9NTmFtZXNwYWNlIG9tTnMgPSBmYWMuY3JlYXRlT01OYW1lc3BhY2UoImh0dHA6Ly9heGlzdmVyc2lvbi5zYW1wbGUveHNkIiwgIm5zMSIpOwotICAgICAgICBPTUVsZW1lbnQgbWV0aG9kID0gZmFjLmNyZWF0ZU9NRWxlbWVudCgiZ2V0VmVyc2lvbiIsIG9tTnMpOwotICAgICAgICBPTUVsZW1lbnQgdmFsdWUgPSBmYWMuY3JlYXRlT01FbGVtZW50KCJteVZhbHVlIiwgb21Ocyk7Ci0gICAgICAgIG1ldGhvZC5hZGRDaGlsZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBtZXRob2Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaW52b2tlVGhlU2VydmljZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgb25lIGlzIGFuIGludGVybmFsIHJlcXVlc3Qgd2UgZG8gbm90IHVzZSBwdWJsaWMgZnJvbnRlbmRIb3N0VXJsCi0gICAgICAgICAgICAvLyBmb3IgaXQKLSAgICAgICAgICAgIGludCBsYXN0aW5kZXggPSBJUC5sYXN0SW5kZXhPZignLycpOwotICAgICAgICAgICAgSVAgPSBJUC5zdWJzdHJpbmcoMCwgbGFzdGluZGV4KTsKLSAgICAgICAgICAgIC8vL2F4aXMyL2F4aXMyLXdlYi9zZXJ2aWNlcy92ZXJzaW9uCi0gICAgICAgICAgICBJUCA9IElQLnJlcGxhY2VBbGwoImF4aXMyLXdlYiIsICIiKTsKLQotICAgICAgICAgICAgT01FbGVtZW50IHBheWxvYWQgPSBjcmVhdGVFbnZlbG9wZSgpOwotICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHQgY29uZmlnY3R4ID0KLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25Db250ZXh0RnJvbUZpbGVTeXN0ZW0obnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBTZXJ2aWNlQ2xpZW50IGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KGNvbmZpZ2N0eCwgbnVsbCk7Ci0gICAgICAgICAgICBFbmRwb2ludFJlZmVyZW5jZSB0YXJnZXRFUFIgPSBuZXcgRW5kcG9pbnRSZWZlcmVuY2UoSVAgKyBjb25maWdjdHguZ2V0U2VydmljZVBhdGgoKSArICIvVmVyc2lvbiIpOwotICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gbmV3IE9wdGlvbnMoKTsKLSAgICAgICAgICAgIGNsaWVudC5zZXRPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUbyh0YXJnZXRFUFIpOwotICAgICAgICAgICAgb3B0aW9ucy5zZXRUcmFuc3BvcnRJblByb3RvY29sKENvbnN0YW50cy5UUkFOU1BPUlRfSFRUUCk7Ci0KLSAgICAgICAgICAgIE9NRWxlbWVudCByZXN1bHQgPSBjbGllbnQuc2VuZFJlY2VpdmUocGF5bG9hZCk7Ci0gICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZShYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKHdyaXRlcikpOwotICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IHdyaXRlci50b1N0cmluZygpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKEF4aXNGYXVsdCBheGlzRmF1bHQpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0ZWRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgc3lzdGVtUHJvcGVydHkpewotICAgICAgICBpZiAoc3lzdGVtUHJvcGVydHkgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAJcmV0dXJuICBzeXN0ZW1Qcm9wZXJ0eS5yZXBsYWNlQWxsKCI6IiwgIjogIik7Ci0gICAgfQotJT4KLQotPGgxPkF4aXMyIEhhcHBpbmVzcyBQYWdlPC9oMT4KLQotPGgyPkV4YW1pbmluZyB3ZWJhcHAgY29uZmlndXJhdGlvbjwvaDI+Ci0KLTxibG9ja3F1b3RlPgotCi08aDQ+RXNzZW50aWFsIENvbXBvbmVudHM8L2g0PgotCi08JQotICAgIGludCBuZWVkZWQgPSAwLHdhbnRlZCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiB0aGUgZXNzZW50aWFscywgd2l0aG91dCB0aGVzZSBBeGlzIGlzIG5vdCBnb2luZyB0byB3b3JrCi0gICAgICovCi0gICAgbmVlZGVkID0gbmVlZENsYXNzKG91dCwgIm9yZy5hcGFjaGUuYXhpczIudHJhbnNwb3J0Lmh0dHAuQXhpc1NlcnZsZXQiLAotICAgICAgICAgICAgImF4aXMyLTEuMC5qYXIiLAotICAgICAgICAgICAgIkFwYWNoZS1BeGlzIiwKLSAgICAgICAgICAgICJBeGlzMiB3aWxsIG5vdCB3b3JrIiwKLSAgICAgICAgICAgICJodHRwOi8veG1sLmFwYWNoZS5vcmcvYXhpczIvIik7Ci0gICAgbmVlZGVkICs9IG5lZWRDbGFzcyhvdXQsICJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2ciLAotICAgICAgICAgICAgImNvbW1vbnMtbG9nZ2luZy5qYXIiLAotICAgICAgICAgICAgIkpha2FydGEtQ29tbW9ucyBMb2dnaW5nIiwKLSAgICAgICAgICAgICJBeGlzMiB3aWxsIG5vdCB3b3JrIiwKLSAgICAgICAgICAgICJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbG9nZ2luZy5odG1sIik7Ci0gICAgbmVlZGVkICs9IG5lZWRDbGFzcyhvdXQsICJqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlciIsCi0gICAgICAgICAgICAic3RheC1hcGktMS4wLjEuamFyIiwKLSAgICAgICAgICAgICJTdHJlYW1pbmcgQVBJIGZvciBYTUwiLAotICAgICAgICAgICAgIkF4aXMyIHdpbGwgbm90IHdvcmsiLAotICAgICAgICAgICAgImh0dHA6Ly9kaXN0LmNvZGVoYXVzLm9yZy9zdGF4L2phcnMvIik7Ci0gICAgbmVlZGVkICs9IG5lZWRDbGFzcyhvdXQsICJvcmcuY29kZWhhdXMuc3RheDIuWE1MU3RyZWFtV3JpdGVyMiIsCi0gICAgICAgICAgICAid3N0eC1hc2wtMy4wLjEuamFyIiwKLSAgICAgICAgICAgICJTdHJlYW1pbmcgQVBJIGZvciBYTUwgaW1wbGVtZW50YXRpb24iLAotICAgICAgICAgICAgIkF4aXMyIHdpbGwgbm90IHdvcmsiLAotICAgICAgICAgICAgImh0dHA6Ly9kaXN0LmNvZGVoYXVzLm9yZy9zdGF4L2phcnMvIik7Ci0KLSU+Ci08JQotICAgIC8qCi0gICAgKiByZXNvdXJjZXMgb24gdGhlIGNsYXNzcGF0aCBwYXRoCi0gICAgKi8KLSAgICAvKiBicm9rZW47IHRoaXMgaXMgYSBmaWxlLCBub3QgYSByZXNvdXJjZQotICAgIHdhbnRSZXNvdXJjZShvdXQsIi9zZXJ2ZXItY29uZmlnLndzZGQiLAotICAgICJUaGVyZSBpcyBubyBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlOyIKLSAgICArInJ1biBBZG1pbkNsaWVudCB0byBjcmVhdGUgb25lIik7Ci0gICAgKi8KLSAgICAvKiBhZGQgbW9yZSBsaWJyYXJpZXMgaGVyZSAqLwotCi0gICAgLy9pcyBldmVyeXRoaW5nIHdlIG5lZWQgaGVyZQotICAgIGlmIChuZWVkZWQgPT0gMCkgewotICAgICAgICAvL3llcywgYmUgaGFwcHkKLSAgICAgICAgb3V0LndyaXRlKCI8cD48Zm9udCBjb2xvcj0nZ3JlZW4nPjxzdHJvbmc+VGhlIGNvcmUgYXhpczIgbGlicmFyaWVzIGFyZSBwcmVzZW50Ljwvc3Ryb25nPjwvZm9udD48L3A+Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy9ubywgYmUgdmVyeSB1bmhhcHB5Ci0gICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIG91dC53cml0ZSgiPGZvbnQgY29sb3I9J3JlZCc+PGk+IgotICAgICAgICAgICAgICAgICsgbmVlZGVkCi0gICAgICAgICAgICAgICAgKyAiIGNvcmUgYXhpczIgbGlicmFyIgotICAgICAgICAgICAgICAgICsgKG5lZWRlZCA9PSAxID8gInkgaXMiIDogImllcyBhcmUiKQotICAgICAgICAgICAgICAgICsgIiBtaXNzaW5nPC9pPjwvZm9udD4iKTsKLSAgICB9Ci0gICAgLy9ub3cgbG9vayBhdCB3YW50ZWQgc3R1ZmYKLSU+Ci08cD4KLSAgICA8Qj48ST5Ob3RlOjwvST48L0I+IEV2ZW4gaWYgZXZlcnl0aGluZyB0aGlzIHBhZ2UgcHJvYmVzIGZvciBpcyBwcmVzZW50LAotICAgIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB5b3VyIEF4aXMgU2VydmljZSB3aWxsIHdvcmssIGJlY2F1c2UgdGhlcmUgYXJlIG1hbnkgY29uZmlndXJhdGlvbiBvcHRpb25zCi0gICAgdGhhdCB3ZSBkbyBub3QgY2hlY2sgZm9yLiBUaGVzZSB0ZXN0cyBhcmUgPGk+bmVjZXNzYXJ5PC9pPiBidXQgbm90IDxpPnN1ZmZpY2llbnQ8L2k+Ci08L3A+Ci08L2Jsb2NrcXVvdGU+Ci08aDI+RXhhbWluaW5nIFZlcnNpb24gU2VydmljZTwvaDI+Ci08JQotICAgIGJvb2xlYW4gc2VydmljZVN0YXR1cyA9IGludm9rZVRoZVNlcnZpY2UoKTsKLSAgICBpZiAoc2VydmljZVN0YXR1cykgewotJT4KLTxibG9ja3F1b3RlPgotICAgIDxmb250IGNvbG9yPSJncmVlbiI+PHN0cm9uZz4KLSAgICAgICAgRm91bmQgQXhpczIgZGVmYXVsdCBWZXJzaW9uIHNlcnZpY2UgYW5kIEF4aXMyIGlzIHdvcmtpbmcKLSAgICAgICAgcHJvcGVybHkuPC9zdHJvbmc+PC9mb250PgotICAgIDxwPk5vdyB5b3UgY2FuIGRyb3AgYSBzZXJ2aWNlIGFyY2hpdmUgaW4gYXhpczIvV0VCLUlORi9zZXJ2aWNlcy4KLSAgICAgICAgRm9sbG93aW5nIG91dHB1dCB3YXMgcHJvZHVjZWQgd2hpbGUgaW52b2tpbmcgQXhpczIgdmVyc2lvbiBzZXJ2aWNlCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+PCU9IHZhbHVlJT48L3A+Ci08L2Jsb2NrcXVvdGU+Ci0KLTwlCi19IGVsc2UgewotJT4KLTxwPgotICAgIDxmb250IGNvbG9yPSJicm93biI+IFRoZXJlIHdhcyBhIHByb2JsZW0gaW4gQXhpczIgdmVyc2lvbiBzZXJ2aWNlICwgbWF5IGJlCi0gICAgICAgIHRoZSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUgb3Igc29tZSB0aGluZyBoYXMgZ29uZSB3cm9uZy4gQnV0IHRoaXMgZG9lcwotICAgICAgICBub3QgbWVhbiBzeXN0ZW0gaXMgbm90IHdvcmtpbmcgIQotICAgICAgICBUcnkgdG8gdXBsb2FkIHNvbWUgb3RoZXIgc2VydmljZSBhbmQgY2hlY2sgdG8gc2VlIHdoZXRoZXIgaXQgaXMKLSAgICAgICAgd29ya2luZy4KLSAgICAgICAgPGJyPgotICAgIDwvZm9udD4KLTwvcD4KLQotPCUKLSAgICB9Ci0lPgotPGgyPkV4YW1pbmluZyBBcHBsaWNhdGlvbiBTZXJ2ZXI8L2gyPgotPGJsb2NrcXVvdGU+Ci08dGFibGU+Ci0gICAgPHRyPjx0ZD5TZXJ2bGV0IHZlcnNpb248L3RkPjx0ZD48JT1nZXRTZXJ2bGV0VmVyc2lvbigpJT48L3RkPjwvdHI+Ci0gICAgPHRyPjx0ZD5QbGF0Zm9ybTwvdGQ+Ci0gICAgICAgIDx0ZD48JT1nZXRTZXJ2bGV0Q29uZmlnKCkuZ2V0U2VydmxldENvbnRleHQoKS5nZXRTZXJ2ZXJJbmZvKCklPjwvdGQ+Ci0gICAgPC90cj4KLTwvdGFibGU+Ci08L2Jsb2NrcXVvdGU+Ci08aDI+RXhhbWluaW5nIFN5c3RlbSBQcm9wZXJ0aWVzPC9oMj4KLTwlCi0gICAgLyoqCi0gICAgICogRHVtcCB0aGUgc3lzdGVtIHByb3BlcnRpZXMKLSAgICAgKi8KLSAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgICAgZSA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHJvcGVydHlOYW1lcygpOwotICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7Ci0gICAgfQotICAgIGlmIChlICE9IG51bGwpIHsKLSAgICAgICAgb3V0LndyaXRlKCI8cHJlPiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0YWJsZSBjZWxscGFkZGluZz0nNXB4JyBjZWxsc3BhY2luZz0nMHB4JyBzdHlsZT0nYm9yZGVyOiAuNXB4IGJsdWUgc29saWQ7Jz4iKTsKLSAgICAgICAgZm9yICg7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjx0cj4iKTsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjx0aCBzdHlsZT0nYm9yZGVyOiAuNXB4ICNBM0JCRkYgc29saWQ7Jz4iICsga2V5ICsgIjwvdGg+Iik7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjx0ZCBzdHlsZT0nYm9yZGVyOiAuNXB4ICNBM0JCRkYgc29saWQ7Jz4iICsgZ2V0Rm9ybWF0ZWRTeXN0ZW1Qcm9wZXJ0eShTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KSkgKyAiJm5ic3A7PC90ZD4iKTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiPHRyPiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZSgiPC90YWJsZT4iKTsKLSAgICAgICAgb3V0LndyaXRlKCI8L3ByZT48cD4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBvdXQud3JpdGUoIlN5c3RlbSBwcm9wZXJ0aWVzIGFyZSBub3QgYWNjZXNzaWJsZTxwPiIpOwotICAgIH0KLSU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2Zvb3Rlci5pbmMiLz4KLTwvYm9keT4KLTwvaHRtbD4KLQotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9JbkFjdGl2YXRlU2VydmljZS5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9JbkFjdGl2YXRlU2VydmljZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDMwY2QuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvSW5BY3RpdmF0ZVNlcnZpY2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24sDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSGFzaE1hcCwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciIlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPg0KLTxoMT5EZWFjdGl2YXRlIFNlcnZpY2U8L2gxPg0KLTxmb3JtIG1ldGhvZD0iZ2V0IiBuYW1lPSJzZXJ2aWNlSW5BY3RpdmF0ZSIgYWN0aW9uPSJheGlzMi1hZG1pbi9kZWFjdGl2YXRlU2VydmljZSI+DQotICA8dGFibGUgd2lkdGg9IjEwMCUiICBib3JkZXI9IjAiPg0KLTx0cj4NCi0gIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICA8cD5Pbmx5IHRoZSBzZXJ2aWNlcyB0aGF0IGFyZSBhY3RpdmUgYXJlIGxpc3RlZCBiZWxvdy4gTm90ZSB0aGF0IGFsdGhvdWdoIHlvdSBjYW4gYWN0aXZhdGUgYSBzZXJ2aWNlIGZyb20gdGhpcyBwYWdlLCBvbmNlIHN5c3RlbSBpcyByZXN0YXJ0ZWQgdGhlIHNlcnZpY2Ugd2lsbCBiZSBhY3RpdmUgYWdhaW48L3A+DQotICA8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi08JQ0KLUhhc2hNYXAgc2VydmljZXMgPSAoSGFzaE1hcClyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQKTsNCi1Db2xsZWN0aW9uIGNvbCA9IHNlcnZpY2VzLnZhbHVlcygpOw0KLVN0cmluZyBodG1sID0gIiI7DQotaW50IGNvdW50ID0gMDsNCi0NCi1mb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0JQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2VzID0gKEF4aXNTZXJ2aWNlKSBpdGVyYXRvci5uZXh0KCk7DQotCWlmKGF4aXNTZXJ2aWNlcy5pc0FjdGl2ZSgpKXsNCi0JCWNvdW50Kys7DQotCQlodG1sICs9ICI8b3B0aW9uIHZhbHVlPSciICsgYXhpc1NlcnZpY2VzLmdldE5hbWUoKSArICInPiI7DQotCQlodG1sICs9IGF4aXNTZXJ2aWNlcy5nZXROYW1lKCkgKyAiPC9vcHRpb24+IjsNCi0JfQ0KLX0NCi1yZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQLG51bGwpOw0KLWlmIChjb3VudCA+IDApIHsNCi0lPg0KLQ0KLSAgICA8dGQgd2lkdGg9IjIwJSI+IFNlbGVjdCBTZXJ2aWNlIDogPC90ZD4NCi0gICAgPHRkIHdpZHRoPSI4MCUiPg0KLSAgICAgICA8c2VsZWN0IG5hbWU9ImF4aXNTZXJ2aWNlIiBjbGFzcz0ic2VsZWN0Qm94ZXMiPg0KLTwlPWh0bWwlPg0KLQkJPC9zZWxlY3Q+DQotCTwvdGQ+DQotICA8L3RyPg0KLSAgPHRyPg0KLSAgICA8dGQgd2lkdGg9IjIwJSI+RGVhY3RpdmF0ZSBTZXJ2aWNlIDwvdGQ+DQotICAgIDx0ZCB3aWR0aD0iODAlIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InR1cm5vZmYiPg0KLSAgICA8L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4NCi0gIDx0ZD4mbmJzcDs8L3RkPg0KLSAgPHRkPg0KLSAgICA8aW5wdXQgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgRGVhY3RpdmF0ZSAiID4NCi0gICA8aW5wdXQgbmFtZT0icmVzZXQiIHR5cGU9InJlc2V0IiB2YWx1ZT0iIENsZWFyICIgPg0KLSAgPC90ZD4NCi08JQ0KLX0gZWxzZSB7DQotCSU+DQotCTx0ZCBjb2xzcGFuPSIyIj5ObyBhY3RpdmUgc2VydmljZXMgcHJlc2VudC48L3RkPg0KLQk8JQ0KLX0NCi0lPg0KLSAgPC90cj4NCi0NCi08L3RhYmxlPg0KLTwvZm9ybT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTGVmdEZyYW1lLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0xlZnRGcmFtZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDMyMWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTGVmdEZyYW1lLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXAiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5BcnJheUxpc3QiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNoTWFwIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2h0YWJsZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIgJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTx0YWJsZSB3aWR0aD0iMTAwJSIgc3R5bGU9ImJvcmRlci1yaWdodDoxcHggc29saWQgI0NDQ0NDQzsiPg0KLSAgICA8dHI+DQotICAgICA8dGQgY29sc3Bhbj0iMiIgPg0KLSAgICAgICA8Yj5Ub29scyA8L2I+DQotICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi91cGxvYWQiPlVwbG9hZCBTZXJ2aWNlPC9hPg0KLSAgICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLTx0cj4NCi0gICAgIDx0ZCBjb2xzcGFuPSIyIiA+DQotICAgICAgPGI+PG5vYnI+U3lzdGVtIENvbXBvbmVudHMmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L25vYnI+PC9iPg0KLSAgICAgPC90ZD4NCi0gIDwvdHI+DQotICA8dHI+DQotICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgIDwvdGQ+DQotICAgIDx0ZCA+DQotICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vbGlzdFNlcnZpY2UiPkF2YWlsYWJsZSBTZXJ2aWNlczwvYT4NCi0gICAgPC90ZD4NCi0gPC90cj4NCi0gPHRyPg0KLSAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICA8L3RkPg0KLSAgICA8dGQgPg0KLSAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2xpc3RTZXJ2aWNlR3JvdXBzIj5BdmFpbGFibGUgU2VydmljZSBHcm91cHM8L2E+DQotICAgIDwvdGQ+DQotIDwvdHI+DQotIDx0cj4NCi0gICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgPC90ZD4NCi0gICAgPHRkID4NCi0gICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9saXN0TW9kdWxlcyI+QXZhaWxhYmxlIE1vZHVsZXM8L2E+DQotICAgIDwvdGQ+DQotIDwvdHI+DQotIDx0cj4NCi0gICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgPC90ZD4NCi0gICAgPHRkPg0KLSAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2dsb2JhbE1vZHVsZXMiPkdsb2JhbGx5IEVuZ2FnZWQgTW9kdWxlczwvYT4NCi0gICAgPC90ZD4NCi0gPC90cj4NCi0gPHRyPg0KLSAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICA8L3RkPg0KLSAgICA8dGQgPg0KLSAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2xpc3RQaGFzZXMiPkF2YWlsYWJsZSBQaGFzZXM8L2E+DQotICAgIDwvdGQ+DQotIDwvdHI+DQotICA8dHI+DQotICAgICA8dGQgY29sc3Bhbj0iMiIgPg0KLSAgICAgICA8Yj5FeGVjdXRpb24gQ2hhaW5zPC9iPg0KLSAgICAgPC90ZD4NCi0gIDwvdHI+DQotICAgPHRyPg0KLSAgICAgICA8dGQ+DQotICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KLSAgICAgICA8L3RkPg0KLSAgICAgICA8dGQ+DQotICAgICAgICAgPGEgaHJlZj0iYXhpczItYWRtaW4vdmlld0dsb2JhbEhhbmRsZXJzIj5HbG9iYWwgQ2hhaW5zPC9hPg0KLSAgICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9zZWxlY3RTZXJ2aWNlIj5PcGVyYXRpb24gU3BlY2lmaWMgQ2hhaW5zPC9hPg0KLSAgICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgICA8dHI+DQotICAgICA8dGQgY29sc3Bhbj0iMiIgPg0KLSAgICAgICA8Yj5FbmdhZ2UgTW9kdWxlPC9iPg0KLSAgICAgPC90ZD4NCi0gIDwvdHI+DQotICAgPHRyPg0KLSAgICAgICA8dGQ+DQotICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2VuZ2FnaW5nZ2xvYmFsbHkiPkZvciBhbGwgU2VydmljZXM8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgICA8dHI+DQotICAgICAgICA8dGQ+DQotICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgICA8L3RkPg0KLSAgICAgICAgPHRkPg0KLSAgICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9lbmdhZ2VUb1NlcnZpY2VHcm91cCI+Rm9yIGEgU2VydmljZSBHcm91cDwvYT4NCi0gICAgICAgIDwvdGQ+DQotICAgICA8L3RyPg0KLQ0KLQ0KLSAgICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9lbmdhZ2VUb1NlcnZpY2UiPkZvciBhIFNlcnZpY2U8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotDQotICAgICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9saXN0T3BlcmF0aW9uIj5Gb3IgYW4gT3BlcmF0aW9uPC9hPg0KLSAgICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLQ0KLSAgICA8dHI+DQotICAgICA8dGQgY29sc3Bhbj0iMiIgPg0KLSAgICAgICA8Yj5TZXJ2aWNlczwvYj4NCi0gICAgIDwvdGQ+DQotICA8L3RyPg0KLSAgICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9kZWFjdGl2YXRlU2VydmljZSI+RGVhY3RpdmF0ZSBTZXJ2aWNlPC9hPg0KLSAgICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgICA8dHI+DQotICAgICAgIDx0ZD4NCi0gICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQotICAgICAgIDwvdGQ+DQotICAgICAgIDx0ZD4NCi0gICAgICAgICA8YSBocmVmPSJheGlzMi1hZG1pbi9hY3RpdmF0ZVNlcnZpY2UiPkFjdGl2YXRlIFNlcnZpY2U8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL3NlbGVjdFNlcnZpY2VQYXJhRWRpdCI+RWRpdCBQYXJhbWV0ZXJzPC9hPg0KLSAgICAgICA8L3RkPg0KLSAgICA8L3RyPg0KLSAgICA8dHI+DQotICAgICA8dGQgY29sc3Bhbj0iMiIgPg0KLSAgICAgICA8Yj5Db250ZXh0czwvYj4NCi0gICAgIDwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICAgPHRkPg0KLSAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCi0gICAgICAgPC90ZD4NCi0gICAgICAgPHRkPg0KLSAgICAgICAgIDxhIGhyZWY9ImF4aXMyLWFkbWluL2xpc3RDb250ZXh0cyI+VmlldyBIaWVyYXJjaHk8L2E+DQotICAgICAgIDwvdGQ+DQotICAgIDwvdHI+DQotPC90YWJsZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9MaXN0U2VydmljZUdyb3VwLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0xpc3RTZXJ2aWNlR3JvdXAuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTdiM2RlLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0xpc3RTZXJ2aWNlR3JvdXAuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cyIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlR3JvdXAiICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5Db2xsZWN0aW9uIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIi8+Ci08aDE+QXZhaWxhYmxlIFNlcnZpY2UgR3JvdXBzPC9oMT4KLTwlCi0gICAgSXRlcmF0b3IgYXhpc1NlcnZpY2VHcm91cEl0ZXIgPSAoSXRlcmF0b3IpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgIENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCk7Ci0gICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX0dST1VQX01BUCxudWxsKTsKLSAgICB3aGlsZSAoYXhpc1NlcnZpY2VHcm91cEl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgIEF4aXNTZXJ2aWNlR3JvdXAgYXhpc1NlcnZpY2VHcm91cCA9IChBeGlzU2VydmljZUdyb3VwKSBheGlzU2VydmljZUdyb3VwSXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VHcm91cE5hbWUoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBtb2R1bGVzID0gYXhpc1NlcnZpY2VHcm91cC5nZXRFbmdhZ2VkTW9kdWxlcygpOwotICAgICAgICBJdGVyYXRvciBheGlzU2VydmljZUl0ZXIgPSBheGlzU2VydmljZUdyb3VwLmdldFNlcnZpY2VzKCk7Ci0lPgotPGgyPjwlPWdyb3VwTmFtZSU+PC9oMj48dWw+Ci0gICAgPCUKLSAgICAgICAgd2hpbGUgKGF4aXNTZXJ2aWNlSXRlci5oYXNOZXh0KCkpewotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGF4aXNTZXJ2aWNlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7Ci0gICAgJT4KLSAgICA8bGk+PGZvbnQgY29sb3I9ImJsdWUiPjxhIGhyZWY9ImF4aXMyLWFkbWluL0xpc3RTaW5nbGVTZXJ2aWNlP3NlcnZpY2VOYW1lPTwlPXNlcnZpY2VOYW1lJT4iPgotICAgICAgICA8JT1zZXJ2aWNlTmFtZSU+PC9hPjwvZm9udD48L2xpPgotICAgIDwlCi0gICAgICAgIH0KLSAgICAlPgotPC91bD4KLTwlCi0gICAgaWYgKG1vZHVsZXMuc2l6ZSgpID4gMCkgewotJT4KLTxJPkVuZ2FnZWQgbW9kdWxlczwvST48dWw+Ci0gICAgPCUKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQXhpc01vZHVsZSBheGlzT3BlcmF0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBtb2R1bERlc2MgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICAlPgotICAgIDxsaT48JT1tb2R1bERlc2MlPjwvbGk+Ci0gICAgPCUKLSAgICAgICAgfQotICAgICU+PC91bD48JQotICAgICAgICB9Ci0gICAgfQotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIvPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTG9naW4uanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTG9naW4uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjZjYWZjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL0xvZ2luLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Ci08aHRtbD4KLSAgPGhlYWQ+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaHR0cGJhc2UuanNwIi8+Ci0gICAgPHRpdGxlPkxvZ2luIHRvIEF4aXMyIDo6IEFkbWluaXN0cmF0aW9uIHBhZ2U8L3RpdGxlPgotICAgIDxsaW5rIGhyZWY9ImF4aXMyLXdlYi9jc3MvYXhpcy1zdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgotICA8L2hlYWQ+Ci0KLSAgPGJvZHkgb25sb2FkPSJqYXZhc2NyaXB0OmRvY3VtZW50LkxvZ2luRm9ybS51c2VyTmFtZS5mb2N1cygpOyI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaGVhZGVyLmluYyIvPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2xpbmstZm9vdGVyLmpzcCIvPgotICAgIDx0YWJsZSBjbGFzcz0iRlVMTF9CTEFOSyI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIAk8aDI+V2VsY29tZSA6PC9oMj4KLSAgICAgICAgCTxwPldlbGNvbWUgdG8gdGhlIEF4aXMyIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUuIEZyb20gaW5zaWRlIHRoZSBBeGlzMiBhZG1pbmlzdHJhdGlvbiBjb25zb2xlIHlvdSBjYW4gOjwvcD4KLQkgICAgCTx1bCBzdHlsZT0ibGlzdC1zdHlsZTogbm9uZTsiIGNsYXNzPSJsb2dpblVMIj4KLQkgICAgICAgCQk8bGk+Q2hlY2sgb24gdGhlIGhlYWx0aCBvZiB5b3VyIEF4aXMyIGRlcGxveW1lbnQuPC9saT4KLSAJICAgICAgIAkJPGxpPkNoYW5nZSBhbnkgcGFyYW1ldGVycyBhdCBydW4gdGltZS48L2xpPgotIAkgICAgICAgCQk8bGk+VXBsb2FkIG5ldyBzZXJ2aWNlcyBpbnRvIEF4aXMyIFtTZXJ2aWNlIGhvdC1kZXBsb3ltZW50XS48L2xpPgotIAkgICAJCTwvdWw+Ci0JICAgICAgICA8Zm9udCBjb2xvcj0ib3JhbmdlIj5XYXJuaW5nOiBQbGVhc2Ugbm90ZSB0aGF0IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBkb25lIHRocm91Z2ggdGhlIGFkbWluaXN0cmF0aW9uIGNvbnNvbGUKLSAgICAJICAgIHdpbGwgYmUgbG9zdCB3aGVuIHRoZSBzZXJ2ZXIgaXMgcmVzdGFydGVkLjwvZm9udD4KLSAgICAJPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBuYW1lPSJMb2dpbkZvcm0iIGFjdGlvbj0iYXhpczItYWRtaW4vbG9naW4iPgotICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJMT0dfSU5fRk9STSI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiIgYmdjb2xvcj0iI2IwYjBiMCIgY29sb3I9IiNGRkZGRkYiPjxmb250IGNvbG9yPSIjRkZGRkZGIj5Mb2dpbjwvZm9udD48L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPlVzZXJuYW1lOjwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkPjxpbnB1dCBhbGlnbj0ibGVmdCIgdHlwZT0idGV4dCIgbmFtZT0idXNlck5hbWUiIHRhYmluZGV4PSIxIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+UGFzc3dvcmQgOiA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgYWxpZ249ImxlZnQiIHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29yZCIgdGFiaW5kZXg9IjIiPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgICAgICA8YnI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIj4KLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJjYW5jZWwiIHR5cGU9InJlc2V0IiB2YWx1ZT0iIENsZWFyICI+ICZuYnNwOyAmbmJzcDsKLSAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiBMb2dpbiAiPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Ci0gICAgICAgICAgICAgICAgICA8Zm9udCBjb2xvcj0icmVkIj4mbmJzcDs8JSBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoImVycm9yTWVzc2FnZSIpICE9IG51bGwpIHslPjwlPSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiZXJyb3JNZXNzYWdlIiklPjwlIH0gJT4mbmJzcDs8L2ZvbnQ+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPC9mb3JtPgotICAgICAgICAgIDxici8+PGJyLz48YnIvPjxici8+PGJyLz48YnIvPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxwPlRlc3Q8L3A+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvZm9vdGVyLmluYyIvPgotICA8L2JvZHk+Ci08L2h0bWw+Ci0KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTWFpbkZyYW1lLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL01haW5GcmFtZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzhjNTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvTWFpbkZyYW1lLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08aHRtbD4NCi0gIDxoZWFkPg0KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4NCi0gICAgPHRpdGxlPkF4aXMyIEFkbWluaXN0cmF0aW9uIDwvdGl0bGU+DQotICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotICAgIDwvc3R5bGU+PC9oZWFkPg0KLQ0KLSAgPGJvZHk+DQotICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1NlbGVjdFNlcnZpY2UuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvU2VsZWN0U2VydmljZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYWFhODQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvU2VsZWN0U2VydmljZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotDQotICA8JQ0KLSAgICAgIFN0cmluZyBhY3Rpb24gPSIiOw0KLSAgICAgIFN0cmluZyBidXR0b25OYW1lPSIiIDsNCi0gICAgICBTdHJpbmcgc3RhdHVzID0gKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFTEVDVF9TRVJWSUNFX1RZUEUpOw0KLSAgICAgIFN0cmluZyBoZWFkaW5nID0gIiI7DQotICAgICAgU3RyaW5nIGRpc2MgPSAiIjsNCi0gICAgICBpZihzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZXF1YWxzKCJNT0RVTEUiKSkgew0KLSAgICAgICAgICBhY3Rpb24gPSAibGlzdE9wZXJhdGlvbnMiOw0KLSAgICAgICAgICBidXR0b25OYW1lID0gIiBWaWV3IE9wZXJhdGlvbnMiOw0KLSAgICAgICAgICBoZWFkaW5nID0gIlNlbGVjdCBhIHNlcnZpY2UgdG8gdmlldyBvcGVyYXRpb24gc3BlY2lmaWMgY2hhaW5zIjsNCi0gICAgICAgICAgZGlzYyA9ICJTZWxlY3QgYW4gQXhpcyBzZXJ2aWNlIGZyb20gdGhlIGNvbWJvIGFuZCBjbGljayBvbiB0aGUgJ1ZpZXcgT3BlcmF0aW9ucycgYnV0dG9uIHRvIHZpZXcgb3BlcmF0aW9uIHNwZWNpZmljIENoYWlucy4iOw0KLSAgICAgIH0gZWxzZSBpZihzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZXF1YWxzKCJWSUVXIikpew0KLSAgICAgICAgICBidXR0b25OYW1lID0gIiBWaWV3ICI7DQotICAgICAgICAgIGFjdGlvbiA9ICJ2aWV3U2VydmljZUhhbmRsZXJzIjsNCi0gICAgICAgICAgaGVhZGluZyA9ICJTZWxlY3QgYSBzZXJ2aWNlIHRvIHZpZXcgc2VydmljZSBoYW5kbGVycyI7DQotICAgICAgICAgIGRpc2MgPSAiU2VsZWN0IGFuIEF4aXMgc2VydmljZSBmcm9tIHRoZSBjb21ibyBhbmQgY2xpY2sgb24gdGhlICdWaWV3JyBidXR0b24gdG8gdmlldyBzZXJ2aWNlIGhhbmRsZXJzLiI7DQotICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZXF1YWxzKCJTRVJWSUNFX1BBUkFNRVRFUiIpKXsNCi0gICAgICAgICAgYnV0dG9uTmFtZSA9ICIgRWRpdCBQYXJhbWV0ZXJzICI7DQotICAgICAgICAgIGFjdGlvbiA9ICJlZGl0U2VydmljZVBhcmEiOyAvLyBDb25zdGFudHMuRURJUl9TRVJWSUNFX1BBUkE7DQotICAgICAgICAgIGhlYWRpbmcgPSAiU2VsZWN0IGEgU2VydmljZSB0byBFZGl0IFBhcmFtZXRlcnMiOw0KLSAgICAgICAgICBkaXNjID0gIlNlbGVjdCBhbiBBeGlzIHNlcnZpY2UgZnJvbSB0aGUgY29tYm8gYW5kIGNsaWNrIG9uIHRoZSAnRWRpdCBQYXJhbWV0ZXJzJyBidXR0b24gdG8gZWRpdCBwYXJhbWV0ZXJzLiI7DQotICAgICAgfQ0KLSAgJT4NCi08aDE+PCU9aGVhZGluZyU+PC9oMT4NCi08cD48JT1kaXNjJT48L3A+DQotPGZvcm0gbWV0aG9kPSJnZXQiIG5hbWU9InNlbGVjdFNlcnZpY2VGb3JtIiBhY3Rpb249ImF4aXMyLWFkbWluLzwlPWFjdGlvbiU+Ij4NCi08dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iNTAlIiBjZWxsc3BhY2luZz0iMSIgY2VsbHBhZGRpbmc9IjEiPg0KLSAgICAgICAgIDx0cj4NCi0gICAgICAgIDx0ZCB3aWR0aD0iMzUlIj5TZWxlY3QgYSBTZXJ2aWNlIDo8L3RkPjx0ZCB3aWR0aD0iNjUlIj4NCi0gICAgICAgICAgICA8c2VsZWN0IG5hbWU9ImF4aXNTZXJ2aWNlIj4NCi0gICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gKEhhc2hNYXApcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCk7DQotICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gc2VydmljZUNvbCA9ICBzZXJ2aWNlcy52YWx1ZXMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2VDb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICU+IDxvcHRpb24gIGFsaWduPSJsZWZ0IiB2YWx1ZT0iPCU9c2VydmljZU5hbWUlPiI+PCU9c2VydmljZU5hbWUlPjwvb3B0aW9uPg0KLSAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsbnVsbCk7DQotICAgICAgICAgICAgICU+DQotICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0JPHRyPjx0ZCBjb2xzcGFuPSIyIj4mbmJzcDs8L3RkPjwvdHI+DQotICAgICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+DQotICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+DQotICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IjwlPWJ1dHRvbk5hbWUlPiIgPg0KLSAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgIDwvdHI+DQotICAgICAgPC90YWJsZT4NCi0gICA8L2Zvcm0+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1NlcnZpY2VQYXJhRWRpdC5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9TZXJ2aWNlUGFyYUVkaXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzI3MjZmLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1NlcnZpY2VQYXJhRWRpdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5TGlzdCwKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPgotPGgxPkVkaXQgU2VydmljZSBQYXJhbWV0ZXJzPC9oMT4KLSAgPGZvcm0gbWV0aG9kPSJnZXQiIG5hbWU9ImVkaXRTZXJ2aWNlcGFyYSIgYWN0aW9uPSJheGlzMi1hZG1pbi9lZGl0U2VydmljZXBhcmEiPgotICAgPCUKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLgotICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0UpOwotICAgICAgICAgICAgIGlmKGF4aXNTZXJ2aWNlICE9IG51bGwgKXsKLSAgICU+ICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgotCi0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiA+PGI+Ci0gICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNOYW1lID0gIGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgJT5TZXJ2aWNlIFBhcmFtZXRlcnMgOjogPCU9c2VydmljTmFtZSU+Ci0gICAgICAgICAgICAgICAgIDwvYj48L3RkPgotICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiA+PGlucHV0IHN0eWxlPSJkaXNwbGF5Om5vbmUiICBuYW1lPSJheGlzU2VydmljZSIgdmFsdWU9IjwlPXNlcnZpY05hbWUlPiI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHNlcnZpY2VfcGFyYSA9IGF4aXNTZXJ2aWNlLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlX3BhcmEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSAoUGFyYW1ldGVyKSBzZXJ2aWNlX3BhcmEuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5nZXRQYXJhbWV0ZXJUeXBlKCk9PVBhcmFtZXRlci5PTV9QQVJBTUVURVIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQ+PCU9cGFyYW1ldGVyLmdldE5hbWUoKSU+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9IjwlPXBhcmFtZXRlci5nZXRWYWx1ZSgpJT4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSI8JT0oc2VydmljTmFtZSArICJfIiArIHBhcmFtZXRlci5nZXROYW1lKCkpJT4iIHNpemU9IjUwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSAgYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgICAgIGlmKG9wZXJhdGlvbnMuaGFzTmV4dCgpKXsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3RkPgotICAgICAgICAgICAgICAgICAgICAgIDx0ZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiA+IDxiPk9wZXJhdGlvbiBQYXJhbWF0ZXJzIDo6IDwvYj4KLSAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IG9wX3BhcmFzIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiA+ICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgPjxiPk9wZXJhdGlvbiA6IDwlPW9wZXJhdGlvbk5hbWUlPjwvYj48L3RkPgotICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgIG9wX3BhcmFzID0gYXhpc09wZXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wX3BhcmFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IChQYXJhbWV0ZXIpIG9wX3BhcmFzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldFBhcmFtZXRlclR5cGUoKT09UGFyYW1ldGVyLk9NX1BBUkFNRVRFUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgPHRkPjwlPXBhcmFtZXRlci5nZXROYW1lKCklPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIHZhbHVlPSI8JT1wYXJhbWV0ZXIuZ2V0VmFsdWUoKSU+IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iPCU9KG9wZXJhdGlvbk5hbWUgKyAiXyIgKyBwYXJhbWV0ZXIuZ2V0TmFtZSgpKSU+IiBzaXplPSI1MCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iY2hhbmdlUGFyYSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIENoYW5nZSAiID4KLSAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAJJT4KLSAgICAgICAgICAgIAk8cD48JT1yZXF1ZXN0LmdldEF0dHJpYnV0ZSgic3RhdHVzIiklPjwvcD4KLSAgICAgICAgICAgIAk8JQotICAgICAgICAgICAgIH0KLQotICAgICAgICU+Ci0gICAgICAgPGZvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9Ub3BGcmFtZS5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9Ub3BGcmFtZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MWJmODIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvVG9wRnJhbWUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTxodG1sPg0KLSAgPGhlYWQ+DQotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLSAgICA8dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPg0KLSAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLSAgICA8L3N0eWxlPjwvaGVhZD4NCi0NCi0gIDxib2R5Pg0KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5pbmMiLz4NCi0gIDwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvVmlld0NvbnRleHRzLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdDb250ZXh0cy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MjUzN2MuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvVmlld0NvbnRleHRzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzIiU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlQ29udGV4dCIlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VHcm91cENvbnRleHQiJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPg0KLTxoMT5SdW5uaW5nIENvbnRleHQgSGllcmFyY2h5PC9oMT4NCi08JQ0KLSAgICBDb25maWd1cmF0aW9uQ29udGV4dCBjb25maWdDb250ZXh0ID0gKENvbmZpZ3VyYXRpb25Db250ZXh0KSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoDQotICAgICAgICAgICAgQ29uc3RhbnRzLkNPTkZJR19DT05URVhUKTsNCi0NCi0gICAgU3RyaW5nW10gc2VydmljZUdyb3VwSWRzID0gY29uZmlnQ29udGV4dC5nZXRTZXJ2aWNlR3JvdXBDb250ZXh0SURzKCk7DQotICAgIGlmIChzZXJ2aWNlR3JvdXBJZHMubGVuZ3RoID4gMCkgew0KLSU+DQotPHVsPg0KLSAgICA8JQ0KLQ0KLSAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZUdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7DQotICAgICAgICBTdHJpbmcgZ3JvdXBDb250ZXh0SUQgPSBzZXJ2aWNlR3JvdXBJZHNbaV07DQotICAgICAgICBTZXJ2aWNlR3JvdXBDb250ZXh0IGdyb3VwQ29udGV4dCA9IGNvbmZpZ0NvbnRleHQuZ2V0U2VydmljZUdyb3VwQ29udGV4dChncm91cENvbnRleHRJRCk7DQotICAgICAgICAlPg0KLSAgICAgICAgICAgPGxpPjwlPWdyb3VwQ29udGV4dElEJT48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iYXhpczItYWRtaW4vdmlld1NlcnZpY2VHcm91cENvbmV0eHQ/VFlQRT1WSUVXJklEPTwlPWdyb3VwQ29udGV4dElEJT4iPg0KLSAgICAgICAgICAgICAgICAgICAgVmlldzwvYT48L2ZvbnQ+ICA8Zm9udCBjb2xvcj0icmVkIj48YSBocmVmPSJheGlzMi1hZG1pbi92aWV3U2VydmljZUdyb3VwQ29uZXR4dD9UWVBFPURFTEVURSZJRD08JT1ncm91cENvbnRleHRJRCU+Ij4NCi0gICAgICAgICAgICAgICAgICAgIFJlbW92ZTwvYT4gPC9mb250PjwvbGk+DQotICAgICAgICA8JQ0KLSAgICAgICAgSXRlcmF0b3Igc2VydmljZUNvbnRleHRJdHIgPSBncm91cENvbnRleHQuZ2V0U2VydmljZUNvbnRleHRzKCk7DQotICAgICAgICAgICAgJT48dWw+PCUNCi0gICAgICAgIHdoaWxlIChzZXJ2aWNlQ29udGV4dEl0ci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICBTZXJ2aWNlQ29udGV4dCBzZXJ2aWNlQ29udGV4dCA9IChTZXJ2aWNlQ29udGV4dClzZXJ2aWNlQ29udGV4dEl0ci5uZXh0KCk7DQotICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlQ29uSUQgPSBzZXJ2aWNlQ29udGV4dC5nZXRBeGlzU2VydmljZSgpLmdldE5hbWUoKTsNCi0gICAgICAgICU+DQotICAgICAgICAgICAgPGxpPjwlPXNlcnZpY2VDb25JRCU+PGZvbnQgY29sb3I9ImJsdWUiPjxhIGhyZWY9ImF4aXMyLWFkbWluL3ZpZXdTZXJ2aWNlQ29udGV4dD9UWVBFPVZJRVcmSUQ9PCU9c2VydmljZUNvbklEJT4mUElEPTwlPWdyb3VwQ29udGV4dElEJT4iPg0KLSAgICAgICAgICAgICAgICAgICAgVmlldzwvYT48L2ZvbnQ+PC9saT4NCi0gICAgICAgIDwlDQotICAgICAgICB9DQotICAgICAgICAgICAgICAgICU+PC91bD48aHI+PCUNCi0gICAgfQ0KLSAgICAlPiAgPC91bD4NCi0gICAgICAgIDwlDQotICAgICAgICAgICAgfSBlbHNlIHslPg0KLQk8cD5ObyBydW5uaW5nIGNvbnRleHRzIHdlcmUgZm91bmQgb24gdGhlIHN5c3RlbS48L3A+DQotICAgICAgICAgICAgPCV9DQotJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvVmlld0dsb2JhbEhhbmRsZXJzLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdHbG9iYWxIYW5kbGVycy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTcxYmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvVmlld0dsb2JhbEhhbmRsZXJzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuSGFuZGxlciwNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkxpc3QiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+VmlldyBHbG9iYWwgRXhlY3V0aW9uIENoYWluczwvaDE+DQotICAgPCUNCi0gICAgICAgICAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlnID0gKEF4aXNDb25maWd1cmF0aW9uKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLg0KLSAgICAgICAgICAgICAgICAgICAgZ2V0QXR0cmlidXRlKENvbnN0YW50cy5HTE9CQUxfSEFORExFUlMpOw0KLSAgICAgICAgICAgICBpZihheGlzQ29uZmlnICE9IG51bGwgKXsNCi0gICAgICAgICAgICAgICAgIExpc3QgaGFuZGxlcnMgOw0KLSAgICAgICAgICAgICAgICAgTGlzdCBwaGFzZXMgPSBheGlzQ29uZmlnLmdldEluRmxvd1BoYXNlcygpOw0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDxoMz4gSW4gRmxvdyBVcCBUbyBhbmQgSW5jbHVkaW5nIERpc3BhdGNoZXIgPC9oMz4NCi0gICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlcy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPGxpPlBoYXNlIE5hbWUgOiAgPCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+SGFuZGxlciBOYW1lIDogPCU9aGFuZGxlci5nZXRIYW5kbGVyRGVzYygpLmdldE5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgcGhhc2VzID0gYXhpc0NvbmZpZy5nZXRJbkZhdWx0Rmxvd1BoYXNlcygpOw0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDxoMz4gSW4gRmF1bHQgRmxvdyA8L2gzPg0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8bGk+UGhhc2UgTmFtZSAgOiA8JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXJzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5IYW5kbGVyIE5hbWUgOiA8JT1oYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0TmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotDQotICAgICAgICAgICAgICAgICBwaGFzZXMgPSBheGlzQ29uZmlnLmdldE91dEZsb3dQaGFzZXMoKTsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDM+IE91dCBGbG93IDwvaDM+DQotICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgcGhhc2VzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDxsaT5QaGFzZSBOYW1lIDogPCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+SGFuZGxlciBOYW1lIDogPCU9aGFuZGxlci5nZXRIYW5kbGVyRGVzYygpLmdldE5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgcGhhc2VzID0gYXhpc0NvbmZpZy5nZXRPdXRGYXVsdEZsb3dQaGFzZXMoKTsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDM+IE91dCBGYXVsdCBGbG93IDwvaDM+DQotICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgcGhhc2VzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDxsaT5QaGFzZSBOYW1lIDogPCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gcGhhc2UuZ2V0SGFuZGxlcnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBoYW5kbGVycy5zaXplKCk7IGorKykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gKEhhbmRsZXIpIGhhbmRsZXJzLmdldChqKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+SGFuZGxlciBOYW1lIDogPCU9aGFuZGxlci5nZXRIYW5kbGVyRGVzYygpLmdldE5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDwvdWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9WaWV3U2VydmljZUhhbmRsZXJzLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdTZXJ2aWNlSGFuZGxlcnMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5YjdjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL1ZpZXdTZXJ2aWNlSGFuZGxlcnMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIsDQotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZSwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciIlPg0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGh0bWw+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPg0KLTxoMT5WaWV3IE9wZXJhdGlvbiBTcGVjaWZpYyBDaGFpbnM8L2gxPg0KLSAgIDwlDQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpcmVxdWVzdC5nZXRTZXNzaW9uKCkuDQotICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfSEFORExFUlMpOw0KLSAgICAgICAgICAgICBpZihheGlzU2VydmljZSAhPSBudWxsICl7DQotICAgICAgICAgICAgICAgIExpc3QgaGFuZGxlcnMgOw0KLSAgICAgICAgICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zID0gIGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgICAgICAgICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbm9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICU+PGgyPk9wZXJhdGlvbiBOYW1lIDogPCU9YXhpc09wZXJhdGlvbm9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+PC9oMj48JQ0KLSAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBwaGFzZXMgPSBheGlzT3BlcmF0aW9ub24uZ2V0UmVtYWluaW5nUGhhc2VzSW5GbG93KCk7DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPGgzPiBJbiBGbG93IDwvaDM+DQotICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMuc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgcGhhc2VzLmdldChpKTsNCi0gICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgIDxsaT5QaGFzZSBOYW1lIDogIDwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlcnMuc2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkhhbmRsZXIgTmFtZSA6IDwlPWhhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKS5nZXROYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIHBoYXNlcyA9IGF4aXNPcGVyYXRpb25vbi5nZXRQaGFzZXNJbkZhdWx0RmxvdygpOw0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDxoMz4gSW4gRmF1bHQgRmxvdyA8L2gzPg0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8bGk+UGhhc2UgTmFtZSAgOiA8JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXJzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5IYW5kbGVyIE5hbWUgOiA8JT1oYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0TmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotDQotICAgICAgICAgICAgICAgICBwaGFzZXMgPSBheGlzT3BlcmF0aW9ub24uZ2V0UGhhc2VzT3V0RmxvdygpOw0KLSAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgIDxoMz4gT3V0IEZsb3cgPC9oMz4NCi0gICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlcy5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSBwaGFzZXMuZ2V0KGkpOw0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPGxpPlBoYXNlIE5hbWUgOiA8JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PC9saT4NCi0gICAgICAgICAgICAgICAgICAgICA8dWw+DQotICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBwaGFzZS5nZXRIYW5kbGVycygpOw0KLSAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhhbmRsZXJzLnNpemUoKTsgaisrKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSAoSGFuZGxlcikgaGFuZGxlcnMuZ2V0KGopOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5IYW5kbGVyIE5hbWUgOiA8JT1oYW5kbGVyLmdldEhhbmRsZXJEZXNjKCkuZ2V0TmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPC91bD4NCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgICAgICAgICBwaGFzZXMgPSBheGlzT3BlcmF0aW9ub24uZ2V0UGhhc2VzT3V0RmF1bHRGbG93KCk7DQotICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgPGgzPiBPdXQgRmF1bHQgRmxvdyA8L2gzPg0KLSAgICAgICAgICAgICAgICAgPHVsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHBoYXNlcy5nZXQoaSk7DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8bGk+UGhhc2UgTmFtZSA6IDwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48L2xpPg0KLSAgICAgICAgICAgICAgICAgICAgIDx1bD4NCi0gICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9IHBoYXNlLmdldEhhbmRsZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaGFuZGxlcnMuc2l6ZSgpOyBqKyspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXIgaGFuZGxlciA9IChIYW5kbGVyKSBoYW5kbGVycy5nZXQoaik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPkhhbmRsZXIgTmFtZSA6IDwlPWhhbmRsZXIuZ2V0SGFuZGxlckRlc2MoKS5nZXROYW1lKCklPjwvbGk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8L3VsPg0KLSAgICAgICAgICAgICAgICAgPCUNCi0NCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvYWRtaW4uanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvYWRtaW4uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhlZTE0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2FkbWluLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+V2VsY29tZSB0byBBeGlzMiBXZWIgQWRtaW4gTW9kdWxlICEhPC9oMT4NCi08cD5Zb3UgYXJlIG5vdyBsb2dnZWQgaW50byB0aGUgQXhpczIgYWRtaW5pc3RyYXRpb24gY29uc29sZSBmcm9tIGluc2lkZQ0KLXRoZSBjb25zb2xlIHlvdSB3aWxsIGJlIGFibGUgdG88L3A+DQotICAgIDx1bD4NCi0gICAgICAgIDxsaT50byBjaGVjayBvbiB0aGUgaGVhbHRoIG9mIHlvdXIgQXhpczIgZGVwbG95bWVudC48L2xpPg0KLSAgICAgICAgPGxpPnRvIGNoYW5nZSBhbnkgcGFyYW1ldGVycyBhdCBydW4gdGltZS48L2xpPg0KLSAgICAgICAgPGxpPnRvIHVwbG9hZCBuZXcgc2VydmljZXMgaW50byBBeGlzMiBbU2VydmljZSBob3QtZGVwbG95bWVudF0uPC9saT4NCi0gICAgPC91bD4NCi0NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc0OWU1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1CT0RZICAgICAgICAgewotCWJhY2tncm91bmQtY29sb3IgOiAiI0ZGRkZGRiI7Ci0JbGVmdG1hcmdpbjoiMCI7Ci0JdG9wbWFyZ2luOiIwIjsKLQlmb250LWZhbWlseTpBcmlhbDsKLQlmb250LXNpemU6MTFwdDsKLX0KLWgxICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiAxNnB0OyBmb250LXdlaWdodDogYm9sZCB9Ci1oMiAgICAgICAgICAgeyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTogMTNwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNUQwRDdEIH0KLXVsICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiAxMXB0IH0KLWlucHV0ICAgICAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiA4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLXRkICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiAxMHB0IH0KLWgzICAgICAgICAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOiAxMnB0OyBmb250LXdlaWdodDpib2xkIH0KLVRBQkxFLkZVTExfQkxBTksgewotCXdpZHRoIDogMTAwJTsKLQloZWlnaHQgOiAxMDAlOwotCWJvcmRlciA6IDA7Ci0JcGFkZGluZyA6IDA7Ci19Ci0KLVRBQkxFLkxPR19JTl9GT1JNewotCWhlaWdodDogMjAwcHglOwotCWJvcmRlcjoxcHggc29saWQgIzAwMDAwMDsKLQl3aWR0aDogMzAwcHglOwotCWNlbGxzcGFjaW5nOjFweDsKLQljZWxscGFkZGluZzoxcHg7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNyA7Ci19Ci0KLVVMLmxvZ2luVUwgTEl7Ci0JcGFkZGluZzogMTBwdDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9kaXNlbmdhZ2UuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZGlzZW5nYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5YmI3Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9kaXNlbmdhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiLz4KLTwlPXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZSgic3RhdHVzIiklPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIiAvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2VuZ2FnaW5nZ2xvYmFsbHkuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZW5nYWdpbmdnbG9iYWxseS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOWQyYTQuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZW5nYWdpbmdnbG9iYWxseS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01vZHVsZSwNCi0gICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXAsDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHMiICU+DQotPGh0bWw+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIi8+DQotPCUNCi0gICAgU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUyk7DQotJT4NCi08aDE+RW5nYWdlIE1vZHVsZSBHbG9iYWxseTwvaDE+DQotDQotPHA+VG8gZW5nYWdlIGEgbW9kdWxlIG9uIGFsbCBzZXJ2aWNlcyBhY3Jvc3MgdGhlIHN5c3RlbSwgc2VsZWN0IGEgbW9kdWxlIGZyb20gdGhlIGNvbWJvIGJveCBiZWxvdw0KLSAgICBhbmQgY2xpY2sgb24gdGhlICJFbmdhZ2UiIGJ1dHRvbi4gQW55IG1vZHVsZSB0aGF0IG5lZWRzIHRvIHBsYWNlIGhhbmRsZXJzIGludG8gdGhlIHByZS1kaXNwYXRjaA0KLSAgICBwaGFzZSBuZWVkcyB0byBiZSBlbmdhZ2VkIGdsb2JhbGx5LjwvcD4NCi0NCi08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0TW9kdWxlRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9lbmdhZ2luZ2dsb2JhbGx5Ij4NCi0gICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIiBjZWxscGFkZGluZz0iMSI+DQotICAgICAgICA8dHI+DQotICAgICAgICAgICAgPHRkIHdpZHRoPSIxNSUiPlNlbGVjdCBhIE1vZHVsZSA6PC90ZD4NCi0gICAgICAgICAgICA8dGQgd2lkdGg9Ijc1JSIgYWxpZ249ImxlZnQiPg0KLSAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im1vZHVsZXMiPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIG1vZHVsZXMgPSAoSGFzaE1hcCkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVAsbnVsbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBtb2R1bGVDb2wgPSBtb2R1bGVzLnZhbHVlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVDb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTW9kdWxlIGF4aXNPcGVyYXRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gYWxpZ249ImxlZnQiIHZhbHVlPSI8JT1tb2R1bGVuYW1lJT4iPjwlPW1vZHVsZW5hbWUlPg0KLSAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+DQotICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIEVuZ2FnZSAiPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICA8L3RhYmxlPg0KLTwvZm9ybT4NCi08JQ0KLSAgICBpZiAoc3RhdHVzICE9IG51bGwpIHsNCi0lPg0KLTxwIHN0eWxlPSJjb2xvcjpibHVlIj48JT1VdGlscy5zYW5pdGl6ZVdlYk91dHB1dChzdGF0dXMpJT48L3A+DQotPCUNCi0gICAgfSAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIvPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2VuZ2FnaW5ndG9hbm9wZXJhdGlvbi5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYW5vcGVyYXRpb24uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGIxMjEwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2VuZ2FnaW5ndG9hbm9wZXJhdGlvbi5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgbGFuZ3VhZ2U9ImphdmEiIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuVXRpbHMsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNoTWFwLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPg0KLTwlDQotICAgIFN0cmluZyBzdGF0dXMgPSAoU3RyaW5nKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUyk7DQotJT4NCi08aDE+RW5nYWdlIE1vZHVsZSBmb3IgYW4gT3BlcmF0aW9uPC9oMT4NCi08cD5UbyBlbmdhZ2UgYSBtb2R1bGUgZm9yIGFuICBheGlzIG9wZXJhdGlvbiw8L3A+DQotICAgIDxvbD4NCi0gICAgICAgICAgICA8bGk+c2VsZWN0IHRoZSBtb2R1bGUgeW91IHdhbnQgdG8gZW5nYWdlIDwvbGk+DQotICAgICAgICAgICAgPGxpPnNlbGVjdCB0aGUgYXhpcyBvcGVyYXRpb24geW91IGxpa2UgdGhlIG1vZHVsZSB0byBiZSBlbmdhZ2VkLjwvbGk+DQotICAgICAgICAgICAgPGxpPmNsaWNrICJFbmdhZ2UiLjwvbGk+DQotICAgICAgICA8L29sPg0KLQ0KLTxmb3JtIG1ldGhvZD0iZ2V0IiBuYW1lPSJzZWxlY3RNb2R1bGVGb3JtIiBhY3Rpb249ImF4aXMyLWFkbWluL2xpc3RPcGVyYXRpb25zIj4NCi08dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxIj4NCi0gICAgPHRyPg0KLSAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgPC90ZD4NCi0gICAgPC90cj4NCi0gICAgPHRyPg0KLSAgICAgICAgPHRkPlNlbGVjdCBhIE1vZHVsZSA6PC90ZD4NCi0gICAgPC90cj4NCi0gICAgPHRyPg0KLSAgICAgICAgPHRkPg0KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibW9kdWxlcyI+DQotICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgSGFzaE1hcCBtb2R1ZWxzID0gKEhhc2hNYXApcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQKTsNCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOw0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uIG1vZHVsZUNvbCA9ICBtb2R1ZWxzLnZhbHVlcygpOw0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlQ29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc09wZXJhdGlvbiA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlbmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICU+IDxvcHRpb24gIGFsaWduPSJsZWZ0IiB2YWx1ZT0iPCU9bW9kdWxlbmFtZSU+Ij48JT1tb2R1bGVuYW1lJT48L29wdGlvbj4NCi0gICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgPC90ZD4NCi0gICAgICAgIDwvdHI+DQotICAgICAgICA8dHI+DQotICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHI+DQotICAgICAgICA8dGQ+U2VsZWN0IGFuIE9wZXJhdGlvbiA6PC90ZD4NCi0gICAgPC90cj4NCi0gICAgPHRyPg0KLSAgICAgICAgPHRkPg0KLSAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iYXhpc09wZXJhdGlvbiI+DQotICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9IChJdGVyYXRvcilyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk9QRVJBVElPTl9NQVApOw0KLSAgICAgICAgICAgICAgICB3aGlsZSAob3BlcmF0aW9ucy5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbnRpb24gPSAoQXhpc09wZXJhdGlvbilvcGVyYXRpb25zLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcG5hbWUgPSBheGlzT3BlcmF0aW9udGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7DQotICAgICAgICAgICAgJT4gPG9wdGlvbiAgYWxpZ249ImxlZnQiIHZhbHVlPSI8JT1vcG5hbWUlPiI+PCU9b3BuYW1lJT48L29wdGlvbj4NCi0gICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk9QRVJBVElPTl9NQVAsbnVsbCk7DQotICAgICAgICAgICAgICU+DQotICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIgRW5nYWdlICIgPg0KLSAgICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgIDwvdHI+DQotICAgICAgICAgPHRyPg0KLSAgICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICAgPC90ZD4NCi0gICAgICAgICA8L3RyPg0KLSAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICAgPHRkPg0KLSAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgPC90cj4NCi0gICAgICAgICA8dHI+DQotICAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNvbHM9IjUwIiAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihzdGF0dXMgPT0gbnVsbCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICU+DQotICAgICAgICAgICAgICAgICAgICA+PCU9VXRpbHMuc2FuaXRpemVXZWJPdXRwdXQoc3RhdHVzKSU+PC90ZXh0YXJlYT4NCi0gICAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICAgICA8L3RyPg0KLSAgICAgIDwvdGFibGU+DQotICAgPC9mb3JtPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYXNlcnZpY2UuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZW5nYWdpbmd0b2FzZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3ZDA2Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lbmdhZ2luZ3RvYXNlcnZpY2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2hNYXAsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiDQotICAgICAgICAgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIudXRpbC5VdGlscyIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPCUNCi0gICAgU3RyaW5nIHN0YXR1cyA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRU5HQUdFX1NUQVRVUyk7DQotJT4NCi08aDE+RW5nYWdlIE1vZHVsZSBmb3IgYSBTZXJ2aWNlPC9oMT4NCi0NCi08cD5UbyBlbmdhZ2UgYSBtb2R1bGUgZm9yIGEgYXhpcyBzZXJ2aWNlLDwvcD4NCi0NCi0gICAgPG9sPg0KLSAgICAgICAgPGxpPnNlbGVjdCB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGVuZ2FnZTwvbGk+DQotICAgICAgICA8bGk+c2VsZWN0IHRoZSBheGlzIHNlcnZpY2UgeW91IGxpa2UgdGhlIG1vZHVsZSB0byBiZSBlbmdhZ2VkLjwvbGk+DQotICAgICAgICA8bGk+Y2xpY2sgIkVuZ2FnZSIuPC9saT4NCi0gICAgPC9vbD4NCi0NCi08Zm9ybSBtZXRob2Q9ImdldCIgbmFtZT0ic2VsZWN0TW9kdWxlRm9ybSIgYWN0aW9uPSJheGlzMi1hZG1pbi9lbmdhZ2VUb1NlcnZpY2UiPg0KLSAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxIj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgICAgICAmbmJzcDsNCi0gICAgICAgICAgICA8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+U2VsZWN0IGEgTW9kdWxlIDo8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0ibW9kdWxlcyI+DQotICAgICAgICAgICAgICAgICAgICA8JQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hNYXAgbW9kdWVscyA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gbW9kdWxlQ29sID0gIG1vZHVlbHMudmFsdWVzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1vZHVsZUNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgYXhpc09wZXJhdGlvbiA9IChBeGlzTW9kdWxlKSBpdGVyYXRvci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVuYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPW1vZHVsZW5hbWUlPiI+PCU9bW9kdWxlbmFtZSU+DQotICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDwlDQotDQotICAgICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD5TZWxlY3QgYSBTZXJ2aWNlIDo8L3RkPg0KLSAgICAgICAgPC90cj4NCi0gICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQ+DQotICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iYXhpc1NlcnZpY2UiPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBIYXNoTWFwIHNlcnZpY2VzID0gKEhhc2hNYXApcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBzZXJ2aWNlQ29sID0gIHNlcnZpY2VzLnZhbHVlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlQ29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBheGlzU2VydmljZS5nZXROYW1lKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBhbGlnbj0ibGVmdCIgdmFsdWU9IjwlPXNlcnZpY2VOYW1lJT4iPjwlPXNlcnZpY2VOYW1lJT4NCi0gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsbnVsbCk7DQotDQotICAgICAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iIEVuZ2FnZSAiPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgJm5ic3A7DQotICAgICAgICAgICAgICAgICZuYnNwOw0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICAgICAgPHRyPg0KLSAgICAgICAgICAgIDx0ZD4NCi0gICAgICAgICAgICAgICAgPHRleHRhcmVhIGNvbHM9IjUwIiAgPCUNCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImRpc3BsYXk6bm9uZSINCi0gICAgICAgICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICU+DQotICAgICAgICAgICAgICAgICAgICAgICAgPjwlPVV0aWxzLnNhbml0aXplV2ViT3V0cHV0KHN0YXR1cyklPg0KLSAgICAgICAgICAgICAgICA8L3RleHRhcmVhPg0KLSAgICAgICAgICAgIDwvdGQ+DQotICAgICAgICA8L3RyPg0KLSAgICA8L3RhYmxlPg0KLTwvZm9ybT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQotDQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZXJyb3IuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZXJyb3IuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODUwMDQwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2Vycm9yLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTwlQHBhZ2UgaXNFcnJvclBhZ2U9InRydWUiICU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIj48L2pzcDppbmNsdWRlPg0KLSAgPHRhYmxlPg0KLSAgPHRyPg0KLSAgPHRkIGFsaWduPSJjZW50ZXIiPkFuIGVycm9yIGhhcyBvY2N1cmVkIS4gUGxlYXNlIGNoZWNrIHRoZSBkZXRhaWxzIGJlbG93PC90ZD4NCi0gIDwvdHI+DQotICA8dHI+DQotICA8dGQgYWxpZ249ImNlbnRlciI+PCU9ZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSU+PC90ZD4NCi0gIDwvdHI+DQotICA8L3RhYmxlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lcnJvck1vZHVsZS5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9lcnJvck1vZHVsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDBlM2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZXJyb3JNb2R1bGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywKLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkhhc2h0YWJsZSIlPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4KLSAgPCUKLSAgICAgIEhhc2h0YWJsZSBlcnJvcm5lc3NNb2R1bGVzID0oSGFzaHRhYmxlKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRVJST1JfTU9EVUxFX01BUCk7Ci0gICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJtb2R1bGVOYW1lIik7Ci0gICU+IDxoMz5UaGUgTW9kdWxlIGhhcyBkZXBsb3ltZW50IGZhdWx0czwvaDM+PCUKLSAgJT48Zm9udCBjb2xvcj0icmVkIiA+PCU9KFN0cmluZyllcnJvcm5lc3NNb2R1bGVzLmdldChtb2R1bGVOYW1lKSAlPjwvZm9udD48JQotICAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIj48L2pzcDppbmNsdWRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2dsb2JhbE1vZHVsZXMuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZ2xvYmFsTW9kdWxlcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDE0Y2EuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvZ2xvYmFsTW9kdWxlcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0gPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPiA8JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24sDQotICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuSXRlcmF0b3IiJT4NCi0gPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotPGgxPkdsb2JhbGx5IEVuZ2FnZWQgTW9kdWxlczwvaDE+DQotICAgICA8JQ0KLSAgICAgICAgIGJvb2xlYW4gZm91bmRNb2R1bGVzID0gZmFsc2U7DQotICAgICAgICAgYm9vbGVhbiB3cm90ZVVMID0gZmFsc2U7DQotICAgICAgICAgU3RyaW5nIG1vZHVsZW5hbWUgPSAiIjsNCi0gICAgICAgICBDb2xsZWN0aW9uIG1vZHVsZUNvbCA9IChDb2xsZWN0aW9uKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLk1PRFVMRV9NQVApOw0KLSAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCwgbnVsbCk7DQotICAgICAgICAgaWYgKG1vZHVsZUNvbCAhPSBudWxsICYmIG1vZHVsZUNvbC5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2R1bGVDb2wuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgICAgICAgQXhpc01vZHVsZSBheGlzT3BlcmF0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBheGlzT3BlcmF0aW9uLmdldE5hbWUoKTsNCi0gICAgICAgICAgICAgICAgIGlmICghd3JvdGVVTCkgew0KLSAgICAgICAgICAgICAgICAgICAgIHdyb3RlVUwgPSB0cnVlOw0KLSAgICAgJT4NCi0JPHVsPg0KLTwlDQotCQl9DQotICAgICAlPjxsaT48JT1tb2R1bGVuYW1lJT48L2xpPg0KLSAgICAgPGJyPiA8JQ0KLSAgICAgICAgICAgICB9DQotCQlpZiAod3JvdGVVTCl7DQotJT4NCi0JPC91bD4NCi08JQ0KLQkJfQ0KLSAgICAgICAgIH0gZWxzZXsNCi0gICAgICU+DQotICAgIDxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+VGhlcmUgYXJlIG5vIG1vZHVsZXMgZW5nYWdlZCBnbG9iYWxseTwvZm9udD48L2gyPiANCi0gICAgICAgICAgICAgICAgIDwlDQotICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2FzZi1sb2dvLmdpZiBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9hc2YtbG9nby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDAzMjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2FzZi1sb2dvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzLmdpZiBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2ltYWdlcy9heGlzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3MGM1Yi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpcy5qcGcgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpcy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Zjk3NjIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2F4aXMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW1hZ2VzL2F4aXNfbC5qcGcgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpc19sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYTc1NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbWFnZXMvYXhpc19sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvYWRtaW5mb290ZXIuaW5jIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMjI1NzEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08L3RkPjwvdHI+Ci08L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9hZG1pbmhlYWRlci5pbmMgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2FkbWluaGVhZGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWUwOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2FkbWluaGVhZGVyLmluYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTx0YWJsZSB3aWR0aD0iMTAwJSI+Ci0gIDx0cj4KLSAgICA8dGQgYWxpZ249ImxlZnQiPjxpbWcgc3JjPSJheGlzMi13ZWIvaW1hZ2VzL2FzZi1sb2dvLmdpZiIvPjxoMT5BeGlzIDI8L2gxPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJyaWdodCI+PGltZyBzcmM9ImF4aXMyLXdlYi9pbWFnZXMvYXhpcy5qcGciLz48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgIDx0ZD4uPC90ZD4KLSAgIDx0ZCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9ImxvZ291dCIgdGFyZ2V0PSJfcGFyZW50IiA+TG9nIG91dDwvYT48L3RkPgotICAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2FkbWluaGVhZGVyLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvYWRtaW5oZWFkZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjg3ZTgyLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvYWRtaW5oZWFkZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHQiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVwbG95bWVudC51dGlsLlBoYXNlc0luZm8iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXIiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5QaGFzZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuQXJyYXlMaXN0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkNvbGxlY3Rpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+DQotPCUtLQ0KLX4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLX4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi1+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi1+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi1+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLX4NCi1+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLX4NCi1+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotfiB1bmRlciB0aGUgTGljZW5zZS4NCi0tLSU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPg0KLTxodG1sPg0KLSAgPGhlYWQ+DQotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIuLi9pbmNsdWRlL2h0dHBiYXNlLmpzcCIvPg0KLSAgICA8dGl0bGU+QXhpczIgOjogQWRtaW5pc3RyYXRpb24gUGFnZTwvdGl0bGU+DQotICAgIDxsaW5rIGhyZWY9ImF4aXMyLXdlYi9jc3MvYXhpcy1zdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4NCi0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIvPg0KLSAgPC9oZWFkPg0KLQ0KLSAgPGJvZHk+DQotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJoZWFkZXIuaW5jIi8+DQotICAgIDx0YWJsZSBjbGFzcz0iRlVMTF9CTEFOSyI+DQotICAgICAgPHRyPg0KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjAlIj4NCi0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii4uL0xlZnRGcmFtZS5qc3AiLz4NCi0gICAgICAgIDwvdGQ+DQotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiB3aWR0aD0iODAlIj4NCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+DQotICAgICAgICAgIDx0cj4NCi0gICAgICAgICAgICA8dGQgYWxpZ249InJpZ2h0IiBjb2xzcGFuPSIyIj48YSBocmVmPSIjIiBvbmNsaWNrPSJqYXZhc2NyaXB0Omhpc3RvcnkuYmFjaygpOyI+QmFjazwvYT4mbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7PGENCi0gICAgICAgICAgICAgIGhyZWY9ImF4aXMyLWFkbWluL2xvZ291dCI+TG9nIG91dDwvYT48L3RkPg0KLSAgICAgICAgICA8L3RyPg0KLSAgICAgICAgPC90YWJsZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2Zvb3Rlci5pbmMgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2Zvb3Rlci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGI5NDUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9mb290ZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPC90ZD4KLTwvdHI+Ci08dHIgaGVpZ2h0PSIyMHB4Ij4KLQk8dGQ+Ci0JPHRhYmxlIHdpZHRoPSIxMDAlIj4KLQkJPHRyPjx0ZD4KLQkJCTx0YWJsZSB3aWR0aD0iOTUwcHgiPgotCQkJCTx0cj48dGQ+PGhyIHNpemU9IjEiIG5vc2hhZGU9IiIgLz48L3RkPjwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgYWxpZ249ImNlbnRlciI+Q29weXJpZ2h0ICYjMTY5OyAxOTk5LTIwMDYsIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjxiciAvPkxpY2Vuc2VkIHVuZGVyIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC90ZD4KLQkJCQk8L3RyPgotCQkJPC90YWJsZT4KLQkJPC90ZD4KLQkJPHRkPiZuYnNwOzwvdGQ+Ci0JCTwvdHI+Ci0JPC90YWJsZT4KLQk8L3RkPgotPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2hlYWRlci5pbmMgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2hlYWRlci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDBmOTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9oZWFkZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHRhYmxlIGNsYXNzPSJGVUxMX0JMQU5LIj48dHIgaGVpZ2h0PSIxMDAlIj48dGQgdmFsaWduPSJ0b3AiPgotPHRhYmxlIHdpZHRoPSIxMDAlIj4KLTx0cj48dGQ+Ci08dGFibGUgd2lkdGg9Ijk1MHB4Ij4KLSAgPHRyPgotICAgIDx0ZCBhbGlnbj0ibGVmdCI+PGltZyBzcmM9ImF4aXMyLXdlYi9pbWFnZXMvYXNmLWxvZ28uZ2lmIi8+PC90ZD4KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij48aW1nIHNyYz0iYXhpczItd2ViL2ltYWdlcy9heGlzX2wuanBnIi8+PC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLTwvdGQ+Ci08dGQ+Jm5ic3A7PC90ZD48L3RyPjwvdGFibGU+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2h0dHBiYXNlLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvaHR0cGJhc2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGY4NjNjLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvaHR0cGJhc2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPCUtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tJT4KLQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuYWRkcmVzc2luZy5FbmRwb2ludFJlZmVyZW5jZSIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jbGllbnQuT3B0aW9ucyIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudCIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LkNvbmZpZ3VyYXRpb25Db250ZXh0IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuQ29uZmlndXJhdGlvbkNvbnRleHRGYWN0b3J5IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUNvbnRleHQiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5TZXJ2aWNlR3JvdXBDb250ZXh0IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlcGxveW1lbnQudXRpbC5QaGFzZXNJbmZvIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZUdyb3VwIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb24iICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkhhbmRsZXIiICU+Ci08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLnRyYW5zcG9ydC5odHRwLkF4aXNTZXJ2bGV0IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIiICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkiICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEuaW8uSU9FeGNlcHRpb24iICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEuaW8uSW5wdXRTdHJlYW0iICU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEuaW8uU3RyaW5nV3JpdGVyIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuQXJyYXlMaXN0IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkVudW1lcmF0aW9uIiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2h0YWJsZSIgJT4KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPgotPCUhCi0gIHByaXZhdGUgU3RyaW5nIGZyb250ZW5kSG9zdFVybDsKLQotICBwdWJsaWMgdm9pZCBqc3BJbml0KCkgewotICAgIFNlcnZsZXRDb250ZXh0IGNvbnRleHQgPSB0aGlzLmdldFNlcnZsZXRDb25maWcoKS5nZXRTZXJ2bGV0Q29udGV4dCgpOwotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ2N0eCA9IChDb25maWd1cmF0aW9uQ29udGV4dCkgY29udGV4dC5nZXRBdHRyaWJ1dGUoQXhpc1NlcnZsZXQuQ09ORklHVVJBVElPTl9DT05URVhUKTsKLSAgICBpZiAoY29uZmlnY3R4ICE9IG51bGwpewotICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gY29uZmlnY3R4LmdldEF4aXNDb25maWd1cmF0aW9uKCkuZ2V0UGFyYW1ldGVyKENvbnN0YW50cy5IVFRQX0ZST05URU5EX0hPU1RfVVJMKTsKLSAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgZnJvbnRlbmRIb3N0VXJsID0gKFN0cmluZykgcGFyYW1ldGVyLmdldFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUh0dHBCYXNlKEh0dHBTZXJ2bGV0UmVxdWVzdCBhUmVxdWVzdCkgewotICAgIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgaWYgKGZyb250ZW5kSG9zdFVybCAhPSBudWxsKSB7Ci0gICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGZyb250ZW5kSG9zdFVybCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFN0cmluZyBzY2hlbWUgPSBhUmVxdWVzdC5nZXRTY2hlbWUoKTsKLSAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoc2NoZW1lKTsKLSAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIjovLyIpOwotICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChhUmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCkpOwotICAgICAgaWYgKCgiaHR0cCIuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWUpICYmIGFSZXF1ZXN0LmdldFNlcnZlclBvcnQoKSAhPSA4MCkgfHwgImh0dHBzIi5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSkgJiYgYVJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpICE9IDQ0MykKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgiOiIpOwotICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFSZXF1ZXN0LmdldFNlcnZlclBvcnQoKSk7Ci0gICAgICB9Ci0gICAgICAvLyBJIHRoaW5rIGkgc2F3IHdlYiBjb250YWluZXJzIHJldHVybiBudWxsIGZvciByb290IHdlYiBjb250ZXh0Ci0gICAgICBpZiAoYVJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAhPSBudWxsKSB7Ci0gICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoYVJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGFwcGVuZCAvIGNoYXIgaWYgbmVlZGVkCi0gICAgaWYgKHN0cmluZ0J1ZmZlci5jaGFyQXQoc3RyaW5nQnVmZmVyLmxlbmd0aCgpIC0gMSkgIT0gJy8nKSB7Ci0gICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCIvIik7Ci0gICAgfQotICAgIFN0cmluZyBjdXJlbnRVcmwgPSBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICBhUmVxdWVzdC5zZXRBdHRyaWJ1dGUoImZyb250ZW5kSG9zdFVybCIsIGN1cmVudFVybCk7Ci0gICAgcmV0dXJuIGN1cmVudFVybDsKLSAgfQotJT48YmFzZSBocmVmPSI8JT0gY2FsY3VsYXRlSHR0cEJhc2UocmVxdWVzdCklPiIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2luY2x1ZGUvbGluay1mb290ZXIuaW5jIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9saW5rLWZvb3Rlci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzhjZTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9saW5rLWZvb3Rlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08dGFibGUgd2lkdGg9IjEwMCUiPgotIDx0cj4KLSAgIDx0ZCBhbGlnbj0iY2VudGVyIj48YSBocmVmPSJpbmRleC5qc3AiPkJhY2sgSG9tZTwvYT48L3RkPgotICAgPC90cj4KLTwvdGFibGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5jbHVkZS9saW5rLWZvb3Rlci5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2xpbmstZm9vdGVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2ZTAxYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmNsdWRlL2xpbmstZm9vdGVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmFkZHJlc3NpbmcuRW5kcG9pbnRSZWZlcmVuY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNsaWVudC5PcHRpb25zIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jbGllbnQuU2VydmljZUNsaWVudCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dEZhY3RvcnkiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5QYXJhbWV0ZXIiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmVuZ2luZS5BeGlzQ29uZmlndXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIudXRpbC5KYXZhVXRpbHMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS5pby5JT0V4Y2VwdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEuaW8uSW5wdXRTdHJlYW0iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLmlvLlN0cmluZ1dyaXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5Db2xsZWN0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkVudW1lcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkhhc2hNYXAiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkl0ZXJhdG9yIiAlPg0KLTwlLS0NCi1+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLX4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi1+DQotfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi1+DQotfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLX4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLX4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLX4gdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0lPg0KLTx0YWJsZSB3aWR0aD0iMTAwJSI+DQotCTx0cj48dGQ+DQotCQk8dGFibGUgd2lkdGg9Ijk1MHB4Ij4NCi0JCQk8dHI+DQotCQkJCTx0ZCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9ImF4aXMyLXdlYi9pbmRleC5qc3AiPkJhY2sgSG9tZTwvYT4mbmJzcDsmbmJzcDt8Jm5ic3A7Jm5ic3A7IDxhIGhyZWY9IiMiIG9uY2xpY2s9ImphdmFzY3JpcHQ6d2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTtyZXR1cm4gZmFsc2U7Ij5SZWZyZXNoPC9hPjwvdGQ+DQotCQkJPC90cj4NCi0JCTwvdGFibGU+DQotCTwvdGQ+DQotCTx0ZD4mbmJzcDs8L3RkPjwvdHI+DQotPC90YWJsZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmRleC5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWQzNTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+DQotPGh0bWw+DQotICA8aGVhZD4NCi0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaHR0cGJhc2UuanNwIi8+DQotICAgIDx0aXRsZT5BeGlzIDIgLSBIb21lPC90aXRsZT4NCi0gICAgPGxpbmsgaHJlZj0iYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPg0KLSAgPC9oZWFkPg0KLQ0KLSAgPGJvZHk+DQotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2hlYWRlci5pbmMiIC8+DQotICAgIDxici8+DQotDQotICAgIDxoMT5XZWxjb21lITwvaDE+DQotICAgIFdlbGNvbWUgdG8gdGhlIG5ldyBnZW5lcmF0aW9uIG9mIEF4aXMuIElmIHlvdSBjYW4gc2VlIHRoaXMgcGFnZSB5b3UgaGF2ZQ0KLSAgICBzdWNjZXNzZnVsbHkgZGVwbG95ZWQgdGhlIEF4aXMyIFdlYiBBcHBsaWNhdGlvbi4gSG93ZXZlciwgdG8gZW5zdXJlIHRoYXQgQXhpczINCi0gICAgaXMgcHJvcGVybHkgd29ya2luZywgd2UgZW5jb3VyYWdlIHlvdSB0byBjbGljayBvbiB0aGUgdmFsaWRhdGUgbGluay4NCi0gICAgPGJyLz4NCi0gICAgPHVsPg0KLSAgICAgIDxsaT48YSBocmVmPSJzZXJ2aWNlcy9saXN0U2VydmljZXMiPlNlcnZpY2VzPC9hPg0KLSAgICAgICAgPGJyLz4NCi0gICAgICAgIFZpZXcgdGhlIGxpc3Qgb2YgYWxsIHRoZSBhdmFpbGFibGUgc2VydmljZXMgZGVwbG95ZWQgaW4gdGhpcyBzZXJ2ZXIuDQotICAgICAgPC9saT4NCi0gICAgICA8bGk+PGEgaHJlZj0iYXhpczItd2ViL0hhcHB5QXhpcy5qc3AiPlZhbGlkYXRlPC9hPg0KLSAgICAgICAgPGJyLz4NCi0gICAgICAgIENoZWNrIHRoZSBzeXN0ZW0gdG8gc2VlIHdoZXRoZXIgYWxsIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgYXJlIGluIHBsYWNlDQotICAgICAgICBhbmQgdmlldyB0aGUgc3lzdGVtIGluZm9ybWF0aW9uLg0KLSAgICAgIDwvbGk+DQotICAgICAgPCUtLTxsaT48YSBocmVmPSJpbnRlcm9wLmpzcCI+RG8gYW4gaW50ZXJvcCB0ZXN0PC9hPg0KLSAgICAgIDxici8+DQotICAgICAgWW91IGNhbiBydW4gSW50ZXJvcGVyYWJpbGl0eSB0ZXN0cyBoZXJlDQotICAgICAgPC9saT4tLSU+DQotICAgICAgPGxpPjxhIGhyZWY9ImF4aXMyLWFkbWluLyI+QWRtaW5pc3RyYXRpb248L2E+DQotICAgICAgICA8YnIvPg0KLSAgICAgICAgQ29uc29sZSBmb3IgYWRtaW5pc3RlcmluZyB0aGlzIEF4aXMyIGluc3RhbGxhdGlvbi4NCi0gICAgICA8L2xpPg0KLSAgICA8L3VsPg0KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9mb290ZXIuaW5jIi8+DQotICA8L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RGYXVsdHlTZXJ2aWNlLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RGYXVsdHlTZXJ2aWNlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzMWQwMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0RmF1bHR5U2VydmljZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLAotICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24iJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaHRhYmxlIiU+Ci08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIlPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KLTxodG1sPgotICA8aGVhZD4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4KLSAgICA8dGl0bGU+TGlzdCBTaW5nbGUgc2VydmljZTwvdGl0bGU+Ci0gICAgPGxpbmsgaHJlZj0iYXhpczItd2ViL2Nzcy9heGlzLXN0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Ci0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2hlYWRlci5pbmMiPjwvanNwOmluY2x1ZGU+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvbGluay1mb290ZXIuanNwIj48L2pzcDppbmNsdWRlPgotICA8JQotICAgICAgICBTdHJpbmcgcHJpZml4ID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImZyb250ZW5kSG9zdFVybCIpICsgKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfUEFUSCkgKyJzZXJ2aWNlcy8iOwotICAgICU+Ci0gICAgICAgIDwlCi0gICAgICAgICAgICBTdHJpbmcgaXNGYXVsdCA9IChTdHJpbmcpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5JU19GQVVMVFkpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZpY05hbWUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigic2VydmljZU5hbWUiKTsKLSAgICAgICAgICAgIGlmKENvbnN0YW50cy5JU19GQVVMVFkuZXF1YWxzKGlzRmF1bHQpKXsKLSAgICAgICAgICAgICAgICBIYXNodGFibGUgZXJyb3JuZXNzc2VydmljZXMgPShIYXNodGFibGUpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5FUlJPUl9TRVJWSUNFX01BUCk7Ci0gICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPGgzPlRoaXMgV2ViIGF4aXNTZXJ2aWNlIGhhcyBkZXBsb3ltZW50IGZhdWx0czwvaDM+PCUKLSAgICAgICAgICAgICAgICAgICAgICU+PGZvbnQgY29sb3I9InJlZCIgPjwlPShTdHJpbmcpZXJyb3JuZXNzc2VydmljZXMuZ2V0KHNlcnZpY05hbWUpICU+PC9mb250PgotICAgICAgICAgICAgICAgIDwlCi0KLSAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXhpc1NlcnZpY2UpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0lOR0xFX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZihheGlzU2VydmljZSE9bnVsbCl7Ci0gICAgICAgICAgIEl0ZXJhdG9yIG9wSXRyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAgLy9vcGVyYXRpb25zTGlzdCA9IG9wZXJhdGlvbnMudmFsdWVzKCk7Ci0gICAgICAgICAgU3RyaW5nICBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICU+PGgyPjxmb250IGNvbG9yPSJibHVlIj48YSBocmVmPSI8JT1wcmlmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPj93c2RsIj48JT1zZXJ2aWNlTmFtZSU+PC9hPjwvZm9udD48L2gyPgotICAgICAgICAgICA8Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBFUFIgOiA8L2ZvbnQ+PGZvbnQgY29sb3I9ImJsYWNrIj48JT1wcmlmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPjwvZm9udD48YnI+Ci0gICAgICAgICAgIDxoND5TZXJ2aWNlIERlc2NyaXB0aW9uIDogPGZvbnQgY29sb3I9ImJsYWNrIj48JT1heGlzU2VydmljZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSU+PC9mb250PjwvaDQ+Ci0gICAgICAgICAgIDxpPjxmb250IGNvbG9yPSJibHVlIj5TZXJ2aWNlIFN0YXR1cyA6IDwlPWF4aXNTZXJ2aWNlLmlzQWN0aXZlKCk/IkFjdGl2ZSI6IkluQWN0aXZlIiU+PC9mb250PjwvaT48YnI+Ci0gICAgICAgICAgIDwlCi0gICAgICAgICAgICBpZiAob3BJdHIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgJT48aT5BdmFpbGFibGUgb3BlcmF0aW9uczwvaT48JQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAlPjxpPiBUaGVyZSBhcmUgbm8gT3BlcmF0aW9ucyBzcGVjaWZpZWQ8L2k+PCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIG9wSXRyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgICAgICAlPjx1bD48JQotICAgICAgICAgICAgd2hpbGUgKG9wSXRyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gYXhpc09wZXJhdGlvbiA9IChBeGlzT3BlcmF0aW9uKSBvcEl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgJT48bGk+PCU9YXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvbGk+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgJT48L3VsPgotICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICB9IGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIDxoMz48Zm9udCBjb2xvcj0icmVkIiA+Tm8gc2VydmljZXMgZm91bmQgaW4gdGhpcyBsb2NhdGlvbi48L2ZvbnQ+PC9oMz4KLSA8JQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2Zvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+Ci0gICAgICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RHcm91cFNlcnZpY2UuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdEdyb3VwU2VydmljZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDM4YTcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdEdyb3VwU2VydmljZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPg0KLQ0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5Db25zdGFudHMiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNNb2R1bGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNPcGVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLkF4aXNTZXJ2aWNlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkNvbGxlY3Rpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5JdGVyYXRvciIgJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxodG1sPg0KLTxoZWFkPg0KLSAgPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaHR0cGJhc2UuanNwIi8+DQotICA8dGl0bGU+TGlzdCBTZXJ2aWNlczwvdGl0bGU+DQotICA8bGluayBocmVmPSJheGlzMi13ZWIvY3NzL2F4aXMtc3R5bGUuY3NzIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiAvPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiLz4NCi08aDE+QXZhaWxhYmxlIHNlcnZpY2VzPC9oMT4NCi08JQ0KLSAgU3RyaW5nIHByZWZpeCA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmcm9udGVuZEhvc3RVcmwiKSArIChTdHJpbmcpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgpICsiLyI7DQotJT4NCi08JQ0KLSAgICBIYXNoTWFwIHNlcnZpY2VNYXAgPSAoSGFzaE1hcCkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCk7DQotICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsbnVsbCk7DQotICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKSBzZXJ2aWNlTWFwLmdldChyZXF1ZXN0LmdldFBhcmFtZXRlcigic2VydmljZU5hbWUiKSk7DQotICAgIGlmIChheGlzU2VydmljZSAhPSBudWxsKSB7DQotICAgICAgICBJdGVyYXRvciBvcGVyYXRpb25zOw0KLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lOw0KLSAgICAgICAgb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gICAgICAgIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOw0KLSU+PGhyPg0KLQ0KLTxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iPCU9cHJlZml4ICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpJT4/d3NkbCI+PCU9c2VydmljZU5hbWUlPjwvYT4NCi08L2ZvbnQ+PC9oMj4NCi08Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBFUFIgOjwvZm9udD48Zm9udCBjb2xvcj0iYmxhY2siPjwlPXByZWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+PC9mb250Pg0KLTxoND5TZXJ2aWNlIERlc2NyaXB0aW9uIDogPGZvbnQgY29sb3I9ImJsYWNrIj48JT1heGlzU2VydmljZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKSU+PC9mb250PjwvaDQ+DQotPGk+PGZvbnQgY29sb3I9ImJsdWUiPlNlcnZpY2UgU3RhdHVzIDogPCU9YXhpc1NlcnZpY2UuaXNBY3RpdmUoKSA/ICJBY3RpdmUiIDogIkluQWN0aXZlIiU+PC9mb250PjwvaT48YnIvPg0KLTwlDQotICBDb2xsZWN0aW9uIGVuZ2FnZWRNb2R1bGVzID0gYXhpc1NlcnZpY2UuZ2V0RW5nYWdlZE1vZHVsZXMoKTsNCi0gIFN0cmluZyBtb2R1bGVOYW1lOw0KLSAgaWYgKGVuZ2FnZWRNb2R1bGVzLnNpemUoKSA+IDApIHsNCi0lPg0KLTxpPkVuZ2FnZWQgTW9kdWxlcyBmb3IgdGhlIEF4aXMgU2VydmljZTwvaT48dWw+DQotICA8JQ0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9ybSA9IGVuZ2FnZWRNb2R1bGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9ybS5oYXNOZXh0KCk7KSB7DQotICAgICAgQXhpc01vZHVsZSBheGlzT3BlcmF0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9ybS5uZXh0KCk7DQotICAgICAgbW9kdWxlTmFtZSA9IGF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpOw0KLSAgJT48bGk+PCU9bW9kdWxlTmFtZSU+PC9saT4NCi0gIDwlDQotICAgIH0lPg0KLTwvdWw+DQotPCUNCi0gIH0NCi0gIGlmIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSU+PGJyPjxpPkF2YWlsYWJsZSBvcGVyYXRpb25zPC9pPjwlDQotfSBlbHNlIHsNCi0lPjxpPiBUaGVyZSBhcmUgbm8gb3BlcmF0aW9ucyBzcGVjaWZpZWQ8L2k+PCUNCi0gIH0NCi0lPjx1bD48JQ0KLSAgb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsNCi0gIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSAgICBBeGlzT3BlcmF0aW9uIGF4aXNPcGVyYXRpb24gPSAoQXhpc09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7DQotJT48bGk+PCU9YXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPjwvbGk+DQotICA8JQ0KLSAgICBlbmdhZ2VkTW9kdWxlcyA9IGF4aXNPcGVyYXRpb24uZ2V0RW5nYWdlZE1vZHVsZXMoKTsNCi0gICAgaWYgKGVuZ2FnZWRNb2R1bGVzLnNpemUoKSA+IDApIHsNCi0gICU+DQotICA8YnI+PGk+RW5nYWdlZCBNb2R1bGVzIGZvciB0aGUgT3BlcmF0aW9uPC9pPjx1bD4NCi0gIDwlDQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IyID0gZW5nYWdlZE1vZHVsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IyLmhhc05leHQoKTspIHsNCi0gICAgICBBeGlzTW9kdWxlIG1vZHVsZURlY3JpcHRpb24gPSAoQXhpc01vZHVsZSkgaXRlcmF0b3IyLm5leHQoKTsNCi0gICAgICBtb2R1bGVOYW1lID0gbW9kdWxlRGVjcmlwdGlvbi5nZXROYW1lKCk7DQotICAlPjxsaT48JT1tb2R1bGVOYW1lJT48L2xpPjxicj48JQ0KLSAgfQ0KLSU+PC91bD48JQ0KLSAgICB9DQotDQotICB9DQotJT48L3VsPg0KLTwlDQotICB9DQotJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiLz4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RNb2R1bGVzLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RNb2R1bGVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YWRhNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0TW9kdWxlcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0gPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPiA8JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlLA0KLSAgICAgICAgICAgICAgICAgamF2YS51dGlsLkNvbGxlY3Rpb24iJT4NCi0gPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24iJT4NCi0gPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIlPg0KLSA8JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiJT4NCi0gPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiJT4NCi0gPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+DQotICA8aDE+QXZhaWxhYmxlIE1vZHVsZXM8L2gxPg0KLSAgICAgPCUNCi0gICAgICAgICBib29sZWFuIGZvdW5kTW9kdWxlcyA9IGZhbHNlOw0KLQlib29sZWFuIHdyb3RlVUwgPSBmYWxzZTsNCi0gICAgICAgICBIYXNoTWFwIG1vZHVsZU1hcCA9IChIYXNoTWFwKXJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuTU9EVUxFX01BUCk7DQotICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5NT0RVTEVfTUFQLG51bGwpOw0KLSAgICAgICAgIEhhc2h0YWJsZSBlcnJvcm5lc01vZHVsZXMgPShIYXNodGFibGUpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5FUlJPUl9NT0RVTEVfTUFQKTsNCi0gICAgICAgICBpZiAobW9kdWxlTWFwIT1udWxsICYmICFtb2R1bGVNYXAuaXNFbXB0eSgpKXsNCi0gICAgICAgICAgICAgU3RyaW5nIG1vZHVsZW5hbWUgOw0KLSAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlRGVzY3JpcHRpb24gOw0KLSAgICAgICAgICAgICBDb2xsZWN0aW9uIG1vZHVsZU5hbWVzID0gbW9kdWxlTWFwLnZhbHVlcygpOw0KLSAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kdWxlTmFtZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgew0KLSAgICAgICAgICAgICAgICAgZm91bmRNb2R1bGVzID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgIEF4aXNNb2R1bGUgIG1vZHVsZVFOYW1lID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBtb2R1bGVRTmFtZS5nZXROYW1lKCk7DQotICAgICAgICAgICAgICAgICBtb2R1bGVEZXNjcmlwdGlvbiA9IG1vZHVsZVFOYW1lLmdldE1vZHVsZURlc2NyaXB0aW9uKCk7DQotICAgICAgICAgICAgICAgICBpZihtb2R1bGVEZXNjcmlwdGlvbj09bnVsbCl7DQotICAgICAgICAgICAgICAgICAgICAgbW9kdWxlRGVzY3JpcHRpb24gPSAiWyAtLSAgTm8gbW9kdWxlIGRlc2NyaXB0aW9uIGZvdW5kICAtLV0iOw0KLSAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgaWYgKCF3cm90ZVVMKXsNCi0JCQl3cm90ZVVMID0gdHJ1ZTsNCi0lPg0KLQk8dWw+DQotPCUNCi0JCX0NCi0gICAgICU+PGxpPjxiPjwlPW1vZHVsZW5hbWUlPjwvYj4gOiA8JT1tb2R1bGVEZXNjcmlwdGlvbiU+PC9saT4NCi0gICAgICA8JQ0KLSAgICAgICAgICAgICB9DQotCQlpZiAod3JvdGVVTCl7DQotJT4NCi0JPC91bD4NCi08JQ0KLQkJfQ0KLSAgICAgICAgfQ0KLSAgICAgICU+DQotICAgICAgPCVpZihlcnJvcm5lc01vZHVsZXMuc2l6ZSgpPjApew0KLSAgICAgICAgICAlPg0KLSAgICAgIDxoMz48Zm9udCBjb2xvcj0icmVkIj5GYXVsdHkgTW9kdWxlczwvZm9udD48L2gzPg0KLSAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICBFbnVtZXJhdGlvbiBmYXVsdHlNb2R1bGVzID0gZXJyb3JuZXNNb2R1bGVzLmtleXMoKTsNCi0gICAgICAgICAgICAgd2hpbGUgKGZhdWx0eU1vZHVsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0gICAgICAgICAgICAgICAgIGZvdW5kTW9kdWxlcyA9IHRydWU7DQotICAgICAgICAgICAgICAgICBTdHJpbmcgZmF1bHR5TW9kdWxlTmFtZSA9IChTdHJpbmcpIGZhdWx0eU1vZHVsZXMubmV4dEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgJT48YSBocmVmPSJlcnJvck1vZHVsZS5qc3A/bW9kdWxlTmFtZT08JT1mYXVsdHlNb2R1bGVOYW1lJT4iPg0KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF1bHR5TW9kdWxlTmFtZSU+PC9hPg0KLSAgICAgICAgICAgICAgICAgICAgPCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgICAgICAgICAgaWYoISBmb3VuZE1vZHVsZXMpIHsNCi0gICAgICAgICAgICAgICAgICU+DQotICAgICAgICAgICAgICAgICA8aDI+PGZvbnQgY29sb3I9ImJsdWUiPlRoZXJlIGFyZSBubyBtb2R1bGVzIGRlcGxveWVkIGluIHRoZSBzeXN0ZW0uPC9mb250PjwvaDI+DQotICAgICAgICAgICAgICAgICA8JQ0KLSAgICAgICAgICAgICB9DQotICAgICAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0U2VydmljZS5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0U2VydmljZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzY2YyN2YuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNlcnZpY2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzTW9kdWxlIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkNvbGxlY3Rpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiLz4NCi0NCi08aDE+QXZhaWxhYmxlIFNlcnZpY2VzPC9oMT4NCi08JSBTdHJpbmcgcHJlZml4ID0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImZyb250ZW5kSG9zdFVybCIpICsgKFN0cmluZylyZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfUEFUSCkgKyAiLyI7DQotJT4NCi08JQ0KLSAgICBIYXNoTWFwIHNlcnZpY2VNYXAgPSAoSGFzaE1hcCkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX01BUCk7DQotICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVAsIG51bGwpOw0KLSAgICBIYXNodGFibGUgZXJyb3JuZXNzc2VydmljZSA9IChIYXNodGFibGUpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuRVJST1JfU0VSVklDRV9NQVApOw0KLSAgICBib29sZWFuIHN0YXR1cyA9IGZhbHNlOw0KLSAgICBpZiAoc2VydmljZU1hcCAhPSBudWxsICYmICFzZXJ2aWNlTWFwLmlzRW1wdHkoKSkgew0KLSAgICAgICAgSXRlcmF0b3Igb3BlcmF0aW9uczsNCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZTsNCi0gICAgICAgIENvbGxlY3Rpb24gc2VydmljZWNvbCA9IHNlcnZpY2VNYXAudmFsdWVzKCk7DQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZWNvbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgQXhpc1NlcnZpY2UgYXhpc1NlcnZpY2UgPSAoQXhpc1NlcnZpY2UpIGl0ZXJhdG9yLm5leHQoKTsNCi0gICAgICAgICAgICBvcGVyYXRpb25zID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOw0KLSU+PGgyPjxmb250IGNvbG9yPSJibHVlIj48YSBocmVmPSI8JT1wcmVmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPj93c2RsIj48JT1zZXJ2aWNlTmFtZSU+PC9hPjwvZm9udD48L2gyPg0KLTxmb250IGNvbG9yPSJibHVlIj5TZXJ2aWNlIEVQUiA6IDwvZm9udD48Zm9udCBjb2xvcj0iYmxhY2siPjwlPXByZWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+PC9mb250Pjxicj4NCi08JQ0KLSAgICAvLyBkbyB3ZSBuZWVkIHRvIGVuYWJsZSBSRVNUIGluIHRoZSBtYWluIHNlcnZsZXQgc28gdGhhdCBpdCBoYW5kbGVzIGJvdGggUkVTVCBhbmQgU09BUCBtZXNzYWdlcw0KLSAgICBib29sZWFuIGRpc2FibGVSRVNUID0gZmFsc2U7DQotICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgUGFyYW1ldGVyIHBhcmFtZXRlciA7DQotDQotICAgIC8vIGRvIHdlIG5lZWQgdG8gY29tcGxldGVseSBkaXNhYmxlIFJFU1Qgc3VwcG9ydA0KLSAgICBwYXJhbWV0ZXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsNCi0gICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7DQotICAgICAgICBkaXNhYmxlUkVTVCA9ICFKYXZhVXRpbHMuaXNGYWxzZUV4cGxpY2l0bHkocGFyYW1ldGVyLmdldFZhbHVlKCkpOw0KLSAgICB9DQotICAgIGlmICghZGlzYWJsZVJFU1QpIHsNCi0lPg0KLQ0KLTwlDQotJT4NCi08JQ0KLSAgICB9DQotDQotDQotICAgIFN0cmluZyBzZXJ2aWNlRGVzY3JpcHRpb24gPSBheGlzU2VydmljZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbiA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlRGVzY3JpcHRpb24pKSB7DQotICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24gPSAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlIGZvciB0aGlzIHNlcnZpY2UiOw0KLSAgICB9DQotJT4NCi0gICAgICAgIDxoND5TZXJ2aWNlIERlc2NyaXB0aW9uIDogPGZvbnQgY29sb3I9ImJsYWNrIj48JT1zZXJ2aWNlRGVzY3JpcHRpb24lPjwvZm9udD48L2g0Pg0KLTxpPjxmb250IGNvbG9yPSJibHVlIj5TZXJ2aWNlIFN0YXR1cyA6IDwlPWF4aXNTZXJ2aWNlLmlzQWN0aXZlKCkgPyAiQWN0aXZlIiA6ICJJbkFjdGl2ZSIlPjwvZm9udD48L2k+PGJyPg0KLTwlDQotICAgIENvbGxlY3Rpb24gZW5nYWdlZE1vZHVsZXMgPSBheGlzU2VydmljZS5nZXRFbmdhZ2VkTW9kdWxlcygpOw0KLSAgICBTdHJpbmcgbW9kdWxlTmFtZTsNCi0gICAgYm9vbGVhbiBtb2R1bGVzX3ByZXNlbnQgPSBmYWxzZTsNCi0gICAgaWYgKGVuZ2FnZWRNb2R1bGVzLnNpemUoKSA+IDApIHsNCi0lPg0KLTxpPkVuZ2FnZWQgbW9kdWxlcyBmb3IgdGhlIHNlcnZpY2U8L2k+DQotPCUNCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvcm0gPSBlbmdhZ2VkTW9kdWxlcy5pdGVyYXRvcigpOyBpdGVyYXRvcm0uaGFzTmV4dCgpOykgew0KLSAgICAgICAgQXhpc01vZHVsZSBheGlzT3BlcmF0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9ybS5uZXh0KCk7DQotICAgICAgICBtb2R1bGVOYW1lID0gYXhpc09wZXJhdGlvbi5nZXROYW1lKCk7DQotICAgICAgICBpZiAoIW1vZHVsZXNfcHJlc2VudCkgew0KLSAgICAgICAgICAgIG1vZHVsZXNfcHJlc2VudCA9IHRydWU7DQotJT4NCi08dWw+DQotICAgIDwlIH0NCi0gICAgJT48bGk+PCU9bW9kdWxlTmFtZSU+IDo6IDxhIGhyZWY9ImF4aXMyLWFkbWluL2Rpc2VuZ2FnZU1vZHVsZT90eXBlPXNlcnZpY2Umc2VydmljZU5hbWU9PCU9c2VydmljZU5hbWUlPiZtb2R1bGU9PCU9bW9kdWxlTmFtZSU+Ij5EaXNlbmdhZ2U8L2E+PC9saT4NCi0gICAgPGJyPg0KLSAgICA8JQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKG1vZHVsZXNfcHJlc2VudCkgeyU+DQotPC91bD4NCi08JQ0KLSAgICAgICAgfQ0KLSAgICB9DQotICAgIGlmIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSU+PGJyPjxpPkF2YWlsYWJsZSBvcGVyYXRpb25zPC9pPjwlDQotfSBlbHNlIHsNCi0lPjxpPiBUaGVyZSBhcmUgbm8gT3BlcmF0aW9ucyBzcGVjaWZpZWQ8L2k+PCUNCi0gICAgfQ0KLSU+PHVsPjwlDQotICAgIG9wZXJhdGlvbnMgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkgew0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOw0KLSU+PGxpPjwlPWF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpJT48L2xpPg0KLSAgICA8JS0tICAgICAgICAgICAgICAgICA8YnI+T3BlcmF0aW9uIEVQUiA6IDwlPXByaWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIvIisgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPi0tJT4NCi0gICAgPCUNCi0gICAgICAgIGVuZ2FnZWRNb2R1bGVzID0gYXhpc09wZXJhdGlvbi5nZXRFbmdhZ2VkTW9kdWxlcygpOw0KLSAgICAgICAgaWYgKGVuZ2FnZWRNb2R1bGVzLnNpemUoKSA+IDApIHsNCi0gICAgJT4NCi0gICAgPGJyPjxpPkVuZ2FnZWQgTW9kdWxlcyBmb3IgdGhlIE9wZXJhdGlvbjwvaT48dWw+DQotICAgIDwlDQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IGVuZ2FnZWRNb2R1bGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMi5oYXNOZXh0KCk7KSB7DQotICAgICAgICAgICAgQXhpc01vZHVsZSBtb2R1bGVEZWNyaXB0aW9uID0gKEF4aXNNb2R1bGUpIGl0ZXJhdG9yMi5uZXh0KCk7DQotICAgICAgICAgICAgbW9kdWxlTmFtZSA9IG1vZHVsZURlY3JpcHRpb24uZ2V0TmFtZSgpOw0KLSAgICAlPjxsaT48JT1tb2R1bGVOYW1lJT4gOjogPGEgaHJlZj0iYXhpczItYWRtaW4vZGlzZW5nYWdlTW9kdWxlP3R5cGU9b3BlcmF0aW9uJnNlcnZpY2VOYW1lPTwlPXNlcnZpY2VOYW1lJT4mb3BlcmF0aW9uPTwlPWF4aXNPcGVyYXRpb24uZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpJT4mbW9kdWxlPTwlPW1vZHVsZU5hbWUlPiI+RGlzZW5nYWdlPC9hPjwvbGk+PGJyPjwlDQotICAgIH0NCi0lPjwvdWw+PCUNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLSU+PC91bD4NCi08JQ0KLSAgICAgICAgICAgIHN0YXR1cyA9IHRydWU7DQotICAgICAgICB9DQotICAgIH0NCi0gICAgaWYgKGVycm9ybmVzc3NlcnZpY2UgIT0gbnVsbCkgew0KLSAgICAgICAgaWYgKGVycm9ybmVzc3NlcnZpY2Uuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLnNldEF0dHJpYnV0ZShDb25zdGFudHMuSVNfRkFVTFRZLCBDb25zdGFudHMuSVNfRkFVTFRZKTsNCi0lPg0KLTxoMz48Zm9udCBjb2xvcj0icmVkIj5GYXVsdHkgU2VydmljZXM8L2ZvbnQ+PC9oMz4NCi08JQ0KLSAgICBFbnVtZXJhdGlvbiBmYXVsdHlzZXJ2aWNlcyA9IGVycm9ybmVzc3NlcnZpY2Uua2V5cygpOw0KLSAgICB3aGlsZSAoZmF1bHR5c2VydmljZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0gICAgICAgIFN0cmluZyBmYXVsdHlzZXJ2aWNlTmFtZSA9IChTdHJpbmcpIGZhdWx0eXNlcnZpY2VzLm5leHRFbGVtZW50KCk7DQotJT48aDM+PGZvbnQgY29sb3I9ImJsdWUiPjxhIGhyZWY9InNlcnZpY2VzL0xpc3RGYXVsdHlTZXJ2aWNlcz9zZXJ2aWNlTmFtZT08JT1mYXVsdHlzZXJ2aWNlTmFtZSU+Ij4NCi0gICAgPCU9ZmF1bHR5c2VydmljZU5hbWUlPjwvYT48L2ZvbnQ+PC9oMz4NCi08JQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHN0YXR1cyA9IHRydWU7DQotICAgIH0NCi0gICAgaWYgKCFzdGF0dXMpIHsNCi0lPiBObyBzZXJ2aWNlcyBsaXN0ZWQhIFRyeSBoaXR0aW5nIHJlZnJlc2guIDwlDQotICAgIH0NCi0lPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIgLz4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0U2VydmljZXMuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNlcnZpY2VzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwZGYwMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi9saXN0U2VydmljZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzU2VydmljZSIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uUGFyYW1ldGVyIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5lbmdpbmUuQXhpc0NvbmZpZ3VyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLnV0aWwuSmF2YVV0aWxzIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkNvbGxlY3Rpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24iICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSGFzaE1hcCIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08aHRtbD4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9odHRwYmFzZS5qc3AiLz4NCi08aGVhZD48dGl0bGU+TGlzdCBTZXJ2aWNlczwvdGl0bGU+DQotICAgIDxsaW5rIGhyZWY9ImF4aXMyLXdlYi9jc3MvYXhpcy1zdHlsZS5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiLz4NCi08L2hlYWQ+DQotDQotPGJvZHk+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvaGVhZGVyLmluYyIgLz4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9saW5rLWZvb3Rlci5qc3AiIC8+DQotPGgxPkF2YWlsYWJsZSBzZXJ2aWNlczwvaDE+DQotPCUgU3RyaW5nIHByZWZpeCA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmcm9udGVuZEhvc3RVcmwiKSArIChTdHJpbmcpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgpICsgIi8iOw0KLSU+DQotPCUNCi0gICAgSGFzaE1hcCBzZXJ2aWNlTWFwID0gKEhhc2hNYXApIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0VSVklDRV9NQVApOw0KLSAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlNFUlZJQ0VfTUFQLCBudWxsKTsNCi0gICAgSGFzaHRhYmxlIGVycm9ybmVzc3NlcnZpY2UgPSAoSGFzaHRhYmxlKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkVSUk9SX1NFUlZJQ0VfTUFQKTsNCi0gICAgYm9vbGVhbiBzdGF0dXMgPSBmYWxzZTsNCi0gICAgaWYgKHNlcnZpY2VNYXAgIT0gbnVsbCAmJiAhc2VydmljZU1hcC5pc0VtcHR5KCkpIHsNCi0gICAgICAgIEl0ZXJhdG9yIG9wSXRyOw0KLSAgICAgICAgLy9IYXNoTWFwIG9wZXJhdGlvbnM7DQotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWU7DQotICAgICAgICBDb2xsZWN0aW9uIHNlcnZpY2Vjb2wgPSBzZXJ2aWNlTWFwLnZhbHVlcygpOw0KLSAgICAgICAgLy8gQ29sbGVjdGlvbiBvcGVyYXRpb25zTGlzdDsNCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2aWNlY29sLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsNCi0gICAgICAgICAgICBBeGlzU2VydmljZSBheGlzU2VydmljZSA9IChBeGlzU2VydmljZSkgaXRlcmF0b3IubmV4dCgpOw0KLSAgICAgICAgICAgIG9wSXRyID0gYXhpc1NlcnZpY2UuZ2V0T3BlcmF0aW9ucygpOw0KLSAgICAgICAgICAgIC8vb3BlcmF0aW9uc0xpc3QgPSBvcGVyYXRpb25zLnZhbHVlcygpOw0KLSAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gYXhpc1NlcnZpY2UuZ2V0TmFtZSgpOw0KLSU+PGgyPjxmb250IGNvbG9yPSJibHVlIj48YSBocmVmPSI8JT1wcmVmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPj93c2RsIj48JT1zZXJ2aWNlTmFtZSU+PC9hPjwvZm9udD48L2gyPg0KLTxmb250IGNvbG9yPSJibHVlIj5TZXJ2aWNlIEVQUiA6IDwvZm9udD48Zm9udCBjb2xvcj0iYmxhY2siPjwlPXByZWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKSU+PC9mb250Pjxicj4NCi08JQ0KLSAgICBib29sZWFuIGRpc2FibGVSRVNUID0gZmFsc2U7DQotICAgIEF4aXNDb25maWd1cmF0aW9uIGF4aXNDb25maWd1cmF0aW9uID0gYXhpc1NlcnZpY2UuZ2V0QXhpc0NvbmZpZ3VyYXRpb24oKTsNCi0NCi0gICAgUGFyYW1ldGVyIHBhcmFtZXRlciA7DQotDQotICAgIC8vIGRvIHdlIG5lZWQgdG8gY29tcGxldGVseSBkaXNhYmxlIFJFU1Qgc3VwcG9ydA0KLSAgICBwYXJhbWV0ZXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsNCi0gICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7DQotICAgICAgICBkaXNhYmxlUkVTVCA9ICFKYXZhVXRpbHMuaXNGYWxzZUV4cGxpY2l0bHkocGFyYW1ldGVyLmdldFZhbHVlKCkpOw0KLSAgICB9DQotDQotICAgIGlmICghZGlzYWJsZVJFU1QgKSB7DQotDQotJT4NCi08JQ0KLSAgICB9DQotDQotDQotICAgIFN0cmluZyBzZXJ2aWNlRGVzY3JpcHRpb24gPSBheGlzU2VydmljZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbiA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlRGVzY3JpcHRpb24pKSB7DQotICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24gPSAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlIGZvciB0aGlzIHNlcnZpY2UiOw0KLSAgICB9DQotJT4NCi08aDQ+U2VydmljZSBEZXNjcmlwdGlvbiA6IDxmb250IGNvbG9yPSJibGFjayI+PCU9c2VydmljZURlc2NyaXB0aW9uJT48L2ZvbnQ+PC9oND4NCi08aT48Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBTdGF0dXMgOiA8JT1heGlzU2VydmljZS5pc0FjdGl2ZSgpID8gIkFjdGl2ZSIgOiAiSW5BY3RpdmUiJT48L2ZvbnQ+PC9pPjxicj4NCi08JQ0KLSAgICBpZiAob3BJdHIuaGFzTmV4dCgpKSB7DQotJT48aT5BdmFpbGFibGUgT3BlcmF0aW9uczwvaT48JQ0KLX0gZWxzZSB7DQotJT48aT4gVGhlcmUgYXJlIG5vIE9wZXJhdGlvbnMgc3BlY2lmaWVkPC9pPjwlDQotICAgIH0NCi0gICAgb3BJdHIgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotJT48dWw+PCUNCi0gICAgd2hpbGUgKG9wSXRyLmhhc05leHQoKSkgew0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wSXRyLm5leHQoKTsNCi0lPjxsaT48JT1heGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+PC9saT4NCi0gICAgPCUtLSAgICAgICAgICAgICAgICA8YnI+T3BlcmF0aW9uIEVQUiA6IDwlPXByaWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIvIisgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPi0tJT4NCi0gICAgPCUNCi0gICAgICAgIH0NCi0gICAgJT48L3VsPg0KLTwlDQotICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICBpZiAoZXJyb3JuZXNzc2VydmljZSAhPSBudWxsKSB7DQotICAgICAgICBpZiAoZXJyb3JuZXNzc2VydmljZS5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgcmVxdWVzdC5nZXRTZXNzaW9uKCkuc2V0QXR0cmlidXRlKENvbnN0YW50cy5JU19GQVVMVFksIENvbnN0YW50cy5JU19GQVVMVFkpOw0KLSU+DQotPGhyPg0KLQ0KLTxoMz48Zm9udCBjb2xvcj0iYmx1ZSI+RmF1bHR5IFNlcnZpY2VzPC9mb250PjwvaDM+DQotPCUNCi0gICAgRW51bWVyYXRpb24gZmF1bHR5c2VydmljZXMgPSBlcnJvcm5lc3NzZXJ2aWNlLmtleXMoKTsNCi0gICAgd2hpbGUgKGZhdWx0eXNlcnZpY2VzLmhhc01vcmVFbGVtZW50cygpKSB7DQotICAgICAgICBTdHJpbmcgZmF1bHR5c2VydmljZU5hbWUgPSAoU3RyaW5nKSBmYXVsdHlzZXJ2aWNlcy5uZXh0RWxlbWVudCgpOw0KLSU+PGgzPjxmb250IGNvbG9yPSJibHVlIj48YSBocmVmPSJzZXJ2aWNlcy9MaXN0RmF1bHR5U2VydmljZXM/c2VydmljZU5hbWU9PCU9ZmF1bHR5c2VydmljZU5hbWUlPiI+DQotICAgIDwlPWZhdWx0eXNlcnZpY2VOYW1lJT48L2E+PC9mb250PjwvaDM+DQotPCUNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICBzdGF0dXMgPSB0cnVlOw0KLSAgICB9DQotICAgIGlmICghc3RhdHVzKSB7DQotJT4gTm8gc2VydmljZXMgbGlzdGVkISBUcnkgaGl0dGluZyByZWZyZXNoLiA8JQ0KLSAgICB9DQotJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9mb290ZXIuaW5jIiAvPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNpbmdsZVNlcnZpY2UuanNwIGIvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvbGlzdFNpbmdsZVNlcnZpY2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDMxMTRkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL2xpc3RTaW5nbGVTZXJ2aWNlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi08JS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLSU+DQotDQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLkNvbnN0YW50cywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc09wZXJhdGlvbiIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2UiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmRlc2NyaXB0aW9uLlBhcmFtZXRlciIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuZW5naW5lLkF4aXNDb25maWd1cmF0aW9uIiAlPg0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi51dGlsLkphdmFVdGlscyIgJT4NCi08JUAgcGFnZSBpbXBvcnQ9ImphdmEudXRpbC5IYXNodGFibGUiICU+DQotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+DQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4NCi08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiLz4NCi08aDE+TGlzdCBTaW5nbGUgU2VydmljZTwvaDE+DQotPCUNCi0gICAgU3RyaW5nIHByZWZpeCA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJmcm9udGVuZEhvc3RVcmwiKSArIChTdHJpbmcpcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5TRVJWSUNFX1BBVEgpICsgIi8iOw0KLSU+DQotPCUNCi0gICAgU3RyaW5nIGlzRmF1bHQgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLklTX0ZBVUxUWSk7DQotICAgIFN0cmluZyBzZXJ2aWNOYW1lID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInNlcnZpY2VOYW1lIik7DQotICAgIGlmIChDb25zdGFudHMuSVNfRkFVTFRZLmVxdWFscyhpc0ZhdWx0KSkgew0KLSAgICAgICAgSGFzaHRhYmxlIGVycm9ybmVzc3NlcnZpY2VzID0gKEhhc2h0YWJsZSkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5FUlJPUl9TRVJWSUNFX01BUCk7DQotJT4NCi08aDM+VGhpcyBBeGlzIHNlcnZpY2UgaGFzIGRlcGxveW1lbnQgZmF1bHRzLjwvaDM+PCUNCi0lPjxmb250IGNvbG9yPSJyZWQiPjwlPShTdHJpbmcpIGVycm9ybmVzc3NlcnZpY2VzLmdldChzZXJ2aWNOYW1lKSAlPjwvZm9udD4NCi08JQ0KLQ0KLX0gZWxzZSB7DQotDQotICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlID0NCi0gICAgICAgICAgICAoQXhpc1NlcnZpY2UpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuU0lOR0xFX1NFUlZJQ0UpOw0KLSAgICBpZiAoYXhpc1NlcnZpY2UgIT0gbnVsbCkgew0KLSAgICAgICAgSXRlcmF0b3Igb3BJdHIgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotICAgICAgICAvL29wZXJhdGlvbnNMaXN0ID0gb3BlcmF0aW9ucy52YWx1ZXMoKTsNCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGF4aXNTZXJ2aWNlLmdldE5hbWUoKTsNCi0lPjxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+PGEgaHJlZj0iPCU9cHJlZml4ICsgYXhpc1NlcnZpY2UuZ2V0TmFtZSgpJT4/d3NkbCI+PCU9c2VydmljZU5hbWUlPjwvYT48L2ZvbnQ+PC9oMj4NCi08Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBFUFIgOiA8L2ZvbnQ+PGZvbnQgY29sb3I9ImJsYWNrIj48JT1wcmVmaXggKyBheGlzU2VydmljZS5nZXROYW1lKCklPjwvZm9udD48YnI+DQotPCUNCi0gICAgYm9vbGVhbiBkaXNhYmxlUkVTVCA9IGZhbHNlOw0KLSAgICBBeGlzQ29uZmlndXJhdGlvbiBheGlzQ29uZmlndXJhdGlvbiA9IGF4aXNTZXJ2aWNlLmdldEF4aXNDb25maWd1cmF0aW9uKCk7DQotDQotICAgIFBhcmFtZXRlciBwYXJhbWV0ZXI7DQotDQotICAgIC8vIGRvIHdlIG5lZWQgdG8gY29tcGxldGVseSBkaXNhYmxlIFJFU1Qgc3VwcG9ydA0KLSAgICBwYXJhbWV0ZXIgPSBheGlzQ29uZmlndXJhdGlvbi5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLkNvbmZpZ3VyYXRpb24uRElTQUJMRV9SRVNUKTsNCi0gICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7DQotICAgICAgICBkaXNhYmxlUkVTVCA9ICFKYXZhVXRpbHMuaXNGYWxzZUV4cGxpY2l0bHkocGFyYW1ldGVyLmdldFZhbHVlKCkpOw0KLSAgICB9DQotICAgIGlmICghZGlzYWJsZVJFU1QgKSB7DQotJT4NCi08JQ0KLSAgICB9DQotDQotDQotICAgIFN0cmluZyBzZXJ2aWNlRGVzY3JpcHRpb24gPSBheGlzU2VydmljZS5nZXRTZXJ2aWNlRGVzY3JpcHRpb24oKTsNCi0gICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbiA9PSBudWxsIHx8ICIiLmVxdWFscyhzZXJ2aWNlRGVzY3JpcHRpb24pKSB7DQotICAgICAgICBzZXJ2aWNlRGVzY3JpcHRpb24gPSAiTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlIGZvciB0aGlzIHNlcnZpY2UiOw0KLSAgICB9DQotJT4NCi08aDQ+U2VydmljZSBEZXNjcmlwdGlvbiA6IDxmb250IGNvbG9yPSJibGFjayI+PCU9c2VydmljZURlc2NyaXB0aW9uJT48L2ZvbnQ+PC9oND4NCi0NCi08aT48Zm9udCBjb2xvcj0iYmx1ZSI+U2VydmljZSBTdGF0dXMgOiA8JT1heGlzU2VydmljZS5pc0FjdGl2ZSgpID8gIkFjdGl2ZSIgOiAiSW5BY3RpdmUiJT48L2ZvbnQ+PC9pPjxicj4NCi08JQ0KLSAgICBpZiAob3BJdHIuaGFzTmV4dCgpKSB7DQotJT48aT5BdmFpbGFibGUgb3BlcmF0aW9uczwvaT48JQ0KLX0gZWxzZSB7DQotJT48aT4gVGhlcmUgYXJlIG5vIE9wZXJhdGlvbnMgc3BlY2lmaWVkPC9pPjwlDQotICAgIH0NCi0gICAgb3BJdHIgPSBheGlzU2VydmljZS5nZXRPcGVyYXRpb25zKCk7DQotJT48dWw+PCUNCi0gICAgd2hpbGUgKG9wSXRyLmhhc05leHQoKSkgew0KLSAgICAgICAgQXhpc09wZXJhdGlvbiBheGlzT3BlcmF0aW9uID0gKEF4aXNPcGVyYXRpb24pIG9wSXRyLm5leHQoKTsNCi0lPjxsaT48JT1heGlzT3BlcmF0aW9uLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+PC9saT4NCi0gICAgPCUtLSAgICAgICAgICAgICAgICA8YnI+T3BlcmF0aW9uIEVQUiA6IDwlPXByaWZpeCArIGF4aXNTZXJ2aWNlLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICIvIisgYXhpc09wZXJhdGlvbi5nZXROYW1lKCkuZ2V0TG9jYWxQYXJ0KCklPi0tJT4NCi0gICAgPCUNCi0gICAgICAgIH0NCi0gICAgJT48L3VsPg0KLTwlDQotfSBlbHNlIHsNCi0lPg0KLTxoMz48Zm9udCBjb2xvcj0icmVkIj5ObyBzZXJ2aWNlcyBmb3VuZCBpbiB0aGlzIGxvY2F0aW9uPC9mb250PjwvaDM+DQotPCUNCi0gICAgICAgIH0NCi0NCi0gICAgfQ0KLSU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIi8+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdXBsb2FkLmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3VwbG9hZC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjIyMjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdXBsb2FkLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTwlLS0NCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAgfg0KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gIH4NCi0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgfiB1bmRlciB0aGUgTGljZW5zZS4NCi0gIC0tJT4NCi0NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLQ0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCIvPg0KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi08IS0tDQotCWZ1bmN0aW9uIGNoZWNrRmlsZVVwbG9hZCgpew0KLQkJaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXJ2aWNlVXBsb2FkJykudmFsdWUgPT0gJycpIHsNCi0JCQlhbGVydCgnUGxlYXNlIHNlbGVjdCBhIGZpbGUgYmVmb3JlIGNsaWNraW5nIHRoZSB1cGxvYWQgYnV0dG9uLicpOw0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0gZWxzZSB7DQotCQkJZG9jdW1lbnQuQXhpczJ1cGxvYWQuc3VibWl0KCk7DQotCQl9DQotCX0NCi0vLy0tPg0KLTwvc2NyaXB0Pg0KLTxoMT5VcGxvYWQgYW4gQXhpcyBTZXJ2aWNlIEFyY2hpdmUgRmlsZTwvaDE+DQotDQotPHA+WW91IGNhbiB1cGxvYWQgYSBwYWNrYWdlZCBBeGlzMiBzZXJ2aWNlIGZyb20gdGhpcyBwYWdlIGluIHR3byBzbWFsbCBzdGVwcy48L3A+DQotPHVsPg0KLSAgPGxpPkJyb3dzZSB0byB0aGUgbG9jYXRpb24gYW5kIHNlbGVjdCB0aGUgYXhpcyBzZXJ2aWNlIGFyY2hpdmUgZmlsZSB5b3Ugd2lzaCB0byB1cGxvYWQ8L2xpPg0KLSAgPGxpPkNsaWNrICJVcGxvYWQiIGJ1dHRvbjwvbGk+DQotPC91bD4NCi08cD5TaW1wbGUgYXMgdGhhdCE8L3A+DQotDQotPCUgaWYgKCJzdWNjZXNzIi5lcXVhbHMocmVxdWVzdC5nZXRBdHRyaWJ1dGUoInN0YXR1cyIpKSkgeyAlPg0KLTxmb250IGNvbG9yPSJncmVlbiI+RmlsZSA8JT0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImZpbGVuYW1lIikgJT4gc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIDwvZm9udD48YnIvPjxici8+DQotPCUNCi19IGVsc2UgaWYgKCJmYWlsdXJlIi5lcXVhbHMocmVxdWVzdC5nZXRBdHRyaWJ1dGUoInN0YXR1cyIpKSkgew0KLSU+DQotPGZvbnQgY29sb3I9InJlZCI+VGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCA8YnIvPiA8JT0gcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImNhdXNlIikgJT48L2ZvbnQ+PGJyLz4NCi08JSB9ICU+DQotDQotPGZvcm0gbWV0aG9kPSJwb3N0IiBuYW1lPSJBeGlzMnVwbG9hZCIgaWQ9IkF4aXMydXBsb2FkIiBhY3Rpb249ImF4aXMyLWFkbWluL3VwbG9hZCINCi0gICAgICBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4NCi0gIDx0YWJsZT4NCi0gICAgPHRyPg0KLSAgICAgIDx0ZD5TZXJ2aWNlIGFyY2hpdmUgOiA8L3RkPg0KLSAgICAgIDx0ZD48aW5wdXQgaWQ9InNlcnZpY2VVcGxvYWQiIHR5cGU9ImZpbGUiIG5hbWU9ImZpbGVuYW1lIiBzaXplPSI1MCIvPjwvdGQ+DQotICAgIDwvdHI+DQotICAgIDx0cj4NCi0gICAgICA8dGQ+Jm5ic3A7PC90ZD4NCi0gICAgICA8dGQ+PGlucHV0IG5hbWU9InVwbG9hZCIgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJqYXZhc2NyaXB0OmNoZWNrRmlsZVVwbG9hZCgpOyIgdmFsdWU9IiBVcGxvYWQgIi8+PC90ZD4NCi0gICAgPC90cj4NCi0gIDwvdGFibGU+DQotPC9mb3JtPg0KLTxibG9ja3F1b3RlPg0KLTxwPkhvdCBkZXBsb3ltZW50IG9mIG5ldyBzZXJ2aWNlIGFyY2hpdmVzIGlzIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJob3REZXBsb3ltZW50IikgJT48L3A+DQotPHA+SG90IHVwZGF0ZSBvZiBleGlzdGluZyBzZXJ2aWNlIGFyY2hpdmVzIGlzIDwlPXJlcXVlc3QuZ2V0QXR0cmlidXRlKCJob3RVcGRhdGUiKSAlPjwvcD4NCi08L2Jsb2NrcXVvdGU+DQotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5mb290ZXIuaW5jIi8+DQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdmlld1NlcnZpY2VDb250ZXh0LmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3ZpZXdTZXJ2aWNlQ29udGV4dC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWI4ZmEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdmlld1NlcnZpY2VDb250ZXh0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLSU+Ci0KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmFwYWNoZS5heGlzMi5jb250ZXh0LlNlcnZpY2VDb250ZXh0IiAlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiICU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9ImluY2x1ZGUvYWRtaW5oZWFkZXIuanNwIi8+Ci08aDE+UnVubmluZyBDb250ZXh0IEhpZXJhcmNoeTwvaDE+Ci08JQotICAgIFNlcnZpY2VDb250ZXh0IHNlcnZpY2VDb250ZXh0ID0gKFNlcnZpY2VDb250ZXh0KSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoIlNlcnZpY2VDb250ZXh0Iik7Ci0gICAgU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXF1ZXN0LmdldFNlc3Npb24oKS5nZXRBdHRyaWJ1dGUoIlRZUEUiKTsKLSAgICBpZiAoc2VydmljZUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIlZJRVciLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHByb3BlcnR5TmFtZXMgPSBzZXJ2aWNlQ29udGV4dC5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0lPgotPGg0PlBlcnNpc3RhbmNlIFByb3BlcnRpZXM8L2g0Pjx1bD4KLSAgICA8JQotICAgICAgICB3aGlsZSAocHJvcGVydHlOYW1lcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBwcm9wZXJ0eU5hbWVzLm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0eSA9IHNlcnZpY2VDb250ZXh0LmdldFByb3BlcnR5KGtleSk7Ci0gICAgJT4KLSAgICA8bGk+PCU9a2V5JT4gOiA8JT1wcm9wZXJ0eS50b1N0cmluZygpJT48L2xpPgotICAgIDwlCi0gICAgICAgIH0KLSAgICAlPjwvdWw+Ci08JQotICAgIH0KLX0gZWxzZSB7Ci0lPiA8aDQ+Tm8gU2VydmljZSBDb250ZXh0IEZvdW5kPC9oND48JQotICAgICAgICB9Ci0gICAgfQotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyIvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3ZpZXdTZXJ2aWNlR3JvdXBDb250ZXh0LmpzcCBiLzFfNS9tb2R1bGVzL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvYXhpczItd2ViL3ZpZXdTZXJ2aWNlR3JvdXBDb250ZXh0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjYTg2Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi92aWV3U2VydmljZUdyb3VwQ29udGV4dC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08JS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0lPgotCi08JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuY29udGV4dC5Db25maWd1cmF0aW9uQ29udGV4dCIlPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuYXBhY2hlLmF4aXMyLmNvbnRleHQuU2VydmljZUdyb3VwQ29udGV4dCIlPgotPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLnV0aWwuSXRlcmF0b3IiJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmhlYWRlci5qc3AiPjwvanNwOmluY2x1ZGU+Ci08aDE+UnVuaW5nIENvbnRleHQgaGllcmFjaHk8L2gxPgotPCUKLSAgICBTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZSgiVFlQRSIpOwotICAgIENvbmZpZ3VyYXRpb25Db250ZXh0IGNvbmZpZ0N0eCA9IChDb25maWd1cmF0aW9uQ29udGV4dCkgcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKCJDb25maWd1cmF0aW9uQ29udGV4dCIpOwotICAgIFNlcnZpY2VHcm91cENvbnRleHQgc2dDb250ZXh0ID0gKFNlcnZpY2VHcm91cENvbnRleHQpIHJlcXVlc3QuZ2V0U2Vzc2lvbigpLmdldEF0dHJpYnV0ZSgiU2VydmljZUdyb3VwQ29udGV4dCIpOwotICAgIGlmIChzZ0NvbnRleHQgIT0gbnVsbCkgewotICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIlZJRVciLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0eU5hbWVzID0gc2dDb250ZXh0LmdldFByb3BlcnR5TmFtZXMoKTsKLSU+Ci0gICAgICAgICAgICAgPGg0PlBlcnNpc3RhbmNlIHByb3BlcnRpZXM8L2g0Pjx1bD4KLSAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICB3aGlsZSAocHJvcGVydHlOYW1lcy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBwcm9wZXJ0eU5hbWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wZXJ0eSA9ICBzZ0NvbnRleHQuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICA8bGk+PCU9a2V5JT4gOiA8JT1wcm9wZXJ0eS50b1N0cmluZygpJT48L2xpPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICU+PC91bD4KLSAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0gICBlbHNlIGlmKCJERUxFVEUiLmVxdWFscyh0eXBlKSl7Ci0gICAgICAgICAgICAgICAgIGNvbmZpZ0N0eC5yZW1vdmVTZXJ2aWNlR3JvdXBDb250ZXh0KHNnQ29udGV4dC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgJT5SZW1vdmVkIHRoZSBjb250ZXh0PCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0lPiA8aDQ+Tm8gc2VydmljZSBncm91cCBjb250ZXh0IGZvdW5kPC9oND48JQotICAgIH0KLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iaW5jbHVkZS9hZG1pbmZvb3Rlci5pbmMiPjwvanNwOmluY2x1ZGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMvd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9heGlzMi13ZWIvdmlld3BoYXNlcy5qc3AgYi8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi92aWV3cGhhc2VzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ZGI5Yy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy93ZWJhcHAvc3JjL21haW4vd2ViYXBwL2F4aXMyLXdlYi92aWV3cGhhc2VzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0gPCUtLQ0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICB+DQotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAgfg0KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICB+IHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAgLS0lPiA8JUAgcGFnZSBpbXBvcnQ9Im9yZy5hcGFjaGUuYXhpczIuQ29uc3RhbnRzLA0KLSAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlzMi5kZXBsb3ltZW50LnV0aWwuUGhhc2VzSW5mbywNCi0gICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpczIuZW5naW5lLlBoYXNlIiU+DQotIDwlQCBwYWdlIGltcG9ydD0iamF2YS51dGlsLkxpc3QiJT4NCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluaGVhZGVyLmpzcCI+PC9qc3A6aW5jbHVkZT4NCi08aDE+QXZhaWxhYmxlIFBoYXNlczwvaDE+DQotICAgICA8JQ0KLSAgICAgICAgIFBoYXNlc0luZm8gcGhhc2VzID0gKFBoYXNlc0luZm8pcmVxdWVzdC5nZXRTZXNzaW9uKCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5QSEFTRV9MSVNUKTsNCi0gICAgICAgICByZXF1ZXN0LmdldFNlc3Npb24oKS5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlBIQVNFX0xJU1QsbnVsbCk7DQotICAgICAgICAgTGlzdCB0ZW1wTGlzdCA9IHBoYXNlcy5nZXRHbG9iYWxJbmZsb3coKTsNCi0gICAgICU+PGgyPjxmb250IGNvbG9yPSJibHVlIj5TeXN0ZW0gUHJlLWRlZmluZWQgUGhhc2VzPC9mb250PjwvaDI+DQotICAgICA8Yj5JbkZsb3cgVXAgdG8gRGlzcGF0Y2hlcjwvYj4NCi0gICAgIDxibG9ja3F1b3RlPg0KLSAgICAgICAgIDwlDQotICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcExpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSB0ZW1wTGlzdC5nZXQoaSk7DQotICAgICAgICAgJT48JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PGJyPjwlDQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAlPg0KLSAgICAgICAgIDwvYmxvY2txdW90ZT4NCi0gICAgICAgICA8Yj5JbkZhdWx0RmxvdyA8L2I+DQotICAgICAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgdGVtcExpc3QgPSBwaGFzZXMuZ2V0R2xvYmFsSW5GYXVsdFBoYXNlcygpOw0KLSAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGVtcExpc3QuZ2V0KGkpOw0KLSAgICAgICAgICU+PCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjxicj48JQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgJT4NCi0gICAgICAgICA8L2Jsb2NrcXVvdGU+DQotICAgICAgICAgPGI+T3V0RmxvdyA8L2I+DQotICAgICAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgdGVtcExpc3QgPSBwaGFzZXMuZ2V0R2xvYmFsT3V0UGhhc2VMaXN0KCk7DQotICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcExpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSB0ZW1wTGlzdC5nZXQoaSk7DQotICAgICAgICAgJT48JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PGJyPjwlDQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAlPg0KLSAgICAgICAgIDwvYmxvY2txdW90ZT4NCi0gICAgICAgICA8Yj5PdXRGYXVsdEZsb3cgPC9iPg0KLSAgICAgICAgIDxibG9ja3F1b3RlPg0KLSAgICAgICAgIDwlDQotICAgICAgICAgICAgIHRlbXBMaXN0ID0gcGhhc2VzLmdldE9VVF9GYXVsdFBoYXNlcygpOw0KLSAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXBMaXN0LnNpemUoKTsgaSsrKSB7DQotICAgICAgICAgICAgICAgICBQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGVtcExpc3QuZ2V0KGkpOw0KLSAgICAgICAgICU+PCU9cGhhc2UuZ2V0UGhhc2VOYW1lKCklPjxicj48JQ0KLSAgICAgICAgICAgICB9DQotICAgICAgICAgJT4NCi0gICAgICAgICA8L2Jsb2NrcXVvdGU+DQotICAgICAgICAgPGJyPg0KLSAgICAgICAgIDxoMj48Zm9udCBjb2xvcj0iYmx1ZSI+VXNlciBEZWZpbmVkIFBoYXNlczwvZm9udD48L2gyPg0KLSAgICAgICAgIDxiPkluZmxvdyBhZnRlciBEaXNwYXRjaGVyPC9iPg0KLSAgICAgICAgIDxibG9ja3F1b3RlPg0KLSAgICAgICAgIDwlDQotICAgICAgICAgICAgIHRlbXBMaXN0ID0gcGhhc2VzLmdldE9wZXJhdGlvbkluUGhhc2VzKCk7DQotICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcExpc3Quc2l6ZSgpOyBpKyspIHsNCi0gICAgICAgICAgICAgICAgIFBoYXNlIHBoYXNlID0gKFBoYXNlKSB0ZW1wTGlzdC5nZXQoaSk7DQotICAgICAgICAgJT48JT1waGFzZS5nZXRQaGFzZU5hbWUoKSU+PGJyPjwlDQotICAgICAgICAgICAgIH0NCi0gICAgICAgICAlPg0KLSAgICAgICAgIDwvYmxvY2txdW90ZT4NCi0gICAgICAgICA8Yj5JbkZhdWx0RmxvdyBhZnRlciBEaXNwYXRjaGVyPC9iPg0KLSAgICAgICAgIDxibG9ja3F1b3RlPg0KLSAgICAgICAgIDwlDQotICAgICAgICAgICAgIHRlbXBMaXN0ID0gcGhhc2VzLmdldE9wZXJhdGlvbkluRmF1bHRQaGFzZXMoKTsNCi0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHRlbXBMaXN0LmdldChpKTsNCi0gICAgICAgICAlPjwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48YnI+PCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICU+DQotICAgICAgICAgPC9ibG9ja3F1b3RlPg0KLSAgICAgICAgIDxiPk91dEZsb3cgIDwvYj4NCi0gICAgICAgICA8YmxvY2txdW90ZT4NCi0gICAgICAgICA8JQ0KLSAgICAgICAgICAgICB0ZW1wTGlzdCA9IHBoYXNlcy5nZXRPcGVyYXRpb25PdXRQaGFzZXMoKTsNCi0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHRlbXBMaXN0LmdldChpKTsNCi0gICAgICAgICAlPjwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48YnI+PCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICU+DQotICAgICAgICAgPC9ibG9ja3F1b3RlPg0KLSAgICAgICAgIDxiPk91dEZhdWx0RmxvdyA8L2I+DQotICAgICAgICAgPGJsb2NrcXVvdGU+DQotICAgICAgICAgPCUNCi0gICAgICAgICAgICAgdGVtcExpc3QgPSBwaGFzZXMuZ2V0T3BlcmF0aW9uT3V0RmF1bHRQaGFzZXMoKTsNCi0gICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgew0KLSAgICAgICAgICAgICAgICAgUGhhc2UgcGhhc2UgPSAoUGhhc2UpIHRlbXBMaXN0LmdldChpKTsNCi0gICAgICAgICAlPjwlPXBoYXNlLmdldFBoYXNlTmFtZSgpJT48YnI+PCUNCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgICU+DQotICAgICAgICAgPC9ibG9ja3F1b3RlPg0KLTxqc3A6aW5jbHVkZSBwYWdlPSJpbmNsdWRlL2FkbWluZm9vdGVyLmluYyI+PC9qc3A6aW5jbHVkZT4NCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy9wb20ueG1sIGIvMV81L21vZHVsZXMveG1sYmVhbnMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzN2IwNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmF4aXMyLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8L3BhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5heGlzMi14bWxiZWFuczwvYXJ0aWZhY3RJZD4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBYTUxCZWFucyBEYXRhIEJpbmRpbmc8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPlhNTEJlYW5zIGRhdGEgYmluZGluZyBzdXBwb3J0IGZvciBBeGlzMjwvZGVzY3JpcHRpb24+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmF4aXMyPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXhpczItY29kZWdlbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUueG1sYmVhbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWxiZWFuczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICA8c2NtPgotICAgICAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy94bWxiZWFuczwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNS9tb2R1bGVzL3htbGJlYW5zPC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvYXhpcy9heGlzMi9qYXZhL2NvcmUvYnJhbmNoZXMvamF2YS8xXzUvbW9kdWxlcy94bWxiZWFuczwvdXJsPgotICAgIDwvc2NtPgotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmM8L3NvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+dGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICAgICAgPHRlc3RSZXNvdXJjZXM+Ci0gICAgICAgICAgICA8dGVzdFJlc291cmNlPgotICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi4uL3Rlc3QtcmVzb3VyY2VzPC90YXJnZXRQYXRoPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGVzdC1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KLSAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVtb3RlLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1yZXNvdXJjZS1idW5kbGU6JHtwb20udmVyc2lvbn08L3Jlc291cmNlQnVuZGxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qVXRpbC5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkNvbnN0YW50cy5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZW4tY3A8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3MgdW5sZXNzPSJtYXZlbi50ZXN0LnNraXAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3AiIHJlZmlkPSJtYXZlbi5ydW50aW1lLmNsYXNzcGF0aCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtjcH0iIGZpbGU9InRhcmdldC9jcC50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICAgICAgPCEtLTxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtYW50bHI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5hbnRscjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudGxyYWxsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+LS0+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy9zcmMvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9Db2RlR2VuZXJhdGlvblV0aWxpdHkuamF2YSBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL0NvZGVHZW5lcmF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTUxZDUxLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL0NvZGVHZW5lcmF0aW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc01lc3NhZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi5kZXNjcmlwdGlvbi5BeGlzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIuZGVzY3JpcHRpb24uQXhpc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlNjaGVtYVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLlVSTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLldTRExVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLkNvZGVHZW5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5jb2RlZ2VuLmV4dGVuc2lvbi5YTUxCZWFuc0V4dGVuc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuZGF0YWJpbmRpbmcuRGVmYXVsdFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmRhdGFiaW5kaW5nLkphdmFUeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC5kYXRhYmluZGluZy5UeXBlTWFwcGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIud3NkbC51dGlsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2NoZW1hLlhtbFNjaGVtYUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5CaW5kaW5nQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuRmlsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFHbG9iYWxFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWxiZWFucy5TY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuU2NoZW1hVHlwZVN5c3RlbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbEJlYW5zOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT2JqZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbGJlYW5zLmltcGwueGIueHNkc2NoZW1hLlNjaGVtYURvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogRnJhbWV3b3JrLWxpbmtlZCBjb2RlIHVzZWQgYnkgWE1MQmVhbnMgZGF0YSBiaW5kaW5nIHN1cHBvcnQuIFRoaXMgaXMgYWNjZXNzZWQgdmlhIHJlZmxlY3Rpb24gZnJvbQotICogdGhlIFhNTEJlYW5zIGNvZGUgZ2VuZXJhdGlvbiBleHRlbnNpb24gd2hlbiBYTUxCZWFucyBkYXRhIGJpbmRpbmcgaXMgc2VsZWN0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlR2VuZXJhdGlvblV0aWxpdHkgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT0xERVIgPSAic2NoZW1hcyI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HUyA9ICJtYXBwaW5ncyI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElORyA9ICJtYXBwaW5nIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFID0gIm1lc3NhZ2UiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRSA9ICJqYXZhY2xhc3MiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19GT0xERVIgPSAiTWFwcGluZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVSX0ZJTEVfTkFNRSA9ICJtYXBwZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9QQVRIID0gIi9vcmcvYXBhY2hlL2F4aXMyL3dzZGwvY29kZWdlbi9zY2hlbWEvIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb2RlR2VuZXJhdGlvblV0aWxpdHkuY2xhc3MpOwotICAgIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsU2NoZW1hcwotICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZU1hcHBlciBwcm9jZXNzU2NoZW1hcyhMaXN0IHNjaGVtYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRbXSBhZGRpdGlvbmFsU2NoZW1hcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbkNvbmZpZ3VyYXRpb24gY2djb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlU3lzdGVtTmFtZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvL2NoZWNrIGZvciB0aGUgaW1wb3J0ZWQgdHlwZXMuIEFueSBpbXBvcnRlZCB0eXBlcyBhcmUgc3VwcG9zZWQgdG8gYmUgaGVyZSBhbHNvCi0gICAgICAgICAgICBpZiAoc2NoZW1hcyA9PSBudWxsIHx8IHNjaGVtYXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy90aGVyZSBhcmUgbm8gdHlwZXMgdG8gYmUgY29kZSBnZW5lcmF0ZWQKLSAgICAgICAgICAgICAgICAvL0hvd2V2ZXIgaWYgdGhlIHR5cGUgbWFwcGVyIGlzIGxlZnQgZW1wdHkgaXQgd2lsbCBiZSBhIHByb2JsZW0gZm9yIHRoZSBvdGhlcgotICAgICAgICAgICAgICAgIC8vcHJvY2Vzc2VzLiBIZW5jZSB0aGUgZGVmYXVsdCB0eXBlIG1hcHBlciBpcyBzZXQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRUeXBlTWFwcGVyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNjaGVtYVR5cGVTeXN0ZW0gc3RzOwotICAgICAgICAgICAgTGlzdCBjb21wbGV0ZVNjaGVtYUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBMaXN0IHRvcExldmVsU2NoZW1hTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgLy9jcmVhdGUgdGhlIHR5cGUgbWFwcGVyCi0gICAgICAgICAgICAvL0ZpcnN0IHRyeSB0byB0YWtlIHRoZSBvbmUgdGhhdCBpcyBhbHJlYWR5IHRoZXJlCi0gICAgICAgICAgICBUeXBlTWFwcGVyIG1hcHBlciA9IGNnY29uZmlnLmdldFR5cGVNYXBwZXIoKTsKLSAgICAgICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1hcHBlciA9IG5ldyBKYXZhVHlwZU1hcHBlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NoYW5nZSB0aGUgIGRlZmF1bHQgY2xhc3MgbmFtZSBvZiB0aGUgbWFwcGVyIHRvCi0gICAgICAgICAgICAvL3htbGJlYW5zIHNwZWNpZmljIFhNTE9iamVjdAotICAgICAgICAgICAgbWFwcGVyLnNldERlZmF1bHRNYXBwaW5nTmFtZShYbWxPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgTWFwIG5hbWVTcGFjZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgTGlzdCBheGlzU2VydmljZXMgPSBjZ2NvbmZpZy5nZXRBeGlzU2VydmljZXMoKTsKLSAgICAgICAgICAgIEF4aXNTZXJ2aWNlIGF4aXNTZXJ2aWNlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKWl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIG5hbWVTcGFjZXNNYXAucHV0QWxsKGF4aXNTZXJ2aWNlLmdldE5hbWVzcGFjZU1hcCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcHJvY2VzcyBhbGwgdGhlIHNjaGVtYXMgYW5kIG1ha2UgYSBsaXN0IG9mIGFsbCBvZiB0aGVtIGZvcgotICAgICAgICAgICAgLy8gcmVzb2x2aW5nIGVudGl0aWVzCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gKFhtbFNjaGVtYSlzY2hlbWFzLmdldChpKTsKLSAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlc01hcCk7IC8vYWRkIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgICAgICAgICAgWG1sU2NoZW1hW10gYWxsU2NoZW1hcyA9IFNjaGVtYVV0aWwuZ2V0QWxsU2NoZW1hcyhzY2hlbWEpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYWxsU2NoZW1hcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVNjaGVtYUxpc3QuYWRkKGFsbFNjaGVtYXNbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9tYWtlIGFub3RoZXIgbGlzdCBvZiB0b3AgbGV2ZWwgc2NoZW1hcyBmb3IgcGFzc2luZyBpbnRvIFhNTGJlYW5zCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjaGVtYXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gKFhtbFNjaGVtYSlzY2hlbWFzLmdldChpKTsKLSAgICAgICAgICAgICAgICBYbWxPcHRpb25zIG9wdGlvbnMgPSBuZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0TG9hZEFkZGl0aW9uYWxOYW1lc3BhY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlc01hcCk7IC8vYWRkIHRoZSBuYW1lc3BhY2VzCi0gICAgICAgICAgICAgICAgdG9wTGV2ZWxTY2hlbWFMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY2hlbWFBc1N0cmluZyhzY2hlbWEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgb3B0aW9ucykpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhtbFNjaGVtYUNvbGxlY3Rpb24gZXh0cmFzID0gbmV3IFhtbFNjaGVtYUNvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIC8vIGFkZCB0aGUgdGhpcmQgcGFydHkgc2NoZW1hcwotICAgICAgICAgICAgLy90b2RvIHBlcmhhcHMgY2hlY2tpbmcgdGhlIG5hbWVzcGFjZXMgd291bGQgYmUgYSBnb29kIGlkZWEgdG8KLSAgICAgICAgICAgIC8vbWFrZSB0aGUgZ2VuZXJhdGVkIGNvZGUgd29yayBlZmZpY2llbnRseQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsU2NoZW1hcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbXBsZXRlU2NoZW1hTGlzdC5hZGQoZXh0cmFzLnJlYWQoYWRkaXRpb25hbFNjaGVtYXNbaV0pKTsKLSAgICAgICAgICAgICAgICB0b3BMZXZlbFNjaGVtYUxpc3QuYWRkKFhtbE9iamVjdC5GYWN0b3J5LnBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFNjaGVtYXNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2NvbXBpbGUgdGhlIHR5cGUgc3lzdGVtCi0gICAgICAgICAgICBBeGlzMkVudGl0eVJlc29sdmVyIGVyID0gbmV3IEF4aXMyRW50aXR5UmVzb2x2ZXIoKTsKLSAgICAgICAgICAgIGVyLnNldFNjaGVtYXMoKFhtbFNjaGVtYVtdKWNvbXBsZXRlU2NoZW1hTGlzdAotICAgICAgICAgICAgICAgICAgICAudG9BcnJheShuZXcgWG1sU2NoZW1hW2NvbXBsZXRlU2NoZW1hTGlzdC5zaXplKCldKSk7Ci0gICAgICAgICAgICBlci5zZXRCYXNlVXJpKGNnY29uZmlnLmdldEJhc2VVUkkoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyB4c2RDb25maWdGaWxlID0gKFN0cmluZyljZ2NvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KFhNTEJlYW5zRXh0ZW5zaW9uLlhTRENPTkZJR19PUFRJT04pOwotCi0gICAgICAgICAgICAvLy1FamF2YXZlcnNpb24gc3dpdGNoIHRvIFhtbE9wdGlvbnMgdG8gZ2VuZXJhdGUgMS41IGNvbXBsaWFudCBjb2RlCi0gICAgICAgICAgICBYbWxPcHRpb25zIHhtbE9wdGlvbnMJPQluZXcgWG1sT3B0aW9ucygpOwotICAgICAgICAgICAgeG1sT3B0aW9ucy5zZXRFbnRpdHlSZXNvbHZlcihlcik7Ci0gICAgICAgICAgICAvL3Rlc3QgaWYgamF2YXZlcnNpb24gcHJvcGVydHkgaW4gQ29kZUdlbkNvbmZpZwotICAgICAgICAgICAgaWYobnVsbCE9Y2djb25maWcuZ2V0UHJvcGVydHkoImphdmF2ZXJzaW9uIikpewotICAgICAgICAgICAgCXhtbE9wdGlvbnMucHV0KFhtbE9wdGlvbnMuR0VORVJBVEVfSkFWQV9WRVJTSU9OLGNnY29uZmlnLmdldFByb3BlcnR5KCJqYXZhdmVyc2lvbiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cyA9IFhtbEJlYW5zLmNvbXBpbGVYbWxCZWFucygKLSAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBTVFMgbmFtZTsgZGVmYXVsdHMgdG8gbnVsbCwgd2hpY2ggbWFrZXMgdGhlIGdlbmVyYXRlZCBjbGFzcwotICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIGEgdW5pcXVlIChidXQgcmFuZG9tKSBTVFMgbmFtZQotICAgICAgICAgICAgICAgICAgICB0eXBlU3lzdGVtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRvU2NoZW1hQXJyYXkodG9wTGV2ZWxTY2hlbWFMaXN0KSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEF4aXMyQmluZGluZ0NvbmZpZyhjZ2NvbmZpZy5nZXRVcmkyUGFja2FnZU5hbWVNYXAoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RDb25maWdGaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgWG1sQmVhbnMuZ2V0Q29udGV4dFR5cGVMb2FkZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEF4aXMyRmlsZXIoY2djb25maWcpLAotICAgICAgICAgICAgICAgICAgICB4bWxPcHRpb25zKTsKLQotICAgICAgICAgICAgLy8gcHJ1bmUgdGhlIGdlbmVyYXRlZCBzY2hlbWEgdHlwZSBzeXN0ZW0gYW5kIGFkZCB0aGUgbGlzdCBvZiBiYXNlNjQgdHlwZXMKLSAgICAgICAgICAgIGNnY29uZmlnLnB1dFByb3BlcnR5KENvbnN0YW50cy5CQVNFXzY0X1BST1BFUlRZX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRCYXNlNjRUeXBlcyhzdHMpKTsKLSAgICAgICAgICAgIGNnY29uZmlnLnB1dFByb3BlcnR5KENvbnN0YW50cy5QTEFJTl9CQVNFXzY0X1BST1BFUlRZX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRQbGFpbkJhc2U2NFR5cGVzKHN0cykpOwotCi0gICAgICAgICAgICBTY2hlbWFUeXBlU3lzdGVtIGludGVybmFsID0gWG1sQmVhbnMuZ2V0QnVpbHRpblR5cGVTeXN0ZW0oKTsKLSAgICAgICAgICAgIFNjaGVtYVR5cGVbXSBzY2hlbWFUeXBlcyA9IGludGVybmFsLmdsb2JhbFR5cGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNjaGVtYVR5cGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShzY2hlbWFUeXBlc1tqXS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFUeXBlc1tqXS5nZXRGdWxsSmF2YU5hbWUoKSk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9nZXQgdGhlIHNjaGVtYXR5cGVzIGFuZCBhZGQgdGhlIGRvY3VtZW50IHR5cGVzIHRvIHRoZSB0eXBlIG1hcHBlcgotICAgICAgICAgICAgc2NoZW1hVHlwZXMgPSBzdHMuZG9jdW1lbnRUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzY2hlbWFUeXBlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIG1hcHBlci5hZGRUeXBlTWFwcGluZ05hbWUoc2NoZW1hVHlwZXNbal0uZ2V0RG9jdW1lbnRFbGVtZW50TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hVHlwZXNbal0uZ2V0RnVsbEphdmFOYW1lKCkpOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vcHJvY2VzcyB0aGUgdW53cmFwcGVkIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIGlmICghY2djb25maWcuaXNQYXJhbWV0ZXJzV3JhcHBlZCgpKSB7Ci0gICAgICAgICAgICAgICAgLy9maWd1cmUgb3V0IHRoZSB1bndyYXBwZWQgb3BlcmF0aW9ucwotICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlcyA9IGNnY29uZmlnLmdldEF4aXNTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igc2VydmljZXNJdGVyID0gYXhpc1NlcnZpY2VzLml0ZXJhdG9yKCk7IHNlcnZpY2VzSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGF4aXNTZXJ2aWNlID0gKEF4aXNTZXJ2aWNlKXNlcnZpY2VzSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGF4aXNTZXJ2aWNlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNPcGVyYXRpb24gb3AgPSAoQXhpc09wZXJhdGlvbilvcGVyYXRpb25zLm5leHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdTRExVdGlsLmlzSW5wdXRQcmVzZW50Rm9yTUVQKG9wLmdldE1lc3NhZ2VFeGNoYW5nZVBhdHRlcm4oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBeGlzTWVzc2FnZSBtZXNzYWdlID0gb3AuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTRExDb25zdGFudHMuTUVTU0FHRV9MQUJFTF9JTl9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCB4bWxiZWFuc0VsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5maW5kRWxlbWVudChtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHhtbGJlYW5zRWxlbWVudC5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbGVtZW50UHJvcGVydGllcyA9IHNUeXBlLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IGVsZW1lbnRQcm9wZXJ0eSA9IGVsZW1lbnRQcm9wZXJ0aWVzW2ldOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5JTlBVVF9QQVJUX1FOQU1FX1NVRkZJWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHR5cGUgaXMgYmFzZWQgb24gYSBwcmltaXRpdmUgdHlwZS0gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmltaXRpdmUgdHlwZSBuYW1lIGluIHRoaXMgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxKYXZlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eS5nZXRUeXBlKCkuZ2V0RnVsbEphdmFOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnR5LmV4dGVuZHNKYXZhQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxKYXZlTmFtZSA9IGZ1bGxKYXZlTmFtZS5jb25jYXQoIltdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdOYW1lKHBhcnRRTmFtZSwgZnVsbEphdmVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVR5cGUgcHJpbWl0aXZlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eS5nZXRUeXBlKCkuZ2V0UHJpbWl0aXZlVHlwZSgpOwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmltaXRpdmVUeXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRQcm9wZXJ0eS5leHRlbmRzSmF2YUFycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuYWRkVHlwZU1hcHBpbmdTdGF0dXMocGFydFFOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQVJSQVlfVFlQRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXU0RMVXRpbC5pc091dHB1dFByZXNlbnRGb3JNRVAob3AuZ2V0TWVzc2FnZUV4Y2hhbmdlUGF0dGVybigpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF4aXNNZXNzYWdlIG1lc3NhZ2UgPSBvcC5nZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5NRVNTQUdFX0xBQkVMX09VVF9WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRQYXJhbWV0ZXIoQ29uc3RhbnRzLlVOV1JBUFBFRF9LRVkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hR2xvYmFsRWxlbWVudCB4bWxiZWFuc0VsZW1lbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5maW5kRWxlbWVudChtZXNzYWdlLmdldEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hVHlwZSBzVHlwZSA9IHhtbGJlYW5zRWxlbWVudC5nZXRUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbGVtZW50UHJvcGVydGllcyA9IHNUeXBlLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5IGVsZW1lbnRQcm9wZXJ0eSA9IGVsZW1lbnRQcm9wZXJ0aWVzW2ldOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTmFtZSBwYXJ0UU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0UU5hbWUob3AuZ2V0TmFtZSgpLmdldExvY2FsUGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NETENvbnN0YW50cy5PVVRQVVRfUEFSVF9RTkFNRV9TVUZGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyB0eXBlIGlzIGJhc2VkIG9uIGEgcHJpbWl0aXZlIHR5cGUtIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbWl0aXZlIHR5cGUgbmFtZSBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsSmF2ZU5hbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZ2V0VHlwZSgpLmdldEZ1bGxKYXZhTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRQcm9wZXJ0eS5leHRlbmRzSmF2YUFycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsSmF2ZU5hbWUgPSBmdWxsSmF2ZU5hbWUuY29uY2F0KCJbXSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nTmFtZShwYXJ0UU5hbWUsIGZ1bGxKYXZlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHByaW1pdGl2ZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydHkuZ2V0VHlwZSgpLmdldFByaW1pdGl2ZVR5cGUoKTsKLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nU3RhdHVzKHBhcnRRTmFtZSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UHJvcGVydHkuZXh0ZW5kc0phdmFBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLmFkZFR5cGVNYXBwaW5nU3RhdHVzKHBhcnRRTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFSUkFZX1RZUEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3JldHVybiBtYXBwZXIgdG8gYmUgc2V0IGluIHRoZSBjb25maWcKLSAgICAgICAgICAgIHJldHVybiBtYXBwZXI7Ci0KLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZSB0aGUgYmFzZTY0IHR5cGVzIFRoZSBhbGdvIGlzIHRvIGxvb2sgZm9yIHNpbXBsZXR5cGVzIHRoYXQgaGF2ZSBiYXNlNjQgY29udGVudCwgYW5kCi0gICAgICogdGhlbiBzdGVwIG91dCBvZiB0aGF0IG9uZXN0ZXAgYW5kIGdldCB0aGUgZWxlbWVudC4gRm9yIG5vdyB0aGVyZSdzIGFuIGV4dGVuZGVkIGNoZWNrIHRvIHNlZQotICAgICAqIHdoZXRoZXIgdGhlIHNpbXBsZSB0eXBlIGlzIHJlbGF0ZWQgdG8gdGhlIFhtaW1lOmNvbnRlbnRUeXBlIQotICAgICAqCi0gICAgICogQHBhcmFtIHN0cwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3QgZmluZEJhc2U2NFR5cGVzKFNjaGVtYVR5cGVTeXN0ZW0gc3RzKSB7Ci0gICAgICAgIExpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBMaXN0IGJhc2U2NEVsZW1lbnRRTmFtZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTY2hlbWFUeXBlIG91dGVyVHlwZTsKLSAgICAgICAgLy9hZGQgdGhlIGRvY3VtZW50IHR5cGVzIGFuZCBnbG9iYWwgdHlwZXMKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0cy5kb2N1bWVudFR5cGVzKCkpKTsKLSAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0cy5nbG9iYWxUeXBlcygpKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxTZWVuVHlwZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc1R5cGUgPSAoU2NoZW1hVHlwZSlhbGxTZWVuVHlwZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAoc1R5cGUuZ2V0Q29udGVudFR5cGUoKSA9PSBTY2hlbWFUeXBlLlNJTVBMRV9DT05URU5UICYmCi0gICAgICAgICAgICAgICAgICAgIHNUeXBlLmdldFByaW1pdGl2ZVR5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5CQVNFXzY0X0NPTlRFTlRfUU5BTUUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoc1R5cGUuZ2V0UHJpbWl0aXZlVHlwZSgpLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0ZXJUeXBlID0gc1R5cGUuZ2V0T3V0ZXJUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgdGhlIG91dGVyIHR5cGUgZnVydGhlciB0byBzZWUgd2hldGhlciBpdCBoYXMgdGhlIGNvbnRlbnR0eXBlIGF0dHJpYnV0ZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgIC8vWE1pbWUgbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIFNjaGVtYVByb3BlcnR5W10gcHJvcGVydGllcyA9IHNUeXBlLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JnLmFwYWNoZS5heGlzMi5uYW1lc3BhY2UuQ29uc3RhbnRzLlhNSU1FX0NPTlRFTlRfVFlQRV9RTkFNRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHByb3BlcnRpZXNbal0uZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRkIHRoaXMgb25seSBpZiBpdCBpcyBhIGRvY3VtZW50IHR5cGUgPz8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ZXJUeXBlLmlzRG9jdW1lbnRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0RWxlbWVudFFOYW1lc0xpc3QuYWRkKG91dGVyVHlwZS5nZXREb2N1bWVudEVsZW1lbnROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vYWRkIGFueSBvZiB0aGUgY2hpbGQgdHlwZXMgaWYgdGhlcmUgYXJlIGFueQotICAgICAgICAgICAgYWxsU2VlblR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHNUeXBlLmdldEFub255bW91c1R5cGVzKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBiYXNlNjRFbGVtZW50UU5hbWVzTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3RzCi0gICAgICogQHJldHVybiBhcnJheSBsaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBmaW5kUGxhaW5CYXNlNjRUeXBlcyhTY2hlbWFUeXBlU3lzdGVtIHN0cykgewotICAgICAgICBBcnJheUxpc3QgYWxsU2VlblR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHMuZG9jdW1lbnRUeXBlcygpKSk7Ci0gICAgICAgIGFsbFNlZW5UeXBlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdHMuZ2xvYmFsVHlwZXMoKSkpOwotCi0gICAgICAgIEFycmF5TGlzdCBiYXNlNjRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsU2VlblR5cGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFNjaGVtYVR5cGUgc3R5cGUgPSAoU2NoZW1hVHlwZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5kUGxhaW5CYXNlNjRUeXBlcyhzdHlwZSwgYmFzZTY0VHlwZXMsIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYmFzZTY0VHlwZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0eXBlCi0gICAgICogQHBhcmFtIGJhc2U2NFR5cGVzCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kUGxhaW5CYXNlNjRUeXBlcyhTY2hlbWFUeXBlIHN0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGJhc2U2NFR5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0IHByb2Nlc3NlZFR5cGVzKSB7Ci0KLSAgICAgICAgU2NoZW1hUHJvcGVydHlbXSBlbGVtZW50UHJvcGVydGllcyA9IHN0eXBlLmdldEVsZW1lbnRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFFOYW1lIG5hbWU7Ci0gICAgICAgIFNjaGVtYVR5cGUgc2NoZW1hVHlwZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50UHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgc2NoZW1hVHlwZSA9IGVsZW1lbnRQcm9wZXJ0aWVzW2ldLmdldFR5cGUoKTsKLSAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50UHJvcGVydGllc1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoIWJhc2U2NFR5cGVzLmNvbnRhaW5zKG5hbWUpICYmICFwcm9jZXNzZWRUeXBlcy5jb250YWlucyhzY2hlbWFUeXBlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBwcm9jZXNzZWRUeXBlcy5hZGQoc3R5cGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2NoZW1hVHlwZS5pc1ByaW1pdGl2ZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBTY2hlbWFUeXBlIHByaW1pdGl2ZVR5cGUgPSBzY2hlbWFUeXBlLmdldFByaW1pdGl2ZVR5cGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yZy5hcGFjaGUuYXhpczIubmFtZXNwYWNlLkNvbnN0YW50cy5CQVNFXzY0X0NPTlRFTlRfUU5BTUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHByaW1pdGl2ZVR5cGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0VHlwZXMuYWRkKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5kUGxhaW5CYXNlNjRUeXBlcyhzY2hlbWFUeXBlLCBiYXNlNjRUeXBlcywgcHJvY2Vzc2VkVHlwZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICB9Ci0KLQotICAgIC8qKiBQcml2YXRlIGNsYXNzIHRvIGdlbmVyYXRlIHRoZSBmaWxlciAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF4aXMyRmlsZXIgaW1wbGVtZW50cyBGaWxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBGaWxlIGxvY2F0aW9uOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmxhdHRlbiA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIFN0cmluZyByZXNvdXJjZURpck5hbWU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNyY0Rpck5hbWU7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0ZJTEVfRVhURU5TSU9OID0gIi5qYXZhIjsKLQotICAgICAgICBwcml2YXRlIEF4aXMyRmlsZXIoQ29kZUdlbkNvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9IGNvbmZpZy5nZXRPdXRwdXRMb2NhdGlvbigpOwotICAgICAgICAgICAgZmxhdHRlbiA9IGNvbmZpZy5pc0ZsYXR0ZW5GaWxlcygpOwotICAgICAgICAgICAgcmVzb3VyY2VEaXJOYW1lID0gY29uZmlnLmdldFJlc291cmNlTG9jYXRpb24oKTsKLSAgICAgICAgICAgIHNyY0Rpck5hbWUgPSBjb25maWcuZ2V0U291cmNlTG9jYXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gY3JlYXRlQmluYXJ5RmlsZShTdHJpbmcgdHlwZW5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIEZpbGUgcmVzb3VyY2VzRGlyZWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgZmxhdHRlbiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGxvY2F0aW9uLCByZXNvdXJjZURpck5hbWUpOwotCi0gICAgICAgICAgICBpZiAoIXJlc291cmNlc0RpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJlc291cmNlc0RpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlc0RpcmVjdG9yeSwgdHlwZW5hbWUpOwotICAgICAgICAgICAgZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXcml0ZXIgY3JlYXRlU291cmNlRmlsZShTdHJpbmcgdHlwZW5hbWUpCi0gICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHR5cGVuYW1lID0KLSAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgICAgICAgICAgIEZpbGUgb3V0cHV0RGlyID0KLSAgICAgICAgICAgICAgICAgICAgZmxhdHRlbiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGxvY2F0aW9uLCBzcmNEaXJOYW1lKTsKLQotICAgICAgICAgICAgaWYgKCFvdXRwdXREaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSArIEpBVkFfRklMRV9FWFRFTlNJT04pOwotICAgICAgICAgICAgZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVdyaXRlcihmaWxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgc2NoZW1hIGludG8gYSBTdHJpbmcKLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2hlbWEKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2NoZW1hQXNTdHJpbmcoWG1sU2NoZW1hIHNjaGVtYSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgc2NoZW1hLndyaXRlKHdyaXRlcik7Ci0gICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gYmluZGluZyBjb25maWd1cmF0aW9uIGZvciB0aGUgY29kZSBnZW5lcmF0b3IuIFRoaXMgY29udHJvbHMgaG93IHRoZSBuYW1lc3BhY2VzIGFyZQotICAgICAqIHN1ZmZpeGVkL3ByZWZpeGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXhpczJCaW5kaW5nQ29uZmlnIGV4dGVuZHMgQmluZGluZ0NvbmZpZyB7Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXAgdXJpMnBhY2thZ2VNYXBwaW5ncyA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgWFNEQ29uZmlnIHhzZENvbmZpZyA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIEF4aXMyQmluZGluZ0NvbmZpZyhNYXAgdXJpMnBhY2thZ2VNYXBwaW5ncywgU3RyaW5nIHhzZENvbmZpZ2ZpbGUpIHsKLSAgICAgICAgICAgIHRoaXMudXJpMnBhY2thZ2VNYXBwaW5ncyA9IHVyaTJwYWNrYWdlTWFwcGluZ3M7Ci0gICAgICAgICAgICBpZiAodGhpcy51cmkycGFja2FnZU1hcHBpbmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvL21ha2UgYW4gZW1wdHkgb25lIHRvIGF2b2lkIG5hc3R5IHN1cnByaXNlcwotICAgICAgICAgICAgICAgIHRoaXMudXJpMnBhY2thZ2VNYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvIHdlIGhhdmUgYW4geHNkY29uZmlnIGZpbGU/Ci0gICAgICAgICAgICBpZiAoeHNkQ29uZmlnZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgeHNkQ29uZmlnID0gbmV3IFhTRENvbmZpZyh4c2RDb25maWdmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwUGFja2FnZUZvck5hbWVzcGFjZShTdHJpbmcgdXJpKSB7Ci0gICAgICAgICAgICAvKiBJZiB0aGUgeHNkY29uZmlnIGZpbGUgaGFzIG1hcHBpbmdzLCB3ZSdsbCB1c2UgdGhlbSBpbnN0ZWFkIG9mIHRoZSAtcCBvcHRpb24uCi0gICAgICAgICAgICAgKiBJZiB3ZSBoYXZlIGFuIHhzZGNvbmZpZyBmaWxlIGJ1dCBubyBuYW1lc3BhY2UgdG8gcGFja2FnZSBtYXBwaW5ncywgdGhlbiB3ZSdsbAotICAgICAgICAgICAgICogZGVmZXIgdG8gdGhlIC1wIG9wdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHhzZENvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHhzZENvbmZpZy5oYXNOYW1lc3BhY2VUb0phdmFQYWNrYWdlTWFwcGluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJSRVRVUk5JTkcgIiArIHVyaSArICIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2RDb25maWcuZ2V0TmFtZXNwYWNlc1RvSmF2YVBhY2thZ2VzKCkuZ2V0KHVyaSkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZyl4c2RDb25maWcuZ2V0TmFtZXNwYWNlc1RvSmF2YVBhY2thZ2VzKCkuZ2V0KHVyaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodXJpMnBhY2thZ2VNYXBwaW5ncy5jb250YWluc0tleSh1cmkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpdXJpMnBhY2thZ2VNYXBwaW5ncy5nZXQodXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVSTFByb2Nlc3Nvci5tYWtlUGFja2FnZU5hbWUodXJpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgbG9va3VwSmF2YW5hbWVGb3JRTmFtZShRTmFtZSBxbmFtZSkgewotICAgICAgICAgICAgLyogVGhlIG1hcHBpbmdzIGFyZSBzdG9yZWQgaW4gdGhlIGZvcm1hdDoKLSAgICAgICAgICAgICogTkFNRVNQQUNFOkxPQ0FMX05BTUUsIGkuZS4KLSAgICAgICAgICAgICogdXJuOndlZWdpZXRlY2g6bWluZXJ2YTptb2R1bGVUeXBlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHhzZENvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHhzZENvbmZpZy5nZXRTY2hlbWFUeXBlc1RvSmF2YU5hbWVzKCkuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJFVFVSTklORyAiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyAiID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgeHNkQ29uZmlnLmdldFNjaGVtYVR5cGVzVG9KYXZhTmFtZXMoKS5nZXQoa2V5KSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKXhzZENvbmZpZy5nZXRTY2hlbWFUeXBlc1RvSmF2YU5hbWVzKCkuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIubG9va3VwSmF2YW5hbWVGb3JRTmFtZShxbmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgZ2l2ZW4gdmVjdG9yIG9mIHNjaGVtYURvY3VtZW50cyB0byBYbWxCZWFucyBwcm9jZXNzYWJsZSBzY2hlbWEgb2JqZWN0cy4gT25lCi0gICAgICogZHJhd2JhY2sgd2UgaGF2ZSBoZXJlIGlzIHRoZSBub24taW5jbHVzaW9uIG9mIHVudGFyZ2V0ZWQgbmFtZXNwYWNlcwotICAgICAqCi0gICAgICogQHBhcmFtIHZlYwotICAgICAqIEByZXR1cm4gc2NoZW1hIGFycmF5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2NoZW1hRG9jdW1lbnQuU2NoZW1hW10gY29udmVydFRvU2NoZW1hQXJyYXkoTGlzdCB2ZWMpIHsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnRbXSBzY2hlbWFEb2N1bWVudHMgPQotICAgICAgICAgICAgICAgIChTY2hlbWFEb2N1bWVudFtdKXZlYy50b0FycmF5KG5ldyBTY2hlbWFEb2N1bWVudFt2ZWMuc2l6ZSgpXSk7Ci0gICAgICAgIC8vcmVtb3ZlIGR1cGxpY2F0ZXMKLSAgICAgICAgVmVjdG9yIHVuaXF1ZVNjaGVtYXMgPSBuZXcgVmVjdG9yKHNjaGVtYURvY3VtZW50cy5sZW5ndGgpOwotICAgICAgICBWZWN0b3IgdW5pcXVlU2NoZW1hVG5zID0gbmV3IFZlY3RvcihzY2hlbWFEb2N1bWVudHMubGVuZ3RoKTsKLSAgICAgICAgU2NoZW1hRG9jdW1lbnQuU2NoZW1hIHM7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBzID0gc2NoZW1hRG9jdW1lbnRzW2ldLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgaWYgKCF1bmlxdWVTY2hlbWFUbnMuY29udGFpbnMocy5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLSAgICAgICAgICAgICAgICB1bmlxdWVTY2hlbWFzLmFkZChzKTsKLSAgICAgICAgICAgICAgICB1bmlxdWVTY2hlbWFUbnMuYWRkKHMuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1bmlxdWVTY2hlbWFzLmFkZChzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFNjaGVtYURvY3VtZW50LlNjaGVtYVtdKQotICAgICAgICAgICAgICAgIHVuaXF1ZVNjaGVtYXMudG9BcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTY2hlbWFEb2N1bWVudC5TY2hlbWFbdW5pcXVlU2NoZW1hcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKiogQXhpczIgc3BlY2lmaWMgZW50aXR5IHJlc29sdmVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXhpczJFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyIHsKLSAgICAgICAgcHJpdmF0ZSBYbWxTY2hlbWFbXSBzY2hlbWFzOwotICAgICAgICBwcml2YXRlIFN0cmluZyBiYXNlVXJpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gcHVibGljSWQgLSB0aGlzIGlzIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi0gICAgICAgICAqIEBwYXJhbSBzeXN0ZW1JZCAtIHRoaXMgaXMgdGhlIGxvY2F0aW9uICh2YWx1ZSBvZiBzY2hlbWFMb2NhdGlvbikKLSAgICAgICAgICogQHJldHVybgotICAgICAgICAgKiBAc2VlIEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkoU3RyaW5nLCBTdHJpbmcpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoc3lzdGVtSWQuc3RhcnRzV2l0aCgicHJvamVjdDovL2xvY2FsLyIpKSB7Ci0gICAgICAgICAgICAgICAgc3lzdGVtSWQgPSBzeXN0ZW1JZC5zdWJzdHJpbmcoInByb2plY3Q6Ly9sb2NhbC8iLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaWYgdGhlIHN5c3RlbSBpZCBoYXMgLy8gZmluYWwgc3lzdGVtIGlkIGdpdmVzIG9ubHkgb25lIC8gYWZ0ZXIgdG9rZW5pemluZyBwcm9jZXNzCi0gICAgICAgICAgICAvLyB0byBhdm9pZCB0aGlzIHdlIGNoZWNrIHdoZXRoZXIgaXQgaXMgc3RhcnRlZCB3aXRoIGh0dHA6Ly8gb3Igbm90Ci0gICAgICAgICAgICBpZiAoIXN5c3RlbUlkLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXRoRWxlbWVudHMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN5c3RlbUlkLCAiLyIpOwotICAgICAgICAgICAgICAgIFN0YWNrIHBhdGhFbGVtZW50U3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAocGF0aEVsZW1lbnRzLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aEVsZW1lbnQgPSBwYXRoRWxlbWVudHMubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgiLiIuZXF1YWxzKHBhdGhFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCIuLiIuZXF1YWxzKHBhdGhFbGVtZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoRWxlbWVudFN0YWNrLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoRWxlbWVudFN0YWNrLnBvcCgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEVsZW1lbnRTdGFjay5wdXNoKHBhdGhFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGF0aEVsZW1lbnRTdGFjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aEJ1aWxkZXIuYXBwZW5kKEZpbGUuc2VwYXJhdG9yICsgaXRlci5uZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9IHBhdGhCdWlsZGVyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0KLSAgICAgICAgICAgIGxvZy5pbmZvKCJSZXNvbHZpbmcgc2NoZW1hIHdpdGggcHVibGljSWQgWyIgKyBwdWJsaWNJZCArICJdIGFuZCBzeXN0ZW1JZCBbIiArIHN5c3RlbUlkICsgIl0iKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY2hlbWFzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbFNjaGVtYSBzY2hlbWEgPSBzY2hlbWFzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmdldFNvdXJjZVVSSSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWEuZ2V0U291cmNlVVJJKCkuZW5kc1dpdGgoc3lzdGVtSWQucmVwbGFjZUFsbCgiXFxcXCIsICIvIikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHNjaGVtYS5nZXRTb3VyY2VVUkkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IGdldEZpbGVGcm9tVVJJKHBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZi5leGlzdHMoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKHNjaGVtYS5nZXRTb3VyY2VVUkkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShnZXRTY2hlbWFBc0lucHV0U3RyZWFtKHNjaGVtYXNbaV0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBYbWxTY2hlbWEgc2NoZW1hID0gc2NoZW1hc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhwdWJsaWNJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoZ2V0U2NoZW1hQXNJbnB1dFN0cmVhbShzY2hlbWFzW2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN5c3RlbUlkLmluZGV4T2YoJzonKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZSBiYXNlIFVSSSBpcyBtaXNzaW5nIHRoZW4gYXR0YWNoZSB0aGUgZmlsZTovLy8gdG8gaXQKLSAgICAgICAgICAgICAgICAgICAgLy9pZiB0aGUgc3lzdGVtSWQgYWN0dWFsbHkgaGFkIGEgc2NoZW1lIHRoZW4gYXMgcGVyIHRoZSBVUkwKLSAgICAgICAgICAgICAgICAgICAgLy9jb25zdHJ1Y3RvciwgdGhlIGNvbnRleHQgVVJMIHNjaGVtZSBzaG91bGQgYmUgaWdub3JlZAotICAgICAgICAgICAgICAgICAgICBiYXNlVXJpID0gKGJhc2VVcmkgPT0gbnVsbCkgPyAiZmlsZTovLy8iIDogYmFzZVVyaTsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoYmFzZVVyaSArIHN5c3RlbUlkKTsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbmV3IElucHV0U291cmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZCh1cmwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBYTUxVdGlscy5nZXRFbXB0eUlucHV0U291cmNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEZpbGUgZ2V0RmlsZUZyb21VUkkoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgICAgIGlmKHBhdGguc3RhcnRzV2l0aCgiZmlsZTovLy8iKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDgpOwotICAgICAgICAgICAgfSBlbHNlIGlmKHBhdGguc3RhcnRzV2l0aCgiZmlsZTovLyIpKXsKLSAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoNyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYocGF0aC5zdGFydHNXaXRoKCJmaWxlOi8iKSl7Ci0gICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKHBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFhtbFNjaGVtYVtdICBnZXRTY2hlbWFzKCkgewotICAgICAgICAgICAgcmV0dXJuIHNjaGVtYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFzKFhtbFNjaGVtYVtdIHNjaGVtYXMpIHsKLSAgICAgICAgICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VVcmkoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZVVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2VVcmkoU3RyaW5nIGJhc2VVcmkpIHsKLSAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IGJhc2VVcmk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBzY2hlbWEgaW50byBhIElucHV0U3RyZWFtCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzY2hlbWEKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0U2NoZW1hQXNJbnB1dFN0cmVhbShYbWxTY2hlbWEgc2NoZW1hKXsKLSAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgc2NoZW1hLndyaXRlKGJhb3MpOwotICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KLQotCi0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1hTRENvbmZpZy5qYXZhIGIvMV81L21vZHVsZXMveG1sYmVhbnMvc3JjL29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvWFNEQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTg0ZjcuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvc3JjL29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvWFNEQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyogQ1ZTIEhlYWRlcgotICAgJElkJAotICAgJExvZyQKLSovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1wdWJsaWMgY2xhc3MgWFNEQ29uZmlnIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MQkVBTlNfTlMgPSAiaHR0cDovL3htbC5hcGFjaGUub3JnL3htbGJlYW5zLzIwMDQvMDIveGJlYW4vY29uZmlnIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MQkVBTlNfUU5BTUVfTk9ERSA9ICJxbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTEJFQU5TX05TX05PREUgPSAibmFtZXNwYWNlIjsKLQotICAgIC8qKiBUaGUgcGFyc2VkIHhzZGNvbmZpZyBmaWxlICovCi0gICAgcHJpdmF0ZSBEb2N1bWVudCB4c2RDb25maWdEb2MgPSBudWxsOwotICAgIC8qKiBUaGUgbGlzdCBvZiBwcmVmaXhlcyBvbiB0aGUgZG9jdW1lbnQgcm9vdCAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBwcmVmaXhlc1RvVVJJTWFwcGluZ3MgPSBudWxsOwotICAgIC8qKiBUaGUgbGlzdCBvZiBzY2hlbWEgdHllcyB0byBKYXZhIGNsYXNzIG5hbWVzICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwIHFuYW1lc1RvSmF2YU5hbWVzTWFwcGluZ3MgPSBudWxsOwotICAgIC8qKiBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIEphdmEgcGFja2FnZSBuYW1lcyAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBuc1RvSmF2YVBhY2thZ2VzTWFwID0gbnVsbDsKLSAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgd2UgaGF2ZSBhbnkgUU5hbWUgdG8gSmF2YSBjbGFzcyBuYW1lIG1hcHBpbmdzICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUU5hbWVUb0phdmFOYW1lTWFwcGluZ3MgPSBmYWxzZTsKLSAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgd2UgaGF2ZSBhbnkgbmFtZXNwYWNlIHRvIEphdmEgcGFja2FnZSBtYXBwaW5ncyAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc05hbWVzcGFjZVRvSmF2YVBhY2thZ2VNYXBwaW5ncyA9IGZhbHNlOwotCi0gICAgcHVibGljIFhTRENvbmZpZyhTdHJpbmcgeHNkQ29uZmlnRmlsZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQotICAgICAgICAgICAgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgUGFyc2VFcnJvckhhbmRsZXIoKSk7Ci0KLSAgICAgICAgICAgIHhzZENvbmZpZ0RvYyA9IGJ1aWxkZXIucGFyc2UobmV3IEZpbGUoeHNkQ29uZmlnRmlsZSkpOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBtYXBwaW5nIGZvciBhbGwgdGhlIG5hbWVzcGFjZXMgaW4gdGhlIGRvY3VtZW50Ci0gICAgICAgICAgICBwcmVmaXhlc1RvVVJJTWFwcGluZ3MgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSB4c2RDb25maWdEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBjKyspIHsKLSAgICAgICAgICAgICAgICAvKiBEbyB3ZSBoYXZlIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uPwotICAgICAgICAgICAgICAgICogeG1sbnM6bXY9InVybjp3ZWVnaWV0ZWNoOm1pbmVydmEiCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5pdGVtKGMpLmdldE5vZGVOYW1lKCkuaW5kZXhPZigieG1sbnM6IikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBhdHRyaWJ1dGVzLml0ZW0oYykuZ2V0Tm9kZU5hbWUoKS5zcGxpdCgiOiIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcHJlZml4IHRvIHVyaSBtYXBwaW5nIHRvIG91ciBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeGVzVG9VUklNYXBwaW5ncy5wdXQocGFydHNbMV0sIGF0dHJpYnV0ZXMuaXRlbShjKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBMb2FkIHVwIHRoZSBsaXN0IG9mIFFOYW1lIHRvIEphdmEgY2xhc3MgbmFtZSBtYXBwaW5ncwotICAgICAgICAgICAgcW5hbWVzVG9KYXZhTmFtZXNNYXBwaW5ncyA9IGdldFFOYW1lc1RvSmF2YU5hbWVzKCk7Ci0gICAgICAgICAgICBpZiAocW5hbWVzVG9KYXZhTmFtZXNNYXBwaW5ncy5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgIGhhc1FOYW1lVG9KYXZhTmFtZU1hcHBpbmdzID0gdHJ1ZTsKLQotICAgICAgICAgICAgLy8gTG9hZCB1cCB0aGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIEphdmEgcGFja2FnZXMgbWFwcGluZ3MKLSAgICAgICAgICAgIG5zVG9KYXZhUGFja2FnZXNNYXAgPSBnZXROYW1lc3BhY2VzVG9QYWNrYWdlcygpOwotICAgICAgICAgICAgaWYgKG5zVG9KYXZhUGFja2FnZXNNYXAuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICBoYXNOYW1lc3BhY2VUb0phdmFQYWNrYWdlTWFwcGluZ3MgPSB0cnVlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc2UpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpYWUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ocGNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHByZSBsb2FkZWQgc2NoZW1hIHR5cGVzIHRvIEphdmEgY2xhc3MgbmFtZXMgbWFwcGluZ3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgb2Ygc2NoZW1hIHR5cGVzIHRvIEphdmEgY2xhc3MgbmFtZXMgbWFwcGluZ3MgYXMgYXMgc3BlY2lmaWVkIGluIHRoZSB4c2Rjb25maWcKLSAgICAgKiAgICAgICAgIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIEhhc2hNYXAgZ2V0U2NoZW1hVHlwZXNUb0phdmFOYW1lcygpIHsKLSAgICAgICAgcmV0dXJuIHFuYW1lc1RvSmF2YU5hbWVzTWFwcGluZ3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJlIGxvYWRlZCBuYW1lc3BhY2UgdG8gSmF2YSBwYWNrYWdlIG1hcHBpbmdzLgotICAgICAqCi0gICAgICogQHJldHVybiBIYXNoTWFwIG9mIG5hbWVzcGFjZSB0byBKYXZhIHBhY2thZ2UgbWFwcGluZ3MgYXMgYXMgc3BlY2lmaWVkIGluIHRoZSB4c2Rjb25maWcgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSGFzaE1hcCBnZXROYW1lc3BhY2VzVG9KYXZhUGFja2FnZXMoKSB7Ci0gICAgICAgIHJldHVybiBuc1RvSmF2YVBhY2thZ2VzTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBzY2hlbWEgdHlwZXMgdG8gSmF2YSBjbGFzcyBuYW1lIG1hcHBpbmdzCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhhc2hNYXAgY29udGFpbmluZyB0aGUgc2NoZW1hIHR5cGVzIHRvIEphdmEgY2xhc3MgbmFtZSBtYXBwaW5ncyBhcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICogICAgICAgICB4c2Rjb25maWcgZmlsZS4gSWYgdGhlcmUgYXJlIG5vIG1hcHBpbmdzLCB0aGUgcmV0dXJuZWQgSGFzaE1hcCB3aWxsIGJlIGVtcHR5LgotICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBnZXRRTmFtZXNUb0phdmFOYW1lcygpIHsKLSAgICAgICAgSGFzaE1hcCBxbmFtZXNUb0phdmFOYW1lc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAgICAgLyogTG9vayBmb3IgYWxsIHRoZSA8eGI6cW5hbWUgLi4uIC8+IG5vZGVzIGFzIHRoZXNlIHNwZWNpZnkKLSAgICAgICAgKiB4bWwgc2NoZW1hIHR5cGVzIHRvIEphdmEgY2xhc3MgbWFwcGluZ3MuCi0gICAgICAgICogPHhiOnFuYW1lIG5hbWU9Im12Om1vZHVsZVR5cGUiIGphdmFuYW1lPSJNb2R1bGUiLz4KLSAgICAgICAgKi8KLSAgICAgICAgTm9kZUxpc3QgcW5hbWVOb2RlcyA9IHhzZENvbmZpZ0RvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTEJFQU5TX05TLCBYTUxCRUFOU19RTkFNRV9OT0RFKTsKLQotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHFuYW1lTm9kZXMuZ2V0TGVuZ3RoKCk7IGMrKykgewotICAgICAgICAgICAgTm9kZSBxbmFtZU5vZGUgPSBxbmFtZU5vZGVzLml0ZW0oYyk7Ci0KLSAgICAgICAgICAgIC8qIEluIHRoZSB4c2Rjb25maWcgZmlsZSB3ZSdsbCBnZXQgc2NoZW1hIHR5cGVzIHdpdGggYSBwcmVmaXggYW5kIG5vdCBhIHVyaS4KLSAgICAgICAgICAgICogPHhiOnFuYW1lIG5hbWU9Im12Om1vZHVsZVR5cGUiIGphdmFuYW1lPSJNb2R1bGUiLz4KLSAgICAgICAgICAgICogYnV0IFhNTEJlYW5zIHdpbGwgY2FsbCBCaW5kaW5nQ29uZmlnOjpsb29rdXBKYXZhbmFtZUZvclFOYW1lIHdpdGggYSBRTmFtZQotICAgICAgICAgICAgKiB3aGljaCBoYXMgYSBuYW1lc3BhY2UgdXJpIGFuZCBubyBwcmVmaXguCi0gICAgICAgICAgICAqIFNvIHdlJ2xsIHN0b3JlIHRoZSBmdWxseSBxdWFsaWZlZCBzY2hlbWEgdHlwZSBuYW1lIGluIHRoZSBtYXBwaW5nIGxpc3QuCi0gICAgICAgICAgICAqIGkuZS4gd2UgcGljayBpdCB1cCBmcm9tIHRoZSB4c2Rjb25maWcgZmlsZSBhczoKLSAgICAgICAgICAgICogbXY6bW9kdWxlVHlwZQotICAgICAgICAgICAgKiBidXQgd2UnbGwgc3RvcmUgaXQgYXMgdXJuOndlZWdpZXRlY2g6bWluZXJ2YTptb2R1bGVUeXBlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYVR5cGUgPSBxbmFtZU5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgibmFtZSIpLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUuaW5kZXhPZigiOiIpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgLy8gbXY6bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBzY2hlbWFUeXBlLnNwbGl0KCI6IilbMF07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IHNjaGVtYVR5cGUuc3BsaXQoIjoiKVsxXTsKLQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXhlc1RvVVJJTWFwcGluZ3MuY29udGFpbnNLZXkocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBhcyB1cm46d2VlZ2lldGVjaDptaW5lcnZhOm1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpcHJlZml4ZXNUb1VSSU1hcHBpbmdzLmdldChwcmVmaXgpICsgIjoiICsgbG9jYWxOYW1lOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCBtYXBwaW5nIG5vdyBmcm9tIHNjaGVtYSB0eXBlcyB0byBKYXZhIGNsYXNzIG5hbWVzCi0gICAgICAgICAgICAgICAgICAgIHFuYW1lc1RvSmF2YU5hbWVzTWFwLnB1dChrZXksIHFuYW1lTm9kZS5nZXRBdHRyaWJ1dGVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZWRJdGVtKCJqYXZhbmFtZSIpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcW5hbWVzVG9KYXZhTmFtZXNNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIG5hbWVzcGFjZSB0byBKYXZhIHBhY2thZ2UgbWFwcGluZ3MKLSAgICAgKgotICAgICAqIEByZXR1cm4gSGFzaE1hcCBjb250YWluaW5nIHRoZSBuYW1lc3BhY2UgdG8gSmF2YSBwYWNrYWdlIG1hcHBpbmdzIGFzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAgKiAgICAgICAgIHhzZGNvbmZpZyBmaWxlLiBJZiB0aGVyZSBhcmUgbm8gbWFwcGluZ3MsIHRoZSByZXR1cm5lZCBIYXNoTWFwIHdpbGwgYmUgZW1wdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGdldE5hbWVzcGFjZXNUb1BhY2thZ2VzKCkgewotICAgICAgICBIYXNoTWFwIG5zVG9KYXZhUGFja2FnZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIC8qIExvb2sgZm9yIGFsbCB0aGUgPHhiOm5hbWVzcGFjZSAuLi4gLz4gbm9kZXMgYXMgdGhlc2Ugc3BlY2lmeQotICAgICAgICAqIHhtbCBuYW1lc3BhY2UgdG8gSmF2YSBwYWNrYWdlIG1hcHBpbmdzLgotICAgICAgICAqIDx4YjpxbmFtZSBuYW1lPSJtdjptb2R1bGVUeXBlIiBqYXZhbmFtZT0iTW9kdWxlIi8+Ci0gICAgICAgICovCi0gICAgICAgIE5vZGVMaXN0IG5zTm9kZXMgPSB4c2RDb25maWdEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxCRUFOU19OUywgWE1MQkVBTlNfTlNfTk9ERSk7Ci0KLSAgICAgICAgZm9yIChpbnQgbnNOb2Rlc0NvdW50ID0gMDsgbnNOb2Rlc0NvdW50IDwgbnNOb2Rlcy5nZXRMZW5ndGgoKTsgbnNOb2Rlc0NvdW50KyspIHsKLSAgICAgICAgICAgIE5vZGUgbnNOb2RlID0gbnNOb2Rlcy5pdGVtKG5zTm9kZXNDb3VudCk7Ci0KLSAgICAgICAgICAgIC8vIFdoYXQncyB0aGUgY3VycmVudCBuYW1lc3BhY2U/Ci0gICAgICAgICAgICBTdHJpbmcgdXJpID0gbnNOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oInVyaSIpLmdldE5vZGVWYWx1ZSgpOwotCi0gICAgICAgICAgICAvLyBHZXQgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHVyaQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgICAgICAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBuc05vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgY2hpbGROb2Rlc0NvdW50ID0gMDsgY2hpbGROb2Rlc0NvdW50IDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgY2hpbGROb2Rlc0NvdW50KyspIHsKLSAgICAgICAgICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IGNoaWxkTm9kZXMuaXRlbShjaGlsZE5vZGVzQ291bnQpOwotICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuZ2V0TG9jYWxOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLmdldExvY2FsTmFtZSgpLmVxdWFscygicGFja2FnZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IGNoaWxkTm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBuYW1lc3BhY2UgdXJpIHRvIEphdmEgcGFja2FnZSBtYXBwaW5nCi0gICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG5zVG9KYXZhUGFja2FnZXNNYXAucHV0KHVyaSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5zVG9KYXZhUGFja2FnZXNNYXA7Ci0gICAgfQotCi0gICAgY2xhc3MgUGFyc2VFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihleGNlcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvc3JjL29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvdGVtcGxhdGUvWG1sYmVhbnNEYXRhYmluZGluZ1RlbXBsYXRlLnhzbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3NyYy9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL3RlbXBsYXRlL1htbGJlYW5zRGF0YWJpbmRpbmdUZW1wbGF0ZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGQwZDkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvc3JjL29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvdGVtcGxhdGUvWG1sYmVhbnNEYXRhYmluZGluZ1RlbXBsYXRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi08IS0tDQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gIH4NCi0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICB+DQotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuDQotICAtLT4NCi0NCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+DQotICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0idGV4dCIvPg0KLQ0KLSAgICA8eHNsOmtleSBuYW1lPSJwYXJhbXNJbiIgbWF0Y2g9Ii8vZGF0YWJpbmRlcnMvcGFyYW1bQGRpcmVjdGlvbj0naW4nXSIgdXNlPSJAdHlwZSIvPg0KLSAgICA8eHNsOmtleSBuYW1lPSJwYXJhbXNPdXQiIG1hdGNoPSIvL2RhdGFiaW5kZXJzL3BhcmFtW0BkaXJlY3Rpb249J291dCddIiB1c2U9IkB0eXBlIi8+DQotICAgIDx4c2w6a2V5IG5hbWU9ImlubmVyUGFyYW1zIiBtYXRjaD0iLy9kYXRhYmluZGVycy9wYXJhbVtAZGlyZWN0aW9uPSdpbiddL3BhcmFtIiB1c2U9IkBwYXJ0bmFtZSIvPg0KLQ0KLSAgICA8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgLS0+DQotICAgIDwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIHhtbGJlYW5zIHRlbXBsYXRlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAtLT4NCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZGF0YWJpbmRlcnNbQGRidHlwZT0neG1sYmVhbnMnXSI+DQotICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNlcnZlcnNpZGUiIHNlbGVjdD0iQGlzc2VydmVyc2lkZSIvPg0KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlNjQiIHNlbGVjdD0iYmFzZTY0RWxlbWVudHMvbmFtZSIvPg0KLSAgICAgICAgPHhzbDppZiB0ZXN0PSIkYmFzZTY0Ij4NCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lW10gcU5hbWVBcnJheSA9IHsNCi0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iYmFzZTY0RWxlbWVudHMvbmFtZSI+DQotICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKT4xIj4sPC94c2w6aWY+bmV3IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUoIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbnMtdXJsIi8+IiwiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsb2NhbE5hbWUiLz4iKQ0KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICAgIH07DQotICAgICAgICA8L3hzbDppZj4NCi0NCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJwYXJhbVtub3QoQHR5cGUgPSBwcmVjZWRpbmctc2libGluZzo6cGFyYW0vQHR5cGUpIGFuZCBAdHlwZSE9JyddIj4NCi0NCi0gICAgICAgICAgICBwcml2YXRlICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCAgdG9PTSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KQ0KLSAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsNCi0NCi0gICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRiYXNlNjQiPg0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpbWl6ZUNvbnRlbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuYnVpbGRlci5TdEFYT01CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgb3JnLmFwYWNoZS5heGlvbS5vbS5pbXBsLmJ1aWxkZXIuU3RBWE9NQnVpbGRlcg0KLSAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NQWJzdHJhY3RGYWN0b3J5LmdldE9NRmFjdG9yeSgpLG5ldyBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuU3RyZWFtV3JhcHBlcihwYXJhbS5uZXdYTUxTdHJlYW1SZWFkZXIoKSkpIDsNCi0gICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCBkb2N1bWVudEVsZW1lbnQgPSBidWlsZGVyLmdldERvY3VtZW50RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplQ29udGVudChkb2N1bWVudEVsZW1lbnQscU5hbWVBcnJheSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgKChvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwuT01Ob2RlRXgpZG9jdW1lbnRFbGVtZW50KS5zZXRQYXJlbnQobnVsbCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b09NKHBhcmFtKTsNCi0gICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvT00ocGFyYW0pOw0KLSAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50IHRvT00oZmluYWwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+IHBhcmFtKQ0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0IHsNCi0NCi0gICAgICAgICAgICAgICAgZmluYWwgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXIgeG1sUmVhZGVyID0gcGFyYW0ubmV3WE1MU3RyZWFtUmVhZGVyKCk7DQotICAgICAgICAgICAgICAgIHdoaWxlICgheG1sUmVhZGVyLmlzU3RhcnRFbGVtZW50KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgeG1sUmVhZGVyLm5leHQoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTURhdGFTb3VyY2Ugb21EYXRhU291cmNlID0gbmV3IG9yZy5hcGFjaGUuYXhpb20ub20uT01EYXRhU291cmNlKCkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKGphdmEuaW8uT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgb3JnLmFwYWNoZS5heGlvbS5vbS5PTU91dHB1dEZvcm1hdCBvbU91dHB1dEZvcm1hdCkNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMgeG1sT3B0aW9ucyA9IG5ldyBvcmcuYXBhY2hlLnhtbGJlYW5zLlhtbE9wdGlvbnMoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2F2ZShvdXRwdXRTdHJlYW0seG1sT3B0aW9ucy5zZXRTYXZlTm9YbWxEZWNsKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24oIlByb2JsZW0gd2l0aCBzYXZpbmcgZG9jdW1lbnQiLGUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShqYXZhLmlvLldyaXRlciB3cml0ZXIsIG9yZy5hcGFjaGUuYXhpb20ub20uT01PdXRwdXRGb3JtYXQgb21PdXRwdXRGb3JtYXQpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIHhtbE9wdGlvbnMgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNhdmUod3JpdGVyLHhtbE9wdGlvbnMuc2V0U2F2ZU5vWG1sRGVjbCgpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggc2F2aW5nIGRvY3VtZW50IixlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXIgeG1sU3RyZWFtV3JpdGVyKQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb24gew0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NWE1MU3RyZWFtV3JpdGVyIG10b214bWxTdHJlYW1Xcml0ZXIgPQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5hcGFjaGUuYXhpb20ub20uaW1wbC5NVE9NWE1MU3RyZWFtV3JpdGVyKSB4bWxTdHJlYW1Xcml0ZXI7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zIHhtbE9wdGlvbnMgPSBuZXcgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPcHRpb25zKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNhdmUobXRvbXhtbFN0cmVhbVdyaXRlci5nZXRPdXRwdXRTdHJlYW0oKSx4bWxPcHRpb25zLnNldFNhdmVOb1htbERlY2woKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10b214bWxTdHJlYW1Xcml0ZXIuZ2V0T3V0cHV0U3RyZWFtKCkuZmx1c2goKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uKCJQcm9ibGVtIHdpdGggc2F2aW5nIGRvY3VtZW50IiwgZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyIGdldFJlYWRlcigpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLm5ld1hNTFN0cmVhbVJlYWRlcigpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9Ow0KLSAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICByZXR1cm4gIG5ldyBvcmcuYXBhY2hlLmF4aW9tLm9tLmltcGwubGxvbS5PTVNvdXJjZWRFbGVtZW50SW1wbCh4bWxSZWFkZXIuZ2V0TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20ub20uT01BYnN0cmFjdEZhY3RvcnkuZ2V0T01GYWN0b3J5KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgb21EYXRhU291cmNlKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0NCi0NCi0gICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJvcG5hbWVzL25hbWUiPg0KLQ0KLSAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3BuYW1lIiBzZWxlY3Q9Ii4iLz4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9Im9wbnN1cmkiIHNlbGVjdD0iQG9wbnN1cmkiLz4NCi0gICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtY291bnQiIHNlbGVjdD0iY291bnQoLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0pIi8+DQotICAgICAgICAgICAgIDwhLS0gZ2V0IHRoZSBvcG5hbWUgY2FwaXRhbGl6ZWQgLS0+DQotICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJvcG5hbWVDYXBpdGFsaXplZCIgc2VsZWN0PSJjb25jYXQodHJhbnNsYXRlKHN1YnN0cmluZygkb3BuYW1lLCAxLCAxICksJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JywgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyApLCBzdWJzdHJpbmcoJG9wbmFtZSwgMiwgc3RyaW5nLWxlbmd0aCgkb3BuYW1lKSkpIj48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdCgkc2VydmVyc2lkZSkiPg0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkcGFyYW1jb3VudCAmZ3Q7IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50IiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50U2hvcnRUeXBlIiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0BzaG9ydHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5wdXRFbGVtZW50Q29tcGxleFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQGNvbXBsZXh0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9IndyYXBwZWRQYXJhbWV0ZXJDb3VudCIgc2VsZWN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSkiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iZ2VuZXJhdGUtaWQoJGlucHV0RWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ3BhcmFtc0luJywgJGlucHV0RWxlbWVudFR5cGUpWzFdKSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHdyYXBwZWRQYXJhbWV0ZXJDb3VudCAmZ3Q7IDAiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnZW5lYXRlIHRoZSB0b0VudmVsb3BlIG1ldGhvZC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gcGFyYW08eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPiwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiBkdW1teVdyYXBwZWRUeXBlLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdHsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPiB3cmFwcGVkVHlwZSA9IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRFbGVtZW50VHlwZSIvPi5GYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic3RyaW5nLWxlbmd0aChub3JtYWxpemUtc3BhY2UoJGlucHV0RWxlbWVudENvbXBsZXhUeXBlKSkgPiAwIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIvPiBpbm5lclR5cGUgPSB3cmFwcGVkVHlwZS5hZGROZXc8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkaW5wdXRFbGVtZW50U2hvcnRUeXBlLCdEb2N1bWVudCcpIi8+KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dEVsZW1lbnRUeXBlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRpbnB1dEVsZW1lbnRTaG9ydFR5cGUsJ0RvY3VtZW50JykiLz4gaW5uZXJUeXBlID0gd3JhcHBlZFR5cGUuYWRkTmV3PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0RWxlbWVudFNob3J0VHlwZSwnRG9jdW1lbnQnKSIvPigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9wYXJhbSI+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlLnhzZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+QXJyYXkocGFyYW08eHNsOnZhbHVlLW9mIHNlbGVjdD0icG9zaXRpb24oKSIvPik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJUeXBlLnhzZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhcnRuYW1lIi8+KHBhcmFtPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBvc2l0aW9uKCkiLz4pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIGVudmVsb3BlID0gZmFjdG9yeS5nZXREZWZhdWx0RW52ZWxvcGUoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZCh0b09NKHdyYXBwZWRUeXBlLCBvcHRpbWl6ZUNvbnRlbnQpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZlbG9wZTsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFzc3VtcHRpb24gLSB0aGUgcGFyYW1ldGVyIGlzIGFsd2F5cyBhbiBYTUxCZWFucyAtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSB0b0VudmVsb3BlKG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRmFjdG9yeSBmYWN0b3J5LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0RWxlbWVudFR5cGUiLz4gcGFyYW0sIGJvb2xlYW4gb3B0aW1pemVDb250ZW50KQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIG9yZy5hcGFjaGUuYXhpczIuQXhpc0ZhdWx0ew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBFbnZlbG9wZSBlbnZlbG9wZSA9IGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZlbG9wZS5nZXRCb2R5KCkuYWRkQ2hpbGQodG9PTShwYXJhbSwgb3B0aW1pemVDb250ZW50KSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEbyBub3RoaW5nIGhlcmUgLS0+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgICAgICA8IS0tIHRoaXMgcGllY2Ugb2YgbG9naWMgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIG9ubHkgZm9yIHRoZSBzZXJ2ZXIgc2lkZS0tPg0KLSAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iJHNlcnZlcnNpZGUiPg0KLQ0KLQ0KLSAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0pPTEiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0RWxlbWVudCIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J291dCcgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ib3V0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdvdXQnIGFuZCBAb3BuYW1lPSRvcG5hbWVdL0B0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFzc3VtcHRpb24gLSBUaGlzIGlzIGFuIFhNTEJlYW5zIGVsZW1lbnQtLT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImdlbmVyYXRlLWlkKCRvdXRFbGVtZW50KSA9IGdlbmVyYXRlLWlkKGtleSgncGFyYW1zT3V0JywgJG91dEVsZW1lbnRUeXBlKVsxXSkiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgdG9FbnZlbG9wZShvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEZhY3RvcnkgZmFjdG9yeSwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0nb3V0JyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AdHlwZSIvPiBwYXJhbSwgYm9vbGVhbiBvcHRpbWl6ZUNvbnRlbnQpDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdCB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUuYXhpb20uc29hcC5TT0FQRW52ZWxvcGUgZW52ZWxvcGUgPSBmYWN0b3J5LmdldERlZmF1bHRFbnZlbG9wZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0gIT0gbnVsbCl7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlLmdldEJvZHkoKS5hZGRDaGlsZCh0b09NKHBhcmFtLCBvcHRpbWl6ZUNvbnRlbnQpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW52ZWxvcGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4NCi0NCi0gICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+DQotICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4NCi0gICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudCguLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXSk9MSI+DQotICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlIHRoZSBnZXQgbWV0aG9kcyAtLT4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnQiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0iPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFR5cGUiIHNlbGVjdD0iLi4vLi4vcGFyYW1bQHR5cGUhPScnIGFuZCBAZGlyZWN0aW9uPSdpbicgYW5kIEBvcG5hbWU9JG9wbmFtZV0vQHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLSAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImlucHV0RWxlbWVudFNob3J0VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9Ac2hvcnR0eXBlIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJpbnB1dEVsZW1lbnRDb21wbGV4VHlwZSIgc2VsZWN0PSIuLi8uLi9wYXJhbVtAdHlwZSE9JycgYW5kIEBkaXJlY3Rpb249J2luJyBhbmQgQG9wbmFtZT0kb3BuYW1lXS9AY29tcGxleHR5cGUiPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgICAgICAgICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4uLy4uL3BhcmFtW0B0eXBlIT0nJyBhbmQgQGRpcmVjdGlvbj0naW4nIGFuZCBAb3BuYW1lPSRvcG5hbWVdL3BhcmFtIj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcmFtRWxlbWVudCIgc2VsZWN0PSIuIj48L3hzbDp2YXJpYWJsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhcnROYW1lIiBzZWxlY3Q9IkBwYXJ0bmFtZSI+PC94c2w6dmFyaWFibGU+DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIoZ2VuZXJhdGUtaWQoJHBhcmFtRWxlbWVudCkgPSBnZW5lcmF0ZS1pZChrZXkoJ2lubmVyUGFyYW1zJywgJHBhcnROYW1lKVsxXSkpIG9yDQotICAgICAgICAgICAgICAgICAgICAgICAgKGdlbmVyYXRlLWlkKCRpbnB1dEVsZW1lbnQpID0gZ2VuZXJhdGUtaWQoa2V5KCdwYXJhbXNJbicsICRpbnB1dEVsZW1lbnRUeXBlKVsxXSkpIj4NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHR5cGUiLz4gZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYXJ0bmFtZSIvPigNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0B0eXBlIi8+IHdyYXBwZWRUeXBlKXsNCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGVyZSBpcyBub3QgZGlmZmVyZW5jZSBiZXR3ZWUgaGF2aW5nIGEgc2VwZXJhdGUgY29tcGxleCB0eXBlIGFuZCB0aGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZSBjb21wbGV4IHR5cGUgaW1wbGVtZW50YXRpb24gLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJAYXJyYXkiPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0RWxlbWVudFNob3J0VHlwZSwnRG9jdW1lbnQnKSIvPigpLnhnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcnROYW1lIi8+QXJyYXkoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZFR5cGUuZ2V0PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJGlucHV0RWxlbWVudFNob3J0VHlwZSwnRG9jdW1lbnQnKSIvPigpLnhnZXQ8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcnROYW1lIi8+KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0gICAgICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICAgICAgPC94c2w6aWY+DQotICAgICAgICA8L3hzbDpmb3ItZWFjaD4NCi0NCi0NCi0gICAgICAgIC8qKg0KLSAgICAgICAgKiAgZ2V0IHRoZSBkZWZhdWx0IGVudmVsb3BlDQotICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBvcmcuYXBhY2hlLmF4aW9tLnNvYXAuU09BUEVudmVsb3BlIHRvRW52ZWxvcGUob3JnLmFwYWNoZS5heGlvbS5zb2FwLlNPQVBGYWN0b3J5IGZhY3Rvcnkpew0KLSAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0RGVmYXVsdEVudmVsb3BlKCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgb3JnLmFwYWNoZS54bWxiZWFucy5YbWxPYmplY3QgZnJvbU9NKA0KLSAgICAgICAgb3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgcGFyYW0sDQotICAgICAgICBqYXZhLmxhbmcuQ2xhc3MgdHlwZSwNCi0gICAgICAgIGphdmEudXRpbC5NYXAgZXh0cmFOYW1lc3BhY2VzKSB0aHJvd3Mgb3JnLmFwYWNoZS5heGlzMi5BeGlzRmF1bHR7DQotICAgICAgICB0cnl7DQotICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0icGFyYW1bQHR5cGUhPScnIGFuZCBub3QoQHByaW1pdGl2ZSldIj4NCi0NCi0gICAgICAgICAgICBpZiAoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+LmNsYXNzLmVxdWFscyh0eXBlKSl7DQotICAgICAgICAgICAgaWYgKGV4dHJhTmFtZXNwYWNlcyE9bnVsbCl7DQotICAgICAgICAgICAgcmV0dXJuIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdHlwZSIvPi5GYWN0b3J5LnBhcnNlKA0KLSAgICAgICAgICAgIHBhcmFtLmdldFhNTFN0cmVhbVJlYWRlcldpdGhvdXRDYWNoaW5nKCksDQotICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUueG1sYmVhbnMuWG1sT3B0aW9ucygpLnNldExvYWRBZGRpdGlvbmFsTmFtZXNwYWNlcyhleHRyYU5hbWVzcGFjZXMpKTsNCi0gICAgICAgICAgICB9ZWxzZXsNCi0gICAgICAgICAgICByZXR1cm4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0eXBlIi8+LkZhY3RvcnkucGFyc2UoDQotICAgICAgICAgICAgcGFyYW0uZ2V0WE1MU3RyZWFtUmVhZGVyV2l0aG91dENhY2hpbmcoKSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgfWNhdGNoKGphdmEubGFuZy5FeGNlcHRpb24gZSl7DQotICAgICAgICB0aHJvdyBvcmcuYXBhY2hlLmF4aXMyLkF4aXNGYXVsdC5tYWtlRmF1bHQoZSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIDwhLS0gR2VuZXJhdGUgdGhlIGJhc2UgNjQgb3B0aW1pemUgbWV0aG9kcyBvbmx5IGlmIHRoZSBiYXNlNjQgaXRlbXMgYXJlIHByZXNlbnQgLS0+DQotICAgICAgICA8eHNsOmlmIHRlc3Q9IiRiYXNlNjQiPg0KLQ0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBvcHRpbWl6ZUNvbnRlbnQob3JnLmFwYWNoZS5heGlvbS5vbS5PTUVsZW1lbnQgZWxlbWVudCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZVtdIHFOYW1lcyl7DQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBxTmFtZXMubGVuZ3RoOyBpKyspIHsNCi0gICAgICAgICAgICBtYXJrRWxlbWVudHNBc09wdGltaXplZChxTmFtZXNbaV0sZWxlbWVudCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgbWFya0VsZW1lbnRzQXNPcHRpbWl6ZWQoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxTmFtZSxvcmcuYXBhY2hlLmF4aW9tLm9tLk9NRWxlbWVudCByb290RWx0KXsNCi0gICAgICAgICAgICBpZiAocm9vdEVsdC5nZXRRTmFtZSgpLmVxdWFscyhxTmFtZSkpew0KLSAgICAgICAgICAgIC8vZ2V0IHRoZSB0ZXh0IG5vZGUgYW5kIG1hcmsgaXQNCi0gICAgICAgICAgICBvcmcuYXBhY2hlLmF4aW9tLm9tLk9NTm9kZSBub2RlID0gcm9vdEVsdC5nZXRGaXJzdE9NQ2hpbGQoKTsNCi0gICAgICAgICAgICBpZiAobm9kZS5nZXRUeXBlKCk9PW9yZy5hcGFjaGUuYXhpb20ub20uT01Ob2RlLlRFWFRfTk9ERSl7DQotICAgICAgICAgICAgKChvcmcuYXBhY2hlLmF4aW9tLm9tLk9NVGV4dClub2RlKS5zZXRPcHRpbWl6ZSh0cnVlKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGphdmEudXRpbC5JdGVyYXRvciBjaGlsZEVsZW1lbnRzID0gcm9vdEVsdC5nZXRDaGlsZEVsZW1lbnRzKCk7DQotICAgICAgICAgICAgd2hpbGUgKGNoaWxkRWxlbWVudHMuaGFzTmV4dCgpKSB7DQotICAgICAgICAgICAgbWFya0VsZW1lbnRzQXNPcHRpbWl6ZWQocU5hbWUsKG9yZy5hcGFjaGUuYXhpb20ub20uT01FbGVtZW50KWNoaWxkRWxlbWVudHMubmV4dCgpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgPC94c2w6aWY+DQotICAgIDwveHNsOnRlbXBsYXRlPg0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvQm9va1F1b3RlLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9Cb29rUXVvdGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlODRkZS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9Cb29rUXVvdGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zOm1oPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUiCi0gICAgICAgICAgICAgeG1sbnM6dHlwZXM9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUveHNkIiBuYW1lPSJCb29rUXVvdGUiPgotICAgIDx0eXBlcz4KLSAgICA8eHNkOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUveHNkIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmYXVsdEVsZW1lbnQiIHR5cGU9InhzZDphbnlUeXBlIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3R5cGVzPgotCTxtZXNzYWdlIG5hbWU9IkJvb2tRdW90ZV9nZXRCb29rUHJpY2UiPgotCQk8cGFydCBuYW1lPSJpc2JuIiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotCQk8cGFydCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iQm9va1F1b3RlX2dldEJvb2tQcmljZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6YW55VHlwZSIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJJbnZhbGlkSXNibkZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0ibWVzc2FnZSIgZWxlbWVudD0idHlwZXM6ZmF1bHRFbGVtZW50Ii8+Ci0JPC9tZXNzYWdlPgotCTxwb3J0VHlwZSBuYW1lPSJCb29rUXVvdGUiPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0ibWg6Qm9va1F1b3RlX2dldEJvb2tQcmljZSIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlUmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJJbnZhbGlkSXNibkZhdWx0IiBtZXNzYWdlPSJtaDpJbnZhbGlkSXNibkZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCQk8b3BlcmF0aW9uIG5hbWU9ImdldEJvb2tQcmljZU5vblJvYnVzdCI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0ibWg6Qm9va1F1b3RlX2dldEJvb2tQcmljZSIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlUmVzcG9uc2UiLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQk8YmluZGluZyBuYW1lPSJCb29rUXVvdGVCaW5kaW5nIiB0eXBlPSJtaDpCb29rUXVvdGUiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJteUFjdGlvbiIvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQgbmFtZT0iSW52YWxpZElzYm5GYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgkKLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlTm9uUm9idXN0Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJteUFjdGlvbjIiLz4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLQkJCTwvb3V0cHV0PgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0JPHNlcnZpY2UgbmFtZT0iQm9va1F1b3RlU2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IkJvb2tRdW90ZVBvcnQiIGJpbmRpbmc9Im1oOkJvb2tRdW90ZUJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZVNlcnZpY2UiLz4KLQkJPC9wb3J0PgotCTwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9Cb29rUXVvdGUyLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9Cb29rUXVvdGUyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWUwMDMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvQm9va1F1b3RlMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6bWg9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUiCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLSAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgICAgICB4bWxuczp0eXBlcz0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS94c2QiCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlIgotICAgICAgICAgICAgIG5hbWU9IkJvb2tRdW90ZSI+Ci0gICAgPHR5cGVzPgotICAgIDx4c2Q6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS94c2QiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZhdWx0RWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNjaGVtYT4KLSAgPC90eXBlcz4KLQk8bWVzc2FnZSBuYW1lPSJCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIj4KLQkJPHBhcnQgbmFtZT0iaXNibiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQk8cGFydCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iQm9va1F1b3RlX2dldEJvb2tQcmljZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icmVzdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9IkludmFsaWRJc2JuRmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJtZXNzYWdlIiBlbGVtZW50PSJ0eXBlczpmYXVsdEVsZW1lbnQiLz4KLQk8L21lc3NhZ2U+Ci0JPHBvcnRUeXBlIG5hbWU9IkJvb2tRdW90ZSI+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIi8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSIvPgotCQkJPGZhdWx0IG5hbWU9IkludmFsaWRJc2JuRmF1bHQiIG1lc3NhZ2U9Im1oOkludmFsaWRJc2JuRmF1bHQiLz4KLQkJPC9vcGVyYXRpb24+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZ2V0Qm9va1ByaWNlTm9uUm9idXN0Ij4KLQkJCTxpbnB1dCBtZXNzYWdlPSJtaDpCb29rUXVvdGVfZ2V0Qm9va1ByaWNlIi8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9Im1oOkJvb2tRdW90ZV9nZXRCb29rUHJpY2VSZXNwb25zZSIvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxiaW5kaW5nIG5hbWU9IkJvb2tRdW90ZUJpbmRpbmciIHR5cGU9Im1oOkJvb2tRdW90ZSI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRCb29rUHJpY2UiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Im15QWN0aW9uIi8+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5Nb25zb24tSGFlZmVsLmNvbS9qd3Nib29rL0Jvb2tRdW90ZS9Cb29rUXVvdGUiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJJbnZhbGlkSXNibkZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdCBuYW1lPSJJbnZhbGlkSXNibkZhdWx0IiB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+CQotCQk8L29wZXJhdGlvbj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRCb29rUHJpY2VOb25Sb2J1c3QiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Im15QWN0aW9uMiIvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuTW9uc29uLUhhZWZlbC5jb20vandzYm9vay9Cb29rUXVvdGUvQm9va1F1b3RlIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlL0Jvb2tRdW90ZSIvPgotCQkJPC9vdXRwdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8c2VydmljZSBuYW1lPSJCb29rUXVvdGVTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iQm9va1F1b3RlUG9ydCIgYmluZGluZz0ibWg6Qm9va1F1b3RlQmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3Lk1vbnNvbi1IYWVmZWwuY29tL2p3c2Jvb2svQm9va1F1b3RlU2VydmljZSIvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL0ludGVyb3BUZXN0LndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9JbnRlcm9wVGVzdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFlMjg1Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL0ludGVyb3BUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gVGhpcyBXU0RMIGZpbGUgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgSW50ZXJvcFRlc3Qud3NkbCAtLT4KLTwhLS0gYW5kIEludGVyb3BUZXN0Mi53c2RsIGZpbGVzIGZyb20gV2hpdGUgTWVzYSAtLT4KLTxkZWZpbml0aW9ucyBuYW1lPSJJbnRlcm9wVGVzdCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHhtbG5zOnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eG1sLXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCI+Ci0KLSAgICA8IS0tIFRoZXNlIGFyZSB0aGUgdHlwZXMgZGVmaW5lZCBmb3IgUm91bmQgMiBBIGFuZCBCIC0tPgotICAgIDwhLS0gVGhlc2UgdHlwZXMgd2VyZSBjb3BpZWQgZnJvbSB3aGl0ZSBtZXNhIEludGVyb3BUZXN0LndzZGwvSW50ZXJvcFRlc3RCLndzZGwgLS0+Ci0gICAgPHR5cGVzPgotICAgICAgICA8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCI+Ci0gICAgICAgICAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mc3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJTT0FQLUVOQzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0iU09BUC1FTkM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0ic3RyaW5nW10iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9maW50Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJTT0FQLUVOQzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0iU09BUC1FTkM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0iaW50W10iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mZmxvYXQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9IlNPQVAtRU5DOkFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgcmVmPSJTT0FQLUVOQzphcnJheVR5cGUiIHdzZGw6YXJyYXlUeXBlPSJmbG9hdFtdIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZlNPQVBTdHJ1Y3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9IlNPQVAtRU5DOkFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgcmVmPSJTT0FQLUVOQzphcnJheVR5cGUiIHdzZGw6YXJyYXlUeXBlPSJzOlNPQVBTdHJ1Y3RbXSIvPgotICAgICAgICAgICAgICAgICAgICA8L3Jlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwvY29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICAgICAgICAgIDxhbGw+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0iaW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJmbG9hdCIvPgotICAgICAgICAgICAgICAgIDwvYWxsPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0U3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8YWxsPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9ImludCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0iZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RydWN0IiB0eXBlPSJzOlNPQVBTdHJ1Y3QiLz4KLSAgICAgICAgICAgICAgICA8L2FsbD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUEFycmF5U3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8YWxsPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9ImludCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0iZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyQXJyYXkiIHR5cGU9InM6QXJyYXlPZnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvYWxsPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mU3RyaW5nMkQiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9IlNPQVAtRU5DOkFycmF5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgcmVmPSJTT0FQLUVOQzphcnJheVR5cGUiIHdzZGw6YXJyYXlUeXBlPSJ4c2Q6c3RyaW5nWyxdIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mTWFwIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJTT0FQLUVOQzpBcnJheSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0iU09BUC1FTkM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0ieG1sLXNvYXA6TWFwW10iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgPC9zY2hlbWE+Ci0gICAgPC90eXBlcz4KLQotICAgIDwhLS0gbWVzc2FnZSwgcG9ydFR5cGUgYW5kIGJpbmRpbmcgZm9yIFJvdW5kIDIgdGVzdHMgLS0+Ci0gICAgPCEtLSBDb3BpZWQgZnJvbSB3aGl0ZSBtZXNhIEludGVyb3BUZXN0LndzZGwgLS0+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0U3RyaW5nQXJyYXkiIHR5cGU9InM6QXJyYXlPZnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0iczpBcnJheU9mc3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9JbnRlZ2VyUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0SW50ZWdlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50ZWdlclJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9JbnRlZ2VyQXJyYXlSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRJbnRlZ2VyQXJyYXkiIHR5cGU9InM6QXJyYXlPZmludCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50ZWdlckFycmF5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InM6QXJyYXlPZmludCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRmxvYXRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9GbG9hdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0Zsb2F0QXJyYXlSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRGbG9hdEFycmF5IiB0eXBlPSJzOkFycmF5T2ZmbG9hdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRmxvYXRBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOkFycmF5T2ZmbG9hdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RydWN0UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0U3RydWN0IiB0eXBlPSJzOlNPQVBTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOlNPQVBTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdEFycmF5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0U3RydWN0QXJyYXkiIHR5cGU9InM6QXJyYXlPZlNPQVBTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdEFycmF5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InM6QXJyYXlPZlNPQVBTdHJ1Y3QiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1ZvaWRSZXF1ZXN0Ii8+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSIvPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9CYXNlNjRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRCYXNlNjQiIHR5cGU9InhzZDpiYXNlNjRCaW5hcnkiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0Jhc2U2NFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9EYXRlUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9EYXRlUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpkYXRlVGltZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSGV4QmluYXJ5UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0SGV4QmluYXJ5IiB0eXBlPSJ4c2Q6aGV4QmluYXJ5Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9IZXhCaW5hcnlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmhleEJpbmFyeSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRGVjaW1hbFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dERlY2ltYWwiIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9EZWNpbWFsUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpkZWNpbWFsIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Cb29sZWFuUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0Qm9vbGVhbiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob0Jvb2xlYW5SZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8IS0tIG1lc3NhZ2VzIGZvciBSb3VuZCAyQiB0ZXN0cyAtLT4KLSAgICA8IS0tIENvcGllZCBmcm9tIHdoaXRlIG1lc2EgSW50ZXJvcFRlc3RCLndzZGwgLS0+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRTdHJ1Y3QiIHR5cGU9InM6U09BUFN0cnVjdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RydWN0QXNTaW1wbGVUeXBlc1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0ib3V0cHV0U3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgIDxwYXJ0IG5hbWU9Im91dHB1dEludGVnZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPHBhcnQgbmFtZT0ib3V0cHV0RmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dEludGVnZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TaW1wbGVUeXBlc0FzU3RydWN0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InM6U09BUFN0cnVjdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvMkRTdHJpbmdBcnJheVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dDJEU3RyaW5nQXJyYXkiIHR5cGU9InM6QXJyYXlPZlN0cmluZzJEIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG8yRFN0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InM6QXJyYXlPZlN0cmluZzJEIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9OZXN0ZWRTdHJ1Y3RSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRTdHJ1Y3QiIHR5cGU9InM6U09BUFN0cnVjdFN0cnVjdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InM6U09BUFN0cnVjdFN0cnVjdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTmVzdGVkQXJyYXlSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRTdHJ1Y3QiIHR5cGU9InM6U09BUEFycmF5U3RydWN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9OZXN0ZWRBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOlNPQVBBcnJheVN0cnVjdCIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NYXBSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXQiIHR5cGU9InhtbC1zb2FwOk1hcCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTWFwUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhtbC1zb2FwOk1hcCIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NYXBBcnJheVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dCIgdHlwZT0iczpBcnJheU9mTWFwIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NYXBBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJzOkFycmF5T2ZNYXAiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVG9rZW5SZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRUb2tlbiIgdHlwZT0ieHNkOnRva2VuIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Ub2tlblJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6dG9rZW4iLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTm9ybWFsaXplZFN0cmluZ1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dE5vcm1hbGl6ZWRTdHJpbmciIHR5cGU9InhzZDpub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Ob3JtYWxpemVkU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpub3JtYWxpemVkU3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Vuc2lnbmVkTG9uZ1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFVuc2lnbmVkTG9uZyIgdHlwZT0ieHNkOnVuc2lnbmVkTG9uZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVW5zaWduZWRMb25nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDp1bnNpZ25lZExvbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVW5zaWduZWRJbnRSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRVbnNpZ25lZEludCIgdHlwZT0ieHNkOnVuc2lnbmVkSW50Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9VbnNpZ25lZEludFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6dW5zaWduZWRJbnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVW5zaWduZWRTaG9ydFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFVuc2lnbmVkU2hvcnQiIHR5cGU9InhzZDp1bnNpZ25lZFNob3J0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9VbnNpZ25lZFNob3J0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDp1bnNpZ25lZFNob3J0Ii8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Vuc2lnbmVkQnl0ZVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dFVuc2lnbmVkQnl0ZSIgdHlwZT0ieHNkOnVuc2lnbmVkQnl0ZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVW5zaWduZWRCeXRlUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDp1bnNpZ25lZEJ5dGUiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTm9uTmVnYXRpdmVJbnRlZ2VyUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0Tm9uTmVnYXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bm9uTmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Ob25OZWdhdGl2ZUludGVnZXJSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOm5vbk5lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Qb3NpdGl2ZUludGVnZXJSZXF1ZXN0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iaW5wdXRQb3NpdGl2ZUludGVnZXIiIHR5cGU9InhzZDpwb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1Bvc2l0aXZlSW50ZWdlclJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6cG9zaXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob05vblBvc2l0aXZlSW50ZWdlclJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJpbnB1dE5vblBvc2l0aXZlSW50ZWdlciIgdHlwZT0ieHNkOm5vblBvc2l0aXZlSW50ZWdlciIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTm9uUG9zaXRpdmVJbnRlZ2VyUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpub25Qb3NpdGl2ZUludGVnZXIiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvTmVnYXRpdmVJbnRlZ2VyUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9ImlucHV0TmVnYXRpdmVJbnRlZ2VyIiB0eXBlPSJ4c2Q6bmVnYXRpdmVJbnRlZ2VyIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9OZWdhdGl2ZUludGVnZXJSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJldHVybiIgdHlwZT0ieHNkOm5lZ2F0aXZlSW50ZWdlciIvPgotICAgIDwvbWVzc2FnZT4KLQotICAgIDxwb3J0VHlwZSBuYW1lPSJJbnRlcm9wVGVzdFBvcnRUeXBlIj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRTdHJpbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0U3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50ZWdlciIgcGFyYW1ldGVyT3JkZXI9ImlucHV0SW50ZWdlciI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRlZ2VyUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludGVnZXJSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50ZWdlckFycmF5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRJbnRlZ2VyQXJyYXkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvSW50ZWdlckFycmF5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludGVnZXJBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9GbG9hdCIgcGFyYW1ldGVyT3JkZXI9ImlucHV0RmxvYXQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRmxvYXRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRmxvYXRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRmxvYXRBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0RmxvYXRBcnJheSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9GbG9hdEFycmF5UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Zsb2F0QXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRTdHJ1Y3QiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3RBcnJheSIgcGFyYW1ldGVyT3JkZXI9ImlucHV0U3RydWN0QXJyYXkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0QXJyYXlSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0QXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9Wb2lkUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1ZvaWRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQmFzZTY0IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRCYXNlNjQiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvQmFzZTY0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Jhc2U2NFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9EYXRlIiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXREYXRlIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0RhdGVSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRGF0ZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9IZXhCaW5hcnkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dEhleEJpbmFyeSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9IZXhCaW5hcnlSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvSGV4QmluYXJ5UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0RlY2ltYWwiIHBhcmFtZXRlck9yZGVyPSJpbnB1dERlY2ltYWwiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvRGVjaW1hbFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9EZWNpbWFsUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Jvb2xlYW4iIHBhcmFtZXRlck9yZGVyPSJpbnB1dEJvb2xlYW4iPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvQm9vbGVhblJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9Cb29sZWFuUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPCEtLSBSb3VuZDJCIG9wZXJhdGlvbnMgLS0+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMiIHBhcmFtZXRlck9yZGVyPSJpbnB1dFN0cnVjdCBvdXRwdXRTdHJpbmcgb3V0cHV0SW50ZWdlciBvdXRwdXRGbG9hdCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJ1Y3RBc1NpbXBsZVR5cGVzUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cnVjdEFzU2ltcGxlVHlwZXNSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCIgcGFyYW1ldGVyT3JkZXI9ImlucHV0U3RyaW5nIGlucHV0SW50ZWdlciBpbnB1dEZsb2F0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1NpbXBsZVR5cGVzQXNTdHJ1Y3RSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU2ltcGxlVHlwZXNBc1N0cnVjdFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8yRFN0cmluZ0FycmF5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXQyRFN0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNobzJEU3RyaW5nQXJyYXlSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvMkRTdHJpbmdBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9OZXN0ZWRTdHJ1Y3QiIHBhcmFtZXRlck9yZGVyPSJpbnB1dFN0cnVjdCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9OZXN0ZWRTdHJ1Y3RSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTmVzdGVkU3RydWN0UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob05lc3RlZEFycmF5IiBwYXJhbWV0ZXJPcmRlcj0iaW5wdXRTdHJ1Y3QiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTmVzdGVkQXJyYXlSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTmVzdGVkQXJyYXlSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01hcCIgcGFyYW1ldGVyT3JkZXI9ImlucHV0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob01hcFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NYXBSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTWFwQXJyYXkiIHBhcmFtZXRlck9yZGVyPSJpbnB1dCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NYXBBcnJheVJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NYXBBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1Rva2VuIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Rva2VuUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Rva2VuUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9Ob3JtYWxpemVkU3RyaW5nUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob05vcm1hbGl6ZWRTdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZExvbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvVW5zaWduZWRMb25nUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Vuc2lnbmVkTG9uZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZEludCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9VbnNpZ25lZEludFJlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9VbnNpZ25lZEludFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZFNob3J0Ij4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Vuc2lnbmVkU2hvcnRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvVW5zaWduZWRTaG9ydFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZEJ5dGUiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvVW5zaWduZWRCeXRlUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Vuc2lnbmVkQnl0ZVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Ob25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTm9uTmVnYXRpdmVJbnRlZ2VyUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob05vbk5lZ2F0aXZlSW50ZWdlclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvUG9zaXRpdmVJbnRlZ2VyUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1Bvc2l0aXZlSW50ZWdlclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Ob25Qb3NpdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTm9uUG9zaXRpdmVJbnRlZ2VyUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob05vblBvc2l0aXZlSW50ZWdlclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTmVnYXRpdmVJbnRlZ2VyUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob05lZ2F0aXZlSW50ZWdlclJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0KLSAgICA8YmluZGluZyBuYW1lPSJJbnRlcm9wVGVzdFNvYXBCaW5kaW5nIiB0eXBlPSJ0bnM6SW50ZXJvcFRlc3RQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludGVnZXIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSW50ZWdlckFycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Zsb2F0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0Zsb2F0QXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdEFycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQmFzZTY0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0RhdGUiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvSGV4QmluYXJ5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0RlY2ltYWwiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvQm9vbGVhbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDwhLS0gUm91bmQyQiBCaW5kaW5nIG9wZXJhdGlvbnMgLS0+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdEFzU2ltcGxlVHlwZXMiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU2ltcGxlVHlwZXNBc1N0cnVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG8yRFN0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob05lc3RlZFN0cnVjdCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9OZXN0ZWRBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob01hcCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NYXBBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1Rva2VuIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTm9ybWFsaXplZFN0cmluZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1Vuc2lnbmVkTG9uZyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZEludCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9VbnNpZ25lZFNob3J0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1Vuc2lnbmVkQnl0ZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Ob25OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvUG9zaXRpdmVJbnRlZ2VyIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob05vblBvc2l0aXZlSW50ZWdlciI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9OZWdhdGl2ZUludGVnZXIiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImVuY29kZWQiIG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgZW5jb2RpbmdTdHlsZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0KLSAgICA8IS0tIFNlcnZpY2UgRGVzY3JpcHRpb24gZm9yIEF4aXMgLS0+Ci0gICAgPHNlcnZpY2UgbmFtZT0iSW50ZXJvcFRlc3RTZXJ2aWNlIj4KLQotICAgICAgICA8cG9ydCBiaW5kaW5nPSJ0bnM6SW50ZXJvcFRlc3RTb2FwQmluZGluZyIgbmFtZT0iZWNobyI+Ci0KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9uYWdveWEuYXBhY2hlLm9yZzo1MDQ5L2F4aXMvc2VydmljZXMvZWNobyIvPgotCi0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci0KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9JbnRlcm9wVGVzdERvY0xpdDIud3NkbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL0ludGVyb3BUZXN0RG9jTGl0Mi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmYxYjRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL0ludGVyb3BUZXN0RG9jTGl0Mi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFNlcnZpY2UiCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iQXJyYXlPZnN0cmluZ19saXRlcmFsIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjEiIG5hbWU9InN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3QiPgotICAgICAgICAgICAgICAgIDxhbGw+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhclN0cmluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvYWxsPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1BhcmFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheVBhcmFtIiB0eXBlPSJ4c2QxOkFycmF5T2ZzdHJpbmdfbGl0ZXJhbCIvPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXR1cm4iIHR5cGU9InhzZDE6QXJyYXlPZnN0cmluZ19saXRlcmFsIi8+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RQYXJhbSIgdHlwZT0ieHNkMTpTT0FQU3RydWN0Ii8+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RSZXR1cm4iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotICAgICAgICA8L3NjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdQYXJhbSIgbmFtZT0iYSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdSZXR1cm4iIG5hbWU9InJlc3VsdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdBcnJheVBhcmFtIiBuYW1lPSJhIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RyaW5nQXJyYXlSZXR1cm4iIG5hbWU9InJlc3VsdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RydWN0UGFyYW0iIG5hbWU9ImEiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0ieHNkMTplY2hvU3RydWN0UmV0dXJuIiBuYW1lPSJyZXN1bHQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1ZvaWQiLz4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVm9pZFJlc3BvbnNlIi8+Ci0KLSAgICA8cG9ydFR5cGUgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0UG9ydFR5cGUiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nIiBuYW1lPSJlY2hvU3RyaW5nIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXkiIG5hbWU9ImVjaG9TdHJpbmdBcnJheSIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiIG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0IiBuYW1lPSJlY2hvU3RydWN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0UmVzcG9uc2UiIG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9Wb2lkIiBuYW1lPSJlY2hvVm9pZCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1ZvaWRSZXNwb25zZSIgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRCaW5kaW5nIgotICAgICAgICB0eXBlPSJ0bnM6V1NETEludGVyb3BUZXN0RG9jTGl0UG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9Wb2lkIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0U2VydmljZSI+Ci0gICAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0QmluZGluZyIKLSAgICAgICAgICAgIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnQiPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbXNzb2FwaW50ZXJvcC5vcmcvc3RrdjMvd3NkbC9pbnRlcm9wVGVzdERvY0xpdC53c2RsIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvU2FsZXNSYW5rTlByaWNlLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9TYWxlc1JhbmtOUHJpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNiYzk2NS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9TYWxlc1JhbmtOUHJpY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6czA9Imh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vTkVUV2ViU3Zjcy9Cb29rU2VydmljZSIgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlIj4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblNhbGVzUmFua1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtSZXN1bHQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmsiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtSZXN1bHQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0Qk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0Qk5TYWxlc1JhbmtSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0Qk5TYWxlc1JhbmtSZXN1bHQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uUHJpY2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uUHJpY2VSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0QW1hem9uUHJpY2VSZXN1bHQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uVUtQcmljZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbWF6b25VS1ByaWNlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEFtYXpvblVLUHJpY2VSZXN1bHQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0Qk5QcmljZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRCTlByaWNlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEJOUHJpY2VSZXN1bHQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VSZXN1bHQiIHR5cGU9InMwOlNhbGVzUmFua05QcmljZTEiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iU2FsZXNSYW5rTlByaWNlMSI+Ci0gICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IlNhbGVzUmFuayIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iUHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZVJlc3VsdCIgdHlwZT0iczA6U2FsZXNSYW5rTlByaWNlMSIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgICAgICA8czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rUmVzdWx0IiB0eXBlPSJzMDpTYWxlc1JhbmtzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3M6ZWxlbWVudD4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9IlNhbGVzUmFua3MiPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJBbWF6b25TYWxlc1JhbmsiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJOU2FsZXNSYW5rIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2VSZXN1bHQiIHR5cGU9InMwOlByaWNlcyIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9zOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJQcmljZXMiPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJBbWF6b25QcmljZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQk5QcmljZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IkdldEFsbCI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJHZXRBbGxSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iR2V0QWxsUmVzdWx0IiB0eXBlPSJzMDpBbGwiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvczplbGVtZW50PgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0iQWxsIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQW1hem9uU2FsZXNSYW5rIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJBbWF6b25QcmljZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iQk5TYWxlc1JhbmsiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9IkJOUHJpY2UiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJTYWxlc1JhbmtOUHJpY2UxIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczA6U2FsZXNSYW5rTlByaWNlMSIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJTYWxlc1JhbmtzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczA6U2FsZXNSYW5rcyIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJQcmljZXMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzMDpQcmljZXMiLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iQWxsIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczA6QWxsIi8+Ci0gICAgICAgIDwvczpzY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25TYWxlc1JhbmsiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvblNhbGVzUmFua1Jlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uVUtTYWxlc1JhbmsiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uVUtTYWxlc1JhbmtSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua1NvYXBJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEJOU2FsZXNSYW5rIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEJOU2FsZXNSYW5rUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uUHJpY2VTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25QcmljZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25QcmljZVNvYXBPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25QcmljZVJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLUHJpY2VTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbWF6b25VS1ByaWNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLUHJpY2VTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uVUtQcmljZVJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOUHJpY2VTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRCTlByaWNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOUHJpY2VTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0Qk5QcmljZVJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZVNvYXBJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvblNhbGVzUmFua05QcmljZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uU2FsZXNSYW5rTlByaWNlUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2VTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRCTlNhbGVzUmFua05QcmljZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZVNvYXBPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRCTlNhbGVzUmFua05QcmljZVJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmtTb2FwT3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uQW5kQk5TYWxlc1JhbmtSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlU29hcEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iczA6R2V0QW1hem9uQW5kQk5QcmljZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFtYXpvbkFuZEJOUHJpY2VSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbGxTb2FwSW4iPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDpHZXRBbGwiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QWxsU29hcE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InMwOkdldEFsbFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua0h0dHBHZXRJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua0h0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFua0h0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0Qk5TYWxlc1JhbmtIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua0h0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uUHJpY2VIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25QcmljZUh0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uVUtQcmljZUh0dHBHZXRJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLUHJpY2VIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOUHJpY2VIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlByaWNlSHR0cEdldE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6U2FsZXNSYW5rTlByaWNlMSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZUh0dHBHZXRJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlSHR0cEdldE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOlNhbGVzUmFua05QcmljZTEiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmtIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFua0h0dHBHZXRPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpTYWxlc1JhbmtzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2VIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlSHR0cEdldE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOlByaWNlcyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbGxIdHRwR2V0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbGxIdHRwR2V0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6QWxsIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua0h0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFua0h0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFua0h0dHBQb3N0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uUHJpY2VIdHRwUG9zdEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uUHJpY2VIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25VS1ByaWNlSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvblVLUHJpY2VIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRCTlByaWNlSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOUHJpY2VIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VIdHRwUG9zdEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpTYWxlc1JhbmtOUHJpY2UxIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpTYWxlc1JhbmtOUHJpY2UxIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rSHR0cFBvc3RJbiI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IklTQk4iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rSHR0cFBvc3RPdXQiPgotICAgICAgICA8cGFydCBuYW1lPSJCb2R5IiBlbGVtZW50PSJzMDpTYWxlc1JhbmtzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFtYXpvbkFuZEJOUHJpY2VIdHRwUG9zdEluIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iSVNCTiIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZUh0dHBQb3N0T3V0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0iQm9keSIgZWxlbWVudD0iczA6UHJpY2VzIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkdldEFsbEh0dHBQb3N0SW4iPgotICAgICAgICA8cGFydCBuYW1lPSJJU0JOIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJHZXRBbGxIdHRwUG9zdE91dCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IkJvZHkiIGVsZW1lbnQ9InMwOkFsbCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iU2FsZXNSYW5rTlByaWNlU29hcCI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua1NvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtTb2FwT3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPiZsdDtiJmd0O05FVyEmbHQ7L2ImZ3Q7IFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgJmx0O2ImZ3Q7QW1hem9uLmNvLnVrJmx0Oy9iJmd0OyBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLU2FsZXNSYW5rU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gUHJpY2UgKGluIFVTRCkgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uUHJpY2VTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uUHJpY2VTb2FwT3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Jmx0O2ImZ3Q7TkVXISZsdDsvYiZndDsgVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyAmbHQ7YiZndDtBbWF6b24uY28udWsgUHJpY2UgKGluICZhbXA7cG91bmQ7KSZsdDsvYiZndDsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtQcmljZVNvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1ByaWNlU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlIChpbiBVU0QpIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOUHJpY2VTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0Qk5QcmljZVNvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBTYWxlcyBSYW5rIGFuZCBQcmljZSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MgKFNhbGVzUmFuayBhbmQgQm9va1ByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rTlByaWNlU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua05QcmljZVNvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFuayBhbmQgUHJpY2UgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzIChTYWxlc1JhbmsgYW5kIEJvb2tQcmljZSkuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rTlByaWNlU29hcEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rTlByaWNlU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rcyBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rIGFuZCBCJmFtcDtOIFNhbGVzIFJhbmspLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlNhbGVzUmFua1NvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlNhbGVzUmFua1NvYXBPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZXMgKGluIFVTRCkgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIHR3byBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuayBhbmQgQiZhbXA7TiBTYWxlcyBSYW5rKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5QcmljZVNvYXBJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlByaWNlU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbGwiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gU2FsZXMgUmFua3MgYXMgd2VsbCBhcyBBbWF6b24uY29tIGFuZCBCYXJuZXNBbmROb2JsZS5jb20gUHJpY2VzIChpbiBVU0QpIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyBGb3VyIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rLCBBbWF6b24gUHJpY2UsIEImYW1wO04gU2FsZXMgUmFuaywgYW5kIEImYW1wO04gUHJpY2UpLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbGxTb2FwSW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QWxsU29hcE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxwb3J0VHlwZSBuYW1lPSJTYWxlc1JhbmtOUHJpY2VIdHRwR2V0Ij4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIFNhbGVzIFJhbmsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua0h0dHBHZXRPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Jmx0O2ImZ3Q7TkVXISZsdDsvYiZndDsgVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyAmbHQ7YiZndDtBbWF6b24uY28udWsmbHQ7L2ImZ3Q7IFNhbGVzIFJhbmsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQmFybmVzQW5kTm9ibGUuY29tIFNhbGVzIFJhbmsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBQcmljZSAoaW4gVVNEKSBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25QcmljZUh0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25QcmljZUh0dHBHZXRPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtQcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtORVchJmx0Oy9iJmd0OyBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zICZsdDtiJmd0O0FtYXpvbi5jby51ayBQcmljZSAoaW4gJmFtcDtwb3VuZDspJmx0Oy9iJmd0OyBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1ByaWNlSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLUHJpY2VIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBCYXJuZXNBbmROb2JsZS5jb20gUHJpY2UgKGluIFVTRCkgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0Qk5QcmljZUh0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRCTlByaWNlSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIFNhbGVzIFJhbmsgYW5kIFByaWNlIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0d28gc3RyaW5ncyAoU2FsZXNSYW5rIGFuZCBCb29rUHJpY2UpLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rTlByaWNlSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rIGFuZCBQcmljZSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MgKFNhbGVzUmFuayBhbmQgQm9va1ByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtOUHJpY2VIdHRwR2V0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtOUHJpY2VIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFNhbGVzIFJhbmtzIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0d28gc3RyaW5ncy4gKEFtYXpvbiBTYWxlc1JhbmsgYW5kIEImYW1wO04gU2FsZXMgUmFuaykuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvbkFuZEJOU2FsZXNSYW5rSHR0cEdldE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlcyAoaW4gVVNEKSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rIGFuZCBCJmFtcDtOIFNhbGVzIFJhbmspLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlByaWNlSHR0cEdldEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvbkFuZEJOUHJpY2VIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFsbCI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rcyBhcyB3ZWxsIGFzIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBQcmljZXMgKGluIFVTRCkgZm9yIHRoYXQgYm9vay4gVGhlIHJldHVybmVkIGRhdGEgaXMgb25lIHN0cnVjdHVyZSBjb250YWluaW5nIEZvdXIgc3RyaW5ncy4gKEFtYXpvbiBTYWxlc1JhbmssIEFtYXpvbiBQcmljZSwgQiZhbXA7TiBTYWxlcyBSYW5rLCBhbmQgQiZhbXA7TiBQcmljZSkuPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFsbEh0dHBHZXRJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbGxIdHRwR2V0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlNhbGVzUmFua05QcmljZUh0dHBQb3N0Ij4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIFNhbGVzIFJhbmsgZm9yIHRoYXQgYm9vay48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uU2FsZXNSYW5rSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4mbHQ7YiZndDtORVchJmx0Oy9iJmd0OyBUaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zICZsdDtiJmd0O0FtYXpvbi5jby51ayZsdDsvYiZndDsgU2FsZXMgUmFuayBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25VS1NhbGVzUmFua0h0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uVUtTYWxlc1JhbmtIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOU2FsZXNSYW5rSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua0h0dHBQb3N0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBQcmljZSAoaW4gVVNEKSBmb3IgdGhhdCBib29rLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25QcmljZUh0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uUHJpY2VIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1ByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPiZsdDtiJmd0O05FVyEmbHQ7L2ImZ3Q7IFRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgJmx0O2ImZ3Q7QW1hem9uLmNvLnVrIFByaWNlIChpbiAmYW1wO3BvdW5kOykmbHQ7L2ImZ3Q7IGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLUHJpY2VIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblVLUHJpY2VIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlIChpbiBVU0QpIGZvciB0aGF0IGJvb2suPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOkdldEJOUHJpY2VIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEJOUHJpY2VIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+VGhpcyBtZXRob2QgYWNjZXB0cyBhbiBJU0JOIHN0cmluZyBhbmQgcmV0dXJucyBBbWF6b24uY29tIFNhbGVzIFJhbmsgYW5kIFByaWNlIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0d28gc3RyaW5ncyAoU2FsZXNSYW5rIGFuZCBCb29rUHJpY2UpLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25TYWxlc1JhbmtOUHJpY2VIdHRwUG9zdEluIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOkdldEFtYXpvblNhbGVzUmFua05QcmljZUh0dHBQb3N0T3V0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQmFybmVzQW5kTm9ibGUuY29tIFNhbGVzIFJhbmsgYW5kIFByaWNlIGZvciB0aGF0IGJvb2suIFRoZSByZXR1cm5lZCBkYXRhIGlzIG9uZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0d28gc3RyaW5ncyAoU2FsZXNSYW5rIGFuZCBCb29rUHJpY2UpLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRCTlNhbGVzUmFua05QcmljZUh0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0Qk5TYWxlc1JhbmtOUHJpY2VIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj5UaGlzIG1ldGhvZCBhY2NlcHRzIGFuIElTQk4gc3RyaW5nIGFuZCByZXR1cm5zIEFtYXpvbi5jb20gYW5kIEJhcm5lc0FuZE5vYmxlLmNvbSBTYWxlcyBSYW5rcyBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rIGFuZCBCJmFtcDtOIFNhbGVzIFJhbmspLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlNhbGVzUmFua0h0dHBQb3N0SW4iLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6R2V0QW1hem9uQW5kQk5TYWxlc1JhbmtIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlcyAoaW4gVVNEKSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdHdvIHN0cmluZ3MuIChBbWF6b24gU2FsZXNSYW5rIGFuZCBCJmFtcDtOIFNhbGVzIFJhbmspLjwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlByaWNlSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbWF6b25BbmRCTlByaWNlSHR0cFBvc3RPdXQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QWxsIj4KLSAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPlRoaXMgbWV0aG9kIGFjY2VwdHMgYW4gSVNCTiBzdHJpbmcgYW5kIHJldHVybnMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFNhbGVzIFJhbmtzIGFzIHdlbGwgYXMgQW1hem9uLmNvbSBhbmQgQmFybmVzQW5kTm9ibGUuY29tIFByaWNlcyAoaW4gVVNEKSBmb3IgdGhhdCBib29rLiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvbmUgc3RydWN0dXJlIGNvbnRhaW5pbmcgRm91ciBzdHJpbmdzLiAoQW1hem9uIFNhbGVzUmFuaywgQW1hem9uIFByaWNlLCBCJmFtcDtOIFNhbGVzIFJhbmssIGFuZCBCJmFtcDtOIFByaWNlKS48L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0iczA6R2V0QWxsSHR0cFBvc3RJbiIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDpHZXRBbGxIdHRwUG9zdE91dCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IlNhbGVzUmFua05QcmljZVNvYXAiIHR5cGU9InMwOlNhbGVzUmFua05QcmljZVNvYXAiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25TYWxlc1JhbmsiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vTkVUV2ViU3Zjcy9Cb29rU2VydmljZS9HZXRBbWF6b25TYWxlc1JhbmsiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QW1hem9uVUtTYWxlc1JhbmsiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0Qk5TYWxlc1JhbmsiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblByaWNlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QW1hem9uUHJpY2UiIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblVLUHJpY2UiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vTkVUV2ViU3Zjcy9Cb29rU2VydmljZS9HZXRBbWF6b25VS1ByaWNlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlByaWNlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0Qk5QcmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QW1hem9uU2FsZXNSYW5rTlByaWNlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEJOU2FsZXNSYW5rTlByaWNlIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9ORVRXZWJTdmNzL0Jvb2tTZXJ2aWNlL0dldEFtYXpvbkFuZEJOU2FsZXNSYW5rIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlByaWNlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QW1hem9uQW5kQk5QcmljZSIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QWxsIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tL05FVFdlYlN2Y3MvQm9va1NlcnZpY2UvR2V0QWxsIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPGJpbmRpbmcgbmFtZT0iU2FsZXNSYW5rTlByaWNlSHR0cEdldCIgdHlwZT0iczA6U2FsZXNSYW5rTlByaWNlSHR0cEdldCI+Ci0gICAgICAgIDxodHRwOmJpbmRpbmcgdmVyYj0iR0VUIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEFtYXpvblNhbGVzUmFuayIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtTYWxlc1JhbmsiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uVUtTYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8aHR0cDp1cmxFbmNvZGVkLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEJOU2FsZXNSYW5rIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25QcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uVUtQcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25VS1ByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlByaWNlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEJOUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8aHR0cDp1cmxFbmNvZGVkLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8aHR0cDp1cmxFbmNvZGVkLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEJOU2FsZXNSYW5rTlByaWNlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEJOU2FsZXNSYW5rTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25BbmRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25BbmRCTlNhbGVzUmFuayIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxodHRwOnVybEVuY29kZWQvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25BbmRCTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbGwiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QWxsIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPGh0dHA6dXJsRW5jb2RlZC8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPGJpbmRpbmcgbmFtZT0iU2FsZXNSYW5rTlByaWNlSHR0cFBvc3QiIHR5cGU9InMwOlNhbGVzUmFua05QcmljZUh0dHBQb3N0Ij4KLSAgICAgICAgPGh0dHA6YmluZGluZyB2ZXJiPSJQT1NUIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uU2FsZXNSYW5rIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEFtYXpvblNhbGVzUmFuayIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1NhbGVzUmFuayI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25VS1NhbGVzUmFuayIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRCTlNhbGVzUmFuayI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRCTlNhbGVzUmFuayIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25QcmljZSIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOmNvbnRlbnQgdHlwZT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTptaW1lWG1sIHBhcnQ9IkJvZHkiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJHZXRBbWF6b25VS1ByaWNlIj4KLSAgICAgICAgICAgIDxodHRwOm9wZXJhdGlvbiBsb2NhdGlvbj0iL0dldEFtYXpvblVLUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRCTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFtYXpvblNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25TYWxlc1JhbmtOUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0Qk5TYWxlc1JhbmtOUHJpY2UiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0Qk5TYWxlc1JhbmtOUHJpY2UiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiPgotICAgICAgICAgICAgPGh0dHA6b3BlcmF0aW9uIGxvY2F0aW9uPSIvR2V0QW1hem9uQW5kQk5TYWxlc1JhbmsiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iR2V0QW1hem9uQW5kQk5QcmljZSI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbWF6b25BbmRCTlByaWNlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6Y29udGVudCB0eXBlPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxtaW1lOm1pbWVYbWwgcGFydD0iQm9keSIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IkdldEFsbCI+Ci0gICAgICAgICAgICA8aHR0cDpvcGVyYXRpb24gbG9jYXRpb249Ii9HZXRBbGwiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8bWltZTpjb250ZW50IHR5cGU9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPG1pbWU6bWltZVhtbCBwYXJ0PSJCb2R5Ii8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IlNhbGVzUmFua05QcmljZSI+Ci0gICAgICAgIDxkb2N1bWVudGF0aW9uPiZsdDtiJmd0O1RoaXMgV2ViIFNlcnZpY2UgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBTYWxlcyBSYW5rIGFuZC9vciBwcmljZSBmb3IgYW55IGJvb2sgYXZhaWxhYmxlIG9uIEFtYXpvbiBhbmQvb3IgQiZhbXA7TiBXZWIgc2l0ZXMuJmx0Oy9iJmd0OyBUaGlzIFdlYiBTZXJ2aWNlIGlzIGNyZWF0ZWQgYnkgJmx0O2EgaHJlZj1odHRwOi8vd3d3LlBlcmZlY3RYTUwuY29tIHRhcmdldD1fYmxhbmsmZ3Q7UGVyZmVjdFhNTCBUZWFtJmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7Jmx0O2JyJmd0O1BsZWFzZSBlbWFpbCB5b3VyIHF1ZXN0aW9ucy9jb21tZW50cy9zdWdnZXN0aW9ucyB0byAmbHQ7YSBocmVmPW1haWx0bzpkYXJzaGFuQFBlcmZlY3RYTUwuY29tJmd0OyZsdDtiJmd0O2RhcnNoYW5AUGVyZmVjdFhNTC5jb20mbHQ7L2ImZ3Q7Jmx0Oy9hJmd0Oy4mbHQ7YnImZ3Q7V2ViIFNlcnZpY2UgYnVpbHQgdXNpbmcgQVNQLk5FVCAoJmx0O2ImZ3Q7MS4wLjM3MDUmbHQ7L2ImZ3Q7KSBhbmQgVmlzdWFsIFN0dWRpbyAuTkVUICgmbHQ7YiZndDs3LjAuOTQ2NiZsdDsvYiZndDspJmx0O2JyJmd0OyZsdDticiZndDtUaGUgQyMgY2xpZW50IGFwcGxpY2F0aW9uIHRoYXQgYWNjZXNzZXMgU2FsZXNSYW5rTlByaWNlIFdlYiBTZXJ2aWNlIGlzIGF2YWlsYWJsZSAod2l0aCBzb3VyY2UgY29kZSl0byBkb3dubG9hZCBhdCAmbHQ7QSBocmVmPWh0dHA6Ly93d3cucGVyZmVjdHhtbC5jb20vRG93bmxvYWRzL1NhbGVzUmFua05QcmljZVdpbkNsaWVudC56aXAgJmd0O2h0dHA6Ly93d3cuUGVyZmVjdFhNTC5jb20vRG93bmxvYWRzL1NhbGVzUmFua05QcmljZVdpbkNsaWVudC56aXAmbHQ7L0EmZ3Q7LiZsdDticiZndDsmbHQ7YnImZ3Q7Jmx0O0EgaHJlZj1odHRwOi8vd3d3LnBlcmZlY3R4bWwuY29tL2ltYWdlcy9TYWxlc1JhbmtOUHJpY2UuanBnIHRhcmdldD1fYmxhbmsmZ3Q7Q2xpY2sgaGVyZSZsdDsvQSZndDsgdG8gdmlldyB0aGUgc2NyZWVuc2hvdCBpbWFnZSBvZiB0aGlzIGNsaWVudCBhcHBsaWNhdGlvbi4mbHQ7YnImZ3Q7Jmx0O2JyJmd0O1lvdSBjYW4gY29uZmlndXJlIHdoaWNoIGJvb2tzIHRvIG1vbml0b3IsIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQgaW4gWE1MIGNvbmZpZ3VyYXRpb24gZmlsZXMgbG9jYWxseS4mbHQ7YnImZ3Q7Jmx0O2JyJmd0O0ZvciAmbHQ7YiZndDttb3JlIGluZm9ybWF0aW9uIG9uIFdlYiBTZXJ2aWNlcyZsdDsvYiZndDssIHZpc2l0ICZsdDthIGhyZWY9aHR0cDovL3d3dy5QZXJmZWN0WE1MLmNvbS9XZWJTdmMxLmFzcCB0YXJnZXQ9X2JsYW5rJmd0O1BlcmZlY3RYTUwgV2ViIFNlcnZpY2VzIGZvY3VzIHNlY3Rpb24mbHQ7L2EmZ3Q7LiZsdDticiZndDsmbHQ7YnImZ3Q7Tm90ZSB0aGF0IHRoaXMgV2ViIFNlcnZpY2UgcG9zdHMgZGF0YSBkaXJlY3RseSB0byBBbWF6b24gYW5kIEJhcm5lc0FuZE5vYmxlIFdlYiBzaXRlcy4gVGhpcyBXZWIgU2VydmljZSBpcyBpbnRlbmRlZCBvbmx5IGZvciBub24tY29tbWVyY2lhbCwgcGVyc29uYWwgdXNlLiZsdDticiZndDsmbHQ7YnImZ3Q7Jmx0O3UmZ3Q7RmV3IHNhbXBsZSBJU0JOIE51bWJlcnMmbHQ7L3UmZ3Q7OiZsdDtibG9ja3F1b3RlJmd0OzE4NjEwMDU4OVg6ICZsdDtiJmd0O1hNTCBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCB3aXRoIE1TWE1MIDQuMCZsdDsvYiZndDsgKFdyb3ggUHJlc3MpJmx0O2JyJmd0OzE4NjEwMDU2MjggOiAmbHQ7YiZndDtFYXJseSBBZG9wdGVyIFZvaWNlWE1MJmx0Oy9iJmd0OyAoV3JveCBQcmVzcykmbHQ7YnImZ3Q7MDczNTcxMDUyWCA6ICZsdDtiJmd0O0MrKyBYTUwmbHQ7L2ImZ3Q7IChOZXcgUmlkZXJzKSZsdDticiZndDsxODYxMDA1NDY2IDogJmx0O2ImZ3Q7UHJvZmVzc2lvbmFsIFNRTCBTZXJ2ZXIgMjAwMCBYTUwmbHQ7L2ImZ3Q7IChXcm94IFByZXNzKSZsdDticiZndDsxODYxMDA1MzE4IDogJmx0O2ImZ3Q7UHJvZmVzc2lvbmFsIFhNTCBmb3IgLk5FVCBEZXZlbG9wZXJzJmx0Oy9iJmd0OyAoV3JveCBQcmVzcykmbHQ7YnImZ3Q7MTg5MzExNTk3NiA6ICZsdDtiJmd0O01vdmluZyB0byBWQi5ORVQ6IFN0cmF0ZWdpZXMsIENvbmNlcHRzLCBhbmQgQ29kZSAoQmV0YSAyKSZsdDsvYiZndDsgKEFQcmVzcykmbHQ7L2Jsb2NrcXVvdGUmZ3Q7PC9kb2N1bWVudGF0aW9uPgotICAgICAgICA8cG9ydCBuYW1lPSJTYWxlc1JhbmtOUHJpY2VTb2FwIiBiaW5kaW5nPSJzMDpTYWxlc1JhbmtOUHJpY2VTb2FwIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cucGVyZmVjdHhtbC5uZXQvV2ViU2VydmljZXMvU2FsZXNSYW5rTlByaWNlL0Jvb2tTZXJ2aWNlLmFzbXgiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTYWxlc1JhbmtOUHJpY2VIdHRwR2V0IiBiaW5kaW5nPSJzMDpTYWxlc1JhbmtOUHJpY2VIdHRwR2V0Ij4KLSAgICAgICAgICAgIDxodHRwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cucGVyZmVjdHhtbC5uZXQvV2ViU2VydmljZXMvU2FsZXNSYW5rTlByaWNlL0Jvb2tTZXJ2aWNlLmFzbXgiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTYWxlc1JhbmtOUHJpY2VIdHRwUG9zdCIgYmluZGluZz0iczA6U2FsZXNSYW5rTlByaWNlSHR0cFBvc3QiPgotICAgICAgICAgICAgPGh0dHA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3d3dy5wZXJmZWN0eG1sLm5ldC9XZWJTZXJ2aWNlcy9TYWxlc1JhbmtOUHJpY2UvQm9va1NlcnZpY2UuYXNteCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9jb21wbGV4LWRvYy1saXRlcmFsLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9jb21wbGV4LWRvYy1saXRlcmFsLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU5NTZhOWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcGxleC1kb2MtbGl0ZXJhbC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zCi0JeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy93c2RsIgotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpuczI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0JeG1sbnM6bnMzPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiCi0JeG1sbnM6bnM0PSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvd3NkbCI+Ci0KLQk8dHlwZXM+Ci0JCTxzY2hlbWEKLQkJCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0KLQkJCTxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3RGYXVsdCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJzb2FwU3RydWN0IiB0eXBlPSJ0bnM6U09BUFN0cnVjdCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iQmFzZVN0cnVjdCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJzdHJ1Y3RNZXNzYWdlIiB0eXBlPSJ0bnM6U09BUFN0cnVjdCIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJzaG9ydE1lc3NhZ2UiIHR5cGU9InhzZDpzaG9ydCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iRXh0ZW5kZWRTdHJ1Y3QiPgotCQkJCTxjb21wbGV4Q29udGVudD4KLQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJ0bnM6QmFzZVN0cnVjdCI+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0ic3RyaW5nTWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9ImludE1lc3NhZ2UiIHR5cGU9InhzZDppbnQiLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJhbm90aGVySW50TWVzc2FnZSIgdHlwZT0ieHNkOmludCIvPgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJPC9jb21wbGV4Q29udGVudD4KLQkJCTwvY29tcGxleFR5cGU+Ci0KLQkJCTxjb21wbGV4VHlwZSBuYW1lPSJNb3JlRXh0ZW5kZWRTdHJ1Y3QiPgotCQkJCTxjb21wbGV4Q29udGVudD4KLQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJ0bnM6RXh0ZW5kZWRTdHJ1Y3QiPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9ImJvb2xlYW5NZXNzYWdlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJPC9jb21wbGV4Q29udGVudD4KLQkJCTwvY29tcGxleFR5cGU+Ci0KLQkJPC9zY2hlbWE+Ci0KLQkJPHNjaGVtYQotCQkJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcGFydCI+Ci0KLQkJCTxlbGVtZW50IG5hbWU9IlNPQVBTdHJ1Y3RGYXVsdFBhcnQiIHR5cGU9Im5zMjpTT0FQU3RydWN0RmF1bHQiLz4KLQkJCTxlbGVtZW50IG5hbWU9IkJhc2VTdHJ1Y3RQYXJ0IiB0eXBlPSJuczI6QmFzZVN0cnVjdCIvPgotCQkJPGVsZW1lbnQgbmFtZT0iRXh0ZW5kZWRTdHJ1Y3RQYXJ0IiB0eXBlPSJuczI6RXh0ZW5kZWRTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9Ik1vcmVFeHRlbmRlZFN0cnVjdFBhcnQiIHR5cGU9Im5zMjpNb3JlRXh0ZW5kZWRTdHJ1Y3QiLz4KLQotCQk8L3NjaGVtYT4KLQotCQk8c2NoZW1hCi0JCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcmVxdWVzdHJlc3BvbnNlIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSI+Ci0KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXF1ZXN0IiB0eXBlPSJuczI6U09BUFN0cnVjdCIvPgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob1NPQVBTdHJ1Y3RGYXVsdFJlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGUvPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOkJhc2VTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXF1ZXN0IiB0eXBlPSJuczI6RXh0ZW5kZWRTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZS8+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ij4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IndoaWNoRmF1bHQiIHR5cGU9InhzZDppbnQiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ibnMyOlNPQVBTdHJ1Y3QiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ibnMyOkJhc2VTdHJ1Y3QiLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGUvPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJ3aGljaEZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9Im5zMjpCYXNlU3RydWN0Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9Im5zMjpFeHRlbmRlZFN0cnVjdCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJuczI6TW9yZUV4dGVuZGVkU3RydWN0Ii8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQk8L3NjaGVtYT4KLQk8L3R5cGVzPgotCi0JPG1lc3NhZ2UgbmFtZT0iZWNob1NPQVBTdHJ1Y3RGYXVsdFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9TT0FQU3RydWN0RmF1bHRSZXF1ZXN0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob1NPQVBTdHJ1Y3RGYXVsdFJlc3BvbnNlIi8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9CYXNlU3RydWN0RmF1bHRSZXF1ZXN0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlc3BvbnNlIi8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlcXVlc3QiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXNwb25zZSIvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSIvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSIvPgotCTwvbWVzc2FnZT4KLQotCTwhLS0gRmF1bHQgbWVzc2FnZXMgLS0+Ci0JPG1lc3NhZ2UgbmFtZT0iU09BUFN0cnVjdEZhdWx0Ij4KLQkJPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9Im5zMzpTT0FQU3RydWN0RmF1bHRQYXJ0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9IkJhc2VTdHJ1Y3RGYXVsdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcnQxIiBlbGVtZW50PSJuczM6QmFzZVN0cnVjdFBhcnQiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iRXh0ZW5kZWRTdHJ1Y3RGYXVsdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcnQyIiBlbGVtZW50PSJuczM6RXh0ZW5kZWRTdHJ1Y3RQYXJ0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9Ik1vcmVFeHRlbmRlZFN0cnVjdEZhdWx0Ij4KLQkJPHBhcnQgbmFtZT0icGFydDUiIGVsZW1lbnQ9Im5zMzpNb3JlRXh0ZW5kZWRTdHJ1Y3RQYXJ0Ii8+Ci0JPC9tZXNzYWdlPgotCi0JPHBvcnRUeXBlIG5hbWU9IkNvbXBsZXhEb2NMaXRQb3J0VHlwZSI+Ci0JCTwhLS0KLQkJCVRocm93cyBhIGZhdWx0IHdpdGggYW4gZW1iZWRkZWQgU09BUFN0cnVjdAotCQktLT4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0IiBwYXJhbWV0ZXJPcmRlcj0iIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1NPQVBTdHJ1Y3RGYXVsdFJlcXVlc3QiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZSIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdCIgbWVzc2FnZT0idG5zOlNPQVBTdHJ1Y3RGYXVsdCIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8IS0tCi0JCQlUaHJvd3MgYSBmYXVsdCB3aXRoIGEgYmFzZSBjb21wbGV4IHN0cnVjdAotCQktLT4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0IiBwYXJhbWV0ZXJPcmRlcj0iIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlcXVlc3QiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9CYXNlU3RydWN0RmF1bHRSZXNwb25zZSIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdCIgbWVzc2FnZT0idG5zOkJhc2VTdHJ1Y3RGYXVsdCIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8IS0tCi0JCQlUaHJvd3MgYSBmYXVsdCB3aXRoIGFuIGVuIGV4dGVuZGVkIGNvbXBsZXggdHlwZQotCQktLT4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdCIgcGFyYW1ldGVyT3JkZXI9IiI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVxdWVzdCIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXNwb25zZSIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdCIgbWVzc2FnZT0idG5zOkV4dGVuZGVkU3RydWN0RmF1bHQiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPCEtLQotCQkJVGhyb3dzIGEgZmF1bHQgd2l0aCBlbWJlZGRlZCBjb21wbGV4IHR5cGUsIGZhdWx0IHdpdGggYW4KLQkJCWV4dGVuZGVkIGNvbXBsZXggdHlwZSBhbmQgZmF1bHQgd2l0aCBhbiBhcnJheSBvZiBhIGJhc2UKLQkJCWNvbXBsZXggdHlwZQotCQktLT4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMxIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMxUmVxdWVzdCIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIi8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MSIgbWVzc2FnZT0idG5zOlNPQVBTdHJ1Y3RGYXVsdCIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDIiIG1lc3NhZ2U9InRuczpCYXNlU3RydWN0RmF1bHQiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPCEtLQotCQkJVGhyb3dzIGEgZmF1bHQgd2l0aCBhbiBhcnJheSBvZiBiYXNlIGNvbXBsZXggdHlwZSBhbmQKLQkJCWEgZmF1bHQgd2l0aCBkb3VibHkgZXh0ZW5kZWQgY29tcGxleCB0eXBlCi0JCS0tPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czIiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czJSZXF1ZXN0Ii8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQxIiBtZXNzYWdlPSJ0bnM6QmFzZVN0cnVjdEZhdWx0Ii8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MiIgbWVzc2FnZT0idG5zOkV4dGVuZGVkU3RydWN0RmF1bHQiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQzIiBtZXNzYWdlPSJ0bnM6TW9yZUV4dGVuZGVkU3RydWN0RmF1bHQiLz4KLQkJPC9vcGVyYXRpb24+Ci0JPC9wb3J0VHlwZT4KLQotCTxiaW5kaW5nIG5hbWU9IkNvbXBsZXhEb2NMaXRCaW5kaW5nIiB0eXBlPSJ0bnM6Q29tcGxleERvY0xpdFBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob1NPQVBTdHJ1Y3RGYXVsdCI+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0Ci0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdCIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHQiPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0Ij4KLQkJCQk8c29hcDpmYXVsdAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdCI+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0Ci0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdCIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czEiPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9vdXRwdXQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MSI+Ci0JCQkJPHNvYXA6ZmF1bHQgCi0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdDEiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQyIj4KLQkJCQk8c29hcDpmYXVsdAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQyIgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMiI+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQxIj4KLQkJCQk8c29hcDpmYXVsdAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQxIgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MiI+Ci0JCQkJPHNvYXA6ZmF1bHQgCi0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdDIiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQzIj4KLQkJCQk8c29hcDpmYXVsdCAKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0MyIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQk8L29wZXJhdGlvbj4KLQk8L2JpbmRpbmc+Ci0KLQk8c2VydmljZSBuYW1lPSJDb21wbGV4RG9jTGl0U2VydmljZSI+Ci0JCTxwb3J0IG5hbWU9IkNvbXBsZXhEb2NMaXRQb3J0IiBiaW5kaW5nPSJ0bnM6Q29tcGxleERvY0xpdEJpbmRpbmciPgotCQkJPHNvYXA6YWRkcmVzcwotCQkJCWxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9zZXJ2aWNlcy9Db21wbGV4RG9jTGl0UG9ydCIvPgotCQk8L3BvcnQ+Ci0JPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KLQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcG91bmQxLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9jb21wb3VuZDEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4YzY4Ni4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9jb21wb3VuZDEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6d3NkbG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgeG1sbnM6dHlwZW5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBlcnNvbiI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iQWdlIiB0eXBlPSJkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklEIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTmFtZSIgdHlwZT0ic3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWxlIiB0eXBlPSJib29sZWFuIi8+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ieF9QZXJzb24iIHR5cGU9InR5cGVuczpQZXJzb24iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InJlc3VsdF9QZXJzb24iIHR5cGU9InR5cGVuczpQZXJzb24iLz4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkRvY3VtZW50Ij4KLSAgICAgICAgICAgICAgICA8c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iSUQiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L3NpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ieF9Eb2N1bWVudCIgdHlwZT0idHlwZW5zOkRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXN1bHRfRG9jdW1lbnQiIHR5cGU9InR5cGVuczpEb2N1bWVudCIvPgotICAgICAgICA8L3NjaGVtYT4KLSAgICA8L3R5cGVzPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9QZXJzb24iPgotICAgICAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJ0eXBlbnM6eF9QZXJzb24iLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1BlcnNvblJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0iUmVzdWx0IiBlbGVtZW50PSJ0eXBlbnM6cmVzdWx0X1BlcnNvbiIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRG9jdW1lbnQiPgotICAgICAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJ0eXBlbnM6eF9Eb2N1bWVudCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRG9jdW1lbnRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9IlJlc3VsdCIgZWxlbWVudD0idHlwZW5zOnJlc3VsdF9Eb2N1bWVudCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZDFQb3J0VHlwZSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1BlcnNvbiIgcGFyYW1ldGVyT3JkZXI9IngiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9IndzZGxuczplY2hvUGVyc29uIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9IndzZGxuczplY2hvUGVyc29uUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0RvY3VtZW50IiBwYXJhbWV0ZXJPcmRlcj0ieCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0id3NkbG5zOmVjaG9Eb2N1bWVudCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ3c2RsbnM6ZWNob0RvY3VtZW50UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJTb2FwSW50ZXJvcENvbXBvdW5kMUJpbmRpbmciIHR5cGU9IndzZGxuczpTb2FwSW50ZXJvcENvbXBvdW5kMVBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1BlcnNvbiI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wL2VjaG9QZXJzb24iLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvRG9jdW1lbnQiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC9lY2hvRG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJDb21wb3VuZDEiPgotICAgICAgICA8cG9ydCBuYW1lPSJTb2FwSW50ZXJvcENvbXBvdW5kMVBvcnQiIGJpbmRpbmc9IndzZGxuczpTb2FwSW50ZXJvcENvbXBvdW5kMUJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgbG9jYXRpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5qYXZhLnN1bi5jb206ODAvcm91bmQzL2dyb3VwZC9jb21wb3VuZDEiLz4KLSAgICAgICAgPC9wb3J0PgotICAgIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvY29tcG91bmQyLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9jb21wb3VuZDIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiZjIyMy4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9jb21wb3VuZDIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6d3NkbG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgeG1sbnM6ZW1wPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2VtcGxveWVlIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJTb2FwSW50ZXJvcENvbXBvdW5kIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcGVyc29uIiBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJQZXJzb24iPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9Ik5hbWUiIHR5cGU9InN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0iTWFsZSIgdHlwZT0iYm9vbGVhbiIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICA8L3NjaGVtYT4KLSAgICAgICAgPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnBycz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9wZXJzb24iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9lbXBsb3llZSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgotICAgICAgICAgICAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcGVyc29uIi8+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRW1wbG95ZWUiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InBlcnNvbiIgdHlwZT0icHJzOlBlcnNvbiIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0ic2FsYXJ5IiB0eXBlPSJkb3VibGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9IklEIiB0eXBlPSJpbnQiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InhfRW1wbG95ZWUiIHR5cGU9ImVtcDpFbXBsb3llZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmVzdWx0X0VtcGxveWVlIiB0eXBlPSJlbXA6RW1wbG95ZWUiLz4KLSAgICAgICAgPC9zY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRW1wbG95ZWUiPgotICAgICAgICA8cGFydCBuYW1lPSJ4IiBlbGVtZW50PSJlbXA6eF9FbXBsb3llZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRW1wbG95ZWVSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InJlc3VsdCIgZWxlbWVudD0iZW1wOnJlc3VsdF9FbXBsb3llZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iU29hcEludGVyb3BDb21wb3VuZDJQb3J0VHlwZSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VtcGxveWVlIiBwYXJhbWV0ZXJPcmRlcj0ieCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0id3NkbG5zOmVjaG9FbXBsb3llZSIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ3c2RsbnM6ZWNob0VtcGxveWVlUmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLSAgICA8YmluZGluZyBuYW1lPSJTb2FwSW50ZXJvcENvbXBvdW5kMkJpbmRpbmciIHR5cGU9IndzZGxuczpTb2FwSW50ZXJvcENvbXBvdW5kMlBvcnRUeXBlIj4KLSAgICAgICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VtcGxveWVlIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIjZWNob0VtcGxveWVlIi8+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9iaW5kaW5nPgotICAgIDxzZXJ2aWNlIG5hbWU9IkNvbXBvdW5kMiI+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlNvYXBJbnRlcm9wQ29tcG91bmQyUG9ydCIgYmluZGluZz0id3NkbG5zOlNvYXBJbnRlcm9wQ29tcG91bmQyQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiBsb2NhdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLmphdmEuc3VuLmNvbTo4MC9yb3VuZDMvZ3JvdXBkL2NvbXBvdW5kMiIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9kaW1lLWRvYy53c2RsIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvZGltZS1kb2Mud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZGFjMS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9kaW1lLWRvYy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHdzZGw6ZGVmaW5pdGlvbnMgbmFtZT0iU09BUEJ1aWxkZXJzIgotICAgICAgICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvd3NkbCIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnR5cGVzPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzL3hzZCIKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpkaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpjb250ZW50PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2NvbnRlbnQtdHlwZS8iCi0gICAgICAgICAgICAgICAgICB4bWxuczpyZWY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvcmVmZXJlbmNlLyIKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy93c2RsIj4KLSAgICA8d3NkbDp0eXBlcz4KLSAgICAgICAgPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzL3hzZCIKLSAgICAgICAgICAgICAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0gICAgICAgICAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9yZWZlcmVuY2UvIi8+Ci0gICAgICAgICAgICA8aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9jb250ZW50LXR5cGUvIi8+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlZEJpbmFyeSI+Ci0gICAgICAgICAgICAgICAgPHNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6YmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGVudDptZWRpYVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iYXBwbGljYXRpb24vb2N0ZXRzdHJlYW0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0icmVmOmxvY2F0aW9uIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9zaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJSZWZlcmVuY2VkVGV4dCI+Ci0gICAgICAgICAgICAgICAgPHNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6YmFzZTY0QmluYXJ5Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGVudDptZWRpYVR5cGUgdmFsdWU9InRleHQvcGxhaW4iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIHJlZj0icmVmOmxvY2F0aW9uIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC9zaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVjaG9BdHRhY2htZW50IiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJFY2hvQXR0YWNobWVudCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJbiIgdHlwZT0idHlwZXM6UmVmZXJlbmNlZEJpbmFyeSIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkVjaG9BdHRhY2htZW50UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3V0IiB0eXBlPSJ0eXBlczpSZWZlcmVuY2VkQmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudHMiIHR5cGU9InR5cGVzOkF0dGFjaG1lbnRzIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudHNSZXNwb25zZSIgdHlwZT0idHlwZXM6QXR0YWNobWVudHMiLz4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBdHRhY2htZW50cyI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0eXBlczpSZWZlcmVuY2VkQmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0IiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NFJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZXM6YmFzZTY0T3V0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50IiB0eXBlPSJ0eXBlczpiYXNlNjRJbiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudFJlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnRSZXNwb25zZSIvPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImJhc2U2NEluIj4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkluIiB0eXBlPSJ4c2Q6YmFzZTY0QmluYXJ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iYmFzZTY0T3V0Ij4KLSAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9Ik91dCIgdHlwZT0ieHNkOmJhc2U2NEJpbmFyeSIvPgotICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHMiIHR5cGU9InR5cGVzOmVtcHR5VHlwZSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHNSZXNwb25zZSIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9InR5cGVzOmVtcHR5VHlwZSIvPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlLz4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnRBc1N0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZ1Jlc3BvbnNlIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnRBc1N0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJJbiIgdHlwZT0idHlwZXM6UmVmZXJlbmNlZFRleHQiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iT3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgIDwvc2NoZW1hPgotICAgIDwvd3NkbDp0eXBlcz4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50SW4iPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IkluIiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0F0dGFjaG1lbnRPdXQiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0F0dGFjaG1lbnRzSW4iPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9IkluIiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudHMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50c091dCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iT3V0IiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudHNSZXNwb25zZSIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NEluIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRBc0Jhc2U2NCIvPgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NE91dCI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iT3V0IiBlbGVtZW50PSJ0eXBlczpFY2hvQXR0YWNobWVudEFzQmFzZTY0UmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRJbiI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9CYXNlNjRBc0F0dGFjaG1lbnQiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRPdXQiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0Jhc2U2NEFzQXR0YWNobWVudFJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50c0luIj4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob1VucmVmQXR0YWNobWVudHMiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9VbnJlZkF0dGFjaG1lbnRzT3V0Ij4KLSAgICAgICAgPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9VbnJlZkF0dGFjaG1lbnRzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdJbiI+Ci0gICAgICAgIDx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50QXNTdHJpbmciLz4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdPdXQiPgotICAgICAgICA8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRBc1N0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm1lc3NhZ2U+Ci0gICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQXR0YWNobWVudHNQb3J0VHlwZSI+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudElucHV0IiBtZXNzYWdlPSJFY2hvQXR0YWNobWVudEluIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRPdXRwdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRPdXQiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50cyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudHNJbnB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50c0luIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRzT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50c091dCIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NCI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0SW5wdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0SW4iLz4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0T3V0cHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXQiLz4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnQiPgotICAgICAgICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudElucHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudEluIi8+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudE91dHB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50T3V0Ii8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50cyI+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50c0lucHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iRWNob1VucmVmQXR0YWNobWVudHNJbiIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9VbnJlZkF0dGFjaG1lbnRzT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9VbnJlZkF0dGFjaG1lbnRzT3V0Ii8+Ci0gICAgICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nIj4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdJbnB1dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdJbiIvPgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmdPdXRwdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRBc1N0cmluZ091dCIvPgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDwvd3NkbDpwb3J0VHlwZT4KLSAgICA8d3NkbDpiaW5kaW5nIG5hbWU9IkF0dGFjaG1lbnRzQmluZGluZyIgdHlwZT0iQXR0YWNobWVudHNQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50SW5wdXQiPgotICAgICAgICAgICAgICAgIDxkaW1lOm1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL2Nsb3NlZC1sYXlvdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsOnJlcXVpcmVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudE91dHB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvY2xvc2VkLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50cyI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c0lucHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDpyZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRzT3V0cHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDpyZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPGRpbWU6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAyLzA0L2RpbWUvY2xvc2VkLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXRwdXQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLSAgICAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRJbnB1dCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50T3V0cHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9jbG9zZWQtbGF5b3V0IgotICAgICAgICAgICAgICAgICAgICAgICAgd3NkbDpyZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob1VucmVmQXR0YWNobWVudHMiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvVW5yZWZBdHRhY2htZW50c0lucHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9vcGVuLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOmlucHV0PgotICAgICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9VbnJlZkF0dGFjaG1lbnRzT3V0cHV0Ij4KLSAgICAgICAgICAgICAgICA8ZGltZTptZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS9vcGVuLWxheW91dCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzZGw6cmVxdWlyZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50QXNTdHJpbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0gICAgICAgICAgICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nSW5wdXQiPgotICAgICAgICAgICAgICAgIDxkaW1lOm1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMi8wNC9kaW1lL2Nsb3NlZC1sYXlvdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICB3c2RsOnJlcXVpcmVkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgICAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzU3RyaW5nT3V0cHV0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkRpbWVET0NJbnRlcm9wIj4KLSAgICAgICAgPHdzZGw6cG9ydCBuYW1lPSJEaW1lRE9DU29hcFBvcnQiIGJpbmRpbmc9IkF0dGFjaG1lbnRzQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9zZXJ2aWNlcy9EaW1lRE9DU29hcFBvcnQiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9oZWFkZXJzLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9oZWFkZXJzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2JlZGYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvaGVhZGVycy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHhtbG5zOnR5cGVzPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3hzZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyI+Ci0gIDx0eXBlcz4KLSAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiPgotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUGFyYW0iIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAKLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgdHlwZT0iczpzdHJpbmciLz4KLQotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJIZWFkZXIxIiB0eXBlPSJ0eXBlczpIZWFkZXIxIi8+Ci0gICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJIZWFkZXIxIj4KLSAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InM6aW50Ii8+Ci0gICAgICAgIDwvczpzZXF1ZW5jZT4KLQk8czphbnlBdHRyaWJ1dGUvPgotICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgPHM6ZWxlbWVudCBuYW1lPSJIZWFkZXIyIiB0eXBlPSJ0eXBlczpIZWFkZXIyIi8+Ci0gICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJIZWFkZXIyIj4KLSAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJpbnQiIHR5cGU9InM6aW50Ii8+Ci0gICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgIDwvczpzZXF1ZW5jZT4KLQk8czphbnlBdHRyaWJ1dGUvPgotICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgIDwvczpzY2hlbWE+Ci0gIDwvdHlwZXM+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ0eXBlczplY2hvU3RyaW5nUGFyYW0iIG5hbWU9ImEiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgZWxlbWVudD0idHlwZXM6ZWNob1N0cmluZ1JldHVybiIgbmFtZT0icmVzdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJIZWFkZXIxIj4KLSAgICA8cGFydCBuYW1lPSJIZWFkZXIxIiBlbGVtZW50PSJ0eXBlczpIZWFkZXIxIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iSGVhZGVyMiI+Ci0gICAgPHBhcnQgbmFtZT0iSGVhZGVyMiIgZWxlbWVudD0idHlwZXM6SGVhZGVyMiIvPgotICA8L21lc3NhZ2U+Ci0gIDxwb3J0VHlwZSBuYW1lPSJSZXRIZWFkZXJQb3J0VHlwZSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZyIvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvcG9ydFR5cGU+Ci0gIDxiaW5kaW5nIG5hbWU9IlJldEhlYWRlckJpbmRpbmciIHR5cGU9InRuczpSZXRIZWFkZXJQb3J0VHlwZSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgIDxzb2FwOmhlYWRlciBtZXNzYWdlPSJ0bnM6SGVhZGVyMSIgcGFydD0iSGVhZGVyMSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgIDxzb2FwOmhlYWRlciBtZXNzYWdlPSJ0bnM6SGVhZGVyMiIgcGFydD0iSGVhZGVyMiIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotICA8L2JpbmRpbmc+Ci0gIDxzZXJ2aWNlIG5hbWU9IlJldEhlYWRlclNlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IlJldEhlYWRlclBvcnQiIGJpbmRpbmc9InRuczpSZXRIZWFkZXJCaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5qYXZhLnN1bi5jb206ODAvcm91bmQzL2dyb3VwZi9oZWFkZXJzIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2ludGVyb3B0ZXN0ZG9jbGl0LndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9pbnRlcm9wdGVzdGRvY2xpdC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNmYxYjRhLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2ludGVyb3B0ZXN0ZG9jbGl0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0U2VydmljZSIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6eHNkMT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0gICAgPHR5cGVzPgotICAgICAgICA8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy94c2QiCi0gICAgICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJBcnJheU9mc3RyaW5nX2xpdGVyYWwiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMSIgbmFtZT0ic3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPGFsbD4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyRmxvYXQiIHR5cGU9InhzZDpmbG9hdCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJJbnQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFyU3RyaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9hbGw+Ci0gICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nUGFyYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1JldHVybiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5UGFyYW0iIHR5cGU9InhzZDE6QXJyYXlPZnN0cmluZ19saXRlcmFsIi8+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdBcnJheVJldHVybiIgdHlwZT0ieHNkMTpBcnJheU9mc3RyaW5nX2xpdGVyYWwiLz4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFBhcmFtIiB0eXBlPSJ4c2QxOlNPQVBTdHJ1Y3QiLz4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cnVjdFJldHVybiIgdHlwZT0ieHNkMTpTT0FQU3RydWN0Ii8+Ci0gICAgICAgIDwvc2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ1BhcmFtIiBuYW1lPSJhIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ1JldHVybiIgbmFtZT0icmVzdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ0FycmF5UGFyYW0iIG5hbWU9ImEiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdBcnJheVJldHVybiIgbmFtZT0icmVzdWx0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJ1Y3RQYXJhbSIgbmFtZT0iYSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJ1Y3RSZXR1cm4iIG5hbWU9InJlc3VsdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVm9pZCIvPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiLz4KLQotICAgIDxwb3J0VHlwZSBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0VHlwZSI+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmciIG5hbWU9ImVjaG9TdHJpbmciLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdSZXNwb25zZSIgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJpbmdBcnJheSIgbmFtZT0iZWNob1N0cmluZ0FycmF5Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXlSZXNwb25zZSIgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJ1Y3QiIG5hbWU9ImVjaG9TdHJ1Y3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9TdHJ1Y3RSZXNwb25zZSIgbmFtZT0iZWNob1N0cnVjdFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Wb2lkIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1ZvaWQiIG5hbWU9ImVjaG9Wb2lkIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvVm9pZFJlc3BvbnNlIiBuYW1lPSJlY2hvVm9pZFJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPGJpbmRpbmcgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0UG9ydEJpbmRpbmciCi0gICAgICAgIHR5cGU9InRuczpXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9TdHJpbmdBcnJheSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQgbmFtZT0iZWNob1N0cnVjdFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9Wb2lkIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1ZvaWQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvVm9pZFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJXU0RMSW50ZXJvcFRlc3REb2NMaXRTZXJ2aWNlIj4KLSAgICAgICAgPHBvcnQgYmluZGluZz0idG5zOldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRCaW5kaW5nIgotICAgICAgICAgICAgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0UG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly9tc3NvYXBpbnRlcm9wLm9yZy9zdGt2My93c2RsL2ludGVyb3BUZXN0RG9jTGl0LndzZGwiLz4KLSAgICAgICAgPC9wb3J0PgotICAgIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9pbnRlcm9wdGVzdGRvY2xpdHBhcmFtZXRlcnMud3NkbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2ludGVyb3B0ZXN0ZG9jbGl0cGFyYW1ldGVycy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Y2QyZjUzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL2ludGVyb3B0ZXN0ZG9jbGl0cGFyYW1ldGVycy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFNlcnZpY2UiCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgeG1sbnM6U09BUC1FTkM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIHhtbG5zOnhzZDE9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcveHNkIgotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZzdHJpbmdfbGl0ZXJhbCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIiBuYW1lPSJzdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxjb21wbGV4VHlwZSBuYW1lPSJTT0FQU3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8YWxsPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJGbG9hdCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhckludCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L2FsbD4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0wIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkMTpBcnJheU9mc3RyaW5nX2xpdGVyYWwiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2QxOkFycmF5T2ZzdHJpbmdfbGl0ZXJhbCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMCIgdHlwZT0ieHNkMTpTT0FQU3RydWN0Ii8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJyZXR1cm4iIHR5cGU9InhzZDE6U09BUFN0cnVjdCIvPgotICAgICAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9Wb2lkUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgIDwvc2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZyIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJpbmdBcnJheSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1N0cnVjdCIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RydWN0UmVzcG9uc2UiPgotICAgICAgICA8cGFydCBlbGVtZW50PSJ4c2QxOmVjaG9TdHJ1Y3RSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1ZvaWQiIG5hbWU9InBhcmFtZXRlcnMiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IGVsZW1lbnQ9InhzZDE6ZWNob1ZvaWRSZXNwb25zZSIgbmFtZT0icGFyYW1ldGVycyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0UG9ydFR5cGUiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nIiBuYW1lPSJlY2hvU3RyaW5nIi8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nUmVzcG9uc2UiIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RyaW5nQXJyYXkiIG5hbWU9ImVjaG9TdHJpbmdBcnJheSIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0FycmF5UmVzcG9uc2UiIG5hbWU9ImVjaG9TdHJpbmdBcnJheVJlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJ1Y3QiPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0IiBuYW1lPSJlY2hvU3RydWN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvU3RydWN0UmVzcG9uc2UiIG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9Wb2lkIiBuYW1lPSJlY2hvVm9pZCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1ZvaWRSZXNwb25zZSIgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFBvcnRCaW5kaW5nIgotICAgICAgICB0eXBlPSJ0bnM6V1NETEludGVyb3BUZXN0RG9jTGl0UG9ydFR5cGUiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJlY2hvU3RyaW5nQXJyYXkiPgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgbmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL1dTRExJbnRlcm9wVGVzdERvY0xpdCIKLSAgICAgICAgICAgICAgICAgICAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dCBuYW1lPSJlY2hvU3RyaW5nQXJyYXlSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RydWN0Ij4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnLyIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgbmFtZT0iZWNob1N0cnVjdCI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0IG5hbWU9ImVjaG9TdHJ1Y3RSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvVm9pZCI+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy8iIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0IG5hbWU9ImVjaG9Wb2lkIj4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IG5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9XU0RMSW50ZXJvcFRlc3REb2NMaXQiCi0gICAgICAgICAgICAgICAgICAgIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQgbmFtZT0iZWNob1ZvaWRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSBuYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvV1NETEludGVyb3BUZXN0RG9jTGl0IgotICAgICAgICAgICAgICAgICAgICB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0iV1NETEludGVyb3BUZXN0RG9jTGl0U2VydmljZSI+Ci0gICAgICAgIDxwb3J0IGJpbmRpbmc9InRuczpXU0RMSW50ZXJvcFRlc3REb2NMaXRQb3J0QmluZGluZyIKLSAgICAgICAgICAgIG5hbWU9IldTRExJbnRlcm9wVGVzdERvY0xpdFBhcmFtUG9ydCI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzCi0gICAgICAgICAgICAgICAgbG9jYXRpb249Imh0dHA6Ly93d3cud2hpdGVtZXNhLm5ldC9pbnRlcm9wL3IzL2RvY2xpdHBhcmFtIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvbWltZS1kb2Mud3NkbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL21pbWUtZG9jLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjI2OTIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvbWltZS1kb2Mud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTx3c2RsOmRlZmluaXRpb25zIG5hbWU9IlNPQVBCdWlsZGVycyIKLSAgICB4bWxucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy93c2RsIiAKLSAgICB4bWxuczp0eXBlcz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy94c2QiIAotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLSAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiAKLSAgICB4bWxuczpzb2FwLWVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy93c2RsIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHNjaGVtYSAKLQkJCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMveHNkIiAKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJYXR0cmlidXRlRm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JCQotCQk8Y29tcGxleFR5cGUgbmFtZT0iYmluYXJ5Ij4KLQkJCTxzaW1wbGVDb250ZW50PgotCQkJCTxleHRlbnNpb24gYmFzZT0ieHNkOmJhc2U2NEJpbmFyeSI+Ci0JCQkJCTxhdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHNkOmFueVVSSSIvPgotCQkJCTwvZXh0ZW5zaW9uPgotCQkJPC9zaW1wbGVDb250ZW50PgotCQk8L2NvbXBsZXhUeXBlID4KLQkJCi0JCTxlbGVtZW50IG5hbWU9IkVjaG9BdHRhY2htZW50IiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudCIvPgotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudFJlc3BvbnNlIiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudFJlc3BvbnNlIi8+Ci0JCTxjb21wbGV4VHlwZSBuYW1lPSJFY2hvQXR0YWNobWVudCI+Ci0JCQk8c2VxdWVuY2U+Ci0JCQkJPGVsZW1lbnQgbmFtZT0iSW4iIHR5cGU9InR5cGVzOmJpbmFyeSIvPgotCQkJPC9zZXF1ZW5jZT4KLQkJPC9jb21wbGV4VHlwZT4KLQkJPGNvbXBsZXhUeXBlIG5hbWU9IkVjaG9BdHRhY2htZW50UmVzcG9uc2UiPgotCQkJPHNlcXVlbmNlPgotCQkJCTxlbGVtZW50IG5hbWU9Ik91dCIgdHlwZT0idHlwZXM6YmluYXJ5Ii8+Ci0JCQk8L3NlcXVlbmNlPgotCQk8L2NvbXBsZXhUeXBlPgotCQkKLQkJPGVsZW1lbnQgbmFtZT0iRWNob0F0dGFjaG1lbnRzIiB0eXBlPSJ0eXBlczpBdHRhY2htZW50cyIvPgotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudHNSZXNwb25zZSIgdHlwZT0idHlwZXM6QXR0YWNobWVudHMiLz4KLQkJPGNvbXBsZXhUeXBlIG5hbWU9IkF0dGFjaG1lbnRzIj4KLQkJCTxzZXF1ZW5jZT4KLQkJCQk8ZWxlbWVudCBuYW1lPSJJdGVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0eXBlczpiaW5hcnkiPgotCQkJCTwvZWxlbWVudD4KLQkJCTwvc2VxdWVuY2U+Ci0JCTwvY29tcGxleFR5cGU+Ci0JCQotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0IiB0eXBlPSJ0eXBlczpFY2hvQXR0YWNobWVudCIvPgotCQk8ZWxlbWVudCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0UmVzcG9uc2UiIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50UmVzcG9uc2UiLz4KLQkJCi0JCTxlbGVtZW50IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnQiIHR5cGU9InR5cGVzOkVjaG9BdHRhY2htZW50Ii8+Ci0JCTxlbGVtZW50IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRSZXNwb25zZSIgdHlwZT0idHlwZXM6RWNob0F0dGFjaG1lbnRSZXNwb25zZSIvPgotCQk8L3NjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci0JCi0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudEluIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnQiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50T3V0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50UmVzcG9uc2UiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50c0luIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJJbiIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRzIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQXR0YWNobWVudHNPdXQiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRzUmVzcG9uc2UiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRJbiI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0iSW4iIGVsZW1lbnQ9InR5cGVzOkVjaG9BdHRhY2htZW50QXNCYXNlNjQiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXQiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Ik91dCIgZWxlbWVudD0idHlwZXM6RWNob0F0dGFjaG1lbnRBc0Jhc2U2NFJlc3BvbnNlIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50SW4iPgotCQk8d3NkbDpwYXJ0IG5hbWU9IkluIiBlbGVtZW50PSJ0eXBlczpFY2hvQmFzZTY0QXNBdHRhY2htZW50Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50T3V0Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJPdXQiIGVsZW1lbnQ9InR5cGVzOkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRSZXNwb25zZSIvPgotCTwvd3NkbDptZXNzYWdlPgotCQotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IkF0dGFjaG1lbnRzUG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnQiPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRJbnB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRJbiIvPgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50T3V0cHV0IiBtZXNzYWdlPSJFY2hvQXR0YWNobWVudE91dCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnRzIj4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c0lucHV0IiBtZXNzYWdlPSJFY2hvQXR0YWNobWVudHNJbiIvPgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c091dHB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRzT3V0Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0Ij4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRJbnB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NEluIi8+Ci0JCQk8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NE91dHB1dCIgbWVzc2FnZT0iRWNob0F0dGFjaG1lbnRBc0Jhc2U2NE91dCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudCI+Ci0JCQk8d3NkbDppbnB1dCBuYW1lPSJFY2hvQmFzZTY0QXNBdHRhY2htZW50SW5wdXQiIG1lc3NhZ2U9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRJbiIvPgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRPdXRwdXQiIG1lc3NhZ2U9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRPdXQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6YmluZGluZyBuYW1lPSJBdHRhY2htZW50c0JpbmRpbmciIHR5cGU9IkF0dGFjaG1lbnRzUG9ydFR5cGUiPgotCQk8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50Ij4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzLyIvPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRJbnB1dCI+Ci0JCQkJPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPG1pbWU6Y29udGVudCBwYXJ0PSJJbiIgdHlwZT0iYXBwbGljYXRpb24vb2N0ZXRzdHJlYW0iLz4KLQkJCQkJPC9taW1lOnBhcnQ+Ci0JCQkJPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRPdXRwdXQiPgotCQkJCTxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgLz4KLQkJCQkJPC9taW1lOnBhcnQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8bWltZTpjb250ZW50IHBhcnQ9Ik91dCIgdHlwZT0iYXBwbGljYXRpb24vb2N0ZXRzdHJlYW0iLz4KLQkJCQkJPC9taW1lOnBhcnQ+Ci0JCQkJPC9taW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0F0dGFjaG1lbnRzIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL2F0dGFjaG1lbnRzLyIvPgotCQkJPHdzZGw6aW5wdXQgbmFtZT0iRWNob0F0dGFjaG1lbnRzSW5wdXQiPgotCQkJCTxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxtaW1lOmNvbnRlbnQgcGFydD0iSW4iIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCTwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50c091dHB1dCI+Ci0JCQkJPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPG1pbWU6Y29udGVudCBwYXJ0PSJPdXQiIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCTwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjQiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvYXR0YWNobWVudHMvIi8+Ci0JCQk8d3NkbDppbnB1dCBuYW1lPSJFY2hvQXR0YWNobWVudEFzQmFzZTY0SW5wdXQiPgotCQkJCTxtaW1lOm11bHRpcGFydFJlbGF0ZWQ+Ci0JCQkJCTxtaW1lOnBhcnQ+Ci0JCQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJCQk8L21pbWU6cGFydD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxtaW1lOmNvbnRlbnQgcGFydD0iSW4iIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCTwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9BdHRhY2htZW50QXNCYXNlNjRPdXRwdXQiPgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudCI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9hdHRhY2htZW50cy8iLz4KLQkJCTx3c2RsOmlucHV0IG5hbWU9IkVjaG9CYXNlNjRBc0F0dGFjaG1lbnRJbnB1dCI+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbmFtZT0iRWNob0Jhc2U2NEFzQXR0YWNobWVudE91dHB1dCI+Ci0JCQkJPG1pbWU6bXVsdGlwYXJ0UmVsYXRlZD4KLQkJCQkJPG1pbWU6cGFydD4KLQkJCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCQk8bWltZTpwYXJ0PgotCQkJCQkJPG1pbWU6Y29udGVudCBwYXJ0PSJPdXQiIHR5cGU9ImFwcGxpY2F0aW9uL29jdGV0c3RyZWFtIi8+Ci0JCQkJCTwvbWltZTpwYXJ0PgotCQkJCTwvbWltZTptdWx0aXBhcnRSZWxhdGVkPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLSAgICA8d3NkbDpzZXJ2aWNlIG5hbWU9Ik1pbWVET0NJbnRlcm9wIj4KLQkgICAgPHdzZGw6cG9ydCBuYW1lPSJNaW1lRE9DU29hcFBvcnQiIGJpbmRpbmc9IkF0dGFjaG1lbnRzQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9zZXJ2aWNlcy9NaW1lRE9DU29hcFBvcnQiLz4KLSAgICAgICAgPC93c2RsOnBvcnQ+Ci0gICAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL210b21lY2hvLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9tdG9tZWNoby53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTcwOTc4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL210b21lY2hvLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp4PSJodHRwOi8vZXhhbXBsZS5vcmcvbXRvbS9kYXRhIgotCQkJCSAgeG1sbnM6c29hcDEyPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAxMi8iIAotCQkJCSAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIAotCQkJCSAgeG1sbnM6dG5zPSJodHRwOi8vbWFydGluZ3VkZ2luLTIuZHNsLmVhc3luZXQuY28udWsvbXRvbSIKLQkJCQkgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL21hcnRpbmd1ZGdpbi0yLmRzbC5lYXN5bmV0LmNvLnVrL210b20iID4KLQotICA8d3NkbDp0eXBlcz4KLQk8eHM6c2NoZW1hIHhtbG5zOnhzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScgCi0JCQkgICB4bWxuczp4bWltZT0naHR0cDovL3d3dy53My5vcmcvMjAwNC8wNi94bWxtaW1lJwotCQkJICAgdGFyZ2V0TmFtZXNwYWNlPSdodHRwOi8vZXhhbXBsZS5vcmcvbXRvbS9kYXRhJz4KLQotCSAgPHhzOmltcG9ydCBuYW1lc3BhY2U9J2h0dHA6Ly93d3cudzMub3JnLzIwMDQvMDYveG1sbWltZScgLz4KLQotCSAgPHhzOmVsZW1lbnQgbmFtZT0nRGF0YScgPgotCQk8eHM6Y29tcGxleFR5cGU+Ci0JCSAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHM6ZXh0ZW5zaW9uIGJhc2U9J3hzOmJhc2U2NEJpbmFyeScgPgotCQkJICA8eHM6YXR0cmlidXRlIHJlZj0neG1pbWU6Y29udGVudFR5cGUnIC8+Ci0JCQk8L3hzOmV4dGVuc2lvbj4KLQkJICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0JCTwveHM6Y29tcGxleFR5cGU+Ci0JICA8L3hzOmVsZW1lbnQ+Ci0KLQkgIDx4czplbGVtZW50IG5hbWU9J0VjaG9UZXN0JyA+Ci0JCTx4czpjb21wbGV4VHlwZT4KLQkJICA8eHM6c2VxdWVuY2U+Ci0JCQk8eHM6ZWxlbWVudCByZWY9J3g6RGF0YScgbWluT2NjdXJzPScxJyBtYXhPY2N1cnM9J3VuYm91bmRlZCcgLz4KLQkJICA8L3hzOnNlcXVlbmNlPgotCQk8L3hzOmNvbXBsZXhUeXBlPgotCSAgPC94czplbGVtZW50PgotCQkKLQk8L3hzOnNjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotCQotICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9UZXN0U2luZ2xlIj4KLQk8d3NkbDpwYXJ0IG5hbWU9IlAiIGVsZW1lbnQ9Ing6RGF0YSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9IkVjaG9UZXN0TXVsdGlwbGUiPgotCTx3c2RsOnBhcnQgbmFtZT0iUCIgZWxlbWVudD0ieDpFY2hvVGVzdCIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQkKLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iRWNob1Rlc3QiPgotCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvVGVzdFNpbmdsZSI+Ci0JICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvVGVzdFNpbmdsZUlucHV0IiBtZXNzYWdlPSJ0bnM6RWNob1Rlc3RTaW5nbGUiLz4KLQkgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvVGVzdFNpbmdsZU91dHB1dCIgbWVzc2FnZT0idG5zOkVjaG9UZXN0U2luZ2xlIi8+Ci0JPC93c2RsOm9wZXJhdGlvbj4KLQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob1Rlc3RNdWx0aXBsZSI+Ci0JICA8d3NkbDppbnB1dCBuYW1lPSJFY2hvVGVzdE11bHRpcGxlSW5wdXQiIG1lc3NhZ2U9InRuczpFY2hvVGVzdE11bHRpcGxlIi8+Ci0JICA8d3NkbDpvdXRwdXQgbmFtZT0iRWNob1Rlc3RNdWx0aXBsZU91dHB1dCIgbWVzc2FnZT0idG5zOkVjaG9UZXN0TXVsdGlwbGUiLz4KLQk8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJFY2hvVGVzdCIgdHlwZT0idG5zOkVjaG9UZXN0Ij4KLQk8c29hcDEyOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJFY2hvVGVzdFNpbmdsZSI+Ci0JICA8c29hcDEyOm9wZXJhdGlvbiAvPgotCSAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob1Rlc3RTaW5nbGVJbnB1dCI+Ci0JCTxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkgIDwvd3NkbDppbnB1dD4KLQkgIDx3c2RsOm91dHB1dCBuYW1lPSJFY2hvVGVzdFNpbmdsZU91dHB1dCI+Ci0JCTxzb2FwMTI6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkgIDwvd3NkbDpvdXRwdXQ+Ci0JPC93c2RsOm9wZXJhdGlvbj4KLQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iRWNob1Rlc3RNdWx0aXBsZSI+Ci0JICA8c29hcDEyOm9wZXJhdGlvbiAvPgotCSAgPHdzZGw6aW5wdXQgbmFtZT0iRWNob1Rlc3RNdWx0aXBsZUlucHV0Ij4KLQkJPHNvYXAxMjpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCSAgPC93c2RsOmlucHV0PgotCSAgPHdzZGw6b3V0cHV0IG5hbWU9IkVjaG9UZXN0TXVsdGlwbGVPdXRwdXQiPgotCQk8c29hcDEyOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JICA8L3dzZGw6b3V0cHV0PgotCTwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotCi0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iRWNob1Rlc3QiPgotCTx3c2RsOnBvcnQgbmFtZT0iRWNob1Rlc3QiIGJpbmRpbmc9InRuczpFY2hvVGVzdCI+Ci0JICA8c29hcDEyOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9tYXJ0aW5ndWRnaW4tMi5kc2wuZWFzeW5ldC5jby51ay9kb3RuZXQvbXRvbS9tdG9tZWNoby5hc2h4IiAvPgotCTwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLQotPC93c2RsOmRlZmluaXRpb25zPgkKZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL25vLXNlcnZpY2Uud3NkbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL25vLXNlcnZpY2Uud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmOWYxNC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9uby1zZXJ2aWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08d3NkbDpkZWZpbml0aW9ucwotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9jZGRsbS9kZXBsb3lhcGkvMjAwNS8wMi93c2RsIgotICB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9jZGRsbS9kZXBsb3lhcGkvMjAwNS8wMi93c2RsIgotICB4bWxuczphcGk9Imh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9jZGRsbS9kZXBsb3lhcGkvMjAwNS8wMiIKLSAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICB4bWxuczp3c2E9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDMvYWRkcmVzc2luZyIKLSAgPgotICAKLSAgIDx3c2RsOnR5cGVzPgotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5ncmlkZm9ydW0ub3JnL2NkZGxtL2RlcGxveWFwaS8yMDA1LzAyIgotICAgICAgeG1sbnM9Imh0dHA6Ly93d3cuZ3JpZGZvcnVtLm9yZy9jZGRsbS9kZXBsb3lhcGkvMjAwNS8wMiIKLSAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLSAgICAKLSAgICAKLSAgICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYm91bmRlZFhNTEFueU5hbWVzcGFjZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDphbnkgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVhdGVSZXF1ZXN0Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIFRoaXMgaXMgb3VyIHJlcXVlc3QgdG8gY3JlYXRlIGEgc3lzdGVtCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJob3N0bmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcmVhdGVSZXNwb25zZSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICBUaGlzIGlzIG91ciBkZXBsb3ltZW50IHJlc3BvbnNlLgotICAgICAgICAgICAgICBJdCBjb25zaXN0cyBvZiBhIHJlZmVyZW5jZSB0byB0aGUgc3lzdGVtLCAKLSAgICAgICAgICAgICAgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBkaXJlY3RseQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iUmVzb3VyY2VJZCIgdHlwZT0ieHNkOmFueVVSSSIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN5c3RlbVJlZmVyZW5jZSIgdHlwZT0iYXBpOnVuYm91bmRlZFhNTEFueU5hbWVzcGFjZSIvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAKLSAgICA8L3hzZDpzY2hlbWE+Ci0gICAgCi0gICA8L3dzZGw6dHlwZXM+Ci0gIAotICAgCi0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iY3JlYXRlUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJhcGk6Y3JlYXRlUmVxdWVzdCIgbmFtZT0iY3JlYXRlUmVxdWVzdCIvPgotICA8L3dzZGw6bWVzc2FnZT4KLQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImNyZWF0ZVJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImFwaTpjcmVhdGVSZXNwb25zZSIgbmFtZT0iY3JlYXRlUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIAotIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlBvcnRhbEVQUiIKLSAgICA+Ci0gICAgCi0gICAgPCEtLSBjcmVhdGUgLS0+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNyZWF0ZSI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6Y3JlYXRlUmVxdWVzdCIgbmFtZT0iQ3JlYXRlUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpjcmVhdGVSZXNwb25zZSIgbmFtZT0iQ3JlYXRlUmVzcG9uc2UiLz4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9IkRlcGxveW1lbnRGYXVsdCIKLSAgICAgICAgbWVzc2FnZT0idG5zOkRlcGxveW1lbnRGYXVsdCIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgCi0gICAgPC93c2RsOnBvcnRUeXBlPgotICAKLSAgPHdzZGw6YmluZGluZyBuYW1lPSJQb3J0YWxFUFJCaW5kaW5nIiB0eXBlPSJ0bnM6UG9ydGFsRVBSIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCi0gICAgICB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ3JlYXRlIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9IkNyZWF0ZVJlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJDcmVhdGVSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLTwhLS0gICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iRGVwbG95bWVudEZhdWx0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IG5hbWU9IkRlcGxveW1lbnRGYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+IC0tPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgCi0gIDwvd3NkbDpiaW5kaW5nPgotICAgICAgCi0gIDwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3BpbmctbW9kLnhzZCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3BpbmctbW9kLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE5MzcyNi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLW1vZC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgICAgICAgPHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCIvPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJQaW5nIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0idG5zOnBpbmciLz4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9InBpbmciPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0aWNrZXQiIHR5cGU9InRuczp0aWNrZXRUeXBlIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRleHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9InRpY2tldFR5cGUiPgotICAgICAgICAgICAgICAgIDxzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmV4dGVuc2lvbiBiYXNlPSJzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8czphdHRyaWJ1dGUgcmVmPSJzMTpJZCIvPgotICAgICAgICAgICAgICAgICAgICA8L3M6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgIDwvczpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBuYW1lPSJQaW5nUmVzcG9uc2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6cGluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJwaW5nUmVzcG9uc2UiPgotICAgICAgICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0ZXh0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgIDwvczpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLW1vZGlmaWVkLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLW1vZGlmaWVkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzkzYzYuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy1tb2RpZmllZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zOnMxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIgotICAgICAgICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIKLSAgICAgICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzOnNjaGVtYT4KLSAgICAgICA8czppbXBvcnQKLSAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciIAotICAgICAgICAgc2NoZW1hTG9jYXRpb249InBpbmctbW9kLnhzZCIgLz4KLSAgICAgPC9zOnNjaGVtYT4KLQotICAgICAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI+Ci0gICAgICAgICAgICA8czphdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgIDwvczpzY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBpbmciIGVsZW1lbnQ9InRuczpQaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IlBpbmdSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBpbmdSZXNwb25zZSIgZWxlbWVudD0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iUGluZ1BvcnQiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpQaW5nUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UGluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPGJpbmRpbmcgbmFtZT0iUGluZ0JpbmRpbmciIHR5cGU9InRuczpQaW5nUG9ydCI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IlBpbmciIHN0eWxlPSJkb2N1bWVudCIvPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvYmluZGluZz4KLSAgICA8c2VydmljZSBuYW1lPSJQaW5nU2VydmljZSI+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmcxIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmcxIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzIiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzIiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nMmEiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzJhIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzMiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzMiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nNCIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nNCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmc1IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1Bpbmc1Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzYiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzYiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nNyIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nNyIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlNUUGluZzEiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvU1RQaW5nMSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlNUUGluZzMiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvU1RQaW5nMyIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlNUUGluZzQiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvU1RQaW5nNCIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIAotICAgIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLXVuYm91bmQud3NkbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3BpbmctdW5ib3VuZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTI2NjFkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3BpbmctdW5ib3VuZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08ZGVmaW5pdGlvbnMgeG1sbnM6czE9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiCi0gICAgICAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIKLSAgICAgICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgIHhtbG5zOnRucz0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgICAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iCi0gICAgICAgICAgICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIgotICAgICAgICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iCi0gICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyIKLSAgICAgICAgICAgICB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIj4KLSAgICAgICAgICAgIDxzOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiLz4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iUGluZyIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpwaW5nIi8+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJwaW5nIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0idGlja2V0IiB0eXBlPSJ0bnM6dGlja2V0VHlwZSIvPgotICAgICAgICAgICAgICAgICAgICA8czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJ0ZXh0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czpjb21wbGV4VHlwZSBuYW1lPSJ0aWNrZXRUeXBlIj4KLSAgICAgICAgICAgICAgICA8czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICA8czpleHRlbnNpb24gYmFzZT0iczpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHM6YXR0cmlidXRlIHJlZj0iczE6SWQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICA8L3M6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDxzOmVsZW1lbnQgbmFtZT0iUGluZ1Jlc3BvbnNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0idG5zOnBpbmdSZXNwb25zZSIvPgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0icGluZ1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGV4dCIgbmlsbGFibGU9InRydWUiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICA8L3M6c2NoZW1hPgotICAgICAgICA8czpzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI+Ci0gICAgICAgICAgICA8czphdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgIDwvczpzY2hlbWE+Ci0gICAgPC90eXBlcz4KLSAgICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBpbmciIGVsZW1lbnQ9InRuczpQaW5nIi8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IlBpbmdSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBpbmdSZXNwb25zZSIgZWxlbWVudD0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8cG9ydFR5cGUgbmFtZT0iUGluZ1BvcnQiPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9IlBpbmciPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczpQaW5nUmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6UGluZ1Jlc3BvbnNlIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotICAgIDwvcG9ydFR5cGU+Ci0gICAgPCEtLSBCaW5kaW5ncyBhcmUgcmVtb3ZlZCAtLT4KLTwvZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9waW5nLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMmM5NzguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvcGluZy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zIHhtbG5zOnMxPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIgotICAgICAgICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iCi0gICAgICAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly94bWxzb2FwLm9yZy9QaW5nIgotICAgICAgICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIgotICAgICAgICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIKLSAgICAgICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3htbHNvYXAub3JnL1BpbmciCi0gICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8dHlwZXM+Ci0gICAgICAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8veG1sc29hcC5vcmcvUGluZyI+Ci0gICAgICAgICAgICA8czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3MvMjAwNC8wMS9vYXNpcy0yMDA0MDEtd3NzLXdzc2VjdXJpdHktdXRpbGl0eS0xLjAueHNkIi8+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IlBpbmciIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ0bnM6cGluZyIvPgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0icGluZyI+Ci0gICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRpY2tldCIgdHlwZT0idG5zOnRpY2tldFR5cGUiLz4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIgbmFtZT0idGV4dCIgbmlsbGFibGU9InRydWUiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgPC9zOnNlcXVlbmNlPgotICAgICAgICAgICAgPC9zOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHM6Y29tcGxleFR5cGUgbmFtZT0idGlja2V0VHlwZSI+Ci0gICAgICAgICAgICAgICAgPHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgPHM6ZXh0ZW5zaW9uIGJhc2U9InM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzOmF0dHJpYnV0ZSByZWY9InMxOklkIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvczpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgPC9zOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICA8L3M6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8czplbGVtZW50IG5hbWU9IlBpbmdSZXNwb25zZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InRuczpwaW5nUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxzOmNvbXBsZXhUeXBlIG5hbWU9InBpbmdSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxzOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9IjEiIG5hbWU9InRleHQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgIDwvczpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgICAgPC9zOnNjaGVtYT4KLSAgICAgICAgPHM6c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiPgotICAgICAgICAgICAgPHM6YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJzOnN0cmluZyIvPgotICAgICAgICA8L3M6c2NoZW1hPgotICAgIDwvdHlwZXM+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iUGluZ1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwaW5nIiBlbGVtZW50PSJ0bnM6UGluZyIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJQaW5nUmVzcG9uc2UiPgotICAgICAgICA8cGFydCBuYW1lPSJwaW5nUmVzcG9uc2UiIGVsZW1lbnQ9InRuczpQaW5nUmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPHBvcnRUeXBlIG5hbWU9IlBpbmdQb3J0Ij4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJQaW5nIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6UGluZ1JlcXVlc3QiLz4KLSAgICAgICAgICAgIDxvdXRwdXQgbWVzc2FnZT0idG5zOlBpbmdSZXNwb25zZSIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L3BvcnRUeXBlPgotICAgIDxiaW5kaW5nIG5hbWU9IlBpbmdCaW5kaW5nIiB0eXBlPSJ0bnM6UGluZ1BvcnQiPgotICAgICAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJQaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJQaW5nIiBzdHlsZT0iZG9jdW1lbnQiLz4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICA8L29wZXJhdGlvbj4KLSAgICA8L2JpbmRpbmc+Ci0gICAgPHNlcnZpY2UgbmFtZT0iUGluZ1NlcnZpY2UiPgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nMSIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nMSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmcyIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmcyIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzJhIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmcyYSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmczIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1BpbmczIi8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzQiIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzQiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJQaW5nNSIgYmluZGluZz0idG5zOlBpbmdCaW5kaW5nIj4KLSAgICAgICAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6OTA4MC9waW5nc2VydmljZS9QaW5nNSIvPgotICAgICAgICA8L3BvcnQ+Ci0gICAgICAgIDxwb3J0IG5hbWU9IlBpbmc2IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1Bpbmc2Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICAgICAgPHBvcnQgbmFtZT0iUGluZzciIGJpbmRpbmc9InRuczpQaW5nQmluZGluZyI+Ci0gICAgICAgICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjkwODAvcGluZ3NlcnZpY2UvUGluZzciLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTVFBpbmcxIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1NUUGluZzEiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTVFBpbmczIiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1NUUGluZzMiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICA8cG9ydCBuYW1lPSJTVFBpbmc0IiBiaW5kaW5nPSJ0bnM6UGluZ0JpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL3BpbmdzZXJ2aWNlL1NUUGluZzQiLz4KLSAgICAgICAgPC9wb3J0PgotICAgICAgICAKLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvc2ltcGxlLWRvYy1saXRlcmFsLndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9zaW1wbGUtZG9jLWxpdGVyYWwud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTM1N2I1YS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy9zaW1wbGUtZG9jLWxpdGVyYWwud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxkZWZpbml0aW9ucwotICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICB4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvd3NkbCIKLSAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgeG1sbnM6bnMyPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgIHhtbG5zOm5zMz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9wYXJ0IgotICAgIHhtbG5zOm5zND0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3dzZGwiPgotICAgIDx0eXBlcz4KLSAgICAgICAgPHNjaGVtYQotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIgotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzIj4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZTdHJpbmciPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZJbnQiPgotICAgICAgICAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLQotICAgICAgICAgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFycmF5T2ZGbG9hdCI+Ci0gICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgIDwvY29tcGxleFR5cGU+Ci0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlIG5hbWU9IkVudW0iPgotICAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6aW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iMiIvPgotICAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0KLSAgICAgICAgPC9zY2hlbWE+Ci0KLSAgICAgICAgPHNjaGVtYQotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcGFydCI+Ci0KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkVtcHR5UGFydCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iU3RyaW5nUGFydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iSW50UGFydCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRmxvYXRQYXJ0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9IkFycmF5T2ZTdHJpbmdQYXJ0IiB0eXBlPSJuczI6QXJyYXlPZlN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iQXJyYXlPZkludFBhcnQiIHR5cGU9Im5zMjpBcnJheU9mSW50Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJBcnJheU9mRmxvYXRQYXJ0IiB0eXBlPSJuczI6QXJyYXlPZkZsb2F0Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJTdHJpbmcyUGFydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iRW51bVBhcnQiIHR5cGU9Im5zMjpFbnVtIi8+Ci0KLSAgICAgICAgPC9zY2hlbWE+Ci0KLSAgICAgICAgPHNjaGVtYQotICAgICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSIKLSAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcy9yZXF1ZXN0cmVzcG9uc2UiPgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvRW1wdHlGYXVsdFJlcXVlc3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZS8+Ci0gICAgICAgICAgICA8L2VsZW1lbnQ+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvRW1wdHlGYXVsdFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUvPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nRmF1bHRSZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvU3RyaW5nRmF1bHRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob0ludEFycmF5RmF1bHRSZXF1ZXN0IiB0eXBlPSJuczI6QXJyYXlPZkludCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob0ludEFycmF5RmF1bHRSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlcXVlc3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0id2hpY2hGYXVsdCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9Im5zMjpBcnJheU9mRmxvYXQiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUvPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ3aGljaEZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ieHNkOmZsb2F0Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTMiIHR5cGU9Im5zMjpBcnJheU9mU3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLSAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlLz4KLSAgICAgICAgICAgIDwvZWxlbWVudD4KLQotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzM1JlcXVlc3QiPgotICAgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0id2hpY2hGYXVsdCIgdHlwZT0ieHNkOmludCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0icGFyYW0xIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzM1Jlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUvPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHM0UmVxdWVzdCI+Ci0gICAgICAgICAgICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ3aGljaEZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ibnMyOkVudW0iLz4KLSAgICAgICAgICAgICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC9lbGVtZW50PgotICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzNFJlc3BvbnNlIj4KLSAgICAgICAgICAgICAgICA8Y29tcGxleFR5cGUvPgotICAgICAgICAgICAgPC9lbGVtZW50PgotCi0gICAgICAgIDwvc2NoZW1hPgotICAgIDwvdHlwZXM+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRW1wdHlGYXVsdFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9FbXB0eUZhdWx0UmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvRW1wdHlGYXVsdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvRW1wdHlGYXVsdFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0ZhdWx0UmVxdWVzdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob1N0cmluZ0ZhdWx0UmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nRmF1bHRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob1N0cmluZ0ZhdWx0UmVzcG9uc2UiLz4KLSAgICA8L21lc3NhZ2U+Ci0KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50QXJyYXlGYXVsdFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9JbnRBcnJheUZhdWx0UmVxdWVzdCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvSW50QXJyYXlGYXVsdFJlc3BvbnNlIj4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvSW50QXJyYXlGYXVsdFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czJSZXF1ZXN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzMlJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzM1JlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czNSZXF1ZXN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czNSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzM1Jlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzNFJlcXVlc3QiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czRSZXF1ZXN0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czRSZXNwb25zZSI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzNFJlc3BvbnNlIi8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPCEtLSBGYXVsdCBtZXNzYWdlcyAtLT4KLSAgICA8bWVzc2FnZSBuYW1lPSJFbXB0eUZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zMzpFbXB0eVBhcnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iU3RyaW5nRmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0MiIgZWxlbWVudD0ibnMzOlN0cmluZ1BhcnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iSW50RmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0MyIgZWxlbWVudD0ibnMzOkludFBhcnQiLz4KLSAgICA8L21lc3NhZ2U+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iRmxvYXRGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcnQ0IiBlbGVtZW50PSJuczM6RmxvYXRQYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IlN0cmluZ0FycmF5RmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0NSIgZWxlbWVudD0ibnMzOkFycmF5T2ZTdHJpbmdQYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkludEFycmF5RmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0NiIgZWxlbWVudD0ibnMzOkFycmF5T2ZJbnRQYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotICAgIDxtZXNzYWdlIG5hbWU9IkZsb2F0QXJyYXlGYXVsdCI+Ci0gICAgICAgIDxwYXJ0IG5hbWU9InBhcnQ3IiBlbGVtZW50PSJuczM6QXJyYXlPZkZsb2F0UGFydCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8IS0tCi0gICAgICAgIFBhcnQgbmFtZSBzYW1lIGFzIGluIEZhdWx0MiBtZXNzYWdlCi0gICAgLS0+Ci0gICAgPG1lc3NhZ2UgbmFtZT0iU3RyaW5nMkZhdWx0Ij4KLSAgICAgICAgPHBhcnQgbmFtZT0icGFydDIiIGVsZW1lbnQ9Im5zMzpTdHJpbmcyUGFydCIvPgotICAgIDwvbWVzc2FnZT4KLSAgICA8bWVzc2FnZSBuYW1lPSJFbnVtRmF1bHQiPgotICAgICAgICA8cGFydCBuYW1lPSJwYXJ0OSIgZWxlbWVudD0ibnMzOkVudW1QYXJ0Ii8+Ci0gICAgPC9tZXNzYWdlPgotCi0gICAgPHBvcnRUeXBlIG5hbWU9IlNpbXBsZURvY0xpdFBvcnRUeXBlIj4KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgVGhyb3dzIGFuIGVtcHR5IGZhdWx0Ci0gICAgICAgIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9FbXB0eUZhdWx0IiBwYXJhbWV0ZXJPcmRlcj0iIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0VtcHR5RmF1bHRSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRW1wdHlGYXVsdFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiIG1lc3NhZ2U9InRuczpFbXB0eUZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRocm93cyBmYXVsdCB3aXRoIHhzZDpzdHJpbmcgcGFyYW1ldGVyCi0gICAgICAgIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmdGYXVsdCIgcGFyYW1ldGVyT3JkZXI9InBhcmFtIj4KLSAgICAgICAgICAgIDxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0ZhdWx0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1N0cmluZ0ZhdWx0UmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCIgbWVzc2FnZT0idG5zOlN0cmluZ0ZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRocm93cyBmYXVsdCB3aXRoIHhzZDppbnRbXSBwYXJhbWV0ZXIKLSAgICAgICAgLS0+Ci0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0ludEFycmF5RmF1bHQiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9JbnRBcnJheUZhdWx0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0ludEFycmF5RmF1bHRSZXNwb25zZSIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0IiBtZXNzYWdlPSJ0bnM6SW50QXJyYXlGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaHJvd3MgZW1wdHkgZmF1bHQsIGZhdWx0IHdpdGggYSB4c2Q6c3RyaW5nCi0gICAgICAgICAgICBwYXJhbWV0ZXIgYW5kIGZhdWx0IHdpdGggeHNkOmZsb2F0W10gcGFyYW1ldGVyCi0gICAgICAgIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czEiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMxUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiIG1lc3NhZ2U9InRuczpFbXB0eUZhdWx0Ii8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIiBtZXNzYWdlPSJ0bnM6U3RyaW5nRmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDMiIG1lc3NhZ2U9InRuczpGbG9hdEFycmF5RmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPCEtLQotICAgICAgICAgICAgVGhyb3dzIGZhdWx0IHdpdGggeHNkOnN0cmluZyBwYXJhbWV0ZXIsIGZhdWx0IHdpdGgKLSAgICAgICAgICAgIHhzZDpmbG9hdCBwYXJhbWV0ZXIgYW5kIGZhdWx0IHdpdGggeHNkOnN0cmluZ1tdCi0gICAgICAgICAgICBwYXJhbWV0ZXJzCi0gICAgICAgIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czIiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czJSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMyUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiIG1lc3NhZ2U9InRuczpTdHJpbmdGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiIgbWVzc2FnZT0idG5zOkZsb2F0RmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDMiIG1lc3NhZ2U9InRuczpTdHJpbmdBcnJheUZhdWx0Ii8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDwhLS0KLSAgICAgICAgICAgIFRocm93cyB0d28gZmF1bHRzLCBlYWNoIHdpdGggeHNkOnN0cmluZyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBhbmQgc2FtZSBwYXJ0IG5hbWVzCi0gICAgICAgIC0tPgotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czMiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0gICAgICAgICAgICA8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czNSZXF1ZXN0Ii8+Ci0gICAgICAgICAgICA8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMzUmVzcG9uc2UiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiIG1lc3NhZ2U9InRuczpTdHJpbmdGYXVsdCIvPgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiIgbWVzc2FnZT0idG5zOlN0cmluZzJGYXVsdCIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8IS0tCi0gICAgICAgICAgICBUaHJvd3MgZmF1bHQgd2l0aCB4c2Q6aW50IHBhcmFtZXRlciBhbmQgZmF1bHQgd2l0aCBhbgotICAgICAgICAgICAgaW50IGVudW1lcmF0aW9uIHBhcmFtZXRlcgotICAgICAgICAtLT4KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHM0IiBwYXJhbWV0ZXJPcmRlcj0icGFyYW0iPgotICAgICAgICAgICAgPGlucHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHM0UmVxdWVzdCIvPgotICAgICAgICAgICAgPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzNFJlc3BvbnNlIi8+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiBtZXNzYWdlPSJ0bnM6SW50RmF1bHQiLz4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiIG1lc3NhZ2U9InRuczpFbnVtRmF1bHQiLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0gICAgPC9wb3J0VHlwZT4KLQotICAgIDxiaW5kaW5nIG5hbWU9IlNpbXBsZURvY0xpdEJpbmRpbmciIHR5cGU9InRuczpTaW1wbGVEb2NMaXRQb3J0VHlwZSI+Ci0gICAgICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob0VtcHR5RmF1bHQiPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0IiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9yNC9ncm91cGcvIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZ0ZhdWx0Ij4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcjQvZ3JvdXBnLyIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9JbnRBcnJheUZhdWx0Ij4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0Ij4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdCIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvcjQvZ3JvdXBnLyIvPgotICAgICAgICA8L29wZXJhdGlvbj4KLQotICAgICAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czEiPgotICAgICAgICAgICAgPGlucHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2lucHV0PgotICAgICAgICAgICAgPG91dHB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9vdXRwdXQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIj4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MyI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy9yNC9ncm91cGcvIi8+Ci0gICAgICAgIDwvb3BlcmF0aW9uPgotCi0gICAgICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMiI+Ci0gICAgICAgICAgICA8aW5wdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvaW5wdXQ+Ci0gICAgICAgICAgICA8b3V0cHV0PgotICAgICAgICAgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L291dHB1dD4KLSAgICAgICAgICAgIDxmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDEiPgotICAgICAgICAgICAgICAgIDxzb2FwOmZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICAgICA8L2ZhdWx0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MiI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQzIj4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3I0L2dyb3VwZy8iLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMzIj4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIj4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3I0L2dyb3VwZy8iLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICAgICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHM0Ij4KLSAgICAgICAgICAgIDxpbnB1dD4KLSAgICAgICAgICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9pbnB1dD4KLSAgICAgICAgICAgIDxvdXRwdXQ+Ci0gICAgICAgICAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvb3V0cHV0PgotICAgICAgICAgICAgPGZhdWx0IG5hbWU9IlNpbXBsZUZhdWx0MSI+Ci0gICAgICAgICAgICAgICAgPHNvYXA6ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQxIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgICAgIDwvZmF1bHQ+Ci0gICAgICAgICAgICA8ZmF1bHQgbmFtZT0iU2ltcGxlRmF1bHQyIj4KLSAgICAgICAgICAgICAgICA8c29hcDpmYXVsdCBuYW1lPSJTaW1wbGVGYXVsdDIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgICAgPC9mYXVsdD4KLSAgICAgICAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3I0L2dyb3VwZy8iLz4KLSAgICAgICAgPC9vcGVyYXRpb24+Ci0KLSAgICA8L2JpbmRpbmc+Ci0KLSAgICA8c2VydmljZSBuYW1lPSJTaW1wbGVEb2NMaXRTZXJ2aWNlIj4KLSAgICAgICAgPHBvcnQgbmFtZT0iU2ltcGxlRG9jTGl0UG9ydCIgYmluZGluZz0idG5zOlNpbXBsZURvY0xpdEJpbmRpbmciPgotICAgICAgICAgICAgPHNvYXA6YWRkcmVzcwotICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODAvYXhpcy9zZXJ2aWNlcy9TaW1wbGVEb2NMaXRQb3J0Ii8+Ci0gICAgICAgIDwvcG9ydD4KLSAgICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy91bnJlZmVyZW5jZWQud3NkbCBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3VucmVmZXJlbmNlZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzcyZTE3Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3VucmVmZXJlbmNlZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGRlZmluaXRpb25zCi0JeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy93c2RsIgotCXhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQl4bWxuczpuczI9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMiCi0JeG1sbnM6bnMzPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiCi0JeG1sbnM6bnM0PSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvd3NkbCI+Ci0KLQk8dHlwZXM+Ci0JCTxzY2hlbWEKLQkJCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCXhtbG5zOnRucz0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NvYXBpbnRlcm9wLm9yZy90eXBlcyI+Ci0KLQkJCTxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iU09BUFN0cnVjdCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJ2YXJTdHJpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPGVsZW1lbnQgbmFtZT0idmFySW50IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCTxlbGVtZW50IG5hbWU9InZhckZsb2F0IiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLQkJCQk8L3NlcXVlbmNlPgotCQkJPC9jb21wbGV4VHlwZT4KLQotCQkJPGNvbXBsZXhUeXBlIG5hbWU9IlNPQVBTdHJ1Y3RGYXVsdCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJzb2FwU3RydWN0IiB0eXBlPSJ0bnM6U09BUFN0cnVjdCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iQmFzZVN0cnVjdCI+Ci0JCQkJPHNlcXVlbmNlPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJzdHJ1Y3RNZXNzYWdlIiB0eXBlPSJ0bnM6U09BUFN0cnVjdCIvPgotCQkJCQk8ZWxlbWVudCBuYW1lPSJzaG9ydE1lc3NhZ2UiIHR5cGU9InhzZDpzaG9ydCIvPgotCQkJCTwvc2VxdWVuY2U+Ci0JCQk8L2NvbXBsZXhUeXBlPgotCi0JCQk8Y29tcGxleFR5cGUgbmFtZT0iRXh0ZW5kZWRTdHJ1Y3QiPgotCQkJCTxjb21wbGV4Q29udGVudD4KLQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJ0bnM6QmFzZVN0cnVjdCI+Ci0JCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQkJPGVsZW1lbnQgbmFtZT0ic3RyaW5nTWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9ImludE1lc3NhZ2UiIHR5cGU9InhzZDppbnQiLz4KLQkJCQkJCQk8ZWxlbWVudCBuYW1lPSJhbm90aGVySW50TWVzc2FnZSIgdHlwZT0ieHNkOmludCIvPgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJPC9jb21wbGV4Q29udGVudD4KLQkJCTwvY29tcGxleFR5cGU+Ci0KLQkJCTxjb21wbGV4VHlwZSBuYW1lPSJNb3JlRXh0ZW5kZWRTdHJ1Y3QiPgotCQkJCTxjb21wbGV4Q29udGVudD4KLQkJCQkJPGV4dGVuc2lvbiBiYXNlPSJ0bnM6RXh0ZW5kZWRTdHJ1Y3QiPgotCQkJCQkJPHNlcXVlbmNlPgotCQkJCQkJCTxlbGVtZW50IG5hbWU9ImJvb2xlYW5NZXNzYWdlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQkJPC9leHRlbnNpb24+Ci0JCQkJPC9jb21wbGV4Q29udGVudD4KLQkJCTwvY29tcGxleFR5cGU+Ci0KLQkJPC9zY2hlbWE+Ci0KLQkJPHNjaGVtYQotCQkJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJeG1sbnM6dG5zPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3BhcnQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcGFydCI+Ci0KLQkJCTxlbGVtZW50IG5hbWU9IlNPQVBTdHJ1Y3RGYXVsdFBhcnQiIHR5cGU9Im5zMjpTT0FQU3RydWN0RmF1bHQiLz4KLQkJCTxlbGVtZW50IG5hbWU9IkJhc2VTdHJ1Y3RQYXJ0IiB0eXBlPSJuczI6QmFzZVN0cnVjdCIvPgotCQkJPGVsZW1lbnQgbmFtZT0iRXh0ZW5kZWRTdHJ1Y3RQYXJ0IiB0eXBlPSJuczI6RXh0ZW5kZWRTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9Ik1vcmVFeHRlbmRlZFN0cnVjdFBhcnQiIHR5cGU9Im5zMjpNb3JlRXh0ZW5kZWRTdHJ1Y3QiLz4KLQotCQk8L3NjaGVtYT4KLQotCQk8c2NoZW1hCi0JCQl4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQl4bWxuczp0bnM9Imh0dHA6Ly9zb2FwaW50ZXJvcC5vcmcvdHlwZXMvcmVxdWVzdHJlc3BvbnNlIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc29hcGludGVyb3Aub3JnL3R5cGVzL3JlcXVlc3RyZXNwb25zZSI+Ci0KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXF1ZXN0IiB0eXBlPSJuczI6U09BUFN0cnVjdCIvPgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob1NPQVBTdHJ1Y3RGYXVsdFJlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGUvPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvQmFzZVN0cnVjdEZhdWx0UmVxdWVzdCIgdHlwZT0ibnMyOkJhc2VTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQkJPGVsZW1lbnQgbmFtZT0iZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXF1ZXN0IiB0eXBlPSJuczI6RXh0ZW5kZWRTdHJ1Y3QiLz4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVzcG9uc2UiPgotCQkJCTxjb21wbGV4VHlwZS8+Ci0JCQk8L2VsZW1lbnQ+Ci0KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ij4KLQkJCQk8Y29tcGxleFR5cGU+Ci0JCQkJCTxzZXF1ZW5jZT4KLQkJCQkJCTxlbGVtZW50IG5hbWU9IndoaWNoRmF1bHQiIHR5cGU9InhzZDppbnQiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InBhcmFtMSIgdHlwZT0ibnMyOlNPQVBTdHJ1Y3QiLz4KLQkJCQkJCTxlbGVtZW50IG5hbWU9InBhcmFtMiIgdHlwZT0ibnMyOkJhc2VTdHJ1Y3QiLz4KLQkJCQkJPC9zZXF1ZW5jZT4KLQkJCQk8L2NvbXBsZXhUeXBlPgotCQkJPC9lbGVtZW50PgotCQkJPGVsZW1lbnQgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIj4KLQkJCQk8Y29tcGxleFR5cGUvPgotCQkJPC9lbGVtZW50PgotCi0JCQk8ZWxlbWVudCBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyUmVxdWVzdCI+Ci0JCQkJPGNvbXBsZXhUeXBlPgotCQkJCQk8c2VxdWVuY2U+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJ3aGljaEZhdWx0IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTEiIHR5cGU9Im5zMjpCYXNlU3RydWN0Ii8+Ci0JCQkJCQk8ZWxlbWVudCBuYW1lPSJwYXJhbTIiIHR5cGU9Im5zMjpFeHRlbmRlZFN0cnVjdCIvPgotCQkJCQkJPGVsZW1lbnQgbmFtZT0icGFyYW0zIiB0eXBlPSJuczI6TW9yZUV4dGVuZGVkU3RydWN0Ii8+Ci0JCQkJCTwvc2VxdWVuY2U+Ci0JCQkJPC9jb21wbGV4VHlwZT4KLQkJCTwvZWxlbWVudD4KLQkJCTxlbGVtZW50IG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSI+Ci0JCQkJPGNvbXBsZXhUeXBlLz4KLQkJCTwvZWxlbWVudD4KLQotCQk8L3NjaGVtYT4KLQk8L3R5cGVzPgotCi0gICAgPCEtLSBTb21lIHBhcnQgcmVmZXJlbmNlcyBhcmUgIG1pc3NwZWxsZWQtLT4KLSAgICA8bWVzc2FnZSBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0UmVxdWVzdCI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob1NPQVBTdHJ1Y3RGYXVsdFJlcXVlc3QxIi8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHRSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob1NPQVBTdHJ1Y3RGYXVsdFJlc3BvbnNlMiIvPgotCTwvbWVzc2FnZT4KLQotCTxtZXNzYWdlIG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHRSZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvQmFzZVN0cnVjdEZhdWx0UmVxdWVzdDEiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvQmFzZVN0cnVjdEZhdWx0UmVzcG9uc2UiLz4KLQk8L21lc3NhZ2U+Ci0KLQk8bWVzc2FnZSBuYW1lPSJlY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0UmVxdWVzdCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJlY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icGFyYW0iIGVsZW1lbnQ9Im5zNDplY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlc3BvbnNlIi8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czFSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzMVJlc3BvbnNlIi8+Ci0JPC9tZXNzYWdlPgotCi0JPG1lc3NhZ2UgbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJwYXJhbSIgZWxlbWVudD0ibnM0OmVjaG9NdWx0aXBsZUZhdWx0czJSZXF1ZXN0Ii8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSI+Ci0JCTxwYXJ0IG5hbWU9InBhcmFtIiBlbGVtZW50PSJuczQ6ZWNob011bHRpcGxlRmF1bHRzMlJlc3BvbnNlIi8+Ci0JPC9tZXNzYWdlPgotCi0JPCEtLSBGYXVsdCBtZXNzYWdlcyAtLT4KLQk8bWVzc2FnZSBuYW1lPSJTT0FQU3RydWN0RmF1bHQiPgotCQk8cGFydCBuYW1lPSJwYXJ0MyIgZWxlbWVudD0ibnMzOlNPQVBTdHJ1Y3RGYXVsdFBhcnQiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iQmFzZVN0cnVjdEZhdWx0Ij4KLQkJPHBhcnQgbmFtZT0icGFydDEiIGVsZW1lbnQ9Im5zMzpCYXNlU3RydWN0UGFydCIvPgotCTwvbWVzc2FnZT4KLQk8bWVzc2FnZSBuYW1lPSJFeHRlbmRlZFN0cnVjdEZhdWx0Ij4KLQkJPHBhcnQgbmFtZT0icGFydDIiIGVsZW1lbnQ9Im5zMzpFeHRlbmRlZFN0cnVjdFBhcnQiLz4KLQk8L21lc3NhZ2U+Ci0JPG1lc3NhZ2UgbmFtZT0iTW9yZUV4dGVuZGVkU3RydWN0RmF1bHQiPgotCQk8cGFydCBuYW1lPSJwYXJ0NSIgZWxlbWVudD0ibnMzOk1vcmVFeHRlbmRlZFN0cnVjdFBhcnQiLz4KLQk8L21lc3NhZ2U+Ci0KLQk8cG9ydFR5cGUgbmFtZT0iQ29tcGxleERvY0xpdFBvcnRUeXBlIj4KLQkJPCEtLQotCQkJVGhyb3dzIGEgZmF1bHQgd2l0aCBhbiBlbWJlZGRlZCBTT0FQU3RydWN0Ci0JCS0tPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9TT0FQU3RydWN0RmF1bHQiIHBhcmFtZXRlck9yZGVyPSIiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczplY2hvU09BUFN0cnVjdEZhdWx0UmVxdWVzdCIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob1NPQVBTdHJ1Y3RGYXVsdFJlc3BvbnNlIi8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0IiBtZXNzYWdlPSJ0bnM6U09BUFN0cnVjdEZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTwhLS0KLQkJCVRocm93cyBhIGZhdWx0IHdpdGggYSBiYXNlIGNvbXBsZXggc3RydWN0Ci0JCS0tPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9CYXNlU3RydWN0RmF1bHQiIHBhcmFtZXRlck9yZGVyPSIiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczplY2hvQmFzZVN0cnVjdEZhdWx0UmVxdWVzdCIvPgotCQkJPG91dHB1dCBtZXNzYWdlPSJ0bnM6ZWNob0Jhc2VTdHJ1Y3RGYXVsdFJlc3BvbnNlIi8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0IiBtZXNzYWdlPSJ0bnM6QmFzZVN0cnVjdEZhdWx0Ii8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTwhLS0KLQkJCVRocm93cyBhIGZhdWx0IHdpdGggYW4gZW4gZXh0ZW5kZWQgY29tcGxleCB0eXBlCi0JCS0tPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0IiBwYXJhbWV0ZXJPcmRlcj0iIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob0V4dGVuZGVkU3RydWN0RmF1bHRSZXF1ZXN0Ii8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvRXh0ZW5kZWRTdHJ1Y3RGYXVsdFJlc3BvbnNlIi8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0IiBtZXNzYWdlPSJ0bnM6RXh0ZW5kZWRTdHJ1Y3RGYXVsdCIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8IS0tCi0JCQlUaHJvd3MgYSBmYXVsdCB3aXRoIGVtYmVkZGVkIGNvbXBsZXggdHlwZSwgZmF1bHQgd2l0aCBhbgotCQkJZXh0ZW5kZWQgY29tcGxleCB0eXBlIGFuZCBmYXVsdCB3aXRoIGFuIGFycmF5IG9mIGEgYmFzZQotCQkJY29tcGxleCB0eXBlCi0JCS0tPgotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9NdWx0aXBsZUZhdWx0czEiIHBhcmFtZXRlck9yZGVyPSJwYXJhbSI+Ci0JCQk8aW5wdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czFSZXF1ZXN0Ii8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczplY2hvTXVsdGlwbGVGYXVsdHMxUmVzcG9uc2UiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQxIiBtZXNzYWdlPSJ0bnM6U09BUFN0cnVjdEZhdWx0Ii8+Ci0JCQk8ZmF1bHQgbmFtZT0iQ29tcGxleEZhdWx0MiIgbWVzc2FnZT0idG5zOkJhc2VTdHJ1Y3RGYXVsdCIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8IS0tCi0JCQlUaHJvd3MgYSBmYXVsdCB3aXRoIGFuIGFycmF5IG9mIGJhc2UgY29tcGxleCB0eXBlIGFuZAotCQkJYSBmYXVsdCB3aXRoIGRvdWJseSBleHRlbmRlZCBjb21wbGV4IHR5cGUKLQkJLS0+Ci0JCTxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMiIgcGFyYW1ldGVyT3JkZXI9InBhcmFtIj4KLQkJCTxpbnB1dCBtZXNzYWdlPSJ0bnM6ZWNob011bHRpcGxlRmF1bHRzMlJlcXVlc3QiLz4KLQkJCTxvdXRwdXQgbWVzc2FnZT0idG5zOmVjaG9NdWx0aXBsZUZhdWx0czJSZXNwb25zZSIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDEiIG1lc3NhZ2U9InRuczpCYXNlU3RydWN0RmF1bHQiLz4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQyIiBtZXNzYWdlPSJ0bnM6RXh0ZW5kZWRTdHJ1Y3RGYXVsdCIvPgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDMiIG1lc3NhZ2U9InRuczpNb3JlRXh0ZW5kZWRTdHJ1Y3RGYXVsdCIvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCi0JPGJpbmRpbmcgbmFtZT0iQ29tcGxleERvY0xpdEJpbmRpbmciIHR5cGU9InRuczpDb21wbGV4RG9jTGl0UG9ydFR5cGUiPgotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvU09BUFN0cnVjdEZhdWx0Ij4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0IgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTxvcGVyYXRpb24gbmFtZT0iZWNob0Jhc2VTdHJ1Y3RGYXVsdCI+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQiPgotCQkJCTxzb2FwOmZhdWx0Ci0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdCIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQk8L29wZXJhdGlvbj4KLQotCQk8b3BlcmF0aW9uIG5hbWU9ImVjaG9FeHRlbmRlZFN0cnVjdEZhdWx0Ij4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdCI+Ci0JCQkJPHNvYXA6ZmF1bHQKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0IgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0JCTwvb3BlcmF0aW9uPgotCi0JCTxvcGVyYXRpb24gbmFtZT0iZWNob011bHRpcGxlRmF1bHRzMSI+Ci0JCQk8aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvaW5wdXQ+Ci0JCQk8b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L291dHB1dD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQxIj4KLQkJCQk8c29hcDpmYXVsdCAKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0MSIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDIiPgotCQkJCTxzb2FwOmZhdWx0Ci0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdDIiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLQkJPC9vcGVyYXRpb24+Ci0KLQkJPG9wZXJhdGlvbiBuYW1lPSJlY2hvTXVsdGlwbGVGYXVsdHMyIj4KLQkJCTxpbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC9pbnB1dD4KLQkJCTxvdXRwdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvb3V0cHV0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDEiPgotCQkJCTxzb2FwOmZhdWx0Ci0JCQkJCW5hbWU9IkNvbXBsZXhGYXVsdDEiCi0JCQkJCXVzZT0ibGl0ZXJhbCIvPgotCQkJPC9mYXVsdD4KLQkJCTxmYXVsdCBuYW1lPSJDb21wbGV4RmF1bHQyIj4KLQkJCQk8c29hcDpmYXVsdCAKLQkJCQkJbmFtZT0iQ29tcGxleEZhdWx0MiIKLQkJCQkJdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L2ZhdWx0PgotCQkJPGZhdWx0IG5hbWU9IkNvbXBsZXhGYXVsdDMiPgotCQkJCTxzb2FwOmZhdWx0IAotCQkJCQluYW1lPSJDb21wbGV4RmF1bHQzIgotCQkJCQl1c2U9ImxpdGVyYWwiLz4KLQkJCTwvZmF1bHQ+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQotCTxzZXJ2aWNlIG5hbWU9IkNvbXBsZXhEb2NMaXRTZXJ2aWNlIj4KLQkJPHBvcnQgbmFtZT0iQ29tcGxleERvY0xpdFBvcnQiIGJpbmRpbmc9InRuczpDb21wbGV4RG9jTGl0QmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzCi0JCQkJbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzL3NlcnZpY2VzL0NvbXBsZXhEb2NMaXRQb3J0Ii8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgotCmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy93c2F0LndzZGwgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0LXJlc291cmNlcy93c2F0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTliOTMuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvd3NhdC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gIH4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgfiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgfiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIH4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB+IHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gIH4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgfiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgfiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLUxlZ2FsIERpc2NsYWltZXIKLQotVGhlIHByZXNlbnRhdGlvbiwgZGlzdHJpYnV0aW9uIG9yIG90aGVyIGRpc3NlbWluYXRpb24gb2YgdGhlIGluZm9ybWF0aW9uIAotY29udGFpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBub3QgYSBsaWNlbnNlLCBlaXRoZXIgZXhwcmVzc2x5IG9yIGltcGxpZWRseSwgCi10byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG93bmVkIG9yIGNvbnRyb2xsZWQgYnkgQkVBIG9yIElCTSBvciBNaWNyb3NvZnQgYW5kXG9yIGFueSBvdGhlciAKLXRoaXJkIHBhcnR5LiAgQkVBIGFuZCBJQk0gYW5kIE1pY3Jvc29mdCBhbmRcb3IgYW55IG90aGVyIHRoaXJkIHBhcnR5IG1heSBoYXZlIHBhdGVudHMsIHBhdGVudCAKLWFwcGxpY2F0aW9ucywgdHJhZGVtYXJrcywgY29weXJpZ2h0cywgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAKLWNvdmVyaW5nIHN1YmplY3QgbWF0dGVyIGluIHRoaXMgZG9jdW1lbnQuICBUaGUgZnVybmlzaGluZyBvZiB0aGlzIGRvY3VtZW50IAotZG9lcyBub3QgZ2l2ZSB5b3UgYW55IGxpY2Vuc2UgdG8gQkVBJ3MgYW5kIElCTSdzIGFuZCBNaWNyb3NvZnQncyBvciBhbnkgb3RoZXIgdGhpcmQgcGFydHkncyBwYXRlbnRzLCB0cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkuCi0KLVRoaXMgc3BlY2lmaWNhdGlvbiBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMgcHJvdmlkZWQgb24gYW4gIkFTIElTIgotIGJhc2lzIGFuZCB0byB0aGUgbWF4aW11bSBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBCRUEgYW5kIElCTSBhbmQgTWljcm9zb2Z0IHByb3ZpZGVzIAotdGhlIGRvY3VtZW50IEFTIElTIEFORCBXSVRIIEFMTCBGQVVMVFMsIGFuZCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBvdGhlciB3YXJyYW50aWVzIAotYW5kIGNvbmRpdGlvbnMsIGVpdGhlciBleHByZXNzLCBpbXBsaWVkIG9yIHN0YXR1dG9yeSwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgCi10bywgYW55IChpZiBhbnkpIGltcGxpZWQgd2FycmFudGllcywgZHV0aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5LCBvZiAKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLCBvZiBhY2N1cmFjeSBvciBjb21wbGV0ZW5lc3Mgb2YgcmVzcG9uc2VzLCBvZiAKLXJlc3VsdHMsIG9mIHdvcmttYW5saWtlIGVmZm9ydCwgb2YgbGFjayBvZiB2aXJ1c2VzLCBhbmQgb2YgbGFjayBvZiBuZWdsaWdlbmNlLCAKLWFsbCB3aXRoIHJlZ2FyZCB0byB0aGUgZG9jdW1lbnQuIEFMU08sIFRIRVJFIElTIE5PIFdBUlJBTlRZIE9SIENPTkRJVElPTiBPRiAKLVRJVExFLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04sIENPUlJFU1BPTkRFTkNFIFRPIERFU0NSSVBUSU9OIE9SIAotTk9OLUlORlJJTkdFTUVOVCBPRiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBXSVRIIFJFR0FSRCBUTyBUSEUgRE9DVU1FTlQuCi0KLUlOIE5PIEVWRU5UIFdJTEwgQkVBIG9yIElCTSBvciBNSUNST1NPRlQgQkUgTElBQkxFIFRPIEFOWSBPVEhFUiBQQVJUWSBGT1IgVEhFIENPU1QgT0YgUFJPQ1VSSU5HIAotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIFVTRSwgTE9TUyBPRiBEQVRBLCBPUiBBTlkgCi1JTkNJREVOVEFMLCBDT05TRVFVRU5USUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBTUEVDSUFMIERBTUFHRVMgV0hFVEhFUiBVTkRFUiAKLUNPTlRSQUNULCBUT1JULCBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFLCBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRISVMgT1IgQU5ZIAotT1RIRVIgQUdSRUVNRU5UIFJFTEFUSU5HIFRPIFRISVMgRE9DVU1FTlQsIFdIRVRIRVIgT1IgTk9UIFNVQ0ggUEFSVFkgSEFEIEFEVkFOQ0UgCi1OT1RJQ0UgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotQ29weXJpZ2h0IE5vdGljZQotCi1Db3B5cmlnaHQgMjAwMSwgMjAwMiBCRUEgU3lzdGVtcyBhbmQgSUJNIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0tLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2F0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzA5L3dzYXQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wOS93c2F0Ij4KLQk8IS0tIE1lc3NhZ2VzIC0tPgotICAgIDx3c2RsOnR5cGVzPgotICAgICAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDMvMDkvd3NhdCI+Ci0gICAgICAgICAgICA8eHNkOmluY2x1ZGUgc2NoZW1hTG9jYXRpb249IndzYXQueHNkIi8+Ci0gICAgICAgIDwveHNkOnNjaGVtYT4KLSAgICA8L3dzZGw6dHlwZXM+Ci0gICAgPHdzZGw6bWVzc2FnZSBuYW1lPSJQcmVwYXJlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OlByZXBhcmUiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlByZXBhcmVkIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OlByZXBhcmVkIi8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJBYm9ydGVkIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OkFib3J0ZWQiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8d3NkbDptZXNzYWdlIG5hbWU9IlJlYWRPbmx5Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OlJlYWRPbmx5Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJDb21taXQiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9IndzYXQ6Q29tbWl0Ii8+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6bWVzc2FnZSBuYW1lPSJSb2xsYmFjayI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0id3NhdDpSb2xsYmFjayIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iQ29tbWl0dGVkIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OkNvbW1pdHRlZCIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iUmVwbGF5Ij4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OlJlcGxheSIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iUHJlcGFyZVJlc3BvbnNlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ3c2F0OlByZXBhcmVSZXNwb25zZSIvPgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iUmVwbGF5UmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9IndzYXQ6UmVwbGF5UmVzcG9uc2UiLz4KLQk8L3dzZGw6bWVzc2FnZT4KLQk8IS0tIE1hbmRhdG9yeSBBc3luY2hyb25vdXMgTWVzc2FnaW5nIFBvcnRUeXBlcyAtLT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJDb21wbGV0aW9uQ29vcmRpbmF0b3JQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXRPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpDb21taXQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJvbGxiYWNrT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Um9sbGJhY2siLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29tcGxldGlvbkluaXRpYXRvclBvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdHRlZE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OkNvbW1pdHRlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQWJvcnRlZE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OkFib3J0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iQ29vcmRpbmF0b3JQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJQcmVwYXJlZE9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlByZXBhcmVkIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJBYm9ydGVkT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6QWJvcnRlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVhZE9ubHlPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpSZWFkT25seSIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0dGVkT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Q29tbWl0dGVkIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZXBsYXlPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpSZXBsYXkiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iUGFydGljaXBhbnRQb3J0VHlwZSI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJQcmVwYXJlT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6UHJlcGFyZSIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0T3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Q29tbWl0Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSb2xsYmFja09wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlJvbGxiYWNrIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCTwhLS0gT3B0aW9uYWwgU3luY3Jvbm91cyBSUEMgUG9ydCBUeXBlcyAtLT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJDb21wbGV0aW9uUG9ydFR5cGVSUEMiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0T3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Q29tbWl0Ii8+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0id3NhdDpDb21taXR0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJvbGxiYWNrT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6Um9sbGJhY2siLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2F0OkFib3J0ZWQiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6cG9ydFR5cGU+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iUGFydGljaXBhbnRQb3J0VHlwZVJQQyI+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJQcmVwYXJlT3BlcmF0aW9uIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9IndzYXQ6UHJlcGFyZSIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9IndzYXQ6UHJlcGFyZVJlc3BvbnNlIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXRPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpDb21taXQiLz4KLQkJCTx3c2RsOm91dHB1dCBtZXNzYWdlPSJ3c2F0OkNvbW1pdHRlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUm9sbGJhY2tPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpSb2xsYmFjayIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9IndzYXQ6QWJvcnRlZCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQk8d3NkbDpwb3J0VHlwZSBuYW1lPSJDb29yZGluYXRvclBvcnRUeXBlUlBDIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJlcGxheU9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlJlcGxheSIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9IndzYXQ6UmVwbGF5UmVzcG9uc2UiLz4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkFib3J0ZWRPcGVyYXRpb24iPgotCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0id3NhdDpBYm9ydGVkIi8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZWFkT25seU9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2F0OlJlYWRPbmx5Ii8+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JPC93c2RsOnBvcnRUeXBlPgotCi08IS0tCi0KLTx3c2RsOmJpbmRpbmcgbmFtZT0iQ29tcGxldGlvbkNvb3JkaW5hdG9yUG9ydFR5cGVCaW5kaW5nIiB0eXBlPSJ3c2F0OkNvbXBsZXRpb25Db29yZGluYXRvclBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJDb21taXRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSb2xsYmFja09wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLTwvd3NkbDpiaW5kaW5nPgotPHdzZGw6YmluZGluZyBuYW1lPSJDb21wbGV0aW9uSW5pdGlhdG9yUG9ydFR5cGVCaW5kaW5nIiB0eXBlPSJ3c2F0OkNvbXBsZXRpb25Jbml0aWF0b3JQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0dGVkT3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQWJvcnRlZE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLTwvd3NkbDpiaW5kaW5nPgotPHdzZGw6YmluZGluZyBuYW1lPSJDb29yZGluYXRvclBvcnRUeXBlQmluZGluZyIgdHlwZT0id3NhdDpDb29yZGluYXRvclBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJQcmVwYXJlZE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkFib3J0ZWRPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJSZWFkT25seU9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdHRlZE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJlcGxheU9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLTwvd3NkbDpiaW5kaW5nPgotPHdzZGw6YmluZGluZyBuYW1lPSJQYXJ0aWNpcGFudFBvcnRUeXBlQmluZGluZyIgdHlwZT0id3NhdDpQYXJ0aWNpcGFudFBvcnRUeXBlIj4KLQkJPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50Ii8+Ci0JCTx3c2RsOm9wZXJhdGlvbiBuYW1lPSJQcmVwYXJlT3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQ29tbWl0T3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUm9sbGJhY2tPcGVyYXRpb24iPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly94eHgiLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6aW5wdXQ+Ci0JCTwvd3NkbDpvcGVyYXRpb24+Ci08L3dzZGw6YmluZGluZz4KLQotLS0+Ci0KLTx3c2RsOmJpbmRpbmcgbmFtZT0iQ29tcGxldGlvblBvcnRUeXBlUlBDQmluZGluZyIgdHlwZT0id3NhdDpDb21wbGV0aW9uUG9ydFR5cGVSUEMiPgotCQk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJvbGxiYWNrT3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotPC93c2RsOmJpbmRpbmc+Ci0KLTx3c2RsOmJpbmRpbmcgbmFtZT0iQ29vcmRpbmF0b3JQb3J0VHlwZVJQQ0JpbmRpbmciIHR5cGU9IndzYXQ6Q29vcmRpbmF0b3JQb3J0VHlwZVJQQyI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUmVwbGF5T3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iQWJvcnRlZE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJlYWRPbmx5T3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotPC93c2RsOmJpbmRpbmc+Ci0KLTx3c2RsOmJpbmRpbmcgbmFtZT0iUGFydGljaXBhbnRQb3J0VHlwZVJQQ0JpbmRpbmciIHR5cGU9IndzYXQ6UGFydGljaXBhbnRQb3J0VHlwZVJQQyI+Ci0JCTxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJkb2N1bWVudCIvPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iUHJlcGFyZU9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IkNvbW1pdE9wZXJhdGlvbiI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3h4eCIvPgotCQkJPHdzZGw6aW5wdXQ+Ci0JCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLQkJCTwvd3NkbDppbnB1dD4KLQkJCTx3c2RsOm91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9IlJvbGxiYWNrT3BlcmF0aW9uIj4KLQkJCTxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8veHh4Ii8+Ci0JCQk8d3NkbDppbnB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0JCQk8L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotPC93c2RsOmJpbmRpbmc+Ci0KLQotCi08d3NkbDpzZXJ2aWNlIG5hbWU9Inh4eCI+Ci08IS0tCi0gICAJCTx3c2RsOnBvcnQgYmluZGluZz0id3NhdDpDb21wbGV0aW9uQ29vcmRpbmF0b3JQb3J0VHlwZUJpbmRpbmciIG5hbWU9IkNvbXBsZXRpb25Db29yZGluYXRvciI+Ci0gICAgICAJCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpczIvc2VydmljZXMvQ29tcGxldGlvbkNvb3JkaW5hdG9yIi8+Ci0gICAgCQk8L3dzZGw6cG9ydD4KLQkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ3c2F0OkNvbXBsZXRpb25Jbml0aWF0b3JQb3J0VHlwZUJpbmRpbmciIG5hbWU9IkNvbXBsZXRpb25Jbml0aWF0b3IiPgotICAgICAgCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMyL3NlcnZpY2VzL0NvbXBsZXRpb25Jbml0aWF0b3IiLz4KLSAgICAJCTwvd3NkbDpwb3J0PgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9IndzYXQ6Q29vcmRpbmF0b3JQb3J0VHlwZUJpbmRpbmciIG5hbWU9IkNvb3JkaW5hdG9yIj4KLSAgICAgIAkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzMi9zZXJ2aWNlcy9Db29yZGluYXRvciIvPgotICAgIAkJPC93c2RsOnBvcnQ+Ci0JCTx3c2RsOnBvcnQgYmluZGluZz0id3NhdDpQYXJ0aWNpcGFudFBvcnRUeXBlQmluZGluZyIgbmFtZT0iUGFydGljaXBhbnQiPgotICAgICAgCQkJPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo4MDgxL2F4aXMyL3NlcnZpY2VzL1BhcnRpY2lwYW50Ii8+Ci0gICAgCQk8L3dzZGw6cG9ydD4KLS0tPiAgICAJCQotCQk8d3NkbDpwb3J0IGJpbmRpbmc9IndzYXQ6UGFydGljaXBhbnRQb3J0VHlwZVJQQ0JpbmRpbmciIG5hbWU9IlBhcnRpY2lwYW50UlBDIj4KLSAgICAgIAkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL1BhcnRpY2lwYW50UlBDIi8+Ci0gICAJCTwvd3NkbDpwb3J0PgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9IndzYXQ6Q29vcmRpbmF0b3JQb3J0VHlwZVJQQ0JpbmRpbmciIG5hbWU9IkNvb3JkaW5hdG9yUlBDIj4KLSAgICAgIAkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9heGlzL3NlcnZpY2VzL0Nvb3JkaW5hdG9yUlBDIi8+Ci0gICAJCTwvd3NkbDpwb3J0PgotCQk8d3NkbDpwb3J0IGJpbmRpbmc9IndzYXQ6Q29tcGxldGlvblBvcnRUeXBlUlBDQmluZGluZyIgbmFtZT0iQ29tcGxldGlvblJQQyI+Ci0gICAJCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vbG9jYWxob3N0OjgwODEvYXhpcy9zZXJ2aWNlcy9Db21wbGV0aW9uUlBDIi8+Ci0gICAJCTwvd3NkbDpwb3J0PgotPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3QtcmVzb3VyY2VzL3dzYXQueHNkIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvd3NhdC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjI2ZTkuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC1yZXNvdXJjZXMvd3NhdC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08IS0tCi1MZWdhbCBEaXNjbGFpbWVyCi0KLVRoZSBwcmVzZW50YXRpb24sIGRpc3RyaWJ1dGlvbiBvciBvdGhlciBkaXNzZW1pbmF0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiAKLWNvbnRhaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgbm90IGEgbGljZW5zZSwgZWl0aGVyIGV4cHJlc3NseSBvciBpbXBsaWVkbHksIAotdG8gYW55IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvd25lZCBvciBjb250cm9sbGVkIGJ5IEJFQSBvciBJQk0gb3IgTWljcm9zb2Z0IGFuZFxvciBhbnkgb3RoZXIgCi10aGlyZCBwYXJ0eS4gIEJFQSBhbmQgSUJNIGFuZCBNaWNyb3NvZnQgYW5kXG9yIGFueSBvdGhlciB0aGlyZCBwYXJ0eSBtYXkgaGF2ZSBwYXRlbnRzLCBwYXRlbnQgCi1hcHBsaWNhdGlvbnMsIHRyYWRlbWFya3MsIGNvcHlyaWdodHMsIG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgCi1jb3ZlcmluZyBzdWJqZWN0IG1hdHRlciBpbiB0aGlzIGRvY3VtZW50LiAgVGhlIGZ1cm5pc2hpbmcgb2YgdGhpcyBkb2N1bWVudCAKLWRvZXMgbm90IGdpdmUgeW91IGFueSBsaWNlbnNlIHRvIEJFQSdzIGFuZCBJQk0ncyBhbmQgTWljcm9zb2Z0J3Mgb3IgYW55IG90aGVyIHRoaXJkIHBhcnR5J3MgcGF0ZW50cywgCi10cmFkZW1hcmtzLCBjb3B5cmlnaHRzLCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkuCi0KLVRoaXMgc3BlY2lmaWNhdGlvbiBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMgcHJvdmlkZWQgb24gYW4gIkFTIElTIgotIGJhc2lzIGFuZCB0byB0aGUgbWF4aW11bSBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LCBCRUEgYW5kIElCTSBhbmQgTWljcm9zb2Z0IHByb3ZpZGVzIAotdGhlIGRvY3VtZW50IEFTIElTIEFORCBXSVRIIEFMTCBGQVVMVFMsIGFuZCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBvdGhlciB3YXJyYW50aWVzIAotYW5kIGNvbmRpdGlvbnMsIGVpdGhlciBleHByZXNzLCBpbXBsaWVkIG9yIHN0YXR1dG9yeSwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgCi10bywgYW55IChpZiBhbnkpIGltcGxpZWQgd2FycmFudGllcywgZHV0aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5LCBvZiAKLWZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLCBvZiBhY2N1cmFjeSBvciBjb21wbGV0ZW5lc3Mgb2YgcmVzcG9uc2VzLCBvZiAKLXJlc3VsdHMsIG9mIHdvcmttYW5saWtlIGVmZm9ydCwgb2YgbGFjayBvZiB2aXJ1c2VzLCBhbmQgb2YgbGFjayBvZiBuZWdsaWdlbmNlLCAKLWFsbCB3aXRoIHJlZ2FyZCB0byB0aGUgZG9jdW1lbnQuIEFMU08sIFRIRVJFIElTIE5PIFdBUlJBTlRZIE9SIENPTkRJVElPTiBPRiAKLVRJVExFLCBRVUlFVCBFTkpPWU1FTlQsIFFVSUVUIFBPU1NFU1NJT04sIENPUlJFU1BPTkRFTkNFIFRPIERFU0NSSVBUSU9OIE9SIAotTk9OLUlORlJJTkdFTUVOVCBPRiBBTlkgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBXSVRIIFJFR0FSRCBUTyBUSEUgRE9DVU1FTlQuCi0KLUlOIE5PIEVWRU5UIFdJTEwgQkVBIG9yIElCTSBvciBNSUNST1NPRlQgQkUgTElBQkxFIFRPIEFOWSBPVEhFUiBQQVJUWSBGT1IgVEhFIENPU1QgT0YgUFJPQ1VSSU5HIAotU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUywgTE9TVCBQUk9GSVRTLCBMT1NTIE9GIFVTRSwgTE9TUyBPRiBEQVRBLCBPUiBBTlkgCi1JTkNJREVOVEFMLCBDT05TRVFVRU5USUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBTUEVDSUFMIERBTUFHRVMgV0hFVEhFUiBVTkRFUiAKLUNPTlRSQUNULCBUT1JULCBXQVJSQU5UWSwgT1IgT1RIRVJXSVNFLCBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRISVMgT1IgQU5ZIAotT1RIRVIgQUdSRUVNRU5UIFJFTEFUSU5HIFRPIFRISVMgRE9DVU1FTlQsIFdIRVRIRVIgT1IgTk9UIFNVQ0ggUEFSVFkgSEFEIEFEVkFOQ0UgCi1OT1RJQ0UgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotQ29weXJpZ2h0IE5vdGljZQotCi1Db3B5cmlnaHQgMjAwMSwgMjAwMiBCRUEgU3lzdGVtcyBhbmQgSUJNIENvcnBvcmF0aW9uIGFuZCBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0tLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wOS93c2F0IiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2F0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDAzLzA5L3dzYXQiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIHZlcnNpb249IjEuMCI+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJOb3RpZmljYXRpb24iPgotCQk8eHNkOnNlcXVlbmNlPgotCQkJPHhzZDphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQk8L3hzZDpzZXF1ZW5jZT4KLQkJPHhzZDphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVwYXJlIiB0eXBlPSJ3c2F0Ok5vdGlmaWNhdGlvbiIvPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVwYXJlZCIgdHlwZT0id3NhdDpOb3RpZmljYXRpb24iLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iQWJvcnRlZCIgdHlwZT0id3NhdDpOb3RpZmljYXRpb24iLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhZE9ubHkiIHR5cGU9IndzYXQ6Tm90aWZpY2F0aW9uIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNvbW1pdCIgdHlwZT0id3NhdDpOb3RpZmljYXRpb24iLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sbGJhY2siIHR5cGU9IndzYXQ6Tm90aWZpY2F0aW9uIi8+Ci0JPHhzZDplbGVtZW50IG5hbWU9IkNvbW1pdHRlZCIgdHlwZT0id3NhdDpOb3RpZmljYXRpb24iLz4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwbGF5IiB0eXBlPSJ3c2F0Ok5vdGlmaWNhdGlvbiIvPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWb3RlIj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVDb21taXQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZvdGVSb2xsYmFjayIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVm90ZVJlYWRPbmx5Ii8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlByZXBhcmVSZXNwb25zZSI+Ci0JCTx4c2Q6Y29tcGxleFR5cGU+Ci0JCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2b3RlIiB0eXBlPSJ3c2F0OlZvdGUiLz4KLQkJPC94c2Q6Y29tcGxleFR5cGU+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDb21taXQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJvbGxiYWNrIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9IlJlcGxheVJlc3BvbnNlIj4KLQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im91dGNvbWUiIHR5cGU9IndzYXQ6T3V0Y29tZSIvPgotCQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJFcnJvckNvZGVzIj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6UU5hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id3NhdDpJbmNvbnNpc3RlbnRJbnRlcm5hbFN0YXRlIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvVGVzdENvbnN0YW50cy5qYXZhIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1Rlc3RDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNGVjMi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvVGVzdENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgVGVzdENvbnN0YW50cyB7Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIExhbmd1YWdlTmFtZXMgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBID0gImphdmEiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDX1NIQVJQID0gImNzIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkJfRE9UX05FVCA9ICJ2YiI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENfUExVU19QTFVTID0gImNwcCI7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIERhdGFiaW5kaW5nIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0JFQU5TID0gInhtbGJlYW5zIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURCID0gImFkYiI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAibm9uZSI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEwVGVzdC5qYXZhIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWM0YThkLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExMFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTEwVGVzdCBleHRlbmRzIFdTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJtdG9tZWNoby53c2RsIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExMVRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExMVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzOTNlOS4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmExMVRlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAibXRvbWVjaG8ud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTJUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMTJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDEzNWUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi0vKiogVGVzdCBmb3IgdGhlIFdTREwgdGhhdCdzIHVucmVmZXJlbmNlZCB0eXBlICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhMTJUZXN0IGV4dGVuZHMgV1NETDJKYXZhRmFpbHVyZVRlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gInVucmVmZXJlbmNlZC53c2RsIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEzVGVzdC5qYXZhIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTEzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDcwYzAwLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmExM1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotLyoqCi0gKiBUZXN0IGZvciB0aGUgbW9kaWZpZWQgcGluZy11bmJvb25kIHdzZGwuIFRoZSBiaW5kaW5nIGlzIHJlbW92ZWQgaW4gdGhpcyB3c2RsLkNvZGVnZW4gc2hvdWxkIGZhaWwKLSAqIGZvciB0aGlzIFdTREwgYnkgc2F5aW5nICBubyBiaW5kaW5nIQotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhMTNUZXN0IGV4dGVuZHMgV1NETDJKYXZhRmFpbHVyZVRlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gInBpbmctdW5ib3VuZC53c2RsIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTFUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMjZmZi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhMVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTFUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gIndzYXQud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmEyVGVzdC5qYXZhIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmFhMjguLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLS8qKgotICogVGVzdCBmb3IgdGhlIFdTREwgdGhhdCdzIG1pc3NpbmcgYSBzZXJ2aWNlIFNpbmNlIHdlIGRvIG5vdCBwZXJtaXQgdGhlIGNsaWVudHMgdG8gYmUgZ2VuZXJhdGVkCi0gKiB3aGVuIHNlcnZpY2UgaXMgbWlzc2luZywgd2Ugc2hvdWxkIGdldCBhbiBlcnJvcgotICovCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhMlRlc3QgZXh0ZW5kcyBXU0RMMkphdmFGYWlsdXJlVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAibm8tc2VydmljZS53c2RsIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTNUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhM1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5N2MwYi4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhM1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTNUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gImhlYWRlcnMud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDg0ZjAzLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhNFRlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAicGluZy53c2RsIjsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE1VGVzdC5qYXZhIGIvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTliOWIuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuYXhpczIueG1sYmVhbnM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmE1VGVzdCBleHRlbmRzIFdTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZSB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzLndzZGxGaWxlTmFtZSA9ICJpbnRlcm9wdGVzdGRvY2xpdHBhcmFtZXRlcnMud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhNlRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE2VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQ3NmU0Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE2VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhNlRlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAibWltZS1kb2Mud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhN1Rlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE3VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQ1NzY4Li4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE3VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhN1Rlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAiaW50ZXJvcHRlc3Rkb2NsaXQud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhOFRlc3QuamF2YSBiLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE4VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBiNDliLi4wMDAwMDAwCi0tLSBhLzFfNS9tb2R1bGVzL3htbGJlYW5zL3Rlc3Qvb3JnL2FwYWNoZS9heGlzMi94bWxiZWFucy9XU0RMMkphdmE4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhOFRlc3QgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy53c2RsRmlsZU5hbWUgPSAic2ltcGxlLWRvYy1saXRlcmFsLndzZGwiOwotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YTlUZXN0LmphdmEgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhOVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4MWI2ZC4uMDAwMDAwMAotLS0gYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhOVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotcHVibGljIGNsYXNzIFdTREwySmF2YTlUZXN0IGV4dGVuZHMgV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMud3NkbEZpbGVOYW1lID0gImNvbXBsZXgtZG9jLWxpdGVyYWwud3NkbCI7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhRmFpbHVyZVRlc3RCYXNlLmphdmEgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhRmFpbHVyZVRlc3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjUyNjUuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YUZhaWx1cmVUZXN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmF4aXMyLnhtbGJlYW5zOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi53c2RsLmNvZGVnZW4uQ29kZUdlbmVyYXRpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMMkphdmFGYWlsdXJlVGVzdEJhc2UgZXh0ZW5kcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdFdTRExGaWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2VuZXJhdGVBbmRDb21waWxlKHdzZGxGaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfTE9DQVRJT05fQkFTRSArIE9VVFBVVF9MT0NBVElPTl9QUkVGSVggKyBmb2xkZXJDb3VudCsrKTsKLSAgICAgICAgICAgIGZhaWwoIlVuZGVzaXJlZCBiZWhhdmlvciB3aGlsZSBjb2RlIGdlbmVyYXRpbmchIik7Ci0gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vd2UgYXJlIG9rIGhlcmUKLSAgICAgICAgfQotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlLmphdmEgYi8xXzUvbW9kdWxlcy94bWxiZWFucy90ZXN0L29yZy9hcGFjaGUvYXhpczIveG1sYmVhbnMvV1NETDJKYXZhU3VjY2Vzc1Rlc3RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDAzNWEuLjAwMDAwMDAKLS0tIGEvMV81L21vZHVsZXMveG1sYmVhbnMvdGVzdC9vcmcvYXBhY2hlL2F4aXMyL3htbGJlYW5zL1dTREwySmF2YVN1Y2Nlc3NUZXN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5heGlzMi54bWxiZWFuczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLnV0aWwuQ29tbWFuZExpbmVPcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzMi51dGlsLkNvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpczIudXRpbC5Db21tYW5kTGluZU9wdGlvblBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkVuZ2luZTsKLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMyLndzZGwuY29kZWdlbi5Db2RlR2VuZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMMkphdmFTdWNjZXNzVGVzdEJhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTE9DQVRJT05fQkFTRSA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi9vdXRfcHV0X2NsYXNzZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9MT0NBVElPTl9QUkVGSVggPSAiL3Rlc3QiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IGZvbGRlckNvdW50ID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0JBU0VfRElSID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYmFzZWRpciIsICIuIikgKyAiL3Rlc3QtcmVzb3VyY2VzLyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NFU19ESVIgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJiYXNlZGlyIiwgIi4iKSArICIvdGFyZ2V0L2NsYXNzZXMvIjsKLSAgICBwcml2YXRlIFN0cmluZ1tdIG1vZHVsZU5hbWVzID0geyAieG1sIiwgImNvbW1vbiIsICJjb3JlIiB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfUEFUSF9QUkVGSVggPSAiLi4vbW9kdWxlcy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFX1RBUkdFVF9OQU1FID0gImNvbXBpbGUiOwotCi0gICAgcHJvdGVjdGVkIFN0cmluZyB3c2RsRmlsZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlIHRoZSByb290IG91dHB1dCBkaXJlY3RvcnkKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoT1VUUFVUX0xPQ0FUSU9OX0JBU0UpOwotICAgICAgICBpZiAob3V0cHV0RmlsZS5leGlzdHMoKSAmJiBvdXRwdXRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZURpcihvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgIG91dHB1dEZpbGUubWtkaXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dHB1dEZpbGUubWtkaXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgcm9vdCBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKE9VVFBVVF9MT0NBVElPTl9CQVNFKTsKLSAgICAgICAgaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkgJiYgb3V0cHV0RmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICBkZWxldGVEaXIob3V0cHV0RmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZWxldGVzIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgdW5kZXIgZGlyLiBSZXR1cm5zIHRydWUgaWYgYWxsIGRlbGV0aW9ucyB3ZXJlCi0gICAgICogc3VjY2Vzc2Z1bC4gSWYgYSBkZWxldGlvbiBmYWlscywgdGhlIG1ldGhvZCBzdG9wcyBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhbmQgcmV0dXJucyBmYWxzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlRGlyKEZpbGUgZGlyKSB7Ci0gICAgICAgIGlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgU3RyaW5nW10gY2hpbGRyZW4gPSBkaXIubGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGRlbGV0ZURpcihuZXcgRmlsZShkaXIsIGNoaWxkcmVuW2ldKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgZGlyZWN0b3J5IGlzIG5vdyBlbXB0eSBzbyBkZWxldGUgaXQKLSAgICAgICAgcmV0dXJuIGRpci5kZWxldGUoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXU0RMRmlsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdlbmVyYXRlQW5kQ29tcGlsZSh3c2RsRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX0xPQ0FUSU9OX0JBU0UgKyBPVVRQVVRfTE9DQVRJT05fUFJFRklYICsgZm9sZGVyQ291bnQrKyk7Ci0gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gd2hpbGUgY29kZSBnZW5lcmF0aW9uIHRlc3QhICIgKyB3c2RsRmlsZU5hbWUgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotLy8gICAgLyoqCi0vLyAgICAgKiBUZXN0IGZvciB0aGUgc2FsZXMgcmFuayBhbmQgcHJpY2UhCi0vLyAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RDb2RlR2VuZXJhdGlvblNhbGVzUmFua05QcmljZSgpewotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGdlbmVyYXRlQW5kQ29tcGlsZSgiU2FsZXNSYW5rTlByaWNlLndzZGwiLCBPVVRQVVRfTE9DQVRJT05fQkFTRStPVVRQVVRfTE9DQVRJT05fUFJFRklYK2ZvbGRlckNvdW50KyspOwotLy8gICAgICAgIH0gY2F0Y2ggKENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIGUpIHsKLS8vICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdoaWxlIGNvZGUgZ2VuZXJhdGlvbiB0ZXN0ISIrIGUuZ2V0TWVzc2FnZSgpKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci0KLS8vICAgICAvKioKLS8vICAgICAqIFRlc3QgZm9yIHRoZSBkaW1lIGRvYwotLy8gICAgICovCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29kZUdlbmVyYXRpb25EaW1lRG9jKCl7Ci0vLwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGdlbmVyYXRlQW5kQ29tcGlsZSgiZGltZS1kb2Mud3NkbCIsIE9VVFBVVF9MT0NBVElPTl9CQVNFK09VVFBVVF9MT0NBVElPTl9QUkVGSVgrZm9sZGVyQ291bnQrKyk7Ci0vLyAgICAgICAgfSBjYXRjaCAoQ29kZUdlbmVyYXRpb25FeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gd2hpbGUgY29kZSBnZW5lcmF0aW9uIHRlc3QhIisgZS5nZXRNZXNzYWdlKCkpOwotLy8gICAgICAgIH0KLS8vICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgZm9yIHRoZSBtb2RpZmllZCBwaW5nIHdzZGwuIGl0IHdpbGwgYmUgdGhlIHRlc3QgZm9yIHRoZSBkZXRhY2hlZCBzY2hlbWEgd2l0aCBvbmx5IGFuIGltcG9ydAotICAgICAqIHN0YXRlbWVudAotICAgICAqLwotLy8gICAgcHVibGljIHZvaWQgdGVzdENvZGVHZW5lcmF0aW9uUGluZ01vZGlmaWVkKCl7Ci0vLwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGdlbmVyYXRlQW5kQ29tcGlsZSgicGluZy1tb2RpZmllZC53c2RsIiwgT1VUUFVUX0xPQ0FUSU9OX0JBU0UrT1VUUFVUX0xPQ0FUSU9OX1BSRUZJWCtmb2xkZXJDb3VudCsrKTsKLS8vICAgICAgICB9IGNhdGNoIChDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3aGlsZSBjb2RlIGdlbmVyYXRpb24gdGVzdCEiKyBlLmdldE1lc3NhZ2UoKSk7Ci0vLyAgICAgICAgfQotLy8gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NkbE5hbWUKLSAgICAgKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24KLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVBbmRDb21waWxlKFN0cmluZyB3c2RsTmFtZSwgU3RyaW5nIG91dHB1dExvY2F0aW9uKQotICAgICAgICAgICAgdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgY29kZUdlbmVyYXRlKFdTRExfQkFTRV9ESVIgKyB3c2RsTmFtZSwgb3V0cHV0TG9jYXRpb24pOwotICAgICAgICBjb21waWxlKG91dHB1dExvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NkbEZpbGUKLSAgICAgKiBAcGFyYW0gb3V0cHV0TG9jYXRpb24KLSAgICAgKiBAdGhyb3dzIENvZGVHZW5lcmF0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvZGVHZW5lcmF0ZShTdHJpbmcgd3NkbEZpbGUsIFN0cmluZyBvdXRwdXRMb2NhdGlvbikKLSAgICAgICAgICAgIHRocm93cyBDb2RlR2VuZXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vY3JlYXRlIHRoZSBvcHRpb24gbWFwCi0gICAgICAgIE1hcCBvcHRpb25NYXAgPSBmaWxsT3B0aW9uTWFwKHdzZGxGaWxlLCBvdXRwdXRMb2NhdGlvbik7Ci0gICAgICAgIENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uUGFyc2VyKG9wdGlvbk1hcCk7Ci0gICAgICAgIG5ldyBDb2RlR2VuZXJhdGlvbkVuZ2luZShwYXJzZXIpLmdlbmVyYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqIEBwYXJhbSBvdXRwdXRMb2NhdGlvbiAgKi8KLSAgICBwcml2YXRlIHZvaWQgY29tcGlsZShTdHJpbmcgb3V0cHV0TG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIGNwID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVJlYWRlcihTeXN0ZW0uZ2V0UHJvcGVydHkoImJhc2VkaXIiLCAiLiIpICsgIi90YXJnZXQvY3AudHh0IikpOwotICAgICAgICAgICAgY3AgPSBici5yZWFkTGluZSgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gRG9uJ3QgY2FyZQotICAgICAgICB9Ci0gICAgICAgIGlmIChjcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjcCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy91c2luZyB0aGUgYW50IGphdmFjIHRhc2sgZm9yIGNvbXBpbGF0aW9uCi0gICAgICAgIEphdmFjIGphdmFDb21waWxlciA9IG5ldyBKYXZhYygpOwotICAgICAgICBQcm9qZWN0IGNvZGVHZW5Qcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgVGFyZ2V0IGNvbXBpbGVUYXJnZXQgPSBuZXcgVGFyZ2V0KCk7Ci0KLSAgICAgICAgY29tcGlsZVRhcmdldC5zZXROYW1lKENPTVBJTEVfVEFSR0VUX05BTUUpOwotICAgICAgICBjb21waWxlVGFyZ2V0LmFkZFRhc2soamF2YUNvbXBpbGVyKTsKLSAgICAgICAgY29kZUdlblByb2plY3QuYWRkVGFyZ2V0KGNvbXBpbGVUYXJnZXQpOwotICAgICAgICBjb2RlR2VuUHJvamVjdC5zZXRTeXN0ZW1Qcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRQcm9qZWN0KGNvZGVHZW5Qcm9qZWN0KTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldEluY2x1ZGVqYXZhcnVudGltZSh0cnVlKTsKLSAgICAgICAgamF2YUNvbXBpbGVyLnNldEluY2x1ZGVhbnRydW50aW1lKHRydWUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAgVGhpcyBoYXJtbGVzcyBsb29raW5nIHNldEZvcmsgaXMgYWN0dWFsbHkgdmVyeSBpbXBvcnRhbnQuIHVubGVzcyB0aGUgY29tcGlsZXIgaXMKLSAgICAgICAgICBmb3JrZWQgaXQgd29udCB3b3JrIQotICAgICAgICAqLwotICAgICAgICBqYXZhQ29tcGlsZXIuc2V0Rm9yayh0cnVlKTsKLQotICAgICAgICAvL0NyZWF0ZSBjbGFzc3BhdGggLSBUaGUgZ2VuZXJhdGVkIG91dHB1dCBkaXJlY3RvcmllcyBhbHNvIGJlY29tZSBwYXJ0IG9mIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgLy9yZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBzb21lIGNvZGVnZW5lcmF0b3JzKFhNTEJlYW5zKSBwcm9kdWNlIGNvbXBpbGVkIGNsYXNzZXMgYXMgcGFydCBvZgotICAgICAgICAvL2dlbmVyYXRlZCBhcnRpZmFjdHMKLSAgICAgICAgRmlsZSBvdXRwdXRMb2NhdGlvbkZpbGUgPSBuZXcgRmlsZShvdXRwdXRMb2NhdGlvbik7Ci0gICAgICAgIFBhdGggY2xhc3NQYXRoID0gbmV3IFBhdGgoY29kZUdlblByb2plY3QsIG91dHB1dExvY2F0aW9uKTsKLSAgICAgICAgY2xhc3NQYXRoLmFkZEV4aXN0aW5nKGNsYXNzUGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoKSwgZmFsc2UpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjbGFzc1BhdGguYWRkKG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfUEFUSF9QUkVGSVggKyBtb2R1bGVOYW1lc1tpXSArIENMQVNTRVNfRElSKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzc1BhdGguYWRkKG5ldyBQYXRoKGNvZGVHZW5Qcm9qZWN0LCBjcCkpOwotCi0gICAgICAgIGphdmFDb21waWxlci5zZXRDbGFzc3BhdGgoY2xhc3NQYXRoKTsKLQotICAgICAgICAvL3NldCBzb3VyY2VQYXRoIC0gVGhlIGdlbmVyYXRlZCBvdXRwdXQgZGlyZWN0b3JpZXMgYWxzbyBiZWNvbWUgcGFydCBvZiB0aGUgc291cmNlcGF0aAotICAgICAgICBQYXRoIHNvdXJjZVBhdGggPSBuZXcgUGF0aChjb2RlR2VuUHJvamVjdCwgb3V0cHV0TG9jYXRpb24pOwotICAgICAgICBzb3VyY2VQYXRoLnNldExvY2F0aW9uKG91dHB1dExvY2F0aW9uRmlsZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRTcmNkaXIoc291cmNlUGF0aCk7Ci0KLSAgICAgICAgLy9vdXRwdXQgdGhlIGNsYXNzZXMgaW50byB0aGUgb3V0cHV0IGRpciBhcyB3ZWxsCi0gICAgICAgIGphdmFDb21waWxlci5zZXREZXN0ZGlyKG91dHB1dExvY2F0aW9uRmlsZSk7Ci0gICAgICAgIGphdmFDb21waWxlci5zZXRWZXJib3NlKHRydWUpOwotICAgICAgICBqYXZhQ29tcGlsZXIuZXhlY3V0ZSgpOwotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBmaWxsT3B0aW9uTWFwKFN0cmluZyB3c2RsRmlsZU5hbWUsIFN0cmluZyBvdXRwdXRMb2NhdGlvbikgewotICAgICAgICBNYXAgb3B0aW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgb3B0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuV1NETF9MT0NBVElPTl9VUklfT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5XU0RMX0xPQ0FUSU9OX1VSSV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyB3c2RsRmlsZU5hbWUgfSkpOwotCi0gICAgICAgIC8vdXNlIGRlZmF1bHQgc3luYyBvcHRpb24gLSBObyBvcHRpb24gaXMgZ2l2ZW4KLSAgICAgICAgLy91c2UgZGVmYXVsdCBhc3luYyBvcHRpb24gLSBObyBvcHRpb24gaXMgZ2l2ZW4KLSAgICAgICAgLy91c2UgZGVmYXVsdCBsYW5ndWFnZSBvcHRpb24gLSBObyBvcHRpb24gaXMgZ2l2ZW4KLSAgICAgICAgLy9vdXRwdXQgbG9jYXRpb24gLSBjb2RlX2dlbl9vdXRwdXQKLQotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5PVVRQVVRfTE9DQVRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgb3V0cHV0TG9jYXRpb24gfSkpOwotICAgICAgICAvL3NlcnZlciBzaWRlIG9wdGlvbiBpcyBvbgotICAgICAgICBvcHRpb25NYXAucHV0KAotICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5TRVJWRVJfU0lERV9DT0RFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuU0VSVkVSX1NJREVfQ09ERV9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIC8vIGRlc2NyaXB0b3Igb3B0aW9uIGlzIG9uCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX1NFUlZJQ0VfREVTQ1JJUFRJT05fT1BUSU9OLAotICAgICAgICAgICAgICAgIG5ldyBDb21tYW5kTGluZU9wdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lT3B0aW9uQ29uc3RhbnRzLldTREwySmF2YUNvbnN0YW50cy5HRU5FUkFURV9TRVJWSUNFX0RFU0NSSVBUSU9OX09QVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbMF0pKTsKLSAgICAgICAgLy8gZGIgaXMgeG1sYmVhbnMgb3B0aW9uIGlzIG9uCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkRBVEFfQklORElOR19UWVBFX09QVElPTiwKLSAgICAgICAgICAgICAgICBuZXcgQ29tbWFuZExpbmVPcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5XU0RMMkphdmFDb25zdGFudHMuREFUQV9CSU5ESU5HX1RZUEVfT1BUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgVGVzdENvbnN0YW50cy5EYXRhYmluZGluZy5YTUxfQkVBTlMgfSkpOwotCi0gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0gICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sCi0gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVPcHRpb25Db25zdGFudHMuV1NETDJKYXZhQ29uc3RhbnRzLkdFTkVSQVRFX0FMTF9PUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0KLSAgICAgICAgLy90b2RvIE1ha2UgdGhpcyB3b3JrCi0gICAgICAgIC8vdGVzdCBjYXNlIG9wdGlvbiBpcyBvbgotLy8gICAgICAgIG9wdGlvbk1hcC5wdXQoCi0vLyAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotLy8gICAgICAgICAgICAgICAgbmV3IENvbW1hbmRMaW5lT3B0aW9uKAotLy8gICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZU9wdGlvbkNvbnN0YW50cy5HRU5FUkFURV9URVNUX0NBU0VfT1BUSU9OLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nWzBdKSk7Ci0gICAgICAgIC8vZGF0YWJpbmRpbmcgaXMgZGVmYXVsdAotCi0gICAgICAgIHJldHVybiBvcHRpb25NYXA7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzFfNS9wb20ueG1sIGIvMV81L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjRjNGUuLjAwMDAwMDAKLS0tIGEvMV81L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotICB+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgfiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIH4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICB+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgfiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICB+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIH4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIH4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgfiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIH4gdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5hcGFjaGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjc8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUuYXhpczI8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+YXhpczI8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS41LjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgICA8bmFtZT5BcGFjaGUgQXhpczIgLSBSb290PC9uYW1lPgotICAgIDxpbmNlcHRpb25ZZWFyPjIwMDQ8L2luY2VwdGlvblllYXI+Ci0gICAgPHVybD5odHRwOi8vYXhpcy5hcGFjaGUub3JnL2F4aXMyL2phdmEvY29yZS88L3VybD4KLSAgICA8aXNzdWVNYW5hZ2VtZW50PgotICAgICAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICAgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQVhJUzI8L3VybD4KLSAgICA8L2lzc3VlTWFuYWdlbWVudD4KLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Jlc291cmNlLWJ1bmRsZTwvbW9kdWxlPiA8IS0tIE11c3QgYmUgZmlyc3QgaW4gdGhlIGxpc3QhIC0tPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvYWRiPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9hZGItY29kZWdlbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvYWRkcmVzc2luZzwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvY29kZWdlbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvZmFzdGluZm9zZXQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2ludGVncmF0aW9uPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9qYXZhMndzZGw8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2ppYng8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2pzb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2tlcm5lbDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvbWV4PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9tdG9tcG9saWN5PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9tdG9tcG9saWN5LW1hcjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvcGFyZW50PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9waW5nPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9zYW1wbGVzL3ZlcnNpb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3NvYXBtb25pdG9yL3NlcnZsZXQ8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3NvYXBtb25pdG9yL21vZHVsZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvc3ByaW5nPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90b29sL2F4aXMyLWFhci1tYXZlbi1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Rvb2wvYXhpczItYW50LXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1lY2xpcHNlLWNvZGVnZW4tcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90b29sL2F4aXMyLWVjbGlwc2Utc2VydmljZS1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Rvb2wvYXhpczItaWRlYS1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3Rvb2wvYXhpczItamF2YTJ3c2RsLW1hdmVuLXBsdWdpbjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdG9vbC9heGlzMi1tYXItbWF2ZW4tcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90b29sL2F4aXMyLXJlcG8tbWF2ZW4tcGx1Z2luPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90b29sL2F4aXMyLXdzZGwyY29kZS1tYXZlbi1wbHVnaW48L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3dlYmFwcDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMveG1sYmVhbnM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3NjcmlwdGluZzwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvamF4YnJpPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9tZXRhZGF0YTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvc2FhajwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvamF4d3M8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2pheHdzLW1hcjwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvamF4d3MtaW50ZWdyYXRpb248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2NsdXN0ZXJpbmc8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2NvcmJhPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9vc2dpPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy90cmFuc3BvcnQvbG9jYWw8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL3RyYW5zcG9ydC9odHRwPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIFRoaXMgcHJvZmlsZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQgd2hlbiBkb2luZyB0aGUgcmVsZWFzZTpwcmVwYXJlCi0gICAgICAgICAgICAgICAgIChieSBhZGRpbmcgLVBldmVyeXRoaW5nKSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVsZWFzZSBwbHVnaW4gdXBkYXRlcwotICAgICAgICAgICAgICAgICB0aGUgdmVyc2lvbiBudW1iZXJzIG9mIGFsbCByZWxldmFudCBzdWJtb2R1bGVzLiBJdCBtdXN0IGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgYWxsIG1vZHVsZXMgbm90IGJ1aWx0IGJ5IGRlZmF1bHQsIGkuZS4gdGhlIHNldCBvZiBtb2R1bGVzIHVzZWQKLSAgICAgICAgICAgICAgICAgYnkgdGhpcyBwcm9maWxlIG11c3QgYmUgdGhlIHVuaW9uIG9mIHRoZSBtb2R1bGUgc2V0cyBvZiBhbGwKLSAgICAgICAgICAgICAgICAgb3RoZXIgcHJvZmlsZXMuIC0tPgotICAgICAgICAgICAgPGlkPmV2ZXJ5dGhpbmc8L2lkPgotICAgICAgICAgICAgPG1vZHVsZXM+Ci0gICAgICAgICAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2RvY3VtZW50YXRpb248L21vZHVsZT4KLSAgICAgICAgICAgICAgICA8bW9kdWxlPm1vZHVsZXMvZGlzdHJpYnV0aW9uPC9tb2R1bGU+Ci0gICAgICAgICAgICA8L21vZHVsZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLXJlbGVhc2U8L2lkPgotICAgICAgICAgICAgPG1vZHVsZXM+Ci0gICAgICAgICAgICAgICAgPG1vZHVsZT5tb2R1bGVzL2Rpc3RyaWJ1dGlvbjwvbW9kdWxlPgotICAgICAgICAgICAgPC9tb2R1bGVzPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBPdmVycmlkZSB0aGUgZXhlY3V0aW9uIGRlZmluZWQgaW4gb3JnLmFwYWNoZTphcGFjaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBzb3VyY2UtcmVsZWFzZSBhc3NlbWJseSBpcyBub3QgYnVpbHQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UgZGVmaW5lIG91ciBvd24gc291cmNlIGRpc3RyaWJ1dGlvbiBpbiBtb2R1bGVzL2Rpc3RyaWJ1dGlvbi4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zb3VyY2UtcmVsZWFzZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEFzc2VtYmx5PnRydWU8L3NraXBBc3NlbWJseT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLSAgICA8bWFpbGluZ0xpc3RzPgotICAgICAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICAgICAgICA8bmFtZT5BeGlzMiBEZXZlbG9wZXIgTGlzdDwvbmFtZT4KLSAgICAgICAgICAgIDxzdWJzY3JpYmU+amF2YS1kZXYtc3Vic2NyaWJlQGF4aXMuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPmphdmEtZGV2LXVuc3Vic2NyaWJlQGF4aXMuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICAgICAgICA8cG9zdD5qYXZhLWRldkBheGlzLmFwYWNoZS5vcmc8L3Bvc3Q+Ci0gICAgICAgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2F4aXMtamF2YS1kZXYvPC9hcmNoaXZlPgotICAgICAgICAgICAgPG90aGVyQXJjaGl2ZXM+Ci0gICAgICAgICAgICAgICAgPG90aGVyQXJjaGl2ZT5odHRwOi8vbWFya21haWwub3JnL3NlYXJjaC9saXN0Om9yZy5hcGFjaGUud3MuYXhpcy1kZXY8L290aGVyQXJjaGl2ZT4KLSAgICAgICAgICAgIDwvb3RoZXJBcmNoaXZlcz4KLSAgICAgICAgPC9tYWlsaW5nTGlzdD4KLSAgICAgICAgPG1haWxpbmdMaXN0PgotICAgICAgICAgICAgPG5hbWU+QXhpczIgVXNlciBMaXN0PC9uYW1lPgotICAgICAgICAgICAgPHN1YnNjcmliZT5qYXZhLXVzZXItc3Vic2NyaWJlQGF4aXMuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgotICAgICAgICAgICAgPHVuc3Vic2NyaWJlPmphdmEtdXNlci11bnN1YnNjcmliZUBheGlzLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgICAgICAgPHBvc3Q+amF2YS11c2VyQGF4aXMuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYXhpcy1qYXZhLXVzZXIvPC9hcmNoaXZlPgotICAgICAgICAgICAgPG90aGVyQXJjaGl2ZXM+Ci0gICAgICAgICAgICAgICAgPG90aGVyQXJjaGl2ZT5odHRwOi8vbWFya21haWwub3JnL3NlYXJjaC9saXN0Om9yZy5hcGFjaGUud3MuYXhpcy11c2VyPC9vdGhlckFyY2hpdmU+Ci0gICAgICAgICAgICA8L290aGVyQXJjaGl2ZXM+Ci0gICAgICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPC9tYWlsaW5nTGlzdHM+Ci0gICAgPGRldmVsb3BlcnM+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5TYW1pbmRhIEFiZXlydXdhbjwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5zYW1pbmRhPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5zYW1pbmRhIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkFma2hhbSBBemVlejwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5hemVlejwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+YXplZXogQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+YXplZXo8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5KZWZmIEJhcnJldHQ8L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkVyYW4gQ2hpbnRoYWthPC9uYW1lPgotICAgICAgICAgICAgPGlkPmNoaW50aGFrYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Y2hpbnRoYWthIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvfmNoaW50aGFrYTwvdXJsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkdsZW4gRGFuaWVsczwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5nZGFuaWVsczwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Z2RhbmllbHMgQVQgYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPlNvbmljIFNvZnR3YXJlPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QnJpYW4gRGVQcmFkaW5lPC9uYW1lPgotICAgICAgICAgICAgPGlkPnByYWRpbmU8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnByYWRpbmUgQVQgdWsuaWJtLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkphbGl5YSBFa2FuYXlha2U8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+amFsaXlhPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5qYWxpeWEgQVQgb3BlbnNvdXJjZS5sazwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkluZGlhbmEgVW5pdmVyc2l0eSwgVVNBPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+amFsaXlhPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+UnVjaGl0aCBGZXJuYW5kbzwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5ydWNoaXRoZjwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+cnVjaGl0aCBBVCB3c28yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5OaWNob2xhcyBHYWxsYXJkbzwvbmFtZT4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+VGhpbGluYSBHdW5hcmF0aG5lPC9uYW1lPgotICAgICAgICAgICAgPGlkPnRoaWxpbmE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnRoaWxpbmEgQVQgb3BlbnNvdXJjZS5sazwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxhbmthIFNvZnR3YXJlIEZvdW5kYXRpb248L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5DaGF0aHVyYSBIZXJhdGg8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+Y2hhdGh1cmE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmNoYXRodXJhIEFUIG9wZW5zb3VyY2UubGs8L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JbmRpYW5hIFVuaXZlcnNpdHksIFVTQTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHVybD53d3cuYXBhY2hlLm9yZy9+Y2hhdGh1cmE8L3VybD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5EYXZpZCBJbGxzbGV5PC9uYW1lPgotICAgICAgICAgICAgPGlkPmRhdmlkaWxsc2xleTwvaWQ+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmlsbHNsZXkub3JnPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+RGVlcGFsIEpheWFzaW5naGU8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+ZGVlcGFsPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5kZWVwYWwgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9+ZGVlcGFsPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+Um9iZXJ0IExhemFyc2tpPC9uYW1lPgotICAgICAgICAgICAgPGlkPnJvYmVydGxhemFyc2tpPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5yb2JlcnRsYXphcnNraSBBVCBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5CcmF6aWwgT3V0c291cmNlPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+U3RldmUgTG91Z2hyYW48L25hbWU+Ci0gICAgICAgICAgICA8aWQ+c3RldmVsPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5zdGV2ZWwgQVQgYXBhY2hlLm9yZzwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkhQIGxhYnM8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5CaWxsIE5hZ3k8L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkNoYXRyYSBOYWtrYXdpdGE8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+Y2hhdHJhPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5jaGF0cmEgQVQgV1NPMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+U3VtZWRoYSBSdWJhc2luZ2hlPC9uYW1lPgotICAgICAgICAgICAgPGlkPnN1bWVkaGE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnN1bWVkaGEgQVQgV1NPMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+Q2hhcml0aGEgS2Fta2FuYW1nZTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5jaGFyaXRoYTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Y2hhcml0aGEgQVQgV1NPMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+U3JpbmF0aCBQZXJlcmE8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+aGVtYXBhbmk8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmhlbWFwYW5pIEFUIGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JbmRpYW5hIFVuaXZlcnNpdHksIFVTQTwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvfmhlbWFwYW5pPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QWppdGggUmFuYWJhaHU8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+YWppdGg8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmFqaXRoIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvfmFqaXRoPC91cmw+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+VmVua2F0IFJlZGR5PC9uYW1lPgotICAgICAgICAgICAgPGlkPnZlbmthdDwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+dnJlZGR5cCBBVCBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Db21wdXRlciBBc3NvY2lhdGVzPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+TWljaGFlbCBSaGVpbmhlaW1lcjwvbmFtZT4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QW5uIFJvYmluc29uPC9uYW1lPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5JQk08L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5TYW5rYSBTYW1hcmFuYXlha2U8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+c2Fua2E8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnNhbmthIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPlJpY2ggU2NoZXVlcmxlPC9uYW1lPgotICAgICAgICAgICAgPGlkPnNjaGV1PC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5zY2hldSBBVCB1cy5pYm0uY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SUJNPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+QXNodXRvc2ggU2hhaGk8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+YXNodTwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+QXNodXRvc2guU2hhaGkgQVQgY2EuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+Q29tcHV0ZXIgQXNzb2NpYXRlczwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkFsZWtzYW5kZXIgU2xvbWluc2tpPC9uYW1lPgotICAgICAgICAgICAgPGlkPmFsZWs8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmFzbG9tIEFUIGNzLmluZGlhbmEuZWR1PC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+SW5kaWFuYSBVbml2ZXJzaXR5IEV4dHJlbWUhIENvbXB1dGluZyBMYWI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5EZW5uaXMgU29zbm9za2k8L25hbWU+Ci0gICAgICAgICAgICA8aWQ+ZHNvc25vc2tpPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5kbXMgQVQgc29zbm9za2kuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+U29zbm9za2kgU29mdHdhcmU8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5EYXZhbnVtIFNyaW5pdmFzPC9uYW1lPgotICAgICAgICAgICAgPGlkPmRpbXM8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmRhdmFudW0gQVQgZ21haWwuY29tPC9lbWFpbD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5KYXlhY2hhbmRyYSBTZWtoYXJhIFJhbyBTdW5rYXJhPC9uYW1lPgotICAgICAgICAgICAgPGlkPmpheWE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmpheWFjaGFuZHJhIEFUIGdtYWlsLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkNvbXB1dGVyIEFzc29jaWF0ZXM8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5OYW5kYW5hIE1paGluZHVrdWxhc29vcml5YTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5uYW5kYW5hPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5uYW5kYW5hIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPk5pa2hpbCBUaGFrZXI8L25hbWU+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPklCTTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkNoYW1pbCBUaGFudGhyaW11ZGFsaWdlPC9uYW1lPgotICAgICAgICAgICAgPGlkPmNoYW1pbDwvaWQ+Ci0gICAgICAgICAgICA8ZW1haWw+Y2hhbWlsIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkRhc2FyYXRoIFdlZXJhdGh1bmdhPC9uYW1lPgotICAgICAgICAgICAgPGlkPmRhc2FyYXRoPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD5kYXNhcmF0aCBBVCBvcGVuc291cmNlLmxrPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+UHVyZHVlIFVuaXZlcnNpdHksIFVTQTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkVyYW5nYSBKYXlhc3VuZGVyYTwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5lcmFuZ2E8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmVyYW5nYSBBVCBhcGFjaGUub3JnPC9lbWFpbD4KLSAgICAgICAgPC9kZXZlbG9wZXI+Ci0gICAgICAgIDxkZXZlbG9wZXI+Ci0gICAgICAgICAgICA8bmFtZT5TYW5qaXZhIFdlZXJhd2FyYW5hPC9uYW1lPgotICAgICAgICAgICAgPGlkPnNhbmppdmE8L2lkPgotICAgICAgICAgICAgPGVtYWlsPnNhbmppdmEgQVQgd3NvMi5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5XU08yPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvZGV2ZWxvcGVyPgotICAgICAgICA8ZGV2ZWxvcGVyPgotICAgICAgICAgICAgPG5hbWU+S2VpdGggQ2hhcG1hbjwvbmFtZT4KLSAgICAgICAgICAgIDxpZD5rZWl0aGM8L2lkPgotICAgICAgICAgICAgPGVtYWlsPmtlaXRoIEFUIHdzbzIuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+V1NPMjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICAgICAgPGRldmVsb3Blcj4KLSAgICAgICAgICAgIDxuYW1lPkFuZHJlYXMgVmVpdGhlbjwvbmFtZT4KLSAgICAgICAgICAgIDxpZD52ZWl0aGVuPC9pZD4KLSAgICAgICAgICAgIDxlbWFpbD52ZWl0aGVuIEFUIGFwYWNoZS5vcmc8L2VtYWlsPgotICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hdmVpdGhlbjwvdXJsPgotICAgICAgICA8L2RldmVsb3Blcj4KLSAgICA8L2RldmVsb3BlcnM+Ci0gICAgPGNvbnRyaWJ1dG9ycz4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+R2F5YW4gQXNhbmthPC9uYW1lPgotICAgICAgICAgICAgPGVtYWlsPmdheWFuIEFUIG9wZW5zb3VyY2UubGs8L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5MYW5rYSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvY29udHJpYnV0b3I+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPkRoYXJzaGFuYSBEaWFzPC9uYW1lPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5MYW5rYSBTb2Z0d2FyZSBGb3VuZGF0aW9uIC8gVW5pdmVyc2l0eSBvZiBNb3JhdHV3YTwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5OYWRhbmEgR3VuYXJhdGhuYTwvbmFtZT4KLSAgICAgICAgICAgIDxlbWFpbD5uYWRhbmEgQVQgb3BlbnNvdXJjZS5sazwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxhbmthIFNvZnR3YXJlIEZvdW5kYXRpb248L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+VGhpbGluaSBHdW5hd2FyZGhhbmE8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+dGhpbGluaSBBVCBXU08yLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPldTTzI8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLSAgICAgICAgPGNvbnRyaWJ1dG9yPgotICAgICAgICAgICAgPG5hbWU+QW51c2hrYSBLdW1hcmE8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+YW51c2hrYWt1bWFyIEFUIGdtYWlsLmNvbTwvZW1haWw+Ci0gICAgICAgICAgICA8b3JnYW5pemF0aW9uPkxhbmthIFNvZnR3YXJlIEZvdW5kYXRpb24gLyBVbml2ZXJzaXR5IG9mIE1vcmF0dXdhPC9vcmdhbml6YXRpb24+Ci0gICAgICAgIDwvY29udHJpYnV0b3I+Ci0gICAgICAgIDxjb250cmlidXRvcj4KLSAgICAgICAgICAgIDxuYW1lPkZhcmhhYW4gTW9oaWRlZW48L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+Zm1vaGlkZWVuIEFUIHZhbGlzdGEuY29tPC9lbWFpbD4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgotICAgICAgICA8L2NvbnRyaWJ1dG9yPgotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5DaGludGhha2EgVGhpbGFrYXJhdGhuZTwvbmFtZT4KLSAgICAgICAgICAgIDxvcmdhbml6YXRpb24+TGFua2EgU29mdHdhcmUgRm91bmRhdGlvbiAvIFVuaXZlcnNpdHkgb2YgTW9yYXR1d2E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLQotICAgICAgICA8Y29udHJpYnV0b3I+Ci0gICAgICAgICAgICA8bmFtZT5TaGl2YW50aGEgSHVydWdnYW11d2E8L25hbWU+Ci0gICAgICAgICAgICA8ZW1haWw+c2hpdmFudGhhaCBBVCBnbWFpbC5jb208L2VtYWlsPgotICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5Vbml2ZXJzaXR5IE9mIFBlcmFkZW5peWEgLCBTcmkgTGFua2E8L29yZ2FuaXphdGlvbj4KLSAgICAgICAgPC9jb250cmlidXRvcj4KLQotICAgIDwvY29udHJpYnV0b3JzPgotICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNTwvY29ubmVjdGlvbj4KLSAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9heGlzL2F4aXMyL2phdmEvY29yZS9icmFuY2hlcy9qYXZhLzFfNTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2F4aXMvYXhpczIvamF2YS9jb3JlL2JyYW5jaGVzL2phdmEvMV81PC91cmw+Ci0gICAgPC9zY20+Ci0gICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90cy5odHRwczwvaWQ+Ci0gICAgICAgICAgICA8bmFtZT4ke2Rpc3RNZ210U25hcHNob3RzTmFtZX08L25hbWU+Ci0gICAgICAgICAgICA8dXJsPiR7ZGlzdE1nbXRTbmFwc2hvdHNVcmx9PC91cmw+Ci0gICAgICAgICAgICA8dW5pcXVlVmVyc2lvbj5mYWxzZTwvdW5pcXVlVmVyc2lvbj4KLSAgICAgICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8IS0tIE5lZWQgMS4xIHRvIGF2b2lkIE1HUEctMTcgLS0+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXV0b1ZlcnNpb25TdWJtb2R1bGVzPnRydWU8L2F1dG9WZXJzaW9uU3VibW9kdWxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gImNsZWFuIHZlcmlmeSIgZmFpbHMgYmVjYXVzZSBmb3IgT1NHaSBidW5kbGVzLCB0aGVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhIG1pc21hdGNoIGJldHdlZW4gdGhlIHR5cGUgb2YgdGhlIGRlcGVuZGVuY3kgKGphcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBhY3R1YWwgcGFja2FnaW5nIChidW5kbGUpIGFuZCBNYXZlbiByZXNvbHZlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBmcm9tIHRoZSBsb2NhbCByZXBvc2l0b3J5IGluc3RlYWQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWN0b3IuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPHByZXBhcmF0aW9uR29hbHM+Y2xlYW4gaW5zdGFsbDwvcHJlcGFyYXRpb25Hb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxmYWlsT25FcnJvcj5mYWxzZTwvZmFpbE9uRXJyb3I+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItcmVzb3VyY2UtYnVuZGxlOiR7cG9tLnZlcnNpb259PC9yZXNvdXJjZUJ1bmRsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8IS0tIE5vdGU6IHRoZSBwbHVnaW5NYW5hZ2VtZW50IGluIGF4aXMyLXBhcmVudCBkb2Vzbid0IGFwcGx5IGhlcmU7IHRodXMKLSAgICAgICAgICAgICAgICAgICAgIHdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgdmVyc2lvbiBpZiB3ZSB3YW50IGEgcHJlZGljdGFibGUgYnVpbGQhIC0tPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi1iZXRhLTU8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvamFyLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xXzUvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtZG9jcy50eHQgYi8xXzUvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtZG9jcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGYyNjUuLjAwMDAwMDAKLS0tIGEvMV81L3JlbGVhc2UtZG9jcy9yZWFkbWUtZmlsZXMvUkVBRE1FLWRvY3MudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotQXBhY2hlIEF4aXMyIEBheGlzVmVyc2lvbkAgYnVpbGQgKEBUT0RBWUApCi1Eb2N1bWVudGF0aW9uIFJlbGVhc2UKLQotaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGlzIHJlbGVhc2UgY29udGFpbnMKLTEuIHhkb2NzCi0yLiBqYXZhZG9jcwotCi14ZG9jcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBkb2N1bWVudGF0aW9uLCB0dXRvcmlhbHMgZXRjLgotcmVsYXRlZCB0byB0aGlzIEF4aXMyIHJlbGVhc2UsIGFuZCBhcmUgYXZhaWxhYmxlIG9ubGluZSBhcyB3ZWxsLgotCi1qYXZhZG9jcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBKYXZhZG9jIEFQSSAKLWRvY3VtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEF4aXMyIFJlbGVhc2UuCi0KZGlmZiAtLWdpdCBhLzFfNS9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL1JFQURNRS1zdGQtYmluLnR4dCBiLzFfNS9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL1JFQURNRS1zdGQtYmluLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkMGJlMC4uMDAwMDAwMAotLS0gYS8xXzUvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtc3RkLWJpbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotQXBhY2hlIEF4aXMyICR7cHJvamVjdC52ZXJzaW9ufSBidWlsZCAoJHtidWlsZFRpbWVzdGFtcH0pDQotQmluYXJ5IFJlbGVhc2UNCi0NCi1odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQ0KLVRoaXMgaXMgdGhlIFN0YW5kYXJkIEJpbmFyeSBSZWxlYXNlIG9mIEF4aXMyLg0KLQ0KLVRoZSBsaWIgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBBeGlzMiBqYXJzIGFuZCBhbGwgM3JkIHBhcnR5IGRpc3RyaWJ1dGFibGUgZGVwZW5kZW5jaWVzIG9mDQotdGhlc2UgamFycy4NCi0NCi1UaGUgcmVwb3NpdG9yeS9tb2R1bGVzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZGVwbG95YWJsZSBhZGRyZXNzaW5nIG1vZHVsZS4NCi0NCi1UaGUgd2ViYXBwIGZvbGRlciBjb250YWlucyBhbiBhbnQgYnVpbGQgc2NyaXB0IHRvIGdlbmVyYXRlIHRoZSBheGlzMi53YXIgb3V0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLg0KLShUaGlzIHJlcXVpcmVzIEFudCAxLjYuNSBvciBsYXRlcikNCi0NCi1UaGUgc2FtcGxlcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBBeGlzMiBzYW1wbGVzIHdoaWNoIGRlbW9uc3RyYXRlcyBzb21lIG9mIHRoZSBrZXkgZmVhdHVyZXMgb2YNCi1BeGlzMi4gSXQgYWxzbyBjb250YWlucyBhIGZldyBzYW1wbGVzIHJlbGV2YW50IHRvIGRvY3VtZW50cyBmb3VuZCBpbiBBeGlzMidzIERvY3MgRGlzdHJpYnV0aW9uLg0KLQ0KLVRoZSBiaW4gZGlyZWN0b3J5IGNvbnRhaW5zIGEgc2V0IG9mIHVzZWZ1bGwgc2NyaXB0cyBmb3IgdGhlIHVzZXJzLg0KLQ0KLVRoZSBjb25mIGRpcmVjdG9yeSBjb250YWlucyB0aGUgYXhpczIueG1sIGZpbGUgd2hpY2ggYWxsb3dzIHRvIGNvbmZpZ3VyZSBBeGlzMi4NCi0NCi0oUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHJlbGVhc2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3RoZXIgV1MtKiBpbXBsZW1lbnRhdGlvbiBtb2R1bGVzLCBsaWtlDQotV1MtU2VjdXJpdHksIHRoYXQgYXJlIGJlaW5nIGRldmVsb3BlZCB3aXRoaW4gQXhpczIuIFRob3NlIGNhbiBiZSBkb3dubG9hZGVkIGZyb20NCi1odHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi9tb2R1bGVzLykNCmRpZmYgLS1naXQgYS8xXzUvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtc3RkLXNyYy50eHQgYi8xXzUvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9SRUFETUUtc3RkLXNyYy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODRlYmUuLjAwMDAwMDAKLS0tIGEvMV81L3JlbGVhc2UtZG9jcy9yZWFkbWUtZmlsZXMvUkVBRE1FLXN0ZC1zcmMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLUFwYWNoZSBBeGlzMiAke3Byb2plY3QudmVyc2lvbn0gYnVpbGQgKCR7YnVpbGRUaW1lc3RhbXB9KQ0KLVNvdXJjZSBSZWxlYXNlDQotDQotaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczINCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0NCi1UaGlzIGlzIHRoZSBTdGFuZGFyZCBTb3VyY2UgUmVsZWFzZSBvZiBBeGlzMi4NCi0NCi1UaGUgbW9kdWxlcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgdmFyaW91cyBBeGlzMg0KLWNvbXBvbmVudHMuIFRoZSBkaXN0cmlidXRpb24gY2FuIGJlIGJ1aWx0IHdpdGggTWF2ZW4gMi54IGJ5IGV4ZWN1dGluZw0KLSJtdm4gY2xlYW4gaW5zdGFsbCIuDQotDQotKFBsZWFzZSBub3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdGhlciBXUy0qIGltcGxlbWVudGF0aW9uIG1vZHVsZXMsIA0KLWxpa2UgV1MtU2VjdXJpdHksIHRoYXQgYXJlIGJlaW5nIGRldmVsb3BlZCB3aXRoaW4gQXhpczIuIFRob3NlIGNhbiBiZSBkb3dubG9hZGVkDQotIGZyb20gaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvbW9kdWxlcy8pDQotIA0KLQ0KLQ0KZGlmZiAtLWdpdCBhLzFfNS9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL2luc3RhbGxhdGlvbi1zdGQtYmluLnR4dCBiLzFfNS9yZWxlYXNlLWRvY3MvcmVhZG1lLWZpbGVzL2luc3RhbGxhdGlvbi1zdGQtYmluLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkN2ZkMi4uMDAwMDAwMAotLS0gYS8xXzUvcmVsZWFzZS1kb2NzL3JlYWRtZS1maWxlcy9pbnN0YWxsYXRpb24tc3RkLWJpbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIEF4aXMyIEJpbmFyeSBEaXN0cmlidXRpb24gSW5zdGFsbGF0aW9uIEd1aWRlCi0gICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTEuIERvd25sb2FkIGFuZCBJbnN0YWxsIHRoZSBBcGFjaGUgQXhpczIgQmluYXJ5IERpc3RyaWJ1dGlvbgotCi0gIERvd25sb2FkIGFuZCBpbnN0YWxsIGEgSmF2YSBEZXZlbG9wbWVudCBLaXQgKEpESykgcmVsZWFzZSAodmVyc2lvbiAxLjUgb3IKLSAgbGF0ZXIpIGZyb20gaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLy4gSW5zdGFsbCB0aGUgSkRLIGFjY29yZGluZyB0byB0aGUKLSAgaW5zdHJ1Y3Rpb25zIGluY2x1ZGVkIHdpdGggdGhlIHJlbGVhc2UuIFNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUgCi0gIHRvIHRoZSBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggeW91IGluc3RhbGxlZCB0aGUgSkRLIHJlbGVhc2UuCi0KLSAgRG93bmxvYWQgYW5kIHVucGFjayB0aGUgQXhpczIgQmluYXJ5IERpc3RyaWJ1dGlvbiBpbnRvIGEgY29udmVuaWVudAotICBsb2NhdGlvbiBzbyB0aGF0IHRoZSBkaXN0cmlidXRpb24gcmVzaWRlcyBpbiBpdHMgb3duIGRpcmVjdG9yeS4gU2V0IGFuIAotICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQVhJUzJfSE9NRSB0byB0aGUgcGF0aG5hbWUgb2YgdGhlIGV4dHJhY3RlZCBkaXJlY3RvcnkgCi0gIG9mIEF4aXMyIChFZzogL29wdC9heGlzMi0ke3Byb2plY3QudmVyc2lvbn0pLgotCi0KLTIuIFN0YXJ0aW5nIHVwIEF4aXMyIFN0YW5kYWxvbmUgU2VydmVyCi0KLSAgU3RhbmRhbG9uZSBBeGlzMiBzZXJ2ZXIgY2FuIGJlIHN0YXJ0ZWQgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0gIAkJCSVBWElTMl9IT01FJVxiaW5cYXhpczJzZXJ2ZXIuYmF0IChXaW5kb3dzKQotICAJCQkkQVhJUzJfSE9NRS9iaW4vYXhpczJzZXJ2ZXIuc2ggKFVuaXgpCi0KLSAgQWZ0ZXIgc3RhcnR1cCwgdGhlIGRlZmF1bHQgd2ViIHNlcnZpY2VzIGluY2x1ZGVkIHdpdGggQXhpczIgd2lsbCBiZSBhdmFpbGFibGUgCi0gIGJ5IHZpc2l0aW5nIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9heGlzMi9zZXJ2aWNlcy8KLQotCi0zLiBCdWlsZGluZyB0aGUgQXhpczIgV2ViIEFwcGxpY2F0aW9uIChheGlzMi53YXIpIFVzaW5nIFN0YW5kYXJkIEJpbmFyeSAKLURpc3RyaWJ1dGlvbgotCi0gIERvd25sb2FkIGFuZCBpbnN0YWxsIEFwYWNoZSBBbnQgKHZlcnNpb24gMS42LjUgb3IgbGF0ZXIpIGZyb20gaHR0cDovLwotICBhbnQuYXBhY2hlLm9yZy4gSW5zdGFsbCB0aGUgQXBhY2hlIEFudCBhY2NvcmRpbmcgdG8gdGhlIGluc3RydWN0aW9ucyBpbmNsdWRlZCAKLSAgd2l0aCB0aGUgQW50IHJlbGVhc2UuCi0KLSAgTG9jYXRlIHRoZSBhbnQgYnVpbGQgZmlsZSAoYnVpbGQueG1sKSBpbnNpZGUgdGhlIHdlYmFwcCBkaXJlY3Rvcnkgd2hpY2ggCi0gIHJlc2lkZXMgaW4geW91ciBBeGlzMiBob21lIGRpcmVjdG9yeSAoaS5lOi0gJEFYSVNfSE9NRS93ZWJhcHApIi4gUnVuIHRoZSBBbnQgCi0gIGJ1aWxkIGJ5IGV4ZWN1dGluZyAiYW50IGNyZWF0ZS53YXIiIGluc2lkZSB0aGUgJEFYSVMyX0hPTUUvd2ViYXBwcyBmb2xkZXIuIAotICAKLSAgWW91IGNhbiBmaW5kIHRoZSBnZW5lcmF0ZWQgYXhpczIud2FyIGluc2lkZSB0aGUgJEFYSVMyX0hPTUUvZGlzdCBkaXJlY3RvcnkuIAotICBBbGwgdGhlIHNlcnZpY2VzIGFuZCBtb2R1bGVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIEFYSVMyX0hPTUUvcmVwb3NpdG9yeSAKLSAgd2lsbCBiZSBwYWNrZWQgaW4gdG8gdGhlIGNyZWF0ZWQgYXhpczIud2FyIHRvZ2V0aGVyIHdpdGggdGhlIEF4aXMyIAotICBjb25maWd1cmF0aW9uIGZpbGUgZm91bmQgYXQgJEFYSVMyX0hPTUUvY29uZi9heGlzMi54bWwuCi0KLSAgRHJvcCB0aGUgd2FyIGluIHRoZSB3ZWJhcHBzIGZvbGRlciBvZiB0aGUgc2VydmxldCBjb250YWluZXIuIE1vc3Qgc2VydmxldCAKLSAgY29udGFpbmVycyB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCB3YXIuIChzb21lIHNlcnZsZXQgY29udGFpbmVycyBtYXkgCi0gIHJlcXVpcmUgYSByZXN0YXJ0IGluIG9yZGVyIHRvIGNhcHR1cmUgdGhlIG5ldyBXZWIgYXBwbGljYXRpb24uIFJlZmVyIHlvdXIgCi0gIHNlcnZsZXQgY29udGFpbmVyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcy4pIE9uY2UgdGhlIAotICBXQVIgaXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCwgdGVzdCBpdCBieSBwb2ludGluZyB0aGUgV2ViIGJyb3dzZXIgdG8gdGhlIAotICBodHRwOi8vPGhvc3QgOnBvcnQ+L2F4aXMyLiBJdCBzaG91bGQgcHJvZHVjZSB0aGUgdGhlIEF4aXMyIFdlYiBBcHBsaWNhdGlvbiAKLSAgSG9tZSBQYWdlLgotICAKLSAgVXNlIHRoZSBsaW5rICJWYWxpZGF0ZSIgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZyBpcyBmaW5lIGFuZCBzbW9vdGguIElmIHRoZSAKLSAgdmFsaWRhdGlvbiBmYWlscyB0aGVuIHRoZSB3YXIgaGFzIGZhaWxlZCB0byBpbnN0YWxsIHByb3Blcmx5IG9yIHNvbWUgCi0gIGVzc2VudGlhbCBqYXJzIGFyZSBtaXNzaW5nLiBBdCBzdWNoIGEgc2l0dWF0aW9uIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAKLSAgcGFydGljdWxhciBzZXJ2bGV0IGNvbnRhaW5lciBzaG91bGQgYmUgY29uc3VsdGVkIHRvIGZpbmQgdGhlIHByb2JsZW0uIAotICAKLSAgUmVhZCBodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzUvaW5zdGFsbGF0aW9uZ3VpZGUuaHRtbCNzZXJ2bGV0X2NvbnRhaW5lcgotICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgCi0gICAKLTQuIEdldHRpbmcgRmFtaWxpYXIgd2l0aCB0aGUgQXhpczIgQ29udmVuaWVudCBTY3JpcHRzCi0KLSAgIEl0IGlzIGFkdmlzZWQgdG8gYWRkIHRoZSAkQVhJUzJfSE9NRS9iaW4gdG8gdGhlIFBBVEgsIHNvIHRoYXQgeW91J2xsIGJlIGFibGUgCi0gICB0byBydW4gdGhlIGZvbGxvd2luZyBzY3JpcHRzIGZyb20gYW55IHdoZXJlLgotCi0gICAqIGF4aXMyLntiYXR8c2h9IAkKLSAgIAotICAgWW91IGNhbiB1c2UgdGhpcyBzY3JpcHQgdG8gcnVuIFdlYiBzZXJ2aWNlIGNsaWVudHMgd3JpdHRlbiB1c2luZyBBeGlzMi4gVGhpcyAKLSAgIHNjcmlwdCBjYWxscyB0aGUgImphdmEiIGNvbW1hbmQgYWZ0ZXIgYWRkaW5nIHRoZSBjbGFzc3BhdGggZm9yIEF4aXMyIAotICAgZGVwZW5kZW50IGxpYnJhcmllcyAoKi5qYXIgZmlsZXMgcHJlc2VudCBpbiB5b3VyIEFYSVMyX0hPTUUvbGliKSwgc2V0dGluZyAKLSAgIHRoZSBBeGlzMiByZXBvc2l0b3J5IGxvY2F0aW9uIChBWElTMl9IT01FL3JlcG9zaXRvcnkpIGFuZCBzZXR0aW5nIHRoZSBBeGlzMiAKLSAgIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbihBWElTMl9IT01FL2NvbmYvYXhpczIueG1sKSBmb3IgeW91LiBXaXRoIHRoaXMgCi0gICB5b3UgY2FuIGJlIHJlbGlldmVkIGZyb20gc2V0dGluZyBhbGwgdGhlIGFib3ZlIEF4aXMyIHNwZWNpZmljIHBhcmFtZXRlcnMuCi0gICAKLSAgICBVc2FnZSA6IGF4aXMyLntzaC5iYXR9IFstb3B0aW9uc10gY2xhc3MgW2FyZ3MuLi5dCi0gIAotCi0gICAqIGF4aXMyc2VydmVyLntiYXR8c2h9IAotICAgCi0gICBUaGlzIHNjcmlwdCB3aWxsIHN0YXJ0IGFuIHN0YW5kYWxvbmUgQXhpczIgc2VydmVyIHVzaW5nIHRoZSBBWElTMl9IT01FLwotICAgcmVwb3NpdG9yeSBkaXJlY3RvcnkgYXMgdGhlIEF4aXMyIHJlcG9zaXRvcnkgYW5kIHRoZSBBWElTMl9IT01FL2NvbmYvCi0gICBheGlzMi54bWwgYXMgdGhlIEF4aXMyIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhpcyB3aWxsIHN0YXJ0IGFsbCB0aGUgCi0gICB0cmFuc3BvcnQgbGlzdGVuZXJzIGxpc3RlZCBpbiB0aGUgQVhJUzJfSE9NRS9jb25mL2F4aXMyLnhtbC4KLQotICAgRm9yIGFuIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGRlcGxveSBhIHNlcnZpY2UgdXNpbmcgc3RhbmRhbG9uZSBBeGlzMiAKLSAgIHNlcnZlcix0aGVuIGNvcHkgeW91ciBzZXJ2aWNlIGFyY2hpdmUgdG8gdGhlIEFYSVMyX0hPTUUvcmVwb3NpdG9yeS9zZXJ2aWNlcyAKLSAgIGRpcmVjdG9yeS4gQWZ0ZXIgdGhhdCBnbyB0byB0aGUgIlRyYW5zcG9ydCBJbnMiIHNlY3Rpb24gb2YgdGhlIEFYSVMyX0hPTUUvCi0gICBjb25mL2F4aXMyLnhtbCBhbmQgY29uZmlndXJlIHRoZSB0cmFucG9ydCByZWNlaXZlcnMgKHNpbXBsZUh0dHBTZXJ2ZXIgaW4gCi0gICBwb3J0IDgwODAgaXMgbGlzdGVkIGJ5IGRlZmF1bHQpLiBUaGVuIGludm9rZSB0aGlzIHNjcmlwdC4KLSAgIAotICAgCi0gICAqIHdzZGwyamF2YS57YmF0fHNofSAJCi0gICAKLSAgIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyBKYXZhIGNvZGUgYWNjb3JkaW5nIHRvIGEgZ2l2ZW4gV1NETCBmaWxlIHRvIGhhbmRsZSBXZWIgCi0gICBzZXJ2aWNlIGludm9jYXRpb25zIChDbGllbnQgc2lkZSBTdHVicykuIFRoaXMgc2NyaXB0IGFsc28gaGFzIHRoZSBhYmlsaXR5IHRvIAotICAgZ2VuZXJhdGUgc2VydmljZSBza2VsZXRvbnMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB3c2RsLgotICAgCi0gICAgIFVzYWdlOiBXU0RMMkphdmEue3NofGJhdH0gW09QVElPTl0uLi4gLXVyaSA8TG9jYXRpb24gb2YgV1NETD4KLSAgICAgICAgRWc6IFdTREwySmF2YS5zaCAtdXJpIC4uL3dzZGwvQXhpczJTYW1wbGUud3NkbAotICAgICAgICAKLSAgIEEgbW9yZSBkZXRhaWxlZCByZWZlcmVuY2UgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGZvdW5kCi0gICBodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzUvcmVmZXJlbmNlLmh0bWwuCi0gICAKLSAgIAotICAgKiBqYXZhMndzZGwue2JhdHxzaH0gCQotICAgCi0gICBUaGlzIHNjcmlwdCBnZW5lcmF0ZXMgdGhlIGFwcHJvcHJpYXRlIFdTREwgZmlsZSBmb3IgYSBnaXZlbiBqYXZhIGNsYXNzLgotICAgICBVc2FnZTogSmF2YTJXU0RMLntzaHxiYXR9IFtPUFRJT05dLi4uIC1jbiA8ZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWU+Ci0gICAgICAgIEVnOiBKYXZhMldTREwuc2ggLWNuIC4uL3NhbXBsZXMvdGVzdC9zZWFyY2hUb29sLlNlYXJjaAotICAgICAgICAKLSAgIEEgbW9yZSBkZXRhaWxlZCByZWZlcmVuY2UgYWJvdXQgdGhpcyBzY3JpcHQgY2FuIGJlIGZvdW5kIGluCi0gICBodHRwOi8vd3MuYXBhY2hlLm9yZy9heGlzMi8xXzUvcmVmZXJlbmNlLmh0bWwKLQotQ29tcGxldGUgSW5zdGFsbGF0aW9uIEd1aWRlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUEgY29tcGxldGUgSW5zdGFsbGF0aW9uIEd1aWRlIG9uIEFwYWNoZSBBeGlzMiBpcyBhdmFpbGFibGUgYXQKLWh0dHA6Ly93cy5hcGFjaGUub3JnL2F4aXMyLzFfNS9pbnN0YWxsYXRpb25ndWlkZS5odG1sCi0gICAKLSAgIApkaWZmIC0tZ2l0IGEvMV81L3JlbGVhc2Utbm90ZXMuaHRtbCBiLzFfNS9yZWxlYXNlLW5vdGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWVmYTYuLjAwMDAwMDAKLS0tIGEvMV81L3JlbGVhc2Utbm90ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIiPgotICA8dGl0bGU+QXBhY2hlIEF4aXMyIDEuNS4yIFJlbGVhc2UgTm90ZXM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJlbiI+Ci08aDE+QXBhY2hlIEF4aXMyIDEuNS4yIFJlbGVhc2UgTm90ZXM8L2gxPgotCi08aDI+QWJvdXQgdGhpcyB2ZXJzaW9uPC9oMj4KLQotPHA+MS41LjIgaXMgYSBtYWludGVuYW5jZSByZWxlYXNlIHRvIGZpeCB0aGUgc2VjdXJpdHkgaXNzdWUgZGVzY3JpYmVkIGluCi08YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2F4aXMvYXhpczIvamF2YS9jb3JlL3NlY3VyaXR5L0NWRS0yMDEwLTE2MzIucGRmIj5DVkUtMjAxMC0xNjMyPC9hPgotYXMgd2VsbCBhcyBhbiBYU1MgdnVsbmVyYWJpbGl0eSBpbiB0aGUgYWRtaW4gY29uc29sZSBhbmQgc29tZSBvdGhlciBtaW5vciBpc3N1ZXMuIEl0IGFsc28KLXVwZ3JhZGVzIEF4aW9tIHRvIHZlcnNpb24gMS4yLjkuPC9wPgotCi08aDI+Q2hhbmdlcyBzaW5jZSAxLjUuMTwvaDI+Ci0KLTx1bD4KLSAgCTxsaT5bQVhJUzItMzI5MF0gc3VyZWZpcmUgaXMgc3RpbGwgcnVuIGV2ZW4gaWYgbWF2ZW4udGVzdC5za2lwIGlzIHRydWU8L2xpPgotICAgIDxsaT5bQVhJUzItNDExM10gVW5hYmxlIHRvIHNpZ24gYXhpczIgamFyIDEuNC8xLjQuMTogWmlwRXhjZXB0aW9uPC9saT4KLSAgICA8bGk+W0FYSVMyLTQzNzFdIFVuYWJsZSB0byBjb21waWxlIGNsYXNzIGZvciBKU1A6IGF4aXMyLXdlYi92aWV3cGhhc2VzLmpzcDwvbGk+Ci0gICAgPGxpPltBWElTMi00NDUwXSBDVkUtMjAxMC0xNjMyOiBNZXNzYWdlIGJ1aWxkZXJzIGZvciBTT0FQIGFuZCBYTUwgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGxvYWQgRFREczwvbGk+Ci0gICAgPGxpPltBWElTMi00NzUyXSBUaW1lb3V0IGR1ZSB0byBjb25uZWN0aW9uIHBvb2wgaXMgc3RhcnZlZCBpbiBsYXRlc3QgMS41LjItU05BUFNIT1QgY29kZS48L2xpPgotICAgIDxsaT5bQVhJUzItNDc2OF0gTXRvbSBvcHRpbWl6YXRpb24gZG9lc24ndCB3b3JrIHdoZW4gdXNpbmcgc2ltcGxlIGJlYW48L2xpPgotICAgIDxsaT5bQVhJUzItNDc4N10gSGFyZGNvZGVkIEJ1bmRsZS1WZXJzaW9ucyBpbiBhZGIsIGpheHdzLCBrZXJuZWwsIG1ldGFkYXRhIGFuZCBzYWFqIG1vZHVsZXM8L2xpPgotICAgIDxsaT5bQVhJUzItNDc4OF0gYXhpczItamlieCBoYXMgY29uZmxpY3RpbmcgYmNlbCBkZXBlbmRlbmNpZXM8L2xpPgotPC91bD4KLQotPGgyPkFib3V0IEF4aXMyPC9oMj4KLQotPHA+QXBhY2hlIEF4aXMyIGlzIGEgY29tcGxldGUgcmUtZGVzaWduIGFuZCByZS13cml0ZSBvZiB0aGUgd2lkZWx5IHVzZWQKLUFwYWNoZSBBeGlzIGVuZ2luZSBhbmQgaXMgYSBtb3JlIGVmZmljaWVudCwgbW9yZSBzY2FsYWJsZSwgbW9yZSBtb2R1bGFyCi1hbmQgbW9yZSBYTUwtb3JpZW50ZWQgV2ViIHNlcnZpY2VzIGZyYW1ld29yay4gSXQgaXMgY2FyZWZ1bGx5IGRlc2lnbmVkIHRvCi1zdXBwb3J0IHRoZSBlYXN5IGFkZGl0aW9uIG9mIHBsdWctaW4gIm1vZHVsZXMiIHRoYXQgZXh0ZW5kIGl0cwotZnVuY3Rpb25hbGl0eSBmb3IgZmVhdHVyZXMgc3VjaCBhcyBzZWN1cml0eSBhbmQgcmVsaWFiaWxpdHkuPC9wPgotCi08cD5Nb2R1bGVzIHN1cHBvcnRpbmcgV1MtU2VjdXJpdHkvU2VjdXJlLUNvbnZlcnNhdGlvbiAoQXBhY2hlIFJhbXBhcnQpLAotV1MtVHJ1c3QgKEFwYWNoZSBSYWhhcyksIFdTLVJlbGlhYmxlIE1lc3NhZ2luZyAoQXBhY2hlIFNhbmRlc2hhKSBhbmQKLVdTLUV2ZW50aW5nIChBcGFjaGUgU2F2YW4pIGFyZSBhdmFpbGFibGUgdmlhIHRoZSBBcGFjaGUgV2ViIFNlcnZpY2VzCi1wcm9qZWN0LiBQbGVhc2Ugc2VlIHRoZSBpbmRpdmlkdWFsIHN1YnByb2plY3Qgc2l0ZXMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uPC9wPgotCi08aDI+RmVlZGJhY2s8L2gyPgotCi08cD5XZSBhcmUgc3RyaXZpbmcgZm9yIGEgc2ltcGxlIGFuZCBoYXBweSBmaXJzdCB0aW1lIHVzZXIgZXhwZXJpZW5jZSBhcyB3ZWxsIGFzIGEKLXNhdGlzZnlpbmcgZXhwZXJpZW5jZWQgdXNlciBleHBlcmllbmNlIHdpdGggdGhpcyByZWxlYXNlLiBXZSB3ZWxjb21lIGFueQotYW5kIGFsbCBmZWVkYmFjayBhdDo8L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJtYWlsdG86amF2YS11c2VyQGF4aXMuYXBhY2hlLm9yZyI+amF2YS11c2VyQGF4aXMuYXBhY2hlLm9yZzwvYT4gKHBsZWFzZSBpbmNsdWRlICJbYXhpczJdIiBpbiB0aGUgc3ViamVjdCk8L2xpPgotICA8bGk+PGEgaHJlZj0ibWFpbHRvOmphdmEtZGV2QGF4aXMuYXBhY2hlLm9yZyI+amF2YS1kZXZAYXhpcy5hcGFjaGUub3JnPC9hPiAocGxlYXNlIGluY2x1ZGUgIltheGlzMl0iIGluIHRoZSBzdWJqZWN0KTwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQVhJUzIiPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9BWElTMjwvYT48L2xpPgotPC91bD4KLQotPHA+VGhhbmsgeW91IGZvciB5b3VyIGludGVyZXN0IGluIEFwYWNoZSBBeGlzMiE8L3A+Ci0KLTxwPjxpPlRoZSBBeGlzMiBEZXZlbG9wbWVudCBUZWFtPGJyPgotPGEgaHJlZj0iaHR0cDovL2F4aXMuYXBhY2hlLm9yZy8iPmh0dHA6Ly9heGlzLmFwYWNoZS5vcmcvPC9hPjwvaT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xXzUvc3JjL21haW4vYXNzZW1ibHkvamFyLnhtbCBiLzFfNS9zcmMvbWFpbi9hc3NlbWJseS9qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWYzZjIxLi4wMDAwMDAwCi0tLSBhLzFfNS9zcmMvbWFpbi9hc3NlbWJseS9qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgfiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIH4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgfiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICB+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIH4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB+IHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxhc3NlbWJseT4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PmphcjwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8ZmlsZVNldHM+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1zaGFyZWQtYXJjaGl2ZS1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgPC9maWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0cz4KLSAgICAgICAgPG1vZHVsZVNldD4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWphdmEyd3NkbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWtlcm5lbDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLWNvZGVnZW48L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1hZGI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5heGlzMjpheGlzMi1hZGItY29kZWdlbjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmF4aXMyOmF4aXMyLXhtbGJlYW5zPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YXhpczItY2x1c3RlcmluZzwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8YmluYXJpZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPHVzZVN0cmljdEZpbHRlcmluZz50cnVlPC91c2VTdHJpY3RGaWx0ZXJpbmc+Ci0gICAgICAgICAgICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICAgICAgICAgICAgPHVucGFja09wdGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk9TR0ktSU5GLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC91bnBhY2tPcHRpb25zPgotICAgICAgICAgICAgPC9iaW5hcmllcz4KLSAgICAgICAgPC9tb2R1bGVTZXQ+Ci0gICAgICAgIDxtb2R1bGVTZXQ+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPCEtLSBOb3RlIHRoYXQgd2UgY2FuIGF0IG1vc3QgaW5jbHVkZSBhIHNpbmdsZSBtb2R1bGUgaGVyZSAoYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIG1vZHVsZS54bWwgZmlsZSkhIC0tPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuYXhpczI6YWRkcmVzc2luZzwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8YmluYXJpZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPHVzZVN0cmljdEZpbHRlcmluZz50cnVlPC91c2VTdHJpY3RGaWx0ZXJpbmc+Ci0gICAgICAgICAgICAgICAgPGF0dGFjaG1lbnRDbGFzc2lmaWVyPmNsYXNzcGF0aC1tb2R1bGU8L2F0dGFjaG1lbnRDbGFzc2lmaWVyPgotICAgICAgICAgICAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgICAgICAgICAgIDx1bnBhY2tPcHRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdlIG11c3QgcGF5IGF0dGVudGlvbiBub3QgdG8gZXhjbHVkZSBtb2R1bGUueG1sIGhlcmUhIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvTUFOSUZFU1QuTUY8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9MSUNFTlNFPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvTk9USUNFPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvbWF2ZW4vKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC91bnBhY2tPcHRpb25zPgotICAgICAgICAgICAgPC9iaW5hcmllcz4KLSAgICAgICAgPC9tb2R1bGVTZXQ+Ci0gICAgPC9tb2R1bGVTZXRzPiAgICAKLTwvYXNzZW1ibHk+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=